ZGlmZiAtLWdpdCBhL2Jpbi8ydG8zIGIvYmluLzJ0bzMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGZlM2UyMgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi8ydG8zCkBAIC0wLDAgKzEsNSBAQAorIyEvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvYmluL3B5dGhvbjIuNworaW1wb3J0IHN5cworZnJvbSBsaWIydG8zLm1haW4gaW1wb3J0IG1haW4KKworc3lzLmV4aXQobWFpbigibGliMnRvMy5maXhlcyIpKQpkaWZmIC0tZ2l0IGEvYmluL2lkbGUgYi9iaW4vaWRsZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTljNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvYmluL2lkbGUKQEAgLTAsMCArMSw1IEBACisjIS90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9iaW4vcHl0aG9uMi43CisKK2Zyb20gaWRsZWxpYi5QeVNoZWxsIGltcG9ydCBtYWluCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvYmluL3B5ZG9jIGIvYmluL3B5ZG9jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0ZGRlMGYKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vcHlkb2MKQEAgLTAsMCArMSw1IEBACisjIS90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9iaW4vcHl0aG9uMi43CisKK2ltcG9ydCBweWRvYworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBweWRvYy5jbGkoKQpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbiBiL2Jpbi9weXRob24KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNTUxYWIyNgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9weXRob24KQEAgLTAsMCArMSBAQAorcHl0aG9uMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2Jpbi9weXRob24tY29uZmlnIGIvYmluL3B5dGhvbi1jb25maWcKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzU4MDI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9weXRob24tY29uZmlnCkBAIC0wLDAgKzEgQEAKK3B5dGhvbjItY29uZmlnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbi1jb25maWcuc2ggYi9iaW4vcHl0aG9uLWNvbmZpZy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNTIwMzVlCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3B5dGhvbi1jb25maWcuc2gKQEAgLTAsMCArMSwxMTIgQEAKKyMhL3Vzci9iaW4vZW52IHNoCisKK2V4aXRfd2l0aF91c2FnZSAoKQoreworICAgIGVjaG8gIlVzYWdlOiAkMCBbaWdub3JlZC5weV0gLS1wcmVmaXh8LS1leGVjLXByZWZpeHwtLWluY2x1ZGVzfC0tbGlic3wtLWNmbGFnc3wtLWxkZmxhZ3N8LS1leHRlbnNpb24tc3VmZml4fC0taGVscHwtLWFiaWZsYWdzfC0tY29uZmlnZGlyIgorICAgIGV4aXQgMQorfQorCitjYXNlICIkMSIgaW4KKyAgICAqLnB5KQorICAgICAgICBzaGlmdAorICAgIDs7Citlc2FjCisKK2lmIFsgIiQxIiA9ICIiIF0gOyB0aGVuCisgICAgZXhpdF93aXRoX3VzYWdlCitmaQorCisjIFJldHVybnMgdGhlIGFjdHVhbCBwcmVmaXggd2hlcmUgdGhpcyBzY3JpcHQgd2FzIGluc3RhbGxlZCB0by4KK2luc3RhbGxlZF9wcmVmaXggKCkKK3sKKyAgICBsb2NhbCBSRVNVTFQ9JChkaXJuYW1lICQoY2QgJChkaXJuYW1lICIkMSIpICYmIHB3ZCAtUCkpCisgICAgbG9jYWwgUkVBRExJTks9cmVhZGxpbmsKKyAgICBpZiBbICIkKHVuYW1lIC1zKSIgPSAiRGFyd2luIiBdIDsgdGhlbgorICAgICAgICAjIHJlYWRsaW5rIGluIGRhcndpbiBjYW4ndCBoYW5kbGUgLWYuICBVc2UgZ3JlYWRsaW5rIGZyb20gTWFjUG9ydHMgaW5zdGVhZC4KKyAgICAgICAgUkVBRExJTks9Z3JlYWRsaW5rCisgICAgZmkKKyAgICBpZiBbICQod2hpY2ggJFJFQURMSU5LKSBdIDsgdGhlbgorICAgICAgICBSRVNVTFQ9JCgkUkVBRExJTksgLWYgIiRSRVNVTFQiKQorICAgIGZpCisgICAgZWNobyAkUkVTVUxUCit9CisKK3ByZWZpeF9idWlsZD0iL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0IgorcHJlZml4X3JlYWw9JChpbnN0YWxsZWRfcHJlZml4ICIkMCIpCisKKyMgVXNlIHNlZCB0byBmaXggcGF0aHMgZnJvbSB0aGVpciBidWlsdCB0byBsb2NhdGlvbnMgdG8gdGhlaXIgaW5zdGFsbGVkIHRvIGxvY2F0aW9ucy4KK3ByZWZpeD0kKGVjaG8gIiRwcmVmaXhfYnVpbGQiIHwgc2VkICJzIyRwcmVmaXhfYnVpbGQjJHByZWZpeF9yZWFsIyIpCitleGVjX3ByZWZpeF9idWlsZD0iJHtwcmVmaXh9IgorZXhlY19wcmVmaXg9JChlY2hvICIkZXhlY19wcmVmaXhfYnVpbGQiIHwgc2VkICJzIyRleGVjX3ByZWZpeF9idWlsZCMkcHJlZml4X3JlYWwjIikKK2luY2x1ZGVkaXI9JChlY2hvICIke3ByZWZpeH0vaW5jbHVkZSIgfCBzZWQgInMjJHByZWZpeF9idWlsZCMkcHJlZml4X3JlYWwjIikKK2xpYmRpcj0kKGVjaG8gIiR7ZXhlY19wcmVmaXh9L2xpYiIgfCBzZWQgInMjJHByZWZpeF9idWlsZCMkcHJlZml4X3JlYWwjIikKK0NGTEFHUz0kKGVjaG8gIi1PMiAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXMiIHwgc2VkICJzIyRwcmVmaXhfYnVpbGQjJHByZWZpeF9yZWFsIyIpCitWRVJTSU9OPSIyLjciCitMSUJNPSItbG0iCitMSUJDPSIiCitTWVNMSUJTPSIkTElCTSAkTElCQyIKK0FCSUZMQUdTPSJAQUJJRkxBR1NAIgorIyBQcm90ZWN0IGFnYWluc3QgbGFjayBvZiBzdWJzdGl0dXRpb24uCitpZiBbICIkQUJJRkxBR1MiID0gIkBBQklGTEFHU0AiIF0gOyB0aGVuCisgICAgQUJJRkxBR1M9CitmaQorTElCUz0iLWxwdGhyZWFkIC1sZGwgIC1sdXRpbCAkU1lTTElCUyAtbHB5dGhvbiR7VkVSU0lPTn0ke0FCSUZMQUdTfSIKK0JBU0VDRkxBR1M9IiAtZm5vLXN0cmljdC1hbGlhc2luZyIKK0xETElCUkFSWT0ibGlicHl0aG9uJHtWRVJTSU9OfS5hIgorTElOS0ZPUlNIQVJFRD0iLVhsaW5rZXIgLWV4cG9ydC1keW5hbWljIgorT1BUPSItRE5ERUJVRyAiCitQWV9FTkFCTEVfU0hBUkVEPSIwIgorRExMTElCUkFSWT0iIgorTElCREVTVD0ke3ByZWZpeH0vbGliL3B5dGhvbiR7VkVSU0lPTn0KK0xJQlBMPSR7TElCREVTVH0vY29uZmlnCitTTz0iLnNvIgorUFlUSE9ORlJBTUVXT1JLPSIiCitJTkNESVI9Ii1JJGluY2x1ZGVkaXIvcHl0aG9uJHtWRVJTSU9OfSR7QUJJRkxBR1N9IgorUExBVElOQ0RJUj0iLUkkaW5jbHVkZWRpci9weXRob24ke1ZFUlNJT059JHtBQklGTEFHU30iCisKKyMgU2NhbiBmb3IgLS1oZWxwIG9yIHVua25vd24gYXJndW1lbnQuCitmb3IgQVJHIGluICQqCitkbworICAgIGNhc2UgJEFSRyBpbgorICAgICAgICAtLWhlbHApCisgICAgICAgICAgICBleGl0X3dpdGhfdXNhZ2UKKyAgICAgICAgOzsKKyAgICAgICAgLS1wcmVmaXh8LS1leGVjLXByZWZpeHwtLWluY2x1ZGVzfC0tbGlic3wtLWNmbGFnc3wtLWxkZmxhZ3MpCisgICAgICAgIDs7CisgICAgICAgICopCisgICAgICAgICAgICBleGl0X3dpdGhfdXNhZ2UKKyAgICAgICAgOzsKKyAgICBlc2FjCitkb25lCisKK2ZvciBBUkcgaW4gJCoKK2RvCisgICAgY2FzZSAkQVJHIGluCisgICAgICAgIC0tcHJlZml4KQorICAgICAgICAgICAgZWNobyAiJHByZWZpeCIKKyAgICAgICAgOzsKKyAgICAgICAgLS1leGVjLXByZWZpeCkKKyAgICAgICAgICAgIGVjaG8gIiRleGVjX3ByZWZpeCIKKyAgICAgICAgOzsKKyAgICAgICAgLS1pbmNsdWRlcykKKyAgICAgICAgICAgIGVjaG8gIiRJTkNESVIiCisgICAgICAgIDs7CisgICAgICAgIC0tY2ZsYWdzKQorICAgICAgICAgICAgZWNobyAiJElOQ0RJUiAkQkFTRUNGTEFHUyAkQ0ZMQUdTICRPUFQiCisgICAgICAgIDs7CisgICAgICAgIC0tbGlicykKKyAgICAgICAgICAgIGVjaG8gIiRMSUJTIgorICAgICAgICA7OworICAgICAgICAtLWxkZmxhZ3MpCisgICAgICAgICAgICBMSU5LRk9SU0hBUkVEVVNFRD0KKyAgICAgICAgICAgIGlmIFsgLXogIiRQWVRIT05GUkFNRVdPUksiIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgTElOS0ZPUlNIQVJFRFVTRUQ9JExJTktGT1JTSEFSRUQKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBMSUJQTFVTRUQ9CisgICAgICAgICAgICBpZiBbICIkUFlfRU5BQkxFX1NIQVJFRCIgPSAiMCIgLW8gLW4gIiR7RExMTElCUkFSWX0iIF0gOyB0aGVuCisgICAgICAgICAgICAgICAgTElCUExVU0VEPSItTCRMSUJQTCIKKyAgICAgICAgICAgIGZpCisgICAgICAgICAgICBlY2hvICIkTElCUExVU0VEIC1MJGxpYmRpciAkTElCUyAkTElOS0ZPUlNIQVJFRFVTRUQiCisgICAgICAgIDs7Citlc2FjCitkb25lCmRpZmYgLS1naXQgYS9iaW4vcHl0aG9uMiBiL2Jpbi9weXRob24yCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjhmN2EzYzEKLS0tIC9kZXYvbnVsbAorKysgYi9iaW4vcHl0aG9uMgpAQCAtMCwwICsxIEBACitweXRob24yLjcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9iaW4vcHl0aG9uMi1jb25maWcgYi9iaW4vcHl0aG9uMi1jb25maWcKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uNzg1ZjM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9weXRob24yLWNvbmZpZwpAQCAtMCwwICsxIEBACitweXRob24yLjctY29uZmlnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbjIuNyBiL2Jpbi9weXRob24yLjcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEwZWI4NgotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9weXRob24yLjcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYmluL3B5dGhvbjIuNy1jb25maWcgYi9iaW4vcHl0aG9uMi43LWNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjhhYTRiCi0tLSAvZGV2L251bGwKKysrIGIvYmluL3B5dGhvbjIuNy1jb25maWcKQEAgLTAsMCArMSw1NyBAQAorIyEvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvYmluL3B5dGhvbjIuNworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBnZXRvcHQKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKwordmFsaWRfb3B0cyA9IFsncHJlZml4JywgJ2V4ZWMtcHJlZml4JywgJ2luY2x1ZGVzJywgJ2xpYnMnLCAnY2ZsYWdzJywKKyAgICAgICAgICAgICAgJ2xkZmxhZ3MnLCAnaGVscCddCisKK2RlZiBleGl0X3dpdGhfdXNhZ2UoY29kZT0xKToKKyAgICBwcmludCA+PnN5cy5zdGRlcnIsICJVc2FnZTogJXMgWyVzXSIgJSAoc3lzLmFyZ3ZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd8Jy5qb2luKCctLScrb3B0IGZvciBvcHQgaW4gdmFsaWRfb3B0cykpCisgICAgc3lzLmV4aXQoY29kZSkKKwordHJ5OgorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJycsIHZhbGlkX29wdHMpCitleGNlcHQgZ2V0b3B0LmVycm9yOgorICAgIGV4aXRfd2l0aF91c2FnZSgpCisKK2lmIG5vdCBvcHRzOgorICAgIGV4aXRfd2l0aF91c2FnZSgpCisKK3B5dmVyID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdWRVJTSU9OJykKK2dldHZhciA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcgorCitvcHRfZmxhZ3MgPSBbZmxhZyBmb3IgKGZsYWcsIHZhbCkgaW4gb3B0c10KKworaWYgJy0taGVscCcgaW4gb3B0X2ZsYWdzOgorICAgIGV4aXRfd2l0aF91c2FnZShjb2RlPTApCisKK2ZvciBvcHQgaW4gb3B0X2ZsYWdzOgorICAgIGlmIG9wdCA9PSAnLS1wcmVmaXgnOgorICAgICAgICBwcmludCBzeXNjb25maWcuUFJFRklYCisKKyAgICBlbGlmIG9wdCA9PSAnLS1leGVjLXByZWZpeCc6CisgICAgICAgIHByaW50IHN5c2NvbmZpZy5FWEVDX1BSRUZJWAorCisgICAgZWxpZiBvcHQgaW4gKCctLWluY2x1ZGVzJywgJy0tY2ZsYWdzJyk6CisgICAgICAgIGZsYWdzID0gWyctSScgKyBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMoKSwKKyAgICAgICAgICAgICAgICAgJy1JJyArIHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPVRydWUpXQorICAgICAgICBpZiBvcHQgPT0gJy0tY2ZsYWdzJzoKKyAgICAgICAgICAgIGZsYWdzLmV4dGVuZChnZXR2YXIoJ0NGTEFHUycpLnNwbGl0KCkpCisgICAgICAgIHByaW50ICcgJy5qb2luKGZsYWdzKQorCisgICAgZWxpZiBvcHQgaW4gKCctLWxpYnMnLCAnLS1sZGZsYWdzJyk6CisgICAgICAgIGxpYnMgPSBnZXR2YXIoJ0xJQlMnKS5zcGxpdCgpICsgZ2V0dmFyKCdTWVNMSUJTJykuc3BsaXQoKQorICAgICAgICBsaWJzLmFwcGVuZCgnLWxweXRob24nK3B5dmVyKQorICAgICAgICAjIGFkZCB0aGUgcHJlZml4L2xpYi9weXRob25YLlkvY29uZmlnIGRpciwgYnV0IG9ubHkgaWYgdGhlcmUgaXMgbm8KKyAgICAgICAgIyBzaGFyZWQgbGlicmFyeSBpbiBwcmVmaXgvbGliLy4KKyAgICAgICAgaWYgb3B0ID09ICctLWxkZmxhZ3MnOgorICAgICAgICAgICAgaWYgbm90IGdldHZhcignUHlfRU5BQkxFX1NIQVJFRCcpOgorICAgICAgICAgICAgICAgIGxpYnMuaW5zZXJ0KDAsICctTCcgKyBnZXR2YXIoJ0xJQlBMJykpCisgICAgICAgICAgICBpZiBub3QgZ2V0dmFyKCdQWVRIT05GUkFNRVdPUksnKToKKyAgICAgICAgICAgICAgICBsaWJzLmV4dGVuZChnZXR2YXIoJ0xJTktGT1JTSEFSRUQnKS5zcGxpdCgpKQorICAgICAgICBwcmludCAnICcuam9pbihsaWJzKQorCmRpZmYgLS1naXQgYS9iaW4vc210cGQucHkgYi9iaW4vc210cGQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTljN2M3NAotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9zbXRwZC5weQpAQCAtMCwwICsxLDU1NSBAQAorIyEvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvYmluL3B5dGhvbjIuNworIiIiQW4gUkZDIDI4MjEgc210cCBwcm94eS4KKworVXNhZ2U6ICUocHJvZ3JhbSlzIFtvcHRpb25zXSBbbG9jYWxob3N0OmxvY2FscG9ydCBbcmVtb3RlaG9zdDpyZW1vdGVwb3J0XV0KKworT3B0aW9uczoKKworICAgIC0tbm9zZXR1aWQKKyAgICAtbgorICAgICAgICBUaGlzIHByb2dyYW0gZ2VuZXJhbGx5IHRyaWVzIHRvIHNldHVpZCBgbm9ib2R5JywgdW5sZXNzIHRoaXMgZmxhZyBpcworICAgICAgICBzZXQuICBUaGUgc2V0dWlkIGNhbGwgd2lsbCBmYWlsIGlmIHRoaXMgcHJvZ3JhbSBpcyBub3QgcnVuIGFzIHJvb3QgKGluCisgICAgICAgIHdoaWNoIGNhc2UsIHVzZSB0aGlzIGZsYWcpLgorCisgICAgLS12ZXJzaW9uCisgICAgLVYKKyAgICAgICAgUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LgorCisgICAgLS1jbGFzcyBjbGFzc25hbWUKKyAgICAtYyBjbGFzc25hbWUKKyAgICAgICAgVXNlIGBjbGFzc25hbWUnIGFzIHRoZSBjb25jcmV0ZSBTTVRQIHByb3h5IGNsYXNzLiAgVXNlcyBgUHVyZVByb3h5JyBieQorICAgICAgICBkZWZhdWx0LgorCisgICAgLS1kZWJ1ZworICAgIC1kCisgICAgICAgIFR1cm4gb24gZGVidWdnaW5nIHByaW50cy4KKworICAgIC0taGVscAorICAgIC1oCisgICAgICAgIFByaW50IHRoaXMgbWVzc2FnZSBhbmQgZXhpdC4KKworVmVyc2lvbjogJShfX3ZlcnNpb25fXylzCisKK0lmIGxvY2FsaG9zdCBpcyBub3QgZ2l2ZW4gdGhlbiBgbG9jYWxob3N0JyBpcyB1c2VkLCBhbmQgaWYgbG9jYWxwb3J0IGlzIG5vdAorZ2l2ZW4gdGhlbiA4MDI1IGlzIHVzZWQuICBJZiByZW1vdGVob3N0IGlzIG5vdCBnaXZlbiB0aGVuIGBsb2NhbGhvc3QnIGlzIHVzZWQsCithbmQgaWYgcmVtb3RlcG9ydCBpcyBub3QgZ2l2ZW4sIHRoZW4gMjUgaXMgdXNlZC4KKyIiIgorCisjIE92ZXJ2aWV3OgorIworIyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbWluaW1hbCBTTVRQIHByb3RvY29sIGFzIGRlZmluZWQgaW4gUkZDIDgyMS4gIEl0CisjIGhhcyBhIGhpZXJhcmNoeSBvZiBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCB0aGUgYmFja2VuZCBmdW5jdGlvbmFsaXR5IGZvciB0aGUKKyMgc210cGQuICBBIG51bWJlciBvZiBjbGFzc2VzIGFyZSBwcm92aWRlZDoKKyMKKyMgICBTTVRQU2VydmVyIC0gdGhlIGJhc2UgY2xhc3MgZm9yIHRoZSBiYWNrZW5kLiAgUmFpc2VzIE5vdEltcGxlbWVudGVkRXJyb3IKKyMgICBpZiB5b3UgdHJ5IHRvIHVzZSBpdC4KKyMKKyMgICBEZWJ1Z2dpbmdTZXJ2ZXIgLSBzaW1wbHkgcHJpbnRzIGVhY2ggbWVzc2FnZSBpdCByZWNlaXZlcyBvbiBzdGRvdXQuCisjCisjICAgUHVyZVByb3h5IC0gUHJveGllcyBhbGwgbWVzc2FnZXMgdG8gYSByZWFsIHNtdHBkIHdoaWNoIGRvZXMgZmluYWwKKyMgICBkZWxpdmVyeS4gIE9uZSBrbm93biBwcm9ibGVtIHdpdGggdGhpcyBjbGFzcyBpcyB0aGF0IGl0IGRvZXNuJ3QgaGFuZGxlCisjICAgU01UUCBlcnJvcnMgZnJvbSB0aGUgYmFja2VuZCBzZXJ2ZXIgYXQgYWxsLiAgVGhpcyBzaG91bGQgYmUgZml4ZWQKKyMgICAoY29udHJpYnV0aW9ucyBhcmUgd2VsY29tZSEpLgorIworIyAgIE1haWxtYW5Qcm94eSAtIEFuIGV4cGVyaW1lbnRhbCBoYWNrIHRvIHdvcmsgd2l0aCBHTlUgTWFpbG1hbgorIyAgIDx3d3cubGlzdC5vcmc+LiAgVXNpbmcgdGhpcyBzZXJ2ZXIgYXMgeW91ciByZWFsIGluY29taW5nIHNtdHBkLCB5b3VyCisjICAgbWFpbGhvc3Qgd2lsbCBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBhbmQgYWNjZXB0IG1haWwgZGVzdGluZWQgdG8gTWFpbG1hbgorIyAgIGxpc3RzIHdoZW4gdGhvc2UgbGlzdHMgYXJlIGNyZWF0ZWQuICBFdmVyeSBtZXNzYWdlIG5vdCBkZXN0aW5lZCBmb3IgYSBsaXN0CisjICAgZ2V0cyBmb3J3YXJkZWQgdG8gYSByZWFsIGJhY2tlbmQgc210cGQsIGFzIHdpdGggUHVyZVByb3h5LiAgQWdhaW4sIGVycm9ycworIyAgIGFyZSBub3QgaGFuZGxlZCBjb3JyZWN0bHkgeWV0LgorIworIyBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgc2NyaXB0IHJlcXVpcmVzIFB5dGhvbiAyLjAKKyMKKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+CisjCisjIFRPRE86CisjCisjIC0gc3VwcG9ydCBtYWlsYm94IGRlbGl2ZXJ5CisjIC0gYWxpYXMgZmlsZXMKKyMgLSBFU01UUAorIyAtIGhhbmRsZSBlcnJvciBjb2RlcyBmcm9tIHRoZSBiYWNrZW5kIHNtdHBkCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGVycm5vCitpbXBvcnQgZ2V0b3B0CitpbXBvcnQgdGltZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IGFzeW5jb3JlCitpbXBvcnQgYXN5bmNoYXQKKworX19hbGxfXyA9IFsiU01UUFNlcnZlciIsIkRlYnVnZ2luZ1NlcnZlciIsIlB1cmVQcm94eSIsIk1haWxtYW5Qcm94eSJdCisKK3Byb2dyYW0gPSBzeXMuYXJndlswXQorX192ZXJzaW9uX18gPSAnUHl0aG9uIFNNVFAgcHJveHkgdmVyc2lvbiAwLjInCisKKworY2xhc3MgRGV2bnVsbDoKKyAgICBkZWYgd3JpdGUoc2VsZiwgbXNnKTogcGFzcworICAgIGRlZiBmbHVzaChzZWxmKTogcGFzcworCisKK0RFQlVHU1RSRUFNID0gRGV2bnVsbCgpCitORVdMSU5FID0gJ1xuJworRU1QVFlTVFJJTkcgPSAnJworQ09NTUFTUEFDRSA9ICcsICcKKworCitkZWYgdXNhZ2UoY29kZSwgbXNnPScnKToKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBfX2RvY19fICUgZ2xvYmFscygpCisgICAgaWYgbXNnOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtc2cKKyAgICBzeXMuZXhpdChjb2RlKQorCisKK2NsYXNzIFNNVFBDaGFubmVsKGFzeW5jaGF0LmFzeW5jX2NoYXQpOgorICAgIENPTU1BTkQgPSAwCisgICAgREFUQSA9IDEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXIsIGNvbm4sIGFkZHIpOgorICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0Ll9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgIHNlbGYuX19zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5fX2Nvbm4gPSBjb25uCisgICAgICAgIHNlbGYuX19hZGRyID0gYWRkcgorICAgICAgICBzZWxmLl9fbGluZSA9IFtdCisgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuQ09NTUFORAorICAgICAgICBzZWxmLl9fZ3JlZXRpbmcgPSAwCisgICAgICAgIHNlbGYuX19tYWlsZnJvbSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3JjcHR0b3MgPSBbXQorICAgICAgICBzZWxmLl9fZGF0YSA9ICcnCisgICAgICAgIHNlbGYuX19mcWRuID0gc29ja2V0LmdldGZxZG4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fcGVlciA9IGNvbm4uZ2V0cGVlcm5hbWUoKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6CisgICAgICAgICAgICAjIGEgcmFjZSBjb25kaXRpb24gIG1heSBvY2N1ciBpZiB0aGUgb3RoZXIgZW5kIGlzIGNsb3NpbmcKKyAgICAgICAgICAgICMgYmVmb3JlIHdlIGNhbiBnZXQgdGhlIHBlZXJuYW1lCisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIGVyclswXSAhPSBlcnJuby5FTk9UQ09OTjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnUGVlcjonLCByZXByKHNlbGYuX19wZWVyKQorICAgICAgICBzZWxmLnB1c2goJzIyMCAlcyAlcycgJSAoc2VsZi5fX2ZxZG4sIF9fdmVyc2lvbl9fKSkKKyAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcignXHJcbicpCisKKyAgICAjIE92ZXJyaWRlcyBiYXNlIGNsYXNzIGZvciBjb252ZW5pZW5jZQorICAgIGRlZiBwdXNoKHNlbGYsIG1zZyk6CisgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQucHVzaChzZWxmLCBtc2cgKyAnXHJcbicpCisKKyAgICAjIEltcGxlbWVudGF0aW9uIG9mIGJhc2UgY2xhc3MgYWJzdHJhY3QgbWV0aG9kCisgICAgZGVmIGNvbGxlY3RfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fX2xpbmUuYXBwZW5kKGRhdGEpCisKKyAgICAjIEltcGxlbWVudGF0aW9uIG9mIGJhc2UgY2xhc3MgYWJzdHJhY3QgbWV0aG9kCisgICAgZGVmIGZvdW5kX3Rlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgIGxpbmUgPSBFTVBUWVNUUklORy5qb2luKHNlbGYuX19saW5lKQorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ0RhdGE6JywgcmVwcihsaW5lKQorICAgICAgICBzZWxmLl9fbGluZSA9IFtdCisgICAgICAgIGlmIHNlbGYuX19zdGF0ZSA9PSBzZWxmLkNPTU1BTkQ6CisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goJzUwMCBFcnJvcjogYmFkIHN5bnRheCcpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBtZXRob2QgPSBOb25lCisgICAgICAgICAgICBpID0gbGluZS5maW5kKCcgJykKKyAgICAgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBsaW5lLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBhcmcgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBsaW5lWzppXS51cHBlcigpCisgICAgICAgICAgICAgICAgYXJnID0gbGluZVtpKzE6XS5zdHJpcCgpCisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdzbXRwXycgKyBjb21tYW5kLCBOb25lKQorICAgICAgICAgICAgaWYgbm90IG1ldGhvZDoKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goJzUwMiBFcnJvcjogY29tbWFuZCAiJXMiIG5vdCBpbXBsZW1lbnRlZCcgJSBjb21tYW5kKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbWV0aG9kKGFyZykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5fX3N0YXRlICE9IHNlbGYuREFUQToKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goJzQ1MSBJbnRlcm5hbCBjb25mdXNpb24nKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBSZW1vdmUgZXh0cmFuZW91cyBjYXJyaWFnZSByZXR1cm5zIGFuZCBkZS10cmFuc3BhcmVuY3kgYWNjb3JkaW5nCisgICAgICAgICAgICAjIHRvIFJGQyA4MjEsIFNlY3Rpb24gNC41LjIuCisgICAgICAgICAgICBkYXRhID0gW10KKyAgICAgICAgICAgIGZvciB0ZXh0IGluIGxpbmUuc3BsaXQoJ1xyXG4nKToKKyAgICAgICAgICAgICAgICBpZiB0ZXh0IGFuZCB0ZXh0WzBdID09ICcuJzoKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQodGV4dFsxOl0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQodGV4dCkKKyAgICAgICAgICAgIHNlbGYuX19kYXRhID0gTkVXTElORS5qb2luKGRhdGEpCisgICAgICAgICAgICBzdGF0dXMgPSBzZWxmLl9fc2VydmVyLnByb2Nlc3NfbWVzc2FnZShzZWxmLl9fcGVlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19tYWlsZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19yY3B0dG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2RhdGEpCisgICAgICAgICAgICBzZWxmLl9fcmNwdHRvcyA9IFtdCisgICAgICAgICAgICBzZWxmLl9fbWFpbGZyb20gPSBOb25lCisgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLkNPTU1BTkQKKyAgICAgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoJ1xyXG4nKQorICAgICAgICAgICAgaWYgbm90IHN0YXR1czoKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucHVzaChzdGF0dXMpCisKKyAgICAjIFNNVFAgYW5kIEVTTVRQIGNvbW1hbmRzCisgICAgZGVmIHNtdHBfSEVMTyhzZWxmLCBhcmcpOgorICAgICAgICBpZiBub3QgYXJnOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBIRUxPIGhvc3RuYW1lJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9fZ3JlZXRpbmc6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMyBEdXBsaWNhdGUgSEVMTy9FSExPJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19ncmVldGluZyA9IGFyZworICAgICAgICAgICAgc2VsZi5wdXNoKCcyNTAgJXMnICUgc2VsZi5fX2ZxZG4pCisKKyAgICBkZWYgc210cF9OT09QKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogTk9PUCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB1c2goJzI1MCBPaycpCisKKyAgICBkZWYgc210cF9RVUlUKHNlbGYsIGFyZyk6CisgICAgICAgICMgYXJncyBpcyBpZ25vcmVkCisgICAgICAgIHNlbGYucHVzaCgnMjIxIEJ5ZScpCisgICAgICAgIHNlbGYuY2xvc2Vfd2hlbl9kb25lKCkKKworICAgICMgZmFjdG9yZWQKKyAgICBkZWYgX19nZXRhZGRyKHNlbGYsIGtleXdvcmQsIGFyZyk6CisgICAgICAgIGFkZHJlc3MgPSBOb25lCisgICAgICAgIGtleWxlbiA9IGxlbihrZXl3b3JkKQorICAgICAgICBpZiBhcmdbOmtleWxlbl0udXBwZXIoKSA9PSBrZXl3b3JkOgorICAgICAgICAgICAgYWRkcmVzcyA9IGFyZ1trZXlsZW46XS5zdHJpcCgpCisgICAgICAgICAgICBpZiBub3QgYWRkcmVzczoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIGFkZHJlc3NbMF0gPT0gJzwnIGFuZCBhZGRyZXNzWy0xXSA9PSAnPicgYW5kIGFkZHJlc3MgIT0gJzw+JzoKKyAgICAgICAgICAgICAgICAjIEFkZHJlc3NlcyBjYW4gYmUgaW4gdGhlIGZvcm0gPHBlcnNvbkBkb20uY29tPiBidXQgd2F0Y2ggb3V0CisgICAgICAgICAgICAgICAgIyBmb3IgbnVsbCBhZGRyZXNzLCBlLmcuIDw+CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3NbMTotMV0KKyAgICAgICAgcmV0dXJuIGFkZHJlc3MKKworICAgIGRlZiBzbXRwX01BSUwoc2VsZiwgYXJnKToKKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICc9PT0+IE1BSUwnLCBhcmcKKyAgICAgICAgYWRkcmVzcyA9IHNlbGYuX19nZXRhZGRyKCdGUk9NOicsIGFyZykgaWYgYXJnIGVsc2UgTm9uZQorICAgICAgICBpZiBub3QgYWRkcmVzczoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogTUFJTCBGUk9NOjxhZGRyZXNzPicpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fX21haWxmcm9tOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDMgRXJyb3I6IG5lc3RlZCBNQUlMIGNvbW1hbmQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX19tYWlsZnJvbSA9IGFkZHJlc3MKKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdzZW5kZXI6Jywgc2VsZi5fX21haWxmcm9tCisgICAgICAgIHNlbGYucHVzaCgnMjUwIE9rJykKKworICAgIGRlZiBzbXRwX1JDUFQoc2VsZiwgYXJnKToKKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICc9PT0+IFJDUFQnLCBhcmcKKyAgICAgICAgaWYgbm90IHNlbGYuX19tYWlsZnJvbToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAzIEVycm9yOiBuZWVkIE1BSUwgY29tbWFuZCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYWRkcmVzcyA9IHNlbGYuX19nZXRhZGRyKCdUTzonLCBhcmcpIGlmIGFyZyBlbHNlIE5vbmUKKyAgICAgICAgaWYgbm90IGFkZHJlc3M6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IFJDUFQgVE86IDxhZGRyZXNzPicpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fX3JjcHR0b3MuYXBwZW5kKGFkZHJlc3MpCisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAncmVjaXBzOicsIHNlbGYuX19yY3B0dG9zCisgICAgICAgIHNlbGYucHVzaCgnMjUwIE9rJykKKworICAgIGRlZiBzbXRwX1JTRVQoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgYXJnOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBSU0VUJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFJlc2V0cyB0aGUgc2VuZGVyLCByZWNpcGllbnRzLCBhbmQgZGF0YSwgYnV0IG5vdCB0aGUgZ3JlZXRpbmcKKyAgICAgICAgc2VsZi5fX21haWxmcm9tID0gTm9uZQorICAgICAgICBzZWxmLl9fcmNwdHRvcyA9IFtdCisgICAgICAgIHNlbGYuX19kYXRhID0gJycKKyAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5DT01NQU5ECisgICAgICAgIHNlbGYucHVzaCgnMjUwIE9rJykKKworICAgIGRlZiBzbXRwX0RBVEEoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgbm90IHNlbGYuX19yY3B0dG9zOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDMgRXJyb3I6IG5lZWQgUkNQVCBjb21tYW5kJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IERBVEEnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuREFUQQorICAgICAgICBzZWxmLnNldF90ZXJtaW5hdG9yKCdcclxuLlxyXG4nKQorICAgICAgICBzZWxmLnB1c2goJzM1NCBFbmQgZGF0YSB3aXRoIDxDUj48TEY+LjxDUj48TEY+JykKKworCitjbGFzcyBTTVRQU2VydmVyKGFzeW5jb3JlLmRpc3BhdGNoZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhbGFkZHIsIHJlbW90ZWFkZHIpOgorICAgICAgICBzZWxmLl9sb2NhbGFkZHIgPSBsb2NhbGFkZHIKKyAgICAgICAgc2VsZi5fcmVtb3RlYWRkciA9IHJlbW90ZWFkZHIKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgICMgdHJ5IHRvIHJlLXVzZSBhIHNlcnZlciBwb3J0IGlmIHBvc3NpYmxlCisgICAgICAgICAgICBzZWxmLnNldF9yZXVzZV9hZGRyKCkKKyAgICAgICAgICAgIHNlbGYuYmluZChsb2NhbGFkZHIpCisgICAgICAgICAgICBzZWxmLmxpc3Rlbig1KQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjIGNsZWFudXAgYXN5bmNvcmUuc29ja2V0X21hcCBiZWZvcmUgcmFpc2luZworICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sIFwKKyAgICAgICAgICAgICAgICAgICclcyBzdGFydGVkIGF0ICVzXG5cdExvY2FsIGFkZHI6ICVzXG5cdFJlbW90ZSBhZGRyOiVzJyAlICgKKyAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgdGltZS5jdGltZSh0aW1lLnRpbWUoKSksCisgICAgICAgICAgICAgICAgbG9jYWxhZGRyLCByZW1vdGVhZGRyKQorCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLmFjY2VwdCgpCisgICAgICAgIGlmIHBhaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb25uLCBhZGRyID0gcGFpcgorICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdJbmNvbWluZyBjb25uZWN0aW9uIGZyb20gJXMnICUgcmVwcihhZGRyKQorICAgICAgICAgICAgY2hhbm5lbCA9IFNNVFBDaGFubmVsKHNlbGYsIGNvbm4sIGFkZHIpCisKKyAgICAjIEFQSSBmb3IgImRvaW5nIHNvbWV0aGluZyB1c2VmdWwgd2l0aCB0aGUgbWVzc2FnZSIKKyAgICBkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYsIHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgdGhpcyBhYnN0cmFjdCBtZXRob2QgdG8gaGFuZGxlIG1lc3NhZ2VzIGZyb20gdGhlIGNsaWVudC4KKworICAgICAgICBwZWVyIGlzIGEgdHVwbGUgY29udGFpbmluZyAoaXBhZGRyLCBwb3J0KSBvZiB0aGUgY2xpZW50IHRoYXQgbWFkZSB0aGUKKyAgICAgICAgc29ja2V0IGNvbm5lY3Rpb24gdG8gb3VyIHNtdHAgcG9ydC4KKworICAgICAgICBtYWlsZnJvbSBpcyB0aGUgcmF3IGFkZHJlc3MgdGhlIGNsaWVudCBjbGFpbXMgdGhlIG1lc3NhZ2UgaXMgY29taW5nCisgICAgICAgIGZyb20uCisKKyAgICAgICAgcmNwdHRvcyBpcyBhIGxpc3Qgb2YgcmF3IGFkZHJlc3NlcyB0aGUgY2xpZW50IHdpc2hlcyB0byBkZWxpdmVyIHRoZQorICAgICAgICBtZXNzYWdlIHRvLgorCisgICAgICAgIGRhdGEgaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXJlIGZ1bGwgdGV4dCBvZiB0aGUgbWVzc2FnZSwKKyAgICAgICAgaGVhZGVycyAoaWYgc3VwcGxpZWQpIGFuZCBhbGwuICBJdCBoYXMgYmVlbiBgZGUtdHJhbnNwYXJlbmNpZWQnCisgICAgICAgIGFjY29yZGluZyB0byBSRkMgODIxLCBTZWN0aW9uIDQuNS4yLiAgSW4gb3RoZXIgd29yZHMsIGEgbGluZQorICAgICAgICBjb250YWluaW5nIGEgYC4nIGZvbGxvd2VkIGJ5IG90aGVyIHRleHQgaGFzIGhhZCB0aGUgbGVhZGluZyBkb3QKKyAgICAgICAgcmVtb3ZlZC4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gTm9uZSwgZm9yIGEgbm9ybWFsIGAyNTAgT2snIHJlc3BvbnNlOworICAgICAgICBvdGhlcndpc2UgaXQgcmV0dXJucyB0aGUgZGVzaXJlZCByZXNwb25zZSBzdHJpbmcgaW4gUkZDIDgyMSBmb3JtYXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCitjbGFzcyBEZWJ1Z2dpbmdTZXJ2ZXIoU01UUFNlcnZlcik6CisgICAgIyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZ2F0aGVyZWQgbWVzc2FnZQorICAgIGRlZiBwcm9jZXNzX21lc3NhZ2Uoc2VsZiwgcGVlciwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICBpbmhlYWRlcnMgPSAxCisgICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdCgnXG4nKQorICAgICAgICBwcmludCAnLS0tLS0tLS0tLSBNRVNTQUdFIEZPTExPV1MgLS0tLS0tLS0tLScKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAjIGhlYWRlcnMgZmlyc3QKKyAgICAgICAgICAgIGlmIGluaGVhZGVycyBhbmQgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcHJpbnQgJ1gtUGVlcjonLCBwZWVyWzBdCisgICAgICAgICAgICAgICAgaW5oZWFkZXJzID0gMAorICAgICAgICAgICAgcHJpbnQgbGluZQorICAgICAgICBwcmludCAnLS0tLS0tLS0tLS0tIEVORCBNRVNTQUdFIC0tLS0tLS0tLS0tLScKKworCitjbGFzcyBQdXJlUHJveHkoU01UUFNlcnZlcik6CisgICAgZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBwZWVyLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSk6CisgICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdCgnXG4nKQorICAgICAgICAjIExvb2sgZm9yIHRoZSBsYXN0IGhlYWRlcgorICAgICAgICBpID0gMAorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgbGluZXMuaW5zZXJ0KGksICdYLVBlZXI6ICVzJyAlIHBlZXJbMF0pCisgICAgICAgIGRhdGEgPSBORVdMSU5FLmpvaW4obGluZXMpCisgICAgICAgIHJlZnVzZWQgPSBzZWxmLl9kZWxpdmVyKG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKQorICAgICAgICAjIFRCRDogd2hhdCB0byBkbyB3aXRoIHJlZnVzZWQgYWRkcmVzc2VzPworICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ3dlIGdvdCBzb21lIHJlZnVzYWxzOicsIHJlZnVzZWQKKworICAgIGRlZiBfZGVsaXZlcihzZWxmLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSk6CisgICAgICAgIGltcG9ydCBzbXRwbGliCisgICAgICAgIHJlZnVzZWQgPSB7fQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gc210cGxpYi5TTVRQKCkKKyAgICAgICAgICAgIHMuY29ubmVjdChzZWxmLl9yZW1vdGVhZGRyWzBdLCBzZWxmLl9yZW1vdGVhZGRyWzFdKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlZnVzZWQgPSBzLnNlbmRtYWlsKG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLnF1aXQoKQorICAgICAgICBleGNlcHQgc210cGxpYi5TTVRQUmVjaXBpZW50c1JlZnVzZWQsIGU6CisgICAgICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ2dvdCBTTVRQUmVjaXBpZW50c1JlZnVzZWQnCisgICAgICAgICAgICByZWZ1c2VkID0gZS5yZWNpcGllbnRzCisgICAgICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yLCBzbXRwbGliLlNNVFBFeGNlcHRpb24pLCBlOgorICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdnb3QnLCBlLl9fY2xhc3NfXworICAgICAgICAgICAgIyBBbGwgcmVjaXBpZW50cyB3ZXJlIHJlZnVzZWQuICBJZiB0aGUgZXhjZXB0aW9uIGhhZCBhbiBhc3NvY2lhdGVkCisgICAgICAgICAgICAjIGVycm9yIGNvZGUsIHVzZSBpdC4gIE90aGVyd2lzZSxmYWtlIGl0IHdpdGggYSBub24tdHJpZ2dlcmluZworICAgICAgICAgICAgIyBleGNlcHRpb24gY29kZS4KKyAgICAgICAgICAgIGVycmNvZGUgPSBnZXRhdHRyKGUsICdzbXRwX2NvZGUnLCAtMSkKKyAgICAgICAgICAgIGVycm1zZyA9IGdldGF0dHIoZSwgJ3NtdHBfZXJyb3InLCAnaWdub3JlJykKKyAgICAgICAgICAgIGZvciByIGluIHJjcHR0b3M6CisgICAgICAgICAgICAgICAgcmVmdXNlZFtyXSA9IChlcnJjb2RlLCBlcnJtc2cpCisgICAgICAgIHJldHVybiByZWZ1c2VkCisKKworY2xhc3MgTWFpbG1hblByb3h5KFB1cmVQcm94eSk6CisgICAgZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBwZWVyLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSk6CisgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBmcm9tIE1haWxtYW4gaW1wb3J0IFV0aWxzCisgICAgICAgIGZyb20gTWFpbG1hbiBpbXBvcnQgTWVzc2FnZQorICAgICAgICBmcm9tIE1haWxtYW4gaW1wb3J0IE1haWxMaXN0CisgICAgICAgICMgSWYgdGhlIG1lc3NhZ2UgaXMgdG8gYSBNYWlsbWFuIG1haWxpbmcgbGlzdCwgdGhlbiB3ZSdsbCBpbnZva2UgdGhlCisgICAgICAgICMgTWFpbG1hbiBzY3JpcHQgZGlyZWN0bHksIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCB0aGUgcmVhbCBzbXRwZC4KKyAgICAgICAgIyBPdGhlcndpc2Ugd2UnbGwgZm9yd2FyZCBpdCB0byB0aGUgbG9jYWwgcHJveHkgZm9yIGRpc3Bvc2l0aW9uLgorICAgICAgICBsaXN0bmFtZXMgPSBbXQorICAgICAgICBmb3IgcmNwdCBpbiByY3B0dG9zOgorICAgICAgICAgICAgbG9jYWwgPSByY3B0Lmxvd2VyKCkuc3BsaXQoJ0AnKVswXQorICAgICAgICAgICAgIyBXZSBhbGxvdyB0aGUgZm9sbG93aW5nIHZhcmlhdGlvbnMgb24gdGhlIHRoZW1lCisgICAgICAgICAgICAjICAgbGlzdG5hbWUKKyAgICAgICAgICAgICMgICBsaXN0bmFtZS1hZG1pbgorICAgICAgICAgICAgIyAgIGxpc3RuYW1lLW93bmVyCisgICAgICAgICAgICAjICAgbGlzdG5hbWUtcmVxdWVzdAorICAgICAgICAgICAgIyAgIGxpc3RuYW1lLWpvaW4KKyAgICAgICAgICAgICMgICBsaXN0bmFtZS1sZWF2ZQorICAgICAgICAgICAgcGFydHMgPSBsb2NhbC5zcGxpdCgnLScpCisgICAgICAgICAgICBpZiBsZW4ocGFydHMpID4gMjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGlzdG5hbWUgPSBwYXJ0c1swXQorICAgICAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyOgorICAgICAgICAgICAgICAgIGNvbW1hbmQgPSBwYXJ0c1sxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gJycKKyAgICAgICAgICAgIGlmIG5vdCBVdGlscy5saXN0X2V4aXN0cyhsaXN0bmFtZSkgb3IgY29tbWFuZCBub3QgaW4gKAorICAgICAgICAgICAgICAgICAgICAnJywgJ2FkbWluJywgJ293bmVyJywgJ3JlcXVlc3QnLCAnam9pbicsICdsZWF2ZScpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsaXN0bmFtZXMuYXBwZW5kKChyY3B0LCBsaXN0bmFtZSwgY29tbWFuZCkpCisgICAgICAgICMgUmVtb3ZlIGFsbCBsaXN0IHJlY2lwaWVudHMgZnJvbSByY3B0dG9zIGFuZCBmb3J3YXJkIHdoYXQgd2UncmUgbm90CisgICAgICAgICMgZ29pbmcgdG8gdGFrZSBjYXJlIG9mIG91cnNlbHZlcy4gIExpbmVhciByZW1vdmFsIHNob3VsZCBiZSBmaW5lCisgICAgICAgICMgc2luY2Ugd2UgZG9uJ3QgZXhwZWN0IGEgbGFyZ2UgbnVtYmVyIG9mIHJlY2lwaWVudHMuCisgICAgICAgIGZvciByY3B0LCBsaXN0bmFtZSwgY29tbWFuZCBpbiBsaXN0bmFtZXM6CisgICAgICAgICAgICByY3B0dG9zLnJlbW92ZShyY3B0KQorICAgICAgICAjIElmIHRoZXJlJ3MgYW55IG5vbi1saXN0IGRlc3RpbmVkIHJlY2lwaWVudHMgbGVmdCwKKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdmb3J3YXJkaW5nIHJlY2lwczonLCAnICcuam9pbihyY3B0dG9zKQorICAgICAgICBpZiByY3B0dG9zOgorICAgICAgICAgICAgcmVmdXNlZCA9IHNlbGYuX2RlbGl2ZXIobWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpCisgICAgICAgICAgICAjIFRCRDogd2hhdCB0byBkbyB3aXRoIHJlZnVzZWQgYWRkcmVzc2VzPworICAgICAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICd3ZSBnb3QgcmVmdXNhbHM6JywgcmVmdXNlZAorICAgICAgICAjIE5vdyBkZWxpdmVyIGRpcmVjdGx5IHRvIHRoZSBsaXN0IGNvbW1hbmRzCisgICAgICAgIG1saXN0cyA9IHt9CisgICAgICAgIHMgPSBTdHJpbmdJTyhkYXRhKQorICAgICAgICBtc2cgPSBNZXNzYWdlLk1lc3NhZ2UocykKKyAgICAgICAgIyBUaGVzZSBoZWFkZXJzIGFyZSByZXF1aXJlZCBmb3IgdGhlIHByb3BlciBleGVjdXRpb24gb2YgTWFpbG1hbi4gIEFsbAorICAgICAgICAjIE1UQXMgaW4gZXhpc3RlbmNlIHNlZW0gdG8gYWRkIHRoZXNlIGlmIHRoZSBvcmlnaW5hbCBtZXNzYWdlIGRvZXNuJ3QKKyAgICAgICAgIyBoYXZlIHRoZW0uCisgICAgICAgIGlmIG5vdCBtc2cuZ2V0aGVhZGVyKCdmcm9tJyk6CisgICAgICAgICAgICBtc2dbJ0Zyb20nXSA9IG1haWxmcm9tCisgICAgICAgIGlmIG5vdCBtc2cuZ2V0aGVhZGVyKCdkYXRlJyk6CisgICAgICAgICAgICBtc2dbJ0RhdGUnXSA9IHRpbWUuY3RpbWUodGltZS50aW1lKCkpCisgICAgICAgIGZvciByY3B0LCBsaXN0bmFtZSwgY29tbWFuZCBpbiBsaXN0bmFtZXM6CisgICAgICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ3NlbmRpbmcgbWVzc2FnZSB0bycsIHJjcHQKKyAgICAgICAgICAgIG1saXN0ID0gbWxpc3RzLmdldChsaXN0bmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBtbGlzdDoKKyAgICAgICAgICAgICAgICBtbGlzdCA9IE1haWxMaXN0Lk1haWxMaXN0KGxpc3RuYW1lLCBsb2NrPTApCisgICAgICAgICAgICAgICAgbWxpc3RzW2xpc3RuYW1lXSA9IG1saXN0CisgICAgICAgICAgICAjIGRpc3BhdGNoIG9uIHRoZSB0eXBlIG9mIGNvbW1hbmQKKyAgICAgICAgICAgIGlmIGNvbW1hbmQgPT0gJyc6CisgICAgICAgICAgICAgICAgIyBwb3N0CisgICAgICAgICAgICAgICAgbXNnLkVucXVldWUobWxpc3QsIHRvbGlzdD0xKQorICAgICAgICAgICAgZWxpZiBjb21tYW5kID09ICdhZG1pbic6CisgICAgICAgICAgICAgICAgbXNnLkVucXVldWUobWxpc3QsIHRvYWRtaW49MSkKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZCA9PSAnb3duZXInOgorICAgICAgICAgICAgICAgIG1zZy5FbnF1ZXVlKG1saXN0LCB0b293bmVyPTEpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgPT0gJ3JlcXVlc3QnOgorICAgICAgICAgICAgICAgIG1zZy5FbnF1ZXVlKG1saXN0LCB0b3JlcXVlc3Q9MSkKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZCBpbiAoJ2pvaW4nLCAnbGVhdmUnKToKKyAgICAgICAgICAgICAgICAjIFRCRDogdGhpcyBpcyBhIGhhY2shCisgICAgICAgICAgICAgICAgaWYgY29tbWFuZCA9PSAnam9pbic6CisgICAgICAgICAgICAgICAgICAgIG1zZ1snU3ViamVjdCddID0gJ3N1YnNjcmliZScKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICd1bnN1YnNjcmliZScKKyAgICAgICAgICAgICAgICBtc2cuRW5xdWV1ZShtbGlzdCwgdG9yZXF1ZXN0PTEpCisKKworY2xhc3MgT3B0aW9uczoKKyAgICBzZXR1aWQgPSAxCisgICAgY2xhc3NuYW1lID0gJ1B1cmVQcm94eScKKworCitkZWYgcGFyc2VhcmdzKCk6CisgICAgZ2xvYmFsIERFQlVHU1RSRUFNCisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdCgKKyAgICAgICAgICAgIHN5cy5hcmd2WzE6XSwgJ25WaGM6ZCcsCisgICAgICAgICAgICBbJ2NsYXNzPScsICdub3NldHVpZCcsICd2ZXJzaW9uJywgJ2hlbHAnLCAnZGVidWcnXSkKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBlOgorICAgICAgICB1c2FnZSgxLCBlKQorCisgICAgb3B0aW9ucyA9IE9wdGlvbnMoKQorICAgIGZvciBvcHQsIGFyZyBpbiBvcHRzOgorICAgICAgICBpZiBvcHQgaW4gKCctaCcsICctLWhlbHAnKToKKyAgICAgICAgICAgIHVzYWdlKDApCisgICAgICAgIGVsaWYgb3B0IGluICgnLVYnLCAnLS12ZXJzaW9uJyk6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBfX3ZlcnNpb25fXworICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctbicsICctLW5vc2V0dWlkJyk6CisgICAgICAgICAgICBvcHRpb25zLnNldHVpZCA9IDAKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctYycsICctLWNsYXNzJyk6CisgICAgICAgICAgICBvcHRpb25zLmNsYXNzbmFtZSA9IGFyZworICAgICAgICBlbGlmIG9wdCBpbiAoJy1kJywgJy0tZGVidWcnKToKKyAgICAgICAgICAgIERFQlVHU1RSRUFNID0gc3lzLnN0ZGVycgorCisgICAgIyBwYXJzZSB0aGUgcmVzdCBvZiB0aGUgYXJndW1lbnRzCisgICAgaWYgbGVuKGFyZ3MpIDwgMToKKyAgICAgICAgbG9jYWxzcGVjID0gJ2xvY2FsaG9zdDo4MDI1JworICAgICAgICByZW1vdGVzcGVjID0gJ2xvY2FsaG9zdDoyNScKKyAgICBlbGlmIGxlbihhcmdzKSA8IDI6CisgICAgICAgIGxvY2Fsc3BlYyA9IGFyZ3NbMF0KKyAgICAgICAgcmVtb3Rlc3BlYyA9ICdsb2NhbGhvc3Q6MjUnCisgICAgZWxpZiBsZW4oYXJncykgPCAzOgorICAgICAgICBsb2NhbHNwZWMgPSBhcmdzWzBdCisgICAgICAgIHJlbW90ZXNwZWMgPSBhcmdzWzFdCisgICAgZWxzZToKKyAgICAgICAgdXNhZ2UoMSwgJ0ludmFsaWQgYXJndW1lbnRzOiAlcycgJSBDT01NQVNQQUNFLmpvaW4oYXJncykpCisKKyAgICAjIHNwbGl0IGludG8gaG9zdC9wb3J0IHBhaXJzCisgICAgaSA9IGxvY2Fsc3BlYy5maW5kKCc6JykKKyAgICBpZiBpIDwgMDoKKyAgICAgICAgdXNhZ2UoMSwgJ0JhZCBsb2NhbCBzcGVjOiAlcycgJSBsb2NhbHNwZWMpCisgICAgb3B0aW9ucy5sb2NhbGhvc3QgPSBsb2NhbHNwZWNbOmldCisgICAgdHJ5OgorICAgICAgICBvcHRpb25zLmxvY2FscG9ydCA9IGludChsb2NhbHNwZWNbaSsxOl0pCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHVzYWdlKDEsICdCYWQgbG9jYWwgcG9ydDogJXMnICUgbG9jYWxzcGVjKQorICAgIGkgPSByZW1vdGVzcGVjLmZpbmQoJzonKQorICAgIGlmIGkgPCAwOgorICAgICAgICB1c2FnZSgxLCAnQmFkIHJlbW90ZSBzcGVjOiAlcycgJSByZW1vdGVzcGVjKQorICAgIG9wdGlvbnMucmVtb3RlaG9zdCA9IHJlbW90ZXNwZWNbOmldCisgICAgdHJ5OgorICAgICAgICBvcHRpb25zLnJlbW90ZXBvcnQgPSBpbnQocmVtb3Rlc3BlY1tpKzE6XSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgdXNhZ2UoMSwgJ0JhZCByZW1vdGUgcG9ydDogJXMnICUgcmVtb3Rlc3BlYykKKyAgICByZXR1cm4gb3B0aW9ucworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgb3B0aW9ucyA9IHBhcnNlYXJncygpCisgICAgIyBCZWNvbWUgbm9ib2R5CisgICAgY2xhc3NuYW1lID0gb3B0aW9ucy5jbGFzc25hbWUKKyAgICBpZiAiLiIgaW4gY2xhc3NuYW1lOgorICAgICAgICBsYXN0ZG90ID0gY2xhc3NuYW1lLnJmaW5kKCIuIikKKyAgICAgICAgbW9kID0gX19pbXBvcnRfXyhjbGFzc25hbWVbOmxhc3Rkb3RdLCBnbG9iYWxzKCksIGxvY2FscygpLCBbIiJdKQorICAgICAgICBjbGFzc25hbWUgPSBjbGFzc25hbWVbbGFzdGRvdCsxOl0KKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgX19tYWluX18gYXMgbW9kCisgICAgY2xhc3NfID0gZ2V0YXR0cihtb2QsIGNsYXNzbmFtZSkKKyAgICBwcm94eSA9IGNsYXNzXygob3B0aW9ucy5sb2NhbGhvc3QsIG9wdGlvbnMubG9jYWxwb3J0KSwKKyAgICAgICAgICAgICAgICAgICAob3B0aW9ucy5yZW1vdGVob3N0LCBvcHRpb25zLnJlbW90ZXBvcnQpKQorICAgIGlmIG9wdGlvbnMuc2V0dWlkOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgcHdkCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIFwKKyAgICAgICAgICAgICAgICAgICdDYW5ub3QgaW1wb3J0IG1vZHVsZSAicHdkIjsgdHJ5IHJ1bm5pbmcgd2l0aCAtbiBvcHRpb24uJworICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgbm9ib2R5ID0gcHdkLmdldHB3bmFtKCdub2JvZHknKVsyXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5zZXR1aWQobm9ib2R5KQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRVBFUk06IHJhaXNlCisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBcCisgICAgICAgICAgICAgICAgICAnQ2Fubm90IHNldHVpZCAibm9ib2R5IjsgdHJ5IHJ1bm5pbmcgd2l0aCAtbiBvcHRpb24uJworICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICB0cnk6CisgICAgICAgIGFzeW5jb3JlLmxvb3AoKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvUHl0aG9uLWFzdC5oIGIvaW5jbHVkZS9weXRob24yLjcvUHl0aG9uLWFzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzViYmIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9QeXRob24tYXN0LmgKQEAgLTAsMCArMSw1MzUgQEAKKy8qIEZpbGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgUGFyc2VyL2FzZGxfYy5weS4gKi8KKworI2luY2x1ZGUgImFzZGwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgX21vZCAqbW9kX3R5OworCit0eXBlZGVmIHN0cnVjdCBfc3RtdCAqc3RtdF90eTsKKwordHlwZWRlZiBzdHJ1Y3QgX2V4cHIgKmV4cHJfdHk7CisKK3R5cGVkZWYgZW51bSBfZXhwcl9jb250ZXh0IHsgTG9hZD0xLCBTdG9yZT0yLCBEZWw9MywgQXVnTG9hZD00LCBBdWdTdG9yZT01LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbT02IH0gZXhwcl9jb250ZXh0X3R5OworCit0eXBlZGVmIHN0cnVjdCBfc2xpY2UgKnNsaWNlX3R5OworCit0eXBlZGVmIGVudW0gX2Jvb2xvcCB7IEFuZD0xLCBPcj0yIH0gYm9vbG9wX3R5OworCit0eXBlZGVmIGVudW0gX29wZXJhdG9yIHsgQWRkPTEsIFN1Yj0yLCBNdWx0PTMsIERpdj00LCBNb2Q9NSwgUG93PTYsIExTaGlmdD03LAorICAgICAgICAgICAgICAgICAgICAgICAgIFJTaGlmdD04LCBCaXRPcj05LCBCaXRYb3I9MTAsIEJpdEFuZD0xMSwgRmxvb3JEaXY9MTIgfQorICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yX3R5OworCit0eXBlZGVmIGVudW0gX3VuYXJ5b3AgeyBJbnZlcnQ9MSwgTm90PTIsIFVBZGQ9MywgVVN1Yj00IH0gdW5hcnlvcF90eTsKKwordHlwZWRlZiBlbnVtIF9jbXBvcCB7IEVxPTEsIE5vdEVxPTIsIEx0PTMsIEx0RT00LCBHdD01LCBHdEU9NiwgSXM9NywgSXNOb3Q9OCwKKyAgICAgICAgICAgICAgICAgICAgICBJbj05LCBOb3RJbj0xMCB9IGNtcG9wX3R5OworCit0eXBlZGVmIHN0cnVjdCBfY29tcHJlaGVuc2lvbiAqY29tcHJlaGVuc2lvbl90eTsKKwordHlwZWRlZiBzdHJ1Y3QgX2V4Y2VwdGhhbmRsZXIgKmV4Y2VwdGhhbmRsZXJfdHk7CisKK3R5cGVkZWYgc3RydWN0IF9hcmd1bWVudHMgKmFyZ3VtZW50c190eTsKKwordHlwZWRlZiBzdHJ1Y3QgX2tleXdvcmQgKmtleXdvcmRfdHk7CisKK3R5cGVkZWYgc3RydWN0IF9hbGlhcyAqYWxpYXNfdHk7CisKKworZW51bSBfbW9kX2tpbmQge01vZHVsZV9raW5kPTEsIEludGVyYWN0aXZlX2tpbmQ9MiwgRXhwcmVzc2lvbl9raW5kPTMsCisgICAgICAgICAgICAgICAgIFN1aXRlX2tpbmQ9NH07CitzdHJ1Y3QgX21vZCB7CisgICAgICAgIGVudW0gX21vZF9raW5kIGtpbmQ7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmJvZHk7CisgICAgICAgICAgICAgICAgfSBNb2R1bGU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgIH0gSW50ZXJhY3RpdmU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgYm9keTsKKyAgICAgICAgICAgICAgICB9IEV4cHJlc3Npb247CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgIH0gU3VpdGU7CisgICAgICAgICAgICAgICAgCisgICAgICAgIH0gdjsKK307CisKK2VudW0gX3N0bXRfa2luZCB7RnVuY3Rpb25EZWZfa2luZD0xLCBDbGFzc0RlZl9raW5kPTIsIFJldHVybl9raW5kPTMsCisgICAgICAgICAgICAgICAgICBEZWxldGVfa2luZD00LCBBc3NpZ25fa2luZD01LCBBdWdBc3NpZ25fa2luZD02LCBQcmludF9raW5kPTcsCisgICAgICAgICAgICAgICAgICBGb3Jfa2luZD04LCBXaGlsZV9raW5kPTksIElmX2tpbmQ9MTAsIFdpdGhfa2luZD0xMSwKKyAgICAgICAgICAgICAgICAgIFJhaXNlX2tpbmQ9MTIsIFRyeUV4Y2VwdF9raW5kPTEzLCBUcnlGaW5hbGx5X2tpbmQ9MTQsCisgICAgICAgICAgICAgICAgICBBc3NlcnRfa2luZD0xNSwgSW1wb3J0X2tpbmQ9MTYsIEltcG9ydEZyb21fa2luZD0xNywKKyAgICAgICAgICAgICAgICAgIEV4ZWNfa2luZD0xOCwgR2xvYmFsX2tpbmQ9MTksIEV4cHJfa2luZD0yMCwgUGFzc19raW5kPTIxLAorICAgICAgICAgICAgICAgICAgQnJlYWtfa2luZD0yMiwgQ29udGludWVfa2luZD0yM307CitzdHJ1Y3QgX3N0bXQgeworICAgICAgICBlbnVtIF9zdG10X2tpbmQga2luZDsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNfdHkgYXJnczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmRlY29yYXRvcl9saXN0OworICAgICAgICAgICAgICAgIH0gRnVuY3Rpb25EZWY7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpiYXNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmRlY29yYXRvcl9saXN0OworICAgICAgICAgICAgICAgIH0gQ2xhc3NEZWY7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgfSBSZXR1cm47CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICp0YXJnZXRzOworICAgICAgICAgICAgICAgIH0gRGVsZXRlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqdGFyZ2V0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgfSBBc3NpZ247CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdGFyZ2V0OworICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfdHkgb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgIH0gQXVnQXNzaWduOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGRlc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqdmFsdWVzOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBubDsKKyAgICAgICAgICAgICAgICB9IFByaW50OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHRhcmdldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKm9yZWxzZTsKKyAgICAgICAgICAgICAgICB9IEZvcjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB0ZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmJvZHk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqb3JlbHNlOworICAgICAgICAgICAgICAgIH0gV2hpbGU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKm9yZWxzZTsKKyAgICAgICAgICAgICAgICB9IElmOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGNvbnRleHRfZXhwcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgb3B0aW9uYWxfdmFyczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgIH0gV2l0aDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB0eXBlOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBpbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB0YmFjazsKKyAgICAgICAgICAgICAgICB9IFJhaXNlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpoYW5kbGVyczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpvcmVsc2U7CisgICAgICAgICAgICAgICAgfSBUcnlFeGNlcHQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmZpbmFsYm9keTsKKyAgICAgICAgICAgICAgICB9IFRyeUZpbmFsbHk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgbXNnOworICAgICAgICAgICAgICAgIH0gQXNzZXJ0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqbmFtZXM7CisgICAgICAgICAgICAgICAgfSBJbXBvcnQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbW9kdWxlOworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKm5hbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsOworICAgICAgICAgICAgICAgIH0gSW1wb3J0RnJvbTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBnbG9iYWxzOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBsb2NhbHM7CisgICAgICAgICAgICAgICAgfSBFeGVjOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqbmFtZXM7CisgICAgICAgICAgICAgICAgfSBHbG9iYWw7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgfSBFeHByOworICAgICAgICAgICAgICAgIAorICAgICAgICB9IHY7CisgICAgICAgIGludCBsaW5lbm87CisgICAgICAgIGludCBjb2xfb2Zmc2V0OworfTsKKworZW51bSBfZXhwcl9raW5kIHtCb29sT3Bfa2luZD0xLCBCaW5PcF9raW5kPTIsIFVuYXJ5T3Bfa2luZD0zLCBMYW1iZGFfa2luZD00LAorICAgICAgICAgICAgICAgICAgSWZFeHBfa2luZD01LCBEaWN0X2tpbmQ9NiwgU2V0X2tpbmQ9NywgTGlzdENvbXBfa2luZD04LAorICAgICAgICAgICAgICAgICAgU2V0Q29tcF9raW5kPTksIERpY3RDb21wX2tpbmQ9MTAsIEdlbmVyYXRvckV4cF9raW5kPTExLAorICAgICAgICAgICAgICAgICAgWWllbGRfa2luZD0xMiwgQ29tcGFyZV9raW5kPTEzLCBDYWxsX2tpbmQ9MTQsIFJlcHJfa2luZD0xNSwKKyAgICAgICAgICAgICAgICAgIE51bV9raW5kPTE2LCBTdHJfa2luZD0xNywgQXR0cmlidXRlX2tpbmQ9MTgsCisgICAgICAgICAgICAgICAgICBTdWJzY3JpcHRfa2luZD0xOSwgTmFtZV9raW5kPTIwLCBMaXN0X2tpbmQ9MjEsIFR1cGxlX2tpbmQ9MjJ9Oworc3RydWN0IF9leHByIHsKKyAgICAgICAgZW51bSBfZXhwcl9raW5kIGtpbmQ7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbG9wX3R5IG9wOworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKnZhbHVlczsKKyAgICAgICAgICAgICAgICB9IEJvb2xPcDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBsZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JfdHkgb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHJpZ2h0OworICAgICAgICAgICAgICAgIH0gQmluT3A7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuYXJ5b3BfdHkgb3A7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IG9wZXJhbmQ7CisgICAgICAgICAgICAgICAgfSBVbmFyeU9wOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNfdHkgYXJnczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgYm9keTsKKyAgICAgICAgICAgICAgICB9IExhbWJkYTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB0ZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBib2R5OworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBvcmVsc2U7CisgICAgICAgICAgICAgICAgfSBJZkV4cDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmtleXM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqdmFsdWVzOworICAgICAgICAgICAgICAgIH0gRGljdDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmVsdHM7CisgICAgICAgICAgICAgICAgfSBTZXQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgZWx0OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmdlbmVyYXRvcnM7CisgICAgICAgICAgICAgICAgfSBMaXN0Q29tcDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBlbHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqZ2VuZXJhdG9yczsKKyAgICAgICAgICAgICAgICB9IFNldENvbXA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkga2V5OworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICpnZW5lcmF0b3JzOworICAgICAgICAgICAgICAgIH0gRGljdENvbXA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgZWx0OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmdlbmVyYXRvcnM7CisgICAgICAgICAgICAgICAgfSBHZW5lcmF0b3JFeHA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgfSBZaWVsZDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBsZWZ0OworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9pbnRfc2VxICpvcHM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqY29tcGFyYXRvcnM7CisgICAgICAgICAgICAgICAgfSBDb21wYXJlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGZ1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYXJnczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICprZXl3b3JkczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgc3RhcmFyZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IGt3YXJnczsKKyAgICAgICAgICAgICAgICB9IENhbGw7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgfSBSZXByOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgbjsKKyAgICAgICAgICAgICAgICB9IE51bTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHM7CisgICAgICAgICAgICAgICAgfSBTdHI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIGF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX2NvbnRleHRfdHkgY3R4OworICAgICAgICAgICAgICAgIH0gQXR0cmlidXRlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VfdHkgc2xpY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX2NvbnRleHRfdHkgY3R4OworICAgICAgICAgICAgICAgIH0gU3Vic2NyaXB0OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIGlkOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKKyAgICAgICAgICAgICAgICB9IE5hbWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICplbHRzOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKKyAgICAgICAgICAgICAgICB9IExpc3Q7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICplbHRzOworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9jb250ZXh0X3R5IGN0eDsKKyAgICAgICAgICAgICAgICB9IFR1cGxlOworICAgICAgICAgICAgICAgIAorICAgICAgICB9IHY7CisgICAgICAgIGludCBsaW5lbm87CisgICAgICAgIGludCBjb2xfb2Zmc2V0OworfTsKKworZW51bSBfc2xpY2Vfa2luZCB7RWxsaXBzaXNfa2luZD0xLCBTbGljZV9raW5kPTIsIEV4dFNsaWNlX2tpbmQ9MywgSW5kZXhfa2luZD00fTsKK3N0cnVjdCBfc2xpY2UgeworICAgICAgICBlbnVtIF9zbGljZV9raW5kIGtpbmQ7CisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSBsb3dlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJfdHkgdXBwZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHN0ZXA7CisgICAgICAgICAgICAgICAgfSBTbGljZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKmRpbXM7CisgICAgICAgICAgICAgICAgfSBFeHRTbGljZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl90eSB2YWx1ZTsKKyAgICAgICAgICAgICAgICB9IEluZGV4OworICAgICAgICAgICAgICAgIAorICAgICAgICB9IHY7Cit9OworCitzdHJ1Y3QgX2NvbXByZWhlbnNpb24geworICAgICAgICBleHByX3R5IHRhcmdldDsKKyAgICAgICAgZXhwcl90eSBpdGVyOworICAgICAgICBhc2RsX3NlcSAqaWZzOworfTsKKworZW51bSBfZXhjZXB0aGFuZGxlcl9raW5kIHtFeGNlcHRIYW5kbGVyX2tpbmQ9MX07CitzdHJ1Y3QgX2V4Y2VwdGhhbmRsZXIgeworICAgICAgICBlbnVtIF9leGNlcHRoYW5kbGVyX2tpbmQga2luZDsKKyAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IHR5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICBleHByX3R5IG5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICBhc2RsX3NlcSAqYm9keTsKKyAgICAgICAgICAgICAgICB9IEV4Y2VwdEhhbmRsZXI7CisgICAgICAgICAgICAgICAgCisgICAgICAgIH0gdjsKKyAgICAgICAgaW50IGxpbmVubzsKKyAgICAgICAgaW50IGNvbF9vZmZzZXQ7Cit9OworCitzdHJ1Y3QgX2FyZ3VtZW50cyB7CisgICAgICAgIGFzZGxfc2VxICphcmdzOworICAgICAgICBpZGVudGlmaWVyIHZhcmFyZzsKKyAgICAgICAgaWRlbnRpZmllciBrd2FyZzsKKyAgICAgICAgYXNkbF9zZXEgKmRlZmF1bHRzOworfTsKKworc3RydWN0IF9rZXl3b3JkIHsKKyAgICAgICAgaWRlbnRpZmllciBhcmc7CisgICAgICAgIGV4cHJfdHkgdmFsdWU7Cit9OworCitzdHJ1Y3QgX2FsaWFzIHsKKyAgICAgICAgaWRlbnRpZmllciBuYW1lOworICAgICAgICBpZGVudGlmaWVyIGFzbmFtZTsKK307CisKKworI2RlZmluZSBNb2R1bGUoYTAsIGExKSBfUHlfTW9kdWxlKGEwLCBhMSkKK21vZF90eSBfUHlfTW9kdWxlKGFzZGxfc2VxICogYm9keSwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBJbnRlcmFjdGl2ZShhMCwgYTEpIF9QeV9JbnRlcmFjdGl2ZShhMCwgYTEpCittb2RfdHkgX1B5X0ludGVyYWN0aXZlKGFzZGxfc2VxICogYm9keSwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBFeHByZXNzaW9uKGEwLCBhMSkgX1B5X0V4cHJlc3Npb24oYTAsIGExKQorbW9kX3R5IF9QeV9FeHByZXNzaW9uKGV4cHJfdHkgYm9keSwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBTdWl0ZShhMCwgYTEpIF9QeV9TdWl0ZShhMCwgYTEpCittb2RfdHkgX1B5X1N1aXRlKGFzZGxfc2VxICogYm9keSwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBGdW5jdGlvbkRlZihhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNikgX1B5X0Z1bmN0aW9uRGVmKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQorc3RtdF90eSBfUHlfRnVuY3Rpb25EZWYoaWRlbnRpZmllciBuYW1lLCBhcmd1bWVudHNfdHkgYXJncywgYXNkbF9zZXEgKiBib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXEgKiBkZWNvcmF0b3JfbGlzdCwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIENsYXNzRGVmKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSBfUHlfQ2xhc3NEZWYoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpCitzdG10X3R5IF9QeV9DbGFzc0RlZihpZGVudGlmaWVyIG5hbWUsIGFzZGxfc2VxICogYmFzZXMsIGFzZGxfc2VxICogYm9keSwKKyAgICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxICogZGVjb3JhdG9yX2xpc3QsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBSZXR1cm4oYTAsIGExLCBhMiwgYTMpIF9QeV9SZXR1cm4oYTAsIGExLCBhMiwgYTMpCitzdG10X3R5IF9QeV9SZXR1cm4oZXhwcl90eSB2YWx1ZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRGVsZXRlKGEwLCBhMSwgYTIsIGEzKSBfUHlfRGVsZXRlKGEwLCBhMSwgYTIsIGEzKQorc3RtdF90eSBfUHlfRGVsZXRlKGFzZGxfc2VxICogdGFyZ2V0cywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKKyAgICAgICAgICAgICAgICAgICAqYXJlbmEpOworI2RlZmluZSBBc3NpZ24oYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfQXNzaWduKGEwLCBhMSwgYTIsIGEzLCBhNCkKK3N0bXRfdHkgX1B5X0Fzc2lnbihhc2RsX3NlcSAqIHRhcmdldHMsIGV4cHJfdHkgdmFsdWUsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgQXVnQXNzaWduKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9BdWdBc3NpZ24oYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK3N0bXRfdHkgX1B5X0F1Z0Fzc2lnbihleHByX3R5IHRhcmdldCwgb3BlcmF0b3JfdHkgb3AsIGV4cHJfdHkgdmFsdWUsIGludAorICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgUHJpbnQoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X1ByaW50KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9QcmludChleHByX3R5IGRlc3QsIGFzZGxfc2VxICogdmFsdWVzLCBib29sIG5sLCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRm9yKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSBfUHlfRm9yKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KQorc3RtdF90eSBfUHlfRm9yKGV4cHJfdHkgdGFyZ2V0LCBleHByX3R5IGl0ZXIsIGFzZGxfc2VxICogYm9keSwgYXNkbF9zZXEgKgorICAgICAgICAgICAgICAgIG9yZWxzZSwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgV2hpbGUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X1doaWxlKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9XaGlsZShleHByX3R5IHRlc3QsIGFzZGxfc2VxICogYm9keSwgYXNkbF9zZXEgKiBvcmVsc2UsIGludCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBJZihhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfSWYoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK3N0bXRfdHkgX1B5X0lmKGV4cHJfdHkgdGVzdCwgYXNkbF9zZXEgKiBib2R5LCBhc2RsX3NlcSAqIG9yZWxzZSwgaW50IGxpbmVubywKKyAgICAgICAgICAgICAgIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFdpdGgoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X1dpdGgoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK3N0bXRfdHkgX1B5X1dpdGgoZXhwcl90eSBjb250ZXh0X2V4cHIsIGV4cHJfdHkgb3B0aW9uYWxfdmFycywgYXNkbF9zZXEgKiBib2R5LAorICAgICAgICAgICAgICAgICBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBSYWlzZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfUmFpc2UoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK3N0bXRfdHkgX1B5X1JhaXNlKGV4cHJfdHkgdHlwZSwgZXhwcl90eSBpbnN0LCBleHByX3R5IHRiYWNrLCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgVHJ5RXhjZXB0KGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9UcnlFeGNlcHQoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK3N0bXRfdHkgX1B5X1RyeUV4Y2VwdChhc2RsX3NlcSAqIGJvZHksIGFzZGxfc2VxICogaGFuZGxlcnMsIGFzZGxfc2VxICogb3JlbHNlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFRyeUZpbmFsbHkoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfVHJ5RmluYWxseShhMCwgYTEsIGEyLCBhMywgYTQpCitzdG10X3R5IF9QeV9UcnlGaW5hbGx5KGFzZGxfc2VxICogYm9keSwgYXNkbF9zZXEgKiBmaW5hbGJvZHksIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEFzc2VydChhMCwgYTEsIGEyLCBhMywgYTQpIF9QeV9Bc3NlcnQoYTAsIGExLCBhMiwgYTMsIGE0KQorc3RtdF90eSBfUHlfQXNzZXJ0KGV4cHJfdHkgdGVzdCwgZXhwcl90eSBtc2csIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSW1wb3J0KGEwLCBhMSwgYTIsIGEzKSBfUHlfSW1wb3J0KGEwLCBhMSwgYTIsIGEzKQorc3RtdF90eSBfUHlfSW1wb3J0KGFzZGxfc2VxICogbmFtZXMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hCisgICAgICAgICAgICAgICAgICAgKmFyZW5hKTsKKyNkZWZpbmUgSW1wb3J0RnJvbShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KSBfUHlfSW1wb3J0RnJvbShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorc3RtdF90eSBfUHlfSW1wb3J0RnJvbShpZGVudGlmaWVyIG1vZHVsZSwgYXNkbF9zZXEgKiBuYW1lcywgaW50IGxldmVsLCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBFeGVjKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9FeGVjKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitzdG10X3R5IF9QeV9FeGVjKGV4cHJfdHkgYm9keSwgZXhwcl90eSBnbG9iYWxzLCBleHByX3R5IGxvY2FscywgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgR2xvYmFsKGEwLCBhMSwgYTIsIGEzKSBfUHlfR2xvYmFsKGEwLCBhMSwgYTIsIGEzKQorc3RtdF90eSBfUHlfR2xvYmFsKGFzZGxfc2VxICogbmFtZXMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hCisgICAgICAgICAgICAgICAgICAgKmFyZW5hKTsKKyNkZWZpbmUgRXhwcihhMCwgYTEsIGEyLCBhMykgX1B5X0V4cHIoYTAsIGExLCBhMiwgYTMpCitzdG10X3R5IF9QeV9FeHByKGV4cHJfdHkgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFBhc3MoYTAsIGExLCBhMikgX1B5X1Bhc3MoYTAsIGExLCBhMikKK3N0bXRfdHkgX1B5X1Bhc3MoaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgQnJlYWsoYTAsIGExLCBhMikgX1B5X0JyZWFrKGEwLCBhMSwgYTIpCitzdG10X3R5IF9QeV9CcmVhayhpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBDb250aW51ZShhMCwgYTEsIGEyKSBfUHlfQ29udGludWUoYTAsIGExLCBhMikKK3N0bXRfdHkgX1B5X0NvbnRpbnVlKGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEJvb2xPcChhMCwgYTEsIGEyLCBhMywgYTQpIF9QeV9Cb29sT3AoYTAsIGExLCBhMiwgYTMsIGE0KQorZXhwcl90eSBfUHlfQm9vbE9wKGJvb2xvcF90eSBvcCwgYXNkbF9zZXEgKiB2YWx1ZXMsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgQmluT3AoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0Jpbk9wKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpCitleHByX3R5IF9QeV9CaW5PcChleHByX3R5IGxlZnQsIG9wZXJhdG9yX3R5IG9wLCBleHByX3R5IHJpZ2h0LCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgVW5hcnlPcChhMCwgYTEsIGEyLCBhMywgYTQpIF9QeV9VbmFyeU9wKGEwLCBhMSwgYTIsIGEzLCBhNCkKK2V4cHJfdHkgX1B5X1VuYXJ5T3AodW5hcnlvcF90eSBvcCwgZXhwcl90eSBvcGVyYW5kLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBMYW1iZGEoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfTGFtYmRhKGEwLCBhMSwgYTIsIGEzLCBhNCkKK2V4cHJfdHkgX1B5X0xhbWJkYShhcmd1bWVudHNfdHkgYXJncywgZXhwcl90eSBib2R5LCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIElmRXhwKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9JZkV4cChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorZXhwcl90eSBfUHlfSWZFeHAoZXhwcl90eSB0ZXN0LCBleHByX3R5IGJvZHksIGV4cHJfdHkgb3JlbHNlLCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRGljdChhMCwgYTEsIGEyLCBhMywgYTQpIF9QeV9EaWN0KGEwLCBhMSwgYTIsIGEzLCBhNCkKK2V4cHJfdHkgX1B5X0RpY3QoYXNkbF9zZXEgKiBrZXlzLCBhc2RsX3NlcSAqIHZhbHVlcywgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgU2V0KGEwLCBhMSwgYTIsIGEzKSBfUHlfU2V0KGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfU2V0KGFzZGxfc2VxICogZWx0cywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgTGlzdENvbXAoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfTGlzdENvbXAoYTAsIGExLCBhMiwgYTMsIGE0KQorZXhwcl90eSBfUHlfTGlzdENvbXAoZXhwcl90eSBlbHQsIGFzZGxfc2VxICogZ2VuZXJhdG9ycywgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFNldENvbXAoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfU2V0Q29tcChhMCwgYTEsIGEyLCBhMywgYTQpCitleHByX3R5IF9QeV9TZXRDb21wKGV4cHJfdHkgZWx0LCBhc2RsX3NlcSAqIGdlbmVyYXRvcnMsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIERpY3RDb21wKGEwLCBhMSwgYTIsIGEzLCBhNCwgYTUpIF9QeV9EaWN0Q29tcChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorZXhwcl90eSBfUHlfRGljdENvbXAoZXhwcl90eSBrZXksIGV4cHJfdHkgdmFsdWUsIGFzZGxfc2VxICogZ2VuZXJhdG9ycywgaW50CisgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEdlbmVyYXRvckV4cChhMCwgYTEsIGEyLCBhMywgYTQpIF9QeV9HZW5lcmF0b3JFeHAoYTAsIGExLCBhMiwgYTMsIGE0KQorZXhwcl90eSBfUHlfR2VuZXJhdG9yRXhwKGV4cHJfdHkgZWx0LCBhc2RsX3NlcSAqIGdlbmVyYXRvcnMsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgWWllbGQoYTAsIGExLCBhMiwgYTMpIF9QeV9ZaWVsZChhMCwgYTEsIGEyLCBhMykKK2V4cHJfdHkgX1B5X1lpZWxkKGV4cHJfdHkgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIENvbXBhcmUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0NvbXBhcmUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4cHJfdHkgX1B5X0NvbXBhcmUoZXhwcl90eSBsZWZ0LCBhc2RsX2ludF9zZXEgKiBvcHMsIGFzZGxfc2VxICogY29tcGFyYXRvcnMsCisgICAgICAgICAgICAgICAgICAgIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIENhbGwoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSBfUHlfQ2FsbChhMCwgYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpCitleHByX3R5IF9QeV9DYWxsKGV4cHJfdHkgZnVuYywgYXNkbF9zZXEgKiBhcmdzLCBhc2RsX3NlcSAqIGtleXdvcmRzLCBleHByX3R5CisgICAgICAgICAgICAgICAgIHN0YXJhcmdzLCBleHByX3R5IGt3YXJncywgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEKKyAgICAgICAgICAgICAgICAgKmFyZW5hKTsKKyNkZWZpbmUgUmVwcihhMCwgYTEsIGEyLCBhMykgX1B5X1JlcHIoYTAsIGExLCBhMiwgYTMpCitleHByX3R5IF9QeV9SZXByKGV4cHJfdHkgdmFsdWUsIGludCBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIE51bShhMCwgYTEsIGEyLCBhMykgX1B5X051bShhMCwgYTEsIGEyLCBhMykKK2V4cHJfdHkgX1B5X051bShvYmplY3QgbiwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgU3RyKGEwLCBhMSwgYTIsIGEzKSBfUHlfU3RyKGEwLCBhMSwgYTIsIGEzKQorZXhwcl90eSBfUHlfU3RyKHN0cmluZyBzLCBpbnQgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBBdHRyaWJ1dGUoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0F0dHJpYnV0ZShhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorZXhwcl90eSBfUHlfQXR0cmlidXRlKGV4cHJfdHkgdmFsdWUsIGlkZW50aWZpZXIgYXR0ciwgZXhwcl9jb250ZXh0X3R5IGN0eCwgaW50CisgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBpbnQgY29sX29mZnNldCwgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBTdWJzY3JpcHQoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X1N1YnNjcmlwdChhMCwgYTEsIGEyLCBhMywgYTQsIGE1KQorZXhwcl90eSBfUHlfU3Vic2NyaXB0KGV4cHJfdHkgdmFsdWUsIHNsaWNlX3R5IHNsaWNlLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQKKyAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8sIGludCBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIE5hbWUoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfTmFtZShhMCwgYTEsIGEyLCBhMywgYTQpCitleHByX3R5IF9QeV9OYW1lKGlkZW50aWZpZXIgaWQsIGV4cHJfY29udGV4dF90eSBjdHgsIGludCBsaW5lbm8sIGludAorICAgICAgICAgICAgICAgICBjb2xfb2Zmc2V0LCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIExpc3QoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfTGlzdChhMCwgYTEsIGEyLCBhMywgYTQpCitleHByX3R5IF9QeV9MaXN0KGFzZGxfc2VxICogZWx0cywgZXhwcl9jb250ZXh0X3R5IGN0eCwgaW50IGxpbmVubywgaW50CisgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgVHVwbGUoYTAsIGExLCBhMiwgYTMsIGE0KSBfUHlfVHVwbGUoYTAsIGExLCBhMiwgYTMsIGE0KQorZXhwcl90eSBfUHlfVHVwbGUoYXNkbF9zZXEgKiBlbHRzLCBleHByX2NvbnRleHRfdHkgY3R4LCBpbnQgbGluZW5vLCBpbnQKKyAgICAgICAgICAgICAgICAgIGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgRWxsaXBzaXMoYTApIF9QeV9FbGxpcHNpcyhhMCkKK3NsaWNlX3R5IF9QeV9FbGxpcHNpcyhQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIFNsaWNlKGEwLCBhMSwgYTIsIGEzKSBfUHlfU2xpY2UoYTAsIGExLCBhMiwgYTMpCitzbGljZV90eSBfUHlfU2xpY2UoZXhwcl90eSBsb3dlciwgZXhwcl90eSB1cHBlciwgZXhwcl90eSBzdGVwLCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEV4dFNsaWNlKGEwLCBhMSkgX1B5X0V4dFNsaWNlKGEwLCBhMSkKK3NsaWNlX3R5IF9QeV9FeHRTbGljZShhc2RsX3NlcSAqIGRpbXMsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgSW5kZXgoYTAsIGExKSBfUHlfSW5kZXgoYTAsIGExKQorc2xpY2VfdHkgX1B5X0luZGV4KGV4cHJfdHkgdmFsdWUsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgY29tcHJlaGVuc2lvbihhMCwgYTEsIGEyLCBhMykgX1B5X2NvbXByZWhlbnNpb24oYTAsIGExLCBhMiwgYTMpCitjb21wcmVoZW5zaW9uX3R5IF9QeV9jb21wcmVoZW5zaW9uKGV4cHJfdHkgdGFyZ2V0LCBleHByX3R5IGl0ZXIsIGFzZGxfc2VxICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZzLCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIEV4Y2VwdEhhbmRsZXIoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkgX1B5X0V4Y2VwdEhhbmRsZXIoYTAsIGExLCBhMiwgYTMsIGE0LCBhNSkKK2V4Y2VwdGhhbmRsZXJfdHkgX1B5X0V4Y2VwdEhhbmRsZXIoZXhwcl90eSB0eXBlLCBleHByX3R5IG5hbWUsIGFzZGxfc2VxICogYm9keSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQsIFB5QXJlbmEgKmFyZW5hKTsKKyNkZWZpbmUgYXJndW1lbnRzKGEwLCBhMSwgYTIsIGEzLCBhNCkgX1B5X2FyZ3VtZW50cyhhMCwgYTEsIGEyLCBhMywgYTQpCithcmd1bWVudHNfdHkgX1B5X2FyZ3VtZW50cyhhc2RsX3NlcSAqIGFyZ3MsIGlkZW50aWZpZXIgdmFyYXJnLCBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrd2FyZywgYXNkbF9zZXEgKiBkZWZhdWx0cywgUHlBcmVuYSAqYXJlbmEpOworI2RlZmluZSBrZXl3b3JkKGEwLCBhMSwgYTIpIF9QeV9rZXl3b3JkKGEwLCBhMSwgYTIpCitrZXl3b3JkX3R5IF9QeV9rZXl3b3JkKGlkZW50aWZpZXIgYXJnLCBleHByX3R5IHZhbHVlLCBQeUFyZW5hICphcmVuYSk7CisjZGVmaW5lIGFsaWFzKGEwLCBhMSwgYTIpIF9QeV9hbGlhcyhhMCwgYTEsIGEyKQorYWxpYXNfdHkgX1B5X2FsaWFzKGlkZW50aWZpZXIgbmFtZSwgaWRlbnRpZmllciBhc25hbWUsIFB5QXJlbmEgKmFyZW5hKTsKKworUHlPYmplY3QqIFB5QVNUX21vZDJvYmoobW9kX3R5IHQpOworbW9kX3R5IFB5QVNUX29iajJtb2QoUHlPYmplY3QqIGFzdCwgUHlBcmVuYSogYXJlbmEsIGludCBtb2RlKTsKK2ludCBQeUFTVF9DaGVjayhQeU9iamVjdCogb2JqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L1B5dGhvbi5oIGIvaW5jbHVkZS9weXRob24yLjcvUHl0aG9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1NDEyYgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L1B5dGhvbi5oCkBAIC0wLDAgKzEsMTc4IEBACisjaWZuZGVmIFB5X1BZVEhPTl9ICisjZGVmaW5lIFB5X1BZVEhPTl9ICisvKiBTaW5jZSB0aGlzIGlzIGEgIm1ldGEtaW5jbHVkZSIgZmlsZSwgbm8gI2lmZGVmIF9fY3BsdXNwbHVzIC8gZXh0ZXJuICJDIiB7ICovCisKKy8qIEluY2x1ZGUgbmVhcmx5IGFsbCBQeXRob24gaGVhZGVyIGZpbGVzICovCisKKyNpbmNsdWRlICJwYXRjaGxldmVsLmgiCisjaW5jbHVkZSAicHljb25maWcuaCIKKyNpbmNsdWRlICJweW1hY2NvbmZpZy5oIgorCisvKiBDeWNsaWMgZ2MgaXMgYWx3YXlzIGVuYWJsZWQsIHN0YXJ0aW5nIHdpdGggcmVsZWFzZSAyLjNhMS4gIFN1cHBseSB0aGUKKyAqIG9sZCBzeW1ib2wgZm9yIHRoZSBiZW5lZml0IG9mIGV4dGVuc2lvbiBtb2R1bGVzIHdyaXR0ZW4gYmVmb3JlIHRoZW4KKyAqIHRoYXQgbWF5IGJlIGNvbmRpdGlvbmFsaXppbmcgb24gaXQuICBUaGUgY29yZSBkb2Vzbid0IHVzZSBpdCBhbnltb3JlLgorICovCisjaWZuZGVmIFdJVEhfQ1lDTEVfR0MKKyNkZWZpbmUgV0lUSF9DWUNMRV9HQyAxCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaWZuZGVmIFVDSEFSX01BWAorI2Vycm9yICJTb21ldGhpbmcncyBicm9rZW4uICBVQ0hBUl9NQVggc2hvdWxkIGJlIGRlZmluZWQgaW4gbGltaXRzLmguIgorI2VuZGlmCisKKyNpZiBVQ0hBUl9NQVggIT0gMjU1CisjZXJyb3IgIlB5dGhvbidzIHNvdXJjZSBjb2RlIGFzc3VtZXMgQydzIHVuc2lnbmVkIGNoYXIgaXMgYW4gOC1iaXQgdHlwZS4iCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19zZ2kpICYmIGRlZmluZWQoV0lUSF9USFJFQUQpICYmICFkZWZpbmVkKF9TR0lfTVBfU09VUkNFKQorI2RlZmluZSBfU0dJX01QX1NPVVJDRQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBOVUxMCisjICAgZXJyb3IgIlB5dGhvbi5oIHJlcXVpcmVzIHRoYXQgc3RkaW8uaCBkZWZpbmUgTlVMTC4iCisjZW5kaWYKKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2lmZGVmIEhBVkVfRVJSTk9fSAorI2luY2x1ZGUgPGVycm5vLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZmRlZiBIQVZFX1VOSVNURF9ICisjaW5jbHVkZSA8dW5pc3RkLmg+CisjZW5kaWYKKworLyogRm9yIHNpemVfdD8gKi8KKyNpZmRlZiBIQVZFX1NURERFRl9ICisjaW5jbHVkZSA8c3RkZGVmLmg+CisjZW5kaWYKKworLyogQ0FVVElPTjogIEJ1aWxkIHNldHVwcyBzaG91bGQgZW5zdXJlIHRoYXQgTkRFQlVHIGlzIGRlZmluZWQgb24gdGhlCisgKiBjb21waWxlciBjb21tYW5kIGxpbmUgd2hlbiBidWlsZGluZyBQeXRob24gaW4gcmVsZWFzZSBtb2RlOyBlbHNlCisgKiBhc3NlcnQoKSBjYWxscyB3b24ndCBiZSByZW1vdmVkLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJweXBvcnQuaCIKKworLyogcHljb25maWcuaCBvciBweXBvcnQuaCBtYXkgb3IgbWF5IG5vdCBkZWZpbmUgRExfSU1QT1JUICovCisjaWZuZGVmIERMX0lNUE9SVAkvKiBkZWNsYXJhdGlvbnMgZm9yIERMTCBpbXBvcnQvZXhwb3J0ICovCisjZGVmaW5lIERMX0lNUE9SVChSVFlQRSkgUlRZUEUKKyNlbmRpZgorI2lmbmRlZiBETF9FWFBPUlQJLyogZGVjbGFyYXRpb25zIGZvciBETEwgaW1wb3J0L2V4cG9ydCAqLworI2RlZmluZSBETF9FWFBPUlQoUlRZUEUpIFJUWVBFCisjZW5kaWYKKworLyogRGVidWctbW9kZSBidWlsZCB3aXRoIHB5bWFsbG9jIGltcGxpZXMgUFlNQUxMT0NfREVCVUcuCisgKiAgUFlNQUxMT0NfREVCVUcgaXMgaW4gZXJyb3IgaWYgcHltYWxsb2MgaXMgbm90IGluIHVzZS4KKyAqLworI2lmIGRlZmluZWQoUHlfREVCVUcpICYmIGRlZmluZWQoV0lUSF9QWU1BTExPQykgJiYgIWRlZmluZWQoUFlNQUxMT0NfREVCVUcpCisjZGVmaW5lIFBZTUFMTE9DX0RFQlVHCisjZW5kaWYKKyNpZiBkZWZpbmVkKFBZTUFMTE9DX0RFQlVHKSAmJiAhZGVmaW5lZChXSVRIX1BZTUFMTE9DKQorI2Vycm9yICJQWU1BTExPQ19ERUJVRyByZXF1aXJlcyBXSVRIX1BZTUFMTE9DIgorI2VuZGlmCisjaW5jbHVkZSAicHltYXRoLmgiCisjaW5jbHVkZSAicHltZW0uaCIKKworI2luY2x1ZGUgIm9iamVjdC5oIgorI2luY2x1ZGUgIm9iamltcGwuaCIKKworI2luY2x1ZGUgInB5ZGVidWcuaCIKKworI2luY2x1ZGUgInVuaWNvZGVvYmplY3QuaCIKKyNpbmNsdWRlICJpbnRvYmplY3QuaCIKKyNpbmNsdWRlICJib29sb2JqZWN0LmgiCisjaW5jbHVkZSAibG9uZ29iamVjdC5oIgorI2luY2x1ZGUgImZsb2F0b2JqZWN0LmgiCisjaWZuZGVmIFdJVEhPVVRfQ09NUExFWAorI2luY2x1ZGUgImNvbXBsZXhvYmplY3QuaCIKKyNlbmRpZgorI2luY2x1ZGUgInJhbmdlb2JqZWN0LmgiCisjaW5jbHVkZSAic3RyaW5nb2JqZWN0LmgiCisjaW5jbHVkZSAibWVtb3J5b2JqZWN0LmgiCisjaW5jbHVkZSAiYnVmZmVyb2JqZWN0LmgiCisjaW5jbHVkZSAiYnl0ZXNvYmplY3QuaCIKKyNpbmNsdWRlICJieXRlYXJyYXlvYmplY3QuaCIKKyNpbmNsdWRlICJ0dXBsZW9iamVjdC5oIgorI2luY2x1ZGUgImxpc3RvYmplY3QuaCIKKyNpbmNsdWRlICJkaWN0b2JqZWN0LmgiCisjaW5jbHVkZSAiZW51bW9iamVjdC5oIgorI2luY2x1ZGUgInNldG9iamVjdC5oIgorI2luY2x1ZGUgIm1ldGhvZG9iamVjdC5oIgorI2luY2x1ZGUgIm1vZHVsZW9iamVjdC5oIgorI2luY2x1ZGUgImZ1bmNvYmplY3QuaCIKKyNpbmNsdWRlICJjbGFzc29iamVjdC5oIgorI2luY2x1ZGUgImZpbGVvYmplY3QuaCIKKyNpbmNsdWRlICJjb2JqZWN0LmgiCisjaW5jbHVkZSAicHljYXBzdWxlLmgiCisjaW5jbHVkZSAidHJhY2ViYWNrLmgiCisjaW5jbHVkZSAic2xpY2VvYmplY3QuaCIKKyNpbmNsdWRlICJjZWxsb2JqZWN0LmgiCisjaW5jbHVkZSAiaXRlcm9iamVjdC5oIgorI2luY2x1ZGUgImdlbm9iamVjdC5oIgorI2luY2x1ZGUgImRlc2Nyb2JqZWN0LmgiCisjaW5jbHVkZSAid2FybmluZ3MuaCIKKyNpbmNsdWRlICJ3ZWFrcmVmb2JqZWN0LmgiCisKKyNpbmNsdWRlICJjb2RlY3MuaCIKKyNpbmNsdWRlICJweWVycm9ycy5oIgorCisjaW5jbHVkZSAicHlzdGF0ZS5oIgorCisjaW5jbHVkZSAicHlhcmVuYS5oIgorI2luY2x1ZGUgIm1vZHN1cHBvcnQuaCIKKyNpbmNsdWRlICJweXRob25ydW4uaCIKKyNpbmNsdWRlICJjZXZhbC5oIgorI2luY2x1ZGUgInN5c21vZHVsZS5oIgorI2luY2x1ZGUgImludHJjaGVjay5oIgorI2luY2x1ZGUgImltcG9ydC5oIgorCisjaW5jbHVkZSAiYWJzdHJhY3QuaCIKKworI2luY2x1ZGUgImNvbXBpbGUuaCIKKyNpbmNsdWRlICJldmFsLmgiCisKKyNpbmNsdWRlICJweWN0eXBlLmgiCisjaW5jbHVkZSAicHlzdHJ0b2QuaCIKKyNpbmNsdWRlICJweXN0cmNtcC5oIgorI2luY2x1ZGUgImR0b2EuaCIKKworLyogX1B5X01hbmdsZSBpcyBkZWZpbmVkIGluIGNvbXBpbGUuYyAqLworUHlBUElfRlVOQyhQeU9iamVjdCopIF9QeV9NYW5nbGUoUHlPYmplY3QgKnAsIFB5T2JqZWN0ICpuYW1lKTsKKworLyogUHlBcmdfR2V0SW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZCwgdXNlIFB5QXJnX1BhcnNlKCkuICovCisjZGVmaW5lIFB5QXJnX0dldEludCh2LCBhKQlQeUFyZ19QYXJzZSgodiksICJpIiwgKGEpKQorCisvKiBQeUFyZ19Ob0FyZ3Mgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkuCisgICBTZXQgbWxfZmxhZ3MgaW4gdGhlIFB5TWV0aG9kRGVmIHRvIE1FVEhfTk9BUkdTLiAqLworI2RlZmluZSBQeUFyZ19Ob0FyZ3ModikJCVB5QXJnX1BhcnNlKHYsICIiKQorCisvKiBBcmd1bWVudCBtdXN0IGJlIGEgY2hhciBvciBhbiBpbnQgaW4gWy0xMjgsIDEyN10gb3IgWzAsIDI1NV0uICovCisjZGVmaW5lIFB5X0NIQVJNQVNLKGMpCQkoKHVuc2lnbmVkIGNoYXIpKChjKSAmIDB4ZmYpKQorCisjaW5jbHVkZSAicHlmcGUuaCIKKworLyogVGhlc2UgZGVmaW5pdGlvbnMgbXVzdCBtYXRjaCBjb3JyZXNwb25kaW5nIGRlZmluaXRpb25zIGluIGdyYW1pbml0LmguCisgICBUaGVyZSdzIGNvZGUgaW4gY29tcGlsZS5jIHRoYXQgY2hlY2tzIHRoYXQgdGhleSBhcmUgdGhlIHNhbWUuICovCisjZGVmaW5lIFB5X3NpbmdsZV9pbnB1dCAyNTYKKyNkZWZpbmUgUHlfZmlsZV9pbnB1dCAyNTcKKyNkZWZpbmUgUHlfZXZhbF9pbnB1dCAyNTgKKworI2lmZGVmIEhBVkVfUFRICisvKiBHTlUgcHRoIHVzZXItc3BhY2UgdGhyZWFkIHN1cHBvcnQgKi8KKyNpbmNsdWRlIDxwdGguaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgbWFjcm9zIGZvciBpbmxpbmUgZG9jdW1lbnRhdGlvbi4gKi8KKyNkZWZpbmUgUHlEb2NfVkFSKG5hbWUpIHN0YXRpYyBjaGFyIG5hbWVbXQorI2RlZmluZSBQeURvY19TVFJWQVIobmFtZSxzdHIpIFB5RG9jX1ZBUihuYW1lKSA9IFB5RG9jX1NUUihzdHIpCisjaWZkZWYgV0lUSF9ET0NfU1RSSU5HUworI2RlZmluZSBQeURvY19TVFIoc3RyKSBzdHIKKyNlbHNlCisjZGVmaW5lIFB5RG9jX1NUUihzdHIpICIiCisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9QWVRIT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvYWJzdHJhY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2Fic3RyYWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM3NzQyMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2Fic3RyYWN0LmgKQEAgLTAsMCArMSwxMzk2IEBACisjaWZuZGVmIFB5X0FCU1RSQUNUT0JKRUNUX0gKKyNkZWZpbmUgUHlfQUJTVFJBQ1RPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZkZWYgUFlfU1NJWkVfVF9DTEVBTgorI2RlZmluZSBQeU9iamVjdF9DYWxsRnVuY3Rpb24gX1B5T2JqZWN0X0NhbGxGdW5jdGlvbl9TaXplVAorI2RlZmluZSBQeU9iamVjdF9DYWxsTWV0aG9kIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUCisjZW5kaWYKKworLyogQWJzdHJhY3QgT2JqZWN0IEludGVyZmFjZSAobWFueSB0aGFua3MgdG8gSmltIEZ1bHRvbikgKi8KKworLyoKKyAgIFBST1BPU0FMOiBBIEdlbmVyaWMgUHl0aG9uIE9iamVjdCBJbnRlcmZhY2UgZm9yIFB5dGhvbiBDIE1vZHVsZXMKKworUHJvYmxlbQorCisgIFB5dGhvbiBtb2R1bGVzIHdyaXR0ZW4gaW4gQyB0aGF0IG11c3QgYWNjZXNzIFB5dGhvbiBvYmplY3RzIG11c3QgZG8KKyAgc28gdGhyb3VnaCByb3V0aW5lcyB3aG9zZSBpbnRlcmZhY2VzIGFyZSBkZXNjcmliZWQgYnkgYSBzZXQgb2YKKyAgaW5jbHVkZSBmaWxlcy4gIFVuZm9ydHVuYXRlbHksIHRoZXNlIHJvdXRpbmVzIHZhcnkgYWNjb3JkaW5nIHRvIHRoZQorICBvYmplY3QgYWNjZXNzZWQuICBUbyB1c2UgdGhlc2Ugcm91dGluZXMsIHRoZSBDIHByb2dyYW1tZXIgbXVzdCBjaGVjaworICB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIHVzZWQgYW5kIG11c3QgY2FsbCBhIHJvdXRpbmUgYmFzZWQgb24KKyAgdGhlIG9iamVjdCB0eXBlLiAgRm9yIGV4YW1wbGUsIHRvIGFjY2VzcyBhbiBlbGVtZW50IG9mIGEgc2VxdWVuY2UsCisgIHRoZSBwcm9ncmFtbWVyIG11c3QgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNlcXVlbmNlIGlzIGEgbGlzdCBvciBhCisgIHR1cGxlOgorCisgICAgaWYoaXNfdHVwbGVvYmplY3QobykpCisgICAgICBlPWdldHR1cGxlaXRlbShvLGkpCisgICAgZWxzZSBpZihpc19saXN0aXRlbShvKSkKKyAgICAgIGU9Z2V0bGlzdGl0ZW0obyxpKQorCisgIElmIHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdldCBhbiBpdGVtIGZyb20gYW5vdGhlciB0eXBlIG9mIG9iamVjdAorICB0aGF0IHByb3ZpZGVzIHNlcXVlbmNlIGJlaGF2aW9yLCB0aGVyZSBpcyBubyBjbGVhciB3YXkgdG8gZG8gaXQKKyAgY29ycmVjdGx5LgorCisgIFRoZSBwZXJzaXN0ZW50IHByb2dyYW1tZXIgbWF5IHBlcnVzZSBvYmplY3QuaCBhbmQgZmluZCB0aGF0IHRoZQorICBfdHlwZW9iamVjdCBzdHJ1Y3R1cmUgcHJvdmlkZXMgYSBtZWFucyBvZiBpbnZva2luZyB1cCB0byAoY3VycmVudGx5CisgIGFib3V0KSA0MSBzcGVjaWFsIG9wZXJhdG9ycy4gIFNvLCBmb3IgZXhhbXBsZSwgYSByb3V0aW5lIGNhbiBnZXQgYW4KKyAgaXRlbSBmcm9tIGFueSBvYmplY3QgdGhhdCBwcm92aWRlcyBzZXF1ZW5jZSBiZWhhdmlvci4gSG93ZXZlciwgdG8KKyAgdXNlIHRoaXMgbWVjaGFuaXNtLCB0aGUgcHJvZ3JhbW1lciBtdXN0IG1ha2UgdGhlaXIgY29kZSBkZXBlbmRlbnQgb24KKyAgdGhlIGN1cnJlbnQgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorCisgIEFsc28sIGNlcnRhaW4gc2VtYW50aWNzLCBlc3BlY2lhbGx5IG1lbW9yeSBtYW5hZ2VtZW50IHNlbWFudGljcywgbWF5CisgIGRpZmZlciBieSB0aGUgdHlwZSBvZiBvYmplY3QgYmVpbmcgdXNlZC4gIFVuZm9ydHVuYXRlbHksIHRoZXNlCisgIHNlbWFudGljcyBhcmUgbm90IGNsZWFybHkgZGVzY3JpYmVkIGluIHRoZSBjdXJyZW50IGluY2x1ZGUgZmlsZXMuCisgIEFuIGFic3RyYWN0IGludGVyZmFjZSBwcm92aWRpbmcgbW9yZSBjb25zaXN0ZW50IHNlbWFudGljcyBpcyBuZWVkZWQuCisKK1Byb3Bvc2FsCisKKyAgSSBwcm9wb3NlIHRoZSBjcmVhdGlvbiBvZiBhIHN0YW5kYXJkIGludGVyZmFjZSAod2l0aCBhbiBhc3NvY2lhdGVkCisgIGxpYnJhcnkgb2Ygcm91dGluZXMgYW5kL29yIG1hY3JvcykgZm9yIGdlbmVyaWNhbGx5IG9idGFpbmluZyB0aGUKKyAgc2VydmljZXMgb2YgUHl0aG9uIG9iamVjdHMuICBUaGlzIHByb3Bvc2FsIGNhbiBiZSB2aWV3ZWQgYXMgb25lCisgIGNvbXBvbmVudHMgb2YgYSBQeXRob24gQyBpbnRlcmZhY2UgY29uc2lzdGluZyBvZiBzZXZlcmFsIGNvbXBvbmVudHMuCisKKyAgRnJvbSB0aGUgdmlld3BvaW50IG9mIEMgYWNjZXNzIHRvIFB5dGhvbiBzZXJ2aWNlcywgd2UgaGF2ZSAoYXMKKyAgc3VnZ2VzdGVkIGJ5IEd1aWRvIGluIG9mZi1saW5lIGRpc2N1c3Npb25zKToKKworICAtICJWZXJ5IGhpZ2ggbGV2ZWwgbGF5ZXIiOiB0d28gb3IgdGhyZWUgZnVuY3Rpb25zIHRoYXQgbGV0IHlvdSBleGVjIG9yCisgICAgZXZhbCBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgZ2l2ZW4gYXMgYSBzdHJpbmcgaW4gYSBtb2R1bGUgd2hvc2UgbmFtZSBpcworICAgIGdpdmVuLCBwYXNzaW5nIEMgdmFsdWVzIGluIGFuZCBnZXR0aW5nIEMgdmFsdWVzIG91dCB1c2luZworICAgIG1rdmFsdWUvZ2V0YXJncyBzdHlsZSBmb3JtYXQgc3RyaW5ncy4gIFRoaXMgZG9lcyBub3QgcmVxdWlyZSB0aGUgdXNlcgorICAgIHRvIGRlY2xhcmUgYW55IHZhcmlhYmxlcyBvZiB0eXBlICJQeU9iamVjdCAqIi4gIFRoaXMgc2hvdWxkIGJlIGVub3VnaAorICAgIHRvIHdyaXRlIGEgc2ltcGxlIGFwcGxpY2F0aW9uIHRoYXQgZ2V0cyBQeXRob24gY29kZSBmcm9tIHRoZSB1c2VyLAorICAgIGV4ZWNzIGl0LCBhbmQgcmV0dXJucyB0aGUgb3V0cHV0IG9yIGVycm9ycy4gIChFcnJvciBoYW5kbGluZyBtdXN0IGFsc28KKyAgICBiZSBwYXJ0IG9mIHRoaXMgQVBJLikKKworICAtICJBYnN0cmFjdCBvYmplY3RzIGxheWVyIjogd2hpY2ggaXMgdGhlIHN1YmplY3Qgb2YgdGhpcyBwcm9wb3NhbC4KKyAgICBJdCBoYXMgbWFueSBmdW5jdGlvbnMgb3BlcmF0aW5nIG9uIG9iamVjdHMsIGFuZCBsZXN0IHlvdSBkbyBtYW55CisgICAgdGhpbmdzIGZyb20gQyB0aGF0IHlvdSBjYW4gYWxzbyB3cml0ZSBpbiBQeXRob24sIHdpdGhvdXQgZ29pbmcKKyAgICB0aHJvdWdoIHRoZSBQeXRob24gcGFyc2VyLgorCisgIC0gIkNvbmNyZXRlIG9iamVjdHMgbGF5ZXIiOiBUaGlzIGlzIHRoZSBwdWJsaWMgdHlwZS1kZXBlbmRlbnQKKyAgICBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlIHN0YW5kYXJkIGJ1aWx0LWluIHR5cGVzLCBzdWNoIGFzIGZsb2F0cywKKyAgICBzdHJpbmdzLCBhbmQgbGlzdHMuICBUaGlzIGludGVyZmFjZSBleGlzdHMgYW5kIGlzIGN1cnJlbnRseQorICAgIGRvY3VtZW50ZWQgYnkgdGhlIGNvbGxlY3Rpb24gb2YgaW5jbHVkZSBmaWxlcyBwcm92aWRlZCB3aXRoIHRoZQorICAgIFB5dGhvbiBkaXN0cmlidXRpb25zLgorCisgIEZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgUHl0aG9uIGFjY2Vzc2luZyBzZXJ2aWNlcyBwcm92aWRlZCBieSBDCisgIG1vZHVsZXM6CisKKyAgLSAiUHl0aG9uIG1vZHVsZSBpbnRlcmZhY2UiOiB0aGlzIGludGVyZmFjZSBjb25zaXN0IG9mIHRoZSBiYXNpYworICAgIHJvdXRpbmVzIHVzZWQgdG8gZGVmaW5lIG1vZHVsZXMgYW5kIHRoZWlyIG1lbWJlcnMuICBNb3N0IG9mIHRoZQorICAgIGN1cnJlbnQgZXh0ZW5zaW9ucy13cml0aW5nIGd1aWRlIGRlYWxzIHdpdGggdGhpcyBpbnRlcmZhY2UuCisKKyAgLSAiQnVpbHQtaW4gb2JqZWN0IGludGVyZmFjZSI6IHRoaXMgaXMgdGhlIGludGVyZmFjZSB0aGF0IGEgbmV3CisgICAgYnVpbHQtaW4gdHlwZSBtdXN0IHByb3ZpZGUgYW5kIHRoZSBtZWNoYW5pc21zIGFuZCBydWxlcyB0aGF0IGEKKyAgICBkZXZlbG9wZXIgb2YgYSBuZXcgYnVpbHQtaW4gdHlwZSBtdXN0IHVzZSBhbmQgZm9sbG93LgorCisgIFRoaXMgcHJvcG9zYWwgaXMgYSAiZmlyc3QtY3V0IiB0aGF0IGlzIGludGVuZGVkIHRvIHNwdXIKKyAgZGlzY3Vzc2lvbi4gU2VlIGVzcGVjaWFsbHkgdGhlIGxpc3RzIG9mIG5vdGVzLgorCisgIFRoZSBQeXRob24gQyBvYmplY3QgaW50ZXJmYWNlIHdpbGwgcHJvdmlkZSBmb3VyIHByb3RvY29sczogb2JqZWN0LAorICBudW1lcmljLCBzZXF1ZW5jZSwgYW5kIG1hcHBpbmcuICBFYWNoIHByb3RvY29sIGNvbnNpc3RzIG9mIGEKKyAgY29sbGVjdGlvbiBvZiByZWxhdGVkIG9wZXJhdGlvbnMuICBJZiBhbiBvcGVyYXRpb24gdGhhdCBpcyBub3QKKyAgcHJvdmlkZWQgYnkgYSBwYXJ0aWN1bGFyIHR5cGUgaXMgaW52b2tlZCwgdGhlbiBhIHN0YW5kYXJkIGV4Y2VwdGlvbiwKKyAgTm90SW1wbGVtZW50ZWRFcnJvciBpcyByYWlzZWQgd2l0aCBhIG9wZXJhdGlvbiBuYW1lIGFzIGFuIGFyZ3VtZW50LgorICBJbiBhZGRpdGlvbiwgZm9yIGNvbnZlbmllbmNlIHRoaXMgaW50ZXJmYWNlIGRlZmluZXMgYSBzZXQgb2YKKyAgY29uc3RydWN0b3JzIGZvciBidWlsZGluZyBvYmplY3RzIG9mIGJ1aWx0LWluIHR5cGVzLiAgVGhpcyBpcyBuZWVkZWQKKyAgc28gbmV3IG9iamVjdHMgY2FuIGJlIHJldHVybmVkIGZyb20gQyBmdW5jdGlvbnMgdGhhdCBvdGhlcndpc2UgdHJlYXQKKyAgb2JqZWN0cyBnZW5lcmljYWxseS4KKworTWVtb3J5IE1hbmFnZW1lbnQKKworICBGb3IgYWxsIG9mIHRoZSBmdW5jdGlvbnMgZGVzY3JpYmVkIGluIHRoaXMgcHJvcG9zYWwsIGlmIGEgZnVuY3Rpb24KKyAgcmV0YWlucyBhIHJlZmVyZW5jZSB0byBhIFB5dGhvbiBvYmplY3QgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LCB0aGVuIHRoZQorICBmdW5jdGlvbiB3aWxsIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9iamVjdC4gIEl0IGlzCisgIHVubmVjZXNzYXJ5IGZvciB0aGUgY2FsbGVyIHRvIGluY3JlYXNlIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYW4KKyAgYXJndW1lbnQgaW4gYW50aWNpcGF0aW9uIG9mIHRoZSBvYmplY3QncyByZXRlbnRpb24uCisKKyAgQWxsIFB5dGhvbiBvYmplY3RzIHJldHVybmVkIGZyb20gZnVuY3Rpb25zIHNob3VsZCBiZSB0cmVhdGVkIGFzIG5ldworICBvYmplY3RzLiAgRnVuY3Rpb25zIHRoYXQgcmV0dXJuIG9iamVjdHMgYXNzdW1lIHRoYXQgdGhlIGNhbGxlciB3aWxsCisgIHJldGFpbiBhIHJlZmVyZW5jZSBhbmQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgb2JqZWN0IGhhcyBhbHJlYWR5CisgIGJlZW4gaW5jcmVtZW50ZWQgdG8gYWNjb3VudCBmb3IgdGhpcyBmYWN0LiAgQSBjYWxsZXIgdGhhdCBkb2VzIG5vdAorICByZXRhaW4gYSByZWZlcmVuY2UgdG8gYW4gb2JqZWN0IHRoYXQgaXMgcmV0dXJuZWQgZnJvbSBhIGZ1bmN0aW9uCisgIG11c3QgZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIG9iamVjdCAodXNpbmcKKyAgREVDUkVGKG9iamVjdCkpIHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzLgorCisgIE5vdGUgdGhhdCB0aGUgYmVoYXZpb3IgbWVudGlvbmVkIGhlcmUgaXMgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQKKyAgYmVoYXZpb3IgZm9yIHNvbWUgb2JqZWN0cyAoZS5nLiBsaXN0cyBhbmQgdHVwbGVzKSB3aGVuIGNlcnRhaW4KKyAgdHlwZS1zcGVjaWZpYyByb3V0aW5lcyBhcmUgY2FsbGVkIGRpcmVjdGx5IChlLmcuIHNldGxpc3RpdGVtKS4gIFRoZQorICBwcm9wb3NlZCBhYnN0cmFjdGlvbiBsYXllciB3aWxsIHByb3ZpZGUgYSBjb25zaXN0ZW50IG1lbW9yeQorICBtYW5hZ2VtZW50IGludGVyZmFjZSwgY29ycmVjdGluZyBmb3IgaW5jb25zaXN0ZW50IGJlaGF2aW9yIGZvciBzb21lCisgIGJ1aWx0LWluIHR5cGVzLgorCitQcm90b2NvbHMKKworeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4Ki8KKworLyogIE9iamVjdCBQcm90b2NvbDogKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgaW50IFB5T2JqZWN0X1ByaW50KFB5T2JqZWN0ICpvLCBGSUxFICpmcCwgaW50IGZsYWdzKTsKKworICAgICBQcmludCBhbiBvYmplY3QsIG8sIG9uIGZpbGUsIGZwLiAgUmV0dXJucyAtMSBvbgorICAgICBlcnJvci4gIFRoZSBmbGFncyBhcmd1bWVudCBpcyB1c2VkIHRvIGVuYWJsZSBjZXJ0YWluIHByaW50aW5nCisgICAgIG9wdGlvbnMuIFRoZSBvbmx5IG9wdGlvbiBjdXJyZW50bHkgc3VwcG9ydGVkIGlzIFB5X1ByaW50X1JBVy4KKworICAgICAoV2hhdCBzaG91bGQgYmUgc2FpZCBhYm91dCBQeV9QcmludF9SQVc/KQorCisgICAgICAgKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgaW50IFB5T2JqZWN0X0hhc0F0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmF0dHJfbmFtZSk7CisKKyAgICAgUmV0dXJucyAxIGlmIG8gaGFzIHRoZSBhdHRyaWJ1dGUgYXR0cl9uYW1lLCBhbmQgMCBvdGhlcndpc2UuCisgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIGhhc2F0dHIobyxhdHRyX25hbWUpLgorCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorCisgICAgICAgKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgUHlPYmplY3QqIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmF0dHJfbmFtZSk7CisKKyAgICAgUmV0cmlldmUgYW4gYXR0cmlidXRlZCBuYW1lZCBhdHRyX25hbWUgZm9ybSBvYmplY3Qgby4KKyAgICAgUmV0dXJucyB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8uYXR0cl9uYW1lLgorCisgICAgICAgKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgaW50IFB5T2JqZWN0X0hhc0F0dHIoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICphdHRyX25hbWUpOworCisgICAgIFJldHVybnMgMSBpZiBvIGhhcyB0aGUgYXR0cmlidXRlIGF0dHJfbmFtZSwgYW5kIDAgb3RoZXJ3aXNlLgorICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBoYXNhdHRyKG8sYXR0cl9uYW1lKS4KKworICAgICBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzdWNjZWVkcy4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIFB5T2JqZWN0KiBQeU9iamVjdF9HZXRBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKKworICAgICBSZXRyaWV2ZSBhbiBhdHRyaWJ1dGVkIG5hbWVkIGF0dHJfbmFtZSBmb3JtIG9iamVjdCBvLgorICAgICBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgdmFsdWUgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogby5hdHRyX25hbWUuCisKKyAgICAgICAqLworCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIGludCBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICphdHRyX25hbWUsIFB5T2JqZWN0ICp2KTsKKworICAgICBTZXQgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYXR0cl9uYW1lLCBmb3Igb2JqZWN0IG8sCisgICAgIHRvIHRoZSB2YWx1ZSwgdi4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogby5hdHRyX25hbWU9di4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIGludCBQeU9iamVjdF9TZXRBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lLCBQeU9iamVjdCAqdik7CisKKyAgICAgU2V0IHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLAorICAgICB0byB0aGUgdmFsdWUsIHYuIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IG8uYXR0cl9uYW1lPXYuCisKKyAgICAgICAqLworCisgICAgIC8qIGltcGxlbWVudGVkIGFzIGEgbWFjcm86CisKKyAgICAgaW50IFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmF0dHJfbmFtZSk7CisKKyAgICAgRGVsZXRlIGF0dHJpYnV0ZSBuYW1lZCBhdHRyX25hbWUsIGZvciBvYmplY3Qgby4gUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG8uYXR0cl9uYW1lLgorCisgICAgICAgKi8KKyNkZWZpbmUgIFB5T2JqZWN0X0RlbEF0dHJTdHJpbmcoTyxBKSBQeU9iamVjdF9TZXRBdHRyU3RyaW5nKChPKSwoQSksTlVMTCkKKworICAgICAvKiBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvOgorCisgICAgIGludCBQeU9iamVjdF9EZWxBdHRyKFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqYXR0cl9uYW1lKTsKKworICAgICBEZWxldGUgYXR0cmlidXRlIG5hbWVkIGF0dHJfbmFtZSwgZm9yIG9iamVjdCBvLiBSZXR1cm5zIC0xCisgICAgIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50OiBkZWwgby5hdHRyX25hbWUuCisKKyAgICAgICAqLworI2RlZmluZSAgUHlPYmplY3RfRGVsQXR0cihPLEEpIFB5T2JqZWN0X1NldEF0dHIoKE8pLChBKSxOVUxMKQorCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9DbXAoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIsIGludCAqcmVzdWx0KTsKKworICAgICAgIC8qCisgICAgIENvbXBhcmUgdGhlIHZhbHVlcyBvZiBvMSBhbmQgbzIgdXNpbmcgYSByb3V0aW5lIHByb3ZpZGVkIGJ5CisgICAgIG8xLCBpZiBvbmUgZXhpc3RzLCBvdGhlcndpc2Ugd2l0aCBhIHJvdXRpbmUgcHJvdmlkZWQgYnkgbzIuCisgICAgIFRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24gaXMgcmV0dXJuZWQgaW4gcmVzdWx0LiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogcmVzdWx0PWNtcChvMSxvMikuCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBpbnQgUHlPYmplY3RfQ29tcGFyZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgQ29tcGFyZSB0aGUgdmFsdWVzIG9mIG8xIGFuZCBvMiB1c2luZyBhIHJvdXRpbmUgcHJvdmlkZWQgYnkKKyAgICAgbzEsIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSB3aXRoIGEgcm91dGluZSBwcm92aWRlZCBieSBvMi4KKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIG9uIHN1Y2Nlc3MuICBPbiBlcnJvciwKKyAgICAgdGhlIHZhbHVlIHJldHVybmVkIGlzIHVuZGVmaW5lZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogY21wKG8xLG8yKS4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIFB5T2JqZWN0ICpQeU9iamVjdF9SZXByKFB5T2JqZWN0ICpvKTsKKworICAgICBDb21wdXRlIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2Ygb2JqZWN0LCBvLiAgUmV0dXJucyB0aGUKKyAgICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9uIHN1Y2Nlc3MsIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiByZXByKG8pLgorCisgICAgIENhbGxlZCBieSB0aGUgcmVwcigpIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSByZXZlcnNlIHF1b3Rlcy4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIFB5T2JqZWN0ICpQeU9iamVjdF9TdHIoUHlPYmplY3QgKm8pOworCisgICAgIENvbXB1dGUgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBvYmplY3QsIG8uICBSZXR1cm5zIHRoZQorICAgICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHN0cihvKS4pCisKKyAgICAgQ2FsbGVkIGJ5IHRoZSBzdHIoKSBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgdGhlIHByaW50CisgICAgIHN0YXRlbWVudC4KKworICAgICAgICovCisKKyAgICAgLyogSW1wbGVtZW50ZWQgZWxzZXdoZXJlOgorCisgICAgIFB5T2JqZWN0ICpQeU9iamVjdF9Vbmljb2RlKFB5T2JqZWN0ICpvKTsKKworICAgICBDb21wdXRlIHRoZSB1bmljb2RlIHJlcHJlc2VudGF0aW9uIG9mIG9iamVjdCwgby4gIFJldHVybnMgdGhlCisgICAgIHVuaWNvZGUgcmVwcmVzZW50YXRpb24gb24gc3VjY2VzcywgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IHVuaXN0cihvKS4pCisKKyAgICAgQ2FsbGVkIGJ5IHRoZSB1bmlzdHIoKSBidWlsdC1pbiBmdW5jdGlvbi4KKworICAgICAgICovCisKKyAgICAgICAvKiBEZWNsYXJlZCBlbHNld2hlcmUKKworICAgICBQeUFQSV9GVU5DKGludCkgUHlDYWxsYWJsZV9DaGVjayhQeU9iamVjdCAqbyk7CisKKyAgICAgRGV0ZXJtaW5lIGlmIHRoZSBvYmplY3QsIG8sIGlzIGNhbGxhYmxlLiAgUmV0dXJuIDEgaWYgdGhlCisgICAgIG9iamVjdCBpcyBjYWxsYWJsZSBhbmQgMCBvdGhlcndpc2UuCisKKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisKKyAgICAgICAqLworCisKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0NhbGwoUHlPYmplY3QgKmNhbGxhYmxlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmFyZ3MsIFB5T2JqZWN0ICprdyk7CisKKyAgICAgICAvKgorICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoCisgICAgIGFyZ3VtZW50cyBhbmQga2V5d29yZHMgYXJndW1lbnRzLiAgVGhlICdhcmdzJyBhcmd1bWVudCBjYW4gbm90IGJlCisgICAgIE5VTEwsIGJ1dCB0aGUgJ2t3JyBhcmd1bWVudCBjYW4gYmUgTlVMTC4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9DYWxsT2JqZWN0KFB5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICphcmdzKTsKKworICAgICAgIC8qCisgICAgIENhbGwgYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0LCBjYWxsYWJsZV9vYmplY3QsIHdpdGgKKyAgICAgYXJndW1lbnRzIGdpdmVuIGJ5IHRoZSB0dXBsZSwgYXJncy4gIElmIG5vIGFyZ3VtZW50cyBhcmUKKyAgICAgbmVlZGVkLCB0aGVuIGFyZ3MgbWF5IGJlIE5VTEwuICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlCisgICAgIGNhbGwgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudAorICAgICBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGFwcGx5KG8sYXJncykuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKFB5T2JqZWN0ICpjYWxsYWJsZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0LCAuLi4pOworCisgICAgICAgLyoKKyAgICAgQ2FsbCBhIGNhbGxhYmxlIFB5dGhvbiBvYmplY3QsIGNhbGxhYmxlX29iamVjdCwgd2l0aCBhCisgICAgIHZhcmlhYmxlIG51bWJlciBvZiBDIGFyZ3VtZW50cy4gVGhlIEMgYXJndW1lbnRzIGFyZSBkZXNjcmliZWQKKyAgICAgdXNpbmcgYSBta3ZhbHVlLXN0eWxlIGZvcm1hdCBzdHJpbmcuIFRoZSBmb3JtYXQgbWF5IGJlIE5VTEwsCisgICAgIGluZGljYXRpbmcgdGhhdCBubyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLiAgUmV0dXJucyB0aGUKKyAgICAgcmVzdWx0IG9mIHRoZSBjYWxsIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMKKyAgICAgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiBhcHBseShvLGFyZ3MpLgorCisgICAgICAgKi8KKworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfQ2FsbE1ldGhvZChQeU9iamVjdCAqbywgY2hhciAqbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0LCAuLi4pOworCisgICAgICAgLyoKKyAgICAgQ2FsbCB0aGUgbWV0aG9kIG5hbWVkIG0gb2Ygb2JqZWN0IG8gd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZgorICAgICBDIGFyZ3VtZW50cy4gIFRoZSBDIGFyZ3VtZW50cyBhcmUgZGVzY3JpYmVkIGJ5IGEgbWt2YWx1ZQorICAgICBmb3JtYXQgc3RyaW5nLiAgVGhlIGZvcm1hdCBtYXkgYmUgTlVMTCwgaW5kaWNhdGluZyB0aGF0IG5vCisgICAgIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQuIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBvbgorICAgICBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogby5tZXRob2QoYXJncykuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQoUHlPYmplY3QgKmNhbGxhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0LCAuLi4pOworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9DYWxsTWV0aG9kX1NpemVUKFB5T2JqZWN0ICpvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0LCAuLi4pOworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyhQeU9iamVjdCAqY2FsbGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLik7CisKKyAgICAgICAvKgorICAgICBDYWxsIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCwgY2FsbGFibGVfb2JqZWN0LCB3aXRoIGEKKyAgICAgdmFyaWFibGUgbnVtYmVyIG9mIEMgYXJndW1lbnRzLiAgVGhlIEMgYXJndW1lbnRzIGFyZSBwcm92aWRlZAorICAgICBhcyBQeU9iamVjdCAqIHZhbHVlcywgdGVybWluYXRlZCBieSBhIE5VTEwuICBSZXR1cm5zIHRoZQorICAgICByZXN1bHQgb2YgdGhlIGNhbGwgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGFwcGx5KG8sYXJncykuCisgICAgICAgKi8KKworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoUHlPYmplY3QgKm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbSwgLi4uKTsKKworICAgICAgIC8qCisgICAgIENhbGwgdGhlIG1ldGhvZCBuYW1lZCBtIG9mIG9iamVjdCBvIHdpdGggYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgICAgQyBhcmd1bWVudHMuICBUaGUgQyBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGFzIFB5T2JqZWN0ICoKKyAgICAgdmFsdWVzLCB0ZXJtaW5hdGVkIGJ5IE5VTEwuICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNhbGwKKyAgICAgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZgorICAgICB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8ubWV0aG9kKGFyZ3MpLgorICAgICAgICovCisKKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgbG9uZyBQeU9iamVjdF9IYXNoKFB5T2JqZWN0ICpvKTsKKworICAgICBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGhhc2gsIGhhc2hfdmFsdWUsIG9mIGFuIG9iamVjdCwgby4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiAtMS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBoYXNoKG8pLgorCisgICAgICAgKi8KKworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBpbnQgUHlPYmplY3RfSXNUcnVlKFB5T2JqZWN0ICpvKTsKKworICAgICBSZXR1cm5zIDEgaWYgdGhlIG9iamVjdCwgbywgaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlLCAwIGlmIG8gaXMKKyAgICAgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBhbmQgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogbm90IG5vdCBvCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGVsc2V3aGVyZToKKworICAgICBpbnQgUHlPYmplY3RfTm90KFB5T2JqZWN0ICpvKTsKKworICAgICBSZXR1cm5zIDAgaWYgdGhlIG9iamVjdCwgbywgaXMgY29uc2lkZXJlZCB0byBiZSB0cnVlLCAxIGlmIG8gaXMKKyAgICAgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBhbmQgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZQorICAgICBQeXRob24gZXhwcmVzc2lvbjogbm90IG8KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9UeXBlKFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSB0eXBlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QKKyAgICAgdHlwZSBvZiBvYmplY3Qgby4gT24gZmFpbHVyZSwgcmV0dXJucyBOVUxMLiAgVGhpcyBpcworICAgICBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdHlwZShvKS4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlPYmplY3RfU2l6ZShQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygb2JqZWN0IG8uICBJZiB0aGUgb2JqZWN0LCBvLCBwcm92aWRlcworICAgICBib3RoIHNlcXVlbmNlIGFuZCBtYXBwaW5nIHByb3RvY29scywgdGhlIHNlcXVlbmNlIHNpemUgaXMKKyAgICAgcmV0dXJuZWQuIE9uIGVycm9yLCAtMSBpcyByZXR1cm5lZC4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQKKyAgICAgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsZW4obykuCisKKyAgICAgICAqLworCisgICAgICAgLyogRm9yIERMTCBjb21wYXRpYmlsaXR5ICovCisjdW5kZWYgUHlPYmplY3RfTGVuZ3RoCisgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlPYmplY3RfTGVuZ3RoKFB5T2JqZWN0ICpvKTsKKyNkZWZpbmUgUHlPYmplY3RfTGVuZ3RoIFB5T2JqZWN0X1NpemUKKworICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeU9iamVjdF9MZW5ndGhIaW50KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90KTsKKworICAgICAgIC8qCisgICAgIEd1ZXNzIHRoZSBzaXplIG9mIG9iamVjdCBvIHVzaW5nIGxlbihvKSBvciBvLl9fbGVuZ3RoX2hpbnRfXygpLgorICAgICBJZiBuZWl0aGVyIG9mIHRob3NlIHJldHVybiBhIG5vbi1uZWdhdGl2ZSB2YWx1ZSwgdGhlbiByZXR1cm4gdGhlCisgICAgIGRlZmF1bHQgdmFsdWUuICBJZiBvbmUgb2YgdGhlIGNhbGxzIGZhaWxzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgLTEuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0dldEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIGVsZW1lbnQgb2YgbyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QsIGtleSwgb3IgTlVMTAorICAgICBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgb1trZXldLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfU2V0SXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKnYpOworCisgICAgICAgLyoKKyAgICAgTWFwIHRoZSBvYmplY3QsIGtleSwgdG8gdGhlIHZhbHVlLCB2LiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogb1trZXldPXYuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKKworICAgICAgIC8qCisgICAgIFJlbW92ZSB0aGUgbWFwcGluZyBmb3Igb2JqZWN0LCBrZXksIGZyb20gdGhlIG9iamVjdCAqby4KKyAgICAgUmV0dXJucyAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgICAgIHRoZSBQeXRob24gc3RhdGVtZW50OiBkZWwgb1trZXldLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5T2JqZWN0ICprZXkpOworCisgICAgICAgLyoKKyAgICAgRGVsZXRlIHRoZSBtYXBwaW5nIGZvciBrZXkgZnJvbSAqby4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc0NoYXJCdWZmZXIoUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpidWZmZXJfbGVuKTsKKworICAgICAgIC8qCisgICAgICBUYWtlcyBhbiBhcmJpdHJhcnkgb2JqZWN0IHdoaWNoIG11c3Qgc3VwcG9ydCB0aGUgKGNoYXJhY3RlciwKKyAgICAgIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byBhCisgICAgICByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHVzZWFibGUgYXMgY2hhcmFjdGVyIGJhc2VkIGlucHV0CisgICAgICBmb3Igc3Vic2VxdWVudCBwcm9jZXNzaW5nLgorCisgICAgICAwIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MuICBidWZmZXIgYW5kIGJ1ZmZlcl9sZW4gYXJlIG9ubHkKKyAgICAgIHNldCBpbiBjYXNlIG5vIGVycm9yIG9jY3Vycy4gT3RoZXJ3aXNlLCAtMSBpcyByZXR1cm5lZCBhbmQKKyAgICAgIGFuIGV4Y2VwdGlvbiBzZXQuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9DaGVja1JlYWRCdWZmZXIoUHlPYmplY3QgKm9iaik7CisKKyAgICAgIC8qCisgICAgICBDaGVja3Mgd2hldGhlciBhbiBhcmJpdHJhcnkgb2JqZWN0IHN1cHBvcnRzIHRoZSAoY2hhcmFjdGVyLAorICAgICAgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UuICBSZXR1cm5zIDEgb24gc3VjY2VzcywgMAorICAgICAgb24gZmFpbHVyZS4KKworICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQXNSZWFkQnVmZmVyKFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqYnVmZmVyX2xlbik7CisKKyAgICAgICAvKgorICAgICAgU2FtZSBhcyBQeU9iamVjdF9Bc0NoYXJCdWZmZXIoKSBleGNlcHQgdGhhdCB0aGlzIEFQSSBleHBlY3RzCisgICAgICAocmVhZGFibGUsIHNpbmdsZSBzZWdtZW50KSBidWZmZXIgaW50ZXJmYWNlIGFuZCByZXR1cm5zIGEKKyAgICAgIHBvaW50ZXIgdG8gYSByZWFkLW9ubHkgbWVtb3J5IGxvY2F0aW9uIHdoaWNoIGNhbiBjb250YWluCisgICAgICBhcmJpdHJhcnkgZGF0YS4KKworICAgICAgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiAgYnVmZmVyIGFuZCBidWZmZXJfbGVuIGFyZSBvbmx5CisgICAgICBzZXQgaW4gY2FzZSBubyBlcnJvciBvY2N1cnMuICBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkIGFuZAorICAgICAgYW4gZXhjZXB0aW9uIHNldC4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0FzV3JpdGVCdWZmZXIoUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgKmJ1ZmZlcl9sZW4pOworCisgICAgICAgLyoKKyAgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3Qgd2hpY2ggbXVzdCBzdXBwb3J0IHRoZSAod3JpdGVhYmxlLAorICAgICAgc2luZ2xlIHNlZ21lbnQpIGJ1ZmZlciBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBwb2ludGVyIHRvIGEKKyAgICAgIHdyaXRlYWJsZSBtZW1vcnkgbG9jYXRpb24gaW4gYnVmZmVyIG9mIHNpemUgYnVmZmVyX2xlbi4KKworICAgICAgMCBpcyByZXR1cm5lZCBvbiBzdWNjZXNzLiAgYnVmZmVyIGFuZCBidWZmZXJfbGVuIGFyZSBvbmx5CisgICAgICBzZXQgaW4gY2FzZSBubyBlcnJvciBvY2N1cnMuIE90aGVyd2lzZSwgLTEgaXMgcmV0dXJuZWQgYW5kCisgICAgICBhbiBleGNlcHRpb24gc2V0LgorCisgICAgICAgKi8KKworICAgIC8qIG5ldyBidWZmZXIgQVBJICovCisKKyNkZWZpbmUgUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqKSBcCisgICAgKCgob2JqKS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyICE9IE5VTEwpICYmICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIChQeVR5cGVfSGFzRmVhdHVyZSgob2JqKS0+b2JfdHlwZSwgUHlfVFBGTEFHU19IQVZFX05FV0JVRkZFUikpICYmIFwKKyAgICAgKChvYmopLT5vYl90eXBlLT50cF9hc19idWZmZXItPmJmX2dldGJ1ZmZlciAhPSBOVUxMKSkKKworICAgIC8qIFJldHVybiAxIGlmIHRoZSBnZXRidWZmZXIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UKKyAgICAgICByZXR1cm4gMCAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9HZXRCdWZmZXIoUHlPYmplY3QgKm9iaiwgUHlfYnVmZmVyICp2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyk7CisKKyAgICAvKiBUaGlzIGlzIGEgQy1BUEkgdmVyc2lvbiBvZiB0aGUgZ2V0YnVmZmVyIGZ1bmN0aW9uIGNhbGwuICBJdCBjaGVja3MKKyAgICAgICB0byBtYWtlIHN1cmUgb2JqZWN0IGhhcyB0aGUgcmVxdWlyZWQgZnVuY3Rpb24gcG9pbnRlciBhbmQgaXNzdWVzIHRoZQorICAgICAgIGNhbGwuICBSZXR1cm5zIC0xIGFuZCByYWlzZXMgYW4gZXJyb3Igb24gZmFpbHVyZSBhbmQgcmV0dXJucyAwIG9uCisgICAgICAgc3VjY2VzcworICAgICovCisKKworICAgICBQeUFQSV9GVU5DKHZvaWQgKikgUHlCdWZmZXJfR2V0UG9pbnRlcihQeV9idWZmZXIgKnZpZXcsIFB5X3NzaXplX3QgKmluZGljZXMpOworCisgICAgLyogR2V0IHRoZSBtZW1vcnkgYXJlYSBwb2ludGVkIHRvIGJ5IHRoZSBpbmRpY2VzIGZvciB0aGUgYnVmZmVyIGdpdmVuLgorICAgICAgIE5vdGUgdGhhdCB2aWV3LT5uZGltIGlzIHRoZSBhc3N1bWVkIHNpemUgb2YgaW5kaWNlcworICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5QnVmZmVyX1NpemVGcm9tRm9ybWF0KGNvbnN0IGNoYXIgKik7CisKKyAgICAvKiBSZXR1cm4gdGhlIGltcGxpZWQgaXRlbXNpemUgb2YgdGhlIGRhdGEtZm9ybWF0IGFyZWEgZnJvbSBhCisgICAgICAgc3RydWN0LXN0eWxlIGRlc2NyaXB0aW9uICovCisKKworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeUJ1ZmZlcl9Ub0NvbnRpZ3VvdXModm9pZCAqYnVmLCBQeV9idWZmZXIgKnZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sIGNoYXIgZm9ydCk7CisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5QnVmZmVyX0Zyb21Db250aWd1b3VzKFB5X2J1ZmZlciAqdmlldywgdm9pZCAqYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBsZW4sIGNoYXIgZm9ydCk7CisKKworICAgIC8qIENvcHkgbGVuIGJ5dGVzIG9mIGRhdGEgZnJvbSB0aGUgY29udGlndW91cyBjaHVuayBvZiBtZW1vcnkKKyAgICAgICBwb2ludGVkIHRvIGJ5IGJ1ZiBpbnRvIHRoZSBidWZmZXIgZXhwb3J0ZWQgYnkgb2JqLiAgUmV0dXJuCisgICAgICAgMCBvbiBzdWNjZXNzIGFuZCByZXR1cm4gLTEgYW5kIHJhaXNlIGEgUHlCdWZmZXJfRXJyb3Igb24KKyAgICAgICBlcnJvciAoaS5lLiB0aGUgb2JqZWN0IGRvZXMgbm90IGhhdmUgYSBidWZmZXIgaW50ZXJmYWNlIG9yCisgICAgICAgaXQgaXMgbm90IHdvcmtpbmcpLgorCisgICAgICAgSWYgZm9ydCBpcyAnRicgYW5kIHRoZSBvYmplY3QgaXMgbXVsdGktZGltZW5zaW9uYWwsCisgICAgICAgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheSBpbgorICAgICAgIEZvcnRyYW4tc3R5bGUgKGZpcnN0IGRpbWVuc2lvbiB2YXJpZXMgdGhlIGZhc3Rlc3QpLiAgSWYKKyAgICAgICBmb3J0IGlzICdDJywgdGhlbiB0aGUgZGF0YSB3aWxsIGJlIGNvcGllZCBpbnRvIHRoZSBhcnJheQorICAgICAgIGluIEMtc3R5bGUgKGxhc3QgZGltZW5zaW9uIHZhcmllcyB0aGUgZmFzdGVzdCkuICBJZiBmb3J0CisgICAgICAgaXMgJ0EnLCB0aGVuIGl0IGRvZXMgbm90IG1hdHRlciBhbmQgdGhlIGNvcHkgd2lsbCBiZSBtYWRlCisgICAgICAgaW4gd2hhdGV2ZXIgd2F5IGlzIG1vcmUgZWZmaWNpZW50LgorCisgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ29weURhdGEoUHlPYmplY3QgKmRlc3QsIFB5T2JqZWN0ICpzcmMpOworCisgICAgLyogQ29weSB0aGUgZGF0YSBmcm9tIHRoZSBzcmMgYnVmZmVyIHRvIHRoZSBidWZmZXIgb2YgZGVzdGluYXRpb24KKyAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlCdWZmZXJfSXNDb250aWd1b3VzKFB5X2J1ZmZlciAqdmlldywgY2hhciBmb3J0KTsKKworCisgICAgIFB5QVBJX0ZVTkModm9pZCkgUHlCdWZmZXJfRmlsbENvbnRpZ3VvdXNTdHJpZGVzKGludCBuZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90ICpzdHJpZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVtc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGZvcnQpOworCisgICAgLyogIEZpbGwgdGhlIHN0cmlkZXMgYXJyYXkgd2l0aCBieXRlLXN0cmlkZXMgb2YgYSBjb250aWd1b3VzCisgICAgICAgIChGb3J0cmFuLXN0eWxlIGlmIGZvcnQgaXMgJ0YnIG9yIEMtc3R5bGUgb3RoZXJ3aXNlKQorICAgICAgICBhcnJheSBvZiB0aGUgZ2l2ZW4gc2hhcGUgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzCisgICAgICAgIHBlciBlbGVtZW50LgorICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5QnVmZmVyX0ZpbGxJbmZvKFB5X2J1ZmZlciAqdmlldywgUHlPYmplY3QgKm8sIHZvaWQgKmJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbGVuLCBpbnQgcmVhZG9ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpOworCisgICAgLyogRmlsbHMgaW4gYSBidWZmZXItaW5mbyBzdHJ1Y3R1cmUgY29ycmVjdGx5IGZvciBhbiBleHBvcnRlcgorICAgICAgIHRoYXQgY2FuIG9ubHkgc2hhcmUgYSBjb250aWd1b3VzIGNodW5rIG9mIG1lbW9yeSBvZgorICAgICAgICJ1bnNpZ25lZCBieXRlcyIgb2YgdGhlIGdpdmVuIGxlbmd0aC4gUmV0dXJucyAwIG9uIHN1Y2Nlc3MKKyAgICAgICBhbmQgLTEgKHdpdGggcmFpc2luZyBhbiBlcnJvcikgb24gZXJyb3IuCisgICAgICovCisKKyAgICAgUHlBUElfRlVOQyh2b2lkKSBQeUJ1ZmZlcl9SZWxlYXNlKFB5X2J1ZmZlciAqdmlldyk7CisKKyAgICAgICAvKiBSZWxlYXNlcyBhIFB5X2J1ZmZlciBvYnRhaW5lZCBmcm9tIGdldGJ1ZmZlciBQYXJzZVR1cGxlJ3MgcyouCisgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0Zvcm1hdChQeU9iamVjdCogb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqZm9ybWF0X3NwZWMpOworICAgICAgIC8qCisgICAgIFRha2VzIGFuIGFyYml0cmFyeSBvYmplY3QgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBvZgorICAgICBjYWxsaW5nIG9iai5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKS4KKyAgICAgICAqLworCisvKiBJdGVyYXRvcnMgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0dldEl0ZXIoUHlPYmplY3QgKik7CisgICAgIC8qIFRha2VzIGFuIG9iamVjdCBhbmQgcmV0dXJucyBhbiBpdGVyYXRvciBmb3IgaXQuCisgICAgVGhpcyBpcyB0eXBpY2FsbHkgYSBuZXcgaXRlcmF0b3IgYnV0IGlmIHRoZSBhcmd1bWVudAorICAgIGlzIGFuIGl0ZXJhdG9yLCB0aGlzIHJldHVybnMgaXRzZWxmLiAqLworCisjZGVmaW5lIFB5SXRlcl9DaGVjayhvYmopIFwKKyAgICAoUHlUeXBlX0hhc0ZlYXR1cmUoKG9iaiktPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9JVEVSKSAmJiBcCisgICAgIChvYmopLT5vYl90eXBlLT50cF9pdGVybmV4dCAhPSBOVUxMICYmIFwKKyAgICAgKG9iaiktPm9iX3R5cGUtPnRwX2l0ZXJuZXh0ICE9ICZfUHlPYmplY3RfTmV4dE5vdEltcGxlbWVudGVkKQorCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJdGVyX05leHQoUHlPYmplY3QgKik7CisgICAgIC8qIFRha2VzIGFuIGl0ZXJhdG9yIG9iamVjdCBhbmQgY2FsbHMgaXRzIHRwX2l0ZXJuZXh0IHNsb3QsCisgICAgcmV0dXJuaW5nIHRoZSBuZXh0IHZhbHVlLiAgSWYgdGhlIGl0ZXJhdG9yIGlzIGV4aGF1c3RlZCwKKyAgICB0aGlzIHJldHVybnMgTlVMTCB3aXRob3V0IHNldHRpbmcgYW4gZXhjZXB0aW9uLgorICAgIE5VTEwgd2l0aCBhbiBleGNlcHRpb24gbWVhbnMgYW4gZXJyb3Igb2NjdXJyZWQuICovCisKKy8qICBOdW1iZXIgUHJvdG9jb2w6Ki8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlOdW1iZXJfQ2hlY2soUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyAxIGlmIHRoZSBvYmplY3QsIG8sIHByb3ZpZGVzIG51bWVyaWMgcHJvdG9jb2xzLCBhbmQKKyAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0FkZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8xIGFuZCBvMiwgb3IgbnVsbCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzErbzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9TdWJ0cmFjdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgb3IgbnVsbCBvbgorICAgICBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xLW8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX011bHRpcGx5KFB5T2JqZWN0ICpvMSwgUHlPYmplY3QgKm8yKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiBtdWx0aXBseWluZyBvMSBhbmQgbzIsIG9yIG51bGwgb24KKyAgICAgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSpvMi4KKworCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0RpdmlkZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xL28yLgorCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfRmxvb3JEaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCisgICAgIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xLy9vMi4KKworCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1RydWVEaXZpZGUoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhIGZsb2F0IHJlc3VsdCwKKyAgICAgb3IgbnVsbCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEvbzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9SZW1haW5kZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBvciBudWxsIG9uCisgICAgIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzElbzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9EaXZtb2QoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgU2VlIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBkaXZtb2QuICBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIGRpdm1vZChvMSxvMikuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Qb3dlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvMyk7CisKKyAgICAgICAvKgorICAgICBTZWUgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIHBvdy4gIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgcG93KG8xLG8yLG8zKSwgd2hlcmUgbzMgaXMgb3B0aW9uYWwuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfTmVnYXRpdmUoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgbmVnYXRpb24gb2YgbyBvbiBzdWNjZXNzLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOiAtby4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Qb3NpdGl2ZShQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSAod2hhdD8pIG9mIG8gb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogK28uCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfQWJzb2x1dGUoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2Ygbywgb3IgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcworICAgICB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGFicyhvKS4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JbnZlcnQoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgYml0d2lzZSBuZWdhdGlvbiBvZiBvIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24KKyAgICAgZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICB+by4KKworCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0xzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbGVmdCBzaGlmdGluZyBvMSBieSBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzEgPDwgbzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Sc2hpZnQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJpZ2h0IHNoaWZ0aW5nIG8xIGJ5IG8yIG9uIHN1Y2Nlc3MsIG9yCisgICAgIE5VTEwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSA+PiBvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9BbmQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2UgYW5kIG9mIG8xIGFuZCBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvMSZvMi4KKworCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX1hvcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBvciBvZiBvMSBieSBvMiBvbiBzdWNjZXNzLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzFebzIuCisKKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9PcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYml0d2lzZSBvciBvbiBvMSBhbmQgbzIgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xfG8yLgorCisgICAgICAgKi8KKworICAgICAvKiBJbXBsZW1lbnRlZCBlbHNld2hlcmU6CisKKyAgICAgaW50IFB5TnVtYmVyX0NvZXJjZShQeU9iamVjdCAqKnAxLCBQeU9iamVjdCAqKnAyKTsKKworICAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBhZGRyZXNzZXMgb2YgdHdvIHZhcmlhYmxlcyBvZiB0eXBlCisgICAgIFB5T2JqZWN0Ki4KKworICAgICBJZiB0aGUgb2JqZWN0cyBwb2ludGVkIHRvIGJ5ICpwMSBhbmQgKnAyIGhhdmUgdGhlIHNhbWUgdHlwZSwKKyAgICAgaW5jcmVtZW50IHRoZWlyIHJlZmVyZW5jZSBjb3VudCBhbmQgcmV0dXJuIDAgKHN1Y2Nlc3MpLgorICAgICBJZiB0aGUgb2JqZWN0cyBjYW4gYmUgY29udmVydGVkIHRvIGEgY29tbW9uIG51bWVyaWMgdHlwZSwKKyAgICAgcmVwbGFjZSAqcDEgYW5kICpwMiBieSB0aGVpciBjb252ZXJ0ZWQgdmFsdWUgKHdpdGggJ25ldycKKyAgICAgcmVmZXJlbmNlIGNvdW50cyksIGFuZCByZXR1cm4gMC4KKyAgICAgSWYgbm8gY29udmVyc2lvbiBpcyBwb3NzaWJsZSwgb3IgaWYgc29tZSBvdGhlciBlcnJvciBvY2N1cnMsCisgICAgIHJldHVybiAtMSAoZmFpbHVyZSkgYW5kIGRvbid0IGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50cy4KKyAgICAgVGhlIGNhbGwgUHlOdW1iZXJfQ29lcmNlKCZvMSwgJm8yKSBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50IG8xLCBvMiA9IGNvZXJjZShvMSwgbzIpLgorCisgICAgICAgKi8KKworI2RlZmluZSBQeUluZGV4X0NoZWNrKG9iaikgXAorICAgKChvYmopLT5vYl90eXBlLT50cF9hc19udW1iZXIgIT0gTlVMTCAmJiBcCisgICAgUHlUeXBlX0hhc0ZlYXR1cmUoKG9iaiktPm9iX3R5cGUsIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCkgJiYgXAorICAgIChvYmopLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2luZGV4ICE9IE5VTEwpCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JbmRleChQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBvYmplY3QgY29udmVydGVkIHRvIGEgUHl0aG9uIGxvbmcgb3IgaW50CisgICAgIG9yIE5VTEwgd2l0aCBhbiBlcnJvciByYWlzZWQgb24gZmFpbHVyZS4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlOdW1iZXJfQXNTc2l6ZV90KFB5T2JqZWN0ICpvLCBQeU9iamVjdCAqZXhjKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIEludGVncmFsIGluc3RhbmNlIGNvbnZlcnRlZCB0byBhbiBpbnQuIFRoZQorICAgICBpbnN0YW5jZSBpcyBleHBlY3RlZCB0byBiZSBpbnQgb3IgbG9uZyBvciBoYXZlIGFuIF9faW50X18KKyAgICAgbWV0aG9kLiBTdGVhbHMgaW50ZWdyYWwncyByZWZlcmVuY2UuIGVycm9yX2Zvcm1hdCB3aWxsIGJlCisgICAgIHVzZWQgdG8gY3JlYXRlIHRoZSBUeXBlRXJyb3IgaWYgaW50ZWdyYWwgaXNuJ3QgYWN0dWFsbHkgYW4KKyAgICAgSW50ZWdyYWwgaW5zdGFuY2UuIGVycm9yX2Zvcm1hdCBzaG91bGQgYmUgYSBmb3JtYXQgc3RyaW5nCisgICAgIHRoYXQgY2FuIGFjY2VwdCBhIGNoYXIqIG5hbWluZyBpbnRlZ3JhbCdzIHR5cGUuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU51bWJlcl9Db252ZXJ0SW50ZWdyYWxUb0ludCgKKyAgICAgICAgIFB5T2JqZWN0ICppbnRlZ3JhbCwKKyAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yX2Zvcm1hdCk7CisKKyAgICAgICAvKgorICAgIFJldHVybnMgdGhlIG9iamVjdCBjb252ZXJ0ZWQgdG8gUHlfc3NpemVfdCBieSBnb2luZyB0aHJvdWdoCisgICAgUHlOdW1iZXJfSW5kZXggZmlyc3QuICBJZiBhbiBvdmVyZmxvdyBlcnJvciBvY2N1cnMgd2hpbGUKKyAgICBjb252ZXJ0aW5nIHRoZSBpbnQtb3ItbG9uZyB0byBQeV9zc2l6ZV90LCB0aGVuIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAgICBpcyB0aGUgZXJyb3ItdHlwZSB0byByZXR1cm4uICBJZiBpdCBpcyBOVUxMLCB0aGVuIHRoZSBvdmVyZmxvdyBlcnJvcgorICAgIGlzIGNsZWFyZWQgYW5kIHRoZSB2YWx1ZSBpcyBjbGlwcGVkLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JbnQoUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgbyBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlciBvYmplY3Qgb24gc3VjY2Vzcywgb3IKKyAgICAgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IGludChvKS4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9Mb25nKFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybnMgdGhlIG8gY29udmVydGVkIHRvIGEgbG9uZyBpbnRlZ2VyIG9iamVjdCBvbiBzdWNjZXNzLAorICAgICBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbG9uZyhvKS4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9GbG9hdChQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBvIGNvbnZlcnRlZCB0byBhIGZsb2F0IG9iamVjdCBvbiBzdWNjZXNzLCBvciBOVUxMCisgICAgIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgZmxvYXQobykuCisgICAgICAgKi8KKworLyogIEluLXBsYWNlIHZhcmlhbnRzIG9mIChzb21lIG9mKSB0aGUgYWJvdmUgbnVtYmVyIHByb3RvY29sIGZ1bmN0aW9ucyAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZUFkZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYWRkaW5nIG8yIHRvIG8xLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IgbnVsbAorICAgICBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xICs9IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgbzIgZnJvbSBvMSwgcG9zc2libHkgaW4tcGxhY2Ugb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC09IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VNdWx0aXBseShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbXVsdGlwbHlpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvcgorICAgICBudWxsIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgKj0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZURpdmlkZShQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgZGl2aWRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsCisgICAgIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgbzEgLz0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZUZsb29yRGl2aWRlKFB5T2JqZWN0ICpvMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhbiBpbnRlZ3JhbCByZXN1bHQsCisgICAgIHBvc3NpYmx5IGluLXBsYWNlLCBvciBudWxsIG9uIGZhaWx1cmUuCisgICAgIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSAvPSBvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlVHJ1ZURpdmlkZShQeU9iamVjdCAqbzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGRpdmlkaW5nIG8xIGJ5IG8yIGdpdmluZyBhIGZsb2F0IHJlc3VsdCwKKyAgICAgcG9zc2libHkgaW4tcGxhY2UsIG9yIG51bGwgb24gZmFpbHVyZS4KKyAgICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xIC89IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VSZW1haW5kZXIoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVtYWluZGVyIG9mIGRpdmlkaW5nIG8xIGJ5IG8yLCBwb3NzaWJseSBpbi1wbGFjZSwgb3IKKyAgICAgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246CisgICAgIG8xICU9IG8yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TnVtYmVyX0luUGxhY2VQb3dlcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqbzMpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIHJhaXNpbmcgbzEgdG8gdGhlIHBvd2VyIG9mIG8yLCBwb3NzaWJseQorICAgICBpbi1wbGFjZSwgb3IgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xICoqPSBvMiwgb3IgcG93KG8xLCBvMiwgbzMpIGlmIG8zIGlzIHByZXNlbnQuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZUxzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgbGVmdCBzaGlmdGluZyBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSA8PD0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVJzaGlmdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgcmlnaHQgc2hpZnRpbmcgbzEgYnkgbzIsIHBvc3NpYmx5IGluLXBsYWNlIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSA+Pj0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZUFuZChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYml0d2lzZSBhbmQgb2YgbzEgYW5kIG8yLCBwb3NzaWJseSBpbi1wbGFjZSwKKyAgICAgb3IgbnVsbCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogbzEgJj0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfSW5QbGFjZVhvcihQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBiaXR3aXNlIGV4Y2x1c2l2ZSBvciBvZiBvMSBieSBvMiwgcG9zc2libHkgaW4tcGxhY2UsIG9yCisgICAgIG51bGwgb24gZmFpbHVyZS4gIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbiBleHByZXNzaW9uOgorICAgICBvMSBePSBvMi4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU51bWJlcl9JblBsYWNlT3IoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgcmVzdWx0IG9mIGJpdHdpc2Ugb3Igb2YgbzEgYW5kIG8yLCBwb3NzaWJseSBpbi1wbGFjZSwKKyAgICAgb3IgbnVsbCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xIHw9IG8yLgorCisgICAgICAgKi8KKworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlOdW1iZXJfVG9CYXNlKFB5T2JqZWN0ICpuLCBpbnQgYmFzZSk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBpbnRlZ2VyIG4gY29udmVydGVkIHRvIGEgc3RyaW5nIHdpdGggYSBiYXNlLCB3aXRoIGEgYmFzZQorICAgICBtYXJrZXIgb2YgMGIsIDBvIG9yIDB4IHByZWZpeGVkIGlmIGFwcGxpY2FibGUuCisgICAgIElmIG4gaXMgbm90IGFuIGludCBvYmplY3QsIGl0IGlzIGNvbnZlcnRlZCB3aXRoIFB5TnVtYmVyX0luZGV4IGZpcnN0LgorICAgICAgICovCisKKworLyogIFNlcXVlbmNlIHByb3RvY29sOiovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfQ2hlY2soUHlPYmplY3QgKm8pOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIDEgaWYgdGhlIG9iamVjdCBwcm92aWRlcyBzZXF1ZW5jZSBwcm90b2NvbCwgYW5kIHplcm8KKyAgICAgb3RoZXJ3aXNlLgorCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5U2VxdWVuY2VfU2l6ZShQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIHNpemUgb2Ygc2VxdWVuY2Ugb2JqZWN0IG8sIG9yIC0xIG9uIGZhaWx1cmUuCisKKyAgICAgICAqLworCisgICAgICAgLyogRm9yIERMTCBjb21wYXRpYmlsaXR5ICovCisjdW5kZWYgUHlTZXF1ZW5jZV9MZW5ndGgKKyAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVNlcXVlbmNlX0xlbmd0aChQeU9iamVjdCAqbyk7CisjZGVmaW5lIFB5U2VxdWVuY2VfTGVuZ3RoIFB5U2VxdWVuY2VfU2l6ZQorCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0NvbmNhdChQeU9iamVjdCAqbzEsIFB5T2JqZWN0ICpvMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIGNvbmNhdGVuYXRpb24gb2YgbzEgYW5kIG8yIG9uIHN1Y2Nlc3MsIGFuZCBOVUxMIG9uCisgICAgIGZhaWx1cmUuICAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xK28yLgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfUmVwZWF0KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGNvdW50KTsKKworICAgICAgIC8qCisgICAgIFJldHVybiB0aGUgcmVzdWx0IG9mIHJlcGVhdGluZyBzZXF1ZW5jZSBvYmplY3QgbyBjb3VudCB0aW1lcywKKyAgICAgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIGV4cHJlc3Npb246IG8xKmNvdW50LgorCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfR2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpKTsKKworICAgICAgIC8qCisgICAgIFJldHVybiB0aGUgaXRoIGVsZW1lbnQgb2Ygbywgb3IgTlVMTCBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZQorICAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogb1tpXS4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9HZXRTbGljZShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMik7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIHNsaWNlIG9mIHNlcXVlbmNlIG9iamVjdCBvIGJldHdlZW4gaTEgYW5kIGkyLCBvcgorICAgICBOVUxMIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvW2kxOmkyXS4KKworICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5U2VxdWVuY2VfU2V0SXRlbShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpLCBQeU9iamVjdCAqdik7CisKKyAgICAgICAvKgorICAgICBBc3NpZ24gb2JqZWN0IHYgdG8gdGhlIGl0aCBlbGVtZW50IG9mIG8uICBSZXR1cm5zCisgICAgIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50OiBvW2ldPXYuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeVNlcXVlbmNlX0RlbEl0ZW0oUHlPYmplY3QgKm8sIFB5X3NzaXplX3QgaSk7CisKKyAgICAgICAvKgorICAgICBEZWxldGUgdGhlIGl0aCBlbGVtZW50IG9mIG9iamVjdCB2LiAgUmV0dXJucworICAgICAtMSBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uCisgICAgIHN0YXRlbWVudDogZGVsIG9baV0uCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9TZXRTbGljZShQeU9iamVjdCAqbywgUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdik7CisKKyAgICAgICAvKgorICAgICBBc3NpZ24gdGhlIHNlcXVlbmNlIG9iamVjdCwgdiwgdG8gdGhlIHNsaWNlIGluIHNlcXVlbmNlCisgICAgIG9iamVjdCwgbywgZnJvbSBpMSB0byBpMi4gIFJldHVybnMgLTEgb24gZmFpbHVyZS4gVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIHN0YXRlbWVudDogb1tpMTppMl09di4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoaW50KSBQeVNlcXVlbmNlX0RlbFNsaWNlKFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGkxLCBQeV9zc2l6ZV90IGkyKTsKKworICAgICAgIC8qCisgICAgIERlbGV0ZSB0aGUgc2xpY2UgaW4gc2VxdWVuY2Ugb2JqZWN0LCBvLCBmcm9tIGkxIHRvIGkyLgorICAgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuIFRoaXMgaXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIFB5dGhvbgorICAgICBzdGF0ZW1lbnQ6IGRlbCBvW2kxOmkyXS4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9UdXBsZShQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBzZXF1ZW5jZSwgbywgYXMgYSB0dXBsZSBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiB0dXBsZShvKQorICAgICAgICovCisKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfTGlzdChQeU9iamVjdCAqbyk7CisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgc2VxdWVuY2UsIG8sIGFzIGEgbGlzdCBvbiBzdWNjZXNzLCBhbmQgTlVMTCBvbiBmYWlsdXJlLgorICAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbiBleHByZXNzaW9uOiBsaXN0KG8pCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxdWVuY2VfRmFzdChQeU9iamVjdCAqbywgY29uc3QgY2hhciogbSk7CisgICAgICAgLyoKKyAgICAgUmV0dXJucyB0aGUgc2VxdWVuY2UsIG8sIGFzIGEgdHVwbGUsIHVubGVzcyBpdCdzIGFscmVhZHkgYQorICAgICB0dXBsZSBvciBsaXN0LiAgVXNlIFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTSB0byBhY2Nlc3MgdGhlCisgICAgIG1lbWJlcnMgb2YgdGhpcyBsaXN0LCBhbmQgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFIHRvIGdldCBpdHMgbGVuZ3RoLgorCisgICAgIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLiAgSWYgdGhlIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZXJhdGlvbiwKKyAgICAgcmFpc2VzIGEgVHlwZUVycm9yIGV4Y2VwdGlvbiB3aXRoIG0gYXMgdGhlIG1lc3NhZ2UgdGV4dC4KKyAgICAgICAqLworCisjZGVmaW5lIFB5U2VxdWVuY2VfRmFzdF9HRVRfU0laRShvKSBcCisgICAgKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfU0laRShvKSA6IFB5VHVwbGVfR0VUX1NJWkUobykpCisgICAgICAgLyoKKyAgICAgUmV0dXJuIHRoZSBzaXplIG9mIG8sIGFzc3VtaW5nIHRoYXQgbyB3YXMgcmV0dXJuZWQgYnkKKyAgICAgUHlTZXF1ZW5jZV9GYXN0IGFuZCBpcyBub3QgTlVMTC4KKyAgICAgICAqLworCisjZGVmaW5lIFB5U2VxdWVuY2VfRmFzdF9HRVRfSVRFTShvLCBpKVwKKyAgICAgKFB5TGlzdF9DaGVjayhvKSA/IFB5TGlzdF9HRVRfSVRFTShvLCBpKSA6IFB5VHVwbGVfR0VUX0lURU0obywgaSkpCisgICAgICAgLyoKKyAgICAgUmV0dXJuIHRoZSBpdGggZWxlbWVudCBvZiBvLCBhc3N1bWluZyB0aGF0IG8gd2FzIHJldHVybmVkIGJ5CisgICAgIFB5U2VxdWVuY2VfRmFzdCwgYW5kIHRoYXQgaSBpcyB3aXRoaW4gYm91bmRzLgorICAgICAgICovCisKKyNkZWZpbmUgUHlTZXF1ZW5jZV9JVEVNKG8sIGkpXAorICAgICggUHlfVFlQRShvKS0+dHBfYXNfc2VxdWVuY2UtPnNxX2l0ZW0obywgaSkgKQorICAgICAgIC8qIEFzc3VtZSB0cF9hc19zZXF1ZW5jZSBhbmQgc3FfaXRlbSBleGlzdCBhbmQgdGhhdCBpIGRvZXMgbm90CisgICAgICBuZWVkIHRvIGJlIGNvcnJlY3RlZCBmb3IgYSBuZWdhdGl2ZSBpbmRleAorICAgICAgICovCisKKyNkZWZpbmUgUHlTZXF1ZW5jZV9GYXN0X0lURU1TKHNmKSBcCisgICAgKFB5TGlzdF9DaGVjayhzZikgPyAoKFB5TGlzdE9iamVjdCAqKShzZikpLT5vYl9pdGVtIFwKKyAgICAgICAgICAgICAgICAgICAgICA6ICgoUHlUdXBsZU9iamVjdCAqKShzZikpLT5vYl9pdGVtKQorICAgIC8qIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHVuZGVybHlpbmcgaXRlbSBhcnJheSBmb3IKKyAgICAgICBhbiBvYmplY3QgcmV0dXJlZCBieSBQeVNlcXVlbmNlX0Zhc3QgKi8KKworICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5U2VxdWVuY2VfQ291bnQoUHlPYmplY3QgKm8sIFB5T2JqZWN0ICp2YWx1ZSk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvbiB2YWx1ZSBvbiBvLCB0aGF0IGlzLAorICAgICByZXR1cm4gdGhlIG51bWJlciBvZiBrZXlzIGZvciB3aGljaCBvW2tleV09PXZhbHVlLiAgT24KKyAgICAgZmFpbHVyZSwgcmV0dXJuIC0xLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24KKyAgICAgZXhwcmVzc2lvbjogby5jb3VudCh2YWx1ZSkuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9Db250YWlucyhQeU9iamVjdCAqc2VxLCBQeU9iamVjdCAqb2IpOworICAgICAgIC8qCisgICAgIFJldHVybiAtMSBpZiBlcnJvcjsgMSBpZiBvYiBpbiBzZXE7IDAgaWYgb2Igbm90IGluIHNlcS4KKyAgICAgVXNlIF9fY29udGFpbnNfXyBpZiBwb3NzaWJsZSwgZWxzZSBfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoKCkuCisgICAgICAgKi8KKworI2RlZmluZSBQWV9JVEVSU0VBUkNIX0NPVU5UICAgIDEKKyNkZWZpbmUgUFlfSVRFUlNFQVJDSF9JTkRFWCAgICAyCisjZGVmaW5lIFBZX0lURVJTRUFSQ0hfQ09OVEFJTlMgMworICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeVNlcXVlbmNlX0l0ZXJTZWFyY2goUHlPYmplY3QgKnNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqb2JqLCBpbnQgb3BlcmF0aW9uKTsKKyAgICAvKgorICAgICAgSXRlcmF0ZSBvdmVyIHNlcS4gIFJlc3VsdCBkZXBlbmRzIG9uIHRoZSBvcGVyYXRpb246CisgICAgICBQWV9JVEVSU0VBUkNIX0NPVU5UOiAgcmV0dXJuICMgb2YgdGltZXMgb2JqIGFwcGVhcnMgaW4gc2VxOyAtMSBpZgorICAgICAgICBlcnJvci4KKyAgICAgIFBZX0lURVJTRUFSQ0hfSU5ERVg6ICByZXR1cm4gMC1iYXNlZCBpbmRleCBvZiBmaXJzdCBvY2N1cnJlbmNlIG9mCisgICAgICAgIG9iaiBpbiBzZXE7IHNldCBWYWx1ZUVycm9yIGFuZCByZXR1cm4gLTEgaWYgbm9uZSBmb3VuZDsKKyAgICAgICAgYWxzbyByZXR1cm4gLTEgb24gZXJyb3IuCisgICAgICBQWV9JVEVSU0VBUkNIX0NPTlRBSU5TOiAgcmV0dXJuIDEgaWYgb2JqIGluIHNlcSwgZWxzZSAwOyAtMSBvbgorICAgICAgICBlcnJvci4KKyAgICAqLworCisvKiBGb3IgRExMLWxldmVsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCisjdW5kZWYgUHlTZXF1ZW5jZV9JbgorICAgICBQeUFQSV9GVU5DKGludCkgUHlTZXF1ZW5jZV9JbihQeU9iamVjdCAqbywgUHlPYmplY3QgKnZhbHVlKTsKKworLyogRm9yIHNvdXJjZS1sZXZlbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworI2RlZmluZSBQeVNlcXVlbmNlX0luIFB5U2VxdWVuY2VfQ29udGFpbnMKKworICAgICAgIC8qCisgICAgIERldGVybWluZSBpZiBvIGNvbnRhaW5zIHZhbHVlLiAgSWYgYW4gaXRlbSBpbiBvIGlzIGVxdWFsIHRvCisgICAgIFgsIHJldHVybiAxLCBvdGhlcndpc2UgcmV0dXJuIDAuICBPbiBlcnJvciwgcmV0dXJuIC0xLiAgVGhpcworICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjogdmFsdWUgaW4gby4KKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTZXF1ZW5jZV9JbmRleChQeU9iamVjdCAqbywgUHlPYmplY3QgKnZhbHVlKTsKKworICAgICAgIC8qCisgICAgIFJldHVybiB0aGUgZmlyc3QgaW5kZXggZm9yIHdoaWNoIG9baV09dmFsdWUuICBPbiBlcnJvciwKKyAgICAgcmV0dXJuIC0xLiAgICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvLmluZGV4KHZhbHVlKS4KKyAgICAgICAqLworCisvKiBJbi1wbGFjZSB2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBhYm92ZSBTZXF1ZW5jZSBmdW5jdGlvbnMuICovCisKKyAgICAgUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNlcXVlbmNlX0luUGxhY2VDb25jYXQoUHlPYmplY3QgKm8xLCBQeU9iamVjdCAqbzIpOworCisgICAgICAgLyoKKyAgICAgQXBwZW5kIG8yIHRvIG8xLCBpbi1wbGFjZSB3aGVuIHBvc3NpYmxlLiBSZXR1cm4gdGhlIHJlc3VsdGluZworICAgICBvYmplY3QsIHdoaWNoIGNvdWxkIGJlIG8xLCBvciBOVUxMIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZQorICAgICBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjogbzEgKz0gbzIuCisKKyAgICAgICAqLworCisgICAgIFB5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0KFB5T2JqZWN0ICpvLCBQeV9zc2l6ZV90IGNvdW50KTsKKworICAgICAgIC8qCisgICAgIFJlcGVhdCBvMSBieSBjb3VudCwgaW4tcGxhY2Ugd2hlbiBwb3NzaWJsZS4gUmV0dXJuIHRoZSByZXN1bHRpbmcKKyAgICAgb2JqZWN0LCB3aGljaCBjb3VsZCBiZSBvMSwgb3IgTlVMTCBvbiBmYWlsdXJlLiAgVGhpcyBpcyB0aGUKKyAgICAgZXF1aXZhbGVudCBvZiB0aGUgUHl0aG9uIGV4cHJlc3Npb246IG8xICo9IGNvdW50LgorCisgICAgICAgKi8KKworLyogIE1hcHBpbmcgcHJvdG9jb2w6Ki8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0NoZWNrKFB5T2JqZWN0ICpvKTsKKworICAgICAgIC8qCisgICAgIFJldHVybiAxIGlmIHRoZSBvYmplY3QgcHJvdmlkZXMgbWFwcGluZyBwcm90b2NvbCwgYW5kIHplcm8KKyAgICAgb3RoZXJ3aXNlLgorCisgICAgIFRoaXMgZnVuY3Rpb24gYWx3YXlzIHN1Y2NlZWRzLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeU1hcHBpbmdfU2l6ZShQeU9iamVjdCAqbyk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyBpbiBvYmplY3QgbyBvbiBzdWNjZXNzLCBhbmQgLTEgb24KKyAgICAgZmFpbHVyZS4gIEZvciBvYmplY3RzIHRoYXQgZG8gbm90IHByb3ZpZGUgc2VxdWVuY2UgcHJvdG9jb2wsCisgICAgIHRoaXMgaXMgZXF1aXZhbGVudCB0byB0aGUgUHl0aG9uIGV4cHJlc3Npb246IGxlbihvKS4KKyAgICAgICAqLworCisgICAgICAgLyogRm9yIERMTCBjb21wYXRpYmlsaXR5ICovCisjdW5kZWYgUHlNYXBwaW5nX0xlbmd0aAorICAgICBQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5TWFwcGluZ19MZW5ndGgoUHlPYmplY3QgKm8pOworI2RlZmluZSBQeU1hcHBpbmdfTGVuZ3RoIFB5TWFwcGluZ19TaXplCisKKworICAgICAvKiBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvOgorCisgICAgIGludCBQeU1hcHBpbmdfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqbywgY2hhciAqa2V5KTsKKworICAgICBSZW1vdmUgdGhlIG1hcHBpbmcgZm9yIG9iamVjdCwga2V5LCBmcm9tIHRoZSBvYmplY3QgKm8uCisgICAgIFJldHVybnMgLTEgb24gZmFpbHVyZS4gIFRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgICB0aGUgUHl0aG9uIHN0YXRlbWVudDogZGVsIG9ba2V5XS4KKyAgICAgICAqLworI2RlZmluZSBQeU1hcHBpbmdfRGVsSXRlbVN0cmluZyhPLEspIFB5T2JqZWN0X0RlbEl0ZW1TdHJpbmcoKE8pLChLKSkKKworICAgICAvKiBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvOgorCisgICAgIGludCBQeU1hcHBpbmdfRGVsSXRlbShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CisKKyAgICAgUmVtb3ZlIHRoZSBtYXBwaW5nIGZvciBvYmplY3QsIGtleSwgZnJvbSB0aGUgb2JqZWN0ICpvLgorICAgICBSZXR1cm5zIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgdGhlIFB5dGhvbiBzdGF0ZW1lbnQ6IGRlbCBvW2tleV0uCisgICAgICAgKi8KKyNkZWZpbmUgUHlNYXBwaW5nX0RlbEl0ZW0oTyxLKSBQeU9iamVjdF9EZWxJdGVtKChPKSwoSykpCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5TWFwcGluZ19IYXNLZXlTdHJpbmcoUHlPYmplY3QgKm8sIGNoYXIgKmtleSk7CisKKyAgICAgICAvKgorICAgICBPbiBzdWNjZXNzLCByZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKKyAgICAgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgby5oYXNfa2V5KGtleSkuCisKKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisgICAgICAgKi8KKworICAgICBQeUFQSV9GVU5DKGludCkgUHlNYXBwaW5nX0hhc0tleShQeU9iamVjdCAqbywgUHlPYmplY3QgKmtleSk7CisKKyAgICAgICAvKgorICAgICBSZXR1cm4gMSBpZiB0aGUgbWFwcGluZyBvYmplY3QgaGFzIHRoZSBrZXksIGtleSwKKyAgICAgYW5kIDAgb3RoZXJ3aXNlLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgby5oYXNfa2V5KGtleSkuCisKKyAgICAgVGhpcyBmdW5jdGlvbiBhbHdheXMgc3VjY2VlZHMuCisKKyAgICAgICAqLworCisgICAgIC8qIEltcGxlbWVudGVkIGFzIG1hY3JvOgorCisgICAgIFB5T2JqZWN0ICpQeU1hcHBpbmdfS2V5cyhQeU9iamVjdCAqbyk7CisKKyAgICAgT24gc3VjY2VzcywgcmV0dXJuIGEgbGlzdCBvZiB0aGUga2V5cyBpbiBvYmplY3Qgby4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiBOVUxMLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvLmtleXMoKS4KKyAgICAgICAqLworI2RlZmluZSBQeU1hcHBpbmdfS2V5cyhPKSBQeU9iamVjdF9DYWxsTWV0aG9kKE8sImtleXMiLE5VTEwpCisKKyAgICAgLyogSW1wbGVtZW50ZWQgYXMgbWFjcm86CisKKyAgICAgUHlPYmplY3QgKlB5TWFwcGluZ19WYWx1ZXMoUHlPYmplY3QgKm8pOworCisgICAgIE9uIHN1Y2Nlc3MsIHJldHVybiBhIGxpc3Qgb2YgdGhlIHZhbHVlcyBpbiBvYmplY3Qgby4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiBOVUxMLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvLnZhbHVlcygpLgorICAgICAgICovCisjZGVmaW5lIFB5TWFwcGluZ19WYWx1ZXMoTykgUHlPYmplY3RfQ2FsbE1ldGhvZChPLCJ2YWx1ZXMiLE5VTEwpCisKKyAgICAgLyogSW1wbGVtZW50ZWQgYXMgbWFjcm86CisKKyAgICAgUHlPYmplY3QgKlB5TWFwcGluZ19JdGVtcyhQeU9iamVjdCAqbyk7CisKKyAgICAgT24gc3VjY2VzcywgcmV0dXJuIGEgbGlzdCBvZiB0aGUgaXRlbXMgaW4gb2JqZWN0IG8sIHdoZXJlCisgICAgIGVhY2ggaXRlbSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgYSBrZXktdmFsdWUgcGFpci4gIE9uCisgICAgIGZhaWx1cmUsIHJldHVybiBOVUxMLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIFB5dGhvbgorICAgICBleHByZXNzaW9uOiBvLml0ZW1zKCkuCisKKyAgICAgICAqLworI2RlZmluZSBQeU1hcHBpbmdfSXRlbXMoTykgUHlPYmplY3RfQ2FsbE1ldGhvZChPLCJpdGVtcyIsTlVMTCkKKworICAgICBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXkpOworCisgICAgICAgLyoKKyAgICAgUmV0dXJuIGVsZW1lbnQgb2YgbyBjb3JyZXNwb25kaW5nIHRvIHRoZSBvYmplY3QsIGtleSwgb3IgTlVMTAorICAgICBvbiBmYWlsdXJlLiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24gZXhwcmVzc2lvbjoKKyAgICAgb1trZXldLgorICAgICAgICovCisKKyAgICAgUHlBUElfRlVOQyhpbnQpIFB5TWFwcGluZ19TZXRJdGVtU3RyaW5nKFB5T2JqZWN0ICpvLCBjaGFyICprZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICp2YWx1ZSk7CisKKyAgICAgICAvKgorICAgICBNYXAgdGhlIG9iamVjdCwga2V5LCB0byB0aGUgdmFsdWUsIHYuICBSZXR1cm5zCisgICAgIC0xIG9uIGZhaWx1cmUuICBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBQeXRob24KKyAgICAgc3RhdGVtZW50OiBvW2tleV09di4KKyAgICAgICovCisKKworUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0lzSW5zdGFuY2UoUHlPYmplY3QgKm9iamVjdCwgUHlPYmplY3QgKnR5cGVvcmNsYXNzKTsKKyAgICAgIC8qIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlb3JjbGFzcykgKi8KKworUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X0lzU3ViY2xhc3MoUHlPYmplY3QgKm9iamVjdCwgUHlPYmplY3QgKnR5cGVvcmNsYXNzKTsKKyAgICAgIC8qIGlzc3ViY2xhc3Mob2JqZWN0LCB0eXBlb3JjbGFzcykgKi8KKworCitQeUFQSV9GVU5DKGludCkgX1B5T2JqZWN0X1JlYWxJc0luc3RhbmNlKFB5T2JqZWN0ICppbnN0LCBQeU9iamVjdCAqY2xzKTsKKworUHlBUElfRlVOQyhpbnQpIF9QeU9iamVjdF9SZWFsSXNTdWJjbGFzcyhQeU9iamVjdCAqZGVyaXZlZCwgUHlPYmplY3QgKmNscyk7CisKKworLyogRm9yIGludGVybmFsIHVzZSBieSBidWZmZXIgQVBJIGZ1bmN0aW9ucyAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlfYWRkX29uZV90b19pbmRleF9GKGludCBuZCwgUHlfc3NpemVfdCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHlfc3NpemVfdCAqc2hhcGUpOworUHlBUElfRlVOQyh2b2lkKSBfUHlfYWRkX29uZV90b19pbmRleF9DKGludCBuZCwgUHlfc3NpemVfdCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUHlfc3NpemVfdCAqc2hhcGUpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogUHlfQUJTVFJBQ1RPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvYXNkbC5oIGIvaW5jbHVkZS9weXRob24yLjcvYXNkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZTgzN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9hc2RsLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBQeV9BU0RMX0gKKyNkZWZpbmUgUHlfQVNETF9ICisKK3R5cGVkZWYgUHlPYmplY3QgKiBpZGVudGlmaWVyOwordHlwZWRlZiBQeU9iamVjdCAqIHN0cmluZzsKK3R5cGVkZWYgUHlPYmplY3QgKiBvYmplY3Q7CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKK3R5cGVkZWYgZW51bSB7ZmFsc2UsIHRydWV9IGJvb2w7CisjZW5kaWYKKworLyogSXQgd291bGQgYmUgbmljZSBpZiB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgYXNkbF9jLnB5IHdhcyBjb21wbGV0ZWx5CisgICBpbmRlcGVuZGVudCBvZiBQeXRob24sIGJ1dCBpdCBpcyBhIGdvYWwgdGhlIHJlcXVpcmVzIHRvbyBtdWNoIHdvcmsKKyAgIGF0IHRoaXMgc3RhZ2UuICBTbywgZm9yIGV4YW1wbGUsIEknbGwgcmVwcmVzZW50IGlkZW50aWZpZXJzIGFzCisgICBpbnRlcm5lZCBQeXRob24gc3RyaW5ncy4KKyovCisKKy8qIFhYWCBBIHNlcXVlbmNlIHNob3VsZCBiZSB0eXBlZCBzbyB0aGF0IGl0cyB1c2UgY2FuIGJlIHR5cGVjaGVja2VkLiAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHNpemU7CisgICAgdm9pZCAqZWxlbWVudHNbMV07Cit9IGFzZGxfc2VxOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IHNpemU7CisgICAgaW50IGVsZW1lbnRzWzFdOworfSBhc2RsX2ludF9zZXE7CisKK2FzZGxfc2VxICphc2RsX3NlcV9uZXcoaW50IHNpemUsIFB5QXJlbmEgKmFyZW5hKTsKK2FzZGxfaW50X3NlcSAqYXNkbF9pbnRfc2VxX25ldyhpbnQgc2l6ZSwgUHlBcmVuYSAqYXJlbmEpOworCisjZGVmaW5lIGFzZGxfc2VxX0dFVChTLCBJKSAoUyktPmVsZW1lbnRzWyhJKV0KKyNkZWZpbmUgYXNkbF9zZXFfTEVOKFMpICgoUykgPT0gTlVMTCA/IDAgOiAoUyktPnNpemUpCisjaWZkZWYgUHlfREVCVUcKKyNkZWZpbmUgYXNkbF9zZXFfU0VUKFMsIEksIFYpIHsgXAorICAgICAgICBpbnQgX2FzZGxfaSA9IChJKTsgXAorICAgICAgICBhc3NlcnQoKFMpICYmIF9hc2RsX2kgPCAoUyktPnNpemUpOyBcCisgICAgICAgIChTKS0+ZWxlbWVudHNbX2FzZGxfaV0gPSAoVik7IFwKK30KKyNlbHNlCisjZGVmaW5lIGFzZGxfc2VxX1NFVChTLCBJLCBWKSAoUyktPmVsZW1lbnRzW0ldID0gKFYpCisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9BU0RMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2FzdC5oIGIvaW5jbHVkZS9weXRob24yLjcvYXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MxNGI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2FzdC5oCkBAIC0wLDAgKzEsMTMgQEAKKyNpZm5kZWYgUHlfQVNUX0gKKyNkZWZpbmUgUHlfQVNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfRlVOQyhtb2RfdHkpIFB5QVNUX0Zyb21Ob2RlKGNvbnN0IG5vZGUgKiwgUHlDb21waWxlckZsYWdzICpmbGFncywKKwkJCQkgIGNvbnN0IGNoYXIgKiwgUHlBcmVuYSAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQVNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2JpdHNldC5oIGIvaW5jbHVkZS9weXRob24yLjcvYml0c2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlYjQxOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2JpdHNldC5oCkBAIC0wLDAgKzEsMzIgQEAKKworI2lmbmRlZiBQeV9CSVRTRVRfSAorI2RlZmluZSBQeV9CSVRTRVRfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBCaXRzZXQgaW50ZXJmYWNlICovCisKKyNkZWZpbmUgQllURQkJY2hhcgorCit0eXBlZGVmIEJZVEUgKmJpdHNldDsKKworYml0c2V0IG5ld2JpdHNldChpbnQgbmJpdHMpOwordm9pZCBkZWxiaXRzZXQoYml0c2V0IGJzKTsKKyNkZWZpbmUgdGVzdGJpdChzcywgaWJpdCkgKCgoc3MpW0JJVDJCWVRFKGliaXQpXSAmIEJJVDJNQVNLKGliaXQpKSAhPSAwKQoraW50IGFkZGJpdChiaXRzZXQgYnMsIGludCBpYml0KTsgLyogUmV0dXJucyAwIGlmIGFscmVhZHkgc2V0ICovCitpbnQgc2FtZWJpdHNldChiaXRzZXQgYnMxLCBiaXRzZXQgYnMyLCBpbnQgbmJpdHMpOwordm9pZCBtZXJnZWJpdHNldChiaXRzZXQgYnMxLCBiaXRzZXQgYnMyLCBpbnQgbmJpdHMpOworCisjZGVmaW5lIEJJVFNQRVJCWVRFCSg4KnNpemVvZihCWVRFKSkKKyNkZWZpbmUgTkJZVEVTKG5iaXRzKQkoKChuYml0cykgKyBCSVRTUEVSQllURSAtIDEpIC8gQklUU1BFUkJZVEUpCisKKyNkZWZpbmUgQklUMkJZVEUoaWJpdCkJKChpYml0KSAvIEJJVFNQRVJCWVRFKQorI2RlZmluZSBCSVQyU0hJRlQoaWJpdCkJKChpYml0KSAlIEJJVFNQRVJCWVRFKQorI2RlZmluZSBCSVQyTUFTSyhpYml0KQkoMSA8PCBCSVQyU0hJRlQoaWJpdCkpCisjZGVmaW5lIEJZVEUyQklUKGlieXRlKQkoKGlieXRlKSAqIEJJVFNQRVJCWVRFKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9CSVRTRVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvYm9vbG9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvYm9vbG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZTg1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9ib29sb2JqZWN0LmgKQEAgLTAsMCArMSwzNiBAQAorLyogQm9vbGVhbiBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfQk9PTE9CSkVDVF9ICisjZGVmaW5lIFB5X0JPT0xPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK3R5cGVkZWYgUHlJbnRPYmplY3QgUHlCb29sT2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlCb29sX1R5cGU7CisKKyNkZWZpbmUgUHlCb29sX0NoZWNrKHgpIChQeV9UWVBFKHgpID09ICZQeUJvb2xfVHlwZSkKKworLyogUHlfRmFsc2UgYW5kIFB5X1RydWUgYXJlIHRoZSBvbmx5IHR3byBib29scyBpbiBleGlzdGVuY2UuCitEb24ndCBmb3JnZXQgdG8gYXBwbHkgUHlfSU5DUkVGKCkgd2hlbiByZXR1cm5pbmcgZWl0aGVyISEhICovCisKKy8qIERvbid0IHVzZSB0aGVzZSBkaXJlY3RseSAqLworUHlBUElfREFUQShQeUludE9iamVjdCkgX1B5X1plcm9TdHJ1Y3QsIF9QeV9UcnVlU3RydWN0OworCisvKiBVc2UgdGhlc2UgbWFjcm9zICovCisjZGVmaW5lIFB5X0ZhbHNlICgoUHlPYmplY3QgKikgJl9QeV9aZXJvU3RydWN0KQorI2RlZmluZSBQeV9UcnVlICgoUHlPYmplY3QgKikgJl9QeV9UcnVlU3RydWN0KQorCisvKiBNYWNyb3MgZm9yIHJldHVybmluZyBQeV9UcnVlIG9yIFB5X0ZhbHNlLCByZXNwZWN0aXZlbHkgKi8KKyNkZWZpbmUgUHlfUkVUVVJOX1RSVUUgcmV0dXJuIFB5X0lOQ1JFRihQeV9UcnVlKSwgUHlfVHJ1ZQorI2RlZmluZSBQeV9SRVRVUk5fRkFMU0UgcmV0dXJuIFB5X0lOQ1JFRihQeV9GYWxzZSksIFB5X0ZhbHNlCisKKy8qIEZ1bmN0aW9uIHRvIHJldHVybiBhIGJvb2wgZnJvbSBhIEMgbG9uZyAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUJvb2xfRnJvbUxvbmcobG9uZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0JPT0xPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvYnVmZmVyb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9idWZmZXJvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQ4MzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvYnVmZmVyb2JqZWN0LmgKQEAgLTAsMCArMSwzMyBAQAorCisvKiBCdWZmZXIgb2JqZWN0IGludGVyZmFjZSAqLworCisvKiBOb3RlOiB0aGUgb2JqZWN0J3Mgc3RydWN0dXJlIGlzIHByaXZhdGUgKi8KKworI2lmbmRlZiBQeV9CVUZGRVJPQkpFQ1RfSAorI2RlZmluZSBQeV9CVUZGRVJPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUJ1ZmZlcl9UeXBlOworCisjZGVmaW5lIFB5QnVmZmVyX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5QnVmZmVyX1R5cGUpCisKKyNkZWZpbmUgUHlfRU5EX09GX0JVRkZFUgkoLTEpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCdWZmZXJfRnJvbU9iamVjdChQeU9iamVjdCAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG9mZnNldCwgUHlfc3NpemVfdCBzaXplKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCdWZmZXJfRnJvbVJlYWRXcml0ZU9iamVjdChQeU9iamVjdCAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUpOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5QnVmZmVyX0Zyb21NZW1vcnkodm9pZCAqcHRyLCBQeV9zc2l6ZV90IHNpemUpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUJ1ZmZlcl9Gcm9tUmVhZFdyaXRlTWVtb3J5KHZvaWQgKnB0ciwgUHlfc3NpemVfdCBzaXplKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUJ1ZmZlcl9OZXcoUHlfc3NpemVfdCBzaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQlVGRkVST0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVhcnJheW9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvYnl0ZWFycmF5b2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyODFhNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVhcnJheW9iamVjdC5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qIEJ5dGVBcnJheSBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfQllURUFSUkFZT0JKRUNUX0gKKyNkZWZpbmUgUHlfQllURUFSUkFZT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvKiBUeXBlIFB5Qnl0ZUFycmF5T2JqZWN0IHJlcHJlc2VudHMgYSBtdXRhYmxlIGFycmF5IG9mIGJ5dGVzLgorICogVGhlIFB5dGhvbiBBUEkgaXMgdGhhdCBvZiBhIHNlcXVlbmNlOworICogdGhlIGJ5dGVzIGFyZSBtYXBwZWQgdG8gaW50cyBpbiBbMCwgMjU2KS4KKyAqIEJ5dGVzIGFyZSBub3QgY2hhcmFjdGVyczsgdGhleSBtYXkgYmUgdXNlZCB0byBlbmNvZGUgY2hhcmFjdGVycy4KKyAqIFRoZSBvbmx5IHdheSB0byBnbyBiZXR3ZWVuIGJ5dGVzIGFuZCBzdHIvdW5pY29kZSBpcyB2aWEgZW5jb2RpbmcKKyAqIGFuZCBkZWNvZGluZy4KKyAqIEZvciB0aGUgY29udmVuaWVuY2Ugb2YgQyBwcm9ncmFtbWVycywgdGhlIGJ5dGVzIHR5cGUgaXMgY29uc2lkZXJlZAorICogdG8gY29udGFpbiBhIGNoYXIgcG9pbnRlciwgbm90IGFuIHVuc2lnbmVkIGNoYXIgcG9pbnRlci4KKyAqLworCisvKiBPYmplY3QgbGF5b3V0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfVkFSX0hFQUQKKyAgICAvKiBYWFgobm5vcndpdHopOiBzaG91bGQgb2JfZXhwb3J0cyBiZSBQeV9zc2l6ZV90PyAqLworICAgIGludCBvYl9leHBvcnRzOyAvKiBob3cgbWFueSBidWZmZXIgZXhwb3J0cyAqLworICAgIFB5X3NzaXplX3Qgb2JfYWxsb2M7IC8qIEhvdyBtYW55IGJ5dGVzIGFsbG9jYXRlZCAqLworICAgIGNoYXIgKm9iX2J5dGVzOworfSBQeUJ5dGVBcnJheU9iamVjdDsKKworLyogVHlwZSBvYmplY3QgKi8KK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUJ5dGVBcnJheV9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Qnl0ZUFycmF5SXRlcl9UeXBlOworCisvKiBUeXBlIGNoZWNrIG1hY3JvcyAqLworI2RlZmluZSBQeUJ5dGVBcnJheV9DaGVjayhzZWxmKSBQeU9iamVjdF9UeXBlQ2hlY2soc2VsZiwgJlB5Qnl0ZUFycmF5X1R5cGUpCisjZGVmaW5lIFB5Qnl0ZUFycmF5X0NoZWNrRXhhY3Qoc2VsZikgKFB5X1RZUEUoc2VsZikgPT0gJlB5Qnl0ZUFycmF5X1R5cGUpCisKKy8qIERpcmVjdCBBUEkgZnVuY3Rpb25zICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Qnl0ZUFycmF5X0Zyb21PYmplY3QoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Qnl0ZUFycmF5X0NvbmNhdChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlCeXRlQXJyYXlfRnJvbVN0cmluZ0FuZFNpemUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlCeXRlQXJyYXlfU2l6ZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoY2hhciAqKSBQeUJ5dGVBcnJheV9Bc1N0cmluZyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUJ5dGVBcnJheV9SZXNpemUoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CisKKy8qIE1hY3JvcywgdHJhZGluZyBzYWZldHkgZm9yIHNwZWVkICovCisjZGVmaW5lIFB5Qnl0ZUFycmF5X0FTX1NUUklORyhzZWxmKSBcCisgICAgKGFzc2VydChQeUJ5dGVBcnJheV9DaGVjayhzZWxmKSksIFwKKyAgICAgUHlfU0laRShzZWxmKSA/ICgoUHlCeXRlQXJyYXlPYmplY3QgKikoc2VsZikpLT5vYl9ieXRlcyA6IF9QeUJ5dGVBcnJheV9lbXB0eV9zdHJpbmcpCisjZGVmaW5lIFB5Qnl0ZUFycmF5X0dFVF9TSVpFKHNlbGYpICAoYXNzZXJ0KFB5Qnl0ZUFycmF5X0NoZWNrKHNlbGYpKSxQeV9TSVpFKHNlbGYpKQorCitQeUFQSV9EQVRBKGNoYXIpIF9QeUJ5dGVBcnJheV9lbXB0eV9zdHJpbmdbXTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQllURUFSUkFZT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVzX21ldGhvZHMuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVzX21ldGhvZHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTI1NjY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvYnl0ZXNfbWV0aG9kcy5oCkBAIC0wLDAgKzEsNzUgQEAKKyNpZm5kZWYgUHlfQllURVNfQ1RZUEVfSAorI2RlZmluZSBQeV9CWVRFU19DVFlQRV9ICisKKy8qCisgKiBUaGUgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gYmVoaW5kIFB5U3RyaW5nIChieXRlcykgYW5kIFB5Qnl0ZXMgKGJ1ZmZlcikKKyAqIG1ldGhvZHMgb2YgdGhlIGdpdmVuIG5hbWVzLCB0aGV5IG9wZXJhdGUgb24gQVNDSUkgYnl0ZSBzdHJpbmdzLgorICovCitleHRlcm4gUHlPYmplY3QqIF9QeV9ieXRlc19pc3NwYWNlKGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiBQeU9iamVjdCogX1B5X2J5dGVzX2lzYWxwaGEoY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIFB5T2JqZWN0KiBfUHlfYnl0ZXNfaXNhbG51bShjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gUHlPYmplY3QqIF9QeV9ieXRlc19pc2RpZ2l0KGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKK2V4dGVybiBQeU9iamVjdCogX1B5X2J5dGVzX2lzbG93ZXIoY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIFB5T2JqZWN0KiBfUHlfYnl0ZXNfaXN1cHBlcihjb25zdCBjaGFyICpjcHRyLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gUHlPYmplY3QqIF9QeV9ieXRlc19pc3RpdGxlKGNvbnN0IGNoYXIgKmNwdHIsIFB5X3NzaXplX3QgbGVuKTsKKworLyogVGhlc2Ugc3RvcmUgdGhlaXIgbGVuIHNpemVkIGFuc3dlciBpbiB0aGUgZ2l2ZW4gcHJlYWxsb2NhdGVkICpyZXN1bHQgYXJnLiAqLworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2xvd2VyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3VwcGVyKGNoYXIgKnJlc3VsdCwgY29uc3QgY2hhciAqY3B0ciwgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX3RpdGxlKGNoYXIgKnJlc3VsdCwgY2hhciAqcywgUHlfc3NpemVfdCBsZW4pOworZXh0ZXJuIHZvaWQgX1B5X2J5dGVzX2NhcGl0YWxpemUoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCBfUHlfYnl0ZXNfc3dhcGNhc2UoY2hhciAqcmVzdWx0LCBjaGFyICpzLCBQeV9zc2l6ZV90IGxlbik7CisKKy8qIFNoYXJlZCBfX2RvY19fIHN0cmluZ3MuICovCitleHRlcm4gY29uc3QgY2hhciBfUHlfaXNzcGFjZV9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9pc2FscGhhX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2lzYWxudW1fX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfaXNkaWdpdF9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9pc2xvd2VyX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X2lzdXBwZXJfX2RvY19fW107CitleHRlcm4gY29uc3QgY2hhciBfUHlfaXN0aXRsZV9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9sb3dlcl9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV91cHBlcl9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV90aXRsZV9fZG9jX19bXTsKK2V4dGVybiBjb25zdCBjaGFyIF9QeV9jYXBpdGFsaXplX19kb2NfX1tdOworZXh0ZXJuIGNvbnN0IGNoYXIgX1B5X3N3YXBjYXNlX19kb2NfX1tdOworCisvKiBUaGVzZSBhcmUgbGVmdCBpbiBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgd2lsbCBiZSByZW1vdmVkCisgICBpbiAyLjgvMy4yICovCisjZGVmaW5lIElTTE9XRVIoYykgIFB5X0lTTE9XRVIoYykKKyNkZWZpbmUgSVNVUFBFUihjKSAgUHlfSVNVUFBFUihjKQorI2RlZmluZSBJU0FMUEhBKGMpICBQeV9JU0FMUEhBKGMpCisjZGVmaW5lIElTRElHSVQoYykgIFB5X0lTRElHSVQoYykKKyNkZWZpbmUgSVNYRElHSVQoYykgUHlfSVNYRElHSVQoYykKKyNkZWZpbmUgSVNBTE5VTShjKSAgUHlfSVNBTE5VTShjKQorI2RlZmluZSBJU1NQQUNFKGMpICBQeV9JU1NQQUNFKGMpCisKKyN1bmRlZiBpc2xvd2VyCisjZGVmaW5lIGlzbG93ZXIoYykgdW5kZWZpbmVkX2lzbG93ZXIoYykKKyN1bmRlZiBpc3VwcGVyCisjZGVmaW5lIGlzdXBwZXIoYykgdW5kZWZpbmVkX2lzdXBwZXIoYykKKyN1bmRlZiBpc2FscGhhCisjZGVmaW5lIGlzYWxwaGEoYykgdW5kZWZpbmVkX2lzYWxwaGEoYykKKyN1bmRlZiBpc2RpZ2l0CisjZGVmaW5lIGlzZGlnaXQoYykgdW5kZWZpbmVkX2lzZGlnaXQoYykKKyN1bmRlZiBpc3hkaWdpdAorI2RlZmluZSBpc3hkaWdpdChjKSB1bmRlZmluZWRfaXN4ZGlnaXQoYykKKyN1bmRlZiBpc2FsbnVtCisjZGVmaW5lIGlzYWxudW0oYykgdW5kZWZpbmVkX2lzYWxudW0oYykKKyN1bmRlZiBpc3NwYWNlCisjZGVmaW5lIGlzc3BhY2UoYykgdW5kZWZpbmVkX2lzc3BhY2UoYykKKworLyogVGhlc2UgYXJlIGxlZnQgaW4gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYW5kIHdpbGwgYmUgcmVtb3ZlZAorICAgaW4gMi44LzMuMiAqLworI2RlZmluZSBUT0xPV0VSKGMpIFB5X1RPTE9XRVIoYykKKyNkZWZpbmUgVE9VUFBFUihjKSBQeV9UT1VQUEVSKGMpCisKKyN1bmRlZiB0b2xvd2VyCisjZGVmaW5lIHRvbG93ZXIoYykgdW5kZWZpbmVkX3RvbG93ZXIoYykKKyN1bmRlZiB0b3VwcGVyCisjZGVmaW5lIHRvdXBwZXIoYykgdW5kZWZpbmVkX3RvdXBwZXIoYykKKworLyogdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBzb21lIGRvY3MgYXJlIHNoYXJlZCBmcm9tIHRoZSAubywgbm90IHN0YXRpYyAqLworI2RlZmluZSBQeURvY19TVFJWQVJfc2hhcmVkKG5hbWUsc3RyKSBjb25zdCBjaGFyIG5hbWVbXSA9IFB5RG9jX1NUUihzdHIpCisKKyNlbmRpZiAvKiAhUHlfQllURVNfQ1RZUEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvYnl0ZXNvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVzb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA4M2RhOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2J5dGVzb2JqZWN0LmgKQEAgLTAsMCArMSwyNyBAQAorI2RlZmluZSBQeUJ5dGVzT2JqZWN0IFB5U3RyaW5nT2JqZWN0CisjZGVmaW5lIFB5Qnl0ZXNfVHlwZSBQeVN0cmluZ19UeXBlCisKKyNkZWZpbmUgUHlCeXRlc19DaGVjayBQeVN0cmluZ19DaGVjaworI2RlZmluZSBQeUJ5dGVzX0NoZWNrRXhhY3QgUHlTdHJpbmdfQ2hlY2tFeGFjdCAKKyNkZWZpbmUgUHlCeXRlc19DSEVDS19JTlRFUk5FRCBQeVN0cmluZ19DSEVDS19JTlRFUk5FRAorI2RlZmluZSBQeUJ5dGVzX0FTX1NUUklORyBQeVN0cmluZ19BU19TVFJJTkcKKyNkZWZpbmUgUHlCeXRlc19HRVRfU0laRSBQeVN0cmluZ19HRVRfU0laRQorI2RlZmluZSBQeV9UUEZMQUdTX0JZVEVTX1NVQkNMQVNTIFB5X1RQRkxBR1NfU1RSSU5HX1NVQkNMQVNTCisKKyNkZWZpbmUgUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZQorI2RlZmluZSBQeUJ5dGVzX0Zyb21TdHJpbmcgUHlTdHJpbmdfRnJvbVN0cmluZworI2RlZmluZSBQeUJ5dGVzX0Zyb21Gb3JtYXRWIFB5U3RyaW5nX0Zyb21Gb3JtYXRWCisjZGVmaW5lIFB5Qnl0ZXNfRnJvbUZvcm1hdCBQeVN0cmluZ19Gcm9tRm9ybWF0CisjZGVmaW5lIFB5Qnl0ZXNfU2l6ZSBQeVN0cmluZ19TaXplCisjZGVmaW5lIFB5Qnl0ZXNfQXNTdHJpbmcgUHlTdHJpbmdfQXNTdHJpbmcKKyNkZWZpbmUgUHlCeXRlc19SZXByIFB5U3RyaW5nX1JlcHIKKyNkZWZpbmUgUHlCeXRlc19Db25jYXQgUHlTdHJpbmdfQ29uY2F0CisjZGVmaW5lIFB5Qnl0ZXNfQ29uY2F0QW5kRGVsIFB5U3RyaW5nX0NvbmNhdEFuZERlbAorI2RlZmluZSBfUHlCeXRlc19SZXNpemUgX1B5U3RyaW5nX1Jlc2l6ZQorI2RlZmluZSBfUHlCeXRlc19FcSBfUHlTdHJpbmdfRXEKKyNkZWZpbmUgUHlCeXRlc19Gb3JtYXQgUHlTdHJpbmdfRm9ybWF0CisjZGVmaW5lIF9QeUJ5dGVzX0Zvcm1hdExvbmcgX1B5U3RyaW5nX0Zvcm1hdExvbmcKKyNkZWZpbmUgUHlCeXRlc19EZWNvZGVFc2NhcGUgUHlTdHJpbmdfRGVjb2RlRXNjYXBlCisjZGVmaW5lIF9QeUJ5dGVzX0pvaW4gX1B5U3RyaW5nX0pvaW4KKyNkZWZpbmUgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplCisjZGVmaW5lIF9QeUJ5dGVzX0luc2VydFRob3VzYW5kc0dyb3VwaW5nIF9QeVN0cmluZ19JbnNlcnRUaG91c2FuZHNHcm91cGluZwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvY1N0cmluZ0lPLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9jU3RyaW5nSU8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzNhNDcxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvY1N0cmluZ0lPLmgKQEAgLTAsMCArMSw3MyBAQAorI2lmbmRlZiBQeV9DU1RSSU5HSU9fSAorI2RlZmluZSBQeV9DU1RSSU5HSU9fSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorLyoKKworICBUaGlzIGhlYWRlciBwcm92aWRlcyBhY2Nlc3MgdG8gY1N0cmluZ0lPIG9iamVjdHMgZnJvbSBDLgorICBGdW5jdGlvbnMgYXJlIHByb3ZpZGVkIGZvciBjYWxsaW5nIGNTdHJpbmdJTyBvYmplY3RzIGFuZAorICBtYWNyb3MgYXJlIHByb3ZpZGVkIGZvciB0ZXN0aW5nIHdoZXRoZXIgeW91IGhhdmUgY1N0cmluZ0lPCisgIG9iamVjdHMuCisKKyAgQmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSBmdW5jdGlvbnMgb3IgbWFjcm9zLCB5b3UgbXVzdCBpbml0aWFsaXplCisgIHRoZSByb3V0aW5lcyB3aXRoOgorCisgICAgUHljU3RyaW5nX0lNUE9SVAorCisgIFRoaXMgd291bGQgdHlwaWNhbGx5IGJlIGRvbmUgaW4geW91ciBpbml0IGZ1bmN0aW9uLgorCisqLworCisjZGVmaW5lIFB5Y1N0cmluZ0lPX0NBUFNVTEVfTkFNRSAiY1N0cmluZ0lPLmNTdHJpbmdJT19DQVBJIgorCisjZGVmaW5lIFB5Y1N0cmluZ19JTVBPUlQgXAorICBQeWNTdHJpbmdJTyA9ICgoc3RydWN0IFB5Y1N0cmluZ0lPX0NBUEkqKVB5Q2Fwc3VsZV9JbXBvcnQoXAorICAgIFB5Y1N0cmluZ0lPX0NBUFNVTEVfTkFNRSwgMCkpCisKKy8qIEJhc2ljIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIGNTdHJpbmdJTyBvYmplY3RzIGZyb20gQyAqLworCitzdGF0aWMgc3RydWN0IFB5Y1N0cmluZ0lPX0NBUEkgeworCisgLyogUmVhZCBhIHN0cmluZyBmcm9tIGFuIGlucHV0IG9iamVjdC4gIElmIHRoZSBsYXN0IGFyZ3VtZW50CisgICAgaXMgLTEsIHRoZSByZW1haW5kZXIgd2lsbCBiZSByZWFkLgorICAgICovCisgIGludCgqY3JlYWQpKFB5T2JqZWN0ICosIGNoYXIgKiosIFB5X3NzaXplX3QpOworCisgLyogUmVhZCBhIGxpbmUgZnJvbSBhbiBpbnB1dCBvYmplY3QuICBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHJlYWQKKyAgICBsaW5lIGFzIGFuIGludCBhbmQgYSBwb2ludGVyIGluc2lkZSB0aGUgb2JqZWN0IGJ1ZmZlciBhcyBjaGFyKiogKHNvCisgICAgdGhlIGNhbGxlciBkb2Vzbid0IGhhdmUgdG8gcHJvdmlkZSBpdHMgb3duIGJ1ZmZlciBhcyBkZXN0aW5hdGlvbikuCisgICAgKi8KKyAgaW50KCpjcmVhZGxpbmUpKFB5T2JqZWN0ICosIGNoYXIgKiopOworCisgIC8qIFdyaXRlIGEgc3RyaW5nIHRvIGFuIG91dHB1dCBvYmplY3QqLworICBpbnQoKmN3cml0ZSkoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKKworICAvKiBHZXQgdGhlIG91dHB1dCBvYmplY3QgYXMgYSBQeXRob24gc3RyaW5nIChyZXR1cm5zIG5ldyByZWZlcmVuY2UpLiAqLworICBQeU9iamVjdCAqKCpjZ2V0dmFsdWUpKFB5T2JqZWN0ICopOworCisgIC8qIENyZWF0ZSBhIG5ldyBvdXRwdXQgb2JqZWN0ICovCisgIFB5T2JqZWN0ICooKk5ld091dHB1dCkoaW50KTsKKworICAvKiBDcmVhdGUgYW4gaW5wdXQgb2JqZWN0IGZyb20gYSBQeXRob24gc3RyaW5nCisgICAgIChjb3BpZXMgdGhlIFB5dGhvbiBzdHJpbmcgcmVmZXJlbmNlKS4KKyAgICAgKi8KKyAgUHlPYmplY3QgKigqTmV3SW5wdXQpKFB5T2JqZWN0ICopOworCisgIC8qIFRoZSBQeXRob24gdHlwZXMgZm9yIGNTdHJpbmdJTyBpbnB1dCBhbmQgb3V0cHV0IG9iamVjdHMuCisgICAgIE5vdGUgdGhhdCB5b3UgY2FuIGRvIGlucHV0IG9uIGFuIG91dHB1dCBvYmplY3QuCisgICAgICovCisgIFB5VHlwZU9iamVjdCAqSW5wdXRUeXBlLCAqT3V0cHV0VHlwZTsKKworfSAqUHljU3RyaW5nSU87CisKKy8qIFRoZXNlIGNhbiBiZSB1c2VkIHRvIHRlc3QgaWYgeW91IGhhdmUgb25lICovCisjZGVmaW5lIFB5Y1N0cmluZ0lPX0lucHV0Q2hlY2soTykgXAorICAoUHlfVFlQRShPKT09UHljU3RyaW5nSU8tPklucHV0VHlwZSkKKyNkZWZpbmUgUHljU3RyaW5nSU9fT3V0cHV0Q2hlY2soTykgXAorICAoUHlfVFlQRShPKT09UHljU3RyaW5nSU8tPk91dHB1dFR5cGUpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0NTVFJJTkdJT19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9jZWxsb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9jZWxsb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyN2VlNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2NlbGxvYmplY3QuaApAQCAtMCwwICsxLDI4IEBACisvKiBDZWxsIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9DRUxMT0JKRUNUX0gKKyNkZWZpbmUgUHlfQ0VMTE9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9IRUFECisJUHlPYmplY3QgKm9iX3JlZjsJLyogQ29udGVudCBvZiB0aGUgY2VsbCBvciBOVUxMIHdoZW4gZW1wdHkgKi8KK30gUHlDZWxsT2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlDZWxsX1R5cGU7CisKKyNkZWZpbmUgUHlDZWxsX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5Q2VsbF9UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q2VsbF9OZXcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q2VsbF9HZXQoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlDZWxsX1NldChQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworI2RlZmluZSBQeUNlbGxfR0VUKG9wKSAoKChQeUNlbGxPYmplY3QgKikob3ApKS0+b2JfcmVmKQorI2RlZmluZSBQeUNlbGxfU0VUKG9wLCB2KSAoKChQeUNlbGxPYmplY3QgKikob3ApKS0+b2JfcmVmID0gdikKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfVFVQTEVPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvY2V2YWwuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2NldmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4YmQyYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2NldmFsLmgKQEAgLTAsMCArMSwxNTMgQEAKKyNpZm5kZWYgUHlfQ0VWQUxfSAorI2RlZmluZSBQeV9DRVZBTF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogSW50ZXJmYWNlIHRvIHJhbmRvbSBwYXJ0cyBpbiBjZXZhbC5jICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCisgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKy8qIElubGluZSB0aGlzICovCisjZGVmaW5lIFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsYXJnKSBcCisgICAgUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoZnVuYywgYXJnLCAoUHlPYmplY3QgKilOVUxMKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9DYWxsRnVuY3Rpb24oUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9DYWxsTWV0aG9kKFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfU2V0UHJvZmlsZShQeV90cmFjZWZ1bmMsIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfU2V0VHJhY2UoUHlfdHJhY2VmdW5jLCBQeU9iamVjdCAqKTsKKworc3RydWN0IF9mcmFtZTsgLyogQXZvaWQgaW5jbHVkaW5nIGZyYW1lb2JqZWN0LmggKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfR2V0QnVpbHRpbnModm9pZCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9HZXRHbG9iYWxzKHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUV2YWxfR2V0TG9jYWxzKHZvaWQpOworUHlBUElfRlVOQyhzdHJ1Y3QgX2ZyYW1lICopIFB5RXZhbF9HZXRGcmFtZSh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUV2YWxfR2V0UmVzdHJpY3RlZCh2b2lkKTsKKworLyogTG9vayBhdCB0aGUgY3VycmVudCBmcmFtZSdzIChpZiBhbnkpIGNvZGUncyBjb19mbGFncywgYW5kIHR1cm4gb24KKyAgIHRoZSBjb3JyZXNwb25kaW5nIGNvbXBpbGVyIGZsYWdzIGluIGNmLT5jZl9mbGFncy4gIFJldHVybiAxIGlmIGFueQorICAgZmxhZyB3YXMgc2V0LCBlbHNlIHJldHVybiAwLiAqLworUHlBUElfRlVOQyhpbnQpIFB5RXZhbF9NZXJnZUNvbXBpbGVyRmxhZ3MoUHlDb21waWxlckZsYWdzICpjZik7CisKK1B5QVBJX0ZVTkMoaW50KSBQeV9GbHVzaExpbmUodm9pZCk7CisKK1B5QVBJX0ZVTkMoaW50KSBQeV9BZGRQZW5kaW5nQ2FsbChpbnQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpOworUHlBUElfRlVOQyhpbnQpIFB5X01ha2VQZW5kaW5nQ2FsbHModm9pZCk7CisKKy8qIFByb3RlY3Rpb24gYWdhaW5zdCBkZWVwbHkgbmVzdGVkIHJlY3Vyc2l2ZSBjYWxscyAqLworUHlBUElfRlVOQyh2b2lkKSBQeV9TZXRSZWN1cnNpb25MaW1pdChpbnQpOworUHlBUElfRlVOQyhpbnQpIFB5X0dldFJlY3Vyc2lvbkxpbWl0KHZvaWQpOworCisjZGVmaW5lIFB5X0VudGVyUmVjdXJzaXZlQ2FsbCh3aGVyZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoX1B5X01ha2VSZWNDaGVjayhQeVRocmVhZFN0YXRlX0dFVCgpLT5yZWN1cnNpb25fZGVwdGgpICYmICBcCisgICAgICAgICAgICAgX1B5X0NoZWNrUmVjdXJzaXZlQ2FsbCh3aGVyZSkpCisjZGVmaW5lIFB5X0xlYXZlUmVjdXJzaXZlQ2FsbCgpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICgtLVB5VGhyZWFkU3RhdGVfR0VUKCktPnJlY3Vyc2lvbl9kZXB0aCkKK1B5QVBJX0ZVTkMoaW50KSBfUHlfQ2hlY2tSZWN1cnNpdmVDYWxsKGNoYXIgKndoZXJlKTsKK1B5QVBJX0RBVEEoaW50KSBfUHlfQ2hlY2tSZWN1cnNpb25MaW1pdDsKKyNpZmRlZiBVU0VfU1RBQ0tDSEVDSworIyAgZGVmaW5lIF9QeV9NYWtlUmVjQ2hlY2soeCkgICgrKyh4KSA+IC0tX1B5X0NoZWNrUmVjdXJzaW9uTGltaXQpCisjZWxzZQorIyAgZGVmaW5lIF9QeV9NYWtlUmVjQ2hlY2soeCkgICgrKyh4KSA+IF9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0KQorI2VuZGlmCisKK1B5QVBJX0ZVTkMoY29uc3QgY2hhciAqKSBQeUV2YWxfR2V0RnVuY05hbWUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlFdmFsX0dldEZ1bmNEZXNjKFB5T2JqZWN0ICopOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9HZXRDYWxsU3RhdHMoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9FdmFsRnJhbWUoc3RydWN0IF9mcmFtZSAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0V2YWxGcmFtZUV4KHN0cnVjdCBfZnJhbWUgKmYsIGludCBleGMpOworCisvKiB0aGlzIHVzZWQgdG8gYmUgaGFuZGxlZCBvbiBhIHBlci10aHJlYWQgYmFzaXMgLSBub3cganVzdCB0d28gZ2xvYmFscyAqLworUHlBUElfREFUQSh2b2xhdGlsZSBpbnQpIF9QeV9UaWNrZXI7CitQeUFQSV9EQVRBKGludCkgX1B5X0NoZWNrSW50ZXJ2YWw7CisKKy8qIEludGVyZmFjZSBmb3IgdGhyZWFkcy4KKworICAgQSBtb2R1bGUgdGhhdCBwbGFucyB0byBkbyBhIGJsb2NraW5nIHN5c3RlbSBjYWxsIChvciBzb21ldGhpbmcgZWxzZQorICAgdGhhdCBsYXN0cyBhIGxvbmcgdGltZSBhbmQgZG9lc24ndCB0b3VjaCBQeXRob24gZGF0YSkgY2FuIGFsbG93IG90aGVyCisgICB0aHJlYWRzIHRvIHJ1biBhcyBmb2xsb3dzOgorCisgICAgLi4ucHJlcGFyYXRpb25zIGhlcmUuLi4KKyAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisgICAgLi4uYmxvY2tpbmcgc3lzdGVtIGNhbGwgaGVyZS4uLgorICAgIFB5X0VORF9BTExPV19USFJFQURTCisgICAgLi4uaW50ZXJwcmV0IHJlc3VsdCBoZXJlLi4uCisKKyAgIFRoZSBQeV9CRUdJTl9BTExPV19USFJFQURTL1B5X0VORF9BTExPV19USFJFQURTIHBhaXIgZXhwYW5kcyB0byBhCisgICB7fS1zdXJyb3VuZGVkIGJsb2NrLgorICAgVG8gbGVhdmUgdGhlIGJsb2NrIGluIHRoZSBtaWRkbGUgKGUuZy4sIHdpdGggcmV0dXJuKSwgeW91IG11c3QgaW5zZXJ0CisgICBhIGxpbmUgY29udGFpbmluZyBQeV9CTE9DS19USFJFQURTIGJlZm9yZSB0aGUgcmV0dXJuLCBlLmcuCisKKyAgICBpZiAoLi4ucHJlbWF0dXJlX2V4aXQuLi4pIHsKKyAgICAgICAgUHlfQkxPQ0tfVEhSRUFEUworICAgICAgICBQeUVycl9TZXRGcm9tRXJybm8oUHlFeGNfSU9FcnJvcik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgQW4gYWx0ZXJuYXRpdmUgaXM6CisKKyAgICBQeV9CTE9DS19USFJFQURTCisgICAgaWYgKC4uLnByZW1hdHVyZV9leGl0Li4uKSB7CisgICAgICAgIFB5RXJyX1NldEZyb21FcnJubyhQeUV4Y19JT0Vycm9yKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIFB5X1VOQkxPQ0tfVEhSRUFEUworCisgICBGb3IgY29udmVuaWVuY2UsIHRoYXQgdGhlIHZhbHVlIG9mICdlcnJubycgaXMgcmVzdG9yZWQgYWNyb3NzCisgICBQeV9FTkRfQUxMT1dfVEhSRUFEUyBhbmQgUHlfQkxPQ0tfVEhSRUFEUy4KKworICAgV0FSTklORzogTkVWRVIgTkVTVCBDQUxMUyBUTyBQeV9CRUdJTl9BTExPV19USFJFQURTIEFORAorICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMhISEKKworICAgVGhlIGZ1bmN0aW9uIFB5RXZhbF9Jbml0VGhyZWFkcygpIHNob3VsZCBiZSBjYWxsZWQgb25seSBmcm9tCisgICBpbml0dGhyZWFkKCkgaW4gInRocmVhZG1vZHVsZS5jIi4KKworICAgTm90ZSB0aGF0IG5vdCB5ZXQgYWxsIGNhbmRpZGF0ZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCB0byB1c2UgdGhpcworICAgbWVjaGFuaXNtIQorKi8KKworUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5RXZhbF9TYXZlVGhyZWFkKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfUmVzdG9yZVRocmVhZChQeVRocmVhZFN0YXRlICopOworCisjaWZkZWYgV0lUSF9USFJFQUQKKworUHlBUElfRlVOQyhpbnQpICBQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfSW5pdFRocmVhZHModm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXZhbF9BY3F1aXJlTG9jayh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFdmFsX1JlbGVhc2VMb2NrKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfQWNxdWlyZVRocmVhZChQeVRocmVhZFN0YXRlICp0c3RhdGUpOworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfUmVsZWFzZVRocmVhZChQeVRocmVhZFN0YXRlICp0c3RhdGUpOworUHlBUElfRlVOQyh2b2lkKSBQeUV2YWxfUmVJbml0VGhyZWFkcyh2b2lkKTsKKworI2RlZmluZSBQeV9CRUdJTl9BTExPV19USFJFQURTIHsgXAorICAgICAgICAgICAgICAgICAgICAgICAgUHlUaHJlYWRTdGF0ZSAqX3NhdmU7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zYXZlID0gUHlFdmFsX1NhdmVUaHJlYWQoKTsKKyNkZWZpbmUgUHlfQkxPQ0tfVEhSRUFEUyAgICAgICAgUHlFdmFsX1Jlc3RvcmVUaHJlYWQoX3NhdmUpOworI2RlZmluZSBQeV9VTkJMT0NLX1RIUkVBRFMgICAgICBfc2F2ZSA9IFB5RXZhbF9TYXZlVGhyZWFkKCk7CisjZGVmaW5lIFB5X0VORF9BTExPV19USFJFQURTICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zYXZlKTsgXAorICAgICAgICAgICAgICAgICB9CisKKyNlbHNlIC8qICFXSVRIX1RIUkVBRCAqLworCisjZGVmaW5lIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMgeworI2RlZmluZSBQeV9CTE9DS19USFJFQURTCisjZGVmaW5lIFB5X1VOQkxPQ0tfVEhSRUFEUworI2RlZmluZSBQeV9FTkRfQUxMT1dfVEhSRUFEUyB9CisKKyNlbmRpZiAvKiAhV0lUSF9USFJFQUQgKi8KKworUHlBUElfRlVOQyhpbnQpIF9QeUV2YWxfU2xpY2VJbmRleChQeU9iamVjdCAqLCBQeV9zc2l6ZV90ICopOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0NFVkFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2NsYXNzb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9jbGFzc29iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDNlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9jbGFzc29iamVjdC5oCkBAIC0wLDAgKzEsODMgQEAKKworLyogQ2xhc3Mgb2JqZWN0IGludGVyZmFjZSAqLworCisvKiBSZXZlYWxpbmcgc29tZSBzdHJ1Y3R1cmVzIChub3QgZm9yIGdlbmVyYWwgdXNlKSAqLworCisjaWZuZGVmIFB5X0NMQVNTT0JKRUNUX0gKKyNkZWZpbmUgUHlfQ0xBU1NPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0CSpjbF9iYXNlczsJLyogQSB0dXBsZSBvZiBjbGFzcyBvYmplY3RzICovCisgICAgUHlPYmplY3QJKmNsX2RpY3Q7CS8qIEEgZGljdGlvbmFyeSAqLworICAgIFB5T2JqZWN0CSpjbF9uYW1lOwkvKiBBIHN0cmluZyAqLworICAgIC8qIFRoZSBmb2xsb3dpbmcgdGhyZWUgYXJlIGZ1bmN0aW9ucyBvciBOVUxMICovCisgICAgUHlPYmplY3QJKmNsX2dldGF0dHI7CisgICAgUHlPYmplY3QJKmNsX3NldGF0dHI7CisgICAgUHlPYmplY3QJKmNsX2RlbGF0dHI7CisgICAgUHlPYmplY3QgICAgKmNsX3dlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworfSBQeUNsYXNzT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5Q2xhc3NPYmplY3QgKmluX2NsYXNzOwkvKiBUaGUgY2xhc3Mgb2JqZWN0ICovCisgICAgUHlPYmplY3QJICAqaW5fZGljdDsJLyogQSBkaWN0aW9uYXJ5ICovCisgICAgUHlPYmplY3QJICAqaW5fd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCit9IFB5SW5zdGFuY2VPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmltX2Z1bmM7ICAgLyogVGhlIGNhbGxhYmxlIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIG1ldGhvZCAqLworICAgIFB5T2JqZWN0ICppbV9zZWxmOyAgIC8qIFRoZSBpbnN0YW5jZSBpdCBpcyBib3VuZCB0bywgb3IgTlVMTCAqLworICAgIFB5T2JqZWN0ICppbV9jbGFzczsgIC8qIFRoZSBjbGFzcyB0aGF0IGFza2VkIGZvciB0aGUgbWV0aG9kICovCisgICAgUHlPYmplY3QgKmltX3dlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworfSBQeU1ldGhvZE9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Q2xhc3NfVHlwZSwgUHlJbnN0YW5jZV9UeXBlLCBQeU1ldGhvZF9UeXBlOworCisjZGVmaW5lIFB5Q2xhc3NfQ2hlY2sob3ApICgob3ApLT5vYl90eXBlID09ICZQeUNsYXNzX1R5cGUpCisjZGVmaW5lIFB5SW5zdGFuY2VfQ2hlY2sob3ApICgob3ApLT5vYl90eXBlID09ICZQeUluc3RhbmNlX1R5cGUpCisjZGVmaW5lIFB5TWV0aG9kX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmUHlNZXRob2RfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNsYXNzX05ldyhQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbnN0YW5jZV9OZXcoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW5zdGFuY2VfTmV3UmF3KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1ldGhvZF9OZXcoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNZXRob2RfRnVuY3Rpb24oUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWV0aG9kX1NlbGYoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWV0aG9kX0NsYXNzKFB5T2JqZWN0ICopOworCisvKiBMb29rIHVwIGF0dHJpYnV0ZSB3aXRoIG5hbWUgKGEgc3RyaW5nKSBvbiBpbnN0YW5jZSBvYmplY3QgcGluc3QsIHVzaW5nCisgKiBvbmx5IHRoZSBpbnN0YW5jZSBhbmQgYmFzZSBjbGFzcyBkaWN0cy4gIElmIGEgZGVzY3JpcHRvciBpcyBmb3VuZCBpbgorICogYSBjbGFzcyBkaWN0LCB0aGUgZGVzY3JpcHRvciBpcyByZXR1cm5lZCB3aXRob3V0IGNhbGxpbmcgaXQuCisgKiBSZXR1cm5zIE5VTEwgaWYgbm90aGluZyBmb3VuZCwgZWxzZSBhIGJvcnJvd2VkIHJlZmVyZW5jZSB0byB0aGUKKyAqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBuYW1lIGluIHRoZSBkaWN0IGluIHdoaWNoIG5hbWUgd2FzIGZvdW5kLgorICogVGhlIHBvaW50IG9mIHRoaXMgcm91dGluZSBpcyB0aGF0IGl0IG5ldmVyIGNhbGxzIGFyYml0cmFyeSBQeXRob24KKyAqIGNvZGUsIHNvIGlzIGFsd2F5cyAic2FmZSI6ICBhbGwgaXQgZG9lcyBpcyBkaWN0IGxvb2t1cHMuICBUaGUgZnVuY3Rpb24KKyAqIGNhbid0IGZhaWwsIG5ldmVyIHNldHMgYW4gZXhjZXB0aW9uLCBhbmQgTlVMTCBpcyBub3QgYW4gZXJyb3IgKGl0IGp1c3QKKyAqIG1lYW5zICJub3QgZm91bmQiKS4KKyAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlJbnN0YW5jZV9Mb29rdXAoUHlPYmplY3QgKnBpbnN0LCBQeU9iamVjdCAqbmFtZSk7CisKKy8qIE1hY3JvcyBmb3IgZGlyZWN0IGFjY2VzcyB0byB0aGVzZSB2YWx1ZXMuIFR5cGUgY2hlY2tzIGFyZSAqbm90KgorICAgZG9uZSwgc28gdXNlIHdpdGggY2FyZS4gKi8KKyNkZWZpbmUgUHlNZXRob2RfR0VUX0ZVTkNUSU9OKG1ldGgpIFwKKyAgICAgICAgKCgoUHlNZXRob2RPYmplY3QgKiltZXRoKSAtPiBpbV9mdW5jKQorI2RlZmluZSBQeU1ldGhvZF9HRVRfU0VMRihtZXRoKSBcCisJKCgoUHlNZXRob2RPYmplY3QgKiltZXRoKSAtPiBpbV9zZWxmKQorI2RlZmluZSBQeU1ldGhvZF9HRVRfQ0xBU1MobWV0aCkgXAorCSgoKFB5TWV0aG9kT2JqZWN0ICopbWV0aCkgLT4gaW1fY2xhc3MpCisKK1B5QVBJX0ZVTkMoaW50KSBQeUNsYXNzX0lzU3ViY2xhc3MoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKK1B5QVBJX0ZVTkMoaW50KSBQeU1ldGhvZF9DbGVhckZyZWVMaXN0KHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DTEFTU09CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9jb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9jb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzY2Q5YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2NvYmplY3QuaApAQCAtMCwwICsxLDg5IEBACisvKgorICAgQ09iamVjdHMgYXJlIG1hcmtlZCBQZW5kaW5nIERlcHJlY2F0aW9uIGFzIG9mIFB5dGhvbiAyLjcuCisgICBUaGUgZnVsbCBzY2hlZHVsZSBmb3IgMi54IGlzIGFzIGZvbGxvd3M6CisgICAgIC0gQ09iamVjdHMgYXJlIG1hcmtlZCBQZW5kaW5nIERlcHJlY2F0aW9uIGluIFB5dGhvbiAyLjcuCisgICAgIC0gQ09iamVjdHMgd2lsbCBiZSBtYXJrZWQgRGVwcmVjYXRlZCBpbiBQeXRob24gMi44CisgICAgICAgKGlmIHRoZXJlIGlzIG9uZSkuCisgICAgIC0gQ09iamVjdHMgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAyLjkgKGlmIHRoZXJlIGlzIG9uZSkuCisKKyAgIEFkZGl0aW9uYWxseSwgZm9yIHRoZSBQeXRob24gMy54IHNlcmllczoKKyAgICAgLSBDT2JqZWN0cyB3ZXJlIG1hcmtlZCBEZXByZWNhdGVkIGluIFB5dGhvbiAzLjEuCisgICAgIC0gQ09iamVjdHMgd2lsbCBiZSByZW1vdmVkIGluIFB5dGhvbiAzLjIuCisKKyAgIFlvdSBzaG91bGQgc3dpdGNoIGFsbCB1c2Ugb2YgQ09iamVjdHMgdG8gY2Fwc3VsZXMuICBDYXBzdWxlcworICAgaGF2ZSBhIHNhZmVyIGFuZCBtb3JlIGNvbnNpc3RlbnQgQVBJLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sCisgICBzZWUgSW5jbHVkZS9weWNhcHN1bGUuaCwgb3IgcmVhZCB0aGUgIkNhcHN1bGVzIiB0b3BpYyBpbgorICAgdGhlICJQeXRob24vQyBBUEkgUmVmZXJlbmNlIE1hbnVhbCIuCisKKyAgIFB5dGhvbiAyLjcgbm8gbG9uZ2VyIHVzZXMgQ09iamVjdHMgaXRzZWxmOyBhbGwgb2JqZWN0cyB3aGljaAorICAgd2VyZSBmb3JtZXJseSBDT2JqZWN0cyBhcmUgbm93IGNhcHN1bGVzLiAgTm90ZSB0aGF0IHRoaXMgY2hhbmdlCisgICBkb2VzIG5vdCBieSBpdHNlbGYgYnJlYWsgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBleHRlbnNpb25zCisgICBidWlsdCBmb3IgcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uLS1QeUNPYmplY3RfQXNWb2lkUHRyKCkKKyAgIGhhcyBiZWVuIGNoYW5nZWQgdG8gYWxzbyB1bmRlcnN0YW5kIGNhcHN1bGVzLgorCisqLworCisvKiBvcmlnaW5hbCBmaWxlIGhlYWRlciBjb21tZW50IGZvbGxvd3M6ICovCisKKy8qIEMgb2JqZWN0cyB0byBiZSBleHBvcnRlZCBmcm9tIG9uZSBleHRlbnNpb24gbW9kdWxlIHRvIGFub3RoZXIuCisgCisgICBDIG9iamVjdHMgYXJlIHVzZWQgZm9yIGNvbW11bmljYXRpb24gYmV0d2VlbiBleHRlbnNpb24gbW9kdWxlcy4KKyAgIFRoZXkgcHJvdmlkZSBhIHdheSBmb3IgYW4gZXh0ZW5zaW9uIG1vZHVsZSB0byBleHBvcnQgYSBDIGludGVyZmFjZQorICAgdG8gb3RoZXIgZXh0ZW5zaW9uIG1vZHVsZXMsIHNvIHRoYXQgZXh0ZW5zaW9uIG1vZHVsZXMgY2FuIHVzZSB0aGUKKyAgIFB5dGhvbiBpbXBvcnQgbWVjaGFuaXNtIHRvIGxpbmsgdG8gb25lIGFub3RoZXIuCisKKyovCisKKyNpZm5kZWYgUHlfQ09CSkVDVF9ICisjZGVmaW5lIFB5X0NPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlDT2JqZWN0X1R5cGU7CisKKyNkZWZpbmUgUHlDT2JqZWN0X0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5Q09iamVjdF9UeXBlKQorCisvKiBDcmVhdGUgYSBQeUNPYmplY3QgZnJvbSBhIHBvaW50ZXIgdG8gYSBDIG9iamVjdCBhbmQgYW4gb3B0aW9uYWwKKyAgIGRlc3RydWN0b3IgZnVuY3Rpb24uICBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vbi1udWxsLCB0aGVuIGl0CisgICB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBmaXJzdCBhcmd1bWVudCBpZiBhbmQgd2hlbiB0aGUgUHlDT2JqZWN0IGlzCisgICBkZXN0cm95ZWQuCisKKyovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q09iamVjdF9Gcm9tVm9pZFB0cigKKwl2b2lkICpjb2JqLCB2b2lkICgqZGVzdHJ1Y3QpKHZvaWQqKSk7CisKKworLyogQ3JlYXRlIGEgUHlDT2JqZWN0IGZyb20gYSBwb2ludGVyIHRvIGEgQyBvYmplY3QsIGEgZGVzY3JpcHRpb24gb2JqZWN0LAorICAgYW5kIGFuIG9wdGlvbmFsIGRlc3RydWN0b3IgZnVuY3Rpb24uICBJZiB0aGUgdGhpcmQgYXJndW1lbnQgaXMgbm9uLW51bGwsCisgICB0aGVuIGl0IHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIGZpcnN0IGFuZCBzZWNvbmQgYXJndW1lbnRzIGlmIGFuZCB3aGVuIAorICAgdGhlIFB5Q09iamVjdCBpcyBkZXN0cm95ZWQuCisqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNPYmplY3RfRnJvbVZvaWRQdHJBbmREZXNjKAorCXZvaWQgKmNvYmosIHZvaWQgKmRlc2MsIHZvaWQgKCpkZXN0cnVjdCkodm9pZCosdm9pZCopKTsKKworLyogUmV0cmlldmUgYSBwb2ludGVyIHRvIGEgQyBvYmplY3QgZnJvbSBhIFB5Q09iamVjdC4gKi8KK1B5QVBJX0ZVTkModm9pZCAqKSBQeUNPYmplY3RfQXNWb2lkUHRyKFB5T2JqZWN0ICopOworCisvKiBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gYSBkZXNjcmlwdGlvbiBvYmplY3QgZnJvbSBhIFB5Q09iamVjdC4gKi8KK1B5QVBJX0ZVTkModm9pZCAqKSBQeUNPYmplY3RfR2V0RGVzYyhQeU9iamVjdCAqKTsKKworLyogSW1wb3J0IGEgcG9pbnRlciB0byBhIEMgb2JqZWN0IGZyb20gYSBtb2R1bGUgdXNpbmcgYSBQeUNPYmplY3QuICovCitQeUFQSV9GVU5DKHZvaWQgKikgUHlDT2JqZWN0X0ltcG9ydChjaGFyICptb2R1bGVfbmFtZSwgY2hhciAqY29iamVjdF9uYW1lKTsKKworLyogTW9kaWZ5IGEgQyBvYmplY3QuIEZhaWxzICg9PTApIGlmIG9iamVjdCBoYXMgYSBkZXN0cnVjdG9yLiAqLworUHlBUElfRlVOQyhpbnQpIFB5Q09iamVjdF9TZXRWb2lkUHRyKFB5T2JqZWN0ICpzZWxmLCB2b2lkICpjb2JqKTsKKworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHZvaWQgKmNvYmplY3Q7CisgICAgdm9pZCAqZGVzYzsKKyAgICB2b2lkICgqZGVzdHJ1Y3Rvcikodm9pZCAqKTsKK30gUHlDT2JqZWN0OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0NPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvY29kZS5oIGIvaW5jbHVkZS9weXRob24yLjcvY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjI5NTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9jb2RlLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qIERlZmluaXRpb25zIGZvciBieXRlY29kZSAqLworCisjaWZuZGVmIFB5X0NPREVfSAorI2RlZmluZSBQeV9DT0RFX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQnl0ZWNvZGUgb2JqZWN0ICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGludCBjb19hcmdjb3VudDsJCS8qICNhcmd1bWVudHMsIGV4Y2VwdCAqYXJncyAqLworICAgIGludCBjb19ubG9jYWxzOwkJLyogI2xvY2FsIHZhcmlhYmxlcyAqLworICAgIGludCBjb19zdGFja3NpemU7CQkvKiAjZW50cmllcyBuZWVkZWQgZm9yIGV2YWx1YXRpb24gc3RhY2sgKi8KKyAgICBpbnQgY29fZmxhZ3M7CQkvKiBDT18uLi4sIHNlZSBiZWxvdyAqLworICAgIFB5T2JqZWN0ICpjb19jb2RlOwkJLyogaW5zdHJ1Y3Rpb24gb3Bjb2RlcyAqLworICAgIFB5T2JqZWN0ICpjb19jb25zdHM7CS8qIGxpc3QgKGNvbnN0YW50cyB1c2VkKSAqLworICAgIFB5T2JqZWN0ICpjb19uYW1lczsJCS8qIGxpc3Qgb2Ygc3RyaW5ncyAobmFtZXMgdXNlZCkgKi8KKyAgICBQeU9iamVjdCAqY29fdmFybmFtZXM7CS8qIHR1cGxlIG9mIHN0cmluZ3MgKGxvY2FsIHZhcmlhYmxlIG5hbWVzKSAqLworICAgIFB5T2JqZWN0ICpjb19mcmVldmFyczsJLyogdHVwbGUgb2Ygc3RyaW5ncyAoZnJlZSB2YXJpYWJsZSBuYW1lcykgKi8KKyAgICBQeU9iamVjdCAqY29fY2VsbHZhcnM7ICAgICAgLyogdHVwbGUgb2Ygc3RyaW5ncyAoY2VsbCB2YXJpYWJsZSBuYW1lcykgKi8KKyAgICAvKiBUaGUgcmVzdCBkb2Vzbid0IGNvdW50IGZvciBoYXNoL2NtcCAqLworICAgIFB5T2JqZWN0ICpjb19maWxlbmFtZTsJLyogc3RyaW5nICh3aGVyZSBpdCB3YXMgbG9hZGVkIGZyb20pICovCisgICAgUHlPYmplY3QgKmNvX25hbWU7CQkvKiBzdHJpbmcgKG5hbWUsIGZvciByZWZlcmVuY2UpICovCisgICAgaW50IGNvX2ZpcnN0bGluZW5vOwkJLyogZmlyc3Qgc291cmNlIGxpbmUgbnVtYmVyICovCisgICAgUHlPYmplY3QgKmNvX2xub3RhYjsJLyogc3RyaW5nIChlbmNvZGluZyBhZGRyPC0+bGluZW5vIG1hcHBpbmcpIFNlZQorCQkJCSAgIE9iamVjdHMvbG5vdGFiX25vdGVzLnR4dCBmb3IgZGV0YWlscy4gKi8KKyAgICB2b2lkICpjb196b21iaWVmcmFtZTsgICAgIC8qIGZvciBvcHRpbWl6YXRpb24gb25seSAoc2VlIGZyYW1lb2JqZWN0LmMpICovCisgICAgUHlPYmplY3QgKmNvX3dlYWtyZWZsaXN0OyAgIC8qIHRvIHN1cHBvcnQgd2Vha3JlZnMgdG8gY29kZSBvYmplY3RzICovCit9IFB5Q29kZU9iamVjdDsKKworLyogTWFza3MgZm9yIGNvX2ZsYWdzIGFib3ZlICovCisjZGVmaW5lIENPX09QVElNSVpFRAkweDAwMDEKKyNkZWZpbmUgQ09fTkVXTE9DQUxTCTB4MDAwMgorI2RlZmluZSBDT19WQVJBUkdTCTB4MDAwNAorI2RlZmluZSBDT19WQVJLRVlXT1JEUwkweDAwMDgKKyNkZWZpbmUgQ09fTkVTVEVEICAgICAgIDB4MDAxMAorI2RlZmluZSBDT19HRU5FUkFUT1IgICAgMHgwMDIwCisvKiBUaGUgQ09fTk9GUkVFIGZsYWcgaXMgc2V0IGlmIHRoZXJlIGFyZSBubyBmcmVlIG9yIGNlbGwgdmFyaWFibGVzLgorICAgVGhpcyBpbmZvcm1hdGlvbiBpcyByZWR1bmRhbnQsIGJ1dCBpdCBhbGxvd3MgYSBzaW5nbGUgZmxhZyB0ZXN0CisgICB0byBkZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhbnkgZXh0cmEgd29yayB0byBiZSBkb25lIHdoZW4gdGhlCisgICBjYWxsIGZyYW1lIGl0IHNldHVwLgorKi8KKyNkZWZpbmUgQ09fTk9GUkVFICAgICAgIDB4MDA0MAorCisjaWYgMAorLyogVGhpcyBpcyBubyBsb25nZXIgdXNlZC4gIFN0b3BwZWQgZGVmaW5pbmcgaW4gMi41LCBkbyBub3QgcmUtdXNlLiAqLworI2RlZmluZSBDT19HRU5FUkFUT1JfQUxMT1dFRCAgICAweDEwMDAKKyNlbmRpZgorI2RlZmluZSBDT19GVVRVUkVfRElWSVNJT04gICAgCTB4MjAwMAorI2RlZmluZSBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUIDB4NDAwMCAvKiBkbyBhYnNvbHV0ZSBpbXBvcnRzIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgQ09fRlVUVVJFX1dJVEhfU1RBVEVNRU5UICAweDgwMDAKKyNkZWZpbmUgQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OICAweDEwMDAwCisjZGVmaW5lIENPX0ZVVFVSRV9VTklDT0RFX0xJVEVSQUxTIDB4MjAwMDAKKworLyogVGhpcyBzaG91bGQgYmUgZGVmaW5lZCBpZiBhIGZ1dHVyZSBzdGF0ZW1lbnQgbW9kaWZpZXMgdGhlIHN5bnRheC4KKyAgIEZvciBleGFtcGxlLCB3aGVuIGEga2V5d29yZCBpcyBhZGRlZC4KKyovCisjaWYgMQorI2RlZmluZSBQWV9QQVJTRVJfUkVRVUlSRVNfRlVUVVJFX0tFWVdPUkQKKyNlbmRpZgorCisjZGVmaW5lIENPX01BWEJMT0NLUyAyMCAvKiBNYXggc3RhdGljIGJsb2NrIG5lc3Rpbmcgd2l0aGluIGEgZnVuY3Rpb24gKi8KKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Q29kZV9UeXBlOworCisjZGVmaW5lIFB5Q29kZV9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeUNvZGVfVHlwZSkKKyNkZWZpbmUgUHlDb2RlX0dldE51bUZyZWUob3ApIChQeVR1cGxlX0dFVF9TSVpFKChvcCktPmNvX2ZyZWV2YXJzKSkKKworLyogUHVibGljIGludGVyZmFjZSAqLworUHlBUElfRlVOQyhQeUNvZGVPYmplY3QgKikgUHlDb2RlX05ldygKKwlpbnQsIGludCwgaW50LCBpbnQsIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCisJUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgaW50LCBQeU9iamVjdCAqKTsgCisgICAgICAgIC8qIHNhbWUgYXMgc3RydWN0IGFib3ZlICovCisKKy8qIENyZWF0ZXMgYSBuZXcgZW1wdHkgY29kZSBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIHNvdXJjZSBsb2NhdGlvbi4gKi8KK1B5QVBJX0ZVTkMoUHlDb2RlT2JqZWN0ICopCitQeUNvZGVfTmV3RW1wdHkoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmZ1bmNuYW1lLCBpbnQgZmlyc3RsaW5lbm8pOworCisvKiBSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGJ5dGVjb2RlIGluZGV4CisgICBpbiB0aGlzIGNvZGUgb2JqZWN0LiAgSWYgeW91IGp1c3QgbmVlZCB0aGUgbGluZSBudW1iZXIgb2YgYSBmcmFtZSwKKyAgIHVzZSBQeUZyYW1lX0dldExpbmVOdW1iZXIoKSBpbnN0ZWFkLiAqLworUHlBUElfRlVOQyhpbnQpIFB5Q29kZV9BZGRyMkxpbmUoUHlDb2RlT2JqZWN0ICosIGludCk7CisKKy8qIGZvciBpbnRlcm5hbCB1c2Ugb25seSAqLworI2RlZmluZSBfUHlDb2RlX0dFVENPREVQVFIoY28sIHBwKSBcCisJKCgqUHlfVFlQRSgoY28pLT5jb19jb2RlKS0+dHBfYXNfYnVmZmVyLT5iZl9nZXRyZWFkYnVmZmVyKSBcCisJICgoY28pLT5jb19jb2RlLCAwLCAodm9pZCAqKikocHApKSkKKwordHlwZWRlZiBzdHJ1Y3QgX2FkZHJfcGFpciB7CisgICAgICAgIGludCBhcF9sb3dlcjsKKyAgICAgICAgaW50IGFwX3VwcGVyOworfSBQeUFkZHJQYWlyOworCisvKiBVcGRhdGUgKmJvdW5kcyB0byBkZXNjcmliZSB0aGUgZmlyc3QgYW5kIG9uZS1wYXN0LXRoZS1sYXN0IGluc3RydWN0aW9ucyBpbiB0aGUKKyAgIHNhbWUgbGluZSBhcyBsYXN0aS4gIFJldHVybiB0aGUgbnVtYmVyIG9mIHRoYXQgbGluZS4KKyovCitQeUFQSV9GVU5DKGludCkgX1B5Q29kZV9DaGVja0xpbmVOdW1iZXIoUHlDb2RlT2JqZWN0KiBjbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFzdGksIFB5QWRkclBhaXIgKmJvdW5kcyk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeUNvZGVfT3B0aW1pemUoUHlPYmplY3QgKmNvZGUsIFB5T2JqZWN0KiBjb25zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpuYW1lcywgUHlPYmplY3QgKmxpbmVub19vYmopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2NvZGVjcy5oIGIvaW5jbHVkZS9weXRob24yLjcvY29kZWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAzOGM2YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2NvZGVjcy5oCkBAIC0wLDAgKzEsMTY3IEBACisjaWZuZGVmIFB5X0NPREVDUkVHSVNUUllfSAorI2RlZmluZSBQeV9DT0RFQ1JFR0lTVFJZX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIFB5dGhvbiBDb2RlYyBSZWdpc3RyeSBhbmQgc3VwcG9ydCBmdW5jdGlvbnMKKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworQ29weXJpZ2h0IChjKSBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXMuCisKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBSZWdpc3RlciBhIG5ldyBjb2RlYyBzZWFyY2ggZnVuY3Rpb24uCisKKyAgIEFzIHNpZGUgZWZmZWN0LCB0aGlzIHRyaWVzIHRvIGxvYWQgdGhlIGVuY29kaW5ncyBwYWNrYWdlLCBpZiBub3QKKyAgIHlldCBkb25lLCB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBhbHdheXMgZmlyc3QgaW4gdGhlIGxpc3Qgb2YKKyAgIHNlYXJjaCBmdW5jdGlvbnMuCisKKyAgIFRoZSBzZWFyY2hfZnVuY3Rpb24ncyByZWZjb3VudCBpcyBpbmNyZW1lbnRlZCBieSB0aGlzIGZ1bmN0aW9uLiAqLworCitQeUFQSV9GVU5DKGludCkgUHlDb2RlY19SZWdpc3RlcigKKyAgICAgICBQeU9iamVjdCAqc2VhcmNoX2Z1bmN0aW9uCisgICAgICAgKTsKKworLyogQ29kZWMgcmVnaXN0ZXIgbG9va3VwIEFQSS4KKworICAgTG9va3MgdXAgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm5zIGEgQ29kZWNJbmZvIG9iamVjdCB3aXRoCisgICBmdW5jdGlvbiBhdHRyaWJ1dGVzIHdoaWNoIGltcGxlbWVudCB0aGUgZGlmZmVyZW50IGFzcGVjdHMgb2YKKyAgIHByb2Nlc3NpbmcgdGhlIGVuY29kaW5nLgorCisgICBUaGUgZW5jb2Rpbmcgc3RyaW5nIGlzIGxvb2tlZCB1cCBjb252ZXJ0ZWQgdG8gYWxsIGxvd2VyLWNhc2UKKyAgIGNoYXJhY3RlcnMuIFRoaXMgbWFrZXMgZW5jb2RpbmdzIGxvb2tlZCB1cCB0aHJvdWdoIHRoaXMgbWVjaGFuaXNtCisgICBlZmZlY3RpdmVseSBjYXNlLWluc2Vuc2l0aXZlLgorCisgICBJZiBubyBjb2RlYyBpcyBmb3VuZCwgYSBLZXlFcnJvciBpcyBzZXQgYW5kIE5VTEwgcmV0dXJuZWQuCisKKyAgIEFzIHNpZGUgZWZmZWN0LCB0aGlzIHRyaWVzIHRvIGxvYWQgdGhlIGVuY29kaW5ncyBwYWNrYWdlLCBpZiBub3QKKyAgIHlldCBkb25lLiBUaGlzIGlzIHBhcnQgb2YgdGhlIGxhenkgbG9hZCBzdHJhdGVneSBmb3IgdGhlIGVuY29kaW5ncworICAgcGFja2FnZS4KKworICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Q29kZWNfTG9va3VwKAorICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nCisgICAgICAgKTsKKworLyogR2VuZXJpYyBjb2RlYyBiYXNlZCBlbmNvZGluZyBBUEkuCisKKyAgIG9iamVjdCBpcyBwYXNzZWQgdGhyb3VnaCB0aGUgZW5jb2RlciBmdW5jdGlvbiBmb3VuZCBmb3IgdGhlIGdpdmVuCisgICBlbmNvZGluZyB1c2luZyB0aGUgZXJyb3IgaGFuZGxpbmcgbWV0aG9kIGRlZmluZWQgYnkgZXJyb3JzLiBlcnJvcnMKKyAgIG1heSBiZSBOVUxMIHRvIHVzZSB0aGUgZGVmYXVsdCBtZXRob2QgZGVmaW5lZCBmb3IgdGhlIGNvZGVjLgorICAgCisgICBSYWlzZXMgYSBMb29rdXBFcnJvciBpbiBjYXNlIG5vIGVuY29kZXIgY2FuIGJlIGZvdW5kLgorCisgKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvZGVjX0VuY29kZSgKKyAgICAgICBQeU9iamVjdCAqb2JqZWN0LAorICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAorICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycworICAgICAgICk7CisKKy8qIEdlbmVyaWMgY29kZWMgYmFzZWQgZGVjb2RpbmcgQVBJLgorCisgICBvYmplY3QgaXMgcGFzc2VkIHRocm91Z2ggdGhlIGRlY29kZXIgZnVuY3Rpb24gZm91bmQgZm9yIHRoZSBnaXZlbgorICAgZW5jb2RpbmcgdXNpbmcgdGhlIGVycm9yIGhhbmRsaW5nIG1ldGhvZCBkZWZpbmVkIGJ5IGVycm9ycy4gZXJyb3JzCisgICBtYXkgYmUgTlVMTCB0byB1c2UgdGhlIGRlZmF1bHQgbWV0aG9kIGRlZmluZWQgZm9yIHRoZSBjb2RlYy4KKyAgIAorICAgUmFpc2VzIGEgTG9va3VwRXJyb3IgaW4gY2FzZSBubyBlbmNvZGVyIGNhbiBiZSBmb3VuZC4KKworICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19EZWNvZGUoCisgICAgICAgUHlPYmplY3QgKm9iamVjdCwKKyAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICBjb25zdCBjaGFyICplcnJvcnMKKyAgICAgICApOworCisvKiAtLS0gQ29kZWMgTG9va3VwIEFQSXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKKyAgIEFsbCBBUElzIHJldHVybiBhIGNvZGVjIG9iamVjdCB3aXRoIGluY3JlbWVudGVkIHJlZmNvdW50IGFuZCBhcmUKKyAgIGJhc2VkIG9uIF9QeUNvZGVjX0xvb2t1cCgpLiAgVGhlIHNhbWUgY29tbWVudHMgdy9yIHRvIHRoZSBlbmNvZGluZworICAgbmFtZSBhbHNvIGFwcGx5IHRvIHRoZXNlIEFQSXMuCisKKyovCisKKy8qIEdldCBhbiBlbmNvZGVyIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19FbmNvZGVyKAorICAgICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nCisgICAgICAgKTsKKworLyogR2V0IGEgZGVjb2RlciBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIGVuY29kaW5nLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfRGVjb2RlcigKKyAgICAgICBjb25zdCBjaGFyICplbmNvZGluZworICAgICAgICk7CisKKy8qIEdldCBhIEluY3JlbWVudGFsRW5jb2RlciBvYmplY3QgZm9yIHRoZSBnaXZlbiBlbmNvZGluZy4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvZGVjX0luY3JlbWVudGFsRW5jb2RlcigKKyAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICBjb25zdCBjaGFyICplcnJvcnMKKyAgICAgICApOworCisvKiBHZXQgYSBJbmNyZW1lbnRhbERlY29kZXIgb2JqZWN0IGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIoCisgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgY29uc3QgY2hhciAqZXJyb3JzCisgICAgICAgKTsKKworLyogR2V0IGEgU3RyZWFtUmVhZGVyIGZhY3RvcnkgZnVuY3Rpb24gZm9yIHRoZSBnaXZlbiBlbmNvZGluZy4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvZGVjX1N0cmVhbVJlYWRlcigKKyAgICAgICBjb25zdCBjaGFyICplbmNvZGluZywKKyAgICAgICBQeU9iamVjdCAqc3RyZWFtLAorICAgICAgIGNvbnN0IGNoYXIgKmVycm9ycworICAgICAgICk7CisKKy8qIEdldCBhIFN0cmVhbVdyaXRlciBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19TdHJlYW1Xcml0ZXIoCisgICAgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCisgICAgICAgUHlPYmplY3QgKnN0cmVhbSwKKyAgICAgICBjb25zdCBjaGFyICplcnJvcnMKKyAgICAgICApOworCisvKiBVbmljb2RlIGVuY29kaW5nIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrIHJlZ2lzdHJ5IEFQSSAqLworCisvKiBSZWdpc3RlciB0aGUgZXJyb3IgaGFuZGxpbmcgY2FsbGJhY2sgZnVuY3Rpb24gZXJyb3IgdW5kZXIgdGhlIGdpdmVuCisgICBuYW1lLiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBjb2RlYyB3aGVuIGl0IGVuY291bnRlcnMKKyAgIHVuZW5jb2RhYmxlIGNoYXJhY3RlcnMvdW5kZWNvZGFibGUgYnl0ZXMgYW5kIGRvZXNuJ3Qga25vdyB0aGUKKyAgIGNhbGxiYWNrIG5hbWUsIHdoZW4gbmFtZSBpcyBzcGVjaWZpZWQgYXMgdGhlIGVycm9yIHBhcmFtZXRlcgorICAgaW4gdGhlIGNhbGwgdG8gdGhlIGVuY29kZS9kZWNvZGUgZnVuY3Rpb24uCisgICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvciAqLworUHlBUElfRlVOQyhpbnQpIFB5Q29kZWNfUmVnaXN0ZXJFcnJvcihjb25zdCBjaGFyICpuYW1lLCBQeU9iamVjdCAqZXJyb3IpOworCisvKiBMb29rdXAgdGhlIGVycm9yIGhhbmRsaW5nIGNhbGxiYWNrIGZ1bmN0aW9uIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIGdpdmVuCisgICBuYW1lLiBBcyBhIHNwZWNpYWwgY2FzZSBOVUxMIGNhbiBiZSBwYXNzZWQsIGluIHdoaWNoIGNhc2UKKyAgIHRoZSBlcnJvciBoYW5kbGluZyBjYWxsYmFjayBmb3IgInN0cmljdCIgd2lsbCBiZSByZXR1cm5lZC4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19Mb29rdXBFcnJvcihjb25zdCBjaGFyICpuYW1lKTsKKworLyogcmFpc2UgZXhjIGFzIGFuIGV4Y2VwdGlvbiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNvZGVjX1N0cmljdEVycm9ycyhQeU9iamVjdCAqZXhjKTsKKworLyogaWdub3JlIHRoZSB1bmljb2RlIGVycm9yLCBza2lwcGluZyB0aGUgZmF1bHR5IGlucHV0ICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfSWdub3JlRXJyb3JzKFB5T2JqZWN0ICpleGMpOworCisvKiByZXBsYWNlIHRoZSB1bmljb2RlIGVuY29kZSBlcnJvciB3aXRoID8gb3IgVStGRkZEICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29kZWNfUmVwbGFjZUVycm9ycyhQeU9iamVjdCAqZXhjKTsKKworLyogcmVwbGFjZSB0aGUgdW5pY29kZSBlbmNvZGUgZXJyb3Igd2l0aCBYTUwgY2hhcmFjdGVyIHJlZmVyZW5jZXMgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19YTUxDaGFyUmVmUmVwbGFjZUVycm9ycyhQeU9iamVjdCAqZXhjKTsKKworLyogcmVwbGFjZSB0aGUgdW5pY29kZSBlbmNvZGUgZXJyb3Igd2l0aCBiYWNrc2xhc2ggZXNjYXBlcyAoXHgsIFx1IGFuZCBcVSkgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDb2RlY19CYWNrc2xhc2hSZXBsYWNlRXJyb3JzKFB5T2JqZWN0ICpleGMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DT0RFQ1JFR0lTVFJZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2NvbXBpbGUuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2NvbXBpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTAwMTAxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvY29tcGlsZS5oCkBAIC0wLDAgKzEsNDAgQEAKKworI2lmbmRlZiBQeV9DT01QSUxFX0gKKyNkZWZpbmUgUHlfQ09NUElMRV9ICisKKyNpbmNsdWRlICJjb2RlLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogUHVibGljIGludGVyZmFjZSAqLworc3RydWN0IF9ub2RlOyAvKiBEZWNsYXJlIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyB0eXBlICovCitQeUFQSV9GVU5DKFB5Q29kZU9iamVjdCAqKSBQeU5vZGVfQ29tcGlsZShzdHJ1Y3QgX25vZGUgKiwgY29uc3QgY2hhciAqKTsKKworLyogRnV0dXJlIGZlYXR1cmUgc3VwcG9ydCAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZmX2ZlYXR1cmVzOyAgICAgIC8qIGZsYWdzIHNldCBieSBmdXR1cmUgc3RhdGVtZW50cyAqLworICAgIGludCBmZl9saW5lbm87ICAgICAgICAvKiBsaW5lIG51bWJlciBvZiBsYXN0IGZ1dHVyZSBzdGF0ZW1lbnQgKi8KK30gUHlGdXR1cmVGZWF0dXJlczsKKworI2RlZmluZSBGVVRVUkVfTkVTVEVEX1NDT1BFUyAibmVzdGVkX3Njb3BlcyIKKyNkZWZpbmUgRlVUVVJFX0dFTkVSQVRPUlMgImdlbmVyYXRvcnMiCisjZGVmaW5lIEZVVFVSRV9ESVZJU0lPTiAiZGl2aXNpb24iCisjZGVmaW5lIEZVVFVSRV9BQlNPTFVURV9JTVBPUlQgImFic29sdXRlX2ltcG9ydCIKKyNkZWZpbmUgRlVUVVJFX1dJVEhfU1RBVEVNRU5UICJ3aXRoX3N0YXRlbWVudCIKKyNkZWZpbmUgRlVUVVJFX1BSSU5UX0ZVTkNUSU9OICJwcmludF9mdW5jdGlvbiIKKyNkZWZpbmUgRlVUVVJFX1VOSUNPREVfTElURVJBTFMgInVuaWNvZGVfbGl0ZXJhbHMiCisKKworc3RydWN0IF9tb2Q7IC8qIERlY2xhcmUgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIHR5cGUgKi8KK1B5QVBJX0ZVTkMoUHlDb2RlT2JqZWN0ICopIFB5QVNUX0NvbXBpbGUoc3RydWN0IF9tb2QgKiwgY29uc3QgY2hhciAqLAorCQkJCQlQeUNvbXBpbGVyRmxhZ3MgKiwgUHlBcmVuYSAqKTsKK1B5QVBJX0ZVTkMoUHlGdXR1cmVGZWF0dXJlcyAqKSBQeUZ1dHVyZV9Gcm9tQVNUKHN0cnVjdCBfbW9kICosIGNvbnN0IGNoYXIgKik7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfQ09NUElMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9jb21wbGV4b2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9jb21wbGV4b2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlhOTUwMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2NvbXBsZXhvYmplY3QuaApAQCAtMCwwICsxLDY2IEBACisvKiBDb21wbGV4IG51bWJlciBzdHJ1Y3R1cmUgKi8KKworI2lmbmRlZiBQeV9DT01QTEVYT0JKRUNUX0gKKyNkZWZpbmUgUHlfQ09NUExFWE9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBkb3VibGUgcmVhbDsKKyAgICBkb3VibGUgaW1hZzsKK30gUHlfY29tcGxleDsKKworLyogT3BlcmF0aW9ucyBvbiBjb21wbGV4IG51bWJlcnMgZnJvbSBjb21wbGV4bW9kdWxlLmMgKi8KKworI2RlZmluZSBjX3N1bSBfUHlfY19zdW0KKyNkZWZpbmUgY19kaWZmIF9QeV9jX2RpZmYKKyNkZWZpbmUgY19uZWcgX1B5X2NfbmVnCisjZGVmaW5lIGNfcHJvZCBfUHlfY19wcm9kCisjZGVmaW5lIGNfcXVvdCBfUHlfY19xdW90CisjZGVmaW5lIGNfcG93IF9QeV9jX3BvdworI2RlZmluZSBjX2FicyBfUHlfY19hYnMKKworUHlBUElfRlVOQyhQeV9jb21wbGV4KSBjX3N1bShQeV9jb21wbGV4LCBQeV9jb21wbGV4KTsKK1B5QVBJX0ZVTkMoUHlfY29tcGxleCkgY19kaWZmKFB5X2NvbXBsZXgsIFB5X2NvbXBsZXgpOworUHlBUElfRlVOQyhQeV9jb21wbGV4KSBjX25lZyhQeV9jb21wbGV4KTsKK1B5QVBJX0ZVTkMoUHlfY29tcGxleCkgY19wcm9kKFB5X2NvbXBsZXgsIFB5X2NvbXBsZXgpOworUHlBUElfRlVOQyhQeV9jb21wbGV4KSBjX3F1b3QoUHlfY29tcGxleCwgUHlfY29tcGxleCk7CitQeUFQSV9GVU5DKFB5X2NvbXBsZXgpIGNfcG93KFB5X2NvbXBsZXgsIFB5X2NvbXBsZXgpOworUHlBUElfRlVOQyhkb3VibGUpIGNfYWJzKFB5X2NvbXBsZXgpOworCisKKy8qIENvbXBsZXggb2JqZWN0IGludGVyZmFjZSAqLworCisvKgorUHlDb21wbGV4T2JqZWN0IHJlcHJlc2VudHMgYSBjb21wbGV4IG51bWJlciB3aXRoIGRvdWJsZS1wcmVjaXNpb24KK3JlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cy4KKyovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfY29tcGxleCBjdmFsOworfSBQeUNvbXBsZXhPYmplY3Q7ICAgICAKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Q29tcGxleF9UeXBlOworCisjZGVmaW5lIFB5Q29tcGxleF9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlDb21wbGV4X1R5cGUpCisjZGVmaW5lIFB5Q29tcGxleF9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5Q29tcGxleF9UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29tcGxleF9Gcm9tQ0NvbXBsZXgoUHlfY29tcGxleCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q29tcGxleF9Gcm9tRG91Ymxlcyhkb3VibGUgcmVhbCwgZG91YmxlIGltYWcpOworCitQeUFQSV9GVU5DKGRvdWJsZSkgUHlDb21wbGV4X1JlYWxBc0RvdWJsZShQeU9iamVjdCAqb3ApOworUHlBUElfRlVOQyhkb3VibGUpIFB5Q29tcGxleF9JbWFnQXNEb3VibGUoUHlPYmplY3QgKm9wKTsKK1B5QVBJX0ZVTkMoUHlfY29tcGxleCkgUHlDb21wbGV4X0FzQ0NvbXBsZXgoUHlPYmplY3QgKm9wKTsKKworLyogRm9ybWF0IHRoZSBvYmplY3QgYmFzZWQgb24gdGhlIGZvcm1hdF9zcGVjLCBhcyBkZWZpbmVkIGluIFBFUCAzMTAxCisgICAoQWR2YW5jZWQgU3RyaW5nIEZvcm1hdHRpbmcpLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlDb21wbGV4X0Zvcm1hdEFkdmFuY2VkKFB5T2JqZWN0ICpvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZm9ybWF0X3NwZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DT01QTEVYT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2RhdGV0aW1lLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9kYXRldGltZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YWJlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9kYXRldGltZS5oCkBAIC0wLDAgKzEsMjM5IEBACisvKiAgZGF0ZXRpbWUuaAorICovCisKKyNpZm5kZWYgREFURVRJTUVfSAorI2RlZmluZSBEQVRFVElNRV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIEZpZWxkcyBhcmUgcGFja2VkIGludG8gc3VjY2Vzc2l2ZSBieXRlcywgZWFjaCB2aWV3ZWQgYXMgdW5zaWduZWQgYW5kCisgKiBiaWctZW5kaWFuLCB1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkOgorICoKKyAqIGJ5dGUgb2Zmc2V0CisgKiAgMCAgICAgICAgICAgeWVhciAgICAgMiBieXRlcywgMS05OTk5CisgKiAgMiAgICAgICAgICAgbW9udGggICAgMSBieXRlLCAxLTEyCisgKiAgMyAgICAgICAgICAgZGF5ICAgICAgMSBieXRlLCAxLTMxCisgKiAgNCAgICAgICAgICAgaG91ciAgICAgMSBieXRlLCAwLTIzCisgKiAgNSAgICAgICAgICAgbWludXRlICAgMSBieXRlLCAwLTU5CisgKiAgNiAgICAgICAgICAgc2Vjb25kICAgMSBieXRlLCAwLTU5CisgKiAgNyAgICAgICAgICAgdXNlY29uZCAgMyBieXRlcywgMC05OTk5OTkKKyAqIDEwCisgKi8KKworLyogIyBvZiBieXRlcyBmb3IgeWVhciwgbW9udGgsIGFuZCBkYXkuICovCisjZGVmaW5lIF9QeURhdGVUaW1lX0RBVEVfREFUQVNJWkUgNAorCisvKiAjIG9mIGJ5dGVzIGZvciBob3VyLCBtaW51dGUsIHNlY29uZCwgYW5kIHVzZWNvbmQuICovCisjZGVmaW5lIF9QeURhdGVUaW1lX1RJTUVfREFUQVNJWkUgNgorCisvKiAjIG9mIGJ5dGVzIGZvciB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgYW5kIHVzZWNvbmQuICovCisjZGVmaW5lIF9QeURhdGVUaW1lX0RBVEVUSU1FX0RBVEFTSVpFIDEwCisKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgbG9uZyBoYXNoY29kZTsgICAgICAgICAgICAgIC8qIC0xIHdoZW4gdW5rbm93biAqLworICAgIGludCBkYXlzOyAgICAgICAgICAgICAgICAgICAvKiAtTUFYX0RFTFRBX0RBWVMgPD0gZGF5cyA8PSBNQVhfREVMVEFfREFZUyAqLworICAgIGludCBzZWNvbmRzOyAgICAgICAgICAgICAgICAvKiAwIDw9IHNlY29uZHMgPCAyNCozNjAwIGlzIGludmFyaWFudCAqLworICAgIGludCBtaWNyb3NlY29uZHM7ICAgICAgICAgICAvKiAwIDw9IG1pY3Jvc2Vjb25kcyA8IDEwMDAwMDAgaXMgaW52YXJpYW50ICovCit9IFB5RGF0ZVRpbWVfRGVsdGE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgUHlPYmplY3RfSEVBRCAgICAgICAgICAgICAgIC8qIGEgcHVyZSBhYnN0cmFjdCBiYXNlIGNsYXNlICovCit9IFB5RGF0ZVRpbWVfVFpJbmZvOworCisKKy8qIFRoZSBkYXRldGltZSBhbmQgdGltZSB0eXBlcyBoYXZlIGhhc2hjb2RlcywgYW5kIGFuIG9wdGlvbmFsIHR6aW5mbyBtZW1iZXIsCisgKiBwcmVzZW50IGlmIGFuZCBvbmx5IGlmIGhhc3R6aW5mbyBpcyB0cnVlLgorICovCisjZGVmaW5lIF9QeVRaSU5GT19IRUFEICAgICAgICAgIFwKKyAgICBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgXAorICAgIGxvbmcgaGFzaGNvZGU7ICAgICAgICAgICAgICBcCisgICAgY2hhciBoYXN0emluZm87ICAgICAgICAgICAgIC8qIGJvb2xlYW4gZmxhZyAqLworCisvKiBObyBfUHlEYXRlVGltZV9CYXNlVFpJbmZvIGlzIGFsbG9jYXRlZDsgaXQncyBqdXN0IHRvIGhhdmUgc29tZXRoaW5nCisgKiBjb252ZW5pZW50IHRvIGNhc3QgdG8sIHdoZW4gZ2V0dGluZyBhdCB0aGUgaGFzdHppbmZvIG1lbWJlciBvZiBvYmplY3RzCisgKiBzdGFydGluZyB3aXRoIF9QeVRaSU5GT19IRUFELgorICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIF9QeVRaSU5GT19IRUFECit9IF9QeURhdGVUaW1lX0Jhc2VUWkluZm87CisKKy8qIEFsbCB0aW1lIG9iamVjdHMgYXJlIG9mIFB5RGF0ZVRpbWVfVGltZVR5cGUsIGJ1dCB0aGF0IGNhbiBiZSBhbGxvY2F0ZWQKKyAqIGluIHR3byB3YXlzLCB3aXRoIG9yIHdpdGhvdXQgYSB0emluZm8gbWVtYmVyLiAgV2l0aG91dCBpcyB0aGUgc2FtZSBhcworICogdHppbmZvID09IE5vbmUsIGJ1dCBjb25zdW1lcyBsZXNzIG1lbW9yeS4gIF9QeURhdGVUaW1lX0Jhc2VUaW1lIGlzIGFuCisgKiBpbnRlcm5hbCBzdHJ1Y3QgdXNlZCB0byBhbGxvY2F0ZSB0aGUgcmlnaHQgYW1vdW50IG9mIHNwYWNlIGZvciB0aGUKKyAqICJ3aXRob3V0IiBjYXNlLgorICovCisjZGVmaW5lIF9QeURhdGVUaW1lX1RJTUVIRUFEICAgIFwKKyAgICBfUHlUWklORk9fSEVBRCAgICAgICAgICAgICAgXAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YVtfUHlEYXRlVGltZV9USU1FX0RBVEFTSVpFXTsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBfUHlEYXRlVGltZV9USU1FSEVBRAorfSBfUHlEYXRlVGltZV9CYXNlVGltZTsgICAgICAgICAvKiBoYXN0emluZm8gZmFsc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBfUHlEYXRlVGltZV9USU1FSEVBRAorICAgIFB5T2JqZWN0ICp0emluZm87Cit9IFB5RGF0ZVRpbWVfVGltZTsgICAgICAgICAgICAgIC8qIGhhc3R6aW5mbyB0cnVlICovCisKKworLyogQWxsIGRhdGV0aW1lIG9iamVjdHMgYXJlIG9mIFB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlLCBidXQgdGhhdCBjYW4gYmUKKyAqIGFsbG9jYXRlZCBpbiB0d28gd2F5cyB0b28sIGp1c3QgbGlrZSBmb3IgdGltZSBvYmplY3RzIGFib3ZlLiAgSW4gYWRkaXRpb24sCisgKiB0aGUgcGxhaW4gZGF0ZSB0eXBlIGlzIGEgYmFzZSBjbGFzcyBmb3IgZGF0ZXRpbWUsIHNvIGl0IG11c3QgYWxzbyBoYXZlCisgKiBhIGhhc3R6aW5mbyBtZW1iZXIgKGFsdGhvdWdoIGl0J3MgdW51c2VkIHRoZXJlKS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBfUHlUWklORk9fSEVBRAorICAgIHVuc2lnbmVkIGNoYXIgZGF0YVtfUHlEYXRlVGltZV9EQVRFX0RBVEFTSVpFXTsKK30gUHlEYXRlVGltZV9EYXRlOworCisjZGVmaW5lIF9QeURhdGVUaW1lX0RBVEVUSU1FSEVBRCAgICAgICAgXAorICAgIF9QeVRaSU5GT19IRUFEICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGFbX1B5RGF0ZVRpbWVfREFURVRJTUVfREFUQVNJWkVdOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIF9QeURhdGVUaW1lX0RBVEVUSU1FSEVBRAorfSBfUHlEYXRlVGltZV9CYXNlRGF0ZVRpbWU7ICAgICAvKiBoYXN0emluZm8gZmFsc2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBfUHlEYXRlVGltZV9EQVRFVElNRUhFQUQKKyAgICBQeU9iamVjdCAqdHppbmZvOworfSBQeURhdGVUaW1lX0RhdGVUaW1lOyAgICAgICAgICAvKiBoYXN0emluZm8gdHJ1ZSAqLworCisKKy8qIEFwcGx5IGZvciBkYXRlIGFuZCBkYXRldGltZSBpbnN0YW5jZXMuICovCisjZGVmaW5lIFB5RGF0ZVRpbWVfR0VUX1lFQVIobykgICAgICgoKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzBdIDw8IDgpIHwgXAorICAgICAgICAgICAgICAgICAgICAgKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzFdKQorI2RlZmluZSBQeURhdGVUaW1lX0dFVF9NT05USChvKSAgICAoKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzJdKQorI2RlZmluZSBQeURhdGVUaW1lX0dFVF9EQVkobykgICAgICAoKChQeURhdGVUaW1lX0RhdGUqKW8pLT5kYXRhWzNdKQorCisjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfSE9VUihvKSAgICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbNF0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlOVVRFKG8pICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbNV0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfU0VDT05EKG8pICAgICAgKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbNl0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfREFURV9HRVRfTUlDUk9TRUNPTkQobykgICAgICAgICAgICAgIFwKKyAgICAoKCgoUHlEYXRlVGltZV9EYXRlVGltZSopbyktPmRhdGFbN10gPDwgMTYpIHwgICAgICAgXAorICAgICAoKChQeURhdGVUaW1lX0RhdGVUaW1lKilvKS0+ZGF0YVs4XSA8PCA4KSAgfCAgICAgICBcCisgICAgICAoKFB5RGF0ZVRpbWVfRGF0ZVRpbWUqKW8pLT5kYXRhWzldKQorCisvKiBBcHBseSBmb3IgdGltZSBpbnN0YW5jZXMuICovCisjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfSE9VUihvKSAgICAgICAgKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVswXSkKKyNkZWZpbmUgUHlEYXRlVGltZV9USU1FX0dFVF9NSU5VVEUobykgICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzFdKQorI2RlZmluZSBQeURhdGVUaW1lX1RJTUVfR0VUX1NFQ09ORChvKSAgICAgICgoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbMl0pCisjZGVmaW5lIFB5RGF0ZVRpbWVfVElNRV9HRVRfTUlDUk9TRUNPTkQobykgICAgICAgICAgICAgIFwKKyAgICAoKCgoUHlEYXRlVGltZV9UaW1lKilvKS0+ZGF0YVszXSA8PCAxNikgfCAgICAgICAgICAgXAorICAgICAoKChQeURhdGVUaW1lX1RpbWUqKW8pLT5kYXRhWzRdIDw8IDgpICB8ICAgICAgICAgICBcCisgICAgICAoKFB5RGF0ZVRpbWVfVGltZSopbyktPmRhdGFbNV0pCisKKworLyogRGVmaW5lIHN0cnVjdHVyZSBmb3IgQyBBUEkuICovCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLyogdHlwZSBvYmplY3RzICovCisgICAgUHlUeXBlT2JqZWN0ICpEYXRlVHlwZTsKKyAgICBQeVR5cGVPYmplY3QgKkRhdGVUaW1lVHlwZTsKKyAgICBQeVR5cGVPYmplY3QgKlRpbWVUeXBlOworICAgIFB5VHlwZU9iamVjdCAqRGVsdGFUeXBlOworICAgIFB5VHlwZU9iamVjdCAqVFpJbmZvVHlwZTsKKworICAgIC8qIGNvbnN0cnVjdG9ycyAqLworICAgIFB5T2JqZWN0ICooKkRhdGVfRnJvbURhdGUpKGludCwgaW50LCBpbnQsIFB5VHlwZU9iamVjdCopOworICAgIFB5T2JqZWN0ICooKkRhdGVUaW1lX0Zyb21EYXRlQW5kVGltZSkoaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGludCwgaW50LAorICAgICAgICBQeU9iamVjdCosIFB5VHlwZU9iamVjdCopOworICAgIFB5T2JqZWN0ICooKlRpbWVfRnJvbVRpbWUpKGludCwgaW50LCBpbnQsIGludCwgUHlPYmplY3QqLCBQeVR5cGVPYmplY3QqKTsKKyAgICBQeU9iamVjdCAqKCpEZWx0YV9Gcm9tRGVsdGEpKGludCwgaW50LCBpbnQsIGludCwgUHlUeXBlT2JqZWN0Kik7CisKKyAgICAvKiBjb25zdHJ1Y3RvcnMgZm9yIHRoZSBEQiBBUEkgKi8KKyAgICBQeU9iamVjdCAqKCpEYXRlVGltZV9Gcm9tVGltZXN0YW1wKShQeU9iamVjdCosIFB5T2JqZWN0KiwgUHlPYmplY3QqKTsKKyAgICBQeU9iamVjdCAqKCpEYXRlX0Zyb21UaW1lc3RhbXApKFB5T2JqZWN0KiwgUHlPYmplY3QqKTsKKworfSBQeURhdGVUaW1lX0NBUEk7CisKKyNkZWZpbmUgUHlEYXRlVGltZV9DQVBTVUxFX05BTUUgImRhdGV0aW1lLmRhdGV0aW1lX0NBUEkiCisKKworLyogIm1hZ2ljIiBjb25zdGFudCB1c2VkIHRvIHBhcnRpYWxseSBwcm90ZWN0IGFnYWluc3QgZGV2ZWxvcGVyIG1pc3Rha2VzLiAqLworI2RlZmluZSBEQVRFVElNRV9BUElfTUFHSUMgMHg0MTQ1NDhkNQorCisjaWZkZWYgUHlfQlVJTERfQ09SRQorCisvKiBNYWNyb3MgZm9yIHR5cGUgY2hlY2tpbmcgd2hlbiBidWlsZGluZyB0aGUgUHl0aG9uIGNvcmUuICovCisjZGVmaW5lIFB5RGF0ZV9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlEYXRlVGltZV9EYXRlVHlwZSkKKyNkZWZpbmUgUHlEYXRlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlEYXRlVGltZV9EYXRlVHlwZSkKKworI2RlZmluZSBQeURhdGVUaW1lX0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsICZQeURhdGVUaW1lX0RhdGVUaW1lVHlwZSkKKyNkZWZpbmUgUHlEYXRlVGltZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGF0ZVRpbWVfRGF0ZVRpbWVUeXBlKQorCisjZGVmaW5lIFB5VGltZV9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlEYXRlVGltZV9UaW1lVHlwZSkKKyNkZWZpbmUgUHlUaW1lX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlEYXRlVGltZV9UaW1lVHlwZSkKKworI2RlZmluZSBQeURlbHRhX0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsICZQeURhdGVUaW1lX0RlbHRhVHlwZSkKKyNkZWZpbmUgUHlEZWx0YV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RGF0ZVRpbWVfRGVsdGFUeXBlKQorCisjZGVmaW5lIFB5VFpJbmZvX0NoZWNrKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsICZQeURhdGVUaW1lX1RaSW5mb1R5cGUpCisjZGVmaW5lIFB5VFpJbmZvX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlEYXRlVGltZV9UWkluZm9UeXBlKQorCisjZWxzZQorCisvKiBEZWZpbmUgZ2xvYmFsIHZhcmlhYmxlIGZvciB0aGUgQyBBUEkgYW5kIGEgbWFjcm8gZm9yIHNldHRpbmcgaXQuICovCitzdGF0aWMgUHlEYXRlVGltZV9DQVBJICpQeURhdGVUaW1lQVBJID0gTlVMTDsKKworI2RlZmluZSBQeURhdGVUaW1lX0lNUE9SVCBcCisgICAgUHlEYXRlVGltZUFQSSA9IChQeURhdGVUaW1lX0NBUEkgKilQeUNhcHN1bGVfSW1wb3J0KFB5RGF0ZVRpbWVfQ0FQU1VMRV9OQU1FLCAwKQorCisvKiBNYWNyb3MgZm9yIHR5cGUgY2hlY2tpbmcgd2hlbiBub3QgYnVpbGRpbmcgdGhlIFB5dGhvbiBjb3JlLiAqLworI2RlZmluZSBQeURhdGVfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgUHlEYXRlVGltZUFQSS0+RGF0ZVR5cGUpCisjZGVmaW5lIFB5RGF0ZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gUHlEYXRlVGltZUFQSS0+RGF0ZVR5cGUpCisKKyNkZWZpbmUgUHlEYXRlVGltZV9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCBQeURhdGVUaW1lQVBJLT5EYXRlVGltZVR5cGUpCisjZGVmaW5lIFB5RGF0ZVRpbWVfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09IFB5RGF0ZVRpbWVBUEktPkRhdGVUaW1lVHlwZSkKKworI2RlZmluZSBQeVRpbWVfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgUHlEYXRlVGltZUFQSS0+VGltZVR5cGUpCisjZGVmaW5lIFB5VGltZV9DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gUHlEYXRlVGltZUFQSS0+VGltZVR5cGUpCisKKyNkZWZpbmUgUHlEZWx0YV9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCBQeURhdGVUaW1lQVBJLT5EZWx0YVR5cGUpCisjZGVmaW5lIFB5RGVsdGFfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09IFB5RGF0ZVRpbWVBUEktPkRlbHRhVHlwZSkKKworI2RlZmluZSBQeVRaSW5mb19DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCBQeURhdGVUaW1lQVBJLT5UWkluZm9UeXBlKQorI2RlZmluZSBQeVRaSW5mb19DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gUHlEYXRlVGltZUFQSS0+VFpJbmZvVHlwZSkKKworLyogTWFjcm9zIGZvciBhY2Nlc3NpbmcgY29uc3RydWN0b3JzIGluIGEgc2ltcGxpZmllZCBmYXNoaW9uLiAqLworI2RlZmluZSBQeURhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSkgXAorICAgIFB5RGF0ZVRpbWVBUEktPkRhdGVfRnJvbURhdGUoeWVhciwgbW9udGgsIGRheSwgUHlEYXRlVGltZUFQSS0+RGF0ZVR5cGUpCisKKyNkZWZpbmUgUHlEYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMsIHVzZWMpIFwKKyAgICBQeURhdGVUaW1lQVBJLT5EYXRlVGltZV9Gcm9tRGF0ZUFuZFRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91ciwgXAorICAgICAgICBtaW4sIHNlYywgdXNlYywgUHlfTm9uZSwgUHlEYXRlVGltZUFQSS0+RGF0ZVRpbWVUeXBlKQorCisjZGVmaW5lIFB5VGltZV9Gcm9tVGltZShob3VyLCBtaW51dGUsIHNlY29uZCwgdXNlY29uZCkgXAorICAgIFB5RGF0ZVRpbWVBUEktPlRpbWVfRnJvbVRpbWUoaG91ciwgbWludXRlLCBzZWNvbmQsIHVzZWNvbmQsIFwKKyAgICAgICAgUHlfTm9uZSwgUHlEYXRlVGltZUFQSS0+VGltZVR5cGUpCisKKyNkZWZpbmUgUHlEZWx0YV9Gcm9tRFNVKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzKSBcCisgICAgUHlEYXRlVGltZUFQSS0+RGVsdGFfRnJvbURlbHRhKGRheXMsIHNlY29uZHMsIHVzZWNvbmRzLCAxLCBcCisgICAgICAgIFB5RGF0ZVRpbWVBUEktPkRlbHRhVHlwZSkKKworLyogTWFjcm9zIHN1cHBvcnRpbmcgdGhlIERCIEFQSS4gKi8KKyNkZWZpbmUgUHlEYXRlVGltZV9Gcm9tVGltZXN0YW1wKGFyZ3MpIFwKKyAgICBQeURhdGVUaW1lQVBJLT5EYXRlVGltZV9Gcm9tVGltZXN0YW1wKCBcCisgICAgICAgIChQeU9iamVjdCopIChQeURhdGVUaW1lQVBJLT5EYXRlVGltZVR5cGUpLCBhcmdzLCBOVUxMKQorCisjZGVmaW5lIFB5RGF0ZV9Gcm9tVGltZXN0YW1wKGFyZ3MpIFwKKyAgICBQeURhdGVUaW1lQVBJLT5EYXRlX0Zyb21UaW1lc3RhbXAoIFwKKyAgICAgICAgKFB5T2JqZWN0KikgKFB5RGF0ZVRpbWVBUEktPkRhdGVUeXBlKSwgYXJncykKKworI2VuZGlmICAvKiBQeV9CVUlMRF9DT1JFICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2Rlc2Nyb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9kZXNjcm9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDI3MzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9kZXNjcm9iamVjdC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qIERlc2NyaXB0b3JzICovCisjaWZuZGVmIFB5X0RFU0NST0JKRUNUX0gKKyNkZWZpbmUgUHlfREVTQ1JPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIFB5T2JqZWN0ICooKmdldHRlcikoUHlPYmplY3QgKiwgdm9pZCAqKTsKK3R5cGVkZWYgaW50ICgqc2V0dGVyKShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCB2b2lkICopOworCit0eXBlZGVmIHN0cnVjdCBQeUdldFNldERlZiB7CisgICAgY2hhciAqbmFtZTsKKyAgICBnZXR0ZXIgZ2V0OworICAgIHNldHRlciBzZXQ7CisgICAgY2hhciAqZG9jOworICAgIHZvaWQgKmNsb3N1cmU7Cit9IFB5R2V0U2V0RGVmOworCit0eXBlZGVmIFB5T2JqZWN0ICooKndyYXBwZXJmdW5jKShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp3cmFwcGVkKTsKKwordHlwZWRlZiBQeU9iamVjdCAqKCp3cmFwcGVyZnVuY19rd2RzKShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKndyYXBwZWQsIFB5T2JqZWN0ICprd2RzKTsKKworc3RydWN0IHdyYXBwZXJiYXNlIHsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBvZmZzZXQ7CisgICAgdm9pZCAqZnVuY3Rpb247CisgICAgd3JhcHBlcmZ1bmMgd3JhcHBlcjsKKyAgICBjaGFyICpkb2M7CisgICAgaW50IGZsYWdzOworICAgIFB5T2JqZWN0ICpuYW1lX3N0cm9iajsKK307CisKKy8qIEZsYWdzIGZvciBhYm92ZSBzdHJ1Y3QgKi8KKyNkZWZpbmUgUHlXcmFwcGVyRmxhZ19LRVlXT1JEUyAxIC8qIHdyYXBwZXIgZnVuY3Rpb24gdGFrZXMga2V5d29yZCBhcmdzICovCisKKy8qIFZhcmlvdXMga2luZHMgb2YgZGVzY3JpcHRvciBvYmplY3RzICovCisKKyNkZWZpbmUgUHlEZXNjcl9DT01NT04gXAorICAgIFB5T2JqZWN0X0hFQUQgXAorICAgIFB5VHlwZU9iamVjdCAqZF90eXBlOyBcCisgICAgUHlPYmplY3QgKmRfbmFtZQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlEZXNjcl9DT01NT047Cit9IFB5RGVzY3JPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBQeU1ldGhvZERlZiAqZF9tZXRob2Q7Cit9IFB5TWV0aG9kRGVzY3JPYmplY3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeURlc2NyX0NPTU1PTjsKKyAgICBzdHJ1Y3QgUHlNZW1iZXJEZWYgKmRfbWVtYmVyOworfSBQeU1lbWJlckRlc2NyT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlEZXNjcl9DT01NT047CisgICAgUHlHZXRTZXREZWYgKmRfZ2V0c2V0OworfSBQeUdldFNldERlc2NyT2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlEZXNjcl9DT01NT047CisgICAgc3RydWN0IHdyYXBwZXJiYXNlICpkX2Jhc2U7CisgICAgdm9pZCAqZF93cmFwcGVkOyAvKiBUaGlzIGNhbiBiZSBhbnkgZnVuY3Rpb24gcG9pbnRlciAqLworfSBQeVdyYXBwZXJEZXNjck9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5V3JhcHBlckRlc2NyX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlEaWN0UHJveHlfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUdldFNldERlc2NyX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlNZW1iZXJEZXNjcl9UeXBlOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3TWV0aG9kKFB5VHlwZU9iamVjdCAqLCBQeU1ldGhvZERlZiAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEZXNjcl9OZXdDbGFzc01ldGhvZChQeVR5cGVPYmplY3QgKiwgUHlNZXRob2REZWYgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3TWVtYmVyKFB5VHlwZU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUHlNZW1iZXJEZWYgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3R2V0U2V0KFB5VHlwZU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgUHlHZXRTZXREZWYgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGVzY3JfTmV3V3JhcHBlcihQeVR5cGVPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB3cmFwcGVyYmFzZSAqLCB2b2lkICopOworI2RlZmluZSBQeURlc2NyX0lzRGF0YShkKSAoUHlfVFlQRShkKS0+dHBfZGVzY3Jfc2V0ICE9IE5VTEwpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0UHJveHlfTmV3KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVdyYXBwZXJfTmV3KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVByb3BlcnR5X1R5cGU7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9ERVNDUk9CSkVDVF9IICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2RpY3RvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2RpY3RvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2UwMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZGljdG9iamVjdC5oCkBAIC0wLDAgKzEsMTU2IEBACisjaWZuZGVmIFB5X0RJQ1RPQkpFQ1RfSAorI2RlZmluZSBQeV9ESUNUT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBEaWN0aW9uYXJ5IG9iamVjdCB0eXBlIC0tIG1hcHBpbmcgZnJvbSBoYXNoYWJsZSBvYmplY3QgdG8gb2JqZWN0ICovCisKKy8qIFRoZSBkaXN0cmlidXRpb24gaW5jbHVkZXMgYSBzZXBhcmF0ZSBmaWxlLCBPYmplY3RzL2RpY3Rub3Rlcy50eHQsCisgICBkZXNjcmliaW5nIGV4cGxvcmF0aW9ucyBpbnRvIGRpY3Rpb25hcnkgZGVzaWduIGFuZCBvcHRpbWl6YXRpb24uCisgICBJdCBjb3ZlcnMgdHlwaWNhbCBkaWN0aW9uYXJ5IHVzZSBwYXR0ZXJucywgdGhlIHBhcmFtZXRlcnMgZm9yCisgICB0dW5pbmcgZGljdGlvbmFyaWVzLCBhbmQgc2V2ZXJhbCBpZGVhcyBmb3IgcG9zc2libGUgb3B0aW1pemF0aW9ucy4KKyovCisKKy8qCitUaGVyZSBhcmUgdGhyZWUga2luZHMgb2Ygc2xvdHMgaW4gdGhlIHRhYmxlOgorCisxLiBVbnVzZWQuICBtZV9rZXkgPT0gbWVfdmFsdWUgPT0gTlVMTAorICAgRG9lcyBub3QgaG9sZCBhbiBhY3RpdmUgKGtleSwgdmFsdWUpIHBhaXIgbm93IGFuZCBuZXZlciBkaWQuICBVbnVzZWQgY2FuCisgICB0cmFuc2l0aW9uIHRvIEFjdGl2ZSB1cG9uIGtleSBpbnNlcnRpb24uICBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaW4gd2hpY2gKKyAgIG1lX2tleSBpcyBOVUxMLCBhbmQgaXMgZWFjaCBzbG90J3MgaW5pdGlhbCBzdGF0ZS4KKworMi4gQWN0aXZlLiAgbWVfa2V5ICE9IE5VTEwgYW5kIG1lX2tleSAhPSBkdW1teSBhbmQgbWVfdmFsdWUgIT0gTlVMTAorICAgSG9sZHMgYW4gYWN0aXZlIChrZXksIHZhbHVlKSBwYWlyLiAgQWN0aXZlIGNhbiB0cmFuc2l0aW9uIHRvIER1bW15IHVwb24KKyAgIGtleSBkZWxldGlvbi4gIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSBpbiB3aGljaCBtZV92YWx1ZSAhPSBOVUxMLgorCiszLiBEdW1teS4gIG1lX2tleSA9PSBkdW1teSBhbmQgbWVfdmFsdWUgPT0gTlVMTAorICAgUHJldmlvdXNseSBoZWxkIGFuIGFjdGl2ZSAoa2V5LCB2YWx1ZSkgcGFpciwgYnV0IHRoYXQgd2FzIGRlbGV0ZWQgYW5kIGFuCisgICBhY3RpdmUgcGFpciBoYXMgbm90IHlldCBvdmVyd3JpdHRlbiB0aGUgc2xvdC4gIER1bW15IGNhbiB0cmFuc2l0aW9uIHRvCisgICBBY3RpdmUgdXBvbiBrZXkgaW5zZXJ0aW9uLiAgRHVtbXkgc2xvdHMgY2Fubm90IGJlIG1hZGUgVW51c2VkIGFnYWluCisgICAoY2Fubm90IGhhdmUgbWVfa2V5IHNldCB0byBOVUxMKSwgZWxzZSB0aGUgcHJvYmUgc2VxdWVuY2UgaW4gY2FzZSBvZgorICAgY29sbGlzaW9uIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGtub3cgdGhleSB3ZXJlIG9uY2UgYWN0aXZlLgorCitOb3RlOiAucG9waXRlbSgpIGFidXNlcyB0aGUgbWVfaGFzaCBmaWVsZCBvZiBhbiBVbnVzZWQgb3IgRHVtbXkgc2xvdCB0bworaG9sZCBhIHNlYXJjaCBmaW5nZXIuICBUaGUgbWVfaGFzaCBmaWVsZCBvZiBVbnVzZWQgb3IgRHVtbXkgc2xvdHMgaGFzIG5vCittZWFuaW5nIG90aGVyd2lzZS4KKyovCisKKy8qIFB5RGljdF9NSU5TSVpFIGlzIHRoZSBtaW5pbXVtIHNpemUgb2YgYSBkaWN0aW9uYXJ5LiAgVGhpcyBtYW55IHNsb3RzIGFyZQorICogYWxsb2NhdGVkIGRpcmVjdGx5IGluIHRoZSBkaWN0IG9iamVjdCAoaW4gdGhlIG1hX3NtYWxsdGFibGUgbWVtYmVyKS4KKyAqIEl0IG11c3QgYmUgYSBwb3dlciBvZiAyLCBhbmQgYXQgbGVhc3QgNC4gIDggYWxsb3dzIGRpY3RzIHdpdGggbm8gbW9yZQorICogdGhhbiA1IGFjdGl2ZSBlbnRyaWVzIHRvIGxpdmUgaW4gbWFfc21hbGx0YWJsZSAoYW5kIHNvIGF2b2lkIGFuCisgKiBhZGRpdGlvbmFsIG1hbGxvYyk7IGluc3RydW1lbnRhdGlvbiBzdWdnZXN0ZWQgdGhpcyBzdWZmaWNlcyBmb3IgdGhlCisgKiBtYWpvcml0eSBvZiBkaWN0cyAoY29uc2lzdGluZyBtb3N0bHkgb2YgdXN1YWxseS1zbWFsbCBpbnN0YW5jZSBkaWN0cyBhbmQKKyAqIHVzdWFsbHktc21hbGwgZGljdHMgY3JlYXRlZCB0byBwYXNzIGtleXdvcmQgYXJndW1lbnRzKS4KKyAqLworI2RlZmluZSBQeURpY3RfTUlOU0laRSA4CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICAvKiBDYWNoZWQgaGFzaCBjb2RlIG9mIG1lX2tleS4gIE5vdGUgdGhhdCBoYXNoIGNvZGVzIGFyZSBDIGxvbmdzLgorICAgICAqIFdlIGhhdmUgdG8gdXNlIFB5X3NzaXplX3QgaW5zdGVhZCBiZWNhdXNlIGRpY3RfcG9waXRlbSgpIGFidXNlcworICAgICAqIG1lX2hhc2ggdG8gaG9sZCBhIHNlYXJjaCBmaW5nZXIuCisgICAgICovCisgICAgUHlfc3NpemVfdCBtZV9oYXNoOworICAgIFB5T2JqZWN0ICptZV9rZXk7CisgICAgUHlPYmplY3QgKm1lX3ZhbHVlOworfSBQeURpY3RFbnRyeTsKKworLyoKK1RvIGVuc3VyZSB0aGUgbG9va3VwIGFsZ29yaXRobSB0ZXJtaW5hdGVzLCB0aGVyZSBtdXN0IGJlIGF0IGxlYXN0IG9uZSBVbnVzZWQKK3Nsb3QgKE5VTEwga2V5KSBpbiB0aGUgdGFibGUuCitUaGUgdmFsdWUgbWFfZmlsbCBpcyB0aGUgbnVtYmVyIG9mIG5vbi1OVUxMIGtleXMgKHN1bSBvZiBBY3RpdmUgYW5kIER1bW15KTsKK21hX3VzZWQgaXMgdGhlIG51bWJlciBvZiBub24tTlVMTCwgbm9uLWR1bW15IGtleXMgKD09IHRoZSBudW1iZXIgb2Ygbm9uLU5VTEwKK3ZhbHVlcyA9PSB0aGUgbnVtYmVyIG9mIEFjdGl2ZSBpdGVtcykuCitUbyBhdm9pZCBzbG93aW5nIGRvd24gbG9va3VwcyBvbiBhIG5lYXItZnVsbCB0YWJsZSwgd2UgcmVzaXplIHRoZSB0YWJsZSB3aGVuCitpdCdzIHR3by10aGlyZHMgZnVsbC4KKyovCit0eXBlZGVmIHN0cnVjdCBfZGljdG9iamVjdCBQeURpY3RPYmplY3Q7CitzdHJ1Y3QgX2RpY3RvYmplY3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeV9zc2l6ZV90IG1hX2ZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KKyAgICBQeV9zc2l6ZV90IG1hX3VzZWQ7ICAvKiAjIEFjdGl2ZSAqLworCisgICAgLyogVGhlIHRhYmxlIGNvbnRhaW5zIG1hX21hc2sgKyAxIHNsb3RzLCBhbmQgdGhhdCdzIGEgcG93ZXIgb2YgMi4KKyAgICAgKiBXZSBzdG9yZSB0aGUgbWFzayBpbnN0ZWFkIG9mIHRoZSBzaXplIGJlY2F1c2UgdGhlIG1hc2sgaXMgbW9yZQorICAgICAqIGZyZXF1ZW50bHkgbmVlZGVkLgorICAgICAqLworICAgIFB5X3NzaXplX3QgbWFfbWFzazsKKworICAgIC8qIG1hX3RhYmxlIHBvaW50cyB0byBtYV9zbWFsbHRhYmxlIGZvciBzbWFsbCB0YWJsZXMsIGVsc2UgdG8KKyAgICAgKiBhZGRpdGlvbmFsIG1hbGxvYydlZCBtZW1vcnkuICBtYV90YWJsZSBpcyBuZXZlciBOVUxMISAgVGhpcyBydWxlCisgICAgICogc2F2ZXMgcmVwZWF0ZWQgcnVudGltZSBudWxsLXRlc3RzIGluIHRoZSB3b3JraG9yc2UgZ2V0aXRlbSBhbmQKKyAgICAgKiBzZXRpdGVtIGNhbGxzLgorICAgICAqLworICAgIFB5RGljdEVudHJ5ICptYV90YWJsZTsKKyAgICBQeURpY3RFbnRyeSAqKCptYV9sb29rdXApKFB5RGljdE9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7CisgICAgUHlEaWN0RW50cnkgbWFfc21hbGx0YWJsZVtQeURpY3RfTUlOU0laRV07Cit9OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlEaWN0X1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlEaWN0SXRlcktleV9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdEl0ZXJWYWx1ZV9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdEl0ZXJJdGVtX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlEaWN0S2V5c19UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RGljdEl0ZW1zX1R5cGU7CitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlEaWN0VmFsdWVzX1R5cGU7CisKKyNkZWZpbmUgUHlEaWN0X0NoZWNrKG9wKSBcCisgICAgICAgICAgICAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfRElDVF9TVUJDTEFTUykKKyNkZWZpbmUgUHlEaWN0X0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlEaWN0X1R5cGUpCisjZGVmaW5lIFB5RGljdEtleXNfQ2hlY2sob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlEaWN0S2V5c19UeXBlKQorI2RlZmluZSBQeURpY3RJdGVtc19DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeURpY3RJdGVtc19UeXBlKQorI2RlZmluZSBQeURpY3RWYWx1ZXNfQ2hlY2sob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlEaWN0VmFsdWVzX1R5cGUpCisvKiBUaGlzIGV4Y2x1ZGVzIFZhbHVlcywgc2luY2UgdGhleSBhcmUgbm90IHNldHMuICovCisjIGRlZmluZSBQeURpY3RWaWV3U2V0X0NoZWNrKG9wKSBcCisgICAgKFB5RGljdEtleXNfQ2hlY2sob3ApIHx8IFB5RGljdEl0ZW1zX0NoZWNrKG9wKSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfTmV3KHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfR2V0SXRlbShQeU9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXkpOworUHlBUElfRlVOQyhpbnQpIFB5RGljdF9TZXRJdGVtKFB5T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSwgUHlPYmplY3QgKml0ZW0pOworUHlBUElfRlVOQyhpbnQpIFB5RGljdF9EZWxJdGVtKFB5T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RGljdF9DbGVhcihQeU9iamVjdCAqbXApOworUHlBUElfRlVOQyhpbnQpIFB5RGljdF9OZXh0KAorICAgIFB5T2JqZWN0ICptcCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgUHlPYmplY3QgKip2YWx1ZSk7CitQeUFQSV9GVU5DKGludCkgX1B5RGljdF9OZXh0KAorICAgIFB5T2JqZWN0ICptcCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgUHlPYmplY3QgKip2YWx1ZSwgbG9uZyAqaGFzaCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9LZXlzKFB5T2JqZWN0ICptcCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9WYWx1ZXMoUHlPYmplY3QgKm1wKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlEaWN0X0l0ZW1zKFB5T2JqZWN0ICptcCk7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5RGljdF9TaXplKFB5T2JqZWN0ICptcCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RGljdF9Db3B5KFB5T2JqZWN0ICptcCk7CitQeUFQSV9GVU5DKGludCkgUHlEaWN0X0NvbnRhaW5zKFB5T2JqZWN0ICptcCwgUHlPYmplY3QgKmtleSk7CitQeUFQSV9GVU5DKGludCkgX1B5RGljdF9Db250YWlucyhQeU9iamVjdCAqbXAsIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeURpY3RfTmV3UHJlc2l6ZWQoUHlfc3NpemVfdCBtaW51c2VkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5RGljdF9NYXliZVVudHJhY2soUHlPYmplY3QgKm1wKTsKKworLyogUHlEaWN0X1VwZGF0ZShtcCwgb3RoZXIpIGlzIGVxdWl2YWxlbnQgdG8gUHlEaWN0X01lcmdlKG1wLCBvdGhlciwgMSkuICovCitQeUFQSV9GVU5DKGludCkgUHlEaWN0X1VwZGF0ZShQeU9iamVjdCAqbXAsIFB5T2JqZWN0ICpvdGhlcik7CisKKy8qIFB5RGljdF9NZXJnZSB1cGRhdGVzL21lcmdlcyBmcm9tIGEgbWFwcGluZyBvYmplY3QgKGFuIG9iamVjdCB0aGF0CisgICBzdXBwb3J0cyBQeU1hcHBpbmdfS2V5cygpIGFuZCBQeU9iamVjdF9HZXRJdGVtKCkpLiAgSWYgb3ZlcnJpZGUgaXMgdHJ1ZSwKKyAgIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgYSBrZXkgd2lucywgZWxzZSB0aGUgZmlyc3QuICBUaGUgUHl0aG9uCisgICBkaWN0LnVwZGF0ZShvdGhlcikgaXMgZXF1aXZhbGVudCB0byBQeURpY3RfTWVyZ2UoZGljdCwgb3RoZXIsIDEpLgorKi8KK1B5QVBJX0ZVTkMoaW50KSBQeURpY3RfTWVyZ2UoUHlPYmplY3QgKm1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdmVycmlkZSk7CisKKy8qIFB5RGljdF9NZXJnZUZyb21TZXEyIHVwZGF0ZXMvbWVyZ2VzIGZyb20gYW4gaXRlcmFibGUgb2JqZWN0IHByb2R1Y2luZworICAgaXRlcmFibGUgb2JqZWN0cyBvZiBsZW5ndGggMi4gIElmIG92ZXJyaWRlIGlzIHRydWUsIHRoZSBsYXN0IG9jY3VycmVuY2UKKyAgIG9mIGEga2V5IHdpbnMsIGVsc2UgdGhlIGZpcnN0LiAgVGhlIFB5dGhvbiBkaWN0IGNvbnN0cnVjdG9yIGRpY3Qoc2VxMikKKyAgIGlzIGVxdWl2YWxlbnQgdG8gZGljdD17fTsgUHlEaWN0X01lcmdlRnJvbVNlcShkaWN0LCBzZXEyLCAxKS4KKyovCitQeUFQSV9GVU5DKGludCkgUHlEaWN0X01lcmdlRnJvbVNlcTIoUHlPYmplY3QgKmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnNlcTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG92ZXJyaWRlKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeURpY3RfR2V0SXRlbVN0cmluZyhQeU9iamVjdCAqZHAsIGNvbnN0IGNoYXIgKmtleSk7CitQeUFQSV9GVU5DKGludCkgUHlEaWN0X1NldEl0ZW1TdHJpbmcoUHlPYmplY3QgKmRwLCBjb25zdCBjaGFyICprZXksIFB5T2JqZWN0ICppdGVtKTsKK1B5QVBJX0ZVTkMoaW50KSBQeURpY3RfRGVsSXRlbVN0cmluZyhQeU9iamVjdCAqZHAsIGNvbnN0IGNoYXIgKmtleSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0RJQ1RPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZHRvYS5oIGIvaW5jbHVkZS9weXRob24yLjcvZHRvYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDM0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9kdG9hLmgKQEAgLTAsMCArMSwxNSBAQAorI2lmbmRlZiBQWV9OT19TSE9SVF9GTE9BVF9SRVBSCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkMoZG91YmxlKSBfUHlfZGdfc3RydG9kKGNvbnN0IGNoYXIgKnN0ciwgY2hhciAqKnB0cik7CitQeUFQSV9GVU5DKGNoYXIgKikgX1B5X2RnX2R0b2EoZG91YmxlIGQsIGludCBtb2RlLCBpbnQgbmRpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZGVjcHQsIGludCAqc2lnbiwgY2hhciAqKnJ2ZSk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeV9kZ19mcmVlZHRvYShjaGFyICpzKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9lbnVtb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9lbnVtb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZGJmYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2VudW1vYmplY3QuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIFB5X0VOVU1PQkpFQ1RfSAorI2RlZmluZSBQeV9FTlVNT0JKRUNUX0gKKworLyogRW51bWVyYXRlIE9iamVjdCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUVudW1fVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVJldmVyc2VkX1R5cGU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhUHlfRU5VTU9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9lcnJjb2RlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9lcnJjb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjZWM4MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2VycmNvZGUuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIFB5X0VSUkNPREVfSAorI2RlZmluZSBQeV9FUlJDT0RFX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBFcnJvciBjb2RlcyBwYXNzZWQgYXJvdW5kIGJldHdlZW4gZmlsZSBpbnB1dCwgdG9rZW5pemVyLCBwYXJzZXIgYW5kCisgICBpbnRlcnByZXRlci4gIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHdlIGNhbiB0dXJuIHRoZW0gaW50byBQeXRob24KKyAgIGV4Y2VwdGlvbnMgYXQgYSBoaWdoZXIgbGV2ZWwuICBOb3RlIHRoYXQgc29tZSBlcnJvcnMgaGF2ZSBhCisgICBzbGlnaHRseSBkaWZmZXJlbnQgbWVhbmluZyB3aGVuIHBhc3NlZCBmcm9tIHRoZSB0b2tlbml6ZXIgdG8gdGhlCisgICBwYXJzZXIgdGhhbiB3aGVuIHBhc3NlZCBmcm9tIHRoZSBwYXJzZXIgdG8gdGhlIGludGVycHJldGVyOyBlLmcuCisgICB0aGUgcGFyc2VyIG9ubHkgcmV0dXJucyBFX0VPRiB3aGVuIGl0IGhpdHMgRU9GIGltbWVkaWF0ZWx5LCBhbmQgaXQKKyAgIG5ldmVyIHJldHVybnMgRV9PSy4gKi8KKworI2RlZmluZSBFX09LCQkxMAkvKiBObyBlcnJvciAqLworI2RlZmluZSBFX0VPRgkJMTEJLyogRW5kIE9mIEZpbGUgKi8KKyNkZWZpbmUgRV9JTlRSCQkxMgkvKiBJbnRlcnJ1cHRlZCAqLworI2RlZmluZSBFX1RPS0VOCQkxMwkvKiBCYWQgdG9rZW4gKi8KKyNkZWZpbmUgRV9TWU5UQVgJMTQJLyogU3ludGF4IGVycm9yICovCisjZGVmaW5lIEVfTk9NRU0JCTE1CS8qIFJhbiBvdXQgb2YgbWVtb3J5ICovCisjZGVmaW5lIEVfRE9ORQkJMTYJLyogUGFyc2luZyBjb21wbGV0ZSAqLworI2RlZmluZSBFX0VSUk9SCQkxNwkvKiBFeGVjdXRpb24gZXJyb3IgKi8KKyNkZWZpbmUgRV9UQUJTUEFDRQkxOAkvKiBJbmNvbnNpc3RlbnQgbWl4aW5nIG9mIHRhYnMgYW5kIHNwYWNlcyAqLworI2RlZmluZSBFX09WRVJGTE9XICAgICAgMTkJLyogTm9kZSBoYWQgdG9vIG1hbnkgY2hpbGRyZW4gKi8KKyNkZWZpbmUgRV9UT09ERUVQCTIwCS8qIFRvbyBtYW55IGluZGVudGF0aW9uIGxldmVscyAqLworI2RlZmluZSBFX0RFREVOVAkyMQkvKiBObyBtYXRjaGluZyBvdXRlciBibG9jayBmb3IgZGVkZW50ICovCisjZGVmaW5lIEVfREVDT0RFCTIyCS8qIEVycm9yIGluIGRlY29kaW5nIGludG8gVW5pY29kZSAqLworI2RlZmluZSBFX0VPRlMJCTIzCS8qIEVPRiBpbiB0cmlwbGUtcXVvdGVkIHN0cmluZyAqLworI2RlZmluZSBFX0VPTFMJCTI0CS8qIEVPTCBpbiBzaW5nbGUtcXVvdGVkIHN0cmluZyAqLworI2RlZmluZSBFX0xJTkVDT05UCTI1CS8qIFVuZXhwZWN0ZWQgY2hhcmFjdGVycyBhZnRlciBhIGxpbmUgY29udGludWF0aW9uICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0VSUkNPREVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZXZhbC5oIGIvaW5jbHVkZS9weXRob24yLjcvZXZhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OGRmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9ldmFsLmgKQEAgLTAsMCArMSwyNSBAQAorCisvKiBJbnRlcmZhY2UgdG8gZXhlY3V0ZSBjb21waWxlZCBjb2RlICovCisKKyNpZm5kZWYgUHlfRVZBTF9ICisjZGVmaW5lIFB5X0VWQUxfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXZhbF9FdmFsQ29kZShQeUNvZGVPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFdmFsX0V2YWxDb2RlRXgoUHlDb2RlT2JqZWN0ICpjbywKKwkJCQkJUHlPYmplY3QgKmdsb2JhbHMsCisJCQkJCVB5T2JqZWN0ICpsb2NhbHMsCisJCQkJCVB5T2JqZWN0ICoqYXJncywgaW50IGFyZ2MsCisJCQkJCVB5T2JqZWN0ICoqa3dkcywgaW50IGt3ZGMsCisJCQkJCVB5T2JqZWN0ICoqZGVmcywgaW50IGRlZmMsCisJCQkJCVB5T2JqZWN0ICpjbG9zdXJlKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlFdmFsX0NhbGxUcmFjaW5nKFB5T2JqZWN0ICpmdW5jLCBQeU9iamVjdCAqYXJncyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0VWQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZmlsZW9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvZmlsZW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNTQwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9maWxlb2JqZWN0LmgKQEAgLTAsMCArMSw5NyBAQAorCisvKiBGaWxlIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9GSUxFT0JKRUNUX0gKKyNkZWZpbmUgUHlfRklMRU9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgRklMRSAqZl9mcDsKKyAgICBQeU9iamVjdCAqZl9uYW1lOworICAgIFB5T2JqZWN0ICpmX21vZGU7CisgICAgaW50ICgqZl9jbG9zZSkoRklMRSAqKTsKKyAgICBpbnQgZl9zb2Z0c3BhY2U7ICAgICAgICAgICAgLyogRmxhZyB1c2VkIGJ5ICdwcmludCcgY29tbWFuZCAqLworICAgIGludCBmX2JpbmFyeTsgICAgICAgICAgICAgICAvKiBGbGFnIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSBmaWxlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBpbiBiaW5hcnkgKDEpIG9yIHRleHQgKDApIG1vZGUgKi8KKyAgICBjaGFyKiBmX2J1ZjsgICAgICAgICAgICAgICAgLyogQWxsb2NhdGVkIHJlYWRhaGVhZCBidWZmZXIgKi8KKyAgICBjaGFyKiBmX2J1ZmVuZDsgICAgICAgICAgICAgLyogUG9pbnRzIGFmdGVyIGxhc3Qgb2NjdXBpZWQgcG9zaXRpb24gKi8KKyAgICBjaGFyKiBmX2J1ZnB0cjsgICAgICAgICAgICAgLyogQ3VycmVudCBidWZmZXIgcG9zaXRpb24gKi8KKyAgICBjaGFyICpmX3NldGJ1ZjsgICAgICAgICAgICAgLyogQnVmZmVyIGZvciBzZXRidWYoMykgYW5kIHNldHZidWYoMykgKi8KKyAgICBpbnQgZl91bml2X25ld2xpbmU7ICAgICAgICAgLyogSGFuZGxlIGFueSBuZXdsaW5lIGNvbnZlbnRpb24gKi8KKyAgICBpbnQgZl9uZXdsaW5ldHlwZXM7ICAgICAgICAgLyogVHlwZXMgb2YgbmV3bGluZXMgc2VlbiAqLworICAgIGludCBmX3NraXBuZXh0bGY7ICAgICAgICAgICAvKiBTa2lwIG5leHQgXG4gKi8KKyAgICBQeU9iamVjdCAqZl9lbmNvZGluZzsKKyAgICBQeU9iamVjdCAqZl9lcnJvcnM7CisgICAgUHlPYmplY3QgKndlYWtyZWZsaXN0OyAvKiBMaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyAqLworICAgIGludCB1bmxvY2tlZF9jb3VudDsgICAgICAgICAvKiBOdW0uIGN1cnJlbnRseSBydW5uaW5nIHNlY3Rpb25zIG9mIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBmX2ZwIHdpdGggdGhlIEdJTCByZWxlYXNlZC4gKi8KKyAgICBpbnQgcmVhZGFibGU7CisgICAgaW50IHdyaXRhYmxlOworfSBQeUZpbGVPYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZpbGVfVHlwZTsKKworI2RlZmluZSBQeUZpbGVfQ2hlY2sob3ApIFB5T2JqZWN0X1R5cGVDaGVjayhvcCwgJlB5RmlsZV9UeXBlKQorI2RlZmluZSBQeUZpbGVfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeUZpbGVfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZpbGVfRnJvbVN0cmluZyhjaGFyICosIGNoYXIgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5RmlsZV9TZXRCdWZTaXplKFB5T2JqZWN0ICosIGludCk7CitQeUFQSV9GVU5DKGludCkgUHlGaWxlX1NldEVuY29kaW5nKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKGludCkgUHlGaWxlX1NldEVuY29kaW5nQW5kRXJyb3JzKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgY2hhciAqZXJyb3JzKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGaWxlX0Zyb21GaWxlKEZJTEUgKiwgY2hhciAqLCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKCopKEZJTEUgKikpOworUHlBUElfRlVOQyhGSUxFICopIFB5RmlsZV9Bc0ZpbGUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5RmlsZV9JbmNVc2VDb3VudChQeUZpbGVPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5RmlsZV9EZWNVc2VDb3VudChQeUZpbGVPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RmlsZV9OYW1lKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZpbGVfR2V0TGluZShQeU9iamVjdCAqLCBpbnQpOworUHlBUElfRlVOQyhpbnQpIFB5RmlsZV9Xcml0ZU9iamVjdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBpbnQpOworUHlBUElfRlVOQyhpbnQpIFB5RmlsZV9Tb2Z0U3BhY2UoUHlPYmplY3QgKiwgaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeUZpbGVfV3JpdGVTdHJpbmcoY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9Bc0ZpbGVEZXNjcmlwdG9yKFB5T2JqZWN0ICopOworCisvKiBUaGUgZGVmYXVsdCBlbmNvZGluZyB1c2VkIGJ5IHRoZSBwbGF0Zm9ybSBmaWxlIHN5c3RlbSBBUElzCisgICBJZiBub24tTlVMTCwgdGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgZGVmYXVsdCBlbmNvZGluZyBmb3Igc3RyaW5ncworKi8KK1B5QVBJX0RBVEEoY29uc3QgY2hhciAqKSBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nOworCisvKiBSb3V0aW5lcyB0byByZXBsYWNlIGZyZWFkKCkgYW5kIGZnZXRzKCkgd2hpY2ggYWNjZXB0IGFueSBvZiBcciwgXG4KKyAgIG9yIFxyXG4gYXMgbGluZSB0ZXJtaW5hdG9ycy4KKyovCisjZGVmaW5lIFBZX1NURElPVEVYVE1PREUgImIiCitjaGFyICpQeV9Vbml2ZXJzYWxOZXdsaW5lRmdldHMoY2hhciAqLCBpbnQsIEZJTEUqLCBQeU9iamVjdCAqKTsKK3NpemVfdCBQeV9Vbml2ZXJzYWxOZXdsaW5lRnJlYWQoY2hhciAqLCBzaXplX3QsIEZJTEUgKiwgUHlPYmplY3QgKik7CisKKy8qIEEgcm91dGluZSB0byBkbyBzYW5pdHkgY2hlY2tpbmcgb24gdGhlIGZpbGUgbW9kZSBzdHJpbmcuICByZXR1cm5zCisgICBub24temVybyBvbiBpZiBhbiBleGNlcHRpb24gb2NjdXJyZWQKKyovCitpbnQgX1B5RmlsZV9TYW5pdGl6ZU1vZGUoY2hhciAqbW9kZSk7CisKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE0MDAKKy8qIEEgcm91dGluZSB0byBjaGVjayBpZiBhIGZpbGUgZGVzY3JpcHRvciBpcyB2YWxpZCBvbiBXaW5kb3dzLiAgUmV0dXJucyAwCisgKiBhbmQgc2V0cyBlcnJubyB0byBFQkFERiBpZiBpdCBpc24ndC4gIFRoaXMgaXMgdG8gYXZvaWQgQXNzZXJ0aW9ucworICogZnJvbSB2YXJpb3VzIGZ1bmN0aW9ucyBpbiB0aGUgV2luZG93cyBDUlQgYmVnaW5uaW5nIHdpdGgKKyAqIFZpc3VhbCBTdHVkaW8gMjAwNQorICovCitpbnQgX1B5VmVyaWZ5X2ZkKGludCBmZCk7CisjZWxpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEyMDAKKy8qIGZkb3BlbiBkb2Vzbid0IHNldCBlcnJubyBFQkFERiBhbmQgY3Jhc2hlcyBmb3IgbGFyZ2UgZmQgb24gZGVidWcgYnVpbGQgKi8KKyNkZWZpbmUgX1B5VmVyaWZ5X2ZkKGZkKSAoX2dldF9vc2ZoYW5kbGUoZmQpID49IDApCisjZWxzZQorI2RlZmluZSBfUHlWZXJpZnlfZmQoQSkgKDEpIC8qIGR1bW15ICovCisjZW5kaWYKKworLyogQSByb3V0aW5lIHRvIGNoZWNrIGlmIGEgZmlsZSBkZXNjcmlwdG9yIGNhbiBiZSBzZWxlY3QoKS1lZC4gKi8KKyNpZmRlZiBIQVZFX1NFTEVDVAorICNkZWZpbmUgX1B5SXNTZWxlY3RhYmxlX2ZkKEZEKSAoKChGRCkgPj0gMCkgJiYgKChGRCkgPCBGRF9TRVRTSVpFKSkKKyNlbHNlCisgI2RlZmluZSBfUHlJc1NlbGVjdGFibGVfZmQoRkQpICgxKQorI2VuZGlmIC8qIEhBVkVfU0VMRUNUICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0ZJTEVPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZmxvYXRvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2Zsb2F0b2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlODgyNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L2Zsb2F0b2JqZWN0LmgKQEAgLTAsMCArMSwxNDAgQEAKKworLyogRmxvYXQgb2JqZWN0IGludGVyZmFjZSAqLworCisvKgorUHlGbG9hdE9iamVjdCByZXByZXNlbnRzIGEgKGRvdWJsZSBwcmVjaXNpb24pIGZsb2F0aW5nIHBvaW50IG51bWJlci4KKyovCisKKyNpZm5kZWYgUHlfRkxPQVRPQkpFQ1RfSAorI2RlZmluZSBQeV9GTE9BVE9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgZG91YmxlIG9iX2Z2YWw7Cit9IFB5RmxvYXRPYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZsb2F0X1R5cGU7CisKKyNkZWZpbmUgUHlGbG9hdF9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlGbG9hdF9UeXBlKQorI2RlZmluZSBQeUZsb2F0X0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlGbG9hdF9UeXBlKQorCisvKiBUaGUgc3RyKCkgcHJlY2lzaW9uIFB5RmxvYXRfU1RSX1BSRUNJU0lPTiBpcyBjaG9zZW4gc28gdGhhdCBpbiBtb3N0IGNhc2VzLAorICAgdGhlIHJvdW5kaW5nIG5vaXNlIGNyZWF0ZWQgYnkgdmFyaW91cyBvcGVyYXRpb25zIGlzIHN1cHByZXNzZWQsIHdoaWxlCisgICBnaXZpbmcgcGxlbnR5IG9mIHByZWNpc2lvbiBmb3IgcHJhY3RpY2FsIHVzZS4gKi8KKworI2RlZmluZSBQeUZsb2F0X1NUUl9QUkVDSVNJT04gMTIKKworI2lmZGVmIFB5X05BTgorI2RlZmluZSBQeV9SRVRVUk5fTkFOIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUoUHlfTkFOKQorI2VuZGlmCisKKyNkZWZpbmUgUHlfUkVUVVJOX0lORihzaWduKSBkbwkJCQkJXAorCWlmIChjb3B5c2lnbigxLiwgc2lnbikgPT0gMS4pIHsJCQkJXAorCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKFB5X0hVR0VfVkFMKTsJXAorCX0gZWxzZSB7CQkJCQkJXAorCQlyZXR1cm4gUHlGbG9hdF9Gcm9tRG91YmxlKC1QeV9IVUdFX1ZBTCk7CVwKKwl9IHdoaWxlKDApCisKK1B5QVBJX0ZVTkMoZG91YmxlKSBQeUZsb2F0X0dldE1heCh2b2lkKTsKK1B5QVBJX0ZVTkMoZG91YmxlKSBQeUZsb2F0X0dldE1pbih2b2lkKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGbG9hdF9HZXRJbmZvKHZvaWQpOworCisvKiBSZXR1cm4gUHl0aG9uIGZsb2F0IGZyb20gc3RyaW5nIFB5T2JqZWN0LiAgU2Vjb25kIGFyZ3VtZW50IGlnbm9yZWQgb24KKyAgIGlucHV0LCBhbmQsIGlmIG5vbi1OVUxMLCBOVUxMIGlzIHN0b3JlZCBpbnRvICpqdW5rICh0aGlzIHRyaWVkIHRvIHNlcnZlIGEKKyAgIHB1cnBvc2Ugb25jZSBidXQgY2FuJ3QgYmUgbWFkZSB0byB3b3JrIGFzIGludGVuZGVkKS4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGbG9hdF9Gcm9tU3RyaW5nKFB5T2JqZWN0KiwgY2hhcioqIGp1bmspOworCisvKiBSZXR1cm4gUHl0aG9uIGZsb2F0IGZyb20gQyBkb3VibGUuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RmxvYXRfRnJvbURvdWJsZShkb3VibGUpOworCisvKiBFeHRyYWN0IEMgZG91YmxlIGZyb20gUHl0aG9uIGZsb2F0LiAgVGhlIG1hY3JvIHZlcnNpb24gdHJhZGVzIHNhZmV0eSBmb3IKKyAgIHNwZWVkLiAqLworUHlBUElfRlVOQyhkb3VibGUpIFB5RmxvYXRfQXNEb3VibGUoUHlPYmplY3QgKik7CisjZGVmaW5lIFB5RmxvYXRfQVNfRE9VQkxFKG9wKSAoKChQeUZsb2F0T2JqZWN0ICopKG9wKSktPm9iX2Z2YWwpCisKKy8qIFdyaXRlIHJlcHIodikgaW50byB0aGUgY2hhciBidWZmZXIgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IG51bGwgYnl0ZS4gIFRoZQorICAgYnVmZmVyIG11c3QgYmUgImJpZyBlbm91Z2giOyA+PSAxMDAgaXMgdmVyeSBzYWZlLgorICAgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoYnVmLCB4KSBzdHJpdmVzIHRvIHByaW50IGVub3VnaCBkaWdpdHMgc28gdGhhdAorICAgUHlGbG9hdF9Gcm9tU3RyaW5nKGJ1ZikgdGhlbiByZXByb2R1Y2VzIHggZXhhY3RseS4gKi8KK1B5QVBJX0ZVTkModm9pZCkgUHlGbG9hdF9Bc1JlcHJTdHJpbmcoY2hhciosIFB5RmxvYXRPYmplY3QgKnYpOworCisvKiBXcml0ZSBzdHIodikgaW50byB0aGUgY2hhciBidWZmZXIgYXJndW1lbnQsIGZvbGxvd2VkIGJ5IG51bGwgYnl0ZS4gIFRoZQorICAgYnVmZmVyIG11c3QgYmUgImJpZyBlbm91Z2giOyA+PSAxMDAgaXMgdmVyeSBzYWZlLiAgTm90ZSB0aGF0IGl0J3MKKyAgIHVudXN1YWwgdG8gYmUgYWJsZSB0byBnZXQgYmFjayB0aGUgZmxvYXQgeW91IHN0YXJ0ZWQgd2l0aCBmcm9tCisgICBQeUZsb2F0X0FzU3RyaW5nJ3MgcmVzdWx0IC0tIHVzZSBQeUZsb2F0X0FzUmVwclN0cmluZygpIGlmIHlvdSB3YW50IHRvCisgICBwcmVzZXJ2ZSBwcmVjaXNpb24gYWNyb3NzIGNvbnZlcnNpb25zLiAqLworUHlBUElfRlVOQyh2b2lkKSBQeUZsb2F0X0FzU3RyaW5nKGNoYXIqLCBQeUZsb2F0T2JqZWN0ICp2KTsKKworLyogX1B5RmxvYXRfe1BhY2ssVW5wYWNrfXs0LDh9CisgKgorICogVGhlIHN0cnVjdCBhbmQgcGlja2xlIChhdCBsZWFzdCkgbW9kdWxlcyBuZWVkIGFuIGVmZmljaWVudCBwbGF0Zm9ybS0KKyAqIGluZGVwZW5kZW50IHdheSB0byBzdG9yZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYXMgYnl0ZSBzdHJpbmdzLgorICogVGhlIFBhY2sgcm91dGluZXMgcHJvZHVjZSBhIHN0cmluZyBmcm9tIGEgQyBkb3VibGUsIGFuZCB0aGUgVW5wYWNrCisgKiByb3V0aW5lcyBwcm9kdWNlIGEgQyBkb3VibGUgZnJvbSBzdWNoIGEgc3RyaW5nLiAgVGhlIHN1ZmZpeCAoNCBvciA4KQorICogc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZy4KKyAqCisgKiBPbiBwbGF0Zm9ybXMgdGhhdCBhcHBlYXIgdG8gdXNlIChzZWUgX1B5RmxvYXRfSW5pdCgpKSBJRUVFLTc1NCBmb3JtYXRzCisgKiB0aGVzZSBmdW5jdGlvbnMgd29yayBieSBjb3B5aW5nIGJpdHMuICBPbiBvdGhlciBwbGF0Zm9ybXMsIHRoZSBmb3JtYXRzIHRoZQorICogNC0gYnl0ZSBmb3JtYXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBJRUVFLTc1NCBzaW5nbGUgcHJlY2lzaW9uIGZvcm1hdCwgYW5kCisgKiB0aGUgOC1ieXRlIGZvcm1hdCB0byB0aGUgSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiBmb3JtYXQsIGFsdGhvdWdoIHRoZQorICogcGFja2luZyBvZiBJTkZzIGFuZCBOYU5zIChpZiBzdWNoIHRoaW5ncyBleGlzdCBvbiB0aGUgcGxhdGZvcm0pIGlzbid0CisgKiBoYW5kbGVkIGNvcnJlY3RseSwgYW5kIGF0dGVtcHRpbmcgdG8gdW5wYWNrIGEgc3RyaW5nIGNvbnRhaW5pbmcgYW4gSUVFRQorICogSU5GIG9yIE5hTiB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAqCisgKiBPbiBub24tSUVFRSBwbGF0Zm9ybXMgd2l0aCBtb3JlIHByZWNpc2lvbiwgb3IgbGFyZ2VyIGR5bmFtaWMgcmFuZ2UsIHRoYW4KKyAqIDc1NCBzdXBwb3J0cywgbm90IGFsbCB2YWx1ZXMgY2FuIGJlIHBhY2tlZDsgb24gbm9uLUlFRUUgcGxhdGZvcm1zIHdpdGggbGVzcworICogcHJlY2lzaW9uLCBvciBzbWFsbGVyIGR5bmFtaWMgcmFuZ2UsIG5vdCBhbGwgdmFsdWVzIGNhbiBiZSB1bnBhY2tlZC4gIFdoYXQKKyAqIGhhcHBlbnMgaW4gc3VjaCBjYXNlcyBpcyBwYXJ0bHkgYWNjaWRlbnRhbCAoYWxhcykuCisgKi8KKworLyogVGhlIHBhY2sgcm91dGluZXMgd3JpdGUgNCBvciA4IGJ5dGVzLCBzdGFydGluZyBhdCBwLiAgbGUgaXMgYSBib29sCisgKiBhcmd1bWVudCwgdHJ1ZSBpZiB5b3Ugd2FudCB0aGUgc3RyaW5nIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IChleHBvbmVudAorICogbGFzdCwgYXQgcCszIG9yIHArNyksIGZhbHNlIGlmIHlvdSB3YW50IGJpZy1lbmRpYW4gZm9ybWF0IChleHBvbmVudAorICogZmlyc3QsIGF0IHApLgorICogUmV0dXJuIHZhbHVlOiAgMCBpZiBhbGwgaXMgT0ssIC0xIGlmIGVycm9yIChhbmQgYW4gZXhjZXB0aW9uIGlzCisgKiBzZXQsIG1vc3QgbGlrZWx5IE92ZXJmbG93RXJyb3IpLgorICogVGhlcmUgYXJlIHR3byBwcm9ibGVtcyBvbiBub24tSUVFRSBwbGF0Zm9ybXM6CisgKiAxKTogIFdoYXQgdGhpcyBkb2VzIGlzIHVuZGVmaW5lZCBpZiB4IGlzIGEgTmFOIG9yIGluZmluaXR5LgorICogMik6ICAtMC4wIGFuZCArMC4wIHByb2R1Y2UgdGhlIHNhbWUgc3RyaW5nLgorICovCitQeUFQSV9GVU5DKGludCkgX1B5RmxvYXRfUGFjazQoZG91YmxlIHgsIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSk7CitQeUFQSV9GVU5DKGludCkgX1B5RmxvYXRfUGFjazgoZG91YmxlIHgsIHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSk7CisKKy8qIFVzZWQgdG8gZ2V0IHRoZSBpbXBvcnRhbnQgZGVjaW1hbCBkaWdpdHMgb2YgYSBkb3VibGUgKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlGbG9hdF9EaWdpdHMoY2hhciAqYnVmLCBkb3VibGUgdiwgaW50ICpzaWdudW0pOworUHlBUElfRlVOQyh2b2lkKSBfUHlGbG9hdF9EaWdpdHNJbml0KHZvaWQpOworCisvKiBUaGUgdW5wYWNrIHJvdXRpbmVzIHJlYWQgNCBvciA4IGJ5dGVzLCBzdGFydGluZyBhdCBwLiAgbGUgaXMgYSBib29sCisgKiBhcmd1bWVudCwgdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGluIGxpdHRsZS1lbmRpYW4gZm9ybWF0IChleHBvbmVudAorICogbGFzdCwgYXQgcCszIG9yIHArNyksIGZhbHNlIGlmIGJpZy1lbmRpYW4gKGV4cG9uZW50IGZpcnN0LCBhdCBwKS4KKyAqIFJldHVybiB2YWx1ZTogIFRoZSB1bnBhY2tlZCBkb3VibGUuICBPbiBlcnJvciwgdGhpcyBpcyAtMS4wIGFuZAorICogUHlFcnJfT2NjdXJyZWQoKSBpcyB0cnVlIChhbmQgYW4gZXhjZXB0aW9uIGlzIHNldCwgbW9zdCBsaWtlbHkKKyAqIE92ZXJmbG93RXJyb3IpLiAgTm90ZSB0aGF0IG9uIGEgbm9uLUlFRUUgcGxhdGZvcm0gdGhpcyB3aWxsIHJlZnVzZQorICogdG8gdW5wYWNrIGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyBhIE5hTiBvciBpbmZpbml0eS4KKyAqLworUHlBUElfRlVOQyhkb3VibGUpIF9QeUZsb2F0X1VucGFjazQoY29uc3QgdW5zaWduZWQgY2hhciAqcCwgaW50IGxlKTsKK1B5QVBJX0ZVTkMoZG91YmxlKSBfUHlGbG9hdF9VbnBhY2s4KGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsIGludCBsZSk7CisKKy8qIGZyZWUgbGlzdCBhcGkgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUZsb2F0X0NsZWFyRnJlZUxpc3Qodm9pZCk7CisKKy8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQorICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5RmxvYXRfRm9ybWF0QWR2YW5jZWQoUHlPYmplY3QgKm9iaiwKKwkJCQkJICAgICAgIGNoYXIgKmZvcm1hdF9zcGVjLAorCQkJCQkgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOworCisvKiBSb3VuZCBhIEMgZG91YmxlIHggdG8gdGhlIGNsb3Nlc3QgbXVsdGlwbGUgb2YgMTAqKi1uZGlnaXRzLiAgUmV0dXJucyBhCisgICBQeXRob24gZmxvYXQgb24gc3VjY2Vzcywgb3IgTlVMTCAod2l0aCBhbiBhcHByb3ByaWF0ZSBleGNlcHRpb24gc2V0KSBvbgorICAgZmFpbHVyZS4gIFVzZWQgaW4gYnVpbHRpbl9yb3VuZCBpbiBibHRpbm1vZHVsZS5jLiAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlfZG91YmxlX3JvdW5kKGRvdWJsZSB4LCBpbnQgbmRpZ2l0cyk7CisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9GTE9BVE9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9mcmFtZW9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvZnJhbWVvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2U3Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZnJhbWVvYmplY3QuaApAQCAtMCwwICsxLDg5IEBACisKKy8qIEZyYW1lIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9GUkFNRU9CSkVDVF9ICisjZGVmaW5lIFB5X0ZSQU1FT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBiX3R5cGU7CQkJLyogd2hhdCBraW5kIG9mIGJsb2NrIHRoaXMgaXMgKi8KKyAgICBpbnQgYl9oYW5kbGVyOwkJLyogd2hlcmUgdG8ganVtcCB0byBmaW5kIGhhbmRsZXIgKi8KKyAgICBpbnQgYl9sZXZlbDsJCS8qIHZhbHVlIHN0YWNrIGxldmVsIHRvIHBvcCB0byAqLworfSBQeVRyeUJsb2NrOworCit0eXBlZGVmIHN0cnVjdCBfZnJhbWUgeworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgc3RydWN0IF9mcmFtZSAqZl9iYWNrOwkvKiBwcmV2aW91cyBmcmFtZSwgb3IgTlVMTCAqLworICAgIFB5Q29kZU9iamVjdCAqZl9jb2RlOwkvKiBjb2RlIHNlZ21lbnQgKi8KKyAgICBQeU9iamVjdCAqZl9idWlsdGluczsJLyogYnVpbHRpbiBzeW1ib2wgdGFibGUgKFB5RGljdE9iamVjdCkgKi8KKyAgICBQeU9iamVjdCAqZl9nbG9iYWxzOwkvKiBnbG9iYWwgc3ltYm9sIHRhYmxlIChQeURpY3RPYmplY3QpICovCisgICAgUHlPYmplY3QgKmZfbG9jYWxzOwkJLyogbG9jYWwgc3ltYm9sIHRhYmxlIChhbnkgbWFwcGluZykgKi8KKyAgICBQeU9iamVjdCAqKmZfdmFsdWVzdGFjazsJLyogcG9pbnRzIGFmdGVyIHRoZSBsYXN0IGxvY2FsICovCisgICAgLyogTmV4dCBmcmVlIHNsb3QgaW4gZl92YWx1ZXN0YWNrLiAgRnJhbWUgY3JlYXRpb24gc2V0cyB0byBmX3ZhbHVlc3RhY2suCisgICAgICAgRnJhbWUgZXZhbHVhdGlvbiB1c3VhbGx5IE5VTExzIGl0LCBidXQgYSBmcmFtZSB0aGF0IHlpZWxkcyBzZXRzIGl0CisgICAgICAgdG8gdGhlIGN1cnJlbnQgc3RhY2sgdG9wLiAqLworICAgIFB5T2JqZWN0ICoqZl9zdGFja3RvcDsKKyAgICBQeU9iamVjdCAqZl90cmFjZTsJCS8qIFRyYWNlIGZ1bmN0aW9uICovCisKKyAgICAvKiBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGluIHRoaXMgZnJhbWUsIHRoZSBuZXh0IHRocmVlIGFyZSB1c2VkIHRvCisgICAgICogcmVjb3JkIHRoZSBleGNlcHRpb24gaW5mbyAoaWYgYW55KSBvcmlnaW5hbGx5IGluIHRoZSB0aHJlYWQgc3RhdGUuICBTZWUKKyAgICAgKiBjb21tZW50cyBiZWZvcmUgc2V0X2V4Y19pbmZvKCkgLS0gaXQncyBub3Qgb2J2aW91cy4KKyAgICAgKiBJbnZhcmlhbnQ6ICBpZiBfdHlwZSBpcyBOVUxMLCB0aGVuIHNvIGFyZSBfdmFsdWUgYW5kIF90cmFjZWJhY2suCisgICAgICogRGVzaXJlZCBpbnZhcmlhbnQ6ICBhbGwgdGhyZWUgYXJlIE5VTEwsIG9yIGFsbCB0aHJlZSBhcmUgbm9uLU5VTEwuICBUaGF0CisgICAgICogb25lIGlzbid0IGN1cnJlbnRseSB0cnVlLCBidXQgInNob3VsZCBiZSIuCisgICAgICovCisgICAgUHlPYmplY3QgKmZfZXhjX3R5cGUsICpmX2V4Y192YWx1ZSwgKmZfZXhjX3RyYWNlYmFjazsKKworICAgIFB5VGhyZWFkU3RhdGUgKmZfdHN0YXRlOworICAgIGludCBmX2xhc3RpOwkJLyogTGFzdCBpbnN0cnVjdGlvbiBpZiBjYWxsZWQgKi8KKyAgICAvKiBDYWxsIFB5RnJhbWVfR2V0TGluZU51bWJlcigpIGluc3RlYWQgb2YgcmVhZGluZyB0aGlzIGZpZWxkCisgICAgICAgZGlyZWN0bHkuICBBcyBvZiAyLjMgZl9saW5lbm8gaXMgb25seSB2YWxpZCB3aGVuIHRyYWNpbmcgaXMKKyAgICAgICBhY3RpdmUgKGkuZS4gd2hlbiBmX3RyYWNlIGlzIHNldCkuICBBdCBvdGhlciB0aW1lcyB3ZSB1c2UKKyAgICAgICBQeUNvZGVfQWRkcjJMaW5lIHRvIGNhbGN1bGF0ZSB0aGUgbGluZSBmcm9tIHRoZSBjdXJyZW50CisgICAgICAgYnl0ZWNvZGUgaW5kZXguICovCisgICAgaW50IGZfbGluZW5vOwkJLyogQ3VycmVudCBsaW5lIG51bWJlciAqLworICAgIGludCBmX2libG9jazsJCS8qIGluZGV4IGluIGZfYmxvY2tzdGFjayAqLworICAgIFB5VHJ5QmxvY2sgZl9ibG9ja3N0YWNrW0NPX01BWEJMT0NLU107IC8qIGZvciB0cnkgYW5kIGxvb3AgYmxvY2tzICovCisgICAgUHlPYmplY3QgKmZfbG9jYWxzcGx1c1sxXTsJLyogbG9jYWxzK3N0YWNrLCBkeW5hbWljYWxseSBzaXplZCAqLworfSBQeUZyYW1lT2JqZWN0OworCisKKy8qIFN0YW5kYXJkIG9iamVjdCBpbnRlcmZhY2UgKi8KKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RnJhbWVfVHlwZTsKKworI2RlZmluZSBQeUZyYW1lX0NoZWNrKG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmUHlGcmFtZV9UeXBlKQorI2RlZmluZSBQeUZyYW1lX0lzUmVzdHJpY3RlZChmKSBcCisJKChmKS0+Zl9idWlsdGlucyAhPSAoZiktPmZfdHN0YXRlLT5pbnRlcnAtPmJ1aWx0aW5zKQorCitQeUFQSV9GVU5DKFB5RnJhbWVPYmplY3QgKikgUHlGcmFtZV9OZXcoUHlUaHJlYWRTdGF0ZSAqLCBQeUNvZGVPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCisKKy8qIFRoZSByZXN0IG9mIHRoZSBpbnRlcmZhY2UgaXMgc3BlY2lmaWMgZm9yIGZyYW1lIG9iamVjdHMgKi8KKworLyogQmxvY2sgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KKworUHlBUElfRlVOQyh2b2lkKSBQeUZyYW1lX0Jsb2NrU2V0dXAoUHlGcmFtZU9iamVjdCAqLCBpbnQsIGludCwgaW50KTsKK1B5QVBJX0ZVTkMoUHlUcnlCbG9jayAqKSBQeUZyYW1lX0Jsb2NrUG9wKFB5RnJhbWVPYmplY3QgKik7CisKKy8qIEV4dGVuZCB0aGUgdmFsdWUgc3RhY2sgKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKikgUHlGcmFtZV9FeHRlbmRTdGFjayhQeUZyYW1lT2JqZWN0ICosIGludCwgaW50KTsKKworLyogQ29udmVyc2lvbnMgYmV0d2VlbiAiZmFzdCBsb2NhbHMiIGFuZCBsb2NhbHMgaW4gZGljdGlvbmFyeSAqLworCitQeUFQSV9GVU5DKHZvaWQpIFB5RnJhbWVfTG9jYWxzVG9GYXN0KFB5RnJhbWVPYmplY3QgKiwgaW50KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlGcmFtZV9GYXN0VG9Mb2NhbHMoUHlGcmFtZU9iamVjdCAqKTsKKworUHlBUElfRlVOQyhpbnQpIFB5RnJhbWVfQ2xlYXJGcmVlTGlzdCh2b2lkKTsKKworLyogUmV0dXJuIHRoZSBsaW5lIG9mIGNvZGUgdGhlIGZyYW1lIGlzIGN1cnJlbnRseSBleGVjdXRpbmcuICovCitQeUFQSV9GVU5DKGludCkgUHlGcmFtZV9HZXRMaW5lTnVtYmVyKFB5RnJhbWVPYmplY3QgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0ZSQU1FT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2Z1bmNvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2Z1bmNvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjE5ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZnVuY29iamVjdC5oCkBAIC0wLDAgKzEsNzYgQEAKKworLyogRnVuY3Rpb24gb2JqZWN0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X0ZVTkNPQkpFQ1RfSAorI2RlZmluZSBQeV9GVU5DT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogRnVuY3Rpb24gb2JqZWN0cyBhbmQgY29kZSBvYmplY3RzIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCBlYWNoIG90aGVyOgorICoKKyAqIEZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgJ2RlZicgc3RhdGVtZW50LgorICogVGhleSByZWZlcmVuY2UgYSBjb2RlIG9iamVjdCBpbiB0aGVpciBmdW5jX2NvZGUgYXR0cmlidXRlLCB3aGljaCBpcyBhCisgKiBwdXJlbHkgc3ludGFjdGljIG9iamVjdCwgaS5lLiBub3RoaW5nIG1vcmUgdGhhbiBhIGNvbXBpbGVkIHZlcnNpb24gb2Ygc29tZQorICogc291cmNlIGNvZGUgbGluZXMuICBUaGVyZSBpcyBvbmUgY29kZSBvYmplY3QgcGVyIHNvdXJjZSBjb2RlICJmcmFnbWVudCIsCisgKiBidXQgZWFjaCBjb2RlIG9iamVjdCBjYW4gYmUgcmVmZXJlbmNlZCBieSB6ZXJvIG9yIG1hbnkgZnVuY3Rpb24gb2JqZWN0cworICogZGVwZW5kaW5nIG9ubHkgb24gaG93IG1hbnkgdGltZXMgdGhlICdkZWYnIHN0YXRlbWVudCBpbiB0aGUgc291cmNlIHdhcworICogZXhlY3V0ZWQgc28gZmFyLgorICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmZ1bmNfY29kZTsJLyogQSBjb2RlIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICpmdW5jX2dsb2JhbHM7CS8qIEEgZGljdGlvbmFyeSAob3RoZXIgbWFwcGluZ3Mgd29uJ3QgZG8pICovCisgICAgUHlPYmplY3QgKmZ1bmNfZGVmYXVsdHM7CS8qIE5VTEwgb3IgYSB0dXBsZSAqLworICAgIFB5T2JqZWN0ICpmdW5jX2Nsb3N1cmU7CS8qIE5VTEwgb3IgYSB0dXBsZSBvZiBjZWxsIG9iamVjdHMgKi8KKyAgICBQeU9iamVjdCAqZnVuY19kb2M7CQkvKiBUaGUgX19kb2NfXyBhdHRyaWJ1dGUsIGNhbiBiZSBhbnl0aGluZyAqLworICAgIFB5T2JqZWN0ICpmdW5jX25hbWU7CS8qIFRoZSBfX25hbWVfXyBhdHRyaWJ1dGUsIGEgc3RyaW5nIG9iamVjdCAqLworICAgIFB5T2JqZWN0ICpmdW5jX2RpY3Q7CS8qIFRoZSBfX2RpY3RfXyBhdHRyaWJ1dGUsIGEgZGljdCBvciBOVUxMICovCisgICAgUHlPYmplY3QgKmZ1bmNfd2Vha3JlZmxpc3Q7CS8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCisgICAgUHlPYmplY3QgKmZ1bmNfbW9kdWxlOwkvKiBUaGUgX19tb2R1bGVfXyBhdHRyaWJ1dGUsIGNhbiBiZSBhbnl0aGluZyAqLworCisgICAgLyogSW52YXJpYW50OgorICAgICAqICAgICBmdW5jX2Nsb3N1cmUgY29udGFpbnMgdGhlIGJpbmRpbmdzIGZvciBmdW5jX2NvZGUtPmNvX2ZyZWV2YXJzLCBzbworICAgICAqICAgICBQeVR1cGxlX1NpemUoZnVuY19jbG9zdXJlKSA9PSBQeUNvZGVfR2V0TnVtRnJlZShmdW5jX2NvZGUpCisgICAgICogICAgIChmdW5jX2Nsb3N1cmUgbWF5IGJlIE5VTEwgaWYgUHlDb2RlX0dldE51bUZyZWUoZnVuY19jb2RlKSA9PSAwKS4KKyAgICAgKi8KK30gUHlGdW5jdGlvbk9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RnVuY3Rpb25fVHlwZTsKKworI2RlZmluZSBQeUZ1bmN0aW9uX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5RnVuY3Rpb25fVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZ1bmN0aW9uX05ldyhQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlGdW5jdGlvbl9HZXRDb2RlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZ1bmN0aW9uX0dldEdsb2JhbHMoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RnVuY3Rpb25fR2V0TW9kdWxlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZ1bmN0aW9uX0dldERlZmF1bHRzKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5RnVuY3Rpb25fU2V0RGVmYXVsdHMoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RnVuY3Rpb25fR2V0Q2xvc3VyZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUZ1bmN0aW9uX1NldENsb3N1cmUoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKy8qIE1hY3JvcyBmb3IgZGlyZWN0IGFjY2VzcyB0byB0aGVzZSB2YWx1ZXMuIFR5cGUgY2hlY2tzIGFyZSAqbm90KgorICAgZG9uZSwgc28gdXNlIHdpdGggY2FyZS4gKi8KKyNkZWZpbmUgUHlGdW5jdGlvbl9HRVRfQ09ERShmdW5jKSBcCisgICAgICAgICgoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX2NvZGUpCisjZGVmaW5lIFB5RnVuY3Rpb25fR0VUX0dMT0JBTFMoZnVuYykgXAorCSgoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX2dsb2JhbHMpCisjZGVmaW5lIFB5RnVuY3Rpb25fR0VUX01PRFVMRShmdW5jKSBcCisJKCgoUHlGdW5jdGlvbk9iamVjdCAqKWZ1bmMpIC0+IGZ1bmNfbW9kdWxlKQorI2RlZmluZSBQeUZ1bmN0aW9uX0dFVF9ERUZBVUxUUyhmdW5jKSBcCisJKCgoUHlGdW5jdGlvbk9iamVjdCAqKWZ1bmMpIC0+IGZ1bmNfZGVmYXVsdHMpCisjZGVmaW5lIFB5RnVuY3Rpb25fR0VUX0NMT1NVUkUoZnVuYykgXAorCSgoKFB5RnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBmdW5jX2Nsb3N1cmUpCisKKy8qIFRoZSBjbGFzc21ldGhvZCBhbmQgc3RhdGljbWV0aG9kIHR5cGVzIGxpdmVzIGhlcmUsIHRvbyAqLworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Q2xhc3NNZXRob2RfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVN0YXRpY01ldGhvZF9UeXBlOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q2xhc3NNZXRob2RfTmV3KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0YXRpY01ldGhvZF9OZXcoUHlPYmplY3QgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0ZVTkNPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvZ2Vub2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9nZW5vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzU1NjFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZ2Vub2JqZWN0LmgKQEAgLTAsMCArMSw0MCBAQAorCisvKiBHZW5lcmF0b3Igb2JqZWN0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X0dFTk9CSkVDVF9ICisjZGVmaW5lIFB5X0dFTk9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBfZnJhbWU7IC8qIEF2b2lkIGluY2x1ZGluZyBmcmFtZW9iamVjdC5oICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwlQeU9iamVjdF9IRUFECisJLyogVGhlIGdpXyBwcmVmaXggaXMgaW50ZW5kZWQgdG8gcmVtaW5kIG9mIGdlbmVyYXRvci1pdGVyYXRvci4gKi8KKworCS8qIE5vdGU6IGdpX2ZyYW1lIGNhbiBiZSBOVUxMIGlmIHRoZSBnZW5lcmF0b3IgaXMgImZpbmlzaGVkIiAqLworCXN0cnVjdCBfZnJhbWUgKmdpX2ZyYW1lOworCisJLyogVHJ1ZSBpZiBnZW5lcmF0b3IgaXMgYmVpbmcgZXhlY3V0ZWQuICovCisJaW50IGdpX3J1bm5pbmc7CisgICAgCisJLyogVGhlIGNvZGUgb2JqZWN0IGJhY2tpbmcgdGhlIGdlbmVyYXRvciAqLworCVB5T2JqZWN0ICpnaV9jb2RlOworCisJLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZS4gKi8KKwlQeU9iamVjdCAqZ2lfd2Vha3JlZmxpc3Q7Cit9IFB5R2VuT2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlHZW5fVHlwZTsKKworI2RlZmluZSBQeUdlbl9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlHZW5fVHlwZSkKKyNkZWZpbmUgUHlHZW5fQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeUdlbl9UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5R2VuX05ldyhzdHJ1Y3QgX2ZyYW1lICopOworUHlBUElfRlVOQyhpbnQpIFB5R2VuX05lZWRzRmluYWxpemluZyhQeUdlbk9iamVjdCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfR0VOT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2dyYW1pbml0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9ncmFtaW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDUzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9ncmFtaW5pdC5oCkBAIC0wLDAgKzEsODcgQEAKKy8qIEdlbmVyYXRlZCBieSBQYXJzZXIvcGdlbiAqLworCisjZGVmaW5lIHNpbmdsZV9pbnB1dCAyNTYKKyNkZWZpbmUgZmlsZV9pbnB1dCAyNTcKKyNkZWZpbmUgZXZhbF9pbnB1dCAyNTgKKyNkZWZpbmUgZGVjb3JhdG9yIDI1OQorI2RlZmluZSBkZWNvcmF0b3JzIDI2MAorI2RlZmluZSBkZWNvcmF0ZWQgMjYxCisjZGVmaW5lIGZ1bmNkZWYgMjYyCisjZGVmaW5lIHBhcmFtZXRlcnMgMjYzCisjZGVmaW5lIHZhcmFyZ3NsaXN0IDI2NAorI2RlZmluZSBmcGRlZiAyNjUKKyNkZWZpbmUgZnBsaXN0IDI2NgorI2RlZmluZSBzdG10IDI2NworI2RlZmluZSBzaW1wbGVfc3RtdCAyNjgKKyNkZWZpbmUgc21hbGxfc3RtdCAyNjkKKyNkZWZpbmUgZXhwcl9zdG10IDI3MAorI2RlZmluZSBhdWdhc3NpZ24gMjcxCisjZGVmaW5lIHByaW50X3N0bXQgMjcyCisjZGVmaW5lIGRlbF9zdG10IDI3MworI2RlZmluZSBwYXNzX3N0bXQgMjc0CisjZGVmaW5lIGZsb3dfc3RtdCAyNzUKKyNkZWZpbmUgYnJlYWtfc3RtdCAyNzYKKyNkZWZpbmUgY29udGludWVfc3RtdCAyNzcKKyNkZWZpbmUgcmV0dXJuX3N0bXQgMjc4CisjZGVmaW5lIHlpZWxkX3N0bXQgMjc5CisjZGVmaW5lIHJhaXNlX3N0bXQgMjgwCisjZGVmaW5lIGltcG9ydF9zdG10IDI4MQorI2RlZmluZSBpbXBvcnRfbmFtZSAyODIKKyNkZWZpbmUgaW1wb3J0X2Zyb20gMjgzCisjZGVmaW5lIGltcG9ydF9hc19uYW1lIDI4NAorI2RlZmluZSBkb3R0ZWRfYXNfbmFtZSAyODUKKyNkZWZpbmUgaW1wb3J0X2FzX25hbWVzIDI4NgorI2RlZmluZSBkb3R0ZWRfYXNfbmFtZXMgMjg3CisjZGVmaW5lIGRvdHRlZF9uYW1lIDI4OAorI2RlZmluZSBnbG9iYWxfc3RtdCAyODkKKyNkZWZpbmUgZXhlY19zdG10IDI5MAorI2RlZmluZSBhc3NlcnRfc3RtdCAyOTEKKyNkZWZpbmUgY29tcG91bmRfc3RtdCAyOTIKKyNkZWZpbmUgaWZfc3RtdCAyOTMKKyNkZWZpbmUgd2hpbGVfc3RtdCAyOTQKKyNkZWZpbmUgZm9yX3N0bXQgMjk1CisjZGVmaW5lIHRyeV9zdG10IDI5NgorI2RlZmluZSB3aXRoX3N0bXQgMjk3CisjZGVmaW5lIHdpdGhfaXRlbSAyOTgKKyNkZWZpbmUgZXhjZXB0X2NsYXVzZSAyOTkKKyNkZWZpbmUgc3VpdGUgMzAwCisjZGVmaW5lIHRlc3RsaXN0X3NhZmUgMzAxCisjZGVmaW5lIG9sZF90ZXN0IDMwMgorI2RlZmluZSBvbGRfbGFtYmRlZiAzMDMKKyNkZWZpbmUgdGVzdCAzMDQKKyNkZWZpbmUgb3JfdGVzdCAzMDUKKyNkZWZpbmUgYW5kX3Rlc3QgMzA2CisjZGVmaW5lIG5vdF90ZXN0IDMwNworI2RlZmluZSBjb21wYXJpc29uIDMwOAorI2RlZmluZSBjb21wX29wIDMwOQorI2RlZmluZSBleHByIDMxMAorI2RlZmluZSB4b3JfZXhwciAzMTEKKyNkZWZpbmUgYW5kX2V4cHIgMzEyCisjZGVmaW5lIHNoaWZ0X2V4cHIgMzEzCisjZGVmaW5lIGFyaXRoX2V4cHIgMzE0CisjZGVmaW5lIHRlcm0gMzE1CisjZGVmaW5lIGZhY3RvciAzMTYKKyNkZWZpbmUgcG93ZXIgMzE3CisjZGVmaW5lIGF0b20gMzE4CisjZGVmaW5lIGxpc3RtYWtlciAzMTkKKyNkZWZpbmUgdGVzdGxpc3RfY29tcCAzMjAKKyNkZWZpbmUgbGFtYmRlZiAzMjEKKyNkZWZpbmUgdHJhaWxlciAzMjIKKyNkZWZpbmUgc3Vic2NyaXB0bGlzdCAzMjMKKyNkZWZpbmUgc3Vic2NyaXB0IDMyNAorI2RlZmluZSBzbGljZW9wIDMyNQorI2RlZmluZSBleHBybGlzdCAzMjYKKyNkZWZpbmUgdGVzdGxpc3QgMzI3CisjZGVmaW5lIGRpY3RvcnNldG1ha2VyIDMyOAorI2RlZmluZSBjbGFzc2RlZiAzMjkKKyNkZWZpbmUgYXJnbGlzdCAzMzAKKyNkZWZpbmUgYXJndW1lbnQgMzMxCisjZGVmaW5lIGxpc3RfaXRlciAzMzIKKyNkZWZpbmUgbGlzdF9mb3IgMzMzCisjZGVmaW5lIGxpc3RfaWYgMzM0CisjZGVmaW5lIGNvbXBfaXRlciAzMzUKKyNkZWZpbmUgY29tcF9mb3IgMzM2CisjZGVmaW5lIGNvbXBfaWYgMzM3CisjZGVmaW5lIHRlc3RsaXN0MSAzMzgKKyNkZWZpbmUgZW5jb2RpbmdfZGVjbCAzMzkKKyNkZWZpbmUgeWllbGRfZXhwciAzNDAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2dyYW1tYXIuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2dyYW1tYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDI2ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvZ3JhbW1hci5oCkBAIC0wLDAgKzEsOTMgQEAKKworLyogR3JhbW1hciBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9HUkFNTUFSX0gKKyNkZWZpbmUgUHlfR1JBTU1BUl9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlICJiaXRzZXQuaCIgLyogU2lnaC4uLiAqLworCisvKiBBIGxhYmVsIG9mIGFuIGFyYyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50CQkgbGJfdHlwZTsKKyAgICBjaGFyCSpsYl9zdHI7Cit9IGxhYmVsOworCisjZGVmaW5lIEVNUFRZIDAJCS8qIExhYmVsIG51bWJlciAwIGlzIGJ5IGRlZmluaXRpb24gdGhlIGVtcHR5IGxhYmVsICovCisKKy8qIEEgbGlzdCBvZiBsYWJlbHMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAkJIGxsX25sYWJlbHM7CisgICAgbGFiZWwJKmxsX2xhYmVsOworfSBsYWJlbGxpc3Q7CisKKy8qIEFuIGFyYyBmcm9tIG9uZSBzdGF0ZSB0byBhbm90aGVyICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBzaG9ydAlhX2xibDsJCS8qIExhYmVsIG9mIHRoaXMgYXJjICovCisgICAgc2hvcnQJYV9hcnJvdzsJLyogU3RhdGUgd2hlcmUgdGhpcyBhcmMgZ29lcyB0byAqLworfSBhcmM7CisKKy8qIEEgc3RhdGUgaW4gYSBERkEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAkJIHNfbmFyY3M7CisgICAgYXJjCQkqc19hcmM7CQkvKiBBcnJheSBvZiBhcmNzICovCisJCisgICAgLyogT3B0aW9uYWwgYWNjZWxlcmF0b3JzICovCisgICAgaW50CQkgc19sb3dlcjsJLyogTG93ZXN0IGxhYmVsIGluZGV4ICovCisgICAgaW50CQkgc191cHBlcjsJLyogSGlnaGVzdCBsYWJlbCBpbmRleCAqLworICAgIGludAkJKnNfYWNjZWw7CS8qIEFjY2VsZXJhdG9yICovCisgICAgaW50CQkgc19hY2NlcHQ7CS8qIE5vbnplcm8gZm9yIGFjY2VwdGluZyBzdGF0ZSAqLworfSBzdGF0ZTsKKworLyogQSBERkEgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludAkJIGRfdHlwZTsJLyogTm9uLXRlcm1pbmFsIHRoaXMgcmVwcmVzZW50cyAqLworICAgIGNoYXIJKmRfbmFtZTsJLyogRm9yIHByaW50aW5nICovCisgICAgaW50CQkgZF9pbml0aWFsOwkvKiBJbml0aWFsIHN0YXRlICovCisgICAgaW50CQkgZF9uc3RhdGVzOworICAgIHN0YXRlCSpkX3N0YXRlOwkvKiBBcnJheSBvZiBzdGF0ZXMgKi8KKyAgICBiaXRzZXQJIGRfZmlyc3Q7Cit9IGRmYTsKKworLyogQSBncmFtbWFyICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQJCSBnX25kZmFzOworICAgIGRmYQkJKmdfZGZhOwkJLyogQXJyYXkgb2YgREZBcyAqLworICAgIGxhYmVsbGlzdAkgZ19sbDsKKyAgICBpbnQJCSBnX3N0YXJ0OwkvKiBTdGFydCBzeW1ib2wgb2YgdGhlIGdyYW1tYXIgKi8KKyAgICBpbnQJCSBnX2FjY2VsOwkvKiBTZXQgaWYgYWNjZWxlcmF0b3JzIHByZXNlbnQgKi8KK30gZ3JhbW1hcjsKKworLyogRlVOQ1RJT05TICovCisKK2dyYW1tYXIgKm5ld2dyYW1tYXIoaW50IHN0YXJ0KTsKK2RmYSAqYWRkZGZhKGdyYW1tYXIgKmcsIGludCB0eXBlLCBjaGFyICpuYW1lKTsKK2ludCBhZGRzdGF0ZShkZmEgKmQpOwordm9pZCBhZGRhcmMoZGZhICpkLCBpbnQgZnJvbSwgaW50IHRvLCBpbnQgbGJsKTsKK2RmYSAqUHlHcmFtbWFyX0ZpbmRERkEoZ3JhbW1hciAqZywgaW50IHR5cGUpOworCitpbnQgYWRkbGFiZWwobGFiZWxsaXN0ICpsbCwgaW50IHR5cGUsIGNoYXIgKnN0cik7CitpbnQgZmluZGxhYmVsKGxhYmVsbGlzdCAqbGwsIGludCB0eXBlLCBjaGFyICpzdHIpOworY2hhciAqUHlHcmFtbWFyX0xhYmVsUmVwcihsYWJlbCAqbGIpOwordm9pZCB0cmFuc2xhdGVsYWJlbHMoZ3JhbW1hciAqZyk7CisKK3ZvaWQgYWRkZmlyc3RzZXRzKGdyYW1tYXIgKmcpOworCit2b2lkIFB5R3JhbW1hcl9BZGRBY2NlbGVyYXRvcnMoZ3JhbW1hciAqZyk7Cit2b2lkIFB5R3JhbW1hcl9SZW1vdmVBY2NlbGVyYXRvcnMoZ3JhbW1hciAqKTsKKwordm9pZCBwcmludGdyYW1tYXIoZ3JhbW1hciAqZywgRklMRSAqZnApOwordm9pZCBwcmludG5vbnRlcm1pbmFscyhncmFtbWFyICpnLCBGSUxFICpmcCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0dSQU1NQVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvaW1wb3J0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9pbXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdmZTBhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvaW1wb3J0LmgKQEAgLTAsMCArMSw3MSBAQAorCisvKiBNb2R1bGUgZGVmaW5pdGlvbiBhbmQgaW1wb3J0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X0lNUE9SVF9ICisjZGVmaW5lIFB5X0lNUE9SVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkMobG9uZykgUHlJbXBvcnRfR2V0TWFnaWNOdW1iZXIodm9pZCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlKGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpjbyk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXgoCisJY2hhciAqbmFtZSwgUHlPYmplY3QgKmNvLCBjaGFyICpwYXRobmFtZSk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW1wb3J0X0dldE1vZHVsZURpY3Qodm9pZCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW1wb3J0X0FkZE1vZHVsZShjb25zdCBjaGFyICpuYW1lKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbXBvcnRfSW1wb3J0TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9JbXBvcnRNb2R1bGVOb0Jsb2NrKGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5SW1wb3J0X0ltcG9ydE1vZHVsZUxldmVsKGNoYXIgKm5hbWUsCisJUHlPYmplY3QgKmdsb2JhbHMsIFB5T2JqZWN0ICpsb2NhbHMsIFB5T2JqZWN0ICpmcm9tbGlzdCwgaW50IGxldmVsKTsKKworI2RlZmluZSBQeUltcG9ydF9JbXBvcnRNb2R1bGVFeChuLCBnLCBsLCBmKSBcCisJUHlJbXBvcnRfSW1wb3J0TW9kdWxlTGV2ZWwobiwgZywgbCwgZiwgLTEpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbXBvcnRfR2V0SW1wb3J0ZXIoUHlPYmplY3QgKnBhdGgpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9JbXBvcnQoUHlPYmplY3QgKm5hbWUpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUltcG9ydF9SZWxvYWRNb2R1bGUoUHlPYmplY3QgKm0pOworUHlBUElfRlVOQyh2b2lkKSBQeUltcG9ydF9DbGVhbnVwKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5SW1wb3J0X0ltcG9ydEZyb3plbk1vZHVsZShjaGFyICopOworCisjaWZkZWYgV0lUSF9USFJFQUQKK1B5QVBJX0ZVTkModm9pZCkgX1B5SW1wb3J0X0FjcXVpcmVMb2NrKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIF9QeUltcG9ydF9SZWxlYXNlTG9jayh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIF9QeUltcG9ydF9BY3F1aXJlTG9jaygpCisjZGVmaW5lIF9QeUltcG9ydF9SZWxlYXNlTG9jaygpIDEKKyNlbmRpZgorCitQeUFQSV9GVU5DKHN0cnVjdCBmaWxlZGVzY3IgKikgX1B5SW1wb3J0X0ZpbmRNb2R1bGUoCisJY29uc3QgY2hhciAqLCBQeU9iamVjdCAqLCBjaGFyICosIHNpemVfdCwgRklMRSAqKiwgUHlPYmplY3QgKiopOworUHlBUElfRlVOQyhpbnQpIF9QeUltcG9ydF9Jc1NjcmlwdChzdHJ1Y3QgZmlsZWRlc2NyICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlJbXBvcnRfUmVJbml0TG9jayh2b2lkKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKV9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uKGNoYXIgKiwgY2hhciAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKilfUHlJbXBvcnRfRml4dXBFeHRlbnNpb24oY2hhciAqLCBjaGFyICopOworCitzdHJ1Y3QgX2luaXR0YWIgeworICAgIGNoYXIgKm5hbWU7CisgICAgdm9pZCAoKmluaXRmdW5jKSh2b2lkKTsKK307CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeU51bGxJbXBvcnRlcl9UeXBlOworUHlBUElfREFUQShzdHJ1Y3QgX2luaXR0YWIgKikgUHlJbXBvcnRfSW5pdHRhYjsKKworUHlBUElfRlVOQyhpbnQpIFB5SW1wb3J0X0FwcGVuZEluaXR0YWIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCAoKmluaXRmdW5jKSh2b2lkKSk7CitQeUFQSV9GVU5DKGludCkgUHlJbXBvcnRfRXh0ZW5kSW5pdHRhYihzdHJ1Y3QgX2luaXR0YWIgKm5ld3RhYik7CisKK3N0cnVjdCBfZnJvemVuIHsKKyAgICBjaGFyICpuYW1lOworICAgIHVuc2lnbmVkIGNoYXIgKmNvZGU7CisgICAgaW50IHNpemU7Cit9OworCisvKiBFbWJlZGRpbmcgYXBwcyBtYXkgY2hhbmdlIHRoaXMgcG9pbnRlciB0byBwb2ludCB0byB0aGVpciBmYXZvcml0ZQorICAgY29sbGVjdGlvbiBvZiBmcm96ZW4gbW9kdWxlczogKi8KKworUHlBUElfREFUQShzdHJ1Y3QgX2Zyb3plbiAqKSBQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9JTVBPUlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvaW50b2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9pbnRvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTJlZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvaW50b2JqZWN0LmgKQEAgLTAsMCArMSw4MSBAQAorCisvKiBJbnRlZ2VyIG9iamVjdCBpbnRlcmZhY2UgKi8KKworLyoKK1B5SW50T2JqZWN0IHJlcHJlc2VudHMgYSAobG9uZykgaW50ZWdlci4gIFRoaXMgaXMgYW4gaW1tdXRhYmxlIG9iamVjdDsKK2FuIGludGVnZXIgY2Fubm90IGNoYW5nZSBpdHMgdmFsdWUgYWZ0ZXIgY3JlYXRpb24uCisKK1RoZXJlIGFyZSBmdW5jdGlvbnMgdG8gY3JlYXRlIG5ldyBpbnRlZ2VyIG9iamVjdHMsIHRvIHRlc3QgYW4gb2JqZWN0Citmb3IgaW50ZWdlci1uZXNzLCBhbmQgdG8gZ2V0IHRoZSBpbnRlZ2VyIHZhbHVlLiAgVGhlIGxhdHRlciBmdW5jdGlvbnMKK3JldHVybnMgLTEgYW5kIHNldHMgZXJybm8gdG8gRUJBREYgaWYgdGhlIG9iamVjdCBpcyBub3QgYW4gUHlJbnRPYmplY3QuCitOb25lIG9mIHRoZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGFwcGxpZWQgdG8gbmlsIG9iamVjdHMuCisKK1RoZSB0eXBlIFB5SW50T2JqZWN0IGlzICh1bmZvcnR1bmF0ZWx5KSBleHBvc2VkIGhlcmUgc28gd2UgY2FuIGRlY2xhcmUKK19QeV9UcnVlU3RydWN0IGFuZCBfUHlfWmVyb1N0cnVjdCBpbiBib29sb2JqZWN0Lmg7IGRvbid0IHVzZSB0aGlzLgorKi8KKworI2lmbmRlZiBQeV9JTlRPQkpFQ1RfSAorI2RlZmluZSBQeV9JTlRPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIGxvbmcgb2JfaXZhbDsKK30gUHlJbnRPYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUludF9UeXBlOworCisjZGVmaW5lIFB5SW50X0NoZWNrKG9wKSBcCisJCSBQeVR5cGVfRmFzdFN1YmNsYXNzKChvcCktPm9iX3R5cGUsIFB5X1RQRkxBR1NfSU5UX1NVQkNMQVNTKQorI2RlZmluZSBQeUludF9DaGVja0V4YWN0KG9wKSAoKG9wKS0+b2JfdHlwZSA9PSAmUHlJbnRfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUludF9Gcm9tU3RyaW5nKGNoYXIqLCBjaGFyKiosIGludCk7CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUludF9Gcm9tVW5pY29kZShQeV9VTklDT0RFKiwgUHlfc3NpemVfdCwgaW50KTsKKyNlbmRpZgorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUludF9Gcm9tTG9uZyhsb25nKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlJbnRfRnJvbVNpemVfdChzaXplX3QpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUludF9Gcm9tU3NpemVfdChQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMobG9uZykgUHlJbnRfQXNMb25nKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeUludF9Bc1NzaXplX3QoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgX1B5SW50X0FzSW50KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh1bnNpZ25lZCBsb25nKSBQeUludF9Bc1Vuc2lnbmVkTG9uZ01hc2soUHlPYmplY3QgKik7CisjaWZkZWYgSEFWRV9MT05HX0xPTkcKK1B5QVBJX0ZVTkModW5zaWduZWQgUFlfTE9OR19MT05HKSBQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKFB5T2JqZWN0ICopOworI2VuZGlmCisKK1B5QVBJX0ZVTkMobG9uZykgUHlJbnRfR2V0TWF4KHZvaWQpOworCisvKiBNYWNybywgdHJhZGluZyBzYWZldHkgZm9yIHNwZWVkICovCisjZGVmaW5lIFB5SW50X0FTX0xPTkcob3ApICgoKFB5SW50T2JqZWN0ICopKG9wKSktPm9iX2l2YWwpCisKKy8qIFRoZXNlIGFyZW4ndCByZWFsbHkgcGFydCBvZiB0aGUgSW50IG9iamVjdCwgYnV0IHRoZXkncmUgaGFuZHk7IHRoZSBwcm90b3MKKyAqIGFyZSBuZWNlc3NhcnkgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIHRoZSBtYWdpYyBvZiBQeUFQSV9GVU5DIGFuZCB0aGF0IHdhbnQKKyAqIHRvIGhhdmUgc3Ryb3Btb2R1bGUgYXMgYSBkeW5hbWljYWxseSBsb2FkZWQgbW9kdWxlIGluc3RlYWQgb2YgYnVpbGRpbmcgaXQKKyAqIGludG8gdGhlIG1haW4gUHl0aG9uIHNoYXJlZCBsaWJyYXJ5L0RMTC4gIEd1aWRvIHRoaW5rcyBJJ20gd2VpcmQgZm9yCisgKiBidWlsZGluZyBpdCB0aGlzIHdheS4gIDotKSAgW2NqaF0KKyAqLworUHlBUElfRlVOQyh1bnNpZ25lZCBsb25nKSBQeU9TX3N0cnRvdWwoY2hhciAqLCBjaGFyICoqLCBpbnQpOworUHlBUElfRlVOQyhsb25nKSBQeU9TX3N0cnRvbChjaGFyICosIGNoYXIgKiosIGludCk7CisKKy8qIGZyZWUgbGlzdCBhcGkgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUludF9DbGVhckZyZWVMaXN0KHZvaWQpOworCisvKiBDb252ZXJ0IGFuIGludGVnZXIgdG8gdGhlIGdpdmVuIGJhc2UuICBSZXR1cm5zIGEgc3RyaW5nLgorICAgSWYgYmFzZSBpcyAyLCA4IG9yIDE2LCBhZGQgdGhlIHByb3BlciBwcmVmaXggJzBiJywgJzBvJyBvciAnMHgnLgorICAgSWYgbmV3c3R5bGUgaXMgemVybywgdGhlbiB1c2UgdGhlIHByZS0yLjYgYmVoYXZpb3Igb2Ygb2N0YWwgaGF2aW5nCisgICBhIGxlYWRpbmcgIjAiICovCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgX1B5SW50X0Zvcm1hdChQeUludE9iamVjdCogdiwgaW50IGJhc2UsIGludCBuZXdzdHlsZSk7CisKKy8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQorICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5SW50X0Zvcm1hdEFkdmFuY2VkKFB5T2JqZWN0ICpvYmosCisJCQkJCSAgICAgY2hhciAqZm9ybWF0X3NwZWMsCisJCQkJCSAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9JTlRPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvaW50cmNoZWNrLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9pbnRyY2hlY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjY3ZWQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvaW50cmNoZWNrLmgKQEAgLTAsMCArMSwxNSBAQAorCisjaWZuZGVmIFB5X0lOVFJDSEVDS19ICisjZGVmaW5lIFB5X0lOVFJDSEVDS19ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkMoaW50KSBQeU9TX0ludGVycnVwdE9jY3VycmVkKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeU9TX0luaXRJbnRlcnJ1cHRzKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeU9TX0FmdGVyRm9yayh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfSU5UUkNIRUNLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2l0ZXJvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2l0ZXJvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQxOWMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvaXRlcm9iamVjdC5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgUHlfSVRFUk9CSkVDVF9ICisjZGVmaW5lIFB5X0lURVJPQkpFQ1RfSAorLyogSXRlcmF0b3JzICh0aGUgYmFzaWMga2luZCwgb3ZlciBhIHNlcXVlbmNlKSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTZXFJdGVyX1R5cGU7CisKKyNkZWZpbmUgUHlTZXFJdGVyX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5U2VxSXRlcl9UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2VxSXRlcl9OZXcoUHlPYmplY3QgKik7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUNhbGxJdGVyX1R5cGU7CisKKyNkZWZpbmUgUHlDYWxsSXRlcl9DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeUNhbGxJdGVyX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlDYWxsSXRlcl9OZXcoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9JVEVST0JKRUNUX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvbGlzdG9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvbGlzdG9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NDU4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9saXN0b2JqZWN0LmgKQEAgLTAsMCArMSw2OCBAQAorCisvKiBMaXN0IG9iamVjdCBpbnRlcmZhY2UgKi8KKworLyoKK0Fub3RoZXIgZ2VuZXJhbGx5IHVzZWZ1bCBvYmplY3QgdHlwZSBpcyBhbiBsaXN0IG9mIG9iamVjdCBwb2ludGVycy4KK1RoaXMgaXMgYSBtdXRhYmxlIHR5cGU6IHRoZSBsaXN0IGl0ZW1zIGNhbiBiZSBjaGFuZ2VkLCBhbmQgaXRlbXMgY2FuIGJlCithZGRlZCBvciByZW1vdmVkLiAgT3V0LW9mLXJhbmdlIGluZGljZXMgb3Igbm9uLWxpc3Qgb2JqZWN0cyBhcmUgaWdub3JlZC4KKworKioqIFdBUk5JTkcgKioqIFB5TGlzdF9TZXRJdGVtIGRvZXMgbm90IGluY3JlbWVudCB0aGUgbmV3IGl0ZW0ncyByZWZlcmVuY2UKK2NvdW50LCBidXQgZG9lcyBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgaXRlbSBpdCByZXBsYWNlcywKK2lmIG5vdCBuaWwuICBJdCBkb2VzICpkZWNyZW1lbnQqIHRoZSByZWZlcmVuY2UgY291bnQgaWYgaXQgaXMgKm5vdCoKK2luc2VydGVkIGluIHRoZSBsaXN0LiAgU2ltaWxhcmx5LCBQeUxpc3RfR2V0SXRlbSBkb2VzIG5vdCBpbmNyZW1lbnQgdGhlCityZXR1cm5lZCBpdGVtJ3MgcmVmZXJlbmNlIGNvdW50LgorKi8KKworI2lmbmRlZiBQeV9MSVNUT0JKRUNUX0gKKyNkZWZpbmUgUHlfTElTVE9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9WQVJfSEVBRAorICAgIC8qIFZlY3RvciBvZiBwb2ludGVycyB0byBsaXN0IGVsZW1lbnRzLiAgbGlzdFswXSBpcyBvYl9pdGVtWzBdLCBldGMuICovCisgICAgUHlPYmplY3QgKipvYl9pdGVtOworCisgICAgLyogb2JfaXRlbSBjb250YWlucyBzcGFjZSBmb3IgJ2FsbG9jYXRlZCcgZWxlbWVudHMuICBUaGUgbnVtYmVyCisgICAgICogY3VycmVudGx5IGluIHVzZSBpcyBvYl9zaXplLgorICAgICAqIEludmFyaWFudHM6CisgICAgICogICAgIDAgPD0gb2Jfc2l6ZSA8PSBhbGxvY2F0ZWQKKyAgICAgKiAgICAgbGVuKGxpc3QpID09IG9iX3NpemUKKyAgICAgKiAgICAgb2JfaXRlbSA9PSBOVUxMIGltcGxpZXMgb2Jfc2l6ZSA9PSBhbGxvY2F0ZWQgPT0gMAorICAgICAqIGxpc3Quc29ydCgpIHRlbXBvcmFyaWx5IHNldHMgYWxsb2NhdGVkIHRvIC0xIHRvIGRldGVjdCBtdXRhdGlvbnMuCisgICAgICoKKyAgICAgKiBJdGVtcyBtdXN0IG5vcm1hbGx5IG5vdCBiZSBOVUxMLCBleGNlcHQgZHVyaW5nIGNvbnN0cnVjdGlvbiB3aGVuCisgICAgICogdGhlIGxpc3QgaXMgbm90IHlldCB2aXNpYmxlIG91dHNpZGUgdGhlIGZ1bmN0aW9uIHRoYXQgYnVpbGRzIGl0LgorICAgICAqLworICAgIFB5X3NzaXplX3QgYWxsb2NhdGVkOworfSBQeUxpc3RPYmplY3Q7CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUxpc3RfVHlwZTsKKworI2RlZmluZSBQeUxpc3RfQ2hlY2sob3ApIFwKKwkJUHlUeXBlX0Zhc3RTdWJjbGFzcyhQeV9UWVBFKG9wKSwgUHlfVFBGTEFHU19MSVNUX1NVQkNMQVNTKQorI2RlZmluZSBQeUxpc3RfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeUxpc3RfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxpc3RfTmV3KFB5X3NzaXplX3Qgc2l6ZSk7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5TGlzdF9TaXplKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxpc3RfR2V0SXRlbShQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoaW50KSBQeUxpc3RfU2V0SXRlbShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUxpc3RfSW5zZXJ0KFB5T2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5TGlzdF9BcHBlbmQoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TGlzdF9HZXRTbGljZShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoaW50KSBQeUxpc3RfU2V0U2xpY2UoUHlPYmplY3QgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlMaXN0X1NvcnQoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlMaXN0X1JldmVyc2UoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TGlzdF9Bc1R1cGxlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlMaXN0X0V4dGVuZChQeUxpc3RPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKy8qIE1hY3JvLCB0cmFkaW5nIHNhZmV0eSBmb3Igc3BlZWQgKi8KKyNkZWZpbmUgUHlMaXN0X0dFVF9JVEVNKG9wLCBpKSAoKChQeUxpc3RPYmplY3QgKikob3ApKS0+b2JfaXRlbVtpXSkKKyNkZWZpbmUgUHlMaXN0X1NFVF9JVEVNKG9wLCBpLCB2KSAoKChQeUxpc3RPYmplY3QgKikob3ApKS0+b2JfaXRlbVtpXSA9ICh2KSkKKyNkZWZpbmUgUHlMaXN0X0dFVF9TSVpFKG9wKSAgICBQeV9TSVpFKG9wKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9MSVNUT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2xvbmdpbnRyZXByLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9sb25naW50cmVwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjVjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9sb25naW50cmVwci5oCkBAIC0wLDAgKzEsMTAzIEBACisjaWZuZGVmIFB5X0xPTkdJTlRSRVBSX0gKKyNkZWZpbmUgUHlfTE9OR0lOVFJFUFJfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFRoaXMgaXMgcHVibGlzaGVkIGZvciB0aGUgYmVuZWZpdCBvZiAiZnJpZW5kIiBtYXJzaGFsLmMgb25seS4gKi8KKworLyogUGFyYW1ldGVycyBvZiB0aGUgbG9uZyBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uLiAgVGhlcmUgYXJlIHR3byBkaWZmZXJlbnQKKyAgIHNldHMgb2YgcGFyYW1ldGVyczogb25lIHNldCBmb3IgMzAtYml0IGRpZ2l0cywgc3RvcmVkIGluIGFuIHVuc2lnbmVkIDMyLWJpdAorICAgaW50ZWdlciB0eXBlLCBhbmQgb25lIHNldCBmb3IgMTUtYml0IGRpZ2l0cyB3aXRoIGVhY2ggZGlnaXQgc3RvcmVkIGluIGFuCisgICB1bnNpZ25lZCBzaG9ydC4gIFRoZSB2YWx1ZSBvZiBQWUxPTkdfQklUU19JTl9ESUdJVCwgZGVmaW5lZCBlaXRoZXIgYXQKKyAgIGNvbmZpZ3VyZSB0aW1lIG9yIGluIHB5cG9ydC5oLCBpcyB1c2VkIHRvIGRlY2lkZSB3aGljaCBkaWdpdCBzaXplIHRvIHVzZS4KKworICAgVHlwZSAnZGlnaXQnIHNob3VsZCBiZSBhYmxlIHRvIGhvbGQgMipQeUxvbmdfQkFTRS0xLCBhbmQgdHlwZSAndHdvZGlnaXRzJworICAgc2hvdWxkIGJlIGFuIHVuc2lnbmVkIGludGVnZXIgdHlwZSBhYmxlIHRvIGhvbGQgYWxsIGludGVnZXJzIHVwIHRvCisgICBQeUxvbmdfQkFTRSpQeUxvbmdfQkFTRS0xLiAgeF9zdWIgYXNzdW1lcyB0aGF0ICdkaWdpdCcgaXMgYW4gdW5zaWduZWQgdHlwZSwKKyAgIGFuZCB0aGF0IG92ZXJmbG93IGlzIGhhbmRsZWQgYnkgdGFraW5nIHRoZSByZXN1bHQgbW9kdWxvIDIqKk4gZm9yIHNvbWUgTiA+CisgICBQeUxvbmdfU0hJRlQuICBUaGUgbWFqb3JpdHkgb2YgdGhlIGNvZGUgZG9lc24ndCBjYXJlIGFib3V0IHRoZSBwcmVjaXNlCisgICB2YWx1ZSBvZiBQeUxvbmdfU0hJRlQsIGJ1dCB0aGVyZSBhcmUgc29tZSBub3RhYmxlIGV4Y2VwdGlvbnM6CisKKyAgIC0gbG9uZ19wb3coKSByZXF1aXJlcyB0aGF0IFB5TG9uZ19TSElGVCBiZSBkaXZpc2libGUgYnkgNQorCisgICAtIFB5TG9uZ197QXMsRnJvbX1CeXRlQXJyYXkgcmVxdWlyZSB0aGF0IFB5TG9uZ19TSElGVCBiZSBhdCBsZWFzdCA4CisKKyAgIC0gbG9uZ19oYXNoKCkgcmVxdWlyZXMgdGhhdCBQeUxvbmdfU0hJRlQgaXMgKnN0cmljdGx5KiBsZXNzIHRoYW4gdGhlIG51bWJlcgorICAgICBvZiBiaXRzIGluIGFuIHVuc2lnbmVkIGxvbmcsIGFzIGRvIHRoZSBQeUxvbmcgPC0+IGxvbmcgKG9yIHVuc2lnbmVkIGxvbmcpCisgICAgIGNvbnZlcnNpb24gZnVuY3Rpb25zCisKKyAgIC0gdGhlIGxvbmcgPC0+IHNpemVfdC9QeV9zc2l6ZV90IGNvbnZlcnNpb24gZnVuY3Rpb25zIGV4cGVjdCB0aGF0CisgICAgIFB5TG9uZ19TSElGVCBpcyBzdHJpY3RseSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBiaXRzIGluIGEgc2l6ZV90CisKKyAgIC0gdGhlIG1hcnNoYWwgY29kZSBjdXJyZW50bHkgZXhwZWN0cyB0aGF0IFB5TG9uZ19TSElGVCBpcyBhIG11bHRpcGxlIG9mIDE1CisKKyAgVGhlIHZhbHVlcyAxNSBhbmQgMzAgc2hvdWxkIGZpdCBhbGwgb2YgdGhlIGFib3ZlIHJlcXVpcmVtZW50cywgb24gYW55CisgIHBsYXRmb3JtLgorKi8KKworI2lmIFBZTE9OR19CSVRTX0lOX0RJR0lUID09IDMwCisjaWYgIShkZWZpbmVkIEhBVkVfVUlOVDY0X1QgJiYgZGVmaW5lZCBIQVZFX1VJTlQzMl9UICYmICAgICAgICAgIFwKKyAgICAgIGRlZmluZWQgSEFWRV9JTlQ2NF9UICYmIGRlZmluZWQgSEFWRV9JTlQzMl9UKQorI2Vycm9yICIzMC1iaXQgbG9uZyBkaWdpdHMgcmVxdWVzdGVkLCBidXQgdGhlIG5lY2Vzc2FyeSB0eXBlcyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIgorI2VuZGlmCit0eXBlZGVmIFBZX1VJTlQzMl9UIGRpZ2l0OwordHlwZWRlZiBQWV9JTlQzMl9UIHNkaWdpdDsgLyogc2lnbmVkIHZhcmlhbnQgb2YgZGlnaXQgKi8KK3R5cGVkZWYgUFlfVUlOVDY0X1QgdHdvZGlnaXRzOwordHlwZWRlZiBQWV9JTlQ2NF9UIHN0d29kaWdpdHM7IC8qIHNpZ25lZCB2YXJpYW50IG9mIHR3b2RpZ2l0cyAqLworI2RlZmluZSBQeUxvbmdfU0hJRlQJMzAKKyNkZWZpbmUgX1B5TG9uZ19ERUNJTUFMX1NISUZUCTkgLyogbWF4KGUgc3VjaCB0aGF0IDEwKiplIGZpdHMgaW4gYSBkaWdpdCkgKi8KKyNkZWZpbmUgX1B5TG9uZ19ERUNJTUFMX0JBU0UJKChkaWdpdCkxMDAwMDAwMDAwKSAvKiAxMCAqKiBERUNJTUFMX1NISUZUICovCisjZWxpZiBQWUxPTkdfQklUU19JTl9ESUdJVCA9PSAxNQordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBkaWdpdDsKK3R5cGVkZWYgc2hvcnQgc2RpZ2l0OyAvKiBzaWduZWQgdmFyaWFudCBvZiBkaWdpdCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHR3b2RpZ2l0czsKK3R5cGVkZWYgbG9uZyBzdHdvZGlnaXRzOyAvKiBzaWduZWQgdmFyaWFudCBvZiB0d29kaWdpdHMgKi8KKyNkZWZpbmUgUHlMb25nX1NISUZUCTE1CisjZGVmaW5lIF9QeUxvbmdfREVDSU1BTF9TSElGVAk0IC8qIG1heChlIHN1Y2ggdGhhdCAxMCoqZSBmaXRzIGluIGEgZGlnaXQpICovCisjZGVmaW5lIF9QeUxvbmdfREVDSU1BTF9CQVNFCSgoZGlnaXQpMTAwMDApIC8qIDEwICoqIERFQ0lNQUxfU0hJRlQgKi8KKyNlbHNlCisjZXJyb3IgIlBZTE9OR19CSVRTX0lOX0RJR0lUIHNob3VsZCBiZSAxNSBvciAzMCIKKyNlbmRpZgorI2RlZmluZSBQeUxvbmdfQkFTRQkoKGRpZ2l0KTEgPDwgUHlMb25nX1NISUZUKQorI2RlZmluZSBQeUxvbmdfTUFTSwkoKGRpZ2l0KShQeUxvbmdfQkFTRSAtIDEpKQorCisvKiBiL3cgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjUgKi8KKyNkZWZpbmUgU0hJRlQJUHlMb25nX1NISUZUCisjZGVmaW5lIEJBU0UJUHlMb25nX0JBU0UKKyNkZWZpbmUgTUFTSwlQeUxvbmdfTUFTSworCisjaWYgUHlMb25nX1NISUZUICUgNSAhPSAwCisjZXJyb3IgImxvbmdvYmplY3QuYyByZXF1aXJlcyB0aGF0IFB5TG9uZ19TSElGVCBiZSBkaXZpc2libGUgYnkgNSIKKyNlbmRpZgorCisvKiBMb25nIGludGVnZXIgcmVwcmVzZW50YXRpb24uCisgICBUaGUgYWJzb2x1dGUgdmFsdWUgb2YgYSBudW1iZXIgaXMgZXF1YWwgdG8KKyAgIAlTVU0oZm9yIGk9MCB0aHJvdWdoIGFicyhvYl9zaXplKS0xKSBvYl9kaWdpdFtpXSAqIDIqKihTSElGVCppKQorICAgTmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgd2l0aCBvYl9zaXplIDwgMDsKKyAgIHplcm8gaXMgcmVwcmVzZW50ZWQgYnkgb2Jfc2l6ZSA9PSAwLgorICAgSW4gYSBub3JtYWxpemVkIG51bWJlciwgb2JfZGlnaXRbYWJzKG9iX3NpemUpLTFdICh0aGUgbW9zdCBzaWduaWZpY2FudAorICAgZGlnaXQpIGlzIG5ldmVyIHplcm8uICBBbHNvLCBpbiBhbGwgY2FzZXMsIGZvciBhbGwgdmFsaWQgaSwKKyAgIAkwIDw9IG9iX2RpZ2l0W2ldIDw9IE1BU0suCisgICBUaGUgYWxsb2NhdGlvbiBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGFsbG9jYXRpbmcgZXh0cmEgbWVtb3J5CisgICBzbyB0aGF0IG9iX2RpZ2l0WzBdIC4uLiBvYl9kaWdpdFthYnMob2Jfc2l6ZSktMV0gYXJlIGFjdHVhbGx5IGF2YWlsYWJsZS4KKworICAgQ0FVVElPTjogIEdlbmVyaWMgY29kZSBtYW5pcHVsYXRpbmcgc3VidHlwZXMgb2YgUHlWYXJPYmplY3QgaGFzIHRvCisgICBhd2FyZSB0aGF0IGxvbmdzIGFidXNlICBvYl9zaXplJ3Mgc2lnbiBiaXQuCisqLworCitzdHJ1Y3QgX2xvbmdvYmplY3QgeworCVB5T2JqZWN0X1ZBUl9IRUFECisJZGlnaXQgb2JfZGlnaXRbMV07Cit9OworCitQeUFQSV9GVU5DKFB5TG9uZ09iamVjdCAqKSBfUHlMb25nX05ldyhQeV9zc2l6ZV90KTsKKworLyogUmV0dXJuIGEgY29weSBvZiBzcmMuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUxvbmdfQ29weShQeUxvbmdPYmplY3QgKnNyYyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X0xPTkdJTlRSRVBSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L2xvbmdvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L2xvbmdvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmUyMzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvbG9uZ29iamVjdC5oCkBAIC0wLDAgKzEsMTM1IEBACisjaWZuZGVmIFB5X0xPTkdPQkpFQ1RfSAorI2RlZmluZSBQeV9MT05HT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBMb25nIChhcmJpdHJhcnkgcHJlY2lzaW9uKSBpbnRlZ2VyIG9iamVjdCBpbnRlcmZhY2UgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2xvbmdvYmplY3QgUHlMb25nT2JqZWN0OyAvKiBSZXZlYWxlZCBpbiBsb25naW50cmVwci5oICovCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUxvbmdfVHlwZTsKKworI2RlZmluZSBQeUxvbmdfQ2hlY2sob3ApIFwKKwkJUHlUeXBlX0Zhc3RTdWJjbGFzcyhQeV9UWVBFKG9wKSwgUHlfVFBGTEFHU19MT05HX1NVQkNMQVNTKQorI2RlZmluZSBQeUxvbmdfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeUxvbmdfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmcobG9uZyk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nKHVuc2lnbmVkIGxvbmcpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbURvdWJsZShkb3VibGUpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbVNpemVfdChzaXplX3QpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbVNzaXplX3QoUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGxvbmcpIFB5TG9uZ19Bc0xvbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGxvbmcpIFB5TG9uZ19Bc0xvbmdBbmRPdmVyZmxvdyhQeU9iamVjdCAqLCBpbnQgKik7CitQeUFQSV9GVU5DKHVuc2lnbmVkIGxvbmcpIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModW5zaWduZWQgbG9uZykgUHlMb25nX0FzVW5zaWduZWRMb25nTWFzayhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlMb25nX0FzU3NpemVfdChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0FzSW50KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfR2V0SW5mbyh2b2lkKTsKKworLyogRm9yIHVzZSBieSBpbnRvYmplY3QuYyBvbmx5ICovCisjZGVmaW5lIF9QeUxvbmdfQXNTc2l6ZV90IFB5TG9uZ19Bc1NzaXplX3QKKyNkZWZpbmUgX1B5TG9uZ19Gcm9tU2l6ZV90IFB5TG9uZ19Gcm9tU2l6ZV90CisjZGVmaW5lIF9QeUxvbmdfRnJvbVNzaXplX3QgUHlMb25nX0Zyb21Tc2l6ZV90CitQeUFQSV9EQVRBKGludCkgX1B5TG9uZ19EaWdpdFZhbHVlWzI1Nl07CisKKy8qIF9QeUxvbmdfRnJleHAgcmV0dXJucyBhIGRvdWJsZSB4IGFuZCBhbiBleHBvbmVudCBlIHN1Y2ggdGhhdCB0aGUKKyAgIHRydWUgdmFsdWUgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byB4ICogMioqZS4gIGUgaXMgPj0gMC4gIHggaXMKKyAgIDAuMCBpZiBhbmQgb25seSBpZiB0aGUgaW5wdXQgaXMgMCAoaW4gd2hpY2ggY2FzZSwgZSBhbmQgeCBhcmUgYm90aAorICAgemVyb2VzKTsgb3RoZXJ3aXNlLCAwLjUgPD0gYWJzKHgpIDwgMS4wLiAgT24gb3ZlcmZsb3csIHdoaWNoIGlzCisgICBwb3NzaWJsZSBpZiB0aGUgbnVtYmVyIG9mIGJpdHMgZG9lc24ndCBmaXQgaW50byBhIFB5X3NzaXplX3QsIHNldHMKKyAgIE92ZXJmbG93RXJyb3IgYW5kIHJldHVybnMgLTEuMCBmb3IgeCwgMCBmb3IgZS4gKi8KK1B5QVBJX0ZVTkMoZG91YmxlKSBfUHlMb25nX0ZyZXhwKFB5TG9uZ09iamVjdCAqYSwgUHlfc3NpemVfdCAqZSk7CisKK1B5QVBJX0ZVTkMoZG91YmxlKSBQeUxvbmdfQXNEb3VibGUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19Gcm9tVm9pZFB0cih2b2lkICopOworUHlBUElfRlVOQyh2b2lkICopIFB5TG9uZ19Bc1ZvaWRQdHIoUHlPYmplY3QgKik7CisKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbUxvbmdMb25nKFBZX0xPTkdfTE9ORyk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh1bnNpZ25lZCBQWV9MT05HX0xPTkcpOworUHlBUElfRlVOQyhQWV9MT05HX0xPTkcpIFB5TG9uZ19Bc0xvbmdMb25nKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh1bnNpZ25lZCBQWV9MT05HX0xPTkcpIFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHVuc2lnbmVkIFBZX0xPTkdfTE9ORykgUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZ01hc2soUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFBZX0xPTkdfTE9ORykgUHlMb25nX0FzTG9uZ0xvbmdBbmRPdmVyZmxvdyhQeU9iamVjdCAqLCBpbnQgKik7CisjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbVN0cmluZyhjaGFyICosIGNoYXIgKiosIGludCk7CisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUxvbmdfRnJvbVVuaWNvZGUoUHlfVU5JQ09ERSosIFB5X3NzaXplX3QsIGludCk7CisjZW5kaWYKKworLyogX1B5TG9uZ19TaWduLiAgUmV0dXJuIDAgaWYgdiBpcyAwLCAtMSBpZiB2IDwgMCwgKzEgaWYgdiA+IDAuCisgICB2IG11c3Qgbm90IGJlIE5VTEwsIGFuZCBtdXN0IGJlIGEgbm9ybWFsaXplZCBsb25nLgorICAgVGhlcmUgYXJlIG5vIGVycm9yIGNhc2VzLgorKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlMb25nX1NpZ24oUHlPYmplY3QgKnYpOworCisKKy8qIF9QeUxvbmdfTnVtQml0cy4gIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgbmVlZGVkIHRvIHJlcHJlc2VudCB0aGUKKyAgIGFic29sdXRlIHZhbHVlIG9mIGEgbG9uZy4gIEZvciBleGFtcGxlLCB0aGlzIHJldHVybnMgMSBmb3IgMSBhbmQgLTEsIDIKKyAgIGZvciAyIGFuZCAtMiwgYW5kIDIgZm9yIDMgYW5kIC0zLiAgSXQgcmV0dXJucyAwIGZvciAwLgorICAgdiBtdXN0IG5vdCBiZSBOVUxMLCBhbmQgbXVzdCBiZSBhIG5vcm1hbGl6ZWQgbG9uZy4KKyAgIChzaXplX3QpLTEgaXMgcmV0dXJuZWQgYW5kIE92ZXJmbG93RXJyb3Igc2V0IGlmIHRoZSB0cnVlIHJlc3VsdCBkb2Vzbid0CisgICBmaXQgaW4gYSBzaXplX3QuCisqLworUHlBUElfRlVOQyhzaXplX3QpIF9QeUxvbmdfTnVtQml0cyhQeU9iamVjdCAqdik7CisKKy8qIF9QeUxvbmdfRnJvbUJ5dGVBcnJheTogIFZpZXcgdGhlIG4gdW5zaWduZWQgYnl0ZXMgYXMgYSBiaW5hcnkgaW50ZWdlciBpbgorICAgYmFzZSAyNTYsIGFuZCByZXR1cm4gYSBQeXRob24gbG9uZyB3aXRoIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUuCisgICBJZiBuIGlzIDAsIHRoZSBpbnRlZ2VyIGlzIDAuICBFbHNlOgorICAgSWYgbGl0dGxlX2VuZGlhbiBpcyAxL3RydWUsIGJ5dGVzW24tMV0gaXMgdGhlIE1TQiBhbmQgYnl0ZXNbMF0gdGhlIExTQjsKKyAgIGVsc2UgKGxpdHRsZV9lbmRpYW4gaXMgMC9mYWxzZSkgYnl0ZXNbMF0gaXMgdGhlIE1TQiBhbmQgYnl0ZXNbbi0xXSB0aGUKKyAgIExTQi4KKyAgIElmIGlzX3NpZ25lZCBpcyAwL2ZhbHNlLCB2aWV3IHRoZSBieXRlcyBhcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgorICAgSWYgaXNfc2lnbmVkIGlzIDEvdHJ1ZSwgdmlldyB0aGUgYnl0ZXMgYXMgYSAyJ3MtY29tcGxlbWVudCBpbnRlZ2VyLAorICAgbm9uLW5lZ2F0aXZlIGlmIGJpdCAweDgwIG9mIHRoZSBNU0IgaXMgY2xlYXIsIG5lZ2F0aXZlIGlmIHNldC4KKyAgIEVycm9yIHJldHVybnM6CisgICArIFJldHVybiBOVUxMIHdpdGggdGhlIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBzZXQgaWYgdGhlcmUncyBub3QKKyAgICAgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIFB5dGhvbiBsb25nLgorKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5TG9uZ19Gcm9tQnl0ZUFycmF5KAorCWNvbnN0IHVuc2lnbmVkIGNoYXIqIGJ5dGVzLCBzaXplX3QgbiwKKwlpbnQgbGl0dGxlX2VuZGlhbiwgaW50IGlzX3NpZ25lZCk7CisKKy8qIF9QeUxvbmdfQXNCeXRlQXJyYXk6IENvbnZlcnQgdGhlIGxlYXN0LXNpZ25pZmljYW50IDgqbiBiaXRzIG9mIGxvbmcKKyAgIHYgdG8gYSBiYXNlLTI1NiBpbnRlZ2VyLCBzdG9yZWQgaW4gYXJyYXkgYnl0ZXMuICBOb3JtYWxseSByZXR1cm4gMCwKKyAgIHJldHVybiAtMSBvbiBlcnJvci4KKyAgIElmIGxpdHRsZV9lbmRpYW4gaXMgMS90cnVlLCBzdG9yZSB0aGUgTVNCIGF0IGJ5dGVzW24tMV0gYW5kIHRoZSBMU0IgYXQKKyAgIGJ5dGVzWzBdOyBlbHNlIChsaXR0bGVfZW5kaWFuIGlzIDAvZmFsc2UpIHN0b3JlIHRoZSBNU0IgYXQgYnl0ZXNbMF0gYW5kCisgICB0aGUgTFNCIGF0IGJ5dGVzW24tMV0uCisgICBJZiBpc19zaWduZWQgaXMgMC9mYWxzZSwgaXQncyBhbiBlcnJvciBpZiB2IDwgMDsgZWxzZSAodiA+PSAwKSBuIGJ5dGVzCisgICBhcmUgZmlsbGVkIGFuZCB0aGVyZSdzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCBiaXQgMHg4MCBvZiB0aGUgTVNCLgorICAgSWYgaXNfc2lnbmVkIGlzIDEvdHJ1ZSwgYnl0ZXMgaXMgZmlsbGVkIHdpdGggdGhlIDIncy1jb21wbGVtZW50CisgICByZXByZXNlbnRhdGlvbiBvZiB2J3MgdmFsdWUuICBCaXQgMHg4MCBvZiB0aGUgTVNCIGlzIHRoZSBzaWduIGJpdC4KKyAgIEVycm9yIHJldHVybnMgKC0xKToKKyAgICsgaXNfc2lnbmVkIGlzIDAgYW5kIHYgPCAwLiAgVHlwZUVycm9yIGlzIHNldCBpbiB0aGlzIGNhc2UsIGFuZCBieXRlcworICAgICBpc24ndCBhbHRlcmVkLgorICAgKyBuIGlzbid0IGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgZnVsbCBtYXRoZW1hdGljYWwgdmFsdWUgb2Ygdi4gIEZvcgorICAgICBleGFtcGxlLCBpZiBpc19zaWduZWQgaXMgMCBhbmQgdGhlcmUgYXJlIG1vcmUgZGlnaXRzIGluIHRoZSB2IHRoYW4KKyAgICAgZml0IGluIG47IG9yIGlmIGlzX3NpZ25lZCBpcyAxLCB2IDwgMCwgYW5kIG4gaXMganVzdCAxIGJpdCBzaHkgb2YKKyAgICAgYmVpbmcgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYSBzaWduIGJpdC4gIE92ZXJmbG93RXJyb3IgaXMgc2V0IGluIHRoaXMKKyAgICAgY2FzZSwgYnV0IGJ5dGVzIGhvbGRzIHRoZSBsZWFzdC1zaWduZmljYW50IG4gYnl0ZXMgb2YgdGhlIHRydWUgdmFsdWUuCisqLworUHlBUElfRlVOQyhpbnQpIF9QeUxvbmdfQXNCeXRlQXJyYXkoUHlMb25nT2JqZWN0KiB2LAorCXVuc2lnbmVkIGNoYXIqIGJ5dGVzLCBzaXplX3QgbiwKKwlpbnQgbGl0dGxlX2VuZGlhbiwgaW50IGlzX3NpZ25lZCk7CisKKy8qIF9QeUxvbmdfRm9ybWF0OiBDb252ZXJ0IHRoZSBsb25nIHRvIGEgc3RyaW5nIG9iamVjdCB3aXRoIGdpdmVuIGJhc2UsCisgICBhcHBlbmRpbmcgYSBiYXNlIHByZWZpeCBvZiAwW2JveF0gaWYgYmFzZSBpcyAyLCA4IG9yIDE2LgorICAgQWRkIGEgdHJhaWxpbmcgIkwiIGlmIGFkZEwgaXMgbm9uLXplcm8uCisgICBJZiBuZXdzdHlsZSBpcyB6ZXJvLCB0aGVuIHVzZSB0aGUgcHJlLTIuNiBiZWhhdmlvciBvZiBvY3RhbCBoYXZpbmcKKyAgIGEgbGVhZGluZyAiMCIsIGluc3RlYWQgb2YgdGhlIHByZWZpeCAiMG8iICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUxvbmdfRm9ybWF0KFB5T2JqZWN0ICphYSwgaW50IGJhc2UsIGludCBhZGRMLCBpbnQgbmV3c3R5bGUpOworCisvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKKyAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeUxvbmdfRm9ybWF0QWR2YW5jZWQoUHlPYmplY3QgKm9iaiwKKwkJCQkJICAgICAgY2hhciAqZm9ybWF0X3NwZWMsCisJCQkJCSAgICAgIFB5X3NzaXplX3QgZm9ybWF0X3NwZWNfbGVuKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfTE9OR09CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9tYXJzaGFsLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9tYXJzaGFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExZmRjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L21hcnNoYWwuaApAQCAtMCwwICsxLDI1IEBACisKKy8qIEludGVyZmFjZSBmb3IgbWFyc2hhbC5jICovCisKKyNpZm5kZWYgUHlfTUFSU0hBTF9ICisjZGVmaW5lIFB5X01BUlNIQUxfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFB5X01BUlNIQUxfVkVSU0lPTiAyCisKK1B5QVBJX0ZVTkModm9pZCkgUHlNYXJzaGFsX1dyaXRlTG9uZ1RvRmlsZShsb25nLCBGSUxFICosIGludCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvRmlsZShQeU9iamVjdCAqLCBGSUxFICosIGludCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWFyc2hhbF9Xcml0ZU9iamVjdFRvU3RyaW5nKFB5T2JqZWN0ICosIGludCk7CisKK1B5QVBJX0ZVTkMobG9uZykgUHlNYXJzaGFsX1JlYWRMb25nRnJvbUZpbGUoRklMRSAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU1hcnNoYWxfUmVhZFNob3J0RnJvbUZpbGUoRklMRSAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNYXJzaGFsX1JlYWRPYmplY3RGcm9tRmlsZShGSUxFICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1hcnNoYWxfUmVhZExhc3RPYmplY3RGcm9tRmlsZShGSUxFICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1hcnNoYWxfUmVhZE9iamVjdEZyb21TdHJpbmcoY2hhciAqLCBQeV9zc2l6ZV90KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfTUFSU0hBTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9tZW1vcnlvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L21lbW9yeW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMGI2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9tZW1vcnlvYmplY3QuaApAQCAtMCwwICsxLDc0IEBACisvKiBNZW1vcnkgdmlldyBvYmplY3QuIEluIFB5dGhvbiB0aGlzIGlzIGF2YWlsYWJsZSBhcyAibWVtb3J5dmlldyIuICovCisKKyNpZm5kZWYgUHlfTUVNT1JZT0JKRUNUX0gKKyNkZWZpbmUgUHlfTUVNT1JZT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5TWVtb3J5Vmlld19UeXBlOworCisjZGVmaW5lIFB5TWVtb3J5Vmlld19DaGVjayhvcCkgKFB5X1RZUEUob3ApID09ICZQeU1lbW9yeVZpZXdfVHlwZSkKKworLyogR2V0IGEgcG9pbnRlciB0byB0aGUgdW5kZXJseWluZyBQeV9idWZmZXIgb2YgYSBtZW1vcnl2aWV3IG9iamVjdC4gKi8KKyNkZWZpbmUgUHlNZW1vcnlWaWV3X0dFVF9CVUZGRVIob3ApICgmKChQeU1lbW9yeVZpZXdPYmplY3QgKikob3ApKS0+dmlldykKKy8qIEdldCBhIHBvaW50ZXIgdG8gdGhlIFB5T2JqZWN0IGZyb20gd2hpY2ggb3JpZ2luYXRlcyBhIG1lbW9yeXZpZXcgb2JqZWN0LiAqLworI2RlZmluZSBQeU1lbW9yeVZpZXdfR0VUX0JBU0Uob3ApICgoKFB5TWVtb3J5Vmlld09iamVjdCAqKShvcCkpLT52aWV3Lm9iaikKKworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWVtb3J5Vmlld19HZXRDb250aWd1b3VzKFB5T2JqZWN0ICpiYXNlLCAKKwkJCQkJCSAgaW50IGJ1ZmZlcnR5cGUsIAorCQkJCQkJICBjaGFyIGZvcnQpOworCisgICAgLyogUmV0dXJuIGEgY29udGlndW91cyBjaHVuayBvZiBtZW1vcnkgcmVwcmVzZW50aW5nIHRoZSBidWZmZXIKKyAgICAgICBmcm9tIGFuIG9iamVjdCBpbiBhIG1lbW9yeSB2aWV3IG9iamVjdC4gIElmIGEgY29weSBpcyBtYWRlIHRoZW4gdGhlCisgICAgICAgYmFzZSBvYmplY3QgZm9yIHRoZSBtZW1vcnkgdmlldyB3aWxsIGJlIGEgKm5ldyogYnl0ZXMgb2JqZWN0LiAKKyAgICAgICAKKyAgICAgICBPdGhlcndpc2UsIHRoZSBiYXNlLW9iamVjdCB3aWxsIGJlIHRoZSBvYmplY3QgaXRzZWxmIGFuZCBubyAKKyAgICAgICBkYXRhLWNvcHlpbmcgd2lsbCBiZSBkb25lLiAKKworICAgICAgIFRoZSBidWZmZXJ0eXBlIGFyZ3VtZW50IGNhbiBiZSBQeUJVRl9SRUFELCBQeUJVRl9XUklURSwKKyAgICAgICBQeUJVRl9TSEFET1cgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJldHVybmVkIGJ1ZmZlcgorICAgICAgIHNob3VsZCBiZSBSRUFET05MWSwgV1JJVEFCTEUsIG9yIHNldCB0byB1cGRhdGUgdGhlCisgICAgICAgb3JpZ2luYWwgYnVmZmVyIGlmIGEgY29weSBtdXN0IGJlIG1hZGUuICBJZiBidWZmZXJ0eXBlIGlzCisgICAgICAgUHlCVUZfV1JJVEUgYW5kIHRoZSBidWZmZXIgaXMgbm90IGNvbnRpZ3VvdXMgYW4gZXJyb3Igd2lsbAorICAgICAgIGJlIHJhaXNlZC4gIEluIHRoaXMgY2lyY3Vtc3RhbmNlLCB0aGUgdXNlciBjYW4gdXNlCisgICAgICAgUHlCVUZfU0hBRE9XIHRvIGVuc3VyZSB0aGF0IGEgYSB3cml0YWJsZSB0ZW1wb3JhcnkKKyAgICAgICBjb250aWd1b3VzIGJ1ZmZlciBpcyByZXR1cm5lZC4gIFRoZSBjb250ZW50cyBvZiB0aGlzCisgICAgICAgY29udGlndW91cyBidWZmZXIgd2lsbCBiZSBjb3BpZWQgYmFjayBpbnRvIHRoZSBvcmlnaW5hbAorICAgICAgIG9iamVjdCBhZnRlciB0aGUgbWVtb3J5dmlldyBvYmplY3QgaXMgZGVsZXRlZCBhcyBsb25nIGFzCisgICAgICAgdGhlIG9yaWdpbmFsIG9iamVjdCBpcyB3cml0YWJsZSBhbmQgYWxsb3dzIHNldHRpbmcgYW4KKyAgICAgICBleGNsdXNpdmUgd3JpdGUgbG9jay4gSWYgdGhpcyBpcyBub3QgYWxsb3dlZCBieSB0aGUKKyAgICAgICBvcmlnaW5hbCBvYmplY3QsIHRoZW4gYSBCdWZmZXJFcnJvciBpcyByYWlzZWQuCisgICAgICAgCisgICAgICAgSWYgdGhlIG9iamVjdCBpcyBtdWx0aS1kaW1lbnNpb25hbCBhbmQgaWYgZm9ydHJhbiBpcyAnRicsCisgICAgICAgdGhlIGZpcnN0IGRpbWVuc2lvbiBvZiB0aGUgdW5kZXJseWluZyBhcnJheSB3aWxsIHZhcnkgdGhlCisgICAgICAgZmFzdGVzdCBpbiB0aGUgYnVmZmVyLiAgSWYgZm9ydHJhbiBpcyAnQycsIHRoZW4gdGhlIGxhc3QKKyAgICAgICBkaW1lbnNpb24gd2lsbCB2YXJ5IHRoZSBmYXN0ZXN0IChDLXN0eWxlIGNvbnRpZ3VvdXMpLiAgSWYKKyAgICAgICBmb3J0cmFuIGlzICdBJywgdGhlbiBpdCBkb2VzIG5vdCBtYXR0ZXIgYW5kIHlvdSB3aWxsIGdldAorICAgICAgIHdoYXRldmVyIHRoZSBvYmplY3QgZGVjaWRlcyBpcyBtb3JlIGVmZmljaWVudC4gIAorCisgICAgICAgQSBuZXcgcmVmZXJlbmNlIGlzIHJldHVybmVkIHRoYXQgbXVzdCBiZSBERUNSRUYnZCB3aGVuIGZpbmlzaGVkLgorICAgICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNZW1vcnlWaWV3X0Zyb21PYmplY3QoUHlPYmplY3QgKmJhc2UpOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TWVtb3J5Vmlld19Gcm9tQnVmZmVyKFB5X2J1ZmZlciAqaW5mbyk7CisgICAgLyogY3JlYXRlIG5ldyBpZiBidWZwdHIgaXMgTlVMTCAKKyAgICAgICAgd2lsbCBiZSBhIG5ldyBieXRlc29iamVjdCBpbiBiYXNlICovCisKKworLyogVGhlIHN0cnVjdCBpcyBkZWNsYXJlZCBoZXJlIHNvIHRoYXQgbWFjcm9zIGNhbiB3b3JrLCBidXQgaXQgc2hvdWxkbid0CisgICBiZSBjb25zaWRlcmVkIHB1YmxpYy4gRG9uJ3QgYWNjZXNzIHRob3NlIGZpZWxkcyBkaXJlY3RseSwgdXNlIHRoZSBtYWNyb3MKKyAgIGFuZCBmdW5jdGlvbnMgaW5zdGVhZCEgKi8KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmJhc2U7CisgICAgUHlfYnVmZmVyIHZpZXc7Cit9IFB5TWVtb3J5Vmlld09iamVjdDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9NRU1PUllPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvbWV0YWdyYW1tYXIuaCBiL2luY2x1ZGUvcHl0aG9uMi43L21ldGFncmFtbWFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjOGVmOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L21ldGFncmFtbWFyLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBQeV9NRVRBR1JBTU1BUl9ICisjZGVmaW5lIFB5X01FVEFHUkFNTUFSX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisjZGVmaW5lIE1TVEFSVCAyNTYKKyNkZWZpbmUgUlVMRSAyNTcKKyNkZWZpbmUgUkhTIDI1OAorI2RlZmluZSBBTFQgMjU5CisjZGVmaW5lIElURU0gMjYwCisjZGVmaW5lIEFUT00gMjYxCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X01FVEFHUkFNTUFSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L21ldGhvZG9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvbWV0aG9kb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxNjBiNgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L21ldGhvZG9iamVjdC5oCkBAIC0wLDAgKzEsOTMgQEAKKworLyogTWV0aG9kIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9NRVRIT0RPQkpFQ1RfSAorI2RlZmluZSBQeV9NRVRIT0RPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGlzIGlzIGFib3V0IHRoZSB0eXBlICdidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCcsCisgICBub3QgUHl0aG9uIG1ldGhvZHMgaW4gdXNlci1kZWZpbmVkIGNsYXNzZXMuICBTZWUgY2xhc3NvYmplY3QuaAorICAgZm9yIHRoZSBsYXR0ZXIuICovCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUNGdW5jdGlvbl9UeXBlOworCisjZGVmaW5lIFB5Q0Z1bmN0aW9uX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5Q0Z1bmN0aW9uX1R5cGUpCisKK3R5cGVkZWYgUHlPYmplY3QgKigqUHlDRnVuY3Rpb24pKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBQeU9iamVjdCAqKCpQeUNGdW5jdGlvbldpdGhLZXl3b3JkcykoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKwkJCQkJICAgICBQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqUHlOb0FyZ3NGdW5jdGlvbikoUHlPYmplY3QgKik7CisKK1B5QVBJX0ZVTkMoUHlDRnVuY3Rpb24pIFB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNGdW5jdGlvbl9HZXRTZWxmKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5Q0Z1bmN0aW9uX0dldEZsYWdzKFB5T2JqZWN0ICopOworCisvKiBNYWNyb3MgZm9yIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgdmFsdWVzLiBUeXBlIGNoZWNrcyBhcmUgKm5vdCoKKyAgIGRvbmUsIHNvIHVzZSB3aXRoIGNhcmUuICovCisjZGVmaW5lIFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihmdW5jKSBcCisgICAgICAgICgoKFB5Q0Z1bmN0aW9uT2JqZWN0ICopZnVuYykgLT4gbV9tbCAtPiBtbF9tZXRoKQorI2RlZmluZSBQeUNGdW5jdGlvbl9HRVRfU0VMRihmdW5jKSBcCisJKCgoUHlDRnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBtX3NlbGYpCisjZGVmaW5lIFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhmdW5jKSBcCisJKCgoUHlDRnVuY3Rpb25PYmplY3QgKilmdW5jKSAtPiBtX21sIC0+IG1sX2ZsYWdzKQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNGdW5jdGlvbl9DYWxsKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworCitzdHJ1Y3QgUHlNZXRob2REZWYgeworICAgIGNvbnN0IGNoYXIJKm1sX25hbWU7CS8qIFRoZSBuYW1lIG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbi9tZXRob2QgKi8KKyAgICBQeUNGdW5jdGlvbiAgbWxfbWV0aDsJLyogVGhlIEMgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIGl0ICovCisgICAgaW50CQkgbWxfZmxhZ3M7CS8qIENvbWJpbmF0aW9uIG9mIE1FVEhfeHh4IGZsYWdzLCB3aGljaCBtb3N0bHkKKwkJCQkgICBkZXNjcmliZSB0aGUgYXJncyBleHBlY3RlZCBieSB0aGUgQyBmdW5jICovCisgICAgY29uc3QgY2hhcgkqbWxfZG9jOwkvKiBUaGUgX19kb2NfXyBhdHRyaWJ1dGUsIG9yIE5VTEwgKi8KK307Cit0eXBlZGVmIHN0cnVjdCBQeU1ldGhvZERlZiBQeU1ldGhvZERlZjsKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeV9GaW5kTWV0aG9kKFB5TWV0aG9kRGVmW10sIFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CisKKyNkZWZpbmUgUHlDRnVuY3Rpb25fTmV3KE1MLCBTRUxGKSBQeUNGdW5jdGlvbl9OZXdFeCgoTUwpLCAoU0VMRiksIE5VTEwpCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5Q0Z1bmN0aW9uX05ld0V4KFB5TWV0aG9kRGVmICosIFB5T2JqZWN0ICosIAorCQkJCQkgUHlPYmplY3QgKik7CisKKy8qIEZsYWcgcGFzc2VkIHRvIG5ld21ldGhvZG9iamVjdCAqLworI2RlZmluZSBNRVRIX09MREFSR1MgIDB4MDAwMAorI2RlZmluZSBNRVRIX1ZBUkFSR1MgIDB4MDAwMQorI2RlZmluZSBNRVRIX0tFWVdPUkRTIDB4MDAwMgorLyogTUVUSF9OT0FSR1MgYW5kIE1FVEhfTyBtdXN0IG5vdCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmbGFncyBhYm92ZS4gKi8KKyNkZWZpbmUgTUVUSF9OT0FSR1MgICAweDAwMDQKKyNkZWZpbmUgTUVUSF9PICAgICAgICAweDAwMDgKKworLyogTUVUSF9DTEFTUyBhbmQgTUVUSF9TVEFUSUMgYXJlIGEgbGl0dGxlIGRpZmZlcmVudDsgdGhlc2UgY29udHJvbAorICAgdGhlIGNvbnN0cnVjdGlvbiBvZiBtZXRob2RzIGZvciBhIGNsYXNzLiAgVGhlc2UgY2Fubm90IGJlIHVzZWQgZm9yCisgICBmdW5jdGlvbnMgaW4gbW9kdWxlcy4gKi8KKyNkZWZpbmUgTUVUSF9DTEFTUyAgICAweDAwMTAKKyNkZWZpbmUgTUVUSF9TVEFUSUMgICAweDAwMjAKKworLyogTUVUSF9DT0VYSVNUIGFsbG93cyBhIG1ldGhvZCB0byBiZSBlbnRlcmVkIGV2ZW50aG91Z2ggYSBzbG90IGhhcworICAgYWxyZWFkeSBmaWxsZWQgdGhlIGVudHJ5LiAgV2hlbiBkZWZpbmVkLCB0aGUgZmxhZyBhbGxvd3MgYSBzZXBhcmF0ZQorICAgbWV0aG9kLCAiX19jb250YWluc19fIiBmb3IgZXhhbXBsZSwgdG8gY29leGlzdCB3aXRoIGEgZGVmaW5lZCAKKyAgIHNsb3QgbGlrZSBzcV9jb250YWlucy4gKi8KKworI2RlZmluZSBNRVRIX0NPRVhJU1QgICAweDAwNDAKKwordHlwZWRlZiBzdHJ1Y3QgUHlNZXRob2RDaGFpbiB7CisgICAgUHlNZXRob2REZWYgKm1ldGhvZHM7CQkvKiBNZXRob2RzIG9mIHRoaXMgdHlwZSAqLworICAgIHN0cnVjdCBQeU1ldGhvZENoYWluICpsaW5rOwkvKiBOVUxMIG9yIGJhc2UgdHlwZSAqLworfSBQeU1ldGhvZENoYWluOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5X0ZpbmRNZXRob2RJbkNoYWluKFB5TWV0aG9kQ2hhaW4gKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU1ldGhvZERlZiAqbV9tbDsgLyogRGVzY3JpcHRpb24gb2YgdGhlIEMgZnVuY3Rpb24gdG8gY2FsbCAqLworICAgIFB5T2JqZWN0ICAgICptX3NlbGY7IC8qIFBhc3NlZCBhcyAnc2VsZicgYXJnIHRvIHRoZSBDIGZ1bmMsIGNhbiBiZSBOVUxMICovCisgICAgUHlPYmplY3QgICAgKm1fbW9kdWxlOyAvKiBUaGUgX19tb2R1bGVfXyBhdHRyaWJ1dGUsIGNhbiBiZSBhbnl0aGluZyAqLworfSBQeUNGdW5jdGlvbk9iamVjdDsKKworUHlBUElfRlVOQyhpbnQpIFB5Q0Z1bmN0aW9uX0NsZWFyRnJlZUxpc3Qodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X01FVEhPRE9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9tb2RzdXBwb3J0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9tb2RzdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRkZGRlZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L21vZHN1cHBvcnQuaApAQCAtMCwwICsxLDEzNCBAQAorCisjaWZuZGVmIFB5X01PRFNVUFBPUlRfSAorI2RlZmluZSBQeV9NT0RTVVBQT1JUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogTW9kdWxlIHN1cHBvcnQgaW50ZXJmYWNlICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogSWYgUFlfU1NJWkVfVF9DTEVBTiBpcyBkZWZpbmVkLCBlYWNoIGZ1bmN0aW9ucyB0cmVhdHMgIy1zcGVjaWZpZXIKKyAgIHRvIG1lYW4gUHlfc3NpemVfdCAqLworI2lmZGVmIFBZX1NTSVpFX1RfQ0xFQU4KKyNkZWZpbmUgUHlBcmdfUGFyc2UJCQlfUHlBcmdfUGFyc2VfU2l6ZVQKKyNkZWZpbmUgUHlBcmdfUGFyc2VUdXBsZQkJX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQKKyNkZWZpbmUgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzCV9QeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHNfU2l6ZVQKKyNkZWZpbmUgUHlBcmdfVmFQYXJzZQkJCV9QeUFyZ19WYVBhcnNlX1NpemVUCisjZGVmaW5lIFB5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzCV9QeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3Jkc19TaXplVAorI2RlZmluZSBQeV9CdWlsZFZhbHVlCQkJX1B5X0J1aWxkVmFsdWVfU2l6ZVQKKyNkZWZpbmUgUHlfVmFCdWlsZFZhbHVlCQkJX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVAorI2Vsc2UKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5X1ZhQnVpbGRWYWx1ZV9TaXplVChjb25zdCBjaGFyICosIHZhX2xpc3QpOworI2VuZGlmCisKK1B5QVBJX0ZVTkMoaW50KSBQeUFyZ19QYXJzZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgUHlBcmdfUGFyc2VUdXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIC4uLikgUHlfRk9STUFUX1BBUlNFVFVQTEUoUHlBcmdfUGFyc2VUdXBsZSwgMiwgMyk7CitQeUFQSV9GVU5DKGludCkgUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiwgY2hhciAqKiwgLi4uKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUFyZ19VbnBhY2tUdXBsZShQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QsIC4uLik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5X0J1aWxkVmFsdWUoY29uc3QgY2hhciAqLCAuLi4pOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlfQnVpbGRWYWx1ZV9TaXplVChjb25zdCBjaGFyICosIC4uLik7CitQeUFQSV9GVU5DKGludCkgX1B5QXJnX05vS2V5d29yZHMoY29uc3QgY2hhciAqZnVuY25hbWUsIFB5T2JqZWN0ICprdyk7CisKK1B5QVBJX0ZVTkMoaW50KSBQeUFyZ19WYVBhcnNlKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CitQeUFQSV9GVU5DKGludCkgUHlBcmdfVmFQYXJzZVR1cGxlQW5kS2V5d29yZHMoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBjaGFyICoqLCB2YV9saXN0KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfVmFCdWlsZFZhbHVlKGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CisKK1B5QVBJX0ZVTkMoaW50KSBQeU1vZHVsZV9BZGRPYmplY3QoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIGxvbmcpOworUHlBUElfRlVOQyhpbnQpIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKyNkZWZpbmUgUHlNb2R1bGVfQWRkSW50TWFjcm8obSwgYykgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgI2MsIGMpCisjZGVmaW5lIFB5TW9kdWxlX0FkZFN0cmluZ01hY3JvKG0sIGMpIFB5TW9kdWxlX0FkZFN0cmluZ0NvbnN0YW50KG0sICNjLCBjKQorCisjZGVmaW5lIFBZVEhPTl9BUElfVkVSU0lPTiAxMDEzCisjZGVmaW5lIFBZVEhPTl9BUElfU1RSSU5HICIxMDEzIgorLyogVGhlIEFQSSB2ZXJzaW9uIGlzIG1haW50YWluZWQgKGluZGVwZW5kZW50bHkgZnJvbSB0aGUgUHl0aG9uIHZlcnNpb24pCisgICBzbyB3ZSBjYW4gZGV0ZWN0IG1pc21hdGNoZXMgYmV0d2VlbiB0aGUgaW50ZXJwcmV0ZXIgYW5kIGR5bmFtaWNhbGx5CisgICBsb2FkZWQgbW9kdWxlcy4gIFRoZXNlIGFyZSBkaWFnbm9zZWQgYnkgYW4gZXJyb3IgbWVzc2FnZSBidXQKKyAgIHRoZSBtb2R1bGUgaXMgc3RpbGwgbG9hZGVkIChiZWNhdXNlIHRoZSBtaXNtYXRjaCBjYW4gb25seSBiZSB0ZXN0ZWQKKyAgIGFmdGVyIGxvYWRpbmcgdGhlIG1vZHVsZSkuICBUaGUgZXJyb3IgbWVzc2FnZSBpcyBpbnRlbmRlZCB0bworICAgZXhwbGFpbiB0aGUgY29yZSBkdW1wIGEgZmV3IHNlY29uZHMgbGF0ZXIuCisKKyAgIFRoZSBzeW1ib2wgUFlUSE9OX0FQSV9TVFJJTkcgZGVmaW5lcyB0aGUgc2FtZSB2YWx1ZSBhcyBhIHN0cmluZworICAgbGl0ZXJhbC4gICoqKiBQTEVBU0UgTUFLRSBTVVJFIFRIRSBERUZJTklUSU9OUyBNQVRDSC4gKioqCisKKyAgIFBsZWFzZSBhZGQgYSBsaW5lIG9yIHR3byB0byB0aGUgdG9wIG9mIHRoaXMgbG9nIGZvciBlYWNoIEFQSQorICAgdmVyc2lvbiBjaGFuZ2U6CisKKyAgIDIyLUZlYi0yMDA2ICBNdkwJMTAxMwlQRVAgMzUzIC0gbG9uZyBpbmRpY2VzIGZvciBzZXF1ZW5jZSBsZW5ndGhzCisKKyAgIDE5LUF1Zy0yMDAyICBHdlIJMTAxMglDaGFuZ2VzIHRvIHN0cmluZyBvYmplY3Qgc3RydWN0IGZvcgorICAgCQkJCWludGVybmluZyBjaGFuZ2VzLCBzYXZpbmcgMyBieXRlcy4KKworICAgMTctSnVsLTIwMDEJR3ZSCTEwMTEJRGVzY3ItYnJhbmNoLCBqdXN0IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUKKworICAgMjUtSmFuLTIwMDEgIEZMRCAgICAgMTAxMCAgICBQYXJhbWV0ZXJzIGFkZGVkIHRvIFB5Q29kZV9OZXcoKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGcmFtZV9OZXcoKTsgUHl0aG9uIDIuMWEyCisKKyAgIDE0LU1hci0yMDAwICBHdlIgICAgIDEwMDkgICAgVW5pY29kZSBBUEkgYWRkZWQKKworICAgMy1KYW4tMTk5OQlHdlIJMTAwNwlEZWNpZGVkIHRvIGNoYW5nZSBiYWNrISAgKERvbid0IHJldXNlIDEwMDghKQorCisgICAzLURlYy0xOTk4CUd2UgkxMDA4CVB5dGhvbiAxLjUuMmIxCisKKyAgIDE4LUphbi0xOTk3CUd2UgkxMDA3CXN0cmluZyBpbnRlcm5pbmcgYW5kIG90aGVyIHNwZWVkdXBzCisKKyAgIDExLU9jdC0xOTk2CUd2UglyZW5hbWVkIFB5X0VsbGlwc2VzIHRvIFB5X0VsbGlwc2lzIDotKAorCisgICAzMC1KdWwtMTk5NglHdlIJU2xpY2UgYW5kIGVsbGlwc2VzIHN5bnRheCBhZGRlZAorCisgICAyMy1KdWwtMTk5NglHdlIJRm9yIDEuNCAtLSBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5IHRoaXMgdGltZSA6LSkKKworICAgNy1Ob3YtMTk5NQlHdlIJS2V5d29yZCBhcmd1bWVudHMgKHNob3VsZCd2ZSBiZWVuIGRvbmUgYXQgMS4zIDotKCApCisKKyAgIDEwLUphbi0xOTk1CUd2UglSZW5hbWVkIGdsb2JhbHMgdG8gbmV3IG5hbWluZyBzY2hlbWUKKworICAgOS1KYW4tMTk5NQlHdlIJSW5pdGlhbCB2ZXJzaW9uIChpbmNvbXBhdGlibGUgd2l0aCBvbGRlciBBUEkpCisqLworCisjaWZkZWYgTVNfV0lORE9XUworLyogU3BlY2lhbCBkZWZpbmVzIGZvciBXaW5kb3dzIHZlcnNpb25zIHVzZWQgdG8gbGl2ZSBoZXJlLiAgVGhpbmdzCisgICBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgIlZlcnNpb24iIGlzIG5vdyBpbiBhIGdsb2JhbCBzdHJpbmcgdmFyaWFibGUuCisgICBSZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB0aGlzIGZvciBlYXNpZXIgYnJhbmRpbmcgb2YgYSAiY3VzdG9tIERMTCIKKyAgIHdpdGhvdXQgYWN0dWFsbHkgbmVlZGluZyBhIHJlY29tcGlsZS4gICovCisjZW5kaWYgLyogTVNfV0lORE9XUyAqLworCisjaWYgU0laRU9GX1NJWkVfVCAhPSBTSVpFT0ZfSU5UCisvKiBPbiBhIDY0LWJpdCBzeXN0ZW0sIHJlbmFtZSB0aGUgUHlfSW5pdE1vZHVsZTQgc28gdGhhdCAyLjQKKyAgIG1vZHVsZXMgY2Fubm90IGdldCBsb2FkZWQgaW50byBhIDIuNSBpbnRlcnByZXRlciAqLworI2RlZmluZSBQeV9Jbml0TW9kdWxlNCBQeV9Jbml0TW9kdWxlNF82NAorI2VuZGlmCisKKyNpZmRlZiBQeV9UUkFDRV9SRUZTCisgLyogV2hlbiB3ZSBhcmUgdHJhY2luZyByZWZlcmVuY2UgY291bnRzLCByZW5hbWUgUHlfSW5pdE1vZHVsZTQgc28KKyAgICBtb2R1bGVzIGNvbXBpbGVkIHdpdGggaW5jb21wYXRpYmxlIHNldHRpbmdzIHdpbGwgZ2VuZXJhdGUgYQorICAgIGxpbmstdGltZSBlcnJvci4gKi8KKyAjaWYgU0laRU9GX1NJWkVfVCAhPSBTSVpFT0ZfSU5UCisgI3VuZGVmIFB5X0luaXRNb2R1bGU0CisgI2RlZmluZSBQeV9Jbml0TW9kdWxlNCBQeV9Jbml0TW9kdWxlNFRyYWNlUmVmc182NAorICNlbHNlCisgI2RlZmluZSBQeV9Jbml0TW9kdWxlNCBQeV9Jbml0TW9kdWxlNFRyYWNlUmVmcworICNlbmRpZgorI2VuZGlmCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlfSW5pdE1vZHVsZTQoY29uc3QgY2hhciAqbmFtZSwgUHlNZXRob2REZWYgKm1ldGhvZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRvYywgUHlPYmplY3QgKnNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcGl2ZXIpOworCisjZGVmaW5lIFB5X0luaXRNb2R1bGUobmFtZSwgbWV0aG9kcykgXAorCVB5X0luaXRNb2R1bGU0KG5hbWUsIG1ldGhvZHMsIChjaGFyICopTlVMTCwgKFB5T2JqZWN0ICopTlVMTCwgXAorCQkgICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKQorCisjZGVmaW5lIFB5X0luaXRNb2R1bGUzKG5hbWUsIG1ldGhvZHMsIGRvYykgXAorCVB5X0luaXRNb2R1bGU0KG5hbWUsIG1ldGhvZHMsIGRvYywgKFB5T2JqZWN0ICopTlVMTCwgXAorCQkgICAgICAgUFlUSE9OX0FQSV9WRVJTSU9OKQorCitQeUFQSV9EQVRBKGNoYXIgKikgX1B5X1BhY2thZ2VDb250ZXh0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9NT0RTVVBQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L21vZHVsZW9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvbW9kdWxlb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4N2Y1YgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L21vZHVsZW9iamVjdC5oCkBAIC0wLDAgKzEsMjQgQEAKKworLyogTW9kdWxlIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9NT0RVTEVPQkpFQ1RfSAorI2RlZmluZSBQeV9NT0RVTEVPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlNb2R1bGVfVHlwZTsKKworI2RlZmluZSBQeU1vZHVsZV9DaGVjayhvcCkgUHlPYmplY3RfVHlwZUNoZWNrKG9wLCAmUHlNb2R1bGVfVHlwZSkKKyNkZWZpbmUgUHlNb2R1bGVfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeU1vZHVsZV9UeXBlKQorCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5TW9kdWxlX05ldyhjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU1vZHVsZV9HZXREaWN0KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhjaGFyICopIFB5TW9kdWxlX0dldE5hbWUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGNoYXIgKikgUHlNb2R1bGVfR2V0RmlsZW5hbWUoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIF9QeU1vZHVsZV9DbGVhcihQeU9iamVjdCAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfTU9EVUxFT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L25vZGUuaCBiL2luY2x1ZGUvcHl0aG9uMi43L25vZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2RlM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvbm9kZS5oCkBAIC0wLDAgKzEsNDMgQEAKKworLyogUGFyc2UgdHJlZSBub2RlIGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X05PREVfSAorI2RlZmluZSBQeV9OT0RFX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgX25vZGUgeworICAgIHNob3J0CQluX3R5cGU7CisgICAgY2hhcgkJKm5fc3RyOworICAgIGludAkJCW5fbGluZW5vOworICAgIGludAkJCW5fY29sX29mZnNldDsKKyAgICBpbnQJCQluX25jaGlsZHJlbjsKKyAgICBzdHJ1Y3QgX25vZGUJKm5fY2hpbGQ7Cit9IG5vZGU7CisKK1B5QVBJX0ZVTkMobm9kZSAqKSBQeU5vZGVfTmV3KGludCB0eXBlKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU5vZGVfQWRkQ2hpbGQobm9kZSAqbiwgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0ciwgaW50IGxpbmVubywgaW50IGNvbF9vZmZzZXQpOworUHlBUElfRlVOQyh2b2lkKSBQeU5vZGVfRnJlZShub2RlICpuKTsKKyNpZm5kZWYgUHlfTElNSVRFRF9BUEkKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5Tm9kZV9TaXplT2Yobm9kZSAqbik7CisjZW5kaWYKKworLyogTm9kZSBhY2Nlc3MgZnVuY3Rpb25zICovCisjZGVmaW5lIE5DSChuKQkJKChuKS0+bl9uY2hpbGRyZW4pCisJCisjZGVmaW5lIENISUxEKG4sIGkpCSgmKG4pLT5uX2NoaWxkW2ldKQorI2RlZmluZSBSQ0hJTEQobiwgaSkJKENISUxEKG4sIE5DSChuKSArIGkpKQorI2RlZmluZSBUWVBFKG4pCQkoKG4pLT5uX3R5cGUpCisjZGVmaW5lIFNUUihuKQkJKChuKS0+bl9zdHIpCisKKy8qIEFzc2VydCB0aGF0IHRoZSB0eXBlIG9mIGEgbm9kZSBpcyB3aGF0IHdlIGV4cGVjdCAqLworI2RlZmluZSBSRVEobiwgdHlwZSkgYXNzZXJ0KFRZUEUobikgPT0gKHR5cGUpKQorCitQeUFQSV9GVU5DKHZvaWQpIFB5Tm9kZV9MaXN0VHJlZShub2RlICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9OT0RFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L29iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZiYzY4ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L29iamVjdC5oCkBAIC0wLDAgKzEsMTAxMSBAQAorI2lmbmRlZiBQeV9PQkpFQ1RfSAorI2RlZmluZSBQeV9PQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIE9iamVjdCBhbmQgdHlwZSBvYmplY3QgaW50ZXJmYWNlICovCisKKy8qCitPYmplY3RzIGFyZSBzdHJ1Y3R1cmVzIGFsbG9jYXRlZCBvbiB0aGUgaGVhcC4gIFNwZWNpYWwgcnVsZXMgYXBwbHkgdG8KK3RoZSB1c2Ugb2Ygb2JqZWN0cyB0byBlbnN1cmUgdGhleSBhcmUgcHJvcGVybHkgZ2FyYmFnZS1jb2xsZWN0ZWQuCitPYmplY3RzIGFyZSBuZXZlciBhbGxvY2F0ZWQgc3RhdGljYWxseSBvciBvbiB0aGUgc3RhY2s7IHRoZXkgbXVzdCBiZQorYWNjZXNzZWQgdGhyb3VnaCBzcGVjaWFsIG1hY3JvcyBhbmQgZnVuY3Rpb25zIG9ubHkuICAoVHlwZSBvYmplY3RzIGFyZQorZXhjZXB0aW9ucyB0byB0aGUgZmlyc3QgcnVsZTsgdGhlIHN0YW5kYXJkIHR5cGVzIGFyZSByZXByZXNlbnRlZCBieQorc3RhdGljYWxseSBpbml0aWFsaXplZCB0eXBlIG9iamVjdHMsIGFsdGhvdWdoIHdvcmsgb24gdHlwZS9jbGFzcyB1bmlmaWNhdGlvbgorZm9yIFB5dGhvbiAyLjIgbWFkZSBpdCBwb3NzaWJsZSB0byBoYXZlIGhlYXAtYWxsb2NhdGVkIHR5cGUgb2JqZWN0cyB0b28pLgorCitBbiBvYmplY3QgaGFzIGEgJ3JlZmVyZW5jZSBjb3VudCcgdGhhdCBpcyBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkIHdoZW4gYQorcG9pbnRlciB0byB0aGUgb2JqZWN0IGlzIGNvcGllZCBvciBkZWxldGVkOyB3aGVuIHRoZSByZWZlcmVuY2UgY291bnQKK3JlYWNoZXMgemVybyB0aGVyZSBhcmUgbm8gcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IGxlZnQgYW5kIGl0IGNhbiBiZQorcmVtb3ZlZCBmcm9tIHRoZSBoZWFwLgorCitBbiBvYmplY3QgaGFzIGEgJ3R5cGUnIHRoYXQgZGV0ZXJtaW5lcyB3aGF0IGl0IHJlcHJlc2VudHMgYW5kIHdoYXQga2luZAorb2YgZGF0YSBpdCBjb250YWlucy4gIEFuIG9iamVjdCdzIHR5cGUgaXMgZml4ZWQgd2hlbiBpdCBpcyBjcmVhdGVkLgorVHlwZXMgdGhlbXNlbHZlcyBhcmUgcmVwcmVzZW50ZWQgYXMgb2JqZWN0czsgYW4gb2JqZWN0IGNvbnRhaW5zIGEKK3BvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSBvYmplY3QuICBUaGUgdHlwZSBpdHNlbGYgaGFzIGEgdHlwZQorcG9pbnRlciBwb2ludGluZyB0byB0aGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgdHlwZSAndHlwZScsIHdoaWNoCitjb250YWlucyBhIHBvaW50ZXIgdG8gaXRzZWxmISkuCisKK09iamVjdHMgZG8gbm90IGZsb2F0IGFyb3VuZCBpbiBtZW1vcnk7IG9uY2UgYWxsb2NhdGVkIGFuIG9iamVjdCBrZWVwcwordGhlIHNhbWUgc2l6ZSBhbmQgYWRkcmVzcy4gIE9iamVjdHMgdGhhdCBtdXN0IGhvbGQgdmFyaWFibGUtc2l6ZSBkYXRhCitjYW4gY29udGFpbiBwb2ludGVycyB0byB2YXJpYWJsZS1zaXplIHBhcnRzIG9mIHRoZSBvYmplY3QuICBOb3QgYWxsCitvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgaGF2ZSB0aGUgc2FtZSBzaXplOyBidXQgdGhlIHNpemUgY2Fubm90IGNoYW5nZQorYWZ0ZXIgYWxsb2NhdGlvbi4gIChUaGVzZSByZXN0cmljdGlvbnMgYXJlIG1hZGUgc28gYSByZWZlcmVuY2UgdG8gYW4KK29iamVjdCBjYW4gYmUgc2ltcGx5IGEgcG9pbnRlciAtLSBtb3ZpbmcgYW4gb2JqZWN0IHdvdWxkIHJlcXVpcmUKK3VwZGF0aW5nIGFsbCB0aGUgcG9pbnRlcnMsIGFuZCBjaGFuZ2luZyBhbiBvYmplY3QncyBzaXplIHdvdWxkIHJlcXVpcmUKK21vdmluZyBpdCBpZiB0aGVyZSB3YXMgYW5vdGhlciBvYmplY3QgcmlnaHQgbmV4dCB0byBpdC4pCisKK09iamVjdHMgYXJlIGFsd2F5cyBhY2Nlc3NlZCB0aHJvdWdoIHBvaW50ZXJzIG9mIHRoZSB0eXBlICdQeU9iamVjdCAqJy4KK1RoZSB0eXBlICdQeU9iamVjdCcgaXMgYSBzdHJ1Y3R1cmUgdGhhdCBvbmx5IGNvbnRhaW5zIHRoZSByZWZlcmVuY2UgY291bnQKK2FuZCB0aGUgdHlwZSBwb2ludGVyLiAgVGhlIGFjdHVhbCBtZW1vcnkgYWxsb2NhdGVkIGZvciBhbiBvYmplY3QKK2NvbnRhaW5zIG90aGVyIGRhdGEgdGhhdCBjYW4gb25seSBiZSBhY2Nlc3NlZCBhZnRlciBjYXN0aW5nIHRoZSBwb2ludGVyCit0byBhIHBvaW50ZXIgdG8gYSBsb25nZXIgc3RydWN0dXJlIHR5cGUuICBUaGlzIGxvbmdlciB0eXBlIG11c3Qgc3RhcnQKK3dpdGggdGhlIHJlZmVyZW5jZSBjb3VudCBhbmQgdHlwZSBmaWVsZHM7IHRoZSBtYWNybyBQeU9iamVjdF9IRUFEIHNob3VsZCBiZQordXNlZCBmb3IgdGhpcyAodG8gYWNjb21tb2RhdGUgZm9yIGZ1dHVyZSBjaGFuZ2VzKS4gIFRoZSBpbXBsZW1lbnRhdGlvbgorb2YgYSBwYXJ0aWN1bGFyIG9iamVjdCB0eXBlIGNhbiBjYXN0IHRoZSBvYmplY3QgcG9pbnRlciB0byB0aGUgcHJvcGVyCit0eXBlIGFuZCBiYWNrLgorCitBIHN0YW5kYXJkIGludGVyZmFjZSBleGlzdHMgZm9yIG9iamVjdHMgdGhhdCBjb250YWluIGFuIGFycmF5IG9mIGl0ZW1zCit3aG9zZSBzaXplIGlzIGRldGVybWluZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGFsbG9jYXRlZC4KKyovCisKKy8qIFB5X0RFQlVHIGltcGxpZXMgUHlfVFJBQ0VfUkVGUy4gKi8KKyNpZiBkZWZpbmVkKFB5X0RFQlVHKSAmJiAhZGVmaW5lZChQeV9UUkFDRV9SRUZTKQorI2RlZmluZSBQeV9UUkFDRV9SRUZTCisjZW5kaWYKKworLyogUHlfVFJBQ0VfUkVGUyBpbXBsaWVzIFB5X1JFRl9ERUJVRy4gKi8KKyNpZiBkZWZpbmVkKFB5X1RSQUNFX1JFRlMpICYmICFkZWZpbmVkKFB5X1JFRl9ERUJVRykKKyNkZWZpbmUgUHlfUkVGX0RFQlVHCisjZW5kaWYKKworI2lmZGVmIFB5X1RSQUNFX1JFRlMKKy8qIERlZmluZSBwb2ludGVycyB0byBzdXBwb3J0IGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9mIGFsbCBsaXZlIGhlYXAgb2JqZWN0cy4gKi8KKyNkZWZpbmUgX1B5T2JqZWN0X0hFQURfRVhUUkEgICAgICAgICAgICBcCisgICAgc3RydWN0IF9vYmplY3QgKl9vYl9uZXh0OyAgICAgICAgICAgXAorICAgIHN0cnVjdCBfb2JqZWN0ICpfb2JfcHJldjsKKworI2RlZmluZSBfUHlPYmplY3RfRVhUUkFfSU5JVCAwLCAwLAorCisjZWxzZQorI2RlZmluZSBfUHlPYmplY3RfSEVBRF9FWFRSQQorI2RlZmluZSBfUHlPYmplY3RfRVhUUkFfSU5JVAorI2VuZGlmCisKKy8qIFB5T2JqZWN0X0hFQUQgZGVmaW5lcyB0aGUgaW5pdGlhbCBzZWdtZW50IG9mIGV2ZXJ5IFB5T2JqZWN0LiAqLworI2RlZmluZSBQeU9iamVjdF9IRUFEICAgICAgICAgICAgICAgICAgIFwKKyAgICBfUHlPYmplY3RfSEVBRF9FWFRSQSAgICAgICAgICAgICAgICBcCisgICAgUHlfc3NpemVfdCBvYl9yZWZjbnQ7ICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBfdHlwZW9iamVjdCAqb2JfdHlwZTsKKworI2RlZmluZSBQeU9iamVjdF9IRUFEX0lOSVQodHlwZSkgICAgICAgIFwKKyAgICBfUHlPYmplY3RfRVhUUkFfSU5JVCAgICAgICAgICAgICAgICBcCisgICAgMSwgdHlwZSwKKworI2RlZmluZSBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkgICAgICAgXAorICAgIFB5T2JqZWN0X0hFQURfSU5JVCh0eXBlKSBzaXplLAorCisvKiBQeU9iamVjdF9WQVJfSEVBRCBkZWZpbmVzIHRoZSBpbml0aWFsIHNlZ21lbnQgb2YgYWxsIHZhcmlhYmxlLXNpemUKKyAqIGNvbnRhaW5lciBvYmplY3RzLiAgVGhlc2UgZW5kIHdpdGggYSBkZWNsYXJhdGlvbiBvZiBhbiBhcnJheSB3aXRoIDEKKyAqIGVsZW1lbnQsIGJ1dCBlbm91Z2ggc3BhY2UgaXMgbWFsbG9jJ2VkIHNvIHRoYXQgdGhlIGFycmF5IGFjdHVhbGx5CisgKiBoYXMgcm9vbSBmb3Igb2Jfc2l6ZSBlbGVtZW50cy4gIE5vdGUgdGhhdCBvYl9zaXplIGlzIGFuIGVsZW1lbnQgY291bnQsCisgKiBub3QgbmVjZXNzYXJpbHkgYSBieXRlIGNvdW50LgorICovCisjZGVmaW5lIFB5T2JqZWN0X1ZBUl9IRUFEICAgICAgICAgICAgICAgXAorICAgIFB5T2JqZWN0X0hFQUQgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQeV9zc2l6ZV90IG9iX3NpemU7IC8qIE51bWJlciBvZiBpdGVtcyBpbiB2YXJpYWJsZSBwYXJ0ICovCisjZGVmaW5lIFB5X0lOVkFMSURfU0laRSAoUHlfc3NpemVfdCktMQorCisvKiBOb3RoaW5nIGlzIGFjdHVhbGx5IGRlY2xhcmVkIHRvIGJlIGEgUHlPYmplY3QsIGJ1dCBldmVyeSBwb2ludGVyIHRvCisgKiBhIFB5dGhvbiBvYmplY3QgY2FuIGJlIGNhc3QgdG8gYSBQeU9iamVjdCouICBUaGlzIGlzIGluaGVyaXRhbmNlIGJ1aWx0CisgKiBieSBoYW5kLiAgU2ltaWxhcmx5IGV2ZXJ5IHBvaW50ZXIgdG8gYSB2YXJpYWJsZS1zaXplIFB5dGhvbiBvYmplY3QgY2FuLAorICogaW4gYWRkaXRpb24sIGJlIGNhc3QgdG8gUHlWYXJPYmplY3QqLgorICovCit0eXBlZGVmIHN0cnVjdCBfb2JqZWN0IHsKKyAgICBQeU9iamVjdF9IRUFECit9IFB5T2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfVkFSX0hFQUQKK30gUHlWYXJPYmplY3Q7CisKKyNkZWZpbmUgUHlfUkVGQ05UKG9iKSAgICAgICAgICAgKCgoUHlPYmplY3QqKShvYikpLT5vYl9yZWZjbnQpCisjZGVmaW5lIFB5X1RZUEUob2IpICAgICAgICAgICAgICgoKFB5T2JqZWN0Kikob2IpKS0+b2JfdHlwZSkKKyNkZWZpbmUgUHlfU0laRShvYikgICAgICAgICAgICAgKCgoUHlWYXJPYmplY3QqKShvYikpLT5vYl9zaXplKQorCisvKgorVHlwZSBvYmplY3RzIGNvbnRhaW4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdHlwZSBuYW1lICh0byBoZWxwIHNvbWV3aGF0CitpbiBkZWJ1Z2dpbmcpLCB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIChzZWUgUHlPYmplY3RfTmV3KCkgYW5kCitQeU9iamVjdF9OZXdWYXIoKSksCithbmQgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIG9iamVjdHMgb2YgdGhlIHR5cGUuICBNZXRob2RzIGFyZSBvcHRpb25hbCwgYQorbmlsIHBvaW50ZXIgbWVhbmluZyB0aGF0IHBhcnRpY3VsYXIga2luZCBvZiBhY2Nlc3MgaXMgbm90IGF2YWlsYWJsZSBmb3IKK3RoaXMgdHlwZS4gIFRoZSBQeV9ERUNSRUYoKSBtYWNybyB1c2VzIHRoZSB0cF9kZWFsbG9jIG1ldGhvZCB3aXRob3V0CitjaGVja2luZyBmb3IgYSBuaWwgcG9pbnRlcjsgaXQgc2hvdWxkIGFsd2F5cyBiZSBpbXBsZW1lbnRlZCBleGNlcHQgaWYKK3RoZSBpbXBsZW1lbnRhdGlvbiBjYW4gZ3VhcmFudGVlIHRoYXQgdGhlIHJlZmVyZW5jZSBjb3VudCB3aWxsIG5ldmVyCityZWFjaCB6ZXJvIChlLmcuLCBmb3Igc3RhdGljYWxseSBhbGxvY2F0ZWQgdHlwZSBvYmplY3RzKS4KKworTkI6IHRoZSBtZXRob2RzIGZvciBjZXJ0YWluIHR5cGUgZ3JvdXBzIGFyZSBub3cgY29udGFpbmVkIGluIHNlcGFyYXRlCittZXRob2QgYmxvY2tzLgorKi8KKwordHlwZWRlZiBQeU9iamVjdCAqICgqdW5hcnlmdW5jKShQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKiAoKmJpbmFyeWZ1bmMpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBQeU9iamVjdCAqICgqdGVybmFyeWZ1bmMpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQgKCppbnF1aXJ5KShQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlfc3NpemVfdCAoKmxlbmZ1bmMpKFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQgKCpjb2VyY2lvbikoUHlPYmplY3QgKiosIFB5T2JqZWN0ICoqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqaW50YXJnZnVuYykoUHlPYmplY3QgKiwgaW50KSBQeV9ERVBSRUNBVEVEKDIuNSk7Cit0eXBlZGVmIFB5T2JqZWN0ICooKmludGludGFyZ2Z1bmMpKFB5T2JqZWN0ICosIGludCwgaW50KSBQeV9ERVBSRUNBVEVEKDIuNSk7Cit0eXBlZGVmIFB5T2JqZWN0ICooKnNzaXplYXJnZnVuYykoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7Cit0eXBlZGVmIFB5T2JqZWN0ICooKnNzaXplc3NpemVhcmdmdW5jKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90KTsKK3R5cGVkZWYgaW50KCppbnRvYmphcmdwcm9jKShQeU9iamVjdCAqLCBpbnQsIFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQoKmludGludG9iamFyZ3Byb2MpKFB5T2JqZWN0ICosIGludCwgaW50LCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50KCpzc2l6ZW9iamFyZ3Byb2MpKFB5T2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQoKnNzaXplc3NpemVvYmphcmdwcm9jKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50KCpvYmpvYmphcmdwcm9jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworCisKKy8qIGludC1iYXNlZCBidWZmZXIgaW50ZXJmYWNlICovCit0eXBlZGVmIGludCAoKmdldHJlYWRidWZmZXJwcm9jKShQeU9iamVjdCAqLCBpbnQsIHZvaWQgKiopOwordHlwZWRlZiBpbnQgKCpnZXR3cml0ZWJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIGludCwgdm9pZCAqKik7Cit0eXBlZGVmIGludCAoKmdldHNlZ2NvdW50cHJvYykoUHlPYmplY3QgKiwgaW50ICopOwordHlwZWRlZiBpbnQgKCpnZXRjaGFyYnVmZmVycHJvYykoUHlPYmplY3QgKiwgaW50LCBjaGFyICoqKTsKKy8qIHNzaXplX3QtYmFzZWQgYnVmZmVyIGludGVyZmFjZSAqLwordHlwZWRlZiBQeV9zc2l6ZV90ICgqcmVhZGJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X3NzaXplX3QsIHZvaWQgKiopOwordHlwZWRlZiBQeV9zc2l6ZV90ICgqd3JpdGVidWZmZXJwcm9jKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCB2b2lkICoqKTsKK3R5cGVkZWYgUHlfc3NpemVfdCAoKnNlZ2NvdW50cHJvYykoUHlPYmplY3QgKiwgUHlfc3NpemVfdCAqKTsKK3R5cGVkZWYgUHlfc3NpemVfdCAoKmNoYXJidWZmZXJwcm9jKShQeU9iamVjdCAqLCBQeV9zc2l6ZV90LCBjaGFyICoqKTsKKworCisvKiBQeTNrIGJ1ZmZlciBpbnRlcmZhY2UgKi8KK3R5cGVkZWYgc3RydWN0IGJ1ZmZlcmluZm8geworICAgIHZvaWQgKmJ1ZjsKKyAgICBQeU9iamVjdCAqb2JqOyAgICAgICAgLyogb3duZWQgcmVmZXJlbmNlICovCisgICAgUHlfc3NpemVfdCBsZW47CisgICAgUHlfc3NpemVfdCBpdGVtc2l6ZTsgIC8qIFRoaXMgaXMgUHlfc3NpemVfdCBzbyBpdCBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCB0byBieSBzdHJpZGVzIGluIHNpbXBsZSBjYXNlLiovCisgICAgaW50IHJlYWRvbmx5OworICAgIGludCBuZGltOworICAgIGNoYXIgKmZvcm1hdDsKKyAgICBQeV9zc2l6ZV90ICpzaGFwZTsKKyAgICBQeV9zc2l6ZV90ICpzdHJpZGVzOworICAgIFB5X3NzaXplX3QgKnN1Ym9mZnNldHM7CisgICAgUHlfc3NpemVfdCBzbWFsbHRhYmxlWzJdOyAgLyogc3RhdGljIHN0b3JlIGZvciBzaGFwZSBhbmQgc3RyaWRlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm8tZGltZW5zaW9uYWwgYnVmZmVycy4gKi8KKyAgICB2b2lkICppbnRlcm5hbDsKK30gUHlfYnVmZmVyOworCit0eXBlZGVmIGludCAoKmdldGJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqLCBpbnQpOwordHlwZWRlZiB2b2lkICgqcmVsZWFzZWJ1ZmZlcnByb2MpKFB5T2JqZWN0ICosIFB5X2J1ZmZlciAqKTsKKworICAgIC8qIEZsYWdzIGZvciBnZXR0aW5nIGJ1ZmZlcnMgKi8KKyNkZWZpbmUgUHlCVUZfU0lNUExFIDAKKyNkZWZpbmUgUHlCVUZfV1JJVEFCTEUgMHgwMDAxCisvKiAgd2UgdXNlZCB0byBpbmNsdWRlIGFuIEUsIGJhY2t3YXJkcyBjb21wYXRpYmxlIGFsaWFzICAqLworI2RlZmluZSBQeUJVRl9XUklURUFCTEUgUHlCVUZfV1JJVEFCTEUKKyNkZWZpbmUgUHlCVUZfRk9STUFUIDB4MDAwNAorI2RlZmluZSBQeUJVRl9ORCAweDAwMDgKKyNkZWZpbmUgUHlCVUZfU1RSSURFUyAoMHgwMDEwIHwgUHlCVUZfTkQpCisjZGVmaW5lIFB5QlVGX0NfQ09OVElHVU9VUyAoMHgwMDIwIHwgUHlCVUZfU1RSSURFUykKKyNkZWZpbmUgUHlCVUZfRl9DT05USUdVT1VTICgweDAwNDAgfCBQeUJVRl9TVFJJREVTKQorI2RlZmluZSBQeUJVRl9BTllfQ09OVElHVU9VUyAoMHgwMDgwIHwgUHlCVUZfU1RSSURFUykKKyNkZWZpbmUgUHlCVUZfSU5ESVJFQ1QgKDB4MDEwMCB8IFB5QlVGX1NUUklERVMpCisKKyNkZWZpbmUgUHlCVUZfQ09OVElHIChQeUJVRl9ORCB8IFB5QlVGX1dSSVRBQkxFKQorI2RlZmluZSBQeUJVRl9DT05USUdfUk8gKFB5QlVGX05EKQorCisjZGVmaW5lIFB5QlVGX1NUUklERUQgKFB5QlVGX1NUUklERVMgfCBQeUJVRl9XUklUQUJMRSkKKyNkZWZpbmUgUHlCVUZfU1RSSURFRF9STyAoUHlCVUZfU1RSSURFUykKKworI2RlZmluZSBQeUJVRl9SRUNPUkRTIChQeUJVRl9TVFJJREVTIHwgUHlCVUZfV1JJVEFCTEUgfCBQeUJVRl9GT1JNQVQpCisjZGVmaW5lIFB5QlVGX1JFQ09SRFNfUk8gKFB5QlVGX1NUUklERVMgfCBQeUJVRl9GT1JNQVQpCisKKyNkZWZpbmUgUHlCVUZfRlVMTCAoUHlCVUZfSU5ESVJFQ1QgfCBQeUJVRl9XUklUQUJMRSB8IFB5QlVGX0ZPUk1BVCkKKyNkZWZpbmUgUHlCVUZfRlVMTF9STyAoUHlCVUZfSU5ESVJFQ1QgfCBQeUJVRl9GT1JNQVQpCisKKworI2RlZmluZSBQeUJVRl9SRUFEICAweDEwMAorI2RlZmluZSBQeUJVRl9XUklURSAweDIwMAorI2RlZmluZSBQeUJVRl9TSEFET1cgMHg0MDAKKy8qIGVuZCBQeTNrIGJ1ZmZlciBpbnRlcmZhY2UgKi8KKwordHlwZWRlZiBpbnQgKCpvYmpvYmpwcm9jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50ICgqdmlzaXRwcm9jKShQeU9iamVjdCAqLCB2b2lkICopOwordHlwZWRlZiBpbnQgKCp0cmF2ZXJzZXByb2MpKFB5T2JqZWN0ICosIHZpc2l0cHJvYywgdm9pZCAqKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8qIEZvciBudW1iZXJzIHdpdGhvdXQgZmxhZyBiaXQgUHlfVFBGTEFHU19DSEVDS1RZUEVTIHNldCwgYWxsCisgICAgICAgYXJndW1lbnRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBvYmplY3QncyB0eXBlIChtb2R1bG8KKyAgICAgICBjb2VyY2lvbiBoYWNrcyAtLSBpLmUuIGlmIHRoZSB0eXBlJ3MgY29lcmNpb24gZnVuY3Rpb24KKyAgICAgICByZXR1cm5zIG90aGVyIHR5cGVzLCB0aGVuIHRoZXNlIGFyZSBhbGxvd2VkIGFzIHdlbGwpLiAgTnVtYmVycyB0aGF0CisgICAgICAgaGF2ZSB0aGUgUHlfVFBGTEFHU19DSEVDS1RZUEVTIGZsYWcgYml0IHNldCBzaG91bGQgY2hlY2sgKmJvdGgqCisgICAgICAgYXJndW1lbnRzIGZvciBwcm9wZXIgdHlwZSBhbmQgaW1wbGVtZW50IHRoZSBuZWNlc3NhcnkgY29udmVyc2lvbnMKKyAgICAgICBpbiB0aGUgc2xvdCBmdW5jdGlvbnMgdGhlbXNlbHZlcy4gKi8KKworICAgIGJpbmFyeWZ1bmMgbmJfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfc3VidHJhY3Q7CisgICAgYmluYXJ5ZnVuYyBuYl9tdWx0aXBseTsKKyAgICBiaW5hcnlmdW5jIG5iX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX3JlbWFpbmRlcjsKKyAgICBiaW5hcnlmdW5jIG5iX2Rpdm1vZDsKKyAgICB0ZXJuYXJ5ZnVuYyBuYl9wb3dlcjsKKyAgICB1bmFyeWZ1bmMgbmJfbmVnYXRpdmU7CisgICAgdW5hcnlmdW5jIG5iX3Bvc2l0aXZlOworICAgIHVuYXJ5ZnVuYyBuYl9hYnNvbHV0ZTsKKyAgICBpbnF1aXJ5IG5iX25vbnplcm87CisgICAgdW5hcnlmdW5jIG5iX2ludmVydDsKKyAgICBiaW5hcnlmdW5jIG5iX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX3JzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2FuZDsKKyAgICBiaW5hcnlmdW5jIG5iX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX29yOworICAgIGNvZXJjaW9uIG5iX2NvZXJjZTsKKyAgICB1bmFyeWZ1bmMgbmJfaW50OworICAgIHVuYXJ5ZnVuYyBuYl9sb25nOworICAgIHVuYXJ5ZnVuYyBuYl9mbG9hdDsKKyAgICB1bmFyeWZ1bmMgbmJfb2N0OworICAgIHVuYXJ5ZnVuYyBuYl9oZXg7CisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjAgKi8KKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfYWRkOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9zdWJ0cmFjdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfbXVsdGlwbHk7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcmVtYWluZGVyOworICAgIHRlcm5hcnlmdW5jIG5iX2lucGxhY2VfcG93ZXI7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX2xzaGlmdDsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2VfcnNoaWZ0OworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9hbmQ7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3hvcjsKKyAgICBiaW5hcnlmdW5jIG5iX2lucGxhY2Vfb3I7CisKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLworICAgIC8qIFRoZSBmb2xsb3dpbmcgcmVxdWlyZSB0aGUgUHlfVFBGTEFHU19IQVZFX0NMQVNTIGZsYWcgKi8KKyAgICBiaW5hcnlmdW5jIG5iX2Zsb29yX2RpdmlkZTsKKyAgICBiaW5hcnlmdW5jIG5iX3RydWVfZGl2aWRlOworICAgIGJpbmFyeWZ1bmMgbmJfaW5wbGFjZV9mbG9vcl9kaXZpZGU7CisgICAgYmluYXJ5ZnVuYyBuYl9pbnBsYWNlX3RydWVfZGl2aWRlOworCisgICAgLyogQWRkZWQgaW4gcmVsZWFzZSAyLjUgKi8KKyAgICB1bmFyeWZ1bmMgbmJfaW5kZXg7Cit9IFB5TnVtYmVyTWV0aG9kczsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGxlbmZ1bmMgc3FfbGVuZ3RoOworICAgIGJpbmFyeWZ1bmMgc3FfY29uY2F0OworICAgIHNzaXplYXJnZnVuYyBzcV9yZXBlYXQ7CisgICAgc3NpemVhcmdmdW5jIHNxX2l0ZW07CisgICAgc3NpemVzc2l6ZWFyZ2Z1bmMgc3Ffc2xpY2U7CisgICAgc3NpemVvYmphcmdwcm9jIHNxX2Fzc19pdGVtOworICAgIHNzaXplc3NpemVvYmphcmdwcm9jIHNxX2Fzc19zbGljZTsKKyAgICBvYmpvYmpwcm9jIHNxX2NvbnRhaW5zOworICAgIC8qIEFkZGVkIGluIHJlbGVhc2UgMi4wICovCisgICAgYmluYXJ5ZnVuYyBzcV9pbnBsYWNlX2NvbmNhdDsKKyAgICBzc2l6ZWFyZ2Z1bmMgc3FfaW5wbGFjZV9yZXBlYXQ7Cit9IFB5U2VxdWVuY2VNZXRob2RzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbGVuZnVuYyBtcF9sZW5ndGg7CisgICAgYmluYXJ5ZnVuYyBtcF9zdWJzY3JpcHQ7CisgICAgb2Jqb2JqYXJncHJvYyBtcF9hc3Nfc3Vic2NyaXB0OworfSBQeU1hcHBpbmdNZXRob2RzOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgcmVhZGJ1ZmZlcnByb2MgYmZfZ2V0cmVhZGJ1ZmZlcjsKKyAgICB3cml0ZWJ1ZmZlcnByb2MgYmZfZ2V0d3JpdGVidWZmZXI7CisgICAgc2VnY291bnRwcm9jIGJmX2dldHNlZ2NvdW50OworICAgIGNoYXJidWZmZXJwcm9jIGJmX2dldGNoYXJidWZmZXI7CisgICAgZ2V0YnVmZmVycHJvYyBiZl9nZXRidWZmZXI7CisgICAgcmVsZWFzZWJ1ZmZlcnByb2MgYmZfcmVsZWFzZWJ1ZmZlcjsKK30gUHlCdWZmZXJQcm9jczsKKworCit0eXBlZGVmIHZvaWQgKCpmcmVlZnVuYykodm9pZCAqKTsKK3R5cGVkZWYgdm9pZCAoKmRlc3RydWN0b3IpKFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQgKCpwcmludGZ1bmMpKFB5T2JqZWN0ICosIEZJTEUgKiwgaW50KTsKK3R5cGVkZWYgUHlPYmplY3QgKigqZ2V0YXR0cmZ1bmMpKFB5T2JqZWN0ICosIGNoYXIgKik7Cit0eXBlZGVmIFB5T2JqZWN0ICooKmdldGF0dHJvZnVuYykoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7Cit0eXBlZGVmIGludCAoKnNldGF0dHJmdW5jKShQeU9iamVjdCAqLCBjaGFyICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQgKCpzZXRhdHRyb2Z1bmMpKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBpbnQgKCpjbXBmdW5jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqcmVwcmZ1bmMpKFB5T2JqZWN0ICopOwordHlwZWRlZiBsb25nICgqaGFzaGZ1bmMpKFB5T2JqZWN0ICopOwordHlwZWRlZiBQeU9iamVjdCAqKCpyaWNoY21wZnVuYykgKFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIGludCk7Cit0eXBlZGVmIFB5T2JqZWN0ICooKmdldGl0ZXJmdW5jKSAoUHlPYmplY3QgKik7Cit0eXBlZGVmIFB5T2JqZWN0ICooKml0ZXJuZXh0ZnVuYykgKFB5T2JqZWN0ICopOwordHlwZWRlZiBQeU9iamVjdCAqKCpkZXNjcmdldGZ1bmMpIChQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgaW50ICgqZGVzY3JzZXRmdW5jKSAoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7Cit0eXBlZGVmIGludCAoKmluaXRwcm9jKShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK3R5cGVkZWYgUHlPYmplY3QgKigqbmV3ZnVuYykoc3RydWN0IF90eXBlb2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOwordHlwZWRlZiBQeU9iamVjdCAqKCphbGxvY2Z1bmMpKHN0cnVjdCBfdHlwZW9iamVjdCAqLCBQeV9zc2l6ZV90KTsKKwordHlwZWRlZiBzdHJ1Y3QgX3R5cGVvYmplY3QgeworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgY29uc3QgY2hhciAqdHBfbmFtZTsgLyogRm9yIHByaW50aW5nLCBpbiBmb3JtYXQgIjxtb2R1bGU+LjxuYW1lPiIgKi8KKyAgICBQeV9zc2l6ZV90IHRwX2Jhc2ljc2l6ZSwgdHBfaXRlbXNpemU7IC8qIEZvciBhbGxvY2F0aW9uICovCisKKyAgICAvKiBNZXRob2RzIHRvIGltcGxlbWVudCBzdGFuZGFyZCBvcGVyYXRpb25zICovCisKKyAgICBkZXN0cnVjdG9yIHRwX2RlYWxsb2M7CisgICAgcHJpbnRmdW5jIHRwX3ByaW50OworICAgIGdldGF0dHJmdW5jIHRwX2dldGF0dHI7CisgICAgc2V0YXR0cmZ1bmMgdHBfc2V0YXR0cjsKKyAgICBjbXBmdW5jIHRwX2NvbXBhcmU7CisgICAgcmVwcmZ1bmMgdHBfcmVwcjsKKworICAgIC8qIE1ldGhvZCBzdWl0ZXMgZm9yIHN0YW5kYXJkIGNsYXNzZXMgKi8KKworICAgIFB5TnVtYmVyTWV0aG9kcyAqdHBfYXNfbnVtYmVyOworICAgIFB5U2VxdWVuY2VNZXRob2RzICp0cF9hc19zZXF1ZW5jZTsKKyAgICBQeU1hcHBpbmdNZXRob2RzICp0cF9hc19tYXBwaW5nOworCisgICAgLyogTW9yZSBzdGFuZGFyZCBvcGVyYXRpb25zIChoZXJlIGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSkgKi8KKworICAgIGhhc2hmdW5jIHRwX2hhc2g7CisgICAgdGVybmFyeWZ1bmMgdHBfY2FsbDsKKyAgICByZXByZnVuYyB0cF9zdHI7CisgICAgZ2V0YXR0cm9mdW5jIHRwX2dldGF0dHJvOworICAgIHNldGF0dHJvZnVuYyB0cF9zZXRhdHRybzsKKworICAgIC8qIEZ1bmN0aW9ucyB0byBhY2Nlc3Mgb2JqZWN0IGFzIGlucHV0L291dHB1dCBidWZmZXIgKi8KKyAgICBQeUJ1ZmZlclByb2NzICp0cF9hc19idWZmZXI7CisKKyAgICAvKiBGbGFncyB0byBkZWZpbmUgcHJlc2VuY2Ugb2Ygb3B0aW9uYWwvZXhwYW5kZWQgZmVhdHVyZXMgKi8KKyAgICBsb25nIHRwX2ZsYWdzOworCisgICAgY29uc3QgY2hhciAqdHBfZG9jOyAvKiBEb2N1bWVudGF0aW9uIHN0cmluZyAqLworCisgICAgLyogQXNzaWduZWQgbWVhbmluZyBpbiByZWxlYXNlIDIuMCAqLworICAgIC8qIGNhbGwgZnVuY3Rpb24gZm9yIGFsbCBhY2Nlc3NpYmxlIG9iamVjdHMgKi8KKyAgICB0cmF2ZXJzZXByb2MgdHBfdHJhdmVyc2U7CisKKyAgICAvKiBkZWxldGUgcmVmZXJlbmNlcyB0byBjb250YWluZWQgb2JqZWN0cyAqLworICAgIGlucXVpcnkgdHBfY2xlYXI7CisKKyAgICAvKiBBc3NpZ25lZCBtZWFuaW5nIGluIHJlbGVhc2UgMi4xICovCisgICAgLyogcmljaCBjb21wYXJpc29ucyAqLworICAgIHJpY2hjbXBmdW5jIHRwX3JpY2hjb21wYXJlOworCisgICAgLyogd2VhayByZWZlcmVuY2UgZW5hYmxlciAqLworICAgIFB5X3NzaXplX3QgdHBfd2Vha2xpc3RvZmZzZXQ7CisKKyAgICAvKiBBZGRlZCBpbiByZWxlYXNlIDIuMiAqLworICAgIC8qIEl0ZXJhdG9ycyAqLworICAgIGdldGl0ZXJmdW5jIHRwX2l0ZXI7CisgICAgaXRlcm5leHRmdW5jIHRwX2l0ZXJuZXh0OworCisgICAgLyogQXR0cmlidXRlIGRlc2NyaXB0b3IgYW5kIHN1YmNsYXNzaW5nIHN0dWZmICovCisgICAgc3RydWN0IFB5TWV0aG9kRGVmICp0cF9tZXRob2RzOworICAgIHN0cnVjdCBQeU1lbWJlckRlZiAqdHBfbWVtYmVyczsKKyAgICBzdHJ1Y3QgUHlHZXRTZXREZWYgKnRwX2dldHNldDsKKyAgICBzdHJ1Y3QgX3R5cGVvYmplY3QgKnRwX2Jhc2U7CisgICAgUHlPYmplY3QgKnRwX2RpY3Q7CisgICAgZGVzY3JnZXRmdW5jIHRwX2Rlc2NyX2dldDsKKyAgICBkZXNjcnNldGZ1bmMgdHBfZGVzY3Jfc2V0OworICAgIFB5X3NzaXplX3QgdHBfZGljdG9mZnNldDsKKyAgICBpbml0cHJvYyB0cF9pbml0OworICAgIGFsbG9jZnVuYyB0cF9hbGxvYzsKKyAgICBuZXdmdW5jIHRwX25ldzsKKyAgICBmcmVlZnVuYyB0cF9mcmVlOyAvKiBMb3ctbGV2ZWwgZnJlZS1tZW1vcnkgcm91dGluZSAqLworICAgIGlucXVpcnkgdHBfaXNfZ2M7IC8qIEZvciBQeU9iamVjdF9JU19HQyAqLworICAgIFB5T2JqZWN0ICp0cF9iYXNlczsKKyAgICBQeU9iamVjdCAqdHBfbXJvOyAvKiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciAqLworICAgIFB5T2JqZWN0ICp0cF9jYWNoZTsKKyAgICBQeU9iamVjdCAqdHBfc3ViY2xhc3NlczsKKyAgICBQeU9iamVjdCAqdHBfd2Vha2xpc3Q7CisgICAgZGVzdHJ1Y3RvciB0cF9kZWw7CisKKyAgICAvKiBUeXBlIGF0dHJpYnV0ZSBjYWNoZSB2ZXJzaW9uIHRhZy4gQWRkZWQgaW4gdmVyc2lvbiAyLjYgKi8KKyAgICB1bnNpZ25lZCBpbnQgdHBfdmVyc2lvbl90YWc7CisKKyNpZmRlZiBDT1VOVF9BTExPQ1MKKyAgICAvKiB0aGVzZSBtdXN0IGJlIGxhc3QgYW5kIG5ldmVyIGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQgKi8KKyAgICBQeV9zc2l6ZV90IHRwX2FsbG9jczsKKyAgICBQeV9zc2l6ZV90IHRwX2ZyZWVzOworICAgIFB5X3NzaXplX3QgdHBfbWF4YWxsb2M7CisgICAgc3RydWN0IF90eXBlb2JqZWN0ICp0cF9wcmV2OworICAgIHN0cnVjdCBfdHlwZW9iamVjdCAqdHBfbmV4dDsKKyNlbmRpZgorfSBQeVR5cGVPYmplY3Q7CisKKworLyogVGhlICpyZWFsKiBsYXlvdXQgb2YgYSB0eXBlIG9iamVjdCB3aGVuIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCAqLwordHlwZWRlZiBzdHJ1Y3QgX2hlYXB0eXBlb2JqZWN0IHsKKyAgICAvKiBOb3RlOiB0aGVyZSdzIGEgZGVwZW5kZW5jeSBvbiB0aGUgb3JkZXIgb2YgdGhlc2UgbWVtYmVycworICAgICAgIGluIHNsb3RwdHIoKSBpbiB0eXBlb2JqZWN0LmMgLiAqLworICAgIFB5VHlwZU9iamVjdCBodF90eXBlOworICAgIFB5TnVtYmVyTWV0aG9kcyBhc19udW1iZXI7CisgICAgUHlNYXBwaW5nTWV0aG9kcyBhc19tYXBwaW5nOworICAgIFB5U2VxdWVuY2VNZXRob2RzIGFzX3NlcXVlbmNlOyAvKiBhc19zZXF1ZW5jZSBjb21lcyBhZnRlciBhc19tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGF0IHRoZSBtYXBwaW5nIHdpbnMgd2hlbiBib3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXBwaW5nIGFuZCB0aGUgc2VxdWVuY2UgZGVmaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgZ2l2ZW4gb3BlcmF0b3IgKGUuZy4gX19nZXRpdGVtX18pLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWUgYWRkX29wZXJhdG9ycygpIGluIHR5cGVvYmplY3QuYyAuICovCisgICAgUHlCdWZmZXJQcm9jcyBhc19idWZmZXI7CisgICAgUHlPYmplY3QgKmh0X25hbWUsICpodF9zbG90czsKKyAgICAvKiBoZXJlIGFyZSBvcHRpb25hbCB1c2VyIHNsb3RzLCBmb2xsb3dlZCBieSB0aGUgbWVtYmVycy4gKi8KK30gUHlIZWFwVHlwZU9iamVjdDsKKworLyogYWNjZXNzIG1hY3JvIHRvIHRoZSBtZW1iZXJzIHdoaWNoIGFyZSBmbG9hdGluZyAiYmVoaW5kIiB0aGUgb2JqZWN0ICovCisjZGVmaW5lIFB5SGVhcFR5cGVfR0VUX01FTUJFUlMoZXR5cGUpIFwKKyAgICAoKFB5TWVtYmVyRGVmICopKCgoY2hhciAqKWV0eXBlKSArIFB5X1RZUEUoZXR5cGUpLT50cF9iYXNpY3NpemUpKQorCisKKy8qIEdlbmVyaWMgdHlwZSBjaGVjayAqLworUHlBUElfRlVOQyhpbnQpIFB5VHlwZV9Jc1N1YnR5cGUoUHlUeXBlT2JqZWN0ICosIFB5VHlwZU9iamVjdCAqKTsKKyNkZWZpbmUgUHlPYmplY3RfVHlwZUNoZWNrKG9iLCB0cCkgXAorICAgIChQeV9UWVBFKG9iKSA9PSAodHApIHx8IFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICh0cCkpKQorCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlUeXBlX1R5cGU7IC8qIGJ1aWx0LWluICd0eXBlJyAqLworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5QmFzZU9iamVjdF9UeXBlOyAvKiBidWlsdC1pbiAnb2JqZWN0JyAqLworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5U3VwZXJfVHlwZTsgLyogYnVpbHQtaW4gJ3N1cGVyJyAqLworCisjZGVmaW5lIFB5VHlwZV9DaGVjayhvcCkgXAorICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUykKKyNkZWZpbmUgUHlUeXBlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlUeXBlX1R5cGUpCisKK1B5QVBJX0ZVTkMoaW50KSBQeVR5cGVfUmVhZHkoUHlUeXBlT2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVR5cGVfR2VuZXJpY0FsbG9jKFB5VHlwZU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUeXBlX0dlbmVyaWNOZXcoUHlUeXBlT2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlUeXBlX0xvb2t1cChQeVR5cGVPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9Mb29rdXBTcGVjaWFsKFB5T2JqZWN0ICosIGNoYXIgKiwgUHlPYmplY3QgKiopOworUHlBUElfRlVOQyh1bnNpZ25lZCBpbnQpIFB5VHlwZV9DbGVhckNhY2hlKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeVR5cGVfTW9kaWZpZWQoUHlUeXBlT2JqZWN0ICopOworCisvKiBHZW5lcmljIG9wZXJhdGlvbnMgb24gb2JqZWN0cyAqLworUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X1ByaW50KFB5T2JqZWN0ICosIEZJTEUgKiwgaW50KTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5T2JqZWN0X0R1bXAoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X1JlcHIoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9TdHIoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X1N0cihQeU9iamVjdCAqKTsKKyNkZWZpbmUgUHlPYmplY3RfQnl0ZXMgUHlPYmplY3RfU3RyCisjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQorUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9Vbmljb2RlKFB5T2JqZWN0ICopOworI2VuZGlmCitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfQ29tcGFyZShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfUmljaENvbXBhcmUoUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgaW50KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfR2V0QXR0clN0cmluZyhQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X1NldEF0dHJTdHJpbmcoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0dldEF0dHIoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfU2V0QXR0cihQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9IYXNBdHRyKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKikgX1B5T2JqZWN0X0dldERpY3RQdHIoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X1NlbGZJdGVyKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfTmV4dE5vdEltcGxlbWVudGVkKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeU9iamVjdF9HZW5lcmljR2V0QXR0cihQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU9iamVjdF9HZW5lcmljU2V0QXR0cihQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhsb25nKSBQeU9iamVjdF9IYXNoKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhsb25nKSBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlPYmplY3RfSXNUcnVlKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5T2JqZWN0X05vdChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeUNhbGxhYmxlX0NoZWNrKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5TnVtYmVyX0NvZXJjZShQeU9iamVjdCAqKiwgUHlPYmplY3QgKiopOworUHlBUElfRlVOQyhpbnQpIFB5TnVtYmVyX0NvZXJjZUV4KFB5T2JqZWN0ICoqLCBQeU9iamVjdCAqKik7CisKK1B5QVBJX0ZVTkModm9pZCkgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcyhQeU9iamVjdCAqKTsKKworLyogQSBzbG90IGZ1bmN0aW9uIHdob3NlIGFkZHJlc3Mgd2UgbmVlZCB0byBjb21wYXJlICovCitleHRlcm4gaW50IF9QeU9iamVjdF9TbG90Q29tcGFyZShQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKy8qIFNhbWUgYXMgUHlPYmplY3RfR2VuZXJpY3tHZXQsU2V0fUF0dHIsIGJ1dCBwYXNzaW5nIHRoZSBhdHRyaWJ1dGVzCisgICBkaWN0IGFzIHRoZSBsYXN0IHBhcmFtZXRlci4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikKK19QeU9iamVjdF9HZW5lcmljR2V0QXR0cldpdGhEaWN0KFB5T2JqZWN0ICosIFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpCitfUHlPYmplY3RfR2VuZXJpY1NldEF0dHJXaXRoRGljdChQeU9iamVjdCAqLCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKKworLyogUHlPYmplY3RfRGlyKG9iaikgYWN0cyBsaWtlIFB5dGhvbiBfX2J1aWx0aW5fXy5kaXIob2JqKSwgcmV0dXJuaW5nIGEKKyAgIGxpc3Qgb2Ygc3RyaW5ncy4gIFB5T2JqZWN0X0RpcihOVUxMKSBpcyBsaWtlIF9fYnVpbHRpbl9fLmRpcigpLAorICAgcmV0dXJuaW5nIHRoZSBuYW1lcyBvZiB0aGUgY3VycmVudCBsb2NhbHMuICBJbiB0aGlzIGNhc2UsIGlmIHRoZXJlIGFyZQorICAgbm8gY3VycmVudCBsb2NhbHMsIE5VTEwgaXMgcmV0dXJuZWQsIGFuZCBQeUVycl9PY2N1cnJlZCgpIGlzIGZhbHNlLgorKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlPYmplY3RfRGlyKFB5T2JqZWN0ICopOworCisKKy8qIEhlbHBlcnMgZm9yIHByaW50aW5nIHJlY3Vyc2l2ZSBjb250YWluZXIgdHlwZXMgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeV9SZXByRW50ZXIoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5X1JlcHJMZWF2ZShQeU9iamVjdCAqKTsKKworLyogSGVscGVycyBmb3IgaGFzaCBmdW5jdGlvbnMgKi8KK1B5QVBJX0ZVTkMobG9uZykgX1B5X0hhc2hEb3VibGUoZG91YmxlKTsKK1B5QVBJX0ZVTkMobG9uZykgX1B5X0hhc2hQb2ludGVyKHZvaWQqKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGxvbmcgcHJlZml4OworICAgIGxvbmcgc3VmZml4OworfSBfUHlfSGFzaFNlY3JldF90OworUHlBUElfREFUQShfUHlfSGFzaFNlY3JldF90KSBfUHlfSGFzaFNlY3JldDsKKworI2lmZGVmIFB5X0RFQlVHCitQeUFQSV9EQVRBKGludCkgX1B5X0hhc2hTZWNyZXRfSW5pdGlhbGl6ZWQ7CisjZW5kaWYKKworLyogSGVscGVyIGZvciBwYXNzaW5nIG9iamVjdHMgdG8gcHJpbnRmIGFuZCB0aGUgbGlrZSAqLworI2RlZmluZSBQeU9iamVjdF9SRVBSKG9iaikgUHlTdHJpbmdfQVNfU1RSSU5HKFB5T2JqZWN0X1JlcHIob2JqKSkKKworLyogRmxhZyBiaXRzIGZvciBwcmludGluZzogKi8KKyNkZWZpbmUgUHlfUFJJTlRfUkFXICAgIDEgICAgICAgLyogTm8gc3RyaW5nIHF1b3RlcyBldGMuICovCisKKy8qCitgVHlwZSBmbGFncyAodHBfZmxhZ3MpCisKK1RoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIGV4dGVuZCB0aGUgdHlwZSBzdHJ1Y3R1cmUgaW4gYSBiYWNrd2FyZHMtY29tcGF0aWJsZQorZmFzaGlvbi4gRXh0ZW5zaW9ucyBjYW4gdXNlIHRoZSBmbGFncyB0byBpbmRpY2F0ZSAoYW5kIHRlc3QpIHdoZW4gYSBnaXZlbgordHlwZSBzdHJ1Y3R1cmUgY29udGFpbnMgYSBuZXcgZmVhdHVyZS4gVGhlIFB5dGhvbiBjb3JlIHdpbGwgdXNlIHRoZXNlIHdoZW4KK2ludHJvZHVjaW5nIG5ldyBmdW5jdGlvbmFsaXR5IGJldHdlZW4gbWFqb3IgcmV2aXNpb25zICh0byBhdm9pZCBtaWQtdmVyc2lvbgorY2hhbmdlcyBpbiB0aGUgUFlUSE9OX0FQSV9WRVJTSU9OKS4KKworQXJiaXRyYXRpb24gb2YgdGhlIGZsYWcgYml0IHBvc2l0aW9ucyB3aWxsIG5lZWQgdG8gYmUgY29vcmRpbmF0ZWQgYW1vbmcKK2FsbCBleHRlbnNpb24gd3JpdGVycyB3aG8gcHVibGljYWxseSByZWxlYXNlIHRoZWlyIGV4dGVuc2lvbnMgKHRoaXMgd2lsbAorYmUgZmV3ZXIgdGhhbiB5b3UgbWlnaHQgZXhwZWN0ISkuLgorCitQeXRob24gMS41LjIgaW50cm9kdWNlZCB0aGUgYmZfZ2V0Y2hhcmJ1ZmZlciBzbG90IGludG8gUHlCdWZmZXJQcm9jcy4KKworVHlwZSBkZWZpbml0aW9ucyBzaG91bGQgdXNlIFB5X1RQRkxBR1NfREVGQVVMVCBmb3IgdGhlaXIgdHBfZmxhZ3MgdmFsdWUuCisKK0NvZGUgY2FuIHVzZSBQeVR5cGVfSGFzRmVhdHVyZSh0eXBlX29iLCBmbGFnX3ZhbHVlKSB0byB0ZXN0IHdoZXRoZXIgdGhlCitnaXZlbiB0eXBlIG9iamVjdCBoYXMgYSBzcGVjaWZpZWQgZmVhdHVyZS4KKworTk9URTogd2hlbiBidWlsZGluZyB0aGUgY29yZSwgUHlfVFBGTEFHU19ERUZBVUxUIGluY2x1ZGVzCitQeV9UUEZMQUdTX0hBVkVfVkVSU0lPTl9UQUc7IG91dHNpZGUgdGhlIGNvcmUsIGl0IGRvZXNuJ3QuICBUaGlzIGlzIHNvCit0aGF0IGV4dGVuc2lvbnMgdGhhdCBtb2RpZnkgdHBfZGljdCBvZiB0aGVpciBvd24gdHlwZXMgZGlyZWN0bHkgZG9uJ3QKK2JyZWFrLCBzaW5jZSB0aGlzIHdhcyBhbGxvd2VkIGluIDIuNS4gIEluIDMuMCB0aGV5IHdpbGwgaGF2ZSB0bworbWFudWFsbHkgcmVtb3ZlIHRoaXMgZmxhZyB0aG91Z2ghCisqLworCisvKiBQeUJ1ZmZlclByb2NzIGNvbnRhaW5zIGJmX2dldGNoYXJidWZmZXIgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX0dFVENIQVJCVUZGRVIgICgxTDw8MCkKKworLyogUHlTZXF1ZW5jZU1ldGhvZHMgY29udGFpbnMgc3FfY29udGFpbnMgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX1NFUVVFTkNFX0lOICgxTDw8MSkKKworLyogVGhpcyBpcyBoZXJlIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gIEV4dGVuc2lvbnMgdGhhdCB1c2UgdGhlIG9sZCBHQworICogQVBJIHdpbGwgc3RpbGwgY29tcGlsZSBidXQgdGhlIG9iamVjdHMgd2lsbCBub3QgYmUgdHJhY2tlZCBieSB0aGUgR0MuICovCisjZGVmaW5lIFB5X1RQRkxBR1NfR0MgMCAvKiB1c2VkIHRvIGJlICgxTDw8MikgKi8KKworLyogUHlTZXF1ZW5jZU1ldGhvZHMgYW5kIFB5TnVtYmVyTWV0aG9kcyBjb250YWluIGluLXBsYWNlIG9wZXJhdG9ycyAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfSU5QTEFDRU9QUyAoMUw8PDMpCisKKy8qIFB5TnVtYmVyTWV0aG9kcyBkbyB0aGVpciBvd24gY29lcmNpb24gKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19DSEVDS1RZUEVTICgxTDw8NCkKKworLyogdHBfcmljaGNvbXBhcmUgaXMgZGVmaW5lZCAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUgKDFMPDw1KQorCisvKiBPYmplY3RzIHdoaWNoIGFyZSB3ZWFrbHkgcmVmZXJlbmNhYmxlIGlmIHRoZWlyIHRwX3dlYWtsaXN0b2Zmc2V0IGlzID4wICovCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUyAoMUw8PDYpCisKKy8qIHRwX2l0ZXIgaXMgZGVmaW5lZCAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfSVRFUiAoMUw8PDcpCisKKy8qIE5ldyBtZW1iZXJzIGludHJvZHVjZWQgYnkgUHl0aG9uIDIuMiBleGlzdCAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MgKDFMPDw4KQorCisvKiBTZXQgaWYgdGhlIHR5cGUgb2JqZWN0IGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hFQVBUWVBFICgxTDw8OSkKKworLyogU2V0IGlmIHRoZSB0eXBlIGFsbG93cyBzdWJjbGFzc2luZyAqLworI2RlZmluZSBQeV9UUEZMQUdTX0JBU0VUWVBFICgxTDw8MTApCisKKy8qIFNldCBpZiB0aGUgdHlwZSBpcyAncmVhZHknIC0tIGZ1bGx5IGluaXRpYWxpemVkICovCisjZGVmaW5lIFB5X1RQRkxBR1NfUkVBRFkgKDFMPDwxMikKKworLyogU2V0IHdoaWxlIHRoZSB0eXBlIGlzIGJlaW5nICdyZWFkaWVkJywgdG8gcHJldmVudCByZWN1cnNpdmUgcmVhZHkgY2FsbHMgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19SRUFEWUlORyAoMUw8PDEzKQorCisvKiBPYmplY3RzIHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uIChzZWUgb2JqaW1wLmgpICovCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9HQyAoMUw8PDE0KQorCisvKiBUaGVzZSB0d28gYml0cyBhcmUgcHJlc2VydmVkIGZvciBTdGFja2xlc3MgUHl0aG9uLCBuZXh0IGFmdGVyIHRoaXMgaXMgMTcgKi8KKyNpZmRlZiBTVEFDS0xFU1MKKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX1NUQUNLTEVTU19FWFRFTlNJT04gKDNMPDwxNSkKKyNlbHNlCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9TVEFDS0xFU1NfRVhURU5TSU9OIDAKKyNlbmRpZgorCisvKiBPYmplY3RzIHN1cHBvcnQgbmJfaW5kZXggaW4gUHlOdW1iZXJNZXRob2RzICovCisjZGVmaW5lIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCAoMUw8PDE3KQorCisvKiBPYmplY3RzIHN1cHBvcnQgdHlwZSBhdHRyaWJ1dGUgY2FjaGUgKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHICAgKDFMPDwxOCkKKyNkZWZpbmUgUHlfVFBGTEFHU19WQUxJRF9WRVJTSU9OX1RBRyAgKDFMPDwxOSkKKworLyogVHlwZSBpcyBhYnN0cmFjdCBhbmQgY2Fubm90IGJlIGluc3RhbnRpYXRlZCAqLworI2RlZmluZSBQeV9UUEZMQUdTX0lTX0FCU1RSQUNUICgxTDw8MjApCisKKy8qIEhhcyB0aGUgbmV3IGJ1ZmZlciBwcm90b2NvbCAqLworI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfTkVXQlVGRkVSICgxTDw8MjEpCisKKy8qIFRoZXNlIGZsYWdzIGFyZSB1c2VkIHRvIGRldGVybWluZSBpZiBhIHR5cGUgaXMgYSBzdWJjbGFzcy4gKi8KKyNkZWZpbmUgUHlfVFBGTEFHU19JTlRfU1VCQ0xBU1MgICAgICAgICAoMUw8PDIzKQorI2RlZmluZSBQeV9UUEZMQUdTX0xPTkdfU1VCQ0xBU1MgICAgICAgICgxTDw8MjQpCisjZGVmaW5lIFB5X1RQRkxBR1NfTElTVF9TVUJDTEFTUyAgICAgICAgKDFMPDwyNSkKKyNkZWZpbmUgUHlfVFBGTEFHU19UVVBMRV9TVUJDTEFTUyAgICAgICAoMUw8PDI2KQorI2RlZmluZSBQeV9UUEZMQUdTX1NUUklOR19TVUJDTEFTUyAgICAgICgxTDw8MjcpCisjZGVmaW5lIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUyAgICAgKDFMPDwyOCkKKyNkZWZpbmUgUHlfVFBGTEFHU19ESUNUX1NVQkNMQVNTICAgICAgICAoMUw8PDI5KQorI2RlZmluZSBQeV9UUEZMQUdTX0JBU0VfRVhDX1NVQkNMQVNTICAgICgxTDw8MzApCisjZGVmaW5lIFB5X1RQRkxBR1NfVFlQRV9TVUJDTEFTUyAgICAgICAgKDFMPDwzMSkKKworI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFRfRVhURVJOQUwgKCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9HRVRDSEFSQlVGRkVSIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfU0VRVUVOQ0VfSU4gfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTlBMQUNFT1BTIHwgXAorICAgICAgICAgICAgICAgICBQeV9UUEZMQUdTX0hBVkVfUklDSENPTVBBUkUgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUyB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX0lURVIgfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9DTEFTUyB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1NUQUNLTEVTU19FWFRFTlNJT04gfCBcCisgICAgICAgICAgICAgICAgIFB5X1RQRkxBR1NfSEFWRV9JTkRFWCB8IFwKKyAgICAgICAgICAgICAgICAgMCkKKyNkZWZpbmUgUHlfVFBGTEFHU19ERUZBVUxUX0NPUkUgKFB5X1RQRkxBR1NfREVGQVVMVF9FWFRFUk5BTCB8IFwKKyAgICAgICAgICAgICAgICAgUHlfVFBGTEFHU19IQVZFX1ZFUlNJT05fVEFHKQorCisjaWZkZWYgUHlfQlVJTERfQ09SRQorI2RlZmluZSBQeV9UUEZMQUdTX0RFRkFVTFQgUHlfVFBGTEFHU19ERUZBVUxUX0NPUkUKKyNlbHNlCisjZGVmaW5lIFB5X1RQRkxBR1NfREVGQVVMVCBQeV9UUEZMQUdTX0RFRkFVTFRfRVhURVJOQUwKKyNlbmRpZgorCisjZGVmaW5lIFB5VHlwZV9IYXNGZWF0dXJlKHQsZikgICgoKHQpLT50cF9mbGFncyAmIChmKSkgIT0gMCkKKyNkZWZpbmUgUHlUeXBlX0Zhc3RTdWJjbGFzcyh0LGYpICBQeVR5cGVfSGFzRmVhdHVyZSh0LGYpCisKKworLyoKK1RoZSBtYWNyb3MgUHlfSU5DUkVGKG9wKSBhbmQgUHlfREVDUkVGKG9wKSBhcmUgdXNlZCB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50CityZWZlcmVuY2UgY291bnRzLiAgUHlfREVDUkVGIGNhbGxzIHRoZSBvYmplY3QncyBkZWFsbG9jYXRvciBmdW5jdGlvbiB3aGVuCit0aGUgcmVmY291bnQgZmFsbHMgdG8gMDsgZm9yCitvYmplY3RzIHRoYXQgZG9uJ3QgY29udGFpbiByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMgb3IgaGVhcCBtZW1vcnkKK3RoaXMgY2FuIGJlIHRoZSBzdGFuZGFyZCBmdW5jdGlvbiBmcmVlKCkuICBCb3RoIG1hY3JvcyBjYW4gYmUgdXNlZAord2hlcmV2ZXIgYSB2b2lkIGV4cHJlc3Npb24gaXMgYWxsb3dlZC4gIFRoZSBhcmd1bWVudCBtdXN0IG5vdCBiZSBhCitOVUxMIHBvaW50ZXIuICBJZiBpdCBtYXkgYmUgTlVMTCwgdXNlIFB5X1hJTkNSRUYvUHlfWERFQ1JFRiBpbnN0ZWFkLgorVGhlIG1hY3JvIF9QeV9OZXdSZWZlcmVuY2Uob3ApIGluaXRpYWxpemUgcmVmZXJlbmNlIGNvdW50cyB0byAxLCBhbmQKK2luIHNwZWNpYWwgYnVpbGRzIChQeV9SRUZfREVCVUcsIFB5X1RSQUNFX1JFRlMpIHBlcmZvcm1zIGFkZGl0aW9uYWwKK2Jvb2trZWVwaW5nIGFwcHJvcHJpYXRlIHRvIHRoZSBzcGVjaWFsIGJ1aWxkLgorCitXZSBhc3N1bWUgdGhhdCB0aGUgcmVmZXJlbmNlIGNvdW50IGZpZWxkIGNhbiBuZXZlciBvdmVyZmxvdzsgdGhpcyBjYW4KK2JlIHByb3ZlbiB3aGVuIHRoZSBzaXplIG9mIHRoZSBmaWVsZCBpcyB0aGUgc2FtZSBhcyB0aGUgcG9pbnRlciBzaXplLCBzbword2UgaWdub3JlIHRoZSBwb3NzaWJpbGl0eS4gIFByb3ZpZGVkIGEgQyBpbnQgaXMgYXQgbGVhc3QgMzIgYml0cyAod2hpY2gKK2lzIGltcGxpY2l0bHkgYXNzdW1lZCBpbiBtYW55IHBhcnRzIG9mIHRoaXMgY29kZSksIHRoYXQncyBlbm91Z2ggZm9yCithYm91dCAyKiozMSByZWZlcmVuY2VzIHRvIGFuIG9iamVjdC4KKworWFhYIFRoZSBmb2xsb3dpbmcgYmVjYW1lIG91dCBvZiBkYXRlIGluIFB5dGhvbiAyLjIsIGJ1dCBJJ20gbm90IHN1cmUKK1hYWCB3aGF0IHRoZSBmdWxsIHRydXRoIGlzIG5vdy4gIENlcnRhaW5seSwgaGVhcC1hbGxvY2F0ZWQgdHlwZSBvYmplY3RzCitYWFggY2FuIGFuZCBzaG91bGQgYmUgZGVhbGxvY2F0ZWQuCitUeXBlIG9iamVjdHMgc2hvdWxkIG5ldmVyIGJlIGRlYWxsb2NhdGVkOyB0aGUgdHlwZSBwb2ludGVyIGluIGFuIG9iamVjdAoraXMgbm90IGNvbnNpZGVyZWQgdG8gYmUgYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgb2JqZWN0LCB0byBzYXZlCitjb21wbGljYXRpb25zIGluIHRoZSBkZWFsbG9jYXRpb24gZnVuY3Rpb24uICAoVGhpcyBpcyBhY3R1YWxseSBhCitkZWNpc2lvbiB0aGF0J3MgdXAgdG8gdGhlIGltcGxlbWVudGVyIG9mIGVhY2ggbmV3IHR5cGUgc28gaWYgeW91IHdhbnQsCit5b3UgY2FuIGNvdW50IHN1Y2ggcmVmZXJlbmNlcyB0byB0aGUgdHlwZSBvYmplY3QuKQorCisqKiogV0FSTklORyoqKiBUaGUgUHlfREVDUkVGIG1hY3JvIG11c3QgaGF2ZSBhIHNpZGUtZWZmZWN0LWZyZWUgYXJndW1lbnQKK3NpbmNlIGl0IG1heSBldmFsdWF0ZSBpdHMgYXJndW1lbnQgbXVsdGlwbGUgdGltZXMuICAoVGhlIGFsdGVybmF0aXZlCit3b3VsZCBiZSB0byBtYWNlIGl0IGEgcHJvcGVyIGZ1bmN0aW9uIG9yIGFzc2lnbiBpdCB0byBhIGdsb2JhbCB0ZW1wb3JhcnkKK3ZhcmlhYmxlIGZpcnN0LCBib3RoIG9mIHdoaWNoIGFyZSBzbG93ZXI7IGFuZCBpbiBhIG11bHRpLXRocmVhZGVkCitlbnZpcm9ubWVudCB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRyaWNrIGlzIG5vdCBzYWZlLikKKyovCisKKy8qIEZpcnN0IGRlZmluZSBhIHBpbGUgb2Ygc2ltcGxlIGhlbHBlciBtYWNyb3MsIG9uZSBzZXQgcGVyIHNwZWNpYWwKKyAqIGJ1aWxkIHN5bWJvbC4gIFRoZXNlIGVpdGhlciBleHBhbmQgdG8gdGhlIG9idmlvdXMgdGhpbmdzLCBvciB0bworICogbm90aGluZyBhdCBhbGwgd2hlbiB0aGUgc3BlY2lhbCBtb2RlIGlzbid0IGluIGVmZmVjdC4gIFRoZSBtYWluCisgKiBtYWNyb3MgY2FuIGxhdGVyIGJlIGRlZmluZWQganVzdCBvbmNlIHRoZW4sIHlldCBleHBhbmQgdG8gZGlmZmVyZW50CisgKiB0aGluZ3MgZGVwZW5kaW5nIG9uIHdoaWNoIHNwZWNpYWwgYnVpbGQgb3B0aW9ucyBhcmUgYW5kIGFyZW4ndCBpbiBlZmZlY3QuCisgKiBUcnVzdCBtZSA8d2luaz46ICB3aGlsZSBwYWluZnVsLCB0aGlzIGlzIDIweCBlYXNpZXIgdG8gdW5kZXJzdGFuZCB0aGFuLAorICogZS5nLCBkZWZpbmluZyBfUHlfTmV3UmVmZXJlbmNlIGZpdmUgZGlmZmVyZW50IHRpbWVzIGluIGEgbWF6ZSBvZiBuZXN0ZWQKKyAqICNpZmRlZnMgKHdlIHVzZWQgdG8gZG8gdGhhdCAtLSBpdCB3YXMgaW1wZW5ldHJhYmxlKS4KKyAqLworI2lmZGVmIFB5X1JFRl9ERUJVRworUHlBUElfREFUQShQeV9zc2l6ZV90KSBfUHlfUmVmVG90YWw7CitQeUFQSV9GVU5DKHZvaWQpIF9QeV9OZWdhdGl2ZVJlZmNvdW50KGNvbnN0IGNoYXIgKmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZW5vLCBQeU9iamVjdCAqb3ApOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlEaWN0X0R1bW15KHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlTZXRfRHVtbXkodm9pZCk7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIF9QeV9HZXRSZWZUb3RhbCh2b2lkKTsKKyNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsKysKKyNkZWZpbmUgX1B5X0RFQ19SRUZUT1RBTCAgICAgICAgX1B5X1JlZlRvdGFsLS0KKyNkZWZpbmUgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgLAorI2RlZmluZSBfUHlfQ0hFQ0tfUkVGQ05UKE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgaWYgKCgoUHlPYmplY3QqKU9QKS0+b2JfcmVmY250IDwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfUHlfTmVnYXRpdmVSZWZjb3VudChfX0ZJTEVfXywgX19MSU5FX18sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFB5T2JqZWN0ICopKE9QKSk7ICAgICAgICAgXAorfQorI2Vsc2UKKyNkZWZpbmUgX1B5X0lOQ19SRUZUT1RBTAorI2RlZmluZSBfUHlfREVDX1JFRlRPVEFMCisjZGVmaW5lIF9QeV9SRUZfREVCVUdfQ09NTUEKKyNkZWZpbmUgX1B5X0NIRUNLX1JFRkNOVChPUCkgICAgLyogYSBzZW1pY29sb24gKi87CisjZW5kaWYgLyogUHlfUkVGX0RFQlVHICovCisKKyNpZmRlZiBDT1VOVF9BTExPQ1MKK1B5QVBJX0ZVTkModm9pZCkgaW5jX2NvdW50KFB5VHlwZU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgZGVjX2NvdW50KFB5VHlwZU9iamVjdCAqKTsKKyNkZWZpbmUgX1B5X0lOQ19UUEFMTE9DUyhPUCkgICAgaW5jX2NvdW50KFB5X1RZUEUoT1ApKQorI2RlZmluZSBfUHlfSU5DX1RQRlJFRVMoT1ApICAgICBkZWNfY291bnQoUHlfVFlQRShPUCkpCisjZGVmaW5lIF9QeV9ERUNfVFBGUkVFUyhPUCkgICAgIFB5X1RZUEUoT1ApLT50cF9mcmVlcy0tCisjZGVmaW5lIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICwKKyNlbHNlCisjZGVmaW5lIF9QeV9JTkNfVFBBTExPQ1MoT1ApCisjZGVmaW5lIF9QeV9JTkNfVFBGUkVFUyhPUCkKKyNkZWZpbmUgX1B5X0RFQ19UUEZSRUVTKE9QKQorI2RlZmluZSBfUHlfQ09VTlRfQUxMT0NTX0NPTU1BCisjZW5kaWYgLyogQ09VTlRfQUxMT0NTICovCisKKyNpZmRlZiBQeV9UUkFDRV9SRUZTCisvKiBQeV9UUkFDRV9SRUZTIGlzIHN1Y2ggbWFqb3Igc3VyZ2VyeSB0aGF0IHdlIGNhbGwgZXh0ZXJuYWwgcm91dGluZXMuICovCitQeUFQSV9GVU5DKHZvaWQpIF9QeV9OZXdSZWZlcmVuY2UoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIF9QeV9Gb3JnZXRSZWZlcmVuY2UoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIF9QeV9EZWFsbG9jKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlfUHJpbnRSZWZlcmVuY2VzKEZJTEUgKik7CitQeUFQSV9GVU5DKHZvaWQpIF9QeV9QcmludFJlZmVyZW5jZUFkZHJlc3NlcyhGSUxFICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlfQWRkVG9BbGxPYmplY3RzKFB5T2JqZWN0ICosIGludCBmb3JjZSk7CisKKyNlbHNlCisvKiBXaXRob3V0IFB5X1RSQUNFX1JFRlMsIHRoZXJlJ3MgbGl0dGxlIGVub3VnaCB0byBkbyB0aGF0IHdlIGV4cGFuZCBjb2RlCisgKiBpbmxpbmUuCisgKi8KKyNkZWZpbmUgX1B5X05ld1JlZmVyZW5jZShvcCkgKCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9QeV9JTkNfVFBBTExPQ1Mob3ApIF9QeV9DT1VOVF9BTExPQ1NfQ09NTUEgICAgICAgICBcCisgICAgX1B5X0lOQ19SRUZUT1RBTCAgX1B5X1JFRl9ERUJVR19DT01NQSAgICAgICAgICAgICAgIFwKKyAgICBQeV9SRUZDTlQob3ApID0gMSkKKworI2RlZmluZSBfUHlfRm9yZ2V0UmVmZXJlbmNlKG9wKSBfUHlfSU5DX1RQRlJFRVMob3ApCisKKyNkZWZpbmUgX1B5X0RlYWxsb2Mob3ApICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9QeV9JTkNfVFBGUkVFUyhvcCkgX1B5X0NPVU5UX0FMTE9DU19DT01NQSAgICAgICAgICBcCisgICAgKCpQeV9UWVBFKG9wKS0+dHBfZGVhbGxvYykoKFB5T2JqZWN0ICopKG9wKSkpCisjZW5kaWYgLyogIVB5X1RSQUNFX1JFRlMgKi8KKworI2RlZmluZSBQeV9JTkNSRUYob3ApICggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9QeV9JTkNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEgICAgICAgXAorICAgICgoUHlPYmplY3QqKShvcCkpLT5vYl9yZWZjbnQrKykKKworI2RlZmluZSBQeV9ERUNSRUYob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9QeV9ERUNfUkVGVE9UQUwgIF9QeV9SRUZfREVCVUdfQ09NTUEgICAgICAgXAorICAgICAgICAtLSgoUHlPYmplY3QqKShvcCkpLT5vYl9yZWZjbnQgIT0gMCkgICAgICAgICAgICBcCisgICAgICAgICAgICBfUHlfQ0hFQ0tfUkVGQ05UKG9wKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfUHlfRGVhbGxvYygoUHlPYmplY3QgKikob3ApKTsgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyogU2FmZWx5IGRlY3JlZiBgb3BgIGFuZCBzZXQgYG9wYCB0byBOVUxMLCBlc3BlY2lhbGx5IHVzZWZ1bCBpbiB0cF9jbGVhcgorICogYW5kIHRwX2RlYWxsb2MgaW1wbGVtZW50YXRvbnMuCisgKgorICogTm90ZSB0aGF0ICJ0aGUgb2J2aW91cyIgY29kZSBjYW4gYmUgZGVhZGx5OgorICoKKyAqICAgICBQeV9YREVDUkVGKG9wKTsKKyAqICAgICBvcCA9IE5VTEw7CisgKgorICogVHlwaWNhbGx5LCBgb3BgIGlzIHNvbWV0aGluZyBsaWtlIHNlbGYtPmNvbnRhaW5lZSwgYW5kIGBzZWxmYCBpcyBkb25lCisgKiB1c2luZyBpdHMgYGNvbnRhaW5lZWAgbWVtYmVyLiAgSW4gdGhlIGNvZGUgc2VxdWVuY2UgYWJvdmUsIHN1cHBvc2UKKyAqIGBjb250YWluZWVgIGlzIG5vbi1OVUxMIHdpdGggYSByZWZjb3VudCBvZiAxLiAgSXRzIHJlZmNvdW50IGZhbGxzIHRvCisgKiAwIG9uIHRoZSBmaXJzdCBsaW5lLCB3aGljaCBjYW4gdHJpZ2dlciBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIGNvZGUsCisgKiBwb3NzaWJseSBpbmNsdWRpbmcgZmluYWxpemVycyAobGlrZSBfX2RlbF9fIG1ldGhvZHMgb3Igd2Vha3JlZiBjYWxsYmFja3MpCisgKiBjb2RlZCBpbiBQeXRob24sIHdoaWNoIGluIHR1cm4gY2FuIHJlbGVhc2UgdGhlIEdJTCBhbmQgYWxsb3cgb3RoZXIgdGhyZWFkcworICogdG8gcnVuLCBldGMuICBTdWNoIGNvZGUgbWF5IGV2ZW4gaW52b2tlIG1ldGhvZHMgb2YgYHNlbGZgIGFnYWluLCBvciBjYXVzZQorICogY3ljbGljIGdjIHRvIHRyaWdnZXIsIGJ1dC0tIG9vcHMhIC0tc2VsZi0+Y29udGFpbmVlIHN0aWxsIHBvaW50cyB0byB0aGUKKyAqIG9iamVjdCBiZWluZyB0b3JuIGRvd24sIGFuZCBpdCBtYXkgYmUgaW4gYW4gaW5zYW5lIHN0YXRlIHdoaWxlIGJlaW5nIHRvcm4KKyAqIGRvd24uICBUaGlzIGhhcyBpbiBmYWN0IGJlZW4gYSByaWNoIGhpc3RvcmljIHNvdXJjZSBvZiBtaXNlcmFibGUgKHJhcmUgJgorICogaGFyZC10by1kaWFnbm9zZSkgc2VnZmF1bHRpbmcgKGFuZCBvdGhlcikgYnVncy4KKyAqCisgKiBUaGUgc2FmZSB3YXkgaXM6CisgKgorICogICAgICBQeV9DTEVBUihvcCk7CisgKgorICogVGhhdCBhcnJhbmdlcyB0byBzZXQgYG9wYCB0byBOVUxMIF9iZWZvcmVfIGRlY3JlZidpbmcsIHNvIHRoYXQgYW55IGNvZGUKKyAqIHRyaWdnZXJlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIGBvcGAgZ2V0dGluZyB0b3JuIGRvd24gbm8gbG9uZ2VyIGJlbGlldmVzCisgKiBgb3BgIHBvaW50cyB0byBhIHZhbGlkIG9iamVjdC4KKyAqCisgKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgaXQncyBzYWZlIHRvIHVzZSB0aGUgbmFpdmUgY29kZSwgYnV0IHRoZXkncmUgYnJpdHRsZS4KKyAqIEZvciBleGFtcGxlLCBpZiBgb3BgIHBvaW50cyB0byBhIFB5dGhvbiBpbnRlZ2VyLCB5b3Uga25vdyB0aGF0IGRlc3Ryb3lpbmcKKyAqIG9uZSBvZiB0aG9zZSBjYW4ndCBjYXVzZSBwcm9ibGVtcyAtLSBidXQgaW4gcGFydCB0aGF0IHJlbGllcyBvbiB0aGF0CisgKiBQeXRob24gaW50ZWdlcnMgYXJlbid0IGN1cnJlbnRseSB3ZWFrbHkgcmVmZXJlbmNhYmxlLiAgQmVzdCBwcmFjdGljZSBpcworICogdG8gdXNlIFB5X0NMRUFSKCkgZXZlbiBpZiB5b3UgY2FuJ3QgdGhpbmsgb2YgYSByZWFzb24gZm9yIHdoeSB5b3UgbmVlZCB0by4KKyAqLworI2RlZmluZSBQeV9DTEVBUihvcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgUHlPYmplY3QgKl9weV90bXAgPSAoUHlPYmplY3QgKikob3ApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChvcCkgPSBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFB5X0RFQ1JFRihfcHlfdG1wKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBNYWNyb3MgdG8gdXNlIGluIGNhc2UgdGhlIG9iamVjdCBwb2ludGVyIG1heSBiZSBOVUxMOiAqLworI2RlZmluZSBQeV9YSU5DUkVGKG9wKSBkbyB7IGlmICgob3ApID09IE5VTEwpIDsgZWxzZSBQeV9JTkNSRUYob3ApOyB9IHdoaWxlICgwKQorI2RlZmluZSBQeV9YREVDUkVGKG9wKSBkbyB7IGlmICgob3ApID09IE5VTEwpIDsgZWxzZSBQeV9ERUNSRUYob3ApOyB9IHdoaWxlICgwKQorCisvKgorVGhlc2UgYXJlIHByb3ZpZGVkIGFzIGNvbnZlbmllbmNlcyB0byBQeXRob24gcnVudGltZSBlbWJlZGRlcnMsIHNvIHRoYXQKK3RoZXkgY2FuIGhhdmUgb2JqZWN0IGNvZGUgdGhhdCBpcyBub3QgZGVwZW5kZW50IG9uIFB5dGhvbiBjb21waWxhdGlvbiBmbGFncy4KKyovCitQeUFQSV9GVU5DKHZvaWQpIFB5X0luY1JlZihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlfRGVjUmVmKFB5T2JqZWN0ICopOworCisvKgorX1B5X05vbmVTdHJ1Y3QgaXMgYW4gb2JqZWN0IG9mIHVuZGVmaW5lZCB0eXBlIHdoaWNoIGNhbiBiZSB1c2VkIGluIGNvbnRleHRzCit3aGVyZSBOVUxMIChuaWwpIGlzIG5vdCBzdWl0YWJsZSAoc2luY2UgTlVMTCBvZnRlbiBtZWFucyAnZXJyb3InKS4KKworRG9uJ3QgZm9yZ2V0IHRvIGFwcGx5IFB5X0lOQ1JFRigpIHdoZW4gcmV0dXJuaW5nIHRoaXMgdmFsdWUhISEKKyovCitQeUFQSV9EQVRBKFB5T2JqZWN0KSBfUHlfTm9uZVN0cnVjdDsgLyogRG9uJ3QgdXNlIHRoaXMgZGlyZWN0bHkgKi8KKyNkZWZpbmUgUHlfTm9uZSAoJl9QeV9Ob25lU3RydWN0KQorCisvKiBNYWNybyBmb3IgcmV0dXJuaW5nIFB5X05vbmUgZnJvbSBhIGZ1bmN0aW9uICovCisjZGVmaW5lIFB5X1JFVFVSTl9OT05FIHJldHVybiBQeV9JTkNSRUYoUHlfTm9uZSksIFB5X05vbmUKKworLyoKK1B5X05vdEltcGxlbWVudGVkIGlzIGEgc2luZ2xldG9uIHVzZWQgdG8gc2lnbmFsIHRoYXQgYW4gb3BlcmF0aW9uIGlzCitub3QgaW1wbGVtZW50ZWQgZm9yIGEgZ2l2ZW4gdHlwZSBjb21iaW5hdGlvbi4KKyovCitQeUFQSV9EQVRBKFB5T2JqZWN0KSBfUHlfTm90SW1wbGVtZW50ZWRTdHJ1Y3Q7IC8qIERvbid0IHVzZSB0aGlzIGRpcmVjdGx5ICovCisjZGVmaW5lIFB5X05vdEltcGxlbWVudGVkICgmX1B5X05vdEltcGxlbWVudGVkU3RydWN0KQorCisvKiBSaWNoIGNvbXBhcmlzb24gb3Bjb2RlcyAqLworI2RlZmluZSBQeV9MVCAwCisjZGVmaW5lIFB5X0xFIDEKKyNkZWZpbmUgUHlfRVEgMgorI2RlZmluZSBQeV9ORSAzCisjZGVmaW5lIFB5X0dUIDQKKyNkZWZpbmUgUHlfR0UgNQorCisvKiBNYXBzIFB5X0xUIHRvIFB5X0dULCAuLi4sIFB5X0dFIHRvIFB5X0xFLgorICogRGVmaW5lZCBpbiBvYmplY3QuYy4KKyAqLworUHlBUElfREFUQShpbnQpIF9QeV9Td2FwcGVkT3BbXTsKKworLyoKK0RlZmluZSBzdGF0aWNmb3J3YXJkIGFuZCBzdGF0aWNoZXJlIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIG9sZAorQyBleHRlbnNpb25zLgorCitUaGUgc3RhdGljZm9yd2FyZCBkZWZpbmUgd2FzIG5lZWRlZCB0byBzdXBwb3J0IGNlcnRhaW4gYnJva2VuIEMKK2NvbXBpbGVycyAobm90YWJseSBTQ08gT0RUIDMuMCwgcGVyaGFwcyBlYXJseSBBSVggYXMgd2VsbCkgYm90Y2hlZCB0aGUKK3N0YXRpYyBrZXl3b3JkIHdoZW4gaXQgd2FzIHVzZWQgd2l0aCBhIGZvcndhcmQgZGVjbGFyYXRpb24gb2YgYSBzdGF0aWMKK2luaXRpYWxpemVkIHN0cnVjdHVyZS4gIFN0YW5kYXJkIEMgYWxsb3dzIHRoZSBmb3J3YXJkIGRlY2xhcmF0aW9uIHdpdGgKK3N0YXRpYywgYW5kIHdlJ3ZlIGRlY2lkZWQgdG8gc3RvcCBjYXRlcmluZyB0byBicm9rZW4gQyBjb21waWxlcnMuCisoSW4gZmFjdCwgd2UgZXhwZWN0IHRoYXQgdGhlIGNvbXBpbGVycyBhcmUgYWxsIGZpeGVkIGVpZ2h0IHllYXJzIGxhdGVyLikKKyovCisKKyNkZWZpbmUgc3RhdGljZm9yd2FyZCBzdGF0aWMKKyNkZWZpbmUgc3RhdGljaGVyZSBzdGF0aWMKKworCisvKgorTW9yZSBjb252ZW50aW9ucworPT09PT09PT09PT09PT09PQorCitBcmd1bWVudCBDaGVja2luZworLS0tLS0tLS0tLS0tLS0tLS0KKworRnVuY3Rpb25zIHRoYXQgdGFrZSBvYmplY3RzIGFzIGFyZ3VtZW50cyBub3JtYWxseSBkb24ndCBjaGVjayBmb3IgbmlsCithcmd1bWVudHMsIGJ1dCB0aGV5IGRvIGNoZWNrIHRoZSB0eXBlIG9mIHRoZSBhcmd1bWVudCwgYW5kIHJldHVybiBhbgorZXJyb3IgaWYgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIHR5cGUuCisKK0ZhaWx1cmUgTW9kZXMKKy0tLS0tLS0tLS0tLS0KKworRnVuY3Rpb25zIG1heSBmYWlsIGZvciBhIHZhcmlldHkgb2YgcmVhc29ucywgaW5jbHVkaW5nIHJ1bm5pbmcgb3V0IG9mCittZW1vcnkuICBUaGlzIGlzIGNvbW11bmljYXRlZCB0byB0aGUgY2FsbGVyIGluIHR3byB3YXlzOiBhbiBlcnJvciBzdHJpbmcKK2lzIHNldCAoc2VlIGVycm9ycy5oKSwgYW5kIHRoZSBmdW5jdGlvbiByZXN1bHQgZGlmZmVyczogZnVuY3Rpb25zIHRoYXQKK25vcm1hbGx5IHJldHVybiBhIHBvaW50ZXIgcmV0dXJuIE5VTEwgZm9yIGZhaWx1cmUsIGZ1bmN0aW9ucyByZXR1cm5pbmcKK2FuIGludGVnZXIgcmV0dXJuIC0xICh3aGljaCBjb3VsZCBiZSBhIGxlZ2FsIHJldHVybiB2YWx1ZSB0b28hKSwgYW5kCitvdGhlciBmdW5jdGlvbnMgcmV0dXJuIDAgZm9yIHN1Y2Nlc3MgYW5kIC0xIGZvciBmYWlsdXJlLgorQ2FsbGVycyBzaG91bGQgYWx3YXlzIGNoZWNrIGZvciBlcnJvcnMgYmVmb3JlIHVzaW5nIHRoZSByZXN1bHQuICBJZgorYW4gZXJyb3Igd2FzIHNldCwgdGhlIGNhbGxlciBtdXN0IGVpdGhlciBleHBsaWNpdGx5IGNsZWFyIGl0LCBvciBwYXNzCit0aGUgZXJyb3Igb24gdG8gaXRzIGNhbGxlci4KKworUmVmZXJlbmNlIENvdW50cworLS0tLS0tLS0tLS0tLS0tLQorCitJdCB0YWtlcyBhIHdoaWxlIHRvIGdldCB1c2VkIHRvIHRoZSBwcm9wZXIgdXNhZ2Ugb2YgcmVmZXJlbmNlIGNvdW50cy4KKworRnVuY3Rpb25zIHRoYXQgY3JlYXRlIGFuIG9iamVjdCBzZXQgdGhlIHJlZmVyZW5jZSBjb3VudCB0byAxOyBzdWNoIG5ldworb2JqZWN0cyBtdXN0IGJlIHN0b3JlZCBzb21ld2hlcmUgb3IgZGVzdHJveWVkIGFnYWluIHdpdGggUHlfREVDUkVGKCkuCitTb21lIGZ1bmN0aW9ucyB0aGF0ICdzdG9yZScgb2JqZWN0cywgc3VjaCBhcyBQeVR1cGxlX1NldEl0ZW0oKSBhbmQKK1B5TGlzdF9TZXRJdGVtKCksCitkb24ndCBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgb2JqZWN0LCBzaW5jZSB0aGUgbW9zdAorZnJlcXVlbnQgdXNlIGlzIHRvIHN0b3JlIGEgZnJlc2ggb2JqZWN0LiAgRnVuY3Rpb25zIHRoYXQgJ3JldHJpZXZlJworb2JqZWN0cywgc3VjaCBhcyBQeVR1cGxlX0dldEl0ZW0oKSBhbmQgUHlEaWN0X0dldEl0ZW1TdHJpbmcoKSwgYWxzbworZG9uJ3QgaW5jcmVtZW50Cit0aGUgcmVmZXJlbmNlIGNvdW50LCBzaW5jZSBtb3N0IGZyZXF1ZW50bHkgdGhlIG9iamVjdCBpcyBvbmx5IGxvb2tlZCBhdAorcXVpY2tseS4gIFRodXMsIHRvIHJldHJpZXZlIGFuIG9iamVjdCBhbmQgc3RvcmUgaXQgYWdhaW4sIHRoZSBjYWxsZXIKK211c3QgY2FsbCBQeV9JTkNSRUYoKSBleHBsaWNpdGx5LgorCitOT1RFOiBmdW5jdGlvbnMgdGhhdCAnY29uc3VtZScgYSByZWZlcmVuY2UgY291bnQsIGxpa2UKK1B5TGlzdF9TZXRJdGVtKCksIGNvbnN1bWUgdGhlIHJlZmVyZW5jZSBldmVuIGlmIHRoZSBvYmplY3Qgd2Fzbid0CitzdWNjZXNzZnVsbHkgc3RvcmVkLCB0byBzaW1wbGlmeSBlcnJvciBoYW5kbGluZy4KKworSXQgc2VlbXMgYXR0cmFjdGl2ZSB0byBtYWtlIG90aGVyIGZ1bmN0aW9ucyB0aGF0IHRha2UgYW4gb2JqZWN0IGFzCithcmd1bWVudCBjb25zdW1lIGEgcmVmZXJlbmNlIGNvdW50OyBob3dldmVyLCB0aGlzIG1heSBxdWlja2x5IGdldAorY29uZnVzaW5nIChldmVuIHRoZSBjdXJyZW50IHByYWN0aWNlIGlzIGFscmVhZHkgY29uZnVzaW5nKS4gIENvbnNpZGVyCitpdCBjYXJlZnVsbHksIGl0IG1heSBzYXZlIGxvdHMgb2YgY2FsbHMgdG8gUHlfSU5DUkVGKCkgYW5kIFB5X0RFQ1JFRigpIGF0Cit0aW1lcy4KKyovCisKKworLyogVHJhc2hjYW4gbWVjaGFuaXNtLCB0aGFua3MgdG8gQ2hyaXN0aWFuIFRpc21lci4KKworV2hlbiBkZWFsbG9jYXRpbmcgYSBjb250YWluZXIgb2JqZWN0LCBpdCdzIHBvc3NpYmxlIHRvIHRyaWdnZXIgYW4gdW5ib3VuZGVkCitjaGFpbiBvZiBkZWFsbG9jYXRpb25zLCBhcyBlYWNoIFB5X0RFQ1JFRiBpbiB0dXJuIGRyb3BzIHRoZSByZWZjb3VudCBvbiAidGhlCituZXh0IiBvYmplY3QgaW4gdGhlIGNoYWluIHRvIDAuICBUaGlzIGNhbiBlYXNpbHkgbGVhZCB0byBzdGFjayBmYXVsdHMsIGFuZAorZXNwZWNpYWxseSBpbiB0aHJlYWRzICh3aGljaCB0eXBpY2FsbHkgaGF2ZSBsZXNzIHN0YWNrIHNwYWNlIHRvIHdvcmsgd2l0aCkuCisKK0EgY29udGFpbmVyIG9iamVjdCB0aGF0IHBhcnRpY2lwYXRlcyBpbiBjeWNsaWMgZ2MgY2FuIGF2b2lkIHRoaXMgYnkKK2JyYWNrZXRpbmcgdGhlIGJvZHkgb2YgaXRzIHRwX2RlYWxsb2MgZnVuY3Rpb24gd2l0aCBhIHBhaXIgb2YgbWFjcm9zOgorCitzdGF0aWMgdm9pZAorbXl0eXBlX2RlYWxsb2MobXl0eXBlICpwKQoreworICAgIC4uLiBkZWNsYXJhdGlvbnMgZ28gaGVyZSAuLi4KKworICAgIFB5T2JqZWN0X0dDX1VuVHJhY2socCk7ICAgICAgICAvLyBtdXN0IHVudHJhY2sgZmlyc3QKKyAgICBQeV9UUkFTSENBTl9TQUZFX0JFR0lOKHApCisgICAgLi4uIFRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciBnb2VzIGhlcmUsIGluY2x1ZGluZyBhbGwgY2FsbHMgLi4uCisgICAgLi4uIHRvIFB5X0RFQ1JFRiBvbiBjb250YWluZWQgb2JqZWN0cy4gICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgUHlfVFJBU0hDQU5fU0FGRV9FTkQocCkKK30KKworQ0FVVElPTjogIE5ldmVyIHJldHVybiBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIGJvZHkhICBJZiB0aGUgYm9keSBuZWVkcyB0bworImdldCBvdXQgZWFybHkiLCBwdXQgYSBsYWJlbCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIFB5X1RSQVNIQ0FOX1NBRkVfRU5ECitjYWxsLCBhbmQgZ290byBpdC4gIEVsc2UgdGhlIGNhbGwtZGVwdGggY291bnRlciAoc2VlIGJlbG93KSB3aWxsIHN0YXkKK2Fib3ZlIDAgZm9yZXZlciwgYW5kIHRoZSB0cmFzaGNhbiB3aWxsIG5ldmVyIGdldCBlbXB0aWVkLgorCitIb3cgaXQgd29ya3M6ICBUaGUgQkVHSU4gbWFjcm8gaW5jcmVtZW50cyBhIGNhbGwtZGVwdGggY291bnRlci4gIFNvIGxvbmcKK2FzIHRoaXMgY291bnRlciBpcyBzbWFsbCwgdGhlIGJvZHkgb2YgdGhlIGRlYWxsb2NhdG9yIGlzIHJ1biBkaXJlY3RseSB3aXRob3V0CitmdXJ0aGVyIGFkby4gIEJ1dCBpZiB0aGUgY291bnRlciBnZXRzIGxhcmdlLCBpdCBpbnN0ZWFkIGFkZHMgcCB0byBhIGxpc3Qgb2YKK29iamVjdHMgdG8gYmUgZGVhbGxvY2F0ZWQgbGF0ZXIsIHNraXBzIHRoZSBib2R5IG9mIHRoZSBkZWFsbG9jYXRvciwgYW5kCityZXN1bWVzIGV4ZWN1dGlvbiBhZnRlciB0aGUgRU5EIG1hY3JvLiAgVGhlIHRwX2RlYWxsb2Mgcm91dGluZSB0aGVuIHJldHVybnMKK3dpdGhvdXQgZGVhbGxvY2F0aW5nIGFueXRoaW5nIChhbmQgc28gdW5ib3VuZGVkIGNhbGwtc3RhY2sgZGVwdGggaXMgYXZvaWRlZCkuCisKK1doZW4gdGhlIGNhbGwgc3RhY2sgZmluaXNoZXMgdW53aW5kaW5nIGFnYWluLCBjb2RlIGdlbmVyYXRlZCBieSB0aGUgRU5EIG1hY3JvCitub3RpY2VzIHRoaXMsIGFuZCBjYWxscyBhbm90aGVyIHJvdXRpbmUgdG8gZGVhbGxvY2F0ZSBhbGwgdGhlIG9iamVjdHMgdGhhdAorbWF5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgbGlzdCBvZiBkZWZlcnJlZCBkZWFsbG9jYXRpb25zLiAgSW4gZWZmZWN0LCBhCitjaGFpbiBvZiBOIGRlYWxsb2NhdGlvbnMgaXMgYnJva2VuIGludG8gTiAvIFB5VHJhc2hfVU5XSU5EX0xFVkVMIHBpZWNlcywKK3dpdGggdGhlIGNhbGwgc3RhY2sgbmV2ZXIgZXhjZWVkaW5nIGEgZGVwdGggb2YgUHlUcmFzaF9VTldJTkRfTEVWRUwuCisqLworCisvKiBUaGlzIGlzIHRoZSBvbGQgcHJpdmF0ZSBBUEksIGludm9rZWQgYnkgdGhlIG1hY3JvcyBiZWZvcmUgMi43LjQuCisgICBLZXB0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLiAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlUcmFzaF9kZXBvc2l0X29iamVjdChQeU9iamVjdCopOworUHlBUElfRlVOQyh2b2lkKSBfUHlUcmFzaF9kZXN0cm95X2NoYWluKHZvaWQpOworUHlBUElfREFUQShpbnQpIF9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nOworUHlBUElfREFUQShQeU9iamVjdCAqKSBfUHlUcmFzaF9kZWxldGVfbGF0ZXI7CisKKy8qIFRoZSBuZXcgdGhyZWFkLXNhZmUgcHJpdmF0ZSBBUEksIGludm9rZWQgYnkgdGhlIG1hY3JvcyBiZWxvdy4gKi8KK1B5QVBJX0ZVTkModm9pZCkgX1B5VHJhc2hfdGhyZWFkX2RlcG9zaXRfb2JqZWN0KFB5T2JqZWN0Kik7CitQeUFQSV9GVU5DKHZvaWQpIF9QeVRyYXNoX3RocmVhZF9kZXN0cm95X2NoYWluKHZvaWQpOworCisjZGVmaW5lIFB5VHJhc2hfVU5XSU5EX0xFVkVMIDUwCisKKy8qIE5vdGUgdGhlIHdvcmthcm91bmQgZm9yIHdoZW4gdGhlIHRocmVhZCBzdGF0ZSBpcyBOVUxMIChpc3N1ZSAjMTc3MDMpICovCisjZGVmaW5lIFB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4ob3ApIFwKKyAgICBkbyB7IFwKKyAgICAgICAgUHlUaHJlYWRTdGF0ZSAqX3RzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7IFwKKyAgICAgICAgaWYgKCFfdHN0YXRlIHx8IFwKKyAgICAgICAgICAgIF90c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nIDwgUHlUcmFzaF9VTldJTkRfTEVWRUwpIHsgXAorICAgICAgICAgICAgaWYgKF90c3RhdGUpIFwKKyAgICAgICAgICAgICAgICArK190c3RhdGUtPnRyYXNoX2RlbGV0ZV9uZXN0aW5nOworICAgICAgICAgICAgLyogVGhlIGJvZHkgb2YgdGhlIGRlYWxsb2NhdG9yIGlzIGhlcmUuICovCisjZGVmaW5lIFB5X1RSQVNIQ0FOX1NBRkVfRU5EKG9wKSBcCisgICAgICAgICAgICBpZiAoX3RzdGF0ZSkgeyBcCisgICAgICAgICAgICAgICAgLS1fdHN0YXRlLT50cmFzaF9kZWxldGVfbmVzdGluZzsgXAorICAgICAgICAgICAgICAgIGlmIChfdHN0YXRlLT50cmFzaF9kZWxldGVfbGF0ZXIgXAorICAgICAgICAgICAgICAgICAgICAmJiBfdHN0YXRlLT50cmFzaF9kZWxldGVfbmVzdGluZyA8PSAwKSBcCisgICAgICAgICAgICAgICAgICAgIF9QeVRyYXNoX3RocmVhZF9kZXN0cm95X2NoYWluKCk7IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICB9IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBfUHlUcmFzaF90aHJlYWRfZGVwb3NpdF9vYmplY3QoKFB5T2JqZWN0KilvcCk7IFwKKyAgICB9IHdoaWxlICgwKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L29iamltcGwuaCBiL2luY2x1ZGUvcHl0aG9uMi43L29iamltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE5NjA3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvb2JqaW1wbC5oCkBAIC0wLDAgKzEsMzYwIEBACisvKiBUaGUgUHlPYmplY3RfIG1lbW9yeSBmYW1pbHk6ICBoaWdoLWxldmVsIG9iamVjdCBtZW1vcnkgaW50ZXJmYWNlcy4KKyAgIFNlZSBweW1lbS5oIGZvciB0aGUgbG93LWxldmVsIFB5TWVtXyBmYW1pbHkuCisqLworCisjaWZuZGVmIFB5X09CSklNUExfSAorI2RlZmluZSBQeV9PQkpJTVBMX0gKKworI2luY2x1ZGUgInB5bWVtLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogQkVXQVJFOgorCisgICBFYWNoIGludGVyZmFjZSBleHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCBtYWNyb3MuICBFeHRlbnNpb24gbW9kdWxlcyBzaG91bGQKKyAgIHVzZSB0aGUgZnVuY3Rpb25zLCB0byBlbnN1cmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgYWNyb3NzIFB5dGhvbiB2ZXJzaW9ucy4KKyAgIEJlY2F1c2UgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIGNoYW5nZSBpbnRlcm5hbCBkZXRhaWxzLCBhbmQKKyAgIHRoZSBtYWNyb3MgbWF5IChvciBtYXkgbm90KSBleHBvc2UgZGV0YWlscyBmb3Igc3BlZWQsIGlmIHlvdSBkbyB1c2UgdGhlCisgICBtYWNyb3MgeW91IG11c3QgcmVjb21waWxlIHlvdXIgZXh0ZW5zaW9ucyB3aXRoIGVhY2ggUHl0aG9uIHJlbGVhc2UuCisKKyAgIE5ldmVyIG1peCBjYWxscyB0byBQeU9iamVjdF8gbWVtb3J5IGZ1bmN0aW9ucyB3aXRoIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybQorICAgbWFsbG9jL3JlYWxsb2MvIGNhbGxvYy9mcmVlLCBvciB3aXRoIGNhbGxzIHRvIFB5TWVtXy4KKyovCisKKy8qCitGdW5jdGlvbnMgYW5kIG1hY3JvcyBmb3IgbW9kdWxlcyB0aGF0IGltcGxlbWVudCBuZXcgb2JqZWN0IHR5cGVzLgorCisgLSBQeU9iamVjdF9OZXcodHlwZSwgdHlwZW9iaikgYWxsb2NhdGVzIG1lbW9yeSBmb3IgYSBuZXcgb2JqZWN0IG9mIHRoZSBnaXZlbgorICAgdHlwZSwgYW5kIGluaXRpYWxpemVzIHBhcnQgb2YgaXQuICAndHlwZScgbXVzdCBiZSB0aGUgQyBzdHJ1Y3R1cmUgdHlwZSB1c2VkCisgICB0byByZXByZXNlbnQgdGhlIG9iamVjdCwgYW5kICd0eXBlb2JqJyB0aGUgYWRkcmVzcyBvZiB0aGUgY29ycmVzcG9uZGluZworICAgdHlwZSBvYmplY3QuICBSZWZlcmVuY2UgY291bnQgYW5kIHR5cGUgcG9pbnRlciBhcmUgZmlsbGVkIGluOyB0aGUgcmVzdCBvZgorICAgdGhlIGJ5dGVzIG9mIHRoZSBvYmplY3QgYXJlICp1bmRlZmluZWQqISAgVGhlIHJlc3VsdGluZyBleHByZXNzaW9uIHR5cGUgaXMKKyAgICd0eXBlIConLiAgVGhlIHNpemUgb2YgdGhlIG9iamVjdCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB0cF9iYXNpY3NpemUgZmllbGQKKyAgIG9mIHRoZSB0eXBlIG9iamVjdC4KKworIC0gUHlPYmplY3RfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIGlzIHNpbWlsYXIgYnV0IGFsbG9jYXRlcyBhIHZhcmlhYmxlLXNpemUKKyAgIG9iamVjdCB3aXRoIHJvb20gZm9yIG4gaXRlbXMuICBJbiBhZGRpdGlvbiB0byB0aGUgcmVmY291bnQgYW5kIHR5cGUgcG9pbnRlcgorICAgZmllbGRzLCB0aGlzIGFsc28gZmlsbHMgaW4gdGhlIG9iX3NpemUgZmllbGQuCisKKyAtIFB5T2JqZWN0X0RlbChvcCkgcmVsZWFzZXMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGFuIG9iamVjdC4gIEl0IGRvZXMgbm90CisgICBydW4gYSBkZXN0cnVjdG9yIC0tIGl0IG9ubHkgZnJlZXMgdGhlIG1lbW9yeS4gIFB5T2JqZWN0X0ZyZWUgaXMgaWRlbnRpY2FsLgorCisgLSBQeU9iamVjdF9Jbml0KG9wLCB0eXBlb2JqKSBhbmQgUHlPYmplY3RfSW5pdFZhcihvcCwgdHlwZW9iaiwgbikgZG9uJ3QKKyAgIGFsbG9jYXRlIG1lbW9yeS4gIEluc3RlYWQgb2YgYSAndHlwZScgcGFyYW1ldGVyLCB0aGV5IHRha2UgYSBwb2ludGVyIHRvIGEKKyAgIG5ldyBvYmplY3QgKGFsbG9jYXRlZCBieSBhbiBhcmJpdHJhcnkgYWxsb2NhdG9yKSwgYW5kIGluaXRpYWxpemUgaXRzIG9iamVjdAorICAgaGVhZGVyIGZpZWxkcy4KKworTm90ZSB0aGF0IG9iamVjdHMgY3JlYXRlZCB3aXRoIFB5T2JqZWN0X3tOZXcsIE5ld1Zhcn0gYXJlIGFsbG9jYXRlZCB1c2luZyB0aGUKK3NwZWNpYWxpemVkIFB5dGhvbiBhbGxvY2F0b3IgKGltcGxlbWVudGVkIGluIG9ibWFsbG9jLmMpLCBpZiBXSVRIX1BZTUFMTE9DIGlzCitlbmFibGVkLiAgSW4gYWRkaXRpb24sIGEgc3BlY2lhbCBkZWJ1Z2dpbmcgYWxsb2NhdG9yIGlzIHVzZWQgaWYgUFlNQUxMT0NfREVCVUcKK2lzIGFsc28gI2RlZmluZWQuCisKK0luIGNhc2UgYSBzcGVjaWZpYyBmb3JtIG9mIG1lbW9yeSBtYW5hZ2VtZW50IGlzIG5lZWRlZCAoZm9yIGV4YW1wbGUsIGlmIHlvdQorbXVzdCB1c2UgdGhlIHBsYXRmb3JtIG1hbGxvYyBoZWFwKHMpLCBvciBzaGFyZWQgbWVtb3J5LCBvciBDKysgbG9jYWwgc3RvcmFnZSBvcgorb3BlcmF0b3IgbmV3KSwgeW91IG11c3QgZmlyc3QgYWxsb2NhdGUgdGhlIG9iamVjdCB3aXRoIHlvdXIgY3VzdG9tIGFsbG9jYXRvciwKK3RoZW4gcGFzcyBpdHMgcG9pbnRlciB0byBQeU9iamVjdF97SW5pdCwgSW5pdFZhcn0gZm9yIGZpbGxpbmcgaW4gaXRzIFB5dGhvbi0KK3NwZWNpZmljIGZpZWxkczogIHJlZmVyZW5jZSBjb3VudCwgdHlwZSBwb2ludGVyLCBwb3NzaWJseSBvdGhlcnMuICBZb3Ugc2hvdWxkCitiZSBhd2FyZSB0aGF0IFB5dGhvbiBubyBjb250cm9sIG92ZXIgdGhlc2Ugb2JqZWN0cyBiZWNhdXNlIHRoZXkgZG9uJ3QKK2Nvb3BlcmF0ZSB3aXRoIHRoZSBQeXRob24gbWVtb3J5IG1hbmFnZXIuICBTdWNoIG9iamVjdHMgbWF5IG5vdCBiZSBlbGlnaWJsZQorZm9yIGF1dG9tYXRpYyBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIHlvdSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZXkgYXJlCityZWxlYXNlZCBhY2NvcmRpbmdseSB3aGVuZXZlciB0aGVpciBkZXN0cnVjdG9yIGdldHMgY2FsbGVkIChjZi4gdGhlIHNwZWNpZmljCitmb3JtIG9mIG1lbW9yeSBtYW5hZ2VtZW50IHlvdSdyZSB1c2luZykuCisKK1VubGVzcyB5b3UgaGF2ZSBzcGVjaWZpYyBtZW1vcnkgbWFuYWdlbWVudCByZXF1aXJlbWVudHMsIHVzZQorUHlPYmplY3Rfe05ldywgTmV3VmFyLCBEZWx9LgorKi8KKworLyoKKyAqIFJhdyBvYmplY3QgbWVtb3J5IGludGVyZmFjZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogRnVuY3Rpb25zIHRvIGNhbGwgdGhlIHNhbWUgbWFsbG9jL3JlYWxsb2MvZnJlZSBhcyB1c2VkIGJ5IFB5dGhvbidzCisgICBvYmplY3QgYWxsb2NhdG9yLiAgSWYgV0lUSF9QWU1BTExPQyBpcyBlbmFibGVkLCB0aGVzZSBtYXkgZGlmZmVyIGZyb20KKyAgIHRoZSBwbGF0Zm9ybSBtYWxsb2MvcmVhbGxvYy9mcmVlLiAgVGhlIFB5dGhvbiBvYmplY3QgYWxsb2NhdG9yIGlzCisgICBkZXNpZ25lZCBmb3IgZmFzdCwgY2FjaGUtY29uc2Npb3VzIGFsbG9jYXRpb24gb2YgbWFueSAic21hbGwiIG9iamVjdHMsCisgICBhbmQgd2l0aCBsb3cgaGlkZGVuIG1lbW9yeSBvdmVyaGVhZC4KKworICAgUHlPYmplY3RfTWFsbG9jKDApIHJldHVybnMgYSB1bmlxdWUgbm9uLU5VTEwgcG9pbnRlciBpZiBwb3NzaWJsZS4KKworICAgUHlPYmplY3RfUmVhbGxvYyhOVUxMLCBuKSBhY3RzIGxpa2UgUHlPYmplY3RfTWFsbG9jKG4pLgorICAgUHlPYmplY3RfUmVhbGxvYyhwICE9IE5VTEwsIDApIGRvZXMgbm90IHJldHVybiAgTlVMTCwgb3IgZnJlZSB0aGUgbWVtb3J5CisgICBhdCBwLgorCisgICBSZXR1cm5lZCBwb2ludGVycyBtdXN0IGJlIGNoZWNrZWQgZm9yIE5VTEwgZXhwbGljaXRseTsgbm8gYWN0aW9uIGlzCisgICBwZXJmb3JtZWQgb24gZmFpbHVyZSBvdGhlciB0aGFuIHRvIHJldHVybiBOVUxMIChubyB3YXJuaW5nIGl0IHByaW50ZWQsIG5vCisgICBleGNlcHRpb24gaXMgc2V0LCBldGMpLgorCisgICBGb3IgYWxsb2NhdGluZyBvYmplY3RzLCB1c2UgUHlPYmplY3Rfe05ldywgTmV3VmFyfSBpbnN0ZWFkIHdoZW5ldmVyCisgICBwb3NzaWJsZS4gIFRoZSBQeU9iamVjdF97TWFsbG9jLCBSZWFsbG9jLCBGcmVlfSBmYW1pbHkgaXMgZXhwb3NlZAorICAgc28gdGhhdCB5b3UgY2FuIGV4cGxvaXQgUHl0aG9uJ3Mgc21hbGwtYmxvY2sgYWxsb2NhdG9yIGZvciBub24tb2JqZWN0CisgICB1c2VzLiAgSWYgeW91IG11c3QgdXNlIHRoZXNlIHJvdXRpbmVzIHRvIGFsbG9jYXRlIG9iamVjdCBtZW1vcnksIG1ha2Ugc3VyZQorICAgdGhlIG9iamVjdCBnZXRzIGluaXRpYWxpemVkIHZpYSBQeU9iamVjdF97SW5pdCwgSW5pdFZhcn0gYWZ0ZXIgb2J0YWluaW5nCisgICB0aGUgcmF3IG1lbW9yeS4KKyovCitQeUFQSV9GVU5DKHZvaWQgKikgUHlPYmplY3RfTWFsbG9jKHNpemVfdCk7CitQeUFQSV9GVU5DKHZvaWQgKikgUHlPYmplY3RfUmVhbGxvYyh2b2lkICosIHNpemVfdCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5T2JqZWN0X0ZyZWUodm9pZCAqKTsKKworCisvKiBNYWNyb3MgKi8KKyNpZmRlZiBXSVRIX1BZTUFMTE9DCisjaWZkZWYgUFlNQUxMT0NfREVCVUcgICAvKiBXSVRIX1BZTUFMTE9DICYmIFBZTUFMTE9DX0RFQlVHICovCitQeUFQSV9GVU5DKHZvaWQgKikgX1B5T2JqZWN0X0RlYnVnTWFsbG9jKHNpemVfdCBuYnl0ZXMpOworUHlBUElfRlVOQyh2b2lkICopIF9QeU9iamVjdF9EZWJ1Z1JlYWxsb2Modm9pZCAqcCwgc2l6ZV90IG5ieXRlcyk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EZWJ1Z0ZyZWUodm9pZCAqcCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EZWJ1Z0R1bXBBZGRyZXNzKGNvbnN0IHZvaWQgKnApOworUHlBUElfRlVOQyh2b2lkKSBfUHlPYmplY3RfRGVidWdDaGVja0FkZHJlc3MoY29uc3Qgdm9pZCAqcCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EZWJ1Z01hbGxvY1N0YXRzKHZvaWQpOworUHlBUElfRlVOQyh2b2lkICopIF9QeU9iamVjdF9EZWJ1Z01hbGxvY0FwaShjaGFyIGFwaSwgc2l6ZV90IG5ieXRlcyk7CitQeUFQSV9GVU5DKHZvaWQgKikgX1B5T2JqZWN0X0RlYnVnUmVhbGxvY0FwaShjaGFyIGFwaSwgdm9pZCAqcCwgc2l6ZV90IG5ieXRlcyk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeU9iamVjdF9EZWJ1Z0ZyZWVBcGkoY2hhciBhcGksIHZvaWQgKnApOworUHlBUElfRlVOQyh2b2lkKSBfUHlPYmplY3RfRGVidWdDaGVja0FkZHJlc3NBcGkoY2hhciBhcGksIGNvbnN0IHZvaWQgKnApOworUHlBUElfRlVOQyh2b2lkICopIF9QeU1lbV9EZWJ1Z01hbGxvYyhzaXplX3QgbmJ5dGVzKTsKK1B5QVBJX0ZVTkModm9pZCAqKSBfUHlNZW1fRGVidWdSZWFsbG9jKHZvaWQgKnAsIHNpemVfdCBuYnl0ZXMpOworUHlBUElfRlVOQyh2b2lkKSBfUHlNZW1fRGVidWdGcmVlKHZvaWQgKnApOworI2RlZmluZSBQeU9iamVjdF9NQUxMT0MgICAgICAgICBfUHlPYmplY3RfRGVidWdNYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfTWFsbG9jICAgICAgICAgX1B5T2JqZWN0X0RlYnVnTWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X1JFQUxMT0MgICAgICAgIF9QeU9iamVjdF9EZWJ1Z1JlYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfUmVhbGxvYyAgICAgICAgX1B5T2JqZWN0X0RlYnVnUmVhbGxvYworI2RlZmluZSBQeU9iamVjdF9GUkVFICAgICAgICAgICBfUHlPYmplY3RfRGVidWdGcmVlCisjZGVmaW5lIFB5T2JqZWN0X0ZyZWUgICAgICAgICAgIF9QeU9iamVjdF9EZWJ1Z0ZyZWUKKworI2Vsc2UgICAvKiBXSVRIX1BZTUFMTE9DICYmICEgUFlNQUxMT0NfREVCVUcgKi8KKyNkZWZpbmUgUHlPYmplY3RfTUFMTE9DICAgICAgICAgUHlPYmplY3RfTWFsbG9jCisjZGVmaW5lIFB5T2JqZWN0X1JFQUxMT0MgICAgICAgIFB5T2JqZWN0X1JlYWxsb2MKKyNkZWZpbmUgUHlPYmplY3RfRlJFRSAgICAgICAgICAgUHlPYmplY3RfRnJlZQorI2VuZGlmCisKKyNlbHNlICAgLyogISBXSVRIX1BZTUFMTE9DICovCisjZGVmaW5lIFB5T2JqZWN0X01BTExPQyAgICAgICAgIFB5TWVtX01BTExPQworI2RlZmluZSBQeU9iamVjdF9SRUFMTE9DICAgICAgICBQeU1lbV9SRUFMTE9DCisjZGVmaW5lIFB5T2JqZWN0X0ZSRUUgICAgICAgICAgIFB5TWVtX0ZSRUUKKworI2VuZGlmICAvKiBXSVRIX1BZTUFMTE9DICovCisKKyNkZWZpbmUgUHlPYmplY3RfRGVsICAgICAgICAgICAgUHlPYmplY3RfRnJlZQorI2RlZmluZSBQeU9iamVjdF9ERUwgICAgICAgICAgICBQeU9iamVjdF9GUkVFCisKKy8qIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLworI2RlZmluZSBfUHlPYmplY3RfRGVsICAgICAgICAgICBQeU9iamVjdF9GcmVlCisKKy8qCisgKiBHZW5lcmljIG9iamVjdCBhbGxvY2F0b3IgaW50ZXJmYWNlCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogRnVuY3Rpb25zICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5T2JqZWN0X0luaXQoUHlPYmplY3QgKiwgUHlUeXBlT2JqZWN0ICopOworUHlBUElfRlVOQyhQeVZhck9iamVjdCAqKSBQeU9iamVjdF9Jbml0VmFyKFB5VmFyT2JqZWN0ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUeXBlT2JqZWN0ICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlPYmplY3RfTmV3KFB5VHlwZU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlWYXJPYmplY3QgKikgX1B5T2JqZWN0X05ld1ZhcihQeVR5cGVPYmplY3QgKiwgUHlfc3NpemVfdCk7CisKKyNkZWZpbmUgUHlPYmplY3RfTmV3KHR5cGUsIHR5cGVvYmopIFwKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9OZXcodHlwZW9iaikgKQorI2RlZmluZSBQeU9iamVjdF9OZXdWYXIodHlwZSwgdHlwZW9iaiwgbikgXAorICAgICAgICAgICAgICAgICggKHR5cGUgKikgX1B5T2JqZWN0X05ld1ZhcigodHlwZW9iaiksIChuKSkgKQorCisvKiBNYWNyb3MgdHJhZGluZyBiaW5hcnkgY29tcGF0aWJpbGl0eSBmb3Igc3BlZWQuIFNlZSBhbHNvIHB5bWVtLmguCisgICBOb3RlIHRoYXQgdGhlc2UgbWFjcm9zIGV4cGVjdCBub24tTlVMTCBvYmplY3QgcG9pbnRlcnMuKi8KKyNkZWZpbmUgUHlPYmplY3RfSU5JVChvcCwgdHlwZW9iaikgXAorICAgICggUHlfVFlQRShvcCkgPSAodHlwZW9iaiksIF9QeV9OZXdSZWZlcmVuY2UoKFB5T2JqZWN0ICopKG9wKSksIChvcCkgKQorI2RlZmluZSBQeU9iamVjdF9JTklUX1ZBUihvcCwgdHlwZW9iaiwgc2l6ZSkgXAorICAgICggUHlfU0laRShvcCkgPSAoc2l6ZSksIFB5T2JqZWN0X0lOSVQoKG9wKSwgKHR5cGVvYmopKSApCisKKyNkZWZpbmUgX1B5T2JqZWN0X1NJWkUodHlwZW9iaikgKCAodHlwZW9iaiktPnRwX2Jhc2ljc2l6ZSApCisKKy8qIF9QeU9iamVjdF9WQVJfU0laRSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgKGFzIHNpemVfdCkgYWxsb2NhdGVkIGZvciBhCisgICB2cmJsLXNpemUgb2JqZWN0IHdpdGggbml0ZW1zIGl0ZW1zLCBleGNsdXNpdmUgb2YgZ2Mgb3ZlcmhlYWQgKGlmIGFueSkuICBUaGUKKyAgIHZhbHVlIGlzIHJvdW5kZWQgdXAgdG8gdGhlIGNsb3Nlc3QgbXVsdGlwbGUgb2Ygc2l6ZW9mKHZvaWQgKiksIGluIG9yZGVyIHRvCisgICBlbnN1cmUgdGhhdCBwb2ludGVyIGZpZWxkcyBhdCB0aGUgZW5kIG9mIHRoZSBvYmplY3QgYXJlIGNvcnJlY3RseSBhbGlnbmVkCisgICBmb3IgdGhlIHBsYXRmb3JtICh0aGlzIGlzIG9mIHNwZWNpYWwgaW1wb3J0YW5jZSBmb3Igc3ViY2xhc3NlcyBvZiwgZS5nLiwKKyAgIHN0ciBvciBsb25nLCBzbyB0aGF0IHBvaW50ZXJzIGNhbiBiZSBzdG9yZWQgYWZ0ZXIgdGhlIGVtYmVkZGVkIGRhdGEpLgorCisgICBOb3RlIHRoYXQgdGhlcmUncyBubyBtZW1vcnkgd2FzdGFnZSBpbiBkb2luZyB0aGlzLCBhcyBtYWxsb2MgaGFzIHRvCisgICByZXR1cm4gKGF0IHdvcnN0KSBwb2ludGVyLWFsaWduZWQgbWVtb3J5IGFueXdheS4KKyovCisjaWYgKChTSVpFT0ZfVk9JRF9QIC0gMSkgJiBTSVpFT0ZfVk9JRF9QKSAhPSAwCisjICAgZXJyb3IgIl9QeU9iamVjdF9WQVJfU0laRSByZXF1aXJlcyBTSVpFT0ZfVk9JRF9QIGJlIGEgcG93ZXIgb2YgMiIKKyNlbmRpZgorCisjZGVmaW5lIF9QeU9iamVjdF9WQVJfU0laRSh0eXBlb2JqLCBuaXRlbXMpICAgICBcCisgICAgKHNpemVfdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAoICh0eXBlb2JqKS0+dHBfYmFzaWNzaXplICsgICAgICAgICAgICAgICBcCisgICAgICAgIChuaXRlbXMpKih0eXBlb2JqKS0+dHBfaXRlbXNpemUgKyAgICAgICBcCisgICAgICAgIChTSVpFT0ZfVk9JRF9QIC0gMSkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICApICYgfihTSVpFT0ZfVk9JRF9QIC0gMSkgICAgICAgICAgICAgICAgICBcCisgICAgKQorCisjZGVmaW5lIFB5T2JqZWN0X05FVyh0eXBlLCB0eXBlb2JqKSBcCisoICh0eXBlICopIFB5T2JqZWN0X0luaXQoIFwKKyAgICAoUHlPYmplY3QgKikgUHlPYmplY3RfTUFMTE9DKCBfUHlPYmplY3RfU0laRSh0eXBlb2JqKSApLCAodHlwZW9iaikpICkKKworI2RlZmluZSBQeU9iamVjdF9ORVdfVkFSKHR5cGUsIHR5cGVvYmosIG4pIFwKKyggKHR5cGUgKikgUHlPYmplY3RfSW5pdFZhciggXAorICAgICAgKFB5VmFyT2JqZWN0ICopIFB5T2JqZWN0X01BTExPQyhfUHlPYmplY3RfVkFSX1NJWkUoKHR5cGVvYmopLChuKSkgKSxcCisgICAgICAodHlwZW9iaiksIChuKSkgKQorCisvKiBUaGlzIGV4YW1wbGUgY29kZSBpbXBsZW1lbnRzIGFuIG9iamVjdCBjb25zdHJ1Y3RvciB3aXRoIGEgY3VzdG9tCisgICBhbGxvY2F0b3IsIHdoZXJlIFB5T2JqZWN0X05ldyBpcyBpbmxpbmVkLCBhbmQgc2hvd3MgdGhlIGltcG9ydGFudAorICAgZGlzdGluY3Rpb24gYmV0d2VlbiB0d28gc3RlcHMgKGF0IGxlYXN0KToKKyAgICAgICAxKSB0aGUgYWN0dWFsIGFsbG9jYXRpb24gb2YgdGhlIG9iamVjdCBzdG9yYWdlOworICAgICAgIDIpIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgUHl0aG9uIHNwZWNpZmljIGZpZWxkcworICAgICAgaW4gdGhpcyBzdG9yYWdlIHdpdGggUHlPYmplY3Rfe0luaXQsIEluaXRWYXJ9LgorCisgICBQeU9iamVjdCAqCisgICBZb3VyT2JqZWN0X05ldyguLi4pCisgICB7CisgICAgICAgUHlPYmplY3QgKm9wOworCisgICAgICAgb3AgPSAoUHlPYmplY3QgKikgWW91cl9BbGxvY2F0b3IoX1B5T2JqZWN0X1NJWkUoWW91clR5cGVTdHJ1Y3QpKTsKKyAgICAgICBpZiAob3AgPT0gTlVMTCkKKyAgICAgICByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKworICAgICAgIFB5T2JqZWN0X0luaXQob3AsICZZb3VyVHlwZVN0cnVjdCk7CisKKyAgICAgICBvcC0+b2JfZmllbGQgPSB2YWx1ZTsKKyAgICAgICAuLi4KKyAgICAgICByZXR1cm4gb3A7CisgICB9CisKKyAgIE5vdGUgdGhhdCBpbiBDKyssIHRoZSB1c2Ugb2YgdGhlIG5ldyBvcGVyYXRvciB1c3VhbGx5IGltcGxpZXMgdGhhdAorICAgdGhlIDFzdCBzdGVwIGlzIHBlcmZvcm1lZCBhdXRvbWF0aWNhbGx5IGZvciB5b3UsIHNvIGluIGEgQysrIGNsYXNzCisgICBjb25zdHJ1Y3RvciB5b3Ugd291bGQgc3RhcnQgZGlyZWN0bHkgd2l0aCBQeU9iamVjdF9Jbml0L0luaXRWYXIKKyovCisKKy8qCisgKiBHYXJiYWdlIENvbGxlY3Rpb24gU3VwcG9ydAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworCisvKiBDIGVxdWl2YWxlbnQgb2YgZ2MuY29sbGVjdCgpLiAqLworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeUdDX0NvbGxlY3Qodm9pZCk7CisKKy8qIFRlc3QgaWYgYSB0eXBlIGhhcyBhIEdDIGhlYWQgKi8KKyNkZWZpbmUgUHlUeXBlX0lTX0dDKHQpIFB5VHlwZV9IYXNGZWF0dXJlKCh0KSwgUHlfVFBGTEFHU19IQVZFX0dDKQorCisvKiBUZXN0IGlmIGFuIG9iamVjdCBoYXMgYSBHQyBoZWFkICovCisjZGVmaW5lIFB5T2JqZWN0X0lTX0dDKG8pIChQeVR5cGVfSVNfR0MoUHlfVFlQRShvKSkgJiYgXAorICAgIChQeV9UWVBFKG8pLT50cF9pc19nYyA9PSBOVUxMIHx8IFB5X1RZUEUobyktPnRwX2lzX2djKG8pKSkKKworUHlBUElfRlVOQyhQeVZhck9iamVjdCAqKSBfUHlPYmplY3RfR0NfUmVzaXplKFB5VmFyT2JqZWN0ICosIFB5X3NzaXplX3QpOworI2RlZmluZSBQeU9iamVjdF9HQ19SZXNpemUodHlwZSwgb3AsIG4pIFwKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9HQ19SZXNpemUoKFB5VmFyT2JqZWN0ICopKG9wKSwgKG4pKSApCisKKy8qIGZvciBzb3VyY2UgY29tcGF0aWJpbGl0eSB3aXRoIDIuMiAqLworI2RlZmluZSBfUHlPYmplY3RfR0NfRGVsIFB5T2JqZWN0X0dDX0RlbAorCisvKiBHQyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgQkVGT1JFIHRoZSBvYmplY3Qgc3RydWN0dXJlLiAqLwordHlwZWRlZiB1bmlvbiBfZ2NfaGVhZCB7CisgICAgc3RydWN0IHsKKyAgICAgICAgdW5pb24gX2djX2hlYWQgKmdjX25leHQ7CisgICAgICAgIHVuaW9uIF9nY19oZWFkICpnY19wcmV2OworICAgICAgICBQeV9zc2l6ZV90IGdjX3JlZnM7CisgICAgfSBnYzsKKyAgICBsb25nIGRvdWJsZSBkdW1teTsgIC8qIGZvcmNlIHdvcnN0LWNhc2UgYWxpZ25tZW50ICovCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykKKy8qIEZJWE1FOiB3aGF0IGFib3V0IDY0LWJpdCBwbGF0Zm9ybXMgPworICogc2VlIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwOS1KdWx5LzA5MDcyNC5odG1sCisgKi8KKwlkb3VibGUgZHVtbXkxOworI2VuZGlmCit9IFB5R0NfSGVhZDsKKworZXh0ZXJuIFB5R0NfSGVhZCAqX1B5R0NfZ2VuZXJhdGlvbjA7CisKKyNkZWZpbmUgX1B5X0FTX0dDKG8pICgoUHlHQ19IZWFkICopKG8pLTEpCisKKyNkZWZpbmUgX1B5R0NfUkVGU19VTlRSQUNLRUQgICAgICAgICAgICAgICAgICAgICgtMikKKyNkZWZpbmUgX1B5R0NfUkVGU19SRUFDSEFCTEUgICAgICAgICAgICAgICAgICAgICgtMykKKyNkZWZpbmUgX1B5R0NfUkVGU19URU5UQVRJVkVMWV9VTlJFQUNIQUJMRSAgICAgICgtNCkKKworLyogVGVsbCB0aGUgR0MgdG8gdHJhY2sgdGhpcyBvYmplY3QuICBOQjogV2hpbGUgdGhlIG9iamVjdCBpcyB0cmFja2VkIHRoZQorICogY29sbGVjdG9yIGl0IG11c3QgYmUgc2FmZSB0byBjYWxsIHRoZSBvYl90cmF2ZXJzZSBtZXRob2QuICovCisjZGVmaW5lIF9QeU9iamVjdF9HQ19UUkFDSyhvKSBkbyB7IFwKKyAgICBQeUdDX0hlYWQgKmcgPSBfUHlfQVNfR0Mobyk7IFwKKyAgICBpZiAoZy0+Z2MuZ2NfcmVmcyAhPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRCkgXAorICAgICAgICBQeV9GYXRhbEVycm9yKCJHQyBvYmplY3QgYWxyZWFkeSB0cmFja2VkIik7IFwKKyAgICBnLT5nYy5nY19yZWZzID0gX1B5R0NfUkVGU19SRUFDSEFCTEU7IFwKKyAgICBnLT5nYy5nY19uZXh0ID0gX1B5R0NfZ2VuZXJhdGlvbjA7IFwKKyAgICBnLT5nYy5nY19wcmV2ID0gX1B5R0NfZ2VuZXJhdGlvbjAtPmdjLmdjX3ByZXY7IFwKKyAgICBnLT5nYy5nY19wcmV2LT5nYy5nY19uZXh0ID0gZzsgXAorICAgIF9QeUdDX2dlbmVyYXRpb24wLT5nYy5nY19wcmV2ID0gZzsgXAorICAgIH0gd2hpbGUgKDApOworCisvKiBUZWxsIHRoZSBHQyB0byBzdG9wIHRyYWNraW5nIHRoaXMgb2JqZWN0LgorICogZ2NfbmV4dCBkb2Vzbid0IG5lZWQgdG8gYmUgc2V0IHRvIE5VTEwsIGJ1dCBkb2luZyBzbyBpcyBhIGdvb2QKKyAqIHdheSB0byBwcm92b2tlIG1lbW9yeSBlcnJvcnMgaWYgY2FsbGluZyBjb2RlIGlzIGNvbmZ1c2VkLgorICovCisjZGVmaW5lIF9QeU9iamVjdF9HQ19VTlRSQUNLKG8pIGRvIHsgXAorICAgIFB5R0NfSGVhZCAqZyA9IF9QeV9BU19HQyhvKTsgXAorICAgIGFzc2VydChnLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKTsgXAorICAgIGctPmdjLmdjX3JlZnMgPSBfUHlHQ19SRUZTX1VOVFJBQ0tFRDsgXAorICAgIGctPmdjLmdjX3ByZXYtPmdjLmdjX25leHQgPSBnLT5nYy5nY19uZXh0OyBcCisgICAgZy0+Z2MuZ2NfbmV4dC0+Z2MuZ2NfcHJldiA9IGctPmdjLmdjX3ByZXY7IFwKKyAgICBnLT5nYy5nY19uZXh0ID0gTlVMTDsgXAorICAgIH0gd2hpbGUgKDApOworCisvKiBUcnVlIGlmIHRoZSBvYmplY3QgaXMgY3VycmVudGx5IHRyYWNrZWQgYnkgdGhlIEdDLiAqLworI2RlZmluZSBfUHlPYmplY3RfR0NfSVNfVFJBQ0tFRChvKSBcCisgICAgKChfUHlfQVNfR0MobykpLT5nYy5nY19yZWZzICE9IF9QeUdDX1JFRlNfVU5UUkFDS0VEKQorCisvKiBUcnVlIGlmIHRoZSBvYmplY3QgbWF5IGJlIHRyYWNrZWQgYnkgdGhlIEdDIGluIHRoZSBmdXR1cmUsIG9yIGFscmVhZHkgaXMuCisgICBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gaW1wbGVtZW50IHNvbWUgb3B0aW1pemF0aW9ucy4gKi8KKyNkZWZpbmUgX1B5T2JqZWN0X0dDX01BWV9CRV9UUkFDS0VEKG9iaikgXAorICAgIChQeU9iamVjdF9JU19HQyhvYmopICYmIFwKKyAgICAgICAgKCFQeVR1cGxlX0NoZWNrRXhhY3Qob2JqKSB8fCBfUHlPYmplY3RfR0NfSVNfVFJBQ0tFRChvYmopKSkKKworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeU9iamVjdF9HQ19NYWxsb2Moc2l6ZV90KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5T2JqZWN0X0dDX05ldyhQeVR5cGVPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5VmFyT2JqZWN0ICopIF9QeU9iamVjdF9HQ19OZXdWYXIoUHlUeXBlT2JqZWN0ICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyh2b2lkKSBQeU9iamVjdF9HQ19UcmFjayh2b2lkICopOworUHlBUElfRlVOQyh2b2lkKSBQeU9iamVjdF9HQ19VblRyYWNrKHZvaWQgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5T2JqZWN0X0dDX0RlbCh2b2lkICopOworCisjZGVmaW5lIFB5T2JqZWN0X0dDX05ldyh0eXBlLCB0eXBlb2JqKSBcCisgICAgICAgICAgICAgICAgKCAodHlwZSAqKSBfUHlPYmplY3RfR0NfTmV3KHR5cGVvYmopICkKKyNkZWZpbmUgUHlPYmplY3RfR0NfTmV3VmFyKHR5cGUsIHR5cGVvYmosIG4pIFwKKyAgICAgICAgICAgICAgICAoICh0eXBlICopIF9QeU9iamVjdF9HQ19OZXdWYXIoKHR5cGVvYmopLCAobikpICkKKworCisvKiBVdGlsaXR5IG1hY3JvIHRvIGhlbHAgd3JpdGUgdHBfdHJhdmVyc2UgZnVuY3Rpb25zLgorICogVG8gdXNlIHRoaXMgbWFjcm8sIHRoZSB0cF90cmF2ZXJzZSBmdW5jdGlvbiBtdXN0IG5hbWUgaXRzIGFyZ3VtZW50cworICogInZpc2l0IiBhbmQgImFyZyIuICBUaGlzIGlzIGludGVuZGVkIHRvIGtlZXAgdHBfdHJhdmVyc2UgZnVuY3Rpb25zCisgKiBsb29raW5nIGFzIG11Y2ggYWxpa2UgYXMgcG9zc2libGUuCisgKi8KKyNkZWZpbmUgUHlfVklTSVQob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9wKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCB2cmV0ID0gdmlzaXQoKFB5T2JqZWN0ICopKG9wKSwgYXJnKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICh2cmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZXR1cm4gdnJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisvKiBUaGlzIGlzIGhlcmUgZm9yIHRoZSBzYWtlIG9mIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgRXh0ZW5zaW9ucyB0aGF0CisgKiB1c2UgdGhlIG9sZCBHQyBBUEkgd2lsbCBzdGlsbCBjb21waWxlIGJ1dCB0aGUgb2JqZWN0cyB3aWxsIG5vdCBiZQorICogdHJhY2tlZCBieSB0aGUgR0MuICovCisjZGVmaW5lIFB5R0NfSEVBRF9TSVpFIDAKKyNkZWZpbmUgUHlPYmplY3RfR0NfSW5pdChvcCkKKyNkZWZpbmUgUHlPYmplY3RfR0NfRmluaShvcCkKKyNkZWZpbmUgUHlPYmplY3RfQVNfR0Mob3ApIChvcCkKKyNkZWZpbmUgUHlPYmplY3RfRlJPTV9HQyhvcCkgKG9wKQorCisKKy8qIFRlc3QgaWYgYSB0eXBlIHN1cHBvcnRzIHdlYWsgcmVmZXJlbmNlcyAqLworI2RlZmluZSBQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlModCkgXAorICAgIChQeVR5cGVfSGFzRmVhdHVyZSgodCksIFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUykgXAorICAgICAmJiAoKHQpLT50cF93ZWFrbGlzdG9mZnNldCA+IDApKQorCisjZGVmaW5lIFB5T2JqZWN0X0dFVF9XRUFLUkVGU19MSVNUUFRSKG8pIFwKKyAgICAoKFB5T2JqZWN0ICoqKSAoKChjaGFyICopIChvKSkgKyBQeV9UWVBFKG8pLT50cF93ZWFrbGlzdG9mZnNldCkpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X09CSklNUExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvb3Bjb2RlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9vcGNvZGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzY0MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvb3Bjb2RlLmgKQEAgLTAsMCArMSwxNjIgQEAKKyNpZm5kZWYgUHlfT1BDT0RFX0gKKyNkZWZpbmUgUHlfT1BDT0RFX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBJbnN0cnVjdGlvbiBvcGNvZGVzIGZvciBjb21waWxlZCBjb2RlICovCisKKyNkZWZpbmUgU1RPUF9DT0RFCTAKKyNkZWZpbmUgUE9QX1RPUAkJMQorI2RlZmluZSBST1RfVFdPCQkyCisjZGVmaW5lIFJPVF9USFJFRQkzCisjZGVmaW5lIERVUF9UT1AJCTQKKyNkZWZpbmUgUk9UX0ZPVVIJNQorI2RlZmluZSBOT1AJCTkKKworI2RlZmluZSBVTkFSWV9QT1NJVElWRQkxMAorI2RlZmluZSBVTkFSWV9ORUdBVElWRQkxMQorI2RlZmluZSBVTkFSWV9OT1QJMTIKKyNkZWZpbmUgVU5BUllfQ09OVkVSVAkxMworCisjZGVmaW5lIFVOQVJZX0lOVkVSVAkxNQorCisjZGVmaW5lIEJJTkFSWV9QT1dFUgkxOQorCisjZGVmaW5lIEJJTkFSWV9NVUxUSVBMWQkyMAorI2RlZmluZSBCSU5BUllfRElWSURFCTIxCisjZGVmaW5lIEJJTkFSWV9NT0RVTE8JMjIKKyNkZWZpbmUgQklOQVJZX0FERAkyMworI2RlZmluZSBCSU5BUllfU1VCVFJBQ1QJMjQKKyNkZWZpbmUgQklOQVJZX1NVQlNDUgkyNQorI2RlZmluZSBCSU5BUllfRkxPT1JfRElWSURFIDI2CisjZGVmaW5lIEJJTkFSWV9UUlVFX0RJVklERSAyNworI2RlZmluZSBJTlBMQUNFX0ZMT09SX0RJVklERSAyOAorI2RlZmluZSBJTlBMQUNFX1RSVUVfRElWSURFIDI5CisKKyNkZWZpbmUgU0xJQ0UJCTMwCisvKiBBbHNvIHVzZXMgMzEtMzMgKi8KKworI2RlZmluZSBTVE9SRV9TTElDRQk0MAorLyogQWxzbyB1c2VzIDQxLTQzICovCisKKyNkZWZpbmUgREVMRVRFX1NMSUNFCTUwCisvKiBBbHNvIHVzZXMgNTEtNTMgKi8KKworI2RlZmluZSBTVE9SRV9NQVAJNTQKKyNkZWZpbmUgSU5QTEFDRV9BREQJNTUKKyNkZWZpbmUgSU5QTEFDRV9TVUJUUkFDVAk1NgorI2RlZmluZSBJTlBMQUNFX01VTFRJUExZCTU3CisjZGVmaW5lIElOUExBQ0VfRElWSURFCTU4CisjZGVmaW5lIElOUExBQ0VfTU9EVUxPCTU5CisjZGVmaW5lIFNUT1JFX1NVQlNDUgk2MAorI2RlZmluZSBERUxFVEVfU1VCU0NSCTYxCisKKyNkZWZpbmUgQklOQVJZX0xTSElGVAk2MgorI2RlZmluZSBCSU5BUllfUlNISUZUCTYzCisjZGVmaW5lIEJJTkFSWV9BTkQJNjQKKyNkZWZpbmUgQklOQVJZX1hPUgk2NQorI2RlZmluZSBCSU5BUllfT1IJNjYKKyNkZWZpbmUgSU5QTEFDRV9QT1dFUgk2NworI2RlZmluZSBHRVRfSVRFUgk2OAorCisjZGVmaW5lIFBSSU5UX0VYUFIJNzAKKyNkZWZpbmUgUFJJTlRfSVRFTQk3MQorI2RlZmluZSBQUklOVF9ORVdMSU5FCTcyCisjZGVmaW5lIFBSSU5UX0lURU1fVE8gICA3MworI2RlZmluZSBQUklOVF9ORVdMSU5FX1RPIDc0CisjZGVmaW5lIElOUExBQ0VfTFNISUZUCTc1CisjZGVmaW5lIElOUExBQ0VfUlNISUZUCTc2CisjZGVmaW5lIElOUExBQ0VfQU5ECTc3CisjZGVmaW5lIElOUExBQ0VfWE9SCTc4CisjZGVmaW5lIElOUExBQ0VfT1IJNzkKKyNkZWZpbmUgQlJFQUtfTE9PUAk4MAorI2RlZmluZSBXSVRIX0NMRUFOVVAgICAgODEKKyNkZWZpbmUgTE9BRF9MT0NBTFMJODIKKyNkZWZpbmUgUkVUVVJOX1ZBTFVFCTgzCisjZGVmaW5lIElNUE9SVF9TVEFSCTg0CisjZGVmaW5lIEVYRUNfU1RNVAk4NQorI2RlZmluZSBZSUVMRF9WQUxVRQk4NgorI2RlZmluZSBQT1BfQkxPQ0sJODcKKyNkZWZpbmUgRU5EX0ZJTkFMTFkJODgKKyNkZWZpbmUgQlVJTERfQ0xBU1MJODkKKworI2RlZmluZSBIQVZFX0FSR1VNRU5UCTkwCS8qIE9wY29kZXMgZnJvbSBoZXJlIGhhdmUgYW4gYXJndW1lbnQ6ICovCisKKyNkZWZpbmUgU1RPUkVfTkFNRQk5MAkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KKyNkZWZpbmUgREVMRVRFX05BTUUJOTEJLyogIiIgKi8KKyNkZWZpbmUgVU5QQUNLX1NFUVVFTkNFCTkyCS8qIE51bWJlciBvZiBzZXF1ZW5jZSBpdGVtcyAqLworI2RlZmluZSBGT1JfSVRFUgk5MworI2RlZmluZSBMSVNUX0FQUEVORAk5NAorCisjZGVmaW5lIFNUT1JFX0FUVFIJOTUJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCisjZGVmaW5lIERFTEVURV9BVFRSCTk2CS8qICIiICovCisjZGVmaW5lIFNUT1JFX0dMT0JBTAk5NwkvKiAiIiAqLworI2RlZmluZSBERUxFVEVfR0xPQkFMCTk4CS8qICIiICovCisjZGVmaW5lIERVUF9UT1BYCTk5CS8qIG51bWJlciBvZiBpdGVtcyB0byBkdXBsaWNhdGUgKi8KKyNkZWZpbmUgTE9BRF9DT05TVAkxMDAJLyogSW5kZXggaW4gY29uc3QgbGlzdCAqLworI2RlZmluZSBMT0FEX05BTUUJMTAxCS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLworI2RlZmluZSBCVUlMRF9UVVBMRQkxMDIJLyogTnVtYmVyIG9mIHR1cGxlIGl0ZW1zICovCisjZGVmaW5lIEJVSUxEX0xJU1QJMTAzCS8qIE51bWJlciBvZiBsaXN0IGl0ZW1zICovCisjZGVmaW5lIEJVSUxEX1NFVAkxMDQgICAgIC8qIE51bWJlciBvZiBzZXQgaXRlbXMgKi8KKyNkZWZpbmUgQlVJTERfTUFQCTEwNQkvKiBBbHdheXMgemVybyBmb3Igbm93ICovCisjZGVmaW5lIExPQURfQVRUUgkxMDYJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCisjZGVmaW5lIENPTVBBUkVfT1AJMTA3CS8qIENvbXBhcmlzb24gb3BlcmF0b3IgKi8KKyNkZWZpbmUgSU1QT1JUX05BTUUJMTA4CS8qIEluZGV4IGluIG5hbWUgbGlzdCAqLworI2RlZmluZSBJTVBPUlRfRlJPTQkxMDkJLyogSW5kZXggaW4gbmFtZSBsaXN0ICovCisjZGVmaW5lIEpVTVBfRk9SV0FSRAkxMTAJLyogTnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAgKi8KKworI2RlZmluZSBKVU1QX0lGX0ZBTFNFX09SX1BPUCAxMTEgLyogVGFyZ2V0IGJ5dGUgb2Zmc2V0IGZyb20gYmVnaW5uaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBjb2RlICovCisjZGVmaW5lIEpVTVBfSUZfVFJVRV9PUl9QT1AgMTEyCS8qICIiICovCisjZGVmaW5lIEpVTVBfQUJTT0xVVEUJMTEzCS8qICIiICovCisjZGVmaW5lIFBPUF9KVU1QX0lGX0ZBTFNFIDExNAkvKiAiIiAqLworI2RlZmluZSBQT1BfSlVNUF9JRl9UUlVFIDExNQkvKiAiIiAqLworCisjZGVmaW5lIExPQURfR0xPQkFMCTExNgkvKiBJbmRleCBpbiBuYW1lIGxpc3QgKi8KKworI2RlZmluZSBDT05USU5VRV9MT09QCTExOQkvKiBTdGFydCBvZiBsb29wIChhYnNvbHV0ZSkgKi8KKyNkZWZpbmUgU0VUVVBfTE9PUAkxMjAJLyogVGFyZ2V0IGFkZHJlc3MgKHJlbGF0aXZlKSAqLworI2RlZmluZSBTRVRVUF9FWENFUFQJMTIxCS8qICIiICovCisjZGVmaW5lIFNFVFVQX0ZJTkFMTFkJMTIyCS8qICIiICovCisKKyNkZWZpbmUgTE9BRF9GQVNUCTEyNAkvKiBMb2NhbCB2YXJpYWJsZSBudW1iZXIgKi8KKyNkZWZpbmUgU1RPUkVfRkFTVAkxMjUJLyogTG9jYWwgdmFyaWFibGUgbnVtYmVyICovCisjZGVmaW5lIERFTEVURV9GQVNUCTEyNgkvKiBMb2NhbCB2YXJpYWJsZSBudW1iZXIgKi8KKworI2RlZmluZSBSQUlTRV9WQVJBUkdTCTEzMAkvKiBOdW1iZXIgb2YgcmFpc2UgYXJndW1lbnRzICgxLCAyIG9yIDMpICovCisvKiBDQUxMX0ZVTkNUSU9OX1hYWCBvcGNvZGVzIGRlZmluZWQgYmVsb3cgZGVwZW5kIG9uIHRoaXMgZGVmaW5pdGlvbiAqLworI2RlZmluZSBDQUxMX0ZVTkNUSU9OCTEzMQkvKiAjYXJncyArICgja3dhcmdzPDw4KSAqLworI2RlZmluZSBNQUtFX0ZVTkNUSU9OCTEzMgkvKiAjZGVmYXVsdHMgKi8KKyNkZWZpbmUgQlVJTERfU0xJQ0UgCTEzMwkvKiBOdW1iZXIgb2YgaXRlbXMgKi8KKworI2RlZmluZSBNQUtFX0NMT1NVUkUgICAgMTM0ICAgICAvKiAjZnJlZSB2YXJzICovCisjZGVmaW5lIExPQURfQ0xPU1VSRSAgICAxMzUgICAgIC8qIExvYWQgZnJlZSB2YXJpYWJsZSBmcm9tIGNsb3N1cmUgKi8KKyNkZWZpbmUgTE9BRF9ERVJFRiAgICAgIDEzNiAgICAgLyogTG9hZCBhbmQgZGVyZWZlcmVuY2UgZnJvbSBjbG9zdXJlIGNlbGwgKi8gCisjZGVmaW5lIFNUT1JFX0RFUkVGICAgICAxMzcgICAgIC8qIFN0b3JlIGludG8gY2VsbCAqLyAKKworLyogVGhlIG5leHQgMyBvcGNvZGVzIG11c3QgYmUgY29udGlndW91cyBhbmQgc2F0aXNmeQorICAgKENBTExfRlVOQ1RJT05fVkFSIC0gQ0FMTF9GVU5DVElPTikgJiAzID09IDEgICovCisjZGVmaW5lIENBTExfRlVOQ1RJT05fVkFSICAgICAgICAgIDE0MAkvKiAjYXJncyArICgja3dhcmdzPDw4KSAqLworI2RlZmluZSBDQUxMX0ZVTkNUSU9OX0tXICAgICAgICAgICAxNDEJLyogI2FyZ3MgKyAoI2t3YXJnczw8OCkgKi8KKyNkZWZpbmUgQ0FMTF9GVU5DVElPTl9WQVJfS1cgICAgICAgMTQyCS8qICNhcmdzICsgKCNrd2FyZ3M8PDgpICovCisKKyNkZWZpbmUgU0VUVVBfV0lUSCAxNDMKKworLyogU3VwcG9ydCBmb3Igb3BhcmdzIG1vcmUgdGhhbiAxNiBiaXRzIGxvbmcgKi8KKyNkZWZpbmUgRVhURU5ERURfQVJHICAxNDUKKworI2RlZmluZSBTRVRfQUREICAgICAgICAgMTQ2CisjZGVmaW5lIE1BUF9BREQgICAgICAgICAxNDcKKworCitlbnVtIGNtcF9vcCB7UHlDbXBfTFQ9UHlfTFQsIFB5Q21wX0xFPVB5X0xFLCBQeUNtcF9FUT1QeV9FUSwgUHlDbXBfTkU9UHlfTkUsIFB5Q21wX0dUPVB5X0dULCBQeUNtcF9HRT1QeV9HRSwKKwkgICAgIFB5Q21wX0lOLCBQeUNtcF9OT1RfSU4sIFB5Q21wX0lTLCBQeUNtcF9JU19OT1QsIFB5Q21wX0VYQ19NQVRDSCwgUHlDbXBfQkFEfTsKKworI2RlZmluZSBIQVNfQVJHKG9wKSAoKG9wKSA+PSBIQVZFX0FSR1VNRU5UKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9PUENPREVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvb3NkZWZzLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9vc2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODYxZWZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvb3NkZWZzLmgKQEAgLTAsMCArMSw2NiBAQAorI2lmbmRlZiBQeV9PU0RFRlNfSAorI2RlZmluZSBQeV9PU0RFRlNfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIE9wZXJhdGluZyBzeXN0ZW0gZGVwZW5kZW5jaWVzICovCisKKy8qIE1vZCBieSBjaHJpc2g6IFFOWCBoYXMgV0FUQ09NLCBidXQgaXNuJ3QgRE9TICovCisjaWYgIWRlZmluZWQoX19RTlhfXykKKyNpZiBkZWZpbmVkKE1TX1dJTkRPV1MpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9fV0FUQ09NQ19fKSB8fCBkZWZpbmVkKF9fREpHUFBfXykgfHwgZGVmaW5lZChQWU9TX09TMikKKyNpZiAoZGVmaW5lZChQWU9TX09TMikgJiYgZGVmaW5lZChQWUNDX0dDQykpIHx8IGRlZmluZWQoX19NSU5HVzMyX18pCisjZGVmaW5lIE1BWFBBVEhMRU4gMjYwCisjZGVmaW5lIFNFUCAnLycKKyNkZWZpbmUgQUxUU0VQICdcXCcKKyNlbHNlCisjZGVmaW5lIFNFUCAnXFwnCisjZGVmaW5lIEFMVFNFUCAnLycKKyNkZWZpbmUgTUFYUEFUSExFTiAyNTYKKyNlbmRpZgorI2RlZmluZSBERUxJTSAnOycKKyNkZWZpbmUgREVMSU1TVFIgIjsiCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgUklTQ09TCisjZGVmaW5lIFNFUCAnLicKKyNkZWZpbmUgTUFYUEFUSExFTiAyNTYKKyNkZWZpbmUgREVMSU0gJywnCisjZGVmaW5lIERFTElNU1RSICIsIgorI2VuZGlmCisKKworLyogRmlsZW5hbWUgc2VwYXJhdG9yICovCisjaWZuZGVmIFNFUAorI2RlZmluZSBTRVAgJy8nCisjZW5kaWYKKworLyogTWF4IHBhdGhuYW1lIGxlbmd0aCAqLworI2lmZGVmIF9faHB1eAorI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmbmRlZiBQQVRIX01BWAorI2RlZmluZSBQQVRIX01BWCBNQVhQQVRITEVOCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE1BWFBBVEhMRU4KKyNpZiBkZWZpbmVkKFBBVEhfTUFYKSAmJiBQQVRIX01BWCA+IDEwMjQKKyNkZWZpbmUgTUFYUEFUSExFTiBQQVRIX01BWAorI2Vsc2UKKyNkZWZpbmUgTUFYUEFUSExFTiAxMDI0CisjZW5kaWYKKyNlbmRpZgorCisvKiBTZWFyY2ggcGF0aCBlbnRyeSBkZWxpbWl0ZXIgKi8KKyNpZm5kZWYgREVMSU0KKyNkZWZpbmUgREVMSU0gJzonCisjZGVmaW5lIERFTElNU1RSICI6IgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X09TREVGU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9wYXJzZXRvay5oIGIvaW5jbHVkZS9weXRob24yLjcvcGFyc2V0b2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzFlYjZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcGFyc2V0b2suaApAQCAtMCwwICsxLDY0IEBACisKKy8qIFBhcnNlci10b2tlbml6ZXIgbGluayBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9QQVJTRVRPS19ICisjZGVmaW5lIFB5X1BBUlNFVE9LX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBlcnJvcjsKKyAgICBjb25zdCBjaGFyICpmaWxlbmFtZTsKKyAgICBpbnQgbGluZW5vOworICAgIGludCBvZmZzZXQ7CisgICAgY2hhciAqdGV4dDsKKyAgICBpbnQgdG9rZW47CisgICAgaW50IGV4cGVjdGVkOworfSBwZXJyZGV0YWlsOworCisjaWYgMAorI2RlZmluZSBQeVBBUlNFX1lJRUxEX0lTX0tFWVdPUkQJMHgwMDAxCisjZW5kaWYKKworI2RlZmluZSBQeVBBUlNFX0RPTlRfSU1QTFlfREVERU5UCTB4MDAwMgorCisjaWYgMAorI2RlZmluZSBQeVBBUlNFX1dJVEhfSVNfS0VZV09SRAkJMHgwMDAzCisjZW5kaWYKKworI2RlZmluZSBQeVBBUlNFX1BSSU5UX0lTX0ZVTkNUSU9OICAgICAgIDB4MDAwNAorI2RlZmluZSBQeVBBUlNFX1VOSUNPREVfTElURVJBTFMgICAgICAgIDB4MDAwOAorCisKKworUHlBUElfRlVOQyhub2RlICopIFB5UGFyc2VyX1BhcnNlU3RyaW5nKGNvbnN0IGNoYXIgKiwgZ3JhbW1hciAqLCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVycmRldGFpbCAqKTsKK1B5QVBJX0ZVTkMobm9kZSAqKSBQeVBhcnNlcl9QYXJzZUZpbGUgKEZJTEUgKiwgY29uc3QgY2hhciAqLCBncmFtbWFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiwgY2hhciAqLCBwZXJyZGV0YWlsICopOworCitQeUFQSV9GVU5DKG5vZGUgKikgUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGdyYW1tYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJkZXRhaWwgKiwgaW50KTsKK1B5QVBJX0ZVTkMobm9kZSAqKSBQeVBhcnNlcl9QYXJzZUZpbGVGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgZ3JhbW1hciAqLAorCQkJCQkJIGludCwgY2hhciAqLCBjaGFyICosCisJCQkJCQkgcGVycmRldGFpbCAqLCBpbnQpOworUHlBUElfRlVOQyhub2RlICopIFB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzRXgoRklMRSAqLCBjb25zdCBjaGFyICosIGdyYW1tYXIgKiwKKwkJCQkJCSBpbnQsIGNoYXIgKiwgY2hhciAqLAorCQkJCQkJIHBlcnJkZXRhaWwgKiwgaW50ICopOworCitQeUFQSV9GVU5DKG5vZGUgKikgUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lKGNvbnN0IGNoYXIgKiwKKwkJCQkJICAgICAgY29uc3QgY2hhciAqLAorCQkJCQkgICAgICBncmFtbWFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJyZGV0YWlsICosIGludCk7CitQeUFQSV9GVU5DKG5vZGUgKikgUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lRXgoY29uc3QgY2hhciAqLAorCQkJCQkgICAgICBjb25zdCBjaGFyICosCisJCQkJCSAgICAgIGdyYW1tYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnJkZXRhaWwgKiwgaW50ICopOworCisvKiBOb3RlIHRoYXQgaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gcHl0aG9ucnVuLmMgbm90IHBhcnNldG9rLmMuICovCitQeUFQSV9GVU5DKHZvaWQpIFB5UGFyc2VyX1NldEVycm9yKHBlcnJkZXRhaWwgKik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1BBUlNFVE9LX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3BhdGNobGV2ZWwuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3BhdGNobGV2ZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGYxNzllCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcGF0Y2hsZXZlbC5oCkBAIC0wLDAgKzEsNDMgQEAKKworLyogTmV3ZmFuZ2xlZCB2ZXJzaW9uIGlkZW50aWZpY2F0aW9uIHNjaGVtZS4KKworICAgVGhpcyBzY2hlbWUgd2FzIGFkZGVkIGluIFB5dGhvbiAxLjUuMmIyOyBiZWZvcmUgdGhhdCB0aW1lLCBvbmx5IFBBVENITEVWRUwKKyAgIHdhcyBhdmFpbGFibGUuICBUbyB0ZXN0IGZvciBwcmVzZW5jZSBvZiB0aGUgc2NoZW1lLCB0ZXN0IGZvcgorICAgZGVmaW5lZChQWV9NQUpPUl9WRVJTSU9OKS4KKworICAgV2hlbiB0aGUgbWFqb3Igb3IgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLCB0aGUgVkVSU0lPTiB2YXJpYWJsZSBpbgorICAgY29uZmlndXJlLmFjIG11c3QgYWxzbyBiZSBjaGFuZ2VkLgorCisgICBUaGVyZSBpcyBhbHNvIChpbmRlcGVuZGVudCkgQVBJIHZlcnNpb24gaW5mb3JtYXRpb24gaW4gbW9kc3VwcG9ydC5oLgorKi8KKworLyogVmFsdWVzIGZvciBQWV9SRUxFQVNFX0xFVkVMICovCisjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUxfQUxQSEEJMHhBCisjZGVmaW5lIFBZX1JFTEVBU0VfTEVWRUxfQkVUQQkweEIKKyNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTF9HQU1NQQkweEMgICAgIC8qIEZvciByZWxlYXNlIGNhbmRpZGF0ZXMgKi8KKyNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTF9GSU5BTAkweEYJLyogU2VyaWFsIHNob3VsZCBiZSAwIGhlcmUgKi8KKwkJCQkJLyogSGlnaGVyIGZvciBwYXRjaCByZWxlYXNlcyAqLworCisvKiBWZXJzaW9uIHBhcnNlZCBvdXQgaW50byBudW1lcmljIHZhbHVlcyAqLworLyotLXN0YXJ0IGNvbnN0YW50cy0tKi8KKyNkZWZpbmUgUFlfTUFKT1JfVkVSU0lPTgkyCisjZGVmaW5lIFBZX01JTk9SX1ZFUlNJT04JNworI2RlZmluZSBQWV9NSUNST19WRVJTSU9OCTUKKyNkZWZpbmUgUFlfUkVMRUFTRV9MRVZFTAlQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMCisjZGVmaW5lIFBZX1JFTEVBU0VfU0VSSUFMCTAKKworLyogVmVyc2lvbiBhcyBhIHN0cmluZyAqLworI2RlZmluZSBQWV9WRVJTSU9OICAgICAgCSIyLjcuNSIKKy8qLS1lbmQgY29uc3RhbnRzLS0qLworCisvKiBTdWJ2ZXJzaW9uIFJldmlzaW9uIG51bWJlciBvZiB0aGlzIGZpbGUgKG5vdCBvZiB0aGUgcmVwb3NpdG9yeSkuIEVtcHR5CisgICBzaW5jZSBNZXJjdXJpYWwgbWlncmF0aW9uLiAqLworI2RlZmluZSBQWV9QQVRDSExFVkVMX1JFVklTSU9OICAiIgorCisvKiBWZXJzaW9uIGFzIGEgc2luZ2xlIDQtYnl0ZSBoZXggbnVtYmVyLCBlLmcuIDB4MDEwNTAyQjIgPT0gMS41LjJiMi4KKyAgIFVzZSB0aGlzIGZvciBudW1lcmljIGNvbXBhcmlzb25zLCBlLmcuICNpZiBQWV9WRVJTSU9OX0hFWCA+PSAuLi4gKi8KKyNkZWZpbmUgUFlfVkVSU0lPTl9IRVggKChQWV9NQUpPUl9WRVJTSU9OIDw8IDI0KSB8IFwKKwkJCShQWV9NSU5PUl9WRVJTSU9OIDw8IDE2KSB8IFwKKwkJCShQWV9NSUNST19WRVJTSU9OIDw8ICA4KSB8IFwKKwkJCShQWV9SRUxFQVNFX0xFVkVMIDw8ICA0KSB8IFwKKwkJCShQWV9SRUxFQVNFX1NFUklBTCA8PCAwKSkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3BnZW4uaCBiL2luY2x1ZGUvcHl0aG9uMi43L3BnZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTMyNWVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcGdlbi5oCkBAIC0wLDAgKzEsMTggQEAKKyNpZm5kZWYgUHlfUEdFTl9ICisjZGVmaW5lIFB5X1BHRU5fSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIFBhcnNlciBnZW5lcmF0b3IgaW50ZXJmYWNlICovCisKK2V4dGVybiBncmFtbWFyICptZXRhX2dyYW1tYXIodm9pZCk7CisKK3N0cnVjdCBfbm9kZTsKK2V4dGVybiBncmFtbWFyICpwZ2VuKHN0cnVjdCBfbm9kZSAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfUEdFTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9wZ2VuaGVhZGVycy5oIGIvaW5jbHVkZS9weXRob24yLjcvcGdlbmhlYWRlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDQ5YWUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcGdlbmhlYWRlcnMuaApAQCAtMCwwICsxLDQyIEBACisjaWZuZGVmIFB5X1BHRU5IRUFERVJTX0gKKyNkZWZpbmUgUHlfUEdFTkhFQURFUlNfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIEluY2x1ZGUgZmlsZXMgYW5kIGV4dGVybiBkZWNsYXJhdGlvbnMgdXNlZCBieSBtb3N0IG9mIHRoZSBwYXJzZXIuICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKworUHlBUElfRlVOQyh2b2lkKSBQeVN5c19Xcml0ZVN0ZG91dChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKKwkJCVB5X0dDQ19BVFRSSUJVVEUoKGZvcm1hdChwcmludGYsIDEsIDIpKSk7CitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1dyaXRlU3RkZXJyKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKKworI2RlZmluZSBhZGRhcmMgX1B5X2FkZGFyYworI2RlZmluZSBhZGRiaXQgX1B5X2FkZGJpdAorI2RlZmluZSBhZGRkZmEgX1B5X2FkZGRmYQorI2RlZmluZSBhZGRmaXJzdHNldHMgX1B5X2FkZGZpcnN0c2V0cworI2RlZmluZSBhZGRsYWJlbCBfUHlfYWRkbGFiZWwKKyNkZWZpbmUgYWRkc3RhdGUgX1B5X2FkZHN0YXRlCisjZGVmaW5lIGRlbGJpdHNldCBfUHlfZGVsYml0c2V0CisjZGVmaW5lIGR1bXB0cmVlIF9QeV9kdW1wdHJlZQorI2RlZmluZSBmaW5kbGFiZWwgX1B5X2ZpbmRsYWJlbAorI2RlZmluZSBtZXJnZWJpdHNldCBfUHlfbWVyZ2ViaXRzZXQKKyNkZWZpbmUgbWV0YV9ncmFtbWFyIF9QeV9tZXRhX2dyYW1tYXIKKyNkZWZpbmUgbmV3Yml0c2V0IF9QeV9uZXdiaXRzZXQKKyNkZWZpbmUgbmV3Z3JhbW1hciBfUHlfbmV3Z3JhbW1hcgorI2RlZmluZSBwZ2VuIF9QeV9wZ2VuCisjZGVmaW5lIHByaW50Z3JhbW1hciBfUHlfcHJpbnRncmFtbWFyCisjZGVmaW5lIHByaW50bm9udGVybWluYWxzIF9QeV9wcmludG5vbnRlcm1pbmFscworI2RlZmluZSBwcmludHRyZWUgX1B5X3ByaW50dHJlZQorI2RlZmluZSBzYW1lYml0c2V0IF9QeV9zYW1lYml0c2V0CisjZGVmaW5lIHNob3d0cmVlIF9QeV9zaG93dHJlZQorI2RlZmluZSB0b2tfZHVtcCBfUHlfdG9rX2R1bXAKKyNkZWZpbmUgdHJhbnNsYXRlbGFiZWxzIF9QeV90cmFuc2xhdGVsYWJlbHMKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfUEdFTkhFQURFUlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlfY3Vyc2VzLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weV9jdXJzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjA2YWIxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlfY3Vyc2VzLmgKQEAgLTAsMCArMSwxODAgQEAKKworI2lmbmRlZiBQeV9DVVJTRVNfSAorI2RlZmluZSBQeV9DVVJTRVNfSAorCisjaWZkZWYgX19BUFBMRV9fCisvKgorKiogT24gTWFjIE9TIFggMTAuMiBbbl1jdXJzZXMuaCBhbmQgc3RkbGliLmggdXNlIGRpZmZlcmVudCBndWFyZHMKKyoqIGFnYWluc3QgbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiB3Y2hhcl90LgorKi8KKyNpZmRlZglfQlNEX1dDSEFSX1RfREVGSU5FRF8KKyNkZWZpbmUgX1dDSEFSX1QKKyNlbmRpZgorCisvKiB0aGUgZm9sbG93aW5nIGRlZmluZSBpcyBuZWNlc3NhcnkgZm9yIE9TIFggMTAuNjsgd2l0aG91dCBpdCwgdGhlCisgICBBcHBsZS1zdXBwbGllZCBuY3Vyc2VzLmggc2V0cyBOQ1VSU0VTX09QQVFVRSB0byAxLCBhbmQgdGhlbiBQeXRob24KKyAgIGNhbid0IGdldCBhdCB0aGUgV0lORE9XIGZsYWdzIGZpZWxkLiAqLworI2RlZmluZSBOQ1VSU0VTX09QQVFVRSAwCisjZW5kaWYgLyogX19BUFBMRV9fICovCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworLyoKKyoqIE9uIEZyZWVCU0QsIFtuXWN1cnNlcy5oIGFuZCBzdGRsaWIuaC93Y2hhci5oIHVzZSBkaWZmZXJlbnQgZ3VhcmRzCisqKiBhZ2FpbnN0IG11bHRpcGxlIGRlZmluaXRpb24gb2Ygd2NoYXJfdCBhbmQgd2ludF90LgorKi8KKyNpZmRlZglfWE9QRU5fU09VUkNFX0VYVEVOREVECisjaWZuZGVmIF9fRnJlZUJTRF92ZXJzaW9uCisjaW5jbHVkZSA8b3NyZWxkYXRlLmg+CisjZW5kaWYKKyNpZiBfX0ZyZWVCU0RfdmVyc2lvbiA+PSA1MDAwMDAKKyNpZm5kZWYgX193Y2hhcl90CisjZGVmaW5lIF9fd2NoYXJfdAorI2VuZGlmCisjaWZuZGVmIF9fd2ludF90CisjZGVmaW5lIF9fd2ludF90CisjZW5kaWYKKyNlbHNlCisjaWZuZGVmIF9XQ0hBUl9UCisjZGVmaW5lIF9XQ0hBUl9UCisjZW5kaWYKKyNpZm5kZWYgX1dJTlRfVAorI2RlZmluZSBfV0lOVF9UCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfTkNVUlNFU19ICisjaW5jbHVkZSA8bmN1cnNlcy5oPgorI2Vsc2UKKyNpbmNsdWRlIDxjdXJzZXMuaD4KKyNpZmRlZiBIQVZFX1RFUk1fSAorLyogZm9yIHRpZ2V0c3RyLCB3aGljaCBpcyBub3QgZGVjbGFyZWQgaW4gU3lzViBjdXJzZXMgKi8KKyNpbmNsdWRlIDx0ZXJtLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgIWRlZmluZWQoX0lTUEFEKQorI2RlZmluZSBfSVNQQUQgMHgxMAorI2VuZGlmCisKKyNpZmRlZiBIQVZFX05DVVJTRVNfSAorLyogY29uZmlndXJlIHdhcyBjaGVja2luZyA8Y3Vyc2VzLmg+LCBidXQgd2Ugd2lsbAorICAgdXNlIDxuY3Vyc2VzLmg+LCB3aGljaCBoYXMgYWxsIHRoZXNlIGZlYXR1cmVzLiAqLworI2lmbmRlZiBXSU5ET1dfSEFTX0ZMQUdTCisjZGVmaW5lIFdJTkRPV19IQVNfRkxBR1MgMQorI2VuZGlmCisjaWZuZGVmIE1WV0RFTENIX0lTX0VYUFJFU1NJT04KKyNkZWZpbmUgTVZXREVMQ0hfSVNfRVhQUkVTU0lPTiAxCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgUHlDdXJzZXNfQVBJX3BvaW50ZXJzIDQKKworLyogVHlwZSBkZWNsYXJhdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCVB5T2JqZWN0X0hFQUQKKwlXSU5ET1cgKndpbjsKK30gUHlDdXJzZXNXaW5kb3dPYmplY3Q7CisKKyNkZWZpbmUgUHlDdXJzZXNXaW5kb3dfQ2hlY2sodikJIChQeV9UWVBFKHYpID09ICZQeUN1cnNlc1dpbmRvd19UeXBlKQorCisjZGVmaW5lIFB5Q3Vyc2VzX0NBUFNVTEVfTkFNRSAiX2N1cnNlcy5fQ19BUEkiCisKKworI2lmZGVmIENVUlNFU19NT0RVTEUKKy8qIFRoaXMgc2VjdGlvbiBpcyB1c2VkIHdoZW4gY29tcGlsaW5nIF9jdXJzZXNtb2R1bGUuYyAqLworCisjZWxzZQorLyogVGhpcyBzZWN0aW9uIGlzIHVzZWQgaW4gbW9kdWxlcyB0aGF0IHVzZSB0aGUgX2N1cnNlc21vZHVsZSBBUEkgKi8KKworc3RhdGljIHZvaWQgKipQeUN1cnNlc19BUEk7CisKKyNkZWZpbmUgUHlDdXJzZXNXaW5kb3dfVHlwZSAoKihQeVR5cGVPYmplY3QgKikgUHlDdXJzZXNfQVBJWzBdKQorI2RlZmluZSBQeUN1cnNlc1NldHVwVGVybUNhbGxlZCAge2lmICghICgoaW50ICgqKSh2b2lkKSlQeUN1cnNlc19BUElbMV0pICgpICkgcmV0dXJuIE5VTEw7fQorI2RlZmluZSBQeUN1cnNlc0luaXRpYWxpc2VkICAgICAge2lmICghICgoaW50ICgqKSh2b2lkKSlQeUN1cnNlc19BUElbMl0pICgpICkgcmV0dXJuIE5VTEw7fQorI2RlZmluZSBQeUN1cnNlc0luaXRpYWxpc2VkQ29sb3Ige2lmICghICgoaW50ICgqKSh2b2lkKSlQeUN1cnNlc19BUElbM10pICgpICkgcmV0dXJuIE5VTEw7fQorCisjZGVmaW5lIGltcG9ydF9jdXJzZXMoKSBcCisgICAgUHlDdXJzZXNfQVBJID0gKHZvaWQgKiopUHlDYXBzdWxlX0ltcG9ydChQeUN1cnNlc19DQVBTVUxFX05BTUUsIDEpOworCisjZW5kaWYKKworLyogZ2VuZXJhbCBlcnJvciBtZXNzYWdlcyAqLworc3RhdGljIGNoYXIgKmNhdGNoYWxsX0VSUiAgPSAiY3Vyc2VzIGZ1bmN0aW9uIHJldHVybmVkIEVSUiI7CitzdGF0aWMgY2hhciAqY2F0Y2hhbGxfTlVMTCA9ICJjdXJzZXMgZnVuY3Rpb24gcmV0dXJuZWQgTlVMTCI7CisKKy8qIEZ1bmN0aW9uIFByb3RvdHlwZSBNYWNyb3MgLSBUaGV5IGFyZSB1Z2x5IGJ1dCB2ZXJ5LCB2ZXJ5IHVzZWZ1bC4gOy0pCisKKyAgIFggLSBmdW5jdGlvbiBuYW1lCisgICBUWVBFIC0gcGFyYW1ldGVyIFR5cGUKKyAgIEVSR1NUUiAtIGZvcm1hdCBzdHJpbmcgZm9yIGNvbnN0cnVjdGlvbiBvZiB0aGUgcmV0dXJuIHZhbHVlCisgICBQQVJTRVNUUiAtIGZvcm1hdCBzdHJpbmcgZm9yIGFyZ3VtZW50IHBhcnNpbmcKKyAgICovCisKKyNkZWZpbmUgTm9BcmdOb1JldHVybkZ1bmN0aW9uKFgpIFwKK3N0YXRpYyBQeU9iamVjdCAqUHlDdXJzZXNfICMjIFggKFB5T2JqZWN0ICpzZWxmKSBcCit7IFwKKyAgUHlDdXJzZXNJbml0aWFsaXNlZCBcCisgIHJldHVybiBQeUN1cnNlc0NoZWNrRVJSKFgoKSwgIyBYKTsgfQorCisjZGVmaW5lIE5vQXJnT3JGbGFnTm9SZXR1cm5GdW5jdGlvbihYKSBcCitzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzXyAjIyBYIChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIFwKK3sgXAorICBpbnQgZmxhZyA9IDA7IFwKKyAgUHlDdXJzZXNJbml0aWFsaXNlZCBcCisgIHN3aXRjaChQeVR1cGxlX1NpemUoYXJncykpIHsgXAorICBjYXNlIDA6IFwKKyAgICByZXR1cm4gUHlDdXJzZXNDaGVja0VSUihYKCksICMgWCk7IFwKKyAgY2FzZSAxOiBcCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpO1RydWUoMSkgb3IgRmFsc2UoMCkiLCAmZmxhZykpIHJldHVybiBOVUxMOyBcCisgICAgaWYgKGZsYWcpIHJldHVybiBQeUN1cnNlc0NoZWNrRVJSKFgoKSwgIyBYKTsgXAorICAgIGVsc2UgcmV0dXJuIFB5Q3Vyc2VzQ2hlY2tFUlIobm8gIyMgWCAoKSwgIyBYKTsgXAorICBkZWZhdWx0OiBcCisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIyBYICIgcmVxdWlyZXMgMCBvciAxIGFyZ3VtZW50cyIpOyBcCisgICAgcmV0dXJuIE5VTEw7IH0gfQorCisjZGVmaW5lIE5vQXJnUmV0dXJuSW50RnVuY3Rpb24oWCkgXAorc3RhdGljIFB5T2JqZWN0ICpQeUN1cnNlc18gIyMgWCAoUHlPYmplY3QgKnNlbGYpIFwKK3sgXAorIFB5Q3Vyc2VzSW5pdGlhbGlzZWQgXAorIHJldHVybiBQeUludF9Gcm9tTG9uZygobG9uZykgWCgpKTsgfQorCisKKyNkZWZpbmUgTm9BcmdSZXR1cm5TdHJpbmdGdW5jdGlvbihYKSBcCitzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzXyAjIyBYIChQeU9iamVjdCAqc2VsZikgXAoreyBcCisgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQgXAorICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhYKCkpOyB9CisKKyNkZWZpbmUgTm9BcmdUcnVlRmFsc2VGdW5jdGlvbihYKSBcCitzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzXyAjIyBYIChQeU9iamVjdCAqc2VsZikgXAoreyBcCisgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQgXAorICBpZiAoWCAoKSA9PSBGQUxTRSkgeyBcCisgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsgXAorICAgIHJldHVybiBQeV9GYWxzZTsgXAorICB9IFwKKyAgUHlfSU5DUkVGKFB5X1RydWUpOyBcCisgIHJldHVybiBQeV9UcnVlOyB9CisKKyNkZWZpbmUgTm9BcmdOb1JldHVyblZvaWRGdW5jdGlvbihYKSBcCitzdGF0aWMgUHlPYmplY3QgKlB5Q3Vyc2VzXyAjIyBYIChQeU9iamVjdCAqc2VsZikgXAoreyBcCisgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQgXAorICBYKCk7IFwKKyAgUHlfSU5DUkVGKFB5X05vbmUpOyBcCisgIHJldHVybiBQeV9Ob25lOyB9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiAhZGVmaW5lZChQeV9DVVJTRVNfSCkgKi8KKworCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weWFyZW5hLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weWFyZW5hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxOTNmZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5YXJlbmEuaApAQCAtMCwwICsxLDYyIEBACisvKiBBbiBhcmVuYS1saWtlIG1lbW9yeSBpbnRlcmZhY2UgZm9yIHRoZSBjb21waWxlci4KKyAqLworCisjaWZuZGVmIFB5X1BZQVJFTkFfSAorI2RlZmluZSBQeV9QWUFSRU5BX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisgIHR5cGVkZWYgc3RydWN0IF9hcmVuYSBQeUFyZW5hOworCisgIC8qIFB5QXJlbmFfTmV3KCkgYW5kIFB5QXJlbmFfRnJlZSgpIGNyZWF0ZSBhIG5ldyBhcmVuYSBhbmQgZnJlZSBpdCwKKyAgICAgcmVzcGVjdGl2ZWx5LiAgT25jZSBhbiBhcmVuYSBoYXMgYmVlbiBjcmVhdGVkLCBpdCBjYW4gYmUgdXNlZAorICAgICB0byBhbGxvY2F0ZSBtZW1vcnkgdmlhIFB5QXJlbmFfTWFsbG9jKCkuICBQb2ludGVycyB0byBQeU9iamVjdCBjYW4KKyAgICAgYWxzbyBiZSByZWdpc3RlcmVkIHdpdGggdGhlIGFyZW5hIHZpYSBQeUFyZW5hX0FkZFB5T2JqZWN0KCksIGFuZCB0aGUKKyAgICAgYXJlbmEgd2lsbCBlbnN1cmUgdGhhdCB0aGUgUHlPYmplY3RzIHN0YXkgYWxpdmUgYXQgbGVhc3QgdW50aWwKKyAgICAgUHlBcmVuYV9GcmVlKCkgaXMgY2FsbGVkLiAgV2hlbiBhbiBhcmVuYSBpcyBmcmVlZCwgYWxsIHRoZSBtZW1vcnkgaXQKKyAgICAgYWxsb2NhdGVkIGlzIGZyZWVkLCB0aGUgYXJlbmEgcmVsZWFzZXMgaW50ZXJuYWwgcmVmZXJlbmNlcyB0byByZWdpc3RlcmVkCisgICAgIFB5T2JqZWN0KiwgYW5kIG5vbmUgb2YgaXRzIHBvaW50ZXJzIGFyZSB2YWxpZC4KKyAgICAgWFhYICh0aW0pIFdoYXQgZG9lcyAibm9uZSBvZiBpdHMgcG9pbnRlcnMgYXJlIHZhbGlkIiBtZWFuPyAgRG9lcyBpdAorICAgICBYWFggbWVhbiB0aGF0IHBvaW50ZXJzIHByZXZpb3VzbHkgb2J0YWluZWQgdmlhIFB5QXJlbmFfTWFsbG9jKCkgYXJlCisgICAgIFhYWCBubyBsb25nZXIgdmFsaWQ/ICAoVGhhdCdzIGNsZWFybHkgdHJ1ZSwgYnV0IG5vdCBzdXJlIHRoYXQncyB3aGF0CisgICAgIFhYWCB0aGUgdGV4dCBpcyB0cnlpbmcgdG8gc2F5LikKKworICAgICBQeUFyZW5hX05ldygpIHJldHVybnMgYW4gYXJlbmEgcG9pbnRlci4gIE9uIGVycm9yLCBpdAorICAgICByZXR1cm5zIGEgbmVnYXRpdmUgbnVtYmVyIGFuZCBzZXRzIGFuIGV4Y2VwdGlvbi4KKyAgICAgWFhYICh0aW0pOiAgTm90IHRydWUuICBPbiBlcnJvciwgUHlBcmVuYV9OZXcoKSBhY3R1YWxseSByZXR1cm5zIE5VTEwsCisgICAgIFhYWCBhbmQgbG9va3MgbGlrZSBpdCBtYXkgb3IgbWF5IG5vdCBzZXQgYW4gZXhjZXB0aW9uIChlLmcuLCBpZiB0aGUKKyAgICAgWFhYIGludGVybmFsIFB5TGlzdF9OZXcoMCkgcmV0dXJucyBOVUxMLCBQeUFyZW5hX05ldygpIHBhc3NlcyB0aGF0IG9uCisgICAgIFhYWCBhbmQgYW4gZXhjZXB0aW9uIGlzIHNldDsgT1RPSCwgaWYgdGhlIGludGVybmFsCisgICAgIFhYWCBibG9ja19uZXcoREVGQVVMVF9CTE9DS19TSVpFKSByZXR1cm5zIE5VTEwsIHRoYXQncyBwYXNzZWQgb24gYnV0CisgICAgIFhYWCBhbiBleGNlcHRpb24gaXMgbm90IHNldCBpbiB0aGF0IGNhc2UpLgorICAqLworICBQeUFQSV9GVU5DKFB5QXJlbmEgKikgUHlBcmVuYV9OZXcodm9pZCk7CisgIFB5QVBJX0ZVTkModm9pZCkgUHlBcmVuYV9GcmVlKFB5QXJlbmEgKik7CisKKyAgLyogTW9zdGx5IGxpa2UgbWFsbG9jKCksIHJldHVybiB0aGUgYWRkcmVzcyBvZiBhIGJsb2NrIG9mIG1lbW9yeSBzcGFubmluZworICAgKiBgc2l6ZWAgYnl0ZXMsIG9yIHJldHVybiBOVUxMICh3aXRob3V0IHNldHRpbmcgYW4gZXhjZXB0aW9uKSBpZiBlbm91Z2gKKyAgICogbmV3IG1lbW9yeSBjYW4ndCBiZSBvYnRhaW5lZC4gIFVubGlrZSBtYWxsb2MoMCksIFB5QXJlbmFfTWFsbG9jKCkgd2l0aAorICAgKiBzaXplPTAgZG9lcyBub3QgZ3VhcmFudGVlIHRvIHJldHVybiBhIHVuaXF1ZSBwb2ludGVyICh0aGUgcG9pbnRlcgorICAgKiByZXR1cm5lZCBtYXkgZXF1YWwgb25lIG9yIG1vcmUgb3RoZXIgcG9pbnRlcnMgb2J0YWluZWQgZnJvbQorICAgKiBQeUFyZW5hX01hbGxvYygpKS4KKyAgICogTm90ZSB0aGF0IHBvaW50ZXJzIG9idGFpbmVkIHZpYSBQeUFyZW5hX01hbGxvYygpIG11c3QgbmV2ZXIgYmUgcGFzc2VkIHRvCisgICAqIHRoZSBzeXN0ZW0gZnJlZSgpIG9yIHJlYWxsb2MoKSwgb3IgdG8gYW55IG9mIFB5dGhvbidzIHNpbWlsYXIgbWVtb3J5LQorICAgKiBtYW5hZ2VtZW50IGZ1bmN0aW9ucy4gIFB5QXJlbmFfTWFsbG9jKCktb2J0YWluZWQgcG9pbnRlcnMgcmVtYWluIHZhbGlkCisgICAqIHVudGlsIFB5QXJlbmFfRnJlZShhcikgaXMgY2FsbGVkLCBhdCB3aGljaCBwb2ludCBhbGwgcG9pbnRlcnMgb2J0YWluZWQKKyAgICogZnJvbSB0aGUgYXJlbmEgYGFyYCBiZWNvbWUgaW52YWxpZCBzaW11bHRhbmVvdXNseS4KKyAgICovCisgIFB5QVBJX0ZVTkModm9pZCAqKSBQeUFyZW5hX01hbGxvYyhQeUFyZW5hICosIHNpemVfdCBzaXplKTsKKworICAvKiBUaGlzIHJvdXRpbmUgaXNuJ3QgYSBwcm9wZXIgYXJlbmEgYWxsb2NhdGlvbiByb3V0aW5lLiAgSXQgdGFrZXMKKyAgICogYSBQeU9iamVjdCogYW5kIHJlY29yZHMgaXQgc28gdGhhdCBpdCBjYW4gYmUgREVDUkVGZWQgd2hlbiB0aGUKKyAgICogYXJlbmEgaXMgZnJlZWQuCisgICAqLworICBQeUFQSV9GVU5DKGludCkgUHlBcmVuYV9BZGRQeU9iamVjdChQeUFyZW5hICosIFB5T2JqZWN0ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIVB5X1BZQVJFTkFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHljYXBzdWxlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weWNhcHN1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDY4MmZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHljYXBzdWxlLmgKQEAgLTAsMCArMSw1NiBAQAorCisvKiBDYXBzdWxlIG9iamVjdHMgbGV0IHlvdSB3cmFwIGEgQyAidm9pZCAqIiBwb2ludGVyIGluIGEgUHl0aG9uCisgICBvYmplY3QuICBUaGV5J3JlIGEgd2F5IG9mIHBhc3NpbmcgZGF0YSB0aHJvdWdoIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIKKyAgIHdpdGhvdXQgY3JlYXRpbmcgeW91ciBvd24gY3VzdG9tIHR5cGUuCisKKyAgIENhcHN1bGVzIGFyZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gZXh0ZW5zaW9uIG1vZHVsZXMuCisgICBUaGV5IHByb3ZpZGUgYSB3YXkgZm9yIGFuIGV4dGVuc2lvbiBtb2R1bGUgdG8gZXhwb3J0IGEgQyBpbnRlcmZhY2UKKyAgIHRvIG90aGVyIGV4dGVuc2lvbiBtb2R1bGVzLCBzbyB0aGF0IGV4dGVuc2lvbiBtb2R1bGVzIGNhbiB1c2UgdGhlCisgICBQeXRob24gaW1wb3J0IG1lY2hhbmlzbSB0byBsaW5rIHRvIG9uZSBhbm90aGVyLgorCisgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSAiYy1hcGkvY2Fwc3VsZS5odG1sIiBpbiB0aGUKKyAgIGRvY3VtZW50YXRpb24uCisqLworCisjaWZuZGVmIFB5X0NBUFNVTEVfSAorI2RlZmluZSBQeV9DQVBTVUxFX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5Q2Fwc3VsZV9UeXBlOworCit0eXBlZGVmIHZvaWQgKCpQeUNhcHN1bGVfRGVzdHJ1Y3RvcikoUHlPYmplY3QgKik7CisKKyNkZWZpbmUgUHlDYXBzdWxlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlDYXBzdWxlX1R5cGUpCisKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUNhcHN1bGVfTmV3KAorICAgIHZvaWQgKnBvaW50ZXIsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBQeUNhcHN1bGVfRGVzdHJ1Y3RvciBkZXN0cnVjdG9yKTsKKworUHlBUElfRlVOQyh2b2lkICopIFB5Q2Fwc3VsZV9HZXRQb2ludGVyKFB5T2JqZWN0ICpjYXBzdWxlLCBjb25zdCBjaGFyICpuYW1lKTsKKworUHlBUElfRlVOQyhQeUNhcHN1bGVfRGVzdHJ1Y3RvcikgUHlDYXBzdWxlX0dldERlc3RydWN0b3IoUHlPYmplY3QgKmNhcHN1bGUpOworCitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlDYXBzdWxlX0dldE5hbWUoUHlPYmplY3QgKmNhcHN1bGUpOworCitQeUFQSV9GVU5DKHZvaWQgKikgUHlDYXBzdWxlX0dldENvbnRleHQoUHlPYmplY3QgKmNhcHN1bGUpOworCitQeUFQSV9GVU5DKGludCkgUHlDYXBzdWxlX0lzVmFsaWQoUHlPYmplY3QgKmNhcHN1bGUsIGNvbnN0IGNoYXIgKm5hbWUpOworCitQeUFQSV9GVU5DKGludCkgUHlDYXBzdWxlX1NldFBvaW50ZXIoUHlPYmplY3QgKmNhcHN1bGUsIHZvaWQgKnBvaW50ZXIpOworCitQeUFQSV9GVU5DKGludCkgUHlDYXBzdWxlX1NldERlc3RydWN0b3IoUHlPYmplY3QgKmNhcHN1bGUsIFB5Q2Fwc3VsZV9EZXN0cnVjdG9yIGRlc3RydWN0b3IpOworCitQeUFQSV9GVU5DKGludCkgUHlDYXBzdWxlX1NldE5hbWUoUHlPYmplY3QgKmNhcHN1bGUsIGNvbnN0IGNoYXIgKm5hbWUpOworCitQeUFQSV9GVU5DKGludCkgUHlDYXBzdWxlX1NldENvbnRleHQoUHlPYmplY3QgKmNhcHN1bGUsIHZvaWQgKmNvbnRleHQpOworCitQeUFQSV9GVU5DKHZvaWQgKikgUHlDYXBzdWxlX0ltcG9ydChjb25zdCBjaGFyICpuYW1lLCBpbnQgbm9fYmxvY2spOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9DQVBTVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5Y29uZmlnLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weWNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYTdhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9weWNvbmZpZy5oCkBAIC0wLDAgKzEsMTI3OSBAQAorLyogcHljb25maWcuaC4gIEdlbmVyYXRlZCBmcm9tIHB5Y29uZmlnLmguaW4gYnkgY29uZmlndXJlLiAgKi8KKy8qIHB5Y29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCisKKworI2lmbmRlZiBQeV9QWUNPTkZJR19ICisjZGVmaW5lIFB5X1BZQ09ORklHX0gKKworCisvKiBEZWZpbmUgaWYgYnVpbGRpbmcgdW5pdmVyc2FsIChpbnRlcm5hbCBoZWxwZXIgbWFjcm8pICovCisvKiAjdW5kZWYgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxEICovCisKKy8qIERlZmluZSBmb3IgQUlYIGlmIHlvdXIgY29tcGlsZXIgaXMgYSBnZW51aW5lIElCTSB4bEMveGxDX3IgYW5kIHlvdSB3YW50CisgICBzdXBwb3J0IGZvciBBSVggQysrIHNoYXJlZCBleHRlbnNpb24gbW9kdWxlcy4gKi8KKy8qICN1bmRlZiBBSVhfR0VOVUlORV9DUExVU1BMVVMgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgQXRoZU9TIHRocmVhZHMuICovCisvKiAjdW5kZWYgQVRIRU9TX1RIUkVBRFMgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgQmVPUyB0aHJlYWRzLiAqLworLyogI3VuZGVmIEJFT1NfVEhSRUFEUyAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIE1hY2ggY3RocmVhZHMgcGFja2FnZSAqLworLyogI3VuZGVmIENfVEhSRUFEUyAqLworCisvKiBEZWZpbmUgaWYgQyBkb3VibGVzIGFyZSA2NC1iaXQgSUVFRSA3NTQgYmluYXJ5IGZvcm1hdCwgc3RvcmVkIGluIEFSTQorICAgbWl4ZWQtZW5kaWFuIG9yZGVyIChieXRlIG9yZGVyIDQ1NjcwMTIzKSAqLworLyogI3VuZGVmIERPVUJMRV9JU19BUk1fTUlYRURfRU5ESUFOX0lFRUU3NTQgKi8KKworLyogRGVmaW5lIGlmIEMgZG91YmxlcyBhcmUgNjQtYml0IElFRUUgNzU0IGJpbmFyeSBmb3JtYXQsIHN0b3JlZCB3aXRoIHRoZSBtb3N0CisgICBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCisvKiAjdW5kZWYgRE9VQkxFX0lTX0JJR19FTkRJQU5fSUVFRTc1NCAqLworCisvKiBEZWZpbmUgaWYgQyBkb3VibGVzIGFyZSA2NC1iaXQgSUVFRSA3NTQgYmluYXJ5IGZvcm1hdCwgc3RvcmVkIHdpdGggdGhlCisgICBsZWFzdCBzaWduaWZpY2FudCBieXRlIGZpcnN0ICovCisjZGVmaW5lIERPVUJMRV9JU19MSVRUTEVfRU5ESUFOX0lFRUU3NTQgMQorCisvKiBEZWZpbmUgaWYgLS1lbmFibGUtaXB2NiBpcyBzcGVjaWZpZWQgKi8KKy8qICN1bmRlZiBFTkFCTEVfSVBWNiAqLworCisvKiBEZWZpbmUgaWYgZmxvY2sgbmVlZHMgdG8gYmUgbGlua2VkIHdpdGggYnNkIGxpYnJhcnkuICovCisvKiAjdW5kZWYgRkxPQ0tfTkVFRFNfTElCQlNEICovCisKKy8qIERlZmluZSBpZiBnZXRwZ3JwKCkgbXVzdCBiZSBjYWxsZWQgYXMgZ2V0cGdycCgwKS4gKi8KKy8qICN1bmRlZiBHRVRQR1JQX0hBVkVfQVJHICovCisKKy8qIERlZmluZSBpZiBnZXR0aW1lb2ZkYXkoKSBkb2VzIG5vdCBoYXZlIHNlY29uZCAodGltZXpvbmUpIGFyZ3VtZW50IFRoaXMgaXMKKyAgIHRoZSBjYXNlIG9uIE1vdG9yb2xhIFY0IChSNDBWNC4yKSAqLworLyogI3VuZGVmIEdFVFRJTUVPRkRBWV9OT19UWiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGFjb3NoJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9BQ09TSCAxCisKKy8qIHN0cnVjdCBhZGRyaW5mbyAqLworI2RlZmluZSBIQVZFX0FERFJJTkZPIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBhbGFybScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQUxBUk0gMQorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3VyIHRpbWUuaCBkZWZpbmVzIGFsdHpvbmUuICovCisvKiAjdW5kZWYgSEFWRV9BTFRaT05FICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgYXNpbmgnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0FTSU5IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxhc20vdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfQVNNX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGF0YW5oJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9BVEFOSCAxCisKKy8qIERlZmluZSBpZiBHQ0Mgc3VwcG9ydHMgX19hdHRyaWJ1dGVfXygoZm9ybWF0KFB5QXJnX1BhcnNlVHVwbGUsIDIsIDMpKSkgKi8KKy8qICN1bmRlZiBIQVZFX0FUVFJJQlVURV9GT1JNQVRfUEFSU0VUVVBMRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJpbmRfdGV4dGRvbWFpbl9jb2Rlc2V0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9CSU5EX1RFWFRET01BSU5fQ09ERVNFVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Ymx1ZXRvb3RoL2JsdWV0b290aC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0JMVUVUT09USF9CTFVFVE9PVEhfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGJsdWV0b290aC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0JMVUVUT09USF9IICovCisKKy8qIERlZmluZSBpZiBuaWNlKCkgcmV0dXJucyBzdWNjZXNzL2ZhaWx1cmUgaW5zdGVhZCBvZiB0aGUgbmV3IHByaW9yaXR5LiAqLworLyogI3VuZGVmIEhBVkVfQlJPS0VOX05JQ0UgKi8KKworLyogRGVmaW5lIGlmIHRoZSBzeXN0ZW0gcmVwb3J0cyBhbiBpbnZhbGlkIFBJUEVfQlVGIHZhbHVlLiAqLworLyogI3VuZGVmIEhBVkVfQlJPS0VOX1BJUEVfQlVGICovCisKKy8qIERlZmluZSBpZiBwb2xsKCkgc2V0cyBlcnJubyBvbiBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvcnMuICovCisvKiAjdW5kZWYgSEFWRV9CUk9LRU5fUE9MTCAqLworCisvKiBEZWZpbmUgaWYgdGhlIFBvc2l4IHNlbWFwaG9yZXMgZG8gbm90IHdvcmsgb24geW91ciBzeXN0ZW0gKi8KKy8qICN1bmRlZiBIQVZFX0JST0tFTl9QT1NJWF9TRU1BUEhPUkVTICovCisKKy8qIERlZmluZSBpZiBwdGhyZWFkX3NpZ21hc2soKSBkb2VzIG5vdCB3b3JrIG9uIHlvdXIgc3lzdGVtLiAqLworLyogI3VuZGVmIEhBVkVfQlJPS0VOX1BUSFJFQURfU0lHTUFTSyAqLworCisvKiBkZWZpbmUgdG8gMSBpZiB5b3VyIHNlbV9nZXR2YWx1ZSBpcyBicm9rZW4uICovCisvKiAjdW5kZWYgSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFICovCisKKy8qIERlZmluZSBpZiBgdW5zZXRlbnZgIGRvZXMgbm90IHJldHVybiBhbiBpbnQuICovCisvKiAjdW5kZWYgSEFWRV9CUk9LRU5fVU5TRVRFTlYgKi8KKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIHR5cGUgX0Jvb2wuICovCisjZGVmaW5lIEhBVkVfQzk5X0JPT0wgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgJ2NoZmxhZ3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfQ0hGTEFHUyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNob3duJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DSE9XTiAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2Nocm9vdCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ0hST09UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBjbG9jaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ0xPQ0sgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvbmZzdHInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0NPTkZTVFIgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNvbmlvLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfQ09OSU9fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvcHlzaWduJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DT1BZU0lHTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgY3Rlcm1pZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfQ1RFUk1JRCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2N0ZXJtaWRfcicgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9DVEVSTUlEX1IgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjdXJzZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfQ1VSU0VTX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdpc190ZXJtX3Jlc2l6ZWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0NVUlNFU19JU19URVJNX1JFU0laRUQgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdyZXNpemV0ZXJtJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DVVJTRVNfUkVTSVpFVEVSTSAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3Jlc2l6ZV90ZXJtJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9DVVJTRVNfUkVTSVpFX1RFUk0gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYGlzZmluaXRlJywgYW5kIHRvIDAgaWYgeW91CisgICBkb24ndC4gKi8KKyNkZWZpbmUgSEFWRV9ERUNMX0lTRklOSVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGRlY2xhcmF0aW9uIG9mIGBpc2luZicsIGFuZCB0byAwIGlmIHlvdSBkb24ndC4KKyAgICovCisjZGVmaW5lIEhBVkVfREVDTF9JU0lORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBkZWNsYXJhdGlvbiBvZiBgaXNuYW4nLCBhbmQgdG8gMCBpZiB5b3UgZG9uJ3QuCisgICAqLworI2RlZmluZSBIQVZFX0RFQ0xfSVNOQU4gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGVjbGFyYXRpb24gb2YgYHR6bmFtZScsIGFuZCB0byAwIGlmIHlvdSBkb24ndC4KKyAgICovCisvKiAjdW5kZWYgSEFWRV9ERUNMX1RaTkFNRSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGV2aWNlIG1hY3Jvcy4gKi8KKyNkZWZpbmUgSEFWRV9ERVZJQ0VfTUFDUk9TIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIC9kZXYvcHRjIGRldmljZSBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfREVWX1BUQyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgL2Rldi9wdG14IGRldmljZSBmaWxlLiAqLworI2RlZmluZSBIQVZFX0RFVl9QVE1YIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlY3QuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9ESVJFQ1RfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGRpcmVudC5oPiBoZWFkZXIgZmlsZSwgYW5kIGl0IGRlZmluZXMgYERJUicuCisgICAqLworI2RlZmluZSBIQVZFX0RJUkVOVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkbG9wZW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0RMT1BFTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZHVwMicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRFVQMiAxCisKKy8qIERlZmluZWQgd2hlbiBhbnkgZHluYW1pYyBtb2R1bGUgbG9hZGluZyBpcyBlbmFibGVkLiAqLworI2RlZmluZSBIQVZFX0RZTkFNSUNfTE9BRElORyAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2Vwb2xsJyBmdW5jdGlvbnMuICovCisjZGVmaW5lIEhBVkVfRVBPTEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGVyZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRVJGIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBlcmZjJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9FUkZDIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxlcnJuby5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9FUlJOT19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBleGVjdicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRVhFQ1YgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGV4cG0xJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9FWFBNMSAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2ZjaGRpcicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRkNIRElSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmY2htb2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZDSE1PRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmNob3duJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GQ0hPV04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdmZGF0YXN5bmMnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0ZEQVRBU1lOQyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZmluaXRlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GSU5JVEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZsb2NrJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GTE9DSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm9yaycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRk9SSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZm9ya3B0eScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRk9SS1BUWSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZnBhdGhjb25mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9GUEFUSENPTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZzZWVrNjQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfRlNFRUs2NCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZzZWVrbycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlNFRUtPIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmc3RhdHZmcycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlNUQVRWRlMgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdmc3luYycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlNZTkMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0ZWxsNjQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfRlRFTEw2NCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0ZWxsbycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlRFTExPIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdGltZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlRJTUUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGZ0cnVuY2F0ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfRlRSVU5DQVRFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnYWlfc3RyZXJyb3InIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dBSV9TVFJFUlJPUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2FtbWEnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dBTU1BIDEKKworLyogRGVmaW5lIGlmIHdlIGNhbiB1c2UgZ2NjIGlubGluZSBhc3NlbWJsZXIgdG8gZ2V0IGFuZCBzZXQgeDg3IGNvbnRyb2wgd29yZAorICAgKi8KKyNkZWZpbmUgSEFWRV9HQ0NfQVNNX0ZPUl9YODcgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIGdldGFkZHJpbmZvIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVEFERFJJTkZPIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRjd2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVENXRCAxCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIGZsb2NrZmlsZSgpLCBnZXRjX3VubG9ja2VkKCksIGFuZCBmdW5sb2NrZmlsZSgpICovCisjZGVmaW5lIEhBVkVfR0VUQ19VTkxPQ0tFRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0Z3JvdXBzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRHUk9VUFMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGhvc3RieW5hbWUnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfR0VUSE9TVEJZTkFNRSAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSBzb21lIHZlcnNpb24gb2YgZ2V0aG9zdGJ5bmFtZV9yKCkgKi8KKyNkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1IgMQorCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgMy1hcmcgdmVyc2lvbiBvZiBnZXRob3N0YnluYW1lX3IoKS4gKi8KKy8qICN1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUl8zX0FSRyAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgNS1hcmcgdmVyc2lvbiBvZiBnZXRob3N0YnluYW1lX3IoKS4gKi8KKy8qICN1bmRlZiBIQVZFX0dFVEhPU1RCWU5BTUVfUl81X0FSRyAqLworCisvKiBEZWZpbmUgdGhpcyBpZiB5b3UgaGF2ZSB0aGUgNi1hcmcgdmVyc2lvbiBvZiBnZXRob3N0YnluYW1lX3IoKS4gKi8KKyNkZWZpbmUgSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9BUkcgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldGl0aW1lcicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUSVRJTUVSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRsb2FkYXZnJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRMT0FEQVZHIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRsb2dpbicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUTE9HSU4gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldG5hbWVpbmZvJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVROQU1FSU5GTyAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2dldHBhZ2VzaXplJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRQQUdFU0laRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGVlcm5hbWUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFBFRVJOQU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZ2lkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRQR0lEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwZ3JwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRQR1JQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwaWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFBJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cHJpb3JpdHknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFBSSU9SSVRZIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRwd2VudCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUUFdFTlQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHJlc2dpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfR0VUUkVTR0lEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXRyZXN1aWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFJFU1VJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0c2lkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRTSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGdldHNwZW50JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9HRVRTUEVOVCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0c3BuYW0nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFNQTkFNIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBnZXR0aW1lb2ZkYXknIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFRJTUVPRkRBWSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0d2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0dFVFdEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxncnAuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfR1JQX0ggMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdoc3RyZXJyb3InIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0hTVFJFUlJPUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaHlwb3QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0hZUE9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpZWVlZnAuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9JRUVFRlBfSCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdpbmV0X2F0b24nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0lORVRfQVRPTiAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2luZXRfcHRvbicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfSU5FVF9QVE9OIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBpbml0Z3JvdXBzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9JTklUR1JPVVBTIDEKKworLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgaW50MzJfdC4gKi8KKyNkZWZpbmUgSEFWRV9JTlQzMl9UIDEKKworLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgaW50NjRfdC4gKi8KKyNkZWZpbmUgSEFWRV9JTlQ2NF9UIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpby5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0lPX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBraWxsJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9LSUxMIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBraWxscGcnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0tJTExQRyAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2txdWV1ZScgZnVuY3Rpb25zLiAqLworLyogI3VuZGVmIEhBVkVfS1FVRVVFICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGFuZ2luZm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTEFOR0lORk9fSCAxCisKKy8qIERlZmluZWQgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydCB3aGVuIGFuIG9mZl90IGlzIGJpZ2dlciB0aGFuIGEgbG9uZworICAgYW5kIGxvbmcgbG9uZyBpcyBhdmFpbGFibGUgYW5kIGF0IGxlYXN0IGFzIGJpZyBhcyBhbiBvZmZfdC4gWW91IG1heSBuZWVkIHRvCisgICBhZGQgc29tZSBmbGFncyBmb3IgY29uZmlndXJhdGlvbiBhbmQgY29tcGlsYXRpb24gdG8gZW5hYmxlIHRoaXMgbW9kZS4gKEZvcgorICAgU29sYXJpcyBhbmQgTGludXgsIHRoZSBuZWNlc3NhcnkgZGVmaW5lcyBhcmUgYWxyZWFkeSBkZWZpbmVkLikgKi8KKy8qICN1bmRlZiBIQVZFX0xBUkdFRklMRV9TVVBQT1JUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSAnbGNoZmxhZ3MnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTENIRkxBR1MgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBsY2htb2QnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfTENITU9EICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbGNob3duJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9MQ0hPV04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxnYW1tYScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTEdBTU1BIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBkbCcgbGlicmFyeSAoLWxkbCkuICovCisjZGVmaW5lIEhBVkVfTElCREwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGRsZCcgbGlicmFyeSAoLWxkbGQpLiAqLworLyogI3VuZGVmIEhBVkVfTElCRExEICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgaWVlZScgbGlicmFyeSAoLWxpZWVlKS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJQklFRUUgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaWJpbnRsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0xJQklOVExfSCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgcmVhZGxpbmUgbGlicmFyeSAoLWxyZWFkbGluZSkuICovCisvKiAjdW5kZWYgSEFWRV9MSUJSRUFETElORSAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJlc29sdicgbGlicmFyeSAoLWxyZXNvbHYpLiAqLworLyogI3VuZGVmIEhBVkVfTElCUkVTT0xWICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGlidXRpbC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX0xJQlVUSUxfSCAqLworCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdsaW5rJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9MSU5LIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW51eC9uZXRsaW5rLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX0xJTlVYX05FVExJTktfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bGludXgvdGlwYy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9MSU5VWF9USVBDX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGxvZzFwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9MT0cxUCAxCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRoZSB0eXBlIGxvbmcgZG91YmxlLiAqLworI2RlZmluZSBIQVZFX0xPTkdfRE9VQkxFIDEKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIHR5cGUgbG9uZyBsb25nLiAqLworI2RlZmluZSBIQVZFX0xPTkdfTE9ORyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbHN0YXQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX0xTVEFUIDEKKworLyogRGVmaW5lIHRoaXMgaWYgeW91IGhhdmUgdGhlIG1ha2VkZXYgbWFjcm8uICovCisjZGVmaW5lIEhBVkVfTUFLRURFViAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtbW92ZScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfTUVNTU9WRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8bWVtb3J5Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX01FTU9SWV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBta2ZpZm8nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01LRklGTyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWtub2QnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01LTk9EIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBta3RpbWUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX01LVElNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbXJlbWFwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NUkVNQVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5jdXJzZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTkNVUlNFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxuZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4gKi8KKy8qICN1bmRlZiBIQVZFX05ESVJfSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG5ldHBhY2tldC9wYWNrZXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfTkVUUEFDS0VUX1BBQ0tFVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBuaWNlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9OSUNFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBvcGVucHR5JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9PUEVOUFRZIDEKKworLyogRGVmaW5lIGlmIGNvbXBpbGluZyB1c2luZyBNYWNPUyBYIDEwLjUgU0RLIG9yIGxhdGVyLiAqLworLyogI3VuZGVmIEhBVkVfT1NYMTA1X1NESyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBhdGhjb25mJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QQVRIQ09ORiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcGF1c2UnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BBVVNFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwbG9jaycgZnVuY3Rpb24uICovCisvKiAjdW5kZWYgSEFWRV9QTE9DSyAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHBvbGwnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1BPTEwgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHBvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfUE9MTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxwcm9jZXNzLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfUFJPQ0VTU19IICovCisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHN1cHBvcnRzIGZ1bmN0aW9uIHByb3RvdHlwZSAqLworI2RlZmluZSBIQVZFX1BST1RPVFlQRVMgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgR05VIFBUSCB0aHJlYWRzLiAqLworLyogI3VuZGVmIEhBVkVfUFRIICovCisKKy8qIERlZmluZWQgZm9yIFNvbGFyaXMgMi42IGJ1ZyBpbiBwdGhyZWFkIGhlYWRlci4gKi8KKy8qICN1bmRlZiBIQVZFX1BUSFJFQURfREVTVFJVQ1RPUiAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0aHJlYWQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfUFRIUkVBRF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBwdGhyZWFkX2luaXQnIGZ1bmN0aW9uLiAqLworLyogI3VuZGVmIEhBVkVfUFRIUkVBRF9JTklUICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHRocmVhZF9zaWdtYXNrJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QVEhSRUFEX1NJR01BU0sgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHB0eS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9QVFlfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcHV0ZW52JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9QVVRFTlYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHJlYWRsaW5rJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9SRUFETElOSyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgcmVhbHBhdGgnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1JFQUxQQVRIIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHJlYWRsaW5lIDIuMSAqLworLyogI3VuZGVmIEhBVkVfUkxfQ0FMTEJBQ0sgKi8KKworLyogRGVmaW5lIGlmIHlvdSBjYW4gdHVybiBvZmYgcmVhZGxpbmUncyBzaWduYWwgaGFuZGxpbmcuICovCisvKiAjdW5kZWYgSEFWRV9STF9DQVRDSF9TSUdOQUwgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHJlYWRsaW5lIDIuMiAqLworLyogI3VuZGVmIEhBVkVfUkxfQ09NUExFVElPTl9BUFBFTkRfQ0hBUkFDVEVSICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSByZWFkbGluZSA0LjAgKi8KKy8qICN1bmRlZiBIQVZFX1JMX0NPTVBMRVRJT05fRElTUExBWV9NQVRDSEVTX0hPT0sgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHJlYWRsaW5lIDQuMiAqLworLyogI3VuZGVmIEhBVkVfUkxfQ09NUExFVElPTl9NQVRDSEVTICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBybF9jb21wbGV0aW9uX3N1cHByZXNzX2FwcGVuZCAqLworLyogI3VuZGVmIEhBVkVfUkxfQ09NUExFVElPTl9TVVBQUkVTU19BUFBFTkQgKi8KKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHJlYWRsaW5lIDQuMCAqLworLyogI3VuZGVmIEhBVkVfUkxfUFJFX0lOUFVUX0hPT0sgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGByb3VuZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfUk9VTkQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNlbGVjdCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VMRUNUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZW1fZ2V0dmFsdWUnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFTV9HRVRWQUxVRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2VtX29wZW4nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFTV9PUEVOIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZW1fdGltZWR3YWl0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRU1fVElNRURXQUlUIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZW1fdW5saW5rJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRU1fVU5MSU5LIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRlZ2lkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRFR0lEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRldWlkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRFVUlEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRnaWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVEdJRCAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3NldGdyb3VwcycgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUR1JPVVBTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRpdGltZXInIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVElUSU1FUiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0bG9jYWxlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRMT0NBTEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHBnaWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVFBHSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHBncnAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVFBHUlAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJlZ2lkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRSRUdJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0cmVzZ2lkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TRVRSRVNHSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHJlc3VpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUUkVTVUlEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXRyZXVpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUUkVVSUQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHNldHNpZCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUU0lEIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzZXR1aWQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NFVFVJRCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2V0dmJ1ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU0VUVkJVRiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2hhZG93Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NIQURPV19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdhY3Rpb24nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NJR0FDVElPTiAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lnaW50ZXJydXB0JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TSUdJTlRFUlJVUFQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc2lncmVsc2UnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NJR1JFTFNFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzbnByaW50ZicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfU05QUklOVEYgMQorCisvKiBEZWZpbmUgaWYgc29ja2FkZHIgaGFzIHNhX2xlbiBtZW1iZXIgKi8KKy8qICN1bmRlZiBIQVZFX1NPQ0tBRERSX1NBX0xFTiAqLworCisvKiBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSAoc3lzL3NvY2tldC5oKSAqLworI2RlZmluZSBIQVZFX1NPQ0tBRERSX1NUT1JBR0UgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdzb2NrZXRwYWlyJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TT0NLRVRQQUlSIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzcGF3bi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TUEFXTl9IIDEKKworLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgc3NpemVfdCAqLworI2RlZmluZSBIQVZFX1NTSVpFX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0YXR2ZnMnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NUQVRWRlMgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgc3RydWN0IHN0YXQuc3RfbXRpbS50dl9uc2VjICovCisjZGVmaW5lIEhBVkVfU1RBVF9UVl9OU0VDIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHN0cnVjdCBzdGF0LnN0X210aW1lbnNlYyAqLworLyogI3VuZGVmIEhBVkVfU1RBVF9UVl9OU0VDMiAqLworCisvKiBEZWZpbmUgaWYgeW91ciBjb21waWxlciBzdXBwb3J0cyB2YXJpYWJsZSBsZW5ndGggZnVuY3Rpb24gcHJvdG90eXBlcyAoZS5nLgorICAgdm9pZCBmcHJpbnRmKEZJTEUgKiwgY2hhciAqLCAuLi4pOykgKmFuZCogPHN0ZGFyZy5oPiAqLworI2RlZmluZSBIQVZFX1NUREFSR19QUk9UT1RZUEVTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRpbnQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERMSUJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgc3RyZHVwJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJEVVAgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmZ0aW1lJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9TVFJGVElNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5ncy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3Ryb3B0cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVFJPUFRTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiBgc3RfYmlydGh0aW1lJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHN0YXQnLiAqLworLyogI3VuZGVmIEhBVkVfU1RSVUNUX1NUQVRfU1RfQklSVEhUSU1FICovCisKKy8qIERlZmluZSB0byAxIGlmIGBzdF9ibGtzaXplJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHN0YXQnLiAqLworI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMS1NJWkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiBgc3RfYmxvY2tzJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHN0YXQnLiAqLworI2RlZmluZSBIQVZFX1NUUlVDVF9TVEFUX1NUX0JMT0NLUyAxCisKKy8qIERlZmluZSB0byAxIGlmIGBzdF9mbGFncycgaXMgYSBtZW1iZXIgb2YgYHN0cnVjdCBzdGF0Jy4gKi8KKy8qICN1bmRlZiBIQVZFX1NUUlVDVF9TVEFUX1NUX0ZMQUdTICovCisKKy8qIERlZmluZSB0byAxIGlmIGBzdF9nZW4nIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc3RhdCcuICovCisvKiAjdW5kZWYgSEFWRV9TVFJVQ1RfU1RBVF9TVF9HRU4gKi8KKworLyogRGVmaW5lIHRvIDEgaWYgYHN0X3JkZXYnIGlzIGEgbWVtYmVyIG9mIGBzdHJ1Y3Qgc3RhdCcuICovCisjZGVmaW5lIEhBVkVfU1RSVUNUX1NUQVRfU1RfUkRFViAxCisKKy8qIERlZmluZSB0byAxIGlmIGB0bV96b25lJyBpcyBhIG1lbWJlciBvZiBgc3RydWN0IHRtJy4gKi8KKyNkZWZpbmUgSEFWRV9TVFJVQ1RfVE1fVE1fWk9ORSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdXIgYHN0cnVjdCBzdGF0JyBoYXMgYHN0X2Jsb2NrcycuIERlcHJlY2F0ZWQsIHVzZQorICAgYEhBVkVfU1RSVUNUX1NUQVRfU1RfQkxPQ0tTJyBpbnN0ZWFkLiAqLworI2RlZmluZSBIQVZFX1NUX0JMT0NLUyAxCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3N5bWxpbmsnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NZTUxJTksgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN5c2NvbmYnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1NZU0NPTkYgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5c2V4aXRzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU0VYSVRTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9hdWRpb2lvLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX0FVRElPSU9fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9ic2R0dHkuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TWVNfQlNEVFRZX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4KKyAgICovCisvKiAjdW5kZWYgSEFWRV9TWVNfRElSX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvZXBvbGwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX0VQT0xMX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9ldmVudC5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19FVkVOVF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX0ZJTEVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2xvYWRhdmcuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TWVNfTE9BREFWR19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2xvY2suaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TWVNfTE9DS19IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL21rZGV2Lmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfU1lTX01LREVWX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvbW9kZW0uaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9TWVNfTU9ERU1fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9uZGlyLmg+IGhlYWRlciBmaWxlLCBhbmQgaXQgZGVmaW5lcyBgRElSJy4KKyAgICovCisvKiAjdW5kZWYgSEFWRV9TWVNfTkRJUl9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3BhcmFtLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19QQVJBTV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfUE9MTF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvcmVzb3VyY2UuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1JFU09VUkNFX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zZWxlY3QuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NFTEVDVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc29ja2V0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TT0NLRVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXR2ZnMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRWRlNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3Rlcm1pby5oPiBoZWFkZXIgZmlsZS4gKi8KKy8qICN1bmRlZiBIQVZFX1NZU19URVJNSU9fSCAqLworCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfVElNRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWUuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdW4uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1VOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91dHNuYW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19VVFNOQU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy93YWl0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19XQUlUX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRjZ2V0cGdycCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVENHRVRQR1JQIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0Y3NldHBncnAnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RDU0VUUEdSUCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGVtcG5hbScgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVEVNUE5BTSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGVybWlvcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9URVJNSU9TX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHRlcm0uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfVEVSTV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0Z2FtbWEnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RHQU1NQSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dGhyZWFkLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfVEhSRUFEX0ggKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0aW1lZ20nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RJTUVHTSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdGltZXMnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RJTUVTIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0bXBmaWxlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UTVBGSUxFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB0bXBuYW0nIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RNUE5BTSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdG1wbmFtX3InIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1RNUE5BTV9SIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciBgc3RydWN0IHRtJyBoYXMgYHRtX3pvbmUnLiBEZXByZWNhdGVkLCB1c2UKKyAgIGBIQVZFX1NUUlVDVF9UTV9UTV9aT05FJyBpbnN0ZWFkLiAqLworI2RlZmluZSBIQVZFX1RNX1pPTkUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHRydW5jYXRlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9UUlVOQ0FURSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBkb24ndCBoYXZlIGB0bV96b25lJyBidXQgZG8gaGF2ZSB0aGUgZXh0ZXJuYWwgYXJyYXkKKyAgIGB0em5hbWUnLiAqLworLyogI3VuZGVmIEhBVkVfVFpOQU1FICovCisKKy8qIERlZmluZSB0aGlzIGlmIHlvdSBoYXZlIHRjbCBhbmQgVENMX1VURl9NQVg9PTYgKi8KKy8qICN1bmRlZiBIQVZFX1VDUzRfVENMICovCisKKy8qIERlZmluZSBpZiB5b3VyIGNvbXBpbGVyIHByb3ZpZGVzIHVpbnQzMl90LiAqLworI2RlZmluZSBIQVZFX1VJTlQzMl9UIDEKKworLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgcHJvdmlkZXMgdWludDY0X3QuICovCisjZGVmaW5lIEhBVkVfVUlOVDY0X1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB0aGUgc3lzdGVtIGhhcyB0aGUgdHlwZSBgdWludHB0cl90Jy4gKi8KKyNkZWZpbmUgSEFWRV9VSU5UUFRSX1QgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHVuYW1lJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9VTkFNRSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1VOSVNURF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB1bnNldGVudicgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfVU5TRVRFTlYgMQorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgYSB1c2VhYmxlIHdjaGFyX3QgdHlwZSBkZWZpbmVkIGluIHdjaGFyLmg7IHVzZWFibGUgbWVhbnMKKyAgIHdjaGFyX3QgbXVzdCBiZSBhbiB1bnNpZ25lZCB0eXBlIHdpdGggYXQgbGVhc3QgMTYgYml0cy4gKHNlZQorICAgSW5jbHVkZS91bmljb2Rlb2JqZWN0LmgpLiAqLworLyogI3VuZGVmIEhBVkVfVVNBQkxFX1dDSEFSX1QgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDx1dGlsLmg+IGhlYWRlciBmaWxlLiAqLworLyogI3VuZGVmIEhBVkVfVVRJTF9IICovCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgdXRpbWVzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9VVElNRVMgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHV0aW1lLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1VUSU1FX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHdhaXQzJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9XQUlUMyAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2FpdDQnIGZ1bmN0aW9uLiAqLworI2RlZmluZSBIQVZFX1dBSVQ0IDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGB3YWl0cGlkJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9XQUlUUElEIDEKKworLyogRGVmaW5lIGlmIHRoZSBjb21waWxlciBwcm92aWRlcyBhIHdjaGFyLmggaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfV0NIQVJfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgd2NzY29sbCcgZnVuY3Rpb24uICovCisjZGVmaW5lIEhBVkVfV0NTQ09MTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2luc29jazIuaD4gaGVhZGVyIGZpbGUuICovCisvKiAjdW5kZWYgSEFWRV9XSU5TT0NLMl9IICovCisKKy8qIERlZmluZSBpZiB0enNldCgpIGFjdHVhbGx5IHN3aXRjaGVzIHRoZSBsb2NhbCB0aW1lem9uZSBpbiBhIG1lYW5pbmdmdWwgd2F5LgorICAgKi8KKyNkZWZpbmUgSEFWRV9XT1JLSU5HX1RaU0VUIDEKKworLyogRGVmaW5lIGlmIHRoZSB6bGliIGxpYnJhcnkgaGFzIGluZmxhdGVDb3B5ICovCisjZGVmaW5lIEhBVkVfWkxJQl9DT1BZIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBfZ2V0cHR5JyBmdW5jdGlvbi4gKi8KKy8qICN1bmRlZiBIQVZFX19HRVRQVFkgKi8KKworLyogRGVmaW5lIGlmIHlvdSBhcmUgdXNpbmcgTWFjaCBjdGhyZWFkcyBkaXJlY3RseSB1bmRlciAvaW5jbHVkZSAqLworLyogI3VuZGVmIEhVUkRfQ19USFJFQURTICovCisKKy8qIERlZmluZSBpZiB5b3UgYXJlIHVzaW5nIE1hY2ggY3RocmVhZHMgdW5kZXIgbWFjaCAvICovCisvKiAjdW5kZWYgTUFDSF9DX1RIUkVBRFMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgYG1ham9yJywgYG1pbm9yJywgYW5kIGBtYWtlZGV2JyBhcmUgZGVjbGFyZWQgaW4gPG1rZGV2Lmg+LgorICAgKi8KKy8qICN1bmRlZiBNQUpPUl9JTl9NS0RFViAqLworCisvKiBEZWZpbmUgdG8gMSBpZiBgbWFqb3InLCBgbWlub3InLCBhbmQgYG1ha2VkZXYnIGFyZSBkZWNsYXJlZCBpbgorICAgPHN5c21hY3Jvcy5oPi4gKi8KKy8qICN1bmRlZiBNQUpPUl9JTl9TWVNNQUNST1MgKi8KKworLyogRGVmaW5lIGlmIG12d2RlbGNoIGluIGN1cnNlcy5oIGlzIGFuIGV4cHJlc3Npb24uICovCisjZGVmaW5lIE1WV0RFTENIX0lTX0VYUFJFU1NJT04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3Ugd2FudCB0byB1c2UgbmF0aXZlIE5UIHRocmVhZHMgKi8KKy8qICN1bmRlZiBOVF9USFJFQURTICovCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworLyogI3VuZGVmIFBBQ0tBR0VfQlVHUkVQT1JUICovCisKKy8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX05BTUUgKi8KKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworLyogI3VuZGVmIFBBQ0tBR0VfU1RSSU5HICovCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX1RBUk5BTUUgKi8KKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKy8qICN1bmRlZiBQQUNLQUdFX1VSTCAqLworCisvKiBEZWZpbmUgdG8gdGhlIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworLyogI3VuZGVmIFBBQ0tBR0VfVkVSU0lPTiAqLworCisvKiBEZWZpbmUgaWYgUE9TSVggc2VtYXBob3JlcyBhcmVuJ3QgZW5hYmxlZCBvbiB5b3VyIHN5c3RlbSAqLworLyogI3VuZGVmIFBPU0lYX1NFTUFQSE9SRVNfTk9UX0VOQUJMRUQgKi8KKworLyogRGVmaW5lZCBpZiBQVEhSRUFEX1NDT1BFX1NZU1RFTSBzdXBwb3J0ZWQuICovCisjZGVmaW5lIFBUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCAxCisKKy8qIERlZmluZSBhcyB0aGUgcHJlZmVycmVkIHNpemUgaW4gYml0cyBvZiBsb25nIGRpZ2l0cyAqLworLyogI3VuZGVmIFBZTE9OR19CSVRTX0lOX0RJR0lUICovCisKKy8qIERlZmluZSB0byBwcmludGYgZm9ybWF0IG1vZGlmaWVyIGZvciBsb25nIGxvbmcgdHlwZSAqLworI2RlZmluZSBQWV9GT1JNQVRfTE9OR19MT05HICJsbCIKKworLyogRGVmaW5lIHRvIHByaW50ZiBmb3JtYXQgbW9kaWZpZXIgZm9yIFB5X3NzaXplX3QgKi8KKyNkZWZpbmUgUFlfRk9STUFUX1NJWkVfVCAieiIKKworLyogRGVmaW5lIGFzIHRoZSBpbnRlZ3JhbCB0eXBlIHVzZWQgZm9yIFVuaWNvZGUgcmVwcmVzZW50YXRpb24uICovCisjZGVmaW5lIFBZX1VOSUNPREVfVFlQRSB1bnNpZ25lZCBzaG9ydAorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gYnVpbGQgYW4gaW50ZXJwcmV0ZXIgd2l0aCBtYW55IHJ1bi10aW1lIGNoZWNrcy4gKi8KKy8qICN1bmRlZiBQeV9ERUJVRyAqLworCisvKiBEZWZpbmVkIGlmIFB5dGhvbiBpcyBidWlsdCBhcyBhIHNoYXJlZCBsaWJyYXJ5LiAqLworLyogI3VuZGVmIFB5X0VOQUJMRV9TSEFSRUQgKi8KKworLyogRGVmaW5lIGFzIHRoZSBzaXplIG9mIHRoZSB1bmljb2RlIHR5cGUuICovCisjZGVmaW5lIFB5X1VOSUNPREVfU0laRSAyCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byBoYXZlIGEgVW5pY29kZSB0eXBlLiAqLworI2RlZmluZSBQeV9VU0lOR19VTklDT0RFIDEKKworLyogUkVQQVJTRV9EQVRBX0JVRkZFUiBpbiB3aW5udC5oICovCisvKiAjdW5kZWYgUkVQQVJTRV9EQVRBX0JVRkZFUl9JTl9XSU5OVCAqLworCisvKiBhc3N1bWUgQzg5IHNlbWFudGljcyB0aGF0IFJFVFNJR1RZUEUgaXMgYWx3YXlzIHZvaWQgKi8KKyNkZWZpbmUgUkVUU0lHVFlQRSB2b2lkCisKKy8qIERlZmluZSBpZiBzZXRwZ3JwKCkgbXVzdCBiZSBjYWxsZWQgYXMgc2V0cGdycCgwLCAwKS4gKi8KKy8qICN1bmRlZiBTRVRQR1JQX0hBVkVfQVJHICovCisKKy8qIERlZmluZSB0aGlzIHRvIGJlIGV4dGVuc2lvbiBvZiBzaGFyZWQgbGlicmFyaWVzIChpbmNsdWRpbmcgdGhlIGRvdCEpLiAqLworI2RlZmluZSBTSExJQl9FWFQgIi5zbyIKKworLyogRGVmaW5lIGlmIGk+PmogZm9yIHNpZ25lZCBpbnQgaSBkb2VzIG5vdCBleHRlbmQgdGhlIHNpZ24gYml0IHdoZW4gaSA8IDAgKi8KKy8qICN1bmRlZiBTSUdORURfUklHSFRfU0hJRlRfWkVST19GSUxMUyAqLworCisvKiBUaGUgc2l6ZSBvZiBgZG91YmxlJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfRE9VQkxFIDgKKworLyogVGhlIHNpemUgb2YgYGZsb2F0JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfRkxPQVQgNAorCisvKiBUaGUgc2l6ZSBvZiBgZnBvc190JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfRlBPU19UIDE2CisKKy8qIFRoZSBzaXplIG9mIGBpbnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9JTlQgNAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZycsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX0xPTkcgOAorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZyBkb3VibGUnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9MT05HX0RPVUJMRSAxNgorCisvKiBUaGUgc2l6ZSBvZiBgbG9uZyBsb25nJywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfTE9OR19MT05HIDgKKworLyogVGhlIHNpemUgb2YgYG9mZl90JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfT0ZGX1QgOAorCisvKiBUaGUgc2l6ZSBvZiBgcGlkX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9QSURfVCA0CisKKy8qIFRoZSBzaXplIG9mIGBwdGhyZWFkX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgOAorCisvKiBUaGUgc2l6ZSBvZiBgc2hvcnQnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9TSE9SVCAyCisKKy8qIFRoZSBzaXplIG9mIGBzaXplX3QnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9TSVpFX1QgOAorCisvKiBUaGUgc2l6ZSBvZiBgdGltZV90JywgYXMgY29tcHV0ZWQgYnkgc2l6ZW9mLiAqLworI2RlZmluZSBTSVpFT0ZfVElNRV9UIDgKKworLyogVGhlIHNpemUgb2YgYHVpbnRwdHJfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1VJTlRQVFJfVCA4CisKKy8qIFRoZSBzaXplIG9mIGB2b2lkIConLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9WT0lEX1AgOAorCisvKiBUaGUgc2l6ZSBvZiBgd2NoYXJfdCcsIGFzIGNvbXB1dGVkIGJ5IHNpemVvZi4gKi8KKyNkZWZpbmUgU0laRU9GX1dDSEFSX1QgNAorCisvKiBUaGUgc2l6ZSBvZiBgX0Jvb2wnLCBhcyBjb21wdXRlZCBieSBzaXplb2YuICovCisjZGVmaW5lIFNJWkVPRl9fQk9PTCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBEZWZpbmUgaWYgeW91IGNhbiBzYWZlbHkgaW5jbHVkZSBib3RoIDxzeXMvc2VsZWN0Lmg+IGFuZCA8c3lzL3RpbWUuaD4KKyAgICh3aGljaCB5b3UgY2FuJ3Qgb24gU0NPIE9EVCAzLjApLiAqLworI2RlZmluZSBTWVNfU0VMRUNUX1dJVEhfU1lTX1RJTUUgMQorCisvKiBEZWZpbmUgaWYgdGFuaCgtMC4pIGlzIC0wLiwgb3IgaWYgcGxhdGZvcm0gZG9lc24ndCBoYXZlIHNpZ25lZCB6ZXJvcyAqLworI2RlZmluZSBUQU5IX1BSRVNFUlZFU19aRVJPX1NJR04gMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgY2FuIHNhZmVseSBpbmNsdWRlIGJvdGggPHN5cy90aW1lLmg+IGFuZCA8dGltZS5oPi4gKi8KKyNkZWZpbmUgVElNRV9XSVRIX1NZU19USU1FIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91ciA8c3lzL3RpbWUuaD4gZGVjbGFyZXMgYHN0cnVjdCB0bScuICovCisvKiAjdW5kZWYgVE1fSU5fU1lTX1RJTUUgKi8KKworLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gQUlYIDMsIEludGVyaXguICAqLworI2lmbmRlZiBfQUxMX1NPVVJDRQorIyBkZWZpbmUgX0FMTF9TT1VSQ0UgMQorI2VuZGlmCisvKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCisjaWZuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAxCisjZW5kaWYKKy8qIEVuYWJsZSB0aHJlYWRpbmcgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTCisjIGRlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMQorI2VuZGlmCisvKiBFbmFibGUgZXh0ZW5zaW9ucyBvbiBIUCBOb25TdG9wLiAgKi8KKyNpZm5kZWYgX1RBTkRFTV9TT1VSQ0UKKyMgZGVmaW5lIF9UQU5ERU1fU09VUkNFIDEKKyNlbmRpZgorLyogRW5hYmxlIGdlbmVyYWwgZXh0ZW5zaW9ucyBvbiBTb2xhcmlzLiAgKi8KKyNpZm5kZWYgX19FWFRFTlNJT05TX18KKyMgZGVmaW5lIF9fRVhURU5TSU9OU19fIDEKKyNlbmRpZgorCisKKy8qIERlZmluZSBpZiB5b3Ugd2FudCB0byB1c2UgTWFjUHl0aG9uIG1vZHVsZXMgb24gTWFjT1NYIGluIHVuaXgtUHl0aG9uLiAqLworLyogI3VuZGVmIFVTRV9UT09MQk9YX09CSkVDVF9HTFVFICovCisKKy8qIERlZmluZSBpZiBhIHZhX2xpc3QgaXMgYW4gYXJyYXkgb2Ygc29tZSBraW5kICovCisjZGVmaW5lIFZBX0xJU1RfSVNfQVJSQVkgMQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgU0lHRlBFIGhhbmRsZWQgKHNlZSBJbmNsdWRlL3B5ZnBlLmgpLiAqLworLyogI3VuZGVmIFdBTlRfU0lHRlBFX0hBTkRMRVIgKi8KKworLyogRGVmaW5lIGlmIHlvdSB3YW50IHdjdHlwZS5oIGZ1bmN0aW9ucyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9uZQorICAgc3VwcGxpZWQgYnkgUHl0aG9uIGl0c2VsZi4gKHNlZSBJbmNsdWRlL3VuaWNvZGVjdHlwZS5oKS4gKi8KKy8qICN1bmRlZiBXQU5UX1dDVFlQRV9GVU5DVElPTlMgKi8KKworLyogRGVmaW5lIGlmIFdJTkRPVyBpbiBjdXJzZXMuaCBvZmZlcnMgYSBmaWVsZCBfZmxhZ3MuICovCisjZGVmaW5lIFdJTkRPV19IQVNfRkxBR1MgMQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIGluIGV4dGVuc2lvbiBtb2R1bGVzICovCisjZGVmaW5lIFdJVEhfRE9DX1NUUklOR1MgMQorCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZSBuZXctc3R5bGUgKE9wZW5zdGVwLCBSaGFwc29keSwgTWFjT1MpIGR5bmFtaWMKKyAgIGxpbmtlciAoZHlsZCkgaW5zdGVhZCBvZiB0aGUgb2xkLXN0eWxlIChOZXh0U3RlcCkgZHluYW1pYyBsaW5rZXIgKHJsZCkuCisgICBEeWxkIGlzIG5lY2Vzc2FyeSB0byBzdXBwb3J0IGZyYW1ld29ya3MuICovCisvKiAjdW5kZWYgV0lUSF9EWUxEICovCisKKy8qIERlZmluZSB0byAxIGlmIGxpYmludGwgaXMgbmVlZGVkIGZvciBsb2NhbGUgZnVuY3Rpb25zLiAqLworLyogI3VuZGVmIFdJVEhfTElCSU5UTCAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gcHJvZHVjZSBhbiBPcGVuU3RlcC9SaGFwc29keSBmcmFtZXdvcmsgKHNoYXJlZAorICAgbGlicmFyeSBwbHVzIGFjY2Vzc29yeSBmaWxlcykuICovCisvKiAjdW5kZWYgV0lUSF9ORVhUX0ZSQU1FV09SSyAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBpbiBQeXRob24tc3BlY2lmaWMgbWFsbG9jcyAqLworI2RlZmluZSBXSVRIX1BZTUFMTE9DIDEKKworLyogRGVmaW5lIGlmIHdlIGhhdmUgZXh0ZXJuYWwgbGliZmZpLiAqLworLyogI3VuZGVmIFdJVEhfU1lTVEVNX0xJQkZGSSAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgdG8gY29tcGlsZSBpbiBydWRpbWVudGFyeSB0aHJlYWQgc3VwcG9ydCAqLworI2RlZmluZSBXSVRIX1RIUkVBRCAxCisKKy8qIERlZmluZSB0byBwcm9maWxlIHdpdGggdGhlIFBlbnRpdW0gdGltZXN0YW1wIGNvdW50ZXIgKi8KKy8qICN1bmRlZiBXSVRIX1RTQyAqLworCisvKiBEZWZpbmUgaWYgeW91IHdhbnQgcHltYWxsb2MgdG8gYmUgZGlzYWJsZWQgd2hlbiBydW5uaW5nIHVuZGVyIHZhbGdyaW5kICovCisvKiAjdW5kZWYgV0lUSF9WQUxHUklORCAqLworCisvKiBEZWZpbmUgV09SRFNfQklHRU5ESUFOIHRvIDEgaWYgeW91ciBwcm9jZXNzb3Igc3RvcmVzIHdvcmRzIHdpdGggdGhlIG1vc3QKKyAgIHNpZ25pZmljYW50IGJ5dGUgZmlyc3QgKGxpa2UgTW90b3JvbGEgYW5kIFNQQVJDLCB1bmxpa2UgSW50ZWwpLiAqLworI2lmIGRlZmluZWQgQUNfQVBQTEVfVU5JVkVSU0FMX0JVSUxECisjIGlmIGRlZmluZWQgX19CSUdfRU5ESUFOX18KKyMgIGRlZmluZSBXT1JEU19CSUdFTkRJQU4gMQorIyBlbmRpZgorI2Vsc2UKKyMgaWZuZGVmIFdPUkRTX0JJR0VORElBTgorLyogIyAgdW5kZWYgV09SRFNfQklHRU5ESUFOICovCisjIGVuZGlmCisjZW5kaWYKKworLyogRGVmaW5lIGlmIGFyaXRobWV0aWMgaXMgc3ViamVjdCB0byB4ODctc3R5bGUgZG91YmxlIHJvdW5kaW5nIGlzc3VlICovCisvKiAjdW5kZWYgWDg3X0RPVUJMRV9ST1VORElORyAqLworCisvKiBEZWZpbmUgb24gT3BlbkJTRCB0byBhY3RpdmF0ZSBhbGwgbGlicmFyeSBmZWF0dXJlcyAqLworLyogI3VuZGVmIF9CU0RfU09VUkNFICovCisKKy8qIERlZmluZSBvbiBJcml4IHRvIGVuYWJsZSB1X2ludCAqLworI2RlZmluZSBfQlNEX1RZUEVTIDEKKworLyogRGVmaW5lIG9uIERhcndpbiB0byBhY3RpdmF0ZSBhbGwgbGlicmFyeSBmZWF0dXJlcyAqLworI2RlZmluZSBfREFSV0lOX0NfU09VUkNFIDEKKworLyogVGhpcyBtdXN0IGJlIHNldCB0byA2NCBvbiBzb21lIHN5c3RlbXMgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydC4gKi8KKyNkZWZpbmUgX0ZJTEVfT0ZGU0VUX0JJVFMgNjQKKworLyogRGVmaW5lIG9uIExpbnV4IHRvIGFjdGl2YXRlIGFsbCBsaWJyYXJ5IGZlYXR1cmVzICovCisjZGVmaW5lIF9HTlVfU09VUkNFIDEKKworLyogVGhpcyBtdXN0IGJlIGRlZmluZWQgb24gc29tZSBzeXN0ZW1zIHRvIGVuYWJsZSBsYXJnZSBmaWxlIHN1cHBvcnQuICovCisjZGVmaW5lIF9MQVJHRUZJTEVfU09VUkNFIDEKKworLyogVGhpcyBtdXN0IGJlIGRlZmluZWQgb24gQUlYIHN5c3RlbXMgdG8gZW5hYmxlIGxhcmdlIGZpbGUgc3VwcG9ydC4gKi8KKy8qICN1bmRlZiBfTEFSR0VfRklMRVMgKi8KKworLyogRGVmaW5lIHRvIDEgaWYgb24gTUlOSVguICovCisvKiAjdW5kZWYgX01JTklYICovCisKKy8qIERlZmluZSBvbiBOZXRCU0QgdG8gYWN0aXZhdGUgYWxsIGxpYnJhcnkgZmVhdHVyZXMgKi8KKyNkZWZpbmUgX05FVEJTRF9TT1VSQ0UgMQorCisvKiBEZWZpbmUgX09TRl9TT1VSQ0UgdG8gZ2V0IHRoZSBtYWtlZGV2IG1hY3JvLiAqLworLyogI3VuZGVmIF9PU0ZfU09VUkNFICovCisKKy8qIERlZmluZSB0byAyIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSBQT1NJWC4xIGZlYXR1cmVzIGV4Y2VwdCB3aXRoCisgICB0aGlzIGRlZmluZWQuICovCisvKiAjdW5kZWYgX1BPU0lYXzFfU09VUkNFICovCisKKy8qIERlZmluZSB0byBhY3RpdmF0ZSBmZWF0dXJlcyBmcm9tIElFRUUgU3RkcyAxMDAzLjEtMjAwMSAqLworI2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMjAwMTEyTAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgbmVlZCB0byBpbiBvcmRlciBmb3IgYHN0YXQnIGFuZCBvdGhlciB0aGluZ3MgdG8gd29yay4gKi8KKy8qICN1bmRlZiBfUE9TSVhfU09VUkNFICovCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSBQT1NJWCB0aHJlYWRzLCBhbmQgeW91ciBzeXN0ZW0gZG9lcyBub3QgZGVmaW5lIHRoYXQuICovCisvKiAjdW5kZWYgX1BPU0lYX1RIUkVBRFMgKi8KKworLyogRGVmaW5lIHRvIGZvcmNlIHVzZSBvZiB0aHJlYWQtc2FmZSBlcnJubywgaF9lcnJubywgYW5kIG90aGVyIGZ1bmN0aW9ucyAqLworLyogI3VuZGVmIF9SRUVOVFJBTlQgKi8KKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50MzJfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKy8qICN1bmRlZiBfVUlOVDMyX1QgKi8KKworLyogRGVmaW5lIGZvciBTb2xhcmlzIDIuNS4xIHNvIHRoZSB1aW50NjRfdCB0eXBlZGVmIGZyb20gPHN5cy9zeW5jaC5oPiwKKyAgIDxwdGhyZWFkLmg+LCBvciA8c2VtYXBob3JlLmg+IGlzIG5vdCB1c2VkLiBJZiB0aGUgdHlwZWRlZiB3ZXJlIGFsbG93ZWQsIHRoZQorICAgI2RlZmluZSBiZWxvdyB3b3VsZCBjYXVzZSBhIHN5bnRheCBlcnJvci4gKi8KKy8qICN1bmRlZiBfVUlOVDY0X1QgKi8KKworLyogRGVmaW5lIHRvIHRoZSBsZXZlbCBvZiBYL09wZW4gdGhhdCB5b3VyIHN5c3RlbSBzdXBwb3J0cyAqLworI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMAorCisvKiBEZWZpbmUgdG8gYWN0aXZhdGUgVW5peDk1LWFuZC1lYXJsaWVyIGZlYXR1cmVzICovCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgMQorCisvKiBEZWZpbmUgb24gRnJlZUJTRCB0byBhY3RpdmF0ZSBhbGwgbGlicmFyeSBmZWF0dXJlcyAqLworI2RlZmluZSBfX0JTRF9WSVNJQkxFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgdHlwZSBgY2hhcicgaXMgdW5zaWduZWQgYW5kIHlvdSBhcmUgbm90IHVzaW5nIGdjYy4gICovCisjaWZuZGVmIF9fQ0hBUl9VTlNJR05FRF9fCisvKiAjIHVuZGVmIF9fQ0hBUl9VTlNJR05FRF9fICovCisjZW5kaWYKKworLyogRGVmaW5lZCBvbiBTb2xhcmlzIHRvIHNlZSBhZGRpdGlvbmFsIGZ1bmN0aW9uIHByb3RvdHlwZXMuICovCisjZGVmaW5lIF9fRVhURU5TSU9OU19fIDEKKworLyogRGVmaW5lIHRvICdsb25nJyBpZiA8dGltZS5oPiBkb2Vzbid0IGRlZmluZS4gKi8KKy8qICN1bmRlZiBjbG9ja190ICovCisKKy8qIERlZmluZSB0byBlbXB0eSBpZiBgY29uc3QnIGRvZXMgbm90IGNvbmZvcm0gdG8gQU5TSSBDLiAqLworLyogI3VuZGVmIGNvbnN0ICovCisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXNuJ3QgZGVmaW5lLiAqLworLyogI3VuZGVmIGdpZF90ICovCisKKy8qIERlZmluZSB0byB0aGUgdHlwZSBvZiBhIHNpZ25lZCBpbnRlZ2VyIHR5cGUgb2Ygd2lkdGggZXhhY3RseSAzMiBiaXRzIGlmCisgICBzdWNoIGEgdHlwZSBleGlzdHMgYW5kIHRoZSBzdGFuZGFyZCBpbmNsdWRlcyBkbyBub3QgZGVmaW5lIGl0LiAqLworLyogI3VuZGVmIGludDMyX3QgKi8KKworLyogRGVmaW5lIHRvIHRoZSB0eXBlIG9mIGEgc2lnbmVkIGludGVnZXIgdHlwZSBvZiB3aWR0aCBleGFjdGx5IDY0IGJpdHMgaWYKKyAgIHN1Y2ggYSB0eXBlIGV4aXN0cyBhbmQgdGhlIHN0YW5kYXJkIGluY2x1ZGVzIGRvIG5vdCBkZWZpbmUgaXQuICovCisvKiAjdW5kZWYgaW50NjRfdCAqLworCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2VzIG5vdCBkZWZpbmUuICovCisvKiAjdW5kZWYgbW9kZV90ICovCisKKy8qIERlZmluZSB0byBgbG9uZyBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIG9mZl90ICovCisKKy8qIERlZmluZSB0byBgaW50JyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKy8qICN1bmRlZiBwaWRfdCAqLworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gKi8KKy8qICN1bmRlZiBzaWduZWQgKi8KKworLyogRGVmaW5lIHRvIGB1bnNpZ25lZCBpbnQnIGlmIDxzeXMvdHlwZXMuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIHNpemVfdCAqLworCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy9zb2NrZXQuaD4gZG9lcyBub3QgZGVmaW5lLiAqLworLyogI3VuZGVmIHNvY2tsZW5fdCAqLworCisvKiBEZWZpbmUgdG8gYGludCcgaWYgPHN5cy90eXBlcy5oPiBkb2Vzbid0IGRlZmluZS4gKi8KKy8qICN1bmRlZiB1aWRfdCAqLworCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgMzIgYml0cyBpZgorICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KKy8qICN1bmRlZiB1aW50MzJfdCAqLworCisvKiBEZWZpbmUgdG8gdGhlIHR5cGUgb2YgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIG9mIHdpZHRoIGV4YWN0bHkgNjQgYml0cyBpZgorICAgc3VjaCBhIHR5cGUgZXhpc3RzIGFuZCB0aGUgc3RhbmRhcmQgaW5jbHVkZXMgZG8gbm90IGRlZmluZSBpdC4gKi8KKy8qICN1bmRlZiB1aW50NjRfdCAqLworCisvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gKi8KKy8qICN1bmRlZiB2b2xhdGlsZSAqLworCisKKy8qIERlZmluZSB0aGUgbWFjcm9zIG5lZWRlZCBpZiBvbiBhIFVuaXhXYXJlIDcueCBzeXN0ZW0uICovCisjaWYgZGVmaW5lZChfX1VTTENfXykgJiYgZGVmaW5lZChfX1NDT19WRVJTSU9OX18pCisjZGVmaW5lIFNUUklDVF9TWVNWX0NVUlNFUyAvKiBEb24ndCB1c2UgbmN1cnNlcyBleHRlbnNpb25zICovCisjZW5kaWYKKworI2VuZGlmIC8qUHlfUFlDT05GSUdfSCovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5Y3R5cGUuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5Y3R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzNjZjJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHljdHlwZS5oCkBAIC0wLDAgKzEsMzEgQEAKKyNpZm5kZWYgUFlDVFlQRV9ICisjZGVmaW5lIFBZQ1RZUEVfSAorCisjZGVmaW5lIFBZX0NURl9MT1dFUiAgMHgwMQorI2RlZmluZSBQWV9DVEZfVVBQRVIgIDB4MDIKKyNkZWZpbmUgUFlfQ1RGX0FMUEhBICAoUFlfQ1RGX0xPV0VSfFBZX0NURl9VUFBFUikKKyNkZWZpbmUgUFlfQ1RGX0RJR0lUICAweDA0CisjZGVmaW5lIFBZX0NURl9BTE5VTSAgKFBZX0NURl9BTFBIQXxQWV9DVEZfRElHSVQpCisjZGVmaW5lIFBZX0NURl9TUEFDRSAgMHgwOAorI2RlZmluZSBQWV9DVEZfWERJR0lUIDB4MTAKKworUHlBUElfREFUQShjb25zdCB1bnNpZ25lZCBpbnQpIF9QeV9jdHlwZV90YWJsZVsyNTZdOworCisvKiBVbmxpa2UgdGhlaXIgQyBjb3VudGVycGFydHMsIHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBub3QgbWVhbnQgdG8KKyAqIGhhbmRsZSBhbiBpbnQgd2l0aCBhbnkgb2YgdGhlIHZhbHVlcyBbRU9GLCAwLVVDSEFSX01BWF0uIFRoZSBhcmd1bWVudAorICogbXVzdCBiZSBhIHNpZ25lZC91bnNpZ25lZCBjaGFyLiAqLworI2RlZmluZSBQeV9JU0xPV0VSKGMpICAoX1B5X2N0eXBlX3RhYmxlW1B5X0NIQVJNQVNLKGMpXSAmIFBZX0NURl9MT1dFUikKKyNkZWZpbmUgUHlfSVNVUFBFUihjKSAgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBQWV9DVEZfVVBQRVIpCisjZGVmaW5lIFB5X0lTQUxQSEEoYykgIChfUHlfY3R5cGVfdGFibGVbUHlfQ0hBUk1BU0soYyldICYgUFlfQ1RGX0FMUEhBKQorI2RlZmluZSBQeV9JU0RJR0lUKGMpICAoX1B5X2N0eXBlX3RhYmxlW1B5X0NIQVJNQVNLKGMpXSAmIFBZX0NURl9ESUdJVCkKKyNkZWZpbmUgUHlfSVNYRElHSVQoYykgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBQWV9DVEZfWERJR0lUKQorI2RlZmluZSBQeV9JU0FMTlVNKGMpICAoX1B5X2N0eXBlX3RhYmxlW1B5X0NIQVJNQVNLKGMpXSAmIFBZX0NURl9BTE5VTSkKKyNkZWZpbmUgUHlfSVNTUEFDRShjKSAgKF9QeV9jdHlwZV90YWJsZVtQeV9DSEFSTUFTSyhjKV0gJiBQWV9DVEZfU1BBQ0UpCisKK1B5QVBJX0RBVEEoY29uc3QgdW5zaWduZWQgY2hhcikgX1B5X2N0eXBlX3RvbG93ZXJbMjU2XTsKK1B5QVBJX0RBVEEoY29uc3QgdW5zaWduZWQgY2hhcikgX1B5X2N0eXBlX3RvdXBwZXJbMjU2XTsKKworI2RlZmluZSBQeV9UT0xPV0VSKGMpIChfUHlfY3R5cGVfdG9sb3dlcltQeV9DSEFSTUFTSyhjKV0pCisjZGVmaW5lIFB5X1RPVVBQRVIoYykgKF9QeV9jdHlwZV90b3VwcGVyW1B5X0NIQVJNQVNLKGMpXSkKKworI2VuZGlmIC8qICFQWUNUWVBFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5ZGVidWcuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5ZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjQ1OTYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlkZWJ1Zy5oCkBAIC0wLDAgKzEsNDEgQEAKKworI2lmbmRlZiBQeV9QWURFQlVHX0gKKyNkZWZpbmUgUHlfUFlERUJVR19ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0RBVEEoaW50KSBQeV9EZWJ1Z0ZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfVmVyYm9zZUZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfSW50ZXJhY3RpdmVGbGFnOworUHlBUElfREFUQShpbnQpIFB5X0luc3BlY3RGbGFnOworUHlBUElfREFUQShpbnQpIFB5X09wdGltaXplRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9Ob1NpdGVGbGFnOworUHlBUElfREFUQShpbnQpIFB5X0J5dGVzV2FybmluZ0ZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfVXNlQ2xhc3NFeGNlcHRpb25zRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9Gcm96ZW5GbGFnOworUHlBUElfREFUQShpbnQpIFB5X1RhYmNoZWNrRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9Vbmljb2RlRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfRGl2aXNpb25XYXJuaW5nRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9Eb250V3JpdGVCeXRlY29kZUZsYWc7CitQeUFQSV9EQVRBKGludCkgUHlfTm9Vc2VyU2l0ZURpcmVjdG9yeTsKKy8qIF9YWFggUHlfUW5ld0ZsYWcgc2hvdWxkIGdvIGF3YXkgaW4gMy4wLiAgSXQncyB0cnVlIGlmZiAtUW5ldyBpcyBwYXNzZWQsCisgIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBpcyB1c2VkIGluIDIuMiBieSBjZXZhbC5jIHRvIG1ha2UgYWxsICIvIiBkaXZpc2lvbnMKKyAgdHJ1ZSBkaXZpc2lvbnMgKHdoaWNoIHRoZXkgd2lsbCBiZSBpbiAzLjApLiAqLworUHlBUElfREFUQShpbnQpIF9QeV9RbmV3RmxhZzsKKy8qIFdhcm4gYWJvdXQgMy54IGlzc3VlcyAqLworUHlBUElfREFUQShpbnQpIFB5X1B5M2tXYXJuaW5nRmxhZzsKK1B5QVBJX0RBVEEoaW50KSBQeV9IYXNoUmFuZG9taXphdGlvbkZsYWc7CisKKy8qIHRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBnZXRlbnYoKSB0aGF0IHBheXMgYXR0ZW50aW9uIHRvCisgICBQeV9JZ25vcmVFbnZpcm9ubWVudEZsYWcuICBJdCBzaG91bGQgYmUgdXNlZCBmb3IgZ2V0dGluZyB2YXJpYWJsZXMgbGlrZQorICAgUFlUSE9OUEFUSCBhbmQgUFlUSE9OSE9NRSBmcm9tIHRoZSBlbnZpcm9ubWVudCAqLworI2RlZmluZSBQeV9HRVRFTlYocykgKFB5X0lnbm9yZUVudmlyb25tZW50RmxhZyA/IE5VTEwgOiBnZXRlbnYocykpCisKK1B5QVBJX0ZVTkModm9pZCkgUHlfRmF0YWxFcnJvcihjb25zdCBjaGFyICptZXNzYWdlKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfUFlERUJVR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weWVycm9ycy5oIGIvaW5jbHVkZS9weXRob24yLjcvcHllcnJvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmUzYmZhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHllcnJvcnMuaApAQCAtMCwwICsxLDMyOCBAQAorI2lmbmRlZiBQeV9FUlJPUlNfSAorI2RlZmluZSBQeV9FUlJPUlNfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBFcnJvciBvYmplY3RzICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKm1lc3NhZ2U7Cit9IFB5QmFzZUV4Y2VwdGlvbk9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBQeU9iamVjdCAqbXNnOworICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKKyAgICBQeU9iamVjdCAqbGluZW5vOworICAgIFB5T2JqZWN0ICpvZmZzZXQ7CisgICAgUHlPYmplY3QgKnRleHQ7CisgICAgUHlPYmplY3QgKnByaW50X2ZpbGVfYW5kX2xpbmU7Cit9IFB5U3ludGF4RXJyb3JPYmplY3Q7CisKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIFB5T2JqZWN0ICplbmNvZGluZzsKKyAgICBQeU9iamVjdCAqb2JqZWN0OworICAgIFB5X3NzaXplX3Qgc3RhcnQ7CisgICAgUHlfc3NpemVfdCBlbmQ7CisgICAgUHlPYmplY3QgKnJlYXNvbjsKK30gUHlVbmljb2RlRXJyb3JPYmplY3Q7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAqZGljdDsKKyAgICBQeU9iamVjdCAqYXJnczsKKyAgICBQeU9iamVjdCAqbWVzc2FnZTsKKyAgICBQeU9iamVjdCAqY29kZTsKK30gUHlTeXN0ZW1FeGl0T2JqZWN0OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpkaWN0OworICAgIFB5T2JqZWN0ICphcmdzOworICAgIFB5T2JqZWN0ICptZXNzYWdlOworICAgIFB5T2JqZWN0ICpteWVycm5vOworICAgIFB5T2JqZWN0ICpzdHJlcnJvcjsKKyAgICBQeU9iamVjdCAqZmlsZW5hbWU7Cit9IFB5RW52aXJvbm1lbnRFcnJvck9iamVjdDsKKworI2lmZGVmIE1TX1dJTkRPV1MKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKmRpY3Q7CisgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgUHlPYmplY3QgKm1lc3NhZ2U7CisgICAgUHlPYmplY3QgKm15ZXJybm87CisgICAgUHlPYmplY3QgKnN0cmVycm9yOworICAgIFB5T2JqZWN0ICpmaWxlbmFtZTsKKyAgICBQeU9iamVjdCAqd2luZXJyb3I7Cit9IFB5V2luZG93c0Vycm9yT2JqZWN0OworI2VuZGlmCisKKy8qIEVycm9yIGhhbmRsaW5nIGRlZmluaXRpb25zICovCisKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfU2V0Tm9uZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfU2V0T2JqZWN0KFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9TZXRTdHJpbmcoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfT2NjdXJyZWQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX0NsZWFyKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9GZXRjaChQeU9iamVjdCAqKiwgUHlPYmplY3QgKiosIFB5T2JqZWN0ICoqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfUmVzdG9yZShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworI2lmZGVmIFB5X0RFQlVHCisjZGVmaW5lIF9QeUVycl9PQ0NVUlJFRCgpIFB5RXJyX09jY3VycmVkKCkKKyNlbHNlCisjZGVmaW5lIF9QeUVycl9PQ0NVUlJFRCgpIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50LT5jdXJleGNfdHlwZSkKKyNlbmRpZgorCisvKiBFcnJvciB0ZXN0aW5nIGFuZCBub3JtYWxpemF0aW9uICovCitQeUFQSV9GVU5DKGludCkgUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzKFB5T2JqZWN0ICosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbihQeU9iamVjdCoqLCBQeU9iamVjdCoqLCBQeU9iamVjdCoqKTsKKworLyogKi8KKworI2RlZmluZSBQeUV4Y2VwdGlvbkNsYXNzX0NoZWNrKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeUNsYXNzX0NoZWNrKCh4KSkgfHwgKFB5VHlwZV9DaGVjaygoeCkpICYmICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUHlUeXBlX0Zhc3RTdWJjbGFzcygoUHlUeXBlT2JqZWN0KikoeCksIFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MpKSkKKworI2RlZmluZSBQeUV4Y2VwdGlvbkluc3RhbmNlX0NoZWNrKHgpICAgICAgICAgICAgICAgICAgICBcCisgICAgKFB5SW5zdGFuY2VfQ2hlY2soKHgpKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgUHlUeXBlX0Zhc3RTdWJjbGFzcygoeCktPm9iX3R5cGUsIFB5X1RQRkxBR1NfQkFTRV9FWENfU1VCQ0xBU1MpKQorCisjZGVmaW5lIFB5RXhjZXB0aW9uQ2xhc3NfTmFtZSh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChQeUNsYXNzX0NoZWNrKCh4KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgPyBQeVN0cmluZ19BU19TVFJJTkcoKChQeUNsYXNzT2JqZWN0KikoeCkpLT5jbF9uYW1lKSAgICAgICAgICBcCisgICAgIDogKGNoYXIgKikoKChQeVR5cGVPYmplY3QqKSh4KSktPnRwX25hbWUpKQorCisjZGVmaW5lIFB5RXhjZXB0aW9uSW5zdGFuY2VfQ2xhc3MoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChQeUluc3RhbmNlX0NoZWNrKCh4KSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICA/IChQeU9iamVjdCopKChQeUluc3RhbmNlT2JqZWN0KikoeCkpLT5pbl9jbGFzcyAgICAgICAgICAgICAgICAgICBcCisgICAgICA6IChQeU9iamVjdCopKCh4KS0+b2JfdHlwZSkpKQorCisKKy8qIFByZWRlZmluZWQgZXhjZXB0aW9ucyAqLworCitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0Jhc2VFeGNlcHRpb247CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0V4Y2VwdGlvbjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfU3RvcEl0ZXJhdGlvbjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfR2VuZXJhdG9yRXhpdDsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfU3RhbmRhcmRFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfQXJpdGhtZXRpY0Vycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19Mb29rdXBFcnJvcjsKKworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19Bc3NlcnRpb25FcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfQXR0cmlidXRlRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0VPRkVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0Vudmlyb25tZW50RXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0lPRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX09TRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0ltcG9ydEVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19JbmRleEVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19LZXlFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQ7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX01lbW9yeUVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19OYW1lRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX092ZXJmbG93RXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1J1bnRpbWVFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfU3ludGF4RXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0luZGVudGF0aW9uRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1RhYkVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19SZWZlcmVuY2VFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfU3lzdGVtRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1N5c3RlbUV4aXQ7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1R5cGVFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfVW5ib3VuZExvY2FsRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1VuaWNvZGVFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfVW5pY29kZUVuY29kZUVycm9yOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19Vbmljb2RlRGVjb2RlRXJyb3I7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX1VuaWNvZGVUcmFuc2xhdGVFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfVmFsdWVFcnJvcjsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3I7CisjaWZkZWYgTVNfV0lORE9XUworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19XaW5kb3dzRXJyb3I7CisjZW5kaWYKKyNpZmRlZiBfX1ZNUworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19WTVNFcnJvcjsKKyNlbmRpZgorCitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0J1ZmZlckVycm9yOworCitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX01lbW9yeUVycm9ySW5zdDsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfUmVjdXJzaW9uRXJyb3JJbnN0OworCisvKiBQcmVkZWZpbmVkIHdhcm5pbmcgY2F0ZWdvcmllcyAqLworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19XYXJuaW5nOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19Vc2VyV2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19TeW50YXhXYXJuaW5nOworUHlBUElfREFUQShQeU9iamVjdCAqKSBQeUV4Y19SdW50aW1lV2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfRnV0dXJlV2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfSW1wb3J0V2FybmluZzsKK1B5QVBJX0RBVEEoUHlPYmplY3QgKikgUHlFeGNfVW5pY29kZVdhcm5pbmc7CitQeUFQSV9EQVRBKFB5T2JqZWN0ICopIFB5RXhjX0J5dGVzV2FybmluZzsKKworCisvKiBDb252ZW5pZW5jZSBmdW5jdGlvbnMgKi8KKworUHlBUElfRlVOQyhpbnQpIFB5RXJyX0JhZEFyZ3VtZW50KHZvaWQpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9Ob01lbW9yeSh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbUVycm5vKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tRXJybm9XaXRoRmlsZW5hbWVPYmplY3QoCisgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZSgKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworI2lmZGVmIE1TX1dJTkRPV1MKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbUVycm5vV2l0aFVuaWNvZGVGaWxlbmFtZSgKKyAgICBQeU9iamVjdCAqLCBjb25zdCBQeV9VTklDT0RFICopOworI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9Gb3JtYXQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLCAuLi4pCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAyLCAzKSkpOworCisjaWZkZWYgTVNfV0lORE9XUworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZU9iamVjdCgKKyAgICBpbnQsIGNvbnN0IGNoYXIgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKAorICAgIGludCwgY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoVW5pY29kZUZpbGVuYW1lKAorICAgIGludCwgY29uc3QgUHlfVU5JQ09ERSAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnIoaW50KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWVPYmplY3QoCisgICAgUHlPYmplY3QgKixpbnQsIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycldpdGhGaWxlbmFtZSgKKyAgICBQeU9iamVjdCAqLGludCwgY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfU2V0RXhjRnJvbVdpbmRvd3NFcnJXaXRoVW5pY29kZUZpbGVuYW1lKAorICAgIFB5T2JqZWN0ICosaW50LCBjb25zdCBQeV9VTklDT0RFICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUVycl9TZXRFeGNGcm9tV2luZG93c0VycihQeU9iamVjdCAqLCBpbnQpOworI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KKworLyogRXhwb3J0IHRoZSBvbGQgZnVuY3Rpb24gc28gdGhhdCB0aGUgZXhpc3RpbmcgQVBJIHJlbWFpbnMgYXZhaWxhYmxlOiAqLworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9CYWRJbnRlcm5hbENhbGwodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeUVycl9CYWRJbnRlcm5hbENhbGwoY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8pOworLyogTWFzayB0aGUgb2xkIEFQSSB3aXRoIGEgY2FsbCB0byB0aGUgbmV3IEFQSSBmb3IgY29kZSBjb21waWxlZCB1bmRlcgorICAgUHl0aG9uIDIuMDogKi8KKyNkZWZpbmUgUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCkgX1B5RXJyX0JhZEludGVybmFsQ2FsbChfX0ZJTEVfXywgX19MSU5FX18pCisKKy8qIEZ1bmN0aW9uIHRvIGNyZWF0ZSBhIG5ldyBleGNlcHRpb24gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlFcnJfTmV3RXhjZXB0aW9uKAorICAgIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpiYXNlLCBQeU9iamVjdCAqZGljdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX05ld0V4Y2VwdGlvbldpdGhEb2MoCisgICAgY2hhciAqbmFtZSwgY2hhciAqZG9jLCBQeU9iamVjdCAqYmFzZSwgUHlPYmplY3QgKmRpY3QpOworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlPYmplY3QgKik7CisKKy8qIEluIHNpZ2NoZWNrLmMgb3Igc2lnbmFsbW9kdWxlLmMgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeUVycl9DaGVja1NpZ25hbHModm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX1NldEludGVycnVwdCh2b2lkKTsKKworLyogSW4gc2lnbmFsbW9kdWxlLmMgKi8KK2ludCBQeVNpZ25hbF9TZXRXYWtldXBGZChpbnQgZmQpOworCisvKiBTdXBwb3J0IGZvciBhZGRpbmcgcHJvZ3JhbSB0ZXh0IHRvIFN5bnRheEVycm9ycyAqLworUHlBUElfRlVOQyh2b2lkKSBQeUVycl9TeW50YXhMb2NhdGlvbihjb25zdCBjaGFyICosIGludCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5RXJyX1Byb2dyYW1UZXh0KGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKKy8qIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGNyZWF0ZSBhbmQgbW9kaWZ5IHVuaWNvZGUKKyAgIGV4Y2VwdGlvbnMgZnJvbSBDICovCisKKy8qIGNyZWF0ZSBhIFVuaWNvZGVEZWNvZGVFcnJvciBvYmplY3QgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlKAorICAgIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCBjb25zdCBjaGFyICopOworCisvKiBjcmVhdGUgYSBVbmljb2RlRW5jb2RlRXJyb3Igb2JqZWN0ICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZUVuY29kZUVycm9yX0NyZWF0ZSgKKyAgICBjb25zdCBjaGFyICosIGNvbnN0IFB5X1VOSUNPREUgKiwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgUHlfc3NpemVfdCwgY29uc3QgY2hhciAqKTsKKworLyogY3JlYXRlIGEgVW5pY29kZVRyYW5zbGF0ZUVycm9yIG9iamVjdCAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9DcmVhdGUoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqLCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCBQeV9zc2l6ZV90LCBjb25zdCBjaGFyICopOworCisvKiBnZXQgdGhlIGVuY29kaW5nIGF0dHJpYnV0ZSAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmNvZGluZyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5jb2RpbmcoUHlPYmplY3QgKik7CisKKy8qIGdldCB0aGUgb2JqZWN0IGF0dHJpYnV0ZSAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRPYmplY3QoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZURlY29kZUVycm9yX0dldE9iamVjdChQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0T2JqZWN0KFB5T2JqZWN0ICopOworCisvKiBnZXQgdGhlIHZhbHVlIG9mIHRoZSBzdGFydCBhdHRyaWJ1dGUgKHRoZSBpbnQgKiBtYXkgbm90IGJlIE5VTEwpCisgICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlICovCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0U3RhcnQoUHlPYmplY3QgKiwgUHlfc3NpemVfdCAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRTdGFydChQeU9iamVjdCAqLCBQeV9zc2l6ZV90ICopOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX0dldFN0YXJ0KFB5T2JqZWN0ICosIFB5X3NzaXplX3QgKik7CisKKy8qIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byB0aGUgc3RhcnQgYXR0cmlidXRlCisgICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlICovCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRW5jb2RlRXJyb3JfU2V0U3RhcnQoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRGVjb2RlRXJyb3JfU2V0U3RhcnQoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0U3RhcnQoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CisKKy8qIGdldCB0aGUgdmFsdWUgb2YgdGhlIGVuZCBhdHRyaWJ1dGUgKHRoZSBpbnQgKm1heSBub3QgYmUgTlVMTCkKKyByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlICovCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRW5jb2RlRXJyb3JfR2V0RW5kKFB5T2JqZWN0ICosIFB5X3NzaXplX3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0RW5kKFB5T2JqZWN0ICosIFB5X3NzaXplX3QgKik7CitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfR2V0RW5kKFB5T2JqZWN0ICosIFB5X3NzaXplX3QgKik7CisKKy8qIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byB0aGUgZW5kIGF0dHJpYnV0ZQorICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX1NldEVuZChQeU9iamVjdCAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVEZWNvZGVFcnJvcl9TZXRFbmQoUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfU2V0RW5kKFB5T2JqZWN0ICosIFB5X3NzaXplX3QpOworCisvKiBnZXQgdGhlIHZhbHVlIG9mIHRoZSByZWFzb24gYXR0cmlidXRlICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZUVuY29kZUVycm9yX0dldFJlYXNvbihQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0UmVhc29uKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVUcmFuc2xhdGVFcnJvcl9HZXRSZWFzb24oUHlPYmplY3QgKik7CisKKy8qIGFzc2lnbiBhIG5ldyB2YWx1ZSB0byB0aGUgcmVhc29uIGF0dHJpYnV0ZQorICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZSAqLworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbigKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbigKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbigKKyAgICBQeU9iamVjdCAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCisKKworLyogVGhlc2UgQVBJcyBhcmVuJ3QgcmVhbGx5IHBhcnQgb2YgdGhlIGVycm9yIGltcGxlbWVudGF0aW9uLCBidXQKKyAgIG9mdGVuIG5lZWRlZCB0byBmb3JtYXQgZXJyb3IgbWVzc2FnZXM7IHRoZSBuYXRpdmUgQyBsaWIgQVBJcyBhcmUKKyAgIG5vdCBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3Jtcywgd2hpY2ggaXMgd2h5IHdlIHByb3ZpZGUgZW11bGF0aW9ucworICAgZm9yIHRob3NlIHBsYXRmb3JtcyBpbiBQeXRob24vbXlzbnByaW50Zi5jLAorICAgV0FSTklORzogIFRoZSByZXR1cm4gdmFsdWUgb2Ygc25wcmludGYgdmFyaWVzIGFjcm9zcyBwbGF0Zm9ybXM7IGRvCisgICBub3QgcmVseSBvbiBhbnkgcGFydGljdWxhciBiZWhhdmlvcjsgZXZlbnR1YWxseSB0aGUgQzk5IGRlZm4gbWF5CisgICBiZSByZWxpYWJsZS4KKyovCisjaWYgZGVmaW5lZChNU19XSU4zMikgJiYgIWRlZmluZWQoSEFWRV9TTlBSSU5URikKKyMgZGVmaW5lIEhBVkVfU05QUklOVEYKKyMgZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorIyBkZWZpbmUgdnNucHJpbnRmIF92c25wcmludGYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CitQeUFQSV9GVU5DKGludCkgUHlPU19zbnByaW50ZihjaGFyICpzdHIsIHNpemVfdCBzaXplLCBjb25zdCBjaGFyICAqZm9ybWF0LCAuLi4pCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCA0KSkpOworUHlBUElfRlVOQyhpbnQpIFB5T1NfdnNucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIgICpmb3JtYXQsIHZhX2xpc3QgdmEpCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAzLCAwKSkpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9FUlJPUlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlleHBhdC5oIGIvaW5jbHVkZS9weXRob24yLjcvcHlleHBhdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDBlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9weWV4cGF0LmgKQEAgLTAsMCArMSw0OCBAQAorLyogU3R1ZmYgdG8gZXhwb3J0IHJlbGV2YW50ICdleHBhdCcgZW50cnkgcG9pbnRzIGZyb20gcHlleHBhdCB0byBvdGhlcgorICogcGFyc2VyIG1vZHVsZXMsIHN1Y2ggYXMgY0VsZW1lbnRUcmVlLiAqLworCisvKiBub3RlOiB5b3UgbXVzdCBpbXBvcnQgZXhwYXQuaCBiZWZvcmUgaW1wb3J0aW5nIHRoaXMgbW9kdWxlISAqLworCisjZGVmaW5lIFB5RXhwYXRfQ0FQSV9NQUdJQyAgInB5ZXhwYXQuZXhwYXRfQ0FQSSAxLjAiCisjZGVmaW5lIFB5RXhwYXRfQ0FQU1VMRV9OQU1FICJweWV4cGF0LmV4cGF0X0NBUEkiCisKK3N0cnVjdCBQeUV4cGF0X0NBUEkgCit7CisgICAgY2hhciogbWFnaWM7IC8qIHNldCB0byBQeUV4cGF0X0NBUElfTUFHSUMgKi8KKyAgICBpbnQgc2l6ZTsgLyogc2V0IHRvIHNpemVvZihzdHJ1Y3QgUHlFeHBhdF9DQVBJKSAqLworICAgIGludCBNQUpPUl9WRVJTSU9OOworICAgIGludCBNSU5PUl9WRVJTSU9OOworICAgIGludCBNSUNST19WRVJTSU9OOworICAgIC8qIHBvaW50ZXJzIHRvIHNlbGVjdGVkIGV4cGF0IGZ1bmN0aW9ucy4gIGFkZCBuZXcgZnVuY3Rpb25zIGF0CisgICAgICAgdGhlIGVuZCwgaWYgbmVlZGVkICovCisgICAgY29uc3QgWE1MX0xDaGFyICogKCpFcnJvclN0cmluZykoZW51bSBYTUxfRXJyb3IgY29kZSk7CisgICAgZW51bSBYTUxfRXJyb3IgKCpHZXRFcnJvckNvZGUpKFhNTF9QYXJzZXIgcGFyc2VyKTsKKyAgICBYTUxfU2l6ZSAoKkdldEVycm9yQ29sdW1uTnVtYmVyKShYTUxfUGFyc2VyIHBhcnNlcik7CisgICAgWE1MX1NpemUgKCpHZXRFcnJvckxpbmVOdW1iZXIpKFhNTF9QYXJzZXIgcGFyc2VyKTsKKyAgICBlbnVtIFhNTF9TdGF0dXMgKCpQYXJzZSkoCisgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CisgICAgWE1MX1BhcnNlciAoKlBhcnNlckNyZWF0ZV9NTSkoCisgICAgICAgIGNvbnN0IFhNTF9DaGFyICplbmNvZGluZywgY29uc3QgWE1MX01lbW9yeV9IYW5kbGluZ19TdWl0ZSAqbWVtc3VpdGUsCisgICAgICAgIGNvbnN0IFhNTF9DaGFyICpuYW1lc3BhY2VTZXBhcmF0b3IpOworICAgIHZvaWQgKCpQYXJzZXJGcmVlKShYTUxfUGFyc2VyIHBhcnNlcik7CisgICAgdm9pZCAoKlNldENoYXJhY3RlckRhdGFIYW5kbGVyKSgKKyAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9DaGFyYWN0ZXJEYXRhSGFuZGxlciBoYW5kbGVyKTsKKyAgICB2b2lkICgqU2V0Q29tbWVudEhhbmRsZXIpKAorICAgICAgICBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0NvbW1lbnRIYW5kbGVyIGhhbmRsZXIpOworICAgIHZvaWQgKCpTZXREZWZhdWx0SGFuZGxlckV4cGFuZCkoCisgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBYTUxfRGVmYXVsdEhhbmRsZXIgaGFuZGxlcik7CisgICAgdm9pZCAoKlNldEVsZW1lbnRIYW5kbGVyKSgKKyAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9TdGFydEVsZW1lbnRIYW5kbGVyIHN0YXJ0LAorICAgICAgICBYTUxfRW5kRWxlbWVudEhhbmRsZXIgZW5kKTsKKyAgICB2b2lkICgqU2V0TmFtZXNwYWNlRGVjbEhhbmRsZXIpKAorICAgICAgICBYTUxfUGFyc2VyIHBhcnNlciwgWE1MX1N0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgc3RhcnQsCisgICAgICAgIFhNTF9FbmROYW1lc3BhY2VEZWNsSGFuZGxlciBlbmQpOworICAgIHZvaWQgKCpTZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKSgKKyAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyIGhhbmRsZXIpOworICAgIHZvaWQgKCpTZXRVbmtub3duRW5jb2RpbmdIYW5kbGVyKSgKKyAgICAgICAgWE1MX1BhcnNlciBwYXJzZXIsIFhNTF9Vbmtub3duRW5jb2RpbmdIYW5kbGVyIGhhbmRsZXIsCisgICAgICAgIHZvaWQgKmVuY29kaW5nSGFuZGxlckRhdGEpOworICAgIHZvaWQgKCpTZXRVc2VyRGF0YSkoWE1MX1BhcnNlciBwYXJzZXIsIHZvaWQgKnVzZXJEYXRhKTsKKyAgICAvKiBhbHdheXMgYWRkIG5ldyBzdHVmZiB0byB0aGUgZW5kISAqLworfTsKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHlmcGUuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5ZnBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1NzExOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5ZnBlLmgKQEAgLTAsMCArMSwxNzYgQEAKKyNpZm5kZWYgUHlfUFlGUEVfSAorI2RlZmluZSBQeV9QWUZQRV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisvKgorICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgKGMpIDE5OTYuICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfCAgICAgICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgICAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yICAgfAorICAgfCAgIGFueSBwdXJwb3NlIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgZW4tICAgfAorICAgfCAgIHRpcmUgbm90aWNlIGlzIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb2YgYW55IHNvZnR3YXJlIHdoaWNoIGlzIG9yICAgfAorICAgfCAgIGluY2x1ZGVzICBhICBjb3B5ICBvciAgbW9kaWZpY2F0aW9uICBvZiAgdGhpcyBzb2Z0d2FyZSBhbmQgaW4gYWxsICAgfAorICAgfCAgIGNvcGllcyBvZiB0aGUgc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uIGZvciBzdWNoIHNvZnR3YXJlLiAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgIFRoaXMgIHdvcmsgd2FzIHByb2R1Y2VkIGF0IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIExhd3JlbmNlICAgfAorICAgfCAgIExpdmVybW9yZSBOYXRpb25hbCBMYWJvcmF0b3J5IHVuZGVyICBjb250cmFjdCAgbm8uICBXLTc0MDUtRU5HLTQ4ICAgfAorICAgfCAgIGJldHdlZW4gIHRoZSAgVS5TLiAgRGVwYXJ0bWVudCAgb2YgIEVuZXJneSBhbmQgVGhlIFJlZ2VudHMgb2YgdGhlICAgfAorICAgfCAgIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYSBmb3IgdGhlIG9wZXJhdGlvbiBvZiBVQyBMTE5MLiAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJU0NMQUlNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgfCAgIFRoaXMgIHNvZnR3YXJlIHdhcyBwcmVwYXJlZCBhcyBhbiBhY2NvdW50IG9mIHdvcmsgc3BvbnNvcmVkIGJ5IGFuICAgfAorICAgfCAgIGFnZW5jeSBvZiB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LiBOZWl0aGVyIHRoZSBVbml0ZWQgU3RhdGVzICAgfAorICAgfCAgIEdvdmVybm1lbnQgIG5vciB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIG5vciBhbnkgb2YgdGhlaXIgZW0tICAgfAorICAgfCAgIHBsb3llZXMsIG1ha2VzIGFueSB3YXJyYW50eSwgZXhwcmVzcyBvciBpbXBsaWVkLCBvciAgYXNzdW1lcyAgYW55ICAgfAorICAgfCAgIGxpYWJpbGl0eSAgb3IgIHJlc3BvbnNpYmlsaXR5ICBmb3IgdGhlIGFjY3VyYWN5LCBjb21wbGV0ZW5lc3MsIG9yICAgfAorICAgfCAgIHVzZWZ1bG5lc3Mgb2YgYW55IGluZm9ybWF0aW9uLCAgYXBwYXJhdHVzLCAgcHJvZHVjdCwgIG9yICBwcm9jZXNzICAgfAorICAgfCAgIGRpc2Nsb3NlZCwgICBvciAgcmVwcmVzZW50cyAgdGhhdCAgaXRzICB1c2UgIHdvdWxkICBub3QgIGluZnJpbmdlICAgfAorICAgfCAgIHByaXZhdGVseS1vd25lZCByaWdodHMuIFJlZmVyZW5jZSBoZXJlaW4gdG8gYW55IHNwZWNpZmljICBjb21tZXItICAgfAorICAgfCAgIGNpYWwgIHByb2R1Y3RzLCAgcHJvY2VzcywgIG9yICBzZXJ2aWNlICBieSB0cmFkZSBuYW1lLCB0cmFkZW1hcmssICAgfAorICAgfCAgIG1hbnVmYWN0dXJlciwgb3Igb3RoZXJ3aXNlLCBkb2VzIG5vdCAgbmVjZXNzYXJpbHkgIGNvbnN0aXR1dGUgIG9yICAgfAorICAgfCAgIGltcGx5ICBpdHMgZW5kb3JzZW1lbnQsIHJlY29tbWVuZGF0aW9uLCBvciBmYXZvcmluZyBieSB0aGUgVW5pdGVkICAgfAorICAgfCAgIFN0YXRlcyBHb3Zlcm5tZW50IG9yIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuIFRoZSB2aWV3cyAgYW5kICAgfAorICAgfCAgIG9waW5pb25zICBvZiBhdXRob3JzIGV4cHJlc3NlZCBoZXJlaW4gZG8gbm90IG5lY2Vzc2FyaWx5IHN0YXRlIG9yICAgfAorICAgfCAgIHJlZmxlY3QgdGhvc2Ugb2YgdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudCBvciAgdGhlICBVbml2ZXJzaXR5ICAgfAorICAgfCAgIG9mICBDYWxpZm9ybmlhLCAgYW5kIHNoYWxsIG5vdCBiZSB1c2VkIGZvciBhZHZlcnRpc2luZyBvciBwcm9kdWN0ICAgfAorICAgIFwgIGVuZG9yc2VtZW50IHB1cnBvc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLyoKKyAqICAgICAgIERlZmluZSBtYWNyb3MgZm9yIGhhbmRsaW5nIFNJR0ZQRS4KKyAqICAgICAgIExlZSBCdXNieSwgTExOTCwgTm92ZW1iZXIsIDE5OTYKKyAqICAgICAgIGJ1c2J5MUBsbG5sLmdvdgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPdmVydmlldyBvZiB0aGUgc3lzdGVtIGZvciBoYW5kbGluZyBTSUdGUEU6CisgKiAKKyAqIFRoaXMgZmlsZSAoSW5jbHVkZS9weWZwZS5oKSBkZWZpbmVzIGEgY291cGxlIG9mICJ3cmFwcGVyIiBtYWNyb3MgZm9yCisgKiBpbnNlcnRpb24gaW50byB5b3VyIFB5dGhvbiBDIGNvZGUgb2YgY2hvaWNlLiBUaGVpciBwcm9wZXIgdXNlIGlzCisgKiBkaXNjdXNzZWQgYmVsb3cuIFRoZSBmaWxlIFB5dGhvbi9weWZwZS5jIGRlZmluZXMgYSBwYWlyIG9mIGdsb2JhbAorICogdmFyaWFibGVzIFB5RlBFX2pidWYgYW5kIFB5RlBFX2NvdW50ZXIgd2hpY2ggYXJlIHVzZWQgYnkgdGhlIHNpZ25hbAorICogaGFuZGxlciBmb3IgU0lHRlBFIHRvIGRlY2lkZSBpZiBhIHBhcnRpY3VsYXIgZXhjZXB0aW9uIHdhcyBwcm90ZWN0ZWQKKyAqIGJ5IHRoZSBtYWNyb3MuIFRoZSBzaWduYWwgaGFuZGxlciBpdHNlbGYsIGFuZCBjb2RlIGZvciBlbmFibGluZyB0aGUKKyAqIGdlbmVyYXRpb24gb2YgU0lHRlBFIGluIHRoZSBmaXJzdCBwbGFjZSwgaXMgaW4gYSAobmV3KSBQeXRob24gbW9kdWxlCisgKiBuYW1lZCBmcGVjdGwuIFRoaXMgbW9kdWxlIGlzIHN0YW5kYXJkIGluIGV2ZXJ5IHJlc3BlY3QuIEl0IGNhbiBiZSBsb2FkZWQKKyAqIGVpdGhlciBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IGFzIHlvdSBjaG9vc2UsIGFuZCBsaWtlIGFueSBvdGhlcgorICogUHl0aG9uIG1vZHVsZSwgaGFzIG5vIGVmZmVjdCB1bnRpbCB5b3UgaW1wb3J0IGl0LgorICogCisgKiBJbiB0aGUgZ2VuZXJhbCBjYXNlLCB0aGVyZSBhcmUgdGhyZWUgc3RlcHMgdG93YXJkIGhhbmRsaW5nIFNJR0ZQRSBpbiBhbnkKKyAqIFB5dGhvbiBjb2RlOgorICogCisgKiAxKSBBZGQgdGhlICpfUFJPVEVDVCBtYWNyb3MgdG8geW91ciBDIGNvZGUgYXMgcmVxdWlyZWQgdG8gcHJvdGVjdAorICogICAgZGFuZ2Vyb3VzIGZsb2F0aW5nIHBvaW50IHNlY3Rpb25zLgorICogCisgKiAyKSBUdXJuIG9uIHRoZSBpbmNsdXNpb24gb2YgdGhlIGNvZGUgYnkgYWRkaW5nIHRoZSBgYC0td2l0aC1mcGVjdGwnJworICogICAgZmxhZyBhdCB0aGUgdGltZSB5b3UgcnVuIGNvbmZpZ3VyZS4gIElmIHRoZSBmcGVjdGwgb3Igb3RoZXIgbW9kdWxlcworICogICAgd2hpY2ggdXNlIHRoZSAqX1BST1RFQ1QgbWFjcm9zIGFyZSB0byBiZSBkeW5hbWljYWxseSBsb2FkZWQsIGJlCisgKiAgICBzdXJlIHRoZXkgYXJlIGNvbXBpbGVkIHdpdGggV0FOVF9TSUdGUEVfSEFORExFUiBkZWZpbmVkLgorICogCisgKiAzKSBXaGVuIHB5dGhvbiBpcyBidWlsdCBhbmQgcnVubmluZywgaW1wb3J0IGZwZWN0bCwgYW5kIGV4ZWN1dGUKKyAqICAgIGZwZWN0bC50dXJub25fc2lnZnBlKCkuIFRoaXMgc2V0cyB1cCB0aGUgc2lnbmFsIGhhbmRsZXIgYW5kIGVuYWJsZXMKKyAqICAgIGdlbmVyYXRpb24gb2YgU0lHRlBFIHdoZW5ldmVyIGFuIGV4Y2VwdGlvbiBvY2N1cnMuIEZyb20gdGhpcyBwb2ludAorICogICAgb24sIGFueSBwcm9wZXJseSB0cmFwcGVkIFNJR0ZQRSBzaG91bGQgcmVzdWx0IGluIHRoZSBQeXRob24KKyAqICAgIEZsb2F0aW5nUG9pbnRFcnJvciBleGNlcHRpb24uCisgKiAKKyAqIFN0ZXAgMSBoYXMgYmVlbiBkb25lIGFscmVhZHkgZm9yIHRoZSBQeXRob24ga2VybmVsIGNvZGUsIGFuZCBzaG91bGQgYmUKKyAqIGRvbmUgc29vbiBmb3IgdGhlIE51bVB5IGFycmF5IHBhY2thZ2UuICBTdGVwIDIgaXMgdXN1YWxseSBkb25lIG9uY2UgYXQKKyAqIHB5dGhvbiBpbnN0YWxsIHRpbWUuIFB5dGhvbidzIGJlaGF2aW9yIHdpdGggcmVzcGVjdCB0byBTSUdGUEUgaXMgbm90CisgKiBjaGFuZ2VkIHVubGVzcyB5b3UgYWxzbyBkbyBzdGVwIDMuIFRodXMgeW91IGNhbiBjb250cm9sIHRoaXMgbmV3CisgKiBmYWNpbGl0eSBhdCBjb21waWxlIHRpbWUsIG9yIHJ1biB0aW1lLCBvciBib3RoLgorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiBVc2luZyB0aGUgbWFjcm9zIGluIHlvdXIgY29kZToKKyAqIAorICogc3RhdGljIFB5T2JqZWN0ICpmb29iYXIoUHlPYmplY3QgKnNlbGYsUHlPYmplY3QgKmFyZ3MpCisgKiB7CisgKiAgICAgLi4uLgorICogICAgIFB5RlBFX1NUQVJUX1BST1RFQ1QoIkVycm9yIGluIGZvb2JhciIsIHJldHVybiAwKQorICogICAgIHJlc3VsdCA9IGRhbmdlcm91c19vcChzb21lYXJnMSwgc29tZWFyZzIsIC4uLik7CisgKiAgICAgUHlGUEVfRU5EX1BST1RFQ1QocmVzdWx0KQorICogICAgIC4uLi4KKyAqIH0KKyAqIAorICogSWYgYSBmbG9hdGluZyBwb2ludCBlcnJvciBvY2N1cnMgaW4gZGFuZ2Vyb3VzX29wLCBmb29iYXIgcmV0dXJucyAwIChOVUxMKSwKKyAqIGFmdGVyIHNldHRpbmcgdGhlIGFzc29jaWF0ZWQgdmFsdWUgb2YgdGhlIEZsb2F0aW5nUG9pbnRFcnJvciBleGNlcHRpb24gdG8KKyAqICJFcnJvciBpbiBmb29iYXIiLiBgYERhbmdlcm91c19vcCcnIGNhbiBiZSBhIHNpbmdsZSBvcGVyYXRpb24sIG9yIGEgYmxvY2sKKyAqIG9mIGNvZGUsIGZ1bmN0aW9uIGNhbGxzLCBvciBhbnkgY29tYmluYXRpb24sIHNvIGxvbmcgYXMgbm8gYWx0ZXJuYXRlCisgKiByZXR1cm4gaXMgcG9zc2libGUgYmVmb3JlIHRoZSBQeUZQRV9FTkRfUFJPVEVDVCBtYWNybyBpcyByZWFjaGVkLgorICogCisgKiBUaGUgbWFjcm9zIGNhbiBvbmx5IGJlIHVzZWQgaW4gYSBmdW5jdGlvbiBjb250ZXh0IHdoZXJlIGFuIGVycm9yIHJldHVybgorICogY2FuIGJlIHJlY29nbml6ZWQgYXMgc2lnbmFsaW5nIGEgUHl0aG9uIGV4Y2VwdGlvbi4gKEdlbmVyYWxseSwgbW9zdAorICogZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgUHlPYmplY3QgKiB3aWxsIHF1YWxpZnkuKQorICogCisgKiBHdWlkbydzIG9yaWdpbmFsIGRlc2lnbiBzdWdnZXN0aW9uIGZvciBQeUZQRV9TVEFSVF9QUk9URUNUIGFuZAorICogUHlGUEVfRU5EX1BST1RFQ1QgaGFkIHRoZW0gb3BlbiBhbmQgY2xvc2UgYSBsb2NhbCBibG9jaywgd2l0aCBhIGxvY2FsbHkKKyAqIGRlZmluZWQgam1wX2J1ZiBhbmQgam1wX2J1ZiBwb2ludGVyLiBUaGlzIHdvdWxkIGFsbG93IHJlY3Vyc2l2ZSBuZXN0aW5nCisgKiBvZiB0aGUgbWFjcm9zLiBUaGUgQW5zaSBDIHN0YW5kYXJkIG1ha2VzIGl0IGNsZWFyIHRoYXQgc3VjaCBsb2NhbAorICogdmFyaWFibGVzIG5lZWQgdG8gYmUgZGVjbGFyZWQgd2l0aCB0aGUgInZvbGF0aWxlIiB0eXBlIHF1YWxpZmllciB0byBrZWVwCisgKiBzZXRqbXAgZnJvbSBjb3JydXB0aW5nIHRoZWlyIHZhbHVlcy4gU29tZSBjdXJyZW50IGltcGxlbWVudGF0aW9ucyBzZWVtCisgKiB0byBiZSBtb3JlIHJlc3RyaWN0aXZlLiBGb3IgZXhhbXBsZSwgdGhlIEhQVVggbWFuIHBhZ2UgZm9yIHNldGptcCBzYXlzCisgKiAKKyAqICAgVXBvbiB0aGUgcmV0dXJuIGZyb20gYSBzZXRqbXAoKSBjYWxsIGNhdXNlZCBieSBhIGxvbmdqbXAoKSwgdGhlCisgKiAgIHZhbHVlcyBvZiBhbnkgbm9uLXN0YXRpYyBsb2NhbCB2YXJpYWJsZXMgYmVsb25naW5nIHRvIHRoZSByb3V0aW5lCisgKiAgIGZyb20gd2hpY2ggc2V0am1wKCkgd2FzIGNhbGxlZCBhcmUgdW5kZWZpbmVkLiBDb2RlIHdoaWNoIGRlcGVuZHMgb24KKyAqICAgc3VjaCB2YWx1ZXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgcG9ydGFibGUuCisgKiAKKyAqIEkgdGhlcmVmb3JlIGRlY2lkZWQgb24gYSBtb3JlIGxpbWl0ZWQgZm9ybSBvZiBuZXN0aW5nLCB1c2luZyBhIGNvdW50ZXIKKyAqIHZhcmlhYmxlIChQeUZQRV9jb3VudGVyKSB0byBrZWVwIHRyYWNrIG9mIGFueSByZWN1cnNpb24uICBJZiBhbiBleGNlcHRpb24KKyAqIG9jY3VycyBpbiBhbiBgYGlubmVyJycgcGFpciBvZiBtYWNyb3MsIHRoZSByZXR1cm4gd2lsbCBhcHBhcmVudGx5CisgKiBjb21lIGZyb20gdGhlIG91dGVybW9zdCBsZXZlbC4KKyAqIAorICovCisKKyNpZmRlZiBXQU5UX1NJR0ZQRV9IQU5ETEVSCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorZXh0ZXJuIGptcF9idWYgUHlGUEVfamJ1ZjsKK2V4dGVybiBpbnQgUHlGUEVfY291bnRlcjsKK2V4dGVybiBkb3VibGUgUHlGUEVfZHVtbXkodm9pZCAqKTsKKworI2RlZmluZSBQeUZQRV9TVEFSVF9QUk9URUNUKGVycl9zdHJpbmcsIGxlYXZlX3N0bXQpIFwKK2lmICghUHlGUEVfY291bnRlcisrICYmIHNldGptcChQeUZQRV9qYnVmKSkgeyBcCisJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0Zsb2F0aW5nUG9pbnRFcnJvciwgZXJyX3N0cmluZyk7IFwKKwlQeUZQRV9jb3VudGVyID0gMDsgXAorCWxlYXZlX3N0bXQ7IFwKK30KKworLyoKKyAqIFRoaXMgKGZvbGxvd2luZykgaXMgYSBoZWNrIG9mIGEgd2F5IHRvIGRlY3JlbWVudCBhIGNvdW50ZXIuIEhvd2V2ZXIsCisgKiB1bmxlc3MgdGhlIG1hY3JvIGFyZ3VtZW50IGlzIHByb3ZpZGVkLCBjb2RlIG9wdGltaXplcnMgd2lsbCBzb21ldGltZXMgbW92ZQorICogdGhpcyBzdGF0ZW1lbnQgc28gdGhhdCBpdCBnZXRzIGV4ZWN1dGVkICpiZWZvcmUqIHRoZSB1bnNhZmUgZXhwcmVzc2lvbgorICogd2hpY2ggd2UncmUgdHJ5aW5nIHRvIHByb3RlY3QuICBUaGF0IHByZXR0eSB3ZWxsIG1lc3NlcyB0aGluZ3MgdXAsCisgKiBvZiBjb3Vyc2UuCisgKiAKKyAqIElmIHRoZSBleHByZXNzaW9uKHMpIHlvdSdyZSB0cnlpbmcgdG8gcHJvdGVjdCBkb24ndCBoYXBwZW4gdG8gcmV0dXJuIGEKKyAqIHZhbHVlLCB5b3Ugd2lsbCBuZWVkIHRvIG1hbnVmYWN0dXJlIGEgZHVtbXkgcmVzdWx0IGp1c3QgdG8gcHJlc2VydmUgdGhlCisgKiBjb3JyZWN0IG9yZGVyaW5nIG9mIHN0YXRlbWVudHMuICBOb3RlIHRoYXQgdGhlIG1hY3JvIHBhc3NlcyB0aGUgYWRkcmVzcworICogb2YgaXRzIGFyZ3VtZW50IChzbyB5b3UgbmVlZCB0byBnaXZlIGl0IHNvbWV0aGluZyB3aGljaCBpcyBhZGRyZXNzYWJsZSkuCisgKiBJZiB5b3VyIGV4cHJlc3Npb24gcmV0dXJucyBtdWx0aXBsZSByZXN1bHRzLCBwYXNzIHRoZSBsYXN0IHN1Y2ggcmVzdWx0CisgKiB0byBQeUZQRV9FTkRfUFJPVEVDVC4KKyAqIAorICogTm90ZSB0aGF0IFB5RlBFX2R1bW15IHJldHVybnMgYSBkb3VibGUsIHdoaWNoIGlzIGNhc3QgdG8gaW50LgorICogVGhpcyBzZWVtaW5nIGluc2FuaXR5IGlzIHRvIHRpY2tsZSB0aGUgRmxvYXRpbmcgUG9pbnQgVW5pdCAoRlBVKS4KKyAqIElmIGFuIGV4Y2VwdGlvbiBoYXMgb2NjdXJyZWQgaW4gYSBwcmVjZWRpbmcgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uLAorICogc29tZSBhcmNoaXRlY3R1cmVzIChub3RhYmx5IEludGVsIDgweDg2KSB3aWxsIG5vdCBkZWxpdmVyIHRoZSBpbnRlcnJ1cHQKKyAqIHVudGlsIHRoZSAqbmV4dCogZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9uLiAgVGhpcyBpcyBwYWluZnVsIGlmIHlvdSd2ZQorICogYWxyZWFkeSBkZWNyZW1lbnRlZCBQeUZQRV9jb3VudGVyLgorICovCisjZGVmaW5lIFB5RlBFX0VORF9QUk9URUNUKHYpIFB5RlBFX2NvdW50ZXIgLT0gKGludClQeUZQRV9kdW1teSgmKHYpKTsKKworI2Vsc2UKKworI2RlZmluZSBQeUZQRV9TVEFSVF9QUk9URUNUKGVycl9zdHJpbmcsIGxlYXZlX3N0bXQpCisjZGVmaW5lIFB5RlBFX0VORF9QUk9URUNUKHYpCisKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9QWUZQRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weWdldG9wdC5oIGIvaW5jbHVkZS9weXRob24yLjcvcHlnZXRvcHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODYwZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlnZXRvcHQuaApAQCAtMCwwICsxLDE4IEBACisKKyNpZm5kZWYgUHlfUFlHRVRPUFRfSAorI2RlZmluZSBQeV9QWUdFVE9QVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0RBVEEoaW50KSBfUHlPU19vcHRlcnI7CitQeUFQSV9EQVRBKGludCkgX1B5T1Nfb3B0aW5kOworUHlBUElfREFUQShjaGFyICopIF9QeU9TX29wdGFyZzsKKworUHlBUElfRlVOQyh2b2lkKSBfUHlPU19SZXNldEdldE9wdCh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlPU19HZXRPcHQoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBjaGFyICpvcHRzdHJpbmcpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9QWUdFVE9QVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weW1hY2NvbmZpZy5oIGIvaW5jbHVkZS9weXRob24yLjcvcHltYWNjb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGU3YjhkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHltYWNjb25maWcuaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZiBQWU1BQ0NPTkZJR19ICisjZGVmaW5lIFBZTUFDQ09ORklHX0gKKyAgICAgLyoKKyAgICAgICogVGhpcyBmaWxlIG1vdmVzIHNvbWUgb2YgdGhlIGF1dG9jb25mIG1hZ2ljIHRvIGNvbXBpbGUtdGltZQorICAgICAgKiB3aGVuIGJ1aWxkaW5nIG9uIE1hY09TWC4gVGhpcyBpcyBuZWVkZWQgZm9yIGJ1aWxkaW5nIDQtd2F5CisgICAgICAqIHVuaXZlcnNhbCBiaW5hcmllcyBhbmQgZm9yIDY0LWJpdCB1bml2ZXJzYWwgYmluYXJpZXMgYmVjYXVzZQorICAgICAgKiB0aGUgdmFsdWVzIHJlZGVmaW5lZCBiZWxvdyBhcmVuJ3QgY29uZmlndXJlLXRpbWUgY29uc3RhbnQgYnV0CisgICAgICAqIG9ubHkgY29tcGlsZS10aW1lIGNvbnN0YW50IGluIHRoZXNlIHNjZW5hcmlvcy4KKyAgICAgICovCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworIyB1bmRlZiBTSVpFT0ZfTE9ORworIyB1bmRlZiBTSVpFT0ZfUFRIUkVBRF9UCisjIHVuZGVmIFNJWkVPRl9TSVpFX1QKKyMgdW5kZWYgU0laRU9GX1RJTUVfVAorIyB1bmRlZiBTSVpFT0ZfVk9JRF9QCisjIHVuZGVmIFNJWkVPRl9fQk9PTAorIyB1bmRlZiBTSVpFT0ZfVUlOVFBUUl9UCisjIHVuZGVmIFNJWkVPRl9QVEhSRUFEX1QKKyMgdW5kZWYgV09SRFNfQklHRU5ESUFOCisjIHVuZGVmIERPVUJMRV9JU19BUk1fTUlYRURfRU5ESUFOX0lFRUU3NTQKKyMgdW5kZWYgRE9VQkxFX0lTX0JJR19FTkRJQU5fSUVFRTc1NAorIyB1bmRlZiBET1VCTEVfSVNfTElUVExFX0VORElBTl9JRUVFNzU0CisjIHVuZGVmIEhBVkVfR0NDX0FTTV9GT1JfWDg3CisKKyMgICAgdW5kZWYgVkFfTElTVF9JU19BUlJBWQorIyAgICBpZiBkZWZpbmVkKF9fTFA2NF9fKSAmJiBkZWZpbmVkKF9feDg2XzY0X18pCisjICAgICAgICBkZWZpbmUgVkFfTElTVF9JU19BUlJBWSAxCisjICAgIGVuZGlmCisKKyMgICAgdW5kZWYgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVAorIyAgICBpZm5kZWYgX19MUDY0X18KKyMgICAgICAgICBkZWZpbmUgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCAxCisjICAgIGVuZGlmCisKKyMgICAgdW5kZWYgU0laRU9GX0xPTkcKKyMgICAgaWZkZWYgX19MUDY0X18KKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICAgICAxCisjICAgICAgICBkZWZpbmUgU0laRU9GX19CT09MICAgICAgICAgICAgMQorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9MT05HICAgICAgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfUFRIUkVBRF9UICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1NJWkVfVCAgICAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9USU1FX1QgICAgICAgICAgIDgKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVk9JRF9QICAgICAgICAgICA4CisjICAgICAgICBkZWZpbmUgU0laRU9GX1VJTlRQVFJfVCAgICAgICAgOAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgICAgICAgIDgKKyMgICAgZWxzZQorIyAgICAgICAgaWZkZWYgX19wcGNfXworIyAgICAgICAgICAgZGVmaW5lIFNJWkVPRl9fQk9PTCAgICAgICAgIDQKKyMgICAgICAgIGVsc2UKKyMgICAgICAgICAgIGRlZmluZSBTSVpFT0ZfX0JPT0wgICAgICAgICAxCisjICAgICAgICBlbmRpZgorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9MT05HICAgICAgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfUFRIUkVBRF9UICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1NJWkVfVCAgICAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9USU1FX1QgICAgICAgICAgIDQKKyMgICAgICAgIGRlZmluZSBTSVpFT0ZfVk9JRF9QICAgICAgICAgICA0CisjICAgICAgICBkZWZpbmUgU0laRU9GX1VJTlRQVFJfVCAgICAgICAgNAorIyAgICAgICAgZGVmaW5lIFNJWkVPRl9QVEhSRUFEX1QgICAgICAgIDQKKyMgICAgZW5kaWYKKworIyAgICBpZiBkZWZpbmVkKF9fTFA2NF9fKQorICAgICAvKiBNYWNPU1ggMTAuNCAodGhlIGZpcnN0IHJlbGVhc2UgdG8gc3VwcG9ydCA2NC1iaXQgY29kZQorICAgICAgKiBhdCBhbGwpIG9ubHkgc3VwcG9ydHMgNjQtYml0IGluIHRoZSBVTklYIGxheWVyLgorICAgICAgKiBUaGVyZWZvcmUgc3VycHJlc3MgdGhlIHRvb2xib3gtZ2x1ZSBpbiA2NC1iaXQgbW9kZS4KKyAgICAgICovCisKKyAgICAvKiBJbiA2NC1iaXQgbW9kZSBzZXRwZ3JwIGFsd2F5cyBoYXMgbm8gYXJnbWVudHMsIGluIDMyLWJpdAorICAgICAqIG1vZGUgdGhhdCBkZXBlbmRzIG9uIHRoZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudAorICAgICAqLworIyAgICAgICB1bmRlZiBTRVRQR1JQX0hBVkVfQVJHCisKKyMgICAgZW5kaWYKKworI2lmZGVmIF9fQklHX0VORElBTl9fCisjZGVmaW5lIFdPUkRTX0JJR0VORElBTiAxCisjZGVmaW5lIERPVUJMRV9JU19CSUdfRU5ESUFOX0lFRUU3NTQKKyNlbHNlCisjZGVmaW5lIERPVUJMRV9JU19MSVRUTEVfRU5ESUFOX0lFRUU3NTQKKyNlbmRpZiAvKiBfX0JJR19FTkRJQU4gKi8KKworI2lmZGVmIF9faTM4Nl9fCisjIGRlZmluZSBIQVZFX0dDQ19BU01fRk9SX1g4NworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFRoZSBkZWZpbml0aW9uIGluIHB5Y29uZmlnLmggaXMgb25seSB2YWxpZCBvbiB0aGUgT1MgcmVsZWFzZQorICAgICAqIHdoZXJlIGNvbmZpZ3VyZSByYW4gb24gYW5kIG5vdCBuZWNlc3NhcmlseSBmb3IgYWxsIHN5c3RlbXMgd2hlcmUKKyAgICAgKiB0aGUgZXhlY3V0YWJsZSBjYW4gYmUgdXNlZCBvbi4KKyAgICAgKgorICAgICAqIFNwZWNpZmljYWxseTogT1NYIDEwLjQgaGFzIGxpbWl0ZWQgc3VwcG9ydGVkIGZvciAnJXpkJywgd2hpbGUKKyAgICAgKiAxMC41IGhhcyBmdWxsIHN1cHBvcnQgZm9yICclemQnLiBBIGJpbmFyeSBidWlsdCBvbiAxMC41IHdvbid0CisgICAgICogd29yayBwcm9wZXJseSBvbiAxMC40IHVubGVzcyB3ZSBzdXJwcmVzcyB0aGUgZGVmaW5pdGlvbgorICAgICAqIG9mIFBZX0ZPUk1BVF9TSVpFX1QKKyAgICAgKi8KKyN1bmRlZiAgUFlfRk9STUFUX1NJWkVfVAorCisKKyNlbmRpZiAvKiBkZWZpbmVkKF9BUFBMRV9fKSAqLworCisjZW5kaWYgLyogUFlNQUNDT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHltYWN0b29sYm94LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weW1hY3Rvb2xib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE1OTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHltYWN0b29sYm94LmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisqKiBweW1hY3Rvb2xib3guaCAtIGdsb2JhbHMgZGVmaW5lZCBpbiBtYWN0b29sYm94Z2x1ZS5jCisqLworI2lmbmRlZiBQeV9QWU1BQ1RPT0xCT1hfSAorI2RlZmluZSBQeV9QWU1BQ1RPT0xCT1hfSAorI2lmZGVmIF9fY3BsdXNwbHVzCisJZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPENhcmJvbi9DYXJib24uaD4KKworI2lmbmRlZiBfX0xQNjRfXworI2luY2x1ZGUgPFF1aWNrVGltZS9RdWlja1RpbWUuaD4KKyNlbmRpZiAvKiAhX19MUDY0X18gKi8KKworLyoKKyoqIEhlbHBlciByb3V0aW5lcyBmb3IgZXJyb3IgY29kZXMgYW5kIHN1Y2guCisqLworY2hhciAqUHlNYWNfU3RyRXJyb3IoaW50KTsJCQkvKiBzdHJlcnJvciB3aXRoIG1hYyBlcnJvcnMgKi8KK2V4dGVybiBQeU9iamVjdCAqUHlNYWNfT1NFcnJFeGNlcHRpb247CQkvKiBFeGNlcHRpb24gZm9yIE9TRXJyICovCitQeU9iamVjdCAqUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24odm9pZCk7CS8qIEluaXRpYWxpemUgJiByZXR1cm4gaXQgKi8KK1B5T2JqZWN0ICpQeUVycl9NYWMoUHlPYmplY3QgKiwgaW50KTsJCS8qIEV4Y2VwdGlvbiB3aXRoIGEgbWFjIGVycm9yICovCitQeU9iamVjdCAqUHlNYWNfRXJyb3IoT1NFcnIpOwkJCS8qIFVzZXMgUHlNYWNfR2V0T1NFcnJFeGNlcHRpb24gKi8KKyNpZm5kZWYgX19MUDY0X18gCitleHRlcm4gT1NFcnIgUHlNYWNfR2V0RnVsbFBhdGhuYW1lKEZTU3BlYyAqLCBjaGFyICosIGludCk7IC8qIGNvbnZlcnQKKwkJCQkJCQkgICAgICBmc3NwZWMtPnBhdGggKi8KKyNlbmRpZiAvKiBfX0xQNjRfXyAqLworCisvKgorKiogVGhlc2UgY29udmVyc2lvbiByb3V0aW5lcyBhcmUgZGVmaW5lZCBpbiBtYWN0b29sYm94Z2x1ZS5jIGl0c2VsZi4KKyovCitpbnQgUHlNYWNfR2V0T1NUeXBlKFB5T2JqZWN0ICosIE9TVHlwZSAqKTsJLyogYXJndW1lbnQgcGFyc2VyIGZvciBPU1R5cGUgKi8KK1B5T2JqZWN0ICpQeU1hY19CdWlsZE9TVHlwZShPU1R5cGUpOwkJLyogQ29udmVydCBPU1R5cGUgdG8gUHlPYmplY3QgKi8KKworUHlPYmplY3QgKlB5TWFjX0J1aWxkTnVtVmVyc2lvbihOdW1WZXJzaW9uKTsvKiBDb252ZXJ0IE51bVZlcnNpb24gdG8gUHlPYmplY3QgKi8KKworaW50IFB5TWFjX0dldFN0cjI1NShQeU9iamVjdCAqLCBTdHIyNTUpOwkvKiBhcmd1bWVudCBwYXJzZXIgZm9yIFN0cjI1NSAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkU3RyMjU1KFN0cjI1NSk7CQkvKiBDb252ZXJ0IFN0cjI1NSB0byBQeU9iamVjdCAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkT3B0U3RyMjU1KFN0cjI1NSk7CQkvKiBDb252ZXJ0IFN0cjI1NSB0byBQeU9iamVjdCwKKwkJCQkJCSAgIE5VTEwgdG8gTm9uZSAqLworCitpbnQgUHlNYWNfR2V0UmVjdChQeU9iamVjdCAqLCBSZWN0ICopOwkJLyogYXJndW1lbnQgcGFyc2VyIGZvciBSZWN0ICovCitQeU9iamVjdCAqUHlNYWNfQnVpbGRSZWN0KFJlY3QgKik7CQkvKiBDb252ZXJ0IFJlY3QgdG8gUHlPYmplY3QgKi8KKworaW50IFB5TWFjX0dldFBvaW50KFB5T2JqZWN0ICosIFBvaW50ICopOwkvKiBhcmd1bWVudCBwYXJzZXIgZm9yIFBvaW50ICovCitQeU9iamVjdCAqUHlNYWNfQnVpbGRQb2ludChQb2ludCk7CQkvKiBDb252ZXJ0IFBvaW50IHRvIFB5T2JqZWN0ICovCisKK2ludCBQeU1hY19HZXRFdmVudFJlY29yZChQeU9iamVjdCAqLCBFdmVudFJlY29yZCAqKTsgLyogYXJndW1lbnQgcGFyc2VyIGZvcgorCQkJCQkJCUV2ZW50UmVjb3JkICovCitQeU9iamVjdCAqUHlNYWNfQnVpbGRFdmVudFJlY29yZChFdmVudFJlY29yZCAqKTsgLyogQ29udmVydCBFdmVudFJlY29yZCB0bworCQkJCQkJICAgIFB5T2JqZWN0ICovCisKK2ludCBQeU1hY19HZXRGaXhlZChQeU9iamVjdCAqLCBGaXhlZCAqKTsJLyogYXJndW1lbnQgcGFyc2VyIGZvciBGaXhlZCAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkRml4ZWQoRml4ZWQpOwkJLyogQ29udmVydCBGaXhlZCB0byBQeU9iamVjdCAqLworaW50IFB5TWFjX0dldHdpZGUoUHlPYmplY3QgKiwgd2lkZSAqKTsJCS8qIGFyZ3VtZW50IHBhcnNlciBmb3Igd2lkZSAqLworUHlPYmplY3QgKlB5TWFjX0J1aWxkd2lkZSh3aWRlICopOwkJLyogQ29udmVydCB3aWRlIHRvIFB5T2JqZWN0ICovCisKKy8qCisqKiBUaGUgcmVzdCBvZiB0aGUgcm91dGluZXMgYXJlIGltcGxlbWVudGVkIGJ5IGV4dGVuc2lvbiBtb2R1bGVzLiBJZiB0aGV5IGFyZQorKiogZHluYW1pY2FsbHkgbG9hZGVkIG1hY3Rvb2xib3hnbHVlIHdpbGwgY29udGFpbiBhIHN0dWIgaW1wbGVtZW50YXRpb24gb2YgdGhlCisqKiByb3V0aW5lLCB3aGljaCBpbXBvcnRzIHRoZSBtb2R1bGUsIHdoZXJldXBvbiB0aGUgbW9kdWxlJ3MgaW5pdCByb3V0aW5lIHdpbGwKKyoqIGNvbW11bmljYXRlIHRoZSByb3V0aW5lIHBvaW50ZXIgYmFjayB0byB0aGUgc3R1Yi4KKyoqIElmIFVTRV9UT09MQk9YX09CSkVDVF9HTFVFIGlzIG5vdCBkZWZpbmVkIHRoZXJlIGlzIG5vIGdsdWUgY29kZSwgYW5kIHRoZQorKiogZXh0ZW5zaW9uIG1vZHVsZXMgc2ltcGx5IGRlY2xhcmUgdGhlIHJvdXRpbmUuIFRoaXMgaXMgdGhlIGNhc2UgZm9yIHN0YXRpYworKiogYnVpbGRzIChhbmQgY291bGQgYmUgdGhlIGNhc2UgZm9yIE1hY1B5dGhvbiBDRk0gYnVpbGRzLCBiZWNhdXNlIENGTSBleHRlbnNpb24KKyoqIG1vZHVsZXMgY2FuIHJlZmVyZW5jZSBlYWNoIG90aGVyIHdpdGhvdXQgcHJvYmxlbXMpLgorKi8KKworI2lmZGVmIFVTRV9UT09MQk9YX09CSkVDVF9HTFVFCisvKgorKiogVGhlc2UgbWFjcm9zIGFyZSB1c2VkIGluIHRoZSBtb2R1bGUgaW5pdCBjb2RlLiBJZiB3ZSB1c2UgdG9vbGJveCBvYmplY3QgZ2x1ZQorKiogaXQgc2V0cyB0aGUgZnVuY3Rpb24gcG9pbnRlciB0byBwb2ludCB0byB0aGUgcmVhbCBmdW5jdGlvbi4KKyovCisjZGVmaW5lIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKG9iamVjdCwgcnRuKSB7IFwKKwlleHRlcm4gUHlPYmplY3QgKigqUHlNYWNHbHVlUHRyXyMjcnRuKShvYmplY3QpOyBcCisJUHlNYWNHbHVlUHRyXyMjcnRuID0gXyMjcnRuOyBcCit9CisjZGVmaW5lIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChvYmplY3QsIHJ0bikgeyBcCisJZXh0ZXJuIGludCAoKlB5TWFjR2x1ZVB0cl8jI3J0bikoUHlPYmplY3QgKiwgb2JqZWN0ICopOyBcCisJUHlNYWNHbHVlUHRyXyMjcnRuID0gXyMjcnRuOyBcCit9CisjZWxzZQorLyoKKyoqIElmIHdlIGRvbid0IHVzZSB0b29sYm94IG9iamVjdCBnbHVlIHRoZSBpbml0IG1hY3JvcyBhcmUgZW1wdHkuIE1vcmVvdmVyLCB3ZSBkZWZpbmUKKyoqIF94eHhfTmV3IHRvIGJlIHRoZSBzYW1lIGFzIHh4eF9OZXcsIGFuZCB0aGUgY29kZSBpbiBtYWN0b29sYm94Z2x1ZSBpc24ndCBpbmNsdWRlZC4KKyovCisjZGVmaW5lIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKG9iamVjdCwgcnRuKQorI2RlZmluZSBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQob2JqZWN0LCBydG4pCisjZW5kaWYgLyogVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUgKi8KKworLyogbWFjZnMgZXhwb3J0cyAqLworI2lmbmRlZiBfX0xQNjRfXworaW50IFB5TWFjX0dldEZTU3BlYyhQeU9iamVjdCAqLCBGU1NwZWMgKik7CS8qIGFyZ3VtZW50IHBhcnNlciBmb3IgRlNTcGVjICovCitQeU9iamVjdCAqUHlNYWNfQnVpbGRGU1NwZWMoRlNTcGVjICopOwkJLyogQ29udmVydCBGU1NwZWMgdG8gUHlPYmplY3QgKi8KKyNlbmRpZiAvKiAhX19MUDY0X18gKi8KKworaW50IFB5TWFjX0dldEZTUmVmKFB5T2JqZWN0ICosIEZTUmVmICopOwkvKiBhcmd1bWVudCBwYXJzZXIgZm9yIEZTUmVmICovCitQeU9iamVjdCAqUHlNYWNfQnVpbGRGU1JlZihGU1JlZiAqKTsJCS8qIENvbnZlcnQgRlNSZWYgdG8gUHlPYmplY3QgKi8KKworLyogQUUgZXhwb3J0cyAqLworZXh0ZXJuIFB5T2JqZWN0ICpBRURlc2NfTmV3KEFwcGxlRXZlbnQgKik7IC8qIFhYWFggV2h5IHBhc3NlZCBieSBhZGRyZXNzPz8gKi8KK2V4dGVybiBQeU9iamVjdCAqQUVEZXNjX05ld0JvcnJvd2VkKEFwcGxlRXZlbnQgKik7CitleHRlcm4gaW50IEFFRGVzY19Db252ZXJ0KFB5T2JqZWN0ICosIEFwcGxlRXZlbnQgKik7CisKKy8qIENtIGV4cG9ydHMgKi8KK2V4dGVybiBQeU9iamVjdCAqQ21wT2JqX05ldyhDb21wb25lbnQpOworZXh0ZXJuIGludCBDbXBPYmpfQ29udmVydChQeU9iamVjdCAqLCBDb21wb25lbnQgKik7CitleHRlcm4gUHlPYmplY3QgKkNtcEluc3RPYmpfTmV3KENvbXBvbmVudEluc3RhbmNlKTsKK2V4dGVybiBpbnQgQ21wSW5zdE9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENvbXBvbmVudEluc3RhbmNlICopOworCisvKiBDdGwgZXhwb3J0cyAqLworI2lmbmRlZiBfX0xQNjRfXworZXh0ZXJuIFB5T2JqZWN0ICpDdGxPYmpfTmV3KENvbnRyb2xIYW5kbGUpOworZXh0ZXJuIGludCBDdGxPYmpfQ29udmVydChQeU9iamVjdCAqLCBDb250cm9sSGFuZGxlICopOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBEbGcgZXhwb3J0cyAqLworI2lmbmRlZiBfX0xQNjRfXworZXh0ZXJuIFB5T2JqZWN0ICpEbGdPYmpfTmV3KERpYWxvZ1B0cik7CitleHRlcm4gaW50IERsZ09ial9Db252ZXJ0KFB5T2JqZWN0ICosIERpYWxvZ1B0ciAqKTsKK2V4dGVybiBQeU9iamVjdCAqRGxnT2JqX1doaWNoRGlhbG9nKERpYWxvZ1B0cik7CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qIERyYWcgZXhwb3J0cyAqLworI2lmbmRlZiBfX0xQNjRfXworZXh0ZXJuIFB5T2JqZWN0ICpEcmFnT2JqX05ldyhEcmFnUmVmZXJlbmNlKTsKK2V4dGVybiBpbnQgRHJhZ09ial9Db252ZXJ0KFB5T2JqZWN0ICosIERyYWdSZWZlcmVuY2UgKik7CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qIExpc3QgZXhwb3J0cyAqLworI2lmbmRlZiBfX0xQNjRfXworZXh0ZXJuIFB5T2JqZWN0ICpMaXN0T2JqX05ldyhMaXN0SGFuZGxlKTsKK2V4dGVybiBpbnQgTGlzdE9ial9Db252ZXJ0KFB5T2JqZWN0ICosIExpc3RIYW5kbGUgKik7CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qIE1lbnUgZXhwb3J0cyAqLworI2lmbmRlZiBfX0xQNjRfXworZXh0ZXJuIFB5T2JqZWN0ICpNZW51T2JqX05ldyhNZW51SGFuZGxlKTsKK2V4dGVybiBpbnQgTWVudU9ial9Db252ZXJ0KFB5T2JqZWN0ICosIE1lbnVIYW5kbGUgKik7CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qIFFkIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqR3JhZk9ial9OZXcoR3JhZlB0cik7CitleHRlcm4gaW50IEdyYWZPYmpfQ29udmVydChQeU9iamVjdCAqLCBHcmFmUHRyICopOworZXh0ZXJuIFB5T2JqZWN0ICpCTU9ial9OZXcoQml0TWFwUHRyKTsKK2V4dGVybiBpbnQgQk1PYmpfQ29udmVydChQeU9iamVjdCAqLCBCaXRNYXBQdHIgKik7CitleHRlcm4gUHlPYmplY3QgKlFkUkdCX05ldyhSR0JDb2xvciAqKTsKK2V4dGVybiBpbnQgUWRSR0JfQ29udmVydChQeU9iamVjdCAqLCBSR0JDb2xvciAqKTsKKyNlbmRpZiAvKiAhX19MUDY0X18gKi8KKworLyogUWRvZmZzIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqR1dvcmxkT2JqX05ldyhHV29ybGRQdHIpOworZXh0ZXJuIGludCBHV29ybGRPYmpfQ29udmVydChQeU9iamVjdCAqLCBHV29ybGRQdHIgKik7CisjZW5kaWYgLyogIV9fTFA2NF9fICovCisKKy8qIFF0IGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqVHJhY2tPYmpfTmV3KFRyYWNrKTsKK2V4dGVybiBpbnQgVHJhY2tPYmpfQ29udmVydChQeU9iamVjdCAqLCBUcmFjayAqKTsKK2V4dGVybiBQeU9iamVjdCAqTW92aWVPYmpfTmV3KE1vdmllKTsKK2V4dGVybiBpbnQgTW92aWVPYmpfQ29udmVydChQeU9iamVjdCAqLCBNb3ZpZSAqKTsKK2V4dGVybiBQeU9iamVjdCAqTW92aWVDdGxPYmpfTmV3KE1vdmllQ29udHJvbGxlcik7CitleHRlcm4gaW50IE1vdmllQ3RsT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgTW92aWVDb250cm9sbGVyICopOworZXh0ZXJuIFB5T2JqZWN0ICpUaW1lQmFzZU9ial9OZXcoVGltZUJhc2UpOworZXh0ZXJuIGludCBUaW1lQmFzZU9ial9Db252ZXJ0KFB5T2JqZWN0ICosIFRpbWVCYXNlICopOworZXh0ZXJuIFB5T2JqZWN0ICpVc2VyRGF0YU9ial9OZXcoVXNlckRhdGEpOworZXh0ZXJuIGludCBVc2VyRGF0YU9ial9Db252ZXJ0KFB5T2JqZWN0ICosIFVzZXJEYXRhICopOworZXh0ZXJuIFB5T2JqZWN0ICpNZWRpYU9ial9OZXcoTWVkaWEpOworZXh0ZXJuIGludCBNZWRpYU9ial9Db252ZXJ0KFB5T2JqZWN0ICosIE1lZGlhICopOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBSZXMgZXhwb3J0cyAqLworZXh0ZXJuIFB5T2JqZWN0ICpSZXNPYmpfTmV3KEhhbmRsZSk7CitleHRlcm4gaW50IFJlc09ial9Db252ZXJ0KFB5T2JqZWN0ICosIEhhbmRsZSAqKTsKK2V4dGVybiBQeU9iamVjdCAqT3B0UmVzT2JqX05ldyhIYW5kbGUpOworZXh0ZXJuIGludCBPcHRSZXNPYmpfQ29udmVydChQeU9iamVjdCAqLCBIYW5kbGUgKik7CisKKy8qIFRFIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqVEVPYmpfTmV3KFRFSGFuZGxlKTsKK2V4dGVybiBpbnQgVEVPYmpfQ29udmVydChQeU9iamVjdCAqLCBURUhhbmRsZSAqKTsKKyNlbmRpZiAvKiAhX19MUDY0X18gKi8KKworLyogV2luIGV4cG9ydHMgKi8KKyNpZm5kZWYgX19MUDY0X18KK2V4dGVybiBQeU9iamVjdCAqV2luT2JqX05ldyhXaW5kb3dQdHIpOworZXh0ZXJuIGludCBXaW5PYmpfQ29udmVydChQeU9iamVjdCAqLCBXaW5kb3dQdHIgKik7CitleHRlcm4gUHlPYmplY3QgKldpbk9ial9XaGljaFdpbmRvdyhXaW5kb3dQdHIpOworI2VuZGlmIC8qICFfX0xQNjRfXyAqLworCisvKiBDRiBleHBvcnRzICovCitleHRlcm4gUHlPYmplY3QgKkNGT2JqX05ldyhDRlR5cGVSZWYpOworZXh0ZXJuIGludCBDRk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGVHlwZVJlZiAqKTsKK2V4dGVybiBQeU9iamVjdCAqQ0ZUeXBlUmVmT2JqX05ldyhDRlR5cGVSZWYpOworZXh0ZXJuIGludCBDRlR5cGVSZWZPYmpfQ29udmVydChQeU9iamVjdCAqLCBDRlR5cGVSZWYgKik7CitleHRlcm4gUHlPYmplY3QgKkNGU3RyaW5nUmVmT2JqX05ldyhDRlN0cmluZ1JlZik7CitleHRlcm4gaW50IENGU3RyaW5nUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ0ZTdHJpbmdSZWYgKik7CitleHRlcm4gUHlPYmplY3QgKkNGTXV0YWJsZVN0cmluZ1JlZk9ial9OZXcoQ0ZNdXRhYmxlU3RyaW5nUmVmKTsKK2V4dGVybiBpbnQgQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ0ZNdXRhYmxlU3RyaW5nUmVmICopOworZXh0ZXJuIFB5T2JqZWN0ICpDRkFycmF5UmVmT2JqX05ldyhDRkFycmF5UmVmKTsKK2V4dGVybiBpbnQgQ0ZBcnJheVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGQXJyYXlSZWYgKik7CitleHRlcm4gUHlPYmplY3QgKkNGTXV0YWJsZUFycmF5UmVmT2JqX05ldyhDRk11dGFibGVBcnJheVJlZik7CitleHRlcm4gaW50IENGTXV0YWJsZUFycmF5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ0ZNdXRhYmxlQXJyYXlSZWYgKik7CitleHRlcm4gUHlPYmplY3QgKkNGRGljdGlvbmFyeVJlZk9ial9OZXcoQ0ZEaWN0aW9uYXJ5UmVmKTsKK2V4dGVybiBpbnQgQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ0ZEaWN0aW9uYXJ5UmVmICopOworZXh0ZXJuIFB5T2JqZWN0ICpDRk11dGFibGVEaWN0aW9uYXJ5UmVmT2JqX05ldyhDRk11dGFibGVEaWN0aW9uYXJ5UmVmKTsKK2V4dGVybiBpbnQgQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICosIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgKik7CitleHRlcm4gUHlPYmplY3QgKkNGVVJMUmVmT2JqX05ldyhDRlVSTFJlZik7CitleHRlcm4gaW50IENGVVJMUmVmT2JqX0NvbnZlcnQoUHlPYmplY3QgKiwgQ0ZVUkxSZWYgKik7CitleHRlcm4gaW50IE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydChQeU9iamVjdCAqLCBDRlVSTFJlZiAqKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisJfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5bWF0aC5oIGIvaW5jbHVkZS9weXRob24yLjcvcHltYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmZDIyZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3B5bWF0aC5oCkBAIC0wLDAgKzEsMTk0IEBACisjaWZuZGVmIFB5X1BZTUFUSF9ICisjZGVmaW5lIFB5X1BZTUFUSF9ICisKKyNpbmNsdWRlICJweWNvbmZpZy5oIiAvKiBpbmNsdWRlIGZvciBkZWZpbmVzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorU3ltYm9scyBhbmQgbWFjcm9zIHRvIHN1cHBseSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHRvIG1hdGhlbWF0aWNhbAorZnVuY3Rpb25zIGFuZCBjb25zdGFudHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQeXRob24gcHJvdmlkZXMgaW1wbGVtZW50YXRpb25zIGZvciBjb3B5c2lnbiwgcm91bmQgYW5kIGh5cG90IGluCisgKiBQeXRob24vcHltYXRoLmMganVzdCBpbiBjYXNlIHlvdXIgbWF0aCBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZSB0aGUKKyAqIGZ1bmN0aW9ucy4KKyAqCisgKk5vdGU6IFBDL3B5Y29uZmlnLmggZGVmaW5lcyBjb3B5c2lnbiBhcyBfY29weXNpZ24KKyAqLworI2lmbmRlZiBIQVZFX0NPUFlTSUdOCitleHRlcm4gZG91YmxlIGNvcHlzaWduKGRvdWJsZSwgZG91YmxlKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfUk9VTkQKK2V4dGVybiBkb3VibGUgcm91bmQoZG91YmxlKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSFlQT1QKK2V4dGVybiBkb3VibGUgaHlwb3QoZG91YmxlLCBkb3VibGUpOworI2VuZGlmCisKKy8qIGV4dHJhIGRlY2xhcmF0aW9ucyAqLworI2lmbmRlZiBfTVNDX1ZFUgorI2lmbmRlZiBfX1NURENfXworZXh0ZXJuIGRvdWJsZSBmbW9kIChkb3VibGUsIGRvdWJsZSk7CitleHRlcm4gZG91YmxlIGZyZXhwIChkb3VibGUsIGludCAqKTsKK2V4dGVybiBkb3VibGUgbGRleHAgKGRvdWJsZSwgaW50KTsKK2V4dGVybiBkb3VibGUgbW9kZiAoZG91YmxlLCBkb3VibGUgKik7CitleHRlcm4gZG91YmxlIHBvdyhkb3VibGUsIGRvdWJsZSk7CisjZW5kaWYgLyogX19TVERDX18gKi8KKyNlbmRpZiAvKiBfTVNDX1ZFUiAqLworCisjaWZkZWYgX09TRl9TT1VSQ0UKKy8qIE9TRjEgNS4xIGRvZXNuJ3QgbWFrZSB0aGVzZSBhdmFpbGFibGUgd2l0aCBYT1BFTl9TT1VSQ0VfRVhURU5ERUQgZGVmaW5lZCAqLworZXh0ZXJuIGludCBmaW5pdGUoZG91YmxlKTsKK2V4dGVybiBkb3VibGUgY29weXNpZ24oZG91YmxlLCBkb3VibGUpOworI2VuZGlmCisKKy8qIEhpZ2ggcHJlY2lzaW9uIGRlZmludGlvbiBvZiBwaSBhbmQgZSAoRXVsZXIpCisgKiBUaGUgdmFsdWVzIGFyZSB0YWtlbiBmcm9tIGxpYmM2J3MgbWF0aC5oLgorICovCisjaWZuZGVmIFB5X01BVEhfUElsCisjZGVmaW5lIFB5X01BVEhfUElsIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTAyOUwKKyNlbmRpZgorI2lmbmRlZiBQeV9NQVRIX1BJCisjZGVmaW5lIFB5X01BVEhfUEkgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorI2VuZGlmCisKKyNpZm5kZWYgUHlfTUFUSF9FbAorI2RlZmluZSBQeV9NQVRIX0VsIDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyNUwKKyNlbmRpZgorCisjaWZuZGVmIFB5X01BVEhfRQorI2RlZmluZSBQeV9NQVRIX0UgMi43MTgyODE4Mjg0NTkwNDUyMzU0CisjZW5kaWYKKworLyogT24geDg2LCBQeV9GT1JDRV9ET1VCTEUgZm9yY2VzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIG91dCBvZiBhbiB4ODcgRlBVCisgICByZWdpc3RlciBhbmQgaW50byBhIDY0LWJpdCBtZW1vcnkgbG9jYXRpb24sIHJvdW5kaW5nIGZyb20gZXh0ZW5kZWQKKyAgIHByZWNpc2lvbiB0byBkb3VibGUgcHJlY2lzaW9uIGluIHRoZSBwcm9jZXNzLiAgT24gb3RoZXIgcGxhdGZvcm1zIGl0IGRvZXMKKyAgIG5vdGhpbmcuICovCisKKy8qIHdlIHRha2UgZG91YmxlIHJvdW5kaW5nIGFzIGV2aWRlbmNlIG9mIHg4NyB1c2FnZSAqLworI2lmbmRlZiBQeV9GT1JDRV9ET1VCTEUKKyMgIGlmZGVmIFg4N19ET1VCTEVfUk9VTkRJTkcKK1B5QVBJX0ZVTkMoZG91YmxlKSBfUHlfZm9yY2VfZG91YmxlKGRvdWJsZSk7CisjICAgIGRlZmluZSBQeV9GT1JDRV9ET1VCTEUoWCkgKF9QeV9mb3JjZV9kb3VibGUoWCkpCisjICBlbHNlCisjICAgIGRlZmluZSBQeV9GT1JDRV9ET1VCTEUoWCkgKFgpCisjICBlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0dDQ19BU01fRk9SX1g4NworUHlBUElfRlVOQyh1bnNpZ25lZCBzaG9ydCkgX1B5X2dldF8zODdjb250cm9sd29yZCh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5X3NldF8zODdjb250cm9sd29yZCh1bnNpZ25lZCBzaG9ydCk7CisjZW5kaWYKKworLyogUHlfSVNfTkFOKFgpCisgKiBSZXR1cm4gMSBpZiBmbG9hdCBvciBkb3VibGUgYXJnIGlzIGEgTmFOLCBlbHNlIDAuCisgKiBDYXV0aW9uOgorICogICAgIFggaXMgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICogICAgIFRoaXMgbWF5IG5vdCB3b3JrIG9uIGFsbCBwbGF0Zm9ybXMuICBFYWNoIHBsYXRmb3JtIGhhcyAqc29tZSoKKyAqICAgICB3YXkgdG8gc3BlbGwgdGhpcywgdGhvdWdoIC0tIG92ZXJyaWRlIGluIHB5Y29uZmlnLmggaWYgeW91IGhhdmUKKyAqICAgICBhIHBsYXRmb3JtIHdoZXJlIGl0IGRvZXNuJ3Qgd29yay4KKyAqIE5vdGU6IFBDL3B5Y29uZmlnLmggZGVmaW5lcyBQeV9JU19OQU4gYXMgX2lzbmFuCisgKi8KKyNpZm5kZWYgUHlfSVNfTkFOCisjaWYgZGVmaW5lZCBIQVZFX0RFQ0xfSVNOQU4gJiYgSEFWRV9ERUNMX0lTTkFOID09IDEKKyNkZWZpbmUgUHlfSVNfTkFOKFgpIGlzbmFuKFgpCisjZWxzZQorI2RlZmluZSBQeV9JU19OQU4oWCkgKChYKSAhPSAoWCkpCisjZW5kaWYKKyNlbmRpZgorCisvKiBQeV9JU19JTkZJTklUWShYKQorICogUmV0dXJuIDEgaWYgZmxvYXQgb3IgZG91YmxlIGFyZyBpcyBhbiBpbmZpbml0eSwgZWxzZSAwLgorICogQ2F1dGlvbjoKKyAqICAgIFggaXMgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICogICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBtYXkgc2V0IHRoZSB1bmRlcmZsb3cgZmxhZyBpZiB8WHwgaXMgdmVyeSBzbWFsbDsKKyAqICAgIGl0IHJlYWxseSBjYW4ndCBiZSBpbXBsZW1lbnRlZCBjb3JyZWN0bHkgKCYgZWFzaWx5KSBiZWZvcmUgQzk5LgorICogICAgT3ZlcnJpZGUgaW4gcHljb25maWcuaCBpZiB5b3UgaGF2ZSBhIGJldHRlciBzcGVsbGluZyBvbiB5b3VyIHBsYXRmb3JtLgorICogIFB5X0ZPUkNFX0RPVUJMRSBpcyB1c2VkIHRvIGF2b2lkIGdldHRpbmcgZmFsc2UgbmVnYXRpdmVzIGZyb20gYQorICogICAgbm9uLWluZmluaXRlIHZhbHVlIHYgc2l0dGluZyBpbiBhbiA4MC1iaXQgeDg3IHJlZ2lzdGVyIHN1Y2ggdGhhdAorICogICAgdiBiZWNvbWVzIGluZmluaXRlIHdoZW4gc3BpbGxlZCBmcm9tIHRoZSByZWdpc3RlciB0byA2NC1iaXQgbWVtb3J5LgorICogTm90ZTogUEMvcHljb25maWcuaCBkZWZpbmVzIFB5X0lTX0lORklOSVRZIGFzIF9pc2luZgorICogRklYTUU6IFBDL3B5Y29uZmlnLmggZGVmaW5lcyBQeV9JU19JTkZJTklUWSBhcyAoIV9maW5pdGUoWCkgJiYgIV9pc25hbihYKSkKKyAqIHNvIHRoYXQgYWJvdmUgbm90ZSBpc24ndCBjb3JyZWN0ICEhIQorICovCisjaWZuZGVmIFB5X0lTX0lORklOSVRZCisjICBpZiBkZWZpbmVkIEhBVkVfREVDTF9JU0lORiAmJiBIQVZFX0RFQ0xfSVNJTkYgPT0gMQorIyAgICBkZWZpbmUgUHlfSVNfSU5GSU5JVFkoWCkgaXNpbmYoWCkKKyMgIGVsc2UKKyMgICAgZGVmaW5lIFB5X0lTX0lORklOSVRZKFgpICgoWCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUHlfRk9SQ0VfRE9VQkxFKFgpKjAuNSA9PSBQeV9GT1JDRV9ET1VCTEUoWCkpKQorIyAgZW5kaWYKKyNlbmRpZgorCisvKiBQeV9JU19GSU5JVEUoWCkKKyAqIFJldHVybiAxIGlmIGZsb2F0IG9yIGRvdWJsZSBhcmcgaXMgbmVpdGhlciBpbmZpbml0ZSBub3IgTkFOLCBlbHNlIDAuCisgKiBTb21lIGNvbXBpbGVycyAoZS5nLiBWaXN1YWxTdHVkaW8pIGhhdmUgaW50cmlzaWNzIGZvciB0aGlzLCBzbyBhIHNwZWNpYWwKKyAqIG1hY3JvIGZvciB0aGlzIHBhcnRpY3VsYXIgdGVzdCBpcyB1c2VmdWwKKyAqIE5vdGU6IFBDL3B5Y29uZmlnLmggZGVmaW5lcyBQeV9JU19GSU5JVEUgYXMgX2Zpbml0ZQorICovCisjaWZuZGVmIFB5X0lTX0ZJTklURQorI2lmIGRlZmluZWQgSEFWRV9ERUNMX0lTRklOSVRFICYmIEhBVkVfREVDTF9JU0ZJTklURSA9PSAxCisjZGVmaW5lIFB5X0lTX0ZJTklURShYKSBpc2Zpbml0ZShYKQorI2VsaWYgZGVmaW5lZCBIQVZFX0ZJTklURQorI2RlZmluZSBQeV9JU19GSU5JVEUoWCkgZmluaXRlKFgpCisjZWxzZQorI2RlZmluZSBQeV9JU19GSU5JVEUoWCkgKCFQeV9JU19JTkZJTklUWShYKSAmJiAhUHlfSVNfTkFOKFgpKQorI2VuZGlmCisjZW5kaWYKKworLyogSFVHRV9WQUwgaXMgc3VwcG9zZWQgdG8gZXhwYW5kIHRvIGEgcG9zaXRpdmUgZG91YmxlIGluZmluaXR5LiAgUHl0aG9uCisgKiB1c2VzIFB5X0hVR0VfVkFMIGluc3RlYWQgYmVjYXVzZSBzb21lIHBsYXRmb3JtcyBhcmUgYnJva2VuIGluIHRoaXMKKyAqIHJlc3BlY3QuICBXZSB1c2VkIHRvIGVtYmVkIGNvZGUgaW4gcHlwb3J0LmggdG8gdHJ5IHRvIHdvcm0gYXJvdW5kIHRoYXQsCisgKiBidXQgZGlmZmVyZW50IHBsYXRmb3JtcyBhcmUgYnJva2VuIGluIGNvbmZsaWN0aW5nIHdheXMuICBJZiB5b3UncmUgb24KKyAqIGEgcGxhdGZvcm0gd2hlcmUgSFVHRV9WQUwgaXMgZGVmaW5lZCBpbmNvcnJlY3RseSwgZmlkZGxlIHlvdXIgUHl0aG9uCisgKiBjb25maWcgdG8gI2RlZmluZSBQeV9IVUdFX1ZBTCB0byBzb21ldGhpbmcgdGhhdCB3b3JrcyBvbiB5b3VyIHBsYXRmb3JtLgorICovCisjaWZuZGVmIFB5X0hVR0VfVkFMCisjZGVmaW5lIFB5X0hVR0VfVkFMIEhVR0VfVkFMCisjZW5kaWYKKworLyogUHlfTkFOCisgKiBBIHZhbHVlIHRoYXQgZXZhbHVhdGVzIHRvIGEgTmFOLiBPbiBJRUVFIDc1NCBwbGF0Zm9ybXMgSU5GKjAgb3IKKyAqIElORi9JTkYgd29ya3MuIERlZmluZSBQeV9OT19OQU4gaW4gcHljb25maWcuaCBpZiB5b3VyIHBsYXRmb3JtCisgKiBkb2Vzbid0IHN1cHBvcnQgTmFOcy4KKyAqLworI2lmICFkZWZpbmVkKFB5X05BTikgJiYgIWRlZmluZWQoUHlfTk9fTkFOKQorI2RlZmluZSBQeV9OQU4gKFB5X0hVR0VfVkFMICogMC4pCisjZW5kaWYKKworLyogUHlfT1ZFUkZMT1dFRChYKQorICogUmV0dXJuIDEgaWZmIGEgbGlibSBmdW5jdGlvbiBvdmVyZmxvd2VkLiAgU2V0IGVycm5vIHRvIDAgYmVmb3JlIGNhbGxpbmcKKyAqIGEgbGlibSBmdW5jdGlvbiwgYW5kIGludm9rZSB0aGlzIG1hY3JvIGFmdGVyLCBwYXNzaW5nIHRoZSBmdW5jdGlvbgorICogcmVzdWx0LgorICogQ2F1dGlvbjoKKyAqICAgIFRoaXMgaXNuJ3QgcmVsaWFibGUuICBDOTkgbm8gbG9uZ2VyIHJlcXVpcmVzIGxpYm0gdG8gc2V0IGVycm5vIHVuZGVyCisgKgkgIGFueSBleGNlcHRpb25hbCBjb25kaXRpb24sIGJ1dCBkb2VzIHJlcXVpcmUgKy0gSFVHRV9WQUwgcmV0dXJuCisgKgkgIHZhbHVlcyBvbiBvdmVyZmxvdy4gIEEgNzU0IGJveCAqcHJvYmFibHkqIG1hcHMgSFVHRV9WQUwgdG8gYQorICoJICBkb3VibGUgaW5maW5pdHksIGFuZCB3ZSdyZSBjb29sIGlmIHRoYXQncyBzbywgdW5sZXNzIHRoZSBpbnB1dAorICoJICB3YXMgYW4gaW5maW5pdHkgYW5kIGFuIGluZmluaXR5IGlzIHRoZSBleHBlY3RlZCByZXN1bHQuICBBIEM4OQorICoJICBzeXN0ZW0gc2V0cyBlcnJubyB0byBFUkFOR0UsIHNvIHdlIGNoZWNrIGZvciB0aGF0IHRvby4gIFdlJ3JlCisgKgkgIG91dCBvZiBsdWNrIGlmIGEgQzk5IDc1NCBib3ggZG9lc24ndCBtYXAgSFVHRV9WQUwgdG8gK0luZiwgb3IKKyAqCSAgaWYgdGhlIHJldHVybmVkIHJlc3VsdCBpcyBhIE5hTiwgb3IgaWYgYSBDODkgYm94IHJldHVybnMgSFVHRV9WQUwKKyAqCSAgaW4gbm9uLW92ZXJmbG93IGNhc2VzLgorICogICAgWCBpcyBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UuCisgKiBTb21lIHBsYXRmb3JtcyBoYXZlIGJldHRlciB3YXkgdG8gc3BlbGwgdGhpcywgc28gZXhwZWN0IHNvbWUgI2lmZGVmJ2VyeS4KKyAqCisgKiBPcGVuQlNEIHVzZXMgJ2lzaW5mKCknIGJlY2F1c2UgYSBjb21waWxlciBidWcgb24gdGhhdCBwbGF0Zm9ybSBjYXVzZXMKKyAqIHRoZSBsb25nZXIgbWFjcm8gdmVyc2lvbiB0byBiZSBtaXMtY29tcGlsZWQuIFRoaXMgaXNuJ3Qgb3B0aW1hbCwgYW5kCisgKiBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIGEgbmV3ZXIgY29tcGlsZXIgaXMgYXZhaWxhYmxlIG9uIHRoYXQgcGxhdGZvcm0uCisgKiBUaGUgc3lzdGVtIHRoYXQgaGFkIHRoZSBmYWlsdXJlIHdhcyBydW5uaW5nIE9wZW5CU0QgMy4yIG9uIEludGVsLCB3aXRoCisgKiBnY2MgMi45NS4zLgorICoKKyAqIEFjY29yZGluZyB0byBUaW0ncyBjaGVja2luLCB0aGUgRnJlZUJTRCBzeXN0ZW1zIHVzZSBpc2luZigpIHRvIHdvcmsKKyAqIGFyb3VuZCBhIEZQRSBidWcgb24gdGhhdCBwbGF0Zm9ybS4KKyAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pCisjZGVmaW5lIFB5X09WRVJGTE9XRUQoWCkgaXNpbmYoWCkKKyNlbHNlCisjZGVmaW5lIFB5X09WRVJGTE9XRUQoWCkgKChYKSAhPSAwLjAgJiYgKGVycm5vID09IEVSQU5HRSB8fCAgICBcCisJCQkJCSAoWCkgPT0gUHlfSFVHRV9WQUwgfHwgXAorCQkJCQkgKFgpID09IC1QeV9IVUdFX1ZBTCkpCisjZW5kaWYKKworI2VuZGlmIC8qIFB5X1BZTUFUSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weW1lbS5oIGIvaW5jbHVkZS9weXRob24yLjcvcHltZW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGI1YmVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHltZW0uaApAQCAtMCwwICsxLDEyMiBAQAorLyogVGhlIFB5TWVtXyBmYW1pbHk6ICBsb3ctbGV2ZWwgbWVtb3J5IGFsbG9jYXRpb24gaW50ZXJmYWNlcy4KKyAgIFNlZSBvYmppbXBsLmggZm9yIHRoZSBQeU9iamVjdF8gbWVtb3J5IGZhbWlseS4KKyovCisKKyNpZm5kZWYgUHlfUFlNRU1fSAorI2RlZmluZSBQeV9QWU1FTV9ICisKKyNpbmNsdWRlICJweXBvcnQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBCRVdBUkU6CisKKyAgIEVhY2ggaW50ZXJmYWNlIGV4cG9ydHMgYm90aCBmdW5jdGlvbnMgYW5kIG1hY3Jvcy4gIEV4dGVuc2lvbiBtb2R1bGVzIHNob3VsZAorICAgdXNlIHRoZSBmdW5jdGlvbnMsIHRvIGVuc3VyZSBiaW5hcnkgY29tcGF0aWJpbGl0eSBhY3Jvc3MgUHl0aG9uIHZlcnNpb25zLgorICAgQmVjYXVzZSB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGlzIGZyZWUgdG8gY2hhbmdlIGludGVybmFsIGRldGFpbHMsIGFuZAorICAgdGhlIG1hY3JvcyBtYXkgKG9yIG1heSBub3QpIGV4cG9zZSBkZXRhaWxzIGZvciBzcGVlZCwgaWYgeW91IGRvIHVzZSB0aGUKKyAgIG1hY3JvcyB5b3UgbXVzdCByZWNvbXBpbGUgeW91ciBleHRlbnNpb25zIHdpdGggZWFjaCBQeXRob24gcmVsZWFzZS4KKworICAgTmV2ZXIgbWl4IGNhbGxzIHRvIFB5TWVtXyB3aXRoIGNhbGxzIHRvIHRoZSBwbGF0Zm9ybSBtYWxsb2MvcmVhbGxvYy8KKyAgIGNhbGxvYy9mcmVlLiAgRm9yIGV4YW1wbGUsIG9uIFdpbmRvd3MgZGlmZmVyZW50IERMTHMgbWF5IGVuZCB1cCB1c2luZworICAgZGlmZmVyZW50IGhlYXBzLCBhbmQgaWYgeW91IHVzZSBQeU1lbV9NYWxsb2MgeW91J2xsIGdldCB0aGUgbWVtb3J5IGZyb20gdGhlCisgICBoZWFwIHVzZWQgYnkgdGhlIFB5dGhvbiBETEw7IGl0IGNvdWxkIGJlIGEgZGlzYXN0ZXIgaWYgeW91IGZyZWUoKSdlZCB0aGF0CisgICBkaXJlY3RseSBpbiB5b3VyIG93biBleHRlbnNpb24uICBVc2luZyBQeU1lbV9GcmVlIGluc3RlYWQgZW5zdXJlcyBQeXRob24KKyAgIGNhbiByZXR1cm4gdGhlIG1lbW9yeSB0byB0aGUgcHJvcGVyIGhlYXAuICBBcyBhbm90aGVyIGV4YW1wbGUsIGluCisgICBQWU1BTExPQ19ERUJVRyBtb2RlLCBQeXRob24gd3JhcHMgYWxsIGNhbGxzIHRvIGFsbCBQeU1lbV8gYW5kIFB5T2JqZWN0XworICAgbWVtb3J5IGZ1bmN0aW9ucyBpbiBzcGVjaWFsIGRlYnVnZ2luZyB3cmFwcGVycyB0aGF0IGFkZCBhZGRpdGlvbmFsCisgICBkZWJ1Z2dpbmcgaW5mbyB0byBkeW5hbWljIG1lbW9yeSBibG9ja3MuICBUaGUgc3lzdGVtIHJvdXRpbmVzIGhhdmUgbm8gaWRlYQorICAgd2hhdCB0byBkbyB3aXRoIHRoYXQgc3R1ZmYsIGFuZCB0aGUgUHl0aG9uIHdyYXBwZXJzIGhhdmUgbm8gaWRlYSB3aGF0IHRvIGRvCisgICB3aXRoIHJhdyBibG9ja3Mgb2J0YWluZWQgZGlyZWN0bHkgYnkgdGhlIHN5c3RlbSByb3V0aW5lcyB0aGVuLgorCisgICBUaGUgR0lMIG11c3QgYmUgaGVsZCB3aGVuIHVzaW5nIHRoZXNlIEFQSXMuCisqLworCisvKgorICogUmF3IG1lbW9yeSBpbnRlcmZhY2UKKyAqID09PT09PT09PT09PT09PT09PT09CisgKi8KKworLyogRnVuY3Rpb25zCisKKyAgIEZ1bmN0aW9ucyBzdXBwbHlpbmcgcGxhdGZvcm0taW5kZXBlbmRlbnQgc2VtYW50aWNzIGZvciBtYWxsb2MvcmVhbGxvYy8KKyAgIGZyZWUuICBUaGVzZSBmdW5jdGlvbnMgbWFrZSBzdXJlIHRoYXQgYWxsb2NhdGluZyAwIGJ5dGVzIHJldHVybnMgYSBkaXN0aW5jdAorICAgbm9uLU5VTEwgcG9pbnRlciAod2hlbmV2ZXIgcG9zc2libGUgLS0gaWYgd2UncmUgZmxhdCBvdXQgb2YgbWVtb3J5LCBOVUxMCisgICBtYXkgYmUgcmV0dXJuZWQpLCBldmVuIGlmIHRoZSBwbGF0Zm9ybSBtYWxsb2MgYW5kIHJlYWxsb2MgZG9uJ3QuCisgICBSZXR1cm5lZCBwb2ludGVycyBtdXN0IGJlIGNoZWNrZWQgZm9yIE5VTEwgZXhwbGljaXRseS4gIE5vIGFjdGlvbiBpcworICAgcGVyZm9ybWVkIG9uIGZhaWx1cmUgKG5vIGV4Y2VwdGlvbiBpcyBzZXQsIG5vIHdhcm5pbmcgaXMgcHJpbnRlZCwgZXRjKS4KKyovCisKK1B5QVBJX0ZVTkModm9pZCAqKSBQeU1lbV9NYWxsb2Moc2l6ZV90KTsKK1B5QVBJX0ZVTkModm9pZCAqKSBQeU1lbV9SZWFsbG9jKHZvaWQgKiwgc2l6ZV90KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlNZW1fRnJlZSh2b2lkICopOworCisvKiBTdGFydGluZyBmcm9tIFB5dGhvbiAxLjYsIHRoZSB3cmFwcGVycyBQeV97TWFsbG9jLFJlYWxsb2MsRnJlZX0gYXJlCisgICBubyBsb25nZXIgc3VwcG9ydGVkLiBUaGV5IHVzZWQgdG8gY2FsbCBQeUVycl9Ob01lbW9yeSgpIG9uIGZhaWx1cmUuICovCisKKy8qIE1hY3Jvcy4gKi8KKyNpZmRlZiBQWU1BTExPQ19ERUJVRworLyogUmVkaXJlY3QgYWxsIG1lbW9yeSBvcGVyYXRpb25zIHRvIFB5dGhvbidzIGRlYnVnZ2luZyBhbGxvY2F0b3IuICovCisjZGVmaW5lIFB5TWVtX01BTExPQwkJX1B5TWVtX0RlYnVnTWFsbG9jCisjZGVmaW5lIFB5TWVtX1JFQUxMT0MJCV9QeU1lbV9EZWJ1Z1JlYWxsb2MKKyNkZWZpbmUgUHlNZW1fRlJFRQkJX1B5TWVtX0RlYnVnRnJlZQorCisjZWxzZQkvKiAhIFBZTUFMTE9DX0RFQlVHICovCisKKy8qIFB5TWVtX01BTExPQygwKSBtZWFucyBtYWxsb2MoMSkuIFNvbWUgc3lzdGVtcyB3b3VsZCByZXR1cm4gTlVMTAorICAgZm9yIG1hbGxvYygwKSwgd2hpY2ggd291bGQgYmUgdHJlYXRlZCBhcyBhbiBlcnJvci4gU29tZSBwbGF0Zm9ybXMKKyAgIHdvdWxkIHJldHVybiBhIHBvaW50ZXIgd2l0aCBubyBtZW1vcnkgYmVoaW5kIGl0LCB3aGljaCB3b3VsZCBicmVhaworICAgcHltYWxsb2MuIFRvIHNvbHZlIHRoZXNlIHByb2JsZW1zLCBhbGxvY2F0ZSBhbiBleHRyYSBieXRlLiAqLworLyogUmV0dXJucyBOVUxMIHRvIGluZGljYXRlIGVycm9yIGlmIGEgbmVnYXRpdmUgc2l6ZSBvciBzaXplIGxhcmdlciB0aGFuCisgICBQeV9zc2l6ZV90IGNhbiByZXByZXNlbnQgaXMgc3VwcGxpZWQuICBIZWxwcyBwcmV2ZW50cyBzZWN1cml0eSBob2xlcy4gKi8KKyNkZWZpbmUgUHlNZW1fTUFMTE9DKG4pCQkoKHNpemVfdCkobikgPiAoc2l6ZV90KVBZX1NTSVpFX1RfTUFYID8gTlVMTCBcCisJCQkJOiBtYWxsb2MoKG4pID8gKG4pIDogMSkpCisjZGVmaW5lIFB5TWVtX1JFQUxMT0MocCwgbikJKChzaXplX3QpKG4pID4gKHNpemVfdClQWV9TU0laRV9UX01BWCAgPyBOVUxMIFwKKwkJCQk6IHJlYWxsb2MoKHApLCAobikgPyAobikgOiAxKSkKKyNkZWZpbmUgUHlNZW1fRlJFRQkJZnJlZQorCisjZW5kaWYJLyogUFlNQUxMT0NfREVCVUcgKi8KKworLyoKKyAqIFR5cGUtb3JpZW50ZWQgbWVtb3J5IGludGVyZmFjZQorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKgorICogQWxsb2NhdGUgbWVtb3J5IGZvciBuIG9iamVjdHMgb2YgdGhlIGdpdmVuIHR5cGUuICBSZXR1cm5zIGEgbmV3IHBvaW50ZXIKKyAqIG9yIE5VTEwgaWYgdGhlIHJlcXVlc3Qgd2FzIHRvbyBsYXJnZSBvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICBVc2UKKyAqIHRoZXNlIG1hY3JvcyByYXRoZXIgdGhhbiBkb2luZyB0aGUgbXVsdGlwbGljYXRpb24geW91cnNlbGYgc28gdGhhdCBwcm9wZXIKKyAqIG92ZXJmbG93IGNoZWNraW5nIGlzIGFsd2F5cyBkb25lLgorICovCisKKyNkZWZpbmUgUHlNZW1fTmV3KHR5cGUsIG4pIFwKKyAgKCAoKHNpemVfdCkobikgPiBQWV9TU0laRV9UX01BWCAvIHNpemVvZih0eXBlKSkgPyBOVUxMIDoJXAorCSggKHR5cGUgKikgUHlNZW1fTWFsbG9jKChuKSAqIHNpemVvZih0eXBlKSkgKSApCisjZGVmaW5lIFB5TWVtX05FVyh0eXBlLCBuKSBcCisgICggKChzaXplX3QpKG4pID4gUFlfU1NJWkVfVF9NQVggLyBzaXplb2YodHlwZSkpID8gTlVMTCA6CVwKKwkoICh0eXBlICopIFB5TWVtX01BTExPQygobikgKiBzaXplb2YodHlwZSkpICkgKQorCisvKgorICogVGhlIHZhbHVlIG9mIChwKSBpcyBhbHdheXMgY2xvYmJlcmVkIGJ5IHRoaXMgbWFjcm8gcmVnYXJkbGVzcyBvZiBzdWNjZXNzLgorICogVGhlIGNhbGxlciBNVVNUIGNoZWNrIGlmIChwKSBpcyBOVUxMIGFmdGVyd2FyZHMgYW5kIGRlYWwgd2l0aCB0aGUgbWVtb3J5CisgKiBlcnJvciBpZiBzby4gIFRoaXMgbWVhbnMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIChwKSBNVVNUIGJlIHNhdmVkIGZvciB0aGUKKyAqIGNhbGxlcidzIG1lbW9yeSBlcnJvciBoYW5kbGVyIHRvIG5vdCBsb3NlIHRyYWNrIG9mIGl0LgorICovCisjZGVmaW5lIFB5TWVtX1Jlc2l6ZShwLCB0eXBlLCBuKSBcCisgICggKHApID0gKChzaXplX3QpKG4pID4gUFlfU1NJWkVfVF9NQVggLyBzaXplb2YodHlwZSkpID8gTlVMTCA6CVwKKwkodHlwZSAqKSBQeU1lbV9SZWFsbG9jKChwKSwgKG4pICogc2l6ZW9mKHR5cGUpKSApCisjZGVmaW5lIFB5TWVtX1JFU0laRShwLCB0eXBlLCBuKSBcCisgICggKHApID0gKChzaXplX3QpKG4pID4gUFlfU1NJWkVfVF9NQVggLyBzaXplb2YodHlwZSkpID8gTlVMTCA6CVwKKwkodHlwZSAqKSBQeU1lbV9SRUFMTE9DKChwKSwgKG4pICogc2l6ZW9mKHR5cGUpKSApCisKKy8qIFB5TWVte0RlbCxERUx9IGFyZSBsZWZ0IG92ZXIgZnJvbSBhbmNpZW50IGRheXMsIGFuZCBzaG91bGRuJ3QgYmUgdXNlZAorICogYW55bW9yZS4gIFRoZXkncmUganVzdCBjb25mdXNpbmcgYWxpYXNlcyBmb3IgUHlNZW1fe0ZyZWUsRlJFRX0gbm93LgorICovCisjZGVmaW5lIFB5TWVtX0RlbAkJUHlNZW1fRnJlZQorI2RlZmluZSBQeU1lbV9ERUwJCVB5TWVtX0ZSRUUKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9QWU1FTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weXBvcnQuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5cG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjQ3NDAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9weXBvcnQuaApAQCAtMCwwICsxLDEwODQgQEAKKyNpZm5kZWYgUHlfUFlQT1JUX0gKKyNkZWZpbmUgUHlfUFlQT1JUX0gKKworI2luY2x1ZGUgInB5Y29uZmlnLmgiIC8qIGluY2x1ZGUgZm9yIGRlZmluZXMgKi8KKworLyogU29tZSB2ZXJzaW9ucyBvZiBIUC1VWCAmIFNvbGFyaXMgbmVlZCBpbnR0eXBlcy5oIGZvciBpbnQzMl90LAorICAgSU5UMzJfTUFYLCBldGMuICovCisjaWZkZWYgSEFWRV9JTlRUWVBFU19ICisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbmRpZgorCisjaWZkZWYgSEFWRV9TVERJTlRfSAorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorU3ltYm9scyBhbmQgbWFjcm9zIHRvIHN1cHBseSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHRvIGJhc2ljCitDIGxhbmd1YWdlICYgbGlicmFyeSBvcGVyYXRpb25zIHdob3NlIHNwZWxsaW5ncyB2YXJ5IGFjcm9zcyBwbGF0Zm9ybXMuCisKK1BsZWFzZSB0cnkgdG8gbWFrZSBkb2N1bWVudGF0aW9uIGhlcmUgYXMgY2xlYXIgYXMgcG9zc2libGU6ICBieSBkZWZpbml0aW9uLAordGhlIHN0dWZmIGhlcmUgaXMgdHJ5aW5nIHRvIGlsbHVtaW5hdGUgQydzIGRhcmtlc3QgY29ybmVycy4KKworQ29uZmlnICNkZWZpbmVzIHJlZmVyZW5jZWQgaGVyZToKKworU0lHTkVEX1JJR0hUX1NISUZUX1pFUk9fRklMTFMKK01lYW5pbmc6ICBUbyBiZSBkZWZpbmVkIGlmZiBpPj5qIGRvZXMgbm90IGV4dGVuZCB0aGUgc2lnbiBiaXQgd2hlbiBpIGlzIGEKKyAgICAgICAgICBzaWduZWQgaW50ZWdyYWwgdHlwZSBhbmQgaSA8IDAuCitVc2VkIGluOiAgUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVAorCitQeV9ERUJVRworTWVhbmluZzogIEV4dHJhIGNoZWNrcyBjb21waWxlZCBpbiBmb3IgZGVidWcgbW9kZS4KK1VzZWQgaW46ICBQeV9TQUZFX0RPV05DQVNUCisKK0hBVkVfVUlOVFBUUl9UCitNZWFuaW5nOiAgVGhlIEM5WCB0eXBlIHVpbnRwdHJfdCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBpbGVyCitVc2VkIGluOiAgUHlfdWludHB0cl90CisKK0hBVkVfTE9OR19MT05HCitNZWFuaW5nOiAgVGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSBDIHR5cGUgImxvbmcgbG9uZyIKK1VzZWQgaW46ICBQWV9MT05HX0xPTkcKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyogRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seS4gT2Jzb2xldGUsIGRvIG5vdCB1c2UuICovCisjaWZkZWYgSEFWRV9QUk9UT1RZUEVTCisjZGVmaW5lIFB5X1BST1RPKHgpIHgKKyNlbHNlCisjZGVmaW5lIFB5X1BST1RPKHgpICgpCisjZW5kaWYKKyNpZm5kZWYgUHlfRlBST1RPCisjZGVmaW5lIFB5X0ZQUk9UTyh4KSBQeV9QUk9UTyh4KQorI2VuZGlmCisKKy8qIHR5cGVkZWZzIGZvciBzb21lIEM5WC1kZWZpbmVkIHN5bm9ueW1zIGZvciBpbnRlZ3JhbCB0eXBlcy4KKyAqCisgKiBUaGUgbmFtZXMgaW4gUHl0aG9uIGFyZSBleGFjdGx5IHRoZSBzYW1lIGFzIHRoZSBDOVggbmFtZXMsIGV4Y2VwdCB3aXRoIGEKKyAqIFB5XyBwcmVmaXguICBVbnRpbCBDOVggaXMgdW5pdmVyc2FsbHkgaW1wbGVtZW50ZWQsIHRoaXMgaXMgdGhlIG9ubHkgd2F5CisgKiB0byBlbnN1cmUgdGhhdCBQeXRob24gZ2V0cyByZWxpYWJsZSBuYW1lcyB0aGF0IGRvbid0IGNvbmZsaWN0IHdpdGggbmFtZXMKKyAqIGluIG5vbi1QeXRob24gY29kZSB0aGF0IGFyZSBwbGF5aW5nIHRoZWlyIG93biB0cmlja3MgdG8gZGVmaW5lIHRoZSBDOVgKKyAqIG5hbWVzLgorICoKKyAqIE5PVEU6IGRvbid0IGdvIG51dHMgaGVyZSEgIFB5dGhvbiBoYXMgbm8gdXNlIGZvciAqbW9zdCogb2YgdGhlIEM5WAorICogaW50ZWdyYWwgc3lub255bXMuICBPbmx5IGRlZmluZSB0aGUgb25lcyB3ZSBhY3R1YWxseSBuZWVkLgorICovCisKKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworI2lmbmRlZiBQWV9MT05HX0xPTkcKKyNkZWZpbmUgUFlfTE9OR19MT05HIGxvbmcgbG9uZworI2lmIGRlZmluZWQoTExPTkdfTUFYKQorLyogSWYgTExPTkdfTUFYIGlzIGRlZmluZWQgaW4gbGltaXRzLmgsIHVzZSB0aGF0LiAqLworI2RlZmluZSBQWV9MTE9OR19NSU4gTExPTkdfTUlOCisjZGVmaW5lIFBZX0xMT05HX01BWCBMTE9OR19NQVgKKyNkZWZpbmUgUFlfVUxMT05HX01BWCBVTExPTkdfTUFYCisjZWxpZiBkZWZpbmVkKF9fTE9OR19MT05HX01BWF9fKQorLyogT3RoZXJ3aXNlLCBpZiBHQ0MgaGFzIGEgYnVpbHRpbiBkZWZpbmUsIHVzZSB0aGF0LiAqLworI2RlZmluZSBQWV9MTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyNkZWZpbmUgUFlfTExPTkdfTUlOICgtUFlfTExPTkdfTUFYLTEpCisjZGVmaW5lIFBZX1VMTE9OR19NQVggKF9fTE9OR19MT05HX01BWF9fKjJVTEwgKyAxVUxMKQorI2Vsc2UKKy8qIE90aGVyd2lzZSwgcmVseSBvbiB0d28ncyBjb21wbGVtZW50LiAqLworI2RlZmluZSBQWV9VTExPTkdfTUFYICh+MFVMTCkKKyNkZWZpbmUgUFlfTExPTkdfTUFYICAoKGxvbmcgbG9uZykoUFlfVUxMT05HX01BWD4+MSkpCisjZGVmaW5lIFBZX0xMT05HX01JTiAoLVBZX0xMT05HX01BWC0xKQorI2VuZGlmIC8qIExMT05HX01BWCAqLworI2VuZGlmCisjZW5kaWYgLyogSEFWRV9MT05HX0xPTkcgKi8KKworLyogYSBidWlsZCB3aXRoIDMwLWJpdCBkaWdpdHMgZm9yIFB5dGhvbiBsb25nIGludGVnZXJzIG5lZWRzIGFuIGV4YWN0LXdpZHRoCisgKiAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciB0eXBlIHRvIHN0b3JlIHRob3NlIGRpZ2l0cy4gIChXZSBjb3VsZCBqdXN0IHVzZQorICogdHlwZSAndW5zaWduZWQgbG9uZycsIGJ1dCB0aGF0IHdvdWxkIGJlIHdhc3RlZnVsIG9uIGEgc3lzdGVtIHdoZXJlIGxvbmdzCisgKiBhcmUgNjQtYml0cy4pICBPbiBVbml4IHN5c3RlbXMsIHRoZSBhdXRvY29uZiBtYWNybyBBQ19UWVBFX1VJTlQzMl9UIGRlZmluZXMKKyAqIHVpbnQzMl90IHRvIGJlIHN1Y2ggYSB0eXBlIHVubGVzcyBzdGRpbnQuaCBvciBpbnR0eXBlcy5oIGRlZmluZXMgdWludDMyX3QuCisgKiBIb3dldmVyLCBpdCBkb2Vzbid0IHNldCBIQVZFX1VJTlQzMl9ULCBzbyB3ZSBkbyB0aGF0IGhlcmUuCisgKi8KKyNpZmRlZiB1aW50MzJfdAorI2RlZmluZSBIQVZFX1VJTlQzMl9UIDEKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9VSU5UMzJfVAorI2lmbmRlZiBQWV9VSU5UMzJfVAorI2RlZmluZSBQWV9VSU5UMzJfVCB1aW50MzJfdAorI2VuZGlmCisjZW5kaWYKKworLyogTWFjcm9zIGZvciBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGU7IHVzZWQgZm9yIHR5cGUgJ3R3b2RpZ2l0cycgaW4gdGhlCisgKiBsb25nIGludGVnZXIgaW1wbGVtZW50YXRpb24sIHdoZW4gMzAtYml0IGRpZ2l0cyBhcmUgZW5hYmxlZC4KKyAqLworI2lmZGVmIHVpbnQ2NF90CisjZGVmaW5lIEhBVkVfVUlOVDY0X1QgMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX1VJTlQ2NF9UCisjaWZuZGVmIFBZX1VJTlQ2NF9UCisjZGVmaW5lIFBZX1VJTlQ2NF9UIHVpbnQ2NF90CisjZW5kaWYKKyNlbmRpZgorCisvKiBTaWduZWQgdmFyaWFudHMgb2YgdGhlIGFib3ZlICovCisjaWZkZWYgaW50MzJfdAorI2RlZmluZSBIQVZFX0lOVDMyX1QgMQorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0lOVDMyX1QKKyNpZm5kZWYgUFlfSU5UMzJfVAorI2RlZmluZSBQWV9JTlQzMl9UIGludDMyX3QKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBpbnQ2NF90CisjZGVmaW5lIEhBVkVfSU5UNjRfVCAxCisjZW5kaWYKKworI2lmZGVmIEhBVkVfSU5UNjRfVAorI2lmbmRlZiBQWV9JTlQ2NF9UCisjZGVmaW5lIFBZX0lOVDY0X1QgaW50NjRfdAorI2VuZGlmCisjZW5kaWYKKworLyogSWYgUFlMT05HX0JJVFNfSU5fRElHSVQgaXMgbm90IGRlZmluZWQgdGhlbiB3ZSdsbCB1c2UgMzAtYml0IGRpZ2l0cyBpZiBhbGwKKyAgIHRoZSBuZWNlc3NhcnkgaW50ZWdlciB0eXBlcyBhcmUgYXZhaWxhYmxlLCBhbmQgd2UncmUgb24gYSA2NC1iaXQgcGxhdGZvcm0KKyAgIChhcyBkZXRlcm1pbmVkIGJ5IFNJWkVPRl9WT0lEX1ApOyBvdGhlcndpc2Ugd2UgdXNlIDE1LWJpdCBkaWdpdHMuICovCisKKyNpZm5kZWYgUFlMT05HX0JJVFNfSU5fRElHSVQKKyNpZiAoZGVmaW5lZCBIQVZFX1VJTlQ2NF9UICYmIGRlZmluZWQgSEFWRV9JTlQ2NF9UICYmIFwKKyAgICAgZGVmaW5lZCBIQVZFX1VJTlQzMl9UICYmIGRlZmluZWQgSEFWRV9JTlQzMl9UICYmIFNJWkVPRl9WT0lEX1AgPj0gOCkKKyNkZWZpbmUgUFlMT05HX0JJVFNfSU5fRElHSVQgMzAKKyNlbHNlCisjZGVmaW5lIFBZTE9OR19CSVRTX0lOX0RJR0lUIDE1CisjZW5kaWYKKyNlbmRpZgorCisvKiB1aW50cHRyX3QgaXMgdGhlIEM5WCBuYW1lIGZvciBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHN1Y2ggdGhhdCBhCisgKiBsZWdpdGltYXRlIHZvaWQqIGNhbiBiZSBjYXN0IHRvIHVpbnRwdHJfdCBhbmQgdGhlbiBiYWNrIHRvIHZvaWQqIGFnYWluCisgKiB3aXRob3V0IGxvc3Mgb2YgaW5mb3JtYXRpb24uICBTaW1pbGFybHkgZm9yIGludHB0cl90LCB3cnQgYSBzaWduZWQKKyAqIGludGVncmFsIHR5cGUuCisgKi8KKyNpZmRlZiBIQVZFX1VJTlRQVFJfVAordHlwZWRlZiB1aW50cHRyX3QgICAgICAgUHlfdWludHB0cl90OwordHlwZWRlZiBpbnRwdHJfdCAgICAgICAgUHlfaW50cHRyX3Q7CisKKyNlbGlmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0lOVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgUHlfdWludHB0cl90OwordHlwZWRlZiBpbnQgICAgICAgICAgICAgUHlfaW50cHRyX3Q7CisKKyNlbGlmIFNJWkVPRl9WT0lEX1AgPD0gU0laRU9GX0xPTkcKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyAgIFB5X3VpbnRwdHJfdDsKK3R5cGVkZWYgbG9uZyAgICAgICAgICAgIFB5X2ludHB0cl90OworCisjZWxpZiBkZWZpbmVkKEhBVkVfTE9OR19MT05HKSAmJiAoU0laRU9GX1ZPSURfUCA8PSBTSVpFT0ZfTE9OR19MT05HKQordHlwZWRlZiB1bnNpZ25lZCBQWV9MT05HX0xPTkcgICBQeV91aW50cHRyX3Q7Cit0eXBlZGVmIFBZX0xPTkdfTE9ORyAgICAgICAgICAgIFB5X2ludHB0cl90OworCisjZWxzZQorIyAgIGVycm9yICJQeXRob24gbmVlZHMgYSB0eXBlZGVmIGZvciBQeV91aW50cHRyX3QgaW4gcHlwb3J0LmguIgorI2VuZGlmIC8qIEhBVkVfVUlOVFBUUl9UICovCisKKy8qIFB5X3NzaXplX3QgaXMgYSBzaWduZWQgaW50ZWdyYWwgdHlwZSBzdWNoIHRoYXQgc2l6ZW9mKFB5X3NzaXplX3QpID09CisgKiBzaXplb2Yoc2l6ZV90KS4gIEM5OSBkb2Vzbid0IGRlZmluZSBzdWNoIGEgdGhpbmcgZGlyZWN0bHkgKHNpemVfdCBpcyBhbgorICogdW5zaWduZWQgaW50ZWdyYWwgdHlwZSkuICBTZWUgUEVQIDM1MyBmb3IgZGV0YWlscy4KKyAqLworI2lmZGVmIEhBVkVfU1NJWkVfVAordHlwZWRlZiBzc2l6ZV90ICAgICAgICAgUHlfc3NpemVfdDsKKyNlbGlmIFNJWkVPRl9WT0lEX1AgPT0gU0laRU9GX1NJWkVfVAordHlwZWRlZiBQeV9pbnRwdHJfdCAgICAgUHlfc3NpemVfdDsKKyNlbHNlCisjICAgZXJyb3IgIlB5dGhvbiBuZWVkcyBhIHR5cGVkZWYgZm9yIFB5X3NzaXplX3QgaW4gcHlwb3J0LmguIgorI2VuZGlmCisKKy8qIExhcmdlc3QgcG9zc2libGUgdmFsdWUgb2Ygc2l6ZV90LgorICAgU0laRV9NQVggaXMgcGFydCBvZiBDOTksIHNvIGl0IG1pZ2h0IGJlIGRlZmluZWQgb24gc29tZQorICAgcGxhdGZvcm1zLiBJZiBpdCBpcyBub3QgZGVmaW5lZCwgKHNpemVfdCktMSBpcyBhIHBvcnRhYmxlCisgICBkZWZpbml0aW9uIGZvciBDODksIGR1ZSB0byB0aGUgd2F5IHNpZ25lZC0+dW5zaWduZWQKKyAgIGNvbnZlcnNpb24gaXMgZGVmaW5lZC4gKi8KKyNpZmRlZiBTSVpFX01BWAorI2RlZmluZSBQWV9TSVpFX01BWCBTSVpFX01BWAorI2Vsc2UKKyNkZWZpbmUgUFlfU0laRV9NQVggKChzaXplX3QpLTEpCisjZW5kaWYKKworLyogTGFyZ2VzdCBwb3NpdGl2ZSB2YWx1ZSBvZiB0eXBlIFB5X3NzaXplX3QuICovCisjZGVmaW5lIFBZX1NTSVpFX1RfTUFYICgoUHlfc3NpemVfdCkoKChzaXplX3QpLTEpPj4xKSkKKy8qIFNtYWxsZXN0IG5lZ2F0aXZlIHZhbHVlIG9mIHR5cGUgUHlfc3NpemVfdC4gKi8KKyNkZWZpbmUgUFlfU1NJWkVfVF9NSU4gKC1QWV9TU0laRV9UX01BWC0xKQorCisvKgorI2lmIFNJWkVPRl9QSURfVCA+IFNJWkVPRl9MT05HCisjICAgZXJyb3IgIlB5dGhvbiBkb2Vzbid0IHN1cHBvcnQgc2l6ZW9mKHBpZF90KSA+IHNpemVvZihsb25nKSIKKyNlbmRpZgorKi8KKworLyogUFlfRk9STUFUX1NJWkVfVCBpcyBhIHBsYXRmb3JtLXNwZWNpZmljIG1vZGlmaWVyIGZvciB1c2UgaW4gYSBwcmludGYKKyAqIGZvcm1hdCB0byBjb252ZXJ0IGFuIGFyZ3VtZW50IHdpdGggdGhlIHdpZHRoIG9mIGEgc2l6ZV90IG9yIFB5X3NzaXplX3QuCisgKiBDOTkgaW50cm9kdWNlZCAieiIgZm9yIHRoaXMgcHVycG9zZSwgYnV0IG5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgdGhhdDsKKyAqIGUuZy4sIE1TIGNvbXBpbGVycyB1c2UgIkkiIGluc3RlYWQuCisgKgorICogVGhlc2UgImhpZ2ggbGV2ZWwiIFB5dGhvbiBmb3JtYXQgZnVuY3Rpb25zIGludGVycHJldCAieiIgY29ycmVjdGx5IG9uCisgKiBhbGwgcGxhdGZvcm1zIChQeXRob24gaW50ZXJwcmV0cyB0aGUgZm9ybWF0IHN0cmluZyBpdHNlbGYsIGFuZCBkb2VzIHdoYXRldmVyCisgKiB0aGUgcGxhdGZvcm0gQyByZXF1aXJlcyB0byBjb252ZXJ0IGEgc2l6ZV90L1B5X3NzaXplX3QgYXJndW1lbnQpOgorICoKKyAqICAgICBQeVN0cmluZ19Gcm9tRm9ybWF0CisgKiAgICAgUHlFcnJfRm9ybWF0CisgKiAgICAgUHlTdHJpbmdfRnJvbUZvcm1hdFYKKyAqCisgKiBMb3dlci1sZXZlbCB1c2VzIHJlcXVpcmUgdGhhdCB5b3UgaW50ZXJwb2xhdGUgdGhlIGNvcnJlY3QgZm9ybWF0IG1vZGlmaWVyCisgKiB5b3Vyc2VsZiAoZS5nLiwgY2FsbGluZyBwcmludGYsIGZwcmludGYsIHNwcmludGYsIFB5T1Nfc25wcmludGYpOyBmb3IKKyAqIGV4YW1wbGUsCisgKgorICogICAgIFB5X3NzaXplX3QgaW5kZXg7CisgKiAgICAgZnByaW50ZihzdGRlcnIsICJpbmRleCAlIiBQWV9GT1JNQVRfU0laRV9UICJkIHN1Y2tzXG4iLCBpbmRleCk7CisgKgorICogVGhhdCB3aWxsIGV4cGFuZCB0byAlbGQsIG9yICVJZCwgb3IgdG8gc29tZXRoaW5nIGVsc2UgY29ycmVjdCBmb3IgYQorICogUHlfc3NpemVfdCBvbiB0aGUgcGxhdGZvcm0uCisgKi8KKyNpZm5kZWYgUFlfRk9STUFUX1NJWkVfVAorIyAgIGlmIFNJWkVPRl9TSVpFX1QgPT0gU0laRU9GX0lOVCAmJiAhZGVmaW5lZChfX0FQUExFX18pCisjICAgICAgIGRlZmluZSBQWV9GT1JNQVRfU0laRV9UICIiCisjICAgZWxpZiBTSVpFT0ZfU0laRV9UID09IFNJWkVPRl9MT05HCisjICAgICAgIGRlZmluZSBQWV9GT1JNQVRfU0laRV9UICJsIgorIyAgIGVsaWYgZGVmaW5lZChNU19XSU5ET1dTKQorIyAgICAgICBkZWZpbmUgUFlfRk9STUFUX1NJWkVfVCAiSSIKKyMgICBlbGlmIGRlZmluZWQoX19NSU5HVzMyX18pICYmIGRlZmluZWQoX19VU0VfTUlOR1dfQU5TSV9TVERJTykKKyMgICAgICAgZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QgInoiCisjICAgZWxzZQorIyAgICAgICBlcnJvciAiVGhpcyBwbGF0Zm9ybSdzIHB5Y29uZmlnLmggbmVlZHMgdG8gZGVmaW5lIFBZX0ZPUk1BVF9TSVpFX1QiCisjICAgZW5kaWYKKyNlbmRpZgorCisvKiBQWV9GT1JNQVRfTE9OR19MT05HIGlzIGFuYWxvZ291cyB0byBQWV9GT1JNQVRfU0laRV9UIGFib3ZlLCBidXQgZm9yCisgKiB0aGUgbG9uZyBsb25nIHR5cGUgaW5zdGVhZCBvZiB0aGUgc2l6ZV90IHR5cGUuICBJdCdzIG9ubHkgYXZhaWxhYmxlCisgKiB3aGVuIEhBVkVfTE9OR19MT05HIGlzIGRlZmluZWQuIFRoZSAiaGlnaCBsZXZlbCIgUHl0aG9uIGZvcm1hdAorICogZnVuY3Rpb25zIGxpc3RlZCBhYm92ZSB3aWxsIGludGVycHJldCAibGxkIiBvciAibGx1IiBjb3JyZWN0bHkgb24KKyAqIGFsbCBwbGF0Zm9ybXMuCisgKi8KKyNpZmRlZiBIQVZFX0xPTkdfTE9ORworIyAgIGlmbmRlZiBQWV9GT1JNQVRfTE9OR19MT05HCisjICAgICAgIGlmIGRlZmluZWQoTVNfV0lONjQpIHx8IGRlZmluZWQoTVNfV0lORE9XUykKKyMgICAgICAgICAgIGRlZmluZSBQWV9GT1JNQVRfTE9OR19MT05HICJJNjQiCisjICAgICAgIGVsc2UKKyMgICAgICAgICAgIGVycm9yICJUaGlzIHBsYXRmb3JtJ3MgcHljb25maWcuaCBuZWVkcyB0byBkZWZpbmUgUFlfRk9STUFUX0xPTkdfTE9ORyIKKyMgICAgICAgZW5kaWYKKyMgICBlbmRpZgorI2VuZGlmCisKKy8qIFB5X0xPQ0FMIGNhbiBiZSB1c2VkIGluc3RlYWQgb2Ygc3RhdGljIHRvIGdldCB0aGUgZmFzdGVzdCBwb3NzaWJsZSBjYWxsaW5nCisgKiBjb252ZW50aW9uIGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgbG9jYWwgdG8gYSBnaXZlbiBtb2R1bGUuCisgKgorICogUHlfTE9DQUxfSU5MSU5FIGRvZXMgdGhlIHNhbWUgdGhpbmcsIGFuZCBhbHNvIGV4cGxpY2l0bHkgcmVxdWVzdHMgaW5saW5pbmcsCisgKiBmb3IgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGF0LgorICoKKyAqIElmIFBZX0xPQ0FMX0FHR1JFU1NJVkUgaXMgZGVmaW5lZCBiZWZvcmUgcHl0aG9uLmggaXMgaW5jbHVkZWQsIG1vcmUKKyAqICJhZ2dyZXNzaXZlIiBpbmxpbmluZy9vcHRpbWl6YWlvbiBpcyBlbmFibGVkIGZvciB0aGUgZW50aXJlIG1vZHVsZS4gIFRoaXMKKyAqIG1heSBsZWFkIHRvIGNvZGUgYmxvYXQsIGFuZCBtYXkgc2xvdyB0aGluZ3MgZG93biBmb3IgdGhvc2UgcmVhc29ucy4gIEl0IG1heQorICogYWxzbyBsZWFkIHRvIGVycm9ycywgaWYgdGhlIGNvZGUgcmVsaWVzIG9uIHBvaW50ZXIgYWxpYXNpbmcuICBVc2Ugd2l0aAorICogY2FyZS4KKyAqCisgKiBOT1RFOiBZb3UgY2FuIG9ubHkgdXNlIHRoaXMgZm9yIGZ1bmN0aW9ucyB0aGF0IGFyZSBlbnRpcmVseSBsb2NhbCB0byBhCisgKiBtb2R1bGU7IGZ1bmN0aW9ucyB0aGF0IGFyZSBleHBvcnRlZCB2aWEgbWV0aG9kIHRhYmxlcywgY2FsbGJhY2tzLCBldGMsCisgKiBzaG91bGQga2VlcCB1c2luZyBzdGF0aWMuCisgKi8KKworI3VuZGVmIFVTRV9JTkxJTkUgLyogWFhYIC0gc2V0IHZpYSBjb25maWd1cmU/ICovCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2lmIGRlZmluZWQoUFlfTE9DQUxfQUdHUkVTU0lWRSkKKy8qIGVuYWJsZSBtb3JlIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uIGZvciB2aXN1YWwgc3R1ZGlvICovCisjcHJhZ21hIG9wdGltaXplKCJhZ3R3Iiwgb24pCisjZW5kaWYKKy8qIGlnbm9yZSB3YXJuaW5ncyBpZiB0aGUgY29tcGlsZXIgZGVjaWRlcyBub3QgdG8gaW5saW5lIGEgZnVuY3Rpb24gKi8KKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NzEwKQorLyogZmFzdGVzdCBwb3NzaWJsZSBsb2NhbCBjYWxsIHVuZGVyIE1TVkMgKi8KKyNkZWZpbmUgUHlfTE9DQUwodHlwZSkgc3RhdGljIHR5cGUgX19mYXN0Y2FsbAorI2RlZmluZSBQeV9MT0NBTF9JTkxJTkUodHlwZSkgc3RhdGljIF9faW5saW5lIHR5cGUgX19mYXN0Y2FsbAorI2VsaWYgZGVmaW5lZChVU0VfSU5MSU5FKQorI2RlZmluZSBQeV9MT0NBTCh0eXBlKSBzdGF0aWMgdHlwZQorI2RlZmluZSBQeV9MT0NBTF9JTkxJTkUodHlwZSkgc3RhdGljIGlubGluZSB0eXBlCisjZWxzZQorI2RlZmluZSBQeV9MT0NBTCh0eXBlKSBzdGF0aWMgdHlwZQorI2RlZmluZSBQeV9MT0NBTF9JTkxJTkUodHlwZSkgc3RhdGljIHR5cGUKKyNlbmRpZgorCisvKiBQeV9NRU1DUFkgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiBtZW1jcHkgaW4gY2FzZXMgd2hlcmUgdGhlIGNvcGllZCBibG9ja3MKKyAqIGFyZSBvZnRlbiB2ZXJ5IHNob3J0LiAgV2hpbGUgbW9zdCBwbGF0Zm9ybXMgaGF2ZSBoaWdobHkgb3B0aW1pemVkIGNvZGUgZm9yCisgKiBsYXJnZSB0cmFuc2ZlcnMsIHRoZSBzZXR1cCBjb3N0cyBmb3IgbWVtY3B5IGFyZSBvZnRlbiBxdWl0ZSBoaWdoLiAgTUVNQ1BZCisgKiBzb2x2ZXMgdGhpcyBieSBkb2luZyBzaG9ydCBjb3BpZXMgImluIGxpbmUiLgorICovCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBQeV9NRU1DUFkodGFyZ2V0LCBzb3VyY2UsIGxlbmd0aCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaXplX3QgaV8sIG5fID0gKGxlbmd0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjaGFyICp0XyA9ICh2b2lkKikgKHRhcmdldCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBjaGFyICpzXyA9ICh2b2lkKikgKHNvdXJjZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAobl8gPj0gMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbWVtY3B5KHRfLCBzXywgbl8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChpXyA9IDA7IGlfIDwgbl87IGlfKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRfW2lfXSA9IHNfW2lfXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBQeV9NRU1DUFkgbWVtY3B5CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaWZkZWYgSEFWRV9JRUVFRlBfSAorI2luY2x1ZGUgPGllZWVmcC5oPiAgLyogbmVlZGVkIGZvciAnZmluaXRlJyBkZWNsYXJhdGlvbiBvbiBzb21lIHBsYXRmb3JtcyAqLworI2VuZGlmCisKKyNpbmNsdWRlIDxtYXRoLmg+IC8qIE1vdmVkIGhlcmUgZnJvbSB0aGUgbWF0aCBzZWN0aW9uLCBiZWZvcmUgZXh0ZXJuICJDIiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdSQVBQRVIgRk9SIDx0aW1lLmg+IGFuZC9vciA8c3lzL3RpbWUuaD4gKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgVElNRV9XSVRIX1NZU19USU1FCisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjZWxzZSAvKiAhVElNRV9XSVRIX1NZU19USU1FICovCisjaWZkZWYgSEFWRV9TWVNfVElNRV9ICisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNlbHNlIC8qICFIQVZFX1NZU19USU1FX0ggKi8KKyNpbmNsdWRlIDx0aW1lLmg+CisjZW5kaWYgLyogIUhBVkVfU1lTX1RJTUVfSCAqLworI2VuZGlmIC8qICFUSU1FX1dJVEhfU1lTX1RJTUUgKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBXUkFQUEVSIEZPUiA8c3lzL3NlbGVjdC5oPiAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBOQiBjYWxsZXIgbXVzdCBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gKi8KKworI2lmZGVmIEhBVkVfU1lTX1NFTEVDVF9ICisKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisKKyNlbmRpZiAvKiAhSEFWRV9TWVNfU0VMRUNUX0ggKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN0YXQoKSBhbmQgZnN0YXQoKSBmaWRkbGluZyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogV2UgZXhwZWN0IHRoYXQgc3RhdCBhbmQgZnN0YXQgZXhpc3Qgb24gbW9zdCBzeXN0ZW1zLgorICogIEl0J3MgY29uZmlybWVkIG9uIFVuaXgsIE1hYyBhbmQgV2luZG93cy4KKyAqICBJZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtLCBhZGQKKyAqICAgICAgI2RlZmluZSBET05UX0hBVkVfU1RBVAorICogYW5kL29yCisgKiAgICAgICNkZWZpbmUgRE9OVF9IQVZFX0ZTVEFUCisgKiB0byB5b3VyIHB5Y29uZmlnLmguIFB5dGhvbiBjb2RlIGJleW9uZCB0aGlzIHNob3VsZCBjaGVjayBIQVZFX1NUQVQgYW5kCisgKiBIQVZFX0ZTVEFUIGluc3RlYWQuCisgKiBBbHNvCisgKiAgICAgICNkZWZpbmUgSEFWRV9TWVNfU1RBVF9ICisgKiBpZiA8c3lzL3N0YXQuaD4gZXhpc3RzIG9uIHlvdXIgcGxhdGZvcm0sIGFuZAorICogICAgICAjZGVmaW5lIEhBVkVfU1RBVF9ICisgKiBpZiA8c3RhdC5oPiBkb2VzLgorICovCisjaWZuZGVmIERPTlRfSEFWRV9TVEFUCisjZGVmaW5lIEhBVkVfU1RBVAorI2VuZGlmCisKKyNpZm5kZWYgRE9OVF9IQVZFX0ZTVEFUCisjZGVmaW5lIEhBVkVfRlNUQVQKKyNlbmRpZgorCisjaWZkZWYgUklTQ09TCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAidW5peHN0dWZmLmgiCisjZW5kaWYKKworI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2lmIGRlZmluZWQoUFlPU19PUzIpICYmIGRlZmluZWQoUFlDQ19HQ0MpCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2VsaWYgZGVmaW5lZChIQVZFX1NUQVRfSCkKKyNpbmNsdWRlIDxzdGF0Lmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoUFlDQ19WQUNQUCkKKy8qIFZpc3VhbEFnZSBDL0MrKyBGYWlsZWQgdG8gRGVmaW5lIE1vdW50VHlwZSBGaWVsZCBpbiBzeXMvc3RhdC5oICovCisjZGVmaW5lIFNfSUZNVCAoU19JRkRJUnxTX0lGQ0hSfFNfSUZSRUcpCisjZW5kaWYKKworI2lmbmRlZiBTX0lTUkVHCisjZGVmaW5lIFNfSVNSRUcoeCkgKCgoeCkgJiBTX0lGTVQpID09IFNfSUZSRUcpCisjZW5kaWYKKworI2lmbmRlZiBTX0lTRElSCisjZGVmaW5lIFNfSVNESVIoeCkgKCgoeCkgJiBTX0lGTVQpID09IFNfSUZESVIpCisjZW5kaWYKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKy8qIE1vdmUgdGhpcyBkb3duIGhlcmUgc2luY2Ugc29tZSBDKysgI2luY2x1ZGUncyBkb24ndCBsaWtlIHRvIGJlIGluY2x1ZGVkCisgICBpbnNpZGUgYW4gZXh0ZXJuICJDIiAqLworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUCisgKiBDIGRvZXNuJ3QgZGVmaW5lIHdoZXRoZXIgYSByaWdodC1zaGlmdCBvZiBhIHNpZ25lZCBpbnRlZ2VyIHNpZ24tZXh0ZW5kcworICogb3IgemVyby1maWxscy4gIEhlcmUgYSBtYWNybyB0byBmb3JjZSBzaWduIGV4dGVuc2lvbjoKKyAqIFB5X0FSSVRITUVUSUNfUklHSFRfU0hJRlQoVFlQRSwgSSwgSikKKyAqICAgIFJldHVybiBJID4+IEosIGZvcmNpbmcgc2lnbiBleHRlbnNpb24uICBBcml0aG1ldGljYWxseSwgcmV0dXJuIHRoZQorICogICAgZmxvb3Igb2YgSS8yKipKLgorICogUmVxdWlyZW1lbnRzOgorICogICAgSSBzaG91bGQgaGF2ZSBzaWduZWQgaW50ZWdlciB0eXBlLiAgSW4gdGhlIHRlcm1pbm9sb2d5IG9mIEM5OSwgdGhpcyBjYW4KKyAqICAgIGJlIGVpdGhlciBvbmUgb2YgdGhlIGZpdmUgc3RhbmRhcmQgc2lnbmVkIGludGVnZXIgdHlwZXMgKHNpZ25lZCBjaGFyLAorICogICAgc2hvcnQsIGludCwgbG9uZywgbG9uZyBsb25nKSBvciBhbiBleHRlbmRlZCBzaWduZWQgaW50ZWdlciB0eXBlLgorICogICAgSiBpcyBhbiBpbnRlZ2VyID49IDAgYW5kIHN0cmljdGx5IGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlCisgKiAgICB0eXBlIG9mIEkgKGJlY2F1c2UgQyBkb2Vzbid0IGRlZmluZSB3aGF0IGhhcHBlbnMgZm9yIEogb3V0c2lkZSB0aGF0CisgKiAgICByYW5nZSBlaXRoZXIpLgorICogICAgVFlQRSB1c2VkIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgSSwgYnV0IGlzIG5vdyBpZ25vcmVkLiAgSXQncyBiZWVuIGxlZnQKKyAqICAgIGluIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb25zIDw9IDIuNiBvciAzLjAuCisgKiBDYXV0aW9uOgorICogICAgSSBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICovCisjaWZkZWYgU0lHTkVEX1JJR0hUX1NISUZUX1pFUk9fRklMTFMKKyNkZWZpbmUgUHlfQVJJVEhNRVRJQ19SSUdIVF9TSElGVChUWVBFLCBJLCBKKSBcCisgICAgKChJKSA8IDAgPyAtMS0oKC0xLShJKSkgPj4gKEopKSA6IChJKSA+PiAoSikpCisjZWxzZQorI2RlZmluZSBQeV9BUklUSE1FVElDX1JJR0hUX1NISUZUKFRZUEUsIEksIEopICgoSSkgPj4gKEopKQorI2VuZGlmCisKKy8qIFB5X0ZPUkNFX0VYUEFOU0lPTihYKQorICogIlNpbXBseSIgcmV0dXJucyBpdHMgYXJndW1lbnQuICBIb3dldmVyLCBtYWNybyBleHBhbnNpb25zIHdpdGhpbiB0aGUKKyAqIGFyZ3VtZW50IGFyZSBldmFsdWF0ZWQuICBUaGlzIHVuZm9ydHVuYXRlIHRyaWNrZXJ5IGlzIG5lZWRlZCB0byBnZXQKKyAqIHRva2VuLXBhc3RpbmcgdG8gd29yayBhcyBkZXNpcmVkIGluIHNvbWUgY2FzZXMuCisgKi8KKyNkZWZpbmUgUHlfRk9SQ0VfRVhQQU5TSU9OKFgpIFgKKworLyogUHlfU0FGRV9ET1dOQ0FTVChWQUxVRSwgV0lERSwgTkFSUk9XKQorICogQ2FzdCBWQUxVRSB0byB0eXBlIE5BUlJPVyBmcm9tIHR5cGUgV0lERS4gIEluIFB5X0RFQlVHIG1vZGUsIHRoaXMKKyAqIGFzc2VydC1mYWlscyBpZiBhbnkgaW5mb3JtYXRpb24gaXMgbG9zdC4KKyAqIENhdXRpb246CisgKiAgICBWQUxVRSBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICovCisjaWZkZWYgUHlfREVCVUcKKyNkZWZpbmUgUHlfU0FGRV9ET1dOQ0FTVChWQUxVRSwgV0lERSwgTkFSUk9XKSBcCisgICAgKGFzc2VydCgoV0lERSkoTkFSUk9XKShWQUxVRSkgPT0gKFZBTFVFKSksIChOQVJST1cpKFZBTFVFKSkKKyNlbHNlCisjZGVmaW5lIFB5X1NBRkVfRE9XTkNBU1QoVkFMVUUsIFdJREUsIE5BUlJPVykgKE5BUlJPVykoVkFMVUUpCisjZW5kaWYKKworLyogUHlfU0VUX0VSUk5PX09OX01BVEhfRVJST1IoeCkKKyAqIElmIGEgbGlibSBmdW5jdGlvbiBkaWQgbm90IHNldCBlcnJubywgYnV0IGl0IGxvb2tzIGxpa2UgdGhlIHJlc3VsdAorICogb3ZlcmZsb3dlZCBvciBub3QtYS1udW1iZXIsIHNldCBlcnJubyB0byBFUkFOR0Ugb3IgRURPTS4gIFNldCBlcnJubworICogdG8gMCBiZWZvcmUgY2FsbGluZyBhIGxpYm0gZnVuY3Rpb24sIGFuZCBpbnZva2UgdGhpcyBtYWNybyBhZnRlciwKKyAqIHBhc3NpbmcgdGhlIGZ1bmN0aW9uIHJlc3VsdC4KKyAqIENhdXRpb246CisgKiAgICBUaGlzIGlzbid0IHJlbGlhYmxlLiAgU2VlIFB5X09WRVJGTE9XRUQgY29tbWVudHMuCisgKiAgICBYIGlzIGV2YWx1YXRlZCBtb3JlIHRoYW4gb25jZS4KKyAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IChkZWZpbmVkKF9faHB1eCkgJiYgZGVmaW5lZChfX2lhNjQpKQorI2RlZmluZSBfUHlfU0VUX0VET01fRk9SX05BTihYKSBpZiAoaXNuYW4oWCkpIGVycm5vID0gRURPTTsKKyNlbHNlCisjZGVmaW5lIF9QeV9TRVRfRURPTV9GT1JfTkFOKFgpIDsKKyNlbmRpZgorI2RlZmluZSBQeV9TRVRfRVJSTk9fT05fTUFUSF9FUlJPUihYKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChlcnJubyA9PSAwKSB7IFwKKyAgICAgICAgICAgIGlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCkgXAorICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyBcCisgICAgICAgICAgICBlbHNlIF9QeV9TRVRfRURPTV9GT1JfTkFOKFgpIFwKKyAgICAgICAgfSBcCisgICAgfSB3aGlsZSgwKQorCisvKiBQeV9TRVRfRVJBTkdFX09OX09WRVJGTE9XKHgpCisgKiBBbiBhbGlhcyBvZiBQeV9TRVRfRVJSTk9fT05fTUFUSF9FUlJPUiBmb3IgYmFja3dhcmQtY29tcGF0aWJpbGl0eS4KKyAqLworI2RlZmluZSBQeV9TRVRfRVJBTkdFX0lGX09WRVJGTE9XKFgpIFB5X1NFVF9FUlJOT19PTl9NQVRIX0VSUk9SKFgpCisKKy8qIFB5X0FESlVTVF9FUkFOR0UxKHgpCisgKiBQeV9BREpVU1RfRVJBTkdFMih4LCB5KQorICogU2V0IGVycm5vIHRvIDAgYmVmb3JlIGNhbGxpbmcgYSBsaWJtIGZ1bmN0aW9uLCBhbmQgaW52b2tlIG9uZSBvZiB0aGVzZQorICogbWFjcm9zIGFmdGVyLCBwYXNzaW5nIHRoZSBmdW5jdGlvbiByZXN1bHQocykgKFB5X0FESlVTVF9FUkFOR0UyIGlzIHVzZWZ1bAorICogZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgY29tcGxleCByZXN1bHRzKS4gIFRoaXMgbWFrZXMgdHdvIGtpbmRzIG9mCisgKiBhZGp1c3RtZW50cyB0byBlcnJubzogIChBKSBJZiBpdCBsb29rcyBsaWtlIHRoZSBwbGF0Zm9ybSBsaWJtIHNldAorICogZXJybm89RVJBTkdFIGR1ZSB0byB1bmRlcmZsb3csIGNsZWFyIGVycm5vLiAoQikgSWYgaXQgbG9va3MgbGlrZSB0aGUKKyAqIHBsYXRmb3JtIGxpYm0gb3ZlcmZsb3dlZCBidXQgZGlkbid0IHNldCBlcnJubywgZm9yY2UgZXJybm8gdG8gRVJBTkdFLiAgSW4KKyAqIGVmZmVjdCwgd2UncmUgdHJ5aW5nIHRvIGZvcmNlIGEgdXNlZnVsIGltcGxlbWVudGF0aW9uIG9mIEM4OSBlcnJubworICogYmVoYXZpb3IuCisgKiBDYXV0aW9uOgorICogICAgVGhpcyBpc24ndCByZWxpYWJsZS4gIFNlZSBQeV9PVkVSRkxPV0VEIGNvbW1lbnRzLgorICogICAgWCBhbmQgWSBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLgorICovCisjZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UxKFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChlcnJubyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoKFgpID09IFB5X0hVR0VfVkFMIHx8IChYKSA9PSAtUHlfSFVHRV9WQUwpICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZXJybm8gPSBFUkFOR0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSAmJiAoWCkgPT0gMC4wKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisjZGVmaW5lIFB5X0FESlVTVF9FUkFOR0UyKFgsIFkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoWCkgPT0gUHlfSFVHRV9WQUwgfHwgKFgpID09IC1QeV9IVUdFX1ZBTCB8fCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoWSkgPT0gUHlfSFVHRV9WQUwgfHwgKFkpID09IC1QeV9IVUdFX1ZBTCkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm5vID0gRVJBTkdFOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYgKGVycm5vID09IEVSQU5HRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlcnJubyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSgwKQorCisvKiAgVGhlIGZ1bmN0aW9ucyBfUHlfZGdfc3RydG9kIGFuZCBfUHlfZGdfZHRvYSBpbiBQeXRob24vZHRvYS5jICh3aGljaCBhcmUKKyAqICByZXF1aXJlZCB0byBzdXBwb3J0IHRoZSBzaG9ydCBmbG9hdCByZXByIGludHJvZHVjZWQgaW4gUHl0aG9uIDMuMSkgcmVxdWlyZQorICogIHRoYXQgdGhlIGZsb2F0aW5nLXBvaW50IHVuaXQgdGhhdCdzIGJlaW5nIHVzZWQgZm9yIGFyaXRobWV0aWMgb3BlcmF0aW9ucworICogIG9uIEMgZG91YmxlcyBpcyBzZXQgdG8gdXNlIDUzLWJpdCBwcmVjaXNpb24uICBJdCBhbHNvIHJlcXVpcmVzIHRoYXQgdGhlCisgKiAgRlBVIHJvdW5kaW5nIG1vZGUgaXMgcm91bmQtaGFsZi10by1ldmVuLCBidXQgdGhhdCdzIGxlc3Mgb2Z0ZW4gYW4gaXNzdWUuCisgKgorICogIElmIHlvdXIgRlBVIGlzbid0IGFscmVhZHkgc2V0IHRvIDUzLWJpdCBwcmVjaXNpb24vcm91bmQtaGFsZi10by1ldmVuLCBhbmQKKyAqICB5b3Ugd2FudCB0byBtYWtlIHVzZSBvZiBfUHlfZGdfc3RydG9kIGFuZCBfUHlfZGdfZHRvYSwgdGhlbiB5b3Ugc2hvdWxkCisgKgorICogICAgICNkZWZpbmUgSEFWRV9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OIDEKKyAqCisgKiAgYW5kIGFsc28gZ2l2ZSBhcHByb3ByaWF0ZSBkZWZpbml0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyB0aHJlZSBtYWNyb3M6CisgKgorICogICAgX1BZX1NFVF81M0JJVF9QUkVDSVNJT05fU1RBUlQgOiBzdG9yZSBvcmlnaW5hbCBGUFUgc2V0dGluZ3MsIGFuZAorICogICAgICAgIHNldCBGUFUgdG8gNTMtYml0IHByZWNpc2lvbi9yb3VuZC1oYWxmLXRvLWV2ZW4KKyAqICAgIF9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0VORCA6IHJlc3RvcmUgb3JpZ2luYWwgRlBVIHNldHRpbmdzCisgKiAgICBfUFlfU0VUXzUzQklUX1BSRUNJU0lPTl9IRUFERVIgOiBhbnkgdmFyaWFibGUgZGVjbGFyYXRpb25zIG5lZWRlZCB0bworICogICAgICAgIHVzZSB0aGUgdHdvIG1hY3JvcyBhYm92ZS4KKyAqCisgKiBUaGUgbWFjcm9zIGFyZSBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBDIGZ1bmN0aW9uOiBzZWUKKyAqIFB5dGhvbi9weXN0cnRvZC5jIGZvciBhbiBleGFtcGxlIG9mIHRoZWlyIHVzZS4KKyAqLworCisvKiBnZXQgYW5kIHNldCB4ODcgY29udHJvbCB3b3JkIGZvciBnY2MveDg2ICovCisjaWZkZWYgSEFWRV9HQ0NfQVNNX0ZPUl9YODcKKyNkZWZpbmUgSEFWRV9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OIDEKKy8qIF9QeV9nZXQvc2V0XzM4N2NvbnRyb2x3b3JkIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBpbiBQeXRob24vcHltYXRoLmMgKi8KKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdW5zaWduZWQgc2hvcnQgb2xkXzM4N2NvbnRyb2x3b3JkLCBuZXdfMzg3Y29udHJvbHdvcmQKKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkXzM4N2NvbnRyb2x3b3JkID0gX1B5X2dldF8zODdjb250cm9sd29yZCgpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3XzM4N2NvbnRyb2x3b3JkID0gKG9sZF8zODdjb250cm9sd29yZCAmIH4weDBmMDApIHwgMHgwMjAwOyBcCisgICAgICAgIGlmIChuZXdfMzg3Y29udHJvbHdvcmQgIT0gb2xkXzM4N2NvbnRyb2x3b3JkKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfUHlfc2V0XzM4N2NvbnRyb2x3b3JkKG5ld18zODdjb250cm9sd29yZCk7ICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fRU5EICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKG5ld18zODdjb250cm9sd29yZCAhPSBvbGRfMzg3Y29udHJvbHdvcmQpICAgICAgICAgICAgICAgXAorICAgICAgICBfUHlfc2V0XzM4N2NvbnRyb2x3b3JkKG9sZF8zODdjb250cm9sd29yZCkKKyNlbmRpZgorCisvKiBnZXQgYW5kIHNldCB4ODcgY29udHJvbCB3b3JkIGZvciBWaXN1YWxTdHVkaW8veDg2ICovCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1dJTjY0KSAvKiB4ODcgbm90IHN1cHBvcnRlZCBpbiA2NC1iaXQgKi8KKyNkZWZpbmUgSEFWRV9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OIDEKKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSIFwKKyAgICB1bnNpZ25lZCBpbnQgb2xkXzM4N2NvbnRyb2x3b3JkLCBuZXdfMzg3Y29udHJvbHdvcmQsIG91dF8zODdjb250cm9sd29yZAorLyogV2UgdXNlIHRoZSBfX2NvbnRyb2w4N18yIGZ1bmN0aW9uIHRvIHNldCBvbmx5IHRoZSB4ODcgY29udHJvbCB3b3JkLgorICAgVGhlIFNTRSBjb250cm9sIHdvcmQgaXMgdW5hZmZlY3RlZC4gKi8KKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19jb250cm9sODdfMigwLCAwLCAmb2xkXzM4N2NvbnRyb2x3b3JkLCBOVUxMKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3XzM4N2NvbnRyb2x3b3JkID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAob2xkXzM4N2NvbnRyb2x3b3JkICYgfihfTUNXX1BDIHwgX01DV19SQykpIHwgKF9QQ181MyB8IF9SQ19ORUFSKTsgXAorICAgICAgICBpZiAobmV3XzM4N2NvbnRyb2x3b3JkICE9IG9sZF8zODdjb250cm9sd29yZCkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19jb250cm9sODdfMihuZXdfMzg3Y29udHJvbHdvcmQsIF9NQ1dfUEMgfCBfTUNXX1JDLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0XzM4N2NvbnRyb2x3b3JkLCBOVUxMKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChuZXdfMzg3Y29udHJvbHdvcmQgIT0gb2xkXzM4N2NvbnRyb2x3b3JkKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX2NvbnRyb2w4N18yKG9sZF8zODdjb250cm9sd29yZCwgX01DV19QQyB8IF9NQ1dfUkMsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfMzg3Y29udHJvbHdvcmQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBkZWZhdWx0IGRlZmluaXRpb25zIGFyZSBlbXB0eSAqLworI2lmbmRlZiBIQVZFX1BZX1NFVF81M0JJVF9QUkVDSVNJT04KKyNkZWZpbmUgX1B5X1NFVF81M0JJVF9QUkVDSVNJT05fSEVBREVSCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX1NUQVJUCisjZGVmaW5lIF9QeV9TRVRfNTNCSVRfUFJFQ0lTSU9OX0VORAorI2VuZGlmCisKKy8qIElmIHdlIGNhbid0IGd1YXJhbnRlZSA1My1iaXQgcHJlY2lzaW9uLCBkb24ndCB1c2UgdGhlIGNvZGUKKyAgIGluIFB5dGhvbi9kdG9hLmMsIGJ1dCBmYWxsIGJhY2sgdG8gc3RhbmRhcmQgY29kZS4gIFRoaXMKKyAgIG1lYW5zIHRoYXQgcmVwciBvZiBhIGZsb2F0IHdpbGwgYmUgbG9uZyAoMTcgc2lnIGRpZ2l0cykuCisKKyAgIFJlYWxpc3RpY2FsbHksIHRoZXJlIGFyZSB0d28gdGhpbmdzIHRoYXQgY291bGQgZ28gd3Jvbmc6CisKKyAgICgxKSBkb3VibGVzIGFyZW4ndCBJRUVFIDc1NCBkb3VibGVzLCBvcgorICAgKDIpIHdlJ3JlIG9uIHg4NiB3aXRoIHRoZSByb3VuZGluZyBwcmVjaXNpb24gc2V0IHRvIDY0LWJpdHMKKyAgICAgICAoZXh0ZW5kZWQgcHJlY2lzaW9uKSwgYW5kIHdlIGRvbid0IGtub3cgaG93IHRvIGNoYW5nZQorICAgICAgIHRoZSByb3VuZGluZyBwcmVjaXNpb24uCisgKi8KKworI2lmICFkZWZpbmVkKERPVUJMRV9JU19MSVRUTEVfRU5ESUFOX0lFRUU3NTQpICYmIFwKKyAgICAhZGVmaW5lZChET1VCTEVfSVNfQklHX0VORElBTl9JRUVFNzU0KSAmJiBcCisgICAgIWRlZmluZWQoRE9VQkxFX0lTX0FSTV9NSVhFRF9FTkRJQU5fSUVFRTc1NCkKKyNkZWZpbmUgUFlfTk9fU0hPUlRfRkxPQVRfUkVQUgorI2VuZGlmCisKKy8qIGRvdWJsZSByb3VuZGluZyBpcyBzeW1wdG9tYXRpYyBvZiB1c2Ugb2YgZXh0ZW5kZWQgcHJlY2lzaW9uIG9uIHg4Ni4gIElmCisgICB3ZSdyZSBzZWVpbmcgZG91YmxlIHJvdW5kaW5nLCBhbmQgd2UgZG9uJ3QgaGF2ZSBhbnkgbWVjaGFuaXNtIGF2YWlsYWJsZSBmb3IKKyAgIGNoYW5naW5nIHRoZSBGUFUgcm91bmRpbmcgcHJlY2lzaW9uLCB0aGVuIGRvbid0IHVzZSBQeXRob24vZHRvYS5jLiAqLworI2lmIGRlZmluZWQoWDg3X0RPVUJMRV9ST1VORElORykgJiYgIWRlZmluZWQoSEFWRV9QWV9TRVRfNTNCSVRfUFJFQ0lTSU9OKQorI2RlZmluZSBQWV9OT19TSE9SVF9GTE9BVF9SRVBSCisjZW5kaWYKKworLyogUHlfREVQUkVDQVRFRCh2ZXJzaW9uKQorICogRGVjbGFyZSBhIHZhcmlhYmxlLCB0eXBlLCBvciBmdW5jdGlvbiBkZXByZWNhdGVkLgorICogVXNhZ2U6CisgKiAgICBleHRlcm4gaW50IG9sZF92YXIgUHlfREVQUkVDQVRFRCgyLjMpOworICogICAgdHlwZWRlZiBpbnQgVDEgUHlfREVQUkVDQVRFRCgyLjQpOworICogICAgZXh0ZXJuIGludCB4KCkgUHlfREVQUkVDQVRFRCgyLjUpOworICovCisjaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgKChfX0dOVUNfXyA+PSA0KSB8fCBcCisgICAgICAgICAgICAgIChfX0dOVUNfXyA9PSAzKSAmJiAoX19HTlVDX01JTk9SX18gPj0gMSkpCisjZGVmaW5lIFB5X0RFUFJFQ0FURUQoVkVSU0lPTl9VTlVTRUQpIF9fYXR0cmlidXRlX18oKF9fZGVwcmVjYXRlZF9fKSkKKyNlbHNlCisjZGVmaW5lIFB5X0RFUFJFQ0FURUQoVkVSU0lPTl9VTlVTRUQpCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitQcm90b3R5cGVzIHRoYXQgYXJlIG1pc3NpbmcgZnJvbSB0aGUgc3RhbmRhcmQgaW5jbHVkZSBmaWxlcyBvbiBzb21lIHN5c3RlbXMKKyhhbmQgcG9zc2libHkgb25seSBzb21lIHZlcnNpb25zIG9mIHN1Y2ggc3lzdGVtcy4pCisKK1BsZWFzZSBiZSBjb25zZXJ2YXRpdmUgd2l0aCBhZGRpbmcgbmV3IG9uZXMsIGRvY3VtZW50IHRoZW0gYW5kIGVuY2xvc2UgdGhlbQoraW4gcGxhdGZvcm0tc3BlY2lmaWMgI2lmZGVmcy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgU09MQVJJUworLyogVW5jaGVja2VkICovCitleHRlcm4gaW50IGdldGhvc3RuYW1lKGNoYXIgKiwgaW50KTsKKyNlbmRpZgorCisjaWZkZWYgX19CRU9TX18KKy8qIFVuY2hlY2tlZCAqLworLyogSXQncyBpbiB0aGUgbGlicywgYnV0IG5vdCB0aGUgaGVhZGVycy4uLiAtIFtjamhdICovCitpbnQgc2h1dGRvd24oIGludCwgaW50ICk7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfX0dFVFBUWQorI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgICAgICAvKiB3ZSBuZWVkIHRvIGltcG9ydCBtb2RlX3QgKi8KK2V4dGVybiBjaGFyICogX2dldHB0eShpbnQgKiwgaW50LCBtb2RlX3QsIGludCk7CisjZW5kaWYKKworLyogT24gUU5YIDYsIHN0cnVjdCB0ZXJtaW8gbXVzdCBiZSBkZWNsYXJlZCBieSBpbmNsdWRpbmcgc3lzL3Rlcm1pby5oCisgICBpZiBUQ0dFVEEsIFRDU0VUQSwgVENTRVRBVywgb3IgVENTRVRBRiBhcmUgdXNlZC4gIHN5cy90ZXJtaW8uaCBtdXN0CisgICBiZSBpbmNsdWRlZCBiZWZvcmUgdGVybWlvcy5oIG9yIGl0IHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3IuICovCisjaWYgZGVmaW5lZChIQVZFX1NZU19URVJNSU9fSCkgJiYgIWRlZmluZWQoX19ocHV4KQorI2luY2x1ZGUgPHN5cy90ZXJtaW8uaD4KKyNlbmRpZgorCisjaWYgZGVmaW5lZChIQVZFX09QRU5QVFkpIHx8IGRlZmluZWQoSEFWRV9GT1JLUFRZKQorI2lmICFkZWZpbmVkKEhBVkVfUFRZX0gpICYmICFkZWZpbmVkKEhBVkVfTElCVVRJTF9IKSAmJiAhZGVmaW5lZChIQVZFX1VUSUxfSCkKKy8qIEJTREkgZG9lcyBub3Qgc3VwcGx5IGEgcHJvdG90eXBlIGZvciB0aGUgJ29wZW5wdHknIGFuZCAnZm9ya3B0eScKKyAgIGZ1bmN0aW9ucywgZXZlbiB0aG91Z2ggdGhleSBhcmUgaW5jbHVkZWQgaW4gbGlidXRpbC4gKi8KKyNpbmNsdWRlIDx0ZXJtaW9zLmg+CitleHRlcm4gaW50IG9wZW5wdHkoaW50ICosIGludCAqLCBjaGFyICosIHN0cnVjdCB0ZXJtaW9zICosIHN0cnVjdCB3aW5zaXplICopOworZXh0ZXJuIHBpZF90IGZvcmtwdHkoaW50ICosIGNoYXIgKiwgc3RydWN0IHRlcm1pb3MgKiwgc3RydWN0IHdpbnNpemUgKik7CisjZW5kaWYgLyogIWRlZmluZWQoSEFWRV9QVFlfSCkgJiYgIWRlZmluZWQoSEFWRV9MSUJVVElMX0gpICovCisjZW5kaWYgLyogZGVmaW5lZChIQVZFX09QRU5QVFkpIHx8IGRlZmluZWQoSEFWRV9GT1JLUFRZKSAqLworCisKKy8qIFRoZXNlIGFyZSBwdWxsZWQgZnJvbSB2YXJpb3VzIHBsYWNlcy4gSXQgaXNuJ3Qgb2J2aW91cyBvbiB3aGF0IHBsYXRmb3JtcworICAgdGhleSBhcmUgbmVjZXNzYXJ5LCBub3Igd2hhdCB0aGUgZXhhY3QgcHJvdG90eXBlIHNob3VsZCBsb29rIGxpa2UgKHdoaWNoCisgICBpcyBsaWtlbHkgdG8gdmFyeSBiZXR3ZWVuIHBsYXRmb3JtcyEpIElmIHlvdSBmaW5kIHlvdSBuZWVkIG9uZSBvZiB0aGVzZQorICAgZGVjbGFyYXRpb25zLCBwbGVhc2UgbW92ZSB0aGVtIHRvIGEgcGxhdGZvcm0tc3BlY2lmaWMgYmxvY2sgYW5kIGluY2x1ZGUKKyAgIHByb3BlciBwcm90b3R5cGVzLiAqLworI2lmIDAKKworLyogRnJvbSBNb2R1bGVzL3Jlc291cmNlLmMgKi8KK2V4dGVybiBpbnQgZ2V0cnVzYWdlKCk7CitleHRlcm4gaW50IGdldHBhZ2VzaXplKCk7CisKKy8qIEZyb20gUHl0aG9uL3N5c21vZHVsZS5jIGFuZCBNb2R1bGVzL3Bvc2l4bW9kdWxlLmMgKi8KK2V4dGVybiBpbnQgZmNsb3NlKEZJTEUgKik7CisKKy8qIEZyb20gTW9kdWxlcy9wb3NpeG1vZHVsZS5jICovCitleHRlcm4gaW50IGZkYXRhc3luYyhpbnQpOworI2VuZGlmIC8qIDAgKi8KKworCisjaWZkZWYgX19NSU5HVzMyX18KKy8qIEZJWE1FOiBzb21lIG9mIG5leHQgZGVmaW5pdGlvbnMgc3BlY2lmaWMgdG8gZ2NjKG1pbmd3IGJ1aWxkKSBjYW4gYmUKKyAgIGdlbmVyYWxpemVkIG9uIGRlZmluaXRpb25zIG9mIF9XSU4zMiBvciBXSU4zMiBhbmQgdG8gYmUgY29tbW9uIGZvcgorICAgYWxsIHdpbmRvd3MgYnVpbGQgaW5zdGVhZCBleHBsaWNpdGx5IHRvIGRlZmluZSBvbmx5IGZvciBub24tYXV0b3Rvb2xzCisgICBiYXNlZCBidWlsZHMgKHNlZSBQQy9weWNvbmZpZy5oIGZvciBkZXRhaWxzKS4gKi8KKyNpZiAhZGVmaW5lZChNU19XSU42NCkgJiYgZGVmaW5lZChfV0lONjQpCisjICBkZWZpbmUgTVNfV0lONjQKKyNlbmRpZgorI2lmICFkZWZpbmVkKE1TX1dJTjMyKSAmJiBkZWZpbmVkKF9XSU4zMikKKyMgIGRlZmluZSBNU19XSU4zMgorI2VuZGlmCisjaWYgIWRlZmluZWQoTVNfV0lOMzIpICYmIGRlZmluZWQoX1dJTjMyKQorIyAgZGVmaW5lIE1TX1dJTjMyCisjZW5kaWYKKyNpZiAhZGVmaW5lZChNU19XSU5ET1dTKSAmJiBkZWZpbmVkKE1TX1dJTjMyKQorIyAgZGVmaW5lIE1TX1dJTkRPV1MKKyNlbmRpZgorCisjaWZuZGVmIFBZVEhPTlBBVEgKKyMgIGRlZmluZSBQWVRIT05QQVRIICIuXFxETExzOy5cXGxpYjsuXFxsaWJcXHBsYXQtd2luOy5cXGxpYlxcbGliLXRrIgorI2VuZGlmCisKKy8qIHB5dGhvbiAyLjYrIHJlcXVpcmVzIFdpbmRvd3MgMjAwMCBvciBncmVhdGVyLiAqLworI2RlZmluZSBQeV9XSU5WRVIgMHgwNTAwCisKKyNpZiBkZWZpbmVkKFB5X0JVSUxEX0NPUkUpIHx8IGRlZmluZWQoUHlfQlVJTERfQ09SRV9NT0RVTEUpCisvKiBGSVhNRSBpZiBOVERESV94eHggaXMgaW4gdXNlIGJ5IG1pbmd3IChzZWUgUEMvcHljb25maWcuaCkgKi8KKyNpZm5kZWYgV0lOVkVSCisjICBkZWZpbmUgV0lOVkVSIFB5X1dJTlZFUgorI2VuZGlmCisjaWZuZGVmIF9XSU4zMl9XSU5OVAorIyAgZGVmaW5lIF9XSU4zMl9XSU5OVCBQeV9XSU5WRVIKKyNlbmRpZgorI2VuZGlmCisKKyNpZmRlZiBQTEFURk9STQorLypOT1RFOiBpZiBjb21waWxlIGdldHBsYXRmb3JtLmMgUExBVEZPUk0gaXMgc2V0IHRvIE1BQ0hERVAgdGhhdCBpcworICAid2luIiBmb3IgbWluZ3cgYnVpbGQgKHNlZSByZXNwZWN0aXZlIGNvbW1lbnQgaW4gY29uZmlndXJlLmluKS4gKi8KKyMgdW5kZWYgUExBVEZPUk0KKyNlbmRpZgorLyogYWx3YXlzIHNldCB0byAid2luMzIiIC0gc2VlIFBDL3B5Y29uZmlnLmggKi8KKyNkZWZpbmUgUExBVEZPUk0gIndpbjMyIgorCisjaWYgZGVmaW5lZChNU19XSU42NCkKKyMgIGRlZmluZSBTSVpFT0ZfSEtFWSA4CisjZWxpZiBkZWZpbmVkKE1TX1dJTjMyKQorIyAgZGVmaW5lIFNJWkVPRl9IS0VZIDQKKyNlbmRpZgorCisvKk5PVEU6IG1pbmd3IGhhcyBpc2luZiBhcyBtYWNybyBkZWZpbmVkIGluIG1hdGguaC4KKyAgU2luY2UgUEMvcHljb25maWcuaCBkZWZpbmUgUHlfSVNfSU5GSU5JVFkoWCkgdGhhdCBjb3ZlciBIQVZFX0RFQ0xfSVNGSU5JVEUKKyAgaGVyZSBmb3IgUHlfSVNfSU5GSU5JVFkgd2UgZGVmaW5lIHNhbWUgYXMgZm9yIE1TVkMgYnVpbGQuCisgIFRoaXMgbWFrZXMgSEFWRV9ERUNMX0lTRklOSVRFIG5lZWRsZXNzLgorICBBbHNvIHNlZSBjb21tYW50cyBpbiBjb25maWd1cmUuaW4gYW5kIHB5bWF0aC5oLiAqLworI2RlZmluZSBQeV9JU19JTkZJTklUWShYKSAoIV9maW5pdGUoWCkgJiYgIV9pc25hbihYKSkKKworI2lmbmRlZiBIQVZFX0xBUkdFRklMRV9TVVBQT1JUCisvKgorICBGSVhNRTogb24gd2luZG93cyBwbGF0Zm9ybXM6CisgICAtIFB5dGhvbiB1c2UgUFlfTE9OR19MT05HKCEpIGZvciBQeV9vZmZfdCAoX2ZpbGVpby5jKTsKKyAgIC0gSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCBpcyBkZWZpbmVkIGluIFBDL3B5Y29uZmlnLmg7CisgICAtIFBDL3B5Y29uZmlnLmggZGVmaW5lIDQgZm9yIFNJWkVPRl9PRkZfVCBhbmQgOCBmb3IgU0laRU9GX0ZQT1NfVDsKKyAgIC0gSWYgSEFWRV9MQVJHRUZJTEVfU1VQUE9SVCBpc24ndCBkZWZpbmVkIHB5dGhvbiB3aWxsIHVzZSBvZmZfdCghKQorICAgZm9yIFB5X29mZl90IChzZWUgZmlsZW9iamVjdHMuYyBhbmQgYnoybW9kdWxlLmMpLgorICBTaW5jZSBmb3IgbWluZ3cgY29uZmlndXJlIGRldGVjdCA0IGZvciBzaXplIG9mICJvZmZfdCIgYW5kIDggLSBmb3IKKyAgImZwb3NfdCIgd2UgaGFzIHRvIGRlZmluZSBIQVZFX0xBUkdFRklMRV9TVVBQT1JUIHRvby4KKyAgVE9ETzogdG8gdGVzdCB3aXRoIEFDX1NZU19MQVJHRUZJTEUgYW5kIGFwcHJvcHJpYXRlIHVwZGF0ZXMgaW4KKyAgcHl0aG9uIGNvZGUuCisqLworIyAgZGVmaW5lIEhBVkVfTEFSR0VGSUxFX1NVUFBPUlQKKyNlbmRpZgorCisjaWYgZGVmaW5lZChQeV9FTkFCTEVfU0hBUkVEKQorIyAgZGVmaW5lIE1TX0NPUkVETEwgMSAvKiBkZXByZWNhdGVkIG9sZCBzeW1ib2wsIGJ1dCBzdGlsbCBpbiB1c2UgZm9yIHdpbmRvd3MgY29kZSAqLworI2Vsc2UKKyMgIGRlZmluZSBNU19OT19DT1JFRExMIDEKKyNlbmRpZgorCisjaWYgUHlfVU5JQ09ERV9TSVpFID09IDIKKy8qIEZvciBtaW5ndyBpcyAyIGJ1dCBGSVhNRTogV2hhdCBhYm91dCB0byByYWlzZSBlcnJvciBpbiBjb25maWd1cmUgaWYKKyAgIHVuaWNvZGUgc2l6ZSBpc24ndCB0d28gPyBEaWQgcHl0aG9uIHdpbmRvd3MgY29kZSBzdXBwb3J0IHVjczQgPyAqLworIyAgZGVmaW5lIFB5X1dJTl9XSURFX0ZJTEVOQU1FUworI2VuZGlmCisKKy8qIE5PVEU6IERvbid0IGRlZmluZSBIQVZFX1NURERFRl9ILgorICogSXQgaXMgZGVmaW5lZCBieSBQQy9weWNvbmZpZy5oIGFuZCB1c2VkIGJ5IEluY2x1ZGUvUHl0aG9uLmgKKyAqICh3aXRoIGNvbW1lbnQgRm9yIHNpemVfdD8pIGJ1dCBpc24ndCByZXF1aXJlZCBmb3IgbWluZ3cgICovCisjZGVmaW5lIFB5X1NPQ0tFVF9GRF9DQU5fQkVfR0VfRkRfU0VUU0laRQorCisvKiBBbGwgb3RoZXIgZGVmaW5lcyBmcm9tIFBDL3B5Y29uZmlnLmggYXJlIGluIGF1dG9jb25mIGdlbmVyYXRlZAorICAgcHljb25maWcuaCAqLworI2lmIDAKKy8qRklYTUU6CisgIE1TRE46CisgICAgIlRoZSBnZXRhZGRyaW5mbyBmdW5jdGlvbiB3YXMgYWRkZWQgdG8gdGhlIHdzMl8zMi5kbGwgb24gV2luZG93cyBYUAorICAgIGFuZCBsYXRlci4iCisgIG1pbmd3OgorICAgIGdldGFkZHJpbmZvIGFuZCBnZXRuYW1laW5mbyBpcyBkZWZpbmVkIGZvciBXSU5WRVIgPj0gMHgwNTAxLgorICBQQy9weWNvbmZpZy5oOgorICAgICJQeXRob24gMi42KyByZXF1aXJlcyBXaW5kb3dzIDIwMDAgb3IgZ3JlYXRlciIKKyAgU28gZmFyIHNvIGdvb2QgYnV0IHNvY2tldG1vZHVsZS5oIGRlZmluZSBIQVZFX0dFVEFERFJJTkZPIGFuZAorICBIQVZFX0dFVE5BTUVJTkZPIHVuZGVyIHZlcnkgc3BlY2lmaWMgY29uZGl0aW9uIDoKKyAgICAjIGlmZGVmIFNJT19HRVRfTVVMVElDQVNUX0ZJTFRFUgorICAgICMgIGluY2x1ZGUgPE1TVGNwSVAuaD4KKyAgU28gdGhlIHF1ZXN0aW9uIGlzICJTZXBhcmF0ZSBTREtzIiByZXF1aXJlZCBmb3IgdzJrIGluIE1TVkMgYnVpbGQgPworICBUT0RPOiByZXNvbHZlIGxhdGVyLCBtYXkgYnkgY29uZmlndXJlIDotLy4gRm9yIG5vdyBweXRob24gY29kZSB3aWxsCisgIHVzZSBmYWtlIGltcGxlbWVudGF0aW9uIGFuZCBpZiB1c2VyIGRlZmluZSBhcHByb3ByaWF0ZSB2YWx1ZSBmb3IKKyAgV0lOVkVSIC0gdGhlIGZ1bmN0aW9uYXMgZnJvbSBDIHJ1bnRpbWUuCisgIEZvciBkZXRhaWxzIHNlZSBzb2NrZXRtb2R1bGUuYyAuCisgICovCisjaWZuZGVmIEhBVkVfR0VUQUREUklORk8KKyMgIGRlZmluZSBIQVZFX0dFVEFERFJJTkZPCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9HRVROQU1FSU5GTworIyAgZGVmaW5lIEhBVkVfR0VUTkFNRUlORk8KKyNlbmRpZgorI2VuZGlmCisKKy8qIFJlZmVyIHRvIDxNb2R1bGVzL19tYXRoLmg+IC4KKyAgIEZvciBtaW5ndyBob3N0IGNvbmZpZ3VyZSBkZXRlY3QgZnVuY3Rpb25zIGRlc2NyaWJlZCBhcyBIQVZFX1hYWAorICAgaW4gX21hdGguaCBidXQgYXMgTVNWQyBkb24ndCBkZWZpbmUgdGhlbSB3ZSB3aWxsIHVuZGVmaW5lIEhBVkVfWFhYCisgICB0b28gdG8gdXNlIF9QeV8qIHJlcGxhY2VtZW50cyBzYW1lIGFzIE1TVkMgYnVpbGQgLgorICovCisjdW5kZWYgSEFWRV9BQ09TSAorI3VuZGVmIEhBVkVfQVNJTkgKKyN1bmRlZiBIQVZFX0FUQU5ICisjdW5kZWYgSEFWRV9FWFBNMQorI3VuZGVmIEhBVkVfTE9HMVAKKworI2VuZGlmIC8qZGVmIF9fTUlOR1czMl9fKi8KKworLyogT24gNC40QlNELWRlc2NlbmRhbnRzLCBjdHlwZSBmdW5jdGlvbnMgc2VydmVzIHRoZSB3aG9sZSByYW5nZSBvZgorICogd2NoYXJfdCBjaGFyYWN0ZXIgc2V0IHJhdGhlciB0aGFuIHNpbmdsZSBieXRlIGNvZGUgcG9pbnRzIG9ubHkuCisgKiBUaGlzIGNoYXJhY3RlcmlzdGljIGNhbiBicmVhayBzb21lIG9wZXJhdGlvbnMgb2Ygc3RyaW5nIG9iamVjdAorICogaW5jbHVkaW5nIHN0ci51cHBlcigpIGFuZCBzdHIuc3BsaXQoKSBvbiBVVEYtOCBsb2NhbGVzLiAgVGhpcworICogd29ya2Fyb3VuZCB3YXMgcHJvdmlkZWQgYnkgVGltIFJvYmJpbnMgb2YgRnJlZUJTRCBwcm9qZWN0LgorICovCisKKyNpZmRlZiBfX0ZyZWVCU0RfXworI2luY2x1ZGUgPG9zcmVsZGF0ZS5oPgorI2lmIF9fRnJlZUJTRF92ZXJzaW9uID4gNTAwMDM5CisjIGRlZmluZSBfUFlfUE9SVF9DVFlQRV9VVEY4X0lTU1VFCisjZW5kaWYKKyNlbmRpZgorCisKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyMgZGVmaW5lIF9QWV9QT1JUX0NUWVBFX1VURjhfSVNTVUUKKyNlbmRpZgorCisjaWZkZWYgX1BZX1BPUlRfQ1RZUEVfVVRGOF9JU1NVRQorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8d2N0eXBlLmg+CisjdW5kZWYgaXNhbG51bQorI2RlZmluZSBpc2FsbnVtKGMpIGlzd2FsbnVtKGJ0b3djKGMpKQorI3VuZGVmIGlzYWxwaGEKKyNkZWZpbmUgaXNhbHBoYShjKSBpc3dhbHBoYShidG93YyhjKSkKKyN1bmRlZiBpc2xvd2VyCisjZGVmaW5lIGlzbG93ZXIoYykgaXN3bG93ZXIoYnRvd2MoYykpCisjdW5kZWYgaXNzcGFjZQorI2RlZmluZSBpc3NwYWNlKGMpIGlzd3NwYWNlKGJ0b3djKGMpKQorI3VuZGVmIGlzdXBwZXIKKyNkZWZpbmUgaXN1cHBlcihjKSBpc3d1cHBlcihidG93YyhjKSkKKyN1bmRlZiB0b2xvd2VyCisjZGVmaW5lIHRvbG93ZXIoYykgdG93bG93ZXIoYnRvd2MoYykpCisjdW5kZWYgdG91cHBlcgorI2RlZmluZSB0b3VwcGVyKGMpIHRvd3VwcGVyKGJ0b3djKGMpKQorI2VuZGlmCisKKworLyogRGVjbGFyYXRpb25zIGZvciBzeW1ib2wgdmlzaWJpbGl0eS4KKworICBQeUFQSV9GVU5DKHR5cGUpOiBEZWNsYXJlcyBhIHB1YmxpYyBQeXRob24gQVBJIGZ1bmN0aW9uIGFuZCByZXR1cm4gdHlwZQorICBQeUFQSV9EQVRBKHR5cGUpOiBEZWNsYXJlcyBwdWJsaWMgUHl0aG9uIGRhdGEgYW5kIGl0cyB0eXBlCisgIFB5TU9ESU5JVF9GVU5DOiAgIEEgUHl0aG9uIG1vZHVsZSBpbml0IGZ1bmN0aW9uLiAgSWYgdGhlc2UgZnVuY3Rpb25zIGFyZQorICAgICAgICAgICAgICAgICAgICBpbnNpZGUgdGhlIFB5dGhvbiBjb3JlLCB0aGV5IGFyZSBwcml2YXRlIHRvIHRoZSBjb3JlLgorICAgICAgICAgICAgICAgICAgICBJZiBpbiBhbiBleHRlbnNpb24gbW9kdWxlLCBpdCBtYXkgYmUgZGVjbGFyZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBsaW5rYWdlIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCisKKyAgQXMgYSBudW1iZXIgb2YgcGxhdGZvcm1zIHN1cHBvcnQvcmVxdWlyZSAiX19kZWNsc3BlYyhkbGxpbXBvcnQvZGxsZXhwb3J0KSIsCisgIHdlIHN1cHBvcnQgYSBIQVZFX0RFQ0xTUEVDX0RMTCBtYWNybyB0byBzYXZlIGR1cGxpY2F0aW9uLgorKi8KKworLyoKKyAgTVNWQyB3aW5kb3dzIHBvcnQgaXMgaGFuZGxlZCBpbiBQQy9weWNvbmZpZy5oLgorCisgIEJlT1MsIG1pbmd3MzIgYW5kIGN5Z3dpbiB1c2UgYXV0b2NvbmYgYW5kIHJlcXVpcmUgc3BlY2lhbAorICBsaW5rYWdlIGhhbmRsaW5nIGFuZCBhbGwgb2YgdGhlc2UgdXNlIF9fZGVjbHNwZWMoKS4KKyovCisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKSB8fCBkZWZpbmVkKF9fTUlOR1czMl9fKSB8fCBkZWZpbmVkKF9fQkVPU19fKQorIyAgICAgICBkZWZpbmUgSEFWRV9ERUNMU1BFQ19ETEwKKyNlbmRpZgorCisvKiBvbmx5IGdldCBzcGVjaWFsIGxpbmthZ2UgaWYgYnVpbHQgYXMgc2hhcmVkIG9yIHBsYXRmb3JtIGlzIEN5Z3dpbiAqLworI2lmIGRlZmluZWQoUHlfRU5BQkxFX1NIQVJFRCkgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgICAgICBpZiBkZWZpbmVkKEhBVkVfREVDTFNQRUNfRExMKQorIyAgICAgICAgICAgICAgIGlmZGVmIFB5X0JVSUxEX0NPUkUKKyMgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisgICAgICAgIC8qIG1vZHVsZSBpbml0IGZ1bmN0aW9ucyBpbnNpZGUgdGhlIGNvcmUgbmVlZCBubyBleHRlcm5hbCBsaW5rYWdlICovCisgICAgICAgIC8qIGV4Y2VwdCBmb3IgQ3lnd2luIHRvIGhhbmRsZSBlbWJlZGRpbmcgKEZJWE1FOiBCZU9TIHRvbz8pICovCisjICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZAorIyAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAvKiBfX0NZR1dJTl9fICovCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCisjICAgICAgICAgICAgICAgICAgICAgICBlbmRpZiAvKiBfX0NZR1dJTl9fICovCisjICAgICAgICAgICAgICAgZWxzZSAvKiBQeV9CVUlMRF9DT1JFICovCisgICAgICAgIC8qIEJ1aWxkaW5nIGFuIGV4dGVuc2lvbiBtb2R1bGUsIG9yIGFuIGVtYmVkZGVkIHNpdHVhdGlvbiAqLworICAgICAgICAvKiBwdWJsaWMgUHl0aG9uIGZ1bmN0aW9ucyBhbmQgZGF0YSBhcmUgaW1wb3J0ZWQgKi8KKyAgICAgICAgLyogVW5kZXIgQ3lnd2luLCBhdXRvLWltcG9ydCBmdW5jdGlvbnMgdG8gcHJldmVudCBjb21waWxhdGlvbiAqLworICAgICAgICAvKiBmYWlsdXJlcyBzaW1pbGFyIHRvIHRob3NlIGRlc2NyaWJlZCBhdCB0aGUgYm90dG9tIG9mIDQuMTogKi8KKyAgICAgICAgLyogaHR0cDovL2RvY3MucHl0aG9uLm9yZy9leHRlbmRpbmcvd2luZG93cy5odG1sI2EtY29va2Jvb2stYXBwcm9hY2ggKi8KKyMgICAgICAgICAgICAgICAgICAgICAgIGlmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgX19kZWNsc3BlYyhkbGxpbXBvcnQpIFJUWVBFCisjICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9GVU5DKFJUWVBFKSBSVFlQRQorIyAgICAgICAgICAgICAgICAgICAgICAgZW5kaWYgLyogIV9fQ1lHV0lOX18gICFfX01JTkdXMzJfXyAqLworICAgICAgICAgICAgLyogTk9URTogVGhlIGlzc3VlMzk0NSAiY29tcGlsZSBlcnJvciBpbiBfZmlsZWlvLmMgKGN5Z3dpbikiCisgICAgICAgICAgICAgKiB3YXMgcmVzb2x2ZWQgd2l0aCBtb2RpZmljYXRpb24gb2YgY29kZS4KKyAgICAgICAgICAgICAqIFRoaXMgaXNzdWUgd2FzIHJlc29sdmVkIGZvciBnY2MobWluZ3cpIHdpdGggZW5hYmxpbmcgYXV0bworICAgICAgICAgICAgICogaW1wb3J0IGZlYXR1cmUuIFNpbmNlIF9maWxlaW8uYyBwcm9ibGVtIG5vdyBkaXNhcHBlYXIgdGhlcmUKKyAgICAgICAgICAgICAqIGlzIG5vIG1vcmUgcmVhc29ucyB0byBhdm9pZCBkbGxpbXBvcnQgZm9yIGdjYyhtaW5ndykuCisgICAgICAgICAgICAgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gX19kZWNsc3BlYyhkbGxpbXBvcnQpIFJUWVBFCisgICAgICAgIC8qIG1vZHVsZSBpbml0IGZ1bmN0aW9ucyBvdXRzaWRlIHRoZSBjb3JlIG11c3QgYmUgZXhwb3J0ZWQgKi8KKyMgICAgICAgICAgICAgICAgICAgICAgIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSB2b2lkCisjICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIF9fY3BsdXNwbHVzICovCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgdm9pZAorIyAgICAgICAgICAgICAgICAgICAgICAgZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKyMgICAgICAgICAgICAgICBlbmRpZiAvKiBQeV9CVUlMRF9DT1JFICovCisjICAgICAgIGVuZGlmIC8qIEhBVkVfREVDTFNQRUMgKi8KKyNlbmRpZiAvKiBQeV9FTkFCTEVfU0hBUkVEICovCisKKy8qIElmIG5vIGV4dGVybmFsIGxpbmthZ2UgbWFjcm9zIGRlZmluZWQgYnkgbm93LCBjcmVhdGUgZGVmYXVsdHMgKi8KKyNpZm5kZWYgUHlBUElfRlVOQworIyAgICAgICBkZWZpbmUgUHlBUElfRlVOQyhSVFlQRSkgUlRZUEUKKyNlbmRpZgorI2lmbmRlZiBQeUFQSV9EQVRBCisjICAgICAgIGRlZmluZSBQeUFQSV9EQVRBKFJUWVBFKSBleHRlcm4gUlRZUEUKKyNlbmRpZgorI2lmbmRlZiBQeU1PRElOSVRfRlVOQworIyAgICAgICBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyBleHRlcm4gIkMiIHZvaWQKKyMgICAgICAgZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworIyAgICAgICAgICAgICAgIGRlZmluZSBQeU1PRElOSVRfRlVOQyB2b2lkCisjICAgICAgIGVuZGlmIC8qIF9fY3BsdXNwbHVzICovCisjZW5kaWYKKworLyogRGVwcmVjYXRlZCBETF9JTVBPUlQgYW5kIERMX0VYUE9SVCBtYWNyb3MgKi8KKyNpZiBkZWZpbmVkKFB5X0VOQUJMRV9TSEFSRUQpICYmIGRlZmluZWQgKEhBVkVfREVDTFNQRUNfRExMKQorIyAgICAgICBpZiBkZWZpbmVkKFB5X0JVSUxEX0NPUkUpCisjICAgICAgICAgICAgICAgZGVmaW5lIERMX0lNUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisjICAgICAgICAgICAgICAgZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgX19kZWNsc3BlYyhkbGxleHBvcnQpIFJUWVBFCisjICAgICAgIGVsc2UKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfSU1QT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGltcG9ydCkgUlRZUEUKKyMgICAgICAgICAgICAgICBkZWZpbmUgRExfRVhQT1JUKFJUWVBFKSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgUlRZUEUKKyMgICAgICAgZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBETF9FWFBPUlQKKyMgICAgICAgZGVmaW5lIERMX0VYUE9SVChSVFlQRSkgUlRZUEUKKyNlbmRpZgorI2lmbmRlZiBETF9JTVBPUlQKKyMgICAgICAgZGVmaW5lIERMX0lNUE9SVChSVFlQRSkgUlRZUEUKKyNlbmRpZgorLyogRW5kIG9mIGRlcHJlY2F0ZWQgRExfKiBtYWNyb3MgKi8KKworLyogSWYgdGhlIGZkIG1hbmlwdWxhdGlvbiBtYWNyb3MgYXJlbid0IGRlZmluZWQsCisgICBoZXJlIGlzIGEgc2V0IHRoYXQgc2hvdWxkIGRvIHRoZSBqb2IgKi8KKworI2lmIDAgLyogZGlzYWJsZWQgYW5kIHByb2JhYmx5IG9ic29sZXRlICovCisKKyNpZm5kZWYgRkRfU0VUU0laRQorI2RlZmluZSBGRF9TRVRTSVpFICAgICAgMjU2CisjZW5kaWYKKworI2lmbmRlZiBGRF9TRVQKKwordHlwZWRlZiBsb25nIGZkX21hc2s7CisKKyNkZWZpbmUgTkZEQklUUyAoc2l6ZW9mKGZkX21hc2spICogTkJCWSkgICAgICAgIC8qIGJpdHMgcGVyIG1hc2sgKi8KKyNpZm5kZWYgaG93bWFueQorI2RlZmluZSBob3dtYW55KHgsIHkpICAgKCgoeCkrKCh5KS0xKSkvKHkpKQorI2VuZGlmIC8qIGhvd21hbnkgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZmRfc2V0IHsKKyAgICBmZF9tYXNrICAgICBmZHNfYml0c1tob3dtYW55KEZEX1NFVFNJWkUsIE5GREJJVFMpXTsKK30gZmRfc2V0OworCisjZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNkZWZpbmUgRkRfQ0xSKG4sIHApICAgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmPSB+KDEgPDwgKChuKSAlIE5GREJJVFMpKSkKKyNkZWZpbmUgRkRfSVNTRVQobiwgcCkgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmICgxIDw8ICgobikgJSBORkRCSVRTKSkpCisjZGVmaW5lIEZEX1pFUk8ocCkgICAgICBtZW1zZXQoKGNoYXIgKikocCksICdcMCcsIHNpemVvZigqKHApKSkKKworI2VuZGlmIC8qIEZEX1NFVCAqLworCisjZW5kaWYgLyogZmQgbWFuaXB1bGF0aW9uIG1hY3JvcyAqLworCisKKy8qIGxpbWl0cy5oIGNvbnN0YW50cyB0aGF0IG1heSBiZSBtaXNzaW5nICovCisKKyNpZm5kZWYgSU5UX01BWAorI2RlZmluZSBJTlRfTUFYIDIxNDc0ODM2NDcKKyNlbmRpZgorCisjaWZuZGVmIExPTkdfTUFYCisjaWYgU0laRU9GX0xPTkcgPT0gNAorI2RlZmluZSBMT05HX01BWCAwWDdGRkZGRkZGTAorI2VsaWYgU0laRU9GX0xPTkcgPT0gOAorI2RlZmluZSBMT05HX01BWCAwWDdGRkZGRkZGRkZGRkZGRkZMCisjZWxzZQorI2Vycm9yICJjb3VsZCBub3Qgc2V0IExPTkdfTUFYIGluIHB5cG9ydC5oIgorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBMT05HX01JTgorI2RlZmluZSBMT05HX01JTiAoLUxPTkdfTUFYLTEpCisjZW5kaWYKKworI2lmbmRlZiBMT05HX0JJVAorI2RlZmluZSBMT05HX0JJVCAoOCAqIFNJWkVPRl9MT05HKQorI2VuZGlmCisKKyNpZiBMT05HX0JJVCAhPSA4ICogU0laRU9GX0xPTkcKKy8qIDA0LU9jdC0yMDAwIExPTkdfQklUIGlzIGFwcGFyZW50bHkgKG1pcylkZWZpbmVkIGFzIDY0IG9uIHNvbWUgcmVjZW50CisgKiAzMi1iaXQgcGxhdGZvcm1zIHVzaW5nIGdjYy4gIFdlIHRyeSB0byBjYXRjaCB0aGF0IGhlcmUgYXQgY29tcGlsZS10aW1lCisgKiByYXRoZXIgdGhhbiB3YWl0aW5nIGZvciBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uIHRvIHRyaWdnZXIgYm9ndXMKKyAqIG92ZXJmbG93cy4KKyAqLworI2Vycm9yICJMT05HX0JJVCBkZWZpbml0aW9uIGFwcGVhcnMgd3JvbmcgZm9yIHBsYXRmb3JtIChiYWQgZ2NjL2dsaWJjIGNvbmZpZz8pLiIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvKgorICogSGlkZSBHQ0MgYXR0cmlidXRlcyBmcm9tIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgdGhlbS4KKyAqLworI2lmICghZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPCAyIHx8IFwKKyAgICAgKF9fR05VQ19fID09IDIgJiYgX19HTlVDX01JTk9SX18gPCA3KSApICYmIFwKKyAgICAhZGVmaW5lZChSSVNDT1MpCisjZGVmaW5lIFB5X0dDQ19BVFRSSUJVVEUoeCkKKyNlbHNlCisjZGVmaW5lIFB5X0dDQ19BVFRSSUJVVEUoeCkgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmCisKKy8qCisgKiBBZGQgUHlBcmdfUGFyc2VUdXBsZSBmb3JtYXQgd2hlcmUgYXZhaWxhYmxlLgorICovCisjaWZkZWYgSEFWRV9BVFRSSUJVVEVfRk9STUFUX1BBUlNFVFVQTEUKKyNkZWZpbmUgUHlfRk9STUFUX1BBUlNFVFVQTEUoZnVuYyxwMSxwMikgX19hdHRyaWJ1dGVfXygoZm9ybWF0KGZ1bmMscDEscDIpKSkKKyNlbHNlCisjZGVmaW5lIFB5X0ZPUk1BVF9QQVJTRVRVUExFKGZ1bmMscDEscDIpCisjZW5kaWYKKworLyoKKyAqIFNwZWNpZnkgYWxpZ25tZW50IG9uIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgaXQuCisgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAzCisjZGVmaW5lIFB5X0FMSUdORUQoeCkgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCh4KSkpCisjZWxzZQorI2RlZmluZSBQeV9BTElHTkVEKHgpCisjZW5kaWYKKworLyogRWxpbWluYXRlIGVuZC1vZi1sb29wIGNvZGUgbm90IHJlYWNoZWQgd2FybmluZ3MgZnJvbSBTdW5Qcm8gQworICogd2hlbiB1c2luZyBkb3suLi59d2hpbGUoMCkgbWFjcm9zCisgKi8KKyNpZmRlZiBfX1NVTlBST19DCisjcHJhZ21hIGVycm9yX21lc3NhZ2VzIChvZmYsRV9FTkRfT0ZfTE9PUF9DT0RFX05PVF9SRUFDSEVEKQorI2VuZGlmCisKKy8qCisgKiBPbGRlciBNaWNyb3NvZnQgY29tcGlsZXJzIGRvbid0IHN1cHBvcnQgdGhlIEM5OSBsb25nIGxvbmcgbGl0ZXJhbCBzdWZmaXhlcywKKyAqIHNvIHRoZXNlIHdpbGwgYmUgZGVmaW5lZCBpbiBQQy9weWNvbmZpZy5oIGZvciB0aG9zZSBjb21waWxlcnMuCisgKi8KKyNpZm5kZWYgUHlfTEwKKyNkZWZpbmUgUHlfTEwoeCkgeCMjTEwKKyNlbmRpZgorCisjaWZuZGVmIFB5X1VMTAorI2RlZmluZSBQeV9VTEwoeCkgUHlfTEwoeCMjVSkKKyNlbmRpZgorCisjZW5kaWYgLyogUHlfUFlQT1JUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3B5c3RhdGUuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3B5c3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNmYzMwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlzdGF0ZS5oCkBAIC0wLDAgKzEsMjAwIEBACisKKy8qIFRocmVhZCBhbmQgaW50ZXJwcmV0ZXIgc3RhdGUgc3RydWN0dXJlcyBhbmQgdGhlaXIgaW50ZXJmYWNlcyAqLworCisKKyNpZm5kZWYgUHlfUFlTVEFURV9ICisjZGVmaW5lIFB5X1BZU1RBVEVfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBTdGF0ZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzICovCisKK3N0cnVjdCBfdHM7IC8qIEZvcndhcmQgKi8KK3N0cnVjdCBfaXM7IC8qIEZvcndhcmQgKi8KKwordHlwZWRlZiBzdHJ1Y3QgX2lzIHsKKworICAgIHN0cnVjdCBfaXMgKm5leHQ7CisgICAgc3RydWN0IF90cyAqdHN0YXRlX2hlYWQ7CisKKyAgICBQeU9iamVjdCAqbW9kdWxlczsKKyAgICBQeU9iamVjdCAqc3lzZGljdDsKKyAgICBQeU9iamVjdCAqYnVpbHRpbnM7CisgICAgUHlPYmplY3QgKm1vZHVsZXNfcmVsb2FkaW5nOworCisgICAgUHlPYmplY3QgKmNvZGVjX3NlYXJjaF9wYXRoOworICAgIFB5T2JqZWN0ICpjb2RlY19zZWFyY2hfY2FjaGU7CisgICAgUHlPYmplY3QgKmNvZGVjX2Vycm9yX3JlZ2lzdHJ5OworCisjaWZkZWYgSEFWRV9ETE9QRU4KKyAgICBpbnQgZGxvcGVuZmxhZ3M7CisjZW5kaWYKKyNpZmRlZiBXSVRIX1RTQworICAgIGludCB0c2NkdW1wOworI2VuZGlmCisKK30gUHlJbnRlcnByZXRlclN0YXRlOworCisKKy8qIFN0YXRlIHVuaXF1ZSBwZXIgdGhyZWFkICovCisKK3N0cnVjdCBfZnJhbWU7IC8qIEF2b2lkIGluY2x1ZGluZyBmcmFtZW9iamVjdC5oICovCisKKy8qIFB5X3RyYWNlZnVuYyByZXR1cm4gLTEgd2hlbiByYWlzaW5nIGFuIGV4Y2VwdGlvbiwgb3IgMCBmb3Igc3VjY2Vzcy4gKi8KK3R5cGVkZWYgaW50ICgqUHlfdHJhY2VmdW5jKShQeU9iamVjdCAqLCBzdHJ1Y3QgX2ZyYW1lICosIGludCwgUHlPYmplY3QgKik7CisKKy8qIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSB1c2VkIGZvciAnd2hhdCcgZm9yIHRyYWNlZnVuYyBmdW5jdGlvbnM6ICovCisjZGVmaW5lIFB5VHJhY2VfQ0FMTCAwCisjZGVmaW5lIFB5VHJhY2VfRVhDRVBUSU9OIDEKKyNkZWZpbmUgUHlUcmFjZV9MSU5FIDIKKyNkZWZpbmUgUHlUcmFjZV9SRVRVUk4gMworI2RlZmluZSBQeVRyYWNlX0NfQ0FMTCA0CisjZGVmaW5lIFB5VHJhY2VfQ19FWENFUFRJT04gNQorI2RlZmluZSBQeVRyYWNlX0NfUkVUVVJOIDYKKwordHlwZWRlZiBzdHJ1Y3QgX3RzIHsKKyAgICAvKiBTZWUgUHl0aG9uL2NldmFsLmMgZm9yIGNvbW1lbnRzIGV4cGxhaW5pbmcgbW9zdCBmaWVsZHMgKi8KKworICAgIHN0cnVjdCBfdHMgKm5leHQ7CisgICAgUHlJbnRlcnByZXRlclN0YXRlICppbnRlcnA7CisKKyAgICBzdHJ1Y3QgX2ZyYW1lICpmcmFtZTsKKyAgICBpbnQgcmVjdXJzaW9uX2RlcHRoOworICAgIC8qICd0cmFjaW5nJyBrZWVwcyB0cmFjayBvZiB0aGUgZXhlY3V0aW9uIGRlcHRoIHdoZW4gdHJhY2luZy9wcm9maWxpbmcuCisgICAgICAgVGhpcyBpcyB0byBwcmV2ZW50IHRoZSBhY3R1YWwgdHJhY2UvcHJvZmlsZSBjb2RlIGZyb20gYmVpbmcgcmVjb3JkZWQgaW4KKyAgICAgICB0aGUgdHJhY2UvcHJvZmlsZS4gKi8KKyAgICBpbnQgdHJhY2luZzsKKyAgICBpbnQgdXNlX3RyYWNpbmc7CisKKyAgICBQeV90cmFjZWZ1bmMgY19wcm9maWxlZnVuYzsKKyAgICBQeV90cmFjZWZ1bmMgY190cmFjZWZ1bmM7CisgICAgUHlPYmplY3QgKmNfcHJvZmlsZW9iajsKKyAgICBQeU9iamVjdCAqY190cmFjZW9iajsKKworICAgIFB5T2JqZWN0ICpjdXJleGNfdHlwZTsKKyAgICBQeU9iamVjdCAqY3VyZXhjX3ZhbHVlOworICAgIFB5T2JqZWN0ICpjdXJleGNfdHJhY2ViYWNrOworCisgICAgUHlPYmplY3QgKmV4Y190eXBlOworICAgIFB5T2JqZWN0ICpleGNfdmFsdWU7CisgICAgUHlPYmplY3QgKmV4Y190cmFjZWJhY2s7CisKKyAgICBQeU9iamVjdCAqZGljdDsgIC8qIFN0b3JlcyBwZXItdGhyZWFkIHN0YXRlICovCisKKyAgICAvKiB0aWNrX2NvdW50ZXIgaXMgaW5jcmVtZW50ZWQgd2hlbmV2ZXIgdGhlIGNoZWNrX2ludGVydmFsIHRpY2tlcgorICAgICAqIHJlYWNoZXMgemVyby4gVGhlIHB1cnBvc2UgaXMgdG8gZ2l2ZSBhIHVzZWZ1bCBtZWFzdXJlIG9mIHRoZSBudW1iZXIKKyAgICAgKiBvZiBpbnRlcnByZXRlZCBieXRlY29kZSBpbnN0cnVjdGlvbnMgaW4gYSBnaXZlbiB0aHJlYWQuICBUaGlzCisgICAgICogZXh0cmVtZWx5IGxpZ2h0d2VpZ2h0IHN0YXRpc3RpYyBjb2xsZWN0b3IgbWF5IGJlIG9mIGludGVyZXN0IHRvCisgICAgICogcHJvZmlsZXJzIChsaWtlIHBzeWNvLmppdCgpKSwgYWx0aG91Z2ggbm90aGluZyBpbiB0aGUgY29yZSB1c2VzIGl0LgorICAgICAqLworICAgIGludCB0aWNrX2NvdW50ZXI7CisKKyAgICBpbnQgZ2lsc3RhdGVfY291bnRlcjsKKworICAgIFB5T2JqZWN0ICphc3luY19leGM7IC8qIEFzeW5jaHJvbm91cyBleGNlcHRpb24gdG8gcmFpc2UgKi8KKyAgICBsb25nIHRocmVhZF9pZDsgLyogVGhyZWFkIGlkIHdoZXJlIHRoaXMgdHN0YXRlIHdhcyBjcmVhdGVkICovCisKKyAgICBpbnQgdHJhc2hfZGVsZXRlX25lc3Rpbmc7CisgICAgUHlPYmplY3QgKnRyYXNoX2RlbGV0ZV9sYXRlcjsKKworICAgIC8qIFhYWCBzaWduYWwgaGFuZGxlcnMgc2hvdWxkIGFsc28gYmUgaGVyZSAqLworCit9IFB5VGhyZWFkU3RhdGU7CisKKworUHlBUElfRlVOQyhQeUludGVycHJldGVyU3RhdGUgKikgUHlJbnRlcnByZXRlclN0YXRlX05ldyh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlJbnRlcnByZXRlclN0YXRlX0NsZWFyKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlJbnRlcnByZXRlclN0YXRlX0RlbGV0ZShQeUludGVycHJldGVyU3RhdGUgKik7CisKK1B5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeVRocmVhZFN0YXRlX05ldyhQeUludGVycHJldGVyU3RhdGUgKik7CitQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgX1B5VGhyZWFkU3RhdGVfUHJlYWxsb2MoUHlJbnRlcnByZXRlclN0YXRlICopOworUHlBUElfRlVOQyh2b2lkKSBfUHlUaHJlYWRTdGF0ZV9Jbml0KFB5VGhyZWFkU3RhdGUgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkU3RhdGVfQ2xlYXIoUHlUaHJlYWRTdGF0ZSAqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRTdGF0ZV9EZWxldGUoUHlUaHJlYWRTdGF0ZSAqKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAorUHlBUElfRlVOQyh2b2lkKSBQeVRocmVhZFN0YXRlX0RlbGV0ZUN1cnJlbnQodm9pZCk7CisjZW5kaWYKKworUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5VGhyZWFkU3RhdGVfR2V0KHZvaWQpOworUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5VGhyZWFkU3RhdGVfU3dhcChQeVRocmVhZFN0YXRlICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVRocmVhZFN0YXRlX0dldERpY3Qodm9pZCk7CitQeUFQSV9GVU5DKGludCkgUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4Yyhsb25nLCBQeU9iamVjdCAqKTsKKworCisvKiBWYXJpYWJsZSBhbmQgbWFjcm8gZm9yIGluLWxpbmUgYWNjZXNzIHRvIGN1cnJlbnQgdGhyZWFkIHN0YXRlICovCisKK1B5QVBJX0RBVEEoUHlUaHJlYWRTdGF0ZSAqKSBfUHlUaHJlYWRTdGF0ZV9DdXJyZW50OworCisjaWZkZWYgUHlfREVCVUcKKyNkZWZpbmUgUHlUaHJlYWRTdGF0ZV9HRVQoKSBQeVRocmVhZFN0YXRlX0dldCgpCisjZWxzZQorI2RlZmluZSBQeVRocmVhZFN0YXRlX0dFVCgpIChfUHlUaHJlYWRTdGF0ZV9DdXJyZW50KQorI2VuZGlmCisKK3R5cGVkZWYKKyAgICBlbnVtIHtQeUdJTFN0YXRlX0xPQ0tFRCwgUHlHSUxTdGF0ZV9VTkxPQ0tFRH0KKyAgICAgICAgUHlHSUxTdGF0ZV9TVEFURTsKKworLyogRW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIHJlYWR5IHRvIGNhbGwgdGhlIFB5dGhvbgorICAgQyBBUEksIHJlZ2FyZGxlc3Mgb2YgdGhlIGN1cnJlbnQgc3RhdGUgb2YgUHl0aG9uLCBvciBvZiBpdHMKKyAgIHRocmVhZCBsb2NrLiAgVGhpcyBtYXkgYmUgY2FsbGVkIGFzIG1hbnkgdGltZXMgYXMgZGVzaXJlZAorICAgYnkgYSB0aHJlYWQgc28gbG9uZyBhcyBlYWNoIGNhbGwgaXMgbWF0Y2hlZCB3aXRoIGEgY2FsbCB0bworICAgUHlHSUxTdGF0ZV9SZWxlYXNlKCkuICBJbiBnZW5lcmFsLCBvdGhlciB0aHJlYWQtc3RhdGUgQVBJcyBtYXkKKyAgIGJlIHVzZWQgYmV0d2VlbiBfRW5zdXJlKCkgYW5kIF9SZWxlYXNlKCkgY2FsbHMsIHNvIGxvbmcgYXMgdGhlCisgICB0aHJlYWQtc3RhdGUgaXMgcmVzdG9yZWQgdG8gaXRzIHByZXZpb3VzIHN0YXRlIGJlZm9yZSB0aGUgUmVsZWFzZSgpLgorICAgRm9yIGV4YW1wbGUsIG5vcm1hbCB1c2Ugb2YgdGhlIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMvCisgICBQeV9FTkRfQUxMT1dfVEhSRUFEUyBtYWNyb3MgYXJlIGFjY2VwdGFibGUuCisKKyAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gb3BhcXVlICJoYW5kbGUiIHRvIHRoZSB0aHJlYWQgc3RhdGUgd2hlbgorICAgUHlHSUxTdGF0ZV9FbnN1cmUoKSB3YXMgY2FsbGVkLCBhbmQgbXVzdCBiZSBwYXNzZWQgdG8KKyAgIFB5R0lMU3RhdGVfUmVsZWFzZSgpIHRvIGVuc3VyZSBQeXRob24gaXMgbGVmdCBpbiB0aGUgc2FtZSBzdGF0ZS4gRXZlbgorICAgdGhvdWdoIHJlY3Vyc2l2ZSBjYWxscyBhcmUgYWxsb3dlZCwgdGhlc2UgaGFuZGxlcyBjYW4gKm5vdCogYmUgc2hhcmVkIC0KKyAgIGVhY2ggdW5pcXVlIGNhbGwgdG8gUHlHSUxTdGF0ZV9FbnN1cmUgbXVzdCBzYXZlIHRoZSBoYW5kbGUgZm9yIGl0cworICAgY2FsbCB0byBQeUdJTFN0YXRlX1JlbGVhc2UuCisKKyAgIFdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMsIHRoZSBjdXJyZW50IHRocmVhZCB3aWxsIGhvbGQgdGhlIEdJTC4KKworICAgRmFpbHVyZSBpcyBhIGZhdGFsIGVycm9yLgorKi8KK1B5QVBJX0ZVTkMoUHlHSUxTdGF0ZV9TVEFURSkgUHlHSUxTdGF0ZV9FbnN1cmUodm9pZCk7CisKKy8qIFJlbGVhc2UgYW55IHJlc291cmNlcyBwcmV2aW91c2x5IGFjcXVpcmVkLiAgQWZ0ZXIgdGhpcyBjYWxsLCBQeXRob24ncworICAgc3RhdGUgd2lsbCBiZSB0aGUgc2FtZSBhcyBpdCB3YXMgcHJpb3IgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgIFB5R0lMU3RhdGVfRW5zdXJlKCkgY2FsbCAoYnV0IGdlbmVyYWxseSB0aGlzIHN0YXRlIHdpbGwgYmUgdW5rbm93biB0bworICAgdGhlIGNhbGxlciwgaGVuY2UgdGhlIHVzZSBvZiB0aGUgR0lMU3RhdGUgQVBJLikKKworICAgRXZlcnkgY2FsbCB0byBQeUdJTFN0YXRlX0Vuc3VyZSBtdXN0IGJlIG1hdGNoZWQgYnkgYSBjYWxsIHRvCisgICBQeUdJTFN0YXRlX1JlbGVhc2Ugb24gdGhlIHNhbWUgdGhyZWFkLgorKi8KK1B5QVBJX0ZVTkModm9pZCkgUHlHSUxTdGF0ZV9SZWxlYXNlKFB5R0lMU3RhdGVfU1RBVEUpOworCisvKiBIZWxwZXIvZGlhZ25vc3RpYyBmdW5jdGlvbiAtIGdldCB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGUgZm9yCisgICB0aGlzIHRocmVhZC4gIE1heSByZXR1cm4gTlVMTCBpZiBubyBHSUxTdGF0ZSBBUEkgaGFzIGJlZW4gdXNlZAorICAgb24gdGhlIGN1cnJlbnQgdGhyZWFkLiAgTm90ZSB0aGF0IHRoZSBtYWluIHRocmVhZCBhbHdheXMgaGFzIHN1Y2ggYQorICAgdGhyZWFkLXN0YXRlLCBldmVuIGlmIG5vIGF1dG8tdGhyZWFkLXN0YXRlIGNhbGwgaGFzIGJlZW4gbWFkZQorICAgb24gdGhlIG1haW4gdGhyZWFkLgorKi8KK1B5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeUdJTFN0YXRlX0dldFRoaXNUaHJlYWRTdGF0ZSh2b2lkKTsKKworLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHN5cy5fY3VycmVudF9mcmFtZXMoKSAgUmV0dXJucyBhIGRpY3QgbWFwcGluZworICAgdGhyZWFkIGlkIHRvIHRoYXQgdGhyZWFkJ3MgY3VycmVudCBmcmFtZS4KKyovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVRocmVhZF9DdXJyZW50RnJhbWVzKHZvaWQpOworCisvKiBSb3V0aW5lcyBmb3IgYWR2YW5jZWQgZGVidWdnZXJzLCByZXF1ZXN0ZWQgYnkgRGF2aWQgQmVhemxleS4KKyAgIERvbid0IHVzZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nISAqLworUHlBUElfRlVOQyhQeUludGVycHJldGVyU3RhdGUgKikgUHlJbnRlcnByZXRlclN0YXRlX0hlYWQodm9pZCk7CitQeUFQSV9GVU5DKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKSBQeUludGVycHJldGVyU3RhdGVfTmV4dChQeUludGVycHJldGVyU3RhdGUgKik7CitQeUFQSV9GVU5DKFB5VGhyZWFkU3RhdGUgKikgUHlJbnRlcnByZXRlclN0YXRlX1RocmVhZEhlYWQoUHlJbnRlcnByZXRlclN0YXRlICopOworUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5VGhyZWFkU3RhdGVfTmV4dChQeVRocmVhZFN0YXRlICopOworCit0eXBlZGVmIHN0cnVjdCBfZnJhbWUgKigqUHlUaHJlYWRGcmFtZUdldHRlcikoUHlUaHJlYWRTdGF0ZSAqc2VsZl8pOworCisvKiBob29rIGZvciBQeUV2YWxfR2V0RnJhbWUoKSwgcmVxdWVzdGVkIGZvciBQc3ljbyAqLworUHlBUElfREFUQShQeVRocmVhZEZyYW1lR2V0dGVyKSBfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfUFlTVEFURV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weXN0cmNtcC5oIGIvaW5jbHVkZS9weXRob24yLjcvcHlzdHJjbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjljN2U3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlzdHJjbXAuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIFB5X1NUUkNNUF9ICisjZGVmaW5lIFB5X1NUUkNNUF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfRlVOQyhpbnQpIFB5T1NfbXlzdHJuaWNtcChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlPU19teXN0cmljbXAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisjaWYgZGVmaW5lZChNU19XSU5ET1dTKSB8fCBkZWZpbmVkKFBZT1NfT1MyKQorI2RlZmluZSBQeU9TX3N0cm5pY21wIHN0cm5pY21wCisjZGVmaW5lIFB5T1Nfc3RyaWNtcCBzdHJpY21wCisjZWxzZQorI2RlZmluZSBQeU9TX3N0cm5pY21wIFB5T1NfbXlzdHJuaWNtcAorI2RlZmluZSBQeU9TX3N0cmljbXAgUHlPU19teXN0cmljbXAKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIVB5X1NUUkNNUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weXN0cnRvZC5oIGIvaW5jbHVkZS9weXRob24yLjcvcHlzdHJ0b2QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWM0MzRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHlzdHJ0b2QuaApAQCAtMCwwICsxLDQ1IEBACisjaWZuZGVmIFB5X1NUUlRPRF9ICisjZGVmaW5lIFB5X1NUUlRPRF9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitQeUFQSV9GVU5DKGRvdWJsZSkgUHlPU19hc2NpaV9zdHJ0b2QoY29uc3QgY2hhciAqc3RyLCBjaGFyICoqcHRyKTsKK1B5QVBJX0ZVTkMoZG91YmxlKSBQeU9TX2FzY2lpX2F0b2YoY29uc3QgY2hhciAqc3RyKTsKKworLyogRGVwcmVjYXRlZCBpbiAyLjcgYW5kIDMuMS4gV2lsbCBkaXNhcHBlYXIgaW4gMi44IChpZiBpdCBleGlzdHMpIGFuZCAzLjIgKi8KK1B5QVBJX0ZVTkMoY2hhciAqKSBQeU9TX2FzY2lpX2Zvcm1hdGQoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZm9ybWF0LCBkb3VibGUgZCk7CitQeUFQSV9GVU5DKGRvdWJsZSkgUHlPU19zdHJpbmdfdG9fZG91YmxlKGNvbnN0IGNoYXIgKnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmVuZHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKm92ZXJmbG93X2V4Y2VwdGlvbik7CisKKy8qIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgUHlNZW1fRnJlZSB0byBmcmVlIHRoZSBidWZmZXIKKyAgIHRoYXQncyBpcyByZXR1cm5lZC4gKi8KK1B5QVBJX0ZVTkMoY2hhciAqKSBQeU9TX2RvdWJsZV90b19zdHJpbmcoZG91YmxlIHZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBmb3JtYXRfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZWNpc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnR5cGUpOworCitQeUFQSV9GVU5DKGRvdWJsZSkgX1B5X3BhcnNlX2luZl9vcl9uYW4oY29uc3QgY2hhciAqcCwgY2hhciAqKmVuZHB0cik7CisKKworLyogUHlPU19kb3VibGVfdG9fc3RyaW5nJ3MgImZsYWdzIiBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0byAwIG9yIG1vcmUgb2Y6ICovCisjZGVmaW5lIFB5X0RUU0ZfU0lHTiAgICAgIDB4MDEgLyogYWx3YXlzIGFkZCB0aGUgc2lnbiAqLworI2RlZmluZSBQeV9EVFNGX0FERF9ET1RfMCAweDAyIC8qIGlmIHRoZSByZXN1bHQgaXMgYW4gaW50ZWdlciBhZGQgIi4wIiAqLworI2RlZmluZSBQeV9EVFNGX0FMVCAgICAgICAweDA0IC8qICJhbHRlcm5hdGUiIGZvcm1hdHRpbmcuIGl0J3MgZm9ybWF0X2NvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyAqLworCisvKiBQeU9TX2RvdWJsZV90b19zdHJpbmcncyAidHlwZSIsIGlmIG5vbi1OVUxMLCB3aWxsIGJlIHNldCB0byBvbmUgb2Y6ICovCisjZGVmaW5lIFB5X0RUU1RfRklOSVRFIDAKKyNkZWZpbmUgUHlfRFRTVF9JTkZJTklURSAxCisjZGVmaW5lIFB5X0RUU1RfTkFOIDIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qICFQeV9TVFJUT0RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvcHl0aG9ucnVuLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9weXRob25ydW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmZjMTc1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHl0aG9ucnVuLmgKQEAgLTAsMCArMSwxODEgQEAKKworLyogSW50ZXJmYWNlcyB0byBwYXJzZSBhbmQgZXhlY3V0ZSBwaWVjZXMgb2YgcHl0aG9uIGNvZGUgKi8KKworI2lmbmRlZiBQeV9QWVRIT05SVU5fSAorI2RlZmluZSBQeV9QWVRIT05SVU5fSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFB5Q0ZfTUFTSyAoQ09fRlVUVVJFX0RJVklTSU9OIHwgQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCB8IFwKKyAgICAgICAgICAgICAgICAgICBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQgfCBDT19GVVRVUkVfUFJJTlRfRlVOQ1RJT04gfCBcCisgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFMpCisjZGVmaW5lIFB5Q0ZfTUFTS19PQlNPTEVURSAoQ09fTkVTVEVEKQorI2RlZmluZSBQeUNGX1NPVVJDRV9JU19VVEY4ICAweDAxMDAKKyNkZWZpbmUgUHlDRl9ET05UX0lNUExZX0RFREVOVCAweDAyMDAKKyNkZWZpbmUgUHlDRl9PTkxZX0FTVCAweDA0MDAKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBjZl9mbGFnczsgIC8qIGJpdG1hc2sgb2YgQ09feHh4IGZsYWdzIHJlbGV2YW50IHRvIGZ1dHVyZSAqLworfSBQeUNvbXBpbGVyRmxhZ3M7CisKK1B5QVBJX0ZVTkModm9pZCkgUHlfU2V0UHJvZ3JhbU5hbWUoY2hhciAqKTsKK1B5QVBJX0ZVTkMoY2hhciAqKSBQeV9HZXRQcm9ncmFtTmFtZSh2b2lkKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeV9TZXRQeXRob25Ib21lKGNoYXIgKik7CitQeUFQSV9GVU5DKGNoYXIgKikgUHlfR2V0UHl0aG9uSG9tZSh2b2lkKTsKKworUHlBUElfRlVOQyh2b2lkKSBQeV9Jbml0aWFsaXplKHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBQeV9Jbml0aWFsaXplRXgoaW50KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlfRmluYWxpemUodm9pZCk7CitQeUFQSV9GVU5DKGludCkgUHlfSXNJbml0aWFsaXplZCh2b2lkKTsKK1B5QVBJX0ZVTkMoUHlUaHJlYWRTdGF0ZSAqKSBQeV9OZXdJbnRlcnByZXRlcih2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlfRW5kSW50ZXJwcmV0ZXIoUHlUaHJlYWRTdGF0ZSAqKTsKKworUHlBUElfRlVOQyhpbnQpIFB5UnVuX0FueUZpbGVGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgUHlDb21waWxlckZsYWdzICopOworUHlBUElfRlVOQyhpbnQpIFB5UnVuX0FueUZpbGVFeEZsYWdzKEZJTEUgKiwgY29uc3QgY2hhciAqLCBpbnQsIFB5Q29tcGlsZXJGbGFncyAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncyhjb25zdCBjaGFyICosIFB5Q29tcGlsZXJGbGFncyAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgaW50LCBQeUNvbXBpbGVyRmxhZ3MgKik7CitQeUFQSV9GVU5DKGludCkgUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwgUHlDb21waWxlckZsYWdzICopOworUHlBUElfRlVOQyhpbnQpIFB5UnVuX0ludGVyYWN0aXZlTG9vcEZsYWdzKEZJTEUgKiwgY29uc3QgY2hhciAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CisKK1B5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbVN0cmluZyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIFB5Q29tcGlsZXJGbGFncyAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqKTsKK1B5QVBJX0ZVTkMoc3RydWN0IF9tb2QgKikgUHlQYXJzZXJfQVNURnJvbUZpbGUoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqLCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29tcGlsZXJGbGFncyAqLCBpbnQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlBcmVuYSAqKTsKKyNkZWZpbmUgUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmcoUywgQikgXAorICAgIFB5UGFyc2VyX1NpbXBsZVBhcnNlU3RyaW5nRmxhZ3MoUywgQiwgMCkKKyNkZWZpbmUgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlKEZQLCBTLCBCKSBcCisgICAgUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MoRlAsIFMsIEIsIDApCitQeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCk7CitQeUFQSV9GVU5DKHN0cnVjdCBfbm9kZSAqKSBQeVBhcnNlcl9TaW1wbGVQYXJzZUZpbGVGbGFncyhGSUxFICosIGNvbnN0IGNoYXIgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQpOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5UnVuX1N0cmluZ0ZsYWdzKGNvbnN0IGNoYXIgKiwgaW50LCBQeU9iamVjdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeUNvbXBpbGVyRmxhZ3MgKik7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlSdW5fRmlsZUV4RmxhZ3MoRklMRSAqLCBjb25zdCBjaGFyICosIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKiwgUHlPYmplY3QgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbXBpbGVyRmxhZ3MgKik7CisKKyNkZWZpbmUgUHlfQ29tcGlsZVN0cmluZyhzdHIsIHAsIHMpIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhzdHIsIHAsIHMsIE5VTEwpCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5X0NvbXBpbGVTdHJpbmdGbGFncyhjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDb21waWxlckZsYWdzICopOworUHlBUElfRlVOQyhzdHJ1Y3Qgc3ltdGFibGUgKikgUHlfU3ltdGFibGVTdHJpbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfUHJpbnQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RXJyX1ByaW50RXgoaW50KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlFcnJfRGlzcGxheShQeU9iamVjdCAqLCBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKKworUHlBUElfRlVOQyhpbnQpIFB5X0F0RXhpdCh2b2lkICgqZnVuYykodm9pZCkpOworCitQeUFQSV9GVU5DKHZvaWQpIFB5X0V4aXQoaW50KTsKKworUHlBUElfRlVOQyhpbnQpIFB5X0ZkSXNJbnRlcmFjdGl2ZShGSUxFICosIGNvbnN0IGNoYXIgKik7CisKKy8qIEJvb3RzdHJhcCAqLworUHlBUElfRlVOQyhpbnQpIFB5X01haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworLyogVXNlIG1hY3JvcyBmb3IgYSBidW5jaCBvZiBvbGQgdmFyaWFudHMgKi8KKyNkZWZpbmUgUHlSdW5fU3RyaW5nKHN0ciwgcywgZywgbCkgUHlSdW5fU3RyaW5nRmxhZ3Moc3RyLCBzLCBnLCBsLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9BbnlGaWxlKGZwLCBuYW1lKSBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgTlVMTCkKKyNkZWZpbmUgUHlSdW5fQW55RmlsZUV4KGZwLCBuYW1lLCBjbG9zZWl0KSBcCisgICAgUHlSdW5fQW55RmlsZUV4RmxhZ3MoZnAsIG5hbWUsIGNsb3NlaXQsIE5VTEwpCisjZGVmaW5lIFB5UnVuX0FueUZpbGVGbGFncyhmcCwgbmFtZSwgZmxhZ3MpIFwKKyAgICBQeVJ1bl9BbnlGaWxlRXhGbGFncyhmcCwgbmFtZSwgMCwgZmxhZ3MpCisjZGVmaW5lIFB5UnVuX1NpbXBsZVN0cmluZyhzKSBQeVJ1bl9TaW1wbGVTdHJpbmdGbGFncyhzLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9TaW1wbGVGaWxlKGYsIHApIFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKGYsIHAsIDAsIE5VTEwpCisjZGVmaW5lIFB5UnVuX1NpbXBsZUZpbGVFeChmLCBwLCBjKSBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyhmLCBwLCBjLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9JbnRlcmFjdGl2ZU9uZShmLCBwKSBQeVJ1bl9JbnRlcmFjdGl2ZU9uZUZsYWdzKGYsIHAsIE5VTEwpCisjZGVmaW5lIFB5UnVuX0ludGVyYWN0aXZlTG9vcChmLCBwKSBQeVJ1bl9JbnRlcmFjdGl2ZUxvb3BGbGFncyhmLCBwLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9GaWxlKGZwLCBwLCBzLCBnLCBsKSBcCisgICAgUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIE5VTEwpCisjZGVmaW5lIFB5UnVuX0ZpbGVFeChmcCwgcCwgcywgZywgbCwgYykgXAorICAgIFB5UnVuX0ZpbGVFeEZsYWdzKGZwLCBwLCBzLCBnLCBsLCBjLCBOVUxMKQorI2RlZmluZSBQeVJ1bl9GaWxlRmxhZ3MoZnAsIHAsIHMsIGcsIGwsIGZsYWdzKSBcCisgICAgUHlSdW5fRmlsZUV4RmxhZ3MoZnAsIHAsIHMsIGcsIGwsIDAsIGZsYWdzKQorCisvKiBJbiBnZXRwYXRoLmMgKi8KK1B5QVBJX0ZVTkMoY2hhciAqKSBQeV9HZXRQcm9ncmFtRnVsbFBhdGgodm9pZCk7CitQeUFQSV9GVU5DKGNoYXIgKikgUHlfR2V0UHJlZml4KHZvaWQpOworUHlBUElfRlVOQyhjaGFyICopIFB5X0dldEV4ZWNQcmVmaXgodm9pZCk7CitQeUFQSV9GVU5DKGNoYXIgKikgUHlfR2V0UGF0aCh2b2lkKTsKKworLyogSW4gdGhlaXIgb3duIGZpbGVzICovCitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlfR2V0VmVyc2lvbih2b2lkKTsKK1B5QVBJX0ZVTkMoY29uc3QgY2hhciAqKSBQeV9HZXRQbGF0Zm9ybSh2b2lkKTsKK1B5QVBJX0ZVTkMoY29uc3QgY2hhciAqKSBQeV9HZXRDb3B5cmlnaHQodm9pZCk7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlfR2V0Q29tcGlsZXIodm9pZCk7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgUHlfR2V0QnVpbGRJbmZvKHZvaWQpOworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIF9QeV9zdm52ZXJzaW9uKHZvaWQpOworUHlBUElfRlVOQyhjb25zdCBjaGFyICopIFB5X1N1YnZlcnNpb25SZXZpc2lvbih2b2lkKTsKK1B5QVBJX0ZVTkMoY29uc3QgY2hhciAqKSBQeV9TdWJ2ZXJzaW9uU2hvcnRCcmFuY2godm9pZCk7CitQeUFQSV9GVU5DKGNvbnN0IGNoYXIgKikgX1B5X2hnaWRlbnRpZmllcih2b2lkKTsKK1B5QVBJX0ZVTkMoY29uc3QgY2hhciAqKSBfUHlfaGd2ZXJzaW9uKHZvaWQpOworCisvKiBJbnRlcm5hbCAtLSB2YXJpb3VzIG9uZS10aW1lIGluaXRpYWxpemF0aW9ucyAqLworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlCdWlsdGluX0luaXQodm9pZCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVN5c19Jbml0KHZvaWQpOworUHlBUElfRlVOQyh2b2lkKSBfUHlJbXBvcnRfSW5pdCh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5RXhjX0luaXQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeUltcG9ydEhvb2tzX0luaXQodm9pZCk7CitQeUFQSV9GVU5DKGludCkgX1B5RnJhbWVfSW5pdCh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlJbnRfSW5pdCh2b2lkKTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlMb25nX0luaXQodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIF9QeUZsb2F0X0luaXQodm9pZCk7CitQeUFQSV9GVU5DKGludCkgUHlCeXRlQXJyYXlfSW5pdCh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5UmFuZG9tX0luaXQodm9pZCk7CisKKy8qIFZhcmlvdXMgaW50ZXJuYWwgZmluYWxpemVycyAqLworUHlBUElfRlVOQyh2b2lkKSBfUHlFeGNfRmluaSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5SW1wb3J0X0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5TWV0aG9kX0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RnJhbWVfRmluaSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlDRnVuY3Rpb25fRmluaSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlEaWN0X0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5VHVwbGVfRmluaSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlMaXN0X0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5U2V0X0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5U3RyaW5nX0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5SW50X0Zpbmkodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5RmxvYXRfRmluaSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlPU19GaW5pSW50ZXJydXB0cyh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlCeXRlQXJyYXlfRmluaSh2b2lkKTsKKworLyogU3R1ZmYgd2l0aCBubyBwcm9wZXIgaG9tZSAoeWV0KSAqLworUHlBUElfRlVOQyhjaGFyICopIFB5T1NfUmVhZGxpbmUoRklMRSAqLCBGSUxFICosIGNoYXIgKik7CitQeUFQSV9EQVRBKGludCkgKCpQeU9TX0lucHV0SG9vaykodm9pZCk7CitQeUFQSV9EQVRBKGNoYXIpICooKlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIpKEZJTEUgKiwgRklMRSAqLCBjaGFyICopOworUHlBUElfREFUQShQeVRocmVhZFN0YXRlKikgX1B5T1NfUmVhZGxpbmVUU3RhdGU7CisKKy8qIFN0YWNrIHNpemUsIGluICJwb2ludGVycyIgKHNvIHdlIGdldCBleHRyYSBzYWZldHkgbWFyZ2lucworICAgb24gNjQtYml0IHBsYXRmb3JtcykuICBPbiBhIDMyLWJpdCBwbGF0Zm9ybSwgdGhpcyB0cmFuc2xhdGVzCisgICB0byBhIDhrIG1hcmdpbi4gKi8KKyNkZWZpbmUgUFlPU19TVEFDS19NQVJHSU4gMjA0OAorCisjaWYgZGVmaW5lZChXSU4zMikgJiYgIWRlZmluZWQoTVNfV0lONjQpICYmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDEzMDAKKy8qIEVuYWJsZSBzdGFjayBjaGVja2luZyB1bmRlciBNaWNyb3NvZnQgQyAqLworI2RlZmluZSBVU0VfU1RBQ0tDSEVDSworI2VuZGlmCisKKyNpZmRlZiBVU0VfU1RBQ0tDSEVDSworLyogQ2hlY2sgdGhhdCB3ZSBhcmVuJ3Qgb3ZlcmZsb3dpbmcgb3VyIHN0YWNrICovCitQeUFQSV9GVU5DKGludCkgUHlPU19DaGVja1N0YWNrKHZvaWQpOworI2VuZGlmCisKKy8qIFNpZ25hbHMgKi8KK3R5cGVkZWYgdm9pZCAoKlB5T1Nfc2lnaGFuZGxlcl90KShpbnQpOworUHlBUElfRlVOQyhQeU9TX3NpZ2hhbmRsZXJfdCkgUHlPU19nZXRzaWcoaW50KTsKK1B5QVBJX0ZVTkMoUHlPU19zaWdoYW5kbGVyX3QpIFB5T1Nfc2V0c2lnKGludCwgUHlPU19zaWdoYW5kbGVyX3QpOworCisvKiBSYW5kb20gKi8KK1B5QVBJX0ZVTkMoaW50KSBfUHlPU19VUmFuZG9tICh2b2lkICpidWZmZXIsIFB5X3NzaXplX3Qgc2l6ZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1BZVEhPTlJVTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9weXRocmVhZC5oIGIvaW5jbHVkZS9weXRob24yLjcvcHl0aHJlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQ2MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvcHl0aHJlYWQuaApAQCAtMCwwICsxLDQxIEBACisKKyNpZm5kZWYgUHlfUFlUSFJFQURfSAorI2RlZmluZSBQeV9QWVRIUkVBRF9ICisKK3R5cGVkZWYgdm9pZCAqUHlUaHJlYWRfdHlwZV9sb2NrOwordHlwZWRlZiB2b2lkICpQeVRocmVhZF90eXBlX3NlbWE7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworUHlBUElfRlVOQyh2b2lkKSBQeVRocmVhZF9pbml0X3RocmVhZCh2b2lkKTsKK1B5QVBJX0ZVTkMobG9uZykgUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCh2b2lkICgqKSh2b2lkICopLCB2b2lkICopOworUHlBUElfRlVOQyh2b2lkKSBQeVRocmVhZF9leGl0X3RocmVhZCh2b2lkKTsKK1B5QVBJX0ZVTkMobG9uZykgUHlUaHJlYWRfZ2V0X3RocmVhZF9pZGVudCh2b2lkKTsKKworUHlBUElfRlVOQyhQeVRocmVhZF90eXBlX2xvY2spIFB5VGhyZWFkX2FsbG9jYXRlX2xvY2sodm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkX2ZyZWVfbG9jayhQeVRocmVhZF90eXBlX2xvY2spOworUHlBUElfRlVOQyhpbnQpIFB5VGhyZWFkX2FjcXVpcmVfbG9jayhQeVRocmVhZF90eXBlX2xvY2ssIGludCk7CisjZGVmaW5lIFdBSVRfTE9DSwkxCisjZGVmaW5lIE5PV0FJVF9MT0NLCTAKK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayk7CisKK1B5QVBJX0ZVTkMoc2l6ZV90KSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5VGhyZWFkX3NldF9zdGFja3NpemUoc2l6ZV90KTsKKworLyogVGhyZWFkIExvY2FsIFN0b3JhZ2UgKFRMUykgQVBJICovCitQeUFQSV9GVU5DKGludCkgUHlUaHJlYWRfY3JlYXRlX2tleSh2b2lkKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfZGVsZXRlX2tleShpbnQpOworUHlBUElfRlVOQyhpbnQpIFB5VGhyZWFkX3NldF9rZXlfdmFsdWUoaW50LCB2b2lkICopOworUHlBUElfRlVOQyh2b2lkICopIFB5VGhyZWFkX2dldF9rZXlfdmFsdWUoaW50KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfZGVsZXRlX2tleV92YWx1ZShpbnQga2V5KTsKKworLyogQ2xlYW51cCBhZnRlciBhIGZvcmsgKi8KK1B5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfUmVJbml0VExTKHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogIVB5X1BZVEhSRUFEX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3Jhbmdlb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9yYW5nZW9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzljZWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy9yYW5nZW9iamVjdC5oCkBAIC0wLDAgKzEsMjggQEAKKworLyogUmFuZ2Ugb2JqZWN0IGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X1JBTkdFT0JKRUNUX0gKKyNkZWZpbmUgUHlfUkFOR0VPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGlzIGlzIGFib3V0IHRoZSB0eXBlICd4cmFuZ2UnLCBub3QgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIHJhbmdlKCksIHdoaWNoCisgICByZXR1cm5zIHJlZ3VsYXIgbGlzdHMuICovCisKKy8qCitBIHJhbmdlIG9iamVjdCByZXByZXNlbnRzIGFuIGludGVnZXIgcmFuZ2UuICBUaGlzIGlzIGFuIGltbXV0YWJsZSBvYmplY3Q7CithIHJhbmdlIGNhbm5vdCBjaGFuZ2UgaXRzIHZhbHVlIGFmdGVyIGNyZWF0aW9uLgorCitSYW5nZSBvYmplY3RzIGJlaGF2ZSBsaWtlIHRoZSBjb3JyZXNwb25kaW5nIHR1cGxlIG9iamVjdHMgZXhjZXB0IHRoYXQKK3RoZXkgYXJlIHJlcHJlc2VudGVkIGJ5IGEgc3RhcnQsIHN0b3AsIGFuZCBzdGVwIGRhdGFtZW1iZXJzLgorKi8KKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5UmFuZ2VfVHlwZTsKKworI2RlZmluZSBQeVJhbmdlX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5UmFuZ2VfVHlwZSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfUkFOR0VPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvc2V0b2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9zZXRvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmIwN2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvc2V0b2JqZWN0LmgKQEAgLTAsMCArMSw5OSBAQAorLyogU2V0IG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9TRVRPQkpFQ1RfSAorI2RlZmluZSBQeV9TRVRPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qCitUaGVyZSBhcmUgdGhyZWUga2luZHMgb2Ygc2xvdHMgaW4gdGhlIHRhYmxlOgorCisxLiBVbnVzZWQ6ICBrZXkgPT0gTlVMTAorMi4gQWN0aXZlOiAga2V5ICE9IE5VTEwgYW5kIGtleSAhPSBkdW1teQorMy4gRHVtbXk6ICAga2V5ID09IGR1bW15CisKK05vdGU6IC5wb3AoKSBhYnVzZXMgdGhlIGhhc2ggZmllbGQgb2YgYW4gVW51c2VkIG9yIER1bW15IHNsb3QgdG8KK2hvbGQgYSBzZWFyY2ggZmluZ2VyLiAgVGhlIGhhc2ggZmllbGQgb2YgVW51c2VkIG9yIER1bW15IHNsb3RzIGhhcworbm8gbWVhbmluZyBvdGhlcndpc2UuCisqLworCisjZGVmaW5lIFB5U2V0X01JTlNJWkUgOAorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgbG9uZyBoYXNoOyAgICAgIC8qIGNhY2hlZCBoYXNoIGNvZGUgZm9yIHRoZSBlbnRyeSBrZXkgKi8KKyAgICBQeU9iamVjdCAqa2V5OworfSBzZXRlbnRyeTsKKworCisvKgorVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBzaGFyZWQgYnkgc2V0IGFuZCBmcm96ZW5zZXQgb2JqZWN0cy4KKyovCisKK3R5cGVkZWYgc3RydWN0IF9zZXRvYmplY3QgUHlTZXRPYmplY3Q7CitzdHJ1Y3QgX3NldG9iamVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorCisgICAgUHlfc3NpemVfdCBmaWxsOyAgLyogIyBBY3RpdmUgKyAjIER1bW15ICovCisgICAgUHlfc3NpemVfdCB1c2VkOyAgLyogIyBBY3RpdmUgKi8KKworICAgIC8qIFRoZSB0YWJsZSBjb250YWlucyBtYXNrICsgMSBzbG90cywgYW5kIHRoYXQncyBhIHBvd2VyIG9mIDIuCisgICAgICogV2Ugc3RvcmUgdGhlIG1hc2sgaW5zdGVhZCBvZiB0aGUgc2l6ZSBiZWNhdXNlIHRoZSBtYXNrIGlzIG1vcmUKKyAgICAgKiBmcmVxdWVudGx5IG5lZWRlZC4KKyAgICAgKi8KKyAgICBQeV9zc2l6ZV90IG1hc2s7CisKKyAgICAvKiB0YWJsZSBwb2ludHMgdG8gc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCisgICAgICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQorICAgICAqIHNhdmVzIHJlcGVhdGVkIHJ1bnRpbWUgbnVsbC10ZXN0cy4KKyAgICAgKi8KKyAgICBzZXRlbnRyeSAqdGFibGU7CisgICAgc2V0ZW50cnkgKigqbG9va3VwKShQeVNldE9iamVjdCAqc28sIFB5T2JqZWN0ICprZXksIGxvbmcgaGFzaCk7CisgICAgc2V0ZW50cnkgc21hbGx0YWJsZVtQeVNldF9NSU5TSVpFXTsKKworICAgIGxvbmcgaGFzaDsgICAgICAgICAgICAgICAgICAvKiBvbmx5IHVzZWQgYnkgZnJvemVuc2V0IG9iamVjdHMgKi8KKyAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7ICAgICAgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KK307CisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVNldF9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RnJvemVuU2V0X1R5cGU7CisKKy8qIEludmFyaWFudHMgZm9yIGZyb3plbnNldHM6CisgKiAgICAgZGF0YSBpcyBpbW11dGFibGUuCisgKiAgICAgaGFzaCBpcyB0aGUgaGFzaCBvZiB0aGUgZnJvemVuc2V0IG9yIC0xIGlmIG5vdCBjb21wdXRlZCB5ZXQuCisgKiBJbnZhcmlhbnRzIGZvciBzZXRzOgorICogICAgIGhhc2ggaXMgLTEKKyAqLworCisjZGVmaW5lIFB5RnJvemVuU2V0X0NoZWNrRXhhY3Qob2IpIChQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkKKyNkZWZpbmUgUHlBbnlTZXRfQ2hlY2tFeGFjdChvYikgXAorICAgIChQeV9UWVBFKG9iKSA9PSAmUHlTZXRfVHlwZSB8fCBQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSkKKyNkZWZpbmUgUHlBbnlTZXRfQ2hlY2sob2IpIFwKKyAgICAoUHlfVFlQRShvYikgPT0gJlB5U2V0X1R5cGUgfHwgUHlfVFlQRShvYikgPT0gJlB5RnJvemVuU2V0X1R5cGUgfHwgXAorICAgICAgUHlUeXBlX0lzU3VidHlwZShQeV9UWVBFKG9iKSwgJlB5U2V0X1R5cGUpIHx8IFwKKyAgICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeUZyb3plblNldF9UeXBlKSkKKyNkZWZpbmUgUHlTZXRfQ2hlY2sob2IpIFwKKyAgICAoUHlfVFlQRShvYikgPT0gJlB5U2V0X1R5cGUgfHwgXAorICAgIFB5VHlwZV9Jc1N1YnR5cGUoUHlfVFlQRShvYiksICZQeVNldF9UeXBlKSkKKyNkZWZpbmUgICBQeUZyb3plblNldF9DaGVjayhvYikgXAorICAgIChQeV9UWVBFKG9iKSA9PSAmUHlGcm96ZW5TZXRfVHlwZSB8fCBcCisgICAgICBQeVR5cGVfSXNTdWJ0eXBlKFB5X1RZUEUob2IpLCAmUHlGcm96ZW5TZXRfVHlwZSkpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTZXRfTmV3KFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeUZyb3plblNldF9OZXcoUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5U2V0X1NpemUoUHlPYmplY3QgKmFueXNldCk7CisjZGVmaW5lIFB5U2V0X0dFVF9TSVpFKHNvKSAoKChQeVNldE9iamVjdCAqKShzbykpLT51c2VkKQorUHlBUElfRlVOQyhpbnQpIFB5U2V0X0NsZWFyKFB5T2JqZWN0ICpzZXQpOworUHlBUElfRlVOQyhpbnQpIFB5U2V0X0NvbnRhaW5zKFB5T2JqZWN0ICphbnlzZXQsIFB5T2JqZWN0ICprZXkpOworUHlBUElfRlVOQyhpbnQpIFB5U2V0X0Rpc2NhcmQoUHlPYmplY3QgKnNldCwgUHlPYmplY3QgKmtleSk7CitQeUFQSV9GVU5DKGludCkgUHlTZXRfQWRkKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICprZXkpOworUHlBUElfRlVOQyhpbnQpIF9QeVNldF9OZXh0KFB5T2JqZWN0ICpzZXQsIFB5X3NzaXplX3QgKnBvcywgUHlPYmplY3QgKiprZXkpOworUHlBUElfRlVOQyhpbnQpIF9QeVNldF9OZXh0RW50cnkoUHlPYmplY3QgKnNldCwgUHlfc3NpemVfdCAqcG9zLCBQeU9iamVjdCAqKmtleSwgbG9uZyAqaGFzaCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U2V0X1BvcChQeU9iamVjdCAqc2V0KTsKK1B5QVBJX0ZVTkMoaW50KSBfUHlTZXRfVXBkYXRlKFB5T2JqZWN0ICpzZXQsIFB5T2JqZWN0ICppdGVyYWJsZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1NFVE9CSkVDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy9zbGljZW9iamVjdC5oIGIvaW5jbHVkZS9weXRob24yLjcvc2xpY2VvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWI2MmRkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvc2xpY2VvYmplY3QuaApAQCAtMCwwICsxLDQ0IEBACisjaWZuZGVmIFB5X1NMSUNFT0JKRUNUX0gKKyNkZWZpbmUgUHlfU0xJQ0VPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiBUaGUgdW5pcXVlIGVsbGlwc2lzIG9iamVjdCAiLi4uIiAqLworCitQeUFQSV9EQVRBKFB5T2JqZWN0KSBfUHlfRWxsaXBzaXNPYmplY3Q7IC8qIERvbid0IHVzZSB0aGlzIGRpcmVjdGx5ICovCisKKyNkZWZpbmUgUHlfRWxsaXBzaXMgKCZfUHlfRWxsaXBzaXNPYmplY3QpCisKKy8qIFNsaWNlIG9iamVjdCBpbnRlcmZhY2UgKi8KKworLyoKKworQSBzbGljZSBvYmplY3QgY29udGFpbmluZyBzdGFydCwgc3RvcCwgYW5kIHN0ZXAgZGF0YSBtZW1iZXJzICh0aGUKK25hbWVzIGFyZSBmcm9tIHJhbmdlKS4gIEFmdGVyIG11Y2ggdGFsayB3aXRoIEd1aWRvLCBpdCB3YXMgZGVjaWRlZCB0bworbGV0IHRoZXNlIGJlIGFueSBhcmJpdHJhcnkgcHl0aG9uIHR5cGUuICBQeV9Ob25lIHN0YW5kcyBmb3Igb21pdHRlZCB2YWx1ZXMuCisqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIFB5T2JqZWN0ICpzdGFydCwgKnN0b3AsICpzdGVwOwkvKiBub3QgTlVMTCAqLworfSBQeVNsaWNlT2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTbGljZV9UeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5RWxsaXBzaXNfVHlwZTsKKworI2RlZmluZSBQeVNsaWNlX0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5U2xpY2VfVHlwZSkKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVNsaWNlX05ldyhQeU9iamVjdCogc3RhcnQsIFB5T2JqZWN0KiBzdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBzdGVwKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5U2xpY2VfRnJvbUluZGljZXMoUHlfc3NpemVfdCBzdGFydCwgUHlfc3NpemVfdCBzdG9wKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVNsaWNlX0dldEluZGljZXMoUHlTbGljZU9iamVjdCAqciwgUHlfc3NpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCAqc3RhcnQsIFB5X3NzaXplX3QgKnN0b3AsIFB5X3NzaXplX3QgKnN0ZXApOworUHlBUElfRlVOQyhpbnQpIFB5U2xpY2VfR2V0SW5kaWNlc0V4KFB5U2xpY2VPYmplY3QgKnIsIFB5X3NzaXplX3QgbGVuZ3RoLAorCQkJCSAgICBQeV9zc2l6ZV90ICpzdGFydCwgUHlfc3NpemVfdCAqc3RvcCwgCisJCQkJICAgIFB5X3NzaXplX3QgKnN0ZXAsIFB5X3NzaXplX3QgKnNsaWNlbGVuZ3RoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfU0xJQ0VPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvc3RyaW5nb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy9zdHJpbmdvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGI1YjQxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvc3RyaW5nb2JqZWN0LmgKQEAgLTAsMCArMSwyMTAgQEAKKworLyogU3RyaW5nIChzdHIvYnl0ZXMpIG9iamVjdCBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9TVFJJTkdPQkpFQ1RfSAorI2RlZmluZSBQeV9TVFJJTkdPQkpFQ1RfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qCitUeXBlIFB5U3RyaW5nT2JqZWN0IHJlcHJlc2VudHMgYSBjaGFyYWN0ZXIgc3RyaW5nLiAgQW4gZXh0cmEgemVybyBieXRlIGlzCityZXNlcnZlZCBhdCB0aGUgZW5kIHRvIGVuc3VyZSBpdCBpcyB6ZXJvLXRlcm1pbmF0ZWQsIGJ1dCBhIHNpemUgaXMKK3ByZXNlbnQgc28gc3RyaW5ncyB3aXRoIG51bGwgYnl0ZXMgaW4gdGhlbSBjYW4gYmUgcmVwcmVzZW50ZWQuICBUaGlzCitpcyBhbiBpbW11dGFibGUgb2JqZWN0IHR5cGUuCisKK1RoZXJlIGFyZSBmdW5jdGlvbnMgdG8gY3JlYXRlIG5ldyBzdHJpbmcgb2JqZWN0cywgdG8gdGVzdAorYW4gb2JqZWN0IGZvciBzdHJpbmctbmVzcywgYW5kIHRvIGdldCB0aGUKK3N0cmluZyB2YWx1ZS4gIFRoZSBsYXR0ZXIgZnVuY3Rpb24gcmV0dXJucyBhIG51bGwgcG9pbnRlcgoraWYgdGhlIG9iamVjdCBpcyBub3Qgb2YgdGhlIHByb3BlciB0eXBlLgorVGhlcmUgaXMgYSB2YXJpYW50IHRoYXQgdGFrZXMgYW4gZXhwbGljaXQgc2l6ZSBhcyB3ZWxsIGFzIGEKK3ZhcmlhbnQgdGhhdCBhc3N1bWVzIGEgemVyby10ZXJtaW5hdGVkIHN0cmluZy4gIE5vdGUgdGhhdCBub25lIG9mIHRoZQorZnVuY3Rpb25zIHNob3VsZCBiZSBhcHBsaWVkIHRvIG5pbCBvYmplY3RzLgorKi8KKworLyogQ2FjaGluZyB0aGUgaGFzaCAob2Jfc2hhc2gpIHNhdmVzIHJlY2FsY3VsYXRpb24gb2YgYSBzdHJpbmcncyBoYXNoIHZhbHVlLgorICAgSW50ZXJuaW5nIHN0cmluZ3MgKG9iX3NzdGF0ZSkgdHJpZXMgdG8gZW5zdXJlIHRoYXQgb25seSBvbmUgc3RyaW5nCisgICBvYmplY3Qgd2l0aCBhIGdpdmVuIHZhbHVlIGV4aXN0cywgc28gZXF1YWxpdHkgdGVzdHMgY2FuIGJlIG9uZSBwb2ludGVyCisgICBjb21wYXJpc29uLiAgVGhpcyBpcyBnZW5lcmFsbHkgcmVzdHJpY3RlZCB0byBzdHJpbmdzIHRoYXQgImxvb2sgbGlrZSIKKyAgIFB5dGhvbiBpZGVudGlmaWVycywgYWx0aG91Z2ggdGhlIGludGVybigpIGJ1aWx0aW4gY2FuIGJlIHVzZWQgdG8gZm9yY2UKKyAgIGludGVybmluZyBvZiBhbnkgc3RyaW5nLgorICAgVG9nZXRoZXIsIHRoZXNlIHNwZWQgdGhlIGludGVycHJldGVyIGJ5IHVwIHRvIDIwJS4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X1ZBUl9IRUFECisgICAgbG9uZyBvYl9zaGFzaDsKKyAgICBpbnQgb2Jfc3N0YXRlOworICAgIGNoYXIgb2Jfc3ZhbFsxXTsKKworICAgIC8qIEludmFyaWFudHM6CisgICAgICogICAgIG9iX3N2YWwgY29udGFpbnMgc3BhY2UgZm9yICdvYl9zaXplKzEnIGVsZW1lbnRzLgorICAgICAqICAgICBvYl9zdmFsW29iX3NpemVdID09IDAuCisgICAgICogICAgIG9iX3NoYXNoIGlzIHRoZSBoYXNoIG9mIHRoZSBzdHJpbmcgb3IgLTEgaWYgbm90IGNvbXB1dGVkIHlldC4KKyAgICAgKiAgICAgb2Jfc3N0YXRlICE9IDAgaWZmIHRoZSBzdHJpbmcgb2JqZWN0IGlzIGluIHN0cmluZ29iamVjdC5jJ3MKKyAgICAgKiAgICAgICAnaW50ZXJuZWQnIGRpY3Rpb25hcnk7IGluIHRoaXMgY2FzZSB0aGUgdHdvIHJlZmVyZW5jZXMKKyAgICAgKiAgICAgICBmcm9tICdpbnRlcm5lZCcgdG8gdGhpcyBvYmplY3QgYXJlICpub3QgY291bnRlZCogaW4gb2JfcmVmY250LgorICAgICAqLworfSBQeVN0cmluZ09iamVjdDsKKworI2RlZmluZSBTU1RBVEVfTk9UX0lOVEVSTkVEIDAKKyNkZWZpbmUgU1NUQVRFX0lOVEVSTkVEX01PUlRBTCAxCisjZGVmaW5lIFNTVEFURV9JTlRFUk5FRF9JTU1PUlRBTCAyCisKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUJhc2VTdHJpbmdfVHlwZTsKK1B5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeVN0cmluZ19UeXBlOworCisjZGVmaW5lIFB5U3RyaW5nX0NoZWNrKG9wKSBcCisgICAgICAgICAgICAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfU1RSSU5HX1NVQkNMQVNTKQorI2RlZmluZSBQeVN0cmluZ19DaGVja0V4YWN0KG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5U3RyaW5nX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29uc3QgY2hhciAqLCBQeV9zc2l6ZV90KTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRnJvbVN0cmluZyhjb25zdCBjaGFyICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19Gcm9tRm9ybWF0Vihjb25zdCBjaGFyKiwgdmFfbGlzdCkKKwkJCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAxLCAwKSkpOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIqLCAuLi4pCisJCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlTdHJpbmdfU2l6ZShQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoY2hhciAqKSBQeVN0cmluZ19Bc1N0cmluZyhQeU9iamVjdCAqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfUmVwcihQeU9iamVjdCAqLCBpbnQpOworUHlBUElfRlVOQyh2b2lkKSBQeVN0cmluZ19Db25jYXQoUHlPYmplY3QgKiosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyh2b2lkKSBQeVN0cmluZ19Db25jYXRBbmREZWwoUHlPYmplY3QgKiosIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhpbnQpIF9QeVN0cmluZ19SZXNpemUoUHlPYmplY3QgKiosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIF9QeVN0cmluZ19FcShQeU9iamVjdCAqLCBQeU9iamVjdCopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVN0cmluZ19Gb3JtYXQoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVN0cmluZ19Gb3JtYXRMb25nKFB5T2JqZWN0KiwgaW50LCBpbnQsCisJCQkJCQkgIGludCwgY2hhcioqLCBpbnQqKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJpbmdfRGVjb2RlRXNjYXBlKGNvbnN0IGNoYXIgKiwgUHlfc3NpemVfdCwgCisJCQkJCQkgICBjb25zdCBjaGFyICosIFB5X3NzaXplX3QsCisJCQkJCQkgICBjb25zdCBjaGFyICopOworCitQeUFQSV9GVU5DKHZvaWQpIFB5U3RyaW5nX0ludGVybkluUGxhY2UoUHlPYmplY3QgKiopOworUHlBUElfRlVOQyh2b2lkKSBQeVN0cmluZ19JbnRlcm5JbW1vcnRhbChQeU9iamVjdCAqKik7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkModm9pZCkgX1B5X1JlbGVhc2VJbnRlcm5lZFN0cmluZ3Modm9pZCk7CisKKy8qIFVzZSBvbmx5IGlmIHlvdSBrbm93IGl0J3MgYSBzdHJpbmcgKi8KKyNkZWZpbmUgUHlTdHJpbmdfQ0hFQ0tfSU5URVJORUQob3ApICgoKFB5U3RyaW5nT2JqZWN0ICopKG9wKSktPm9iX3NzdGF0ZSkKKworLyogTWFjcm8sIHRyYWRpbmcgc2FmZXR5IGZvciBzcGVlZCAqLworI2RlZmluZSBQeVN0cmluZ19BU19TVFJJTkcob3ApICgoKFB5U3RyaW5nT2JqZWN0ICopKG9wKSktPm9iX3N2YWwpCisjZGVmaW5lIFB5U3RyaW5nX0dFVF9TSVpFKG9wKSAgUHlfU0laRShvcCkKKworLyogX1B5U3RyaW5nX0pvaW4oc2VwLCB4KSBpcyBsaWtlIHNlcC5qb2luKHgpLiAgc2VwIG11c3QgYmUgUHlTdHJpbmdPYmplY3QqLAorICAgeCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9iamVjdC4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5U3RyaW5nX0pvaW4oUHlPYmplY3QgKnNlcCwgUHlPYmplY3QgKngpOworCisvKiAtLS0gR2VuZXJpYyBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ3JlYXRlIGFuIG9iamVjdCBieSBkZWNvZGluZyB0aGUgZW5jb2RlZCBzdHJpbmcgcyBvZiB0aGUKKyAgIGdpdmVuIHNpemUuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVN0cmluZ19EZWNvZGUoCisgICAgY29uc3QgY2hhciAqcywgICAgICAgICAgICAgIC8qIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBzaXplLCAgICAgICAgICAgIC8qIHNpemUgb2YgYnVmZmVyICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogRW5jb2RlcyBhIGNoYXIgYnVmZmVyIG9mIHRoZSBnaXZlbiBzaXplIGFuZCByZXR1cm5zIGEgCisgICBQeXRob24gb2JqZWN0LiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlTdHJpbmdfRW5jb2RlKAorICAgIGNvbnN0IGNoYXIgKnMsICAgICAgICAgICAgICAvKiBzdHJpbmcgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IHNpemUsICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIEVuY29kZXMgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgUHl0aG9uIAorICAgb2JqZWN0LiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlTdHJpbmdfQXNFbmNvZGVkT2JqZWN0KAorICAgIFB5T2JqZWN0ICpzdHIsCSAJLyogc3RyaW5nIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAkvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBFbmNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiBzdHJpbmcKKyAgIG9iamVjdC4gICAKKyAgIAorICAgSWYgdGhlIGNvZGVjIHJldHVybnMgYW4gVW5pY29kZSBvYmplY3QsIHRoZSBvYmplY3QgaXMgY29udmVydGVkCisgICBiYWNrIHRvIGEgc3RyaW5nIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nLgorCisgICBERVBSRUNBVEVEIC0gdXNlIFB5U3RyaW5nX0FzRW5jb2RlZE9iamVjdCgpIGluc3RlYWQuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVN0cmluZ19Bc0VuY29kZWRTdHJpbmcoCisgICAgUHlPYmplY3QgKnN0ciwJIAkvKiBzdHJpbmcgb2JqZWN0ICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsCS8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzCQkvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIERlY29kZXMgYSBzdHJpbmcgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgUHl0aG9uIAorICAgb2JqZWN0LiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KAorICAgIFB5T2JqZWN0ICpzdHIsCSAJLyogc3RyaW5nIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLAkvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycwkJLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBEZWNvZGVzIGEgc3RyaW5nIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiBzdHJpbmcKKyAgIG9iamVjdC4gIAorICAgCisgICBJZiB0aGUgY29kZWMgcmV0dXJucyBhbiBVbmljb2RlIG9iamVjdCwgdGhlIG9iamVjdCBpcyBjb252ZXJ0ZWQKKyAgIGJhY2sgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGRlZmF1bHQgZW5jb2RpbmcuCisKKyAgIERFUFJFQ0FURUQgLSB1c2UgUHlTdHJpbmdfQXNEZWNvZGVkT2JqZWN0KCkgaW5zdGVhZC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5U3RyaW5nX0FzRGVjb2RlZFN0cmluZygKKyAgICBQeU9iamVjdCAqc3RyLAkgCS8qIHN0cmluZyBvYmplY3QgKi8KKyAgICBjb25zdCBjaGFyICplbmNvZGluZywJLyogZW5jb2RpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMJCS8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBpbnRlcm5hbCBkYXRhIGJ1ZmZlciBhbmQgc2l6ZSBvZiBhIHN0cmluZworICAgb2JqZWN0IG9yIHRoZSBkZWZhdWx0IGVuY29kZWQgdmVyc2lvbiBvZiBhbiBVbmljb2RlIG9iamVjdC4gUGFzc2luZworICAgTlVMTCBhcyAqbGVuIHBhcmFtZXRlciB3aWxsIGZvcmNlIHRoZSBzdHJpbmcgYnVmZmVyIHRvIGJlCisgICAwLXRlcm1pbmF0ZWQgKHBhc3NpbmcgYSBzdHJpbmcgd2l0aCBlbWJlZGRlZCBOVUxMIGNoYXJhY3RlcnMgd2lsbAorICAgY2F1c2UgYW4gZXhjZXB0aW9uKS4gICovCisKK1B5QVBJX0ZVTkMoaW50KSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoCisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwJLyogc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0ICovCisgICAgcmVnaXN0ZXIgY2hhciAqKnMsCQkvKiBwb2ludGVyIHRvIGJ1ZmZlciB2YXJpYWJsZSAqLworICAgIHJlZ2lzdGVyIFB5X3NzaXplX3QgKmxlbgkvKiBwb2ludGVyIHRvIGxlbmd0aCB2YXJpYWJsZSBvciBOVUxMCisJCQkJICAgKG9ubHkgcG9zc2libGUgZm9yIDAtdGVybWluYXRlZAorCQkJCSAgIHN0cmluZ3MpICovCisgICAgKTsKKworCisvKiBVc2luZyB0aGUgY3VycmVudCBsb2NhbGUsIGluc2VydCB0aGUgdGhvdXNhbmRzIGdyb3VwaW5nCisgICBpbnRvIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSBidWZmZXIuICBGb3IgdGhlIGFyZ3VtZW50IGRlc2NyaXB0aW9ucywKKyAgIHNlZSBPYmplY3RzL3N0cmluZ2xpYi9sb2NhbGV1dGlsLmggKi8KK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5U3RyaW5nX0luc2VydFRob3VzYW5kc0dyb3VwaW5nTG9jYWxlKGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5fYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmRpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IG5fZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgbWluX3dpZHRoKTsKKworLyogVXNpbmcgZXhwbGljaXQgcGFzc2VkLWluIHZhbHVlcywgaW5zZXJ0IHRoZSB0aG91c2FuZHMgZ3JvdXBpbmcKKyAgIGludG8gdGhlIHN0cmluZyBwb2ludGVkIHRvIGJ5IGJ1ZmZlci4gIEZvciB0aGUgYXJndW1lbnQgZGVzY3JpcHRpb25zLAorICAgc2VlIE9iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaCAqLworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBfUHlTdHJpbmdfSW5zZXJ0VGhvdXNhbmRzR3JvdXBpbmcoY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgbl9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X3NzaXplX3Qgbl9kaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBtaW5fd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZ3JvdXBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGhvdXNhbmRzX3NlcCk7CisKKy8qIEZvcm1hdCB0aGUgb2JqZWN0IGJhc2VkIG9uIHRoZSBmb3JtYXRfc3BlYywgYXMgZGVmaW5lZCBpbiBQRVAgMzEwMQorICAgKEFkdmFuY2VkIFN0cmluZyBGb3JtYXR0aW5nKS4gKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5Qnl0ZXNfRm9ybWF0QWR2YW5jZWQoUHlPYmplY3QgKm9iaiwKKwkJCQkJICAgICAgIGNoYXIgKmZvcm1hdF9zcGVjLAorCQkJCQkgICAgICAgUHlfc3NpemVfdCBmb3JtYXRfc3BlY19sZW4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9TVFJJTkdPQkpFQ1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvc3RydWN0bWVtYmVyLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9zdHJ1Y3RtZW1iZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTViNDRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvc3RydWN0bWVtYmVyLmgKQEAgLTAsMCArMSw5OSBAQAorI2lmbmRlZiBQeV9TVFJVQ1RNRU1CRVJfSAorI2RlZmluZSBQeV9TVFJVQ1RNRU1CRVJfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIEludGVyZmFjZSB0byBtYXAgQyBzdHJ1Y3QgbWVtYmVycyB0byBQeXRob24gb2JqZWN0IGF0dHJpYnV0ZXMgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPiAvKiBGb3Igb2Zmc2V0b2YgKi8KKworLyogVGhlIG9mZnNldG9mKCkgbWFjcm8gY2FsY3VsYXRlcyB0aGUgb2Zmc2V0IG9mIGEgc3RydWN0dXJlIG1lbWJlcgorICAgaW4gaXRzIHN0cnVjdHVyZS4gIFVuZm9ydHVuYXRlbHkgdGhpcyBjYW5ub3QgYmUgd3JpdHRlbiBkb3duCisgICBwb3J0YWJseSwgaGVuY2UgaXQgaXMgcHJvdmlkZWQgYnkgYSBTdGFuZGFyZCBDIGhlYWRlciBmaWxlLgorICAgRm9yIHByZS1TdGFuZGFyZCBDIGNvbXBpbGVycywgaGVyZSBpcyBhIHZlcnNpb24gdGhhdCB1c3VhbGx5IHdvcmtzCisgICAoYnV0IHdhdGNoIG91dCEpOiAqLworCisjaWZuZGVmIG9mZnNldG9mCisjZGVmaW5lIG9mZnNldG9mKHR5cGUsIG1lbWJlcikgKCAoaW50KSAmICgodHlwZSopMCkgLT4gbWVtYmVyICkKKyNlbmRpZgorCisvKiBBbiBhcnJheSBvZiBtZW1iZXJsaXN0IHN0cnVjdHVyZXMgZGVmaW5lcyB0aGUgbmFtZSwgdHlwZSBhbmQgb2Zmc2V0CisgICBvZiBzZWxlY3RlZCBtZW1iZXJzIG9mIGEgQyBzdHJ1Y3R1cmUuICBUaGVzZSBjYW4gYmUgcmVhZCBieQorICAgUHlNZW1iZXJfR2V0KCkgYW5kIHNldCBieSBQeU1lbWJlcl9TZXQoKSAoZXhjZXB0IGlmIHRoZWlyIFJFQURPTkxZIGZsYWcKKyAgIGlzIHNldCkuICBUaGUgYXJyYXkgbXVzdCBiZSB0ZXJtaW5hdGVkIHdpdGggYW4gZW50cnkgd2hvc2UgbmFtZQorICAgcG9pbnRlciBpcyBOVUxMLiAqLworCitzdHJ1Y3QgbWVtYmVybGlzdCB7CisgICAgLyogT2Jzb2xldGUgdmVyc2lvbiwgZm9yIGJpbmFyeSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAqLworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHR5cGU7CisgICAgaW50IG9mZnNldDsKKyAgICBpbnQgZmxhZ3M7Cit9OworCit0eXBlZGVmIHN0cnVjdCBQeU1lbWJlckRlZiB7CisgICAgLyogQ3VycmVudCB2ZXJzaW9uLCB1c2UgdGhpcyAqLworICAgIGNoYXIgKm5hbWU7CisgICAgaW50IHR5cGU7CisgICAgUHlfc3NpemVfdCBvZmZzZXQ7CisgICAgaW50IGZsYWdzOworICAgIGNoYXIgKmRvYzsKK30gUHlNZW1iZXJEZWY7CisKKy8qIFR5cGVzICovCisjZGVmaW5lIFRfU0hPUlQgICAgICAgICAwCisjZGVmaW5lIFRfSU5UICAgICAgICAgICAxCisjZGVmaW5lIFRfTE9ORyAgICAgICAgICAyCisjZGVmaW5lIFRfRkxPQVQgICAgICAgICAzCisjZGVmaW5lIFRfRE9VQkxFICAgICAgICA0CisjZGVmaW5lIFRfU1RSSU5HICAgICAgICA1CisjZGVmaW5lIFRfT0JKRUNUICAgICAgICA2CisvKiBYWFggdGhlIG9yZGVyaW5nIGhlcmUgaXMgd2VpcmQgZm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5ICovCisjZGVmaW5lIFRfQ0hBUiAgICAgICAgICA3ICAgICAgIC8qIDEtY2hhcmFjdGVyIHN0cmluZyAqLworI2RlZmluZSBUX0JZVEUgICAgICAgICAgOCAgICAgICAvKiA4LWJpdCBzaWduZWQgaW50ICovCisvKiB1bnNpZ25lZCB2YXJpYW50czogKi8KKyNkZWZpbmUgVF9VQllURSAgICAgICAgIDkKKyNkZWZpbmUgVF9VU0hPUlQgICAgICAgIDEwCisjZGVmaW5lIFRfVUlOVCAgICAgICAgICAxMQorI2RlZmluZSBUX1VMT05HICAgICAgICAgMTIKKworLyogQWRkZWQgYnkgSmFjazogc3RyaW5ncyBjb250YWluZWQgaW4gdGhlIHN0cnVjdHVyZSAqLworI2RlZmluZSBUX1NUUklOR19JTlBMQUNFICAgICAgICAxMworCisvKiBBZGRlZCBieSBMaWxsbzogYm9vbHMgY29udGFpbmVkIGluIHRoZSBzdHJ1Y3R1cmUgKGFzc3VtZWQgY2hhcikgKi8KKyNkZWZpbmUgVF9CT09MICAgICAgICAgIDE0CisKKyNkZWZpbmUgVF9PQkpFQ1RfRVggICAgIDE2ICAgICAgLyogTGlrZSBUX09CSkVDVCwgYnV0IHJhaXNlcyBBdHRyaWJ1dGVFcnJvcgorICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIHZhbHVlIGlzIE5VTEwsIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAgICBjb252ZXJ0aW5nIHRvIE5vbmUuICovCisjaWZkZWYgSEFWRV9MT05HX0xPTkcKKyNkZWZpbmUgVF9MT05HTE9ORyAgICAgIDE3CisjZGVmaW5lIFRfVUxPTkdMT05HICAgICAgMTgKKyNlbmRpZiAvKiBIQVZFX0xPTkdfTE9ORyAqLworCisjZGVmaW5lIFRfUFlTU0laRVQgICAgICAgMTkgLyogUHlfc3NpemVfdCAqLworCisKKy8qIEZsYWdzICovCisjZGVmaW5lIFJFQURPTkxZICAgICAgICAxCisjZGVmaW5lIFJPICAgICAgICAgICAgICBSRUFET05MWSAgICAgICAgICAgICAgICAvKiBTaG9ydGhhbmQgKi8KKyNkZWZpbmUgUkVBRF9SRVNUUklDVEVEIDIKKyNkZWZpbmUgUFlfV1JJVEVfUkVTVFJJQ1RFRCA0CisjZGVmaW5lIFJFU1RSSUNURUQgICAgICAoUkVBRF9SRVNUUklDVEVEIHwgUFlfV1JJVEVfUkVTVFJJQ1RFRCkKKworCisvKiBPYnNvbGV0ZSBBUEksIGZvciBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNZW1iZXJfR2V0KGNvbnN0IGNoYXIgKiwgc3RydWN0IG1lbWJlcmxpc3QgKiwgY29uc3QgY2hhciAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeU1lbWJlcl9TZXQoY2hhciAqLCBzdHJ1Y3QgbWVtYmVybGlzdCAqLCBjb25zdCBjaGFyICosIFB5T2JqZWN0ICopOworCisvKiBDdXJyZW50IEFQSSwgdXNlIHRoaXMgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlNZW1iZXJfR2V0T25lKGNvbnN0IGNoYXIgKiwgc3RydWN0IFB5TWVtYmVyRGVmICopOworUHlBUElfRlVOQyhpbnQpIFB5TWVtYmVyX1NldE9uZShjaGFyICosIHN0cnVjdCBQeU1lbWJlckRlZiAqLCBQeU9iamVjdCAqKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9TVFJVQ1RNRU1CRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvc3RydWN0c2VxLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9zdHJ1Y3RzZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjYyOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvc3RydWN0c2VxLmgKQEAgLTAsMCArMSw0MSBAQAorCisvKiBUdXBsZSBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfU1RSVUNUU0VRX0gKKyNkZWZpbmUgUHlfU1RSVUNUU0VRX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgUHlTdHJ1Y3RTZXF1ZW5jZV9GaWVsZCB7CisJY2hhciAqbmFtZTsKKwljaGFyICpkb2M7Cit9IFB5U3RydWN0U2VxdWVuY2VfRmllbGQ7CisKK3R5cGVkZWYgc3RydWN0IFB5U3RydWN0U2VxdWVuY2VfRGVzYyB7CisJY2hhciAqbmFtZTsKKwljaGFyICpkb2M7CisJc3RydWN0IFB5U3RydWN0U2VxdWVuY2VfRmllbGQgKmZpZWxkczsKKwlpbnQgbl9pbl9zZXF1ZW5jZTsKK30gUHlTdHJ1Y3RTZXF1ZW5jZV9EZXNjOworCitleHRlcm4gY2hhciogUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQ7CisKK1B5QVBJX0ZVTkModm9pZCkgUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZShQeVR5cGVPYmplY3QgKnR5cGUsCisJCQkJCSAgIFB5U3RydWN0U2VxdWVuY2VfRGVzYyAqZGVzYyk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTdHJ1Y3RTZXF1ZW5jZV9OZXcoUHlUeXBlT2JqZWN0KiB0eXBlKTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCVB5T2JqZWN0X1ZBUl9IRUFECisJUHlPYmplY3QgKm9iX2l0ZW1bMV07Cit9IFB5U3RydWN0U2VxdWVuY2U7CisKKy8qIE1hY3JvLCAqb25seSogdG8gYmUgdXNlZCB0byBmaWxsIGluIGJyYW5kIG5ldyBvYmplY3RzICovCisjZGVmaW5lIFB5U3RydWN0U2VxdWVuY2VfU0VUX0lURU0ob3AsIGksIHYpIFwKKwkoKChQeVN0cnVjdFNlcXVlbmNlICopKG9wKSktPm9iX2l0ZW1baV0gPSB2KQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9TVFJVQ1RTRVFfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvc3ltdGFibGUuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3N5bXRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBhMGJlNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3N5bXRhYmxlLmgKQEAgLTAsMCArMSw5OCBAQAorI2lmbmRlZiBQeV9TWU1UQUJMRV9ICisjZGVmaW5lIFB5X1NZTVRBQkxFX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGVudW0gX2Jsb2NrX3R5cGUgeyBGdW5jdGlvbkJsb2NrLCBDbGFzc0Jsb2NrLCBNb2R1bGVCbG9jayB9CisgICAgX1B5X2Jsb2NrX3R5OworCitzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5OworCitzdHJ1Y3Qgc3ltdGFibGUgeworICAgIGNvbnN0IGNoYXIgKnN0X2ZpbGVuYW1lOyAvKiBuYW1lIG9mIGZpbGUgYmVpbmcgY29tcGlsZWQgKi8KKyAgICBzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5ICpzdF9jdXI7IC8qIGN1cnJlbnQgc3ltYm9sIHRhYmxlIGVudHJ5ICovCisgICAgc3RydWN0IF9zeW10YWJsZV9lbnRyeSAqc3RfdG9wOyAvKiBtb2R1bGUgZW50cnkgKi8KKyAgICBQeU9iamVjdCAqc3Rfc3ltYm9sczsgICAgLyogZGljdGlvbmFyeSBvZiBzeW1ib2wgdGFibGUgZW50cmllcyAqLworICAgIFB5T2JqZWN0ICpzdF9zdGFjazsgICAgICAvKiBzdGFjayBvZiBuYW1lc3BhY2UgaW5mbyAqLworICAgIFB5T2JqZWN0ICpzdF9nbG9iYWw7ICAgICAvKiBib3Jyb3dlZCByZWYgdG8gTU9EVUxFIGluIHN0X3N5bWJvbHMgKi8KKyAgICBpbnQgc3RfbmJsb2NrczsgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyAqLworICAgIFB5T2JqZWN0ICpzdF9wcml2YXRlOyAgICAgICAgLyogbmFtZSBvZiBjdXJyZW50IGNsYXNzIG9yIE5VTEwgKi8KKyAgICBQeUZ1dHVyZUZlYXR1cmVzICpzdF9mdXR1cmU7IC8qIG1vZHVsZSdzIGZ1dHVyZSBmZWF0dXJlcyAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3QgX3N5bXRhYmxlX2VudHJ5IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlPYmplY3QgKnN0ZV9pZDsgICAgICAgIC8qIGludDoga2V5IGluIHN0X3N5bWJvbHMgKi8KKyAgICBQeU9iamVjdCAqc3RlX3N5bWJvbHM7ICAgLyogZGljdDogbmFtZSB0byBmbGFncyAqLworICAgIFB5T2JqZWN0ICpzdGVfbmFtZTsgICAgICAvKiBzdHJpbmc6IG5hbWUgb2YgYmxvY2sgKi8KKyAgICBQeU9iamVjdCAqc3RlX3Zhcm5hbWVzOyAgLyogbGlzdCBvZiB2YXJpYWJsZSBuYW1lcyAqLworICAgIFB5T2JqZWN0ICpzdGVfY2hpbGRyZW47ICAvKiBsaXN0IG9mIGNoaWxkIGlkcyAqLworICAgIF9QeV9ibG9ja190eSBzdGVfdHlwZTsgICAvKiBtb2R1bGUsIGNsYXNzLCBvciBmdW5jdGlvbiAqLworICAgIGludCBzdGVfdW5vcHRpbWl6ZWQ7ICAgICAvKiBmYWxzZSBpZiBuYW1lc3BhY2UgaXMgb3B0aW1pemVkICovCisgICAgaW50IHN0ZV9uZXN0ZWQ7ICAgICAgLyogdHJ1ZSBpZiBibG9jayBpcyBuZXN0ZWQgKi8KKyAgICB1bnNpZ25lZCBzdGVfZnJlZSA6IDE7ICAgICAgICAvKiB0cnVlIGlmIGJsb2NrIGhhcyBmcmVlIHZhcmlhYmxlcyAqLworICAgIHVuc2lnbmVkIHN0ZV9jaGlsZF9mcmVlIDogMTsgIC8qIHRydWUgaWYgYSBjaGlsZCBibG9jayBoYXMgZnJlZSB2YXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyBmcmVlIHJlZnMgdG8gZ2xvYmFscyAqLworICAgIHVuc2lnbmVkIHN0ZV9nZW5lcmF0b3IgOiAxOyAgIC8qIHRydWUgaWYgbmFtZXNwYWNlIGlzIGEgZ2VuZXJhdG9yICovCisgICAgdW5zaWduZWQgc3RlX3ZhcmFyZ3MgOiAxOyAgICAgLyogdHJ1ZSBpZiBibG9jayBoYXMgdmFyYXJncyAqLworICAgIHVuc2lnbmVkIHN0ZV92YXJrZXl3b3JkcyA6IDE7IC8qIHRydWUgaWYgYmxvY2sgaGFzIHZhcmtleXdvcmRzICovCisgICAgdW5zaWduZWQgc3RlX3JldHVybnNfdmFsdWUgOiAxOyAgLyogdHJ1ZSBpZiBuYW1lc3BhY2UgdXNlcyByZXR1cm4gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFyZ3VtZW50ICovCisgICAgaW50IHN0ZV9saW5lbm87ICAgICAgICAgIC8qIGZpcnN0IGxpbmUgb2YgYmxvY2sgKi8KKyAgICBpbnQgc3RlX29wdF9saW5lbm87ICAgICAgLyogbGluZW5vIG9mIGxhc3QgZXhlYyBvciBpbXBvcnQgKiAqLworICAgIGludCBzdGVfdG1wbmFtZTsgICAgICAgICAvKiBjb3VudGVyIGZvciBsaXN0Y29tcCB0ZW1wIHZhcnMgKi8KKyAgICBzdHJ1Y3Qgc3ltdGFibGUgKnN0ZV90YWJsZTsKK30gUHlTVEVudHJ5T2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlTVEVudHJ5X1R5cGU7CisKKyNkZWZpbmUgUHlTVEVudHJ5X0NoZWNrKG9wKSAoUHlfVFlQRShvcCkgPT0gJlB5U1RFbnRyeV9UeXBlKQorCitQeUFQSV9GVU5DKGludCkgUHlTVF9HZXRTY29wZShQeVNURW50cnlPYmplY3QgKiwgUHlPYmplY3QgKik7CisKK1B5QVBJX0ZVTkMoc3RydWN0IHN5bXRhYmxlICopIFB5U3ltdGFibGVfQnVpbGQobW9kX3R5LCBjb25zdCBjaGFyICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlGdXR1cmVGZWF0dXJlcyAqKTsKK1B5QVBJX0ZVTkMoUHlTVEVudHJ5T2JqZWN0ICopIFB5U3ltdGFibGVfTG9va3VwKHN0cnVjdCBzeW10YWJsZSAqLCB2b2lkICopOworCitQeUFQSV9GVU5DKHZvaWQpIFB5U3ltdGFibGVfRnJlZShzdHJ1Y3Qgc3ltdGFibGUgKik7CisKKy8qIEZsYWdzIGZvciBkZWYtdXNlIGluZm9ybWF0aW9uICovCisKKyNkZWZpbmUgREVGX0dMT0JBTCAxICAgICAgICAgICAvKiBnbG9iYWwgc3RtdCAqLworI2RlZmluZSBERUZfTE9DQUwgMiAgICAgICAgICAgIC8qIGFzc2lnbm1lbnQgaW4gY29kZSBibG9jayAqLworI2RlZmluZSBERUZfUEFSQU0gMjw8MSAgICAgICAgIC8qIGZvcm1hbCBwYXJhbWV0ZXIgKi8KKyNkZWZpbmUgVVNFIDI8PDIgICAgICAgICAgICAgICAvKiBuYW1lIGlzIHVzZWQgKi8KKyNkZWZpbmUgREVGX0ZSRUUgMjw8MyAgICAgICAgIC8qIG5hbWUgdXNlZCBidXQgbm90IGRlZmluZWQgaW4gbmVzdGVkIGJsb2NrICovCisjZGVmaW5lIERFRl9GUkVFX0NMQVNTIDI8PDQgICAgLyogZnJlZSB2YXJpYWJsZSBmcm9tIGNsYXNzJ3MgbWV0aG9kICovCisjZGVmaW5lIERFRl9JTVBPUlQgMjw8NSAgICAgICAgLyogYXNzaWdubWVudCBvY2N1cnJlZCB2aWEgaW1wb3J0ICovCisKKyNkZWZpbmUgREVGX0JPVU5EIChERUZfTE9DQUwgfCBERUZfUEFSQU0gfCBERUZfSU1QT1JUKQorCisvKiBHTE9CQUxfRVhQTElDSVQgYW5kIEdMT0JBTF9JTVBMSUNJVCBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBzeW1ib2wKKyAgIHRhYmxlLiAgR0xPQkFMIGlzIHJldHVybmVkIGZyb20gUHlTVF9HZXRTY29wZSgpIGZvciBlaXRoZXIgb2YgdGhlbS4KKyAgIEl0IGlzIHN0b3JlZCBpbiBzdGVfc3ltYm9scyBhdCBiaXRzIDEyLTE0LgorKi8KKyNkZWZpbmUgU0NPUEVfT0ZGIDExCisjZGVmaW5lIFNDT1BFX01BU0sgNworCisjZGVmaW5lIExPQ0FMIDEKKyNkZWZpbmUgR0xPQkFMX0VYUExJQ0lUIDIKKyNkZWZpbmUgR0xPQkFMX0lNUExJQ0lUIDMKKyNkZWZpbmUgRlJFRSA0CisjZGVmaW5lIENFTEwgNQorCisvKiBUaGUgZm9sbG93aW5nIHRocmVlIG5hbWVzIGFyZSB1c2VkIGZvciB0aGUgc3RlX3Vub3B0aW1pemVkIGJpdCBmaWVsZCAqLworI2RlZmluZSBPUFRfSU1QT1JUX1NUQVIgMQorI2RlZmluZSBPUFRfRVhFQyAyCisjZGVmaW5lIE9QVF9CQVJFX0VYRUMgNAorI2RlZmluZSBPUFRfVE9QTEVWRUwgOCAgLyogdG9wLWxldmVsIG5hbWVzLCBpbmNsdWRpbmcgZXZhbCBhbmQgZXhlYyAqLworCisjZGVmaW5lIEdFTkVSQVRPUiAxCisjZGVmaW5lIEdFTkVSQVRPUl9FWFBSRVNTSU9OIDIKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfU1lNVEFCTEVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvc3lzbW9kdWxlLmggYi9pbmNsdWRlL3B5dGhvbjIuNy9zeXNtb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjk2MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvc3lzbW9kdWxlLmgKQEAgLTAsMCArMSwyOSBAQAorCisvKiBTeXN0ZW0gbW9kdWxlIGludGVyZmFjZSAqLworCisjaWZuZGVmIFB5X1NZU01PRFVMRV9ICisjZGVmaW5lIFB5X1NZU01PRFVMRV9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlTeXNfR2V0T2JqZWN0KGNoYXIgKik7CitQeUFQSV9GVU5DKGludCkgUHlTeXNfU2V0T2JqZWN0KGNoYXIgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKEZJTEUgKikgUHlTeXNfR2V0RmlsZShjaGFyICosIEZJTEUgKik7CitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1NldEFyZ3YoaW50LCBjaGFyICoqKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlTeXNfU2V0QXJndkV4KGludCwgY2hhciAqKiwgaW50KTsKK1B5QVBJX0ZVTkModm9pZCkgUHlTeXNfU2V0UGF0aChjaGFyICopOworCitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1dyaXRlU3Rkb3V0KGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorCQkJUHlfR0NDX0FUVFJJQlVURSgoZm9ybWF0KHByaW50ZiwgMSwgMikpKTsKK1B5QVBJX0ZVTkModm9pZCkgUHlTeXNfV3JpdGVTdGRlcnIoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCisJCQlQeV9HQ0NfQVRUUklCVVRFKChmb3JtYXQocHJpbnRmLCAxLCAyKSkpOworCitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX1Jlc2V0V2Fybk9wdGlvbnModm9pZCk7CitQeUFQSV9GVU5DKHZvaWQpIFB5U3lzX0FkZFdhcm5PcHRpb24oY2hhciAqKTsKK1B5QVBJX0ZVTkMoaW50KSBQeVN5c19IYXNXYXJuT3B0aW9ucyh2b2lkKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfU1lTTU9EVUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3RpbWVmdW5jcy5oIGIvaW5jbHVkZS9weXRob24yLjcvdGltZWZ1bmNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkMjZhNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3RpbWVmdW5jcy5oCkBAIC0wLDAgKzEsMjYgQEAKKy8qICB0aW1lZnVuY3MuaAorICovCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gcmVsYXRlZCB0byB0aW1lbW9kdWxlLmMuICovCisKKyNpZm5kZWYgVElNRUZVTkNTX0gKKyNkZWZpbmUgVElNRUZVTkNTX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCisvKiBDYXN0IGRvdWJsZSB4IHRvIHRpbWVfdCwgYnV0IHJhaXNlIFZhbHVlRXJyb3IgaWYgeCBpcyB0b28gbGFyZ2UKKyAqIHRvIGZpdCBpbiBhIHRpbWVfdC4gIFZhbHVlRXJyb3IgaXMgc2V0IG9uIHJldHVybiBpZmYgdGhlIHJldHVybgorICogdmFsdWUgaXMgKHRpbWVfdCktMSBhbmQgUHlFcnJfT2NjdXJyZWQoKS4KKyAqLworUHlBUElfRlVOQyh0aW1lX3QpIF9QeVRpbWVfRG91YmxlVG9UaW1ldChkb3VibGUgeCk7CisKKy8qIEdldCB0aGUgY3VycmVudCB0aW1lIHNpbmNlIHRoZSBlcG9jaCBpbiBzZWNvbmRzICovCitQeUFQSV9GVU5DKGRvdWJsZSkgX1B5VGltZV9GbG9hdFRpbWUodm9pZCk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAgLyogVElNRUZVTkNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3Rva2VuLmggYi9pbmNsdWRlL3B5dGhvbjIuNy90b2tlbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNjU5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy90b2tlbi5oCkBAIC0wLDAgKzEsODUgQEAKKworLyogVG9rZW4gdHlwZXMgKi8KKworI2lmbmRlZiBQeV9UT0tFTl9ICisjZGVmaW5lIFB5X1RPS0VOX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI3VuZGVmIFRJTERFICAgLyogUHJldmVudCBjbGFzaCBvZiBvdXIgZGVmaW5pdGlvbiB3aXRoIHN5c3RlbSBtYWNyby4gRXggQUlYLCBpb2N0bC5oICovCisKKyNkZWZpbmUgRU5ETUFSS0VSCTAKKyNkZWZpbmUgTkFNRQkJMQorI2RlZmluZSBOVU1CRVIJCTIKKyNkZWZpbmUgU1RSSU5HCQkzCisjZGVmaW5lIE5FV0xJTkUJCTQKKyNkZWZpbmUgSU5ERU5UCQk1CisjZGVmaW5lIERFREVOVAkJNgorI2RlZmluZSBMUEFSCQk3CisjZGVmaW5lIFJQQVIJCTgKKyNkZWZpbmUgTFNRQgkJOQorI2RlZmluZSBSU1FCCQkxMAorI2RlZmluZSBDT0xPTgkJMTEKKyNkZWZpbmUgQ09NTUEJCTEyCisjZGVmaW5lIFNFTUkJCTEzCisjZGVmaW5lIFBMVVMJCTE0CisjZGVmaW5lIE1JTlVTCQkxNQorI2RlZmluZSBTVEFSCQkxNgorI2RlZmluZSBTTEFTSAkJMTcKKyNkZWZpbmUgVkJBUgkJMTgKKyNkZWZpbmUgQU1QRVIJCTE5CisjZGVmaW5lIExFU1MJCTIwCisjZGVmaW5lIEdSRUFURVIJCTIxCisjZGVmaW5lIEVRVUFMCQkyMgorI2RlZmluZSBET1QJCTIzCisjZGVmaW5lIFBFUkNFTlQJCTI0CisjZGVmaW5lIEJBQ0tRVU9URQkyNQorI2RlZmluZSBMQlJBQ0UJCTI2CisjZGVmaW5lIFJCUkFDRQkJMjcKKyNkZWZpbmUgRVFFUVVBTAkJMjgKKyNkZWZpbmUgTk9URVFVQUwJMjkKKyNkZWZpbmUgTEVTU0VRVUFMCTMwCisjZGVmaW5lIEdSRUFURVJFUVVBTAkzMQorI2RlZmluZSBUSUxERQkJMzIKKyNkZWZpbmUgQ0lSQ1VNRkxFWAkzMworI2RlZmluZSBMRUZUU0hJRlQJMzQKKyNkZWZpbmUgUklHSFRTSElGVAkzNQorI2RlZmluZSBET1VCTEVTVEFSCTM2CisjZGVmaW5lIFBMVVNFUVVBTAkzNworI2RlZmluZSBNSU5FUVVBTAkzOAorI2RlZmluZSBTVEFSRVFVQUwJMzkKKyNkZWZpbmUgU0xBU0hFUVVBTAk0MAorI2RlZmluZSBQRVJDRU5URVFVQUwJNDEKKyNkZWZpbmUgQU1QRVJFUVVBTAk0MgorI2RlZmluZSBWQkFSRVFVQUwJNDMKKyNkZWZpbmUgQ0lSQ1VNRkxFWEVRVUFMCTQ0CisjZGVmaW5lIExFRlRTSElGVEVRVUFMCTQ1CisjZGVmaW5lIFJJR0hUU0hJRlRFUVVBTAk0NgorI2RlZmluZSBET1VCTEVTVEFSRVFVQUwJNDcKKyNkZWZpbmUgRE9VQkxFU0xBU0gJNDgKKyNkZWZpbmUgRE9VQkxFU0xBU0hFUVVBTCA0OQorI2RlZmluZSBBVCAgICAgICAgICAgICAgNTAJCisvKiBEb24ndCBmb3JnZXQgdG8gdXBkYXRlIHRoZSB0YWJsZSBfUHlQYXJzZXJfVG9rZW5OYW1lcyBpbiB0b2tlbml6ZXIuYyEgKi8KKyNkZWZpbmUgT1AJCTUxCisjZGVmaW5lIEVSUk9SVE9LRU4JNTIKKyNkZWZpbmUgTl9UT0tFTlMJNTMKKworLyogU3BlY2lhbCBkZWZpbml0aW9ucyBmb3IgY29vcGVyYXRpb24gd2l0aCBwYXJzZXIgKi8KKworI2RlZmluZSBOVF9PRkZTRVQJCTI1NgorCisjZGVmaW5lIElTVEVSTUlOQUwoeCkJCSgoeCkgPCBOVF9PRkZTRVQpCisjZGVmaW5lIElTTk9OVEVSTUlOQUwoeCkJKCh4KSA+PSBOVF9PRkZTRVQpCisjZGVmaW5lIElTRU9GKHgpCQkoKHgpID09IEVORE1BUktFUikKKworCitQeUFQSV9EQVRBKGNoYXIgKikgX1B5UGFyc2VyX1Rva2VuTmFtZXNbXTsgLyogVG9rZW4gbmFtZXMgKi8KK1B5QVBJX0ZVTkMoaW50KSBQeVRva2VuX09uZUNoYXIoaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeVRva2VuX1R3b0NoYXJzKGludCwgaW50KTsKK1B5QVBJX0ZVTkMoaW50KSBQeVRva2VuX1RocmVlQ2hhcnMoaW50LCBpbnQsIGludCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1RPS0VOX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3RyYWNlYmFjay5oIGIvaW5jbHVkZS9weXRob24yLjcvdHJhY2ViYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5NDNkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3RyYWNlYmFjay5oCkBAIC0wLDAgKzEsMzEgQEAKKworI2lmbmRlZiBQeV9UUkFDRUJBQ0tfSAorI2RlZmluZSBQeV9UUkFDRUJBQ0tfSAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgX2ZyYW1lOworCisvKiBUcmFjZWJhY2sgaW50ZXJmYWNlICovCisKK3R5cGVkZWYgc3RydWN0IF90cmFjZWJhY2sgeworCVB5T2JqZWN0X0hFQUQKKwlzdHJ1Y3QgX3RyYWNlYmFjayAqdGJfbmV4dDsKKwlzdHJ1Y3QgX2ZyYW1lICp0Yl9mcmFtZTsKKwlpbnQgdGJfbGFzdGk7CisJaW50IHRiX2xpbmVubzsKK30gUHlUcmFjZWJhY2tPYmplY3Q7CisKK1B5QVBJX0ZVTkMoaW50KSBQeVRyYWNlQmFja19IZXJlKHN0cnVjdCBfZnJhbWUgKik7CitQeUFQSV9GVU5DKGludCkgUHlUcmFjZUJhY2tfUHJpbnQoUHlPYmplY3QgKiwgUHlPYmplY3QgKik7CitQeUFQSV9GVU5DKGludCkgX1B5X0Rpc3BsYXlTb3VyY2VMaW5lKFB5T2JqZWN0ICosIGNvbnN0IGNoYXIgKiwgaW50LCBpbnQpOworCisvKiBSZXZlYWwgdHJhY2ViYWNrIHR5cGUgc28gd2UgY2FuIHR5cGVjaGVjayB0cmFjZWJhY2sgb2JqZWN0cyAqLworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5VHJhY2VCYWNrX1R5cGU7CisjZGVmaW5lIFB5VHJhY2VCYWNrX0NoZWNrKHYpIChQeV9UWVBFKHYpID09ICZQeVRyYWNlQmFja19UeXBlKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9UUkFDRUJBQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9weXRob24yLjcvdHVwbGVvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3R1cGxlb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhYjczMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3R1cGxlb2JqZWN0LmgKQEAgLTAsMCArMSw2MSBAQAorCisvKiBUdXBsZSBvYmplY3QgaW50ZXJmYWNlICovCisKKyNpZm5kZWYgUHlfVFVQTEVPQkpFQ1RfSAorI2RlZmluZSBQeV9UVVBMRU9CSkVDVF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCitBbm90aGVyIGdlbmVyYWxseSB1c2VmdWwgb2JqZWN0IHR5cGUgaXMgYSB0dXBsZSBvZiBvYmplY3QgcG9pbnRlcnMuCitGb3IgUHl0aG9uLCB0aGlzIGlzIGFuIGltbXV0YWJsZSB0eXBlLiAgQyBjb2RlIGNhbiBjaGFuZ2UgdGhlIHR1cGxlIGl0ZW1zCisoYnV0IG5vdCB0aGVpciBudW1iZXIpLCBhbmQgZXZlbiB1c2UgdHVwbGVzIGFyZSBnZW5lcmFsLXB1cnBvc2UgYXJyYXlzIG9mCitvYmplY3QgcmVmZXJlbmNlcywgYnV0IGluIGdlbmVyYWwgb25seSBicmFuZCBuZXcgdHVwbGVzIHNob3VsZCBiZSBtdXRhdGVkLAorbm90IG9uZXMgdGhhdCBtaWdodCBhbHJlYWR5IGhhdmUgYmVlbiBleHBvc2VkIHRvIFB5dGhvbiBjb2RlLgorCisqKiogV0FSTklORyAqKiogUHlUdXBsZV9TZXRJdGVtIGRvZXMgbm90IGluY3JlbWVudCB0aGUgbmV3IGl0ZW0ncyByZWZlcmVuY2UKK2NvdW50LCBidXQgZG9lcyBkZWNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgaXRlbSBpdCByZXBsYWNlcywKK2lmIG5vdCBuaWwuICBJdCBkb2VzICpkZWNyZW1lbnQqIHRoZSByZWZlcmVuY2UgY291bnQgaWYgaXQgaXMgKm5vdCoKK2luc2VydGVkIGluIHRoZSB0dXBsZS4gIFNpbWlsYXJseSwgUHlUdXBsZV9HZXRJdGVtIGRvZXMgbm90IGluY3JlbWVudCB0aGUKK3JldHVybmVkIGl0ZW0ncyByZWZlcmVuY2UgY291bnQuCisqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgUHlPYmplY3RfVkFSX0hFQUQKKyAgICBQeU9iamVjdCAqb2JfaXRlbVsxXTsKKworICAgIC8qIG9iX2l0ZW0gY29udGFpbnMgc3BhY2UgZm9yICdvYl9zaXplJyBlbGVtZW50cy4KKyAgICAgKiBJdGVtcyBtdXN0IG5vcm1hbGx5IG5vdCBiZSBOVUxMLCBleGNlcHQgZHVyaW5nIGNvbnN0cnVjdGlvbiB3aGVuCisgICAgICogdGhlIHR1cGxlIGlzIG5vdCB5ZXQgdmlzaWJsZSBvdXRzaWRlIHRoZSBmdW5jdGlvbiB0aGF0IGJ1aWxkcyBpdC4KKyAgICAgKi8KK30gUHlUdXBsZU9iamVjdDsKKworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIFB5VHVwbGVfVHlwZTsKKworI2RlZmluZSBQeVR1cGxlX0NoZWNrKG9wKSBcCisgICAgICAgICAgICAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfVFVQTEVfU1VCQ0xBU1MpCisjZGVmaW5lIFB5VHVwbGVfQ2hlY2tFeGFjdChvcCkgKFB5X1RZUEUob3ApID09ICZQeVR1cGxlX1R5cGUpCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlUdXBsZV9OZXcoUHlfc3NpemVfdCBzaXplKTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgUHlUdXBsZV9TaXplKFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVR1cGxlX0dldEl0ZW0oUHlPYmplY3QgKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKGludCkgUHlUdXBsZV9TZXRJdGVtKFB5T2JqZWN0ICosIFB5X3NzaXplX3QsIFB5T2JqZWN0ICopOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVR1cGxlX0dldFNsaWNlKFB5T2JqZWN0ICosIFB5X3NzaXplX3QsIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIF9QeVR1cGxlX1Jlc2l6ZShQeU9iamVjdCAqKiwgUHlfc3NpemVfdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VHVwbGVfUGFjayhQeV9zc2l6ZV90LCAuLi4pOworUHlBUElfRlVOQyh2b2lkKSBfUHlUdXBsZV9NYXliZVVudHJhY2soUHlPYmplY3QgKik7CisKKy8qIE1hY3JvLCB0cmFkaW5nIHNhZmV0eSBmb3Igc3BlZWQgKi8KKyNkZWZpbmUgUHlUdXBsZV9HRVRfSVRFTShvcCwgaSkgKCgoUHlUdXBsZU9iamVjdCAqKShvcCkpLT5vYl9pdGVtW2ldKQorI2RlZmluZSBQeVR1cGxlX0dFVF9TSVpFKG9wKSAgICBQeV9TSVpFKG9wKQorCisvKiBNYWNybywgKm9ubHkqIHRvIGJlIHVzZWQgdG8gZmlsbCBpbiBicmFuZCBuZXcgdHVwbGVzICovCisjZGVmaW5lIFB5VHVwbGVfU0VUX0lURU0ob3AsIGksIHYpICgoKFB5VHVwbGVPYmplY3QgKikob3ApKS0+b2JfaXRlbVtpXSA9IHYpCisKK1B5QVBJX0ZVTkMoaW50KSBQeVR1cGxlX0NsZWFyRnJlZUxpc3Qodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogIVB5X1RVUExFT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3Vjbmhhc2guaCBiL2luY2x1ZGUvcHl0aG9uMi43L3Vjbmhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWI3Nzc0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvdWNuaGFzaC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIFVuaWNvZGUgbmFtZSBkYXRhYmFzZSBpbnRlcmZhY2UgKi8KKworI2lmbmRlZiBQeV9VQ05IQVNIX0gKKyNkZWZpbmUgUHlfVUNOSEFTSF9ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qIHJldmlzZWQgdWNuaGFzaCBDQVBJIGludGVyZmFjZSAoZXhwb3J0ZWQgdGhyb3VnaCBhICJ3cmFwcGVyIikgKi8KKworI2RlZmluZSBQeVVuaWNvZGVEYXRhX0NBUFNVTEVfTkFNRSAidW5pY29kZWRhdGEudWNuaGFzaF9DQVBJIgorCit0eXBlZGVmIHN0cnVjdCB7CisKKyAgICAvKiBTaXplIG9mIHRoaXMgc3RydWN0ICovCisgICAgaW50IHNpemU7CisKKyAgICAvKiBHZXQgbmFtZSBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIgY29kZS4gIFJldHVybnMgbm9uLXplcm8gaWYKKyAgICAgICBzdWNjZXNzLCB6ZXJvIGlmIG5vdC4gIERvZXMgbm90IHNldCBQeXRob24gZXhjZXB0aW9ucy4gCisgICAgICAgSWYgc2VsZiBpcyBOVUxMLCBkYXRhIGNvbWUgZnJvbSB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBkYXRhYmFzZS4KKyAgICAgICBJZiBpdCBpcyBub3QgTlVMTCwgaXQgc2hvdWxkIGJlIGEgdW5pY29kZWRhdGEudWNkX1hfWV9aIG9iamVjdCAqLworICAgIGludCAoKmdldG5hbWUpKFB5T2JqZWN0ICpzZWxmLCBQeV9VQ1M0IGNvZGUsIGNoYXIqIGJ1ZmZlciwgaW50IGJ1Zmxlbik7CisKKyAgICAvKiBHZXQgY2hhcmFjdGVyIGNvZGUgZm9yIGEgZ2l2ZW4gbmFtZS4gIFNhbWUgZXJyb3IgaGFuZGxpbmcKKyAgICAgICBhcyBmb3IgZ2V0bmFtZS4gKi8KKyAgICBpbnQgKCpnZXRjb2RlKShQeU9iamVjdCAqc2VsZiwgY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4sIFB5X1VDUzQqIGNvZGUpOworCit9IF9QeVVuaWNvZGVfTmFtZV9DQVBJOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9VQ05IQVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3VuaWNvZGVvYmplY3QuaCBiL2luY2x1ZGUvcHl0aG9uMi43L3VuaWNvZGVvYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWI3MjRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9weXRob24yLjcvdW5pY29kZW9iamVjdC5oCkBAIC0wLDAgKzEsMTQxMyBAQAorI2lmbmRlZiBQeV9VTklDT0RFT0JKRUNUX0gKKyNkZWZpbmUgUHlfVU5JQ09ERU9CSkVDVF9ICisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyoKKworVW5pY29kZSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBvcmlnaW5hbCBjb2RlIGJ5IEZyZWRyaWsgTHVuZGgsCittb2RpZmllZCBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkgYWNjb3JkaW5nIHRvIHRoZQorVW5pY29kZSBJbnRlZ3JhdGlvbiBQcm9wb3NhbCAoc2VlIGZpbGUgTWlzYy91bmljb2RlLnR4dCkuCisKK0NvcHlyaWdodCAoYykgQ29ycG9yYXRpb24gZm9yIE5hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzLgorCisKKyBPcmlnaW5hbCBoZWFkZXI6CisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICogWWV0IGFub3RoZXIgVW5pY29kZSBzdHJpbmcgdHlwZSBmb3IgUHl0aG9uLiAgVGhpcyB0eXBlIHN1cHBvcnRzIHRoZQorICogMTYtYml0IEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSBvbmx5LgorICoKKyAqIFdyaXR0ZW4gYnkgRnJlZHJpayBMdW5kaCwgSmFudWFyeSAxOTk5LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5OSBieSBTZWNyZXQgTGFicyBBQi4KKyAqIENvcHlyaWdodCAoYykgMTk5OSBieSBGcmVkcmlrIEx1bmRoLgorICoKKyAqIGZyZWRyaWtAcHl0aG9ud2FyZS5jb20KKyAqIGh0dHA6Ly93d3cucHl0aG9ud2FyZS5jb20KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBVbmljb2RlIFN0cmluZyBUeXBlIGlzCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk5IGJ5IFNlY3JldCBMYWJzIEFCCisgKiBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgRnJlZHJpayBMdW5kaAorICoKKyAqIEJ5IG9idGFpbmluZywgdXNpbmcsIGFuZC9vciBjb3B5aW5nIHRoaXMgc29mdHdhcmUgYW5kL29yIGl0cworICogYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLCB5b3UgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLAorICogYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieQorICogZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluIGFsbAorICogY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZQorICogYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgU2VjcmV0IExhYnMKKyAqIEFCIG9yIHRoZSBhdXRob3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8KKyAqIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorICogcGVybWlzc2lvbi4KKyAqCisgKiBTRUNSRVQgTEFCUyBBQiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KKyAqIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKKyAqIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBTRUNSRVQgTEFCUyBBQiBPUiBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyAqIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKworLyogPT09IEludGVybmFsIEFQSSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qIC0tLSBJbnRlcm5hbCBVbmljb2RlIEZvcm1hdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIFB5X1VTSU5HX1VOSUNPREUKKworI2RlZmluZSBQeVVuaWNvZGVfQ2hlY2sob3ApICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFB5VW5pY29kZV9DaGVja0V4YWN0KG9wKSAgICAgICAgICAgIDAKKworI2Vsc2UKKworLyogRklYTUU6IE12TCdzIG5ldyBpbXBsZW1lbnRhdGlvbiBhc3N1bWVzIHRoYXQgUHlfVU5JQ09ERV9TSVpFIGlzCisgICBwcm9wZXJseSBzZXQsIGJ1dCB0aGUgZGVmYXVsdCBydWxlcyBiZWxvdyBkb2Vzbid0IHNldCBpdC4gIEknbGwKKyAgIHNvcnQgdGhpcyBvdXQgc29tZSBvdGhlciBkYXkgLS0gZnJlZHJpa0BweXRob253YXJlLmNvbSAqLworCisjaWZuZGVmIFB5X1VOSUNPREVfU0laRQorI2Vycm9yIE11c3QgZGVmaW5lIFB5X1VOSUNPREVfU0laRQorI2VuZGlmCisKKy8qIFNldHRpbmcgUHlfVU5JQ09ERV9XSURFIGVuYWJsZXMgVUNTLTQgc3RvcmFnZS4gIE90aGVyd2lzZSwgVW5pY29kZQorICAgc3RyaW5ncyBhcmUgc3RvcmVkIGFzIFVDUy0yICh3aXRoIGxpbWl0ZWQgc3VwcG9ydCBmb3IgVVRGLTE2KSAqLworCisjaWYgUHlfVU5JQ09ERV9TSVpFID49IDQKKyNkZWZpbmUgUHlfVU5JQ09ERV9XSURFCisjZW5kaWYKKworLyogU2V0IHRoZXNlIGZsYWdzIGlmIHRoZSBwbGF0Zm9ybSBoYXMgIndjaGFyLmgiLCAid2N0eXBlLmgiIGFuZCB0aGUKKyAgIHdjaGFyX3QgdHlwZSBpcyBhIDE2LWJpdCB1bnNpZ25lZCB0eXBlICovCisvKiAjZGVmaW5lIEhBVkVfV0NIQVJfSCAqLworLyogI2RlZmluZSBIQVZFX1VTQUJMRV9XQ0hBUl9UICovCisKKy8qIERlZmF1bHRzIGZvciB2YXJpb3VzIHBsYXRmb3JtcyAqLworI2lmbmRlZiBQWV9VTklDT0RFX1RZUEUKKworLyogV2luZG93cyBoYXMgYSB1c2FibGUgd2NoYXJfdCB0eXBlICh1bmxlc3Mgd2UncmUgdXNpbmcgVUNTLTQpICovCisjIGlmIGRlZmluZWQoTVNfV0lOMzIpICYmIFB5X1VOSUNPREVfU0laRSA9PSAyCisjICBkZWZpbmUgSEFWRV9VU0FCTEVfV0NIQVJfVAorIyAgZGVmaW5lIFBZX1VOSUNPREVfVFlQRSB3Y2hhcl90CisjIGVuZGlmCisKKyMgaWYgZGVmaW5lZChQeV9VTklDT0RFX1dJREUpCisjICBkZWZpbmUgUFlfVU5JQ09ERV9UWVBFIFB5X1VDUzQKKyMgZW5kaWYKKworI2VuZGlmCisKKy8qIElmIHRoZSBjb21waWxlciBwcm92aWRlcyBhIHdjaGFyX3QgdHlwZSB3ZSB0cnkgdG8gc3VwcG9ydCBpdAorICAgdGhyb3VnaCB0aGUgaW50ZXJmYWNlIGZ1bmN0aW9ucyBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyKCkgYW5kCisgICBQeVVuaWNvZGVfQXNXaWRlQ2hhcigpLiAqLworCisjaWZkZWYgSEFWRV9VU0FCTEVfV0NIQVJfVAorIyBpZm5kZWYgSEFWRV9XQ0hBUl9ICisjICBkZWZpbmUgSEFWRV9XQ0hBUl9ICisjIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIEhBVkVfV0NIQVJfSAorLyogV29yayBhcm91bmQgYSBjb3NtZXRpYyBidWcgaW4gQlNESSA0Lnggd2NoYXIuaDsgdGhhbmtzIHRvIFRob21hcyBXb3V0ZXJzICovCisjIGlmZGVmIF9IQVZFX0JTREkKKyMgIGluY2x1ZGUgPHRpbWUuaD4KKyMgZW5kaWYKKyMgIGluY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYKKworLyoKKyAqIFVzZSB0aGlzIHR5cGVkZWYgd2hlbiB5b3UgbmVlZCB0byByZXByZXNlbnQgYSBVVEYtMTYgc3Vycm9nYXRlIHBhaXIKKyAqIGFzIHNpbmdsZSB1bnNpZ25lZCBpbnRlZ2VyLgorICovCisjaWYgU0laRU9GX0lOVCA+PSA0Cit0eXBlZGVmIHVuc2lnbmVkIGludCBQeV9VQ1M0OworI2VsaWYgU0laRU9GX0xPTkcgPj0gNAordHlwZWRlZiB1bnNpZ25lZCBsb25nIFB5X1VDUzQ7CisjZW5kaWYKKworLyogUHlfVU5JQ09ERSBpcyB0aGUgbmF0aXZlIFVuaWNvZGUgc3RvcmFnZSBmb3JtYXQgKGNvZGUgdW5pdCkgdXNlZCBieQorICAgUHl0aG9uIGFuZCByZXByZXNlbnRzIGEgc2luZ2xlIFVuaWNvZGUgZWxlbWVudCBpbiB0aGUgVW5pY29kZQorICAgdHlwZS4gKi8KKwordHlwZWRlZiBQWV9VTklDT0RFX1RZUEUgUHlfVU5JQ09ERTsKKworLyogLS0tIFVDUy0yL1VDUy00IE5hbWUgTWFuZ2xpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFVuaWNvZGUgQVBJIG5hbWVzIGFyZSBtYW5nbGVkIHRvIGFzc3VyZSB0aGF0IFVDUy0yIGFuZCBVQ1MtNCBidWlsZHMKKyAgIHByb2R1Y2UgZGlmZmVyZW50IGV4dGVybmFsIG5hbWVzIGFuZCB0aHVzIGNhdXNlIGltcG9ydCBlcnJvcnMgaW4KKyAgIGNhc2UgUHl0aG9uIGludGVycHJldGVycyBhbmQgZXh0ZW5zaW9ucyB3aXRoIG1peGVkIGNvbXBpbGVkIGluCisgICBVbmljb2RlIHdpZHRoIGFzc3VtcHRpb25zIGFyZSBjb21iaW5lZC4gKi8KKworI2lmbmRlZiBQeV9VTklDT0RFX1dJREUKKworIyBkZWZpbmUgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcgUHlVbmljb2RlVUNTMl9Bc0FTQ0lJU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nIFB5VW5pY29kZVVDUzJfQXNDaGFybWFwU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0IFB5VW5pY29kZVVDUzJfQXNFbmNvZGVkT2JqZWN0CisjIGRlZmluZSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nIFB5VW5pY29kZVVDUzJfQXNFbmNvZGVkU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcgUHlVbmljb2RlVUNTMl9Bc0xhdGluMVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyBQeVVuaWNvZGVVQ1MyX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcgUHlVbmljb2RlVUNTMl9Bc1VURjMyU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVVEYxNlN0cmluZyBQeVVuaWNvZGVVQ1MyX0FzVVRGMTZTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VURjhTdHJpbmcgUHlVbmljb2RlVUNTMl9Bc1VURjhTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VuaWNvZGUgUHlVbmljb2RlVUNTMl9Bc1VuaWNvZGUKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcgUHlVbmljb2RlVUNTMl9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1dpZGVDaGFyIFB5VW5pY29kZVVDUzJfQXNXaWRlQ2hhcgorIyBkZWZpbmUgUHlVbmljb2RlX0NsZWFyRnJlZUxpc3QgUHlVbmljb2RlVUNTMl9DbGVhckZyZWVsaXN0CisjIGRlZmluZSBQeVVuaWNvZGVfQ29tcGFyZSBQeVVuaWNvZGVVQ1MyX0NvbXBhcmUKKyMgZGVmaW5lIFB5VW5pY29kZV9Db25jYXQgUHlVbmljb2RlVUNTMl9Db25jYXQKKyMgZGVmaW5lIFB5VW5pY29kZV9Db250YWlucyBQeVVuaWNvZGVVQ1MyX0NvbnRhaW5zCisjIGRlZmluZSBQeVVuaWNvZGVfQ291bnQgUHlVbmljb2RlVUNTMl9Db3VudAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZSBQeVVuaWNvZGVVQ1MyX0RlY29kZQorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZUFTQ0lJIFB5VW5pY29kZVVDUzJfRGVjb2RlQVNDSUkKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwIFB5VW5pY29kZVVDUzJfRGVjb2RlQ2hhcm1hcAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZUxhdGluMSBQeVVuaWNvZGVVQ1MyX0RlY29kZUxhdGluMQorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUgUHlVbmljb2RlVUNTMl9EZWNvZGVSYXdVbmljb2RlRXNjYXBlCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGMzIgUHlVbmljb2RlVUNTMl9EZWNvZGVVVEYzMgorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwgUHlVbmljb2RlVUNTMl9EZWNvZGVVVEYzMlN0YXRlZnVsCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGMTYgUHlVbmljb2RlVUNTMl9EZWNvZGVVVEYxNgorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwgUHlVbmljb2RlVUNTMl9EZWNvZGVVVEYxNlN0YXRlZnVsCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGOCBQeVVuaWNvZGVVQ1MyX0RlY29kZVVURjgKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwgUHlVbmljb2RlVUNTMl9EZWNvZGVVVEY4U3RhdGVmdWwKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlIFB5VW5pY29kZVVDUzJfRGVjb2RlVW5pY29kZUVzY2FwZQorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZSBQeVVuaWNvZGVVQ1MyX0VuY29kZQorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZUFTQ0lJIFB5VW5pY29kZVVDUzJfRW5jb2RlQVNDSUkKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVDaGFybWFwIFB5VW5pY29kZVVDUzJfRW5jb2RlQ2hhcm1hcAorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZURlY2ltYWwgUHlVbmljb2RlVUNTMl9FbmNvZGVEZWNpbWFsCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlTGF0aW4xIFB5VW5pY29kZVVDUzJfRW5jb2RlTGF0aW4xCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlUmF3VW5pY29kZUVzY2FwZSBQeVVuaWNvZGVVQ1MyX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVVVEYzMiBQeVVuaWNvZGVVQ1MyX0VuY29kZVVURjMyCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlVVRGMTYgUHlVbmljb2RlVUNTMl9FbmNvZGVVVEYxNgorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVVURjggUHlVbmljb2RlVUNTMl9FbmNvZGVVVEY4CisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlVW5pY29kZUVzY2FwZSBQeVVuaWNvZGVVQ1MyX0VuY29kZVVuaWNvZGVFc2NhcGUKKyMgZGVmaW5lIFB5VW5pY29kZV9GaW5kIFB5VW5pY29kZVVDUzJfRmluZAorIyBkZWZpbmUgUHlVbmljb2RlX0Zvcm1hdCBQeVVuaWNvZGVVQ1MyX0Zvcm1hdAorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0IFB5VW5pY29kZVVDUzJfRnJvbUVuY29kZWRPYmplY3QKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tRm9ybWF0IFB5VW5pY29kZVVDUzJfRnJvbUZvcm1hdAorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21Gb3JtYXRWIFB5VW5pY29kZVVDUzJfRnJvbUZvcm1hdFYKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tT2JqZWN0IFB5VW5pY29kZVVDUzJfRnJvbU9iamVjdAorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21PcmRpbmFsIFB5VW5pY29kZVVDUzJfRnJvbU9yZGluYWwKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tU3RyaW5nIFB5VW5pY29kZVVDUzJfRnJvbVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplIFB5VW5pY29kZVVDUzJfRnJvbVN0cmluZ0FuZFNpemUKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tVW5pY29kZSBQeVVuaWNvZGVVQ1MyX0Zyb21Vbmljb2RlCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyIFB5VW5pY29kZVVDUzJfRnJvbVdpZGVDaGFyCisjIGRlZmluZSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nIFB5VW5pY29kZVVDUzJfR2V0RGVmYXVsdEVuY29kaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfR2V0TWF4IFB5VW5pY29kZVVDUzJfR2V0TWF4CisjIGRlZmluZSBQeVVuaWNvZGVfR2V0U2l6ZSBQeVVuaWNvZGVVQ1MyX0dldFNpemUKKyMgZGVmaW5lIFB5VW5pY29kZV9Kb2luIFB5VW5pY29kZVVDUzJfSm9pbgorIyBkZWZpbmUgUHlVbmljb2RlX1BhcnRpdGlvbiBQeVVuaWNvZGVVQ1MyX1BhcnRpdGlvbgorIyBkZWZpbmUgUHlVbmljb2RlX1JQYXJ0aXRpb24gUHlVbmljb2RlVUNTMl9SUGFydGl0aW9uCisjIGRlZmluZSBQeVVuaWNvZGVfUlNwbGl0IFB5VW5pY29kZVVDUzJfUlNwbGl0CisjIGRlZmluZSBQeVVuaWNvZGVfUmVwbGFjZSBQeVVuaWNvZGVVQ1MyX1JlcGxhY2UKKyMgZGVmaW5lIFB5VW5pY29kZV9SZXNpemUgUHlVbmljb2RlVUNTMl9SZXNpemUKKyMgZGVmaW5lIFB5VW5pY29kZV9SaWNoQ29tcGFyZSBQeVVuaWNvZGVVQ1MyX1JpY2hDb21wYXJlCisjIGRlZmluZSBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nIFB5VW5pY29kZVVDUzJfU2V0RGVmYXVsdEVuY29kaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfU3BsaXQgUHlVbmljb2RlVUNTMl9TcGxpdAorIyBkZWZpbmUgUHlVbmljb2RlX1NwbGl0bGluZXMgUHlVbmljb2RlVUNTMl9TcGxpdGxpbmVzCisjIGRlZmluZSBQeVVuaWNvZGVfVGFpbG1hdGNoIFB5VW5pY29kZVVDUzJfVGFpbG1hdGNoCisjIGRlZmluZSBQeVVuaWNvZGVfVHJhbnNsYXRlIFB5VW5pY29kZVVDUzJfVHJhbnNsYXRlCisjIGRlZmluZSBQeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcCBQeVVuaWNvZGVVQ1MyX1RyYW5zbGF0ZUNoYXJtYXAKKyMgZGVmaW5lIF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyBfUHlVbmljb2RlVUNTMl9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nCisjIGRlZmluZSBfUHlVbmljb2RlX0ZpbmkgX1B5VW5pY29kZVVDUzJfRmluaQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jbml0IF9QeVVuaWNvZGVVQ1MyX0luaXQKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNBbHBoYSBfUHlVbmljb2RlVUNTMl9Jc0FscGhhCisjIGRlZmluZSBfUHlVbmljb2RlX0lzRGVjaW1hbERpZ2l0IF9QeVVuaWNvZGVVQ1MyX0lzRGVjaW1hbERpZ2l0CisjIGRlZmluZSBfUHlVbmljb2RlX0lzRGlnaXQgX1B5VW5pY29kZVVDUzJfSXNEaWdpdAorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0xpbmVicmVhayBfUHlVbmljb2RlVUNTMl9Jc0xpbmVicmVhaworIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0xvd2VyY2FzZSBfUHlVbmljb2RlVUNTMl9Jc0xvd2VyY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc051bWVyaWMgX1B5VW5pY29kZVVDUzJfSXNOdW1lcmljCisjIGRlZmluZSBfUHlVbmljb2RlX0lzVGl0bGVjYXNlIF9QeVVuaWNvZGVVQ1MyX0lzVGl0bGVjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX0lzVXBwZXJjYXNlIF9QeVVuaWNvZGVVQ1MyX0lzVXBwZXJjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX0lzV2hpdGVzcGFjZSBfUHlVbmljb2RlVUNTMl9Jc1doaXRlc3BhY2UKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9EZWNpbWFsRGlnaXQgX1B5VW5pY29kZVVDUzJfVG9EZWNpbWFsRGlnaXQKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9EaWdpdCBfUHlVbmljb2RlVUNTMl9Ub0RpZ2l0CisjIGRlZmluZSBfUHlVbmljb2RlX1RvTG93ZXJjYXNlIF9QeVVuaWNvZGVVQ1MyX1RvTG93ZXJjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX1RvTnVtZXJpYyBfUHlVbmljb2RlVUNTMl9Ub051bWVyaWMKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9UaXRsZWNhc2UgX1B5VW5pY29kZVVDUzJfVG9UaXRsZWNhc2UKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9VcHBlcmNhc2UgX1B5VW5pY29kZVVDUzJfVG9VcHBlcmNhc2UKKworI2Vsc2UKKworIyBkZWZpbmUgUHlVbmljb2RlX0FzQVNDSUlTdHJpbmcgUHlVbmljb2RlVUNTNF9Bc0FTQ0lJU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNDaGFybWFwU3RyaW5nIFB5VW5pY29kZVVDUzRfQXNDaGFybWFwU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0IFB5VW5pY29kZVVDUzRfQXNFbmNvZGVkT2JqZWN0CisjIGRlZmluZSBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nIFB5VW5pY29kZVVDUzRfQXNFbmNvZGVkU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNMYXRpbjFTdHJpbmcgUHlVbmljb2RlVUNTNF9Bc0xhdGluMVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZyBQeVVuaWNvZGVVQ1M0X0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcgUHlVbmljb2RlVUNTNF9Bc1VURjMyU3RyaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfQXNVVEYxNlN0cmluZyBQeVVuaWNvZGVVQ1M0X0FzVVRGMTZTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VURjhTdHJpbmcgUHlVbmljb2RlVUNTNF9Bc1VURjhTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VuaWNvZGUgUHlVbmljb2RlVUNTNF9Bc1VuaWNvZGUKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcgUHlVbmljb2RlVUNTNF9Bc1VuaWNvZGVFc2NhcGVTdHJpbmcKKyMgZGVmaW5lIFB5VW5pY29kZV9Bc1dpZGVDaGFyIFB5VW5pY29kZVVDUzRfQXNXaWRlQ2hhcgorIyBkZWZpbmUgUHlVbmljb2RlX0NsZWFyRnJlZUxpc3QgUHlVbmljb2RlVUNTNF9DbGVhckZyZWVsaXN0CisjIGRlZmluZSBQeVVuaWNvZGVfQ29tcGFyZSBQeVVuaWNvZGVVQ1M0X0NvbXBhcmUKKyMgZGVmaW5lIFB5VW5pY29kZV9Db25jYXQgUHlVbmljb2RlVUNTNF9Db25jYXQKKyMgZGVmaW5lIFB5VW5pY29kZV9Db250YWlucyBQeVVuaWNvZGVVQ1M0X0NvbnRhaW5zCisjIGRlZmluZSBQeVVuaWNvZGVfQ291bnQgUHlVbmljb2RlVUNTNF9Db3VudAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZSBQeVVuaWNvZGVVQ1M0X0RlY29kZQorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZUFTQ0lJIFB5VW5pY29kZVVDUzRfRGVjb2RlQVNDSUkKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwIFB5VW5pY29kZVVDUzRfRGVjb2RlQ2hhcm1hcAorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZUxhdGluMSBQeVVuaWNvZGVVQ1M0X0RlY29kZUxhdGluMQorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUgUHlVbmljb2RlVUNTNF9EZWNvZGVSYXdVbmljb2RlRXNjYXBlCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGMzIgUHlVbmljb2RlVUNTNF9EZWNvZGVVVEYzMgorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwgUHlVbmljb2RlVUNTNF9EZWNvZGVVVEYzMlN0YXRlZnVsCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGMTYgUHlVbmljb2RlVUNTNF9EZWNvZGVVVEYxNgorIyBkZWZpbmUgUHlVbmljb2RlX0RlY29kZVVURjE2U3RhdGVmdWwgUHlVbmljb2RlVUNTNF9EZWNvZGVVVEYxNlN0YXRlZnVsCisjIGRlZmluZSBQeVVuaWNvZGVfRGVjb2RlVVRGOCBQeVVuaWNvZGVVQ1M0X0RlY29kZVVURjgKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwgUHlVbmljb2RlVUNTNF9EZWNvZGVVVEY4U3RhdGVmdWwKKyMgZGVmaW5lIFB5VW5pY29kZV9EZWNvZGVVbmljb2RlRXNjYXBlIFB5VW5pY29kZVVDUzRfRGVjb2RlVW5pY29kZUVzY2FwZQorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZSBQeVVuaWNvZGVVQ1M0X0VuY29kZQorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZUFTQ0lJIFB5VW5pY29kZVVDUzRfRW5jb2RlQVNDSUkKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVDaGFybWFwIFB5VW5pY29kZVVDUzRfRW5jb2RlQ2hhcm1hcAorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZURlY2ltYWwgUHlVbmljb2RlVUNTNF9FbmNvZGVEZWNpbWFsCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlTGF0aW4xIFB5VW5pY29kZVVDUzRfRW5jb2RlTGF0aW4xCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlUmF3VW5pY29kZUVzY2FwZSBQeVVuaWNvZGVVQ1M0X0VuY29kZVJhd1VuaWNvZGVFc2NhcGUKKyMgZGVmaW5lIFB5VW5pY29kZV9FbmNvZGVVVEYzMiBQeVVuaWNvZGVVQ1M0X0VuY29kZVVURjMyCisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlVVRGMTYgUHlVbmljb2RlVUNTNF9FbmNvZGVVVEYxNgorIyBkZWZpbmUgUHlVbmljb2RlX0VuY29kZVVURjggUHlVbmljb2RlVUNTNF9FbmNvZGVVVEY4CisjIGRlZmluZSBQeVVuaWNvZGVfRW5jb2RlVW5pY29kZUVzY2FwZSBQeVVuaWNvZGVVQ1M0X0VuY29kZVVuaWNvZGVFc2NhcGUKKyMgZGVmaW5lIFB5VW5pY29kZV9GaW5kIFB5VW5pY29kZVVDUzRfRmluZAorIyBkZWZpbmUgUHlVbmljb2RlX0Zvcm1hdCBQeVVuaWNvZGVVQ1M0X0Zvcm1hdAorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0IFB5VW5pY29kZVVDUzRfRnJvbUVuY29kZWRPYmplY3QKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tRm9ybWF0IFB5VW5pY29kZVVDUzRfRnJvbUZvcm1hdAorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21Gb3JtYXRWIFB5VW5pY29kZVVDUzRfRnJvbUZvcm1hdFYKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tT2JqZWN0IFB5VW5pY29kZVVDUzRfRnJvbU9iamVjdAorIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21PcmRpbmFsIFB5VW5pY29kZVVDUzRfRnJvbU9yZGluYWwKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tU3RyaW5nIFB5VW5pY29kZVVDUzRfRnJvbVN0cmluZworIyBkZWZpbmUgUHlVbmljb2RlX0Zyb21TdHJpbmdBbmRTaXplIFB5VW5pY29kZVVDUzRfRnJvbVN0cmluZ0FuZFNpemUKKyMgZGVmaW5lIFB5VW5pY29kZV9Gcm9tVW5pY29kZSBQeVVuaWNvZGVVQ1M0X0Zyb21Vbmljb2RlCisjIGRlZmluZSBQeVVuaWNvZGVfRnJvbVdpZGVDaGFyIFB5VW5pY29kZVVDUzRfRnJvbVdpZGVDaGFyCisjIGRlZmluZSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nIFB5VW5pY29kZVVDUzRfR2V0RGVmYXVsdEVuY29kaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfR2V0TWF4IFB5VW5pY29kZVVDUzRfR2V0TWF4CisjIGRlZmluZSBQeVVuaWNvZGVfR2V0U2l6ZSBQeVVuaWNvZGVVQ1M0X0dldFNpemUKKyMgZGVmaW5lIFB5VW5pY29kZV9Kb2luIFB5VW5pY29kZVVDUzRfSm9pbgorIyBkZWZpbmUgUHlVbmljb2RlX1BhcnRpdGlvbiBQeVVuaWNvZGVVQ1M0X1BhcnRpdGlvbgorIyBkZWZpbmUgUHlVbmljb2RlX1JQYXJ0aXRpb24gUHlVbmljb2RlVUNTNF9SUGFydGl0aW9uCisjIGRlZmluZSBQeVVuaWNvZGVfUlNwbGl0IFB5VW5pY29kZVVDUzRfUlNwbGl0CisjIGRlZmluZSBQeVVuaWNvZGVfUmVwbGFjZSBQeVVuaWNvZGVVQ1M0X1JlcGxhY2UKKyMgZGVmaW5lIFB5VW5pY29kZV9SZXNpemUgUHlVbmljb2RlVUNTNF9SZXNpemUKKyMgZGVmaW5lIFB5VW5pY29kZV9SaWNoQ29tcGFyZSBQeVVuaWNvZGVVQ1M0X1JpY2hDb21wYXJlCisjIGRlZmluZSBQeVVuaWNvZGVfU2V0RGVmYXVsdEVuY29kaW5nIFB5VW5pY29kZVVDUzRfU2V0RGVmYXVsdEVuY29kaW5nCisjIGRlZmluZSBQeVVuaWNvZGVfU3BsaXQgUHlVbmljb2RlVUNTNF9TcGxpdAorIyBkZWZpbmUgUHlVbmljb2RlX1NwbGl0bGluZXMgUHlVbmljb2RlVUNTNF9TcGxpdGxpbmVzCisjIGRlZmluZSBQeVVuaWNvZGVfVGFpbG1hdGNoIFB5VW5pY29kZVVDUzRfVGFpbG1hdGNoCisjIGRlZmluZSBQeVVuaWNvZGVfVHJhbnNsYXRlIFB5VW5pY29kZVVDUzRfVHJhbnNsYXRlCisjIGRlZmluZSBQeVVuaWNvZGVfVHJhbnNsYXRlQ2hhcm1hcCBQeVVuaWNvZGVVQ1M0X1RyYW5zbGF0ZUNoYXJtYXAKKyMgZGVmaW5lIF9QeVVuaWNvZGVfQXNEZWZhdWx0RW5jb2RlZFN0cmluZyBfUHlVbmljb2RlVUNTNF9Bc0RlZmF1bHRFbmNvZGVkU3RyaW5nCisjIGRlZmluZSBfUHlVbmljb2RlX0ZpbmkgX1B5VW5pY29kZVVDUzRfRmluaQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jbml0IF9QeVVuaWNvZGVVQ1M0X0luaXQKKyMgZGVmaW5lIF9QeVVuaWNvZGVfSXNBbHBoYSBfUHlVbmljb2RlVUNTNF9Jc0FscGhhCisjIGRlZmluZSBfUHlVbmljb2RlX0lzRGVjaW1hbERpZ2l0IF9QeVVuaWNvZGVVQ1M0X0lzRGVjaW1hbERpZ2l0CisjIGRlZmluZSBfUHlVbmljb2RlX0lzRGlnaXQgX1B5VW5pY29kZVVDUzRfSXNEaWdpdAorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0xpbmVicmVhayBfUHlVbmljb2RlVUNTNF9Jc0xpbmVicmVhaworIyBkZWZpbmUgX1B5VW5pY29kZV9Jc0xvd2VyY2FzZSBfUHlVbmljb2RlVUNTNF9Jc0xvd2VyY2FzZQorIyBkZWZpbmUgX1B5VW5pY29kZV9Jc051bWVyaWMgX1B5VW5pY29kZVVDUzRfSXNOdW1lcmljCisjIGRlZmluZSBfUHlVbmljb2RlX0lzVGl0bGVjYXNlIF9QeVVuaWNvZGVVQ1M0X0lzVGl0bGVjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX0lzVXBwZXJjYXNlIF9QeVVuaWNvZGVVQ1M0X0lzVXBwZXJjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX0lzV2hpdGVzcGFjZSBfUHlVbmljb2RlVUNTNF9Jc1doaXRlc3BhY2UKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9EZWNpbWFsRGlnaXQgX1B5VW5pY29kZVVDUzRfVG9EZWNpbWFsRGlnaXQKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9EaWdpdCBfUHlVbmljb2RlVUNTNF9Ub0RpZ2l0CisjIGRlZmluZSBfUHlVbmljb2RlX1RvTG93ZXJjYXNlIF9QeVVuaWNvZGVVQ1M0X1RvTG93ZXJjYXNlCisjIGRlZmluZSBfUHlVbmljb2RlX1RvTnVtZXJpYyBfUHlVbmljb2RlVUNTNF9Ub051bWVyaWMKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9UaXRsZWNhc2UgX1B5VW5pY29kZVVDUzRfVG9UaXRsZWNhc2UKKyMgZGVmaW5lIF9QeVVuaWNvZGVfVG9VcHBlcmNhc2UgX1B5VW5pY29kZVVDUzRfVG9VcHBlcmNhc2UKKworCisjZW5kaWYKKworLyogLS0tIEludGVybmFsIFVuaWNvZGUgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIElmIHlvdSB3YW50IFB5dGhvbiB0byB1c2UgdGhlIGNvbXBpbGVyJ3Mgd2N0eXBlLmggZnVuY3Rpb25zIGluc3RlYWQKKyAgIG9mIHRoZSBvbmVzIHN1cHBsaWVkIHdpdGggUHl0aG9uLCBkZWZpbmUgV0FOVF9XQ1RZUEVfRlVOQ1RJT05TIG9yCisgICBjb25maWd1cmUgUHl0aG9uIHVzaW5nIC0td2l0aC13Y3R5cGUtZnVuY3Rpb25zLiAgVGhpcyByZWR1Y2VzIHRoZQorICAgaW50ZXJwcmV0ZXIncyBjb2RlIHNpemUuICovCisKKyNpZiBkZWZpbmVkKEhBVkVfVVNBQkxFX1dDSEFSX1QpICYmIGRlZmluZWQoV0FOVF9XQ1RZUEVfRlVOQ1RJT05TKQorCisjaW5jbHVkZSA8d2N0eXBlLmg+CisKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU1NQQUNFKGNoKSBpc3dzcGFjZShjaCkKKworI2RlZmluZSBQeV9VTklDT0RFX0lTTE9XRVIoY2gpIGlzd2xvd2VyKGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTVVBQRVIoY2gpIGlzd3VwcGVyKGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTVElUTEUoY2gpIF9QeVVuaWNvZGVfSXNUaXRsZWNhc2UoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfSVNMSU5FQlJFQUsoY2gpIF9QeVVuaWNvZGVfSXNMaW5lYnJlYWsoY2gpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT0xPV0VSKGNoKSB0b3dsb3dlcihjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT1VQUEVSKGNoKSB0b3d1cHBlcihjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT1RJVExFKGNoKSBfUHlVbmljb2RlX1RvVGl0bGVjYXNlKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfSVNERUNJTUFMKGNoKSBfUHlVbmljb2RlX0lzRGVjaW1hbERpZ2l0KGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTRElHSVQoY2gpIF9QeVVuaWNvZGVfSXNEaWdpdChjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU05VTUVSSUMoY2gpIF9QeVVuaWNvZGVfSXNOdW1lcmljKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfVE9ERUNJTUFMKGNoKSBfUHlVbmljb2RlX1RvRGVjaW1hbERpZ2l0KGNoKQorI2RlZmluZSBQeV9VTklDT0RFX1RPRElHSVQoY2gpIF9QeVVuaWNvZGVfVG9EaWdpdChjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT05VTUVSSUMoY2gpIF9QeVVuaWNvZGVfVG9OdW1lcmljKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfSVNBTFBIQShjaCkgaXN3YWxwaGEoY2gpCisKKyNlbHNlCisKKy8qIFNpbmNlIHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlIGlzIGFuIGltcG9ydGFudCB1c2UgY2FzZSwgYW5kCisgICB3aGl0ZXNwYWNlIGluIG1vc3Qgc2l0dWF0aW9ucyBpcyBzb2xlbHkgQVNDSUkgd2hpdGVzcGFjZSwgd2UKKyAgIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2UgYnkgdXNpbmcgYSBxdWljayBsb29rLXVwIHRhYmxlCisgICBfUHlfYXNjaWlfd2hpdGVzcGFjZSAoc2VlIGJlbG93KSB3aXRoIGFuIGlubGluZWQgY2hlY2suCisKKyAqLworI2RlZmluZSBQeV9VTklDT0RFX0lTU1BBQ0UoY2gpIFwKKyAgICAoKGNoKSA8IDEyOFUgPyBfUHlfYXNjaWlfd2hpdGVzcGFjZVsoY2gpXSA6IF9QeVVuaWNvZGVfSXNXaGl0ZXNwYWNlKGNoKSkKKworI2RlZmluZSBQeV9VTklDT0RFX0lTTE9XRVIoY2gpIF9QeVVuaWNvZGVfSXNMb3dlcmNhc2UoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfSVNVUFBFUihjaCkgX1B5VW5pY29kZV9Jc1VwcGVyY2FzZShjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU1RJVExFKGNoKSBfUHlVbmljb2RlX0lzVGl0bGVjYXNlKGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTTElORUJSRUFLKGNoKSBfUHlVbmljb2RlX0lzTGluZWJyZWFrKGNoKQorCisjZGVmaW5lIFB5X1VOSUNPREVfVE9MT1dFUihjaCkgX1B5VW5pY29kZV9Ub0xvd2VyY2FzZShjaCkKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT1VQUEVSKGNoKSBfUHlVbmljb2RlX1RvVXBwZXJjYXNlKGNoKQorI2RlZmluZSBQeV9VTklDT0RFX1RPVElUTEUoY2gpIF9QeVVuaWNvZGVfVG9UaXRsZWNhc2UoY2gpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU0RFQ0lNQUwoY2gpIF9QeVVuaWNvZGVfSXNEZWNpbWFsRGlnaXQoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfSVNESUdJVChjaCkgX1B5VW5pY29kZV9Jc0RpZ2l0KGNoKQorI2RlZmluZSBQeV9VTklDT0RFX0lTTlVNRVJJQyhjaCkgX1B5VW5pY29kZV9Jc051bWVyaWMoY2gpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9UT0RFQ0lNQUwoY2gpIF9QeVVuaWNvZGVfVG9EZWNpbWFsRGlnaXQoY2gpCisjZGVmaW5lIFB5X1VOSUNPREVfVE9ESUdJVChjaCkgX1B5VW5pY29kZV9Ub0RpZ2l0KGNoKQorI2RlZmluZSBQeV9VTklDT0RFX1RPTlVNRVJJQyhjaCkgX1B5VW5pY29kZV9Ub051bWVyaWMoY2gpCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9JU0FMUEhBKGNoKSBfUHlVbmljb2RlX0lzQWxwaGEoY2gpCisKKyNlbmRpZgorCisjZGVmaW5lIFB5X1VOSUNPREVfSVNBTE5VTShjaCkgXAorICAgICAgIChQeV9VTklDT0RFX0lTQUxQSEEoY2gpIHx8IFwKKyAgICBQeV9VTklDT0RFX0lTREVDSU1BTChjaCkgfHwgXAorICAgIFB5X1VOSUNPREVfSVNESUdJVChjaCkgfHwgXAorICAgIFB5X1VOSUNPREVfSVNOVU1FUklDKGNoKSkKKworI2RlZmluZSBQeV9VTklDT0RFX0NPUFkodGFyZ2V0LCBzb3VyY2UsIGxlbmd0aCkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFB5X01FTUNQWSgodGFyZ2V0KSwgKHNvdXJjZSksIChsZW5ndGgpKnNpemVvZihQeV9VTklDT0RFKSkKKworI2RlZmluZSBQeV9VTklDT0RFX0ZJTEwodGFyZ2V0LCB2YWx1ZSwgbGVuZ3RoKSBcCisgICAgZG8ge1B5X3NzaXplX3QgaV87IFB5X1VOSUNPREUgKnRfID0gKHRhcmdldCk7IFB5X1VOSUNPREUgdl8gPSAodmFsdWUpO1wKKyAgICBmb3IgKGlfID0gMDsgaV8gPCAobGVuZ3RoKTsgaV8rKykgdF9baV9dID0gdl87XAorICAgIH0gd2hpbGUgKDApCisKKy8qIENoZWNrIGlmIHN1YnN0cmluZyBtYXRjaGVzIGF0IGdpdmVuIG9mZnNldC4gIHRoZSBvZmZzZXQgbXVzdCBiZQorICAgdmFsaWQsIGFuZCB0aGUgc3Vic3RyaW5nIG11c3Qgbm90IGJlIGVtcHR5ICovCisKKyNkZWZpbmUgUHlfVU5JQ09ERV9NQVRDSChzdHJpbmcsIG9mZnNldCwgc3Vic3RyaW5nKSBcCisgICAgKCgqKChzdHJpbmcpLT5zdHIgKyAob2Zmc2V0KSkgPT0gKigoc3Vic3RyaW5nKS0+c3RyKSkgJiYgXAorICAgICgoKigoc3RyaW5nKS0+c3RyICsgKG9mZnNldCkgKyAoc3Vic3RyaW5nKS0+bGVuZ3RoLTEpID09ICooKHN1YnN0cmluZyktPnN0ciArIChzdWJzdHJpbmcpLT5sZW5ndGgtMSkpKSAmJiBcCisgICAgICFtZW1jbXAoKHN0cmluZyktPnN0ciArIChvZmZzZXQpLCAoc3Vic3RyaW5nKS0+c3RyLCAoc3Vic3RyaW5nKS0+bGVuZ3RoKnNpemVvZihQeV9VTklDT0RFKSkpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tIFVuaWNvZGUgVHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlfc3NpemVfdCBsZW5ndGg7ICAgICAgICAgIC8qIExlbmd0aCBvZiByYXcgVW5pY29kZSBkYXRhIGluIGJ1ZmZlciAqLworICAgIFB5X1VOSUNPREUgKnN0cjsgICAgICAgICAgICAvKiBSYXcgVW5pY29kZSBidWZmZXIgKi8KKyAgICBsb25nIGhhc2g7ICAgICAgICAgICAgICAgICAgLyogSGFzaCB2YWx1ZTsgLTEgaWYgbm90IHNldCAqLworICAgIFB5T2JqZWN0ICpkZWZlbmM7ICAgICAgICAgICAvKiAoRGVmYXVsdCkgRW5jb2RlZCB2ZXJzaW9uIGFzIFB5dGhvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcsIG9yIE5VTEw7IHRoaXMgaXMgdXNlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50aW5nIHRoZSBidWZmZXIgcHJvdG9jb2wgKi8KK30gUHlVbmljb2RlT2JqZWN0OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgUHlVbmljb2RlX1R5cGU7CisKKyNkZWZpbmUgUHlVbmljb2RlX0NoZWNrKG9wKSBcCisgICAgICAgICAgICAgICAgIFB5VHlwZV9GYXN0U3ViY2xhc3MoUHlfVFlQRShvcCksIFB5X1RQRkxBR1NfVU5JQ09ERV9TVUJDTEFTUykKKyNkZWZpbmUgUHlVbmljb2RlX0NoZWNrRXhhY3Qob3ApIChQeV9UWVBFKG9wKSA9PSAmUHlVbmljb2RlX1R5cGUpCisKKy8qIEZhc3QgYWNjZXNzIG1hY3JvcyAqLworI2RlZmluZSBQeVVuaWNvZGVfR0VUX1NJWkUob3ApIFwKKyAgICAoKChQeVVuaWNvZGVPYmplY3QgKikob3ApKS0+bGVuZ3RoKQorI2RlZmluZSBQeVVuaWNvZGVfR0VUX0RBVEFfU0laRShvcCkgXAorICAgICgoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5sZW5ndGggKiBzaXplb2YoUHlfVU5JQ09ERSkpCisjZGVmaW5lIFB5VW5pY29kZV9BU19VTklDT0RFKG9wKSBcCisgICAgKCgoUHlVbmljb2RlT2JqZWN0ICopKG9wKSktPnN0cikKKyNkZWZpbmUgUHlVbmljb2RlX0FTX0RBVEEob3ApIFwKKyAgICAoKGNvbnN0IGNoYXIgKikoKFB5VW5pY29kZU9iamVjdCAqKShvcCkpLT5zdHIpCisKKy8qIC0tLSBDb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGlzIFVuaWNvZGUgY2hhcmFjdGVyIHdpbGwgYmUgdXNlZCBhcyByZXBsYWNlbWVudCBjaGFyYWN0ZXIgZHVyaW5nCisgICBkZWNvZGluZyBpZiB0aGUgZXJyb3JzIGFyZ3VtZW50IGlzIHNldCB0byAicmVwbGFjZSIuIE5vdGU6IHRoZQorICAgVW5pY29kZSBjaGFyYWN0ZXIgVStGRkZEIGlzIHRoZSBvZmZpY2lhbCBSRVBMQUNFTUVOVCBDSEFSQUNURVIgaW4KKyAgIFVuaWNvZGUgMy4wLiAqLworCisjZGVmaW5lIFB5X1VOSUNPREVfUkVQTEFDRU1FTlRfQ0hBUkFDVEVSICgoUHlfVU5JQ09ERSkgMHhGRkZEKQorCisvKiA9PT0gUHVibGljIEFQSSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyogLS0tIFBsYWluIFB5X1VOSUNPREUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENyZWF0ZSBhIFVuaWNvZGUgT2JqZWN0IGZyb20gdGhlIFB5X1VOSUNPREUgYnVmZmVyIHUgb2YgdGhlIGdpdmVuCisgICBzaXplLgorCisgICB1IG1heSBiZSBOVUxMIHdoaWNoIGNhdXNlcyB0aGUgY29udGVudHMgdG8gYmUgdW5kZWZpbmVkLiBJdCBpcyB0aGUKKyAgIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBmaWxsIGluIHRoZSBuZWVkZWQgZGF0YSBhZnRlcndhcmRzLiBOb3RlCisgICB0aGF0IG1vZGlmeWluZyB0aGUgVW5pY29kZSBvYmplY3QgY29udGVudHMgYWZ0ZXIgY29uc3RydWN0aW9uIGlzCisgICBvbmx5IGFsbG93ZWQgaWYgdSB3YXMgc2V0IHRvIE5VTEwuCisKKyAgIFRoZSBidWZmZXIgaXMgY29waWVkIGludG8gdGhlIG5ldyBvYmplY3QuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqdSwgICAgICAgIC8qIFVuaWNvZGUgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBzaXplICAgICAgICAgICAgIC8qIHNpemUgb2YgYnVmZmVyICovCisgICAgKTsKKworLyogU2ltaWxhciB0byBQeVVuaWNvZGVfRnJvbVVuaWNvZGUoKSwgYnV0IHUgcG9pbnRzIHRvIExhdGluLTEgZW5jb2RlZCBieXRlcyAqLworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICBjb25zdCBjaGFyICp1LCAgICAgICAgLyogY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IHNpemUgICAgICAgLyogc2l6ZSBvZiBidWZmZXIgKi8KKyAgICApOworCisvKiBTaW1pbGFyIHRvIFB5VW5pY29kZV9Gcm9tVW5pY29kZSgpLCBidXQgdSBwb2ludHMgdG8gbnVsbC10ZXJtaW5hdGVkCisgICBMYXRpbi0xIGVuY29kZWQgYnl0ZXMgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRnJvbVN0cmluZygKKyAgICBjb25zdCBjaGFyICp1ICAgICAgICAvKiBzdHJpbmcgKi8KKyAgICApOworCisvKiBSZXR1cm4gYSByZWFkLW9ubHkgcG9pbnRlciB0byB0aGUgVW5pY29kZSBvYmplY3QncyBpbnRlcm5hbAorICAgUHlfVU5JQ09ERSBidWZmZXIuICovCisKK1B5QVBJX0ZVTkMoUHlfVU5JQ09ERSAqKSBQeVVuaWNvZGVfQXNVbmljb2RlKAorICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgICk7CisKKy8qIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBVbmljb2RlIG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfR2V0U2l6ZSgKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCisvKiBHZXQgdGhlIG1heGltdW0gb3JkaW5hbCBmb3IgYSBVbmljb2RlIGNoYXJhY3Rlci4gKi8KK1B5QVBJX0ZVTkMoUHlfVU5JQ09ERSkgUHlVbmljb2RlX0dldE1heCh2b2lkKTsKKworLyogUmVzaXplIGFuIGFscmVhZHkgYWxsb2NhdGVkIFVuaWNvZGUgb2JqZWN0IHRvIHRoZSBuZXcgc2l6ZSBsZW5ndGguCisKKyAgICp1bmljb2RlIGlzIG1vZGlmaWVkIHRvIHBvaW50IHRvIHRoZSBuZXcgKHJlc2l6ZWQpIG9iamVjdCBhbmQgMAorICAgcmV0dXJuZWQgb24gc3VjY2Vzcy4KKworICAgVGhpcyBBUEkgbWF5IG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBmdW5jdGlvbiB3aGljaCBhbHNvIGNhbGxlZCB0aGUKKyAgIFVuaWNvZGUgY29uc3RydWN0b3IuIFRoZSByZWZjb3VudCBvbiB0aGUgb2JqZWN0IG11c3QgYmUgMS4gT3RoZXJ3aXNlLAorICAgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisKKyAgIEVycm9yIGhhbmRsaW5nIGlzIGltcGxlbWVudGVkIGFzIGZvbGxvd3M6IGFuIGV4Y2VwdGlvbiBpcyBzZXQsIC0xCisgICBpcyByZXR1cm5lZCBhbmQgKnVuaWNvZGUgbGVmdCB1bnRvdWNoZWQuCisKKyovCisKK1B5QVBJX0ZVTkMoaW50KSBQeVVuaWNvZGVfUmVzaXplKAorICAgIFB5T2JqZWN0ICoqdW5pY29kZSwgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBVbmljb2RlIG9iamVjdCAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoICAgICAgICAgICAvKiBOZXcgbGVuZ3RoICovCisgICAgKTsKKworLyogQ29lcmNlIG9iaiB0byBhbiBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHdpdGgKKyAgICppbmNyZW1lbnRlZCogcmVmY291bnQuCisKKyAgIENvZXJjaW9uIGlzIGRvbmUgaW4gdGhlIGZvbGxvd2luZyB3YXk6CisKKyAgIDEuIFN0cmluZyBhbmQgb3RoZXIgY2hhciBidWZmZXIgY29tcGF0aWJsZSBvYmplY3RzIGFyZSBkZWNvZGVkCisgICAgICB1bmRlciB0aGUgYXNzdW1wdGlvbnMgdGhhdCB0aGV5IGNvbnRhaW4gZGF0YSB1c2luZyB0aGUgY3VycmVudAorICAgICAgZGVmYXVsdCBlbmNvZGluZy4gRGVjb2RpbmcgaXMgZG9uZSBpbiAic3RyaWN0IiBtb2RlLgorCisgICAyLiBBbGwgb3RoZXIgb2JqZWN0cyAoaW5jbHVkaW5nIFVuaWNvZGUgb2JqZWN0cykgcmFpc2UgYW4KKyAgICAgIGV4Y2VwdGlvbi4KKworICAgVGhlIEFQSSByZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBhbiBlcnJvci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorICAgZm9yIGRlY3JlZidpbmcgdGhlIHJldHVybmVkIG9iamVjdHMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoCisgICAgcmVnaXN0ZXIgUHlPYmplY3QgKm9iaiwgICAgIC8qIE9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIENvZXJjZSBvYmogdG8gYW4gVW5pY29kZSBvYmplY3QgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB3aXRoCisgICAqaW5jcmVtZW50ZWQqIHJlZmNvdW50LgorCisgICBVbmljb2RlIG9iamVjdHMgYXJlIHBhc3NlZCBiYWNrIGFzLWlzIChzdWJjbGFzc2VzIGFyZSBjb252ZXJ0ZWQgdG8KKyAgIHRydWUgVW5pY29kZSBvYmplY3RzKSwgYWxsIG90aGVyIG9iamVjdHMgYXJlIGRlbGVnYXRlZCB0bworICAgUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KG9iaiwgTlVMTCwgInN0cmljdCIpIHdoaWNoIHJlc3VsdHMgaW4KKyAgIHVzaW5nIHRoZSBkZWZhdWx0IGVuY29kaW5nIGFzIGJhc2lzIGZvciBkZWNvZGluZyB0aGUgb2JqZWN0LgorCisgICBUaGUgQVBJIHJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGFuIGVycm9yLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlCisgICBmb3IgZGVjcmVmJ2luZyB0aGUgcmV0dXJuZWQgb2JqZWN0cy4KKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Gcm9tT2JqZWN0KAorICAgIHJlZ2lzdGVyIFB5T2JqZWN0ICpvYmogICAgICAvKiBPYmplY3QgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9Gcm9tRm9ybWF0Vihjb25zdCBjaGFyKiwgdmFfbGlzdCk7CitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9Gcm9tRm9ybWF0KGNvbnN0IGNoYXIqLCAuLi4pOworCisvKiBGb3JtYXQgdGhlIG9iamVjdCBiYXNlZCBvbiB0aGUgZm9ybWF0X3NwZWMsIGFzIGRlZmluZWQgaW4gUEVQIDMxMDEKKyAgIChBZHZhbmNlZCBTdHJpbmcgRm9ybWF0dGluZykuICovCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIF9QeVVuaWNvZGVfRm9ybWF0QWR2YW5jZWQoUHlPYmplY3QgKm9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9VTklDT0RFICpmb3JtYXRfc3BlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGZvcm1hdF9zcGVjX2xlbik7CisKKy8qIC0tLSB3Y2hhcl90IHN1cHBvcnQgZm9yIHBsYXRmb3JtcyB3aGljaCBzdXBwb3J0IGl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgSEFWRV9XQ0hBUl9ICisKKy8qIENyZWF0ZSBhIFVuaWNvZGUgT2JqZWN0IGZyb20gdGhlIHdoY2FyX3QgYnVmZmVyIHcgb2YgdGhlIGdpdmVuCisgICBzaXplLgorCisgICBUaGUgYnVmZmVyIGlzIGNvcGllZCBpbnRvIHRoZSBuZXcgb2JqZWN0LiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21XaWRlQ2hhcigKKyAgICByZWdpc3RlciBjb25zdCB3Y2hhcl90ICp3LCAgLyogd2NoYXJfdCBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IHNpemUgICAgICAgICAgICAgLyogc2l6ZSBvZiBidWZmZXIgKi8KKyAgICApOworCisvKiBDb3BpZXMgdGhlIFVuaWNvZGUgT2JqZWN0IGNvbnRlbnRzIGludG8gdGhlIHdjaGFyX3QgYnVmZmVyIHcuICBBdAorICAgbW9zdCBzaXplIHdjaGFyX3QgY2hhcmFjdGVycyBhcmUgY29waWVkLgorCisgICBOb3RlIHRoYXQgdGhlIHJlc3VsdGluZyB3Y2hhcl90IHN0cmluZyBtYXkgb3IgbWF5IG5vdCBiZQorICAgMC10ZXJtaW5hdGVkLiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlCisgICB0aGF0IHRoZSB3Y2hhcl90IHN0cmluZyBpcyAwLXRlcm1pbmF0ZWQgaW4gY2FzZSB0aGlzIGlzIHJlcXVpcmVkIGJ5CisgICB0aGUgYXBwbGljYXRpb24uCisKKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiB3Y2hhcl90IGNoYXJhY3RlcnMgY29waWVkIChleGNsdWRpbmcgYQorICAgcG9zc2libHkgdHJhaWxpbmcgMC10ZXJtaW5hdGlvbiBjaGFyYWN0ZXIpIG9yIC0xIGluIGNhc2Ugb2YgYW4KKyAgIGVycm9yLiAqLworCitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5VW5pY29kZV9Bc1dpZGVDaGFyKAorICAgIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZSwgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIHJlZ2lzdGVyIHdjaGFyX3QgKncsICAgICAgICAvKiB3Y2hhcl90IGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3Qgc2l6ZSAgICAgICAgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAqLworICAgICk7CisKKyNlbmRpZgorCisvKiAtLS0gVW5pY29kZSBvcmRpbmFscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ3JlYXRlIGEgVW5pY29kZSBPYmplY3QgZnJvbSB0aGUgZ2l2ZW4gVW5pY29kZSBjb2RlIHBvaW50IG9yZGluYWwuCisKKyAgIFRoZSBvcmRpbmFsIG11c3QgYmUgaW4gcmFuZ2UoMHgxMDAwMCkgb24gbmFycm93IFB5dGhvbiBidWlsZHMKKyAgIChVQ1MyKSwgYW5kIHJhbmdlKDB4MTEwMDAwKSBvbiB3aWRlIGJ1aWxkcyAoVUNTNCkuIEEgVmFsdWVFcnJvciBpcworICAgcmFpc2VkIGluIGNhc2UgaXQgaXMgbm90LgorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0Zyb21PcmRpbmFsKGludCBvcmRpbmFsKTsKKworLyogLS0tIEZyZWUtbGlzdCBtYW5hZ2VtZW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENsZWFyIHRoZSBmcmVlIGxpc3QgdXNlZCBieSB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbi4KKworICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZWxlYXNlIG1lbW9yeSB1c2VkIGZvciBvYmplY3RzIG9uIHRoZSBmcmVlCisgICBsaXN0IGJhY2sgdG8gdGhlIFB5dGhvbiBtZW1vcnkgYWxsb2NhdG9yLgorCisqLworCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NsZWFyRnJlZUxpc3Qodm9pZCk7CisKKy8qID09PSBCdWlsdGluIENvZGVjcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICBNYW55IG9mIHRoZXNlIEFQSXMgdGFrZSB0d28gYXJndW1lbnRzIGVuY29kaW5nIGFuZCBlcnJvcnMuIFRoZXNlCisgICBwYXJhbWV0ZXJzIGVuY29kaW5nIGFuZCBlcnJvcnMgaGF2ZSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgdGhlIG9uZXMKKyAgIG9mIHRoZSBidWlsdGluIHVuaWNvZGUoKSBBUEkuCisKKyAgIFNldHRpbmcgZW5jb2RpbmcgdG8gTlVMTCBjYXVzZXMgdGhlIGRlZmF1bHQgZW5jb2RpbmcgdG8gYmUgdXNlZC4KKworICAgRXJyb3IgaGFuZGxpbmcgaXMgc2V0IGJ5IGVycm9ycyB3aGljaCBtYXkgYWxzbyBiZSBzZXQgdG8gTlVMTAorICAgbWVhbmluZyB0byB1c2UgdGhlIGRlZmF1bHQgaGFuZGxpbmcgZGVmaW5lZCBmb3IgdGhlIGNvZGVjLiBEZWZhdWx0CisgICBlcnJvciBoYW5kbGluZyBmb3IgYWxsIGJ1aWx0aW4gY29kZWNzIGlzICJzdHJpY3QiIChWYWx1ZUVycm9ycyBhcmUKKyAgIHJhaXNlZCkuCisKKyAgIFRoZSBjb2RlY3MgYWxsIHVzZSBhIHNpbWlsYXIgaW50ZXJmYWNlLiBPbmx5IGRldmlhdGlvbiBmcm9tIHRoZQorICAgZ2VuZXJpYyBvbmVzIGFyZSBkb2N1bWVudGVkLgorCisqLworCisvKiAtLS0gTWFuYWdlIHRoZSBkZWZhdWx0IGVuY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogUmV0dXJuIGEgUHl0aG9uIHN0cmluZyBob2xkaW5nIHRoZSBkZWZhdWx0IGVuY29kZWQgdmFsdWUgb2YgdGhlCisgICBVbmljb2RlIG9iamVjdC4KKworICAgVGhlIHJlc3VsdGluZyBzdHJpbmcgaXMgY2FjaGVkIGluIHRoZSBVbmljb2RlIG9iamVjdCBmb3Igc3Vic2VxdWVudAorICAgdXNhZ2UgYnkgdGhpcyBmdW5jdGlvbi4gVGhlIGNhY2hlZCB2ZXJzaW9uIGlzIG5lZWRlZCB0byBpbXBsZW1lbnQKKyAgIHRoZSBjaGFyYWN0ZXIgYnVmZmVyIGludGVyZmFjZSBhbmQgd2lsbCBsaXZlIChhdCBsZWFzdCkgYXMgbG9uZyBhcworICAgdGhlIFVuaWNvZGUgb2JqZWN0IGl0c2VsZi4KKworICAgVGhlIHJlZmNvdW50IG9mIHRoZSBzdHJpbmcgaXMgKm5vdCogaW5jcmVtZW50ZWQuCisKKyAgICoqKiBFeHBvcnRlZCBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBpbnRlcnByZXRlciBvbmx5ICEhISAqKioKKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBfUHlVbmljb2RlX0FzRGVmYXVsdEVuY29kZWRTdHJpbmcoCisgICAgUHlPYmplY3QgKiwgY29uc3QgY2hhciAqKTsKKworLyogUmV0dXJucyB0aGUgY3VycmVudGx5IGFjdGl2ZSBkZWZhdWx0IGVuY29kaW5nLgorCisgICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBjdXJyZW50bHkgaW1wbGVtZW50ZWQgYXMgcnVuLXRpbWUgc2V0dGFibGUKKyAgIHByb2Nlc3MgZ2xvYmFsLiAgVGhpcyBtYXkgY2hhbmdlIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUKKyAgIGludGVycHJldGVyIHRvIGJlY29tZSBhIHBhcmFtZXRlciB3aGljaCBpcyBtYW5hZ2VkIG9uIGEgcGVyLXRocmVhZAorICAgYmFzaXMuCisKKyAqLworCitQeUFQSV9GVU5DKGNvbnN0IGNoYXIqKSBQeVVuaWNvZGVfR2V0RGVmYXVsdEVuY29kaW5nKHZvaWQpOworCisvKiBTZXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGRlZmF1bHQgZW5jb2RpbmcuCisKKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBpbiBjYXNlIG9mIGFuIGVycm9yLgorCisgKi8KKworUHlBUElfRlVOQyhpbnQpIFB5VW5pY29kZV9TZXREZWZhdWx0RW5jb2RpbmcoCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcgICAgICAgIC8qIEVuY29kaW5nIG5hbWUgaW4gc3RhbmRhcmQgZm9ybSAqLworICAgICk7CisKKy8qIC0tLSBHZW5lcmljIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDcmVhdGUgYSBVbmljb2RlIG9iamVjdCBieSBkZWNvZGluZyB0aGUgZW5jb2RlZCBzdHJpbmcgcyBvZiB0aGUKKyAgIGdpdmVuIHNpemUuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlKAorICAgIGNvbnN0IGNoYXIgKnMsICAgICAgICAgICAgICAvKiBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3Qgc2l6ZSwgICAgICAgICAgICAvKiBzaXplIG9mIGJ1ZmZlciAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIEVuY29kZXMgYSBQeV9VTklDT0RFIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gc2l6ZSBhbmQgcmV0dXJucyBhCisgICBQeXRob24gc3RyaW5nIG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGUoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqcywgICAgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IHNpemUsICAgICAgICAgICAgLyogbnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworLyogRW5jb2RlcyBhIFVuaWNvZGUgb2JqZWN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgUHl0aG9uCisgICBvYmplY3QuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0KAorICAgIFB5T2JqZWN0ICp1bmljb2RlLCAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgIGNvbnN0IGNoYXIgKmVuY29kaW5nLCAgICAgICAvKiBlbmNvZGluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIEVuY29kZXMgYSBVbmljb2RlIG9iamVjdCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIFB5dGhvbiBzdHJpbmcKKyAgIG9iamVjdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0VuY29kZWRTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUsICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgY29uc3QgY2hhciAqZW5jb2RpbmcsICAgICAgIC8qIGVuY29kaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwKAorICAgIFB5T2JqZWN0KiBzdHJpbmcgICAgICAgICAgICAvKiAyNTYgY2hhcmFjdGVyIG1hcCAqLworICAgKTsKKworCisvKiAtLS0gVVRGLTcgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY3KAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtNyBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGN1N0YXRlZnVsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtNyBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAvKiBieXRlcyBjb25zdW1lZCAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlVVRGNygKKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGludCBiYXNlNjRTZXRPLCAgICAgICAgICAgICAvKiBFbmNvZGUgUkZDMjE1MiBTZXQgTyBjaGFyYWN0ZXJzIGluIGJhc2U2NCAqLworICAgIGludCBiYXNlNjRXaGl0ZVNwYWNlLCAgICAgICAvKiBFbmNvZGUgd2hpdGVzcGFjZSAoc3AsIGh0LCBubCwgY3IpIGluIGJhc2U2NCAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIC0tLSBVVEYtOCBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjgoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEY4U3RhdGVmdWwoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi04IGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgICAgICAgICAgLyogYnl0ZXMgY29uc3VtZWQgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVVRGOFN0cmluZygKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVURjgoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiAtLS0gVVRGLTMyIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRGVjb2RlcyBsZW5ndGggYnl0ZXMgZnJvbSBhIFVURi0zMiBlbmNvZGVkIGJ1ZmZlciBzdHJpbmcgYW5kIHJldHVybnMKKyAgIHRoZSBjb3JyZXNwb25kaW5nIFVuaWNvZGUgb2JqZWN0LgorCisgICBlcnJvcnMgKGlmIG5vbi1OVUxMKSBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZy4gSXQgZGVmYXVsdHMKKyAgIHRvICJzdHJpY3QiLgorCisgICBJZiBieXRlb3JkZXIgaXMgbm9uLU5VTEwsIHRoZSBkZWNvZGVyIHN0YXJ0cyBkZWNvZGluZyB1c2luZyB0aGUKKyAgIGdpdmVuIGJ5dGUgb3JkZXI6CisKKyAgICAqYnl0ZW9yZGVyID09IC0xOiBsaXR0bGUgZW5kaWFuCisgICAgKmJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIG9yZGVyCisgICAgKmJ5dGVvcmRlciA9PSAxOiAgYmlnIGVuZGlhbgorCisgICBJbiBuYXRpdmUgbW9kZSwgdGhlIGZpcnN0IGZvdXIgYnl0ZXMgb2YgdGhlIHN0cmVhbSBhcmUgY2hlY2tlZCBmb3IgYQorICAgQk9NIG1hcmsuIElmIGZvdW5kLCB0aGUgQk9NIG1hcmsgaXMgYW5hbHlzZWQsIHRoZSBieXRlIG9yZGVyCisgICBhZGp1c3RlZCBhbmQgdGhlIEJPTSBza2lwcGVkLiAgSW4gdGhlIG90aGVyIG1vZGVzLCBubyBCT00gbWFyaworICAgaW50ZXJwcmV0YXRpb24gaXMgZG9uZS4gQWZ0ZXIgY29tcGxldGlvbiwgKmJ5dGVvcmRlciBpcyBzZXQgdG8gdGhlCisgICBjdXJyZW50IGJ5dGUgb3JkZXIgYXQgdGhlIGVuZCBvZiBpbnB1dCBkYXRhLgorCisgICBJZiBieXRlb3JkZXIgaXMgTlVMTCwgdGhlIGNvZGVjIHN0YXJ0cyBpbiBuYXRpdmUgb3JkZXIgbW9kZS4KKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEYzMigKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVVRGLTMyIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgaW50ICpieXRlb3JkZXIgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYnl0ZW9yZGVyIHRvIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPW5hdGl2ZTstMT1MRSwxPUJFOyB1cGRhdGVkIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZVVURjMyU3RhdGVmdWwoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi0zMiBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGludCAqYnl0ZW9yZGVyLCAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0ICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgKTsKKworLyogUmV0dXJucyBhIFB5dGhvbiBzdHJpbmcgdXNpbmcgdGhlIFVURi0zMiBlbmNvZGluZyBpbiBuYXRpdmUgYnl0ZQorICAgb3JkZXIuIFRoZSBzdHJpbmcgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgQk9NIG1hcmsuICAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVVRGMzJTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworLyogUmV0dXJucyBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0IGhvbGRpbmcgdGhlIFVURi0zMiBlbmNvZGVkIHZhbHVlIG9mCisgICB0aGUgVW5pY29kZSBkYXRhLgorCisgICBJZiBieXRlb3JkZXIgaXMgbm90IDAsIG91dHB1dCBpcyB3cml0dGVuIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgICBieXRlIG9yZGVyOgorCisgICBieXRlb3JkZXIgPT0gLTE6IGxpdHRsZSBlbmRpYW4KKyAgIGJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIGJ5dGUgb3JkZXIgKHdyaXRlcyBhIEJPTSBtYXJrKQorICAgYnl0ZW9yZGVyID09IDE6ICBiaWcgZW5kaWFuCisKKyAgIElmIGJ5dGVvcmRlciBpcyAwLCB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIGFsd2F5cyBzdGFydCB3aXRoIHRoZQorICAgVW5pY29kZSBCT00gbWFyayAoVStGRUZGKS4gSW4gdGhlIG90aGVyIHR3byBtb2Rlcywgbm8gQk9NIG1hcmsgaXMKKyAgIHByZXBlbmRlZC4KKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVVVEYzMigKKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBudW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgYnl0ZW9yZGVyICAgICAgICAgICAgICAgLyogYnl0ZW9yZGVyIHRvIHVzZSAwPUJPTStuYXRpdmU7LTE9TEUsMT1CRSAqLworICAgICk7CisKKy8qIC0tLSBVVEYtMTYgQ29kZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBEZWNvZGVzIGxlbmd0aCBieXRlcyBmcm9tIGEgVVRGLTE2IGVuY29kZWQgYnVmZmVyIHN0cmluZyBhbmQgcmV0dXJucworICAgdGhlIGNvcnJlc3BvbmRpbmcgVW5pY29kZSBvYmplY3QuCisKKyAgIGVycm9ycyAoaWYgbm9uLU5VTEwpIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nLiBJdCBkZWZhdWx0cworICAgdG8gInN0cmljdCIuCisKKyAgIElmIGJ5dGVvcmRlciBpcyBub24tTlVMTCwgdGhlIGRlY29kZXIgc3RhcnRzIGRlY29kaW5nIHVzaW5nIHRoZQorICAgZ2l2ZW4gYnl0ZSBvcmRlcjoKKworICAgICpieXRlb3JkZXIgPT0gLTE6IGxpdHRsZSBlbmRpYW4KKyAgICAqYnl0ZW9yZGVyID09IDA6ICBuYXRpdmUgb3JkZXIKKyAgICAqYnl0ZW9yZGVyID09IDE6ICBiaWcgZW5kaWFuCisKKyAgIEluIG5hdGl2ZSBtb2RlLCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBzdHJlYW0gYXJlIGNoZWNrZWQgZm9yIGEKKyAgIEJPTSBtYXJrLiBJZiBmb3VuZCwgdGhlIEJPTSBtYXJrIGlzIGFuYWx5c2VkLCB0aGUgYnl0ZSBvcmRlcgorICAgYWRqdXN0ZWQgYW5kIHRoZSBCT00gc2tpcHBlZC4gIEluIHRoZSBvdGhlciBtb2Rlcywgbm8gQk9NIG1hcmsKKyAgIGludGVycHJldGF0aW9uIGlzIGRvbmUuIEFmdGVyIGNvbXBsZXRpb24sICpieXRlb3JkZXIgaXMgc2V0IHRvIHRoZQorICAgY3VycmVudCBieXRlIG9yZGVyIGF0IHRoZSBlbmQgb2YgaW5wdXQgZGF0YS4KKworICAgSWYgYnl0ZW9yZGVyIGlzIE5VTEwsIHRoZSBjb2RlYyBzdGFydHMgaW4gbmF0aXZlIG9yZGVyIG1vZGUuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVVRGMTYoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIFVURi0xNiBlbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGludCAqYnl0ZW9yZGVyICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ5dGVvcmRlciB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMD1uYXRpdmU7LTE9TEUsMT1CRTsgdXBkYXRlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0ICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVVVEYxNlN0YXRlZnVsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBVVEYtMTYgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBpbnQgKmJ5dGVvcmRlciwgICAgICAgICAgICAgLyogcG9pbnRlciB0byBieXRlb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA9bmF0aXZlOy0xPUxFLDE9QkU7IHVwZGF0ZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAqLworICAgIFB5X3NzaXplX3QgKmNvbnN1bWVkICAgICAgICAgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgKTsKKworLyogUmV0dXJucyBhIFB5dGhvbiBzdHJpbmcgdXNpbmcgdGhlIFVURi0xNiBlbmNvZGluZyBpbiBuYXRpdmUgYnl0ZQorICAgb3JkZXIuIFRoZSBzdHJpbmcgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgQk9NIG1hcmsuICAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVVRGMTZTdHJpbmcoCisgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCisgICAgKTsKKworLyogUmV0dXJucyBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0IGhvbGRpbmcgdGhlIFVURi0xNiBlbmNvZGVkIHZhbHVlIG9mCisgICB0aGUgVW5pY29kZSBkYXRhLgorCisgICBJZiBieXRlb3JkZXIgaXMgbm90IDAsIG91dHB1dCBpcyB3cml0dGVuIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nCisgICBieXRlIG9yZGVyOgorCisgICBieXRlb3JkZXIgPT0gLTE6IGxpdHRsZSBlbmRpYW4KKyAgIGJ5dGVvcmRlciA9PSAwOiAgbmF0aXZlIGJ5dGUgb3JkZXIgKHdyaXRlcyBhIEJPTSBtYXJrKQorICAgYnl0ZW9yZGVyID09IDE6ICBiaWcgZW5kaWFuCisKKyAgIElmIGJ5dGVvcmRlciBpcyAwLCB0aGUgb3V0cHV0IHN0cmluZyB3aWxsIGFsd2F5cyBzdGFydCB3aXRoIHRoZQorICAgVW5pY29kZSBCT00gbWFyayAoVStGRUZGKS4gSW4gdGhlIG90aGVyIHR3byBtb2Rlcywgbm8gQk9NIG1hcmsgaXMKKyAgIHByZXBlbmRlZC4KKworICAgTm90ZSB0aGF0IFB5X1VOSUNPREUgZGF0YSBpcyBiZWluZyBpbnRlcnByZXRlZCBhcyBVVEYtMTYgcmVkdWNlZCB0bworICAgVUNTLTIuIFRoaXMgdHJpY2sgbWFrZXMgaXQgcG9zc2libGUgdG8gYWRkIGZ1bGwgVVRGLTE2IGNhcGFiaWxpdGllcworICAgYXQgYSBsYXRlciBwb2ludCB3aXRob3V0IGNvbXByb21pc2luZyB0aGUgQVBJcy4KKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVVVEYxNigKKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycywgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgIGludCBieXRlb3JkZXIgICAgICAgICAgICAgICAvKiBieXRlb3JkZXIgdG8gdXNlIDA9Qk9NK25hdGl2ZTstMT1MRSwxPUJFICovCisgICAgKTsKKworLyogLS0tIFVuaWNvZGUtRXNjYXBlIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlVW5pY29kZUVzY2FwZSgKKyAgICBjb25zdCBjaGFyICpzdHJpbmcsICAgICAgICAgLyogVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZygKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVVuaWNvZGVFc2NhcGUoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICApOworCisvKiAtLS0gUmF3LVVuaWNvZGUtRXNjYXBlIENvZGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVSYXdVbmljb2RlRXNjYXBlKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBSYXctVW5pY29kZS1Fc2NhcGUgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzUmF3VW5pY29kZUVzY2FwZVN0cmluZygKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICApOworCisvKiAtLS0gVW5pY29kZSBJbnRlcm5hbCBDb2RlYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIE9ubHkgZm9yIGludGVybmFsIHVzZSBpbiBfY29kZWNzbW9kdWxlLmMgKi8KKworUHlPYmplY3QgKl9QeVVuaWNvZGVfRGVjb2RlVW5pY29kZUludGVybmFsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywKKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwKKyAgICBjb25zdCBjaGFyICplcnJvcnMKKyAgICApOworCisvKiAtLS0gTGF0aW4tMSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgTm90ZTogTGF0aW4tMSBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgMjU2IFVuaWNvZGUgb3JkaW5hbHMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlTGF0aW4xKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBMYXRpbi0xIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0xhdGluMVN0cmluZygKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZUxhdGluMSgKKyAgICBjb25zdCBQeV9VTklDT0RFICpkYXRhLCAgICAgLyogVW5pY29kZSBjaGFyIGJ1ZmZlciAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIC0tLSBBU0NJSSBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBPbmx5IDctYml0IEFTQ0lJIGRhdGEgaXMgZXhjZXB0ZWQuIEFsbCBvdGhlciBjb2RlcyBnZW5lcmF0ZSBlcnJvcnMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlQVNDSUkoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIEFTQ0lJIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc0FTQ0lJU3RyaW5nKAorICAgIFB5T2JqZWN0ICp1bmljb2RlICAgICAgICAgICAvKiBVbmljb2RlIG9iamVjdCAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRW5jb2RlQVNDSUkoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiAtLS0gQ2hhcmFjdGVyIE1hcCBDb2RlY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgVGhpcyBjb2RlYyB1c2VzIG1hcHBpbmdzIHRvIGVuY29kZSBhbmQgZGVjb2RlIGNoYXJhY3RlcnMuCisKKyAgIERlY29kaW5nIG1hcHBpbmdzIG11c3QgbWFwIHNpbmdsZSBzdHJpbmcgY2hhcmFjdGVycyB0byBzaW5nbGUKKyAgIFVuaWNvZGUgY2hhcmFjdGVycywgaW50ZWdlcnMgKHdoaWNoIGFyZSB0aGVuIGludGVycHJldGVkIGFzIFVuaWNvZGUKKyAgIG9yZGluYWxzKSBvciBOb25lIChtZWFuaW5nICJ1bmRlZmluZWQgbWFwcGluZyIgYW5kIGNhdXNpbmcgYW4KKyAgIGVycm9yKS4KKworICAgRW5jb2RpbmcgbWFwcGluZ3MgbXVzdCBtYXAgc2luZ2xlIFVuaWNvZGUgY2hhcmFjdGVycyB0byBzaW5nbGUKKyAgIHN0cmluZyBjaGFyYWN0ZXJzLCBpbnRlZ2VycyAod2hpY2ggYXJlIHRoZW4gaW50ZXJwcmV0ZWQgYXMgTGF0aW4tMQorICAgb3JkaW5hbHMpIG9yIE5vbmUgKG1lYW5pbmcgInVuZGVmaW5lZCBtYXBwaW5nIiBhbmQgY2F1c2luZyBhbgorICAgZXJyb3IpLgorCisgICBJZiBhIGNoYXJhY3RlciBsb29rdXAgZmFpbHMgd2l0aCBhIExvb2t1cEVycm9yLCB0aGUgY2hhcmFjdGVyIGlzCisgICBjb3BpZWQgYXMtaXMgbWVhbmluZyB0aGF0IGl0cyBvcmRpbmFsIHZhbHVlIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMKKyAgIFVuaWNvZGUgb3IgTGF0aW4tMSBvcmRpbmFsIHJlc3AuIEJlY2F1c2Ugb2YgdGhpcyBtYXBwaW5ncyBvbmx5IG5lZWQKKyAgIHRvIGNvbnRhaW4gdGhvc2UgbWFwcGluZ3Mgd2hpY2ggbWFwIGNoYXJhY3RlcnMgdG8gZGlmZmVyZW50IGNvZGUKKyAgIHBvaW50cy4KKworKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVDaGFybWFwKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBFbmNvZGVkIHN0cmluZyAqLworICAgIFB5X3NzaXplX3QgbGVuZ3RoLCAgICAgICAgICAvKiBzaXplIG9mIHN0cmluZyAqLworICAgIFB5T2JqZWN0ICptYXBwaW5nLCAgICAgICAgICAvKiBjaGFyYWN0ZXIgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciBvcmRpbmFsIC0+IHVuaWNvZGUgb3JkaW5hbCkgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzQ2hhcm1hcFN0cmluZygKKyAgICBQeU9iamVjdCAqdW5pY29kZSwgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAqbWFwcGluZyAgICAgICAgICAgLyogY2hhcmFjdGVyIG1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuaWNvZGUgb3JkaW5hbCAtPiBjaGFyIG9yZGluYWwpICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9FbmNvZGVDaGFybWFwKAorICAgIGNvbnN0IFB5X1VOSUNPREUgKmRhdGEsICAgICAvKiBVbmljb2RlIGNoYXIgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIFB5T2JqZWN0ICptYXBwaW5nLCAgICAgICAgICAvKiBjaGFyYWN0ZXIgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5pY29kZSBvcmRpbmFsIC0+IGNoYXIgb3JkaW5hbCkgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMgICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICApOworCisvKiBUcmFuc2xhdGUgYSBQeV9VTklDT0RFIGJ1ZmZlciBvZiB0aGUgZ2l2ZW4gbGVuZ3RoIGJ5IGFwcGx5aW5nIGEKKyAgIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIHRvIGl0IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBVbmljb2RlCisgICBvYmplY3QuCisKKyAgIFRoZSBtYXBwaW5nIHRhYmxlIG11c3QgbWFwIFVuaWNvZGUgb3JkaW5hbCBpbnRlZ2VycyB0byBVbmljb2RlCisgICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuCisKKyAgIE1hcHBpbmcgdGFibGVzIG1heSBiZSBkaWN0aW9uYXJpZXMgb3Igc2VxdWVuY2VzLiBVbm1hcHBlZCBjaGFyYWN0ZXIKKyAgIG9yZGluYWxzIChvbmVzIHdoaWNoIGNhdXNlIGEgTG9va3VwRXJyb3IpIGFyZSBsZWZ0IHVudG91Y2hlZCBhbmQKKyAgIGFyZSBjb3BpZWQgYXMtaXMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX1RyYW5zbGF0ZUNoYXJtYXAoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgUHlfVU5JQ09ERSBjaGFycyB0byBlbmNvZGUgKi8KKyAgICBQeU9iamVjdCAqdGFibGUsICAgICAgICAgICAgLyogVHJhbnNsYXRlIHRhYmxlICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworI2lmZGVmIE1TX1dJTjMyCisKKy8qIC0tLSBNQkNTIGNvZGVjcyBmb3IgV2luZG93cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0RlY29kZU1CQ1MoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIE1CQ1MgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzICAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwoCisgICAgY29uc3QgY2hhciAqc3RyaW5nLCAgICAgICAgIC8qIE1CQ1MgZW5jb2RlZCBzdHJpbmcgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgLyogc2l6ZSBvZiBzdHJpbmcgKi8KKyAgICBjb25zdCBjaGFyICplcnJvcnMsICAgICAgICAgLyogZXJyb3IgaGFuZGxpbmcgKi8KKyAgICBQeV9zc2l6ZV90ICpjb25zdW1lZCAgICAgICAgLyogYnl0ZXMgY29uc3VtZWQgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0FzTUJDU1N0cmluZygKKyAgICBQeU9iamVjdCAqdW5pY29kZSAgICAgICAgICAgLyogVW5pY29kZSBvYmplY3QgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0VuY29kZU1CQ1MoCisgICAgY29uc3QgUHlfVU5JQ09ERSAqZGF0YSwgICAgIC8qIFVuaWNvZGUgY2hhciBidWZmZXIgKi8KKyAgICBQeV9zc2l6ZV90IGxlbmd0aCwgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBQeV9VTklDT0RFIGNoYXJzIHRvIGVuY29kZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKyNlbmRpZiAvKiBNU19XSU4zMiAqLworCisvKiAtLS0gRGVjaW1hbCBFbmNvZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGFrZXMgYSBVbmljb2RlIHN0cmluZyBob2xkaW5nIGEgZGVjaW1hbCB2YWx1ZSBhbmQgd3JpdGVzIGl0IGludG8KKyAgIGFuIG91dHB1dCBidWZmZXIgdXNpbmcgc3RhbmRhcmQgQVNDSUkgZGlnaXQgY29kZXMuCisKKyAgIFRoZSBvdXRwdXQgYnVmZmVyIGhhcyB0byBwcm92aWRlIGF0IGxlYXN0IGxlbmd0aCsxIGJ5dGVzIG9mIHN0b3JhZ2UKKyAgIGFyZWEuIFRoZSBvdXRwdXQgc3RyaW5nIGlzIDAtdGVybWluYXRlZC4KKworICAgVGhlIGVuY29kZXIgY29udmVydHMgd2hpdGVzcGFjZSB0byAnICcsIGRlY2ltYWwgY2hhcmFjdGVycyB0byB0aGVpcgorICAgY29ycmVzcG9uZGluZyBBU0NJSSBkaWdpdCBhbmQgYWxsIG90aGVyIExhdGluLTEgY2hhcmFjdGVycyBleGNlcHQKKyAgIFwwIGFzLWlzLiBDaGFyYWN0ZXJzIG91dHNpZGUgdGhpcyByYW5nZSAoVW5pY29kZSBvcmRpbmFscyAxLTI1NikKKyAgIGFyZSB0cmVhdGVkIGFzIGVycm9ycy4gVGhpcyBpbmNsdWRlcyBlbWJlZGRlZCBOVUxMIGJ5dGVzLgorCisgICBFcnJvciBoYW5kbGluZyBpcyBkZWZpbmVkIGJ5IHRoZSBlcnJvcnMgYXJndW1lbnQ6CisKKyAgICAgIE5VTEwgb3IgInN0cmljdCI6IHJhaXNlIGEgVmFsdWVFcnJvcgorICAgICAgImlnbm9yZSI6IGlnbm9yZSB0aGUgd3JvbmcgY2hhcmFjdGVycyAodGhlc2UgYXJlIG5vdCBjb3BpZWQgdG8gdGhlCisgICAgICAgICAgICAgICAgb3V0cHV0IGJ1ZmZlcikKKyAgICAgICJyZXBsYWNlIjogcmVwbGFjZXMgaWxsZWdhbCBjaGFyYWN0ZXJzIHdpdGggJz8nCisKKyAgIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgorCisqLworCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0VuY29kZURlY2ltYWwoCisgICAgUHlfVU5JQ09ERSAqcywgICAgICAgICAgICAgIC8qIFVuaWNvZGUgYnVmZmVyICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIFB5X1VOSUNPREUgY2hhcnMgdG8gZW5jb2RlICovCisgICAgY2hhciAqb3V0cHV0LCAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXI7IG11c3QgaGF2ZSBzaXplID49IGxlbmd0aCAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIC0tLSBNZXRob2RzICYgU2xvdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICBUaGVzZSBhcmUgY2FwYWJsZSBvZiBoYW5kbGluZyBVbmljb2RlIG9iamVjdHMgYW5kIHN0cmluZ3Mgb24gaW5wdXQKKyAgICh3ZSByZWZlciB0byB0aGVtIGFzIHN0cmluZ3MgaW4gdGhlIGRlc2NyaXB0aW9ucykgYW5kIHJldHVybgorICAgVW5pY29kZSBvYmplY3RzIG9yIGludGVnZXJzIGFzIGFwcG9ycHJpYXRlLiAqLworCisvKiBDb25jYXQgdHdvIHN0cmluZ3MgZ2l2aW5nIGEgbmV3IFVuaWNvZGUgc3RyaW5nLiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0KikgUHlVbmljb2RlX0NvbmNhdCgKKyAgICBQeU9iamVjdCAqbGVmdCwgICAgICAgICAgICAgLyogTGVmdCBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqcmlnaHQgICAgICAgICAgICAgLyogUmlnaHQgc3RyaW5nICovCisgICAgKTsKKworLyogU3BsaXQgYSBzdHJpbmcgZ2l2aW5nIGEgbGlzdCBvZiBVbmljb2RlIHN0cmluZ3MuCisKKyAgIElmIHNlcCBpcyBOVUxMLCBzcGxpdHRpbmcgd2lsbCBiZSBkb25lIGF0IGFsbCB3aGl0ZXNwYWNlCisgICBzdWJzdHJpbmdzLiBPdGhlcndpc2UsIHNwbGl0cyBvY2N1ciBhdCB0aGUgZ2l2ZW4gc2VwYXJhdG9yLgorCisgICBBdCBtb3N0IG1heHNwbGl0IHNwbGl0cyB3aWxsIGJlIGRvbmUuIElmIG5lZ2F0aXZlLCBubyBsaW1pdCBpcyBzZXQuCisKKyAgIFNlcGFyYXRvcnMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfU3BsaXQoCisgICAgUHlPYmplY3QgKnMsICAgICAgICAgICAgICAgIC8qIFN0cmluZyB0byBzcGxpdCAqLworICAgIFB5T2JqZWN0ICpzZXAsICAgICAgICAgICAgICAvKiBTdHJpbmcgc2VwYXJhdG9yICovCisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCAgICAgICAgIC8qIE1heHNwbGl0IGNvdW50ICovCisgICAgKTsKKworLyogRGl0bywgYnV0IHNwbGl0IGF0IGxpbmUgYnJlYWtzLgorCisgICBDUkxGIGlzIGNvbnNpZGVyZWQgdG8gYmUgb25lIGxpbmUgYnJlYWsuIExpbmUgYnJlYWtzIGFyZSBub3QKKyAgIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgbGlzdC4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9TcGxpdGxpbmVzKAorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gc3BsaXQgKi8KKyAgICBpbnQga2VlcGVuZHMgICAgICAgICAgICAgICAgLyogSWYgdHJ1ZSwgbGluZSBlbmQgbWFya2VycyBhcmUgaW5jbHVkZWQgKi8KKyAgICApOworCisvKiBQYXJ0aXRpb24gYSBzdHJpbmcgdXNpbmcgYSBnaXZlbiBzZXBhcmF0b3IuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfUGFydGl0aW9uKAorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gcGFydGl0aW9uICovCisgICAgUHlPYmplY3QgKnNlcCAgICAgICAgICAgICAgIC8qIFN0cmluZyBzZXBhcmF0b3IgKi8KKyAgICApOworCisvKiBQYXJ0aXRpb24gYSBzdHJpbmcgdXNpbmcgYSBnaXZlbiBzZXBhcmF0b3IsIHNlYXJjaGluZyBmcm9tIHRoZSBlbmQgb2YgdGhlCisgICBzdHJpbmcuICovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfUlBhcnRpdGlvbigKKyAgICBQeU9iamVjdCAqcywgICAgICAgICAgICAgICAgLyogU3RyaW5nIHRvIHBhcnRpdGlvbiAqLworICAgIFB5T2JqZWN0ICpzZXAgICAgICAgICAgICAgICAvKiBTdHJpbmcgc2VwYXJhdG9yICovCisgICAgKTsKKworLyogU3BsaXQgYSBzdHJpbmcgZ2l2aW5nIGEgbGlzdCBvZiBVbmljb2RlIHN0cmluZ3MuCisKKyAgIElmIHNlcCBpcyBOVUxMLCBzcGxpdHRpbmcgd2lsbCBiZSBkb25lIGF0IGFsbCB3aGl0ZXNwYWNlCisgICBzdWJzdHJpbmdzLiBPdGhlcndpc2UsIHNwbGl0cyBvY2N1ciBhdCB0aGUgZ2l2ZW4gc2VwYXJhdG9yLgorCisgICBBdCBtb3N0IG1heHNwbGl0IHNwbGl0cyB3aWxsIGJlIGRvbmUuIEJ1dCB1bmxpa2UgUHlVbmljb2RlX1NwbGl0CisgICBQeVVuaWNvZGVfUlNwbGl0IHNwbGl0cyBmcm9tIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gSWYgbmVnYXRpdmUsCisgICBubyBsaW1pdCBpcyBzZXQuCisKKyAgIFNlcGFyYXRvcnMgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3QuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfUlNwbGl0KAorICAgIFB5T2JqZWN0ICpzLCAgICAgICAgICAgICAgICAvKiBTdHJpbmcgdG8gc3BsaXQgKi8KKyAgICBQeU9iamVjdCAqc2VwLCAgICAgICAgICAgICAgLyogU3RyaW5nIHNlcGFyYXRvciAqLworICAgIFB5X3NzaXplX3QgbWF4c3BsaXQgICAgICAgICAvKiBNYXhzcGxpdCBjb3VudCAqLworICAgICk7CisKKy8qIFRyYW5zbGF0ZSBhIHN0cmluZyBieSBhcHBseWluZyBhIGNoYXJhY3RlciBtYXBwaW5nIHRhYmxlIHRvIGl0IGFuZAorICAgcmV0dXJuIHRoZSByZXN1bHRpbmcgVW5pY29kZSBvYmplY3QuCisKKyAgIFRoZSBtYXBwaW5nIHRhYmxlIG11c3QgbWFwIFVuaWNvZGUgb3JkaW5hbCBpbnRlZ2VycyB0byBVbmljb2RlCisgICBvcmRpbmFsIGludGVnZXJzIG9yIE5vbmUgKGNhdXNpbmcgZGVsZXRpb24gb2YgdGhlIGNoYXJhY3RlcikuCisKKyAgIE1hcHBpbmcgdGFibGVzIG1heSBiZSBkaWN0aW9uYXJpZXMgb3Igc2VxdWVuY2VzLiBVbm1hcHBlZCBjaGFyYWN0ZXIKKyAgIG9yZGluYWxzIChvbmVzIHdoaWNoIGNhdXNlIGEgTG9va3VwRXJyb3IpIGFyZSBsZWZ0IHVudG91Y2hlZCBhbmQKKyAgIGFyZSBjb3BpZWQgYXMtaXMuCisKKyovCisKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlVbmljb2RlX1RyYW5zbGF0ZSgKKyAgICBQeU9iamVjdCAqc3RyLCAgICAgICAgICAgICAgLyogU3RyaW5nICovCisgICAgUHlPYmplY3QgKnRhYmxlLCAgICAgICAgICAgIC8qIFRyYW5zbGF0ZSB0YWJsZSAqLworICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLworICAgICk7CisKKy8qIEpvaW4gYSBzZXF1ZW5jZSBvZiBzdHJpbmdzIHVzaW5nIHRoZSBnaXZlbiBzZXBhcmF0b3IgYW5kIHJldHVybgorICAgdGhlIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZy4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Kb2luKAorICAgIFB5T2JqZWN0ICpzZXBhcmF0b3IsICAgICAgICAvKiBTZXBhcmF0b3Igc3RyaW5nICovCisgICAgUHlPYmplY3QgKnNlcSAgICAgICAgICAgICAgIC8qIFNlcXVlbmNlIG9iamVjdCAqLworICAgICk7CisKKy8qIFJldHVybiAxIGlmIHN1YnN0ciBtYXRjaGVzIHN0cltzdGFydDplbmRdIGF0IHRoZSBnaXZlbiB0YWlsIGVuZCwgMAorICAgb3RoZXJ3aXNlLiAqLworCitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5VW5pY29kZV9UYWlsbWF0Y2goCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzdWJzdHIsICAgICAgICAgICAvKiBQcmVmaXggb3IgU3VmZml4IHN0cmluZyAqLworICAgIFB5X3NzaXplX3Qgc3RhcnQsICAgICAgICAgICAvKiBTdGFydCBpbmRleCAqLworICAgIFB5X3NzaXplX3QgZW5kLCAgICAgICAgICAgICAvKiBTdG9wIGluZGV4ICovCisgICAgaW50IGRpcmVjdGlvbiAgICAgICAgICAgICAgIC8qIFRhaWwgZW5kOiAtMSBwcmVmaXgsICsxIHN1ZmZpeCAqLworICAgICk7CisKKy8qIFJldHVybiB0aGUgZmlyc3QgcG9zaXRpb24gb2Ygc3Vic3RyIGluIHN0cltzdGFydDplbmRdIHVzaW5nIHRoZQorICAgZ2l2ZW4gc2VhcmNoIGRpcmVjdGlvbiBvciAtMSBpZiBub3QgZm91bmQuIC0yIGlzIHJldHVybmVkIGluIGNhc2UKKyAgIGFuIGVycm9yIG9jY3VycmVkIGFuZCBhbiBleGNlcHRpb24gaXMgc2V0LiAqLworCitQeUFQSV9GVU5DKFB5X3NzaXplX3QpIFB5VW5pY29kZV9GaW5kKAorICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBTdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqc3Vic3RyLCAgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KKyAgICBQeV9zc2l6ZV90IHN0YXJ0LCAgICAgICAgICAgLyogU3RhcnQgaW5kZXggKi8KKyAgICBQeV9zc2l6ZV90IGVuZCwgICAgICAgICAgICAgLyogU3RvcCBpbmRleCAqLworICAgIGludCBkaXJlY3Rpb24gICAgICAgICAgICAgICAvKiBGaW5kIGRpcmVjdGlvbjogKzEgZm9yd2FyZCwgLTEgYmFja3dhcmQgKi8KKyAgICApOworCisvKiBDb3VudCB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHN1YnN0ciBpbiBzdHJbc3RhcnQ6ZW5kXS4gKi8KKworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBQeVVuaWNvZGVfQ291bnQoCisgICAgUHlPYmplY3QgKnN0ciwgICAgICAgICAgICAgIC8qIFN0cmluZyAqLworICAgIFB5T2JqZWN0ICpzdWJzdHIsICAgICAgICAgICAvKiBTdWJzdHJpbmcgdG8gY291bnQgKi8KKyAgICBQeV9zc2l6ZV90IHN0YXJ0LCAgICAgICAgICAgLyogU3RhcnQgaW5kZXggKi8KKyAgICBQeV9zc2l6ZV90IGVuZCAgICAgICAgICAgICAgLyogU3RvcCBpbmRleCAqLworICAgICk7CisKKy8qIFJlcGxhY2UgYXQgbW9zdCBtYXhjb3VudCBvY2N1cnJlbmNlcyBvZiBzdWJzdHIgaW4gc3RyIHdpdGggcmVwbHN0cgorICAgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIFVuaWNvZGUgb2JqZWN0LiAqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9SZXBsYWNlKAorICAgIFB5T2JqZWN0ICpzdHIsICAgICAgICAgICAgICAvKiBTdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqc3Vic3RyLCAgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIGZpbmQgKi8KKyAgICBQeU9iamVjdCAqcmVwbHN0ciwgICAgICAgICAgLyogU3Vic3RyaW5nIHRvIHJlcGxhY2UgKi8KKyAgICBQeV9zc2l6ZV90IG1heGNvdW50ICAgICAgICAgLyogTWF4LiBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIHRvIGFwcGx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSA9IGFsbCAqLworICAgICk7CisKKy8qIENvbXBhcmUgdHdvIHN0cmluZ3MgYW5kIHJldHVybiAtMSwgMCwgMSBmb3IgbGVzcyB0aGFuLCBlcXVhbCwKKyAgIGdyZWF0ZXIgdGhhbiByZXNwLiAqLworCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NvbXBhcmUoCisgICAgUHlPYmplY3QgKmxlZnQsICAgICAgICAgICAgIC8qIExlZnQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKnJpZ2h0ICAgICAgICAgICAgIC8qIFJpZ2h0IHN0cmluZyAqLworICAgICk7CisKKy8qIFJpY2ggY29tcGFyZSB0d28gc3RyaW5ncyBhbmQgcmV0dXJuIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAtIE5VTEwgaW4gY2FzZSBhbiBleGNlcHRpb24gd2FzIHJhaXNlZAorICAgLSBQeV9UcnVlIG9yIFB5X0ZhbHNlIGZvciBzdWNjZXNzZnVseSBjb21wYXJpc29ucworICAgLSBQeV9Ob3RJbXBsZW1lbnRlZCBpbiBjYXNlIHRoZSB0eXBlIGNvbWJpbmF0aW9uIGlzIHVua25vd24KKworICAgTm90ZSB0aGF0IFB5X0VRIGFuZCBQeV9ORSBjb21wYXJpc29ucyBjYW4gY2F1c2UgYSBVbmljb2RlV2FybmluZyBpbgorICAgY2FzZSB0aGUgY29udmVyc2lvbiBvZiB0aGUgYXJndW1lbnRzIHRvIFVuaWNvZGUgZmFpbHMgd2l0aCBhCisgICBVbmljb2RlRGVjb2RlRXJyb3IuCisKKyAgIFBvc3NpYmxlIHZhbHVlcyBmb3Igb3A6CisKKyAgICAgUHlfR1QsIFB5X0dFLCBQeV9FUSwgUHlfTkUsIFB5X0xULCBQeV9MRQorCisqLworCitQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5VW5pY29kZV9SaWNoQ29tcGFyZSgKKyAgICBQeU9iamVjdCAqbGVmdCwgICAgICAgICAgICAgLyogTGVmdCBzdHJpbmcgKi8KKyAgICBQeU9iamVjdCAqcmlnaHQsICAgICAgICAgICAgLyogUmlnaHQgc3RyaW5nICovCisgICAgaW50IG9wICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZXJhdGlvbjogUHlfRVEsIFB5X05FLCBQeV9HVCwgZXRjLiAqLworICAgICk7CisKKy8qIEFwcGx5IGEgYXJndW1lbnQgdHVwbGUgb3IgZGljdGlvbmFyeSB0byBhIGZvcm1hdCBzdHJpbmcgYW5kIHJldHVybgorICAgdGhlIHJlc3VsdGluZyBVbmljb2RlIHN0cmluZy4gKi8KKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVVuaWNvZGVfRm9ybWF0KAorICAgIFB5T2JqZWN0ICpmb3JtYXQsICAgICAgICAgICAvKiBGb3JtYXQgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmFyZ3MgICAgICAgICAgICAgIC8qIEFyZ3VtZW50IHR1cGxlIG9yIGRpY3Rpb25hcnkgKi8KKyAgICApOworCisvKiBDaGVja3Mgd2hldGhlciBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbiBjb250YWluZXIgYW5kIHJldHVybiAxLzAKKyAgIGFjY29yZGluZ2x5LgorCisgICBlbGVtZW50IGhhcyB0byBjb2VyY2UgdG8gYW4gb25lIGVsZW1lbnQgVW5pY29kZSBzdHJpbmcuIC0xIGlzCisgICByZXR1cm5lZCBpbiBjYXNlIG9mIGFuIGVycm9yLiAqLworCitQeUFQSV9GVU5DKGludCkgUHlVbmljb2RlX0NvbnRhaW5zKAorICAgIFB5T2JqZWN0ICpjb250YWluZXIsICAgICAgICAvKiBDb250YWluZXIgc3RyaW5nICovCisgICAgUHlPYmplY3QgKmVsZW1lbnQgICAgICAgICAgIC8qIEVsZW1lbnQgc3RyaW5nICovCisgICAgKTsKKworLyogRXh0ZXJuYWxseSB2aXNpYmxlIGZvciBzdHIuc3RyaXAodW5pY29kZSkgKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5VW5pY29kZV9YU3RyaXAoCisgICAgUHlVbmljb2RlT2JqZWN0ICpzZWxmLAorICAgIGludCBzdHJpcHR5cGUsCisgICAgUHlPYmplY3QgKnNlcG9iagorICAgICk7CisKKy8qID09PSBDaGFyYWN0ZXJzIFR5cGUgQVBJcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKiBIZWxwZXIgYXJyYXkgdXNlZCBieSBQeV9VTklDT0RFX0lTU1BBQ0UoKS4gKi8KKworUHlBUElfREFUQShjb25zdCB1bnNpZ25lZCBjaGFyKSBfUHlfYXNjaWlfd2hpdGVzcGFjZVtdOworCisvKiBUaGVzZSBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuIFVzZSB0aGUgUHlfVU5JQ09ERV9JUyogYW5kCisgICBQeV9VTklDT0RFX1RPKiBtYWNyb3MgaW5zdGVhZC4KKworICAgVGhlc2UgQVBJcyBhcmUgaW1wbGVtZW50ZWQgaW4gT2JqZWN0cy91bmljb2RlY3R5cGUuYy4KKworKi8KKworUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNMb3dlcmNhc2UoCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzVXBwZXJjYXNlKAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc1RpdGxlY2FzZSgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhpbnQpIF9QeVVuaWNvZGVfSXNXaGl0ZXNwYWNlKAorICAgIGNvbnN0IFB5X1VOSUNPREUgY2ggICAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzTGluZWJyZWFrKAorICAgIGNvbnN0IFB5X1VOSUNPREUgY2ggICAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoUHlfVU5JQ09ERSkgX1B5VW5pY29kZV9Ub0xvd2VyY2FzZSgKKyAgICBQeV9VTklDT0RFIGNoICAgICAgIC8qIFVuaWNvZGUgY2hhcmFjdGVyICovCisgICAgKTsKKworUHlBUElfRlVOQyhQeV9VTklDT0RFKSBfUHlVbmljb2RlX1RvVXBwZXJjYXNlKAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKFB5X1VOSUNPREUpIF9QeVVuaWNvZGVfVG9UaXRsZWNhc2UoCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX1RvRGVjaW1hbERpZ2l0KAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Ub0RpZ2l0KAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGRvdWJsZSkgX1B5VW5pY29kZV9Ub051bWVyaWMoCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzRGVjaW1hbERpZ2l0KAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc0RpZ2l0KAorICAgIFB5X1VOSUNPREUgY2ggICAgICAgLyogVW5pY29kZSBjaGFyYWN0ZXIgKi8KKyAgICApOworCitQeUFQSV9GVU5DKGludCkgX1B5VW5pY29kZV9Jc051bWVyaWMoCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKK1B5QVBJX0ZVTkMoaW50KSBfUHlVbmljb2RlX0lzQWxwaGEoCisgICAgUHlfVU5JQ09ERSBjaCAgICAgICAvKiBVbmljb2RlIGNoYXJhY3RlciAqLworICAgICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisjZW5kaWYgLyogUHlfVVNJTkdfVU5JQ09ERSAqLworI2VuZGlmIC8qICFQeV9VTklDT0RFT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHl0aG9uMi43L3dhcm5pbmdzLmggYi9pbmNsdWRlL3B5dGhvbjIuNy93YXJuaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MThkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3B5dGhvbjIuNy93YXJuaW5ncy5oCkBAIC0wLDAgKzEsMjMgQEAKKyNpZm5kZWYgUHlfV0FSTklOR1NfSAorI2RlZmluZSBQeV9XQVJOSU5HU19ICisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK1B5QVBJX0ZVTkModm9pZCkgX1B5V2FybmluZ3NfSW5pdCh2b2lkKTsKKworUHlBUElfRlVOQyhpbnQpIFB5RXJyX1dhcm5FeChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIFB5X3NzaXplX3QpOworUHlBUElfRlVOQyhpbnQpIFB5RXJyX1dhcm5FeHBsaWNpdChQeU9iamVjdCAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqLCBQeU9iamVjdCAqKTsKKworI2RlZmluZSBQeUVycl9XYXJuUHkzayhtc2csIHN0YWNrbGV2ZWwpIFwKKyAgKFB5X1B5M2tXYXJuaW5nRmxhZyA/IFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIG1zZywgc3RhY2tsZXZlbCkgOiAwKQorCisvKiBERVBSRUNBVEVEOiBVc2UgUHlFcnJfV2FybkV4KCkgaW5zdGVhZC4gKi8KKyNkZWZpbmUgUHlFcnJfV2FybihjYXRlZ29yeSwgbXNnKSBQeUVycl9XYXJuRXgoY2F0ZWdvcnksIG1zZywgMSkKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKyNlbmRpZiAvKiAhUHlfV0FSTklOR1NfSCAqLworCmRpZmYgLS1naXQgYS9pbmNsdWRlL3B5dGhvbjIuNy93ZWFrcmVmb2JqZWN0LmggYi9pbmNsdWRlL3B5dGhvbjIuNy93ZWFrcmVmb2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2YWVjZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcHl0aG9uMi43L3dlYWtyZWZvYmplY3QuaApAQCAtMCwwICsxLDg1IEBACisvKiBXZWFrIHJlZmVyZW5jZXMgb2JqZWN0cyBmb3IgUHl0aG9uLiAqLworCisjaWZuZGVmIFB5X1dFQUtSRUZPQkpFQ1RfSAorI2RlZmluZSBQeV9XRUFLUkVGT0JKRUNUX0gKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBfUHlXZWFrUmVmZXJlbmNlIFB5V2Vha1JlZmVyZW5jZTsKKworLyogUHlXZWFrUmVmZXJlbmNlIGlzIHRoZSBiYXNlIHN0cnVjdCBmb3IgdGhlIFB5dGhvbiBSZWZlcmVuY2VUeXBlLCBQcm94eVR5cGUsCisgKiBhbmQgQ2FsbGFibGVQcm94eVR5cGUuCisgKi8KK3N0cnVjdCBfUHlXZWFrUmVmZXJlbmNlIHsKKyAgICBQeU9iamVjdF9IRUFECisKKyAgICAvKiBUaGUgb2JqZWN0IHRvIHdoaWNoIHRoaXMgaXMgYSB3ZWFrIHJlZmVyZW5jZSwgb3IgUHlfTm9uZSBpZiBub25lLgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIGEgc3RlYWx0aCByZWZlcmVuY2U6ICB3cl9vYmplY3QncyByZWZjb3VudCBpcworICAgICAqIG5vdCBpbmNyZW1lbnRlZCB0byByZWZsZWN0IHRoaXMgcG9pbnRlci4KKyAgICAgKi8KKyAgICBQeU9iamVjdCAqd3Jfb2JqZWN0OworCisgICAgLyogQSBjYWxsYWJsZSB0byBpbnZva2Ugd2hlbiB3cl9vYmplY3QgZGllcywgb3IgTlVMTCBpZiBub25lLiAqLworICAgIFB5T2JqZWN0ICp3cl9jYWxsYmFjazsKKworICAgIC8qIEEgY2FjaGUgZm9yIHdyX29iamVjdCdzIGhhc2ggY29kZS4gIEFzIHVzdWFsIGZvciBoYXNoZXMsIHRoaXMgaXMgLTEKKyAgICAgKiBpZiB0aGUgaGFzaCBjb2RlIGlzbid0IGtub3duIHlldC4KKyAgICAgKi8KKyAgICBsb25nIGhhc2g7CisKKyAgICAvKiBJZiB3cl9vYmplY3QgaXMgd2Vha2x5IHJlZmVyZW5jZWQsIHdyX29iamVjdCBoYXMgYSBkb3VibHktbGlua2VkIE5VTEwtCisgICAgICogdGVybWluYXRlZCBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBpdC4gIFRoZXNlIGFyZSB0aGUgbGlzdCBwb2ludGVycy4KKyAgICAgKiBJZiB3cl9vYmplY3QgZ29lcyBhd2F5LCB3cl9vYmplY3QgaXMgc2V0IHRvIFB5X05vbmUsIGFuZCB0aGVzZSBwb2ludGVycworICAgICAqIGhhdmUgbm8gbWVhbmluZyB0aGVuLgorICAgICAqLworICAgIFB5V2Vha1JlZmVyZW5jZSAqd3JfcHJldjsKKyAgICBQeVdlYWtSZWZlcmVuY2UgKndyX25leHQ7Cit9OworCitQeUFQSV9EQVRBKFB5VHlwZU9iamVjdCkgX1B5V2Vha3JlZl9SZWZUeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIF9QeVdlYWtyZWZfUHJveHlUeXBlOworUHlBUElfREFUQShQeVR5cGVPYmplY3QpIF9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGU7CisKKyNkZWZpbmUgUHlXZWFrcmVmX0NoZWNrUmVmKG9wKSBQeU9iamVjdF9UeXBlQ2hlY2sob3AsICZfUHlXZWFrcmVmX1JlZlR5cGUpCisjZGVmaW5lIFB5V2Vha3JlZl9DaGVja1JlZkV4YWN0KG9wKSBcCisgICAgICAgIChQeV9UWVBFKG9wKSA9PSAmX1B5V2Vha3JlZl9SZWZUeXBlKQorI2RlZmluZSBQeVdlYWtyZWZfQ2hlY2tQcm94eShvcCkgXAorICAgICAgICAoKFB5X1RZUEUob3ApID09ICZfUHlXZWFrcmVmX1Byb3h5VHlwZSkgfHwgXAorICAgICAgICAgKFB5X1RZUEUob3ApID09ICZfUHlXZWFrcmVmX0NhbGxhYmxlUHJveHlUeXBlKSkKKworLyogVGhpcyBtYWNybyBjYWxscyBQeVdlYWtyZWZfQ2hlY2tSZWYoKSBsYXN0IHNpbmNlIHRoYXQgY2FuIGludm9sdmUgYQorICAgZnVuY3Rpb24gY2FsbDsgdGhpcyBtYWtlcyBpdCBtb3JlIGxpa2VseSB0aGF0IHRoZSBmdW5jdGlvbiBjYWxsCisgICB3aWxsIGJlIGF2b2lkZWQuICovCisjZGVmaW5lIFB5V2Vha3JlZl9DaGVjayhvcCkgXAorICAgICAgICAoUHlXZWFrcmVmX0NoZWNrUmVmKG9wKSB8fCBQeVdlYWtyZWZfQ2hlY2tQcm94eShvcCkpCisKKworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVdlYWtyZWZfTmV3UmVmKFB5T2JqZWN0ICpvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqY2FsbGJhY2spOworUHlBUElfRlVOQyhQeU9iamVjdCAqKSBQeVdlYWtyZWZfTmV3UHJveHkoUHlPYmplY3QgKm9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKmNhbGxiYWNrKTsKK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgUHlXZWFrcmVmX0dldE9iamVjdChQeU9iamVjdCAqcmVmKTsKKworUHlBUElfRlVOQyhQeV9zc2l6ZV90KSBfUHlXZWFrcmVmX0dldFdlYWtyZWZDb3VudChQeVdlYWtSZWZlcmVuY2UgKmhlYWQpOworCitQeUFQSV9GVU5DKHZvaWQpIF9QeVdlYWtyZWZfQ2xlYXJSZWYoUHlXZWFrUmVmZXJlbmNlICpzZWxmKTsKKworLyogRXhwbGFuYXRpb24gZm9yIHRoZSBQeV9SRUZDTlQoKSBjaGVjazogd2hlbiBhIHdlYWtyZWYncyB0YXJnZXQgaXMgcGFydAorICAgb2YgYSBsb25nIGNoYWluIG9mIGRlYWxsb2NhdGlvbnMgd2hpY2ggdHJpZ2dlcnMgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbSwKKyAgIGNsZWFyaW5nIHRoZSB3ZWFrcmVmcyBjYW4gYmUgZGVsYXllZCBsb25nIGFmdGVyIHRoZSB0YXJnZXQncyByZWZjb3VudAorICAgaGFzIGRyb3BwZWQgdG8gemVyby4gIEluIHRoZSBtZWFudGltZSwgY29kZSBhY2Nlc3NpbmcgdGhlIHdlYWtyZWYgd2lsbAorICAgYmUgYWJsZSB0byAic2VlIiB0aGUgdGFyZ2V0IG9iamVjdCBldmVuIHRob3VnaCBpdCBpcyBzdXBwb3NlZCB0byBiZQorICAgdW5yZWFjaGFibGUuICBTZWUgaXNzdWUgIzE2NjAyLiAqLworCisjZGVmaW5lIFB5V2Vha3JlZl9HRVRfT0JKRUNUKHJlZikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKFB5X1JFRkNOVCgoKFB5V2Vha1JlZmVyZW5jZSAqKShyZWYpKS0+d3Jfb2JqZWN0KSA+IDAgICBcCisgICAgID8gKChQeVdlYWtSZWZlcmVuY2UgKikocmVmKSktPndyX29iamVjdCAgICAgICAgICAgICAgICBcCisgICAgIDogUHlfTm9uZSkKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorI2VuZGlmIC8qICFQeV9XRUFLUkVGT0JKRUNUX0ggKi8KZGlmZiAtLWdpdCBhL2xpYi9saWJweXRob24yLjcuYSBiL2xpYi9saWJweXRob24yLjcuYQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMTY3NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL2xpYnB5dGhvbjIuNy5hCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9wa2djb25maWcvcHl0aG9uLTIuNy5wYyBiL2xpYi9wa2djb25maWcvcHl0aG9uLTIuNy5wYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjhhZGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3BrZ2NvbmZpZy9weXRob24tMi43LnBjCkBAIC0wLDAgKzEsMTMgQEAKK3ByZWZpeD0vdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQKK2V4ZWNfcHJlZml4PSR7cHJlZml4fQorbGliZGlyPSR7ZXhlY19wcmVmaXh9L2xpYgoraW5jbHVkZWRpcj0ke3ByZWZpeH0vaW5jbHVkZQorCitOYW1lOiBQeXRob24KK0Rlc2NyaXB0aW9uOiBQeXRob24gbGlicmFyeQorUmVxdWlyZXM6IAorVmVyc2lvbjogMi43CitMaWJzLnByaXZhdGU6IC1scHRocmVhZCAtbGRsICAtbHV0aWwKK0xpYnM6IC1MJHtsaWJkaXJ9IC1scHl0aG9uMi43CitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfS9weXRob24yLjcgCisKZGlmZiAtLWdpdCBhL2xpYi9wa2djb25maWcvcHl0aG9uLnBjIGIvbGliL3BrZ2NvbmZpZy9weXRob24ucGMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjdkZmY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wa2djb25maWcvcHl0aG9uLnBjCkBAIC0wLDAgKzEgQEAKK3B5dGhvbjIucGMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcGtnY29uZmlnL3B5dGhvbjIucGMgYi9saWIvcGtnY29uZmlnL3B5dGhvbjIucGMKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYjVhYzYwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9wa2djb25maWcvcHl0aG9uMi5wYwpAQCAtMCwwICsxIEBACitweXRob24tMi43LnBjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9CYXNlSFRUUFNlcnZlci5weSBiL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVhZjJmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHkKQEAgLTAsMCArMSw2MDMgQEAKKyIiIkhUVFAgc2VydmVyIGJhc2UgY2xhc3MuCisKK05vdGU6IHRoZSBjbGFzcyBpbiB0aGlzIG1vZHVsZSBkb2Vzbid0IGltcGxlbWVudCBhbnkgSFRUUCByZXF1ZXN0OyBzZWUKK1NpbXBsZUhUVFBTZXJ2ZXIgZm9yIHNpbXBsZSBpbXBsZW1lbnRhdGlvbnMgb2YgR0VULCBIRUFEIGFuZCBQT1NUCisoaW5jbHVkaW5nIENHSSBzY3JpcHRzKS4gIEl0IGRvZXMsIGhvd2V2ZXIsIG9wdGlvbmFsbHkgaW1wbGVtZW50IEhUVFAvMS4xCitwZXJzaXN0ZW50IGNvbm5lY3Rpb25zLCBhcyBvZiB2ZXJzaW9uIDAuMy4KKworQ29udGVudHM6CisKKy0gQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcjogSFRUUCByZXF1ZXN0IGhhbmRsZXIgYmFzZSBjbGFzcworLSB0ZXN0OiB0ZXN0IGZ1bmN0aW9uCisKK1hYWCBUbyBkbzoKKworLSBsb2cgcmVxdWVzdHMgZXZlbiBsYXRlciAodG8gY2FwdHVyZSBieXRlIGNvdW50KQorLSBsb2cgdXNlci1hZ2VudCBoZWFkZXIgYW5kIG90aGVyIGludGVyZXN0aW5nIGdvb2RpZXMKKy0gc2VuZCBlcnJvciBsb2cgdG8gc2VwYXJhdGUgZmlsZQorIiIiCisKKworIyBTZWUgYWxzbzoKKyMKKyMgSFRUUCBXb3JraW5nIEdyb3VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQuIEJlcm5lcnMtTGVlCisjIElOVEVSTkVULURSQUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLiBULiBGaWVsZGluZworIyA8ZHJhZnQtaWV0Zi1odHRwLXYxMC1zcGVjLTAwLnR4dD4gICAgICAgICAgICAgICAgICAgICBILiBGcnlzdHlrIE5pZWxzZW4KKyMgRXhwaXJlcyBTZXB0ZW1iZXIgOCwgMTk5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXJjaCA4LCAxOTk1CisjCisjIFVSTDogaHR0cDovL3d3dy5pY3MudWNpLmVkdS9wdWIvaWV0Zi9odHRwL2RyYWZ0LWlldGYtaHR0cC12MTAtc3BlYy0wMC50eHQKKyMKKyMgYW5kCisjCisjIE5ldHdvcmsgV29ya2luZyBHcm91cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi4gRmllbGRpbmcKKyMgUmVxdWVzdCBmb3IgQ29tbWVudHM6IDI2MTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldCBhbAorIyBPYnNvbGV0ZXM6IDIwNjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnVuZSAxOTk5CisjIENhdGVnb3J5OiBTdGFuZGFyZHMgVHJhY2sKKyMKKyMgVVJMOiBodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjMjYxNi5odG1sCisKKyMgTG9nIGZpbGVzCisjIC0tLS0tLS0tLQorIworIyBIZXJlJ3MgYSBxdW90ZSBmcm9tIHRoZSBOQ1NBIGh0dHBkIGRvY3MgYWJvdXQgbG9nIGZpbGUgZm9ybWF0LgorIworIyB8IFRoZSBsb2dmaWxlIGZvcm1hdCBpcyBhcyBmb2xsb3dzLiBFYWNoIGxpbmUgY29uc2lzdHMgb2Y6CisjIHwKKyMgfCBob3N0IHJmYzkzMSBhdXRodXNlciBbREQvTW9uL1lZWVk6aGg6bW06c3NdICJyZXF1ZXN0IiBkZGQgYmJiYgorIyB8CisjIHwgICAgICAgIGhvc3Q6IEVpdGhlciB0aGUgRE5TIG5hbWUgb3IgdGhlIElQIG51bWJlciBvZiB0aGUgcmVtb3RlIGNsaWVudAorIyB8ICAgICAgICByZmM5MzE6IEFueSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBpZGVudGQgZm9yIHRoaXMgcGVyc29uLAorIyB8ICAgICAgICAgICAgICAgIC0gb3RoZXJ3aXNlLgorIyB8ICAgICAgICBhdXRodXNlcjogSWYgdXNlciBzZW50IGEgdXNlcmlkIGZvciBhdXRoZW50aWNhdGlvbiwgdGhlIHVzZXIgbmFtZSwKKyMgfCAgICAgICAgICAgICAgICAgIC0gb3RoZXJ3aXNlLgorIyB8ICAgICAgICBERDogRGF5CisjIHwgICAgICAgIE1vbjogTW9udGggKGNhbGVuZGFyIG5hbWUpCisjIHwgICAgICAgIFlZWVk6IFllYXIKKyMgfCAgICAgICAgaGg6IGhvdXIgKDI0LWhvdXIgZm9ybWF0LCB0aGUgbWFjaGluZSdzIHRpbWV6b25lKQorIyB8ICAgICAgICBtbTogbWludXRlcworIyB8ICAgICAgICBzczogc2Vjb25kcworIyB8ICAgICAgICByZXF1ZXN0OiBUaGUgZmlyc3QgbGluZSBvZiB0aGUgSFRUUCByZXF1ZXN0IGFzIHNlbnQgYnkgdGhlIGNsaWVudC4KKyMgfCAgICAgICAgZGRkOiB0aGUgc3RhdHVzIGNvZGUgcmV0dXJuZWQgYnkgdGhlIHNlcnZlciwgLSBpZiBub3QgYXZhaWxhYmxlLgorIyB8ICAgICAgICBiYmJiOiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHNlbnQsCisjIHwgICAgICAgICAgICAgICpub3QgaW5jbHVkaW5nIHRoZSBIVFRQLzEuMCBoZWFkZXIqLCAtIGlmIG5vdCBhdmFpbGFibGUKKyMgfAorIyB8IFlvdSBjYW4gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGFjY2Vzc2VkIHRocm91Z2ggcmVxdWVzdC4KKyMKKyMgKEFjdHVhbGx5LCB0aGUgbGF0dGVyIGlzIG9ubHkgdHJ1ZSBpZiB5b3Uga25vdyB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24KKyMgYXQgdGhlIHRpbWUgdGhlIHJlcXVlc3Qgd2FzIG1hZGUhKQorCitfX3ZlcnNpb25fXyA9ICIwLjMiCisKK19fYWxsX18gPSBbIkhUVFBTZXJ2ZXIiLCAiQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciJdCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgc29ja2V0ICMgRm9yIGdldGhvc3RieWFkZHIoKQorZnJvbSB3YXJuaW5ncyBpbXBvcnQgZmlsdGVyd2FybmluZ3MsIGNhdGNoX3dhcm5pbmdzCit3aXRoIGNhdGNoX3dhcm5pbmdzKCk6CisgICAgaWYgc3lzLnB5M2t3YXJuaW5nOgorICAgICAgICBmaWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4qbWltZXRvb2xzIGhhcyBiZWVuIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIGltcG9ydCBtaW1ldG9vbHMKK2ltcG9ydCBTb2NrZXRTZXJ2ZXIKKworIyBEZWZhdWx0IGVycm9yIG1lc3NhZ2UgdGVtcGxhdGUKK0RFRkFVTFRfRVJST1JfTUVTU0FHRSA9ICIiIlwKKzxoZWFkPgorPHRpdGxlPkVycm9yIHJlc3BvbnNlPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGgxPkVycm9yIHJlc3BvbnNlPC9oMT4KKzxwPkVycm9yIGNvZGUgJShjb2RlKWQuCis8cD5NZXNzYWdlOiAlKG1lc3NhZ2Upcy4KKzxwPkVycm9yIGNvZGUgZXhwbGFuYXRpb246ICUoY29kZSlzID0gJShleHBsYWluKXMuCis8L2JvZHk+CisiIiIKKworREVGQVVMVF9FUlJPUl9DT05URU5UX1RZUEUgPSAidGV4dC9odG1sIgorCitkZWYgX3F1b3RlX2h0bWwoaHRtbCk6CisgICAgcmV0dXJuIGh0bWwucmVwbGFjZSgiJiIsICImYW1wOyIpLnJlcGxhY2UoIjwiLCAiJmx0OyIpLnJlcGxhY2UoIj4iLCAiJmd0OyIpCisKK2NsYXNzIEhUVFBTZXJ2ZXIoU29ja2V0U2VydmVyLlRDUFNlcnZlcik6CisKKyAgICBhbGxvd19yZXVzZV9hZGRyZXNzID0gMSAgICAjIFNlZW1zIHRvIG1ha2Ugc2Vuc2UgaW4gdGVzdGluZyBlbnZpcm9ubWVudAorCisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBzZXJ2ZXJfYmluZCB0byBzdG9yZSB0aGUgc2VydmVyIG5hbWUuIiIiCisgICAgICAgIFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIuc2VydmVyX2JpbmQoc2VsZikKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKClbOjJdCisgICAgICAgIHNlbGYuc2VydmVyX25hbWUgPSBzb2NrZXQuZ2V0ZnFkbihob3N0KQorICAgICAgICBzZWxmLnNlcnZlcl9wb3J0ID0gcG9ydAorCisKK2NsYXNzIEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIoU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKworICAgICIiIkhUVFAgcmVxdWVzdCBoYW5kbGVyIGJhc2UgY2xhc3MuCisKKyAgICBUaGUgZm9sbG93aW5nIGV4cGxhbmF0aW9uIG9mIEhUVFAgc2VydmVzIHRvIGd1aWRlIHlvdSB0aHJvdWdoIHRoZQorICAgIGNvZGUgYXMgd2VsbCBhcyB0byBleHBvc2UgYW55IG1pc3VuZGVyc3RhbmRpbmdzIEkgbWF5IGhhdmUgYWJvdXQKKyAgICBIVFRQIChzbyB5b3UgZG9uJ3QgbmVlZCB0byByZWFkIHRoZSBjb2RlIHRvIGZpZ3VyZSBvdXQgSSdtIHdyb25nCisgICAgOi0pLgorCisgICAgSFRUUCAoSHlwZXJUZXh0IFRyYW5zZmVyIFByb3RvY29sKSBpcyBhbiBleHRlbnNpYmxlIHByb3RvY29sIG9uCisgICAgdG9wIG9mIGEgcmVsaWFibGUgc3RyZWFtIHRyYW5zcG9ydCAoZS5nLiBUQ1AvSVApLiAgVGhlIHByb3RvY29sCisgICAgcmVjb2duaXplcyB0aHJlZSBwYXJ0cyB0byBhIHJlcXVlc3Q6CisKKyAgICAxLiBPbmUgbGluZSBpZGVudGlmeWluZyB0aGUgcmVxdWVzdCB0eXBlIGFuZCBwYXRoCisgICAgMi4gQW4gb3B0aW9uYWwgc2V0IG9mIFJGQy04MjItc3R5bGUgaGVhZGVycworICAgIDMuIEFuIG9wdGlvbmFsIGRhdGEgcGFydAorCisgICAgVGhlIGhlYWRlcnMgYW5kIGRhdGEgYXJlIHNlcGFyYXRlZCBieSBhIGJsYW5rIGxpbmUuCisKKyAgICBUaGUgZmlyc3QgbGluZSBvZiB0aGUgcmVxdWVzdCBoYXMgdGhlIGZvcm0KKworICAgIDxjb21tYW5kPiA8cGF0aD4gPHZlcnNpb24+CisKKyAgICB3aGVyZSA8Y29tbWFuZD4gaXMgYSAoY2FzZS1zZW5zaXRpdmUpIGtleXdvcmQgc3VjaCBhcyBHRVQgb3IgUE9TVCwKKyAgICA8cGF0aD4gaXMgYSBzdHJpbmcgY29udGFpbmluZyBwYXRoIGluZm9ybWF0aW9uIGZvciB0aGUgcmVxdWVzdCwKKyAgICBhbmQgPHZlcnNpb24+IHNob3VsZCBiZSB0aGUgc3RyaW5nICJIVFRQLzEuMCIgb3IgIkhUVFAvMS4xIi4KKyAgICA8cGF0aD4gaXMgZW5jb2RlZCB1c2luZyB0aGUgVVJMIGVuY29kaW5nIHNjaGVtZSAodXNpbmcgJXh4IHRvIHNpZ25pZnkKKyAgICB0aGUgQVNDSUkgY2hhcmFjdGVyIHdpdGggaGV4IGNvZGUgeHgpLgorCisgICAgVGhlIHNwZWNpZmljYXRpb24gc3BlY2lmaWVzIHRoYXQgbGluZXMgYXJlIHNlcGFyYXRlZCBieSBDUkxGIGJ1dAorICAgIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHdpZGVzdCByYW5nZSBvZiBjbGllbnRzIHJlY29tbWVuZHMKKyAgICBzZXJ2ZXJzIGFsc28gaGFuZGxlIExGLiAgU2ltaWxhcmx5LCB3aGl0ZXNwYWNlIGluIHRoZSByZXF1ZXN0IGxpbmUKKyAgICBpcyB0cmVhdGVkIHNlbnNpYmx5IChhbGxvd2luZyBtdWx0aXBsZSBzcGFjZXMgYmV0d2VlbiBjb21wb25lbnRzCisgICAgYW5kIGFsbG93aW5nIHRyYWlsaW5nIHdoaXRlc3BhY2UpLgorCisgICAgU2ltaWxhcmx5LCBmb3Igb3V0cHV0LCBsaW5lcyBvdWdodCB0byBiZSBzZXBhcmF0ZWQgYnkgQ1JMRiBwYWlycworICAgIGJ1dCBtb3N0IGNsaWVudHMgZ3JvayBMRiBjaGFyYWN0ZXJzIGp1c3QgZmluZS4KKworICAgIElmIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSByZXF1ZXN0IGhhcyB0aGUgZm9ybQorCisgICAgPGNvbW1hbmQ+IDxwYXRoPgorCisgICAgKGkuZS4gPHZlcnNpb24+IGlzIGxlZnQgb3V0KSB0aGVuIHRoaXMgaXMgYXNzdW1lZCB0byBiZSBhbiBIVFRQCisgICAgMC45IHJlcXVlc3Q7IHRoaXMgZm9ybSBoYXMgbm8gb3B0aW9uYWwgaGVhZGVycyBhbmQgZGF0YSBwYXJ0IGFuZAorICAgIHRoZSByZXBseSBjb25zaXN0cyBvZiBqdXN0IHRoZSBkYXRhLgorCisgICAgVGhlIHJlcGx5IGZvcm0gb2YgdGhlIEhUVFAgMS54IHByb3RvY29sIGFnYWluIGhhcyB0aHJlZSBwYXJ0czoKKworICAgIDEuIE9uZSBsaW5lIGdpdmluZyB0aGUgcmVzcG9uc2UgY29kZQorICAgIDIuIEFuIG9wdGlvbmFsIHNldCBvZiBSRkMtODIyLXN0eWxlIGhlYWRlcnMKKyAgICAzLiBUaGUgZGF0YQorCisgICAgQWdhaW4sIHRoZSBoZWFkZXJzIGFuZCBkYXRhIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLgorCisgICAgVGhlIHJlc3BvbnNlIGNvZGUgbGluZSBoYXMgdGhlIGZvcm0KKworICAgIDx2ZXJzaW9uPiA8cmVzcG9uc2Vjb2RlPiA8cmVzcG9uc2VzdHJpbmc+CisKKyAgICB3aGVyZSA8dmVyc2lvbj4gaXMgdGhlIHByb3RvY29sIHZlcnNpb24gKCJIVFRQLzEuMCIgb3IgIkhUVFAvMS4xIiksCisgICAgPHJlc3BvbnNlY29kZT4gaXMgYSAzLWRpZ2l0IHJlc3BvbnNlIGNvZGUgaW5kaWNhdGluZyBzdWNjZXNzIG9yCisgICAgZmFpbHVyZSBvZiB0aGUgcmVxdWVzdCwgYW5kIDxyZXNwb25zZXN0cmluZz4gaXMgYW4gb3B0aW9uYWwKKyAgICBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZXhwbGFpbmluZyB3aGF0IHRoZSByZXNwb25zZSBjb2RlIG1lYW5zLgorCisgICAgVGhpcyBzZXJ2ZXIgcGFyc2VzIHRoZSByZXF1ZXN0IGFuZCB0aGUgaGVhZGVycywgYW5kIHRoZW4gY2FsbHMgYQorICAgIGZ1bmN0aW9uIHNwZWNpZmljIHRvIHRoZSByZXF1ZXN0IHR5cGUgKDxjb21tYW5kPikuICBTcGVjaWZpY2FsbHksCisgICAgYSByZXF1ZXN0IFNQQU0gd2lsbCBiZSBoYW5kbGVkIGJ5IGEgbWV0aG9kIGRvX1NQQU0oKS4gIElmIG5vCisgICAgc3VjaCBtZXRob2QgZXhpc3RzIHRoZSBzZXJ2ZXIgc2VuZHMgYW4gZXJyb3IgcmVzcG9uc2UgdG8gdGhlCisgICAgY2xpZW50LiAgSWYgaXQgZXhpc3RzLCBpdCBpcyBjYWxsZWQgd2l0aCBubyBhcmd1bWVudHM6CisKKyAgICBkb19TUEFNKCkKKworICAgIE5vdGUgdGhhdCB0aGUgcmVxdWVzdCBuYW1lIGlzIGNhc2Ugc2Vuc2l0aXZlIChpLmUuIFNQQU0gYW5kIHNwYW0KKyAgICBhcmUgZGlmZmVyZW50IHJlcXVlc3RzKS4KKworICAgIFRoZSB2YXJpb3VzIHJlcXVlc3QgZGV0YWlscyBhcmUgc3RvcmVkIGluIGluc3RhbmNlIHZhcmlhYmxlczoKKworICAgIC0gY2xpZW50X2FkZHJlc3MgaXMgdGhlIGNsaWVudCBJUCBhZGRyZXNzIGluIHRoZSBmb3JtIChob3N0LAorICAgIHBvcnQpOworCisgICAgLSBjb21tYW5kLCBwYXRoIGFuZCB2ZXJzaW9uIGFyZSB0aGUgYnJva2VuLWRvd24gcmVxdWVzdCBsaW5lOworCisgICAgLSBoZWFkZXJzIGlzIGFuIGluc3RhbmNlIG9mIG1pbWV0b29scy5NZXNzYWdlIChvciBhIGRlcml2ZWQKKyAgICBjbGFzcykgY29udGFpbmluZyB0aGUgaGVhZGVyIGluZm9ybWF0aW9uOworCisgICAgLSByZmlsZSBpcyBhIGZpbGUgb2JqZWN0IG9wZW4gZm9yIHJlYWRpbmcgcG9zaXRpb25lZCBhdCB0aGUKKyAgICBzdGFydCBvZiB0aGUgb3B0aW9uYWwgaW5wdXQgZGF0YSBwYXJ0OworCisgICAgLSB3ZmlsZSBpcyBhIGZpbGUgb2JqZWN0IG9wZW4gZm9yIHdyaXRpbmcuCisKKyAgICBJVCBJUyBJTVBPUlRBTlQgVE8gQURIRVJFIFRPIFRIRSBQUk9UT0NPTCBGT1IgV1JJVElORyEKKworICAgIFRoZSBmaXJzdCB0aGluZyB0byBiZSB3cml0dGVuIG11c3QgYmUgdGhlIHJlc3BvbnNlIGxpbmUuICBUaGVuCisgICAgZm9sbG93IDAgb3IgbW9yZSBoZWFkZXIgbGluZXMsIHRoZW4gYSBibGFuayBsaW5lLCBhbmQgdGhlbiB0aGUKKyAgICBhY3R1YWwgZGF0YSAoaWYgYW55KS4gIFRoZSBtZWFuaW5nIG9mIHRoZSBoZWFkZXIgbGluZXMgZGVwZW5kcyBvbgorICAgIHRoZSBjb21tYW5kIGV4ZWN1dGVkIGJ5IHRoZSBzZXJ2ZXI7IGluIG1vc3QgY2FzZXMsIHdoZW4gZGF0YSBpcworICAgIHJldHVybmVkLCB0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGhlYWRlciBsaW5lIG9mIHRoZSBmb3JtCisKKyAgICBDb250ZW50LXR5cGU6IDx0eXBlPi88c3VidHlwZT4KKworICAgIHdoZXJlIDx0eXBlPiBhbmQgPHN1YnR5cGU+IHNob3VsZCBiZSByZWdpc3RlcmVkIE1JTUUgdHlwZXMsCisgICAgZS5nLiAidGV4dC9odG1sIiBvciAidGV4dC9wbGFpbiIuCisKKyAgICAiIiIKKworICAgICMgVGhlIFB5dGhvbiBzeXN0ZW0gdmVyc2lvbiwgdHJ1bmNhdGVkIHRvIGl0cyBmaXJzdCBjb21wb25lbnQuCisgICAgc3lzX3ZlcnNpb24gPSAiUHl0aG9uLyIgKyBzeXMudmVyc2lvbi5zcGxpdCgpWzBdCisKKyAgICAjIFRoZSBzZXJ2ZXIgc29mdHdhcmUgdmVyc2lvbi4gIFlvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGlzLgorICAgICMgVGhlIGZvcm1hdCBpcyBtdWx0aXBsZSB3aGl0ZXNwYWNlLXNlcGFyYXRlZCBzdHJpbmdzLAorICAgICMgd2hlcmUgZWFjaCBzdHJpbmcgaXMgb2YgdGhlIGZvcm0gbmFtZVsvdmVyc2lvbl0uCisgICAgc2VydmVyX3ZlcnNpb24gPSAiQmFzZUhUVFAvIiArIF9fdmVyc2lvbl9fCisKKyAgICAjIFRoZSBkZWZhdWx0IHJlcXVlc3QgdmVyc2lvbi4gIFRoaXMgb25seSBhZmZlY3RzIHJlc3BvbnNlcyB1cCB1bnRpbAorICAgICMgdGhlIHBvaW50IHdoZXJlIHRoZSByZXF1ZXN0IGxpbmUgaXMgcGFyc2VkLCBzbyBpdCBtYWlubHkgZGVjaWRlcyB3aGF0CisgICAgIyB0aGUgY2xpZW50IGdldHMgYmFjayB3aGVuIHNlbmRpbmcgYSBtYWxmb3JtZWQgcmVxdWVzdCBsaW5lLgorICAgICMgTW9zdCB3ZWIgc2VydmVycyBkZWZhdWx0IHRvIEhUVFAgMC45LCBpLmUuIGRvbid0IHNlbmQgYSBzdGF0dXMgbGluZS4KKyAgICBkZWZhdWx0X3JlcXVlc3RfdmVyc2lvbiA9ICJIVFRQLzAuOSIKKworICAgIGRlZiBwYXJzZV9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhIHJlcXVlc3QgKGludGVybmFsKS4KKworICAgICAgICBUaGUgcmVxdWVzdCBzaG91bGQgYmUgc3RvcmVkIGluIHNlbGYucmF3X3JlcXVlc3RsaW5lOyB0aGUgcmVzdWx0cworICAgICAgICBhcmUgaW4gc2VsZi5jb21tYW5kLCBzZWxmLnBhdGgsIHNlbGYucmVxdWVzdF92ZXJzaW9uIGFuZAorICAgICAgICBzZWxmLmhlYWRlcnMuCisKKyAgICAgICAgUmV0dXJuIFRydWUgZm9yIHN1Y2Nlc3MsIEZhbHNlIGZvciBmYWlsdXJlOyBvbiBmYWlsdXJlLCBhbgorICAgICAgICBlcnJvciBpcyBzZW50IGJhY2suCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY29tbWFuZCA9IE5vbmUgICMgc2V0IGluIGNhc2Ugb2YgZXJyb3Igb24gdGhlIGZpcnN0IGxpbmUKKyAgICAgICAgc2VsZi5yZXF1ZXN0X3ZlcnNpb24gPSB2ZXJzaW9uID0gc2VsZi5kZWZhdWx0X3JlcXVlc3RfdmVyc2lvbgorICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAxCisgICAgICAgIHJlcXVlc3RsaW5lID0gc2VsZi5yYXdfcmVxdWVzdGxpbmUKKyAgICAgICAgcmVxdWVzdGxpbmUgPSByZXF1ZXN0bGluZS5yc3RyaXAoJ1xyXG4nKQorICAgICAgICBzZWxmLnJlcXVlc3RsaW5lID0gcmVxdWVzdGxpbmUKKyAgICAgICAgd29yZHMgPSByZXF1ZXN0bGluZS5zcGxpdCgpCisgICAgICAgIGlmIGxlbih3b3JkcykgPT0gMzoKKyAgICAgICAgICAgIGNvbW1hbmQsIHBhdGgsIHZlcnNpb24gPSB3b3JkcworICAgICAgICAgICAgaWYgdmVyc2lvbls6NV0gIT0gJ0hUVFAvJzoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDAwLCAiQmFkIHJlcXVlc3QgdmVyc2lvbiAoJXIpIiAlIHZlcnNpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYmFzZV92ZXJzaW9uX251bWJlciA9IHZlcnNpb24uc3BsaXQoJy8nLCAxKVsxXQorICAgICAgICAgICAgICAgIHZlcnNpb25fbnVtYmVyID0gYmFzZV92ZXJzaW9uX251bWJlci5zcGxpdCgiLiIpCisgICAgICAgICAgICAgICAgIyBSRkMgMjE0NSBzZWN0aW9uIDMuMSBzYXlzIHRoZXJlIGNhbiBiZSBvbmx5IG9uZSAiLiIgYW5kCisgICAgICAgICAgICAgICAgIyAgIC0gbWFqb3IgYW5kIG1pbm9yIG51bWJlcnMgTVVTVCBiZSB0cmVhdGVkIGFzCisgICAgICAgICAgICAgICAgIyAgICAgIHNlcGFyYXRlIGludGVnZXJzOworICAgICAgICAgICAgICAgICMgICAtIEhUVFAvMi40IGlzIGEgbG93ZXIgdmVyc2lvbiB0aGFuIEhUVFAvMi4xMywgd2hpY2ggaW4KKyAgICAgICAgICAgICAgICAjICAgICAgdHVybiBpcyBsb3dlciB0aGFuIEhUVFAvMTIuMzsKKyAgICAgICAgICAgICAgICAjICAgLSBMZWFkaW5nIHplcm9zIE1VU1QgYmUgaWdub3JlZCBieSByZWNpcGllbnRzLgorICAgICAgICAgICAgICAgIGlmIGxlbih2ZXJzaW9uX251bWJlcikgIT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgICAgIHZlcnNpb25fbnVtYmVyID0gaW50KHZlcnNpb25fbnVtYmVyWzBdKSwgaW50KHZlcnNpb25fbnVtYmVyWzFdKQorICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDAwLCAiQmFkIHJlcXVlc3QgdmVyc2lvbiAoJXIpIiAlIHZlcnNpb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiB2ZXJzaW9uX251bWJlciA+PSAoMSwgMSkgYW5kIHNlbGYucHJvdG9jb2xfdmVyc2lvbiA+PSAiSFRUUC8xLjEiOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDAKKyAgICAgICAgICAgIGlmIHZlcnNpb25fbnVtYmVyID49ICgyLCAwKToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNTA1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBIVFRQIFZlcnNpb24gKCVzKSIgJSBiYXNlX3ZlcnNpb25fbnVtYmVyKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbGlmIGxlbih3b3JkcykgPT0gMjoKKyAgICAgICAgICAgIGNvbW1hbmQsIHBhdGggPSB3b3JkcworICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQorICAgICAgICAgICAgaWYgY29tbWFuZCAhPSAnR0VUJzoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIEhUVFAvMC45IHJlcXVlc3QgdHlwZSAoJXIpIiAlIGNvbW1hbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsaWYgbm90IHdvcmRzOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDAwLCAiQmFkIHJlcXVlc3Qgc3ludGF4ICglcikiICUgcmVxdWVzdGxpbmUpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5jb21tYW5kLCBzZWxmLnBhdGgsIHNlbGYucmVxdWVzdF92ZXJzaW9uID0gY29tbWFuZCwgcGF0aCwgdmVyc2lvbgorCisgICAgICAgICMgRXhhbWluZSB0aGUgaGVhZGVycyBhbmQgbG9vayBmb3IgYSBDb25uZWN0aW9uIGRpcmVjdGl2ZQorICAgICAgICBzZWxmLmhlYWRlcnMgPSBzZWxmLk1lc3NhZ2VDbGFzcyhzZWxmLnJmaWxlLCAwKQorCisgICAgICAgIGNvbm50eXBlID0gc2VsZi5oZWFkZXJzLmdldCgnQ29ubmVjdGlvbicsICIiKQorICAgICAgICBpZiBjb25udHlwZS5sb3dlcigpID09ICdjbG9zZSc6CisgICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAxCisgICAgICAgIGVsaWYgKGNvbm50eXBlLmxvd2VyKCkgPT0gJ2tlZXAtYWxpdmUnIGFuZAorICAgICAgICAgICAgICBzZWxmLnByb3RvY29sX3ZlcnNpb24gPj0gIkhUVFAvMS4xIik6CisgICAgICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAwCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgaGFuZGxlX29uZV9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgYSBzaW5nbGUgSFRUUCByZXF1ZXN0LgorCisgICAgICAgIFlvdSBub3JtYWxseSBkb24ndCBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kOyBzZWUgdGhlIGNsYXNzCisgICAgICAgIF9fZG9jX18gc3RyaW5nIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaGFuZGxlIHNwZWNpZmljIEhUVFAKKyAgICAgICAgY29tbWFuZHMgc3VjaCBhcyBHRVQgYW5kIFBPU1QuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucmF3X3JlcXVlc3RsaW5lID0gc2VsZi5yZmlsZS5yZWFkbGluZSg2NTUzNykKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLnJhd19yZXF1ZXN0bGluZSkgPiA2NTUzNjoKKyAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3RsaW5lID0gJycKKyAgICAgICAgICAgICAgICBzZWxmLnJlcXVlc3RfdmVyc2lvbiA9ICcnCisgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kID0gJycKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDE0KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbm90IHNlbGYucmF3X3JlcXVlc3RsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhcnNlX3JlcXVlc3QoKToKKyAgICAgICAgICAgICAgICAjIEFuIGVycm9yIGNvZGUgaGFzIGJlZW4gc2VudCwganVzdCBleGl0CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBtbmFtZSA9ICdkb18nICsgc2VsZi5jb21tYW5kCisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCBtbmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDUwMSwgIlVuc3VwcG9ydGVkIG1ldGhvZCAoJXIpIiAlIHNlbGYuY29tbWFuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgbW5hbWUpCisgICAgICAgICAgICBtZXRob2QoKQorICAgICAgICAgICAgc2VsZi53ZmlsZS5mbHVzaCgpICNhY3R1YWxseSBzZW5kIHRoZSByZXNwb25zZSBpZiBub3QgYWxyZWFkeSBkb25lLgorICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQsIGU6CisgICAgICAgICAgICAjYSByZWFkIG9yIGEgd3JpdGUgdGltZWQgb3V0LiAgRGlzY2FyZCB0aGlzIGNvbm5lY3Rpb24KKyAgICAgICAgICAgIHNlbGYubG9nX2Vycm9yKCJSZXF1ZXN0IHRpbWVkIG91dDogJXIiLCBlKQorICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgbXVsdGlwbGUgcmVxdWVzdHMgaWYgbmVjZXNzYXJ5LiIiIgorICAgICAgICBzZWxmLmNsb3NlX2Nvbm5lY3Rpb24gPSAxCisKKyAgICAgICAgc2VsZi5oYW5kbGVfb25lX3JlcXVlc3QoKQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5jbG9zZV9jb25uZWN0aW9uOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfb25lX3JlcXVlc3QoKQorCisgICAgZGVmIHNlbmRfZXJyb3Ioc2VsZiwgY29kZSwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgIiIiU2VuZCBhbmQgbG9nIGFuIGVycm9yIHJlcGx5LgorCisgICAgICAgIEFyZ3VtZW50cyBhcmUgdGhlIGVycm9yIGNvZGUsIGFuZCBhIGRldGFpbGVkIG1lc3NhZ2UuCisgICAgICAgIFRoZSBkZXRhaWxlZCBtZXNzYWdlIGRlZmF1bHRzIHRvIHRoZSBzaG9ydCBlbnRyeSBtYXRjaGluZyB0aGUKKyAgICAgICAgcmVzcG9uc2UgY29kZS4KKworICAgICAgICBUaGlzIHNlbmRzIGFuIGVycm9yIHJlc3BvbnNlIChzbyBpdCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55CisgICAgICAgIG91dHB1dCBoYXMgYmVlbiBnZW5lcmF0ZWQpLCBsb2dzIHRoZSBlcnJvciwgYW5kIGZpbmFsbHkgc2VuZHMKKyAgICAgICAgYSBwaWVjZSBvZiBIVE1MIGV4cGxhaW5pbmcgdGhlIGVycm9yIHRvIHRoZSB1c2VyLgorCisgICAgICAgICIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNob3J0LCBsb25nID0gc2VsZi5yZXNwb25zZXNbY29kZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2hvcnQsIGxvbmcgPSAnPz8/JywgJz8/PycKKyAgICAgICAgaWYgbWVzc2FnZSBpcyBOb25lOgorICAgICAgICAgICAgbWVzc2FnZSA9IHNob3J0CisgICAgICAgIGV4cGxhaW4gPSBsb25nCisgICAgICAgIHNlbGYubG9nX2Vycm9yKCJjb2RlICVkLCBtZXNzYWdlICVzIiwgY29kZSwgbWVzc2FnZSkKKyAgICAgICAgIyB1c2luZyBfcXVvdGVfaHRtbCB0byBwcmV2ZW50IENyb3NzIFNpdGUgU2NyaXB0aW5nIGF0dGFja3MgKHNlZSBidWcgIzExMDAyMDEpCisgICAgICAgIGNvbnRlbnQgPSAoc2VsZi5lcnJvcl9tZXNzYWdlX2Zvcm1hdCAlCisgICAgICAgICAgICAgICAgICAgeydjb2RlJzogY29kZSwgJ21lc3NhZ2UnOiBfcXVvdGVfaHRtbChtZXNzYWdlKSwgJ2V4cGxhaW4nOiBleHBsYWlufSkKKyAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKGNvZGUsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtVHlwZSIsIHNlbGYuZXJyb3JfY29udGVudF90eXBlKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb25uZWN0aW9uJywgJ2Nsb3NlJykKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIGlmIHNlbGYuY29tbWFuZCAhPSAnSEVBRCcgYW5kIGNvZGUgPj0gMjAwIGFuZCBjb2RlIG5vdCBpbiAoMjA0LCAzMDQpOgorICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShjb250ZW50KQorCisgICAgZXJyb3JfbWVzc2FnZV9mb3JtYXQgPSBERUZBVUxUX0VSUk9SX01FU1NBR0UKKyAgICBlcnJvcl9jb250ZW50X3R5cGUgPSBERUZBVUxUX0VSUk9SX0NPTlRFTlRfVFlQRQorCisgICAgZGVmIHNlbmRfcmVzcG9uc2Uoc2VsZiwgY29kZSwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgIiIiU2VuZCB0aGUgcmVzcG9uc2UgaGVhZGVyIGFuZCBsb2cgdGhlIHJlc3BvbnNlIGNvZGUuCisKKyAgICAgICAgQWxzbyBzZW5kIHR3byBzdGFuZGFyZCBoZWFkZXJzIHdpdGggdGhlIHNlcnZlciBzb2Z0d2FyZQorICAgICAgICB2ZXJzaW9uIGFuZCB0aGUgY3VycmVudCBkYXRlLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxvZ19yZXF1ZXN0KGNvZGUpCisgICAgICAgIGlmIG1lc3NhZ2UgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGNvZGUgaW4gc2VsZi5yZXNwb25zZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHNlbGYucmVzcG9uc2VzW2NvZGVdWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAnJworICAgICAgICBpZiBzZWxmLnJlcXVlc3RfdmVyc2lvbiAhPSAnSFRUUC8wLjknOgorICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZSgiJXMgJWQgJXNcclxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnByb3RvY29sX3ZlcnNpb24sIGNvZGUsIG1lc3NhZ2UpKQorICAgICAgICAgICAgIyBwcmludCAoc2VsZi5wcm90b2NvbF92ZXJzaW9uLCBjb2RlLCBtZXNzYWdlKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdTZXJ2ZXInLCBzZWxmLnZlcnNpb25fc3RyaW5nKCkpCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0RhdGUnLCBzZWxmLmRhdGVfdGltZV9zdHJpbmcoKSkKKworICAgIGRlZiBzZW5kX2hlYWRlcihzZWxmLCBrZXl3b3JkLCB2YWx1ZSk6CisgICAgICAgICIiIlNlbmQgYSBNSU1FIGhlYWRlci4iIiIKKyAgICAgICAgaWYgc2VsZi5yZXF1ZXN0X3ZlcnNpb24gIT0gJ0hUVFAvMC45JzoKKyAgICAgICAgICAgIHNlbGYud2ZpbGUud3JpdGUoIiVzOiAlc1xyXG4iICUgKGtleXdvcmQsIHZhbHVlKSkKKworICAgICAgICBpZiBrZXl3b3JkLmxvd2VyKCkgPT0gJ2Nvbm5lY3Rpb24nOgorICAgICAgICAgICAgaWYgdmFsdWUubG93ZXIoKSA9PSAnY2xvc2UnOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY29ubmVjdGlvbiA9IDEKKyAgICAgICAgICAgIGVsaWYgdmFsdWUubG93ZXIoKSA9PSAna2VlcC1hbGl2ZSc6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9jb25uZWN0aW9uID0gMAorCisgICAgZGVmIGVuZF9oZWFkZXJzKHNlbGYpOgorICAgICAgICAiIiJTZW5kIHRoZSBibGFuayBsaW5lIGVuZGluZyB0aGUgTUlNRSBoZWFkZXJzLiIiIgorICAgICAgICBpZiBzZWxmLnJlcXVlc3RfdmVyc2lvbiAhPSAnSFRUUC8wLjknOgorICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZSgiXHJcbiIpCisKKyAgICBkZWYgbG9nX3JlcXVlc3Qoc2VsZiwgY29kZT0nLScsIHNpemU9Jy0nKToKKyAgICAgICAgIiIiTG9nIGFuIGFjY2VwdGVkIHJlcXVlc3QuCisKKyAgICAgICAgVGhpcyBpcyBjYWxsZWQgYnkgc2VuZF9yZXNwb25zZSgpLgorCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoJyIlcyIgJXMgJXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWVzdGxpbmUsIHN0cihjb2RlKSwgc3RyKHNpemUpKQorCisgICAgZGVmIGxvZ19lcnJvcihzZWxmLCBmb3JtYXQsICphcmdzKToKKyAgICAgICAgIiIiTG9nIGFuIGVycm9yLgorCisgICAgICAgIFRoaXMgaXMgY2FsbGVkIHdoZW4gYSByZXF1ZXN0IGNhbm5vdCBiZSBmdWxmaWxsZWQuICBCeQorICAgICAgICBkZWZhdWx0IGl0IHBhc3NlcyB0aGUgbWVzc2FnZSBvbiB0byBsb2dfbWVzc2FnZSgpLgorCisgICAgICAgIEFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIGxvZ19tZXNzYWdlKCkuCisKKyAgICAgICAgWFhYIFRoaXMgc2hvdWxkIGdvIHRvIHRoZSBzZXBhcmF0ZSBlcnJvciBsb2cuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5sb2dfbWVzc2FnZShmb3JtYXQsICphcmdzKQorCisgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIGZvcm1hdCwgKmFyZ3MpOgorICAgICAgICAiIiJMb2cgYW4gYXJiaXRyYXJ5IG1lc3NhZ2UuCisKKyAgICAgICAgVGhpcyBpcyB1c2VkIGJ5IGFsbCBvdGhlciBsb2dnaW5nIGZ1bmN0aW9ucy4gIE92ZXJyaWRlCisgICAgICAgIGl0IGlmIHlvdSBoYXZlIHNwZWNpZmljIGxvZ2dpbmcgd2lzaGVzLgorCisgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCwgRk9STUFULCBpcyBhIGZvcm1hdCBzdHJpbmcgZm9yIHRoZQorICAgICAgICBtZXNzYWdlIHRvIGJlIGxvZ2dlZC4gIElmIHRoZSBmb3JtYXQgc3RyaW5nIGNvbnRhaW5zCisgICAgICAgIGFueSAlIGVzY2FwZXMgcmVxdWlyaW5nIHBhcmFtZXRlcnMsIHRoZXkgc2hvdWxkIGJlCisgICAgICAgIHNwZWNpZmllZCBhcyBzdWJzZXF1ZW50IGFyZ3VtZW50cyAoaXQncyBqdXN0IGxpa2UKKyAgICAgICAgcHJpbnRmISkuCisKKyAgICAgICAgVGhlIGNsaWVudCBpcCBhZGRyZXNzIGFuZCBjdXJyZW50IGRhdGUvdGltZSBhcmUgcHJlZml4ZWQgdG8gZXZlcnkKKyAgICAgICAgbWVzc2FnZS4KKworICAgICAgICAiIiIKKworICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlcyAtIC0gWyVzXSAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuY2xpZW50X2FkZHJlc3NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nX2RhdGVfdGltZV9zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0JWFyZ3MpKQorCisgICAgZGVmIHZlcnNpb25fc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHNlcnZlciBzb2Z0d2FyZSB2ZXJzaW9uIHN0cmluZy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VydmVyX3ZlcnNpb24gKyAnICcgKyBzZWxmLnN5c192ZXJzaW9uCisKKyAgICBkZWYgZGF0ZV90aW1lX3N0cmluZyhzZWxmLCB0aW1lc3RhbXA9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGZvcm1hdHRlZCBmb3IgYSBtZXNzYWdlIGhlYWRlci4iIiIKKyAgICAgICAgaWYgdGltZXN0YW1wIGlzIE5vbmU6CisgICAgICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLnRpbWUoKQorICAgICAgICB5ZWFyLCBtb250aCwgZGF5LCBoaCwgbW0sIHNzLCB3ZCwgeSwgeiA9IHRpbWUuZ210aW1lKHRpbWVzdGFtcCkKKyAgICAgICAgcyA9ICIlcywgJTAyZCAlM3MgJTRkICUwMmQ6JTAyZDolMDJkIEdNVCIgJSAoCisgICAgICAgICAgICAgICAgc2VsZi53ZWVrZGF5bmFtZVt3ZF0sCisgICAgICAgICAgICAgICAgZGF5LCBzZWxmLm1vbnRobmFtZVttb250aF0sIHllYXIsCisgICAgICAgICAgICAgICAgaGgsIG1tLCBzcykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBsb2dfZGF0ZV90aW1lX3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IHRpbWUgZm9ybWF0dGVkIGZvciBsb2dnaW5nLiIiIgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICB5ZWFyLCBtb250aCwgZGF5LCBoaCwgbW0sIHNzLCB4LCB5LCB6ID0gdGltZS5sb2NhbHRpbWUobm93KQorICAgICAgICBzID0gIiUwMmQvJTNzLyUwNGQgJTAyZDolMDJkOiUwMmQiICUgKAorICAgICAgICAgICAgICAgIGRheSwgc2VsZi5tb250aG5hbWVbbW9udGhdLCB5ZWFyLCBoaCwgbW0sIHNzKQorICAgICAgICByZXR1cm4gcworCisgICAgd2Vla2RheW5hbWUgPSBbJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0JywgJ1N1biddCisKKyAgICBtb250aG5hbWUgPSBbTm9uZSwKKyAgICAgICAgICAgICAgICAgJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywKKyAgICAgICAgICAgICAgICAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ10KKworICAgIGRlZiBhZGRyZXNzX3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjbGllbnQgYWRkcmVzcyBmb3JtYXR0ZWQgZm9yIGxvZ2dpbmcuCisKKyAgICAgICAgVGhpcyB2ZXJzaW9uIGxvb2tzIHVwIHRoZSBmdWxsIGhvc3RuYW1lIHVzaW5nIGdldGhvc3RieWFkZHIoKSwKKyAgICAgICAgYW5kIHRyaWVzIHRvIGZpbmQgYSBuYW1lIHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGRvdC4KKworICAgICAgICAiIiIKKworICAgICAgICBob3N0LCBwb3J0ID0gc2VsZi5jbGllbnRfYWRkcmVzc1s6Ml0KKyAgICAgICAgcmV0dXJuIHNvY2tldC5nZXRmcWRuKGhvc3QpCisKKyAgICAjIEVzc2VudGlhbGx5IHN0YXRpYyBjbGFzcyB2YXJpYWJsZXMKKworICAgICMgVGhlIHZlcnNpb24gb2YgdGhlIEhUVFAgcHJvdG9jb2wgd2Ugc3VwcG9ydC4KKyAgICAjIFNldCB0aGlzIHRvIEhUVFAvMS4xIHRvIGVuYWJsZSBhdXRvbWF0aWMga2VlcGFsaXZlCisgICAgcHJvdG9jb2xfdmVyc2lvbiA9ICJIVFRQLzEuMCIKKworICAgICMgVGhlIE1lc3NhZ2UtbGlrZSBjbGFzcyB1c2VkIHRvIHBhcnNlIGhlYWRlcnMKKyAgICBNZXNzYWdlQ2xhc3MgPSBtaW1ldG9vbHMuTWVzc2FnZQorCisgICAgIyBUYWJsZSBtYXBwaW5nIHJlc3BvbnNlIGNvZGVzIHRvIG1lc3NhZ2VzOyBlbnRyaWVzIGhhdmUgdGhlCisgICAgIyBmb3JtIHtjb2RlOiAoc2hvcnRtZXNzYWdlLCBsb25nbWVzc2FnZSl9LgorICAgICMgU2VlIFJGQyAyNjE2LgorICAgIHJlc3BvbnNlcyA9IHsKKyAgICAgICAgMTAwOiAoJ0NvbnRpbnVlJywgJ1JlcXVlc3QgcmVjZWl2ZWQsIHBsZWFzZSBjb250aW51ZScpLAorICAgICAgICAxMDE6ICgnU3dpdGNoaW5nIFByb3RvY29scycsCisgICAgICAgICAgICAgICdTd2l0Y2hpbmcgdG8gbmV3IHByb3RvY29sOyBvYmV5IFVwZ3JhZGUgaGVhZGVyJyksCisKKyAgICAgICAgMjAwOiAoJ09LJywgJ1JlcXVlc3QgZnVsZmlsbGVkLCBkb2N1bWVudCBmb2xsb3dzJyksCisgICAgICAgIDIwMTogKCdDcmVhdGVkJywgJ0RvY3VtZW50IGNyZWF0ZWQsIFVSTCBmb2xsb3dzJyksCisgICAgICAgIDIwMjogKCdBY2NlcHRlZCcsCisgICAgICAgICAgICAgICdSZXF1ZXN0IGFjY2VwdGVkLCBwcm9jZXNzaW5nIGNvbnRpbnVlcyBvZmYtbGluZScpLAorICAgICAgICAyMDM6ICgnTm9uLUF1dGhvcml0YXRpdmUgSW5mb3JtYXRpb24nLCAnUmVxdWVzdCBmdWxmaWxsZWQgZnJvbSBjYWNoZScpLAorICAgICAgICAyMDQ6ICgnTm8gQ29udGVudCcsICdSZXF1ZXN0IGZ1bGZpbGxlZCwgbm90aGluZyBmb2xsb3dzJyksCisgICAgICAgIDIwNTogKCdSZXNldCBDb250ZW50JywgJ0NsZWFyIGlucHV0IGZvcm0gZm9yIGZ1cnRoZXIgaW5wdXQuJyksCisgICAgICAgIDIwNjogKCdQYXJ0aWFsIENvbnRlbnQnLCAnUGFydGlhbCBjb250ZW50IGZvbGxvd3MuJyksCisKKyAgICAgICAgMzAwOiAoJ011bHRpcGxlIENob2ljZXMnLAorICAgICAgICAgICAgICAnT2JqZWN0IGhhcyBzZXZlcmFsIHJlc291cmNlcyAtLSBzZWUgVVJJIGxpc3QnKSwKKyAgICAgICAgMzAxOiAoJ01vdmVkIFBlcm1hbmVudGx5JywgJ09iamVjdCBtb3ZlZCBwZXJtYW5lbnRseSAtLSBzZWUgVVJJIGxpc3QnKSwKKyAgICAgICAgMzAyOiAoJ0ZvdW5kJywgJ09iamVjdCBtb3ZlZCB0ZW1wb3JhcmlseSAtLSBzZWUgVVJJIGxpc3QnKSwKKyAgICAgICAgMzAzOiAoJ1NlZSBPdGhlcicsICdPYmplY3QgbW92ZWQgLS0gc2VlIE1ldGhvZCBhbmQgVVJMIGxpc3QnKSwKKyAgICAgICAgMzA0OiAoJ05vdCBNb2RpZmllZCcsCisgICAgICAgICAgICAgICdEb2N1bWVudCBoYXMgbm90IGNoYW5nZWQgc2luY2UgZ2l2ZW4gdGltZScpLAorICAgICAgICAzMDU6ICgnVXNlIFByb3h5JywKKyAgICAgICAgICAgICAgJ1lvdSBtdXN0IHVzZSBwcm94eSBzcGVjaWZpZWQgaW4gTG9jYXRpb24gdG8gYWNjZXNzIHRoaXMgJworICAgICAgICAgICAgICAncmVzb3VyY2UuJyksCisgICAgICAgIDMwNzogKCdUZW1wb3JhcnkgUmVkaXJlY3QnLAorICAgICAgICAgICAgICAnT2JqZWN0IG1vdmVkIHRlbXBvcmFyaWx5IC0tIHNlZSBVUkkgbGlzdCcpLAorCisgICAgICAgIDQwMDogKCdCYWQgUmVxdWVzdCcsCisgICAgICAgICAgICAgICdCYWQgcmVxdWVzdCBzeW50YXggb3IgdW5zdXBwb3J0ZWQgbWV0aG9kJyksCisgICAgICAgIDQwMTogKCdVbmF1dGhvcml6ZWQnLAorICAgICAgICAgICAgICAnTm8gcGVybWlzc2lvbiAtLSBzZWUgYXV0aG9yaXphdGlvbiBzY2hlbWVzJyksCisgICAgICAgIDQwMjogKCdQYXltZW50IFJlcXVpcmVkJywKKyAgICAgICAgICAgICAgJ05vIHBheW1lbnQgLS0gc2VlIGNoYXJnaW5nIHNjaGVtZXMnKSwKKyAgICAgICAgNDAzOiAoJ0ZvcmJpZGRlbicsCisgICAgICAgICAgICAgICdSZXF1ZXN0IGZvcmJpZGRlbiAtLSBhdXRob3JpemF0aW9uIHdpbGwgbm90IGhlbHAnKSwKKyAgICAgICAgNDA0OiAoJ05vdCBGb3VuZCcsICdOb3RoaW5nIG1hdGNoZXMgdGhlIGdpdmVuIFVSSScpLAorICAgICAgICA0MDU6ICgnTWV0aG9kIE5vdCBBbGxvd2VkJywKKyAgICAgICAgICAgICAgJ1NwZWNpZmllZCBtZXRob2QgaXMgaW52YWxpZCBmb3IgdGhpcyByZXNvdXJjZS4nKSwKKyAgICAgICAgNDA2OiAoJ05vdCBBY2NlcHRhYmxlJywgJ1VSSSBub3QgYXZhaWxhYmxlIGluIHByZWZlcnJlZCBmb3JtYXQuJyksCisgICAgICAgIDQwNzogKCdQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCcsICdZb3UgbXVzdCBhdXRoZW50aWNhdGUgd2l0aCAnCisgICAgICAgICAgICAgICd0aGlzIHByb3h5IGJlZm9yZSBwcm9jZWVkaW5nLicpLAorICAgICAgICA0MDg6ICgnUmVxdWVzdCBUaW1lb3V0JywgJ1JlcXVlc3QgdGltZWQgb3V0OyB0cnkgYWdhaW4gbGF0ZXIuJyksCisgICAgICAgIDQwOTogKCdDb25mbGljdCcsICdSZXF1ZXN0IGNvbmZsaWN0LicpLAorICAgICAgICA0MTA6ICgnR29uZScsCisgICAgICAgICAgICAgICdVUkkgbm8gbG9uZ2VyIGV4aXN0cyBhbmQgaGFzIGJlZW4gcGVybWFuZW50bHkgcmVtb3ZlZC4nKSwKKyAgICAgICAgNDExOiAoJ0xlbmd0aCBSZXF1aXJlZCcsICdDbGllbnQgbXVzdCBzcGVjaWZ5IENvbnRlbnQtTGVuZ3RoLicpLAorICAgICAgICA0MTI6ICgnUHJlY29uZGl0aW9uIEZhaWxlZCcsICdQcmVjb25kaXRpb24gaW4gaGVhZGVycyBpcyBmYWxzZS4nKSwKKyAgICAgICAgNDEzOiAoJ1JlcXVlc3QgRW50aXR5IFRvbyBMYXJnZScsICdFbnRpdHkgaXMgdG9vIGxhcmdlLicpLAorICAgICAgICA0MTQ6ICgnUmVxdWVzdC1VUkkgVG9vIExvbmcnLCAnVVJJIGlzIHRvbyBsb25nLicpLAorICAgICAgICA0MTU6ICgnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScsICdFbnRpdHkgYm9keSBpbiB1bnN1cHBvcnRlZCBmb3JtYXQuJyksCisgICAgICAgIDQxNjogKCdSZXF1ZXN0ZWQgUmFuZ2UgTm90IFNhdGlzZmlhYmxlJywKKyAgICAgICAgICAgICAgJ0Nhbm5vdCBzYXRpc2Z5IHJlcXVlc3QgcmFuZ2UuJyksCisgICAgICAgIDQxNzogKCdFeHBlY3RhdGlvbiBGYWlsZWQnLAorICAgICAgICAgICAgICAnRXhwZWN0IGNvbmRpdGlvbiBjb3VsZCBub3QgYmUgc2F0aXNmaWVkLicpLAorCisgICAgICAgIDUwMDogKCdJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InLCAnU2VydmVyIGdvdCBpdHNlbGYgaW4gdHJvdWJsZScpLAorICAgICAgICA1MDE6ICgnTm90IEltcGxlbWVudGVkJywKKyAgICAgICAgICAgICAgJ1NlcnZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgb3BlcmF0aW9uJyksCisgICAgICAgIDUwMjogKCdCYWQgR2F0ZXdheScsICdJbnZhbGlkIHJlc3BvbnNlcyBmcm9tIGFub3RoZXIgc2VydmVyL3Byb3h5LicpLAorICAgICAgICA1MDM6ICgnU2VydmljZSBVbmF2YWlsYWJsZScsCisgICAgICAgICAgICAgICdUaGUgc2VydmVyIGNhbm5vdCBwcm9jZXNzIHRoZSByZXF1ZXN0IGR1ZSB0byBhIGhpZ2ggbG9hZCcpLAorICAgICAgICA1MDQ6ICgnR2F0ZXdheSBUaW1lb3V0JywKKyAgICAgICAgICAgICAgJ1RoZSBnYXRld2F5IHNlcnZlciBkaWQgbm90IHJlY2VpdmUgYSB0aW1lbHkgcmVzcG9uc2UnKSwKKyAgICAgICAgNTA1OiAoJ0hUVFAgVmVyc2lvbiBOb3QgU3VwcG9ydGVkJywgJ0Nhbm5vdCBmdWxmaWxsIHJlcXVlc3QuJyksCisgICAgICAgIH0KKworCitkZWYgdGVzdChIYW5kbGVyQ2xhc3MgPSBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgU2VydmVyQ2xhc3MgPSBIVFRQU2VydmVyLCBwcm90b2NvbD0iSFRUUC8xLjAiKToKKyAgICAiIiJUZXN0IHRoZSBIVFRQIHJlcXVlc3QgaGFuZGxlciBjbGFzcy4KKworICAgIFRoaXMgcnVucyBhbiBIVFRQIHNlcnZlciBvbiBwb3J0IDgwMDAgKG9yIHRoZSBmaXJzdCBjb21tYW5kIGxpbmUKKyAgICBhcmd1bWVudCkuCisKKyAgICAiIiIKKworICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgcG9ydCA9IGludChzeXMuYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgICBwb3J0ID0gODAwMAorICAgIHNlcnZlcl9hZGRyZXNzID0gKCcnLCBwb3J0KQorCisgICAgSGFuZGxlckNsYXNzLnByb3RvY29sX3ZlcnNpb24gPSBwcm90b2NvbAorICAgIGh0dHBkID0gU2VydmVyQ2xhc3Moc2VydmVyX2FkZHJlc3MsIEhhbmRsZXJDbGFzcykKKworICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICBwcmludCAiU2VydmluZyBIVFRQIG9uIiwgc2FbMF0sICJwb3J0Iiwgc2FbMV0sICIuLi4iCisgICAgaHR0cGQuc2VydmVfZm9yZXZlcigpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHljIGIvbGliL3B5dGhvbjIuNy9CYXNlSFRUUFNlcnZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZWU5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9CYXNlSFRUUFNlcnZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0ZWU5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQmFzZUhUVFBTZXJ2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQmFzdGlvbi5weSBiL2xpYi9weXRob24yLjcvQmFzdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRkZGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9CYXN0aW9uLnB5CkBAIC0wLDAgKzEsMTgwIEBACisiIiJCYXN0aW9uaWZpY2F0aW9uIHV0aWxpdHkuCisKK0EgYmFzdGlvbiAoZm9yIGFub3RoZXIgb2JqZWN0IC0tIHRoZSAnb3JpZ2luYWwnKSBpcyBhbiBvYmplY3QgdGhhdCBoYXMKK3RoZSBzYW1lIG1ldGhvZHMgYXMgdGhlIG9yaWdpbmFsIGJ1dCBkb2VzIG5vdCBnaXZlIGFjY2VzcyB0byBpdHMKK2luc3RhbmNlIHZhcmlhYmxlcy4gIEJhc3Rpb25zIGhhdmUgYSBudW1iZXIgb2YgdXNlcywgYnV0IHRoZSBtb3N0CitvYnZpb3VzIG9uZSBpcyB0byBwcm92aWRlIGNvZGUgZXhlY3V0aW5nIGluIHJlc3RyaWN0ZWQgbW9kZSB3aXRoIGEKK3NhZmUgaW50ZXJmYWNlIHRvIGFuIG9iamVjdCBpbXBsZW1lbnRlZCBpbiB1bnJlc3RyaWN0ZWQgbW9kZS4KKworVGhlIGJhc3Rpb25pZmljYXRpb24gcm91dGluZSBoYXMgYW4gb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGlzCithIGZpbHRlciBmdW5jdGlvbi4gIE9ubHkgdGhvc2UgbWV0aG9kcyBmb3Igd2hpY2ggdGhlIGZpbHRlciBtZXRob2QKKyhjYWxsZWQgd2l0aCB0aGUgbWV0aG9kIG5hbWUgYXMgYXJndW1lbnQpIHJldHVybnMgdHJ1ZSBhcmUgYWNjZXNzaWJsZS4KK1RoZSBkZWZhdWx0IGZpbHRlciBtZXRob2QgcmV0dXJucyB0cnVlIHVubGVzcyB0aGUgbWV0aG9kIG5hbWUgYmVnaW5zCit3aXRoIGFuIHVuZGVyc2NvcmUuCisKK1RoZXJlIGFyZSBhIG51bWJlciBvZiBwb3NzaWJsZSBpbXBsZW1lbnRhdGlvbnMgb2YgYmFzdGlvbnMuICBXZSB1c2UgYQorJ2xhenknIGFwcHJvYWNoIHdoZXJlIHRoZSBiYXN0aW9uJ3MgX19nZXRhdHRyX18oKSBkaXNjaXBsaW5lIGRvZXMgYWxsCit0aGUgd29yayBmb3IgYSBwYXJ0aWN1bGFyIG1ldGhvZCB0aGUgZmlyc3QgdGltZSBpdCBpcyB1c2VkLiAgVGhpcyBpcwordXN1YWxseSBmYXN0ZXN0LCBlc3BlY2lhbGx5IGlmIHRoZSB1c2VyIGRvZXNuJ3QgY2FsbCBhbGwgYXZhaWxhYmxlCittZXRob2RzLiAgVGhlIHJldHJpZXZlZCBtZXRob2RzIGFyZSBzdG9yZWQgYXMgaW5zdGFuY2UgdmFyaWFibGVzIG9mCit0aGUgYmFzdGlvbiwgc28gdGhlIG92ZXJoZWFkIGlzIG9ubHkgb2NjdXJyZWQgb24gdGhlIGZpcnN0IHVzZSBvZiBlYWNoCittZXRob2QuCisKK0RldGFpbDogdGhlIGJhc3Rpb24gY2xhc3MgaGFzIGEgX19yZXByX18oKSBkaXNjaXBsaW5lIHdoaWNoIGluY2x1ZGVzCit0aGUgcmVwcigpIG9mIHRoZSBvcmlnaW5hbCBvYmplY3QuICBUaGlzIGlzIHByZWNvbXB1dGVkIHdoZW4gdGhlCitiYXN0aW9uIGlzIGNyZWF0ZWQuCisKKyIiIgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgQmFzdGlvbiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKK19fYWxsX18gPSBbIkJhc3Rpb25DbGFzcyIsICJCYXN0aW9uIl0KKworZnJvbSB0eXBlcyBpbXBvcnQgTWV0aG9kVHlwZQorCisKK2NsYXNzIEJhc3Rpb25DbGFzczoKKworICAgICIiIkhlbHBlciBjbGFzcyB1c2VkIGJ5IHRoZSBCYXN0aW9uKCkgZnVuY3Rpb24uCisKKyAgICBZb3UgY291bGQgc3ViY2xhc3MgdGhpcyBhbmQgcGFzcyB0aGUgc3ViY2xhc3MgYXMgdGhlIGJhc3Rpb25jbGFzcworICAgIGFyZ3VtZW50IHRvIHRoZSBCYXN0aW9uKCkgZnVuY3Rpb24sIGFzIGxvbmcgYXMgdGhlIGNvbnN0cnVjdG9yIGhhcworICAgIHRoZSBzYW1lIHNpZ25hdHVyZSAoYSBnZXQoKSBmdW5jdGlvbiBhbmQgYSBuYW1lIGZvciB0aGUgb2JqZWN0KS4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdldCwgbmFtZSk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yLgorCisgICAgICAgIEFyZ3VtZW50czoKKworICAgICAgICBnZXQgLSBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyB0aGUgYXR0cmlidXRlIHZhbHVlIChieSBuYW1lKQorICAgICAgICBuYW1lIC0gYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgb3JpZ2luYWwgb2JqZWN0CisgICAgICAgICAgICAgICAoc3VnZ2VzdGlvbjogdXNlIHJlcHIob2JqZWN0KSkKKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZ2V0XyA9IGdldAorICAgICAgICBzZWxmLl9uYW1lXyA9IG5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcmVwcmVzZW50YXRpb24gc3RyaW5nLgorCisgICAgICAgIFRoaXMgaW5jbHVkZXMgdGhlIG5hbWUgcGFzc2VkIGluIHRvIHRoZSBjb25zdHJ1Y3Rvciwgc28gdGhhdAorICAgICAgICBpZiB5b3UgcHJpbnQgdGhlIGJhc3Rpb24gZHVyaW5nIGRlYnVnZ2luZywgYXQgbGVhc3QgeW91IGhhdmUKKyAgICAgICAgc29tZSBpZGVhIG9mIHdoYXQgaXQgaXMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAiPEJhc3Rpb24gZm9yICVzPiIgJSBzZWxmLl9uYW1lXworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJHZXQgYW4gYXMteWV0IHVuZGVmaW5lZCBhdHRyaWJ1dGUgdmFsdWUuCisKKyAgICAgICAgVGhpcyBjYWxscyB0aGUgZ2V0KCkgZnVuY3Rpb24gdGhhdCB3YXMgcGFzc2VkIHRvIHRoZQorICAgICAgICBjb25zdHJ1Y3Rvci4gIFRoZSByZXN1bHQgaXMgc3RvcmVkIGFzIGFuIGluc3RhbmNlIHZhcmlhYmxlIHNvCisgICAgICAgIHRoYXQgdGhlIG5leHQgdGltZSB0aGUgc2FtZSBhdHRyaWJ1dGUgaXMgcmVxdWVzdGVkLAorICAgICAgICBfX2dldGF0dHJfXygpIHdvbid0IGJlIGludm9rZWQuCisKKyAgICAgICAgSWYgdGhlIGdldCgpIGZ1bmN0aW9uIHJhaXNlcyBhbiBleGNlcHRpb24sIHRoaXMgaXMgc2ltcGx5CisgICAgICAgIHBhc3NlZCBvbiAtLSBleGNlcHRpb25zIGFyZSBub3QgY2FjaGVkLgorCisgICAgICAgICIiIgorICAgICAgICBhdHRyaWJ1dGUgPSBzZWxmLl9nZXRfKG5hbWUpCisgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSBhdHRyaWJ1dGUKKyAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZQorCisKK2RlZiBCYXN0aW9uKG9iamVjdCwgZmlsdGVyID0gbGFtYmRhIG5hbWU6IG5hbWVbOjFdICE9ICdfJywKKyAgICAgICAgICAgIG5hbWU9Tm9uZSwgYmFzdGlvbmNsYXNzPUJhc3Rpb25DbGFzcyk6CisgICAgIiIiQ3JlYXRlIGEgYmFzdGlvbiBmb3IgYW4gb2JqZWN0LCB1c2luZyBhbiBvcHRpb25hbCBmaWx0ZXIuCisKKyAgICBTZWUgdGhlIEJhc3Rpb24gbW9kdWxlJ3MgZG9jdW1lbnRhdGlvbiBmb3IgYmFja2dyb3VuZC4KKworICAgIEFyZ3VtZW50czoKKworICAgIG9iamVjdCAtIHRoZSBvcmlnaW5hbCBvYmplY3QKKyAgICBmaWx0ZXIgLSBhIHByZWRpY2F0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhIGZ1bmN0aW9uIG5hbWUgaXMgT0s7CisgICAgICAgICAgICAgYnkgZGVmYXVsdCBhbGwgbmFtZXMgYXJlIE9LIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aCAnXycKKyAgICBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIG9iamVjdDsgZGVmYXVsdCByZXByKG9iamVjdCkKKyAgICBiYXN0aW9uY2xhc3MgLSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSB0aGUgYmFzdGlvbjsgZGVmYXVsdCBCYXN0aW9uQ2xhc3MKKworICAgICIiIgorCisgICAgcmFpc2UgUnVudGltZUVycm9yLCAiVGhpcyBjb2RlIGlzIG5vdCBzZWN1cmUgaW4gUHl0aG9uIDIuMiBhbmQgbGF0ZXIiCisKKyAgICAjIE5vdGU6IHdlIGRlZmluZSAqdHdvKiBhZC1ob2MgZnVuY3Rpb25zIGhlcmUsIGdldDEgYW5kIGdldDIuCisgICAgIyBCb3RoIGFyZSBpbnRlbmRlZCB0byBiZSBjYWxsZWQgaW4gdGhlIHNhbWUgd2F5OiBnZXQobmFtZSkuCisgICAgIyBJdCBpcyBjbGVhciB0aGF0IHRoZSByZWFsIHdvcmsgKGdldHRpbmcgdGhlIGF0dHJpYnV0ZQorICAgICMgZnJvbSB0aGUgb2JqZWN0IGFuZCBjYWxsaW5nIHRoZSBmaWx0ZXIpIGlzIGRvbmUgaW4gZ2V0MS4KKyAgICAjIFdoeSBjYW4ndCB3ZSBwYXNzIGdldDEgdG8gdGhlIGJhc3Rpb24/ICBCZWNhdXNlIHRoZSB1c2VyCisgICAgIyB3b3VsZCBiZSBhYmxlIHRvIG92ZXJyaWRlIHRoZSBmaWx0ZXIgYXJndW1lbnQhICBXaXRoIGdldDIsCisgICAgIyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIG5vIHNlY3VyaXR5IGxvb3Bob2xlOgorICAgICMgYWxsIGl0IGRvZXMgaXMgY2FsbCBpdC4KKyAgICAjIEFsc28gbm90aWNlIHRoYXQgd2UgY2FuJ3QgcGxhY2UgdGhlIG9iamVjdCBhbmQgZmlsdGVyIGFzCisgICAgIyBpbnN0YW5jZSB2YXJpYWJsZXMgb24gdGhlIGJhc3Rpb24gb2JqZWN0IGl0c2VsZiwgc2luY2UKKyAgICAjIHRoZSB1c2VyIGhhcyBmdWxsIGFjY2VzcyB0byBhbGwgaW5zdGFuY2UgdmFyaWFibGVzIQorCisgICAgZGVmIGdldDEobmFtZSwgb2JqZWN0PW9iamVjdCwgZmlsdGVyPWZpbHRlcik6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uIGZvciBCYXN0aW9uKCkuICBTZWUgc291cmNlIGNvbW1lbnRzLiIiIgorICAgICAgICBpZiBmaWx0ZXIobmFtZSk6CisgICAgICAgICAgICBhdHRyaWJ1dGUgPSBnZXRhdHRyKG9iamVjdCwgbmFtZSkKKyAgICAgICAgICAgIGlmIHR5cGUoYXR0cmlidXRlKSA9PSBNZXRob2RUeXBlOgorICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGUKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKworICAgIGRlZiBnZXQyKG5hbWUsIGdldDE9Z2V0MSk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uIGZvciBCYXN0aW9uKCkuICBTZWUgc291cmNlIGNvbW1lbnRzLiIiIgorICAgICAgICByZXR1cm4gZ2V0MShuYW1lKQorCisgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICBuYW1lID0gcmVwcihvYmplY3QpCisgICAgcmV0dXJuIGJhc3Rpb25jbGFzcyhnZXQyLCBuYW1lKQorCisKK2RlZiBfdGVzdCgpOgorICAgICIiIlRlc3QgdGhlIEJhc3Rpb24oKSBmdW5jdGlvbi4iIiIKKyAgICBjbGFzcyBPcmlnaW5hbDoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zdW0gPSAwCisgICAgICAgIGRlZiBhZGQoc2VsZiwgbik6CisgICAgICAgICAgICBzZWxmLl9hZGQobikKKyAgICAgICAgZGVmIF9hZGQoc2VsZiwgbik6CisgICAgICAgICAgICBzZWxmLnN1bSA9IHNlbGYuc3VtICsgbgorICAgICAgICBkZWYgdG90YWwoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdW0KKyAgICBvID0gT3JpZ2luYWwoKQorICAgIGIgPSBCYXN0aW9uKG8pCisgICAgdGVzdGNvZGUgPSAiIiJpZiAxOgorICAgIGIuYWRkKDgxKQorICAgIGIuYWRkKDE4KQorICAgIHByaW50ICJiLnRvdGFsKCkgPSIsIGIudG90YWwoKQorICAgIHRyeToKKyAgICAgICAgcHJpbnQgImIuc3VtID0iLCBiLnN1bSwKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50ICJpbmFjY2Vzc2libGUiCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgImFjY2Vzc2libGUiCisgICAgdHJ5OgorICAgICAgICBwcmludCAiYi5fYWRkID0iLCBiLl9hZGQsCisgICAgZXhjZXB0OgorICAgICAgICBwcmludCAiaW5hY2Nlc3NpYmxlIgorICAgIGVsc2U6CisgICAgICAgIHByaW50ICJhY2Nlc3NpYmxlIgorICAgIHRyeToKKyAgICAgICAgcHJpbnQgImIuX2dldF8uZnVuY19kZWZhdWx0cyA9IiwgbWFwKHR5cGUsIGIuX2dldF8uZnVuY19kZWZhdWx0cyksCisgICAgZXhjZXB0OgorICAgICAgICBwcmludCAiaW5hY2Nlc3NpYmxlIgorICAgIGVsc2U6CisgICAgICAgIHByaW50ICJhY2Nlc3NpYmxlIgorICAgIFxuIiIiCisgICAgZXhlYyB0ZXN0Y29kZQorICAgIHByaW50ICc9JyoyMCwgIlVzaW5nIHJleGVjOiIsICc9JyoyMAorICAgIGltcG9ydCByZXhlYworICAgIHIgPSByZXhlYy5SRXhlYygpCisgICAgbSA9IHIuYWRkX21vZHVsZSgnX19tYWluX18nKQorICAgIG0uYiA9IGIKKyAgICByLnJfZXhlYyh0ZXN0Y29kZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQmFzdGlvbi5weWMgYi9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjE2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQmFzdGlvbi5weW8gYi9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZjE2ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0Jhc3Rpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ0dJSFRUUFNlcnZlci5weSBiL2xpYi9weXRob24yLjcvQ0dJSFRUUFNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2E5OTRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9DR0lIVFRQU2VydmVyLnB5CkBAIC0wLDAgKzEsMzc4IEBACisiIiJDR0ktc2F2dnkgSFRUUCBTZXJ2ZXIuCisKK1RoaXMgbW9kdWxlIGJ1aWxkcyBvbiBTaW1wbGVIVFRQU2VydmVyIGJ5IGltcGxlbWVudGluZyBHRVQgYW5kIFBPU1QKK3JlcXVlc3RzIHRvIGNnaS1iaW4gc2NyaXB0cy4KKworSWYgdGhlIG9zLmZvcmsoKSBmdW5jdGlvbiBpcyBub3QgcHJlc2VudCAoZS5nLiBvbiBXaW5kb3dzKSwKK29zLnBvcGVuMigpIGlzIHVzZWQgYXMgYSBmYWxsYmFjaywgd2l0aCBzbGlnaHRseSBhbHRlcmVkIHNlbWFudGljczsgaWYKK3RoYXQgZnVuY3Rpb24gaXMgbm90IHByZXNlbnQgZWl0aGVyIChlLmcuIG9uIE1hY2ludG9zaCksIG9ubHkgUHl0aG9uCitzY3JpcHRzIGFyZSBzdXBwb3J0ZWQsIGFuZCB0aGV5IGFyZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCBwcm9jZXNzLgorCitJbiBhbGwgY2FzZXMsIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBpbnRlbnRpb25hbGx5IG5haXZlIC0tIGFsbAorcmVxdWVzdHMgYXJlIGV4ZWN1dGVkIHN5Y2hyb25vdXNseS4KKworU0VDVVJJVFkgV0FSTklORzogRE9OJ1QgVVNFIFRISVMgQ09ERSBVTkxFU1MgWU9VIEFSRSBJTlNJREUgQSBGSVJFV0FMTAorLS0gaXQgbWF5IGV4ZWN1dGUgYXJiaXRyYXJ5IFB5dGhvbiBjb2RlIG9yIGV4dGVybmFsIHByb2dyYW1zLgorCitOb3RlIHRoYXQgc3RhdHVzIGNvZGUgMjAwIGlzIHNlbnQgcHJpb3IgdG8gZXhlY3V0aW9uIG9mIGEgQ0dJIHNjcmlwdCwgc28KK3NjcmlwdHMgY2Fubm90IHNlbmQgb3RoZXIgc3RhdHVzIGNvZGVzIHN1Y2ggYXMgMzAyIChyZWRpcmVjdCkuCisiIiIKKworCitfX3ZlcnNpb25fXyA9ICIwLjQiCisKK19fYWxsX18gPSBbIkNHSUhUVFBSZXF1ZXN0SGFuZGxlciJdCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVybGxpYgoraW1wb3J0IEJhc2VIVFRQU2VydmVyCitpbXBvcnQgU2ltcGxlSFRUUFNlcnZlcgoraW1wb3J0IHNlbGVjdAoraW1wb3J0IGNvcHkKKworCitjbGFzcyBDR0lIVFRQUmVxdWVzdEhhbmRsZXIoU2ltcGxlSFRUUFNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIpOgorCisgICAgIiIiQ29tcGxldGUgSFRUUCBzZXJ2ZXIgd2l0aCBHRVQsIEhFQUQgYW5kIFBPU1QgY29tbWFuZHMuCisKKyAgICBHRVQgYW5kIEhFQUQgYWxzbyBzdXBwb3J0IHJ1bm5pbmcgQ0dJIHNjcmlwdHMuCisKKyAgICBUaGUgUE9TVCBjb21tYW5kIGlzICpvbmx5KiBpbXBsZW1lbnRlZCBmb3IgQ0dJIHNjcmlwdHMuCisKKyAgICAiIiIKKworICAgICMgRGV0ZXJtaW5lIHBsYXRmb3JtIHNwZWNpZmljcworICAgIGhhdmVfZm9yayA9IGhhc2F0dHIob3MsICdmb3JrJykKKyAgICBoYXZlX3BvcGVuMiA9IGhhc2F0dHIob3MsICdwb3BlbjInKQorICAgIGhhdmVfcG9wZW4zID0gaGFzYXR0cihvcywgJ3BvcGVuMycpCisKKyAgICAjIE1ha2UgcmZpbGUgdW5idWZmZXJlZCAtLSB3ZSBuZWVkIHRvIHJlYWQgb25lIGxpbmUgYW5kIHRoZW4gcGFzcworICAgICMgdGhlIHJlc3QgdG8gYSBzdWJwcm9jZXNzLCBzbyB3ZSBjYW4ndCB1c2UgYnVmZmVyZWQgaW5wdXQuCisgICAgcmJ1ZnNpemUgPSAwCisKKyAgICBkZWYgZG9fUE9TVChzZWxmKToKKyAgICAgICAgIiIiU2VydmUgYSBQT1NUIHJlcXVlc3QuCisKKyAgICAgICAgVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGZvciBDR0kgc2NyaXB0cy4KKworICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLmlzX2NnaSgpOgorICAgICAgICAgICAgc2VsZi5ydW5fY2dpKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig1MDEsICJDYW4gb25seSBQT1NUIHRvIENHSSBzY3JpcHRzIikKKworICAgIGRlZiBzZW5kX2hlYWQoc2VsZik6CisgICAgICAgICIiIlZlcnNpb24gb2Ygc2VuZF9oZWFkIHRoYXQgc3VwcG9ydCBDR0kgc2NyaXB0cyIiIgorICAgICAgICBpZiBzZWxmLmlzX2NnaSgpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucnVuX2NnaSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlSFRUUFNlcnZlci5TaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIuc2VuZF9oZWFkKHNlbGYpCisKKyAgICBkZWYgaXNfY2dpKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHdoZXRoZXIgc2VsZi5wYXRoIGNvcnJlc3BvbmRzIHRvIGEgQ0dJIHNjcmlwdC4KKworICAgICAgICBSZXR1cm5zIFRydWUgYW5kIHVwZGF0ZXMgdGhlIGNnaV9pbmZvIGF0dHJpYnV0ZSB0byB0aGUgdHVwbGUKKyAgICAgICAgKGRpciwgcmVzdCkgaWYgc2VsZi5wYXRoIHJlcXVpcmVzIHJ1bm5pbmcgYSBDR0kgc2NyaXB0LgorICAgICAgICBSZXR1cm5zIEZhbHNlIG90aGVyd2lzZS4KKworICAgICAgICBJZiBhbnkgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlIGNhbGxlciBzaG91bGQgYXNzdW1lIHRoYXQKKyAgICAgICAgc2VsZi5wYXRoIHdhcyByZWplY3RlZCBhcyBpbnZhbGlkIGFuZCBhY3QgYWNjb3JkaW5nbHkuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gdGVzdHMgd2hldGhlciB0aGUgbm9ybWFsaXplZCB1cmwKKyAgICAgICAgcGF0aCBiZWdpbnMgd2l0aCBvbmUgb2YgdGhlIHN0cmluZ3MgaW4gc2VsZi5jZ2lfZGlyZWN0b3JpZXMKKyAgICAgICAgKGFuZCB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgYSAnLycgb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nKS4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbGxhcHNlZF9wYXRoID0gX3VybF9jb2xsYXBzZV9wYXRoKHNlbGYucGF0aCkKKyAgICAgICAgZGlyX3NlcCA9IGNvbGxhcHNlZF9wYXRoLmZpbmQoJy8nLCAxKQorICAgICAgICBoZWFkLCB0YWlsID0gY29sbGFwc2VkX3BhdGhbOmRpcl9zZXBdLCBjb2xsYXBzZWRfcGF0aFtkaXJfc2VwKzE6XQorICAgICAgICBpZiBoZWFkIGluIHNlbGYuY2dpX2RpcmVjdG9yaWVzOgorICAgICAgICAgICAgc2VsZi5jZ2lfaW5mbyA9IGhlYWQsIHRhaWwKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgY2dpX2RpcmVjdG9yaWVzID0gWycvY2dpLWJpbicsICcvaHRiaW4nXQorCisgICAgZGVmIGlzX2V4ZWN1dGFibGUoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIlRlc3Qgd2hldGhlciBhcmd1bWVudCBwYXRoIGlzIGFuIGV4ZWN1dGFibGUgZmlsZS4iIiIKKyAgICAgICAgcmV0dXJuIGV4ZWN1dGFibGUocGF0aCkKKworICAgIGRlZiBpc19weXRob24oc2VsZiwgcGF0aCk6CisgICAgICAgICIiIlRlc3Qgd2hldGhlciBhcmd1bWVudCBwYXRoIGlzIGEgUHl0aG9uIHNjcmlwdC4iIiIKKyAgICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXRleHQocGF0aCkKKyAgICAgICAgcmV0dXJuIHRhaWwubG93ZXIoKSBpbiAoIi5weSIsICIucHl3IikKKworICAgIGRlZiBydW5fY2dpKHNlbGYpOgorICAgICAgICAiIiJFeGVjdXRlIGEgQ0dJIHNjcmlwdC4iIiIKKyAgICAgICAgcGF0aCA9IHNlbGYucGF0aAorICAgICAgICBkaXIsIHJlc3QgPSBzZWxmLmNnaV9pbmZvCisKKyAgICAgICAgaSA9IHBhdGguZmluZCgnLycsIGxlbihkaXIpICsgMSkKKyAgICAgICAgd2hpbGUgaSA+PSAwOgorICAgICAgICAgICAgbmV4dGRpciA9IHBhdGhbOmldCisgICAgICAgICAgICBuZXh0cmVzdCA9IHBhdGhbaSsxOl0KKworICAgICAgICAgICAgc2NyaXB0ZGlyID0gc2VsZi50cmFuc2xhdGVfcGF0aChuZXh0ZGlyKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzY3JpcHRkaXIpOgorICAgICAgICAgICAgICAgIGRpciwgcmVzdCA9IG5leHRkaXIsIG5leHRyZXN0CisgICAgICAgICAgICAgICAgaSA9IHBhdGguZmluZCgnLycsIGxlbihkaXIpICsgMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIGZpbmQgYW4gZXhwbGljaXQgcXVlcnkgc3RyaW5nLCBpZiBwcmVzZW50LgorICAgICAgICBpID0gcmVzdC5yZmluZCgnPycpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIHJlc3QsIHF1ZXJ5ID0gcmVzdFs6aV0sIHJlc3RbaSsxOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHF1ZXJ5ID0gJycKKworICAgICAgICAjIGRpc3NlY3QgdGhlIHBhcnQgYWZ0ZXIgdGhlIGRpcmVjdG9yeSBuYW1lIGludG8gYSBzY3JpcHQgbmFtZSAmCisgICAgICAgICMgYSBwb3NzaWJsZSBhZGRpdGlvbmFsIHBhdGgsIHRvIGJlIHN0b3JlZCBpbiBQQVRIX0lORk8uCisgICAgICAgIGkgPSByZXN0LmZpbmQoJy8nKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICBzY3JpcHQsIHJlc3QgPSByZXN0WzppXSwgcmVzdFtpOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNjcmlwdCwgcmVzdCA9IHJlc3QsICcnCisKKyAgICAgICAgc2NyaXB0bmFtZSA9IGRpciArICcvJyArIHNjcmlwdAorICAgICAgICBzY3JpcHRmaWxlID0gc2VsZi50cmFuc2xhdGVfcGF0aChzY3JpcHRuYW1lKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2NyaXB0ZmlsZSk6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDA0LCAiTm8gc3VjaCBDR0kgc2NyaXB0ICglcikiICUgc2NyaXB0bmFtZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoc2NyaXB0ZmlsZSk6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDAzLCAiQ0dJIHNjcmlwdCBpcyBub3QgYSBwbGFpbiBmaWxlICglcikiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRuYW1lKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlzcHkgPSBzZWxmLmlzX3B5dGhvbihzY3JpcHRuYW1lKQorICAgICAgICBpZiBub3QgaXNweToKKyAgICAgICAgICAgIGlmIG5vdCAoc2VsZi5oYXZlX2Zvcmsgb3Igc2VsZi5oYXZlX3BvcGVuMiBvciBzZWxmLmhhdmVfcG9wZW4zKToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDAzLCAiQ0dJIHNjcmlwdCBpcyBub3QgYSBQeXRob24gc2NyaXB0ICglcikiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0bmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlzX2V4ZWN1dGFibGUoc2NyaXB0ZmlsZSk6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDQwMywgIkNHSSBzY3JpcHQgaXMgbm90IGV4ZWN1dGFibGUgKCVyKSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgUmVmZXJlbmNlOiBodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2Vudi5odG1sCisgICAgICAgICMgWFhYIE11Y2ggb2YgdGhlIGZvbGxvd2luZyBjb3VsZCBiZSBwcmVwYXJlZCBhaGVhZCBvZiB0aW1lIQorICAgICAgICBlbnYgPSBjb3B5LmRlZXBjb3B5KG9zLmVudmlyb24pCisgICAgICAgIGVudlsnU0VSVkVSX1NPRlRXQVJFJ10gPSBzZWxmLnZlcnNpb25fc3RyaW5nKCkKKyAgICAgICAgZW52WydTRVJWRVJfTkFNRSddID0gc2VsZi5zZXJ2ZXIuc2VydmVyX25hbWUKKyAgICAgICAgZW52WydHQVRFV0FZX0lOVEVSRkFDRSddID0gJ0NHSS8xLjEnCisgICAgICAgIGVudlsnU0VSVkVSX1BST1RPQ09MJ10gPSBzZWxmLnByb3RvY29sX3ZlcnNpb24KKyAgICAgICAgZW52WydTRVJWRVJfUE9SVCddID0gc3RyKHNlbGYuc2VydmVyLnNlcnZlcl9wb3J0KQorICAgICAgICBlbnZbJ1JFUVVFU1RfTUVUSE9EJ10gPSBzZWxmLmNvbW1hbmQKKyAgICAgICAgdXFyZXN0ID0gdXJsbGliLnVucXVvdGUocmVzdCkKKyAgICAgICAgZW52WydQQVRIX0lORk8nXSA9IHVxcmVzdAorICAgICAgICBlbnZbJ1BBVEhfVFJBTlNMQVRFRCddID0gc2VsZi50cmFuc2xhdGVfcGF0aCh1cXJlc3QpCisgICAgICAgIGVudlsnU0NSSVBUX05BTUUnXSA9IHNjcmlwdG5hbWUKKyAgICAgICAgaWYgcXVlcnk6CisgICAgICAgICAgICBlbnZbJ1FVRVJZX1NUUklORyddID0gcXVlcnkKKyAgICAgICAgaG9zdCA9IHNlbGYuYWRkcmVzc19zdHJpbmcoKQorICAgICAgICBpZiBob3N0ICE9IHNlbGYuY2xpZW50X2FkZHJlc3NbMF06CisgICAgICAgICAgICBlbnZbJ1JFTU9URV9IT1NUJ10gPSBob3N0CisgICAgICAgIGVudlsnUkVNT1RFX0FERFInXSA9IHNlbGYuY2xpZW50X2FkZHJlc3NbMF0KKyAgICAgICAgYXV0aG9yaXphdGlvbiA9IHNlbGYuaGVhZGVycy5nZXRoZWFkZXIoImF1dGhvcml6YXRpb24iKQorICAgICAgICBpZiBhdXRob3JpemF0aW9uOgorICAgICAgICAgICAgYXV0aG9yaXphdGlvbiA9IGF1dGhvcml6YXRpb24uc3BsaXQoKQorICAgICAgICAgICAgaWYgbGVuKGF1dGhvcml6YXRpb24pID09IDI6CisgICAgICAgICAgICAgICAgaW1wb3J0IGJhc2U2NCwgYmluYXNjaWkKKyAgICAgICAgICAgICAgICBlbnZbJ0FVVEhfVFlQRSddID0gYXV0aG9yaXphdGlvblswXQorICAgICAgICAgICAgICAgIGlmIGF1dGhvcml6YXRpb25bMF0ubG93ZXIoKSA9PSAiYmFzaWMiOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uID0gYmFzZTY0LmRlY29kZXN0cmluZyhhdXRob3JpemF0aW9uWzFdKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uID0gYXV0aG9yaXphdGlvbi5zcGxpdCgnOicpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oYXV0aG9yaXphdGlvbikgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZbJ1JFTU9URV9VU0VSJ10gPSBhdXRob3JpemF0aW9uWzBdCisgICAgICAgICMgWFhYIFJFTU9URV9JREVOVAorICAgICAgICBpZiBzZWxmLmhlYWRlcnMudHlwZWhlYWRlciBpcyBOb25lOgorICAgICAgICAgICAgZW52WydDT05URU5UX1RZUEUnXSA9IHNlbGYuaGVhZGVycy50eXBlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfVFlQRSddID0gc2VsZi5oZWFkZXJzLnR5cGVoZWFkZXIKKyAgICAgICAgbGVuZ3RoID0gc2VsZi5oZWFkZXJzLmdldGhlYWRlcignY29udGVudC1sZW5ndGgnKQorICAgICAgICBpZiBsZW5ndGg6CisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfTEVOR1RIJ10gPSBsZW5ndGgKKyAgICAgICAgcmVmZXJlciA9IHNlbGYuaGVhZGVycy5nZXRoZWFkZXIoJ3JlZmVyZXInKQorICAgICAgICBpZiByZWZlcmVyOgorICAgICAgICAgICAgZW52WydIVFRQX1JFRkVSRVInXSA9IHJlZmVyZXIKKyAgICAgICAgYWNjZXB0ID0gW10KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5oZWFkZXJzLmdldGFsbG1hdGNoaW5naGVhZGVycygnYWNjZXB0Jyk6CisgICAgICAgICAgICBpZiBsaW5lWzoxXSBpbiAiXHRcblxyICI6CisgICAgICAgICAgICAgICAgYWNjZXB0LmFwcGVuZChsaW5lLnN0cmlwKCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFjY2VwdCA9IGFjY2VwdCArIGxpbmVbNzpdLnNwbGl0KCcsJykKKyAgICAgICAgZW52WydIVFRQX0FDQ0VQVCddID0gJywnLmpvaW4oYWNjZXB0KQorICAgICAgICB1YSA9IHNlbGYuaGVhZGVycy5nZXRoZWFkZXIoJ3VzZXItYWdlbnQnKQorICAgICAgICBpZiB1YToKKyAgICAgICAgICAgIGVudlsnSFRUUF9VU0VSX0FHRU5UJ10gPSB1YQorICAgICAgICBjbyA9IGZpbHRlcihOb25lLCBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVycygnY29va2llJykpCisgICAgICAgIGlmIGNvOgorICAgICAgICAgICAgZW52WydIVFRQX0NPT0tJRSddID0gJywgJy5qb2luKGNvKQorICAgICAgICAjIFhYWCBPdGhlciBIVFRQXyogaGVhZGVycworICAgICAgICAjIFNpbmNlIHdlJ3JlIHNldHRpbmcgdGhlIGVudiBpbiB0aGUgcGFyZW50LCBwcm92aWRlIGVtcHR5CisgICAgICAgICMgdmFsdWVzIHRvIG92ZXJyaWRlIHByZXZpb3VzbHkgc2V0IHZhbHVlcworICAgICAgICBmb3IgayBpbiAoJ1FVRVJZX1NUUklORycsICdSRU1PVEVfSE9TVCcsICdDT05URU5UX0xFTkdUSCcsCisgICAgICAgICAgICAgICAgICAnSFRUUF9VU0VSX0FHRU5UJywgJ0hUVFBfQ09PS0lFJywgJ0hUVFBfUkVGRVJFUicpOgorICAgICAgICAgICAgZW52LnNldGRlZmF1bHQoaywgIiIpCisKKyAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCwgIlNjcmlwdCBvdXRwdXQgZm9sbG93cyIpCisKKyAgICAgICAgZGVjb2RlZF9xdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoJysnLCAnICcpCisKKyAgICAgICAgaWYgc2VsZi5oYXZlX2Zvcms6CisgICAgICAgICAgICAjIFVuaXggLS0gZm9yayBhcyB3ZSBzaG91bGQKKyAgICAgICAgICAgIGFyZ3MgPSBbc2NyaXB0XQorICAgICAgICAgICAgaWYgJz0nIG5vdCBpbiBkZWNvZGVkX3F1ZXJ5OgorICAgICAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGRlY29kZWRfcXVlcnkpCisgICAgICAgICAgICBub2JvZHkgPSBub2JvZHlfdWlkKCkKKyAgICAgICAgICAgIHNlbGYud2ZpbGUuZmx1c2goKSAjIEFsd2F5cyBmbHVzaCBiZWZvcmUgZm9ya2luZworICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBpZiBwaWQgIT0gMDoKKyAgICAgICAgICAgICAgICAjIFBhcmVudAorICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChwaWQsIDApCisgICAgICAgICAgICAgICAgIyB0aHJvdyBhd2F5IGFkZGl0aW9uYWwgZGF0YSBbc2VlIGJ1ZyAjNDI3MzQ1XQorICAgICAgICAgICAgICAgIHdoaWxlIHNlbGVjdC5zZWxlY3QoW3NlbGYucmZpbGVdLCBbXSwgW10sIDApWzBdOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5yZmlsZS5yZWFkKDEpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBzdHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nX2Vycm9yKCJDR0kgc2NyaXB0IGV4aXQgc3RhdHVzICUjeCIsIHN0cykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICMgQ2hpbGQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnNldHVpZChub2JvZHkpCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgb3MuZHVwMihzZWxmLnJmaWxlLmZpbGVubygpLCAwKQorICAgICAgICAgICAgICAgIG9zLmR1cDIoc2VsZi53ZmlsZS5maWxlbm8oKSwgMSkKKyAgICAgICAgICAgICAgICBvcy5leGVjdmUoc2NyaXB0ZmlsZSwgYXJncywgZW52KQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLmhhbmRsZV9lcnJvcihzZWxmLnJlcXVlc3QsIHNlbGYuY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMTI3KQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE5vbiBVbml4IC0gdXNlIHN1YnByb2Nlc3MKKyAgICAgICAgICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgICAgICAgICBjbWRsaW5lID0gW3NjcmlwdGZpbGVdCisgICAgICAgICAgICBpZiBzZWxmLmlzX3B5dGhvbihzY3JpcHRmaWxlKToKKyAgICAgICAgICAgICAgICBpbnRlcnAgPSBzeXMuZXhlY3V0YWJsZQorICAgICAgICAgICAgICAgIGlmIGludGVycC5sb3dlcigpLmVuZHN3aXRoKCJ3LmV4ZSIpOgorICAgICAgICAgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHVzZSBweXRob24uZXhlLCBub3QgcHl0aG9udy5leGUKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJwID0gaW50ZXJwWzotNV0gKyBpbnRlcnBbLTQ6XQorICAgICAgICAgICAgICAgIGNtZGxpbmUgPSBbaW50ZXJwLCAnLXUnXSArIGNtZGxpbmUKKyAgICAgICAgICAgIGlmICc9JyBub3QgaW4gcXVlcnk6CisgICAgICAgICAgICAgICAgY21kbGluZS5hcHBlbmQocXVlcnkpCisKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoImNvbW1hbmQ6ICVzIiwgc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoY21kbGluZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmJ5dGVzID0gaW50KGxlbmd0aCkKKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBuYnl0ZXMgPSAwCisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW4gPSBzdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQgPSBzdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIgPSBzdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnYgPSBlbnYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgc2VsZi5jb21tYW5kLmxvd2VyKCkgPT0gInBvc3QiIGFuZCBuYnl0ZXMgPiAwOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJmaWxlLnJlYWQobmJ5dGVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkYXRhID0gTm9uZQorICAgICAgICAgICAgIyB0aHJvdyBhd2F5IGFkZGl0aW9uYWwgZGF0YSBbc2VlIGJ1ZyAjNDI3MzQ1XQorICAgICAgICAgICAgd2hpbGUgc2VsZWN0LnNlbGVjdChbc2VsZi5yZmlsZS5fc29ja10sIFtdLCBbXSwgMClbMF06CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmZpbGUuX3NvY2sucmVjdigxKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcC5jb21tdW5pY2F0ZShkYXRhKQorICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShzdGRvdXQpCisgICAgICAgICAgICBpZiBzdGRlcnI6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoJyVzJywgc3RkZXJyKQorICAgICAgICAgICAgcC5zdGRlcnIuY2xvc2UoKQorICAgICAgICAgICAgcC5zdGRvdXQuY2xvc2UoKQorICAgICAgICAgICAgc3RhdHVzID0gcC5yZXR1cm5jb2RlCisgICAgICAgICAgICBpZiBzdGF0dXM6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNHSSBzY3JpcHQgZXhpdCBzdGF0dXMgJSN4Iiwgc3RhdHVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCJDR0kgc2NyaXB0IGV4aXRlZCBPSyIpCisKKworZGVmIF91cmxfY29sbGFwc2VfcGF0aChwYXRoKToKKyAgICAiIiIKKyAgICBHaXZlbiBhIFVSTCBwYXRoLCByZW1vdmUgZXh0cmEgJy8ncyBhbmQgJy4nIHBhdGggZWxlbWVudHMgYW5kIGNvbGxhcHNlCisgICAgYW55ICcuLicgcmVmZXJlbmNlcyBhbmQgcmV0dXJucyBhIGNvbGxsYXBzZWQgcGF0aC4KKworICAgIEltcGxlbWVudHMgc29tZXRoaW5nIGFraW4gdG8gUkZDLTIzOTYgNS4yIHN0ZXAgNiB0byBwYXJzZSByZWxhdGl2ZSBwYXRocy4KKyAgICBUaGUgdXRpbGl0eSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGxpbWl0ZWQgdG8gaXNfY2dpIG1ldGhvZCBhbmQgaGVscHMKKyAgICBwcmV2ZW50aW5nIHNvbWUgc2VjdXJpdHkgYXR0YWNrcy4KKworICAgIFJldHVybnM6IEEgdHVwbGUgb2YgKGhlYWQsIHRhaWwpIHdoZXJlIHRhaWwgaXMgZXZlcnl0aGluZyBhZnRlciB0aGUgZmluYWwgLworICAgIGFuZCBoZWFkIGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIGl0LiAgSGVhZCB3aWxsIGFsd2F5cyBzdGFydCB3aXRoIGEgJy8nIGFuZCwKKyAgICBpZiBpdCBjb250YWlucyBhbnl0aGluZyBlbHNlLCBuZXZlciBoYXZlIGEgdHJhaWxpbmcgJy8nLgorCisgICAgUmFpc2VzOiBJbmRleEVycm9yIGlmIHRvbyBtYW55ICcuLicgb2NjdXIgd2l0aGluIHRoZSBwYXRoLgorCisgICAgIiIiCisgICAgIyBTaW1pbGFyIHRvIG9zLnBhdGguc3BsaXQob3MucGF0aC5ub3JtcGF0aChwYXRoKSkgYnV0IHNwZWNpZmljIHRvIFVSTAorICAgICMgcGF0aCBzZW1hbnRpY3MgcmF0aGVyIHRoYW4gbG9jYWwgb3BlcmF0aW5nIHN5c3RlbSBzZW1hbnRpY3MuCisgICAgcGF0aF9wYXJ0cyA9IHBhdGguc3BsaXQoJy8nKQorICAgIGhlYWRfcGFydHMgPSBbXQorICAgIGZvciBwYXJ0IGluIHBhdGhfcGFydHNbOi0xXToKKyAgICAgICAgaWYgcGFydCA9PSAnLi4nOgorICAgICAgICAgICAgaGVhZF9wYXJ0cy5wb3AoKSAjIEluZGV4RXJyb3IgaWYgbW9yZSAnLi4nIHRoYW4gcHJpb3IgcGFydHMKKyAgICAgICAgZWxpZiBwYXJ0IGFuZCBwYXJ0ICE9ICcuJzoKKyAgICAgICAgICAgIGhlYWRfcGFydHMuYXBwZW5kKCBwYXJ0ICkKKyAgICBpZiBwYXRoX3BhcnRzOgorICAgICAgICB0YWlsX3BhcnQgPSBwYXRoX3BhcnRzLnBvcCgpCisgICAgICAgIGlmIHRhaWxfcGFydDoKKyAgICAgICAgICAgIGlmIHRhaWxfcGFydCA9PSAnLi4nOgorICAgICAgICAgICAgICAgIGhlYWRfcGFydHMucG9wKCkKKyAgICAgICAgICAgICAgICB0YWlsX3BhcnQgPSAnJworICAgICAgICAgICAgZWxpZiB0YWlsX3BhcnQgPT0gJy4nOgorICAgICAgICAgICAgICAgIHRhaWxfcGFydCA9ICcnCisgICAgZWxzZToKKyAgICAgICAgdGFpbF9wYXJ0ID0gJycKKworICAgIHNwbGl0cGF0aCA9ICgnLycgKyAnLycuam9pbihoZWFkX3BhcnRzKSwgdGFpbF9wYXJ0KQorICAgIGNvbGxhcHNlZF9wYXRoID0gIi8iLmpvaW4oc3BsaXRwYXRoKQorCisgICAgcmV0dXJuIGNvbGxhcHNlZF9wYXRoCisKKworbm9ib2R5ID0gTm9uZQorCitkZWYgbm9ib2R5X3VpZCgpOgorICAgICIiIkludGVybmFsIHJvdXRpbmUgdG8gZ2V0IG5vYm9keSdzIHVpZCIiIgorICAgIGdsb2JhbCBub2JvZHkKKyAgICBpZiBub2JvZHk6CisgICAgICAgIHJldHVybiBub2JvZHkKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBwd2QKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiAtMQorICAgIHRyeToKKyAgICAgICAgbm9ib2R5ID0gcHdkLmdldHB3bmFtKCdub2JvZHknKVsyXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgbm9ib2R5ID0gMSArIG1heChtYXAobGFtYmRhIHg6IHhbMl0sIHB3ZC5nZXRwd2FsbCgpKSkKKyAgICByZXR1cm4gbm9ib2R5CisKKworZGVmIGV4ZWN1dGFibGUocGF0aCk6CisgICAgIiIiVGVzdCBmb3IgZXhlY3V0YWJsZSBmaWxlLiIiIgorICAgIHRyeToKKyAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gc3Quc3RfbW9kZSAmIDAxMTEgIT0gMAorCisKK2RlZiB0ZXN0KEhhbmRsZXJDbGFzcyA9IENHSUhUVFBSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgIFNlcnZlckNsYXNzID0gQmFzZUhUVFBTZXJ2ZXIuSFRUUFNlcnZlcik6CisgICAgU2ltcGxlSFRUUFNlcnZlci50ZXN0KEhhbmRsZXJDbGFzcywgU2VydmVyQ2xhc3MpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ0dJSFRUUFNlcnZlci5weWMgYi9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2I5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ0dJSFRUUFNlcnZlci5weW8gYi9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiY2I5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L0NHSUhUVFBTZXJ2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5IGIvbGliL3B5dGhvbjIuNy9Db25maWdQYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2Y2RiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5CkBAIC0wLDAgKzEsNzUzIEBACisiIiJDb25maWd1cmF0aW9uIGZpbGUgcGFyc2VyLgorCitBIHNldHVwIGZpbGUgY29uc2lzdHMgb2Ygc2VjdGlvbnMsIGxlYWQgYnkgYSAiW3NlY3Rpb25dIiBoZWFkZXIsCithbmQgZm9sbG93ZWQgYnkgIm5hbWU6IHZhbHVlIiBlbnRyaWVzLCB3aXRoIGNvbnRpbnVhdGlvbnMgYW5kIHN1Y2ggaW4KK3RoZSBzdHlsZSBvZiBSRkMgODIyLgorCitUaGUgb3B0aW9uIHZhbHVlcyBjYW4gY29udGFpbiBmb3JtYXQgc3RyaW5ncyB3aGljaCByZWZlciB0byBvdGhlciB2YWx1ZXMgaW4KK3RoZSBzYW1lIHNlY3Rpb24sIG9yIHZhbHVlcyBpbiBhIHNwZWNpYWwgW0RFRkFVTFRdIHNlY3Rpb24uCisKK0ZvciBleGFtcGxlOgorCisgICAgc29tZXRoaW5nOiAlKGRpcilzL3doYXRldmVyCisKK3dvdWxkIHJlc29sdmUgdGhlICIlKGRpcilzIiB0byB0aGUgdmFsdWUgb2YgZGlyLiAgQWxsIHJlZmVyZW5jZQorZXhwYW5zaW9ucyBhcmUgZG9uZSBsYXRlLCBvbiBkZW1hbmQuCisKK0ludHJpbnNpYyBkZWZhdWx0cyBjYW4gYmUgc3BlY2lmaWVkIGJ5IHBhc3NpbmcgdGhlbSBpbnRvIHRoZQorQ29uZmlnUGFyc2VyIGNvbnN0cnVjdG9yIGFzIGEgZGljdGlvbmFyeS4KKworY2xhc3M6CisKK0NvbmZpZ1BhcnNlciAtLSByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGVzLCBhbmQgbWFuYWdpbmcgdGhlIHBhcnNlZCBkYXRhYmFzZS4KKworICAgIG1ldGhvZHM6CisKKyAgICBfX2luaXRfXyhkZWZhdWx0cz1Ob25lKQorICAgICAgICBjcmVhdGUgdGhlIHBhcnNlciBhbmQgc3BlY2lmeSBhIGRpY3Rpb25hcnkgb2YgaW50cmluc2ljIGRlZmF1bHRzLiAgVGhlCisgICAgICAgIGtleXMgbXVzdCBiZSBzdHJpbmdzLCB0aGUgdmFsdWVzIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yICUoKXMgc3RyaW5nCisgICAgICAgIGludGVycG9sYXRpb24uICBOb3RlIHRoYXQgYF9fbmFtZV9fJyBpcyBhbHdheXMgYW4gaW50cmluc2ljIGRlZmF1bHQ7CisgICAgICAgIGl0cyB2YWx1ZSBpcyB0aGUgc2VjdGlvbidzIG5hbWUuCisKKyAgICBzZWN0aW9ucygpCisgICAgICAgIHJldHVybiBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gc2VjdGlvbiBuYW1lcywgc2FucyBERUZBVUxUCisKKyAgICBoYXNfc2VjdGlvbihzZWN0aW9uKQorICAgICAgICByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gc2VjdGlvbiBleGlzdHMKKworICAgIGhhc19vcHRpb24oc2VjdGlvbiwgb3B0aW9uKQorICAgICAgICByZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gb3B0aW9uIGV4aXN0cyBpbiB0aGUgZ2l2ZW4gc2VjdGlvbgorCisgICAgb3B0aW9ucyhzZWN0aW9uKQorICAgICAgICByZXR1cm4gbGlzdCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBuYW1lZCBzZWN0aW9uCisKKyAgICByZWFkKGZpbGVuYW1lcykKKyAgICAgICAgcmVhZCBhbmQgcGFyc2UgdGhlIGxpc3Qgb2YgbmFtZWQgY29uZmlndXJhdGlvbiBmaWxlcywgZ2l2ZW4gYnkKKyAgICAgICAgbmFtZS4gIEEgc2luZ2xlIGZpbGVuYW1lIGlzIGFsc28gYWxsb3dlZC4gIE5vbi1leGlzdGluZyBmaWxlcworICAgICAgICBhcmUgaWdub3JlZC4gIFJldHVybiBsaXN0IG9mIHN1Y2Nlc3NmdWxseSByZWFkIGZpbGVzLgorCisgICAgcmVhZGZwKGZwLCBmaWxlbmFtZT1Ob25lKQorICAgICAgICByZWFkIGFuZCBwYXJzZSBvbmUgY29uZmlndXJhdGlvbiBmaWxlLCBnaXZlbiBhcyBhIGZpbGUgb2JqZWN0LgorICAgICAgICBUaGUgZmlsZW5hbWUgZGVmYXVsdHMgdG8gZnAubmFtZTsgaXQgaXMgb25seSB1c2VkIGluIGVycm9yCisgICAgICAgIG1lc3NhZ2VzIChpZiBmcCBoYXMgbm8gYG5hbWUnIGF0dHJpYnV0ZSwgdGhlIHN0cmluZyBgPD8/Pz4nIGlzIHVzZWQpLgorCisgICAgZ2V0KHNlY3Rpb24sIG9wdGlvbiwgcmF3PUZhbHNlLCB2YXJzPU5vbmUpCisgICAgICAgIHJldHVybiBhIHN0cmluZyB2YWx1ZSBmb3IgdGhlIG5hbWVkIG9wdGlvbi4gIEFsbCAlIGludGVycG9sYXRpb25zIGFyZQorICAgICAgICBleHBhbmRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlcywgYmFzZWQgb24gdGhlIGRlZmF1bHRzIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICBjb25zdHJ1Y3RvciBhbmQgdGhlIERFRkFVTFQgc2VjdGlvbi4gIEFkZGl0aW9uYWwgc3Vic3RpdHV0aW9ucyBtYXkgYmUKKyAgICAgICAgcHJvdmlkZWQgdXNpbmcgdGhlIGB2YXJzJyBhcmd1bWVudCwgd2hpY2ggbXVzdCBiZSBhIGRpY3Rpb25hcnkgd2hvc2UKKyAgICAgICAgY29udGVudHMgb3ZlcnJpZGUgYW55IHByZS1leGlzdGluZyBkZWZhdWx0cy4KKworICAgIGdldGludChzZWN0aW9uLCBvcHRpb25zKQorICAgICAgICBsaWtlIGdldCgpLCBidXQgY29udmVydCB2YWx1ZSB0byBhbiBpbnRlZ2VyCisKKyAgICBnZXRmbG9hdChzZWN0aW9uLCBvcHRpb25zKQorICAgICAgICBsaWtlIGdldCgpLCBidXQgY29udmVydCB2YWx1ZSB0byBhIGZsb2F0CisKKyAgICBnZXRib29sZWFuKHNlY3Rpb24sIG9wdGlvbnMpCisgICAgICAgIGxpa2UgZ2V0KCksIGJ1dCBjb252ZXJ0IHZhbHVlIHRvIGEgYm9vbGVhbiAoY3VycmVudGx5IGNhc2UKKyAgICAgICAgaW5zZW5zaXRpdmVseSBkZWZpbmVkIGFzIDAsIGZhbHNlLCBubywgb2ZmIGZvciBGYWxzZSwgYW5kIDEsIHRydWUsCisgICAgICAgIHllcywgb24gZm9yIFRydWUpLiAgUmV0dXJucyBGYWxzZSBvciBUcnVlLgorCisgICAgaXRlbXMoc2VjdGlvbiwgcmF3PUZhbHNlLCB2YXJzPU5vbmUpCisgICAgICAgIHJldHVybiBhIGxpc3Qgb2YgdHVwbGVzIHdpdGggKG5hbWUsIHZhbHVlKSBmb3IgZWFjaCBvcHRpb24KKyAgICAgICAgaW4gdGhlIHNlY3Rpb24uCisKKyAgICByZW1vdmVfc2VjdGlvbihzZWN0aW9uKQorICAgICAgICByZW1vdmUgdGhlIGdpdmVuIGZpbGUgc2VjdGlvbiBhbmQgYWxsIGl0cyBvcHRpb25zCisKKyAgICByZW1vdmVfb3B0aW9uKHNlY3Rpb24sIG9wdGlvbikKKyAgICAgICAgcmVtb3ZlIHRoZSBnaXZlbiBvcHRpb24gZnJvbSB0aGUgZ2l2ZW4gc2VjdGlvbgorCisgICAgc2V0KHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpCisgICAgICAgIHNldCB0aGUgZ2l2ZW4gb3B0aW9uCisKKyAgICB3cml0ZShmcCkKKyAgICAgICAgd3JpdGUgdGhlIGNvbmZpZ3VyYXRpb24gc3RhdGUgaW4gLmluaSBmb3JtYXQKKyIiIgorCit0cnk6CisgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QgYXMgX2RlZmF1bHRfZGljdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgZmFsbGJhY2sgZm9yIHNldHVwLnB5IHdoaWNoIGhhc24ndCB5ZXQgYnVpbHQgX2NvbGxlY3Rpb25zCisgICAgX2RlZmF1bHRfZGljdCA9IGRpY3QKKworaW1wb3J0IHJlCisKK19fYWxsX18gPSBbIk5vU2VjdGlvbkVycm9yIiwgIkR1cGxpY2F0ZVNlY3Rpb25FcnJvciIsICJOb09wdGlvbkVycm9yIiwKKyAgICAgICAgICAgIkludGVycG9sYXRpb25FcnJvciIsICJJbnRlcnBvbGF0aW9uRGVwdGhFcnJvciIsCisgICAgICAgICAgICJJbnRlcnBvbGF0aW9uU3ludGF4RXJyb3IiLCAiUGFyc2luZ0Vycm9yIiwKKyAgICAgICAgICAgIk1pc3NpbmdTZWN0aW9uSGVhZGVyRXJyb3IiLAorICAgICAgICAgICAiQ29uZmlnUGFyc2VyIiwgIlNhZmVDb25maWdQYXJzZXIiLCAiUmF3Q29uZmlnUGFyc2VyIiwKKyAgICAgICAgICAgIkRFRkFVTFRTRUNUIiwgIk1BWF9JTlRFUlBPTEFUSU9OX0RFUFRIIl0KKworREVGQVVMVFNFQ1QgPSAiREVGQVVMVCIKKworTUFYX0lOVEVSUE9MQVRJT05fREVQVEggPSAxMAorCisKKworIyBleGNlcHRpb24gY2xhc3NlcworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBDb25maWdQYXJzZXIgZXhjZXB0aW9ucy4iIiIKKworICAgIGRlZiBfZ2V0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgICIiIkdldHRlciBmb3IgJ21lc3NhZ2UnOyBuZWVkZWQgb25seSB0byBvdmVycmlkZSBkZXByZWNhdGlvbiBpbgorICAgICAgICBCYXNlRXhjZXB0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX21lc3NhZ2UKKworICAgIGRlZiBfc2V0X21lc3NhZ2Uoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJTZXR0ZXIgZm9yICdtZXNzYWdlJzsgbmVlZGVkIG9ubHkgdG8gb3ZlcnJpZGUgZGVwcmVjYXRpb24gaW4KKyAgICAgICAgQmFzZUV4Y2VwdGlvbi4iIiIKKyAgICAgICAgc2VsZi5fX21lc3NhZ2UgPSB2YWx1ZQorCisgICAgIyBCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSBQeXRob24gMi42LiAgVG8gcHJldmVudAorICAgICMgRGVwcmVjYXRpb25XYXJuaW5nIGZyb20gcG9wcGluZyB1cCBvdmVyIHRoaXMgcHJlLWV4aXN0aW5nIGF0dHJpYnV0ZSwgdXNlCisgICAgIyBhIG5ldyBwcm9wZXJ0eSB0aGF0IHRha2VzIGxvb2t1cCBwcmVjZWRlbmNlLgorICAgIG1lc3NhZ2UgPSBwcm9wZXJ0eShfZ2V0X21lc3NhZ2UsIF9zZXRfbWVzc2FnZSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2c9JycpOgorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtc2cKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWVzc2FnZQorCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKK2NsYXNzIE5vU2VjdGlvbkVycm9yKEVycm9yKToKKyAgICAiIiJSYWlzZWQgd2hlbiBubyBzZWN0aW9uIG1hdGNoZXMgYSByZXF1ZXN0ZWQgb3B0aW9uLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmLCAnTm8gc2VjdGlvbjogJXInICUgKHNlY3Rpb24sKSkKKyAgICAgICAgc2VsZi5zZWN0aW9uID0gc2VjdGlvbgorICAgICAgICBzZWxmLmFyZ3MgPSAoc2VjdGlvbiwgKQorCitjbGFzcyBEdXBsaWNhdGVTZWN0aW9uRXJyb3IoRXJyb3IpOgorICAgICIiIlJhaXNlZCB3aGVuIGEgc2VjdGlvbiBpcyBtdWx0aXBseS1jcmVhdGVkLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmLCAiU2VjdGlvbiAlciBhbHJlYWR5IGV4aXN0cyIgJSBzZWN0aW9uKQorICAgICAgICBzZWxmLnNlY3Rpb24gPSBzZWN0aW9uCisgICAgICAgIHNlbGYuYXJncyA9IChzZWN0aW9uLCApCisKK2NsYXNzIE5vT3B0aW9uRXJyb3IoRXJyb3IpOgorICAgICIiIkEgcmVxdWVzdGVkIG9wdGlvbiB3YXMgbm90IGZvdW5kLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbiwgc2VjdGlvbik6CisgICAgICAgIEVycm9yLl9faW5pdF9fKHNlbGYsICJObyBvcHRpb24gJXIgaW4gc2VjdGlvbjogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbiwgc2VjdGlvbikpCisgICAgICAgIHNlbGYub3B0aW9uID0gb3B0aW9uCisgICAgICAgIHNlbGYuc2VjdGlvbiA9IHNlY3Rpb24KKyAgICAgICAgc2VsZi5hcmdzID0gKG9wdGlvbiwgc2VjdGlvbikKKworY2xhc3MgSW50ZXJwb2xhdGlvbkVycm9yKEVycm9yKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBpbnRlcnBvbGF0aW9uLXJlbGF0ZWQgZXhjZXB0aW9ucy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb24sIHNlY3Rpb24sIG1zZyk6CisgICAgICAgIEVycm9yLl9faW5pdF9fKHNlbGYsIG1zZykKKyAgICAgICAgc2VsZi5vcHRpb24gPSBvcHRpb24KKyAgICAgICAgc2VsZi5zZWN0aW9uID0gc2VjdGlvbgorICAgICAgICBzZWxmLmFyZ3MgPSAob3B0aW9uLCBzZWN0aW9uLCBtc2cpCisKK2NsYXNzIEludGVycG9sYXRpb25NaXNzaW5nT3B0aW9uRXJyb3IoSW50ZXJwb2xhdGlvbkVycm9yKToKKyAgICAiIiJBIHN0cmluZyBzdWJzdGl0dXRpb24gcmVxdWlyZWQgYSBzZXR0aW5nIHdoaWNoIHdhcyBub3QgYXZhaWxhYmxlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbiwgc2VjdGlvbiwgcmF3dmFsLCByZWZlcmVuY2UpOgorICAgICAgICBtc2cgPSAoIkJhZCB2YWx1ZSBzdWJzdGl0dXRpb246XG4iCisgICAgICAgICAgICAgICAiXHRzZWN0aW9uOiBbJXNdXG4iCisgICAgICAgICAgICAgICAiXHRvcHRpb24gOiAlc1xuIgorICAgICAgICAgICAgICAgIlx0a2V5ICAgIDogJXNcbiIKKyAgICAgICAgICAgICAgICJcdHJhd3ZhbCA6ICVzXG4iCisgICAgICAgICAgICAgICAlIChzZWN0aW9uLCBvcHRpb24sIHJlZmVyZW5jZSwgcmF3dmFsKSkKKyAgICAgICAgSW50ZXJwb2xhdGlvbkVycm9yLl9faW5pdF9fKHNlbGYsIG9wdGlvbiwgc2VjdGlvbiwgbXNnKQorICAgICAgICBzZWxmLnJlZmVyZW5jZSA9IHJlZmVyZW5jZQorICAgICAgICBzZWxmLmFyZ3MgPSAob3B0aW9uLCBzZWN0aW9uLCByYXd2YWwsIHJlZmVyZW5jZSkKKworY2xhc3MgSW50ZXJwb2xhdGlvblN5bnRheEVycm9yKEludGVycG9sYXRpb25FcnJvcik6CisgICAgIiIiUmFpc2VkIHdoZW4gdGhlIHNvdXJjZSB0ZXh0IGludG8gd2hpY2ggc3Vic3RpdHV0aW9ucyBhcmUgbWFkZQorICAgIGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIHJlcXVpcmVkIHN5bnRheC4iIiIKKworY2xhc3MgSW50ZXJwb2xhdGlvbkRlcHRoRXJyb3IoSW50ZXJwb2xhdGlvbkVycm9yKToKKyAgICAiIiJSYWlzZWQgd2hlbiBzdWJzdGl0dXRpb25zIGFyZSBuZXN0ZWQgdG9vIGRlZXBseS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb24sIHNlY3Rpb24sIHJhd3ZhbCk6CisgICAgICAgIG1zZyA9ICgiVmFsdWUgaW50ZXJwb2xhdGlvbiB0b28gZGVlcGx5IHJlY3Vyc2l2ZTpcbiIKKyAgICAgICAgICAgICAgICJcdHNlY3Rpb246IFslc11cbiIKKyAgICAgICAgICAgICAgICJcdG9wdGlvbiA6ICVzXG4iCisgICAgICAgICAgICAgICAiXHRyYXd2YWwgOiAlc1xuIgorICAgICAgICAgICAgICAgJSAoc2VjdGlvbiwgb3B0aW9uLCByYXd2YWwpKQorICAgICAgICBJbnRlcnBvbGF0aW9uRXJyb3IuX19pbml0X18oc2VsZiwgb3B0aW9uLCBzZWN0aW9uLCBtc2cpCisgICAgICAgIHNlbGYuYXJncyA9IChvcHRpb24sIHNlY3Rpb24sIHJhd3ZhbCkKKworY2xhc3MgUGFyc2luZ0Vycm9yKEVycm9yKToKKyAgICAiIiJSYWlzZWQgd2hlbiBhIGNvbmZpZ3VyYXRpb24gZmlsZSBkb2VzIG5vdCBmb2xsb3cgbGVnYWwgc3ludGF4LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgRXJyb3IuX19pbml0X18oc2VsZiwgJ0ZpbGUgY29udGFpbnMgcGFyc2luZyBlcnJvcnM6ICVzJyAlIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQorICAgICAgICBzZWxmLmFyZ3MgPSAoZmlsZW5hbWUsICkKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgbGluZW5vLCBsaW5lKToKKyAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKChsaW5lbm8sIGxpbmUpKQorICAgICAgICBzZWxmLm1lc3NhZ2UgKz0gJ1xuXHRbbGluZSAlMmRdOiAlcycgJSAobGluZW5vLCBsaW5lKQorCitjbGFzcyBNaXNzaW5nU2VjdGlvbkhlYWRlckVycm9yKFBhcnNpbmdFcnJvcik6CisgICAgIiIiUmFpc2VkIHdoZW4gYSBrZXktdmFsdWUgcGFpciBpcyBmb3VuZCBiZWZvcmUgYW55IHNlY3Rpb24gaGVhZGVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8sIGxpbmUpOgorICAgICAgICBFcnJvci5fX2luaXRfXygKKyAgICAgICAgICAgIHNlbGYsCisgICAgICAgICAgICAnRmlsZSBjb250YWlucyBubyBzZWN0aW9uIGhlYWRlcnMuXG5maWxlOiAlcywgbGluZTogJWRcbiVyJyAlCisgICAgICAgICAgICAoZmlsZW5hbWUsIGxpbmVubywgbGluZSkpCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBzZWxmLmxpbmUgPSBsaW5lCisgICAgICAgIHNlbGYuYXJncyA9IChmaWxlbmFtZSwgbGluZW5vLCBsaW5lKQorCisKK2NsYXNzIFJhd0NvbmZpZ1BhcnNlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVmYXVsdHM9Tm9uZSwgZGljdF90eXBlPV9kZWZhdWx0X2RpY3QsCisgICAgICAgICAgICAgICAgIGFsbG93X25vX3ZhbHVlPUZhbHNlKToKKyAgICAgICAgc2VsZi5fZGljdCA9IGRpY3RfdHlwZQorICAgICAgICBzZWxmLl9zZWN0aW9ucyA9IHNlbGYuX2RpY3QoKQorICAgICAgICBzZWxmLl9kZWZhdWx0cyA9IHNlbGYuX2RpY3QoKQorICAgICAgICBpZiBhbGxvd19ub192YWx1ZToKKyAgICAgICAgICAgIHNlbGYuX29wdGNyZSA9IHNlbGYuT1BUQ1JFX05WCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9vcHRjcmUgPSBzZWxmLk9QVENSRQorICAgICAgICBpZiBkZWZhdWx0czoKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRlZmF1bHRzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVmYXVsdHNbc2VsZi5vcHRpb254Zm9ybShrZXkpXSA9IHZhbHVlCisKKyAgICBkZWYgZGVmYXVsdHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kZWZhdWx0cworCisgICAgZGVmIHNlY3Rpb25zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHNlY3Rpb24gbmFtZXMsIGV4Y2x1ZGluZyBbREVGQVVMVF0iIiIKKyAgICAgICAgIyBzZWxmLl9zZWN0aW9ucyB3aWxsIG5ldmVyIGhhdmUgW0RFRkFVTFRdIGluIGl0CisgICAgICAgIHJldHVybiBzZWxmLl9zZWN0aW9ucy5rZXlzKCkKKworICAgIGRlZiBhZGRfc2VjdGlvbihzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IHNlY3Rpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24uCisKKyAgICAgICAgUmFpc2UgRHVwbGljYXRlU2VjdGlvbkVycm9yIGlmIGEgc2VjdGlvbiBieSB0aGUgc3BlY2lmaWVkIG5hbWUKKyAgICAgICAgYWxyZWFkeSBleGlzdHMuIFJhaXNlIFZhbHVlRXJyb3IgaWYgbmFtZSBpcyBERUZBVUxUIG9yIGFueSBvZiBpdCdzCisgICAgICAgIGNhc2UtaW5zZW5zaXRpdmUgdmFyaWFudHMuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWN0aW9uLmxvd2VyKCkgPT0gImRlZmF1bHQiOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ0ludmFsaWQgc2VjdGlvbiBuYW1lOiAlcycgJSBzZWN0aW9uCisKKyAgICAgICAgaWYgc2VjdGlvbiBpbiBzZWxmLl9zZWN0aW9uczoKKyAgICAgICAgICAgIHJhaXNlIER1cGxpY2F0ZVNlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXSA9IHNlbGYuX2RpY3QoKQorCisgICAgZGVmIGhhc19zZWN0aW9uKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICAiIiJJbmRpY2F0ZSB3aGV0aGVyIHRoZSBuYW1lZCBzZWN0aW9uIGlzIHByZXNlbnQgaW4gdGhlIGNvbmZpZ3VyYXRpb24uCisKKyAgICAgICAgVGhlIERFRkFVTFQgc2VjdGlvbiBpcyBub3QgYWNrbm93bGVkZ2VkLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlY3Rpb24gaW4gc2VsZi5fc2VjdGlvbnMKKworICAgIGRlZiBvcHRpb25zKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIG9wdGlvbiBuYW1lcyBmb3IgdGhlIGdpdmVuIHNlY3Rpb24gbmFtZS4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0cyA9IHNlbGYuX3NlY3Rpb25zW3NlY3Rpb25dLmNvcHkoKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICBvcHRzLnVwZGF0ZShzZWxmLl9kZWZhdWx0cykKKyAgICAgICAgaWYgJ19fbmFtZV9fJyBpbiBvcHRzOgorICAgICAgICAgICAgZGVsIG9wdHNbJ19fbmFtZV9fJ10KKyAgICAgICAgcmV0dXJuIG9wdHMua2V5cygpCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZXMpOgorICAgICAgICAiIiJSZWFkIGFuZCBwYXJzZSBhIGZpbGVuYW1lIG9yIGEgbGlzdCBvZiBmaWxlbmFtZXMuCisKKyAgICAgICAgRmlsZXMgdGhhdCBjYW5ub3QgYmUgb3BlbmVkIGFyZSBzaWxlbnRseSBpZ25vcmVkOyB0aGlzIGlzCisgICAgICAgIGRlc2lnbmVkIHNvIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGEgbGlzdCBvZiBwb3RlbnRpYWwKKyAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9ucyAoZS5nLiBjdXJyZW50IGRpcmVjdG9yeSwgdXNlcidzCisgICAgICAgIGhvbWUgZGlyZWN0b3J5LCBzeXN0ZW13aWRlIGRpcmVjdG9yeSksIGFuZCBhbGwgZXhpc3RpbmcKKyAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlcyBpbiB0aGUgbGlzdCB3aWxsIGJlIHJlYWQuICBBIHNpbmdsZQorICAgICAgICBmaWxlbmFtZSBtYXkgYWxzbyBiZSBnaXZlbi4KKworICAgICAgICBSZXR1cm4gbGlzdCBvZiBzdWNjZXNzZnVsbHkgcmVhZCBmaWxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWVzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IFtmaWxlbmFtZXNdCisgICAgICAgIHJlYWRfb2sgPSBbXQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLl9yZWFkKGZwLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIHJlYWRfb2suYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gcmVhZF9vaworCisgICAgZGVmIHJlYWRmcChzZWxmLCBmcCwgZmlsZW5hbWU9Tm9uZSk6CisgICAgICAgICIiIkxpa2UgcmVhZCgpIGJ1dCB0aGUgYXJndW1lbnQgbXVzdCBiZSBhIGZpbGUtbGlrZSBvYmplY3QuCisKKyAgICAgICAgVGhlIGBmcCcgYXJndW1lbnQgbXVzdCBoYXZlIGEgYHJlYWRsaW5lJyBtZXRob2QuICBPcHRpb25hbAorICAgICAgICBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIGBmaWxlbmFtZScsIHdoaWNoIGlmIG5vdCBnaXZlbiwgaXMKKyAgICAgICAgdGFrZW4gZnJvbSBmcC5uYW1lLiAgSWYgZnAgaGFzIG5vIGBuYW1lJyBhdHRyaWJ1dGUsIGA8Pz8/PicgaXMKKyAgICAgICAgdXNlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZwLm5hbWUKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICc8Pz8/PicKKyAgICAgICAgc2VsZi5fcmVhZChmcCwgZmlsZW5hbWUpCisKKyAgICBkZWYgZ2V0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbik6CisgICAgICAgIG9wdCA9IHNlbGYub3B0aW9ueGZvcm0ob3B0aW9uKQorICAgICAgICBpZiBzZWN0aW9uIG5vdCBpbiBzZWxmLl9zZWN0aW9uczoKKyAgICAgICAgICAgIGlmIHNlY3Rpb24gIT0gREVGQVVMVFNFQ1Q6CisgICAgICAgICAgICAgICAgcmFpc2UgTm9TZWN0aW9uRXJyb3Ioc2VjdGlvbikKKyAgICAgICAgICAgIGlmIG9wdCBpbiBzZWxmLl9kZWZhdWx0czoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGVmYXVsdHNbb3B0XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb09wdGlvbkVycm9yKG9wdGlvbiwgc2VjdGlvbikKKyAgICAgICAgZWxpZiBvcHQgaW4gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl06CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl1bb3B0XQorICAgICAgICBlbGlmIG9wdCBpbiBzZWxmLl9kZWZhdWx0czoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kZWZhdWx0c1tvcHRdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOb09wdGlvbkVycm9yKG9wdGlvbiwgc2VjdGlvbikKKworICAgIGRlZiBpdGVtcyhzZWxmLCBzZWN0aW9uKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZDIgPSBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBpZiBzZWN0aW9uICE9IERFRkFVTFRTRUNUOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vU2VjdGlvbkVycm9yKHNlY3Rpb24pCisgICAgICAgICAgICBkMiA9IHNlbGYuX2RpY3QoKQorICAgICAgICBkID0gc2VsZi5fZGVmYXVsdHMuY29weSgpCisgICAgICAgIGQudXBkYXRlKGQyKQorICAgICAgICBpZiAiX19uYW1lX18iIGluIGQ6CisgICAgICAgICAgICBkZWwgZFsiX19uYW1lX18iXQorICAgICAgICByZXR1cm4gZC5pdGVtcygpCisKKyAgICBkZWYgX2dldChzZWxmLCBzZWN0aW9uLCBjb252LCBvcHRpb24pOgorICAgICAgICByZXR1cm4gY29udihzZWxmLmdldChzZWN0aW9uLCBvcHRpb24pKQorCisgICAgZGVmIGdldGludChzZWxmLCBzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlY3Rpb24sIGludCwgb3B0aW9uKQorCisgICAgZGVmIGdldGZsb2F0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbik6CisgICAgICAgIHJldHVybiBzZWxmLl9nZXQoc2VjdGlvbiwgZmxvYXQsIG9wdGlvbikKKworICAgIF9ib29sZWFuX3N0YXRlcyA9IHsnMSc6IFRydWUsICd5ZXMnOiBUcnVlLCAndHJ1ZSc6IFRydWUsICdvbic6IFRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICcwJzogRmFsc2UsICdubyc6IEZhbHNlLCAnZmFsc2UnOiBGYWxzZSwgJ29mZic6IEZhbHNlfQorCisgICAgZGVmIGdldGJvb2xlYW4oc2VsZiwgc2VjdGlvbiwgb3B0aW9uKToKKyAgICAgICAgdiA9IHNlbGYuZ2V0KHNlY3Rpb24sIG9wdGlvbikKKyAgICAgICAgaWYgdi5sb3dlcigpIG5vdCBpbiBzZWxmLl9ib29sZWFuX3N0YXRlczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdOb3QgYSBib29sZWFuOiAlcycgJSB2CisgICAgICAgIHJldHVybiBzZWxmLl9ib29sZWFuX3N0YXRlc1t2Lmxvd2VyKCldCisKKyAgICBkZWYgb3B0aW9ueGZvcm0oc2VsZiwgb3B0aW9uc3RyKToKKyAgICAgICAgcmV0dXJuIG9wdGlvbnN0ci5sb3dlcigpCisKKyAgICBkZWYgaGFzX29wdGlvbihzZWxmLCBzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICAiIiJDaGVjayBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhIGdpdmVuIG9wdGlvbiBpbiBhIGdpdmVuIHNlY3Rpb24uIiIiCisgICAgICAgIGlmIG5vdCBzZWN0aW9uIG9yIHNlY3Rpb24gPT0gREVGQVVMVFNFQ1Q6CisgICAgICAgICAgICBvcHRpb24gPSBzZWxmLm9wdGlvbnhmb3JtKG9wdGlvbikKKyAgICAgICAgICAgIHJldHVybiBvcHRpb24gaW4gc2VsZi5fZGVmYXVsdHMKKyAgICAgICAgZWxpZiBzZWN0aW9uIG5vdCBpbiBzZWxmLl9zZWN0aW9uczoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3B0aW9uID0gc2VsZi5vcHRpb254Zm9ybShvcHRpb24pCisgICAgICAgICAgICByZXR1cm4gKG9wdGlvbiBpbiBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXQorICAgICAgICAgICAgICAgICAgICBvciBvcHRpb24gaW4gc2VsZi5fZGVmYXVsdHMpCisKKyAgICBkZWYgc2V0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIlNldCBhbiBvcHRpb24uIiIiCisgICAgICAgIGlmIG5vdCBzZWN0aW9uIG9yIHNlY3Rpb24gPT0gREVGQVVMVFNFQ1Q6CisgICAgICAgICAgICBzZWN0ZGljdCA9IHNlbGYuX2RlZmF1bHRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VjdGRpY3QgPSBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vU2VjdGlvbkVycm9yKHNlY3Rpb24pCisgICAgICAgIHNlY3RkaWN0W3NlbGYub3B0aW9ueGZvcm0ob3B0aW9uKV0gPSB2YWx1ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGZwKToKKyAgICAgICAgIiIiV3JpdGUgYW4gLmluaS1mb3JtYXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNvbmZpZ3VyYXRpb24gc3RhdGUuIiIiCisgICAgICAgIGlmIHNlbGYuX2RlZmF1bHRzOgorICAgICAgICAgICAgZnAud3JpdGUoIlslc11cbiIgJSBERUZBVUxUU0VDVCkKKyAgICAgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gc2VsZi5fZGVmYXVsdHMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgiJXMgPSAlc1xuIiAlIChrZXksIHN0cih2YWx1ZSkucmVwbGFjZSgnXG4nLCAnXG5cdCcpKSkKKyAgICAgICAgICAgIGZwLndyaXRlKCJcbiIpCisgICAgICAgIGZvciBzZWN0aW9uIGluIHNlbGYuX3NlY3Rpb25zOgorICAgICAgICAgICAgZnAud3JpdGUoIlslc11cbiIgJSBzZWN0aW9uKQorICAgICAgICAgICAgZm9yIChrZXksIHZhbHVlKSBpbiBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGtleSA9PSAiX19uYW1lX18iOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpcyBub3QgTm9uZSkgb3IgKHNlbGYuX29wdGNyZSA9PSBzZWxmLk9QVENSRSk6CisgICAgICAgICAgICAgICAgICAgIGtleSA9ICIgPSAiLmpvaW4oKGtleSwgc3RyKHZhbHVlKS5yZXBsYWNlKCdcbicsICdcblx0JykpKQorICAgICAgICAgICAgICAgIGZwLndyaXRlKCIlc1xuIiAlIChrZXkpKQorICAgICAgICAgICAgZnAud3JpdGUoIlxuIikKKworICAgIGRlZiByZW1vdmVfb3B0aW9uKHNlbGYsIHNlY3Rpb24sIG9wdGlvbik6CisgICAgICAgICIiIlJlbW92ZSBhbiBvcHRpb24uIiIiCisgICAgICAgIGlmIG5vdCBzZWN0aW9uIG9yIHNlY3Rpb24gPT0gREVGQVVMVFNFQ1Q6CisgICAgICAgICAgICBzZWN0ZGljdCA9IHNlbGYuX2RlZmF1bHRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VjdGRpY3QgPSBzZWxmLl9zZWN0aW9uc1tzZWN0aW9uXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vU2VjdGlvbkVycm9yKHNlY3Rpb24pCisgICAgICAgIG9wdGlvbiA9IHNlbGYub3B0aW9ueGZvcm0ob3B0aW9uKQorICAgICAgICBleGlzdGVkID0gb3B0aW9uIGluIHNlY3RkaWN0CisgICAgICAgIGlmIGV4aXN0ZWQ6CisgICAgICAgICAgICBkZWwgc2VjdGRpY3Rbb3B0aW9uXQorICAgICAgICByZXR1cm4gZXhpc3RlZAorCisgICAgZGVmIHJlbW92ZV9zZWN0aW9uKHNlbGYsIHNlY3Rpb24pOgorICAgICAgICAiIiJSZW1vdmUgYSBmaWxlIHNlY3Rpb24uIiIiCisgICAgICAgIGV4aXN0ZWQgPSBzZWN0aW9uIGluIHNlbGYuX3NlY3Rpb25zCisgICAgICAgIGlmIGV4aXN0ZWQ6CisgICAgICAgICAgICBkZWwgc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgcmV0dXJuIGV4aXN0ZWQKKworICAgICMKKyAgICAjIFJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgc2VjdGlvbiBoZWFkZXJzIGFuZCBvcHRpb25zLgorICAgICMKKyAgICBTRUNUQ1JFID0gcmUuY29tcGlsZSgKKyAgICAgICAgcidcWycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFsKKyAgICAgICAgcicoP1A8aGVhZGVyPlteXV0rKScgICAgICAgICAgICAgICAgICAjIHZlcnkgcGVybWlzc2l2ZSEKKyAgICAgICAgcidcXScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIF0KKyAgICAgICAgKQorICAgIE9QVENSRSA9IHJlLmNvbXBpbGUoCisgICAgICAgIHInKD9QPG9wdGlvbj5bXjo9XHNdW146PV0qKScgICAgICAgICAgIyB2ZXJ5IHBlcm1pc3NpdmUhCisgICAgICAgIHInXHMqKD9QPHZpPls6PV0pXHMqJyAgICAgICAgICAgICAgICAgIyBhbnkgbnVtYmVyIG9mIHNwYWNlL3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvbGxvd2VkIGJ5IHNlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKGVpdGhlciA6IG9yID0pLCBmb2xsb3dlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYnkgYW55ICMgc3BhY2UvdGFiCisgICAgICAgIHInKD9QPHZhbHVlPi4qKSQnICAgICAgICAgICAgICAgICAgICAgIyBldmVyeXRoaW5nIHVwIHRvIGVvbAorICAgICAgICApCisgICAgT1BUQ1JFX05WID0gcmUuY29tcGlsZSgKKyAgICAgICAgcicoP1A8b3B0aW9uPlteOj1cc11bXjo9XSopJyAgICAgICAgICAjIHZlcnkgcGVybWlzc2l2ZSEKKyAgICAgICAgcidccyooPzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFueSBudW1iZXIgb2Ygc3BhY2UvdGFiLAorICAgICAgICByJyg/UDx2aT5bOj1dKVxzKicgICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWxseSBmb2xsb3dlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2VwYXJhdG9yIChlaXRoZXIgOiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgPSksIGZvbGxvd2VkIGJ5IGFueSAjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzcGFjZS90YWIKKyAgICAgICAgcicoP1A8dmFsdWU+LiopKT8kJyAgICAgICAgICAgICAgICAgICAjIGV2ZXJ5dGhpbmcgdXAgdG8gZW9sCisgICAgICAgICkKKworICAgIGRlZiBfcmVhZChzZWxmLCBmcCwgZnBuYW1lKToKKyAgICAgICAgIiIiUGFyc2UgYSBzZWN0aW9uZWQgc2V0dXAgZmlsZS4KKworICAgICAgICBUaGUgc2VjdGlvbnMgaW4gc2V0dXAgZmlsZSBjb250YWlucyBhIHRpdGxlIGxpbmUgYXQgdGhlIHRvcCwKKyAgICAgICAgaW5kaWNhdGVkIGJ5IGEgbmFtZSBpbiBzcXVhcmUgYnJhY2tldHMgKGBbXScpLCBwbHVzIGtleS92YWx1ZQorICAgICAgICBvcHRpb25zIGxpbmVzLCBpbmRpY2F0ZWQgYnkgYG5hbWU6IHZhbHVlJyBmb3JtYXQgbGluZXMuCisgICAgICAgIENvbnRpbnVhdGlvbnMgYXJlIHJlcHJlc2VudGVkIGJ5IGFuIGVtYmVkZGVkIG5ld2xpbmUgdGhlbgorICAgICAgICBsZWFkaW5nIHdoaXRlc3BhY2UuICBCbGFuayBsaW5lcywgbGluZXMgYmVnaW5uaW5nIHdpdGggYSAnIycsCisgICAgICAgIGFuZCBqdXN0IGFib3V0IGV2ZXJ5dGhpbmcgZWxzZSBhcmUgaWdub3JlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGN1cnNlY3QgPSBOb25lICAgICAgICAgICAgICAgICAgICAgICAgIyBOb25lLCBvciBhIGRpY3Rpb25hcnkKKyAgICAgICAgb3B0bmFtZSA9IE5vbmUKKyAgICAgICAgbGluZW5vID0gMAorICAgICAgICBlID0gTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTm9uZSwgb3IgYW4gZXhjZXB0aW9uCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgICAgICMgY29tbWVudCBvciBibGFuayBsaW5lPworICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpID09ICcnIG9yIGxpbmVbMF0gaW4gJyM7JzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbGluZS5zcGxpdChOb25lLCAxKVswXS5sb3dlcigpID09ICdyZW0nIGFuZCBsaW5lWzBdIGluICJyUiI6CisgICAgICAgICAgICAgICAgIyBubyBsZWFkaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBjb250aW51YXRpb24gbGluZT8KKyAgICAgICAgICAgIGlmIGxpbmVbMF0uaXNzcGFjZSgpIGFuZCBjdXJzZWN0IGlzIG5vdCBOb25lIGFuZCBvcHRuYW1lOgorICAgICAgICAgICAgICAgIHZhbHVlID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgaWYgdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIGN1cnNlY3Rbb3B0bmFtZV0uYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgIyBhIHNlY3Rpb24gaGVhZGVyIG9yIG9wdGlvbiBoZWFkZXI/CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgaXMgaXQgYSBzZWN0aW9uIGhlYWRlcj8KKyAgICAgICAgICAgICAgICBtbyA9IHNlbGYuU0VDVENSRS5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgICAgICBzZWN0bmFtZSA9IG1vLmdyb3VwKCdoZWFkZXInKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWN0bmFtZSBpbiBzZWxmLl9zZWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNlY3QgPSBzZWxmLl9zZWN0aW9uc1tzZWN0bmFtZV0KKyAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWN0bmFtZSA9PSBERUZBVUxUU0VDVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnNlY3QgPSBzZWxmLl9kZWZhdWx0cworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc2VjdCA9IHNlbGYuX2RpY3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc2VjdFsnX19uYW1lX18nXSA9IHNlY3RuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9zZWN0aW9uc1tzZWN0bmFtZV0gPSBjdXJzZWN0CisgICAgICAgICAgICAgICAgICAgICMgU28gc2VjdGlvbnMgY2FuJ3Qgc3RhcnQgd2l0aCBhIGNvbnRpbnVhdGlvbiBsaW5lCisgICAgICAgICAgICAgICAgICAgIG9wdG5hbWUgPSBOb25lCisgICAgICAgICAgICAgICAgIyBubyBzZWN0aW9uIGhlYWRlciBpbiB0aGUgZmlsZT8KKyAgICAgICAgICAgICAgICBlbGlmIGN1cnNlY3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTWlzc2luZ1NlY3Rpb25IZWFkZXJFcnJvcihmcG5hbWUsIGxpbmVubywgbGluZSkKKyAgICAgICAgICAgICAgICAjIGFuIG9wdGlvbiBsaW5lPworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vID0gc2VsZi5fb3B0Y3JlLm1hdGNoKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgICAgICAgICAgb3B0bmFtZSwgdmksIG9wdHZhbCA9IG1vLmdyb3VwKCdvcHRpb24nLCAndmknLCAndmFsdWUnKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0bmFtZSA9IHNlbGYub3B0aW9ueGZvcm0ob3B0bmFtZS5yc3RyaXAoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBjaGVjayBpcyBmaW5lIGJlY2F1c2UgdGhlIE9QVENSRSBjYW5ub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbWF0Y2ggaWYgaXQgd291bGQgc2V0IG9wdHZhbCB0byBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcHR2YWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmkgaW4gKCc9JywgJzonKSBhbmQgJzsnIGluIG9wdHZhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAnOycgaXMgYSBjb21tZW50IGRlbGltaXRlciBvbmx5IGlmIGl0IGZvbGxvd3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIHNwYWNpbmcgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IG9wdHZhbC5maW5kKCc7JykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcG9zICE9IC0xIGFuZCBvcHR2YWxbcG9zLTFdLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHZhbCA9IG9wdHZhbFs6cG9zXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdHZhbCA9IG9wdHZhbC5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbGxvdyBlbXB0eSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcHR2YWwgPT0gJyIiJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0dmFsID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzZWN0W29wdG5hbWVdID0gW29wdHZhbF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZWxlc3Mgb3B0aW9uIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc2VjdFtvcHRuYW1lXSA9IG9wdHZhbAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG5vbi1mYXRhbCBwYXJzaW5nIGVycm9yIG9jY3VycmVkLiAgc2V0IHVwIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBleGNlcHRpb24gYnV0IGtlZXAgZ29pbmcuIHRoZSBleGNlcHRpb24gd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgIyByYWlzZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSBhbmQgd2lsbCBjb250YWluIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBhbGwgYm9ndXMgbGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBQYXJzaW5nRXJyb3IoZnBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZS5hcHBlbmQobGluZW5vLCByZXByKGxpbmUpKQorICAgICAgICAjIGlmIGFueSBwYXJzaW5nIGVycm9ycyBvY2N1cnJlZCwgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgIGlmIGU6CisgICAgICAgICAgICByYWlzZSBlCisKKyAgICAgICAgIyBqb2luIHRoZSBtdWx0aS1saW5lIHZhbHVlcyBjb2xsZWN0ZWQgd2hpbGUgcmVhZGluZworICAgICAgICBhbGxfc2VjdGlvbnMgPSBbc2VsZi5fZGVmYXVsdHNdCisgICAgICAgIGFsbF9zZWN0aW9ucy5leHRlbmQoc2VsZi5fc2VjdGlvbnMudmFsdWVzKCkpCisgICAgICAgIGZvciBvcHRpb25zIGluIGFsbF9zZWN0aW9uczoKKyAgICAgICAgICAgIGZvciBuYW1lLCB2YWwgaW4gb3B0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uc1tuYW1lXSA9ICdcbicuam9pbih2YWwpCisKK2ltcG9ydCBVc2VyRGljdCBhcyBfVXNlckRpY3QKKworY2xhc3MgX0NoYWlubWFwKF9Vc2VyRGljdC5EaWN0TWl4aW4pOgorICAgICIiIkNvbWJpbmUgbXVsdGlwbGUgbWFwcGluZ3MgZm9yIHN1Y2Nlc3NpdmUgbG9va3Vwcy4KKworICAgIEZvciBleGFtcGxlLCB0byBlbXVsYXRlIFB5dGhvbidzIG5vcm1hbCBsb29rdXAgc2VxdWVuY2U6CisKKyAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgIHB5bG9va3VwID0gX0NoYWlubWFwKGxvY2FscygpLCBnbG9iYWxzKCksIHZhcnMoX19idWlsdGluX18pKQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICptYXBzKToKKyAgICAgICAgc2VsZi5fbWFwcyA9IG1hcHMKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBmb3IgbWFwcGluZyBpbiBzZWxmLl9tYXBzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nW2tleV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBzZWVuID0gc2V0KCkKKyAgICAgICAgZm9yIG1hcHBpbmcgaW4gc2VsZi5fbWFwczoKKyAgICAgICAgICAgIGZvciBrZXkgaW4gbWFwcGluZzoKKyAgICAgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlZW46CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoa2V5KQorICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChrZXkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgQ29uZmlnUGFyc2VyKFJhd0NvbmZpZ1BhcnNlcik6CisKKyAgICBkZWYgZ2V0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgcmF3PUZhbHNlLCB2YXJzPU5vbmUpOgorICAgICAgICAiIiJHZXQgYW4gb3B0aW9uIHZhbHVlIGZvciBhIGdpdmVuIHNlY3Rpb24uCisKKyAgICAgICAgSWYgYHZhcnMnIGlzIHByb3ZpZGVkLCBpdCBtdXN0IGJlIGEgZGljdGlvbmFyeS4gVGhlIG9wdGlvbiBpcyBsb29rZWQgdXAKKyAgICAgICAgaW4gYHZhcnMnIChpZiBwcm92aWRlZCksIGBzZWN0aW9uJywgYW5kIGluIGBkZWZhdWx0cycgaW4gdGhhdCBvcmRlci4KKworICAgICAgICBBbGwgJSBpbnRlcnBvbGF0aW9ucyBhcmUgZXhwYW5kZWQgaW4gdGhlIHJldHVybiB2YWx1ZXMsIHVubGVzcyB0aGUKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnQgYHJhdycgaXMgdHJ1ZS4gVmFsdWVzIGZvciBpbnRlcnBvbGF0aW9uIGtleXMgYXJlCisgICAgICAgIGxvb2tlZCB1cCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdGhlIG9wdGlvbi4KKworICAgICAgICBUaGUgc2VjdGlvbiBERUZBVUxUIGlzIHNwZWNpYWwuCisgICAgICAgICIiIgorICAgICAgICBzZWN0aW9uZGljdCA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlY3Rpb25kaWN0ID0gc2VsZi5fc2VjdGlvbnNbc2VjdGlvbl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VjdGlvbiAhPSBERUZBVUxUU0VDVDoKKyAgICAgICAgICAgICAgICByYWlzZSBOb1NlY3Rpb25FcnJvcihzZWN0aW9uKQorICAgICAgICAjIFVwZGF0ZSB3aXRoIHRoZSBlbnRyeSBzcGVjaWZpYyB2YXJpYWJsZXMKKyAgICAgICAgdmFyZGljdCA9IHt9CisgICAgICAgIGlmIHZhcnM6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiB2YXJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdmFyZGljdFtzZWxmLm9wdGlvbnhmb3JtKGtleSldID0gdmFsdWUKKyAgICAgICAgZCA9IF9DaGFpbm1hcCh2YXJkaWN0LCBzZWN0aW9uZGljdCwgc2VsZi5fZGVmYXVsdHMpCisgICAgICAgIG9wdGlvbiA9IHNlbGYub3B0aW9ueGZvcm0ob3B0aW9uKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IGRbb3B0aW9uXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBOb09wdGlvbkVycm9yKG9wdGlvbiwgc2VjdGlvbikKKworICAgICAgICBpZiByYXcgb3IgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ludGVycG9sYXRlKHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUsIGQpCisKKyAgICBkZWYgaXRlbXMoc2VsZiwgc2VjdGlvbiwgcmF3PUZhbHNlLCB2YXJzPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyB3aXRoIChuYW1lLCB2YWx1ZSkgZm9yIGVhY2ggb3B0aW9uCisgICAgICAgIGluIHRoZSBzZWN0aW9uLgorCisgICAgICAgIEFsbCAlIGludGVycG9sYXRpb25zIGFyZSBleHBhbmRlZCBpbiB0aGUgcmV0dXJuIHZhbHVlcywgYmFzZWQgb24gdGhlCisgICAgICAgIGRlZmF1bHRzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciwgdW5sZXNzIHRoZSBvcHRpb25hbCBhcmd1bWVudAorICAgICAgICBgcmF3JyBpcyB0cnVlLiAgQWRkaXRpb25hbCBzdWJzdGl0dXRpb25zIG1heSBiZSBwcm92aWRlZCB1c2luZyB0aGUKKyAgICAgICAgYHZhcnMnIGFyZ3VtZW50LCB3aGljaCBtdXN0IGJlIGEgZGljdGlvbmFyeSB3aG9zZSBjb250ZW50cyBvdmVycmlkZXMKKyAgICAgICAgYW55IHByZS1leGlzdGluZyBkZWZhdWx0cy4KKworICAgICAgICBUaGUgc2VjdGlvbiBERUZBVUxUIGlzIHNwZWNpYWwuCisgICAgICAgICIiIgorICAgICAgICBkID0gc2VsZi5fZGVmYXVsdHMuY29weSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGQudXBkYXRlKHNlbGYuX3NlY3Rpb25zW3NlY3Rpb25dKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBpZiBzZWN0aW9uICE9IERFRkFVTFRTRUNUOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vU2VjdGlvbkVycm9yKHNlY3Rpb24pCisgICAgICAgICMgVXBkYXRlIHdpdGggdGhlIGVudHJ5IHNwZWNpZmljIHZhcmlhYmxlcworICAgICAgICBpZiB2YXJzOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gdmFycy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGRbc2VsZi5vcHRpb254Zm9ybShrZXkpXSA9IHZhbHVlCisgICAgICAgIG9wdGlvbnMgPSBkLmtleXMoKQorICAgICAgICBpZiAiX19uYW1lX18iIGluIG9wdGlvbnM6CisgICAgICAgICAgICBvcHRpb25zLnJlbW92ZSgiX19uYW1lX18iKQorICAgICAgICBpZiByYXc6CisgICAgICAgICAgICByZXR1cm4gWyhvcHRpb24sIGRbb3B0aW9uXSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIG9wdGlvbiBpbiBvcHRpb25zXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFsob3B0aW9uLCBzZWxmLl9pbnRlcnBvbGF0ZShzZWN0aW9uLCBvcHRpb24sIGRbb3B0aW9uXSwgZCkpCisgICAgICAgICAgICAgICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uc10KKworICAgIGRlZiBfaW50ZXJwb2xhdGUoc2VsZiwgc2VjdGlvbiwgb3B0aW9uLCByYXd2YWwsIHZhcnMpOgorICAgICAgICAjIGRvIHRoZSBzdHJpbmcgaW50ZXJwb2xhdGlvbgorICAgICAgICB2YWx1ZSA9IHJhd3ZhbAorICAgICAgICBkZXB0aCA9IE1BWF9JTlRFUlBPTEFUSU9OX0RFUFRICisgICAgICAgIHdoaWxlIGRlcHRoOiAgICAgICAgICAgICAgICAgICAgIyBMb29wIHRocm91Z2ggdGhpcyB1bnRpbCBpdCdzIGRvbmUKKyAgICAgICAgICAgIGRlcHRoIC09IDEKKyAgICAgICAgICAgIGlmIHZhbHVlIGFuZCAiJSgiIGluIHZhbHVlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fS0VZQ1JFLnN1YihzZWxmLl9pbnRlcnBvbGF0aW9uX3JlcGxhY2UsIHZhbHVlKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAlIHZhcnMKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEludGVycG9sYXRpb25NaXNzaW5nT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24sIHNlY3Rpb24sIHJhd3ZhbCwgZS5hcmdzWzBdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiB2YWx1ZSBhbmQgIiUoIiBpbiB2YWx1ZToKKyAgICAgICAgICAgIHJhaXNlIEludGVycG9sYXRpb25EZXB0aEVycm9yKG9wdGlvbiwgc2VjdGlvbiwgcmF3dmFsKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIF9LRVlDUkUgPSByZS5jb21waWxlKHIiJVwoKFteKV0qKVwpc3wuIikKKworICAgIGRlZiBfaW50ZXJwb2xhdGlvbl9yZXBsYWNlKHNlbGYsIG1hdGNoKToKKyAgICAgICAgcyA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIGlmIHMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBtYXRjaC5ncm91cCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiUlKCVzKXMiICUgc2VsZi5vcHRpb254Zm9ybShzKQorCisKK2NsYXNzIFNhZmVDb25maWdQYXJzZXIoQ29uZmlnUGFyc2VyKToKKworICAgIGRlZiBfaW50ZXJwb2xhdGUoc2VsZiwgc2VjdGlvbiwgb3B0aW9uLCByYXd2YWwsIHZhcnMpOgorICAgICAgICAjIGRvIHRoZSBzdHJpbmcgaW50ZXJwb2xhdGlvbgorICAgICAgICBMID0gW10KKyAgICAgICAgc2VsZi5faW50ZXJwb2xhdGVfc29tZShvcHRpb24sIEwsIHJhd3ZhbCwgc2VjdGlvbiwgdmFycywgMSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oTCkKKworICAgIF9pbnRlcnB2YXJfcmUgPSByZS5jb21waWxlKHIiJVwoKFteKV0rKVwpcyIpCisKKyAgICBkZWYgX2ludGVycG9sYXRlX3NvbWUoc2VsZiwgb3B0aW9uLCBhY2N1bSwgcmVzdCwgc2VjdGlvbiwgbWFwLCBkZXB0aCk6CisgICAgICAgIGlmIGRlcHRoID4gTUFYX0lOVEVSUE9MQVRJT05fREVQVEg6CisgICAgICAgICAgICByYWlzZSBJbnRlcnBvbGF0aW9uRGVwdGhFcnJvcihvcHRpb24sIHNlY3Rpb24sIHJlc3QpCisgICAgICAgIHdoaWxlIHJlc3Q6CisgICAgICAgICAgICBwID0gcmVzdC5maW5kKCIlIikKKyAgICAgICAgICAgIGlmIHAgPCAwOgorICAgICAgICAgICAgICAgIGFjY3VtLmFwcGVuZChyZXN0KQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgcCA+IDA6CisgICAgICAgICAgICAgICAgYWNjdW0uYXBwZW5kKHJlc3RbOnBdKQorICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0W3A6XQorICAgICAgICAgICAgIyBwIGlzIG5vIGxvbmdlciB1c2VkCisgICAgICAgICAgICBjID0gcmVzdFsxOjJdCisgICAgICAgICAgICBpZiBjID09ICIlIjoKKyAgICAgICAgICAgICAgICBhY2N1bS5hcHBlbmQoIiUiKQorICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0WzI6XQorICAgICAgICAgICAgZWxpZiBjID09ICIoIjoKKyAgICAgICAgICAgICAgICBtID0gc2VsZi5faW50ZXJwdmFyX3JlLm1hdGNoKHJlc3QpCisgICAgICAgICAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnRlcnBvbGF0aW9uU3ludGF4RXJyb3Iob3B0aW9uLCBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBpbnRlcnBvbGF0aW9uIHZhcmlhYmxlIHJlZmVyZW5jZSAlciIgJSByZXN0KQorICAgICAgICAgICAgICAgIHZhciA9IHNlbGYub3B0aW9ueGZvcm0obS5ncm91cCgxKSkKKyAgICAgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHYgPSBtYXBbdmFyXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW50ZXJwb2xhdGlvbk1pc3NpbmdPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiwgc2VjdGlvbiwgcmVzdCwgdmFyKQorICAgICAgICAgICAgICAgIGlmICIlIiBpbiB2OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnRlcnBvbGF0ZV9zb21lKG9wdGlvbiwgYWNjdW0sIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgbWFwLCBkZXB0aCArIDEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYWNjdW0uYXBwZW5kKHYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEludGVycG9sYXRpb25TeW50YXhFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uLCBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAiJyUlJyBtdXN0IGJlIGZvbGxvd2VkIGJ5ICclJScgb3IgJygnLCBmb3VuZDogJXIiICUgKHJlc3QsKSkKKworICAgIGRlZiBzZXQoc2VsZiwgc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgIiIiU2V0IGFuIG9wdGlvbi4gIEV4dGVuZCBDb25maWdQYXJzZXIuc2V0OiBjaGVjayBmb3Igc3RyaW5nIHZhbHVlcy4iIiIKKyAgICAgICAgIyBUaGUgb25seSBsZWdhbCBub24tc3RyaW5nIHZhbHVlIGlmIHdlIGFsbG93IHZhbHVlbGVzcworICAgICAgICAjIG9wdGlvbnMgaXMgTm9uZSwgc28gd2UgbmVlZCB0byBjaGVjayBpZiB0aGUgdmFsdWUgaXMgYQorICAgICAgICAjIHN0cmluZyBpZjoKKyAgICAgICAgIyAtIHdlIGRvIG5vdCBhbGxvdyB2YWx1ZWxlc3Mgb3B0aW9ucywgb3IKKyAgICAgICAgIyAtIHdlIGFsbG93IHZhbHVlbGVzcyBvcHRpb25zIGJ1dCB0aGUgdmFsdWUgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgc2VsZi5fb3B0Y3JlIGlzIHNlbGYuT1BUQ1JFIG9yIHZhbHVlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigib3B0aW9uIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MiKQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgY2hlY2sgZm9yIGJhZCBwZXJjZW50IHNpZ25zOgorICAgICAgICAgICAgIyBmaXJzdCwgcmVwbGFjZSBhbGwgImdvb2QiIGludGVycG9sYXRpb25zCisgICAgICAgICAgICB0bXBfdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCclJScsICcnKQorICAgICAgICAgICAgdG1wX3ZhbHVlID0gc2VsZi5faW50ZXJwdmFyX3JlLnN1YignJywgdG1wX3ZhbHVlKQorICAgICAgICAgICAgIyB0aGVuLCBjaGVjayBpZiB0aGVyZSdzIGEgbG9uZSBwZXJjZW50IHNpZ24gbGVmdAorICAgICAgICAgICAgaWYgJyUnIGluIHRtcF92YWx1ZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGludGVycG9sYXRpb24gc3ludGF4IGluICVyIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvc2l0aW9uICVkIiAlICh2YWx1ZSwgdG1wX3ZhbHVlLmZpbmQoJyUnKSkpCisgICAgICAgIENvbmZpZ1BhcnNlci5zZXQoc2VsZiwgc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5YyBiL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTY4NjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Db25maWdQYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5byBiL2xpYi9weXRob24yLjcvQ29uZmlnUGFyc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTY4NjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Db25maWdQYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ29va2llLnB5IGIvbGliL3B5dGhvbjIuNy9Db29raWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkYTQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvQ29va2llLnB5CkBAIC0wLDAgKzEsNzYxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKworIyMjIworIyBDb3B5cmlnaHQgMjAwMCBieSBUaW1vdGh5IE8nTWFsbGV5IDx0aW1vQGFsdW0ubWl0LmVkdT4KKyMKKyMgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlCisjIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieQorIyBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwKKyMgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyMgbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mCisjIFRpbW90aHkgTydNYWxsZXkgIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQorIyBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbgorIyBwcmlvciBwZXJtaXNzaW9uLgorIworIyBUaW1vdGh5IE8nTWFsbGV5IERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTCisjIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkKKyMgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFRpbW90aHkgTydNYWxsZXkgQkUgTElBQkxFIEZPUgorIyBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisjIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyMgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgorIyBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorIworIyMjIworIworIyBJZDogQ29va2llLnB5LHYgMi4yOSAyMDAwLzA4LzIzIDA1OjI4OjQ5IHRpbW8gRXhwCisjICAgYnkgVGltb3RoeSBPJ01hbGxleSA8dGltb0BhbHVtLm1pdC5lZHU+CisjCisjICBDb29raWUucHkgaXMgYSBQeXRob24gbW9kdWxlIGZvciB0aGUgaGFuZGxpbmcgb2YgSFRUUAorIyAgY29va2llcyBhcyBhIFB5dGhvbiBkaWN0aW9uYXJ5LiAgU2VlIFJGQyAyMTA5IGZvciBtb3JlCisjICBpbmZvcm1hdGlvbiBvbiBjb29raWVzLgorIworIyAgVGhlIG9yaWdpbmFsIGlkZWEgdG8gdHJlYXQgQ29va2llcyBhcyBhIGRpY3Rpb25hcnkgY2FtZSBmcm9tCisjICBEYXZlIE1pdGNoZWxsIChkYXZlbUBtYWduZXQuY29tKSBpbiAxOTk1LCB3aGVuIGhlIHJlbGVhc2VkIHRoZQorIyAgZmlyc3QgdmVyc2lvbiBvZiBuc2Nvb2tpZS5weS4KKyMKKyMjIyMKKworciIiIgorSGVyZSdzIGEgc2FtcGxlIHNlc3Npb24gdG8gc2hvdyBob3cgdG8gdXNlIHRoaXMgbW9kdWxlLgorQXQgdGhlIG1vbWVudCwgdGhpcyBpcyB0aGUgb25seSBkb2N1bWVudGF0aW9uLgorCitUaGUgQmFzaWNzCistLS0tLS0tLS0tCisKK0ltcG9ydGluZyBpcyBlYXN5Li4KKworICAgPj4+IGltcG9ydCBDb29raWUKKworTW9zdCBvZiB0aGUgdGltZSB5b3Ugc3RhcnQgYnkgY3JlYXRpbmcgYSBjb29raWUuICBDb29raWVzIGNvbWUgaW4KK3RocmVlIGZsYXZvcnMsIGVhY2ggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZW5jb2Rpbmcgc2VtYW50aWNzLCBidXQKK21vcmUgb24gdGhhdCBsYXRlci4KKworICAgPj4+IEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgID4+PiBDID0gQ29va2llLlNlcmlhbENvb2tpZSgpCisgICA+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCisKK1tOb3RlOiBMb25nLXRpbWUgdXNlcnMgb2YgQ29va2llLnB5IHdpbGwgcmVtZW1iZXIgdXNpbmcKK0Nvb2tpZS5Db29raWUoKSB0byBjcmVhdGUgYW4gQ29va2llIG9iamVjdC4gIEFsdGhvdWdoIGRlcHJlY2F0ZWQsIGl0CitpcyBzdGlsbCBzdXBwb3J0ZWQgYnkgdGhlIGNvZGUuICBTZWUgdGhlIEJhY2t3YXJkIENvbXBhdGliaWxpdHkgbm90ZXMKK2ZvciBtb3JlIGluZm9ybWF0aW9uLl0KKworT25jZSB5b3UndmUgY3JlYXRlZCB5b3VyIENvb2tpZSwgeW91IGNhbiBhZGQgdmFsdWVzIGp1c3QgYXMgaWYgaXQgd2VyZQorYSBkaWN0aW9uYXJ5LgorCisgICA+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCisgICA+Pj4gQ1siZmlnIl0gPSAibmV3dG9uIgorICAgPj4+IENbInN1Z2FyIl0gPSAid2FmZXIiCisgICA+Pj4gQy5vdXRwdXQoKQorICAgJ1NldC1Db29raWU6IGZpZz1uZXd0b25cclxuU2V0LUNvb2tpZTogc3VnYXI9d2FmZXInCisKK05vdGljZSB0aGF0IHRoZSBwcmludGFibGUgcmVwcmVzZW50YXRpb24gb2YgYSBDb29raWUgaXMgdGhlCithcHByb3ByaWF0ZSBmb3JtYXQgZm9yIGEgU2V0LUNvb2tpZTogaGVhZGVyLiAgVGhpcyBpcyB0aGUKK2RlZmF1bHQgYmVoYXZpb3IuICBZb3UgY2FuIGNoYW5nZSB0aGUgaGVhZGVyIGFuZCBwcmludGVkCithdHRyaWJ1dGVzIGJ5IHVzaW5nIHRoZSAub3V0cHV0KCkgZnVuY3Rpb24KKworICAgPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQorICAgPj4+IENbInJvY2t5Il0gPSAicm9hZCIKKyAgID4+PiBDWyJyb2NreSJdWyJwYXRoIl0gPSAiL2Nvb2tpZSIKKyAgID4+PiBwcmludCBDLm91dHB1dChoZWFkZXI9IkNvb2tpZToiKQorICAgQ29va2llOiByb2NreT1yb2FkOyBQYXRoPS9jb29raWUKKyAgID4+PiBwcmludCBDLm91dHB1dChhdHRycz1bXSwgaGVhZGVyPSJDb29raWU6IikKKyAgIENvb2tpZTogcm9ja3k9cm9hZAorCitUaGUgbG9hZCgpIG1ldGhvZCBvZiBhIENvb2tpZSBleHRyYWN0cyBjb29raWVzIGZyb20gYSBzdHJpbmcuICBJbiBhCitDR0kgc2NyaXB0LCB5b3Ugd291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGV4dHJhY3QgdGhlIGNvb2tpZXMgZnJvbSB0aGUKK0hUVFBfQ09PS0lFIGVudmlyb25tZW50IHZhcmlhYmxlLgorCisgICA+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCisgICA+Pj4gQy5sb2FkKCJjaGlwcz1haG95OyB2aWVubmE9ZmluZ2VyIikKKyAgID4+PiBDLm91dHB1dCgpCisgICAnU2V0LUNvb2tpZTogY2hpcHM9YWhveVxyXG5TZXQtQ29va2llOiB2aWVubmE9ZmluZ2VyJworCitUaGUgbG9hZCgpIG1ldGhvZCBpcyBkYXJuLXRvb3RpbiBzbWFydCBhYm91dCBpZGVudGlmeWluZyBjb29raWVzCit3aXRoaW4gYSBzdHJpbmcuICBFc2NhcGVkIHF1b3RhdGlvbiBtYXJrcywgbmVzdGVkIHNlbWljb2xvbnMsIGFuZCBvdGhlcgorc3VjaCB0cmlja2VyaWVzIGRvIG5vdCBjb25mdXNlIGl0LgorCisgICA+Pj4gQyA9IENvb2tpZS5TbWFydENvb2tpZSgpCisgICA+Pj4gQy5sb2FkKCdrZWVibGVyPSJFPWV2ZXJ5Ym9keTsgTD1cXCJMb3Zlc1xcIjsgZnVkZ2U9XFwwMTI7IjsnKQorICAgPj4+IHByaW50IEMKKyAgIFNldC1Db29raWU6IGtlZWJsZXI9IkU9ZXZlcnlib2R5OyBMPVwiTG92ZXNcIjsgZnVkZ2U9XDAxMjsiCisKK0VhY2ggZWxlbWVudCBvZiB0aGUgQ29va2llIGFsc28gc3VwcG9ydHMgYWxsIG9mIHRoZSBSRkMgMjEwOQorQ29va2llIGF0dHJpYnV0ZXMuICBIZXJlJ3MgYW4gZXhhbXBsZSB3aGljaCBzZXRzIHRoZSBQYXRoCithdHRyaWJ1dGUuCisKKyAgID4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKKyAgID4+PiBDWyJvcmVvIl0gPSAiZG91Ymxlc3R1ZmYiCisgICA+Pj4gQ1sib3JlbyJdWyJwYXRoIl0gPSAiLyIKKyAgID4+PiBwcmludCBDCisgICBTZXQtQ29va2llOiBvcmVvPWRvdWJsZXN0dWZmOyBQYXRoPS8KKworRWFjaCBkaWN0aW9uYXJ5IGVsZW1lbnQgaGFzIGEgJ3ZhbHVlJyBhdHRyaWJ1dGUsIHdoaWNoIGdpdmVzIHlvdQorYmFjayB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuCisKKyAgID4+PiBDID0gQ29va2llLlNtYXJ0Q29va2llKCkKKyAgID4+PiBDWyJ0d2l4Il0gPSAibm9uZSBmb3IgeW91IgorICAgPj4+IENbInR3aXgiXS52YWx1ZQorICAgJ25vbmUgZm9yIHlvdScKKworCitBIEJpdCBNb3JlIEFkdmFuY2VkCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FzIG1lbnRpb25lZCBiZWZvcmUsIHRoZXJlIGFyZSB0aHJlZSBkaWZmZXJlbnQgZmxhdm9ycyBvZiBDb29raWUKK29iamVjdHMsIGVhY2ggd2l0aCBkaWZmZXJlbnQgZW5jb2RpbmcvZGVjb2Rpbmcgc2VtYW50aWNzLiAgVGhpcworc2VjdGlvbiBicmllZmx5IGRpc2N1c3NlcyB0aGUgZGlmZmVyZW5jZXMuCisKK1NpbXBsZUNvb2tpZQorCitUaGUgU2ltcGxlQ29va2llIGV4cGVjdHMgdGhhdCBhbGwgdmFsdWVzIHNob3VsZCBiZSBzdGFuZGFyZCBzdHJpbmdzLgorSnVzdCB0byBiZSBzdXJlLCBTaW1wbGVDb29raWUgaW52b2tlcyB0aGUgc3RyKCkgYnVpbHRpbiB0byBjb252ZXJ0Cit0aGUgdmFsdWUgdG8gYSBzdHJpbmcsIHdoZW4gdGhlIHZhbHVlcyBhcmUgc2V0IGRpY3Rpb25hcnktc3R5bGUuCisKKyAgID4+PiBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICA+Pj4gQ1sibnVtYmVyIl0gPSA3CisgICA+Pj4gQ1sic3RyaW5nIl0gPSAic2V2ZW4iCisgICA+Pj4gQ1sibnVtYmVyIl0udmFsdWUKKyAgICc3JworICAgPj4+IENbInN0cmluZyJdLnZhbHVlCisgICAnc2V2ZW4nCisgICA+Pj4gQy5vdXRwdXQoKQorICAgJ1NldC1Db29raWU6IG51bWJlcj03XHJcblNldC1Db29raWU6IHN0cmluZz1zZXZlbicKKworCitTZXJpYWxDb29raWUKKworVGhlIFNlcmlhbENvb2tpZSBleHBlY3RzIHRoYXQgYWxsIHZhbHVlcyBzaG91bGQgYmUgc2VyaWFsaXplZCB1c2luZworY1BpY2tsZSAob3IgcGlja2xlLCBpZiBjUGlja2xlIGlzbid0IGF2YWlsYWJsZSkuICBBcyBhIHJlc3VsdCBvZgorc2VyaWFsaXppbmcsIFNlcmlhbENvb2tpZSBjYW4gc2F2ZSBhbG1vc3QgYW55IFB5dGhvbiBvYmplY3QgdG8gYQordmFsdWUsIGFuZCByZWNvdmVyIHRoZSBleGFjdCBzYW1lIG9iamVjdCB3aGVuIHRoZSBjb29raWUgaGFzIGJlZW4KK3JldHVybmVkLiAgKFNlcmlhbENvb2tpZSBjYW4geWllbGQgc29tZSBzdHJhbmdlLWxvb2tpbmcgY29va2llCit2YWx1ZXMsIGhvd2V2ZXIuKQorCisgICA+Pj4gQyA9IENvb2tpZS5TZXJpYWxDb29raWUoKQorICAgPj4+IENbIm51bWJlciJdID0gNworICAgPj4+IENbInN0cmluZyJdID0gInNldmVuIgorICAgPj4+IENbIm51bWJlciJdLnZhbHVlCisgICA3CisgICA+Pj4gQ1sic3RyaW5nIl0udmFsdWUKKyAgICdzZXZlbicKKyAgID4+PiBDLm91dHB1dCgpCisgICAnU2V0LUNvb2tpZTogbnVtYmVyPSJJN1xcMDEyLiJcclxuU2V0LUNvb2tpZTogc3RyaW5nPSJTXCdzZXZlblwnXFwwMTJwMVxcMDEyLiInCisKK0JlIHdhcm5lZCwgaG93ZXZlciwgaWYgU2VyaWFsQ29va2llIGNhbm5vdCBkZS1zZXJpYWxpemUgYSB2YWx1ZSAoYmVjYXVzZQoraXQgaXNuJ3QgYSB2YWxpZCBwaWNrbGUnZCBvYmplY3QpLCBJVCBXSUxMIFJBSVNFIEFOIEVYQ0VQVElPTi4KKworCitTbWFydENvb2tpZQorCitUaGUgU21hcnRDb29raWUgY29tYmluZXMgYXNwZWN0cyBvZiBlYWNoIG9mIHRoZSBvdGhlciB0d28gZmxhdm9ycy4KK1doZW4gc2V0dGluZyBhIHZhbHVlIGluIGEgZGljdGlvbmFyeS1mYXNoaW9uLCB0aGUgU21hcnRDb29raWUgd2lsbAorc2VyaWFsaXplIChhbGEgY1BpY2tsZSkgdGhlIHZhbHVlICppZiBhbmQgb25seSBpZiogaXQgaXNuJ3QgYQorUHl0aG9uIHN0cmluZy4gIFN0cmluZyBvYmplY3RzIGFyZSAqbm90KiBzZXJpYWxpemVkLiAgU2ltaWxhcmx5LAord2hlbiB0aGUgbG9hZCgpIG1ldGhvZCBwYXJzZXMgb3V0IHZhbHVlcywgaXQgYXR0ZW1wdHMgdG8gZGUtc2VyaWFsaXplCit0aGUgdmFsdWUuICBJZiBpdCBmYWlscywgdGhlbiBpdCBmYWxsc2JhY2sgdG8gdHJlYXRpbmcgdGhlIHZhbHVlCithcyBhIHN0cmluZy4KKworICAgPj4+IEMgPSBDb29raWUuU21hcnRDb29raWUoKQorICAgPj4+IENbIm51bWJlciJdID0gNworICAgPj4+IENbInN0cmluZyJdID0gInNldmVuIgorICAgPj4+IENbIm51bWJlciJdLnZhbHVlCisgICA3CisgICA+Pj4gQ1sic3RyaW5nIl0udmFsdWUKKyAgICdzZXZlbicKKyAgID4+PiBDLm91dHB1dCgpCisgICAnU2V0LUNvb2tpZTogbnVtYmVyPSJJN1xcMDEyLiJcclxuU2V0LUNvb2tpZTogc3RyaW5nPXNldmVuJworCisKK0JhY2t3YXJkcyBDb21wYXRpYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBrZWVwIGNvbXBhdGliaWx0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgb2YgQ29va2llLnB5LAoraXQgaXMgc3RpbGwgcG9zc2libGUgdG8gdXNlIENvb2tpZS5Db29raWUoKSB0byBjcmVhdGUgYSBDb29raWUuICBJbgorZmFjdCwgdGhpcyBzaW1wbHkgcmV0dXJucyBhIFNtYXJ0Q29va2llLgorCisgICA+Pj4gQyA9IENvb2tpZS5Db29raWUoKQorICAgPj4+IHByaW50IEMuX19jbGFzc19fLl9fbmFtZV9fCisgICBTbWFydENvb2tpZQorCisKK0ZpbmlzLgorIiIiICAjIgorIyAgICAgXgorIyAgICAgfC0tLS1oZWxwcyBvdXQgZm9udC1sb2NrCisKKyMKKyMgSW1wb3J0IG91ciByZXF1aXJlZCBtb2R1bGVzCisjCitpbXBvcnQgc3RyaW5nCisKK3RyeToKKyAgICBmcm9tIGNQaWNrbGUgaW1wb3J0IGR1bXBzLCBsb2FkcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gcGlja2xlIGltcG9ydCBkdW1wcywgbG9hZHMKKworaW1wb3J0IHJlLCB3YXJuaW5ncworCitfX2FsbF9fID0gWyJDb29raWVFcnJvciIsIkJhc2VDb29raWUiLCJTaW1wbGVDb29raWUiLCJTZXJpYWxDb29raWUiLAorICAgICAgICAgICAiU21hcnRDb29raWUiLCJDb29raWUiXQorCitfbnVsbGpvaW4gPSAnJy5qb2luCitfc2VtaXNwYWNlam9pbiA9ICc7ICcuam9pbgorX3NwYWNlam9pbiA9ICcgJy5qb2luCisKKyMKKyMgRGVmaW5lIGFuIGV4Y2VwdGlvbiB2aXNpYmxlIHRvIEV4dGVybmFsIG1vZHVsZXMKKyMKK2NsYXNzIENvb2tpZUVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKKyMgVGhlc2UgcXVvdGluZyByb3V0aW5lcyBjb25mb3JtIHRvIHRoZSBSRkMyMTA5IHNwZWNpZmljYXRpb24sIHdoaWNoIGluCisjIHR1cm4gcmVmZXJlbmNlcyB0aGUgY2hhcmFjdGVyIGRlZmluaXRpb25zIGZyb20gUkZDMjA2OC4gIFRoZXkgcHJvdmlkZQorIyBhIHR3by13YXkgcXVvdGluZyBhbGdvcml0aG0uICBBbnkgbm9uLXRleHQgY2hhcmFjdGVyIGlzIHRyYW5zbGF0ZWQKKyMgaW50byBhIDQgY2hhcmFjdGVyIHNlcXVlbmNlOiBhIGZvcndhcmQtc2xhc2ggZm9sbG93ZWQgYnkgdGhlCisjIHRocmVlLWRpZ2l0IG9jdGFsIGVxdWl2YWxlbnQgb2YgdGhlIGNoYXJhY3Rlci4gIEFueSAnXCcgb3IgJyInIGlzCisjIHF1b3RlZCB3aXRoIGEgcHJlY2VlZGluZyAnXCcgc2xhc2guCisjCisjIFRoZXNlIGFyZSB0YWtlbiBmcm9tIFJGQzIwNjggYW5kIFJGQzIxMDkuCisjICAgICAgIF9MZWdhbENoYXJzICAgICAgIGlzIHRoZSBsaXN0IG9mIGNoYXJzIHdoaWNoIGRvbid0IHJlcXVpcmUgIidzCisjICAgICAgIF9UcmFuc2xhdG9yICAgICAgIGhhc2gtdGFibGUgZm9yIGZhc3QgcXVvdGluZworIworX0xlZ2FsQ2hhcnMgICAgICAgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiISMkJSYnKistLl5fYHx+IgorX1RyYW5zbGF0b3IgICAgICAgPSB7CisgICAgJ1wwMDAnIDogJ1xcMDAwJywgICdcMDAxJyA6ICdcXDAwMScsICAnXDAwMicgOiAnXFwwMDInLAorICAgICdcMDAzJyA6ICdcXDAwMycsICAnXDAwNCcgOiAnXFwwMDQnLCAgJ1wwMDUnIDogJ1xcMDA1JywKKyAgICAnXDAwNicgOiAnXFwwMDYnLCAgJ1wwMDcnIDogJ1xcMDA3JywgICdcMDEwJyA6ICdcXDAxMCcsCisgICAgJ1wwMTEnIDogJ1xcMDExJywgICdcMDEyJyA6ICdcXDAxMicsICAnXDAxMycgOiAnXFwwMTMnLAorICAgICdcMDE0JyA6ICdcXDAxNCcsICAnXDAxNScgOiAnXFwwMTUnLCAgJ1wwMTYnIDogJ1xcMDE2JywKKyAgICAnXDAxNycgOiAnXFwwMTcnLCAgJ1wwMjAnIDogJ1xcMDIwJywgICdcMDIxJyA6ICdcXDAyMScsCisgICAgJ1wwMjInIDogJ1xcMDIyJywgICdcMDIzJyA6ICdcXDAyMycsICAnXDAyNCcgOiAnXFwwMjQnLAorICAgICdcMDI1JyA6ICdcXDAyNScsICAnXDAyNicgOiAnXFwwMjYnLCAgJ1wwMjcnIDogJ1xcMDI3JywKKyAgICAnXDAzMCcgOiAnXFwwMzAnLCAgJ1wwMzEnIDogJ1xcMDMxJywgICdcMDMyJyA6ICdcXDAzMicsCisgICAgJ1wwMzMnIDogJ1xcMDMzJywgICdcMDM0JyA6ICdcXDAzNCcsICAnXDAzNScgOiAnXFwwMzUnLAorICAgICdcMDM2JyA6ICdcXDAzNicsICAnXDAzNycgOiAnXFwwMzcnLAorCisgICAgIyBCZWNhdXNlIG9mIHRoZSB3YXkgYnJvd3NlcnMgcmVhbGx5IGhhbmRsZSBjb29raWVzIChhcyBvcHBvc2VkCisgICAgIyB0byB3aGF0IHRoZSBSRkMgc2F5cykgd2UgYWxzbyBlbmNvZGUgLCBhbmQgOworCisgICAgJywnIDogJ1xcMDU0JywgJzsnIDogJ1xcMDczJywKKworICAgICciJyA6ICdcXCInLCAgICAgICAnXFwnIDogJ1xcXFwnLAorCisgICAgJ1wxNzcnIDogJ1xcMTc3JywgICdcMjAwJyA6ICdcXDIwMCcsICAnXDIwMScgOiAnXFwyMDEnLAorICAgICdcMjAyJyA6ICdcXDIwMicsICAnXDIwMycgOiAnXFwyMDMnLCAgJ1wyMDQnIDogJ1xcMjA0JywKKyAgICAnXDIwNScgOiAnXFwyMDUnLCAgJ1wyMDYnIDogJ1xcMjA2JywgICdcMjA3JyA6ICdcXDIwNycsCisgICAgJ1wyMTAnIDogJ1xcMjEwJywgICdcMjExJyA6ICdcXDIxMScsICAnXDIxMicgOiAnXFwyMTInLAorICAgICdcMjEzJyA6ICdcXDIxMycsICAnXDIxNCcgOiAnXFwyMTQnLCAgJ1wyMTUnIDogJ1xcMjE1JywKKyAgICAnXDIxNicgOiAnXFwyMTYnLCAgJ1wyMTcnIDogJ1xcMjE3JywgICdcMjIwJyA6ICdcXDIyMCcsCisgICAgJ1wyMjEnIDogJ1xcMjIxJywgICdcMjIyJyA6ICdcXDIyMicsICAnXDIyMycgOiAnXFwyMjMnLAorICAgICdcMjI0JyA6ICdcXDIyNCcsICAnXDIyNScgOiAnXFwyMjUnLCAgJ1wyMjYnIDogJ1xcMjI2JywKKyAgICAnXDIyNycgOiAnXFwyMjcnLCAgJ1wyMzAnIDogJ1xcMjMwJywgICdcMjMxJyA6ICdcXDIzMScsCisgICAgJ1wyMzInIDogJ1xcMjMyJywgICdcMjMzJyA6ICdcXDIzMycsICAnXDIzNCcgOiAnXFwyMzQnLAorICAgICdcMjM1JyA6ICdcXDIzNScsICAnXDIzNicgOiAnXFwyMzYnLCAgJ1wyMzcnIDogJ1xcMjM3JywKKyAgICAnXDI0MCcgOiAnXFwyNDAnLCAgJ1wyNDEnIDogJ1xcMjQxJywgICdcMjQyJyA6ICdcXDI0MicsCisgICAgJ1wyNDMnIDogJ1xcMjQzJywgICdcMjQ0JyA6ICdcXDI0NCcsICAnXDI0NScgOiAnXFwyNDUnLAorICAgICdcMjQ2JyA6ICdcXDI0NicsICAnXDI0NycgOiAnXFwyNDcnLCAgJ1wyNTAnIDogJ1xcMjUwJywKKyAgICAnXDI1MScgOiAnXFwyNTEnLCAgJ1wyNTInIDogJ1xcMjUyJywgICdcMjUzJyA6ICdcXDI1MycsCisgICAgJ1wyNTQnIDogJ1xcMjU0JywgICdcMjU1JyA6ICdcXDI1NScsICAnXDI1NicgOiAnXFwyNTYnLAorICAgICdcMjU3JyA6ICdcXDI1NycsICAnXDI2MCcgOiAnXFwyNjAnLCAgJ1wyNjEnIDogJ1xcMjYxJywKKyAgICAnXDI2MicgOiAnXFwyNjInLCAgJ1wyNjMnIDogJ1xcMjYzJywgICdcMjY0JyA6ICdcXDI2NCcsCisgICAgJ1wyNjUnIDogJ1xcMjY1JywgICdcMjY2JyA6ICdcXDI2NicsICAnXDI2NycgOiAnXFwyNjcnLAorICAgICdcMjcwJyA6ICdcXDI3MCcsICAnXDI3MScgOiAnXFwyNzEnLCAgJ1wyNzInIDogJ1xcMjcyJywKKyAgICAnXDI3MycgOiAnXFwyNzMnLCAgJ1wyNzQnIDogJ1xcMjc0JywgICdcMjc1JyA6ICdcXDI3NScsCisgICAgJ1wyNzYnIDogJ1xcMjc2JywgICdcMjc3JyA6ICdcXDI3NycsICAnXDMwMCcgOiAnXFwzMDAnLAorICAgICdcMzAxJyA6ICdcXDMwMScsICAnXDMwMicgOiAnXFwzMDInLCAgJ1wzMDMnIDogJ1xcMzAzJywKKyAgICAnXDMwNCcgOiAnXFwzMDQnLCAgJ1wzMDUnIDogJ1xcMzA1JywgICdcMzA2JyA6ICdcXDMwNicsCisgICAgJ1wzMDcnIDogJ1xcMzA3JywgICdcMzEwJyA6ICdcXDMxMCcsICAnXDMxMScgOiAnXFwzMTEnLAorICAgICdcMzEyJyA6ICdcXDMxMicsICAnXDMxMycgOiAnXFwzMTMnLCAgJ1wzMTQnIDogJ1xcMzE0JywKKyAgICAnXDMxNScgOiAnXFwzMTUnLCAgJ1wzMTYnIDogJ1xcMzE2JywgICdcMzE3JyA6ICdcXDMxNycsCisgICAgJ1wzMjAnIDogJ1xcMzIwJywgICdcMzIxJyA6ICdcXDMyMScsICAnXDMyMicgOiAnXFwzMjInLAorICAgICdcMzIzJyA6ICdcXDMyMycsICAnXDMyNCcgOiAnXFwzMjQnLCAgJ1wzMjUnIDogJ1xcMzI1JywKKyAgICAnXDMyNicgOiAnXFwzMjYnLCAgJ1wzMjcnIDogJ1xcMzI3JywgICdcMzMwJyA6ICdcXDMzMCcsCisgICAgJ1wzMzEnIDogJ1xcMzMxJywgICdcMzMyJyA6ICdcXDMzMicsICAnXDMzMycgOiAnXFwzMzMnLAorICAgICdcMzM0JyA6ICdcXDMzNCcsICAnXDMzNScgOiAnXFwzMzUnLCAgJ1wzMzYnIDogJ1xcMzM2JywKKyAgICAnXDMzNycgOiAnXFwzMzcnLCAgJ1wzNDAnIDogJ1xcMzQwJywgICdcMzQxJyA6ICdcXDM0MScsCisgICAgJ1wzNDInIDogJ1xcMzQyJywgICdcMzQzJyA6ICdcXDM0MycsICAnXDM0NCcgOiAnXFwzNDQnLAorICAgICdcMzQ1JyA6ICdcXDM0NScsICAnXDM0NicgOiAnXFwzNDYnLCAgJ1wzNDcnIDogJ1xcMzQ3JywKKyAgICAnXDM1MCcgOiAnXFwzNTAnLCAgJ1wzNTEnIDogJ1xcMzUxJywgICdcMzUyJyA6ICdcXDM1MicsCisgICAgJ1wzNTMnIDogJ1xcMzUzJywgICdcMzU0JyA6ICdcXDM1NCcsICAnXDM1NScgOiAnXFwzNTUnLAorICAgICdcMzU2JyA6ICdcXDM1NicsICAnXDM1NycgOiAnXFwzNTcnLCAgJ1wzNjAnIDogJ1xcMzYwJywKKyAgICAnXDM2MScgOiAnXFwzNjEnLCAgJ1wzNjInIDogJ1xcMzYyJywgICdcMzYzJyA6ICdcXDM2MycsCisgICAgJ1wzNjQnIDogJ1xcMzY0JywgICdcMzY1JyA6ICdcXDM2NScsICAnXDM2NicgOiAnXFwzNjYnLAorICAgICdcMzY3JyA6ICdcXDM2NycsICAnXDM3MCcgOiAnXFwzNzAnLCAgJ1wzNzEnIDogJ1xcMzcxJywKKyAgICAnXDM3MicgOiAnXFwzNzInLCAgJ1wzNzMnIDogJ1xcMzczJywgICdcMzc0JyA6ICdcXDM3NCcsCisgICAgJ1wzNzUnIDogJ1xcMzc1JywgICdcMzc2JyA6ICdcXDM3NicsICAnXDM3NycgOiAnXFwzNzcnCisgICAgfQorCitfaWRtYXAgPSAnJy5qb2luKGNocih4KSBmb3IgeCBpbiB4cmFuZ2UoMjU2KSkKKworZGVmIF9xdW90ZShzdHIsIExlZ2FsQ2hhcnM9X0xlZ2FsQ2hhcnMsCisgICAgICAgICAgIGlkbWFwPV9pZG1hcCwgdHJhbnNsYXRlPXN0cmluZy50cmFuc2xhdGUpOgorICAgICMKKyAgICAjIElmIHRoZSBzdHJpbmcgZG9lcyBub3QgbmVlZCB0byBiZSBkb3VibGUtcXVvdGVkLAorICAgICMgdGhlbiBqdXN0IHJldHVybiB0aGUgc3RyaW5nLiAgT3RoZXJ3aXNlLCBzdXJyb3VuZAorICAgICMgdGhlIHN0cmluZyBpbiBkb3VibGVxdW90ZXMgYW5kIHByZWNlZGUgcXVvdGUgKHdpdGggYSBcKQorICAgICMgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICAgICMKKyAgICBpZiAiIiA9PSB0cmFuc2xhdGUoc3RyLCBpZG1hcCwgTGVnYWxDaGFycyk6CisgICAgICAgIHJldHVybiBzdHIKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJyInICsgX251bGxqb2luKCBtYXAoX1RyYW5zbGF0b3IuZ2V0LCBzdHIsIHN0cikgKSArICciJworIyBlbmQgX3F1b3RlCisKKworX09jdGFsUGF0dCA9IHJlLmNvbXBpbGUociJcXFswLTNdWzAtN11bMC03XSIpCitfUXVvdGVQYXR0ID0gcmUuY29tcGlsZShyIltcXF0uIikKKworZGVmIF91bnF1b3RlKHN0cik6CisgICAgIyBJZiB0aGVyZSBhcmVuJ3QgYW55IGRvdWJsZXF1b3RlcywKKyAgICAjIHRoZW4gdGhlcmUgY2FuJ3QgYmUgYW55IHNwZWNpYWwgY2hhcmFjdGVycy4gIFNlZSBSRkMgMjEwOS4KKyAgICBpZiAgbGVuKHN0cikgPCAyOgorICAgICAgICByZXR1cm4gc3RyCisgICAgaWYgc3RyWzBdICE9ICciJyBvciBzdHJbLTFdICE9ICciJzoKKyAgICAgICAgcmV0dXJuIHN0cgorCisgICAgIyBXZSBoYXZlIHRvIGFzc3VtZSB0aGF0IHdlIG11c3QgZGVjb2RlIHRoaXMgc3RyaW5nLgorICAgICMgRG93biB0byB3b3JrLgorCisgICAgIyBSZW1vdmUgdGhlICJzCisgICAgc3RyID0gc3RyWzE6LTFdCisKKyAgICAjIENoZWNrIGZvciBzcGVjaWFsIHNlcXVlbmNlcy4gIEV4YW1wbGVzOgorICAgICMgICAgXDAxMiAtLT4gXG4KKyAgICAjICAgIFwiICAgLS0+ICIKKyAgICAjCisgICAgaSA9IDAKKyAgICBuID0gbGVuKHN0cikKKyAgICByZXMgPSBbXQorICAgIHdoaWxlIDAgPD0gaSA8IG46CisgICAgICAgIE9tYXRjaCA9IF9PY3RhbFBhdHQuc2VhcmNoKHN0ciwgaSkKKyAgICAgICAgUW1hdGNoID0gX1F1b3RlUGF0dC5zZWFyY2goc3RyLCBpKQorICAgICAgICBpZiBub3QgT21hdGNoIGFuZCBub3QgUW1hdGNoOiAgICAgICAgICAgICAgIyBOZWl0aGVyIG1hdGNoZWQKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoc3RyW2k6XSkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICMgZWxzZToKKyAgICAgICAgaiA9IGsgPSAtMQorICAgICAgICBpZiBPbWF0Y2g6IGogPSBPbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgaWYgUW1hdGNoOiBrID0gUW1hdGNoLnN0YXJ0KDApCisgICAgICAgIGlmIFFtYXRjaCBhbmQgKCBub3QgT21hdGNoIG9yIGsgPCBqICk6ICAgICAjIFF1b3RlUGF0dCBtYXRjaGVkCisgICAgICAgICAgICByZXMuYXBwZW5kKHN0cltpOmtdKQorICAgICAgICAgICAgcmVzLmFwcGVuZChzdHJbaysxXSkKKyAgICAgICAgICAgIGkgPSBrKzIKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT2N0YWxQYXR0IG1hdGNoZWQKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoc3RyW2k6al0pCisgICAgICAgICAgICByZXMuYXBwZW5kKCBjaHIoIGludChzdHJbaisxOmorNF0sIDgpICkgKQorICAgICAgICAgICAgaSA9IGorNAorICAgIHJldHVybiBfbnVsbGpvaW4ocmVzKQorIyBlbmQgX3VucXVvdGUKKworIyBUaGUgX2dldGRhdGUoKSByb3V0aW5lIGlzIHVzZWQgdG8gc2V0IHRoZSBleHBpcmF0aW9uIHRpbWUgaW4KKyMgdGhlIGNvb2tpZSdzIEhUVFAgaGVhZGVyLiAgICAgIEJ5IGRlZmF1bHQsIF9nZXRkYXRlKCkgcmV0dXJucyB0aGUKKyMgY3VycmVudCB0aW1lIGluIHRoZSBhcHByb3ByaWF0ZSAiZXhwaXJlcyIgZm9ybWF0IGZvciBhCisjIFNldC1Db29raWUgaGVhZGVyLiAgICAgVGhlIG9uZSBvcHRpb25hbCBhcmd1bWVudCBpcyBhbiBvZmZzZXQgZnJvbQorIyBub3csIGluIHNlY29uZHMuICAgICAgRm9yIGV4YW1wbGUsIGFuIG9mZnNldCBvZiAtMzYwMCBtZWFucyAib25lIGhvdXIgYWdvIi4KKyMgVGhlIG9mZnNldCBtYXkgYmUgYSBmbG9hdGluZyBwb2ludCBudW1iZXIuCisjCisKK193ZWVrZGF5bmFtZSA9IFsnTW9uJywgJ1R1ZScsICdXZWQnLCAnVGh1JywgJ0ZyaScsICdTYXQnLCAnU3VuJ10KKworX21vbnRobmFtZSA9IFtOb25lLAorICAgICAgICAgICAgICAnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLAorICAgICAgICAgICAgICAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXQorCitkZWYgX2dldGRhdGUoZnV0dXJlPTAsIHdlZWtkYXluYW1lPV93ZWVrZGF5bmFtZSwgbW9udGhuYW1lPV9tb250aG5hbWUpOgorICAgIGZyb20gdGltZSBpbXBvcnQgZ210aW1lLCB0aW1lCisgICAgbm93ID0gdGltZSgpCisgICAgeWVhciwgbW9udGgsIGRheSwgaGgsIG1tLCBzcywgd2QsIHksIHogPSBnbXRpbWUobm93ICsgZnV0dXJlKQorICAgIHJldHVybiAiJXMsICUwMmQgJTNzICU0ZCAlMDJkOiUwMmQ6JTAyZCBHTVQiICUgXAorICAgICAgICAgICAod2Vla2RheW5hbWVbd2RdLCBkYXksIG1vbnRobmFtZVttb250aF0sIHllYXIsIGhoLCBtbSwgc3MpCisKKworIworIyBBIGNsYXNzIHRvIGhvbGQgT05FIGtleSx2YWx1ZSBwYWlyLgorIyBJbiBhIGNvb2tpZSwgZWFjaCBzdWNoIHBhaXIgbWF5IGhhdmUgc2V2ZXJhbCBhdHRyaWJ1dGVzLgorIyAgICAgICBzbyB0aGlzIGNsYXNzIGlzIHVzZWQgdG8ga2VlcCB0aGUgYXR0cmlidXRlcyBhc3NvY2lhdGVkCisjICAgICAgIHdpdGggdGhlIGFwcHJvcHJpYXRlIGtleSx2YWx1ZSBwYWlyLgorIyBUaGlzIGNsYXNzIGFsc28gaW5jbHVkZXMgYSBjb2RlZF92YWx1ZSBhdHRyaWJ1dGUsIHdoaWNoCisjICAgICAgIGlzIHVzZWQgdG8gaG9sZCB0aGUgbmV0d29yayByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyMgICAgICAgdmFsdWUuICBUaGlzIGlzIG1vc3QgdXNlZnVsIHdoZW4gUHl0aG9uIG9iamVjdHMgYXJlCisjICAgICAgIHBpY2tsZWQgZm9yIG5ldHdvcmsgdHJhbnNpdC4KKyMKKworY2xhc3MgTW9yc2VsKGRpY3QpOgorICAgICMgUkZDIDIxMDkgbGlzdHMgdGhlc2UgYXR0cmlidXRlcyBhcyByZXNlcnZlZDoKKyAgICAjICAgcGF0aCAgICAgICBjb21tZW50ICAgICAgICAgZG9tYWluCisgICAgIyAgIG1heC1hZ2UgICAgc2VjdXJlICAgICAgdmVyc2lvbgorICAgICMKKyAgICAjIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIGFsc28gcmVzZXJ2ZWQ6CisgICAgIyAgIGV4cGlyZXMKKyAgICAjCisgICAgIyBUaGlzIGlzIGFuIGV4dGVuc2lvbiBmcm9tIE1pY3Jvc29mdDoKKyAgICAjICAgaHR0cG9ubHkKKyAgICAjCisgICAgIyBUaGlzIGRpY3Rpb25hcnkgcHJvdmlkZXMgYSBtYXBwaW5nIGZyb20gdGhlIGxvd2VyY2FzZQorICAgICMgdmFyaWFudCBvbiB0aGUgbGVmdCB0byB0aGUgYXBwcm9wcmlhdGUgdHJhZGl0aW9uYWwKKyAgICAjIGZvcm1hdHRpbmcgb24gdGhlIHJpZ2h0LgorICAgIF9yZXNlcnZlZCA9IHsgImV4cGlyZXMiIDogImV4cGlyZXMiLAorICAgICAgICAgICAgICAgICAgICJwYXRoIiAgICAgICAgOiAiUGF0aCIsCisgICAgICAgICAgICAgICAgICAgImNvbW1lbnQiIDogIkNvbW1lbnQiLAorICAgICAgICAgICAgICAgICAgICJkb21haW4iICAgICAgOiAiRG9tYWluIiwKKyAgICAgICAgICAgICAgICAgICAibWF4LWFnZSIgOiAiTWF4LUFnZSIsCisgICAgICAgICAgICAgICAgICAgInNlY3VyZSIgICAgICA6ICJzZWN1cmUiLAorICAgICAgICAgICAgICAgICAgICJodHRwb25seSIgIDogImh0dHBvbmx5IiwKKyAgICAgICAgICAgICAgICAgICAidmVyc2lvbiIgOiAiVmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIFNldCBkZWZhdWx0cworICAgICAgICBzZWxmLmtleSA9IHNlbGYudmFsdWUgPSBzZWxmLmNvZGVkX3ZhbHVlID0gTm9uZQorCisgICAgICAgICMgU2V0IGRlZmF1bHQgYXR0cmlidXRlcworICAgICAgICBmb3IgSyBpbiBzZWxmLl9yZXNlcnZlZDoKKyAgICAgICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwgSywgIiIpCisgICAgIyBlbmQgX19pbml0X18KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBLLCBWKToKKyAgICAgICAgSyA9IEsubG93ZXIoKQorICAgICAgICBpZiBub3QgSyBpbiBzZWxmLl9yZXNlcnZlZDoKKyAgICAgICAgICAgIHJhaXNlIENvb2tpZUVycm9yKCJJbnZhbGlkIEF0dHJpYnV0ZSAlcyIgJSBLKQorICAgICAgICBkaWN0Ll9fc2V0aXRlbV9fKHNlbGYsIEssIFYpCisgICAgIyBlbmQgX19zZXRpdGVtX18KKworICAgIGRlZiBpc1Jlc2VydmVkS2V5KHNlbGYsIEspOgorICAgICAgICByZXR1cm4gSy5sb3dlcigpIGluIHNlbGYuX3Jlc2VydmVkCisgICAgIyBlbmQgaXNSZXNlcnZlZEtleQorCisgICAgZGVmIHNldChzZWxmLCBrZXksIHZhbCwgY29kZWRfdmFsLAorICAgICAgICAgICAgTGVnYWxDaGFycz1fTGVnYWxDaGFycywKKyAgICAgICAgICAgIGlkbWFwPV9pZG1hcCwgdHJhbnNsYXRlPXN0cmluZy50cmFuc2xhdGUpOgorICAgICAgICAjIEZpcnN0IHdlIHZlcmlmeSB0aGF0IHRoZSBrZXkgaXNuJ3QgYSByZXNlcnZlZCB3b3JkCisgICAgICAgICMgU2Vjb25kIHdlIG1ha2Ugc3VyZSBpdCBvbmx5IGNvbnRhaW5zIGxlZ2FsIGNoYXJhY3RlcnMKKyAgICAgICAgaWYga2V5Lmxvd2VyKCkgaW4gc2VsZi5fcmVzZXJ2ZWQ6CisgICAgICAgICAgICByYWlzZSBDb29raWVFcnJvcigiQXR0ZW1wdCB0byBzZXQgYSByZXNlcnZlZCBrZXk6ICVzIiAlIGtleSkKKyAgICAgICAgaWYgIiIgIT0gdHJhbnNsYXRlKGtleSwgaWRtYXAsIExlZ2FsQ2hhcnMpOgorICAgICAgICAgICAgcmFpc2UgQ29va2llRXJyb3IoIklsbGVnYWwga2V5IHZhbHVlOiAlcyIgJSBrZXkpCisKKyAgICAgICAgIyBJdCdzIGEgZ29vZCBrZXksIHNvIHNhdmUgaXQuCisgICAgICAgIHNlbGYua2V5ICAgICAgICAgICAgICAgICA9IGtleQorICAgICAgICBzZWxmLnZhbHVlICAgICAgICAgICAgICAgPSB2YWwKKyAgICAgICAgc2VsZi5jb2RlZF92YWx1ZSAgICAgICAgID0gY29kZWRfdmFsCisgICAgIyBlbmQgc2V0CisKKyAgICBkZWYgb3V0cHV0KHNlbGYsIGF0dHJzPU5vbmUsIGhlYWRlciA9ICJTZXQtQ29va2llOiIpOgorICAgICAgICByZXR1cm4gIiVzICVzIiAlICggaGVhZGVyLCBzZWxmLk91dHB1dFN0cmluZyhhdHRycykgKQorCisgICAgX19zdHJfXyA9IG91dHB1dAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzwlczogJXM9JXM+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZXksIHJlcHIoc2VsZi52YWx1ZSkgKQorCisgICAgZGVmIGpzX291dHB1dChzZWxmLCBhdHRycz1Ob25lKToKKyAgICAgICAgIyBQcmludCBqYXZhc2NyaXB0CisgICAgICAgIHJldHVybiAiIiIKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICA8IS0tIGJlZ2luIGhpZGluZworICAgICAgICBkb2N1bWVudC5jb29raWUgPSBcIiVzXCI7CisgICAgICAgIC8vIGVuZCBoaWRpbmcgLS0+CisgICAgICAgIDwvc2NyaXB0PgorICAgICAgICAiIiIgJSAoIHNlbGYuT3V0cHV0U3RyaW5nKGF0dHJzKS5yZXBsYWNlKCciJyxyJ1wiJyksICkKKyAgICAjIGVuZCBqc19vdXRwdXQoKQorCisgICAgZGVmIE91dHB1dFN0cmluZyhzZWxmLCBhdHRycz1Ob25lKToKKyAgICAgICAgIyBCdWlsZCB1cCBvdXIgcmVzdWx0CisgICAgICAgICMKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgUkEgPSByZXN1bHQuYXBwZW5kCisKKyAgICAgICAgIyBGaXJzdCwgdGhlIGtleT12YWx1ZSBwYWlyCisgICAgICAgIFJBKCIlcz0lcyIgJSAoc2VsZi5rZXksIHNlbGYuY29kZWRfdmFsdWUpKQorCisgICAgICAgICMgTm93IGFkZCBhbnkgZGVmaW5lZCBhdHRyaWJ1dGVzCisgICAgICAgIGlmIGF0dHJzIGlzIE5vbmU6CisgICAgICAgICAgICBhdHRycyA9IHNlbGYuX3Jlc2VydmVkCisgICAgICAgIGl0ZW1zID0gc2VsZi5pdGVtcygpCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICBmb3IgSyxWIGluIGl0ZW1zOgorICAgICAgICAgICAgaWYgViA9PSAiIjogY29udGludWUKKyAgICAgICAgICAgIGlmIEsgbm90IGluIGF0dHJzOiBjb250aW51ZQorICAgICAgICAgICAgaWYgSyA9PSAiZXhwaXJlcyIgYW5kIHR5cGUoVikgPT0gdHlwZSgxKToKKyAgICAgICAgICAgICAgICBSQSgiJXM9JXMiICUgKHNlbGYuX3Jlc2VydmVkW0tdLCBfZ2V0ZGF0ZShWKSkpCisgICAgICAgICAgICBlbGlmIEsgPT0gIm1heC1hZ2UiIGFuZCB0eXBlKFYpID09IHR5cGUoMSk6CisgICAgICAgICAgICAgICAgUkEoIiVzPSVkIiAlIChzZWxmLl9yZXNlcnZlZFtLXSwgVikpCisgICAgICAgICAgICBlbGlmIEsgPT0gInNlY3VyZSI6CisgICAgICAgICAgICAgICAgUkEoc3RyKHNlbGYuX3Jlc2VydmVkW0tdKSkKKyAgICAgICAgICAgIGVsaWYgSyA9PSAiaHR0cG9ubHkiOgorICAgICAgICAgICAgICAgIFJBKHN0cihzZWxmLl9yZXNlcnZlZFtLXSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFJBKCIlcz0lcyIgJSAoc2VsZi5fcmVzZXJ2ZWRbS10sIFYpKQorCisgICAgICAgICMgUmV0dXJuIHRoZSByZXN1bHQKKyAgICAgICAgcmV0dXJuIF9zZW1pc3BhY2Vqb2luKHJlc3VsdCkKKyAgICAjIGVuZCBPdXRwdXRTdHJpbmcKKyMgZW5kIE1vcnNlbCBjbGFzcworCisKKworIworIyBQYXR0ZXJuIGZvciBmaW5kaW5nIGNvb2tpZQorIworIyBUaGlzIHVzZWQgdG8gYmUgc3RyaWN0IHBhcnNpbmcgYmFzZWQgb24gdGhlIFJGQzIxMDkgYW5kIFJGQzIwNjgKKyMgc3BlY2lmaWNhdGlvbnMuICBJIGhhdmUgc2luY2UgZGlzY292ZXJlZCB0aGF0IE1TSUUgMy4weCBkb2Vzbid0CisjIGZvbGxvdyB0aGUgY2hhcmFjdGVyIHJ1bGVzIG91dGxpbmVkIGluIHRob3NlIHNwZWNzLiAgQXMgYQorIyByZXN1bHQsIHRoZSBwYXJzaW5nIHJ1bGVzIGhlcmUgYXJlIGxlc3Mgc3RyaWN0LgorIworCitfTGVnYWxDaGFyc1BhdHQgID0gciJbXHdcZCEjJSYnfl9gPjxALDovXCRcKlwrXC1cLlxeXHxcKVwoXD9cfVx7XD1dIgorX0Nvb2tpZVBhdHRlcm4gPSByZS5jb21waWxlKAorICAgIHIiKD94KSIgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhIFZlcmJvc2UgcGF0dGVybgorICAgIHIiKD9QPGtleT4iICAgICAgICAgICAgICAgICAgICMgU3RhcnQgb2YgZ3JvdXAgJ2tleScKKyAgICAiIisgX0xlZ2FsQ2hhcnNQYXR0ICsiKz8iICAgICAjIEFueSB3b3JkIG9mIGF0IGxlYXN0IG9uZSBsZXR0ZXIsIG5vbmdyZWVkeQorICAgIHIiKSIgICAgICAgICAgICAgICAgICAgICAgICAgICMgRW5kIG9mIGdyb3VwICdrZXknCisgICAgciJccyo9XHMqIiAgICAgICAgICAgICAgICAgICAgIyBFcXVhbCBTaWduCisgICAgciIoP1A8dmFsPiIgICAgICAgICAgICAgICAgICAgIyBTdGFydCBvZiBncm91cCAndmFsJworICAgIHInIig/OlteXFwiXXxcXC4pKiInICAgICAgICAgICAgIyBBbnkgZG91YmxlcXVvdGVkIHN0cmluZworICAgIHIifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgorICAgIHIiXHd7M30sXHNbXHNcd1xkLV17OSwxMX1cc1tcZDpdezh9XHNHTVQiICMgU3BlY2lhbCBjYXNlIGZvciAiZXhwaXJlcyIgYXR0cgorICAgIHIifCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgorICAgICIiKyBfTGVnYWxDaGFyc1BhdHQgKyIqIiAgICAgICAgIyBBbnkgd29yZCBvciBlbXB0eSBzdHJpbmcKKyAgICByIikiICAgICAgICAgICAgICAgICAgICAgICAgICAjIEVuZCBvZiBncm91cCAndmFsJworICAgIHIiXHMqOz8iICAgICAgICAgICAgICAgICAgICAgICMgUHJvYmFibHkgZW5kaW5nIGluIGEgc2VtaS1jb2xvbgorICAgICkKKworCisjIEF0IGxvbmcgbGFzdCwgaGVyZSBpcyB0aGUgY29va2llIGNsYXNzLgorIyAgIFVzaW5nIHRoaXMgY2xhc3MgaXMgYWxtb3N0IGp1c3QgbGlrZSB1c2luZyBhIGRpY3Rpb25hcnkuCisjIFNlZSB0aGlzIG1vZHVsZSdzIGRvY3N0cmluZyBmb3IgZXhhbXBsZSB1c2FnZS4KKyMKK2NsYXNzIEJhc2VDb29raWUoZGljdCk6CisgICAgIyBBIGNvbnRhaW5lciBjbGFzcyBmb3IgYSBzZXQgb2YgTW9yc2VscworICAgICMKKworICAgIGRlZiB2YWx1ZV9kZWNvZGUoc2VsZiwgdmFsKToKKyAgICAgICAgIiIicmVhbF92YWx1ZSwgY29kZWRfdmFsdWUgPSB2YWx1ZV9kZWNvZGUoU1RSSU5HKQorICAgICAgICBDYWxsZWQgcHJpb3IgdG8gc2V0dGluZyBhIGNvb2tpZSdzIHZhbHVlIGZyb20gdGhlIG5ldHdvcmsKKyAgICAgICAgcmVwcmVzZW50YXRpb24uICBUaGUgVkFMVUUgaXMgdGhlIHZhbHVlIHJlYWQgZnJvbSBIVFRQCisgICAgICAgIGhlYWRlci4KKyAgICAgICAgT3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIGNvb2tpZXMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdmFsLCB2YWwKKyAgICAjIGVuZCB2YWx1ZV9lbmNvZGUKKworICAgIGRlZiB2YWx1ZV9lbmNvZGUoc2VsZiwgdmFsKToKKyAgICAgICAgIiIicmVhbF92YWx1ZSwgY29kZWRfdmFsdWUgPSB2YWx1ZV9lbmNvZGUoVkFMVUUpCisgICAgICAgIENhbGxlZCBwcmlvciB0byBzZXR0aW5nIGEgY29va2llJ3MgdmFsdWUgZnJvbSB0aGUgZGljdGlvbmFyeQorICAgICAgICByZXByZXNlbnRhdGlvbi4gIFRoZSBWQUxVRSBpcyB0aGUgdmFsdWUgYmVpbmcgYXNzaWduZWQuCisgICAgICAgIE92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiBjb29raWVzLgorICAgICAgICAiIiIKKyAgICAgICAgc3RydmFsID0gc3RyKHZhbCkKKyAgICAgICAgcmV0dXJuIHN0cnZhbCwgc3RydmFsCisgICAgIyBlbmQgdmFsdWVfZW5jb2RlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5wdXQ9Tm9uZSk6CisgICAgICAgIGlmIGlucHV0OiBzZWxmLmxvYWQoaW5wdXQpCisgICAgIyBlbmQgX19pbml0X18KKworICAgIGRlZiBfX3NldChzZWxmLCBrZXksIHJlYWxfdmFsdWUsIGNvZGVkX3ZhbHVlKToKKyAgICAgICAgIiIiUHJpdmF0ZSBtZXRob2QgZm9yIHNldHRpbmcgYSBjb29raWUncyB2YWx1ZSIiIgorICAgICAgICBNID0gc2VsZi5nZXQoa2V5LCBNb3JzZWwoKSkKKyAgICAgICAgTS5zZXQoa2V5LCByZWFsX3ZhbHVlLCBjb2RlZF92YWx1ZSkKKyAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIE0pCisgICAgIyBlbmQgX19zZXQKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgIiIiRGljdGlvbmFyeSBzdHlsZSBhc3NpZ25tZW50LiIiIgorICAgICAgICBydmFsLCBjdmFsID0gc2VsZi52YWx1ZV9lbmNvZGUodmFsdWUpCisgICAgICAgIHNlbGYuX19zZXQoa2V5LCBydmFsLCBjdmFsKQorICAgICMgZW5kIF9fc2V0aXRlbV9fCisKKyAgICBkZWYgb3V0cHV0KHNlbGYsIGF0dHJzPU5vbmUsIGhlYWRlcj0iU2V0LUNvb2tpZToiLCBzZXA9IlwwMTVcMDEyIik6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyBzdWl0YWJsZSBmb3IgSFRUUC4iIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgaXRlbXMgPSBzZWxmLml0ZW1zKCkKKyAgICAgICAgaXRlbXMuc29ydCgpCisgICAgICAgIGZvciBLLFYgaW4gaXRlbXM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCBWLm91dHB1dChhdHRycywgaGVhZGVyKSApCisgICAgICAgIHJldHVybiBzZXAuam9pbihyZXN1bHQpCisgICAgIyBlbmQgb3V0cHV0CisKKyAgICBfX3N0cl9fID0gb3V0cHV0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIEwgPSBbXQorICAgICAgICBpdGVtcyA9IHNlbGYuaXRlbXMoKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgZm9yIEssViBpbiBpdGVtczoKKyAgICAgICAgICAgIEwuYXBwZW5kKCAnJXM9JXMnICUgKEsscmVwcihWLnZhbHVlKSApICkKKyAgICAgICAgcmV0dXJuICc8JXM6ICVzPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIF9zcGFjZWpvaW4oTCkpCisKKyAgICBkZWYganNfb3V0cHV0KHNlbGYsIGF0dHJzPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgc3VpdGFibGUgZm9yIEphdmFTY3JpcHQuIiIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGl0ZW1zID0gc2VsZi5pdGVtcygpCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICBmb3IgSyxWIGluIGl0ZW1zOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCggVi5qc19vdXRwdXQoYXR0cnMpICkKKyAgICAgICAgcmV0dXJuIF9udWxsam9pbihyZXN1bHQpCisgICAgIyBlbmQganNfb3V0cHV0CisKKyAgICBkZWYgbG9hZChzZWxmLCByYXdkYXRhKToKKyAgICAgICAgIiIiTG9hZCBjb29raWVzIGZyb20gYSBzdHJpbmcgKHByZXN1bWFibHkgSFRUUF9DT09LSUUpIG9yCisgICAgICAgIGZyb20gYSBkaWN0aW9uYXJ5LiAgTG9hZGluZyBjb29raWVzIGZyb20gYSBkaWN0aW9uYXJ5ICdkJworICAgICAgICBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmc6CisgICAgICAgICAgICBtYXAoQ29va2llLl9fc2V0aXRlbV9fLCBkLmtleXMoKSwgZC52YWx1ZXMoKSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHR5cGUocmF3ZGF0YSkgPT0gdHlwZSgiIik6CisgICAgICAgICAgICBzZWxmLl9fUGFyc2VTdHJpbmcocmF3ZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgc2VsZi51cGRhdGUoKSB3b3VsZG4ndCBjYWxsIG91ciBjdXN0b20gX19zZXRpdGVtX18KKyAgICAgICAgICAgIGZvciBrLCB2IGluIHJhd2RhdGEuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZWxmW2tdID0gdgorICAgICAgICByZXR1cm4KKyAgICAjIGVuZCBsb2FkKCkKKworICAgIGRlZiBfX1BhcnNlU3RyaW5nKHNlbGYsIHN0ciwgcGF0dD1fQ29va2llUGF0dGVybik6CisgICAgICAgIGkgPSAwICAgICAgICAgICAgIyBPdXIgc3RhcnRpbmcgcG9pbnQKKyAgICAgICAgbiA9IGxlbihzdHIpICAgICAjIExlbmd0aCBvZiBzdHJpbmcKKyAgICAgICAgTSA9IE5vbmUgICAgICAgICAjIGN1cnJlbnQgbW9yc2VsCisKKyAgICAgICAgd2hpbGUgMCA8PSBpIDwgbjoKKyAgICAgICAgICAgICMgU3RhcnQgbG9va2luZyBmb3IgYSBjb29raWUKKyAgICAgICAgICAgIG1hdGNoID0gcGF0dC5zZWFyY2goc3RyLCBpKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOiBicmVhayAgICAgICAgICAjIE5vIG1vcmUgY29va2llcworCisgICAgICAgICAgICBLLFYgPSBtYXRjaC5ncm91cCgia2V5IiksIG1hdGNoLmdyb3VwKCJ2YWwiKQorICAgICAgICAgICAgaSA9IG1hdGNoLmVuZCgwKQorCisgICAgICAgICAgICAjIFBhcnNlIHRoZSBrZXksIHZhbHVlIGluIGNhc2UgaXQncyBtZXRhaW5mbworICAgICAgICAgICAgaWYgS1swXSA9PSAiJCI6CisgICAgICAgICAgICAgICAgIyBXZSBpZ25vcmUgYXR0cmlidXRlcyB3aGljaCBwZXJ0YWluIHRvIHRoZSBjb29raWUKKyAgICAgICAgICAgICAgICAjIG1lY2hhbmlzbSBhcyBhIHdob2xlLiAgU2VlIFJGQyAyMTA5LgorICAgICAgICAgICAgICAgICMgKERvZXMgYW55b25lIGNhcmU/KQorICAgICAgICAgICAgICAgIGlmIE06CisgICAgICAgICAgICAgICAgICAgIE1bIEtbMTpdIF0gPSBWCisgICAgICAgICAgICBlbGlmIEsubG93ZXIoKSBpbiBNb3JzZWwuX3Jlc2VydmVkOgorICAgICAgICAgICAgICAgIGlmIE06CisgICAgICAgICAgICAgICAgICAgIE1bIEsgXSA9IF91bnF1b3RlKFYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJ2YWwsIGN2YWwgPSBzZWxmLnZhbHVlX2RlY29kZShWKQorICAgICAgICAgICAgICAgIHNlbGYuX19zZXQoSywgcnZhbCwgY3ZhbCkKKyAgICAgICAgICAgICAgICBNID0gc2VsZltLXQorICAgICMgZW5kIF9fUGFyc2VTdHJpbmcKKyMgZW5kIEJhc2VDb29raWUgY2xhc3MKKworY2xhc3MgU2ltcGxlQ29va2llKEJhc2VDb29raWUpOgorICAgICIiIlNpbXBsZUNvb2tpZQorICAgIFNpbXBsZUNvb2tpZSBzdXBwb3J0cyBzdHJpbmdzIGFzIGNvb2tpZSB2YWx1ZXMuICBXaGVuIHNldHRpbmcKKyAgICB0aGUgdmFsdWUgdXNpbmcgdGhlIGRpY3Rpb25hcnkgYXNzaWdubWVudCBub3RhdGlvbiwgU2ltcGxlQ29va2llCisgICAgY2FsbHMgdGhlIGJ1aWx0aW4gc3RyKCkgdG8gY29udmVydCB0aGUgdmFsdWUgdG8gYSBzdHJpbmcuICBWYWx1ZXMKKyAgICByZWNlaXZlZCBmcm9tIEhUVFAgYXJlIGtlcHQgYXMgc3RyaW5ncy4KKyAgICAiIiIKKyAgICBkZWYgdmFsdWVfZGVjb2RlKHNlbGYsIHZhbCk6CisgICAgICAgIHJldHVybiBfdW5xdW90ZSggdmFsICksIHZhbAorICAgIGRlZiB2YWx1ZV9lbmNvZGUoc2VsZiwgdmFsKToKKyAgICAgICAgc3RydmFsID0gc3RyKHZhbCkKKyAgICAgICAgcmV0dXJuIHN0cnZhbCwgX3F1b3RlKCBzdHJ2YWwgKQorIyBlbmQgU2ltcGxlQ29va2llCisKK2NsYXNzIFNlcmlhbENvb2tpZShCYXNlQ29va2llKToKKyAgICAiIiJTZXJpYWxDb29raWUKKyAgICBTZXJpYWxDb29raWUgc3VwcG9ydHMgYXJiaXRyYXJ5IG9iamVjdHMgYXMgY29va2llIHZhbHVlcy4gQWxsCisgICAgdmFsdWVzIGFyZSBzZXJpYWxpemVkICh1c2luZyBjUGlja2xlKSBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUKKyAgICBjbGllbnQuICBBbGwgaW5jb21pbmcgdmFsdWVzIGFyZSBhc3N1bWVkIHRvIGJlIHZhbGlkIFBpY2tsZQorICAgIHJlcHJlc2VudGF0aW9ucy4gIElGIEFOIElOQ09NSU5HIFZBTFVFIElTIE5PVCBJTiBBIFZBTElEIFBJQ0tMRQorICAgIEZPUk1BVCwgVEhFTiBBTiBFWENFUFRJT04gV0lMTCBCRSBSQUlTRUQuCisKKyAgICBOb3RlOiBMYXJnZSBjb29raWUgdmFsdWVzIGFkZCBvdmVyaGVhZCBiZWNhdXNlIHRoZXkgbXVzdCBiZQorICAgIHJldHJhbnNtaXR0ZWQgb24gZXZlcnkgSFRUUCB0cmFuc2FjdGlvbi4KKworICAgIE5vdGU6IEhUVFAgaGFzIGEgMmsgbGltaXQgb24gdGhlIHNpemUgb2YgYSBjb29raWUuICBUaGlzIGNsYXNzCisgICAgZG9lcyBub3QgY2hlY2sgZm9yIHRoaXMgbGltaXQsIHNvIGJlIGNhcmVmdWwhISEKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5wdXQ9Tm9uZSk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oIlNlcmlhbENvb2tpZSBjbGFzcyBpcyBpbnNlY3VyZTsgZG8gbm90IHVzZSBpdCIsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICBCYXNlQ29va2llLl9faW5pdF9fKHNlbGYsIGlucHV0KQorICAgICMgZW5kIF9faW5pdF9fCisgICAgZGVmIHZhbHVlX2RlY29kZShzZWxmLCB2YWwpOgorICAgICAgICAjIFRoaXMgY291bGQgcmFpc2UgYW4gZXhjZXB0aW9uIQorICAgICAgICByZXR1cm4gbG9hZHMoIF91bnF1b3RlKHZhbCkgKSwgdmFsCisgICAgZGVmIHZhbHVlX2VuY29kZShzZWxmLCB2YWwpOgorICAgICAgICByZXR1cm4gdmFsLCBfcXVvdGUoIGR1bXBzKHZhbCkgKQorIyBlbmQgU2VyaWFsQ29va2llCisKK2NsYXNzIFNtYXJ0Q29va2llKEJhc2VDb29raWUpOgorICAgICIiIlNtYXJ0Q29va2llCisgICAgU21hcnRDb29raWUgc3VwcG9ydHMgYXJiaXRyYXJ5IG9iamVjdHMgYXMgY29va2llIHZhbHVlcy4gIElmIHRoZQorICAgIG9iamVjdCBpcyBhIHN0cmluZywgdGhlbiBpdCBpcyBxdW90ZWQuICBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhCisgICAgc3RyaW5nLCBob3dldmVyLCB0aGVuIFNtYXJ0Q29va2llIHdpbGwgdXNlIGNQaWNrbGUgdG8gc2VyaWFsaXplCisgICAgdGhlIG9iamVjdCBpbnRvIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCisgICAgTm90ZTogTGFyZ2UgY29va2llIHZhbHVlcyBhZGQgb3ZlcmhlYWQgYmVjYXVzZSB0aGV5IG11c3QgYmUKKyAgICByZXRyYW5zbWl0dGVkIG9uIGV2ZXJ5IEhUVFAgdHJhbnNhY3Rpb24uCisKKyAgICBOb3RlOiBIVFRQIGhhcyBhIDJrIGxpbWl0IG9uIHRoZSBzaXplIG9mIGEgY29va2llLiAgVGhpcyBjbGFzcworICAgIGRvZXMgbm90IGNoZWNrIGZvciB0aGlzIGxpbWl0LCBzbyBiZSBjYXJlZnVsISEhCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0PU5vbmUpOgorICAgICAgICB3YXJuaW5ncy53YXJuKCJDb29raWUvU21hcnRDb29raWUgY2xhc3MgaXMgaW5zZWN1cmU7IGRvIG5vdCB1c2UgaXQiLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgQmFzZUNvb2tpZS5fX2luaXRfXyhzZWxmLCBpbnB1dCkKKyAgICAjIGVuZCBfX2luaXRfXworICAgIGRlZiB2YWx1ZV9kZWNvZGUoc2VsZiwgdmFsKToKKyAgICAgICAgc3RydmFsID0gX3VucXVvdGUodmFsKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gbG9hZHMoc3RydmFsKSwgdmFsCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiBzdHJ2YWwsIHZhbAorICAgIGRlZiB2YWx1ZV9lbmNvZGUoc2VsZiwgdmFsKToKKyAgICAgICAgaWYgdHlwZSh2YWwpID09IHR5cGUoIiIpOgorICAgICAgICAgICAgcmV0dXJuIHZhbCwgX3F1b3RlKHZhbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB2YWwsIF9xdW90ZSggZHVtcHModmFsKSApCisjIGVuZCBTbWFydENvb2tpZQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJhY2t3YXJkcyBDb21wYXRpYmlsaXR5OiAgRG9uJ3QgYnJlYWsgYW55IGV4aXN0aW5nIGNvZGUhCisKKyMgV2UgcHJvdmlkZSBDb29raWUoKSBhcyBhbiBhbGlhcyBmb3IgU21hcnRDb29raWUoKQorQ29va2llID0gU21hcnRDb29raWUKKworIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIF90ZXN0KCk6CisgICAgaW1wb3J0IGRvY3Rlc3QsIENvb2tpZQorICAgIHJldHVybiBkb2N0ZXN0LnRlc3Rtb2QoQ29va2llKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIF90ZXN0KCkKKworCisjTG9jYWwgVmFyaWFibGVzOgorI3RhYi13aWR0aDogNAorI2VuZDoKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ29va2llLnB5YyBiL2xpYi9weXRob24yLjcvQ29va2llLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YyMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Db29raWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvQ29va2llLnB5byBiL2xpYi9weXRob24yLjcvQ29va2llLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YyMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Db29raWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvRG9jWE1MUlBDU2VydmVyLnB5IGIvbGliL3B5dGhvbjIuNy9Eb2NYTUxSUENTZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2NGVjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvRG9jWE1MUlBDU2VydmVyLnB5CkBAIC0wLDAgKzEsMjc5IEBACisiIiJTZWxmIGRvY3VtZW50aW5nIFhNTC1SUEMgU2VydmVyLgorCitUaGlzIG1vZHVsZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgWE1MLVJQQyBzZXJ2ZXJzIHRoYXQKK3NlcnZlIHB5ZG9jLXN0eWxlIGRvY3VtZW50YXRpb24gaW4gcmVzcG9uc2UgdG8gSFRUUAorR0VUIHJlcXVlc3RzLiBUaGlzIGRvY3VtZW50YXRpb24gaXMgZHluYW1pY2FsbHkgZ2VuZXJhdGVkCitiYXNlZCBvbiB0aGUgZnVuY3Rpb25zIGFuZCBtZXRob2RzIHJlZ2lzdGVyZWQgd2l0aCB0aGUKK3NlcnZlci4KKworVGhpcyBtb2R1bGUgaXMgYnVpbHQgdXBvbiB0aGUgcHlkb2MgYW5kIFNpbXBsZVhNTFJQQ1NlcnZlcgorbW9kdWxlcy4KKyIiIgorCitpbXBvcnQgcHlkb2MKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZnJvbSBTaW1wbGVYTUxSUENTZXJ2ZXIgaW1wb3J0IChTaW1wbGVYTUxSUENTZXJ2ZXIsCisgICAgICAgICAgICBTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgIENHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgcmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlKQorCitjbGFzcyBTZXJ2ZXJIVE1MRG9jKHB5ZG9jLkhUTUxEb2MpOgorICAgICIiIkNsYXNzIHVzZWQgdG8gZ2VuZXJhdGUgcHlkb2MgSFRNTCBkb2N1bWVudCBmb3IgYSBzZXJ2ZXIiIiIKKworICAgIGRlZiBtYXJrdXAoc2VsZiwgdGV4dCwgZXNjYXBlPU5vbmUsIGZ1bmNzPXt9LCBjbGFzc2VzPXt9LCBtZXRob2RzPXt9KToKKyAgICAgICAgIiIiTWFyayB1cCBzb21lIHBsYWluIHRleHQsIGdpdmVuIGEgY29udGV4dCBvZiBzeW1ib2xzIHRvIGxvb2sgZm9yLgorICAgICAgICBFYWNoIGNvbnRleHQgZGljdGlvbmFyeSBtYXBzIG9iamVjdCBuYW1lcyB0byBhbmNob3IgbmFtZXMuIiIiCisgICAgICAgIGVzY2FwZSA9IGVzY2FwZSBvciBzZWxmLmVzY2FwZQorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgaGVyZSA9IDAKKworICAgICAgICAjIFhYWCBOb3RlIHRoYXQgdGhpcyByZWd1bGFyIGV4cHJlc3Npb24gZG9lcyBub3QgYWxsb3cgZm9yIHRoZQorICAgICAgICAjIGh5cGVybGlua2luZyBvZiBhcmJpdHJhcnkgc3RyaW5ncyBiZWluZyB1c2VkIGFzIG1ldGhvZAorICAgICAgICAjIG5hbWVzLiBPbmx5IG1ldGhvZHMgd2l0aCBuYW1lcyBjb25zaXN0aW5nIG9mIHdvcmQgY2hhcmFjdGVycworICAgICAgICAjIGFuZCAnLidzIGFyZSBoeXBlcmxpbmtlZC4KKyAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUocidcYigoaHR0cHxmdHApOi8vXFMrW1x3L118JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1JGQ1stIF0/KFxkKyl8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1BFUFstIF0/KFxkKyl8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyhzZWxmXC4pPygoPzpcd3xcLikrKSlcYicpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm4uc2VhcmNoKHRleHQsIGhlcmUpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6IGJyZWFrCisgICAgICAgICAgICBzdGFydCwgZW5kID0gbWF0Y2guc3BhbigpCisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChlc2NhcGUodGV4dFtoZXJlOnN0YXJ0XSkpCisKKyAgICAgICAgICAgIGFsbCwgc2NoZW1lLCByZmMsIHBlcCwgc2VsZmRvdCwgbmFtZSA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgICAgICBpZiBzY2hlbWU6CisgICAgICAgICAgICAgICAgdXJsID0gZXNjYXBlKGFsbCkucmVwbGFjZSgnIicsICcmcXVvdDsnKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCc8YSBocmVmPSIlcyI+JXM8L2E+JyAlICh1cmwsIHVybCkpCisgICAgICAgICAgICBlbGlmIHJmYzoKKyAgICAgICAgICAgICAgICB1cmwgPSAnaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjJWQudHh0JyAlIGludChyZmMpCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJzxhIGhyZWY9IiVzIj4lczwvYT4nICUgKHVybCwgZXNjYXBlKGFsbCkpKQorICAgICAgICAgICAgZWxpZiBwZXA6CisgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtJTA0ZC8nICUgaW50KHBlcCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAodXJsLCBlc2NhcGUoYWxsKSkpCisgICAgICAgICAgICBlbGlmIHRleHRbZW5kOmVuZCsxXSA9PSAnKCc6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VsZi5uYW1lbGluayhuYW1lLCBtZXRob2RzLCBmdW5jcywgY2xhc3NlcykpCisgICAgICAgICAgICBlbGlmIHNlbGZkb3Q6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3NlbGYuPHN0cm9uZz4lczwvc3Ryb25nPicgJSBuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChzZWxmLm5hbWVsaW5rKG5hbWUsIGNsYXNzZXMpKQorICAgICAgICAgICAgaGVyZSA9IGVuZAorICAgICAgICByZXN1bHRzLmFwcGVuZChlc2NhcGUodGV4dFtoZXJlOl0pKQorICAgICAgICByZXR1cm4gJycuam9pbihyZXN1bHRzKQorCisgICAgZGVmIGRvY3JvdXRpbmUoc2VsZiwgb2JqZWN0LCBuYW1lLCBtb2Q9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICBmdW5jcz17fSwgY2xhc3Nlcz17fSwgbWV0aG9kcz17fSwgY2w9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBvYmplY3QuIiIiCisKKyAgICAgICAgYW5jaG9yID0gKGNsIGFuZCBjbC5fX25hbWVfXyBvciAnJykgKyAnLScgKyBuYW1lCisgICAgICAgIG5vdGUgPSAnJworCisgICAgICAgIHRpdGxlID0gJzxhIG5hbWU9IiVzIj48c3Ryb25nPiVzPC9zdHJvbmc+PC9hPicgJSAoCisgICAgICAgICAgICBzZWxmLmVzY2FwZShhbmNob3IpLCBzZWxmLmVzY2FwZShuYW1lKSkKKworICAgICAgICBpZiBpbnNwZWN0LmlzbWV0aG9kKG9iamVjdCk6CisgICAgICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMgPSBpbnNwZWN0LmdldGFyZ3NwZWMob2JqZWN0LmltX2Z1bmMpCisgICAgICAgICAgICAjIGV4Y2x1ZGUgdGhlIGFyZ3VtZW50IGJvdW5kIHRvIHRoZSBpbnN0YW5jZSwgaXQgd2lsbCBiZQorICAgICAgICAgICAgIyBjb25mdXNpbmcgdG8gdGhlIG5vbi1QeXRob24gdXNlcgorICAgICAgICAgICAgYXJnc3BlYyA9IGluc3BlY3QuZm9ybWF0YXJnc3BlYyAoCisgICAgICAgICAgICAgICAgICAgIGFyZ3NbMTpdLAorICAgICAgICAgICAgICAgICAgICB2YXJhcmdzLAorICAgICAgICAgICAgICAgICAgICB2YXJrdywKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHMsCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZhbHVlPXNlbGYuZm9ybWF0dmFsdWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGVsaWYgaW5zcGVjdC5pc2Z1bmN0aW9uKG9iamVjdCk6CisgICAgICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMgPSBpbnNwZWN0LmdldGFyZ3NwZWMob2JqZWN0KQorICAgICAgICAgICAgYXJnc3BlYyA9IGluc3BlY3QuZm9ybWF0YXJnc3BlYygKKyAgICAgICAgICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsIGZvcm1hdHZhbHVlPXNlbGYuZm9ybWF0dmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzcGVjID0gJyguLi4pJworCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqZWN0LCB0dXBsZSk6CisgICAgICAgICAgICBhcmdzcGVjID0gb2JqZWN0WzBdIG9yIGFyZ3NwZWMKKyAgICAgICAgICAgIGRvY3N0cmluZyA9IG9iamVjdFsxXSBvciAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG9jc3RyaW5nID0gcHlkb2MuZ2V0ZG9jKG9iamVjdCkKKworICAgICAgICBkZWNsID0gdGl0bGUgKyBhcmdzcGVjICsgKG5vdGUgYW5kIHNlbGYuZ3JleSgKKyAgICAgICAgICAgICAgICc8Zm9udCBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj4lczwvZm9udD4nICUgbm90ZSkpCisKKyAgICAgICAgZG9jID0gc2VsZi5tYXJrdXAoCisgICAgICAgICAgICBkb2NzdHJpbmcsIHNlbGYucHJlZm9ybWF0LCBmdW5jcywgY2xhc3NlcywgbWV0aG9kcykKKyAgICAgICAgZG9jID0gZG9jIGFuZCAnPGRkPjx0dD4lczwvdHQ+PC9kZD4nICUgZG9jCisgICAgICAgIHJldHVybiAnPGRsPjxkdD4lczwvZHQ+JXM8L2RsPlxuJyAlIChkZWNsLCBkb2MpCisKKyAgICBkZWYgZG9jc2VydmVyKHNlbGYsIHNlcnZlcl9uYW1lLCBwYWNrYWdlX2RvY3VtZW50YXRpb24sIG1ldGhvZHMpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYW4gWE1MLVJQQyBzZXJ2ZXIuIiIiCisKKyAgICAgICAgZmRpY3QgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtZXRob2RzLml0ZW1zKCk6CisgICAgICAgICAgICBmZGljdFtrZXldID0gJyMtJyArIGtleQorICAgICAgICAgICAgZmRpY3RbdmFsdWVdID0gZmRpY3Rba2V5XQorCisgICAgICAgIHNlcnZlcl9uYW1lID0gc2VsZi5lc2NhcGUoc2VydmVyX25hbWUpCisgICAgICAgIGhlYWQgPSAnPGJpZz48YmlnPjxzdHJvbmc+JXM8L3N0cm9uZz48L2JpZz48L2JpZz4nICUgc2VydmVyX25hbWUKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5oZWFkaW5nKGhlYWQsICcjZmZmZmZmJywgJyM3Nzk5ZWUnKQorCisgICAgICAgIGRvYyA9IHNlbGYubWFya3VwKHBhY2thZ2VfZG9jdW1lbnRhdGlvbiwgc2VsZi5wcmVmb3JtYXQsIGZkaWN0KQorICAgICAgICBkb2MgPSBkb2MgYW5kICc8dHQ+JXM8L3R0PicgJSBkb2MKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJzxwPiVzPC9wPlxuJyAlIGRvYworCisgICAgICAgIGNvbnRlbnRzID0gW10KKyAgICAgICAgbWV0aG9kX2l0ZW1zID0gc29ydGVkKG1ldGhvZHMuaXRlbXMoKSkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbWV0aG9kX2l0ZW1zOgorICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKHNlbGYuZG9jcm91dGluZSh2YWx1ZSwga2V5LCBmdW5jcz1mZGljdCkpCisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICdNZXRob2RzJywgJyNmZmZmZmYnLCAnI2VlYWE3NycsIHB5ZG9jLmpvaW4oY29udGVudHMpKQorCisgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgWE1MUlBDRG9jR2VuZXJhdG9yOgorICAgICIiIkdlbmVyYXRlcyBkb2N1bWVudGF0aW9uIGZvciBhbiBYTUwtUlBDIHNlcnZlci4KKworICAgIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgYXMgbWl4LWluIGFuZCBzaG91bGQgbm90CisgICAgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgc2V0dXAgdmFyaWFibGVzIHVzZWQgZm9yIEhUTUwgZG9jdW1lbnRhdGlvbgorICAgICAgICBzZWxmLnNlcnZlcl9uYW1lID0gJ1hNTC1SUEMgU2VydmVyIERvY3VtZW50YXRpb24nCisgICAgICAgIHNlbGYuc2VydmVyX2RvY3VtZW50YXRpb24gPSBcCisgICAgICAgICAgICAiVGhpcyBzZXJ2ZXIgZXhwb3J0cyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgdGhyb3VnaCB0aGUgWE1MLVJQQyAiXAorICAgICAgICAgICAgInByb3RvY29sLiIKKyAgICAgICAgc2VsZi5zZXJ2ZXJfdGl0bGUgPSAnWE1MLVJQQyBTZXJ2ZXIgRG9jdW1lbnRhdGlvbicKKworICAgIGRlZiBzZXRfc2VydmVyX3RpdGxlKHNlbGYsIHNlcnZlcl90aXRsZSk6CisgICAgICAgICIiIlNldCB0aGUgSFRNTCB0aXRsZSBvZiB0aGUgZ2VuZXJhdGVkIHNlcnZlciBkb2N1bWVudGF0aW9uIiIiCisKKyAgICAgICAgc2VsZi5zZXJ2ZXJfdGl0bGUgPSBzZXJ2ZXJfdGl0bGUKKworICAgIGRlZiBzZXRfc2VydmVyX25hbWUoc2VsZiwgc2VydmVyX25hbWUpOgorICAgICAgICAiIiJTZXQgdGhlIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIHNlcnZlciBkb2N1bWVudGF0aW9uIiIiCisKKyAgICAgICAgc2VsZi5zZXJ2ZXJfbmFtZSA9IHNlcnZlcl9uYW1lCisKKyAgICBkZWYgc2V0X3NlcnZlcl9kb2N1bWVudGF0aW9uKHNlbGYsIHNlcnZlcl9kb2N1bWVudGF0aW9uKToKKyAgICAgICAgIiIiU2V0IHRoZSBkb2N1bWVudGF0aW9uIHN0cmluZyBmb3IgdGhlIGVudGlyZSBzZXJ2ZXIuIiIiCisKKyAgICAgICAgc2VsZi5zZXJ2ZXJfZG9jdW1lbnRhdGlvbiA9IHNlcnZlcl9kb2N1bWVudGF0aW9uCisKKyAgICBkZWYgZ2VuZXJhdGVfaHRtbF9kb2N1bWVudGF0aW9uKHNlbGYpOgorICAgICAgICAiIiJnZW5lcmF0ZV9odG1sX2RvY3VtZW50YXRpb24oKSA9PiBodG1sIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzZXJ2ZXIKKworICAgICAgICBHZW5lcmF0ZXMgSFRNTCBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2VydmVyIHVzaW5nIGludHJvc3BlY3Rpb24gZm9yCisgICAgICAgIGluc3RhbGxlZCBmdW5jdGlvbnMgYW5kIGluc3RhbmNlcyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgdGhlCisgICAgICAgIF9kaXNwYXRjaCBtZXRob2QuIEFsdGVybmF0aXZlbHksIGluc3RhbmNlcyBjYW4gY2hvb3NlIHRvIGltcGxlbWVudAorICAgICAgICB0aGUgX2dldF9tZXRob2RfYXJnc3RyaW5nKG1ldGhvZF9uYW1lKSBtZXRob2QgdG8gcHJvdmlkZSB0aGUKKyAgICAgICAgYXJndW1lbnQgc3RyaW5nIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZQorICAgICAgICBfbWV0aG9kSGVscChtZXRob2RfbmFtZSkgbWV0aG9kIHRvIHByb3ZpZGUgdGhlIGhlbHAgdGV4dCB1c2VkCisgICAgICAgIGluIHRoZSBkb2N1bWVudGF0aW9uLiIiIgorCisgICAgICAgIG1ldGhvZHMgPSB7fQorCisgICAgICAgIGZvciBtZXRob2RfbmFtZSBpbiBzZWxmLnN5c3RlbV9saXN0TWV0aG9kcygpOgorICAgICAgICAgICAgaWYgbWV0aG9kX25hbWUgaW4gc2VsZi5mdW5jczoKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBzZWxmLmZ1bmNzW21ldGhvZF9uYW1lXQorICAgICAgICAgICAgZWxpZiBzZWxmLmluc3RhbmNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG1ldGhvZF9pbmZvID0gW05vbmUsIE5vbmVdICMgYXJnc3BlYywgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5pbnN0YW5jZSwgJ19nZXRfbWV0aG9kX2FyZ3N0cmluZycpOgorICAgICAgICAgICAgICAgICAgICBtZXRob2RfaW5mb1swXSA9IHNlbGYuaW5zdGFuY2UuX2dldF9tZXRob2RfYXJnc3RyaW5nKG1ldGhvZF9uYW1lKQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5pbnN0YW5jZSwgJ19tZXRob2RIZWxwJyk6CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9pbmZvWzFdID0gc2VsZi5pbnN0YW5jZS5fbWV0aG9kSGVscChtZXRob2RfbmFtZSkKKworICAgICAgICAgICAgICAgIG1ldGhvZF9pbmZvID0gdHVwbGUobWV0aG9kX2luZm8pCisgICAgICAgICAgICAgICAgaWYgbWV0aG9kX2luZm8gIT0gKE5vbmUsIE5vbmUpOgorICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBtZXRob2RfaW5mbworICAgICAgICAgICAgICAgIGVsaWYgbm90IGhhc2F0dHIoc2VsZi5pbnN0YW5jZSwgJ19kaXNwYXRjaCcpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSByZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gbWV0aG9kX2luZm8KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBtZXRob2RfaW5mbworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgMCwgIkNvdWxkIG5vdCBmaW5kIG1ldGhvZCBpbiBzZWxmLmZ1bmN0aW9ucyBhbmQgbm8gIlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlIGluc3RhbGxlZCIKKworICAgICAgICAgICAgbWV0aG9kc1ttZXRob2RfbmFtZV0gPSBtZXRob2QKKworICAgICAgICBkb2N1bWVudGVyID0gU2VydmVySFRNTERvYygpCisgICAgICAgIGRvY3VtZW50YXRpb24gPSBkb2N1bWVudGVyLmRvY3NlcnZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfZG9jdW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICByZXR1cm4gZG9jdW1lbnRlci5wYWdlKHNlbGYuc2VydmVyX3RpdGxlLCBkb2N1bWVudGF0aW9uKQorCitjbGFzcyBEb2NYTUxSUENSZXF1ZXN0SGFuZGxlcihTaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcik6CisgICAgIiIiWE1MLVJQQyBhbmQgZG9jdW1lbnRhdGlvbiByZXF1ZXN0IGhhbmRsZXIgY2xhc3MuCisKKyAgICBIYW5kbGVzIGFsbCBIVFRQIFBPU1QgcmVxdWVzdHMgYW5kIGF0dGVtcHRzIHRvIGRlY29kZSB0aGVtIGFzCisgICAgWE1MLVJQQyByZXF1ZXN0cy4KKworICAgIEhhbmRsZXMgYWxsIEhUVFAgR0VUIHJlcXVlc3RzIGFuZCBpbnRlcnByZXRzIHRoZW0gYXMgcmVxdWVzdHMKKyAgICBmb3IgZG9jdW1lbnRhdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBkb19HRVQoc2VsZik6CisgICAgICAgICIiIkhhbmRsZXMgdGhlIEhUVFAgR0VUIHJlcXVlc3QuCisKKyAgICAgICAgSW50ZXJwcmV0IGFsbCBIVFRQIEdFVCByZXF1ZXN0cyBhcyByZXF1ZXN0cyBmb3Igc2VydmVyCisgICAgICAgIGRvY3VtZW50YXRpb24uCisgICAgICAgICIiIgorICAgICAgICAjIENoZWNrIHRoYXQgdGhlIHBhdGggaXMgbGVnYWwKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfcnBjX3BhdGhfdmFsaWQoKToKKyAgICAgICAgICAgIHNlbGYucmVwb3J0XzQwNCgpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICByZXNwb25zZSA9IHNlbGYuc2VydmVyLmdlbmVyYXRlX2h0bWxfZG9jdW1lbnRhdGlvbigpCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJ0ZXh0L2h0bWwiKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LWxlbmd0aCIsIHN0cihsZW4ocmVzcG9uc2UpKSkKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIHNlbGYud2ZpbGUud3JpdGUocmVzcG9uc2UpCisKK2NsYXNzIERvY1hNTFJQQ1NlcnZlciggIFNpbXBsZVhNTFJQQ1NlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJQQ0RvY0dlbmVyYXRvcik6CisgICAgIiIiWE1MLVJQQyBhbmQgSFRNTCBkb2N1bWVudGF0aW9uIHNlcnZlci4KKworICAgIEFkZHMgdGhlIGFiaWxpdHkgdG8gc2VydmUgc2VydmVyIGRvY3VtZW50YXRpb24gdG8gdGhlIGNhcGFiaWxpdGllcworICAgIG9mIFNpbXBsZVhNTFJQQ1NlcnZlci4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyLCByZXF1ZXN0SGFuZGxlcj1Eb2NYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9MSwgYWxsb3dfbm9uZT1GYWxzZSwgZW5jb2Rpbmc9Tm9uZSwKKyAgICAgICAgICAgICAgICAgYmluZF9hbmRfYWN0aXZhdGU9VHJ1ZSk6CisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5fX2luaXRfXyhzZWxmLCBhZGRyLCByZXF1ZXN0SGFuZGxlciwgbG9nUmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd19ub25lLCBlbmNvZGluZywgYmluZF9hbmRfYWN0aXZhdGUpCisgICAgICAgIFhNTFJQQ0RvY0dlbmVyYXRvci5fX2luaXRfXyhzZWxmKQorCitjbGFzcyBEb2NDR0lYTUxSUENSZXF1ZXN0SGFuZGxlciggICBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJQQ0RvY0dlbmVyYXRvcik6CisgICAgIiIiSGFuZGxlciBmb3IgWE1MLVJQQyBkYXRhIGFuZCBkb2N1bWVudGF0aW9uIHJlcXVlc3RzIHBhc3NlZCB0aHJvdWdoCisgICAgQ0dJIiIiCisKKyAgICBkZWYgaGFuZGxlX2dldChzZWxmKToKKyAgICAgICAgIiIiSGFuZGxlcyB0aGUgSFRUUCBHRVQgcmVxdWVzdC4KKworICAgICAgICBJbnRlcnByZXQgYWxsIEhUVFAgR0VUIHJlcXVlc3RzIGFzIHJlcXVlc3RzIGZvciBzZXJ2ZXIKKyAgICAgICAgZG9jdW1lbnRhdGlvbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmdlbmVyYXRlX2h0bWxfZG9jdW1lbnRhdGlvbigpCisKKyAgICAgICAgcHJpbnQgJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sJworICAgICAgICBwcmludCAnQ29udGVudC1MZW5ndGg6ICVkJyAlIGxlbihyZXNwb25zZSkKKyAgICAgICAgcHJpbnQKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShyZXNwb25zZSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQ0dJWE1MUlBDUmVxdWVzdEhhbmRsZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgWE1MUlBDRG9jR2VuZXJhdG9yLl9faW5pdF9fKHNlbGYpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weWMgYi9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0NTk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvRG9jWE1MUlBDU2VydmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weW8gYi9saWIvcHl0aG9uMi43L0RvY1hNTFJQQ1NlcnZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlOWY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvRG9jWE1MUlBDU2VydmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L0hUTUxQYXJzZXIucHkgYi9saWIvcHl0aG9uMi43L0hUTUxQYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzNmE0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvSFRNTFBhcnNlci5weQpAQCAtMCwwICsxLDQ3MiBAQAorIiIiQSBwYXJzZXIgZm9yIEhUTUwgYW5kIFhIVE1MLiIiIgorCisjIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiBzZ21sbGliLnB5LCBidXQgdGhlIEFQSSBpcyBzbGlnaHRseSBkaWZmZXJlbnQuCisKKyMgWFhYIFRoZXJlIHNob3VsZCBiZSBhIHdheSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFBDREFUQSAocGFyc2VkCisjIGNoYXJhY3RlciBkYXRhIC0tIHRoZSBub3JtYWwgY2FzZSksIFJDREFUQSAocmVwbGFjZWFibGUgY2hhcmFjdGVyCisjIGRhdGEgLS0gb25seSBjaGFyIGFuZCBlbnRpdHkgcmVmZXJlbmNlcyBhbmQgZW5kIHRhZ3MgYXJlIHNwZWNpYWwpCisjIGFuZCBDREFUQSAoY2hhcmFjdGVyIGRhdGEgLS0gb25seSBlbmQgdGFncyBhcmUgc3BlY2lhbCkuCisKKworaW1wb3J0IG1hcmt1cGJhc2UKK2ltcG9ydCByZQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBmb3IgcGFyc2luZworCitpbnRlcmVzdGluZ19ub3JtYWwgPSByZS5jb21waWxlKCdbJjxdJykKK2luY29tcGxldGUgPSByZS5jb21waWxlKCcmW2EtekEtWiNdJykKKworZW50aXR5cmVmID0gcmUuY29tcGlsZSgnJihbYS16QS1aXVstLmEtekEtWjAtOV0qKVteYS16QS1aMC05XScpCitjaGFycmVmID0gcmUuY29tcGlsZSgnJiMoPzpbMC05XSt8W3hYXVswLTlhLWZBLUZdKylbXjAtOWEtZkEtRl0nKQorCitzdGFydHRhZ29wZW4gPSByZS5jb21waWxlKCc8W2EtekEtWl0nKQorcGljbG9zZSA9IHJlLmNvbXBpbGUoJz4nKQorY29tbWVudGNsb3NlID0gcmUuY29tcGlsZShyJy0tXHMqPicpCit0YWdmaW5kID0gcmUuY29tcGlsZSgnKFthLXpBLVpdWy0uYS16QS1aMC05Ol9dKikoPzpcc3wvKD8hPikpKicpCisjIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNS90b2tlbml6YXRpb24uaHRtbCN0YWctb3Blbi1zdGF0ZQorIyBhbmQgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjdGFnLW5hbWUtc3RhdGUKK3RhZ2ZpbmRfdG9sZXJhbnQgPSByZS5jb21waWxlKCdbYS16QS1aXVteXHRcblxyXGYgLz5ceDAwXSonKQorCithdHRyZmluZCA9IHJlLmNvbXBpbGUoCisgICAgcicoKD88PVtcJyJccy9dKVteXHMvPl1bXlxzLz0+XSopKFxzKj0rXHMqJworICAgIHInKFwnW15cJ10qXCd8IlteIl0qInwoPyFbXCciXSlbXj5cc10qKSk/KD86XHN8Lyg/IT4pKSonKQorCitsb2NhdGVzdGFydHRhZ2VuZCA9IHJlLmNvbXBpbGUociIiIgorICA8W2EtekEtWl1bLS5hLXpBLVowLTk6X10qICAgICAgICAgICMgdGFnIG5hbWUKKyAgKD86W1xzL10qICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHdoaXRlc3BhY2UgYmVmb3JlIGF0dHJpYnV0ZSBuYW1lCisgICAgKD86KD88PVsnIlxzL10pW15ccy8+XVteXHMvPT5dKiAgIyBhdHRyaWJ1dGUgbmFtZQorICAgICAgKD86XHMqPStccyogICAgICAgICAgICAgICAgICAgICMgdmFsdWUgaW5kaWNhdG9yCisgICAgICAgICg/OidbXiddKicgICAgICAgICAgICAgICAgICAgIyBMSVRBLWVuY2xvc2VkIHZhbHVlCisgICAgICAgICAgfCJbXiJdKiIgICAgICAgICAgICAgICAgICAgIyBMSVQtZW5jbG9zZWQgdmFsdWUKKyAgICAgICAgICB8KD8hWyciXSlbXj5cc10qICAgICAgICAgICAjIGJhcmUgdmFsdWUKKyAgICAgICAgICkKKyAgICAgICApPyg/OlxzfC8oPyE+KSkqCisgICAgICkqCisgICApPworICBccyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdHJhaWxpbmcgd2hpdGVzcGFjZQorIiIiLCByZS5WRVJCT1NFKQorZW5kZW5kdGFnID0gcmUuY29tcGlsZSgnPicpCisjIHRoZSBIVE1MIDUgc3BlYywgc2VjdGlvbiA4LjEuMi4yLCBkb2Vzbid0IGFsbG93IHNwYWNlcyBiZXR3ZWVuCisjIDwvIGFuZCB0aGUgdGFnIG5hbWUsIHNvIG1heWJlIHRoaXMgc2hvdWxkIGJlIGZpeGVkCitlbmR0YWdmaW5kID0gcmUuY29tcGlsZSgnPC9ccyooW2EtekEtWl1bLS5hLXpBLVowLTk6X10qKVxzKj4nKQorCisKK2NsYXNzIEhUTUxQYXJzZUVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCBmb3IgYWxsIHBhcnNlIGVycm9ycy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIHBvc2l0aW9uPShOb25lLCBOb25lKSk6CisgICAgICAgIGFzc2VydCBtc2cKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgc2VsZi5saW5lbm8gPSBwb3NpdGlvblswXQorICAgICAgICBzZWxmLm9mZnNldCA9IHBvc2l0aW9uWzFdCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5tc2cKKyAgICAgICAgaWYgc2VsZi5saW5lbm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAiLCBhdCBsaW5lICVkIiAlIHNlbGYubGluZW5vCisgICAgICAgIGlmIHNlbGYub2Zmc2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgIiwgY29sdW1uICVkIiAlIChzZWxmLm9mZnNldCArIDEpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBIVE1MUGFyc2VyKG1hcmt1cGJhc2UuUGFyc2VyQmFzZSk6CisgICAgIiIiRmluZCB0YWdzIGFuZCBvdGhlciBtYXJrdXAgYW5kIGNhbGwgaGFuZGxlciBmdW5jdGlvbnMuCisKKyAgICBVc2FnZToKKyAgICAgICAgcCA9IEhUTUxQYXJzZXIoKQorICAgICAgICBwLmZlZWQoZGF0YSkKKyAgICAgICAgLi4uCisgICAgICAgIHAuY2xvc2UoKQorCisgICAgU3RhcnQgdGFncyBhcmUgaGFuZGxlZCBieSBjYWxsaW5nIHNlbGYuaGFuZGxlX3N0YXJ0dGFnKCkgb3IKKyAgICBzZWxmLmhhbmRsZV9zdGFydGVuZHRhZygpOyBlbmQgdGFncyBieSBzZWxmLmhhbmRsZV9lbmR0YWcoKS4gIFRoZQorICAgIGRhdGEgYmV0d2VlbiB0YWdzIGlzIHBhc3NlZCBmcm9tIHRoZSBwYXJzZXIgdG8gdGhlIGRlcml2ZWQgY2xhc3MKKyAgICBieSBjYWxsaW5nIHNlbGYuaGFuZGxlX2RhdGEoKSB3aXRoIHRoZSBkYXRhIGFzIGFyZ3VtZW50ICh0aGUgZGF0YQorICAgIG1heSBiZSBzcGxpdCB1cCBpbiBhcmJpdHJhcnkgY2h1bmtzKS4gIEVudGl0eSByZWZlcmVuY2VzIGFyZQorICAgIHBhc3NlZCBieSBjYWxsaW5nIHNlbGYuaGFuZGxlX2VudGl0eXJlZigpIHdpdGggdGhlIGVudGl0eQorICAgIHJlZmVyZW5jZSBhcyB0aGUgYXJndW1lbnQuICBOdW1lcmljIGNoYXJhY3RlciByZWZlcmVuY2VzIGFyZQorICAgIHBhc3NlZCB0byBzZWxmLmhhbmRsZV9jaGFycmVmKCkgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlCisgICAgcmVmZXJlbmNlIGFzIHRoZSBhcmd1bWVudC4KKyAgICAiIiIKKworICAgIENEQVRBX0NPTlRFTlRfRUxFTUVOVFMgPSAoInNjcmlwdCIsICJzdHlsZSIpCisKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbmQgcmVzZXQgdGhpcyBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiIlJlc2V0IHRoaXMgaW5zdGFuY2UuICBMb3NlcyBhbGwgdW5wcm9jZXNzZWQgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5yYXdkYXRhID0gJycKKyAgICAgICAgc2VsZi5sYXN0dGFnID0gJz8/PycKKyAgICAgICAgc2VsZi5pbnRlcmVzdGluZyA9IGludGVyZXN0aW5nX25vcm1hbAorICAgICAgICBzZWxmLmNkYXRhX2VsZW0gPSBOb25lCisgICAgICAgIG1hcmt1cGJhc2UuUGFyc2VyQmFzZS5yZXNldChzZWxmKQorCisgICAgZGVmIGZlZWQoc2VsZiwgZGF0YSk6CisgICAgICAgIHIiIiJGZWVkIGRhdGEgdG8gdGhlIHBhcnNlci4KKworICAgICAgICBDYWxsIHRoaXMgYXMgb2Z0ZW4gYXMgeW91IHdhbnQsIHdpdGggYXMgbGl0dGxlIG9yIGFzIG11Y2ggdGV4dAorICAgICAgICBhcyB5b3Ugd2FudCAobWF5IGluY2x1ZGUgJ1xuJykuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJhd2RhdGEgPSBzZWxmLnJhd2RhdGEgKyBkYXRhCisgICAgICAgIHNlbGYuZ29haGVhZCgwKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgYW55IGJ1ZmZlcmVkIGRhdGEuIiIiCisgICAgICAgIHNlbGYuZ29haGVhZCgxKQorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICByYWlzZSBIVE1MUGFyc2VFcnJvcihtZXNzYWdlLCBzZWxmLmdldHBvcygpKQorCisgICAgX19zdGFydHRhZ190ZXh0ID0gTm9uZQorCisgICAgZGVmIGdldF9zdGFydHRhZ190ZXh0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gZnVsbCBzb3VyY2Ugb2Ygc3RhcnQgdGFnOiAnPC4uLj4nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX3N0YXJ0dGFnX3RleHQKKworICAgIGRlZiBzZXRfY2RhdGFfbW9kZShzZWxmLCBlbGVtKToKKyAgICAgICAgc2VsZi5jZGF0YV9lbGVtID0gZWxlbS5sb3dlcigpCisgICAgICAgIHNlbGYuaW50ZXJlc3RpbmcgPSByZS5jb21waWxlKHInPC9ccyolc1xzKj4nICUgc2VsZi5jZGF0YV9lbGVtLCByZS5JKQorCisgICAgZGVmIGNsZWFyX2NkYXRhX21vZGUoc2VsZik6CisgICAgICAgIHNlbGYuaW50ZXJlc3RpbmcgPSBpbnRlcmVzdGluZ19ub3JtYWwKKyAgICAgICAgc2VsZi5jZGF0YV9lbGVtID0gTm9uZQorCisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgZGF0YSBhcyBmYXIgYXMgcmVhc29uYWJsZS4gIE1heSBsZWF2ZSBzdGF0ZQorICAgICMgYW5kIGRhdGEgdG8gYmUgcHJvY2Vzc2VkIGJ5IGEgc3Vic2VxdWVudCBjYWxsLiAgSWYgJ2VuZCcgaXMKKyAgICAjIHRydWUsIGZvcmNlIGhhbmRsaW5nIGFsbCBkYXRhIGFzIGlmIGZvbGxvd2VkIGJ5IEVPRiBtYXJrZXIuCisgICAgZGVmIGdvYWhlYWQoc2VsZiwgZW5kKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpID0gMAorICAgICAgICBuID0gbGVuKHJhd2RhdGEpCisgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgbWF0Y2ggPSBzZWxmLmludGVyZXN0aW5nLnNlYXJjaChyYXdkYXRhLCBpKSAjIDwgb3IgJgorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgaiA9IG1hdGNoLnN0YXJ0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jZGF0YV9lbGVtOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGogPSBuCisgICAgICAgICAgICBpZiBpIDwgajogc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6al0pCisgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgaikKKyAgICAgICAgICAgIGlmIGkgPT0gbjogYnJlYWsKKyAgICAgICAgICAgIHN0YXJ0c3dpdGggPSByYXdkYXRhLnN0YXJ0c3dpdGgKKyAgICAgICAgICAgIGlmIHN0YXJ0c3dpdGgoJzwnLCBpKToKKyAgICAgICAgICAgICAgICBpZiBzdGFydHRhZ29wZW4ubWF0Y2gocmF3ZGF0YSwgaSk6ICMgPCArIGxldHRlcgorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9zdGFydHRhZyhpKQorICAgICAgICAgICAgICAgIGVsaWYgc3RhcnRzd2l0aCgiPC8iLCBpKToKKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfZW5kdGFnKGkpCisgICAgICAgICAgICAgICAgZWxpZiBzdGFydHN3aXRoKCI8IS0tIiwgaSk6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2NvbW1lbnQoaSkKKyAgICAgICAgICAgICAgICBlbGlmIHN0YXJ0c3dpdGgoIjw/IiwgaSk6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX3BpKGkpCisgICAgICAgICAgICAgICAgZWxpZiBzdGFydHN3aXRoKCI8ISIsIGkpOgorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9odG1sX2RlY2xhcmF0aW9uKGkpCisgICAgICAgICAgICAgICAgZWxpZiAoaSArIDEpIDwgbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YSgiPCIpCisgICAgICAgICAgICAgICAgICAgIGsgPSBpICsgMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgayA8IDA6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBlbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBrID0gcmF3ZGF0YS5maW5kKCc+JywgaSArIDEpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgayA9IHJhd2RhdGEuZmluZCgnPCcsIGkgKyAxKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgayA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9IGkgKyAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBrICs9IDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6a10pCisgICAgICAgICAgICAgICAgaSA9IHNlbGYudXBkYXRlcG9zKGksIGspCisgICAgICAgICAgICBlbGlmIHN0YXJ0c3dpdGgoIiYjIiwgaSk6CisgICAgICAgICAgICAgICAgbWF0Y2ggPSBjaGFycmVmLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgpWzI6LTFdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2NoYXJyZWYobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgayA9IG1hdGNoLmVuZCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdGFydHN3aXRoKCc7Jywgay0xKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBrIC0gMQorICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgaykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiAiOyIgaW4gcmF3ZGF0YVtpOl06ICNiYWlsIGJ5IGNvbnN1bWluZyAmIworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhWzA6Ml0pCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgMikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgc3RhcnRzd2l0aCgnJicsIGkpOgorICAgICAgICAgICAgICAgIG1hdGNoID0gZW50aXR5cmVmLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lbnRpdHlyZWYobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgayA9IG1hdGNoLmVuZCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzdGFydHN3aXRoKCc7Jywgay0xKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBrIC0gMQorICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgaykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGluY29tcGxldGUubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgIyBtYXRjaC5ncm91cCgpIHdpbGwgY29udGFpbiBhdCBsZWFzdCAyIGNoYXJzCisgICAgICAgICAgICAgICAgICAgIGlmIGVuZCBhbmQgbWF0Y2guZ3JvdXAoKSA9PSByYXdkYXRhW2k6XToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoIkVPRiBpbiBtaWRkbGUgb2YgZW50aXR5IG9yIGNoYXIgcmVmIikKKyAgICAgICAgICAgICAgICAgICAgIyBpbmNvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxpZiAoaSArIDEpIDwgbjoKKyAgICAgICAgICAgICAgICAgICAgIyBub3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBhbmQgY2FuJ3QgYmUgY29uZnVzZWQKKyAgICAgICAgICAgICAgICAgICAgIyB3aXRoIHNvbWUgb3RoZXIgY29uc3RydWN0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoIiYiKQorICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgaSArIDEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IDAsICJpbnRlcmVzdGluZy5zZWFyY2goKSBsaWVkIgorICAgICAgICAjIGVuZCB3aGlsZQorICAgICAgICBpZiBlbmQgYW5kIGkgPCBuIGFuZCBub3Qgc2VsZi5jZGF0YV9lbGVtOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6bl0pCisgICAgICAgICAgICBpID0gc2VsZi51cGRhdGVwb3MoaSwgbikKKyAgICAgICAgc2VsZi5yYXdkYXRhID0gcmF3ZGF0YVtpOl0KKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgaHRtbCBkZWNsYXJhdGlvbnMsIHJldHVybiBsZW5ndGggb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKKyAgICAjIFNlZSB3My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjbWFya3VwLWRlY2xhcmF0aW9uLW9wZW4tc3RhdGUKKyAgICAjIFNlZSBhbHNvIHBhcnNlX2RlY2xhcmF0aW9uIGluIF9tYXJrdXBiYXNlCisgICAgZGVmIHBhcnNlX2h0bWxfZGVjbGFyYXRpb24oc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrMl0gIT0gJzwhJzoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9odG1sX2RlY2xhcmF0aW9uKCknKQorICAgICAgICBpZiByYXdkYXRhW2k6aSs0XSA9PSAnPCEtLSc6CisgICAgICAgICAgICAjIHRoaXMgY2FzZSBpcyBhY3R1YWxseSBhbHJlYWR5IGhhbmRsZWQgaW4gZ29haGVhZCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9jb21tZW50KGkpCisgICAgICAgIGVsaWYgcmF3ZGF0YVtpOmkrM10gPT0gJzwhWyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9tYXJrZWRfc2VjdGlvbihpKQorICAgICAgICBlbGlmIHJhd2RhdGFbaTppKzldLmxvd2VyKCkgPT0gJzwhZG9jdHlwZSc6CisgICAgICAgICAgICAjIGZpbmQgdGhlIGNsb3NpbmcgPgorICAgICAgICAgICAgZ3Rwb3MgPSByYXdkYXRhLmZpbmQoJz4nLCBpKzkpCisgICAgICAgICAgICBpZiBndHBvcyA9PSAtMToKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RlY2wocmF3ZGF0YVtpKzI6Z3Rwb3NdKQorICAgICAgICAgICAgcmV0dXJuIGd0cG9zKzEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcnNlX2JvZ3VzX2NvbW1lbnQoaSkKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgYm9ndXMgY29tbWVudCwgcmV0dXJuIGxlbmd0aCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgICMgc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI2JvZ3VzLWNvbW1lbnQtc3RhdGUKKyAgICBkZWYgcGFyc2VfYm9ndXNfY29tbWVudChzZWxmLCBpLCByZXBvcnQ9MSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrMl0gbm90IGluICgnPCEnLCAnPC8nKToKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9jb21tZW50KCknKQorICAgICAgICBwb3MgPSByYXdkYXRhLmZpbmQoJz4nLCBpKzIpCisgICAgICAgIGlmIHBvcyA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiByZXBvcnQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9jb21tZW50KHJhd2RhdGFbaSsyOnBvc10pCisgICAgICAgIHJldHVybiBwb3MgKyAxCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIHByb2Nlc3NpbmcgaW5zdHIsIHJldHVybiBlbmQgb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKKyAgICBkZWYgcGFyc2VfcGkoc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgYXNzZXJ0IHJhd2RhdGFbaTppKzJdID09ICc8PycsICd1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfcGkoKScKKyAgICAgICAgbWF0Y2ggPSBwaWNsb3NlLnNlYXJjaChyYXdkYXRhLCBpKzIpICMgPgorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaiA9IG1hdGNoLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5oYW5kbGVfcGkocmF3ZGF0YVtpKzI6IGpdKQorICAgICAgICBqID0gbWF0Y2guZW5kKCkKKyAgICAgICAgcmV0dXJuIGoKKworICAgICMgSW50ZXJuYWwgLS0gaGFuZGxlIHN0YXJ0dGFnLCByZXR1cm4gZW5kIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX3N0YXJ0dGFnKHNlbGYsIGkpOgorICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IE5vbmUKKyAgICAgICAgZW5kcG9zID0gc2VsZi5jaGVja19mb3Jfd2hvbGVfc3RhcnRfdGFnKGkpCisgICAgICAgIGlmIGVuZHBvcyA8IDA6CisgICAgICAgICAgICByZXR1cm4gZW5kcG9zCisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgc2VsZi5fX3N0YXJ0dGFnX3RleHQgPSByYXdkYXRhW2k6ZW5kcG9zXQorCisgICAgICAgICMgTm93IHBhcnNlIHRoZSBkYXRhIGJldHdlZW4gaSsxIGFuZCBqIGludG8gYSB0YWcgYW5kIGF0dHJzCisgICAgICAgIGF0dHJzID0gW10KKyAgICAgICAgbWF0Y2ggPSB0YWdmaW5kLm1hdGNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgYXNzZXJ0IG1hdGNoLCAndW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX3N0YXJ0dGFnKCknCisgICAgICAgIGsgPSBtYXRjaC5lbmQoKQorICAgICAgICBzZWxmLmxhc3R0YWcgPSB0YWcgPSBtYXRjaC5ncm91cCgxKS5sb3dlcigpCisKKyAgICAgICAgd2hpbGUgayA8IGVuZHBvczoKKyAgICAgICAgICAgIG0gPSBhdHRyZmluZC5tYXRjaChyYXdkYXRhLCBrKQorICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGF0dHJuYW1lLCByZXN0LCBhdHRydmFsdWUgPSBtLmdyb3VwKDEsIDIsIDMpCisgICAgICAgICAgICBpZiBub3QgcmVzdDoKKyAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBOb25lCisgICAgICAgICAgICBlbGlmIGF0dHJ2YWx1ZVs6MV0gPT0gJ1wnJyA9PSBhdHRydmFsdWVbLTE6XSBvciBcCisgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZVs6MV0gPT0gJyInID09IGF0dHJ2YWx1ZVstMTpdOgorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQorICAgICAgICAgICAgaWYgYXR0cnZhbHVlOgorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IHNlbGYudW5lc2NhcGUoYXR0cnZhbHVlKQorICAgICAgICAgICAgYXR0cnMuYXBwZW5kKChhdHRybmFtZS5sb3dlcigpLCBhdHRydmFsdWUpKQorICAgICAgICAgICAgayA9IG0uZW5kKCkKKworICAgICAgICBlbmQgPSByYXdkYXRhW2s6ZW5kcG9zXS5zdHJpcCgpCisgICAgICAgIGlmIGVuZCBub3QgaW4gKCI+IiwgIi8+Iik6CisgICAgICAgICAgICBsaW5lbm8sIG9mZnNldCA9IHNlbGYuZ2V0cG9zKCkKKyAgICAgICAgICAgIGlmICJcbiIgaW4gc2VsZi5fX3N0YXJ0dGFnX3RleHQ6CisgICAgICAgICAgICAgICAgbGluZW5vID0gbGluZW5vICsgc2VsZi5fX3N0YXJ0dGFnX3RleHQuY291bnQoIlxuIikKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBsZW4oc2VsZi5fX3N0YXJ0dGFnX3RleHQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtIHNlbGYuX19zdGFydHRhZ190ZXh0LnJmaW5kKCJcbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IG9mZnNldCArIGxlbihzZWxmLl9fc3RhcnR0YWdfdGV4dCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpOmVuZHBvc10pCisgICAgICAgICAgICByZXR1cm4gZW5kcG9zCisgICAgICAgIGlmIGVuZC5lbmRzd2l0aCgnLz4nKToKKyAgICAgICAgICAgICMgWEhUTUwtc3R5bGUgZW1wdHkgdGFnOiA8c3BhbiBhdHRyPSJ2YWx1ZSIgLz4KKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3N0YXJ0ZW5kdGFnKHRhZywgYXR0cnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9zdGFydHRhZyh0YWcsIGF0dHJzKQorICAgICAgICAgICAgaWYgdGFnIGluIHNlbGYuQ0RBVEFfQ09OVEVOVF9FTEVNRU5UUzoKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9jZGF0YV9tb2RlKHRhZykKKyAgICAgICAgcmV0dXJuIGVuZHBvcworCisgICAgIyBJbnRlcm5hbCAtLSBjaGVjayB0byBzZWUgaWYgd2UgaGF2ZSBhIGNvbXBsZXRlIHN0YXJ0dGFnOyByZXR1cm4gZW5kCisgICAgIyBvciAtMSBpZiBpbmNvbXBsZXRlLgorICAgIGRlZiBjaGVja19mb3Jfd2hvbGVfc3RhcnRfdGFnKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIG0gPSBsb2NhdGVzdGFydHRhZ2VuZC5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgaiA9IG0uZW5kKCkKKyAgICAgICAgICAgIG5leHQgPSByYXdkYXRhW2o6aisxXQorICAgICAgICAgICAgaWYgbmV4dCA9PSAiPiI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGogKyAxCisgICAgICAgICAgICBpZiBuZXh0ID09ICIvIjoKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhLnN0YXJ0c3dpdGgoIi8+Iiwgaik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBqICsgMgorICAgICAgICAgICAgICAgIGlmIHJhd2RhdGEuc3RhcnRzd2l0aCgiLyIsIGopOgorICAgICAgICAgICAgICAgICAgICAjIGJ1ZmZlciBib3VuZGFyeQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICAjIGVsc2UgYm9ndXMgaW5wdXQKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZXBvcyhpLCBqICsgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yKCJtYWxmb3JtZWQgZW1wdHkgc3RhcnQgdGFnIikKKyAgICAgICAgICAgIGlmIG5leHQgPT0gIiI6CisgICAgICAgICAgICAgICAgIyBlbmQgb2YgaW5wdXQKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIG5leHQgaW4gKCJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ej0vIgorICAgICAgICAgICAgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIik6CisgICAgICAgICAgICAgICAgIyBlbmQgb2YgaW5wdXQgaW4gb3IgYmVmb3JlIGF0dHJpYnV0ZSB2YWx1ZSwgb3Igd2UgaGF2ZSB0aGUKKyAgICAgICAgICAgICAgICAjICcvJyBmcm9tIGEgJy8+JyBlbmRpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIGogPiBpOgorICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBpICsgMQorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigid2Ugc2hvdWxkIG5vdCBnZXQgaGVyZSEiKQorCisgICAgIyBJbnRlcm5hbCAtLSBwYXJzZSBlbmR0YWcsIHJldHVybiBlbmQgb3IgLTEgaWYgaW5jb21wbGV0ZQorICAgIGRlZiBwYXJzZV9lbmR0YWcoc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgYXNzZXJ0IHJhd2RhdGFbaTppKzJdID09ICI8LyIsICJ1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfZW5kdGFnIgorICAgICAgICBtYXRjaCA9IGVuZGVuZHRhZy5zZWFyY2gocmF3ZGF0YSwgaSsxKSAjID4KKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGd0cG9zID0gbWF0Y2guZW5kKCkKKyAgICAgICAgbWF0Y2ggPSBlbmR0YWdmaW5kLm1hdGNoKHJhd2RhdGEsIGkpICMgPC8gKyB0YWcgKyA+CisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIGlmIHNlbGYuY2RhdGFfZWxlbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTpndHBvc10pCisgICAgICAgICAgICAgICAgcmV0dXJuIGd0cG9zCisgICAgICAgICAgICAjIGZpbmQgdGhlIG5hbWU6IHczLm9yZy9UUi9odG1sNS90b2tlbml6YXRpb24uaHRtbCN0YWctbmFtZS1zdGF0ZQorICAgICAgICAgICAgbmFtZW1hdGNoID0gdGFnZmluZF90b2xlcmFudC5tYXRjaChyYXdkYXRhLCBpKzIpCisgICAgICAgICAgICBpZiBub3QgbmFtZW1hdGNoOgorICAgICAgICAgICAgICAgICMgdzMub3JnL1RSL2h0bWw1L3Rva2VuaXphdGlvbi5odG1sI2VuZC10YWctb3Blbi1zdGF0ZQorICAgICAgICAgICAgICAgIGlmIHJhd2RhdGFbaTppKzNdID09ICc8Lz4nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSszCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfYm9ndXNfY29tbWVudChpKQorICAgICAgICAgICAgdGFnbmFtZSA9IG5hbWVtYXRjaC5ncm91cCgpLmxvd2VyKCkKKyAgICAgICAgICAgICMgY29uc3VtZSBhbmQgaWdub3JlIG90aGVyIHN0dWZmIGJldHdlZW4gdGhlIG5hbWUgYW5kIHRoZSA+CisgICAgICAgICAgICAjIE5vdGU6IHRoaXMgaXMgbm90IDEwMCUgY29ycmVjdCwgc2luY2Ugd2UgbWlnaHQgaGF2ZSB0aGluZ3MgbGlrZQorICAgICAgICAgICAgIyA8L3RhZyBhdHRyPSI+Ij4sIGJ1dCBsb29raW5nIGZvciA+IGFmdGVyIHRoYSBuYW1lIHNob3VsZCBjb3ZlcgorICAgICAgICAgICAgIyBtb3N0IG9mIHRoZSBjYXNlcyBhbmQgaXMgbXVjaCBzaW1wbGVyCisgICAgICAgICAgICBndHBvcyA9IHJhd2RhdGEuZmluZCgnPicsIG5hbWVtYXRjaC5lbmQoKSkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2VuZHRhZyh0YWduYW1lKQorICAgICAgICAgICAgcmV0dXJuIGd0cG9zKzEKKworICAgICAgICBlbGVtID0gbWF0Y2guZ3JvdXAoMSkubG93ZXIoKSAjIHNjcmlwdCBvciBzdHlsZQorICAgICAgICBpZiBzZWxmLmNkYXRhX2VsZW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBlbGVtICE9IHNlbGYuY2RhdGFfZWxlbToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTpndHBvc10pCisgICAgICAgICAgICAgICAgcmV0dXJuIGd0cG9zCisKKyAgICAgICAgc2VsZi5oYW5kbGVfZW5kdGFnKGVsZW0pCisgICAgICAgIHNlbGYuY2xlYXJfY2RhdGFfbW9kZSgpCisgICAgICAgIHJldHVybiBndHBvcworCisgICAgIyBPdmVycmlkYWJsZSAtLSBmaW5pc2ggcHJvY2Vzc2luZyBvZiBzdGFydCtlbmQgdGFnOiA8dGFnLi4uLz4KKyAgICBkZWYgaGFuZGxlX3N0YXJ0ZW5kdGFnKHNlbGYsIHRhZywgYXR0cnMpOgorICAgICAgICBzZWxmLmhhbmRsZV9zdGFydHRhZyh0YWcsIGF0dHJzKQorICAgICAgICBzZWxmLmhhbmRsZV9lbmR0YWcodGFnKQorCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgc3RhcnQgdGFnCisgICAgZGVmIGhhbmRsZV9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgcGFzcworCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgZW5kIHRhZworICAgIGRlZiBoYW5kbGVfZW5kdGFnKHNlbGYsIHRhZyk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIGNoYXJhY3RlciByZWZlcmVuY2UKKyAgICBkZWYgaGFuZGxlX2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIGVudGl0eSByZWZlcmVuY2UKKyAgICBkZWYgaGFuZGxlX2VudGl0eXJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcworCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgZGF0YQorICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgY29tbWVudAorICAgIGRlZiBoYW5kbGVfY29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgZGVjbGFyYXRpb24KKyAgICBkZWYgaGFuZGxlX2RlY2woc2VsZiwgZGVjbCk6CisgICAgICAgIHBhc3MKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KKyAgICBkZWYgaGFuZGxlX3BpKHNlbGYsIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdW5rbm93bl9kZWNsKHNlbGYsIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICAjIEludGVybmFsIC0tIGhlbHBlciB0byByZW1vdmUgc3BlY2lhbCBjaGFyYWN0ZXIgcXVvdGluZworICAgIGVudGl0eWRlZnMgPSBOb25lCisgICAgZGVmIHVuZXNjYXBlKHNlbGYsIHMpOgorICAgICAgICBpZiAnJicgbm90IGluIHM6CisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBkZWYgcmVwbGFjZUVudGl0aWVzKHMpOgorICAgICAgICAgICAgcyA9IHMuZ3JvdXBzKClbMF0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzWzBdID09ICIjIjoKKyAgICAgICAgICAgICAgICAgICAgcyA9IHNbMTpdCisgICAgICAgICAgICAgICAgICAgIGlmIHNbMF0gaW4gWyd4JywnWCddOgorICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGludChzWzE6XSwgMTYpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gaW50KHMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmljaHIoYykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiAnJiMnK3MrJzsnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQ2Fubm90IHVzZSBuYW1lMmNvZGVwb2ludCBkaXJlY3RseSwgYmVjYXVzZSBIVE1MUGFyc2VyIHN1cHBvcnRzIGFwb3MsCisgICAgICAgICAgICAgICAgIyB3aGljaCBpcyBub3QgcGFydCBvZiBIVE1MIDQKKyAgICAgICAgICAgICAgICBpbXBvcnQgaHRtbGVudGl0eWRlZnMKKyAgICAgICAgICAgICAgICBpZiBIVE1MUGFyc2VyLmVudGl0eWRlZnMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5ZGVmcyA9IEhUTUxQYXJzZXIuZW50aXR5ZGVmcyA9IHsnYXBvcyc6dSInIn0KKyAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gaHRtbGVudGl0eWRlZnMubmFtZTJjb2RlcG9pbnQuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlkZWZzW2tdID0gdW5pY2hyKHYpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5lbnRpdHlkZWZzW3NdCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyYnK3MrJzsnCisKKyAgICAgICAgcmV0dXJuIHJlLnN1YihyIiYoIz9beFhdPyg/OlswLTlhLWZBLUZdK3xcd3sxLDh9KSk7IiwgcmVwbGFjZUVudGl0aWVzLCBzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9IVE1MUGFyc2VyLnB5YyBiL2xpYi9weXRob24yLjcvSFRNTFBhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVkZjJkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvSFRNTFBhcnNlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9IVE1MUGFyc2VyLnB5byBiL2xpYi9weXRob24yLjcvSFRNTFBhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQwMzRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvSFRNTFBhcnNlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9MSUNFTlNFLnR4dCBiL2xpYi9weXRob24yLjcvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4OWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvTElDRU5TRS50eHQKQEAgLTAsMCArMSwyNzkgQEAKK0EuIEhJU1RPUlkgT0YgVEhFIFNPRlRXQVJFCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQeXRob24gd2FzIGNyZWF0ZWQgaW4gdGhlIGVhcmx5IDE5OTBzIGJ5IEd1aWRvIHZhbiBSb3NzdW0gYXQgU3RpY2h0aW5nCitNYXRoZW1hdGlzY2ggQ2VudHJ1bSAoQ1dJLCBzZWUgaHR0cDovL3d3dy5jd2kubmwpIGluIHRoZSBOZXRoZXJsYW5kcworYXMgYSBzdWNjZXNzb3Igb2YgYSBsYW5ndWFnZSBjYWxsZWQgQUJDLiAgR3VpZG8gcmVtYWlucyBQeXRob24ncworcHJpbmNpcGFsIGF1dGhvciwgYWx0aG91Z2ggaXQgaW5jbHVkZXMgbWFueSBjb250cmlidXRpb25zIGZyb20gb3RoZXJzLgorCitJbiAxOTk1LCBHdWlkbyBjb250aW51ZWQgaGlzIHdvcmsgb24gUHl0aG9uIGF0IHRoZSBDb3Jwb3JhdGlvbiBmb3IKK05hdGlvbmFsIFJlc2VhcmNoIEluaXRpYXRpdmVzIChDTlJJLCBzZWUgaHR0cDovL3d3dy5jbnJpLnJlc3Rvbi52YS51cykKK2luIFJlc3RvbiwgVmlyZ2luaWEgd2hlcmUgaGUgcmVsZWFzZWQgc2V2ZXJhbCB2ZXJzaW9ucyBvZiB0aGUKK3NvZnR3YXJlLgorCitJbiBNYXkgMjAwMCwgR3VpZG8gYW5kIHRoZSBQeXRob24gY29yZSBkZXZlbG9wbWVudCB0ZWFtIG1vdmVkIHRvCitCZU9wZW4uY29tIHRvIGZvcm0gdGhlIEJlT3BlbiBQeXRob25MYWJzIHRlYW0uICBJbiBPY3RvYmVyIG9mIHRoZSBzYW1lCit5ZWFyLCB0aGUgUHl0aG9uTGFicyB0ZWFtIG1vdmVkIHRvIERpZ2l0YWwgQ3JlYXRpb25zIChub3cgWm9wZQorQ29ycG9yYXRpb24sIHNlZSBodHRwOi8vd3d3LnpvcGUuY29tKS4gIEluIDIwMDEsIHRoZSBQeXRob24gU29mdHdhcmUKK0ZvdW5kYXRpb24gKFBTRiwgc2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2YvKSB3YXMgZm9ybWVkLCBhCitub24tcHJvZml0IG9yZ2FuaXphdGlvbiBjcmVhdGVkIHNwZWNpZmljYWxseSB0byBvd24gUHl0aG9uLXJlbGF0ZWQKK0ludGVsbGVjdHVhbCBQcm9wZXJ0eS4gIFpvcGUgQ29ycG9yYXRpb24gaXMgYSBzcG9uc29yaW5nIG1lbWJlciBvZgordGhlIFBTRi4KKworQWxsIFB5dGhvbiByZWxlYXNlcyBhcmUgT3BlbiBTb3VyY2UgKHNlZSBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnIGZvcgordGhlIE9wZW4gU291cmNlIERlZmluaXRpb24pLiAgSGlzdG9yaWNhbGx5LCBtb3N0LCBidXQgbm90IGFsbCwgUHl0aG9uCityZWxlYXNlcyBoYXZlIGFsc28gYmVlbiBHUEwtY29tcGF0aWJsZTsgdGhlIHRhYmxlIGJlbG93IHN1bW1hcml6ZXMKK3RoZSB2YXJpb3VzIHJlbGVhc2VzLgorCisgICAgUmVsZWFzZSAgICAgICAgIERlcml2ZWQgICAgIFllYXIgICAgICAgIE93bmVyICAgICAgIEdQTC0KKyAgICAgICAgICAgICAgICAgICAgZnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZT8gKDEpCisKKyAgICAwLjkuMCB0aHJ1IDEuMiAgICAgICAgICAgICAgMTk5MS0xOTk1ICAgQ1dJICAgICAgICAgeWVzCisgICAgMS4zIHRocnUgMS41LjIgIDEuMiAgICAgICAgIDE5OTUtMTk5OSAgIENOUkkgICAgICAgIHllcworICAgIDEuNiAgICAgICAgICAgICAxLjUuMiAgICAgICAyMDAwICAgICAgICBDTlJJICAgICAgICBubworICAgIDIuMCAgICAgICAgICAgICAxLjYgICAgICAgICAyMDAwICAgICAgICBCZU9wZW4uY29tICBubworICAgIDEuNi4xICAgICAgICAgICAxLjYgICAgICAgICAyMDAxICAgICAgICBDTlJJICAgICAgICB5ZXMgKDIpCisgICAgMi4xICAgICAgICAgICAgIDIuMCsxLjYuMSAgIDIwMDEgICAgICAgIFBTRiAgICAgICAgIG5vCisgICAgMi4wLjEgICAgICAgICAgIDIuMCsxLjYuMSAgIDIwMDEgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuMS4xICAgICAgICAgICAyLjErMi4wLjEgICAyMDAxICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjIgICAgICAgICAgICAgMi4xLjEgICAgICAgMjAwMSAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi4xLjIgICAgICAgICAgIDIuMS4xICAgICAgIDIwMDIgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuMS4zICAgICAgICAgICAyLjEuMiAgICAgICAyMDAyICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjIuMSAgICAgICAgICAgMi4yICAgICAgICAgMjAwMiAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi4yLjIgICAgICAgICAgIDIuMi4xICAgICAgIDIwMDIgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuMi4zICAgICAgICAgICAyLjIuMiAgICAgICAyMDAzICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjMgICAgICAgICAgICAgMi4yLjIgICAgICAgMjAwMi0yMDAzICAgUFNGICAgICAgICAgeWVzCisgICAgMi4zLjEgICAgICAgICAgIDIuMyAgICAgICAgIDIwMDItMjAwMyAgIFBTRiAgICAgICAgIHllcworICAgIDIuMy4yICAgICAgICAgICAyLjMuMSAgICAgICAyMDAyLTIwMDMgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjMuMyAgICAgICAgICAgMi4zLjIgICAgICAgMjAwMi0yMDAzICAgUFNGICAgICAgICAgeWVzCisgICAgMi4zLjQgICAgICAgICAgIDIuMy4zICAgICAgIDIwMDQgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuMy41ICAgICAgICAgICAyLjMuNCAgICAgICAyMDA1ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjQgICAgICAgICAgICAgMi4zICAgICAgICAgMjAwNCAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi40LjEgICAgICAgICAgIDIuNCAgICAgICAgIDIwMDUgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNC4yICAgICAgICAgICAyLjQuMSAgICAgICAyMDA1ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjQuMyAgICAgICAgICAgMi40LjIgICAgICAgMjAwNiAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi40LjQgICAgICAgICAgIDIuNC4zICAgICAgIDIwMDYgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNSAgICAgICAgICAgICAyLjQgICAgICAgICAyMDA2ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjUuMSAgICAgICAgICAgMi41ICAgICAgICAgMjAwNyAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi41LjIgICAgICAgICAgIDIuNS4xICAgICAgIDIwMDggICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNS4zICAgICAgICAgICAyLjUuMiAgICAgICAyMDA4ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjYgICAgICAgICAgICAgMi41ICAgICAgICAgMjAwOCAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi42LjEgICAgICAgICAgIDIuNiAgICAgICAgIDIwMDggICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNi4yICAgICAgICAgICAyLjYuMSAgICAgICAyMDA5ICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjYuMyAgICAgICAgICAgMi42LjIgICAgICAgMjAwOSAgICAgICAgUFNGICAgICAgICAgeWVzCisgICAgMi42LjQgICAgICAgICAgIDIuNi4zICAgICAgIDIwMDkgICAgICAgIFBTRiAgICAgICAgIHllcworICAgIDIuNi41ICAgICAgICAgICAyLjYuNCAgICAgICAyMDEwICAgICAgICBQU0YgICAgICAgICB5ZXMKKyAgICAyLjcgICAgICAgICAgICAgMi42ICAgICAgICAgMjAxMCAgICAgICAgUFNGICAgICAgICAgeWVzCisKK0Zvb3Rub3RlczoKKworKDEpIEdQTC1jb21wYXRpYmxlIGRvZXNuJ3QgbWVhbiB0aGF0IHdlJ3JlIGRpc3RyaWJ1dGluZyBQeXRob24gdW5kZXIKKyAgICB0aGUgR1BMLiAgQWxsIFB5dGhvbiBsaWNlbnNlcywgdW5saWtlIHRoZSBHUEwsIGxldCB5b3UgZGlzdHJpYnV0ZQorICAgIGEgbW9kaWZpZWQgdmVyc2lvbiB3aXRob3V0IG1ha2luZyB5b3VyIGNoYW5nZXMgb3BlbiBzb3VyY2UuICBUaGUKKyAgICBHUEwtY29tcGF0aWJsZSBsaWNlbnNlcyBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbWJpbmUgUHl0aG9uIHdpdGgKKyAgICBvdGhlciBzb2Z0d2FyZSB0aGF0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEw7IHRoZSBvdGhlcnMgZG9uJ3QuCisKKygyKSBBY2NvcmRpbmcgdG8gUmljaGFyZCBTdGFsbG1hbiwgMS42LjEgaXMgbm90IEdQTC1jb21wYXRpYmxlLAorICAgIGJlY2F1c2UgaXRzIGxpY2Vuc2UgaGFzIGEgY2hvaWNlIG9mIGxhdyBjbGF1c2UuICBBY2NvcmRpbmcgdG8KKyAgICBDTlJJLCBob3dldmVyLCBTdGFsbG1hbidzIGxhd3llciBoYXMgdG9sZCBDTlJJJ3MgbGF3eWVyIHRoYXQgMS42LjEKKyAgICBpcyAibm90IGluY29tcGF0aWJsZSIgd2l0aCB0aGUgR1BMLgorCitUaGFua3MgdG8gdGhlIG1hbnkgb3V0c2lkZSB2b2x1bnRlZXJzIHdobyBoYXZlIHdvcmtlZCB1bmRlciBHdWlkbydzCitkaXJlY3Rpb24gdG8gbWFrZSB0aGVzZSByZWxlYXNlcyBwb3NzaWJsZS4KKworCitCLiBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgQUNDRVNTSU5HIE9SIE9USEVSV0lTRSBVU0lORyBQWVRIT04KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitQWVRIT04gU09GVFdBUkUgRk9VTkRBVElPTiBMSUNFTlNFIFZFUlNJT04gMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gVGhpcyBMSUNFTlNFIEFHUkVFTUVOVCBpcyBiZXR3ZWVuIHRoZSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorKCJQU0YiKSwgYW5kIHRoZSBJbmRpdmlkdWFsIG9yIE9yZ2FuaXphdGlvbiAoIkxpY2Vuc2VlIikgYWNjZXNzaW5nIGFuZAorb3RoZXJ3aXNlIHVzaW5nIHRoaXMgc29mdHdhcmUgKCJQeXRob24iKSBpbiBzb3VyY2Ugb3IgYmluYXJ5IGZvcm0gYW5kCitpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLgorCisyLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50LCBQU0YgaGVyZWJ5CitncmFudHMgTGljZW5zZWUgYSBub25leGNsdXNpdmUsIHJveWFsdHktZnJlZSwgd29ybGQtd2lkZSBsaWNlbnNlIHRvIHJlcHJvZHVjZSwKK2FuYWx5emUsIHRlc3QsIHBlcmZvcm0gYW5kL29yIGRpc3BsYXkgcHVibGljbHksIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcywKK2Rpc3RyaWJ1dGUsIGFuZCBvdGhlcndpc2UgdXNlIFB5dGhvbiBhbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uLAorcHJvdmlkZWQsIGhvd2V2ZXIsIHRoYXQgUFNGJ3MgTGljZW5zZSBBZ3JlZW1lbnQgYW5kIFBTRidzIG5vdGljZSBvZiBjb3B5cmlnaHQsCitpLmUuLCAiQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLAorMjAxMSwgMjAxMiwgMjAxMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbjsgQWxsIFJpZ2h0cyBSZXNlcnZlZCIgYXJlIHJldGFpbmVkCitpbiBQeXRob24gYWxvbmUgb3IgaW4gYW55IGRlcml2YXRpdmUgdmVyc2lvbiBwcmVwYXJlZCBieSBMaWNlbnNlZS4KKworMy4gSW4gdGhlIGV2ZW50IExpY2Vuc2VlIHByZXBhcmVzIGEgZGVyaXZhdGl2ZSB3b3JrIHRoYXQgaXMgYmFzZWQgb24KK29yIGluY29ycG9yYXRlcyBQeXRob24gb3IgYW55IHBhcnQgdGhlcmVvZiwgYW5kIHdhbnRzIHRvIG1ha2UKK3RoZSBkZXJpdmF0aXZlIHdvcmsgYXZhaWxhYmxlIHRvIG90aGVycyBhcyBwcm92aWRlZCBoZXJlaW4sIHRoZW4KK0xpY2Vuc2VlIGhlcmVieSBhZ3JlZXMgdG8gaW5jbHVkZSBpbiBhbnkgc3VjaCB3b3JrIGEgYnJpZWYgc3VtbWFyeSBvZgordGhlIGNoYW5nZXMgbWFkZSB0byBQeXRob24uCisKKzQuIFBTRiBpcyBtYWtpbmcgUHl0aG9uIGF2YWlsYWJsZSB0byBMaWNlbnNlZSBvbiBhbiAiQVMgSVMiCitiYXNpcy4gIFBTRiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUgorSU1QTElFRC4gIEJZIFdBWSBPRiBFWEFNUExFLCBCVVQgTk9UIExJTUlUQVRJT04sIFBTRiBNQUtFUyBOTyBBTkQKK0RJU0NMQUlNUyBBTlkgUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MKK0ZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBQWVRIT04gV0lMTCBOT1QKK0lORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBSSUdIVFMuCisKKzUuIFBTRiBTSEFMTCBOT1QgQkUgTElBQkxFIFRPIExJQ0VOU0VFIE9SIEFOWSBPVEhFUiBVU0VSUyBPRiBQWVRIT04KK0ZPUiBBTlkgSU5DSURFTlRBTCwgU1BFQ0lBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIExPU1MgQVMKK0EgUkVTVUxUIE9GIE1PRElGWUlORywgRElTVFJJQlVUSU5HLCBPUiBPVEhFUldJU0UgVVNJTkcgUFlUSE9OLAorT1IgQU5ZIERFUklWQVRJVkUgVEhFUkVPRiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBUSEVSRU9GLgorCis2LiBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IHdpbGwgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgdXBvbiBhIG1hdGVyaWFsCiticmVhY2ggb2YgaXRzIHRlcm1zIGFuZCBjb25kaXRpb25zLgorCis3LiBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgc2hhbGwgYmUgZGVlbWVkIHRvIGNyZWF0ZSBhbnkKK3JlbGF0aW9uc2hpcCBvZiBhZ2VuY3ksIHBhcnRuZXJzaGlwLCBvciBqb2ludCB2ZW50dXJlIGJldHdlZW4gUFNGIGFuZAorTGljZW5zZWUuICBUaGlzIExpY2Vuc2UgQWdyZWVtZW50IGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIFBTRgordHJhZGVtYXJrcyBvciB0cmFkZSBuYW1lIGluIGEgdHJhZGVtYXJrIHNlbnNlIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorcHJvZHVjdHMgb3Igc2VydmljZXMgb2YgTGljZW5zZWUsIG9yIGFueSB0aGlyZCBwYXJ0eS4KKworOC4gQnkgY29weWluZywgaW5zdGFsbGluZyBvciBvdGhlcndpc2UgdXNpbmcgUHl0aG9uLCBMaWNlbnNlZQorYWdyZWVzIHRvIGJlIGJvdW5kIGJ5IHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UKK0FncmVlbWVudC4KKworCitCRU9QRU4uQ09NIExJQ0VOU0UgQUdSRUVNRU5UIEZPUiBQWVRIT04gMi4wCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JFT1BFTiBQWVRIT04gT1BFTiBTT1VSQ0UgTElDRU5TRSBBR1JFRU1FTlQgVkVSU0lPTiAxCisKKzEuIFRoaXMgTElDRU5TRSBBR1JFRU1FTlQgaXMgYmV0d2VlbiBCZU9wZW4uY29tICgiQmVPcGVuIiksIGhhdmluZyBhbgorb2ZmaWNlIGF0IDE2MCBTYXJhdG9nYSBBdmVudWUsIFNhbnRhIENsYXJhLCBDQSA5NTA1MSwgYW5kIHRoZQorSW5kaXZpZHVhbCBvciBPcmdhbml6YXRpb24gKCJMaWNlbnNlZSIpIGFjY2Vzc2luZyBhbmQgb3RoZXJ3aXNlIHVzaW5nCit0aGlzIHNvZnR3YXJlIGluIHNvdXJjZSBvciBiaW5hcnkgZm9ybSBhbmQgaXRzIGFzc29jaWF0ZWQKK2RvY3VtZW50YXRpb24gKCJ0aGUgU29mdHdhcmUiKS4KKworMi4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBCZU9wZW4gUHl0aG9uIExpY2Vuc2UKK0FncmVlbWVudCwgQmVPcGVuIGhlcmVieSBncmFudHMgTGljZW5zZWUgYSBub24tZXhjbHVzaXZlLAorcm95YWx0eS1mcmVlLCB3b3JsZC13aWRlIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBhbmFseXplLCB0ZXN0LCBwZXJmb3JtCithbmQvb3IgZGlzcGxheSBwdWJsaWNseSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzLCBkaXN0cmlidXRlLCBhbmQKK290aGVyd2lzZSB1c2UgdGhlIFNvZnR3YXJlIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24sCitwcm92aWRlZCwgaG93ZXZlciwgdGhhdCB0aGUgQmVPcGVuIFB5dGhvbiBMaWNlbnNlIGlzIHJldGFpbmVkIGluIHRoZQorU29mdHdhcmUsIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlIHZlcnNpb24gcHJlcGFyZWQgYnkgTGljZW5zZWUuCisKKzMuIEJlT3BlbiBpcyBtYWtpbmcgdGhlIFNvZnR3YXJlIGF2YWlsYWJsZSB0byBMaWNlbnNlZSBvbiBhbiAiQVMgSVMiCitiYXNpcy4gIEJFT1BFTiBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUgorSU1QTElFRC4gIEJZIFdBWSBPRiBFWEFNUExFLCBCVVQgTk9UIExJTUlUQVRJT04sIEJFT1BFTiBNQUtFUyBOTyBBTkQKK0RJU0NMQUlNUyBBTlkgUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MKK0ZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFIFVTRSBPRiBUSEUgU09GVFdBUkUgV0lMTCBOT1QKK0lORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBSSUdIVFMuCisKKzQuIEJFT1BFTiBTSEFMTCBOT1QgQkUgTElBQkxFIFRPIExJQ0VOU0VFIE9SIEFOWSBPVEhFUiBVU0VSUyBPRiBUSEUKK1NPRlRXQVJFIEZPUiBBTlkgSU5DSURFTlRBTCwgU1BFQ0lBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIExPU1MKK0FTIEEgUkVTVUxUIE9GIFVTSU5HLCBNT0RJRllJTkcgT1IgRElTVFJJQlVUSU5HIFRIRSBTT0ZUV0FSRSwgT1IgQU5ZCitERVJJVkFUSVZFIFRIRVJFT0YsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgVEhFUkVPRi4KKworNS4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgdGVybWluYXRlIHVwb24gYSBtYXRlcmlhbAorYnJlYWNoIG9mIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucy4KKworNi4gVGhpcyBMaWNlbnNlIEFncmVlbWVudCBzaGFsbCBiZSBnb3Zlcm5lZCBieSBhbmQgaW50ZXJwcmV0ZWQgaW4gYWxsCityZXNwZWN0cyBieSB0aGUgbGF3IG9mIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCBleGNsdWRpbmcgY29uZmxpY3Qgb2YKK2xhdyBwcm92aXNpb25zLiAgTm90aGluZyBpbiB0aGlzIExpY2Vuc2UgQWdyZWVtZW50IHNoYWxsIGJlIGRlZW1lZCB0bworY3JlYXRlIGFueSByZWxhdGlvbnNoaXAgb2YgYWdlbmN5LCBwYXJ0bmVyc2hpcCwgb3Igam9pbnQgdmVudHVyZQorYmV0d2VlbiBCZU9wZW4gYW5kIExpY2Vuc2VlLiAgVGhpcyBMaWNlbnNlIEFncmVlbWVudCBkb2VzIG5vdCBncmFudAorcGVybWlzc2lvbiB0byB1c2UgQmVPcGVuIHRyYWRlbWFya3Mgb3IgdHJhZGUgbmFtZXMgaW4gYSB0cmFkZW1hcmsKK3NlbnNlIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBvciBzZXJ2aWNlcyBvZiBMaWNlbnNlZSwgb3IgYW55Cit0aGlyZCBwYXJ0eS4gIEFzIGFuIGV4Y2VwdGlvbiwgdGhlICJCZU9wZW4gUHl0aG9uIiBsb2dvcyBhdmFpbGFibGUgYXQKK2h0dHA6Ly93d3cucHl0aG9ubGFicy5jb20vbG9nb3MuaHRtbCBtYXkgYmUgdXNlZCBhY2NvcmRpbmcgdG8gdGhlCitwZXJtaXNzaW9ucyBncmFudGVkIG9uIHRoYXQgd2ViIHBhZ2UuCisKKzcuIEJ5IGNvcHlpbmcsIGluc3RhbGxpbmcgb3Igb3RoZXJ3aXNlIHVzaW5nIHRoZSBzb2Z0d2FyZSwgTGljZW5zZWUKK2FncmVlcyB0byBiZSBib3VuZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlCitBZ3JlZW1lbnQuCisKKworQ05SSSBMSUNFTlNFIEFHUkVFTUVOVCBGT1IgUFlUSE9OIDEuNi4xCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworMS4gVGhpcyBMSUNFTlNFIEFHUkVFTUVOVCBpcyBiZXR3ZWVuIHRoZSBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwKK1Jlc2VhcmNoIEluaXRpYXRpdmVzLCBoYXZpbmcgYW4gb2ZmaWNlIGF0IDE4OTUgUHJlc3RvbiBXaGl0ZSBEcml2ZSwKK1Jlc3RvbiwgVkEgMjAxOTEgKCJDTlJJIiksIGFuZCB0aGUgSW5kaXZpZHVhbCBvciBPcmdhbml6YXRpb24KKygiTGljZW5zZWUiKSBhY2Nlc3NpbmcgYW5kIG90aGVyd2lzZSB1c2luZyBQeXRob24gMS42LjEgc29mdHdhcmUgaW4KK3NvdXJjZSBvciBiaW5hcnkgZm9ybSBhbmQgaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbi4KKworMi4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudCwgQ05SSQoraGVyZWJ5IGdyYW50cyBMaWNlbnNlZSBhIG5vbmV4Y2x1c2l2ZSwgcm95YWx0eS1mcmVlLCB3b3JsZC13aWRlCitsaWNlbnNlIHRvIHJlcHJvZHVjZSwgYW5hbHl6ZSwgdGVzdCwgcGVyZm9ybSBhbmQvb3IgZGlzcGxheSBwdWJsaWNseSwKK3ByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcywgZGlzdHJpYnV0ZSwgYW5kIG90aGVyd2lzZSB1c2UgUHl0aG9uIDEuNi4xCithbG9uZSBvciBpbiBhbnkgZGVyaXZhdGl2ZSB2ZXJzaW9uLCBwcm92aWRlZCwgaG93ZXZlciwgdGhhdCBDTlJJJ3MKK0xpY2Vuc2UgQWdyZWVtZW50IGFuZCBDTlJJJ3Mgbm90aWNlIG9mIGNvcHlyaWdodCwgaS5lLiwgIkNvcHlyaWdodCAoYykKKzE5OTUtMjAwMSBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXM7IEFsbCBSaWdodHMKK1Jlc2VydmVkIiBhcmUgcmV0YWluZWQgaW4gUHl0aG9uIDEuNi4xIGFsb25lIG9yIGluIGFueSBkZXJpdmF0aXZlCit2ZXJzaW9uIHByZXBhcmVkIGJ5IExpY2Vuc2VlLiAgQWx0ZXJuYXRlbHksIGluIGxpZXUgb2YgQ05SSSdzIExpY2Vuc2UKK0FncmVlbWVudCwgTGljZW5zZWUgbWF5IHN1YnN0aXR1dGUgdGhlIGZvbGxvd2luZyB0ZXh0IChvbWl0dGluZyB0aGUKK3F1b3Rlcyk6ICJQeXRob24gMS42LjEgaXMgbWFkZSBhdmFpbGFibGUgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kCitjb25kaXRpb25zIGluIENOUkkncyBMaWNlbnNlIEFncmVlbWVudC4gIFRoaXMgQWdyZWVtZW50IHRvZ2V0aGVyIHdpdGgKK1B5dGhvbiAxLjYuMSBtYXkgYmUgbG9jYXRlZCBvbiB0aGUgSW50ZXJuZXQgdXNpbmcgdGhlIGZvbGxvd2luZwordW5pcXVlLCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgKGtub3duIGFzIGEgaGFuZGxlKTogMTg5NS4yMi8xMDEzLiAgVGhpcworQWdyZWVtZW50IG1heSBhbHNvIGJlIG9idGFpbmVkIGZyb20gYSBwcm94eSBzZXJ2ZXIgb24gdGhlIEludGVybmV0Cit1c2luZyB0aGUgZm9sbG93aW5nIFVSTDogaHR0cDovL2hkbC5oYW5kbGUubmV0LzE4OTUuMjIvMTAxMyIuCisKKzMuIEluIHRoZSBldmVudCBMaWNlbnNlZSBwcmVwYXJlcyBhIGRlcml2YXRpdmUgd29yayB0aGF0IGlzIGJhc2VkIG9uCitvciBpbmNvcnBvcmF0ZXMgUHl0aG9uIDEuNi4xIG9yIGFueSBwYXJ0IHRoZXJlb2YsIGFuZCB3YW50cyB0byBtYWtlCit0aGUgZGVyaXZhdGl2ZSB3b3JrIGF2YWlsYWJsZSB0byBvdGhlcnMgYXMgcHJvdmlkZWQgaGVyZWluLCB0aGVuCitMaWNlbnNlZSBoZXJlYnkgYWdyZWVzIHRvIGluY2x1ZGUgaW4gYW55IHN1Y2ggd29yayBhIGJyaWVmIHN1bW1hcnkgb2YKK3RoZSBjaGFuZ2VzIG1hZGUgdG8gUHl0aG9uIDEuNi4xLgorCis0LiBDTlJJIGlzIG1ha2luZyBQeXRob24gMS42LjEgYXZhaWxhYmxlIHRvIExpY2Vuc2VlIG9uIGFuICJBUyBJUyIKK2Jhc2lzLiAgQ05SSSBNQUtFUyBOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUgorSU1QTElFRC4gIEJZIFdBWSBPRiBFWEFNUExFLCBCVVQgTk9UIExJTUlUQVRJT04sIENOUkkgTUFLRVMgTk8gQU5ECitESVNDTEFJTVMgQU5ZIFJFUFJFU0VOVEFUSU9OIE9SIFdBUlJBTlRZIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTCitGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgUFlUSE9OIDEuNi4xIFdJTEwgTk9UCitJTkZSSU5HRSBBTlkgVEhJUkQgUEFSVFkgUklHSFRTLgorCis1LiBDTlJJIFNIQUxMIE5PVCBCRSBMSUFCTEUgVE8gTElDRU5TRUUgT1IgQU5ZIE9USEVSIFVTRVJTIE9GIFBZVEhPTgorMS42LjEgRk9SIEFOWSBJTkNJREVOVEFMLCBTUEVDSUFMLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgTE9TUyBBUworQSBSRVNVTFQgT0YgTU9ESUZZSU5HLCBESVNUUklCVVRJTkcsIE9SIE9USEVSV0lTRSBVU0lORyBQWVRIT04gMS42LjEsCitPUiBBTlkgREVSSVZBVElWRSBUSEVSRU9GLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIFRIRVJFT0YuCisKKzYuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB1cG9uIGEgbWF0ZXJpYWwKK2JyZWFjaCBvZiBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMuCisKKzcuIFRoaXMgTGljZW5zZSBBZ3JlZW1lbnQgc2hhbGwgYmUgZ292ZXJuZWQgYnkgdGhlIGZlZGVyYWwKK2ludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXcgb2YgdGhlIFVuaXRlZCBTdGF0ZXMsIGluY2x1ZGluZyB3aXRob3V0CitsaW1pdGF0aW9uIHRoZSBmZWRlcmFsIGNvcHlyaWdodCBsYXcsIGFuZCwgdG8gdGhlIGV4dGVudCBzdWNoCitVLlMuIGZlZGVyYWwgbGF3IGRvZXMgbm90IGFwcGx5LCBieSB0aGUgbGF3IG9mIHRoZSBDb21tb253ZWFsdGggb2YKK1ZpcmdpbmlhLCBleGNsdWRpbmcgVmlyZ2luaWEncyBjb25mbGljdCBvZiBsYXcgcHJvdmlzaW9ucy4KK05vdHdpdGhzdGFuZGluZyB0aGUgZm9yZWdvaW5nLCB3aXRoIHJlZ2FyZCB0byBkZXJpdmF0aXZlIHdvcmtzIGJhc2VkCitvbiBQeXRob24gMS42LjEgdGhhdCBpbmNvcnBvcmF0ZSBub24tc2VwYXJhYmxlIG1hdGVyaWFsIHRoYXQgd2FzCitwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgdGhlCitsYXcgb2YgdGhlIENvbW1vbndlYWx0aCBvZiBWaXJnaW5pYSBzaGFsbCBnb3Zlcm4gdGhpcyBMaWNlbnNlCitBZ3JlZW1lbnQgb25seSBhcyB0byBpc3N1ZXMgYXJpc2luZyB1bmRlciBvciB3aXRoIHJlc3BlY3QgdG8KK1BhcmFncmFwaHMgNCwgNSwgYW5kIDcgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudC4gIE5vdGhpbmcgaW4gdGhpcworTGljZW5zZSBBZ3JlZW1lbnQgc2hhbGwgYmUgZGVlbWVkIHRvIGNyZWF0ZSBhbnkgcmVsYXRpb25zaGlwIG9mCithZ2VuY3ksIHBhcnRuZXJzaGlwLCBvciBqb2ludCB2ZW50dXJlIGJldHdlZW4gQ05SSSBhbmQgTGljZW5zZWUuICBUaGlzCitMaWNlbnNlIEFncmVlbWVudCBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSBDTlJJIHRyYWRlbWFya3Mgb3IKK3RyYWRlIG5hbWUgaW4gYSB0cmFkZW1hcmsgc2Vuc2UgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIG9yCitzZXJ2aWNlcyBvZiBMaWNlbnNlZSwgb3IgYW55IHRoaXJkIHBhcnR5LgorCis4LiBCeSBjbGlja2luZyBvbiB0aGUgIkFDQ0VQVCIgYnV0dG9uIHdoZXJlIGluZGljYXRlZCwgb3IgYnkgY29weWluZywKK2luc3RhbGxpbmcgb3Igb3RoZXJ3aXNlIHVzaW5nIFB5dGhvbiAxLjYuMSwgTGljZW5zZWUgYWdyZWVzIHRvIGJlCitib3VuZCBieSB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlIEFncmVlbWVudC4KKworICAgICAgICBBQ0NFUFQKKworCitDV0kgTElDRU5TRSBBR1JFRU1FTlQgRk9SIFBZVEhPTiAwLjkuMCBUSFJPVUdIIDEuMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQ29weXJpZ2h0IChjKSAxOTkxIC0gMTk5NSwgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtIEFtc3RlcmRhbSwKK1RoZSBOZXRoZXJsYW5kcy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1Blcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdAorYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCitzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFN0aWNodGluZyBNYXRoZW1hdGlzY2gKK0NlbnRydW0gb3IgQ1dJIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCitkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKK3Blcm1pc3Npb24uCisKK1NUSUNIVElORyBNQVRIRU1BVElTQ0ggQ0VOVFJVTSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KK1RISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQKK0ZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMIFNUSUNIVElORyBNQVRIRU1BVElTQ0ggQ0VOVFJVTSBCRSBMSUFCTEUKK0ZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCitXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KK0FDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCitPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9NaW1lV3JpdGVyLnB5IGIvbGliL3B5dGhvbjIuNy9NaW1lV3JpdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OThmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L01pbWVXcml0ZXIucHkKQEAgLTAsMCArMSwxODYgQEAKKyIiIkdlbmVyaWMgTUlNRSB3cml0ZXIuCisKK1RoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGNsYXNzIE1pbWVXcml0ZXIuICBUaGUgTWltZVdyaXRlciBjbGFzcyBpbXBsZW1lbnRzCithIGJhc2ljIGZvcm1hdHRlciBmb3IgY3JlYXRpbmcgTUlNRSBtdWx0aS1wYXJ0IGZpbGVzLiAgSXQgZG9lc24ndCBzZWVrIGFyb3VuZAordGhlIG91dHB1dCBmaWxlIG5vciBkb2VzIGl0IHVzZSBsYXJnZSBhbW91bnRzIG9mIGJ1ZmZlciBzcGFjZS4gWW91IG11c3Qgd3JpdGUKK3RoZSBwYXJ0cyBvdXQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBzaG91bGQgb2NjdXIgaW4gdGhlIGZpbmFsIGZpbGUuCitNaW1lV3JpdGVyIGRvZXMgYnVmZmVyIHRoZSBoZWFkZXJzIHlvdSBhZGQsIGFsbG93aW5nIHlvdSB0byByZWFycmFuZ2UgdGhlaXIKK29yZGVyLgorCisiIiIKKworCitpbXBvcnQgbWltZXRvb2xzCisKK19fYWxsX18gPSBbIk1pbWVXcml0ZXIiXQorCitpbXBvcnQgd2FybmluZ3MKKword2FybmluZ3Mud2FybigidGhlIE1pbWVXcml0ZXIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgZW1haWwgcGFja2FnZSBpbnN0ZWFkIiwKKyAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2NsYXNzIE1pbWVXcml0ZXI6CisKKyAgICAiIiJHZW5lcmljIE1JTUUgd3JpdGVyLgorCisgICAgTWV0aG9kczoKKworICAgIF9faW5pdF9fKCkKKyAgICBhZGRoZWFkZXIoKQorICAgIGZsdXNoaGVhZGVycygpCisgICAgc3RhcnRib2R5KCkKKyAgICBzdGFydG11bHRpcGFydGJvZHkoKQorICAgIG5leHRwYXJ0KCkKKyAgICBsYXN0cGFydCgpCisKKyAgICBBIE1JTUUgd3JpdGVyIGlzIG11Y2ggbW9yZSBwcmltaXRpdmUgdGhhbiBhIE1JTUUgcGFyc2VyLiAgSXQKKyAgICBkb2Vzbid0IHNlZWsgYXJvdW5kIG9uIHRoZSBvdXRwdXQgZmlsZSwgYW5kIGl0IGRvZXNuJ3QgdXNlIGxhcmdlCisgICAgYW1vdW50cyBvZiBidWZmZXIgc3BhY2UsIHNvIHlvdSBoYXZlIHRvIHdyaXRlIHRoZSBwYXJ0cyBpbiB0aGUKKyAgICBvcmRlciB0aGV5IHNob3VsZCBvY2N1ciBvbiB0aGUgb3V0cHV0IGZpbGUuICBJdCBkb2VzIGJ1ZmZlciB0aGUKKyAgICBoZWFkZXJzIHlvdSBhZGQsIGFsbG93aW5nIHlvdSB0byByZWFycmFuZ2UgdGhlaXIgb3JkZXIuCisKKyAgICBHZW5lcmFsIHVzYWdlIGlzOgorCisgICAgZiA9IDxvcGVuIHRoZSBvdXRwdXQgZmlsZT4KKyAgICB3ID0gTWltZVdyaXRlcihmKQorICAgIC4uLmNhbGwgdy5hZGRoZWFkZXIoa2V5LCB2YWx1ZSkgMCBvciBtb3JlIHRpbWVzLi4uCisKKyAgICBmb2xsb3dlZCBieSBlaXRoZXI6CisKKyAgICBmID0gdy5zdGFydGJvZHkoY29udGVudF90eXBlKQorICAgIC4uLmNhbGwgZi53cml0ZShkYXRhKSBmb3IgYm9keSBkYXRhLi4uCisKKyAgICBvcjoKKworICAgIHcuc3RhcnRtdWx0aXBhcnRib2R5KHN1YnR5cGUpCisgICAgZm9yIGVhY2ggcGFydDoKKyAgICAgICAgc3Vid3JpdGVyID0gdy5uZXh0cGFydCgpCisgICAgICAgIC4uLnVzZSB0aGUgc3Vid3JpdGVyJ3MgbWV0aG9kcyB0byBjcmVhdGUgdGhlIHN1YnBhcnQuLi4KKyAgICB3Lmxhc3RwYXJ0KCkKKworICAgIFRoZSBzdWJ3cml0ZXIgaXMgYW5vdGhlciBNaW1lV3JpdGVyIGluc3RhbmNlLCBhbmQgc2hvdWxkIGJlCisgICAgdHJlYXRlZCBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIHRvcGxldmVsIE1pbWVXcml0ZXIuICBUaGlzIHdheSwKKyAgICB3cml0aW5nIHJlY3Vyc2l2ZSBib2R5IHBhcnRzIGlzIGVhc3kuCisKKyAgICBXYXJuaW5nOiBkb24ndCBmb3JnZXQgdG8gY2FsbCBsYXN0cGFydCgpIQorCisgICAgWFhYIFRoZXJlIHNob3VsZCBiZSBtb3JlIHN0YXRlIHNvIGNhbGxzIG1hZGUgaW4gdGhlIHdyb25nIG9yZGVyCisgICAgYXJlIGRldGVjdGVkLgorCisgICAgU29tZSBzcGVjaWFsIGNhc2VzOgorCisgICAgLSBzdGFydGJvZHkoKSBqdXN0IHJldHVybnMgdGhlIGZpbGUgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvcjsKKyAgICAgIGJ1dCBkb24ndCB1c2UgdGhpcyBrbm93bGVkZ2UsIGFzIGl0IG1heSBiZSBjaGFuZ2VkLgorCisgICAgLSBzdGFydG11bHRpcGFydGJvZHkoKSBhY3R1YWxseSByZXR1cm5zIGEgZmlsZSBhcyB3ZWxsOworICAgICAgdGhpcyBjYW4gYmUgdXNlZCB0byB3cml0ZSB0aGUgaW5pdGlhbCAnaWYgeW91IGNhbiByZWFkIHRoaXMgeW91cgorICAgICAgbWFpbGVyIGlzIG5vdCBNSU1FLWF3YXJlJyBtZXNzYWdlLgorCisgICAgLSBJZiB5b3UgY2FsbCBmbHVzaGhlYWRlcnMoKSwgdGhlIGhlYWRlcnMgYWNjdW11bGF0ZWQgc28gZmFyIGFyZQorICAgICAgd3JpdHRlbiBvdXQgKGFuZCBmb3Jnb3R0ZW4pOyB0aGlzIGlzIHVzZWZ1bCBpZiB5b3UgZG9uJ3QgbmVlZCBhCisgICAgICBib2R5IHBhcnQgYXQgYWxsLCBlLmcuIGZvciBhIHN1YnBhcnQgb2YgdHlwZSBtZXNzYWdlL3JmYzgyMgorICAgICAgdGhhdCdzIChtaXMpdXNlZCB0byBzdG9yZSBzb21lIGhlYWRlci1saWtlIGluZm9ybWF0aW9uLgorCisgICAgLSBQYXNzaW5nIGEga2V5d29yZCBhcmd1bWVudCAncHJlZml4PTxmbGFnPicgdG8gYWRkaGVhZGVyKCksCisgICAgICBzdGFydCpib2R5KCkgYWZmZWN0cyB3aGVyZSB0aGUgaGVhZGVyIGlzIGluc2VydGVkOyAwIG1lYW5zCisgICAgICBhcHBlbmQgYXQgdGhlIGVuZCwgMSBtZWFucyBpbnNlcnQgYXQgdGhlIHN0YXJ0OyBkZWZhdWx0IGlzCisgICAgICBhcHBlbmQgZm9yIGFkZGhlYWRlcigpLCBidXQgaW5zZXJ0IGZvciBzdGFydCpib2R5KCksIHdoaWNoIHVzZQorICAgICAgaXQgdG8gZGV0ZXJtaW5lIHdoZXJlIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGdvZXMuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCk6CisgICAgICAgIHNlbGYuX2ZwID0gZnAKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IFtdCisKKyAgICBkZWYgYWRkaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUsIHByZWZpeD0wKToKKyAgICAgICAgIiIiQWRkIGEgaGVhZGVyIGxpbmUgdG8gdGhlIE1JTUUgbWVzc2FnZS4KKworICAgICAgICBUaGUga2V5IGlzIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIsIHdoZXJlIHRoZSB2YWx1ZSBvYnZpb3VzbHkgcHJvdmlkZXMKKyAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIuIFRoZSBvcHRpb25hbCBhcmd1bWVudCBwcmVmaXggZGV0ZXJtaW5lcworICAgICAgICB3aGVyZSB0aGUgaGVhZGVyIGlzIGluc2VydGVkOyAwIG1lYW5zIGFwcGVuZCBhdCB0aGUgZW5kLCAxIG1lYW5zCisgICAgICAgIGluc2VydCBhdCB0aGUgc3RhcnQuIFRoZSBkZWZhdWx0IGlzIHRvIGFwcGVuZC4KKworICAgICAgICAiIiIKKyAgICAgICAgbGluZXMgPSB2YWx1ZS5zcGxpdCgiXG4iKQorICAgICAgICB3aGlsZSBsaW5lcyBhbmQgbm90IGxpbmVzWy0xXTogZGVsIGxpbmVzWy0xXQorICAgICAgICB3aGlsZSBsaW5lcyBhbmQgbm90IGxpbmVzWzBdOiBkZWwgbGluZXNbMF0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKGxpbmVzKSk6CisgICAgICAgICAgICBsaW5lc1tpXSA9ICIgICAgIiArIGxpbmVzW2ldLnN0cmlwKCkKKyAgICAgICAgdmFsdWUgPSAiXG4iLmpvaW4obGluZXMpICsgIlxuIgorICAgICAgICBsaW5lID0ga2V5ICsgIjogIiArIHZhbHVlCisgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgIHNlbGYuX2hlYWRlcnMuaW5zZXJ0KDAsIGxpbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZChsaW5lKQorCisgICAgZGVmIGZsdXNoaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiV3JpdGVzIG91dCBhbmQgZm9yZ2V0cyBhbGwgaGVhZGVycyBhY2N1bXVsYXRlZCBzbyBmYXIuCisKKyAgICAgICAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGRvbid0IG5lZWQgYSBib2R5IHBhcnQgYXQgYWxsOyBmb3IgZXhhbXBsZSwKKyAgICAgICAgZm9yIGEgc3VicGFydCBvZiB0eXBlIG1lc3NhZ2UvcmZjODIyIHRoYXQncyAobWlzKXVzZWQgdG8gc3RvcmUgc29tZQorICAgICAgICBoZWFkZXItbGlrZSBpbmZvcm1hdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZnAud3JpdGVsaW5lcyhzZWxmLl9oZWFkZXJzKQorICAgICAgICBzZWxmLl9oZWFkZXJzID0gW10KKworICAgIGRlZiBzdGFydGJvZHkoc2VsZiwgY3R5cGUsIHBsaXN0PVtdLCBwcmVmaXg9MSk6CisgICAgICAgICIiIlJldHVybnMgYSBmaWxlLWxpa2Ugb2JqZWN0IGZvciB3cml0aW5nIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorCisgICAgICAgIFRoZSBjb250ZW50LXR5cGUgaXMgc2V0IHRvIHRoZSBwcm92aWRlZCBjdHlwZSwgYW5kIHRoZSBvcHRpb25hbAorICAgICAgICBwYXJhbWV0ZXIsIHBsaXN0LCBwcm92aWRlcyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZQorICAgICAgICBjb250ZW50LXR5cGUgZGVjbGFyYXRpb24uICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgcHJlZml4IGRldGVybWluZXMKKyAgICAgICAgd2hlcmUgdGhlIGhlYWRlciBpcyBpbnNlcnRlZDsgMCBtZWFucyBhcHBlbmQgYXQgdGhlIGVuZCwgMSBtZWFucworICAgICAgICBpbnNlcnQgYXQgdGhlIHN0YXJ0LiBUaGUgZGVmYXVsdCBpcyB0byBpbnNlcnQgYXQgdGhlIHN0YXJ0LgorCisgICAgICAgICIiIgorICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gcGxpc3Q6CisgICAgICAgICAgICBjdHlwZSA9IGN0eXBlICsgJztcbiAlcz1cIiVzXCInICUgKG5hbWUsIHZhbHVlKQorICAgICAgICBzZWxmLmFkZGhlYWRlcigiQ29udGVudC1UeXBlIiwgY3R5cGUsIHByZWZpeD1wcmVmaXgpCisgICAgICAgIHNlbGYuZmx1c2hoZWFkZXJzKCkKKyAgICAgICAgc2VsZi5fZnAud3JpdGUoIlxuIikKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZwCisKKyAgICBkZWYgc3RhcnRtdWx0aXBhcnRib2R5KHNlbGYsIHN1YnR5cGUsIGJvdW5kYXJ5PU5vbmUsIHBsaXN0PVtdLCBwcmVmaXg9MSk6CisgICAgICAgICIiIlJldHVybnMgYSBmaWxlLWxpa2Ugb2JqZWN0IGZvciB3cml0aW5nIHRoZSBib2R5IG9mIHRoZSBtZXNzYWdlLgorCisgICAgICAgIEFkZGl0aW9uYWxseSwgdGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIG11bHRpLXBhcnQgY29kZSwgd2hlcmUgdGhlCisgICAgICAgIHN1YnR5cGUgcGFyYW1ldGVyIHByb3ZpZGVzIHRoZSBtdWx0aXBhcnQgc3VidHlwZSwgdGhlIGJvdW5kYXJ5CisgICAgICAgIHBhcmFtZXRlciBtYXkgcHJvdmlkZSBhIHVzZXItZGVmaW5lZCBib3VuZGFyeSBzcGVjaWZpY2F0aW9uLCBhbmQgdGhlCisgICAgICAgIHBsaXN0IHBhcmFtZXRlciBwcm92aWRlcyBvcHRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgc3VidHlwZS4gIFRoZQorICAgICAgICBvcHRpb25hbCBhcmd1bWVudCwgcHJlZml4LCBkZXRlcm1pbmVzIHdoZXJlIHRoZSBoZWFkZXIgaXMgaW5zZXJ0ZWQ7CisgICAgICAgIDAgbWVhbnMgYXBwZW5kIGF0IHRoZSBlbmQsIDEgbWVhbnMgaW5zZXJ0IGF0IHRoZSBzdGFydC4gVGhlIGRlZmF1bHQKKyAgICAgICAgaXMgdG8gaW5zZXJ0IGF0IHRoZSBzdGFydC4gIFN1YnBhcnRzIHNob3VsZCBiZSBjcmVhdGVkIHVzaW5nIHRoZQorICAgICAgICBuZXh0cGFydCgpIG1ldGhvZC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fYm91bmRhcnkgPSBib3VuZGFyeSBvciBtaW1ldG9vbHMuY2hvb3NlX2JvdW5kYXJ5KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RhcnRib2R5KCJtdWx0aXBhcnQvIiArIHN1YnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJib3VuZGFyeSIsIHNlbGYuX2JvdW5kYXJ5KV0gKyBwbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1wcmVmaXgpCisKKyAgICBkZWYgbmV4dHBhcnQoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgTWltZVdyaXRlciB3aGljaCByZXByZXNlbnRzIGFuCisgICAgICAgIGluZGl2aWR1YWwgcGFydCBpbiBhIG11bHRpcGFydCBtZXNzYWdlLgorCisgICAgICAgIFRoaXMgbWF5IGJlIHVzZWQgdG8gd3JpdGUgdGhlIHBhcnQgYXMgd2VsbCBhcyB1c2VkIGZvciBjcmVhdGluZworICAgICAgICByZWN1cnNpdmVseSBjb21wbGV4IG11bHRpcGFydCBtZXNzYWdlcy4gVGhlIG1lc3NhZ2UgbXVzdCBmaXJzdCBiZQorICAgICAgICBpbml0aWFsaXplZCB3aXRoIHRoZSBzdGFydG11bHRpcGFydGJvZHkoKSBtZXRob2QgYmVmb3JlIHVzaW5nIHRoZQorICAgICAgICBuZXh0cGFydCgpIG1ldGhvZC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZnAud3JpdGUoIlxuLS0iICsgc2VsZi5fYm91bmRhcnkgKyAiXG4iKQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5fZnApCisKKyAgICBkZWYgbGFzdHBhcnQoc2VsZik6CisgICAgICAgICIiIlRoaXMgaXMgdXNlZCB0byBkZXNpZ25hdGUgdGhlIGxhc3QgcGFydCBvZiBhIG11bHRpcGFydCBtZXNzYWdlLgorCisgICAgICAgIEl0IHNob3VsZCBhbHdheXMgYmUgdXNlZCB3aGVuIHdyaXRpbmcgbXVsdGlwYXJ0IG1lc3NhZ2VzLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9mcC53cml0ZSgiXG4tLSIgKyBzZWxmLl9ib3VuZGFyeSArICItLVxuIikKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0ZXN0LnRlc3RfTWltZVdyaXRlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9NaW1lV3JpdGVyLnB5YyBiL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwYzg2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9NaW1lV3JpdGVyLnB5byBiL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwYzg2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvTWltZVdyaXRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9RdWV1ZS5weSBiL2xpYi9weXRob24yLjcvUXVldWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiOGQ3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvUXVldWUucHkKQEAgLTAsMCArMSwyNDQgQEAKKyIiIkEgbXVsdGktcHJvZHVjZXIsIG11bHRpLWNvbnN1bWVyIHF1ZXVlLiIiIgorCitmcm9tIHRpbWUgaW1wb3J0IHRpbWUgYXMgX3RpbWUKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nIGFzIF90aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIF90aHJlYWRpbmcKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitpbXBvcnQgaGVhcHEKKworX19hbGxfXyA9IFsnRW1wdHknLCAnRnVsbCcsICdRdWV1ZScsICdQcmlvcml0eVF1ZXVlJywgJ0xpZm9RdWV1ZSddCisKK2NsYXNzIEVtcHR5KEV4Y2VwdGlvbik6CisgICAgIkV4Y2VwdGlvbiByYWlzZWQgYnkgUXVldWUuZ2V0KGJsb2NrPTApL2dldF9ub3dhaXQoKS4iCisgICAgcGFzcworCitjbGFzcyBGdWxsKEV4Y2VwdGlvbik6CisgICAgIkV4Y2VwdGlvbiByYWlzZWQgYnkgUXVldWUucHV0KGJsb2NrPTApL3B1dF9ub3dhaXQoKS4iCisgICAgcGFzcworCitjbGFzcyBRdWV1ZToKKyAgICAiIiJDcmVhdGUgYSBxdWV1ZSBvYmplY3Qgd2l0aCBhIGdpdmVuIG1heGltdW0gc2l6ZS4KKworICAgIElmIG1heHNpemUgaXMgPD0gMCwgdGhlIHF1ZXVlIHNpemUgaXMgaW5maW5pdGUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heHNpemU9MCk6CisgICAgICAgIHNlbGYubWF4c2l6ZSA9IG1heHNpemUKKyAgICAgICAgc2VsZi5faW5pdChtYXhzaXplKQorICAgICAgICAjIG11dGV4IG11c3QgYmUgaGVsZCB3aGVuZXZlciB0aGUgcXVldWUgaXMgbXV0YXRpbmcuICBBbGwgbWV0aG9kcworICAgICAgICAjIHRoYXQgYWNxdWlyZSBtdXRleCBtdXN0IHJlbGVhc2UgaXQgYmVmb3JlIHJldHVybmluZy4gIG11dGV4CisgICAgICAgICMgaXMgc2hhcmVkIGJldHdlZW4gdGhlIHRocmVlIGNvbmRpdGlvbnMsIHNvIGFjcXVpcmluZyBhbmQKKyAgICAgICAgIyByZWxlYXNpbmcgdGhlIGNvbmRpdGlvbnMgYWxzbyBhY3F1aXJlcyBhbmQgcmVsZWFzZXMgbXV0ZXguCisgICAgICAgIHNlbGYubXV0ZXggPSBfdGhyZWFkaW5nLkxvY2soKQorICAgICAgICAjIE5vdGlmeSBub3RfZW1wdHkgd2hlbmV2ZXIgYW4gaXRlbSBpcyBhZGRlZCB0byB0aGUgcXVldWU7IGEKKyAgICAgICAgIyB0aHJlYWQgd2FpdGluZyB0byBnZXQgaXMgbm90aWZpZWQgdGhlbi4KKyAgICAgICAgc2VsZi5ub3RfZW1wdHkgPSBfdGhyZWFkaW5nLkNvbmRpdGlvbihzZWxmLm11dGV4KQorICAgICAgICAjIE5vdGlmeSBub3RfZnVsbCB3aGVuZXZlciBhbiBpdGVtIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWU7CisgICAgICAgICMgYSB0aHJlYWQgd2FpdGluZyB0byBwdXQgaXMgbm90aWZpZWQgdGhlbi4KKyAgICAgICAgc2VsZi5ub3RfZnVsbCA9IF90aHJlYWRpbmcuQ29uZGl0aW9uKHNlbGYubXV0ZXgpCisgICAgICAgICMgTm90aWZ5IGFsbF90YXNrc19kb25lIHdoZW5ldmVyIHRoZSBudW1iZXIgb2YgdW5maW5pc2hlZCB0YXNrcworICAgICAgICAjIGRyb3BzIHRvIHplcm87IHRocmVhZCB3YWl0aW5nIHRvIGpvaW4oKSBpcyBub3RpZmllZCB0byByZXN1bWUKKyAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZSA9IF90aHJlYWRpbmcuQ29uZGl0aW9uKHNlbGYubXV0ZXgpCisgICAgICAgIHNlbGYudW5maW5pc2hlZF90YXNrcyA9IDAKKworICAgIGRlZiB0YXNrX2RvbmUoc2VsZik6CisgICAgICAgICIiIkluZGljYXRlIHRoYXQgYSBmb3JtZXJseSBlbnF1ZXVlZCB0YXNrIGlzIGNvbXBsZXRlLgorCisgICAgICAgIFVzZWQgYnkgUXVldWUgY29uc3VtZXIgdGhyZWFkcy4gIEZvciBlYWNoIGdldCgpIHVzZWQgdG8gZmV0Y2ggYSB0YXNrLAorICAgICAgICBhIHN1YnNlcXVlbnQgY2FsbCB0byB0YXNrX2RvbmUoKSB0ZWxscyB0aGUgcXVldWUgdGhhdCB0aGUgcHJvY2Vzc2luZworICAgICAgICBvbiB0aGUgdGFzayBpcyBjb21wbGV0ZS4KKworICAgICAgICBJZiBhIGpvaW4oKSBpcyBjdXJyZW50bHkgYmxvY2tpbmcsIGl0IHdpbGwgcmVzdW1lIHdoZW4gYWxsIGl0ZW1zCisgICAgICAgIGhhdmUgYmVlbiBwcm9jZXNzZWQgKG1lYW5pbmcgdGhhdCBhIHRhc2tfZG9uZSgpIGNhbGwgd2FzIHJlY2VpdmVkCisgICAgICAgIGZvciBldmVyeSBpdGVtIHRoYXQgaGFkIGJlZW4gcHV0KCkgaW50byB0aGUgcXVldWUpLgorCisgICAgICAgIFJhaXNlcyBhIFZhbHVlRXJyb3IgaWYgY2FsbGVkIG1vcmUgdGltZXMgdGhhbiB0aGVyZSB3ZXJlIGl0ZW1zCisgICAgICAgIHBsYWNlZCBpbiB0aGUgcXVldWUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmZpbmlzaGVkID0gc2VsZi51bmZpbmlzaGVkX3Rhc2tzIC0gMQorICAgICAgICAgICAgaWYgdW5maW5pc2hlZCA8PSAwOgorICAgICAgICAgICAgICAgIGlmIHVuZmluaXNoZWQgPCAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0YXNrX2RvbmUoKSBjYWxsZWQgdG9vIG1hbnkgdGltZXMnKQorICAgICAgICAgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUubm90aWZ5X2FsbCgpCisgICAgICAgICAgICBzZWxmLnVuZmluaXNoZWRfdGFza3MgPSB1bmZpbmlzaGVkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLnJlbGVhc2UoKQorCisgICAgZGVmIGpvaW4oc2VsZik6CisgICAgICAgICIiIkJsb2NrcyB1bnRpbCBhbGwgaXRlbXMgaW4gdGhlIFF1ZXVlIGhhdmUgYmVlbiBnb3R0ZW4gYW5kIHByb2Nlc3NlZC4KKworICAgICAgICBUaGUgY291bnQgb2YgdW5maW5pc2hlZCB0YXNrcyBnb2VzIHVwIHdoZW5ldmVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlCisgICAgICAgIHF1ZXVlLiBUaGUgY291bnQgZ29lcyBkb3duIHdoZW5ldmVyIGEgY29uc3VtZXIgdGhyZWFkIGNhbGxzIHRhc2tfZG9uZSgpCisgICAgICAgIHRvIGluZGljYXRlIHRoZSBpdGVtIHdhcyByZXRyaWV2ZWQgYW5kIGFsbCB3b3JrIG9uIGl0IGlzIGNvbXBsZXRlLgorCisgICAgICAgIFdoZW4gdGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZHJvcHMgdG8gemVybywgam9pbigpIHVuYmxvY2tzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgc2VsZi51bmZpbmlzaGVkX3Rhc2tzOgorICAgICAgICAgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUud2FpdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLnJlbGVhc2UoKQorCisgICAgZGVmIHFzaXplKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGFwcHJveGltYXRlIHNpemUgb2YgdGhlIHF1ZXVlIChub3QgcmVsaWFibGUhKS4iIiIKKyAgICAgICAgc2VsZi5tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgbiA9IHNlbGYuX3FzaXplKCkKKyAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIG4KKworICAgIGRlZiBlbXB0eShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIHF1ZXVlIGlzIGVtcHR5LCBGYWxzZSBvdGhlcndpc2UgKG5vdCByZWxpYWJsZSEpLiIiIgorICAgICAgICBzZWxmLm11dGV4LmFjcXVpcmUoKQorICAgICAgICBuID0gbm90IHNlbGYuX3FzaXplKCkKKyAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIG4KKworICAgIGRlZiBmdWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgcXVldWUgaXMgZnVsbCwgRmFsc2Ugb3RoZXJ3aXNlIChub3QgcmVsaWFibGUhKS4iIiIKKyAgICAgICAgc2VsZi5tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgbiA9IDAgPCBzZWxmLm1heHNpemUgPT0gc2VsZi5fcXNpemUoKQorICAgICAgICBzZWxmLm11dGV4LnJlbGVhc2UoKQorICAgICAgICByZXR1cm4gbgorCisgICAgZGVmIHB1dChzZWxmLCBpdGVtLCBibG9jaz1UcnVlLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJQdXQgYW4gaXRlbSBpbnRvIHRoZSBxdWV1ZS4KKworICAgICAgICBJZiBvcHRpb25hbCBhcmdzICdibG9jaycgaXMgdHJ1ZSBhbmQgJ3RpbWVvdXQnIGlzIE5vbmUgKHRoZSBkZWZhdWx0KSwKKyAgICAgICAgYmxvY2sgaWYgbmVjZXNzYXJ5IHVudGlsIGEgZnJlZSBzbG90IGlzIGF2YWlsYWJsZS4gSWYgJ3RpbWVvdXQnIGlzCisgICAgICAgIGEgcG9zaXRpdmUgbnVtYmVyLCBpdCBibG9ja3MgYXQgbW9zdCAndGltZW91dCcgc2Vjb25kcyBhbmQgcmFpc2VzCisgICAgICAgIHRoZSBGdWxsIGV4Y2VwdGlvbiBpZiBubyBmcmVlIHNsb3Qgd2FzIGF2YWlsYWJsZSB3aXRoaW4gdGhhdCB0aW1lLgorICAgICAgICBPdGhlcndpc2UgKCdibG9jaycgaXMgZmFsc2UpLCBwdXQgYW4gaXRlbSBvbiB0aGUgcXVldWUgaWYgYSBmcmVlIHNsb3QKKyAgICAgICAgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLCBlbHNlIHJhaXNlIHRoZSBGdWxsIGV4Y2VwdGlvbiAoJ3RpbWVvdXQnCisgICAgICAgIGlzIGlnbm9yZWQgaW4gdGhhdCBjYXNlKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubm90X2Z1bGwuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYubWF4c2l6ZSA+IDA6CisgICAgICAgICAgICAgICAgaWYgbm90IGJsb2NrOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9xc2l6ZSgpID09IHNlbGYubWF4c2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEZ1bGwKKyAgICAgICAgICAgICAgICBlbGlmIHRpbWVvdXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi5fcXNpemUoKSA9PSBzZWxmLm1heHNpemU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9mdWxsLndhaXQoKQorICAgICAgICAgICAgICAgIGVsaWYgdGltZW91dCA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIid0aW1lb3V0JyBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlbmR0aW1lID0gX3RpbWUoKSArIHRpbWVvdXQKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi5fcXNpemUoKSA9PSBzZWxmLm1heHNpemU6CisgICAgICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBlbmR0aW1lIC0gX3RpbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVtYWluaW5nIDw9IDAuMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBGdWxsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9mdWxsLndhaXQocmVtYWluaW5nKQorICAgICAgICAgICAgc2VsZi5fcHV0KGl0ZW0pCisgICAgICAgICAgICBzZWxmLnVuZmluaXNoZWRfdGFza3MgKz0gMQorICAgICAgICAgICAgc2VsZi5ub3RfZW1wdHkubm90aWZ5KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYubm90X2Z1bGwucmVsZWFzZSgpCisKKyAgICBkZWYgcHV0X25vd2FpdChzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiUHV0IGFuIGl0ZW0gaW50byB0aGUgcXVldWUgd2l0aG91dCBibG9ja2luZy4KKworICAgICAgICBPbmx5IGVucXVldWUgdGhlIGl0ZW0gaWYgYSBmcmVlIHNsb3QgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgorICAgICAgICBPdGhlcndpc2UgcmFpc2UgdGhlIEZ1bGwgZXhjZXB0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHV0KGl0ZW0sIEZhbHNlKQorCisgICAgZGVmIGdldChzZWxmLCBibG9jaz1UcnVlLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJSZW1vdmUgYW5kIHJldHVybiBhbiBpdGVtIGZyb20gdGhlIHF1ZXVlLgorCisgICAgICAgIElmIG9wdGlvbmFsIGFyZ3MgJ2Jsb2NrJyBpcyB0cnVlIGFuZCAndGltZW91dCcgaXMgTm9uZSAodGhlIGRlZmF1bHQpLAorICAgICAgICBibG9jayBpZiBuZWNlc3NhcnkgdW50aWwgYW4gaXRlbSBpcyBhdmFpbGFibGUuIElmICd0aW1lb3V0JyBpcworICAgICAgICBhIHBvc2l0aXZlIG51bWJlciwgaXQgYmxvY2tzIGF0IG1vc3QgJ3RpbWVvdXQnIHNlY29uZHMgYW5kIHJhaXNlcworICAgICAgICB0aGUgRW1wdHkgZXhjZXB0aW9uIGlmIG5vIGl0ZW0gd2FzIGF2YWlsYWJsZSB3aXRoaW4gdGhhdCB0aW1lLgorICAgICAgICBPdGhlcndpc2UgKCdibG9jaycgaXMgZmFsc2UpLCByZXR1cm4gYW4gaXRlbSBpZiBvbmUgaXMgaW1tZWRpYXRlbHkKKyAgICAgICAgYXZhaWxhYmxlLCBlbHNlIHJhaXNlIHRoZSBFbXB0eSBleGNlcHRpb24gKCd0aW1lb3V0JyBpcyBpZ25vcmVkCisgICAgICAgIGluIHRoYXQgY2FzZSkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm5vdF9lbXB0eS5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IGJsb2NrOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9xc2l6ZSgpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFbXB0eQorICAgICAgICAgICAgZWxpZiB0aW1lb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYuX3FzaXplKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VtcHR5LndhaXQoKQorICAgICAgICAgICAgZWxpZiB0aW1lb3V0IDwgMDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCIndGltZW91dCcgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuZHRpbWUgPSBfdGltZSgpICsgdGltZW91dAorICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9xc2l6ZSgpOgorICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBlbmR0aW1lIC0gX3RpbWUoKQorICAgICAgICAgICAgICAgICAgICBpZiByZW1haW5pbmcgPD0gMC4wOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRW1wdHkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3RfZW1wdHkud2FpdChyZW1haW5pbmcpCisgICAgICAgICAgICBpdGVtID0gc2VsZi5fZ2V0KCkKKyAgICAgICAgICAgIHNlbGYubm90X2Z1bGwubm90aWZ5KCkKKyAgICAgICAgICAgIHJldHVybiBpdGVtCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLm5vdF9lbXB0eS5yZWxlYXNlKCkKKworICAgIGRlZiBnZXRfbm93YWl0KHNlbGYpOgorICAgICAgICAiIiJSZW1vdmUgYW5kIHJldHVybiBhbiBpdGVtIGZyb20gdGhlIHF1ZXVlIHdpdGhvdXQgYmxvY2tpbmcuCisKKyAgICAgICAgT25seSBnZXQgYW4gaXRlbSBpZiBvbmUgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLiBPdGhlcndpc2UKKyAgICAgICAgcmFpc2UgdGhlIEVtcHR5IGV4Y2VwdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldChGYWxzZSkKKworICAgICMgT3ZlcnJpZGUgdGhlc2UgbWV0aG9kcyB0byBpbXBsZW1lbnQgb3RoZXIgcXVldWUgb3JnYW5pemF0aW9ucworICAgICMgKGUuZy4gc3RhY2sgb3IgcHJpb3JpdHkgcXVldWUpLgorICAgICMgVGhlc2Ugd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIGFwcHJvcHJpYXRlIGxvY2tzIGhlbGQKKworICAgICMgSW5pdGlhbGl6ZSB0aGUgcXVldWUgcmVwcmVzZW50YXRpb24KKyAgICBkZWYgX2luaXQoc2VsZiwgbWF4c2l6ZSk6CisgICAgICAgIHNlbGYucXVldWUgPSBkZXF1ZSgpCisKKyAgICBkZWYgX3FzaXplKHNlbGYsIGxlbj1sZW4pOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYucXVldWUpCisKKyAgICAjIFB1dCBhIG5ldyBpdGVtIGluIHRoZSBxdWV1ZQorICAgIGRlZiBfcHV0KHNlbGYsIGl0ZW0pOgorICAgICAgICBzZWxmLnF1ZXVlLmFwcGVuZChpdGVtKQorCisgICAgIyBHZXQgYW4gaXRlbSBmcm9tIHRoZSBxdWV1ZQorICAgIGRlZiBfZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5xdWV1ZS5wb3BsZWZ0KCkKKworCitjbGFzcyBQcmlvcml0eVF1ZXVlKFF1ZXVlKToKKyAgICAnJydWYXJpYW50IG9mIFF1ZXVlIHRoYXQgcmV0cmlldmVzIG9wZW4gZW50cmllcyBpbiBwcmlvcml0eSBvcmRlciAobG93ZXN0IGZpcnN0KS4KKworICAgIEVudHJpZXMgYXJlIHR5cGljYWxseSB0dXBsZXMgb2YgdGhlIGZvcm06ICAocHJpb3JpdHkgbnVtYmVyLCBkYXRhKS4KKyAgICAnJycKKworICAgIGRlZiBfaW5pdChzZWxmLCBtYXhzaXplKToKKyAgICAgICAgc2VsZi5xdWV1ZSA9IFtdCisKKyAgICBkZWYgX3FzaXplKHNlbGYsIGxlbj1sZW4pOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYucXVldWUpCisKKyAgICBkZWYgX3B1dChzZWxmLCBpdGVtLCBoZWFwcHVzaD1oZWFwcS5oZWFwcHVzaCk6CisgICAgICAgIGhlYXBwdXNoKHNlbGYucXVldWUsIGl0ZW0pCisKKyAgICBkZWYgX2dldChzZWxmLCBoZWFwcG9wPWhlYXBxLmhlYXBwb3ApOgorICAgICAgICByZXR1cm4gaGVhcHBvcChzZWxmLnF1ZXVlKQorCisKK2NsYXNzIExpZm9RdWV1ZShRdWV1ZSk6CisgICAgJycnVmFyaWFudCBvZiBRdWV1ZSB0aGF0IHJldHJpZXZlcyBtb3N0IHJlY2VudGx5IGFkZGVkIGVudHJpZXMgZmlyc3QuJycnCisKKyAgICBkZWYgX2luaXQoc2VsZiwgbWF4c2l6ZSk6CisgICAgICAgIHNlbGYucXVldWUgPSBbXQorCisgICAgZGVmIF9xc2l6ZShzZWxmLCBsZW49bGVuKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnF1ZXVlKQorCisgICAgZGVmIF9wdXQoc2VsZiwgaXRlbSk6CisgICAgICAgIHNlbGYucXVldWUuYXBwZW5kKGl0ZW0pCisKKyAgICBkZWYgX2dldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucXVldWUucG9wKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvUXVldWUucHljIGIvbGliL3B5dGhvbjIuNy9RdWV1ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzOGE5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvUXVldWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvUXVldWUucHlvIGIvbGliL3B5dGhvbjIuNy9RdWV1ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzOGE5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvUXVldWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weSBiL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTAzMzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9TaW1wbGVIVFRQU2VydmVyLnB5CkBAIC0wLDAgKzEsMjIwIEBACisiIiJTaW1wbGUgSFRUUCBTZXJ2ZXIuCisKK1RoaXMgbW9kdWxlIGJ1aWxkcyBvbiBCYXNlSFRUUFNlcnZlciBieSBpbXBsZW1lbnRpbmcgdGhlIHN0YW5kYXJkIEdFVAorYW5kIEhFQUQgcmVxdWVzdHMgaW4gYSBmYWlybHkgc3RyYWlnaHRmb3J3YXJkIG1hbm5lci4KKworIiIiCisKKworX192ZXJzaW9uX18gPSAiMC42IgorCitfX2FsbF9fID0gWyJTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIiXQorCitpbXBvcnQgb3MKK2ltcG9ydCBwb3NpeHBhdGgKK2ltcG9ydCBCYXNlSFRUUFNlcnZlcgoraW1wb3J0IHVybGxpYgoraW1wb3J0IGNnaQoraW1wb3J0IHN5cworaW1wb3J0IHNodXRpbAoraW1wb3J0IG1pbWV0eXBlcwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKworY2xhc3MgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorCisgICAgIiIiU2ltcGxlIEhUVFAgcmVxdWVzdCBoYW5kbGVyIHdpdGggR0VUIGFuZCBIRUFEIGNvbW1hbmRzLgorCisgICAgVGhpcyBzZXJ2ZXMgZmlsZXMgZnJvbSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGFueSBvZiBpdHMKKyAgICBzdWJkaXJlY3Rvcmllcy4gIFRoZSBNSU1FIHR5cGUgZm9yIGZpbGVzIGlzIGRldGVybWluZWQgYnkKKyAgICBjYWxsaW5nIHRoZSAuZ3Vlc3NfdHlwZSgpIG1ldGhvZC4KKworICAgIFRoZSBHRVQgYW5kIEhFQUQgcmVxdWVzdHMgYXJlIGlkZW50aWNhbCBleGNlcHQgdGhhdCB0aGUgSEVBRAorICAgIHJlcXVlc3Qgb21pdHMgdGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGUgZmlsZS4KKworICAgICIiIgorCisgICAgc2VydmVyX3ZlcnNpb24gPSAiU2ltcGxlSFRUUC8iICsgX192ZXJzaW9uX18KKworICAgIGRlZiBkb19HRVQoc2VsZik6CisgICAgICAgICIiIlNlcnZlIGEgR0VUIHJlcXVlc3QuIiIiCisgICAgICAgIGYgPSBzZWxmLnNlbmRfaGVhZCgpCisgICAgICAgIGlmIGY6CisgICAgICAgICAgICBzZWxmLmNvcHlmaWxlKGYsIHNlbGYud2ZpbGUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBkb19IRUFEKHNlbGYpOgorICAgICAgICAiIiJTZXJ2ZSBhIEhFQUQgcmVxdWVzdC4iIiIKKyAgICAgICAgZiA9IHNlbGYuc2VuZF9oZWFkKCkKKyAgICAgICAgaWYgZjoKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHNlbmRfaGVhZChzZWxmKToKKyAgICAgICAgIiIiQ29tbW9uIGNvZGUgZm9yIEdFVCBhbmQgSEVBRCBjb21tYW5kcy4KKworICAgICAgICBUaGlzIHNlbmRzIHRoZSByZXNwb25zZSBjb2RlIGFuZCBNSU1FIGhlYWRlcnMuCisKKyAgICAgICAgUmV0dXJuIHZhbHVlIGlzIGVpdGhlciBhIGZpbGUgb2JqZWN0ICh3aGljaCBoYXMgdG8gYmUgY29waWVkCisgICAgICAgIHRvIHRoZSBvdXRwdXRmaWxlIGJ5IHRoZSBjYWxsZXIgdW5sZXNzIHRoZSBjb21tYW5kIHdhcyBIRUFELAorICAgICAgICBhbmQgbXVzdCBiZSBjbG9zZWQgYnkgdGhlIGNhbGxlciB1bmRlciBhbGwgY2lyY3Vtc3RhbmNlcyksIG9yCisgICAgICAgIE5vbmUsIGluIHdoaWNoIGNhc2UgdGhlIGNhbGxlciBoYXMgbm90aGluZyBmdXJ0aGVyIHRvIGRvLgorCisgICAgICAgICIiIgorICAgICAgICBwYXRoID0gc2VsZi50cmFuc2xhdGVfcGF0aChzZWxmLnBhdGgpCisgICAgICAgIGYgPSBOb25lCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXRoLmVuZHN3aXRoKCcvJyk6CisgICAgICAgICAgICAgICAgIyByZWRpcmVjdCBicm93c2VyIC0gZG9pbmcgYmFzaWNhbGx5IHdoYXQgYXBhY2hlIGRvZXMKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMzAxKQorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkxvY2F0aW9uIiwgc2VsZi5wYXRoICsgIi8iKQorICAgICAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBmb3IgaW5kZXggaW4gImluZGV4Lmh0bWwiLCAiaW5kZXguaHRtIjoKKyAgICAgICAgICAgICAgICBpbmRleCA9IG9zLnBhdGguam9pbihwYXRoLCBpbmRleCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbmRleCk6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBpbmRleAorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5saXN0X2RpcmVjdG9yeShwYXRoKQorICAgICAgICBjdHlwZSA9IHNlbGYuZ3Vlc3NfdHlwZShwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEFsd2F5cyByZWFkIGluIGJpbmFyeSBtb2RlLiBPcGVuaW5nIGZpbGVzIGluIHRleHQgbW9kZSBtYXkgY2F1c2UKKyAgICAgICAgICAgICMgbmV3bGluZSB0cmFuc2xhdGlvbnMsIG1ha2luZyB0aGUgYWN0dWFsIHNpemUgb2YgdGhlIGNvbnRlbnQKKyAgICAgICAgICAgICMgdHJhbnNtaXR0ZWQgKmxlc3MqIHRoYW4gdGhlIGNvbnRlbnQtbGVuZ3RoIQorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3JiJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBzZWxmLnNlbmRfZXJyb3IoNDA0LCAiRmlsZSBub3QgZm91bmQiKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC10eXBlIiwgY3R5cGUpCisgICAgICAgIGZzID0gb3MuZnN0YXQoZi5maWxlbm8oKSkKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1MZW5ndGgiLCBzdHIoZnNbNl0pKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJMYXN0LU1vZGlmaWVkIiwgc2VsZi5kYXRlX3RpbWVfc3RyaW5nKGZzLnN0X210aW1lKSkKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgIHJldHVybiBmCisKKyAgICBkZWYgbGlzdF9kaXJlY3Rvcnkoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIkhlbHBlciB0byBwcm9kdWNlIGEgZGlyZWN0b3J5IGxpc3RpbmcgKGFic2VudCBpbmRleC5odG1sKS4KKworICAgICAgICBSZXR1cm4gdmFsdWUgaXMgZWl0aGVyIGEgZmlsZSBvYmplY3QsIG9yIE5vbmUgKGluZGljYXRpbmcgYW4KKyAgICAgICAgZXJyb3IpLiAgSW4gZWl0aGVyIGNhc2UsIHRoZSBoZWFkZXJzIGFyZSBzZW50LCBtYWtpbmcgdGhlCisgICAgICAgIGludGVyZmFjZSB0aGUgc2FtZSBhcyBmb3Igc2VuZF9oZWFkKCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpc3QgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2VuZF9lcnJvcig0MDQsICJObyBwZXJtaXNzaW9uIHRvIGxpc3QgZGlyZWN0b3J5IikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGxpc3Quc29ydChrZXk9bGFtYmRhIGE6IGEubG93ZXIoKSkKKyAgICAgICAgZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgZGlzcGxheXBhdGggPSBjZ2kuZXNjYXBlKHVybGxpYi51bnF1b3RlKHNlbGYucGF0aCkpCisgICAgICAgIGYud3JpdGUoJzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCAzLjIgRmluYWwvL0VOIj4nKQorICAgICAgICBmLndyaXRlKCI8aHRtbD5cbjx0aXRsZT5EaXJlY3RvcnkgbGlzdGluZyBmb3IgJXM8L3RpdGxlPlxuIiAlIGRpc3BsYXlwYXRoKQorICAgICAgICBmLndyaXRlKCI8Ym9keT5cbjxoMj5EaXJlY3RvcnkgbGlzdGluZyBmb3IgJXM8L2gyPlxuIiAlIGRpc3BsYXlwYXRoKQorICAgICAgICBmLndyaXRlKCI8aHI+XG48dWw+XG4iKQorICAgICAgICBmb3IgbmFtZSBpbiBsaXN0OgorICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKKyAgICAgICAgICAgIGRpc3BsYXluYW1lID0gbGlua25hbWUgPSBuYW1lCisgICAgICAgICAgICAjIEFwcGVuZCAvIGZvciBkaXJlY3RvcmllcyBvciBAIGZvciBzeW1ib2xpYyBsaW5rcworICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgZGlzcGxheW5hbWUgPSBuYW1lICsgIi8iCisgICAgICAgICAgICAgICAgbGlua25hbWUgPSBuYW1lICsgIi8iCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhmdWxsbmFtZSk6CisgICAgICAgICAgICAgICAgZGlzcGxheW5hbWUgPSBuYW1lICsgIkAiCisgICAgICAgICAgICAgICAgIyBOb3RlOiBhIGxpbmsgdG8gYSBkaXJlY3RvcnkgZGlzcGxheXMgd2l0aCBAIGFuZCBsaW5rcyB3aXRoIC8KKyAgICAgICAgICAgIGYud3JpdGUoJzxsaT48YSBocmVmPSIlcyI+JXM8L2E+XG4nCisgICAgICAgICAgICAgICAgICAgICUgKHVybGxpYi5xdW90ZShsaW5rbmFtZSksIGNnaS5lc2NhcGUoZGlzcGxheW5hbWUpKSkKKyAgICAgICAgZi53cml0ZSgiPC91bD5cbjxocj5cbjwvYm9keT5cbjwvaHRtbD5cbiIpCisgICAgICAgIGxlbmd0aCA9IGYudGVsbCgpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjAwKQorICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9odG1sOyBjaGFyc2V0PSVzIiAlIGVuY29kaW5nKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LUxlbmd0aCIsIHN0cihsZW5ndGgpKQorICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgcmV0dXJuIGYKKworICAgIGRlZiB0cmFuc2xhdGVfcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgIiIiVHJhbnNsYXRlIGEgLy1zZXBhcmF0ZWQgUEFUSCB0byB0aGUgbG9jYWwgZmlsZW5hbWUgc3ludGF4LgorCisgICAgICAgIENvbXBvbmVudHMgdGhhdCBtZWFuIHNwZWNpYWwgdGhpbmdzIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQorICAgICAgICAoZS5nLiBkcml2ZSBvciBkaXJlY3RvcnkgbmFtZXMpIGFyZSBpZ25vcmVkLiAgKFhYWCBUaGV5IHNob3VsZAorICAgICAgICBwcm9iYWJseSBiZSBkaWFnbm9zZWQuKQorCisgICAgICAgICIiIgorICAgICAgICAjIGFiYW5kb24gcXVlcnkgcGFyYW1ldGVycworICAgICAgICBwYXRoID0gcGF0aC5zcGxpdCgnPycsMSlbMF0KKyAgICAgICAgcGF0aCA9IHBhdGguc3BsaXQoJyMnLDEpWzBdCisgICAgICAgIHBhdGggPSBwb3NpeHBhdGgubm9ybXBhdGgodXJsbGliLnVucXVvdGUocGF0aCkpCisgICAgICAgIHdvcmRzID0gcGF0aC5zcGxpdCgnLycpCisgICAgICAgIHdvcmRzID0gZmlsdGVyKE5vbmUsIHdvcmRzKQorICAgICAgICBwYXRoID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgICAgICAgICAgICBkcml2ZSwgd29yZCA9IG9zLnBhdGguc3BsaXRkcml2ZSh3b3JkKQorICAgICAgICAgICAgaGVhZCwgd29yZCA9IG9zLnBhdGguc3BsaXQod29yZCkKKyAgICAgICAgICAgIGlmIHdvcmQgaW4gKG9zLmN1cmRpciwgb3MucGFyZGlyKTogY29udGludWUKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgd29yZCkKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgIGRlZiBjb3B5ZmlsZShzZWxmLCBzb3VyY2UsIG91dHB1dGZpbGUpOgorICAgICAgICAiIiJDb3B5IGFsbCBkYXRhIGJldHdlZW4gdHdvIGZpbGUgb2JqZWN0cy4KKworICAgICAgICBUaGUgU09VUkNFIGFyZ3VtZW50IGlzIGEgZmlsZSBvYmplY3Qgb3BlbiBmb3IgcmVhZGluZworICAgICAgICAob3IgYW55dGhpbmcgd2l0aCBhIHJlYWQoKSBtZXRob2QpIGFuZCB0aGUgREVTVElOQVRJT04KKyAgICAgICAgYXJndW1lbnQgaXMgYSBmaWxlIG9iamVjdCBvcGVuIGZvciB3cml0aW5nIChvcgorICAgICAgICBhbnl0aGluZyB3aXRoIGEgd3JpdGUoKSBtZXRob2QpLgorCisgICAgICAgIFRoZSBvbmx5IHJlYXNvbiBmb3Igb3ZlcnJpZGluZyB0aGlzIHdvdWxkIGJlIHRvIGNoYW5nZQorICAgICAgICB0aGUgYmxvY2sgc2l6ZSBvciBwZXJoYXBzIHRvIHJlcGxhY2UgbmV3bGluZXMgYnkgQ1JMRgorICAgICAgICAtLSBub3RlIGhvd2V2ZXIgdGhhdCB0aGlzIHRoZSBkZWZhdWx0IHNlcnZlciB1c2VzIHRoaXMKKyAgICAgICAgdG8gY29weSBiaW5hcnkgZGF0YSBhcyB3ZWxsLgorCisgICAgICAgICIiIgorICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooc291cmNlLCBvdXRwdXRmaWxlKQorCisgICAgZGVmIGd1ZXNzX3R5cGUoc2VsZiwgcGF0aCk6CisgICAgICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgZmlsZS4KKworICAgICAgICBBcmd1bWVudCBpcyBhIFBBVEggKGEgZmlsZW5hbWUpLgorCisgICAgICAgIFJldHVybiB2YWx1ZSBpcyBhIHN0cmluZyBvZiB0aGUgZm9ybSB0eXBlL3N1YnR5cGUsCisgICAgICAgIHVzYWJsZSBmb3IgYSBNSU1FIENvbnRlbnQtdHlwZSBoZWFkZXIuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbG9va3MgdGhlIGZpbGUncyBleHRlbnNpb24KKyAgICAgICAgdXAgaW4gdGhlIHRhYmxlIHNlbGYuZXh0ZW5zaW9uc19tYXAsIHVzaW5nIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorICAgICAgICBhcyBhIGRlZmF1bHQ7IGhvd2V2ZXIgaXQgd291bGQgYmUgcGVybWlzc2libGUgKGlmCisgICAgICAgIHNsb3cpIHRvIGxvb2sgaW5zaWRlIHRoZSBkYXRhIHRvIG1ha2UgYSBiZXR0ZXIgZ3Vlc3MuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgYmFzZSwgZXh0ID0gcG9zaXhwYXRoLnNwbGl0ZXh0KHBhdGgpCisgICAgICAgIGlmIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnNfbWFwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXh0ZW5zaW9uc19tYXBbZXh0XQorICAgICAgICBleHQgPSBleHQubG93ZXIoKQorICAgICAgICBpZiBleHQgaW4gc2VsZi5leHRlbnNpb25zX21hcDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dGVuc2lvbnNfbWFwW2V4dF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dGVuc2lvbnNfbWFwWycnXQorCisgICAgaWYgbm90IG1pbWV0eXBlcy5pbml0ZWQ6CisgICAgICAgIG1pbWV0eXBlcy5pbml0KCkgIyB0cnkgdG8gcmVhZCBzeXN0ZW0gbWltZS50eXBlcworICAgIGV4dGVuc2lvbnNfbWFwID0gbWltZXR5cGVzLnR5cGVzX21hcC5jb3B5KCkKKyAgICBleHRlbnNpb25zX21hcC51cGRhdGUoeworICAgICAgICAnJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICMgRGVmYXVsdAorICAgICAgICAnLnB5JzogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLmMnOiAndGV4dC9wbGFpbicsCisgICAgICAgICcuaCc6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgfSkKKworCitkZWYgdGVzdChIYW5kbGVyQ2xhc3MgPSBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICBTZXJ2ZXJDbGFzcyA9IEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIpOgorICAgIEJhc2VIVFRQU2VydmVyLnRlc3QoSGFuZGxlckNsYXNzLCBTZXJ2ZXJDbGFzcykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9TaW1wbGVIVFRQU2VydmVyLnB5YyBiL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4NTkyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9TaW1wbGVIVFRQU2VydmVyLnB5byBiL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4NTkyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU2ltcGxlSFRUUFNlcnZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9TaW1wbGVYTUxSUENTZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L1NpbXBsZVhNTFJQQ1NlcnZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTVjZDYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9TaW1wbGVYTUxSUENTZXJ2ZXIucHkKQEAgLTAsMCArMSw3MDcgQEAKK3IiIiJTaW1wbGUgWE1MLVJQQyBTZXJ2ZXIuCisKK1RoaXMgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBzaW1wbGUgWE1MLVJQQyBzZXJ2ZXJzCitieSBjcmVhdGluZyBhIHNlcnZlciBhbmQgZWl0aGVyIGluc3RhbGxpbmcgZnVuY3Rpb25zLCBhCitjbGFzcyBpbnN0YW5jZSwgb3IgYnkgZXh0ZW5kaW5nIHRoZSBTaW1wbGVYTUxSUENTZXJ2ZXIKK2NsYXNzLgorCitJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGhhbmRsZSBYTUwtUlBDIHJlcXVlc3RzIGluIGEgQ0dJCitlbnZpcm9ubWVudCB1c2luZyBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlci4KKworQSBsaXN0IG9mIHBvc3NpYmxlIHVzYWdlIHBhdHRlcm5zIGZvbGxvd3M6CisKKzEuIEluc3RhbGwgZnVuY3Rpb25zOgorCitzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKK3NlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCitzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKK3NlcnZlci5zZXJ2ZV9mb3JldmVyKCkKKworMi4gSW5zdGFsbCBhbiBpbnN0YW5jZToKKworY2xhc3MgTXlGdW5jczoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgbWFrZSBhbGwgb2YgdGhlIHN0cmluZyBmdW5jdGlvbnMgYXZhaWxhYmxlIHRocm91Z2gKKyAgICAgICAgIyBzdHJpbmcuZnVuY19uYW1lCisgICAgICAgIGltcG9ydCBzdHJpbmcKKyAgICAgICAgc2VsZi5zdHJpbmcgPSBzdHJpbmcKKyAgICBkZWYgX2xpc3RNZXRob2RzKHNlbGYpOgorICAgICAgICAjIGltcGxlbWVudCB0aGlzIG1ldGhvZCBzbyB0aGF0IHN5c3RlbS5saXN0TWV0aG9kcworICAgICAgICAjIGtub3dzIHRvIGFkdmVydGlzZSB0aGUgc3RyaW5ncyBtZXRob2RzCisgICAgICAgIHJldHVybiBsaXN0X3B1YmxpY19tZXRob2RzKHNlbGYpICsgXAorICAgICAgICAgICAgICAgIFsnc3RyaW5nLicgKyBtZXRob2QgZm9yIG1ldGhvZCBpbiBsaXN0X3B1YmxpY19tZXRob2RzKHNlbGYuc3RyaW5nKV0KKyAgICBkZWYgcG93KHNlbGYsIHgsIHkpOiByZXR1cm4gcG93KHgsIHkpCisgICAgZGVmIGFkZChzZWxmLCB4LCB5KSA6IHJldHVybiB4ICsgeQorCitzZXJ2ZXIgPSBTaW1wbGVYTUxSUENTZXJ2ZXIoKCJsb2NhbGhvc3QiLCA4MDAwKSkKK3NlcnZlci5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCitzZXJ2ZXIucmVnaXN0ZXJfaW5zdGFuY2UoTXlGdW5jcygpKQorc2VydmVyLnNlcnZlX2ZvcmV2ZXIoKQorCiszLiBJbnN0YWxsIGFuIGluc3RhbmNlIHdpdGggY3VzdG9tIGRpc3BhdGNoIG1ldGhvZDoKKworY2xhc3MgTWF0aDoKKyAgICBkZWYgX2xpc3RNZXRob2RzKHNlbGYpOgorICAgICAgICAjIHRoaXMgbWV0aG9kIG11c3QgYmUgcHJlc2VudCBmb3Igc3lzdGVtLmxpc3RNZXRob2RzCisgICAgICAgICMgdG8gd29yaworICAgICAgICByZXR1cm4gWydhZGQnLCAncG93J10KKyAgICBkZWYgX21ldGhvZEhlbHAoc2VsZiwgbWV0aG9kKToKKyAgICAgICAgIyB0aGlzIG1ldGhvZCBtdXN0IGJlIHByZXNlbnQgZm9yIHN5c3RlbS5tZXRob2RIZWxwCisgICAgICAgICMgdG8gd29yaworICAgICAgICBpZiBtZXRob2QgPT0gJ2FkZCc6CisgICAgICAgICAgICByZXR1cm4gImFkZCgyLDMpID0+IDUiCisgICAgICAgIGVsaWYgbWV0aG9kID09ICdwb3cnOgorICAgICAgICAgICAgcmV0dXJuICJwb3coeCwgeVssIHpdKSA9PiBudW1iZXIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEJ5IGNvbnZlbnRpb24sIHJldHVybiBlbXB0eQorICAgICAgICAgICAgIyBzdHJpbmcgaWYgbm8gaGVscCBpcyBhdmFpbGFibGUKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgIGRlZiBfZGlzcGF0Y2goc2VsZiwgbWV0aG9kLCBwYXJhbXMpOgorICAgICAgICBpZiBtZXRob2QgPT0gJ3Bvdyc6CisgICAgICAgICAgICByZXR1cm4gcG93KCpwYXJhbXMpCisgICAgICAgIGVsaWYgbWV0aG9kID09ICdhZGQnOgorICAgICAgICAgICAgcmV0dXJuIHBhcmFtc1swXSArIHBhcmFtc1sxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgJ2JhZCBtZXRob2QnCisKK3NlcnZlciA9IFNpbXBsZVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDgwMDApKQorc2VydmVyLnJlZ2lzdGVyX2ludHJvc3BlY3Rpb25fZnVuY3Rpb25zKCkKK3NlcnZlci5yZWdpc3Rlcl9pbnN0YW5jZShNYXRoKCkpCitzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisKKzQuIFN1YmNsYXNzIFNpbXBsZVhNTFJQQ1NlcnZlcjoKKworY2xhc3MgTWF0aFNlcnZlcihTaW1wbGVYTUxSUENTZXJ2ZXIpOgorICAgIGRlZiBfZGlzcGF0Y2goc2VsZiwgbWV0aG9kLCBwYXJhbXMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFdlIGFyZSBmb3JjaW5nIHRoZSAnZXhwb3J0XycgcHJlZml4IG9uIG1ldGhvZHMgdGhhdCBhcmUKKyAgICAgICAgICAgICMgY2FsbGFibGUgdGhyb3VnaCBYTUwtUlBDIHRvIHByZXZlbnQgcG90ZW50aWFsIHNlY3VyaXR5CisgICAgICAgICAgICAjIHByb2JsZW1zCisgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihzZWxmLCAnZXhwb3J0XycgKyBtZXRob2QpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbignbWV0aG9kICIlcyIgaXMgbm90IHN1cHBvcnRlZCcgJSBtZXRob2QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZnVuYygqcGFyYW1zKQorCisgICAgZGVmIGV4cG9ydF9hZGQoc2VsZiwgeCwgeSk6CisgICAgICAgIHJldHVybiB4ICsgeQorCitzZXJ2ZXIgPSBNYXRoU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpCitzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisKKzUuIENHSSBzY3JpcHQ6CisKK3NlcnZlciA9IENHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyKCkKK3NlcnZlci5yZWdpc3Rlcl9mdW5jdGlvbihwb3cpCitzZXJ2ZXIuaGFuZGxlX3JlcXVlc3QoKQorIiIiCisKKyMgV3JpdHRlbiBieSBCcmlhbiBRdWlubGFuIChicmlhbkBzd2VldGFwcC5jb20pLgorIyBCYXNlZCBvbiBjb2RlIHdyaXR0ZW4gYnkgRnJlZHJpayBMdW5kaC4KKworaW1wb3J0IHhtbHJwY2xpYgorZnJvbSB4bWxycGNsaWIgaW1wb3J0IEZhdWx0CitpbXBvcnQgU29ja2V0U2VydmVyCitpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHJlCit0cnk6CisgICAgaW1wb3J0IGZjbnRsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZmNudGwgPSBOb25lCisKK2RlZiByZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUob2JqLCBhdHRyLCBhbGxvd19kb3R0ZWRfbmFtZXM9VHJ1ZSk6CisgICAgIiIicmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlKGEsICdiLmMuZCcpID0+IGEuYi5jLmQKKworICAgIFJlc29sdmVzIGEgZG90dGVkIGF0dHJpYnV0ZSBuYW1lIHRvIGFuIG9iamVjdC4gIFJhaXNlcworICAgIGFuIEF0dHJpYnV0ZUVycm9yIGlmIGFueSBhdHRyaWJ1dGUgaW4gdGhlIGNoYWluIHN0YXJ0cyB3aXRoIGEgJ18nLgorCisgICAgSWYgdGhlIG9wdGlvbmFsIGFsbG93X2RvdHRlZF9uYW1lcyBhcmd1bWVudCBpcyBmYWxzZSwgZG90cyBhcmUgbm90CisgICAgc3VwcG9ydGVkIGFuZCB0aGlzIGZ1bmN0aW9uIG9wZXJhdGVzIHNpbWlsYXIgdG8gZ2V0YXR0cihvYmosIGF0dHIpLgorICAgICIiIgorCisgICAgaWYgYWxsb3dfZG90dGVkX25hbWVzOgorICAgICAgICBhdHRycyA9IGF0dHIuc3BsaXQoJy4nKQorICAgIGVsc2U6CisgICAgICAgIGF0dHJzID0gW2F0dHJdCisKKyAgICBmb3IgaSBpbiBhdHRyczoKKyAgICAgICAgaWYgaS5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigKKyAgICAgICAgICAgICAgICAnYXR0ZW1wdCB0byBhY2Nlc3MgcHJpdmF0ZSBhdHRyaWJ1dGUgIiVzIicgJSBpCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihvYmosaSkKKyAgICByZXR1cm4gb2JqCisKK2RlZiBsaXN0X3B1YmxpY19tZXRob2RzKG9iaik6CisgICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgYXR0cmlidXRlIHN0cmluZ3MsIGZvdW5kIGluIHRoZSBzcGVjaWZpZWQKKyAgICBvYmplY3QsIHdoaWNoIHJlcHJlc2VudCBjYWxsYWJsZSBhdHRyaWJ1dGVzIiIiCisKKyAgICByZXR1cm4gW21lbWJlciBmb3IgbWVtYmVyIGluIGRpcihvYmopCisgICAgICAgICAgICAgICAgaWYgbm90IG1lbWJlci5zdGFydHN3aXRoKCdfJykgYW5kCisgICAgICAgICAgICAgICAgICAgIGhhc2F0dHIoZ2V0YXR0cihvYmosIG1lbWJlciksICdfX2NhbGxfXycpXQorCitkZWYgcmVtb3ZlX2R1cGxpY2F0ZXMobHN0KToKKyAgICAiIiJyZW1vdmVfZHVwbGljYXRlcyhbMiwyLDIsMSwzLDNdKSA9PiBbMywxLDJdCisKKyAgICBSZXR1cm5zIGEgY29weSBvZiBhIGxpc3Qgd2l0aG91dCBkdXBsaWNhdGVzLiBFdmVyeSBsaXN0CisgICAgaXRlbSBtdXN0IGJlIGhhc2hhYmxlIGFuZCB0aGUgb3JkZXIgb2YgdGhlIGl0ZW1zIGluIHRoZQorICAgIHJlc3VsdGluZyBsaXN0IGlzIG5vdCBkZWZpbmVkLgorICAgICIiIgorICAgIHUgPSB7fQorICAgIGZvciB4IGluIGxzdDoKKyAgICAgICAgdVt4XSA9IDEKKworICAgIHJldHVybiB1LmtleXMoKQorCitjbGFzcyBTaW1wbGVYTUxSUENEaXNwYXRjaGVyOgorICAgICIiIk1peC1pbiBjbGFzcyB0aGF0IGRpc3BhdGNoZXMgWE1MLVJQQyByZXF1ZXN0cy4KKworICAgIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZWdpc3RlciBYTUwtUlBDIG1ldGhvZCBoYW5kbGVycworICAgIGFuZCB0aGVuIHRvIGRpc3BhdGNoIHRoZW0uIFRoaXMgY2xhc3MgZG9lc24ndCBuZWVkIHRvIGJlCisgICAgaW5zdGFuY2VkIGRpcmVjdGx5IHdoZW4gdXNlZCBieSBTaW1wbGVYTUxSUENTZXJ2ZXIgYnV0IGl0CisgICAgY2FuIGJlIGluc3RhbmNlZCB3aGVuIHVzZWQgYnkgdGhlIE11bHRpUGF0aFhNTFJQQ1NlcnZlci4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd19ub25lPUZhbHNlLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgc2VsZi5mdW5jcyA9IHt9CisgICAgICAgIHNlbGYuaW5zdGFuY2UgPSBOb25lCisgICAgICAgIHNlbGYuYWxsb3dfbm9uZSA9IGFsbG93X25vbmUKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICBkZWYgcmVnaXN0ZXJfaW5zdGFuY2Uoc2VsZiwgaW5zdGFuY2UsIGFsbG93X2RvdHRlZF9uYW1lcz1GYWxzZSk6CisgICAgICAgICIiIlJlZ2lzdGVycyBhbiBpbnN0YW5jZSB0byByZXNwb25kIHRvIFhNTC1SUEMgcmVxdWVzdHMuCisKKyAgICAgICAgT25seSBvbmUgaW5zdGFuY2UgY2FuIGJlIGluc3RhbGxlZCBhdCBhIHRpbWUuCisKKyAgICAgICAgSWYgdGhlIHJlZ2lzdGVyZWQgaW5zdGFuY2UgaGFzIGEgX2Rpc3BhdGNoIG1ldGhvZCB0aGVuIHRoYXQKKyAgICAgICAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIFhNTC1SUEMgbWV0aG9kIGFuZAorICAgICAgICBpdHMgcGFyYW1ldGVycyBhcyBhIHR1cGxlCisgICAgICAgIGUuZy4gaW5zdGFuY2UuX2Rpc3BhdGNoKCdhZGQnLCgyLDMpKQorCisgICAgICAgIElmIHRoZSByZWdpc3RlcmVkIGluc3RhbmNlIGRvZXMgbm90IGhhdmUgYSBfZGlzcGF0Y2ggbWV0aG9kCisgICAgICAgIHRoZW4gdGhlIGluc3RhbmNlIHdpbGwgYmUgc2VhcmNoZWQgdG8gZmluZCBhIG1hdGNoaW5nIG1ldGhvZAorICAgICAgICBhbmQsIGlmIGZvdW5kLCB3aWxsIGJlIGNhbGxlZC4gTWV0aG9kcyBiZWdpbm5pbmcgd2l0aCBhbiAnXycKKyAgICAgICAgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZSBhbmQgd2lsbCBub3QgYmUgY2FsbGVkIGJ5CisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci4KKworICAgICAgICBJZiBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gbWF0Y2hlcyBhIFhNTC1SUEMgcmVxdWVzdCwgdGhlbiBpdAorICAgICAgICB3aWxsIGJlIGNhbGxlZCBpbnN0ZWFkIG9mIHRoZSByZWdpc3RlcmVkIGluc3RhbmNlLgorCisgICAgICAgIElmIHRoZSBvcHRpb25hbCBhbGxvd19kb3R0ZWRfbmFtZXMgYXJndW1lbnQgaXMgdHJ1ZSBhbmQgdGhlCisgICAgICAgIGluc3RhbmNlIGRvZXMgbm90IGhhdmUgYSBfZGlzcGF0Y2ggbWV0aG9kLCBtZXRob2QgbmFtZXMKKyAgICAgICAgY29udGFpbmluZyBkb3RzIGFyZSBzdXBwb3J0ZWQgYW5kIHJlc29sdmVkLCBhcyBsb25nIGFzIG5vbmUgb2YKKyAgICAgICAgdGhlIG5hbWUgc2VnbWVudHMgc3RhcnQgd2l0aCBhbiAnXycuCisKKyAgICAgICAgICAgICoqKiBTRUNVUklUWSBXQVJOSU5HOiAqKioKKworICAgICAgICAgICAgRW5hYmxpbmcgdGhlIGFsbG93X2RvdHRlZF9uYW1lcyBvcHRpb25zIGFsbG93cyBpbnRydWRlcnMKKyAgICAgICAgICAgIHRvIGFjY2VzcyB5b3VyIG1vZHVsZSdzIGdsb2JhbCB2YXJpYWJsZXMgYW5kIG1heSBhbGxvdworICAgICAgICAgICAgaW50cnVkZXJzIHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgb24geW91ciBtYWNoaW5lLiAgT25seQorICAgICAgICAgICAgdXNlIHRoaXMgb3B0aW9uIG9uIGEgc2VjdXJlLCBjbG9zZWQgbmV0d29yay4KKworICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmluc3RhbmNlID0gaW5zdGFuY2UKKyAgICAgICAgc2VsZi5hbGxvd19kb3R0ZWRfbmFtZXMgPSBhbGxvd19kb3R0ZWRfbmFtZXMKKworICAgIGRlZiByZWdpc3Rlcl9mdW5jdGlvbihzZWxmLCBmdW5jdGlvbiwgbmFtZSA9IE5vbmUpOgorICAgICAgICAiIiJSZWdpc3RlcnMgYSBmdW5jdGlvbiB0byByZXNwb25kIHRvIFhNTC1SUEMgcmVxdWVzdHMuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIG5hbWUgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgVW5pY29kZSBuYW1lCisgICAgICAgIGZvciB0aGUgZnVuY3Rpb24uCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIG5hbWUgPSBmdW5jdGlvbi5fX25hbWVfXworICAgICAgICBzZWxmLmZ1bmNzW25hbWVdID0gZnVuY3Rpb24KKworICAgIGRlZiByZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmVnaXN0ZXJzIHRoZSBYTUwtUlBDIGludHJvc3BlY3Rpb24gbWV0aG9kcyBpbiB0aGUgc3lzdGVtCisgICAgICAgIG5hbWVzcGFjZS4KKworICAgICAgICBzZWUgaHR0cDovL3htbHJwYy51c2VmdWxpbmMuY29tL2RvYy9yZXNlcnZlZC5odG1sCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuZnVuY3MudXBkYXRlKHsnc3lzdGVtLmxpc3RNZXRob2RzJyA6IHNlbGYuc3lzdGVtX2xpc3RNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW0ubWV0aG9kU2lnbmF0dXJlJyA6IHNlbGYuc3lzdGVtX21ldGhvZFNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtLm1ldGhvZEhlbHAnIDogc2VsZi5zeXN0ZW1fbWV0aG9kSGVscH0pCisKKyAgICBkZWYgcmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmVnaXN0ZXJzIHRoZSBYTUwtUlBDIG11bHRpY2FsbCBtZXRob2QgaW4gdGhlIHN5c3RlbQorICAgICAgICBuYW1lc3BhY2UuCisKKyAgICAgICAgc2VlIGh0dHA6Ly93d3cueG1scnBjLmNvbS9kaXNjdXNzL21zZ1JlYWRlciQxMjA4IiIiCisKKyAgICAgICAgc2VsZi5mdW5jcy51cGRhdGUoeydzeXN0ZW0ubXVsdGljYWxsJyA6IHNlbGYuc3lzdGVtX211bHRpY2FsbH0pCisKKyAgICBkZWYgX21hcnNoYWxlZF9kaXNwYXRjaChzZWxmLCBkYXRhLCBkaXNwYXRjaF9tZXRob2QgPSBOb25lLCBwYXRoID0gTm9uZSk6CisgICAgICAgICIiIkRpc3BhdGNoZXMgYW4gWE1MLVJQQyBtZXRob2QgZnJvbSBtYXJzaGFsbGVkIChYTUwpIGRhdGEuCisKKyAgICAgICAgWE1MLVJQQyBtZXRob2RzIGFyZSBkaXNwYXRjaGVkIGZyb20gdGhlIG1hcnNoYWxsZWQgKFhNTCkgZGF0YQorICAgICAgICB1c2luZyB0aGUgX2Rpc3BhdGNoIG1ldGhvZCBhbmQgdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcworICAgICAgICBtYXJzaGFsbGVkIGRhdGEuIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYSBkaXNwYXRjaAorICAgICAgICBmdW5jdGlvbiBjYW4gYmUgcHJvdmlkZWQgYXMgYW4gYXJndW1lbnQgKHNlZSBjb21tZW50IGluCisgICAgICAgIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLmRvX1BPU1QpIGJ1dCBvdmVycmlkaW5nIHRoZQorICAgICAgICBleGlzdGluZyBtZXRob2QgdGhyb3VnaCBzdWJjbGFzc2luZyBpcyB0aGUgcHJlZmVycmVkIG1lYW5zCisgICAgICAgIG9mIGNoYW5naW5nIG1ldGhvZCBkaXNwYXRjaCBiZWhhdmlvci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyYW1zLCBtZXRob2QgPSB4bWxycGNsaWIubG9hZHMoZGF0YSkKKworICAgICAgICAgICAgIyBnZW5lcmF0ZSByZXNwb25zZQorICAgICAgICAgICAgaWYgZGlzcGF0Y2hfbWV0aG9kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gZGlzcGF0Y2hfbWV0aG9kKG1ldGhvZCwgcGFyYW1zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuX2Rpc3BhdGNoKG1ldGhvZCwgcGFyYW1zKQorICAgICAgICAgICAgIyB3cmFwIHJlc3BvbnNlIGluIGEgc2luZ2xldG9uIHR1cGxlCisgICAgICAgICAgICByZXNwb25zZSA9IChyZXNwb25zZSwpCisgICAgICAgICAgICByZXNwb25zZSA9IHhtbHJwY2xpYi5kdW1wcyhyZXNwb25zZSwgbWV0aG9kcmVzcG9uc2U9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X25vbmU9c2VsZi5hbGxvd19ub25lLCBlbmNvZGluZz1zZWxmLmVuY29kaW5nKQorICAgICAgICBleGNlcHQgRmF1bHQsIGZhdWx0OgorICAgICAgICAgICAgcmVzcG9uc2UgPSB4bWxycGNsaWIuZHVtcHMoZmF1bHQsIGFsbG93X25vbmU9c2VsZi5hbGxvd19ub25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyByZXBvcnQgZXhjZXB0aW9uIGJhY2sgdG8gc2VydmVyCisgICAgICAgICAgICBleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgcmVzcG9uc2UgPSB4bWxycGNsaWIuZHVtcHMoCisgICAgICAgICAgICAgICAgeG1scnBjbGliLkZhdWx0KDEsICIlczolcyIgJSAoZXhjX3R5cGUsIGV4Y192YWx1ZSkpLAorICAgICAgICAgICAgICAgIGVuY29kaW5nPXNlbGYuZW5jb2RpbmcsIGFsbG93X25vbmU9c2VsZi5hbGxvd19ub25lLAorICAgICAgICAgICAgICAgICkKKworICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGRlZiBzeXN0ZW1fbGlzdE1ldGhvZHMoc2VsZik6CisgICAgICAgICIiInN5c3RlbS5saXN0TWV0aG9kcygpID0+IFsnYWRkJywgJ3N1YnRyYWN0JywgJ211bHRpcGxlJ10KKworICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgbWV0aG9kcyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4iIiIKKworICAgICAgICBtZXRob2RzID0gc2VsZi5mdW5jcy5rZXlzKCkKKyAgICAgICAgaWYgc2VsZi5pbnN0YW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgSW5zdGFuY2UgY2FuIGltcGxlbWVudCBfbGlzdE1ldGhvZCB0byByZXR1cm4gYSBsaXN0IG9mCisgICAgICAgICAgICAjIG1ldGhvZHMKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5pbnN0YW5jZSwgJ19saXN0TWV0aG9kcycpOgorICAgICAgICAgICAgICAgIG1ldGhvZHMgPSByZW1vdmVfZHVwbGljYXRlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgKyBzZWxmLmluc3RhbmNlLl9saXN0TWV0aG9kcygpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICMgaWYgdGhlIGluc3RhbmNlIGhhcyBhIF9kaXNwYXRjaCBtZXRob2QgdGhlbiB3ZQorICAgICAgICAgICAgIyBkb24ndCBoYXZlIGVub3VnaCBpbmZvcm1hdGlvbiB0byBwcm92aWRlIGEgbGlzdAorICAgICAgICAgICAgIyBvZiBtZXRob2RzCisgICAgICAgICAgICBlbGlmIG5vdCBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfZGlzcGF0Y2gnKToKKyAgICAgICAgICAgICAgICBtZXRob2RzID0gcmVtb3ZlX2R1cGxpY2F0ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzICsgbGlzdF9wdWJsaWNfbWV0aG9kcyhzZWxmLmluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIG1ldGhvZHMuc29ydCgpCisgICAgICAgIHJldHVybiBtZXRob2RzCisKKyAgICBkZWYgc3lzdGVtX21ldGhvZFNpZ25hdHVyZShzZWxmLCBtZXRob2RfbmFtZSk6CisgICAgICAgICIiInN5c3RlbS5tZXRob2RTaWduYXR1cmUoJ2FkZCcpID0+IFtkb3VibGUsIGludCwgaW50XQorCisgICAgICAgIFJldHVybnMgYSBsaXN0IGRlc2NyaWJpbmcgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWV0aG9kLiBJbiB0aGUKKyAgICAgICAgYWJvdmUgZXhhbXBsZSwgdGhlIGFkZCBtZXRob2QgdGFrZXMgdHdvIGludGVnZXJzIGFzIGFyZ3VtZW50cworICAgICAgICBhbmQgcmV0dXJucyBhIGRvdWJsZSByZXN1bHQuCisKKyAgICAgICAgVGhpcyBzZXJ2ZXIgZG9lcyBOT1Qgc3VwcG9ydCBzeXN0ZW0ubWV0aG9kU2lnbmF0dXJlLiIiIgorCisgICAgICAgICMgU2VlIGh0dHA6Ly94bWxycGMudXNlZnVsaW5jLmNvbS9kb2Mvc3lzbWV0aG9kc2lnLmh0bWwKKworICAgICAgICByZXR1cm4gJ3NpZ25hdHVyZXMgbm90IHN1cHBvcnRlZCcKKworICAgIGRlZiBzeXN0ZW1fbWV0aG9kSGVscChzZWxmLCBtZXRob2RfbmFtZSk6CisgICAgICAgICIiInN5c3RlbS5tZXRob2RIZWxwKCdhZGQnKSA9PiAiQWRkcyB0d28gaW50ZWdlcnMgdG9nZXRoZXIiCisKKyAgICAgICAgUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLiIiIgorCisgICAgICAgIG1ldGhvZCA9IE5vbmUKKyAgICAgICAgaWYgbWV0aG9kX25hbWUgaW4gc2VsZi5mdW5jczoKKyAgICAgICAgICAgIG1ldGhvZCA9IHNlbGYuZnVuY3NbbWV0aG9kX25hbWVdCisgICAgICAgIGVsaWYgc2VsZi5pbnN0YW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgSW5zdGFuY2UgY2FuIGltcGxlbWVudCBfbWV0aG9kSGVscCB0byByZXR1cm4gaGVscCBmb3IgYSBtZXRob2QKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5pbnN0YW5jZSwgJ19tZXRob2RIZWxwJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFuY2UuX21ldGhvZEhlbHAobWV0aG9kX25hbWUpCisgICAgICAgICAgICAjIGlmIHRoZSBpbnN0YW5jZSBoYXMgYSBfZGlzcGF0Y2ggbWV0aG9kIHRoZW4gd2UKKyAgICAgICAgICAgICMgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gcHJvdmlkZSBoZWxwCisgICAgICAgICAgICBlbGlmIG5vdCBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfZGlzcGF0Y2gnKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWxsb3dfZG90dGVkX25hbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIE5vdGUgdGhhdCB3ZSBhcmVuJ3QgY2hlY2tpbmcgdGhhdCB0aGUgbWV0aG9kIGFjdHVhbGx5CisgICAgICAgICMgYmUgYSBjYWxsYWJsZSBvYmplY3Qgb2Ygc29tZSBraW5kCisgICAgICAgIGlmIG1ldGhvZCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbXBvcnQgcHlkb2MKKyAgICAgICAgICAgIHJldHVybiBweWRvYy5nZXRkb2MobWV0aG9kKQorCisgICAgZGVmIHN5c3RlbV9tdWx0aWNhbGwoc2VsZiwgY2FsbF9saXN0KToKKyAgICAgICAgIiIic3lzdGVtLm11bHRpY2FsbChbeydtZXRob2ROYW1lJzogJ2FkZCcsICdwYXJhbXMnOiBbMiwgMl19LCAuLi5dKSA9PiBcCitbWzRdLCAuLi5dCisKKyAgICAgICAgQWxsb3dzIHRoZSBjYWxsZXIgdG8gcGFja2FnZSBtdWx0aXBsZSBYTUwtUlBDIGNhbGxzIGludG8gYSBzaW5nbGUKKyAgICAgICAgcmVxdWVzdC4KKworICAgICAgICBTZWUgaHR0cDovL3d3dy54bWxycGMuY29tL2Rpc2N1c3MvbXNnUmVhZGVyJDEyMDgKKyAgICAgICAgIiIiCisKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGZvciBjYWxsIGluIGNhbGxfbGlzdDoKKyAgICAgICAgICAgIG1ldGhvZF9uYW1lID0gY2FsbFsnbWV0aG9kTmFtZSddCisgICAgICAgICAgICBwYXJhbXMgPSBjYWxsWydwYXJhbXMnXQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBYWFggQSBtYXJzaGFsbGluZyBlcnJvciBpbiBhbnkgcmVzcG9uc2Ugd2lsbCBmYWlsIHRoZSBlbnRpcmUKKyAgICAgICAgICAgICAgICAjIG11bHRpY2FsbC4gSWYgc29tZW9uZSBjYXJlcyB0aGV5IHNob3VsZCBmaXggdGhpcy4KKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChbc2VsZi5fZGlzcGF0Y2gobWV0aG9kX25hbWUsIHBhcmFtcyldKQorICAgICAgICAgICAgZXhjZXB0IEZhdWx0LCBmYXVsdDoKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgeydmYXVsdENvZGUnIDogZmF1bHQuZmF1bHRDb2RlLAorICAgICAgICAgICAgICAgICAgICAgJ2ZhdWx0U3RyaW5nJyA6IGZhdWx0LmZhdWx0U3RyaW5nfQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgeydmYXVsdENvZGUnIDogMSwKKyAgICAgICAgICAgICAgICAgICAgICdmYXVsdFN0cmluZycgOiAiJXM6JXMiICUgKGV4Y190eXBlLCBleGNfdmFsdWUpfQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiByZXN1bHRzCisKKyAgICBkZWYgX2Rpc3BhdGNoKHNlbGYsIG1ldGhvZCwgcGFyYW1zKToKKyAgICAgICAgIiIiRGlzcGF0Y2hlcyB0aGUgWE1MLVJQQyBtZXRob2QuCisKKyAgICAgICAgWE1MLVJQQyBjYWxscyBhcmUgZm9yd2FyZGVkIHRvIGEgcmVnaXN0ZXJlZCBmdW5jdGlvbiB0aGF0CisgICAgICAgIG1hdGNoZXMgdGhlIGNhbGxlZCBYTUwtUlBDIG1ldGhvZCBuYW1lLiBJZiBubyBzdWNoIGZ1bmN0aW9uCisgICAgICAgIGV4aXN0cyB0aGVuIHRoZSBjYWxsIGlzIGZvcndhcmRlZCB0byB0aGUgcmVnaXN0ZXJlZCBpbnN0YW5jZSwKKyAgICAgICAgaWYgYXZhaWxhYmxlLgorCisgICAgICAgIElmIHRoZSByZWdpc3RlcmVkIGluc3RhbmNlIGhhcyBhIF9kaXNwYXRjaCBtZXRob2QgdGhlbiB0aGF0CisgICAgICAgIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBYTUwtUlBDIG1ldGhvZCBhbmQKKyAgICAgICAgaXRzIHBhcmFtZXRlcnMgYXMgYSB0dXBsZQorICAgICAgICBlLmcuIGluc3RhbmNlLl9kaXNwYXRjaCgnYWRkJywoMiwzKSkKKworICAgICAgICBJZiB0aGUgcmVnaXN0ZXJlZCBpbnN0YW5jZSBkb2VzIG5vdCBoYXZlIGEgX2Rpc3BhdGNoIG1ldGhvZAorICAgICAgICB0aGVuIHRoZSBpbnN0YW5jZSB3aWxsIGJlIHNlYXJjaGVkIHRvIGZpbmQgYSBtYXRjaGluZyBtZXRob2QKKyAgICAgICAgYW5kLCBpZiBmb3VuZCwgd2lsbCBiZSBjYWxsZWQuCisKKyAgICAgICAgTWV0aG9kcyBiZWdpbm5pbmcgd2l0aCBhbiAnXycgYXJlIGNvbnNpZGVyZWQgcHJpdmF0ZSBhbmQgd2lsbAorICAgICAgICBub3QgYmUgY2FsbGVkLgorICAgICAgICAiIiIKKworICAgICAgICBmdW5jID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGNoZWNrIHRvIHNlZSBpZiBhIG1hdGNoaW5nIGZ1bmN0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGZ1bmMgPSBzZWxmLmZ1bmNzW21ldGhvZF0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5pbnN0YW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBhIF9kaXNwYXRjaCBtZXRob2QKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuaW5zdGFuY2UsICdfZGlzcGF0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFuY2UuX2Rpc3BhdGNoKG1ldGhvZCwgcGFyYW1zKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgY2FsbCBpbnN0YW5jZSBtZXRob2QgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZnVuYyA9IHJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbG93X2RvdHRlZF9uYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIGZ1bmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZnVuYygqcGFyYW1zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdtZXRob2QgIiVzIiBpcyBub3Qgc3VwcG9ydGVkJyAlIG1ldGhvZCkKKworY2xhc3MgU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgIiIiU2ltcGxlIFhNTC1SUEMgcmVxdWVzdCBoYW5kbGVyIGNsYXNzLgorCisgICAgSGFuZGxlcyBhbGwgSFRUUCBQT1NUIHJlcXVlc3RzIGFuZCBhdHRlbXB0cyB0byBkZWNvZGUgdGhlbSBhcworICAgIFhNTC1SUEMgcmVxdWVzdHMuCisgICAgIiIiCisKKyAgICAjIENsYXNzIGF0dHJpYnV0ZSBsaXN0aW5nIHRoZSBhY2Nlc3NpYmxlIHBhdGggY29tcG9uZW50czsKKyAgICAjIHBhdGhzIG5vdCBvbiB0aGlzIGxpc3Qgd2lsbCByZXN1bHQgaW4gYSA0MDQgZXJyb3IuCisgICAgcnBjX3BhdGhzID0gKCcvJywgJy9SUEMyJykKKworICAgICNpZiBub3QgTm9uZSwgZW5jb2RlIHJlc3BvbnNlcyBsYXJnZXIgdGhhbiB0aGlzLCBpZiBwb3NzaWJsZQorICAgIGVuY29kZV90aHJlc2hvbGQgPSAxNDAwICNhIGNvbW1vbiBNVFUKKworICAgICNPdmVycmlkZSBmb3JtIFN0cmVhbVJlcXVlc3RIYW5kbGVyOiBmdWxsIGJ1ZmZlcmluZyBvZiBvdXRwdXQKKyAgICAjYW5kIG5vIE5hZ2xlLgorICAgIHdidWZzaXplID0gLTEKKyAgICBkaXNhYmxlX25hZ2xlX2FsZ29yaXRobSA9IFRydWUKKworICAgICMgYSByZSB0byBtYXRjaCBhIGd6aXAgQWNjZXB0LUVuY29kaW5nCisgICAgYWVwYXR0ZXJuID0gcmUuY29tcGlsZShyIiIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHMqIChbXlxzO10rKSBccyogICAgICAgICAgICAjY29udGVudC1jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoO1xzKiBxIFxzKj1ccyogKFswLTlcLl0rKSk/ICNxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkKKworICAgIGRlZiBhY2NlcHRfZW5jb2RpbmdzKHNlbGYpOgorICAgICAgICByID0ge30KKyAgICAgICAgYWUgPSBzZWxmLmhlYWRlcnMuZ2V0KCJBY2NlcHQtRW5jb2RpbmciLCAiIikKKyAgICAgICAgZm9yIGUgaW4gYWUuc3BsaXQoIiwiKToKKyAgICAgICAgICAgIG1hdGNoID0gc2VsZi5hZXBhdHRlcm4ubWF0Y2goZSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHYgPSBtYXRjaC5ncm91cCgzKQorICAgICAgICAgICAgICAgIHYgPSBmbG9hdCh2KSBpZiB2IGVsc2UgMS4wCisgICAgICAgICAgICAgICAgclttYXRjaC5ncm91cCgxKV0gPSB2CisgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgaXNfcnBjX3BhdGhfdmFsaWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYucnBjX3BhdGhzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGF0aCBpbiBzZWxmLnJwY19wYXRocworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZiAucnBjX3BhdGhzIGlzIGVtcHR5LCBqdXN0IGFzc3VtZSBhbGwgcGF0aHMgYXJlIGxlZ2FsCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRvX1BPU1Qoc2VsZik6CisgICAgICAgICIiIkhhbmRsZXMgdGhlIEhUVFAgUE9TVCByZXF1ZXN0LgorCisgICAgICAgIEF0dGVtcHRzIHRvIGludGVycHJldCBhbGwgSFRUUCBQT1NUIHJlcXVlc3RzIGFzIFhNTC1SUEMgY2FsbHMsCisgICAgICAgIHdoaWNoIGFyZSBmb3J3YXJkZWQgdG8gdGhlIHNlcnZlcidzIF9kaXNwYXRjaCBtZXRob2QgZm9yIGhhbmRsaW5nLgorICAgICAgICAiIiIKKworICAgICAgICAjIENoZWNrIHRoYXQgdGhlIHBhdGggaXMgbGVnYWwKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfcnBjX3BhdGhfdmFsaWQoKToKKyAgICAgICAgICAgIHNlbGYucmVwb3J0XzQwNCgpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEdldCBhcmd1bWVudHMgYnkgcmVhZGluZyBib2R5IG9mIHJlcXVlc3QuCisgICAgICAgICAgICAjIFdlIHJlYWQgdGhpcyBpbiBjaHVua3MgdG8gYXZvaWQgc3RyYWluaW5nCisgICAgICAgICAgICAjIHNvY2tldC5yZWFkKCk7IGFyb3VuZCB0aGUgMTAgb3IgMTVNYiBtYXJrLCBzb21lIHBsYXRmb3JtcworICAgICAgICAgICAgIyBiZWdpbiB0byBoYXZlIHByb2JsZW1zIChidWcgIzc5MjU3MCkuCisgICAgICAgICAgICBtYXhfY2h1bmtfc2l6ZSA9IDEwKjEwMjQqMTAyNAorICAgICAgICAgICAgc2l6ZV9yZW1haW5pbmcgPSBpbnQoc2VsZi5oZWFkZXJzWyJjb250ZW50LWxlbmd0aCJdKQorICAgICAgICAgICAgTCA9IFtdCisgICAgICAgICAgICB3aGlsZSBzaXplX3JlbWFpbmluZzoKKyAgICAgICAgICAgICAgICBjaHVua19zaXplID0gbWluKHNpemVfcmVtYWluaW5nLCBtYXhfY2h1bmtfc2l6ZSkKKyAgICAgICAgICAgICAgICBjaHVuayA9IHNlbGYucmZpbGUucmVhZChjaHVua19zaXplKQorICAgICAgICAgICAgICAgIGlmIG5vdCBjaHVuazoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChjaHVuaykKKyAgICAgICAgICAgICAgICBzaXplX3JlbWFpbmluZyAtPSBsZW4oTFstMV0pCisgICAgICAgICAgICBkYXRhID0gJycuam9pbihMKQorCisgICAgICAgICAgICBkYXRhID0gc2VsZi5kZWNvZGVfcmVxdWVzdF9jb250ZW50KGRhdGEpCisgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuICNyZXNwb25zZSBoYXMgYmVlbiBzZW50CisKKyAgICAgICAgICAgICMgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU2ltcGxlWE1MUlBDU2VydmVyLCBfZGlzcGF0Y2gKKyAgICAgICAgICAgICMgY291bGQgYmUgb3ZlcnJpZGRlbiBpbiB0aGlzIGNsYXNzLCBpbnN0ZWFkIG9mIGluCisgICAgICAgICAgICAjIFNpbXBsZVhNTFJQQ0Rpc3BhdGNoZXIuIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LAorICAgICAgICAgICAgIyBjaGVjayB0byBzZWUgaWYgYSBzdWJjbGFzcyBpbXBsZW1lbnRzIF9kaXNwYXRjaCBhbmQgZGlzcGF0Y2gKKyAgICAgICAgICAgICMgdXNpbmcgdGhhdCBtZXRob2QgaWYgcHJlc2VudC4KKyAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5zZXJ2ZXIuX21hcnNoYWxlZF9kaXNwYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgZGF0YSwgZ2V0YXR0cihzZWxmLCAnX2Rpc3BhdGNoJywgTm9uZSksIHNlbGYucGF0aAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZTogIyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbiBpZiB0aGUgbW9kdWxlIGlzIGJ1Z2d5CisgICAgICAgICAgICAjIGludGVybmFsIGVycm9yLCByZXBvcnQgYXMgSFRUUCBzZXJ2ZXIgZXJyb3IKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSg1MDApCisKKyAgICAgICAgICAgICMgU2VuZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhjZXB0aW9uIGlmIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnNlcnZlciwgJ19zZW5kX3RyYWNlYmFja19oZWFkZXInKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5fc2VuZF90cmFjZWJhY2tfaGVhZGVyOgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIlgtZXhjZXB0aW9uIiwgc3RyKGUpKQorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIlgtdHJhY2ViYWNrIiwgdHJhY2ViYWNrLmZvcm1hdF9leGMoKSkKKworICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1sZW5ndGgiLCAiMCIpCisgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZ290IGEgdmFsaWQgWE1MIFJQQyByZXNwb25zZQorICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDIwMCkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJ0ZXh0L3htbCIpCisgICAgICAgICAgICBpZiBzZWxmLmVuY29kZV90aHJlc2hvbGQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgbGVuKHJlc3BvbnNlKSA+IHNlbGYuZW5jb2RlX3RocmVzaG9sZDoKKyAgICAgICAgICAgICAgICAgICAgcSA9IHNlbGYuYWNjZXB0X2VuY29kaW5ncygpLmdldCgiZ3ppcCIsIDApCisgICAgICAgICAgICAgICAgICAgIGlmIHE6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB4bWxycGNsaWIuZ3ppcF9lbmNvZGUocmVzcG9uc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1FbmNvZGluZyIsICJnemlwIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIiwgc3RyKGxlbihyZXNwb25zZSkpKQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKHJlc3BvbnNlKQorCisgICAgZGVmIGRlY29kZV9yZXF1ZXN0X2NvbnRlbnQoc2VsZiwgZGF0YSk6CisgICAgICAgICNzdXBwb3J0IGd6aXAgZW5jb2Rpbmcgb2YgcmVxdWVzdAorICAgICAgICBlbmNvZGluZyA9IHNlbGYuaGVhZGVycy5nZXQoImNvbnRlbnQtZW5jb2RpbmciLCAiaWRlbnRpdHkiKS5sb3dlcigpCisgICAgICAgIGlmIGVuY29kaW5nID09ICJpZGVudGl0eSI6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICBpZiBlbmNvZGluZyA9PSAiZ3ppcCI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHhtbHJwY2xpYi5nemlwX2RlY29kZShkYXRhKQorICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDUwMSwgImVuY29kaW5nICVyIG5vdCBzdXBwb3J0ZWQiICUgZW5jb2RpbmcpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNDAwLCAiZXJyb3IgZGVjb2RpbmcgZ3ppcCBjb250ZW50IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSg1MDEsICJlbmNvZGluZyAlciBub3Qgc3VwcG9ydGVkIiAlIGVuY29kaW5nKQorICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LWxlbmd0aCIsICIwIikKKyAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisKKyAgICBkZWYgcmVwb3J0XzQwNCAoc2VsZik6CisgICAgICAgICAgICAjIFJlcG9ydCBhIDQwNCBlcnJvcgorICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoNDA0KQorICAgICAgICByZXNwb25zZSA9ICdObyBzdWNoIHBhZ2UnCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJ0ZXh0L3BsYWluIikKKyAgICAgICAgc2VsZi5zZW5kX2hlYWRlcigiQ29udGVudC1sZW5ndGgiLCBzdHIobGVuKHJlc3BvbnNlKSkpCisgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICBzZWxmLndmaWxlLndyaXRlKHJlc3BvbnNlKQorCisgICAgZGVmIGxvZ19yZXF1ZXN0KHNlbGYsIGNvZGU9Jy0nLCBzaXplPSctJyk6CisgICAgICAgICIiIlNlbGVjdGl2ZWx5IGxvZyBhbiBhY2NlcHRlZCByZXF1ZXN0LiIiIgorCisgICAgICAgIGlmIHNlbGYuc2VydmVyLmxvZ1JlcXVlc3RzOgorICAgICAgICAgICAgQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlci5sb2dfcmVxdWVzdChzZWxmLCBjb2RlLCBzaXplKQorCitjbGFzcyBTaW1wbGVYTUxSUENTZXJ2ZXIoU29ja2V0U2VydmVyLlRDUFNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVYTUxSUENEaXNwYXRjaGVyKToKKyAgICAiIiJTaW1wbGUgWE1MLVJQQyBzZXJ2ZXIuCisKKyAgICBTaW1wbGUgWE1MLVJQQyBzZXJ2ZXIgdGhhdCBhbGxvd3MgZnVuY3Rpb25zIGFuZCBhIHNpbmdsZSBpbnN0YW5jZQorICAgIHRvIGJlIGluc3RhbGxlZCB0byBoYW5kbGUgcmVxdWVzdHMuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgYXR0ZW1wdHMgdG8gZGlzcGF0Y2ggWE1MLVJQQyBjYWxscyB0byB0aGUgZnVuY3Rpb25zIG9yIGluc3RhbmNlCisgICAgaW5zdGFsbGVkIGluIHRoZSBzZXJ2ZXIuIE92ZXJyaWRlIHRoZSBfZGlzcGF0Y2ggbWV0aG9kIGluaGVyZXRlZAorICAgIGZyb20gU2ltcGxlWE1MUlBDRGlzcGF0Y2hlciB0byBjaGFuZ2UgdGhpcyBiZWhhdmlvci4KKyAgICAiIiIKKworICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSBUcnVlCisKKyAgICAjIFdhcm5pbmc6IHRoaXMgaXMgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5ISBOZXZlciBzZXQgdGhpcyB0byBUcnVlIGluCisgICAgIyBwcm9kdWN0aW9uIGNvZGUsIGFzIHdpbGwgYmUgc2VuZGluZyBvdXQgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIChleGNlcHRpb24KKyAgICAjIGFuZCBzdGFjayB0cmFjZSBkZXRhaWxzKSB3aGVuIGV4Y2VwdGlvbnMgYXJlIHJhaXNlZCBpbnNpZGUKKyAgICAjIFNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyLmRvX1BPU1QKKyAgICBfc2VuZF90cmFjZWJhY2tfaGVhZGVyID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyLCByZXF1ZXN0SGFuZGxlcj1TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9VHJ1ZSwgYWxsb3dfbm9uZT1GYWxzZSwgZW5jb2Rpbmc9Tm9uZSwgYmluZF9hbmRfYWN0aXZhdGU9VHJ1ZSk6CisgICAgICAgIHNlbGYubG9nUmVxdWVzdHMgPSBsb2dSZXF1ZXN0cworCisgICAgICAgIFNpbXBsZVhNTFJQQ0Rpc3BhdGNoZXIuX19pbml0X18oc2VsZiwgYWxsb3dfbm9uZSwgZW5jb2RpbmcpCisgICAgICAgIFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIuX19pbml0X18oc2VsZiwgYWRkciwgcmVxdWVzdEhhbmRsZXIsIGJpbmRfYW5kX2FjdGl2YXRlKQorCisgICAgICAgICMgW0J1ZyAjMTIyMjc5MF0gSWYgcG9zc2libGUsIHNldCBjbG9zZS1vbi1leGVjIGZsYWc7IGlmIGEKKyAgICAgICAgIyBtZXRob2Qgc3Bhd25zIGEgc3VicHJvY2VzcywgdGhlIHN1YnByb2Nlc3Mgc2hvdWxkbid0IGhhdmUKKyAgICAgICAgIyB0aGUgbGlzdGVuaW5nIHNvY2tldCBvcGVuLgorICAgICAgICBpZiBmY250bCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihmY250bCwgJ0ZEX0NMT0VYRUMnKToKKyAgICAgICAgICAgIGZsYWdzID0gZmNudGwuZmNudGwoc2VsZi5maWxlbm8oKSwgZmNudGwuRl9HRVRGRCkKKyAgICAgICAgICAgIGZsYWdzIHw9IGZjbnRsLkZEX0NMT0VYRUMKKyAgICAgICAgICAgIGZjbnRsLmZjbnRsKHNlbGYuZmlsZW5vKCksIGZjbnRsLkZfU0VURkQsIGZsYWdzKQorCitjbGFzcyBNdWx0aVBhdGhYTUxSUENTZXJ2ZXIoU2ltcGxlWE1MUlBDU2VydmVyKToKKyAgICAiIiJNdWx0aXBhdGggWE1MLVJQQyBTZXJ2ZXIKKyAgICBUaGlzIHNwZWNpYWxpemF0aW9uIG9mIFNpbXBsZVhNTFJQQ1NlcnZlciBhbGxvd3MgdGhlIHVzZXIgdG8gY3JlYXRlCisgICAgbXVsdGlwbGUgRGlzcGF0Y2hlciBpbnN0YW5jZXMgYW5kIGFzc2lnbiB0aGVtIHRvIGRpZmZlcmVudAorICAgIEhUVFAgcmVxdWVzdCBwYXRocy4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gcnVuIHR3byBvciBtb3JlCisgICAgJ3ZpcnR1YWwgWE1MLVJQQyBzZXJ2ZXJzJyBhdCB0aGUgc2FtZSBwb3J0LgorICAgIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXF1ZXN0SGFuZGxlciBhY2NlcHRzIHRoZSBwYXRocyBpbiBxdWVzdGlvbi4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkciwgcmVxdWVzdEhhbmRsZXI9U2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPVRydWUsIGFsbG93X25vbmU9RmFsc2UsIGVuY29kaW5nPU5vbmUsIGJpbmRfYW5kX2FjdGl2YXRlPVRydWUpOgorCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5fX2luaXRfXyhzZWxmLCBhZGRyLCByZXF1ZXN0SGFuZGxlciwgbG9nUmVxdWVzdHMsIGFsbG93X25vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgYmluZF9hbmRfYWN0aXZhdGUpCisgICAgICAgIHNlbGYuZGlzcGF0Y2hlcnMgPSB7fQorICAgICAgICBzZWxmLmFsbG93X25vbmUgPSBhbGxvd19ub25lCisgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworCisgICAgZGVmIGFkZF9kaXNwYXRjaGVyKHNlbGYsIHBhdGgsIGRpc3BhdGNoZXIpOgorICAgICAgICBzZWxmLmRpc3BhdGNoZXJzW3BhdGhdID0gZGlzcGF0Y2hlcgorICAgICAgICByZXR1cm4gZGlzcGF0Y2hlcgorCisgICAgZGVmIGdldF9kaXNwYXRjaGVyKHNlbGYsIHBhdGgpOgorICAgICAgICByZXR1cm4gc2VsZi5kaXNwYXRjaGVyc1twYXRoXQorCisgICAgZGVmIF9tYXJzaGFsZWRfZGlzcGF0Y2goc2VsZiwgZGF0YSwgZGlzcGF0Y2hfbWV0aG9kID0gTm9uZSwgcGF0aCA9IE5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuZGlzcGF0Y2hlcnNbcGF0aF0uX21hcnNoYWxlZF9kaXNwYXRjaCgKKyAgICAgICAgICAgICAgIGRhdGEsIGRpc3BhdGNoX21ldGhvZCwgcGF0aCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyByZXBvcnQgbG93IGxldmVsIGV4Y2VwdGlvbiBiYWNrIHRvIHNlcnZlcgorICAgICAgICAgICAgIyAoZWFjaCBkaXNwYXRjaGVyIHNob3VsZCBoYXZlIGhhbmRsZWQgdGhlaXIgb3duCisgICAgICAgICAgICAjIGV4Y2VwdGlvbnMpCisgICAgICAgICAgICBleGNfdHlwZSwgZXhjX3ZhbHVlID0gc3lzLmV4Y19pbmZvKClbOjJdCisgICAgICAgICAgICByZXNwb25zZSA9IHhtbHJwY2xpYi5kdW1wcygKKyAgICAgICAgICAgICAgICB4bWxycGNsaWIuRmF1bHQoMSwgIiVzOiVzIiAlIChleGNfdHlwZSwgZXhjX3ZhbHVlKSksCisgICAgICAgICAgICAgICAgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZywgYWxsb3dfbm9uZT1zZWxmLmFsbG93X25vbmUpCisgICAgICAgIHJldHVybiByZXNwb25zZQorCitjbGFzcyBDR0lYTUxSUENSZXF1ZXN0SGFuZGxlcihTaW1wbGVYTUxSUENEaXNwYXRjaGVyKToKKyAgICAiIiJTaW1wbGUgaGFuZGxlciBmb3IgWE1MLVJQQyBkYXRhIHBhc3NlZCB0aHJvdWdoIENHSS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd19ub25lPUZhbHNlLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgU2ltcGxlWE1MUlBDRGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmLCBhbGxvd19ub25lLCBlbmNvZGluZykKKworICAgIGRlZiBoYW5kbGVfeG1scnBjKHNlbGYsIHJlcXVlc3RfdGV4dCk6CisgICAgICAgICIiIkhhbmRsZSBhIHNpbmdsZSBYTUwtUlBDIHJlcXVlc3QiIiIKKworICAgICAgICByZXNwb25zZSA9IHNlbGYuX21hcnNoYWxlZF9kaXNwYXRjaChyZXF1ZXN0X3RleHQpCisKKyAgICAgICAgcHJpbnQgJ0NvbnRlbnQtVHlwZTogdGV4dC94bWwnCisgICAgICAgIHByaW50ICdDb250ZW50LUxlbmd0aDogJWQnICUgbGVuKHJlc3BvbnNlKQorICAgICAgICBwcmludAorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHJlc3BvbnNlKQorCisgICAgZGVmIGhhbmRsZV9nZXQoc2VsZik6CisgICAgICAgICIiIkhhbmRsZSBhIHNpbmdsZSBIVFRQIEdFVCByZXF1ZXN0LgorCisgICAgICAgIERlZmF1bHQgaW1wbGVtZW50YXRpb24gaW5kaWNhdGVzIGFuIGVycm9yIGJlY2F1c2UKKyAgICAgICAgWE1MLVJQQyB1c2VzIHRoZSBQT1NUIG1ldGhvZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgY29kZSA9IDQwMAorICAgICAgICBtZXNzYWdlLCBleHBsYWluID0gXAorICAgICAgICAgICAgICAgICBCYXNlSFRUUFNlcnZlci5CYXNlSFRUUFJlcXVlc3RIYW5kbGVyLnJlc3BvbnNlc1tjb2RlXQorCisgICAgICAgIHJlc3BvbnNlID0gQmFzZUhUVFBTZXJ2ZXIuREVGQVVMVF9FUlJPUl9NRVNTQUdFICUgXAorICAgICAgICAgICAgeworICAgICAgICAgICAgICdjb2RlJyA6IGNvZGUsCisgICAgICAgICAgICAgJ21lc3NhZ2UnIDogbWVzc2FnZSwKKyAgICAgICAgICAgICAnZXhwbGFpbicgOiBleHBsYWluCisgICAgICAgICAgICB9CisgICAgICAgIHByaW50ICdTdGF0dXM6ICVkICVzJyAlIChjb2RlLCBtZXNzYWdlKQorICAgICAgICBwcmludCAnQ29udGVudC1UeXBlOiAlcycgJSBCYXNlSFRUUFNlcnZlci5ERUZBVUxUX0VSUk9SX0NPTlRFTlRfVFlQRQorICAgICAgICBwcmludCAnQ29udGVudC1MZW5ndGg6ICVkJyAlIGxlbihyZXNwb25zZSkKKyAgICAgICAgcHJpbnQKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShyZXNwb25zZSkKKworICAgIGRlZiBoYW5kbGVfcmVxdWVzdChzZWxmLCByZXF1ZXN0X3RleHQgPSBOb25lKToKKyAgICAgICAgIiIiSGFuZGxlIGEgc2luZ2xlIFhNTC1SUEMgcmVxdWVzdCBwYXNzZWQgdGhyb3VnaCBhIENHSSBwb3N0IG1ldGhvZC4KKworICAgICAgICBJZiBubyBYTUwgZGF0YSBpcyBnaXZlbiB0aGVuIGl0IGlzIHJlYWQgZnJvbSBzdGRpbi4gVGhlIHJlc3VsdGluZworICAgICAgICBYTUwtUlBDIHJlc3BvbnNlIGlzIHByaW50ZWQgdG8gc3Rkb3V0IGFsb25nIHdpdGggdGhlIGNvcnJlY3QgSFRUUAorICAgICAgICBoZWFkZXJzLgorICAgICAgICAiIiIKKworICAgICAgICBpZiByZXF1ZXN0X3RleHQgaXMgTm9uZSBhbmQgXAorICAgICAgICAgICAgb3MuZW52aXJvbi5nZXQoJ1JFUVVFU1RfTUVUSE9EJywgTm9uZSkgPT0gJ0dFVCc6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9nZXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQT1NUIGRhdGEgaXMgbm9ybWFsbHkgYXZhaWxhYmxlIHRocm91Z2ggc3RkaW4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBpbnQob3MuZW52aXJvbi5nZXQoJ0NPTlRFTlRfTEVOR1RIJywgTm9uZSkpCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgbGVuZ3RoID0gLTEKKyAgICAgICAgICAgIGlmIHJlcXVlc3RfdGV4dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJlcXVlc3RfdGV4dCA9IHN5cy5zdGRpbi5yZWFkKGxlbmd0aCkKKworICAgICAgICAgICAgc2VsZi5oYW5kbGVfeG1scnBjKHJlcXVlc3RfdGV4dCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwcmludCAnUnVubmluZyBYTUwtUlBDIHNlcnZlciBvbiBwb3J0IDgwMDAnCisgICAgc2VydmVyID0gU2ltcGxlWE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgODAwMCkpCisgICAgc2VydmVyLnJlZ2lzdGVyX2Z1bmN0aW9uKHBvdykKKyAgICBzZXJ2ZXIucmVnaXN0ZXJfZnVuY3Rpb24obGFtYmRhIHgseTogeCt5LCAnYWRkJykKKyAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1NpbXBsZVhNTFJQQ1NlcnZlci5weWMgYi9saWIvcHl0aG9uMi43L1NpbXBsZVhNTFJQQ1NlcnZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlZTJjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU2ltcGxlWE1MUlBDU2VydmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1NpbXBsZVhNTFJQQ1NlcnZlci5weW8gYi9saWIvcHl0aG9uMi43L1NpbXBsZVhNTFJQQ1NlcnZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdlZTJjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvU2ltcGxlWE1MUlBDU2VydmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1NvY2tldFNlcnZlci5weSBiL2xpYi9weXRob24yLjcvU29ja2V0U2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjExYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1NvY2tldFNlcnZlci5weQpAQCAtMCwwICsxLDczMSBAQAorIiIiR2VuZXJpYyBzb2NrZXQgc2VydmVyIGNsYXNzZXMuCisKK1RoaXMgbW9kdWxlIHRyaWVzIHRvIGNhcHR1cmUgdGhlIHZhcmlvdXMgYXNwZWN0cyBvZiBkZWZpbmluZyBhIHNlcnZlcjoKKworRm9yIHNvY2tldC1iYXNlZCBzZXJ2ZXJzOgorCistIGFkZHJlc3MgZmFtaWx5OgorICAgICAgICAtIEFGX0lORVR7LDZ9OiBJUCAoSW50ZXJuZXQgUHJvdG9jb2wpIHNvY2tldHMgKGRlZmF1bHQpCisgICAgICAgIC0gQUZfVU5JWDogVW5peCBkb21haW4gc29ja2V0cworICAgICAgICAtIG90aGVycywgZS5nLiBBRl9ERUNORVQgYXJlIGNvbmNlaXZhYmxlIChzZWUgPHNvY2tldC5oPgorLSBzb2NrZXQgdHlwZToKKyAgICAgICAgLSBTT0NLX1NUUkVBTSAocmVsaWFibGUgc3RyZWFtLCBlLmcuIFRDUCkKKyAgICAgICAgLSBTT0NLX0RHUkFNIChkYXRhZ3JhbXMsIGUuZy4gVURQKQorCitGb3IgcmVxdWVzdC1iYXNlZCBzZXJ2ZXJzIChpbmNsdWRpbmcgc29ja2V0LWJhc2VkKToKKworLSBjbGllbnQgYWRkcmVzcyB2ZXJpZmljYXRpb24gYmVmb3JlIGZ1cnRoZXIgbG9va2luZyBhdCB0aGUgcmVxdWVzdAorICAgICAgICAoVGhpcyBpcyBhY3R1YWxseSBhIGhvb2sgZm9yIGFueSBwcm9jZXNzaW5nIHRoYXQgbmVlZHMgdG8gbG9vaworICAgICAgICAgYXQgdGhlIHJlcXVlc3QgYmVmb3JlIGFueXRoaW5nIGVsc2UsIGUuZy4gbG9nZ2luZykKKy0gaG93IHRvIGhhbmRsZSBtdWx0aXBsZSByZXF1ZXN0czoKKyAgICAgICAgLSBzeW5jaHJvbm91cyAob25lIHJlcXVlc3QgaXMgaGFuZGxlZCBhdCBhIHRpbWUpCisgICAgICAgIC0gZm9ya2luZyAoZWFjaCByZXF1ZXN0IGlzIGhhbmRsZWQgYnkgYSBuZXcgcHJvY2VzcykKKyAgICAgICAgLSB0aHJlYWRpbmcgKGVhY2ggcmVxdWVzdCBpcyBoYW5kbGVkIGJ5IGEgbmV3IHRocmVhZCkKKworVGhlIGNsYXNzZXMgaW4gdGhpcyBtb2R1bGUgZmF2b3IgdGhlIHNlcnZlciB0eXBlIHRoYXQgaXMgc2ltcGxlc3QgdG8KK3dyaXRlOiBhIHN5bmNocm9ub3VzIFRDUC9JUCBzZXJ2ZXIuICBUaGlzIGlzIGJhZCBjbGFzcyBkZXNpZ24sIGJ1dAorc2F2ZSBzb21lIHR5cGluZy4gIChUaGVyZSdzIGFsc28gdGhlIGlzc3VlIHRoYXQgYSBkZWVwIGNsYXNzIGhpZXJhcmNoeQorc2xvd3MgZG93biBtZXRob2QgbG9va3Vwcy4pCisKK1RoZXJlIGFyZSBmaXZlIGNsYXNzZXMgaW4gYW4gaW5oZXJpdGFuY2UgZGlhZ3JhbSwgZm91ciBvZiB3aGljaCByZXByZXNlbnQKK3N5bmNocm9ub3VzIHNlcnZlcnMgb2YgZm91ciB0eXBlczoKKworICAgICAgICArLS0tLS0tLS0tLS0tKworICAgICAgICB8IEJhc2VTZXJ2ZXIgfAorICAgICAgICArLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICB8CisgICAgICAgICAgICAgIHYKKyAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBUQ1BTZXJ2ZXIgfC0tLS0tLS0+fCBVbml4U3RyZWFtU2VydmVyIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICB2CisgICAgICAgICstLS0tLS0tLS0tLSsgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBVRFBTZXJ2ZXIgfC0tLS0tLS0+fCBVbml4RGF0YWdyYW1TZXJ2ZXIgfAorICAgICAgICArLS0tLS0tLS0tLS0rICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisKK05vdGUgdGhhdCBVbml4RGF0YWdyYW1TZXJ2ZXIgZGVyaXZlcyBmcm9tIFVEUFNlcnZlciwgbm90IGZyb20KK1VuaXhTdHJlYW1TZXJ2ZXIgLS0gdGhlIG9ubHkgZGlmZmVyZW5jZSBiZXR3ZWVuIGFuIElQIGFuZCBhIFVuaXgKK3N0cmVhbSBzZXJ2ZXIgaXMgdGhlIGFkZHJlc3MgZmFtaWx5LCB3aGljaCBpcyBzaW1wbHkgcmVwZWF0ZWQgaW4gYm90aAordW5peCBzZXJ2ZXIgY2xhc3Nlcy4KKworRm9ya2luZyBhbmQgdGhyZWFkaW5nIHZlcnNpb25zIG9mIGVhY2ggdHlwZSBvZiBzZXJ2ZXIgY2FuIGJlIGNyZWF0ZWQKK3VzaW5nIHRoZSBGb3JraW5nTWl4SW4gYW5kIFRocmVhZGluZ01peEluIG1peC1pbiBjbGFzc2VzLiAgRm9yCitpbnN0YW5jZSwgYSB0aHJlYWRpbmcgVURQIHNlcnZlciBjbGFzcyBpcyBjcmVhdGVkIGFzIGZvbGxvd3M6CisKKyAgICAgICAgY2xhc3MgVGhyZWFkaW5nVURQU2VydmVyKFRocmVhZGluZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCisKK1RoZSBNaXgtaW4gY2xhc3MgbXVzdCBjb21lIGZpcnN0LCBzaW5jZSBpdCBvdmVycmlkZXMgYSBtZXRob2QgZGVmaW5lZAoraW4gVURQU2VydmVyISBTZXR0aW5nIHRoZSB2YXJpb3VzIG1lbWJlciB2YXJpYWJsZXMgYWxzbyBjaGFuZ2VzCit0aGUgYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcgc2VydmVyIG1lY2hhbmlzbS4KKworVG8gaW1wbGVtZW50IGEgc2VydmljZSwgeW91IG11c3QgZGVyaXZlIGEgY2xhc3MgZnJvbQorQmFzZVJlcXVlc3RIYW5kbGVyIGFuZCByZWRlZmluZSBpdHMgaGFuZGxlKCkgbWV0aG9kLiAgWW91IGNhbiB0aGVuIHJ1bgordmFyaW91cyB2ZXJzaW9ucyBvZiB0aGUgc2VydmljZSBieSBjb21iaW5pbmcgb25lIG9mIHRoZSBzZXJ2ZXIgY2xhc3Nlcword2l0aCB5b3VyIHJlcXVlc3QgaGFuZGxlciBjbGFzcy4KKworVGhlIHJlcXVlc3QgaGFuZGxlciBjbGFzcyBtdXN0IGJlIGRpZmZlcmVudCBmb3IgZGF0YWdyYW0gb3Igc3RyZWFtCitzZXJ2aWNlcy4gIFRoaXMgY2FuIGJlIGhpZGRlbiBieSB1c2luZyB0aGUgcmVxdWVzdCBoYW5kbGVyCitzdWJjbGFzc2VzIFN0cmVhbVJlcXVlc3RIYW5kbGVyIG9yIERhdGFncmFtUmVxdWVzdEhhbmRsZXIuCisKK09mIGNvdXJzZSwgeW91IHN0aWxsIGhhdmUgdG8gdXNlIHlvdXIgaGVhZCEKKworRm9yIGluc3RhbmNlLCBpdCBtYWtlcyBubyBzZW5zZSB0byB1c2UgYSBmb3JraW5nIHNlcnZlciBpZiB0aGUgc2VydmljZQorY29udGFpbnMgc3RhdGUgaW4gbWVtb3J5IHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJ5IHJlcXVlc3RzIChzaW5jZSB0aGUKK21vZGlmaWNhdGlvbnMgaW4gdGhlIGNoaWxkIHByb2Nlc3Mgd291bGQgbmV2ZXIgcmVhY2ggdGhlIGluaXRpYWwgc3RhdGUKK2tlcHQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIGFuZCBwYXNzZWQgdG8gZWFjaCBjaGlsZCkuICBJbiB0aGlzIGNhc2UsCit5b3UgY2FuIHVzZSBhIHRocmVhZGluZyBzZXJ2ZXIsIGJ1dCB5b3Ugd2lsbCBwcm9iYWJseSBoYXZlIHRvIHVzZQorbG9ja3MgdG8gYXZvaWQgdHdvIHJlcXVlc3RzIHRoYXQgY29tZSBpbiBuZWFybHkgc2ltdWx0YW5lb3VzIHRvIGFwcGx5Citjb25mbGljdGluZyBjaGFuZ2VzIHRvIHRoZSBzZXJ2ZXIgc3RhdGUuCisKK09uIHRoZSBvdGhlciBoYW5kLCBpZiB5b3UgYXJlIGJ1aWxkaW5nIGUuZy4gYW4gSFRUUCBzZXJ2ZXIsIHdoZXJlIGFsbAorZGF0YSBpcyBzdG9yZWQgZXh0ZXJuYWxseSAoZS5nLiBpbiB0aGUgZmlsZSBzeXN0ZW0pLCBhIHN5bmNocm9ub3VzCitjbGFzcyB3aWxsIGVzc2VudGlhbGx5IHJlbmRlciB0aGUgc2VydmljZSAiZGVhZiIgd2hpbGUgb25lIHJlcXVlc3QgaXMKK2JlaW5nIGhhbmRsZWQgLS0gd2hpY2ggbWF5IGJlIGZvciBhIHZlcnkgbG9uZyB0aW1lIGlmIGEgY2xpZW50IGlzIHNsb3cKK3RvIHJlYWQgYWxsIHRoZSBkYXRhIGl0IGhhcyByZXF1ZXN0ZWQuICBIZXJlIGEgdGhyZWFkaW5nIG9yIGZvcmtpbmcKK3NlcnZlciBpcyBhcHByb3ByaWF0ZS4KKworSW4gc29tZSBjYXNlcywgaXQgbWF5IGJlIGFwcHJvcHJpYXRlIHRvIHByb2Nlc3MgcGFydCBvZiBhIHJlcXVlc3QKK3N5bmNocm9ub3VzbHksIGJ1dCB0byBmaW5pc2ggcHJvY2Vzc2luZyBpbiBhIGZvcmtlZCBjaGlsZCBkZXBlbmRpbmcgb24KK3RoZSByZXF1ZXN0IGRhdGEuICBUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBieSB1c2luZyBhIHN5bmNocm9ub3VzCitzZXJ2ZXIgYW5kIGRvaW5nIGFuIGV4cGxpY2l0IGZvcmsgaW4gdGhlIHJlcXVlc3QgaGFuZGxlciBjbGFzcworaGFuZGxlKCkgbWV0aG9kLgorCitBbm90aGVyIGFwcHJvYWNoIHRvIGhhbmRsaW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cyByZXF1ZXN0cyBpbiBhbgorZW52aXJvbm1lbnQgdGhhdCBzdXBwb3J0cyBuZWl0aGVyIHRocmVhZHMgbm9yIGZvcmsgKG9yIHdoZXJlIHRoZXNlIGFyZQordG9vIGV4cGVuc2l2ZSBvciBpbmFwcHJvcHJpYXRlIGZvciB0aGUgc2VydmljZSkgaXMgdG8gbWFpbnRhaW4gYW4KK2V4cGxpY2l0IHRhYmxlIG9mIHBhcnRpYWxseSBmaW5pc2hlZCByZXF1ZXN0cyBhbmQgdG8gdXNlIHNlbGVjdCgpIHRvCitkZWNpZGUgd2hpY2ggcmVxdWVzdCB0byB3b3JrIG9uIG5leHQgKG9yIHdoZXRoZXIgdG8gaGFuZGxlIGEgbmV3CitpbmNvbWluZyByZXF1ZXN0KS4gIFRoaXMgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3Igc3RyZWFtIHNlcnZpY2VzCit3aGVyZSBlYWNoIGNsaWVudCBjYW4gcG90ZW50aWFsbHkgYmUgY29ubmVjdGVkIGZvciBhIGxvbmcgdGltZSAoaWYKK3RocmVhZHMgb3Igc3VicHJvY2Vzc2VzIGNhbm5vdCBiZSB1c2VkKS4KKworRnV0dXJlIHdvcms6CistIFN0YW5kYXJkIGNsYXNzZXMgZm9yIFN1biBSUEMgKHdoaWNoIHVzZXMgZWl0aGVyIFVEUCBvciBUQ1ApCistIFN0YW5kYXJkIG1peC1pbiBjbGFzc2VzIHRvIGltcGxlbWVudCB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uCisgIGFuZCBlbmNyeXB0aW9uIHNjaGVtZXMKKy0gU3RhbmRhcmQgZnJhbWV3b3JrIGZvciBzZWxlY3QtYmFzZWQgbXVsdGlwbGV4aW5nCisKK1hYWCBPcGVuIHByb2JsZW1zOgorLSBXaGF0IHRvIGRvIHdpdGggb3V0LW9mLWJhbmQgZGF0YT8KKworQmFzZVNlcnZlcjoKKy0gc3BsaXQgZ2VuZXJpYyAicmVxdWVzdCIgZnVuY3Rpb25hbGl0eSBvdXQgaW50byBCYXNlU2VydmVyIGNsYXNzLgorICBDb3B5cmlnaHQgKEMpIDIwMDAgIEx1a2UgS2VubmV0aCBDYXNzb24gTGVpZ2h0b24gPGxrY2xAc2FtYmEub3JnPgorCisgIGV4YW1wbGU6IHJlYWQgZW50cmllcyBmcm9tIGEgU1FMIGRhdGFiYXNlIChyZXF1aXJlcyBvdmVycmlkaW5nCisgIGdldF9yZXF1ZXN0KCkgdG8gcmV0dXJuIGEgdGFibGUgZW50cnkgZnJvbSB0aGUgZGF0YWJhc2UpLgorICBlbnRyeSBpcyBwcm9jZXNzZWQgYnkgYSBSZXF1ZXN0SGFuZGxlckNsYXNzLgorCisiIiIKKworIyBBdXRob3Igb2YgdGhlIEJhc2VTZXJ2ZXIgcGF0Y2g6IEx1a2UgS2VubmV0aCBDYXNzb24gTGVpZ2h0b24KKworIyBYWFggV2FybmluZyEKKyMgVGhlcmUgaXMgYSB0ZXN0IHN1aXRlIGZvciB0aGlzIG1vZHVsZSwgYnV0IGl0IGNhbm5vdCBiZSBydW4gYnkgdGhlCisjIHN0YW5kYXJkIHJlZ3Jlc3Npb24gdGVzdC4KKyMgVG8gcnVuIGl0IG1hbnVhbGx5LCBydW4gTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkuCisKK19fdmVyc2lvbl9fID0gIjAuNCIKKworCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgZHVtbXlfdGhyZWFkaW5nIGFzIHRocmVhZGluZworCitfX2FsbF9fID0gWyJUQ1BTZXJ2ZXIiLCJVRFBTZXJ2ZXIiLCJGb3JraW5nVURQU2VydmVyIiwiRm9ya2luZ1RDUFNlcnZlciIsCisgICAgICAgICAgICJUaHJlYWRpbmdVRFBTZXJ2ZXIiLCJUaHJlYWRpbmdUQ1BTZXJ2ZXIiLCJCYXNlUmVxdWVzdEhhbmRsZXIiLAorICAgICAgICAgICAiU3RyZWFtUmVxdWVzdEhhbmRsZXIiLCJEYXRhZ3JhbVJlcXVlc3RIYW5kbGVyIiwKKyAgICAgICAgICAgIlRocmVhZGluZ01peEluIiwgIkZvcmtpbmdNaXhJbiJdCitpZiBoYXNhdHRyKHNvY2tldCwgIkFGX1VOSVgiKToKKyAgICBfX2FsbF9fLmV4dGVuZChbIlVuaXhTdHJlYW1TZXJ2ZXIiLCJVbml4RGF0YWdyYW1TZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAiVGhyZWFkaW5nVW5peFN0cmVhbVNlcnZlciIsCisgICAgICAgICAgICAgICAgICAgICJUaHJlYWRpbmdVbml4RGF0YWdyYW1TZXJ2ZXIiXSkKKworZGVmIF9laW50cl9yZXRyeShmdW5jLCAqYXJncyk6CisgICAgIiIicmVzdGFydCBhIHN5c3RlbSBjYWxsIGludGVycnVwdGVkIGJ5IEVJTlRSIiIiCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MpCisgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgc2VsZWN0LmVycm9yKSBhcyBlOgorICAgICAgICAgICAgaWYgZS5hcmdzWzBdICE9IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgIHJhaXNlCisKK2NsYXNzIEJhc2VTZXJ2ZXI6CisKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBzZXJ2ZXIgY2xhc3Nlcy4KKworICAgIE1ldGhvZHMgZm9yIHRoZSBjYWxsZXI6CisKKyAgICAtIF9faW5pdF9fKHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzKQorICAgIC0gc2VydmVfZm9yZXZlcihwb2xsX2ludGVydmFsPTAuNSkKKyAgICAtIHNodXRkb3duKCkKKyAgICAtIGhhbmRsZV9yZXF1ZXN0KCkgICMgaWYgeW91IGRvIG5vdCB1c2Ugc2VydmVfZm9yZXZlcigpCisgICAgLSBmaWxlbm8oKSAtPiBpbnQgICAjIGZvciBzZWxlY3QoKQorCisgICAgTWV0aG9kcyB0aGF0IG1heSBiZSBvdmVycmlkZGVuOgorCisgICAgLSBzZXJ2ZXJfYmluZCgpCisgICAgLSBzZXJ2ZXJfYWN0aXZhdGUoKQorICAgIC0gZ2V0X3JlcXVlc3QoKSAtPiByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcworICAgIC0gaGFuZGxlX3RpbWVvdXQoKQorICAgIC0gdmVyaWZ5X3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgLSBzZXJ2ZXJfY2xvc2UoKQorICAgIC0gcHJvY2Vzc19yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgIC0gc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgIC0gY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQorICAgIC0gaGFuZGxlX2Vycm9yKCkKKworICAgIE1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlczoKKworICAgIC0gZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisKKyAgICBDbGFzcyB2YXJpYWJsZXMgdGhhdCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMgb3IKKyAgICBpbnN0YW5jZXM6CisKKyAgICAtIHRpbWVvdXQKKyAgICAtIGFkZHJlc3NfZmFtaWx5CisgICAgLSBzb2NrZXRfdHlwZQorICAgIC0gYWxsb3dfcmV1c2VfYWRkcmVzcworCisgICAgSW5zdGFuY2UgdmFyaWFibGVzOgorCisgICAgLSBSZXF1ZXN0SGFuZGxlckNsYXNzCisgICAgLSBzb2NrZXQKKworICAgICIiIgorCisgICAgdGltZW91dCA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcyk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yLiAgTWF5IGJlIGV4dGVuZGVkLCBkbyBub3Qgb3ZlcnJpZGUuIiIiCisgICAgICAgIHNlbGYuc2VydmVyX2FkZHJlc3MgPSBzZXJ2ZXJfYWRkcmVzcworICAgICAgICBzZWxmLlJlcXVlc3RIYW5kbGVyQ2xhc3MgPSBSZXF1ZXN0SGFuZGxlckNsYXNzCisgICAgICAgIHNlbGYuX19pc19zaHV0X2Rvd24gPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLl9fc2h1dGRvd25fcmVxdWVzdCA9IEZhbHNlCisKKyAgICBkZWYgc2VydmVyX2FjdGl2YXRlKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQgYnkgY29uc3RydWN0b3IgdG8gYWN0aXZhdGUgdGhlIHNlcnZlci4KKworICAgICAgICBNYXkgYmUgb3ZlcnJpZGRlbi4KKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHNlcnZlX2ZvcmV2ZXIoc2VsZiwgcG9sbF9pbnRlcnZhbD0wLjUpOgorICAgICAgICAiIiJIYW5kbGUgb25lIHJlcXVlc3QgYXQgYSB0aW1lIHVudGlsIHNodXRkb3duLgorCisgICAgICAgIFBvbGxzIGZvciBzaHV0ZG93biBldmVyeSBwb2xsX2ludGVydmFsIHNlY29uZHMuIElnbm9yZXMKKyAgICAgICAgc2VsZi50aW1lb3V0LiBJZiB5b3UgbmVlZCB0byBkbyBwZXJpb2RpYyB0YXNrcywgZG8gdGhlbSBpbgorICAgICAgICBhbm90aGVyIHRocmVhZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19pc19zaHV0X2Rvd24uY2xlYXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5fX3NodXRkb3duX3JlcXVlc3Q6CisgICAgICAgICAgICAgICAgIyBYWFg6IENvbnNpZGVyIHVzaW5nIGFub3RoZXIgZmlsZSBkZXNjcmlwdG9yIG9yCisgICAgICAgICAgICAgICAgIyBjb25uZWN0aW5nIHRvIHRoZSBzb2NrZXQgdG8gd2FrZSB0aGlzIHVwIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICAjIHBvbGxpbmcuIFBvbGxpbmcgcmVkdWNlcyBvdXIgcmVzcG9uc2l2ZW5lc3MgdG8gYQorICAgICAgICAgICAgICAgICMgc2h1dGRvd24gcmVxdWVzdCBhbmQgd2FzdGVzIGNwdSBhdCBhbGwgb3RoZXIgdGltZXMuCisgICAgICAgICAgICAgICAgciwgdywgZSA9IF9laW50cl9yZXRyeShzZWxlY3Quc2VsZWN0LCBbc2VsZl0sIFtdLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbGxfaW50ZXJ2YWwpCisgICAgICAgICAgICAgICAgaWYgc2VsZiBpbiByOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9oYW5kbGVfcmVxdWVzdF9ub2Jsb2NrKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX19zaHV0ZG93bl9yZXF1ZXN0ID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuX19pc19zaHV0X2Rvd24uc2V0KCkKKworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgIiIiU3RvcHMgdGhlIHNlcnZlX2ZvcmV2ZXIgbG9vcC4KKworICAgICAgICBCbG9ja3MgdW50aWwgdGhlIGxvb3AgaGFzIGZpbmlzaGVkLiBUaGlzIG11c3QgYmUgY2FsbGVkIHdoaWxlCisgICAgICAgIHNlcnZlX2ZvcmV2ZXIoKSBpcyBydW5uaW5nIGluIGFub3RoZXIgdGhyZWFkLCBvciBpdCB3aWxsCisgICAgICAgIGRlYWRsb2NrLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX3NodXRkb3duX3JlcXVlc3QgPSBUcnVlCisgICAgICAgIHNlbGYuX19pc19zaHV0X2Rvd24ud2FpdCgpCisKKyAgICAjIFRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGhhbmRsaW5nLCBnZXR0aW5nLCBwcm9jZXNzaW5nIGFuZAorICAgICMgZmluaXNoaW5nIGEgcmVxdWVzdCBpcyBmYWlybHkgYXJiaXRyYXJ5LiAgUmVtZW1iZXI6CisgICAgIworICAgICMgLSBoYW5kbGVfcmVxdWVzdCgpIGlzIHRoZSB0b3AtbGV2ZWwgY2FsbC4gIEl0IGNhbGxzCisgICAgIyAgIHNlbGVjdCwgZ2V0X3JlcXVlc3QoKSwgdmVyaWZ5X3JlcXVlc3QoKSBhbmQgcHJvY2Vzc19yZXF1ZXN0KCkKKyAgICAjIC0gZ2V0X3JlcXVlc3QoKSBpcyBkaWZmZXJlbnQgZm9yIHN0cmVhbSBvciBkYXRhZ3JhbSBzb2NrZXRzCisgICAgIyAtIHByb2Nlc3NfcmVxdWVzdCgpIGlzIHRoZSBwbGFjZSB0aGF0IG1heSBmb3JrIGEgbmV3IHByb2Nlc3MKKyAgICAjICAgb3IgY3JlYXRlIGEgbmV3IHRocmVhZCB0byBmaW5pc2ggdGhlIHJlcXVlc3QKKyAgICAjIC0gZmluaXNoX3JlcXVlc3QoKSBpbnN0YW50aWF0ZXMgdGhlIHJlcXVlc3QgaGFuZGxlciBjbGFzczsKKyAgICAjICAgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIGhhbmRsZSB0aGUgcmVxdWVzdCBhbGwgYnkgaXRzZWxmCisKKyAgICBkZWYgaGFuZGxlX3JlcXVlc3Qoc2VsZik6CisgICAgICAgICIiIkhhbmRsZSBvbmUgcmVxdWVzdCwgcG9zc2libHkgYmxvY2tpbmcuCisKKyAgICAgICAgUmVzcGVjdHMgc2VsZi50aW1lb3V0LgorICAgICAgICAiIiIKKyAgICAgICAgIyBTdXBwb3J0IHBlb3BsZSB3aG8gdXNlZCBzb2NrZXQuc2V0dGltZW91dCgpIHRvIGVzY2FwZQorICAgICAgICAjIGhhbmRsZV9yZXF1ZXN0IGJlZm9yZSBzZWxmLnRpbWVvdXQgd2FzIGF2YWlsYWJsZS4KKyAgICAgICAgdGltZW91dCA9IHNlbGYuc29ja2V0LmdldHRpbWVvdXQoKQorICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CisgICAgICAgICAgICB0aW1lb3V0ID0gc2VsZi50aW1lb3V0CisgICAgICAgIGVsaWYgc2VsZi50aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGltZW91dCA9IG1pbih0aW1lb3V0LCBzZWxmLnRpbWVvdXQpCisgICAgICAgIGZkX3NldHMgPSBfZWludHJfcmV0cnkoc2VsZWN0LnNlbGVjdCwgW3NlbGZdLCBbXSwgW10sIHRpbWVvdXQpCisgICAgICAgIGlmIG5vdCBmZF9zZXRzWzBdOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfdGltZW91dCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5faGFuZGxlX3JlcXVlc3Rfbm9ibG9jaygpCisKKyAgICBkZWYgX2hhbmRsZV9yZXF1ZXN0X25vYmxvY2soc2VsZik6CisgICAgICAgICIiIkhhbmRsZSBvbmUgcmVxdWVzdCwgd2l0aG91dCBibG9ja2luZy4KKworICAgICAgICBJIGFzc3VtZSB0aGF0IHNlbGVjdC5zZWxlY3QgaGFzIHJldHVybmVkIHRoYXQgdGhlIHNvY2tldCBpcworICAgICAgICByZWFkYWJsZSBiZWZvcmUgdGhpcyBmdW5jdGlvbiB3YXMgY2FsbGVkLCBzbyB0aGVyZSBzaG91bGQgYmUKKyAgICAgICAgbm8gcmlzayBvZiBibG9ja2luZyBpbiBnZXRfcmVxdWVzdCgpLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MgPSBzZWxmLmdldF9yZXF1ZXN0KCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnZlcmlmeV9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcihyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKworICAgIGRlZiBoYW5kbGVfdGltZW91dChzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIGlmIG5vIG5ldyByZXF1ZXN0IGFycml2ZXMgd2l0aGluIHNlbGYudGltZW91dC4KKworICAgICAgICBPdmVycmlkZGVuIGJ5IEZvcmtpbmdNaXhJbi4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiB2ZXJpZnlfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICIiIlZlcmlmeSB0aGUgcmVxdWVzdC4gIE1heSBiZSBvdmVycmlkZGVuLgorCisgICAgICAgIFJldHVybiBUcnVlIGlmIHdlIHNob3VsZCBwcm9jZWVkIHdpdGggdGhpcyByZXF1ZXN0LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHByb2Nlc3NfcmVxdWVzdChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICIiIkNhbGwgZmluaXNoX3JlcXVlc3QuCisKKyAgICAgICAgT3ZlcnJpZGRlbiBieSBGb3JraW5nTWl4SW4gYW5kIFRocmVhZGluZ01peEluLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZpbmlzaF9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKworICAgIGRlZiBzZXJ2ZXJfY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNhbGxlZCB0byBjbGVhbi11cCB0aGUgc2VydmVyLgorCisgICAgICAgIE1heSBiZSBvdmVycmlkZGVuLgorCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluaXNoX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJGaW5pc2ggb25lIHJlcXVlc3QgYnkgaW5zdGFudGlhdGluZyBSZXF1ZXN0SGFuZGxlckNsYXNzLiIiIgorICAgICAgICBzZWxmLlJlcXVlc3RIYW5kbGVyQ2xhc3MocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MsIHNlbGYpCisKKyAgICBkZWYgc2h1dGRvd25fcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgIiIiQ2FsbGVkIHRvIHNodXRkb3duIGFuZCBjbG9zZSBhbiBpbmRpdmlkdWFsIHJlcXVlc3QuIiIiCisgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQorCisgICAgZGVmIGNsb3NlX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgICIiIkNhbGxlZCB0byBjbGVhbiB1cCBhbiBpbmRpdmlkdWFsIHJlcXVlc3QuIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJIYW5kbGUgYW4gZXJyb3IgZ3JhY2VmdWxseS4gIE1heSBiZSBvdmVycmlkZGVuLgorCisgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHByaW50IGEgdHJhY2ViYWNrIGFuZCBjb250aW51ZS4KKworICAgICAgICAiIiIKKyAgICAgICAgcHJpbnQgJy0nKjQwCisgICAgICAgIHByaW50ICdFeGNlcHRpb24gaGFwcGVuZWQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgcmVxdWVzdCBmcm9tJywKKyAgICAgICAgcHJpbnQgY2xpZW50X2FkZHJlc3MKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkgIyBYWFggQnV0IHRoaXMgZ29lcyB0byBzdGRlcnIhCisgICAgICAgIHByaW50ICctJyo0MAorCisKK2NsYXNzIFRDUFNlcnZlcihCYXNlU2VydmVyKToKKworICAgICIiIkJhc2UgY2xhc3MgZm9yIHZhcmlvdXMgc29ja2V0LWJhc2VkIHNlcnZlciBjbGFzc2VzLgorCisgICAgRGVmYXVsdHMgdG8gc3luY2hyb25vdXMgSVAgc3RyZWFtIChpLmUuLCBUQ1ApLgorCisgICAgTWV0aG9kcyBmb3IgdGhlIGNhbGxlcjoKKworICAgIC0gX19pbml0X18oc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MsIGJpbmRfYW5kX2FjdGl2YXRlPVRydWUpCisgICAgLSBzZXJ2ZV9mb3JldmVyKHBvbGxfaW50ZXJ2YWw9MC41KQorICAgIC0gc2h1dGRvd24oKQorICAgIC0gaGFuZGxlX3JlcXVlc3QoKSAgIyBpZiB5b3UgZG9uJ3QgdXNlIHNlcnZlX2ZvcmV2ZXIoKQorICAgIC0gZmlsZW5vKCkgLT4gaW50ICAgIyBmb3Igc2VsZWN0KCkKKworICAgIE1ldGhvZHMgdGhhdCBtYXkgYmUgb3ZlcnJpZGRlbjoKKworICAgIC0gc2VydmVyX2JpbmQoKQorICAgIC0gc2VydmVyX2FjdGl2YXRlKCkKKyAgICAtIGdldF9yZXF1ZXN0KCkgLT4gcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MKKyAgICAtIGhhbmRsZV90aW1lb3V0KCkKKyAgICAtIHZlcmlmeV9yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgIC0gcHJvY2Vzc19yZXF1ZXN0KHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKQorICAgIC0gc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgIC0gY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQorICAgIC0gaGFuZGxlX2Vycm9yKCkKKworICAgIE1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlczoKKworICAgIC0gZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisKKyAgICBDbGFzcyB2YXJpYWJsZXMgdGhhdCBtYXkgYmUgb3ZlcnJpZGRlbiBieSBkZXJpdmVkIGNsYXNzZXMgb3IKKyAgICBpbnN0YW5jZXM6CisKKyAgICAtIHRpbWVvdXQKKyAgICAtIGFkZHJlc3NfZmFtaWx5CisgICAgLSBzb2NrZXRfdHlwZQorICAgIC0gcmVxdWVzdF9xdWV1ZV9zaXplIChvbmx5IGZvciBzdHJlYW0gc29ja2V0cykKKyAgICAtIGFsbG93X3JldXNlX2FkZHJlc3MKKworICAgIEluc3RhbmNlIHZhcmlhYmxlczoKKworICAgIC0gc2VydmVyX2FkZHJlc3MKKyAgICAtIFJlcXVlc3RIYW5kbGVyQ2xhc3MKKyAgICAtIHNvY2tldAorCisgICAgIiIiCisKKyAgICBhZGRyZXNzX2ZhbWlseSA9IHNvY2tldC5BRl9JTkVUCisKKyAgICBzb2NrZXRfdHlwZSA9IHNvY2tldC5TT0NLX1NUUkVBTQorCisgICAgcmVxdWVzdF9xdWV1ZV9zaXplID0gNQorCisgICAgYWxsb3dfcmV1c2VfYWRkcmVzcyA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MsIGJpbmRfYW5kX2FjdGl2YXRlPVRydWUpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4gIE1heSBiZSBleHRlbmRlZCwgZG8gbm90IG92ZXJyaWRlLiIiIgorICAgICAgICBCYXNlU2VydmVyLl9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzKQorICAgICAgICBzZWxmLnNvY2tldCA9IHNvY2tldC5zb2NrZXQoc2VsZi5hZGRyZXNzX2ZhbWlseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0X3R5cGUpCisgICAgICAgIGlmIGJpbmRfYW5kX2FjdGl2YXRlOgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfYmluZCgpCisgICAgICAgICAgICBzZWxmLnNlcnZlcl9hY3RpdmF0ZSgpCisKKyAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CisgICAgICAgICIiIkNhbGxlZCBieSBjb25zdHJ1Y3RvciB0byBiaW5kIHRoZSBzb2NrZXQuCisKKyAgICAgICAgTWF5IGJlIG92ZXJyaWRkZW4uCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuYWxsb3dfcmV1c2VfYWRkcmVzczoKKyAgICAgICAgICAgIHNlbGYuc29ja2V0LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIHNlbGYuc29ja2V0LmJpbmQoc2VsZi5zZXJ2ZXJfYWRkcmVzcykKKyAgICAgICAgc2VsZi5zZXJ2ZXJfYWRkcmVzcyA9IHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKCkKKworICAgIGRlZiBzZXJ2ZXJfYWN0aXZhdGUoc2VsZik6CisgICAgICAgICIiIkNhbGxlZCBieSBjb25zdHJ1Y3RvciB0byBhY3RpdmF0ZSB0aGUgc2VydmVyLgorCisgICAgICAgIE1heSBiZSBvdmVycmlkZGVuLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNvY2tldC5saXN0ZW4oc2VsZi5yZXF1ZXN0X3F1ZXVlX3NpemUpCisKKyAgICBkZWYgc2VydmVyX2Nsb3NlKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQgdG8gY2xlYW4tdXAgdGhlIHNlcnZlci4KKworICAgICAgICBNYXkgYmUgb3ZlcnJpZGRlbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHNvY2tldCBmaWxlIG51bWJlci4KKworICAgICAgICBJbnRlcmZhY2UgcmVxdWlyZWQgYnkgc2VsZWN0KCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5maWxlbm8oKQorCisgICAgZGVmIGdldF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIHJlcXVlc3QgYW5kIGNsaWVudCBhZGRyZXNzIGZyb20gdGhlIHNvY2tldC4KKworICAgICAgICBNYXkgYmUgb3ZlcnJpZGRlbi4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmFjY2VwdCgpCisKKyAgICBkZWYgc2h1dGRvd25fcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgIiIiQ2FsbGVkIHRvIHNodXRkb3duIGFuZCBjbG9zZSBhbiBpbmRpdmlkdWFsIHJlcXVlc3QuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICNleHBsaWNpdGx5IHNodXRkb3duLiAgc29ja2V0LmNsb3NlKCkgbWVyZWx5IHJlbGVhc2VzCisgICAgICAgICAgICAjdGhlIHNvY2tldCBhbmQgd2FpdHMgZm9yIEdDIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBjbG9zZS4KKyAgICAgICAgICAgIHJlcXVlc3Quc2h1dGRvd24oc29ja2V0LlNIVVRfV1IpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzICNzb21lIHBsYXRmb3JtcyBtYXkgcmFpc2UgRU5PVENPTk4gaGVyZQorICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkKKworICAgIGRlZiBjbG9zZV9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgorICAgICAgICAiIiJDYWxsZWQgdG8gY2xlYW4gdXAgYW4gaW5kaXZpZHVhbCByZXF1ZXN0LiIiIgorICAgICAgICByZXF1ZXN0LmNsb3NlKCkKKworCitjbGFzcyBVRFBTZXJ2ZXIoVENQU2VydmVyKToKKworICAgICIiIlVEUCBzZXJ2ZXIgY2xhc3MuIiIiCisKKyAgICBhbGxvd19yZXVzZV9hZGRyZXNzID0gRmFsc2UKKworICAgIHNvY2tldF90eXBlID0gc29ja2V0LlNPQ0tfREdSQU0KKworICAgIG1heF9wYWNrZXRfc2l6ZSA9IDgxOTIKKworICAgIGRlZiBnZXRfcmVxdWVzdChzZWxmKToKKyAgICAgICAgZGF0YSwgY2xpZW50X2FkZHIgPSBzZWxmLnNvY2tldC5yZWN2ZnJvbShzZWxmLm1heF9wYWNrZXRfc2l6ZSkKKyAgICAgICAgcmV0dXJuIChkYXRhLCBzZWxmLnNvY2tldCksIGNsaWVudF9hZGRyCisKKyAgICBkZWYgc2VydmVyX2FjdGl2YXRlKHNlbGYpOgorICAgICAgICAjIE5vIG5lZWQgdG8gY2FsbCBsaXN0ZW4oKSBmb3IgVURQLgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc2h1dGRvd25fcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgIyBObyBuZWVkIHRvIHNodXRkb3duIGFueXRoaW5nLgorICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkKKworICAgIGRlZiBjbG9zZV9yZXF1ZXN0KHNlbGYsIHJlcXVlc3QpOgorICAgICAgICAjIE5vIG5lZWQgdG8gY2xvc2UgYW55dGhpbmcuCisgICAgICAgIHBhc3MKKworY2xhc3MgRm9ya2luZ01peEluOgorCisgICAgIiIiTWl4LWluIGNsYXNzIHRvIGhhbmRsZSBlYWNoIHJlcXVlc3QgaW4gYSBuZXcgcHJvY2Vzcy4iIiIKKworICAgIHRpbWVvdXQgPSAzMDAKKyAgICBhY3RpdmVfY2hpbGRyZW4gPSBOb25lCisgICAgbWF4X2NoaWxkcmVuID0gNDAKKworICAgIGRlZiBjb2xsZWN0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCByb3V0aW5lIHRvIHdhaXQgZm9yIGNoaWxkcmVuIHRoYXQgaGF2ZSBleGl0ZWQuIiIiCisgICAgICAgIGlmIHNlbGYuYWN0aXZlX2NoaWxkcmVuIGlzIE5vbmU6IHJldHVybgorICAgICAgICB3aGlsZSBsZW4oc2VsZi5hY3RpdmVfY2hpbGRyZW4pID49IHNlbGYubWF4X2NoaWxkcmVuOgorICAgICAgICAgICAgIyBYWFg6IFRoaXMgd2lsbCB3YWl0IGZvciBhbnkgY2hpbGQgcHJvY2Vzcywgbm90IGp1c3Qgb25lcworICAgICAgICAgICAgIyBzcGF3bmVkIGJ5IHRoaXMgbGlicmFyeS4gVGhpcyBjb3VsZCBjb25mdXNlIG90aGVyCisgICAgICAgICAgICAjIGxpYnJhcmllcyB0aGF0IGV4cGVjdCB0byBiZSBhYmxlIHRvIHdhaXQgZm9yIHRoZWlyIG93bgorICAgICAgICAgICAgIyBjaGlsZHJlbi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoMCwgMCkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwaWQgPSBOb25lCisgICAgICAgICAgICBpZiBwaWQgbm90IGluIHNlbGYuYWN0aXZlX2NoaWxkcmVuOiBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hY3RpdmVfY2hpbGRyZW4ucmVtb3ZlKHBpZCkKKworICAgICAgICAjIFhYWDogVGhpcyBsb29wIHJ1bnMgbW9yZSBzeXN0ZW0gY2FsbHMgdGhhbiBpdCBvdWdodAorICAgICAgICAjIHRvLiBUaGVyZSBzaG91bGQgYmUgYSB3YXkgdG8gcHV0IHRoZSBhY3RpdmVfY2hpbGRyZW4gaW50byBhCisgICAgICAgICMgcHJvY2VzcyBncm91cCBhbmQgdGhlbiB1c2Ugb3Mud2FpdHBpZCgtcGdpZCkgdG8gd2FpdCBmb3IgYW55CisgICAgICAgICMgb2YgdGhhdCBzZXQsIGJ1dCBJIGNvdWxkbid0IGZpbmQgYSB3YXkgdG8gYWxsb2NhdGUgcGdpZHMKKyAgICAgICAgIyB0aGF0IGNvdWxkbid0IGNvbGxpZGUuCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmFjdGl2ZV9jaGlsZHJlbjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY2hpbGQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGlkID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IHBpZDogY29udGludWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbi5yZW1vdmUocGlkKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMuIHg9JWQgYW5kIGxpc3Q9JXInICUgKGUubWVzc2FnZSwgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jaGlsZHJlbikpCisKKyAgICBkZWYgaGFuZGxlX3RpbWVvdXQoc2VsZik6CisgICAgICAgICIiIldhaXQgZm9yIHpvbWJpZXMgYWZ0ZXIgc2VsZi50aW1lb3V0IHNlY29uZHMgb2YgaW5hY3Rpdml0eS4KKworICAgICAgICBNYXkgYmUgZXh0ZW5kZWQsIGRvIG5vdCBvdmVycmlkZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0KHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgIiIiRm9yayBhIG5ldyBzdWJwcm9jZXNzIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuIiIiCisgICAgICAgIHNlbGYuY29sbGVjdF9jaGlsZHJlbigpCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICAjIFBhcmVudCBwcm9jZXNzCisgICAgICAgICAgICBpZiBzZWxmLmFjdGl2ZV9jaGlsZHJlbiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuID0gW10KKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX2NoaWxkcmVuLmFwcGVuZChwaWQpCisgICAgICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkgI2Nsb3NlIGhhbmRsZSBpbiBwYXJlbnQgcHJvY2VzcworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIENoaWxkIHByb2Nlc3MuCisgICAgICAgICAgICAjIFRoaXMgbXVzdCBuZXZlciByZXR1cm4sIGhlbmNlIG9zLl9leGl0KCkhCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVxdWVzdChyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcykKKyAgICAgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2h1dGRvd25fcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KDEpCisKKworY2xhc3MgVGhyZWFkaW5nTWl4SW46CisgICAgIiIiTWl4LWluIGNsYXNzIHRvIGhhbmRsZSBlYWNoIHJlcXVlc3QgaW4gYSBuZXcgdGhyZWFkLiIiIgorCisgICAgIyBEZWNpZGVzIGhvdyB0aHJlYWRzIHdpbGwgYWN0IHVwb24gdGVybWluYXRpb24gb2YgdGhlCisgICAgIyBtYWluIHByb2Nlc3MKKyAgICBkYWVtb25fdGhyZWFkcyA9IEZhbHNlCisKKyAgICBkZWYgcHJvY2Vzc19yZXF1ZXN0X3RocmVhZChzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICIiIlNhbWUgYXMgaW4gQmFzZVNlcnZlciBidXQgYXMgYSB0aHJlYWQuCisKKyAgICAgICAgSW4gYWRkaXRpb24sIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBkb25lIGhlcmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX3JlcXVlc3QocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZXJyb3IocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisgICAgICAgICAgICBzZWxmLnNodXRkb3duX3JlcXVlc3QocmVxdWVzdCkKKworICAgIGRlZiBwcm9jZXNzX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJTdGFydCBhIG5ldyB0aHJlYWQgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4iIiIKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0ID0gc2VsZi5wcm9jZXNzX3JlcXVlc3RfdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gKHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKSkKKyAgICAgICAgdC5kYWVtb24gPSBzZWxmLmRhZW1vbl90aHJlYWRzCisgICAgICAgIHQuc3RhcnQoKQorCisKK2NsYXNzIEZvcmtpbmdVRFBTZXJ2ZXIoRm9ya2luZ01peEluLCBVRFBTZXJ2ZXIpOiBwYXNzCitjbGFzcyBGb3JraW5nVENQU2VydmVyKEZvcmtpbmdNaXhJbiwgVENQU2VydmVyKTogcGFzcworCitjbGFzcyBUaHJlYWRpbmdVRFBTZXJ2ZXIoVGhyZWFkaW5nTWl4SW4sIFVEUFNlcnZlcik6IHBhc3MKK2NsYXNzIFRocmVhZGluZ1RDUFNlcnZlcihUaHJlYWRpbmdNaXhJbiwgVENQU2VydmVyKTogcGFzcworCitpZiBoYXNhdHRyKHNvY2tldCwgJ0FGX1VOSVgnKToKKworICAgIGNsYXNzIFVuaXhTdHJlYW1TZXJ2ZXIoVENQU2VydmVyKToKKyAgICAgICAgYWRkcmVzc19mYW1pbHkgPSBzb2NrZXQuQUZfVU5JWAorCisgICAgY2xhc3MgVW5peERhdGFncmFtU2VydmVyKFVEUFNlcnZlcik6CisgICAgICAgIGFkZHJlc3NfZmFtaWx5ID0gc29ja2V0LkFGX1VOSVgKKworICAgIGNsYXNzIFRocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIoVGhyZWFkaW5nTWl4SW4sIFVuaXhTdHJlYW1TZXJ2ZXIpOiBwYXNzCisKKyAgICBjbGFzcyBUaHJlYWRpbmdVbml4RGF0YWdyYW1TZXJ2ZXIoVGhyZWFkaW5nTWl4SW4sIFVuaXhEYXRhZ3JhbVNlcnZlcik6IHBhc3MKKworY2xhc3MgQmFzZVJlcXVlc3RIYW5kbGVyOgorCisgICAgIiIiQmFzZSBjbGFzcyBmb3IgcmVxdWVzdCBoYW5kbGVyIGNsYXNzZXMuCisKKyAgICBUaGlzIGNsYXNzIGlzIGluc3RhbnRpYXRlZCBmb3IgZWFjaCByZXF1ZXN0IHRvIGJlIGhhbmRsZWQuICBUaGUKKyAgICBjb25zdHJ1Y3RvciBzZXRzIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MKKyAgICBhbmQgc2VydmVyLCBhbmQgdGhlbiBjYWxscyB0aGUgaGFuZGxlKCkgbWV0aG9kLiAgVG8gaW1wbGVtZW50IGEKKyAgICBzcGVjaWZpYyBzZXJ2aWNlLCBhbGwgeW91IG5lZWQgdG8gZG8gaXMgdG8gZGVyaXZlIGEgY2xhc3Mgd2hpY2gKKyAgICBkZWZpbmVzIGEgaGFuZGxlKCkgbWV0aG9kLgorCisgICAgVGhlIGhhbmRsZSgpIG1ldGhvZCBjYW4gZmluZCB0aGUgcmVxdWVzdCBhcyBzZWxmLnJlcXVlc3QsIHRoZQorICAgIGNsaWVudCBhZGRyZXNzIGFzIHNlbGYuY2xpZW50X2FkZHJlc3MsIGFuZCB0aGUgc2VydmVyIChpbiBjYXNlIGl0CisgICAgbmVlZHMgYWNjZXNzIHRvIHBlci1zZXJ2ZXIgaW5mb3JtYXRpb24pIGFzIHNlbGYuc2VydmVyLiAgU2luY2UgYQorICAgIHNlcGFyYXRlIGluc3RhbmNlIGlzIGNyZWF0ZWQgZm9yIGVhY2ggcmVxdWVzdCwgdGhlIGhhbmRsZSgpIG1ldGhvZAorICAgIGNhbiBkZWZpbmUgYXJiaXRyYXJ5IG90aGVyIGluc3RhbmNlIHZhcmlhcmlhYmxlcy4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzLCBzZXJ2ZXIpOgorICAgICAgICBzZWxmLnJlcXVlc3QgPSByZXF1ZXN0CisgICAgICAgIHNlbGYuY2xpZW50X2FkZHJlc3MgPSBjbGllbnRfYWRkcmVzcworICAgICAgICBzZWxmLnNlcnZlciA9IHNlcnZlcgorICAgICAgICBzZWxmLnNldHVwKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5oYW5kbGUoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5maW5pc2goKQorCisgICAgZGVmIHNldHVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBwYXNzCisKKworIyBUaGUgZm9sbG93aW5nIHR3byBjbGFzc2VzIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoZSBzYW1lIHNlcnZpY2UKKyMgY2xhc3MgZm9yIHN0cmVhbSBvciBkYXRhZ3JhbSBzZXJ2ZXJzLgorIyBFYWNoIGNsYXNzIHNldHMgdXAgdGhlc2UgaW5zdGFuY2UgdmFyaWFibGVzOgorIyAtIHJmaWxlOiBhIGZpbGUgb2JqZWN0IGZyb20gd2hpY2ggcmVjZWl2ZXMgdGhlIHJlcXVlc3QgaXMgcmVhZAorIyAtIHdmaWxlOiBhIGZpbGUgb2JqZWN0IHRvIHdoaWNoIHRoZSByZXBseSBpcyB3cml0dGVuCisjIFdoZW4gdGhlIGhhbmRsZSgpIG1ldGhvZCByZXR1cm5zLCB3ZmlsZSBpcyBmbHVzaGVkIHByb3Blcmx5CisKKworY2xhc3MgU3RyZWFtUmVxdWVzdEhhbmRsZXIoQmFzZVJlcXVlc3RIYW5kbGVyKToKKworICAgICIiIkRlZmluZSBzZWxmLnJmaWxlIGFuZCBzZWxmLndmaWxlIGZvciBzdHJlYW0gc29ja2V0cy4iIiIKKworICAgICMgRGVmYXVsdCBidWZmZXIgc2l6ZXMgZm9yIHJmaWxlLCB3ZmlsZS4KKyAgICAjIFdlIGRlZmF1bHQgcmZpbGUgdG8gYnVmZmVyZWQgYmVjYXVzZSBvdGhlcndpc2UgaXQgY291bGQgYmUKKyAgICAjIHJlYWxseSBzbG93IGZvciBsYXJnZSBkYXRhIChhIGdldGMoKSBjYWxsIHBlciBieXRlKTsgd2UgbWFrZQorICAgICMgd2ZpbGUgdW5idWZmZXJlZCBiZWNhdXNlIChhKSBvZnRlbiBhZnRlciBhIHdyaXRlKCkgd2Ugd2FudCB0bworICAgICMgcmVhZCBhbmQgd2UgbmVlZCB0byBmbHVzaCB0aGUgbGluZTsgKGIpIGJpZyB3cml0ZXMgdG8gdW5idWZmZXJlZAorICAgICMgZmlsZXMgYXJlIHR5cGljYWxseSBvcHRpbWl6ZWQgYnkgc3RkaW8gZXZlbiB3aGVuIGJpZyByZWFkcworICAgICMgYXJlbid0LgorICAgIHJidWZzaXplID0gLTEKKyAgICB3YnVmc2l6ZSA9IDAKKworICAgICMgQSB0aW1lb3V0IHRvIGFwcGx5IHRvIHRoZSByZXF1ZXN0IHNvY2tldCwgaWYgbm90IE5vbmUuCisgICAgdGltZW91dCA9IE5vbmUKKworICAgICMgRGlzYWJsZSBuYWdsZSBhbGdvcml0aG0gZm9yIHRoaXMgc29ja2V0LCBpZiBUcnVlLgorICAgICMgVXNlIG9ubHkgd2hlbiB3YnVmc2l6ZSAhPSAwLCB0byBhdm9pZCBzbWFsbCBwYWNrZXRzLgorICAgIGRpc2FibGVfbmFnbGVfYWxnb3JpdGhtID0gRmFsc2UKKworICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gc2VsZi5yZXF1ZXN0CisgICAgICAgIGlmIHNlbGYudGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5zZXR0aW1lb3V0KHNlbGYudGltZW91dCkKKyAgICAgICAgaWYgc2VsZi5kaXNhYmxlX25hZ2xlX2FsZ29yaXRobToKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGlvbi5zZXRzb2Nrb3B0KHNvY2tldC5JUFBST1RPX1RDUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5UQ1BfTk9ERUxBWSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5yZmlsZSA9IHNlbGYuY29ubmVjdGlvbi5tYWtlZmlsZSgncmInLCBzZWxmLnJidWZzaXplKQorICAgICAgICBzZWxmLndmaWxlID0gc2VsZi5jb25uZWN0aW9uLm1ha2VmaWxlKCd3YicsIHNlbGYud2J1ZnNpemUpCisKKyAgICBkZWYgZmluaXNoKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi53ZmlsZS5jbG9zZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi53ZmlsZS5mbHVzaCgpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICMgQW4gZmluYWwgc29ja2V0IGVycm9yIG1heSBoYXZlIG9jY3VycmVkIGhlcmUsIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICAjIHRoZSBsb2NhbCBlcnJvciBFQ09OTkFCT1JURUQuCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLndmaWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5yZmlsZS5jbG9zZSgpCisKKworY2xhc3MgRGF0YWdyYW1SZXF1ZXN0SGFuZGxlcihCYXNlUmVxdWVzdEhhbmRsZXIpOgorCisgICAgIyBYWFggUmVncmV0dGFibHksIEkgY2Fubm90IGdldCB0aGlzIHdvcmtpbmcgb24gTGludXg7CisgICAgIyBzLnJlY3Zmcm9tKCkgZG9lc24ndCByZXR1cm4gYSBtZWFuaW5nZnVsIGNsaWVudCBhZGRyZXNzLgorCisgICAgIiIiRGVmaW5lIHNlbGYucmZpbGUgYW5kIHNlbGYud2ZpbGUgZm9yIGRhdGFncmFtIHNvY2tldHMuIiIiCisKKyAgICBkZWYgc2V0dXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBzZWxmLnBhY2tldCwgc2VsZi5zb2NrZXQgPSBzZWxmLnJlcXVlc3QKKyAgICAgICAgc2VsZi5yZmlsZSA9IFN0cmluZ0lPKHNlbGYucGFja2V0KQorICAgICAgICBzZWxmLndmaWxlID0gU3RyaW5nSU8oKQorCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgc2VsZi5zb2NrZXQuc2VuZHRvKHNlbGYud2ZpbGUuZ2V0dmFsdWUoKSwgc2VsZi5jbGllbnRfYWRkcmVzcykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvU29ja2V0U2VydmVyLnB5YyBiL2xpYi9weXRob24yLjcvU29ja2V0U2VydmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM0Nzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Tb2NrZXRTZXJ2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvU29ja2V0U2VydmVyLnB5byBiL2xpYi9weXRob24yLjcvU29ja2V0U2VydmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM0Nzk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Tb2NrZXRTZXJ2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvU3RyaW5nSU8ucHkgYi9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzUyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5CkBAIC0wLDAgKzEsMzI0IEBACityIiIiRmlsZS1saWtlIG9iamVjdHMgdGhhdCByZWFkIGZyb20gb3Igd3JpdGUgdG8gYSBzdHJpbmcgYnVmZmVyLgorCitUaGlzIGltcGxlbWVudHMgKG5lYXJseSkgYWxsIHN0ZGlvIG1ldGhvZHMuCisKK2YgPSBTdHJpbmdJTygpICAgICAgIyByZWFkeSBmb3Igd3JpdGluZworZiA9IFN0cmluZ0lPKGJ1ZikgICAjIHJlYWR5IGZvciByZWFkaW5nCitmLmNsb3NlKCkgICAgICAgICAgICMgZXhwbGljaXRseSByZWxlYXNlIHJlc291cmNlcyBoZWxkCitmbGFnID0gZi5pc2F0dHkoKSAgICMgYWx3YXlzIGZhbHNlCitwb3MgPSBmLnRlbGwoKSAgICAgICMgZ2V0IGN1cnJlbnQgcG9zaXRpb24KK2Yuc2Vlayhwb3MpICAgICAgICAgIyBzZXQgY3VycmVudCBwb3NpdGlvbgorZi5zZWVrKHBvcywgbW9kZSkgICAjIG1vZGUgMDogYWJzb2x1dGU7IDE6IHJlbGF0aXZlOyAyOiByZWxhdGl2ZSB0byBFT0YKK2J1ZiA9IGYucmVhZCgpICAgICAgIyByZWFkIHVudGlsIEVPRgorYnVmID0gZi5yZWFkKG4pICAgICAjIHJlYWQgdXAgdG8gbiBieXRlcworYnVmID0gZi5yZWFkbGluZSgpICAjIHJlYWQgdW50aWwgZW5kIG9mIGxpbmUgKCdcbicpIG9yIEVPRgorbGlzdCA9IGYucmVhZGxpbmVzKCkjIGxpc3Qgb2YgZi5yZWFkbGluZSgpIHJlc3VsdHMgdW50aWwgRU9GCitmLnRydW5jYXRlKFtzaXplXSkgICMgdHJ1bmNhdGUgZmlsZSBhdCB0byBhdCBtb3N0IHNpemUgKGRlZmF1bHQ6IGN1cnJlbnQgcG9zKQorZi53cml0ZShidWYpICAgICAgICAjIHdyaXRlIGF0IGN1cnJlbnQgcG9zaXRpb24KK2Yud3JpdGVsaW5lcyhsaXN0KSAgIyBmb3IgbGluZSBpbiBsaXN0OiBmLndyaXRlKGxpbmUpCitmLmdldHZhbHVlKCkgICAgICAgICMgcmV0dXJuIHdob2xlIGZpbGUncyBjb250ZW50cyBhcyBhIHN0cmluZworCitOb3RlczoKKy0gVXNpbmcgYSByZWFsIGZpbGUgaXMgb2Z0ZW4gZmFzdGVyIChidXQgbGVzcyBjb252ZW5pZW50KS4KKy0gVGhlcmUncyBhbHNvIGEgbXVjaCBmYXN0ZXIgaW1wbGVtZW50YXRpb24gaW4gQywgY2FsbGVkIGNTdHJpbmdJTywgYnV0CisgIGl0J3Mgbm90IHN1YmNsYXNzYWJsZS4KKy0gZmlsZW5vKCkgaXMgbGVmdCB1bmltcGxlbWVudGVkIHNvIHRoYXQgY29kZSB3aGljaCB1c2VzIGl0IHRyaWdnZXJzCisgIGFuIGV4Y2VwdGlvbiBlYXJseS4KKy0gU2Vla2luZyBmYXIgYmV5b25kIEVPRiBhbmQgdGhlbiB3cml0aW5nIHdpbGwgaW5zZXJ0IHJlYWwgbnVsbAorICBieXRlcyB0aGF0IG9jY3VweSBzcGFjZSBpbiB0aGUgYnVmZmVyLgorLSBUaGVyZSdzIGEgc2ltcGxlIHRlc3Qgc2V0IChzZWUgZW5kIG9mIHRoaXMgZmlsZSkuCisiIiIKK3RyeToKKyAgICBmcm9tIGVycm5vIGltcG9ydCBFSU5WQUwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBFSU5WQUwgPSAyMgorCitfX2FsbF9fID0gWyJTdHJpbmdJTyJdCisKK2RlZiBfY29tcGxhaW5faWZjbG9zZWQoY2xvc2VkKToKKyAgICBpZiBjbG9zZWQ6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorCitjbGFzcyBTdHJpbmdJTzoKKyAgICAiIiJjbGFzcyBTdHJpbmdJTyhbYnVmZmVyXSkKKworICAgIFdoZW4gYSBTdHJpbmdJTyBvYmplY3QgaXMgY3JlYXRlZCwgaXQgY2FuIGJlIGluaXRpYWxpemVkIHRvIGFuIGV4aXN0aW5nCisgICAgc3RyaW5nIGJ5IHBhc3NpbmcgdGhlIHN0cmluZyB0byB0aGUgY29uc3RydWN0b3IuIElmIG5vIHN0cmluZyBpcyBnaXZlbiwKKyAgICB0aGUgU3RyaW5nSU8gd2lsbCBzdGFydCBlbXB0eS4KKworICAgIFRoZSBTdHJpbmdJTyBvYmplY3QgY2FuIGFjY2VwdCBlaXRoZXIgVW5pY29kZSBvciA4LWJpdCBzdHJpbmdzLCBidXQKKyAgICBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0IHN0cmluZ3MgdGhhdAorICAgIGNhbm5vdCBiZSBpbnRlcnByZXRlZCBhcyA3LWJpdCBBU0NJSSAodGhhdCB1c2UgdGhlIDh0aCBiaXQpIHdpbGwgY2F1c2UKKyAgICBhIFVuaWNvZGVFcnJvciB0byBiZSByYWlzZWQgd2hlbiBnZXR2YWx1ZSgpIGlzIGNhbGxlZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVmID0gJycpOgorICAgICAgICAjIEZvcmNlIHNlbGYuYnVmIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGUKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGJ1ZiA9IHN0cihidWYpCisgICAgICAgIHNlbGYuYnVmID0gYnVmCisgICAgICAgIHNlbGYubGVuID0gbGVuKGJ1ZikKKyAgICAgICAgc2VsZi5idWZsaXN0ID0gW10KKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgIiIiQSBmaWxlIG9iamVjdCBpcyBpdHMgb3duIGl0ZXJhdG9yLCBmb3IgZXhhbXBsZSBpdGVyKGYpIHJldHVybnMgZgorICAgICAgICAodW5sZXNzIGYgaXMgY2xvc2VkKS4gV2hlbiBhIGZpbGUgaXMgdXNlZCBhcyBhbiBpdGVyYXRvciwgdHlwaWNhbGx5CisgICAgICAgIGluIGEgZm9yIGxvb3AgKGZvciBleGFtcGxlLCBmb3IgbGluZSBpbiBmOiBwcmludCBsaW5lKSwgdGhlIG5leHQoKQorICAgICAgICBtZXRob2QgaXMgY2FsbGVkIHJlcGVhdGVkbHkuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5leHQgaW5wdXQgbGluZSwKKyAgICAgICAgb3IgcmFpc2VzIFN0b3BJdGVyYXRpb24gd2hlbiBFT0YgaXMgaGl0LgorICAgICAgICAiIiIKKyAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKQorICAgICAgICByID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCByOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJGcmVlIHRoZSBtZW1vcnkgYnVmZmVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisgICAgICAgICAgICBkZWwgc2VsZi5idWYsIHNlbGYucG9zCisKKyAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIEZhbHNlIGJlY2F1c2UgU3RyaW5nSU8gb2JqZWN0cyBhcmUgbm90IGNvbm5lY3RlZCB0byBhCisgICAgICAgIHR0eS1saWtlIGRldmljZS4KKyAgICAgICAgIiIiCisgICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIG1vZGUgPSAwKToKKyAgICAgICAgIiIiU2V0IHRoZSBmaWxlJ3MgY3VycmVudCBwb3NpdGlvbi4KKworICAgICAgICBUaGUgbW9kZSBhcmd1bWVudCBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMCAoYWJzb2x1dGUgZmlsZQorICAgICAgICBwb3NpdGlvbmluZyk7IG90aGVyIHZhbHVlcyBhcmUgMSAoc2VlayByZWxhdGl2ZSB0byB0aGUgY3VycmVudAorICAgICAgICBwb3NpdGlvbikgYW5kIDIgKHNlZWsgcmVsYXRpdmUgdG8gdGhlIGZpbGUncyBlbmQpLgorCisgICAgICAgIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KKyAgICAgICAgIiIiCisgICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZCkKKyAgICAgICAgaWYgc2VsZi5idWZsaXN0OgorICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpCisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXQorICAgICAgICBpZiBtb2RlID09IDE6CisgICAgICAgICAgICBwb3MgKz0gc2VsZi5wb3MKKyAgICAgICAgZWxpZiBtb2RlID09IDI6CisgICAgICAgICAgICBwb3MgKz0gc2VsZi5sZW4KKyAgICAgICAgc2VsZi5wb3MgPSBtYXgoMCwgcG9zKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgZmlsZSdzIGN1cnJlbnQgcG9zaXRpb24uIiIiCisgICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZCkKKyAgICAgICAgcmV0dXJuIHNlbGYucG9zCisKKyAgICBkZWYgcmVhZChzZWxmLCBuID0gLTEpOgorICAgICAgICAiIiJSZWFkIGF0IG1vc3Qgc2l6ZSBieXRlcyBmcm9tIHRoZSBmaWxlCisgICAgICAgIChsZXNzIGlmIHRoZSByZWFkIGhpdHMgRU9GIGJlZm9yZSBvYnRhaW5pbmcgc2l6ZSBieXRlcykuCisKKyAgICAgICAgSWYgdGhlIHNpemUgYXJndW1lbnQgaXMgbmVnYXRpdmUgb3Igb21pdHRlZCwgcmVhZCBhbGwgZGF0YSB1bnRpbCBFT0YKKyAgICAgICAgaXMgcmVhY2hlZC4gVGhlIGJ5dGVzIGFyZSByZXR1cm5lZCBhcyBhIHN0cmluZyBvYmplY3QuIEFuIGVtcHR5CisgICAgICAgIHN0cmluZyBpcyByZXR1cm5lZCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBpbW1lZGlhdGVseS4KKyAgICAgICAgIiIiCisgICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZCkKKyAgICAgICAgaWYgc2VsZi5idWZsaXN0OgorICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpCisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXQorICAgICAgICBpZiBuIGlzIE5vbmUgb3IgbiA8IDA6CisgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLmxlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3cG9zID0gbWluKHNlbGYucG9zK24sIHNlbGYubGVuKQorICAgICAgICByID0gc2VsZi5idWZbc2VsZi5wb3M6bmV3cG9zXQorICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcworICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKToKKyAgICAgICAgciIiIlJlYWQgb25lIGVudGlyZSBsaW5lIGZyb20gdGhlIGZpbGUuCisKKyAgICAgICAgQSB0cmFpbGluZyBuZXdsaW5lIGNoYXJhY3RlciBpcyBrZXB0IGluIHRoZSBzdHJpbmcgKGJ1dCBtYXkgYmUgYWJzZW50CisgICAgICAgIHdoZW4gYSBmaWxlIGVuZHMgd2l0aCBhbiBpbmNvbXBsZXRlIGxpbmUpLiBJZiB0aGUgc2l6ZSBhcmd1bWVudCBpcworICAgICAgICBwcmVzZW50IGFuZCBub24tbmVnYXRpdmUsIGl0IGlzIGEgbWF4aW11bSBieXRlIGNvdW50IChpbmNsdWRpbmcgdGhlCisgICAgICAgIHRyYWlsaW5nIG5ld2xpbmUpIGFuZCBhbiBpbmNvbXBsZXRlIGxpbmUgbWF5IGJlIHJldHVybmVkLgorCisgICAgICAgIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBvbmx5IHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGltbWVkaWF0ZWx5LgorCisgICAgICAgIE5vdGU6IFVubGlrZSBzdGRpbydzIGZnZXRzKCksIHRoZSByZXR1cm5lZCBzdHJpbmcgY29udGFpbnMgbnVsbAorICAgICAgICBjaGFyYWN0ZXJzICgnXDAnKSBpZiB0aGV5IG9jY3VycmVkIGluIHRoZSBpbnB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIF9jb21wbGFpbl9pZmNsb3NlZChzZWxmLmNsb3NlZCkKKyAgICAgICAgaWYgc2VsZi5idWZsaXN0OgorICAgICAgICAgICAgc2VsZi5idWYgKz0gJycuam9pbihzZWxmLmJ1Zmxpc3QpCisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QgPSBbXQorICAgICAgICBpID0gc2VsZi5idWYuZmluZCgnXG4nLCBzZWxmLnBvcykKKyAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLmxlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3cG9zID0gaSsxCisgICAgICAgIGlmIGxlbmd0aCBpcyBub3QgTm9uZSBhbmQgbGVuZ3RoID49IDA6CisgICAgICAgICAgICBpZiBzZWxmLnBvcyArIGxlbmd0aCA8IG5ld3BvczoKKyAgICAgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbmd0aAorICAgICAgICByID0gc2VsZi5idWZbc2VsZi5wb3M6bmV3cG9zXQorICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcworICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludCA9IDApOgorICAgICAgICAiIiJSZWFkIHVudGlsIEVPRiB1c2luZyByZWFkbGluZSgpIGFuZCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlCisgICAgICAgIGxpbmVzIHRodXMgcmVhZC4KKworICAgICAgICBJZiB0aGUgb3B0aW9uYWwgc2l6ZWhpbnQgYXJndW1lbnQgaXMgcHJlc2VudCwgaW5zdGVhZCBvZiByZWFkaW5nIHVwCisgICAgICAgIHRvIEVPRiwgd2hvbGUgbGluZXMgdG90YWxsaW5nIGFwcHJveGltYXRlbHkgc2l6ZWhpbnQgYnl0ZXMgKG9yIG1vcmUKKyAgICAgICAgdG8gYWNjb21tb2RhdGUgYSBmaW5hbCB3aG9sZSBsaW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHRvdGFsID0gMAorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgd2hpbGUgbGluZToKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgdG90YWwgKz0gbGVuKGxpbmUpCisgICAgICAgICAgICBpZiAwIDwgc2l6ZWhpbnQgPD0gdG90YWw6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiVHJ1bmNhdGUgdGhlIGZpbGUncyBzaXplLgorCisgICAgICAgIElmIHRoZSBvcHRpb25hbCBzaXplIGFyZ3VtZW50IGlzIHByZXNlbnQsIHRoZSBmaWxlIGlzIHRydW5jYXRlZCB0bworICAgICAgICAoYXQgbW9zdCkgdGhhdCBzaXplLiBUaGUgc2l6ZSBkZWZhdWx0cyB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICAgVGhlIGN1cnJlbnQgZmlsZSBwb3NpdGlvbiBpcyBub3QgY2hhbmdlZCB1bmxlc3MgdGhlIHBvc2l0aW9uCisgICAgICAgIGlzIGJleW9uZCB0aGUgbmV3IGZpbGUgc2l6ZS4KKworICAgICAgICBJZiB0aGUgc3BlY2lmaWVkIHNpemUgZXhjZWVkcyB0aGUgZmlsZSdzIGN1cnJlbnQgc2l6ZSwgdGhlCisgICAgICAgIGZpbGUgcmVtYWlucyB1bmNoYW5nZWQuCisgICAgICAgICIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLnBvcworICAgICAgICBlbGlmIHNpemUgPCAwOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcihFSU5WQUwsICJOZWdhdGl2ZSBzaXplIG5vdCBhbGxvd2VkIikKKyAgICAgICAgZWxpZiBzaXplIDwgc2VsZi5wb3M6CisgICAgICAgICAgICBzZWxmLnBvcyA9IHNpemUKKyAgICAgICAgc2VsZi5idWYgPSBzZWxmLmdldHZhbHVlKClbOnNpemVdCisgICAgICAgIHNlbGYubGVuID0gc2l6ZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICAiIiJXcml0ZSBhIHN0cmluZyB0byB0aGUgZmlsZS4KKworICAgICAgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCisgICAgICAgICIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisgICAgICAgIGlmIG5vdCBzOiByZXR1cm4KKyAgICAgICAgIyBGb3JjZSBzIHRvIGJlIGEgc3RyaW5nIG9yIHVuaWNvZGUKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBzID0gc3RyKHMpCisgICAgICAgIHNwb3MgPSBzZWxmLnBvcworICAgICAgICBzbGVuID0gc2VsZi5sZW4KKyAgICAgICAgaWYgc3BvcyA9PSBzbGVuOgorICAgICAgICAgICAgc2VsZi5idWZsaXN0LmFwcGVuZChzKQorICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcyA9IHNwb3MgKyBsZW4ocykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzcG9zID4gc2xlbjoKKyAgICAgICAgICAgIHNlbGYuYnVmbGlzdC5hcHBlbmQoJ1wwJyooc3BvcyAtIHNsZW4pKQorICAgICAgICAgICAgc2xlbiA9IHNwb3MKKyAgICAgICAgbmV3cG9zID0gc3BvcyArIGxlbihzKQorICAgICAgICBpZiBzcG9zIDwgc2xlbjoKKyAgICAgICAgICAgIGlmIHNlbGYuYnVmbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdCkKKyAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtzZWxmLmJ1Zls6c3Bvc10sIHMsIHNlbGYuYnVmW25ld3BvczpdXQorICAgICAgICAgICAgc2VsZi5idWYgPSAnJworICAgICAgICAgICAgaWYgbmV3cG9zID4gc2xlbjoKKyAgICAgICAgICAgICAgICBzbGVuID0gbmV3cG9zCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKHMpCisgICAgICAgICAgICBzbGVuID0gbmV3cG9zCisgICAgICAgIHNlbGYubGVuID0gc2xlbgorICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcworCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgaXRlcmFibGUpOgorICAgICAgICAiIiJXcml0ZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3MgdG8gdGhlIGZpbGUuIFRoZSBzZXF1ZW5jZSBjYW4gYmUgYW55CisgICAgICAgIGl0ZXJhYmxlIG9iamVjdCBwcm9kdWNpbmcgc3RyaW5ncywgdHlwaWNhbGx5IGEgbGlzdCBvZiBzdHJpbmdzLiBUaGVyZQorICAgICAgICBpcyBubyByZXR1cm4gdmFsdWUuCisKKyAgICAgICAgKFRoZSBuYW1lIGlzIGludGVuZGVkIHRvIG1hdGNoIHJlYWRsaW5lcygpOyB3cml0ZWxpbmVzKCkgZG9lcyBub3QgYWRkCisgICAgICAgIGxpbmUgc2VwYXJhdG9ycy4pCisgICAgICAgICIiIgorICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKKyAgICAgICAgZm9yIGxpbmUgaW4gaXRlcmFibGU6CisgICAgICAgICAgICB3cml0ZShsaW5lKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCB0aGUgaW50ZXJuYWwgYnVmZmVyCisgICAgICAgICIiIgorICAgICAgICBfY29tcGxhaW5faWZjbG9zZWQoc2VsZi5jbG9zZWQpCisKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXRyaWV2ZSB0aGUgZW50aXJlIGNvbnRlbnRzIG9mIHRoZSAiZmlsZSIgYXQgYW55IHRpbWUgYmVmb3JlCisgICAgICAgIHRoZSBTdHJpbmdJTyBvYmplY3QncyBjbG9zZSgpIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgICAgICAgVGhlIFN0cmluZ0lPIG9iamVjdCBjYW4gYWNjZXB0IGVpdGhlciBVbmljb2RlIG9yIDgtYml0IHN0cmluZ3MsCisgICAgICAgIGJ1dCBtaXhpbmcgdGhlIHR3byBtYXkgdGFrZSBzb21lIGNhcmUuIElmIGJvdGggYXJlIHVzZWQsIDgtYml0CisgICAgICAgIHN0cmluZ3MgdGhhdCBjYW5ub3QgYmUgaW50ZXJwcmV0ZWQgYXMgNy1iaXQgQVNDSUkgKHRoYXQgdXNlIHRoZQorICAgICAgICA4dGggYml0KSB3aWxsIGNhdXNlIGEgVW5pY29kZUVycm9yIHRvIGJlIHJhaXNlZCB3aGVuIGdldHZhbHVlKCkKKyAgICAgICAgaXMgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgX2NvbXBsYWluX2lmY2xvc2VkKHNlbGYuY2xvc2VkKQorICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6CisgICAgICAgICAgICBzZWxmLmJ1ZiArPSAnJy5qb2luKHNlbGYuYnVmbGlzdCkKKyAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdCisgICAgICAgIHJldHVybiBzZWxmLmJ1ZgorCisKKyMgQSBsaXR0bGUgdGVzdCBzdWl0ZQorCitkZWYgdGVzdCgpOgorICAgIGltcG9ydCBzeXMKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIGZpbGUgPSBzeXMuYXJndlsxXQorICAgIGVsc2U6CisgICAgICAgIGZpbGUgPSAnL2V0Yy9wYXNzd2QnCisgICAgbGluZXMgPSBvcGVuKGZpbGUsICdyJykucmVhZGxpbmVzKCkKKyAgICB0ZXh0ID0gb3BlbihmaWxlLCAncicpLnJlYWQoKQorICAgIGYgPSBTdHJpbmdJTygpCisgICAgZm9yIGxpbmUgaW4gbGluZXNbOi0yXToKKyAgICAgICAgZi53cml0ZShsaW5lKQorICAgIGYud3JpdGVsaW5lcyhsaW5lc1stMjpdKQorICAgIGlmIGYuZ2V0dmFsdWUoKSAhPSB0ZXh0OgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICd3cml0ZSBmYWlsZWQnCisgICAgbGVuZ3RoID0gZi50ZWxsKCkKKyAgICBwcmludCAnRmlsZSBsZW5ndGggPScsIGxlbmd0aAorICAgIGYuc2VlayhsZW4obGluZXNbMF0pKQorICAgIGYud3JpdGUobGluZXNbMV0pCisgICAgZi5zZWVrKDApCisgICAgcHJpbnQgJ0ZpcnN0IGxpbmUgPScsIHJlcHIoZi5yZWFkbGluZSgpKQorICAgIHByaW50ICdQb3NpdGlvbiA9JywgZi50ZWxsKCkKKyAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgcHJpbnQgJ1NlY29uZCBsaW5lID0nLCByZXByKGxpbmUpCisgICAgZi5zZWVrKC1sZW4obGluZSksIDEpCisgICAgbGluZTIgPSBmLnJlYWQobGVuKGxpbmUpKQorICAgIGlmIGxpbmUgIT0gbGluZTI6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2JhZCByZXN1bHQgYWZ0ZXIgc2VlayBiYWNrJworICAgIGYuc2VlayhsZW4obGluZTIpLCAxKQorICAgIGxpc3QgPSBmLnJlYWRsaW5lcygpCisgICAgbGluZSA9IGxpc3RbLTFdCisgICAgZi5zZWVrKGYudGVsbCgpIC0gbGVuKGxpbmUpKQorICAgIGxpbmUyID0gZi5yZWFkKCkKKyAgICBpZiBsaW5lICE9IGxpbmUyOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdiYWQgcmVzdWx0IGFmdGVyIHNlZWsgYmFjayBmcm9tIEVPRicKKyAgICBwcmludCAnUmVhZCcsIGxlbihsaXN0KSwgJ21vcmUgbGluZXMnCisgICAgcHJpbnQgJ0ZpbGUgbGVuZ3RoID0nLCBmLnRlbGwoKQorICAgIGlmIGYudGVsbCgpICE9IGxlbmd0aDoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnYmFkIGxlbmd0aCcKKyAgICBmLnRydW5jYXRlKGxlbmd0aC8yKQorICAgIGYuc2VlaygwLCAyKQorICAgIHByaW50ICdUcnVuY2F0ZWQgbGVuZ3RoID0nLCBmLnRlbGwoKQorICAgIGlmIGYudGVsbCgpICE9IGxlbmd0aC8yOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICd0cnVuY2F0ZSBkaWQgbm90IGFkanVzdCBsZW5ndGgnCisgICAgZi5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5YyBiL2xpYi9weXRob24yLjcvU3RyaW5nSU8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjdmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5byBiL2xpYi9weXRob24yLjcvU3RyaW5nSU8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjdmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1N0cmluZ0lPLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L1VzZXJEaWN0LnB5IGIvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjIyMThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weQpAQCAtMCwwICsxLDE4MCBAQAorIiIiQSBtb3JlIG9yIGxlc3MgY29tcGxldGUgdXNlci1kZWZpbmVkIHdyYXBwZXIgYXJvdW5kIGRpY3Rpb25hcnkgb2JqZWN0cy4iIiIKKworY2xhc3MgVXNlckRpY3Q6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmRhdGEgPSB7fQorICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoZGljdCkKKyAgICAgICAgaWYgbGVuKGt3YXJncyk6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2FyZ3MpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOiByZXR1cm4gcmVwcihzZWxmLmRhdGEpCisgICAgZGVmIF9fY21wX18oc2VsZiwgZGljdCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGljdCwgVXNlckRpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmRhdGEsIGRpY3QuZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBkaWN0KQorICAgIF9faGFzaF9fID0gTm9uZSAjIEF2b2lkIFB5M2sgd2FybmluZworICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuZGF0YSkKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5IGluIHNlbGYuZGF0YToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRhdGFba2V5XQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX19jbGFzc19fLCAiX19taXNzaW5nX18iKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX21pc3NpbmdfXyhzZWxmLCBrZXkpCisgICAgICAgIHJhaXNlIEtleUVycm9yKGtleSkKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBpdGVtKTogc2VsZi5kYXRhW2tleV0gPSBpdGVtCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6IGRlbCBzZWxmLmRhdGFba2V5XQorICAgIGRlZiBjbGVhcihzZWxmKTogc2VsZi5kYXRhLmNsZWFyKCkKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgVXNlckRpY3Q6CisgICAgICAgICAgICByZXR1cm4gVXNlckRpY3Qoc2VsZi5kYXRhLmNvcHkoKSkKKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSB7fQorICAgICAgICAgICAgYyA9IGNvcHkuY29weShzZWxmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorICAgICAgICBjLnVwZGF0ZShzZWxmKQorICAgICAgICByZXR1cm4gYworICAgIGRlZiBrZXlzKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmtleXMoKQorICAgIGRlZiBpdGVtcyhzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pdGVtcygpCisgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pdGVyaXRlbXMoKQorICAgIGRlZiBpdGVya2V5cyhzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpCisgICAgZGVmIHZhbHVlcyhzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS52YWx1ZXMoKQorICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6IHJldHVybiBrZXkgaW4gc2VsZi5kYXRhCisgICAgZGVmIHVwZGF0ZShzZWxmLCBkaWN0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgaWYgZGljdCBpcyBOb25lOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIGlzaW5zdGFuY2UoZGljdCwgVXNlckRpY3QpOgorICAgICAgICAgICAgc2VsZi5kYXRhLnVwZGF0ZShkaWN0LmRhdGEpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShkaWN0LCB0eXBlKHt9KSkgb3Igbm90IGhhc2F0dHIoZGljdCwgJ2l0ZW1zJyk6CisgICAgICAgICAgICBzZWxmLmRhdGEudXBkYXRlKGRpY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgaywgdiBpbiBkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2VsZltrXSA9IHYKKyAgICAgICAgaWYgbGVuKGt3YXJncyk6CisgICAgICAgICAgICBzZWxmLmRhdGEudXBkYXRlKGt3YXJncykKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKKyAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZltrZXldID0gZmFpbG9iagorICAgICAgICByZXR1cm4gc2VsZltrZXldCisgICAgZGVmIHBvcChzZWxmLCBrZXksICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5wb3Aoa2V5LCAqYXJncykKKyAgICBkZWYgcG9waXRlbShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5wb3BpdGVtKCkKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5kYXRhCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgorICAgICAgICBkID0gY2xzKCkKKyAgICAgICAgZm9yIGtleSBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCisgICAgICAgIHJldHVybiBkCisKK2NsYXNzIEl0ZXJhYmxlVXNlckRpY3QoVXNlckRpY3QpOgorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5kYXRhKQorCitpbXBvcnQgX2FiY29sbAorX2FiY29sbC5NdXRhYmxlTWFwcGluZy5yZWdpc3RlcihJdGVyYWJsZVVzZXJEaWN0KQorCisKK2NsYXNzIERpY3RNaXhpbjoKKyAgICAjIE1peGluIGRlZmluaW5nIGFsbCBkaWN0aW9uYXJ5IG1ldGhvZHMgZm9yIGNsYXNzZXMgdGhhdCBhbHJlYWR5IGhhdmUKKyAgICAjIGEgbWluaW11bSBkaWN0aW9uYXJ5IGludGVyZmFjZSBpbmNsdWRpbmcgZ2V0aXRlbSwgc2V0aXRlbSwgZGVsaXRlbSwKKyAgICAjIGFuZCBrZXlzLiBXaXRob3V0IGtub3dsZWRnZSBvZiB0aGUgc3ViY2xhc3MgY29uc3RydWN0b3IsIHRoZSBtaXhpbgorICAgICMgZG9lcyBub3QgZGVmaW5lIF9faW5pdF9fKCkgb3IgY29weSgpLiAgSW4gYWRkaXRpb24gdG8gdGhlIGZvdXIgYmFzZQorICAgICMgbWV0aG9kcywgcHJvZ3Jlc3NpdmVseSBtb3JlIGVmZmljaWVuY3kgY29tZXMgd2l0aCBkZWZpbmluZworICAgICMgX19jb250YWluc19fKCksIF9faXRlcl9fKCksIGFuZCBpdGVyaXRlbXMoKS4KKworICAgICMgc2Vjb25kIGxldmVsIGRlZmluaXRpb25zIHN1cHBvcnQgaGlnaGVyIGxldmVscworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZm9yIGsgaW4gc2VsZi5rZXlzKCk6CisgICAgICAgICAgICB5aWVsZCBrCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZltrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFzX2tleShrZXkpCisKKyAgICAjIHRoaXJkIGxldmVsIHRha2VzIGFkdmFudGFnZSBvZiBzZWNvbmQgbGV2ZWwgZGVmaW5pdGlvbnMKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgorICAgICAgICBmb3IgayBpbiBzZWxmOgorICAgICAgICAgICAgeWllbGQgKGssIHNlbGZba10pCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2l0ZXJfXygpCisKKyAgICAjIGZvdXJ0aCBsZXZlbCB1c2VzIGRlZmluaXRpb25zIGZyb20gbG93ZXIgbGV2ZWxzCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIGZvciBfLCB2IGluIHNlbGYuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICB5aWVsZCB2CisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFt2IGZvciBfLCB2IGluIHNlbGYuaXRlcml0ZW1zKCldCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQorICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXMoKToKKyAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KKyAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdAorICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIGRlZiBwb3Aoc2VsZiwga2V5LCAqYXJncyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJwb3AgZXhwZWN0ZWQgYXQgbW9zdCAyIGFyZ3VtZW50cywgZ290ICJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlcHIoMSArIGxlbihhcmdzKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJnc1swXQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZGVsIHNlbGZba2V5XQorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICBkZWYgcG9waXRlbShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaywgdiA9IHNlbGYuaXRlcml0ZW1zKCkubmV4dCgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsICdjb250YWluZXIgaXMgZW1wdHknCisgICAgICAgIGRlbCBzZWxmW2tdCisgICAgICAgIHJldHVybiAoaywgdikKKyAgICBkZWYgdXBkYXRlKHNlbGYsIG90aGVyPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgIyBNYWtlIHByb2dyZXNzaXZlbHkgd2Vha2VyIGFzc3VtcHRpb25zIGFib3V0ICJvdGhlciIKKyAgICAgICAgaWYgb3RoZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBoYXNhdHRyKG90aGVyLCAnaXRlcml0ZW1zJyk6ICAjIGl0ZXJpdGVtcyBzYXZlcyBtZW1vcnkgYW5kIGxvb2t1cHMKKyAgICAgICAgICAgIGZvciBrLCB2IGluIG90aGVyLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHNlbGZba10gPSB2CisgICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgJ2tleXMnKToKKyAgICAgICAgICAgIGZvciBrIGluIG90aGVyLmtleXMoKToKKyAgICAgICAgICAgICAgICBzZWxmW2tdID0gb3RoZXJba10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrLCB2IGluIG90aGVyOgorICAgICAgICAgICAgICAgIHNlbGZba10gPSB2CisgICAgICAgIGlmIGt3YXJnczoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGt3YXJncykKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlcHIoZGljdChzZWxmLml0ZXJpdGVtcygpKSkKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG90aGVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBEaWN0TWl4aW4pOgorICAgICAgICAgICAgb3RoZXIgPSBkaWN0KG90aGVyLml0ZXJpdGVtcygpKQorICAgICAgICByZXR1cm4gY21wKGRpY3Qoc2VsZi5pdGVyaXRlbXMoKSksIG90aGVyKQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYua2V5cygpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weWMgYi9saWIvcHl0aG9uMi43L1VzZXJEaWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjAwNWFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weW8gYi9saWIvcHl0aG9uMi43L1VzZXJEaWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjAwNWFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyRGljdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Vc2VyTGlzdC5weSBiL2xpYi9weXRob24yLjcvVXNlckxpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0NTk4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvVXNlckxpc3QucHkKQEAgLTAsMCArMSw4OCBAQAorIiIiQSBtb3JlIG9yIGxlc3MgY29tcGxldGUgdXNlci1kZWZpbmVkIHdyYXBwZXIgYXJvdW5kIGxpc3Qgb2JqZWN0cy4iIiIKKworaW1wb3J0IGNvbGxlY3Rpb25zCisKK2NsYXNzIFVzZXJMaXN0KGNvbGxlY3Rpb25zLk11dGFibGVTZXF1ZW5jZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluaXRsaXN0PU5vbmUpOgorICAgICAgICBzZWxmLmRhdGEgPSBbXQorICAgICAgICBpZiBpbml0bGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgWFhYIHNob3VsZCB0aGlzIGFjY2VwdCBhbiBhcmJpdHJhcnkgc2VxdWVuY2U/CisgICAgICAgICAgICBpZiB0eXBlKGluaXRsaXN0KSA9PSB0eXBlKHNlbGYuZGF0YSk6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhWzpdID0gaW5pdGxpc3QKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbml0bGlzdCwgVXNlckxpc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YVs6XSA9IGluaXRsaXN0LmRhdGFbOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gbGlzdChpbml0bGlzdCkKKyAgICBkZWYgX19yZXByX18oc2VsZik6IHJldHVybiByZXByKHNlbGYuZGF0YSkKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuZGF0YSA8ICBzZWxmLl9fY2FzdChvdGhlcikKKyAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuZGF0YSA8PSBzZWxmLl9fY2FzdChvdGhlcikKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuZGF0YSA9PSBzZWxmLl9fY2FzdChvdGhlcikKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuZGF0YSAhPSBzZWxmLl9fY2FzdChvdGhlcikKKyAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuZGF0YSA+ICBzZWxmLl9fY2FzdChvdGhlcikKKyAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuZGF0YSA+PSBzZWxmLl9fY2FzdChvdGhlcikKKyAgICBkZWYgX19jYXN0KHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlckxpc3QpOiByZXR1cm4gb3RoZXIuZGF0YQorICAgICAgICBlbHNlOiByZXR1cm4gb3RoZXIKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBzZWxmLl9fY2FzdChvdGhlcikpCisgICAgX19oYXNoX18gPSBOb25lICMgTXV0YWJsZSBzZXF1ZW5jZSwgc28gbm90IGhhc2hhYmxlCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKTogcmV0dXJuIGl0ZW0gaW4gc2VsZi5kYXRhCisgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5kYXRhKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIHNlbGYuZGF0YVtpXQorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpLCBpdGVtKTogc2VsZi5kYXRhW2ldID0gaXRlbQorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpKTogZGVsIHNlbGYuZGF0YVtpXQorICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgIGkgPSBtYXgoaSwgMCk7IGogPSBtYXgoaiwgMCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YVtpOmpdKQorICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgb3RoZXIpOgorICAgICAgICBpID0gbWF4KGksIDApOyBqID0gbWF4KGosIDApCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJMaXN0KToKKyAgICAgICAgICAgIHNlbGYuZGF0YVtpOmpdID0gb3RoZXIuZGF0YQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR5cGUoc2VsZi5kYXRhKSk6CisgICAgICAgICAgICBzZWxmLmRhdGFbaTpqXSA9IG90aGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGFbaTpqXSA9IGxpc3Qob3RoZXIpCisgICAgZGVmIF9fZGVsc2xpY2VfXyhzZWxmLCBpLCBqKToKKyAgICAgICAgaSA9IG1heChpLCAwKTsgaiA9IG1heChqLCAwKQorICAgICAgICBkZWwgc2VsZi5kYXRhW2k6al0KKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJMaXN0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEgKyBvdGhlci5kYXRhKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR5cGUoc2VsZi5kYXRhKSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgbGlzdChvdGhlcikpCisgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlckxpc3QpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKG90aGVyLmRhdGEgKyBzZWxmLmRhdGEpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgdHlwZShzZWxmLmRhdGEpKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhvdGhlciArIHNlbGYuZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhsaXN0KG90aGVyKSArIHNlbGYuZGF0YSkKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyTGlzdCk6CisgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIuZGF0YQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIHR5cGUoc2VsZi5kYXRhKSk6CisgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSArPSBsaXN0KG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX211bF9fKHNlbGYsIG4pOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhKm4pCisgICAgX19ybXVsX18gPSBfX211bF9fCisgICAgZGVmIF9faW11bF9fKHNlbGYsIG4pOgorICAgICAgICBzZWxmLmRhdGEgKj0gbgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6IHNlbGYuZGF0YS5hcHBlbmQoaXRlbSkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGksIGl0ZW0pOiBzZWxmLmRhdGEuaW5zZXJ0KGksIGl0ZW0pCisgICAgZGVmIHBvcChzZWxmLCBpPS0xKTogcmV0dXJuIHNlbGYuZGF0YS5wb3AoaSkKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGl0ZW0pOiBzZWxmLmRhdGEucmVtb3ZlKGl0ZW0pCisgICAgZGVmIGNvdW50KHNlbGYsIGl0ZW0pOiByZXR1cm4gc2VsZi5kYXRhLmNvdW50KGl0ZW0pCisgICAgZGVmIGluZGV4KHNlbGYsIGl0ZW0sICphcmdzKTogcmV0dXJuIHNlbGYuZGF0YS5pbmRleChpdGVtLCAqYXJncykKKyAgICBkZWYgcmV2ZXJzZShzZWxmKTogc2VsZi5kYXRhLnJldmVyc2UoKQorICAgIGRlZiBzb3J0KHNlbGYsICphcmdzLCAqKmt3ZHMpOiBzZWxmLmRhdGEuc29ydCgqYXJncywgKiprd2RzKQorICAgIGRlZiBleHRlbmQoc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVc2VyTGlzdCk6CisgICAgICAgICAgICBzZWxmLmRhdGEuZXh0ZW5kKG90aGVyLmRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEuZXh0ZW5kKG90aGVyKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Vc2VyTGlzdC5weWMgYi9saWIvcHl0aG9uMi43L1VzZXJMaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTNhNDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyTGlzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Vc2VyTGlzdC5weW8gYi9saWIvcHl0aG9uMi43L1VzZXJMaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTNhNDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9Vc2VyTGlzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9Vc2VyU3RyaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9Vc2VyU3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyNmIzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1VzZXJTdHJpbmcucHkKQEAgLTAsMCArMSwyMjggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyMgdmltOnRzPTQ6ZXQ6bm93cmFwCisiIiJBIHVzZXItZGVmaW5lZCB3cmFwcGVyIGFyb3VuZCBzdHJpbmcgb2JqZWN0cworCitOb3RlOiBzdHJpbmcgb2JqZWN0cyBoYXZlIGdyb3duIG1ldGhvZHMgaW4gUHl0aG9uIDEuNgorVGhpcyBtb2R1bGUgcmVxdWlyZXMgUHl0aG9uIDEuNiBvciBsYXRlci4KKyIiIgoraW1wb3J0IHN5cworaW1wb3J0IGNvbGxlY3Rpb25zCisKK19fYWxsX18gPSBbIlVzZXJTdHJpbmciLCJNdXRhYmxlU3RyaW5nIl0KKworY2xhc3MgVXNlclN0cmluZyhjb2xsZWN0aW9ucy5TZXF1ZW5jZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VxLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlcQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VxLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlcS5kYXRhWzpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSBzdHIoc2VxKQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOiByZXR1cm4gc3RyKHNlbGYuZGF0YSkKKyAgICBkZWYgX19yZXByX18oc2VsZik6IHJldHVybiByZXByKHNlbGYuZGF0YSkKKyAgICBkZWYgX19pbnRfXyhzZWxmKTogcmV0dXJuIGludChzZWxmLmRhdGEpCisgICAgZGVmIF9fbG9uZ19fKHNlbGYpOiByZXR1cm4gbG9uZyhzZWxmLmRhdGEpCisgICAgZGVmIF9fZmxvYXRfXyhzZWxmKTogcmV0dXJuIGZsb2F0KHNlbGYuZGF0YSkKKyAgICBkZWYgX19jb21wbGV4X18oc2VsZik6IHJldHVybiBjb21wbGV4KHNlbGYuZGF0YSkKKyAgICBkZWYgX19oYXNoX18oc2VsZik6IHJldHVybiBoYXNoKHNlbGYuZGF0YSkKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIHN0cmluZyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RyaW5nLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBzdHJpbmcuZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBzdHJpbmcpCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBjaGFyKToKKyAgICAgICAgcmV0dXJuIGNoYXIgaW4gc2VsZi5kYXRhCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLmRhdGEpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YVtpbmRleF0pCisgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBzdGFydCwgZW5kKToKKyAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhW3N0YXJ0OmVuZF0pCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJTdHJpbmcpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YSArIG90aGVyLmRhdGEpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgc3RyKG90aGVyKSkKKyAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhvdGhlciArIHNlbGYuZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzdHIob3RoZXIpICsgc2VsZi5kYXRhKQorICAgIGRlZiBfX211bF9fKHNlbGYsIG4pOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhKm4pCisgICAgX19ybXVsX18gPSBfX211bF9fCisgICAgZGVmIF9fbW9kX18oc2VsZiwgYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEgJSBhcmdzKQorCisgICAgIyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGRlZmluZWQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyOgorICAgIGRlZiBjYXBpdGFsaXplKHNlbGYpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmNhcGl0YWxpemUoKSkKKyAgICBkZWYgY2VudGVyKHNlbGYsIHdpZHRoLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuY2VudGVyKHdpZHRoLCAqYXJncykpCisgICAgZGVmIGNvdW50KHNlbGYsIHN1Yiwgc3RhcnQ9MCwgZW5kPXN5cy5tYXhpbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmNvdW50KHN1Yiwgc3RhcnQsIGVuZCkKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGVuY29kaW5nPU5vbmUsIGVycm9ycz1Ob25lKTogIyBYWFggaW1wcm92ZSB0aGlzPworICAgICAgICBpZiBlbmNvZGluZzoKKyAgICAgICAgICAgIGlmIGVycm9yczoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmRlY29kZShlbmNvZGluZywgZXJyb3JzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5kZWNvZGUoZW5jb2RpbmcpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5kZWNvZGUoKSkKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGVuY29kaW5nPU5vbmUsIGVycm9ycz1Ob25lKTogIyBYWFggaW1wcm92ZSB0aGlzPworICAgICAgICBpZiBlbmNvZGluZzoKKyAgICAgICAgICAgIGlmIGVycm9yczoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLmVuY29kZShlbmNvZGluZywgZXJyb3JzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5lbmNvZGUoZW5jb2RpbmcpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5lbmNvZGUoKSkKKyAgICBkZWYgZW5kc3dpdGgoc2VsZiwgc3VmZml4LCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuZW5kc3dpdGgoc3VmZml4LCBzdGFydCwgZW5kKQorICAgIGRlZiBleHBhbmR0YWJzKHNlbGYsIHRhYnNpemU9OCk6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuZXhwYW5kdGFicyh0YWJzaXplKSkKKyAgICBkZWYgZmluZChzZWxmLCBzdWIsIHN0YXJ0PTAsIGVuZD1zeXMubWF4aW50KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5maW5kKHN1Yiwgc3RhcnQsIGVuZCkKKyAgICBkZWYgaW5kZXgoc2VsZiwgc3ViLCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaW5kZXgoc3ViLCBzdGFydCwgZW5kKQorICAgIGRlZiBpc2FscGhhKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzYWxwaGEoKQorICAgIGRlZiBpc2FsbnVtKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzYWxudW0oKQorICAgIGRlZiBpc2RlY2ltYWwoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNkZWNpbWFsKCkKKyAgICBkZWYgaXNkaWdpdChzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc2RpZ2l0KCkKKyAgICBkZWYgaXNsb3dlcihzZWxmKTogcmV0dXJuIHNlbGYuZGF0YS5pc2xvd2VyKCkKKyAgICBkZWYgaXNudW1lcmljKHNlbGYpOiByZXR1cm4gc2VsZi5kYXRhLmlzbnVtZXJpYygpCisgICAgZGVmIGlzc3BhY2Uoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXNzcGFjZSgpCisgICAgZGVmIGlzdGl0bGUoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXN0aXRsZSgpCisgICAgZGVmIGlzdXBwZXIoc2VsZik6IHJldHVybiBzZWxmLmRhdGEuaXN1cHBlcigpCisgICAgZGVmIGpvaW4oc2VsZiwgc2VxKTogcmV0dXJuIHNlbGYuZGF0YS5qb2luKHNlcSkKKyAgICBkZWYgbGp1c3Qoc2VsZiwgd2lkdGgsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5sanVzdCh3aWR0aCwgKmFyZ3MpKQorICAgIGRlZiBsb3dlcihzZWxmKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5sb3dlcigpKQorICAgIGRlZiBsc3RyaXAoc2VsZiwgY2hhcnM9Tm9uZSk6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEubHN0cmlwKGNoYXJzKSkKKyAgICBkZWYgcGFydGl0aW9uKHNlbGYsIHNlcCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucGFydGl0aW9uKHNlcCkKKyAgICBkZWYgcmVwbGFjZShzZWxmLCBvbGQsIG5ldywgbWF4c3BsaXQ9LTEpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnJlcGxhY2Uob2xkLCBuZXcsIG1heHNwbGl0KSkKKyAgICBkZWYgcmZpbmQoc2VsZiwgc3ViLCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucmZpbmQoc3ViLCBzdGFydCwgZW5kKQorICAgIGRlZiByaW5kZXgoc2VsZiwgc3ViLCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucmluZGV4KHN1Yiwgc3RhcnQsIGVuZCkKKyAgICBkZWYgcmp1c3Qoc2VsZiwgd2lkdGgsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5yanVzdCh3aWR0aCwgKmFyZ3MpKQorICAgIGRlZiBycGFydGl0aW9uKHNlbGYsIHNlcCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucnBhcnRpdGlvbihzZXApCisgICAgZGVmIHJzdHJpcChzZWxmLCBjaGFycz1Ob25lKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS5yc3RyaXAoY2hhcnMpKQorICAgIGRlZiBzcGxpdChzZWxmLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnNwbGl0KHNlcCwgbWF4c3BsaXQpCisgICAgZGVmIHJzcGxpdChzZWxmLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnJzcGxpdChzZXAsIG1heHNwbGl0KQorICAgIGRlZiBzcGxpdGxpbmVzKHNlbGYsIGtlZXBlbmRzPTApOiByZXR1cm4gc2VsZi5kYXRhLnNwbGl0bGluZXMoa2VlcGVuZHMpCisgICAgZGVmIHN0YXJ0c3dpdGgoc2VsZiwgcHJlZml4LCBzdGFydD0wLCBlbmQ9c3lzLm1heGludCk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuc3RhcnRzd2l0aChwcmVmaXgsIHN0YXJ0LCBlbmQpCisgICAgZGVmIHN0cmlwKHNlbGYsIGNoYXJzPU5vbmUpOiByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhLnN0cmlwKGNoYXJzKSkKKyAgICBkZWYgc3dhcGNhc2Uoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuc3dhcGNhc2UoKSkKKyAgICBkZWYgdGl0bGUoc2VsZik6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEudGl0bGUoKSkKKyAgICBkZWYgdHJhbnNsYXRlKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS50cmFuc2xhdGUoKmFyZ3MpKQorICAgIGRlZiB1cHBlcihzZWxmKTogcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuZGF0YS51cHBlcigpKQorICAgIGRlZiB6ZmlsbChzZWxmLCB3aWR0aCk6IHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLmRhdGEuemZpbGwod2lkdGgpKQorCitjbGFzcyBNdXRhYmxlU3RyaW5nKFVzZXJTdHJpbmcsIGNvbGxlY3Rpb25zLk11dGFibGVTZXF1ZW5jZSk6CisgICAgIiIibXV0YWJsZSBzdHJpbmcgb2JqZWN0cworCisgICAgUHl0aG9uIHN0cmluZ3MgYXJlIGltbXV0YWJsZSBvYmplY3RzLiAgVGhpcyBoYXMgdGhlIGFkdmFudGFnZSwgdGhhdAorICAgIHN0cmluZ3MgbWF5IGJlIHVzZWQgYXMgZGljdGlvbmFyeSBrZXlzLiAgSWYgdGhpcyBwcm9wZXJ0eSBpc24ndCBuZWVkZWQKKyAgICBhbmQgeW91IGluc2lzdCBvbiBjaGFuZ2luZyBzdHJpbmcgdmFsdWVzIGluIHBsYWNlIGluc3RlYWQsIHlvdSBtYXkgY2hlYXQKKyAgICBhbmQgdXNlIE11dGFibGVTdHJpbmcuCisKKyAgICBCdXQgdGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyBhbiBlZHVjYXRpb25hbCBvbmU6IHRvIHByZXZlbnQKKyAgICBwZW9wbGUgZnJvbSBpbnZlbnRpbmcgdGhlaXIgb3duIG11dGFibGUgc3RyaW5nIGNsYXNzIGRlcml2ZWQKKyAgICBmcm9tIFVzZXJTdHJpbmcgYW5kIHRoYW4gZm9yZ2V0IHRoZXJlYnkgdG8gcmVtb3ZlIChvdmVycmlkZSkgdGhlCisgICAgX19oYXNoX18gbWV0aG9kIGluaGVyaXRlZCBmcm9tIFVzZXJTdHJpbmcuICBUaGlzIHdvdWxkIGxlYWQgdG8KKyAgICBlcnJvcnMgdGhhdCB3b3VsZCBiZSB2ZXJ5IGhhcmQgdG8gdHJhY2sgZG93bi4KKworICAgIEEgZmFzdGVyIGFuZCBiZXR0ZXIgc29sdXRpb24gaXMgdG8gcmV3cml0ZSB5b3VyIHByb2dyYW0gdXNpbmcgbGlzdHMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmluZz0iIik6CisgICAgICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCisgICAgICAgIHdhcm5weTNrKCd0aGUgY2xhc3MgVXNlclN0cmluZy5NdXRhYmxlU3RyaW5nIGhhcyBiZWVuIHJlbW92ZWQgaW4gJworICAgICAgICAgICAgICAgICAgICAnUHl0aG9uIDMuMCcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgc2VsZi5kYXRhID0gc3RyaW5nCisKKyAgICAjIFdlIGluaGVyaXQgb2JqZWN0Ll9faGFzaF9fLCBzbyB3ZSBtdXN0IGRlbnkgdGhpcyBleHBsaWNpdGx5CisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIHN1Yik6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsIHNsaWNlKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3ViLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgICAgICBzdWIgPSBzdWIuZGF0YQorICAgICAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShzdWIsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHN1YiA9IHN0cihzdWIpCisgICAgICAgICAgICBzdGFydCwgc3RvcCwgc3RlcCA9IGluZGV4LmluZGljZXMobGVuKHNlbGYuZGF0YSkpCisgICAgICAgICAgICBpZiBzdGVwID09IC0xOgorICAgICAgICAgICAgICAgIHN0YXJ0LCBzdG9wID0gc3RvcCsxLCBzdGFydCsxCisgICAgICAgICAgICAgICAgc3ViID0gc3ViWzo6LTFdCisgICAgICAgICAgICBlbGlmIHN0ZXAgIT0gMToKKyAgICAgICAgICAgICAgICAjIFhYWCh0d291dGVycyk6IEkgZ3Vlc3Mgd2Ugc2hvdWxkIGJlIHJlaW1wbGVtZW50aW5nCisgICAgICAgICAgICAgICAgIyB0aGUgZXh0ZW5kZWQgc2xpY2UgYXNzaWdubWVudC9kZWxldGlvbiBhbGdvcml0aG0gaGVyZS4uLgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImludmFsaWQgc3RlcCBpbiBzbGljaW5nIGFzc2lnbm1lbnQiCisgICAgICAgICAgICBzdGFydCA9IG1pbihzdGFydCwgc3RvcCkKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdICsgc3ViICsgc2VsZi5kYXRhW3N0b3A6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaW5kZXggPCAwOgorICAgICAgICAgICAgICAgIGluZGV4ICs9IGxlbihzZWxmLmRhdGEpCisgICAgICAgICAgICBpZiBpbmRleCA8IDAgb3IgaW5kZXggPj0gbGVuKHNlbGYuZGF0YSk6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6aW5kZXhdICsgc3ViICsgc2VsZi5kYXRhW2luZGV4KzE6XQorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsIHNsaWNlKToKKyAgICAgICAgICAgIHN0YXJ0LCBzdG9wLCBzdGVwID0gaW5kZXguaW5kaWNlcyhsZW4oc2VsZi5kYXRhKSkKKyAgICAgICAgICAgIGlmIHN0ZXAgPT0gLTE6CisgICAgICAgICAgICAgICAgc3RhcnQsIHN0b3AgPSBzdG9wKzEsIHN0YXJ0KzEKKyAgICAgICAgICAgIGVsaWYgc3RlcCAhPSAxOgorICAgICAgICAgICAgICAgICMgWFhYKHR3b3V0ZXJzKTogc2VlIHNhbWUgYmxvY2sgaW4gX19zZXRpdGVtX18KKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJpbnZhbGlkIHN0ZXAgaW4gc2xpY2luZyBkZWxldGlvbiIKKyAgICAgICAgICAgIHN0YXJ0ID0gbWluKHN0YXJ0LCBzdG9wKQorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhWzpzdGFydF0gKyBzZWxmLmRhdGFbc3RvcDpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBpbmRleCA8IDA6CisgICAgICAgICAgICAgICAgaW5kZXggKz0gbGVuKHNlbGYuZGF0YSkKKyAgICAgICAgICAgIGlmIGluZGV4IDwgMCBvciBpbmRleCA+PSBsZW4oc2VsZi5kYXRhKTogcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhWzppbmRleF0gKyBzZWxmLmRhdGFbaW5kZXgrMTpdCisgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBzdGFydCwgZW5kLCBzdWIpOgorICAgICAgICBzdGFydCA9IG1heChzdGFydCwgMCk7IGVuZCA9IG1heChlbmQsIDApCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3ViLCBVc2VyU3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdK3N1Yi5kYXRhK3NlbGYuZGF0YVtlbmQ6XQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3ViLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdK3N1YitzZWxmLmRhdGFbZW5kOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9ICBzZWxmLmRhdGFbOnN0YXJ0XStzdHIoc3ViKStzZWxmLmRhdGFbZW5kOl0KKyAgICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIHN0YXJ0LCBlbmQpOgorICAgICAgICBzdGFydCA9IG1heChzdGFydCwgMCk7IGVuZCA9IG1heChlbmQsIDApCisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdICsgc2VsZi5kYXRhW2VuZDpdCisgICAgZGVmIGltbXV0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFVzZXJTdHJpbmcoc2VsZi5kYXRhKQorICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJTdHJpbmcpOgorICAgICAgICAgICAgc2VsZi5kYXRhICs9IG90aGVyLmRhdGEKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuZGF0YSArPSBvdGhlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kYXRhICs9IHN0cihvdGhlcikKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgX19pbXVsX18oc2VsZiwgbik6CisgICAgICAgIHNlbGYuZGF0YSAqPSBuCisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgdmFsdWUpOgorICAgICAgICBzZWxmW2luZGV4OmluZGV4XSA9IHZhbHVlCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBleGVjdXRlIHRoZSByZWdyZXNzaW9uIHRlc3QgdG8gc3Rkb3V0LCBpZiBjYWxsZWQgYXMgYSBzY3JpcHQ6CisgICAgaW1wb3J0IG9zCisgICAgY2FsbGVkX2luX2RpciwgY2FsbGVkX2FzID0gb3MucGF0aC5zcGxpdChzeXMuYXJndlswXSkKKyAgICBjYWxsZWRfYXMsIHB5ID0gb3MucGF0aC5zcGxpdGV4dChjYWxsZWRfYXMpCisgICAgaWYgJy1xJyBpbiBzeXMuYXJndjoKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICAgICAgdGVzdF9zdXBwb3J0LnZlcmJvc2UgPSAwCisgICAgX19pbXBvcnRfXygndGVzdC50ZXN0XycgKyBjYWxsZWRfYXMubG93ZXIoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlclN0cmluZy5weWMgYi9saWIvcHl0aG9uMi43L1VzZXJTdHJpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1VzZXJTdHJpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvVXNlclN0cmluZy5weW8gYi9saWIvcHl0aG9uMi43L1VzZXJTdHJpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjUzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L1VzZXJTdHJpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX0xXUENvb2tpZUphci5weSBiL2xpYi9weXRob24yLjcvX0xXUENvb2tpZUphci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNjNjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fTFdQQ29va2llSmFyLnB5CkBAIC0wLDAgKzEsMTcwIEBACisiIiJMb2FkIC8gc2F2ZSB0byBsaWJ3d3ctcGVybCAoTFdQKSBmb3JtYXQgZmlsZXMuCisKK0FjdHVhbGx5LCB0aGUgZm9ybWF0IGlzIHNsaWdodGx5IGV4dGVuZGVkIGZyb20gdGhhdCB1c2VkIGJ5IExXUCdzCisobGlid3d3LXBlcmwncykgSFRUUDo6Q29va2llcywgdG8gYXZvaWQgbG9zaW5nIHNvbWUgUkZDIDI5NjUgaW5mb3JtYXRpb24KK25vdCByZWNvcmRlZCBieSBMV1AuCisKK0l0IHVzZXMgdGhlIHZlcnNpb24gc3RyaW5nICIyLjAiLCB0aG91Z2ggcmVhbGx5IHRoZXJlIGlzbid0IGFuIExXUCBDb29raWVzCisyLjAgZm9ybWF0LiAgVGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBleHRyYSBpbmZvcm1hdGlvbiBpbiBoZXJlCisoZG9tYWluX2RvdCBhbmQgIyBwb3J0X3NwZWMpIHdoaWxlIHN0aWxsIGJlaW5nIGNvbXBhdGlibGUgd2l0aAorbGlid3d3LXBlcmwsIEkgaG9wZS4KKworIiIiCisKK2ltcG9ydCB0aW1lLCByZQorZnJvbSBjb29raWVsaWIgaW1wb3J0IChfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uLCBGaWxlQ29va2llSmFyLCBMb2FkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZSwgTUlTU0lOR19GSUxFTkFNRV9URVhULAorICAgICAgICAgICAgICAgICAgICAgICBqb2luX2hlYWRlcl93b3Jkcywgc3BsaXRfaGVhZGVyX3dvcmRzLAorICAgICAgICAgICAgICAgICAgICAgICBpc28ydGltZSwgdGltZTJpc296KQorCitkZWYgbHdwX2Nvb2tpZV9zdHIoY29va2llKToKKyAgICAiIiJSZXR1cm4gc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIENvb2tpZSBpbiBhbiB0aGUgTFdQIGNvb2tpZSBmaWxlIGZvcm1hdC4KKworICAgIEFjdHVhbGx5LCB0aGUgZm9ybWF0IGlzIGV4dGVuZGVkIGEgYml0IC0tIHNlZSBtb2R1bGUgZG9jc3RyaW5nLgorCisgICAgIiIiCisgICAgaCA9IFsoY29va2llLm5hbWUsIGNvb2tpZS52YWx1ZSksCisgICAgICAgICAoInBhdGgiLCBjb29raWUucGF0aCksCisgICAgICAgICAoImRvbWFpbiIsIGNvb2tpZS5kb21haW4pXQorICAgIGlmIGNvb2tpZS5wb3J0IGlzIG5vdCBOb25lOiBoLmFwcGVuZCgoInBvcnQiLCBjb29raWUucG9ydCkpCisgICAgaWYgY29va2llLnBhdGhfc3BlY2lmaWVkOiBoLmFwcGVuZCgoInBhdGhfc3BlYyIsIE5vbmUpKQorICAgIGlmIGNvb2tpZS5wb3J0X3NwZWNpZmllZDogaC5hcHBlbmQoKCJwb3J0X3NwZWMiLCBOb25lKSkKKyAgICBpZiBjb29raWUuZG9tYWluX2luaXRpYWxfZG90OiBoLmFwcGVuZCgoImRvbWFpbl9kb3QiLCBOb25lKSkKKyAgICBpZiBjb29raWUuc2VjdXJlOiBoLmFwcGVuZCgoInNlY3VyZSIsIE5vbmUpKQorICAgIGlmIGNvb2tpZS5leHBpcmVzOiBoLmFwcGVuZCgoImV4cGlyZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUyaXNveihmbG9hdChjb29raWUuZXhwaXJlcykpKSkKKyAgICBpZiBjb29raWUuZGlzY2FyZDogaC5hcHBlbmQoKCJkaXNjYXJkIiwgTm9uZSkpCisgICAgaWYgY29va2llLmNvbW1lbnQ6IGguYXBwZW5kKCgiY29tbWVudCIsIGNvb2tpZS5jb21tZW50KSkKKyAgICBpZiBjb29raWUuY29tbWVudF91cmw6IGguYXBwZW5kKCgiY29tbWVudHVybCIsIGNvb2tpZS5jb21tZW50X3VybCkpCisKKyAgICBrZXlzID0gY29va2llLl9yZXN0LmtleXMoKQorICAgIGtleXMuc29ydCgpCisgICAgZm9yIGsgaW4ga2V5czoKKyAgICAgICAgaC5hcHBlbmQoKGssIHN0cihjb29raWUuX3Jlc3Rba10pKSkKKworICAgIGguYXBwZW5kKCgidmVyc2lvbiIsIHN0cihjb29raWUudmVyc2lvbikpKQorCisgICAgcmV0dXJuIGpvaW5faGVhZGVyX3dvcmRzKFtoXSkKKworY2xhc3MgTFdQQ29va2llSmFyKEZpbGVDb29raWVKYXIpOgorICAgICIiIgorICAgIFRoZSBMV1BDb29raWVKYXIgc2F2ZXMgYSBzZXF1ZW5jZSBvZiAiU2V0LUNvb2tpZTMiIGxpbmVzLgorICAgICJTZXQtQ29va2llMyIgaXMgdGhlIGZvcm1hdCB1c2VkIGJ5IHRoZSBsaWJ3d3ctcGVybCBsaWJhcnksIG5vdCBrbm93bgorICAgIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBhbnkgYnJvd3NlciwgYnV0IHdoaWNoIGlzIGVhc3kgdG8gcmVhZCBhbmQKKyAgICBkb2Vzbid0IGxvc2UgaW5mb3JtYXRpb24gYWJvdXQgUkZDIDI5NjUgY29va2llcy4KKworICAgIEFkZGl0aW9uYWwgbWV0aG9kcworCisgICAgYXNfbHdwX3N0cihpZ25vcmVfZGlzY2FyZD1UcnVlLCBpZ25vcmVfZXhwaXJlZD1UcnVlKQorCisgICAgIiIiCisKKyAgICBkZWYgYXNfbHdwX3N0cihzZWxmLCBpZ25vcmVfZGlzY2FyZD1UcnVlLCBpZ25vcmVfZXhwaXJlcz1UcnVlKToKKyAgICAgICAgIiIiUmV0dXJuIGNvb2tpZXMgYXMgYSBzdHJpbmcgb2YgIlxcbiItc2VwYXJhdGVkICJTZXQtQ29va2llMyIgaGVhZGVycy4KKworICAgICAgICBpZ25vcmVfZGlzY2FyZCBhbmQgaWdub3JlX2V4cGlyZXM6IHNlZSBkb2NzdHJpbmcgZm9yIEZpbGVDb29raWVKYXIuc2F2ZQorCisgICAgICAgICIiIgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICByID0gW10KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kaXNjYXJkIGFuZCBjb29raWUuZGlzY2FyZDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjb29raWUuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByLmFwcGVuZCgiU2V0LUNvb2tpZTM6ICVzIiAlIGx3cF9jb29raWVfc3RyKGNvb2tpZSkpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4ocitbIiJdKQorCisgICAgZGVmIHNhdmUoc2VsZiwgZmlsZW5hbWU9Tm9uZSwgaWdub3JlX2Rpc2NhcmQ9RmFsc2UsIGlnbm9yZV9leHBpcmVzPUZhbHNlKToKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6IGZpbGVuYW1lID0gc2VsZi5maWxlbmFtZQorICAgICAgICAgICAgZWxzZTogcmFpc2UgVmFsdWVFcnJvcihNSVNTSU5HX0ZJTEVOQU1FX1RFWFQpCisKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBUaGVyZSByZWFsbHkgaXNuJ3QgYW4gTFdQIENvb2tpZXMgMi4wIGZvcm1hdCwgYnV0IHRoaXMgaW5kaWNhdGVzCisgICAgICAgICAgICAjIHRoYXQgdGhlcmUgaXMgZXh0cmEgaW5mb3JtYXRpb24gaW4gaGVyZSAoZG9tYWluX2RvdCBhbmQKKyAgICAgICAgICAgICMgcG9ydF9zcGVjKSB3aGlsZSBzdGlsbCBiZWluZyBjb21wYXRpYmxlIHdpdGggbGlid3d3LXBlcmwsIEkgaG9wZS4KKyAgICAgICAgICAgIGYud3JpdGUoIiNMV1AtQ29va2llcy0yLjBcbiIpCisgICAgICAgICAgICBmLndyaXRlKHNlbGYuYXNfbHdwX3N0cihpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgX3JlYWxseV9sb2FkKHNlbGYsIGYsIGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZCwgaWdub3JlX2V4cGlyZXMpOgorICAgICAgICBtYWdpYyA9IGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgcmUuc2VhcmNoKHNlbGYubWFnaWNfcmUsIG1hZ2ljKToKKyAgICAgICAgICAgIG1zZyA9ICgiJXIgZG9lcyBub3QgbG9vayBsaWtlIGEgU2V0LUNvb2tpZTMgKExXUCkgZm9ybWF0ICIKKyAgICAgICAgICAgICAgICAgICAiZmlsZSIgJSBmaWxlbmFtZSkKKyAgICAgICAgICAgIHJhaXNlIExvYWRFcnJvcihtc2cpCisKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKworICAgICAgICBoZWFkZXIgPSAiU2V0LUNvb2tpZTM6IgorICAgICAgICBib29sZWFuX2F0dHJzID0gKCJwb3J0X3NwZWMiLCAicGF0aF9zcGVjIiwgImRvbWFpbl9kb3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZWN1cmUiLCAiZGlzY2FyZCIpCisgICAgICAgIHZhbHVlX2F0dHJzID0gKCJ2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInBvcnQiLCAicGF0aCIsICJkb21haW4iLAorICAgICAgICAgICAgICAgICAgICAgICAiZXhwaXJlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICJjb21tZW50IiwgImNvbW1lbnR1cmwiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gIiI6IGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RhcnRzd2l0aChoZWFkZXIpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lW2xlbihoZWFkZXIpOl0uc3RyaXAoKQorCisgICAgICAgICAgICAgICAgZm9yIGRhdGEgaW4gc3BsaXRfaGVhZGVyX3dvcmRzKFtsaW5lXSk6CisgICAgICAgICAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gZGF0YVswXQorICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCA9IHt9CisgICAgICAgICAgICAgICAgICAgIHJlc3QgPSB7fQorICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBib29sZWFuX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRba10gPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBkYXRhWzE6XToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMgPSBrLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbid0IGxvc2UgY2FzZSBkaXN0aW5jdGlvbiBmb3IgdW5rbm93biBmaWVsZHMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYyBpbiB2YWx1ZV9hdHRycykgb3IgKGxjIGluIGJvb2xlYW5fYXR0cnMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBsYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgayBpbiBib29sZWFuX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZTogdiA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZFtrXSA9IHYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgayBpbiB2YWx1ZV9hdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZFtrXSA9IHYKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdFtrXSA9IHYKKworICAgICAgICAgICAgICAgICAgICBoID0gc3RhbmRhcmQuZ2V0CisgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBoKCJleHBpcmVzIikKKyAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCA9IGgoImRpc2NhcmQiKQorICAgICAgICAgICAgICAgICAgICBpZiBleHBpcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9IGlzbzJ0aW1lKGV4cGlyZXMpCisgICAgICAgICAgICAgICAgICAgIGlmIGV4cGlyZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NhcmQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGgoImRvbWFpbiIpCisgICAgICAgICAgICAgICAgICAgIGRvbWFpbl9zcGVjaWZpZWQgPSBkb21haW4uc3RhcnRzd2l0aCgiLiIpCisgICAgICAgICAgICAgICAgICAgIGMgPSBDb29raWUoaCgidmVyc2lvbiIpLCBuYW1lLCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJwb3J0IiksIGgoInBvcnRfc3BlYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgaCgiZG9tYWluX2RvdCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoInBhdGgiKSwgaCgicGF0aF9zcGVjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaCgic2VjdXJlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwaXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgoImNvbW1lbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoKCJjb21tZW50dXJsIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kaXNjYXJkIGFuZCBjLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlX2V4cGlyZXMgYW5kIGMuaXNfZXhwaXJlZChub3cpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRfY29va2llKGMpCisKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgX3dhcm5fdW5oYW5kbGVkX2V4Y2VwdGlvbigpCisgICAgICAgICAgICByYWlzZSBMb2FkRXJyb3IoImludmFsaWQgU2V0LUNvb2tpZTMgZm9ybWF0IGZpbGUgJXI6ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lLCBsaW5lKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX0xXUENvb2tpZUphci5weWMgYi9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX0xXUENvb2tpZUphci5weW8gYi9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19MV1BDb29raWVKYXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX01vemlsbGFDb29raWVKYXIucHkgYi9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZThiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5CkBAIC0wLDAgKzEsMTQ5IEBACisiIiJNb3ppbGxhIC8gTmV0c2NhcGUgY29va2llIGxvYWRpbmcgLyBzYXZpbmcuIiIiCisKK2ltcG9ydCByZSwgdGltZQorCitmcm9tIGNvb2tpZWxpYiBpbXBvcnQgKF93YXJuX3VuaGFuZGxlZF9leGNlcHRpb24sIEZpbGVDb29raWVKYXIsIExvYWRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ29va2llLCBNSVNTSU5HX0ZJTEVOQU1FX1RFWFQpCisKK2NsYXNzIE1vemlsbGFDb29raWVKYXIoRmlsZUNvb2tpZUphcik6CisgICAgIiIiCisKKyAgICBXQVJOSU5HOiB5b3UgbWF5IHdhbnQgdG8gYmFja3VwIHlvdXIgYnJvd3NlcidzIGNvb2tpZXMgZmlsZSBpZiB5b3UgdXNlCisgICAgdGhpcyBjbGFzcyB0byBzYXZlIGNvb2tpZXMuICBJICp0aGluayogaXQgd29ya3MsIGJ1dCB0aGVyZSBoYXZlIGJlZW4KKyAgICBidWdzIGluIHRoZSBwYXN0IQorCisgICAgVGhpcyBjbGFzcyBkaWZmZXJzIGZyb20gQ29va2llSmFyIG9ubHkgaW4gdGhlIGZvcm1hdCBpdCB1c2VzIHRvIHNhdmUgYW5kCisgICAgbG9hZCBjb29raWVzIHRvIGFuZCBmcm9tIGEgZmlsZS4gIFRoaXMgY2xhc3MgdXNlcyB0aGUgTW96aWxsYS9OZXRzY2FwZQorICAgIGBjb29raWVzLnR4dCcgZm9ybWF0LiAgbHlueCB1c2VzIHRoaXMgZmlsZSBmb3JtYXQsIHRvby4KKworICAgIERvbid0IGV4cGVjdCBjb29raWVzIHNhdmVkIHdoaWxlIHRoZSBicm93c2VyIGlzIHJ1bm5pbmcgdG8gYmUgbm90aWNlZCBieQorICAgIHRoZSBicm93c2VyIChpbiBmYWN0LCBNb3ppbGxhIG9uIHVuaXggd2lsbCBvdmVyd3JpdGUgeW91ciBzYXZlZCBjb29raWVzIGlmCisgICAgeW91IGNoYW5nZSB0aGVtIG9uIGRpc2sgd2hpbGUgaXQncyBydW5uaW5nOyBvbiBXaW5kb3dzLCB5b3UgcHJvYmFibHkgY2FuJ3QKKyAgICBzYXZlIGF0IGFsbCB3aGlsZSB0aGUgYnJvd3NlciBpcyBydW5uaW5nKS4KKworICAgIE5vdGUgdGhhdCB0aGUgTW96aWxsYS9OZXRzY2FwZSBmb3JtYXQgd2lsbCBkb3duZ3JhZGUgUkZDMjk2NSBjb29raWVzIHRvCisgICAgTmV0c2NhcGUgY29va2llcyBvbiBzYXZpbmcuCisKKyAgICBJbiBwYXJ0aWN1bGFyLCB0aGUgY29va2llIHZlcnNpb24gYW5kIHBvcnQgbnVtYmVyIGluZm9ybWF0aW9uIGlzIGxvc3QsCisgICAgdG9nZXRoZXIgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIG9yIG5vdCBQYXRoLCBQb3J0IGFuZCBEaXNjYXJkIHdlcmUKKyAgICBzcGVjaWZpZWQgYnkgdGhlIFNldC1Db29raWUyIChvciBTZXQtQ29va2llKSBoZWFkZXIsIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgICBkb21haW4gYXMgc2V0IGluIHRoZSBIVFRQIGhlYWRlciBzdGFydGVkIHdpdGggYSBkb3QgKHllcywgSSdtIGF3YXJlIHNvbWUKKyAgICBkb21haW5zIGluIE5ldHNjYXBlIGZpbGVzIHN0YXJ0IHdpdGggYSBkb3QgYW5kIHNvbWUgZG9uJ3QgLS0gdHJ1c3QgbWUsIHlvdQorICAgIHJlYWxseSBkb24ndCB3YW50IHRvIGtub3cgYW55IG1vcmUgYWJvdXQgdGhpcykuCisKKyAgICBOb3RlIHRoYXQgdGhvdWdoIE1vemlsbGEgYW5kIE5ldHNjYXBlIHVzZSB0aGUgc2FtZSBmb3JtYXQsIHRoZXkgdXNlCisgICAgc2xpZ2h0bHkgZGlmZmVyZW50IGhlYWRlcnMuICBUaGUgY2xhc3Mgc2F2ZXMgY29va2llcyB1c2luZyB0aGUgTmV0c2NhcGUKKyAgICBoZWFkZXIgYnkgZGVmYXVsdCAoTW96aWxsYSBjYW4gY29wZSB3aXRoIHRoYXQpLgorCisgICAgIiIiCisgICAgbWFnaWNfcmUgPSAiIyggTmV0c2NhcGUpPyBIVFRQIENvb2tpZSBGaWxlIgorICAgIGhlYWRlciA9ICIiIlwKKyMgTmV0c2NhcGUgSFRUUCBDb29raWUgRmlsZQorIyBodHRwOi8vd3d3Lm5ldHNjYXBlLmNvbS9uZXdzcmVmL3N0ZC9jb29raWVfc3BlYy5odG1sCisjIFRoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZSEgIERvIG5vdCBlZGl0LgorCisiIiIKKworICAgIGRlZiBfcmVhbGx5X2xvYWQoc2VsZiwgZiwgZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkLCBpZ25vcmVfZXhwaXJlcyk6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisKKyAgICAgICAgbWFnaWMgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHJlLnNlYXJjaChzZWxmLm1hZ2ljX3JlLCBtYWdpYyk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlIExvYWRFcnJvcigKKyAgICAgICAgICAgICAgICAiJXIgZG9lcyBub3QgbG9vayBsaWtlIGEgTmV0c2NhcGUgZm9ybWF0IGNvb2tpZXMgZmlsZSIgJQorICAgICAgICAgICAgICAgIGZpbGVuYW1lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gIiI6IGJyZWFrCisKKyAgICAgICAgICAgICAgICAjIGxhc3QgZmllbGQgbWF5IGJlIGFic2VudCwgc28ga2VlcCBhbnkgdHJhaWxpbmcgdGFiCisgICAgICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgiXG4iKTogbGluZSA9IGxpbmVbOi0xXQorCisgICAgICAgICAgICAgICAgIyBza2lwIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lcyBYWFggd2hhdCBpcyAkIGZvcj8KKyAgICAgICAgICAgICAgICBpZiAobGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoKCIjIiwgIiQiKSkgb3IKKyAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpID09ICIiKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGRvbWFpbiwgZG9tYWluX3NwZWNpZmllZCwgcGF0aCwgc2VjdXJlLCBleHBpcmVzLCBuYW1lLCB2YWx1ZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3BsaXQoIlx0IikKKyAgICAgICAgICAgICAgICBzZWN1cmUgPSAoc2VjdXJlID09ICJUUlVFIikKKyAgICAgICAgICAgICAgICBkb21haW5fc3BlY2lmaWVkID0gKGRvbWFpbl9zcGVjaWZpZWQgPT0gIlRSVUUiKQorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgICMgY29va2llcy50eHQgcmVnYXJkcyAnU2V0LUNvb2tpZTogZm9vJyBhcyBhIGNvb2tpZQorICAgICAgICAgICAgICAgICAgICAjIHdpdGggbm8gbmFtZSwgd2hlcmVhcyBjb29raWVsaWIgcmVnYXJkcyBpdCBhcyBhCisgICAgICAgICAgICAgICAgICAgICMgY29va2llIHdpdGggbm8gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB2YWx1ZQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKworICAgICAgICAgICAgICAgIGluaXRpYWxfZG90ID0gZG9tYWluLnN0YXJ0c3dpdGgoIi4iKQorICAgICAgICAgICAgICAgIGFzc2VydCBkb21haW5fc3BlY2lmaWVkID09IGluaXRpYWxfZG90CisKKyAgICAgICAgICAgICAgICBkaXNjYXJkID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBleHBpcmVzID09ICIiOgorICAgICAgICAgICAgICAgICAgICBleHBpcmVzID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBkaXNjYXJkID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgIyBhc3N1bWUgcGF0aF9zcGVjaWZpZWQgaXMgZmFsc2UKKyAgICAgICAgICAgICAgICBjID0gQ29va2llKDAsIG5hbWUsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4sIGRvbWFpbl9zcGVjaWZpZWQsIGluaXRpYWxfZG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAge30pCisgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9kaXNjYXJkIGFuZCBjLmRpc2NhcmQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbm90IGlnbm9yZV9leHBpcmVzIGFuZCBjLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoYykKKworICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uKCkKKyAgICAgICAgICAgIHJhaXNlIExvYWRFcnJvcigiaW52YWxpZCBOZXRzY2FwZSBmb3JtYXQgY29va2llcyBmaWxlICVyOiAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZSwgbGluZSkpCisKKyAgICBkZWYgc2F2ZShzZWxmLCBmaWxlbmFtZT1Ob25lLCBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5maWxlbmFtZSBpcyBub3QgTm9uZTogZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCisgICAgICAgICAgICBlbHNlOiByYWlzZSBWYWx1ZUVycm9yKE1JU1NJTkdfRklMRU5BTUVfVEVYVCkKKworICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKHNlbGYuaGVhZGVyKQorICAgICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjoKKyAgICAgICAgICAgICAgICBpZiBub3QgaWdub3JlX2Rpc2NhcmQgYW5kIGNvb2tpZS5kaXNjYXJkOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfZXhwaXJlcyBhbmQgY29va2llLmlzX2V4cGlyZWQobm93KToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuc2VjdXJlOiBzZWN1cmUgPSAiVFJVRSIKKyAgICAgICAgICAgICAgICBlbHNlOiBzZWN1cmUgPSAiRkFMU0UiCisgICAgICAgICAgICAgICAgaWYgY29va2llLmRvbWFpbi5zdGFydHN3aXRoKCIuIik6IGluaXRpYWxfZG90ID0gIlRSVUUiCisgICAgICAgICAgICAgICAgZWxzZTogaW5pdGlhbF9kb3QgPSAiRkFMU0UiCisgICAgICAgICAgICAgICAgaWYgY29va2llLmV4cGlyZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgPSBzdHIoY29va2llLmV4cGlyZXMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlcyA9ICIiCisgICAgICAgICAgICAgICAgaWYgY29va2llLnZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgY29va2llcy50eHQgcmVnYXJkcyAnU2V0LUNvb2tpZTogZm9vJyBhcyBhIGNvb2tpZQorICAgICAgICAgICAgICAgICAgICAjIHdpdGggbm8gbmFtZSwgd2hlcmVhcyBjb29raWVsaWIgcmVnYXJkcyBpdCBhcyBhCisgICAgICAgICAgICAgICAgICAgICMgY29va2llIHdpdGggbm8gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiIgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvb2tpZS5uYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGNvb2tpZS5uYW1lCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29va2llLnZhbHVlCisgICAgICAgICAgICAgICAgZi53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgIlx0Ii5qb2luKFtjb29raWUuZG9tYWluLCBpbml0aWFsX2RvdCwgY29va2llLnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLCBleHBpcmVzLCBuYW1lLCB2YWx1ZV0pKworICAgICAgICAgICAgICAgICAgICAiXG4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5YyBiL2xpYi9weXRob24yLjcvX01vemlsbGFDb29raWVKYXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MjY3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5byBiL2xpYi9weXRob24yLjcvX01vemlsbGFDb29raWVKYXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGE3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19Nb3ppbGxhQ29va2llSmFyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19fZnV0dXJlX18ucHkgYi9saWIvcHl0aG9uMi43L19fZnV0dXJlX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5OTZlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX19mdXR1cmVfXy5weQpAQCAtMCwwICsxLDEyOCBAQAorIiIiUmVjb3JkIG9mIHBoYXNlZC1pbiBpbmNvbXBhdGlibGUgbGFuZ3VhZ2UgY2hhbmdlcy4KKworRWFjaCBsaW5lIGlzIG9mIHRoZSBmb3JtOgorCisgICAgRmVhdHVyZU5hbWUgPSAiX0ZlYXR1cmUoIiBPcHRpb25hbFJlbGVhc2UgIiwiIE1hbmRhdG9yeVJlbGVhc2UgIiwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlckZsYWcgIikiCisKK3doZXJlLCBub3JtYWxseSwgT3B0aW9uYWxSZWxlYXNlIDwgTWFuZGF0b3J5UmVsZWFzZSwgYW5kIGJvdGggYXJlIDUtdHVwbGVzCitvZiB0aGUgc2FtZSBmb3JtIGFzIHN5cy52ZXJzaW9uX2luZm86CisKKyAgICAoUFlfTUFKT1JfVkVSU0lPTiwgIyB0aGUgMiBpbiAyLjEuMGEzOyBhbiBpbnQKKyAgICAgUFlfTUlOT1JfVkVSU0lPTiwgIyB0aGUgMTsgYW4gaW50CisgICAgIFBZX01JQ1JPX1ZFUlNJT04sICMgdGhlIDA7IGFuIGludAorICAgICBQWV9SRUxFQVNFX0xFVkVMLCAjICJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIgb3IgImZpbmFsIjsgc3RyaW5nCisgICAgIFBZX1JFTEVBU0VfU0VSSUFMICMgdGhlIDM7IGFuIGludAorICAgICkKKworT3B0aW9uYWxSZWxlYXNlIHJlY29yZHMgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2gKKworICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgRmVhdHVyZU5hbWUKKword2FzIGFjY2VwdGVkLgorCitJbiB0aGUgY2FzZSBvZiBNYW5kYXRvcnlSZWxlYXNlcyB0aGF0IGhhdmUgbm90IHlldCBvY2N1cnJlZCwKK01hbmRhdG9yeVJlbGVhc2UgcHJlZGljdHMgdGhlIHJlbGVhc2UgaW4gd2hpY2ggdGhlIGZlYXR1cmUgd2lsbCBiZWNvbWUgcGFydAorb2YgdGhlIGxhbmd1YWdlLgorCitFbHNlIE1hbmRhdG9yeVJlbGVhc2UgcmVjb3JkcyB3aGVuIHRoZSBmZWF0dXJlIGJlY2FtZSBwYXJ0IG9mIHRoZSBsYW5ndWFnZTsKK2luIHJlbGVhc2VzIGF0IG9yIGFmdGVyIHRoYXQsIG1vZHVsZXMgbm8gbG9uZ2VyIG5lZWQKKworICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgRmVhdHVyZU5hbWUKKwordG8gdXNlIHRoZSBmZWF0dXJlIGluIHF1ZXN0aW9uLCBidXQgbWF5IGNvbnRpbnVlIHRvIHVzZSBzdWNoIGltcG9ydHMuCisKK01hbmRhdG9yeVJlbGVhc2UgbWF5IGFsc28gYmUgTm9uZSwgbWVhbmluZyB0aGF0IGEgcGxhbm5lZCBmZWF0dXJlIGdvdAorZHJvcHBlZC4KKworSW5zdGFuY2VzIG9mIGNsYXNzIF9GZWF0dXJlIGhhdmUgdHdvIGNvcnJlc3BvbmRpbmcgbWV0aG9kcywKKy5nZXRPcHRpb25hbFJlbGVhc2UoKSBhbmQgLmdldE1hbmRhdG9yeVJlbGVhc2UoKS4KKworQ29tcGlsZXJGbGFnIGlzIHRoZSAoYml0ZmllbGQpIGZsYWcgdGhhdCBzaG91bGQgYmUgcGFzc2VkIGluIHRoZSBmb3VydGgKK2FyZ3VtZW50IHRvIHRoZSBidWlsdGluIGZ1bmN0aW9uIGNvbXBpbGUoKSB0byBlbmFibGUgdGhlIGZlYXR1cmUgaW4KK2R5bmFtaWNhbGx5IGNvbXBpbGVkIGNvZGUuICBUaGlzIGZsYWcgaXMgc3RvcmVkIGluIHRoZSAuY29tcGlsZXJfZmxhZworYXR0cmlidXRlIG9uIF9GdXR1cmUgaW5zdGFuY2VzLiAgVGhlc2UgdmFsdWVzIG11c3QgbWF0Y2ggdGhlIGFwcHJvcHJpYXRlCisjZGVmaW5lcyBvZiBDT194eHggZmxhZ3MgaW4gSW5jbHVkZS9jb21waWxlLmguCisKK05vIGZlYXR1cmUgbGluZSBpcyBldmVyIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGlzIGZpbGUuCisiIiIKKworYWxsX2ZlYXR1cmVfbmFtZXMgPSBbCisgICAgIm5lc3RlZF9zY29wZXMiLAorICAgICJnZW5lcmF0b3JzIiwKKyAgICAiZGl2aXNpb24iLAorICAgICJhYnNvbHV0ZV9pbXBvcnQiLAorICAgICJ3aXRoX3N0YXRlbWVudCIsCisgICAgInByaW50X2Z1bmN0aW9uIiwKKyAgICAidW5pY29kZV9saXRlcmFscyIsCitdCisKK19fYWxsX18gPSBbImFsbF9mZWF0dXJlX25hbWVzIl0gKyBhbGxfZmVhdHVyZV9uYW1lcworCisjIFRoZSBDT194eHggc3ltYm9scyBhcmUgZGVmaW5lZCBoZXJlIHVuZGVyIHRoZSBzYW1lIG5hbWVzIHVzZWQgYnkKKyMgY29tcGlsZS5oLCBzbyB0aGF0IGFuIGVkaXRvciBzZWFyY2ggd2lsbCBmaW5kIHRoZW0gaGVyZS4gIEhvd2V2ZXIsCisjIHRoZXkncmUgbm90IGV4cG9ydGVkIGluIF9fYWxsX18sIGJlY2F1c2UgdGhleSBkb24ndCByZWFsbHkgYmVsb25nIHRvCisjIHRoaXMgbW9kdWxlLgorQ09fTkVTVEVEICAgICAgICAgICAgPSAweDAwMTAgICAjIG5lc3RlZF9zY29wZXMKK0NPX0dFTkVSQVRPUl9BTExPV0VEID0gMCAgICAgICAgIyBnZW5lcmF0b3JzIChvYnNvbGV0ZSwgd2FzIDB4MTAwMCkKK0NPX0ZVVFVSRV9ESVZJU0lPTiAgID0gMHgyMDAwICAgIyBkaXZpc2lvbgorQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCA9IDB4NDAwMCAjIHBlcmZvcm0gYWJzb2x1dGUgaW1wb3J0cyBieSBkZWZhdWx0CitDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQgID0gMHg4MDAwICAgIyB3aXRoIHN0YXRlbWVudAorQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OICA9IDB4MTAwMDAgICAjIHByaW50IGZ1bmN0aW9uCitDT19GVVRVUkVfVU5JQ09ERV9MSVRFUkFMUyA9IDB4MjAwMDAgIyB1bmljb2RlIHN0cmluZyBsaXRlcmFscworCitjbGFzcyBfRmVhdHVyZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9uYWxSZWxlYXNlLCBtYW5kYXRvcnlSZWxlYXNlLCBjb21waWxlcl9mbGFnKToKKyAgICAgICAgc2VsZi5vcHRpb25hbCA9IG9wdGlvbmFsUmVsZWFzZQorICAgICAgICBzZWxmLm1hbmRhdG9yeSA9IG1hbmRhdG9yeVJlbGVhc2UKKyAgICAgICAgc2VsZi5jb21waWxlcl9mbGFnID0gY29tcGlsZXJfZmxhZworCisgICAgZGVmIGdldE9wdGlvbmFsUmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBmZWF0dXJlIHdhcyByZWNvZ25pemVkLgorCisgICAgICAgIFRoaXMgaXMgYSA1LXR1cGxlLCBvZiB0aGUgc2FtZSBmb3JtIGFzIHN5cy52ZXJzaW9uX2luZm8uCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBzZWxmLm9wdGlvbmFsCisKKyAgICBkZWYgZ2V0TWFuZGF0b3J5UmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBmZWF0dXJlIHdpbGwgYmVjb21lIG1hbmRhdG9yeS4KKworICAgICAgICBUaGlzIGlzIGEgNS10dXBsZSwgb2YgdGhlIHNhbWUgZm9ybSBhcyBzeXMudmVyc2lvbl9pbmZvLCBvciwgaWYKKyAgICAgICAgdGhlIGZlYXR1cmUgd2FzIGRyb3BwZWQsIGlzIE5vbmUuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBzZWxmLm1hbmRhdG9yeQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIl9GZWF0dXJlIiArIHJlcHIoKHNlbGYub3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYW5kYXRvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlcl9mbGFnKSkKKworbmVzdGVkX3Njb3BlcyA9IF9GZWF0dXJlKCgyLCAxLCAwLCAiYmV0YSIsICAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMiwgMCwgImFscGhhIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ09fTkVTVEVEKQorCitnZW5lcmF0b3JzID0gX0ZlYXR1cmUoKDIsIDIsIDAsICJhbHBoYSIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICgyLCAzLCAwLCAiZmluYWwiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBDT19HRU5FUkFUT1JfQUxMT1dFRCkKKworZGl2aXNpb24gPSBfRmVhdHVyZSgoMiwgMiwgMCwgImFscGhhIiwgMiksCisgICAgICAgICAgICAgICAgICAgICgzLCAwLCAwLCAiYWxwaGEiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX0RJVklTSU9OKQorCithYnNvbHV0ZV9pbXBvcnQgPSBfRmVhdHVyZSgoMiwgNSwgMCwgImFscGhhIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgMCwgMCwgImFscGhhIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDT19GVVRVUkVfQUJTT0xVVEVfSU1QT1JUKQorCit3aXRoX3N0YXRlbWVudCA9IF9GZWF0dXJlKCgyLCA1LCAwLCAiYWxwaGEiLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIDYsIDAsICJhbHBoYSIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQpCisKK3ByaW50X2Z1bmN0aW9uID0gX0ZlYXR1cmUoKDIsIDYsIDAsICJhbHBoYSIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgMCwgMCwgImFscGhhIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTikKKwordW5pY29kZV9saXRlcmFscyA9IF9GZWF0dXJlKCgyLCA2LCAwLCAiYWxwaGEiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgMCwgMCwgImFscGhhIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX1VOSUNPREVfTElURVJBTFMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19fZnV0dXJlX18ucHljIGIvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJhMGQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19fZnV0dXJlX18ucHlvIGIvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJhMGQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fX2Z1dHVyZV9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19fcGhlbGxvX18uZm9vLnB5IGIvbGliL3B5dGhvbjIuNy9fX3BoZWxsb19fLmZvby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg2MjNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fX3BoZWxsb19fLmZvby5weQpAQCAtMCwwICsxIEBACisjIFRoaXMgZmlsZSBleGlzdHMgYXMgYSBoZWxwZXIgZm9yIHRoZSB0ZXN0LnRlc3RfZnJvemVuIG1vZHVsZS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHljIGIvbGliL3B5dGhvbjIuNy9fX3BoZWxsb19fLmZvby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2MTJiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHlvIGIvbGliL3B5dGhvbjIuNy9fX3BoZWxsb19fLmZvby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2MTJiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX19waGVsbG9fXy5mb28ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX2FiY29sbC5weSBiL2xpYi9weXRob24yLjcvX2FiY29sbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDM4YWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fYWJjb2xsLnB5CkBAIC0wLDAgKzEsNjcxIEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoQUJDcykgZm9yIGNvbGxlY3Rpb25zLCBhY2NvcmRpbmcgdG8gUEVQIDMxMTkuCisKK0RPTidUIFVTRSBUSElTIE1PRFVMRSBESVJFQ1RMWSEgIFRoZSBjbGFzc2VzIGhlcmUgc2hvdWxkIGJlIGltcG9ydGVkCit2aWEgY29sbGVjdGlvbnM7IHRoZXkgYXJlIGRlZmluZWQgaGVyZSBvbmx5IHRvIGFsbGV2aWF0ZSBjZXJ0YWluCitib290c3RyYXBwaW5nIGlzc3Vlcy4gIFVuaXQgdGVzdHMgYXJlIGluIHRlc3RfY29sbGVjdGlvbnMuCisiIiIKKworZnJvbSBhYmMgaW1wb3J0IEFCQ01ldGEsIGFic3RyYWN0bWV0aG9kCitpbXBvcnQgc3lzCisKK19fYWxsX18gPSBbIkhhc2hhYmxlIiwgIkl0ZXJhYmxlIiwgIkl0ZXJhdG9yIiwKKyAgICAgICAgICAgIlNpemVkIiwgIkNvbnRhaW5lciIsICJDYWxsYWJsZSIsCisgICAgICAgICAgICJTZXQiLCAiTXV0YWJsZVNldCIsCisgICAgICAgICAgICJNYXBwaW5nIiwgIk11dGFibGVNYXBwaW5nIiwKKyAgICAgICAgICAgIk1hcHBpbmdWaWV3IiwgIktleXNWaWV3IiwgIkl0ZW1zVmlldyIsICJWYWx1ZXNWaWV3IiwKKyAgICAgICAgICAgIlNlcXVlbmNlIiwgIk11dGFibGVTZXF1ZW5jZSIsCisgICAgICAgICAgIF0KKworIyMjIE9ORS1UUklDSyBQT05JRVMgIyMjCisKK2RlZiBfaGFzYXR0cihDLCBhdHRyKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBhbnkoYXR0ciBpbiBCLl9fZGljdF9fIGZvciBCIGluIEMuX19tcm9fXykKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICMgT2xkLXN0eWxlIGNsYXNzCisgICAgICAgIHJldHVybiBoYXNhdHRyKEMsIGF0dHIpCisKKworY2xhc3MgSGFzaGFibGU6CisgICAgX19tZXRhY2xhc3NfXyA9IEFCQ01ldGEKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBIYXNoYWJsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgQiBpbiBDLl9fbXJvX186CisgICAgICAgICAgICAgICAgICAgIGlmICJfX2hhc2hfXyIgaW4gQi5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIEIuX19kaWN0X19bIl9faGFzaF9fIl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBPbGQtc3R5bGUgY2xhc3MKKyAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKEMsICJfX2hhc2hfXyIsIE5vbmUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworCitjbGFzcyBJdGVyYWJsZToKKyAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICB3aGlsZSBGYWxzZToKKyAgICAgICAgICAgIHlpZWxkIE5vbmUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBJdGVyYWJsZToKKyAgICAgICAgICAgIGlmIF9oYXNhdHRyKEMsICJfX2l0ZXJfXyIpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCitJdGVyYWJsZS5yZWdpc3RlcihzdHIpCisKKworY2xhc3MgSXRlcmF0b3IoSXRlcmFibGUpOgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICdSZXR1cm4gdGhlIG5leHQgaXRlbSBmcm9tIHRoZSBpdGVyYXRvci4gV2hlbiBleGhhdXN0ZWQsIHJhaXNlIFN0b3BJdGVyYXRpb24nCisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBJdGVyYXRvcjoKKyAgICAgICAgICAgIGlmIF9oYXNhdHRyKEMsICJuZXh0IikgYW5kIF9oYXNhdHRyKEMsICJfX2l0ZXJfXyIpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisKK2NsYXNzIFNpemVkOgorICAgIF9fbWV0YWNsYXNzX18gPSBBQkNNZXRhCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBTaXplZDoKKyAgICAgICAgICAgIGlmIF9oYXNhdHRyKEMsICJfX2xlbl9fIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKworY2xhc3MgQ29udGFpbmVyOgorICAgIF9fbWV0YWNsYXNzX18gPSBBQkNNZXRhCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHgpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfX3N1YmNsYXNzaG9va19fKGNscywgQyk6CisgICAgICAgIGlmIGNscyBpcyBDb250YWluZXI6CisgICAgICAgICAgICBpZiBfaGFzYXR0cihDLCAiX19jb250YWluc19fIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKworY2xhc3MgQ2FsbGFibGU6CisgICAgX19tZXRhY2xhc3NfXyA9IEFCQ01ldGEKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX19zdWJjbGFzc2hvb2tfXyhjbHMsIEMpOgorICAgICAgICBpZiBjbHMgaXMgQ2FsbGFibGU6CisgICAgICAgICAgICBpZiBfaGFzYXR0cihDLCAiX19jYWxsX18iKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworCisjIyMgU0VUUyAjIyMKKworCitjbGFzcyBTZXQoU2l6ZWQsIEl0ZXJhYmxlLCBDb250YWluZXIpOgorICAgICIiIkEgc2V0IGlzIGEgZmluaXRlLCBpdGVyYWJsZSBjb250YWluZXIuCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbmNyZXRlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIG9mIGFsbAorICAgIG1ldGhvZHMgZXhjZXB0IGZvciBfX2NvbnRhaW5zX18sIF9faXRlcl9fIGFuZCBfX2xlbl9fLgorCisgICAgVG8gb3ZlcnJpZGUgdGhlIGNvbXBhcmlzb25zIChwcmVzdW1hYmx5IGZvciBzcGVlZCwgYXMgdGhlCisgICAgc2VtYW50aWNzIGFyZSBmaXhlZCksIGFsbCB5b3UgaGF2ZSB0byBkbyBpcyByZWRlZmluZSBfX2xlX18gYW5kCisgICAgdGhlbiB0aGUgb3RoZXIgb3BlcmF0aW9ucyB3aWxsIGF1dG9tYXRpY2FsbHkgZm9sbG93IHN1aXQuCisgICAgIiIiCisKKyAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNldCk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgaWYgbGVuKHNlbGYpID4gbGVuKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgZWxlbSBpbiBzZWxmOgorICAgICAgICAgICAgaWYgZWxlbSBub3QgaW4gb3RoZXI6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNldCk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmKSA8IGxlbihvdGhlcikgYW5kIHNlbGYuX19sZV9fKG90aGVyKQorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBvdGhlciA8IHNlbGYKKworICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2V0KToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gb3RoZXIgPD0gc2VsZgorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBTZXQpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBsZW4oc2VsZikgPT0gbGVuKG90aGVyKSBhbmQgc2VsZi5fX2xlX18ob3RoZXIpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZnJvbV9pdGVyYWJsZShjbHMsIGl0KToKKyAgICAgICAgJycnQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBmcm9tIGFueSBpdGVyYWJsZSBpbnB1dC4KKworICAgICAgICBNdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZSBjbGFzcyBjb25zdHJ1Y3RvciBzaWduYXR1cmUKKyAgICAgICAgZG9lcyBub3QgYWNjZXB0IGFuIGl0ZXJhYmxlIGZvciBhbiBpbnB1dC4KKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBjbHMoaXQpCisKKyAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBJdGVyYWJsZSk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Zyb21faXRlcmFibGUodmFsdWUgZm9yIHZhbHVlIGluIG90aGVyIGlmIHZhbHVlIGluIHNlbGYpCisKKyAgICBkZWYgaXNkaXNqb2ludChzZWxmLCBvdGhlcik6CisgICAgICAgICdSZXR1cm4gVHJ1ZSBpZiB0d28gc2V0cyBoYXZlIGEgbnVsbCBpbnRlcnNlY3Rpb24uJworICAgICAgICBmb3IgdmFsdWUgaW4gb3RoZXI6CisgICAgICAgICAgICBpZiB2YWx1ZSBpbiBzZWxmOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBJdGVyYWJsZSk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgY2hhaW4gPSAoZSBmb3IgcyBpbiAoc2VsZiwgb3RoZXIpIGZvciBlIGluIHMpCisgICAgICAgIHJldHVybiBzZWxmLl9mcm9tX2l0ZXJhYmxlKGNoYWluKQorCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgU2V0KToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBJdGVyYWJsZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgICAgICBvdGhlciA9IHNlbGYuX2Zyb21faXRlcmFibGUob3RoZXIpCisgICAgICAgIHJldHVybiBzZWxmLl9mcm9tX2l0ZXJhYmxlKHZhbHVlIGZvciB2YWx1ZSBpbiBzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHZhbHVlIG5vdCBpbiBvdGhlcikKKworICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFNldCk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgSXRlcmFibGUpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgb3RoZXIgPSBzZWxmLl9mcm9tX2l0ZXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gKHNlbGYgLSBvdGhlcikgfCAob3RoZXIgLSBzZWxmKQorCisgICAgIyBTZXRzIGFyZSBub3QgaGFzaGFibGUgYnkgZGVmYXVsdCwgYnV0IHN1YmNsYXNzZXMgY2FuIGNoYW5nZSB0aGlzCisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgX2hhc2goc2VsZik6CisgICAgICAgICIiIkNvbXB1dGUgdGhlIGhhc2ggdmFsdWUgb2YgYSBzZXQuCisKKyAgICAgICAgTm90ZSB0aGF0IHdlIGRvbid0IGRlZmluZSBfX2hhc2hfXzogbm90IGFsbCBzZXRzIGFyZSBoYXNoYWJsZS4KKyAgICAgICAgQnV0IGlmIHlvdSBkZWZpbmUgYSBoYXNoYWJsZSBzZXQgdHlwZSwgaXRzIF9faGFzaF9fIHNob3VsZAorICAgICAgICBjYWxsIHRoaXMgZnVuY3Rpb24uCisKKyAgICAgICAgVGhpcyBtdXN0IGJlIGNvbXBhdGlibGUgX19lcV9fLgorCisgICAgICAgIEFsbCBzZXRzIG91Z2h0IHRvIGNvbXBhcmUgZXF1YWwgaWYgdGhleSBjb250YWluIHRoZSBzYW1lCisgICAgICAgIGVsZW1lbnRzLCByZWdhcmRsZXNzIG9mIGhvdyB0aGV5IGFyZSBpbXBsZW1lbnRlZCwgYW5kCisgICAgICAgIHJlZ2FyZGxlc3Mgb2YgdGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50czsgc28gdGhlcmUncyBub3QgbXVjaAorICAgICAgICBmcmVlZG9tIGZvciBfX2VxX18gb3IgX19oYXNoX18uICBXZSBtYXRjaCB0aGUgYWxnb3JpdGhtIHVzZWQKKyAgICAgICAgYnkgdGhlIGJ1aWx0LWluIGZyb3plbnNldCB0eXBlLgorICAgICAgICAiIiIKKyAgICAgICAgTUFYID0gc3lzLm1heGludAorICAgICAgICBNQVNLID0gMiAqIE1BWCArIDEKKyAgICAgICAgbiA9IGxlbihzZWxmKQorICAgICAgICBoID0gMTkyNzg2ODIzNyAqIChuICsgMSkKKyAgICAgICAgaCAmPSBNQVNLCisgICAgICAgIGZvciB4IGluIHNlbGY6CisgICAgICAgICAgICBoeCA9IGhhc2goeCkKKyAgICAgICAgICAgIGggXj0gKGh4IF4gKGh4IDw8IDE2KSBeIDg5ODY5NzQ3KSAgKiAzNjQ0Nzk4MTY3CisgICAgICAgICAgICBoICY9IE1BU0sKKyAgICAgICAgaCA9IGggKiA2OTA2OSArIDkwNzEzMzkyMworICAgICAgICBoICY9IE1BU0sKKyAgICAgICAgaWYgaCA+IE1BWDoKKyAgICAgICAgICAgIGggLT0gTUFTSyArIDEKKyAgICAgICAgaWYgaCA9PSAtMToKKyAgICAgICAgICAgIGggPSA1OTA5MjM3MTMKKyAgICAgICAgcmV0dXJuIGgKKworU2V0LnJlZ2lzdGVyKGZyb3plbnNldCkKKworCitjbGFzcyBNdXRhYmxlU2V0KFNldCk6CisgICAgIiIiQSBtdXRhYmxlIHNldCBpcyBhIGZpbml0ZSwgaXRlcmFibGUgY29udGFpbmVyLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBjb25jcmV0ZSBnZW5lcmljIGltcGxlbWVudGF0aW9ucyBvZiBhbGwKKyAgICBtZXRob2RzIGV4Y2VwdCBmb3IgX19jb250YWluc19fLCBfX2l0ZXJfXywgX19sZW5fXywKKyAgICBhZGQoKSwgYW5kIGRpc2NhcmQoKS4KKworICAgIFRvIG92ZXJyaWRlIHRoZSBjb21wYXJpc29ucyAocHJlc3VtYWJseSBmb3Igc3BlZWQsIGFzIHRoZQorICAgIHNlbWFudGljcyBhcmUgZml4ZWQpLCBhbGwgeW91IGhhdmUgdG8gZG8gaXMgcmVkZWZpbmUgX19sZV9fIGFuZAorICAgIHRoZW4gdGhlIG90aGVyIG9wZXJhdGlvbnMgd2lsbCBhdXRvbWF0aWNhbGx5IGZvbGxvdyBzdWl0LgorICAgICIiIgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIGFkZChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIkFkZCBhbiBlbGVtZW50LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgZGlzY2FyZChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIlJlbW92ZSBhbiBlbGVtZW50LiAgRG8gbm90IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBhYnNlbnQuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOgorICAgICAgICAiIiJSZW1vdmUgYW4gZWxlbWVudC4gSWYgbm90IGEgbWVtYmVyLCByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBpZiB2YWx1ZSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKHZhbHVlKQorICAgICAgICBzZWxmLmRpc2NhcmQodmFsdWUpCisKKyAgICBkZWYgcG9wKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHBvcHBlZCB2YWx1ZS4gIFJhaXNlIEtleUVycm9yIGlmIGVtcHR5LiIiIgorICAgICAgICBpdCA9IGl0ZXIoc2VsZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBuZXh0KGl0KQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgIHNlbGYuZGlzY2FyZCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICIiIlRoaXMgaXMgc2xvdyAoY3JlYXRlcyBOIG5ldyBpdGVyYXRvcnMhKSBidXQgZWZmZWN0aXZlLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYucG9wKCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9faW9yX18oc2VsZiwgaXQpOgorICAgICAgICBmb3IgdmFsdWUgaW4gaXQ6CisgICAgICAgICAgICBzZWxmLmFkZCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2lhbmRfXyhzZWxmLCBpdCk6CisgICAgICAgIGZvciB2YWx1ZSBpbiAoc2VsZiAtIGl0KToKKyAgICAgICAgICAgIHNlbGYuZGlzY2FyZCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2l4b3JfXyhzZWxmLCBpdCk6CisgICAgICAgIGlmIGl0IGlzIHNlbGY6CisgICAgICAgICAgICBzZWxmLmNsZWFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0LCBTZXQpOgorICAgICAgICAgICAgICAgIGl0ID0gc2VsZi5fZnJvbV9pdGVyYWJsZShpdCkKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBpdDoKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpbiBzZWxmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc2NhcmQodmFsdWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hZGQodmFsdWUpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19pc3ViX18oc2VsZiwgaXQpOgorICAgICAgICBpZiBpdCBpcyBzZWxmOgorICAgICAgICAgICAgc2VsZi5jbGVhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gaXQ6CisgICAgICAgICAgICAgICAgc2VsZi5kaXNjYXJkKHZhbHVlKQorICAgICAgICByZXR1cm4gc2VsZgorCitNdXRhYmxlU2V0LnJlZ2lzdGVyKHNldCkKKworCisjIyMgTUFQUElOR1MgIyMjCisKKworY2xhc3MgTWFwcGluZyhTaXplZCwgSXRlcmFibGUsIENvbnRhaW5lcik6CisKKyAgICAiIiJBIE1hcHBpbmcgaXMgYSBnZW5lcmljIGNvbnRhaW5lciBmb3IgYXNzb2NpYXRpbmcga2V5L3ZhbHVlCisgICAgcGFpcnMuCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbmNyZXRlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIG9mIGFsbAorICAgIG1ldGhvZHMgZXhjZXB0IGZvciBfX2dldGl0ZW1fXywgX19pdGVyX18sIGFuZCBfX2xlbl9fLgorCisgICAgIiIiCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmFpc2UgS2V5RXJyb3IKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAnRC5nZXQoa1ssZF0pIC0+IERba10gaWYgayBpbiBELCBlbHNlIGQuICBkIGRlZmF1bHRzIHRvIE5vbmUuJworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgaXRlcmtleXMoc2VsZik6CisgICAgICAgICdELml0ZXJrZXlzKCkgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cyBvZiBEJworICAgICAgICByZXR1cm4gaXRlcihzZWxmKQorCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgICdELml0ZXJ2YWx1ZXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSB2YWx1ZXMgb2YgRCcKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmOgorICAgICAgICAgICAgeWllbGQgc2VsZltrZXldCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgorICAgICAgICAnRC5pdGVyaXRlbXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSAoa2V5LCB2YWx1ZSkgaXRlbXMgb2YgRCcKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmOgorICAgICAgICAgICAgeWllbGQgKGtleSwgc2VsZltrZXldKQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICJELmtleXMoKSAtPiBsaXN0IG9mIEQncyBrZXlzIgorICAgICAgICByZXR1cm4gbGlzdChzZWxmKQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAiRC5pdGVtcygpIC0+IGxpc3Qgb2YgRCdzIChrZXksIHZhbHVlKSBwYWlycywgYXMgMi10dXBsZXMiCisgICAgICAgIHJldHVybiBbKGtleSwgc2VsZltrZXldKSBmb3Iga2V5IGluIHNlbGZdCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAiRC52YWx1ZXMoKSAtPiBsaXN0IG9mIEQncyB2YWx1ZXMiCisgICAgICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZl0KKworICAgICMgTWFwcGluZ3MgYXJlIG5vdCBoYXNoYWJsZSBieSBkZWZhdWx0LCBidXQgc3ViY2xhc3NlcyBjYW4gY2hhbmdlIHRoaXMKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgTWFwcGluZyk6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIGRpY3Qoc2VsZi5pdGVtcygpKSA9PSBkaWN0KG90aGVyLml0ZW1zKCkpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgTWFwcGluZ1ZpZXcoU2l6ZWQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hcHBpbmcpOgorICAgICAgICBzZWxmLl9tYXBwaW5nID0gbWFwcGluZworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fbWFwcGluZykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICd7MC5fX2NsYXNzX18uX19uYW1lX199KHswLl9tYXBwaW5nIXJ9KScuZm9ybWF0KHNlbGYpCisKKworY2xhc3MgS2V5c1ZpZXcoTWFwcGluZ1ZpZXcsIFNldCk6CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2Zyb21faXRlcmFibGUoc2VsZiwgaXQpOgorICAgICAgICByZXR1cm4gc2V0KGl0KQorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX21hcHBpbmcKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9tYXBwaW5nOgorICAgICAgICAgICAgeWllbGQga2V5CisKKworY2xhc3MgSXRlbXNWaWV3KE1hcHBpbmdWaWV3LCBTZXQpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9mcm9tX2l0ZXJhYmxlKHNlbGYsIGl0KToKKyAgICAgICAgcmV0dXJuIHNldChpdCkKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaXRlbSk6CisgICAgICAgIGtleSwgdmFsdWUgPSBpdGVtCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHYgPSBzZWxmLl9tYXBwaW5nW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gdiA9PSB2YWx1ZQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX21hcHBpbmc6CisgICAgICAgICAgICB5aWVsZCAoa2V5LCBzZWxmLl9tYXBwaW5nW2tleV0pCisKKworY2xhc3MgVmFsdWVzVmlldyhNYXBwaW5nVmlldyk6CisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9tYXBwaW5nOgorICAgICAgICAgICAgaWYgdmFsdWUgPT0gc2VsZi5fbWFwcGluZ1trZXldOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX21hcHBpbmc6CisgICAgICAgICAgICB5aWVsZCBzZWxmLl9tYXBwaW5nW2tleV0KKworCitjbGFzcyBNdXRhYmxlTWFwcGluZyhNYXBwaW5nKToKKworICAgICIiIkEgTXV0YWJsZU1hcHBpbmcgaXMgYSBnZW5lcmljIGNvbnRhaW5lciBmb3IgYXNzb2NpYXRpbmcKKyAgICBrZXkvdmFsdWUgcGFpcnMuCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGNvbmNyZXRlIGdlbmVyaWMgaW1wbGVtZW50YXRpb25zIG9mIGFsbAorICAgIG1ldGhvZHMgZXhjZXB0IGZvciBfX2dldGl0ZW1fXywgX19zZXRpdGVtX18sIF9fZGVsaXRlbV9fLAorICAgIF9faXRlcl9fLCBhbmQgX19sZW5fXy4KKworICAgICIiIgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICByYWlzZSBLZXlFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJhaXNlIEtleUVycm9yCisKKyAgICBfX21hcmtlciA9IG9iamVjdCgpCisKKyAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6CisgICAgICAgICcnJ0QucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlLgorICAgICAgICAgIElmIGtleSBpcyBub3QgZm91bmQsIGQgaXMgcmV0dXJuZWQgaWYgZ2l2ZW4sIG90aGVyd2lzZSBLZXlFcnJvciBpcyByYWlzZWQuCisgICAgICAgICcnJworICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBpZiBkZWZhdWx0IGlzIHNlbGYuX19tYXJrZXI6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWwgc2VsZltrZXldCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBwb3BpdGVtKHNlbGYpOgorICAgICAgICAnJydELnBvcGl0ZW0oKSAtPiAoaywgdiksIHJlbW92ZSBhbmQgcmV0dXJuIHNvbWUgKGtleSwgdmFsdWUpIHBhaXIKKyAgICAgICAgICAgYXMgYSAyLXR1cGxlOyBidXQgcmFpc2UgS2V5RXJyb3IgaWYgRCBpcyBlbXB0eS4KKyAgICAgICAgJycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtleSA9IG5leHQoaXRlcihzZWxmKSkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQorICAgICAgICBkZWwgc2VsZltrZXldCisgICAgICAgIHJldHVybiBrZXksIHZhbHVlCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICdELmNsZWFyKCkgLT4gTm9uZS4gIFJlbW92ZSBhbGwgaXRlbXMgZnJvbSBELicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnBvcGl0ZW0oKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdXBkYXRlKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICAnJycgRC51cGRhdGUoW0UsIF0qKkYpIC0+IE5vbmUuICBVcGRhdGUgRCBmcm9tIG1hcHBpbmcvaXRlcmFibGUgRSBhbmQgRi4KKyAgICAgICAgICAgIElmIEUgcHJlc2VudCBhbmQgaGFzIGEgLmtleXMoKSBtZXRob2QsIGRvZXM6ICAgICBmb3IgayBpbiBFOiBEW2tdID0gRVtrXQorICAgICAgICAgICAgSWYgRSBwcmVzZW50IGFuZCBsYWNrcyAua2V5cygpIG1ldGhvZCwgZG9lczogICAgIGZvciAoaywgdikgaW4gRTogRFtrXSA9IHYKKyAgICAgICAgICAgIEluIGVpdGhlciBjYXNlLCB0aGlzIGlzIGZvbGxvd2VkIGJ5OiBmb3IgaywgdiBpbiBGLml0ZW1zKCk6IERba10gPSB2CisgICAgICAgICcnJworICAgICAgICBpZiBsZW4oYXJncykgPiAyOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ1cGRhdGUoKSB0YWtlcyBhdCBtb3N0IDIgcG9zaXRpb25hbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZ3VtZW50cyAoe30gZ2l2ZW4pIi5mb3JtYXQobGVuKGFyZ3MpKSkKKyAgICAgICAgZWxpZiBub3QgYXJnczoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidXBkYXRlKCkgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudCAoMCBnaXZlbikiKQorICAgICAgICBzZWxmID0gYXJnc1swXQorICAgICAgICBvdGhlciA9IGFyZ3NbMV0gaWYgbGVuKGFyZ3MpID49IDIgZWxzZSAoKQorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIE1hcHBpbmcpOgorICAgICAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKKyAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCisgICAgICAgIGVsaWYgaGFzYXR0cihvdGhlciwgImtleXMiKToKKyAgICAgICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgorICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgorICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGt3ZHMuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCisKKyAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICdELnNldGRlZmF1bHQoa1ssZF0pIC0+IEQuZ2V0KGssZCksIGFsc28gc2V0IERba109ZCBpZiBrIG5vdCBpbiBEJworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZltrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IGRlZmF1bHQKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworTXV0YWJsZU1hcHBpbmcucmVnaXN0ZXIoZGljdCkKKworCisjIyMgU0VRVUVOQ0VTICMjIworCisKK2NsYXNzIFNlcXVlbmNlKFNpemVkLCBJdGVyYWJsZSwgQ29udGFpbmVyKToKKyAgICAiIiJBbGwgdGhlIG9wZXJhdGlvbnMgb24gYSByZWFkLW9ubHkgc2VxdWVuY2UuCisKKyAgICBDb25jcmV0ZSBzdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgX19uZXdfXyBvciBfX2luaXRfXywKKyAgICBfX2dldGl0ZW1fXywgYW5kIF9fbGVuX18uCisgICAgIiIiCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGkgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdiA9IHNlbGZbaV0KKyAgICAgICAgICAgICAgICB5aWVsZCB2CisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgZm9yIHYgaW4gc2VsZjoKKyAgICAgICAgICAgIGlmIHYgPT0gdmFsdWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19yZXZlcnNlZF9fKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZikpKToKKyAgICAgICAgICAgIHlpZWxkIHNlbGZbaV0KKworICAgIGRlZiBpbmRleChzZWxmLCB2YWx1ZSk6CisgICAgICAgICcnJ1MuaW5kZXgodmFsdWUpIC0+IGludGVnZXIgLS0gcmV0dXJuIGZpcnN0IGluZGV4IG9mIHZhbHVlLgorICAgICAgICAgICBSYWlzZXMgVmFsdWVFcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHByZXNlbnQuCisgICAgICAgICcnJworICAgICAgICBmb3IgaSwgdiBpbiBlbnVtZXJhdGUoc2VsZik6CisgICAgICAgICAgICBpZiB2ID09IHZhbHVlOgorICAgICAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKworICAgIGRlZiBjb3VudChzZWxmLCB2YWx1ZSk6CisgICAgICAgICdTLmNvdW50KHZhbHVlKSAtPiBpbnRlZ2VyIC0tIHJldHVybiBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgb2YgdmFsdWUnCisgICAgICAgIHJldHVybiBzdW0oMSBmb3IgdiBpbiBzZWxmIGlmIHYgPT0gdmFsdWUpCisKK1NlcXVlbmNlLnJlZ2lzdGVyKHR1cGxlKQorU2VxdWVuY2UucmVnaXN0ZXIoYmFzZXN0cmluZykKK1NlcXVlbmNlLnJlZ2lzdGVyKGJ1ZmZlcikKK1NlcXVlbmNlLnJlZ2lzdGVyKHhyYW5nZSkKKworCitjbGFzcyBNdXRhYmxlU2VxdWVuY2UoU2VxdWVuY2UpOgorCisgICAgIiIiQWxsIHRoZSBvcGVyYXRpb25zIG9uIGEgcmVhZC1vbmx5IHNlcXVlbmNlLgorCisgICAgQ29uY3JldGUgc3ViY2xhc3NlcyBtdXN0IHByb3ZpZGUgX19uZXdfXyBvciBfX2luaXRfXywKKyAgICBfX2dldGl0ZW1fXywgX19zZXRpdGVtX18sIF9fZGVsaXRlbV9fLCBfX2xlbl9fLCBhbmQgaW5zZXJ0KCkuCisKKyAgICAiIiIKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBpbmRleCwgdmFsdWUpOgorICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCB2YWx1ZSk6CisgICAgICAgICdTLmluc2VydChpbmRleCwgb2JqZWN0KSAtLSBpbnNlcnQgb2JqZWN0IGJlZm9yZSBpbmRleCcKKyAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgZGVmIGFwcGVuZChzZWxmLCB2YWx1ZSk6CisgICAgICAgICdTLmFwcGVuZChvYmplY3QpIC0tIGFwcGVuZCBvYmplY3QgdG8gdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UnCisgICAgICAgIHNlbGYuaW5zZXJ0KGxlbihzZWxmKSwgdmFsdWUpCisKKyAgICBkZWYgcmV2ZXJzZShzZWxmKToKKyAgICAgICAgJ1MucmV2ZXJzZSgpIC0tIHJldmVyc2UgKklOIFBMQUNFKicKKyAgICAgICAgbiA9IGxlbihzZWxmKQorICAgICAgICBmb3IgaSBpbiByYW5nZShuLy8yKToKKyAgICAgICAgICAgIHNlbGZbaV0sIHNlbGZbbi1pLTFdID0gc2VsZltuLWktMV0sIHNlbGZbaV0KKworICAgIGRlZiBleHRlbmQoc2VsZiwgdmFsdWVzKToKKyAgICAgICAgJ1MuZXh0ZW5kKGl0ZXJhYmxlKSAtLSBleHRlbmQgc2VxdWVuY2UgYnkgYXBwZW5kaW5nIGVsZW1lbnRzIGZyb20gdGhlIGl0ZXJhYmxlJworICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFwcGVuZCh2KQorCisgICAgZGVmIHBvcChzZWxmLCBpbmRleD0tMSk6CisgICAgICAgICcnJ1MucG9wKFtpbmRleF0pIC0+IGl0ZW0gLS0gcmVtb3ZlIGFuZCByZXR1cm4gaXRlbSBhdCBpbmRleCAoZGVmYXVsdCBsYXN0KS4KKyAgICAgICAgICAgUmFpc2UgSW5kZXhFcnJvciBpZiBsaXN0IGlzIGVtcHR5IG9yIGluZGV4IGlzIG91dCBvZiByYW5nZS4KKyAgICAgICAgJycnCisgICAgICAgIHYgPSBzZWxmW2luZGV4XQorICAgICAgICBkZWwgc2VsZltpbmRleF0KKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsdWUpOgorICAgICAgICAnJydTLnJlbW92ZSh2YWx1ZSkgLS0gcmVtb3ZlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdmFsdWUuCisgICAgICAgICAgIFJhaXNlIFZhbHVlRXJyb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCBwcmVzZW50LgorICAgICAgICAnJycKKyAgICAgICAgZGVsIHNlbGZbc2VsZi5pbmRleCh2YWx1ZSldCisKKyAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsdWVzKToKKyAgICAgICAgc2VsZi5leHRlbmQodmFsdWVzKQorICAgICAgICByZXR1cm4gc2VsZgorCitNdXRhYmxlU2VxdWVuY2UucmVnaXN0ZXIobGlzdCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX2FiY29sbC5weWMgYi9saWIvcHl0aG9uMi43L19hYmNvbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjcyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19hYmNvbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX2FiY29sbC5weW8gYi9saWIvcHl0aG9uMi43L19hYmNvbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMjcyY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19hYmNvbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvX29zeF9zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy9fb3N4X3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlkYmRjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX29zeF9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsNDg4IEBACisiIiJTaGFyZWQgT1MgWCBzdXBwb3J0IGZ1bmN0aW9ucy4iIiIKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworX19hbGxfXyA9IFsKKyAgICAnY29tcGlsZXJfZml4dXAnLAorICAgICdjdXN0b21pemVfY29uZmlnX3ZhcnMnLAorICAgICdjdXN0b21pemVfY29tcGlsZXInLAorICAgICdnZXRfcGxhdGZvcm1fb3N4JywKK10KKworIyBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyB0aGF0IG1heSBjb250YWluIHVuaXZlcnNhbCBidWlsZCBmbGFncywKKyMgbGlrZSAiLWFyY2giIG9yICItaXNka3Jvb3QiLCB0aGF0IG1heSBuZWVkIGN1c3RvbWl6YXRpb24gZm9yCisjIHRoZSB1c2VyIGVudmlyb25tZW50CitfVU5JVkVSU0FMX0NPTkZJR19WQVJTID0gKCdDRkxBR1MnLCAnTERGTEFHUycsICdDUFBGTEFHUycsICdCQVNFQ0ZMQUdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQkxEU0hBUkVEJywgJ0xEU0hBUkVEJywgJ0NDJywgJ0NYWCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BZX0NGTEFHUycsICdQWV9MREZMQUdTJywgJ1BZX0NQUEZMQUdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUFlfQ09SRV9DRkxBR1MnKQorCisjIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzIHRoYXQgbWF5IGNvbnRhaW4gY29tcGlsZXIgY2FsbHMKK19DT01QSUxFUl9DT05GSUdfVkFSUyA9ICgnQkxEU0hBUkVEJywgJ0xEU0hBUkVEJywgJ0NDJywgJ0NYWCcpCisKKyMgcHJlZml4IGFkZGVkIHRvIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgbmFtZXMKK19JTklUUFJFID0gJ19PU1hfU1VQUE9SVF9JTklUSUFMXycKKworCitkZWYgX2ZpbmRfZXhlY3V0YWJsZShleGVjdXRhYmxlLCBwYXRoPU5vbmUpOgorICAgICIiIlRyaWVzIHRvIGZpbmQgJ2V4ZWN1dGFibGUnIGluIHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJ3BhdGgnLgorCisgICAgQSBzdHJpbmcgbGlzdGluZyBkaXJlY3RvcmllcyBzZXBhcmF0ZWQgYnkgJ29zLnBhdGhzZXAnOyBkZWZhdWx0cyB0bworICAgIG9zLmVudmlyb25bJ1BBVEgnXS4gIFJldHVybnMgdGhlIGNvbXBsZXRlIGZpbGVuYW1lIG9yIE5vbmUgaWYgbm90IGZvdW5kLgorICAgICIiIgorICAgIGlmIHBhdGggaXMgTm9uZToKKyAgICAgICAgcGF0aCA9IG9zLmVudmlyb25bJ1BBVEgnXQorCisgICAgcGF0aHMgPSBwYXRoLnNwbGl0KG9zLnBhdGhzZXApCisgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChleGVjdXRhYmxlKQorCisgICAgaWYgKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIG9yIG9zLm5hbWUgPT0gJ29zMicpIGFuZCAoZXh0ICE9ICcuZXhlJyk6CisgICAgICAgIGV4ZWN1dGFibGUgPSBleGVjdXRhYmxlICsgJy5leGUnCisKKyAgICBpZiBub3Qgb3MucGF0aC5pc2ZpbGUoZXhlY3V0YWJsZSk6CisgICAgICAgIGZvciBwIGluIHBhdGhzOgorICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihwLCBleGVjdXRhYmxlKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZik6CisgICAgICAgICAgICAgICAgIyB0aGUgZmlsZSBleGlzdHMsIHdlIGhhdmUgYSBzaG90IGF0IHNwYXduIHdvcmtpbmcKKyAgICAgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBleGVjdXRhYmxlCisKKworZGVmIF9yZWFkX291dHB1dChjb21tYW5kc3RyaW5nKToKKyAgICAiIiJPdXRwdXQgZnJvbSBzdWNjZXNmdWwgY29tbWFuZCBleGVjdXRpb24gb3IgTm9uZSIiIgorICAgICMgU2ltaWxhciB0byBvcy5wb3Blbihjb21tYW5kc3RyaW5nLCAiciIpLnJlYWQoKSwKKyAgICAjIGJ1dCB3aXRob3V0IGFjdHVhbGx5IHVzaW5nIG9zLnBvcGVuIGJlY2F1c2UgdGhhdAorICAgICMgZnVuY3Rpb24gaXMgbm90IHVzYWJsZSBkdXJpbmcgcHl0aG9uIGJvb3RzdHJhcC4KKyAgICAjIHRlbXBmaWxlIGlzIGFsc28gbm90IGF2YWlsYWJsZSB0aGVuLgorICAgIGltcG9ydCBjb250ZXh0bGliCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICAgICAgZnAgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgZnAgPSBvcGVuKCIvdG1wL19vc3hfc3VwcG9ydC4lcyIlKAorICAgICAgICAgICAgb3MuZ2V0cGlkKCksKSwgIncrYiIpCisKKyAgICB3aXRoIGNvbnRleHRsaWIuY2xvc2luZyhmcCkgYXMgZnA6CisgICAgICAgIGNtZCA9ICIlcyAyPi9kZXYvbnVsbCA+JyVzJyIgJSAoY29tbWFuZHN0cmluZywgZnAubmFtZSkKKyAgICAgICAgcmV0dXJuIGZwLnJlYWQoKS5kZWNvZGUoJ3V0Zi04Jykuc3RyaXAoKSBpZiBub3Qgb3Muc3lzdGVtKGNtZCkgZWxzZSBOb25lCisKKworZGVmIF9maW5kX2J1aWxkX3Rvb2wodG9vbG5hbWUpOgorICAgICIiIkZpbmQgYSBidWlsZCB0b29sIG9uIGN1cnJlbnQgcGF0aCBvciB1c2luZyB4Y3J1biIiIgorICAgIHJldHVybiAoX2ZpbmRfZXhlY3V0YWJsZSh0b29sbmFtZSkKKyAgICAgICAgICAgICAgICBvciBfcmVhZF9vdXRwdXQoIi91c3IvYmluL3hjcnVuIC1maW5kICVzIiAlICh0b29sbmFtZSwpKQorICAgICAgICAgICAgICAgIG9yICcnCisgICAgICAgICAgICApCisKK19TWVNURU1fVkVSU0lPTiA9IE5vbmUKKworZGVmIF9nZXRfc3lzdGVtX3ZlcnNpb24oKToKKyAgICAiIiJSZXR1cm4gdGhlIE9TIFggc3lzdGVtIHZlcnNpb24gYXMgYSBzdHJpbmciIiIKKyAgICAjIFJlYWRpbmcgdGhpcyBwbGlzdCBpcyBhIGRvY3VtZW50ZWQgd2F5IHRvIGdldCB0aGUgc3lzdGVtCisgICAgIyB2ZXJzaW9uIChzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBHZXN0YWx0IE1hbmFnZXIpCisgICAgIyBXZSBhdm9pZCB1c2luZyBwbGF0Zm9ybS5tYWNfdmVyIHRvIGF2b2lkIHBvc3NpYmxlIGJvb3RzdHJhcCBpc3N1ZXMgZHVyaW5nCisgICAgIyB0aGUgYnVpbGQgb2YgUHl0aG9uIGl0c2VsZiAoZGlzdHV0aWxzIGlzIHVzZWQgdG8gYnVpbGQgc3RhbmRhcmQgbGlicmFyeQorICAgICMgZXh0ZW5zaW9ucykuCisKKyAgICBnbG9iYWwgX1NZU1RFTV9WRVJTSU9OCisKKyAgICBpZiBfU1lTVEVNX1ZFUlNJT04gaXMgTm9uZToKKyAgICAgICAgX1NZU1RFTV9WRVJTSU9OID0gJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oJy9TeXN0ZW0vTGlicmFyeS9Db3JlU2VydmljZXMvU3lzdGVtVmVyc2lvbi5wbGlzdCcpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgIyBXZSdyZSBvbiBhIHBsYWluIGRhcndpbiBib3gsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdAorICAgICAgICAgICAgIyBiZWhhdmlvdXIuCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbSA9IHJlLnNlYXJjaChyJzxrZXk+UHJvZHVjdFVzZXJWaXNpYmxlVmVyc2lvbjwva2V5PlxzKicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInPHN0cmluZz4oLio/KTwvc3RyaW5nPicsIGYucmVhZCgpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgX1NZU1RFTV9WRVJTSU9OID0gJy4nLmpvaW4obS5ncm91cCgxKS5zcGxpdCgnLicpWzoyXSkKKyAgICAgICAgICAgICMgZWxzZTogZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGJlaGF2aW91cgorCisgICAgcmV0dXJuIF9TWVNURU1fVkVSU0lPTgorCitkZWYgX3JlbW92ZV9vcmlnaW5hbF92YWx1ZXMoX2NvbmZpZ192YXJzKToKKyAgICAiIiJSZW1vdmUgb3JpZ2luYWwgdW5tb2RpZmllZCB2YWx1ZXMgZm9yIHRlc3RpbmciIiIKKyAgICAjIFRoaXMgaXMgbmVlZGVkIGZvciBoaWdoZXItbGV2ZWwgY3Jvc3MtcGxhdGZvcm0gdGVzdHMgb2YgZ2V0X3BsYXRmb3JtLgorICAgIGZvciBrIGluIGxpc3QoX2NvbmZpZ192YXJzKToKKyAgICAgICAgaWYgay5zdGFydHN3aXRoKF9JTklUUFJFKToKKyAgICAgICAgICAgIGRlbCBfY29uZmlnX3ZhcnNba10KKworZGVmIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIG5ld3ZhbHVlKToKKyAgICAiIiJTYXZlIG1vZGlmaWVkIGFuZCBvcmlnaW5hbCB1bm1vZGlmaWVkIHZhbHVlIG9mIGNvbmZpZ3VyYXRpb24gdmFyIiIiCisKKyAgICBvbGR2YWx1ZSA9IF9jb25maWdfdmFycy5nZXQoY3YsICcnKQorICAgIGlmIChvbGR2YWx1ZSAhPSBuZXd2YWx1ZSkgYW5kIChfSU5JVFBSRSArIGN2IG5vdCBpbiBfY29uZmlnX3ZhcnMpOgorICAgICAgICBfY29uZmlnX3ZhcnNbX0lOSVRQUkUgKyBjdl0gPSBvbGR2YWx1ZQorICAgIF9jb25maWdfdmFyc1tjdl0gPSBuZXd2YWx1ZQorCitkZWYgX3N1cHBvcnRzX3VuaXZlcnNhbF9idWlsZHMoKToKKyAgICAiIiJSZXR1cm5zIFRydWUgaWYgdW5pdmVyc2FsIGJ1aWxkcyBhcmUgc3VwcG9ydGVkIG9uIHRoaXMgc3lzdGVtIiIiCisgICAgIyBBcyBhbiBhcHByb3hpbWF0aW9uLCB3ZSBhc3N1bWUgdGhhdCBpZiB3ZSBhcmUgcnVubmluZyBvbiAxMC40IG9yIGFib3ZlLAorICAgICMgdGhlbiB3ZSBhcmUgcnVubmluZyB3aXRoIGFuIFhjb2RlIGVudmlyb25tZW50IHRoYXQgc3VwcG9ydHMgdW5pdmVyc2FsCisgICAgIyBidWlsZHMsIGluIHBhcnRpY3VsYXIgLWlzeXNyb290IGFuZCAtYXJjaCBhcmd1bWVudHMgdG8gdGhlIGNvbXBpbGVyLiBUaGlzCisgICAgIyBpcyBpbiBzdXBwb3J0IG9mIGFsbG93aW5nIDEwLjQgdW5pdmVyc2FsIGJ1aWxkcyB0byBydW4gb24gMTAuMy54IHN5c3RlbXMuCisKKyAgICBvc3hfdmVyc2lvbiA9IF9nZXRfc3lzdGVtX3ZlcnNpb24oKQorICAgIGlmIG9zeF92ZXJzaW9uOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvc3hfdmVyc2lvbiA9IHR1cGxlKGludChpKSBmb3IgaSBpbiBvc3hfdmVyc2lvbi5zcGxpdCgnLicpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIG9zeF92ZXJzaW9uID0gJycKKyAgICByZXR1cm4gYm9vbChvc3hfdmVyc2lvbiA+PSAoMTAsIDQpKSBpZiBvc3hfdmVyc2lvbiBlbHNlIEZhbHNlCisKKworZGVmIF9maW5kX2FwcHJvcHJpYXRlX2NvbXBpbGVyKF9jb25maWdfdmFycyk6CisgICAgIiIiRmluZCBhcHByb3ByaWF0ZSBDIGNvbXBpbGVyIGZvciBleHRlbnNpb24gbW9kdWxlIGJ1aWxkcyIiIgorCisgICAgIyBJc3N1ZSAjMTM1OTA6CisgICAgIyAgICBUaGUgT1NYIGxvY2F0aW9uIGZvciB0aGUgY29tcGlsZXIgdmFyaWVzIGJldHdlZW4gT1NYCisgICAgIyAgICAob3IgcmF0aGVyIFhjb2RlKSByZWxlYXNlcy4gIFdpdGggb2xkZXIgcmVsZWFzZXMgKHVwLXRvIDEwLjUpCisgICAgIyAgICB0aGUgY29tcGlsZXIgaXMgaW4gL3Vzci9iaW4sIHdpdGggbmV3ZXIgcmVsZWFzZXMgdGhlIGNvbXBpbGVyCisgICAgIyAgICBjYW4gb25seSBiZSBmb3VuZCBpbnNpZGUgWGNvZGUuYXBwIGlmIHRoZSAiQ29tbWFuZCBMaW5lIFRvb2xzIgorICAgICMgICAgYXJlIG5vdCBpbnN0YWxsZWQuCisgICAgIworICAgICMgICAgRnV0aGVybW9yZSwgdGhlIGNvbXBpbGVyIHRoYXQgY2FuIGJlIHVzZWQgdmFyaWVzIGJldHdlZW4KKyAgICAjICAgIFhjb2RlIHJlbGVhc2VzLiBVcHRvIFhjb2RlIDQgaXQgd2FzIHBvc3NpYmxlIHRvIHVzZSAnZ2NjLTQuMicKKyAgICAjICAgIGFzIHRoZSBjb21waWxlciwgYWZ0ZXIgdGhhdCAnY2xhbmcnIHNob3VsZCBiZSB1c2VkIGJlY2F1c2UKKyAgICAjICAgIGdjYy00LjIgaXMgZWl0aGVyIG5vdCBwcmVzZW50LCBvciBhIGNvcHkgb2YgJ2xsdm0tZ2NjJyB0aGF0CisgICAgIyAgICBtaXNjb21waWxlcyBQeXRob24uCisKKyAgICAjIHNraXAgY2hlY2tzIGlmIHRoZSBjb21waWxlciB3YXMgb3ZlcnJpZGVuIHdpdGggYSBDQyBlbnYgdmFyaWFibGUKKyAgICBpZiAnQ0MnIGluIG9zLmVudmlyb246CisgICAgICAgIHJldHVybiBfY29uZmlnX3ZhcnMKKworICAgICMgVGhlIENDIGNvbmZpZyB2YXIgbWlnaHQgY29udGFpbiBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAgICAjIElnbm9yZSB0aGVtIHdoaWxlIHNlYXJjaGluZy4KKyAgICBjYyA9IG9sZGNjID0gX2NvbmZpZ192YXJzWydDQyddLnNwbGl0KClbMF0KKyAgICBpZiBub3QgX2ZpbmRfZXhlY3V0YWJsZShjYyk6CisgICAgICAgICMgQ29tcGlsZXIgaXMgbm90IGZvdW5kIG9uIHRoZSBzaGVsbCBzZWFyY2ggUEFUSC4KKyAgICAgICAgIyBOb3cgc2VhcmNoIGZvciBjbGFuZywgZmlyc3Qgb24gUEFUSCAoaWYgdGhlIENvbW1hbmQgTEluZQorICAgICAgICAjIFRvb2xzIGhhdmUgYmVlbiBpbnN0YWxsZWQgaW4gLyBvciBpZiB0aGUgdXNlciBoYXMgcHJvdmlkZWQKKyAgICAgICAgIyBhbm90aGVyIGxvY2F0aW9uIHZpYSBDQykuICBJZiBub3QgZm91bmQsIHRyeSB1c2luZyB4Y3J1bgorICAgICAgICAjIHRvIGZpbmQgYW4gdW5pbnN0YWxsZWQgY2xhbmcgKHdpdGhpbiBhIHNlbGVjdGVkIFhjb2RlKS4KKworICAgICAgICAjIE5PVEU6IENhbm5vdCB1c2Ugc3VicHJvY2VzcyBoZXJlIGJlY2F1c2Ugb2YgYm9vdHN0cmFwCisgICAgICAgICMgaXNzdWVzIHdoZW4gYnVpbGRpbmcgUHl0aG9uIGl0c2VsZiAoYW5kIG9zLnBvcGVuIGlzCisgICAgICAgICMgaW1wbGVtZW50ZWQgb24gdG9wIG9mIHN1YnByb2Nlc3MgYW5kIGlzIHRoZXJlZm9yZSBub3QKKyAgICAgICAgIyB1c2FibGUgYXMgd2VsbCkKKworICAgICAgICBjYyA9IF9maW5kX2J1aWxkX3Rvb2woJ2NsYW5nJykKKworICAgIGVsaWYgb3MucGF0aC5iYXNlbmFtZShjYykuc3RhcnRzd2l0aCgnZ2NjJyk6CisgICAgICAgICMgQ29tcGlsZXIgaXMgR0NDLCBjaGVjayBpZiBpdCBpcyBMTFZNLUdDQworICAgICAgICBkYXRhID0gX3JlYWRfb3V0cHV0KCInJXMnIC0tdmVyc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoY2MucmVwbGFjZSgiJyIsICInXCInXCInIiksKSkKKyAgICAgICAgaWYgJ2xsdm0tZ2NjJyBpbiBkYXRhOgorICAgICAgICAgICAgIyBGb3VuZCBMTFZNLUdDQywgZmFsbCBiYWNrIHRvIGNsYW5nCisgICAgICAgICAgICBjYyA9IF9maW5kX2J1aWxkX3Rvb2woJ2NsYW5nJykKKworICAgIGlmIG5vdCBjYzoKKyAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoCisgICAgICAgICAgICAgICAiQ2Fubm90IGxvY2F0ZSB3b3JraW5nIGNvbXBpbGVyIikKKworICAgIGlmIGNjICE9IG9sZGNjOgorICAgICAgICAjIEZvdW5kIGEgcmVwbGFjZW1lbnQgY29tcGlsZXIuCisgICAgICAgICMgTW9kaWZ5IGNvbmZpZyB2YXJzIHVzaW5nIG5ldyBjb21waWxlciwgaWYgbm90IGFscmVhZHkgZXhwbGljdGx5CisgICAgICAgICMgb3ZlcnJpZGVuIGJ5IGFuIGVudiB2YXJpYWJsZSwgcHJlc2VydmluZyBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKyAgICAgICAgZm9yIGN2IGluIF9DT01QSUxFUl9DT05GSUdfVkFSUzoKKyAgICAgICAgICAgIGlmIGN2IGluIF9jb25maWdfdmFycyBhbmQgY3Ygbm90IGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgY3Zfc3BsaXQgPSBfY29uZmlnX3ZhcnNbY3ZdLnNwbGl0KCkKKyAgICAgICAgICAgICAgICBjdl9zcGxpdFswXSA9IGNjIGlmIGN2ICE9ICdDWFgnIGVsc2UgY2MgKyAnKysnCisgICAgICAgICAgICAgICAgX3NhdmVfbW9kaWZpZWRfdmFsdWUoX2NvbmZpZ192YXJzLCBjdiwgJyAnLmpvaW4oY3Zfc3BsaXQpKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBfcmVtb3ZlX3VuaXZlcnNhbF9mbGFncyhfY29uZmlnX3ZhcnMpOgorICAgICIiIlJlbW92ZSBhbGwgdW5pdmVyc2FsIGJ1aWxkIGFyZ3VtZW50cyBmcm9tIGNvbmZpZyB2YXJzIiIiCisKKyAgICBmb3IgY3YgaW4gX1VOSVZFUlNBTF9DT05GSUdfVkFSUzoKKyAgICAgICAgIyBEbyBub3QgYWx0ZXIgYSBjb25maWcgdmFyIGV4cGxpY2l0bHkgb3ZlcnJpZGVuIGJ5IGVudiB2YXIKKyAgICAgICAgaWYgY3YgaW4gX2NvbmZpZ192YXJzIGFuZCBjdiBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2N2XQorICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1hcmNoXHMrXHcrXHMnLCAnICcsIGZsYWdzKQorICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIoJy1pc3lzcm9vdCBbXiBcdF0qJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIGZsYWdzKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBfcmVtb3ZlX3Vuc3VwcG9ydGVkX2FyY2hzKF9jb25maWdfdmFycyk6CisgICAgIiIiUmVtb3ZlIGFueSB1bnN1cHBvcnRlZCBhcmNocyBmcm9tIGNvbmZpZyB2YXJzIiIiCisgICAgIyBEaWZmZXJlbnQgWGNvZGUgcmVsZWFzZXMgc3VwcG9ydCBkaWZmZXJlbnQgc2V0cyBmb3IgJy1hcmNoJworICAgICMgZmxhZ3MuIEluIHBhcnRpY3VsYXIsIFhjb2RlIDQueCBubyBsb25nZXIgc3VwcG9ydHMgdGhlCisgICAgIyBQUEMgYXJjaGl0ZWN0dXJlcy4KKyAgICAjCisgICAgIyBUaGlzIGNvZGUgYXV0b21hdGljYWxseSByZW1vdmVzICctYXJjaCBwcGMnIGFuZCAnLWFyY2ggcHBjNjQnCisgICAgIyB3aGVuIHRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkLiBUaGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvCisgICAgIyBidWlsZCBleHRlbnNpb25zIG9uIE9TWCAxMC43IGFuZCBsYXRlciB3aXRoIHRoZSBwcmVidWlsdAorICAgICMgMzItYml0IGluc3RhbGxlciBvbiB0aGUgcHl0aG9uLm9yZyB3ZWJzaXRlLgorCisgICAgIyBza2lwIGNoZWNrcyBpZiB0aGUgY29tcGlsZXIgd2FzIG92ZXJyaWRlbiB3aXRoIGEgQ0MgZW52IHZhcmlhYmxlCisgICAgaWYgJ0NDJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKyAgICBpZiByZS5zZWFyY2goJy1hcmNoXHMrcHBjJywgX2NvbmZpZ192YXJzWydDRkxBR1MnXSkgaXMgbm90IE5vbmU6CisgICAgICAgICMgTk9URTogQ2Fubm90IHVzZSBzdWJwcm9jZXNzIGhlcmUgYmVjYXVzZSBvZiBib290c3RyYXAKKyAgICAgICAgIyBpc3N1ZXMgd2hlbiBidWlsZGluZyBQeXRob24gaXRzZWxmCisgICAgICAgIHN0YXR1cyA9IG9zLnN5c3RlbSgiJyVzJyAtYXJjaCBwcGMgLXggYyAvZGV2L251bGwgMj4vZGV2L251bGwiJSgKKyAgICAgICAgICAgIF9jb25maWdfdmFyc1snQ0MnXS5yZXBsYWNlKCInIiwgIidcIidcIiciKSwpKQorICAgICAgICAjIFRoZSBBcHBsZSBjb21waWxlciBkcml2ZXJzIHJldHVybiBzdGF0dXMgMjU1IGlmIG5vIFBQQworICAgICAgICBpZiAoc3RhdHVzID4+IDgpID09IDI1NToKKyAgICAgICAgICAgICMgQ29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IFBQQywgcmVtb3ZlIHRoZSByZWxhdGVkCisgICAgICAgICAgICAjICctYXJjaCcgZmxhZ3MgaWYgbm90IGV4cGxpY2l0bHkgb3ZlcnJpZGRlbiBieSBhbgorICAgICAgICAgICAgIyBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAgICAgZm9yIGN2IGluIF9VTklWRVJTQUxfQ09ORklHX1ZBUlM6CisgICAgICAgICAgICAgICAgaWYgY3YgaW4gX2NvbmZpZ192YXJzIGFuZCBjdiBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfY29uZmlnX3ZhcnNbY3ZdCisgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK3BwY1x3KlxzJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgX3NhdmVfbW9kaWZpZWRfdmFsdWUoX2NvbmZpZ192YXJzLCBjdiwgZmxhZ3MpCisKKyAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKworZGVmIF9vdmVycmlkZV9hbGxfYXJjaHMoX2NvbmZpZ192YXJzKToKKyAgICAiIiJBbGxvdyBvdmVycmlkZSBvZiBhbGwgYXJjaHMgd2l0aCBBUkNIRkxBR1MgZW52IHZhciIiIgorICAgICMgTk9URTogVGhpcyBuYW1lIHdhcyBpbnRyb2R1Y2VkIGJ5IEFwcGxlIGluIE9TWCAxMC41IGFuZAorICAgICMgaXMgdXNlZCBieSBzZXZlcmFsIHNjcmlwdGluZyBsYW5ndWFnZXMgZGlzdHJpYnV0ZWQgd2l0aAorICAgICMgdGhhdCBPUyByZWxlYXNlLgorICAgIGlmICdBUkNIRkxBR1MnIGluIG9zLmVudmlyb246CisgICAgICAgIGFyY2ggPSBvcy5lbnZpcm9uWydBUkNIRkxBR1MnXQorICAgICAgICBmb3IgY3YgaW4gX1VOSVZFUlNBTF9DT05GSUdfVkFSUzoKKyAgICAgICAgICAgIGlmIGN2IGluIF9jb25maWdfdmFycyBhbmQgJy1hcmNoJyBpbiBfY29uZmlnX3ZhcnNbY3ZdOgorICAgICAgICAgICAgICAgIGZsYWdzID0gX2NvbmZpZ192YXJzW2N2XQorICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctYXJjaFxzK1x3K1xzJywgJyAnLCBmbGFncykKKyAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzICsgJyAnICsgYXJjaAorICAgICAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIGZsYWdzKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBfY2hlY2tfZm9yX3VuYXZhaWxhYmxlX3NkayhfY29uZmlnX3ZhcnMpOgorICAgICIiIlJlbW92ZSByZWZlcmVuY2VzIHRvIGFueSBTREtzIG5vdCBhdmFpbGFibGUiIiIKKyAgICAjIElmIHdlJ3JlIG9uIE9TWCAxMC41IG9yIGxhdGVyIGFuZCB0aGUgdXNlciB0cmllcyB0bworICAgICMgY29tcGlsZSBhbiBleHRlbnNpb24gdXNpbmcgYW4gU0RLIHRoYXQgaXMgbm90IHByZXNlbnQKKyAgICAjIG9uIHRoZSBjdXJyZW50IG1hY2hpbmUgaXQgaXMgYmV0dGVyIHRvIG5vdCB1c2UgYW4gU0RLCisgICAgIyB0aGFuIHRvIGZhaWwuICBUaGlzIGlzIHBhcnRpY3VsYXJseSBpbXBvcnRhbnQgd2l0aAorICAgICMgdGhlIHN0YW5kYWxvbmcgQ29tbWFuZCBMaW5lIFRvb2xzIGFsdGVybmF0aXZlIHRvIGEKKyAgICAjIGZ1bGwtYmxvd24gWGNvZGUgaW5zdGFsbCBzaW5jZSB0aGUgQ0xUIHBhY2thZ2VzIGRvIG5vdAorICAgICMgcHJvdmlkZSBTREtzLiAgSWYgdGhlIFNESyBpcyBub3QgcHJlc2VudCwgaXQgaXMgYXNzdW1lZAorICAgICMgdGhhdCB0aGUgaGVhZGVyIGZpbGVzIGFuZCBkZXYgbGlicyBoYXZlIGJlZW4gaW5zdGFsbGVkCisgICAgIyB0byAvdXNyIGFuZCAvU3lzdGVtL0xpYnJhcnkgYnkgZWl0aGVyIGEgc3RhbmRhbG9uZSBDTFQKKyAgICAjIHBhY2thZ2Ugb3IgdGhlIENMVCBjb21wb25lbnQgd2l0aGluIFhjb2RlLgorICAgIGNmbGFncyA9IF9jb25maWdfdmFycy5nZXQoJ0NGTEFHUycsICcnKQorICAgIG0gPSByZS5zZWFyY2gocictaXN5c3Jvb3RccysoXFMrKScsIGNmbGFncykKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICBzZGsgPSBtLmdyb3VwKDEpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZGspOgorICAgICAgICAgICAgZm9yIGN2IGluIF9VTklWRVJTQUxfQ09ORklHX1ZBUlM6CisgICAgICAgICAgICAgICAgIyBEbyBub3QgYWx0ZXIgYSBjb25maWcgdmFyIGV4cGxpY2l0bHkgb3ZlcnJpZGVuIGJ5IGVudiB2YXIKKyAgICAgICAgICAgICAgICBpZiBjdiBpbiBfY29uZmlnX3ZhcnMgYW5kIGN2IG5vdCBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IF9jb25maWdfdmFyc1tjdl0KKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSByZS5zdWIocictaXN5c3Jvb3RccytcUysoPzpcc3wkKScsICcgJywgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIF9zYXZlX21vZGlmaWVkX3ZhbHVlKF9jb25maWdfdmFycywgY3YsIGZsYWdzKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBjb21waWxlcl9maXh1cChjb21waWxlcl9zbywgY2NfYXJncyk6CisgICAgIiIiCisgICAgVGhpcyBmdW5jdGlvbiB3aWxsIHN0cmlwICctaXN5c3Jvb3QgUEFUSCcgYW5kICctYXJjaCBBUkNIJyBmcm9tIHRoZQorICAgIGNvbXBpbGUgZmxhZ3MgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBvbmUgdGhlbSBpbiBleHRyYV9jb21waWxlX2ZsYWdzLgorCisgICAgVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSAnLWFyY2ggQVJDSCcgYWRkcyBhbm90aGVyIGFyY2hpdGVjdHVyZSB0byB0aGUKKyAgICBidWlsZCwgd2l0aG91dCBhIHdheSB0byByZW1vdmUgYW4gYXJjaGl0ZWN0dXJlLiBGdXJ0aGVybW9yZSBHQ0Mgd2lsbAorICAgIGJhcmYgaWYgbXVsdGlwbGUgJy1pc3lzcm9vdCcgYXJndW1lbnRzIGFyZSBwcmVzZW50LgorICAgICIiIgorICAgIHN0cmlwQXJjaCA9IHN0cmlwU3lzcm9vdCA9IEZhbHNlCisKKyAgICBjb21waWxlcl9zbyA9IGxpc3QoY29tcGlsZXJfc28pCisKKyAgICBpZiBub3QgX3N1cHBvcnRzX3VuaXZlcnNhbF9idWlsZHMoKToKKyAgICAgICAgIyBPU1ggYmVmb3JlIDEwLjQuMCwgdGhlc2UgZG9uJ3Qgc3VwcG9ydCAtYXJjaCBhbmQgLWlzeXNyb290IGF0CisgICAgICAgICMgYWxsLgorICAgICAgICBzdHJpcEFyY2ggPSBzdHJpcFN5c3Jvb3QgPSBUcnVlCisgICAgZWxzZToKKyAgICAgICAgc3RyaXBBcmNoID0gJy1hcmNoJyBpbiBjY19hcmdzCisgICAgICAgIHN0cmlwU3lzcm9vdCA9ICctaXN5c3Jvb3QnIGluIGNjX2FyZ3MKKworICAgIGlmIHN0cmlwQXJjaCBvciAnQVJDSEZMQUdTJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGluZGV4ID0gY29tcGlsZXJfc28uaW5kZXgoJy1hcmNoJykKKyAgICAgICAgICAgICAgICAjIFN0cmlwIHRoaXMgYXJndW1lbnQgYW5kIHRoZSBuZXh0IG9uZToKKyAgICAgICAgICAgICAgICBkZWwgY29tcGlsZXJfc29baW5kZXg6aW5kZXgrMl0KKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBpZiAnQVJDSEZMQUdTJyBpbiBvcy5lbnZpcm9uIGFuZCBub3Qgc3RyaXBBcmNoOgorICAgICAgICAjIFVzZXIgc3BlY2lmaWVkIGRpZmZlcmVudCAtYXJjaCBmbGFncyBpbiB0aGUgZW52aXJvbiwKKyAgICAgICAgIyBzZWUgYWxzbyBkaXN0dXRpbHMuc3lzY29uZmlnCisgICAgICAgIGNvbXBpbGVyX3NvID0gY29tcGlsZXJfc28gKyBvcy5lbnZpcm9uWydBUkNIRkxBR1MnXS5zcGxpdCgpCisKKyAgICBpZiBzdHJpcFN5c3Jvb3Q6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW5kZXggPSBjb21waWxlcl9zby5pbmRleCgnLWlzeXNyb290JykKKyAgICAgICAgICAgICAgICAjIFN0cmlwIHRoaXMgYXJndW1lbnQgYW5kIHRoZSBuZXh0IG9uZToKKyAgICAgICAgICAgICAgICBkZWwgY29tcGlsZXJfc29baW5kZXg6aW5kZXgrMl0KKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAjIENoZWNrIGlmIHRoZSBTREsgdGhhdCBpcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbiBhY3R1YWxseSBleGlzdHMsCisgICAgIyB0aGUgdW5pdmVyc2FsIGJ1aWxkIHJlcXVpcmVzIHRoZSB1c2FnZSBvZiBhIHVuaXZlcnNhbCBTREsgYW5kIG5vdCBhbGwKKyAgICAjIHVzZXJzIGhhdmUgdGhhdCBpbnN0YWxsZWQgYnkgZGVmYXVsdC4KKyAgICBzeXNyb290ID0gTm9uZQorICAgIGlmICctaXN5c3Jvb3QnIGluIGNjX2FyZ3M6CisgICAgICAgIGlkeCA9IGNjX2FyZ3MuaW5kZXgoJy1pc3lzcm9vdCcpCisgICAgICAgIHN5c3Jvb3QgPSBjY19hcmdzW2lkeCsxXQorICAgIGVsaWYgJy1pc3lzcm9vdCcgaW4gY29tcGlsZXJfc286CisgICAgICAgIGlkeCA9IGNvbXBpbGVyX3NvLmluZGV4KCctaXN5c3Jvb3QnKQorICAgICAgICBzeXNyb290ID0gY29tcGlsZXJfc29baWR4KzFdCisKKyAgICBpZiBzeXNyb290IGFuZCBub3Qgb3MucGF0aC5pc2RpcihzeXNyb290KToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworICAgICAgICBsb2cud2FybigiQ29tcGlsaW5nIHdpdGggYW4gU0RLIHRoYXQgZG9lc24ndCBzZWVtIHRvIGV4aXN0OiAlcyIsCisgICAgICAgICAgICAgICAgc3lzcm9vdCkKKyAgICAgICAgbG9nLndhcm4oIlBsZWFzZSBjaGVjayB5b3VyIFhjb2RlIGluc3RhbGxhdGlvbiIpCisKKyAgICByZXR1cm4gY29tcGlsZXJfc28KKworCitkZWYgY3VzdG9taXplX2NvbmZpZ192YXJzKF9jb25maWdfdmFycyk6CisgICAgIiIiQ3VzdG9taXplIFB5dGhvbiBidWlsZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4KKworICAgIENhbGxlZCBpbnRlcm5hbGx5IGZyb20gc3lzY29uZmlnIHdpdGggYSBtdXRhYmxlIG1hcHBpbmcKKyAgICBjb250YWluaW5nIG5hbWUvdmFsdWUgcGFpcnMgcGFyc2VkIGZyb20gdGhlIGNvbmZpZ3VyZWQKKyAgICBtYWtlZmlsZSB1c2VkIHRvIGJ1aWxkIHRoaXMgaW50ZXJwcmV0ZXIuICBSZXR1cm5zCisgICAgdGhlIG1hcHBpbmcgdXBkYXRlZCBhcyBuZWVkZWQgdG8gcmVmbGVjdCB0aGUgZW52aXJvbm1lbnQKKyAgICBpbiB3aGljaCB0aGUgaW50ZXJwcmV0ZXIgaXMgcnVubmluZzsgaW4gdGhlIGNhc2Ugb2YKKyAgICBhIFB5dGhvbiBmcm9tIGEgYmluYXJ5IGluc3RhbGxlciwgdGhlIGluc3RhbGxlZAorICAgIGVudmlyb25tZW50IG1heSBiZSB2ZXJ5IGRpZmZlcmVudCBmcm9tIHRoZSBidWlsZAorICAgIGVudmlyb25tZW50LCBpLmUuIGRpZmZlcmVudCBPUyBsZXZlbHMsIGRpZmZlcmVudAorICAgIGJ1aWx0IHRvb2xzLCBkaWZmZXJlbnQgYXZhaWxhYmxlIENQVSBhcmNoaXRlY3R1cmVzLgorCisgICAgVGhpcyBjdXN0b21pemF0aW9uIGlzIHBlcmZvcm1lZCB3aGVuZXZlcgorICAgIGRpc3R1dGlscy5zeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKCkgaXMgZmlyc3QKKyAgICBjYWxsZWQuICBJdCBtYXkgYmUgdXNlZCBpbiBlbnZpcm9ubWVudHMgd2hlcmUgbm8KKyAgICBjb21waWxlcnMgYXJlIHByZXNlbnQsIGkuZS4gd2hlbiBpbnN0YWxsaW5nIHB1cmUKKyAgICBQeXRob24gZGlzdHMuICBDdXN0b21pemF0aW9uIG9mIGNvbXBpbGVyIHBhdGhzCisgICAgYW5kIGRldGVjdGlvbiBvZiB1bmF2YWlsYWJsZSBhcmNocyBpcyBkZWZlcnJlZAorICAgIHVudGlsIHRoZSBmaXJzdCBleHRlbnRpb24gbW9kdWxlIGJ1aWxkIGlzCisgICAgcmVxdWVzdGVkIChpbiBkaXN0dXRpbHMuc3lzY29uZmlnLmN1c3RvbWl6ZV9jb21waWxlcikuCisKKyAgICBDdXJyZW50bHkgY2FsbGVkIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZworICAgICIiIgorCisgICAgaWYgbm90IF9zdXBwb3J0c191bml2ZXJzYWxfYnVpbGRzKCk6CisgICAgICAgICMgT24gTWFjIE9TIFggYmVmb3JlIDEwLjQsIGNoZWNrIGlmIC1hcmNoIGFuZCAtaXN5c3Jvb3QKKyAgICAgICAgIyBhcmUgaW4gQ0ZMQUdTIG9yIExERkxBR1MgYW5kIHJlbW92ZSB0aGVtIGlmIHRoZXkgYXJlLgorICAgICAgICAjIFRoaXMgaXMgbmVlZGVkIHdoZW4gYnVpbGRpbmcgZXh0ZW5zaW9ucyBvbiBhIDEwLjMgc3lzdGVtCisgICAgICAgICMgdXNpbmcgYSB1bml2ZXJzYWwgYnVpbGQgb2YgcHl0aG9uLgorICAgICAgICBfcmVtb3ZlX3VuaXZlcnNhbF9mbGFncyhfY29uZmlnX3ZhcnMpCisKKyAgICAjIEFsbG93IHVzZXIgdG8gb3ZlcnJpZGUgYWxsIGFyY2hzIHdpdGggQVJDSEZMQUdTIGVudiB2YXIKKyAgICBfb3ZlcnJpZGVfYWxsX2FyY2hzKF9jb25maWdfdmFycykKKworICAgICMgUmVtb3ZlIHJlZmVyZW5jZXMgdG8gc2RrcyB0aGF0IGFyZSBub3QgZm91bmQKKyAgICBfY2hlY2tfZm9yX3VuYXZhaWxhYmxlX3NkayhfY29uZmlnX3ZhcnMpCisKKyAgICByZXR1cm4gX2NvbmZpZ192YXJzCisKKworZGVmIGN1c3RvbWl6ZV9jb21waWxlcihfY29uZmlnX3ZhcnMpOgorICAgICIiIkN1c3RvbWl6ZSBjb21waWxlciBwYXRoIGFuZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4KKworICAgIFRoaXMgY3VzdG9taXphdGlvbiBpcyBwZXJmb3JtZWQgd2hlbiB0aGUgZmlyc3QKKyAgICBleHRlbnNpb24gbW9kdWxlIGJ1aWxkIGlzIHJlcXVlc3RlZAorICAgIGluIGRpc3R1dGlscy5zeXNjb25maWcuY3VzdG9taXplX2NvbXBpbGVyKS4KKyAgICAiIiIKKworICAgICMgRmluZCBhIGNvbXBpbGVyIHRvIHVzZSBmb3IgZXh0ZW5zaW9uIG1vZHVsZSBidWlsZHMKKyAgICBfZmluZF9hcHByb3ByaWF0ZV9jb21waWxlcihfY29uZmlnX3ZhcnMpCisKKyAgICAjIFJlbW92ZSBwcGMgYXJjaCBmbGFncyBpZiBub3Qgc3VwcG9ydGVkIGhlcmUKKyAgICBfcmVtb3ZlX3Vuc3VwcG9ydGVkX2FyY2hzKF9jb25maWdfdmFycykKKworICAgICMgQWxsb3cgdXNlciB0byBvdmVycmlkZSBhbGwgYXJjaHMgd2l0aCBBUkNIRkxBR1MgZW52IHZhcgorICAgIF9vdmVycmlkZV9hbGxfYXJjaHMoX2NvbmZpZ192YXJzKQorCisgICAgcmV0dXJuIF9jb25maWdfdmFycworCisKK2RlZiBnZXRfcGxhdGZvcm1fb3N4KF9jb25maWdfdmFycywgb3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lKToKKyAgICAiIiJGaWx0ZXIgdmFsdWVzIGZvciBnZXRfcGxhdGZvcm0oKSIiIgorICAgICMgY2FsbGVkIGZyb20gZ2V0X3BsYXRmb3JtKCkgaW4gc3lzY29uZmlnIGFuZCBkaXN0dXRpbHMudXRpbAorICAgICMKKyAgICAjIEZvciBvdXIgcHVycG9zZXMsIHdlJ2xsIGFzc3VtZSB0aGF0IHRoZSBzeXN0ZW0gdmVyc2lvbiBmcm9tCisgICAgIyBkaXN0dXRpbHMnIHBlcnNwZWN0aXZlIGlzIHdoYXQgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIGlzIHNldAorICAgICMgdG8uIFRoaXMgbWFrZXMgdGhlIGNvbXBhdGliaWxpdHkgc3RvcnkgYSBiaXQgbW9yZSBzYW5lIGJlY2F1c2UgdGhlCisgICAgIyBtYWNoaW5lIGlzIGdvaW5nIHRvIGNvbXBpbGUgYW5kIGxpbmsgYXMgaWYgaXQgd2VyZQorICAgICMgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VULgorCisgICAgbWFjdmVyID0gX2NvbmZpZ192YXJzLmdldCgnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJywgJycpCisgICAgbWFjcmVsZWFzZSA9IF9nZXRfc3lzdGVtX3ZlcnNpb24oKSBvciBtYWN2ZXIKKyAgICBtYWN2ZXIgPSBtYWN2ZXIgb3IgbWFjcmVsZWFzZQorCisgICAgaWYgbWFjdmVyOgorICAgICAgICByZWxlYXNlID0gbWFjdmVyCisgICAgICAgIG9zbmFtZSA9ICJtYWNvc3giCisKKyAgICAgICAgIyBVc2UgdGhlIG9yaWdpbmFsIENGTEFHUyB2YWx1ZSwgaWYgYXZhaWxhYmxlLCBzbyB0aGF0IHdlCisgICAgICAgICMgcmV0dXJuIHRoZSBzYW1lIG1hY2hpbmUgdHlwZSBmb3IgdGhlIHBsYXRmb3JtIHN0cmluZy4KKyAgICAgICAgIyBPdGhlcndpc2UsIGRpc3R1dGlscyBtYXkgY29uc2lkZXIgdGhpcyBhIGNyb3NzLWNvbXBpbGluZworICAgICAgICAjIGNhc2UgYW5kIGRpc2FsbG93IGluc3RhbGxzLgorICAgICAgICBjZmxhZ3MgPSBfY29uZmlnX3ZhcnMuZ2V0KF9JTklUUFJFKydDRkxBR1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzLmdldCgnQ0ZMQUdTJywgJycpKQorICAgICAgICBpZiAoKG1hY3JlbGVhc2UgKyAnLicpID49ICcxMC40LicgYW5kCisgICAgICAgICAgICAnLWFyY2gnIGluIGNmbGFncy5zdHJpcCgpKToKKyAgICAgICAgICAgICMgVGhlIHVuaXZlcnNhbCBidWlsZCB3aWxsIGJ1aWxkIGZhdCBiaW5hcmllcywgYnV0IG5vdCBvbgorICAgICAgICAgICAgIyBzeXN0ZW1zIGJlZm9yZSAxMC40CisKKyAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0JworCisgICAgICAgICAgICBhcmNocyA9IHJlLmZpbmRhbGwoJy1hcmNoXHMrKFxTKyknLCBjZmxhZ3MpCisgICAgICAgICAgICBhcmNocyA9IHR1cGxlKHNvcnRlZChzZXQoYXJjaHMpKSkKKworICAgICAgICAgICAgaWYgbGVuKGFyY2hzKSA9PSAxOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSBhcmNoc1swXQorICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJyk6CisgICAgICAgICAgICAgICAgbWFjaGluZSA9ICdmYXQnCisgICAgICAgICAgICBlbGlmIGFyY2hzID09ICgnaTM4NicsICd4ODZfNjQnKToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ludGVsJworICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3g4Nl82NCcpOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAnZmF0MycKKyAgICAgICAgICAgIGVsaWYgYXJjaHMgPT0gKCdwcGM2NCcsICd4ODZfNjQnKToKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ2ZhdDY0JworICAgICAgICAgICAgZWxpZiBhcmNocyA9PSAoJ2kzODYnLCAncHBjJywgJ3BwYzY0JywgJ3g4Nl82NCcpOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAndW5pdmVyc2FsJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IG1hY2hpbmUgdmFsdWUgZm9yIGFyY2hzPSVyIiAlIChhcmNocywpKQorCisgICAgICAgIGVsaWYgbWFjaGluZSA9PSAnaTM4Nic6CisgICAgICAgICAgICAjIE9uIE9TWCB0aGUgbWFjaGluZSB0eXBlIHJldHVybmVkIGJ5IHVuYW1lIGlzIGFsd2F5cyB0aGUKKyAgICAgICAgICAgICMgMzItYml0IHZhcmlhbnQsIGV2ZW4gaWYgdGhlIGV4ZWN1dGFibGUgYXJjaGl0ZWN0dXJlIGlzCisgICAgICAgICAgICAjIHRoZSA2NC1iaXQgdmFyaWFudAorICAgICAgICAgICAgaWYgc3lzLm1heGludCA+PSAyKiozMjoKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gJ3g4Nl82NCcKKworICAgICAgICBlbGlmIG1hY2hpbmUgaW4gKCdQb3dlclBDJywgJ1Bvd2VyX01hY2ludG9zaCcpOgorICAgICAgICAgICAgIyBQaWNrIGEgc2FuZSBuYW1lIGZvciB0aGUgUFBDIGFyY2hpdGVjdHVyZS4KKyAgICAgICAgICAgICMgU2VlICdpMzg2JyBjYXNlCisgICAgICAgICAgICBpZiBzeXMubWF4aW50ID49IDIqKjMyOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjNjQnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSAncHBjJworCisgICAgcmV0dXJuIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4ZGViYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX29zeF9zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L19vc3hfc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM4ZGViYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX29zeF9zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19weWlvLnB5IGIvbGliL3B5dGhvbjIuNy9fcHlpby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg2ZWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fcHlpby5weQpAQCAtMCwwICsxLDIwMTcgQEAKKyIiIgorUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbyBtb2R1bGUuCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAocHJpbnRfZnVuY3Rpb24sIHVuaWNvZGVfbGl0ZXJhbHMpCisKK2ltcG9ydCBvcworaW1wb3J0IGFiYworaW1wb3J0IGNvZGVjcworaW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgZXJybm8KKyMgSW1wb3J0IHRocmVhZCBpbnN0ZWFkIG9mIHRocmVhZGluZyB0byByZWR1Y2Ugc3RhcnR1cCBjb3N0Cit0cnk6CisgICAgZnJvbSB0aHJlYWQgaW1wb3J0IGFsbG9jYXRlX2xvY2sgYXMgTG9jaworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gZHVtbXlfdGhyZWFkIGltcG9ydCBhbGxvY2F0ZV9sb2NrIGFzIExvY2sKKworaW1wb3J0IGlvCitmcm9tIGlvIGltcG9ydCAoX19hbGxfXywgU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORCkKK2Zyb20gZXJybm8gaW1wb3J0IEVJTlRSCisKK19fbWV0YWNsYXNzX18gPSB0eXBlCisKKyMgb3BlbigpIHVzZXMgc3RfYmxrc2l6ZSB3aGVuZXZlciB3ZSBjYW4KK0RFRkFVTFRfQlVGRkVSX1NJWkUgPSA4ICogMTAyNCAgIyBieXRlcworCisjIE5PVEU6IEJhc2UgY2xhc3NlcyBkZWZpbmVkIGhlcmUgYXJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgIm9mZmljaWFsIiBBQkNzCisjIGRlZmluZWQgaW4gaW8ucHkuIFdlIGRvbid0IHVzZSByZWFsIGluaGVyaXRhbmNlIHRob3VnaCwgYmVjYXVzZSB3ZSBkb24ndAorIyB3YW50IHRvIGluaGVyaXQgdGhlIEMgaW1wbGVtZW50YXRpb25zLgorCisKK2NsYXNzIEJsb2NraW5nSU9FcnJvcihJT0Vycm9yKToKKworICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgd2hlbiBJL08gd291bGQgYmxvY2sgb24gYSBub24tYmxvY2tpbmcgSS9PIHN0cmVhbS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJubywgc3RyZXJyb3IsIGNoYXJhY3RlcnNfd3JpdHRlbj0wKToKKyAgICAgICAgc3VwZXIoSU9FcnJvciwgc2VsZikuX19pbml0X18oZXJybm8sIHN0cmVycm9yKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaGFyYWN0ZXJzX3dyaXR0ZW4sIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2hhcmFjdGVyc193cml0dGVuIG11c3QgYmUgYSBpbnRlZ2VyIikKKyAgICAgICAgc2VsZi5jaGFyYWN0ZXJzX3dyaXR0ZW4gPSBjaGFyYWN0ZXJzX3dyaXR0ZW4KKworCitkZWYgb3BlbihmaWxlLCBtb2RlPSJyIiwgYnVmZmVyaW5nPS0xLAorICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPU5vbmUsCisgICAgICAgICBuZXdsaW5lPU5vbmUsIGNsb3NlZmQ9VHJ1ZSk6CisKKyAgICByIiIiT3BlbiBmaWxlIGFuZCByZXR1cm4gYSBzdHJlYW0uICBSYWlzZSBJT0Vycm9yIHVwb24gZmFpbHVyZS4KKworICAgIGZpbGUgaXMgZWl0aGVyIGEgdGV4dCBvciBieXRlIHN0cmluZyBnaXZpbmcgdGhlIG5hbWUgKGFuZCB0aGUgcGF0aAorICAgIGlmIHRoZSBmaWxlIGlzbid0IGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5KSBvZiB0aGUgZmlsZSB0bworICAgIGJlIG9wZW5lZCBvciBhbiBpbnRlZ2VyIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZmlsZSB0byBiZQorICAgIHdyYXBwZWQuIChJZiBhIGZpbGUgZGVzY3JpcHRvciBpcyBnaXZlbiwgaXQgaXMgY2xvc2VkIHdoZW4gdGhlCisgICAgcmV0dXJuZWQgSS9PIG9iamVjdCBpcyBjbG9zZWQsIHVubGVzcyBjbG9zZWZkIGlzIHNldCB0byBGYWxzZS4pCisKKyAgICBtb2RlIGlzIGFuIG9wdGlvbmFsIHN0cmluZyB0aGF0IHNwZWNpZmllcyB0aGUgbW9kZSBpbiB3aGljaCB0aGUgZmlsZQorICAgIGlzIG9wZW5lZC4gSXQgZGVmYXVsdHMgdG8gJ3InIHdoaWNoIG1lYW5zIG9wZW4gZm9yIHJlYWRpbmcgaW4gdGV4dAorICAgIG1vZGUuICBPdGhlciBjb21tb24gdmFsdWVzIGFyZSAndycgZm9yIHdyaXRpbmcgKHRydW5jYXRpbmcgdGhlIGZpbGUgaWYKKyAgICBpdCBhbHJlYWR5IGV4aXN0cyksIGFuZCAnYScgZm9yIGFwcGVuZGluZyAod2hpY2ggb24gc29tZSBVbml4IHN5c3RlbXMsCisgICAgbWVhbnMgdGhhdCBhbGwgd3JpdGVzIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlIHJlZ2FyZGxlc3Mgb2YgdGhlCisgICAgY3VycmVudCBzZWVrIHBvc2l0aW9uKS4gSW4gdGV4dCBtb2RlLCBpZiBlbmNvZGluZyBpcyBub3Qgc3BlY2lmaWVkIHRoZQorICAgIGVuY29kaW5nIHVzZWQgaXMgcGxhdGZvcm0gZGVwZW5kZW50LiAoRm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgcmF3CisgICAgYnl0ZXMgdXNlIGJpbmFyeSBtb2RlIGFuZCBsZWF2ZSBlbmNvZGluZyB1bnNwZWNpZmllZC4pIFRoZSBhdmFpbGFibGUKKyAgICBtb2RlcyBhcmU6CisKKyAgICA9PT09PT09PT0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgQ2hhcmFjdGVyIE1lYW5pbmcKKyAgICAtLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgJ3InICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgKGRlZmF1bHQpCisgICAgJ3cnICAgICAgIG9wZW4gZm9yIHdyaXRpbmcsIHRydW5jYXRpbmcgdGhlIGZpbGUgZmlyc3QKKyAgICAnYScgICAgICAgb3BlbiBmb3Igd3JpdGluZywgYXBwZW5kaW5nIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUgaWYgaXQgZXhpc3RzCisgICAgJ2InICAgICAgIGJpbmFyeSBtb2RlCisgICAgJ3QnICAgICAgIHRleHQgbW9kZSAoZGVmYXVsdCkKKyAgICAnKycgICAgICAgb3BlbiBhIGRpc2sgZmlsZSBmb3IgdXBkYXRpbmcgKHJlYWRpbmcgYW5kIHdyaXRpbmcpCisgICAgJ1UnICAgICAgIHVuaXZlcnNhbCBuZXdsaW5lIG1vZGUgKGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTsgdW5uZWVkZWQKKyAgICAgICAgICAgICAgZm9yIG5ldyBjb2RlKQorICAgID09PT09PT09PSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIFRoZSBkZWZhdWx0IG1vZGUgaXMgJ3J0JyAob3BlbiBmb3IgcmVhZGluZyB0ZXh0KS4gRm9yIGJpbmFyeSByYW5kb20KKyAgICBhY2Nlc3MsIHRoZSBtb2RlICd3K2InIG9wZW5zIGFuZCB0cnVuY2F0ZXMgdGhlIGZpbGUgdG8gMCBieXRlcywgd2hpbGUKKyAgICAncitiJyBvcGVucyB0aGUgZmlsZSB3aXRob3V0IHRydW5jYXRpb24uCisKKyAgICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGZpbGVzIG9wZW5lZCBpbiBiaW5hcnkgYW5kIHRleHQgbW9kZXMsCisgICAgZXZlbiB3aGVuIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0gZG9lc24ndC4gRmlsZXMgb3BlbmVkIGluCisgICAgYmluYXJ5IG1vZGUgKGFwcGVuZGluZyAnYicgdG8gdGhlIG1vZGUgYXJndW1lbnQpIHJldHVybiBjb250ZW50cyBhcworICAgIGJ5dGVzIG9iamVjdHMgd2l0aG91dCBhbnkgZGVjb2RpbmcuIEluIHRleHQgbW9kZSAodGhlIGRlZmF1bHQsIG9yIHdoZW4KKyAgICAndCcgaXMgYXBwZW5kZWQgdG8gdGhlIG1vZGUgYXJndW1lbnQpLCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXJlCisgICAgcmV0dXJuZWQgYXMgc3RyaW5ncywgdGhlIGJ5dGVzIGhhdmluZyBiZWVuIGZpcnN0IGRlY29kZWQgdXNpbmcgYQorICAgIHBsYXRmb3JtLWRlcGVuZGVudCBlbmNvZGluZyBvciB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nIGlmIGdpdmVuLgorCisgICAgYnVmZmVyaW5nIGlzIGFuIG9wdGlvbmFsIGludGVnZXIgdXNlZCB0byBzZXQgdGhlIGJ1ZmZlcmluZyBwb2xpY3kuCisgICAgUGFzcyAwIHRvIHN3aXRjaCBidWZmZXJpbmcgb2ZmIChvbmx5IGFsbG93ZWQgaW4gYmluYXJ5IG1vZGUpLCAxIHRvIHNlbGVjdAorICAgIGxpbmUgYnVmZmVyaW5nIChvbmx5IHVzYWJsZSBpbiB0ZXh0IG1vZGUpLCBhbmQgYW4gaW50ZWdlciA+IDEgdG8gaW5kaWNhdGUKKyAgICB0aGUgc2l6ZSBvZiBhIGZpeGVkLXNpemUgY2h1bmsgYnVmZmVyLiAgV2hlbiBubyBidWZmZXJpbmcgYXJndW1lbnQgaXMKKyAgICBnaXZlbiwgdGhlIGRlZmF1bHQgYnVmZmVyaW5nIHBvbGljeSB3b3JrcyBhcyBmb2xsb3dzOgorCisgICAgKiBCaW5hcnkgZmlsZXMgYXJlIGJ1ZmZlcmVkIGluIGZpeGVkLXNpemUgY2h1bmtzOyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgICBpcyBjaG9zZW4gdXNpbmcgYSBoZXVyaXN0aWMgdHJ5aW5nIHRvIGRldGVybWluZSB0aGUgdW5kZXJseWluZyBkZXZpY2UncworICAgICAgImJsb2NrIHNpemUiIGFuZCBmYWxsaW5nIGJhY2sgb24gYGlvLkRFRkFVTFRfQlVGRkVSX1NJWkVgLgorICAgICAgT24gbWFueSBzeXN0ZW1zLCB0aGUgYnVmZmVyIHdpbGwgdHlwaWNhbGx5IGJlIDQwOTYgb3IgODE5MiBieXRlcyBsb25nLgorCisgICAgKiAiSW50ZXJhY3RpdmUiIHRleHQgZmlsZXMgKGZpbGVzIGZvciB3aGljaCBpc2F0dHkoKSByZXR1cm5zIFRydWUpCisgICAgICB1c2UgbGluZSBidWZmZXJpbmcuICBPdGhlciB0ZXh0IGZpbGVzIHVzZSB0aGUgcG9saWN5IGRlc2NyaWJlZCBhYm92ZQorICAgICAgZm9yIGJpbmFyeSBmaWxlcy4KKworICAgIGVuY29kaW5nIGlzIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB1c2VkIHRvIGRlY29kZSBvciBlbmNvZGUgdGhlCisgICAgZmlsZS4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGluIHRleHQgbW9kZS4gVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMKKyAgICBwbGF0Zm9ybSBkZXBlbmRlbnQsIGJ1dCBhbnkgZW5jb2Rpbmcgc3VwcG9ydGVkIGJ5IFB5dGhvbiBjYW4gYmUKKyAgICBwYXNzZWQuICBTZWUgdGhlIGNvZGVjcyBtb2R1bGUgZm9yIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBlbmNvZGluZ3MuCisKKyAgICBlcnJvcnMgaXMgYW4gb3B0aW9uYWwgc3RyaW5nIHRoYXQgc3BlY2lmaWVzIGhvdyBlbmNvZGluZyBlcnJvcnMgYXJlIHRvCisgICAgYmUgaGFuZGxlZC0tLXRoaXMgYXJndW1lbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGJpbmFyeSBtb2RlLiBQYXNzCisgICAgJ3N0cmljdCcgdG8gcmFpc2UgYSBWYWx1ZUVycm9yIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlbmNvZGluZyBlcnJvcgorICAgICh0aGUgZGVmYXVsdCBvZiBOb25lIGhhcyB0aGUgc2FtZSBlZmZlY3QpLCBvciBwYXNzICdpZ25vcmUnIHRvIGlnbm9yZQorICAgIGVycm9ycy4gKE5vdGUgdGhhdCBpZ25vcmluZyBlbmNvZGluZyBlcnJvcnMgY2FuIGxlYWQgdG8gZGF0YSBsb3NzLikKKyAgICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGNvZGVjcy5yZWdpc3RlciBmb3IgYSBsaXN0IG9mIHRoZSBwZXJtaXR0ZWQKKyAgICBlbmNvZGluZyBlcnJvciBzdHJpbmdzLgorCisgICAgbmV3bGluZSBjb250cm9scyBob3cgdW5pdmVyc2FsIG5ld2xpbmVzIHdvcmtzIChpdCBvbmx5IGFwcGxpZXMgdG8gdGV4dAorICAgIG1vZGUpLiBJdCBjYW4gYmUgTm9uZSwgJycsICdcbicsICdccicsIGFuZCAnXHJcbicuICBJdCB3b3JrcyBhcworICAgIGZvbGxvd3M6CisKKyAgICAqIE9uIGlucHV0LCBpZiBuZXdsaW5lIGlzIE5vbmUsIHVuaXZlcnNhbCBuZXdsaW5lcyBtb2RlIGlzCisgICAgICBlbmFibGVkLiBMaW5lcyBpbiB0aGUgaW5wdXQgY2FuIGVuZCBpbiAnXG4nLCAnXHInLCBvciAnXHJcbicsIGFuZAorICAgICAgdGhlc2UgYXJlIHRyYW5zbGF0ZWQgaW50byAnXG4nIGJlZm9yZSBiZWluZyByZXR1cm5lZCB0byB0aGUKKyAgICAgIGNhbGxlci4gSWYgaXQgaXMgJycsIHVuaXZlcnNhbCBuZXdsaW5lIG1vZGUgaXMgZW5hYmxlZCwgYnV0IGxpbmUKKyAgICAgIGVuZGluZ3MgYXJlIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdW50cmFuc2xhdGVkLiBJZiBpdCBoYXMgYW55IG9mCisgICAgICB0aGUgb3RoZXIgbGVnYWwgdmFsdWVzLCBpbnB1dCBsaW5lcyBhcmUgb25seSB0ZXJtaW5hdGVkIGJ5IHRoZSBnaXZlbgorICAgICAgc3RyaW5nLCBhbmQgdGhlIGxpbmUgZW5kaW5nIGlzIHJldHVybmVkIHRvIHRoZSBjYWxsZXIgdW50cmFuc2xhdGVkLgorCisgICAgKiBPbiBvdXRwdXQsIGlmIG5ld2xpbmUgaXMgTm9uZSwgYW55ICdcbicgY2hhcmFjdGVycyB3cml0dGVuIGFyZQorICAgICAgdHJhbnNsYXRlZCB0byB0aGUgc3lzdGVtIGRlZmF1bHQgbGluZSBzZXBhcmF0b3IsIG9zLmxpbmVzZXAuIElmCisgICAgICBuZXdsaW5lIGlzICcnLCBubyB0cmFuc2xhdGlvbiB0YWtlcyBwbGFjZS4gSWYgbmV3bGluZSBpcyBhbnkgb2YgdGhlCisgICAgICBvdGhlciBsZWdhbCB2YWx1ZXMsIGFueSAnXG4nIGNoYXJhY3RlcnMgd3JpdHRlbiBhcmUgdHJhbnNsYXRlZCB0bworICAgICAgdGhlIGdpdmVuIHN0cmluZy4KKworICAgIElmIGNsb3NlZmQgaXMgRmFsc2UsIHRoZSB1bmRlcmx5aW5nIGZpbGUgZGVzY3JpcHRvciB3aWxsIGJlIGtlcHQgb3BlbgorICAgIHdoZW4gdGhlIGZpbGUgaXMgY2xvc2VkLiBUaGlzIGRvZXMgbm90IHdvcmsgd2hlbiBhIGZpbGUgbmFtZSBpcyBnaXZlbgorICAgIGFuZCBtdXN0IGJlIFRydWUgaW4gdGhhdCBjYXNlLgorCisgICAgb3BlbigpIHJldHVybnMgYSBmaWxlIG9iamVjdCB3aG9zZSB0eXBlIGRlcGVuZHMgb24gdGhlIG1vZGUsIGFuZAorICAgIHRocm91Z2ggd2hpY2ggdGhlIHN0YW5kYXJkIGZpbGUgb3BlcmF0aW9ucyBzdWNoIGFzIHJlYWRpbmcgYW5kIHdyaXRpbmcKKyAgICBhcmUgcGVyZm9ybWVkLiBXaGVuIG9wZW4oKSBpcyB1c2VkIHRvIG9wZW4gYSBmaWxlIGluIGEgdGV4dCBtb2RlICgndycsCisgICAgJ3InLCAnd3QnLCAncnQnLCBldGMuKSwgaXQgcmV0dXJucyBhIFRleHRJT1dyYXBwZXIuIFdoZW4gdXNlZCB0byBvcGVuCisgICAgYSBmaWxlIGluIGEgYmluYXJ5IG1vZGUsIHRoZSByZXR1cm5lZCBjbGFzcyB2YXJpZXM6IGluIHJlYWQgYmluYXJ5CisgICAgbW9kZSwgaXQgcmV0dXJucyBhIEJ1ZmZlcmVkUmVhZGVyOyBpbiB3cml0ZSBiaW5hcnkgYW5kIGFwcGVuZCBiaW5hcnkKKyAgICBtb2RlcywgaXQgcmV0dXJucyBhIEJ1ZmZlcmVkV3JpdGVyLCBhbmQgaW4gcmVhZC93cml0ZSBtb2RlLCBpdCByZXR1cm5zCisgICAgYSBCdWZmZXJlZFJhbmRvbS4KKworICAgIEl0IGlzIGFsc28gcG9zc2libGUgdG8gdXNlIGEgc3RyaW5nIG9yIGJ5dGVhcnJheSBhcyBhIGZpbGUgZm9yIGJvdGgKKyAgICByZWFkaW5nIGFuZCB3cml0aW5nLiBGb3Igc3RyaW5ncyBTdHJpbmdJTyBjYW4gYmUgdXNlZCBsaWtlIGEgZmlsZQorICAgIG9wZW5lZCBpbiBhIHRleHQgbW9kZSwgYW5kIGZvciBieXRlcyBhIEJ5dGVzSU8gY2FuIGJlIHVzZWQgbGlrZSBhIGZpbGUKKyAgICBvcGVuZWQgaW4gYSBiaW5hcnkgbW9kZS4KKyAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShmaWxlLCAoYmFzZXN0cmluZywgaW50LCBsb25nKSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBmaWxlOiAlciIgJSBmaWxlKQorICAgIGlmIG5vdCBpc2luc3RhbmNlKG1vZGUsIGJhc2VzdHJpbmcpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgbW9kZTogJXIiICUgbW9kZSkKKyAgICBpZiBub3QgaXNpbnN0YW5jZShidWZmZXJpbmcsIChpbnQsIGxvbmcpKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnZhbGlkIGJ1ZmZlcmluZzogJXIiICUgYnVmZmVyaW5nKQorICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShlbmNvZGluZywgYmFzZXN0cmluZyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW52YWxpZCBlbmNvZGluZzogJXIiICUgZW5jb2RpbmcpCisgICAgaWYgZXJyb3JzIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShlcnJvcnMsIGJhc2VzdHJpbmcpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoImludmFsaWQgZXJyb3JzOiAlciIgJSBlcnJvcnMpCisgICAgbW9kZXMgPSBzZXQobW9kZSkKKyAgICBpZiBtb2RlcyAtIHNldCgiYXJ3Yit0VSIpIG9yIGxlbihtb2RlKSA+IGxlbihtb2Rlcyk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgbW9kZTogJXIiICUgbW9kZSkKKyAgICByZWFkaW5nID0gInIiIGluIG1vZGVzCisgICAgd3JpdGluZyA9ICJ3IiBpbiBtb2RlcworICAgIGFwcGVuZGluZyA9ICJhIiBpbiBtb2RlcworICAgIHVwZGF0aW5nID0gIisiIGluIG1vZGVzCisgICAgdGV4dCA9ICJ0IiBpbiBtb2RlcworICAgIGJpbmFyeSA9ICJiIiBpbiBtb2RlcworICAgIGlmICJVIiBpbiBtb2RlczoKKyAgICAgICAgaWYgd3JpdGluZyBvciBhcHBlbmRpbmc6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCB1c2UgVSBhbmQgd3JpdGluZyBtb2RlIGF0IG9uY2UiKQorICAgICAgICByZWFkaW5nID0gVHJ1ZQorICAgIGlmIHRleHQgYW5kIGJpbmFyeToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY2FuJ3QgaGF2ZSB0ZXh0IGFuZCBiaW5hcnkgbW9kZSBhdCBvbmNlIikKKyAgICBpZiByZWFkaW5nICsgd3JpdGluZyArIGFwcGVuZGluZyA+IDE6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImNhbid0IGhhdmUgcmVhZC93cml0ZS9hcHBlbmQgbW9kZSBhdCBvbmNlIikKKyAgICBpZiBub3QgKHJlYWRpbmcgb3Igd3JpdGluZyBvciBhcHBlbmRpbmcpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtdXN0IGhhdmUgZXhhY3RseSBvbmUgb2YgcmVhZC93cml0ZS9hcHBlbmQgbW9kZSIpCisgICAgaWYgYmluYXJ5IGFuZCBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYmluYXJ5IG1vZGUgZG9lc24ndCB0YWtlIGFuIGVuY29kaW5nIGFyZ3VtZW50IikKKyAgICBpZiBiaW5hcnkgYW5kIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYmluYXJ5IG1vZGUgZG9lc24ndCB0YWtlIGFuIGVycm9ycyBhcmd1bWVudCIpCisgICAgaWYgYmluYXJ5IGFuZCBuZXdsaW5lIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiaW5hcnkgbW9kZSBkb2Vzbid0IHRha2UgYSBuZXdsaW5lIGFyZ3VtZW50IikKKyAgICByYXcgPSBGaWxlSU8oZmlsZSwKKyAgICAgICAgICAgICAgICAgKHJlYWRpbmcgYW5kICJyIiBvciAiIikgKworICAgICAgICAgICAgICAgICAod3JpdGluZyBhbmQgInciIG9yICIiKSArCisgICAgICAgICAgICAgICAgIChhcHBlbmRpbmcgYW5kICJhIiBvciAiIikgKworICAgICAgICAgICAgICAgICAodXBkYXRpbmcgYW5kICIrIiBvciAiIiksCisgICAgICAgICAgICAgICAgIGNsb3NlZmQpCisgICAgbGluZV9idWZmZXJpbmcgPSBGYWxzZQorICAgIGlmIGJ1ZmZlcmluZyA9PSAxIG9yIGJ1ZmZlcmluZyA8IDAgYW5kIHJhdy5pc2F0dHkoKToKKyAgICAgICAgYnVmZmVyaW5nID0gLTEKKyAgICAgICAgbGluZV9idWZmZXJpbmcgPSBUcnVlCisgICAgaWYgYnVmZmVyaW5nIDwgMDoKKyAgICAgICAgYnVmZmVyaW5nID0gREVGQVVMVF9CVUZGRVJfU0laRQorICAgICAgICB0cnk6CisgICAgICAgICAgICBicyA9IG9zLmZzdGF0KHJhdy5maWxlbm8oKSkuc3RfYmxrc2l6ZQorICAgICAgICBleGNlcHQgKG9zLmVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBicyA+IDE6CisgICAgICAgICAgICAgICAgYnVmZmVyaW5nID0gYnMKKyAgICBpZiBidWZmZXJpbmcgPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGJ1ZmZlcmluZyBzaXplIikKKyAgICBpZiBidWZmZXJpbmcgPT0gMDoKKyAgICAgICAgaWYgYmluYXJ5OgorICAgICAgICAgICAgcmV0dXJuIHJhdworICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjYW4ndCBoYXZlIHVuYnVmZmVyZWQgdGV4dCBJL08iKQorICAgIGlmIHVwZGF0aW5nOgorICAgICAgICBidWZmZXIgPSBCdWZmZXJlZFJhbmRvbShyYXcsIGJ1ZmZlcmluZykKKyAgICBlbGlmIHdyaXRpbmcgb3IgYXBwZW5kaW5nOgorICAgICAgICBidWZmZXIgPSBCdWZmZXJlZFdyaXRlcihyYXcsIGJ1ZmZlcmluZykKKyAgICBlbGlmIHJlYWRpbmc6CisgICAgICAgIGJ1ZmZlciA9IEJ1ZmZlcmVkUmVhZGVyKHJhdywgYnVmZmVyaW5nKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gbW9kZTogJXIiICUgbW9kZSkKKyAgICBpZiBiaW5hcnk6CisgICAgICAgIHJldHVybiBidWZmZXIKKyAgICB0ZXh0ID0gVGV4dElPV3JhcHBlcihidWZmZXIsIGVuY29kaW5nLCBlcnJvcnMsIG5ld2xpbmUsIGxpbmVfYnVmZmVyaW5nKQorICAgIHRleHQubW9kZSA9IG1vZGUKKyAgICByZXR1cm4gdGV4dAorCisKK2NsYXNzIERvY0Rlc2NyaXB0b3I6CisgICAgIiIiSGVscGVyIGZvciBidWlsdGlucy5vcGVuLl9fZG9jX18KKyAgICAiIiIKKyAgICBkZWYgX19nZXRfXyhzZWxmLCBvYmosIHR5cCk6CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAib3BlbihmaWxlLCBtb2RlPSdyJywgYnVmZmVyaW5nPS0xLCBlbmNvZGluZz1Ob25lLCAiCisgICAgICAgICAgICAgICAgICJlcnJvcnM9Tm9uZSwgbmV3bGluZT1Ob25lLCBjbG9zZWZkPVRydWUpXG5cbiIgKworICAgICAgICAgICAgb3Blbi5fX2RvY19fKQorCitjbGFzcyBPcGVuV3JhcHBlcjoKKyAgICAiIiJXcmFwcGVyIGZvciBidWlsdGlucy5vcGVuCisKKyAgICBUcmljayBzbyB0aGF0IG9wZW4gd29uJ3QgYmVjb21lIGEgYm91bmQgbWV0aG9kIHdoZW4gc3RvcmVkCisgICAgYXMgYSBjbGFzcyB2YXJpYWJsZSAoYXMgZGJtLmR1bWIgZG9lcykuCisKKyAgICBTZWUgaW5pdHN0ZGlvKCkgaW4gUHl0aG9uL3B5dGhvbnJ1bi5jLgorICAgICIiIgorICAgIF9fZG9jX18gPSBEb2NEZXNjcmlwdG9yKCkKKworICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIG9wZW4oKmFyZ3MsICoqa3dhcmdzKQorCisKK2NsYXNzIFVuc3VwcG9ydGVkT3BlcmF0aW9uKFZhbHVlRXJyb3IsIElPRXJyb3IpOgorICAgIHBhc3MKKworCitjbGFzcyBJT0Jhc2U6CisgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisKKyAgICAiIiJUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIEkvTyBjbGFzc2VzLCBhY3Rpbmcgb24gc3RyZWFtcyBvZgorICAgIGJ5dGVzLiBUaGVyZSBpcyBubyBwdWJsaWMgY29uc3RydWN0b3IuCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGR1bW15IGltcGxlbWVudGF0aW9ucyBmb3IgbWFueSBtZXRob2RzIHRoYXQKKyAgICBkZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHNlbGVjdGl2ZWx5OyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMKKyAgICByZXByZXNlbnQgYSBmaWxlIHRoYXQgY2Fubm90IGJlIHJlYWQsIHdyaXR0ZW4gb3Igc2Vla2VkLgorCisgICAgRXZlbiB0aG91Z2ggSU9CYXNlIGRvZXMgbm90IGRlY2xhcmUgcmVhZCwgcmVhZGludG8sIG9yIHdyaXRlIGJlY2F1c2UKKyAgICB0aGVpciBzaWduYXR1cmVzIHdpbGwgdmFyeSwgaW1wbGVtZW50YXRpb25zIGFuZCBjbGllbnRzIHNob3VsZAorICAgIGNvbnNpZGVyIHRob3NlIG1ldGhvZHMgcGFydCBvZiB0aGUgaW50ZXJmYWNlLiBBbHNvLCBpbXBsZW1lbnRhdGlvbnMKKyAgICBtYXkgcmFpc2UgYSBJT0Vycm9yIHdoZW4gb3BlcmF0aW9ucyB0aGV5IGRvIG5vdCBzdXBwb3J0IGFyZSBjYWxsZWQuCisKKyAgICBUaGUgYmFzaWMgdHlwZSB1c2VkIGZvciBiaW5hcnkgZGF0YSByZWFkIGZyb20gb3Igd3JpdHRlbiB0byBhIGZpbGUgaXMKKyAgICBieXRlcy4gYnl0ZWFycmF5cyBhcmUgYWNjZXB0ZWQgdG9vLCBhbmQgaW4gc29tZSBjYXNlcyAoc3VjaCBhcworICAgIHJlYWRpbnRvKSBuZWVkZWQuIFRleHQgSS9PIGNsYXNzZXMgd29yayB3aXRoIHN0ciBkYXRhLgorCisgICAgTm90ZSB0aGF0IGNhbGxpbmcgYW55IG1ldGhvZCAoZXZlbiBpbnF1aXJpZXMpIG9uIGEgY2xvc2VkIHN0cmVhbSBpcworICAgIHVuZGVmaW5lZC4gSW1wbGVtZW50YXRpb25zIG1heSByYWlzZSBJT0Vycm9yIGluIHRoaXMgY2FzZS4KKworICAgIElPQmFzZSAoYW5kIGl0cyBzdWJjbGFzc2VzKSBzdXBwb3J0IHRoZSBpdGVyYXRvciBwcm90b2NvbCwgbWVhbmluZworICAgIHRoYXQgYW4gSU9CYXNlIG9iamVjdCBjYW4gYmUgaXRlcmF0ZWQgb3ZlciB5aWVsZGluZyB0aGUgbGluZXMgaW4gYQorICAgIHN0cmVhbS4KKworICAgIElPQmFzZSBhbHNvIHN1cHBvcnRzIHRoZSA6a2V5d29yZDpgd2l0aGAgc3RhdGVtZW50LiBJbiB0aGlzIGV4YW1wbGUsCisgICAgZnAgaXMgY2xvc2VkIGFmdGVyIHRoZSBzdWl0ZSBvZiB0aGUgd2l0aCBzdGF0ZW1lbnQgaXMgY29tcGxldGU6CisKKyAgICB3aXRoIG9wZW4oJ3NwYW0udHh0JywgJ3InKSBhcyBmcDoKKyAgICAgICAgZnAud3JpdGUoJ1NwYW0gYW5kIGVnZ3MhJykKKyAgICAiIiIKKworICAgICMjIyBJbnRlcm5hbCAjIyMKKworICAgIGRlZiBfdW5zdXBwb3J0ZWQoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkludGVybmFsOiByYWlzZSBhbiBleGNlcHRpb24gZm9yIHVuc3VwcG9ydGVkIG9wZXJhdGlvbnMuIiIiCisgICAgICAgIHJhaXNlIFVuc3VwcG9ydGVkT3BlcmF0aW9uKCIlcy4lcygpIG5vdCBzdXBwb3J0ZWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBuYW1lKSkKKworICAgICMjIyBQb3NpdGlvbmluZyAjIyMKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICAiIiJDaGFuZ2Ugc3RyZWFtIHBvc2l0aW9uLgorCisgICAgICAgIENoYW5nZSB0aGUgc3RyZWFtIHBvc2l0aW9uIHRvIGJ5dGUgb2Zmc2V0IHBvcy4gQXJndW1lbnQgcG9zIGlzCisgICAgICAgIGludGVycHJldGVkIHJlbGF0aXZlIHRvIHRoZSBwb3NpdGlvbiBpbmRpY2F0ZWQgYnkgd2hlbmNlLiAgVmFsdWVzCisgICAgICAgIGZvciB3aGVuY2UgYXJlOgorCisgICAgICAgICogMCAtLSBzdGFydCBvZiBzdHJlYW0gKHRoZSBkZWZhdWx0KTsgb2Zmc2V0IHNob3VsZCBiZSB6ZXJvIG9yIHBvc2l0aXZlCisgICAgICAgICogMSAtLSBjdXJyZW50IHN0cmVhbSBwb3NpdGlvbjsgb2Zmc2V0IG1heSBiZSBuZWdhdGl2ZQorICAgICAgICAqIDIgLS0gZW5kIG9mIHN0cmVhbTsgb2Zmc2V0IGlzIHVzdWFsbHkgbmVnYXRpdmUKKworICAgICAgICBSZXR1cm4gdGhlIG5ldyBhYnNvbHV0ZSBwb3NpdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJzZWVrIikKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gY3VycmVudCBzdHJlYW0gcG9zaXRpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNlZWsoMCwgMSkKKworICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBwb3M9Tm9uZSk6CisgICAgICAgICIiIlRydW5jYXRlIGZpbGUgdG8gc2l6ZSBieXRlcy4KKworICAgICAgICBTaXplIGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IElPIHBvc2l0aW9uIGFzIHJlcG9ydGVkIGJ5IHRlbGwoKS4gIFJldHVybgorICAgICAgICB0aGUgbmV3IHNpemUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgidHJ1bmNhdGUiKQorCisgICAgIyMjIEZsdXNoIGFuZCBjbG9zZSAjIyMKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiRmx1c2ggd3JpdGUgYnVmZmVycywgaWYgYXBwbGljYWJsZS4KKworICAgICAgICBUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgcmVhZC1vbmx5IGFuZCBub24tYmxvY2tpbmcgc3RyZWFtcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrQ2xvc2VkKCkKKyAgICAgICAgIyBYWFggU2hvdWxkIHRoaXMgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbj8/PworCisgICAgX19jbG9zZWQgPSBGYWxzZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbmQgY2xvc2UgdGhlIElPIG9iamVjdC4KKworICAgICAgICBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGlmIHRoZSBmaWxlIGlzIGFscmVhZHkgY2xvc2VkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX19jbG9zZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuX19jbG9zZWQgPSBUcnVlCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgIiIiRGVzdHJ1Y3Rvci4gIENhbGxzIGNsb3NlKCkuIiIiCisgICAgICAgICMgVGhlIHRyeS9leGNlcHQgYmxvY2sgaXMgaW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBhdCBwcm9ncmFtCisgICAgICAgICMgZXhpdCB0aW1lLCB3aGVuIGl0J3MgcG9zc2libGUgdGhhdCBnbG9iYWxzIGhhdmUgYWxyZWFkeSBiZWVuCisgICAgICAgICMgZGVsZXRlZCwgYW5kIHRoZW4gdGhlIGNsb3NlKCkgY2FsbCBtaWdodCBmYWlsLiAgU2luY2UKKyAgICAgICAgIyB0aGVyZSdzIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHN1Y2ggZmFpbHVyZXMgYW5kIHRoZXkgYW5ub3kKKyAgICAgICAgIyB0aGUgZW5kIHVzZXJzLCB3ZSBzdXBwcmVzcyB0aGUgdHJhY2ViYWNrLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgIyMjIElucXVpcmllcyAjIyMKKworICAgIGRlZiBzZWVrYWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgb2JqZWN0IHN1cHBvcnRzIHJhbmRvbSBhY2Nlc3MuCisKKyAgICAgICAgSWYgRmFsc2UsIHNlZWsoKSwgdGVsbCgpIGFuZCB0cnVuY2F0ZSgpIHdpbGwgcmFpc2UgSU9FcnJvci4KKyAgICAgICAgVGhpcyBtZXRob2QgbWF5IG5lZWQgdG8gZG8gYSB0ZXN0IHNlZWsoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9jaGVja1NlZWthYmxlKHNlbGYsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJhaXNlIGFuIElPRXJyb3IgaWYgZmlsZSBpcyBub3Qgc2Vla2FibGUKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnNlZWthYmxlKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJGaWxlIG9yIHN0cmVhbSBpcyBub3Qgc2Vla2FibGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtc2cgaXMgTm9uZSBlbHNlIG1zZykKKworCisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2hldGhlciBvYmplY3Qgd2FzIG9wZW5lZCBmb3IgcmVhZGluZy4KKworICAgICAgICBJZiBGYWxzZSwgcmVhZCgpIHdpbGwgcmFpc2UgSU9FcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9jaGVja1JlYWRhYmxlKHNlbGYsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJhaXNlIGFuIElPRXJyb3IgaWYgZmlsZSBpcyBub3QgcmVhZGFibGUKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnJlYWRhYmxlKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJGaWxlIG9yIHN0cmVhbSBpcyBub3QgcmVhZGFibGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtc2cgaXMgTm9uZSBlbHNlIG1zZykKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgb2JqZWN0IHdhcyBvcGVuZWQgZm9yIHdyaXRpbmcuCisKKyAgICAgICAgSWYgRmFsc2UsIHdyaXRlKCkgYW5kIHRydW5jYXRlKCkgd2lsbCByYWlzZSBJT0Vycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX2NoZWNrV3JpdGFibGUoc2VsZiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJJbnRlcm5hbDogcmFpc2UgYW4gSU9FcnJvciBpZiBmaWxlIGlzIG5vdCB3cml0YWJsZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYud3JpdGFibGUoKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkZpbGUgb3Igc3RyZWFtIGlzIG5vdCB3cml0YWJsZS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1zZyBpcyBOb25lIGVsc2UgbXNnKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNsb3NlZChzZWxmKToKKyAgICAgICAgIiIiY2xvc2VkOiBib29sLiAgVHJ1ZSBpZmYgdGhlIGZpbGUgaGFzIGJlZW4gY2xvc2VkLgorCisgICAgICAgIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhpcyBpcyBhIHByb3BlcnR5LCBub3QgYSBwcmVkaWNhdGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX2Nsb3NlZAorCisgICAgZGVmIF9jaGVja0Nsb3NlZChzZWxmLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkludGVybmFsOiByYWlzZSBhbiBWYWx1ZUVycm9yIGlmIGZpbGUgaXMgY2xvc2VkCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtc2cgaXMgTm9uZSBlbHNlIG1zZykKKworICAgICMjIyBDb250ZXh0IG1hbmFnZXIgIyMjCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAiIiJDb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wuICBSZXR1cm5zIHNlbGYuIiIiCisgICAgICAgIHNlbGYuX2NoZWNrQ2xvc2VkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkNvbnRleHQgbWFuYWdlbWVudCBwcm90b2NvbC4gIENhbGxzIGNsb3NlKCkiIiIKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICAjIyMgTG93ZXItbGV2ZWwgQVBJcyAjIyMKKworICAgICMgWFhYIFNob3VsZCB0aGVzZSBiZSBwcmVzZW50IGV2ZW4gaWYgdW5pbXBsZW1lbnRlZD8KKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3IgaWYgb25lIGV4aXN0cy4KKworICAgICAgICBBbiBJT0Vycm9yIGlzIHJhaXNlZCBpZiB0aGUgSU8gb2JqZWN0IGRvZXMgbm90IHVzZSBhIGZpbGUgZGVzY3JpcHRvci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJmaWxlbm8iKQorCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhbiAnaW50ZXJhY3RpdmUnIHN0cmVhbS4KKworICAgICAgICBSZXR1cm4gRmFsc2UgaWYgaXQgY2FuJ3QgYmUgZGV0ZXJtaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrQ2xvc2VkKCkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIyMgUmVhZGxpbmVbc10gYW5kIHdyaXRlbGluZXMgIyMjCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGltaXQ9LTEpOgorICAgICAgICByIiIiUmVhZCBhbmQgcmV0dXJuIGEgbGluZSBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSWYgbGltaXQgaXMgc3BlY2lmaWVkLCBhdCBtb3N0IGxpbWl0IGJ5dGVzIHdpbGwgYmUgcmVhZC4KKworICAgICAgICBUaGUgbGluZSB0ZXJtaW5hdG9yIGlzIGFsd2F5cyBiJ1xuJyBmb3IgYmluYXJ5IGZpbGVzOyBmb3IgdGV4dAorICAgICAgICBmaWxlcywgdGhlIG5ld2xpbmVzIGFyZ3VtZW50IHRvIG9wZW4gY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZSBsaW5lCisgICAgICAgIHRlcm1pbmF0b3IocykgcmVjb2duaXplZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBhIChzbG93aXNoKSByZWFkbGluZSgpLgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJwZWVrIik6CisgICAgICAgICAgICBkZWYgbnJlYWRhaGVhZCgpOgorICAgICAgICAgICAgICAgIHJlYWRhaGVhZCA9IHNlbGYucGVlaygxKQorICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkYWhlYWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICAgICAgbiA9IChyZWFkYWhlYWQuZmluZChiIlxuIikgKyAxKSBvciBsZW4ocmVhZGFoZWFkKQorICAgICAgICAgICAgICAgIGlmIGxpbWl0ID49IDA6CisgICAgICAgICAgICAgICAgICAgIG4gPSBtaW4obiwgbGltaXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlZiBucmVhZGFoZWFkKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgaWYgbGltaXQgaXMgTm9uZToKKyAgICAgICAgICAgIGxpbWl0ID0gLTEKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShsaW1pdCwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIiKQorICAgICAgICByZXMgPSBieXRlYXJyYXkoKQorICAgICAgICB3aGlsZSBsaW1pdCA8IDAgb3IgbGVuKHJlcykgPCBsaW1pdDoKKyAgICAgICAgICAgIGIgPSBzZWxmLnJlYWQobnJlYWRhaGVhZCgpKQorICAgICAgICAgICAgaWYgbm90IGI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHJlcyArPSBiCisgICAgICAgICAgICBpZiByZXMuZW5kc3dpdGgoYiJcbiIpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBieXRlcyhyZXMpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrQ2xvc2VkKCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICByZXR1cm4gbGluZQorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBoaW50PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGxpbmVzIGZyb20gdGhlIHN0cmVhbS4KKworICAgICAgICBoaW50IGNhbiBiZSBzcGVjaWZpZWQgdG8gY29udHJvbCB0aGUgbnVtYmVyIG9mIGxpbmVzIHJlYWQ6IG5vIG1vcmUKKyAgICAgICAgbGluZXMgd2lsbCBiZSByZWFkIGlmIHRoZSB0b3RhbCBzaXplIChpbiBieXRlcy9jaGFyYWN0ZXJzKSBvZiBhbGwKKyAgICAgICAgbGluZXMgc28gZmFyIGV4Y2VlZHMgaGludC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGhpbnQgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKGhpbnQsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiaW50ZWdlciBvciBOb25lIGV4cGVjdGVkIikKKyAgICAgICAgaWYgaGludCBpcyBOb25lIG9yIGhpbnQgPD0gMDoKKyAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCisgICAgICAgIG4gPSAwCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZjoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgbiArPSBsZW4obGluZSkKKyAgICAgICAgICAgIGlmIG4gPj0gaGludDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gbGluZXMKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGxpbmVzKToKKyAgICAgICAgc2VsZi5fY2hlY2tDbG9zZWQoKQorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIHNlbGYud3JpdGUobGluZSkKKworaW8uSU9CYXNlLnJlZ2lzdGVyKElPQmFzZSkKKworCitjbGFzcyBSYXdJT0Jhc2UoSU9CYXNlKToKKworICAgICIiIkJhc2UgY2xhc3MgZm9yIHJhdyBiaW5hcnkgSS9PLiIiIgorCisgICAgIyBUaGUgcmVhZCgpIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBieSBjYWxsaW5nIHJlYWRpbnRvKCk7IGRlcml2ZWQKKyAgICAjIGNsYXNzZXMgdGhhdCB3YW50IHRvIHN1cHBvcnQgcmVhZCgpIG9ubHkgbmVlZCB0byBpbXBsZW1lbnQKKyAgICAjIHJlYWRpbnRvKCkgYXMgYSBwcmltaXRpdmUgb3BlcmF0aW9uLiAgSW4gZ2VuZXJhbCwgcmVhZGludG8oKSBjYW4gYmUKKyAgICAjIG1vcmUgZWZmaWNpZW50IHRoYW4gcmVhZCgpLgorCisgICAgIyAoSXQgd291bGQgYmUgdGVtcHRpbmcgdG8gYWxzbyBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgIyByZWFkaW50bygpIGluIHRlcm1zIG9mIHJlYWQoKSwgaW4gY2FzZSB0aGUgbGF0dGVyIGlzIGEgbW9yZSBzdWl0YWJsZQorICAgICMgcHJpbWl0aXZlIG9wZXJhdGlvbiwgYnV0IHRoYXQgd291bGQgbGVhZCB0byBuYXN0eSByZWN1cnNpb24gaW4gY2FzZQorICAgICMgYSBzdWJjbGFzcyBkb2Vzbid0IGltcGxlbWVudCBlaXRoZXIuKQorCisgICAgZGVmIHJlYWQoc2VsZiwgbj0tMSk6CisgICAgICAgICIiIlJlYWQgYW5kIHJldHVybiB1cCB0byBuIGJ5dGVzLgorCisgICAgICAgIFJldHVybnMgYW4gZW1wdHkgYnl0ZXMgb2JqZWN0IG9uIEVPRiwgb3IgTm9uZSBpZiB0aGUgb2JqZWN0IGlzCisgICAgICAgIHNldCBub3QgdG8gYmxvY2sgYW5kIGhhcyBubyBkYXRhIHRvIHJlYWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICBuID0gLTEKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWFkYWxsKCkKKyAgICAgICAgYiA9IGJ5dGVhcnJheShuLl9faW5kZXhfXygpKQorICAgICAgICBuID0gc2VsZi5yZWFkaW50byhiKQorICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBkZWwgYltuOl0KKyAgICAgICAgcmV0dXJuIGJ5dGVzKGIpCisKKyAgICBkZWYgcmVhZGFsbChzZWxmKToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBFT0YsIHVzaW5nIG11bHRpcGxlIHJlYWQoKSBjYWxsLiIiIgorICAgICAgICByZXMgPSBieXRlYXJyYXkoKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVhZChERUZBVUxUX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHJlcyArPSBkYXRhCisgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgIHJldHVybiBieXRlcyhyZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGInJyBvciBOb25lCisgICAgICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHJlYWRpbnRvKHNlbGYsIGIpOgorICAgICAgICAiIiJSZWFkIHVwIHRvIGxlbihiKSBieXRlcyBpbnRvIGIuCisKKyAgICAgICAgUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCAoMCBmb3IgRU9GKSwgb3IgTm9uZSBpZiB0aGUgb2JqZWN0CisgICAgICAgIGlzIHNldCBub3QgdG8gYmxvY2sgYW5kIGhhcyBubyBkYXRhIHRvIHJlYWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgicmVhZGludG8iKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGIpOgorICAgICAgICAiIiJXcml0ZSB0aGUgZ2l2ZW4gYnVmZmVyIHRvIHRoZSBJTyBzdHJlYW0uCisKKyAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIHdoaWNoIG1heSBiZSBsZXNzIHRoYW4gbGVuKGIpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoIndyaXRlIikKKworaW8uUmF3SU9CYXNlLnJlZ2lzdGVyKFJhd0lPQmFzZSkKK2Zyb20gX2lvIGltcG9ydCBGaWxlSU8KK1Jhd0lPQmFzZS5yZWdpc3RlcihGaWxlSU8pCisKKworY2xhc3MgQnVmZmVyZWRJT0Jhc2UoSU9CYXNlKToKKworICAgICIiIkJhc2UgY2xhc3MgZm9yIGJ1ZmZlcmVkIElPIG9iamVjdHMuCisKKyAgICBUaGUgbWFpbiBkaWZmZXJlbmNlIHdpdGggUmF3SU9CYXNlIGlzIHRoYXQgdGhlIHJlYWQoKSBtZXRob2QKKyAgICBzdXBwb3J0cyBvbWl0dGluZyB0aGUgc2l6ZSBhcmd1bWVudCwgYW5kIGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0CisgICAgaW1wbGVtZW50YXRpb24gdGhhdCBkZWZlcnMgdG8gcmVhZGludG8oKS4KKworICAgIEluIGFkZGl0aW9uLCByZWFkKCksIHJlYWRpbnRvKCkgYW5kIHdyaXRlKCkgbWF5IHJhaXNlCisgICAgQmxvY2tpbmdJT0Vycm9yIGlmIHRoZSB1bmRlcmx5aW5nIHJhdyBzdHJlYW0gaXMgaW4gbm9uLWJsb2NraW5nCisgICAgbW9kZSBhbmQgbm90IHJlYWR5OyB1bmxpa2UgdGhlaXIgcmF3IGNvdW50ZXJwYXJ0cywgdGhleSB3aWxsIG5ldmVyCisgICAgcmV0dXJuIE5vbmUuCisKKyAgICBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gc2hvdWxkIG5vdCBpbmhlcml0IGZyb20gYSBSYXdJT0Jhc2UKKyAgICBpbXBsZW1lbnRhdGlvbiwgYnV0IHdyYXAgb25lLgorICAgICIiIgorCisgICAgZGVmIHJlYWQoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBhbmQgcmV0dXJuIHVwIHRvIG4gYnl0ZXMuCisKKyAgICAgICAgSWYgdGhlIGFyZ3VtZW50IGlzIG9taXR0ZWQsIE5vbmUsIG9yIG5lZ2F0aXZlLCByZWFkcyBhbmQKKyAgICAgICAgcmV0dXJucyBhbGwgZGF0YSB1bnRpbCBFT0YuCisKKyAgICAgICAgSWYgdGhlIGFyZ3VtZW50IGlzIHBvc2l0aXZlLCBhbmQgdGhlIHVuZGVybHlpbmcgcmF3IHN0cmVhbSBpcworICAgICAgICBub3QgJ2ludGVyYWN0aXZlJywgbXVsdGlwbGUgcmF3IHJlYWRzIG1heSBiZSBpc3N1ZWQgdG8gc2F0aXNmeQorICAgICAgICB0aGUgYnl0ZSBjb3VudCAodW5sZXNzIEVPRiBpcyByZWFjaGVkIGZpcnN0KS4gIEJ1dCBmb3IKKyAgICAgICAgaW50ZXJhY3RpdmUgcmF3IHN0cmVhbXMgKFhYWCBhbmQgZm9yIHBpcGVzPyksIGF0IG1vc3Qgb25lIHJhdworICAgICAgICByZWFkIHdpbGwgYmUgaXNzdWVkLCBhbmQgYSBzaG9ydCByZXN1bHQgZG9lcyBub3QgaW1wbHkgdGhhdAorICAgICAgICBFT0YgaXMgaW1taW5lbnQuCisKKyAgICAgICAgUmV0dXJucyBhbiBlbXB0eSBieXRlcyBhcnJheSBvbiBFT0YuCisKKyAgICAgICAgUmFpc2VzIEJsb2NraW5nSU9FcnJvciBpZiB0aGUgdW5kZXJseWluZyByYXcgc3RyZWFtIGhhcyBubworICAgICAgICBkYXRhIGF0IHRoZSBtb21lbnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgicmVhZCIpCisKKyAgICBkZWYgcmVhZDEoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBuIGJ5dGVzIHdpdGggYXQgbW9zdCBvbmUgcmVhZCgpIHN5c3RlbSBjYWxsLiIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgicmVhZDEiKQorCisgICAgZGVmIHJlYWRpbnRvKHNlbGYsIGIpOgorICAgICAgICAiIiJSZWFkIHVwIHRvIGxlbihiKSBieXRlcyBpbnRvIGIuCisKKyAgICAgICAgTGlrZSByZWFkKCksIHRoaXMgbWF5IGlzc3VlIG11bHRpcGxlIHJlYWRzIHRvIHRoZSB1bmRlcmx5aW5nIHJhdworICAgICAgICBzdHJlYW0sIHVubGVzcyB0aGUgbGF0dGVyIGlzICdpbnRlcmFjdGl2ZScuCisKKyAgICAgICAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgKDAgZm9yIEVPRikuCisKKyAgICAgICAgUmFpc2VzIEJsb2NraW5nSU9FcnJvciBpZiB0aGUgdW5kZXJseWluZyByYXcgc3RyZWFtIGhhcyBubworICAgICAgICBkYXRhIGF0IHRoZSBtb21lbnQuCisgICAgICAgICIiIgorICAgICAgICAjIFhYWCBUaGlzIG91Z2h0IHRvIHdvcmsgd2l0aCBhbnl0aGluZyB0aGF0IHN1cHBvcnRzIHRoZSBidWZmZXIgQVBJCisgICAgICAgIGRhdGEgPSBzZWxmLnJlYWQobGVuKGIpKQorICAgICAgICBuID0gbGVuKGRhdGEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJbOm5dID0gZGF0YQorICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGVycjoKKyAgICAgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYiwgYXJyYXkuYXJyYXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycgorICAgICAgICAgICAgYls6bl0gPSBhcnJheS5hcnJheShiJ2InLCBkYXRhKQorICAgICAgICByZXR1cm4gbgorCisgICAgZGVmIHdyaXRlKHNlbGYsIGIpOgorICAgICAgICAiIiJXcml0ZSB0aGUgZ2l2ZW4gYnVmZmVyIHRvIHRoZSBJTyBzdHJlYW0uCisKKyAgICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgd2hpY2ggaXMgbmV2ZXIgbGVzcyB0aGFuCisgICAgICAgIGxlbihiKS4KKworICAgICAgICBSYWlzZXMgQmxvY2tpbmdJT0Vycm9yIGlmIHRoZSBidWZmZXIgaXMgZnVsbCBhbmQgdGhlCisgICAgICAgIHVuZGVybHlpbmcgcmF3IHN0cmVhbSBjYW5ub3QgYWNjZXB0IG1vcmUgZGF0YSBhdCB0aGUgbW9tZW50LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoIndyaXRlIikKKworICAgIGRlZiBkZXRhY2goc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZXBhcmF0ZSB0aGUgdW5kZXJseWluZyByYXcgc3RyZWFtIGZyb20gdGhlIGJ1ZmZlciBhbmQgcmV0dXJuIGl0LgorCisgICAgICAgIEFmdGVyIHRoZSByYXcgc3RyZWFtIGhhcyBiZWVuIGRldGFjaGVkLCB0aGUgYnVmZmVyIGlzIGluIGFuIHVudXNhYmxlCisgICAgICAgIHN0YXRlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoImRldGFjaCIpCisKK2lvLkJ1ZmZlcmVkSU9CYXNlLnJlZ2lzdGVyKEJ1ZmZlcmVkSU9CYXNlKQorCisKK2NsYXNzIF9CdWZmZXJlZElPTWl4aW4oQnVmZmVyZWRJT0Jhc2UpOgorCisgICAgIiIiQSBtaXhpbiBpbXBsZW1lbnRhdGlvbiBvZiBCdWZmZXJlZElPQmFzZSB3aXRoIGFuIHVuZGVybHlpbmcgcmF3IHN0cmVhbS4KKworICAgIFRoaXMgcGFzc2VzIG1vc3QgcmVxdWVzdHMgb24gdG8gdGhlIHVuZGVybHlpbmcgcmF3IHN0cmVhbS4gIEl0CisgICAgZG9lcyAqbm90KiBwcm92aWRlIGltcGxlbWVudGF0aW9ucyBvZiByZWFkKCksIHJlYWRpbnRvKCkgb3IKKyAgICB3cml0ZSgpLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJhdyk6CisgICAgICAgIHNlbGYuX3JhdyA9IHJhdworCisgICAgIyMjIFBvc2l0aW9uaW5nICMjIworCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9MCk6CisgICAgICAgIG5ld19wb3NpdGlvbiA9IHNlbGYucmF3LnNlZWsocG9zLCB3aGVuY2UpCisgICAgICAgIGlmIG5ld19wb3NpdGlvbiA8IDA6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJzZWVrKCkgcmV0dXJuZWQgYW4gaW52YWxpZCBwb3NpdGlvbiIpCisgICAgICAgIHJldHVybiBuZXdfcG9zaXRpb24KKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICBwb3MgPSBzZWxmLnJhdy50ZWxsKCkKKyAgICAgICAgaWYgcG9zIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoInRlbGwoKSByZXR1cm5lZCBhbiBpbnZhbGlkIHBvc2l0aW9uIikKKyAgICAgICAgcmV0dXJuIHBvcworCisgICAgZGVmIHRydW5jYXRlKHNlbGYsIHBvcz1Ob25lKToKKyAgICAgICAgIyBGbHVzaCB0aGUgc3RyZWFtLiAgV2UncmUgbWl4aW5nIGJ1ZmZlcmVkIEkvTyB3aXRoIGxvd2VyLWxldmVsIEkvTywKKyAgICAgICAgIyBhbmQgYSBmbHVzaCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHN5bmNoIGJvdGggdmlld3Mgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgIyBmaWxlIHN0YXRlLgorICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgICAgICBpZiBwb3MgaXMgTm9uZToKKyAgICAgICAgICAgIHBvcyA9IHNlbGYudGVsbCgpCisgICAgICAgICMgWFhYOiBTaG91bGQgc2VlaygpIGJlIHVzZWQsIGluc3RlYWQgb2YgcGFzc2luZyB0aGUgcG9zaXRpb24KKyAgICAgICAgIyBYWFggIGRpcmVjdGx5IHRvIHRydW5jYXRlPworICAgICAgICByZXR1cm4gc2VsZi5yYXcudHJ1bmNhdGUocG9zKQorCisgICAgIyMjIEZsdXNoIGFuZCBjbG9zZSAjIyMKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmbHVzaCBvZiBjbG9zZWQgZmlsZSIpCisgICAgICAgIHNlbGYucmF3LmZsdXNoKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5yYXcgaXMgbm90IE5vbmUgYW5kIG5vdCBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIG1heSByYWlzZSBCbG9ja2luZ0lPRXJyb3Igb3IgQnJva2VuUGlwZUVycm9yIGV0YworICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLnJhdy5jbG9zZSgpCisKKyAgICBkZWYgZGV0YWNoKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJhdyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmF3IHN0cmVhbSBhbHJlYWR5IGRldGFjaGVkIikKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHJhdyA9IHNlbGYuX3JhdworICAgICAgICBzZWxmLl9yYXcgPSBOb25lCisgICAgICAgIHJldHVybiByYXcKKworICAgICMjIyBJbnF1aXJpZXMgIyMjCisKKyAgICBkZWYgc2Vla2FibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJhdy5zZWVrYWJsZSgpCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJhdy5yZWFkYWJsZSgpCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJhdy53cml0YWJsZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcmF3KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmF3CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yYXcuY2xvc2VkCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmF3Lm5hbWUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBtb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yYXcubW9kZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBjbHNuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIjxfcHlpby57MH0+Ii5mb3JtYXQoY2xzbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiPF9weWlvLnswfSBuYW1lPXsxIXJ9PiIuZm9ybWF0KGNsc25hbWUsIG5hbWUpCisKKyAgICAjIyMgTG93ZXItbGV2ZWwgQVBJcyAjIyMKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnJhdy5maWxlbm8oKQorCisgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmF3LmlzYXR0eSgpCisKKworY2xhc3MgQnl0ZXNJTyhCdWZmZXJlZElPQmFzZSk6CisKKyAgICAiIiJCdWZmZXJlZCBJL08gaW1wbGVtZW50YXRpb24gdXNpbmcgYW4gaW4tbWVtb3J5IGJ5dGVzIGJ1ZmZlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbml0aWFsX2J5dGVzPU5vbmUpOgorICAgICAgICBidWYgPSBieXRlYXJyYXkoKQorICAgICAgICBpZiBpbml0aWFsX2J5dGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYnVmLmV4dGVuZChpbml0aWFsX2J5dGVzKQorICAgICAgICBzZWxmLl9idWZmZXIgPSBidWYKKyAgICAgICAgc2VsZi5fcG9zID0gMAorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJfX2dldHN0YXRlX18gb24gY2xvc2VkIGZpbGUiKQorICAgICAgICByZXR1cm4gc2VsZi5fX2RpY3RfXy5jb3B5KCkKKworICAgIGRlZiBnZXR2YWx1ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBieXRlcyB2YWx1ZSAoY29udGVudHMpIG9mIHRoZSBidWZmZXIKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZ2V0dmFsdWUgb24gY2xvc2VkIGZpbGUiKQorICAgICAgICByZXR1cm4gYnl0ZXMoc2VsZi5fYnVmZmVyKQorCisgICAgZGVmIHJlYWQoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICBuID0gLTEKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobiwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgezAhcn0iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICB0eXBlKG4pKSkKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICBuID0gbGVuKHNlbGYuX2J1ZmZlcikKKyAgICAgICAgaWYgbGVuKHNlbGYuX2J1ZmZlcikgPD0gc2VsZi5fcG9zOgorICAgICAgICAgICAgcmV0dXJuIGIiIgorICAgICAgICBuZXdwb3MgPSBtaW4obGVuKHNlbGYuX2J1ZmZlciksIHNlbGYuX3BvcyArIG4pCisgICAgICAgIGIgPSBzZWxmLl9idWZmZXJbc2VsZi5fcG9zIDogbmV3cG9zXQorICAgICAgICBzZWxmLl9wb3MgPSBuZXdwb3MKKyAgICAgICAgcmV0dXJuIGJ5dGVzKGIpCisKKyAgICBkZWYgcmVhZDEoc2VsZiwgbik6CisgICAgICAgICIiIlRoaXMgaXMgdGhlIHNhbWUgYXMgcmVhZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnJlYWQobikKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ3cml0ZSB0byBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgdW5pY29kZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbid0IHdyaXRlIHVuaWNvZGUgdG8gYmluYXJ5IHN0cmVhbSIpCisgICAgICAgIG4gPSBsZW4oYikKKyAgICAgICAgaWYgbiA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcG9zID0gc2VsZi5fcG9zCisgICAgICAgIGlmIHBvcyA+IGxlbihzZWxmLl9idWZmZXIpOgorICAgICAgICAgICAgIyBJbnNlcnRzIG51bGwgYnl0ZXMgYmV0d2VlbiB0aGUgY3VycmVudCBlbmQgb2YgdGhlIGZpbGUKKyAgICAgICAgICAgICMgYW5kIHRoZSBuZXcgd3JpdGUgcG9zaXRpb24uCisgICAgICAgICAgICBwYWRkaW5nID0gYidceDAwJyAqIChwb3MgLSBsZW4oc2VsZi5fYnVmZmVyKSkKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlciArPSBwYWRkaW5nCisgICAgICAgIHNlbGYuX2J1ZmZlcltwb3M6cG9zICsgbl0gPSBiCisgICAgICAgIHNlbGYuX3BvcyArPSBuCisgICAgICAgIHJldHVybiBuCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT0wKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZWVrIG9uIGNsb3NlZCBmaWxlIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcG9zLl9faW5kZXhfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKQorICAgICAgICBpZiB3aGVuY2UgPT0gMDoKKyAgICAgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibmVnYXRpdmUgc2VlayBwb3NpdGlvbiAlciIgJSAocG9zLCkpCisgICAgICAgICAgICBzZWxmLl9wb3MgPSBwb3MKKyAgICAgICAgZWxpZiB3aGVuY2UgPT0gMToKKyAgICAgICAgICAgIHNlbGYuX3BvcyA9IG1heCgwLCBzZWxmLl9wb3MgKyBwb3MpCisgICAgICAgIGVsaWYgd2hlbmNlID09IDI6CisgICAgICAgICAgICBzZWxmLl9wb3MgPSBtYXgoMCwgbGVuKHNlbGYuX2J1ZmZlcikgKyBwb3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIHdoZW5jZSB2YWx1ZSIpCisgICAgICAgIHJldHVybiBzZWxmLl9wb3MKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRlbGwgb24gY2xvc2VkIGZpbGUiKQorICAgICAgICByZXR1cm4gc2VsZi5fcG9zCisKKyAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgcG9zPU5vbmUpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRydW5jYXRlIG9uIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgcG9zIGlzIE5vbmU6CisgICAgICAgICAgICBwb3MgPSBzZWxmLl9wb3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwb3MuX19pbmRleF9fCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJhbiBpbnRlZ2VyIGlzIHJlcXVpcmVkIikKKyAgICAgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibmVnYXRpdmUgdHJ1bmNhdGUgcG9zaXRpb24gJXIiICUgKHBvcywpKQorICAgICAgICBkZWwgc2VsZi5fYnVmZmVyW3BvczpdCisgICAgICAgIHJldHVybiBwb3MKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlLiIpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZS4iKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNlZWthYmxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUuIikKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBCdWZmZXJlZFJlYWRlcihfQnVmZmVyZWRJT01peGluKToKKworICAgICIiIkJ1ZmZlcmVkUmVhZGVyKHJhd1ssIGJ1ZmZlcl9zaXplXSkKKworICAgIEEgYnVmZmVyIGZvciBhIHJlYWRhYmxlLCBzZXF1ZW50aWFsIEJhc2VSYXdJTyBvYmplY3QuCisKKyAgICBUaGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIEJ1ZmZlcmVkUmVhZGVyIGZvciB0aGUgZ2l2ZW4gcmVhZGFibGUgcmF3CisgICAgc3RyZWFtIGFuZCBidWZmZXJfc2l6ZS4gSWYgYnVmZmVyX3NpemUgaXMgb21pdHRlZCwgREVGQVVMVF9CVUZGRVJfU0laRQorICAgIGlzIHVzZWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmF3LCBidWZmZXJfc2l6ZT1ERUZBVUxUX0JVRkZFUl9TSVpFKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IGJ1ZmZlcmVkIHJlYWRlciB1c2luZyB0aGUgZ2l2ZW4gcmVhZGFibGUgcmF3IElPIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCByYXcucmVhZGFibGUoKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJyYXciIGFyZ3VtZW50IG11c3QgYmUgcmVhZGFibGUuJykKKworICAgICAgICBfQnVmZmVyZWRJT01peGluLl9faW5pdF9fKHNlbGYsIHJhdykKKyAgICAgICAgaWYgYnVmZmVyX3NpemUgPD0gMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgYnVmZmVyIHNpemUiKQorICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemUKKyAgICAgICAgc2VsZi5fcmVzZXRfcmVhZF9idWYoKQorICAgICAgICBzZWxmLl9yZWFkX2xvY2sgPSBMb2NrKCkKKworICAgIGRlZiBfcmVzZXRfcmVhZF9idWYoc2VsZik6CisgICAgICAgIHNlbGYuX3JlYWRfYnVmID0gYiIiCisgICAgICAgIHNlbGYuX3JlYWRfcG9zID0gMAorCisgICAgZGVmIHJlYWQoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBuIGJ5dGVzLgorCisgICAgICAgIFJldHVybnMgZXhhY3RseSBuIGJ5dGVzIG9mIGRhdGEgdW5sZXNzIHRoZSB1bmRlcmx5aW5nIHJhdyBJTworICAgICAgICBzdHJlYW0gcmVhY2hlcyBFT0Ygb3IgaWYgdGhlIGNhbGwgd291bGQgYmxvY2sgaW4gbm9uLWJsb2NraW5nCisgICAgICAgIG1vZGUuIElmIG4gaXMgbmVnYXRpdmUsIHJlYWQgdW50aWwgRU9GIG9yIHVudGlsIHJlYWQoKSB3b3VsZAorICAgICAgICBibG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG4gaXMgbm90IE5vbmUgYW5kIG4gPCAtMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQiKQorICAgICAgICB3aXRoIHNlbGYuX3JlYWRfbG9jazoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX3VubG9ja2VkKG4pCisKKyAgICBkZWYgX3JlYWRfdW5sb2NrZWQoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgbm9kYXRhX3ZhbCA9IGIiIgorICAgICAgICBlbXB0eV92YWx1ZXMgPSAoYiIiLCBOb25lKQorICAgICAgICBidWYgPSBzZWxmLl9yZWFkX2J1ZgorICAgICAgICBwb3MgPSBzZWxmLl9yZWFkX3BvcworCisgICAgICAgICMgU3BlY2lhbCBjYXNlIGZvciB3aGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBpcyB1bnNwZWNpZmllZC4KKyAgICAgICAgaWYgbiBpcyBOb25lIG9yIG4gPT0gLTE6CisgICAgICAgICAgICBzZWxmLl9yZXNldF9yZWFkX2J1ZigpCisgICAgICAgICAgICBjaHVua3MgPSBbYnVmW3BvczpdXSAgIyBTdHJpcCB0aGUgY29uc3VtZWQgYnl0ZXMuCisgICAgICAgICAgICBjdXJyZW50X3NpemUgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICMgUmVhZCB1bnRpbCBFT0Ygb3IgdW50aWwgcmVhZCgpIHdvdWxkIGJsb2NrLgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJhdy5yZWFkKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IEVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBjaHVuayBpbiBlbXB0eV92YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIG5vZGF0YV92YWwgPSBjaHVuaworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGN1cnJlbnRfc2l6ZSArPSBsZW4oY2h1bmspCisgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZChjaHVuaykKKyAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihjaHVua3MpIG9yIG5vZGF0YV92YWwKKworICAgICAgICAjIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBpcyBzcGVjaWZpZWQsIHJldHVybiBhdCBtb3N0IG4gYnl0ZXMuCisgICAgICAgIGF2YWlsID0gbGVuKGJ1ZikgLSBwb3MgICMgTGVuZ3RoIG9mIHRoZSBhdmFpbGFibGUgYnVmZmVyZWQgZGF0YS4KKyAgICAgICAgaWYgbiA8PSBhdmFpbDoKKyAgICAgICAgICAgICMgRmFzdCBwYXRoOiB0aGUgZGF0YSB0byByZWFkIGlzIGZ1bGx5IGJ1ZmZlcmVkLgorICAgICAgICAgICAgc2VsZi5fcmVhZF9wb3MgKz0gbgorICAgICAgICAgICAgcmV0dXJuIGJ1Zltwb3M6cG9zK25dCisgICAgICAgICMgU2xvdyBwYXRoOiByZWFkIGZyb20gdGhlIHN0cmVhbSB1bnRpbCBlbm91Z2ggYnl0ZXMgYXJlIHJlYWQsCisgICAgICAgICMgb3IgdW50aWwgYW4gRU9GIG9jY3VycyBvciB1bnRpbCByZWFkKCkgd291bGQgYmxvY2suCisgICAgICAgIGNodW5rcyA9IFtidWZbcG9zOl1dCisgICAgICAgIHdhbnRlZCA9IG1heChzZWxmLmJ1ZmZlcl9zaXplLCBuKQorICAgICAgICB3aGlsZSBhdmFpbCA8IG46CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJhdy5yZWFkKHdhbnRlZCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBFSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgY2h1bmsgaW4gZW1wdHlfdmFsdWVzOgorICAgICAgICAgICAgICAgIG5vZGF0YV92YWwgPSBjaHVuaworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhdmFpbCArPSBsZW4oY2h1bmspCisgICAgICAgICAgICBjaHVua3MuYXBwZW5kKGNodW5rKQorICAgICAgICAjIG4gaXMgbW9yZSB0aGVuIGF2YWlsIG9ubHkgd2hlbiBhbiBFT0Ygb2NjdXJyZWQgb3Igd2hlbgorICAgICAgICAjIHJlYWQoKSB3b3VsZCBoYXZlIGJsb2NrZWQuCisgICAgICAgIG4gPSBtaW4obiwgYXZhaWwpCisgICAgICAgIG91dCA9IGIiIi5qb2luKGNodW5rcykKKyAgICAgICAgc2VsZi5fcmVhZF9idWYgPSBvdXRbbjpdICAjIFNhdmUgdGhlIGV4dHJhIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKyAgICAgICAgc2VsZi5fcmVhZF9wb3MgPSAwCisgICAgICAgIHJldHVybiBvdXRbOm5dIGlmIG91dCBlbHNlIG5vZGF0YV92YWwKKworICAgIGRlZiBwZWVrKHNlbGYsIG49MCk6CisgICAgICAgICIiIlJldHVybnMgYnVmZmVyZWQgYnl0ZXMgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHBvc2l0aW9uLgorCisgICAgICAgIFRoZSBhcmd1bWVudCBpbmRpY2F0ZXMgYSBkZXNpcmVkIG1pbmltYWwgbnVtYmVyIG9mIGJ5dGVzOyB3ZQorICAgICAgICBkbyBhdCBtb3N0IG9uZSByYXcgcmVhZCB0byBzYXRpc2Z5IGl0LiAgV2UgbmV2ZXIgcmV0dXJuIG1vcmUKKyAgICAgICAgdGhhbiBzZWxmLmJ1ZmZlcl9zaXplLgorICAgICAgICAiIiIKKyAgICAgICAgd2l0aCBzZWxmLl9yZWFkX2xvY2s6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcGVla191bmxvY2tlZChuKQorCisgICAgZGVmIF9wZWVrX3VubG9ja2VkKHNlbGYsIG49MCk6CisgICAgICAgIHdhbnQgPSBtaW4obiwgc2VsZi5idWZmZXJfc2l6ZSkKKyAgICAgICAgaGF2ZSA9IGxlbihzZWxmLl9yZWFkX2J1ZikgLSBzZWxmLl9yZWFkX3BvcworICAgICAgICBpZiBoYXZlIDwgd2FudCBvciBoYXZlIDw9IDA6CisgICAgICAgICAgICB0b19yZWFkID0gc2VsZi5idWZmZXJfc2l6ZSAtIGhhdmUKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gc2VsZi5yYXcucmVhZCh0b19yZWFkKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBjdXJyZW50OgorICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRfYnVmID0gc2VsZi5fcmVhZF9idWZbc2VsZi5fcmVhZF9wb3M6XSArIGN1cnJlbnQKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWFkX3BvcyA9IDAKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRfYnVmW3NlbGYuX3JlYWRfcG9zOl0KKworICAgIGRlZiByZWFkMShzZWxmLCBuKToKKyAgICAgICAgIiIiUmVhZHMgdXAgdG8gbiBieXRlcywgd2l0aCBhdCBtb3N0IG9uZSByZWFkKCkgc3lzdGVtIGNhbGwuIiIiCisgICAgICAgICMgUmV0dXJucyB1cCB0byBuIGJ5dGVzLiAgSWYgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgYnVmZmVyZWQsIHdlCisgICAgICAgICMgb25seSByZXR1cm4gYnVmZmVyZWQgYnl0ZXMuICBPdGhlcndpc2UsIHdlIGRvIG9uZSByYXcgcmVhZC4KKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCBtdXN0IGJlIHBvc2l0aXZlIikKKyAgICAgICAgaWYgbiA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGIiIgorICAgICAgICB3aXRoIHNlbGYuX3JlYWRfbG9jazoKKyAgICAgICAgICAgIHNlbGYuX3BlZWtfdW5sb2NrZWQoMSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX3VubG9ja2VkKAorICAgICAgICAgICAgICAgIG1pbihuLCBsZW4oc2VsZi5fcmVhZF9idWYpIC0gc2VsZi5fcmVhZF9wb3MpKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBfQnVmZmVyZWRJT01peGluLnRlbGwoc2VsZikgLSBsZW4oc2VsZi5fcmVhZF9idWYpICsgc2VsZi5fcmVhZF9wb3MKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICBpZiBub3QgKDAgPD0gd2hlbmNlIDw9IDIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCB3aGVuY2UgdmFsdWUiKQorICAgICAgICB3aXRoIHNlbGYuX3JlYWRfbG9jazoKKyAgICAgICAgICAgIGlmIHdoZW5jZSA9PSAxOgorICAgICAgICAgICAgICAgIHBvcyAtPSBsZW4oc2VsZi5fcmVhZF9idWYpIC0gc2VsZi5fcmVhZF9wb3MKKyAgICAgICAgICAgIHBvcyA9IF9CdWZmZXJlZElPTWl4aW4uc2VlayhzZWxmLCBwb3MsIHdoZW5jZSkKKyAgICAgICAgICAgIHNlbGYuX3Jlc2V0X3JlYWRfYnVmKCkKKyAgICAgICAgICAgIHJldHVybiBwb3MKKworY2xhc3MgQnVmZmVyZWRXcml0ZXIoX0J1ZmZlcmVkSU9NaXhpbik6CisKKyAgICAiIiJBIGJ1ZmZlciBmb3IgYSB3cml0ZWFibGUgc2VxdWVudGlhbCBSYXdJTyBvYmplY3QuCisKKyAgICBUaGUgY29uc3RydWN0b3IgY3JlYXRlcyBhIEJ1ZmZlcmVkV3JpdGVyIGZvciB0aGUgZ2l2ZW4gd3JpdGVhYmxlIHJhdworICAgIHN0cmVhbS4gSWYgdGhlIGJ1ZmZlcl9zaXplIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8KKyAgICBERUZBVUxUX0JVRkZFUl9TSVpFLgorICAgICIiIgorCisgICAgX3dhcm5pbmdfc3RhY2tfb2Zmc2V0ID0gMgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJhdywKKyAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemU9REVGQVVMVF9CVUZGRVJfU0laRSwgbWF4X2J1ZmZlcl9zaXplPU5vbmUpOgorICAgICAgICBpZiBub3QgcmF3LndyaXRhYmxlKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCcicmF3IiBhcmd1bWVudCBtdXN0IGJlIHdyaXRhYmxlLicpCisKKyAgICAgICAgX0J1ZmZlcmVkSU9NaXhpbi5fX2luaXRfXyhzZWxmLCByYXcpCisgICAgICAgIGlmIGJ1ZmZlcl9zaXplIDw9IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGJ1ZmZlciBzaXplIikKKyAgICAgICAgaWYgbWF4X2J1ZmZlcl9zaXplIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigibWF4X2J1ZmZlcl9zaXplIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dhcm5pbmdfc3RhY2tfb2Zmc2V0KQorICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemUKKyAgICAgICAgc2VsZi5fd3JpdGVfYnVmID0gYnl0ZWFycmF5KCkKKyAgICAgICAgc2VsZi5fd3JpdGVfbG9jayA9IExvY2soKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGIpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIndyaXRlIHRvIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShiLCB1bmljb2RlKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2FuJ3Qgd3JpdGUgdW5pY29kZSB0byBiaW5hcnkgc3RyZWFtIikKKyAgICAgICAgd2l0aCBzZWxmLl93cml0ZV9sb2NrOgorICAgICAgICAgICAgIyBYWFggd2UgY2FuIGltcGxlbWVudCBzb21lIG1vcmUgdHJpY2tzIHRvIHRyeSBhbmQgYXZvaWQKKyAgICAgICAgICAgICMgcGFydGlhbCB3cml0ZXMKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl93cml0ZV9idWYpID4gc2VsZi5idWZmZXJfc2l6ZToKKyAgICAgICAgICAgICAgICAjIFdlJ3JlIGZ1bGwsIHNvIGxldCdzIHByZS1mbHVzaCB0aGUgYnVmZmVyLiAgKFRoaXMgbWF5CisgICAgICAgICAgICAgICAgIyByYWlzZSBCbG9ja2luZ0lPRXJyb3Igd2l0aCBjaGFyYWN0ZXJzX3dyaXR0ZW4gPT0gMC4pCisgICAgICAgICAgICAgICAgc2VsZi5fZmx1c2hfdW5sb2NrZWQoKQorICAgICAgICAgICAgYmVmb3JlID0gbGVuKHNlbGYuX3dyaXRlX2J1ZikKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2J1Zi5leHRlbmQoYikKKyAgICAgICAgICAgIHdyaXR0ZW4gPSBsZW4oc2VsZi5fd3JpdGVfYnVmKSAtIGJlZm9yZQorICAgICAgICAgICAgaWYgbGVuKHNlbGYuX3dyaXRlX2J1ZikgPiBzZWxmLmJ1ZmZlcl9zaXplOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmx1c2hfdW5sb2NrZWQoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBCbG9ja2luZ0lPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYuX3dyaXRlX2J1ZikgPiBzZWxmLmJ1ZmZlcl9zaXplOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBXZSd2ZSBoaXQgdGhlIGJ1ZmZlcl9zaXplLiBXZSBoYXZlIHRvIGFjY2VwdCBhIHBhcnRpYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd3JpdGUgYW5kIGN1dCBiYWNrIG91ciBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWdlID0gbGVuKHNlbGYuX3dyaXRlX2J1ZikgLSBzZWxmLmJ1ZmZlcl9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIC09IG92ZXJhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX2J1ZiA9IHNlbGYuX3dyaXRlX2J1Zls6c2VsZi5idWZmZXJfc2l6ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJsb2NraW5nSU9FcnJvcihlLmVycm5vLCBlLnN0cmVycm9yLCB3cml0dGVuKQorICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW4KKworICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBwb3M9Tm9uZSk6CisgICAgICAgIHdpdGggc2VsZi5fd3JpdGVfbG9jazoKKyAgICAgICAgICAgIHNlbGYuX2ZsdXNoX3VubG9ja2VkKCkKKyAgICAgICAgICAgIGlmIHBvcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBvcyA9IHNlbGYucmF3LnRlbGwoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmF3LnRydW5jYXRlKHBvcykKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLl93cml0ZV9sb2NrOgorICAgICAgICAgICAgc2VsZi5fZmx1c2hfdW5sb2NrZWQoKQorCisgICAgZGVmIF9mbHVzaF91bmxvY2tlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmbHVzaCBvZiBjbG9zZWQgZmlsZSIpCisgICAgICAgIHdoaWxlIHNlbGYuX3dyaXRlX2J1ZjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuID0gc2VsZi5yYXcud3JpdGUoc2VsZi5fd3JpdGVfYnVmKQorICAgICAgICAgICAgZXhjZXB0IEJsb2NraW5nSU9FcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoInNlbGYucmF3IHNob3VsZCBpbXBsZW1lbnQgUmF3SU9CYXNlOiBpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgbm90IHJhaXNlIEJsb2NraW5nSU9FcnJvciIpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBCbG9ja2luZ0lPRXJyb3IoCisgICAgICAgICAgICAgICAgICAgIGVycm5vLkVBR0FJTiwKKyAgICAgICAgICAgICAgICAgICAgIndyaXRlIGNvdWxkIG5vdCBjb21wbGV0ZSB3aXRob3V0IGJsb2NraW5nIiwgMCkKKyAgICAgICAgICAgIGlmIG4gPiBsZW4oc2VsZi5fd3JpdGVfYnVmKSBvciBuIDwgMDoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJ3cml0ZSgpIHJldHVybmVkIGluY29ycmVjdCBudW1iZXIgb2YgYnl0ZXMiKQorICAgICAgICAgICAgZGVsIHNlbGYuX3dyaXRlX2J1Zls6bl0KKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gX0J1ZmZlcmVkSU9NaXhpbi50ZWxsKHNlbGYpICsgbGVuKHNlbGYuX3dyaXRlX2J1ZikKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICBpZiBub3QgKDAgPD0gd2hlbmNlIDw9IDIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCB3aGVuY2UiKQorICAgICAgICB3aXRoIHNlbGYuX3dyaXRlX2xvY2s6CisgICAgICAgICAgICBzZWxmLl9mbHVzaF91bmxvY2tlZCgpCisgICAgICAgICAgICByZXR1cm4gX0J1ZmZlcmVkSU9NaXhpbi5zZWVrKHNlbGYsIHBvcywgd2hlbmNlKQorCisKK2NsYXNzIEJ1ZmZlcmVkUldQYWlyKEJ1ZmZlcmVkSU9CYXNlKToKKworICAgICIiIkEgYnVmZmVyZWQgcmVhZGVyIGFuZCB3cml0ZXIgb2JqZWN0IHRvZ2V0aGVyLgorCisgICAgQSBidWZmZXJlZCByZWFkZXIgb2JqZWN0IGFuZCBidWZmZXJlZCB3cml0ZXIgb2JqZWN0IHB1dCB0b2dldGhlciB0bworICAgIGZvcm0gYSBzZXF1ZW50aWFsIElPIG9iamVjdCB0aGF0IGNhbiByZWFkIGFuZCB3cml0ZS4gVGhpcyBpcyB0eXBpY2FsbHkKKyAgICB1c2VkIHdpdGggYSBzb2NrZXQgb3IgdHdvLXdheSBwaXBlLgorCisgICAgcmVhZGVyIGFuZCB3cml0ZXIgYXJlIFJhd0lPQmFzZSBvYmplY3RzIHRoYXQgYXJlIHJlYWRhYmxlIGFuZAorICAgIHdyaXRlYWJsZSByZXNwZWN0aXZlbHkuIElmIHRoZSBidWZmZXJfc2l6ZSBpcyBvbWl0dGVkIGl0IGRlZmF1bHRzIHRvCisgICAgREVGQVVMVF9CVUZGRVJfU0laRS4KKyAgICAiIiIKKworICAgICMgWFhYIFRoZSB1c2VmdWxuZXNzIG9mIHRoaXMgKGNvbXBhcmVkIHRvIGhhdmluZyB0d28gc2VwYXJhdGUgSU8KKyAgICAjIG9iamVjdHMpIGlzIHF1ZXN0aW9uYWJsZS4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWFkZXIsIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgYnVmZmVyX3NpemU9REVGQVVMVF9CVUZGRVJfU0laRSwgbWF4X2J1ZmZlcl9zaXplPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4KKworICAgICAgICBUaGUgYXJndW1lbnRzIGFyZSB0d28gUmF3SU8gaW5zdGFuY2VzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbWF4X2J1ZmZlcl9zaXplIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3Mud2FybigibWF4X2J1ZmZlcl9zaXplIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKKyAgICAgICAgaWYgbm90IHJlYWRlci5yZWFkYWJsZSgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignInJlYWRlciIgYXJndW1lbnQgbXVzdCBiZSByZWFkYWJsZS4nKQorCisgICAgICAgIGlmIG5vdCB3cml0ZXIud3JpdGFibGUoKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJyJ3cml0ZXIiIGFyZ3VtZW50IG11c3QgYmUgd3JpdGFibGUuJykKKworICAgICAgICBzZWxmLnJlYWRlciA9IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlciwgYnVmZmVyX3NpemUpCisgICAgICAgIHNlbGYud3JpdGVyID0gQnVmZmVyZWRXcml0ZXIod3JpdGVyLCBidWZmZXJfc2l6ZSkKKworICAgIGRlZiByZWFkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgIGlmIG4gaXMgTm9uZToKKyAgICAgICAgICAgIG4gPSAtMQorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIucmVhZChuKQorCisgICAgZGVmIHJlYWRpbnRvKHNlbGYsIGIpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIucmVhZGludG8oYikKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVyLndyaXRlKGIpCisKKyAgICBkZWYgcGVlayhzZWxmLCBuPTApOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIucGVlayhuKQorCisgICAgZGVmIHJlYWQxKHNlbGYsIG4pOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIucmVhZDEobikKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLnJlYWRhYmxlKCkKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVyLndyaXRhYmxlKCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVyLmZsdXNoKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXIuY2xvc2UoKQorICAgICAgICBzZWxmLnJlYWRlci5jbG9zZSgpCisKKyAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIuaXNhdHR5KCkgb3Igc2VsZi53cml0ZXIuaXNhdHR5KCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbG9zZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci5jbG9zZWQKKworCitjbGFzcyBCdWZmZXJlZFJhbmRvbShCdWZmZXJlZFdyaXRlciwgQnVmZmVyZWRSZWFkZXIpOgorCisgICAgIiIiQSBidWZmZXJlZCBpbnRlcmZhY2UgdG8gcmFuZG9tIGFjY2VzcyBzdHJlYW1zLgorCisgICAgVGhlIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSByZWFkZXIgYW5kIHdyaXRlciBmb3IgYSBzZWVrYWJsZSBzdHJlYW0sCisgICAgcmF3LCBnaXZlbiBpbiB0aGUgZmlyc3QgYXJndW1lbnQuIElmIHRoZSBidWZmZXJfc2l6ZSBpcyBvbWl0dGVkIGl0CisgICAgZGVmYXVsdHMgdG8gREVGQVVMVF9CVUZGRVJfU0laRS4KKyAgICAiIiIKKworICAgIF93YXJuaW5nX3N0YWNrX29mZnNldCA9IDMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYXcsCisgICAgICAgICAgICAgICAgIGJ1ZmZlcl9zaXplPURFRkFVTFRfQlVGRkVSX1NJWkUsIG1heF9idWZmZXJfc2l6ZT1Ob25lKToKKyAgICAgICAgcmF3Ll9jaGVja1NlZWthYmxlKCkKKyAgICAgICAgQnVmZmVyZWRSZWFkZXIuX19pbml0X18oc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSkKKyAgICAgICAgQnVmZmVyZWRXcml0ZXIuX19pbml0X18oc2VsZiwgcmF3LCBidWZmZXJfc2l6ZSwgbWF4X2J1ZmZlcl9zaXplKQorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9MCk6CisgICAgICAgIGlmIG5vdCAoMCA8PSB3aGVuY2UgPD0gMik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIHdoZW5jZSIpCisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBpZiBzZWxmLl9yZWFkX2J1ZjoKKyAgICAgICAgICAgICMgVW5kbyByZWFkIGFoZWFkLgorICAgICAgICAgICAgd2l0aCBzZWxmLl9yZWFkX2xvY2s6CisgICAgICAgICAgICAgICAgc2VsZi5yYXcuc2VlayhzZWxmLl9yZWFkX3BvcyAtIGxlbihzZWxmLl9yZWFkX2J1ZiksIDEpCisgICAgICAgICMgRmlyc3QgZG8gdGhlIHJhdyBzZWVrLCB0aGVuIGVtcHR5IHRoZSByZWFkIGJ1ZmZlciwgc28gdGhhdAorICAgICAgICAjIGlmIHRoZSByYXcgc2VlayBmYWlscywgd2UgZG9uJ3QgbG9zZSBidWZmZXJlZCBkYXRhIGZvcmV2ZXIuCisgICAgICAgIHBvcyA9IHNlbGYucmF3LnNlZWsocG9zLCB3aGVuY2UpCisgICAgICAgIHdpdGggc2VsZi5fcmVhZF9sb2NrOgorICAgICAgICAgICAgc2VsZi5fcmVzZXRfcmVhZF9idWYoKQorICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigic2VlaygpIHJldHVybmVkIGludmFsaWQgcG9zaXRpb24iKQorICAgICAgICByZXR1cm4gcG9zCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fd3JpdGVfYnVmOgorICAgICAgICAgICAgcmV0dXJuIEJ1ZmZlcmVkV3JpdGVyLnRlbGwoc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBCdWZmZXJlZFJlYWRlci50ZWxsKHNlbGYpCisKKyAgICBkZWYgdHJ1bmNhdGUoc2VsZiwgcG9zPU5vbmUpOgorICAgICAgICBpZiBwb3MgaXMgTm9uZToKKyAgICAgICAgICAgIHBvcyA9IHNlbGYudGVsbCgpCisgICAgICAgICMgVXNlIHNlZWsgdG8gZmx1c2ggdGhlIHJlYWQgYnVmZmVyLgorICAgICAgICByZXR1cm4gQnVmZmVyZWRXcml0ZXIudHJ1bmNhdGUoc2VsZiwgcG9zKQorCisgICAgZGVmIHJlYWQoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgbiA9IC0xCisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICByZXR1cm4gQnVmZmVyZWRSZWFkZXIucmVhZChzZWxmLCBuKQorCisgICAgZGVmIHJlYWRpbnRvKHNlbGYsIGIpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcmVkUmVhZGVyLnJlYWRpbnRvKHNlbGYsIGIpCisKKyAgICBkZWYgcGVlayhzZWxmLCBuPTApOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcmVkUmVhZGVyLnBlZWsoc2VsZiwgbikKKworICAgIGRlZiByZWFkMShzZWxmLCBuKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHJldHVybiBCdWZmZXJlZFJlYWRlci5yZWFkMShzZWxmLCBuKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGIpOgorICAgICAgICBpZiBzZWxmLl9yZWFkX2J1ZjoKKyAgICAgICAgICAgICMgVW5kbyByZWFkYWhlYWQKKyAgICAgICAgICAgIHdpdGggc2VsZi5fcmVhZF9sb2NrOgorICAgICAgICAgICAgICAgIHNlbGYucmF3LnNlZWsoc2VsZi5fcmVhZF9wb3MgLSBsZW4oc2VsZi5fcmVhZF9idWYpLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuX3Jlc2V0X3JlYWRfYnVmKCkKKyAgICAgICAgcmV0dXJuIEJ1ZmZlcmVkV3JpdGVyLndyaXRlKHNlbGYsIGIpCisKKworY2xhc3MgVGV4dElPQmFzZShJT0Jhc2UpOgorCisgICAgIiIiQmFzZSBjbGFzcyBmb3IgdGV4dCBJL08uCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgY2hhcmFjdGVyIGFuZCBsaW5lIGJhc2VkIGludGVyZmFjZSB0byBzdHJlYW0KKyAgICBJL08uIFRoZXJlIGlzIG5vIHJlYWRpbnRvIG1ldGhvZCBiZWNhdXNlIFB5dGhvbidzIGNoYXJhY3RlciBzdHJpbmdzCisgICAgYXJlIGltbXV0YWJsZS4gVGhlcmUgaXMgbm8gcHVibGljIGNvbnN0cnVjdG9yLgorICAgICIiIgorCisgICAgZGVmIHJlYWQoc2VsZiwgbj0tMSk6CisgICAgICAgICIiIlJlYWQgYXQgbW9zdCBuIGNoYXJhY3RlcnMgZnJvbSBzdHJlYW0uCisKKyAgICAgICAgUmVhZCBmcm9tIHVuZGVybHlpbmcgYnVmZmVyIHVudGlsIHdlIGhhdmUgbiBjaGFyYWN0ZXJzIG9yIHdlIGhpdCBFT0YuCisgICAgICAgIElmIG4gaXMgbmVnYXRpdmUgb3Igb21pdHRlZCwgcmVhZCB1bnRpbCBFT0YuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgicmVhZCIpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHN0cmVhbS4iIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoIndyaXRlIikKKworICAgIGRlZiB0cnVuY2F0ZShzZWxmLCBwb3M9Tm9uZSk6CisgICAgICAgICIiIlRydW5jYXRlIHNpemUgdG8gcG9zLiIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgidHJ1bmNhdGUiKQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICAiIiJSZWFkIHVudGlsIG5ld2xpbmUgb3IgRU9GLgorCisgICAgICAgIFJldHVybnMgYW4gZW1wdHkgc3RyaW5nIGlmIEVPRiBpcyBoaXQgaW1tZWRpYXRlbHkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl91bnN1cHBvcnRlZCgicmVhZGxpbmUiKQorCisgICAgZGVmIGRldGFjaChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFNlcGFyYXRlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBmcm9tIHRoZSBUZXh0SU9CYXNlIGFuZCByZXR1cm4gaXQuCisKKyAgICAgICAgQWZ0ZXIgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGhhcyBiZWVuIGRldGFjaGVkLCB0aGUgVGV4dElPIGlzIGluIGFuCisgICAgICAgIHVudXNhYmxlIHN0YXRlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdW5zdXBwb3J0ZWQoImRldGFjaCIpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZW5jb2Rpbmcoc2VsZik6CisgICAgICAgICIiIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLiIiIgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5ld2xpbmVzKHNlbGYpOgorICAgICAgICAiIiJMaW5lIGVuZGluZ3MgdHJhbnNsYXRlZCBzbyBmYXIuCisKKyAgICAgICAgT25seSBsaW5lIGVuZGluZ3MgdHJhbnNsYXRlZCBkdXJpbmcgcmVhZGluZyBhcmUgY29uc2lkZXJlZC4KKworICAgICAgICBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZXJyb3JzKHNlbGYpOgorICAgICAgICAiIiJFcnJvciBzZXR0aW5nIG9mIHRoZSBkZWNvZGVyIG9yIGVuY29kZXIuCisKKyAgICAgICAgU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuIiIiCisgICAgICAgIHJldHVybiBOb25lCisKK2lvLlRleHRJT0Jhc2UucmVnaXN0ZXIoVGV4dElPQmFzZSkKKworCitjbGFzcyBJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIHIiIiJDb2RlYyB1c2VkIHdoZW4gcmVhZGluZyBhIGZpbGUgaW4gdW5pdmVyc2FsIG5ld2xpbmVzIG1vZGUuICBJdCB3cmFwcworICAgIGFub3RoZXIgaW5jcmVtZW50YWwgZGVjb2RlciwgdHJhbnNsYXRpbmcgXHJcbiBhbmQgXHIgaW50byBcbi4gIEl0IGFsc28KKyAgICByZWNvcmRzIHRoZSB0eXBlcyBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZC4gIFdoZW4gdXNlZCB3aXRoCisgICAgdHJhbnNsYXRlPUZhbHNlLCBpdCBlbnN1cmVzIHRoYXQgdGhlIG5ld2xpbmUgc2VxdWVuY2UgaXMgcmV0dXJuZWQgaW4KKyAgICBvbmUgcGllY2UuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlY29kZXIsIHRyYW5zbGF0ZSwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlci5fX2luaXRfXyhzZWxmLCBlcnJvcnM9ZXJyb3JzKQorICAgICAgICBzZWxmLnRyYW5zbGF0ZSA9IHRyYW5zbGF0ZQorICAgICAgICBzZWxmLmRlY29kZXIgPSBkZWNvZGVyCisgICAgICAgIHNlbGYuc2Vlbm5sID0gMAorICAgICAgICBzZWxmLnBlbmRpbmdjciA9IEZhbHNlCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgICMgZGVjb2RlIGlucHV0ICh3aXRoIHRoZSBldmVudHVhbCBcciBmcm9tIGEgcHJldmlvdXMgcGFzcykKKyAgICAgICAgaWYgc2VsZi5kZWNvZGVyIGlzIE5vbmU6CisgICAgICAgICAgICBvdXRwdXQgPSBpbnB1dAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0cHV0ID0gc2VsZi5kZWNvZGVyLmRlY29kZShpbnB1dCwgZmluYWw9ZmluYWwpCisgICAgICAgIGlmIHNlbGYucGVuZGluZ2NyIGFuZCAob3V0cHV0IG9yIGZpbmFsKToKKyAgICAgICAgICAgIG91dHB1dCA9ICJcciIgKyBvdXRwdXQKKyAgICAgICAgICAgIHNlbGYucGVuZGluZ2NyID0gRmFsc2UKKworICAgICAgICAjIHJldGFpbiBsYXN0IFxyIGV2ZW4gd2hlbiBub3QgdHJhbnNsYXRpbmcgZGF0YToKKyAgICAgICAgIyB0aGVuIHJlYWRsaW5lKCkgaXMgc3VyZSB0byBnZXQgXHJcbiBpbiBvbmUgcGFzcworICAgICAgICBpZiBvdXRwdXQuZW5kc3dpdGgoIlxyIikgYW5kIG5vdCBmaW5hbDoKKyAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dFs6LTFdCisgICAgICAgICAgICBzZWxmLnBlbmRpbmdjciA9IFRydWUKKworICAgICAgICAjIFJlY29yZCB3aGljaCBuZXdsaW5lcyBhcmUgcmVhZAorICAgICAgICBjcmxmID0gb3V0cHV0LmNvdW50KCdcclxuJykKKyAgICAgICAgY3IgPSBvdXRwdXQuY291bnQoJ1xyJykgLSBjcmxmCisgICAgICAgIGxmID0gb3V0cHV0LmNvdW50KCdcbicpIC0gY3JsZgorICAgICAgICBzZWxmLnNlZW5ubCB8PSAobGYgYW5kIHNlbGYuX0xGKSB8IChjciBhbmQgc2VsZi5fQ1IpIFwKKyAgICAgICAgICAgICAgICAgICAgfCAoY3JsZiBhbmQgc2VsZi5fQ1JMRikKKworICAgICAgICBpZiBzZWxmLnRyYW5zbGF0ZToKKyAgICAgICAgICAgIGlmIGNybGY6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoIlxyXG4iLCAiXG4iKQorICAgICAgICAgICAgaWYgY3I6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3V0cHV0LnJlcGxhY2UoIlxyIiwgIlxuIikKKworICAgICAgICByZXR1cm4gb3V0cHV0CisKKyAgICBkZWYgZ2V0c3RhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGVjb2RlciBpcyBOb25lOgorICAgICAgICAgICAgYnVmID0gYiIiCisgICAgICAgICAgICBmbGFnID0gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVmLCBmbGFnID0gc2VsZi5kZWNvZGVyLmdldHN0YXRlKCkKKyAgICAgICAgZmxhZyA8PD0gMQorICAgICAgICBpZiBzZWxmLnBlbmRpbmdjcjoKKyAgICAgICAgICAgIGZsYWcgfD0gMQorICAgICAgICByZXR1cm4gYnVmLCBmbGFnCisKKyAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICBidWYsIGZsYWcgPSBzdGF0ZQorICAgICAgICBzZWxmLnBlbmRpbmdjciA9IGJvb2woZmxhZyAmIDEpCisgICAgICAgIGlmIHNlbGYuZGVjb2RlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVjb2Rlci5zZXRzdGF0ZSgoYnVmLCBmbGFnID4+IDEpKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNlZW5ubCA9IDAKKyAgICAgICAgc2VsZi5wZW5kaW5nY3IgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLmRlY29kZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRlY29kZXIucmVzZXQoKQorCisgICAgX0xGID0gMQorICAgIF9DUiA9IDIKKyAgICBfQ1JMRiA9IDQKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZXdsaW5lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChOb25lLAorICAgICAgICAgICAgICAgICJcbiIsCisgICAgICAgICAgICAgICAgIlxyIiwKKyAgICAgICAgICAgICAgICAoIlxyIiwgIlxuIiksCisgICAgICAgICAgICAgICAgIlxyXG4iLAorICAgICAgICAgICAgICAgICgiXG4iLCAiXHJcbiIpLAorICAgICAgICAgICAgICAgICgiXHIiLCAiXHJcbiIpLAorICAgICAgICAgICAgICAgICgiXHIiLCAiXG4iLCAiXHJcbiIpCisgICAgICAgICAgICAgICApW3NlbGYuc2Vlbm5sXQorCisKK2NsYXNzIFRleHRJT1dyYXBwZXIoVGV4dElPQmFzZSk6CisKKyAgICByIiIiQ2hhcmFjdGVyIGFuZCBsaW5lIGJhc2VkIGxheWVyIG92ZXIgYSBCdWZmZXJlZElPQmFzZSBvYmplY3QsIGJ1ZmZlci4KKworICAgIGVuY29kaW5nIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0aGF0IHRoZSBzdHJlYW0gd2lsbCBiZQorICAgIGRlY29kZWQgb3IgZW5jb2RlZCB3aXRoLiBJdCBkZWZhdWx0cyB0byBsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcuCisKKyAgICBlcnJvcnMgZGV0ZXJtaW5lcyB0aGUgc3RyaWN0bmVzcyBvZiBlbmNvZGluZyBhbmQgZGVjb2RpbmcgKHNlZSB0aGUKKyAgICBjb2RlY3MucmVnaXN0ZXIpIGFuZCBkZWZhdWx0cyB0byAic3RyaWN0Ii4KKworICAgIG5ld2xpbmUgY2FuIGJlIE5vbmUsICcnLCAnXG4nLCAnXHInLCBvciAnXHJcbicuICBJdCBjb250cm9scyB0aGUKKyAgICBoYW5kbGluZyBvZiBsaW5lIGVuZGluZ3MuIElmIGl0IGlzIE5vbmUsIHVuaXZlcnNhbCBuZXdsaW5lcyBpcworICAgIGVuYWJsZWQuICBXaXRoIHRoaXMgZW5hYmxlZCwgb24gaW5wdXQsIHRoZSBsaW5lcyBlbmRpbmdzICdcbicsICdccicsCisgICAgb3IgJ1xyXG4nIGFyZSB0cmFuc2xhdGVkIHRvICdcbicgYmVmb3JlIGJlaW5nIHJldHVybmVkIHRvIHRoZQorICAgIGNhbGxlci4gQ29udmVyc2VseSwgb24gb3V0cHV0LCAnXG4nIGlzIHRyYW5zbGF0ZWQgdG8gdGhlIHN5c3RlbQorICAgIGRlZmF1bHQgbGluZSBzZXBhcmF0b3IsIG9zLmxpbmVzZXAuIElmIG5ld2xpbmUgaXMgYW55IG90aGVyIG9mIGl0cworICAgIGxlZ2FsIHZhbHVlcywgdGhhdCBuZXdsaW5lIGJlY29tZXMgdGhlIG5ld2xpbmUgd2hlbiB0aGUgZmlsZSBpcyByZWFkCisgICAgYW5kIGl0IGlzIHJldHVybmVkIHVudHJhbnNsYXRlZC4gT24gb3V0cHV0LCAnXG4nIGlzIGNvbnZlcnRlZCB0byB0aGUKKyAgICBuZXdsaW5lLgorCisgICAgSWYgbGluZV9idWZmZXJpbmcgaXMgVHJ1ZSwgYSBjYWxsIHRvIGZsdXNoIGlzIGltcGxpZWQgd2hlbiBhIGNhbGwgdG8KKyAgICB3cml0ZSBjb250YWlucyBhIG5ld2xpbmUgY2hhcmFjdGVyLgorICAgICIiIgorCisgICAgX0NIVU5LX1NJWkUgPSAyMDQ4CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVmZmVyLCBlbmNvZGluZz1Ob25lLCBlcnJvcnM9Tm9uZSwgbmV3bGluZT1Ob25lLAorICAgICAgICAgICAgICAgICBsaW5lX2J1ZmZlcmluZz1GYWxzZSk6CisgICAgICAgIGlmIG5ld2xpbmUgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKG5ld2xpbmUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJpbGxlZ2FsIG5ld2xpbmUgdHlwZTogJXIiICUgKHR5cGUobmV3bGluZSksKSkKKyAgICAgICAgaWYgbmV3bGluZSBub3QgaW4gKE5vbmUsICIiLCAiXG4iLCAiXHIiLCAiXHJcbiIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaWxsZWdhbCBuZXdsaW5lIHZhbHVlOiAlciIgJSAobmV3bGluZSwpKQorICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBsb2NhbGUKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAjIEltcG9ydGluZyBsb2NhbGUgbWF5IGZhaWwgaWYgUHl0aG9uIGlzIGJlaW5nIGJ1aWx0CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAiYXNjaWkiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gbG9jYWxlLmdldHByZWZlcnJlZGVuY29kaW5nKCkKKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlbmNvZGluZywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGVuY29kaW5nOiAlciIgJSBlbmNvZGluZykKKworICAgICAgICBpZiBlcnJvcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGVycm9ycyA9ICJzdHJpY3QiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlcnJvcnMsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgZXJyb3JzOiAlciIgJSBlcnJvcnMpCisKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gYnVmZmVyCisgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyaW5nID0gbGluZV9idWZmZXJpbmcKKyAgICAgICAgc2VsZi5fZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBzZWxmLl9lcnJvcnMgPSBlcnJvcnMKKyAgICAgICAgc2VsZi5fcmVhZHVuaXZlcnNhbCA9IG5vdCBuZXdsaW5lCisgICAgICAgIHNlbGYuX3JlYWR0cmFuc2xhdGUgPSBuZXdsaW5lIGlzIE5vbmUKKyAgICAgICAgc2VsZi5fcmVhZG5sID0gbmV3bGluZQorICAgICAgICBzZWxmLl93cml0ZXRyYW5zbGF0ZSA9IG5ld2xpbmUgIT0gJycKKyAgICAgICAgc2VsZi5fd3JpdGVubCA9IG5ld2xpbmUgb3Igb3MubGluZXNlcAorICAgICAgICBzZWxmLl9lbmNvZGVyID0gTm9uZQorICAgICAgICBzZWxmLl9kZWNvZGVyID0gTm9uZQorICAgICAgICBzZWxmLl9kZWNvZGVkX2NoYXJzID0gJycgICMgYnVmZmVyIGZvciB0ZXh0IHJldHVybmVkIGZyb20gZGVjb2RlcgorICAgICAgICBzZWxmLl9kZWNvZGVkX2NoYXJzX3VzZWQgPSAwICAjIG9mZnNldCBpbnRvIF9kZWNvZGVkX2NoYXJzIGZvciByZWFkKCkKKyAgICAgICAgc2VsZi5fc25hcHNob3QgPSBOb25lICAjIGluZm8gZm9yIHJlY29uc3RydWN0aW5nIGRlY29kZXIgc3RhdGUKKyAgICAgICAgc2VsZi5fc2Vla2FibGUgPSBzZWxmLl90ZWxsaW5nID0gc2VsZi5idWZmZXIuc2Vla2FibGUoKQorCisgICAgICAgIGlmIHNlbGYuX3NlZWthYmxlIGFuZCBzZWxmLndyaXRhYmxlKCk6CisgICAgICAgICAgICBwb3NpdGlvbiA9IHNlbGYuYnVmZmVyLnRlbGwoKQorICAgICAgICAgICAgaWYgcG9zaXRpb24gIT0gMDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2dldF9lbmNvZGVyKCkuc2V0c3RhdGUoMCkKKyAgICAgICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgU29tZXRpbWVzIHRoZSBlbmNvZGVyIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgIyBzZWxmLl9zbmFwc2hvdCBpcyBlaXRoZXIgTm9uZSwgb3IgYSB0dXBsZSAoZGVjX2ZsYWdzLCBuZXh0X2lucHV0KQorICAgICMgd2hlcmUgZGVjX2ZsYWdzIGlzIHRoZSBzZWNvbmQgKGludGVnZXIpIGl0ZW0gb2YgdGhlIGRlY29kZXIgc3RhdGUKKyAgICAjIGFuZCBuZXh0X2lucHV0IGlzIHRoZSBjaHVuayBvZiBpbnB1dCBieXRlcyB0aGF0IGNvbWVzIG5leHQgYWZ0ZXIgdGhlCisgICAgIyBzbmFwc2hvdCBwb2ludC4gIFdlIHVzZSB0aGlzIHRvIHJlY29uc3RydWN0IGRlY29kZXIgc3RhdGVzIGluIHRlbGwoKS4KKworICAgICMgTmFtaW5nIGNvbnZlbnRpb246CisgICAgIyAgIC0gImJ5dGVzXy4uLiIgZm9yIGludGVnZXIgdmFyaWFibGVzIHRoYXQgY291bnQgaW5wdXQgYnl0ZXMKKyAgICAjICAgLSAiY2hhcnNfLi4uIiBmb3IgaW50ZWdlciB2YXJpYWJsZXMgdGhhdCBjb3VudCBkZWNvZGVkIGNoYXJhY3RlcnMKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9IHNlbGYubmFtZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIjxfcHlpby5UZXh0SU9XcmFwcGVyIGVuY29kaW5nPSd7MH0nPiIuZm9ybWF0KHNlbGYuZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIjxfcHlpby5UZXh0SU9XcmFwcGVyIG5hbWU9ezAhcn0gZW5jb2Rpbmc9J3sxfSc+Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgbmFtZSwgc2VsZi5lbmNvZGluZykKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmNvZGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kaW5nCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZXJyb3JzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZXJyb3JzCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbGluZV9idWZmZXJpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9saW5lX2J1ZmZlcmluZworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGJ1ZmZlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlcgorCisgICAgZGVmIHNlZWthYmxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUuIikKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NlZWthYmxlCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlci5yZWFkYWJsZSgpCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlci53cml0YWJsZSgpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYuYnVmZmVyLmZsdXNoKCkKKyAgICAgICAgc2VsZi5fdGVsbGluZyA9IHNlbGYuX3NlZWthYmxlCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVmZmVyIGlzIG5vdCBOb25lIGFuZCBub3Qgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyLmNsb3NlKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbG9zZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJ1ZmZlci5jbG9zZWQKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWZmZXIubmFtZQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyLmZpbGVubygpCisKKyAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWZmZXIuaXNhdHR5KCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ3cml0ZSB0byBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHMsIHVuaWNvZGUpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW4ndCB3cml0ZSAlcyB0byB0ZXh0IHN0cmVhbSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuX19jbGFzc19fLl9fbmFtZV9fKQorICAgICAgICBsZW5ndGggPSBsZW4ocykKKyAgICAgICAgaGFzbGYgPSAoc2VsZi5fd3JpdGV0cmFuc2xhdGUgb3Igc2VsZi5fbGluZV9idWZmZXJpbmcpIGFuZCAiXG4iIGluIHMKKyAgICAgICAgaWYgaGFzbGYgYW5kIHNlbGYuX3dyaXRldHJhbnNsYXRlIGFuZCBzZWxmLl93cml0ZW5sICE9ICJcbiI6CisgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCJcbiIsIHNlbGYuX3dyaXRlbmwpCisgICAgICAgIGVuY29kZXIgPSBzZWxmLl9lbmNvZGVyIG9yIHNlbGYuX2dldF9lbmNvZGVyKCkKKyAgICAgICAgIyBYWFggV2hhdCBpZiB3ZSB3ZXJlIGp1c3QgcmVhZGluZz8KKyAgICAgICAgYiA9IGVuY29kZXIuZW5jb2RlKHMpCisgICAgICAgIHNlbGYuYnVmZmVyLndyaXRlKGIpCisgICAgICAgIGlmIHNlbGYuX2xpbmVfYnVmZmVyaW5nIGFuZCAoaGFzbGYgb3IgIlxyIiBpbiBzKToKKyAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBzZWxmLl9zbmFwc2hvdCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5fZGVjb2RlcjoKKyAgICAgICAgICAgIHNlbGYuX2RlY29kZXIucmVzZXQoKQorICAgICAgICByZXR1cm4gbGVuZ3RoCisKKyAgICBkZWYgX2dldF9lbmNvZGVyKHNlbGYpOgorICAgICAgICBtYWtlX2VuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKHNlbGYuX2VuY29kaW5nKQorICAgICAgICBzZWxmLl9lbmNvZGVyID0gbWFrZV9lbmNvZGVyKHNlbGYuX2Vycm9ycykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kZXIKKworICAgIGRlZiBfZ2V0X2RlY29kZXIoc2VsZik6CisgICAgICAgIG1ha2VfZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoc2VsZi5fZW5jb2RpbmcpCisgICAgICAgIGRlY29kZXIgPSBtYWtlX2RlY29kZXIoc2VsZi5fZXJyb3JzKQorICAgICAgICBpZiBzZWxmLl9yZWFkdW5pdmVyc2FsOgorICAgICAgICAgICAgZGVjb2RlciA9IEluY3JlbWVudGFsTmV3bGluZURlY29kZXIoZGVjb2Rlciwgc2VsZi5fcmVhZHRyYW5zbGF0ZSkKKyAgICAgICAgc2VsZi5fZGVjb2RlciA9IGRlY29kZXIKKyAgICAgICAgcmV0dXJuIGRlY29kZXIKKworICAgICMgVGhlIGZvbGxvd2luZyB0aHJlZSBtZXRob2RzIGltcGxlbWVudCBhbiBBRFQgZm9yIF9kZWNvZGVkX2NoYXJzLgorICAgICMgVGV4dCByZXR1cm5lZCBmcm9tIHRoZSBkZWNvZGVyIGlzIGJ1ZmZlcmVkIGhlcmUgdW50aWwgdGhlIGNsaWVudAorICAgICMgcmVxdWVzdHMgaXQgYnkgY2FsbGluZyBvdXIgcmVhZCgpIG9yIHJlYWRsaW5lKCkgbWV0aG9kLgorICAgIGRlZiBfc2V0X2RlY29kZWRfY2hhcnMoc2VsZiwgY2hhcnMpOgorICAgICAgICAiIiJTZXQgdGhlIF9kZWNvZGVkX2NoYXJzIGJ1ZmZlci4iIiIKKyAgICAgICAgc2VsZi5fZGVjb2RlZF9jaGFycyA9IGNoYXJzCisgICAgICAgIHNlbGYuX2RlY29kZWRfY2hhcnNfdXNlZCA9IDAKKworICAgIGRlZiBfZ2V0X2RlY29kZWRfY2hhcnMoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgIiIiQWR2YW5jZSBpbnRvIHRoZSBfZGVjb2RlZF9jaGFycyBidWZmZXIuIiIiCisgICAgICAgIG9mZnNldCA9IHNlbGYuX2RlY29kZWRfY2hhcnNfdXNlZAorICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICBjaGFycyA9IHNlbGYuX2RlY29kZWRfY2hhcnNbb2Zmc2V0Ol0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNoYXJzID0gc2VsZi5fZGVjb2RlZF9jaGFyc1tvZmZzZXQ6b2Zmc2V0ICsgbl0KKyAgICAgICAgc2VsZi5fZGVjb2RlZF9jaGFyc191c2VkICs9IGxlbihjaGFycykKKyAgICAgICAgcmV0dXJuIGNoYXJzCisKKyAgICBkZWYgX3Jld2luZF9kZWNvZGVkX2NoYXJzKHNlbGYsIG4pOgorICAgICAgICAiIiJSZXdpbmQgdGhlIF9kZWNvZGVkX2NoYXJzIGJ1ZmZlci4iIiIKKyAgICAgICAgaWYgc2VsZi5fZGVjb2RlZF9jaGFyc191c2VkIDwgbjoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJyZXdpbmQgZGVjb2RlZF9jaGFycyBvdXQgb2YgYm91bmRzIikKKyAgICAgICAgc2VsZi5fZGVjb2RlZF9jaGFyc191c2VkIC09IG4KKworICAgIGRlZiBfcmVhZF9jaHVuayhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlYWQgYW5kIGRlY29kZSB0aGUgbmV4dCBjaHVuayBvZiBkYXRhIGZyb20gdGhlIEJ1ZmZlcmVkUmVhZGVyLgorICAgICAgICAiIiIKKworICAgICAgICAjIFRoZSByZXR1cm4gdmFsdWUgaXMgVHJ1ZSB1bmxlc3MgRU9GIHdhcyByZWFjaGVkLiAgVGhlIGRlY29kZWQKKyAgICAgICAgIyBzdHJpbmcgaXMgcGxhY2VkIGluIHNlbGYuX2RlY29kZWRfY2hhcnMgKHJlcGxhY2luZyBpdHMgcHJldmlvdXMKKyAgICAgICAgIyB2YWx1ZSkuICBUaGUgZW50aXJlIGlucHV0IGNodW5rIGlzIHNlbnQgdG8gdGhlIGRlY29kZXIsIHRob3VnaAorICAgICAgICAjIHNvbWUgb2YgaXQgbWF5IHJlbWFpbiBidWZmZXJlZCBpbiB0aGUgZGVjb2RlciwgeWV0IHRvIGJlCisgICAgICAgICMgY29udmVydGVkLgorCisgICAgICAgIGlmIHNlbGYuX2RlY29kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIGRlY29kZXIiKQorCisgICAgICAgIGlmIHNlbGYuX3RlbGxpbmc6CisgICAgICAgICAgICAjIFRvIHByZXBhcmUgZm9yIHRlbGwoKSwgd2UgbmVlZCB0byBzbmFwc2hvdCBhIHBvaW50IGluIHRoZQorICAgICAgICAgICAgIyBmaWxlIHdoZXJlIHRoZSBkZWNvZGVyJ3MgaW5wdXQgYnVmZmVyIGlzIGVtcHR5LgorCisgICAgICAgICAgICBkZWNfYnVmZmVyLCBkZWNfZmxhZ3MgPSBzZWxmLl9kZWNvZGVyLmdldHN0YXRlKCkKKyAgICAgICAgICAgICMgR2l2ZW4gdGhpcywgd2Uga25vdyB0aGVyZSB3YXMgYSB2YWxpZCBzbmFwc2hvdCBwb2ludAorICAgICAgICAgICAgIyBsZW4oZGVjX2J1ZmZlcikgYnl0ZXMgYWdvIHdpdGggZGVjb2RlciBzdGF0ZSAoYicnLCBkZWNfZmxhZ3MpLgorCisgICAgICAgICMgUmVhZCBhIGNodW5rLCBkZWNvZGUgaXQsIGFuZCBwdXQgdGhlIHJlc3VsdCBpbiBzZWxmLl9kZWNvZGVkX2NoYXJzLgorICAgICAgICBpbnB1dF9jaHVuayA9IHNlbGYuYnVmZmVyLnJlYWQxKHNlbGYuX0NIVU5LX1NJWkUpCisgICAgICAgIGVvZiA9IG5vdCBpbnB1dF9jaHVuaworICAgICAgICBzZWxmLl9zZXRfZGVjb2RlZF9jaGFycyhzZWxmLl9kZWNvZGVyLmRlY29kZShpbnB1dF9jaHVuaywgZW9mKSkKKworICAgICAgICBpZiBzZWxmLl90ZWxsaW5nOgorICAgICAgICAgICAgIyBBdCB0aGUgc25hcHNob3QgcG9pbnQsIGxlbihkZWNfYnVmZmVyKSBieXRlcyBiZWZvcmUgdGhlIHJlYWQsCisgICAgICAgICAgICAjIHRoZSBuZXh0IGlucHV0IHRvIGJlIGRlY29kZWQgaXMgZGVjX2J1ZmZlciArIGlucHV0X2NodW5rLgorICAgICAgICAgICAgc2VsZi5fc25hcHNob3QgPSAoZGVjX2ZsYWdzLCBkZWNfYnVmZmVyICsgaW5wdXRfY2h1bmspCisKKyAgICAgICAgcmV0dXJuIG5vdCBlb2YKKworICAgIGRlZiBfcGFja19jb29raWUoc2VsZiwgcG9zaXRpb24sIGRlY19mbGFncz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNfdG9fZmVlZD0wLCBuZWVkX2VvZj0wLCBjaGFyc190b19za2lwPTApOgorICAgICAgICAjIFRoZSBtZWFuaW5nIG9mIGEgdGVsbCgpIGNvb2tpZSBpczogc2VlayB0byBwb3NpdGlvbiwgc2V0IHRoZQorICAgICAgICAjIGRlY29kZXIgZmxhZ3MgdG8gZGVjX2ZsYWdzLCByZWFkIGJ5dGVzX3RvX2ZlZWQgYnl0ZXMsIGZlZWQgdGhlbQorICAgICAgICAjIGludG8gdGhlIGRlY29kZXIgd2l0aCBuZWVkX2VvZiBhcyB0aGUgRU9GIGZsYWcsIHRoZW4gc2tpcAorICAgICAgICAjIGNoYXJzX3RvX3NraXAgY2hhcmFjdGVycyBvZiB0aGUgZGVjb2RlZCByZXN1bHQuICBGb3IgbW9zdCBzaW1wbGUKKyAgICAgICAgIyBkZWNvZGVycywgdGVsbCgpIHdpbGwgb2Z0ZW4ganVzdCBnaXZlIGEgYnl0ZSBvZmZzZXQgaW4gdGhlIGZpbGUuCisgICAgICAgIHJldHVybiAocG9zaXRpb24gfCAoZGVjX2ZsYWdzPDw2NCkgfCAoYnl0ZXNfdG9fZmVlZDw8MTI4KSB8CisgICAgICAgICAgICAgICAoY2hhcnNfdG9fc2tpcDw8MTkyKSB8IGJvb2wobmVlZF9lb2YpPDwyNTYpCisKKyAgICBkZWYgX3VucGFja19jb29raWUoc2VsZiwgYmlnaW50KToKKyAgICAgICAgcmVzdCwgcG9zaXRpb24gPSBkaXZtb2QoYmlnaW50LCAxPDw2NCkKKyAgICAgICAgcmVzdCwgZGVjX2ZsYWdzID0gZGl2bW9kKHJlc3QsIDE8PDY0KQorICAgICAgICByZXN0LCBieXRlc190b19mZWVkID0gZGl2bW9kKHJlc3QsIDE8PDY0KQorICAgICAgICBuZWVkX2VvZiwgY2hhcnNfdG9fc2tpcCA9IGRpdm1vZChyZXN0LCAxPDw2NCkKKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uLCBkZWNfZmxhZ3MsIGJ5dGVzX3RvX2ZlZWQsIG5lZWRfZW9mLCBjaGFyc190b19za2lwCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlZWthYmxlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigidW5kZXJseWluZyBzdHJlYW0gaXMgbm90IHNlZWthYmxlIikKKyAgICAgICAgaWYgbm90IHNlbGYuX3RlbGxpbmc6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJ0ZWxsaW5nIHBvc2l0aW9uIGRpc2FibGVkIGJ5IG5leHQoKSBjYWxsIikKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHBvc2l0aW9uID0gc2VsZi5idWZmZXIudGVsbCgpCisgICAgICAgIGRlY29kZXIgPSBzZWxmLl9kZWNvZGVyCisgICAgICAgIGlmIGRlY29kZXIgaXMgTm9uZSBvciBzZWxmLl9zbmFwc2hvdCBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5fZGVjb2RlZF9jaGFyczoKKyAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4KKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigicGVuZGluZyBkZWNvZGVkIHRleHQiKQorICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uCisKKyAgICAgICAgIyBTa2lwIGJhY2t3YXJkIHRvIHRoZSBzbmFwc2hvdCBwb2ludCAoc2VlIF9yZWFkX2NodW5rKS4KKyAgICAgICAgZGVjX2ZsYWdzLCBuZXh0X2lucHV0ID0gc2VsZi5fc25hcHNob3QKKyAgICAgICAgcG9zaXRpb24gLT0gbGVuKG5leHRfaW5wdXQpCisKKyAgICAgICAgIyBIb3cgbWFueSBkZWNvZGVkIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHVzZWQgdXAgc2luY2UgdGhlIHNuYXBzaG90PworICAgICAgICBjaGFyc190b19za2lwID0gc2VsZi5fZGVjb2RlZF9jaGFyc191c2VkCisgICAgICAgIGlmIGNoYXJzX3RvX3NraXAgPT0gMDoKKyAgICAgICAgICAgICMgV2UgaGF2ZW4ndCBtb3ZlZCBmcm9tIHRoZSBzbmFwc2hvdCBwb2ludC4KKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wYWNrX2Nvb2tpZShwb3NpdGlvbiwgZGVjX2ZsYWdzKQorCisgICAgICAgICMgU3RhcnRpbmcgZnJvbSB0aGUgc25hcHNob3QgcG9zaXRpb24sIHdlIHdpbGwgd2FsayB0aGUgZGVjb2RlcgorICAgICAgICAjIGZvcndhcmQgdW50aWwgaXQgZ2l2ZXMgdXMgZW5vdWdoIGRlY29kZWQgY2hhcmFjdGVycy4KKyAgICAgICAgc2F2ZWRfc3RhdGUgPSBkZWNvZGVyLmdldHN0YXRlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBOb3RlIG91ciBpbml0aWFsIHN0YXJ0IHBvaW50LgorICAgICAgICAgICAgZGVjb2Rlci5zZXRzdGF0ZSgoYicnLCBkZWNfZmxhZ3MpKQorICAgICAgICAgICAgc3RhcnRfcG9zID0gcG9zaXRpb24KKyAgICAgICAgICAgIHN0YXJ0X2ZsYWdzLCBieXRlc19mZWQsIGNoYXJzX2RlY29kZWQgPSBkZWNfZmxhZ3MsIDAsIDAKKyAgICAgICAgICAgIG5lZWRfZW9mID0gMAorCisgICAgICAgICAgICAjIEZlZWQgdGhlIGRlY29kZXIgb25lIGJ5dGUgYXQgYSB0aW1lLiAgQXMgd2UgZ28sIG5vdGUgdGhlCisgICAgICAgICAgICAjIG5lYXJlc3QgInNhZmUgc3RhcnQgcG9pbnQiIGJlZm9yZSB0aGUgY3VycmVudCBsb2NhdGlvbgorICAgICAgICAgICAgIyAoYSBwb2ludCB3aGVyZSB0aGUgZGVjb2RlciBoYXMgbm90aGluZyBidWZmZXJlZCwgc28gc2VlaygpCisgICAgICAgICAgICAjIGNhbiBzYWZlbHkgc3RhcnQgZnJvbSB0aGVyZSBhbmQgYWR2YW5jZSB0byB0aGlzIGxvY2F0aW9uKS4KKyAgICAgICAgICAgIGZvciBuZXh0X2J5dGUgaW4gbmV4dF9pbnB1dDoKKyAgICAgICAgICAgICAgICBieXRlc19mZWQgKz0gMQorICAgICAgICAgICAgICAgIGNoYXJzX2RlY29kZWQgKz0gbGVuKGRlY29kZXIuZGVjb2RlKG5leHRfYnl0ZSkpCisgICAgICAgICAgICAgICAgZGVjX2J1ZmZlciwgZGVjX2ZsYWdzID0gZGVjb2Rlci5nZXRzdGF0ZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGRlY19idWZmZXIgYW5kIGNoYXJzX2RlY29kZWQgPD0gY2hhcnNfdG9fc2tpcDoKKyAgICAgICAgICAgICAgICAgICAgIyBEZWNvZGVyIGJ1ZmZlciBpcyBlbXB0eSwgc28gdGhpcyBpcyBhIHNhZmUgc3RhcnQgcG9pbnQuCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3BvcyArPSBieXRlc19mZWQKKyAgICAgICAgICAgICAgICAgICAgY2hhcnNfdG9fc2tpcCAtPSBjaGFyc19kZWNvZGVkCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2ZsYWdzLCBieXRlc19mZWQsIGNoYXJzX2RlY29kZWQgPSBkZWNfZmxhZ3MsIDAsIDAKKyAgICAgICAgICAgICAgICBpZiBjaGFyc19kZWNvZGVkID49IGNoYXJzX3RvX3NraXA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgV2UgZGlkbid0IGdldCBlbm91Z2ggZGVjb2RlZCBkYXRhOyBzaWduYWwgRU9GIHRvIGdldCBtb3JlLgorICAgICAgICAgICAgICAgIGNoYXJzX2RlY29kZWQgKz0gbGVuKGRlY29kZXIuZGVjb2RlKGInJywgZmluYWw9VHJ1ZSkpCisgICAgICAgICAgICAgICAgbmVlZF9lb2YgPSAxCisgICAgICAgICAgICAgICAgaWYgY2hhcnNfZGVjb2RlZCA8IGNoYXJzX3RvX3NraXA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImNhbid0IHJlY29uc3RydWN0IGxvZ2ljYWwgZmlsZSBwb3NpdGlvbiIpCisKKyAgICAgICAgICAgICMgVGhlIHJldHVybmVkIGNvb2tpZSBjb3JyZXNwb25kcyB0byB0aGUgbGFzdCBzYWZlIHN0YXJ0IHBvaW50LgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhY2tfY29va2llKAorICAgICAgICAgICAgICAgIHN0YXJ0X3Bvcywgc3RhcnRfZmxhZ3MsIGJ5dGVzX2ZlZCwgbmVlZF9lb2YsIGNoYXJzX3RvX3NraXApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWNvZGVyLnNldHN0YXRlKHNhdmVkX3N0YXRlKQorCisgICAgZGVmIHRydW5jYXRlKHNlbGYsIHBvcz1Ob25lKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIGlmIHBvcyBpcyBOb25lOgorICAgICAgICAgICAgcG9zID0gc2VsZi50ZWxsKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyLnRydW5jYXRlKHBvcykKKworICAgIGRlZiBkZXRhY2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJidWZmZXIgaXMgYWxyZWFkeSBkZXRhY2hlZCIpCisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBidWZmZXIgPSBzZWxmLl9idWZmZXIKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gTm9uZQorICAgICAgICByZXR1cm4gYnVmZmVyCisKKyAgICBkZWYgc2VlayhzZWxmLCBjb29raWUsIHdoZW5jZT0wKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ0ZWxsIG9uIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlZWthYmxlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigidW5kZXJseWluZyBzdHJlYW0gaXMgbm90IHNlZWthYmxlIikKKyAgICAgICAgaWYgd2hlbmNlID09IDE6ICMgc2VlayByZWxhdGl2ZSB0byBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgICAgICBpZiBjb29raWUgIT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJjYW4ndCBkbyBub256ZXJvIGN1ci1yZWxhdGl2ZSBzZWVrcyIpCisgICAgICAgICAgICAjIFNlZWtpbmcgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gc2hvdWxkIGF0dGVtcHQgdG8KKyAgICAgICAgICAgICMgc3luYyB0aGUgdW5kZXJseWluZyBidWZmZXIgd2l0aCB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAgICAgICAgICAgIHdoZW5jZSA9IDAKKyAgICAgICAgICAgIGNvb2tpZSA9IHNlbGYudGVsbCgpCisgICAgICAgIGlmIHdoZW5jZSA9PSAyOiAjIHNlZWsgcmVsYXRpdmUgdG8gZW5kIG9mIGZpbGUKKyAgICAgICAgICAgIGlmIGNvb2tpZSAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImNhbid0IGRvIG5vbnplcm8gZW5kLXJlbGF0aXZlIHNlZWtzIikKKyAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICAgICAgcG9zaXRpb24gPSBzZWxmLmJ1ZmZlci5zZWVrKDAsIDIpCisgICAgICAgICAgICBzZWxmLl9zZXRfZGVjb2RlZF9jaGFycygnJykKKyAgICAgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5fZGVjb2RlcjoKKyAgICAgICAgICAgICAgICBzZWxmLl9kZWNvZGVyLnJlc2V0KCkKKyAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbgorICAgICAgICBpZiB3aGVuY2UgIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgd2hlbmNlICglciwgc2hvdWxkIGJlIDAsIDEgb3IgMikiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW5jZSwpKQorICAgICAgICBpZiBjb29raWUgPCAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibmVnYXRpdmUgc2VlayBwb3NpdGlvbiAlciIgJSAoY29va2llLCkpCisgICAgICAgIHNlbGYuZmx1c2goKQorCisgICAgICAgICMgVGhlIHN0cmF0ZWd5IG9mIHNlZWsoKSBpcyB0byBnbyBiYWNrIHRvIHRoZSBzYWZlIHN0YXJ0IHBvaW50CisgICAgICAgICMgYW5kIHJlcGxheSB0aGUgZWZmZWN0IG9mIHJlYWQoY2hhcnNfdG9fc2tpcCkgZnJvbSB0aGVyZS4KKyAgICAgICAgc3RhcnRfcG9zLCBkZWNfZmxhZ3MsIGJ5dGVzX3RvX2ZlZWQsIG5lZWRfZW9mLCBjaGFyc190b19za2lwID0gXAorICAgICAgICAgICAgc2VsZi5fdW5wYWNrX2Nvb2tpZShjb29raWUpCisKKyAgICAgICAgIyBTZWVrIGJhY2sgdG8gdGhlIHNhZmUgc3RhcnQgcG9pbnQuCisgICAgICAgIHNlbGYuYnVmZmVyLnNlZWsoc3RhcnRfcG9zKQorICAgICAgICBzZWxmLl9zZXRfZGVjb2RlZF9jaGFycygnJykKKyAgICAgICAgc2VsZi5fc25hcHNob3QgPSBOb25lCisKKyAgICAgICAgIyBSZXN0b3JlIHRoZSBkZWNvZGVyIHRvIGl0cyBzdGF0ZSBmcm9tIHRoZSBzYWZlIHN0YXJ0IHBvaW50LgorICAgICAgICBpZiBjb29raWUgPT0gMCBhbmQgc2VsZi5fZGVjb2RlcjoKKyAgICAgICAgICAgIHNlbGYuX2RlY29kZXIucmVzZXQoKQorICAgICAgICBlbGlmIHNlbGYuX2RlY29kZXIgb3IgZGVjX2ZsYWdzIG9yIGNoYXJzX3RvX3NraXA6CisgICAgICAgICAgICBzZWxmLl9kZWNvZGVyID0gc2VsZi5fZGVjb2RlciBvciBzZWxmLl9nZXRfZGVjb2RlcigpCisgICAgICAgICAgICBzZWxmLl9kZWNvZGVyLnNldHN0YXRlKChiJycsIGRlY19mbGFncykpCisgICAgICAgICAgICBzZWxmLl9zbmFwc2hvdCA9IChkZWNfZmxhZ3MsIGInJykKKworICAgICAgICBpZiBjaGFyc190b19za2lwOgorICAgICAgICAgICAgIyBKdXN0IGxpa2UgX3JlYWRfY2h1bmssIGZlZWQgdGhlIGRlY29kZXIgYW5kIHNhdmUgYSBzbmFwc2hvdC4KKyAgICAgICAgICAgIGlucHV0X2NodW5rID0gc2VsZi5idWZmZXIucmVhZChieXRlc190b19mZWVkKQorICAgICAgICAgICAgc2VsZi5fc2V0X2RlY29kZWRfY2hhcnMoCisgICAgICAgICAgICAgICAgc2VsZi5fZGVjb2Rlci5kZWNvZGUoaW5wdXRfY2h1bmssIG5lZWRfZW9mKSkKKyAgICAgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gKGRlY19mbGFncywgaW5wdXRfY2h1bmspCisKKyAgICAgICAgICAgICMgU2tpcCBjaGFyc190b19za2lwIG9mIHRoZSBkZWNvZGVkIGNoYXJhY3RlcnMuCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5fZGVjb2RlZF9jaGFycykgPCBjaGFyc190b19za2lwOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImNhbid0IHJlc3RvcmUgbG9naWNhbCBmaWxlIHBvc2l0aW9uIikKKyAgICAgICAgICAgIHNlbGYuX2RlY29kZWRfY2hhcnNfdXNlZCA9IGNoYXJzX3RvX3NraXAKKworICAgICAgICAjIEZpbmFsbHksIHJlc2V0IHRoZSBlbmNvZGVyIChtZXJlbHkgdXNlZnVsIGZvciBwcm9wZXIgQk9NIGhhbmRsaW5nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbmNvZGVyID0gc2VsZi5fZW5jb2RlciBvciBzZWxmLl9nZXRfZW5jb2RlcigpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICMgU29tZXRpbWVzIHRoZSBlbmNvZGVyIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGNvb2tpZSAhPSAwOgorICAgICAgICAgICAgICAgIGVuY29kZXIuc2V0c3RhdGUoMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW5jb2Rlci5yZXNldCgpCisgICAgICAgIHJldHVybiBjb29raWUKKworICAgIGRlZiByZWFkKHNlbGYsIG49Tm9uZSk6CisgICAgICAgIHNlbGYuX2NoZWNrUmVhZGFibGUoKQorICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICBuID0gLTEKKyAgICAgICAgZGVjb2RlciA9IHNlbGYuX2RlY29kZXIgb3Igc2VsZi5fZ2V0X2RlY29kZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuLl9faW5kZXhfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImFuIGludGVnZXIgaXMgcmVxdWlyZWQiKQorICAgICAgICBpZiBuIDwgMDoKKyAgICAgICAgICAgICMgUmVhZCBldmVyeXRoaW5nLgorICAgICAgICAgICAgcmVzdWx0ID0gKHNlbGYuX2dldF9kZWNvZGVkX2NoYXJzKCkgKworICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIuZGVjb2RlKHNlbGYuYnVmZmVyLnJlYWQoKSwgZmluYWw9VHJ1ZSkpCisgICAgICAgICAgICBzZWxmLl9zZXRfZGVjb2RlZF9jaGFycygnJykKKyAgICAgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBLZWVwIHJlYWRpbmcgY2h1bmtzIHVudGlsIHdlIGhhdmUgbiBjaGFyYWN0ZXJzIHRvIHJldHVybi4KKyAgICAgICAgICAgIGVvZiA9IEZhbHNlCisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLl9nZXRfZGVjb2RlZF9jaGFycyhuKQorICAgICAgICAgICAgd2hpbGUgbGVuKHJlc3VsdCkgPCBuIGFuZCBub3QgZW9mOgorICAgICAgICAgICAgICAgIGVvZiA9IG5vdCBzZWxmLl9yZWFkX2NodW5rKCkKKyAgICAgICAgICAgICAgICByZXN1bHQgKz0gc2VsZi5fZ2V0X2RlY29kZWRfY2hhcnMobiAtIGxlbihyZXN1bHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHNlbGYuX3RlbGxpbmcgPSBGYWxzZQorICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgc2VsZi5fc25hcHNob3QgPSBOb25lCisgICAgICAgICAgICBzZWxmLl90ZWxsaW5nID0gc2VsZi5fc2Vla2FibGUKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBsaW1pdD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZWFkIGZyb20gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBsaW1pdCBpcyBOb25lOgorICAgICAgICAgICAgbGltaXQgPSAtMQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGxpbWl0LCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciIpCisKKyAgICAgICAgIyBHcmFiIGFsbCB0aGUgZGVjb2RlZCB0ZXh0ICh3ZSB3aWxsIHJld2luZCBhbnkgZXh0cmEgYml0cyBsYXRlcikuCisgICAgICAgIGxpbmUgPSBzZWxmLl9nZXRfZGVjb2RlZF9jaGFycygpCisKKyAgICAgICAgc3RhcnQgPSAwCisgICAgICAgICMgTWFrZSB0aGUgZGVjb2RlciBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCisgICAgICAgIGlmIG5vdCBzZWxmLl9kZWNvZGVyOgorICAgICAgICAgICAgc2VsZi5fZ2V0X2RlY29kZXIoKQorCisgICAgICAgIHBvcyA9IGVuZHBvcyA9IE5vbmUKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHNlbGYuX3JlYWR0cmFuc2xhdGU6CisgICAgICAgICAgICAgICAgIyBOZXdsaW5lcyBhcmUgYWxyZWFkeSB0cmFuc2xhdGVkLCBvbmx5IHNlYXJjaCBmb3IgXG4KKyAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmZpbmQoJ1xuJywgc3RhcnQpCisgICAgICAgICAgICAgICAgaWYgcG9zID49IDA6CisgICAgICAgICAgICAgICAgICAgIGVuZHBvcyA9IHBvcyArIDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxlbihsaW5lKQorCisgICAgICAgICAgICBlbGlmIHNlbGYuX3JlYWR1bml2ZXJzYWw6CisgICAgICAgICAgICAgICAgIyBVbml2ZXJzYWwgbmV3bGluZSBzZWFyY2guIEZpbmQgYW55IG9mIFxyLCBcclxuLCBcbgorICAgICAgICAgICAgICAgICMgVGhlIGRlY29kZXIgZW5zdXJlcyB0aGF0IFxyXG4gYXJlIG5vdCBzcGxpdCBpbiB0d28gcGllY2VzCisKKyAgICAgICAgICAgICAgICAjIEluIEMgd2UnZCBsb29rIGZvciB0aGVzZSBpbiBwYXJhbGxlbCBvZiBjb3Vyc2UuCisgICAgICAgICAgICAgICAgbmxwb3MgPSBsaW5lLmZpbmQoIlxuIiwgc3RhcnQpCisgICAgICAgICAgICAgICAgY3Jwb3MgPSBsaW5lLmZpbmQoIlxyIiwgc3RhcnQpCisgICAgICAgICAgICAgICAgaWYgY3Jwb3MgPT0gLTE6CisgICAgICAgICAgICAgICAgICAgIGlmIG5scG9zID09IC0xOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBOb3RoaW5nIGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGxlbihsaW5lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBGb3VuZCBcbgorICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gbmxwb3MgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgbmxwb3MgPT0gLTE6CisgICAgICAgICAgICAgICAgICAgICMgRm91bmQgbG9uZSBccgorICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBjcnBvcyArIDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIG5scG9zIDwgY3Jwb3M6CisgICAgICAgICAgICAgICAgICAgICMgRm91bmQgXG4KKyAgICAgICAgICAgICAgICAgICAgZW5kcG9zID0gbmxwb3MgKyAxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxpZiBubHBvcyA9PSBjcnBvcyArIDE6CisgICAgICAgICAgICAgICAgICAgICMgRm91bmQgXHJcbgorICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBjcnBvcyArIDIKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIFxyCisgICAgICAgICAgICAgICAgICAgIGVuZHBvcyA9IGNycG9zICsgMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIG5vbi11bml2ZXJzYWwKKyAgICAgICAgICAgICAgICBwb3MgPSBsaW5lLmZpbmQoc2VsZi5fcmVhZG5sKQorICAgICAgICAgICAgICAgIGlmIHBvcyA+PSAwOgorICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBwb3MgKyBsZW4oc2VsZi5fcmVhZG5sKQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBsaW1pdCA+PSAwIGFuZCBsZW4obGluZSkgPj0gbGltaXQ6CisgICAgICAgICAgICAgICAgZW5kcG9zID0gbGltaXQgICMgcmVhY2hlZCBsZW5ndGggbGltaXQKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIE5vIGxpbmUgZW5kaW5nIHNlZW4geWV0IC0gZ2V0IG1vcmUgZGF0YScKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuX3JlYWRfY2h1bmsoKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9kZWNvZGVkX2NoYXJzOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgc2VsZi5fZGVjb2RlZF9jaGFyczoKKyAgICAgICAgICAgICAgICBsaW5lICs9IHNlbGYuX2dldF9kZWNvZGVkX2NoYXJzKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBlbmQgb2YgZmlsZQorICAgICAgICAgICAgICAgIHNlbGYuX3NldF9kZWNvZGVkX2NoYXJzKCcnKQorICAgICAgICAgICAgICAgIHNlbGYuX3NuYXBzaG90ID0gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCisKKyAgICAgICAgaWYgbGltaXQgPj0gMCBhbmQgZW5kcG9zID4gbGltaXQ6CisgICAgICAgICAgICBlbmRwb3MgPSBsaW1pdCAgIyBkb24ndCBleGNlZWQgbGltaXQKKworICAgICAgICAjIFJld2luZCBfZGVjb2RlZF9jaGFycyB0byBqdXN0IGFmdGVyIHRoZSBsaW5lIGVuZGluZyB3ZSBmb3VuZC4KKyAgICAgICAgc2VsZi5fcmV3aW5kX2RlY29kZWRfY2hhcnMobGVuKGxpbmUpIC0gZW5kcG9zKQorICAgICAgICByZXR1cm4gbGluZVs6ZW5kcG9zXQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5ld2xpbmVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZGVjb2Rlci5uZXdsaW5lcyBpZiBzZWxmLl9kZWNvZGVyIGVsc2UgTm9uZQorCisKK2NsYXNzIFN0cmluZ0lPKFRleHRJT1dyYXBwZXIpOgorICAgICIiIlRleHQgSS9PIGltcGxlbWVudGF0aW9uIHVzaW5nIGFuIGluLW1lbW9yeSBidWZmZXIuCisKKyAgICBUaGUgaW5pdGlhbF92YWx1ZSBhcmd1bWVudCBzZXRzIHRoZSB2YWx1ZSBvZiBvYmplY3QuICBUaGUgbmV3bGluZQorICAgIGFyZ3VtZW50IGlzIGxpa2UgdGhlIG9uZSBvZiBUZXh0SU9XcmFwcGVyJ3MgY29uc3RydWN0b3IuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5pdGlhbF92YWx1ZT0iIiwgbmV3bGluZT0iXG4iKToKKyAgICAgICAgc3VwZXIoU3RyaW5nSU8sIHNlbGYpLl9faW5pdF9fKEJ5dGVzSU8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSJ1dGYtOCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM9InN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lPW5ld2xpbmUpCisgICAgICAgICMgSXNzdWUgIzU2NDU6IG1ha2UgdW5pdmVyc2FsIG5ld2xpbmVzIHNlbWFudGljcyB0aGUgc2FtZSBhcyBpbiB0aGUKKyAgICAgICAgIyBDIHZlcnNpb24sIGV2ZW4gdW5kZXIgV2luZG93cy4KKyAgICAgICAgaWYgbmV3bGluZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fd3JpdGV0cmFuc2xhdGUgPSBGYWxzZQorICAgICAgICBpZiBpbml0aWFsX3ZhbHVlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoaW5pdGlhbF92YWx1ZSwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgaW5pdGlhbF92YWx1ZSA9IHVuaWNvZGUoaW5pdGlhbF92YWx1ZSkKKyAgICAgICAgICAgIHNlbGYud3JpdGUoaW5pdGlhbF92YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuc2VlaygwKQorCisgICAgZGVmIGdldHZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmZmVyLmdldHZhbHVlKCkuZGVjb2RlKHNlbGYuX2VuY29kaW5nLCBzZWxmLl9lcnJvcnMpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICMgVGV4dElPV3JhcHBlciB0ZWxscyB0aGUgZW5jb2RpbmcgaW4gaXRzIHJlcHIuIEluIFN0cmluZ0lPLAorICAgICAgICAjIHRoYXQncyBhIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAgICAgICAgcmV0dXJuIG9iamVjdC5fX3JlcHJfXyhzZWxmKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVycm9ycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBlbmNvZGluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBkZXRhY2goc2VsZik6CisgICAgICAgICMgVGhpcyBkb2Vzbid0IG1ha2Ugc2Vuc2Ugb24gU3RyaW5nSU8uCisgICAgICAgIHNlbGYuX3Vuc3VwcG9ydGVkKCJkZXRhY2giKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fcHlpby5weWMgYi9saWIvcHl0aG9uMi43L19weWlvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc0YTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fcHlpby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fcHlpby5weW8gYi9saWIvcHl0aG9uMi43L19weWlvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjc0YTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fcHlpby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHkgYi9saWIvcHl0aG9uMi43L19zdHJwdGltZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGYzMGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHkKQEAgLTAsMCArMSw0NjcgQEAKKyIiIlN0cnB0aW1lLXJlbGF0ZWQgY2xhc3NlcyBhbmQgZnVuY3Rpb25zLgorCitDTEFTU0VTOgorICAgIExvY2FsZVRpbWUgLS0gRGlzY292ZXJzIGFuZCBzdG9yZXMgbG9jYWxlLXNwZWNpZmljIHRpbWUgaW5mb3JtYXRpb24KKyAgICBUaW1lUkUgLS0gQ3JlYXRlcyByZWdleGVzIGZvciBwYXR0ZXJuIG1hdGNoaW5nIGEgc3RyaW5nIG9mIHRleHQgY29udGFpbmluZworICAgICAgICAgICAgICAgIHRpbWUgaW5mb3JtYXRpb24KKworRlVOQ1RJT05TOgorICAgIF9nZXRsYW5nIC0tIEZpZ3VyZSBvdXQgd2hhdCBsYW5ndWFnZSBpcyBiZWluZyB1c2VkIGZvciB0aGUgbG9jYWxlCisgICAgc3RycHRpbWUgLS0gQ2FsY3VsYXRlcyB0aGUgdGltZSBzdHJ1Y3QgcmVwcmVzZW50ZWQgYnkgdGhlIHBhc3NlZC1pbiBzdHJpbmcKKworIiIiCitpbXBvcnQgdGltZQoraW1wb3J0IGxvY2FsZQoraW1wb3J0IGNhbGVuZGFyCitmcm9tIHJlIGltcG9ydCBjb21waWxlIGFzIHJlX2NvbXBpbGUKK2Zyb20gcmUgaW1wb3J0IElHTk9SRUNBU0UKK2Zyb20gcmUgaW1wb3J0IGVzY2FwZSBhcyByZV9lc2NhcGUKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGUgYXMgZGF0ZXRpbWVfZGF0ZQordHJ5OgorICAgIGZyb20gdGhyZWFkIGltcG9ydCBhbGxvY2F0ZV9sb2NrIGFzIF90aHJlYWRfYWxsb2NhdGVfbG9jaworZXhjZXB0OgorICAgIGZyb20gZHVtbXlfdGhyZWFkIGltcG9ydCBhbGxvY2F0ZV9sb2NrIGFzIF90aHJlYWRfYWxsb2NhdGVfbG9jaworCitfX2FsbF9fID0gW10KKworZGVmIF9nZXRsYW5nKCk6CisgICAgIyBGaWd1cmUgb3V0IHdoYXQgdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaXMgc2V0IHRvLgorICAgIHJldHVybiBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FKQorCitjbGFzcyBMb2NhbGVUaW1lKG9iamVjdCk6CisgICAgIiIiU3RvcmVzIGFuZCBoYW5kbGVzIGxvY2FsZS1zcGVjaWZpYyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRpbWUuCisKKyAgICBBVFRSSUJVVEVTOgorICAgICAgICBmX3dlZWtkYXkgLS0gZnVsbCB3ZWVrZGF5IG5hbWVzICg3LWl0ZW0gbGlzdCkKKyAgICAgICAgYV93ZWVrZGF5IC0tIGFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZXMgKDctaXRlbSBsaXN0KQorICAgICAgICBmX21vbnRoIC0tIGZ1bGwgbW9udGggbmFtZXMgKDEzLWl0ZW0gbGlzdDsgZHVtbXkgdmFsdWUgaW4gWzBdLCB3aGljaAorICAgICAgICAgICAgICAgICAgICBpcyBhZGRlZCBieSBjb2RlKQorICAgICAgICBhX21vbnRoIC0tIGFiYnJldmlhdGVkIG1vbnRoIG5hbWVzICgxMy1pdGVtIGxpc3QsIGR1bW15IHZhbHVlIGluCisgICAgICAgICAgICAgICAgICAgIFswXSwgd2hpY2ggaXMgYWRkZWQgYnkgY29kZSkKKyAgICAgICAgYW1fcG0gLS0gQU0vUE0gcmVwcmVzZW50YXRpb24gKDItaXRlbSBsaXN0KQorICAgICAgICBMQ19kYXRlX3RpbWUgLS0gZm9ybWF0IHN0cmluZyBmb3IgZGF0ZS90aW1lIHJlcHJlc2VudGF0aW9uIChzdHJpbmcpCisgICAgICAgIExDX2RhdGUgLS0gZm9ybWF0IHN0cmluZyBmb3IgZGF0ZSByZXByZXNlbnRhdGlvbiAoc3RyaW5nKQorICAgICAgICBMQ190aW1lIC0tIGZvcm1hdCBzdHJpbmcgZm9yIHRpbWUgcmVwcmVzZW50YXRpb24gKHN0cmluZykKKyAgICAgICAgdGltZXpvbmUgLS0gZGF5bGlnaHQtIGFuZCBub24tZGF5bGlnaHQtc2F2aW5ncyB0aW1lem9uZSByZXByZXNlbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAoMi1pdGVtIGxpc3Qgb2Ygc2V0cykKKyAgICAgICAgbGFuZyAtLSBMYW5ndWFnZSB1c2VkIGJ5IGluc3RhbmNlICgyLWl0ZW0gdHVwbGUpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICIiIlNldCBhbGwgYXR0cmlidXRlcy4KKworICAgICAgICBPcmRlciBvZiBtZXRob2RzIGNhbGxlZCBtYXR0ZXJzIGZvciBkZXBlbmRlbmN5IHJlYXNvbnMuCisKKyAgICAgICAgVGhlIGxvY2FsZSBsYW5ndWFnZSBpcyBzZXQgYXQgdGhlIG9mZnNldCBhbmQgdGhlbiBjaGVja2VkIGFnYWluIGJlZm9yZQorICAgICAgICBleGl0aW5nLiAgVGhpcyBpcyB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYXR0cmlidXRlcyB3ZXJlIG5vdCBzZXQgd2l0aCBhCisgICAgICAgIG1peCBvZiBpbmZvcm1hdGlvbiBmcm9tIG1vcmUgdGhhbiBvbmUgbG9jYWxlLiAgVGhpcyB3b3VsZCBtb3N0IGxpa2VseQorICAgICAgICBoYXBwZW4gd2hlbiB1c2luZyB0aHJlYWRzIHdoZXJlIG9uZSB0aHJlYWQgY2FsbHMgYSBsb2NhbGUtZGVwZW5kZW50CisgICAgICAgIGZ1bmN0aW9uIHdoaWxlIGFub3RoZXIgdGhyZWFkIGNoYW5nZXMgdGhlIGxvY2FsZSB3aGlsZSB0aGUgZnVuY3Rpb24gaW4KKyAgICAgICAgdGhlIG90aGVyIHRocmVhZCBpcyBzdGlsbCBydW5uaW5nLiAgUHJvcGVyIGNvZGluZyB3b3VsZCBjYWxsIGZvcgorICAgICAgICBsb2NrcyB0byBwcmV2ZW50IGNoYW5naW5nIHRoZSBsb2NhbGUgd2hpbGUgbG9jYWxlLWRlcGVuZGVudCBjb2RlIGlzCisgICAgICAgIHJ1bm5pbmcuICBUaGUgY2hlY2sgaGVyZSBpcyBkb25lIGluIGNhc2Ugc29tZW9uZSBkb2VzIG5vdCB0aGluayBhYm91dAorICAgICAgICBkb2luZyB0aGlzLgorCisgICAgICAgIE9ubHkgb3RoZXIgcG9zc2libGUgaXNzdWUgaXMgaWYgc29tZW9uZSBjaGFuZ2VkIHRoZSB0aW1lem9uZSBhbmQgZGlkCisgICAgICAgIG5vdCBjYWxsIHR6LnR6c2V0IC4gIFRoYXQgaXMgYW4gaXNzdWUgZm9yIHRoZSBwcm9ncmFtbWVyLCB0aG91Z2gsCisgICAgICAgIHNpbmNlIGNoYW5naW5nIHRoZSB0aW1lem9uZSBpcyB3b3J0aGxlc3Mgd2l0aG91dCB0aGF0IGNhbGwuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubGFuZyA9IF9nZXRsYW5nKCkKKyAgICAgICAgc2VsZi5fX2NhbGNfd2Vla2RheSgpCisgICAgICAgIHNlbGYuX19jYWxjX21vbnRoKCkKKyAgICAgICAgc2VsZi5fX2NhbGNfYW1fcG0oKQorICAgICAgICBzZWxmLl9fY2FsY190aW1lem9uZSgpCisgICAgICAgIHNlbGYuX19jYWxjX2RhdGVfdGltZSgpCisgICAgICAgIGlmIF9nZXRsYW5nKCkgIT0gc2VsZi5sYW5nOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibG9jYWxlIGNoYW5nZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uIikKKworICAgIGRlZiBfX3BhZChzZWxmLCBzZXEsIGZyb250KToKKyAgICAgICAgIyBBZGQgJycgdG8gc2VxIHRvIGVpdGhlciB0aGUgZnJvbnQgKGlzIFRydWUpLCBlbHNlIHRoZSBiYWNrLgorICAgICAgICBzZXEgPSBsaXN0KHNlcSkKKyAgICAgICAgaWYgZnJvbnQ6CisgICAgICAgICAgICBzZXEuaW5zZXJ0KDAsICcnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VxLmFwcGVuZCgnJykKKyAgICAgICAgcmV0dXJuIHNlcQorCisgICAgZGVmIF9fY2FsY193ZWVrZGF5KHNlbGYpOgorICAgICAgICAjIFNldCBzZWxmLmFfd2Vla2RheSBhbmQgc2VsZi5mX3dlZWtkYXkgdXNpbmcgdGhlIGNhbGVuZGFyCisgICAgICAgICMgbW9kdWxlLgorICAgICAgICBhX3dlZWtkYXkgPSBbY2FsZW5kYXIuZGF5X2FiYnJbaV0ubG93ZXIoKSBmb3IgaSBpbiByYW5nZSg3KV0KKyAgICAgICAgZl93ZWVrZGF5ID0gW2NhbGVuZGFyLmRheV9uYW1lW2ldLmxvd2VyKCkgZm9yIGkgaW4gcmFuZ2UoNyldCisgICAgICAgIHNlbGYuYV93ZWVrZGF5ID0gYV93ZWVrZGF5CisgICAgICAgIHNlbGYuZl93ZWVrZGF5ID0gZl93ZWVrZGF5CisKKyAgICBkZWYgX19jYWxjX21vbnRoKHNlbGYpOgorICAgICAgICAjIFNldCBzZWxmLmZfbW9udGggYW5kIHNlbGYuYV9tb250aCB1c2luZyB0aGUgY2FsZW5kYXIgbW9kdWxlLgorICAgICAgICBhX21vbnRoID0gW2NhbGVuZGFyLm1vbnRoX2FiYnJbaV0ubG93ZXIoKSBmb3IgaSBpbiByYW5nZSgxMyldCisgICAgICAgIGZfbW9udGggPSBbY2FsZW5kYXIubW9udGhfbmFtZVtpXS5sb3dlcigpIGZvciBpIGluIHJhbmdlKDEzKV0KKyAgICAgICAgc2VsZi5hX21vbnRoID0gYV9tb250aAorICAgICAgICBzZWxmLmZfbW9udGggPSBmX21vbnRoCisKKyAgICBkZWYgX19jYWxjX2FtX3BtKHNlbGYpOgorICAgICAgICAjIFNldCBzZWxmLmFtX3BtIGJ5IHVzaW5nIHRpbWUuc3RyZnRpbWUoKS4KKworICAgICAgICAjIFRoZSBtYWdpYyBkYXRlICgxOTk5LDMsMTcsaG91ciw0NCw1NSwyLDc2LDApIGlzIG5vdCByZWFsbHkgdGhhdAorICAgICAgICAjIG1hZ2ljYWw7IGp1c3QgaGFwcGVuZWQgdG8gaGF2ZSB1c2VkIGl0IGV2ZXJ5d2hlcmUgZWxzZSB3aGVyZSBhCisgICAgICAgICMgc3RhdGljIGRhdGUgd2FzIG5lZWRlZC4KKyAgICAgICAgYW1fcG0gPSBbXQorICAgICAgICBmb3IgaG91ciBpbiAoMDEsMjIpOgorICAgICAgICAgICAgdGltZV90dXBsZSA9IHRpbWUuc3RydWN0X3RpbWUoKDE5OTksMywxNyxob3VyLDQ0LDU1LDIsNzYsMCkpCisgICAgICAgICAgICBhbV9wbS5hcHBlbmQodGltZS5zdHJmdGltZSgiJXAiLCB0aW1lX3R1cGxlKS5sb3dlcigpKQorICAgICAgICBzZWxmLmFtX3BtID0gYW1fcG0KKworICAgIGRlZiBfX2NhbGNfZGF0ZV90aW1lKHNlbGYpOgorICAgICAgICAjIFNldCBzZWxmLmRhdGVfdGltZSwgc2VsZi5kYXRlLCAmIHNlbGYudGltZSBieSB1c2luZworICAgICAgICAjIHRpbWUuc3RyZnRpbWUoKS4KKworICAgICAgICAjIFVzZSAoMTk5OSwzLDE3LDIyLDQ0LDU1LDIsNzYsMCkgZm9yIG1hZ2ljIGRhdGUgYmVjYXVzZSB0aGUgYW1vdW50IG9mCisgICAgICAgICMgb3ZlcmxvYWRlZCBudW1iZXJzIGlzIG1pbmltaXplZC4gIFRoZSBvcmRlciBpbiB3aGljaCBzZWFyY2hlcyBmb3IKKyAgICAgICAgIyB2YWx1ZXMgd2l0aGluIHRoZSBmb3JtYXQgc3RyaW5nIGlzIHZlcnkgaW1wb3J0YW50OyBpdCBlbGltaW5hdGVzCisgICAgICAgICMgcG9zc2libGUgYW1iaWd1aXR5IGZvciB3aGF0IHNvbWV0aGluZyByZXByZXNlbnRzLgorICAgICAgICB0aW1lX3R1cGxlID0gdGltZS5zdHJ1Y3RfdGltZSgoMTk5OSwzLDE3LDIyLDQ0LDU1LDIsNzYsMCkpCisgICAgICAgIGRhdGVfdGltZSA9IFtOb25lLCBOb25lLCBOb25lXQorICAgICAgICBkYXRlX3RpbWVbMF0gPSB0aW1lLnN0cmZ0aW1lKCIlYyIsIHRpbWVfdHVwbGUpLmxvd2VyKCkKKyAgICAgICAgZGF0ZV90aW1lWzFdID0gdGltZS5zdHJmdGltZSgiJXgiLCB0aW1lX3R1cGxlKS5sb3dlcigpCisgICAgICAgIGRhdGVfdGltZVsyXSA9IHRpbWUuc3RyZnRpbWUoIiVYIiwgdGltZV90dXBsZSkubG93ZXIoKQorICAgICAgICByZXBsYWNlbWVudF9wYWlycyA9IFsoJyUnLCAnJSUnKSwgKHNlbGYuZl93ZWVrZGF5WzJdLCAnJUEnKSwKKyAgICAgICAgICAgICAgICAgICAgKHNlbGYuZl9tb250aFszXSwgJyVCJyksIChzZWxmLmFfd2Vla2RheVsyXSwgJyVhJyksCisgICAgICAgICAgICAgICAgICAgIChzZWxmLmFfbW9udGhbM10sICclYicpLCAoc2VsZi5hbV9wbVsxXSwgJyVwJyksCisgICAgICAgICAgICAgICAgICAgICgnMTk5OScsICclWScpLCAoJzk5JywgJyV5JyksICgnMjInLCAnJUgnKSwKKyAgICAgICAgICAgICAgICAgICAgKCc0NCcsICclTScpLCAoJzU1JywgJyVTJyksICgnNzYnLCAnJWonKSwKKyAgICAgICAgICAgICAgICAgICAgKCcxNycsICclZCcpLCAoJzAzJywgJyVtJyksICgnMycsICclbScpLAorICAgICAgICAgICAgICAgICAgICAjICczJyBuZWVkZWQgZm9yIHdoZW4gbm8gbGVhZGluZyB6ZXJvLgorICAgICAgICAgICAgICAgICAgICAoJzInLCAnJXcnKSwgKCcxMCcsICclSScpXQorICAgICAgICByZXBsYWNlbWVudF9wYWlycy5leHRlbmQoWyh0eiwgIiVaIikgZm9yIHR6X3ZhbHVlcyBpbiBzZWxmLnRpbWV6b25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHogaW4gdHpfdmFsdWVzXSkKKyAgICAgICAgZm9yIG9mZnNldCxkaXJlY3RpdmUgaW4gKCgwLCclYycpLCAoMSwnJXgnKSwgKDIsJyVYJykpOgorICAgICAgICAgICAgY3VycmVudF9mb3JtYXQgPSBkYXRlX3RpbWVbb2Zmc2V0XQorICAgICAgICAgICAgZm9yIG9sZCwgbmV3IGluIHJlcGxhY2VtZW50X3BhaXJzOgorICAgICAgICAgICAgICAgICMgTXVzdCBkZWFsIHdpdGggcG9zc2libGUgbGFjayBvZiBsb2NhbGUgaW5mbworICAgICAgICAgICAgICAgICMgbWFuaWZlc3RpbmcgaXRzZWxmIGFzIHRoZSBlbXB0eSBzdHJpbmcgKGUuZy4sIFN3ZWRpc2gncworICAgICAgICAgICAgICAgICMgbGFjayBvZiBBTS9QTSBpbmZvKSBvciBhIHBsYXRmb3JtIHJldHVybmluZyBhIHR1cGxlIG9mIGVtcHR5CisgICAgICAgICAgICAgICAgIyBzdHJpbmdzIChlLmcuLCBNYWNPUyA5IGhhdmluZyB0aW1lem9uZSBhcyAoJycsJycpKS4KKyAgICAgICAgICAgICAgICBpZiBvbGQ6CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfZm9ybWF0ID0gY3VycmVudF9mb3JtYXQucmVwbGFjZShvbGQsIG5ldykKKyAgICAgICAgICAgICMgSWYgJVcgaXMgdXNlZCwgdGhlbiBTdW5kYXksIDIwMDUtMDEtMDMgd2lsbCBmYWxsIG9uIHdlZWsgMCBzaW5jZQorICAgICAgICAgICAgIyAyMDA1LTAxLTAzIG9jY3VycyBiZWZvcmUgdGhlIGZpcnN0IE1vbmRheSBvZiB0aGUgeWVhci4gIE90aGVyd2lzZQorICAgICAgICAgICAgIyAlVSBpcyB1c2VkLgorICAgICAgICAgICAgdGltZV90dXBsZSA9IHRpbWUuc3RydWN0X3RpbWUoKDE5OTksMSwzLDEsMSwxLDYsMywwKSkKKyAgICAgICAgICAgIGlmICcwMCcgaW4gdGltZS5zdHJmdGltZShkaXJlY3RpdmUsIHRpbWVfdHVwbGUpOgorICAgICAgICAgICAgICAgIFVfVyA9ICclVycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgVV9XID0gJyVVJworICAgICAgICAgICAgZGF0ZV90aW1lW29mZnNldF0gPSBjdXJyZW50X2Zvcm1hdC5yZXBsYWNlKCcxMScsIFVfVykKKyAgICAgICAgc2VsZi5MQ19kYXRlX3RpbWUgPSBkYXRlX3RpbWVbMF0KKyAgICAgICAgc2VsZi5MQ19kYXRlID0gZGF0ZV90aW1lWzFdCisgICAgICAgIHNlbGYuTENfdGltZSA9IGRhdGVfdGltZVsyXQorCisgICAgZGVmIF9fY2FsY190aW1lem9uZShzZWxmKToKKyAgICAgICAgIyBTZXQgc2VsZi50aW1lem9uZSBieSB1c2luZyB0aW1lLnR6bmFtZS4KKyAgICAgICAgIyBEbyBub3Qgd29ycnkgYWJvdXQgcG9zc2liaWxpdHkgb2YgdGltZS50em5hbWVbMF0gPT0gdGltZXR6bmFtZVsxXQorICAgICAgICAjIGFuZCB0aW1lLmRheWxpZ2h0OyBoYW5kbGUgdGhhdCBpbiBzdHJwdGltZSAuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRpbWUudHpzZXQoKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG5vX3NhdmluZyA9IGZyb3plbnNldChbInV0YyIsICJnbXQiLCB0aW1lLnR6bmFtZVswXS5sb3dlcigpXSkKKyAgICAgICAgaWYgdGltZS5kYXlsaWdodDoKKyAgICAgICAgICAgIGhhc19zYXZpbmcgPSBmcm96ZW5zZXQoW3RpbWUudHpuYW1lWzFdLmxvd2VyKCldKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGFzX3NhdmluZyA9IGZyb3plbnNldCgpCisgICAgICAgIHNlbGYudGltZXpvbmUgPSAobm9fc2F2aW5nLCBoYXNfc2F2aW5nKQorCisKK2NsYXNzIFRpbWVSRShkaWN0KToKKyAgICAiIiJIYW5kbGUgY29udmVyc2lvbiBmcm9tIGZvcm1hdCBkaXJlY3RpdmVzIHRvIHJlZ2V4ZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jYWxlX3RpbWU9Tm9uZSk6CisgICAgICAgICIiIkNyZWF0ZSBrZXlzL3ZhbHVlcy4KKworICAgICAgICBPcmRlciBvZiBleGVjdXRpb24gaXMgaW1wb3J0YW50IGZvciBkZXBlbmRlbmN5IHJlYXNvbnMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxvY2FsZV90aW1lOgorICAgICAgICAgICAgc2VsZi5sb2NhbGVfdGltZSA9IGxvY2FsZV90aW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvY2FsZV90aW1lID0gTG9jYWxlVGltZSgpCisgICAgICAgIGJhc2UgPSBzdXBlcihUaW1lUkUsIHNlbGYpCisgICAgICAgIGJhc2UuX19pbml0X18oeworICAgICAgICAgICAgIyBUaGUgIiBcZCIgcGFydCBvZiB0aGUgcmVnZXggaXMgdG8gbWFrZSAlYyBmcm9tIEFOU0kgQyB3b3JrCisgICAgICAgICAgICAnZCc6IHIiKD9QPGQ+M1swLTFdfFsxLTJdXGR8MFsxLTldfFsxLTldfCBbMS05XSkiLAorICAgICAgICAgICAgJ2YnOiByIig/UDxmPlswLTldezEsNn0pIiwKKyAgICAgICAgICAgICdIJzogciIoP1A8SD4yWzAtM118WzAtMV1cZHxcZCkiLAorICAgICAgICAgICAgJ0knOiByIig/UDxJPjFbMC0yXXwwWzEtOV18WzEtOV0pIiwKKyAgICAgICAgICAgICdqJzogciIoP1A8aj4zNlswLTZdfDNbMC01XVxkfFsxLTJdXGRcZHwwWzEtOV1cZHwwMFsxLTldfFsxLTldXGR8MFsxLTldfFsxLTldKSIsCisgICAgICAgICAgICAnbSc6IHIiKD9QPG0+MVswLTJdfDBbMS05XXxbMS05XSkiLAorICAgICAgICAgICAgJ00nOiByIig/UDxNPlswLTVdXGR8XGQpIiwKKyAgICAgICAgICAgICdTJzogciIoP1A8Uz42WzAtMV18WzAtNV1cZHxcZCkiLAorICAgICAgICAgICAgJ1UnOiByIig/UDxVPjVbMC0zXXxbMC00XVxkfFxkKSIsCisgICAgICAgICAgICAndyc6IHIiKD9QPHc+WzAtNl0pIiwKKyAgICAgICAgICAgICMgVyBpcyBzZXQgYmVsb3cgYnkgdXNpbmcgJ1UnCisgICAgICAgICAgICAneSc6IHIiKD9QPHk+XGRcZCkiLAorICAgICAgICAgICAgI1hYWDogRG9lcyAnWScgbmVlZCB0byB3b3JyeSBhYm91dCBoYXZpbmcgbGVzcyBvciBtb3JlIHRoYW4KKyAgICAgICAgICAgICMgICAgIDQgZGlnaXRzPworICAgICAgICAgICAgJ1knOiByIig/UDxZPlxkXGRcZFxkKSIsCisgICAgICAgICAgICAnQSc6IHNlbGYuX19zZXFUb1JFKHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5LCAnQScpLAorICAgICAgICAgICAgJ2EnOiBzZWxmLl9fc2VxVG9SRShzZWxmLmxvY2FsZV90aW1lLmFfd2Vla2RheSwgJ2EnKSwKKyAgICAgICAgICAgICdCJzogc2VsZi5fX3NlcVRvUkUoc2VsZi5sb2NhbGVfdGltZS5mX21vbnRoWzE6XSwgJ0InKSwKKyAgICAgICAgICAgICdiJzogc2VsZi5fX3NlcVRvUkUoc2VsZi5sb2NhbGVfdGltZS5hX21vbnRoWzE6XSwgJ2InKSwKKyAgICAgICAgICAgICdwJzogc2VsZi5fX3NlcVRvUkUoc2VsZi5sb2NhbGVfdGltZS5hbV9wbSwgJ3AnKSwKKyAgICAgICAgICAgICdaJzogc2VsZi5fX3NlcVRvUkUoKHR6IGZvciB0el9uYW1lcyBpbiBzZWxmLmxvY2FsZV90aW1lLnRpbWV6b25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHR6IGluIHR6X25hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1onKSwKKyAgICAgICAgICAgICclJzogJyUnfSkKKyAgICAgICAgYmFzZS5fX3NldGl0ZW1fXygnVycsIGJhc2UuX19nZXRpdGVtX18oJ1UnKS5yZXBsYWNlKCdVJywgJ1cnKSkKKyAgICAgICAgYmFzZS5fX3NldGl0ZW1fXygnYycsIHNlbGYucGF0dGVybihzZWxmLmxvY2FsZV90aW1lLkxDX2RhdGVfdGltZSkpCisgICAgICAgIGJhc2UuX19zZXRpdGVtX18oJ3gnLCBzZWxmLnBhdHRlcm4oc2VsZi5sb2NhbGVfdGltZS5MQ19kYXRlKSkKKyAgICAgICAgYmFzZS5fX3NldGl0ZW1fXygnWCcsIHNlbGYucGF0dGVybihzZWxmLmxvY2FsZV90aW1lLkxDX3RpbWUpKQorCisgICAgZGVmIF9fc2VxVG9SRShzZWxmLCB0b19jb252ZXJ0LCBkaXJlY3RpdmUpOgorICAgICAgICAiIiJDb252ZXJ0IGEgbGlzdCB0byBhIHJlZ2V4IHN0cmluZyBmb3IgbWF0Y2hpbmcgYSBkaXJlY3RpdmUuCisKKyAgICAgICAgV2FudCBwb3NzaWJsZSBtYXRjaGluZyB2YWx1ZXMgdG8gYmUgZnJvbSBsb25nZXN0IHRvIHNob3J0ZXN0LiAgVGhpcworICAgICAgICBwcmV2ZW50cyB0aGUgcG9zc2liaWxpdHkgb2YgYSBtYXRjaCBvY2N1cmluZyBmb3IgYSB2YWx1ZSB0aGF0IGFsc28KKyAgICAgICAgYSBzdWJzdHJpbmcgb2YgYSBsYXJnZXIgdmFsdWUgdGhhdCBzaG91bGQgaGF2ZSBtYXRjaGVkIChlLmcuLCAnYWJjJworICAgICAgICBtYXRjaGluZyB3aGVuICdhYmNkZWYnIHNob3VsZCBoYXZlIGJlZW4gdGhlIG1hdGNoKS4KKworICAgICAgICAiIiIKKyAgICAgICAgdG9fY29udmVydCA9IHNvcnRlZCh0b19jb252ZXJ0LCBrZXk9bGVuLCByZXZlcnNlPVRydWUpCisgICAgICAgIGZvciB2YWx1ZSBpbiB0b19jb252ZXJ0OgorICAgICAgICAgICAgaWYgdmFsdWUgIT0gJyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICByZWdleCA9ICd8Jy5qb2luKHJlX2VzY2FwZShzdHVmZikgZm9yIHN0dWZmIGluIHRvX2NvbnZlcnQpCisgICAgICAgIHJlZ2V4ID0gJyg/UDwlcz4lcycgJSAoZGlyZWN0aXZlLCByZWdleCkKKyAgICAgICAgcmV0dXJuICclcyknICUgcmVnZXgKKworICAgIGRlZiBwYXR0ZXJuKHNlbGYsIGZvcm1hdCk6CisgICAgICAgICIiIlJldHVybiByZWdleCBwYXR0ZXJuIGZvciB0aGUgZm9ybWF0IHN0cmluZy4KKworICAgICAgICBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGFueSBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgaW50ZXJwcmV0ZWQgYXMKKyAgICAgICAgcmVnZXggc3ludGF4IGFyZSBlc2NhcGVkLgorCisgICAgICAgICIiIgorICAgICAgICBwcm9jZXNzZWRfZm9ybWF0ID0gJycKKyAgICAgICAgIyBUaGUgc3ViKCkgY2FsbCBlc2NhcGVzIGFsbCBjaGFyYWN0ZXJzIHRoYXQgbWlnaHQgYmUgbWlzY29uc3RydWVkCisgICAgICAgICMgYXMgcmVnZXggc3ludGF4LiAgQ2Fubm90IHVzZSByZS5lc2NhcGUgc2luY2Ugd2UgaGF2ZSB0byBkZWFsIHdpdGgKKyAgICAgICAgIyBmb3JtYXQgZGlyZWN0aXZlcyAoJW0sIGV0Yy4pLgorICAgICAgICByZWdleF9jaGFycyA9IHJlX2NvbXBpbGUociIoW1xcLl4kKis/XChcKXt9XFtcXXxdKSIpCisgICAgICAgIGZvcm1hdCA9IHJlZ2V4X2NoYXJzLnN1YihyIlxcXDEiLCBmb3JtYXQpCisgICAgICAgIHdoaXRlc3BhY2VfcmVwbGFjZW1lbnQgPSByZV9jb21waWxlKCdccysnKQorICAgICAgICBmb3JtYXQgPSB3aGl0ZXNwYWNlX3JlcGxhY2VtZW50LnN1YignXHMrJywgZm9ybWF0KQorICAgICAgICB3aGlsZSAnJScgaW4gZm9ybWF0OgorICAgICAgICAgICAgZGlyZWN0aXZlX2luZGV4ID0gZm9ybWF0LmluZGV4KCclJykrMQorICAgICAgICAgICAgcHJvY2Vzc2VkX2Zvcm1hdCA9ICIlcyVzJXMiICUgKHByb2Nlc3NlZF9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0WzpkaXJlY3RpdmVfaW5kZXgtMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltmb3JtYXRbZGlyZWN0aXZlX2luZGV4XV0pCisgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRbZGlyZWN0aXZlX2luZGV4KzE6XQorICAgICAgICByZXR1cm4gIiVzJXMiICUgKHByb2Nlc3NlZF9mb3JtYXQsIGZvcm1hdCkKKworICAgIGRlZiBjb21waWxlKHNlbGYsIGZvcm1hdCk6CisgICAgICAgICIiIlJldHVybiBhIGNvbXBpbGVkIHJlIG9iamVjdCBmb3IgdGhlIGZvcm1hdCBzdHJpbmcuIiIiCisgICAgICAgIHJldHVybiByZV9jb21waWxlKHNlbGYucGF0dGVybihmb3JtYXQpLCBJR05PUkVDQVNFKQorCitfY2FjaGVfbG9jayA9IF90aHJlYWRfYWxsb2NhdGVfbG9jaygpCisjIERPIE5PVCBtb2RpZnkgX1RpbWVSRV9jYWNoZSBvciBfcmVnZXhfY2FjaGUgd2l0aG91dCBhY3F1aXJpbmcgdGhlIGNhY2hlIGxvY2sKKyMgZmlyc3QhCitfVGltZVJFX2NhY2hlID0gVGltZVJFKCkKK19DQUNIRV9NQVhfU0laRSA9IDUgIyBNYXggbnVtYmVyIG9mIHJlZ2V4ZXMgc3RvcmVkIGluIF9yZWdleF9jYWNoZQorX3JlZ2V4X2NhY2hlID0ge30KKworZGVmIF9jYWxjX2p1bGlhbl9mcm9tX1Vfb3JfVyh5ZWFyLCB3ZWVrX29mX3llYXIsIGRheV9vZl93ZWVrLCB3ZWVrX3N0YXJ0c19Nb24pOgorICAgICIiIkNhbGN1bGF0ZSB0aGUgSnVsaWFuIGRheSBiYXNlZCBvbiB0aGUgeWVhciwgd2VlayBvZiB0aGUgeWVhciwgYW5kIGRheSBvZgorICAgIHRoZSB3ZWVrLCB3aXRoIHdlZWtfc3RhcnRfZGF5IHJlcHJlc2VudGluZyB3aGV0aGVyIHRoZSB3ZWVrIG9mIHRoZSB5ZWFyCisgICAgYXNzdW1lcyB0aGUgd2VlayBzdGFydHMgb24gU3VuZGF5IG9yIE1vbmRheSAoNiBvciAwKS4iIiIKKyAgICBmaXJzdF93ZWVrZGF5ID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS53ZWVrZGF5KCkKKyAgICAjIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlICVVIGRpcmVjdGl2ZSAod2VlayBzdGFydHMgb24gU3VuZGF5KSwgaXQncworICAgICMgZWFzaWVyIHRvIGp1c3Qgc2hpZnQgdGhlIHZpZXcgdG8gU3VuZGF5IGJlaW5nIHRoZSBmaXJzdCBkYXkgb2YgdGhlCisgICAgIyB3ZWVrLgorICAgIGlmIG5vdCB3ZWVrX3N0YXJ0c19Nb246CisgICAgICAgIGZpcnN0X3dlZWtkYXkgPSAoZmlyc3Rfd2Vla2RheSArIDEpICUgNworICAgICAgICBkYXlfb2Zfd2VlayA9IChkYXlfb2Zfd2VlayArIDEpICUgNworICAgICMgTmVlZCB0byB3YXRjaCBvdXQgZm9yIGEgd2VlayAwICh3aGVuIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHllYXIgaXMgbm90CisgICAgIyB0aGUgc2FtZSBhcyB0aGF0IHNwZWNpZmllZCBieSAlVSBvciAlVykuCisgICAgd2Vla18wX2xlbmd0aCA9ICg3IC0gZmlyc3Rfd2Vla2RheSkgJSA3CisgICAgaWYgd2Vla19vZl95ZWFyID09IDA6CisgICAgICAgIHJldHVybiAxICsgZGF5X29mX3dlZWsgLSBmaXJzdF93ZWVrZGF5CisgICAgZWxzZToKKyAgICAgICAgZGF5c190b193ZWVrID0gd2Vla18wX2xlbmd0aCArICg3ICogKHdlZWtfb2ZfeWVhciAtIDEpKQorICAgICAgICByZXR1cm4gMSArIGRheXNfdG9fd2VlayArIGRheV9vZl93ZWVrCisKKworZGVmIF9zdHJwdGltZShkYXRhX3N0cmluZywgZm9ybWF0PSIlYSAlYiAlZCAlSDolTTolUyAlWSIpOgorICAgICIiIlJldHVybiBhIHRpbWUgc3RydWN0IGJhc2VkIG9uIHRoZSBpbnB1dCBzdHJpbmcgYW5kIHRoZSBmb3JtYXQgc3RyaW5nLiIiIgorICAgIGdsb2JhbCBfVGltZVJFX2NhY2hlLCBfcmVnZXhfY2FjaGUKKyAgICB3aXRoIF9jYWNoZV9sb2NrOgorICAgICAgICBpZiBfZ2V0bGFuZygpICE9IF9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUubGFuZzoKKyAgICAgICAgICAgIF9UaW1lUkVfY2FjaGUgPSBUaW1lUkUoKQorICAgICAgICAgICAgX3JlZ2V4X2NhY2hlLmNsZWFyKCkKKyAgICAgICAgaWYgbGVuKF9yZWdleF9jYWNoZSkgPiBfQ0FDSEVfTUFYX1NJWkU6CisgICAgICAgICAgICBfcmVnZXhfY2FjaGUuY2xlYXIoKQorICAgICAgICBsb2NhbGVfdGltZSA9IF9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUKKyAgICAgICAgZm9ybWF0X3JlZ2V4ID0gX3JlZ2V4X2NhY2hlLmdldChmb3JtYXQpCisgICAgICAgIGlmIG5vdCBmb3JtYXRfcmVnZXg6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9ybWF0X3JlZ2V4ID0gX1RpbWVSRV9jYWNoZS5jb21waWxlKGZvcm1hdCkKKyAgICAgICAgICAgICMgS2V5RXJyb3IgcmFpc2VkIHdoZW4gYSBiYWQgZm9ybWF0IGlzIGZvdW5kOyBjYW4gYmUgc3BlY2lmaWVkIGFzCisgICAgICAgICAgICAjIFxcLCBpbiB3aGljaCBjYXNlIGl0IHdhcyBhIHN0cmF5ICUgYnV0IHdpdGggYSBzcGFjZSBhZnRlciBpdAorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgYmFkX2RpcmVjdGl2ZSA9IGVyci5hcmdzWzBdCisgICAgICAgICAgICAgICAgaWYgYmFkX2RpcmVjdGl2ZSA9PSAiXFwiOgorICAgICAgICAgICAgICAgICAgICBiYWRfZGlyZWN0aXZlID0gIiUiCisgICAgICAgICAgICAgICAgZGVsIGVycgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIiclcycgaXMgYSBiYWQgZGlyZWN0aXZlIGluIGZvcm1hdCAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFkX2RpcmVjdGl2ZSwgZm9ybWF0KSkKKyAgICAgICAgICAgICMgSW5kZXhFcnJvciBvbmx5IG9jY3VycyB3aGVuIHRoZSBmb3JtYXQgc3RyaW5nIGlzICIlIgorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RyYXkgJSUgaW4gZm9ybWF0ICclcyciICUgZm9ybWF0KQorICAgICAgICAgICAgX3JlZ2V4X2NhY2hlW2Zvcm1hdF0gPSBmb3JtYXRfcmVnZXgKKyAgICBmb3VuZCA9IGZvcm1hdF9yZWdleC5tYXRjaChkYXRhX3N0cmluZykKKyAgICBpZiBub3QgZm91bmQ6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRpbWUgZGF0YSAlciBkb2VzIG5vdCBtYXRjaCBmb3JtYXQgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZGF0YV9zdHJpbmcsIGZvcm1hdCkpCisgICAgaWYgbGVuKGRhdGFfc3RyaW5nKSAhPSBmb3VuZC5lbmQoKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5jb252ZXJ0ZWQgZGF0YSByZW1haW5zOiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3N0cmluZ1tmb3VuZC5lbmQoKTpdKQorCisgICAgeWVhciA9IE5vbmUKKyAgICBtb250aCA9IGRheSA9IDEKKyAgICBob3VyID0gbWludXRlID0gc2Vjb25kID0gZnJhY3Rpb24gPSAwCisgICAgdHogPSAtMQorICAgICMgRGVmYXVsdCB0byAtMSB0byBzaWduaWZ5IHRoYXQgdmFsdWVzIG5vdCBrbm93bjsgbm90IGNyaXRpY2FsIHRvIGhhdmUsCisgICAgIyB0aG91Z2gKKyAgICB3ZWVrX29mX3llYXIgPSAtMQorICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IC0xCisgICAgIyB3ZWVrZGF5IGFuZCBqdWxpYW4gZGVmYXVsdGVkIHRvIC0xIHNvIGFzIHRvIHNpZ25hbCBuZWVkIHRvIGNhbGN1bGF0ZQorICAgICMgdmFsdWVzCisgICAgd2Vla2RheSA9IGp1bGlhbiA9IC0xCisgICAgZm91bmRfZGljdCA9IGZvdW5kLmdyb3VwZGljdCgpCisgICAgZm9yIGdyb3VwX2tleSBpbiBmb3VuZF9kaWN0Lml0ZXJrZXlzKCk6CisgICAgICAgICMgRGlyZWN0aXZlcyBub3QgZXhwbGljaXRseSBoYW5kbGVkIGJlbG93OgorICAgICAgICAjICAgYywgeCwgWAorICAgICAgICAjICAgICAgaGFuZGxlZCBieSBtYWtpbmcgb3V0IG9mIG90aGVyIGRpcmVjdGl2ZXMKKyAgICAgICAgIyAgIFUsIFcKKyAgICAgICAgIyAgICAgIHdvcnRobGVzcyB3aXRob3V0IGRheSBvZiB0aGUgd2VlaworICAgICAgICBpZiBncm91cF9rZXkgPT0gJ3knOgorICAgICAgICAgICAgeWVhciA9IGludChmb3VuZF9kaWN0Wyd5J10pCisgICAgICAgICAgICAjIE9wZW4gR3JvdXAgc3BlY2lmaWNhdGlvbiBmb3Igc3RycHRpbWUoKSBzdGF0ZXMgdGhhdCBhICV5CisgICAgICAgICAgICAjdmFsdWUgaW4gdGhlIHJhbmdlIG9mIFswMCwgNjhdIGlzIGluIHRoZSBjZW50dXJ5IDIwMDAsIHdoaWxlCisgICAgICAgICAgICAjWzY5LDk5XSBpcyBpbiB0aGUgY2VudHVyeSAxOTAwCisgICAgICAgICAgICBpZiB5ZWFyIDw9IDY4OgorICAgICAgICAgICAgICAgIHllYXIgKz0gMjAwMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5ZWFyICs9IDE5MDAKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1knOgorICAgICAgICAgICAgeWVhciA9IGludChmb3VuZF9kaWN0WydZJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdtJzoKKyAgICAgICAgICAgIG1vbnRoID0gaW50KGZvdW5kX2RpY3RbJ20nXSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ0InOgorICAgICAgICAgICAgbW9udGggPSBsb2NhbGVfdGltZS5mX21vbnRoLmluZGV4KGZvdW5kX2RpY3RbJ0InXS5sb3dlcigpKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnYic6CisgICAgICAgICAgICBtb250aCA9IGxvY2FsZV90aW1lLmFfbW9udGguaW5kZXgoZm91bmRfZGljdFsnYiddLmxvd2VyKCkpCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdkJzoKKyAgICAgICAgICAgIGRheSA9IGludChmb3VuZF9kaWN0WydkJ10pCisgICAgICAgIGVsaWYgZ3JvdXBfa2V5ID09ICdIJzoKKyAgICAgICAgICAgIGhvdXIgPSBpbnQoZm91bmRfZGljdFsnSCddKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnSSc6CisgICAgICAgICAgICBob3VyID0gaW50KGZvdW5kX2RpY3RbJ0knXSkKKyAgICAgICAgICAgIGFtcG0gPSBmb3VuZF9kaWN0LmdldCgncCcsICcnKS5sb3dlcigpCisgICAgICAgICAgICAjIElmIHRoZXJlIHdhcyBubyBBTS9QTSBpbmRpY2F0b3IsIHdlJ2xsIHRyZWF0IHRoaXMgbGlrZSBBTQorICAgICAgICAgICAgaWYgYW1wbSBpbiAoJycsIGxvY2FsZV90aW1lLmFtX3BtWzBdKToKKyAgICAgICAgICAgICAgICAjIFdlJ3JlIGluIEFNIHNvIHRoZSBob3VyIGlzIGNvcnJlY3QgdW5sZXNzIHdlJ3JlCisgICAgICAgICAgICAgICAgIyBsb29raW5nIGF0IDEyIG1pZG5pZ2h0LgorICAgICAgICAgICAgICAgICMgMTIgbWlkbmlnaHQgPT0gMTIgQU0gPT0gaG91ciAwCisgICAgICAgICAgICAgICAgaWYgaG91ciA9PSAxMjoKKyAgICAgICAgICAgICAgICAgICAgaG91ciA9IDAKKyAgICAgICAgICAgIGVsaWYgYW1wbSA9PSBsb2NhbGVfdGltZS5hbV9wbVsxXToKKyAgICAgICAgICAgICAgICAjIFdlJ3JlIGluIFBNIHNvIHdlIG5lZWQgdG8gYWRkIDEyIHRvIHRoZSBob3VyIHVubGVzcworICAgICAgICAgICAgICAgICMgd2UncmUgbG9va2luZyBhdCAxMiBub29uLgorICAgICAgICAgICAgICAgICMgMTIgbm9vbiA9PSAxMiBQTSA9PSBob3VyIDEyCisgICAgICAgICAgICAgICAgaWYgaG91ciAhPSAxMjoKKyAgICAgICAgICAgICAgICAgICAgaG91ciArPSAxMgorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnTSc6CisgICAgICAgICAgICBtaW51dGUgPSBpbnQoZm91bmRfZGljdFsnTSddKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnUyc6CisgICAgICAgICAgICBzZWNvbmQgPSBpbnQoZm91bmRfZGljdFsnUyddKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnZic6CisgICAgICAgICAgICBzID0gZm91bmRfZGljdFsnZiddCisgICAgICAgICAgICAjIFBhZCB0byBhbHdheXMgcmV0dXJuIG1pY3Jvc2Vjb25kcy4KKyAgICAgICAgICAgIHMgKz0gIjAiICogKDYgLSBsZW4ocykpCisgICAgICAgICAgICBmcmFjdGlvbiA9IGludChzKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnQSc6CisgICAgICAgICAgICB3ZWVrZGF5ID0gbG9jYWxlX3RpbWUuZl93ZWVrZGF5LmluZGV4KGZvdW5kX2RpY3RbJ0EnXS5sb3dlcigpKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAnYSc6CisgICAgICAgICAgICB3ZWVrZGF5ID0gbG9jYWxlX3RpbWUuYV93ZWVrZGF5LmluZGV4KGZvdW5kX2RpY3RbJ2EnXS5sb3dlcigpKQorICAgICAgICBlbGlmIGdyb3VwX2tleSA9PSAndyc6CisgICAgICAgICAgICB3ZWVrZGF5ID0gaW50KGZvdW5kX2RpY3RbJ3cnXSkKKyAgICAgICAgICAgIGlmIHdlZWtkYXkgPT0gMDoKKyAgICAgICAgICAgICAgICB3ZWVrZGF5ID0gNgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3ZWVrZGF5IC09IDEKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ2onOgorICAgICAgICAgICAganVsaWFuID0gaW50KGZvdW5kX2RpY3RbJ2onXSkKKyAgICAgICAgZWxpZiBncm91cF9rZXkgaW4gKCdVJywgJ1cnKToKKyAgICAgICAgICAgIHdlZWtfb2ZfeWVhciA9IGludChmb3VuZF9kaWN0W2dyb3VwX2tleV0pCisgICAgICAgICAgICBpZiBncm91cF9rZXkgPT0gJ1UnOgorICAgICAgICAgICAgICAgICMgVSBzdGFydHMgd2VlayBvbiBTdW5kYXkuCisgICAgICAgICAgICAgICAgd2Vla19vZl95ZWFyX3N0YXJ0ID0gNgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFcgc3RhcnRzIHdlZWsgb24gTW9uZGF5LgorICAgICAgICAgICAgICAgIHdlZWtfb2ZfeWVhcl9zdGFydCA9IDAKKyAgICAgICAgZWxpZiBncm91cF9rZXkgPT0gJ1onOgorICAgICAgICAgICAgIyBTaW5jZSAtMSBpcyBkZWZhdWx0IHZhbHVlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCBzZXR0aW5nIHR6IGlmCisgICAgICAgICAgICAjIGl0IGNhbiBiZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAtMS4KKyAgICAgICAgICAgIGZvdW5kX3pvbmUgPSBmb3VuZF9kaWN0WydaJ10ubG93ZXIoKQorICAgICAgICAgICAgZm9yIHZhbHVlLCB0el92YWx1ZXMgaW4gZW51bWVyYXRlKGxvY2FsZV90aW1lLnRpbWV6b25lKToKKyAgICAgICAgICAgICAgICBpZiBmb3VuZF96b25lIGluIHR6X3ZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgIyBEZWFsIHdpdGggYmFkIGxvY2FsZSBzZXR1cCB3aGVyZSB0aW1lem9uZSBuYW1lcyBhcmUgdGhlCisgICAgICAgICAgICAgICAgICAgICMgc2FtZSBhbmQgeWV0IHRpbWUuZGF5bGlnaHQgaXMgdHJ1ZTsgdG9vIGFtYmlndW91cyB0bworICAgICAgICAgICAgICAgICAgICAjIGJlIGFibGUgdG8gdGVsbCB3aGF0IHRpbWV6b25lIGhhcyBkYXlsaWdodCBzYXZpbmdzCisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lLnR6bmFtZVswXSA9PSB0aW1lLnR6bmFtZVsxXSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgdGltZS5kYXlsaWdodCBhbmQgZm91bmRfem9uZSBub3QgaW4gKCJ1dGMiLCAiZ210IikpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHR6ID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgbGVhcF95ZWFyX2ZpeCA9IEZhbHNlCisgICAgaWYgeWVhciBpcyBOb25lIGFuZCBtb250aCA9PSAyIGFuZCBkYXkgPT0gMjk6CisgICAgICAgIHllYXIgPSAxOTA0ICAjIDE5MDQgaXMgZmlyc3QgbGVhcCB5ZWFyIG9mIDIwdGggY2VudHVyeQorICAgICAgICBsZWFwX3llYXJfZml4ID0gVHJ1ZQorICAgIGVsaWYgeWVhciBpcyBOb25lOgorICAgICAgICB5ZWFyID0gMTkwMAorICAgICMgSWYgd2Uga25vdyB0aGUgd2VlayBvZiB0aGUgeWVhciBhbmQgd2hhdCBkYXkgb2YgdGhhdCB3ZWVrLCB3ZSBjYW4gZmlndXJlCisgICAgIyBvdXQgdGhlIEp1bGlhbiBkYXkgb2YgdGhlIHllYXIuCisgICAgaWYganVsaWFuID09IC0xIGFuZCB3ZWVrX29mX3llYXIgIT0gLTEgYW5kIHdlZWtkYXkgIT0gLTE6CisgICAgICAgIHdlZWtfc3RhcnRzX01vbiA9IFRydWUgaWYgd2Vla19vZl95ZWFyX3N0YXJ0ID09IDAgZWxzZSBGYWxzZQorICAgICAgICBqdWxpYW4gPSBfY2FsY19qdWxpYW5fZnJvbV9VX29yX1coeWVhciwgd2Vla19vZl95ZWFyLCB3ZWVrZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrX3N0YXJ0c19Nb24pCisgICAgIyBDYW5ub3QgcHJlLWNhbGN1bGF0ZSBkYXRldGltZV9kYXRlKCkgc2luY2UgY2FuIGNoYW5nZSBpbiBKdWxpYW4KKyAgICAjIGNhbGN1bGF0aW9uIGFuZCB0aHVzIGNvdWxkIGhhdmUgZGlmZmVyZW50IHZhbHVlIGZvciB0aGUgZGF5IG9mIHRoZSB3ZWVrCisgICAgIyBjYWxjdWxhdGlvbi4KKyAgICBpZiBqdWxpYW4gPT0gLTE6CisgICAgICAgICMgTmVlZCB0byBhZGQgMSB0byByZXN1bHQgc2luY2UgZmlyc3QgZGF5IG9mIHRoZSB5ZWFyIGlzIDEsIG5vdCAwLgorICAgICAgICBqdWxpYW4gPSBkYXRldGltZV9kYXRlKHllYXIsIG1vbnRoLCBkYXkpLnRvb3JkaW5hbCgpIC0gXAorICAgICAgICAgICAgICAgICAgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSArIDEKKyAgICBlbHNlOiAgIyBBc3N1bWUgdGhhdCBpZiB0aGV5IGJvdGhlcmVkIHRvIGluY2x1ZGUgSnVsaWFuIGRheSBpdCB3aWxsCisgICAgICAgICAgICMgYmUgYWNjdXJhdGUuCisgICAgICAgIGRhdGV0aW1lX3Jlc3VsdCA9IGRhdGV0aW1lX2RhdGUuZnJvbW9yZGluYWwoKGp1bGlhbiAtIDEpICsgZGF0ZXRpbWVfZGF0ZSh5ZWFyLCAxLCAxKS50b29yZGluYWwoKSkKKyAgICAgICAgeWVhciA9IGRhdGV0aW1lX3Jlc3VsdC55ZWFyCisgICAgICAgIG1vbnRoID0gZGF0ZXRpbWVfcmVzdWx0Lm1vbnRoCisgICAgICAgIGRheSA9IGRhdGV0aW1lX3Jlc3VsdC5kYXkKKyAgICBpZiB3ZWVrZGF5ID09IC0xOgorICAgICAgICB3ZWVrZGF5ID0gZGF0ZXRpbWVfZGF0ZSh5ZWFyLCBtb250aCwgZGF5KS53ZWVrZGF5KCkKKyAgICBpZiBsZWFwX3llYXJfZml4OgorICAgICAgICAjIHRoZSBjYWxsZXIgZGlkbid0IHN1cHBseSBhIHllYXIgYnV0IGFza2VkIGZvciBGZWIgMjl0aC4gV2UgY291bGRuJ3QKKyAgICAgICAgIyB1c2UgdGhlIGRlZmF1bHQgb2YgMTkwMCBmb3IgY29tcHV0YXRpb25zLiBXZSBzZXQgaXQgYmFjayB0byBlbnN1cmUKKyAgICAgICAgIyB0aGF0IEZlYnJ1YXJ5IDI5dGggaXMgc21hbGxlciB0aGFuIE1hcmNoIDFzdC4KKyAgICAgICAgeWVhciA9IDE5MDAKKworICAgIHJldHVybiAodGltZS5zdHJ1Y3RfdGltZSgoeWVhciwgbW9udGgsIGRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla2RheSwganVsaWFuLCB0eikpLCBmcmFjdGlvbikKKworZGVmIF9zdHJwdGltZV90aW1lKGRhdGFfc3RyaW5nLCBmb3JtYXQ9IiVhICViICVkICVIOiVNOiVTICVZIik6CisgICAgcmV0dXJuIF9zdHJwdGltZShkYXRhX3N0cmluZywgZm9ybWF0KVswXQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHljIGIvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTZmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19zdHJwdGltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHlvIGIvbGliL3B5dGhvbjIuNy9fc3RycHRpbWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTZmYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19zdHJwdGltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fc3lzY29uZmlnZGF0YS5weSBiL2xpYi9weXRob24yLjcvX3N5c2NvbmZpZ2RhdGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVkODQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3N5c2NvbmZpZ2RhdGEucHkKQEAgLTAsMCArMSw1MzIgQEAKKyMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZ2VuZXJhdGVkIGFuZCB1c2VkIGJ5IHRoZSBzeXNjb25maWcgbW9kdWxlCitidWlsZF90aW1lX3ZhcnMgPSB7J0FDX0FQUExFX1VOSVZFUlNBTF9CVUlMRCc6IDAsCisgJ0FJWF9HRU5VSU5FX0NQTFVTUExVUyc6IDAsCisgJ0FSJzogJ3g4Nl82NC1saW51eC1nbnUtYXInLAorICdBUkZMQUdTJzogJ3JjJywKKyAnQVNETEdFTic6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L1BhcnNlci9hc2RsX2MucHknLAorICdBU0RMR0VOX0ZJTEVTJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvUGFyc2VyL2FzZGwucHkgL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9QYXJzZXIvYXNkbF9jLnB5JywKKyAnQVNUX0FTREwnOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9QYXJzZXIvUHl0aG9uLmFzZGwnLAorICdBU1RfQyc6ICdQeXRob24vUHl0aG9uLWFzdC5jJywKKyAnQVNUX0NfRElSJzogJ1B5dGhvbicsCisgJ0FTVF9IJzogJ0luY2x1ZGUvUHl0aG9uLWFzdC5oJywKKyAnQVNUX0hfRElSJzogJ0luY2x1ZGUnLAorICdBVEhFT1NfVEhSRUFEUyc6IDAsCisgJ0JBU0VDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcnLAorICdCQVNFTU9ETElCUyc6ICcnLAorICdCRU9TX1RIUkVBRFMnOiAwLAorICdCSU5ESVInOiAnL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0L2JpbicsCisgJ0JJTkxJQkRFU1QnOiAnL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9weXRob24yLjcnLAorICdCTERMSUJSQVJZJzogJ2xpYnB5dGhvbjIuNy5hJywKKyAnQkxEU0hBUkVEJzogJ3g4Nl82NC1saW51eC1nbnUtZ2NjIC1zaGFyZWQnLAorICdCVUlMREVYRSc6ICcnLAorICdCVUlMRFBZVEhPTic6ICdweXRob24nLAorICdDQyc6ICd4ODZfNjQtbGludXgtZ251LWdjYyAtcHRocmVhZCcsCisgJ0NDU0hBUkVEJzogJy1mUElDJywKKyAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1PMiAtT3MgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLXMgLUROREVCVUcnLAorICdDRkxBR1NGT1JTSEFSRUQnOiAnJywKKyAnQ09ORklHRklMRVMnOiAnY29uZmlndXJlIGNvbmZpZ3VyZS5hYyBhY2NvbmZpZy5oIHB5Y29uZmlnLmguaW4gTWFrZWZpbGUucHJlLmluJywKKyAnQ09ORklHX0FSR1MnOiAiJy0tcHJlZml4PS90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NCcgJy0tYnVpbGQ9eDg2XzY0LWxpbnV4LWdudScgJy0taG9zdD14ODZfNjQtbGludXgtZ251JyAnLS13aXRoLWJ1aWxkLXN5c3Jvb3QnICctLWRpc2FibGUtaXB2NicgJ2J1aWxkX2FsaWFzPXg4Nl82NC1saW51eC1nbnUnICdob3N0X2FsaWFzPXg4Nl82NC1saW51eC1nbnUnICdDQz14ODZfNjQtbGludXgtZ251LWdjYycgJ0NGTEFHUz0tTzIgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1zJyAnTERGTEFHUz0nIiwKKyAnQ09ORklOQ0xVREVESVInOiAnL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0L2luY2x1ZGUnLAorICdDT05GSU5DTFVERVBZJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9pbmNsdWRlL3B5dGhvbjIuNycsCisgJ0NPUkVQWVRIT05QQVRIJzogJzpwbGF0LWxpbnV4MjpsaWItdGs6bGliLW9sZCcsCisgJ0NQUEZMQUdTJzogJy1JLiAtSUluY2x1ZGUgLUkvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L0luY2x1ZGUnLAorICdDWFgnOiAneDg2XzY0LWxpbnV4LWdudS1nKysgLXB0aHJlYWQnLAorICdDX1RIUkVBRFMnOiAwLAorICdERUxJTSc6ICc6JywKKyAnREVTVERJUlMnOiAnL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0IC90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIgL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9weXRob24yLjcgL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQnLAorICdERVNUTElCJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvcHl0aG9uMi43JywKKyAnREVTVFBBVEgnOiAnJywKKyAnREVTVFNIQVJFRCc6ICcvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZCcsCisgJ0RJUk1PREUnOiA3NTUsCisgJ0RJU1QnOiAnUkVBRE1FIENoYW5nZUxvZyBjb25maWd1cmUgY29uZmlndXJlLmFjIGFjY29uZmlnLmggcHljb25maWcuaC5pbiBNYWtlZmlsZS5wcmUuaW4gSW5jbHVkZSBMaWIgTWlzYyBEZW1vIEV4dC1kdW1teScsCisgJ0RJU1RESVJTJzogJ0luY2x1ZGUgTGliIE1pc2MgRGVtbyBFeHQtZHVtbXknLAorICdESVNURklMRVMnOiAnUkVBRE1FIENoYW5nZUxvZyBjb25maWd1cmUgY29uZmlndXJlLmFjIGFjY29uZmlnLmggcHljb25maWcuaC5pbiBNYWtlZmlsZS5wcmUuaW4nLAorICdETElOQ0xESVInOiAnLicsCisgJ0RMTExJQlJBUlknOiAnJywKKyAnRE9VQkxFX0lTX0FSTV9NSVhFRF9FTkRJQU5fSUVFRTc1NCc6IDAsCisgJ0RPVUJMRV9JU19CSUdfRU5ESUFOX0lFRUU3NTQnOiAwLAorICdET1VCTEVfSVNfTElUVExFX0VORElBTl9JRUVFNzU0JzogMSwKKyAnRFlOTE9BREZJTEUnOiAnZHlubG9hZF9zaGxpYi5vJywKKyAnRU5BQkxFX0lQVjYnOiAwLAorICdFWEUnOiAnJywKKyAnRVhFTU9ERSc6IDc1NSwKKyAnRVhUUkFNQUNIREVQUEFUSCc6ICcnLAorICdFWFRSQVBMQVRESVInOiAnJywKKyAnRVhUUkFURVNUT1BUUyc6ICcnLAorICdFWFRSQV9DRkxBR1MnOiAnJywKKyAnRklMRU1PREUnOiA2NDQsCisgJ0ZMT0NLX05FRURTX0xJQkJTRCc6IDAsCisgJ0dFVFBHUlBfSEFWRV9BUkcnOiAwLAorICdHRVRUSU1FT0ZEQVlfTk9fVFonOiAwLAorICdHTEhBQ0snOiAnLURjbGVhcj1fX0dMY2xlYXInLAorICdHTlVMRCc6ICd5ZXMnLAorICdHUkFNTUFSX0MnOiAnUHl0aG9uL2dyYW1pbml0LmMnLAorICdHUkFNTUFSX0gnOiAnSW5jbHVkZS9ncmFtaW5pdC5oJywKKyAnR1JBTU1BUl9JTlBVVCc6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L0dyYW1tYXIvR3JhbW1hcicsCisgJ0hBVkVfQUNPU0gnOiAxLAorICdIQVZFX0FERFJJTkZPJzogMSwKKyAnSEFWRV9BTEFSTSc6IDEsCisgJ0hBVkVfQUxUWk9ORSc6IDAsCisgJ0hBVkVfQVNJTkgnOiAxLAorICdIQVZFX0FTTV9UWVBFU19IJzogMSwKKyAnSEFWRV9BVEFOSCc6IDEsCisgJ0hBVkVfQVRUUklCVVRFX0ZPUk1BVF9QQVJTRVRVUExFJzogMCwKKyAnSEFWRV9CSU5EX1RFWFRET01BSU5fQ09ERVNFVCc6IDEsCisgJ0hBVkVfQkxVRVRPT1RIX0JMVUVUT09USF9IJzogMCwKKyAnSEFWRV9CTFVFVE9PVEhfSCc6IDAsCisgJ0hBVkVfQlJPS0VOX05JQ0UnOiAwLAorICdIQVZFX0JST0tFTl9QSVBFX0JVRic6IDAsCisgJ0hBVkVfQlJPS0VOX1BPTEwnOiAwLAorICdIQVZFX0JST0tFTl9QT1NJWF9TRU1BUEhPUkVTJzogMCwKKyAnSEFWRV9CUk9LRU5fUFRIUkVBRF9TSUdNQVNLJzogMCwKKyAnSEFWRV9CUk9LRU5fU0VNX0dFVFZBTFVFJzogMCwKKyAnSEFWRV9CUk9LRU5fVU5TRVRFTlYnOiAwLAorICdIQVZFX0M5OV9CT09MJzogMSwKKyAnSEFWRV9DSEZMQUdTJzogMCwKKyAnSEFWRV9DSE9XTic6IDEsCisgJ0hBVkVfQ0hST09UJzogMSwKKyAnSEFWRV9DTE9DSyc6IDEsCisgJ0hBVkVfQ09ORlNUUic6IDEsCisgJ0hBVkVfQ09OSU9fSCc6IDAsCisgJ0hBVkVfQ09QWVNJR04nOiAxLAorICdIQVZFX0NURVJNSUQnOiAxLAorICdIQVZFX0NURVJNSURfUic6IDAsCisgJ0hBVkVfQ1VSU0VTX0gnOiAxLAorICdIQVZFX0NVUlNFU19JU19URVJNX1JFU0laRUQnOiAxLAorICdIQVZFX0NVUlNFU19SRVNJWkVURVJNJzogMSwKKyAnSEFWRV9DVVJTRVNfUkVTSVpFX1RFUk0nOiAxLAorICdIQVZFX0RFQ0xfSVNGSU5JVEUnOiAxLAorICdIQVZFX0RFQ0xfSVNJTkYnOiAxLAorICdIQVZFX0RFQ0xfSVNOQU4nOiAxLAorICdIQVZFX0RFQ0xfVFpOQU1FJzogMCwKKyAnSEFWRV9ERVZJQ0VfTUFDUk9TJzogMSwKKyAnSEFWRV9ERVZfUFRDJzogMCwKKyAnSEFWRV9ERVZfUFRNWCc6IDEsCisgJ0hBVkVfRElSRUNUX0gnOiAwLAorICdIQVZFX0RJUkVOVF9IJzogMSwKKyAnSEFWRV9ETEZDTl9IJzogMSwKKyAnSEFWRV9ETE9QRU4nOiAxLAorICdIQVZFX0RVUDInOiAxLAorICdIQVZFX0RZTkFNSUNfTE9BRElORyc6IDEsCisgJ0hBVkVfRVBPTEwnOiAxLAorICdIQVZFX0VSRic6IDEsCisgJ0hBVkVfRVJGQyc6IDEsCisgJ0hBVkVfRVJSTk9fSCc6IDEsCisgJ0hBVkVfRVhFQ1YnOiAxLAorICdIQVZFX0VYUE0xJzogMSwKKyAnSEFWRV9GQ0hESVInOiAxLAorICdIQVZFX0ZDSE1PRCc6IDEsCisgJ0hBVkVfRkNIT1dOJzogMSwKKyAnSEFWRV9GQ05UTF9IJzogMSwKKyAnSEFWRV9GREFUQVNZTkMnOiAxLAorICdIQVZFX0ZJTklURSc6IDEsCisgJ0hBVkVfRkxPQ0snOiAxLAorICdIQVZFX0ZPUksnOiAxLAorICdIQVZFX0ZPUktQVFknOiAxLAorICdIQVZFX0ZQQVRIQ09ORic6IDEsCisgJ0hBVkVfRlNFRUs2NCc6IDAsCisgJ0hBVkVfRlNFRUtPJzogMSwKKyAnSEFWRV9GU1RBVFZGUyc6IDEsCisgJ0hBVkVfRlNZTkMnOiAxLAorICdIQVZFX0ZURUxMNjQnOiAwLAorICdIQVZFX0ZURUxMTyc6IDEsCisgJ0hBVkVfRlRJTUUnOiAxLAorICdIQVZFX0ZUUlVOQ0FURSc6IDEsCisgJ0hBVkVfR0FJX1NUUkVSUk9SJzogMSwKKyAnSEFWRV9HQU1NQSc6IDEsCisgJ0hBVkVfR0NDX0FTTV9GT1JfWDg3JzogMSwKKyAnSEFWRV9HRVRBRERSSU5GTyc6IDEsCisgJ0hBVkVfR0VUQ1dEJzogMSwKKyAnSEFWRV9HRVRDX1VOTE9DS0VEJzogMSwKKyAnSEFWRV9HRVRHUk9VUFMnOiAxLAorICdIQVZFX0dFVEhPU1RCWU5BTUUnOiAwLAorICdIQVZFX0dFVEhPU1RCWU5BTUVfUic6IDEsCisgJ0hBVkVfR0VUSE9TVEJZTkFNRV9SXzNfQVJHJzogMCwKKyAnSEFWRV9HRVRIT1NUQllOQU1FX1JfNV9BUkcnOiAwLAorICdIQVZFX0dFVEhPU1RCWU5BTUVfUl82X0FSRyc6IDEsCisgJ0hBVkVfR0VUSVRJTUVSJzogMSwKKyAnSEFWRV9HRVRMT0FEQVZHJzogMSwKKyAnSEFWRV9HRVRMT0dJTic6IDEsCisgJ0hBVkVfR0VUTkFNRUlORk8nOiAxLAorICdIQVZFX0dFVFBBR0VTSVpFJzogMSwKKyAnSEFWRV9HRVRQRUVSTkFNRSc6IDEsCisgJ0hBVkVfR0VUUEdJRCc6IDEsCisgJ0hBVkVfR0VUUEdSUCc6IDEsCisgJ0hBVkVfR0VUUElEJzogMSwKKyAnSEFWRV9HRVRQUklPUklUWSc6IDEsCisgJ0hBVkVfR0VUUFdFTlQnOiAxLAorICdIQVZFX0dFVFJFU0dJRCc6IDEsCisgJ0hBVkVfR0VUUkVTVUlEJzogMSwKKyAnSEFWRV9HRVRTSUQnOiAxLAorICdIQVZFX0dFVFNQRU5UJzogMSwKKyAnSEFWRV9HRVRTUE5BTSc6IDEsCisgJ0hBVkVfR0VUVElNRU9GREFZJzogMSwKKyAnSEFWRV9HRVRXRCc6IDEsCisgJ0hBVkVfR1JQX0gnOiAxLAorICdIQVZFX0hTVFJFUlJPUic6IDEsCisgJ0hBVkVfSFlQT1QnOiAxLAorICdIQVZFX0lFRUVGUF9IJzogMCwKKyAnSEFWRV9JTkVUX0FUT04nOiAxLAorICdIQVZFX0lORVRfUFRPTic6IDEsCisgJ0hBVkVfSU5JVEdST1VQUyc6IDEsCisgJ0hBVkVfSU5UMzJfVCc6IDEsCisgJ0hBVkVfSU5UNjRfVCc6IDEsCisgJ0hBVkVfSU5UVFlQRVNfSCc6IDEsCisgJ0hBVkVfSU9fSCc6IDAsCisgJ0hBVkVfS0lMTCc6IDEsCisgJ0hBVkVfS0lMTFBHJzogMSwKKyAnSEFWRV9LUVVFVUUnOiAwLAorICdIQVZFX0xBTkdJTkZPX0gnOiAxLAorICdIQVZFX0xBUkdFRklMRV9TVVBQT1JUJzogMCwKKyAnSEFWRV9MQ0hGTEFHUyc6IDAsCisgJ0hBVkVfTENITU9EJzogMCwKKyAnSEFWRV9MQ0hPV04nOiAxLAorICdIQVZFX0xHQU1NQSc6IDEsCisgJ0hBVkVfTElCREwnOiAxLAorICdIQVZFX0xJQkRMRCc6IDAsCisgJ0hBVkVfTElCSUVFRSc6IDAsCisgJ0hBVkVfTElCSU5UTF9IJzogMSwKKyAnSEFWRV9MSUJSRUFETElORSc6IDAsCisgJ0hBVkVfTElCUkVTT0xWJzogMCwKKyAnSEFWRV9MSUJVVElMX0gnOiAwLAorICdIQVZFX0xJTksnOiAxLAorICdIQVZFX0xJTlVYX05FVExJTktfSCc6IDEsCisgJ0hBVkVfTElOVVhfVElQQ19IJzogMSwKKyAnSEFWRV9MT0cxUCc6IDEsCisgJ0hBVkVfTE9OR19ET1VCTEUnOiAxLAorICdIQVZFX0xPTkdfTE9ORyc6IDEsCisgJ0hBVkVfTFNUQVQnOiAxLAorICdIQVZFX01BS0VERVYnOiAxLAorICdIQVZFX01FTU1PVkUnOiAxLAorICdIQVZFX01FTU9SWV9IJzogMSwKKyAnSEFWRV9NS0ZJRk8nOiAxLAorICdIQVZFX01LTk9EJzogMSwKKyAnSEFWRV9NS1RJTUUnOiAxLAorICdIQVZFX01SRU1BUCc6IDEsCisgJ0hBVkVfTkNVUlNFU19IJzogMSwKKyAnSEFWRV9ORElSX0gnOiAwLAorICdIQVZFX05FVFBBQ0tFVF9QQUNLRVRfSCc6IDEsCisgJ0hBVkVfTklDRSc6IDEsCisgJ0hBVkVfT1BFTlBUWSc6IDEsCisgJ0hBVkVfT1NYMTA1X1NESyc6IDAsCisgJ0hBVkVfUEFUSENPTkYnOiAxLAorICdIQVZFX1BBVVNFJzogMSwKKyAnSEFWRV9QTE9DSyc6IDAsCisgJ0hBVkVfUE9MTCc6IDEsCisgJ0hBVkVfUE9MTF9IJzogMSwKKyAnSEFWRV9QUk9DRVNTX0gnOiAwLAorICdIQVZFX1BST1RPVFlQRVMnOiAxLAorICdIQVZFX1BUSCc6IDAsCisgJ0hBVkVfUFRIUkVBRF9ERVNUUlVDVE9SJzogMCwKKyAnSEFWRV9QVEhSRUFEX0gnOiAxLAorICdIQVZFX1BUSFJFQURfSU5JVCc6IDAsCisgJ0hBVkVfUFRIUkVBRF9TSUdNQVNLJzogMSwKKyAnSEFWRV9QVFlfSCc6IDEsCisgJ0hBVkVfUFVURU5WJzogMSwKKyAnSEFWRV9SRUFETElOSyc6IDEsCisgJ0hBVkVfUkVBTFBBVEgnOiAxLAorICdIQVZFX1JMX0NBTExCQUNLJzogMCwKKyAnSEFWRV9STF9DQVRDSF9TSUdOQUwnOiAwLAorICdIQVZFX1JMX0NPTVBMRVRJT05fQVBQRU5EX0NIQVJBQ1RFUic6IDAsCisgJ0hBVkVfUkxfQ09NUExFVElPTl9ESVNQTEFZX01BVENIRVNfSE9PSyc6IDAsCisgJ0hBVkVfUkxfQ09NUExFVElPTl9NQVRDSEVTJzogMCwKKyAnSEFWRV9STF9DT01QTEVUSU9OX1NVUFBSRVNTX0FQUEVORCc6IDAsCisgJ0hBVkVfUkxfUFJFX0lOUFVUX0hPT0snOiAwLAorICdIQVZFX1JPVU5EJzogMSwKKyAnSEFWRV9TRUxFQ1QnOiAxLAorICdIQVZFX1NFTV9HRVRWQUxVRSc6IDEsCisgJ0hBVkVfU0VNX09QRU4nOiAxLAorICdIQVZFX1NFTV9USU1FRFdBSVQnOiAxLAorICdIQVZFX1NFTV9VTkxJTksnOiAxLAorICdIQVZFX1NFVEVHSUQnOiAxLAorICdIQVZFX1NFVEVVSUQnOiAxLAorICdIQVZFX1NFVEdJRCc6IDEsCisgJ0hBVkVfU0VUR1JPVVBTJzogMSwKKyAnSEFWRV9TRVRJVElNRVInOiAxLAorICdIQVZFX1NFVExPQ0FMRSc6IDEsCisgJ0hBVkVfU0VUUEdJRCc6IDEsCisgJ0hBVkVfU0VUUEdSUCc6IDEsCisgJ0hBVkVfU0VUUkVHSUQnOiAxLAorICdIQVZFX1NFVFJFU0dJRCc6IDEsCisgJ0hBVkVfU0VUUkVTVUlEJzogMSwKKyAnSEFWRV9TRVRSRVVJRCc6IDEsCisgJ0hBVkVfU0VUU0lEJzogMSwKKyAnSEFWRV9TRVRVSUQnOiAxLAorICdIQVZFX1NFVFZCVUYnOiAxLAorICdIQVZFX1NIQURPV19IJzogMSwKKyAnSEFWRV9TSUdBQ1RJT04nOiAxLAorICdIQVZFX1NJR0lOVEVSUlVQVCc6IDEsCisgJ0hBVkVfU0lHTkFMX0gnOiAxLAorICdIQVZFX1NJR1JFTFNFJzogMSwKKyAnSEFWRV9TTlBSSU5URic6IDEsCisgJ0hBVkVfU09DS0FERFJfU0FfTEVOJzogMCwKKyAnSEFWRV9TT0NLQUREUl9TVE9SQUdFJzogMSwKKyAnSEFWRV9TT0NLRVRQQUlSJzogMSwKKyAnSEFWRV9TUEFXTl9IJzogMSwKKyAnSEFWRV9TU0laRV9UJzogMSwKKyAnSEFWRV9TVEFUVkZTJzogMSwKKyAnSEFWRV9TVEFUX1RWX05TRUMnOiAxLAorICdIQVZFX1NUQVRfVFZfTlNFQzInOiAwLAorICdIQVZFX1NUREFSR19QUk9UT1RZUEVTJzogMSwKKyAnSEFWRV9TVERJTlRfSCc6IDEsCisgJ0hBVkVfU1RETElCX0gnOiAxLAorICdIQVZFX1NUUkRVUCc6IDEsCisgJ0hBVkVfU1RSRlRJTUUnOiAxLAorICdIQVZFX1NUUklOR1NfSCc6IDEsCisgJ0hBVkVfU1RSSU5HX0gnOiAxLAorICdIQVZFX1NUUk9QVFNfSCc6IDEsCisgJ0hBVkVfU1RSVUNUX1NUQVRfU1RfQklSVEhUSU1FJzogMCwKKyAnSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTEtTSVpFJzogMSwKKyAnSEFWRV9TVFJVQ1RfU1RBVF9TVF9CTE9DS1MnOiAxLAorICdIQVZFX1NUUlVDVF9TVEFUX1NUX0ZMQUdTJzogMCwKKyAnSEFWRV9TVFJVQ1RfU1RBVF9TVF9HRU4nOiAwLAorICdIQVZFX1NUUlVDVF9TVEFUX1NUX1JERVYnOiAxLAorICdIQVZFX1NUUlVDVF9UTV9UTV9aT05FJzogMSwKKyAnSEFWRV9TVF9CTE9DS1MnOiAxLAorICdIQVZFX1NZTUxJTksnOiAxLAorICdIQVZFX1NZU0NPTkYnOiAxLAorICdIQVZFX1NZU0VYSVRTX0gnOiAxLAorICdIQVZFX1NZU19BVURJT0lPX0gnOiAwLAorICdIQVZFX1NZU19CU0RUVFlfSCc6IDAsCisgJ0hBVkVfU1lTX0RJUl9IJzogMCwKKyAnSEFWRV9TWVNfRVBPTExfSCc6IDEsCisgJ0hBVkVfU1lTX0VWRU5UX0gnOiAwLAorICdIQVZFX1NZU19GSUxFX0gnOiAxLAorICdIQVZFX1NZU19MT0FEQVZHX0gnOiAwLAorICdIQVZFX1NZU19MT0NLX0gnOiAwLAorICdIQVZFX1NZU19NS0RFVl9IJzogMCwKKyAnSEFWRV9TWVNfTU9ERU1fSCc6IDAsCisgJ0hBVkVfU1lTX05ESVJfSCc6IDAsCisgJ0hBVkVfU1lTX1BBUkFNX0gnOiAxLAorICdIQVZFX1NZU19QT0xMX0gnOiAxLAorICdIQVZFX1NZU19SRVNPVVJDRV9IJzogMSwKKyAnSEFWRV9TWVNfU0VMRUNUX0gnOiAxLAorICdIQVZFX1NZU19TT0NLRVRfSCc6IDEsCisgJ0hBVkVfU1lTX1NUQVRWRlNfSCc6IDEsCisgJ0hBVkVfU1lTX1NUQVRfSCc6IDEsCisgJ0hBVkVfU1lTX1RFUk1JT19IJzogMCwKKyAnSEFWRV9TWVNfVElNRVNfSCc6IDEsCisgJ0hBVkVfU1lTX1RJTUVfSCc6IDEsCisgJ0hBVkVfU1lTX1RZUEVTX0gnOiAxLAorICdIQVZFX1NZU19VTl9IJzogMSwKKyAnSEFWRV9TWVNfVVRTTkFNRV9IJzogMSwKKyAnSEFWRV9TWVNfV0FJVF9IJzogMSwKKyAnSEFWRV9UQ0dFVFBHUlAnOiAxLAorICdIQVZFX1RDU0VUUEdSUCc6IDEsCisgJ0hBVkVfVEVNUE5BTSc6IDEsCisgJ0hBVkVfVEVSTUlPU19IJzogMSwKKyAnSEFWRV9URVJNX0gnOiAxLAorICdIQVZFX1RHQU1NQSc6IDEsCisgJ0hBVkVfVEhSRUFEX0gnOiAwLAorICdIQVZFX1RJTUVHTSc6IDEsCisgJ0hBVkVfVElNRVMnOiAxLAorICdIQVZFX1RNUEZJTEUnOiAxLAorICdIQVZFX1RNUE5BTSc6IDEsCisgJ0hBVkVfVE1QTkFNX1InOiAxLAorICdIQVZFX1RNX1pPTkUnOiAxLAorICdIQVZFX1RSVU5DQVRFJzogMSwKKyAnSEFWRV9UWk5BTUUnOiAwLAorICdIQVZFX1VDUzRfVENMJzogMCwKKyAnSEFWRV9VSU5UMzJfVCc6IDEsCisgJ0hBVkVfVUlOVDY0X1QnOiAxLAorICdIQVZFX1VJTlRQVFJfVCc6IDEsCisgJ0hBVkVfVU5BTUUnOiAxLAorICdIQVZFX1VOSVNURF9IJzogMSwKKyAnSEFWRV9VTlNFVEVOVic6IDEsCisgJ0hBVkVfVVNBQkxFX1dDSEFSX1QnOiAwLAorICdIQVZFX1VUSUxfSCc6IDAsCisgJ0hBVkVfVVRJTUVTJzogMSwKKyAnSEFWRV9VVElNRV9IJzogMSwKKyAnSEFWRV9XQUlUMyc6IDEsCisgJ0hBVkVfV0FJVDQnOiAxLAorICdIQVZFX1dBSVRQSUQnOiAxLAorICdIQVZFX1dDSEFSX0gnOiAxLAorICdIQVZFX1dDU0NPTEwnOiAxLAorICdIQVZFX1dJTlNPQ0syX0gnOiAwLAorICdIQVZFX1dPUktJTkdfVFpTRVQnOiAxLAorICdIQVZFX1pMSUJfQ09QWSc6IDEsCisgJ0hBVkVfX0dFVFBUWSc6IDAsCisgJ0hHQlJBTkNIJzogJ2hnIGlkIC1iIC9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUnLAorICdIR1RBRyc6ICdoZyBpZCAtdCAvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41JywKKyAnSEdWRVJTSU9OJzogJ2hnIGlkIC1pIC9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUnLAorICdIT1NUX0dOVV9UWVBFJzogJ3g4Nl82NC1wYy1saW51eC1nbnUnLAorICdIVVJEX0NfVEhSRUFEUyc6IDAsCisgJ0lOQ0xESVJTVE9NQUtFJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9pbmNsdWRlIC90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9pbmNsdWRlIC90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9pbmNsdWRlL3B5dGhvbjIuNyAvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvaW5jbHVkZS9weXRob24yLjcnLAorICdJTkNMVURFRElSJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9pbmNsdWRlJywKKyAnSU5DTFVERVBZJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9pbmNsdWRlL3B5dGhvbjIuNycsCisgJ0lOU1RBTEwnOiAnL3Vzci9iaW4vaW5zdGFsbCAtYycsCisgJ0lOU1RBTExfREFUQSc6ICcvdXNyL2Jpbi9pbnN0YWxsIC1jIC1tIDY0NCcsCisgJ0lOU1RBTExfUFJPR1JBTSc6ICcvdXNyL2Jpbi9pbnN0YWxsIC1jJywKKyAnSU5TVEFMTF9TQ1JJUFQnOiAnL3Vzci9iaW4vaW5zdGFsbCAtYycsCisgJ0lOU1RBTExfU0hBUkVEJzogJy91c3IvYmluL2luc3RhbGwgLWMgLW0gNTU1JywKKyAnSU5TVFNPTkFNRSc6ICdsaWJweXRob24yLjcuYScsCisgJ0xEQ1hYU0hBUkVEJzogJ3g4Nl82NC1saW51eC1nbnUtZ2NjIC1zaGFyZWQnLAorICdMREZMQUdTJzogJycsCisgJ0xETEFTVCc6ICcnLAorICdMRExJQlJBUlknOiAnbGlicHl0aG9uMi43LmEnLAorICdMRExJQlJBUllESVInOiAnJywKKyAnTERTSEFSRUQnOiAneDg2XzY0LWxpbnV4LWdudS1nY2MgLXNoYXJlZCcsCisgJ0xJQkMnOiAnJywKKyAnTElCREVTVCc6ICcvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL3B5dGhvbjIuNycsCisgJ0xJQkRJUic6ICcvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliJywKKyAnTElCRkZJX0lOQ0xVREVESVInOiAnJywKKyAnTElCTSc6ICctbG0nLAorICdMSUJPQkpESVInOiAnUHl0aG9uLycsCisgJ0xJQk9CSlMnOiAnJywKKyAnTElCUCc6ICcvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL3B5dGhvbjIuNycsCisgJ0xJQlBDJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWIvcGtnY29uZmlnJywKKyAnTElCUEwnOiAnL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0L2xpYi9weXRob24yLjcvY29uZmlnJywKKyAnTElCUkFSWSc6ICdsaWJweXRob24yLjcuYScsCisgJ0xJQlJBUllfT0JKUyc6ICdcXCcsCisgJ0xJQlMnOiAnLWxwdGhyZWFkIC1sZGwgIC1sdXRpbCcsCisgJ0xJQlNVQkRJUlMnOiAnbGliLXRrIGxpYi10ay90ZXN0IGxpYi10ay90ZXN0L3Rlc3RfdGtpbnRlciBcXCcsCisgJ0xJTktDQyc6ICd4ODZfNjQtbGludXgtZ251LWdjYyAtcHRocmVhZCcsCisgJ0xJTktGT1JTSEFSRUQnOiAnLVhsaW5rZXIgLWV4cG9ydC1keW5hbWljJywKKyAnTE4nOiAnbG4nLAorICdMT0NBTE1PRExJQlMnOiAnJywKKyAnTUFDSERFUCc6ICdsaW51eDInLAorICdNQUNIREVQUEFUSCc6ICc6cGxhdC1saW51eDInLAorICdNQUNIREVQUyc6ICdwbGF0LWxpbnV4MicsCisgJ01BQ0hERVBfT0JKUyc6ICcnLAorICdNQUNIREVTVExJQic6ICcvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQvbGliL3B5dGhvbjIuNycsCisgJ01BQ0hfQ19USFJFQURTJzogMCwKKyAnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJzogJycsCisgJ01BSU5DQyc6ICd4ODZfNjQtbGludXgtZ251LWdjYyAtcHRocmVhZCcsCisgJ01BSk9SX0lOX01LREVWJzogMCwKKyAnTUFKT1JfSU5fU1lTTUFDUk9TJzogMCwKKyAnTUFLRVNFVFVQJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvTW9kdWxlcy9tYWtlc2V0dXAnLAorICdNQU5ESVInOiAnL3RtcC9uZGstYW5kcmV3aHNpZWgvYnVpbGRob3N0L2luc3RhbGwvcHJlYnVpbHQvbGludXgteDg2XzY0L3NoYXJlL21hbicsCisgJ01FTVRFU1RPUFRTJzogJy1sIC14IHRlc3Rfc3VicHJvY2VzcyB0ZXN0X2lvIHRlc3RfbGliMnRvMyBcXCAteCB0ZXN0X2RsIHRlc3RfX19hbGxfXyB0ZXN0X2ZvcmsxIFxcJywKKyAnTUtESVJfUCc6ICcvYmluL21rZGlyIC1wJywKKyAnTU9ETElCUyc6ICcnLAorICdNT0RPQkpTJzogJ01vZHVsZXMvcG9zaXhtb2R1bGUubyAgTW9kdWxlcy90aHJlYWRtb2R1bGUubyAgTW9kdWxlcy9zaWduYWxtb2R1bGUubyAgTW9kdWxlcy9lcnJub21vZHVsZS5vICBNb2R1bGVzL19zcmUubyAgTW9kdWxlcy9fY29kZWNzbW9kdWxlLm8gIE1vZHVsZXMvX3dlYWtyZWYubyAgTW9kdWxlcy96aXBpbXBvcnQubyAgTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vICBNb2R1bGVzL3h4c3VidHlwZS5vJywKKyAnTU9EVUxFX09CSlMnOiAnXFwnLAorICdNU1lTVlBBVEgnOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNScsCisgJ01VTFRJQVJDSCc6ICcnLAorICdNVldERUxDSF9JU19FWFBSRVNTSU9OJzogMSwKKyAnTlRfVEhSRUFEUyc6IDAsCisgJ09CSkVDVF9PQkpTJzogJ1xcJywKKyAnT0xEUEFUSCc6ICc6bGliLW9sZCcsCisgJ09QVCc6ICctRE5ERUJVRycsCisgJ09USEVSX0xJQlRPT0xfT1BUJzogJycsCisgJ1BBQ0tBR0VfQlVHUkVQT1JUJzogMCwKKyAnUEFDS0FHRV9OQU1FJzogMCwKKyAnUEFDS0FHRV9TVFJJTkcnOiAwLAorICdQQUNLQUdFX1RBUk5BTUUnOiAwLAorICdQQUNLQUdFX1VSTCc6IDAsCisgJ1BBQ0tBR0VfVkVSU0lPTic6IDAsCisgJ1BBUlNFUl9IRUFERVJTJzogJ1xcJywKKyAnUEFSU0VSX09CSlMnOiAnXFwgUGFyc2VyL215cmVhZGxpbmUubyBQYXJzZXIvdG9rZW5pemVyLm8nLAorICdQR0VOJzogJ1BhcnNlci9wZ2VuJywKKyAnUEdFTk9CSlMnOiAnXFwgXFwnLAorICdQR0VOU1JDUyc6ICdcXCBcXCcsCisgJ1BHT0JKUyc6ICdcXCcsCisgJ1BHU1JDUyc6ICdcXCcsCisgJ1BMQVRESVInOiAncGxhdC1saW51eDInLAorICdQTEFUTUFDRElSUyc6ICdwbGF0LW1hYyBwbGF0LW1hYy9DYXJib24gcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzIFxcJywKKyAnUExBVE1BQ1BBVEgnOiAnOnBsYXQtbWFjOnBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcycsCisgJ1BPQkpTJzogJ1xcJywKKyAnUE9TSVhfU0VNQVBIT1JFU19OT1RfRU5BQkxFRCc6IDAsCisgJ1BST0ZJTEVfVEFTSyc6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41L1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weSAtbiAyIC0td2l0aC1nYyAtLXdpdGgtc3lzY2hlY2snLAorICdQU1JDUyc6ICdcXCcsCisgJ1BUSFJFQURfU1lTVEVNX1NDSEVEX1NVUFBPUlRFRCc6IDEsCisgJ1BVUklGWSc6ICcnLAorICdQWUxPTkdfQklUU19JTl9ESUdJVCc6IDAsCisgJ1BZVEhPTic6ICdweXRob24nLAorICdQWVRIT05GUkFNRVdPUksnOiAnJywKKyAnUFlUSE9ORlJBTUVXT1JLRElSJzogJ25vLWZyYW1ld29yaycsCisgJ1BZVEhPTkZSQU1FV09SS0lOU1RBTExESVInOiAnJywKKyAnUFlUSE9ORlJBTUVXT1JLUFJFRklYJzogJycsCisgJ1BZVEhPTlBBVEgnOiAnOnBsYXQtbGludXgyOmxpYi10azpsaWItb2xkJywKKyAnUFlUSE9OX0ZPUl9CVUlMRCc6ICcuL3B5dGhvbiAtRScsCisgJ1BZVEhPTl9IRUFERVJTJzogJ1xcJywKKyAnUFlUSE9OX09CSlMnOiAnXFwnLAorICdQWV9DRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgLU8yIC1PcyAtZm9taXQtZnJhbWUtcG9pbnRlciAtcyAtRE5ERUJVRyAtSS4gLUlJbmNsdWRlIC1JL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9JbmNsdWRlICAtRFB5X0JVSUxEX0NPUkUnLAorICdQWV9GT1JNQVRfTE9OR19MT05HJzogJyJsbCInLAorICdQWV9GT1JNQVRfU0laRV9UJzogJyJ6IicsCisgJ1BZX1VOSUNPREVfVFlQRSc6ICd1bnNpZ25lZCBzaG9ydCcsCisgJ1B5X0RFQlVHJzogMCwKKyAnUHlfRU5BQkxFX1NIQVJFRCc6IDAsCisgJ1B5X1VOSUNPREVfU0laRSc6IDIsCisgJ1B5X1VTSU5HX1VOSUNPREUnOiAxLAorICdRVUlDS1RFU1RPUFRTJzogJy1sIC14IHRlc3Rfc3VicHJvY2VzcyB0ZXN0X2lvIHRlc3RfbGliMnRvMyBcXCcsCisgJ1JBTkxJQic6ICd4ODZfNjQtbGludXgtZ251LXJhbmxpYicsCisgJ1JFUEFSU0VfREFUQV9CVUZGRVJfSU5fV0lOTlQnOiAwLAorICdSRVNTUkNESVInOiAnTWFjL1Jlc291cmNlcy9mcmFtZXdvcmsnLAorICdSRVRTSUdUWVBFJzogJ3ZvaWQnLAorICdSVU5TSEFSRUQnOiAnJywKKyAnU0NSSVBURElSJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9saWInLAorICdTRVRQR1JQX0hBVkVfQVJHJzogMCwKKyAnU0dJX0FCSSc6ICcnLAorICdTSEVMTCc6ICcvYmluL3NoJywKKyAnU0hMSUJTJzogJy1scHRocmVhZCAtbGRsICAtbHV0aWwnLAorICdTSExJQl9FWFQnOiAnIi5zbyInLAorICdTSUdOQUxfT0JKUyc6ICcnLAorICdTSUdORURfUklHSFRfU0hJRlRfWkVST19GSUxMUyc6IDAsCisgJ1NJVEVQQVRIJzogJycsCisgJ1NJWkVPRl9ET1VCTEUnOiA4LAorICdTSVpFT0ZfRkxPQVQnOiA0LAorICdTSVpFT0ZfRlBPU19UJzogMTYsCisgJ1NJWkVPRl9JTlQnOiA0LAorICdTSVpFT0ZfTE9ORyc6IDgsCisgJ1NJWkVPRl9MT05HX0RPVUJMRSc6IDE2LAorICdTSVpFT0ZfTE9OR19MT05HJzogOCwKKyAnU0laRU9GX09GRl9UJzogOCwKKyAnU0laRU9GX1BJRF9UJzogNCwKKyAnU0laRU9GX1BUSFJFQURfVCc6IDgsCisgJ1NJWkVPRl9TSE9SVCc6IDIsCisgJ1NJWkVPRl9TSVpFX1QnOiA4LAorICdTSVpFT0ZfVElNRV9UJzogOCwKKyAnU0laRU9GX1VJTlRQVFJfVCc6IDgsCisgJ1NJWkVPRl9WT0lEX1AnOiA4LAorICdTSVpFT0ZfV0NIQVJfVCc6IDQsCisgJ1NJWkVPRl9fQk9PTCc6IDEsCisgJ1NPJzogJy5zbycsCisgJ1NSQ0RJUlMnOiAnUGFyc2VyIEdyYW1tYXIgT2JqZWN0cyBQeXRob24gTW9kdWxlcyBNYWMnLAorICdTUkNfR0RCX0hPT0tTJzogJy9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUvVG9vbHMvZ2RiL2xpYnB5dGhvbi5weScsCisgJ1NURENfSEVBREVSUyc6IDEsCisgJ1NUUklDVF9TWVNWX0NVUlNFUyc6ICIvKiBEb24ndCB1c2UgbmN1cnNlcyBleHRlbnNpb25zICovIiwKKyAnU1RSSU5HTElCX0hFQURFUlMnOiAnXFwnLAorICdTVUJESVJTJzogJycsCisgJ1NVQkRJUlNUT08nOiAnSW5jbHVkZSBMaWIgTWlzYyBEZW1vJywKKyAnU1ZOVkVSU0lPTic6ICdzdm52ZXJzaW9uIC9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUnLAorICdTWVNMSUJTJzogJy1sbScsCisgJ1NZU19TRUxFQ1RfV0lUSF9TWVNfVElNRSc6IDEsCisgJ1RBTkhfUFJFU0VSVkVTX1pFUk9fU0lHTic6IDEsCisgJ1RFU1RPUFRTJzogJy1sJywKKyAnVEVTVFBBVEgnOiAnJywKKyAnVEVTVFBST0cnOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9MaWIvdGVzdC9yZWdydGVzdC5weScsCisgJ1RFU1RQWVRIT04nOiAnLi9weXRob24gLVdkIC0zIC1FIC10dCcsCisgJ1RFU1RQWVRIT05PUFRTJzogJycsCisgJ1RIUkVBRE9CSic6ICdQeXRob24vdGhyZWFkLm8nLAorICdUSU1FX1dJVEhfU1lTX1RJTUUnOiAxLAorICdUS1BBVEgnOiAnOmxpYi10aycsCisgJ1RNX0lOX1NZU19USU1FJzogMCwKKyAnVU5JQ09ERV9PQkpTJzogJ09iamVjdHMvdW5pY29kZW9iamVjdC5vIE9iamVjdHMvdW5pY29kZWN0eXBlLm8nLAorICdVTklWRVJTQUxTREsnOiAnJywKKyAnVVNFX1RPT0xCT1hfT0JKRUNUX0dMVUUnOiAwLAorICdWQV9MSVNUX0lTX0FSUkFZJzogMSwKKyAnVkVSU0lPTic6ICcyLjcnLAorICdWUEFUSCc6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41JywKKyAnV0FOVF9TSUdGUEVfSEFORExFUic6IDAsCisgJ1dBTlRfV0NUWVBFX0ZVTkNUSU9OUyc6IDAsCisgJ1dJTkRPV19IQVNfRkxBR1MnOiAxLAorICdXSVRIX0RPQ19TVFJJTkdTJzogMSwKKyAnV0lUSF9EWUxEJzogMCwKKyAnV0lUSF9MSUJJTlRMJzogMCwKKyAnV0lUSF9ORVhUX0ZSQU1FV09SSyc6IDAsCisgJ1dJVEhfUFlNQUxMT0MnOiAxLAorICdXSVRIX1NZU1RFTV9MSUJGRkknOiAwLAorICdXSVRIX1RIUkVBRCc6IDEsCisgJ1dJVEhfVFNDJzogMCwKKyAnV0lUSF9WQUxHUklORCc6IDAsCisgJ1g4N19ET1VCTEVfUk9VTkRJTkcnOiAwLAorICdYTUxMSUJTVUJESVJTJzogJ3htbCB4bWwvZG9tIHhtbC9ldHJlZSB4bWwvcGFyc2VycyB4bWwvc2F4JywKKyAnYWJzX2J1aWxkZGlyJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9idWlsZC1weXRob24tbGludXgteDg2XzY0LTIuNy41JywKKyAnYWJzX3NyY2Rpcic6ICcvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41JywKKyAnYnVpbGQnOiAneDg2XzY0LXBjLWxpbnV4LWdudScsCisgJ2RhdGFyb290ZGlyJzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NC9zaGFyZScsCisgJ2V4ZWNfcHJlZml4JzogJy90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NCcsCisgJ2hvc3QnOiAneDg2XzY0LXBjLWxpbnV4LWdudScsCisgJ3ByZWZpeCc6ICcvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvaW5zdGFsbC9wcmVidWlsdC9saW51eC14ODZfNjQnLAorICdzcmNkaXInOiAnL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNSd9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5YyBiL2xpYi9weXRob24yLjcvX3N5c2NvbmZpZ2RhdGEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZmNjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5byBiL2xpYi9weXRob24yLjcvX3N5c2NvbmZpZ2RhdGEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZmNjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L19zeXNjb25maWdkYXRhLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L190aHJlYWRpbmdfbG9jYWwucHkgYi9saWIvcHl0aG9uMi43L190aHJlYWRpbmdfbG9jYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlhMzUxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3RocmVhZGluZ19sb2NhbC5weQpAQCAtMCwwICsxLDI1MSBAQAorIiIiVGhyZWFkLWxvY2FsIG9iamVjdHMuCisKKyhOb3RlIHRoYXQgdGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBQeXRob24gdmVyc2lvbiBvZiB0aGUgdGhyZWFkaW5nLmxvY2FsCisgY2xhc3MuICBEZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHlvdSdyZSB1c2luZywgdGhlcmUgbWF5IGJlIGEKKyBmYXN0ZXIgb25lIGF2YWlsYWJsZS4gIFlvdSBzaG91bGQgYWx3YXlzIGltcG9ydCB0aGUgYGxvY2FsYCBjbGFzcyBmcm9tCisgYHRocmVhZGluZ2AuKQorCitUaHJlYWQtbG9jYWwgb2JqZWN0cyBzdXBwb3J0IHRoZSBtYW5hZ2VtZW50IG9mIHRocmVhZC1sb2NhbCBkYXRhLgorSWYgeW91IGhhdmUgZGF0YSB0aGF0IHlvdSB3YW50IHRvIGJlIGxvY2FsIHRvIGEgdGhyZWFkLCBzaW1wbHkgY3JlYXRlCithIHRocmVhZC1sb2NhbCBvYmplY3QgYW5kIHVzZSBpdHMgYXR0cmlidXRlczoKKworICA+Pj4gbXlkYXRhID0gbG9jYWwoKQorICA+Pj4gbXlkYXRhLm51bWJlciA9IDQyCisgID4+PiBteWRhdGEubnVtYmVyCisgIDQyCisKK1lvdSBjYW4gYWxzbyBhY2Nlc3MgdGhlIGxvY2FsLW9iamVjdCdzIGRpY3Rpb25hcnk6CisKKyAgPj4+IG15ZGF0YS5fX2RpY3RfXworICB7J251bWJlcic6IDQyfQorICA+Pj4gbXlkYXRhLl9fZGljdF9fLnNldGRlZmF1bHQoJ3dpZGdldHMnLCBbXSkKKyAgW10KKyAgPj4+IG15ZGF0YS53aWRnZXRzCisgIFtdCisKK1doYXQncyBpbXBvcnRhbnQgYWJvdXQgdGhyZWFkLWxvY2FsIG9iamVjdHMgaXMgdGhhdCB0aGVpciBkYXRhIGFyZQorbG9jYWwgdG8gYSB0aHJlYWQuIElmIHdlIGFjY2VzcyB0aGUgZGF0YSBpbiBhIGRpZmZlcmVudCB0aHJlYWQ6CisKKyAgPj4+IGxvZyA9IFtdCisgID4+PiBkZWYgZigpOgorICAuLi4gICAgIGl0ZW1zID0gbXlkYXRhLl9fZGljdF9fLml0ZW1zKCkKKyAgLi4uICAgICBpdGVtcy5zb3J0KCkKKyAgLi4uICAgICBsb2cuYXBwZW5kKGl0ZW1zKQorICAuLi4gICAgIG15ZGF0YS5udW1iZXIgPSAxMQorICAuLi4gICAgIGxvZy5hcHBlbmQobXlkYXRhLm51bWJlcikKKworICA+Pj4gaW1wb3J0IHRocmVhZGluZworICA+Pj4gdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZikKKyAgPj4+IHRocmVhZC5zdGFydCgpCisgID4+PiB0aHJlYWQuam9pbigpCisgID4+PiBsb2cKKyAgW1tdLCAxMV0KKword2UgZ2V0IGRpZmZlcmVudCBkYXRhLiAgRnVydGhlcm1vcmUsIGNoYW5nZXMgbWFkZSBpbiB0aGUgb3RoZXIgdGhyZWFkCitkb24ndCBhZmZlY3QgZGF0YSBzZWVuIGluIHRoaXMgdGhyZWFkOgorCisgID4+PiBteWRhdGEubnVtYmVyCisgIDQyCisKK09mIGNvdXJzZSwgdmFsdWVzIHlvdSBnZXQgZnJvbSBhIGxvY2FsIG9iamVjdCwgaW5jbHVkaW5nIGEgX19kaWN0X18KK2F0dHJpYnV0ZSwgYXJlIGZvciB3aGF0ZXZlciB0aHJlYWQgd2FzIGN1cnJlbnQgYXQgdGhlIHRpbWUgdGhlCithdHRyaWJ1dGUgd2FzIHJlYWQuICBGb3IgdGhhdCByZWFzb24sIHlvdSBnZW5lcmFsbHkgZG9uJ3Qgd2FudCB0byBzYXZlCit0aGVzZSB2YWx1ZXMgYWNyb3NzIHRocmVhZHMsIGFzIHRoZXkgYXBwbHkgb25seSB0byB0aGUgdGhyZWFkIHRoZXkKK2NhbWUgZnJvbS4KKworWW91IGNhbiBjcmVhdGUgY3VzdG9tIGxvY2FsIG9iamVjdHMgYnkgc3ViY2xhc3NpbmcgdGhlIGxvY2FsIGNsYXNzOgorCisgID4+PiBjbGFzcyBNeUxvY2FsKGxvY2FsKToKKyAgLi4uICAgICBudW1iZXIgPSAyCisgIC4uLiAgICAgaW5pdGlhbGl6ZWQgPSBGYWxzZQorICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3KToKKyAgLi4uICAgICAgICAgaWYgc2VsZi5pbml0aWFsaXplZDoKKyAgLi4uICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKCdfX2luaXRfXyBjYWxsZWQgdG9vIG1hbnkgdGltZXMnKQorICAuLi4gICAgICAgICBzZWxmLmluaXRpYWxpemVkID0gVHJ1ZQorICAuLi4gICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShrdykKKyAgLi4uICAgICBkZWYgc3F1YXJlZChzZWxmKToKKyAgLi4uICAgICAgICAgcmV0dXJuIHNlbGYubnVtYmVyICoqIDIKKworVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHN1cHBvcnQgZGVmYXVsdCB2YWx1ZXMsIG1ldGhvZHMgYW5kCitpbml0aWFsaXphdGlvbi4gIE5vdGUgdGhhdCBpZiB5b3UgZGVmaW5lIGFuIF9faW5pdF9fIG1ldGhvZCwgaXQgd2lsbCBiZQorY2FsbGVkIGVhY2ggdGltZSB0aGUgbG9jYWwgb2JqZWN0IGlzIHVzZWQgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuICBUaGlzCitpcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSBlYWNoIHRocmVhZCdzIGRpY3Rpb25hcnkuCisKK05vdyBpZiB3ZSBjcmVhdGUgYSBsb2NhbCBvYmplY3Q6CisKKyAgPj4+IG15ZGF0YSA9IE15TG9jYWwoY29sb3I9J3JlZCcpCisKK05vdyB3ZSBoYXZlIGEgZGVmYXVsdCBudW1iZXI6CisKKyAgPj4+IG15ZGF0YS5udW1iZXIKKyAgMgorCithbiBpbml0aWFsIGNvbG9yOgorCisgID4+PiBteWRhdGEuY29sb3IKKyAgJ3JlZCcKKyAgPj4+IGRlbCBteWRhdGEuY29sb3IKKworQW5kIGEgbWV0aG9kIHRoYXQgb3BlcmF0ZXMgb24gdGhlIGRhdGE6CisKKyAgPj4+IG15ZGF0YS5zcXVhcmVkKCkKKyAgNAorCitBcyBiZWZvcmUsIHdlIGNhbiBhY2Nlc3MgdGhlIGRhdGEgaW4gYSBzZXBhcmF0ZSB0aHJlYWQ6CisKKyAgPj4+IGxvZyA9IFtdCisgID4+PiB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1mKQorICA+Pj4gdGhyZWFkLnN0YXJ0KCkKKyAgPj4+IHRocmVhZC5qb2luKCkKKyAgPj4+IGxvZworICBbWygnY29sb3InLCAncmVkJyksICgnaW5pdGlhbGl6ZWQnLCBUcnVlKV0sIDExXQorCit3aXRob3V0IGFmZmVjdGluZyB0aGlzIHRocmVhZCdzIGRhdGE6CisKKyAgPj4+IG15ZGF0YS5udW1iZXIKKyAgMgorICA+Pj4gbXlkYXRhLmNvbG9yCisgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCisgIEF0dHJpYnV0ZUVycm9yOiAnTXlMb2NhbCcgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ2NvbG9yJworCitOb3RlIHRoYXQgc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHNsb3RzLCBidXQgdGhleSBhcmUgbm90IHRocmVhZAorbG9jYWwuIFRoZXkgYXJlIHNoYXJlZCBhY3Jvc3MgdGhyZWFkczoKKworICA+Pj4gY2xhc3MgTXlMb2NhbChsb2NhbCk6CisgIC4uLiAgICAgX19zbG90c19fID0gJ251bWJlcicKKworICA+Pj4gbXlkYXRhID0gTXlMb2NhbCgpCisgID4+PiBteWRhdGEubnVtYmVyID0gNDIKKyAgPj4+IG15ZGF0YS5jb2xvciA9ICdyZWQnCisKK1NvLCB0aGUgc2VwYXJhdGUgdGhyZWFkOgorCisgID4+PiB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1mKQorICA+Pj4gdGhyZWFkLnN0YXJ0KCkKKyAgPj4+IHRocmVhZC5qb2luKCkKKworYWZmZWN0cyB3aGF0IHdlIHNlZToKKworICA+Pj4gbXlkYXRhLm51bWJlcgorICAxMQorCis+Pj4gZGVsIG15ZGF0YQorIiIiCisKK19fYWxsX18gPSBbImxvY2FsIl0KKworIyBXZSBuZWVkIHRvIHVzZSBvYmplY3RzIGZyb20gdGhlIHRocmVhZGluZyBtb2R1bGUsIGJ1dCB0aGUgdGhyZWFkaW5nCisjIG1vZHVsZSBtYXkgYWxzbyB3YW50IHRvIHVzZSBvdXIgYGxvY2FsYCBjbGFzcywgaWYgc3VwcG9ydCBmb3IgbG9jYWxzCisjIGlzbid0IGNvbXBpbGVkIGluIHRvIHRoZSBgdGhyZWFkYCBtb2R1bGUuICBUaGlzIGNyZWF0ZXMgcG90ZW50aWFsIHByb2JsZW1zCisjIHdpdGggY2lyY3VsYXIgaW1wb3J0cy4gIEZvciB0aGF0IHJlYXNvbiwgd2UgZG9uJ3QgaW1wb3J0IGB0aHJlYWRpbmdgCisjIHVudGlsIHRoZSBib3R0b20gb2YgdGhpcyBmaWxlIChhIGhhY2sgc3VmZmljaWVudCB0byB3b3JtIGFyb3VuZCB0aGUKKyMgcG90ZW50aWFsIHByb2JsZW1zKS4gIE5vdGUgdGhhdCBhbG1vc3QgYWxsIHBsYXRmb3JtcyBkbyBoYXZlIHN1cHBvcnQgZm9yCisjIGxvY2FscyBpbiB0aGUgYHRocmVhZGAgbW9kdWxlLCBhbmQgdGhlcmUgaXMgbm8gY2lyY3VsYXIgaW1wb3J0IHByb2JsZW0KKyMgdGhlbiwgc28gcHJvYmxlbXMgaW50cm9kdWNlZCBieSBmaWRkbGluZyB0aGUgb3JkZXIgb2YgaW1wb3J0cyBoZXJlIHdvbid0CisjIG1hbmlmZXN0IG9uIG1vc3QgYm94ZXMuCisKK2NsYXNzIF9sb2NhbGJhc2Uob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAnX2xvY2FsX19rZXknLCAnX2xvY2FsX19hcmdzJywgJ19sb2NhbF9fbG9jaycKKworICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3cpOgorICAgICAgICBzZWxmID0gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICBrZXkgPSAnX2xvY2FsX19rZXknLCAndGhyZWFkLmxvY2FsLicgKyBzdHIoaWQoc2VsZikpCisgICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCAnX2xvY2FsX19rZXknLCBrZXkpCisgICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCAnX2xvY2FsX19hcmdzJywgKGFyZ3MsIGt3KSkKKyAgICAgICAgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsICdfbG9jYWxfX2xvY2snLCBSTG9jaygpKQorCisgICAgICAgIGlmIChhcmdzIG9yIGt3KSBhbmQgKGNscy5fX2luaXRfXyBpcyBvYmplY3QuX19pbml0X18pOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJJbml0aWFsaXphdGlvbiBhcmd1bWVudHMgYXJlIG5vdCBzdXBwb3J0ZWQiKQorCisgICAgICAgICMgV2UgbmVlZCB0byBjcmVhdGUgdGhlIHRocmVhZCBkaWN0IGluIGFudGljaXBhdGlvbiBvZgorICAgICAgICAjIF9faW5pdF9fIGJlaW5nIGNhbGxlZCwgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGNhbGwgaXQKKyAgICAgICAgIyBhZ2FpbiBvdXJzZWx2ZXMuCisgICAgICAgIGRpY3QgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX19kaWN0X18nKQorICAgICAgICBjdXJyZW50X3RocmVhZCgpLl9fZGljdF9fW2tleV0gPSBkaWN0CisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworZGVmIF9wYXRjaChzZWxmKToKKyAgICBrZXkgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19rZXknKQorICAgIGQgPSBjdXJyZW50X3RocmVhZCgpLl9fZGljdF9fLmdldChrZXkpCisgICAgaWYgZCBpcyBOb25lOgorICAgICAgICBkID0ge30KKyAgICAgICAgY3VycmVudF90aHJlYWQoKS5fX2RpY3RfX1trZXldID0gZAorICAgICAgICBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgJ19fZGljdF9fJywgZCkKKworICAgICAgICAjIHdlIGhhdmUgYSBuZXcgaW5zdGFuY2UgZGljdCwgc28gY2FsbCBvdXQgX19pbml0X18gaWYgd2UgaGF2ZQorICAgICAgICAjIG9uZQorICAgICAgICBjbHMgPSB0eXBlKHNlbGYpCisgICAgICAgIGlmIGNscy5fX2luaXRfXyBpcyBub3Qgb2JqZWN0Ll9faW5pdF9fOgorICAgICAgICAgICAgYXJncywga3cgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19hcmdzJykKKyAgICAgICAgICAgIGNscy5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKyAgICBlbHNlOgorICAgICAgICBvYmplY3QuX19zZXRhdHRyX18oc2VsZiwgJ19fZGljdF9fJywgZCkKKworY2xhc3MgbG9jYWwoX2xvY2FsYmFzZSk6CisKKyAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgbG9jayA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfbG9jYWxfX2xvY2snKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfcGF0Y2goc2VsZikKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIGlmIG5hbWUgPT0gJ19fZGljdF9fJzoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKAorICAgICAgICAgICAgICAgICIlciBvYmplY3QgYXR0cmlidXRlICdfX2RpY3RfXycgaXMgcmVhZC1vbmx5IgorICAgICAgICAgICAgICAgICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pCisgICAgICAgIGxvY2sgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19sb2NrJykKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX3BhdGNoKHNlbGYpCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBfX2RlbGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSA9PSAnX19kaWN0X18nOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoCisgICAgICAgICAgICAgICAgIiVyIG9iamVjdCBhdHRyaWJ1dGUgJ19fZGljdF9fJyBpcyByZWFkLW9ubHkiCisgICAgICAgICAgICAgICAgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICAgICAgbG9jayA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfbG9jYWxfX2xvY2snKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfcGF0Y2goc2VsZikKKyAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHRocmVhZGluZworCisgICAgICAgIGtleSA9IG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsICdfbG9jYWxfX2tleScpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBXZSB1c2UgdGhlIG5vbi1sb2NraW5nIEFQSSBzaW5jZSB3ZSBtaWdodCBhbHJlYWR5IGhvbGQgdGhlIGxvY2sKKyAgICAgICAgICAgICMgKF9fZGVsX18gY2FuIGJlIGNhbGxlZCBhdCBhbnkgcG9pbnQgYnkgdGhlIGN5Y2xpYyBHQykuCisgICAgICAgICAgICB0aHJlYWRzID0gdGhyZWFkaW5nLl9lbnVtZXJhdGUoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjIElmIGVudW1lcmF0aW5nIHRoZSBjdXJyZW50IHRocmVhZHMgZmFpbHMsIGFzIGl0IHNlZW1zIHRvIGRvCisgICAgICAgICAgICAjIGR1cmluZyBzaHV0ZG93biwgd2UnbGwgc2tpcCBjbGVhbnVwIHVuZGVyIHRoZSBhc3N1bXB0aW9uCisgICAgICAgICAgICAjIHRoYXQgdGhlcmUgaXMgbm90aGluZyB0byBjbGVhbiB1cC4KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciB0aHJlYWQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX2RpY3RfXyA9IHRocmVhZC5fX2RpY3RfXworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgVGhyZWFkIGlzIGR5aW5nLCByZXN0IGluIHBlYWNlLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGtleSBpbiBfX2RpY3RfXzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRlbCBfX2RpY3RfX1trZXldCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzICMgZGlkbid0IGhhdmUgYW55dGhpbmcgaW4gdGhpcyB0aHJlYWQKKworZnJvbSB0aHJlYWRpbmcgaW1wb3J0IGN1cnJlbnRfdGhyZWFkLCBSTG9jawpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fdGhyZWFkaW5nX2xvY2FsLnB5YyBiL2xpYi9weXRob24yLjcvX3RocmVhZGluZ19sb2NhbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZGI3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3RocmVhZGluZ19sb2NhbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fdGhyZWFkaW5nX2xvY2FsLnB5byBiL2xpYi9weXRob24yLjcvX3RocmVhZGluZ19sb2NhbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjZGI3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3RocmVhZGluZ19sb2NhbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9fd2Vha3JlZnNldC5weSBiL2xpYi9weXRob24yLjcvX3dlYWtyZWZzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmOWE2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvX3dlYWtyZWZzZXQucHkKQEAgLTAsMCArMSwxOTYgQEAKKyMgQWNjZXNzIFdlYWtTZXQgdGhyb3VnaCB0aGUgd2Vha3JlZiBtb2R1bGUuCisjIFRoaXMgY29kZSBpcyBzZXBhcmF0ZWQtb3V0IGJlY2F1c2UgaXQgaXMgbmVlZGVkCisjIGJ5IGFiYy5weSB0byBsb2FkIGV2ZXJ5dGhpbmcgZWxzZSBhdCBzdGFydHVwLgorCitmcm9tIF93ZWFrcmVmIGltcG9ydCByZWYKKworX19hbGxfXyA9IFsnV2Vha1NldCddCisKKworY2xhc3MgX0l0ZXJhdGlvbkd1YXJkKG9iamVjdCk6CisgICAgIyBUaGlzIGNvbnRleHQgbWFuYWdlciByZWdpc3RlcnMgaXRzZWxmIGluIHRoZSBjdXJyZW50IGl0ZXJhdG9ycyBvZiB0aGUKKyAgICAjIHdlYWsgY29udGFpbmVyLCBzdWNoIGFzIHRvIGRlbGF5IGFsbCByZW1vdmFscyB1bnRpbCB0aGUgY29udGV4dCBtYW5hZ2VyCisgICAgIyBleGl0cy4KKyAgICAjIFRoaXMgdGVjaG5pcXVlIHNob3VsZCBiZSByZWxhdGl2ZWx5IHRocmVhZC1zYWZlIChzaW5jZSBzZXRzIGFyZSkuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2Vha2NvbnRhaW5lcik6CisgICAgICAgICMgRG9uJ3QgY3JlYXRlIGN5Y2xlcworICAgICAgICBzZWxmLndlYWtjb250YWluZXIgPSByZWYod2Vha2NvbnRhaW5lcikKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHcgPSBzZWxmLndlYWtjb250YWluZXIoKQorICAgICAgICBpZiB3IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdy5faXRlcmF0aW5nLmFkZChzZWxmKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGUsIHQsIGIpOgorICAgICAgICB3ID0gc2VsZi53ZWFrY29udGFpbmVyKCkKKyAgICAgICAgaWYgdyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHMgPSB3Ll9pdGVyYXRpbmcKKyAgICAgICAgICAgIHMucmVtb3ZlKHNlbGYpCisgICAgICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgICAgICB3Ll9jb21taXRfcmVtb3ZhbHMoKQorCisKK2NsYXNzIFdlYWtTZXQob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lKToKKyAgICAgICAgc2VsZi5kYXRhID0gc2V0KCkKKyAgICAgICAgZGVmIF9yZW1vdmUoaXRlbSwgc2VsZnJlZj1yZWYoc2VsZikpOgorICAgICAgICAgICAgc2VsZiA9IHNlbGZyZWYoKQorICAgICAgICAgICAgaWYgc2VsZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9pdGVyYXRpbmc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHMuYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmRpc2NhcmQoaXRlbSkKKyAgICAgICAgc2VsZi5fcmVtb3ZlID0gX3JlbW92ZQorICAgICAgICAjIEEgbGlzdCBvZiBrZXlzIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgc2VsZi5fcGVuZGluZ19yZW1vdmFscyA9IFtdCisgICAgICAgIHNlbGYuX2l0ZXJhdGluZyA9IHNldCgpCisgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShkYXRhKQorCisgICAgZGVmIF9jb21taXRfcmVtb3ZhbHMoc2VsZik6CisgICAgICAgIGwgPSBzZWxmLl9wZW5kaW5nX3JlbW92YWxzCisgICAgICAgIGRpc2NhcmQgPSBzZWxmLmRhdGEuZGlzY2FyZAorICAgICAgICB3aGlsZSBsOgorICAgICAgICAgICAgZGlzY2FyZChsLnBvcCgpKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICB3aXRoIF9JdGVyYXRpb25HdWFyZChzZWxmKToKKyAgICAgICAgICAgIGZvciBpdGVtcmVmIGluIHNlbGYuZGF0YToKKyAgICAgICAgICAgICAgICBpdGVtID0gaXRlbXJlZigpCisgICAgICAgICAgICAgICAgaWYgaXRlbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kYXRhKSAtIGxlbihzZWxmLl9wZW5kaW5nX3JlbW92YWxzKQorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3IgPSByZWYoaXRlbSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gd3IgaW4gc2VsZi5kYXRhCisKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGxpc3Qoc2VsZiksKSwKKyAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYsICdfX2RpY3RfXycsIE5vbmUpKQorCisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgYWRkKHNlbGYsIGl0ZW0pOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKKyAgICAgICAgc2VsZi5kYXRhLmFkZChyZWYoaXRlbSwgc2VsZi5fcmVtb3ZlKSkKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCisgICAgICAgIHNlbGYuZGF0YS5jbGVhcigpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYpCisKKyAgICBkZWYgcG9wKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpdGVtcmVmID0gc2VsZi5kYXRhLnBvcCgpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ3BvcCBmcm9tIGVtcHR5IFdlYWtTZXQnKQorICAgICAgICAgICAgaXRlbSA9IGl0ZW1yZWYoKQorICAgICAgICAgICAgaWYgaXRlbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBpdGVtKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCisgICAgICAgIHNlbGYuZGF0YS5yZW1vdmUocmVmKGl0ZW0pKQorCisgICAgZGVmIGRpc2NhcmQoc2VsZiwgaXRlbSk6CisgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CisgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQorICAgICAgICBzZWxmLmRhdGEuZGlzY2FyZChyZWYoaXRlbSkpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19yZW1vdmFsczoKKyAgICAgICAgICAgIHNlbGYuX2NvbW1pdF9yZW1vdmFscygpCisgICAgICAgIGZvciBlbGVtZW50IGluIG90aGVyOgorICAgICAgICAgICAgc2VsZi5hZGQoZWxlbWVudCkKKworICAgIGRlZiBfX2lvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi51cGRhdGUob3RoZXIpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgZGlmZmVyZW5jZShzZWxmLCBvdGhlcik6CisgICAgICAgIG5ld3NldCA9IHNlbGYuY29weSgpCisgICAgICAgIG5ld3NldC5kaWZmZXJlbmNlX3VwZGF0ZShvdGhlcikKKyAgICAgICAgcmV0dXJuIG5ld3NldAorICAgIF9fc3ViX18gPSBkaWZmZXJlbmNlCisKKyAgICBkZWYgZGlmZmVyZW5jZV91cGRhdGUoc2VsZiwgb3RoZXIpOgorICAgICAgICBzZWxmLl9faXN1Yl9fKG90aGVyKQorICAgIGRlZiBfX2lzdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYuX3BlbmRpbmdfcmVtb3ZhbHM6CisgICAgICAgICAgICBzZWxmLl9jb21taXRfcmVtb3ZhbHMoKQorICAgICAgICBpZiBzZWxmIGlzIG90aGVyOgorICAgICAgICAgICAgc2VsZi5kYXRhLmNsZWFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGF0YS5kaWZmZXJlbmNlX3VwZGF0ZShyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgaW50ZXJzZWN0aW9uKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGl0ZW0gZm9yIGl0ZW0gaW4gb3RoZXIgaWYgaXRlbSBpbiBzZWxmKQorICAgIF9fYW5kX18gPSBpbnRlcnNlY3Rpb24KKworICAgIGRlZiBpbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi5fX2lhbmRfXyhvdGhlcikKKyAgICBkZWYgX19pYW5kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKKyAgICAgICAgc2VsZi5kYXRhLmludGVyc2VjdGlvbl91cGRhdGUocmVmKGl0ZW0pIGZvciBpdGVtIGluIG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGlzc3Vic2V0KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pc3N1YnNldChyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCisgICAgX19sZV9fID0gaXNzdWJzZXQKKworICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhIDwgc2V0KHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKKworICAgIGRlZiBpc3N1cGVyc2V0KHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pc3N1cGVyc2V0KHJlZihpdGVtKSBmb3IgaXRlbSBpbiBvdGhlcikKKyAgICBfX2dlX18gPSBpc3N1cGVyc2V0CisKKyAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YSA+IHNldChyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5kYXRhID09IHNldChyZWYoaXRlbSkgZm9yIGl0ZW0gaW4gb3RoZXIpCisKKyAgICBkZWYgc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZiwgb3RoZXIpOgorICAgICAgICBuZXdzZXQgPSBzZWxmLmNvcHkoKQorICAgICAgICBuZXdzZXQuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKG90aGVyKQorICAgICAgICByZXR1cm4gbmV3c2V0CisgICAgX194b3JfXyA9IHN5bW1ldHJpY19kaWZmZXJlbmNlCisKKyAgICBkZWYgc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi5fX2l4b3JfXyhvdGhlcikKKyAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBzZWxmLl9wZW5kaW5nX3JlbW92YWxzOgorICAgICAgICAgICAgc2VsZi5fY29tbWl0X3JlbW92YWxzKCkKKyAgICAgICAgaWYgc2VsZiBpcyBvdGhlcjoKKyAgICAgICAgICAgIHNlbGYuZGF0YS5jbGVhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRhdGEuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHJlZihpdGVtLCBzZWxmLl9yZW1vdmUpIGZvciBpdGVtIGluIG90aGVyKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHVuaW9uKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGUgZm9yIHMgaW4gKHNlbGYsIG90aGVyKSBmb3IgZSBpbiBzKQorICAgIF9fb3JfXyA9IHVuaW9uCisKKyAgICBkZWYgaXNkaXNqb2ludChzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5pbnRlcnNlY3Rpb24ob3RoZXIpKSA9PSAwCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5YyBiL2xpYi9weXRob24yLjcvX3dlYWtyZWZzZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYmJiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5byBiL2xpYi9weXRob24yLjcvX3dlYWtyZWZzZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYmJiYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L193ZWFrcmVmc2V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FiYy5weSBiL2xpYi9weXRob24yLjcvYWJjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZTQ4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FiYy5weQpAQCAtMCwwICsxLDE4NSBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpIGFjY29yZGluZyB0byBQRVAgMzExOS4iIiIKKworaW1wb3J0IHR5cGVzCisKK2Zyb20gX3dlYWtyZWZzZXQgaW1wb3J0IFdlYWtTZXQKKworIyBJbnN0YW5jZSBvZiBvbGQtc3R5bGUgY2xhc3MKK2NsYXNzIF9DOiBwYXNzCitfSW5zdGFuY2VUeXBlID0gdHlwZShfQygpKQorCisKK2RlZiBhYnN0cmFjdG1ldGhvZChmdW5jb2JqKToKKyAgICAiIiJBIGRlY29yYXRvciBpbmRpY2F0aW5nIGFic3RyYWN0IG1ldGhvZHMuCisKKyAgICBSZXF1aXJlcyB0aGF0IHRoZSBtZXRhY2xhc3MgaXMgQUJDTWV0YSBvciBkZXJpdmVkIGZyb20gaXQuICBBCisgICAgY2xhc3MgdGhhdCBoYXMgYSBtZXRhY2xhc3MgZGVyaXZlZCBmcm9tIEFCQ01ldGEgY2Fubm90IGJlCisgICAgaW5zdGFudGlhdGVkIHVubGVzcyBhbGwgb2YgaXRzIGFic3RyYWN0IG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4uCisgICAgVGhlIGFic3RyYWN0IG1ldGhvZHMgY2FuIGJlIGNhbGxlZCB1c2luZyBhbnkgb2YgdGhlIG5vcm1hbAorICAgICdzdXBlcicgY2FsbCBtZWNoYW5pc21zLgorCisgICAgVXNhZ2U6CisKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBBQkNNZXRhCisgICAgICAgICAgICBAYWJzdHJhY3RtZXRob2QKKyAgICAgICAgICAgIGRlZiBteV9hYnN0cmFjdF9tZXRob2Qoc2VsZiwgLi4uKToKKyAgICAgICAgICAgICAgICAuLi4KKyAgICAiIiIKKyAgICBmdW5jb2JqLl9faXNhYnN0cmFjdG1ldGhvZF9fID0gVHJ1ZQorICAgIHJldHVybiBmdW5jb2JqCisKKworY2xhc3MgYWJzdHJhY3Rwcm9wZXJ0eShwcm9wZXJ0eSk6CisgICAgIiIiQSBkZWNvcmF0b3IgaW5kaWNhdGluZyBhYnN0cmFjdCBwcm9wZXJ0aWVzLgorCisgICAgUmVxdWlyZXMgdGhhdCB0aGUgbWV0YWNsYXNzIGlzIEFCQ01ldGEgb3IgZGVyaXZlZCBmcm9tIGl0LiAgQQorICAgIGNsYXNzIHRoYXQgaGFzIGEgbWV0YWNsYXNzIGRlcml2ZWQgZnJvbSBBQkNNZXRhIGNhbm5vdCBiZQorICAgIGluc3RhbnRpYXRlZCB1bmxlc3MgYWxsIG9mIGl0cyBhYnN0cmFjdCBwcm9wZXJ0aWVzIGFyZSBvdmVycmlkZGVuLgorICAgIFRoZSBhYnN0cmFjdCBwcm9wZXJ0aWVzIGNhbiBiZSBjYWxsZWQgdXNpbmcgYW55IG9mIHRoZSBub3JtYWwKKyAgICAnc3VwZXInIGNhbGwgbWVjaGFuaXNtcy4KKworICAgIFVzYWdlOgorCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorICAgICAgICAgICAgQGFic3RyYWN0cHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBteV9hYnN0cmFjdF9wcm9wZXJ0eShzZWxmKToKKyAgICAgICAgICAgICAgICAuLi4KKworICAgIFRoaXMgZGVmaW5lcyBhIHJlYWQtb25seSBwcm9wZXJ0eTsgeW91IGNhbiBhbHNvIGRlZmluZSBhIHJlYWQtd3JpdGUKKyAgICBhYnN0cmFjdCBwcm9wZXJ0eSB1c2luZyB0aGUgJ2xvbmcnIGZvcm0gb2YgcHJvcGVydHkgZGVjbGFyYXRpb246CisKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBBQkNNZXRhCisgICAgICAgICAgICBkZWYgZ2V0eChzZWxmKTogLi4uCisgICAgICAgICAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6IC4uLgorICAgICAgICAgICAgeCA9IGFic3RyYWN0cHJvcGVydHkoZ2V0eCwgc2V0eCkKKyAgICAiIiIKKyAgICBfX2lzYWJzdHJhY3RtZXRob2RfXyA9IFRydWUKKworCitjbGFzcyBBQkNNZXRhKHR5cGUpOgorCisgICAgIiIiTWV0YWNsYXNzIGZvciBkZWZpbmluZyBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpLgorCisgICAgVXNlIHRoaXMgbWV0YWNsYXNzIHRvIGNyZWF0ZSBhbiBBQkMuICBBbiBBQkMgY2FuIGJlIHN1YmNsYXNzZWQKKyAgICBkaXJlY3RseSwgYW5kIHRoZW4gYWN0cyBhcyBhIG1peC1pbiBjbGFzcy4gIFlvdSBjYW4gYWxzbyByZWdpc3RlcgorICAgIHVucmVsYXRlZCBjb25jcmV0ZSBjbGFzc2VzIChldmVuIGJ1aWx0LWluIGNsYXNzZXMpIGFuZCB1bnJlbGF0ZWQKKyAgICBBQkNzIGFzICd2aXJ0dWFsIHN1YmNsYXNzZXMnIC0tIHRoZXNlIGFuZCB0aGVpciBkZXNjZW5kYW50cyB3aWxsCisgICAgYmUgY29uc2lkZXJlZCBzdWJjbGFzc2VzIG9mIHRoZSByZWdpc3RlcmluZyBBQkMgYnkgdGhlIGJ1aWx0LWluCisgICAgaXNzdWJjbGFzcygpIGZ1bmN0aW9uLCBidXQgdGhlIHJlZ2lzdGVyaW5nIEFCQyB3b24ndCBzaG93IHVwIGluCisgICAgdGhlaXIgTVJPIChNZXRob2QgUmVzb2x1dGlvbiBPcmRlcikgbm9yIHdpbGwgbWV0aG9kCisgICAgaW1wbGVtZW50YXRpb25zIGRlZmluZWQgYnkgdGhlIHJlZ2lzdGVyaW5nIEFCQyBiZSBjYWxsYWJsZSAobm90CisgICAgZXZlbiB2aWEgc3VwZXIoKSkuCisKKyAgICAiIiIKKworICAgICMgQSBnbG9iYWwgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIGNsYXNzIGlzCisgICAgIyByZWdpc3RlcmVkIGFzIGEgdmlydHVhbCBzdWJjbGFzcyBvZiBhbnl0aGluZy4gIEl0IGZvcmNlcyB0aGUKKyAgICAjIG5lZ2F0aXZlIGNhY2hlIHRvIGJlIGNsZWFyZWQgYmVmb3JlIGl0cyBuZXh0IHVzZS4KKyAgICBfYWJjX2ludmFsaWRhdGlvbl9jb3VudGVyID0gMAorCisgICAgZGVmIF9fbmV3X18obWNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSk6CisgICAgICAgIGNscyA9IHN1cGVyKEFCQ01ldGEsIG1jbHMpLl9fbmV3X18obWNscywgbmFtZSwgYmFzZXMsIG5hbWVzcGFjZSkKKyAgICAgICAgIyBDb21wdXRlIHNldCBvZiBhYnN0cmFjdCBtZXRob2QgbmFtZXMKKyAgICAgICAgYWJzdHJhY3RzID0gc2V0KG5hbWUKKyAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBuYW1lc3BhY2UuaXRlbXMoKQorICAgICAgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cih2YWx1ZSwgIl9faXNhYnN0cmFjdG1ldGhvZF9fIiwgRmFsc2UpKQorICAgICAgICBmb3IgYmFzZSBpbiBiYXNlczoKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGdldGF0dHIoYmFzZSwgIl9fYWJzdHJhY3RtZXRob2RzX18iLCBzZXQoKSk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKGNscywgbmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHZhbHVlLCAiX19pc2Fic3RyYWN0bWV0aG9kX18iLCBGYWxzZSk6CisgICAgICAgICAgICAgICAgICAgIGFic3RyYWN0cy5hZGQobmFtZSkKKyAgICAgICAgY2xzLl9fYWJzdHJhY3RtZXRob2RzX18gPSBmcm96ZW5zZXQoYWJzdHJhY3RzKQorICAgICAgICAjIFNldCB1cCBpbmhlcml0YW5jZSByZWdpc3RyeQorICAgICAgICBjbHMuX2FiY19yZWdpc3RyeSA9IFdlYWtTZXQoKQorICAgICAgICBjbHMuX2FiY19jYWNoZSA9IFdlYWtTZXQoKQorICAgICAgICBjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZSA9IFdlYWtTZXQoKQorICAgICAgICBjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZV92ZXJzaW9uID0gQUJDTWV0YS5fYWJjX2ludmFsaWRhdGlvbl9jb3VudGVyCisgICAgICAgIHJldHVybiBjbHMKKworICAgIGRlZiByZWdpc3RlcihjbHMsIHN1YmNsYXNzKToKKyAgICAgICAgIiIiUmVnaXN0ZXIgYSB2aXJ0dWFsIHN1YmNsYXNzIG9mIGFuIEFCQy4iIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc3ViY2xhc3MsICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2FuIG9ubHkgcmVnaXN0ZXIgY2xhc3NlcyIpCisgICAgICAgIGlmIGlzc3ViY2xhc3Moc3ViY2xhc3MsIGNscyk6CisgICAgICAgICAgICByZXR1cm4gICMgQWxyZWFkeSBhIHN1YmNsYXNzCisgICAgICAgICMgU3VidGxlOiB0ZXN0IGZvciBjeWNsZXMgKmFmdGVyKiB0ZXN0aW5nIGZvciAiYWxyZWFkeSBhIHN1YmNsYXNzIjsKKyAgICAgICAgIyB0aGlzIG1lYW5zIHdlIGFsbG93IFgucmVnaXN0ZXIoWCkgYW5kIGludGVycHJldCBpdCBhcyBhIG5vLW9wLgorICAgICAgICBpZiBpc3N1YmNsYXNzKGNscywgc3ViY2xhc3MpOgorICAgICAgICAgICAgIyBUaGlzIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlLCB3aGljaCBpcyBiYWQgZm9yIHRoZSBhbGdvcml0aG0gYmVsb3cKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUmVmdXNpbmcgdG8gY3JlYXRlIGFuIGluaGVyaXRhbmNlIGN5Y2xlIikKKyAgICAgICAgY2xzLl9hYmNfcmVnaXN0cnkuYWRkKHN1YmNsYXNzKQorICAgICAgICBBQkNNZXRhLl9hYmNfaW52YWxpZGF0aW9uX2NvdW50ZXIgKz0gMSAgIyBJbnZhbGlkYXRlIG5lZ2F0aXZlIGNhY2hlCisKKyAgICBkZWYgX2R1bXBfcmVnaXN0cnkoY2xzLCBmaWxlPU5vbmUpOgorICAgICAgICAiIiJEZWJ1ZyBoZWxwZXIgdG8gcHJpbnQgdGhlIEFCQyByZWdpc3RyeS4iIiIKKyAgICAgICAgcHJpbnQgPj4gZmlsZSwgIkNsYXNzOiAlcy4lcyIgJSAoY2xzLl9fbW9kdWxlX18sIGNscy5fX25hbWVfXykKKyAgICAgICAgcHJpbnQgPj4gZmlsZSwgIkludi5jb3VudGVyOiAlcyIgJSBBQkNNZXRhLl9hYmNfaW52YWxpZGF0aW9uX2NvdW50ZXIKKyAgICAgICAgZm9yIG5hbWUgaW4gc29ydGVkKGNscy5fX2RpY3RfXy5rZXlzKCkpOgorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJfYWJjXyIpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihjbHMsIG5hbWUpCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gZmlsZSwgIiVzOiAlciIgJSAobmFtZSwgdmFsdWUpCisKKyAgICBkZWYgX19pbnN0YW5jZWNoZWNrX18oY2xzLCBpbnN0YW5jZSk6CisgICAgICAgICIiIk92ZXJyaWRlIGZvciBpc2luc3RhbmNlKGluc3RhbmNlLCBjbHMpLiIiIgorICAgICAgICAjIElubGluZSB0aGUgY2FjaGUgY2hlY2tpbmcgd2hlbiBpdCdzIHNpbXBsZS4KKyAgICAgICAgc3ViY2xhc3MgPSBnZXRhdHRyKGluc3RhbmNlLCAnX19jbGFzc19fJywgTm9uZSkKKyAgICAgICAgaWYgc3ViY2xhc3MgaXMgbm90IE5vbmUgYW5kIHN1YmNsYXNzIGluIGNscy5fYWJjX2NhY2hlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgc3VidHlwZSA9IHR5cGUoaW5zdGFuY2UpCisgICAgICAgICMgT2xkLXN0eWxlIGluc3RhbmNlcworICAgICAgICBpZiBzdWJ0eXBlIGlzIF9JbnN0YW5jZVR5cGU6CisgICAgICAgICAgICBzdWJ0eXBlID0gc3ViY2xhc3MKKyAgICAgICAgaWYgc3VidHlwZSBpcyBzdWJjbGFzcyBvciBzdWJjbGFzcyBpcyBOb25lOgorICAgICAgICAgICAgaWYgKGNscy5fYWJjX25lZ2F0aXZlX2NhY2hlX3ZlcnNpb24gPT0KKyAgICAgICAgICAgICAgICBBQkNNZXRhLl9hYmNfaW52YWxpZGF0aW9uX2NvdW50ZXIgYW5kCisgICAgICAgICAgICAgICAgc3VidHlwZSBpbiBjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICAjIEZhbGwgYmFjayB0byB0aGUgc3ViY2xhc3MgY2hlY2suCisgICAgICAgICAgICByZXR1cm4gY2xzLl9fc3ViY2xhc3NjaGVja19fKHN1YnR5cGUpCisgICAgICAgIHJldHVybiAoY2xzLl9fc3ViY2xhc3NjaGVja19fKHN1YmNsYXNzKSBvcgorICAgICAgICAgICAgICAgIGNscy5fX3N1YmNsYXNzY2hlY2tfXyhzdWJ0eXBlKSkKKworICAgIGRlZiBfX3N1YmNsYXNzY2hlY2tfXyhjbHMsIHN1YmNsYXNzKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgZm9yIGlzc3ViY2xhc3Moc3ViY2xhc3MsIGNscykuIiIiCisgICAgICAgICMgQ2hlY2sgY2FjaGUKKyAgICAgICAgaWYgc3ViY2xhc3MgaW4gY2xzLl9hYmNfY2FjaGU6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAjIENoZWNrIG5lZ2F0aXZlIGNhY2hlOyBtYXkgaGF2ZSB0byBpbnZhbGlkYXRlCisgICAgICAgIGlmIGNscy5fYWJjX25lZ2F0aXZlX2NhY2hlX3ZlcnNpb24gPCBBQkNNZXRhLl9hYmNfaW52YWxpZGF0aW9uX2NvdW50ZXI6CisgICAgICAgICAgICAjIEludmFsaWRhdGUgdGhlIG5lZ2F0aXZlIGNhY2hlCisgICAgICAgICAgICBjbHMuX2FiY19uZWdhdGl2ZV9jYWNoZSA9IFdlYWtTZXQoKQorICAgICAgICAgICAgY2xzLl9hYmNfbmVnYXRpdmVfY2FjaGVfdmVyc2lvbiA9IEFCQ01ldGEuX2FiY19pbnZhbGlkYXRpb25fY291bnRlcgorICAgICAgICBlbGlmIHN1YmNsYXNzIGluIGNscy5fYWJjX25lZ2F0aXZlX2NhY2hlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICMgQ2hlY2sgdGhlIHN1YmNsYXNzIGhvb2sKKyAgICAgICAgb2sgPSBjbHMuX19zdWJjbGFzc2hvb2tfXyhzdWJjbGFzcykKKyAgICAgICAgaWYgb2sgaXMgbm90IE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob2ssIGJvb2wpCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBjbHMuX2FiY19jYWNoZS5hZGQoc3ViY2xhc3MpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNscy5fYWJjX25lZ2F0aXZlX2NhY2hlLmFkZChzdWJjbGFzcykKKyAgICAgICAgICAgIHJldHVybiBvaworICAgICAgICAjIENoZWNrIGlmIGl0J3MgYSBkaXJlY3Qgc3ViY2xhc3MKKyAgICAgICAgaWYgY2xzIGluIGdldGF0dHIoc3ViY2xhc3MsICdfX21yb19fJywgKCkpOgorICAgICAgICAgICAgY2xzLl9hYmNfY2FjaGUuYWRkKHN1YmNsYXNzKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBDaGVjayBpZiBpdCdzIGEgc3ViY2xhc3Mgb2YgYSByZWdpc3RlcmVkIGNsYXNzIChyZWN1cnNpdmUpCisgICAgICAgIGZvciByY2xzIGluIGNscy5fYWJjX3JlZ2lzdHJ5OgorICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhzdWJjbGFzcywgcmNscyk6CisgICAgICAgICAgICAgICAgY2xzLl9hYmNfY2FjaGUuYWRkKHN1YmNsYXNzKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICMgQ2hlY2sgaWYgaXQncyBhIHN1YmNsYXNzIG9mIGEgc3ViY2xhc3MgKHJlY3Vyc2l2ZSkKKyAgICAgICAgZm9yIHNjbHMgaW4gY2xzLl9fc3ViY2xhc3Nlc19fKCk6CisgICAgICAgICAgICBpZiBpc3N1YmNsYXNzKHN1YmNsYXNzLCBzY2xzKToKKyAgICAgICAgICAgICAgICBjbHMuX2FiY19jYWNoZS5hZGQoc3ViY2xhc3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgIyBObyBkaWNlOyB1cGRhdGUgbmVnYXRpdmUgY2FjaGUKKyAgICAgICAgY2xzLl9hYmNfbmVnYXRpdmVfY2FjaGUuYWRkKHN1YmNsYXNzKQorICAgICAgICByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYWJjLnB5YyBiL2xpYi9weXRob24yLjcvYWJjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2RhZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hYmMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYWJjLnB5byBiL2xpYi9weXRob24yLjcvYWJjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTQ3YTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hYmMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYWlmYy5weSBiL2xpYi9weXRob24yLjcvYWlmYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNmZTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9haWZjLnB5CkBAIC0wLDAgKzEsOTc1IEBACisiIiJTdHVmZiB0byBwYXJzZSBBSUZGLUMgYW5kIEFJRkYgZmlsZXMuCisKK1VubGVzcyBleHBsaWNpdGx5IHN0YXRlZCBvdGhlcndpc2UsIHRoZSBkZXNjcmlwdGlvbiBiZWxvdyBpcyB0cnVlCitib3RoIGZvciBBSUZGLUMgZmlsZXMgYW5kIEFJRkYgZmlsZXMuCisKK0FuIEFJRkYtQyBmaWxlIGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZS4KKworICArLS0tLS0tLS0tLS0tLS0tLS0rCisgIHwgRk9STSAgICAgICAgICAgIHwKKyAgKy0tLS0tLS0tLS0tLS0tLS0tKworICB8IDxzaXplPiAgICAgICAgICB8CisgICstLS0tKy0tLS0tLS0tLS0tLSsKKyAgfCAgICB8IEFJRkMgICAgICAgfAorICB8ICAgICstLS0tLS0tLS0tLS0rCisgIHwgICAgfCA8Y2h1bmtzPiAgIHwKKyAgfCAgICB8ICAgIC4gICAgICAgfAorICB8ICAgIHwgICAgLiAgICAgICB8CisgIHwgICAgfCAgICAuICAgICAgIHwKKyAgKy0tLS0rLS0tLS0tLS0tLS0tKworCitBbiBBSUZGIGZpbGUgaGFzIHRoZSBzdHJpbmcgIkFJRkYiIGluc3RlYWQgb2YgIkFJRkMiLgorCitBIGNodW5rIGNvbnNpc3RzIG9mIGFuIGlkZW50aWZpZXIgKDQgYnl0ZXMpIGZvbGxvd2VkIGJ5IGEgc2l6ZSAoNCBieXRlcywKK2JpZyBlbmRpYW4gb3JkZXIpLCBmb2xsb3dlZCBieSB0aGUgZGF0YS4gIFRoZSBzaXplIGZpZWxkIGRvZXMgbm90IGluY2x1ZGUKK3RoZSBzaXplIG9mIHRoZSA4IGJ5dGUgaGVhZGVyLgorCitUaGUgZm9sbG93aW5nIGNodW5rIHR5cGVzIGFyZSByZWNvZ25pemVkLgorCisgIEZWRVIKKyAgICAgIDx2ZXJzaW9uIG51bWJlciBvZiBBSUZGLUMgZGVmaW5pbmcgZG9jdW1lbnQ+IChBSUZGLUMgb25seSkuCisgIE1BUksKKyAgICAgIDwjIG9mIG1hcmtlcnM+ICgyIGJ5dGVzKQorICAgICAgbGlzdCBvZiBtYXJrZXJzOgorICAgICAgICAgIDxtYXJrZXIgSUQ+ICgyIGJ5dGVzLCBtdXN0IGJlID4gMCkKKyAgICAgICAgICA8cG9zaXRpb24+ICg0IGJ5dGVzKQorICAgICAgICAgIDxtYXJrZXIgbmFtZT4gKCJwc3RyaW5nIikKKyAgQ09NTQorICAgICAgPCMgb2YgY2hhbm5lbHM+ICgyIGJ5dGVzKQorICAgICAgPCMgb2Ygc291bmQgZnJhbWVzPiAoNCBieXRlcykKKyAgICAgIDxzaXplIG9mIHRoZSBzYW1wbGVzPiAoMiBieXRlcykKKyAgICAgIDxzYW1wbGluZyBmcmVxdWVuY3k+ICgxMCBieXRlcywgSUVFRSA4MC1iaXQgZXh0ZW5kZWQKKyAgICAgICAgICBmbG9hdGluZyBwb2ludCkKKyAgICAgIGluIEFJRkYtQyBmaWxlcyBvbmx5OgorICAgICAgPGNvbXByZXNzaW9uIHR5cGU+ICg0IGJ5dGVzKQorICAgICAgPGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgY29tcHJlc3Npb24gdHlwZT4gKCJwc3RyaW5nIikKKyAgU1NORAorICAgICAgPG9mZnNldD4gKDQgYnl0ZXMsIG5vdCB1c2VkIGJ5IHRoaXMgcHJvZ3JhbSkKKyAgICAgIDxibG9ja3NpemU+ICg0IGJ5dGVzLCBub3QgdXNlZCBieSB0aGlzIHByb2dyYW0pCisgICAgICA8c291bmQgZGF0YT4KKworQSBwc3RyaW5nIGNvbnNpc3RzIG9mIDEgYnl0ZSBsZW5ndGgsIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMsIGFuZCAwIG9yIDEKK2J5dGUgcGFkIHRvIG1ha2UgdGhlIHRvdGFsIGxlbmd0aCBldmVuLgorCitVc2FnZS4KKworUmVhZGluZyBBSUZGIGZpbGVzOgorICBmID0gYWlmYy5vcGVuKGZpbGUsICdyJykKK3doZXJlIGZpbGUgaXMgZWl0aGVyIHRoZSBuYW1lIG9mIGEgZmlsZSBvciBhbiBvcGVuIGZpbGUgcG9pbnRlci4KK1RoZSBvcGVuIGZpbGUgcG9pbnRlciBtdXN0IGhhdmUgbWV0aG9kcyByZWFkKCksIHNlZWsoKSwgYW5kIGNsb3NlKCkuCitJbiBzb21lIHR5cGVzIG9mIGF1ZGlvIGZpbGVzLCBpZiB0aGUgc2V0cG9zKCkgbWV0aG9kIGlzIG5vdCB1c2VkLAordGhlIHNlZWsoKSBtZXRob2QgaXMgbm90IG5lY2Vzc2FyeS4KKworVGhpcyByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgd2l0aCB0aGUgZm9sbG93aW5nIHB1YmxpYyBtZXRob2RzOgorICBnZXRuY2hhbm5lbHMoKSAgLS0gcmV0dXJucyBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgKDEgZm9yCisgICAgICAgICAgICAgbW9ubywgMiBmb3Igc3RlcmVvKQorICBnZXRzYW1wd2lkdGgoKSAgLS0gcmV0dXJucyBzYW1wbGUgd2lkdGggaW4gYnl0ZXMKKyAgZ2V0ZnJhbWVyYXRlKCkgIC0tIHJldHVybnMgc2FtcGxpbmcgZnJlcXVlbmN5CisgIGdldG5mcmFtZXMoKSAgICAtLSByZXR1cm5zIG51bWJlciBvZiBhdWRpbyBmcmFtZXMKKyAgZ2V0Y29tcHR5cGUoKSAgIC0tIHJldHVybnMgY29tcHJlc3Npb24gdHlwZSAoJ05PTkUnIGZvciBBSUZGIGZpbGVzKQorICBnZXRjb21wbmFtZSgpICAgLS0gcmV0dXJucyBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mCisgICAgICAgICAgICAgY29tcHJlc3Npb24gdHlwZSAoJ25vdCBjb21wcmVzc2VkJyBmb3IgQUlGRiBmaWxlcykKKyAgZ2V0cGFyYW1zKCkgLS0gcmV0dXJucyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgYWxsIG9mIHRoZQorICAgICAgICAgICAgIGFib3ZlIGluIHRoZSBhYm92ZSBvcmRlcgorICBnZXRtYXJrZXJzKCkgICAgLS0gZ2V0IHRoZSBsaXN0IG9mIG1hcmtzIGluIHRoZSBhdWRpbyBmaWxlIG9yIE5vbmUKKyAgICAgICAgICAgICBpZiB0aGVyZSBhcmUgbm8gbWFya3MKKyAgZ2V0bWFyayhpZCkgLS0gZ2V0IG1hcmsgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIChyYWlzZXMgYW4gZXJyb3IKKyAgICAgICAgICAgICBpZiB0aGUgbWFyayBkb2VzIG5vdCBleGlzdCkKKyAgcmVhZGZyYW1lcyhuKSAgIC0tIHJldHVybnMgYXQgbW9zdCBuIGZyYW1lcyBvZiBhdWRpbworICByZXdpbmQoKSAgICAtLSByZXdpbmQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXVkaW8gc3RyZWFtCisgIHNldHBvcyhwb3MpIC0tIHNlZWsgdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbgorICB0ZWxsKCkgICAgICAtLSByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAgY2xvc2UoKSAgICAgLS0gY2xvc2UgdGhlIGluc3RhbmNlIChtYWtlIGl0IHVudXNhYmxlKQorVGhlIHBvc2l0aW9uIHJldHVybmVkIGJ5IHRlbGwoKSwgdGhlIHBvc2l0aW9uIGdpdmVuIHRvIHNldHBvcygpIGFuZAordGhlIHBvc2l0aW9uIG9mIG1hcmtzIGFyZSBhbGwgY29tcGF0aWJsZSBhbmQgaGF2ZSBub3RoaW5nIHRvIGRvIHdpdGgKK3RoZSBhY3R1YWwgcG9zaXRpb24gaW4gdGhlIGZpbGUuCitUaGUgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2xhc3MgaW5zdGFuY2UKK2lzIGRlc3Ryb3llZC4KKworV3JpdGluZyBBSUZGIGZpbGVzOgorICBmID0gYWlmYy5vcGVuKGZpbGUsICd3JykKK3doZXJlIGZpbGUgaXMgZWl0aGVyIHRoZSBuYW1lIG9mIGEgZmlsZSBvciBhbiBvcGVuIGZpbGUgcG9pbnRlci4KK1RoZSBvcGVuIGZpbGUgcG9pbnRlciBtdXN0IGhhdmUgbWV0aG9kcyB3cml0ZSgpLCB0ZWxsKCksIHNlZWsoKSwgYW5kCitjbG9zZSgpLgorCitUaGlzIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aXRoIHRoZSBmb2xsb3dpbmcgcHVibGljIG1ldGhvZHM6CisgIGFpZmYoKSAgICAgIC0tIGNyZWF0ZSBhbiBBSUZGIGZpbGUgKEFJRkYtQyBkZWZhdWx0KQorICBhaWZjKCkgICAgICAtLSBjcmVhdGUgYW4gQUlGRi1DIGZpbGUKKyAgc2V0bmNoYW5uZWxzKG4pIC0tIHNldCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgIHNldHNhbXB3aWR0aChuKSAtLSBzZXQgdGhlIHNhbXBsZSB3aWR0aAorICBzZXRmcmFtZXJhdGUobikgLS0gc2V0IHRoZSBmcmFtZSByYXRlCisgIHNldG5mcmFtZXMobikgICAtLSBzZXQgdGhlIG51bWJlciBvZiBmcmFtZXMKKyAgc2V0Y29tcHR5cGUodHlwZSwgbmFtZSkKKyAgICAgICAgICAtLSBzZXQgdGhlIGNvbXByZXNzaW9uIHR5cGUgYW5kIHRoZQorICAgICAgICAgICAgIGh1bWFuLXJlYWRhYmxlIGNvbXByZXNzaW9uIHR5cGUKKyAgc2V0cGFyYW1zKHR1cGxlKQorICAgICAgICAgIC0tIHNldCBhbGwgcGFyYW1ldGVycyBhdCBvbmNlCisgIHNldG1hcmsoaWQsIHBvcywgbmFtZSkKKyAgICAgICAgICAtLSBhZGQgc3BlY2lmaWVkIG1hcmsgdG8gdGhlIGxpc3Qgb2YgbWFya3MKKyAgdGVsbCgpICAgICAgLS0gcmV0dXJuIGN1cnJlbnQgcG9zaXRpb24gaW4gb3V0cHV0IGZpbGUgKHVzZWZ1bAorICAgICAgICAgICAgIGluIGNvbWJpbmF0aW9uIHdpdGggc2V0bWFyaygpKQorICB3cml0ZWZyYW1lc3JhdyhkYXRhKQorICAgICAgICAgIC0tIHdyaXRlIGF1ZGlvIGZyYW1lcyB3aXRob3V0IHBhdGhpbmcgdXAgdGhlCisgICAgICAgICAgICAgZmlsZSBoZWFkZXIKKyAgd3JpdGVmcmFtZXMoZGF0YSkKKyAgICAgICAgICAtLSB3cml0ZSBhdWRpbyBmcmFtZXMgYW5kIHBhdGNoIHVwIHRoZSBmaWxlIGhlYWRlcgorICBjbG9zZSgpICAgICAtLSBwYXRjaCB1cCB0aGUgZmlsZSBoZWFkZXIgYW5kIGNsb3NlIHRoZQorICAgICAgICAgICAgIG91dHB1dCBmaWxlCitZb3Ugc2hvdWxkIHNldCB0aGUgcGFyYW1ldGVycyBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlZnJhbWVzcmF3IG9yCit3cml0ZWZyYW1lcy4gIFRoZSB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGRvZXMgbm90IG5lZWQgdG8gYmUgc2V0LAorYnV0IHdoZW4gaXQgaXMgc2V0IHRvIHRoZSBjb3JyZWN0IHZhbHVlLCB0aGUgaGVhZGVyIGRvZXMgbm90IGhhdmUgdG8KK2JlIHBhdGNoZWQgdXAuCitJdCBpcyBiZXN0IHRvIGZpcnN0IHNldCBhbGwgcGFyYW1ldGVycywgcGVyaGFwcyBwb3NzaWJseSB0aGUKK2NvbXByZXNzaW9uIHR5cGUsIGFuZCB0aGVuIHdyaXRlIGF1ZGlvIGZyYW1lcyB1c2luZyB3cml0ZWZyYW1lc3Jhdy4KK1doZW4gYWxsIGZyYW1lcyBoYXZlIGJlZW4gd3JpdHRlbiwgZWl0aGVyIGNhbGwgd3JpdGVmcmFtZXMoJycpIG9yCitjbG9zZSgpIHRvIHBhdGNoIHVwIHRoZSBzaXplcyBpbiB0aGUgaGVhZGVyLgorTWFya3MgY2FuIGJlIGFkZGVkIGFueXRpbWUuICBJZiB0aGVyZSBhcmUgYW55IG1hcmtzLCB5cHUgbXVzdCBjYWxsCitjbG9zZSgpIGFmdGVyIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHdyaXR0ZW4uCitUaGUgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2xhc3MgaW5zdGFuY2UKK2lzIGRlc3Ryb3llZC4KKworV2hlbiBhIGZpbGUgaXMgb3BlbmVkIHdpdGggdGhlIGV4dGVuc2lvbiAnLmFpZmYnLCBhbiBBSUZGIGZpbGUgaXMKK3dyaXR0ZW4sIG90aGVyd2lzZSBhbiBBSUZGLUMgZmlsZSBpcyB3cml0dGVuLiAgVGhpcyBkZWZhdWx0IGNhbiBiZQorY2hhbmdlZCBieSBjYWxsaW5nIGFpZmYoKSBvciBhaWZjKCkgYmVmb3JlIHRoZSBmaXJzdCB3cml0ZWZyYW1lcyBvcgord3JpdGVmcmFtZXNyYXcuCisiIiIKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IF9fYnVpbHRpbl9fCisKK19fYWxsX18gPSBbIkVycm9yIiwib3BlbiIsIm9wZW5mcCJdCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitfQUlGQ192ZXJzaW9uID0gMHhBMjgwNTE0MEwgICAgICMgVmVyc2lvbiAxIG9mIEFJRkYtQworCitkZWYgX3JlYWRfbG9uZyhmaWxlKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc+bCcsIGZpbGUucmVhZCg0KSlbMF0KKyAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICByYWlzZSBFT0ZFcnJvcgorCitkZWYgX3JlYWRfdWxvbmcoZmlsZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPkwnLCBmaWxlLnJlYWQoNCkpWzBdCisgICAgZXhjZXB0IHN0cnVjdC5lcnJvcjoKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKworZGVmIF9yZWFkX3Nob3J0KGZpbGUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJz5oJywgZmlsZS5yZWFkKDIpKVswXQorICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgICAgIHJhaXNlIEVPRkVycm9yCisKK2RlZiBfcmVhZF91c2hvcnQoZmlsZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPkgnLCBmaWxlLnJlYWQoMikpWzBdCisgICAgZXhjZXB0IHN0cnVjdC5lcnJvcjoKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKworZGVmIF9yZWFkX3N0cmluZyhmaWxlKToKKyAgICBsZW5ndGggPSBvcmQoZmlsZS5yZWFkKDEpKQorICAgIGlmIGxlbmd0aCA9PSAwOgorICAgICAgICBkYXRhID0gJycKKyAgICBlbHNlOgorICAgICAgICBkYXRhID0gZmlsZS5yZWFkKGxlbmd0aCkKKyAgICBpZiBsZW5ndGggJiAxID09IDA6CisgICAgICAgIGR1bW15ID0gZmlsZS5yZWFkKDEpCisgICAgcmV0dXJuIGRhdGEKKworX0hVR0VfVkFMID0gMS43OTc2OTMxMzQ4NjIzMWUrMzA4ICMgU2VlIDxsaW1pdHMuaD4KKworZGVmIF9yZWFkX2Zsb2F0KGYpOiAjIDEwIGJ5dGVzCisgICAgZXhwb24gPSBfcmVhZF9zaG9ydChmKSAjIDIgYnl0ZXMKKyAgICBzaWduID0gMQorICAgIGlmIGV4cG9uIDwgMDoKKyAgICAgICAgc2lnbiA9IC0xCisgICAgICAgIGV4cG9uID0gZXhwb24gKyAweDgwMDAKKyAgICBoaW1hbnQgPSBfcmVhZF91bG9uZyhmKSAjIDQgYnl0ZXMKKyAgICBsb21hbnQgPSBfcmVhZF91bG9uZyhmKSAjIDQgYnl0ZXMKKyAgICBpZiBleHBvbiA9PSBoaW1hbnQgPT0gbG9tYW50ID09IDA6CisgICAgICAgIGYgPSAwLjAKKyAgICBlbGlmIGV4cG9uID09IDB4N0ZGRjoKKyAgICAgICAgZiA9IF9IVUdFX1ZBTAorICAgIGVsc2U6CisgICAgICAgIGV4cG9uID0gZXhwb24gLSAxNjM4MworICAgICAgICBmID0gKGhpbWFudCAqIDB4MTAwMDAwMDAwTCArIGxvbWFudCkgKiBwb3coMi4wLCBleHBvbiAtIDYzKQorICAgIHJldHVybiBzaWduICogZgorCitkZWYgX3dyaXRlX3Nob3J0KGYsIHgpOgorICAgIGYud3JpdGUoc3RydWN0LnBhY2soJz5oJywgeCkpCisKK2RlZiBfd3JpdGVfdXNob3J0KGYsIHgpOgorICAgIGYud3JpdGUoc3RydWN0LnBhY2soJz5IJywgeCkpCisKK2RlZiBfd3JpdGVfbG9uZyhmLCB4KToKKyAgICBmLndyaXRlKHN0cnVjdC5wYWNrKCc+bCcsIHgpKQorCitkZWYgX3dyaXRlX3Vsb25nKGYsIHgpOgorICAgIGYud3JpdGUoc3RydWN0LnBhY2soJz5MJywgeCkpCisKK2RlZiBfd3JpdGVfc3RyaW5nKGYsIHMpOgorICAgIGlmIGxlbihzKSA+IDI1NToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RyaW5nIGV4Y2VlZHMgbWF4aW11bSBwc3RyaW5nIGxlbmd0aCIpCisgICAgZi53cml0ZShzdHJ1Y3QucGFjaygnQicsIGxlbihzKSkpCisgICAgZi53cml0ZShzKQorICAgIGlmIGxlbihzKSAmIDEgPT0gMDoKKyAgICAgICAgZi53cml0ZShjaHIoMCkpCisKK2RlZiBfd3JpdGVfZmxvYXQoZiwgeCk6CisgICAgaW1wb3J0IG1hdGgKKyAgICBpZiB4IDwgMDoKKyAgICAgICAgc2lnbiA9IDB4ODAwMAorICAgICAgICB4ID0geCAqIC0xCisgICAgZWxzZToKKyAgICAgICAgc2lnbiA9IDAKKyAgICBpZiB4ID09IDA6CisgICAgICAgIGV4cG9uID0gMAorICAgICAgICBoaW1hbnQgPSAwCisgICAgICAgIGxvbWFudCA9IDAKKyAgICBlbHNlOgorICAgICAgICBmbWFudCwgZXhwb24gPSBtYXRoLmZyZXhwKHgpCisgICAgICAgIGlmIGV4cG9uID4gMTYzODQgb3IgZm1hbnQgPj0gMSBvciBmbWFudCAhPSBmbWFudDogIyBJbmZpbml0eSBvciBOYU4KKyAgICAgICAgICAgIGV4cG9uID0gc2lnbnwweDdGRkYKKyAgICAgICAgICAgIGhpbWFudCA9IDAKKyAgICAgICAgICAgIGxvbWFudCA9IDAKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgIyBGaW5pdGUKKyAgICAgICAgICAgIGV4cG9uID0gZXhwb24gKyAxNjM4MgorICAgICAgICAgICAgaWYgZXhwb24gPCAwOiAgICAgICAgICAgIyBkZW5vcm1hbGl6ZWQKKyAgICAgICAgICAgICAgICBmbWFudCA9IG1hdGgubGRleHAoZm1hbnQsIGV4cG9uKQorICAgICAgICAgICAgICAgIGV4cG9uID0gMAorICAgICAgICAgICAgZXhwb24gPSBleHBvbiB8IHNpZ24KKyAgICAgICAgICAgIGZtYW50ID0gbWF0aC5sZGV4cChmbWFudCwgMzIpCisgICAgICAgICAgICBmc21hbnQgPSBtYXRoLmZsb29yKGZtYW50KQorICAgICAgICAgICAgaGltYW50ID0gbG9uZyhmc21hbnQpCisgICAgICAgICAgICBmbWFudCA9IG1hdGgubGRleHAoZm1hbnQgLSBmc21hbnQsIDMyKQorICAgICAgICAgICAgZnNtYW50ID0gbWF0aC5mbG9vcihmbWFudCkKKyAgICAgICAgICAgIGxvbWFudCA9IGxvbmcoZnNtYW50KQorICAgIF93cml0ZV91c2hvcnQoZiwgZXhwb24pCisgICAgX3dyaXRlX3Vsb25nKGYsIGhpbWFudCkKKyAgICBfd3JpdGVfdWxvbmcoZiwgbG9tYW50KQorCitmcm9tIGNodW5rIGltcG9ydCBDaHVuaworCitjbGFzcyBBaWZjX3JlYWQ6CisgICAgIyBWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgorICAgICMKKyAgICAjIFRoZXNlIHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIHRob3VnaCBhcHByb3ByaWF0ZQorICAgICMgbWV0aG9kcyBvZiB0aGlzIGNsYXNzOgorICAgICMgX2ZpbGUgLS0gdGhlIG9wZW4gZmlsZSB3aXRoIG1ldGhvZHMgcmVhZCgpLCBjbG9zZSgpLCBhbmQgc2VlaygpCisgICAgIyAgICAgICBzZXQgdGhyb3VnaCB0aGUgX19pbml0X18oKSBtZXRob2QKKyAgICAjIF9uY2hhbm5lbHMgLS0gdGhlIG51bWJlciBvZiBhdWRpbyBjaGFubmVscworICAgICMgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldG5jaGFubmVscygpIG1ldGhvZAorICAgICMgX25mcmFtZXMgLS0gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMKKyAgICAjICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRuZnJhbWVzKCkgbWV0aG9kCisgICAgIyBfc2FtcHdpZHRoIC0tIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGF1ZGlvIHNhbXBsZQorICAgICMgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldHNhbXB3aWR0aCgpIG1ldGhvZAorICAgICMgX2ZyYW1lcmF0ZSAtLSB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgIyAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0ZnJhbWVyYXRlKCkgbWV0aG9kCisgICAgIyBfY29tcHR5cGUgLS0gdGhlIEFJRkYtQyBjb21wcmVzc2lvbiB0eXBlICgnTk9ORScgaWYgQUlGRikKKyAgICAjICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRjb21wdHlwZSgpIG1ldGhvZAorICAgICMgX2NvbXBuYW1lIC0tIHRoZSBodW1hbi1yZWFkYWJsZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZQorICAgICMgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldGNvbXB0eXBlKCkgbWV0aG9kCisgICAgIyBfbWFya2VycyAtLSB0aGUgbWFya3MgaW4gdGhlIGF1ZGlvIGZpbGUKKyAgICAjICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRtYXJrZXJzKCkgYW5kIGdldG1hcmsoKQorICAgICMgICAgICAgbWV0aG9kcworICAgICMgX3NvdW5kcG9zIC0tIHRoZSBwb3NpdGlvbiBpbiB0aGUgYXVkaW8gc3RyZWFtCisgICAgIyAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgdGVsbCgpIG1ldGhvZCwgc2V0IHRocm91Z2ggdGhlCisgICAgIyAgICAgICBzZXRwb3MoKSBtZXRob2QKKyAgICAjCisgICAgIyBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBvbmx5OgorICAgICMgX3ZlcnNpb24gLS0gdGhlIEFJRkYtQyB2ZXJzaW9uIG51bWJlcgorICAgICMgX2RlY29tcCAtLSB0aGUgZGVjb21wcmVzc29yIGZyb20gYnVpbHRpbiBtb2R1bGUgY2wKKyAgICAjIF9jb21tX2NodW5rX3JlYWQgLS0gMSBpZmYgdGhlIENPTU0gY2h1bmsgaGFzIGJlZW4gcmVhZAorICAgICMgX2FpZmMgLS0gMSBpZmYgcmVhZGluZyBhbiBBSUZGLUMgZmlsZQorICAgICMgX3NzbmRfc2Vla19uZWVkZWQgLS0gMSBpZmYgcG9zaXRpb25lZCBjb3JyZWN0bHkgaW4gYXVkaW8KKyAgICAjICAgICAgIGZpbGUgZm9yIHJlYWRmcmFtZXMoKQorICAgICMgX3NzbmRfY2h1bmsgLS0gaW5zdGFudGlhdGlvbiBvZiBhIGNodW5rIGNsYXNzIGZvciB0aGUgU1NORCBjaHVuaworICAgICMgX2ZyYW1lc2l6ZSAtLSBzaXplIG9mIG9uZSBmcmFtZSBpbiB0aGUgZmlsZQorCisgICAgZGVmIGluaXRmcChzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5fdmVyc2lvbiA9IDAKKyAgICAgICAgc2VsZi5fZGVjb21wID0gTm9uZQorICAgICAgICBzZWxmLl9jb252ZXJ0ID0gTm9uZQorICAgICAgICBzZWxmLl9tYXJrZXJzID0gW10KKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSAwCisgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCisgICAgICAgIGNodW5rID0gQ2h1bmsoZmlsZSkKKyAgICAgICAgaWYgY2h1bmsuZ2V0bmFtZSgpICE9ICdGT1JNJzoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnZmlsZSBkb2VzIG5vdCBzdGFydCB3aXRoIEZPUk0gaWQnCisgICAgICAgIGZvcm1kYXRhID0gY2h1bmsucmVhZCg0KQorICAgICAgICBpZiBmb3JtZGF0YSA9PSAnQUlGRic6CisgICAgICAgICAgICBzZWxmLl9haWZjID0gMAorICAgICAgICBlbGlmIGZvcm1kYXRhID09ICdBSUZDJzoKKyAgICAgICAgICAgIHNlbGYuX2FpZmMgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ25vdCBhbiBBSUZGIG9yIEFJRkYtQyBmaWxlJworICAgICAgICBzZWxmLl9jb21tX2NodW5rX3JlYWQgPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzZWxmLl9zc25kX3NlZWtfbmVlZGVkID0gMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNodW5rID0gQ2h1bmsoc2VsZi5fZmlsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2h1bmtuYW1lID0gY2h1bmsuZ2V0bmFtZSgpCisgICAgICAgICAgICBpZiBjaHVua25hbWUgPT0gJ0NPTU0nOgorICAgICAgICAgICAgICAgIHNlbGYuX3JlYWRfY29tbV9jaHVuayhjaHVuaykKKyAgICAgICAgICAgICAgICBzZWxmLl9jb21tX2NodW5rX3JlYWQgPSAxCisgICAgICAgICAgICBlbGlmIGNodW5rbmFtZSA9PSAnU1NORCc6CisgICAgICAgICAgICAgICAgc2VsZi5fc3NuZF9jaHVuayA9IGNodW5rCisgICAgICAgICAgICAgICAgZHVtbXkgPSBjaHVuay5yZWFkKDgpCisgICAgICAgICAgICAgICAgc2VsZi5fc3NuZF9zZWVrX25lZWRlZCA9IDAKKyAgICAgICAgICAgIGVsaWYgY2h1bmtuYW1lID09ICdGVkVSJzoKKyAgICAgICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gX3JlYWRfdWxvbmcoY2h1bmspCisgICAgICAgICAgICBlbGlmIGNodW5rbmFtZSA9PSAnTUFSSyc6CisgICAgICAgICAgICAgICAgc2VsZi5fcmVhZG1hcmsoY2h1bmspCisgICAgICAgICAgICBjaHVuay5za2lwKCkKKyAgICAgICAgaWYgbm90IHNlbGYuX2NvbW1fY2h1bmtfcmVhZCBvciBub3Qgc2VsZi5fc3NuZF9jaHVuazoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnQ09NTSBjaHVuayBhbmQvb3IgU1NORCBjaHVuayBtaXNzaW5nJworICAgICAgICBpZiBzZWxmLl9haWZjIGFuZCBzZWxmLl9kZWNvbXA6CisgICAgICAgICAgICBpbXBvcnQgY2wKKyAgICAgICAgICAgIHBhcmFtcyA9IFtjbC5PUklHSU5BTF9GT1JNQVQsIDAsCisgICAgICAgICAgICAgICAgICBjbC5CSVRTX1BFUl9DT01QT05FTlQsIHNlbGYuX3NhbXB3aWR0aCAqIDgsCisgICAgICAgICAgICAgICAgICBjbC5GUkFNRV9SQVRFLCBzZWxmLl9mcmFtZXJhdGVdCisgICAgICAgICAgICBpZiBzZWxmLl9uY2hhbm5lbHMgPT0gMToKKyAgICAgICAgICAgICAgICBwYXJhbXNbMV0gPSBjbC5NT05PCisgICAgICAgICAgICBlbGlmIHNlbGYuX25jaGFubmVscyA9PSAyOgorICAgICAgICAgICAgICAgIHBhcmFtc1sxXSA9IGNsLlNURVJFT19JTlRFUkxFQVZFRAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjb21wcmVzcyBtb3JlIHRoYW4gMiBjaGFubmVscycKKyAgICAgICAgICAgIHNlbGYuX2RlY29tcC5TZXRQYXJhbXMocGFyYW1zKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYpOgorICAgICAgICBpZiB0eXBlKGYpID09IHR5cGUoJycpOgorICAgICAgICAgICAgZiA9IF9fYnVpbHRpbl9fLm9wZW4oZiwgJ3JiJykKKyAgICAgICAgIyBlbHNlLCBhc3N1bWUgaXQgaXMgYW4gb3BlbiBmaWxlIG9iamVjdCBhbHJlYWR5CisgICAgICAgIHNlbGYuaW5pdGZwKGYpCisKKyAgICAjCisgICAgIyBVc2VyIHZpc2libGUgbWV0aG9kcy4KKyAgICAjCisgICAgZGVmIGdldGZwKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZQorCisgICAgZGVmIHJld2luZChzZWxmKToKKyAgICAgICAgc2VsZi5fc3NuZF9zZWVrX25lZWRlZCA9IDEKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSAwCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2RlY29tcDoKKyAgICAgICAgICAgIHNlbGYuX2RlY29tcC5DbG9zZURlY29tcHJlc3NvcigpCisgICAgICAgICAgICBzZWxmLl9kZWNvbXAgPSBOb25lCisgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zb3VuZHBvcworCisgICAgZGVmIGdldG5jaGFubmVscyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25jaGFubmVscworCisgICAgZGVmIGdldG5mcmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uZnJhbWVzCisKKyAgICBkZWYgZ2V0c2FtcHdpZHRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc2FtcHdpZHRoCisKKyAgICBkZWYgZ2V0ZnJhbWVyYXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZnJhbWVyYXRlCisKKyAgICBkZWYgZ2V0Y29tcHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb21wdHlwZQorCisgICAgZGVmIGdldGNvbXBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29tcG5hbWUKKworIyMgIGRlZiBnZXR2ZXJzaW9uKHNlbGYpOgorIyMgICAgICByZXR1cm4gc2VsZi5fdmVyc2lvbgorCisgICAgZGVmIGdldHBhcmFtcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0bmNoYW5uZWxzKCksIHNlbGYuZ2V0c2FtcHdpZHRoKCksIFwKKyAgICAgICAgICAgICAgc2VsZi5nZXRmcmFtZXJhdGUoKSwgc2VsZi5nZXRuZnJhbWVzKCksIFwKKyAgICAgICAgICAgICAgc2VsZi5nZXRjb21wdHlwZSgpLCBzZWxmLmdldGNvbXBuYW1lKCkKKworICAgIGRlZiBnZXRtYXJrZXJzKHNlbGYpOgorICAgICAgICBpZiBsZW4oc2VsZi5fbWFya2VycykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9tYXJrZXJzCisKKyAgICBkZWYgZ2V0bWFyayhzZWxmLCBpZCk6CisgICAgICAgIGZvciBtYXJrZXIgaW4gc2VsZi5fbWFya2VyczoKKyAgICAgICAgICAgIGlmIGlkID09IG1hcmtlclswXToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFya2VyCisgICAgICAgIHJhaXNlIEVycm9yLCAnbWFya2VyICVyIGRvZXMgbm90IGV4aXN0JyAlIChpZCwpCisKKyAgICBkZWYgc2V0cG9zKHNlbGYsIHBvcyk6CisgICAgICAgIGlmIHBvcyA8IDAgb3IgcG9zID4gc2VsZi5fbmZyYW1lczoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAncG9zaXRpb24gbm90IGluIHJhbmdlJworICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IHBvcworICAgICAgICBzZWxmLl9zc25kX3NlZWtfbmVlZGVkID0gMQorCisgICAgZGVmIHJlYWRmcmFtZXMoc2VsZiwgbmZyYW1lcyk6CisgICAgICAgIGlmIHNlbGYuX3NzbmRfc2Vla19uZWVkZWQ6CisgICAgICAgICAgICBzZWxmLl9zc25kX2NodW5rLnNlZWsoMCkKKyAgICAgICAgICAgIGR1bW15ID0gc2VsZi5fc3NuZF9jaHVuay5yZWFkKDgpCisgICAgICAgICAgICBwb3MgPSBzZWxmLl9zb3VuZHBvcyAqIHNlbGYuX2ZyYW1lc2l6ZQorICAgICAgICAgICAgaWYgcG9zOgorICAgICAgICAgICAgICAgIHNlbGYuX3NzbmRfY2h1bmsuc2Vlayhwb3MgKyA4KQorICAgICAgICAgICAgc2VsZi5fc3NuZF9zZWVrX25lZWRlZCA9IDAKKyAgICAgICAgaWYgbmZyYW1lcyA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGRhdGEgPSBzZWxmLl9zc25kX2NodW5rLnJlYWQobmZyYW1lcyAqIHNlbGYuX2ZyYW1lc2l6ZSkKKyAgICAgICAgaWYgc2VsZi5fY29udmVydCBhbmQgZGF0YToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb252ZXJ0KGRhdGEpCisgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gc2VsZi5fc291bmRwb3MgKyBsZW4oZGF0YSkgLy8gKHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aCkKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgICMKKyAgICAjIEludGVybmFsIG1ldGhvZHMuCisgICAgIworCisgICAgZGVmIF9kZWNvbXBfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgaW1wb3J0IGNsCisgICAgICAgIGR1bW15ID0gc2VsZi5fZGVjb21wLlNldFBhcmFtKGNsLkZSQU1FX0JVRkZFUl9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oZGF0YSkgKiAyKQorICAgICAgICByZXR1cm4gc2VsZi5fZGVjb21wLkRlY29tcHJlc3MobGVuKGRhdGEpIC8vIHNlbGYuX25jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEpCisKKyAgICBkZWYgX3VsYXcybGluKHNlbGYsIGRhdGEpOgorICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICByZXR1cm4gYXVkaW9vcC51bGF3MmxpbihkYXRhLCAyKQorCisgICAgZGVmIF9hZHBjbTJsaW4oc2VsZiwgZGF0YSk6CisgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdfYWRwY21zdGF0ZScpOgorICAgICAgICAgICAgIyBmaXJzdCB0aW1lCisgICAgICAgICAgICBzZWxmLl9hZHBjbXN0YXRlID0gTm9uZQorICAgICAgICBkYXRhLCBzZWxmLl9hZHBjbXN0YXRlID0gYXVkaW9vcC5hZHBjbTJsaW4oZGF0YSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9hZHBjbXN0YXRlKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIF9yZWFkX2NvbW1fY2h1bmsoc2VsZiwgY2h1bmspOgorICAgICAgICBzZWxmLl9uY2hhbm5lbHMgPSBfcmVhZF9zaG9ydChjaHVuaykKKyAgICAgICAgc2VsZi5fbmZyYW1lcyA9IF9yZWFkX2xvbmcoY2h1bmspCisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IChfcmVhZF9zaG9ydChjaHVuaykgKyA3KSAvLyA4CisgICAgICAgIHNlbGYuX2ZyYW1lcmF0ZSA9IGludChfcmVhZF9mbG9hdChjaHVuaykpCisgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aAorICAgICAgICBpZiBzZWxmLl9haWZjOgorICAgICAgICAgICAgI0RFQlVHOiBTR0kncyBzb3VuZGVkaXRvciBwcm9kdWNlcyBhIGJhZCBzaXplIDotKAorICAgICAgICAgICAga2x1ZGdlID0gMAorICAgICAgICAgICAgaWYgY2h1bmsuY2h1bmtzaXplID09IDE4OgorICAgICAgICAgICAgICAgIGtsdWRnZSA9IDEKKyAgICAgICAgICAgICAgICBwcmludCAnV2FybmluZzogYmFkIENPTU0gY2h1bmsgc2l6ZScKKyAgICAgICAgICAgICAgICBjaHVuay5jaHVua3NpemUgPSAyMworICAgICAgICAgICAgI0RFQlVHIGVuZAorICAgICAgICAgICAgc2VsZi5fY29tcHR5cGUgPSBjaHVuay5yZWFkKDQpCisgICAgICAgICAgICAjREVCVUcgc3RhcnQKKyAgICAgICAgICAgIGlmIGtsdWRnZToKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBvcmQoY2h1bmsuZmlsZS5yZWFkKDEpKQorICAgICAgICAgICAgICAgIGlmIGxlbmd0aCAmIDEgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICsgMQorICAgICAgICAgICAgICAgIGNodW5rLmNodW5rc2l6ZSA9IGNodW5rLmNodW5rc2l6ZSArIGxlbmd0aAorICAgICAgICAgICAgICAgIGNodW5rLmZpbGUuc2VlaygtMSwgMSkKKyAgICAgICAgICAgICNERUJVRyBlbmQKKyAgICAgICAgICAgIHNlbGYuX2NvbXBuYW1lID0gX3JlYWRfc3RyaW5nKGNodW5rKQorICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgIT0gJ05PTkUnOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdHNzIyJzoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGF1ZGlvb3AKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29udmVydCA9IHNlbGYuX2FkcGNtMmxpbgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fZnJhbWVzaXplIC8vIDQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICMgZm9yIFVMQVcgYW5kIEFMQVcgdHJ5IENvbXByZXNzaW9uIExpYnJhcnkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBjbAorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ1VMQVcnOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29udmVydCA9IHNlbGYuX3VsYXcybGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fZnJhbWVzaXplIC8vIDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IHJlYWQgY29tcHJlc3NlZCBBSUZGLUMgZmlsZXMnCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ1VMQVcnOgorICAgICAgICAgICAgICAgICAgICBzY2hlbWUgPSBjbC5HNzExX1VMQVcKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fZnJhbWVzaXplIC8vIDIKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX2NvbXB0eXBlID09ICdBTEFXJzoKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1lID0gY2wuRzcxMV9BTEFXCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX2ZyYW1lc2l6ZSAvLyAyCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlJworICAgICAgICAgICAgICAgIHNlbGYuX2RlY29tcCA9IGNsLk9wZW5EZWNvbXByZXNzb3Ioc2NoZW1lKQorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl9kZWNvbXBfZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY29tcHR5cGUgPSAnTk9ORScKKyAgICAgICAgICAgIHNlbGYuX2NvbXBuYW1lID0gJ25vdCBjb21wcmVzc2VkJworCisgICAgZGVmIF9yZWFkbWFyayhzZWxmLCBjaHVuayk6CisgICAgICAgIG5tYXJrZXJzID0gX3JlYWRfc2hvcnQoY2h1bmspCisgICAgICAgICMgU29tZSBmaWxlcyBhcHBlYXIgdG8gY29udGFpbiBpbnZhbGlkIGNvdW50cy4KKyAgICAgICAgIyBDb3BlIHdpdGggdGhpcyBieSB0ZXN0aW5nIGZvciBFT0YuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5tYXJrZXJzKToKKyAgICAgICAgICAgICAgICBpZCA9IF9yZWFkX3Nob3J0KGNodW5rKQorICAgICAgICAgICAgICAgIHBvcyA9IF9yZWFkX2xvbmcoY2h1bmspCisgICAgICAgICAgICAgICAgbmFtZSA9IF9yZWFkX3N0cmluZyhjaHVuaykKKyAgICAgICAgICAgICAgICBpZiBwb3Mgb3IgbmFtZToKKyAgICAgICAgICAgICAgICAgICAgIyBzb21lIGZpbGVzIGFwcGVhciB0byBoYXZlCisgICAgICAgICAgICAgICAgICAgICMgZHVtbXkgbWFya2VycyBjb25zaXN0aW5nIG9mCisgICAgICAgICAgICAgICAgICAgICMgYSBwb3NpdGlvbiAwIGFuZCBuYW1lICcnCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX21hcmtlcnMuYXBwZW5kKChpZCwgcG9zLCBuYW1lKSkKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgcHJpbnQgJ1dhcm5pbmc6IE1BUksgY2h1bmsgY29udGFpbnMgb25seScsCisgICAgICAgICAgICBwcmludCBsZW4oc2VsZi5fbWFya2VycyksCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5fbWFya2VycykgPT0gMTogcHJpbnQgJ21hcmtlcicsCisgICAgICAgICAgICBlbHNlOiBwcmludCAnbWFya2VycycsCisgICAgICAgICAgICBwcmludCAnaW5zdGVhZCBvZicsIG5tYXJrZXJzCisKK2NsYXNzIEFpZmNfd3JpdGU6CisgICAgIyBWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgorICAgICMKKyAgICAjIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlciBzZXR0YWJsZSB0aHJvdWdoIGFwcHJvcHJpYXRlIG1ldGhvZHMKKyAgICAjIG9mIHRoaXMgY2xhc3M6CisgICAgIyBfZmlsZSAtLSB0aGUgb3BlbiBmaWxlIHdpdGggbWV0aG9kcyB3cml0ZSgpLCBjbG9zZSgpLCB0ZWxsKCksIHNlZWsoKQorICAgICMgICAgICAgc2V0IHRocm91Z2ggdGhlIF9faW5pdF9fKCkgbWV0aG9kCisgICAgIyBfY29tcHR5cGUgLS0gdGhlIEFJRkYtQyBjb21wcmVzc2lvbiB0eXBlICgnTk9ORScgaW4gQUlGRikKKyAgICAjICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRjb21wdHlwZSgpIG9yIHNldHBhcmFtcygpIG1ldGhvZAorICAgICMgX2NvbXBuYW1lIC0tIHRoZSBodW1hbi1yZWFkYWJsZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZQorICAgICMgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldGNvbXB0eXBlKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgIyBfbmNoYW5uZWxzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKKyAgICAjICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRuY2hhbm5lbHMoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICAjIF9zYW1wd2lkdGggLS0gdGhlIG51bWJlciBvZiBieXRlcyBwZXIgYXVkaW8gc2FtcGxlCisgICAgIyAgICAgICBzZXQgdGhyb3VnaCB0aGUgc2V0c2FtcHdpZHRoKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgIyBfZnJhbWVyYXRlIC0tIHRoZSBzYW1wbGluZyBmcmVxdWVuY3kKKyAgICAjICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRmcmFtZXJhdGUoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICAjIF9uZnJhbWVzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gdG8gdGhlIGhlYWRlcgorICAgICMgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldG5mcmFtZXMoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICAjIF9haWZjIC0tIHdoZXRoZXIgd2UncmUgd3JpdGluZyBhbiBBSUZGLUMgZmlsZSBvciBhbiBBSUZGIGZpbGUKKyAgICAjICAgICAgIHNldCB0aHJvdWdoIHRoZSBhaWZjKCkgbWV0aG9kLCByZXNldCB0aHJvdWdoIHRoZQorICAgICMgICAgICAgYWlmZigpIG1ldGhvZAorICAgICMKKyAgICAjIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCBpbnRlcm5hbGx5IG9ubHk6CisgICAgIyBfdmVyc2lvbiAtLSB0aGUgQUlGRi1DIHZlcnNpb24gbnVtYmVyCisgICAgIyBfY29tcCAtLSB0aGUgY29tcHJlc3NvciBmcm9tIGJ1aWx0aW4gbW9kdWxlIGNsCisgICAgIyBfbmZyYW1lc3dyaXR0ZW4gLS0gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgYWN0dWFsbHkgd3JpdHRlbgorICAgICMgX2RhdGFsZW5ndGggLS0gdGhlIHNpemUgb2YgdGhlIGF1ZGlvIHNhbXBsZXMgd3JpdHRlbiB0byB0aGUgaGVhZGVyCisgICAgIyBfZGF0YXdyaXR0ZW4gLS0gdGhlIHNpemUgb2YgdGhlIGF1ZGlvIHNhbXBsZXMgYWN0dWFsbHkgd3JpdHRlbgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYpOgorICAgICAgICBpZiB0eXBlKGYpID09IHR5cGUoJycpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmCisgICAgICAgICAgICBmID0gX19idWlsdGluX18ub3BlbihmLCAnd2InKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBlbHNlLCBhc3N1bWUgaXQgaXMgYW4gb3BlbiBmaWxlIG9iamVjdCBhbHJlYWR5CisgICAgICAgICAgICBmaWxlbmFtZSA9ICc/Pz8nCisgICAgICAgIHNlbGYuaW5pdGZwKGYpCisgICAgICAgIGlmIGZpbGVuYW1lWy01Ol0gPT0gJy5haWZmJzoKKyAgICAgICAgICAgIHNlbGYuX2FpZmMgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9haWZjID0gMQorCisgICAgZGVmIGluaXRmcChzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5fdmVyc2lvbiA9IF9BSUZDX3ZlcnNpb24KKyAgICAgICAgc2VsZi5fY29tcHR5cGUgPSAnTk9ORScKKyAgICAgICAgc2VsZi5fY29tcG5hbWUgPSAnbm90IGNvbXByZXNzZWQnCisgICAgICAgIHNlbGYuX2NvbXAgPSBOb25lCisgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBOb25lCisgICAgICAgIHNlbGYuX25jaGFubmVscyA9IDAKKyAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gMAorICAgICAgICBzZWxmLl9mcmFtZXJhdGUgPSAwCisgICAgICAgIHNlbGYuX25mcmFtZXMgPSAwCisgICAgICAgIHNlbGYuX25mcmFtZXN3cml0dGVuID0gMAorICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IDAKKyAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IDAKKyAgICAgICAgc2VsZi5fbWFya2VycyA9IFtdCisgICAgICAgIHNlbGYuX21hcmtsZW5ndGggPSAwCisgICAgICAgIHNlbGYuX2FpZmMgPSAxICAgICAgIyBBSUZGLUMgaXMgZGVmYXVsdAorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2ZpbGU6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgICMKKyAgICAjIFVzZXIgdmlzaWJsZSBtZXRob2RzLgorICAgICMKKyAgICBkZWYgYWlmZihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgc2VsZi5fYWlmYyA9IDAKKworICAgIGRlZiBhaWZjKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBzZWxmLl9haWZjID0gMQorCisgICAgZGVmIHNldG5jaGFubmVscyhzZWxmLCBuY2hhbm5lbHMpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBuY2hhbm5lbHMgPCAxOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdiYWQgIyBvZiBjaGFubmVscycKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gbmNoYW5uZWxzCisKKyAgICBkZWYgZ2V0bmNoYW5uZWxzKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fbmNoYW5uZWxzOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdudW1iZXIgb2YgY2hhbm5lbHMgbm90IHNldCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX25jaGFubmVscworCisgICAgZGVmIHNldHNhbXB3aWR0aChzZWxmLCBzYW1wd2lkdGgpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBzYW1wd2lkdGggPCAxIG9yIHNhbXB3aWR0aCA+IDQ6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2JhZCBzYW1wbGUgd2lkdGgnCisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IHNhbXB3aWR0aAorCisgICAgZGVmIGdldHNhbXB3aWR0aChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3NhbXB3aWR0aDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxlIHdpZHRoIG5vdCBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9zYW1wd2lkdGgKKworICAgIGRlZiBzZXRmcmFtZXJhdGUoc2VsZiwgZnJhbWVyYXRlKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgZnJhbWVyYXRlIDw9IDA6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2JhZCBmcmFtZSByYXRlJworICAgICAgICBzZWxmLl9mcmFtZXJhdGUgPSBmcmFtZXJhdGUKKworICAgIGRlZiBnZXRmcmFtZXJhdGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9mcmFtZXJhdGU6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2ZyYW1lIHJhdGUgbm90IHNldCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZyYW1lcmF0ZQorCisgICAgZGVmIHNldG5mcmFtZXMoc2VsZiwgbmZyYW1lcyk6CisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIHNlbGYuX25mcmFtZXMgPSBuZnJhbWVzCisKKyAgICBkZWYgZ2V0bmZyYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25mcmFtZXN3cml0dGVuCisKKyAgICBkZWYgc2V0Y29tcHR5cGUoc2VsZiwgY29tcHR5cGUsIGNvbXBuYW1lKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgY29tcHR5cGUgbm90IGluICgnTk9ORScsICdVTEFXJywgJ0FMQVcnLCAnRzcyMicpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlJworICAgICAgICBzZWxmLl9jb21wdHlwZSA9IGNvbXB0eXBlCisgICAgICAgIHNlbGYuX2NvbXBuYW1lID0gY29tcG5hbWUKKworICAgIGRlZiBnZXRjb21wdHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXB0eXBlCisKKyAgICBkZWYgZ2V0Y29tcG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb21wbmFtZQorCisjIyAgZGVmIHNldHZlcnNpb24oc2VsZiwgdmVyc2lvbik6CisjIyAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgorIyMgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisjIyAgICAgIHNlbGYuX3ZlcnNpb24gPSB2ZXJzaW9uCisKKyAgICBkZWYgc2V0cGFyYW1zKHNlbGYsIGluZm8pOgorICAgICAgICBuY2hhbm5lbHMsIHNhbXB3aWR0aCwgZnJhbWVyYXRlLCBuZnJhbWVzLCBjb21wdHlwZSwgY29tcG5hbWUgPSBpbmZvCisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIGNvbXB0eXBlIG5vdCBpbiAoJ05PTkUnLCAnVUxBVycsICdBTEFXJywgJ0c3MjInKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gdHlwZScKKyAgICAgICAgc2VsZi5zZXRuY2hhbm5lbHMobmNoYW5uZWxzKQorICAgICAgICBzZWxmLnNldHNhbXB3aWR0aChzYW1wd2lkdGgpCisgICAgICAgIHNlbGYuc2V0ZnJhbWVyYXRlKGZyYW1lcmF0ZSkKKyAgICAgICAgc2VsZi5zZXRuZnJhbWVzKG5mcmFtZXMpCisgICAgICAgIHNlbGYuc2V0Y29tcHR5cGUoY29tcHR5cGUsIGNvbXBuYW1lKQorCisgICAgZGVmIGdldHBhcmFtcyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25jaGFubmVscyBvciBub3Qgc2VsZi5fc2FtcHdpZHRoIG9yIG5vdCBzZWxmLl9mcmFtZXJhdGU6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ25vdCBhbGwgcGFyYW1ldGVycyBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMsIHNlbGYuX3NhbXB3aWR0aCwgc2VsZi5fZnJhbWVyYXRlLCBcCisgICAgICAgICAgICAgIHNlbGYuX25mcmFtZXMsIHNlbGYuX2NvbXB0eXBlLCBzZWxmLl9jb21wbmFtZQorCisgICAgZGVmIHNldG1hcmsoc2VsZiwgaWQsIHBvcywgbmFtZSk6CisgICAgICAgIGlmIGlkIDw9IDA6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ21hcmtlciBJRCBtdXN0IGJlID4gMCcKKyAgICAgICAgaWYgcG9zIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbWFya2VyIHBvc2l0aW9uIG11c3QgYmUgPj0gMCcKKyAgICAgICAgaWYgdHlwZShuYW1lKSAhPSB0eXBlKCcnKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbWFya2VyIG5hbWUgbXVzdCBiZSBhIHN0cmluZycKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX21hcmtlcnMpKToKKyAgICAgICAgICAgIGlmIGlkID09IHNlbGYuX21hcmtlcnNbaV1bMF06CisgICAgICAgICAgICAgICAgc2VsZi5fbWFya2Vyc1tpXSA9IGlkLCBwb3MsIG5hbWUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fbWFya2Vycy5hcHBlbmQoKGlkLCBwb3MsIG5hbWUpKQorCisgICAgZGVmIGdldG1hcmsoc2VsZiwgaWQpOgorICAgICAgICBmb3IgbWFya2VyIGluIHNlbGYuX21hcmtlcnM6CisgICAgICAgICAgICBpZiBpZCA9PSBtYXJrZXJbMF06CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcmtlcgorICAgICAgICByYWlzZSBFcnJvciwgJ21hcmtlciAlciBkb2VzIG5vdCBleGlzdCcgJSAoaWQsKQorCisgICAgZGVmIGdldG1hcmtlcnMoc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLl9tYXJrZXJzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX21hcmtlcnMKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmZyYW1lc3dyaXR0ZW4KKworICAgIGRlZiB3cml0ZWZyYW1lc3JhdyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKGxlbihkYXRhKSkKKyAgICAgICAgbmZyYW1lcyA9IGxlbihkYXRhKSAvLyAoc2VsZi5fc2FtcHdpZHRoICogc2VsZi5fbmNoYW5uZWxzKQorICAgICAgICBpZiBzZWxmLl9jb252ZXJ0OgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2NvbnZlcnQoZGF0YSkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZShkYXRhKQorICAgICAgICBzZWxmLl9uZnJhbWVzd3JpdHRlbiA9IHNlbGYuX25mcmFtZXN3cml0dGVuICsgbmZyYW1lcworICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IHNlbGYuX2RhdGF3cml0dGVuICsgbGVuKGRhdGEpCisKKyAgICBkZWYgd3JpdGVmcmFtZXMoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYud3JpdGVmcmFtZXNyYXcoZGF0YSkKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW4gIT0gc2VsZi5fbmZyYW1lcyBvciBcCisgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggIT0gc2VsZi5fZGF0YXdyaXR0ZW46CisgICAgICAgICAgICBzZWxmLl9wYXRjaGhlYWRlcigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9lbnN1cmVfaGVhZGVyX3dyaXR0ZW4oMCkKKyAgICAgICAgICAgIGlmIHNlbGYuX2RhdGF3cml0dGVuICYgMToKKyAgICAgICAgICAgICAgICAjIHF1aWNrIHBhZCB0byBldmVuIHNpemUKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGNocigwKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IHNlbGYuX2RhdGF3cml0dGVuICsgMQorICAgICAgICAgICAgc2VsZi5fd3JpdGVtYXJrZXJzKCkKKyAgICAgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuICE9IHNlbGYuX25mcmFtZXMgb3IgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCAhPSBzZWxmLl9kYXRhd3JpdHRlbiBvciBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9tYXJrbGVuZ3RoOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXA6CisgICAgICAgICAgICAgICAgc2VsZi5fY29tcC5DbG9zZUNvbXByZXNzb3IoKQorICAgICAgICAgICAgICAgIHNlbGYuX2NvbXAgPSBOb25lCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIFByZXZlbnQgcmVmIGN5Y2xlcworICAgICAgICAgICAgc2VsZi5fY29udmVydCA9IE5vbmUKKyAgICAgICAgICAgIGYgPSBzZWxmLl9maWxlCisgICAgICAgICAgICBzZWxmLl9maWxlID0gTm9uZQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAjCisgICAgIyBJbnRlcm5hbCBtZXRob2RzLgorICAgICMKKworICAgIGRlZiBfY29tcF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBpbXBvcnQgY2wKKyAgICAgICAgZHVtbXkgPSBzZWxmLl9jb21wLlNldFBhcmFtKGNsLkZSQU1FX0JVRkZFUl9TSVpFLCBsZW4oZGF0YSkpCisgICAgICAgIGR1bW15ID0gc2VsZi5fY29tcC5TZXRQYXJhbShjbC5DT01QUkVTU0VEX0JVRkZFUl9TSVpFLCBsZW4oZGF0YSkpCisgICAgICAgIHJldHVybiBzZWxmLl9jb21wLkNvbXByZXNzKHNlbGYuX25mcmFtZXMsIGRhdGEpCisKKyAgICBkZWYgX2xpbjJ1bGF3KHNlbGYsIGRhdGEpOgorICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICByZXR1cm4gYXVkaW9vcC5saW4ydWxhdyhkYXRhLCAyKQorCisgICAgZGVmIF9saW4yYWRwY20oc2VsZiwgZGF0YSk6CisgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdfYWRwY21zdGF0ZScpOgorICAgICAgICAgICAgc2VsZi5fYWRwY21zdGF0ZSA9IE5vbmUKKyAgICAgICAgZGF0YSwgc2VsZi5fYWRwY21zdGF0ZSA9IGF1ZGlvb3AubGluMmFkcGNtKGRhdGEsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRwY21zdGF0ZSkKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBfZW5zdXJlX2hlYWRlcl93cml0dGVuKHNlbGYsIGRhdGFzaXplKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgaW4gKCdVTEFXJywgJ0FMQVcnKToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAyCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2FtcHdpZHRoICE9IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxlIHdpZHRoIG11c3QgYmUgMiB3aGVuIGNvbXByZXNzaW5nIHdpdGggVUxBVyBvciBBTEFXJworICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ0c3MjInOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zYW1wd2lkdGg6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IDIKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9zYW1wd2lkdGggIT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzYW1wbGUgd2lkdGggbXVzdCBiZSAyIHdoZW4gY29tcHJlc3Npbmcgd2l0aCBHNy4yMiAoQURQQ00pJworICAgICAgICAgICAgaWYgbm90IHNlbGYuX25jaGFubmVsczoKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJyMgY2hhbm5lbHMgbm90IHNwZWNpZmllZCcKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zYW1wd2lkdGg6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzYW1wbGUgd2lkdGggbm90IHNwZWNpZmllZCcKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9mcmFtZXJhdGU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzYW1wbGluZyByYXRlIG5vdCBzcGVjaWZpZWQnCisgICAgICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXIoZGF0YXNpemUpCisKKyAgICBkZWYgX2luaXRfY29tcHJlc3Npb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdHNzIyJzoKKyAgICAgICAgICAgIHNlbGYuX2NvbnZlcnQgPSBzZWxmLl9saW4yYWRwY20KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY2wKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ1VMQVcnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGF1ZGlvb3AKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29udmVydCA9IHNlbGYuX2xpbjJ1bGF3CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3Qgd3JpdGUgY29tcHJlc3NlZCBBSUZGLUMgZmlsZXMnCisgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdVTEFXJzoKKyAgICAgICAgICAgIHNjaGVtZSA9IGNsLkc3MTFfVUxBVworICAgICAgICBlbGlmIHNlbGYuX2NvbXB0eXBlID09ICdBTEFXJzoKKyAgICAgICAgICAgIHNjaGVtZSA9IGNsLkc3MTFfQUxBVworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlJworICAgICAgICBzZWxmLl9jb21wID0gY2wuT3BlbkNvbXByZXNzb3Ioc2NoZW1lKQorICAgICAgICBwYXJhbXMgPSBbY2wuT1JJR0lOQUxfRk9STUFULCAwLAorICAgICAgICAgICAgICBjbC5CSVRTX1BFUl9DT01QT05FTlQsIHNlbGYuX3NhbXB3aWR0aCAqIDgsCisgICAgICAgICAgICAgIGNsLkZSQU1FX1JBVEUsIHNlbGYuX2ZyYW1lcmF0ZSwKKyAgICAgICAgICAgICAgY2wuRlJBTUVfQlVGRkVSX1NJWkUsIDEwMCwKKyAgICAgICAgICAgICAgY2wuQ09NUFJFU1NFRF9CVUZGRVJfU0laRSwgMTAwXQorICAgICAgICBpZiBzZWxmLl9uY2hhbm5lbHMgPT0gMToKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IGNsLk1PTk8KKyAgICAgICAgZWxpZiBzZWxmLl9uY2hhbm5lbHMgPT0gMjoKKyAgICAgICAgICAgIHBhcmFtc1sxXSA9IGNsLlNURVJFT19JTlRFUkxFQVZFRAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY29tcHJlc3MgbW9yZSB0aGFuIDIgY2hhbm5lbHMnCisgICAgICAgIHNlbGYuX2NvbXAuU2V0UGFyYW1zKHBhcmFtcykKKyAgICAgICAgIyB0aGUgY29tcHJlc3NvciBwcm9kdWNlcyBhIGhlYWRlciB3aGljaCB3ZSBpZ25vcmUKKyAgICAgICAgZHVtbXkgPSBzZWxmLl9jb21wLkNvbXByZXNzKDAsICcnKQorICAgICAgICBzZWxmLl9jb252ZXJ0ID0gc2VsZi5fY29tcF9kYXRhCisKKyAgICBkZWYgX3dyaXRlX2hlYWRlcihzZWxmLCBpbml0bGVuZ3RoKToKKyAgICAgICAgaWYgc2VsZi5fYWlmYyBhbmQgc2VsZi5fY29tcHR5cGUgIT0gJ05PTkUnOgorICAgICAgICAgICAgc2VsZi5faW5pdF9jb21wcmVzc2lvbigpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ0ZPUk0nKQorICAgICAgICBpZiBub3Qgc2VsZi5fbmZyYW1lczoKKyAgICAgICAgICAgIHNlbGYuX25mcmFtZXMgPSBpbml0bGVuZ3RoIC8vIChzZWxmLl9uY2hhbm5lbHMgKiBzZWxmLl9zYW1wd2lkdGgpCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9uZnJhbWVzICogc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoCisgICAgICAgIGlmIHNlbGYuX2RhdGFsZW5ndGggJiAxOgorICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IHNlbGYuX2RhdGFsZW5ndGggKyAxCisgICAgICAgIGlmIHNlbGYuX2FpZmM6CisgICAgICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSBpbiAoJ1VMQVcnLCAnQUxBVycpOgorICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhbGVuZ3RoIC8vIDIKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9kYXRhbGVuZ3RoICYgMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IHNlbGYuX2RhdGFsZW5ndGggKyAxCisgICAgICAgICAgICBlbGlmIHNlbGYuX2NvbXB0eXBlID09ICdHNzIyJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gKHNlbGYuX2RhdGFsZW5ndGggKyAzKSAvLyA0CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fZGF0YWxlbmd0aCAmIDE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhbGVuZ3RoICsgMQorICAgICAgICBzZWxmLl9mb3JtX2xlbmd0aF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBjb21tbGVuZ3RoID0gc2VsZi5fd3JpdGVfZm9ybV9sZW5ndGgoc2VsZi5fZGF0YWxlbmd0aCkKKyAgICAgICAgaWYgc2VsZi5fYWlmYzoKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ0FJRkMnKQorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnRlZFUicpCisgICAgICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgNCkKKyAgICAgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBzZWxmLl92ZXJzaW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnQUlGRicpCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ0NPTU0nKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgY29tbWxlbmd0aCkKKyAgICAgICAgX3dyaXRlX3Nob3J0KHNlbGYuX2ZpbGUsIHNlbGYuX25jaGFubmVscykKKyAgICAgICAgc2VsZi5fbmZyYW1lc19wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgc2VsZi5fbmZyYW1lcykKKyAgICAgICAgX3dyaXRlX3Nob3J0KHNlbGYuX2ZpbGUsIHNlbGYuX3NhbXB3aWR0aCAqIDgpCisgICAgICAgIF93cml0ZV9mbG9hdChzZWxmLl9maWxlLCBzZWxmLl9mcmFtZXJhdGUpCisgICAgICAgIGlmIHNlbGYuX2FpZmM6CisgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKHNlbGYuX2NvbXB0eXBlKQorICAgICAgICAgICAgX3dyaXRlX3N0cmluZyhzZWxmLl9maWxlLCBzZWxmLl9jb21wbmFtZSkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnU1NORCcpCisgICAgICAgIHNlbGYuX3NzbmRfbGVuZ3RoX3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBzZWxmLl9kYXRhbGVuZ3RoICsgOCkKKyAgICAgICAgX3dyaXRlX3Vsb25nKHNlbGYuX2ZpbGUsIDApCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCAwKQorCisgICAgZGVmIF93cml0ZV9mb3JtX2xlbmd0aChzZWxmLCBkYXRhbGVuZ3RoKToKKyAgICAgICAgaWYgc2VsZi5fYWlmYzoKKyAgICAgICAgICAgIGNvbW1sZW5ndGggPSAxOCArIDUgKyBsZW4oc2VsZi5fY29tcG5hbWUpCisgICAgICAgICAgICBpZiBjb21tbGVuZ3RoICYgMToKKyAgICAgICAgICAgICAgICBjb21tbGVuZ3RoID0gY29tbWxlbmd0aCArIDEKKyAgICAgICAgICAgIHZlcnNsZW5ndGggPSAxMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tbWxlbmd0aCA9IDE4CisgICAgICAgICAgICB2ZXJzbGVuZ3RoID0gMAorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgNCArIHZlcnNsZW5ndGggKyBzZWxmLl9tYXJrbGVuZ3RoICsgXAorICAgICAgICAgICAgICAgICAgICAgOCArIGNvbW1sZW5ndGggKyAxNiArIGRhdGFsZW5ndGgpCisgICAgICAgIHJldHVybiBjb21tbGVuZ3RoCisKKyAgICBkZWYgX3BhdGNoaGVhZGVyKHNlbGYpOgorICAgICAgICBjdXJwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBpZiBzZWxmLl9kYXRhd3JpdHRlbiAmIDE6CisgICAgICAgICAgICBkYXRhbGVuZ3RoID0gc2VsZi5fZGF0YXdyaXR0ZW4gKyAxCisgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGNocigwKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGFsZW5ndGggPSBzZWxmLl9kYXRhd3JpdHRlbgorICAgICAgICBpZiBkYXRhbGVuZ3RoID09IHNlbGYuX2RhdGFsZW5ndGggYW5kIFwKKyAgICAgICAgICAgICAgc2VsZi5fbmZyYW1lcyA9PSBzZWxmLl9uZnJhbWVzd3JpdHRlbiBhbmQgXAorICAgICAgICAgICAgICBzZWxmLl9tYXJrbGVuZ3RoID09IDA6CisgICAgICAgICAgICBzZWxmLl9maWxlLnNlZWsoY3VycG9zLCAwKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9mb3JtX2xlbmd0aF9wb3MsIDApCisgICAgICAgIGR1bW15ID0gc2VsZi5fd3JpdGVfZm9ybV9sZW5ndGgoZGF0YWxlbmd0aCkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX25mcmFtZXNfcG9zLCAwKQorICAgICAgICBfd3JpdGVfdWxvbmcoc2VsZi5fZmlsZSwgc2VsZi5fbmZyYW1lc3dyaXR0ZW4pCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9zc25kX2xlbmd0aF9wb3MsIDApCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBkYXRhbGVuZ3RoICsgOCkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKGN1cnBvcywgMCkKKyAgICAgICAgc2VsZi5fbmZyYW1lcyA9IHNlbGYuX25mcmFtZXN3cml0dGVuCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBkYXRhbGVuZ3RoCisKKyAgICBkZWYgX3dyaXRlbWFya2VycyhzZWxmKToKKyAgICAgICAgaWYgbGVuKHNlbGYuX21hcmtlcnMpID09IDA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnTUFSSycpCisgICAgICAgIGxlbmd0aCA9IDIKKyAgICAgICAgZm9yIG1hcmtlciBpbiBzZWxmLl9tYXJrZXJzOgorICAgICAgICAgICAgaWQsIHBvcywgbmFtZSA9IG1hcmtlcgorICAgICAgICAgICAgbGVuZ3RoID0gbGVuZ3RoICsgbGVuKG5hbWUpICsgMSArIDYKKyAgICAgICAgICAgIGlmIGxlbihuYW1lKSAmIDEgPT0gMDoKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW5ndGggKyAxCisgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBsZW5ndGgpCisgICAgICAgIHNlbGYuX21hcmtsZW5ndGggPSBsZW5ndGggKyA4CisgICAgICAgIF93cml0ZV9zaG9ydChzZWxmLl9maWxlLCBsZW4oc2VsZi5fbWFya2VycykpCisgICAgICAgIGZvciBtYXJrZXIgaW4gc2VsZi5fbWFya2VyczoKKyAgICAgICAgICAgIGlkLCBwb3MsIG5hbWUgPSBtYXJrZXIKKyAgICAgICAgICAgIF93cml0ZV9zaG9ydChzZWxmLl9maWxlLCBpZCkKKyAgICAgICAgICAgIF93cml0ZV91bG9uZyhzZWxmLl9maWxlLCBwb3MpCisgICAgICAgICAgICBfd3JpdGVfc3RyaW5nKHNlbGYuX2ZpbGUsIG5hbWUpCisKK2RlZiBvcGVuKGYsIG1vZGU9Tm9uZSk6CisgICAgaWYgbW9kZSBpcyBOb25lOgorICAgICAgICBpZiBoYXNhdHRyKGYsICdtb2RlJyk6CisgICAgICAgICAgICBtb2RlID0gZi5tb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RlID0gJ3JiJworICAgIGlmIG1vZGUgaW4gKCdyJywgJ3JiJyk6CisgICAgICAgIHJldHVybiBBaWZjX3JlYWQoZikKKyAgICBlbGlmIG1vZGUgaW4gKCd3JywgJ3diJyk6CisgICAgICAgIHJldHVybiBBaWZjX3dyaXRlKGYpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InLCAncmInLCAndycsIG9yICd3YiciCisKK29wZW5mcCA9IG9wZW4gIyBCL1cgY29tcGF0aWJpbGl0eQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBzeXMuYXJndi5hcHBlbmQoJy91c3IvZGVtb3MvZGF0YS9hdWRpby9iYWNoLmFpZmYnKQorICAgIGZuID0gc3lzLmFyZ3ZbMV0KKyAgICBmID0gb3BlbihmbiwgJ3InKQorICAgIHByaW50ICJSZWFkaW5nIiwgZm4KKyAgICBwcmludCAibmNoYW5uZWxzID0iLCBmLmdldG5jaGFubmVscygpCisgICAgcHJpbnQgIm5mcmFtZXMgICA9IiwgZi5nZXRuZnJhbWVzKCkKKyAgICBwcmludCAic2FtcHdpZHRoID0iLCBmLmdldHNhbXB3aWR0aCgpCisgICAgcHJpbnQgImZyYW1lcmF0ZSA9IiwgZi5nZXRmcmFtZXJhdGUoKQorICAgIHByaW50ICJjb21wdHlwZSAgPSIsIGYuZ2V0Y29tcHR5cGUoKQorICAgIHByaW50ICJjb21wbmFtZSAgPSIsIGYuZ2V0Y29tcG5hbWUoKQorICAgIGlmIHN5cy5hcmd2WzI6XToKKyAgICAgICAgZ24gPSBzeXMuYXJndlsyXQorICAgICAgICBwcmludCAiV3JpdGluZyIsIGduCisgICAgICAgIGcgPSBvcGVuKGduLCAndycpCisgICAgICAgIGcuc2V0cGFyYW1zKGYuZ2V0cGFyYW1zKCkpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkZnJhbWVzKDEwMjQpCisgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZy53cml0ZWZyYW1lcyhkYXRhKQorICAgICAgICBnLmNsb3NlKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHByaW50ICJEb25lLiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYWlmYy5weWMgYi9saWIvcHl0aG9uMi43L2FpZmMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNWQwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FpZmMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYWlmYy5weW8gYi9saWIvcHl0aG9uMi43L2FpZmMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNWQwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FpZmMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYW50aWdyYXZpdHkucHkgYi9saWIvcHl0aG9uMi43L2FudGlncmF2aXR5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjdkODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FudGlncmF2aXR5LnB5CkBAIC0wLDAgKzEsNCBAQAorCitpbXBvcnQgd2ViYnJvd3NlcgorCit3ZWJicm93c2VyLm9wZW4oImh0dHA6Ly94a2NkLmNvbS8zNTMvIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYW50aWdyYXZpdHkucHljIGIvbGliL3B5dGhvbjIuNy9hbnRpZ3Jhdml0eS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyZGE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYW50aWdyYXZpdHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYW50aWdyYXZpdHkucHlvIGIvbGliL3B5dGhvbjIuNy9hbnRpZ3Jhdml0eS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIyZGE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYW50aWdyYXZpdHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYW55ZGJtLnB5IGIvbGliL3B5dGhvbjIuNy9hbnlkYm0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3ZTkwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYW55ZGJtLnB5CkBAIC0wLDAgKzEsODUgQEAKKyIiIkdlbmVyaWMgaW50ZXJmYWNlIHRvIGFsbCBkYm0gY2xvbmVzLgorCitJbnN0ZWFkIG9mCisKKyAgICAgICAgaW1wb3J0IGRibQorICAgICAgICBkID0gZGJtLm9wZW4oZmlsZSwgJ3cnLCAwNjY2KQorCit1c2UKKworICAgICAgICBpbXBvcnQgYW55ZGJtCisgICAgICAgIGQgPSBhbnlkYm0ub3BlbihmaWxlLCAndycpCisKK1RoZSByZXR1cm5lZCBvYmplY3QgaXMgYSBkYmhhc2gsIGdkYm0sIGRibSBvciBkdW1iZGJtIG9iamVjdCwKK2RlcGVuZGVudCBvbiB0aGUgdHlwZSBvZiBkYXRhYmFzZSBiZWluZyBvcGVuZWQgKGRldGVybWluZWQgYnkgd2hpY2hkYgorbW9kdWxlKSBpbiB0aGUgY2FzZSBvZiBhbiBleGlzdGluZyBkYm0uIElmIHRoZSBkYm0gZG9lcyBub3QgZXhpc3QgYW5kCit0aGUgY3JlYXRlIG9yIG5ldyBmbGFnICgnYycgb3IgJ24nKSB3YXMgc3BlY2lmaWVkLCB0aGUgZGJtIHR5cGUgd2lsbAorYmUgZGV0ZXJtaW5lZCBieSB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSBtb2R1bGVzICh0ZXN0ZWQgaW4gdGhlIGFib3ZlCitvcmRlcikuCisKK0l0IGhhcyB0aGUgZm9sbG93aW5nIGludGVyZmFjZSAoa2V5IGFuZCBkYXRhIGFyZSBzdHJpbmdzKToKKworICAgICAgICBkW2tleV0gPSBkYXRhICAgIyBzdG9yZSBkYXRhIGF0IGtleSAobWF5IG92ZXJyaWRlIGRhdGEgYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZXhpc3Rpbmcga2V5KQorICAgICAgICBkYXRhID0gZFtrZXldICAgIyByZXRyaWV2ZSBkYXRhIGF0IGtleSAocmFpc2UgS2V5RXJyb3IgaWYgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICMgc3VjaCBrZXkpCisgICAgICAgIGRlbCBkW2tleV0gICAgICAjIGRlbGV0ZSBkYXRhIHN0b3JlZCBhdCBrZXkgKHJhaXNlcyBLZXlFcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBubyBzdWNoIGtleSkKKyAgICAgICAgZmxhZyA9IGtleSBpbiBkICAgIyB0cnVlIGlmIHRoZSBrZXkgZXhpc3RzCisgICAgICAgIGxpc3QgPSBkLmtleXMoKSAjIHJldHVybiBhIGxpc3Qgb2YgYWxsIGV4aXN0aW5nIGtleXMgKHNsb3chKQorCitGdXR1cmUgdmVyc2lvbnMgbWF5IGNoYW5nZSB0aGUgb3JkZXIgaW4gd2hpY2ggaW1wbGVtZW50YXRpb25zIGFyZQordGVzdGVkIGZvciBleGlzdGVuY2UsIGFuZCBhZGQgaW50ZXJmYWNlcyB0byBvdGhlciBkYm0tbGlrZQoraW1wbGVtZW50YXRpb25zLgorIiIiCisKK2NsYXNzIGVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitfbmFtZXMgPSBbJ2RiaGFzaCcsICdnZGJtJywgJ2RibScsICdkdW1iZGJtJ10KK19lcnJvcnMgPSBbZXJyb3JdCitfZGVmYXVsdG1vZCA9IE5vbmUKKworZm9yIF9uYW1lIGluIF9uYW1lczoKKyAgICB0cnk6CisgICAgICAgIF9tb2QgPSBfX2ltcG9ydF9fKF9uYW1lKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgY29udGludWUKKyAgICBpZiBub3QgX2RlZmF1bHRtb2Q6CisgICAgICAgIF9kZWZhdWx0bW9kID0gX21vZAorICAgIF9lcnJvcnMuYXBwZW5kKF9tb2QuZXJyb3IpCisKK2lmIG5vdCBfZGVmYXVsdG1vZDoKKyAgICByYWlzZSBJbXBvcnRFcnJvciwgIm5vIGRibSBjbG9uZSBmb3VuZDsgdHJpZWQgJXMiICUgX25hbWVzCisKK2Vycm9yID0gdHVwbGUoX2Vycm9ycykKKworZGVmIG9wZW4oZmlsZSwgZmxhZz0ncicsIG1vZGU9MDY2Nik6CisgICAgIiIiT3BlbiBvciBjcmVhdGUgZGF0YWJhc2UgYXQgcGF0aCBnaXZlbiBieSAqZmlsZSouCisKKyAgICBPcHRpb25hbCBhcmd1bWVudCAqZmxhZyogY2FuIGJlICdyJyAoZGVmYXVsdCkgZm9yIHJlYWQtb25seSBhY2Nlc3MsICd3JworICAgIGZvciByZWFkLXdyaXRlIGFjY2VzcyBvZiBhbiBleGlzdGluZyBkYXRhYmFzZSwgJ2MnIGZvciByZWFkLXdyaXRlIGFjY2VzcworICAgIHRvIGEgbmV3IG9yIGV4aXN0aW5nIGRhdGFiYXNlLCBhbmQgJ24nIGZvciByZWFkLXdyaXRlIGFjY2VzcyB0byBhIG5ldworICAgIGRhdGFiYXNlLgorCisgICAgTm90ZTogJ3InIGFuZCAndycgZmFpbCBpZiB0aGUgZGF0YWJhc2UgZG9lc24ndCBleGlzdDsgJ2MnIGNyZWF0ZXMgaXQKKyAgICBvbmx5IGlmIGl0IGRvZXNuJ3QgZXhpc3Q7IGFuZCAnbicgYWx3YXlzIGNyZWF0ZXMgYSBuZXcgZGF0YWJhc2UuCisgICAgIiIiCisKKyAgICAjIGd1ZXNzIHRoZSB0eXBlIG9mIGFuIGV4aXN0aW5nIGRhdGFiYXNlCisgICAgZnJvbSB3aGljaGRiIGltcG9ydCB3aGljaGRiCisgICAgcmVzdWx0PXdoaWNoZGIoZmlsZSkKKyAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgIyBkYiBkb2Vzbid0IGV4aXN0CisgICAgICAgIGlmICdjJyBpbiBmbGFnIG9yICduJyBpbiBmbGFnOgorICAgICAgICAgICAgIyBmaWxlIGRvZXNuJ3QgZXhpc3QgYW5kIHRoZSBuZXcKKyAgICAgICAgICAgICMgZmxhZyB3YXMgdXNlZCBzbyB1c2UgZGVmYXVsdCB0eXBlCisgICAgICAgICAgICBtb2QgPSBfZGVmYXVsdG1vZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJuZWVkICdjJyBvciAnbicgZmxhZyB0byBvcGVuIG5ldyBkYiIKKyAgICBlbGlmIHJlc3VsdCA9PSAiIjoKKyAgICAgICAgIyBkYiB0eXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkCisgICAgICAgIHJhaXNlIGVycm9yLCAiZGIgdHlwZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCIKKyAgICBlbHNlOgorICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKHJlc3VsdCkKKyAgICByZXR1cm4gbW9kLm9wZW4oZmlsZSwgZmxhZywgbW9kZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYW55ZGJtLnB5YyBiL2xpYi9weXRob24yLjcvYW55ZGJtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYwNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hbnlkYm0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYW55ZGJtLnB5byBiL2xpYi9weXRob24yLjcvYW55ZGJtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTYwNDc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hbnlkYm0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYXJncGFyc2UucHkgYi9saWIvcHl0aG9uMi43L2FyZ3BhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYmFlNTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FyZ3BhcnNlLnB5CkBAIC0wLDAgKzEsMjM2MSBAQAorIyBBdXRob3I6IFN0ZXZlbiBKLiBCZXRoYXJkIDxzdGV2ZW4uYmV0aGFyZEBnbWFpbC5jb20+LgorCisiIiJDb21tYW5kLWxpbmUgcGFyc2luZyBsaWJyYXJ5CisKK1RoaXMgbW9kdWxlIGlzIGFuIG9wdHBhcnNlLWluc3BpcmVkIGNvbW1hbmQtbGluZSBwYXJzaW5nIGxpYnJhcnkgdGhhdDoKKworICAgIC0gaGFuZGxlcyBib3RoIG9wdGlvbmFsIGFuZCBwb3NpdGlvbmFsIGFyZ3VtZW50cworICAgIC0gcHJvZHVjZXMgaGlnaGx5IGluZm9ybWF0aXZlIHVzYWdlIG1lc3NhZ2VzCisgICAgLSBzdXBwb3J0cyBwYXJzZXJzIHRoYXQgZGlzcGF0Y2ggdG8gc3ViLXBhcnNlcnMKKworVGhlIGZvbGxvd2luZyBpcyBhIHNpbXBsZSB1c2FnZSBleGFtcGxlIHRoYXQgc3VtcyBpbnRlZ2VycyBmcm9tIHRoZQorY29tbWFuZC1saW5lIGFuZCB3cml0ZXMgdGhlIHJlc3VsdCB0byBhIGZpbGU6OgorCisgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICAgIGRlc2NyaXB0aW9uPSdzdW0gdGhlIGludGVnZXJzIGF0IHRoZSBjb21tYW5kIGxpbmUnKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICdpbnRlZ2VycycsIG1ldGF2YXI9J2ludCcsIG5hcmdzPScrJywgdHlwZT1pbnQsCisgICAgICAgIGhlbHA9J2FuIGludGVnZXIgdG8gYmUgc3VtbWVkJykKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAnLS1sb2cnLCBkZWZhdWx0PXN5cy5zdGRvdXQsIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSwKKyAgICAgICAgaGVscD0ndGhlIGZpbGUgd2hlcmUgdGhlIHN1bSBzaG91bGQgYmUgd3JpdHRlbicpCisgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBhcmdzLmxvZy53cml0ZSgnJXMnICUgc3VtKGFyZ3MuaW50ZWdlcnMpKQorICAgIGFyZ3MubG9nLmNsb3NlKCkKKworVGhlIG1vZHVsZSBjb250YWlucyB0aGUgZm9sbG93aW5nIHB1YmxpYyBjbGFzc2VzOgorCisgICAgLSBBcmd1bWVudFBhcnNlciAtLSBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgY29tbWFuZC1saW5lIHBhcnNpbmcuIEFzIHRoZQorICAgICAgICBleGFtcGxlIGFib3ZlIHNob3dzLCB0aGUgYWRkX2FyZ3VtZW50KCkgbWV0aG9kIGlzIHVzZWQgdG8gcG9wdWxhdGUKKyAgICAgICAgdGhlIHBhcnNlciB3aXRoIGFjdGlvbnMgZm9yIG9wdGlvbmFsIGFuZCBwb3NpdGlvbmFsIGFyZ3VtZW50cy4gVGhlbgorICAgICAgICB0aGUgcGFyc2VfYXJncygpIG1ldGhvZCBpcyBpbnZva2VkIHRvIGNvbnZlcnQgdGhlIGFyZ3MgYXQgdGhlCisgICAgICAgIGNvbW1hbmQtbGluZSBpbnRvIGFuIG9iamVjdCB3aXRoIGF0dHJpYnV0ZXMuCisKKyAgICAtIEFyZ3VtZW50RXJyb3IgLS0gVGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkgQXJndW1lbnRQYXJzZXIgb2JqZWN0cyB3aGVuCisgICAgICAgIHRoZXJlIGFyZSBlcnJvcnMgd2l0aCB0aGUgcGFyc2VyJ3MgYWN0aW9ucy4gRXJyb3JzIHJhaXNlZCB3aGlsZQorICAgICAgICBwYXJzaW5nIHRoZSBjb21tYW5kLWxpbmUgYXJlIGNhdWdodCBieSBBcmd1bWVudFBhcnNlciBhbmQgZW1pdHRlZAorICAgICAgICBhcyBjb21tYW5kLWxpbmUgbWVzc2FnZXMuCisKKyAgICAtIEZpbGVUeXBlIC0tIEEgZmFjdG9yeSBmb3IgZGVmaW5pbmcgdHlwZXMgb2YgZmlsZXMgdG8gYmUgY3JlYXRlZC4gQXMgdGhlCisgICAgICAgIGV4YW1wbGUgYWJvdmUgc2hvd3MsIGluc3RhbmNlcyBvZiBGaWxlVHlwZSBhcmUgdHlwaWNhbGx5IHBhc3NlZCBhcworICAgICAgICB0aGUgdHlwZT0gYXJndW1lbnQgb2YgYWRkX2FyZ3VtZW50KCkgY2FsbHMuCisKKyAgICAtIEFjdGlvbiAtLSBUaGUgYmFzZSBjbGFzcyBmb3IgcGFyc2VyIGFjdGlvbnMuIFR5cGljYWxseSBhY3Rpb25zIGFyZQorICAgICAgICBzZWxlY3RlZCBieSBwYXNzaW5nIHN0cmluZ3MgbGlrZSAnc3RvcmVfdHJ1ZScgb3IgJ2FwcGVuZF9jb25zdCcgdG8KKyAgICAgICAgdGhlIGFjdGlvbj0gYXJndW1lbnQgb2YgYWRkX2FyZ3VtZW50KCkuIEhvd2V2ZXIsIGZvciBncmVhdGVyCisgICAgICAgIGN1c3RvbWl6YXRpb24gb2YgQXJndW1lbnRQYXJzZXIgYWN0aW9ucywgc3ViY2xhc3NlcyBvZiBBY3Rpb24gbWF5CisgICAgICAgIGJlIGRlZmluZWQgYW5kIHBhc3NlZCBhcyB0aGUgYWN0aW9uPSBhcmd1bWVudC4KKworICAgIC0gSGVscEZvcm1hdHRlciwgUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyLCBSYXdUZXh0SGVscEZvcm1hdHRlciwKKyAgICAgICAgQXJndW1lbnREZWZhdWx0c0hlbHBGb3JtYXR0ZXIgLS0gRm9ybWF0dGVyIGNsYXNzZXMgd2hpY2gKKyAgICAgICAgbWF5IGJlIHBhc3NlZCBhcyB0aGUgZm9ybWF0dGVyX2NsYXNzPSBhcmd1bWVudCB0byB0aGUKKyAgICAgICAgQXJndW1lbnRQYXJzZXIgY29uc3RydWN0b3IuIEhlbHBGb3JtYXR0ZXIgaXMgdGhlIGRlZmF1bHQsCisgICAgICAgIFJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciBhbmQgUmF3VGV4dEhlbHBGb3JtYXR0ZXIgdGVsbCB0aGUgcGFyc2VyCisgICAgICAgIG5vdCB0byBjaGFuZ2UgdGhlIGZvcm1hdHRpbmcgZm9yIGhlbHAgdGV4dCwgYW5kCisgICAgICAgIEFyZ3VtZW50RGVmYXVsdHNIZWxwRm9ybWF0dGVyIGFkZHMgaW5mb3JtYXRpb24gYWJvdXQgYXJndW1lbnQgZGVmYXVsdHMKKyAgICAgICAgdG8gdGhlIGhlbHAuCisKK0FsbCBvdGhlciBjbGFzc2VzIGluIHRoaXMgbW9kdWxlIGFyZSBjb25zaWRlcmVkIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisoQWxzbyBub3RlIHRoYXQgSGVscEZvcm1hdHRlciBhbmQgUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyIGFyZSBvbmx5Citjb25zaWRlcmVkIHB1YmxpYyBhcyBvYmplY3QgbmFtZXMgLS0gdGhlIEFQSSBvZiB0aGUgZm9ybWF0dGVyIG9iamVjdHMgaXMKK3N0aWxsIGNvbnNpZGVyZWQgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLikKKyIiIgorCitfX3ZlcnNpb25fXyA9ICcxLjEnCitfX2FsbF9fID0gWworICAgICdBcmd1bWVudFBhcnNlcicsCisgICAgJ0FyZ3VtZW50RXJyb3InLAorICAgICdBcmd1bWVudFR5cGVFcnJvcicsCisgICAgJ0ZpbGVUeXBlJywKKyAgICAnSGVscEZvcm1hdHRlcicsCisgICAgJ0FyZ3VtZW50RGVmYXVsdHNIZWxwRm9ybWF0dGVyJywKKyAgICAnUmF3RGVzY3JpcHRpb25IZWxwRm9ybWF0dGVyJywKKyAgICAnUmF3VGV4dEhlbHBGb3JtYXR0ZXInLAorICAgICdOYW1lc3BhY2UnLAorICAgICdBY3Rpb24nLAorICAgICdPTkVfT1JfTU9SRScsCisgICAgJ09QVElPTkFMJywKKyAgICAnUEFSU0VSJywKKyAgICAnUkVNQUlOREVSJywKKyAgICAnU1VQUFJFU1MnLAorICAgICdaRVJPX09SX01PUkUnLAorXQorCisKK2ltcG9ydCBjb2xsZWN0aW9ucyBhcyBfY29sbGVjdGlvbnMKK2ltcG9ydCBjb3B5IGFzIF9jb3B5CitpbXBvcnQgb3MgYXMgX29zCitpbXBvcnQgcmUgYXMgX3JlCitpbXBvcnQgc3lzIGFzIF9zeXMKK2ltcG9ydCB0ZXh0d3JhcCBhcyBfdGV4dHdyYXAKKworZnJvbSBnZXR0ZXh0IGltcG9ydCBnZXR0ZXh0IGFzIF8KKworCitkZWYgX2NhbGxhYmxlKG9iaik6CisgICAgcmV0dXJuIGhhc2F0dHIob2JqLCAnX19jYWxsX18nKSBvciBoYXNhdHRyKG9iaiwgJ19fYmFzZXNfXycpCisKKworU1VQUFJFU1MgPSAnPT1TVVBQUkVTUz09JworCitPUFRJT05BTCA9ICc/JworWkVST19PUl9NT1JFID0gJyonCitPTkVfT1JfTU9SRSA9ICcrJworUEFSU0VSID0gJ0EuLi4nCitSRU1BSU5ERVIgPSAnLi4uJworX1VOUkVDT0dOSVpFRF9BUkdTX0FUVFIgPSAnX3VucmVjb2duaXplZF9hcmdzJworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFV0aWxpdHkgZnVuY3Rpb25zIGFuZCBjbGFzc2VzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIF9BdHRyaWJ1dGVIb2xkZXIob2JqZWN0KToKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgX19yZXByX18uCisKKyAgICBUaGUgX19yZXByX18gbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdDo6CisgICAgICAgIENsYXNzTmFtZShhdHRyPW5hbWUsIGF0dHI9bmFtZSwgLi4uKQorICAgIFRoZSBhdHRyaWJ1dGVzIGFyZSBkZXRlcm1pbmVkIGVpdGhlciBieSBhIGNsYXNzLWxldmVsIGF0dHJpYnV0ZSwKKyAgICAnX2t3YXJnX25hbWVzJywgb3IgYnkgaW5zcGVjdGluZyB0aGUgaW5zdGFuY2UgX19kaWN0X18uCisgICAgIiIiCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHR5cGVfbmFtZSA9IHR5cGUoc2VsZikuX19uYW1lX18KKyAgICAgICAgYXJnX3N0cmluZ3MgPSBbXQorICAgICAgICBmb3IgYXJnIGluIHNlbGYuX2dldF9hcmdzKCk6CisgICAgICAgICAgICBhcmdfc3RyaW5ncy5hcHBlbmQocmVwcihhcmcpKQorICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc2VsZi5fZ2V0X2t3YXJncygpOgorICAgICAgICAgICAgYXJnX3N0cmluZ3MuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAodHlwZV9uYW1lLCAnLCAnLmpvaW4oYXJnX3N0cmluZ3MpKQorCisgICAgZGVmIF9nZXRfa3dhcmdzKHNlbGYpOgorICAgICAgICByZXR1cm4gc29ydGVkKHNlbGYuX19kaWN0X18uaXRlbXMoKSkKKworICAgIGRlZiBfZ2V0X2FyZ3Moc2VsZik6CisgICAgICAgIHJldHVybiBbXQorCisKK2RlZiBfZW5zdXJlX3ZhbHVlKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpOgorICAgIGlmIGdldGF0dHIobmFtZXNwYWNlLCBuYW1lLCBOb25lKSBpcyBOb25lOgorICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgbmFtZSwgdmFsdWUpCisgICAgcmV0dXJuIGdldGF0dHIobmFtZXNwYWNlLCBuYW1lKQorCisKKyMgPT09PT09PT09PT09PT09CisjIEZvcm1hdHRpbmcgSGVscAorIyA9PT09PT09PT09PT09PT0KKworY2xhc3MgSGVscEZvcm1hdHRlcihvYmplY3QpOgorICAgICIiIkZvcm1hdHRlciBmb3IgZ2VuZXJhdGluZyB1c2FnZSBtZXNzYWdlcyBhbmQgYXJndW1lbnQgaGVscCBzdHJpbmdzLgorCisgICAgT25seSB0aGUgbmFtZSBvZiB0aGlzIGNsYXNzIGlzIGNvbnNpZGVyZWQgYSBwdWJsaWMgQVBJLiBBbGwgdGhlIG1ldGhvZHMKKyAgICBwcm92aWRlZCBieSB0aGUgY2xhc3MgYXJlIGNvbnNpZGVyZWQgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHByb2csCisgICAgICAgICAgICAgICAgIGluZGVudF9pbmNyZW1lbnQ9MiwKKyAgICAgICAgICAgICAgICAgbWF4X2hlbHBfcG9zaXRpb249MjQsCisgICAgICAgICAgICAgICAgIHdpZHRoPU5vbmUpOgorCisgICAgICAgICMgZGVmYXVsdCBzZXR0aW5nIGZvciB3aWR0aAorICAgICAgICBpZiB3aWR0aCBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpZHRoID0gaW50KF9vcy5lbnZpcm9uWydDT0xVTU5TJ10pCisgICAgICAgICAgICBleGNlcHQgKEtleUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICB3aWR0aCA9IDgwCisgICAgICAgICAgICB3aWR0aCAtPSAyCisKKyAgICAgICAgc2VsZi5fcHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi5faW5kZW50X2luY3JlbWVudCA9IGluZGVudF9pbmNyZW1lbnQKKyAgICAgICAgc2VsZi5fbWF4X2hlbHBfcG9zaXRpb24gPSBtYXhfaGVscF9wb3NpdGlvbgorICAgICAgICBzZWxmLl93aWR0aCA9IHdpZHRoCisKKyAgICAgICAgc2VsZi5fY3VycmVudF9pbmRlbnQgPSAwCisgICAgICAgIHNlbGYuX2xldmVsID0gMAorICAgICAgICBzZWxmLl9hY3Rpb25fbWF4X2xlbmd0aCA9IDAKKworICAgICAgICBzZWxmLl9yb290X3NlY3Rpb24gPSBzZWxmLl9TZWN0aW9uKHNlbGYsIE5vbmUpCisgICAgICAgIHNlbGYuX2N1cnJlbnRfc2VjdGlvbiA9IHNlbGYuX3Jvb3Rfc2VjdGlvbgorCisgICAgICAgIHNlbGYuX3doaXRlc3BhY2VfbWF0Y2hlciA9IF9yZS5jb21waWxlKHInXHMrJykKKyAgICAgICAgc2VsZi5fbG9uZ19icmVha19tYXRjaGVyID0gX3JlLmNvbXBpbGUocidcblxuXG4rJykKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgU2VjdGlvbiBhbmQgaW5kZW50YXRpb24gbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBfaW5kZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jdXJyZW50X2luZGVudCArPSBzZWxmLl9pbmRlbnRfaW5jcmVtZW50CisgICAgICAgIHNlbGYuX2xldmVsICs9IDEKKworICAgIGRlZiBfZGVkZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jdXJyZW50X2luZGVudCAtPSBzZWxmLl9pbmRlbnRfaW5jcmVtZW50CisgICAgICAgIGFzc2VydCBzZWxmLl9jdXJyZW50X2luZGVudCA+PSAwLCAnSW5kZW50IGRlY3JlYXNlZCBiZWxvdyAwLicKKyAgICAgICAgc2VsZi5fbGV2ZWwgLT0gMQorCisgICAgY2xhc3MgX1NlY3Rpb24ob2JqZWN0KToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0dGVyLCBwYXJlbnQsIGhlYWRpbmc9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLmZvcm1hdHRlciA9IGZvcm1hdHRlcgorICAgICAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgICAgIHNlbGYuaGVhZGluZyA9IGhlYWRpbmcKKyAgICAgICAgICAgIHNlbGYuaXRlbXMgPSBbXQorCisgICAgICAgIGRlZiBmb3JtYXRfaGVscChzZWxmKToKKyAgICAgICAgICAgICMgZm9ybWF0IHRoZSBpbmRlbnRlZCBzZWN0aW9uCisgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5faW5kZW50KCkKKyAgICAgICAgICAgIGpvaW4gPSBzZWxmLmZvcm1hdHRlci5fam9pbl9wYXJ0cworICAgICAgICAgICAgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtczoKKyAgICAgICAgICAgICAgICBmdW5jKCphcmdzKQorICAgICAgICAgICAgaXRlbV9oZWxwID0gam9pbihbZnVuYygqYXJncykgZm9yIGZ1bmMsIGFyZ3MgaW4gc2VsZi5pdGVtc10pCisgICAgICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5fZGVkZW50KCkKKworICAgICAgICAgICAgIyByZXR1cm4gbm90aGluZyBpZiB0aGUgc2VjdGlvbiB3YXMgZW1wdHkKKyAgICAgICAgICAgIGlmIG5vdCBpdGVtX2hlbHA6CisgICAgICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICAgICAgICAgICMgYWRkIHRoZSBoZWFkaW5nIGlmIHRoZSBzZWN0aW9uIHdhcyBub24tZW1wdHkKKyAgICAgICAgICAgIGlmIHNlbGYuaGVhZGluZyBpcyBub3QgU1VQUFJFU1MgYW5kIHNlbGYuaGVhZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjdXJyZW50X2luZGVudCA9IHNlbGYuZm9ybWF0dGVyLl9jdXJyZW50X2luZGVudAorICAgICAgICAgICAgICAgIGhlYWRpbmcgPSAnJSpzJXM6XG4nICUgKGN1cnJlbnRfaW5kZW50LCAnJywgc2VsZi5oZWFkaW5nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoZWFkaW5nID0gJycKKworICAgICAgICAgICAgIyBqb2luIHRoZSBzZWN0aW9uLWluaXRpYWwgbmV3bGluZSwgdGhlIGhlYWRpbmcgYW5kIHRoZSBoZWxwCisgICAgICAgICAgICByZXR1cm4gam9pbihbJ1xuJywgaGVhZGluZywgaXRlbV9oZWxwLCAnXG4nXSkKKworICAgIGRlZiBfYWRkX2l0ZW0oc2VsZiwgZnVuYywgYXJncyk6CisgICAgICAgIHNlbGYuX2N1cnJlbnRfc2VjdGlvbi5pdGVtcy5hcHBlbmQoKGZ1bmMsIGFyZ3MpKQorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIE1lc3NhZ2UgYnVpbGRpbmcgbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09CisgICAgZGVmIHN0YXJ0X3NlY3Rpb24oc2VsZiwgaGVhZGluZyk6CisgICAgICAgIHNlbGYuX2luZGVudCgpCisgICAgICAgIHNlY3Rpb24gPSBzZWxmLl9TZWN0aW9uKHNlbGYsIHNlbGYuX2N1cnJlbnRfc2VjdGlvbiwgaGVhZGluZykKKyAgICAgICAgc2VsZi5fYWRkX2l0ZW0oc2VjdGlvbi5mb3JtYXRfaGVscCwgW10pCisgICAgICAgIHNlbGYuX2N1cnJlbnRfc2VjdGlvbiA9IHNlY3Rpb24KKworICAgIGRlZiBlbmRfc2VjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5fY3VycmVudF9zZWN0aW9uID0gc2VsZi5fY3VycmVudF9zZWN0aW9uLnBhcmVudAorICAgICAgICBzZWxmLl9kZWRlbnQoKQorCisgICAgZGVmIGFkZF90ZXh0KHNlbGYsIHRleHQpOgorICAgICAgICBpZiB0ZXh0IGlzIG5vdCBTVVBQUkVTUyBhbmQgdGV4dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2FkZF9pdGVtKHNlbGYuX2Zvcm1hdF90ZXh0LCBbdGV4dF0pCisKKyAgICBkZWYgYWRkX3VzYWdlKHNlbGYsIHVzYWdlLCBhY3Rpb25zLCBncm91cHMsIHByZWZpeD1Ob25lKToKKyAgICAgICAgaWYgdXNhZ2UgaXMgbm90IFNVUFBSRVNTOgorICAgICAgICAgICAgYXJncyA9IHVzYWdlLCBhY3Rpb25zLCBncm91cHMsIHByZWZpeAorICAgICAgICAgICAgc2VsZi5fYWRkX2l0ZW0oc2VsZi5fZm9ybWF0X3VzYWdlLCBhcmdzKQorCisgICAgZGVmIGFkZF9hcmd1bWVudChzZWxmLCBhY3Rpb24pOgorICAgICAgICBpZiBhY3Rpb24uaGVscCBpcyBub3QgU1VQUFJFU1M6CisKKyAgICAgICAgICAgICMgZmluZCBhbGwgaW52b2NhdGlvbnMKKyAgICAgICAgICAgIGdldF9pbnZvY2F0aW9uID0gc2VsZi5fZm9ybWF0X2FjdGlvbl9pbnZvY2F0aW9uCisgICAgICAgICAgICBpbnZvY2F0aW9ucyA9IFtnZXRfaW52b2NhdGlvbihhY3Rpb24pXQorICAgICAgICAgICAgZm9yIHN1YmFjdGlvbiBpbiBzZWxmLl9pdGVyX2luZGVudGVkX3N1YmFjdGlvbnMoYWN0aW9uKToKKyAgICAgICAgICAgICAgICBpbnZvY2F0aW9ucy5hcHBlbmQoZ2V0X2ludm9jYXRpb24oc3ViYWN0aW9uKSkKKworICAgICAgICAgICAgIyB1cGRhdGUgdGhlIG1heGltdW0gaXRlbSBsZW5ndGgKKyAgICAgICAgICAgIGludm9jYXRpb25fbGVuZ3RoID0gbWF4KFtsZW4ocykgZm9yIHMgaW4gaW52b2NhdGlvbnNdKQorICAgICAgICAgICAgYWN0aW9uX2xlbmd0aCA9IGludm9jYXRpb25fbGVuZ3RoICsgc2VsZi5fY3VycmVudF9pbmRlbnQKKyAgICAgICAgICAgIHNlbGYuX2FjdGlvbl9tYXhfbGVuZ3RoID0gbWF4KHNlbGYuX2FjdGlvbl9tYXhfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX2xlbmd0aCkKKworICAgICAgICAgICAgIyBhZGQgdGhlIGl0ZW0gdG8gdGhlIGxpc3QKKyAgICAgICAgICAgIHNlbGYuX2FkZF9pdGVtKHNlbGYuX2Zvcm1hdF9hY3Rpb24sIFthY3Rpb25dKQorCisgICAgZGVmIGFkZF9hcmd1bWVudHMoc2VsZiwgYWN0aW9ucyk6CisgICAgICAgIGZvciBhY3Rpb24gaW4gYWN0aW9uczoKKyAgICAgICAgICAgIHNlbGYuYWRkX2FyZ3VtZW50KGFjdGlvbikKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIEhlbHAtZm9ybWF0dGluZyBtZXRob2RzCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBmb3JtYXRfaGVscChzZWxmKToKKyAgICAgICAgaGVscCA9IHNlbGYuX3Jvb3Rfc2VjdGlvbi5mb3JtYXRfaGVscCgpCisgICAgICAgIGlmIGhlbHA6CisgICAgICAgICAgICBoZWxwID0gc2VsZi5fbG9uZ19icmVha19tYXRjaGVyLnN1YignXG5cbicsIGhlbHApCisgICAgICAgICAgICBoZWxwID0gaGVscC5zdHJpcCgnXG4nKSArICdcbicKKyAgICAgICAgcmV0dXJuIGhlbHAKKworICAgIGRlZiBfam9pbl9wYXJ0cyhzZWxmLCBwYXJ0X3N0cmluZ3MpOgorICAgICAgICByZXR1cm4gJycuam9pbihbcGFydAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBhcnQgaW4gcGFydF9zdHJpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXJ0IGFuZCBwYXJ0IGlzIG5vdCBTVVBQUkVTU10pCisKKyAgICBkZWYgX2Zvcm1hdF91c2FnZShzZWxmLCB1c2FnZSwgYWN0aW9ucywgZ3JvdXBzLCBwcmVmaXgpOgorICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgIHByZWZpeCA9IF8oJ3VzYWdlOiAnKQorCisgICAgICAgICMgaWYgdXNhZ2UgaXMgc3BlY2lmaWVkLCB1c2UgdGhhdAorICAgICAgICBpZiB1c2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHVzYWdlID0gdXNhZ2UgJSBkaWN0KHByb2c9c2VsZi5fcHJvZykKKworICAgICAgICAjIGlmIG5vIG9wdGlvbmFscyBvciBwb3NpdGlvbmFscyBhcmUgYXZhaWxhYmxlLCB1c2FnZSBpcyBqdXN0IHByb2cKKyAgICAgICAgZWxpZiB1c2FnZSBpcyBOb25lIGFuZCBub3QgYWN0aW9uczoKKyAgICAgICAgICAgIHVzYWdlID0gJyUocHJvZylzJyAlIGRpY3QocHJvZz1zZWxmLl9wcm9nKQorCisgICAgICAgICMgaWYgb3B0aW9uYWxzIGFuZCBwb3NpdGlvbmFscyBhcmUgYXZhaWxhYmxlLCBjYWxjdWxhdGUgdXNhZ2UKKyAgICAgICAgZWxpZiB1c2FnZSBpcyBOb25lOgorICAgICAgICAgICAgcHJvZyA9ICclKHByb2cpcycgJSBkaWN0KHByb2c9c2VsZi5fcHJvZykKKworICAgICAgICAgICAgIyBzcGxpdCBvcHRpb25hbHMgZnJvbSBwb3NpdGlvbmFscworICAgICAgICAgICAgb3B0aW9uYWxzID0gW10KKyAgICAgICAgICAgIHBvc2l0aW9uYWxzID0gW10KKyAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gYWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24ub3B0aW9uX3N0cmluZ3M6CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFscy5hcHBlbmQoYWN0aW9uKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxzLmFwcGVuZChhY3Rpb24pCisKKyAgICAgICAgICAgICMgYnVpbGQgZnVsbCB1c2FnZSBzdHJpbmcKKyAgICAgICAgICAgIGZvcm1hdCA9IHNlbGYuX2Zvcm1hdF9hY3Rpb25zX3VzYWdlCisgICAgICAgICAgICBhY3Rpb25fdXNhZ2UgPSBmb3JtYXQob3B0aW9uYWxzICsgcG9zaXRpb25hbHMsIGdyb3VwcykKKyAgICAgICAgICAgIHVzYWdlID0gJyAnLmpvaW4oW3MgZm9yIHMgaW4gW3Byb2csIGFjdGlvbl91c2FnZV0gaWYgc10pCisKKyAgICAgICAgICAgICMgd3JhcCB0aGUgdXNhZ2UgcGFydHMgaWYgaXQncyB0b28gbG9uZworICAgICAgICAgICAgdGV4dF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gc2VsZi5fY3VycmVudF9pbmRlbnQKKyAgICAgICAgICAgIGlmIGxlbihwcmVmaXgpICsgbGVuKHVzYWdlKSA+IHRleHRfd2lkdGg6CisKKyAgICAgICAgICAgICAgICAjIGJyZWFrIHVzYWdlIGludG8gd3JhcHBhYmxlIHBhcnRzCisgICAgICAgICAgICAgICAgcGFydF9yZWdleHAgPSByJ1woLio/XCkrfFxbLio/XF0rfFxTKycKKyAgICAgICAgICAgICAgICBvcHRfdXNhZ2UgPSBmb3JtYXQob3B0aW9uYWxzLCBncm91cHMpCisgICAgICAgICAgICAgICAgcG9zX3VzYWdlID0gZm9ybWF0KHBvc2l0aW9uYWxzLCBncm91cHMpCisgICAgICAgICAgICAgICAgb3B0X3BhcnRzID0gX3JlLmZpbmRhbGwocGFydF9yZWdleHAsIG9wdF91c2FnZSkKKyAgICAgICAgICAgICAgICBwb3NfcGFydHMgPSBfcmUuZmluZGFsbChwYXJ0X3JlZ2V4cCwgcG9zX3VzYWdlKQorICAgICAgICAgICAgICAgIGFzc2VydCAnICcuam9pbihvcHRfcGFydHMpID09IG9wdF91c2FnZQorICAgICAgICAgICAgICAgIGFzc2VydCAnICcuam9pbihwb3NfcGFydHMpID09IHBvc191c2FnZQorCisgICAgICAgICAgICAgICAgIyBoZWxwZXIgZm9yIHdyYXBwaW5nIGxpbmVzCisgICAgICAgICAgICAgICAgZGVmIGdldF9saW5lcyhwYXJ0cywgaW5kZW50LCBwcmVmaXg9Tm9uZSk6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IFtdCisgICAgICAgICAgICAgICAgICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbGVuID0gbGVuKHByZWZpeCkgLSAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2xlbiA9IGxlbihpbmRlbnQpIC0gMQorICAgICAgICAgICAgICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVfbGVuICsgMSArIGxlbihwYXJ0KSA+IHRleHRfd2lkdGg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcgJy5qb2luKGxpbmUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbGVuID0gbGVuKGluZGVudCkgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZChwYXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9sZW4gKz0gbGVuKHBhcnQpICsgMQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGluZGVudCArICcgJy5qb2luKGxpbmUpKQorICAgICAgICAgICAgICAgICAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1swXSA9IGxpbmVzWzBdW2xlbihpbmRlbnQpOl0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzCisKKyAgICAgICAgICAgICAgICAjIGlmIHByb2cgaXMgc2hvcnQsIGZvbGxvdyBpdCB3aXRoIG9wdGlvbmFscyBvciBwb3NpdGlvbmFscworICAgICAgICAgICAgICAgIGlmIGxlbihwcmVmaXgpICsgbGVuKHByb2cpIDw9IDAuNzUgKiB0ZXh0X3dpZHRoOgorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSAnICcgKiAobGVuKHByZWZpeCkgKyBsZW4ocHJvZykgKyAxKQorICAgICAgICAgICAgICAgICAgICBpZiBvcHRfcGFydHM6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IGdldF9saW5lcyhbcHJvZ10gKyBvcHRfcGFydHMsIGluZGVudCwgcHJlZml4KQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuZXh0ZW5kKGdldF9saW5lcyhwb3NfcGFydHMsIGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgcG9zX3BhcnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBnZXRfbGluZXMoW3Byb2ddICsgcG9zX3BhcnRzLCBpbmRlbnQsIHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gW3Byb2ddCisKKyAgICAgICAgICAgICAgICAjIGlmIHByb2cgaXMgbG9uZywgcHV0IGl0IG9uIGl0cyBvd24gbGluZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9ICcgJyAqIGxlbihwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIHBhcnRzID0gb3B0X3BhcnRzICsgcG9zX3BhcnRzCisgICAgICAgICAgICAgICAgICAgIGxpbmVzID0gZ2V0X2xpbmVzKHBhcnRzLCBpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lcykgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgbGluZXMuZXh0ZW5kKGdldF9saW5lcyhvcHRfcGFydHMsIGluZGVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lcy5leHRlbmQoZ2V0X2xpbmVzKHBvc19wYXJ0cywgaW5kZW50KSkKKyAgICAgICAgICAgICAgICAgICAgbGluZXMgPSBbcHJvZ10gKyBsaW5lcworCisgICAgICAgICAgICAgICAgIyBqb2luIGxpbmVzIGludG8gdXNhZ2UKKyAgICAgICAgICAgICAgICB1c2FnZSA9ICdcbicuam9pbihsaW5lcykKKworICAgICAgICAjIHByZWZpeCB3aXRoICd1c2FnZTonCisgICAgICAgIHJldHVybiAnJXMlc1xuXG4nICUgKHByZWZpeCwgdXNhZ2UpCisKKyAgICBkZWYgX2Zvcm1hdF9hY3Rpb25zX3VzYWdlKHNlbGYsIGFjdGlvbnMsIGdyb3Vwcyk6CisgICAgICAgICMgZmluZCBncm91cCBpbmRpY2VzIGFuZCBpZGVudGlmeSBhY3Rpb25zIGluIGdyb3VwcworICAgICAgICBncm91cF9hY3Rpb25zID0gc2V0KCkKKyAgICAgICAgaW5zZXJ0cyA9IHt9CisgICAgICAgIGZvciBncm91cCBpbiBncm91cHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBhY3Rpb25zLmluZGV4KGdyb3VwLl9ncm91cF9hY3Rpb25zWzBdKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW5kID0gc3RhcnQgKyBsZW4oZ3JvdXAuX2dyb3VwX2FjdGlvbnMpCisgICAgICAgICAgICAgICAgaWYgYWN0aW9uc1tzdGFydDplbmRdID09IGdyb3VwLl9ncm91cF9hY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICBmb3IgYWN0aW9uIGluIGdyb3VwLl9ncm91cF9hY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYWN0aW9ucy5hZGQoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgZ3JvdXAucmVxdWlyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdGFydCBpbiBpbnNlcnRzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydHNbc3RhcnRdICs9ICcgWycKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0c1tzdGFydF0gPSAnWycKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydHNbZW5kXSA9ICddJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RhcnQgaW4gaW5zZXJ0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRzW3N0YXJ0XSArPSAnICgnCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydHNbc3RhcnRdID0gJygnCisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRzW2VuZF0gPSAnKScKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnQgKyAxLCBlbmQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0c1tpXSA9ICd8JworCisgICAgICAgICMgY29sbGVjdCBhbGwgYWN0aW9ucyBmb3JtYXQgc3RyaW5ncworICAgICAgICBwYXJ0cyA9IFtdCisgICAgICAgIGZvciBpLCBhY3Rpb24gaW4gZW51bWVyYXRlKGFjdGlvbnMpOgorCisgICAgICAgICAgICAjIHN1cHByZXNzZWQgYXJndW1lbnRzIGFyZSBtYXJrZWQgd2l0aCBOb25lCisgICAgICAgICAgICAjIHJlbW92ZSB8IHNlcGFyYXRvcnMgZm9yIHN1cHByZXNzZWQgYXJndW1lbnRzCisgICAgICAgICAgICBpZiBhY3Rpb24uaGVscCBpcyBTVVBQUkVTUzoKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBpbnNlcnRzLmdldChpKSA9PSAnfCc6CisgICAgICAgICAgICAgICAgICAgIGluc2VydHMucG9wKGkpCisgICAgICAgICAgICAgICAgZWxpZiBpbnNlcnRzLmdldChpICsgMSkgPT0gJ3wnOgorICAgICAgICAgICAgICAgICAgICBpbnNlcnRzLnBvcChpICsgMSkKKworICAgICAgICAgICAgIyBwcm9kdWNlIGFsbCBhcmcgc3RyaW5ncworICAgICAgICAgICAgZWxpZiBub3QgYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgICAgIHBhcnQgPSBzZWxmLl9mb3JtYXRfYXJncyhhY3Rpb24sIGFjdGlvbi5kZXN0KQorCisgICAgICAgICAgICAgICAgIyBpZiBpdCdzIGluIGEgZ3JvdXAsIHN0cmlwIHRoZSBvdXRlciBbXQorICAgICAgICAgICAgICAgIGlmIGFjdGlvbiBpbiBncm91cF9hY3Rpb25zOgorICAgICAgICAgICAgICAgICAgICBpZiBwYXJ0WzBdID09ICdbJyBhbmQgcGFydFstMV0gPT0gJ10nOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydCA9IHBhcnRbMTotMV0KKworICAgICAgICAgICAgICAgICMgYWRkIHRoZSBhY3Rpb24gc3RyaW5nIHRvIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCisKKyAgICAgICAgICAgICMgcHJvZHVjZSB0aGUgZmlyc3Qgd2F5IHRvIGludm9rZSB0aGUgb3B0aW9uIGluIGJyYWNrZXRzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmcgPSBhY3Rpb24ub3B0aW9uX3N0cmluZ3NbMF0KKworICAgICAgICAgICAgICAgICMgaWYgdGhlIE9wdGlvbmFsIGRvZXNuJ3QgdGFrZSBhIHZhbHVlLCBmb3JtYXQgaXM6CisgICAgICAgICAgICAgICAgIyAgICAtcyBvciAtLWxvbmcKKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24ubmFyZ3MgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcGFydCA9ICclcycgJSBvcHRpb25fc3RyaW5nCisKKyAgICAgICAgICAgICAgICAjIGlmIHRoZSBPcHRpb25hbCB0YWtlcyBhIHZhbHVlLCBmb3JtYXQgaXM6CisgICAgICAgICAgICAgICAgIyAgICAtcyBBUkdTIG9yIC0tbG9uZyBBUkdTCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCA9IGFjdGlvbi5kZXN0LnVwcGVyKCkKKyAgICAgICAgICAgICAgICAgICAgYXJnc19zdHJpbmcgPSBzZWxmLl9mb3JtYXRfYXJncyhhY3Rpb24sIGRlZmF1bHQpCisgICAgICAgICAgICAgICAgICAgIHBhcnQgPSAnJXMgJXMnICUgKG9wdGlvbl9zdHJpbmcsIGFyZ3Nfc3RyaW5nKQorCisgICAgICAgICAgICAgICAgIyBtYWtlIGl0IGxvb2sgb3B0aW9uYWwgaWYgaXQncyBub3QgcmVxdWlyZWQgb3IgaW4gYSBncm91cAorICAgICAgICAgICAgICAgIGlmIG5vdCBhY3Rpb24ucmVxdWlyZWQgYW5kIGFjdGlvbiBub3QgaW4gZ3JvdXBfYWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgcGFydCA9ICdbJXNdJyAlIHBhcnQKKworICAgICAgICAgICAgICAgICMgYWRkIHRoZSBhY3Rpb24gc3RyaW5nIHRvIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKHBhcnQpCisKKyAgICAgICAgIyBpbnNlcnQgdGhpbmdzIGF0IHRoZSBuZWNlc3NhcnkgaW5kaWNlcworICAgICAgICBmb3IgaSBpbiBzb3J0ZWQoaW5zZXJ0cywgcmV2ZXJzZT1UcnVlKToKKyAgICAgICAgICAgIHBhcnRzW2k6aV0gPSBbaW5zZXJ0c1tpXV0KKworICAgICAgICAjIGpvaW4gYWxsIHRoZSBhY3Rpb24gaXRlbXMgd2l0aCBzcGFjZXMKKyAgICAgICAgdGV4dCA9ICcgJy5qb2luKFtpdGVtIGZvciBpdGVtIGluIHBhcnRzIGlmIGl0ZW0gaXMgbm90IE5vbmVdKQorCisgICAgICAgICMgY2xlYW4gdXAgc2VwYXJhdG9ycyBmb3IgbXV0dWFsbHkgZXhjbHVzaXZlIGdyb3VwcworICAgICAgICBvcGVuID0gcidbXFsoXScKKyAgICAgICAgY2xvc2UgPSByJ1tcXSldJworICAgICAgICB0ZXh0ID0gX3JlLnN1YihyJyglcykgJyAlIG9wZW4sIHInXDEnLCB0ZXh0KQorICAgICAgICB0ZXh0ID0gX3JlLnN1YihyJyAoJXMpJyAlIGNsb3NlLCByJ1wxJywgdGV4dCkKKyAgICAgICAgdGV4dCA9IF9yZS5zdWIociclcyAqJXMnICUgKG9wZW4sIGNsb3NlKSwgcicnLCB0ZXh0KQorICAgICAgICB0ZXh0ID0gX3JlLnN1YihyJ1woKFtefF0qKVwpJywgcidcMScsIHRleHQpCisgICAgICAgIHRleHQgPSB0ZXh0LnN0cmlwKCkKKworICAgICAgICAjIHJldHVybiB0aGUgdGV4dAorICAgICAgICByZXR1cm4gdGV4dAorCisgICAgZGVmIF9mb3JtYXRfdGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgaWYgJyUocHJvZyknIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dCAlIGRpY3QocHJvZz1zZWxmLl9wcm9nKQorICAgICAgICB0ZXh0X3dpZHRoID0gc2VsZi5fd2lkdGggLSBzZWxmLl9jdXJyZW50X2luZGVudAorICAgICAgICBpbmRlbnQgPSAnICcgKiBzZWxmLl9jdXJyZW50X2luZGVudAorICAgICAgICByZXR1cm4gc2VsZi5fZmlsbF90ZXh0KHRleHQsIHRleHRfd2lkdGgsIGluZGVudCkgKyAnXG5cbicKKworICAgIGRlZiBfZm9ybWF0X2FjdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICAjIGRldGVybWluZSB0aGUgcmVxdWlyZWQgd2lkdGggYW5kIHRoZSBlbnRyeSBsYWJlbAorICAgICAgICBoZWxwX3Bvc2l0aW9uID0gbWluKHNlbGYuX2FjdGlvbl9tYXhfbGVuZ3RoICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYXhfaGVscF9wb3NpdGlvbikKKyAgICAgICAgaGVscF93aWR0aCA9IHNlbGYuX3dpZHRoIC0gaGVscF9wb3NpdGlvbgorICAgICAgICBhY3Rpb25fd2lkdGggPSBoZWxwX3Bvc2l0aW9uIC0gc2VsZi5fY3VycmVudF9pbmRlbnQgLSAyCisgICAgICAgIGFjdGlvbl9oZWFkZXIgPSBzZWxmLl9mb3JtYXRfYWN0aW9uX2ludm9jYXRpb24oYWN0aW9uKQorCisgICAgICAgICMgaG8gbmVscDsgc3RhcnQgb24gc2FtZSBsaW5lIGFuZCBhZGQgYSBmaW5hbCBuZXdsaW5lCisgICAgICAgIGlmIG5vdCBhY3Rpb24uaGVscDoKKyAgICAgICAgICAgIHR1cCA9IHNlbGYuX2N1cnJlbnRfaW5kZW50LCAnJywgYWN0aW9uX2hlYWRlcgorICAgICAgICAgICAgYWN0aW9uX2hlYWRlciA9ICclKnMlc1xuJyAlIHR1cAorCisgICAgICAgICMgc2hvcnQgYWN0aW9uIG5hbWU7IHN0YXJ0IG9uIHRoZSBzYW1lIGxpbmUgYW5kIHBhZCB0d28gc3BhY2VzCisgICAgICAgIGVsaWYgbGVuKGFjdGlvbl9oZWFkZXIpIDw9IGFjdGlvbl93aWR0aDoKKyAgICAgICAgICAgIHR1cCA9IHNlbGYuX2N1cnJlbnRfaW5kZW50LCAnJywgYWN0aW9uX3dpZHRoLCBhY3Rpb25faGVhZGVyCisgICAgICAgICAgICBhY3Rpb25faGVhZGVyID0gJyUqcyUtKnMgICcgJSB0dXAKKyAgICAgICAgICAgIGluZGVudF9maXJzdCA9IDAKKworICAgICAgICAjIGxvbmcgYWN0aW9uIG5hbWU7IHN0YXJ0IG9uIHRoZSBuZXh0IGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR1cCA9IHNlbGYuX2N1cnJlbnRfaW5kZW50LCAnJywgYWN0aW9uX2hlYWRlcgorICAgICAgICAgICAgYWN0aW9uX2hlYWRlciA9ICclKnMlc1xuJyAlIHR1cAorICAgICAgICAgICAgaW5kZW50X2ZpcnN0ID0gaGVscF9wb3NpdGlvbgorCisgICAgICAgICMgY29sbGVjdCB0aGUgcGllY2VzIG9mIHRoZSBhY3Rpb24gaGVscAorICAgICAgICBwYXJ0cyA9IFthY3Rpb25faGVhZGVyXQorCisgICAgICAgICMgaWYgdGhlcmUgd2FzIGhlbHAgZm9yIHRoZSBhY3Rpb24sIGFkZCBsaW5lcyBvZiBoZWxwIHRleHQKKyAgICAgICAgaWYgYWN0aW9uLmhlbHA6CisgICAgICAgICAgICBoZWxwX3RleHQgPSBzZWxmLl9leHBhbmRfaGVscChhY3Rpb24pCisgICAgICAgICAgICBoZWxwX2xpbmVzID0gc2VsZi5fc3BsaXRfbGluZXMoaGVscF90ZXh0LCBoZWxwX3dpZHRoKQorICAgICAgICAgICAgcGFydHMuYXBwZW5kKCclKnMlc1xuJyAlIChpbmRlbnRfZmlyc3QsICcnLCBoZWxwX2xpbmVzWzBdKSkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGhlbHBfbGluZXNbMTpdOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnJSpzJXNcbicgJSAoaGVscF9wb3NpdGlvbiwgJycsIGxpbmUpKQorCisgICAgICAgICMgb3IgYWRkIGEgbmV3bGluZSBpZiB0aGUgZGVzY3JpcHRpb24gZG9lc24ndCBlbmQgd2l0aCBvbmUKKyAgICAgICAgZWxpZiBub3QgYWN0aW9uX2hlYWRlci5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZCgnXG4nKQorCisgICAgICAgICMgaWYgdGhlcmUgYXJlIGFueSBzdWItYWN0aW9ucywgYWRkIHRoZWlyIGhlbHAgYXMgd2VsbAorICAgICAgICBmb3Igc3ViYWN0aW9uIGluIHNlbGYuX2l0ZXJfaW5kZW50ZWRfc3ViYWN0aW9ucyhhY3Rpb24pOgorICAgICAgICAgICAgcGFydHMuYXBwZW5kKHNlbGYuX2Zvcm1hdF9hY3Rpb24oc3ViYWN0aW9uKSkKKworICAgICAgICAjIHJldHVybiBhIHNpbmdsZSBzdHJpbmcKKyAgICAgICAgcmV0dXJuIHNlbGYuX2pvaW5fcGFydHMocGFydHMpCisKKyAgICBkZWYgX2Zvcm1hdF9hY3Rpb25faW52b2NhdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICBpZiBub3QgYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgbWV0YXZhciwgPSBzZWxmLl9tZXRhdmFyX2Zvcm1hdHRlcihhY3Rpb24sIGFjdGlvbi5kZXN0KSgxKQorICAgICAgICAgICAgcmV0dXJuIG1ldGF2YXIKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFydHMgPSBbXQorCisgICAgICAgICAgICAjIGlmIHRoZSBPcHRpb25hbCBkb2Vzbid0IHRha2UgYSB2YWx1ZSwgZm9ybWF0IGlzOgorICAgICAgICAgICAgIyAgICAtcywgLS1sb25nCisgICAgICAgICAgICBpZiBhY3Rpb24ubmFyZ3MgPT0gMDoKKyAgICAgICAgICAgICAgICBwYXJ0cy5leHRlbmQoYWN0aW9uLm9wdGlvbl9zdHJpbmdzKQorCisgICAgICAgICAgICAjIGlmIHRoZSBPcHRpb25hbCB0YWtlcyBhIHZhbHVlLCBmb3JtYXQgaXM6CisgICAgICAgICAgICAjICAgIC1zIEFSR1MsIC0tbG9uZyBBUkdTCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlZmF1bHQgPSBhY3Rpb24uZGVzdC51cHBlcigpCisgICAgICAgICAgICAgICAgYXJnc19zdHJpbmcgPSBzZWxmLl9mb3JtYXRfYXJncyhhY3Rpb24sIGRlZmF1bHQpCisgICAgICAgICAgICAgICAgZm9yIG9wdGlvbl9zdHJpbmcgaW4gYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJyVzICVzJyAlIChvcHRpb25fc3RyaW5nLCBhcmdzX3N0cmluZykpCisKKyAgICAgICAgICAgIHJldHVybiAnLCAnLmpvaW4ocGFydHMpCisKKyAgICBkZWYgX21ldGF2YXJfZm9ybWF0dGVyKHNlbGYsIGFjdGlvbiwgZGVmYXVsdF9tZXRhdmFyKToKKyAgICAgICAgaWYgYWN0aW9uLm1ldGF2YXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXN1bHQgPSBhY3Rpb24ubWV0YXZhcgorICAgICAgICBlbGlmIGFjdGlvbi5jaG9pY2VzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2hvaWNlX3N0cnMgPSBbc3RyKGNob2ljZSkgZm9yIGNob2ljZSBpbiBhY3Rpb24uY2hvaWNlc10KKyAgICAgICAgICAgIHJlc3VsdCA9ICd7JXN9JyAlICcsJy5qb2luKGNob2ljZV9zdHJzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdF9tZXRhdmFyCisKKyAgICAgICAgZGVmIGZvcm1hdCh0dXBsZV9zaXplKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCB0dXBsZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCwgKSAqIHR1cGxlX3NpemUKKyAgICAgICAgcmV0dXJuIGZvcm1hdAorCisgICAgZGVmIF9mb3JtYXRfYXJncyhzZWxmLCBhY3Rpb24sIGRlZmF1bHRfbWV0YXZhcik6CisgICAgICAgIGdldF9tZXRhdmFyID0gc2VsZi5fbWV0YXZhcl9mb3JtYXR0ZXIoYWN0aW9uLCBkZWZhdWx0X21ldGF2YXIpCisgICAgICAgIGlmIGFjdGlvbi5uYXJncyBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gJyVzJyAlIGdldF9tZXRhdmFyKDEpCisgICAgICAgIGVsaWYgYWN0aW9uLm5hcmdzID09IE9QVElPTkFMOgorICAgICAgICAgICAgcmVzdWx0ID0gJ1slc10nICUgZ2V0X21ldGF2YXIoMSkKKyAgICAgICAgZWxpZiBhY3Rpb24ubmFyZ3MgPT0gWkVST19PUl9NT1JFOgorICAgICAgICAgICAgcmVzdWx0ID0gJ1slcyBbJXMgLi4uXV0nICUgZ2V0X21ldGF2YXIoMikKKyAgICAgICAgZWxpZiBhY3Rpb24ubmFyZ3MgPT0gT05FX09SX01PUkU6CisgICAgICAgICAgICByZXN1bHQgPSAnJXMgWyVzIC4uLl0nICUgZ2V0X21ldGF2YXIoMikKKyAgICAgICAgZWxpZiBhY3Rpb24ubmFyZ3MgPT0gUkVNQUlOREVSOgorICAgICAgICAgICAgcmVzdWx0ID0gJy4uLicKKyAgICAgICAgZWxpZiBhY3Rpb24ubmFyZ3MgPT0gUEFSU0VSOgorICAgICAgICAgICAgcmVzdWx0ID0gJyVzIC4uLicgJSBnZXRfbWV0YXZhcigxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9ybWF0cyA9IFsnJXMnIGZvciBfIGluIHJhbmdlKGFjdGlvbi5uYXJncyldCisgICAgICAgICAgICByZXN1bHQgPSAnICcuam9pbihmb3JtYXRzKSAlIGdldF9tZXRhdmFyKGFjdGlvbi5uYXJncykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9leHBhbmRfaGVscChzZWxmLCBhY3Rpb24pOgorICAgICAgICBwYXJhbXMgPSBkaWN0KHZhcnMoYWN0aW9uKSwgcHJvZz1zZWxmLl9wcm9nKQorICAgICAgICBmb3IgbmFtZSBpbiBsaXN0KHBhcmFtcyk6CisgICAgICAgICAgICBpZiBwYXJhbXNbbmFtZV0gaXMgU1VQUFJFU1M6CisgICAgICAgICAgICAgICAgZGVsIHBhcmFtc1tuYW1lXQorICAgICAgICBmb3IgbmFtZSBpbiBsaXN0KHBhcmFtcyk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHBhcmFtc1tuYW1lXSwgJ19fbmFtZV9fJyk6CisgICAgICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gcGFyYW1zW25hbWVdLl9fbmFtZV9fCisgICAgICAgIGlmIHBhcmFtcy5nZXQoJ2Nob2ljZXMnKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNob2ljZXNfc3RyID0gJywgJy5qb2luKFtzdHIoYykgZm9yIGMgaW4gcGFyYW1zWydjaG9pY2VzJ11dKQorICAgICAgICAgICAgcGFyYW1zWydjaG9pY2VzJ10gPSBjaG9pY2VzX3N0cgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2hlbHBfc3RyaW5nKGFjdGlvbikgJSBwYXJhbXMKKworICAgIGRlZiBfaXRlcl9pbmRlbnRlZF9zdWJhY3Rpb25zKHNlbGYsIGFjdGlvbik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdldF9zdWJhY3Rpb25zID0gYWN0aW9uLl9nZXRfc3ViYWN0aW9ucworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9pbmRlbnQoKQorICAgICAgICAgICAgZm9yIHN1YmFjdGlvbiBpbiBnZXRfc3ViYWN0aW9ucygpOgorICAgICAgICAgICAgICAgIHlpZWxkIHN1YmFjdGlvbgorICAgICAgICAgICAgc2VsZi5fZGVkZW50KCkKKworICAgIGRlZiBfc3BsaXRfbGluZXMoc2VsZiwgdGV4dCwgd2lkdGgpOgorICAgICAgICB0ZXh0ID0gc2VsZi5fd2hpdGVzcGFjZV9tYXRjaGVyLnN1YignICcsIHRleHQpLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuIF90ZXh0d3JhcC53cmFwKHRleHQsIHdpZHRoKQorCisgICAgZGVmIF9maWxsX3RleHQoc2VsZiwgdGV4dCwgd2lkdGgsIGluZGVudCk6CisgICAgICAgIHRleHQgPSBzZWxmLl93aGl0ZXNwYWNlX21hdGNoZXIuc3ViKCcgJywgdGV4dCkuc3RyaXAoKQorICAgICAgICByZXR1cm4gX3RleHR3cmFwLmZpbGwodGV4dCwgd2lkdGgsIGluaXRpYWxfaW5kZW50PWluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2luZGVudD1pbmRlbnQpCisKKyAgICBkZWYgX2dldF9oZWxwX3N0cmluZyhzZWxmLCBhY3Rpb24pOgorICAgICAgICByZXR1cm4gYWN0aW9uLmhlbHAKKworCitjbGFzcyBSYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIoSGVscEZvcm1hdHRlcik6CisgICAgIiIiSGVscCBtZXNzYWdlIGZvcm1hdHRlciB3aGljaCByZXRhaW5zIGFueSBmb3JtYXR0aW5nIGluIGRlc2NyaXB0aW9ucy4KKworICAgIE9ubHkgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBpcyBjb25zaWRlcmVkIGEgcHVibGljIEFQSS4gQWxsIHRoZSBtZXRob2RzCisgICAgcHJvdmlkZWQgYnkgdGhlIGNsYXNzIGFyZSBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAgICAiIiIKKworICAgIGRlZiBfZmlsbF90ZXh0KHNlbGYsIHRleHQsIHdpZHRoLCBpbmRlbnQpOgorICAgICAgICByZXR1cm4gJycuam9pbihbaW5kZW50ICsgbGluZSBmb3IgbGluZSBpbiB0ZXh0LnNwbGl0bGluZXMoVHJ1ZSldKQorCisKK2NsYXNzIFJhd1RleHRIZWxwRm9ybWF0dGVyKFJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlcik6CisgICAgIiIiSGVscCBtZXNzYWdlIGZvcm1hdHRlciB3aGljaCByZXRhaW5zIGZvcm1hdHRpbmcgb2YgYWxsIGhlbHAgdGV4dC4KKworICAgIE9ubHkgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBpcyBjb25zaWRlcmVkIGEgcHVibGljIEFQSS4gQWxsIHRoZSBtZXRob2RzCisgICAgcHJvdmlkZWQgYnkgdGhlIGNsYXNzIGFyZSBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAgICAiIiIKKworICAgIGRlZiBfc3BsaXRfbGluZXMoc2VsZiwgdGV4dCwgd2lkdGgpOgorICAgICAgICByZXR1cm4gdGV4dC5zcGxpdGxpbmVzKCkKKworCitjbGFzcyBBcmd1bWVudERlZmF1bHRzSGVscEZvcm1hdHRlcihIZWxwRm9ybWF0dGVyKToKKyAgICAiIiJIZWxwIG1lc3NhZ2UgZm9ybWF0dGVyIHdoaWNoIGFkZHMgZGVmYXVsdCB2YWx1ZXMgdG8gYXJndW1lbnQgaGVscC4KKworICAgIE9ubHkgdGhlIG5hbWUgb2YgdGhpcyBjbGFzcyBpcyBjb25zaWRlcmVkIGEgcHVibGljIEFQSS4gQWxsIHRoZSBtZXRob2RzCisgICAgcHJvdmlkZWQgYnkgdGhlIGNsYXNzIGFyZSBjb25zaWRlcmVkIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAgICAiIiIKKworICAgIGRlZiBfZ2V0X2hlbHBfc3RyaW5nKHNlbGYsIGFjdGlvbik6CisgICAgICAgIGhlbHAgPSBhY3Rpb24uaGVscAorICAgICAgICBpZiAnJShkZWZhdWx0KScgbm90IGluIGFjdGlvbi5oZWxwOgorICAgICAgICAgICAgaWYgYWN0aW9uLmRlZmF1bHQgaXMgbm90IFNVUFBSRVNTOgorICAgICAgICAgICAgICAgIGRlZmF1bHRpbmdfbmFyZ3MgPSBbT1BUSU9OQUwsIFpFUk9fT1JfTU9SRV0KKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24ub3B0aW9uX3N0cmluZ3Mgb3IgYWN0aW9uLm5hcmdzIGluIGRlZmF1bHRpbmdfbmFyZ3M6CisgICAgICAgICAgICAgICAgICAgIGhlbHAgKz0gJyAoZGVmYXVsdDogJShkZWZhdWx0KXMpJworICAgICAgICByZXR1cm4gaGVscAorCisKKyMgPT09PT09PT09PT09PT09PT09PT09CisjIE9wdGlvbnMgYW5kIEFyZ3VtZW50cworIyA9PT09PT09PT09PT09PT09PT09PT0KKworZGVmIF9nZXRfYWN0aW9uX25hbWUoYXJndW1lbnQpOgorICAgIGlmIGFyZ3VtZW50IGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxpZiBhcmd1bWVudC5vcHRpb25fc3RyaW5nczoKKyAgICAgICAgcmV0dXJuICAnLycuam9pbihhcmd1bWVudC5vcHRpb25fc3RyaW5ncykKKyAgICBlbGlmIGFyZ3VtZW50Lm1ldGF2YXIgbm90IGluIChOb25lLCBTVVBQUkVTUyk6CisgICAgICAgIHJldHVybiBhcmd1bWVudC5tZXRhdmFyCisgICAgZWxpZiBhcmd1bWVudC5kZXN0IG5vdCBpbiAoTm9uZSwgU1VQUFJFU1MpOgorICAgICAgICByZXR1cm4gYXJndW1lbnQuZGVzdAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgQXJndW1lbnRFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkFuIGVycm9yIGZyb20gY3JlYXRpbmcgb3IgdXNpbmcgYW4gYXJndW1lbnQgKG9wdGlvbmFsIG9yIHBvc2l0aW9uYWwpLgorCisgICAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGlzIGV4Y2VwdGlvbiBpcyB0aGUgbWVzc2FnZSwgYXVnbWVudGVkIHdpdGgKKyAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXJndW1lbnQgdGhhdCBjYXVzZWQgaXQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJndW1lbnQsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLmFyZ3VtZW50X25hbWUgPSBfZ2V0X2FjdGlvbl9uYW1lKGFyZ3VtZW50KQorICAgICAgICBzZWxmLm1lc3NhZ2UgPSBtZXNzYWdlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hcmd1bWVudF9uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBmb3JtYXQgPSAnJShtZXNzYWdlKXMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3JtYXQgPSAnYXJndW1lbnQgJShhcmd1bWVudF9uYW1lKXM6ICUobWVzc2FnZSlzJworICAgICAgICByZXR1cm4gZm9ybWF0ICUgZGljdChtZXNzYWdlPXNlbGYubWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRfbmFtZT1zZWxmLmFyZ3VtZW50X25hbWUpCisKKworY2xhc3MgQXJndW1lbnRUeXBlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJBbiBlcnJvciBmcm9tIHRyeWluZyB0byBjb252ZXJ0IGEgY29tbWFuZCBsaW5lIHN0cmluZyB0byBhIHR5cGUuIiIiCisgICAgcGFzcworCisKKyMgPT09PT09PT09PT09PT0KKyMgQWN0aW9uIGNsYXNzZXMKKyMgPT09PT09PT09PT09PT0KKworY2xhc3MgQWN0aW9uKF9BdHRyaWJ1dGVIb2xkZXIpOgorICAgICIiIkluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBjb252ZXJ0IGNvbW1hbmQgbGluZSBzdHJpbmdzIHRvIFB5dGhvbiBvYmplY3RzLgorCisgICAgQWN0aW9uIG9iamVjdHMgYXJlIHVzZWQgYnkgYW4gQXJndW1lbnRQYXJzZXIgdG8gcmVwcmVzZW50IHRoZSBpbmZvcm1hdGlvbgorICAgIG5lZWRlZCB0byBwYXJzZSBhIHNpbmdsZSBhcmd1bWVudCBmcm9tIG9uZSBvciBtb3JlIHN0cmluZ3MgZnJvbSB0aGUKKyAgICBjb21tYW5kIGxpbmUuIFRoZSBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGUgQWN0aW9uIGNvbnN0cnVjdG9yIGFyZSBhbHNvCisgICAgYWxsIGF0dHJpYnV0ZXMgb2YgQWN0aW9uIGluc3RhbmNlcy4KKworICAgIEtleXdvcmQgQXJndW1lbnRzOgorCisgICAgICAgIC0gb3B0aW9uX3N0cmluZ3MgLS0gQSBsaXN0IG9mIGNvbW1hbmQtbGluZSBvcHRpb24gc3RyaW5ncyB3aGljaAorICAgICAgICAgICAgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFjdGlvbi4KKworICAgICAgICAtIGRlc3QgLS0gVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBob2xkIHRoZSBjcmVhdGVkIG9iamVjdChzKQorCisgICAgICAgIC0gbmFyZ3MgLS0gVGhlIG51bWJlciBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRoYXQgc2hvdWxkIGJlCisgICAgICAgICAgICBjb25zdW1lZC4gQnkgZGVmYXVsdCwgb25lIGFyZ3VtZW50IHdpbGwgYmUgY29uc3VtZWQgYW5kIGEgc2luZ2xlCisgICAgICAgICAgICB2YWx1ZSB3aWxsIGJlIHByb2R1Y2VkLiAgT3RoZXIgdmFsdWVzIGluY2x1ZGU6CisgICAgICAgICAgICAgICAgLSBOIChhbiBpbnRlZ2VyKSBjb25zdW1lcyBOIGFyZ3VtZW50cyAoYW5kIHByb2R1Y2VzIGEgbGlzdCkKKyAgICAgICAgICAgICAgICAtICc/JyBjb25zdW1lcyB6ZXJvIG9yIG9uZSBhcmd1bWVudHMKKyAgICAgICAgICAgICAgICAtICcqJyBjb25zdW1lcyB6ZXJvIG9yIG1vcmUgYXJndW1lbnRzIChhbmQgcHJvZHVjZXMgYSBsaXN0KQorICAgICAgICAgICAgICAgIC0gJysnIGNvbnN1bWVzIG9uZSBvciBtb3JlIGFyZ3VtZW50cyAoYW5kIHByb2R1Y2VzIGEgbGlzdCkKKyAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBkZWZhdWx0IGFuZCBuYXJncz0xIGlzIHRoYXQKKyAgICAgICAgICAgIHdpdGggdGhlIGRlZmF1bHQsIGEgc2luZ2xlIHZhbHVlIHdpbGwgYmUgcHJvZHVjZWQsIHdoaWxlIHdpdGgKKyAgICAgICAgICAgIG5hcmdzPTEsIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlIHZhbHVlIHdpbGwgYmUgcHJvZHVjZWQuCisKKyAgICAgICAgLSBjb25zdCAtLSBUaGUgdmFsdWUgdG8gYmUgcHJvZHVjZWQgaWYgdGhlIG9wdGlvbiBpcyBzcGVjaWZpZWQgYW5kIHRoZQorICAgICAgICAgICAgb3B0aW9uIHVzZXMgYW4gYWN0aW9uIHRoYXQgdGFrZXMgbm8gdmFsdWVzLgorCisgICAgICAgIC0gZGVmYXVsdCAtLSBUaGUgdmFsdWUgdG8gYmUgcHJvZHVjZWQgaWYgdGhlIG9wdGlvbiBpcyBub3Qgc3BlY2lmaWVkLgorCisgICAgICAgIC0gdHlwZSAtLSBBIGNhbGxhYmxlIHRoYXQgYWNjZXB0cyBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQsIGFuZAorICAgICAgICAgICAgcmV0dXJucyB0aGUgY29udmVydGVkIHZhbHVlLiAgVGhlIHN0YW5kYXJkIFB5dGhvbiB0eXBlcyBzdHIsIGludCwKKyAgICAgICAgICAgIGZsb2F0LCBhbmQgY29tcGxleCBhcmUgdXNlZnVsIGV4YW1wbGVzIG9mIHN1Y2ggY2FsbGFibGVzLiAgSWYgTm9uZSwKKyAgICAgICAgICAgIHN0ciBpcyB1c2VkLgorCisgICAgICAgIC0gY2hvaWNlcyAtLSBBIGNvbnRhaW5lciBvZiB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgYWxsb3dlZC4gSWYgbm90IE5vbmUsCisgICAgICAgICAgICBhZnRlciBhIGNvbW1hbmQtbGluZSBhcmd1bWVudCBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICB0eXBlLCBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQgaWYgaXQgaXMgbm90IGEgbWVtYmVyIG9mIHRoaXMKKyAgICAgICAgICAgIGNvbGxlY3Rpb24uCisKKyAgICAgICAgLSByZXF1aXJlZCAtLSBUcnVlIGlmIHRoZSBhY3Rpb24gbXVzdCBhbHdheXMgYmUgc3BlY2lmaWVkIGF0IHRoZQorICAgICAgICAgICAgY29tbWFuZCBsaW5lLiBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igb3B0aW9uYWwgY29tbWFuZC1saW5lCisgICAgICAgICAgICBhcmd1bWVudHMuCisKKyAgICAgICAgLSBoZWxwIC0tIFRoZSBoZWxwIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhcmd1bWVudC4KKworICAgICAgICAtIG1ldGF2YXIgLS0gVGhlIG5hbWUgdG8gYmUgdXNlZCBmb3IgdGhlIG9wdGlvbidzIGFyZ3VtZW50IHdpdGggdGhlCisgICAgICAgICAgICBoZWxwIHN0cmluZy4gSWYgTm9uZSwgdGhlICdkZXN0JyB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgIG5hcmdzPU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnN0PU5vbmUsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdHlwZT1Ob25lLAorICAgICAgICAgICAgICAgICBjaG9pY2VzPU5vbmUsCisgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPU5vbmUsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9Tm9uZSk6CisgICAgICAgIHNlbGYub3B0aW9uX3N0cmluZ3MgPSBvcHRpb25fc3RyaW5ncworICAgICAgICBzZWxmLmRlc3QgPSBkZXN0CisgICAgICAgIHNlbGYubmFyZ3MgPSBuYXJncworICAgICAgICBzZWxmLmNvbnN0ID0gY29uc3QKKyAgICAgICAgc2VsZi5kZWZhdWx0ID0gZGVmYXVsdAorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgICAgIHNlbGYuY2hvaWNlcyA9IGNob2ljZXMKKyAgICAgICAgc2VsZi5yZXF1aXJlZCA9IHJlcXVpcmVkCisgICAgICAgIHNlbGYuaGVscCA9IGhlbHAKKyAgICAgICAgc2VsZi5tZXRhdmFyID0gbWV0YXZhcgorCisgICAgZGVmIF9nZXRfa3dhcmdzKHNlbGYpOgorICAgICAgICBuYW1lcyA9IFsKKyAgICAgICAgICAgICdvcHRpb25fc3RyaW5ncycsCisgICAgICAgICAgICAnZGVzdCcsCisgICAgICAgICAgICAnbmFyZ3MnLAorICAgICAgICAgICAgJ2NvbnN0JywKKyAgICAgICAgICAgICdkZWZhdWx0JywKKyAgICAgICAgICAgICd0eXBlJywKKyAgICAgICAgICAgICdjaG9pY2VzJywKKyAgICAgICAgICAgICdoZWxwJywKKyAgICAgICAgICAgICdtZXRhdmFyJywKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gWyhuYW1lLCBnZXRhdHRyKHNlbGYsIG5hbWUpKSBmb3IgbmFtZSBpbiBuYW1lc10KKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWVzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKF8oJy5fX2NhbGxfXygpIG5vdCBkZWZpbmVkJykpCisKKworY2xhc3MgX1N0b3JlQWN0aW9uKEFjdGlvbik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgIG5hcmdzPU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnN0PU5vbmUsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdHlwZT1Ob25lLAorICAgICAgICAgICAgICAgICBjaG9pY2VzPU5vbmUsCisgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPU5vbmUsCisgICAgICAgICAgICAgICAgIG1ldGF2YXI9Tm9uZSk6CisgICAgICAgIGlmIG5hcmdzID09IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCduYXJncyBmb3Igc3RvcmUgYWN0aW9ucyBtdXN0IGJlID4gMDsgaWYgeW91ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hhdmUgbm90aGluZyB0byBzdG9yZSwgYWN0aW9ucyBzdWNoIGFzIHN0b3JlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RydWUgb3Igc3RvcmUgY29uc3QgbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUnKQorICAgICAgICBpZiBjb25zdCBpcyBub3QgTm9uZSBhbmQgbmFyZ3MgIT0gT1BUSU9OQUw6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCduYXJncyBtdXN0IGJlICVyIHRvIHN1cHBseSBjb25zdCcgJSBPUFRJT05BTCkKKyAgICAgICAgc3VwZXIoX1N0b3JlQWN0aW9uLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzPW9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgZGVzdD1kZXN0LAorICAgICAgICAgICAgbmFyZ3M9bmFyZ3MsCisgICAgICAgICAgICBjb25zdD1jb25zdCwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIHR5cGU9dHlwZSwKKyAgICAgICAgICAgIGNob2ljZXM9Y2hvaWNlcywKKyAgICAgICAgICAgIHJlcXVpcmVkPXJlcXVpcmVkLAorICAgICAgICAgICAgaGVscD1oZWxwLAorICAgICAgICAgICAgbWV0YXZhcj1tZXRhdmFyKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZXMsIG9wdGlvbl9zdHJpbmc9Tm9uZSk6CisgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBzZWxmLmRlc3QsIHZhbHVlcykKKworCitjbGFzcyBfU3RvcmVDb25zdEFjdGlvbihBY3Rpb24pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBkZXN0LAorICAgICAgICAgICAgICAgICBjb25zdCwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPU5vbmUpOgorICAgICAgICBzdXBlcihfU3RvcmVDb25zdEFjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIG5hcmdzPTAsCisgICAgICAgICAgICBjb25zdD1jb25zdCwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIHJlcXVpcmVkPXJlcXVpcmVkLAorICAgICAgICAgICAgaGVscD1oZWxwKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZXMsIG9wdGlvbl9zdHJpbmc9Tm9uZSk6CisgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBzZWxmLmRlc3QsIHNlbGYuY29uc3QpCisKKworY2xhc3MgX1N0b3JlVHJ1ZUFjdGlvbihfU3RvcmVDb25zdEFjdGlvbik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPU5vbmUpOgorICAgICAgICBzdXBlcihfU3RvcmVUcnVlQWN0aW9uLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzPW9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgZGVzdD1kZXN0LAorICAgICAgICAgICAgY29uc3Q9VHJ1ZSwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIHJlcXVpcmVkPXJlcXVpcmVkLAorICAgICAgICAgICAgaGVscD1oZWxwKQorCisKK2NsYXNzIF9TdG9yZUZhbHNlQWN0aW9uKF9TdG9yZUNvbnN0QWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgZGVzdCwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1UcnVlLAorICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lKToKKyAgICAgICAgc3VwZXIoX1N0b3JlRmFsc2VBY3Rpb24sIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICBkZXN0PWRlc3QsCisgICAgICAgICAgICBjb25zdD1GYWxzZSwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIHJlcXVpcmVkPXJlcXVpcmVkLAorICAgICAgICAgICAgaGVscD1oZWxwKQorCisKK2NsYXNzIF9BcHBlbmRBY3Rpb24oQWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgZGVzdCwKKyAgICAgICAgICAgICAgICAgbmFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY29uc3Q9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICB0eXBlPU5vbmUsCisgICAgICAgICAgICAgICAgIGNob2ljZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIGhlbHA9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj1Ob25lKToKKyAgICAgICAgaWYgbmFyZ3MgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ25hcmdzIGZvciBhcHBlbmQgYWN0aW9ucyBtdXN0IGJlID4gMDsgaWYgYXJnICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ3MgYXJlIG5vdCBzdXBwbHlpbmcgdGhlIHZhbHVlIHRvIGFwcGVuZCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhlIGFwcGVuZCBjb25zdCBhY3Rpb24gbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUnKQorICAgICAgICBpZiBjb25zdCBpcyBub3QgTm9uZSBhbmQgbmFyZ3MgIT0gT1BUSU9OQUw6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCduYXJncyBtdXN0IGJlICVyIHRvIHN1cHBseSBjb25zdCcgJSBPUFRJT05BTCkKKyAgICAgICAgc3VwZXIoX0FwcGVuZEFjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIG5hcmdzPW5hcmdzLAorICAgICAgICAgICAgY29uc3Q9Y29uc3QsCisgICAgICAgICAgICBkZWZhdWx0PWRlZmF1bHQsCisgICAgICAgICAgICB0eXBlPXR5cGUsCisgICAgICAgICAgICBjaG9pY2VzPWNob2ljZXMsCisgICAgICAgICAgICByZXF1aXJlZD1yZXF1aXJlZCwKKyAgICAgICAgICAgIGhlbHA9aGVscCwKKyAgICAgICAgICAgIG1ldGF2YXI9bWV0YXZhcikKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWVzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICBpdGVtcyA9IF9jb3B5LmNvcHkoX2Vuc3VyZV92YWx1ZShuYW1lc3BhY2UsIHNlbGYuZGVzdCwgW10pKQorICAgICAgICBpdGVtcy5hcHBlbmQodmFsdWVzKQorICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgc2VsZi5kZXN0LCBpdGVtcykKKworCitjbGFzcyBfQXBwZW5kQ29uc3RBY3Rpb24oQWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgZGVzdCwKKyAgICAgICAgICAgICAgICAgY29uc3QsCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UsCisgICAgICAgICAgICAgICAgIGhlbHA9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbWV0YXZhcj1Ob25lKToKKyAgICAgICAgc3VwZXIoX0FwcGVuZENvbnN0QWN0aW9uLCBzZWxmKS5fX2luaXRfXygKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzPW9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgZGVzdD1kZXN0LAorICAgICAgICAgICAgbmFyZ3M9MCwKKyAgICAgICAgICAgIGNvbnN0PWNvbnN0LAorICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0LAorICAgICAgICAgICAgcmVxdWlyZWQ9cmVxdWlyZWQsCisgICAgICAgICAgICBoZWxwPWhlbHAsCisgICAgICAgICAgICBtZXRhdmFyPW1ldGF2YXIpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlcywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgaXRlbXMgPSBfY29weS5jb3B5KF9lbnN1cmVfdmFsdWUobmFtZXNwYWNlLCBzZWxmLmRlc3QsIFtdKSkKKyAgICAgICAgaXRlbXMuYXBwZW5kKHNlbGYuY29uc3QpCisgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBzZWxmLmRlc3QsIGl0ZW1zKQorCisKK2NsYXNzIF9Db3VudEFjdGlvbihBY3Rpb24pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBkZXN0LAorICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIHJlcXVpcmVkPUZhbHNlLAorICAgICAgICAgICAgICAgICBoZWxwPU5vbmUpOgorICAgICAgICBzdXBlcihfQ291bnRBY3Rpb24sIHNlbGYpLl9faW5pdF9fKAorICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICBkZXN0PWRlc3QsCisgICAgICAgICAgICBuYXJncz0wLAorICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0LAorICAgICAgICAgICAgcmVxdWlyZWQ9cmVxdWlyZWQsCisgICAgICAgICAgICBoZWxwPWhlbHApCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlcywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgbmV3X2NvdW50ID0gX2Vuc3VyZV92YWx1ZShuYW1lc3BhY2UsIHNlbGYuZGVzdCwgMCkgKyAxCisgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBzZWxmLmRlc3QsIG5ld19jb3VudCkKKworCitjbGFzcyBfSGVscEFjdGlvbihBY3Rpb24pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICBkZXN0PVNVUFBSRVNTLAorICAgICAgICAgICAgICAgICBkZWZhdWx0PVNVUFBSRVNTLAorICAgICAgICAgICAgICAgICBoZWxwPU5vbmUpOgorICAgICAgICBzdXBlcihfSGVscEFjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIG5hcmdzPTAsCisgICAgICAgICAgICBoZWxwPWhlbHApCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlcywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQorICAgICAgICBwYXJzZXIuZXhpdCgpCisKKworY2xhc3MgX1ZlcnNpb25BY3Rpb24oQWN0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBvcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgICAgdmVyc2lvbj1Ob25lLAorICAgICAgICAgICAgICAgICBkZXN0PVNVUFBSRVNTLAorICAgICAgICAgICAgICAgICBkZWZhdWx0PVNVUFBSRVNTLAorICAgICAgICAgICAgICAgICBoZWxwPSJzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdCIpOgorICAgICAgICBzdXBlcihfVmVyc2lvbkFjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIGRlZmF1bHQ9ZGVmYXVsdCwKKyAgICAgICAgICAgIG5hcmdzPTAsCisgICAgICAgICAgICBoZWxwPWhlbHApCisgICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWVzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICB2ZXJzaW9uID0gc2VsZi52ZXJzaW9uCisgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHZlcnNpb24gPSBwYXJzZXIudmVyc2lvbgorICAgICAgICBmb3JtYXR0ZXIgPSBwYXJzZXIuX2dldF9mb3JtYXR0ZXIoKQorICAgICAgICBmb3JtYXR0ZXIuYWRkX3RleHQodmVyc2lvbikKKyAgICAgICAgcGFyc2VyLmV4aXQobWVzc2FnZT1mb3JtYXR0ZXIuZm9ybWF0X2hlbHAoKSkKKworCitjbGFzcyBfU3ViUGFyc2Vyc0FjdGlvbihBY3Rpb24pOgorCisgICAgY2xhc3MgX0Nob2ljZXNQc2V1ZG9BY3Rpb24oQWN0aW9uKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgaGVscCk6CisgICAgICAgICAgICBzdXAgPSBzdXBlcihfU3ViUGFyc2Vyc0FjdGlvbi5fQ2hvaWNlc1BzZXVkb0FjdGlvbiwgc2VsZikKKyAgICAgICAgICAgIHN1cC5fX2luaXRfXyhvcHRpb25fc3RyaW5ncz1bXSwgZGVzdD1uYW1lLCBoZWxwPWhlbHApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MsCisgICAgICAgICAgICAgICAgIHByb2csCisgICAgICAgICAgICAgICAgIHBhcnNlcl9jbGFzcywKKyAgICAgICAgICAgICAgICAgZGVzdD1TVVBQUkVTUywKKyAgICAgICAgICAgICAgICAgaGVscD1Ob25lLAorICAgICAgICAgICAgICAgICBtZXRhdmFyPU5vbmUpOgorCisgICAgICAgIHNlbGYuX3Byb2dfcHJlZml4ID0gcHJvZworICAgICAgICBzZWxmLl9wYXJzZXJfY2xhc3MgPSBwYXJzZXJfY2xhc3MKKyAgICAgICAgc2VsZi5fbmFtZV9wYXJzZXJfbWFwID0gX2NvbGxlY3Rpb25zLk9yZGVyZWREaWN0KCkKKyAgICAgICAgc2VsZi5fY2hvaWNlc19hY3Rpb25zID0gW10KKworICAgICAgICBzdXBlcihfU3ViUGFyc2Vyc0FjdGlvbiwgc2VsZikuX19pbml0X18oCisgICAgICAgICAgICBvcHRpb25fc3RyaW5ncz1vcHRpb25fc3RyaW5ncywKKyAgICAgICAgICAgIGRlc3Q9ZGVzdCwKKyAgICAgICAgICAgIG5hcmdzPVBBUlNFUiwKKyAgICAgICAgICAgIGNob2ljZXM9c2VsZi5fbmFtZV9wYXJzZXJfbWFwLAorICAgICAgICAgICAgaGVscD1oZWxwLAorICAgICAgICAgICAgbWV0YXZhcj1tZXRhdmFyKQorCisgICAgZGVmIGFkZF9wYXJzZXIoc2VsZiwgbmFtZSwgKiprd2FyZ3MpOgorICAgICAgICAjIHNldCBwcm9nIGZyb20gdGhlIGV4aXN0aW5nIHByZWZpeAorICAgICAgICBpZiBrd2FyZ3MuZ2V0KCdwcm9nJykgaXMgTm9uZToKKyAgICAgICAgICAgIGt3YXJnc1sncHJvZyddID0gJyVzICVzJyAlIChzZWxmLl9wcm9nX3ByZWZpeCwgbmFtZSkKKworICAgICAgICAjIGNyZWF0ZSBhIHBzZXVkby1hY3Rpb24gdG8gaG9sZCB0aGUgY2hvaWNlIGhlbHAKKyAgICAgICAgaWYgJ2hlbHAnIGluIGt3YXJnczoKKyAgICAgICAgICAgIGhlbHAgPSBrd2FyZ3MucG9wKCdoZWxwJykKKyAgICAgICAgICAgIGNob2ljZV9hY3Rpb24gPSBzZWxmLl9DaG9pY2VzUHNldWRvQWN0aW9uKG5hbWUsIGhlbHApCisgICAgICAgICAgICBzZWxmLl9jaG9pY2VzX2FjdGlvbnMuYXBwZW5kKGNob2ljZV9hY3Rpb24pCisKKyAgICAgICAgIyBjcmVhdGUgdGhlIHBhcnNlciBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fcGFyc2VyX2NsYXNzKCoqa3dhcmdzKQorICAgICAgICBzZWxmLl9uYW1lX3BhcnNlcl9tYXBbbmFtZV0gPSBwYXJzZXIKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZGVmIF9nZXRfc3ViYWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Nob2ljZXNfYWN0aW9ucworCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZXMsIG9wdGlvbl9zdHJpbmc9Tm9uZSk6CisgICAgICAgIHBhcnNlcl9uYW1lID0gdmFsdWVzWzBdCisgICAgICAgIGFyZ19zdHJpbmdzID0gdmFsdWVzWzE6XQorCisgICAgICAgICMgc2V0IHRoZSBwYXJzZXIgbmFtZSBpZiByZXF1ZXN0ZWQKKyAgICAgICAgaWYgc2VsZi5kZXN0IGlzIG5vdCBTVVBQUkVTUzoKKyAgICAgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBzZWxmLmRlc3QsIHBhcnNlcl9uYW1lKQorCisgICAgICAgICMgc2VsZWN0IHRoZSBwYXJzZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyID0gc2VsZi5fbmFtZV9wYXJzZXJfbWFwW3BhcnNlcl9uYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICB0dXAgPSBwYXJzZXJfbmFtZSwgJywgJy5qb2luKHNlbGYuX25hbWVfcGFyc2VyX21hcCkKKyAgICAgICAgICAgIG1zZyA9IF8oJ3Vua25vd24gcGFyc2VyICVyIChjaG9pY2VzOiAlcyknKSAlIHR1cAorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihzZWxmLCBtc2cpCisKKyAgICAgICAgIyBwYXJzZSBhbGwgdGhlIHJlbWFpbmluZyBvcHRpb25zIGludG8gdGhlIG5hbWVzcGFjZQorICAgICAgICAjIHN0b3JlIGFueSB1bnJlY29nbml6ZWQgb3B0aW9ucyBvbiB0aGUgb2JqZWN0LCBzbyB0aGF0IHRoZSB0b3AKKyAgICAgICAgIyBsZXZlbCBwYXJzZXIgY2FuIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlbQorICAgICAgICBuYW1lc3BhY2UsIGFyZ19zdHJpbmdzID0gcGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoYXJnX3N0cmluZ3MsIG5hbWVzcGFjZSkKKyAgICAgICAgaWYgYXJnX3N0cmluZ3M6CisgICAgICAgICAgICB2YXJzKG5hbWVzcGFjZSkuc2V0ZGVmYXVsdChfVU5SRUNPR05JWkVEX0FSR1NfQVRUUiwgW10pCisgICAgICAgICAgICBnZXRhdHRyKG5hbWVzcGFjZSwgX1VOUkVDT0dOSVpFRF9BUkdTX0FUVFIpLmV4dGVuZChhcmdfc3RyaW5ncykKKworCisjID09PT09PT09PT09PT09CisjIFR5cGUgY2xhc3NlcworIyA9PT09PT09PT09PT09PQorCitjbGFzcyBGaWxlVHlwZShvYmplY3QpOgorICAgICIiIkZhY3RvcnkgZm9yIGNyZWF0aW5nIGZpbGUgb2JqZWN0IHR5cGVzCisKKyAgICBJbnN0YW5jZXMgb2YgRmlsZVR5cGUgYXJlIHR5cGljYWxseSBwYXNzZWQgYXMgdHlwZT0gYXJndW1lbnRzIHRvIHRoZQorICAgIEFyZ3VtZW50UGFyc2VyIGFkZF9hcmd1bWVudCgpIG1ldGhvZC4KKworICAgIEtleXdvcmQgQXJndW1lbnRzOgorICAgICAgICAtIG1vZGUgLS0gQSBzdHJpbmcgaW5kaWNhdGluZyBob3cgdGhlIGZpbGUgaXMgdG8gYmUgb3BlbmVkLiBBY2NlcHRzIHRoZQorICAgICAgICAgICAgc2FtZSB2YWx1ZXMgYXMgdGhlIGJ1aWx0aW4gb3BlbigpIGZ1bmN0aW9uLgorICAgICAgICAtIGJ1ZnNpemUgLS0gVGhlIGZpbGUncyBkZXNpcmVkIGJ1ZmZlciBzaXplLiBBY2NlcHRzIHRoZSBzYW1lIHZhbHVlcyBhcworICAgICAgICAgICAgdGhlIGJ1aWx0aW4gb3BlbigpIGZ1bmN0aW9uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGU9J3InLCBidWZzaXplPS0xKToKKyAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5fYnVmc2l6ZSA9IGJ1ZnNpemUKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzdHJpbmcpOgorICAgICAgICAjIHRoZSBzcGVjaWFsIGFyZ3VtZW50ICItIiBtZWFucyBzeXMuc3Rke2luLG91dH0KKyAgICAgICAgaWYgc3RyaW5nID09ICctJzoKKyAgICAgICAgICAgIGlmICdyJyBpbiBzZWxmLl9tb2RlOgorICAgICAgICAgICAgICAgIHJldHVybiBfc3lzLnN0ZGluCisgICAgICAgICAgICBlbGlmICd3JyBpbiBzZWxmLl9tb2RlOgorICAgICAgICAgICAgICAgIHJldHVybiBfc3lzLnN0ZG91dAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtc2cgPSBfKCdhcmd1bWVudCAiLSIgd2l0aCBtb2RlICVyJykgJSBzZWxmLl9tb2RlCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cpCisKKyAgICAgICAgIyBhbGwgb3RoZXIgYXJndW1lbnRzIGFyZSB1c2VkIGFzIGZpbGUgbmFtZXMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIG9wZW4oc3RyaW5nLCBzZWxmLl9tb2RlLCBzZWxmLl9idWZzaXplKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgbWVzc2FnZSA9IF8oImNhbid0IG9wZW4gJyVzJzogJXMiKQorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRUeXBlRXJyb3IobWVzc2FnZSAlIChzdHJpbmcsIGUpKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhcmdzID0gc2VsZi5fbW9kZSwgc2VsZi5fYnVmc2l6ZQorICAgICAgICBhcmdzX3N0ciA9ICcsICcuam9pbihyZXByKGFyZykgZm9yIGFyZyBpbiBhcmdzIGlmIGFyZyAhPSAtMSkKKyAgICAgICAgcmV0dXJuICclcyglcyknICUgKHR5cGUoc2VsZikuX19uYW1lX18sIGFyZ3Nfc3RyKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBPcHRpb25hbCBhbmQgUG9zaXRpb25hbCBQYXJzaW5nCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBOYW1lc3BhY2UoX0F0dHJpYnV0ZUhvbGRlcik6CisgICAgIiIiU2ltcGxlIG9iamVjdCBmb3Igc3RvcmluZyBhdHRyaWJ1dGVzLgorCisgICAgSW1wbGVtZW50cyBlcXVhbGl0eSBieSBhdHRyaWJ1dGUgbmFtZXMgYW5kIHZhbHVlcywgYW5kIHByb3ZpZGVzIGEgc2ltcGxlCisgICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgZm9yIG5hbWUgaW4ga3dhcmdzOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBrd2FyZ3NbbmFtZV0pCisKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gdmFycyhzZWxmKSA9PSB2YXJzKG90aGVyKQorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5fX2RpY3RfXworCisKK2NsYXNzIF9BY3Rpb25zQ29udGFpbmVyKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgIHByZWZpeF9jaGFycywKKyAgICAgICAgICAgICAgICAgYXJndW1lbnRfZGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgY29uZmxpY3RfaGFuZGxlcik6CisgICAgICAgIHN1cGVyKF9BY3Rpb25zQ29udGFpbmVyLCBzZWxmKS5fX2luaXRfXygpCisKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCisgICAgICAgIHNlbGYuYXJndW1lbnRfZGVmYXVsdCA9IGFyZ3VtZW50X2RlZmF1bHQKKyAgICAgICAgc2VsZi5wcmVmaXhfY2hhcnMgPSBwcmVmaXhfY2hhcnMKKyAgICAgICAgc2VsZi5jb25mbGljdF9oYW5kbGVyID0gY29uZmxpY3RfaGFuZGxlcgorCisgICAgICAgICMgc2V0IHVwIHJlZ2lzdHJpZXMKKyAgICAgICAgc2VsZi5fcmVnaXN0cmllcyA9IHt9CisKKyAgICAgICAgIyByZWdpc3RlciBhY3Rpb25zCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsIE5vbmUsIF9TdG9yZUFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ3N0b3JlJywgX1N0b3JlQWN0aW9uKQorICAgICAgICBzZWxmLnJlZ2lzdGVyKCdhY3Rpb24nLCAnc3RvcmVfY29uc3QnLCBfU3RvcmVDb25zdEFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ3N0b3JlX3RydWUnLCBfU3RvcmVUcnVlQWN0aW9uKQorICAgICAgICBzZWxmLnJlZ2lzdGVyKCdhY3Rpb24nLCAnc3RvcmVfZmFsc2UnLCBfU3RvcmVGYWxzZUFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ2FwcGVuZCcsIF9BcHBlbmRBY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICdhcHBlbmRfY29uc3QnLCBfQXBwZW5kQ29uc3RBY3Rpb24pCisgICAgICAgIHNlbGYucmVnaXN0ZXIoJ2FjdGlvbicsICdjb3VudCcsIF9Db3VudEFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ2hlbHAnLCBfSGVscEFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ3ZlcnNpb24nLCBfVmVyc2lvbkFjdGlvbikKKyAgICAgICAgc2VsZi5yZWdpc3RlcignYWN0aW9uJywgJ3BhcnNlcnMnLCBfU3ViUGFyc2Vyc0FjdGlvbikKKworICAgICAgICAjIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgY29uZmxpY3QgaGFuZGxlciBpcyBpbnZhbGlkCisgICAgICAgIHNlbGYuX2dldF9oYW5kbGVyKCkKKworICAgICAgICAjIGFjdGlvbiBzdG9yYWdlCisgICAgICAgIHNlbGYuX2FjdGlvbnMgPSBbXQorICAgICAgICBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnMgPSB7fQorCisgICAgICAgICMgZ3JvdXBzCisgICAgICAgIHNlbGYuX2FjdGlvbl9ncm91cHMgPSBbXQorICAgICAgICBzZWxmLl9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXBzID0gW10KKworICAgICAgICAjIGRlZmF1bHRzIHN0b3JhZ2UKKyAgICAgICAgc2VsZi5fZGVmYXVsdHMgPSB7fQorCisgICAgICAgICMgZGV0ZXJtaW5lcyB3aGV0aGVyIGFuICJvcHRpb24iIGxvb2tzIGxpa2UgYSBuZWdhdGl2ZSBudW1iZXIKKyAgICAgICAgc2VsZi5fbmVnYXRpdmVfbnVtYmVyX21hdGNoZXIgPSBfcmUuY29tcGlsZShyJ14tXGQrJHxeLVxkKlwuXGQrJCcpCisKKyAgICAgICAgIyB3aGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgYW55IG9wdGlvbmFscyB0aGF0IGxvb2sgbGlrZSBuZWdhdGl2ZQorICAgICAgICAjIG51bWJlcnMgLS0gdXNlcyBhIGxpc3Qgc28gaXQgY2FuIGJlIHNoYXJlZCBhbmQgZWRpdGVkCisgICAgICAgIHNlbGYuX2hhc19uZWdhdGl2ZV9udW1iZXJfb3B0aW9uYWxzID0gW10KKworICAgICMgPT09PT09PT09PT09PT09PT09PT0KKyAgICAjIFJlZ2lzdHJhdGlvbiBtZXRob2RzCisgICAgIyA9PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiByZWdpc3RlcihzZWxmLCByZWdpc3RyeV9uYW1lLCB2YWx1ZSwgb2JqZWN0KToKKyAgICAgICAgcmVnaXN0cnkgPSBzZWxmLl9yZWdpc3RyaWVzLnNldGRlZmF1bHQocmVnaXN0cnlfbmFtZSwge30pCisgICAgICAgIHJlZ2lzdHJ5W3ZhbHVlXSA9IG9iamVjdAorCisgICAgZGVmIF9yZWdpc3RyeV9nZXQoc2VsZiwgcmVnaXN0cnlfbmFtZSwgdmFsdWUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9yZWdpc3RyaWVzW3JlZ2lzdHJ5X25hbWVdLmdldCh2YWx1ZSwgZGVmYXVsdCkKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgTmFtZXNwYWNlIGRlZmF1bHQgYWNjZXNzb3IgbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBzZXRfZGVmYXVsdHMoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLl9kZWZhdWx0cy51cGRhdGUoa3dhcmdzKQorCisgICAgICAgICMgaWYgdGhlc2UgZGVmYXVsdHMgbWF0Y2ggYW55IGV4aXN0aW5nIGFyZ3VtZW50cywgcmVwbGFjZQorICAgICAgICAjIHRoZSBwcmV2aW91cyBkZWZhdWx0IG9uIHRoZSBvYmplY3Qgd2l0aCB0aGUgbmV3IG9uZQorICAgICAgICBmb3IgYWN0aW9uIGluIHNlbGYuX2FjdGlvbnM6CisgICAgICAgICAgICBpZiBhY3Rpb24uZGVzdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgYWN0aW9uLmRlZmF1bHQgPSBrd2FyZ3NbYWN0aW9uLmRlc3RdCisKKyAgICBkZWYgZ2V0X2RlZmF1bHQoc2VsZiwgZGVzdCk6CisgICAgICAgIGZvciBhY3Rpb24gaW4gc2VsZi5fYWN0aW9uczoKKyAgICAgICAgICAgIGlmIGFjdGlvbi5kZXN0ID09IGRlc3QgYW5kIGFjdGlvbi5kZWZhdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb24uZGVmYXVsdAorICAgICAgICByZXR1cm4gc2VsZi5fZGVmYXVsdHMuZ2V0KGRlc3QsIE5vbmUpCisKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIEFkZGluZyBhcmd1bWVudCBhY3Rpb25zCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBhZGRfYXJndW1lbnQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIGFkZF9hcmd1bWVudChkZXN0LCAuLi4sIG5hbWU9dmFsdWUsIC4uLikKKyAgICAgICAgYWRkX2FyZ3VtZW50KG9wdGlvbl9zdHJpbmcsIG9wdGlvbl9zdHJpbmcsIC4uLiwgbmFtZT12YWx1ZSwgLi4uKQorICAgICAgICAiIiIKKworICAgICAgICAjIGlmIG5vIHBvc2l0aW9uYWwgYXJncyBhcmUgc3VwcGxpZWQgb3Igb25seSBvbmUgaXMgc3VwcGxpZWQgYW5kCisgICAgICAgICMgaXQgZG9lc24ndCBsb29rIGxpa2UgYW4gb3B0aW9uIHN0cmluZywgcGFyc2UgYSBwb3NpdGlvbmFsCisgICAgICAgICMgYXJndW1lbnQKKyAgICAgICAgY2hhcnMgPSBzZWxmLnByZWZpeF9jaGFycworICAgICAgICBpZiBub3QgYXJncyBvciBsZW4oYXJncykgPT0gMSBhbmQgYXJnc1swXVswXSBub3QgaW4gY2hhcnM6CisgICAgICAgICAgICBpZiBhcmdzIGFuZCAnZGVzdCcgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2Rlc3Qgc3VwcGxpZWQgdHdpY2UgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQnKQorICAgICAgICAgICAga3dhcmdzID0gc2VsZi5fZ2V0X3Bvc2l0aW9uYWxfa3dhcmdzKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICAjIG90aGVyd2lzZSwgd2UncmUgYWRkaW5nIGFuIG9wdGlvbmFsIGFyZ3VtZW50CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrd2FyZ3MgPSBzZWxmLl9nZXRfb3B0aW9uYWxfa3dhcmdzKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICAjIGlmIG5vIGRlZmF1bHQgd2FzIHN1cHBsaWVkLCB1c2UgdGhlIHBhcnNlci1sZXZlbCBkZWZhdWx0CisgICAgICAgIGlmICdkZWZhdWx0JyBub3QgaW4ga3dhcmdzOgorICAgICAgICAgICAgZGVzdCA9IGt3YXJnc1snZGVzdCddCisgICAgICAgICAgICBpZiBkZXN0IGluIHNlbGYuX2RlZmF1bHRzOgorICAgICAgICAgICAgICAgIGt3YXJnc1snZGVmYXVsdCddID0gc2VsZi5fZGVmYXVsdHNbZGVzdF0KKyAgICAgICAgICAgIGVsaWYgc2VsZi5hcmd1bWVudF9kZWZhdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGt3YXJnc1snZGVmYXVsdCddID0gc2VsZi5hcmd1bWVudF9kZWZhdWx0CisKKyAgICAgICAgIyBjcmVhdGUgdGhlIGFjdGlvbiBvYmplY3QsIGFuZCBhZGQgaXQgdG8gdGhlIHBhcnNlcgorICAgICAgICBhY3Rpb25fY2xhc3MgPSBzZWxmLl9wb3BfYWN0aW9uX2NsYXNzKGt3YXJncykKKyAgICAgICAgaWYgbm90IF9jYWxsYWJsZShhY3Rpb25fY2xhc3MpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5rbm93biBhY3Rpb24gIiVzIicgJSAoYWN0aW9uX2NsYXNzLCkpCisgICAgICAgIGFjdGlvbiA9IGFjdGlvbl9jbGFzcygqKmt3YXJncykKKworICAgICAgICAjIHJhaXNlIGFuIGVycm9yIGlmIHRoZSBhY3Rpb24gdHlwZSBpcyBub3QgY2FsbGFibGUKKyAgICAgICAgdHlwZV9mdW5jID0gc2VsZi5fcmVnaXN0cnlfZ2V0KCd0eXBlJywgYWN0aW9uLnR5cGUsIGFjdGlvbi50eXBlKQorICAgICAgICBpZiBub3QgX2NhbGxhYmxlKHR5cGVfZnVuYyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclciBpcyBub3QgY2FsbGFibGUnICUgKHR5cGVfZnVuYywpKQorCisgICAgICAgICMgcmFpc2UgYW4gZXJyb3IgaWYgdGhlIG1ldGF2YXIgZG9lcyBub3QgbWF0Y2ggdGhlIHR5cGUKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiX2dldF9mb3JtYXR0ZXIiKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9nZXRfZm9ybWF0dGVyKCkuX2Zvcm1hdF9hcmdzKGFjdGlvbiwgTm9uZSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibGVuZ3RoIG9mIG1ldGF2YXIgdHVwbGUgZG9lcyBub3QgbWF0Y2ggbmFyZ3MiKQorCisgICAgICAgIHJldHVybiBzZWxmLl9hZGRfYWN0aW9uKGFjdGlvbikKKworICAgIGRlZiBhZGRfYXJndW1lbnRfZ3JvdXAoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZ3JvdXAgPSBfQXJndW1lbnRHcm91cChzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuX2FjdGlvbl9ncm91cHMuYXBwZW5kKGdyb3VwKQorICAgICAgICByZXR1cm4gZ3JvdXAKKworICAgIGRlZiBhZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgZ3JvdXAgPSBfTXV0dWFsbHlFeGNsdXNpdmVHcm91cChzZWxmLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5fbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3Vwcy5hcHBlbmQoZ3JvdXApCisgICAgICAgIHJldHVybiBncm91cAorCisgICAgZGVmIF9hZGRfYWN0aW9uKHNlbGYsIGFjdGlvbik6CisgICAgICAgICMgcmVzb2x2ZSBhbnkgY29uZmxpY3RzCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbmZsaWN0KGFjdGlvbikKKworICAgICAgICAjIGFkZCB0byBhY3Rpb25zIGxpc3QKKyAgICAgICAgc2VsZi5fYWN0aW9ucy5hcHBlbmQoYWN0aW9uKQorICAgICAgICBhY3Rpb24uY29udGFpbmVyID0gc2VsZgorCisgICAgICAgICMgaW5kZXggdGhlIGFjdGlvbiBieSBhbnkgb3B0aW9uIHN0cmluZ3MgaXQgaGFzCisgICAgICAgIGZvciBvcHRpb25fc3RyaW5nIGluIGFjdGlvbi5vcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgIHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uc1tvcHRpb25fc3RyaW5nXSA9IGFjdGlvbgorCisgICAgICAgICMgc2V0IHRoZSBmbGFnIGlmIGFueSBvcHRpb24gc3RyaW5ncyBsb29rIGxpa2UgbmVnYXRpdmUgbnVtYmVycworICAgICAgICBmb3Igb3B0aW9uX3N0cmluZyBpbiBhY3Rpb24ub3B0aW9uX3N0cmluZ3M6CisgICAgICAgICAgICBpZiBzZWxmLl9uZWdhdGl2ZV9udW1iZXJfbWF0Y2hlci5tYXRjaChvcHRpb25fc3RyaW5nKToKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5faGFzX25lZ2F0aXZlX251bWJlcl9vcHRpb25hbHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhc19uZWdhdGl2ZV9udW1iZXJfb3B0aW9uYWxzLmFwcGVuZChUcnVlKQorCisgICAgICAgICMgcmV0dXJuIHRoZSBjcmVhdGVkIGFjdGlvbgorICAgICAgICByZXR1cm4gYWN0aW9uCisKKyAgICBkZWYgX3JlbW92ZV9hY3Rpb24oc2VsZiwgYWN0aW9uKToKKyAgICAgICAgc2VsZi5fYWN0aW9ucy5yZW1vdmUoYWN0aW9uKQorCisgICAgZGVmIF9hZGRfY29udGFpbmVyX2FjdGlvbnMoc2VsZiwgY29udGFpbmVyKToKKyAgICAgICAgIyBjb2xsZWN0IGdyb3VwcyBieSB0aXRsZXMKKyAgICAgICAgdGl0bGVfZ3JvdXBfbWFwID0ge30KKyAgICAgICAgZm9yIGdyb3VwIGluIHNlbGYuX2FjdGlvbl9ncm91cHM6CisgICAgICAgICAgICBpZiBncm91cC50aXRsZSBpbiB0aXRsZV9ncm91cF9tYXA6CisgICAgICAgICAgICAgICAgbXNnID0gXygnY2Fubm90IG1lcmdlIGFjdGlvbnMgLSB0d28gZ3JvdXBzIGFyZSBuYW1lZCAlcicpCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSAoZ3JvdXAudGl0bGUpKQorICAgICAgICAgICAgdGl0bGVfZ3JvdXBfbWFwW2dyb3VwLnRpdGxlXSA9IGdyb3VwCisKKyAgICAgICAgIyBtYXAgZWFjaCBhY3Rpb24gdG8gaXRzIGdyb3VwCisgICAgICAgIGdyb3VwX21hcCA9IHt9CisgICAgICAgIGZvciBncm91cCBpbiBjb250YWluZXIuX2FjdGlvbl9ncm91cHM6CisKKyAgICAgICAgICAgICMgaWYgYSBncm91cCB3aXRoIHRoZSB0aXRsZSBleGlzdHMsIHVzZSB0aGF0LCBvdGhlcndpc2UKKyAgICAgICAgICAgICMgY3JlYXRlIGEgbmV3IGdyb3VwIG1hdGNoaW5nIHRoZSBjb250YWluZXIncyBncm91cAorICAgICAgICAgICAgaWYgZ3JvdXAudGl0bGUgbm90IGluIHRpdGxlX2dyb3VwX21hcDoKKyAgICAgICAgICAgICAgICB0aXRsZV9ncm91cF9tYXBbZ3JvdXAudGl0bGVdID0gc2VsZi5hZGRfYXJndW1lbnRfZ3JvdXAoCisgICAgICAgICAgICAgICAgICAgIHRpdGxlPWdyb3VwLnRpdGxlLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj1ncm91cC5kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RfaGFuZGxlcj1ncm91cC5jb25mbGljdF9oYW5kbGVyKQorCisgICAgICAgICAgICAjIG1hcCB0aGUgYWN0aW9ucyB0byB0aGVpciBuZXcgZ3JvdXAKKyAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gZ3JvdXAuX2dyb3VwX2FjdGlvbnM6CisgICAgICAgICAgICAgICAgZ3JvdXBfbWFwW2FjdGlvbl0gPSB0aXRsZV9ncm91cF9tYXBbZ3JvdXAudGl0bGVdCisKKyAgICAgICAgIyBhZGQgY29udGFpbmVyJ3MgbXV0dWFsbHkgZXhjbHVzaXZlIGdyb3VwcworICAgICAgICAjIE5PVEU6IGlmIGFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAgZXZlciBnYWlucyB0aXRsZT0gYW5kCisgICAgICAgICMgZGVzY3JpcHRpb249IHRoZW4gdGhpcyBjb2RlIHdpbGwgbmVlZCB0byBiZSBleHBhbmRlZCBhcyBhYm92ZQorICAgICAgICBmb3IgZ3JvdXAgaW4gY29udGFpbmVyLl9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXBzOgorICAgICAgICAgICAgbXV0ZXhfZ3JvdXAgPSBzZWxmLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoCisgICAgICAgICAgICAgICAgcmVxdWlyZWQ9Z3JvdXAucmVxdWlyZWQpCisKKyAgICAgICAgICAgICMgbWFwIHRoZSBhY3Rpb25zIHRvIHRoZWlyIG5ldyBtdXRleCBncm91cAorICAgICAgICAgICAgZm9yIGFjdGlvbiBpbiBncm91cC5fZ3JvdXBfYWN0aW9uczoKKyAgICAgICAgICAgICAgICBncm91cF9tYXBbYWN0aW9uXSA9IG11dGV4X2dyb3VwCisKKyAgICAgICAgIyBhZGQgYWxsIGFjdGlvbnMgdG8gdGhpcyBjb250YWluZXIgb3IgdGhlaXIgZ3JvdXAKKyAgICAgICAgZm9yIGFjdGlvbiBpbiBjb250YWluZXIuX2FjdGlvbnM6CisgICAgICAgICAgICBncm91cF9tYXAuZ2V0KGFjdGlvbiwgc2VsZikuX2FkZF9hY3Rpb24oYWN0aW9uKQorCisgICAgZGVmIF9nZXRfcG9zaXRpb25hbF9rd2FyZ3Moc2VsZiwgZGVzdCwgKiprd2FyZ3MpOgorICAgICAgICAjIG1ha2Ugc3VyZSByZXF1aXJlZCBpcyBub3Qgc3BlY2lmaWVkCisgICAgICAgIGlmICdyZXF1aXJlZCcgaW4ga3dhcmdzOgorICAgICAgICAgICAgbXNnID0gXygiJ3JlcXVpcmVkJyBpcyBhbiBpbnZhbGlkIGFyZ3VtZW50IGZvciBwb3NpdGlvbmFscyIpCisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IobXNnKQorCisgICAgICAgICMgbWFyayBwb3NpdGlvbmFsIGFyZ3VtZW50cyBhcyByZXF1aXJlZCBpZiBhdCBsZWFzdCBvbmUgaXMKKyAgICAgICAgIyBhbHdheXMgcmVxdWlyZWQKKyAgICAgICAgaWYga3dhcmdzLmdldCgnbmFyZ3MnKSBub3QgaW4gW09QVElPTkFMLCBaRVJPX09SX01PUkVdOgorICAgICAgICAgICAga3dhcmdzWydyZXF1aXJlZCddID0gVHJ1ZQorICAgICAgICBpZiBrd2FyZ3MuZ2V0KCduYXJncycpID09IFpFUk9fT1JfTU9SRSBhbmQgJ2RlZmF1bHQnIG5vdCBpbiBrd2FyZ3M6CisgICAgICAgICAgICBrd2FyZ3NbJ3JlcXVpcmVkJ10gPSBUcnVlCisKKyAgICAgICAgIyByZXR1cm4gdGhlIGtleXdvcmQgYXJndW1lbnRzIHdpdGggbm8gb3B0aW9uIHN0cmluZ3MKKyAgICAgICAgcmV0dXJuIGRpY3Qoa3dhcmdzLCBkZXN0PWRlc3QsIG9wdGlvbl9zdHJpbmdzPVtdKQorCisgICAgZGVmIF9nZXRfb3B0aW9uYWxfa3dhcmdzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICMgZGV0ZXJtaW5lIHNob3J0IGFuZCBsb25nIG9wdGlvbiBzdHJpbmdzCisgICAgICAgIG9wdGlvbl9zdHJpbmdzID0gW10KKyAgICAgICAgbG9uZ19vcHRpb25fc3RyaW5ncyA9IFtdCisgICAgICAgIGZvciBvcHRpb25fc3RyaW5nIGluIGFyZ3M6CisgICAgICAgICAgICAjIGVycm9yIG9uIHN0cmluZ3MgdGhhdCBkb24ndCBzdGFydCB3aXRoIGFuIGFwcHJvcHJpYXRlIHByZWZpeAorICAgICAgICAgICAgaWYgbm90IG9wdGlvbl9zdHJpbmdbMF0gaW4gc2VsZi5wcmVmaXhfY2hhcnM6CisgICAgICAgICAgICAgICAgbXNnID0gXygnaW52YWxpZCBvcHRpb24gc3RyaW5nICVyOiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnbXVzdCBzdGFydCB3aXRoIGEgY2hhcmFjdGVyICVyJykKKyAgICAgICAgICAgICAgICB0dXAgPSBvcHRpb25fc3RyaW5nLCBzZWxmLnByZWZpeF9jaGFycworICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobXNnICUgdHVwKQorCisgICAgICAgICAgICAjIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCB0d28gcHJlZml4IGNoYXJhY3RlcnMgYXJlIGxvbmcgb3B0aW9ucworICAgICAgICAgICAgb3B0aW9uX3N0cmluZ3MuYXBwZW5kKG9wdGlvbl9zdHJpbmcpCisgICAgICAgICAgICBpZiBvcHRpb25fc3RyaW5nWzBdIGluIHNlbGYucHJlZml4X2NoYXJzOgorICAgICAgICAgICAgICAgIGlmIGxlbihvcHRpb25fc3RyaW5nKSA+IDE6CisgICAgICAgICAgICAgICAgICAgIGlmIG9wdGlvbl9zdHJpbmdbMV0gaW4gc2VsZi5wcmVmaXhfY2hhcnM6CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nX29wdGlvbl9zdHJpbmdzLmFwcGVuZChvcHRpb25fc3RyaW5nKQorCisgICAgICAgICMgaW5mZXIgZGVzdGluYXRpb24sICctLWZvby1iYXInIC0+ICdmb29fYmFyJyBhbmQgJy14JyAtPiAneCcKKyAgICAgICAgZGVzdCA9IGt3YXJncy5wb3AoJ2Rlc3QnLCBOb25lKQorICAgICAgICBpZiBkZXN0IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBsb25nX29wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgICAgIGRlc3Rfb3B0aW9uX3N0cmluZyA9IGxvbmdfb3B0aW9uX3N0cmluZ3NbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVzdF9vcHRpb25fc3RyaW5nID0gb3B0aW9uX3N0cmluZ3NbMF0KKyAgICAgICAgICAgIGRlc3QgPSBkZXN0X29wdGlvbl9zdHJpbmcubHN0cmlwKHNlbGYucHJlZml4X2NoYXJzKQorICAgICAgICAgICAgaWYgbm90IGRlc3Q6CisgICAgICAgICAgICAgICAgbXNnID0gXygnZGVzdD0gaXMgcmVxdWlyZWQgZm9yIG9wdGlvbnMgbGlrZSAlcicpCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBvcHRpb25fc3RyaW5nKQorICAgICAgICAgICAgZGVzdCA9IGRlc3QucmVwbGFjZSgnLScsICdfJykKKworICAgICAgICAjIHJldHVybiB0aGUgdXBkYXRlZCBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICByZXR1cm4gZGljdChrd2FyZ3MsIGRlc3Q9ZGVzdCwgb3B0aW9uX3N0cmluZ3M9b3B0aW9uX3N0cmluZ3MpCisKKyAgICBkZWYgX3BvcF9hY3Rpb25fY2xhc3Moc2VsZiwga3dhcmdzLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICBhY3Rpb24gPSBrd2FyZ3MucG9wKCdhY3Rpb24nLCBkZWZhdWx0KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVnaXN0cnlfZ2V0KCdhY3Rpb24nLCBhY3Rpb24sIGFjdGlvbikKKworICAgIGRlZiBfZ2V0X2hhbmRsZXIoc2VsZik6CisgICAgICAgICMgZGV0ZXJtaW5lIGZ1bmN0aW9uIGZyb20gY29uZmxpY3QgaGFuZGxlciBzdHJpbmcKKyAgICAgICAgaGFuZGxlcl9mdW5jX25hbWUgPSAnX2hhbmRsZV9jb25mbGljdF8lcycgJSBzZWxmLmNvbmZsaWN0X2hhbmRsZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgaGFuZGxlcl9mdW5jX25hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIG1zZyA9IF8oJ2ludmFsaWQgY29uZmxpY3RfcmVzb2x1dGlvbiB2YWx1ZTogJXInKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cgJSBzZWxmLmNvbmZsaWN0X2hhbmRsZXIpCisKKyAgICBkZWYgX2NoZWNrX2NvbmZsaWN0KHNlbGYsIGFjdGlvbik6CisKKyAgICAgICAgIyBmaW5kIGFsbCBvcHRpb25zIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGlzIG9wdGlvbgorICAgICAgICBjb25mbF9vcHRpb25hbHMgPSBbXQorICAgICAgICBmb3Igb3B0aW9uX3N0cmluZyBpbiBhY3Rpb24ub3B0aW9uX3N0cmluZ3M6CisgICAgICAgICAgICBpZiBvcHRpb25fc3RyaW5nIGluIHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uczoKKyAgICAgICAgICAgICAgICBjb25mbF9vcHRpb25hbCA9IHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uc1tvcHRpb25fc3RyaW5nXQorICAgICAgICAgICAgICAgIGNvbmZsX29wdGlvbmFscy5hcHBlbmQoKG9wdGlvbl9zdHJpbmcsIGNvbmZsX29wdGlvbmFsKSkKKworICAgICAgICAjIHJlc29sdmUgYW55IGNvbmZsaWN0cworICAgICAgICBpZiBjb25mbF9vcHRpb25hbHM6CisgICAgICAgICAgICBjb25mbGljdF9oYW5kbGVyID0gc2VsZi5fZ2V0X2hhbmRsZXIoKQorICAgICAgICAgICAgY29uZmxpY3RfaGFuZGxlcihhY3Rpb24sIGNvbmZsX29wdGlvbmFscykKKworICAgIGRlZiBfaGFuZGxlX2NvbmZsaWN0X2Vycm9yKHNlbGYsIGFjdGlvbiwgY29uZmxpY3RpbmdfYWN0aW9ucyk6CisgICAgICAgIG1lc3NhZ2UgPSBfKCdjb25mbGljdGluZyBvcHRpb24gc3RyaW5nKHMpOiAlcycpCisgICAgICAgIGNvbmZsaWN0X3N0cmluZyA9ICcsICcuam9pbihbb3B0aW9uX3N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvcHRpb25fc3RyaW5nLCBhY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBjb25mbGljdGluZ19hY3Rpb25zXSkKKyAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihhY3Rpb24sIG1lc3NhZ2UgJSBjb25mbGljdF9zdHJpbmcpCisKKyAgICBkZWYgX2hhbmRsZV9jb25mbGljdF9yZXNvbHZlKHNlbGYsIGFjdGlvbiwgY29uZmxpY3RpbmdfYWN0aW9ucyk6CisKKyAgICAgICAgIyByZW1vdmUgYWxsIGNvbmZsaWN0aW5nIG9wdGlvbnMKKyAgICAgICAgZm9yIG9wdGlvbl9zdHJpbmcsIGFjdGlvbiBpbiBjb25mbGljdGluZ19hY3Rpb25zOgorCisgICAgICAgICAgICAjIHJlbW92ZSB0aGUgY29uZmxpY3Rpbmcgb3B0aW9uCisgICAgICAgICAgICBhY3Rpb24ub3B0aW9uX3N0cmluZ3MucmVtb3ZlKG9wdGlvbl9zdHJpbmcpCisgICAgICAgICAgICBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnMucG9wKG9wdGlvbl9zdHJpbmcsIE5vbmUpCisKKyAgICAgICAgICAgICMgaWYgdGhlIG9wdGlvbiBub3cgaGFzIG5vIG9wdGlvbiBzdHJpbmcsIHJlbW92ZSBpdCBmcm9tIHRoZQorICAgICAgICAgICAgIyBjb250YWluZXIgaG9sZGluZyBpdAorICAgICAgICAgICAgaWYgbm90IGFjdGlvbi5vcHRpb25fc3RyaW5nczoKKyAgICAgICAgICAgICAgICBhY3Rpb24uY29udGFpbmVyLl9yZW1vdmVfYWN0aW9uKGFjdGlvbikKKworCitjbGFzcyBfQXJndW1lbnRHcm91cChfQWN0aW9uc0NvbnRhaW5lcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGFpbmVyLCB0aXRsZT1Ob25lLCBkZXNjcmlwdGlvbj1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICMgYWRkIGFueSBtaXNzaW5nIGtleXdvcmQgYXJndW1lbnRzIGJ5IGNoZWNraW5nIHRoZSBjb250YWluZXIKKyAgICAgICAgdXBkYXRlID0ga3dhcmdzLnNldGRlZmF1bHQKKyAgICAgICAgdXBkYXRlKCdjb25mbGljdF9oYW5kbGVyJywgY29udGFpbmVyLmNvbmZsaWN0X2hhbmRsZXIpCisgICAgICAgIHVwZGF0ZSgncHJlZml4X2NoYXJzJywgY29udGFpbmVyLnByZWZpeF9jaGFycykKKyAgICAgICAgdXBkYXRlKCdhcmd1bWVudF9kZWZhdWx0JywgY29udGFpbmVyLmFyZ3VtZW50X2RlZmF1bHQpCisgICAgICAgIHN1cGVyX2luaXQgPSBzdXBlcihfQXJndW1lbnRHcm91cCwgc2VsZikuX19pbml0X18KKyAgICAgICAgc3VwZXJfaW5pdChkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbiwgKiprd2FyZ3MpCisKKyAgICAgICAgIyBncm91cCBhdHRyaWJ1dGVzCisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLl9ncm91cF9hY3Rpb25zID0gW10KKworICAgICAgICAjIHNoYXJlIG1vc3QgYXR0cmlidXRlcyB3aXRoIHRoZSBjb250YWluZXIKKyAgICAgICAgc2VsZi5fcmVnaXN0cmllcyA9IGNvbnRhaW5lci5fcmVnaXN0cmllcworICAgICAgICBzZWxmLl9hY3Rpb25zID0gY29udGFpbmVyLl9hY3Rpb25zCisgICAgICAgIHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9ucyA9IGNvbnRhaW5lci5fb3B0aW9uX3N0cmluZ19hY3Rpb25zCisgICAgICAgIHNlbGYuX2RlZmF1bHRzID0gY29udGFpbmVyLl9kZWZhdWx0cworICAgICAgICBzZWxmLl9oYXNfbmVnYXRpdmVfbnVtYmVyX29wdGlvbmFscyA9IFwKKyAgICAgICAgICAgIGNvbnRhaW5lci5faGFzX25lZ2F0aXZlX251bWJlcl9vcHRpb25hbHMKKyAgICAgICAgc2VsZi5fbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwcyA9IGNvbnRhaW5lci5fbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwcworCisgICAgZGVmIF9hZGRfYWN0aW9uKHNlbGYsIGFjdGlvbik6CisgICAgICAgIGFjdGlvbiA9IHN1cGVyKF9Bcmd1bWVudEdyb3VwLCBzZWxmKS5fYWRkX2FjdGlvbihhY3Rpb24pCisgICAgICAgIHNlbGYuX2dyb3VwX2FjdGlvbnMuYXBwZW5kKGFjdGlvbikKKyAgICAgICAgcmV0dXJuIGFjdGlvbgorCisgICAgZGVmIF9yZW1vdmVfYWN0aW9uKHNlbGYsIGFjdGlvbik6CisgICAgICAgIHN1cGVyKF9Bcmd1bWVudEdyb3VwLCBzZWxmKS5fcmVtb3ZlX2FjdGlvbihhY3Rpb24pCisgICAgICAgIHNlbGYuX2dyb3VwX2FjdGlvbnMucmVtb3ZlKGFjdGlvbikKKworCitjbGFzcyBfTXV0dWFsbHlFeGNsdXNpdmVHcm91cChfQXJndW1lbnRHcm91cCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGFpbmVyLCByZXF1aXJlZD1GYWxzZSk6CisgICAgICAgIHN1cGVyKF9NdXR1YWxseUV4Y2x1c2l2ZUdyb3VwLCBzZWxmKS5fX2luaXRfXyhjb250YWluZXIpCisgICAgICAgIHNlbGYucmVxdWlyZWQgPSByZXF1aXJlZAorICAgICAgICBzZWxmLl9jb250YWluZXIgPSBjb250YWluZXIKKworICAgIGRlZiBfYWRkX2FjdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICBpZiBhY3Rpb24ucmVxdWlyZWQ6CisgICAgICAgICAgICBtc2cgPSBfKCdtdXR1YWxseSBleGNsdXNpdmUgYXJndW1lbnRzIG11c3QgYmUgb3B0aW9uYWwnKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihtc2cpCisgICAgICAgIGFjdGlvbiA9IHNlbGYuX2NvbnRhaW5lci5fYWRkX2FjdGlvbihhY3Rpb24pCisgICAgICAgIHNlbGYuX2dyb3VwX2FjdGlvbnMuYXBwZW5kKGFjdGlvbikKKyAgICAgICAgcmV0dXJuIGFjdGlvbgorCisgICAgZGVmIF9yZW1vdmVfYWN0aW9uKHNlbGYsIGFjdGlvbik6CisgICAgICAgIHNlbGYuX2NvbnRhaW5lci5fcmVtb3ZlX2FjdGlvbihhY3Rpb24pCisgICAgICAgIHNlbGYuX2dyb3VwX2FjdGlvbnMucmVtb3ZlKGFjdGlvbikKKworCitjbGFzcyBBcmd1bWVudFBhcnNlcihfQXR0cmlidXRlSG9sZGVyLCBfQWN0aW9uc0NvbnRhaW5lcik6CisgICAgIiIiT2JqZWN0IGZvciBwYXJzaW5nIGNvbW1hbmQgbGluZSBzdHJpbmdzIGludG8gUHl0aG9uIG9iamVjdHMuCisKKyAgICBLZXl3b3JkIEFyZ3VtZW50czoKKyAgICAgICAgLSBwcm9nIC0tIFRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIChkZWZhdWx0OiBzeXMuYXJndlswXSkKKyAgICAgICAgLSB1c2FnZSAtLSBBIHVzYWdlIG1lc3NhZ2UgKGRlZmF1bHQ6IGF1dG8tZ2VuZXJhdGVkIGZyb20gYXJndW1lbnRzKQorICAgICAgICAtIGRlc2NyaXB0aW9uIC0tIEEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgcHJvZ3JhbSBkb2VzCisgICAgICAgIC0gZXBpbG9nIC0tIFRleHQgZm9sbG93aW5nIHRoZSBhcmd1bWVudCBkZXNjcmlwdGlvbnMKKyAgICAgICAgLSBwYXJlbnRzIC0tIFBhcnNlcnMgd2hvc2UgYXJndW1lbnRzIHNob3VsZCBiZSBjb3BpZWQgaW50byB0aGlzIG9uZQorICAgICAgICAtIGZvcm1hdHRlcl9jbGFzcyAtLSBIZWxwRm9ybWF0dGVyIGNsYXNzIGZvciBwcmludGluZyBoZWxwIG1lc3NhZ2VzCisgICAgICAgIC0gcHJlZml4X2NoYXJzIC0tIENoYXJhY3RlcnMgdGhhdCBwcmVmaXggb3B0aW9uYWwgYXJndW1lbnRzCisgICAgICAgIC0gZnJvbWZpbGVfcHJlZml4X2NoYXJzIC0tIENoYXJhY3RlcnMgdGhhdCBwcmVmaXggZmlsZXMgY29udGFpbmluZworICAgICAgICAgICAgYWRkaXRpb25hbCBhcmd1bWVudHMKKyAgICAgICAgLSBhcmd1bWVudF9kZWZhdWx0IC0tIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBhbGwgYXJndW1lbnRzCisgICAgICAgIC0gY29uZmxpY3RfaGFuZGxlciAtLSBTdHJpbmcgaW5kaWNhdGluZyBob3cgdG8gaGFuZGxlIGNvbmZsaWN0cworICAgICAgICAtIGFkZF9oZWxwIC0tIEFkZCBhIC1oLy1oZWxwIG9wdGlvbgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgICAgICAgICAgIHByb2c9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdXNhZ2U9Tm9uZSwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Tm9uZSwKKyAgICAgICAgICAgICAgICAgZXBpbG9nPU5vbmUsCisgICAgICAgICAgICAgICAgIHZlcnNpb249Tm9uZSwKKyAgICAgICAgICAgICAgICAgcGFyZW50cz1bXSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0dGVyX2NsYXNzPUhlbHBGb3JtYXR0ZXIsCisgICAgICAgICAgICAgICAgIHByZWZpeF9jaGFycz0nLScsCisgICAgICAgICAgICAgICAgIGZyb21maWxlX3ByZWZpeF9jaGFycz1Ob25lLAorICAgICAgICAgICAgICAgICBhcmd1bWVudF9kZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbmZsaWN0X2hhbmRsZXI9J2Vycm9yJywKKyAgICAgICAgICAgICAgICAgYWRkX2hlbHA9VHJ1ZSk6CisKKyAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiIiJUaGUgInZlcnNpb24iIGFyZ3VtZW50IHRvIEFyZ3VtZW50UGFyc2VyIGlzIGRlcHJlY2F0ZWQuICIiIgorICAgICAgICAgICAgICAgICIiIlBsZWFzZSB1c2UgIiIiCisgICAgICAgICAgICAgICAgIiIiImFkZF9hcmd1bWVudCguLi4sIGFjdGlvbj0ndmVyc2lvbicsIHZlcnNpb249Ik4iLCAuLi4pIiAiIiIKKyAgICAgICAgICAgICAgICAiIiJpbnN0ZWFkIiIiLCBEZXByZWNhdGlvbldhcm5pbmcpCisKKyAgICAgICAgc3VwZXJpbml0ID0gc3VwZXIoQXJndW1lbnRQYXJzZXIsIHNlbGYpLl9faW5pdF9fCisgICAgICAgIHN1cGVyaW5pdChkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgIHByZWZpeF9jaGFycz1wcmVmaXhfY2hhcnMsCisgICAgICAgICAgICAgICAgICBhcmd1bWVudF9kZWZhdWx0PWFyZ3VtZW50X2RlZmF1bHQsCisgICAgICAgICAgICAgICAgICBjb25mbGljdF9oYW5kbGVyPWNvbmZsaWN0X2hhbmRsZXIpCisKKyAgICAgICAgIyBkZWZhdWx0IHNldHRpbmcgZm9yIHByb2cKKyAgICAgICAgaWYgcHJvZyBpcyBOb25lOgorICAgICAgICAgICAgcHJvZyA9IF9vcy5wYXRoLmJhc2VuYW1lKF9zeXMuYXJndlswXSkKKworICAgICAgICBzZWxmLnByb2cgPSBwcm9nCisgICAgICAgIHNlbGYudXNhZ2UgPSB1c2FnZQorICAgICAgICBzZWxmLmVwaWxvZyA9IGVwaWxvZworICAgICAgICBzZWxmLnZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgIHNlbGYuZm9ybWF0dGVyX2NsYXNzID0gZm9ybWF0dGVyX2NsYXNzCisgICAgICAgIHNlbGYuZnJvbWZpbGVfcHJlZml4X2NoYXJzID0gZnJvbWZpbGVfcHJlZml4X2NoYXJzCisgICAgICAgIHNlbGYuYWRkX2hlbHAgPSBhZGRfaGVscAorCisgICAgICAgIGFkZF9ncm91cCA9IHNlbGYuYWRkX2FyZ3VtZW50X2dyb3VwCisgICAgICAgIHNlbGYuX3Bvc2l0aW9uYWxzID0gYWRkX2dyb3VwKF8oJ3Bvc2l0aW9uYWwgYXJndW1lbnRzJykpCisgICAgICAgIHNlbGYuX29wdGlvbmFscyA9IGFkZF9ncm91cChfKCdvcHRpb25hbCBhcmd1bWVudHMnKSkKKyAgICAgICAgc2VsZi5fc3VicGFyc2VycyA9IE5vbmUKKworICAgICAgICAjIHJlZ2lzdGVyIHR5cGVzCisgICAgICAgIGRlZiBpZGVudGl0eShzdHJpbmcpOgorICAgICAgICAgICAgcmV0dXJuIHN0cmluZworICAgICAgICBzZWxmLnJlZ2lzdGVyKCd0eXBlJywgTm9uZSwgaWRlbnRpdHkpCisKKyAgICAgICAgIyBhZGQgaGVscCBhbmQgdmVyc2lvbiBhcmd1bWVudHMgaWYgbmVjZXNzYXJ5CisgICAgICAgICMgKHVzaW5nIGV4cGxpY2l0IGRlZmF1bHQgdG8gb3ZlcnJpZGUgZ2xvYmFsIGFyZ3VtZW50X2RlZmF1bHQpCisgICAgICAgIGRlZmF1bHRfcHJlZml4ID0gJy0nIGlmICctJyBpbiBwcmVmaXhfY2hhcnMgZWxzZSBwcmVmaXhfY2hhcnNbMF0KKyAgICAgICAgaWYgc2VsZi5hZGRfaGVscDoKKyAgICAgICAgICAgIHNlbGYuYWRkX2FyZ3VtZW50KAorICAgICAgICAgICAgICAgIGRlZmF1bHRfcHJlZml4KydoJywgZGVmYXVsdF9wcmVmaXgqMisnaGVscCcsCisgICAgICAgICAgICAgICAgYWN0aW9uPSdoZWxwJywgZGVmYXVsdD1TVVBQUkVTUywKKyAgICAgICAgICAgICAgICBoZWxwPV8oJ3Nob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQnKSkKKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uOgorICAgICAgICAgICAgc2VsZi5hZGRfYXJndW1lbnQoCisgICAgICAgICAgICAgICAgZGVmYXVsdF9wcmVmaXgrJ3YnLCBkZWZhdWx0X3ByZWZpeCoyKyd2ZXJzaW9uJywKKyAgICAgICAgICAgICAgICBhY3Rpb249J3ZlcnNpb24nLCBkZWZhdWx0PVNVUFBSRVNTLAorICAgICAgICAgICAgICAgIHZlcnNpb249c2VsZi52ZXJzaW9uLAorICAgICAgICAgICAgICAgIGhlbHA9Xygic2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQiKSkKKworICAgICAgICAjIGFkZCBwYXJlbnQgYXJndW1lbnRzIGFuZCBkZWZhdWx0cworICAgICAgICBmb3IgcGFyZW50IGluIHBhcmVudHM6CisgICAgICAgICAgICBzZWxmLl9hZGRfY29udGFpbmVyX2FjdGlvbnMocGFyZW50KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlZmF1bHRzID0gcGFyZW50Ll9kZWZhdWx0cworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZGVmYXVsdHMudXBkYXRlKGRlZmF1bHRzKQorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgUHJldHR5IF9fcmVwcl9fIG1ldGhvZHMKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09CisgICAgZGVmIF9nZXRfa3dhcmdzKHNlbGYpOgorICAgICAgICBuYW1lcyA9IFsKKyAgICAgICAgICAgICdwcm9nJywKKyAgICAgICAgICAgICd1c2FnZScsCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nLAorICAgICAgICAgICAgJ3ZlcnNpb24nLAorICAgICAgICAgICAgJ2Zvcm1hdHRlcl9jbGFzcycsCisgICAgICAgICAgICAnY29uZmxpY3RfaGFuZGxlcicsCisgICAgICAgICAgICAnYWRkX2hlbHAnLAorICAgICAgICBdCisgICAgICAgIHJldHVybiBbKG5hbWUsIGdldGF0dHIoc2VsZiwgbmFtZSkpIGZvciBuYW1lIGluIG5hbWVzXQorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBPcHRpb25hbC9Qb3NpdGlvbmFsIGFkZGluZyBtZXRob2RzCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgZGVmIGFkZF9zdWJwYXJzZXJzKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgaWYgc2VsZi5fc3VicGFyc2VycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoXygnY2Fubm90IGhhdmUgbXVsdGlwbGUgc3VicGFyc2VyIGFyZ3VtZW50cycpKQorCisgICAgICAgICMgYWRkIHRoZSBwYXJzZXIgY2xhc3MgdG8gdGhlIGFyZ3VtZW50cyBpZiBpdCdzIG5vdCBwcmVzZW50CisgICAgICAgIGt3YXJncy5zZXRkZWZhdWx0KCdwYXJzZXJfY2xhc3MnLCB0eXBlKHNlbGYpKQorCisgICAgICAgIGlmICd0aXRsZScgaW4ga3dhcmdzIG9yICdkZXNjcmlwdGlvbicgaW4ga3dhcmdzOgorICAgICAgICAgICAgdGl0bGUgPSBfKGt3YXJncy5wb3AoJ3RpdGxlJywgJ3N1YmNvbW1hbmRzJykpCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IF8oa3dhcmdzLnBvcCgnZGVzY3JpcHRpb24nLCBOb25lKSkKKyAgICAgICAgICAgIHNlbGYuX3N1YnBhcnNlcnMgPSBzZWxmLmFkZF9hcmd1bWVudF9ncm91cCh0aXRsZSwgZGVzY3JpcHRpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9zdWJwYXJzZXJzID0gc2VsZi5fcG9zaXRpb25hbHMKKworICAgICAgICAjIHByb2cgZGVmYXVsdHMgdG8gdGhlIHVzYWdlIG1lc3NhZ2Ugb2YgdGhpcyBwYXJzZXIsIHNraXBwaW5nCisgICAgICAgICMgb3B0aW9uYWwgYXJndW1lbnRzIGFuZCB3aXRoIG5vICJ1c2FnZToiIHByZWZpeAorICAgICAgICBpZiBrd2FyZ3MuZ2V0KCdwcm9nJykgaXMgTm9uZToKKyAgICAgICAgICAgIGZvcm1hdHRlciA9IHNlbGYuX2dldF9mb3JtYXR0ZXIoKQorICAgICAgICAgICAgcG9zaXRpb25hbHMgPSBzZWxmLl9nZXRfcG9zaXRpb25hbF9hY3Rpb25zKCkKKyAgICAgICAgICAgIGdyb3VwcyA9IHNlbGYuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHMKKyAgICAgICAgICAgIGZvcm1hdHRlci5hZGRfdXNhZ2Uoc2VsZi51c2FnZSwgcG9zaXRpb25hbHMsIGdyb3VwcywgJycpCisgICAgICAgICAgICBrd2FyZ3NbJ3Byb2cnXSA9IGZvcm1hdHRlci5mb3JtYXRfaGVscCgpLnN0cmlwKCkKKworICAgICAgICAjIGNyZWF0ZSB0aGUgcGFyc2VycyBhY3Rpb24gYW5kIGFkZCBpdCB0byB0aGUgcG9zaXRpb25hbHMgbGlzdAorICAgICAgICBwYXJzZXJzX2NsYXNzID0gc2VsZi5fcG9wX2FjdGlvbl9jbGFzcyhrd2FyZ3MsICdwYXJzZXJzJykKKyAgICAgICAgYWN0aW9uID0gcGFyc2Vyc19jbGFzcyhvcHRpb25fc3RyaW5ncz1bXSwgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuX3N1YnBhcnNlcnMuX2FkZF9hY3Rpb24oYWN0aW9uKQorCisgICAgICAgICMgcmV0dXJuIHRoZSBjcmVhdGVkIHBhcnNlcnMgYWN0aW9uCisgICAgICAgIHJldHVybiBhY3Rpb24KKworICAgIGRlZiBfYWRkX2FjdGlvbihzZWxmLCBhY3Rpb24pOgorICAgICAgICBpZiBhY3Rpb24ub3B0aW9uX3N0cmluZ3M6CisgICAgICAgICAgICBzZWxmLl9vcHRpb25hbHMuX2FkZF9hY3Rpb24oYWN0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcG9zaXRpb25hbHMuX2FkZF9hY3Rpb24oYWN0aW9uKQorICAgICAgICByZXR1cm4gYWN0aW9uCisKKyAgICBkZWYgX2dldF9vcHRpb25hbF9hY3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gW2FjdGlvbgorICAgICAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gc2VsZi5fYWN0aW9ucworICAgICAgICAgICAgICAgIGlmIGFjdGlvbi5vcHRpb25fc3RyaW5nc10KKworICAgIGRlZiBfZ2V0X3Bvc2l0aW9uYWxfYWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFthY3Rpb24KKyAgICAgICAgICAgICAgICBmb3IgYWN0aW9uIGluIHNlbGYuX2FjdGlvbnMKKyAgICAgICAgICAgICAgICBpZiBub3QgYWN0aW9uLm9wdGlvbl9zdHJpbmdzXQorCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBDb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2luZyBtZXRob2RzCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgZGVmIHBhcnNlX2FyZ3Moc2VsZiwgYXJncz1Ob25lLCBuYW1lc3BhY2U9Tm9uZSk6CisgICAgICAgIGFyZ3MsIGFyZ3YgPSBzZWxmLnBhcnNlX2tub3duX2FyZ3MoYXJncywgbmFtZXNwYWNlKQorICAgICAgICBpZiBhcmd2OgorICAgICAgICAgICAgbXNnID0gXygndW5yZWNvZ25pemVkIGFyZ3VtZW50czogJXMnKQorICAgICAgICAgICAgc2VsZi5lcnJvcihtc2cgJSAnICcuam9pbihhcmd2KSkKKyAgICAgICAgcmV0dXJuIGFyZ3MKKworICAgIGRlZiBwYXJzZV9rbm93bl9hcmdzKHNlbGYsIGFyZ3M9Tm9uZSwgbmFtZXNwYWNlPU5vbmUpOgorICAgICAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgICAgICAjIGFyZ3MgZGVmYXVsdCB0byB0aGUgc3lzdGVtIGFyZ3MKKyAgICAgICAgICAgIGFyZ3MgPSBfc3lzLmFyZ3ZbMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGFyZ3MgYXJlIG11dGFibGUKKyAgICAgICAgICAgIGFyZ3MgPSBsaXN0KGFyZ3MpCisKKyAgICAgICAgIyBkZWZhdWx0IE5hbWVzcGFjZSBidWlsdCBmcm9tIHBhcnNlciBkZWZhdWx0cworICAgICAgICBpZiBuYW1lc3BhY2UgaXMgTm9uZToKKyAgICAgICAgICAgIG5hbWVzcGFjZSA9IE5hbWVzcGFjZSgpCisKKyAgICAgICAgIyBhZGQgYW55IGFjdGlvbiBkZWZhdWx0cyB0aGF0IGFyZW4ndCBwcmVzZW50CisgICAgICAgIGZvciBhY3Rpb24gaW4gc2VsZi5fYWN0aW9uczoKKyAgICAgICAgICAgIGlmIGFjdGlvbi5kZXN0IGlzIG5vdCBTVVBQUkVTUzoKKyAgICAgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihuYW1lc3BhY2UsIGFjdGlvbi5kZXN0KToKKyAgICAgICAgICAgICAgICAgICAgaWYgYWN0aW9uLmRlZmF1bHQgaXMgbm90IFNVUFBSRVNTOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihuYW1lc3BhY2UsIGFjdGlvbi5kZXN0LCBhY3Rpb24uZGVmYXVsdCkKKworICAgICAgICAjIGFkZCBhbnkgcGFyc2VyIGRlZmF1bHRzIHRoYXQgYXJlbid0IHByZXNlbnQKKyAgICAgICAgZm9yIGRlc3QgaW4gc2VsZi5fZGVmYXVsdHM6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihuYW1lc3BhY2UsIGRlc3QpOgorICAgICAgICAgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBkZXN0LCBzZWxmLl9kZWZhdWx0c1tkZXN0XSkKKworICAgICAgICAjIHBhcnNlIHRoZSBhcmd1bWVudHMgYW5kIGV4aXQgaWYgdGhlcmUgYXJlIGFueSBlcnJvcnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXNwYWNlLCBhcmdzID0gc2VsZi5fcGFyc2Vfa25vd25fYXJncyhhcmdzLCBuYW1lc3BhY2UpCisgICAgICAgICAgICBpZiBoYXNhdHRyKG5hbWVzcGFjZSwgX1VOUkVDT0dOSVpFRF9BUkdTX0FUVFIpOgorICAgICAgICAgICAgICAgIGFyZ3MuZXh0ZW5kKGdldGF0dHIobmFtZXNwYWNlLCBfVU5SRUNPR05JWkVEX0FSR1NfQVRUUikpCisgICAgICAgICAgICAgICAgZGVsYXR0cihuYW1lc3BhY2UsIF9VTlJFQ09HTklaRURfQVJHU19BVFRSKQorICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSwgYXJncworICAgICAgICBleGNlcHQgQXJndW1lbnRFcnJvcjoKKyAgICAgICAgICAgIGVyciA9IF9zeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgc2VsZi5lcnJvcihzdHIoZXJyKSkKKworICAgIGRlZiBfcGFyc2Vfa25vd25fYXJncyhzZWxmLCBhcmdfc3RyaW5ncywgbmFtZXNwYWNlKToKKyAgICAgICAgIyByZXBsYWNlIGFyZyBzdHJpbmdzIHRoYXQgYXJlIGZpbGUgcmVmZXJlbmNlcworICAgICAgICBpZiBzZWxmLmZyb21maWxlX3ByZWZpeF9jaGFycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFyZ19zdHJpbmdzID0gc2VsZi5fcmVhZF9hcmdzX2Zyb21fZmlsZXMoYXJnX3N0cmluZ3MpCisKKyAgICAgICAgIyBtYXAgYWxsIG11dHVhbGx5IGV4Y2x1c2l2ZSBhcmd1bWVudHMgdG8gdGhlIG90aGVyIGFyZ3VtZW50cworICAgICAgICAjIHRoZXkgY2FuJ3Qgb2NjdXIgd2l0aAorICAgICAgICBhY3Rpb25fY29uZmxpY3RzID0ge30KKyAgICAgICAgZm9yIG11dGV4X2dyb3VwIGluIHNlbGYuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHM6CisgICAgICAgICAgICBncm91cF9hY3Rpb25zID0gbXV0ZXhfZ3JvdXAuX2dyb3VwX2FjdGlvbnMKKyAgICAgICAgICAgIGZvciBpLCBtdXRleF9hY3Rpb24gaW4gZW51bWVyYXRlKG11dGV4X2dyb3VwLl9ncm91cF9hY3Rpb25zKToKKyAgICAgICAgICAgICAgICBjb25mbGljdHMgPSBhY3Rpb25fY29uZmxpY3RzLnNldGRlZmF1bHQobXV0ZXhfYWN0aW9uLCBbXSkKKyAgICAgICAgICAgICAgICBjb25mbGljdHMuZXh0ZW5kKGdyb3VwX2FjdGlvbnNbOmldKQorICAgICAgICAgICAgICAgIGNvbmZsaWN0cy5leHRlbmQoZ3JvdXBfYWN0aW9uc1tpICsgMTpdKQorCisgICAgICAgICMgZmluZCBhbGwgb3B0aW9uIGluZGljZXMsIGFuZCBkZXRlcm1pbmUgdGhlIGFyZ19zdHJpbmdfcGF0dGVybgorICAgICAgICAjIHdoaWNoIGhhcyBhbiAnTycgaWYgdGhlcmUgaXMgYW4gb3B0aW9uIGF0IGFuIGluZGV4LAorICAgICAgICAjIGFuICdBJyBpZiB0aGVyZSBpcyBhbiBhcmd1bWVudCwgb3IgYSAnLScgaWYgdGhlcmUgaXMgYSAnLS0nCisgICAgICAgIG9wdGlvbl9zdHJpbmdfaW5kaWNlcyA9IHt9CisgICAgICAgIGFyZ19zdHJpbmdfcGF0dGVybl9wYXJ0cyA9IFtdCisgICAgICAgIGFyZ19zdHJpbmdzX2l0ZXIgPSBpdGVyKGFyZ19zdHJpbmdzKQorICAgICAgICBmb3IgaSwgYXJnX3N0cmluZyBpbiBlbnVtZXJhdGUoYXJnX3N0cmluZ3NfaXRlcik6CisKKyAgICAgICAgICAgICMgYWxsIGFyZ3MgYWZ0ZXIgLS0gYXJlIG5vbi1vcHRpb25zCisgICAgICAgICAgICBpZiBhcmdfc3RyaW5nID09ICctLSc6CisgICAgICAgICAgICAgICAgYXJnX3N0cmluZ19wYXR0ZXJuX3BhcnRzLmFwcGVuZCgnLScpCisgICAgICAgICAgICAgICAgZm9yIGFyZ19zdHJpbmcgaW4gYXJnX3N0cmluZ3NfaXRlcjoKKyAgICAgICAgICAgICAgICAgICAgYXJnX3N0cmluZ19wYXR0ZXJuX3BhcnRzLmFwcGVuZCgnQScpCisKKyAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBhZGQgdGhlIGFyZyB0byB0aGUgYXJnIHN0cmluZ3MKKyAgICAgICAgICAgICMgYW5kIG5vdGUgdGhlIGluZGV4IGlmIGl0IHdhcyBhbiBvcHRpb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3B0aW9uX3R1cGxlID0gc2VsZi5fcGFyc2Vfb3B0aW9uYWwoYXJnX3N0cmluZykKKyAgICAgICAgICAgICAgICBpZiBvcHRpb25fdHVwbGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybiA9ICdBJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdfaW5kaWNlc1tpXSA9IG9wdGlvbl90dXBsZQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuID0gJ08nCisgICAgICAgICAgICAgICAgYXJnX3N0cmluZ19wYXR0ZXJuX3BhcnRzLmFwcGVuZChwYXR0ZXJuKQorCisgICAgICAgICMgam9pbiB0aGUgcGllY2VzIHRvZ2V0aGVyIHRvIGZvcm0gdGhlIHBhdHRlcm4KKyAgICAgICAgYXJnX3N0cmluZ3NfcGF0dGVybiA9ICcnLmpvaW4oYXJnX3N0cmluZ19wYXR0ZXJuX3BhcnRzKQorCisgICAgICAgICMgY29udmVydHMgYXJnIHN0cmluZ3MgdG8gdGhlIGFwcHJvcHJpYXRlIGFuZCB0aGVuIHRha2VzIHRoZSBhY3Rpb24KKyAgICAgICAgc2Vlbl9hY3Rpb25zID0gc2V0KCkKKyAgICAgICAgc2Vlbl9ub25fZGVmYXVsdF9hY3Rpb25zID0gc2V0KCkKKworICAgICAgICBkZWYgdGFrZV9hY3Rpb24oYWN0aW9uLCBhcmd1bWVudF9zdHJpbmdzLCBvcHRpb25fc3RyaW5nPU5vbmUpOgorICAgICAgICAgICAgc2Vlbl9hY3Rpb25zLmFkZChhY3Rpb24pCisgICAgICAgICAgICBhcmd1bWVudF92YWx1ZXMgPSBzZWxmLl9nZXRfdmFsdWVzKGFjdGlvbiwgYXJndW1lbnRfc3RyaW5ncykKKworICAgICAgICAgICAgIyBlcnJvciBpZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBhbGxvd2VkIHdpdGggb3RoZXIgcHJldmlvdXNseQorICAgICAgICAgICAgIyBzZWVuIGFyZ3VtZW50cywgYXNzdW1pbmcgdGhhdCBhY3Rpb25zIHRoYXQgdXNlIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAjIHZhbHVlIGRvbid0IHJlYWxseSBjb3VudCBhcyAicHJlc2VudCIKKyAgICAgICAgICAgIGlmIGFyZ3VtZW50X3ZhbHVlcyBpcyBub3QgYWN0aW9uLmRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc2Vlbl9ub25fZGVmYXVsdF9hY3Rpb25zLmFkZChhY3Rpb24pCisgICAgICAgICAgICAgICAgZm9yIGNvbmZsaWN0X2FjdGlvbiBpbiBhY3Rpb25fY29uZmxpY3RzLmdldChhY3Rpb24sIFtdKToKKyAgICAgICAgICAgICAgICAgICAgaWYgY29uZmxpY3RfYWN0aW9uIGluIHNlZW5fbm9uX2RlZmF1bHRfYWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IF8oJ25vdCBhbGxvd2VkIHdpdGggYXJndW1lbnQgJXMnKQorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uX25hbWUgPSBfZ2V0X2FjdGlvbl9uYW1lKGNvbmZsaWN0X2FjdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IoYWN0aW9uLCBtc2cgJSBhY3Rpb25fbmFtZSkKKworICAgICAgICAgICAgIyB0YWtlIHRoZSBhY3Rpb24gaWYgd2UgZGlkbid0IHJlY2VpdmUgYSBTVVBQUkVTUyB2YWx1ZQorICAgICAgICAgICAgIyAoZS5nLiBmcm9tIGEgZGVmYXVsdCkKKyAgICAgICAgICAgIGlmIGFyZ3VtZW50X3ZhbHVlcyBpcyBub3QgU1VQUFJFU1M6CisgICAgICAgICAgICAgICAgYWN0aW9uKHNlbGYsIG5hbWVzcGFjZSwgYXJndW1lbnRfdmFsdWVzLCBvcHRpb25fc3RyaW5nKQorCisgICAgICAgICMgZnVuY3Rpb24gdG8gY29udmVydCBhcmdfc3RyaW5ncyBpbnRvIGFuIG9wdGlvbmFsIGFjdGlvbgorICAgICAgICBkZWYgY29uc3VtZV9vcHRpb25hbChzdGFydF9pbmRleCk6CisKKyAgICAgICAgICAgICMgZ2V0IHRoZSBvcHRpb25hbCBpZGVudGlmaWVkIGF0IHRoaXMgaW5kZXgKKyAgICAgICAgICAgIG9wdGlvbl90dXBsZSA9IG9wdGlvbl9zdHJpbmdfaW5kaWNlc1tzdGFydF9pbmRleF0KKyAgICAgICAgICAgIGFjdGlvbiwgb3B0aW9uX3N0cmluZywgZXhwbGljaXRfYXJnID0gb3B0aW9uX3R1cGxlCisKKyAgICAgICAgICAgICMgaWRlbnRpZnkgYWRkaXRpb25hbCBvcHRpb25hbHMgaW4gdGhlIHNhbWUgYXJnIHN0cmluZworICAgICAgICAgICAgIyAoZS5nLiAteHl6IGlzIHRoZSBzYW1lIGFzIC14IC15IC16IGlmIG5vIGFyZ3MgYXJlIHJlcXVpcmVkKQorICAgICAgICAgICAgbWF0Y2hfYXJndW1lbnQgPSBzZWxmLl9tYXRjaF9hcmd1bWVudAorICAgICAgICAgICAgYWN0aW9uX3R1cGxlcyA9IFtdCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorCisgICAgICAgICAgICAgICAgIyBpZiB3ZSBmb3VuZCBubyBvcHRpb25hbCBhY3Rpb24sIHNraXAgaXQKKyAgICAgICAgICAgICAgICBpZiBhY3Rpb24gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFzLmFwcGVuZChhcmdfc3RyaW5nc1tzdGFydF9pbmRleF0pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFydF9pbmRleCArIDEKKworICAgICAgICAgICAgICAgICMgaWYgdGhlcmUgaXMgYW4gZXhwbGljaXQgYXJndW1lbnQsIHRyeSB0byBtYXRjaCB0aGUKKyAgICAgICAgICAgICAgICAjIG9wdGlvbmFsJ3Mgc3RyaW5nIGFyZ3VtZW50cyB0byBvbmx5IHRoaXMKKyAgICAgICAgICAgICAgICBpZiBleHBsaWNpdF9hcmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGFyZ19jb3VudCA9IG1hdGNoX2FyZ3VtZW50KGFjdGlvbiwgJ0EnKQorCisgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIGFjdGlvbiBpcyBhIHNpbmdsZS1kYXNoIG9wdGlvbiBhbmQgdGFrZXMgbm8KKyAgICAgICAgICAgICAgICAgICAgIyBhcmd1bWVudHMsIHRyeSB0byBwYXJzZSBtb3JlIHNpbmdsZS1kYXNoIG9wdGlvbnMgb3V0CisgICAgICAgICAgICAgICAgICAgICMgb2YgdGhlIHRhaWwgb2YgdGhlIG9wdGlvbiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgY2hhcnMgPSBzZWxmLnByZWZpeF9jaGFycworICAgICAgICAgICAgICAgICAgICBpZiBhcmdfY291bnQgPT0gMCBhbmQgb3B0aW9uX3N0cmluZ1sxXSBub3QgaW4gY2hhcnM6CisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHVwbGVzLmFwcGVuZCgoYWN0aW9uLCBbXSwgb3B0aW9uX3N0cmluZykpCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyID0gb3B0aW9uX3N0cmluZ1swXQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX3N0cmluZyA9IGNoYXIgKyBleHBsaWNpdF9hcmdbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld19leHBsaWNpdF9hcmcgPSBleHBsaWNpdF9hcmdbMTpdIG9yIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsc19tYXAgPSBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wdGlvbl9zdHJpbmcgaW4gb3B0aW9uYWxzX21hcDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBvcHRpb25hbHNfbWFwW29wdGlvbl9zdHJpbmddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwbGljaXRfYXJnID0gbmV3X2V4cGxpY2l0X2FyZworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSBfKCdpZ25vcmVkIGV4cGxpY2l0IGFyZ3VtZW50ICVyJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yKGFjdGlvbiwgbXNnICUgZXhwbGljaXRfYXJnKQorCisgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIGFjdGlvbiBleHBlY3QgZXhhY3RseSBvbmUgYXJndW1lbnQsIHdlJ3ZlCisgICAgICAgICAgICAgICAgICAgICMgc3VjY2Vzc2Z1bGx5IG1hdGNoZWQgdGhlIG9wdGlvbjsgZXhpdCB0aGUgbG9vcAorICAgICAgICAgICAgICAgICAgICBlbGlmIGFyZ19jb3VudCA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHN0YXJ0X2luZGV4ICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IFtleHBsaWNpdF9hcmddCisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHVwbGVzLmFwcGVuZCgoYWN0aW9uLCBhcmdzLCBvcHRpb25fc3RyaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICAgICAgIyBlcnJvciBpZiBhIGRvdWJsZS1kYXNoIG9wdGlvbiBkaWQgbm90IHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBleHBsaWNpdCBhcmd1bWVudAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gXygnaWdub3JlZCBleHBsaWNpdCBhcmd1bWVudCAlcicpCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yKGFjdGlvbiwgbXNnICUgZXhwbGljaXRfYXJnKQorCisgICAgICAgICAgICAgICAgIyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCBhcmd1bWVudCwgdHJ5IHRvIG1hdGNoIHRoZQorICAgICAgICAgICAgICAgICMgb3B0aW9uYWwncyBzdHJpbmcgYXJndW1lbnRzIHdpdGggdGhlIGZvbGxvd2luZyBzdHJpbmdzCisgICAgICAgICAgICAgICAgIyBpZiBzdWNjZXNzZnVsLCBleGl0IHRoZSBsb29wCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydF9pbmRleCArIDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRfcGF0dGVybnMgPSBhcmdfc3RyaW5nc19wYXR0ZXJuW3N0YXJ0Ol0KKyAgICAgICAgICAgICAgICAgICAgYXJnX2NvdW50ID0gbWF0Y2hfYXJndW1lbnQoYWN0aW9uLCBzZWxlY3RlZF9wYXR0ZXJucykKKyAgICAgICAgICAgICAgICAgICAgc3RvcCA9IHN0YXJ0ICsgYXJnX2NvdW50CisgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdfc3RyaW5nc1tzdGFydDpzdG9wXQorICAgICAgICAgICAgICAgICAgICBhY3Rpb25fdHVwbGVzLmFwcGVuZCgoYWN0aW9uLCBhcmdzLCBvcHRpb25fc3RyaW5nKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgIyBhZGQgdGhlIE9wdGlvbmFsIHRvIHRoZSBsaXN0IGFuZCByZXR1cm4gdGhlIGluZGV4IGF0IHdoaWNoCisgICAgICAgICAgICAjIHRoZSBPcHRpb25hbCdzIHN0cmluZyBhcmdzIHN0b3BwZWQKKyAgICAgICAgICAgIGFzc2VydCBhY3Rpb25fdHVwbGVzCisgICAgICAgICAgICBmb3IgYWN0aW9uLCBhcmdzLCBvcHRpb25fc3RyaW5nIGluIGFjdGlvbl90dXBsZXM6CisgICAgICAgICAgICAgICAgdGFrZV9hY3Rpb24oYWN0aW9uLCBhcmdzLCBvcHRpb25fc3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIHN0b3AKKworICAgICAgICAjIHRoZSBsaXN0IG9mIFBvc2l0aW9uYWxzIGxlZnQgdG8gYmUgcGFyc2VkOyB0aGlzIGlzIG1vZGlmaWVkCisgICAgICAgICMgYnkgY29uc3VtZV9wb3NpdGlvbmFscygpCisgICAgICAgIHBvc2l0aW9uYWxzID0gc2VsZi5fZ2V0X3Bvc2l0aW9uYWxfYWN0aW9ucygpCisKKyAgICAgICAgIyBmdW5jdGlvbiB0byBjb252ZXJ0IGFyZ19zdHJpbmdzIGludG8gcG9zaXRpb25hbCBhY3Rpb25zCisgICAgICAgIGRlZiBjb25zdW1lX3Bvc2l0aW9uYWxzKHN0YXJ0X2luZGV4KToKKyAgICAgICAgICAgICMgbWF0Y2ggYXMgbWFueSBQb3NpdGlvbmFscyBhcyBwb3NzaWJsZQorICAgICAgICAgICAgbWF0Y2hfcGFydGlhbCA9IHNlbGYuX21hdGNoX2FyZ3VtZW50c19wYXJ0aWFsCisgICAgICAgICAgICBzZWxlY3RlZF9wYXR0ZXJuID0gYXJnX3N0cmluZ3NfcGF0dGVybltzdGFydF9pbmRleDpdCisgICAgICAgICAgICBhcmdfY291bnRzID0gbWF0Y2hfcGFydGlhbChwb3NpdGlvbmFscywgc2VsZWN0ZWRfcGF0dGVybikKKworICAgICAgICAgICAgIyBzbGljZSBvZmYgdGhlIGFwcHJvcHJpYXRlIGFyZyBzdHJpbmdzIGZvciBlYWNoIFBvc2l0aW9uYWwKKyAgICAgICAgICAgICMgYW5kIGFkZCB0aGUgUG9zaXRpb25hbCBhbmQgaXRzIGFyZ3MgdG8gdGhlIGxpc3QKKyAgICAgICAgICAgIGZvciBhY3Rpb24sIGFyZ19jb3VudCBpbiB6aXAocG9zaXRpb25hbHMsIGFyZ19jb3VudHMpOgorICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdfc3RyaW5nc1tzdGFydF9pbmRleDogc3RhcnRfaW5kZXggKyBhcmdfY291bnRdCisgICAgICAgICAgICAgICAgc3RhcnRfaW5kZXggKz0gYXJnX2NvdW50CisgICAgICAgICAgICAgICAgdGFrZV9hY3Rpb24oYWN0aW9uLCBhcmdzKQorCisgICAgICAgICAgICAjIHNsaWNlIG9mZiB0aGUgUG9zaXRpb25hbHMgdGhhdCB3ZSBqdXN0IHBhcnNlZCBhbmQgcmV0dXJuIHRoZQorICAgICAgICAgICAgIyBpbmRleCBhdCB3aGljaCB0aGUgUG9zaXRpb25hbHMnIHN0cmluZyBhcmdzIHN0b3BwZWQKKyAgICAgICAgICAgIHBvc2l0aW9uYWxzWzpdID0gcG9zaXRpb25hbHNbbGVuKGFyZ19jb3VudHMpOl0KKyAgICAgICAgICAgIHJldHVybiBzdGFydF9pbmRleAorCisgICAgICAgICMgY29uc3VtZSBQb3NpdGlvbmFscyBhbmQgT3B0aW9uYWxzIGFsdGVybmF0ZWx5LCB1bnRpbCB3ZSBoYXZlCisgICAgICAgICMgcGFzc2VkIHRoZSBsYXN0IG9wdGlvbiBzdHJpbmcKKyAgICAgICAgZXh0cmFzID0gW10KKyAgICAgICAgc3RhcnRfaW5kZXggPSAwCisgICAgICAgIGlmIG9wdGlvbl9zdHJpbmdfaW5kaWNlczoKKyAgICAgICAgICAgIG1heF9vcHRpb25fc3RyaW5nX2luZGV4ID0gbWF4KG9wdGlvbl9zdHJpbmdfaW5kaWNlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1heF9vcHRpb25fc3RyaW5nX2luZGV4ID0gLTEKKyAgICAgICAgd2hpbGUgc3RhcnRfaW5kZXggPD0gbWF4X29wdGlvbl9zdHJpbmdfaW5kZXg6CisKKyAgICAgICAgICAgICMgY29uc3VtZSBhbnkgUG9zaXRpb25hbHMgcHJlY2VkaW5nIHRoZSBuZXh0IG9wdGlvbgorICAgICAgICAgICAgbmV4dF9vcHRpb25fc3RyaW5nX2luZGV4ID0gbWluKFsKKyAgICAgICAgICAgICAgICBpbmRleAorICAgICAgICAgICAgICAgIGZvciBpbmRleCBpbiBvcHRpb25fc3RyaW5nX2luZGljZXMKKyAgICAgICAgICAgICAgICBpZiBpbmRleCA+PSBzdGFydF9pbmRleF0pCisgICAgICAgICAgICBpZiBzdGFydF9pbmRleCAhPSBuZXh0X29wdGlvbl9zdHJpbmdfaW5kZXg6CisgICAgICAgICAgICAgICAgcG9zaXRpb25hbHNfZW5kX2luZGV4ID0gY29uc3VtZV9wb3NpdGlvbmFscyhzdGFydF9pbmRleCkKKworICAgICAgICAgICAgICAgICMgb25seSB0cnkgdG8gcGFyc2UgdGhlIG5leHQgb3B0aW9uYWwgaWYgd2UgZGlkbid0IGNvbnN1bWUKKyAgICAgICAgICAgICAgICAjIHRoZSBvcHRpb24gc3RyaW5nIGR1cmluZyB0aGUgcG9zaXRpb25hbHMgcGFyc2luZworICAgICAgICAgICAgICAgIGlmIHBvc2l0aW9uYWxzX2VuZF9pbmRleCA+IHN0YXJ0X2luZGV4OgorICAgICAgICAgICAgICAgICAgICBzdGFydF9pbmRleCA9IHBvc2l0aW9uYWxzX2VuZF9pbmRleAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2luZGV4ID0gcG9zaXRpb25hbHNfZW5kX2luZGV4CisKKyAgICAgICAgICAgICMgaWYgd2UgY29uc3VtZWQgYWxsIHRoZSBwb3NpdGlvbmFscyB3ZSBjb3VsZCBhbmQgd2UncmUgbm90CisgICAgICAgICAgICAjIGF0IHRoZSBpbmRleCBvZiBhbiBvcHRpb24gc3RyaW5nLCB0aGVyZSB3ZXJlIGV4dHJhIGFyZ3VtZW50cworICAgICAgICAgICAgaWYgc3RhcnRfaW5kZXggbm90IGluIG9wdGlvbl9zdHJpbmdfaW5kaWNlczoKKyAgICAgICAgICAgICAgICBzdHJpbmdzID0gYXJnX3N0cmluZ3Nbc3RhcnRfaW5kZXg6bmV4dF9vcHRpb25fc3RyaW5nX2luZGV4XQorICAgICAgICAgICAgICAgIGV4dHJhcy5leHRlbmQoc3RyaW5ncykKKyAgICAgICAgICAgICAgICBzdGFydF9pbmRleCA9IG5leHRfb3B0aW9uX3N0cmluZ19pbmRleAorCisgICAgICAgICAgICAjIGNvbnN1bWUgdGhlIG5leHQgb3B0aW9uYWwgYW5kIGFueSBhcmd1bWVudHMgZm9yIGl0CisgICAgICAgICAgICBzdGFydF9pbmRleCA9IGNvbnN1bWVfb3B0aW9uYWwoc3RhcnRfaW5kZXgpCisKKyAgICAgICAgIyBjb25zdW1lIGFueSBwb3NpdGlvbmFscyBmb2xsb3dpbmcgdGhlIGxhc3QgT3B0aW9uYWwKKyAgICAgICAgc3RvcF9pbmRleCA9IGNvbnN1bWVfcG9zaXRpb25hbHMoc3RhcnRfaW5kZXgpCisKKyAgICAgICAgIyBpZiB3ZSBkaWRuJ3QgY29uc3VtZSBhbGwgdGhlIGFyZ3VtZW50IHN0cmluZ3MsIHRoZXJlIHdlcmUgZXh0cmFzCisgICAgICAgIGV4dHJhcy5leHRlbmQoYXJnX3N0cmluZ3Nbc3RvcF9pbmRleDpdKQorCisgICAgICAgICMgaWYgd2UgZGlkbid0IHVzZSBhbGwgdGhlIFBvc2l0aW9uYWwgb2JqZWN0cywgdGhlcmUgd2VyZSB0b28gZmV3CisgICAgICAgICMgYXJnIHN0cmluZ3Mgc3VwcGxpZWQuCisgICAgICAgIGlmIHBvc2l0aW9uYWxzOgorICAgICAgICAgICAgc2VsZi5lcnJvcihfKCd0b28gZmV3IGFyZ3VtZW50cycpKQorCisgICAgICAgICMgbWFrZSBzdXJlIGFsbCByZXF1aXJlZCBhY3Rpb25zIHdlcmUgcHJlc2VudCwgYW5kIGNvbnZlcnQgZGVmYXVsdHMuCisgICAgICAgIGZvciBhY3Rpb24gaW4gc2VsZi5fYWN0aW9uczoKKyAgICAgICAgICAgIGlmIGFjdGlvbiBub3QgaW4gc2Vlbl9hY3Rpb25zOgorICAgICAgICAgICAgICAgIGlmIGFjdGlvbi5yZXF1aXJlZDoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IF9nZXRfYWN0aW9uX25hbWUoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKF8oJ2FyZ3VtZW50ICVzIGlzIHJlcXVpcmVkJykgJSBuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgQ29udmVydCBhY3Rpb24gZGVmYXVsdCBub3cgaW5zdGVhZCBvZiBkb2luZyBpdCBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgIyBwYXJzaW5nIGFyZ3VtZW50cyB0byBhdm9pZCBjYWxsaW5nIGNvbnZlcnQgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICMgdHdpY2UgKHdoaWNoIG1heSBmYWlsKSBpZiB0aGUgYXJndW1lbnQgd2FzIGdpdmVuLCBidXQKKyAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGlmIGl0IHdhcyBkZWZpbmVkIGFscmVhZHkgaW4gdGhlIG5hbWVzcGFjZQorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmRlZmF1bHQgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShhY3Rpb24uZGVmYXVsdCwgYmFzZXN0cmluZykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzYXR0cihuYW1lc3BhY2UsIGFjdGlvbi5kZXN0KSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24uZGVmYXVsdCBpcyBnZXRhdHRyKG5hbWVzcGFjZSwgYWN0aW9uLmRlc3QpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBhY3Rpb24uZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZ2V0X3ZhbHVlKGFjdGlvbiwgYWN0aW9uLmRlZmF1bHQpKQorCisgICAgICAgICMgbWFrZSBzdXJlIGFsbCByZXF1aXJlZCBncm91cHMgaGFkIG9uZSBvcHRpb24gcHJlc2VudAorICAgICAgICBmb3IgZ3JvdXAgaW4gc2VsZi5fbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwczoKKyAgICAgICAgICAgIGlmIGdyb3VwLnJlcXVpcmVkOgorICAgICAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gZ3JvdXAuX2dyb3VwX2FjdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIGlmIGFjdGlvbiBpbiBzZWVuX25vbl9kZWZhdWx0X2FjdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgIyBpZiBubyBhY3Rpb25zIHdlcmUgdXNlZCwgcmVwb3J0IHRoZSBlcnJvcgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5hbWVzID0gW19nZXRfYWN0aW9uX25hbWUoYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWN0aW9uIGluIGdyb3VwLl9ncm91cF9hY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFjdGlvbi5oZWxwIGlzIG5vdCBTVVBQUkVTU10KKyAgICAgICAgICAgICAgICAgICAgbXNnID0gXygnb25lIG9mIHRoZSBhcmd1bWVudHMgJXMgaXMgcmVxdWlyZWQnKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKG1zZyAlICcgJy5qb2luKG5hbWVzKSkKKworICAgICAgICAjIHJldHVybiB0aGUgdXBkYXRlZCBuYW1lc3BhY2UgYW5kIHRoZSBleHRyYSBhcmd1bWVudHMKKyAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSwgZXh0cmFzCisKKyAgICBkZWYgX3JlYWRfYXJnc19mcm9tX2ZpbGVzKHNlbGYsIGFyZ19zdHJpbmdzKToKKyAgICAgICAgIyBleHBhbmQgYXJndW1lbnRzIHJlZmVyZW5jaW5nIGZpbGVzCisgICAgICAgIG5ld19hcmdfc3RyaW5ncyA9IFtdCisgICAgICAgIGZvciBhcmdfc3RyaW5nIGluIGFyZ19zdHJpbmdzOgorCisgICAgICAgICAgICAjIGZvciByZWd1bGFyIGFyZ3VtZW50cywganVzdCBhZGQgdGhlbSBiYWNrIGludG8gdGhlIGxpc3QKKyAgICAgICAgICAgIGlmIG5vdCBhcmdfc3RyaW5nIG9yIGFyZ19zdHJpbmdbMF0gbm90IGluIHNlbGYuZnJvbWZpbGVfcHJlZml4X2NoYXJzOgorICAgICAgICAgICAgICAgIG5ld19hcmdfc3RyaW5ncy5hcHBlbmQoYXJnX3N0cmluZykKKworICAgICAgICAgICAgIyByZXBsYWNlIGFyZ3VtZW50cyByZWZlcmVuY2luZyBmaWxlcyB3aXRoIHRoZSBmaWxlIGNvbnRlbnQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBhcmdzX2ZpbGUgPSBvcGVuKGFyZ19zdHJpbmdbMTpdKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdfc3RyaW5ncyA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXJnX2xpbmUgaW4gYXJnc19maWxlLnJlYWQoKS5zcGxpdGxpbmVzKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLmNvbnZlcnRfYXJnX2xpbmVfdG9fYXJncyhhcmdfbGluZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ19zdHJpbmdzLmFwcGVuZChhcmcpCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdfc3RyaW5ncyA9IHNlbGYuX3JlYWRfYXJnc19mcm9tX2ZpbGVzKGFyZ19zdHJpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2FyZ19zdHJpbmdzLmV4dGVuZChhcmdfc3RyaW5ncykKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NfZmlsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGVyciA9IF9zeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHN0cihlcnIpKQorCisgICAgICAgICMgcmV0dXJuIHRoZSBtb2RpZmllZCBhcmd1bWVudCBsaXN0CisgICAgICAgIHJldHVybiBuZXdfYXJnX3N0cmluZ3MKKworICAgIGRlZiBjb252ZXJ0X2FyZ19saW5lX3RvX2FyZ3Moc2VsZiwgYXJnX2xpbmUpOgorICAgICAgICByZXR1cm4gW2FyZ19saW5lXQorCisgICAgZGVmIF9tYXRjaF9hcmd1bWVudChzZWxmLCBhY3Rpb24sIGFyZ19zdHJpbmdzX3BhdHRlcm4pOgorICAgICAgICAjIG1hdGNoIHRoZSBwYXR0ZXJuIGZvciB0aGlzIGFjdGlvbiB0byB0aGUgYXJnIHN0cmluZ3MKKyAgICAgICAgbmFyZ3NfcGF0dGVybiA9IHNlbGYuX2dldF9uYXJnc19wYXR0ZXJuKGFjdGlvbikKKyAgICAgICAgbWF0Y2ggPSBfcmUubWF0Y2gobmFyZ3NfcGF0dGVybiwgYXJnX3N0cmluZ3NfcGF0dGVybikKKworICAgICAgICAjIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB3ZSB3ZXJlbid0IGFibGUgdG8gZmluZCBhIG1hdGNoCisgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICBuYXJnc19lcnJvcnMgPSB7CisgICAgICAgICAgICAgICAgTm9uZTogXygnZXhwZWN0ZWQgb25lIGFyZ3VtZW50JyksCisgICAgICAgICAgICAgICAgT1BUSU9OQUw6IF8oJ2V4cGVjdGVkIGF0IG1vc3Qgb25lIGFyZ3VtZW50JyksCisgICAgICAgICAgICAgICAgT05FX09SX01PUkU6IF8oJ2V4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudCcpLAorICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdCA9IF8oJ2V4cGVjdGVkICVzIGFyZ3VtZW50KHMpJykgJSBhY3Rpb24ubmFyZ3MKKyAgICAgICAgICAgIG1zZyA9IG5hcmdzX2Vycm9ycy5nZXQoYWN0aW9uLm5hcmdzLCBkZWZhdWx0KQorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRFcnJvcihhY3Rpb24sIG1zZykKKworICAgICAgICAjIHJldHVybiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBtYXRjaGVkCisgICAgICAgIHJldHVybiBsZW4obWF0Y2guZ3JvdXAoMSkpCisKKyAgICBkZWYgX21hdGNoX2FyZ3VtZW50c19wYXJ0aWFsKHNlbGYsIGFjdGlvbnMsIGFyZ19zdHJpbmdzX3BhdHRlcm4pOgorICAgICAgICAjIHByb2dyZXNzaXZlbHkgc2hvcnRlbiB0aGUgYWN0aW9ucyBsaXN0IGJ5IHNsaWNpbmcgb2ZmIHRoZQorICAgICAgICAjIGZpbmFsIGFjdGlvbnMgdW50aWwgd2UgZmluZCBhIG1hdGNoCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhY3Rpb25zKSwgMCwgLTEpOgorICAgICAgICAgICAgYWN0aW9uc19zbGljZSA9IGFjdGlvbnNbOmldCisgICAgICAgICAgICBwYXR0ZXJuID0gJycuam9pbihbc2VsZi5fZ2V0X25hcmdzX3BhdHRlcm4oYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhY3Rpb24gaW4gYWN0aW9uc19zbGljZV0pCisgICAgICAgICAgICBtYXRjaCA9IF9yZS5tYXRjaChwYXR0ZXJuLCBhcmdfc3RyaW5nc19wYXR0ZXJuKQorICAgICAgICAgICAgaWYgbWF0Y2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChbbGVuKHN0cmluZykgZm9yIHN0cmluZyBpbiBtYXRjaC5ncm91cHMoKV0pCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIHJldHVybiB0aGUgbGlzdCBvZiBhcmcgc3RyaW5nIGNvdW50cworICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX3BhcnNlX29wdGlvbmFsKHNlbGYsIGFyZ19zdHJpbmcpOgorICAgICAgICAjIGlmIGl0J3MgYW4gZW1wdHkgc3RyaW5nLCBpdCB3YXMgbWVhbnQgdG8gYmUgYSBwb3NpdGlvbmFsCisgICAgICAgIGlmIG5vdCBhcmdfc3RyaW5nOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGlmIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIHByZWZpeCwgaXQgd2FzIG1lYW50IHRvIGJlIHBvc2l0aW9uYWwKKyAgICAgICAgaWYgbm90IGFyZ19zdHJpbmdbMF0gaW4gc2VsZi5wcmVmaXhfY2hhcnM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgaWYgdGhlIG9wdGlvbiBzdHJpbmcgaXMgcHJlc2VudCBpbiB0aGUgcGFyc2VyLCByZXR1cm4gdGhlIGFjdGlvbgorICAgICAgICBpZiBhcmdfc3RyaW5nIGluIHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uczoKKyAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uc1thcmdfc3RyaW5nXQorICAgICAgICAgICAgcmV0dXJuIGFjdGlvbiwgYXJnX3N0cmluZywgTm9uZQorCisgICAgICAgICMgaWYgaXQncyBqdXN0IGEgc2luZ2xlIGNoYXJhY3RlciwgaXQgd2FzIG1lYW50IHRvIGJlIHBvc2l0aW9uYWwKKyAgICAgICAgaWYgbGVuKGFyZ19zdHJpbmcpID09IDE6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgaWYgdGhlIG9wdGlvbiBzdHJpbmcgYmVmb3JlIHRoZSAiPSIgaXMgcHJlc2VudCwgcmV0dXJuIHRoZSBhY3Rpb24KKyAgICAgICAgaWYgJz0nIGluIGFyZ19zdHJpbmc6CisgICAgICAgICAgICBvcHRpb25fc3RyaW5nLCBleHBsaWNpdF9hcmcgPSBhcmdfc3RyaW5nLnNwbGl0KCc9JywgMSkKKyAgICAgICAgICAgIGlmIG9wdGlvbl9zdHJpbmcgaW4gc2VsZi5fb3B0aW9uX3N0cmluZ19hY3Rpb25zOgorICAgICAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uc1tvcHRpb25fc3RyaW5nXQorICAgICAgICAgICAgICAgIHJldHVybiBhY3Rpb24sIG9wdGlvbl9zdHJpbmcsIGV4cGxpY2l0X2FyZworCisgICAgICAgICMgc2VhcmNoIHRocm91Z2ggYWxsIHBvc3NpYmxlIHByZWZpeGVzIG9mIHRoZSBvcHRpb24gc3RyaW5nCisgICAgICAgICMgYW5kIGFsbCBhY3Rpb25zIGluIHRoZSBwYXJzZXIgZm9yIHBvc3NpYmxlIGludGVycHJldGF0aW9ucworICAgICAgICBvcHRpb25fdHVwbGVzID0gc2VsZi5fZ2V0X29wdGlvbl90dXBsZXMoYXJnX3N0cmluZykKKworICAgICAgICAjIGlmIG11bHRpcGxlIGFjdGlvbnMgbWF0Y2gsIHRoZSBvcHRpb24gc3RyaW5nIHdhcyBhbWJpZ3VvdXMKKyAgICAgICAgaWYgbGVuKG9wdGlvbl90dXBsZXMpID4gMToKKyAgICAgICAgICAgIG9wdGlvbnMgPSAnLCAnLmpvaW4oW29wdGlvbl9zdHJpbmcKKyAgICAgICAgICAgICAgICBmb3IgYWN0aW9uLCBvcHRpb25fc3RyaW5nLCBleHBsaWNpdF9hcmcgaW4gb3B0aW9uX3R1cGxlc10pCisgICAgICAgICAgICB0dXAgPSBhcmdfc3RyaW5nLCBvcHRpb25zCisgICAgICAgICAgICBzZWxmLmVycm9yKF8oJ2FtYmlndW91cyBvcHRpb246ICVzIGNvdWxkIG1hdGNoICVzJykgJSB0dXApCisKKyAgICAgICAgIyBpZiBleGFjdGx5IG9uZSBhY3Rpb24gbWF0Y2hlZCwgdGhpcyBzZWdtZW50YXRpb24gaXMgZ29vZCwKKyAgICAgICAgIyBzbyByZXR1cm4gdGhlIHBhcnNlZCBhY3Rpb24KKyAgICAgICAgZWxpZiBsZW4ob3B0aW9uX3R1cGxlcykgPT0gMToKKyAgICAgICAgICAgIG9wdGlvbl90dXBsZSwgPSBvcHRpb25fdHVwbGVzCisgICAgICAgICAgICByZXR1cm4gb3B0aW9uX3R1cGxlCisKKyAgICAgICAgIyBpZiBpdCB3YXMgbm90IGZvdW5kIGFzIGFuIG9wdGlvbiwgYnV0IGl0IGxvb2tzIGxpa2UgYSBuZWdhdGl2ZQorICAgICAgICAjIG51bWJlciwgaXQgd2FzIG1lYW50IHRvIGJlIHBvc2l0aW9uYWwKKyAgICAgICAgIyB1bmxlc3MgdGhlcmUgYXJlIG5lZ2F0aXZlLW51bWJlci1saWtlIG9wdGlvbnMKKyAgICAgICAgaWYgc2VsZi5fbmVnYXRpdmVfbnVtYmVyX21hdGNoZXIubWF0Y2goYXJnX3N0cmluZyk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5faGFzX25lZ2F0aXZlX251bWJlcl9vcHRpb25hbHM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGlmIGl0IGNvbnRhaW5zIGEgc3BhY2UsIGl0IHdhcyBtZWFudCB0byBiZSBhIHBvc2l0aW9uYWwKKyAgICAgICAgaWYgJyAnIGluIGFyZ19zdHJpbmc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgaXQgd2FzIG1lYW50IHRvIGJlIGFuIG9wdGlvbmFsIGJ1dCB0aGVyZSBpcyBubyBzdWNoIG9wdGlvbgorICAgICAgICAjIGluIHRoaXMgcGFyc2VyICh0aG91Z2ggaXQgbWlnaHQgYmUgYSB2YWxpZCBvcHRpb24gaW4gYSBzdWJwYXJzZXIpCisgICAgICAgIHJldHVybiBOb25lLCBhcmdfc3RyaW5nLCBOb25lCisKKyAgICBkZWYgX2dldF9vcHRpb25fdHVwbGVzKHNlbGYsIG9wdGlvbl9zdHJpbmcpOgorICAgICAgICByZXN1bHQgPSBbXQorCisgICAgICAgICMgb3B0aW9uIHN0cmluZ3Mgc3RhcnRpbmcgd2l0aCB0d28gcHJlZml4IGNoYXJhY3RlcnMgYXJlIG9ubHkKKyAgICAgICAgIyBzcGxpdCBhdCB0aGUgJz0nCisgICAgICAgIGNoYXJzID0gc2VsZi5wcmVmaXhfY2hhcnMKKyAgICAgICAgaWYgb3B0aW9uX3N0cmluZ1swXSBpbiBjaGFycyBhbmQgb3B0aW9uX3N0cmluZ1sxXSBpbiBjaGFyczoKKyAgICAgICAgICAgIGlmICc9JyBpbiBvcHRpb25fc3RyaW5nOgorICAgICAgICAgICAgICAgIG9wdGlvbl9wcmVmaXgsIGV4cGxpY2l0X2FyZyA9IG9wdGlvbl9zdHJpbmcuc3BsaXQoJz0nLCAxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcHRpb25fcHJlZml4ID0gb3B0aW9uX3N0cmluZworICAgICAgICAgICAgICAgIGV4cGxpY2l0X2FyZyA9IE5vbmUKKyAgICAgICAgICAgIGZvciBvcHRpb25fc3RyaW5nIGluIHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBvcHRpb25fc3RyaW5nLnN0YXJ0c3dpdGgob3B0aW9uX3ByZWZpeCk6CisgICAgICAgICAgICAgICAgICAgIGFjdGlvbiA9IHNlbGYuX29wdGlvbl9zdHJpbmdfYWN0aW9uc1tvcHRpb25fc3RyaW5nXQorICAgICAgICAgICAgICAgICAgICB0dXAgPSBhY3Rpb24sIG9wdGlvbl9zdHJpbmcsIGV4cGxpY2l0X2FyZworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHR1cCkKKworICAgICAgICAjIHNpbmdsZSBjaGFyYWN0ZXIgb3B0aW9ucyBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggdGhlaXIgYXJndW1lbnRzCisgICAgICAgICMgYnV0IG11bHRpcGxlIGNoYXJhY3RlciBvcHRpb25zIGFsd2F5cyBoYXZlIHRvIGhhdmUgdGhlaXIgYXJndW1lbnQKKyAgICAgICAgIyBzZXBhcmF0ZQorICAgICAgICBlbGlmIG9wdGlvbl9zdHJpbmdbMF0gaW4gY2hhcnMgYW5kIG9wdGlvbl9zdHJpbmdbMV0gbm90IGluIGNoYXJzOgorICAgICAgICAgICAgb3B0aW9uX3ByZWZpeCA9IG9wdGlvbl9zdHJpbmcKKyAgICAgICAgICAgIGV4cGxpY2l0X2FyZyA9IE5vbmUKKyAgICAgICAgICAgIHNob3J0X29wdGlvbl9wcmVmaXggPSBvcHRpb25fc3RyaW5nWzoyXQorICAgICAgICAgICAgc2hvcnRfZXhwbGljaXRfYXJnID0gb3B0aW9uX3N0cmluZ1syOl0KKworICAgICAgICAgICAgZm9yIG9wdGlvbl9zdHJpbmcgaW4gc2VsZi5fb3B0aW9uX3N0cmluZ19hY3Rpb25zOgorICAgICAgICAgICAgICAgIGlmIG9wdGlvbl9zdHJpbmcgPT0gc2hvcnRfb3B0aW9uX3ByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uID0gc2VsZi5fb3B0aW9uX3N0cmluZ19hY3Rpb25zW29wdGlvbl9zdHJpbmddCisgICAgICAgICAgICAgICAgICAgIHR1cCA9IGFjdGlvbiwgb3B0aW9uX3N0cmluZywgc2hvcnRfZXhwbGljaXRfYXJnCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodHVwKQorICAgICAgICAgICAgICAgIGVsaWYgb3B0aW9uX3N0cmluZy5zdGFydHN3aXRoKG9wdGlvbl9wcmVmaXgpOgorICAgICAgICAgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLl9vcHRpb25fc3RyaW5nX2FjdGlvbnNbb3B0aW9uX3N0cmluZ10KKyAgICAgICAgICAgICAgICAgICAgdHVwID0gYWN0aW9uLCBvcHRpb25fc3RyaW5nLCBleHBsaWNpdF9hcmcKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCh0dXApCisKKyAgICAgICAgIyBzaG91bGRuJ3QgZXZlciBnZXQgaGVyZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lcnJvcihfKCd1bmV4cGVjdGVkIG9wdGlvbiBzdHJpbmc6ICVzJykgJSBvcHRpb25fc3RyaW5nKQorCisgICAgICAgICMgcmV0dXJuIHRoZSBjb2xsZWN0ZWQgb3B0aW9uIHR1cGxlcworICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX2dldF9uYXJnc19wYXR0ZXJuKHNlbGYsIGFjdGlvbik6CisgICAgICAgICMgaW4gYWxsIGV4YW1wbGVzIGJlbG93LCB3ZSBoYXZlIHRvIGFsbG93IGZvciAnLS0nIGFyZ3MKKyAgICAgICAgIyB3aGljaCBhcmUgcmVwcmVzZW50ZWQgYXMgJy0nIGluIHRoZSBwYXR0ZXJuCisgICAgICAgIG5hcmdzID0gYWN0aW9uLm5hcmdzCisKKyAgICAgICAgIyB0aGUgZGVmYXVsdCAoTm9uZSkgaXMgYXNzdW1lZCB0byBiZSBhIHNpbmdsZSBhcmd1bWVudAorICAgICAgICBpZiBuYXJncyBpcyBOb25lOgorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9ICcoLSpBLSopJworCisgICAgICAgICMgYWxsb3cgemVybyBvciBvbmUgYXJndW1lbnRzCisgICAgICAgIGVsaWYgbmFyZ3MgPT0gT1BUSU9OQUw6CisgICAgICAgICAgICBuYXJnc19wYXR0ZXJuID0gJygtKkE/LSopJworCisgICAgICAgICMgYWxsb3cgemVybyBvciBtb3JlIGFyZ3VtZW50cworICAgICAgICBlbGlmIG5hcmdzID09IFpFUk9fT1JfTU9SRToKKyAgICAgICAgICAgIG5hcmdzX3BhdHRlcm4gPSAnKC0qW0EtXSopJworCisgICAgICAgICMgYWxsb3cgb25lIG9yIG1vcmUgYXJndW1lbnRzCisgICAgICAgIGVsaWYgbmFyZ3MgPT0gT05FX09SX01PUkU6CisgICAgICAgICAgICBuYXJnc19wYXR0ZXJuID0gJygtKkFbQS1dKiknCisKKyAgICAgICAgIyBhbGxvdyBhbnkgbnVtYmVyIG9mIG9wdGlvbnMgb3IgYXJndW1lbnRzCisgICAgICAgIGVsaWYgbmFyZ3MgPT0gUkVNQUlOREVSOgorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9ICcoWy1BT10qKScKKworICAgICAgICAjIGFsbG93IG9uZSBhcmd1bWVudCBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIG9wdGlvbnMgb3IgYXJndW1lbnRzCisgICAgICAgIGVsaWYgbmFyZ3MgPT0gUEFSU0VSOgorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9ICcoLSpBWy1BT10qKScKKworICAgICAgICAjIGFsbCBvdGhlcnMgc2hvdWxkIGJlIGludGVnZXJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYXJnc19wYXR0ZXJuID0gJygtKiVzLSopJyAlICctKicuam9pbignQScgKiBuYXJncykKKworICAgICAgICAjIGlmIHRoaXMgaXMgYW4gb3B0aW9uYWwgYWN0aW9uLCAtLSBpcyBub3QgYWxsb3dlZAorICAgICAgICBpZiBhY3Rpb24ub3B0aW9uX3N0cmluZ3M6CisgICAgICAgICAgICBuYXJnc19wYXR0ZXJuID0gbmFyZ3NfcGF0dGVybi5yZXBsYWNlKCctKicsICcnKQorICAgICAgICAgICAgbmFyZ3NfcGF0dGVybiA9IG5hcmdzX3BhdHRlcm4ucmVwbGFjZSgnLScsICcnKQorCisgICAgICAgICMgcmV0dXJuIHRoZSBwYXR0ZXJuCisgICAgICAgIHJldHVybiBuYXJnc19wYXR0ZXJuCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgVmFsdWUgY29udmVyc2lvbiBtZXRob2RzCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgX2dldF92YWx1ZXMoc2VsZiwgYWN0aW9uLCBhcmdfc3RyaW5ncyk6CisgICAgICAgICMgZm9yIGV2ZXJ5dGhpbmcgYnV0IFBBUlNFUiwgUkVNQUlOREVSIGFyZ3MsIHN0cmlwIG91dCBmaXJzdCAnLS0nCisgICAgICAgIGlmIGFjdGlvbi5uYXJncyBub3QgaW4gW1BBUlNFUiwgUkVNQUlOREVSXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhcmdfc3RyaW5ncy5yZW1vdmUoJy0tJykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIG9wdGlvbmFsIGFyZ3VtZW50IHByb2R1Y2VzIGEgZGVmYXVsdCB3aGVuIG5vdCBwcmVzZW50CisgICAgICAgIGlmIG5vdCBhcmdfc3RyaW5ncyBhbmQgYWN0aW9uLm5hcmdzID09IE9QVElPTkFMOgorICAgICAgICAgICAgaWYgYWN0aW9uLm9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYWN0aW9uLmNvbnN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYWN0aW9uLmRlZmF1bHQKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fZ2V0X3ZhbHVlKGFjdGlvbiwgdmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfdmFsdWUoYWN0aW9uLCB2YWx1ZSkKKworICAgICAgICAjIHdoZW4gbmFyZ3M9JyonIG9uIGEgcG9zaXRpb25hbCwgaWYgdGhlcmUgd2VyZSBubyBjb21tYW5kLWxpbmUKKyAgICAgICAgIyBhcmdzLCB1c2UgdGhlIGRlZmF1bHQgaWYgaXQgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBOb25lCisgICAgICAgIGVsaWYgKG5vdCBhcmdfc3RyaW5ncyBhbmQgYWN0aW9uLm5hcmdzID09IFpFUk9fT1JfTU9SRSBhbmQKKyAgICAgICAgICAgICAgbm90IGFjdGlvbi5vcHRpb25fc3RyaW5ncyk6CisgICAgICAgICAgICBpZiBhY3Rpb24uZGVmYXVsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGFjdGlvbi5kZWZhdWx0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYXJnX3N0cmluZ3MKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3ZhbHVlKGFjdGlvbiwgdmFsdWUpCisKKyAgICAgICAgIyBzaW5nbGUgYXJndW1lbnQgb3Igb3B0aW9uYWwgYXJndW1lbnQgcHJvZHVjZXMgYSBzaW5nbGUgdmFsdWUKKyAgICAgICAgZWxpZiBsZW4oYXJnX3N0cmluZ3MpID09IDEgYW5kIGFjdGlvbi5uYXJncyBpbiBbTm9uZSwgT1BUSU9OQUxdOgorICAgICAgICAgICAgYXJnX3N0cmluZywgPSBhcmdfc3RyaW5ncworICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9nZXRfdmFsdWUoYWN0aW9uLCBhcmdfc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfdmFsdWUoYWN0aW9uLCB2YWx1ZSkKKworICAgICAgICAjIFJFTUFJTkRFUiBhcmd1bWVudHMgY29udmVydCBhbGwgdmFsdWVzLCBjaGVja2luZyBub25lCisgICAgICAgIGVsaWYgYWN0aW9uLm5hcmdzID09IFJFTUFJTkRFUjoKKyAgICAgICAgICAgIHZhbHVlID0gW3NlbGYuX2dldF92YWx1ZShhY3Rpb24sIHYpIGZvciB2IGluIGFyZ19zdHJpbmdzXQorCisgICAgICAgICMgUEFSU0VSIGFyZ3VtZW50cyBjb252ZXJ0IGFsbCB2YWx1ZXMsIGJ1dCBjaGVjayBvbmx5IHRoZSBmaXJzdAorICAgICAgICBlbGlmIGFjdGlvbi5uYXJncyA9PSBQQVJTRVI6CisgICAgICAgICAgICB2YWx1ZSA9IFtzZWxmLl9nZXRfdmFsdWUoYWN0aW9uLCB2KSBmb3IgdiBpbiBhcmdfc3RyaW5nc10KKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3ZhbHVlKGFjdGlvbiwgdmFsdWVbMF0pCisKKyAgICAgICAgIyBhbGwgb3RoZXIgdHlwZXMgb2YgbmFyZ3MgcHJvZHVjZSBhIGxpc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gW3NlbGYuX2dldF92YWx1ZShhY3Rpb24sIHYpIGZvciB2IGluIGFyZ19zdHJpbmdzXQorICAgICAgICAgICAgZm9yIHYgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hlY2tfdmFsdWUoYWN0aW9uLCB2KQorCisgICAgICAgICMgcmV0dXJuIHRoZSBjb252ZXJ0ZWQgdmFsdWUKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX2dldF92YWx1ZShzZWxmLCBhY3Rpb24sIGFyZ19zdHJpbmcpOgorICAgICAgICB0eXBlX2Z1bmMgPSBzZWxmLl9yZWdpc3RyeV9nZXQoJ3R5cGUnLCBhY3Rpb24udHlwZSwgYWN0aW9uLnR5cGUpCisgICAgICAgIGlmIG5vdCBfY2FsbGFibGUodHlwZV9mdW5jKToKKyAgICAgICAgICAgIG1zZyA9IF8oJyVyIGlzIG5vdCBjYWxsYWJsZScpCisgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yKGFjdGlvbiwgbXNnICUgdHlwZV9mdW5jKQorCisgICAgICAgICMgY29udmVydCB0aGUgdmFsdWUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gdHlwZV9mdW5jKGFyZ19zdHJpbmcpCisKKyAgICAgICAgIyBBcmd1bWVudFR5cGVFcnJvcnMgaW5kaWNhdGUgZXJyb3JzCisgICAgICAgIGV4Y2VwdCBBcmd1bWVudFR5cGVFcnJvcjoKKyAgICAgICAgICAgIG5hbWUgPSBnZXRhdHRyKGFjdGlvbi50eXBlLCAnX19uYW1lX18nLCByZXByKGFjdGlvbi50eXBlKSkKKyAgICAgICAgICAgIG1zZyA9IHN0cihfc3lzLmV4Y19pbmZvKClbMV0pCisgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yKGFjdGlvbiwgbXNnKQorCisgICAgICAgICMgVHlwZUVycm9ycyBvciBWYWx1ZUVycm9ycyBhbHNvIGluZGljYXRlIGVycm9ycworICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICBuYW1lID0gZ2V0YXR0cihhY3Rpb24udHlwZSwgJ19fbmFtZV9fJywgcmVwcihhY3Rpb24udHlwZSkpCisgICAgICAgICAgICBtc2cgPSBfKCdpbnZhbGlkICVzIHZhbHVlOiAlcicpCisgICAgICAgICAgICByYWlzZSBBcmd1bWVudEVycm9yKGFjdGlvbiwgbXNnICUgKG5hbWUsIGFyZ19zdHJpbmcpKQorCisgICAgICAgICMgcmV0dXJuIHRoZSBjb252ZXJ0ZWQgdmFsdWUKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9jaGVja192YWx1ZShzZWxmLCBhY3Rpb24sIHZhbHVlKToKKyAgICAgICAgIyBjb252ZXJ0ZWQgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlIGNob2ljZXMgKGlmIHNwZWNpZmllZCkKKyAgICAgICAgaWYgYWN0aW9uLmNob2ljZXMgaXMgbm90IE5vbmUgYW5kIHZhbHVlIG5vdCBpbiBhY3Rpb24uY2hvaWNlczoKKyAgICAgICAgICAgIHR1cCA9IHZhbHVlLCAnLCAnLmpvaW4obWFwKHJlcHIsIGFjdGlvbi5jaG9pY2VzKSkKKyAgICAgICAgICAgIG1zZyA9IF8oJ2ludmFsaWQgY2hvaWNlOiAlciAoY2hvb3NlIGZyb20gJXMpJykgJSB0dXAKKyAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50RXJyb3IoYWN0aW9uLCBtc2cpCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBIZWxwLWZvcm1hdHRpbmcgbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBkZWYgZm9ybWF0X3VzYWdlKHNlbGYpOgorICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLl9nZXRfZm9ybWF0dGVyKCkKKyAgICAgICAgZm9ybWF0dGVyLmFkZF91c2FnZShzZWxmLnVzYWdlLCBzZWxmLl9hY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cHMpCisgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0X2hlbHAoKQorCisgICAgZGVmIGZvcm1hdF9oZWxwKHNlbGYpOgorICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLl9nZXRfZm9ybWF0dGVyKCkKKworICAgICAgICAjIHVzYWdlCisgICAgICAgIGZvcm1hdHRlci5hZGRfdXNhZ2Uoc2VsZi51c2FnZSwgc2VsZi5fYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXBzKQorCisgICAgICAgICMgZGVzY3JpcHRpb24KKyAgICAgICAgZm9ybWF0dGVyLmFkZF90ZXh0KHNlbGYuZGVzY3JpcHRpb24pCisKKyAgICAgICAgIyBwb3NpdGlvbmFscywgb3B0aW9uYWxzIGFuZCB1c2VyLWRlZmluZWQgZ3JvdXBzCisgICAgICAgIGZvciBhY3Rpb25fZ3JvdXAgaW4gc2VsZi5fYWN0aW9uX2dyb3VwczoKKyAgICAgICAgICAgIGZvcm1hdHRlci5zdGFydF9zZWN0aW9uKGFjdGlvbl9ncm91cC50aXRsZSkKKyAgICAgICAgICAgIGZvcm1hdHRlci5hZGRfdGV4dChhY3Rpb25fZ3JvdXAuZGVzY3JpcHRpb24pCisgICAgICAgICAgICBmb3JtYXR0ZXIuYWRkX2FyZ3VtZW50cyhhY3Rpb25fZ3JvdXAuX2dyb3VwX2FjdGlvbnMpCisgICAgICAgICAgICBmb3JtYXR0ZXIuZW5kX3NlY3Rpb24oKQorCisgICAgICAgICMgZXBpbG9nCisgICAgICAgIGZvcm1hdHRlci5hZGRfdGV4dChzZWxmLmVwaWxvZykKKworICAgICAgICAjIGRldGVybWluZSBoZWxwIGZyb20gZm9ybWF0IGFib3ZlCisgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0X2hlbHAoKQorCisgICAgZGVmIGZvcm1hdF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICdUaGUgZm9ybWF0X3ZlcnNpb24gbWV0aG9kIGlzIGRlcHJlY2F0ZWQgLS0gdGhlICJ2ZXJzaW9uIiAnCisgICAgICAgICAgICAnYXJndW1lbnQgdG8gQXJndW1lbnRQYXJzZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4nLAorICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLl9nZXRfZm9ybWF0dGVyKCkKKyAgICAgICAgZm9ybWF0dGVyLmFkZF90ZXh0KHNlbGYudmVyc2lvbikKKyAgICAgICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRfaGVscCgpCisKKyAgICBkZWYgX2dldF9mb3JtYXR0ZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdHRlcl9jbGFzcyhwcm9nPXNlbGYucHJvZykKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09CisgICAgIyBIZWxwLXByaW50aW5nIG1ldGhvZHMKKyAgICAjID09PT09PT09PT09PT09PT09PT09PQorICAgIGRlZiBwcmludF91c2FnZShzZWxmLCBmaWxlPU5vbmUpOgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICBmaWxlID0gX3N5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5fcHJpbnRfbWVzc2FnZShzZWxmLmZvcm1hdF91c2FnZSgpLCBmaWxlKQorCisgICAgZGVmIHByaW50X2hlbHAoc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgZmlsZSA9IF9zeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuX3ByaW50X21lc3NhZ2Uoc2VsZi5mb3JtYXRfaGVscCgpLCBmaWxlKQorCisgICAgZGVmIHByaW50X3ZlcnNpb24oc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAnVGhlIHByaW50X3ZlcnNpb24gbWV0aG9kIGlzIGRlcHJlY2F0ZWQgLS0gdGhlICJ2ZXJzaW9uIiAnCisgICAgICAgICAgICAnYXJndW1lbnQgdG8gQXJndW1lbnRQYXJzZXIgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4nLAorICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICBzZWxmLl9wcmludF9tZXNzYWdlKHNlbGYuZm9ybWF0X3ZlcnNpb24oKSwgZmlsZSkKKworICAgIGRlZiBfcHJpbnRfbWVzc2FnZShzZWxmLCBtZXNzYWdlLCBmaWxlPU5vbmUpOgorICAgICAgICBpZiBtZXNzYWdlOgorICAgICAgICAgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGZpbGUgPSBfc3lzLnN0ZGVycgorICAgICAgICAgICAgZmlsZS53cml0ZShtZXNzYWdlKQorCisgICAgIyA9PT09PT09PT09PT09PT0KKyAgICAjIEV4aXRpbmcgbWV0aG9kcworICAgICMgPT09PT09PT09PT09PT09CisgICAgZGVmIGV4aXQoc2VsZiwgc3RhdHVzPTAsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgIGlmIG1lc3NhZ2U6CisgICAgICAgICAgICBzZWxmLl9wcmludF9tZXNzYWdlKG1lc3NhZ2UsIF9zeXMuc3RkZXJyKQorICAgICAgICBfc3lzLmV4aXQoc3RhdHVzKQorCisgICAgZGVmIGVycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJlcnJvcihtZXNzYWdlOiBzdHJpbmcpCisKKyAgICAgICAgUHJpbnRzIGEgdXNhZ2UgbWVzc2FnZSBpbmNvcnBvcmF0aW5nIHRoZSBtZXNzYWdlIHRvIHN0ZGVyciBhbmQKKyAgICAgICAgZXhpdHMuCisKKyAgICAgICAgSWYgeW91IG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcywgaXQgc2hvdWxkIG5vdCByZXR1cm4gLS0gaXQKKyAgICAgICAgc2hvdWxkIGVpdGhlciBleGl0IG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHJpbnRfdXNhZ2UoX3N5cy5zdGRlcnIpCisgICAgICAgIHNlbGYuZXhpdCgyLCBfKCclczogZXJyb3I6ICVzXG4nKSAlIChzZWxmLnByb2csIG1lc3NhZ2UpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weWMgYi9saWIvcHl0aG9uMi43L2FyZ3BhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGQwNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weW8gYi9saWIvcHl0aG9uMi43L2FyZ3BhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzkxNDQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hcmdwYXJzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3QucHkgYi9saWIvcHl0aG9uMi43L2FzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDVkZmRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3QucHkKQEAgLTAsMCArMSwzMTEgQEAKKyMgLSotIGNvZGluZzogdXRmLTggLSotCisiIiIKKyAgICBhc3QKKyAgICB+fn4KKworICAgIFRoZSBgYXN0YCBtb2R1bGUgaGVscHMgUHl0aG9uIGFwcGxpY2F0aW9ucyB0byBwcm9jZXNzIHRyZWVzIG9mIHRoZSBQeXRob24KKyAgICBhYnN0cmFjdCBzeW50YXggZ3JhbW1hci4gIFRoZSBhYnN0cmFjdCBzeW50YXggaXRzZWxmIG1pZ2h0IGNoYW5nZSB3aXRoCisgICAgZWFjaCBQeXRob24gcmVsZWFzZTsgdGhpcyBtb2R1bGUgaGVscHMgdG8gZmluZCBvdXQgcHJvZ3JhbW1hdGljYWxseSB3aGF0CisgICAgdGhlIGN1cnJlbnQgZ3JhbW1hciBsb29rcyBsaWtlIGFuZCBhbGxvd3MgbW9kaWZpY2F0aW9ucyBvZiBpdC4KKworICAgIEFuIGFic3RyYWN0IHN5bnRheCB0cmVlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgcGFzc2luZyBgYXN0LlB5Q0ZfT05MWV9BU1RgIGFzCisgICAgYSBmbGFnIHRvIHRoZSBgY29tcGlsZSgpYCBidWlsdGluIGZ1bmN0aW9uIG9yIGJ5IHVzaW5nIHRoZSBgcGFyc2UoKWAKKyAgICBmdW5jdGlvbiBmcm9tIHRoaXMgbW9kdWxlLiAgVGhlIHJlc3VsdCB3aWxsIGJlIGEgdHJlZSBvZiBvYmplY3RzIHdob3NlCisgICAgY2xhc3NlcyBhbGwgaW5oZXJpdCBmcm9tIGBhc3QuQVNUYC4KKworICAgIEEgbW9kaWZpZWQgYWJzdHJhY3Qgc3ludGF4IHRyZWUgY2FuIGJlIGNvbXBpbGVkIGludG8gYSBQeXRob24gY29kZSBvYmplY3QKKyAgICB1c2luZyB0aGUgYnVpbHQtaW4gYGNvbXBpbGUoKWAgZnVuY3Rpb24uCisKKyAgICBBZGRpdGlvbmFsbHkgdmFyaW91cyBoZWxwZXIgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0aGF0IG1ha2Ugd29ya2luZyB3aXRoCisgICAgdGhlIHRyZWVzIHNpbXBsZXIuICBUaGUgbWFpbiBpbnRlbnRpb24gb2YgdGhlIGhlbHBlciBmdW5jdGlvbnMgYW5kIHRoaXMKKyAgICBtb2R1bGUgaW4gZ2VuZXJhbCBpcyB0byBwcm92aWRlIGFuIGVhc3kgdG8gdXNlIGludGVyZmFjZSBmb3IgbGlicmFyaWVzCisgICAgdGhhdCB3b3JrIHRpZ2h0bHkgd2l0aCB0aGUgcHl0aG9uIHN5bnRheCAodGVtcGxhdGUgZW5naW5lcyBmb3IgZXhhbXBsZSkuCisKKworICAgIDpjb3B5cmlnaHQ6IENvcHlyaWdodCAyMDA4IGJ5IEFybWluIFJvbmFjaGVyLgorICAgIDpsaWNlbnNlOiBQeXRob24gTGljZW5zZS4KKyIiIgorZnJvbSBfYXN0IGltcG9ydCAqCitmcm9tIF9hc3QgaW1wb3J0IF9fdmVyc2lvbl9fCisKKworZGVmIHBhcnNlKHNvdXJjZSwgZmlsZW5hbWU9Jzx1bmtub3duPicsIG1vZGU9J2V4ZWMnKToKKyAgICAiIiIKKyAgICBQYXJzZSB0aGUgc291cmNlIGludG8gYW4gQVNUIG5vZGUuCisgICAgRXF1aXZhbGVudCB0byBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIG1vZGUsIFB5Q0ZfT05MWV9BU1QpLgorICAgICIiIgorICAgIHJldHVybiBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsIG1vZGUsIFB5Q0ZfT05MWV9BU1QpCisKKworZGVmIGxpdGVyYWxfZXZhbChub2RlX29yX3N0cmluZyk6CisgICAgIiIiCisgICAgU2FmZWx5IGV2YWx1YXRlIGFuIGV4cHJlc3Npb24gbm9kZSBvciBhIHN0cmluZyBjb250YWluaW5nIGEgUHl0aG9uCisgICAgZXhwcmVzc2lvbi4gIFRoZSBzdHJpbmcgb3Igbm9kZSBwcm92aWRlZCBtYXkgb25seSBjb25zaXN0IG9mIHRoZSBmb2xsb3dpbmcKKyAgICBQeXRob24gbGl0ZXJhbCBzdHJ1Y3R1cmVzOiBzdHJpbmdzLCBudW1iZXJzLCB0dXBsZXMsIGxpc3RzLCBkaWN0cywgYm9vbGVhbnMsCisgICAgYW5kIE5vbmUuCisgICAgIiIiCisgICAgX3NhZmVfbmFtZXMgPSB7J05vbmUnOiBOb25lLCAnVHJ1ZSc6IFRydWUsICdGYWxzZSc6IEZhbHNlfQorICAgIGlmIGlzaW5zdGFuY2Uobm9kZV9vcl9zdHJpbmcsIGJhc2VzdHJpbmcpOgorICAgICAgICBub2RlX29yX3N0cmluZyA9IHBhcnNlKG5vZGVfb3Jfc3RyaW5nLCBtb2RlPSdldmFsJykKKyAgICBpZiBpc2luc3RhbmNlKG5vZGVfb3Jfc3RyaW5nLCBFeHByZXNzaW9uKToKKyAgICAgICAgbm9kZV9vcl9zdHJpbmcgPSBub2RlX29yX3N0cmluZy5ib2R5CisgICAgZGVmIF9jb252ZXJ0KG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIFN0cik6CisgICAgICAgICAgICByZXR1cm4gbm9kZS5zCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShub2RlLCBOdW0pOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUubgorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgVHVwbGUpOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKG1hcChfY29udmVydCwgbm9kZS5lbHRzKSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG5vZGUsIExpc3QpOgorICAgICAgICAgICAgcmV0dXJuIGxpc3QobWFwKF9jb252ZXJ0LCBub2RlLmVsdHMpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgRGljdCk6CisgICAgICAgICAgICByZXR1cm4gZGljdCgoX2NvbnZlcnQoayksIF9jb252ZXJ0KHYpKSBmb3IgaywgdgorICAgICAgICAgICAgICAgICAgICAgICAgaW4gemlwKG5vZGUua2V5cywgbm9kZS52YWx1ZXMpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgTmFtZSk6CisgICAgICAgICAgICBpZiBub2RlLmlkIGluIF9zYWZlX25hbWVzOgorICAgICAgICAgICAgICAgIHJldHVybiBfc2FmZV9uYW1lc1tub2RlLmlkXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgQmluT3ApIGFuZCBcCisgICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLm9wLCAoQWRkLCBTdWIpKSBhbmQgXAorICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5yaWdodCwgTnVtKSBhbmQgXAorICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5yaWdodC5uLCBjb21wbGV4KSBhbmQgXAorICAgICAgICAgICAgIGlzaW5zdGFuY2Uobm9kZS5sZWZ0LCBOdW0pIGFuZCBcCisgICAgICAgICAgICAgaXNpbnN0YW5jZShub2RlLmxlZnQubiwgKGludCwgbG9uZywgZmxvYXQpKToKKyAgICAgICAgICAgIGxlZnQgPSBub2RlLmxlZnQubgorICAgICAgICAgICAgcmlnaHQgPSBub2RlLnJpZ2h0Lm4KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobm9kZS5vcCwgQWRkKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVmdCArIHJpZ2h0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBsZWZ0IC0gcmlnaHQKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbWFsZm9ybWVkIHN0cmluZycpCisgICAgcmV0dXJuIF9jb252ZXJ0KG5vZGVfb3Jfc3RyaW5nKQorCisKK2RlZiBkdW1wKG5vZGUsIGFubm90YXRlX2ZpZWxkcz1UcnVlLCBpbmNsdWRlX2F0dHJpYnV0ZXM9RmFsc2UpOgorICAgICIiIgorICAgIFJldHVybiBhIGZvcm1hdHRlZCBkdW1wIG9mIHRoZSB0cmVlIGluICpub2RlKi4gIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBmb3IKKyAgICBkZWJ1Z2dpbmcgcHVycG9zZXMuICBUaGUgcmV0dXJuZWQgc3RyaW5nIHdpbGwgc2hvdyB0aGUgbmFtZXMgYW5kIHRoZSB2YWx1ZXMKKyAgICBmb3IgZmllbGRzLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBpbXBvc3NpYmxlIHRvIGV2YWx1YXRlLCBzbyBpZiBldmFsdWF0aW9uIGlzCisgICAgd2FudGVkICphbm5vdGF0ZV9maWVsZHMqIG11c3QgYmUgc2V0IHRvIEZhbHNlLiAgQXR0cmlidXRlcyBzdWNoIGFzIGxpbmUKKyAgICBudW1iZXJzIGFuZCBjb2x1bW4gb2Zmc2V0cyBhcmUgbm90IGR1bXBlZCBieSBkZWZhdWx0LiAgSWYgdGhpcyBpcyB3YW50ZWQsCisgICAgKmluY2x1ZGVfYXR0cmlidXRlcyogY2FuIGJlIHNldCB0byBUcnVlLgorICAgICIiIgorICAgIGRlZiBfZm9ybWF0KG5vZGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIEFTVCk6CisgICAgICAgICAgICBmaWVsZHMgPSBbKGEsIF9mb3JtYXQoYikpIGZvciBhLCBiIGluIGl0ZXJfZmllbGRzKG5vZGUpXQorICAgICAgICAgICAgcnYgPSAnJXMoJXMnICUgKG5vZGUuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oCisgICAgICAgICAgICAgICAgKCclcz0lcycgJSBmaWVsZCBmb3IgZmllbGQgaW4gZmllbGRzKQorICAgICAgICAgICAgICAgIGlmIGFubm90YXRlX2ZpZWxkcyBlbHNlCisgICAgICAgICAgICAgICAgKGIgZm9yIGEsIGIgaW4gZmllbGRzKQorICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIGlmIGluY2x1ZGVfYXR0cmlidXRlcyBhbmQgbm9kZS5fYXR0cmlidXRlczoKKyAgICAgICAgICAgICAgICBydiArPSBmaWVsZHMgYW5kICcsICcgb3IgJyAnCisgICAgICAgICAgICAgICAgcnYgKz0gJywgJy5qb2luKCclcz0lcycgJSAoYSwgX2Zvcm1hdChnZXRhdHRyKG5vZGUsIGEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGEgaW4gbm9kZS5fYXR0cmlidXRlcykKKyAgICAgICAgICAgIHJldHVybiBydiArICcpJworICAgICAgICBlbGlmIGlzaW5zdGFuY2Uobm9kZSwgbGlzdCk6CisgICAgICAgICAgICByZXR1cm4gJ1slc10nICUgJywgJy5qb2luKF9mb3JtYXQoeCkgZm9yIHggaW4gbm9kZSkKKyAgICAgICAgcmV0dXJuIHJlcHIobm9kZSkKKyAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCBBU1QpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIEFTVCwgZ290ICVyJyAlIG5vZGUuX19jbGFzc19fLl9fbmFtZV9fKQorICAgIHJldHVybiBfZm9ybWF0KG5vZGUpCisKKworZGVmIGNvcHlfbG9jYXRpb24obmV3X25vZGUsIG9sZF9ub2RlKToKKyAgICAiIiIKKyAgICBDb3B5IHNvdXJjZSBsb2NhdGlvbiAoYGxpbmVub2AgYW5kIGBjb2xfb2Zmc2V0YCBhdHRyaWJ1dGVzKSBmcm9tCisgICAgKm9sZF9ub2RlKiB0byAqbmV3X25vZGUqIGlmIHBvc3NpYmxlLCBhbmQgcmV0dXJuICpuZXdfbm9kZSouCisgICAgIiIiCisgICAgZm9yIGF0dHIgaW4gJ2xpbmVubycsICdjb2xfb2Zmc2V0JzoKKyAgICAgICAgaWYgYXR0ciBpbiBvbGRfbm9kZS5fYXR0cmlidXRlcyBhbmQgYXR0ciBpbiBuZXdfbm9kZS5fYXR0cmlidXRlcyBcCisgICAgICAgICAgIGFuZCBoYXNhdHRyKG9sZF9ub2RlLCBhdHRyKToKKyAgICAgICAgICAgIHNldGF0dHIobmV3X25vZGUsIGF0dHIsIGdldGF0dHIob2xkX25vZGUsIGF0dHIpKQorICAgIHJldHVybiBuZXdfbm9kZQorCisKK2RlZiBmaXhfbWlzc2luZ19sb2NhdGlvbnMobm9kZSk6CisgICAgIiIiCisgICAgV2hlbiB5b3UgY29tcGlsZSBhIG5vZGUgdHJlZSB3aXRoIGNvbXBpbGUoKSwgdGhlIGNvbXBpbGVyIGV4cGVjdHMgbGluZW5vIGFuZAorICAgIGNvbF9vZmZzZXQgYXR0cmlidXRlcyBmb3IgZXZlcnkgbm9kZSB0aGF0IHN1cHBvcnRzIHRoZW0uICBUaGlzIGlzIHJhdGhlcgorICAgIHRlZGlvdXMgdG8gZmlsbCBpbiBmb3IgZ2VuZXJhdGVkIG5vZGVzLCBzbyB0aGlzIGhlbHBlciBhZGRzIHRoZXNlIGF0dHJpYnV0ZXMKKyAgICByZWN1cnNpdmVseSB3aGVyZSBub3QgYWxyZWFkeSBzZXQsIGJ5IHNldHRpbmcgdGhlbSB0byB0aGUgdmFsdWVzIG9mIHRoZQorICAgIHBhcmVudCBub2RlLiAgSXQgd29ya3MgcmVjdXJzaXZlbHkgc3RhcnRpbmcgYXQgKm5vZGUqLgorICAgICIiIgorICAgIGRlZiBfZml4KG5vZGUsIGxpbmVubywgY29sX29mZnNldCk6CisgICAgICAgIGlmICdsaW5lbm8nIGluIG5vZGUuX2F0dHJpYnV0ZXM6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihub2RlLCAnbGluZW5vJyk6CisgICAgICAgICAgICAgICAgbm9kZS5saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZW5vID0gbm9kZS5saW5lbm8KKyAgICAgICAgaWYgJ2NvbF9vZmZzZXQnIGluIG5vZGUuX2F0dHJpYnV0ZXM6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihub2RlLCAnY29sX29mZnNldCcpOgorICAgICAgICAgICAgICAgIG5vZGUuY29sX29mZnNldCA9IGNvbF9vZmZzZXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29sX29mZnNldCA9IG5vZGUuY29sX29mZnNldAorICAgICAgICBmb3IgY2hpbGQgaW4gaXRlcl9jaGlsZF9ub2Rlcyhub2RlKToKKyAgICAgICAgICAgIF9maXgoY2hpbGQsIGxpbmVubywgY29sX29mZnNldCkKKyAgICBfZml4KG5vZGUsIDEsIDApCisgICAgcmV0dXJuIG5vZGUKKworCitkZWYgaW5jcmVtZW50X2xpbmVubyhub2RlLCBuPTEpOgorICAgICIiIgorICAgIEluY3JlbWVudCB0aGUgbGluZSBudW1iZXIgb2YgZWFjaCBub2RlIGluIHRoZSB0cmVlIHN0YXJ0aW5nIGF0ICpub2RlKiBieSAqbiouCisgICAgVGhpcyBpcyB1c2VmdWwgdG8gIm1vdmUgY29kZSIgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24gaW4gYSBmaWxlLgorICAgICIiIgorICAgIGZvciBjaGlsZCBpbiB3YWxrKG5vZGUpOgorICAgICAgICBpZiAnbGluZW5vJyBpbiBjaGlsZC5fYXR0cmlidXRlczoKKyAgICAgICAgICAgIGNoaWxkLmxpbmVubyA9IGdldGF0dHIoY2hpbGQsICdsaW5lbm8nLCAwKSArIG4KKyAgICByZXR1cm4gbm9kZQorCisKK2RlZiBpdGVyX2ZpZWxkcyhub2RlKToKKyAgICAiIiIKKyAgICBZaWVsZCBhIHR1cGxlIG9mIGBgKGZpZWxkbmFtZSwgdmFsdWUpYGAgZm9yIGVhY2ggZmllbGQgaW4gYGBub2RlLl9maWVsZHNgYAorICAgIHRoYXQgaXMgcHJlc2VudCBvbiAqbm9kZSouCisgICAgIiIiCisgICAgZm9yIGZpZWxkIGluIG5vZGUuX2ZpZWxkczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeWllbGQgZmllbGQsIGdldGF0dHIobm9kZSwgZmllbGQpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCitkZWYgaXRlcl9jaGlsZF9ub2Rlcyhub2RlKToKKyAgICAiIiIKKyAgICBZaWVsZCBhbGwgZGlyZWN0IGNoaWxkIG5vZGVzIG9mICpub2RlKiwgdGhhdCBpcywgYWxsIGZpZWxkcyB0aGF0IGFyZSBub2RlcworICAgIGFuZCBhbGwgaXRlbXMgb2YgZmllbGRzIHRoYXQgYXJlIGxpc3RzIG9mIG5vZGVzLgorICAgICIiIgorICAgIGZvciBuYW1lLCBmaWVsZCBpbiBpdGVyX2ZpZWxkcyhub2RlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWVsZCwgQVNUKToKKyAgICAgICAgICAgIHlpZWxkIGZpZWxkCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaWVsZCwgbGlzdCk6CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBmaWVsZDoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIEFTVCk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworCitkZWYgZ2V0X2RvY3N0cmluZyhub2RlLCBjbGVhbj1UcnVlKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIGRvY3N0cmluZyBmb3IgdGhlIGdpdmVuIG5vZGUgb3IgTm9uZSBpZiBubyBkb2NzdHJpbmcgY2FuCisgICAgYmUgZm91bmQuICBJZiB0aGUgbm9kZSBwcm92aWRlZCBkb2VzIG5vdCBoYXZlIGRvY3N0cmluZ3MgYSBUeXBlRXJyb3IKKyAgICB3aWxsIGJlIHJhaXNlZC4KKyAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShub2RlLCAoRnVuY3Rpb25EZWYsIENsYXNzRGVmLCBNb2R1bGUpKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlciBjYW4ndCBoYXZlIGRvY3N0cmluZ3MiICUgbm9kZS5fX2NsYXNzX18uX19uYW1lX18pCisgICAgaWYgbm9kZS5ib2R5IGFuZCBpc2luc3RhbmNlKG5vZGUuYm9keVswXSwgRXhwcikgYW5kIFwKKyAgICAgICBpc2luc3RhbmNlKG5vZGUuYm9keVswXS52YWx1ZSwgU3RyKToKKyAgICAgICAgaWYgY2xlYW46CisgICAgICAgICAgICBpbXBvcnQgaW5zcGVjdAorICAgICAgICAgICAgcmV0dXJuIGluc3BlY3QuY2xlYW5kb2Mobm9kZS5ib2R5WzBdLnZhbHVlLnMpCisgICAgICAgIHJldHVybiBub2RlLmJvZHlbMF0udmFsdWUucworCisKK2RlZiB3YWxrKG5vZGUpOgorICAgICIiIgorICAgIFJlY3Vyc2l2ZWx5IHlpZWxkIGFsbCBkZXNjZW5kYW50IG5vZGVzIGluIHRoZSB0cmVlIHN0YXJ0aW5nIGF0ICpub2RlKgorICAgIChpbmNsdWRpbmcgKm5vZGUqIGl0c2VsZiksIGluIG5vIHNwZWNpZmllZCBvcmRlci4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdQorICAgIG9ubHkgd2FudCB0byBtb2RpZnkgbm9kZXMgaW4gcGxhY2UgYW5kIGRvbid0IGNhcmUgYWJvdXQgdGhlIGNvbnRleHQuCisgICAgIiIiCisgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKKyAgICB0b2RvID0gZGVxdWUoW25vZGVdKQorICAgIHdoaWxlIHRvZG86CisgICAgICAgIG5vZGUgPSB0b2RvLnBvcGxlZnQoKQorICAgICAgICB0b2RvLmV4dGVuZChpdGVyX2NoaWxkX25vZGVzKG5vZGUpKQorICAgICAgICB5aWVsZCBub2RlCisKKworY2xhc3MgTm9kZVZpc2l0b3Iob2JqZWN0KToKKyAgICAiIiIKKyAgICBBIG5vZGUgdmlzaXRvciBiYXNlIGNsYXNzIHRoYXQgd2Fsa3MgdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlIGFuZCBjYWxscyBhCisgICAgdmlzaXRvciBmdW5jdGlvbiBmb3IgZXZlcnkgbm9kZSBmb3VuZC4gIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBhIHZhbHVlCisgICAgd2hpY2ggaXMgZm9yd2FyZGVkIGJ5IHRoZSBgdmlzaXRgIG1ldGhvZC4KKworICAgIFRoaXMgY2xhc3MgaXMgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZCwgd2l0aCB0aGUgc3ViY2xhc3MgYWRkaW5nIHZpc2l0b3IKKyAgICBtZXRob2RzLgorCisgICAgUGVyIGRlZmF1bHQgdGhlIHZpc2l0b3IgZnVuY3Rpb25zIGZvciB0aGUgbm9kZXMgYXJlIGBgJ3Zpc2l0XydgYCArCisgICAgY2xhc3MgbmFtZSBvZiB0aGUgbm9kZS4gIFNvIGEgYFRyeUZpbmFsbHlgIG5vZGUgdmlzaXQgZnVuY3Rpb24gd291bGQKKyAgICBiZSBgdmlzaXRfVHJ5RmluYWxseWAuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5IG92ZXJyaWRpbmcKKyAgICB0aGUgYHZpc2l0YCBtZXRob2QuICBJZiBubyB2aXNpdG9yIGZ1bmN0aW9uIGV4aXN0cyBmb3IgYSBub2RlCisgICAgKHJldHVybiB2YWx1ZSBgTm9uZWApIHRoZSBgZ2VuZXJpY192aXNpdGAgdmlzaXRvciBpcyB1c2VkIGluc3RlYWQuCisKKyAgICBEb24ndCB1c2UgdGhlIGBOb2RlVmlzaXRvcmAgaWYgeW91IHdhbnQgdG8gYXBwbHkgY2hhbmdlcyB0byBub2RlcyBkdXJpbmcKKyAgICB0cmF2ZXJzaW5nLiAgRm9yIHRoaXMgYSBzcGVjaWFsIHZpc2l0b3IgZXhpc3RzIChgTm9kZVRyYW5zZm9ybWVyYCkgdGhhdAorICAgIGFsbG93cyBtb2RpZmljYXRpb25zLgorICAgICIiIgorCisgICAgZGVmIHZpc2l0KHNlbGYsIG5vZGUpOgorICAgICAgICAiIiJWaXNpdCBhIG5vZGUuIiIiCisgICAgICAgIG1ldGhvZCA9ICd2aXNpdF8nICsgbm9kZS5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgdmlzaXRvciA9IGdldGF0dHIoc2VsZiwgbWV0aG9kLCBzZWxmLmdlbmVyaWNfdmlzaXQpCisgICAgICAgIHJldHVybiB2aXNpdG9yKG5vZGUpCisKKyAgICBkZWYgZ2VuZXJpY192aXNpdChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ2FsbGVkIGlmIG5vIGV4cGxpY2l0IHZpc2l0b3IgZnVuY3Rpb24gZXhpc3RzIGZvciBhIG5vZGUuIiIiCisgICAgICAgIGZvciBmaWVsZCwgdmFsdWUgaW4gaXRlcl9maWVsZHMobm9kZSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52aXNpdChpdGVtKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBBU1QpOgorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQodmFsdWUpCisKKworY2xhc3MgTm9kZVRyYW5zZm9ybWVyKE5vZGVWaXNpdG9yKToKKyAgICAiIiIKKyAgICBBIDpjbGFzczpgTm9kZVZpc2l0b3JgIHN1YmNsYXNzIHRoYXQgd2Fsa3MgdGhlIGFic3RyYWN0IHN5bnRheCB0cmVlIGFuZAorICAgIGFsbG93cyBtb2RpZmljYXRpb24gb2Ygbm9kZXMuCisKKyAgICBUaGUgYE5vZGVUcmFuc2Zvcm1lcmAgd2lsbCB3YWxrIHRoZSBBU1QgYW5kIHVzZSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZQorICAgIHZpc2l0b3IgbWV0aG9kcyB0byByZXBsYWNlIG9yIHJlbW92ZSB0aGUgb2xkIG5vZGUuICBJZiB0aGUgcmV0dXJuIHZhbHVlIG9mCisgICAgdGhlIHZpc2l0b3IgbWV0aG9kIGlzIGBgTm9uZWBgLCB0aGUgbm9kZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSBpdHMgbG9jYXRpb24sCisgICAgb3RoZXJ3aXNlIGl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIHJldHVybiB2YWx1ZS4gIFRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIHRoZQorICAgIG9yaWdpbmFsIG5vZGUgaW4gd2hpY2ggY2FzZSBubyByZXBsYWNlbWVudCB0YWtlcyBwbGFjZS4KKworICAgIEhlcmUgaXMgYW4gZXhhbXBsZSB0cmFuc2Zvcm1lciB0aGF0IHJld3JpdGVzIGFsbCBvY2N1cnJlbmNlcyBvZiBuYW1lIGxvb2t1cHMKKyAgICAoYGBmb29gYCkgdG8gYGBkYXRhWydmb28nXWBgOjoKKworICAgICAgIGNsYXNzIFJld3JpdGVOYW1lKE5vZGVUcmFuc2Zvcm1lcik6CisKKyAgICAgICAgICAgZGVmIHZpc2l0X05hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgICAgICAgICByZXR1cm4gY29weV9sb2NhdGlvbihTdWJzY3JpcHQoCisgICAgICAgICAgICAgICAgICAgdmFsdWU9TmFtZShpZD0nZGF0YScsIGN0eD1Mb2FkKCkpLAorICAgICAgICAgICAgICAgICAgIHNsaWNlPUluZGV4KHZhbHVlPVN0cihzPW5vZGUuaWQpKSwKKyAgICAgICAgICAgICAgICAgICBjdHg9bm9kZS5jdHgKKyAgICAgICAgICAgICAgICksIG5vZGUpCisKKyAgICBLZWVwIGluIG1pbmQgdGhhdCBpZiB0aGUgbm9kZSB5b3UncmUgb3BlcmF0aW5nIG9uIGhhcyBjaGlsZCBub2RlcyB5b3UgbXVzdAorICAgIGVpdGhlciB0cmFuc2Zvcm0gdGhlIGNoaWxkIG5vZGVzIHlvdXJzZWxmIG9yIGNhbGwgdGhlIDptZXRoOmBnZW5lcmljX3Zpc2l0YAorICAgIG1ldGhvZCBmb3IgdGhlIG5vZGUgZmlyc3QuCisKKyAgICBGb3Igbm9kZXMgdGhhdCB3ZXJlIHBhcnQgb2YgYSBjb2xsZWN0aW9uIG9mIHN0YXRlbWVudHMgKHRoYXQgYXBwbGllcyB0byBhbGwKKyAgICBzdGF0ZW1lbnQgbm9kZXMpLCB0aGUgdmlzaXRvciBtYXkgYWxzbyByZXR1cm4gYSBsaXN0IG9mIG5vZGVzIHJhdGhlciB0aGFuCisgICAganVzdCBhIHNpbmdsZSBub2RlLgorCisgICAgVXN1YWxseSB5b3UgdXNlIHRoZSB0cmFuc2Zvcm1lciBsaWtlIHRoaXM6OgorCisgICAgICAgbm9kZSA9IFlvdXJUcmFuc2Zvcm1lcigpLnZpc2l0KG5vZGUpCisgICAgIiIiCisKKyAgICBkZWYgZ2VuZXJpY192aXNpdChzZWxmLCBub2RlKToKKyAgICAgICAgZm9yIGZpZWxkLCBvbGRfdmFsdWUgaW4gaXRlcl9maWVsZHMobm9kZSk6CisgICAgICAgICAgICBvbGRfdmFsdWUgPSBnZXRhdHRyKG5vZGUsIGZpZWxkLCBOb25lKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvbGRfdmFsdWUsIGxpc3QpOgorICAgICAgICAgICAgICAgIG5ld192YWx1ZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiBvbGRfdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIEFTVCk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYudmlzaXQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBBU1QpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZXMuZXh0ZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIG5ld192YWx1ZXMuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIG9sZF92YWx1ZVs6XSA9IG5ld192YWx1ZXMKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvbGRfdmFsdWUsIEFTVCk6CisgICAgICAgICAgICAgICAgbmV3X25vZGUgPSBzZWxmLnZpc2l0KG9sZF92YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiBuZXdfbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBkZWxhdHRyKG5vZGUsIGZpZWxkKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIobm9kZSwgZmllbGQsIG5ld19ub2RlKQorICAgICAgICByZXR1cm4gbm9kZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3QucHljIGIvbGliL3B5dGhvbjIuNy9hc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTk1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3QucHlvIGIvbGliL3B5dGhvbjIuNy9hc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTk1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hc3luY2hhdC5weSBiL2xpYi9weXRob24yLjcvYXN5bmNoYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExODMzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXN5bmNoYXQucHkKQEAgLTAsMCArMSwzMTQgQEAKKyMgLSotIE1vZGU6IFB5dGhvbjsgdGFiLXdpZHRoOiA0IC0qLQorIyAgICAgICBJZDogYXN5bmNoYXQucHksdiAyLjI2IDIwMDAvMDkvMDcgMjI6Mjk6MjYgcnVzaGluZyBFeHAKKyMgICAgICAgQXV0aG9yOiBTYW0gUnVzaGluZyA8cnVzaGluZ0BuaWdodG1hcmUuY29tPgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ29weXJpZ2h0IDE5OTYgYnkgU2FtIFJ1c2hpbmcKKyMKKyMgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorIyBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieQorIyBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwKKyMgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyMgbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFNhbQorIyBSdXNoaW5nIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvCisjIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvcgorIyBwZXJtaXNzaW9uLgorIworIyBTQU0gUlVTSElORyBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyMgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTgorIyBOTyBFVkVOVCBTSEFMTCBTQU0gUlVTSElORyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgorIyBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTCisjIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyMgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisjIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworciIiIkEgY2xhc3Mgc3VwcG9ydGluZyBjaGF0LXN0eWxlIChjb21tYW5kL3Jlc3BvbnNlKSBwcm90b2NvbHMuCisKK1RoaXMgY2xhc3MgYWRkcyBzdXBwb3J0IGZvciAnY2hhdCcgc3R5bGUgcHJvdG9jb2xzIC0gd2hlcmUgb25lIHNpZGUKK3NlbmRzIGEgJ2NvbW1hbmQnLCBhbmQgdGhlIG90aGVyIHNlbmRzIGEgcmVzcG9uc2UgKGV4YW1wbGVzIHdvdWxkIGJlCit0aGUgY29tbW9uIGludGVybmV0IHByb3RvY29scyAtIHNtdHAsIG5udHAsIGZ0cCwgZXRjLi4pLgorCitUaGUgaGFuZGxlX3JlYWQoKSBtZXRob2QgbG9va3MgYXQgdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGN1cnJlbnQKKyd0ZXJtaW5hdG9yJyAodXN1YWxseSAnXHJcbicgZm9yIHNpbmdsZS1saW5lIHJlc3BvbnNlcywgJ1xyXG4uXHJcbicKK2ZvciBtdWx0aS1saW5lIG91dHB1dCksIGNhbGxpbmcgc2VsZi5mb3VuZF90ZXJtaW5hdG9yKCkgb24gaXRzCityZWNlaXB0LgorCitmb3IgZXhhbXBsZToKK1NheSB5b3UgYnVpbGQgYW4gYXN5bmMgbm50cCBjbGllbnQgdXNpbmcgdGhpcyBjbGFzcy4gIEF0IHRoZSBzdGFydAorb2YgdGhlIGNvbm5lY3Rpb24sIHlvdSdsbCBoYXZlIHNlbGYudGVybWluYXRvciBzZXQgdG8gJ1xyXG4nLCBpbgorb3JkZXIgdG8gcHJvY2VzcyB0aGUgc2luZ2xlLWxpbmUgZ3JlZXRpbmcuICBKdXN0IGJlZm9yZSBpc3N1aW5nIGEKKydMSVNUJyBjb21tYW5kIHlvdSdsbCBzZXQgaXQgdG8gJ1xyXG4uXHJcbicuICBUaGUgb3V0cHV0IG9mIHRoZSBMSVNUCitjb21tYW5kIHdpbGwgYmUgYWNjdW11bGF0ZWQgKHVzaW5nIHlvdXIgb3duICdjb2xsZWN0X2luY29taW5nX2RhdGEnCittZXRob2QpIHVwIHRvIHRoZSB0ZXJtaW5hdG9yLCBhbmQgdGhlbiBjb250cm9sIHdpbGwgYmUgcmV0dXJuZWQgdG8KK3lvdSAtIGJ5IGNhbGxpbmcgeW91ciBzZWxmLmZvdW5kX3Rlcm1pbmF0b3IoKSBtZXRob2QuCisiIiIKKworaW1wb3J0IHNvY2tldAoraW1wb3J0IGFzeW5jb3JlCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBzeXMgaW1wb3J0IHB5M2t3YXJuaW5nCitmcm9tIHdhcm5pbmdzIGltcG9ydCBmaWx0ZXJ3YXJuaW5ncywgY2F0Y2hfd2FybmluZ3MKKworY2xhc3MgYXN5bmNfY2hhdCAoYXN5bmNvcmUuZGlzcGF0Y2hlcik6CisgICAgIiIiVGhpcyBpcyBhbiBhYnN0cmFjdCBjbGFzcy4gIFlvdSBtdXN0IGRlcml2ZSBmcm9tIHRoaXMgY2xhc3MsIGFuZCBhZGQKKyAgICB0aGUgdHdvIG1ldGhvZHMgY29sbGVjdF9pbmNvbWluZ19kYXRhKCkgYW5kIGZvdW5kX3Rlcm1pbmF0b3IoKSIiIgorCisgICAgIyB0aGVzZSBhcmUgb3ZlcnJpZGFibGUgZGVmYXVsdHMKKworICAgIGFjX2luX2J1ZmZlcl9zaXplICAgICAgID0gNDA5NgorICAgIGFjX291dF9idWZmZXJfc2l6ZSAgICAgID0gNDA5NgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBzb2NrPU5vbmUsIG1hcD1Ob25lKToKKyAgICAgICAgIyBmb3Igc3RyaW5nIHRlcm1pbmF0b3IgbWF0Y2hpbmcKKyAgICAgICAgc2VsZi5hY19pbl9idWZmZXIgPSAnJworCisgICAgICAgICMgd2UgdXNlIGEgbGlzdCBoZXJlIHJhdGhlciB0aGFuIGNTdHJpbmdJTyBmb3IgYSBmZXcgcmVhc29ucy4uLgorICAgICAgICAjIGRlbCBsc3RbOl0gaXMgZmFzdGVyIHRoYW4gc2lvLnRydW5jYXRlKDApCisgICAgICAgICMgbHN0ID0gW10gaXMgZmFzdGVyIHRoYW4gc2lvLnRydW5jYXRlKDApCisgICAgICAgICMgY1N0cmluZ0lPIHdpbGwgYmUgZ2FpbmluZyB1bmljb2RlIHN1cHBvcnQgaW4gcHkzaywgd2hpY2gKKyAgICAgICAgIyB3aWxsIG5lZ2F0aXZlbHkgYWZmZWN0IHRoZSBwZXJmb3JtYW5jZSBvZiBieXRlcyBjb21wYXJlZCB0bworICAgICAgICAjIGEgJycuam9pbigpIGVxdWl2YWxlbnQKKyAgICAgICAgc2VsZi5pbmNvbWluZyA9IFtdCisKKyAgICAgICAgIyB3ZSB0b3NzIHRoZSB1c2Ugb2YgdGhlICJzaW1wbGUgcHJvZHVjZXIiIGFuZCByZXBsYWNlIGl0IHdpdGgKKyAgICAgICAgIyBhIHB1cmUgZGVxdWUsIHdoaWNoIHRoZSBvcmlnaW5hbCBmaWZvIHdhcyBhIHdyYXBwaW5nIG9mCisgICAgICAgIHNlbGYucHJvZHVjZXJfZmlmbyA9IGRlcXVlKCkKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyAoc2VsZiwgc29jaywgbWFwKQorCisgICAgZGVmIGNvbGxlY3RfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigibXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcyIpCisKKyAgICBkZWYgX2NvbGxlY3RfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5pbmNvbWluZy5hcHBlbmQoZGF0YSkKKworICAgIGRlZiBfZ2V0X2RhdGEoc2VsZik6CisgICAgICAgIGQgPSAnJy5qb2luKHNlbGYuaW5jb21pbmcpCisgICAgICAgIGRlbCBzZWxmLmluY29taW5nWzpdCisgICAgICAgIHJldHVybiBkCisKKyAgICBkZWYgZm91bmRfdGVybWluYXRvcihzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigibXVzdCBiZSBpbXBsZW1lbnRlZCBpbiBzdWJjbGFzcyIpCisKKyAgICBkZWYgc2V0X3Rlcm1pbmF0b3IgKHNlbGYsIHRlcm0pOgorICAgICAgICAiU2V0IHRoZSBpbnB1dCBkZWxpbWl0ZXIuICBDYW4gYmUgYSBmaXhlZCBzdHJpbmcgb2YgYW55IGxlbmd0aCwgYW4gaW50ZWdlciwgb3IgTm9uZSIKKyAgICAgICAgc2VsZi50ZXJtaW5hdG9yID0gdGVybQorCisgICAgZGVmIGdldF90ZXJtaW5hdG9yIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGVybWluYXRvcgorCisgICAgIyBncmFiIHNvbWUgbW9yZSBkYXRhIGZyb20gdGhlIHNvY2tldCwKKyAgICAjIHRocm93IGl0IHRvIHRoZSBjb2xsZWN0b3IgbWV0aG9kLAorICAgICMgY2hlY2sgZm9yIHRoZSB0ZXJtaW5hdG9yLAorICAgICMgaWYgZm91bmQsIHRyYW5zaXRpb24gdG8gdGhlIG5leHQgc3RhdGUuCisKKyAgICBkZWYgaGFuZGxlX3JlYWQgKHNlbGYpOgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlY3YgKHNlbGYuYWNfaW5fYnVmZmVyX3NpemUpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIHdoeToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuYWNfaW5fYnVmZmVyID0gc2VsZi5hY19pbl9idWZmZXIgKyBkYXRhCisKKyAgICAgICAgIyBDb250aW51ZSB0byBzZWFyY2ggZm9yIHNlbGYudGVybWluYXRvciBpbiBzZWxmLmFjX2luX2J1ZmZlciwKKyAgICAgICAgIyB3aGlsZSBjYWxsaW5nIHNlbGYuY29sbGVjdF9pbmNvbWluZ19kYXRhLiAgVGhlIHdoaWxlIGxvb3AKKyAgICAgICAgIyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3ZSBtaWdodCByZWFkIHNldmVyYWwgZGF0YSt0ZXJtaW5hdG9yCisgICAgICAgICMgY29tYm9zIHdpdGggYSBzaW5nbGUgcmVjdig0MDk2KS4KKworICAgICAgICB3aGlsZSBzZWxmLmFjX2luX2J1ZmZlcjoKKyAgICAgICAgICAgIGxiID0gbGVuKHNlbGYuYWNfaW5fYnVmZmVyKQorICAgICAgICAgICAgdGVybWluYXRvciA9IHNlbGYuZ2V0X3Rlcm1pbmF0b3IoKQorICAgICAgICAgICAgaWYgbm90IHRlcm1pbmF0b3I6CisgICAgICAgICAgICAgICAgIyBubyB0ZXJtaW5hdG9yLCBjb2xsZWN0IGl0IGFsbAorICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9pbmNvbWluZ19kYXRhIChzZWxmLmFjX2luX2J1ZmZlcikKKyAgICAgICAgICAgICAgICBzZWxmLmFjX2luX2J1ZmZlciA9ICcnCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGVybWluYXRvciwgaW50KSBvciBpc2luc3RhbmNlKHRlcm1pbmF0b3IsIGxvbmcpOgorICAgICAgICAgICAgICAgICMgbnVtZXJpYyB0ZXJtaW5hdG9yCisgICAgICAgICAgICAgICAgbiA9IHRlcm1pbmF0b3IKKyAgICAgICAgICAgICAgICBpZiBsYiA8IG46CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9pbmNvbWluZ19kYXRhIChzZWxmLmFjX2luX2J1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hY19pbl9idWZmZXIgPSAnJworICAgICAgICAgICAgICAgICAgICBzZWxmLnRlcm1pbmF0b3IgPSBzZWxmLnRlcm1pbmF0b3IgLSBsYgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9pbmNvbWluZ19kYXRhIChzZWxmLmFjX2luX2J1ZmZlcls6bl0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWNfaW5fYnVmZmVyID0gc2VsZi5hY19pbl9idWZmZXJbbjpdCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVybWluYXRvciA9IDAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3VuZF90ZXJtaW5hdG9yKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyAzIGNhc2VzOgorICAgICAgICAgICAgICAgICMgMSkgZW5kIG9mIGJ1ZmZlciBtYXRjaGVzIHRlcm1pbmF0b3IgZXhhY3RseToKKyAgICAgICAgICAgICAgICAjICAgIGNvbGxlY3QgZGF0YSwgdHJhbnNpdGlvbgorICAgICAgICAgICAgICAgICMgMikgZW5kIG9mIGJ1ZmZlciBtYXRjaGVzIHNvbWUgcHJlZml4OgorICAgICAgICAgICAgICAgICMgICAgY29sbGVjdCBkYXRhIHRvIHRoZSBwcmVmaXgKKyAgICAgICAgICAgICAgICAjIDMpIGVuZCBvZiBidWZmZXIgZG9lcyBub3QgbWF0Y2ggYW55IHByZWZpeDoKKyAgICAgICAgICAgICAgICAjICAgIGNvbGxlY3QgZGF0YQorICAgICAgICAgICAgICAgIHRlcm1pbmF0b3JfbGVuID0gbGVuKHRlcm1pbmF0b3IpCisgICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLmFjX2luX2J1ZmZlci5maW5kKHRlcm1pbmF0b3IpCisgICAgICAgICAgICAgICAgaWYgaW5kZXggIT0gLTE6CisgICAgICAgICAgICAgICAgICAgICMgd2UgZm91bmQgdGhlIHRlcm1pbmF0b3IKKyAgICAgICAgICAgICAgICAgICAgaWYgaW5kZXggPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBib3RoZXIgcmVwb3J0aW5nIHRoZSBlbXB0eSBzdHJpbmcgKHNvdXJjZSBvZiBzdWJ0bGUgYnVncykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9pbmNvbWluZ19kYXRhIChzZWxmLmFjX2luX2J1ZmZlcls6aW5kZXhdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFjX2luX2J1ZmZlciA9IHNlbGYuYWNfaW5fYnVmZmVyW2luZGV4K3Rlcm1pbmF0b3JfbGVuOl0KKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGRvZXMgdGhlIFJpZ2h0IFRoaW5nIGlmIHRoZSB0ZXJtaW5hdG9yIGlzIGNoYW5nZWQgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3VuZF90ZXJtaW5hdG9yKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGZvciBhIHByZWZpeCBvZiB0aGUgdGVybWluYXRvcgorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGZpbmRfcHJlZml4X2F0X2VuZCAoc2VsZi5hY19pbl9idWZmZXIsIHRlcm1pbmF0b3IpCisgICAgICAgICAgICAgICAgICAgIGlmIGluZGV4OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5kZXggIT0gbGI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3ZSBmb3VuZCBhIHByZWZpeCwgY29sbGVjdCB1cCB0byB0aGUgcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2xsZWN0X2luY29taW5nX2RhdGEgKHNlbGYuYWNfaW5fYnVmZmVyWzotaW5kZXhdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWNfaW5fYnVmZmVyID0gc2VsZi5hY19pbl9idWZmZXJbLWluZGV4Ol0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIHByZWZpeCwgY29sbGVjdCBpdCBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGVjdF9pbmNvbWluZ19kYXRhIChzZWxmLmFjX2luX2J1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYWNfaW5fYnVmZmVyID0gJycKKworICAgIGRlZiBoYW5kbGVfd3JpdGUgKHNlbGYpOgorICAgICAgICBzZWxmLmluaXRpYXRlX3NlbmQoKQorCisgICAgZGVmIGhhbmRsZV9jbG9zZSAoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIHB1c2ggKHNlbGYsIGRhdGEpOgorICAgICAgICBzYWJzID0gc2VsZi5hY19vdXRfYnVmZmVyX3NpemUKKyAgICAgICAgaWYgbGVuKGRhdGEpID4gc2FiczoKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oZGF0YSksIHNhYnMpOgorICAgICAgICAgICAgICAgIHNlbGYucHJvZHVjZXJfZmlmby5hcHBlbmQoZGF0YVtpOmkrc2Fic10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnByb2R1Y2VyX2ZpZm8uYXBwZW5kKGRhdGEpCisgICAgICAgIHNlbGYuaW5pdGlhdGVfc2VuZCgpCisKKyAgICBkZWYgcHVzaF93aXRoX3Byb2R1Y2VyIChzZWxmLCBwcm9kdWNlcik6CisgICAgICAgIHNlbGYucHJvZHVjZXJfZmlmby5hcHBlbmQocHJvZHVjZXIpCisgICAgICAgIHNlbGYuaW5pdGlhdGVfc2VuZCgpCisKKyAgICBkZWYgcmVhZGFibGUgKHNlbGYpOgorICAgICAgICAicHJlZGljYXRlIGZvciBpbmNsdXNpb24gaW4gdGhlIHJlYWRhYmxlIGZvciBzZWxlY3QoKSIKKyAgICAgICAgIyBjYW5ub3QgdXNlIHRoZSBvbGQgcHJlZGljYXRlLCBpdCB2aW9sYXRlcyB0aGUgY2xhaW0gb2YgdGhlCisgICAgICAgICMgc2V0X3Rlcm1pbmF0b3IgbWV0aG9kLgorCisgICAgICAgICMgcmV0dXJuIChsZW4oc2VsZi5hY19pbl9idWZmZXIpIDw9IHNlbGYuYWNfaW5fYnVmZmVyX3NpemUpCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgd3JpdGFibGUgKHNlbGYpOgorICAgICAgICAicHJlZGljYXRlIGZvciBpbmNsdXNpb24gaW4gdGhlIHdyaXRhYmxlIGZvciBzZWxlY3QoKSIKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvZHVjZXJfZmlmbyBvciAobm90IHNlbGYuY29ubmVjdGVkKQorCisgICAgZGVmIGNsb3NlX3doZW5fZG9uZSAoc2VsZik6CisgICAgICAgICJhdXRvbWF0aWNhbGx5IGNsb3NlIHRoaXMgY2hhbm5lbCBvbmNlIHRoZSBvdXRnb2luZyBxdWV1ZSBpcyBlbXB0eSIKKyAgICAgICAgc2VsZi5wcm9kdWNlcl9maWZvLmFwcGVuZChOb25lKQorCisgICAgZGVmIGluaXRpYXRlX3NlbmQoc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYucHJvZHVjZXJfZmlmbyBhbmQgc2VsZi5jb25uZWN0ZWQ6CisgICAgICAgICAgICBmaXJzdCA9IHNlbGYucHJvZHVjZXJfZmlmb1swXQorICAgICAgICAgICAgIyBoYW5kbGUgZW1wdHkgc3RyaW5nL2J1ZmZlciBvciBOb25lIGVudHJ5CisgICAgICAgICAgICBpZiBub3QgZmlyc3Q6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYucHJvZHVjZXJfZmlmb1swXQorICAgICAgICAgICAgICAgIGlmIGZpcnN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgaGFuZGxlIGNsYXNzaWMgcHJvZHVjZXIgYmVoYXZpb3IKKyAgICAgICAgICAgIG9icyA9IHNlbGYuYWNfb3V0X2J1ZmZlcl9zaXplCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2l0aCBjYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgICAgICAgICBpZiBweTNrd2FybmluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLipidWZmZXIiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBidWZmZXIoZmlyc3QsIDAsIG9icykKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgZGF0YSA9IGZpcnN0Lm1vcmUoKQorICAgICAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJvZHVjZXJfZmlmby5hcHBlbmRsZWZ0KGRhdGEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYucHJvZHVjZXJfZmlmb1swXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgc2VuZCB0aGUgZGF0YQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG51bV9zZW50ID0gc2VsZi5zZW5kKGRhdGEpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgaWYgbnVtX3NlbnQ6CisgICAgICAgICAgICAgICAgaWYgbnVtX3NlbnQgPCBsZW4oZGF0YSkgb3Igb2JzIDwgbGVuKGZpcnN0KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9kdWNlcl9maWZvWzBdID0gZmlyc3RbbnVtX3NlbnQ6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLnByb2R1Y2VyX2ZpZm9bMF0KKyAgICAgICAgICAgICMgd2UgdHJpZWQgdG8gc2VuZCBzb21lIGFjdHVhbCBkYXRhCisgICAgICAgICAgICByZXR1cm4KKworICAgIGRlZiBkaXNjYXJkX2J1ZmZlcnMgKHNlbGYpOgorICAgICAgICAjIEVtZXJnZW5jaWVzIG9ubHkhCisgICAgICAgIHNlbGYuYWNfaW5fYnVmZmVyID0gJycKKyAgICAgICAgZGVsIHNlbGYuaW5jb21pbmdbOl0KKyAgICAgICAgc2VsZi5wcm9kdWNlcl9maWZvLmNsZWFyKCkKKworY2xhc3Mgc2ltcGxlX3Byb2R1Y2VyOgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBkYXRhLCBidWZmZXJfc2l6ZT01MTIpOgorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZQorCisgICAgZGVmIG1vcmUgKHNlbGYpOgorICAgICAgICBpZiBsZW4gKHNlbGYuZGF0YSkgPiBzZWxmLmJ1ZmZlcl9zaXplOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5kYXRhWzpzZWxmLmJ1ZmZlcl9zaXplXQorICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhW3NlbGYuYnVmZmVyX3NpemU6XQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5kYXRhCisgICAgICAgICAgICBzZWxmLmRhdGEgPSAnJworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBmaWZvOgorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgbGlzdD1Ob25lKToKKyAgICAgICAgaWYgbm90IGxpc3Q6CisgICAgICAgICAgICBzZWxmLmxpc3QgPSBkZXF1ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxpc3QgPSBkZXF1ZShsaXN0KQorCisgICAgZGVmIF9fbGVuX18gKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYubGlzdCkKKworICAgIGRlZiBpc19lbXB0eSAoc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5saXN0CisKKyAgICBkZWYgZmlyc3QgKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5saXN0WzBdCisKKyAgICBkZWYgcHVzaCAoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYubGlzdC5hcHBlbmQoZGF0YSkKKworICAgIGRlZiBwb3AgKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxpc3Q6CisgICAgICAgICAgICByZXR1cm4gKDEsIHNlbGYubGlzdC5wb3BsZWZ0KCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKDAsIE5vbmUpCisKKyMgR2l2ZW4gJ2hheXN0YWNrJywgc2VlIGlmIGFueSBwcmVmaXggb2YgJ25lZWRsZScgaXMgYXQgaXRzIGVuZC4gIFRoaXMKKyMgYXNzdW1lcyBhbiBleGFjdCBtYXRjaCBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuICBSZXR1cm4gdGhlIG51bWJlciBvZgorIyBjaGFyYWN0ZXJzIG1hdGNoZWQuCisjIGZvciBleGFtcGxlOgorIyBmX3BfYV9lICgicXdlcnR5XHIiLCAiXHJcbiIpID0+IDEKKyMgZl9wX2FfZSAoInF3ZXJ0eWRramYiLCAiXHJcbiIpID0+IDAKKyMgZl9wX2FfZSAoInF3ZXJ0eVxyXG4iLCAiXHJcbiIpID0+IDx1bmRlZmluZWQ+CisKKyMgdGhpcyBjb3VsZCBtYXliZSBiZSBtYWRlIGZhc3RlciB3aXRoIGEgY29tcHV0ZWQgcmVnZXg/CisjIFthbnN3ZXI6IG5vOyBjaXJjYSBQeXRob24tMi4wLCBKYW4gMjAwMV0KKyMgbmV3IHB5dGhvbjogICAyODk2MS9zCisjIG9sZCBweXRob246ICAgMTgzMDcvcworIyByZTogICAgICAgIDEyODIwL3MKKyMgcmVnZXg6ICAgICAxNDAzNS9zCisKK2RlZiBmaW5kX3ByZWZpeF9hdF9lbmQgKGhheXN0YWNrLCBuZWVkbGUpOgorICAgIGwgPSBsZW4obmVlZGxlKSAtIDEKKyAgICB3aGlsZSBsIGFuZCBub3QgaGF5c3RhY2suZW5kc3dpdGgobmVlZGxlWzpsXSk6CisgICAgICAgIGwgLT0gMQorICAgIHJldHVybiBsCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5YyBiL2xpYi9weXRob24yLjcvYXN5bmNoYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzkwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5byBiL2xpYi9weXRob24yLjcvYXN5bmNoYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNzkwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FzeW5jaGF0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FzeW5jb3JlLnB5IGIvbGliL3B5dGhvbjIuNy9hc3luY29yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTA5OWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hc3luY29yZS5weQpAQCAtMCwwICsxLDY1OSBAQAorIyAtKi0gTW9kZTogUHl0aG9uIC0qLQorIyAgIElkOiBhc3luY29yZS5weSx2IDIuNTEgMjAwMC8wOS8wNyAyMjoyOToyNiBydXNoaW5nIEV4cAorIyAgIEF1dGhvcjogU2FtIFJ1c2hpbmcgPHJ1c2hpbmdAbmlnaHRtYXJlLmNvbT4KKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENvcHlyaWdodCAxOTk2IGJ5IFNhbSBSdXNoaW5nCisjCisjICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkKKyMgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsCisjIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCisjIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBTYW0KKyMgUnVzaGluZyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworIyBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKKyMgcGVybWlzc2lvbi4KKyMKKyMgU0FNIFJVU0hJTkcgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisjIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4KKyMgTk8gRVZFTlQgU0hBTEwgU0FNIFJVU0hJTkcgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyMgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUworIyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisjIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTgorIyBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyIiIkJhc2ljIGluZnJhc3RydWN0dXJlIGZvciBhc3luY2hyb25vdXMgc29ja2V0IHNlcnZpY2UgY2xpZW50cyBhbmQgc2VydmVycy4KKworVGhlcmUgYXJlIG9ubHkgdHdvIHdheXMgdG8gaGF2ZSBhIHByb2dyYW0gb24gYSBzaW5nbGUgcHJvY2Vzc29yIGRvICJtb3JlCit0aGFuIG9uZSB0aGluZyBhdCBhIHRpbWUiLiAgTXVsdGktdGhyZWFkZWQgcHJvZ3JhbW1pbmcgaXMgdGhlIHNpbXBsZXN0IGFuZAorbW9zdCBwb3B1bGFyIHdheSB0byBkbyBpdCwgYnV0IHRoZXJlIGlzIGFub3RoZXIgdmVyeSBkaWZmZXJlbnQgdGVjaG5pcXVlLAordGhhdCBsZXRzIHlvdSBoYXZlIG5lYXJseSBhbGwgdGhlIGFkdmFudGFnZXMgb2YgbXVsdGktdGhyZWFkaW5nLCB3aXRob3V0CithY3R1YWxseSB1c2luZyBtdWx0aXBsZSB0aHJlYWRzLiBpdCdzIHJlYWxseSBvbmx5IHByYWN0aWNhbCBpZiB5b3VyIHByb2dyYW0KK2lzIGxhcmdlbHkgSS9PIGJvdW5kLiBJZiB5b3VyIHByb2dyYW0gaXMgQ1BVIGJvdW5kLCB0aGVuIHByZS1lbXB0aXZlCitzY2hlZHVsZWQgdGhyZWFkcyBhcmUgcHJvYmFibHkgd2hhdCB5b3UgcmVhbGx5IG5lZWQuIE5ldHdvcmsgc2VydmVycyBhcmUKK3JhcmVseSBDUFUtYm91bmQsIGhvd2V2ZXIuCisKK0lmIHlvdXIgb3BlcmF0aW5nIHN5c3RlbSBzdXBwb3J0cyB0aGUgc2VsZWN0KCkgc3lzdGVtIGNhbGwgaW4gaXRzIEkvTworbGlicmFyeSAoYW5kIG5lYXJseSBhbGwgZG8pLCB0aGVuIHlvdSBjYW4gdXNlIGl0IHRvIGp1Z2dsZSBtdWx0aXBsZQorY29tbXVuaWNhdGlvbiBjaGFubmVscyBhdCBvbmNlOyBkb2luZyBvdGhlciB3b3JrIHdoaWxlIHlvdXIgSS9PIGlzIHRha2luZworcGxhY2UgaW4gdGhlICJiYWNrZ3JvdW5kLiIgIEFsdGhvdWdoIHRoaXMgc3RyYXRlZ3kgY2FuIHNlZW0gc3RyYW5nZSBhbmQKK2NvbXBsZXgsIGVzcGVjaWFsbHkgYXQgZmlyc3QsIGl0IGlzIGluIG1hbnkgd2F5cyBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQKK2NvbnRyb2wgdGhhbiBtdWx0aS10aHJlYWRlZCBwcm9ncmFtbWluZy4gVGhlIG1vZHVsZSBkb2N1bWVudGVkIGhlcmUgc29sdmVzCittYW55IG9mIHRoZSBkaWZmaWN1bHQgcHJvYmxlbXMgZm9yIHlvdSwgbWFraW5nIHRoZSB0YXNrIG9mIGJ1aWxkaW5nCitzb3BoaXN0aWNhdGVkIGhpZ2gtcGVyZm9ybWFuY2UgbmV0d29yayBzZXJ2ZXJzIGFuZCBjbGllbnRzIGEgc25hcC4KKyIiIgorCitpbXBvcnQgc2VsZWN0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHdhcm5pbmdzCisKK2ltcG9ydCBvcworZnJvbSBlcnJubyBpbXBvcnQgRUFMUkVBRFksIEVJTlBST0dSRVNTLCBFV09VTERCTE9DSywgRUNPTk5SRVNFVCwgRUlOVkFMLCBcCisgICAgIEVOT1RDT05OLCBFU0hVVERPV04sIEVJTlRSLCBFSVNDT05OLCBFQkFERiwgRUNPTk5BQk9SVEVELCBFUElQRSwgRUFHQUlOLCBcCisgICAgIGVycm9yY29kZQorCitfRElTQ09OTkVDVEVEID0gZnJvemVuc2V0KChFQ09OTlJFU0VULCBFTk9UQ09OTiwgRVNIVVRET1dOLCBFQ09OTkFCT1JURUQsIEVQSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRUJBREYpKQorCit0cnk6CisgICAgc29ja2V0X21hcAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBzb2NrZXRfbWFwID0ge30KKworZGVmIF9zdHJlcnJvcihlcnIpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIG9zLnN0cmVycm9yKGVycikKKyAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IsIE5hbWVFcnJvcik6CisgICAgICAgIGlmIGVyciBpbiBlcnJvcmNvZGU6CisgICAgICAgICAgICByZXR1cm4gZXJyb3Jjb2RlW2Vycl0KKyAgICAgICAgcmV0dXJuICJVbmtub3duIGVycm9yICVzIiAlZXJyCisKK2NsYXNzIEV4aXROb3coRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK19yZXJhaXNlZF9leGNlcHRpb25zID0gKEV4aXROb3csIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KQorCitkZWYgcmVhZChvYmopOgorICAgIHRyeToKKyAgICAgICAgb2JqLmhhbmRsZV9yZWFkX2V2ZW50KCkKKyAgICBleGNlcHQgX3JlcmFpc2VkX2V4Y2VwdGlvbnM6CisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0OgorICAgICAgICBvYmouaGFuZGxlX2Vycm9yKCkKKworZGVmIHdyaXRlKG9iaik6CisgICAgdHJ5OgorICAgICAgICBvYmouaGFuZGxlX3dyaXRlX2V2ZW50KCkKKyAgICBleGNlcHQgX3JlcmFpc2VkX2V4Y2VwdGlvbnM6CisgICAgICAgIHJhaXNlCisgICAgZXhjZXB0OgorICAgICAgICBvYmouaGFuZGxlX2Vycm9yKCkKKworZGVmIF9leGNlcHRpb24ob2JqKToKKyAgICB0cnk6CisgICAgICAgIG9iai5oYW5kbGVfZXhwdF9ldmVudCgpCisgICAgZXhjZXB0IF9yZXJhaXNlZF9leGNlcHRpb25zOgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdDoKKyAgICAgICAgb2JqLmhhbmRsZV9lcnJvcigpCisKK2RlZiByZWFkd3JpdGUob2JqLCBmbGFncyk6CisgICAgdHJ5OgorICAgICAgICBpZiBmbGFncyAmIHNlbGVjdC5QT0xMSU46CisgICAgICAgICAgICBvYmouaGFuZGxlX3JlYWRfZXZlbnQoKQorICAgICAgICBpZiBmbGFncyAmIHNlbGVjdC5QT0xMT1VUOgorICAgICAgICAgICAgb2JqLmhhbmRsZV93cml0ZV9ldmVudCgpCisgICAgICAgIGlmIGZsYWdzICYgc2VsZWN0LlBPTExQUkk6CisgICAgICAgICAgICBvYmouaGFuZGxlX2V4cHRfZXZlbnQoKQorICAgICAgICBpZiBmbGFncyAmIChzZWxlY3QuUE9MTEhVUCB8IHNlbGVjdC5QT0xMRVJSIHwgc2VsZWN0LlBPTExOVkFMKToKKyAgICAgICAgICAgIG9iai5oYW5kbGVfY2xvc2UoKQorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgIGlmIGUuYXJnc1swXSBub3QgaW4gX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIG9iai5oYW5kbGVfZXJyb3IoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqLmhhbmRsZV9jbG9zZSgpCisgICAgZXhjZXB0IF9yZXJhaXNlZF9leGNlcHRpb25zOgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdDoKKyAgICAgICAgb2JqLmhhbmRsZV9lcnJvcigpCisKK2RlZiBwb2xsKHRpbWVvdXQ9MC4wLCBtYXA9Tm9uZSk6CisgICAgaWYgbWFwIGlzIE5vbmU6CisgICAgICAgIG1hcCA9IHNvY2tldF9tYXAKKyAgICBpZiBtYXA6CisgICAgICAgIHIgPSBbXTsgdyA9IFtdOyBlID0gW10KKyAgICAgICAgZm9yIGZkLCBvYmogaW4gbWFwLml0ZW1zKCk6CisgICAgICAgICAgICBpc19yID0gb2JqLnJlYWRhYmxlKCkKKyAgICAgICAgICAgIGlzX3cgPSBvYmoud3JpdGFibGUoKQorICAgICAgICAgICAgaWYgaXNfcjoKKyAgICAgICAgICAgICAgICByLmFwcGVuZChmZCkKKyAgICAgICAgICAgICMgYWNjZXB0aW5nIHNvY2tldHMgc2hvdWxkIG5vdCBiZSB3cml0YWJsZQorICAgICAgICAgICAgaWYgaXNfdyBhbmQgbm90IG9iai5hY2NlcHRpbmc6CisgICAgICAgICAgICAgICAgdy5hcHBlbmQoZmQpCisgICAgICAgICAgICBpZiBpc19yIG9yIGlzX3c6CisgICAgICAgICAgICAgICAgZS5hcHBlbmQoZmQpCisgICAgICAgIGlmIFtdID09IHIgPT0gdyA9PSBlOgorICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgciwgdywgZSA9IHNlbGVjdC5zZWxlY3QociwgdywgZSwgdGltZW91dCkKKyAgICAgICAgZXhjZXB0IHNlbGVjdC5lcnJvciwgZXJyOgorICAgICAgICAgICAgaWYgZXJyLmFyZ3NbMF0gIT0gRUlOVFI6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIGZkIGluIHI6CisgICAgICAgICAgICBvYmogPSBtYXAuZ2V0KGZkKQorICAgICAgICAgICAgaWYgb2JqIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJlYWQob2JqKQorCisgICAgICAgIGZvciBmZCBpbiB3OgorICAgICAgICAgICAgb2JqID0gbWFwLmdldChmZCkKKyAgICAgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB3cml0ZShvYmopCisKKyAgICAgICAgZm9yIGZkIGluIGU6CisgICAgICAgICAgICBvYmogPSBtYXAuZ2V0KGZkKQorICAgICAgICAgICAgaWYgb2JqIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIF9leGNlcHRpb24ob2JqKQorCitkZWYgcG9sbDIodGltZW91dD0wLjAsIG1hcD1Ob25lKToKKyAgICAjIFVzZSB0aGUgcG9sbCgpIHN1cHBvcnQgYWRkZWQgdG8gdGhlIHNlbGVjdCBtb2R1bGUgaW4gUHl0aG9uIDIuMAorICAgIGlmIG1hcCBpcyBOb25lOgorICAgICAgICBtYXAgPSBzb2NrZXRfbWFwCisgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgIyB0aW1lb3V0IGlzIGluIG1pbGxpc2Vjb25kcworICAgICAgICB0aW1lb3V0ID0gaW50KHRpbWVvdXQqMTAwMCkKKyAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKKyAgICBpZiBtYXA6CisgICAgICAgIGZvciBmZCwgb2JqIGluIG1hcC5pdGVtcygpOgorICAgICAgICAgICAgZmxhZ3MgPSAwCisgICAgICAgICAgICBpZiBvYmoucmVhZGFibGUoKToKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBzZWxlY3QuUE9MTElOIHwgc2VsZWN0LlBPTExQUkkKKyAgICAgICAgICAgICMgYWNjZXB0aW5nIHNvY2tldHMgc2hvdWxkIG5vdCBiZSB3cml0YWJsZQorICAgICAgICAgICAgaWYgb2JqLndyaXRhYmxlKCkgYW5kIG5vdCBvYmouYWNjZXB0aW5nOgorICAgICAgICAgICAgICAgIGZsYWdzIHw9IHNlbGVjdC5QT0xMT1VUCisgICAgICAgICAgICBpZiBmbGFnczoKKyAgICAgICAgICAgICAgICAjIE9ubHkgY2hlY2sgZm9yIGV4Y2VwdGlvbnMgaWYgb2JqZWN0IHdhcyBlaXRoZXIgcmVhZGFibGUKKyAgICAgICAgICAgICAgICAjIG9yIHdyaXRhYmxlLgorICAgICAgICAgICAgICAgIGZsYWdzIHw9IHNlbGVjdC5QT0xMRVJSIHwgc2VsZWN0LlBPTExIVVAgfCBzZWxlY3QuUE9MTE5WQUwKKyAgICAgICAgICAgICAgICBwb2xsc3Rlci5yZWdpc3RlcihmZCwgZmxhZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHIgPSBwb2xsc3Rlci5wb2xsKHRpbWVvdXQpCisgICAgICAgIGV4Y2VwdCBzZWxlY3QuZXJyb3IsIGVycjoKKyAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdICE9IEVJTlRSOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByID0gW10KKyAgICAgICAgZm9yIGZkLCBmbGFncyBpbiByOgorICAgICAgICAgICAgb2JqID0gbWFwLmdldChmZCkKKyAgICAgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByZWFkd3JpdGUob2JqLCBmbGFncykKKworcG9sbDMgPSBwb2xsMiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQWxpYXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworZGVmIGxvb3AodGltZW91dD0zMC4wLCB1c2VfcG9sbD1GYWxzZSwgbWFwPU5vbmUsIGNvdW50PU5vbmUpOgorICAgIGlmIG1hcCBpcyBOb25lOgorICAgICAgICBtYXAgPSBzb2NrZXRfbWFwCisKKyAgICBpZiB1c2VfcG9sbCBhbmQgaGFzYXR0cihzZWxlY3QsICdwb2xsJyk6CisgICAgICAgIHBvbGxfZnVuID0gcG9sbDIKKyAgICBlbHNlOgorICAgICAgICBwb2xsX2Z1biA9IHBvbGwKKworICAgIGlmIGNvdW50IGlzIE5vbmU6CisgICAgICAgIHdoaWxlIG1hcDoKKyAgICAgICAgICAgIHBvbGxfZnVuKHRpbWVvdXQsIG1hcCkKKworICAgIGVsc2U6CisgICAgICAgIHdoaWxlIG1hcCBhbmQgY291bnQgPiAwOgorICAgICAgICAgICAgcG9sbF9mdW4odGltZW91dCwgbWFwKQorICAgICAgICAgICAgY291bnQgPSBjb3VudCAtIDEKKworY2xhc3MgZGlzcGF0Y2hlcjoKKworICAgIGRlYnVnID0gRmFsc2UKKyAgICBjb25uZWN0ZWQgPSBGYWxzZQorICAgIGFjY2VwdGluZyA9IEZhbHNlCisgICAgY29ubmVjdGluZyA9IEZhbHNlCisgICAgY2xvc2luZyA9IEZhbHNlCisgICAgYWRkciA9IE5vbmUKKyAgICBpZ25vcmVfbG9nX3R5cGVzID0gZnJvemVuc2V0KFsnd2FybmluZyddKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2s9Tm9uZSwgbWFwPU5vbmUpOgorICAgICAgICBpZiBtYXAgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX21hcCA9IHNvY2tldF9tYXAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX21hcCA9IG1hcAorCisgICAgICAgIHNlbGYuX2ZpbGVubyA9IE5vbmUKKworICAgICAgICBpZiBzb2NrOgorICAgICAgICAgICAgIyBTZXQgdG8gbm9uYmxvY2tpbmcganVzdCB0byBtYWtlIHN1cmUgZm9yIGNhc2VzIHdoZXJlIHdlCisgICAgICAgICAgICAjIGdldCBhIHNvY2tldCBmcm9tIGEgYmxvY2tpbmcgc291cmNlLgorICAgICAgICAgICAgc29jay5zZXRibG9ja2luZygwKQorICAgICAgICAgICAgc2VsZi5zZXRfc29ja2V0KHNvY2ssIG1hcCkKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdGVkID0gVHJ1ZQorICAgICAgICAgICAgIyBUaGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIHNvY2tldAorICAgICAgICAgICAgIyBwYXNzZWQgYmUgY29ubmVjdGVkLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYWRkciA9IHNvY2suZ2V0cGVlcm5hbWUoKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChFTk9UQ09OTiwgRUlOVkFMKToKKyAgICAgICAgICAgICAgICAgICAgIyBUbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgd2UgZ290IGFuIHVuY29ubmVjdGVkCisgICAgICAgICAgICAgICAgICAgICMgc29ja2V0LgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3RlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgc29ja2V0IGlzIGJyb2tlbiBpbiBzb21lIHVua25vd24gd2F5LCBhbGVydAorICAgICAgICAgICAgICAgICAgICAjIHRoZSB1c2VyIGFuZCByZW1vdmUgaXQgZnJvbSB0aGUgbWFwICh0byBwcmV2ZW50CisgICAgICAgICAgICAgICAgICAgICMgcG9sbGluZyBvZiBicm9rZW4gc29ja2V0cykuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVsX2NoYW5uZWwobWFwKQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zb2NrZXQgPSBOb25lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHN0YXR1cyA9IFtzZWxmLl9fY2xhc3NfXy5fX21vZHVsZV9fKyIuIitzZWxmLl9fY2xhc3NfXy5fX25hbWVfX10KKyAgICAgICAgaWYgc2VsZi5hY2NlcHRpbmcgYW5kIHNlbGYuYWRkcjoKKyAgICAgICAgICAgIHN0YXR1cy5hcHBlbmQoJ2xpc3RlbmluZycpCisgICAgICAgIGVsaWYgc2VsZi5jb25uZWN0ZWQ6CisgICAgICAgICAgICBzdGF0dXMuYXBwZW5kKCdjb25uZWN0ZWQnKQorICAgICAgICBpZiBzZWxmLmFkZHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3RhdHVzLmFwcGVuZCgnJXM6JWQnICUgc2VsZi5hZGRyKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzdGF0dXMuYXBwZW5kKHJlcHIoc2VsZi5hZGRyKSkKKyAgICAgICAgcmV0dXJuICc8JXMgYXQgJSN4PicgJSAoJyAnLmpvaW4oc3RhdHVzKSwgaWQoc2VsZikpCisKKyAgICBfX3N0cl9fID0gX19yZXByX18KKworICAgIGRlZiBhZGRfY2hhbm5lbChzZWxmLCBtYXA9Tm9uZSk6CisgICAgICAgICNzZWxmLmxvZ19pbmZvKCdhZGRpbmcgY2hhbm5lbCAlcycgJSBzZWxmKQorICAgICAgICBpZiBtYXAgaXMgTm9uZToKKyAgICAgICAgICAgIG1hcCA9IHNlbGYuX21hcAorICAgICAgICBtYXBbc2VsZi5fZmlsZW5vXSA9IHNlbGYKKworICAgIGRlZiBkZWxfY2hhbm5lbChzZWxmLCBtYXA9Tm9uZSk6CisgICAgICAgIGZkID0gc2VsZi5fZmlsZW5vCisgICAgICAgIGlmIG1hcCBpcyBOb25lOgorICAgICAgICAgICAgbWFwID0gc2VsZi5fbWFwCisgICAgICAgIGlmIGZkIGluIG1hcDoKKyAgICAgICAgICAgICNzZWxmLmxvZ19pbmZvKCdjbG9zaW5nIGNoYW5uZWwgJWQ6JXMnICUgKGZkLCBzZWxmKSkKKyAgICAgICAgICAgIGRlbCBtYXBbZmRdCisgICAgICAgIHNlbGYuX2ZpbGVubyA9IE5vbmUKKworICAgIGRlZiBjcmVhdGVfc29ja2V0KHNlbGYsIGZhbWlseSwgdHlwZSk6CisgICAgICAgIHNlbGYuZmFtaWx5X2FuZF90eXBlID0gZmFtaWx5LCB0eXBlCisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KGZhbWlseSwgdHlwZSkKKyAgICAgICAgc29jay5zZXRibG9ja2luZygwKQorICAgICAgICBzZWxmLnNldF9zb2NrZXQoc29jaykKKworICAgIGRlZiBzZXRfc29ja2V0KHNlbGYsIHNvY2ssIG1hcD1Ob25lKToKKyAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrCisjIyAgICAgICAgc2VsZi5fX2RpY3RfX1snc29ja2V0J10gPSBzb2NrCisgICAgICAgIHNlbGYuX2ZpbGVubyA9IHNvY2suZmlsZW5vKCkKKyAgICAgICAgc2VsZi5hZGRfY2hhbm5lbChtYXApCisKKyAgICBkZWYgc2V0X3JldXNlX2FkZHIoc2VsZik6CisgICAgICAgICMgdHJ5IHRvIHJlLXVzZSBhIHNlcnZlciBwb3J0IGlmIHBvc3NpYmxlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc29ja2V0LnNldHNvY2tvcHQoCisgICAgICAgICAgICAgICAgc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsCisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuZ2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5TT19SRVVTRUFERFIpIHwgMQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAjIHByZWRpY2F0ZXMgZm9yIHNlbGVjdCgpCisgICAgIyB0aGVzZSBhcmUgdXNlZCBhcyBmaWx0ZXJzIGZvciB0aGUgbGlzdHMgb2Ygc29ja2V0cworICAgICMgdG8gcGFzcyB0byBzZWxlY3QoKS4KKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgIyBzb2NrZXQgb2JqZWN0IG1ldGhvZHMuCisgICAgIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgZGVmIGxpc3RlbihzZWxmLCBudW0pOgorICAgICAgICBzZWxmLmFjY2VwdGluZyA9IFRydWUKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnIGFuZCBudW0gPiA1OgorICAgICAgICAgICAgbnVtID0gNQorICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQubGlzdGVuKG51bSkKKworICAgIGRlZiBiaW5kKHNlbGYsIGFkZHIpOgorICAgICAgICBzZWxmLmFkZHIgPSBhZGRyCisgICAgICAgIHJldHVybiBzZWxmLnNvY2tldC5iaW5kKGFkZHIpCisKKyAgICBkZWYgY29ubmVjdChzZWxmLCBhZGRyZXNzKToKKyAgICAgICAgc2VsZi5jb25uZWN0ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmNvbm5lY3RpbmcgPSBUcnVlCisgICAgICAgIGVyciA9IHNlbGYuc29ja2V0LmNvbm5lY3RfZXgoYWRkcmVzcykKKyAgICAgICAgaWYgZXJyIGluIChFSU5QUk9HUkVTUywgRUFMUkVBRFksIEVXT1VMREJMT0NLKSBcCisgICAgICAgIG9yIGVyciA9PSBFSU5WQUwgYW5kIG9zLm5hbWUgaW4gKCdudCcsICdjZScpOgorICAgICAgICAgICAgc2VsZi5hZGRyID0gYWRkcmVzcworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGVyciBpbiAoMCwgRUlTQ09OTik6CisgICAgICAgICAgICBzZWxmLmFkZHIgPSBhZGRyZXNzCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9jb25uZWN0X2V2ZW50KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcihlcnIsIGVycm9yY29kZVtlcnJdKQorCisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgIyBYWFggY2FuIHJldHVybiBlaXRoZXIgYW4gYWRkcmVzcyBwYWlyIG9yIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIHdoeToKKyAgICAgICAgICAgIGlmIHdoeS5hcmdzWzBdIGluIChFV09VTERCTE9DSywgRUNPTk5BQk9SVEVELCBFQUdBSU4pOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY29ubiwgYWRkcgorCisgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuc29ja2V0LnNlbmQoZGF0YSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgd2h5OgorICAgICAgICAgICAgaWYgd2h5LmFyZ3NbMF0gPT0gRVdPVUxEQkxPQ0s6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsaWYgd2h5LmFyZ3NbMF0gaW4gX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiByZWN2KHNlbGYsIGJ1ZmZlcl9zaXplKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuc29ja2V0LnJlY3YoYnVmZmVyX3NpemUpCisgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAjIGEgY2xvc2VkIGNvbm5lY3Rpb24gaXMgaW5kaWNhdGVkIGJ5IHNpZ25hbGluZworICAgICAgICAgICAgICAgICMgYSByZWFkIGNvbmRpdGlvbiwgYW5kIGhhdmluZyByZWN2KCkgcmV0dXJuIDAuCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCB3aHk6CisgICAgICAgICAgICAjIHdpbnNvY2sgc29tZXRpbWVzIHJhaXNlcyBFTk9UQ09OTgorICAgICAgICAgICAgaWYgd2h5LmFyZ3NbMF0gaW4gX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY29ubmVjdGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5hY2NlcHRpbmcgPSBGYWxzZQorICAgICAgICBzZWxmLmNvbm5lY3RpbmcgPSBGYWxzZQorICAgICAgICBzZWxmLmRlbF9jaGFubmVsKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCB3aHk6CisgICAgICAgICAgICBpZiB3aHkuYXJnc1swXSBub3QgaW4gKEVOT1RDT05OLCBFQkFERik6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICMgY2hlYXAgaW5oZXJpdGFuY2UsIHVzZWQgdG8gcGFzcyBhbGwgb3RoZXIgYXR0cmlidXRlCisgICAgIyByZWZlcmVuY2VzIHRvIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBvYmplY3QuCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXRhdHRyID0gZ2V0YXR0cihzZWxmLnNvY2tldCwgYXR0cikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIiVzIGluc3RhbmNlIGhhcyBubyBhdHRyaWJ1dGUgJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGF0dHIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnID0gIiUobWUpcy4lKGF0dHIpcyBpcyBkZXByZWNhdGVkLiBVc2UgJShtZSlzLnNvY2tldC4lKGF0dHIpcyAiIFwKKyAgICAgICAgICAgICAgICAgICJpbnN0ZWFkLiIgJSB7J21lJzogc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICdhdHRyJzphdHRyfQorICAgICAgICAgICAgd2FybmluZ3Mud2Fybihtc2csIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICAgICAgcmV0dXJuIHJldGF0dHIKKworICAgICMgbG9nIGFuZCBsb2dfaW5mbyBtYXkgYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlIG1vcmUgc29waGlzdGljYXRlZAorICAgICMgbG9nZ2luZyBhbmQgd2FybmluZyBtZXRob2RzLiBJbiBnZW5lcmFsLCBsb2cgaXMgZm9yICdoaXQnIGxvZ2dpbmcKKyAgICAjIGFuZCAnbG9nX2luZm8nIGlzIGZvciBpbmZvcm1hdGlvbmFsLCB3YXJuaW5nIGFuZCBlcnJvciBsb2dnaW5nLgorCisgICAgZGVmIGxvZyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnbG9nOiAlc1xuJyAlIHN0cihtZXNzYWdlKSkKKworICAgIGRlZiBsb2dfaW5mbyhzZWxmLCBtZXNzYWdlLCB0eXBlPSdpbmZvJyk6CisgICAgICAgIGlmIHR5cGUgbm90IGluIHNlbGYuaWdub3JlX2xvZ190eXBlczoKKyAgICAgICAgICAgIHByaW50ICclczogJXMnICUgKHR5cGUsIG1lc3NhZ2UpCisKKyAgICBkZWYgaGFuZGxlX3JlYWRfZXZlbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYWNjZXB0aW5nOgorICAgICAgICAgICAgIyBhY2NlcHRpbmcgc29ja2V0cyBhcmUgbmV2ZXIgY29ubmVjdGVkLCB0aGV5ICJzcGF3biIgbmV3CisgICAgICAgICAgICAjIHNvY2tldHMgdGhhdCBhcmUgY29ubmVjdGVkCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9hY2NlcHQoKQorICAgICAgICBlbGlmIG5vdCBzZWxmLmNvbm5lY3RlZDoKKyAgICAgICAgICAgIGlmIHNlbGYuY29ubmVjdGluZzoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jb25uZWN0X2V2ZW50KCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlYWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfcmVhZCgpCisKKyAgICBkZWYgaGFuZGxlX2Nvbm5lY3RfZXZlbnQoc2VsZik6CisgICAgICAgIGVyciA9IHNlbGYuc29ja2V0LmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19FUlJPUikKKyAgICAgICAgaWYgZXJyICE9IDA6CisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJyLCBfc3RyZXJyb3IoZXJyKSkKKyAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdCgpCisgICAgICAgIHNlbGYuY29ubmVjdGVkID0gVHJ1ZQorICAgICAgICBzZWxmLmNvbm5lY3RpbmcgPSBGYWxzZQorCisgICAgZGVmIGhhbmRsZV93cml0ZV9ldmVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hY2NlcHRpbmc6CisgICAgICAgICAgICAjIEFjY2VwdGluZyBzb2NrZXRzIHNob3VsZG4ndCBnZXQgYSB3cml0ZSBldmVudC4KKyAgICAgICAgICAgICMgV2Ugd2lsbCBwcmV0ZW5kIGl0IGRpZG4ndCBoYXBwZW4uCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3Qgc2VsZi5jb25uZWN0ZWQ6CisgICAgICAgICAgICBpZiBzZWxmLmNvbm5lY3Rpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29ubmVjdF9ldmVudCgpCisgICAgICAgIHNlbGYuaGFuZGxlX3dyaXRlKCkKKworICAgIGRlZiBoYW5kbGVfZXhwdF9ldmVudChzZWxmKToKKyAgICAgICAgIyBoYW5kbGVfZXhwdF9ldmVudCgpIGlzIGNhbGxlZCBpZiB0aGVyZSBtaWdodCBiZSBhbiBlcnJvciBvbiB0aGUKKyAgICAgICAgIyBzb2NrZXQsIG9yIGlmIHRoZXJlIGlzIE9PQiBkYXRhCisgICAgICAgICMgY2hlY2sgZm9yIHRoZSBlcnJvciBjb25kaXRpb24gZmlyc3QKKyAgICAgICAgZXJyID0gc2VsZi5zb2NrZXQuZ2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0VSUk9SKQorICAgICAgICBpZiBlcnIgIT0gMDoKKyAgICAgICAgICAgICMgd2UgY2FuIGdldCBoZXJlIHdoZW4gc2VsZWN0LnNlbGVjdCgpIHNheXMgdGhhdCB0aGVyZSBpcyBhbgorICAgICAgICAgICAgIyBleGNlcHRpb25hbCBjb25kaXRpb24gb24gdGhlIHNvY2tldAorICAgICAgICAgICAgIyBzaW5jZSB0aGVyZSBpcyBhbiBlcnJvciwgd2UnbGwgZ28gYWhlYWQgYW5kIGNsb3NlIHRoZSBzb2NrZXQKKyAgICAgICAgICAgICMgbGlrZSB3ZSB3b3VsZCBpbiBhIHN1YmNsYXNzZWQgaGFuZGxlX3JlYWQoKSB0aGF0IHJlY2VpdmVkIG5vCisgICAgICAgICAgICAjIGRhdGEKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2V4cHQoKQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgbmlsLCB0LCB2LCB0YmluZm8gPSBjb21wYWN0X3RyYWNlYmFjaygpCisKKyAgICAgICAgIyBzb21ldGltZXMgYSB1c2VyIHJlcHIgbWV0aG9kIHdpbGwgY3Jhc2guCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGZfcmVwciA9IHJlcHIoc2VsZikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZl9yZXByID0gJzxfX3JlcHJfXyhzZWxmKSBmYWlsZWQgZm9yIG9iamVjdCBhdCAlMHg+JyAlIGlkKHNlbGYpCisKKyAgICAgICAgc2VsZi5sb2dfaW5mbygKKyAgICAgICAgICAgICd1bmNhcHR1cmVkIHB5dGhvbiBleGNlcHRpb24sIGNsb3NpbmcgY2hhbm5lbCAlcyAoJXM6JXMgJXMpJyAlICgKKyAgICAgICAgICAgICAgICBzZWxmX3JlcHIsCisgICAgICAgICAgICAgICAgdCwKKyAgICAgICAgICAgICAgICB2LAorICAgICAgICAgICAgICAgIHRiaW5mbworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAnZXJyb3InCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKworICAgIGRlZiBoYW5kbGVfZXhwdChzZWxmKToKKyAgICAgICAgc2VsZi5sb2dfaW5mbygndW5oYW5kbGVkIGluY29taW5nIHByaW9yaXR5IGV2ZW50JywgJ3dhcm5pbmcnKQorCisgICAgZGVmIGhhbmRsZV9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmxvZ19pbmZvKCd1bmhhbmRsZWQgcmVhZCBldmVudCcsICd3YXJuaW5nJykKKworICAgIGRlZiBoYW5kbGVfd3JpdGUoc2VsZik6CisgICAgICAgIHNlbGYubG9nX2luZm8oJ3VuaGFuZGxlZCB3cml0ZSBldmVudCcsICd3YXJuaW5nJykKKworICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgc2VsZi5sb2dfaW5mbygndW5oYW5kbGVkIGNvbm5lY3QgZXZlbnQnLCAnd2FybmluZycpCisKKyAgICBkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKKyAgICAgICAgc2VsZi5sb2dfaW5mbygndW5oYW5kbGVkIGFjY2VwdCBldmVudCcsICd3YXJuaW5nJykKKworICAgIGRlZiBoYW5kbGVfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYubG9nX2luZm8oJ3VuaGFuZGxlZCBjbG9zZSBldmVudCcsICd3YXJuaW5nJykKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGFkZHMgc2ltcGxlIGJ1ZmZlcmVkIG91dHB1dCBjYXBhYmlsaXR5LCB1c2VmdWwgZm9yIHNpbXBsZSBjbGllbnRzLgorIyBbZm9yIG1vcmUgc29waGlzdGljYXRlZCB1c2FnZSB1c2UgYXN5bmNoYXQuYXN5bmNfY2hhdF0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIGRpc3BhdGNoZXJfd2l0aF9zZW5kKGRpc3BhdGNoZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2s9Tm9uZSwgbWFwPU5vbmUpOgorICAgICAgICBkaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYsIHNvY2ssIG1hcCkKKyAgICAgICAgc2VsZi5vdXRfYnVmZmVyID0gJycKKworICAgIGRlZiBpbml0aWF0ZV9zZW5kKHNlbGYpOgorICAgICAgICBudW1fc2VudCA9IDAKKyAgICAgICAgbnVtX3NlbnQgPSBkaXNwYXRjaGVyLnNlbmQoc2VsZiwgc2VsZi5vdXRfYnVmZmVyWzo1MTJdKQorICAgICAgICBzZWxmLm91dF9idWZmZXIgPSBzZWxmLm91dF9idWZmZXJbbnVtX3NlbnQ6XQorCisgICAgZGVmIGhhbmRsZV93cml0ZShzZWxmKToKKyAgICAgICAgc2VsZi5pbml0aWF0ZV9zZW5kKCkKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIChub3Qgc2VsZi5jb25uZWN0ZWQpIG9yIGxlbihzZWxmLm91dF9idWZmZXIpCisKKyAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIHNlbGYubG9nX2luZm8oJ3NlbmRpbmcgJXMnICUgcmVwcihkYXRhKSkKKyAgICAgICAgc2VsZi5vdXRfYnVmZmVyID0gc2VsZi5vdXRfYnVmZmVyICsgZGF0YQorICAgICAgICBzZWxmLmluaXRpYXRlX3NlbmQoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB1c2VkIGZvciBkZWJ1Z2dpbmcuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgY29tcGFjdF90cmFjZWJhY2soKToKKyAgICB0LCB2LCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgdGJpbmZvID0gW10KKyAgICBpZiBub3QgdGI6ICMgTXVzdCBoYXZlIGEgdHJhY2ViYWNrCisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ0cmFjZWJhY2sgZG9lcyBub3QgZXhpc3QiKQorICAgIHdoaWxlIHRiOgorICAgICAgICB0YmluZm8uYXBwZW5kKCgKKyAgICAgICAgICAgIHRiLnRiX2ZyYW1lLmZfY29kZS5jb19maWxlbmFtZSwKKyAgICAgICAgICAgIHRiLnRiX2ZyYW1lLmZfY29kZS5jb19uYW1lLAorICAgICAgICAgICAgc3RyKHRiLnRiX2xpbmVubykKKyAgICAgICAgICAgICkpCisgICAgICAgIHRiID0gdGIudGJfbmV4dAorCisgICAgIyBqdXN0IHRvIGJlIHNhZmUKKyAgICBkZWwgdGIKKworICAgIGZpbGUsIGZ1bmN0aW9uLCBsaW5lID0gdGJpbmZvWy0xXQorICAgIGluZm8gPSAnICcuam9pbihbJ1slc3wlc3wlc10nICUgeCBmb3IgeCBpbiB0YmluZm9dKQorICAgIHJldHVybiAoZmlsZSwgZnVuY3Rpb24sIGxpbmUpLCB0LCB2LCBpbmZvCisKK2RlZiBjbG9zZV9hbGwobWFwPU5vbmUsIGlnbm9yZV9hbGw9RmFsc2UpOgorICAgIGlmIG1hcCBpcyBOb25lOgorICAgICAgICBtYXAgPSBzb2NrZXRfbWFwCisgICAgZm9yIHggaW4gbWFwLnZhbHVlcygpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB4LmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIHg6CisgICAgICAgICAgICBpZiB4LmFyZ3NbMF0gPT0gRUJBREY6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBub3QgaWdub3JlX2FsbDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgX3JlcmFpc2VkX2V4Y2VwdGlvbnM6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBub3QgaWdub3JlX2FsbDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgIG1hcC5jbGVhcigpCisKKyMgQXN5bmNocm9ub3VzIEZpbGUgSS9POgorIworIyBBZnRlciBhIGxpdHRsZSByZXNlYXJjaCAocmVhZGluZyBtYW4gcGFnZXMgb24gdmFyaW91cyB1bml4ZW4sIGFuZAorIyBkaWdnaW5nIHRocm91Z2ggdGhlIGxpbnV4IGtlcm5lbCksIEkndmUgZGV0ZXJtaW5lZCB0aGF0IHNlbGVjdCgpCisjIGlzbid0IG1lYW50IGZvciBkb2luZyBhc3luY2hyb25vdXMgZmlsZSBpL28uCisjIEhlYXJ0ZW5pbmcsIHRob3VnaCAtIHJlYWRpbmcgbGludXgvbW0vZmlsZW1hcC5jIHNob3dzIHRoYXQgbGludXgKKyMgc3VwcG9ydHMgYXN5bmNocm9ub3VzIHJlYWQtYWhlYWQuICBTbyBfTU9TVF8gb2YgdGhlIHRpbWUsIHRoZSBkYXRhCisjIHdpbGwgYmUgc2l0dGluZyBpbiBtZW1vcnkgZm9yIHVzIGFscmVhZHkgd2hlbiB3ZSBnbyB0byByZWFkIGl0LgorIworIyBXaGF0IG90aGVyIE9TJ3MgKGJlc2lkZXMgTlQpIHN1cHBvcnQgYXN5bmMgZmlsZSBpL28/ICBbVk1TP10KKyMKKyMgUmVnYXJkbGVzcywgdGhpcyBpcyB1c2VmdWwgZm9yIHBpcGVzLCBhbmQgc3RkaW4vc3Rkb3V0Li4uCisKK2lmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICBpbXBvcnQgZmNudGwKKworICAgIGNsYXNzIGZpbGVfd3JhcHBlcjoKKyAgICAgICAgIyBIZXJlIHdlIG92ZXJyaWRlIGp1c3QgZW5vdWdoIHRvIG1ha2UgYSBmaWxlCisgICAgICAgICMgbG9vayBsaWtlIGEgc29ja2V0IGZvciB0aGUgcHVycG9zZXMgb2YgYXN5bmNvcmUuCisgICAgICAgICMgVGhlIHBhc3NlZCBmZCBpcyBhdXRvbWF0aWNhbGx5IG9zLmR1cCgpJ2QKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZmQpOgorICAgICAgICAgICAgc2VsZi5mZCA9IG9zLmR1cChmZCkKKworICAgICAgICBkZWYgcmVjdihzZWxmLCAqYXJncyk6CisgICAgICAgICAgICByZXR1cm4gb3MucmVhZChzZWxmLmZkLCAqYXJncykKKworICAgICAgICBkZWYgc2VuZChzZWxmLCAqYXJncyk6CisgICAgICAgICAgICByZXR1cm4gb3Mud3JpdGUoc2VsZi5mZCwgKmFyZ3MpCisKKyAgICAgICAgZGVmIGdldHNvY2tvcHQoc2VsZiwgbGV2ZWwsIG9wdG5hbWUsIGJ1Zmxlbj1Ob25lKToKKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSBzb2NrZXQuU09MX1NPQ0tFVCBhbmQKKyAgICAgICAgICAgICAgICBvcHRuYW1lID09IHNvY2tldC5TT19FUlJPUiBhbmQKKyAgICAgICAgICAgICAgICBub3QgYnVmbGVuKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiT25seSBhc3luY29yZSBzcGVjaWZpYyBiZWhhdmlvdXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wbGVtZW50ZWQuIikKKworICAgICAgICByZWFkID0gcmVjdgorICAgICAgICB3cml0ZSA9IHNlbmQKKworICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICBvcy5jbG9zZShzZWxmLmZkKQorCisgICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mZAorCisgICAgY2xhc3MgZmlsZV9kaXNwYXRjaGVyKGRpc3BhdGNoZXIpOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmZCwgbWFwPU5vbmUpOgorICAgICAgICAgICAgZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmLCBOb25lLCBtYXApCisgICAgICAgICAgICBzZWxmLmNvbm5lY3RlZCA9IFRydWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmZCA9IGZkLmZpbGVubygpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5zZXRfZmlsZShmZCkKKyAgICAgICAgICAgICMgc2V0IGl0IHRvIG5vbi1ibG9ja2luZyBtb2RlCisgICAgICAgICAgICBmbGFncyA9IGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX0dFVEZMLCAwKQorICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IG9zLk9fTk9OQkxPQ0sKKyAgICAgICAgICAgIGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX1NFVEZMLCBmbGFncykKKworICAgICAgICBkZWYgc2V0X2ZpbGUoc2VsZiwgZmQpOgorICAgICAgICAgICAgc2VsZi5zb2NrZXQgPSBmaWxlX3dyYXBwZXIoZmQpCisgICAgICAgICAgICBzZWxmLl9maWxlbm8gPSBzZWxmLnNvY2tldC5maWxlbm8oKQorICAgICAgICAgICAgc2VsZi5hZGRfY2hhbm5lbCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FzeW5jb3JlLnB5YyBiL2xpYi9weXRob24yLjcvYXN5bmNvcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDAzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FzeW5jb3JlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2FzeW5jb3JlLnB5byBiL2xpYi9weXRob24yLjcvYXN5bmNvcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDAzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2FzeW5jb3JlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2F0ZXhpdC5weSBiL2xpYi9weXRob24yLjcvYXRleGl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZmRkZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2F0ZXhpdC5weQpAQCAtMCwwICsxLDY1IEBACisiIiIKK2F0ZXhpdC5weSAtIGFsbG93IHByb2dyYW1tZXIgdG8gZGVmaW5lIG11bHRpcGxlIGV4aXQgZnVuY3Rpb25zIHRvIGJlIGV4ZWN1dGVkCit1cG9uIG5vcm1hbCBwcm9ncmFtIHRlcm1pbmF0aW9uLgorCitPbmUgcHVibGljIGZ1bmN0aW9uLCByZWdpc3RlciwgaXMgZGVmaW5lZC4KKyIiIgorCitfX2FsbF9fID0gWyJyZWdpc3RlciJdCisKK2ltcG9ydCBzeXMKKworX2V4aXRoYW5kbGVycyA9IFtdCitkZWYgX3J1bl9leGl0ZnVuY3MoKToKKyAgICAiIiJydW4gYW55IHJlZ2lzdGVyZWQgZXhpdCBmdW5jdGlvbnMKKworICAgIF9leGl0aGFuZGxlcnMgaXMgdHJhdmVyc2VkIGluIHJldmVyc2Ugb3JkZXIgc28gZnVuY3Rpb25zIGFyZSBleGVjdXRlZAorICAgIGxhc3QgaW4sIGZpcnN0IG91dC4KKyAgICAiIiIKKworICAgIGV4Y19pbmZvID0gTm9uZQorICAgIHdoaWxlIF9leGl0aGFuZGxlcnM6CisgICAgICAgIGZ1bmMsIHRhcmdzLCBrYXJncyA9IF9leGl0aGFuZGxlcnMucG9wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqdGFyZ3MsICoqa2FyZ3MpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgZXhjX2luZm8gPSBzeXMuZXhjX2luZm8oKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiRXJyb3IgaW4gYXRleGl0Ll9ydW5fZXhpdGZ1bmNzOiIKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgZXhjX2luZm8gPSBzeXMuZXhjX2luZm8oKQorCisgICAgaWYgZXhjX2luZm8gaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIGV4Y19pbmZvWzBdLCBleGNfaW5mb1sxXSwgZXhjX2luZm9bMl0KKworCitkZWYgcmVnaXN0ZXIoZnVuYywgKnRhcmdzLCAqKmthcmdzKToKKyAgICAiIiJyZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGJlIGV4ZWN1dGVkIHVwb24gbm9ybWFsIHByb2dyYW0gdGVybWluYXRpb24KKworICAgIGZ1bmMgLSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgYXQgZXhpdAorICAgIHRhcmdzIC0gb3B0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gZnVuYworICAgIGthcmdzIC0gb3B0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgdG8gcGFzcyB0byBmdW5jCisKKyAgICBmdW5jIGlzIHJldHVybmVkIHRvIGZhY2lsaXRhdGUgdXNhZ2UgYXMgYSBkZWNvcmF0b3IuCisgICAgIiIiCisgICAgX2V4aXRoYW5kbGVycy5hcHBlbmQoKGZ1bmMsIHRhcmdzLCBrYXJncykpCisgICAgcmV0dXJuIGZ1bmMKKworaWYgaGFzYXR0cihzeXMsICJleGl0ZnVuYyIpOgorICAgICMgQXNzdW1lIGl0J3MgYW5vdGhlciByZWdpc3RlcmVkIGV4aXQgZnVuY3Rpb24gLSBhcHBlbmQgaXQgdG8gb3VyIGxpc3QKKyAgICByZWdpc3RlcihzeXMuZXhpdGZ1bmMpCitzeXMuZXhpdGZ1bmMgPSBfcnVuX2V4aXRmdW5jcworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGRlZiB4MSgpOgorICAgICAgICBwcmludCAicnVubmluZyB4MSIKKyAgICBkZWYgeDIobik6CisgICAgICAgIHByaW50ICJydW5uaW5nIHgyKCVyKSIgJSAobiwpCisgICAgZGVmIHgzKG4sIGt3ZD1Ob25lKToKKyAgICAgICAgcHJpbnQgInJ1bm5pbmcgeDMoJXIsIGt3ZD0lcikiICUgKG4sIGt3ZCkKKworICAgIHJlZ2lzdGVyKHgxKQorICAgIHJlZ2lzdGVyKHgyLCAxMikKKyAgICByZWdpc3Rlcih4MywgNSwgImJhciIpCisgICAgcmVnaXN0ZXIoeDMsICJubyBrd2QgYXJncyIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2F0ZXhpdC5weWMgYi9saWIvcHl0aG9uMi43L2F0ZXhpdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxMDQwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXRleGl0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2F0ZXhpdC5weW8gYi9saWIvcHl0aG9uMi43L2F0ZXhpdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxMDQwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYXRleGl0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2F1ZGlvZGV2LnB5IGIvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjgzMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weQpAQCAtMCwwICsxLDI2MCBAQAorIiIiQ2xhc3NlcyBmb3IgbWFuaXB1bGF0aW5nIGF1ZGlvIGRldmljZXMgKGN1cnJlbnRseSBvbmx5IGZvciBTdW4gYW5kIFNHSSkiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIGF1ZGlvZGV2IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworX19hbGxfXyA9IFsiZXJyb3IiLCJBdWRpb0RldiJdCisKK2NsYXNzIGVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBQbGF5X0F1ZGlvX3NnaToKKyAgICAjIFByaXZhdGUgaW5zdGFuY2UgdmFyaWFibGVzCisjIyAgICAgIGlmIDA6IGFjY2VzcyBmcmFtZXJhdGVsaXN0LCBuY2hhbm5lbHNsaXN0LCBzYW1wd2lkdGhsaXN0LCBvbGRwYXJhbXMsIFwKKyMjICAgICAgICAgICAgICAgIHBhcmFtcywgY29uZmlnLCBpbml0ZWRfb3V0cmF0ZSwgaW5pdGVkX3dpZHRoLCBcCisjIyAgICAgICAgICAgICAgICBpbml0ZWRfbmNoYW5uZWxzLCBwb3J0LCBjb252ZXJ0ZXIsIGNsYXNzaW5pdGVkOiBwcml2YXRlCisKKyAgICBjbGFzc2luaXRlZCA9IDAKKyAgICBmcmFtZXJhdGVsaXN0ID0gbmNoYW5uZWxzbGlzdCA9IHNhbXB3aWR0aGxpc3QgPSBOb25lCisKKyAgICBkZWYgaW5pdGNsYXNzKHNlbGYpOgorICAgICAgICBpbXBvcnQgQUwKKyAgICAgICAgc2VsZi5mcmFtZXJhdGVsaXN0ID0gWworICAgICAgICAgICAgICAgICAgKDQ4MDAwLCBBTC5SQVRFXzQ4MDAwKSwKKyAgICAgICAgICAgICAgICAgICg0NDEwMCwgQUwuUkFURV80NDEwMCksCisgICAgICAgICAgICAgICAgICAoMzIwMDAsIEFMLlJBVEVfMzIwMDApLAorICAgICAgICAgICAgICAgICAgKDIyMDUwLCBBTC5SQVRFXzIyMDUwKSwKKyAgICAgICAgICAgICAgICAgICgxNjAwMCwgQUwuUkFURV8xNjAwMCksCisgICAgICAgICAgICAgICAgICAoMTEwMjUsIEFMLlJBVEVfMTEwMjUpLAorICAgICAgICAgICAgICAgICAgKCA4MDAwLCAgQUwuUkFURV84MDAwKSwKKyAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5uY2hhbm5lbHNsaXN0ID0gWworICAgICAgICAgICAgICAgICAgKDEsIEFMLk1PTk8pLAorICAgICAgICAgICAgICAgICAgKDIsIEFMLlNURVJFTyksCisgICAgICAgICAgICAgICAgICAoNCwgQUwuUVVBRFJPKSwKKyAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5zYW1wd2lkdGhsaXN0ID0gWworICAgICAgICAgICAgICAgICAgKDEsIEFMLlNBTVBMRV84KSwKKyAgICAgICAgICAgICAgICAgICgyLCBBTC5TQU1QTEVfMTYpLAorICAgICAgICAgICAgICAgICAgKDMsIEFMLlNBTVBMRV8yNCksCisgICAgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuY2xhc3Npbml0ZWQgPSAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGltcG9ydCBhbCwgQUwKKyAgICAgICAgaWYgbm90IHNlbGYuY2xhc3Npbml0ZWQ6CisgICAgICAgICAgICBzZWxmLmluaXRjbGFzcygpCisgICAgICAgIHNlbGYub2xkcGFyYW1zID0gW10KKyAgICAgICAgc2VsZi5wYXJhbXMgPSBbQUwuT1VUUFVUX1JBVEUsIDBdCisgICAgICAgIHNlbGYuY29uZmlnID0gYWwubmV3Y29uZmlnKCkKKyAgICAgICAgc2VsZi5pbml0ZWRfb3V0cmF0ZSA9IDAKKyAgICAgICAgc2VsZi5pbml0ZWRfd2lkdGggPSAwCisgICAgICAgIHNlbGYuaW5pdGVkX25jaGFubmVscyA9IDAKKyAgICAgICAgc2VsZi5jb252ZXJ0ZXIgPSBOb25lCisgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wb3J0OgorICAgICAgICAgICAgc2VsZi5zdG9wKCkKKyAgICAgICAgaWYgc2VsZi5vbGRwYXJhbXM6CisgICAgICAgICAgICBpbXBvcnQgYWwsIEFMCisgICAgICAgICAgICBhbC5zZXRwYXJhbXMoQUwuREVGQVVMVF9ERVZJQ0UsIHNlbGYub2xkcGFyYW1zKQorICAgICAgICAgICAgc2VsZi5vbGRwYXJhbXMgPSBbXQorCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBvcnQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgd2hpbGUgc2VsZi5wb3J0LmdldGZpbGxlZCgpID4gMDoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBzZWxmLnN0b3AoKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYucG9ydDoKKyAgICAgICAgICAgIHNlbGYucG9ydC5jbG9zZXBvcnQoKQorICAgICAgICAgICAgc2VsZi5wb3J0ID0gTm9uZQorICAgICAgICBpZiBzZWxmLm9sZHBhcmFtczoKKyAgICAgICAgICAgIGltcG9ydCBhbCwgQUwKKyAgICAgICAgICAgIGFsLnNldHBhcmFtcyhBTC5ERUZBVUxUX0RFVklDRSwgc2VsZi5vbGRwYXJhbXMpCisgICAgICAgICAgICBzZWxmLm9sZHBhcmFtcyA9IFtdCisKKyAgICBkZWYgc2V0b3V0cmF0ZShzZWxmLCByYXRlKToKKyAgICAgICAgZm9yIChyYXcsIGNvb2tlZCkgaW4gc2VsZi5mcmFtZXJhdGVsaXN0OgorICAgICAgICAgICAgaWYgcmF0ZSA9PSByYXc6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJhbXNbMV0gPSBjb29rZWQKKyAgICAgICAgICAgICAgICBzZWxmLmluaXRlZF9vdXRyYXRlID0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgJ2JhZCBvdXRwdXQgcmF0ZScKKworICAgIGRlZiBzZXRzYW1wd2lkdGgoc2VsZiwgd2lkdGgpOgorICAgICAgICBmb3IgKHJhdywgY29va2VkKSBpbiBzZWxmLnNhbXB3aWR0aGxpc3Q6CisgICAgICAgICAgICBpZiB3aWR0aCA9PSByYXc6CisgICAgICAgICAgICAgICAgc2VsZi5jb25maWcuc2V0d2lkdGgoY29va2VkKQorICAgICAgICAgICAgICAgIHNlbGYuaW5pdGVkX3dpZHRoID0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB3aWR0aCA9PSAwOgorICAgICAgICAgICAgICAgIGltcG9ydCBBTAorICAgICAgICAgICAgICAgIHNlbGYuaW5pdGVkX3dpZHRoID0gMAorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLnNldHdpZHRoKEFMLlNBTVBMRV8xNikKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnZlcnRlciA9IHNlbGYudWxhdzJsaW4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICdiYWQgc2FtcGxlIHdpZHRoJworCisgICAgZGVmIHNldG5jaGFubmVscyhzZWxmLCBuY2hhbm5lbHMpOgorICAgICAgICBmb3IgKHJhdywgY29va2VkKSBpbiBzZWxmLm5jaGFubmVsc2xpc3Q6CisgICAgICAgICAgICBpZiBuY2hhbm5lbHMgPT0gcmF3OgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlnLnNldGNoYW5uZWxzKGNvb2tlZCkKKyAgICAgICAgICAgICAgICBzZWxmLmluaXRlZF9uY2hhbm5lbHMgPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAnYmFkICMgb2YgY2hhbm5lbHMnCisKKyAgICBkZWYgd3JpdGVmcmFtZXMoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIG5vdCAoc2VsZi5pbml0ZWRfb3V0cmF0ZSBhbmQgc2VsZi5pbml0ZWRfbmNoYW5uZWxzKToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAncGFyYW1zIG5vdCBzcGVjaWZpZWQnCisgICAgICAgIGlmIG5vdCBzZWxmLnBvcnQ6CisgICAgICAgICAgICBpbXBvcnQgYWwsIEFMCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBhbC5vcGVucG9ydCgnUHl0aG9uJywgJ3cnLCBzZWxmLmNvbmZpZykKKyAgICAgICAgICAgIHNlbGYub2xkcGFyYW1zID0gc2VsZi5wYXJhbXNbOl0KKyAgICAgICAgICAgIGFsLmdldHBhcmFtcyhBTC5ERUZBVUxUX0RFVklDRSwgc2VsZi5vbGRwYXJhbXMpCisgICAgICAgICAgICBhbC5zZXRwYXJhbXMoQUwuREVGQVVMVF9ERVZJQ0UsIHNlbGYucGFyYW1zKQorICAgICAgICBpZiBzZWxmLmNvbnZlcnRlcjoKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLmNvbnZlcnRlcihkYXRhKQorICAgICAgICBzZWxmLnBvcnQud3JpdGVzYW1wcyhkYXRhKQorCisgICAgZGVmIGdldGZpbGxlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wb3J0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucG9ydC5nZXRmaWxsZWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBnZXRmaWxsYWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wb3J0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucG9ydC5nZXRmaWxsYWJsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb25maWcuZ2V0cXVldWVzaXplKCkKKworICAgICMgcHJpdmF0ZSBtZXRob2RzCisjIyAgICAgIGlmIDA6IGFjY2VzcyAqOiBwcml2YXRlCisKKyAgICBkZWYgdWxhdzJsaW4oc2VsZiwgZGF0YSk6CisgICAgICAgIGltcG9ydCBhdWRpb29wCisgICAgICAgIHJldHVybiBhdWRpb29wLnVsYXcybGluKGRhdGEsIDIpCisKK2NsYXNzIFBsYXlfQXVkaW9fc3VuOgorIyMgICAgICBpZiAwOiBhY2Nlc3Mgb3V0cmF0ZSwgc2FtcHdpZHRoLCBuY2hhbm5lbHMsIGluaXRlZF9vdXRyYXRlLCBpbml0ZWRfd2lkdGgsIFwKKyMjICAgICAgICAgICAgICAgIGluaXRlZF9uY2hhbm5lbHMsIGNvbnZlcnRlcjogcHJpdmF0ZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm91dHJhdGUgPSAwCisgICAgICAgIHNlbGYuc2FtcHdpZHRoID0gMAorICAgICAgICBzZWxmLm5jaGFubmVscyA9IDAKKyAgICAgICAgc2VsZi5pbml0ZWRfb3V0cmF0ZSA9IDAKKyAgICAgICAgc2VsZi5pbml0ZWRfd2lkdGggPSAwCisgICAgICAgIHNlbGYuaW5pdGVkX25jaGFubmVscyA9IDAKKyAgICAgICAgc2VsZi5jb252ZXJ0ZXIgPSBOb25lCisgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zdG9wKCkKKworICAgIGRlZiBzZXRvdXRyYXRlKHNlbGYsIHJhdGUpOgorICAgICAgICBzZWxmLm91dHJhdGUgPSByYXRlCisgICAgICAgIHNlbGYuaW5pdGVkX291dHJhdGUgPSAxCisKKyAgICBkZWYgc2V0c2FtcHdpZHRoKHNlbGYsIHdpZHRoKToKKyAgICAgICAgc2VsZi5zYW1wd2lkdGggPSB3aWR0aAorICAgICAgICBzZWxmLmluaXRlZF93aWR0aCA9IDEKKworICAgIGRlZiBzZXRuY2hhbm5lbHMoc2VsZiwgbmNoYW5uZWxzKToKKyAgICAgICAgc2VsZi5uY2hhbm5lbHMgPSBuY2hhbm5lbHMKKyAgICAgICAgc2VsZi5pbml0ZWRfbmNoYW5uZWxzID0gMQorCisgICAgZGVmIHdyaXRlZnJhbWVzKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3QgKHNlbGYuaW5pdGVkX291dHJhdGUgYW5kIHNlbGYuaW5pdGVkX3dpZHRoIGFuZCBzZWxmLmluaXRlZF9uY2hhbm5lbHMpOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICdwYXJhbXMgbm90IHNwZWNpZmllZCcKKyAgICAgICAgaWYgbm90IHNlbGYucG9ydDoKKyAgICAgICAgICAgIGltcG9ydCBzdW5hdWRpb2RldiwgU1VOQVVESU9ERVYKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHN1bmF1ZGlvZGV2Lm9wZW4oJ3cnKQorICAgICAgICAgICAgaW5mbyA9IHNlbGYucG9ydC5nZXRpbmZvKCkKKyAgICAgICAgICAgIGluZm8ub19zYW1wbGVfcmF0ZSA9IHNlbGYub3V0cmF0ZQorICAgICAgICAgICAgaW5mby5vX2NoYW5uZWxzID0gc2VsZi5uY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIHNlbGYuc2FtcHdpZHRoID09IDA6CisgICAgICAgICAgICAgICAgaW5mby5vX3ByZWNpc2lvbiA9IDgKKyAgICAgICAgICAgICAgICBzZWxmLm9fZW5jb2RpbmcgPSBTVU5BVURJT0RFVi5FTkNPRElOR19VTEFXCisgICAgICAgICAgICAgICAgIyBYWFggSGFjaywgaGFjayAtLSBsZWF2ZSBkZWZhdWx0cworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbmZvLm9fcHJlY2lzaW9uID0gOCAqIHNlbGYuc2FtcHdpZHRoCisgICAgICAgICAgICAgICAgaW5mby5vX2VuY29kaW5nID0gU1VOQVVESU9ERVYuRU5DT0RJTkdfTElORUFSCisgICAgICAgICAgICAgICAgc2VsZi5wb3J0LnNldGluZm8oaW5mbykKKyAgICAgICAgaWYgc2VsZi5jb252ZXJ0ZXI6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5jb252ZXJ0ZXIoZGF0YSkKKyAgICAgICAgc2VsZi5wb3J0LndyaXRlKGRhdGEpCisKKyAgICBkZWYgd2FpdChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucG9ydDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnBvcnQuZHJhaW4oKQorICAgICAgICBzZWxmLnN0b3AoKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYucG9ydDoKKyAgICAgICAgICAgIHNlbGYucG9ydC5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLnBvcnQuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5wb3J0ID0gTm9uZQorCisgICAgZGVmIGdldGZpbGxlZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wb3J0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucG9ydC5vYnVmY291bnQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDAKKworIyMgICAgIyBOb2JvZHkgcmVtZW1iZXJzIHdoYXQgdGhpcyBtZXRob2QgZG9lcywgYW5kIGl0J3MgYnJva2VuLiA6LSgKKyMjICAgIGRlZiBnZXRmaWxsYWJsZShzZWxmKToKKyMjICAgICAgICByZXR1cm4gQlVGRkVSU0laRSAtIHNlbGYuZ2V0ZmlsbGVkKCkKKworZGVmIEF1ZGlvRGV2KCk6CisgICAgIyBEeW5hbWljYWxseSB0cnkgdG8gaW1wb3J0IGFuZCB1c2UgYSBwbGF0Zm9ybSBzcGVjaWZpYyBtb2R1bGUuCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgYWwKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBzdW5hdWRpb2RldgorICAgICAgICAgICAgcmV0dXJuIFBsYXlfQXVkaW9fc3VuKCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBBdWRpb19tYWMKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgJ25vIGF1ZGlvIGRldmljZScKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEF1ZGlvX21hYy5QbGF5X0F1ZGlvX21hYygpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIFBsYXlfQXVkaW9fc2dpKCkKKworZGVmIHRlc3QoZm4gPSBOb25lKToKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBmbiA9IHN5cy5hcmd2WzFdCisgICAgZWxzZToKKyAgICAgICAgZm4gPSAnZjpqdXN0IHNhbXBsZXM6anVzdC5haWYnCisgICAgaW1wb3J0IGFpZmMKKyAgICBhZiA9IGFpZmMub3BlbihmbiwgJ3InKQorICAgIHByaW50IGZuLCBhZi5nZXRwYXJhbXMoKQorICAgIHAgPSBBdWRpb0RldigpCisgICAgcC5zZXRvdXRyYXRlKGFmLmdldGZyYW1lcmF0ZSgpKQorICAgIHAuc2V0c2FtcHdpZHRoKGFmLmdldHNhbXB3aWR0aCgpKQorICAgIHAuc2V0bmNoYW5uZWxzKGFmLmdldG5jaGFubmVscygpKQorICAgIEJVRlNJWiA9IGFmLmdldGZyYW1lcmF0ZSgpL2FmLmdldHNhbXB3aWR0aCgpL2FmLmdldG5jaGFubmVscygpCisgICAgd2hpbGUgMToKKyAgICAgICAgZGF0YSA9IGFmLnJlYWRmcmFtZXMoQlVGU0laKQorICAgICAgICBpZiBub3QgZGF0YTogYnJlYWsKKyAgICAgICAgcHJpbnQgbGVuKGRhdGEpCisgICAgICAgIHAud3JpdGVmcmFtZXMoZGF0YSkKKyAgICBwLndhaXQoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weWMgYi9saWIvcHl0aG9uMi43L2F1ZGlvZGV2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTU5ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weW8gYi9saWIvcHl0aG9uMi43L2F1ZGlvZGV2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTU5ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9hdWRpb2Rldi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9iYXNlNjQucHkgYi9saWIvcHl0aG9uMi43L2Jhc2U2NC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44NTIwNGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iYXNlNjQucHkKQEAgLTAsMCArMSwzNjAgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiUkZDIDM1NDg6IEJhc2UxNiwgQmFzZTMyLCBCYXNlNjQgRGF0YSBFbmNvZGluZ3MiIiIKKworIyBNb2RpZmllZCAwNC1PY3QtMTk5NSBieSBKYWNrIEphbnNlbiB0byB1c2UgYmluYXNjaWkgbW9kdWxlCisjIE1vZGlmaWVkIDMwLURlYy0yMDAzIGJ5IEJhcnJ5IFdhcnNhdyB0byBhZGQgZnVsbCBSRkMgMzU0OCBzdXBwb3J0CisKK2ltcG9ydCByZQoraW1wb3J0IHN0cnVjdAoraW1wb3J0IGJpbmFzY2lpCisKKworX19hbGxfXyA9IFsKKyAgICAjIExlZ2FjeSBpbnRlcmZhY2UgZXhwb3J0cyB0cmFkaXRpb25hbCBSRkMgMTUyMSBCYXNlNjQgZW5jb2RpbmdzCisgICAgJ2VuY29kZScsICdkZWNvZGUnLCAnZW5jb2Rlc3RyaW5nJywgJ2RlY29kZXN0cmluZycsCisgICAgIyBHZW5lcmFsaXplZCBpbnRlcmZhY2UgZm9yIG90aGVyIGVuY29kaW5ncworICAgICdiNjRlbmNvZGUnLCAnYjY0ZGVjb2RlJywgJ2IzMmVuY29kZScsICdiMzJkZWNvZGUnLAorICAgICdiMTZlbmNvZGUnLCAnYjE2ZGVjb2RlJywKKyAgICAjIFN0YW5kYXJkIEJhc2U2NCBlbmNvZGluZworICAgICdzdGFuZGFyZF9iNjRlbmNvZGUnLCAnc3RhbmRhcmRfYjY0ZGVjb2RlJywKKyAgICAjIFNvbWUgY29tbW9uIEJhc2U2NCBhbHRlcm5hdGl2ZXMuICBBcyByZWZlcmVuY2VkIGJ5IFJGQyAzNDU4LCBzZWUgdGhyZWFkCisgICAgIyBzdGFydGluZyBhdDoKKyAgICAjCisgICAgIyBodHRwOi8vemdwLm9yZy9waXBlcm1haWwvcDJwLWhhY2tlcnMvMjAwMS1TZXB0ZW1iZXIvMDAwMzE2Lmh0bWwKKyAgICAndXJsc2FmZV9iNjRlbmNvZGUnLCAndXJsc2FmZV9iNjRkZWNvZGUnLAorICAgIF0KKworX3RyYW5zbGF0aW9uID0gW2NocihfeCkgZm9yIF94IGluIHJhbmdlKDI1NildCitFTVBUWVNUUklORyA9ICcnCisKKworZGVmIF90cmFuc2xhdGUocywgYWx0Y2hhcnMpOgorICAgIHRyYW5zbGF0aW9uID0gX3RyYW5zbGF0aW9uWzpdCisgICAgZm9yIGssIHYgaW4gYWx0Y2hhcnMuaXRlbXMoKToKKyAgICAgICAgdHJhbnNsYXRpb25bb3JkKGspXSA9IHYKKyAgICByZXR1cm4gcy50cmFuc2xhdGUoJycuam9pbih0cmFuc2xhdGlvbikpCisKKworDAorIyBCYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcgdXNlcyBiaW5hc2NpaQorCitkZWYgYjY0ZW5jb2RlKHMsIGFsdGNoYXJzPU5vbmUpOgorICAgICIiIkVuY29kZSBhIHN0cmluZyB1c2luZyBCYXNlNjQuCisKKyAgICBzIGlzIHRoZSBzdHJpbmcgdG8gZW5jb2RlLiAgT3B0aW9uYWwgYWx0Y2hhcnMgbXVzdCBiZSBhIHN0cmluZyBvZiBhdCBsZWFzdAorICAgIGxlbmd0aCAyIChhZGRpdGlvbmFsIGNoYXJhY3RlcnMgYXJlIGlnbm9yZWQpIHdoaWNoIHNwZWNpZmllcyBhbgorICAgIGFsdGVybmF0aXZlIGFscGhhYmV0IGZvciB0aGUgJysnIGFuZCAnLycgY2hhcmFjdGVycy4gIFRoaXMgYWxsb3dzIGFuCisgICAgYXBwbGljYXRpb24gdG8gZS5nLiBnZW5lcmF0ZSB1cmwgb3IgZmlsZXN5c3RlbSBzYWZlIEJhc2U2NCBzdHJpbmdzLgorCisgICAgVGhlIGVuY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLgorICAgICIiIgorICAgICMgU3RyaXAgb2ZmIHRoZSB0cmFpbGluZyBuZXdsaW5lCisgICAgZW5jb2RlZCA9IGJpbmFzY2lpLmIyYV9iYXNlNjQocylbOi0xXQorICAgIGlmIGFsdGNoYXJzIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gX3RyYW5zbGF0ZShlbmNvZGVkLCB7JysnOiBhbHRjaGFyc1swXSwgJy8nOiBhbHRjaGFyc1sxXX0pCisgICAgcmV0dXJuIGVuY29kZWQKKworCitkZWYgYjY0ZGVjb2RlKHMsIGFsdGNoYXJzPU5vbmUpOgorICAgICIiIkRlY29kZSBhIEJhc2U2NCBlbmNvZGVkIHN0cmluZy4KKworICAgIHMgaXMgdGhlIHN0cmluZyB0byBkZWNvZGUuICBPcHRpb25hbCBhbHRjaGFycyBtdXN0IGJlIGEgc3RyaW5nIG9mIGF0IGxlYXN0CisgICAgbGVuZ3RoIDIgKGFkZGl0aW9uYWwgY2hhcmFjdGVycyBhcmUgaWdub3JlZCkgd2hpY2ggc3BlY2lmaWVzIHRoZQorICAgIGFsdGVybmF0aXZlIGFscGhhYmV0IHVzZWQgaW5zdGVhZCBvZiB0aGUgJysnIGFuZCAnLycgY2hhcmFjdGVycy4KKworICAgIFRoZSBkZWNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4gIEEgVHlwZUVycm9yIGlzIHJhaXNlZCBpZiBzIHdlcmUKKyAgICBpbmNvcnJlY3RseSBwYWRkZWQgb3IgaWYgdGhlcmUgYXJlIG5vbi1hbHBoYWJldCBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gdGhlCisgICAgc3RyaW5nLgorICAgICIiIgorICAgIGlmIGFsdGNoYXJzIGlzIG5vdCBOb25lOgorICAgICAgICBzID0gX3RyYW5zbGF0ZShzLCB7YWx0Y2hhcnNbMF06ICcrJywgYWx0Y2hhcnNbMV06ICcvJ30pCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gYmluYXNjaWkuYTJiX2Jhc2U2NChzKQorICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvciwgbXNnOgorICAgICAgICAjIFRyYW5zZm9ybSB0aGlzIGV4Y2VwdGlvbiBmb3IgY29uc2lzdGVuY3kKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKG1zZykKKworCitkZWYgc3RhbmRhcmRfYjY0ZW5jb2RlKHMpOgorICAgICIiIkVuY29kZSBhIHN0cmluZyB1c2luZyB0aGUgc3RhbmRhcmQgQmFzZTY0IGFscGhhYmV0LgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGVuY29kZS4gIFRoZSBlbmNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICAiIiIKKyAgICByZXR1cm4gYjY0ZW5jb2RlKHMpCisKK2RlZiBzdGFuZGFyZF9iNjRkZWNvZGUocyk6CisgICAgIiIiRGVjb2RlIGEgc3RyaW5nIGVuY29kZWQgd2l0aCB0aGUgc3RhbmRhcmQgQmFzZTY0IGFscGhhYmV0LgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGRlY29kZS4gIFRoZSBkZWNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4gIEEgVHlwZUVycm9yCisgICAgaXMgcmFpc2VkIGlmIHRoZSBzdHJpbmcgaXMgaW5jb3JyZWN0bHkgcGFkZGVkIG9yIGlmIHRoZXJlIGFyZSBub24tYWxwaGFiZXQKKyAgICBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gdGhlIHN0cmluZy4KKyAgICAiIiIKKyAgICByZXR1cm4gYjY0ZGVjb2RlKHMpCisKK2RlZiB1cmxzYWZlX2I2NGVuY29kZShzKToKKyAgICAiIiJFbmNvZGUgYSBzdHJpbmcgdXNpbmcgYSB1cmwtc2FmZSBCYXNlNjQgYWxwaGFiZXQuCisKKyAgICBzIGlzIHRoZSBzdHJpbmcgdG8gZW5jb2RlLiAgVGhlIGVuY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLiAgVGhlIGFscGhhYmV0CisgICAgdXNlcyAnLScgaW5zdGVhZCBvZiAnKycgYW5kICdfJyBpbnN0ZWFkIG9mICcvJy4KKyAgICAiIiIKKyAgICByZXR1cm4gYjY0ZW5jb2RlKHMsICctXycpCisKK2RlZiB1cmxzYWZlX2I2NGRlY29kZShzKToKKyAgICAiIiJEZWNvZGUgYSBzdHJpbmcgZW5jb2RlZCB3aXRoIHRoZSBzdGFuZGFyZCBCYXNlNjQgYWxwaGFiZXQuCisKKyAgICBzIGlzIHRoZSBzdHJpbmcgdG8gZGVjb2RlLiAgVGhlIGRlY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLiAgQSBUeXBlRXJyb3IKKyAgICBpcyByYWlzZWQgaWYgdGhlIHN0cmluZyBpcyBpbmNvcnJlY3RseSBwYWRkZWQgb3IgaWYgdGhlcmUgYXJlIG5vbi1hbHBoYWJldAorICAgIGNoYXJhY3RlcnMgcHJlc2VudCBpbiB0aGUgc3RyaW5nLgorCisgICAgVGhlIGFscGhhYmV0IHVzZXMgJy0nIGluc3RlYWQgb2YgJysnIGFuZCAnXycgaW5zdGVhZCBvZiAnLycuCisgICAgIiIiCisgICAgcmV0dXJuIGI2NGRlY29kZShzLCAnLV8nKQorCisKKwwKKyMgQmFzZTMyIGVuY29kaW5nL2RlY29kaW5nIG11c3QgYmUgZG9uZSBpbiBQeXRob24KK19iMzJhbHBoYWJldCA9IHsKKyAgICAwOiAnQScsICA5OiAnSicsIDE4OiAnUycsIDI3OiAnMycsCisgICAgMTogJ0InLCAxMDogJ0snLCAxOTogJ1QnLCAyODogJzQnLAorICAgIDI6ICdDJywgMTE6ICdMJywgMjA6ICdVJywgMjk6ICc1JywKKyAgICAzOiAnRCcsIDEyOiAnTScsIDIxOiAnVicsIDMwOiAnNicsCisgICAgNDogJ0UnLCAxMzogJ04nLCAyMjogJ1cnLCAzMTogJzcnLAorICAgIDU6ICdGJywgMTQ6ICdPJywgMjM6ICdYJywKKyAgICA2OiAnRycsIDE1OiAnUCcsIDI0OiAnWScsCisgICAgNzogJ0gnLCAxNjogJ1EnLCAyNTogJ1onLAorICAgIDg6ICdJJywgMTc6ICdSJywgMjY6ICcyJywKKyAgICB9CisKK19iMzJ0YWIgPSBfYjMyYWxwaGFiZXQuaXRlbXMoKQorX2IzMnRhYi5zb3J0KCkKK19iMzJ0YWIgPSBbdiBmb3IgaywgdiBpbiBfYjMydGFiXQorX2IzMnJldiA9IGRpY3QoWyh2LCBsb25nKGspKSBmb3IgaywgdiBpbiBfYjMyYWxwaGFiZXQuaXRlbXMoKV0pCisKKworZGVmIGIzMmVuY29kZShzKToKKyAgICAiIiJFbmNvZGUgYSBzdHJpbmcgdXNpbmcgQmFzZTMyLgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGVuY29kZS4gIFRoZSBlbmNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICAiIiIKKyAgICBwYXJ0cyA9IFtdCisgICAgcXVhbnRhLCBsZWZ0b3ZlciA9IGRpdm1vZChsZW4ocyksIDUpCisgICAgIyBQYWQgdGhlIGxhc3QgcXVhbnR1bSB3aXRoIHplcm8gYml0cyBpZiBuZWNlc3NhcnkKKyAgICBpZiBsZWZ0b3ZlcjoKKyAgICAgICAgcyArPSAoJ1wwJyAqICg1IC0gbGVmdG92ZXIpKQorICAgICAgICBxdWFudGEgKz0gMQorICAgIGZvciBpIGluIHJhbmdlKHF1YW50YSk6CisgICAgICAgICMgYzEgYW5kIGMyIGFyZSAxNiBiaXRzIHdpZGUsIGMzIGlzIDggYml0cyB3aWRlLiAgVGhlIGludGVudCBvZiB0aGlzCisgICAgICAgICMgY29kZSBpcyB0byBwcm9jZXNzIHRoZSA0MCBiaXRzIGluIHVuaXRzIG9mIDUgYml0cy4gIFNvIHdlIHRha2UgdGhlIDEKKyAgICAgICAgIyBsZWZ0b3ZlciBiaXQgb2YgYzEgYW5kIHRhY2sgaXQgb250byBjMi4gIFRoZW4gd2UgdGFrZSB0aGUgMiBsZWZ0b3ZlcgorICAgICAgICAjIGJpdHMgb2YgYzIgYW5kIHRhY2sgdGhlbSBvbnRvIGMzLiAgVGhlIHNoaWZ0cyBhbmQgbWFza3MgYXJlIGludGVuZGVkCisgICAgICAgICMgdG8gZ2l2ZSB1cyB2YWx1ZXMgb2YgZXhhY3RseSA1IGJpdHMgaW4gd2lkdGguCisgICAgICAgIGMxLCBjMiwgYzMgPSBzdHJ1Y3QudW5wYWNrKCchSEhCJywgc1tpKjU6KGkrMSkqNV0pCisgICAgICAgIGMyICs9IChjMSAmIDEpIDw8IDE2ICMgMTcgYml0cyB3aWRlCisgICAgICAgIGMzICs9IChjMiAmIDMpIDw8IDggICMgMTAgYml0cyB3aWRlCisgICAgICAgIHBhcnRzLmV4dGVuZChbX2IzMnRhYltjMSA+PiAxMV0sICAgICAgICAgIyBiaXRzIDEgLSA1CisgICAgICAgICAgICAgICAgICAgICAgX2IzMnRhYlsoYzEgPj4gNikgJiAweDFmXSwgIyBiaXRzIDYgLSAxMAorICAgICAgICAgICAgICAgICAgICAgIF9iMzJ0YWJbKGMxID4+IDEpICYgMHgxZl0sICMgYml0cyAxMSAtIDE1CisgICAgICAgICAgICAgICAgICAgICAgX2IzMnRhYltjMiA+PiAxMl0sICAgICAgICAgIyBiaXRzIDE2IC0gMjAgKDEgLSA1KQorICAgICAgICAgICAgICAgICAgICAgIF9iMzJ0YWJbKGMyID4+IDcpICYgMHgxZl0sICMgYml0cyAyMSAtIDI1ICg2IC0gMTApCisgICAgICAgICAgICAgICAgICAgICAgX2IzMnRhYlsoYzIgPj4gMikgJiAweDFmXSwgIyBiaXRzIDI2IC0gMzAgKDExIC0gMTUpCisgICAgICAgICAgICAgICAgICAgICAgX2IzMnRhYltjMyA+PiA1XSwgICAgICAgICAgIyBiaXRzIDMxIC0gMzUgKDEgLSA1KQorICAgICAgICAgICAgICAgICAgICAgIF9iMzJ0YWJbYzMgJiAweDFmXSwgICAgICAgICMgYml0cyAzNiAtIDQwICgxIC0gNSkKKyAgICAgICAgICAgICAgICAgICAgICBdKQorICAgIGVuY29kZWQgPSBFTVBUWVNUUklORy5qb2luKHBhcnRzKQorICAgICMgQWRqdXN0IGZvciBhbnkgbGVmdG92ZXIgcGFydGlhbCBxdWFudGEKKyAgICBpZiBsZWZ0b3ZlciA9PSAxOgorICAgICAgICByZXR1cm4gZW5jb2RlZFs6LTZdICsgJz09PT09PScKKyAgICBlbGlmIGxlZnRvdmVyID09IDI6CisgICAgICAgIHJldHVybiBlbmNvZGVkWzotNF0gKyAnPT09PScKKyAgICBlbGlmIGxlZnRvdmVyID09IDM6CisgICAgICAgIHJldHVybiBlbmNvZGVkWzotM10gKyAnPT09JworICAgIGVsaWYgbGVmdG92ZXIgPT0gNDoKKyAgICAgICAgcmV0dXJuIGVuY29kZWRbOi0xXSArICc9JworICAgIHJldHVybiBlbmNvZGVkCisKKworZGVmIGIzMmRlY29kZShzLCBjYXNlZm9sZD1GYWxzZSwgbWFwMDE9Tm9uZSk6CisgICAgIiIiRGVjb2RlIGEgQmFzZTMyIGVuY29kZWQgc3RyaW5nLgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGRlY29kZS4gIE9wdGlvbmFsIGNhc2Vmb2xkIGlzIGEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIKKyAgICBhIGxvd2VyY2FzZSBhbHBoYWJldCBpcyBhY2NlcHRhYmxlIGFzIGlucHV0LiAgRm9yIHNlY3VyaXR5IHB1cnBvc2VzLCB0aGUKKyAgICBkZWZhdWx0IGlzIEZhbHNlLgorCisgICAgUkZDIDM1NDggYWxsb3dzIGZvciBvcHRpb25hbCBtYXBwaW5nIG9mIHRoZSBkaWdpdCAwICh6ZXJvKSB0byB0aGUgbGV0dGVyIE8KKyAgICAob2gpLCBhbmQgZm9yIG9wdGlvbmFsIG1hcHBpbmcgb2YgdGhlIGRpZ2l0IDEgKG9uZSkgdG8gZWl0aGVyIHRoZSBsZXR0ZXIgSQorICAgIChleWUpIG9yIGxldHRlciBMIChlbCkuICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgbWFwMDEgd2hlbiBub3QgTm9uZSwKKyAgICBzcGVjaWZpZXMgd2hpY2ggbGV0dGVyIHRoZSBkaWdpdCAxIHNob3VsZCBiZSBtYXBwZWQgdG8gKHdoZW4gbWFwMDEgaXMgbm90CisgICAgTm9uZSwgdGhlIGRpZ2l0IDAgaXMgYWx3YXlzIG1hcHBlZCB0byB0aGUgbGV0dGVyIE8pLiAgRm9yIHNlY3VyaXR5CisgICAgcHVycG9zZXMgdGhlIGRlZmF1bHQgaXMgTm9uZSwgc28gdGhhdCAwIGFuZCAxIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUKKyAgICBpbnB1dC4KKworICAgIFRoZSBkZWNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4gIEEgVHlwZUVycm9yIGlzIHJhaXNlZCBpZiBzIHdlcmUKKyAgICBpbmNvcnJlY3RseSBwYWRkZWQgb3IgaWYgdGhlcmUgYXJlIG5vbi1hbHBoYWJldCBjaGFyYWN0ZXJzIHByZXNlbnQgaW4gdGhlCisgICAgc3RyaW5nLgorICAgICIiIgorICAgIHF1YW50YSwgbGVmdG92ZXIgPSBkaXZtb2QobGVuKHMpLCA4KQorICAgIGlmIGxlZnRvdmVyOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0luY29ycmVjdCBwYWRkaW5nJykKKyAgICAjIEhhbmRsZSBzZWN0aW9uIDIuNCB6ZXJvIGFuZCBvbmUgbWFwcGluZy4gIFRoZSBmbGFnIG1hcDAxIHdpbGwgYmUgZWl0aGVyCisgICAgIyBGYWxzZSwgb3IgdGhlIGNoYXJhY3RlciB0byBtYXAgdGhlIGRpZ2l0IDEgKG9uZSkgdG8uICBJdCBzaG91bGQgYmUKKyAgICAjIGVpdGhlciBMIChlbCkgb3IgSSAoZXllKS4KKyAgICBpZiBtYXAwMToKKyAgICAgICAgcyA9IF90cmFuc2xhdGUocywgeycwJzogJ08nLCAnMSc6IG1hcDAxfSkKKyAgICBpZiBjYXNlZm9sZDoKKyAgICAgICAgcyA9IHMudXBwZXIoKQorICAgICMgU3RyaXAgb2ZmIHBhZCBjaGFyYWN0ZXJzIGZyb20gdGhlIHJpZ2h0LiAgV2UgbmVlZCB0byBjb3VudCB0aGUgcGFkCisgICAgIyBjaGFyYWN0ZXJzIGJlY2F1c2UgdGhpcyB3aWxsIHRlbGwgdXMgaG93IG1hbnkgbnVsbCBieXRlcyB0byByZW1vdmUgZnJvbQorICAgICMgdGhlIGVuZCBvZiB0aGUgZGVjb2RlZCBzdHJpbmcuCisgICAgcGFkY2hhcnMgPSAwCisgICAgbW8gPSByZS5zZWFyY2goJyg/UDxwYWQ+Wz1dKikkJywgcykKKyAgICBpZiBtbzoKKyAgICAgICAgcGFkY2hhcnMgPSBsZW4obW8uZ3JvdXAoJ3BhZCcpKQorICAgICAgICBpZiBwYWRjaGFycyA+IDA6CisgICAgICAgICAgICBzID0gc1s6LXBhZGNoYXJzXQorICAgICMgTm93IGRlY29kZSB0aGUgZnVsbCBxdWFudGEKKyAgICBwYXJ0cyA9IFtdCisgICAgYWNjID0gMAorICAgIHNoaWZ0ID0gMzUKKyAgICBmb3IgYyBpbiBzOgorICAgICAgICB2YWwgPSBfYjMycmV2LmdldChjKQorICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignTm9uLWJhc2UzMiBkaWdpdCBmb3VuZCcpCisgICAgICAgIGFjYyArPSBfYjMycmV2W2NdIDw8IHNoaWZ0CisgICAgICAgIHNoaWZ0IC09IDUKKyAgICAgICAgaWYgc2hpZnQgPCAwOgorICAgICAgICAgICAgcGFydHMuYXBwZW5kKGJpbmFzY2lpLnVuaGV4bGlmeSgnJTAxMHgnICUgYWNjKSkKKyAgICAgICAgICAgIGFjYyA9IDAKKyAgICAgICAgICAgIHNoaWZ0ID0gMzUKKyAgICAjIFByb2Nlc3MgdGhlIGxhc3QsIHBhcnRpYWwgcXVhbnRhCisgICAgbGFzdCA9IGJpbmFzY2lpLnVuaGV4bGlmeSgnJTAxMHgnICUgYWNjKQorICAgIGlmIHBhZGNoYXJzID09IDA6CisgICAgICAgIGxhc3QgPSAnJyAgICAgICAgICAgICAgICAgICAgICAgIyBObyBjaGFyYWN0ZXJzCisgICAgZWxpZiBwYWRjaGFycyA9PSAxOgorICAgICAgICBsYXN0ID0gbGFzdFs6LTFdCisgICAgZWxpZiBwYWRjaGFycyA9PSAzOgorICAgICAgICBsYXN0ID0gbGFzdFs6LTJdCisgICAgZWxpZiBwYWRjaGFycyA9PSA0OgorICAgICAgICBsYXN0ID0gbGFzdFs6LTNdCisgICAgZWxpZiBwYWRjaGFycyA9PSA2OgorICAgICAgICBsYXN0ID0gbGFzdFs6LTRdCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdJbmNvcnJlY3QgcGFkZGluZycpCisgICAgcGFydHMuYXBwZW5kKGxhc3QpCisgICAgcmV0dXJuIEVNUFRZU1RSSU5HLmpvaW4ocGFydHMpCisKKworDAorIyBSRkMgMzU0OCwgQmFzZSAxNiBBbHBoYWJldCBzcGVjaWZpZXMgdXBwZXJjYXNlLCBidXQgaGV4bGlmeSgpIHJldHVybnMKKyMgbG93ZXJjYXNlLiAgVGhlIFJGQyBhbHNvIHJlY29tbWVuZHMgYWdhaW5zdCBhY2NlcHRpbmcgaW5wdXQgY2FzZQorIyBpbnNlbnNpdGl2ZWx5LgorZGVmIGIxNmVuY29kZShzKToKKyAgICAiIiJFbmNvZGUgYSBzdHJpbmcgdXNpbmcgQmFzZTE2LgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGVuY29kZS4gIFRoZSBlbmNvZGVkIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICAiIiIKKyAgICByZXR1cm4gYmluYXNjaWkuaGV4bGlmeShzKS51cHBlcigpCisKKworZGVmIGIxNmRlY29kZShzLCBjYXNlZm9sZD1GYWxzZSk6CisgICAgIiIiRGVjb2RlIGEgQmFzZTE2IGVuY29kZWQgc3RyaW5nLgorCisgICAgcyBpcyB0aGUgc3RyaW5nIHRvIGRlY29kZS4gIE9wdGlvbmFsIGNhc2Vmb2xkIGlzIGEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIKKyAgICBhIGxvd2VyY2FzZSBhbHBoYWJldCBpcyBhY2NlcHRhYmxlIGFzIGlucHV0LiAgRm9yIHNlY3VyaXR5IHB1cnBvc2VzLCB0aGUKKyAgICBkZWZhdWx0IGlzIEZhbHNlLgorCisgICAgVGhlIGRlY29kZWQgc3RyaW5nIGlzIHJldHVybmVkLiAgQSBUeXBlRXJyb3IgaXMgcmFpc2VkIGlmIHMgd2VyZQorICAgIGluY29ycmVjdGx5IHBhZGRlZCBvciBpZiB0aGVyZSBhcmUgbm9uLWFscGhhYmV0IGNoYXJhY3RlcnMgcHJlc2VudCBpbiB0aGUKKyAgICBzdHJpbmcuCisgICAgIiIiCisgICAgaWYgY2FzZWZvbGQ6CisgICAgICAgIHMgPSBzLnVwcGVyKCkKKyAgICBpZiByZS5zZWFyY2goJ1teMC05QS1GXScsIHMpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ05vbi1iYXNlMTYgZGlnaXQgZm91bmQnKQorICAgIHJldHVybiBiaW5hc2NpaS51bmhleGxpZnkocykKKworCisMCisjIExlZ2FjeSBpbnRlcmZhY2UuICBUaGlzIGNvZGUgY291bGQgYmUgY2xlYW5lZCB1cCBzaW5jZSBJIGRvbid0IGJlbGlldmUKKyMgYmluYXNjaWkgaGFzIGFueSBsaW5lIGxlbmd0aCBsaW1pdGF0aW9ucy4gIEl0IGp1c3QgZG9lc24ndCBzZWVtIHdvcnRoIGl0CisjIHRob3VnaC4KKworTUFYTElORVNJWkUgPSA3NiAjIEV4Y2x1ZGluZyB0aGUgQ1JMRgorTUFYQklOU0laRSA9IChNQVhMSU5FU0laRS8vNCkqMworCitkZWYgZW5jb2RlKGlucHV0LCBvdXRwdXQpOgorICAgICIiIkVuY29kZSBhIGZpbGUuIiIiCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcyA9IGlucHV0LnJlYWQoTUFYQklOU0laRSkKKyAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICBicmVhaworICAgICAgICB3aGlsZSBsZW4ocykgPCBNQVhCSU5TSVpFOgorICAgICAgICAgICAgbnMgPSBpbnB1dC5yZWFkKE1BWEJJTlNJWkUtbGVuKHMpKQorICAgICAgICAgICAgaWYgbm90IG5zOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzICs9IG5zCisgICAgICAgIGxpbmUgPSBiaW5hc2NpaS5iMmFfYmFzZTY0KHMpCisgICAgICAgIG91dHB1dC53cml0ZShsaW5lKQorCisKK2RlZiBkZWNvZGUoaW5wdXQsIG91dHB1dCk6CisgICAgIiIiRGVjb2RlIGEgZmlsZS4iIiIKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBsaW5lID0gaW5wdXQucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHMgPSBiaW5hc2NpaS5hMmJfYmFzZTY0KGxpbmUpCisgICAgICAgIG91dHB1dC53cml0ZShzKQorCisKK2RlZiBlbmNvZGVzdHJpbmcocyk6CisgICAgIiIiRW5jb2RlIGEgc3RyaW5nIGludG8gbXVsdGlwbGUgbGluZXMgb2YgYmFzZS02NCBkYXRhLiIiIgorICAgIHBpZWNlcyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHMpLCBNQVhCSU5TSVpFKToKKyAgICAgICAgY2h1bmsgPSBzW2kgOiBpICsgTUFYQklOU0laRV0KKyAgICAgICAgcGllY2VzLmFwcGVuZChiaW5hc2NpaS5iMmFfYmFzZTY0KGNodW5rKSkKKyAgICByZXR1cm4gIiIuam9pbihwaWVjZXMpCisKKworZGVmIGRlY29kZXN0cmluZyhzKToKKyAgICAiIiJEZWNvZGUgYSBzdHJpbmcuIiIiCisgICAgcmV0dXJuIGJpbmFzY2lpLmEyYl9iYXNlNjQocykKKworCisMCisjIFVzZWFibGUgYXMgYSBzY3JpcHQuLi4KK2RlZiB0ZXN0KCk6CisgICAgIiIiU21hbGwgdGVzdCBwcm9ncmFtIiIiCisgICAgaW1wb3J0IHN5cywgZ2V0b3B0CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdkZXV0JykKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuc3RkZXJyCisgICAgICAgIHByaW50IG1zZworICAgICAgICBwcmludCAiIiJ1c2FnZTogJXMgWy1kfC1lfC11fC10XSBbZmlsZXwtXQorICAgICAgICAtZCwgLXU6IGRlY29kZQorICAgICAgICAtZTogZW5jb2RlIChkZWZhdWx0KQorICAgICAgICAtdDogZW5jb2RlIGFuZCBkZWNvZGUgc3RyaW5nICdBbGFkZGluOm9wZW4gc2VzYW1lJyIiIiVzeXMuYXJndlswXQorICAgICAgICBzeXMuZXhpdCgyKQorICAgIGZ1bmMgPSBlbmNvZGUKKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvID09ICctZSc6IGZ1bmMgPSBlbmNvZGUKKyAgICAgICAgaWYgbyA9PSAnLWQnOiBmdW5jID0gZGVjb2RlCisgICAgICAgIGlmIG8gPT0gJy11JzogZnVuYyA9IGRlY29kZQorICAgICAgICBpZiBvID09ICctdCc6IHRlc3QxKCk7IHJldHVybgorICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF0gIT0gJy0nOgorICAgICAgICB3aXRoIG9wZW4oYXJnc1swXSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIGZ1bmMoZiwgc3lzLnN0ZG91dCkKKyAgICBlbHNlOgorICAgICAgICBmdW5jKHN5cy5zdGRpbiwgc3lzLnN0ZG91dCkKKworCitkZWYgdGVzdDEoKToKKyAgICBzMCA9ICJBbGFkZGluOm9wZW4gc2VzYW1lIgorICAgIHMxID0gZW5jb2Rlc3RyaW5nKHMwKQorICAgIHMyID0gZGVjb2Rlc3RyaW5nKHMxKQorICAgIHByaW50IHMwLCByZXByKHMxKSwgczIKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9iYXNlNjQucHljIGIvbGliL3B5dGhvbjIuNy9iYXNlNjQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTk0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Jhc2U2NC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9iYXNlNjQucHlvIGIvbGliL3B5dGhvbjIuNy9iYXNlNjQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTk0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Jhc2U2NC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9iZGIucHkgYi9saWIvcHl0aG9uMi43L2JkYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ0MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iZGIucHkKQEAgLTAsMCArMSw2NDUgQEAKKyIiIkRlYnVnZ2VyIGJhc2ljcyIiIgorCitpbXBvcnQgZm5tYXRjaAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdHlwZXMKKworX19hbGxfXyA9IFsiQmRiUXVpdCIsIkJkYiIsIkJyZWFrcG9pbnQiXQorCitjbGFzcyBCZGJRdWl0KEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHRvIGdpdmUgdXAgY29tcGxldGVseSIiIgorCisKK2NsYXNzIEJkYjoKKworICAgICIiIkdlbmVyaWMgUHl0aG9uIGRlYnVnZ2VyIGJhc2UgY2xhc3MuCisKKyAgICBUaGlzIGNsYXNzIHRha2VzIGNhcmUgb2YgZGV0YWlscyBvZiB0aGUgdHJhY2UgZmFjaWxpdHk7CisgICAgYSBkZXJpdmVkIGNsYXNzIHNob3VsZCBpbXBsZW1lbnQgdXNlciBpbnRlcmFjdGlvbi4KKyAgICBUaGUgc3RhbmRhcmQgZGVidWdnZXIgY2xhc3MgKHBkYi5QZGIpIGlzIGFuIGV4YW1wbGUuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2tpcD1Ob25lKToKKyAgICAgICAgc2VsZi5za2lwID0gc2V0KHNraXApIGlmIHNraXAgZWxzZSBOb25lCisgICAgICAgIHNlbGYuYnJlYWtzID0ge30KKyAgICAgICAgc2VsZi5mbmNhY2hlID0ge30KKyAgICAgICAgc2VsZi5mcmFtZV9yZXR1cm5pbmcgPSBOb25lCisKKyAgICBkZWYgY2Fub25pYyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIGZpbGVuYW1lID09ICI8IiArIGZpbGVuYW1lWzE6LTFdICsgIj4iOgorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisgICAgICAgIGNhbm9uaWMgPSBzZWxmLmZuY2FjaGUuZ2V0KGZpbGVuYW1lKQorICAgICAgICBpZiBub3QgY2Fub25pYzoKKyAgICAgICAgICAgIGNhbm9uaWMgPSBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpCisgICAgICAgICAgICBjYW5vbmljID0gb3MucGF0aC5ub3JtY2FzZShjYW5vbmljKQorICAgICAgICAgICAgc2VsZi5mbmNhY2hlW2ZpbGVuYW1lXSA9IGNhbm9uaWMKKyAgICAgICAgcmV0dXJuIGNhbm9uaWMKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgaW1wb3J0IGxpbmVjYWNoZQorICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZSgpCisgICAgICAgIHNlbGYuYm90ZnJhbWUgPSBOb25lCisgICAgICAgIHNlbGYuX3NldF9zdG9waW5mbyhOb25lLCBOb25lKQorCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgaWYgc2VsZi5xdWl0dGluZzoKKyAgICAgICAgICAgIHJldHVybiAjIE5vbmUKKyAgICAgICAgaWYgZXZlbnQgPT0gJ2xpbmUnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGF0Y2hfbGluZShmcmFtZSkKKyAgICAgICAgaWYgZXZlbnQgPT0gJ2NhbGwnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGF0Y2hfY2FsbChmcmFtZSwgYXJnKQorICAgICAgICBpZiBldmVudCA9PSAncmV0dXJuJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BhdGNoX3JldHVybihmcmFtZSwgYXJnKQorICAgICAgICBpZiBldmVudCA9PSAnZXhjZXB0aW9uJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRpc3BhdGNoX2V4Y2VwdGlvbihmcmFtZSwgYXJnKQorICAgICAgICBpZiBldmVudCA9PSAnY19jYWxsJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisgICAgICAgIGlmIGV2ZW50ID09ICdjX2V4Y2VwdGlvbic6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICBpZiBldmVudCA9PSAnY19yZXR1cm4nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgcHJpbnQgJ2JkYi5CZGIuZGlzcGF0Y2g6IHVua25vd24gZGVidWdnaW5nIGV2ZW50OicsIHJlcHIoZXZlbnQpCisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisKKyAgICBkZWYgZGlzcGF0Y2hfbGluZShzZWxmLCBmcmFtZSk6CisgICAgICAgIGlmIHNlbGYuc3RvcF9oZXJlKGZyYW1lKSBvciBzZWxmLmJyZWFrX2hlcmUoZnJhbWUpOgorICAgICAgICAgICAgc2VsZi51c2VyX2xpbmUoZnJhbWUpCisgICAgICAgICAgICBpZiBzZWxmLnF1aXR0aW5nOiByYWlzZSBCZGJRdWl0CisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisKKyAgICBkZWYgZGlzcGF0Y2hfY2FsbChzZWxmLCBmcmFtZSwgYXJnKToKKyAgICAgICAgIyBYWFggJ2FyZycgaXMgbm8gbG9uZ2VyIHVzZWQKKyAgICAgICAgaWYgc2VsZi5ib3RmcmFtZSBpcyBOb25lOgorICAgICAgICAgICAgIyBGaXJzdCBjYWxsIG9mIGRpc3BhdGNoIHNpbmNlIHJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYm90ZnJhbWUgPSBmcmFtZS5mX2JhY2sgIyAoQ1QpIE5vdGUgdGhhdCB0aGlzIG1heSBhbHNvIGJlIE5vbmUhCisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICBpZiBub3QgKHNlbGYuc3RvcF9oZXJlKGZyYW1lKSBvciBzZWxmLmJyZWFrX2FueXdoZXJlKGZyYW1lKSk6CisgICAgICAgICAgICAjIE5vIG5lZWQgdG8gdHJhY2UgdGhpcyBmdW5jdGlvbgorICAgICAgICAgICAgcmV0dXJuICMgTm9uZQorICAgICAgICBzZWxmLnVzZXJfY2FsbChmcmFtZSwgYXJnKQorICAgICAgICBpZiBzZWxmLnF1aXR0aW5nOiByYWlzZSBCZGJRdWl0CisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisKKyAgICBkZWYgZGlzcGF0Y2hfcmV0dXJuKHNlbGYsIGZyYW1lLCBhcmcpOgorICAgICAgICBpZiBzZWxmLnN0b3BfaGVyZShmcmFtZSkgb3IgZnJhbWUgPT0gc2VsZi5yZXR1cm5mcmFtZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmZyYW1lX3JldHVybmluZyA9IGZyYW1lCisgICAgICAgICAgICAgICAgc2VsZi51c2VyX3JldHVybihmcmFtZSwgYXJnKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLmZyYW1lX3JldHVybmluZyA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYucXVpdHRpbmc6IHJhaXNlIEJkYlF1aXQKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKworICAgIGRlZiBkaXNwYXRjaF9leGNlcHRpb24oc2VsZiwgZnJhbWUsIGFyZyk6CisgICAgICAgIGlmIHNlbGYuc3RvcF9oZXJlKGZyYW1lKToKKyAgICAgICAgICAgIHNlbGYudXNlcl9leGNlcHRpb24oZnJhbWUsIGFyZykKKyAgICAgICAgICAgIGlmIHNlbGYucXVpdHRpbmc6IHJhaXNlIEJkYlF1aXQKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKworICAgICMgTm9ybWFsbHkgZGVyaXZlZCBjbGFzc2VzIGRvbid0IG92ZXJyaWRlIHRoZSBmb2xsb3dpbmcKKyAgICAjIG1ldGhvZHMsIGJ1dCB0aGV5IG1heSBpZiB0aGV5IHdhbnQgdG8gcmVkZWZpbmUgdGhlCisgICAgIyBkZWZpbml0aW9uIG9mIHN0b3BwaW5nIGFuZCBicmVha3BvaW50cy4KKworICAgIGRlZiBpc19za2lwcGVkX21vZHVsZShzZWxmLCBtb2R1bGVfbmFtZSk6CisgICAgICAgIGZvciBwYXR0ZXJuIGluIHNlbGYuc2tpcDoKKyAgICAgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaChtb2R1bGVfbmFtZSwgcGF0dGVybik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgc3RvcF9oZXJlKHNlbGYsIGZyYW1lKToKKyAgICAgICAgIyAoQ1QpIHN0b3BmcmFtZSBtYXkgbm93IGFsc28gYmUgTm9uZSwgc2VlIGRpc3BhdGNoX2NhbGwuCisgICAgICAgICMgKENUKSB0aGUgZm9ybWVyIHRlc3QgZm9yIE5vbmUgaXMgdGhlcmVmb3JlIHJlbW92ZWQgZnJvbSBoZXJlLgorICAgICAgICBpZiBzZWxmLnNraXAgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuaXNfc2tpcHBlZF9tb2R1bGUoZnJhbWUuZl9nbG9iYWxzLmdldCgnX19uYW1lX18nKSk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgZnJhbWUgaXMgc2VsZi5zdG9wZnJhbWU6CisgICAgICAgICAgICBpZiBzZWxmLnN0b3BsaW5lbm8gPT0gLTE6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gZnJhbWUuZl9saW5lbm8gPj0gc2VsZi5zdG9wbGluZW5vCisgICAgICAgIHdoaWxlIGZyYW1lIGlzIG5vdCBOb25lIGFuZCBmcmFtZSBpcyBub3Qgc2VsZi5zdG9wZnJhbWU6CisgICAgICAgICAgICBpZiBmcmFtZSBpcyBzZWxmLmJvdGZyYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBmcmFtZSA9IGZyYW1lLmZfYmFjaworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBicmVha19oZXJlKHNlbGYsIGZyYW1lKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNhbm9uaWMoZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lKQorICAgICAgICBpZiBub3QgZmlsZW5hbWUgaW4gc2VsZi5icmVha3M6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgbGluZW5vID0gZnJhbWUuZl9saW5lbm8KKyAgICAgICAgaWYgbm90IGxpbmVubyBpbiBzZWxmLmJyZWFrc1tmaWxlbmFtZV06CisgICAgICAgICAgICAjIFRoZSBsaW5lIGl0c2VsZiBoYXMgbm8gYnJlYWtwb2ludCwgYnV0IG1heWJlIHRoZSBsaW5lIGlzIHRoZQorICAgICAgICAgICAgIyBmaXJzdCBsaW5lIG9mIGEgZnVuY3Rpb24gd2l0aCBicmVha3BvaW50IHNldCBieSBmdW5jdGlvbiBuYW1lLgorICAgICAgICAgICAgbGluZW5vID0gZnJhbWUuZl9jb2RlLmNvX2ZpcnN0bGluZW5vCisgICAgICAgICAgICBpZiBub3QgbGluZW5vIGluIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIGZsYWcgc2F5cyBvayB0byBkZWxldGUgdGVtcC4gYnAKKyAgICAgICAgKGJwLCBmbGFnKSA9IGVmZmVjdGl2ZShmaWxlbmFtZSwgbGluZW5vLCBmcmFtZSkKKyAgICAgICAgaWYgYnA6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRicCA9IGJwLm51bWJlcgorICAgICAgICAgICAgaWYgKGZsYWcgYW5kIGJwLnRlbXBvcmFyeSk6CisgICAgICAgICAgICAgICAgc2VsZi5kb19jbGVhcihzdHIoYnAubnVtYmVyKSkKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBkb19jbGVhcihzZWxmLCBhcmcpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3Mgb2YgYmRiIG11c3QgaW1wbGVtZW50IGRvX2NsZWFyKCkiCisKKyAgICBkZWYgYnJlYWtfYW55d2hlcmUoc2VsZiwgZnJhbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5jYW5vbmljKGZyYW1lLmZfY29kZS5jb19maWxlbmFtZSkgaW4gc2VsZi5icmVha3MKKworICAgICMgRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGUgdXNlcl8qIG1ldGhvZHMKKyAgICAjIHRvIGdhaW4gY29udHJvbC4KKworICAgIGRlZiB1c2VyX2NhbGwoc2VsZiwgZnJhbWUsIGFyZ3VtZW50X2xpc3QpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGVyZSBpcyB0aGUgcmVtb3RlIHBvc3NpYmlsaXR5CisgICAgICAgIHRoYXQgd2UgZXZlciBuZWVkIHRvIHN0b3AgaW4gdGhpcyBmdW5jdGlvbi4iIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHVzZXJfbGluZShzZWxmLCBmcmFtZSk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHdlIHN0b3Agb3IgYnJlYWsgYXQgdGhpcyBsaW5lLiIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdXNlcl9yZXR1cm4oc2VsZiwgZnJhbWUsIHJldHVybl92YWx1ZSk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgcmV0dXJuIHRyYXAgaXMgc2V0IGhlcmUuIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiB1c2VyX2V4Y2VwdGlvbihzZWxmLCBmcmFtZSwgZXhjX2luZm8pOgorICAgICAgICBleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrID0gZXhjX2luZm8KKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsCisgICAgICAgIGJ1dCBvbmx5IGlmIHdlIGFyZSB0byBzdG9wIGF0IG9yIGp1c3QgYmVsb3cgdGhpcyBsZXZlbC4iIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIF9zZXRfc3RvcGluZm8oc2VsZiwgc3RvcGZyYW1lLCByZXR1cm5mcmFtZSwgc3RvcGxpbmVubz0wKToKKyAgICAgICAgc2VsZi5zdG9wZnJhbWUgPSBzdG9wZnJhbWUKKyAgICAgICAgc2VsZi5yZXR1cm5mcmFtZSA9IHJldHVybmZyYW1lCisgICAgICAgIHNlbGYucXVpdHRpbmcgPSAwCisgICAgICAgICMgc3RvcGxpbmVubyA+PSAwIG1lYW5zOiBzdG9wIGF0IGxpbmUgPj0gdGhlIHN0b3BsaW5lbm8KKyAgICAgICAgIyBzdG9wbGluZW5vIC0xIG1lYW5zOiBkb24ndCBzdG9wIGF0IGFsbAorICAgICAgICBzZWxmLnN0b3BsaW5lbm8gPSBzdG9wbGluZW5vCisKKyAgICAjIERlcml2ZWQgY2xhc3NlcyBhbmQgY2xpZW50cyBjYW4gY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZHMKKyAgICAjIHRvIGFmZmVjdCB0aGUgc3RlcHBpbmcgc3RhdGUuCisKKyAgICBkZWYgc2V0X3VudGlsKHNlbGYsIGZyYW1lKTogI3RoZSBuYW1lICJ1bnRpbCIgaXMgYm9ycm93ZWQgZnJvbSBnZGIKKyAgICAgICAgIiIiU3RvcCB3aGVuIHRoZSBsaW5lIHdpdGggdGhlIGxpbmUgbm8gZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IG9uZSBpcworICAgICAgICByZWFjaGVkIG9yIHdoZW4gcmV0dXJuaW5nIGZyb20gY3VycmVudCBmcmFtZSIiIgorICAgICAgICBzZWxmLl9zZXRfc3RvcGluZm8oZnJhbWUsIGZyYW1lLCBmcmFtZS5mX2xpbmVubysxKQorCisgICAgZGVmIHNldF9zdGVwKHNlbGYpOgorICAgICAgICAiIiJTdG9wIGFmdGVyIG9uZSBsaW5lIG9mIGNvZGUuIiIiCisgICAgICAgICMgSXNzdWUgIzEzMTgzOiBwZGIgc2tpcHMgZnJhbWVzIGFmdGVyIGhpdHRpbmcgYSBicmVha3BvaW50IGFuZCBydW5uaW5nCisgICAgICAgICMgc3RlcCBjb21tYW5kcy4KKyAgICAgICAgIyBSZXN0b3JlIHRoZSB0cmFjZSBmdW5jdGlvbiBpbiB0aGUgY2FsbGVyICh0aGF0IG1heSBub3QgaGF2ZSBiZWVuIHNldAorICAgICAgICAjIGZvciBwZXJmb3JtYW5jZSByZWFzb25zKSB3aGVuIHJldHVybmluZyBmcm9tIHRoZSBjdXJyZW50IGZyYW1lLgorICAgICAgICBpZiBzZWxmLmZyYW1lX3JldHVybmluZzoKKyAgICAgICAgICAgIGNhbGxlcl9mcmFtZSA9IHNlbGYuZnJhbWVfcmV0dXJuaW5nLmZfYmFjaworICAgICAgICAgICAgaWYgY2FsbGVyX2ZyYW1lIGFuZCBub3QgY2FsbGVyX2ZyYW1lLmZfdHJhY2U6CisgICAgICAgICAgICAgICAgY2FsbGVyX2ZyYW1lLmZfdHJhY2UgPSBzZWxmLnRyYWNlX2Rpc3BhdGNoCisgICAgICAgIHNlbGYuX3NldF9zdG9waW5mbyhOb25lLCBOb25lKQorCisgICAgZGVmIHNldF9uZXh0KHNlbGYsIGZyYW1lKToKKyAgICAgICAgIiIiU3RvcCBvbiB0aGUgbmV4dCBsaW5lIGluIG9yIGJlbG93IHRoZSBnaXZlbiBmcmFtZS4iIiIKKyAgICAgICAgc2VsZi5fc2V0X3N0b3BpbmZvKGZyYW1lLCBOb25lKQorCisgICAgZGVmIHNldF9yZXR1cm4oc2VsZiwgZnJhbWUpOgorICAgICAgICAiIiJTdG9wIHdoZW4gcmV0dXJuaW5nIGZyb20gdGhlIGdpdmVuIGZyYW1lLiIiIgorICAgICAgICBzZWxmLl9zZXRfc3RvcGluZm8oZnJhbWUuZl9iYWNrLCBmcmFtZSkKKworICAgIGRlZiBzZXRfdHJhY2Uoc2VsZiwgZnJhbWU9Tm9uZSk6CisgICAgICAgICIiIlN0YXJ0IGRlYnVnZ2luZyBmcm9tIGBmcmFtZWAuCisKKyAgICAgICAgSWYgZnJhbWUgaXMgbm90IHNwZWNpZmllZCwgZGVidWdnaW5nIHN0YXJ0cyBmcm9tIGNhbGxlcidzIGZyYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZnJhbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGZyYW1lID0gc3lzLl9nZXRmcmFtZSgpLmZfYmFjaworICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgd2hpbGUgZnJhbWU6CisgICAgICAgICAgICBmcmFtZS5mX3RyYWNlID0gc2VsZi50cmFjZV9kaXNwYXRjaAorICAgICAgICAgICAgc2VsZi5ib3RmcmFtZSA9IGZyYW1lCisgICAgICAgICAgICBmcmFtZSA9IGZyYW1lLmZfYmFjaworICAgICAgICBzZWxmLnNldF9zdGVwKCkKKyAgICAgICAgc3lzLnNldHRyYWNlKHNlbGYudHJhY2VfZGlzcGF0Y2gpCisKKyAgICBkZWYgc2V0X2NvbnRpbnVlKHNlbGYpOgorICAgICAgICAjIERvbid0IHN0b3AgZXhjZXB0IGF0IGJyZWFrcG9pbnRzIG9yIHdoZW4gZmluaXNoZWQKKyAgICAgICAgc2VsZi5fc2V0X3N0b3BpbmZvKHNlbGYuYm90ZnJhbWUsIE5vbmUsIC0xKQorICAgICAgICBpZiBub3Qgc2VsZi5icmVha3M6CisgICAgICAgICAgICAjIG5vIGJyZWFrcG9pbnRzOyBydW4gd2l0aG91dCBkZWJ1Z2dlciBvdmVyaGVhZAorICAgICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgICAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2sKKyAgICAgICAgICAgIHdoaWxlIGZyYW1lIGFuZCBmcmFtZSBpcyBub3Qgc2VsZi5ib3RmcmFtZToKKyAgICAgICAgICAgICAgICBkZWwgZnJhbWUuZl90cmFjZQorICAgICAgICAgICAgICAgIGZyYW1lID0gZnJhbWUuZl9iYWNrCisKKyAgICBkZWYgc2V0X3F1aXQoc2VsZik6CisgICAgICAgIHNlbGYuc3RvcGZyYW1lID0gc2VsZi5ib3RmcmFtZQorICAgICAgICBzZWxmLnJldHVybmZyYW1lID0gTm9uZQorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKworICAgICMgRGVyaXZlZCBjbGFzc2VzIGFuZCBjbGllbnRzIGNhbiBjYWxsIHRoZSBmb2xsb3dpbmcgbWV0aG9kcworICAgICMgdG8gbWFuaXB1bGF0ZSBicmVha3BvaW50cy4gIFRoZXNlIG1ldGhvZHMgcmV0dXJuIGFuCisgICAgIyBlcnJvciBtZXNzYWdlIGlzIHNvbWV0aGluZyB3ZW50IHdyb25nLCBOb25lIGlmIGFsbCBpcyB3ZWxsLgorICAgICMgU2V0X2JyZWFrIHByaW50cyBvdXQgdGhlIGJyZWFrcG9pbnQgbGluZSBhbmQgZmlsZTpsaW5lbm8uCisgICAgIyBDYWxsIHNlbGYuZ2V0XypicmVhayooKSB0byBzZWUgdGhlIGJyZWFrcG9pbnRzIG9yIGJldHRlcgorICAgICMgZm9yIGJwIGluIEJyZWFrcG9pbnQuYnBieW51bWJlcjogaWYgYnA6IGJwLmJwcHJpbnQoKS4KKworICAgIGRlZiBzZXRfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubywgdGVtcG9yYXJ5PTAsIGNvbmQgPSBOb25lLAorICAgICAgICAgICAgICAgICAgZnVuY25hbWU9Tm9uZSk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jYW5vbmljKGZpbGVuYW1lKQorICAgICAgICBpbXBvcnQgbGluZWNhY2hlICMgSW1wb3J0IGFzIGxhdGUgYXMgcG9zc2libGUKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgcmV0dXJuICdMaW5lICVzOiVkIGRvZXMgbm90IGV4aXN0JyAlIChmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vKQorICAgICAgICBpZiBub3QgZmlsZW5hbWUgaW4gc2VsZi5icmVha3M6CisgICAgICAgICAgICBzZWxmLmJyZWFrc1tmaWxlbmFtZV0gPSBbXQorICAgICAgICBsaXN0ID0gc2VsZi5icmVha3NbZmlsZW5hbWVdCisgICAgICAgIGlmIG5vdCBsaW5lbm8gaW4gbGlzdDoKKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKGxpbmVubykKKyAgICAgICAgYnAgPSBCcmVha3BvaW50KGZpbGVuYW1lLCBsaW5lbm8sIHRlbXBvcmFyeSwgY29uZCwgZnVuY25hbWUpCisKKyAgICBkZWYgX3BydW5lX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgaWYgKGZpbGVuYW1lLCBsaW5lbm8pIG5vdCBpbiBCcmVha3BvaW50LmJwbGlzdDoKKyAgICAgICAgICAgIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXS5yZW1vdmUobGluZW5vKQorICAgICAgICBpZiBub3Qgc2VsZi5icmVha3NbZmlsZW5hbWVdOgorICAgICAgICAgICAgZGVsIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXQorCisgICAgZGVmIGNsZWFyX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY2Fub25pYyhmaWxlbmFtZSkKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lIGluIHNlbGYuYnJlYWtzOgorICAgICAgICAgICAgcmV0dXJuICdUaGVyZSBhcmUgbm8gYnJlYWtwb2ludHMgaW4gJXMnICUgZmlsZW5hbWUKKyAgICAgICAgaWYgbGluZW5vIG5vdCBpbiBzZWxmLmJyZWFrc1tmaWxlbmFtZV06CisgICAgICAgICAgICByZXR1cm4gJ1RoZXJlIGlzIG5vIGJyZWFrcG9pbnQgYXQgJXM6JWQnICUgKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vKQorICAgICAgICAjIElmIHRoZXJlJ3Mgb25seSBvbmUgYnAgaW4gdGhlIGxpc3QgZm9yIHRoYXQgZmlsZSxsaW5lCisgICAgICAgICMgcGFpciwgdGhlbiByZW1vdmUgdGhlIGJyZWFrcyBlbnRyeQorICAgICAgICBmb3IgYnAgaW4gQnJlYWtwb2ludC5icGxpc3RbZmlsZW5hbWUsIGxpbmVub11bOl06CisgICAgICAgICAgICBicC5kZWxldGVNZSgpCisgICAgICAgIHNlbGYuX3BydW5lX2JyZWFrcyhmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIGNsZWFyX2JwYnludW1iZXIoc2VsZiwgYXJnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbnVtYmVyID0gaW50KGFyZykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmV0dXJuICdOb24tbnVtZXJpYyBicmVha3BvaW50IG51bWJlciAoJXMpJyAlIGFyZworICAgICAgICB0cnk6CisgICAgICAgICAgICBicCA9IEJyZWFrcG9pbnQuYnBieW51bWJlcltudW1iZXJdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuICdCcmVha3BvaW50IG51bWJlciAoJWQpIG91dCBvZiByYW5nZScgJSBudW1iZXIKKyAgICAgICAgaWYgbm90IGJwOgorICAgICAgICAgICAgcmV0dXJuICdCcmVha3BvaW50ICglZCkgYWxyZWFkeSBkZWxldGVkJyAlIG51bWJlcgorICAgICAgICBicC5kZWxldGVNZSgpCisgICAgICAgIHNlbGYuX3BydW5lX2JyZWFrcyhicC5maWxlLCBicC5saW5lKQorCisgICAgZGVmIGNsZWFyX2FsbF9maWxlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jYW5vbmljKGZpbGVuYW1lKQorICAgICAgICBpZiBub3QgZmlsZW5hbWUgaW4gc2VsZi5icmVha3M6CisgICAgICAgICAgICByZXR1cm4gJ1RoZXJlIGFyZSBubyBicmVha3BvaW50cyBpbiAlcycgJSBmaWxlbmFtZQorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmJyZWFrc1tmaWxlbmFtZV06CisgICAgICAgICAgICBibGlzdCA9IEJyZWFrcG9pbnQuYnBsaXN0W2ZpbGVuYW1lLCBsaW5lXQorICAgICAgICAgICAgZm9yIGJwIGluIGJsaXN0OgorICAgICAgICAgICAgICAgIGJwLmRlbGV0ZU1lKCkKKyAgICAgICAgZGVsIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXQorCisgICAgZGVmIGNsZWFyX2FsbF9icmVha3Moc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmJyZWFrczoKKyAgICAgICAgICAgIHJldHVybiAnVGhlcmUgYXJlIG5vIGJyZWFrcG9pbnRzJworICAgICAgICBmb3IgYnAgaW4gQnJlYWtwb2ludC5icGJ5bnVtYmVyOgorICAgICAgICAgICAgaWYgYnA6CisgICAgICAgICAgICAgICAgYnAuZGVsZXRlTWUoKQorICAgICAgICBzZWxmLmJyZWFrcyA9IHt9CisKKyAgICBkZWYgZ2V0X2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY2Fub25pYyhmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lIGluIHNlbGYuYnJlYWtzIGFuZCBcCisgICAgICAgICAgICBsaW5lbm8gaW4gc2VsZi5icmVha3NbZmlsZW5hbWVdCisKKyAgICBkZWYgZ2V0X2JyZWFrcyhzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNhbm9uaWMoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBmaWxlbmFtZSBpbiBzZWxmLmJyZWFrcyBhbmQgXAorICAgICAgICAgICAgbGluZW5vIGluIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXSBhbmQgXAorICAgICAgICAgICAgQnJlYWtwb2ludC5icGxpc3RbZmlsZW5hbWUsIGxpbmVub10gb3IgW10KKworICAgIGRlZiBnZXRfZmlsZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuY2Fub25pYyhmaWxlbmFtZSkKKyAgICAgICAgaWYgZmlsZW5hbWUgaW4gc2VsZi5icmVha3M6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5icmVha3NbZmlsZW5hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBnZXRfYWxsX2JyZWFrcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYnJlYWtzCisKKyAgICAjIERlcml2ZWQgY2xhc3NlcyBhbmQgY2xpZW50cyBjYW4gY2FsbCB0aGUgZm9sbG93aW5nIG1ldGhvZAorICAgICMgdG8gZ2V0IGEgZGF0YSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgc3RhY2sgdHJhY2UuCisKKyAgICBkZWYgZ2V0X3N0YWNrKHNlbGYsIGYsIHQpOgorICAgICAgICBzdGFjayA9IFtdCisgICAgICAgIGlmIHQgYW5kIHQudGJfZnJhbWUgaXMgZjoKKyAgICAgICAgICAgIHQgPSB0LnRiX25leHQKKyAgICAgICAgd2hpbGUgZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgoZiwgZi5mX2xpbmVubykpCisgICAgICAgICAgICBpZiBmIGlzIHNlbGYuYm90ZnJhbWU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGYgPSBmLmZfYmFjaworICAgICAgICBzdGFjay5yZXZlcnNlKCkKKyAgICAgICAgaSA9IG1heCgwLCBsZW4oc3RhY2spIC0gMSkKKyAgICAgICAgd2hpbGUgdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgodC50Yl9mcmFtZSwgdC50Yl9saW5lbm8pKQorICAgICAgICAgICAgdCA9IHQudGJfbmV4dAorICAgICAgICBpZiBmIGlzIE5vbmU6CisgICAgICAgICAgICBpID0gbWF4KDAsIGxlbihzdGFjaykgLSAxKQorICAgICAgICByZXR1cm4gc3RhY2ssIGkKKworICAgICMKKworICAgIGRlZiBmb3JtYXRfc3RhY2tfZW50cnkoc2VsZiwgZnJhbWVfbGluZW5vLCBscHJlZml4PSc6ICcpOgorICAgICAgICBpbXBvcnQgbGluZWNhY2hlLCByZXByCisgICAgICAgIGZyYW1lLCBsaW5lbm8gPSBmcmFtZV9saW5lbm8KKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmNhbm9uaWMoZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lKQorICAgICAgICBzID0gJyVzKCVyKScgJSAoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgaWYgZnJhbWUuZl9jb2RlLmNvX25hbWU6CisgICAgICAgICAgICBzID0gcyArIGZyYW1lLmZfY29kZS5jb19uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gcyArICI8bGFtYmRhPiIKKyAgICAgICAgaWYgJ19fYXJnc19fJyBpbiBmcmFtZS5mX2xvY2FsczoKKyAgICAgICAgICAgIGFyZ3MgPSBmcmFtZS5mX2xvY2Fsc1snX19hcmdzX18nXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncyA9IE5vbmUKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIHMgPSBzICsgcmVwci5yZXByKGFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gcyArICcoKScKKyAgICAgICAgaWYgJ19fcmV0dXJuX18nIGluIGZyYW1lLmZfbG9jYWxzOgorICAgICAgICAgICAgcnYgPSBmcmFtZS5mX2xvY2Fsc1snX19yZXR1cm5fXyddCisgICAgICAgICAgICBzID0gcyArICctPicKKyAgICAgICAgICAgIHMgPSBzICsgcmVwci5yZXByKHJ2KQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZnJhbWUuZl9nbG9iYWxzKQorICAgICAgICBpZiBsaW5lOiBzID0gcyArIGxwcmVmaXggKyBsaW5lLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuIHMKKworICAgICMgVGhlIGZvbGxvd2luZyB0d28gbWV0aG9kcyBjYW4gYmUgY2FsbGVkIGJ5IGNsaWVudHMgdG8gdXNlCisgICAgIyBhIGRlYnVnZ2VyIHRvIGRlYnVnIGEgc3RhdGVtZW50LCBnaXZlbiBhcyBhIHN0cmluZy4KKworICAgIGRlZiBydW4oc2VsZiwgY21kLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKToKKyAgICAgICAgaWYgZ2xvYmFscyBpcyBOb25lOgorICAgICAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgICAgICBnbG9iYWxzID0gX19tYWluX18uX19kaWN0X18KKyAgICAgICAgaWYgbG9jYWxzIGlzIE5vbmU6CisgICAgICAgICAgICBsb2NhbHMgPSBnbG9iYWxzCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzeXMuc2V0dHJhY2Uoc2VsZi50cmFjZV9kaXNwYXRjaCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY21kLCB0eXBlcy5Db2RlVHlwZSk6CisgICAgICAgICAgICBjbWQgPSBjbWQrJ1xuJworICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjIGNtZCBpbiBnbG9iYWxzLCBsb2NhbHMKKyAgICAgICAgZXhjZXB0IEJkYlF1aXQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnF1aXR0aW5nID0gMQorICAgICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisKKyAgICBkZWYgcnVuZXZhbChzZWxmLCBleHByLCBnbG9iYWxzPU5vbmUsIGxvY2Fscz1Ob25lKToKKyAgICAgICAgaWYgZ2xvYmFscyBpcyBOb25lOgorICAgICAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgICAgICBnbG9iYWxzID0gX19tYWluX18uX19kaWN0X18KKyAgICAgICAgaWYgbG9jYWxzIGlzIE5vbmU6CisgICAgICAgICAgICBsb2NhbHMgPSBnbG9iYWxzCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzeXMuc2V0dHJhY2Uoc2VsZi50cmFjZV9kaXNwYXRjaCkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhwciwgdHlwZXMuQ29kZVR5cGUpOgorICAgICAgICAgICAgZXhwciA9IGV4cHIrJ1xuJworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZXZhbChleHByLCBnbG9iYWxzLCBsb2NhbHMpCisgICAgICAgIGV4Y2VwdCBCZGJRdWl0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5xdWl0dGluZyA9IDEKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorCisgICAgZGVmIHJ1bmN0eChzZWxmLCBjbWQsIGdsb2JhbHMsIGxvY2Fscyk6CisgICAgICAgICMgQi9XIGNvbXBhdGliaWxpdHkKKyAgICAgICAgc2VsZi5ydW4oY21kLCBnbG9iYWxzLCBsb2NhbHMpCisKKyAgICAjIFRoaXMgbWV0aG9kIGlzIG1vcmUgdXNlZnVsIHRvIGRlYnVnIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwuCisKKyAgICBkZWYgcnVuY2FsbChzZWxmLCBmdW5jLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHN5cy5zZXR0cmFjZShzZWxmLnRyYWNlX2Rpc3BhdGNoKQorICAgICAgICByZXMgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcyA9IGZ1bmMoKmFyZ3MsICoqa3dkcykKKyAgICAgICAgZXhjZXB0IEJkYlF1aXQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnF1aXR0aW5nID0gMQorICAgICAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgIHJldHVybiByZXMKKworCitkZWYgc2V0X3RyYWNlKCk6CisgICAgQmRiKCkuc2V0X3RyYWNlKCkKKworCitjbGFzcyBCcmVha3BvaW50OgorCisgICAgIiIiQnJlYWtwb2ludCBjbGFzcworCisgICAgSW1wbGVtZW50cyB0ZW1wb3JhcnkgYnJlYWtwb2ludHMsIGlnbm9yZSBjb3VudHMsIGRpc2FibGluZyBhbmQKKyAgICAocmUpLWVuYWJsaW5nLCBhbmQgY29uZGl0aW9uYWxzLgorCisgICAgQnJlYWtwb2ludHMgYXJlIGluZGV4ZWQgYnkgbnVtYmVyIHRocm91Z2ggYnBieW51bWJlciBhbmQgYnkKKyAgICB0aGUgZmlsZSxsaW5lIHR1cGxlIHVzaW5nIGJwbGlzdC4gIFRoZSBmb3JtZXIgcG9pbnRzIHRvIGEKKyAgICBzaW5nbGUgaW5zdGFuY2Ugb2YgY2xhc3MgQnJlYWtwb2ludC4gIFRoZSBsYXR0ZXIgcG9pbnRzIHRvIGEKKyAgICBsaXN0IG9mIHN1Y2ggaW5zdGFuY2VzIHNpbmNlIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lCisgICAgYnJlYWtwb2ludCBwZXIgbGluZS4KKworICAgICIiIgorCisgICAgIyBYWFggS2VlcGluZyBzdGF0ZSBpbiB0aGUgY2xhc3MgaXMgYSBtaXN0YWtlIC0tIHRoaXMgbWVhbnMKKyAgICAjIHlvdSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGFjdGl2ZSBCZGIgaW5zdGFuY2UuCisKKyAgICBuZXh0ID0gMSAgICAgICAgIyBOZXh0IGJwIHRvIGJlIGFzc2lnbmVkCisgICAgYnBsaXN0ID0ge30gICAgICMgaW5kZXhlZCBieSAoZmlsZSwgbGluZW5vKSB0dXBsZQorICAgIGJwYnludW1iZXIgPSBbTm9uZV0gIyBFYWNoIGVudHJ5IGlzIE5vbmUgb3IgYW4gaW5zdGFuY2Ugb2YgQnB0CisgICAgICAgICAgICAgICAgIyBpbmRleCAwIGlzIHVudXNlZCwgZXhjZXB0IGZvciBtYXJraW5nIGFuCisgICAgICAgICAgICAgICAgIyBlZmZlY3RpdmUgYnJlYWsgLi4uLiBzZWUgZWZmZWN0aXZlKCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBsaW5lLCB0ZW1wb3Jhcnk9MCwgY29uZD1Ob25lLCBmdW5jbmFtZT1Ob25lKToKKyAgICAgICAgc2VsZi5mdW5jbmFtZSA9IGZ1bmNuYW1lCisgICAgICAgICMgTmVlZGVkIGlmIGZ1bmNuYW1lIGlzIG5vdCBOb25lLgorICAgICAgICBzZWxmLmZ1bmNfZmlyc3RfZXhlY3V0YWJsZV9saW5lID0gTm9uZQorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlICAgICMgVGhpcyBiZXR0ZXIgYmUgaW4gY2Fub25pY2FsIGZvcm0hCisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKyAgICAgICAgc2VsZi50ZW1wb3JhcnkgPSB0ZW1wb3JhcnkKKyAgICAgICAgc2VsZi5jb25kID0gY29uZAorICAgICAgICBzZWxmLmVuYWJsZWQgPSAxCisgICAgICAgIHNlbGYuaWdub3JlID0gMAorICAgICAgICBzZWxmLmhpdHMgPSAwCisgICAgICAgIHNlbGYubnVtYmVyID0gQnJlYWtwb2ludC5uZXh0CisgICAgICAgIEJyZWFrcG9pbnQubmV4dCA9IEJyZWFrcG9pbnQubmV4dCArIDEKKyAgICAgICAgIyBCdWlsZCB0aGUgdHdvIGxpc3RzCisgICAgICAgIHNlbGYuYnBieW51bWJlci5hcHBlbmQoc2VsZikKKyAgICAgICAgaWYgKGZpbGUsIGxpbmUpIGluIHNlbGYuYnBsaXN0OgorICAgICAgICAgICAgc2VsZi5icGxpc3RbZmlsZSwgbGluZV0uYXBwZW5kKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJwbGlzdFtmaWxlLCBsaW5lXSA9IFtzZWxmXQorCisKKyAgICBkZWYgZGVsZXRlTWUoc2VsZik6CisgICAgICAgIGluZGV4ID0gKHNlbGYuZmlsZSwgc2VsZi5saW5lKQorICAgICAgICBzZWxmLmJwYnludW1iZXJbc2VsZi5udW1iZXJdID0gTm9uZSAgICMgTm8gbG9uZ2VyIGluIGxpc3QKKyAgICAgICAgc2VsZi5icGxpc3RbaW5kZXhdLnJlbW92ZShzZWxmKQorICAgICAgICBpZiBub3Qgc2VsZi5icGxpc3RbaW5kZXhdOgorICAgICAgICAgICAgIyBObyBtb3JlIGJwIGZvciB0aGlzIGY6bCBjb21ibworICAgICAgICAgICAgZGVsIHNlbGYuYnBsaXN0W2luZGV4XQorCisgICAgZGVmIGVuYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5lbmFibGVkID0gMQorCisgICAgZGVmIGRpc2FibGUoc2VsZik6CisgICAgICAgIHNlbGYuZW5hYmxlZCA9IDAKKworICAgIGRlZiBicHByaW50KHNlbGYsIG91dD1Ob25lKToKKyAgICAgICAgaWYgb3V0IGlzIE5vbmU6CisgICAgICAgICAgICBvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGlmIHNlbGYudGVtcG9yYXJ5OgorICAgICAgICAgICAgZGlzcCA9ICdkZWwgICcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpc3AgPSAna2VlcCAnCisgICAgICAgIGlmIHNlbGYuZW5hYmxlZDoKKyAgICAgICAgICAgIGRpc3AgPSBkaXNwICsgJ3llcyAgJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlzcCA9IGRpc3AgKyAnbm8gICAnCisgICAgICAgIHByaW50ID4+b3V0LCAnJS00ZGJyZWFrcG9pbnQgICAlcyBhdCAlczolZCcgJSAoc2VsZi5udW1iZXIsIGRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlLCBzZWxmLmxpbmUpCisgICAgICAgIGlmIHNlbGYuY29uZDoKKyAgICAgICAgICAgIHByaW50ID4+b3V0LCAnXHRzdG9wIG9ubHkgaWYgJXMnICUgKHNlbGYuY29uZCwpCisgICAgICAgIGlmIHNlbGYuaWdub3JlOgorICAgICAgICAgICAgcHJpbnQgPj5vdXQsICdcdGlnbm9yZSBuZXh0ICVkIGhpdHMnICUgKHNlbGYuaWdub3JlKQorICAgICAgICBpZiAoc2VsZi5oaXRzKToKKyAgICAgICAgICAgIGlmIChzZWxmLmhpdHMgPiAxKTogc3MgPSAncycKKyAgICAgICAgICAgIGVsc2U6IHNzID0gJycKKyAgICAgICAgICAgIHByaW50ID4+b3V0LCAoJ1x0YnJlYWtwb2ludCBhbHJlYWR5IGhpdCAlZCB0aW1lJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuaGl0cywgc3MpKQorCisjIC0tLS0tLS0tLS0tZW5kIG9mIEJyZWFrcG9pbnQgY2xhc3MtLS0tLS0tLS0tCisKK2RlZiBjaGVja2Z1bmNuYW1lKGIsIGZyYW1lKToKKyAgICAiIiJDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBicmVhayBoZXJlIGJlY2F1c2Ugb2YgYGIuZnVuY25hbWVgLiIiIgorICAgIGlmIG5vdCBiLmZ1bmNuYW1lOgorICAgICAgICAjIEJyZWFrcG9pbnQgd2FzIHNldCB2aWEgbGluZSBudW1iZXIuCisgICAgICAgIGlmIGIubGluZSAhPSBmcmFtZS5mX2xpbmVubzoKKyAgICAgICAgICAgICMgQnJlYWtwb2ludCB3YXMgc2V0IGF0IGEgbGluZSB3aXRoIGEgZGVmIHN0YXRlbWVudCBhbmQgdGhlIGZ1bmN0aW9uCisgICAgICAgICAgICAjIGRlZmluZWQgaXMgY2FsbGVkOiBkb24ndCBicmVhay4KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBCcmVha3BvaW50IHNldCB2aWEgZnVuY3Rpb24gbmFtZS4KKworICAgIGlmIGZyYW1lLmZfY29kZS5jb19uYW1lICE9IGIuZnVuY25hbWU6CisgICAgICAgICMgSXQncyBub3QgYSBmdW5jdGlvbiBjYWxsLCBidXQgcmF0aGVyIGV4ZWN1dGlvbiBvZiBkZWYgc3RhdGVtZW50LgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgV2UgYXJlIGluIHRoZSByaWdodCBmcmFtZS4KKyAgICBpZiBub3QgYi5mdW5jX2ZpcnN0X2V4ZWN1dGFibGVfbGluZToKKyAgICAgICAgIyBUaGUgZnVuY3Rpb24gaXMgZW50ZXJlZCBmb3IgdGhlIDFzdCB0aW1lLgorICAgICAgICBiLmZ1bmNfZmlyc3RfZXhlY3V0YWJsZV9saW5lID0gZnJhbWUuZl9saW5lbm8KKworICAgIGlmICBiLmZ1bmNfZmlyc3RfZXhlY3V0YWJsZV9saW5lICE9IGZyYW1lLmZfbGluZW5vOgorICAgICAgICAjIEJ1dCB3ZSBhcmUgbm90IGF0IHRoZSBmaXJzdCBsaW5lIG51bWJlcjogZG9uJ3QgYnJlYWsuCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKKyMgRGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbiBlZmZlY3RpdmUgKGFjdGl2ZSkgYnJlYWtwb2ludCBhdCB0aGlzCisjIGxpbmUgb2YgY29kZS4gIFJldHVybnMgYnJlYWtwb2ludCBudW1iZXIgb3IgMCBpZiBub25lCitkZWYgZWZmZWN0aXZlKGZpbGUsIGxpbmUsIGZyYW1lKToKKyAgICAiIiJEZXRlcm1pbmUgd2hpY2ggYnJlYWtwb2ludCBmb3IgdGhpcyBmaWxlOmxpbmUgaXMgdG8gYmUgYWN0ZWQgdXBvbi4KKworICAgIENhbGxlZCBvbmx5IGlmIHdlIGtub3cgdGhlcmUgaXMgYSBicHQgYXQgdGhpcworICAgIGxvY2F0aW9uLiAgUmV0dXJucyBicmVha3BvaW50IHRoYXQgd2FzIHRyaWdnZXJlZCBhbmQgYSBmbGFnCisgICAgdGhhdCBpbmRpY2F0ZXMgaWYgaXQgaXMgb2sgdG8gZGVsZXRlIGEgdGVtcG9yYXJ5IGJwLgorCisgICAgIiIiCisgICAgcG9zc2libGVzID0gQnJlYWtwb2ludC5icGxpc3RbZmlsZSxsaW5lXQorICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihwb3NzaWJsZXMpKToKKyAgICAgICAgYiA9IHBvc3NpYmxlc1tpXQorICAgICAgICBpZiBiLmVuYWJsZWQgPT0gMDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5vdCBjaGVja2Z1bmNuYW1lKGIsIGZyYW1lKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgQ291bnQgZXZlcnkgaGl0IHdoZW4gYnAgaXMgZW5hYmxlZAorICAgICAgICBiLmhpdHMgPSBiLmhpdHMgKyAxCisgICAgICAgIGlmIG5vdCBiLmNvbmQ6CisgICAgICAgICAgICAjIElmIHVuY29uZGl0aW9uYWwsIGFuZCBpZ25vcmluZywKKyAgICAgICAgICAgICMgZ28gb24gdG8gbmV4dCwgZWxzZSBicmVhaworICAgICAgICAgICAgaWYgYi5pZ25vcmUgPiAwOgorICAgICAgICAgICAgICAgIGIuaWdub3JlID0gYi5pZ25vcmUgLTEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGJyZWFrcG9pbnQgYW5kIG1hcmtlciB0aGF0J3Mgb2sKKyAgICAgICAgICAgICAgICAjIHRvIGRlbGV0ZSBpZiB0ZW1wb3JhcnkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGIsMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQ29uZGl0aW9uYWwgYnAuCisgICAgICAgICAgICAjIElnbm9yZSBjb3VudCBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgYnB0IGhpdHMgd2hlcmUgdGhlCisgICAgICAgICAgICAjIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdHJ1ZS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWwgPSBldmFsKGIuY29uZCwgZnJhbWUuZl9nbG9iYWxzLAorICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5mX2xvY2FscykKKyAgICAgICAgICAgICAgICBpZiB2YWw6CisgICAgICAgICAgICAgICAgICAgIGlmIGIuaWdub3JlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGIuaWdub3JlID0gYi5pZ25vcmUgLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYiwxKQorICAgICAgICAgICAgICAgICMgZWxzZToKKyAgICAgICAgICAgICAgICAjICAgY29udGludWUKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIGlmIGV2YWwgZmFpbHMsIG1vc3QgY29uc2VydmF0aXZlCisgICAgICAgICAgICAgICAgIyB0aGluZyBpcyB0byBzdG9wIG9uIGJyZWFrcG9pbnQKKyAgICAgICAgICAgICAgICAjIHJlZ2FyZGxlc3Mgb2YgaWdub3JlIGNvdW50LgorICAgICAgICAgICAgICAgICMgRG9uJ3QgZGVsZXRlIHRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAjIGFzIGFub3RoZXIgaGludCB0byB1c2VyLgorICAgICAgICAgICAgICAgIHJldHVybiAoYiwwKQorICAgIHJldHVybiAoTm9uZSwgTm9uZSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSB0ZXN0aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRkYihCZGIpOgorICAgIGRlZiB1c2VyX2NhbGwoc2VsZiwgZnJhbWUsIGFyZ3MpOgorICAgICAgICBuYW1lID0gZnJhbWUuZl9jb2RlLmNvX25hbWUKKyAgICAgICAgaWYgbm90IG5hbWU6IG5hbWUgPSAnPz8/JworICAgICAgICBwcmludCAnKysrIGNhbGwnLCBuYW1lLCBhcmdzCisgICAgZGVmIHVzZXJfbGluZShzZWxmLCBmcmFtZSk6CisgICAgICAgIGltcG9ydCBsaW5lY2FjaGUKKyAgICAgICAgbmFtZSA9IGZyYW1lLmZfY29kZS5jb19uYW1lCisgICAgICAgIGlmIG5vdCBuYW1lOiBuYW1lID0gJz8/PycKKyAgICAgICAgZm4gPSBzZWxmLmNhbm9uaWMoZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lKQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZm4sIGZyYW1lLmZfbGluZW5vLCBmcmFtZS5mX2dsb2JhbHMpCisgICAgICAgIHByaW50ICcrKysnLCBmbiwgZnJhbWUuZl9saW5lbm8sIG5hbWUsICc6JywgbGluZS5zdHJpcCgpCisgICAgZGVmIHVzZXJfcmV0dXJuKHNlbGYsIGZyYW1lLCByZXR2YWwpOgorICAgICAgICBwcmludCAnKysrIHJldHVybicsIHJldHZhbAorICAgIGRlZiB1c2VyX2V4Y2VwdGlvbihzZWxmLCBmcmFtZSwgZXhjX3N0dWZmKToKKyAgICAgICAgcHJpbnQgJysrKyBleGNlcHRpb24nLCBleGNfc3R1ZmYKKyAgICAgICAgc2VsZi5zZXRfY29udGludWUoKQorCitkZWYgZm9vKG4pOgorICAgIHByaW50ICdmb28oJywgbiwgJyknCisgICAgeCA9IGJhcihuKjEwKQorICAgIHByaW50ICdiYXIgcmV0dXJuZWQnLCB4CisKK2RlZiBiYXIoYSk6CisgICAgcHJpbnQgJ2JhcignLCBhLCAnKScKKyAgICByZXR1cm4gYS8yCisKK2RlZiB0ZXN0KCk6CisgICAgdCA9IFRkYigpCisgICAgdC5ydW4oJ2ltcG9ydCBiZGI7IGJkYi5mb28oMTApJykKKworIyBlbmQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmRiLnB5YyBiL2xpYi9weXRob24yLjcvYmRiLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTY2NzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmRiLnB5byBiL2xpYi9weXRob24yLjcvYmRiLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTY2NzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmluaGV4LnB5IGIvbGliL3B5dGhvbjIuNy9iaW5oZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFiYzlmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmluaGV4LnB5CkBAIC0wLDAgKzEsNTA4IEBACisiIiJNYWNpbnRvc2ggYmluaGV4IGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24uCisKK2Vhc3kgaW50ZXJmYWNlOgorYmluaGV4KGlucHV0ZmlsZW5hbWUsIG91dHB1dGZpbGVuYW1lKQoraGV4YmluKGlucHV0ZmlsZW5hbWUsIG91dHB1dGZpbGVuYW1lKQorIiIiCisKKyMKKyMgSmFjayBKYW5zZW4sIENXSSwgQXVndXN0IDE5OTUuCisjCisjIFRoZSBtb2R1bGUgaXMgc3VwcG9zZWQgdG8gYmUgYXMgY29tcGF0aWJsZSBhcyBwb3NzaWJsZS4gRXNwZWNpYWxseSB0aGUKKyMgZWFzeSBpbnRlcmZhY2Ugc2hvdWxkIHdvcmsgImFzIGV4cGVjdGVkIiBvbiBhbnkgcGxhdGZvcm0uCisjIFhYWFggTm90ZTogY3VycmVudGx5LCB0ZXh0ZmlsZXMgYXBwZWFyIGluIG1hYy1mb3JtIG9uIGFsbCBwbGF0Zm9ybXMuCisjIFdlIHNlZW0gdG8gbGFjayBhIHNpbXBsZSBjaGFyYWN0ZXItdHJhbnNsYXRlIGluIHB5dGhvbi4KKyMgKHdlIHNob3VsZCBwcm9iYWJseSB1c2UgSVNPLUxhdGluLTEgb24gYWxsIGJ1dCB0aGUgbWFjIHBsYXRmb3JtKS4KKyMgWFhYWCBUaGUgc2ltcGxlIHJvdXRpbmVzIGFyZSB0b28gc2ltcGxlOiB0aGV5IGV4cGVjdCB0byBob2xkIHRoZSBjb21wbGV0ZQorIyBmaWxlcyBpbi1jb3JlLiBTaG91bGQgYmUgZml4ZWQuCisjIFhYWFggSXQgd291bGQgYmUgbmljZSB0byBoYW5kbGUgQXBwbGVEb3VibGUgZm9ybWF0IG9uIHVuaXgKKyMgKGZvciBzZXJ2ZXJzIHNlcnZpbmcgbWFjcykuCisjIFhYWFggSSBkb24ndCB1bmRlcnN0YW5kIHdoYXQgaGFwcGVucyB3aGVuIHlvdSBnZXQgMHg5MCB0aW1lcyB0aGUgc2FtZSBieXRlIG9uCisjIGlucHV0LiBUaGUgcmVzdWx0aW5nIGNvZGUgKHh4IDkwIDkwKSB3b3VsZCBhcHBlYXIgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYW4KKyMgZXNjYXBlZCAqdmFsdWUqIG9mIDB4OTAuIEFsbCBjb2RlcnMgSSd2ZSBzZWVuIGFwcGVhciB0byBpZ25vcmUgdGhpcyBuaWNldHkuLi4KKyMKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN0cnVjdAoraW1wb3J0IGJpbmFzY2lpCisKK19fYWxsX18gPSBbImJpbmhleCIsImhleGJpbiIsIkVycm9yIl0KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKyMgU3RhdGVzICh3aGF0IGhhdmUgd2Ugd3JpdHRlbikKK1tfRElEX0hFQURFUiwgX0RJRF9EQVRBLCBfRElEX1JTUkNdID0gcmFuZ2UoMykKKworIyBWYXJpb3VzIGNvbnN0YW50cworUkVBU09OQUJMWV9MQVJHRT0zMjc2OCAgIyBNaW5pbWFsIGFtb3VudCB3ZSBwYXNzIHRoZSBybGUtY29kZXIKK0xJTkVMRU49NjQKK1JVTkNIQVI9Y2hyKDB4OTApICAgIyBydW4tbGVuZ3RoIGludHJvZHVjZXIKKworIworIyBUaGlzIGNvZGUgaXMgbm8gbG9uZ2VyIGJ5dGUtb3JkZXIgZGVwZW5kZW50CisKKyMKKyMgV29ya2Fyb3VuZHMgZm9yIG5vbi1tYWMgbWFjaGluZXMuCit0cnk6CisgICAgZnJvbSBDYXJib24uRmlsZSBpbXBvcnQgRlNTcGVjLCBGSW5mbworICAgIGZyb20gTWFjT1MgaW1wb3J0IG9wZW5yZgorCisgICAgZGVmIGdldGZpbGVpbmZvKG5hbWUpOgorICAgICAgICBmaW5mbyA9IEZTU3BlYyhuYW1lKS5GU3BHZXRGSW5mbygpCisgICAgICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQobmFtZSkKKyAgICAgICAgIyBYWFggR2V0IHJlc291cmNlL2RhdGEgc2l6ZXMKKyAgICAgICAgZnAgPSBvcGVuKG5hbWUsICdyYicpCisgICAgICAgIGZwLnNlZWsoMCwgMikKKyAgICAgICAgZGxlbiA9IGZwLnRlbGwoKQorICAgICAgICBmcCA9IG9wZW5yZihuYW1lLCAnKnJiJykKKyAgICAgICAgZnAuc2VlaygwLCAyKQorICAgICAgICBybGVuID0gZnAudGVsbCgpCisgICAgICAgIHJldHVybiBmaWxlLCBmaW5mbywgZGxlbiwgcmxlbgorCisgICAgZGVmIG9wZW5yc3JjKG5hbWUsICptb2RlKToKKyAgICAgICAgaWYgbm90IG1vZGU6CisgICAgICAgICAgICBtb2RlID0gJypyYicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZGUgPSAnKicgKyBtb2RlWzBdCisgICAgICAgIHJldHVybiBvcGVucmYobmFtZSwgbW9kZSkKKworZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMKKyAgICAjIEdsdWUgY29kZSBmb3Igbm9uLW1hY2ludG9zaCB1c2FnZQorICAgICMKKworICAgIGNsYXNzIEZJbmZvOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICBzZWxmLlR5cGUgPSAnPz8/PycKKyAgICAgICAgICAgIHNlbGYuQ3JlYXRvciA9ICc/Pz8/JworICAgICAgICAgICAgc2VsZi5GbGFncyA9IDAKKworICAgIGRlZiBnZXRmaWxlaW5mbyhuYW1lKToKKyAgICAgICAgZmluZm8gPSBGSW5mbygpCisgICAgICAgICMgUXVpY2sgY2hlY2sgZm9yIHRleHRmaWxlCisgICAgICAgIGZwID0gb3BlbihuYW1lKQorICAgICAgICBkYXRhID0gb3BlbihuYW1lKS5yZWFkKDI1NikKKyAgICAgICAgZm9yIGMgaW4gZGF0YToKKyAgICAgICAgICAgIGlmIG5vdCBjLmlzc3BhY2UoKSBhbmQgKGM8JyAnIG9yIG9yZChjKSA+IDB4N2YpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaW5mby5UeXBlID0gJ1RFWFQnCisgICAgICAgIGZwLnNlZWsoMCwgMikKKyAgICAgICAgZHNpemUgPSBmcC50ZWxsKCkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBkaXIsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KG5hbWUpCisgICAgICAgIGZpbGUgPSBmaWxlLnJlcGxhY2UoJzonLCAnLScsIDEpCisgICAgICAgIHJldHVybiBmaWxlLCBmaW5mbywgZHNpemUsIDAKKworICAgIGNsYXNzIG9wZW5yc3JjOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiByZWFkKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIHJldHVybiAnJworCisgICAgICAgIGRlZiB3cml0ZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBfSHF4Y29kZXJlbmdpbmU6CisgICAgIiIiV3JpdGUgZGF0YSB0byB0aGUgY29kZXIgaW4gMy1ieXRlIGNodW5rcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mcCk6CisgICAgICAgIHNlbGYub2ZwID0gb2ZwCisgICAgICAgIHNlbGYuZGF0YSA9ICcnCisgICAgICAgIHNlbGYuaHF4ZGF0YSA9ICcnCisgICAgICAgIHNlbGYubGluZWxlbiA9IExJTkVMRU4tMQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEgKyBkYXRhCisgICAgICAgIGRhdGFsZW4gPSBsZW4oc2VsZi5kYXRhKQorICAgICAgICB0b2RvID0gKGRhdGFsZW4vLzMpKjMKKyAgICAgICAgZGF0YSA9IHNlbGYuZGF0YVs6dG9kb10KKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhW3RvZG86XQorICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmhxeGRhdGEgPSBzZWxmLmhxeGRhdGEgKyBiaW5hc2NpaS5iMmFfaHF4KGRhdGEpCisgICAgICAgIHNlbGYuX2ZsdXNoKDApCisKKyAgICBkZWYgX2ZsdXNoKHNlbGYsIGZvcmNlKToKKyAgICAgICAgZmlyc3QgPSAwCisgICAgICAgIHdoaWxlIGZpcnN0IDw9IGxlbihzZWxmLmhxeGRhdGEpLXNlbGYubGluZWxlbjoKKyAgICAgICAgICAgIGxhc3QgPSBmaXJzdCArIHNlbGYubGluZWxlbgorICAgICAgICAgICAgc2VsZi5vZnAud3JpdGUoc2VsZi5ocXhkYXRhW2ZpcnN0Omxhc3RdKydcbicpCisgICAgICAgICAgICBzZWxmLmxpbmVsZW4gPSBMSU5FTEVOCisgICAgICAgICAgICBmaXJzdCA9IGxhc3QKKyAgICAgICAgc2VsZi5ocXhkYXRhID0gc2VsZi5ocXhkYXRhW2ZpcnN0Ol0KKyAgICAgICAgaWYgZm9yY2U6CisgICAgICAgICAgICBzZWxmLm9mcC53cml0ZShzZWxmLmhxeGRhdGEgKyAnOlxuJykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYXRhOgorICAgICAgICAgICAgc2VsZi5ocXhkYXRhID0gXAorICAgICAgICAgICAgICAgICBzZWxmLmhxeGRhdGEgKyBiaW5hc2NpaS5iMmFfaHF4KHNlbGYuZGF0YSkKKyAgICAgICAgc2VsZi5fZmx1c2goMSkKKyAgICAgICAgc2VsZi5vZnAuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5vZnAKKworY2xhc3MgX1JsZWNvZGVyZW5naW5lOgorICAgICIiIldyaXRlIGRhdGEgdG8gdGhlIFJMRS1jb2RlciBpbiBzdWl0YWJseSBsYXJnZSBjaHVua3MiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZnApOgorICAgICAgICBzZWxmLm9mcCA9IG9mcAorICAgICAgICBzZWxmLmRhdGEgPSAnJworCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGEgKyBkYXRhCisgICAgICAgIGlmIGxlbihzZWxmLmRhdGEpIDwgUkVBU09OQUJMWV9MQVJHRToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBybGVkYXRhID0gYmluYXNjaWkucmxlY29kZV9ocXgoc2VsZi5kYXRhKQorICAgICAgICBzZWxmLm9mcC53cml0ZShybGVkYXRhKQorICAgICAgICBzZWxmLmRhdGEgPSAnJworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRhdGE6CisgICAgICAgICAgICBybGVkYXRhID0gYmluYXNjaWkucmxlY29kZV9ocXgoc2VsZi5kYXRhKQorICAgICAgICAgICAgc2VsZi5vZnAud3JpdGUocmxlZGF0YSkKKyAgICAgICAgc2VsZi5vZnAuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5vZnAKKworY2xhc3MgQmluSGV4OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lX2ZpbmZvX2RsZW5fcmxlbiwgb2ZwKToKKyAgICAgICAgbmFtZSwgZmluZm8sIGRsZW4sIHJsZW4gPSBuYW1lX2ZpbmZvX2RsZW5fcmxlbgorICAgICAgICBpZiB0eXBlKG9mcCkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBvZm5hbWUgPSBvZnAKKyAgICAgICAgICAgIG9mcCA9IG9wZW4ob2ZuYW1lLCAndycpCisgICAgICAgIG9mcC53cml0ZSgnKFRoaXMgZmlsZSBtdXN0IGJlIGNvbnZlcnRlZCB3aXRoIEJpbkhleCA0LjApXG5cbjonKQorICAgICAgICBocXhlciA9IF9IcXhjb2RlcmVuZ2luZShvZnApCisgICAgICAgIHNlbGYub2ZwID0gX1JsZWNvZGVyZW5naW5lKGhxeGVyKQorICAgICAgICBzZWxmLmNyYyA9IDAKKyAgICAgICAgaWYgZmluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIGZpbmZvID0gRkluZm8oKQorICAgICAgICBzZWxmLmRsZW4gPSBkbGVuCisgICAgICAgIHNlbGYucmxlbiA9IHJsZW4KKyAgICAgICAgc2VsZi5fd3JpdGVpbmZvKG5hbWUsIGZpbmZvKQorICAgICAgICBzZWxmLnN0YXRlID0gX0RJRF9IRUFERVIKKworICAgIGRlZiBfd3JpdGVpbmZvKHNlbGYsIG5hbWUsIGZpbmZvKToKKyAgICAgICAgbmwgPSBsZW4obmFtZSkKKyAgICAgICAgaWYgbmwgPiA2MzoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnRmlsZW5hbWUgdG9vIGxvbmcnCisgICAgICAgIGQgPSBjaHIobmwpICsgbmFtZSArICdcMCcKKyAgICAgICAgZDIgPSBmaW5mby5UeXBlICsgZmluZm8uQ3JlYXRvcgorCisgICAgICAgICMgRm9yY2UgYWxsIHN0cnVjdHMgdG8gYmUgcGFja2VkIHdpdGggYmlnLWVuZGlhbgorICAgICAgICBkMyA9IHN0cnVjdC5wYWNrKCc+aCcsIGZpbmZvLkZsYWdzKQorICAgICAgICBkNCA9IHN0cnVjdC5wYWNrKCc+aWknLCBzZWxmLmRsZW4sIHNlbGYucmxlbikKKyAgICAgICAgaW5mbyA9IGQgKyBkMiArIGQzICsgZDQKKyAgICAgICAgc2VsZi5fd3JpdGUoaW5mbykKKyAgICAgICAgc2VsZi5fd3JpdGVjcmMoKQorCisgICAgZGVmIF93cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5jcmMgPSBiaW5hc2NpaS5jcmNfaHF4KGRhdGEsIHNlbGYuY3JjKQorICAgICAgICBzZWxmLm9mcC53cml0ZShkYXRhKQorCisgICAgZGVmIF93cml0ZWNyYyhzZWxmKToKKyAgICAgICAgIyBYWFhYIFNob3VsZCB0aGlzIGJlIGhlcmU/PworICAgICAgICAjIHNlbGYuY3JjID0gYmluYXNjaWkuY3JjX2hxeCgnXDBcMCcsIHNlbGYuY3JjKQorICAgICAgICBpZiBzZWxmLmNyYyA8IDA6CisgICAgICAgICAgICBmbXQgPSAnPmgnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbXQgPSAnPkgnCisgICAgICAgIHNlbGYub2ZwLndyaXRlKHN0cnVjdC5wYWNrKGZtdCwgc2VsZi5jcmMpKQorICAgICAgICBzZWxmLmNyYyA9IDAKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSBfRElEX0hFQURFUjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnV3JpdGluZyBkYXRhIGF0IHRoZSB3cm9uZyB0aW1lJworICAgICAgICBzZWxmLmRsZW4gPSBzZWxmLmRsZW4gLSBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5fd3JpdGUoZGF0YSkKKworICAgIGRlZiBjbG9zZV9kYXRhKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRsZW4gIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnSW5jb3JyZWN0IGRhdGEgc2l6ZSwgZGlmZj0lcicgJSAoc2VsZi5ybGVuLCkKKyAgICAgICAgc2VsZi5fd3JpdGVjcmMoKQorICAgICAgICBzZWxmLnN0YXRlID0gX0RJRF9EQVRBCisKKyAgICBkZWYgd3JpdGVfcnNyYyhzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA8IF9ESURfREFUQToKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfZGF0YSgpCisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gX0RJRF9EQVRBOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdXcml0aW5nIHJlc291cmNlIGRhdGEgYXQgdGhlIHdyb25nIHRpbWUnCisgICAgICAgIHNlbGYucmxlbiA9IHNlbGYucmxlbiAtIGxlbihkYXRhKQorICAgICAgICBzZWxmLl93cml0ZShkYXRhKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0YXRlIDwgX0RJRF9EQVRBOgorICAgICAgICAgICAgc2VsZi5jbG9zZV9kYXRhKCkKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSBfRElEX0RBVEE6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ0Nsb3NlIGF0IHRoZSB3cm9uZyB0aW1lJworICAgICAgICBpZiBzZWxmLnJsZW4gIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IHJlc291cmNlLWRhdGFzaXplLCBkaWZmPSVyIiAlIChzZWxmLnJsZW4sKQorICAgICAgICBzZWxmLl93cml0ZWNyYygpCisgICAgICAgIHNlbGYub2ZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUKKyAgICAgICAgZGVsIHNlbGYub2ZwCisKK2RlZiBiaW5oZXgoaW5wLCBvdXQpOgorICAgICIiIihpbmZpbGVuYW1lLCBvdXRmaWxlbmFtZSkgLSBDcmVhdGUgYmluaGV4LWVuY29kZWQgY29weSBvZiBhIGZpbGUiIiIKKyAgICBmaW5mbyA9IGdldGZpbGVpbmZvKGlucCkKKyAgICBvZnAgPSBCaW5IZXgoZmluZm8sIG91dCkKKworICAgIGlmcCA9IG9wZW4oaW5wLCAncmInKQorICAgICMgWFhYWCBEbyB0ZXh0ZmlsZSB0cmFuc2xhdGlvbiBvbiBub24tbWFjIHN5c3RlbXMKKyAgICB3aGlsZSAxOgorICAgICAgICBkID0gaWZwLnJlYWQoMTI4MDAwKQorICAgICAgICBpZiBub3QgZDogYnJlYWsKKyAgICAgICAgb2ZwLndyaXRlKGQpCisgICAgb2ZwLmNsb3NlX2RhdGEoKQorICAgIGlmcC5jbG9zZSgpCisKKyAgICBpZnAgPSBvcGVucnNyYyhpbnAsICdyYicpCisgICAgd2hpbGUgMToKKyAgICAgICAgZCA9IGlmcC5yZWFkKDEyODAwMCkKKyAgICAgICAgaWYgbm90IGQ6IGJyZWFrCisgICAgICAgIG9mcC53cml0ZV9yc3JjKGQpCisgICAgb2ZwLmNsb3NlKCkKKyAgICBpZnAuY2xvc2UoKQorCitjbGFzcyBfSHF4ZGVjb2RlcmVuZ2luZToKKyAgICAiIiJSZWFkIGRhdGEgdmlhIHRoZSBkZWNvZGVyIGluIDQtYnl0ZSBjaHVua3MiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZnApOgorICAgICAgICBzZWxmLmlmcCA9IGlmcAorICAgICAgICBzZWxmLmVvZiA9IDAKKworICAgIGRlZiByZWFkKHNlbGYsIHRvdGFsd3RkKToKKyAgICAgICAgIiIiUmVhZCBhdCBsZWFzdCB3dGQgYnl0ZXMgKG9yIHVudGlsIEVPRikiIiIKKyAgICAgICAgZGVjZGF0YSA9ICcnCisgICAgICAgIHd0ZCA9IHRvdGFsd3RkCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgbG9vcCBoZXJlIGlzIGNvbnZvbHV0ZWQsIHNpbmNlIHdlIGRvbid0IHJlYWxseSBub3cgaG93CisgICAgICAgICMgbXVjaCB0byBkZWNvZGU6IHRoZXJlIG1heSBiZSBuZXdsaW5lcyBpbiB0aGUgaW5jb21pbmcgZGF0YS4KKyAgICAgICAgd2hpbGUgd3RkID4gMDoKKyAgICAgICAgICAgIGlmIHNlbGYuZW9mOiByZXR1cm4gZGVjZGF0YQorICAgICAgICAgICAgd3RkID0gKCh3dGQrMikvLzMpKjQKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLmlmcC5yZWFkKHd0ZCkKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgTmV4dCBwcm9ibGVtOiB0aGVyZSBtYXkgbm90IGJlIGEgY29tcGxldGUgbnVtYmVyIG9mCisgICAgICAgICAgICAjIGJ5dGVzIGluIHdoYXQgd2UgcGFzcyB0byBhMmIuIFNvbHZlIGJ5IHlldCBhbm90aGVyCisgICAgICAgICAgICAjIGxvb3AuCisgICAgICAgICAgICAjCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGVjZGF0YWN1ciwgc2VsZi5lb2YgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXNjaWkuYTJiX2hxeChkYXRhKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5JbmNvbXBsZXRlOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgbmV3ZGF0YSA9IHNlbGYuaWZwLnJlYWQoMSkKKyAgICAgICAgICAgICAgICBpZiBub3QgbmV3ZGF0YToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1ByZW1hdHVyZSBFT0Ygb24gYmluaGV4IGZpbGUnCisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEgKyBuZXdkYXRhCisgICAgICAgICAgICBkZWNkYXRhID0gZGVjZGF0YSArIGRlY2RhdGFjdXIKKyAgICAgICAgICAgIHd0ZCA9IHRvdGFsd3RkIC0gbGVuKGRlY2RhdGEpCisgICAgICAgICAgICBpZiBub3QgZGVjZGF0YSBhbmQgbm90IHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnUHJlbWF0dXJlIEVPRiBvbiBiaW5oZXggZmlsZScKKyAgICAgICAgcmV0dXJuIGRlY2RhdGEKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5pZnAuY2xvc2UoKQorCitjbGFzcyBfUmxlZGVjb2RlcmVuZ2luZToKKyAgICAiIiJSZWFkIGRhdGEgdmlhIHRoZSBSTEUtY29kZXIiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZnApOgorICAgICAgICBzZWxmLmlmcCA9IGlmcAorICAgICAgICBzZWxmLnByZV9idWZmZXIgPSAnJworICAgICAgICBzZWxmLnBvc3RfYnVmZmVyID0gJycKKyAgICAgICAgc2VsZi5lb2YgPSAwCisKKyAgICBkZWYgcmVhZChzZWxmLCB3dGQpOgorICAgICAgICBpZiB3dGQgPiBsZW4oc2VsZi5wb3N0X2J1ZmZlcik6CisgICAgICAgICAgICBzZWxmLl9maWxsKHd0ZC1sZW4oc2VsZi5wb3N0X2J1ZmZlcikpCisgICAgICAgIHJ2ID0gc2VsZi5wb3N0X2J1ZmZlcls6d3RkXQorICAgICAgICBzZWxmLnBvc3RfYnVmZmVyID0gc2VsZi5wb3N0X2J1ZmZlclt3dGQ6XQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBfZmlsbChzZWxmLCB3dGQpOgorICAgICAgICBzZWxmLnByZV9idWZmZXIgPSBzZWxmLnByZV9idWZmZXIgKyBzZWxmLmlmcC5yZWFkKHd0ZCs0KQorICAgICAgICBpZiBzZWxmLmlmcC5lb2Y6CisgICAgICAgICAgICBzZWxmLnBvc3RfYnVmZmVyID0gc2VsZi5wb3N0X2J1ZmZlciArIFwKKyAgICAgICAgICAgICAgICBiaW5hc2NpaS5ybGVkZWNvZGVfaHF4KHNlbGYucHJlX2J1ZmZlcikKKyAgICAgICAgICAgIHNlbGYucHJlX2J1ZmZlciA9ICcnCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjCisgICAgICAgICMgT2JmdXNjYXRlZCBjb2RlIGFoZWFkLiBXZSBoYXZlIHRvIHRha2UgY2FyZSB0aGF0IHdlIGRvbid0CisgICAgICAgICMgZW5kIHVwIHdpdGggYW4gb3JwaGFuZWQgUlVOQ0hBUiBsYXRlciBvbi4gU28sIHdlIGtlZXAgYSBjb3VwbGUKKyAgICAgICAgIyBvZiBieXRlcyBpbiB0aGUgYnVmZmVyLCBkZXBlbmRpbmcgb24gd2hhdCB0aGUgZW5kIG9mCisgICAgICAgICMgdGhlIGJ1ZmZlciBsb29rcyBsaWtlOgorICAgICAgICAjICdcMjIwXDBcMjIwJyAtIEtlZXAgMyBieXRlczogcmVwZWF0ZWQgXDIyMCAoZXNjYXBlZCBhcyBcMjIwXDApCisgICAgICAgICMgJz9cMjIwJyAtIEtlZXAgMiBieXRlczogcmVwZWF0ZWQgc29tZXRoaW5nLWVsc2UKKyAgICAgICAgIyAnXDIyMFwwJyAtIEVzY2FwZWQgXDIyMDogS2VlcCAyIGJ5dGVzLgorICAgICAgICAjICc/XDIyMD8nIC0gQ29tcGxldGUgcmVwZWF0IHNlcXVlbmNlOiBkZWNvZGUgYWxsCisgICAgICAgICMgb3RoZXJ3aXNlOiBrZWVwIDEgYnl0ZS4KKyAgICAgICAgIworICAgICAgICBtYXJrID0gbGVuKHNlbGYucHJlX2J1ZmZlcikKKyAgICAgICAgaWYgc2VsZi5wcmVfYnVmZmVyWy0zOl0gPT0gUlVOQ0hBUiArICdcMCcgKyBSVU5DSEFSOgorICAgICAgICAgICAgbWFyayA9IG1hcmsgLSAzCisgICAgICAgIGVsaWYgc2VsZi5wcmVfYnVmZmVyWy0xXSA9PSBSVU5DSEFSOgorICAgICAgICAgICAgbWFyayA9IG1hcmsgLSAyCisgICAgICAgIGVsaWYgc2VsZi5wcmVfYnVmZmVyWy0yOl0gPT0gUlVOQ0hBUiArICdcMCc6CisgICAgICAgICAgICBtYXJrID0gbWFyayAtIDIKKyAgICAgICAgZWxpZiBzZWxmLnByZV9idWZmZXJbLTJdID09IFJVTkNIQVI6CisgICAgICAgICAgICBwYXNzICMgRGVjb2RlIGFsbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWFyayA9IG1hcmsgLSAxCisKKyAgICAgICAgc2VsZi5wb3N0X2J1ZmZlciA9IHNlbGYucG9zdF9idWZmZXIgKyBcCisgICAgICAgICAgICBiaW5hc2NpaS5ybGVkZWNvZGVfaHF4KHNlbGYucHJlX2J1ZmZlcls6bWFya10pCisgICAgICAgIHNlbGYucHJlX2J1ZmZlciA9IHNlbGYucHJlX2J1ZmZlclttYXJrOl0KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5pZnAuY2xvc2UoKQorCitjbGFzcyBIZXhCaW46CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlmcCk6CisgICAgICAgIGlmIHR5cGUoaWZwKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIGlmcCA9IG9wZW4oaWZwKQorICAgICAgICAjCisgICAgICAgICMgRmluZCBpbml0aWFsIGNvbG9uLgorICAgICAgICAjCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBjaCA9IGlmcC5yZWFkKDEpCisgICAgICAgICAgICBpZiBub3QgY2g6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJObyBiaW5oZXggZGF0YSBmb3VuZCIKKyAgICAgICAgICAgICMgQ2F0ZXIgZm9yIFxyXG4gdGVybWluYXRlZCBsaW5lcyAod2hpY2ggc2hvdyB1cCBhcyBcblxyLCBoZW5jZQorICAgICAgICAgICAgIyBhbGwgbGluZXMgc3RhcnQgd2l0aCBccikKKyAgICAgICAgICAgIGlmIGNoID09ICdccic6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGNoID09ICc6JzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgY2ggIT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBkdW1teSA9IGlmcC5yZWFkbGluZSgpCisKKyAgICAgICAgaHF4aWZwID0gX0hxeGRlY29kZXJlbmdpbmUoaWZwKQorICAgICAgICBzZWxmLmlmcCA9IF9SbGVkZWNvZGVyZW5naW5lKGhxeGlmcCkKKyAgICAgICAgc2VsZi5jcmMgPSAwCisgICAgICAgIHNlbGYuX3JlYWRoZWFkZXIoKQorCisgICAgZGVmIF9yZWFkKHNlbGYsIGxlbik6CisgICAgICAgIGRhdGEgPSBzZWxmLmlmcC5yZWFkKGxlbikKKyAgICAgICAgc2VsZi5jcmMgPSBiaW5hc2NpaS5jcmNfaHF4KGRhdGEsIHNlbGYuY3JjKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIF9jaGVja2NyYyhzZWxmKToKKyAgICAgICAgZmlsZWNyYyA9IHN0cnVjdC51bnBhY2soJz5oJywgc2VsZi5pZnAucmVhZCgyKSlbMF0gJiAweGZmZmYKKyAgICAgICAgI3NlbGYuY3JjID0gYmluYXNjaWkuY3JjX2hxeCgnXDBcMCcsIHNlbGYuY3JjKQorICAgICAgICAjIFhYWFggSXMgdGhpcyBuZWVkZWQ/PworICAgICAgICBzZWxmLmNyYyA9IHNlbGYuY3JjICYgMHhmZmZmCisgICAgICAgIGlmIGZpbGVjcmMgIT0gc2VsZi5jcmM6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ0NSQyBlcnJvciwgY29tcHV0ZWQgJXgsIHJlYWQgJXgnIFwKKyAgICAgICAgICAgICAgICAgICUoc2VsZi5jcmMsIGZpbGVjcmMpCisgICAgICAgIHNlbGYuY3JjID0gMAorCisgICAgZGVmIF9yZWFkaGVhZGVyKHNlbGYpOgorICAgICAgICBsZW4gPSBzZWxmLl9yZWFkKDEpCisgICAgICAgIGZuYW1lID0gc2VsZi5fcmVhZChvcmQobGVuKSkKKyAgICAgICAgcmVzdCA9IHNlbGYuX3JlYWQoMSs0KzQrMis0KzQpCisgICAgICAgIHNlbGYuX2NoZWNrY3JjKCkKKworICAgICAgICB0eXBlID0gcmVzdFsxOjVdCisgICAgICAgIGNyZWF0b3IgPSByZXN0WzU6OV0KKyAgICAgICAgZmxhZ3MgPSBzdHJ1Y3QudW5wYWNrKCc+aCcsIHJlc3RbOToxMV0pWzBdCisgICAgICAgIHNlbGYuZGxlbiA9IHN0cnVjdC51bnBhY2soJz5sJywgcmVzdFsxMToxNV0pWzBdCisgICAgICAgIHNlbGYucmxlbiA9IHN0cnVjdC51bnBhY2soJz5sJywgcmVzdFsxNToxOV0pWzBdCisKKyAgICAgICAgc2VsZi5GTmFtZSA9IGZuYW1lCisgICAgICAgIHNlbGYuRkluZm8gPSBGSW5mbygpCisgICAgICAgIHNlbGYuRkluZm8uQ3JlYXRvciA9IGNyZWF0b3IKKyAgICAgICAgc2VsZi5GSW5mby5UeXBlID0gdHlwZQorICAgICAgICBzZWxmLkZJbmZvLkZsYWdzID0gZmxhZ3MKKworICAgICAgICBzZWxmLnN0YXRlID0gX0RJRF9IRUFERVIKKworICAgIGRlZiByZWFkKHNlbGYsICpuKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSBfRElEX0hFQURFUjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnUmVhZCBkYXRhIGF0IHdyb25nIHRpbWUnCisgICAgICAgIGlmIG46CisgICAgICAgICAgICBuID0gblswXQorICAgICAgICAgICAgbiA9IG1pbihuLCBzZWxmLmRsZW4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuID0gc2VsZi5kbGVuCisgICAgICAgIHJ2ID0gJycKKyAgICAgICAgd2hpbGUgbGVuKHJ2KSA8IG46CisgICAgICAgICAgICBydiA9IHJ2ICsgc2VsZi5fcmVhZChuLWxlbihydikpCisgICAgICAgIHNlbGYuZGxlbiA9IHNlbGYuZGxlbiAtIG4KKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgY2xvc2VfZGF0YShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSBfRElEX0hFQURFUjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2xvc2VfZGF0YSBhdCB3cm9uZyB0aW1lJworICAgICAgICBpZiBzZWxmLmRsZW46CisgICAgICAgICAgICBkdW1teSA9IHNlbGYuX3JlYWQoc2VsZi5kbGVuKQorICAgICAgICBzZWxmLl9jaGVja2NyYygpCisgICAgICAgIHNlbGYuc3RhdGUgPSBfRElEX0RBVEEKKworICAgIGRlZiByZWFkX3JzcmMoc2VsZiwgKm4pOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09IF9ESURfSEVBREVSOgorICAgICAgICAgICAgc2VsZi5jbG9zZV9kYXRhKCkKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSBfRElEX0RBVEE6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ1JlYWQgcmVzb3VyY2UgZGF0YSBhdCB3cm9uZyB0aW1lJworICAgICAgICBpZiBuOgorICAgICAgICAgICAgbiA9IG5bMF0KKyAgICAgICAgICAgIG4gPSBtaW4obiwgc2VsZi5ybGVuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbiA9IHNlbGYucmxlbgorICAgICAgICBzZWxmLnJsZW4gPSBzZWxmLnJsZW4gLSBuCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkKG4pCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYucmxlbjoKKyAgICAgICAgICAgIGR1bW15ID0gc2VsZi5yZWFkX3JzcmMoc2VsZi5ybGVuKQorICAgICAgICBzZWxmLl9jaGVja2NyYygpCisgICAgICAgIHNlbGYuc3RhdGUgPSBfRElEX1JTUkMKKyAgICAgICAgc2VsZi5pZnAuY2xvc2UoKQorCitkZWYgaGV4YmluKGlucCwgb3V0KToKKyAgICAiIiIoaW5maWxlbmFtZSwgb3V0ZmlsZW5hbWUpIC0gRGVjb2RlIGJpbmhleGVkIGZpbGUiIiIKKyAgICBpZnAgPSBIZXhCaW4oaW5wKQorICAgIGZpbmZvID0gaWZwLkZJbmZvCisgICAgaWYgbm90IG91dDoKKyAgICAgICAgb3V0ID0gaWZwLkZOYW1lCisKKyAgICBvZnAgPSBvcGVuKG91dCwgJ3diJykKKyAgICAjIFhYWFggRG8gdHJhbnNsYXRpb24gb24gbm9uLW1hYyBzeXN0ZW1zCisgICAgd2hpbGUgMToKKyAgICAgICAgZCA9IGlmcC5yZWFkKDEyODAwMCkKKyAgICAgICAgaWYgbm90IGQ6IGJyZWFrCisgICAgICAgIG9mcC53cml0ZShkKQorICAgIG9mcC5jbG9zZSgpCisgICAgaWZwLmNsb3NlX2RhdGEoKQorCisgICAgZCA9IGlmcC5yZWFkX3JzcmMoMTI4MDAwKQorICAgIGlmIGQ6CisgICAgICAgIG9mcCA9IG9wZW5yc3JjKG91dCwgJ3diJykKKyAgICAgICAgb2ZwLndyaXRlKGQpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBkID0gaWZwLnJlYWRfcnNyYygxMjgwMDApCisgICAgICAgICAgICBpZiBub3QgZDogYnJlYWsKKyAgICAgICAgICAgIG9mcC53cml0ZShkKQorICAgICAgICBvZnAuY2xvc2UoKQorCisgICAgaWZwLmNsb3NlKCkKKworZGVmIF90ZXN0KCk6CisgICAgZm5hbWUgPSBzeXMuYXJndlsxXQorICAgIGJpbmhleChmbmFtZSwgZm5hbWUrJy5ocXgnKQorICAgIGhleGJpbihmbmFtZSsnLmhxeCcsIGZuYW1lKycudmlhaHF4JykKKyAgICAjaGV4YmluKGZuYW1lLCBmbmFtZSsnLnVucGFja2VkJykKKyAgICBzeXMuZXhpdCgxKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmluaGV4LnB5YyBiL2xpYi9weXRob24yLjcvYmluaGV4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzIyY2RlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iaW5oZXgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmluaGV4LnB5byBiL2xpYi9weXRob24yLjcvYmluaGV4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzIyY2RlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9iaW5oZXgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYmlzZWN0LnB5IGIvbGliL3B5dGhvbjIuNy9iaXNlY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE0ZDA1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYmlzZWN0LnB5CkBAIC0wLDAgKzEsOTIgQEAKKyIiIkJpc2VjdGlvbiBhbGdvcml0aG1zLiIiIgorCitkZWYgaW5zb3J0X3JpZ2h0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOgorICAgICIiIkluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhbmQga2VlcCBpdCBzb3J0ZWQgYXNzdW1pbmcgYSBpcyBzb3J0ZWQuCisKKyAgICBJZiB4IGlzIGFscmVhZHkgaW4gYSwgaW5zZXJ0IGl0IHRvIHRoZSByaWdodCBvZiB0aGUgcmlnaHRtb3N0IHguCisKKyAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZQorICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuCisgICAgIiIiCisKKyAgICBpZiBsbyA8IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJykKKyAgICBpZiBoaSBpcyBOb25lOgorICAgICAgICBoaSA9IGxlbihhKQorICAgIHdoaWxlIGxvIDwgaGk6CisgICAgICAgIG1pZCA9IChsbytoaSkvLzIKKyAgICAgICAgaWYgeCA8IGFbbWlkXTogaGkgPSBtaWQKKyAgICAgICAgZWxzZTogbG8gPSBtaWQrMQorICAgIGEuaW5zZXJ0KGxvLCB4KQorCitpbnNvcnQgPSBpbnNvcnRfcmlnaHQgICAjIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKworZGVmIGJpc2VjdF9yaWdodChhLCB4LCBsbz0wLCBoaT1Ob25lKToKKyAgICAiIiJSZXR1cm4gdGhlIGluZGV4IHdoZXJlIHRvIGluc2VydCBpdGVtIHggaW4gbGlzdCBhLCBhc3N1bWluZyBhIGlzIHNvcnRlZC4KKworICAgIFRoZSByZXR1cm4gdmFsdWUgaSBpcyBzdWNoIHRoYXQgYWxsIGUgaW4gYVs6aV0gaGF2ZSBlIDw9IHgsIGFuZCBhbGwgZSBpbgorICAgIGFbaTpdIGhhdmUgZSA+IHguICBTbyBpZiB4IGFscmVhZHkgYXBwZWFycyBpbiB0aGUgbGlzdCwgYS5pbnNlcnQoeCkgd2lsbAorICAgIGluc2VydCBqdXN0IGFmdGVyIHRoZSByaWdodG1vc3QgeCBhbHJlYWR5IHRoZXJlLgorCisgICAgT3B0aW9uYWwgYXJncyBsbyAoZGVmYXVsdCAwKSBhbmQgaGkgKGRlZmF1bHQgbGVuKGEpKSBib3VuZCB0aGUKKyAgICBzbGljZSBvZiBhIHRvIGJlIHNlYXJjaGVkLgorICAgICIiIgorCisgICAgaWYgbG8gPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdsbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpCisgICAgaWYgaGkgaXMgTm9uZToKKyAgICAgICAgaGkgPSBsZW4oYSkKKyAgICB3aGlsZSBsbyA8IGhpOgorICAgICAgICBtaWQgPSAobG8raGkpLy8yCisgICAgICAgIGlmIHggPCBhW21pZF06IGhpID0gbWlkCisgICAgICAgIGVsc2U6IGxvID0gbWlkKzEKKyAgICByZXR1cm4gbG8KKworYmlzZWN0ID0gYmlzZWN0X3JpZ2h0ICAgIyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisKK2RlZiBpbnNvcnRfbGVmdChhLCB4LCBsbz0wLCBoaT1Ob25lKToKKyAgICAiIiJJbnNlcnQgaXRlbSB4IGluIGxpc3QgYSwgYW5kIGtlZXAgaXQgc29ydGVkIGFzc3VtaW5nIGEgaXMgc29ydGVkLgorCisgICAgSWYgeCBpcyBhbHJlYWR5IGluIGEsIGluc2VydCBpdCB0byB0aGUgbGVmdCBvZiB0aGUgbGVmdG1vc3QgeC4KKworICAgIE9wdGlvbmFsIGFyZ3MgbG8gKGRlZmF1bHQgMCkgYW5kIGhpIChkZWZhdWx0IGxlbihhKSkgYm91bmQgdGhlCisgICAgc2xpY2Ugb2YgYSB0byBiZSBzZWFyY2hlZC4KKyAgICAiIiIKKworICAgIGlmIGxvIDwgMDoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbG8gbXVzdCBiZSBub24tbmVnYXRpdmUnKQorICAgIGlmIGhpIGlzIE5vbmU6CisgICAgICAgIGhpID0gbGVuKGEpCisgICAgd2hpbGUgbG8gPCBoaToKKyAgICAgICAgbWlkID0gKGxvK2hpKS8vMgorICAgICAgICBpZiBhW21pZF0gPCB4OiBsbyA9IG1pZCsxCisgICAgICAgIGVsc2U6IGhpID0gbWlkCisgICAgYS5pbnNlcnQobG8sIHgpCisKKworZGVmIGJpc2VjdF9sZWZ0KGEsIHgsIGxvPTAsIGhpPU5vbmUpOgorICAgICIiIlJldHVybiB0aGUgaW5kZXggd2hlcmUgdG8gaW5zZXJ0IGl0ZW0geCBpbiBsaXN0IGEsIGFzc3VtaW5nIGEgaXMgc29ydGVkLgorCisgICAgVGhlIHJldHVybiB2YWx1ZSBpIGlzIHN1Y2ggdGhhdCBhbGwgZSBpbiBhWzppXSBoYXZlIGUgPCB4LCBhbmQgYWxsIGUgaW4KKyAgICBhW2k6XSBoYXZlIGUgPj0geC4gIFNvIGlmIHggYWxyZWFkeSBhcHBlYXJzIGluIHRoZSBsaXN0LCBhLmluc2VydCh4KSB3aWxsCisgICAgaW5zZXJ0IGp1c3QgYmVmb3JlIHRoZSBsZWZ0bW9zdCB4IGFscmVhZHkgdGhlcmUuCisKKyAgICBPcHRpb25hbCBhcmdzIGxvIChkZWZhdWx0IDApIGFuZCBoaSAoZGVmYXVsdCBsZW4oYSkpIGJvdW5kIHRoZQorICAgIHNsaWNlIG9mIGEgdG8gYmUgc2VhcmNoZWQuCisgICAgIiIiCisKKyAgICBpZiBsbyA8IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xvIG11c3QgYmUgbm9uLW5lZ2F0aXZlJykKKyAgICBpZiBoaSBpcyBOb25lOgorICAgICAgICBoaSA9IGxlbihhKQorICAgIHdoaWxlIGxvIDwgaGk6CisgICAgICAgIG1pZCA9IChsbytoaSkvLzIKKyAgICAgICAgaWYgYVttaWRdIDwgeDogbG8gPSBtaWQrMQorICAgICAgICBlbHNlOiBoaSA9IG1pZAorICAgIHJldHVybiBsbworCisjIE92ZXJ3cml0ZSBhYm92ZSBkZWZpbml0aW9ucyB3aXRoIGEgZmFzdCBDIGltcGxlbWVudGF0aW9uCit0cnk6CisgICAgZnJvbSBfYmlzZWN0IGltcG9ydCAqCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9iaXNlY3QucHljIGIvbGliL3B5dGhvbjIuNy9iaXNlY3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjBmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Jpc2VjdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9iaXNlY3QucHlvIGIvbGliL3B5dGhvbjIuNy9iaXNlY3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZjBmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Jpc2VjdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNjOWMyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHkKQEAgLTAsMCArMSw0NTUgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSwgRGlnaXRhbCBDcmVhdGlvbnMsIEZyZWRlcmlja3NidXJnLCBWQSwgVVNBCisjICBhbmQgQW5kcmV3IEt1Y2hsaW5nLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjICBtZXQ6CisjCisjICAgIG8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzLgorIworIyAgICBvIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorIyAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgICAgICBkaXN0cmlidXRpb24uCisjCisjICAgIG8gTmVpdGhlciB0aGUgbmFtZSBvZiBEaWdpdGFsIENyZWF0aW9ucyBub3IgdGhlIG5hbWVzIG9mIGl0cworIyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorIyAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRElHSVRBTCBDUkVBVElPTlMgQU5EIENPTlRSSUJVVE9SUyAqQVMKKyMgIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorIyAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisjICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBESUdJVEFMCisjICBDUkVBVElPTlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorIyAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisjICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyMgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyMgIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyMgIERBTUFHRS4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIiIiU3VwcG9ydCBmb3IgQmVya2VsZXkgREIgNC4zIHRocm91Z2ggNS4zIHdpdGggYSBzaW1wbGUgaW50ZXJmYWNlLgorCitGb3IgdGhlIGZ1bGwgZmVhdHVyZWQgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSB1c2UgdGhlIGJzZGRiLmRiIG1vZHVsZQoraW5zdGVhZC4gIEl0IG1pcnJvcnMgdGhlIE9yYWNsZSBCZXJrZWxleSBEQiBDIEFQSS4KKyIiIgorCitpbXBvcnQgc3lzCithYnNvbHV0ZV9pbXBvcnQgPSAoc3lzLnZlcnNpb25faW5mb1swXSA+PSAzKQorCitpZiAoc3lzLnZlcnNpb25faW5mbyA+PSAoMiwgNikpIGFuZCAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKSkgOgorICAgIGltcG9ydCB3YXJuaW5ncworICAgIGlmIHN5cy5weTNrd2FybmluZyBhbmQgKF9fbmFtZV9fICE9ICdic2RkYjMnKSA6CisgICAgICAgIHdhcm5pbmdzLndhcm5weTNrKCJpbiAzLngsIHRoZSBic2RkYiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZDsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicGxlYXNlIHVzZSB0aGUgcHlic2RkYiBwcm9qZWN0IGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKkNPYmplY3QuKiIsIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnNkZGIuX19pbml0X18iKQorCit0cnk6CisgICAgaWYgX19uYW1lX18gPT0gJ2JzZGRiMyc6CisgICAgICAgICMgaW1wb3J0IF9weWJzZGRiIGJpbmFyeSBhcyBpdCBzaG91bGQgYmUgdGhlIG1vcmUgcmVjZW50IHZlcnNpb24gZnJvbQorICAgICAgICAjIGEgc3RhbmRhbG9uZSBweWJzZGRiIGFkZG9uIHBhY2thZ2UgdGhhbiB0aGUgdmVyc2lvbiBpbmNsdWRlZCB3aXRoCisgICAgICAgICMgcHl0aG9uIGFzIGJzZGRiLl9ic2RkYi4KKyAgICAgICAgaWYgYWJzb2x1dGVfaW1wb3J0IDoKKyAgICAgICAgICAgICMgQmVjYXVzZSB0aGlzIHN5bnRheGlzIGlzIG5vdCB2YWxpZCBiZWZvcmUgUHl0aG9uIDIuNQorICAgICAgICAgICAgZXhlYygiZnJvbSAuIGltcG9ydCBfcHlic2RkYiIpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgaW1wb3J0IF9weWJzZGRiCisgICAgICAgIF9ic2RkYiA9IF9weWJzZGRiCisgICAgICAgIGZyb20gYnNkZGIzLmRidXRpbHMgaW1wb3J0IERlYWRsb2NrV3JhcCBhcyBfRGVhZGxvY2tXcmFwCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IF9ic2RkYgorICAgICAgICBmcm9tIGJzZGRiLmRidXRpbHMgaW1wb3J0IERlYWRsb2NrV3JhcCBhcyBfRGVhZGxvY2tXcmFwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBSZW1vdmUgb3Vyc2VsdmVzIGZyb20gc3lzLm1vZHVsZXMKKyAgICBpbXBvcnQgc3lzCisgICAgZGVsIHN5cy5tb2R1bGVzW19fbmFtZV9fXQorICAgIHJhaXNlCisKKyMgYnNkZGIzIGNhbGxzIGl0IGRiLCBidXQgcHJvdmlkZSBfZGIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CitkYiA9IF9kYiA9IF9ic2RkYgorX192ZXJzaW9uX18gPSBkYi5fX3ZlcnNpb25fXworCitlcnJvciA9IGRiLkRCRXJyb3IgICMgU28gYnNkZGIuZXJyb3Igd2lsbCBtZWFuIHNvbWV0aGluZy4uLgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbXBvcnQgc3lzLCBvcworCitmcm9tIHdlYWtyZWYgaW1wb3J0IHJlZgorCitpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICBpbXBvcnQgVXNlckRpY3QKKyAgICBNdXRhYmxlTWFwcGluZyA9IFVzZXJEaWN0LkRpY3RNaXhpbgorZWxzZSA6CisgICAgaW1wb3J0IGNvbGxlY3Rpb25zCisgICAgTXV0YWJsZU1hcHBpbmcgPSBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZworCitjbGFzcyBfaXRlcl9taXhpbihNdXRhYmxlTWFwcGluZyk6CisgICAgZGVmIF9tYWtlX2l0ZXJfY3Vyc29yKHNlbGYpOgorICAgICAgICBjdXIgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGIuY3Vyc29yKQorICAgICAgICBrZXkgPSBpZChjdXIpCisgICAgICAgIHNlbGYuX2N1cnNvcl9yZWZzW2tleV0gPSByZWYoY3VyLCBzZWxmLl9nZW5fY3JlZl9jbGVhbmVyKGtleSkpCisgICAgICAgIHJldHVybiBjdXIKKworICAgIGRlZiBfZ2VuX2NyZWZfY2xlYW5lcihzZWxmLCBrZXkpOgorICAgICAgICAjIHVzZSBnZW5lcmF0ZSB0aGUgZnVuY3Rpb24gZm9yIHRoZSB3ZWFrcmVmIGNhbGxiYWNrIGhlcmUKKyAgICAgICAgIyB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QgaG9sZCBhIHN0cmljdCByZWZlcmVuY2UgdG8gY3VyCisgICAgICAgICMgaW4gdGhlIGNhbGxiYWNrLgorICAgICAgICByZXR1cm4gbGFtYmRhIHJlZjogc2VsZi5fY3Vyc29yX3JlZnMucG9wKGtleSwgTm9uZSkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF9pdGVyYXRpb24gPSBGYWxzZQorICAgICAgICBzZWxmLl9pbl9pdGVyICs9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGN1ciA9IHNlbGYuX21ha2VfaXRlcl9jdXJzb3IoKQorCisgICAgICAgICAgICAgICAgIyBGSVhNRS0yMDAzMTEwMi1ncmVnOiByYWNlIGNvbmRpdGlvbi4gIGN1cnNvciBjb3VsZAorICAgICAgICAgICAgICAgICMgYmUgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSB0aGlzIGNhbGwuCisKKyAgICAgICAgICAgICAgICAjIHNpbmNlIHdlJ3JlIG9ubHkgcmV0dXJuaW5nIGtleXMsIHdlIGNhbGwgdGhlIGN1cnNvcgorICAgICAgICAgICAgICAgICMgbWV0aG9kcyB3aXRoIGZsYWdzPTAsIGRsZW49MCwgZG9mcz0wCisgICAgICAgICAgICAgICAga2V5ID0gX0RlYWRsb2NrV3JhcChjdXIuZmlyc3QsIDAsMCwwKVswXQorICAgICAgICAgICAgICAgIHlpZWxkIGtleQorCisgICAgICAgICAgICAgICAgbmV4dCA9IGdldGF0dHIoY3VyLCAibmV4dCIpCisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gX0RlYWRsb2NrV3JhcChuZXh0LCAwLDAsMClbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGtleQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgX2JzZGRiLkRCQ3Vyc29yQ2xvc2VkRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9raWxsX2l0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0RhdGFiYXNlIGNoYW5nZWQgc2l6ZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkdXJpbmcgaXRlcmF0aW9uLicpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRklYTUUtMjAwMzExMDEtZ3JlZzogcmFjZSBjb25kaXRpb24uICBjdXJzb3IgY291bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmUgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSB0aGlzIGNhbGwuCisgICAgICAgICAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKGN1ci5zZXQsIGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBnZXRhdHRyKGN1ciwgIm5leHQiKQorICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgorICAgICAgICAgICAgICAgICMgdGhlIGRhdGFiYXNlIHdhcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiAgYWJvcnQuCisgICAgICAgICAgICAgICAgcGFzcworIyBXaGVuIFB5dGhvbiAyLjQgbm90IHN1cHBvcnRlZCBpbiBic2RkYjMsIHdlIGNhbiBjaGFuZ2UgdGhpcyB0byAiZmluYWxseSIKKyAgICAgICAgZXhjZXB0IDoKKyAgICAgICAgICAgIHNlbGYuX2luX2l0ZXIgLT0gMQorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBzZWxmLl9pbl9pdGVyIC09IDEKKworICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmRiOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2tpbGxfaXRlcmF0aW9uID0gRmFsc2UKKyAgICAgICAgc2VsZi5faW5faXRlciArPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKKworICAgICAgICAgICAgICAgICMgRklYTUUtMjAwMzExMDItZ3JlZzogcmFjZSBjb25kaXRpb24uICBjdXJzb3IgY291bGQKKyAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgorCisgICAgICAgICAgICAgICAga3YgPSBfRGVhZGxvY2tXcmFwKGN1ci5maXJzdCkKKyAgICAgICAgICAgICAgICBrZXkgPSBrdlswXQorICAgICAgICAgICAgICAgIHlpZWxkIGt2CisKKyAgICAgICAgICAgICAgICBuZXh0ID0gZ2V0YXR0cihjdXIsICJuZXh0IikKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBrdiA9IF9EZWFkbG9ja1dyYXAobmV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGt2WzBdCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBrdgorICAgICAgICAgICAgICAgICAgICBleGNlcHQgX2JzZGRiLkRCQ3Vyc29yQ2xvc2VkRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9raWxsX2l0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0RhdGFiYXNlIGNoYW5nZWQgc2l6ZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkdXJpbmcgaXRlcmF0aW9uLicpCisgICAgICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRklYTUUtMjAwMzExMDEtZ3JlZzogcmFjZSBjb25kaXRpb24uICBjdXJzb3IgY291bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYmUgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSB0aGlzIGNhbGwuCisgICAgICAgICAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKGN1ci5zZXQsIGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBnZXRhdHRyKGN1ciwgIm5leHQiKQorICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgorICAgICAgICAgICAgICAgICMgdGhlIGRhdGFiYXNlIHdhcyBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiAgYWJvcnQuCisgICAgICAgICAgICAgICAgcGFzcworIyBXaGVuIFB5dGhvbiAyLjQgbm90IHN1cHBvcnRlZCBpbiBic2RkYjMsIHdlIGNhbiBjaGFuZ2UgdGhpcyB0byAiZmluYWxseSIKKyAgICAgICAgZXhjZXB0IDoKKyAgICAgICAgICAgIHNlbGYuX2luX2l0ZXIgLT0gMQorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBzZWxmLl9pbl9pdGVyIC09IDEKKworCitjbGFzcyBfREJXaXRoQ3Vyc29yKF9pdGVyX21peGluKToKKyAgICAiIiIKKyAgICBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBEQiB0aGF0IG1ha2VzIGl0IGxvb2sgbGlrZSB0aGUgYnNkZGJvYmplY3QgaW4KKyAgICB0aGUgb2xkIG1vZHVsZS4gIEl0IHVzZXMgYSBjdXJzb3IgYXMgbmVlZGVkIHRvIHByb3ZpZGUgREIgdHJhdmVyc2FsLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYik6CisgICAgICAgIHNlbGYuZGIgPSBkYgorICAgICAgICBzZWxmLmRiLnNldF9nZXRfcmV0dXJuc19ub25lKDApCisKKyAgICAgICAgIyBGSVhNRS0yMDAzMTEwMS1ncmVnOiBJIGJlbGlldmUgdGhlcmUgaXMgc3RpbGwgdGhlIHBvdGVudGlhbAorICAgICAgICAjIGZvciBkZWFkbG9ja3MgaW4gYSBtdWx0aXRocmVhZGVkIGVudmlyb25tZW50IGlmIHNvbWVvbmUKKyAgICAgICAgIyBhdHRlbXB0cyB0byB1c2UgdGhlIGFueSBvZiB0aGUgY3Vyc29yIGludGVyZmFjZXMgaW4gb25lCisgICAgICAgICMgdGhyZWFkIHdoaWxlIGRvaW5nIGEgcHV0IG9yIGRlbGV0ZSBpbiBhbm90aGVyIHRocmVhZC4gIFRoZQorICAgICAgICAjIHJlYXNvbiBpcyB0aGF0IF9jaGVja0N1cnNvciBhbmQgX2Nsb3NlQ3Vyc29ycyBhcmUgbm90IGF0b21pYworICAgICAgICAjIG9wZXJhdGlvbnMuICBEb2luZyBvdXIgb3duIGxvY2tpbmcgYXJvdW5kIHNlbGYuZGJjLAorICAgICAgICAjIHNlbGYuc2F2ZWRfZGJjX2tleSBhbmQgc2VsZi5fY3Vyc29yX3JlZnMgY291bGQgcHJldmVudCB0aGlzLgorICAgICAgICAjIFRPRE86IEEgdGVzdCBjYXNlIGRlbW9uc3RyYXRpbmcgdGhlIHByb2JsZW0gbmVlZHMgdG8gYmUgd3JpdHRlbi4KKworICAgICAgICAjIHNlbGYuZGJjIGlzIGEgREJDdXJzb3Igb2JqZWN0IHVzZWQgdG8gaW1wbGVtZW50IHRoZQorICAgICAgICAjIGZpcnN0L25leHQvcHJldmlvdXMvbGFzdC9zZXRfbG9jYXRpb24gbWV0aG9kcy4KKyAgICAgICAgc2VsZi5kYmMgPSBOb25lCisgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IE5vbmUKKworICAgICAgICAjIGEgY29sbGVjdGlvbiBvZiBhbGwgREJDdXJzb3Igb2JqZWN0cyBjdXJyZW50bHkgYWxsb2NhdGVkCisgICAgICAgICMgYnkgdGhlIF9pdGVyX21peGluIGludGVyZmFjZS4KKyAgICAgICAgc2VsZi5fY3Vyc29yX3JlZnMgPSB7fQorICAgICAgICBzZWxmLl9pbl9pdGVyID0gMAorICAgICAgICBzZWxmLl9raWxsX2l0ZXJhdGlvbiA9IEZhbHNlCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgX2NoZWNrQ3Vyc29yKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRiYyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5kYmMgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGIuY3Vyc29yKQorICAgICAgICAgICAgaWYgc2VsZi5zYXZlZF9kYmNfa2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuc2V0LCBzZWxmLnNhdmVkX2RiY19rZXkpCisgICAgICAgICAgICAgICAgc2VsZi5zYXZlZF9kYmNfa2V5ID0gTm9uZQorCisgICAgIyBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgZm9yIGFsbCBub24tY3Vyc29yIERCIGNhbGxzIHRvIGF2b2lkCisgICAgIyBCZXJrZWxleSBEQiBkZWFkbG9ja3MgKGR1ZSB0byBiZWluZyBvcGVuZWQgd2l0aCBEQl9JTklUX0xPQ0sKKyAgICAjIGFuZCBEQl9USFJFQUQgdG8gYmUgdGhyZWFkIHNhZmUpIHdoZW4gaW50ZXJtaXhpbmcgZGF0YWJhc2UKKyAgICAjIG9wZXJhdGlvbnMgdGhhdCB1c2UgdGhlIGN1cnNvciBpbnRlcm5hbGx5IHdpdGggdGhvc2UgdGhhdCBkb24ndC4KKyAgICBkZWYgX2Nsb3NlQ3Vyc29ycyhzZWxmLCBzYXZlPTEpOgorICAgICAgICBpZiBzZWxmLmRiYzoKKyAgICAgICAgICAgIGMgPSBzZWxmLmRiYworICAgICAgICAgICAgc2VsZi5kYmMgPSBOb25lCisgICAgICAgICAgICBpZiBzYXZlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zYXZlZF9kYmNfa2V5ID0gX0RlYWRsb2NrV3JhcChjLmN1cnJlbnQsIDAsMCwwKVswXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKGMuY2xvc2UpCisgICAgICAgICAgICBkZWwgYworICAgICAgICBmb3IgY3JlZiBpbiBzZWxmLl9jdXJzb3JfcmVmcy52YWx1ZXMoKToKKyAgICAgICAgICAgIGMgPSBjcmVmKCkKKyAgICAgICAgICAgIGlmIGMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjLmNsb3NlKQorCisgICAgZGVmIF9jaGVja09wZW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGIgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiQlNEREIgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIgorCisgICAgZGVmIGlzT3BlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGIgaXMgbm90IE5vbmUKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChsYW1iZGE6IGxlbihzZWxmLmRiKSkgICMgbGVuKHNlbGYuZGIpCisKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA2KSA6CisgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKSA6CisgICAgICAgICAgICBpZiBzZWxmLmlzT3BlbigpIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwcihkaWN0KF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5pdGVtcykpKQorICAgICAgICAgICAgcmV0dXJuIHJlcHIoZGljdCgpKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKGxhbWJkYTogc2VsZi5kYltrZXldKSAgIyBzZWxmLmRiW2tleV0KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKCkKKyAgICAgICAgaWYgc2VsZi5faW5faXRlciBhbmQga2V5IG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZi5fa2lsbF9pdGVyYXRpb24gPSBUcnVlCisgICAgICAgIGRlZiB3cmFwRigpOgorICAgICAgICAgICAgc2VsZi5kYltrZXldID0gdmFsdWUKKyAgICAgICAgX0RlYWRsb2NrV3JhcCh3cmFwRikgICMgc2VsZi5kYltrZXldID0gdmFsdWUKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICBzZWxmLl9jbG9zZUN1cnNvcnMoKQorICAgICAgICBpZiBzZWxmLl9pbl9pdGVyIGFuZCBrZXkgaW4gc2VsZjoKKyAgICAgICAgICAgIHNlbGYuX2tpbGxfaXRlcmF0aW9uID0gVHJ1ZQorICAgICAgICBkZWYgd3JhcEYoKToKKyAgICAgICAgICAgIGRlbCBzZWxmLmRiW2tleV0KKyAgICAgICAgX0RlYWRsb2NrV3JhcCh3cmFwRikgICMgZGVsIHNlbGYuZGJba2V5XQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9jbG9zZUN1cnNvcnMoc2F2ZT0wKQorICAgICAgICBpZiBzZWxmLmRiYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuY2xvc2UpCisgICAgICAgIHYgPSAwCisgICAgICAgIGlmIHNlbGYuZGIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB2ID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmNsb3NlKQorICAgICAgICBzZWxmLmRiYyA9IE5vbmUKKyAgICAgICAgc2VsZi5kYiA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmtleXMpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmhhc19rZXksIGtleSkKKworICAgIGRlZiBzZXRfbG9jYXRpb24oc2VsZiwga2V5KToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiYy5zZXRfcmFuZ2UsIGtleSkKKworICAgIGRlZiBuZXh0KHNlbGYpOiAgIyBSZW5hbWVkIGJ5ICIydG8zIgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICBzZWxmLl9jaGVja0N1cnNvcigpCisgICAgICAgIHJ2ID0gX0RlYWRsb2NrV3JhcChnZXRhdHRyKHNlbGYuZGJjLCAibmV4dCIpKQorICAgICAgICByZXR1cm4gcnYKKworICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6ICAjIEZvciAiMnRvMyIgY29udmVyc2lvbgorICAgICAgICBuZXh0ID0gX19uZXh0X18KKworICAgIGRlZiBwcmV2aW91cyhzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKKyAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMucHJldikKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgZmlyc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCisgICAgICAgICMgZml4IDE3MjU4NTY6IGRvbid0IG5lZWRsZXNzbHkgdHJ5IHRvIHJlc3RvcmUgb3VyIGN1cnNvciBwb3NpdGlvbgorICAgICAgICBzZWxmLnNhdmVkX2RiY19rZXkgPSBOb25lCisgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmZpcnN0KQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBsYXN0KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICAjIGZpeCAxNzI1ODU2OiBkb24ndCBuZWVkbGVzc2x5IHRyeSB0byByZXN0b3JlIG91ciBjdXJzb3IgcG9zaXRpb24KKyAgICAgICAgc2VsZi5zYXZlZF9kYmNfa2V5ID0gTm9uZQorICAgICAgICBzZWxmLl9jaGVja0N1cnNvcigpCisgICAgICAgIHJ2ID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiYy5sYXN0KQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja09wZW4oKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLnN5bmMpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29tcGF0aWJpbGl0eSBvYmplY3QgZmFjdG9yeSBmdW5jdGlvbnMKKworZGVmIGhhc2hvcGVuKGZpbGUsIGZsYWc9J2MnLCBtb2RlPTA2NjYsIHBnc2l6ZT1Ob25lLCBmZmFjdG9yPU5vbmUsIG5lbGVtPU5vbmUsCisgICAgICAgICAgICBjYWNoZXNpemU9Tm9uZSwgbG9yZGVyPU5vbmUsIGhmbGFncz0wKToKKworICAgIGZsYWdzID0gX2NoZWNrZmxhZyhmbGFnLCBmaWxlKQorICAgIGUgPSBfb3BlbkRCRW52KGNhY2hlc2l6ZSkKKyAgICBkID0gZGIuREIoZSkKKyAgICBkLnNldF9mbGFncyhoZmxhZ3MpCisgICAgaWYgcGdzaXplIGlzIG5vdCBOb25lOiAgICBkLnNldF9wYWdlc2l6ZShwZ3NpemUpCisgICAgaWYgbG9yZGVyIGlzIG5vdCBOb25lOiAgICBkLnNldF9sb3JkZXIobG9yZGVyKQorICAgIGlmIGZmYWN0b3IgaXMgbm90IE5vbmU6ICAgZC5zZXRfaF9mZmFjdG9yKGZmYWN0b3IpCisgICAgaWYgbmVsZW0gaXMgbm90IE5vbmU6ICAgICBkLnNldF9oX25lbGVtKG5lbGVtKQorICAgIGQub3BlbihmaWxlLCBkYi5EQl9IQVNILCBmbGFncywgbW9kZSkKKyAgICByZXR1cm4gX0RCV2l0aEN1cnNvcihkKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgYnRvcGVuKGZpbGUsIGZsYWc9J2MnLCBtb2RlPTA2NjYsCisgICAgICAgICAgICBidGZsYWdzPTAsIGNhY2hlc2l6ZT1Ob25lLCBtYXhrZXlwYWdlPU5vbmUsIG1pbmtleXBhZ2U9Tm9uZSwKKyAgICAgICAgICAgIHBnc2l6ZT1Ob25lLCBsb3JkZXI9Tm9uZSk6CisKKyAgICBmbGFncyA9IF9jaGVja2ZsYWcoZmxhZywgZmlsZSkKKyAgICBlID0gX29wZW5EQkVudihjYWNoZXNpemUpCisgICAgZCA9IGRiLkRCKGUpCisgICAgaWYgcGdzaXplIGlzIG5vdCBOb25lOiBkLnNldF9wYWdlc2l6ZShwZ3NpemUpCisgICAgaWYgbG9yZGVyIGlzIG5vdCBOb25lOiBkLnNldF9sb3JkZXIobG9yZGVyKQorICAgIGQuc2V0X2ZsYWdzKGJ0ZmxhZ3MpCisgICAgaWYgbWlua2V5cGFnZSBpcyBub3QgTm9uZTogZC5zZXRfYnRfbWlua2V5KG1pbmtleXBhZ2UpCisgICAgaWYgbWF4a2V5cGFnZSBpcyBub3QgTm9uZTogZC5zZXRfYnRfbWF4a2V5KG1heGtleXBhZ2UpCisgICAgZC5vcGVuKGZpbGUsIGRiLkRCX0JUUkVFLCBmbGFncywgbW9kZSkKKyAgICByZXR1cm4gX0RCV2l0aEN1cnNvcihkKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2RlZiBybm9wZW4oZmlsZSwgZmxhZz0nYycsIG1vZGU9MDY2NiwKKyAgICAgICAgICAgIHJuZmxhZ3M9MCwgY2FjaGVzaXplPU5vbmUsIHBnc2l6ZT1Ob25lLCBsb3JkZXI9Tm9uZSwKKyAgICAgICAgICAgIHJsZW49Tm9uZSwgZGVsaW09Tm9uZSwgc291cmNlPU5vbmUsIHBhZD1Ob25lKToKKworICAgIGZsYWdzID0gX2NoZWNrZmxhZyhmbGFnLCBmaWxlKQorICAgIGUgPSBfb3BlbkRCRW52KGNhY2hlc2l6ZSkKKyAgICBkID0gZGIuREIoZSkKKyAgICBpZiBwZ3NpemUgaXMgbm90IE5vbmU6IGQuc2V0X3BhZ2VzaXplKHBnc2l6ZSkKKyAgICBpZiBsb3JkZXIgaXMgbm90IE5vbmU6IGQuc2V0X2xvcmRlcihsb3JkZXIpCisgICAgZC5zZXRfZmxhZ3Mocm5mbGFncykKKyAgICBpZiBkZWxpbSBpcyBub3QgTm9uZTogZC5zZXRfcmVfZGVsaW0oZGVsaW0pCisgICAgaWYgcmxlbiBpcyBub3QgTm9uZTogZC5zZXRfcmVfbGVuKHJsZW4pCisgICAgaWYgc291cmNlIGlzIG5vdCBOb25lOiBkLnNldF9yZV9zb3VyY2Uoc291cmNlKQorICAgIGlmIHBhZCBpcyBub3QgTm9uZTogZC5zZXRfcmVfcGFkKHBhZCkKKyAgICBkLm9wZW4oZmlsZSwgZGIuREJfUkVDTk8sIGZsYWdzLCBtb2RlKQorICAgIHJldHVybiBfREJXaXRoQ3Vyc29yKGQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBfb3BlbkRCRW52KGNhY2hlc2l6ZSk6CisgICAgZSA9IGRiLkRCRW52KCkKKyAgICBpZiBjYWNoZXNpemUgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGNhY2hlc2l6ZSA+PSAyMDQ4MDoKKyAgICAgICAgICAgIGUuc2V0X2NhY2hlc2l6ZSgwLCBjYWNoZXNpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgImNhY2hlc2l6ZSBtdXN0IGJlID49IDIwNDgwIgorICAgIGUuc2V0X2xrX2RldGVjdChkYi5EQl9MT0NLX0RFRkFVTFQpCisgICAgZS5vcGVuKCcuJywgZGIuREJfUFJJVkFURSB8IGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX0lOSVRfTVBPT0wpCisgICAgcmV0dXJuIGUKKworZGVmIF9jaGVja2ZsYWcoZmxhZywgZmlsZSk6CisgICAgaWYgZmxhZyA9PSAncic6CisgICAgICAgIGZsYWdzID0gZGIuREJfUkRPTkxZCisgICAgZWxpZiBmbGFnID09ICdydyc6CisgICAgICAgIGZsYWdzID0gMAorICAgIGVsaWYgZmxhZyA9PSAndyc6CisgICAgICAgIGZsYWdzID0gIGRiLkRCX0NSRUFURQorICAgIGVsaWYgZmxhZyA9PSAnYyc6CisgICAgICAgIGZsYWdzID0gIGRiLkRCX0NSRUFURQorICAgIGVsaWYgZmxhZyA9PSAnbic6CisgICAgICAgIGZsYWdzID0gZGIuREJfQ1JFQVRFCisgICAgICAgICNmbGFncyA9IGRiLkRCX0NSRUFURSB8IGRiLkRCX1RSVU5DQVRFCisgICAgICAgICMgd2UgdXNlZCBkYi5EQl9UUlVOQ0FURSBmbGFnIGZvciB0aGlzIGJlZm9yZSBidXQgQmVya2VsZXkgREIKKyAgICAgICAgIyA0LjIuNTIgY2hhbmdlZCB0byBkaXNhbGxvd2VkIHRydW5jYXRlIHdpdGggdHhuIGVudmlyb25tZW50cy4KKyAgICAgICAgaWYgZmlsZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5pc2ZpbGUoZmlsZSk6CisgICAgICAgICAgICBvcy51bmxpbmsoZmlsZSkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBlcnJvciwgImZsYWdzIHNob3VsZCBiZSBvbmUgb2YgJ3InLCAndycsICdjJyBvciAnbiciCisgICAgcmV0dXJuIGZsYWdzIHwgZGIuREJfVEhSRUFECisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyBUaGlzIGlzIGEgc2lsbHkgbGl0dGxlIGhhY2sgdGhhdCBhbGxvd3MgYXBwcyB0byBjb250aW51ZSB0byB1c2UgdGhlCisjIERCX1RIUkVBRCBmbGFnIGV2ZW4gb24gc3lzdGVtcyB3aXRob3V0IHRocmVhZHMgd2l0aG91dCBmcmVha2luZyBvdXQKKyMgQmVya2VsZXkgREIuCisjCisjIFRoaXMgYXNzdW1lcyB0aGF0IGlmIFB5dGhvbiB3YXMgYnVpbHQgd2l0aCB0aHJlYWQgc3VwcG9ydCB0aGVuCisjIEJlcmtlbGV5IERCIHdhcyB0b28uCisKK3RyeToKKyAgICAjIDJ0bzMgYXV0b21hdGljYWxseSBjaGFuZ2VzICJpbXBvcnQgdGhyZWFkIiB0byAiaW1wb3J0IF90aHJlYWQiCisgICAgaW1wb3J0IHRocmVhZCBhcyBUCisgICAgZGVsIFQKKworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRiLkRCX1RIUkVBRCA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlMTdmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVlMTdmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGIucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYWVlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RiLnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMSwgRGlnaXRhbCBDcmVhdGlvbnMsIEZyZWRlcmlja3NidXJnLCBWQSwgVVNBCisjICBhbmQgQW5kcmV3IEt1Y2hsaW5nLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisjICBtZXQ6CisjCisjICAgIG8gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zLCBhbmQgdGhlIGRpc2NsYWltZXIgdGhhdCBmb2xsb3dzLgorIworIyAgICBvIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgorIyAgICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyMgICAgICBkaXN0cmlidXRpb24uCisjCisjICAgIG8gTmVpdGhlciB0aGUgbmFtZSBvZiBEaWdpdGFsIENyZWF0aW9ucyBub3IgdGhlIG5hbWVzIG9mIGl0cworIyAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorIyAgICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRElHSVRBTCBDUkVBVElPTlMgQU5EIENPTlRSSUJVVE9SUyAqQVMKKyMgIElTKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRAorIyAgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCisjICBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBESUdJVEFMCisjICBDUkVBVElPTlMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCisjICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLAorIyAgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTCisjICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisjICBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IKKyMgIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUKKyMgIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKKyMgIERBTUFHRS4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIyBUaGlzIG1vZHVsZSBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHBvc3NpYmxlIGZ1dHVyZSBleHBhbnNpb24sIGluCisjIGNhc2Ugd2UgZXZlciB3YW50IHRvIGF1Z21lbnQgdGhlIHN0dWZmIGluIF9kYiBpbiBhbnkgd2F5LiAgRm9yIG5vdworIyBpdCBqdXN0IHNpbXBseSBpbXBvcnRzIGV2ZXJ5dGhpbmcgZnJvbSBfZGIuCisKK2ltcG9ydCBzeXMKK2Fic29sdXRlX2ltcG9ydCA9IChzeXMudmVyc2lvbl9pbmZvWzBdID49IDMpCisKK2lmIG5vdCBhYnNvbHV0ZV9pbXBvcnQgOgorICAgIGlmIF9fbmFtZV9fLnN0YXJ0c3dpdGgoJ2JzZGRiMy4nKSA6CisgICAgICAgICMgaW1wb3J0IF9weWJzZGRiIGJpbmFyeSBhcyBpdCBzaG91bGQgYmUgdGhlIG1vcmUgcmVjZW50IHZlcnNpb24gZnJvbQorICAgICAgICAjIGEgc3RhbmRhbG9uZSBweWJzZGRiIGFkZG9uIHBhY2thZ2UgdGhhbiB0aGUgdmVyc2lvbiBpbmNsdWRlZCB3aXRoCisgICAgICAgICMgcHl0aG9uIGFzIGJzZGRiLl9ic2RkYi4KKyAgICAgICAgZnJvbSBfcHlic2RkYiBpbXBvcnQgKgorICAgICAgICBmcm9tIF9weWJzZGRiIGltcG9ydCBfX3ZlcnNpb25fXworICAgIGVsc2U6CisgICAgICAgIGZyb20gX2JzZGRiIGltcG9ydCAqCisgICAgICAgIGZyb20gX2JzZGRiIGltcG9ydCBfX3ZlcnNpb25fXworZWxzZSA6CisgICAgIyBCZWNhdXNlIHRoaXMgc3ludGF4aXMgaXMgbm90IHZhbGlkIGJlZm9yZSBQeXRob24gMi41CisgICAgaWYgX19uYW1lX18uc3RhcnRzd2l0aCgnYnNkZGIzLicpIDoKKyAgICAgICAgZXhlYygiZnJvbSAuX3B5YnNkZGIgaW1wb3J0ICoiKQorICAgICAgICBleGVjKCJmcm9tIC5fcHlic2RkYiBpbXBvcnQgX192ZXJzaW9uX18iKQorICAgIGVsc2UgOgorICAgICAgICBleGVjKCJmcm9tIC5fYnNkZGIgaW1wb3J0ICoiKQorICAgICAgICBleGVjKCJmcm9tIC5fYnNkZGIgaW1wb3J0IF9fdmVyc2lvbl9fIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGIucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZmZmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGIucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZmZmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJvYmoucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL2Rib2JqLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDBmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2Rib2JqLnB5CkBAIC0wLDAgKzEsMjY2IEBACisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgVGhpcyBmaWxlIGNvbnRhaW5zIHJlYWwgUHl0aG9uIG9iamVjdCB3cmFwcGVycyBmb3IgREIgYW5kIERCRW52CisjICBDICJvYmplY3RzIiB0aGF0IGNhbiBiZSB1c2VmdWxseSBzdWJjbGFzc2VkLiAgVGhlIHByZXZpb3VzIFNXSUcKKyMgIGJhc2VkIGludGVyZmFjZSBhbGxvd2VkIHRoaXMgdGhhbmtzIHRvIFNXSUcncyBzaGFkb3cgY2xhc3Nlcy4KKyMgICAtLSAgR3JlZ29yeSBQLiBTbWl0aAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgKEMpIENvcHlyaWdodCAyMDAxICBBdXRvbm9tb3VzIFpvbmUgSW5kdXN0cmllcworIworIyBMaWNlbnNlOiAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiAgWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisjICAgICAgICAgICBwdXJwb3NlIGluY2x1ZGluZyBtb2RpZmljYXRpb24vcmVkaXN0cmlidXRpb24sIHNvIGxvbmcgYXMKKyMgICAgICAgICAgIHRoaXMgaGVhZGVyIHJlbWFpbnMgaW50YWN0IGFuZCB0aGF0IHlvdSBkbyBub3QgY2xhaW0gYW55CisjICAgICAgICAgICByaWdodHMgb2Ygb3duZXJzaGlwIG9yIGF1dGhvcnNoaXAgb2YgdGhpcyBzb2Z0d2FyZS4gIFRoaXMKKyMgICAgICAgICAgIHNvZnR3YXJlIGhhcyBiZWVuIHRlc3RlZCwgYnV0IG5vIHdhcnJhbnR5IGlzIGV4cHJlc3NlZCBvcgorIyAgICAgICAgICAgaW1wbGllZC4KKyMKKworIworIyBUT0RPIGl0IHdvdWxkIGJlICpyZWFsbHkgbmljZSogdG8gaGF2ZSBhbiBhdXRvbWF0aWMgc2hhZG93IGNsYXNzIHBvcHVsYXRvcgorIyBzbyB0aGF0IG5ldyBtZXRob2RzIGRvbid0IG5lZWQgdG8gYmUgYWRkZWQgIGhlcmUgbWFudWFsbHkgYWZ0ZXIgYmVpbmcKKyMgYWRkZWQgdG8gX2JzZGRiLmMuCisjCisKK2ltcG9ydCBzeXMKK2Fic29sdXRlX2ltcG9ydCA9IChzeXMudmVyc2lvbl9pbmZvWzBdID49IDMpCitpZiBhYnNvbHV0ZV9pbXBvcnQgOgorICAgICMgQmVjYXVzZSB0aGlzIHN5bnRheGlzIGlzIG5vdCB2YWxpZCBiZWZvcmUgUHl0aG9uIDIuNQorICAgIGV4ZWMoImZyb20gLiBpbXBvcnQgZGIiKQorZWxzZSA6CisgICAgaW1wb3J0IGRiCisKK2lmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgIGZyb20gVXNlckRpY3QgaW1wb3J0IERpY3RNaXhpbiBhcyBNdXRhYmxlTWFwcGluZworZWxzZSA6CisgICAgaW1wb3J0IGNvbGxlY3Rpb25zCisgICAgTXV0YWJsZU1hcHBpbmcgPSBjb2xsZWN0aW9ucy5NdXRhYmxlTWFwcGluZworCitjbGFzcyBEQkVudjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5fY29iaiA9IGRiLkRCRW52KCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBjbG9zZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5jbG9zZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoub3BlbigqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHJlbW92ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5yZW1vdmUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfc2htX2tleShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfc2htX2tleSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9jYWNoZXNpemUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2NhY2hlc2l6ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9kYXRhX2RpcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfZGF0YV9kaXIoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfZmxhZ3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2ZsYWdzKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2xnX2JzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sZ19ic2l6ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sZ19kaXIoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xnX2RpcigqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sZ19tYXgoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xnX21heCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sa19kZXRlY3Qoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2xrX2RldGVjdCgqYXJncywgKiprd2FyZ3MpCisgICAgaWYgZGIudmVyc2lvbigpIDwgKDQsNSk6CisgICAgICAgIGRlZiBzZXRfbGtfbWF4KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfbGtfbWF4KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2xrX21heF9sb2NrcyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfbGtfbWF4X2xvY2tzKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2xrX21heF9sb2NrZXJzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9sa19tYXhfbG9ja2VycygqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9sa19tYXhfb2JqZWN0cyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfbGtfbWF4X29iamVjdHMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfbXBfbW1hcHNpemUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X21wX21tYXBzaXplKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3RpbWVvdXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X3RpbWVvdXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfdG1wX2RpcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfdG1wX2RpcigqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHR4bl9iZWdpbihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai50eG5fYmVnaW4oKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiB0eG5fY2hlY2twb2ludChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai50eG5fY2hlY2twb2ludCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHR4bl9zdGF0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnR4bl9zdGF0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3R4X21heChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfdHhfbWF4KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3R4X3RpbWVzdGFtcChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfdHhfdGltZXN0YW1wKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgbG9ja19kZXRlY3Qoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoubG9ja19kZXRlY3QoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBsb2NrX2dldChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5sb2NrX2dldCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGxvY2tfaWQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoubG9ja19pZCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGxvY2tfcHV0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmxvY2tfcHV0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgbG9ja19zdGF0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmxvY2tfc3RhdCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGxvZ19hcmNoaXZlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmxvZ19hcmNoaXZlKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBzZXRfZ2V0X3JldHVybnNfbm9uZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfZ2V0X3JldHVybnNfbm9uZSgqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgbG9nX3N0YXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoubG9nX3N0YXQoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGRicmVtb3ZlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmRicmVtb3ZlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgZGJyZW5hbWUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouZGJyZW5hbWUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfZW5jcnlwdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfZW5jcnlwdCgqYXJncywgKiprd2FyZ3MpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNCk6CisgICAgICAgIGRlZiBmaWxlaWRfcmVzZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmZpbGVpZF9yZXNldCgqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgZGVmIGxzbl9yZXNldChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoubHNuX3Jlc2V0KCphcmdzLCAqKmt3YXJncykKKworCitjbGFzcyBEQihNdXRhYmxlTWFwcGluZyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRiZW52LCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAjIGdpdmUgaXQgdGhlIHByb3BlciBEQkVudiBDIG9iamVjdCB0aGF0IGl0cyBleHBlY3RpbmcKKyAgICAgICAgc2VsZi5fY29iaiA9IGRiLkRCKCooKGRiZW52Ll9jb2JqLCkgKyBhcmdzKSwgKiprd2FyZ3MpCisKKyAgICAjIFRPRE8gYXJlIHRoZXJlIG90aGVyIGRpY3QgbWV0aG9kcyB0aGF0IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbj8KKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9jb2JqKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBhcmcpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29ialthcmddCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLl9jb2JqW2tleV0gPSB2YWx1ZQorICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBhcmcpOgorICAgICAgICBkZWwgc2VsZi5fY29ialthcmddCisKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA2KSA6CisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29iai5fX2l0ZXJfXygpCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmFwcGVuZCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGFzc29jaWF0ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5hc3NvY2lhdGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjbG9zZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5jbG9zZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGNvbnN1bWUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouY29uc3VtZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGNvbnN1bWVfd2FpdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5jb25zdW1lX3dhaXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBjdXJzb3Ioc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouY3Vyc29yKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgZGVsZXRlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmRlbGV0ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGZkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmZkKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgZ2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHBnZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoucGdldCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF9ib3RoKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF9ib3RoKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgZ2V0X2J5dGVzd2FwcGVkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF9ieXRlc3dhcHBlZCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF9zaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldF9zaXplKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgZ2V0X3R5cGUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouZ2V0X3R5cGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBqb2luKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmpvaW4oKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBrZXlfcmFuZ2Uoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoua2V5X3JhbmdlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgaGFzX2tleShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5oYXNfa2V5KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgaXRlbXMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouaXRlbXMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBrZXlzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmtleXMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBvcGVuKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLm9wZW4oKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBwdXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoucHV0KCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgcmVtb3ZlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnJlbW92ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHJlbmFtZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5yZW5hbWUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfYnRfbWlua2V5KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9idF9taW5rZXkoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfYnRfY29tcGFyZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfYnRfY29tcGFyZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9jYWNoZXNpemUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2NhY2hlc2l6ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9kdXBfY29tcGFyZShzZWxmLCAqYXJncywgKiprd2FyZ3MpIDoKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2R1cF9jb21wYXJlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2ZsYWdzKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9mbGFncygqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9oX2ZmYWN0b3Ioc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2hfZmZhY3RvcigqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9oX25lbGVtKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9oX25lbGVtKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X2xvcmRlcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfbG9yZGVyKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3BhZ2VzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9wYWdlc2l6ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9yZV9kZWxpbShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfcmVfZGVsaW0oKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfcmVfbGVuKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9yZV9sZW4oKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfcmVfcGFkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9yZV9wYWQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfcmVfc291cmNlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9yZV9zb3VyY2UoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfcV9leHRlbnRzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9xX2V4dGVudHNpemUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzdGF0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnN0YXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzeW5jKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnN5bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiB0eXBlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnR5cGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiB1cGdyYWRlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnVwZ3JhZGUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiB2YWx1ZXMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoudmFsdWVzKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgdmVyaWZ5KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnZlcmlmeSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHNldF9nZXRfcmV0dXJuc19ub25lKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9nZXRfcmV0dXJuc19ub25lKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBzZXRfZW5jcnlwdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5zZXRfZW5jcnlwdCgqYXJncywgKiprd2FyZ3MpCisKKworY2xhc3MgREJTZXF1ZW5jZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5fY29iaiA9IGRiLkRCU2VxdWVuY2UoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGNsb3NlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmNsb3NlKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgZ2V0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLmdldCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF9kYnAoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouZ2V0X2RicCgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF9rZXkoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouZ2V0X2tleSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGluaXRfdmFsdWUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouaW5pdF92YWx1ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmoub3BlbigqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIHJlbW92ZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5yZW1vdmUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzdGF0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnN0YXQoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfY2FjaGVzaXplKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9jYWNoZXNpemUoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBzZXRfZmxhZ3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouc2V0X2ZsYWdzKCphcmdzLCAqKmt3YXJncykKKyAgICBkZWYgc2V0X3JhbmdlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2JqLnNldF9yYW5nZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF9jYWNoZXNpemUoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouZ2V0X2NhY2hlc2l6ZSgqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIGdldF9mbGFncyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29iai5nZXRfZmxhZ3MoKmFyZ3MsICoqa3dhcmdzKQorICAgIGRlZiBnZXRfcmFuZ2Uoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvYmouZ2V0X3JhbmdlKCphcmdzLCAqKmt3YXJncykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJvYmoucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYm9iai5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNmI0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJvYmoucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJvYmoucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYm9iai5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkNmI0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJvYmoucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJyZWNpby5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJyZWNpby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDM5ZjMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnJlY2lvLnB5CkBAIC0wLDAgKzEsMTkwIEBACisKKyIiIgorRmlsZS1saWtlIG9iamVjdHMgdGhhdCByZWFkIGZyb20gb3Igd3JpdGUgdG8gYSBic2RkYiByZWNvcmQuCisKK1RoaXMgaW1wbGVtZW50cyAobmVhcmx5KSBhbGwgc3RkaW8gbWV0aG9kcy4KKworZiA9IERCUmVjSU8oZGIsIGtleSwgdHhuPU5vbmUpCitmLmNsb3NlKCkgICAgICAgICAgICMgZXhwbGljaXRseSByZWxlYXNlIHJlc291cmNlcyBoZWxkCitmbGFnID0gZi5pc2F0dHkoKSAgICMgYWx3YXlzIGZhbHNlCitwb3MgPSBmLnRlbGwoKSAgICAgICMgZ2V0IGN1cnJlbnQgcG9zaXRpb24KK2Yuc2Vlayhwb3MpICAgICAgICAgIyBzZXQgY3VycmVudCBwb3NpdGlvbgorZi5zZWVrKHBvcywgbW9kZSkgICAjIG1vZGUgMDogYWJzb2x1dGU7IDE6IHJlbGF0aXZlOyAyOiByZWxhdGl2ZSB0byBFT0YKK2J1ZiA9IGYucmVhZCgpICAgICAgIyByZWFkIHVudGlsIEVPRgorYnVmID0gZi5yZWFkKG4pICAgICAjIHJlYWQgdXAgdG8gbiBieXRlcworZi50cnVuY2F0ZShbc2l6ZV0pICAjIHRydW5jYXRlIGZpbGUgYXQgdG8gYXQgbW9zdCBzaXplIChkZWZhdWx0OiBjdXJyZW50IHBvcykKK2Yud3JpdGUoYnVmKSAgICAgICAgIyB3cml0ZSBhdCBjdXJyZW50IHBvc2l0aW9uCitmLndyaXRlbGluZXMobGlzdCkgICMgZm9yIGxpbmUgaW4gbGlzdDogZi53cml0ZShsaW5lKQorCitOb3RlczoKKy0gZmlsZW5vKCkgaXMgbGVmdCB1bmltcGxlbWVudGVkIHNvIHRoYXQgY29kZSB3aGljaCB1c2VzIGl0IHRyaWdnZXJzCisgIGFuIGV4Y2VwdGlvbiBlYXJseS4KKy0gVGhlcmUncyBhIHNpbXBsZSB0ZXN0IHNldCAoc2VlIGVuZCBvZiB0aGlzIGZpbGUpIC0gbm90IHlldCB1cGRhdGVkCisgIGZvciBEQlJlY0lPLgorLSByZWFkbGluZSgpIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCisKKworRnJvbToKKyAgICBJdGFtYXIgU2h0dWxsLVRyYXVyaW5nIDxpdGFtYXJAbWF4bm0uY29tPgorIiIiCisKK2ltcG9ydCBlcnJubworaW1wb3J0IHN0cmluZworCitjbGFzcyBEQlJlY0lPOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYiwga2V5LCB0eG49Tm9uZSk6CisgICAgICAgIHNlbGYuZGIgPSBkYgorICAgICAgICBzZWxmLmtleSA9IGtleQorICAgICAgICBzZWxmLnR4biA9IHR4bgorICAgICAgICBzZWxmLmxlbiA9IE5vbmUKKyAgICAgICAgc2VsZi5wb3MgPSAwCisgICAgICAgIHNlbGYuY2xvc2VkID0gMAorICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IDAKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSAxCisgICAgICAgICAgICBkZWwgc2VsZi5kYiwgc2VsZi50eG4KKworICAgIGRlZiBpc2F0dHkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIG1vZGUgPSAwKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgaWYgbW9kZSA9PSAxOgorICAgICAgICAgICAgcG9zID0gcG9zICsgc2VsZi5wb3MKKyAgICAgICAgZWxpZiBtb2RlID09IDI6CisgICAgICAgICAgICBwb3MgPSBwb3MgKyBzZWxmLmxlbgorICAgICAgICBzZWxmLnBvcyA9IG1heCgwLCBwb3MpCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgcmV0dXJuIHNlbGYucG9zCisKKyAgICBkZWYgcmVhZChzZWxmLCBuID0gLTEpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorICAgICAgICBpZiBuIDwgMDoKKyAgICAgICAgICAgIG5ld3BvcyA9IHNlbGYubGVuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdwb3MgPSBtaW4oc2VsZi5wb3Mrbiwgc2VsZi5sZW4pCisKKyAgICAgICAgZGxlbiA9IG5ld3BvcyAtIHNlbGYucG9zCisKKyAgICAgICAgciA9IHNlbGYuZGIuZ2V0KHNlbGYua2V5LCB0eG49c2VsZi50eG4sIGRsZW49ZGxlbiwgZG9mZj1zZWxmLnBvcykKKyAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3MKKyAgICAgICAgcmV0dXJuIHIKKworICAgIF9fZml4bWUgPSAiIiIKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgbGVuZ3RoPU5vbmUpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorICAgICAgICBpZiBzZWxmLmJ1Zmxpc3Q6CisgICAgICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmICsgc3RyaW5nLmpvaW5maWVsZHMoc2VsZi5idWZsaXN0LCAnJykKKyAgICAgICAgICAgIHNlbGYuYnVmbGlzdCA9IFtdCisgICAgICAgIGkgPSBzdHJpbmcuZmluZChzZWxmLmJ1ZiwgJ1xuJywgc2VsZi5wb3MpCisgICAgICAgIGlmIGkgPCAwOgorICAgICAgICAgICAgbmV3cG9zID0gc2VsZi5sZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld3BvcyA9IGkrMQorICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnBvcyArIGxlbmd0aCA8IG5ld3BvczoKKyAgICAgICAgICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbmd0aAorICAgICAgICByID0gc2VsZi5idWZbc2VsZi5wb3M6bmV3cG9zXQorICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcworICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludCA9IDApOgorICAgICAgICB0b3RhbCA9IDAKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIHdoaWxlIGxpbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIHRvdGFsICs9IGxlbihsaW5lKQorICAgICAgICAgICAgaWYgMCA8IHNpemVoaW50IDw9IHRvdGFsOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIHJldHVybiBsaW5lcworICAgICIiIgorCisgICAgZGVmIHRydW5jYXRlKHNlbGYsIHNpemU9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLnBvcworICAgICAgICBlbGlmIHNpemUgPCAwOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcihlcnJuby5FSU5WQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOZWdhdGl2ZSBzaXplIG5vdCBhbGxvd2VkIikKKyAgICAgICAgZWxpZiBzaXplIDwgc2VsZi5wb3M6CisgICAgICAgICAgICBzZWxmLnBvcyA9IHNpemUKKyAgICAgICAgc2VsZi5kYi5wdXQoc2VsZi5rZXksICIiLCB0eG49c2VsZi50eG4sIGRsZW49c2VsZi5sZW4tc2l6ZSwgZG9mZj1zaXplKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorICAgICAgICBpZiBub3QgczogcmV0dXJuCisgICAgICAgIGlmIHNlbGYucG9zID4gc2VsZi5sZW46CisgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKCdcMCcqKHNlbGYucG9zIC0gc2VsZi5sZW4pKQorICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcworICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbihzKQorICAgICAgICBzZWxmLmRiLnB1dChzZWxmLmtleSwgcywgdHhuPXNlbGYudHhuLCBkbGVuPWxlbihzKSwgZG9mZj1zZWxmLnBvcykKKyAgICAgICAgc2VsZi5wb3MgPSBuZXdwb3MKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGxpc3QpOgorICAgICAgICBzZWxmLndyaXRlKHN0cmluZy5qb2luZmllbGRzKGxpc3QsICcnKSkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKworCisiIiIKKyMgQSBsaXR0bGUgdGVzdCBzdWl0ZQorCitkZWYgX3Rlc3QoKToKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMV0KKyAgICBlbHNlOgorICAgICAgICBmaWxlID0gJy9ldGMvcGFzc3dkJworICAgIGxpbmVzID0gb3BlbihmaWxlLCAncicpLnJlYWRsaW5lcygpCisgICAgdGV4dCA9IG9wZW4oZmlsZSwgJ3InKS5yZWFkKCkKKyAgICBmID0gU3RyaW5nSU8oKQorICAgIGZvciBsaW5lIGluIGxpbmVzWzotMl06CisgICAgICAgIGYud3JpdGUobGluZSkKKyAgICBmLndyaXRlbGluZXMobGluZXNbLTI6XSkKKyAgICBpZiBmLmdldHZhbHVlKCkgIT0gdGV4dDoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnd3JpdGUgZmFpbGVkJworICAgIGxlbmd0aCA9IGYudGVsbCgpCisgICAgcHJpbnQgJ0ZpbGUgbGVuZ3RoID0nLCBsZW5ndGgKKyAgICBmLnNlZWsobGVuKGxpbmVzWzBdKSkKKyAgICBmLndyaXRlKGxpbmVzWzFdKQorICAgIGYuc2VlaygwKQorICAgIHByaW50ICdGaXJzdCBsaW5lID0nLCByZXByKGYucmVhZGxpbmUoKSkKKyAgICBoZXJlID0gZi50ZWxsKCkKKyAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgcHJpbnQgJ1NlY29uZCBsaW5lID0nLCByZXByKGxpbmUpCisgICAgZi5zZWVrKC1sZW4obGluZSksIDEpCisgICAgbGluZTIgPSBmLnJlYWQobGVuKGxpbmUpKQorICAgIGlmIGxpbmUgIT0gbGluZTI6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2JhZCByZXN1bHQgYWZ0ZXIgc2VlayBiYWNrJworICAgIGYuc2VlayhsZW4obGluZTIpLCAxKQorICAgIGxpc3QgPSBmLnJlYWRsaW5lcygpCisgICAgbGluZSA9IGxpc3RbLTFdCisgICAgZi5zZWVrKGYudGVsbCgpIC0gbGVuKGxpbmUpKQorICAgIGxpbmUyID0gZi5yZWFkKCkKKyAgICBpZiBsaW5lICE9IGxpbmUyOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdiYWQgcmVzdWx0IGFmdGVyIHNlZWsgYmFjayBmcm9tIEVPRicKKyAgICBwcmludCAnUmVhZCcsIGxlbihsaXN0KSwgJ21vcmUgbGluZXMnCisgICAgcHJpbnQgJ0ZpbGUgbGVuZ3RoID0nLCBmLnRlbGwoKQorICAgIGlmIGYudGVsbCgpICE9IGxlbmd0aDoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnYmFkIGxlbmd0aCcKKyAgICBmLmNsb3NlKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCisiIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJyZWNpby5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTRhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJyZWNpby5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTRhYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RicmVjaW8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvZGJzaGVsdmUucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL2Ric2hlbHZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZGViMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2Ric2hlbHZlLnB5CkBAIC0wLDAgKzEsMzgyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxIGJ5IFRvdGFsIENvbnRyb2wgU29mdHdhcmUKKyMgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBNb2R1bGUgTmFtZTogIGRiU2hlbHZlLnB5CisjCisjIERlc2NyaXB0aW9uOiAgQSByZWltcGxlbWVudGF0aW9uIG9mIHRoZSBzdGFuZGFyZCBzaGVsdmUucHkgdGhhdAorIyAgICAgICAgICAgICAgIGZvcmNlcyB0aGUgdXNlIG9mIGNQaWNrbGUsIGFuZCBEQi4KKyMKKyMgQ3JlYXRpb24gRGF0ZTogICAgMTEvMy85NyAzOjM5OjA0UE0KKyMKKyMgTGljZW5zZTogICAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuICBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyMgICAgICAgICAgICAgICBwdXJwb3NlIGluY2x1ZGluZyBtb2RpZmljYXRpb24vcmVkaXN0cmlidXRpb24sIHNvIGxvbmcgYXMKKyMgICAgICAgICAgICAgICB0aGlzIGhlYWRlciByZW1haW5zIGludGFjdCBhbmQgdGhhdCB5b3UgZG8gbm90IGNsYWltIGFueQorIyAgICAgICAgICAgICAgIHJpZ2h0cyBvZiBvd25lcnNoaXAgb3IgYXV0aG9yc2hpcCBvZiB0aGlzIHNvZnR3YXJlLiAgVGhpcworIyAgICAgICAgICAgICAgIHNvZnR3YXJlIGhhcyBiZWVuIHRlc3RlZCwgYnV0IG5vIHdhcnJhbnR5IGlzIGV4cHJlc3NlZCBvcgorIyAgICAgICAgICAgICAgIGltcGxpZWQuCisjCisjIDEzLURlYy0yMDAwOiAgVXBkYXRlZCB0byBiZSB1c2VkIHdpdGggdGhlIG5ldyBic2RkYjMgcGFja2FnZS4KKyMgICAgICAgICAgICAgICBBZGRlZCBEQlNoZWxmQ3Vyc29yIGNsYXNzLgorIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisiIiJNYW5hZ2Ugc2hlbHZlcyBvZiBwaWNrbGVkIG9iamVjdHMgdXNpbmcgYnNkZGIgZGF0YWJhc2UgZmlsZXMgZm9yIHRoZQorc3RvcmFnZS4KKyIiIgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ltcG9ydCBzeXMKK2Fic29sdXRlX2ltcG9ydCA9IChzeXMudmVyc2lvbl9pbmZvWzBdID49IDMpCitpZiBhYnNvbHV0ZV9pbXBvcnQgOgorICAgICMgQmVjYXVzZSB0aGlzIHN5bnRheGlzIGlzIG5vdCB2YWxpZCBiZWZvcmUgUHl0aG9uIDIuNQorICAgIGV4ZWMoImZyb20gLiBpbXBvcnQgZGIiKQorZWxzZSA6CisgICAgaW1wb3J0IGRiCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgaW1wb3J0IGNQaWNrbGUgICMgV2lsbCBiZSBjb252ZXJ0ZWQgdG8gInBpY2tsZSIgYnkgIjJ0bzMiCitlbHNlIDoKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICBlbHNlIDoKKyAgICAgICAgIyBXaGVuIHdlIGRyb3Agc3VwcG9ydCBmb3IgcHl0aG9uIDIuNAorICAgICAgICAjIHdlIGNvdWxkIHVzZTogKGluIDIuNSB3ZSBuZWVkIGEgX19mdXR1cmVfXyBzdGF0ZW1lbnQpCisgICAgICAgICMKKyAgICAgICAgIyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICMgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKC4uLikKKyAgICAgICAgIyAgICAgICAgLi4uCisgICAgICAgICMKKyAgICAgICAgIyBXZSBjYW4gbm90IHVzZSAid2l0aCIgYXMgaXMsIGJlY2F1c2UgaXQgd291bGQgYmUgaW52YWxpZCBzeW50YXgKKyAgICAgICAgIyBpbiBweXRob24gMi40IGFuZCAod2l0aCBubyBfX2Z1dHVyZV9fKSAyLjUuCisgICAgICAgICMgSGVyZSB3ZSBzaW11bGF0ZSAid2l0aCIgZm9sbG93aW5nIFBFUCAzNDMgOgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgdyA9IHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCkKKyAgICAgICAgdy5fX2VudGVyX18oKQorICAgICAgICB0cnkgOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2lnbm9yZScsCisgICAgICAgICAgICAgICAgbWVzc2FnZT0ndGhlIGNQaWNrbGUgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCcsCisgICAgICAgICAgICAgICAgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICAgICAgZmluYWxseSA6CisgICAgICAgICAgICB3Ll9fZXhpdF9fKCkKKyAgICAgICAgZGVsIHcKKworSElHSEVTVF9QUk9UT0NPTCA9IGNQaWNrbGUuSElHSEVTVF9QUk9UT0NPTAorZGVmIF9kdW1wcyhvYmplY3QsIHByb3RvY29sKToKKyAgICByZXR1cm4gY1BpY2tsZS5kdW1wcyhvYmplY3QsIHByb3RvY29sPXByb3RvY29sKQorCitpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICBmcm9tIFVzZXJEaWN0IGltcG9ydCBEaWN0TWl4aW4gYXMgTXV0YWJsZU1hcHBpbmcKK2Vsc2UgOgorICAgIGltcG9ydCBjb2xsZWN0aW9ucworICAgIE11dGFibGVNYXBwaW5nID0gY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2RlZiBvcGVuKGZpbGVuYW1lLCBmbGFncz1kYi5EQl9DUkVBVEUsIG1vZGU9MDY2MCwgZmlsZXR5cGU9ZGIuREJfSEFTSCwKKyAgICAgICAgIGRiZW52PU5vbmUsIGRibmFtZT1Ob25lKToKKyAgICAiIiIKKyAgICBBIHNpbXBsZSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHN0YW5kYXJkCisgICAgc2hsZXZlLnB5IG1vZHVsZS4gIEl0IGNhbiBiZSB1c2VkIGxpa2UgdGhpcywgd2hlcmUga2V5IGlzIGEgc3RyaW5nCisgICAgYW5kIGRhdGEgaXMgYSBwaWNrbGVhYmxlIG9iamVjdDoKKworICAgICAgICBmcm9tIGJzZGRiIGltcG9ydCBkYnNoZWx2ZQorICAgICAgICBkYiA9IGRic2hlbHZlLm9wZW4oZmlsZW5hbWUpCisKKyAgICAgICAgZGJba2V5XSA9IGRhdGEKKworICAgICAgICBkYi5jbG9zZSgpCisgICAgIiIiCisgICAgaWYgdHlwZShmbGFncykgPT0gdHlwZSgnJyk6CisgICAgICAgIHNmbGFnID0gZmxhZ3MKKyAgICAgICAgaWYgc2ZsYWcgPT0gJ3InOgorICAgICAgICAgICAgZmxhZ3MgPSBkYi5EQl9SRE9OTFkKKyAgICAgICAgZWxpZiBzZmxhZyA9PSAncncnOgorICAgICAgICAgICAgZmxhZ3MgPSAwCisgICAgICAgIGVsaWYgc2ZsYWcgPT0gJ3cnOgorICAgICAgICAgICAgZmxhZ3MgPSAgZGIuREJfQ1JFQVRFCisgICAgICAgIGVsaWYgc2ZsYWcgPT0gJ2MnOgorICAgICAgICAgICAgZmxhZ3MgPSAgZGIuREJfQ1JFQVRFCisgICAgICAgIGVsaWYgc2ZsYWcgPT0gJ24nOgorICAgICAgICAgICAgZmxhZ3MgPSBkYi5EQl9UUlVOQ0FURSB8IGRiLkRCX0NSRUFURQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZGIuREJFcnJvciwgImZsYWdzIHNob3VsZCBiZSBvbmUgb2YgJ3InLCAndycsICdjJyBvciAnbicgb3IgdXNlIHRoZSBic2RkYi5kYi5EQl8qIGZsYWdzIgorCisgICAgZCA9IERCU2hlbGYoZGJlbnYpCisgICAgZC5vcGVuKGZpbGVuYW1lLCBkYm5hbWUsIGZpbGV0eXBlLCBmbGFncywgbW9kZSkKKyAgICByZXR1cm4gZAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERCU2hlbHZlRXJyb3IoZGIuREJFcnJvcik6IHBhc3MKKworCitjbGFzcyBEQlNoZWxmKE11dGFibGVNYXBwaW5nKToKKyAgICAiIiJBIHNoZWxmIHRvIGhvbGQgcGlja2xlZCBvYmplY3RzLCBidWlsdCB1cG9uIGEgYnNkZGIgREIgb2JqZWN0LiAgSXQKKyAgICBhdXRvbWF0aWNhbGx5IHBpY2tsZXMvdW5waWNrbGVzIGRhdGEgb2JqZWN0cyBnb2luZyB0by9mcm9tIHRoZSBEQi4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGJlbnY9Tm9uZSk6CisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihkYmVudikKKyAgICAgICAgc2VsZi5fY2xvc2VkID0gVHJ1ZQorICAgICAgICBpZiBISUdIRVNUX1BST1RPQ09MOgorICAgICAgICAgICAgc2VsZi5wcm90b2NvbCA9IEhJR0hFU1RfUFJPVE9DT0wKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJvdG9jb2wgPSAxCisKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJNYW55IG1ldGhvZHMgd2UgY2FuIGp1c3QgcGFzcyB0aHJvdWdoIHRvIHRoZSBEQiBvYmplY3QuCisgICAgICAgIChTZWUgYmVsb3cpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmRiLCBuYW1lKQorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIERpY3Rpb25hcnkgYWNjZXNzIG1ldGhvZHMKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGIpCisKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBkYXRhID0gc2VsZi5kYltrZXldCisgICAgICAgIHJldHVybiBjUGlja2xlLmxvYWRzKGRhdGEpCisKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgZGF0YSA9IF9kdW1wcyh2YWx1ZSwgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgc2VsZi5kYltrZXldID0gZGF0YQorCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgZGVsIHNlbGYuZGJba2V5XQorCisKKyAgICBkZWYga2V5cyhzZWxmLCB0eG49Tm9uZSk6CisgICAgICAgIGlmIHR4biBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRiLmtleXModHhuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGIua2V5cygpCisKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA2KSA6CisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKSA6ICAjIFhYWDogTG9hZCBhbGwga2V5cyBpbiBtZW1vcnkgOi0oCisgICAgICAgICAgICBmb3IgayBpbiBzZWxmLmRiLmtleXMoKSA6CisgICAgICAgICAgICAgICAgeWllbGQgaworCisgICAgICAgICMgRG8gdGhpcyB3aGVuICJEQiIgIHN1cHBvcnQgaXRlcmF0aW9uCisgICAgICAgICMgT3IgaXMgaXQgZW5vdWdoIHRvIHBhc3MgdGhydSAiZ2V0YXR0ciI/CisgICAgICAgICMKKyAgICAgICAgIyBkZWYgX19pdGVyX18oc2VsZikgOgorICAgICAgICAjICAgIHJldHVybiBzZWxmLmRiLl9faXRlcl9fKCkKKworCisgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5kYi5vcGVuKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKKworCisgICAgZGVmIGNsb3NlKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuZGIuY2xvc2UoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLl9jbG9zZWQgPSBUcnVlCisKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgorICAgICAgICAgICAgcmV0dXJuICc8REJTaGVsZiBAIDB4JXggLSBjbG9zZWQ+JyAlIChpZChzZWxmKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByZXByKGRpY3Qoc2VsZi5pdGVyaXRlbXMoKSkpCisKKworICAgIGRlZiBpdGVtcyhzZWxmLCB0eG49Tm9uZSk6CisgICAgICAgIGlmIHR4biBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGl0ZW1zID0gc2VsZi5kYi5pdGVtcyh0eG4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpdGVtcyA9IHNlbGYuZGIuaXRlbXMoKQorICAgICAgICBuZXdpdGVtcyA9IFtdCisKKyAgICAgICAgZm9yIGssIHYgaW4gaXRlbXM6CisgICAgICAgICAgICBuZXdpdGVtcy5hcHBlbmQoIChrLCBjUGlja2xlLmxvYWRzKHYpKSApCisgICAgICAgIHJldHVybiBuZXdpdGVtcworCisgICAgZGVmIHZhbHVlcyhzZWxmLCB0eG49Tm9uZSk6CisgICAgICAgIGlmIHR4biBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHZhbHVlcyA9IHNlbGYuZGIudmFsdWVzKHR4bikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlcyA9IHNlbGYuZGIudmFsdWVzKCkKKworICAgICAgICByZXR1cm4gbWFwKGNQaWNrbGUubG9hZHMsIHZhbHVlcykKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgT3RoZXIgbWV0aG9kcworCisgICAgZGVmIF9fYXBwZW5kKHNlbGYsIHZhbHVlLCB0eG49Tm9uZSk6CisgICAgICAgIGRhdGEgPSBfZHVtcHModmFsdWUsIHNlbGYucHJvdG9jb2wpCisgICAgICAgIHJldHVybiBzZWxmLmRiLmFwcGVuZChkYXRhLCB0eG4pCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIHZhbHVlLCB0eG49Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuZ2V0X3R5cGUoKSA9PSBkYi5EQl9SRUNOTzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fYXBwZW5kKHZhbHVlLCB0eG49dHhuKQorICAgICAgICByYWlzZSBEQlNoZWx2ZUVycm9yLCAiYXBwZW5kKCkgb25seSBzdXBwb3J0ZWQgd2hlbiBkYnNoZWx2ZSBvcGVuZWQgd2l0aCBmaWxldHlwZT1kYnNoZWx2ZS5kYi5EQl9SRUNOTyIKKworCisgICAgZGVmIGFzc29jaWF0ZShzZWxmLCBzZWNvbmRhcnlEQiwgY2FsbGJhY2ssIGZsYWdzPTApOgorICAgICAgICBkZWYgX3NoZWxmX2NhbGxiYWNrKHByaUtleSwgcHJpRGF0YSwgcmVhbENhbGxiYWNrPWNhbGxiYWNrKToKKyAgICAgICAgICAgICMgU2FmZSBpbiBQeXRob24gMi54IGJlY2F1c2UgZXhwcmVzaW9uIHNob3J0IGNpcmN1aXQKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIG9yIGlzaW5zdGFuY2UocHJpRGF0YSwgYnl0ZXMpIDoKKyAgICAgICAgICAgICAgICBkYXRhID0gY1BpY2tsZS5sb2FkcyhwcmlEYXRhKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgZGF0YSA9IGNQaWNrbGUubG9hZHMoYnl0ZXMocHJpRGF0YSwgImlzbzg4NTktMSIpKSAgIyA4IGJpdHMKKyAgICAgICAgICAgIHJldHVybiByZWFsQ2FsbGJhY2socHJpS2V5LCBkYXRhKQorCisgICAgICAgIHJldHVybiBzZWxmLmRiLmFzc29jaWF0ZShzZWNvbmRhcnlEQiwgX3NoZWxmX2NhbGxiYWNrLCBmbGFncykKKworCisgICAgI2RlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUsIHR4bj1Ob25lLCBmbGFncz0wKToKKyAgICBkZWYgZ2V0KHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIyBXZSBkbyBpdCB3aXRoICphcmdzIGFuZCAqKmt3IHNvIGlmIHRoZSBkZWZhdWx0IHZhbHVlIHdhc24ndAorICAgICAgICAjIGdpdmVuIG5vdGhpbmcgaXMgcGFzc2VkIHRvIHRoZSBleHRlbnNpb24gbW9kdWxlLiAgVGhhdCB3YXkKKyAgICAgICAgIyBhbiBleGNlcHRpb24gY2FuIGJlIHJhaXNlZCBpZiBzZXRfZ2V0X3JldHVybnNfbm9uZSBpcyB0dXJuZWQKKyAgICAgICAgIyBvZmYuCisgICAgICAgIGRhdGEgPSBzZWxmLmRiLmdldCgqYXJncywgKiprdykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGNQaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBjUGlja2xlLlVucGlja2xpbmdFcnJvcik6CisgICAgICAgICAgICByZXR1cm4gZGF0YSAgIyB3ZSBtYXkgYmUgZ2V0dGluZyB0aGUgZGVmYXVsdCB2YWx1ZSwgb3IgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAjIHNvIGl0IGRvZXNuJ3QgbmVlZCB1bnBpY2tsZWQuCisKKyAgICBkZWYgZ2V0X2JvdGgoc2VsZiwga2V5LCB2YWx1ZSwgdHhuPU5vbmUsIGZsYWdzPTApOgorICAgICAgICBkYXRhID0gX2R1bXBzKHZhbHVlLCBzZWxmLnByb3RvY29sKQorICAgICAgICBkYXRhID0gc2VsZi5kYi5nZXQoa2V5LCBkYXRhLCB0eG4sIGZsYWdzKQorICAgICAgICByZXR1cm4gY1BpY2tsZS5sb2FkcyhkYXRhKQorCisKKyAgICBkZWYgY3Vyc29yKHNlbGYsIHR4bj1Ob25lLCBmbGFncz0wKToKKyAgICAgICAgYyA9IERCU2hlbGZDdXJzb3Ioc2VsZi5kYi5jdXJzb3IodHhuLCBmbGFncykpCisgICAgICAgIGMucHJvdG9jb2wgPSBzZWxmLnByb3RvY29sCisgICAgICAgIHJldHVybiBjCisKKworICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSwgdHhuPU5vbmUsIGZsYWdzPTApOgorICAgICAgICBkYXRhID0gX2R1bXBzKHZhbHVlLCBzZWxmLnByb3RvY29sKQorICAgICAgICByZXR1cm4gc2VsZi5kYi5wdXQoa2V5LCBkYXRhLCB0eG4sIGZsYWdzKQorCisKKyAgICBkZWYgam9pbihzZWxmLCBjdXJzb3JMaXN0LCBmbGFncz0wKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgTWV0aG9kcyBhbGxvd2VkIHRvIHBhc3MtdGhyb3VnaCB0byBzZWxmLmRiCisgICAgIworICAgICMgICAgY2xvc2UsICBkZWxldGUsIGZkLCBnZXRfYnl0ZXN3YXBwZWQsIGdldF90eXBlLCBoYXNfa2V5LAorICAgICMgICAga2V5X3JhbmdlLCBvcGVuLCByZW1vdmUsIHJlbmFtZSwgc3RhdCwgc3luYywKKyAgICAjICAgIHVwZ3JhZGUsIHZlcmlmeSwgYW5kIGFsbCBzZXRfKiBtZXRob2RzLgorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgREJTaGVsZkN1cnNvcjoKKyAgICAiIiIKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3Vyc29yKToKKyAgICAgICAgc2VsZi5kYmMgPSBjdXJzb3IKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJTb21lIG1ldGhvZHMgd2UgY2FuIGp1c3QgcGFzcyB0aHJvdWdoIHRvIHRoZSBjdXJzb3Igb2JqZWN0LiAgKFNlZSBiZWxvdykiIiIKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5kYmMsIG5hbWUpCisKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZHVwKHNlbGYsIGZsYWdzPTApOgorICAgICAgICBjID0gREJTaGVsZkN1cnNvcihzZWxmLmRiYy5kdXAoZmxhZ3MpKQorICAgICAgICBjLnByb3RvY29sID0gc2VsZi5wcm90b2NvbAorICAgICAgICByZXR1cm4gYworCisKKyAgICBkZWYgcHV0KHNlbGYsIGtleSwgdmFsdWUsIGZsYWdzPTApOgorICAgICAgICBkYXRhID0gX2R1bXBzKHZhbHVlLCBzZWxmLnByb3RvY29sKQorICAgICAgICByZXR1cm4gc2VsZi5kYmMucHV0KGtleSwgZGF0YSwgZmxhZ3MpCisKKworICAgIGRlZiBnZXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBjb3VudCA9IGxlbihhcmdzKSAgIyBhIG1ldGhvZCBvdmVybG9hZGluZyBoYWNrCisgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ2dldF8lZCcgJSBjb3VudCkKKyAgICAgICAgbWV0aG9kKCphcmdzKQorCisgICAgZGVmIGdldF8xKHNlbGYsIGZsYWdzKToKKyAgICAgICAgcmVjID0gc2VsZi5kYmMuZ2V0KGZsYWdzKQorICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdChyZWMpCisKKyAgICBkZWYgZ2V0XzIoc2VsZiwga2V5LCBmbGFncyk6CisgICAgICAgIHJlYyA9IHNlbGYuZGJjLmdldChrZXksIGZsYWdzKQorICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdChyZWMpCisKKyAgICBkZWYgZ2V0XzMoc2VsZiwga2V5LCB2YWx1ZSwgZmxhZ3MpOgorICAgICAgICBkYXRhID0gX2R1bXBzKHZhbHVlLCBzZWxmLnByb3RvY29sKQorICAgICAgICByZWMgPSBzZWxmLmRiYy5nZXQoa2V5LCBmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3QocmVjKQorCisKKyAgICBkZWYgY3VycmVudChzZWxmLCBmbGFncz0wKTogcmV0dXJuIHNlbGYuZ2V0XzEoZmxhZ3N8ZGIuREJfQ1VSUkVOVCkKKyAgICBkZWYgZmlyc3Qoc2VsZiwgZmxhZ3M9MCk6IHJldHVybiBzZWxmLmdldF8xKGZsYWdzfGRiLkRCX0ZJUlNUKQorICAgIGRlZiBsYXN0KHNlbGYsIGZsYWdzPTApOiByZXR1cm4gc2VsZi5nZXRfMShmbGFnc3xkYi5EQl9MQVNUKQorICAgIGRlZiBuZXh0KHNlbGYsIGZsYWdzPTApOiByZXR1cm4gc2VsZi5nZXRfMShmbGFnc3xkYi5EQl9ORVhUKQorICAgIGRlZiBwcmV2KHNlbGYsIGZsYWdzPTApOiByZXR1cm4gc2VsZi5nZXRfMShmbGFnc3xkYi5EQl9QUkVWKQorICAgIGRlZiBjb25zdW1lKHNlbGYsIGZsYWdzPTApOiByZXR1cm4gc2VsZi5nZXRfMShmbGFnc3xkYi5EQl9DT05TVU1FKQorICAgIGRlZiBuZXh0X2R1cChzZWxmLCBmbGFncz0wKTogcmV0dXJuIHNlbGYuZ2V0XzEoZmxhZ3N8ZGIuREJfTkVYVF9EVVApCisgICAgZGVmIG5leHRfbm9kdXAoc2VsZiwgZmxhZ3M9MCk6IHJldHVybiBzZWxmLmdldF8xKGZsYWdzfGRiLkRCX05FWFRfTk9EVVApCisgICAgZGVmIHByZXZfbm9kdXAoc2VsZiwgZmxhZ3M9MCk6IHJldHVybiBzZWxmLmdldF8xKGZsYWdzfGRiLkRCX1BSRVZfTk9EVVApCisKKworICAgIGRlZiBnZXRfYm90aChzZWxmLCBrZXksIHZhbHVlLCBmbGFncz0wKToKKyAgICAgICAgZGF0YSA9IF9kdW1wcyh2YWx1ZSwgc2VsZi5wcm90b2NvbCkKKyAgICAgICAgcmVjID0gc2VsZi5kYmMuZ2V0X2JvdGgoa2V5LCBmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3QocmVjKQorCisKKyAgICBkZWYgc2V0KHNlbGYsIGtleSwgZmxhZ3M9MCk6CisgICAgICAgIHJlYyA9IHNlbGYuZGJjLnNldChrZXksIGZsYWdzKQorICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdChyZWMpCisKKyAgICBkZWYgc2V0X3JhbmdlKHNlbGYsIGtleSwgZmxhZ3M9MCk6CisgICAgICAgIHJlYyA9IHNlbGYuZGJjLnNldF9yYW5nZShrZXksIGZsYWdzKQorICAgICAgICByZXR1cm4gc2VsZi5fZXh0cmFjdChyZWMpCisKKyAgICBkZWYgc2V0X3JlY25vKHNlbGYsIHJlY25vLCBmbGFncz0wKToKKyAgICAgICAgcmVjID0gc2VsZi5kYmMuc2V0X3JlY25vKHJlY25vLCBmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2V4dHJhY3QocmVjKQorCisgICAgc2V0X2JvdGggPSBnZXRfYm90aAorCisgICAgZGVmIF9leHRyYWN0KHNlbGYsIHJlYyk6CisgICAgICAgIGlmIHJlYyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtleSwgZGF0YSA9IHJlYworICAgICAgICAgICAgIyBTYWZlIGluIFB5dGhvbiAyLnggYmVjYXVzZSBleHByZXNpb24gc2hvcnQgY2lyY3VpdAorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgb3IgaXNpbnN0YW5jZShkYXRhLCBieXRlcykgOgorICAgICAgICAgICAgICAgIHJldHVybiBrZXksIGNQaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHJldHVybiBrZXksIGNQaWNrbGUubG9hZHMoYnl0ZXMoZGF0YSwgImlzbzg4NTktMSIpKSAgIyA4IGJpdHMKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBNZXRob2RzIGFsbG93ZWQgdG8gcGFzcy10aHJvdWdoIHRvIHNlbGYuZGJjCisgICAgIworICAgICMgY2xvc2UsIGNvdW50LCBkZWxldGUsIGdldF9yZWNubywgam9pbl9pdGVtCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL2Ric2hlbHZlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDljMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL2Ric2hlbHZlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDljMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnNoZWx2ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnRhYmxlcy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ0YWJsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThhY2RkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvZGJ0YWJsZXMucHkKQEAgLTAsMCArMSw4NDMgQEAKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgYnkgQXV0b25vbW91cyBab25lIEluZHVzdHJpZXMKKyMgQ29weXJpZ2h0IChDKSAyMDAyIEdyZWdvcnkgUC4gU21pdGgKKyMKKyMgTGljZW5zZTogICAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuICBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyMgICAgICAgICAgICAgICBwdXJwb3NlIGluY2x1ZGluZyBtb2RpZmljYXRpb24vcmVkaXN0cmlidXRpb24sIHNvIGxvbmcgYXMKKyMgICAgICAgICAgICAgICB0aGlzIGhlYWRlciByZW1haW5zIGludGFjdCBhbmQgdGhhdCB5b3UgZG8gbm90IGNsYWltIGFueQorIyAgICAgICAgICAgICAgIHJpZ2h0cyBvZiBvd25lcnNoaXAgb3IgYXV0aG9yc2hpcCBvZiB0aGlzIHNvZnR3YXJlLiAgVGhpcworIyAgICAgICAgICAgICAgIHNvZnR3YXJlIGhhcyBiZWVuIHRlc3RlZCwgYnV0IG5vIHdhcnJhbnR5IGlzIGV4cHJlc3NlZCBvcgorIyAgICAgICAgICAgICAgIGltcGxpZWQuCisjCisjICAgLS0gIEdyZWdvcnkgUC4gU21pdGggPGdyZWdAa3J5cHRvLm9yZz4KKworIyBUaGlzIHByb3ZpZGVzIGEgc2ltcGxlIGRhdGFiYXNlIHRhYmxlIGludGVyZmFjZSBidWlsdCBvbiB0b3Agb2YKKyMgdGhlIFB5dGhvbiBCZXJrZWxleSBEQiAzIGludGVyZmFjZS4KKyMKK19jdnNpZCA9ICckSWQkJworCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBjb3B5CitpbXBvcnQgcmFuZG9tCitpbXBvcnQgc3RydWN0CisKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzIDoKKyAgICBpbXBvcnQgcGlja2xlCitlbHNlIDoKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgaW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCisgICAgZWxzZSA6CisgICAgICAgICMgV2hlbiB3ZSBkcm9wIHN1cHBvcnQgZm9yIHB5dGhvbiAyLjQKKyAgICAgICAgIyB3ZSBjb3VsZCB1c2U6IChpbiAyLjUgd2UgbmVlZCBhIF9fZnV0dXJlX18gc3RhdGVtZW50KQorICAgICAgICAjCisgICAgICAgICMgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAjICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncyguLi4pCisgICAgICAgICMgICAgICAgIC4uLgorICAgICAgICAjCisgICAgICAgICMgV2UgY2FuIG5vdCB1c2UgIndpdGgiIGFzIGlzLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGludmFsaWQgc3ludGF4CisgICAgICAgICMgaW4gcHl0aG9uIDIuNCBhbmQgKHdpdGggbm8gX19mdXR1cmVfXykgMi41LgorICAgICAgICAjIEhlcmUgd2Ugc2ltdWxhdGUgIndpdGgiIGZvbGxvd2luZyBQRVAgMzQzIDoKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHcgPSB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpCisgICAgICAgIHcuX19lbnRlcl9fKCkKKyAgICAgICAgdHJ5IDoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9J3RoZSBjUGlja2xlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAnLAorICAgICAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIGltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQorICAgICAgICBmaW5hbGx5IDoKKyAgICAgICAgICAgIHcuX19leGl0X18oKQorICAgICAgICBkZWwgdworCit0cnk6CisgICAgIyBGb3IgUHl0aG9ucyB3L2Rpc3R1dGlscyBweWJzZGRiCisgICAgZnJvbSBic2RkYjMgaW1wb3J0IGRiCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBGb3IgUHl0aG9uIDIuMworICAgIGZyb20gYnNkZGIgaW1wb3J0IGRiCisKK2NsYXNzIFRhYmxlREJFcnJvcihTdGFuZGFyZEVycm9yKToKKyAgICBwYXNzCitjbGFzcyBUYWJsZUFscmVhZHlFeGlzdHMoVGFibGVEQkVycm9yKToKKyAgICBwYXNzCisKKworY2xhc3MgQ29uZDoKKyAgICAiIiJUaGlzIGNvbmRpdGlvbiBtYXRjaGVzIGV2ZXJ5dGhpbmciIiIKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcyk6CisgICAgICAgIHJldHVybiAxCisKK2NsYXNzIEV4YWN0Q29uZChDb25kKToKKyAgICAiIiJBY3RzIGFzIGFuIGV4YWN0IG1hdGNoIGNvbmRpdGlvbiBmdW5jdGlvbiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJ0b21hdGNoKToKKyAgICAgICAgc2VsZi5zdHJ0b21hdGNoID0gc3RydG9tYXRjaAorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuIHMgPT0gc2VsZi5zdHJ0b21hdGNoCisKK2NsYXNzIFByZWZpeENvbmQoQ29uZCk6CisgICAgIiIiQWN0cyBhcyBhIGNvbmRpdGlvbiBmdW5jdGlvbiBmb3IgbWF0Y2hpbmcgYSBzdHJpbmcgcHJlZml4IiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByZWZpeCk6CisgICAgICAgIHNlbGYucHJlZml4ID0gcHJlZml4CisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHMpOgorICAgICAgICByZXR1cm4gc1s6bGVuKHNlbGYucHJlZml4KV0gPT0gc2VsZi5wcmVmaXgKKworY2xhc3MgUG9zdGZpeENvbmQoQ29uZCk6CisgICAgIiIiQWN0cyBhcyBhIGNvbmRpdGlvbiBmdW5jdGlvbiBmb3IgbWF0Y2hpbmcgYSBzdHJpbmcgcG9zdGZpeCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3N0Zml4KToKKyAgICAgICAgc2VsZi5wb3N0Zml4ID0gcG9zdGZpeAorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzKToKKyAgICAgICAgcmV0dXJuIHNbLWxlbihzZWxmLnBvc3RmaXgpOl0gPT0gc2VsZi5wb3N0Zml4CisKK2NsYXNzIExpa2VDb25kKENvbmQpOgorICAgICIiIgorICAgIEFjdHMgYXMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgbWF0Y2ggdXNpbmcgYW4gU1FMICdMSUtFJyBzdHlsZQorICAgIHN0cmluZy4gIENhc2UgaW5zZW5zaXRpdmUgYW5kICUgc2lnbnMgYXJlIHdpbGQgY2FyZHMuCisgICAgVGhpcyBpc24ndCBwZXJmZWN0IGJ1dCBpdCBzaG91bGQgd29yayBmb3IgdGhlIHNpbXBsZSBjb21tb24gY2FzZXMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpa2VzdHIsIHJlX2ZsYWdzPXJlLklHTk9SRUNBU0UpOgorICAgICAgICAjIGVzY2FwZSBweXRob24gcmUgY2hhcmFjdGVycworICAgICAgICBjaGFyc190b19lc2NhcGUgPSAnLiorKClbXT8nCisgICAgICAgIGZvciBjaGFyIGluIGNoYXJzX3RvX2VzY2FwZSA6CisgICAgICAgICAgICBsaWtlc3RyID0gbGlrZXN0ci5yZXBsYWNlKGNoYXIsICdcXCcrY2hhcikKKyAgICAgICAgIyBjb252ZXJ0ICVzIHRvIHdpbGRjYXJkcworICAgICAgICBzZWxmLmxpa2VzdHIgPSBsaWtlc3RyLnJlcGxhY2UoJyUnLCAnLionKQorICAgICAgICBzZWxmLnJlID0gcmUuY29tcGlsZSgnXicrc2VsZi5saWtlc3RyKyckJywgcmVfZmxhZ3MpCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHMpOgorICAgICAgICByZXR1cm4gc2VsZi5yZS5tYXRjaChzKQorCisjCisjIGtleXMgdXNlZCB0byBzdG9yZSBkYXRhYmFzZSBtZXRhZGF0YQorIworX3RhYmxlX25hbWVzX2tleSA9ICdfX1RBQkxFX05BTUVTX18nICAjIGxpc3Qgb2YgdGhlIHRhYmxlcyBpbiB0aGlzIGRiCitfY29sdW1ucyA9ICcuX0NPTFVNTlNfXycgICMgdGFibGVfbmFtZSt0aGlzIGtleSBjb250YWlucyBhIGxpc3Qgb2YgY29sdW1ucworCitkZWYgX2NvbHVtbnNfa2V5KHRhYmxlKToKKyAgICByZXR1cm4gdGFibGUgKyBfY29sdW1ucworCisjCisjIHRoZXNlIGtleXMgYXJlIGZvdW5kIHdpdGhpbiB0YWJsZSBzdWIgZGF0YWJhc2VzCisjCitfZGF0YSA9ICAnLl9EQVRBXy4nICAjIHRoaXMrY29sdW1uK3RoaXMrcm93aWQga2V5IGNvbnRhaW5zIHRhYmxlIGRhdGEKK19yb3dpZCA9ICcuX1JPV0lEXy4nICMgdGhpcytyb3dpZCt0aGlzIGtleSBjb250YWlucyBhIHVuaXF1ZSBlbnRyeSBmb3IgZWFjaAorICAgICAgICAgICAgICAgICAgICAgIyByb3cgaW4gdGhlIHRhYmxlLiAgKG5vIGRhdGEgaXMgc3RvcmVkKQorX3Jvd2lkX3N0cl9sZW4gPSA4ICAgIyBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIHVuaXF1ZSByb3dpZCBzdHJpbmdzCisKKworZGVmIF9kYXRhX2tleSh0YWJsZSwgY29sLCByb3dpZCk6CisgICAgcmV0dXJuIHRhYmxlICsgX2RhdGEgKyBjb2wgKyBfZGF0YSArIHJvd2lkCisKK2RlZiBfc2VhcmNoX2NvbF9kYXRhX2tleSh0YWJsZSwgY29sKToKKyAgICByZXR1cm4gdGFibGUgKyBfZGF0YSArIGNvbCArIF9kYXRhCisKK2RlZiBfc2VhcmNoX2FsbF9kYXRhX2tleSh0YWJsZSk6CisgICAgcmV0dXJuIHRhYmxlICsgX2RhdGEKKworZGVmIF9yb3dpZF9rZXkodGFibGUsIHJvd2lkKToKKyAgICByZXR1cm4gdGFibGUgKyBfcm93aWQgKyByb3dpZCArIF9yb3dpZAorCitkZWYgX3NlYXJjaF9yb3dpZF9rZXkodGFibGUpOgorICAgIHJldHVybiB0YWJsZSArIF9yb3dpZAorCitkZWYgY29udGFpbnNfbWV0YXN0cmluZ3MocykgOgorICAgICIiIlZlcmlmeSB0aGF0IHRoZSBnaXZlbiBzdHJpbmcgZG9lcyBub3QgY29udGFpbiBhbnkKKyAgICBtZXRhZGF0YSBzdHJpbmdzIHRoYXQgbWlnaHQgaW50ZXJmZXJlIHdpdGggZGJ0YWJsZXMgZGF0YWJhc2Ugb3BlcmF0aW9uLgorICAgICIiIgorICAgIGlmIChzLmZpbmQoX3RhYmxlX25hbWVzX2tleSkgPj0gMCBvcgorICAgICAgICBzLmZpbmQoX2NvbHVtbnMpID49IDAgb3IKKyAgICAgICAgcy5maW5kKF9kYXRhKSA+PSAwIG9yCisgICAgICAgIHMuZmluZChfcm93aWQpID49IDApOgorICAgICAgICAjIFRoZW4KKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gMAorCisKK2NsYXNzIGJzZFRhYmxlREIgOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgZGJob21lLCBjcmVhdGU9MCwgdHJ1bmNhdGU9MCwgbW9kZT0wNjAwLAorICAgICAgICAgICAgICAgICByZWNvdmVyPTAsIGRiZmxhZ3M9MCk6CisgICAgICAgICIiImJzZFRhYmxlREIoZmlsZW5hbWUsIGRiaG9tZSwgY3JlYXRlPTAsIHRydW5jYXRlPTAsIG1vZGU9MDYwMCkKKworICAgICAgICBPcGVuIGRhdGFiYXNlIG5hbWUgaW4gdGhlIGRiaG9tZSBCZXJrZWxleSBEQiBkaXJlY3RvcnkuCisgICAgICAgIFVzZSBrZXl3b3JkIGFyZ3VtZW50cyB3aGVuIGNhbGxpbmcgdGhpcyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGIgPSBOb25lCisgICAgICAgIG15ZmxhZ3MgPSBkYi5EQl9USFJFQUQKKyAgICAgICAgaWYgY3JlYXRlOgorICAgICAgICAgICAgbXlmbGFncyB8PSBkYi5EQl9DUkVBVEUKKyAgICAgICAgZmxhZ3Nmb3JlbnYgPSAoZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX0lOSVRfTE9HIHwKKyAgICAgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9UWE4gfCBkYmZsYWdzKQorICAgICAgICAjIERCX0FVVE9fQ09NTUlUIGlzbid0IGEgdmFsaWQgZmxhZyBmb3IgZW52Lm9wZW4oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYmZsYWdzIHw9IGRiLkRCX0FVVE9fQ09NTUlUCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgcmVjb3ZlcjoKKyAgICAgICAgICAgIGZsYWdzZm9yZW52ID0gZmxhZ3Nmb3JlbnYgfCBkYi5EQl9SRUNPVkVSCisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICAjIGVuYWJsZSBhdXRvIGRlYWRsb2NrIGF2b2lkYW5jZQorICAgICAgICBzZWxmLmVudi5zZXRfbGtfZGV0ZWN0KGRiLkRCX0xPQ0tfREVGQVVMVCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihkYmhvbWUsIG15ZmxhZ3MgfCBmbGFnc2ZvcmVudikKKyAgICAgICAgaWYgdHJ1bmNhdGU6CisgICAgICAgICAgICBteWZsYWdzIHw9IGRiLkRCX1RSVU5DQVRFCisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgIyB0aGlzIGNvZGUgcmVsaWVzIG9uIERCQ3Vyc29yLnNldCogbWV0aG9kcyB0byByYWlzZSBleGNlcHRpb25zCisgICAgICAgICMgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIE5vbmUKKyAgICAgICAgc2VsZi5kYi5zZXRfZ2V0X3JldHVybnNfbm9uZSgxKQorICAgICAgICAjIGFsbG93IGR1cGxpY2F0ZSBlbnRyaWVzIFt3YXJuaW5nOiBiZSBjYXJlZnVsIHcvIG1ldGFkYXRhXQorICAgICAgICBzZWxmLmRiLnNldF9mbGFncyhkYi5EQl9EVVApCisgICAgICAgIHNlbGYuZGIub3BlbihmaWxlbmFtZSwgZGIuREJfQlRSRUUsIGRiZmxhZ3MgfCBteWZsYWdzLCBtb2RlKQorICAgICAgICBzZWxmLmRiZmlsZW5hbWUgPSBmaWxlbmFtZQorCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgICAgICAgICBjbGFzcyBjdXJzb3JfcHkzayhvYmplY3QpIDoKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGJjdXJzb3IpIDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJjdXJzb3IgPSBkYmN1cnNvcgorCisgICAgICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpIDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiY3Vyc29yLmNsb3NlKCkKKworICAgICAgICAgICAgICAgIGRlZiBzZXRfcmFuZ2Uoc2VsZiwgc2VhcmNoKSA6CisgICAgICAgICAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5zZXRfcmFuZ2UoYnl0ZXMoc2VhcmNoLCAiaXNvODg1OS0xIikpCisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9ICh2WzBdLmRlY29kZSgiaXNvODg1OS0xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0uZGVjb2RlKCJpc284ODU5LTEiKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICAgICAgICAgIGRlZiBfX25leHRfXyhzZWxmKSA6CisgICAgICAgICAgICAgICAgICAgIHYgPSBnZXRhdHRyKHNlbGYuX2RiY3Vyc29yLCAibmV4dCIpKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gKHZbMF0uZGVjb2RlKCJpc284ODU5LTEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsxXS5kZWNvZGUoImlzbzg4NTktMSIpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgICAgICBjbGFzcyBkYl9weTNrKG9iamVjdCkgOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYikgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYiA9IGRiCisKKyAgICAgICAgICAgICAgICBkZWYgY3Vyc29yKHNlbGYsIHR4bj1Ob25lKSA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3JfcHkzayhzZWxmLl9kYi5jdXJzb3IodHhuPXR4bikpCisKKyAgICAgICAgICAgICAgICBkZWYgaGFzX2tleShzZWxmLCBrZXksIHR4bj1Ob25lKSA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2RiLCJoYXNfa2V5IikoYnl0ZXMoa2V5LCAiaXNvODg1OS0xIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHhuPXR4bikKKworICAgICAgICAgICAgICAgIGRlZiBwdXQoc2VsZiwga2V5LCB2YWx1ZSwgZmxhZ3M9MCwgdHhuPU5vbmUpIDoKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCAiaXNvODg1OS0xIikKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBieXRlcyh2YWx1ZSwgImlzbzg4NTktMSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5wdXQoa2V5LCB2YWx1ZSwgZmxhZ3M9ZmxhZ3MsIHR4bj10eG4pCisKKyAgICAgICAgICAgICAgICBkZWYgcHV0X2J5dGVzKHNlbGYsIGtleSwgdmFsdWUsIHR4bj1Ob25lKSA6CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgImlzbzg4NTktMSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5wdXQoa2V5LCB2YWx1ZSwgdHhuPXR4bikKKworICAgICAgICAgICAgICAgIGRlZiBnZXQoc2VsZiwga2V5LCB0eG49Tm9uZSwgZmxhZ3M9MCkgOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksICJpc284ODU5LTEiKQorICAgICAgICAgICAgICAgICAgICB2ID0gc2VsZi5fZGIuZ2V0KGtleSwgdHhuPXR4biwgZmxhZ3M9ZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHYuZGVjb2RlKCJpc284ODU5LTEiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgICAgICAgICAgZGVmIGdldF9ieXRlcyhzZWxmLCBrZXksIHR4bj1Ob25lLCBmbGFncz0wKSA6CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgImlzbzg4NTktMSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5nZXQoa2V5LCB0eG49dHhuLCBmbGFncz1mbGFncykKKworICAgICAgICAgICAgICAgIGRlZiBkZWxldGUoc2VsZiwga2V5LCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksICJpc284ODU5LTEiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuZGVsZXRlKGtleSwgdHhuPXR4bikKKworICAgICAgICAgICAgICAgIGRlZiBjbG9zZSAoc2VsZikgOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmRiID0gZGJfcHkzayhzZWxmLmRiKQorICAgICAgICBlbHNlIDogICMgUHl0aG9uIDIueAorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgSW5pdGlhbGl6ZSB0aGUgdGFibGUgbmFtZXMgbGlzdCBpZiB0aGlzIGlzIGEgbmV3IGRhdGFiYXNlCisgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYuZGIsICJoYXNfa2V5IikoX3RhYmxlX25hbWVzX2tleSwgdHhuKToKKyAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYuZGIsICJwdXRfYnl0ZXMiLCBzZWxmLmRiLnB1dCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgKF90YWJsZV9uYW1lc19rZXksIHBpY2tsZS5kdW1wcyhbXSwgMSksIHR4bj10eG4pCisgICAgICAgICMgWWVzLCBiYXJlIGV4Y2VwdAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAjIFRPRE8gdmVyaWZ5IG1vcmUgb2YgdGhlIGRhdGFiYXNlJ3MgbWV0YWRhdGE/CisgICAgICAgIHNlbGYuX190YWJsZWNvbHVtbnMgPSB7fQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmRiID0gTm9uZQorICAgICAgICBpZiBzZWxmLmVudiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuZW52ID0gTm9uZQorCisgICAgZGVmIGNoZWNrcG9pbnQoc2VsZiwgbWlucz0wKToKKyAgICAgICAgc2VsZi5lbnYudHhuX2NoZWNrcG9pbnQobWlucykKKworICAgIGRlZiBzeW5jKHNlbGYpOgorICAgICAgICBzZWxmLmRiLnN5bmMoKQorCisgICAgZGVmIF9kYl9wcmludChzZWxmKSA6CisgICAgICAgICIiIlByaW50IHRoZSBkYXRhYmFzZSB0byBzdGRvdXQgZm9yIGRlYnVnZ2luZyIiIgorICAgICAgICBwcmludCAiKioqKioqKiogUHJpbnRpbmcgcmF3IGRhdGFiYXNlIGZvciBkZWJ1Z2dpbmcgKioqKioqKioiCisgICAgICAgIGN1ciA9IHNlbGYuZGIuY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2V5LCBkYXRhID0gY3VyLmZpcnN0KCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVwcih7a2V5OiBkYXRhfSkKKyAgICAgICAgICAgICAgICBuZXh0ID0gY3VyLm5leHQoKQorICAgICAgICAgICAgICAgIGlmIG5leHQ6CisgICAgICAgICAgICAgICAgICAgIGtleSwgZGF0YSA9IG5leHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjdXIuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgIGN1ci5jbG9zZSgpCisKKworICAgIGRlZiBDcmVhdGVUYWJsZShzZWxmLCB0YWJsZSwgY29sdW1ucyk6CisgICAgICAgICIiIkNyZWF0ZVRhYmxlKHRhYmxlLCBjb2x1bW5zKSAtIENyZWF0ZSBhIG5ldyB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuCisKKyAgICAgICAgcmFpc2VzIFRhYmxlREJFcnJvciBpZiBpdCBhbHJlYWR5IGV4aXN0cyBvciBmb3Igb3RoZXIgREIgZXJyb3JzLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29sdW1ucywgbGlzdCkKKworICAgICAgICB0eG4gPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgY2hlY2tpbmcgc2FuaXR5IG9mIHRoZSB0YWJsZSBhbmQgY29sdW1uIG5hbWVzIGhlcmUgb24KKyAgICAgICAgICAgICMgdGFibGUgY3JlYXRpb24gd2lsbCBwcmV2ZW50IHByb2JsZW1zIGVsc2V3aGVyZS4KKyAgICAgICAgICAgIGlmIGNvbnRhaW5zX21ldGFzdHJpbmdzKHRhYmxlKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAiYmFkIHRhYmxlIG5hbWU6IGNvbnRhaW5zIHJlc2VydmVkIG1ldGFzdHJpbmdzIikKKyAgICAgICAgICAgIGZvciBjb2x1bW4gaW4gY29sdW1ucyA6CisgICAgICAgICAgICAgICAgaWYgY29udGFpbnNfbWV0YXN0cmluZ3MoY29sdW1uKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgY29sdW1uIG5hbWU6IGNvbnRhaW5zIHJlc2VydmVkIG1ldGFzdHJpbmdzIikKKworICAgICAgICAgICAgY29sdW1ubGlzdF9rZXkgPSBfY29sdW1uc19rZXkodGFibGUpCisgICAgICAgICAgICBpZiBnZXRhdHRyKHNlbGYuZGIsICJoYXNfa2V5IikoY29sdW1ubGlzdF9rZXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlQWxyZWFkeUV4aXN0cywgInRhYmxlIGFscmVhZHkgZXhpc3RzIgorCisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgIyBzdG9yZSB0aGUgdGFibGUncyBjb2x1bW4gaW5mbworICAgICAgICAgICAgZ2V0YXR0cihzZWxmLmRiLCAicHV0X2J5dGVzIiwgc2VsZi5kYi5wdXQpKGNvbHVtbmxpc3Rfa2V5LAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcHMoY29sdW1ucywgMSksIHR4bj10eG4pCisKKyAgICAgICAgICAgICMgYWRkIHRoZSB0YWJsZSBuYW1lIHRvIHRoZSB0YWJsZWxpc3QKKyAgICAgICAgICAgIHRhYmxlbGlzdCA9IHBpY2tsZS5sb2FkcyhnZXRhdHRyKHNlbGYuZGIsICJnZXRfYnl0ZXMiLAorICAgICAgICAgICAgICAgIHNlbGYuZGIuZ2V0KSAoX3RhYmxlX25hbWVzX2tleSwgdHhuPXR4biwgZmxhZ3M9ZGIuREJfUk1XKSkKKyAgICAgICAgICAgIHRhYmxlbGlzdC5hcHBlbmQodGFibGUpCisgICAgICAgICAgICAjIGRlbGV0ZSAxc3QsIGluIGNhc2Ugd2Ugb3BlbmVkIHdpdGggREJfRFVQCisgICAgICAgICAgICBzZWxmLmRiLmRlbGV0ZShfdGFibGVfbmFtZXNfa2V5LCB0eG49dHhuKQorICAgICAgICAgICAgZ2V0YXR0cihzZWxmLmRiLCAicHV0X2J5dGVzIiwgc2VsZi5kYi5wdXQpKF90YWJsZV9uYW1lc19rZXksCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wcyh0YWJsZWxpc3QsIDEpLCB0eG49dHhuKQorCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIHR4biA9IE5vbmUKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGRiZXJyb3I6CisgICAgICAgICAgICBpZiB0eG46CisgICAgICAgICAgICAgICAgdHhuLmFib3J0KCkKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvclsxXQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yLmFyZ3NbMV0KKworCisgICAgZGVmIExpc3RUYWJsZUNvbHVtbnMoc2VsZiwgdGFibGUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNvbHVtbnMgaW4gdGhlIGdpdmVuIHRhYmxlLgorICAgICAgICBbXSBpZiB0aGUgdGFibGUgZG9lc24ndCBleGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRhYmxlLCBzdHIpCisgICAgICAgIGlmIGNvbnRhaW5zX21ldGFzdHJpbmdzKHRhYmxlKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJiYWQgdGFibGUgbmFtZTogY29udGFpbnMgcmVzZXJ2ZWQgbWV0YXN0cmluZ3MiCisKKyAgICAgICAgY29sdW1ubGlzdF9rZXkgPSBfY29sdW1uc19rZXkodGFibGUpCisgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYuZGIsICJoYXNfa2V5IikoY29sdW1ubGlzdF9rZXkpOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHBpY2tsZWRjb2x1bW5saXN0ID0gZ2V0YXR0cihzZWxmLmRiLCAiZ2V0X2J5dGVzIiwKKyAgICAgICAgICAgICAgICBzZWxmLmRiLmdldCkoY29sdW1ubGlzdF9rZXkpCisgICAgICAgIGlmIHBpY2tsZWRjb2x1bW5saXN0OgorICAgICAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhwaWNrbGVkY29sdW1ubGlzdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIExpc3RUYWJsZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgdGFibGVzIGluIHRoaXMgZGF0YWJhc2UuIiIiCisgICAgICAgIHBpY2tsZWR0YWJsZWxpc3QgPSBzZWxmLmRiLmdldF9nZXQoX3RhYmxlX25hbWVzX2tleSkKKyAgICAgICAgaWYgcGlja2xlZHRhYmxlbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBwaWNrbGUubG9hZHMocGlja2xlZHRhYmxlbGlzdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIENyZWF0ZU9yRXh0ZW5kVGFibGUoc2VsZiwgdGFibGUsIGNvbHVtbnMpOgorICAgICAgICAiIiJDcmVhdGVPckV4dGVuZFRhYmxlKHRhYmxlLCBjb2x1bW5zKQorCisgICAgICAgIENyZWF0ZSBhIG5ldyB0YWJsZSBpbiB0aGUgZGF0YWJhc2UuCisKKyAgICAgICAgSWYgYSB0YWJsZSBvZiB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMsIGV4dGVuZCBpdCB0byBoYXZlIGFueQorICAgICAgICBhZGRpdGlvbmFsIGNvbHVtbnMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gbGlzdCBhcyB3ZWxsIGFzCisgICAgICAgIGFsbCBvZiBpdHMgY3VycmVudCBjb2x1bW5zLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29sdW1ucywgbGlzdCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLkNyZWF0ZVRhYmxlKHRhYmxlLCBjb2x1bW5zKQorICAgICAgICBleGNlcHQgVGFibGVBbHJlYWR5RXhpc3RzOgorICAgICAgICAgICAgIyB0aGUgdGFibGUgYWxyZWFkeSBleGlzdGVkLCBhZGQgYW55IG5ldyBjb2x1bW5zCisgICAgICAgICAgICB0eG4gPSBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29sdW1ubGlzdF9rZXkgPSBfY29sdW1uc19rZXkodGFibGUpCisgICAgICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKworICAgICAgICAgICAgICAgICMgbG9hZCB0aGUgY3VycmVudCBjb2x1bW4gbGlzdAorICAgICAgICAgICAgICAgIG9sZGNvbHVtbmxpc3QgPSBwaWNrbGUubG9hZHMoCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoc2VsZi5kYiwgImdldF9ieXRlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRiLmdldCkoY29sdW1ubGlzdF9rZXksIHR4bj10eG4sIGZsYWdzPWRiLkRCX1JNVykpCisgICAgICAgICAgICAgICAgIyBjcmVhdGUgYSBoYXNoIHRhYmxlIGZvciBmYXN0IGxvb2t1cHMgb2YgY29sdW1uIG5hbWVzIGluIHRoZQorICAgICAgICAgICAgICAgICMgbG9vcCBiZWxvdworICAgICAgICAgICAgICAgIG9sZGNvbHVtbmhhc2ggPSB7fQorICAgICAgICAgICAgICAgIGZvciBjIGluIG9sZGNvbHVtbmxpc3Q6CisgICAgICAgICAgICAgICAgICAgIG9sZGNvbHVtbmhhc2hbY10gPSBjCisKKyAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBjb2x1bW4gbGlzdCBjb250YWluaW5nIGJvdGggdGhlIG9sZCBhbmQgbmV3CisgICAgICAgICAgICAgICAgIyBjb2x1bW4gbmFtZXMKKyAgICAgICAgICAgICAgICBuZXdjb2x1bW5saXN0ID0gY29weS5jb3B5KG9sZGNvbHVtbmxpc3QpCisgICAgICAgICAgICAgICAgZm9yIGMgaW4gY29sdW1uczoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGMgaW4gb2xkY29sdW1uaGFzaDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NvbHVtbmxpc3QuYXBwZW5kKGMpCisKKyAgICAgICAgICAgICAgICAjIHN0b3JlIHRoZSB0YWJsZSdzIG5ldyBleHRlbmRlZCBjb2x1bW4gbGlzdAorICAgICAgICAgICAgICAgIGlmIG5ld2NvbHVtbmxpc3QgIT0gb2xkY29sdW1ubGlzdCA6CisgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBvbGQgb25lIGZpcnN0IHNpbmNlIHdlIG9wZW5lZCB3aXRoIERCX0RVUAorICAgICAgICAgICAgICAgICAgICBzZWxmLmRiLmRlbGV0ZShjb2x1bW5saXN0X2tleSwgdHhuPXR4bikKKyAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLmRiLCAicHV0X2J5dGVzIiwgc2VsZi5kYi5wdXQpKGNvbHVtbmxpc3Rfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcHMobmV3Y29sdW1ubGlzdCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bj10eG4pCisKKyAgICAgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgICAgICB0eG4gPSBOb25lCisKKyAgICAgICAgICAgICAgICBzZWxmLl9fbG9hZF9jb2x1bW5faW5mbyh0YWJsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgICAgIGlmIHR4bjoKKyAgICAgICAgICAgICAgICAgICAgdHhuLmFib3J0KCkKKyAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yWzFdCisgICAgICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvci5hcmdzWzFdCisKKworICAgIGRlZiBfX2xvYWRfY29sdW1uX2luZm8oc2VsZiwgdGFibGUpIDoKKyAgICAgICAgIiIiaW5pdGlhbGl6ZSB0aGUgc2VsZi5fX3RhYmxlY29sdW1ucyBkaWN0IiIiCisgICAgICAgICMgY2hlY2sgdGhlIGNvbHVtbiBuYW1lcworICAgICAgICB0cnk6CisgICAgICAgICAgICB0Y29scGlja2xlcyA9IGdldGF0dHIoc2VsZi5kYiwgImdldF9ieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIuZ2V0KShfY29sdW1uc19rZXkodGFibGUpKQorICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCAidW5rbm93biB0YWJsZTogJXIiICUgKHRhYmxlLCkKKyAgICAgICAgaWYgbm90IHRjb2xwaWNrbGVzOgorICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCAidW5rbm93biB0YWJsZTogJXIiICUgKHRhYmxlLCkKKyAgICAgICAgc2VsZi5fX3RhYmxlY29sdW1uc1t0YWJsZV0gPSBwaWNrbGUubG9hZHModGNvbHBpY2tsZXMpCisKKyAgICBkZWYgX19uZXdfcm93aWQoc2VsZiwgdGFibGUsIHR4bikgOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgdW5pcXVlIHJvdyBpZGVudGlmaWVyIiIiCisgICAgICAgIHVuaXF1ZSA9IDAKKyAgICAgICAgd2hpbGUgbm90IHVuaXF1ZToKKyAgICAgICAgICAgICMgR2VuZXJhdGUgYSByYW5kb20gNjQtYml0IHJvdyBJRCBzdHJpbmcKKyAgICAgICAgICAgICMgKG5vdGU6IG1pZ2h0IGhhdmUgPDY0IGJpdHMgb2YgdHJ1ZSByYW5kb21uZXNzCisgICAgICAgICAgICAjIGJ1dCBpdCdzIHBsZW50eSBmb3Igb3VyIGRhdGFiYXNlIGlkIG5lZWRzISkKKyAgICAgICAgICAgIGJsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciB4IGluIHhyYW5nZShfcm93aWRfc3RyX2xlbik6CisgICAgICAgICAgICAgICAgYmxpc3QuYXBwZW5kKHJhbmRvbS5yYW5kaW50KDAsMjU1KSkKKyAgICAgICAgICAgIG5ld2lkID0gc3RydWN0LnBhY2soJ0InKl9yb3dpZF9zdHJfbGVuLCAqYmxpc3QpCisKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgICAgICAgICAgICAgbmV3aWQgPSBuZXdpZC5kZWNvZGUoImlzbzg4NTktMSIpICAjIDggYml0cworCisgICAgICAgICAgICAjIEd1YXJhbnRlZSB1bmlxdWVuZXNzIGJ5IGFkZGluZyB0aGlzIGtleSB0byB0aGUgZGF0YWJhc2UKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmRiLnB1dChfcm93aWRfa2V5KHRhYmxlLCBuZXdpZCksIE5vbmUsIHR4bj10eG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M9ZGIuREJfTk9PVkVSV1JJVEUpCisgICAgICAgICAgICBleGNlcHQgZGIuREJLZXlFeGlzdEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdW5pcXVlID0gMQorCisgICAgICAgIHJldHVybiBuZXdpZAorCisKKyAgICBkZWYgSW5zZXJ0KHNlbGYsIHRhYmxlLCByb3dkaWN0KSA6CisgICAgICAgICIiIkluc2VydCh0YWJsZSwgZGF0YWRpY3QpIC0gSW5zZXJ0IGEgbmV3IHJvdyBpbnRvIHRoZSB0YWJsZQorICAgICAgICB1c2luZyB0aGUga2V5cyt2YWx1ZXMgZnJvbSByb3dkaWN0IGFzIHRoZSBjb2x1bW4gdmFsdWVzLgorICAgICAgICAiIiIKKworICAgICAgICB0eG4gPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYuZGIsICJoYXNfa2V5IikoX2NvbHVtbnNfa2V5KHRhYmxlKSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCAidW5rbm93biB0YWJsZSIKKworICAgICAgICAgICAgIyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgZWFjaCBjb2x1bW4gbmFtZQorICAgICAgICAgICAgaWYgbm90IHRhYmxlIGluIHNlbGYuX190YWJsZWNvbHVtbnM6CisgICAgICAgICAgICAgICAgc2VsZi5fX2xvYWRfY29sdW1uX2luZm8odGFibGUpCisgICAgICAgICAgICBmb3IgY29sdW1uIGluIHJvd2RpY3Qua2V5cygpIDoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX3RhYmxlY29sdW1uc1t0YWJsZV0uY291bnQoY29sdW1uKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCAidW5rbm93biBjb2x1bW46ICVyIiAlIChjb2x1bW4sKQorCisgICAgICAgICAgICAjIGdldCBhIHVuaXF1ZSByb3cgaWRlbnRpZmllciBmb3IgdGhpcyByb3cKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICByb3dpZCA9IHNlbGYuX19uZXdfcm93aWQodGFibGUsIHR4bj10eG4pCisKKyAgICAgICAgICAgICMgaW5zZXJ0IHRoZSByb3cgdmFsdWVzIGludG8gdGhlIHRhYmxlIGRhdGFiYXNlCisgICAgICAgICAgICBmb3IgY29sdW1uLCBkYXRhaXRlbSBpbiByb3dkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgIyBzdG9yZSB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICBzZWxmLmRiLnB1dChfZGF0YV9rZXkodGFibGUsIGNvbHVtbiwgcm93aWQpLCBkYXRhaXRlbSwgdHhuPXR4bikKKworICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICB0eG4gPSBOb25lCisKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGRiZXJyb3I6CisgICAgICAgICAgICAjIFdJQk5JIHdlIGNvdWxkIGp1c3QgYWJvcnQgdGhlIHR4biBhbmQgcmUtcmFpc2UgdGhlIGV4Y2VwdGlvbj8KKyAgICAgICAgICAgICMgQnV0IG5vLCBiZWNhdXNlIFRhYmxlREJFcnJvciBpcyBub3QgcmVsYXRlZCB0byBEQkVycm9yIHZpYQorICAgICAgICAgICAgIyBpbmhlcml0YW5jZSwgc28gaXQgd291bGQgYmUgYmFja3dhcmRzIGluY29tcGF0aWJsZS4gIERvIHRoZSBuZXh0CisgICAgICAgICAgICAjIGJlc3QgdGhpbmcuCisgICAgICAgICAgICBpbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIGlmIHR4bjoKKyAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgICAgIHNlbGYuZGIuZGVsZXRlKF9yb3dpZF9rZXkodGFibGUsIHJvd2lkKSkKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvclsxXSwgaW5mb1syXQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yLmFyZ3NbMV0sIGluZm9bMl0KKworCisgICAgZGVmIE1vZGlmeShzZWxmLCB0YWJsZSwgY29uZGl0aW9ucz17fSwgbWFwcGluZ3M9e30pOgorICAgICAgICAiIiJNb2RpZnkodGFibGUsIGNvbmRpdGlvbnM9e30sIG1hcHBpbmdzPXt9KSAtIE1vZGlmeSBpdGVtcyBpbiByb3dzIG1hdGNoaW5nICdjb25kaXRpb25zJyB1c2luZyBtYXBwaW5nIGZ1bmN0aW9ucyBpbiAnbWFwcGluZ3MnCisKKyAgICAgICAgKiB0YWJsZSAtIHRoZSB0YWJsZSBuYW1lCisgICAgICAgICogY29uZGl0aW9ucyAtIGEgZGljdGlvbmFyeSBrZXllZCBvbiBjb2x1bW4gbmFtZXMgY29udGFpbmluZworICAgICAgICAgIGEgY29uZGl0aW9uIGNhbGxhYmxlIGV4cGVjdGluZyB0aGUgZGF0YSBzdHJpbmcgYXMgYW4KKyAgICAgICAgICBhcmd1bWVudCBhbmQgcmV0dXJuaW5nIGEgYm9vbGVhbi4KKyAgICAgICAgKiBtYXBwaW5ncyAtIGEgZGljdGlvbmFyeSBrZXllZCBvbiBjb2x1bW4gbmFtZXMgY29udGFpbmluZyBhCisgICAgICAgICAgY29uZGl0aW9uIGNhbGxhYmxlIGV4cGVjdGluZyB0aGUgZGF0YSBzdHJpbmcgYXMgYW4gYXJndW1lbnQgYW5kCisgICAgICAgICAgcmV0dXJuaW5nIHRoZSBuZXcgc3RyaW5nIGZvciB0aGF0IGNvbHVtbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWF0Y2hpbmdfcm93aWRzID0gc2VsZi5fX1NlbGVjdCh0YWJsZSwgW10sIGNvbmRpdGlvbnMpCisKKyAgICAgICAgICAgICMgbW9kaWZ5IG9ubHkgcmVxdWVzdGVkIGNvbHVtbnMKKyAgICAgICAgICAgIGNvbHVtbnMgPSBtYXBwaW5ncy5rZXlzKCkKKyAgICAgICAgICAgIGZvciByb3dpZCBpbiBtYXRjaGluZ19yb3dpZHMua2V5cygpOgorICAgICAgICAgICAgICAgIHR4biA9IE5vbmUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZvciBjb2x1bW4gaW4gY29sdW1uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICAgICAgICAgICAgICAjIG1vZGlmeSB0aGUgcmVxdWVzdGVkIGNvbHVtbgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFpdGVtID0gc2VsZi5kYi5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYXRhX2tleSh0YWJsZSwgY29sdW1uLCByb3dpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bj10eG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYi5kZWxldGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kYXRhX2tleSh0YWJsZSwgY29sdW1uLCByb3dpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4bj10eG4pCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWFhYWFggcm93IGtleSBzb21laG93IGRpZG4ndCBleGlzdCwgYXNzdW1lIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhaXRlbSA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFpdGVtID0gbWFwcGluZ3NbY29sdW1uXShkYXRhaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRhdGFpdGVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGIucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZGF0YV9rZXkodGFibGUsIGNvbHVtbiwgcm93aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhaXRlbSwgdHhuPXR4bikKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgdHhuID0gTm9uZQorCisgICAgICAgICAgICAgICAgIyBjYXRjaCBhbGwgZXhjZXB0aW9ucyBoZXJlIHNpbmNlIHdlIGNhbGwgdW5rbm93biBjYWxsYWJsZXMKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIHR4bjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGRiZXJyb3I6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsIGRiZXJyb3JbMV0KKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHJhaXNlIFRhYmxlREJFcnJvciwgZGJlcnJvci5hcmdzWzFdCisKKyAgICBkZWYgRGVsZXRlKHNlbGYsIHRhYmxlLCBjb25kaXRpb25zPXt9KToKKyAgICAgICAgIiIiRGVsZXRlKHRhYmxlLCBjb25kaXRpb25zKSAtIERlbGV0ZSBpdGVtcyBtYXRjaGluZyB0aGUgZ2l2ZW4KKyAgICAgICAgY29uZGl0aW9ucyBmcm9tIHRoZSB0YWJsZS4KKworICAgICAgICAqIGNvbmRpdGlvbnMgLSBhIGRpY3Rpb25hcnkga2V5ZWQgb24gY29sdW1uIG5hbWVzIGNvbnRhaW5pbmcKKyAgICAgICAgICBjb25kaXRpb24gZnVuY3Rpb25zIGV4cGVjdGluZyB0aGUgZGF0YSBzdHJpbmcgYXMgYW4KKyAgICAgICAgICBhcmd1bWVudCBhbmQgcmV0dXJuaW5nIGEgYm9vbGVhbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWF0Y2hpbmdfcm93aWRzID0gc2VsZi5fX1NlbGVjdCh0YWJsZSwgW10sIGNvbmRpdGlvbnMpCisKKyAgICAgICAgICAgICMgZGVsZXRlIHJvdyBkYXRhIGZyb20gYWxsIGNvbHVtbnMKKyAgICAgICAgICAgIGNvbHVtbnMgPSBzZWxmLl9fdGFibGVjb2x1bW5zW3RhYmxlXQorICAgICAgICAgICAgZm9yIHJvd2lkIGluIG1hdGNoaW5nX3Jvd2lkcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgdHhuID0gTm9uZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNvbHVtbiBpbiBjb2x1bW5zOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIGRhdGEga2V5CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYi5kZWxldGUoX2RhdGFfa2V5KHRhYmxlLCBjb2x1bW4sIHJvd2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eG49dHhuKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWFhYWFggY29sdW1uIG1heSBub3QgZXhpc3QsIGFzc3VtZSBubyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRiLmRlbGV0ZShfcm93aWRfa2V5KHRhYmxlLCByb3dpZCksIHR4bj10eG4pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQk5vdEZvdW5kRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWFhYWFggcm93IGtleSBzb21laG93IGRpZG4ndCBleGlzdCwgYXNzdW1lIG5vIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgICAgICAgICB0eG4gPSBOb25lCisgICAgICAgICAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGRiZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIHR4bjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yWzFdCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsIGRiZXJyb3IuYXJnc1sxXQorCisKKyAgICBkZWYgU2VsZWN0KHNlbGYsIHRhYmxlLCBjb2x1bW5zLCBjb25kaXRpb25zPXt9KToKKyAgICAgICAgIiIiU2VsZWN0KHRhYmxlLCBjb2x1bW5zLCBjb25kaXRpb25zKSAtIHJldHJpZXZlIHNwZWNpZmljIHJvdyBkYXRhCisgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIHJvdyBjb2x1bW4tPnZhbHVlIG1hcHBpbmcgZGljdGlvbmFyaWVzLgorCisgICAgICAgICogY29sdW1ucyAtIGEgbGlzdCBvZiB3aGljaCBjb2x1bW4gZGF0YSB0byByZXR1cm4uICBJZgorICAgICAgICAgIGNvbHVtbnMgaXMgTm9uZSwgYWxsIGNvbHVtbnMgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgICAgKiBjb25kaXRpb25zIC0gYSBkaWN0aW9uYXJ5IGtleWVkIG9uIGNvbHVtbiBuYW1lcworICAgICAgICAgIGNvbnRhaW5pbmcgY2FsbGFibGUgY29uZGl0aW9ucyBleHBlY3RpbmcgdGhlIGRhdGEgc3RyaW5nIGFzIGFuCisgICAgICAgICAgYXJndW1lbnQgYW5kIHJldHVybmluZyBhIGJvb2xlYW4uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgdGFibGUgaW4gc2VsZi5fX3RhYmxlY29sdW1uczoKKyAgICAgICAgICAgICAgICBzZWxmLl9fbG9hZF9jb2x1bW5faW5mbyh0YWJsZSkKKyAgICAgICAgICAgIGlmIGNvbHVtbnMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb2x1bW5zID0gc2VsZi5fX3RhYmxlY29sdW1uc1t0YWJsZV0KKyAgICAgICAgICAgIG1hdGNoaW5nX3Jvd2lkcyA9IHNlbGYuX19TZWxlY3QodGFibGUsIGNvbHVtbnMsIGNvbmRpdGlvbnMpCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgcmFpc2UgVGFibGVEQkVycm9yLCBkYmVycm9yWzFdCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsIGRiZXJyb3IuYXJnc1sxXQorICAgICAgICAjIHJldHVybiB0aGUgbWF0Y2hlcyBhcyBhIGxpc3Qgb2YgZGljdGlvbmFyaWVzCisgICAgICAgIHJldHVybiBtYXRjaGluZ19yb3dpZHMudmFsdWVzKCkKKworCisgICAgZGVmIF9fU2VsZWN0KHNlbGYsIHRhYmxlLCBjb2x1bW5zLCBjb25kaXRpb25zKToKKyAgICAgICAgIiIiX19TZWxlY3QoKSAtIFVzZWQgdG8gaW1wbGVtZW50IFNlbGVjdCBhbmQgRGVsZXRlIChhYm92ZSkKKyAgICAgICAgUmV0dXJucyBhIGRpY3Rpb25hcnkga2V5ZWQgb24gcm93aWRzIGNvbnRhaW5pbmcgZGljdHMKKyAgICAgICAgaG9sZGluZyB0aGUgcm93IGRhdGEgZm9yIGNvbHVtbnMgbGlzdGVkIGluIHRoZSBjb2x1bW5zIHBhcmFtCisgICAgICAgIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGNvbmRpdGlvbnMuCisgICAgICAgICogY29uZGl0aW9ucyBpcyBhIGRpY3Rpb25hcnkga2V5ZWQgb24gY29sdW1uIG5hbWVzCisgICAgICAgIGNvbnRhaW5pbmcgY2FsbGFibGUgY29uZGl0aW9ucyBleHBlY3RpbmcgdGhlIGRhdGEgc3RyaW5nIGFzIGFuCisgICAgICAgIGFyZ3VtZW50IGFuZCByZXR1cm5pbmcgYSBib29sZWFuLgorICAgICAgICAiIiIKKyAgICAgICAgIyBjaGVjayB0aGUgdmFsaWRpdHkgb2YgZWFjaCBjb2x1bW4gbmFtZQorICAgICAgICBpZiBub3QgdGFibGUgaW4gc2VsZi5fX3RhYmxlY29sdW1uczoKKyAgICAgICAgICAgIHNlbGYuX19sb2FkX2NvbHVtbl9pbmZvKHRhYmxlKQorICAgICAgICBpZiBjb2x1bW5zIGlzIE5vbmU6CisgICAgICAgICAgICBjb2x1bW5zID0gc2VsZi50YWJsZWNvbHVtbnNbdGFibGVdCisgICAgICAgIGZvciBjb2x1bW4gaW4gKGNvbHVtbnMgKyBjb25kaXRpb25zLmtleXMoKSk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX3RhYmxlY29sdW1uc1t0YWJsZV0uY291bnQoY29sdW1uKToKKyAgICAgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IsICJ1bmtub3duIGNvbHVtbjogJXIiICUgKGNvbHVtbiwpCisKKyAgICAgICAgIyBrZXllZCBvbiByb3dzIHRoYXQgbWF0Y2ggc28gZmFyLCBjb250YWluaW5ncyBkaWN0cyBrZXllZCBvbgorICAgICAgICAjIGNvbHVtbiBuYW1lcyBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGF0IHJvdyBhbmQgY29sdW1uLgorICAgICAgICBtYXRjaGluZ19yb3dpZHMgPSB7fQorICAgICAgICAjIGtleXMgYXJlIHJvd2lkcyB0aGF0IGRvIG5vdCBtYXRjaAorICAgICAgICByZWplY3RlZF9yb3dpZHMgPSB7fQorCisgICAgICAgICMgYXR0ZW1wdCB0byBzb3J0IHRoZSBjb25kaXRpb25zIGluIHN1Y2ggYSB3YXkgYXMgdG8gbWluaW1pemUgZnVsbAorICAgICAgICAjIGNvbHVtbiBsb29rdXBzCisgICAgICAgIGRlZiBjbXBfY29uZGl0aW9ucyhhdHVwbGUsIGJ0dXBsZSk6CisgICAgICAgICAgICBhID0gYXR1cGxlWzFdCisgICAgICAgICAgICBiID0gYnR1cGxlWzFdCisgICAgICAgICAgICBpZiB0eXBlKGEpIGlzIHR5cGUoYik6CisKKyAgICAgICAgICAgICAgICAjIE5lZWRlZCBmb3IgcHl0aG9uIDMuICJjbXAiIHZhbmlzaGVkIGluIDMuMC4xCisgICAgICAgICAgICAgICAgZGVmIGNtcChhLCBiKSA6CisgICAgICAgICAgICAgICAgICAgIGlmIGE9PWIgOiByZXR1cm4gMAorICAgICAgICAgICAgICAgICAgICBpZiBhPGIgOiByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgUHJlZml4Q29uZCkgYW5kIGlzaW5zdGFuY2UoYiwgUHJlZml4Q29uZCk6CisgICAgICAgICAgICAgICAgICAgICMgbG9uZ2VzdCBwcmVmaXggZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChsZW4oYi5wcmVmaXgpLCBsZW4oYS5wcmVmaXgpKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgTGlrZUNvbmQpIGFuZCBpc2luc3RhbmNlKGIsIExpa2VDb25kKToKKyAgICAgICAgICAgICAgICAgICAgIyBsb25nZXN0IGxpa2VzdHIgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChsZW4oYi5saWtlc3RyKSwgbGVuKGEubGlrZXN0cikpCisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYSwgRXhhY3RDb25kKToKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgRXhhY3RDb25kKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBQcmVmaXhDb25kKToKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgUHJlZml4Q29uZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgICMgbGVhdmUgYWxsIHVua25vd24gY29uZGl0aW9uIGNhbGxhYmxlcyBhbG9uZSBhcyBlcXVhbHMKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICBjb25kaXRpb25saXN0ID0gY29uZGl0aW9ucy5pdGVtcygpCisgICAgICAgICAgICBjb25kaXRpb25saXN0LnNvcnQoY21wX2NvbmRpdGlvbnMpCisgICAgICAgIGVsc2UgOiAgIyBJbnNlcnRpb24gU29ydC4gUGxlYXNlLCBpbXByb3ZlCisgICAgICAgICAgICBjb25kaXRpb25saXN0ID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIGNvbmRpdGlvbnMuaXRlbXMoKSA6CisgICAgICAgICAgICAgICAgZm9yIGosIGsgaW4gZW51bWVyYXRlKGNvbmRpdGlvbmxpc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgciA9IGNtcF9jb25kaXRpb25zKGssIGkpCisgICAgICAgICAgICAgICAgICAgIGlmIHIgPT0gMSA6CisgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25saXN0Lmluc2VydChqLCBpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ubGlzdC5hcHBlbmQoaSkKKworICAgICAgICAjIEFwcGx5IGNvbmRpdGlvbnMgdG8gY29sdW1uIGRhdGEgdG8gZmluZCB3aGF0IHdlIHdhbnQKKyAgICAgICAgY3VyID0gc2VsZi5kYi5jdXJzb3IoKQorICAgICAgICBjb2x1bW5fbnVtID0gLTEKKyAgICAgICAgZm9yIGNvbHVtbiwgY29uZGl0aW9uIGluIGNvbmRpdGlvbmxpc3Q6CisgICAgICAgICAgICBjb2x1bW5fbnVtID0gY29sdW1uX251bSArIDEKKyAgICAgICAgICAgIHNlYXJjaGtleSA9IF9zZWFyY2hfY29sX2RhdGFfa2V5KHRhYmxlLCBjb2x1bW4pCisgICAgICAgICAgICAjIHNwZWVkdXA6IGRvbid0IGxpbmVhciBzZWFyY2ggY29sdW1ucyB3aXRoaW4gbG9vcAorICAgICAgICAgICAgaWYgY29sdW1uIGluIGNvbHVtbnM6CisgICAgICAgICAgICAgICAgc2F2ZXRoaXNjb2x1bW5kYXRhID0gMSAgIyBzYXZlIHRoZSBkYXRhIGZvciByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2F2ZXRoaXNjb2x1bW5kYXRhID0gMCAgIyBkYXRhIG9ubHkgdXNlZCBmb3Igc2VsZWN0aW9uCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBrZXksIGRhdGEgPSBjdXIuc2V0X3JhbmdlKHNlYXJjaGtleSkKKyAgICAgICAgICAgICAgICB3aGlsZSBrZXlbOmxlbihzZWFyY2hrZXkpXSA9PSBzZWFyY2hrZXk6CisgICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgcm93aWQgZnJvbSB0aGUga2V5CisgICAgICAgICAgICAgICAgICAgIHJvd2lkID0ga2V5Wy1fcm93aWRfc3RyX2xlbjpdCisKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJvd2lkIGluIHJlamVjdGVkX3Jvd2lkczoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm8gY29uZGl0aW9uIHdhcyBzcGVjaWZpZWQgb3IgdGhlIGNvbmRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzdWNjZWVkcywgYWRkIHJvdyB0byBvdXIgbWF0Y2ggbGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjb25kaXRpb24gb3IgY29uZGl0aW9uKGRhdGEpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByb3dpZCBpbiBtYXRjaGluZ19yb3dpZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nX3Jvd2lkc1tyb3dpZF0gPSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNhdmV0aGlzY29sdW1uZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdfcm93aWRzW3Jvd2lkXVtjb2x1bW5dID0gZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiByb3dpZCBpbiBtYXRjaGluZ19yb3dpZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBtYXRjaGluZ19yb3dpZHNbcm93aWRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWRfcm93aWRzW3Jvd2lkXSA9IHJvd2lkCisKKyAgICAgICAgICAgICAgICAgICAga2V5LCBkYXRhID0gY3VyLm5leHQoKQorCisgICAgICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZGJlcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBkYmVycm9yLmFyZ3NbMF0gIT0gZGIuREJfTk9URk9VTkQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBjdXIuY2xvc2UoKQorCisgICAgICAgICMgd2UncmUgZG9uZSBzZWxlY3Rpbmcgcm93cywgZ2FyYmFnZSBjb2xsZWN0IHRoZSByZWplY3QgbGlzdAorICAgICAgICBkZWwgcmVqZWN0ZWRfcm93aWRzCisKKyAgICAgICAgIyBleHRyYWN0IGFueSByZW1haW5pbmcgZGVzaXJlZCBjb2x1bW4gZGF0YSBmcm9tIHRoZQorICAgICAgICAjIGRhdGFiYXNlIGZvciB0aGUgbWF0Y2hpbmcgcm93cy4KKyAgICAgICAgaWYgbGVuKGNvbHVtbnMpID4gMDoKKyAgICAgICAgICAgIGZvciByb3dpZCwgcm93ZGF0YSBpbiBtYXRjaGluZ19yb3dpZHMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmb3IgY29sdW1uIGluIGNvbHVtbnM6CisgICAgICAgICAgICAgICAgICAgIGlmIGNvbHVtbiBpbiByb3dkYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcm93ZGF0YVtjb2x1bW5dID0gc2VsZi5kYi5nZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RhdGFfa2V5KHRhYmxlLCBjb2x1bW4sIHJvd2lkKSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGRiZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBkYmVycm9yWzBdICE9IGRiLkRCX05PVEZPVU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZGJlcnJvci5hcmdzWzBdICE9IGRiLkRCX05PVEZPVU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgcm93ZGF0YVtjb2x1bW5dID0gTm9uZQorCisgICAgICAgICMgcmV0dXJuIHRoZSBtYXRjaGVzCisgICAgICAgIHJldHVybiBtYXRjaGluZ19yb3dpZHMKKworCisgICAgZGVmIERyb3Aoc2VsZiwgdGFibGUpOgorICAgICAgICAiIiJSZW1vdmUgYW4gZW50aXJlIHRhYmxlIGZyb20gdGhlIGRhdGFiYXNlIiIiCisgICAgICAgIHR4biA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKworICAgICAgICAgICAgIyBkZWxldGUgdGhlIGNvbHVtbiBsaXN0CisgICAgICAgICAgICBzZWxmLmRiLmRlbGV0ZShfY29sdW1uc19rZXkodGFibGUpLCB0eG49dHhuKQorCisgICAgICAgICAgICBjdXIgPSBzZWxmLmRiLmN1cnNvcih0eG4pCisKKyAgICAgICAgICAgICMgZGVsZXRlIGFsbCBrZXlzIGNvbnRhaW5pbmcgdGhpcyB0YWJsZXMgY29sdW1uIGFuZCByb3cgaW5mbworICAgICAgICAgICAgdGFibGVfa2V5ID0gX3NlYXJjaF9hbGxfZGF0YV9rZXkodGFibGUpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAga2V5LCBkYXRhID0gY3VyLnNldF9yYW5nZSh0YWJsZV9rZXkpCisgICAgICAgICAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAjIG9ubHkgZGVsZXRlIGl0ZW1zIGluIHRoaXMgdGFibGUKKyAgICAgICAgICAgICAgICBpZiBrZXlbOmxlbih0YWJsZV9rZXkpXSAhPSB0YWJsZV9rZXk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgY3VyLmRlbGV0ZSgpCisKKyAgICAgICAgICAgICMgZGVsZXRlIGFsbCByb3dpZHMgdXNlZCBieSB0aGlzIHRhYmxlCisgICAgICAgICAgICB0YWJsZV9rZXkgPSBfc2VhcmNoX3Jvd2lkX2tleSh0YWJsZSkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBrZXksIGRhdGEgPSBjdXIuc2V0X3JhbmdlKHRhYmxlX2tleSkKKyAgICAgICAgICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICMgb25seSBkZWxldGUgaXRlbXMgaW4gdGhpcyB0YWJsZQorICAgICAgICAgICAgICAgIGlmIGtleVs6bGVuKHRhYmxlX2tleSldICE9IHRhYmxlX2tleToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjdXIuZGVsZXRlKCkKKworICAgICAgICAgICAgY3VyLmNsb3NlKCkKKworICAgICAgICAgICAgIyBkZWxldGUgdGhlIHRhYmxlbmFtZSBmcm9tIHRoZSB0YWJsZSBuYW1lIGxpc3QKKyAgICAgICAgICAgIHRhYmxlbGlzdCA9IHBpY2tsZS5sb2FkcygKKyAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYuZGIsICJnZXRfYnl0ZXMiLCBzZWxmLmRiLmdldCkoX3RhYmxlX25hbWVzX2tleSwKKyAgICAgICAgICAgICAgICAgICAgdHhuPXR4biwgZmxhZ3M9ZGIuREJfUk1XKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YWJsZWxpc3QucmVtb3ZlKHRhYmxlKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBobW0sIGl0IHdhc24ndCB0aGVyZSwgb2ggd2VsbCwgdGhhdCdzIHdoYXQgd2Ugd2FudC4KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGRlbGV0ZSAxc3QsIGluY2FzZSB3ZSBvcGVuZWQgd2l0aCBEQl9EVVAKKyAgICAgICAgICAgIHNlbGYuZGIuZGVsZXRlKF90YWJsZV9uYW1lc19rZXksIHR4bj10eG4pCisgICAgICAgICAgICBnZXRhdHRyKHNlbGYuZGIsICJwdXRfYnl0ZXMiLCBzZWxmLmRiLnB1dCkoX3RhYmxlX25hbWVzX2tleSwKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXBzKHRhYmxlbGlzdCwgMSksIHR4bj10eG4pCisKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgdHhuID0gTm9uZQorCisgICAgICAgICAgICBpZiB0YWJsZSBpbiBzZWxmLl9fdGFibGVjb2x1bW5zOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9fdGFibGVjb2x1bW5zW3RhYmxlXQorCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBkYmVycm9yOgorICAgICAgICAgICAgaWYgdHhuOgorICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICByYWlzZSBUYWJsZURCRXJyb3IoZGJlcnJvci5hcmdzWzFdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnRhYmxlcy5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RidGFibGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjFhOGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnRhYmxlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnRhYmxlcy5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL2RidGFibGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWY1NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnRhYmxlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTY4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL2RidXRpbHMucHkKQEAgLTAsMCArMSw4MyBAQAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDAgQXV0b25vbW91cyBab25lIEluZHVzdHJpZXMKKyMKKyMgTGljZW5zZTogICAgICBUaGlzIGlzIGZyZWUgc29mdHdhcmUuICBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyMgICAgICAgICAgICAgICBwdXJwb3NlIGluY2x1ZGluZyBtb2RpZmljYXRpb24vcmVkaXN0cmlidXRpb24sIHNvIGxvbmcgYXMKKyMgICAgICAgICAgICAgICB0aGlzIGhlYWRlciByZW1haW5zIGludGFjdCBhbmQgdGhhdCB5b3UgZG8gbm90IGNsYWltIGFueQorIyAgICAgICAgICAgICAgIHJpZ2h0cyBvZiBvd25lcnNoaXAgb3IgYXV0aG9yc2hpcCBvZiB0aGlzIHNvZnR3YXJlLiAgVGhpcworIyAgICAgICAgICAgICAgIHNvZnR3YXJlIGhhcyBiZWVuIHRlc3RlZCwgYnV0IG5vIHdhcnJhbnR5IGlzIGV4cHJlc3NlZCBvcgorIyAgICAgICAgICAgICAgIGltcGxpZWQuCisjCisjIEF1dGhvcjogR3JlZ29yeSBQLiBTbWl0aCA8Z3JlZ0BrcnlwdG8ub3JnPgorIworIyBOb3RlOiBJIGRvbid0IGtub3cgaG93IHVzZWZ1bCB0aGlzIGlzIGluIHJlYWxpdHkgc2luY2Ugd2hlbiBhCisjICAgICAgIERCTG9ja0RlYWRsb2NrRXJyb3IgaGFwcGVucyB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBpcyBzdXBwb3NlZCB0byBiZQorIyAgICAgICBhYm9ydGVkLiAgSWYgaXQgZG9lc24ndCB0aGVuIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQgYWdhaW4KKyMgICAgICAgdGhlIGRlYWRsb2NrIGlzIHN0aWxsIGhhcHBlbmluZy4uLgorIyAgICAgICAtLVJvYmluCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworIworIyBpbXBvcnQgdGhlIHRpbWUuc2xlZXAgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2FmZSB3YXkgdG8gYWxsb3cKKyMgImZyb20gYnNkZGIuZGJ1dGlscyBpbXBvcnQgKiIKKyMKK2Zyb20gdGltZSBpbXBvcnQgc2xlZXAgYXMgX3NsZWVwCisKK2ltcG9ydCBzeXMKK2Fic29sdXRlX2ltcG9ydCA9IChzeXMudmVyc2lvbl9pbmZvWzBdID49IDMpCitpZiBhYnNvbHV0ZV9pbXBvcnQgOgorICAgICMgQmVjYXVzZSB0aGlzIHN5bnRheGlzIGlzIG5vdCB2YWxpZCBiZWZvcmUgUHl0aG9uIDIuNQorICAgIGV4ZWMoImZyb20gLiBpbXBvcnQgZGIiKQorZWxzZSA6CisgICAgaW1wb3J0IGRiCisKKyMgYWx3YXlzIHNsZWVwIGF0IGxlYXN0IE4gc2Vjb25kcyBiZXR3ZWVuIHJldHJ5cworX2RlYWRsb2NrX01pblNsZWVwVGltZSA9IDEuMC8xMjgKKyMgbmV2ZXIgc2xlZXAgbW9yZSB0aGFuIE4gc2Vjb25kcyBiZXR3ZWVuIHJldHJ5cworX2RlYWRsb2NrX01heFNsZWVwVGltZSA9IDMuMTQxNTkKKworIyBBc3NpZ24gYSBmaWxlIG9iamVjdCB0byB0aGlzIGZvciBhICJzbGVlcGluZyIgbWVzc2FnZSB0byBiZSB3cml0dGVuIHRvIGl0CisjIGVhY2ggcmV0cnkKK19kZWFkbG9ja19WZXJib3NlRmlsZSA9IE5vbmUKKworCitkZWYgRGVhZGxvY2tXcmFwKGZ1bmN0aW9uLCAqX2FyZ3MsICoqX2t3YXJncyk6CisgICAgIiIiRGVhZGxvY2tXcmFwKGZ1bmN0aW9uLCAqX2FyZ3MsICoqX2t3YXJncykgLSBhdXRvbWF0aWNhbGx5IHJldHJpZXMKKyAgICBmdW5jdGlvbiBpbiBjYXNlIG9mIGEgZGF0YWJhc2UgZGVhZGxvY2suCisKKyAgICBUaGlzIGlzIGEgZnVuY3Rpb24gaW50ZW5kZWQgdG8gYmUgdXNlZCB0byB3cmFwIGRhdGFiYXNlIGNhbGxzIHN1Y2gKKyAgICB0aGF0IHRoZXkgcGVyZm9ybSByZXRyeXMgd2l0aCBleHBvbmVudGlhbGx5IGJhY2tpbmcgb2ZmIHNsZWVwcyBpbgorICAgIGJldHdlZW4gd2hlbiBhIERCTG9ja0RlYWRsb2NrRXJyb3IgZXhjZXB0aW9uIGlzIHJhaXNlZC4KKworICAgIEEgJ21heF9yZXRyaWVzJyBwYXJhbWV0ZXIgbWF5IG9wdGlvbmFsbHkgYmUgcGFzc2VkIHRvIHByZXZlbnQgaXQKKyAgICBmcm9tIHJldHJ5aW5nIGZvcmV2ZXIgKGluIHdoaWNoIGNhc2UgdGhlIGV4Y2VwdGlvbiB3aWxsIGJlIHJlcmFpc2VkKS4KKworICAgICAgICBkID0gREIoLi4uKQorICAgICAgICBkLm9wZW4oLi4uKQorICAgICAgICBEZWFkbG9ja1dyYXAoZC5wdXQsICJmb28iLCBkYXRhPSJiYXIiKSAgIyBzZXQga2V5ICJmb28iIHRvICJiYXIiCisgICAgIiIiCisgICAgc2xlZXB0aW1lID0gX2RlYWRsb2NrX01pblNsZWVwVGltZQorICAgIG1heF9yZXRyaWVzID0gX2t3YXJncy5nZXQoJ21heF9yZXRyaWVzJywgLTEpCisgICAgaWYgJ21heF9yZXRyaWVzJyBpbiBfa3dhcmdzOgorICAgICAgICBkZWwgX2t3YXJnc1snbWF4X3JldHJpZXMnXQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigqX2FyZ3MsICoqX2t3YXJncykKKyAgICAgICAgZXhjZXB0IGRiLkRCTG9ja0RlYWRsb2NrRXJyb3I6CisgICAgICAgICAgICBpZiBfZGVhZGxvY2tfVmVyYm9zZUZpbGU6CisgICAgICAgICAgICAgICAgX2RlYWRsb2NrX1ZlcmJvc2VGaWxlLndyaXRlKAorICAgICAgICAgICAgICAgICAgICAnZGJ1dGlscy5EZWFkbG9ja1dyYXA6IHNsZWVwaW5nICUxLjNmXG4nICUgc2xlZXB0aW1lKQorICAgICAgICAgICAgX3NsZWVwKHNsZWVwdGltZSkKKyAgICAgICAgICAgICMgZXhwb25lbnRpYWwgYmFja29mZiBpbiB0aGUgc2xlZXAgdGltZQorICAgICAgICAgICAgc2xlZXB0aW1lICo9IDIKKyAgICAgICAgICAgIGlmIHNsZWVwdGltZSA+IF9kZWFkbG9ja19NYXhTbGVlcFRpbWU6CisgICAgICAgICAgICAgICAgc2xlZXB0aW1lID0gX2RlYWRsb2NrX01heFNsZWVwVGltZQorICAgICAgICAgICAgbWF4X3JldHJpZXMgLT0gMQorICAgICAgICAgICAgaWYgbWF4X3JldHJpZXMgPT0gLTE6CisgICAgICAgICAgICAgICAgcmFpc2UKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RidXRpbHMucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2NmMzdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL2RidXRpbHMucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2NmMzdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi9kYnV0aWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2ZjU0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M2ZjU0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWYxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hbGwucHkKQEAgLTAsMCArMSw2MjMgQEAKKyIiIlJ1biBhbGwgdGVzdCBjYXNlcy4KKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAordHJ5OgorICAgICMgRm9yIFB5dGhvbnMgdy9kaXN0dXRpbHMgcHlic2RkYgorICAgIGltcG9ydCBic2RkYjMgYXMgYnNkZGIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIEZvciBQeXRob24gMi4zCisgICAgaW1wb3J0IGJzZGRiCisKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzIDoKKyAgICBjaGFyc2V0ID0gImlzbzg4NTktMSIgICMgRnVsbCA4IGJpdAorCisgICAgY2xhc3MgbG9nY3Vyc29yX3B5M2sob2JqZWN0KSA6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnYpIDoKKyAgICAgICAgICAgIHNlbGYuX2xvZ2N1cnNvciA9IGVudi5sb2dfY3Vyc29yKCkKKworICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgdikgOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fbG9nY3Vyc29yLCB2KQorCisgICAgICAgIGRlZiBfX25leHRfXyhzZWxmKSA6CisgICAgICAgICAgICB2ID0gZ2V0YXR0cihzZWxmLl9sb2djdXJzb3IsICJuZXh0IikoKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdiA9ICh2WzBdLCB2WzFdLmRlY29kZShjaGFyc2V0KSkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgbmV4dCA9IF9fbmV4dF9fCisKKyAgICAgICAgZGVmIGZpcnN0KHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9sb2djdXJzb3IuZmlyc3QoKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdiA9ICh2WzBdLCB2WzFdLmRlY29kZShjaGFyc2V0KSkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIGxhc3Qoc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2xvZ2N1cnNvci5sYXN0KCkKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIHYgPSAodlswXSwgdlsxXS5kZWNvZGUoY2hhcnNldCkpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBwcmV2KHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9sb2djdXJzb3IucHJldigpCisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICB2ID0gKHZbMF0sIHZbMV0uZGVjb2RlKGNoYXJzZXQpKQorICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICBkZWYgY3VycmVudChzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fbG9nY3Vyc29yLmN1cnJlbnQoKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdiA9ICh2WzBdLCB2WzFdLmRlY29kZShjaGFyc2V0KSkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIHNldChzZWxmLCBsc24pIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9sb2djdXJzb3Iuc2V0KGxzbikKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIHYgPSAodlswXSwgdlsxXS5kZWNvZGUoY2hhcnNldCkpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgY2xhc3MgY3Vyc29yX3B5M2sob2JqZWN0KSA6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYiwgKmFyZ3MsICoqa3dhcmdzKSA6CisgICAgICAgICAgICBzZWxmLl9kYmN1cnNvciA9IGRiLmN1cnNvcigqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIHYpIDoKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2RiY3Vyc29yLCB2KQorCisgICAgICAgIGRlZiBfZml4KHNlbGYsIHYpIDoKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZSA6IHJldHVybiBOb25lCisgICAgICAgICAgICBrZXksIHZhbHVlID0gdgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAga2V5ID0ga2V5LmRlY29kZShjaGFyc2V0KQorICAgICAgICAgICAgcmV0dXJuIChrZXksIHZhbHVlLmRlY29kZShjaGFyc2V0KSkKKworICAgICAgICBkZWYgX19uZXh0X18oc2VsZikgOgorICAgICAgICAgICAgdiA9IGdldGF0dHIoc2VsZi5fZGJjdXJzb3IsICJuZXh0IikoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIG5leHQgPSBfX25leHRfXworCisgICAgICAgIGRlZiBwcmV2aW91cyhzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3IucHJldmlvdXMoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIGRlZiBsYXN0KHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5sYXN0KCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgICAgICBkZWYgc2V0KHNlbGYsIGspIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSA6CisgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssIGNoYXJzZXQpCisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3Iuc2V0KGspCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KHYpCisKKyAgICAgICAgZGVmIHNldF9yZWNubyhzZWxmLCBudW0pIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5zZXRfcmVjbm8obnVtKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIGRlZiBzZXRfcmFuZ2Uoc2VsZiwgaywgZGxlbj0tMSwgZG9mZj0tMSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrID0gYnl0ZXMoaywgY2hhcnNldCkKKyAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5zZXRfcmFuZ2UoaywgZGxlbj1kbGVuLCBkb2ZmPWRvZmYpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KHYpCisKKyAgICAgICAgZGVmIGR1cChzZWxmLCBmbGFncz0wKSA6CisgICAgICAgICAgICBjdXJzb3IgPSBzZWxmLl9kYmN1cnNvci5kdXAoZmxhZ3MpCisgICAgICAgICAgICByZXR1cm4gZHVwX2N1cnNvcl9weTNrKGN1cnNvcikKKworICAgICAgICBkZWYgbmV4dF9kdXAoc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2RiY3Vyc29yLm5leHRfZHVwKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgICAgICBkZWYgbmV4dF9ub2R1cChzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3IubmV4dF9ub2R1cCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KHYpCisKKyAgICAgICAgZGVmIHB1dChzZWxmLCBrZXksIGRhdGEsIGZsYWdzPTAsIGRsZW49LTEsIGRvZmY9LTEpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksIGNoYXJzZXQpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRhdGEsIHN0cikgOgorICAgICAgICAgICAgICAgIHZhbHVlID0gYnl0ZXMoZGF0YSwgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYmN1cnNvci5wdXQoa2V5LCBkYXRhLCBmbGFncz1mbGFncywgZGxlbj1kbGVuLAorICAgICAgICAgICAgICAgICAgICBkb2ZmPWRvZmYpCisKKyAgICAgICAgZGVmIGN1cnJlbnQoc2VsZiwgZmxhZ3M9MCwgZGxlbj0tMSwgZG9mZj0tMSkgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2RiY3Vyc29yLmN1cnJlbnQoZmxhZ3M9ZmxhZ3MsIGRsZW49ZGxlbiwgZG9mZj1kb2ZmKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIGRlZiBmaXJzdChzZWxmKSA6CisgICAgICAgICAgICB2ID0gc2VsZi5fZGJjdXJzb3IuZmlyc3QoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeCh2KQorCisgICAgICAgIGRlZiBwZ2V0KHNlbGYsIGtleT1Ob25lLCBkYXRhPU5vbmUsIGZsYWdzPTApIDoKKyAgICAgICAgICAgICMgSW5jb3JyZWN0IGJlY2F1c2Uga2V5IGNhbiBiZSBhIGJhcmUgbnVtYmVyLAorICAgICAgICAgICAgIyBidXQgZW5vdWdoIHRvIHBhc3MgdGVzdHN1aXRlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgaW50KSBhbmQgKGRhdGEgaXMgTm9uZSkgYW5kIChmbGFncyA9PSAwKSA6CisgICAgICAgICAgICAgICAgZmxhZ3MgPSBrZXkKKyAgICAgICAgICAgICAgICBrZXkgPSBOb25lCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKSA6CisgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCBjaGFyc2V0KQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBpbnQpIGFuZCAoZmxhZ3M9PTApIDoKKyAgICAgICAgICAgICAgICBmbGFncyA9IGRhdGEKKyAgICAgICAgICAgICAgICBkYXRhID0gTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpIDoKKyAgICAgICAgICAgICAgICBkYXRhID0gYnl0ZXMoZGF0YSwgY2hhcnNldCkKKyAgICAgICAgICAgIHY9c2VsZi5fZGJjdXJzb3IucGdldChrZXk9a2V5LCBkYXRhPWRhdGEsIGZsYWdzPWZsYWdzKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgdjEsIHYyLCB2MyA9IHYKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYxLCBieXRlcykgOgorICAgICAgICAgICAgICAgICAgICB2MSA9IHYxLmRlY29kZShjaGFyc2V0KQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodjIsIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAgICAgIHYyID0gdjIuZGVjb2RlKGNoYXJzZXQpCisKKyAgICAgICAgICAgICAgICB2ID0gKHYxLCB2MiwgdjMuZGVjb2RlKGNoYXJzZXQpKQorCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBqb2luX2l0ZW0oc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuX2RiY3Vyc29yLmpvaW5faXRlbSgpCisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICB2ID0gdi5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIGdldChzZWxmLCAqYXJncywgKiprd2FyZ3MpIDoKKyAgICAgICAgICAgIGwgPSBsZW4oYXJncykKKyAgICAgICAgICAgIGlmIGwgPT0gMiA6CisgICAgICAgICAgICAgICAgaywgZiA9IGFyZ3MKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIHN0cikgOgorICAgICAgICAgICAgICAgICAgICBrID0gYnl0ZXMoaywgImlzbzg4NTktMSIpCisgICAgICAgICAgICAgICAgYXJncyA9IChrLCBmKQorICAgICAgICAgICAgZWxpZiBsID09IDMgOgorICAgICAgICAgICAgICAgIGssIGQsIGYgPSBhcmdzCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBzdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssIGNoYXJzZXQpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkLCBzdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgZCA9IGJ5dGVzKGQsIGNoYXJzZXQpCisgICAgICAgICAgICAgICAgYXJncyA9KGssIGQsIGYpCisKKyAgICAgICAgICAgIHYgPSBzZWxmLl9kYmN1cnNvci5nZXQoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgaWYgdiBpcyBub3QgTm9uZSA6CisgICAgICAgICAgICAgICAgaywgdiA9IHYKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAgICAgIGsgPSBrLmRlY29kZShjaGFyc2V0KQorICAgICAgICAgICAgICAgIHYgPSAoaywgdi5kZWNvZGUoY2hhcnNldCkpCisgICAgICAgICAgICByZXR1cm4gdgorCisgICAgICAgIGRlZiBnZXRfYm90aChzZWxmLCBrZXksIHZhbHVlKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKSA6CisgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCBjaGFyc2V0KQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBieXRlcyh2YWx1ZSwgY2hhcnNldCkKKyAgICAgICAgICAgIHY9c2VsZi5fZGJjdXJzb3IuZ2V0X2JvdGgoa2V5LCB2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgodikKKworICAgIGNsYXNzIGR1cF9jdXJzb3JfcHkzayhjdXJzb3JfcHkzaykgOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGJjdXJzb3IpIDoKKyAgICAgICAgICAgIHNlbGYuX2RiY3Vyc29yID0gZGJjdXJzb3IKKworICAgIGNsYXNzIERCX3B5M2sob2JqZWN0KSA6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpIDoKKyAgICAgICAgICAgIGFyZ3MyPVtdCisgICAgICAgICAgICBmb3IgaSBpbiBhcmdzIDoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGksIERCRW52X3B5M2spIDoKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkuX2RiZW52CisgICAgICAgICAgICAgICAgYXJnczIuYXBwZW5kKGkpCisgICAgICAgICAgICBhcmdzID0gdHVwbGUoYXJnczIpCisgICAgICAgICAgICBmb3IgaywgdiBpbiBrd2FyZ3MuaXRlbXMoKSA6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBEQkVudl9weTNrKSA6CisgICAgICAgICAgICAgICAgICAgIGt3YXJnc1trXSA9IHYuX2RiZW52CisKKyAgICAgICAgICAgIHNlbGYuX2RiID0gYnNkZGIuX2RiLkRCX29yaWcoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgaykgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrID0gYnl0ZXMoaywgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX2RiLCAiaGFzX2tleSIpKGspCisKKyAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGspIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoaywgc3RyKSA6CisgICAgICAgICAgICAgICAgayA9IGJ5dGVzKGssIGNoYXJzZXQpCisgICAgICAgICAgICB2ID0gc2VsZi5fZGJba10KKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmUgOgorICAgICAgICAgICAgICAgIHYgPSB2LmRlY29kZShjaGFyc2V0KQorICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaywgdikgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrID0gYnl0ZXMoaywgY2hhcnNldCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uodiwgc3RyKSA6CisgICAgICAgICAgICAgICAgdiA9IGJ5dGVzKHYsIGNoYXJzZXQpCisgICAgICAgICAgICBzZWxmLl9kYltrXSA9IHYKKworICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaykgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrLCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrID0gYnl0ZXMoaywgY2hhcnNldCkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9kYltrXQorCisgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCB2KSA6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9kYiwgdikKKworICAgICAgICBkZWYgX19sZW5fXyhzZWxmKSA6CisgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2RiKQorCisgICAgICAgIGRlZiBoYXNfa2V5KHNlbGYsIGssIHR4bj1Ob25lKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIHN0cikgOgorICAgICAgICAgICAgICAgIGsgPSBieXRlcyhrLCBjaGFyc2V0KQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiLmhhc19rZXkoaywgdHhuPXR4bikKKworICAgICAgICBkZWYgc2V0X3JlX2RlbGltKHNlbGYsIGMpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYywgc3RyKSA6ICAjIFdlIGNhbiB1c2UgYSBudW1lcmljIHZhbHVlIGJ5dGUgdG9vCisgICAgICAgICAgICAgICAgYyA9IGJ5dGVzKGMsIGNoYXJzZXQpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGIuc2V0X3JlX2RlbGltKGMpCisKKyAgICAgICAgZGVmIHNldF9yZV9wYWQoc2VsZiwgYykgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjLCBzdHIpIDogICMgV2UgY2FuIHVzZSBhIG51bWVyaWMgdmFsdWUgYnl0ZSB0b28KKyAgICAgICAgICAgICAgICBjID0gYnl0ZXMoYywgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5zZXRfcmVfcGFkKGMpCisKKyAgICAgICAgZGVmIGdldF9yZV9zb3VyY2Uoc2VsZikgOgorICAgICAgICAgICAgc291cmNlID0gc2VsZi5fZGIuZ2V0X3JlX3NvdXJjZSgpCisgICAgICAgICAgICByZXR1cm4gc291cmNlLmRlY29kZShjaGFyc2V0KQorCisgICAgICAgIGRlZiBwdXQoc2VsZiwga2V5LCBkYXRhLCB0eG49Tm9uZSwgZmxhZ3M9MCwgZGxlbj0tMSwgZG9mZj0tMSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSwgc3RyKSA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBieXRlcyhkYXRhLCBjaGFyc2V0KQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiLnB1dChrZXksIGRhdGEsIGZsYWdzPWZsYWdzLCB0eG49dHhuLCBkbGVuPWRsZW4sCisgICAgICAgICAgICAgICAgICAgIGRvZmY9ZG9mZikKKworICAgICAgICBkZWYgYXBwZW5kKHNlbGYsIHZhbHVlLCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBieXRlcyh2YWx1ZSwgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5hcHBlbmQodmFsdWUsIHR4bj10eG4pCisKKyAgICAgICAgZGVmIGdldF9zaXplKHNlbGYsIGtleSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5nZXRfc2l6ZShrZXkpCisKKyAgICAgICAgZGVmIGV4aXN0cyhzZWxmLCBrZXksICphcmdzLCAqKmt3YXJncykgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYi5leGlzdHMoa2V5LCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Ik1hZ2ljQ29va2llIiwgdHhuPU5vbmUsIGZsYWdzPTAsIGRsZW49LTEsIGRvZmY9LTEpIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBzdHIpIDoKKyAgICAgICAgICAgICAgICBrZXkgPSBieXRlcyhrZXksIGNoYXJzZXQpCisgICAgICAgICAgICBpZiBkZWZhdWx0ICE9ICJNYWdpY0Nvb2tpZSIgOiAgIyBNYWdpYyBmb3IgJ3Rlc3RfZ2V0X25vbmUucHknCisgICAgICAgICAgICAgICAgdj1zZWxmLl9kYi5nZXQoa2V5LCBkZWZhdWx0PWRlZmF1bHQsIHR4bj10eG4sIGZsYWdzPWZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgZGxlbj1kbGVuLCBkb2ZmPWRvZmYpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICB2PXNlbGYuX2RiLmdldChrZXksIHR4bj10eG4sIGZsYWdzPWZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgZGxlbj1kbGVuLCBkb2ZmPWRvZmYpCisgICAgICAgICAgICBpZiAodiBpcyBub3QgTm9uZSkgYW5kIGlzaW5zdGFuY2UodiwgYnl0ZXMpIDoKKyAgICAgICAgICAgICAgICB2ID0gdi5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIHBnZXQoc2VsZiwga2V5LCB0eG49Tm9uZSkgOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgIGtleSA9IGJ5dGVzKGtleSwgY2hhcnNldCkKKyAgICAgICAgICAgIHY9c2VsZi5fZGIucGdldChrZXksIHR4bj10eG4pCisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICB2MSwgdjIgPSB2CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2MSwgYnl0ZXMpIDoKKyAgICAgICAgICAgICAgICAgICAgdjEgPSB2MS5kZWNvZGUoY2hhcnNldCkKKworICAgICAgICAgICAgICAgIHYgPSAodjEsIHYyLmRlY29kZShjaGFyc2V0KSkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIGdldF9ib3RoKHNlbGYsIGtleSwgdmFsdWUsIHR4bj1Ob25lLCBmbGFncz0wKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKSA6CisgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCBjaGFyc2V0KQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc3RyKSA6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBieXRlcyh2YWx1ZSwgY2hhcnNldCkKKyAgICAgICAgICAgIHY9c2VsZi5fZGIuZ2V0X2JvdGgoa2V5LCB2YWx1ZSwgdHhuPXR4biwgZmxhZ3M9ZmxhZ3MpCisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lIDoKKyAgICAgICAgICAgICAgICB2ID0gdi5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgZGVmIGRlbGV0ZShzZWxmLCBrZXksIHR4bj1Ob25lKSA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKSA6CisgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCBjaGFyc2V0KQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiLmRlbGV0ZShrZXksIHR4bj10eG4pCisKKyAgICAgICAgZGVmIGtleXMoc2VsZikgOgorICAgICAgICAgICAgayA9IHNlbGYuX2RiLmtleXMoKQorICAgICAgICAgICAgaWYgbGVuKGspIGFuZCBpc2luc3RhbmNlKGtbMF0sIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtpLmRlY29kZShjaGFyc2V0KSBmb3IgaSBpbiBzZWxmLl9kYi5rZXlzKCldCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaworCisgICAgICAgIGRlZiBpdGVtcyhzZWxmKSA6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fZGIuaXRlbXMoKQorICAgICAgICAgICAgaWYgbm90IGxlbihkYXRhKSA6IHJldHVybiBkYXRhCisgICAgICAgICAgICBkYXRhMiA9IFtdCisgICAgICAgICAgICBmb3IgaywgdiBpbiBkYXRhIDoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIGJ5dGVzKSA6CisgICAgICAgICAgICAgICAgICAgIGsgPSBrLmRlY29kZShjaGFyc2V0KQorICAgICAgICAgICAgICAgIGRhdGEyLmFwcGVuZCgoaywgdi5kZWNvZGUoY2hhcnNldCkpKQorICAgICAgICAgICAgcmV0dXJuIGRhdGEyCisKKyAgICAgICAgZGVmIGFzc29jaWF0ZShzZWxmLCBzZWNvbmRhcnlkYiwgY2FsbGJhY2ssIGZsYWdzPTAsIHR4bj1Ob25lKSA6CisgICAgICAgICAgICBjbGFzcyBhc3NvY2lhdGVfY2FsbGJhY2sob2JqZWN0KSA6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbGxiYWNrKSA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKKworICAgICAgICAgICAgICAgIGRlZiBjYWxsYmFjayhzZWxmLCBrZXksIGRhdGEpIDoKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5LmRlY29kZShjaGFyc2V0KQorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YS5kZWNvZGUoY2hhcnNldCkKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gc2VsZi5fY2FsbGJhY2soa2V5LCBkYXRhKQorICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9IGJzZGRiLl9kYi5EQl9ET05PVElOREVYKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGtleSwgc3RyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYnl0ZXMoa2V5LCBjaGFyc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGtleSwgbGlzdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTIgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIGtleSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaSwgc3RyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpID0gYnl0ZXMoaSwgY2hhcnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Mi5hcHBlbmQoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXkyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkKKworICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiLmFzc29jaWF0ZShzZWNvbmRhcnlkYi5fZGIsCisgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZV9jYWxsYmFjayhjYWxsYmFjaykuY2FsbGJhY2ssIGZsYWdzPWZsYWdzLAorICAgICAgICAgICAgICAgICAgICB0eG49dHhuKQorCisgICAgICAgIGRlZiBjdXJzb3Ioc2VsZiwgdHhuPU5vbmUsIGZsYWdzPTApIDoKKyAgICAgICAgICAgIHJldHVybiBjdXJzb3JfcHkzayhzZWxmLl9kYiwgdHhuPXR4biwgZmxhZ3M9ZmxhZ3MpCisKKyAgICAgICAgZGVmIGpvaW4oc2VsZiwgY3Vyc29yX2xpc3QpIDoKKyAgICAgICAgICAgIGN1cnNvcl9saXN0ID0gW2kuX2RiY3Vyc29yIGZvciBpIGluIGN1cnNvcl9saXN0XQorICAgICAgICAgICAgcmV0dXJuIGR1cF9jdXJzb3JfcHkzayhzZWxmLl9kYi5qb2luKGN1cnNvcl9saXN0KSkKKworICAgIGNsYXNzIERCRW52X3B5M2sob2JqZWN0KSA6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpIDoKKyAgICAgICAgICAgIHNlbGYuX2RiZW52ID0gYnNkZGIuX2RiLkRCRW52X29yaWcoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCB2KSA6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9kYmVudiwgdikKKworICAgICAgICBkZWYgbG9nX2N1cnNvcihzZWxmLCBmbGFncz0wKSA6CisgICAgICAgICAgICByZXR1cm4gbG9nY3Vyc29yX3B5M2soc2VsZi5fZGJlbnYpCisKKyAgICAgICAgZGVmIGdldF9sZ19kaXIoc2VsZikgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiZW52LmdldF9sZ19kaXIoKS5kZWNvZGUoY2hhcnNldCkKKworICAgICAgICBkZWYgZ2V0X3RtcF9kaXIoc2VsZikgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RiZW52LmdldF90bXBfZGlyKCkuZGVjb2RlKGNoYXJzZXQpCisKKyAgICAgICAgZGVmIGdldF9kYXRhX2RpcnMoc2VsZikgOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKAorICAgICAgICAgICAgICAgIChpLmRlY29kZShjaGFyc2V0KSBmb3IgaSBpbiBzZWxmLl9kYmVudi5nZXRfZGF0YV9kaXJzKCkpKQorCisgICAgY2xhc3MgREJTZXF1ZW5jZV9weTNrKG9iamVjdCkgOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZGIsICphcmdzLCAqKmt3YXJncykgOgorICAgICAgICAgICAgc2VsZi5fZGI9ZGIKKyAgICAgICAgICAgIHNlbGYuX2Ric2VxdWVuY2UgPSBic2RkYi5fZGIuREJTZXF1ZW5jZV9vcmlnKGRiLl9kYiwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCB2KSA6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9kYnNlcXVlbmNlLCB2KQorCisgICAgICAgIGRlZiBvcGVuKHNlbGYsIGtleSwgKmFyZ3MsICoqa3dhcmdzKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGJzZXF1ZW5jZS5vcGVuKGJ5dGVzKGtleSwgY2hhcnNldCksICphcmdzLCAqKmt3YXJncykKKworICAgICAgICBkZWYgZ2V0X2tleShzZWxmKSA6CisgICAgICAgICAgICByZXR1cm4gIHNlbGYuX2Ric2VxdWVuY2UuZ2V0X2tleSgpLmRlY29kZShjaGFyc2V0KQorCisgICAgICAgIGRlZiBnZXRfZGJwKHNlbGYpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYgorCisgICAgaW1wb3J0IHN0cmluZworICAgIHN0cmluZy5sZXR0ZXJzPVtjaHIoaSkgZm9yIGkgaW4geHJhbmdlKDY1LDkxKV0KKworICAgIGJzZGRiLl9kYi5EQkVudl9vcmlnID0gYnNkZGIuX2RiLkRCRW52CisgICAgYnNkZGIuX2RiLkRCX29yaWcgPSBic2RkYi5fZGIuREIKKyAgICBpZiBic2RkYi5kYi52ZXJzaW9uKCkgPD0gKDQsIDMpIDoKKyAgICAgICAgYnNkZGIuX2RiLkRCU2VxdWVuY2Vfb3JpZyA9IE5vbmUKKyAgICBlbHNlIDoKKyAgICAgICAgYnNkZGIuX2RiLkRCU2VxdWVuY2Vfb3JpZyA9IGJzZGRiLl9kYi5EQlNlcXVlbmNlCisKKyAgICBkZWYgZG9fcHJveHlfZGJfcHkzayhmbGFnKSA6CisgICAgICAgIGZsYWcyID0gZG9fcHJveHlfZGJfcHkzay5mbGFnCisgICAgICAgIGRvX3Byb3h5X2RiX3B5M2suZmxhZyA9IGZsYWcKKyAgICAgICAgaWYgZmxhZyA6CisgICAgICAgICAgICBic2RkYi5EQkVudiA9IGJzZGRiLmRiLkRCRW52ID0gYnNkZGIuX2RiLkRCRW52ID0gREJFbnZfcHkzaworICAgICAgICAgICAgYnNkZGIuREIgPSBic2RkYi5kYi5EQiA9IGJzZGRiLl9kYi5EQiA9IERCX3B5M2sKKyAgICAgICAgICAgIGJzZGRiLl9kYi5EQlNlcXVlbmNlID0gREJTZXF1ZW5jZV9weTNrCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgYnNkZGIuREJFbnYgPSBic2RkYi5kYi5EQkVudiA9IGJzZGRiLl9kYi5EQkVudiA9IGJzZGRiLl9kYi5EQkVudl9vcmlnCisgICAgICAgICAgICBic2RkYi5EQiA9IGJzZGRiLmRiLkRCID0gYnNkZGIuX2RiLkRCID0gYnNkZGIuX2RiLkRCX29yaWcKKyAgICAgICAgICAgIGJzZGRiLl9kYi5EQlNlcXVlbmNlID0gYnNkZGIuX2RiLkRCU2VxdWVuY2Vfb3JpZworICAgICAgICByZXR1cm4gZmxhZzIKKworICAgIGRvX3Byb3h5X2RiX3B5M2suZmxhZyA9IEZhbHNlCisgICAgZG9fcHJveHlfZGJfcHkzayhUcnVlKQorCit0cnk6CisgICAgIyBGb3IgUHl0aG9ucyB3L2Rpc3R1dGlscyBweWJzZGRiCisgICAgZnJvbSBic2RkYjMgaW1wb3J0IGRiLCBkYnRhYmxlcywgZGJ1dGlscywgZGJzaGVsdmUsIFwKKyAgICAgICAgICAgIGhhc2hvcGVuLCBidG9wZW4sIHJub3BlbiwgZGJvYmoKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIEZvciBQeXRob24gMi4zCisgICAgZnJvbSBic2RkYiBpbXBvcnQgZGIsIGRidGFibGVzLCBkYnV0aWxzLCBkYnNoZWx2ZSwgXAorICAgICAgICAgICAgaGFzaG9wZW4sIGJ0b3Blbiwgcm5vcGVuLCBkYm9iagorCit0cnk6CisgICAgZnJvbSBic2RkYjMgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICBlbHNlIDoKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBzdXBwb3J0IGFzIHRlc3Rfc3VwcG9ydAorCisKK3RyeToKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQsIGN1cnJlbnRUaHJlYWQKKyAgICAgICAgZGVsIFRocmVhZCwgY3VycmVudFRocmVhZAorICAgIGVsc2UgOgorICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkLCBjdXJyZW50X3RocmVhZAorICAgICAgICBkZWwgVGhyZWFkLCBjdXJyZW50X3RocmVhZAorICAgIGhhdmVfdGhyZWFkcyA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBoYXZlX3RocmVhZHMgPSBGYWxzZQorCit2ZXJib3NlID0gMAoraWYgJ3ZlcmJvc2UnIGluIHN5cy5hcmd2OgorICAgIHZlcmJvc2UgPSAxCisgICAgc3lzLmFyZ3YucmVtb3ZlKCd2ZXJib3NlJykKKworaWYgJ3NpbGVudCcgaW4gc3lzLmFyZ3Y6ICAjIHRha2UgY2FyZSBvZiBvbGQgZmxhZywganVzdCBpbiBjYXNlCisgICAgdmVyYm9zZSA9IDAKKyAgICBzeXMuYXJndi5yZW1vdmUoJ3NpbGVudCcpCisKKworZGVmIHByaW50X3ZlcnNpb25zKCk6CisgICAgcHJpbnQKKyAgICBwcmludCAnLT0nICogMzgKKyAgICBwcmludCBkYi5EQl9WRVJTSU9OX1NUUklORworICAgIHByaW50ICdic2RkYi5kYi52ZXJzaW9uKCk6ICAgJXMnICUgKGRiLnZlcnNpb24oKSwgKQorICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNSwgMCkgOgorICAgICAgICBwcmludCAnYnNkZGIuZGIuZnVsbF92ZXJzaW9uKCk6ICVzJyAlcmVwcihkYi5mdWxsX3ZlcnNpb24oKSkKKyAgICBwcmludCAnYnNkZGIuZGIuX192ZXJzaW9uX186ICVzJyAlIGRiLl9fdmVyc2lvbl9fCisgICAgcHJpbnQgJ2JzZGRiLmRiLmN2c2lkOiAgICAgICAlcycgJSBkYi5jdnNpZAorCisgICAgIyBXb3JrYXJvdW5kIGZvciBhbGxvd2luZyBnZW5lcmF0aW5nIGFuIEVHR3MgYXMgYSBaSVAgZmlsZXMuCisgICAgc3VmZml4PSJfXyIKKyAgICBwcmludCAncHkgbW9kdWxlOiAgICAgICAgICAgICVzJyAlIGdldGF0dHIoYnNkZGIsICJfX2ZpbGUiK3N1ZmZpeCkKKyAgICBwcmludCAnZXh0ZW5zaW9uIG1vZHVsZTogICAgICVzJyAlIGdldGF0dHIoYnNkZGIsICJfX2ZpbGUiK3N1ZmZpeCkKKworICAgIHByaW50ICdweXRob24gdmVyc2lvbjogICAgICAgJXMnICUgc3lzLnZlcnNpb24KKyAgICBwcmludCAnTXkgcGlkOiAgICAgICAgICAgICAgICVzJyAlIG9zLmdldHBpZCgpCisgICAgcHJpbnQgJy09JyAqIDM4CisKKworZGVmIGdldF9uZXdfcGF0aChuYW1lKSA6CisgICAgZ2V0X25ld19wYXRoLm11dGV4LmFjcXVpcmUoKQorICAgIHRyeSA6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBwYXRoPW9zLnBhdGguam9pbihnZXRfbmV3X3BhdGgucHJlZml4LAorICAgICAgICAgICAgICAgIG5hbWUrIl8iK3N0cihvcy5nZXRwaWQoKSkrIl8iK3N0cihnZXRfbmV3X3BhdGgubnVtKSkKKyAgICAgICAgZ2V0X25ld19wYXRoLm51bSs9MQorICAgIGZpbmFsbHkgOgorICAgICAgICBnZXRfbmV3X3BhdGgubXV0ZXgucmVsZWFzZSgpCisgICAgcmV0dXJuIHBhdGgKKworZGVmIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpIDoKKyAgICBwYXRoPWdldF9uZXdfcGF0aCgiZW52aXJvbm1lbnQiKQorICAgIGltcG9ydCBvcworICAgIHRyeToKKyAgICAgICAgb3MubWFrZWRpcnMocGF0aCxtb2RlPTA3MDApCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHBhdGgpCisgICAgICAgIG9zLm1ha2VkaXJzKHBhdGgpCisgICAgcmV0dXJuIHBhdGgKKworZGVmIGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpIDoKKyAgICBwYXRoPWdldF9uZXdfcGF0aCgiZGF0YWJhc2UiKQorICAgIGltcG9ydCBvcworICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpIDoKKyAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgcmV0dXJuIHBhdGgKKworCisjIFRoaXMgcGF0aCBjYW4gYmUgb3ZlcnJpZGVuIHZpYSAic2V0X3Rlc3RfcGF0aF9wcmVmaXgoKSIuCitpbXBvcnQgb3MsIG9zLnBhdGgKK2dldF9uZXdfcGF0aC5wcmVmaXg9b3MucGF0aC5qb2luKG9zLmVudmlyb24uZ2V0KCJUTVBESVIiLAorICAgIG9zLnBhdGguam9pbihvcy5zZXAsInRtcCIpKSwgInotQmVya2VsZXlfREIiKQorZ2V0X25ld19wYXRoLm51bT0wCisKK2RlZiBnZXRfdGVzdF9wYXRoX3ByZWZpeCgpIDoKKyAgICByZXR1cm4gZ2V0X25ld19wYXRoLnByZWZpeAorCitkZWYgc2V0X3Rlc3RfcGF0aF9wcmVmaXgocGF0aCkgOgorICAgIGdldF9uZXdfcGF0aC5wcmVmaXg9cGF0aAorCitkZWYgcmVtb3ZlX3Rlc3RfcGF0aF9kaXJlY3RvcnkoKSA6CisgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShnZXRfbmV3X3BhdGgucHJlZml4KQorCitpZiBoYXZlX3RocmVhZHMgOgorICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICBnZXRfbmV3X3BhdGgubXV0ZXg9dGhyZWFkaW5nLkxvY2soKQorICAgIGRlbCB0aHJlYWRpbmcKK2Vsc2UgOgorICAgIGNsYXNzIExvY2sob2JqZWN0KSA6CisgICAgICAgIGRlZiBhY3F1aXJlKHNlbGYpIDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIHJlbGVhc2Uoc2VsZikgOgorICAgICAgICAgICAgcGFzcworICAgIGdldF9uZXdfcGF0aC5tdXRleD1Mb2NrKCkKKyAgICBkZWwgTG9jaworCisKKworY2xhc3MgUHJpbnRJbmZvRmFrZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0UHJpbnRWZXJzaW9ucyhzZWxmKToKKyAgICAgICAgcHJpbnRfdmVyc2lvbnMoKQorCisKKyMgVGhpcyBsaXR0bGUgaGFjayBpcyBmb3Igd2hlbiB0aGlzIG1vZHVsZSBpcyBydW4gYXMgbWFpbiBhbmQgYWxsIHRoZQorIyBvdGhlciBtb2R1bGVzIGltcG9ydCBpdCBzbyB0aGV5IHdpbGwgc3RpbGwgYmUgYWJsZSB0byBnZXQgdGhlIHJpZ2h0CisjIHZlcmJvc2Ugc2V0dGluZy4gIEl0J3MgY29uZnVzaW5nIGJ1dCBpdCB3b3Jrcy4KK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICBpbXBvcnQgdGVzdF9hbGwKKyAgICB0ZXN0X2FsbC52ZXJib3NlID0gdmVyYm9zZQorZWxzZSA6CisgICAgaW1wb3J0IHN5cworICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIldvcmsgdG8gZG8hIgorCisKK2RlZiBzdWl0ZShtb2R1bGVfcHJlZml4PScnLCB0aW1pbmdfY2hlY2s9Tm9uZSk6CisgICAgdGVzdF9tb2R1bGVzID0gWworICAgICAgICAndGVzdF9hc3NvY2lhdGUnLAorICAgICAgICAndGVzdF9iYXNpY3MnLAorICAgICAgICAndGVzdF9kYmVudicsCisgICAgICAgICd0ZXN0X2RiJywKKyAgICAgICAgJ3Rlc3RfY29tcGFyZScsCisgICAgICAgICd0ZXN0X2NvbXBhdCcsCisgICAgICAgICd0ZXN0X2N1cnNvcl9wZ2V0X2J1ZycsCisgICAgICAgICd0ZXN0X2Rib2JqJywKKyAgICAgICAgJ3Rlc3RfZGJzaGVsdmUnLAorICAgICAgICAndGVzdF9kYnRhYmxlcycsCisgICAgICAgICd0ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucycsCisgICAgICAgICd0ZXN0X2Vhcmx5X2Nsb3NlJywKKyAgICAgICAgJ3Rlc3RfZmlsZWlkJywKKyAgICAgICAgJ3Rlc3RfZ2V0X25vbmUnLAorICAgICAgICAndGVzdF9qb2luJywKKyAgICAgICAgJ3Rlc3RfbG9jaycsCisgICAgICAgICd0ZXN0X21pc2MnLAorICAgICAgICAndGVzdF9waWNrbGUnLAorICAgICAgICAndGVzdF9xdWV1ZScsCisgICAgICAgICd0ZXN0X3JlY25vJywKKyAgICAgICAgJ3Rlc3RfcmVwbGljYXRpb24nLAorICAgICAgICAndGVzdF9zZXF1ZW5jZScsCisgICAgICAgICd0ZXN0X3RocmVhZCcsCisgICAgICAgIF0KKworICAgIGFsbHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgbmFtZSBpbiB0ZXN0X21vZHVsZXM6CisgICAgICAgICNtb2R1bGUgPSBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgICMgRG8gaXQgdGhpcyB3YXkgc28gdGhhdCBzdWl0ZSBtYXkgYmUgY2FsbGVkIGV4dGVybmFsbHkgdmlhCisgICAgICAgICMgcHl0aG9uJ3MgTGliL3Rlc3QvdGVzdF9ic2RkYjMuCisgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlX3ByZWZpeCtuYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBuYW1lKQorCisgICAgICAgIGFsbHRlc3RzLmFkZFRlc3QobW9kdWxlLnRlc3Rfc3VpdGUoKSkKKyAgICAgICAgaWYgdGltaW5nX2NoZWNrOgorICAgICAgICAgICAgYWxsdGVzdHMuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUodGltaW5nX2NoZWNrKSkKKyAgICByZXR1cm4gYWxsdGVzdHMKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShQcmludEluZm9GYWtlVGVzdCkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwcmludF92ZXJzaW9ucygpCisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5YjJhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYWxsLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5YjJhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2FsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYXNzb2NpYXRlLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYXNzb2NpYXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNDllMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9hc3NvY2lhdGUucHkKQEAgLTAsMCArMSw0NjUgQEAKKyIiIgorVGVzdENhc2VzIGZvciBEQi5hc3NvY2lhdGUuCisiIiIKKworaW1wb3J0IHN5cywgb3MsIHN0cmluZworaW1wb3J0IHRpbWUKK2Zyb20gcHByaW50IGltcG9ydCBwcHJpbnQKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgZGJzaGVsdmUsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgaGF2ZV90aHJlYWRzLCBcCisgICAgICAgIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworbXVzaWNkYXRhID0geworMSA6ICgiQmFkIEVuZ2xpc2giLCAiVGhlIFByaWNlIE9mIExvdmUiLCAiUm9jayIpLAorMiA6ICgiRE5BIGZlYXR1cmluZyBTdXphbm5lIFZlZ2EiLCAiVG9tJ3MgRGluZXIiLCAiUm9jayIpLAorMyA6ICgiR2VvcmdlIE1pY2hhZWwiLCAiUHJheWluZyBGb3IgVGltZSIsICJSb2NrIiksCis0IDogKCJHbG9yaWEgRXN0ZWZhbiIsICJIZXJlIFdlIEFyZSIsICJSb2NrIiksCis1IDogKCJMaW5kYSBSb25zdGFkdCIsICJEb24ndCBLbm93IE11Y2giLCAiUm9jayIpLAorNiA6ICgiTWljaGFlbCBCb2x0b24iLCAiSG93IEFtIEkgU3VwcG9zZWQgVG8gTGl2ZSBXaXRob3V0IFlvdSIsICJCbHVlcyIpLAorNyA6ICgiUGF1bCBZb3VuZyIsICJPaCBHaXJsIiwgIlJvY2siKSwKKzggOiAoIlBhdWxhIEFiZHVsIiwgIk9wcG9zaXRlcyBBdHRyYWN0IiwgIlJvY2siKSwKKzkgOiAoIlJpY2hhcmQgTWFyeCIsICJTaG91bGQndmUgS25vd24gQmV0dGVyIiwgIlJvY2siKSwKKzEwOiAoIlJvZCBTdGV3YXJ0IiwgIkZvcmV2ZXIgWW91bmciLCAiUm9jayIpLAorMTE6ICgiUm94ZXR0ZSIsICJEYW5nZXJvdXMiLCAiUm9jayIpLAorMTI6ICgiU2hlZW5hIEVhc3RvbiIsICJUaGUgTG92ZXIgSW4gTWUiLCAiUm9jayIpLAorMTM6ICgiU2luZWFkIE8nQ29ubm9yIiwgIk5vdGhpbmcgQ29tcGFyZXMgMiBVIiwgIlJvY2siKSwKKzE0OiAoIlN0ZXZpZSBCLiIsICJCZWNhdXNlIEkgTG92ZSBZb3UiLCAiUm9jayIpLAorMTU6ICgiVGF5bG9yIERheW5lIiwgIkxvdmUgV2lsbCBMZWFkIFlvdSBCYWNrIiwgIlJvY2siKSwKKzE2OiAoIlRoZSBCYW5nbGVzIiwgIkV0ZXJuYWwgRmxhbWUiLCAiUm9jayIpLAorMTc6ICgiV2lsc29uIFBoaWxsaXBzIiwgIlJlbGVhc2UgTWUiLCAiUm9jayIpLAorMTg6ICgiQmlsbHkgSm9lbCIsICJCbG9uZGUgT3ZlciBCbHVlIiwgIlJvY2siKSwKKzE5OiAoIkJpbGx5IEpvZWwiLCAiRmFtb3VzIExhc3QgV29yZHMiLCAiUm9jayIpLAorMjA6ICgiQmlsbHkgSm9lbCIsICJMdWxsYWJ5ZSAoR29vZG5pZ2h0LCBNeSBBbmdlbCkiLCAiUm9jayIpLAorMjE6ICgiQmlsbHkgSm9lbCIsICJUaGUgUml2ZXIgT2YgRHJlYW1zIiwgIlJvY2siKSwKKzIyOiAoIkJpbGx5IEpvZWwiLCAiVHdvIFRob3VzYW5kIFllYXJzIiwgIlJvY2siKSwKKzIzOiAoIkphbmV0IEphY2tzb24iLCAiQWxyaWdodCIsICJSb2NrIiksCisyNDogKCJKYW5ldCBKYWNrc29uIiwgIkJsYWNrIENhdCIsICJSb2NrIiksCisyNTogKCJKYW5ldCBKYWNrc29uIiwgIkNvbWUgQmFjayBUbyBNZSIsICJSb2NrIiksCisyNjogKCJKYW5ldCBKYWNrc29uIiwgIkVzY2FwYWRlIiwgIlJvY2siKSwKKzI3OiAoIkphbmV0IEphY2tzb24iLCAiTG92ZSBXaWxsIE5ldmVyIERvIChXaXRob3V0IFlvdSkiLCAiUm9jayIpLAorMjg6ICgiSmFuZXQgSmFja3NvbiIsICJNaXNzIFlvdSBNdWNoIiwgIlJvY2siKSwKKzI5OiAoIkphbmV0IEphY2tzb24iLCAiUmh5dGhtIE5hdGlvbiIsICJSb2NrIiksCiszMDogKCJKYW5ldCBKYWNrc29uIiwgIlN0YXRlIE9mIFRoZSBXb3JsZCIsICJSb2NrIiksCiszMTogKCJKYW5ldCBKYWNrc29uIiwgIlRoZSBLbm93bGVkZ2UiLCAiUm9jayIpLAorMzI6ICgiU3B5cm8gR3lyYSIsICJFbmQgb2YgUm9tYW50aWNpc20iLCAiSmF6eiIpLAorMzM6ICgiU3B5cm8gR3lyYSIsICJIZWxpb3BvbGlzIiwgIkphenoiKSwKKzM0OiAoIlNweXJvIEd5cmEiLCAiSnViaWxlZSIsICJKYXp6IiksCiszNTogKCJTcHlybyBHeXJhIiwgIkxpdHRsZSBMaW5kYSIsICJKYXp6IiksCiszNjogKCJTcHlybyBHeXJhIiwgIk1vcm5pbmcgRGFuY2UiLCAiSmF6eiIpLAorMzc6ICgiU3B5cm8gR3lyYSIsICJTb25nIGZvciBMb3JyYWluZSIsICJKYXp6IiksCiszODogKCJZZXMiLCAiT3duZXIgT2YgQSBMb25lbHkgSGVhcnQiLCAiUm9jayIpLAorMzk6ICgiWWVzIiwgIlJoeXRobSBPZiBMb3ZlIiwgIlJvY2siKSwKKzQwOiAoIkN1c2NvIiwgIkRyZWFtIENhdGNoZXIiLCAiTmV3IEFnZSIpLAorNDE6ICgiQ3VzY28iLCAiR2Vyb25pbW9zIExhdWdodGVyIiwgIk5ldyBBZ2UiKSwKKzQyOiAoIkN1c2NvIiwgIkdob3N0IERhbmNlIiwgIk5ldyBBZ2UiKSwKKzQzOiAoIkJsdWUgTWFuIEdyb3VwIiwgIkRydW1ib25lIiwgIk5ldyBBZ2UiKSwKKzQ0OiAoIkJsdWUgTWFuIEdyb3VwIiwgIkVuZGxlc3MgQ29sdW1uIiwgIk5ldyBBZ2UiKSwKKzQ1OiAoIkJsdWUgTWFuIEdyb3VwIiwgIktsZWluIE1hbmRlbGJyb3QiLCAiTmV3IEFnZSIpLAorNDY6ICgiS2VubnkgRyIsICJTaWxob3VldHRlIiwgIkphenoiKSwKKzQ3OiAoIlNhZGUiLCAiU21vb3RoIE9wZXJhdG9yIiwgIkphenoiKSwKKzQ4OiAoIkRhdmlkIEFya2Vuc3RvbmUiLCAiUGFwaWxsb24gKE9uIFRoZSBXaW5ncyBPZiBUaGUgQnV0dGVyZmx5KSIsCisgICAgICJOZXcgQWdlIiksCis0OTogKCJEYXZpZCBBcmtlbnN0b25lIiwgIlN0ZXBwaW5nIFN0YXJzIiwgIk5ldyBBZ2UiKSwKKzUwOiAoIkRhdmlkIEFya2Vuc3RvbmUiLCAiQ2FybmF0aW9uIExpbHkgTGlseSBSb3NlIiwgIk5ldyBBZ2UiKSwKKzUxOiAoIkRhdmlkIExhbnoiLCAiQmVoaW5kIFRoZSBXYXRlcmZhbGwiLCAiTmV3IEFnZSIpLAorNTI6ICgiRGF2aWQgTGFueiIsICJDcmlzdG9mb3JpJ3MgRHJlYW0iLCAiTmV3IEFnZSIpLAorNTM6ICgiRGF2aWQgTGFueiIsICJIZWFydHNvdW5kcyIsICJOZXcgQWdlIiksCis1NDogKCJEYXZpZCBMYW56IiwgIkxlYXZlcyBvbiB0aGUgU2VpbmUiLCAiTmV3IEFnZSIpLAorOTk6ICgidW5rbm93biBhcnRpc3QiLCAiVW5uYW1lZCBzb25nIiwgIlVua25vd24iKSwKK30KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQXNzb2NpYXRlRXJyb3JUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAnLmRiJworICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgc2VsZi5lbnYgPSBOb25lCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIHRlc3QwMF9hc3NvY2lhdGVEQkVycm9yKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDBfYXNzb2NpYXRlREJFcnJvci4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGR1cERCID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGR1cERCLnNldF9mbGFncyhkYi5EQl9EVVApCisgICAgICAgIGR1cERCLm9wZW4oc2VsZi5maWxlbmFtZSwgInByaW1hcnkiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorCisgICAgICAgIHNlY0RCID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlY0RCLm9wZW4oc2VsZi5maWxlbmFtZSwgInNlY29uZGFyeSIsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgIyBkdXBEQiBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGFsbG93IGR1cGxpY2F0ZXMsIGl0IGNhbid0CisgICAgICAgICMgYXNzb2NpYXRlIHdpdGggYSBzZWNvbmRhcnkuICBCZXJrZWxleSBEQiB3aWxsIHJldHVybiBhbiBlcnJvci4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVmIGYoYSxiKTogcmV0dXJuIGErYgorICAgICAgICAgICAgZHVwREIuYXNzb2NpYXRlKHNlY0RCLCBmKQorICAgICAgICBleGNlcHQgZGIuREJFcnJvcjoKKyAgICAgICAgICAgICMgZ29vZAorICAgICAgICAgICAgc2VjREIuY2xvc2UoKQorICAgICAgICAgICAgZHVwREIuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VjREIuY2xvc2UoKQorICAgICAgICAgICAgZHVwREIuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJEQkVycm9yIGV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQiKQorCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBBc3NvY2lhdGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAga2V5dHlwZSA9ICcnCisgICAgZW52RmxhZ3MgPSAwCisgICAgZGJGbGFncyA9IDAKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0xPQ0sgfCBkYi5EQl9USFJFQUQgfCBzZWxmLmVudkZsYWdzKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlREIoKQorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisgICAgICAgIHNlbGYuZW52ID0gTm9uZQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiBhZGREYXRhVG9EQihzZWxmLCBkLCB0eG49Tm9uZSk6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG11c2ljZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgaWYgdHlwZShzZWxmLmtleXR5cGUpID09IHR5cGUoJycpOgorICAgICAgICAgICAgICAgIGtleSA9ICIlMDJkIiAlIGtleQorICAgICAgICAgICAgZC5wdXQoa2V5LCAnfCcuam9pbih2YWx1ZSksIHR4bj10eG4pCisKKyAgICBkZWYgY3JlYXRlREIoc2VsZiwgdHhuPU5vbmUpOgorICAgICAgICBzZWxmLmN1ciA9IE5vbmUKKyAgICAgICAgc2VsZi5zZWNEQiA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmltYXJ5ID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYucHJpbWFyeS5zZXRfZ2V0X3JldHVybnNfbm9uZSgyKQorICAgICAgICBzZWxmLnByaW1hcnkub3BlbihzZWxmLmZpbGVuYW1lLCAicHJpbWFyeSIsIHNlbGYuZGJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCB8IHNlbGYuZGJGbGFncywgdHhuPXR4bikKKworICAgIGRlZiBjbG9zZURCKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmN1cjoKKyAgICAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuY3VyID0gTm9uZQorICAgICAgICBpZiBzZWxmLnNlY0RCOgorICAgICAgICAgICAgc2VsZi5zZWNEQi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLnNlY0RCID0gTm9uZQorICAgICAgICBzZWxmLnByaW1hcnkuY2xvc2UoKQorICAgICAgICBzZWxmLnByaW1hcnkgPSBOb25lCisKKyAgICBkZWYgZ2V0REIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnkKKworCisgICAgZGVmIF9hc3NvY2lhdGVXaXRoREIoc2VsZiwgZ2V0R2VucmUpOgorICAgICAgICBzZWxmLmNyZWF0ZURCKCkKKworICAgICAgICBzZWxmLnNlY0RCID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuc2VjREIuc2V0X2ZsYWdzKGRiLkRCX0RVUCkKKyAgICAgICAgc2VsZi5zZWNEQi5zZXRfZ2V0X3JldHVybnNfbm9uZSgyKQorICAgICAgICBzZWxmLnNlY0RCLm9wZW4oc2VsZi5maWxlbmFtZSwgInNlY29uZGFyeSIsIGRiLkRCX0JUUkVFLAorICAgICAgICAgICAgICAgICAgIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCB8IHNlbGYuZGJGbGFncykKKyAgICAgICAgc2VsZi5nZXREQigpLmFzc29jaWF0ZShzZWxmLnNlY0RCLCBnZXRHZW5yZSkKKworICAgICAgICBzZWxmLmFkZERhdGFUb0RCKHNlbGYuZ2V0REIoKSkKKworICAgICAgICBzZWxmLmZpbmlzaF90ZXN0KHNlbGYuc2VjREIpCisKKyAgICBkZWYgdGVzdDAxX2Fzc29jaWF0ZVdpdGhEQihzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAxX2Fzc29jaWF0ZVdpdGhEQi4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHJldHVybiBzZWxmLl9hc3NvY2lhdGVXaXRoREIoc2VsZi5nZXRHZW5yZSkKKworICAgIGRlZiBfYXNzb2NpYXRlQWZ0ZXJEQihzZWxmLCBnZXRHZW5yZSkgOgorICAgICAgICBzZWxmLmNyZWF0ZURCKCkKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihzZWxmLmdldERCKCkpCisKKyAgICAgICAgc2VsZi5zZWNEQiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLnNlY0RCLnNldF9mbGFncyhkYi5EQl9EVVApCisgICAgICAgIHNlbGYuc2VjREIub3BlbihzZWxmLmZpbGVuYW1lLCAic2Vjb25kYXJ5IiwgZGIuREJfQlRSRUUsCisgICAgICAgICAgICAgICAgICAgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFEIHwgc2VsZi5kYkZsYWdzKQorCisgICAgICAgICMgYWRkaW5nIHRoZSBEQl9DUkVBVEUgZmxhZyB3aWxsIGNhdXNlIGl0IHRvIGluZGV4IGV4aXN0aW5nIHJlY29yZHMKKyAgICAgICAgc2VsZi5nZXREQigpLmFzc29jaWF0ZShzZWxmLnNlY0RCLCBnZXRHZW5yZSwgZGIuREJfQ1JFQVRFKQorCisgICAgICAgIHNlbGYuZmluaXNoX3Rlc3Qoc2VsZi5zZWNEQikKKworICAgIGRlZiB0ZXN0MDJfYXNzb2NpYXRlQWZ0ZXJEQihzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAyX2Fzc29jaWF0ZUFmdGVyREIuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICByZXR1cm4gc2VsZi5fYXNzb2NpYXRlQWZ0ZXJEQihzZWxmLmdldEdlbnJlKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA2KToKKyAgICAgICAgZGVmIHRlc3QwM19hc3NvY2lhdGVXaXRoREIoc2VsZik6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwM19hc3NvY2lhdGVXaXRoREIuLi4iICUgXAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hc3NvY2lhdGVXaXRoREIoc2VsZi5nZXRHZW5yZUxpc3QpCisKKyAgICAgICAgZGVmIHRlc3QwNF9hc3NvY2lhdGVBZnRlckRCKHNlbGYpOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDRfYXNzb2NpYXRlQWZ0ZXJEQi4uLiIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Fzc29jaWF0ZUFmdGVyREIoc2VsZi5nZXRHZW5yZUxpc3QpCisKKworICAgIGRlZiBmaW5pc2hfdGVzdChzZWxmLCBzZWNEQiwgdHhuPU5vbmUpOgorICAgICAgICAjICdCbHVlcycgc2hvdWxkIG5vdCBiZSBpbiB0aGUgc2Vjb25kYXJ5IGRhdGFiYXNlCisgICAgICAgIHZhbHMgPSBzZWNEQi5wZ2V0KCdCbHVlcycsIHR4bj10eG4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFscywgTm9uZSwgdmFscykKKworICAgICAgICB2YWxzID0gc2VjREIucGdldCgnVW5rbm93bicsIHR4bj10eG4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxzWzBdID09IDk5IG9yIHZhbHNbMF0gPT0gJzk5JywgdmFscykKKyAgICAgICAgdmFsc1sxXS5pbmRleCgnVW5rbm93bicpCisgICAgICAgIHZhbHNbMV0uaW5kZXgoJ1VubmFtZWQnKQorICAgICAgICB2YWxzWzFdLmluZGV4KCd1bmtub3duJykKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlByaW1hcnkga2V5IHRyYXZlcnNhbDoiCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5nZXREQigpLmN1cnNvcih0eG4pCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICByZWMgPSBzZWxmLmN1ci5maXJzdCgpCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5rZXl0eXBlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHJlY1swXSkpICAjIGZvciBwcmltYXJ5IGRiLCBrZXkgaXMgYSBudW1iZXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlY1swXSBhbmQgdHlwZShyZWNbMF0pID09IHR5cGUoMCkpCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGdldGF0dHIoc2VsZi5jdXIsICJuZXh0IikoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBsZW4obXVzaWNkYXRhKSkgICMgYWxsIGl0ZW1zIGFjY291bnRlZCBmb3IKKworCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiU2Vjb25kYXJ5IGtleSB0cmF2ZXJzYWw6IgorICAgICAgICBzZWxmLmN1ciA9IHNlY0RCLmN1cnNvcih0eG4pCisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgICMgdGVzdCBjdXJzb3IgcGdldAorICAgICAgICB2YWxzID0gc2VsZi5jdXIucGdldCgnVW5rbm93bicsIGZsYWdzPWRiLkRCX0xBU1QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWxzWzFdID09IDk5IG9yIHZhbHNbMV0gPT0gJzk5JywgdmFscykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxzWzBdLCAnVW5rbm93bicpCisgICAgICAgIHZhbHNbMl0uaW5kZXgoJ1Vua25vd24nKQorICAgICAgICB2YWxzWzJdLmluZGV4KCdVbm5hbWVkJykKKyAgICAgICAgdmFsc1syXS5pbmRleCgndW5rbm93bicpCisKKyAgICAgICAgdmFscyA9IHNlbGYuY3VyLnBnZXQoJ1Vua25vd24nLCBkYXRhPSd3cm9uZyB2YWx1ZScsIGZsYWdzPWRiLkRCX0dFVF9CT1RIKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHMsIE5vbmUsIHZhbHMpCisKKyAgICAgICAgcmVjID0gc2VsZi5jdXIuZmlyc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY1swXSwgIkphenoiKQorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGdldGF0dHIoc2VsZi5jdXIsICJuZXh0IikoKQorICAgICAgICAjIGFsbCBpdGVtcyBhY2NvdW50ZWQgZm9yIEVYQ0VQVCBmb3IgMSB3aXRoICJCbHVlcyIgZ2VucmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgbGVuKG11c2ljZGF0YSktMSkKKworICAgICAgICBzZWxmLmN1ciA9IE5vbmUKKworICAgIGRlZiBnZXRHZW5yZShzZWxmLCBwcmlLZXksIHByaURhdGEpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocHJpRGF0YSksIHR5cGUoIiIpKQorICAgICAgICBnZW5yZSA9IHByaURhdGEuc3BsaXQoJ3wnKVsyXQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnZ2V0R2VucmUga2V5OiAlciBkYXRhOiAlcicgJSAocHJpS2V5LCBwcmlEYXRhKQorCisgICAgICAgIGlmIGdlbnJlID09ICdCbHVlcyc6CisgICAgICAgICAgICByZXR1cm4gZGIuREJfRE9OT1RJTkRFWAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGdlbnJlCisKKyAgICBkZWYgZ2V0R2VucmVMaXN0KHNlbGYsIHByaUtleSwgUHJpRGF0YSkgOgorICAgICAgICB2ID0gc2VsZi5nZXRHZW5yZShwcmlLZXksIFByaURhdGEpCisgICAgICAgIGlmIHR5cGUodikgPT0gdHlwZSgiIikgOgorICAgICAgICAgICAgdiA9IFt2XQorICAgICAgICByZXR1cm4gdgorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworY2xhc3MgQXNzb2NpYXRlSGFzaFRlc3RDYXNlKEFzc29jaWF0ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisKK2NsYXNzIEFzc29jaWF0ZUJUcmVlVGVzdENhc2UoQXNzb2NpYXRlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0JUUkVFCisKK2NsYXNzIEFzc29jaWF0ZVJlY25vVGVzdENhc2UoQXNzb2NpYXRlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX1JFQ05PCisgICAga2V5dHlwZSA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQXNzb2NpYXRlQlRyZWVUeG5UZXN0Q2FzZShBc3NvY2lhdGVCVHJlZVRlc3RDYXNlKToKKyAgICBlbnZGbGFncyA9IGRiLkRCX0lOSVRfVFhOCisgICAgZGJGbGFncyA9IDAKKworICAgIGRlZiB0eG5fZmluaXNoX3Rlc3Qoc2VsZiwgc0RCLCB0eG4pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZpbmlzaF90ZXN0KHNEQiwgdHhuPXR4bikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNlbGYuY3VyOgorICAgICAgICAgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmN1ciA9IE5vbmUKKyAgICAgICAgICAgIGlmIHR4bjoKKyAgICAgICAgICAgICAgICB0eG4uY29tbWl0KCkKKworICAgIGRlZiB0ZXN0MTNfYXNzb2NpYXRlX2luX3RyYW5zYWN0aW9uKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MTNfYXNzb2NpYXRlQXV0b0NvbW1pdC4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlREIodHhuPXR4bikKKworICAgICAgICAgICAgc2VsZi5zZWNEQiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICAgICAgc2VsZi5zZWNEQi5zZXRfZmxhZ3MoZGIuREJfRFVQKQorICAgICAgICAgICAgc2VsZi5zZWNEQi5zZXRfZ2V0X3JldHVybnNfbm9uZSgyKQorICAgICAgICAgICAgc2VsZi5zZWNEQi5vcGVuKHNlbGYuZmlsZW5hbWUsICJzZWNvbmRhcnkiLCBkYi5EQl9CVFJFRSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCB0eG49dHhuKQorICAgICAgICAgICAgc2VsZi5nZXREQigpLmFzc29jaWF0ZShzZWxmLnNlY0RCLCBzZWxmLmdldEdlbnJlLCB0eG49dHhuKQorCisgICAgICAgICAgICBzZWxmLmFkZERhdGFUb0RCKHNlbGYuZ2V0REIoKSwgdHhuPXR4bikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdHhuLmFib3J0KCkKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgc2VsZi50eG5fZmluaXNoX3Rlc3Qoc2VsZi5zZWNEQiwgdHhuPXR4bikKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTaGVsdmVBc3NvY2lhdGVUZXN0Q2FzZShBc3NvY2lhdGVUZXN0Q2FzZSk6CisKKyAgICBkZWYgY3JlYXRlREIoc2VsZik6CisgICAgICAgIHNlbGYucHJpbWFyeSA9IGRic2hlbHZlLm9wZW4oc2VsZi5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYm5hbWU9InByaW1hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRiZW52PXNlbGYuZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0eXBlPXNlbGYuZGJ0eXBlKQorCisgICAgZGVmIGFkZERhdGFUb0RCKHNlbGYsIGQpOgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtdXNpY2RhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5rZXl0eXBlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgICAgICBrZXkgPSAiJTAyZCIgJSBrZXkKKyAgICAgICAgICAgIGQucHV0KGtleSwgdmFsdWUpICAgICMgc2F2ZSB0aGUgdmFsdWUgYXMgaXMgdGhpcyB0aW1lCisKKworICAgIGRlZiBnZXRHZW5yZShzZWxmLCBwcmlLZXksIHByaURhdGEpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocHJpRGF0YSksIHR5cGUoKCkpKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ2dldEdlbnJlIGtleTogJXIgZGF0YTogJXInICUgKHByaUtleSwgcHJpRGF0YSkKKyAgICAgICAgZ2VucmUgPSBwcmlEYXRhWzJdCisgICAgICAgIGlmIGdlbnJlID09ICdCbHVlcyc6CisgICAgICAgICAgICByZXR1cm4gZGIuREJfRE9OT1RJTkRFWAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGdlbnJlCisKKworY2xhc3MgU2hlbHZlQXNzb2NpYXRlSGFzaFRlc3RDYXNlKFNoZWx2ZUFzc29jaWF0ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisKK2NsYXNzIFNoZWx2ZUFzc29jaWF0ZUJUcmVlVGVzdENhc2UoU2hlbHZlQXNzb2NpYXRlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0JUUkVFCisKK2NsYXNzIFNoZWx2ZUFzc29jaWF0ZVJlY25vVGVzdENhc2UoU2hlbHZlQXNzb2NpYXRlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX1JFQ05PCisgICAga2V5dHlwZSA9IDAKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUaHJlYWRlZEFzc29jaWF0ZVRlc3RDYXNlKEFzc29jaWF0ZVRlc3RDYXNlKToKKworICAgIGRlZiBhZGREYXRhVG9EQihzZWxmLCBkKToKKyAgICAgICAgdDEgPSBUaHJlYWQodGFyZ2V0ID0gc2VsZi53cml0ZXIxLAorICAgICAgICAgICAgICAgICAgICBhcmdzID0gKGQsICkpCisgICAgICAgIHQyID0gVGhyZWFkKHRhcmdldCA9IHNlbGYud3JpdGVyMiwKKyAgICAgICAgICAgICAgICAgICAgYXJncyA9IChkLCApKQorCisgICAgICAgIHQxLnNldERhZW1vbihUcnVlKQorICAgICAgICB0Mi5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgdDEuc3RhcnQoKQorICAgICAgICB0Mi5zdGFydCgpCisgICAgICAgIHQxLmpvaW4oKQorICAgICAgICB0Mi5qb2luKCkKKworICAgIGRlZiB3cml0ZXIxKHNlbGYsIGQpOgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtdXNpY2RhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUoc2VsZi5rZXl0eXBlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgICAgICBrZXkgPSAiJTAyZCIgJSBrZXkKKyAgICAgICAgICAgIGQucHV0KGtleSwgJ3wnLmpvaW4odmFsdWUpKQorCisgICAgZGVmIHdyaXRlcjIoc2VsZiwgZCk6CisgICAgICAgIGZvciB4IGluIHJhbmdlKDEwMCwgNjAwKToKKyAgICAgICAgICAgIGtleSA9ICd6JTJkJyAlIHgKKyAgICAgICAgICAgIHZhbHVlID0gW2tleV0gKiA0CisgICAgICAgICAgICBkLnB1dChrZXksICd8Jy5qb2luKHZhbHVlKSkKKworCitjbGFzcyBUaHJlYWRlZEFzc29jaWF0ZUhhc2hUZXN0Q2FzZShTaGVsdmVBc3NvY2lhdGVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorCitjbGFzcyBUaHJlYWRlZEFzc29jaWF0ZUJUcmVlVGVzdENhc2UoU2hlbHZlQXNzb2NpYXRlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0JUUkVFCisKK2NsYXNzIFRocmVhZGVkQXNzb2NpYXRlUmVjbm9UZXN0Q2FzZShTaGVsdmVBc3NvY2lhdGVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfUkVDTk8KKyAgICBrZXl0eXBlID0gMAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQXNzb2NpYXRlRXJyb3JUZXN0Q2FzZSkpCisKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShBc3NvY2lhdGVIYXNoVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEFzc29jaWF0ZUJUcmVlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEFzc29jaWF0ZVJlY25vVGVzdENhc2UpKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQXNzb2NpYXRlQlRyZWVUeG5UZXN0Q2FzZSkpCisKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShTaGVsdmVBc3NvY2lhdGVIYXNoVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFNoZWx2ZUFzc29jaWF0ZUJUcmVlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFNoZWx2ZUFzc29jaWF0ZVJlY25vVGVzdENhc2UpKQorCisgICAgaWYgaGF2ZV90aHJlYWRzOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRlZEFzc29jaWF0ZUhhc2hUZXN0Q2FzZSkpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRocmVhZGVkQXNzb2NpYXRlQlRyZWVUZXN0Q2FzZSkpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRocmVhZGVkQXNzb2NpYXRlUmVjbm9UZXN0Q2FzZSkpCisKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYXNzb2NpYXRlLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwN2JhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYXNzb2NpYXRlLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwN2JhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Fzc29jaWF0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfYmFzaWNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNTdiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkKQEAgLTAsMCArMSwxMTU4IEBACisiIiIKK0Jhc2ljIFRlc3RDYXNlcyBmb3IgQlRyZWUgYW5kIGhhc2ggREJzLCB3aXRoIGFuZCB3aXRob3V0IGEgREJFbnYsIHdpdGgKK3ZhcmlvdXMgREIgZmxhZ3MsIGV0Yy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworaW1wb3J0IHN0cmluZworZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGltZQoraW1wb3J0IHN5cworCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdGVzdF9zdXBwb3J0LCB2ZXJib3NlLCBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIFwKKyAgICAgICAgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKK0RBU0ggPSAnLScKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBWZXJzaW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0MDBfdmVyc2lvbihzZWxmKToKKyAgICAgICAgaW5mbyA9IGRiLnZlcnNpb24oKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDIwCisgICAgICAgICAgICBwcmludCAnYnNkZGIuZGIudmVyc2lvbigpOiAlcycgJSAoaW5mbywgKQorICAgICAgICAgICAgcHJpbnQgZGIuREJfVkVSU0lPTl9TVFJJTkcKKyAgICAgICAgICAgIHByaW50ICctPScgKiAyMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8sIChkYi5EQl9WRVJTSU9OX01BSk9SLCBkYi5EQl9WRVJTSU9OX01JTk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgZGIuREJfVkVSU0lPTl9QQVRDSCkpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJhc2ljVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRidHlwZSAgICAgICA9IGRiLkRCX1VOS05PV04gICMgbXVzdCBiZSBzZXQgaW4gZGVyaXZlZCBjbGFzcworICAgIGNhY2hlc2l6ZSAgICA9ICgwLCAxMDI0KjEwMjQsIDEpCisgICAgZGJvcGVuZmxhZ3MgID0gMAorICAgIGRic2V0ZmxhZ3MgICA9IDAKKyAgICBkYm1vZGUgICAgICAgPSAwNjYwCisgICAgZGJuYW1lICAgICAgID0gTm9uZQorICAgIHVzZUVudiAgICAgICA9IDAKKyAgICBlbnZmbGFncyAgICAgPSAwCisgICAgZW52c2V0ZmxhZ3MgID0gMAorCisgICAgX251bUtleXMgICAgICA9IDEwMDIgICAgIyBQUklWQVRFLiAgTk9URTogbXVzdCBiZSBhbiBldmVuIHZhbHVlCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHNlbGYudXNlRW52OgorICAgICAgICAgICAgc2VsZi5ob21lRGlyPWdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xnX21heCgxMDI0KjEwMjQpCisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X3R4X21heCgzMCkKKyAgICAgICAgICAgICAgICBzZWxmLl90ID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF90eF90aW1lc3RhbXAoc2VsZi5fdCkKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfZmxhZ3Moc2VsZi5lbnZzZXRmbGFncywgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgc2VsZi5lbnZmbGFncyB8IGRiLkRCX0NSRUFURSkKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gInRlc3QiCisgICAgICAgICAgICAjIFllcywgYSBiYXJlIGV4Y2VwdCBpcyBpbnRlbmRlZCwgc2luY2Ugd2UncmUgcmUtcmFpc2luZyB0aGUgZXhjLgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVudiA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQorCisgICAgICAgICMgY3JlYXRlIGFuZCBvcGVuIHRoZSBEQgorICAgICAgICBzZWxmLmQgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgaWYgbm90IHNlbGYudXNlRW52IDoKKyAgICAgICAgICAgIHNlbGYuZC5zZXRfY2FjaGVzaXplKCpzZWxmLmNhY2hlc2l6ZSkKKyAgICAgICAgICAgIGNhY2hlc2l6ZSA9IHNlbGYuZC5nZXRfY2FjaGVzaXplKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplWzBdLCBzZWxmLmNhY2hlc2l6ZVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplWzJdLCBzZWxmLmNhY2hlc2l6ZVsyXSkKKyAgICAgICAgICAgICMgQmVya2VsZXkgREIgZXhwYW5kcyB0aGUgY2FjaGUgMjUlIGFjY291bnRpbmcgb3ZlcmhlYWQsCisgICAgICAgICAgICAjIGlmIHRoZSBjYWNoZSBpcyBzbWFsbC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTI1LCBpbnQoMTAwLjAqY2FjaGVzaXplWzFdL3NlbGYuY2FjaGVzaXplWzFdKSkKKyAgICAgICAgc2VsZi5kLnNldF9mbGFncyhzZWxmLmRic2V0ZmxhZ3MpCisgICAgICAgIGlmIHNlbGYuZGJuYW1lOgorICAgICAgICAgICAgc2VsZi5kLm9wZW4oc2VsZi5maWxlbmFtZSwgc2VsZi5kYm5hbWUsIHNlbGYuZGJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYm9wZW5mbGFnc3xkYi5EQl9DUkVBVEUsIHNlbGYuZGJtb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kLm9wZW4oc2VsZi5maWxlbmFtZSwgICAjIHRyeSBvdXQga2V5d29yZCBhcmdzCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gc2VsZi5kYm1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkYnR5cGUgPSBzZWxmLmRidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzID0gc2VsZi5kYm9wZW5mbGFnc3xkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgaWYgbm90IHNlbGYudXNlRW52OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZC5zZXRfY2FjaGVzaXplLCAqc2VsZi5jYWNoZXNpemUpCisKKyAgICAgICAgc2VsZi5wb3B1bGF0ZURCKCkKKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmQuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLmVudiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZW5hbWUpCisKKworCisgICAgZGVmIHBvcHVsYXRlREIoc2VsZiwgX3R4bj1Ob25lKToKKyAgICAgICAgZCA9IHNlbGYuZAorCisgICAgICAgIGZvciB4IGluIHJhbmdlKHNlbGYuX251bUtleXMvLzIpOgorICAgICAgICAgICAga2V5ID0gJyUwNGQnICUgKHNlbGYuX251bUtleXMgLSB4KSAgIyBpbnNlcnQga2V5cyBpbiByZXZlcnNlIG9yZGVyCisgICAgICAgICAgICBkYXRhID0gc2VsZi5tYWtlRGF0YShrZXkpCisgICAgICAgICAgICBkLnB1dChrZXksIGRhdGEsIF90eG4pCisKKyAgICAgICAgZC5wdXQoJ2VtcHR5IHZhbHVlJywgJycsIF90eG4pCisKKyAgICAgICAgZm9yIHggaW4gcmFuZ2Uoc2VsZi5fbnVtS2V5cy8vMi0xKToKKyAgICAgICAgICAgIGtleSA9ICclMDRkJyAlIHggICMgYW5kIG5vdyBzb21lIGluIGZvcndhcmQgb3JkZXIKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLm1ha2VEYXRhKGtleSkKKyAgICAgICAgICAgIGQucHV0KGtleSwgZGF0YSwgX3R4bikKKworICAgICAgICBpZiBfdHhuOgorICAgICAgICAgICAgX3R4bi5jb21taXQoKQorCisgICAgICAgIG51bSA9IGxlbihkKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImNyZWF0ZWQgJWQgcmVjb3JkcyIgJSBudW0KKworCisgICAgZGVmIG1ha2VEYXRhKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBEQVNILmpvaW4oW2tleV0gKiA1KQorCisKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDAxX0dldHNBbmRQdXRzKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAxX0dldHNBbmRQdXRzLi4uIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgZm9yIGtleSBpbiBbJzAwMDEnLCAnMDEwMCcsICcwNDAwJywgJzA3MDAnLCAnMDk5OSddOgorICAgICAgICAgICAgZGF0YSA9IGQuZ2V0KGtleSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgZGF0YQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJzAzMjEnKSwgJzAzMjEtMDMyMS0wMzIxLTAzMjEtMDMyMScpCisKKyAgICAgICAgIyBCeSBkZWZhdWx0IG5vbi1leGlzdGVudCBrZXlzIHJldHVybiBOb25lLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2FiY2QnKSwgTm9uZSkKKworICAgICAgICAjIC4uLmJ1dCB0aGV5IHJhaXNlIGV4Y2VwdGlvbnMgaW4gb3RoZXIgc2l0dWF0aW9ucy4gIENhbGwKKyAgICAgICAgIyBzZXRfZ2V0X3JldHVybnNfbm9uZSgpIHRvIGNoYW5nZSBpdC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZC5kZWxldGUoJ2FiY2QnKQorICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yLCB2YWw6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCBkYi5EQl9OT1RGT1VORCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKQorCisKKyAgICAgICAgZC5wdXQoJ2FiY2QnLCAnYSBuZXcgcmVjb3JkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYWJjZCcpLCAnYSBuZXcgcmVjb3JkJykKKworICAgICAgICBkLnB1dCgnYWJjZCcsICdzYW1lIGtleScpCisgICAgICAgIGlmIHNlbGYuZGJzZXRmbGFncyAmIGRiLkRCX0RVUDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2FiY2QnKSwgJ2EgbmV3IHJlY29yZCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhYmNkJyksICdzYW1lIGtleScpCisKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkLnB1dCgnYWJjZCcsICd0aGlzIHNob3VsZCBmYWlsJywgZmxhZ3M9ZGIuREJfTk9PVkVSV1JJVEUpCisgICAgICAgIGV4Y2VwdCBkYi5EQktleUV4aXN0RXJyb3IsIHZhbDoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsWzBdLCBkYi5EQl9LRVlFWElTVCkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLmFyZ3NbMF0sIGRiLkRCX0tFWUVYSVNUKQorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgdmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgaWYgc2VsZi5kYnNldGZsYWdzICYgZGIuREJfRFVQOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYWJjZCcpLCAnYSBuZXcgcmVjb3JkJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2FiY2QnKSwgJ3NhbWUga2V5JykKKworCisgICAgICAgIGQuc3luYygpCisgICAgICAgIGQuY2xvc2UoKQorICAgICAgICBkZWwgZAorCisgICAgICAgIHNlbGYuZCA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBpZiBzZWxmLmRibmFtZToKKyAgICAgICAgICAgIHNlbGYuZC5vcGVuKHNlbGYuZmlsZW5hbWUsIHNlbGYuZGJuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kLm9wZW4oc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZCA9IHNlbGYuZAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJzAzMjEnKSwgJzAzMjEtMDMyMS0wMzIxLTAzMjEtMDMyMScpCisgICAgICAgIGlmIHNlbGYuZGJzZXRmbGFncyAmIGRiLkRCX0RVUDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2FiY2QnKSwgJ2EgbmV3IHJlY29yZCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhYmNkJyksICdzYW1lIGtleScpCisKKyAgICAgICAgcmVjID0gZC5nZXRfYm90aCgnMDU1NScsICcwNTU1LTA1NTUtMDU1NS0wNTU1LTA1NTUnKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgcmVjCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldF9ib3RoKCcwNTU1JywgJ2JhZCBkYXRhJyksIE5vbmUpCisKKyAgICAgICAgIyB0ZXN0IGRlZmF1bHQgdmFsdWUKKyAgICAgICAgZGF0YSA9IGQuZ2V0KCdiYWQga2V5JywgJ2JhZCBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnYmFkIGRhdGEnKQorCisgICAgICAgICMgYW55IG9iamVjdCBjYW4gcGFzcyB0aHJvdWdoCisgICAgICAgIGRhdGEgPSBkLmdldCgnYmFkIGtleScsIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc2VsZikKKworICAgICAgICBzID0gZC5zdGF0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlKHt9KSkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdkLnN0YXQoKSByZXR1cm5lZCB0aGlzIGRpY3Rpb25hcnk6JworICAgICAgICAgICAgcHByaW50KHMpCisKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDAyX0RpY3Rpb25hcnlNZXRob2RzKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAyX0RpY3Rpb25hcnlNZXRob2RzLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgZm9yIGtleSBpbiBbJzAwMDInLCAnMDEwMScsICcwNDAxJywgJzA3MDEnLCAnMDk5OCddOgorICAgICAgICAgICAgZGF0YSA9IGRba2V5XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzZWxmLm1ha2VEYXRhKGtleSkpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IGRhdGEKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgc2VsZi5fbnVtS2V5cykKKyAgICAgICAga2V5cyA9IGQua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCBzZWxmLl9udW1LZXlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoa2V5cyksIHR5cGUoW10pKQorCisgICAgICAgIGRbJ25ldyByZWNvcmQnXSA9ICdhIG5ldyByZWNvcmQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBzZWxmLl9udW1LZXlzKzEpCisgICAgICAgIGtleXMgPSBkLmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzKSwgc2VsZi5fbnVtS2V5cysxKQorCisgICAgICAgIGRbJ25ldyByZWNvcmQnXSA9ICdhIHJlcGxhY2VtZW50IHJlY29yZCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIHNlbGYuX251bUtleXMrMSkKKyAgICAgICAga2V5cyA9IGQua2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCBzZWxmLl9udW1LZXlzKzEpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJ0aGUgZmlyc3QgMTAga2V5cyBhcmU6IgorICAgICAgICAgICAgcHByaW50KGtleXNbOjEwXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ25ldyByZWNvcmQnXSwgJ2EgcmVwbGFjZW1lbnQgcmVjb3JkJykKKworIyBXZSBjaGVjayBhbHNvIHRoZSBwb3NpdGlvbmFsIHBhcmFtZXRlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaGFzX2tleSgnMDAwMScsIE5vbmUpLCAxKQorIyBXZSBjaGVjayBhbHNvIHRoZSBrZXl3b3JkIHBhcmFtZXRlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaGFzX2tleSgnc3BhbScsIHR4bj1Ob25lKSwgMCkKKworICAgICAgICBpdGVtcyA9IGQuaXRlbXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdGVtcyksIHNlbGYuX251bUtleXMrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGl0ZW1zKSwgdHlwZShbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpdGVtc1swXSksIHR5cGUoKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdGVtc1swXSksIDIpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJ0aGUgZmlyc3QgMTAgaXRlbXMgYXJlOiIKKyAgICAgICAgICAgIHBwcmludChpdGVtc1s6MTBdKQorCisgICAgICAgIHZhbHVlcyA9IGQudmFsdWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgc2VsZi5fbnVtS2V5cysxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWVzKSwgdHlwZShbXSkpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJ0aGUgZmlyc3QgMTAgdmFsdWVzIGFyZToiCisgICAgICAgICAgICBwcHJpbnQodmFsdWVzWzoxMF0pCisKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDAyYl9TZXF1ZW5jZU1ldGhvZHMoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmQKKworICAgICAgICBmb3Iga2V5IGluIFsnMDAwMicsICcwMTAxJywgJzA0MDEnLCAnMDcwMScsICcwOTk4J106CisgICAgICAgICAgICBkYXRhID0gZFtrZXldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNlbGYubWFrZURhdGEoa2V5KSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgZGF0YQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGQsICJfX2NvbnRhaW5zX18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCIwNDAxIiBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCIxMjM0IiBpbiBkKQorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwM19TaW1wbGVDdXJzb3JTdHVmZihzZWxmLCBnZXRfcmFpc2VzX2Vycm9yPTAsIHNldF9yYWlzZXNfZXJyb3I9MCk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwM19TaW1wbGVDdXJzb3JTdHVmZiAoZ2V0X2Vycm9yICVzLCBzZXRfZXJyb3IgJXMpLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgZ2V0X3JhaXNlc19lcnJvciwgc2V0X3JhaXNlc19lcnJvcikKKworICAgICAgICBpZiBzZWxmLmVudiBhbmQgc2VsZi5kYm9wZW5mbGFncyAmIGRiLkRCX0FVVE9fQ09NTUlUOgorICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR4biA9IE5vbmUKKyAgICAgICAgYyA9IHNlbGYuZC5jdXJzb3IodHhuPXR4bikKKworICAgICAgICByZWMgPSBjLmZpcnN0KCkKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICBpZiB2ZXJib3NlIGFuZCBjb3VudCAlIDEwMCA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlYyA9IGMubmV4dCgpCisgICAgICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yLCB2YWw6CisgICAgICAgICAgICAgICAgaWYgZ2V0X3JhaXNlc19lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwuYXJnc1swXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICAgICAgICAgICAgICByZWMgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmV4cGVjdGVkIERCTm90Rm91bmRFcnJvciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0X2N1cnJlbnRfc2l6ZSgpLCBsZW4oYy5jdXJyZW50KClbMV0pLAorICAgICAgICAgICAgICAgICAgICAiJXMgIT0gbGVuKCVyKSIgJSAoYy5nZXRfY3VycmVudF9zaXplKCksIGMuY3VycmVudCgpWzFdKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBzZWxmLl9udW1LZXlzKQorCisKKyAgICAgICAgcmVjID0gYy5sYXN0KCkKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICBpZiB2ZXJib3NlIGFuZCBjb3VudCAlIDEwMCA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlYyA9IGMucHJldigpCisgICAgICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yLCB2YWw6CisgICAgICAgICAgICAgICAgaWYgZ2V0X3JhaXNlc19lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwuYXJnc1swXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICAgICAgICAgICAgICByZWMgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmV4cGVjdGVkIERCTm90Rm91bmRFcnJvciIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgc2VsZi5fbnVtS2V5cykKKworICAgICAgICByZWMgPSBjLnNldCgnMDUwNScpCisgICAgICAgIHJlYzIgPSBjLmN1cnJlbnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYywgcmVjMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNbMF0sICcwNTA1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNbMV0sIHNlbGYubWFrZURhdGEoJzA1MDUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldF9jdXJyZW50X3NpemUoKSwgbGVuKHJlY1sxXSkpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgd2UgZ2V0IGVtcHR5IHZhbHVlcyBwcm9wZXJseQorICAgICAgICByZWMgPSBjLnNldCgnZW1wdHkgdmFsdWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY1sxXSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5nZXRfY3VycmVudF9zaXplKCksIDApCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbiA9IGMuc2V0KCdiYWQga2V5JykKKyAgICAgICAgZXhjZXB0IGRiLkRCTm90Rm91bmRFcnJvciwgdmFsOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkRCX05PVEZPVU5EKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwuYXJnc1swXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNldF9yYWlzZXNfZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKQorICAgICAgICAgICAgaWYgbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIE5vbmU6ICVyIiAlIChuLCkpCisKKyAgICAgICAgcmVjID0gYy5nZXRfYm90aCgnMDQwNCcsIHNlbGYubWFrZURhdGEoJzA0MDQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWMsICgnMDQwNCcsIHNlbGYubWFrZURhdGEoJzA0MDQnKSkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbiA9IGMuZ2V0X2JvdGgoJzA0MDQnLCAnYmFkIGRhdGEnKQorICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yLCB2YWw6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDYpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfTk9URk9VTkQpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCBkYi5EQl9OT1RGT1VORCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZ2V0X3JhaXNlc19lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiIpCisgICAgICAgICAgICBpZiBuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgTm9uZTogJXIiICUgKG4sKSkKKworICAgICAgICBpZiBzZWxmLmQuZ2V0X3R5cGUoKSA9PSBkYi5EQl9CVFJFRToKKyAgICAgICAgICAgIHJlYyA9IGMuc2V0X3JhbmdlKCcwMTEnKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAic2VhcmNoZWQgZm9yICcwMTEnLCBmb3VuZDogIiwgcmVjCisKKyAgICAgICAgICAgIHJlYyA9IGMuc2V0X3JhbmdlKCcwMTEnLGRsZW49MCxkb2ZmPTApCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJzZWFyY2hlZCAocGFydGlhbCkgZm9yICcwMTEnLCBmb3VuZDogIiwgcmVjCisgICAgICAgICAgICBpZiByZWNbMV0gIT0gJyc6IHNlbGYuZmFpbCgnZXhwZWN0ZWQgZW1wdHkgZGF0YSBwb3J0aW9uJykKKworICAgICAgICAgICAgZXYgPSBjLnNldF9yYW5nZSgnZW1wdHkgdmFsdWUnKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAic2VhcmNoIGZvciAnZW1wdHkgdmFsdWUnIHJldHVybmVkIiwgZXYKKyAgICAgICAgICAgIGlmIGV2WzFdICE9ICcnOiBzZWxmLmZhaWwoJ2VtcHR5IHZhbHVlIGxvb2t1cCBmYWlsZWQnKQorCisgICAgICAgIGMuc2V0KCcwNDk5JykKKyAgICAgICAgYy5kZWxldGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZWMgPSBjLmN1cnJlbnQoKQorICAgICAgICBleGNlcHQgZGIuREJLZXlFbXB0eUVycm9yLCB2YWw6CisgICAgICAgICAgICBpZiBnZXRfcmFpc2VzX2Vycm9yOgorICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfS0VZRU1QVFkpCisgICAgICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLmFyZ3NbMF0sIGRiLkRCX0tFWUVNUFRZKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgREJLZXlFbXB0eUVycm9yIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGdldF9yYWlzZXNfZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdEQktleUVtcHR5RXJyb3IgZXhjZXB0aW9uIGV4cGVjdGVkJykKKworICAgICAgICBjLm5leHQoKQorICAgICAgICBjMiA9IGMuZHVwKGRiLkRCX1BPU0lUSU9OKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY3VycmVudCgpLCBjMi5jdXJyZW50KCkpCisKKyAgICAgICAgYzIucHV0KCcnLCAnYSBuZXcgdmFsdWUnLCBkYi5EQl9DVVJSRU5UKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY3VycmVudCgpLCBjMi5jdXJyZW50KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jdXJyZW50KClbMV0sICdhIG5ldyB2YWx1ZScpCisKKyAgICAgICAgYzIucHV0KCcnLCAnZXInLCBkYi5EQl9DVVJSRU5ULCBkbGVuPTAsIGRvZmY9NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjMi5jdXJyZW50KClbMV0sICdhIG5ld2VyIHZhbHVlJykKKworICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgYzIuY2xvc2UoKQorICAgICAgICBpZiB0eG46CisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKworICAgICAgICAjIHRpbWUgdG8gYWJ1c2UgdGhlIGNsb3NlZCBjdXJzb3JzIGFuZCBob3BlIHdlIGRvbid0IGNyYXNoCisgICAgICAgIG1ldGhvZHNfdG9fdGVzdCA9IHsKKyAgICAgICAgICAgICdjdXJyZW50JzogKCksCisgICAgICAgICAgICAnZGVsZXRlJzogKCksCisgICAgICAgICAgICAnZHVwJzogKGRiLkRCX1BPU0lUSU9OLCksCisgICAgICAgICAgICAnZmlyc3QnOiAoKSwKKyAgICAgICAgICAgICdnZXQnOiAoMCwpLAorICAgICAgICAgICAgJ25leHQnOiAoKSwKKyAgICAgICAgICAgICdwcmV2JzogKCksCisgICAgICAgICAgICAnbGFzdCc6ICgpLAorICAgICAgICAgICAgJ3B1dCc6KCcnLCAnc3BhbScsIGRiLkRCX0NVUlJFTlQpLAorICAgICAgICAgICAgJ3NldCc6ICgiMDUwNSIsKSwKKyAgICAgICAgfQorICAgICAgICBmb3IgbWV0aG9kLCBhcmdzIGluIG1ldGhvZHNfdG9fdGVzdC5pdGVtcygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJhdHRlbXB0aW5nIHRvIHVzZSBhIGNsb3NlZCBjdXJzb3IncyAlcyBtZXRob2QiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QKKyAgICAgICAgICAgICAgICAjIGEgYnVnIG1heSBjYXVzZSBhIE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZS4uLgorICAgICAgICAgICAgICAgIGdldGF0dHIoYywgbWV0aG9kKSgqYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCB2YWw6CisgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsWzBdLCAwKQorICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCAwKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiB1c2luZyBhIGJ1Z2d5IGN1cnNvcidzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgbWV0aG9kIiAlIG1ldGhvZCkKKworICAgICAgICAjCisgICAgICAgICMgZnJlZSBjdXJzb3IgcmVmZXJlbmNpbmcgYSBjbG9zZWQgZGF0YWJhc2UsIGl0IHNob3VsZCBub3QgYmFyZjoKKyAgICAgICAgIworICAgICAgICBvbGRjdXJzb3IgPSBzZWxmLmQuY3Vyc29yKHR4bj10eG4pCisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisKKyAgICAgICAgIyB0aGlzIHdvdWxkIG9yaWdpbmFsbHkgY2F1c2UgYSBzZWdmYXVsdCB3aGVuIHRoZSBjdXJzb3IgZm9yIGEKKyAgICAgICAgIyBjbG9zZWQgZGF0YWJhc2Ugd2FzIGNsZWFuZWQgdXAuICBpdCBzaG91bGQgbm90IGFueW1vcmUuCisgICAgICAgICMgU0YgcHlic2RkYiBidWcgaWQgNjY3MzQzCisgICAgICAgIGRlbCBvbGRjdXJzb3IKKworICAgIGRlZiB0ZXN0MDNiX1NpbXBsZUN1cnNvcldpdGhvdXRHZXRSZXR1cm5zTm9uZTAoc2VsZik6CisgICAgICAgICMgc2FtZSB0ZXN0IGJ1dCByYWlzZSBleGNlcHRpb25zIGluc3RlYWQgb2YgcmV0dXJuaW5nIE5vbmUKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAzYl9TaW1wbGVDdXJzb3JTdHVmZldpdGhvdXRHZXRSZXR1cm5zTm9uZS4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIG9sZCA9IHNlbGYuZC5zZXRfZ2V0X3JldHVybnNfbm9uZSgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9sZCwgMikKKyAgICAgICAgc2VsZi50ZXN0MDNfU2ltcGxlQ3Vyc29yU3R1ZmYoZ2V0X3JhaXNlc19lcnJvcj0xLCBzZXRfcmFpc2VzX2Vycm9yPTEpCisKKyAgICBkZWYgdGVzdDAzYl9TaW1wbGVDdXJzb3JXaXRoR2V0UmV0dXJuc05vbmUxKHNlbGYpOgorICAgICAgICAjIHNhbWUgdGVzdCBidXQgcmFpc2UgZXhjZXB0aW9ucyBpbnN0ZWFkIG9mIHJldHVybmluZyBOb25lCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwM2JfU2ltcGxlQ3Vyc29yU3R1ZmZXaXRob3V0R2V0UmV0dXJuc05vbmUuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBvbGQgPSBzZWxmLmQuc2V0X2dldF9yZXR1cm5zX25vbmUoMSkKKyAgICAgICAgc2VsZi50ZXN0MDNfU2ltcGxlQ3Vyc29yU3R1ZmYoZ2V0X3JhaXNlc19lcnJvcj0wLCBzZXRfcmFpc2VzX2Vycm9yPTEpCisKKworICAgIGRlZiB0ZXN0MDNjX1NpbXBsZUN1cnNvckdldFJldHVybnNOb25lMihzZWxmKToKKyAgICAgICAgIyBzYW1lIHRlc3QgYnV0IHJhaXNlIGV4Y2VwdGlvbnMgaW5zdGVhZCBvZiByZXR1cm5pbmcgTm9uZQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDNjX1NpbXBsZUN1cnNvclN0dWZmV2l0aG91dFNldFJldHVybnNOb25lLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgb2xkID0gc2VsZi5kLnNldF9nZXRfcmV0dXJuc19ub25lKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2xkLCAyKQorICAgICAgICBvbGQgPSBzZWxmLmQuc2V0X2dldF9yZXR1cm5zX25vbmUoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGQsIDEpCisgICAgICAgIHNlbGYudGVzdDAzX1NpbXBsZUN1cnNvclN0dWZmKGdldF9yYWlzZXNfZXJyb3I9MCwgc2V0X3JhaXNlc19lcnJvcj0wKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA2KToKKyAgICAgICAgZGVmIHRlc3QwM2RfU2ltcGxlQ3Vyc29yUHJpb3JpdHkoc2VsZikgOgorICAgICAgICAgICAgYyA9IHNlbGYuZC5jdXJzb3IoKQorICAgICAgICAgICAgYy5zZXRfcHJpb3JpdHkoZGIuREJfUFJJT1JJVFlfVkVSWV9MT1cpICAjIFBvc2l0aW9uYWwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIuREJfUFJJT1JJVFlfVkVSWV9MT1csIGMuZ2V0X3ByaW9yaXR5KCkpCisgICAgICAgICAgICBjLnNldF9wcmlvcml0eShwcmlvcml0eT1kYi5EQl9QUklPUklUWV9ISUdIKSAgIyBLZXl3b3JkCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX1BSSU9SSVRZX0hJR0gsIGMuZ2V0X3ByaW9yaXR5KCkpCisgICAgICAgICAgICBjLmNsb3NlKCkKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDA0X1BhcnRpYWxHZXRBbmRQdXQoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmQKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA0X1BhcnRpYWxHZXRBbmRQdXQuLi4iICUgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBrZXkgPSAicGFydGlhbFRlc3QiCisgICAgICAgIGRhdGEgPSAiMSIgKiAxMDAwICsgIjIiICogMTAwMAorICAgICAgICBkLnB1dChrZXksIGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoa2V5KSwgZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChrZXksIGRsZW49MjAsIGRvZmY9OTkwKSwKKyAgICAgICAgICAgICAgICAoIjEiICogMTApICsgKCIyIiAqIDEwKSkKKworICAgICAgICBkLnB1dCgicGFydGlhbHRlc3QyIiwgKCIxIiAqIDMwMDAwKSArICJyb2JpbiIgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCJwYXJ0aWFsdGVzdDIiLCBkbGVuPTUsIGRvZmY9MzAwMDApLCAicm9iaW4iKQorCisgICAgICAgICMgVGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gREIgaGVyZS4uLiAgQ29tbWVudGVkIG91dCB0aGUgdGVzdCBmb3IKKyAgICAgICAgIyBub3cuCisgICAgICAgICMjc2VsZi5hc3NlcnRFcXVhbChkLmdldCgicGFydGlhbHRlc3QyIiwgZGxlbj01LCBkb2ZmPTMwMDEwKSwgIiIpCisKKyAgICAgICAgaWYgc2VsZi5kYnNldGZsYWdzICE9IGRiLkRCX0RVUDoKKyAgICAgICAgICAgICMgUGFydGlhbCBwdXQgd2l0aCBkdXBsaWNhdGUgcmVjb3JkcyByZXF1aXJlcyBhIGN1cnNvcgorICAgICAgICAgICAgZC5wdXQoa2V5LCAiMDAwMCIsIGRsZW49MjAwMCwgZG9mZj0wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChrZXkpLCAiMDAwMCIpCisKKyAgICAgICAgICAgIGQucHV0KGtleSwgIjExMTEiLCBkbGVuPTEsIGRvZmY9MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoa2V5KSwgIjAwMTExMTAiKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB0ZXN0MDVfR2V0U2l6ZShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDVfR2V0U2l6ZS4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDUwMDAwLCA1MDApOgorICAgICAgICAgICAga2V5ID0gInNpemUlcyIgJSBpCisgICAgICAgICAgICAjcHJpbnQgImJlZm9yZSAiLCBpLAorICAgICAgICAgICAgZC5wdXQoa2V5LCAiMSIgKiBpKQorICAgICAgICAgICAgI3ByaW50ICJhZnRlciIsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X3NpemUoa2V5KSwgaSkKKyAgICAgICAgICAgICNwcmludCAiZG9uZSIKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDA2X1RydW5jYXRlKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwNl9UcnVuY2F0ZS4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGQucHV0KCJhYmNkZSIsICJBQkNERSIpOworICAgICAgICBudW0gPSBkLnRydW5jYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG51bSA+PSAxLCAidHJ1bmNhdGUgcmV0dXJuZWQgPD0gMCBvbiBub24tZW1wdHkgZGF0YWJhc2UiKQorICAgICAgICBudW0gPSBkLnRydW5jYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW0sIDAsCisgICAgICAgICAgICAgICAgInRydW5jYXRlIG9uIGVtcHR5IERCIHJldHVybmVkIG5vbnplcm8gKCVyKSIgJSAobnVtLCkpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwN192ZXJpZnkoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IGJ1ZyBzb2x2ZWQgaW4gNC43LjNwcmU4CisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisgICAgICAgIGQgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgZC52ZXJpZnkoc2VsZi5maWxlbmFtZSkKKworCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNik6CisgICAgICAgIGRlZiB0ZXN0MDhfZXhpc3RzKHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuZC5wdXQoImFiY2RlIiwgIkFCQ0RFIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmQuZXhpc3RzKCJhYmNkZSIpID09IFRydWUsCisgICAgICAgICAgICAgICAgICAgICJEQi0+ZXhpc3RzKCkgcmV0dXJucyB3cm9uZyB2YWx1ZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kLmV4aXN0cygieCIpID09IEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAiREItPmV4aXN0cygpIHJldHVybnMgd3JvbmcgdmFsdWUiKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNyk6CisgICAgICAgIGRlZiB0ZXN0X2NvbXBhY3Qoc2VsZikgOgorICAgICAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBkLmNvbXBhY3QoZmxhZ3M9ZGIuREJfRlJFRUxJU1RfT05MWSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGQuY29tcGFjdChmbGFncz1kYi5EQl9GUkVFTElTVF9PTkxZKSkKKyAgICAgICAgICAgIGQucHV0KCJhYmNkZSIsICJBQkNERSIpOworICAgICAgICAgICAgZC5wdXQoImJjZGUiLCAiQkNERSIpOworICAgICAgICAgICAgZC5wdXQoImFiYyIsICJBQkMiKTsKKyAgICAgICAgICAgIGQucHV0KCJtb250eSIsICJweXRob24iKTsKKyAgICAgICAgICAgIGQuZGVsZXRlKCJhYmMiKQorICAgICAgICAgICAgZC5kZWxldGUoImJjZGUiKQorICAgICAgICAgICAgZC5jb21wYWN0KHN0YXJ0PSdhYmNkZScsIHN0b3A9J21vbnR5JywgdHhuPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIGNvbXBhY3RfZmlsbHBlcmNlbnQ9NDIsIGNvbXBhY3RfcGFnZXM9MSwKKyAgICAgICAgICAgICAgICAgICAgY29tcGFjdF90aW1lb3V0PTUwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICBmbGFncz1kYi5EQl9GUkVFTElTVF9PTkxZfGRiLkRCX0ZSRUVfU1BBQ0UpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIEJhc2ljQlRyZWVUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorCisKK2NsYXNzIEJhc2ljSGFzaFRlc3RDYXNlKEJhc2ljVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKworCitjbGFzcyBCYXNpY0JUcmVlV2l0aFRocmVhZEZsYWdUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisKKworY2xhc3MgQmFzaWNIYXNoV2l0aFRocmVhZEZsYWdUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisgICAgZGJvcGVuZmxhZ3MgPSBkYi5EQl9USFJFQUQKKworCitjbGFzcyBCYXNpY1dpdGhFbnZUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIHVzZUVudiA9IDEKKyAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDA5X0VudlJlbW92ZUFuZFJlbmFtZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW52OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA5X0VudlJlbW92ZUFuZFJlbmFtZS4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgICMgY2FuJ3QgcmVuYW1lIG9yIHJlbW92ZSBhbiBvcGVuIERCCisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisKKyAgICAgICAgbmV3bmFtZSA9IHNlbGYuZmlsZW5hbWUgKyAnLnJlbmFtZWQnCisgICAgICAgIHNlbGYuZW52LmRicmVuYW1lKHNlbGYuZmlsZW5hbWUsIE5vbmUsIG5ld25hbWUpCisgICAgICAgIHNlbGYuZW52LmRicmVtb3ZlKG5ld25hbWUpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCYXNpY0JUcmVlV2l0aEVudlRlc3RDYXNlKEJhc2ljV2l0aEVudlRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorCisKK2NsYXNzIEJhc2ljSGFzaFdpdGhFbnZUZXN0Q2FzZShCYXNpY1dpdGhFbnZUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJhc2ljVHJhbnNhY3Rpb25UZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBpZiAoc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KSkgb3IgKChzeXMudmVyc2lvbl9pbmZvID49ICgzLCAwKSkgYW5kCisgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKKyAgICAgICAgZGVmIGFzc2VydEluKHNlbGYsIGEsIGIsIG1zZz1Ob25lKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRUcnVlKGEgaW4gYiwgbXNnPW1zZykKKworICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFEIHwgZGIuREJfQVVUT19DT01NSVQKKyAgICB1c2VFbnYgPSAxCisgICAgZW52ZmxhZ3MgPSAoZGIuREJfVEhSRUFEIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9DSyB8CisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9UWE4pCisgICAgZW52c2V0ZmxhZ3MgPSBkYi5EQl9BVVRPX0NPTU1JVAorCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudHhuLmNvbW1pdCgpCisgICAgICAgIEJhc2ljVGVzdENhc2UudGVhckRvd24oc2VsZikKKworCisgICAgZGVmIHBvcHVsYXRlREIoc2VsZik6CisgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIEJhc2ljVGVzdENhc2UucG9wdWxhdGVEQihzZWxmLCBfdHhuPXR4bikKKworICAgICAgICBzZWxmLnR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisKKworICAgIGRlZiB0ZXN0MDZfVHJhbnNhY3Rpb25zKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwNl9UcmFuc2FjdGlvbnMuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCduZXcgcmVjJywgdHhuPXNlbGYudHhuKSwgTm9uZSkKKyAgICAgICAgZC5wdXQoJ25ldyByZWMnLCAndGhpcyBpcyBhIG5ldyByZWNvcmQnLCBzZWxmLnR4bikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnbmV3IHJlYycsIHR4bj1zZWxmLnR4biksCisgICAgICAgICAgICAgICAgJ3RoaXMgaXMgYSBuZXcgcmVjb3JkJykKKyAgICAgICAgc2VsZi50eG4uYWJvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCduZXcgcmVjJyksIE5vbmUpCisKKyAgICAgICAgc2VsZi50eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ25ldyByZWMnLCB0eG49c2VsZi50eG4pLCBOb25lKQorICAgICAgICBkLnB1dCgnbmV3IHJlYycsICd0aGlzIGlzIGEgbmV3IHJlY29yZCcsIHNlbGYudHhuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCduZXcgcmVjJywgdHhuPXNlbGYudHhuKSwKKyAgICAgICAgICAgICAgICAndGhpcyBpcyBhIG5ldyByZWNvcmQnKQorICAgICAgICBzZWxmLnR4bi5jb21taXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCduZXcgcmVjJyksICd0aGlzIGlzIGEgbmV3IHJlY29yZCcpCisKKyAgICAgICAgc2VsZi50eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICBjID0gZC5jdXJzb3Ioc2VsZi50eG4pCisgICAgICAgIHJlYyA9IGMuZmlyc3QoKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgd2hpbGUgcmVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgYW5kIGNvdW50ICUgMTAwID09IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBzZWxmLl9udW1LZXlzKzEpCisKKyAgICAgICAgYy5jbG9zZSgpICAgICAgICAgICAgICAgICMgQ3Vyc29ycyAqTVVTVCogYmUgY2xvc2VkIGJlZm9yZSBjb21taXQhCisgICAgICAgIHNlbGYudHhuLmNvbW1pdCgpCisKKyAgICAgICAgIyBmbHVzaCBwZW5kaW5nIHVwZGF0ZXMKKyAgICAgICAgc2VsZi5lbnYudHhuX2NoZWNrcG9pbnQgKDAsIDAsIDApCisKKyAgICAgICAgc3RhdERpY3QgPSBzZWxmLmVudi5sb2dfc3RhdCgwKTsKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbWFnaWMnLCBzdGF0RGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndmVyc2lvbicsIHN0YXREaWN0KQorICAgICAgICBzZWxmLmFzc2VydEluKCdjdXJfZmlsZScsIHN0YXREaWN0KQorICAgICAgICBzZWxmLmFzc2VydEluKCdyZWdpb25fbm93YWl0Jywgc3RhdERpY3QpCisKKyAgICAgICAgIyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGxvZyBmaWxlIHByZXNlbnQ6CisgICAgICAgIGxvZ3MgPSBzZWxmLmVudi5sb2dfYXJjaGl2ZShkYi5EQl9BUkNIX0FCUyB8IGRiLkRCX0FSQ0hfTE9HKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGxvZ3MsIE5vbmUpCisgICAgICAgIGZvciBsb2cgaW4gbG9nczoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ2xvZyBmaWxlOiAnICsgbG9nCisgICAgICAgICAgICBsb2dzID0gc2VsZi5lbnYubG9nX2FyY2hpdmUoZGIuREJfQVJDSF9SRU1PVkUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGxvZ3MpCisKKyAgICAgICAgc2VsZi50eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNik6CisgICAgICAgIGRlZiB0ZXN0MDhfZXhpc3RzKHNlbGYpIDoKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBzZWxmLmQucHV0KCJhYmNkZSIsICJBQkNERSIsIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5kLmV4aXN0cygiYWJjZGUiLCB0eG49dHhuKSA9PSBUcnVlLAorICAgICAgICAgICAgICAgICAgICAiREItPmV4aXN0cygpIHJldHVybnMgd3JvbmcgdmFsdWUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZC5leGlzdHMoIngiLCB0eG49dHhuKSA9PSBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIkRCLT5leGlzdHMoKSByZXR1cm5zIHdyb25nIHZhbHVlIikKKyAgICAgICAgICAgIHR4bi5hYm9ydCgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHRlc3QwOV9UeG5UcnVuY2F0ZShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDlfVHhuVHJ1bmNhdGUuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBkLnB1dCgiYWJjZGUiLCAiQUJDREUiKTsKKyAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgbnVtID0gZC50cnVuY2F0ZSh0eG4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShudW0gPj0gMSwgInRydW5jYXRlIHJldHVybmVkIDw9IDAgb24gbm9uLWVtcHR5IGRhdGFiYXNlIikKKyAgICAgICAgbnVtID0gZC50cnVuY2F0ZSh0eG4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtLCAwLAorICAgICAgICAgICAgICAgICJ0cnVuY2F0ZSBvbiBlbXB0eSBEQiByZXR1cm5lZCBub256ZXJvICglcikiICUgKG51bSwpKQorICAgICAgICB0eG4uY29tbWl0KCkKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDEwX1R4bkxhdGVVc2Uoc2VsZik6CisgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yLCBlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiREJUeG4uYWJvcnQoKSBjYWxsZWQgYWZ0ZXIgREJfVFhOIG5vIGxvbmdlciB2YWxpZCB3L28gYW4gZXhjZXB0aW9uIgorCisgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJEQlR4bi5jb21taXQoKSBjYWxsZWQgYWZ0ZXIgREJfVFhOIG5vIGxvbmdlciB2YWxpZCB3L28gYW4gZXhjZXB0aW9uIgorCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDQpOgorICAgICAgICBkZWYgdGVzdF90eG5fbmFtZShzZWxmKSA6CisgICAgICAgICAgICB0eG49c2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHhuLmdldF9uYW1lKCksICIiKQorICAgICAgICAgICAgdHhuLnNldF9uYW1lKCJYWFlZIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHhuLmdldF9uYW1lKCksICJYWFlZIikKKyAgICAgICAgICAgIHR4bi5zZXRfbmFtZSgiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHhuLmdldF9uYW1lKCksICIiKQorICAgICAgICAgICAgdHhuLmFib3J0KCkKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgICAgICBkZWYgdGVzdF90eG5fc2V0X3RpbWVvdXQoc2VsZikgOgorICAgICAgICAgICAgdHhuPXNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICB0eG4uc2V0X3RpbWVvdXQoMTIzNDU2NywgZGIuREJfU0VUX0xPQ0tfVElNRU9VVCkKKyAgICAgICAgICAgIHR4bi5zZXRfdGltZW91dCgyMzQ1Njc4LCBmbGFncz1kYi5EQl9TRVRfVFhOX1RJTUVPVVQpCisgICAgICAgICAgICB0eG4uYWJvcnQoKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICBkZWYgdGVzdF9nZXRfdHhfbWF4KHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnYuZ2V0X3R4X21heCgpLCAzMCkKKworICAgICAgICBkZWYgdGVzdF9nZXRfdHhfdGltZXN0YW1wKHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnYuZ2V0X3R4X3RpbWVzdGFtcCgpLCBzZWxmLl90KQorCisKKworY2xhc3MgQlRyZWVUcmFuc2FjdGlvblRlc3RDYXNlKEJhc2ljVHJhbnNhY3Rpb25UZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKworY2xhc3MgSGFzaFRyYW5zYWN0aW9uVGVzdENhc2UoQmFzaWNUcmFuc2FjdGlvblRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCVHJlZVJlY25vVGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgZGJ0eXBlICAgICA9IGRiLkRCX0JUUkVFCisgICAgZGJzZXRmbGFncyA9IGRiLkRCX1JFQ05VTQorCisgICAgZGVmIHRlc3QwOV9SZWNub0luQlRyZWUoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmQKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA5X1JlY25vSW5CVHJlZS4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHJlYyA9IGQuZ2V0KDIwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlYyksIHR5cGUoKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWMpLCAyKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlJlY29yZCAjMjAwIGlzICIsIHJlYworCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIGMuc2V0KCcwMjAwJykKKyAgICAgICAgbnVtID0gYy5nZXRfcmVjbm8oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobnVtKSwgdHlwZSgxKSkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJyZWNubyBvZiBkWycwMjAwJ10gaXMgIiwgbnVtCisKKyAgICAgICAgcmVjID0gYy5jdXJyZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNldF9yZWNubyhudW0pLCByZWMpCisKKyAgICAgICAgYy5jbG9zZSgpCisKKworCitjbGFzcyBCVHJlZVJlY25vV2l0aFRocmVhZEZsYWdUZXN0Q2FzZShCVHJlZVJlY25vVGVzdENhc2UpOgorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJhc2ljRFVQVGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgZGJzZXRmbGFncyA9IGRiLkRCX0RVUAorCisgICAgZGVmIHRlc3QxMF9EdXBsaWNhdGVLZXlzKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5kCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QxMF9EdXBsaWNhdGVLZXlzLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgZC5wdXQoImR1cDAiLCAiYmVmb3JlIikKKyAgICAgICAgZm9yIHggaW4gIlRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nLiIuc3BsaXQoKToKKyAgICAgICAgICAgIGQucHV0KCJkdXAxIiwgeCkKKyAgICAgICAgZC5wdXQoImR1cDIiLCAiYWZ0ZXIiKQorCisgICAgICAgIGRhdGEgPSBkLmdldCgiZHVwMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgIlRoZSIpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCBkYXRhCisKKyAgICAgICAgYyA9IGQuY3Vyc29yKCkKKyAgICAgICAgcmVjID0gYy5zZXQoImR1cDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYywgKCdkdXAxJywgJ1RoZScpKQorCisgICAgICAgIG5leHRfcmVnID0gYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0X3JlZywgKCdkdXAxJywgJ3F1aWNrJykpCisKKyAgICAgICAgcmVjID0gYy5zZXQoImR1cDEiKQorICAgICAgICBjb3VudCA9IGMuY291bnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCA5KQorCisgICAgICAgIG5leHRfZHVwID0gYy5uZXh0X2R1cCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dF9kdXAsICgnZHVwMScsICdxdWljaycpKQorCisgICAgICAgIHJlYyA9IGMuc2V0KCdkdXAxJykKKyAgICAgICAgd2hpbGUgcmVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGMubmV4dF9kdXAoKQorCisgICAgICAgIGMuc2V0KCdkdXAxJykKKyAgICAgICAgcmVjID0gYy5uZXh0X25vZHVwKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZWNbMF0sICdkdXAxJykKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IHJlYworCisgICAgICAgIGMuY2xvc2UoKQorCisKKworY2xhc3MgQlRyZWVEVVBUZXN0Q2FzZShCYXNpY0RVUFRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorCitjbGFzcyBIYXNoRFVQVGVzdENhc2UoQmFzaWNEVVBUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorCitjbGFzcyBCVHJlZURVUFdpdGhUaHJlYWRUZXN0Q2FzZShCYXNpY0RVUFRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisKK2NsYXNzIEhhc2hEVVBXaXRoVGhyZWFkVGVzdENhc2UoQmFzaWNEVVBUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQmFzaWNNdWx0aURCVGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CisgICAgZGJuYW1lID0gJ2ZpcnN0JworCisgICAgZGVmIG90aGVyVHlwZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kYnR5cGUgPT0gZGIuREJfQlRSRUU6CisgICAgICAgICAgICByZXR1cm4gZGIuREJfSEFTSAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGRiLkRCX0JUUkVFCisKKyAgICBkZWYgdGVzdDExX011bHRpREIoc2VsZik6CisgICAgICAgIGQxID0gc2VsZi5kCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QxMV9NdWx0aURCLi4uIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgZDIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgZDIub3BlbihzZWxmLmZpbGVuYW1lLCAic2Vjb25kIiwgc2VsZi5kYnR5cGUsCisgICAgICAgICAgICAgICAgc2VsZi5kYm9wZW5mbGFnc3xkYi5EQl9DUkVBVEUpCisgICAgICAgIGQzID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGQzLm9wZW4oc2VsZi5maWxlbmFtZSwgInRoaXJkIiwgc2VsZi5vdGhlclR5cGUoKSwKKyAgICAgICAgICAgICAgICBzZWxmLmRib3BlbmZsYWdzfGRiLkRCX0NSRUFURSkKKworICAgICAgICBmb3IgeCBpbiAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2ciLnNwbGl0KCk6CisgICAgICAgICAgICBkMi5wdXQoeCwgc2VsZi5tYWtlRGF0YSh4KSkKKworICAgICAgICBmb3IgeCBpbiBzdHJpbmcubGV0dGVyczoKKyAgICAgICAgICAgIGQzLnB1dCh4LCB4KjcwKQorCisgICAgICAgIGQxLnN5bmMoKQorICAgICAgICBkMi5zeW5jKCkKKyAgICAgICAgZDMuc3luYygpCisgICAgICAgIGQxLmNsb3NlKCkKKyAgICAgICAgZDIuY2xvc2UoKQorICAgICAgICBkMy5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5kID0gZDEgPSBkMiA9IGQzID0gTm9uZQorCisgICAgICAgIHNlbGYuZCA9IGQxID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIGQxLm9wZW4oc2VsZi5maWxlbmFtZSwgc2VsZi5kYm5hbWUsIGZsYWdzID0gc2VsZi5kYm9wZW5mbGFncykKKyAgICAgICAgZDIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgZDIub3BlbihzZWxmLmZpbGVuYW1lLCAic2Vjb25kIiwgIGZsYWdzID0gc2VsZi5kYm9wZW5mbGFncykKKyAgICAgICAgZDMgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgZDMub3BlbihzZWxmLmZpbGVuYW1lLCAidGhpcmQiLCBmbGFncyA9IHNlbGYuZGJvcGVuZmxhZ3MpCisKKyAgICAgICAgYzEgPSBkMS5jdXJzb3IoKQorICAgICAgICBjMiA9IGQyLmN1cnNvcigpCisgICAgICAgIGMzID0gZDMuY3Vyc29yKCkKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgcmVjID0gYzEuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZSBhbmQgKGNvdW50ICUgNTApID09IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBjMS5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgc2VsZi5fbnVtS2V5cykKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgcmVjID0gYzIuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGMyLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCA5KQorCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICByZWMgPSBjMy5maXJzdCgpCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgcmVjID0gYzMubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGxlbihzdHJpbmcubGV0dGVycykpCisKKworICAgICAgICBjMS5jbG9zZSgpCisgICAgICAgIGMyLmNsb3NlKCkKKyAgICAgICAgYzMuY2xvc2UoKQorCisgICAgICAgIGQyLmNsb3NlKCkKKyAgICAgICAgZDMuY2xvc2UoKQorCisKKworIyBTdHJhbmdlIHRoaW5ncyBoYXBwZW4gaWYgeW91IHRyeSB0byB1c2UgTXVsdGlwbGUgREJzIHBlciBmaWxlIHdpdGhvdXQgYQorIyBEQkVudiB3aXRoIE1QT09MIGFuZCBMT0NLaW5nLi4uCisKK2NsYXNzIEJUcmVlTXVsdGlEQlRlc3RDYXNlKEJhc2ljTXVsdGlEQlRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorICAgIGRib3BlbmZsYWdzID0gZGIuREJfVEhSRUFECisgICAgdXNlRW52ID0gMQorICAgIGVudmZsYWdzID0gZGIuREJfVEhSRUFEIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9DSworCitjbGFzcyBIYXNoTXVsdGlEQlRlc3RDYXNlKEJhc2ljTXVsdGlEQlRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9IQVNICisgICAgZGJvcGVuZmxhZ3MgPSBkYi5EQl9USFJFQUQKKyAgICB1c2VFbnYgPSAxCisgICAgZW52ZmxhZ3MgPSBkYi5EQl9USFJFQUQgfCBkYi5EQl9JTklUX01QT09MIHwgZGIuREJfSU5JVF9MT0NLCisKKworY2xhc3MgUHJpdmF0ZU9iamVjdCh1bml0dGVzdC5UZXN0Q2FzZSkgOgorICAgIGRlZiB0ZWFyRG93bihzZWxmKSA6CisgICAgICAgIGRlbCBzZWxmLm9iagorCisgICAgZGVmIHRlc3QwMV9EZWZhdWx0SXNOb25lKHNlbGYpIDoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm9iai5nZXRfcHJpdmF0ZSgpLCBOb25lKQorCisgICAgZGVmIHRlc3QwMl9hc3NpZ25tZW50KHNlbGYpIDoKKyAgICAgICAgYSA9ICJleGFtcGxlIG9mIHByaXZhdGUgb2JqZWN0IgorICAgICAgICBzZWxmLm9iai5zZXRfcHJpdmF0ZShhKQorICAgICAgICBiID0gc2VsZi5vYmouZ2V0X3ByaXZhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKSAgIyBPYmplY3QgaWRlbnRpdHkKKworICAgIGRlZiB0ZXN0MDNfbGVha19hc3NpZ25tZW50KHNlbGYpIDoKKyAgICAgICAgYSA9ICJleGFtcGxlIG9mIHByaXZhdGUgb2JqZWN0IgorICAgICAgICByZWZjb3VudCA9IHN5cy5nZXRyZWZjb3VudChhKQorICAgICAgICBzZWxmLm9iai5zZXRfcHJpdmF0ZShhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZmNvdW50KzEsIHN5cy5nZXRyZWZjb3VudChhKSkKKyAgICAgICAgc2VsZi5vYmouc2V0X3ByaXZhdGUoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWZjb3VudCwgc3lzLmdldHJlZmNvdW50KGEpKQorCisgICAgZGVmIHRlc3QwNF9sZWFrX0dDKHNlbGYpIDoKKyAgICAgICAgYSA9ICJleGFtcGxlIG9mIHByaXZhdGUgb2JqZWN0IgorICAgICAgICByZWZjb3VudCA9IHN5cy5nZXRyZWZjb3VudChhKQorICAgICAgICBzZWxmLm9iai5zZXRfcHJpdmF0ZShhKQorICAgICAgICBzZWxmLm9iaiA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWZjb3VudCwgc3lzLmdldHJlZmNvdW50KGEpKQorCitjbGFzcyBEQkVudlByaXZhdGVPYmplY3QoUHJpdmF0ZU9iamVjdCkgOgorICAgIGRlZiBzZXRVcChzZWxmKSA6CisgICAgICAgIHNlbGYub2JqID0gZGIuREJFbnYoKQorCitjbGFzcyBEQlByaXZhdGVPYmplY3QoUHJpdmF0ZU9iamVjdCkgOgorICAgIGRlZiBzZXRVcChzZWxmKSA6CisgICAgICAgIHNlbGYub2JqID0gZGIuREIoKQorCitjbGFzcyBDcmFzaEFuZEJ1cm4odW5pdHRlc3QuVGVzdENhc2UpIDoKKyAgICAjZGVmIHRlc3QwMV9PcGVuQ3Jhc2goc2VsZikgOgorICAgICMgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTMzMDcKKyAgICAjICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBkYi5EQiwgTm9uZSwgNjU1MzUpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPCAoNCwgOCkgOgorICAgICAgICBkZWYgdGVzdDAyX0RCRW52X2RlYWxsb2Moc2VsZik6CisgICAgICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUzODg1CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBkYi5EQkVudiwgfmRiLkRCX1JQQ0NMSUVOVCkKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFZlcnNpb25UZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQmFzaWNCVHJlZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCYXNpY0hhc2hUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQmFzaWNCVHJlZVdpdGhUaHJlYWRGbGFnVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJhc2ljSGFzaFdpdGhUaHJlYWRGbGFnVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJhc2ljQlRyZWVXaXRoRW52VGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJhc2ljSGFzaFdpdGhFbnZUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVUcmFuc2FjdGlvblRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShIYXNoVHJhbnNhY3Rpb25UZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVSZWNub1Rlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCVHJlZVJlY25vV2l0aFRocmVhZEZsYWdUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVEVVBUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSGFzaERVUFRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCVHJlZURVUFdpdGhUaHJlYWRUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSGFzaERVUFdpdGhUaHJlYWRUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVNdWx0aURCVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEhhc2hNdWx0aURCVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCRW52UHJpdmF0ZU9iamVjdCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJQcml2YXRlT2JqZWN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShDcmFzaEFuZEJ1cm4pKQorCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZmYzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZmYzMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhcmUucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2I0NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXJlLnB5CkBAIC0wLDAgKzEsNDQ3IEBACisiIiIKK1Rlc3RDYXNlcyBmb3IgcHl0aG9uIERCIGR1cGxpY2F0ZSBhbmQgQnRyZWUga2V5IGNvbXBhcmlzb24gZnVuY3Rpb24uCisiIiIKKworaW1wb3J0IHN5cywgb3MsIHJlCitpbXBvcnQgdGVzdF9hbGwKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRic2hlbHZlLCB0ZXN0X3N1cHBvcnQsIFwKKyAgICAgICAgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworCisjIE5lZWRlZCBmb3IgcHl0aG9uIDMuICJjbXAiIHZhbmlzaGVkIGluIDMuMC4xCitkZWYgY21wKGEsIGIpIDoKKyAgICBpZiBhPT1iIDogcmV0dXJuIDAKKyAgICBpZiBhPGIgOiByZXR1cm4gLTEKKyAgICByZXR1cm4gMQorCitsZXhpY2FsX2NtcCA9IGNtcAorCitkZWYgbG93ZXJjYXNlX2NtcChsZWZ0LCByaWdodCkgOgorICAgIHJldHVybiBjbXAobGVmdC5sb3dlcigpLCByaWdodC5sb3dlcigpKQorCitkZWYgbWFrZV9yZXZlcnNlX2NvbXBhcmF0b3IoY21wKSA6CisgICAgZGVmIHJldmVyc2UobGVmdCwgcmlnaHQsIGRlbGVnYXRlPWNtcCkgOgorICAgICAgICByZXR1cm4gLSBkZWxlZ2F0ZShsZWZ0LCByaWdodCkKKyAgICByZXR1cm4gcmV2ZXJzZQorCitfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEgPSBbJycsICdDQ0NQJywgJ2EnLCAnYWFhJywgJ2InLCAnYycsICdjY2NjZScsICdjY2NjZiddCitfZXhwZWN0ZWRfbG93ZXJjYXNlX3Rlc3RfZGF0YSA9IFsnJywgJ2EnLCAnYWFhJywgJ2InLCAnYycsICdDQycsICdjY2NjZScsICdjY2NjZicsICdDQ0NQJ10KKworY2xhc3MgQ29tcGFyYXRvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKSA6CisgICAgZGVmIGNvbXBhcmF0b3JfdGVzdF9oZWxwZXIoc2VsZiwgY29tcGFyYXRvciwgZXhwZWN0ZWRfZGF0YSkgOgorICAgICAgICBkYXRhID0gZXhwZWN0ZWRfZGF0YVs6XQorCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICBkYXRhLnNvcnQoY21wPWNvbXBhcmF0b3IpCisgICAgICAgIGVsc2UgOiAgIyBJbnNlcnRpb24gU29ydC4gUGxlYXNlLCBpbXByb3ZlCisgICAgICAgICAgICBkYXRhMiA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiBkYXRhIDoKKyAgICAgICAgICAgICAgICBmb3IgaiwgayBpbiBlbnVtZXJhdGUoZGF0YTIpIDoKKyAgICAgICAgICAgICAgICAgICAgciA9IGNvbXBhcmF0b3IoaywgaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgciA9PSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEyLmluc2VydChqLCBpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICAgICAgZGF0YTIuYXBwZW5kKGkpCisgICAgICAgICAgICBkYXRhID0gZGF0YTIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGV4cGVjdGVkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmF0b3IgYCVzJyBpcyBub3QgcmlnaHQ6ICVzIHZzLiAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIChjb21wYXJhdG9yLCBleHBlY3RlZF9kYXRhLCBkYXRhKSkKKyAgICBkZWYgdGVzdF9sZXhpY2FsX2NvbXBhcmF0b3Ioc2VsZikgOgorICAgICAgICBzZWxmLmNvbXBhcmF0b3JfdGVzdF9oZWxwZXIobGV4aWNhbF9jbXAsIF9leHBlY3RlZF9sZXhpY2FsX3Rlc3RfZGF0YSkKKyAgICBkZWYgdGVzdF9yZXZlcnNlX2xleGljYWxfY29tcGFyYXRvcihzZWxmKSA6CisgICAgICAgIHJldiA9IF9leHBlY3RlZF9sZXhpY2FsX3Rlc3RfZGF0YVs6XQorICAgICAgICByZXYucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuY29tcGFyYXRvcl90ZXN0X2hlbHBlcihtYWtlX3JldmVyc2VfY29tcGFyYXRvcihsZXhpY2FsX2NtcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2KQorICAgIGRlZiB0ZXN0X2xvd2VyY2FzZV9jb21wYXJhdG9yKHNlbGYpIDoKKyAgICAgICAgc2VsZi5jb21wYXJhdG9yX3Rlc3RfaGVscGVyKGxvd2VyY2FzZV9jbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2V4cGVjdGVkX2xvd2VyY2FzZV90ZXN0X2RhdGEpCisKK2NsYXNzIEFic3RyYWN0QnRyZWVLZXlDb21wYXJlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpIDoKKyAgICBlbnYgPSBOb25lCisgICAgZGIgPSBOb25lCisKKyAgICBpZiAoc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KSkgb3IgKChzeXMudmVyc2lvbl9pbmZvID49ICgzLDApKSBhbmQKKyAgICAgICAgICAgIChzeXMudmVyc2lvbl9pbmZvIDwgKDMsIDIpKSkgOgorICAgICAgICBkZWYgYXNzZXJ0TGVzcyhzZWxmLCBhLCBiLCBtc2c9Tm9uZSkgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXNzZXJ0VHJ1ZShhPGIsIG1zZz1tc2cpCisKKyAgICBkZWYgc2V0VXAoc2VsZikgOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAnLmRiJworICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBlbnYgPSBkYi5EQkVudigpCisgICAgICAgIGVudi5vcGVuKHNlbGYuaG9tZURpciwKKyAgICAgICAgICAgICAgICAgIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wKKyAgICAgICAgICAgICAgICAgIHwgZGIuREJfSU5JVF9MT0NLIHwgZGIuREJfVEhSRUFEKQorICAgICAgICBzZWxmLmVudiA9IGVudgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpIDoKKyAgICAgICAgc2VsZi5jbG9zZURCKCkKKyAgICAgICAgaWYgc2VsZi5lbnYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmVudiA9IE5vbmUKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgYWRkRGF0YVRvREIoc2VsZiwgZGF0YSkgOgorICAgICAgICBpID0gMAorICAgICAgICBmb3IgaXRlbSBpbiBkYXRhOgorICAgICAgICAgICAgc2VsZi5kYi5wdXQoaXRlbSwgc3RyKGkpKQorICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICBkZWYgY3JlYXRlREIoc2VsZiwga2V5X2NvbXBhcmF0b3IpIDoKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLnNldHVwREIoa2V5X2NvbXBhcmF0b3IpCisgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLmZpbGVuYW1lLCAidGVzdCIsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUpCisKKyAgICBkZWYgc2V0dXBEQihzZWxmLCBrZXlfY29tcGFyYXRvcikgOgorICAgICAgICBzZWxmLmRiLnNldF9idF9jb21wYXJlKGtleV9jb21wYXJhdG9yKQorCisgICAgZGVmIGNsb3NlREIoc2VsZikgOgorICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmRiID0gTm9uZQorCisgICAgZGVmIHN0YXJ0VGVzdChzZWxmKSA6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBmaW5pc2hUZXN0KHNlbGYsIGV4cGVjdGVkID0gTm9uZSkgOgorICAgICAgICBpZiBleHBlY3RlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcmVzdWx0cyhleHBlY3RlZCkKKyAgICAgICAgc2VsZi5jbG9zZURCKCkKKworICAgIGRlZiBjaGVja19yZXN1bHRzKHNlbGYsIGV4cGVjdGVkKSA6CisgICAgICAgIGN1cnMgPSBzZWxmLmRiLmN1cnNvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICAgICAgcmVjID0gY3Vycy5maXJzdCgpCisgICAgICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICAgICAga2V5LCBpZ25vcmUgPSByZWMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MoaW5kZXgsIGxlbihleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gbWFueSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBjdXJzb3IiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRbaW5kZXhdLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdmFsdWUgYCVzJyBhdCAlZCBidXQgZ290IGAlcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChleHBlY3RlZFtpbmRleF0sIGluZGV4LCBrZXkpKQorICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgICAgICAgICAgcmVjID0gY3Vycy5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXgsIGxlbihleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgZW5vdWdoIHZhbHVlcyByZXR1cm5lZCBmcm9tIGN1cnNvciIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjdXJzLmNsb3NlKCkKKworY2xhc3MgQnRyZWVLZXlDb21wYXJlVGVzdENhc2UoQWJzdHJhY3RCdHJlZUtleUNvbXBhcmVUZXN0Q2FzZSkgOgorICAgIGRlZiBydW5Db21wYXJlVGVzdChzZWxmLCBjb21wYXJhdG9yLCBkYXRhKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5jcmVhdGVEQihjb21wYXJhdG9yKQorICAgICAgICBzZWxmLmFkZERhdGFUb0RCKGRhdGEpCisgICAgICAgIHNlbGYuZmluaXNoVGVzdChkYXRhKQorCisgICAgZGVmIHRlc3RfbGV4aWNhbF9vcmRlcmluZyhzZWxmKSA6CisgICAgICAgIHNlbGYucnVuQ29tcGFyZVRlc3QobGV4aWNhbF9jbXAsIF9leHBlY3RlZF9sZXhpY2FsX3Rlc3RfZGF0YSkKKworICAgIGRlZiB0ZXN0X3JldmVyc2VfbGV4aWNhbF9vcmRlcmluZyhzZWxmKSA6CisgICAgICAgIGV4cGVjdGVkX3Jldl9kYXRhID0gX2V4cGVjdGVkX2xleGljYWxfdGVzdF9kYXRhWzpdCisgICAgICAgIGV4cGVjdGVkX3Jldl9kYXRhLnJldmVyc2UoKQorICAgICAgICBzZWxmLnJ1bkNvbXBhcmVUZXN0KG1ha2VfcmV2ZXJzZV9jb21wYXJhdG9yKGxleGljYWxfY21wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmV2X2RhdGEpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2Z1bmN0aW9uX3VzZWxlc3Moc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIGRlZiBzb2NpYWxpc3RfY29tcGFyYXRvcihsLCByKSA6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzZWxmLmNyZWF0ZURCKHNvY2lhbGlzdF9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmFkZERhdGFUb0RCKFsnYicsICdhJywgJ2QnXSkKKyAgICAgICAgIyBhbGwgdGhpbmdzIGJlaW5nIGVxdWFsIHRoZSBmaXJzdCBrZXkgd2lsbCBiZSB0aGUgb25seSBrZXkKKyAgICAgICAgIyBpbiB0aGUgZGF0YWJhc2UuLi4gICh3aXRoIHRoZSBsYXN0IGtleSdzIHZhbHVlIGZ3aXcpCisgICAgICAgIHNlbGYuZmluaXNoVGVzdChbJ2InXSkKKworCitjbGFzcyBCdHJlZUV4Y2VwdGlvbnNUZXN0Q2FzZShBYnN0cmFjdEJ0cmVlS2V5Q29tcGFyZVRlc3RDYXNlKSA6CisgICAgZGVmIHRlc3RfcmFpc2VzX25vbl9jYWxsYWJsZShzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNyZWF0ZURCLCBOb25lKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHRlc3Rfc2V0X2J0X2NvbXBhcmVfd2l0aF9mdW5jdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5jcmVhdGVEQihsZXhpY2FsX2NtcCkKKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKKworICAgIGRlZiBjaGVja19yZXN1bHRzKHNlbGYsIHJlc3VsdHMpIDoKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9pbmNvcnJlY3Qoc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIGRlZiBiYWRfY29tcGFyYXRvcihsLCByKSA6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAjIHZlcmlmeSB0aGF0IHNldF9idF9jb21wYXJlIGNoZWNrcyB0aGF0IGNvbXBhcmF0b3IoJycsICcnKSA9PSAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5jcmVhdGVEQiwgYmFkX2NvbXBhcmF0b3IpCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdmVyaWZ5U3RkZXJyKHNlbGYsIG1ldGhvZCwgc3VjY2Vzc1JlKSA6CisgICAgICAgICIiIgorICAgICAgICBDYWxsIG1ldGhvZCgpIHdoaWxlIGNhcHR1cmluZyBzeXMuc3RkZXJyIG91dHB1dCBpbnRlcm5hbGx5IGFuZAorICAgICAgICBjYWxsIHNlbGYuZmFpbCgpIGlmIHN1Y2Nlc3NSZS5zZWFyY2goKSBkb2VzIG5vdCBtYXRjaCB0aGUgc3RkZXJyCisgICAgICAgIG91dHB1dC4gIFRoaXMgaXMgdXNlZCB0byB0ZXN0IGZvciB1bmNhdGNoYWJsZSBleGNlcHRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgc3RkRXJyID0gc3lzLnN0ZGVycgorICAgICAgICBzeXMuc3RkZXJyID0gU3RyaW5nSU8oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtZXRob2QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGVtcCA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdGRFcnIKKyAgICAgICAgICAgIGVycm9yT3V0ID0gdGVtcC5nZXR2YWx1ZSgpCisgICAgICAgICAgICBpZiBub3Qgc3VjY2Vzc1JlLnNlYXJjaChlcnJvck91dCkgOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCBzdGRlcnIgb3V0cHV0OlxuIitlcnJvck91dCkKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKSA6ICAjIFhYWDogSG93IHRvIGRvIHRoaXMgaW4gUHkzayA/Pz8KKyAgICAgICAgICAgIHN5cy5leGNfdHJhY2ViYWNrID0gc3lzLmxhc3RfdHJhY2ViYWNrID0gTm9uZQorCisgICAgZGVmIF90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgaWYgbCA9PSByOgorICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2V0X2J0X2NvbXBhcmUgdGVzdAorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJpJ20gYSBuYXVnaHR5IGNvbXBhcmlzb24gZnVuY3Rpb24iCisgICAgICAgIHNlbGYuY3JlYXRlREIoYmFkX2NvbXBhcmF0b3IpCisgICAgICAgICNwcmludCAiXG4qKiogdGVzdCBzaG91bGQgcHJpbnQgMiB1bmNhdGNoYWJsZSB0cmFjZWJhY2tzICoqKiIKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihbJ2EnLCAnYicsICdjJ10pICAjIHRoaXMgc2hvdWxkIHJhaXNlLCBidXQuLi4KKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uKHNlbGYpIDoKKyAgICAgICAgc2VsZi52ZXJpZnlTdGRlcnIoCisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICByZS5jb21waWxlKCcoXlJ1bnRpbWVFcnJvcjouKiBuYXVnaHR5LiopezJ9JywgcmUuTXxyZS5TKQorICAgICAgICApCisKKyAgICBkZWYgX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgaWYgbCA9PSByOgorICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2V0X2J0X2NvbXBhcmUgdGVzdAorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICByZXR1cm4gbAorICAgICAgICBzZWxmLmNyZWF0ZURCKGJhZF9jb21wYXJhdG9yKQorICAgICAgICAjcHJpbnQgIlxuKioqIHRlc3Qgc2hvdWxkIHByaW50IDIgZXJyb3JzIGFib3V0IHJldHVybmluZyBhbiBpbnQgKioqIgorICAgICAgICBzZWxmLmFkZERhdGFUb0RCKFsnYScsICdiJywgJ2MnXSkgICMgdGhpcyBzaG91bGQgcmFpc2UsIGJ1dC4uLgorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9iYWRfcmV0dXJuKHNlbGYpIDoKKyAgICAgICAgc2VsZi52ZXJpZnlTdGRlcnIoCisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2JhZF9yZXR1cm4sCisgICAgICAgICAgICAgICAgcmUuY29tcGlsZSgnKF5UeXBlRXJyb3I6LiogcmV0dXJuIGFuIGludC4qKXsyfScsIHJlLk18cmUuUykKKyAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdF9jYW5ub3RfYXNzaWduX3R3aWNlKHNlbGYpIDoKKworICAgICAgICBkZWYgbXlfY29tcGFyZShhLCBiKSA6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5jcmVhdGVEQihteV9jb21wYXJlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNlbGYuZGIuc2V0X2J0X2NvbXBhcmUsIG15X2NvbXBhcmUpCisKK2NsYXNzIEFic3RyYWN0RHVwbGljYXRlQ29tcGFyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKSA6CisgICAgZW52ID0gTm9uZQorICAgIGRiID0gTm9uZQorCisgICAgaWYgKHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNykpIG9yICgoc3lzLnZlcnNpb25faW5mbyA+PSAoMywwKSkgYW5kCisgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKKyAgICAgICAgZGVmIGFzc2VydExlc3Moc2VsZiwgYSwgYiwgbXNnPU5vbmUpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydFRydWUoYTxiLCBtc2c9bXNnKQorCisgICAgZGVmIHNldFVwKHNlbGYpIDoKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fICsgJy5kYicKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgZW52ID0gZGIuREJFbnYoKQorICAgICAgICBlbnYub3BlbihzZWxmLmhvbWVEaXIsCisgICAgICAgICAgICAgICAgICBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MCisgICAgICAgICAgICAgICAgICB8IGRiLkRCX0lOSVRfTE9DSyB8IGRiLkRCX1RIUkVBRCkKKyAgICAgICAgc2VsZi5lbnYgPSBlbnYKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKSA6CisgICAgICAgIHNlbGYuY2xvc2VEQigpCisgICAgICAgIGlmIHNlbGYuZW52IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5lbnYgPSBOb25lCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIGFkZERhdGFUb0RCKHNlbGYsIGRhdGEpIDoKKyAgICAgICAgZm9yIGl0ZW0gaW4gZGF0YToKKyAgICAgICAgICAgIHNlbGYuZGIucHV0KCJrZXkiLCBpdGVtKQorCisgICAgZGVmIGNyZWF0ZURCKHNlbGYsIGR1cF9jb21wYXJhdG9yKSA6CisgICAgICAgIHNlbGYuZGIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5zZXR1cERCKGR1cF9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5maWxlbmFtZSwgInRlc3QiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorCisgICAgZGVmIHNldHVwREIoc2VsZiwgZHVwX2NvbXBhcmF0b3IpIDoKKyAgICAgICAgc2VsZi5kYi5zZXRfZmxhZ3MoZGIuREJfRFVQU09SVCkKKyAgICAgICAgc2VsZi5kYi5zZXRfZHVwX2NvbXBhcmUoZHVwX2NvbXBhcmF0b3IpCisKKyAgICBkZWYgY2xvc2VEQihzZWxmKSA6CisgICAgICAgIGlmIHNlbGYuZGIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuZGIgPSBOb25lCisKKyAgICBkZWYgc3RhcnRUZXN0KHNlbGYpIDoKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmlzaFRlc3Qoc2VsZiwgZXhwZWN0ZWQgPSBOb25lKSA6CisgICAgICAgIGlmIGV4cGVjdGVkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZXN1bHRzKGV4cGVjdGVkKQorICAgICAgICBzZWxmLmNsb3NlREIoKQorCisgICAgZGVmIGNoZWNrX3Jlc3VsdHMoc2VsZiwgZXhwZWN0ZWQpIDoKKyAgICAgICAgY3VycyA9IHNlbGYuZGIuY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICByZWMgPSBjdXJzLmZpcnN0KCkKKyAgICAgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgICAgICBpZ25vcmUsIGRhdGEgPSByZWMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MoaW5kZXgsIGxlbihleHBlY3RlZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG8gbWFueSB2YWx1ZXMgcmV0dXJuZWQgZnJvbSBjdXJzb3IiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRbaW5kZXhdLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHZhbHVlIGAlcycgYXQgJWQgYnV0IGdvdCBgJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZXhwZWN0ZWRbaW5kZXhdLCBpbmRleCwgZGF0YSkpCisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKKyAgICAgICAgICAgICAgICByZWMgPSBjdXJzLm5leHQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleCwgbGVuKGV4cGVjdGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBlbm91Z2ggdmFsdWVzIHJldHVybmVkIGZyb20gY3Vyc29yIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGN1cnMuY2xvc2UoKQorCitjbGFzcyBEdXBsaWNhdGVDb21wYXJlVGVzdENhc2UoQWJzdHJhY3REdXBsaWNhdGVDb21wYXJlVGVzdENhc2UpIDoKKyAgICBkZWYgcnVuQ29tcGFyZVRlc3Qoc2VsZiwgY29tcGFyYXRvciwgZGF0YSkgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIHNlbGYuY3JlYXRlREIoY29tcGFyYXRvcikKKyAgICAgICAgc2VsZi5hZGREYXRhVG9EQihkYXRhKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoZGF0YSkKKworICAgIGRlZiB0ZXN0X2xleGljYWxfb3JkZXJpbmcoc2VsZikgOgorICAgICAgICBzZWxmLnJ1bkNvbXBhcmVUZXN0KGxleGljYWxfY21wLCBfZXhwZWN0ZWRfbGV4aWNhbF90ZXN0X2RhdGEpCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlX2xleGljYWxfb3JkZXJpbmcoc2VsZikgOgorICAgICAgICBleHBlY3RlZF9yZXZfZGF0YSA9IF9leHBlY3RlZF9sZXhpY2FsX3Rlc3RfZGF0YVs6XQorICAgICAgICBleHBlY3RlZF9yZXZfZGF0YS5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5ydW5Db21wYXJlVGVzdChtYWtlX3JldmVyc2VfY29tcGFyYXRvcihsZXhpY2FsX2NtcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Jldl9kYXRhKQorCitjbGFzcyBEdXBsaWNhdGVFeGNlcHRpb25zVGVzdENhc2UoQWJzdHJhY3REdXBsaWNhdGVDb21wYXJlVGVzdENhc2UpIDoKKyAgICBkZWYgdGVzdF9yYWlzZXNfbm9uX2NhbGxhYmxlKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY3JlYXRlREIsICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY3JlYXRlREIsIE5vbmUpCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdGVzdF9zZXRfZHVwX2NvbXBhcmVfd2l0aF9mdW5jdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgc2VsZi5jcmVhdGVEQihsZXhpY2FsX2NtcCkKKyAgICAgICAgc2VsZi5maW5pc2hUZXN0KCkKKworICAgIGRlZiBjaGVja19yZXN1bHRzKHNlbGYsIHJlc3VsdHMpIDoKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl9pbmNvcnJlY3Qoc2VsZikgOgorICAgICAgICBzZWxmLnN0YXJ0VGVzdCgpCisgICAgICAgIGRlZiBiYWRfY29tcGFyYXRvcihsLCByKSA6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAjIHZlcmlmeSB0aGF0IHNldF9kdXBfY29tcGFyZSBjaGVja3MgdGhhdCBjb21wYXJhdG9yKCcnLCAnJykgPT0gMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY3JlYXRlREIsIGJhZF9jb21wYXJhdG9yKQorICAgICAgICBzZWxmLmZpbmlzaFRlc3QoKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9mdW5jdGlvbl91c2VsZXNzKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgc29jaWFsaXN0X2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgc2VsZi5jcmVhdGVEQihzb2NpYWxpc3RfY29tcGFyYXRvcikKKyAgICAgICAgIyBEVVBTT1JUIGRvZXMgbm90IGFsbG93ICJkdXBsaWNhdGUgZHVwbGljYXRlcyIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJLZXlFeGlzdEVycm9yLCBzZWxmLmFkZERhdGFUb0RCLCBbJ2InLCAnYScsICdkJ10pCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdmVyaWZ5U3RkZXJyKHNlbGYsIG1ldGhvZCwgc3VjY2Vzc1JlKSA6CisgICAgICAgICIiIgorICAgICAgICBDYWxsIG1ldGhvZCgpIHdoaWxlIGNhcHR1cmluZyBzeXMuc3RkZXJyIG91dHB1dCBpbnRlcm5hbGx5IGFuZAorICAgICAgICBjYWxsIHNlbGYuZmFpbCgpIGlmIHN1Y2Nlc3NSZS5zZWFyY2goKSBkb2VzIG5vdCBtYXRjaCB0aGUgc3RkZXJyCisgICAgICAgIG91dHB1dC4gIFRoaXMgaXMgdXNlZCB0byB0ZXN0IGZvciB1bmNhdGNoYWJsZSBleGNlcHRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgc3RkRXJyID0gc3lzLnN0ZGVycgorICAgICAgICBzeXMuc3RkZXJyID0gU3RyaW5nSU8oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtZXRob2QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGVtcCA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzdGRFcnIKKyAgICAgICAgICAgIGVycm9yT3V0ID0gdGVtcC5nZXR2YWx1ZSgpCisgICAgICAgICAgICBpZiBub3Qgc3VjY2Vzc1JlLnNlYXJjaChlcnJvck91dCkgOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCBzdGRlcnIgb3V0cHV0OlxuIitlcnJvck91dCkKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKSA6ICAjIFhYWDogSG93IHRvIGRvIHRoaXMgaW4gUHkzayA/Pz8KKyAgICAgICAgICAgIHN5cy5leGNfdHJhY2ViYWNrID0gc3lzLmxhc3RfdHJhY2ViYWNrID0gTm9uZQorCisgICAgZGVmIF90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fZXhjZXB0aW9uKHNlbGYpIDoKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBkZWYgYmFkX2NvbXBhcmF0b3IobCwgcikgOgorICAgICAgICAgICAgaWYgbCA9PSByOgorICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgc2V0X2R1cF9jb21wYXJlIHRlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiaSdtIGEgbmF1Z2h0eSBjb21wYXJpc29uIGZ1bmN0aW9uIgorICAgICAgICBzZWxmLmNyZWF0ZURCKGJhZF9jb21wYXJhdG9yKQorICAgICAgICAjcHJpbnQgIlxuKioqIHRlc3Qgc2hvdWxkIHByaW50IDIgdW5jYXRjaGFibGUgdHJhY2ViYWNrcyAqKioiCisgICAgICAgIHNlbGYuYWRkRGF0YVRvREIoWydhJywgJ2InLCAnYyddKSAgIyB0aGlzIHNob3VsZCByYWlzZSwgYnV0Li4uCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2V4Y2VwdGlvbihzZWxmKSA6CisgICAgICAgIHNlbGYudmVyaWZ5U3RkZXJyKAorICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tcGFyZV9mdW5jdGlvbl9leGNlcHRpb24sCisgICAgICAgICAgICAgICAgcmUuY29tcGlsZSgnKF5SdW50aW1lRXJyb3I6LiogbmF1Z2h0eS4qKXsyfScsIHJlLk18cmUuUykKKyAgICAgICAgKQorCisgICAgZGVmIF90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fYmFkX3JldHVybihzZWxmKSA6CisgICAgICAgIHNlbGYuc3RhcnRUZXN0KCkKKyAgICAgICAgZGVmIGJhZF9jb21wYXJhdG9yKGwsIHIpIDoKKyAgICAgICAgICAgIGlmIGwgPT0gcjoKKyAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIHNldF9kdXBfY29tcGFyZSB0ZXN0CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIHJldHVybiBsCisgICAgICAgIHNlbGYuY3JlYXRlREIoYmFkX2NvbXBhcmF0b3IpCisgICAgICAgICNwcmludCAiXG4qKiogdGVzdCBzaG91bGQgcHJpbnQgMiBlcnJvcnMgYWJvdXQgcmV0dXJuaW5nIGFuIGludCAqKioiCisgICAgICAgIHNlbGYuYWRkRGF0YVRvREIoWydhJywgJ2InLCAnYyddKSAgIyB0aGlzIHNob3VsZCByYWlzZSwgYnV0Li4uCisgICAgICAgIHNlbGYuZmluaXNoVGVzdCgpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX2Z1bmN0aW9uX2JhZF9yZXR1cm4oc2VsZikgOgorICAgICAgICBzZWxmLnZlcmlmeVN0ZGVycigKKyAgICAgICAgICAgICAgICBzZWxmLl90ZXN0X2NvbXBhcmVfZnVuY3Rpb25fYmFkX3JldHVybiwKKyAgICAgICAgICAgICAgICByZS5jb21waWxlKCcoXlR5cGVFcnJvcjouKiByZXR1cm4gYW4gaW50LiopezJ9JywgcmUuTXxyZS5TKQorICAgICAgICApCisKKworICAgIGRlZiB0ZXN0X2Nhbm5vdF9hc3NpZ25fdHdpY2Uoc2VsZikgOgorCisgICAgICAgIGRlZiBteV9jb21wYXJlKGEsIGIpIDoKKyAgICAgICAgICAgIHJldHVybiAwCisKKyAgICAgICAgc2VsZi5zdGFydFRlc3QoKQorICAgICAgICBzZWxmLmNyZWF0ZURCKG15X2NvbXBhcmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi5kYi5zZXRfZHVwX2NvbXBhcmUsIG15X2NvbXBhcmUpCisKK2RlZiB0ZXN0X3N1aXRlKCkgOgorICAgIHJlcyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICByZXMuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQ29tcGFyYXRvclRlc3RzKSkKKyAgICByZXMuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQnRyZWVFeGNlcHRpb25zVGVzdENhc2UpKQorICAgIHJlcy5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdHJlZUtleUNvbXBhcmVUZXN0Q2FzZSkpCisgICAgcmVzLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKER1cGxpY2F0ZUV4Y2VwdGlvbnNUZXN0Q2FzZSkpCisgICAgcmVzLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKER1cGxpY2F0ZUNvbXBhcmVUZXN0Q2FzZSkpCisgICAgcmV0dXJuIHJlcworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3QgPSAnc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXJlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzczZWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXJlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzczZWJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGFyZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGF0LnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY29tcGF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NzlmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXQucHkKQEAgLTAsMCArMSwxODQgQEAKKyIiIgorVGVzdCBjYXNlcyBhZGFwdGVkIGZyb20gdGhlIHRlc3RfYnNkZGIucHkgbW9kdWxlIGluIFB5dGhvbidzCityZWdyZXNzaW9uIHRlc3Qgc3VpdGUuCisiIiIKKworaW1wb3J0IG9zLCBzdHJpbmcKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgaGFzaG9wZW4sIGJ0b3Blbiwgcm5vcGVuLCB2ZXJib3NlLCBcCisgICAgICAgIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisKK2NsYXNzIENvbXBhdGliaWxpdHlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZ2V0X25ld19kYXRhYmFzZV9wYXRoKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCisgICAgZGVmIHRlc3QwMV9idG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuZG9fYnRoYXNoX3Rlc3QoYnRvcGVuLCAnYnRvcGVuJykKKworICAgIGRlZiB0ZXN0MDJfaGFzaG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuZG9fYnRoYXNoX3Rlc3QoaGFzaG9wZW4sICdoYXNob3BlbicpCisKKyAgICBkZWYgdGVzdDAzX3Jub3BlbihzZWxmKToKKyAgICAgICAgZGF0YSA9ICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZy4iLnNwbGl0KCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJcblRlc3Rpbmc6IHJub3BlbiIKKworICAgICAgICBmID0gcm5vcGVuKHNlbGYuZmlsZW5hbWUsICdjJykKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UobGVuKGRhdGEpKToKKyAgICAgICAgICAgIGZbeCsxXSA9IGRhdGFbeF0KKworICAgICAgICBnZXRUZXN0ID0gKGZbMV0sIGZbMl0sIGZbM10pCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnJXMgJXMgJXMnICUgZ2V0VGVzdAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0VGVzdFsxXSwgJ3F1aWNrJywgJ2RhdGEgbWlzbWF0Y2ghJykKKworICAgICAgICBydiA9IGYuc2V0X2xvY2F0aW9uKDMpCisgICAgICAgIGlmIHJ2ICE9ICgzLCAnYnJvd24nKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgncmVjbm8gZGF0YWJhc2Ugc2V0X2xvY2F0aW9uIGZhaWxlZDogJytyZXByKHJ2KSkKKworICAgICAgICBmWzI1XSA9ICd0d2VudHktZml2ZScKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGRlbCBmCisKKyAgICAgICAgZiA9IHJub3BlbihzZWxmLmZpbGVuYW1lLCAndycpCisgICAgICAgIGZbMjBdID0gJ3R3ZW50eScKKworICAgICAgICBkZWYgbm9SZWMoZik6CisgICAgICAgICAgICByZWMgPSBmWzE1XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbm9SZWMsIGYpCisKKyAgICAgICAgZGVmIGJhZEtleShmKToKKyAgICAgICAgICAgIHJlYyA9IGZbJ2Egc3RyaW5nJ10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYWRLZXksIGYpCisKKyAgICAgICAgZGVsIGZbM10KKworICAgICAgICByZWMgPSBmLmZpcnN0KCkKKyAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWMgPSBmLm5leHQoKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgZi5jbG9zZSgpCisKKworICAgIGRlZiB0ZXN0MDRfbl9mbGFnKHNlbGYpOgorICAgICAgICBmID0gaGFzaG9wZW4oc2VsZi5maWxlbmFtZSwgJ24nKQorICAgICAgICBmLmNsb3NlKCkKKworCisgICAgZGVmIGRvX2J0aGFzaF90ZXN0KHNlbGYsIGZhY3RvcnksIHdoYXQpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuVGVzdGluZzogJywgd2hhdAorCisgICAgICAgIGYgPSBmYWN0b3J5KHNlbGYuZmlsZW5hbWUsICdjJykKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdjcmVhdGlvbi4uLicKKworICAgICAgICAjIHRydXRoIHRlc3QKKyAgICAgICAgaWYgZjoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJ0cnV0aCB0ZXN0OiB0cnVlIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRydXRoIHRlc3Q6IGZhbHNlIgorCisgICAgICAgIGZbJzAnXSA9ICcnCisgICAgICAgIGZbJ2EnXSA9ICdHdWlkbycKKyAgICAgICAgZlsnYiddID0gJ3ZhbicKKyAgICAgICAgZlsnYyddID0gJ1Jvc3N1bScKKyAgICAgICAgZlsnZCddID0gJ2ludmVudGVkJworICAgICAgICAjICdlJyBpbnRlbnRpb25hbGx5IGxlZnQgb3V0CisgICAgICAgIGZbJ2YnXSA9ICdQeXRob24nCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnJXMgJXMgJXMnICUgKGZbJ2EnXSwgZlsnYiddLCBmWydjJ10pCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdrZXkgb3JkZXJpbmcuLi4nCisgICAgICAgIHN0YXJ0ID0gZi5zZXRfbG9jYXRpb24oZi5maXJzdCgpWzBdKQorICAgICAgICBpZiBzdGFydCAhPSAoJzAnLCAnJyk6CisgICAgICAgICAgICBzZWxmLmZhaWwoImluY29ycmVjdCBmaXJzdCgpIHJlc3VsdDogIityZXByKHN0YXJ0KSkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWMgPSBmLm5leHQoKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjLCBmLmxhc3QoKSwgJ0Vycm9yLCBsYXN0IDw+IGxhc3QhJykKKyAgICAgICAgICAgICAgICBmLnByZXZpb3VzKCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5oYXNfa2V5KCdmJyksICdFcnJvciwgbWlzc2luZyBrZXkhJykKKworICAgICAgICAjIHRlc3QgdGhhdCBzZXRfbG9jYXRpb24oKSByZXR1cm5zIHRoZSBuZXh0IG5lYXJlc3Qga2V5LCB2YWx1ZQorICAgICAgICAjIG9uIGJ0cmVlIGRhdGFiYXNlcyBhbmQgcmFpc2VzIEtleUVycm9yIG9uIG90aGVycy4KKyAgICAgICAgaWYgZmFjdG9yeSA9PSBidG9wZW46CisgICAgICAgICAgICBlID0gZi5zZXRfbG9jYXRpb24oJ2UnKQorICAgICAgICAgICAgaWYgZSAhPSAoJ2YnLCAnUHl0aG9uJyk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCd3cm9uZyBrZXksdmFsdWUgcmV0dXJuZWQ6ICcrcmVwcihlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBlID0gZi5zZXRfbG9jYXRpb24oJ2UnKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzZXRfbG9jYXRpb24gb24gbm9uLWV4aXN0ZW50IGtleSBkaWQgbm90IHJhaXNlIEtleUVycm9yIikKKworICAgICAgICBmLnN5bmMoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgIyB0cnV0aCB0ZXN0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGY6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgInRydXRoIHRlc3Q6IHRydWUiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJ0cnV0aCB0ZXN0OiBmYWxzZSIKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4Y2VwdGlvbiBleHBlY3RlZCIpCisKKyAgICAgICAgZGVsIGYKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ21vZGlmaWNhdGlvbi4uLicKKyAgICAgICAgZiA9IGZhY3Rvcnkoc2VsZi5maWxlbmFtZSwgJ3cnKQorICAgICAgICBmWydkJ10gPSAnZGlzY292ZXJlZCcKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ2FjY2Vzcy4uLicKKyAgICAgICAgZm9yIGtleSBpbiBmLmtleXMoKToKKyAgICAgICAgICAgIHdvcmQgPSBmW2tleV0KKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgd29yZAorCisgICAgICAgIGRlZiBub1JlYyhmKToKKyAgICAgICAgICAgIHJlYyA9IGZbJ25vIHN1Y2gga2V5J10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIG5vUmVjLCBmKQorCisgICAgICAgIGRlZiBiYWRLZXkoZik6CisgICAgICAgICAgICByZWMgPSBmWzE1XQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJhZEtleSwgZikKKworICAgICAgICBmLmNsb3NlKCkKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb21wYXRpYmlsaXR5VGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhdC5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkY2VkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2NvbXBhdC5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkY2VkYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9jb21wYXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmQzZGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY3Vyc29yX3BnZXRfYnVnLnB5CkBAIC0wLDAgKzEsNTQgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zLCBnbG9iCisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgXAorICAgICAgICBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgcGdldF9idWdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgY3Vyc29yLnBnZXQgd29ya3MgcHJvcGVybHkiIiIKKyAgICBkYl9uYW1lID0gJ3Rlc3QtY3Vyc29yX3BnZXQuZGInCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCkKKyAgICAgICAgc2VsZi5wcmltYXJ5X2RiID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYucHJpbWFyeV9kYi5vcGVuKHNlbGYuZGJfbmFtZSwgJ3ByaW1hcnknLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLnNlY29uZGFyeV9kYiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLnNlY29uZGFyeV9kYi5zZXRfZmxhZ3MoZGIuREJfRFVQKQorICAgICAgICBzZWxmLnNlY29uZGFyeV9kYi5vcGVuKHNlbGYuZGJfbmFtZSwgJ3NlY29uZGFyeScsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYucHJpbWFyeV9kYi5hc3NvY2lhdGUoc2VsZi5zZWNvbmRhcnlfZGIsIGxhbWJkYSBrZXksIGRhdGE6IGRhdGEpCisgICAgICAgIHNlbGYucHJpbWFyeV9kYi5wdXQoJ3NhbGFkJywgJ2VnZ3MnKQorICAgICAgICBzZWxmLnByaW1hcnlfZGIucHV0KCdzcGFtJywgJ2hhbScpCisgICAgICAgIHNlbGYucHJpbWFyeV9kYi5wdXQoJ29tZWxldCcsICdlZ2dzJykKKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnNlY29uZGFyeV9kYi5jbG9zZSgpCisgICAgICAgIHNlbGYucHJpbWFyeV9kYi5jbG9zZSgpCisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYuc2Vjb25kYXJ5X2RiCisgICAgICAgIGRlbCBzZWxmLnByaW1hcnlfZGIKKyAgICAgICAgZGVsIHNlbGYuZW52CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIHRlc3RfcGdldChzZWxmKToKKyAgICAgICAgY3Vyc29yID0gc2VsZi5zZWNvbmRhcnlfZGIuY3Vyc29yKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgnZWdncycsICdzYWxhZCcsICdlZ2dzJyksIGN1cnNvci5wZ2V0KGtleT0nZWdncycsIGZsYWdzPWRiLkRCX1NFVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCdlZ2dzJywgJ29tZWxldCcsICdlZ2dzJyksIGN1cnNvci5wZ2V0KGRiLkRCX05FWFRfRFVQKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBjdXJzb3IucGdldChkYi5EQl9ORVhUX0RVUCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ2hhbScsICdzcGFtJywgJ2hhbScpLCBjdXJzb3IucGdldCgnaGFtJywgJ3NwYW0nLCBmbGFncz1kYi5EQl9TRVQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGN1cnNvci5wZ2V0KGRiLkRCX05FWFRfRFVQKSkKKworICAgICAgICBjdXJzb3IuY2xvc2UoKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShwZ2V0X2J1Z1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY3Vyc29yX3BnZXRfYnVnLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MWYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfY3Vyc29yX3BnZXRfYnVnLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I1MWYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2N1cnNvcl9wZ2V0X2J1Zy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGIucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmMxMDlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGIucHkKQEAgLTAsMCArMSwxNjMgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zLCBnbG9iCisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgXAorICAgICAgICBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgREIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXRoID0gZ2V0X25ld19kYXRhYmFzZV9wYXRoKCkKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLmRiCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5wYXRoKQorCitjbGFzcyBEQl9nZW5lcmFsKERCKSA6CisgICAgZGVmIHRlc3RfZ2V0X29wZW5fZmxhZ3Moc2VsZikgOgorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5wYXRoLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIuREJfQ1JFQVRFLCBzZWxmLmRiLmdldF9vcGVuX2ZsYWdzKCkpCisKKyAgICBkZWYgdGVzdF9nZXRfb3Blbl9mbGFnczIoc2VsZikgOgorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5wYXRoLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfAorICAgICAgICAgICAgICAgIGRiLkRCX1RIUkVBRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIHNlbGYuZGIuZ2V0X29wZW5fZmxhZ3MoKSkKKworICAgIGRlZiB0ZXN0X2dldF9kYm5hbWVfZmlsZW5hbWUoc2VsZikgOgorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5wYXRoLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNlbGYucGF0aCwgTm9uZSksIHNlbGYuZGIuZ2V0X2RibmFtZSgpKQorCisgICAgZGVmIHRlc3RfZ2V0X2RibmFtZV9maWxlbmFtZV9kYXRhYmFzZShzZWxmKSA6CisgICAgICAgIG5hbWUgPSAiamNlYS1yYW5kb20tbmFtZSIKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYucGF0aCwgZGJuYW1lPW5hbWUsIGRidHlwZT1kYi5EQl9IQVNILAorICAgICAgICAgICAgICAgIGZsYWdzID0gZGIuREJfQ1JFQVRFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzZWxmLnBhdGgsIG5hbWUpLCBzZWxmLmRiLmdldF9kYm5hbWUoKSkKKworICAgICAgICBkZWYgdGVzdF9idF9taW5rZXkoc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWzE3LCAxMDgsIDEwMzBdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmRiLnNldF9idF9taW5rZXkoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X2J0X21pbmtleSgpKQorCisgICAgICAgIGRlZiB0ZXN0X2xvcmRlcihzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmRiLnNldF9sb3JkZXIoMTIzNCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNCwgc2VsZi5kYi5nZXRfbG9yZGVyKCkpCisgICAgICAgICAgICBzZWxmLmRiLnNldF9sb3JkZXIoNDMyMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDMyMSwgc2VsZi5kYi5nZXRfbG9yZGVyKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgc2VsZi5kYi5zZXRfbG9yZGVyLCA5MTgyKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA2KSA6CisgICAgICAgIGRlZiB0ZXN0X3ByaW9yaXR5KHNlbGYpIDoKKyAgICAgICAgICAgIGZsYWdzID0gW2RiLkRCX1BSSU9SSVRZX1ZFUllfTE9XLCBkYi5EQl9QUklPUklUWV9MT1csCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX1BSSU9SSVRZX0RFRkFVTFQsIGRiLkRCX1BSSU9SSVRZX0hJR0gsCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX1BSSU9SSVRZX1ZFUllfSElHSF0KKyAgICAgICAgICAgIGZvciBmbGFnIGluIGZsYWdzIDoKKyAgICAgICAgICAgICAgICBzZWxmLmRiLnNldF9wcmlvcml0eShmbGFnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZywgc2VsZi5kYi5nZXRfcHJpb3JpdHkoKSkKKworICAgIGRlZiB0ZXN0X2dldF90cmFuc2FjdGlvbmFsKHNlbGYpIDoKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmRiLmdldF90cmFuc2FjdGlvbmFsKCkpCisgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLnBhdGgsIGRidHlwZT1kYi5EQl9IQVNILCBmbGFncyA9IGRiLkRCX0NSRUFURSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmRiLmdldF90cmFuc2FjdGlvbmFsKCkpCisKK2NsYXNzIERCX2hhc2goREIpIDoKKyAgICBkZWYgdGVzdF9oX2ZmYWN0b3Ioc2VsZikgOgorICAgICAgICBmb3IgZmZhY3RvciBpbiBbNCwgMTYsIDI1Nl0gOgorICAgICAgICAgICAgc2VsZi5kYi5zZXRfaF9mZmFjdG9yKGZmYWN0b3IpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZmYWN0b3IsIHNlbGYuZGIuZ2V0X2hfZmZhY3RvcigpKQorCisgICAgZGVmIHRlc3RfaF9uZWxlbShzZWxmKSA6CisgICAgICAgIGZvciBuZWxlbSBpbiBbMSwgMiwgNF0gOgorICAgICAgICAgICAgbmVsZW0gPSBuZWxlbSoxMDI0KjEwMjQgICMgTWlsbGlvbnMKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X2hfbmVsZW0obmVsZW0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5lbGVtLCBzZWxmLmRiLmdldF9oX25lbGVtKCkpCisKKyAgICBkZWYgdGVzdF9wYWdlc2l6ZShzZWxmKSA6CisgICAgICAgIGZvciBpIGluIHhyYW5nZSg5LCAxNykgOiAgIyBGcm9tIDUxMiB0byA2NTUzNgorICAgICAgICAgICAgaSA9IDE8PGkKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3BhZ2VzaXplKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3BhZ2VzaXplKCkpCisKKyAgICAgICAgIyBUaGUgdmFsaWQgdmFsdWVzIGdvZXMgZnJvbSA1MTIgdG8gNjU1MzYKKyAgICAgICAgIyBUZXN0IDEzMTA3MiBieXRlcy4uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgc2VsZi5kYi5zZXRfcGFnZXNpemUsIDE8PDE3KQorICAgICAgICAjIFRlc3QgMjU2IGJ5dGVzLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBzZWxmLmRiLnNldF9wYWdlc2l6ZSwgMTw8OCkKKworY2xhc3MgREJfdHhuKERCKSA6CisgICAgZGVmIHNldFVwKHNlbGYpIDoKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MIHwKKyAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0xPRyB8IGRiLkRCX0lOSVRfVFhOKQorICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5lbnYpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZikgOgorICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYuZGIKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5lbnYKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICAgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZikgOgorICAgICAgICAgICAgc2VsZi5kYi5zZXRfZmxhZ3MoZGIuREJfQ0hLU1VNKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYi5EQl9DSEtTVU0sIHNlbGYuZGIuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBzZWxmLmRiLnNldF9mbGFncyhkYi5EQl9UWE5fTk9UX0RVUkFCTEUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX1RYTl9OT1RfRFVSQUJMRSB8IGRiLkRCX0NIS1NVTSwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kYi5nZXRfZmxhZ3MoKSkKKworICAgIGRlZiB0ZXN0X2dldF90cmFuc2FjdGlvbmFsKHNlbGYpIDoKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmRiLmdldF90cmFuc2FjdGlvbmFsKCkpCisgICAgICAgICMgREJfQVVUT19DT01NSVQgPSBJbXBsaWNpdCB0cmFuc2FjdGlvbgorICAgICAgICBzZWxmLmRiLm9wZW4oIlhYWCIsIGRidHlwZT1kYi5EQl9IQVNILAorICAgICAgICAgICAgICAgIGZsYWdzID0gZGIuREJfQ1JFQVRFIHwgZGIuREJfQVVUT19DT01NSVQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmRiLmdldF90cmFuc2FjdGlvbmFsKCkpCisKK2NsYXNzIERCX3JlY25vKERCKSA6CisgICAgZGVmIHRlc3RfcmVfcGFkKHNlbGYpIDoKKyAgICAgICAgZm9yIGkgaW4gWycgJywgJyonXSA6ICAjIENoZWNrIGNoYXJzCisgICAgICAgICAgICBzZWxmLmRiLnNldF9yZV9wYWQoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkKGkpLCBzZWxmLmRiLmdldF9yZV9wYWQoKSkKKyAgICAgICAgZm9yIGkgaW4gWzk3LCA2NV0gOiAgIyBDaGVjayBpbnRlZ2VycworICAgICAgICAgICAgc2VsZi5kYi5zZXRfcmVfcGFkKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZGIuZ2V0X3JlX3BhZCgpKQorCisgICAgZGVmIHRlc3RfcmVfZGVsaW0oc2VsZikgOgorICAgICAgICBmb3IgaSBpbiBbJyAnLCAnKiddIDogICMgQ2hlY2sgY2hhcnMKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX2RlbGltKGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZChpKSwgc2VsZi5kYi5nZXRfcmVfZGVsaW0oKSkKKyAgICAgICAgZm9yIGkgaW4gWzk3LCA2NV0gOiAgIyBDaGVjayBpbnRlZ2VycworICAgICAgICAgICAgc2VsZi5kYi5zZXRfcmVfZGVsaW0oaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5kYi5nZXRfcmVfZGVsaW0oKSkKKworICAgIGRlZiB0ZXN0X3JlX3NvdXJjZShzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsidGVzdCIsICJ0ZXN0MiIsICJ0ZXN0MyJdIDoKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX3NvdXJjZShpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9yZV9zb3VyY2UoKSkKKworY2xhc3MgREJfcXVldWUoREIpIDoKKyAgICBkZWYgdGVzdF9yZV9sZW4oc2VsZikgOgorICAgICAgICBmb3IgaSBpbiBbMzMsIDY1LCAzMDAsIDIwMDBdIDoKKyAgICAgICAgICAgIHNlbGYuZGIuc2V0X3JlX2xlbihpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmRiLmdldF9yZV9sZW4oKSkKKworICAgIGRlZiB0ZXN0X3FfZXh0ZW50c2l6ZShzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsxLCA2MCwgMTAwXSA6CisgICAgICAgICAgICBzZWxmLmRiLnNldF9xX2V4dGVudHNpemUoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5kYi5nZXRfcV9leHRlbnRzaXplKCkpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJfZ2VuZXJhbCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJfdHhuKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQl9oYXNoKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQl9yZWNubykpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJfcXVldWUpKQorCisgICAgcmV0dXJuIHN1aXRlCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYi5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwNDEyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RiLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYi5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEwNDEyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RiLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RiZW52LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZWY3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weQpAQCAtMCwwICsxLDUyNSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MsIGdsb2IKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBcCisgICAgICAgIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBEQkVudih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5lbnYKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKK2NsYXNzIERCRW52X2dlbmVyYWwoREJFbnYpIDoKKyAgICBkZWYgdGVzdF9nZXRfb3Blbl9mbGFncyhzZWxmKSA6CisgICAgICAgIGZsYWdzID0gZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTAorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZmxhZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhZ3MsIHNlbGYuZW52LmdldF9vcGVuX2ZsYWdzKCkpCisKKyAgICBkZWYgdGVzdF9nZXRfb3Blbl9mbGFnczIoc2VsZikgOgorICAgICAgICBmbGFncyA9IGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wgfCBcCisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0NLIHwgZGIuREJfVEhSRUFECisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBmbGFncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFncywgc2VsZi5lbnYuZ2V0X29wZW5fZmxhZ3MoKSkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNykgOgorICAgICAgICBkZWYgdGVzdF9sa19wYXJ0aXRpb25zKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsxMCwgMjAsIDQwXSA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xrX3BhcnRpdGlvbnMoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF9sa19wYXJ0aXRpb25zKCkpCisKKyAgICAgICAgZGVmIHRlc3RfZ2V0c2V0X2ludGVybWVkaWF0ZV9kaXJfbW9kZShzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuZW52LmdldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUoKSkKKyAgICAgICAgICAgIGZvciBtb2RlIGluIFsicnd4LS0tLS0tIiwgInJ3LXJ3LXJ3LSIsICJydy1yLS1yLS0iXSA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2ludGVybWVkaWF0ZV9kaXJfbW9kZShtb2RlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kZSwgc2VsZi5lbnYuZ2V0X2ludGVybWVkaWF0ZV9kaXJfbW9kZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9pbnRlcm1lZGlhdGVfZGlyX21vZGUsICJhYmNkZSIpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDYpIDoKKyAgICAgICAgZGVmIHRlc3RfdGhyZWFkKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsxNiwgMTAwLCAxMDAwXSA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X3RocmVhZF9jb3VudChpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5lbnYuZ2V0X3RocmVhZF9jb3VudCgpKQorCisgICAgICAgIGRlZiB0ZXN0X2NhY2hlX21heChzZWxmKSA6CisgICAgICAgICAgICBmb3Igc2l6ZSBpbiBbNjQsIDEyOF0gOgorICAgICAgICAgICAgICAgIHNpemUgPSBzaXplKjEwMjQqMTAyNCAgIyBNZWdhYnl0ZXMKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfY2FjaGVfbWF4KDAsIHNpemUpCisgICAgICAgICAgICAgICAgc2l6ZTIgPSBzZWxmLmVudi5nZXRfY2FjaGVfbWF4KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNpemUyWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplIDw9IHNpemUyWzFdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyKnNpemUgPiBzaXplMlsxXSkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNCkgOgorICAgICAgICBkZWYgdGVzdF9tdXRleF9zdGF0KHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MIHwKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0NLKQorICAgICAgICAgICAgc3RhdCA9IHNlbGYuZW52Lm11dGV4X3N0YXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJtdXRleF9pbnVzZV9tYXgiIGluIHN0YXQpCisKKyAgICAgICAgZGVmIHRlc3RfbGdfZmlsZW1vZGUoc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWzA2MDAsIDA2NjAsIDA2NjZdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGdfZmlsZW1vZGUoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF9sZ19maWxlbW9kZSgpKQorCisgICAgZGVmIHRlc3RfbXBfbWF4X29wZW5mZChzZWxmKSA6CisgICAgICAgIGZvciBpIGluIFsxNywgMzEsIDQyXSA6CisgICAgICAgICAgICBzZWxmLmVudi5zZXRfbXBfbWF4X29wZW5mZChpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbXBfbWF4X29wZW5mZCgpKQorCisgICAgZGVmIHRlc3RfbXBfbWF4X3dyaXRlKHNlbGYpIDoKKyAgICAgICAgZm9yIGkgaW4gWzEwMCwgMjAwLCAzMDBdIDoKKyAgICAgICAgICAgIGZvciBqIGluIFsxLCAyLCAzXSA6CisgICAgICAgICAgICAgICAgaiAqPSAxMDAwMDAwCisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X21wX21heF93cml0ZShpLCBqKQorICAgICAgICAgICAgICAgIHY9c2VsZi5lbnYuZ2V0X21wX21heF93cml0ZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaSwgaiksIHYpCisKKyAgICAgICAgZGVmIHRlc3RfaW52YWxpZF90eG4oc2VsZikgOgorICAgICAgICAgICAgIyBUaGlzIGVudmlyb25tZW50IGRvZXNuJ3Qgc3VwcG9ydCB0cmFuc2FjdGlvbnMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBzZWxmLmVudi50eG5fYmVnaW4pCisKKyAgICAgICAgZGVmIHRlc3RfbXBfbW1hcHNpemUoc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWzE2LCAzMiwgNjRdIDoKKyAgICAgICAgICAgICAgICBpICo9IDEwMjQqMTAyNAorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9tcF9tbWFwc2l6ZShpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgc2VsZi5lbnYuZ2V0X21wX21tYXBzaXplKCkpCisKKyAgICAgICAgZGVmIHRlc3RfdG1wX2RpcihzZWxmKSA6CisgICAgICAgICAgICBmb3IgaSBpbiBbImEiLCAiYmIiLCAiY2NjIl0gOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF90bXBfZGlyKGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfdG1wX2RpcigpKQorCisgICAgICAgIGRlZiB0ZXN0X2ZsYWdzKHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF9mbGFncyhkYi5EQl9BVVRPX0NPTU1JVCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGIuREJfQVVUT19DT01NSVQsIHNlbGYuZW52LmdldF9mbGFncygpKQorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2ZsYWdzKGRiLkRCX1RYTl9OT1NZTkMsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX0FVVE9fQ09NTUlUIHwgZGIuREJfVFhOX05PU1lOQywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfZmxhZ3MoZGIuREJfQVVUT19DT01NSVQsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiLkRCX1RYTl9OT1NZTkMsIHNlbGYuZW52LmdldF9mbGFncygpKQorICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2ZsYWdzKGRiLkRCX1RYTl9OT1NZTkMsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZW52LmdldF9mbGFncygpKQorCisgICAgICAgIGRlZiB0ZXN0X2xrX21heF9vYmplY3RzKHNlbGYpIDoKKyAgICAgICAgICAgIGZvciBpIGluIFsxMDAwLCAyMDAwLCAzMDAwXSA6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2xrX21heF9vYmplY3RzKGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGtfbWF4X29iamVjdHMoKSkKKworICAgICAgICBkZWYgdGVzdF9sa19tYXhfbG9ja3Moc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWzEwMDAsIDIwMDAsIDMwMDBdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGtfbWF4X2xvY2tzKGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBzZWxmLmVudi5nZXRfbGtfbWF4X2xvY2tzKCkpCisKKyAgICAgICAgZGVmIHRlc3RfbGtfbWF4X2xvY2tlcnMoc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWzEwMDAsIDIwMDAsIDMwMDBdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGtfbWF4X2xvY2tlcnMoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF9sa19tYXhfbG9ja2VycygpKQorCisgICAgICAgIGRlZiB0ZXN0X2xnX3JlZ2lvbm1heChzZWxmKSA6CisgICAgICAgICAgICBmb3IgaSBpbiBbMTI4LCAyNTYsIDEwMDBdIDoKKyAgICAgICAgICAgICAgICBpID0gaSoxMDI0KjEwMjQKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGdfcmVnaW9ubWF4KGkpCisgICAgICAgICAgICAgICAgaiA9IHNlbGYuZW52LmdldF9sZ19yZWdpb25tYXgoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpIDw9IGopCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqaSA+IGopCisKKyAgICAgICAgZGVmIHRlc3RfbGtfZGV0ZWN0KHNlbGYpIDoKKyAgICAgICAgICAgIGZsYWdzPSBbZGIuREJfTE9DS19ERUZBVUxULCBkYi5EQl9MT0NLX0VYUElSRSwgZGIuREJfTE9DS19NQVhMT0NLUywKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfTE9DS19NSU5MT0NLUywgZGIuREJfTE9DS19NSU5XUklURSwKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfTE9DS19PTERFU1QsIGRiLkRCX0xPQ0tfUkFORE9NLCBkYi5EQl9MT0NLX1lPVU5HRVNUXQorCisgICAgICAgICAgICBmbGFncy5hcHBlbmQoZGIuREJfTE9DS19NQVhXUklURSkKKworICAgICAgICAgICAgZm9yIGkgaW4gZmxhZ3MgOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9sa19kZXRlY3QoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF9sa19kZXRlY3QoKSkKKworICAgICAgICBkZWYgdGVzdF9sZ19kaXIoc2VsZikgOgorICAgICAgICAgICAgZm9yIGkgaW4gWyJhIiwgImJiIiwgImNjYyIsICJkZGRkIl0gOgorICAgICAgICAgICAgICAgIHNlbGYuZW52LnNldF9sZ19kaXIoaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIHNlbGYuZW52LmdldF9sZ19kaXIoKSkKKworICAgICAgICBkZWYgdGVzdF9sZ19ic2l6ZShzZWxmKSA6CisgICAgICAgICAgICBsb2dfc2l6ZSA9IDcwKjEwMjQKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF9sZ19ic2l6ZShsb2dfc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmVudi5nZXRfbGdfYnNpemUoKSA+PSBsb2dfc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmVudi5nZXRfbGdfYnNpemUoKSA8IDQqbG9nX3NpemUpCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfbGdfYnNpemUoNCpsb2dfc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmVudi5nZXRfbGdfYnNpemUoKSA+PSA0KmxvZ19zaXplKQorCisgICAgICAgIGRlZiB0ZXN0X3NldGdldF9kYXRhX2RpcnMoc2VsZikgOgorICAgICAgICAgICAgZGlycyA9ICgiYSIsICJiIiwgImMiLCAiZCIpCisgICAgICAgICAgICBmb3IgaSBpbiBkaXJzIDoKKyAgICAgICAgICAgICAgICBzZWxmLmVudi5zZXRfZGF0YV9kaXIoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlycywgc2VsZi5lbnYuZ2V0X2RhdGFfZGlycygpKQorCisgICAgICAgIGRlZiB0ZXN0X3NldGdldF9jYWNoZXNpemUoc2VsZikgOgorICAgICAgICAgICAgY2FjaGVzaXplID0gKDAsIDUxMioxMDI0KjEwMjQsIDMpCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfY2FjaGVzaXplKCpjYWNoZXNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlc2l6ZSwgc2VsZi5lbnYuZ2V0X2NhY2hlc2l6ZSgpKQorCisgICAgICAgICAgICBjYWNoZXNpemUgPSAoMCwgMSoxMDI0KjEwMjQsIDUpCisgICAgICAgICAgICBzZWxmLmVudi5zZXRfY2FjaGVzaXplKCpjYWNoZXNpemUpCisgICAgICAgICAgICBjYWNoZXNpemUyID0gc2VsZi5lbnYuZ2V0X2NhY2hlc2l6ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhY2hlc2l6ZVswXSwgY2FjaGVzaXplMlswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplWzJdLCBjYWNoZXNpemUyWzJdKQorICAgICAgICAgICAgIyBCZXJrZWxleSBEQiBleHBhbmRzIHRoZSBjYWNoZSAyNSUgYWNjb3VudGluZyBvdmVyaGVhZCwKKyAgICAgICAgICAgICMgaWYgdGhlIGNhY2hlIGlzIHNtYWxsLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMjUsIGludCgxMDAuMCpjYWNoZXNpemUyWzFdL2NhY2hlc2l6ZVsxXSkpCisKKyAgICAgICAgICAgICMgWW91IGNhbiBub3QgY2hhbmdlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgb3BlbmluZworICAgICAgICAgICAgIyB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCkKKyAgICAgICAgICAgIGNhY2hlc2l6ZSA9ICgwLCAyKjEwMjQqMTAyNCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X2NhY2hlc2l6ZSwgKmNhY2hlc2l6ZSkKKyAgICAgICAgICAgIGNhY2hlc2l6ZTMgPSBzZWxmLmVudi5nZXRfY2FjaGVzaXplKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplMlswXSwgY2FjaGVzaXplM1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVzaXplMlsyXSwgY2FjaGVzaXplM1syXSkKKyAgICAgICAgICAgICMgSW4gQmVya2VsZXkgREIgNS4xLCB0aGUgY2FjaGVzaXplIGNhbiBjaGFuZ2Ugd2hlbiBvcGVuaW5nIHRoZSBFbnYKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWNoZXNpemUyWzFdIDw9IGNhY2hlc2l6ZTNbMV0pCisKKyAgICAgICAgZGVmIHRlc3Rfc2V0X2NhY2hlc2l6ZV9kYmVudl9kYihzZWxmKSA6CisgICAgICAgICAgICAjIFlvdSBjYW4gbm90IGNvbmZpZ3VyZSB0aGUgY2FjaGVzaXplIHVzaW5nCisgICAgICAgICAgICAjIHRoZSBkYXRhYmFzZSBoYW5kbGUsIGlmIHlvdSBhcmUgdXNpbmcgYW4gZW52aXJvbm1lbnQuCisgICAgICAgICAgICBkID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwKKyAgICAgICAgICAgICAgICBkLnNldF9jYWNoZXNpemUsIDAsIDEwMjQqMTAyNCwgMSkKKworICAgICAgICBkZWYgdGVzdF9zZXRnZXRfc2htX2tleShzZWxmKSA6CisgICAgICAgICAgICBzaG1fa2V5PTEzNworICAgICAgICAgICAgc2VsZi5lbnYuc2V0X3NobV9rZXkoc2htX2tleSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2htX2tleSwgc2VsZi5lbnYuZ2V0X3NobV9rZXkoKSkKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF9zaG1fa2V5KHNobV9rZXkrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2htX2tleSsxLCBzZWxmLmVudi5nZXRfc2htX2tleSgpKQorCisgICAgICAgICAgICAjIFlvdSBjYW4gbm90IGNoYW5nZSBjb25maWd1cmF0aW9uIGFmdGVyIG9wZW5pbmcKKyAgICAgICAgICAgICMgdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wpCisgICAgICAgICAgICAjIElmIHdlIHRyeSB0byByZWNvbmZpZ3VyZSBjYWNoZSBhZnRlciBvcGVuaW5nIHRoZQorICAgICAgICAgICAgIyBlbnZpcm9ubWVudCwgY29yZSBkdW1wLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgc2VsZi5lbnYuc2V0X3NobV9rZXksIHNobV9rZXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNobV9rZXkrMSwgc2VsZi5lbnYuZ2V0X3NobV9rZXkoKSkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNCkgOgorICAgICAgICBkZWYgdGVzdF9tdXRleF9zZXRnZXRfbWF4KHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLmVudi5tdXRleF9nZXRfbWF4KCkKKyAgICAgICAgICAgIHYyID0gdioyKzEKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X21heCh2MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjIsIHNlbGYuZW52Lm11dGV4X2dldF9tYXgoKSkKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X21heCh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBzZWxmLmVudi5tdXRleF9nZXRfbWF4KCkpCisKKyAgICAgICAgICAgICMgWW91IGNhbiBub3QgY2hhbmdlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgb3BlbmluZworICAgICAgICAgICAgIyB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9tYXgsIHYyKQorCisgICAgICAgIGRlZiB0ZXN0X211dGV4X3NldGdldF9pbmNyZW1lbnQoc2VsZikgOgorICAgICAgICAgICAgdiA9IHNlbGYuZW52Lm11dGV4X2dldF9pbmNyZW1lbnQoKQorICAgICAgICAgICAgdjIgPSAxMjcKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X2luY3JlbWVudCh2MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjIsIHNlbGYuZW52Lm11dGV4X2dldF9pbmNyZW1lbnQoKSkKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X2luY3JlbWVudCh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBzZWxmLmVudi5tdXRleF9nZXRfaW5jcmVtZW50KCkpCisKKyAgICAgICAgICAgICMgWW91IGNhbiBub3QgY2hhbmdlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgb3BlbmluZworICAgICAgICAgICAgIyB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9pbmNyZW1lbnQsIHYyKQorCisgICAgICAgIGRlZiB0ZXN0X211dGV4X3NldGdldF90YXNfc3BpbnMoc2VsZikgOgorICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X3Rhc19zcGlucygwKSAgIyBEZWZhdWx0ID0gQkRCIGRlY2lkZXMKKyAgICAgICAgICAgIHYgPSBzZWxmLmVudi5tdXRleF9nZXRfdGFzX3NwaW5zKCkKKyAgICAgICAgICAgIHYyID0gdioyKzEKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X3Rhc19zcGlucyh2MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjIsIHNlbGYuZW52Lm11dGV4X2dldF90YXNfc3BpbnMoKSkKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X3Rhc19zcGlucyh2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBzZWxmLmVudi5tdXRleF9nZXRfdGFzX3NwaW5zKCkpCisKKyAgICAgICAgICAgICMgSW4gdGhpcyBjYXNlLCB5b3UgY2FuIGNoYW5nZSBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAjIGFmdGVyIG9wZW5pbmcgdGhlIGVudmlyb25tZW50LgorICAgICAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF90YXNfc3BpbnModjIpCisKKyAgICAgICAgZGVmIHRlc3RfbXV0ZXhfc2V0Z2V0X2FsaWduKHNlbGYpIDoKKyAgICAgICAgICAgIHYgPSBzZWxmLmVudi5tdXRleF9nZXRfYWxpZ24oKQorICAgICAgICAgICAgdjIgPSA2NAorICAgICAgICAgICAgaWYgdiA9PSA2NCA6CisgICAgICAgICAgICAgICAgdjIgPSAxMjgKKworICAgICAgICAgICAgc2VsZi5lbnYubXV0ZXhfc2V0X2FsaWduKHYyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2Miwgc2VsZi5lbnYubXV0ZXhfZ2V0X2FsaWduKCkpCisKKyAgICAgICAgICAgICMgUmVxdWlyZXMgYSBub256ZXJvIHBvd2VyIG9mIHR3bworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9hbGlnbiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICBzZWxmLmVudi5tdXRleF9zZXRfYWxpZ24sIDE3KQorCisgICAgICAgICAgICBzZWxmLmVudi5tdXRleF9zZXRfYWxpZ24oMip2MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMip2Miwgc2VsZi5lbnYubXV0ZXhfZ2V0X2FsaWduKCkpCisKKyAgICAgICAgICAgICMgWW91IGNhbiBub3QgY2hhbmdlIGNvbmZpZ3VyYXRpb24gYWZ0ZXIgb3BlbmluZworICAgICAgICAgICAgIyB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJJbnZhbGlkQXJnRXJyb3IsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW52Lm11dGV4X3NldF9hbGlnbiwgdjIpCisKKworY2xhc3MgREJFbnZfbG9nKERCRW52KSA6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBEQkVudi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9HKQorCisgICAgZGVmIHRlc3RfbG9nX2ZpbGUoc2VsZikgOgorICAgICAgICBsb2dfZmlsZSA9IHNlbGYuZW52LmxvZ19maWxlKCgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgibG9nLjAwMDAwMDAwMDEiLCBsb2dfZmlsZVstMTQ6XSkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNCkgOgorICAgICAgICAjIFRoZSB2ZXJzaW9uIHdpdGggdHJhbnNhY3Rpb25zIGlzIGNoZWNrZWQgaW4gb3RoZXIgdGVzdCBvYmplY3QKKyAgICAgICAgZGVmIHRlc3RfbG9nX3ByaW50ZihzZWxmKSA6CisgICAgICAgICAgICBtc2cgPSAiVGhpcyBpcyBhIHRlc3QuLi4iCisgICAgICAgICAgICBzZWxmLmVudi5sb2dfcHJpbnRmKG1zZykKKyAgICAgICAgICAgIGxvZ2MgPSBzZWxmLmVudi5sb2dfY3Vyc29yKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cgaW4gKGxvZ2MubGFzdCgpWzFdKSkKKworICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNykgOgorICAgICAgICBkZWYgdGVzdF9sb2dfY29uZmlnKHNlbGYpIDoKKyAgICAgICAgICAgIHNlbGYuZW52LmxvZ19zZXRfY29uZmlnKGRiLkRCX0xPR19EU1lOQyB8IGRiLkRCX0xPR19aRVJPLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZW52LmxvZ19nZXRfY29uZmlnKGRiLkRCX0xPR19EU1lOQykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYubG9nX2dldF9jb25maWcoZGIuREJfTE9HX1pFUk8pKQorICAgICAgICAgICAgc2VsZi5lbnYubG9nX3NldF9jb25maWcoZGIuREJfTE9HX1pFUk8sIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYubG9nX2dldF9jb25maWcoZGIuREJfTE9HX0RTWU5DKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5lbnYubG9nX2dldF9jb25maWcoZGIuREJfTE9HX1pFUk8pKQorCisKK2NsYXNzIERCRW52X2xvZ190eG4oREJFbnYpIDoKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIERCRW52LnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MIHwKKyAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0xPRyB8IGRiLkRCX0lOSVRfVFhOKQorCisgICAgaWYgKGRiLnZlcnNpb24oKSA+PSAoNCwgNSkpIGFuZCAoZGIudmVyc2lvbigpIDwgKDUsIDIpKSA6CisgICAgICAgIGRlZiB0ZXN0X3R4X21heChzZWxmKSA6CisgICAgICAgICAgICB0eG5zPVtdCisgICAgICAgICAgICBkZWYgdHgoKSA6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYuZW52LmdldF90eF9tYXgoKSkgOgorICAgICAgICAgICAgICAgICAgICB0eG5zLmFwcGVuZChzZWxmLmVudi50eG5fYmVnaW4oKSkKKworICAgICAgICAgICAgdHgoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWVtb3J5RXJyb3IsIHR4KQorCisgICAgICAgICAgICAjIEFib3J0IHRoZSB0cmFuc2FjdGlvbnMgYmVmb3JlIGdhcmJhZ2UgY29sbGVjdGlvbiwKKyAgICAgICAgICAgICMgdG8gYXZvaWQgIndhcm5pbmdzIi4KKyAgICAgICAgICAgIGZvciBpIGluIHR4bnMgOgorICAgICAgICAgICAgICAgIGkuYWJvcnQoKQorCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LCA0KSA6CisgICAgICAgICMgVGhlIHZlcnNpb24gd2l0aG91dCB0cmFuc2FjdGlvbnMgaXMgY2hlY2tlZCBpbiBvdGhlciB0ZXN0IG9iamVjdAorICAgICAgICBkZWYgdGVzdF9sb2dfcHJpbnRmKHNlbGYpIDoKKyAgICAgICAgICAgIG1zZyA9ICJUaGlzIGlzIGEgdGVzdC4uLiIKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBzZWxmLmVudi5sb2dfcHJpbnRmKG1zZywgdHhuPXR4bikKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgbG9nYyA9IHNlbGYuZW52LmxvZ19jdXJzb3IoKQorICAgICAgICAgICAgbG9nYy5sYXN0KCkgICMgU2tpcCB0aGUgY29tbWl0CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIGluIChsb2djLnByZXYoKVsxXSkpCisKKyAgICAgICAgICAgIG1zZyA9ICJUaGlzIGlzIGFub3RoZXIgdGVzdC4uLiIKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBzZWxmLmVudi5sb2dfcHJpbnRmKG1zZywgdHhuPXR4bikKKyAgICAgICAgICAgIHR4bi5hYm9ydCgpICAjIERvIG5vdCBzdG9yZSB0aGUgbmV3IG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2MubGFzdCgpICAjIFNraXAgdGhlIGFib3J0CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIG5vdCBpbiAobG9nYy5wcmV2KClbMV0pKQorCisgICAgICAgICAgICBtc2cgPSAiVGhpcyBpcyBhIHRoaXJkIHRlc3QuLi4iCisgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oKQorICAgICAgICAgICAgc2VsZi5lbnYubG9nX3ByaW50Zihtc2csIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkgICMgRG8gbm90IHN0b3JlIHRoZSBuZXcgbWVzc2FnZQorICAgICAgICAgICAgbG9nYy5sYXN0KCkgICMgU2tpcCB0aGUgY29tbWl0CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIGluIChsb2djLnByZXYoKVsxXSkpCisKKworY2xhc3MgREJFbnZfbWVtcChEQkVudik6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBEQkVudi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9HKQorICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuZGIub3BlbigidGVzdCIsIGRiLkRCX0hBU0gsIGRiLkRCX0NSRUFURSwgMDY2MCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLmRiCisgICAgICAgIERCRW52LnRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgdGVzdF9tZW1wXzFfdHJpY2tsZShzZWxmKSA6CisgICAgICAgIHNlbGYuZGIucHV0KCJoaSIsICJieWUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYubWVtcF90cmlja2xlKDEwMCkgPiAwKQorCisjIFByZXNlcnZlIHRoZSBvcmRlciwgZG8gIm1lbXBfdHJpY2tsZSIgdGVzdCBmaXJzdAorICAgIGRlZiB0ZXN0X21lbXBfMl9zeW5jKHNlbGYpIDoKKyAgICAgICAgc2VsZi5kYi5wdXQoImhpIiwgImJ5ZSIpCisgICAgICAgIHNlbGYuZW52Lm1lbXBfc3luYygpICAjIEZ1bGwgZmx1c2gKKyAgICAgICAgIyBOb3RoaW5nIHRvIGRvLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmVudi5tZW1wX3RyaWNrbGUoMTAwKSA9PSAwKQorCisgICAgICAgIHNlbGYuZGIucHV0KCJoaSIsICJieWUyIikKKyAgICAgICAgc2VsZi5lbnYubWVtcF9zeW5jKCgxLCAwKSkgICMgTk9QLCBwcm9iYWJseQorICAgICAgICAjIFNvbWV0aGluZyB0byBkby4uLiBvciBub3QKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZW52Lm1lbXBfdHJpY2tsZSgxMDApID49IDApCisKKyAgICAgICAgc2VsZi5kYi5wdXQoImhpIiwgImJ5ZTMiKQorICAgICAgICBzZWxmLmVudi5tZW1wX3N5bmMoKDEyMywgOTkpKSAgIyBGdWxsIGZsdXNoCisgICAgICAgICMgTm90aGluZyB0byBkby4uLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5lbnYubWVtcF90cmlja2xlKDEwMCkgPT0gMCkKKworICAgIGRlZiB0ZXN0X21lbXBfc3RhdF8xKHNlbGYpIDoKKyAgICAgICAgc3RhdHMgPSBzZWxmLmVudi5tZW1wX3N0YXQoKSAgIyBObyBwYXJhbQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHN0YXRzKT09MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJjYWNoZV9taXNzIiBpbiBzdGF0c1swXSkKKyAgICAgICAgc3RhdHMgPSBzZWxmLmVudi5tZW1wX3N0YXQoZGIuREJfU1RBVF9DTEVBUikgICMgUG9zaXRpb25hbCBwYXJhbQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImNhY2hlX21pc3MiIGluIHN0YXRzWzBdKQorICAgICAgICBzdGF0cyA9IHNlbGYuZW52Lm1lbXBfc3RhdChmbGFncz0wKSAgIyBLZXl3b3JkIHBhcmFtCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiY2FjaGVfbWlzcyIgaW4gc3RhdHNbMF0pCisKKyAgICBkZWYgdGVzdF9tZW1wX3N0YXRfMihzZWxmKSA6CisgICAgICAgIHN0YXRzPXNlbGYuZW52Lm1lbXBfc3RhdCgpWzFdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc3RhdHMpKT09MQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInRlc3QiIGluIHN0YXRzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInBhZ2VfaW4iIGluIHN0YXRzWyJ0ZXN0Il0pCisKK2NsYXNzIERCRW52X2xvZ2N1cnNvcihEQkVudik6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBEQkVudi5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0cgfCBkYi5EQl9JTklUX1RYTikKKyAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKCkKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLmRiLm9wZW4oInRlc3QiLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUsIDA2NjAsIHR4bj10eG4pCisgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICBmb3IgaSBpbiBbIjIiLCAiOCIsICIyMCJdIDoKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBzZWxmLmRiLnB1dChrZXkgPSBpLCBkYXRhID0gaSppbnQoaSksIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLmRiCisgICAgICAgIERCRW52LnRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgX2NoZWNrX3JldHVybihzZWxmLCB2YWx1ZSkgOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlWzBdLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlWzBdKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWVbMF1bMF0sIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlWzBdWzFdLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZVsxXSwgc3RyKSkKKworICAgICMgUHJlc2VydmUgdGVzdCBvcmRlcgorICAgIGRlZiB0ZXN0XzFfZmlyc3Qoc2VsZikgOgorICAgICAgICBsb2djID0gc2VsZi5lbnYubG9nX2N1cnNvcigpCisgICAgICAgIHYgPSBsb2djLmZpcnN0KCkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmV0dXJuKHYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoMSwgMSkgPCB2WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHZbMV0pPjApCisKKyAgICBkZWYgdGVzdF8yX2xhc3Qoc2VsZikgOgorICAgICAgICBsb2djID0gc2VsZi5lbnYubG9nX2N1cnNvcigpCisgICAgICAgIGxzbl9maXJzdCA9IGxvZ2MuZmlyc3QoKVswXQorICAgICAgICB2ID0gbG9nYy5sYXN0KCkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmV0dXJuKHYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsc25fZmlyc3QgPCB2WzBdKQorCisgICAgZGVmIHRlc3RfM19uZXh0KHNlbGYpIDoKKyAgICAgICAgbG9nYyA9IHNlbGYuZW52LmxvZ19jdXJzb3IoKQorICAgICAgICBsc25fbGFzdCA9IGxvZ2MubGFzdCgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nYy5uZXh0KCksIE5vbmUpCisgICAgICAgIGxzbl9maXJzdCA9IGxvZ2MuZmlyc3QoKVswXQorICAgICAgICB2ID0gbG9nYy5uZXh0KCkKKyAgICAgICAgc2VsZi5fY2hlY2tfcmV0dXJuKHYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsc25fZmlyc3QgPCB2WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobHNuX2xhc3QgPiB2WzBdKQorCisgICAgICAgIHYyID0gbG9nYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYyWzBdID4gdlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxzbl9sYXN0ID4gdjJbMF0pCisKKyAgICAgICAgdjMgPSBsb2djLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodjNbMF0gPiB2MlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxzbl9sYXN0ID4gdjNbMF0pCisKKyAgICBkZWYgdGVzdF80X3ByZXYoc2VsZikgOgorICAgICAgICBsb2djID0gc2VsZi5lbnYubG9nX2N1cnNvcigpCisgICAgICAgIGxzbl9maXJzdCA9IGxvZ2MuZmlyc3QoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZ2MucHJldigpLCBOb25lKQorICAgICAgICBsc25fbGFzdCA9IGxvZ2MubGFzdCgpWzBdCisgICAgICAgIHYgPSBsb2djLnByZXYoKQorICAgICAgICBzZWxmLl9jaGVja19yZXR1cm4odikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxzbl9maXJzdCA8IHZbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsc25fbGFzdCA+IHZbMF0pCisKKyAgICAgICAgdjIgPSBsb2djLnByZXYoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodjJbMF0gPCB2WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobHNuX2ZpcnN0IDwgdjJbMF0pCisKKyAgICAgICAgdjMgPSBsb2djLnByZXYoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodjNbMF0gPCB2MlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxzbl9maXJzdCA8IHYzWzBdKQorCisgICAgZGVmIHRlc3RfNV9jdXJyZW50KHNlbGYpIDoKKyAgICAgICAgbG9nYyA9IHNlbGYuZW52LmxvZ19jdXJzb3IoKQorICAgICAgICBsb2djLmZpcnN0KCkKKyAgICAgICAgdiA9IGxvZ2MubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgbG9nYy5jdXJyZW50KCkpCisKKyAgICBkZWYgdGVzdF82X3NldChzZWxmKSA6CisgICAgICAgIGxvZ2MgPSBzZWxmLmVudi5sb2dfY3Vyc29yKCkKKyAgICAgICAgbG9nYy5maXJzdCgpCisgICAgICAgIHYgPSBsb2djLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHYsIGxvZ2MubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHYsIGxvZ2MubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIGxvZ2Muc2V0KHZbMF0pKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfY2xvc2Uoc2VsZikgOgorICAgICAgICBsb2djID0gc2VsZi5lbnYubG9nX2N1cnNvcigpCisgICAgICAgIGxvZ2MuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkN1cnNvckNsb3NlZEVycm9yLCBsb2djLm5leHQpCisKKyAgICBkZWYgdGVzdF9pbXBsaWNpdF9jbG9zZShzZWxmKSA6CisgICAgICAgIGxvZ2MgPSAgW3NlbGYuZW52LmxvZ19jdXJzb3IoKSBmb3IgaSBpbiB4cmFuZ2UoMTApXQorICAgICAgICBzZWxmLmVudi5jbG9zZSgpICAjIFRoaXMgY2xvc2Ugc2hvdWxkIGNsb3NlIHRvbyBhbGwgaXRzIHRyZWUKKyAgICAgICAgZm9yIGkgaW4gbG9nYyA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkN1cnNvckNsb3NlZEVycm9yLCBpLm5leHQpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJFbnZfZ2VuZXJhbCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJFbnZfbWVtcCkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJFbnZfbG9nY3Vyc29yKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQkVudl9sb2cpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCRW52X2xvZ190eG4pKQorCisgICAgcmV0dXJuIHN1aXRlCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MDQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RiZW52LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYmVudi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MDQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RiZW52LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMDFhNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYm9iai5weQpAQCAtMCwwICsxLDcwIEBACisKK2ltcG9ydCBvcywgc3RyaW5nCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRib2JqLCB0ZXN0X3N1cHBvcnQsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgXAorICAgICAgICBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgZGJvYmpUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgZGJvYmouREIgYW5kIGRib2JqLkRCRW52IHdvcmsgcHJvcGVybHkiIiIKKyAgICBkYl9uYW1lID0gJ3Rlc3QtZGJvYmouZGInCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2RiJyk6CisgICAgICAgICAgICBkZWwgc2VsZi5kYgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdlbnYnKToKKyAgICAgICAgICAgIGRlbCBzZWxmLmVudgorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiB0ZXN0MDFfYm90aChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdERCRW52KGRib2JqLkRCRW52KTogcGFzcworICAgICAgICBjbGFzcyBUZXN0REIoZGJvYmouREIpOgorICAgICAgICAgICAgZGVmIHB1dChzZWxmLCBrZXksICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAga2V5ID0ga2V5LnVwcGVyKCkKKyAgICAgICAgICAgICAgICAjIGNhbGwgb3VyIHBhcmVudCBjbGFzc2VzIHB1dCBtZXRob2Qgd2l0aCBhbiB1cHBlciBjYXNlIGtleQorICAgICAgICAgICAgICAgIHJldHVybiBkYm9iai5EQi5wdXQoc2VsZiwga2V5LCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuZW52ID0gVGVzdERCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wpCisgICAgICAgIHNlbGYuZGIgPSBUZXN0REIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLmRiX25hbWUsIGRiLkRCX0hBU0gsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgc2VsZi5kYi5wdXQoJ3NwYW0nLCAnZWdncycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5nZXQoJ3NwYW0nKSwgTm9uZSwKKyAgICAgICAgICAgICAgICJvdmVycmlkZGVuIGRib2JqLkRCLnB1dCgpIG1ldGhvZCBmYWlsZWQgWzFdIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmdldCgnU1BBTScpLCAnZWdncycsCisgICAgICAgICAgICAgICAib3ZlcnJpZGRlbiBkYm9iai5EQi5wdXQoKSBtZXRob2QgZmFpbGVkIFsyXSIpCisgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdDAyX2Rib2JqX2RpY3RfaW50ZXJmYWNlKHNlbGYpOgorICAgICAgICBzZWxmLmVudiA9IGRib2JqLkRCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfTVBPT0wpCisgICAgICAgIHNlbGYuZGIgPSBkYm9iai5EQihzZWxmLmVudikKKyAgICAgICAgc2VsZi5kYi5vcGVuKHNlbGYuZGJfbmFtZSsnMDInLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUpCisgICAgICAgICMgX19zZXRpdGVtX18KKyAgICAgICAgc2VsZi5kYlsnc3BhbSddID0gJ2VnZ3MnCisgICAgICAgICMgX19sZW5fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmRiKSwgMSkKKyAgICAgICAgIyBfX2dldGl0ZW1fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJbJ3NwYW0nXSwgJ2VnZ3MnKQorICAgICAgICAjIF9fZGVsX18KKyAgICAgICAgZGVsIHNlbGYuZGJbJ3NwYW0nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZ2V0KCdzcGFtJyksIE5vbmUsICJkYm9iaiBfX2RlbF9fIGZhaWxlZCIpCisgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdDAzX2Rib2JqX3R5cGVfYmVmb3JlX29wZW4oc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoaXMgZG9lc24ndCBjYXVzZSBhIHNlZ2ZhdWx0LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkludmFsaWRBcmdFcnJvciwgZGIuREIoKS50eXBlKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoZGJvYmpUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzZjYjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJvYmoucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rib2JqLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzZjYjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJvYmoucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJzaGVsdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3MDFlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5CkBAIC0wLDAgKzEsMzk4IEBACisiIiIKK1Rlc3RDYXNlcyBmb3IgY2hlY2tpbmcgZGJTaGVsdmUgb2JqZWN0cy4KKyIiIgorCitpbXBvcnQgb3MsIHN0cmluZywgc3lzCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgdW5pdHRlc3QKKworCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgZGJzaGVsdmUsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgXAorICAgICAgICBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisKKworCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgV2Ugd2FudCB0aGUgb2JqZWN0cyB0byBiZSBjb21wYXJhYmxlIHNvIHdlIGNhbiB0ZXN0IGRic2hlbHZlLnZhbHVlcworIyBsYXRlciBvbi4KK2NsYXNzIERhdGFDbGFzczoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsdWUgPSByYW5kb20ucmFuZG9tKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKSA6ICAjIEZvciBQeXRob24gMy4wIGNvbXBhcmlzb24KKyAgICAgICAgcmV0dXJuICJEYXRhQ2xhc3MgJWYiICVzZWxmLnZhbHVlCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6ICAjIEZvciBQeXRob24gMi54IGNvbXBhcmlzb24KKyAgICAgICAgcmV0dXJuIGNtcChzZWxmLnZhbHVlLCBvdGhlcikKKworCitjbGFzcyBEQlNoZWx2ZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpZiAoc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KSkgb3IgKChzeXMudmVyc2lvbl9pbmZvID49ICgzLCAwKSkgYW5kCisgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKKyAgICAgICAgZGVmIGFzc2VydEluKHNlbGYsIGEsIGIsIG1zZz1Ob25lKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRUcnVlKGEgaW4gYiwgbXNnPW1zZykKKworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgICAgICAgICAgZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZG9fcHJveHlfZGJfcHkzaworICAgICAgICAgICAgc2VsZi5fZmxhZ19wcm94eV9kYl9weTNrID0gZG9fcHJveHlfZGJfcHkzayhGYWxzZSkKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisgICAgICAgIHNlbGYuZG9fb3BlbigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgICAgICAgICBmcm9tIHRlc3RfYWxsIGltcG9ydCBkb19wcm94eV9kYl9weTNrCisgICAgICAgICAgICBkb19wcm94eV9kYl9weTNrKHNlbGYuX2ZsYWdfcHJveHlfZGJfcHkzaykKKyAgICAgICAgc2VsZi5kb19jbG9zZSgpCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSkKKworICAgIGRlZiBtayhzZWxmLCBrZXkpOgorICAgICAgICAiIiJUdXJuIGtleSBpbnRvIGFuIGFwcHJvcHJpYXRlIGtleSB0eXBlIGZvciB0aGlzIGRiIiIiCisgICAgICAgICMgb3ZlcnJpZGUgaW4gY2hpbGQgY2xhc3MgZm9yIFJFQ05PCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIHJldHVybiBrZXkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICByZXR1cm4gYnl0ZXMoa2V5LCAiaXNvODg1OS0xIikgICMgOCBiaXRzCisKKyAgICBkZWYgcG9wdWxhdGVEQihzZWxmLCBkKToKKyAgICAgICAgZm9yIHggaW4gc3RyaW5nLmxldHRlcnM6CisgICAgICAgICAgICBkW3NlbGYubWsoJ1MnICsgeCldID0gMTAgKiB4ICAgICAgICAgICAjIGFkZCBhIHN0cmluZworICAgICAgICAgICAgZFtzZWxmLm1rKCdJJyArIHgpXSA9IG9yZCh4KSAgICAgICAgICAgIyBhZGQgYW4gaW50ZWdlcgorICAgICAgICAgICAgZFtzZWxmLm1rKCdMJyArIHgpXSA9IFt4XSAqIDEwICAgICAgICAgIyBhZGQgYSBsaXN0CisKKyAgICAgICAgICAgIGluc3QgPSBEYXRhQ2xhc3MoKSAgICAgICAgICAgICMgYWRkIGFuIGluc3RhbmNlCisgICAgICAgICAgICBpbnN0LlMgPSAxMCAqIHgKKyAgICAgICAgICAgIGluc3QuSSA9IG9yZCh4KQorICAgICAgICAgICAgaW5zdC5MID0gW3hdICogMTAKKyAgICAgICAgICAgIGRbc2VsZi5taygnTycgKyB4KV0gPSBpbnN0CisKKworICAgICMgb3ZlcnJpZGFibGUgaW4gZGVyaXZlZCBjbGFzc2VzIHRvIGFmZmVjdCBob3cgdGhlIHNoZWxmIGlzIGNyZWF0ZWQvb3BlbmVkCisgICAgZGVmIGRvX29wZW4oc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGRic2hlbHZlLm9wZW4oc2VsZi5maWxlbmFtZSkKKworICAgICMgYW5kIGNsb3NlZC4uLgorICAgIGRlZiBkb19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5kLmNsb3NlKCkKKworCisKKyAgICBkZWYgdGVzdDAxX2Jhc2ljcyhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAxX2Jhc2ljcy4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHNlbGYucG9wdWxhdGVEQihzZWxmLmQpCisgICAgICAgIHNlbGYuZC5zeW5jKCkKKyAgICAgICAgc2VsZi5kb19jbG9zZSgpCisgICAgICAgIHNlbGYuZG9fb3BlbigpCisgICAgICAgIGQgPSBzZWxmLmQKKworICAgICAgICBsID0gbGVuKGQpCisgICAgICAgIGsgPSBkLmtleXMoKQorICAgICAgICBzID0gZC5zdGF0KCkKKyAgICAgICAgZiA9IGQuZmQoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAibGVuZ3RoOiIsIGwKKyAgICAgICAgICAgIHByaW50ICJrZXlzOiIsIGsKKyAgICAgICAgICAgIHByaW50ICJzdGF0czoiLCBzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBkLmhhc19rZXkoc2VsZi5taygnYmFkIGtleScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBkLmhhc19rZXkoc2VsZi5taygnSUEnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZC5oYXNfa2V5KHNlbGYubWsoJ09BJykpKQorCisgICAgICAgIGQuZGVsZXRlKHNlbGYubWsoJ0lBJykpCisgICAgICAgIGRlbCBkW3NlbGYubWsoJ09BJyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZC5oYXNfa2V5KHNlbGYubWsoJ0lBJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGQuaGFzX2tleShzZWxmLm1rKCdPQScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIGwtMikKKworICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBmb3Iga2V5IGluIGQua2V5cygpOgorICAgICAgICAgICAgdmFsdWUgPSBkW2tleV0KKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICIlczogJXMiICUgKGtleSwgdmFsdWUpCisgICAgICAgICAgICBzZWxmLmNoZWNrcmVjKGtleSwgdmFsdWUpCisKKyAgICAgICAgZGJ2YWx1ZXMgPSBkLnZhbHVlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRidmFsdWVzKSwgbGVuKGQua2V5cygpKSkKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICB2YWx1ZXMuc29ydCgpCisgICAgICAgICAgICBkYnZhbHVlcy5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBkYnZhbHVlcykKKyAgICAgICAgZWxzZSA6ICAjIFhYWDogQ29udmVydCBhbGwgdG8gc3RyaW5ncy4gUGxlYXNlLCBpbXByb3ZlCisgICAgICAgICAgICB2YWx1ZXMuc29ydChrZXk9bGFtYmRhIHggOiBzdHIoeCkpCisgICAgICAgICAgICBkYnZhbHVlcy5zb3J0KGtleT1sYW1iZGEgeCA6IHN0cih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih2YWx1ZXMpLCByZXByKGRidmFsdWVzKSkKKworICAgICAgICBpdGVtcyA9IGQuaXRlbXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdGVtcyksIGxlbih2YWx1ZXMpKQorCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGl0ZW1zOgorICAgICAgICAgICAgc2VsZi5jaGVja3JlYyhrZXksIHZhbHVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoc2VsZi5taygnYmFkIGtleScpKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLm1rKCdiYWQga2V5JyksIE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYubWsoJ2JhZCBrZXknKSwgJ2Egc3RyaW5nJyksICdhIHN0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoc2VsZi5taygnYmFkIGtleScpLCBbMSwgMiwgM10pLCBbMSwgMiwgM10pCisKKyAgICAgICAgZC5zZXRfZ2V0X3JldHVybnNfbm9uZSgwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQk5vdEZvdW5kRXJyb3IsIGQuZ2V0LCBzZWxmLm1rKCdiYWQga2V5JykpCisgICAgICAgIGQuc2V0X2dldF9yZXR1cm5zX25vbmUoMSkKKworICAgICAgICBkLnB1dChzZWxmLm1rKCduZXcga2V5JyksICduZXcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoc2VsZi5taygnbmV3IGtleScpKSwgJ25ldyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW3NlbGYubWsoJ25ldyBrZXknKV0sICduZXcgZGF0YScpCisKKworCisgICAgZGVmIHRlc3QwMl9jdXJzb3JzKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDJfY3Vyc29ycy4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHNlbGYucG9wdWxhdGVEQihzZWxmLmQpCisgICAgICAgIGQgPSBzZWxmLmQKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgYyA9IGQuY3Vyc29yKCkKKyAgICAgICAgcmVjID0gYy5maXJzdCgpCisgICAgICAgIHdoaWxlIHJlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAga2V5LCB2YWx1ZSA9IHJlYworICAgICAgICAgICAgc2VsZi5jaGVja3JlYyhrZXksIHZhbHVlKQorICAgICAgICAgICAgIyBIYWNrIHRvIGF2b2lkIGNvbnZlcnNpb24gYnkgMnRvMyB0b29sCisgICAgICAgICAgICByZWMgPSBnZXRhdHRyKGMsICJuZXh0IikoKQorICAgICAgICBkZWwgYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGxlbihkKSkKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgYyA9IGQuY3Vyc29yKCkKKyAgICAgICAgcmVjID0gYy5sYXN0KCkKKyAgICAgICAgd2hpbGUgcmVjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICBrZXksIHZhbHVlID0gcmVjCisgICAgICAgICAgICBzZWxmLmNoZWNrcmVjKGtleSwgdmFsdWUpCisgICAgICAgICAgICByZWMgPSBjLnByZXYoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGxlbihkKSkKKworICAgICAgICBjLnNldChzZWxmLm1rKCdTUycpKQorICAgICAgICBrZXksIHZhbHVlID0gYy5jdXJyZW50KCkKKyAgICAgICAgc2VsZi5jaGVja3JlYyhrZXksIHZhbHVlKQorICAgICAgICBkZWwgYworCisKKyAgICBkZWYgdGVzdDAzX2FwcGVuZChzZWxmKToKKyAgICAgICAgIyBOT1RFOiB0aGlzIGlzIG92ZXJyaWRkZW4gaW4gUkVDTk8gc3ViY2xhc3MsIGRvbid0IGNoYW5nZSBpdHMgbmFtZS4KKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAzX2FwcGVuZC4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRic2hlbHZlLkRCU2hlbHZlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZC5hcHBlbmQsICd1bml0IHRlc3Qgd2FzIGhlcmUnKQorCisKKyAgICBkZWYgdGVzdDA0X2l0ZXJhYmxlKHNlbGYpIDoKKyAgICAgICAgc2VsZi5wb3B1bGF0ZURCKHNlbGYuZCkKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICBrZXlzID0gZC5rZXlzKCkKKyAgICAgICAga2V5c2V0ID0gc2V0KGtleXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXNldCksIGxlbihrZXlzKSkKKworICAgICAgICBmb3Iga2V5IGluIGQgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrZXksIGtleXNldCkKKyAgICAgICAgICAgIGtleXNldC5yZW1vdmUoa2V5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzZXQpLCAwKQorCisgICAgZGVmIGNoZWNrcmVjKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAjIG92ZXJyaWRlIHRoaXMgaW4gYSBzdWJjbGFzcyBpZiB0aGUga2V5IHR5cGUgaXMgZGlmZmVyZW50CisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzIDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBieXRlcykgOgorICAgICAgICAgICAgICAgIGtleSA9IGtleS5kZWNvZGUoImlzbzg4NTktMSIpICAjIDggYml0cworCisgICAgICAgIHggPSBrZXlbMV0KKyAgICAgICAgaWYga2V5WzBdID09ICdTJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIDEwICogeCkKKworICAgICAgICBlbGlmIGtleVswXSA9PSAnSSc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBvcmQoeCkpCisKKyAgICAgICAgZWxpZiBrZXlbMF0gPT0gJ0wnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgbGlzdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIFt4XSAqIDEwKQorCisgICAgICAgIGVsaWYga2V5WzBdID09ICdPJzoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgICAgICBmcm9tIHR5cGVzIGltcG9ydCBJbnN0YW5jZVR5cGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBJbnN0YW5jZVR5cGUpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBEYXRhQ2xhc3MpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUuUywgMTAgKiB4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5JLCBvcmQoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLkwsIFt4XSAqIDEwKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCwgJ1Vua25vd24ga2V5IHR5cGUsIGZpeCB0aGUgdGVzdCcpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJhc2ljU2hlbHZlVGVzdENhc2UoREJTaGVsdmVUZXN0Q2FzZSk6CisgICAgZGVmIGRvX29wZW4oc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGRic2hlbHZlLkRCU2hlbGYoKQorICAgICAgICBzZWxmLmQub3BlbihzZWxmLmZpbGVuYW1lLCBzZWxmLmRidHlwZSwgc2VsZi5kYmZsYWdzKQorCisgICAgZGVmIGRvX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmQuY2xvc2UoKQorCisKK2NsYXNzIEJUcmVlU2hlbHZlVGVzdENhc2UoQmFzaWNTaGVsdmVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFCisKKworY2xhc3MgSGFzaFNoZWx2ZVRlc3RDYXNlKEJhc2ljU2hlbHZlVGVzdENhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFCisKKworY2xhc3MgVGhyZWFkQlRyZWVTaGVsdmVUZXN0Q2FzZShCYXNpY1NoZWx2ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorICAgIGRiZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQKKworCitjbGFzcyBUaHJlYWRIYXNoU2hlbHZlVGVzdENhc2UoQmFzaWNTaGVsdmVUZXN0Q2FzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorICAgIGRiZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBCYXNpY0VudlNoZWx2ZVRlc3RDYXNlKERCU2hlbHZlVGVzdENhc2UpOgorICAgIGRlZiBkb19vcGVuKHNlbGYpOgorICAgICAgICBzZWxmLmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5lbnYub3BlbihzZWxmLmhvbWVEaXIsCisgICAgICAgICAgICAgICAgc2VsZi5lbnZmbGFncyB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5maWxlbmFtZSlbMV0KKyAgICAgICAgc2VsZi5kID0gZGJzaGVsdmUuREJTaGVsZihzZWxmLmVudikKKyAgICAgICAgc2VsZi5kLm9wZW4oc2VsZi5maWxlbmFtZSwgc2VsZi5kYnR5cGUsIHNlbGYuZGJmbGFncykKKworCisgICAgZGVmIGRvX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmQuY2xvc2UoKQorICAgICAgICBzZWxmLmVudi5jbG9zZSgpCisKKworICAgIGRlZiBzZXRVcChzZWxmKSA6CisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIERCU2hlbHZlVGVzdENhc2Uuc2V0VXAoc2VsZikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA+PSAzIDoKKyAgICAgICAgICAgIGZyb20gdGVzdF9hbGwgaW1wb3J0IGRvX3Byb3h5X2RiX3B5M2sKKyAgICAgICAgICAgIGRvX3Byb3h5X2RiX3B5M2soc2VsZi5fZmxhZ19wcm94eV9kYl9weTNrKQorICAgICAgICBzZWxmLmRvX2Nsb3NlKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKworY2xhc3MgRW52QlRyZWVTaGVsdmVUZXN0Q2FzZShCYXNpY0VudlNoZWx2ZVRlc3RDYXNlKToKKyAgICBlbnZmbGFncyA9IDAKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorICAgIGRiZmxhZ3MgPSBkYi5EQl9DUkVBVEUKKworCitjbGFzcyBFbnZIYXNoU2hlbHZlVGVzdENhc2UoQmFzaWNFbnZTaGVsdmVUZXN0Q2FzZSk6CisgICAgZW52ZmxhZ3MgPSAwCisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorICAgIGRiZmxhZ3MgPSBkYi5EQl9DUkVBVEUKKworCitjbGFzcyBFbnZUaHJlYWRCVHJlZVNoZWx2ZVRlc3RDYXNlKEJhc2ljRW52U2hlbHZlVGVzdENhc2UpOgorICAgIGVudmZsYWdzID0gZGIuREJfVEhSRUFECisgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKKyAgICBkYmZsYWdzID0gZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFECisKKworY2xhc3MgRW52VGhyZWFkSGFzaFNoZWx2ZVRlc3RDYXNlKEJhc2ljRW52U2hlbHZlVGVzdENhc2UpOgorICAgIGVudmZsYWdzID0gZGIuREJfVEhSRUFECisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorICAgIGRiZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0ZXN0IGNhc2VzIGZvciBhIERCU2hlbGYgaW4gYSBSRUNOTyBEQi4KKworY2xhc3MgUmVjTm9TaGVsdmVUZXN0Q2FzZShCYXNpY1NoZWx2ZVRlc3RDYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9SRUNOTworICAgIGRiZmxhZ3MgPSBkYi5EQl9DUkVBVEUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgQmFzaWNTaGVsdmVUZXN0Q2FzZS5zZXRVcChzZWxmKQorCisgICAgICAgICMgcG9vbCB0byBhc3NpZ24gaW50ZWdlciBrZXkgdmFsdWVzIG91dCBvZgorICAgICAgICBzZWxmLmtleV9wb29sID0gbGlzdChyYW5nZSgxLCA1MDAwKSkKKyAgICAgICAgc2VsZi5rZXlfbWFwID0ge30gICAgICMgbWFwIHN0cmluZyBrZXlzIHRvIHRoZSBudW1iZXIgd2UgZ2F2ZSB0aGVtCisgICAgICAgIHNlbGYuaW50a2V5X21hcCA9IHt9ICAjIHJldmVyc2UgbWFwIG9mIGFib3ZlCisKKyAgICBkZWYgbWsoc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLmtleV9tYXA6CisgICAgICAgICAgICBzZWxmLmtleV9tYXBba2V5XSA9IHNlbGYua2V5X3Bvb2wucG9wKDApCisgICAgICAgICAgICBzZWxmLmludGtleV9tYXBbc2VsZi5rZXlfbWFwW2tleV1dID0ga2V5CisgICAgICAgIHJldHVybiBzZWxmLmtleV9tYXBba2V5XQorCisgICAgZGVmIGNoZWNrcmVjKHNlbGYsIGludGtleSwgdmFsdWUpOgorICAgICAgICBrZXkgPSBzZWxmLmludGtleV9tYXBbaW50a2V5XQorICAgICAgICBCYXNpY1NoZWx2ZVRlc3RDYXNlLmNoZWNrcmVjKHNlbGYsIGtleSwgdmFsdWUpCisKKyAgICBkZWYgdGVzdDAzX2FwcGVuZChzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAzX2FwcGVuZC4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHNlbGYuZFsxXSA9ICdzcGFtJworICAgICAgICBzZWxmLmRbNV0gPSAnZWdncycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLmQuYXBwZW5kKCdzcGFtJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgc2VsZi5kLmFwcGVuZCgnYmFrZWQgYmVhbnMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnc3BhbScsIHNlbGYuZC5nZXQoNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3NwYW0nLCBzZWxmLmQuZ2V0KDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdiYWtlZCBiZWFucycsIHNlbGYuZC5nZXQoNykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2VnZ3MnLCBzZWxmLmQuZ2V0KDUpKQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJTaGVsdmVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVTaGVsdmVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSGFzaFNoZWx2ZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRCVHJlZVNoZWx2ZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUaHJlYWRIYXNoU2hlbHZlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEVudkJUcmVlU2hlbHZlVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEVudkhhc2hTaGVsdmVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoRW52VGhyZWFkQlRyZWVTaGVsdmVUZXN0Q2FzZSkpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoRW52VGhyZWFkSGFzaFNoZWx2ZVRlc3RDYXNlKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShSZWNOb1NoZWx2ZVRlc3RDYXNlKSkKKworICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZjkxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnNoZWx2ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZjkxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Ric2hlbHZlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzEzODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9kYnRhYmxlcy5weQpAQCAtMCwwICsxLDQwOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQSB0ZXN0IHN1aXRlIGZvciB0aGUgdGFibGUgaW50ZXJmYWNlIGJ1aWx0IG9uIGJzZGRiLmRiCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDAwLCAyMDAxIGJ5IEF1dG9ub21vdXMgWm9uZSBJbmR1c3RyaWVzCisjIENvcHlyaWdodCAoQykgMjAwMiBHcmVnb3J5IFAuIFNtaXRoCisjCisjIE1hcmNoIDIwLCAyMDAwCisjCisjIExpY2Vuc2U6ICAgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLiAgWW91IG1heSB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisjICAgICAgICAgICAgICAgcHVycG9zZSBpbmNsdWRpbmcgbW9kaWZpY2F0aW9uL3JlZGlzdHJpYnV0aW9uLCBzbyBsb25nIGFzCisjICAgICAgICAgICAgICAgdGhpcyBoZWFkZXIgcmVtYWlucyBpbnRhY3QgYW5kIHRoYXQgeW91IGRvIG5vdCBjbGFpbSBhbnkKKyMgICAgICAgICAgICAgICByaWdodHMgb2Ygb3duZXJzaGlwIG9yIGF1dGhvcnNoaXAgb2YgdGhpcyBzb2Z0d2FyZS4gIFRoaXMKKyMgICAgICAgICAgICAgICBzb2Z0d2FyZSBoYXMgYmVlbiB0ZXN0ZWQsIGJ1dCBubyB3YXJyYW50eSBpcyBleHByZXNzZWQgb3IKKyMgICAgICAgICAgICAgICBpbXBsaWVkLgorIworIyAgIC0tICBHcmVnb3J5IFAuIFNtaXRoIDxncmVnQGtyeXB0by5vcmc+CisjCisjICRJZCQKKworaW1wb3J0IG9zLCByZSwgc3lzCisKK2lmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjUGlja2xlCisgICAgICAgIHBpY2tsZSA9IGNQaWNrbGUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGltcG9ydCBwaWNrbGUKK2Vsc2UgOgorICAgIGltcG9ydCBwaWNrbGUKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgZGJ0YWJsZXMsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgXAorICAgICAgICBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUYWJsZURCVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRiX25hbWUgPSAndGVzdC10YWJsZS5kYicKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgICAgICAgICAgZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZG9fcHJveHlfZGJfcHkzaworICAgICAgICAgICAgc2VsZi5fZmxhZ19wcm94eV9kYl9weTNrID0gZG9fcHJveHlfZGJfcHkzayhGYWxzZSkKKworICAgICAgICBzZWxmLnRlc3RIb21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi50ZGIgPSBkYnRhYmxlcy5ic2RUYWJsZURCKAorICAgICAgICAgICAgZmlsZW5hbWU9J3RhYmxldGVzdC5kYicsIGRiaG9tZT1zZWxmLnRlc3RIb21lRGlyLCBjcmVhdGU9MSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ZGIuY2xvc2UoKQorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMyA6CisgICAgICAgICAgICBmcm9tIHRlc3RfYWxsIGltcG9ydCBkb19wcm94eV9kYl9weTNrCisgICAgICAgICAgICBkb19wcm94eV9kYl9weTNrKHNlbGYuX2ZsYWdfcHJveHlfZGJfcHkzaykKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLnRlc3RIb21lRGlyKQorCisgICAgZGVmIHRlc3QwMShzZWxmKToKKyAgICAgICAgdGFibmFtZSA9ICJ0ZXN0MDEiCisgICAgICAgIGNvbG5hbWUgPSAnY29vbCBudW1iZXJzJworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRkYi5Ecm9wKHRhYm5hbWUpCisgICAgICAgIGV4Y2VwdCBkYnRhYmxlcy5UYWJsZURCRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGRiLkNyZWF0ZVRhYmxlKHRhYm5hbWUsIFtjb2xuYW1lXSkKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwge2NvbG5hbWU6IHBpY2tsZS5kdW1wcygzLjE0MTU5LCAxKX0pCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHtjb2xuYW1lOiBwaWNrbGUuZHVtcHMoMy4xNDE1OSwKKyAgICAgICAgICAgICAgICAxKS5kZWNvZGUoImlzbzg4NTktMSIpfSkgICMgOCBiaXRzCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHNlbGYudGRiLl9kYl9wcmludCgpCisKKyAgICAgICAgdmFsdWVzID0gc2VsZi50ZGIuU2VsZWN0KAorICAgICAgICAgICAgdGFibmFtZSwgW2NvbG5hbWVdLCBjb25kaXRpb25zPXtjb2xuYW1lOiBOb25lfSkKKworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIGNvbHZhbCA9IHBpY2tsZS5sb2Fkcyh2YWx1ZXNbMF1bY29sbmFtZV0pCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgY29sdmFsID0gcGlja2xlLmxvYWRzKGJ5dGVzKHZhbHVlc1swXVtjb2xuYW1lXSwgImlzbzg4NTktMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sdmFsID4gMy4xNDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2x2YWwgPCAzLjE0MikKKworCisgICAgZGVmIHRlc3QwMihzZWxmKToKKyAgICAgICAgdGFibmFtZSA9ICJ0ZXN0MDIiCisgICAgICAgIGNvbDAgPSAnY29vbG5lc3MgZmFjdG9yJworICAgICAgICBjb2wxID0gJ2J1dCBjYW4gaXQgZmx5PycKKyAgICAgICAgY29sMiA9ICdTcGVjaWVzJworCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgdGVzdGluZm8gPSBbCisgICAgICAgICAgICAgICAge2NvbDA6IHBpY2tsZS5kdW1wcyg4LCAxKSwgY29sMTogJ25vJywgY29sMjogJ1Blbmd1aW4nfSwKKyAgICAgICAgICAgICAgICB7Y29sMDogcGlja2xlLmR1bXBzKC0xLCAxKSwgY29sMTogJ25vJywgY29sMjogJ1R1cmtleSd9LAorICAgICAgICAgICAgICAgIHtjb2wwOiBwaWNrbGUuZHVtcHMoOSwgMSksIGNvbDE6ICd5ZXMnLCBjb2wyOiAnU1ItNzFBIEJsYWNrYmlyZCd9CisgICAgICAgICAgICBdCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgdGVzdGluZm8gPSBbCisgICAgICAgICAgICAgICAge2NvbDA6IHBpY2tsZS5kdW1wcyg4LCAxKS5kZWNvZGUoImlzbzg4NTktMSIpLAorICAgICAgICAgICAgICAgICAgICBjb2wxOiAnbm8nLCBjb2wyOiAnUGVuZ3Vpbid9LAorICAgICAgICAgICAgICAgIHtjb2wwOiBwaWNrbGUuZHVtcHMoLTEsIDEpLmRlY29kZSgiaXNvODg1OS0xIiksCisgICAgICAgICAgICAgICAgICAgIGNvbDE6ICdubycsIGNvbDI6ICdUdXJrZXknfSwKKyAgICAgICAgICAgICAgICB7Y29sMDogcGlja2xlLmR1bXBzKDksIDEpLmRlY29kZSgiaXNvODg1OS0xIiksCisgICAgICAgICAgICAgICAgICAgIGNvbDE6ICd5ZXMnLCBjb2wyOiAnU1ItNzFBIEJsYWNrYmlyZCd9CisgICAgICAgICAgICBdCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuRHJvcCh0YWJuYW1lKQorICAgICAgICBleGNlcHQgZGJ0YWJsZXMuVGFibGVEQkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnRkYi5DcmVhdGVUYWJsZSh0YWJuYW1lLCBbY29sMCwgY29sMSwgY29sMl0pCisgICAgICAgIGZvciByb3cgaW4gdGVzdGluZm8gOgorICAgICAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHJvdykKKworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCh0YWJuYW1lLCBbY29sMl0sCisgICAgICAgICAgICAgICAgY29uZGl0aW9ucz17Y29sMDogbGFtYmRhIHg6IHBpY2tsZS5sb2Fkcyh4KSA+PSA4fSkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QodGFibmFtZSwgW2NvbDJdLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM9e2NvbDA6IGxhbWJkYSB4OgorICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZHMoYnl0ZXMoeCwgImlzbzg4NTktMSIpKSA+PSA4fSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAyKQorICAgICAgICBpZiB2YWx1ZXNbMF1bJ1NwZWNpZXMnXSA9PSAnUGVuZ3VpbicgOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMV1bJ1NwZWNpZXMnXSwgJ1NSLTcxQSBCbGFja2JpcmQnKQorICAgICAgICBlbGlmIHZhbHVlc1swXVsnU3BlY2llcyddID09ICdTUi03MUEgQmxhY2tiaXJkJyA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1sxXVsnU3BlY2llcyddLCAnUGVuZ3VpbicpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAidmFsdWVzPSAlciIgJSAodmFsdWVzLCkKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiV3JvbmcgdmFsdWVzIHJldHVybmVkISIpCisKKyAgICBkZWYgdGVzdDAzKHNlbGYpOgorICAgICAgICB0YWJuYW1lID0gInRlc3QwMyIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuRHJvcCh0YWJuYW1lKQorICAgICAgICBleGNlcHQgZGJ0YWJsZXMuVGFibGVEQkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJy4uLmJlZm9yZSBDcmVhdGVUYWJsZS4uLicKKyAgICAgICAgICAgIHNlbGYudGRiLl9kYl9wcmludCgpCisgICAgICAgIHNlbGYudGRiLkNyZWF0ZVRhYmxlKHRhYm5hbWUsIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ10pCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnLi4uYWZ0ZXIgQ3JlYXRlVGFibGUuLi4nCisgICAgICAgICAgICBzZWxmLnRkYi5fZGJfcHJpbnQoKQorICAgICAgICBzZWxmLnRkYi5Ecm9wKHRhYm5hbWUpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnLi4uYWZ0ZXIgRHJvcC4uLicKKyAgICAgICAgICAgIHNlbGYudGRiLl9kYl9wcmludCgpCisgICAgICAgIHNlbGYudGRiLkNyZWF0ZVRhYmxlKHRhYm5hbWUsIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ10pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJzogcGlja2xlLmR1bXBzKFt7NDo1LCA2Ojd9LCAnZm9vJ10sIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZic6ICJaZXJvIn0pCisgICAgICAgICAgICBzZWxmLmZhaWwoJ0V4cGVjdGVkIGFuIGV4Y2VwdGlvbicpCisgICAgICAgIGV4Y2VwdCBkYnRhYmxlcy5UYWJsZURCRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuU2VsZWN0KHRhYm5hbWUsIFtdLCBjb25kaXRpb25zPXsnZm9vJzogJzEyMyd9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCdFeHBlY3RlZCBhbiBleGNlcHRpb24nKQorICAgICAgICBleGNlcHQgZGJ0YWJsZXMuVGFibGVEQkVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogJzQyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYic6ICJiYWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICdjJzogIm1lZXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICdlJzogJ0Z1enp5IHd1enp5IHdhcyBhIGJlYXInfSkKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAnNTgxNzUwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYic6ICJnb29kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZCc6ICJibGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICdjJzogImJsYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ICdmdXp6eSB3YXMgaGVyZSd9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICc4MDAwMDAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICdiJzogImdvb2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICdkJzogImJsYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnOiAiYmxhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICdlJzogJ0Z1enp5IHd1enp5IGlzIGEgYmVhcid9KQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBzZWxmLnRkYi5fZGJfcHJpbnQoKQorCisgICAgICAgICMgdGhpcyBzaG91bGQgcmV0dXJuIHR3byByb3dzCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCh0YWJuYW1lLCBbJ2InLCAnYScsICdkJ10sCisgICAgICAgICAgICBjb25kaXRpb25zPXsnZSc6IHJlLmNvbXBpbGUoJ3d1enp5Jykuc2VhcmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2EnOiByZS5jb21waWxlKCdeWzAtOV0rJCcpLm1hdGNofSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMikKKworICAgICAgICAjIG5vdyBsZXRzIGRlbGV0ZSBvbmUgb2YgdGhlbSBhbmQgdHJ5IGFnYWluCisgICAgICAgIHNlbGYudGRiLkRlbGV0ZSh0YWJuYW1lLCBjb25kaXRpb25zPXsnYic6IGRidGFibGVzLkV4YWN0Q29uZCgnZ29vZCcpfSkKKyAgICAgICAgdmFsdWVzID0gc2VsZi50ZGIuU2VsZWN0KAorICAgICAgICAgICAgdGFibmFtZSwgWydhJywgJ2QnLCAnYiddLAorICAgICAgICAgICAgY29uZGl0aW9ucz17J2UnOiBkYnRhYmxlcy5QcmVmaXhDb25kKCdGdXp6eScpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ2QnXSwgTm9uZSkKKworICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QodGFibmFtZSwgWydiJ10sCisgICAgICAgICAgICBjb25kaXRpb25zPXsnYyc6IGxhbWJkYSBjOiBjID09ICdtZWVwJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydiJ10sICJiYWQiKQorCisKKyAgICBkZWYgdGVzdDA0X011bHRpQ29uZFNlbGVjdChzZWxmKToKKyAgICAgICAgdGFibmFtZSA9ICJ0ZXN0MDRfTXVsdGlDb25kU2VsZWN0IgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRkYi5Ecm9wKHRhYm5hbWUpCisgICAgICAgIGV4Y2VwdCBkYnRhYmxlcy5UYWJsZURCRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGRiLkNyZWF0ZVRhYmxlKHRhYm5hbWUsIFsnYScsICdiJywgJ2MnLCAnZCcsICdlJ10pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJzogcGlja2xlLmR1bXBzKFt7NDo1LCA2Ojd9LCAnZm9vJ10sIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZic6ICJaZXJvIn0pCisgICAgICAgICAgICBzZWxmLmZhaWwoJ0V4cGVjdGVkIGFuIGV4Y2VwdGlvbicpCisgICAgICAgIGV4Y2VwdCBkYnRhYmxlcy5UYWJsZURCRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHsnYSc6ICJBIiwgJ2InOiAiQiIsICdjJzogIkMiLCAnZCc6ICJEIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ICJFIn0pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J2EnOiAiLUEiLCAnYic6ICItQiIsICdjJzogIi1DIiwgJ2QnOiAiLUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJzogIi1FIn0pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J2EnOiAiQS0iLCAnYic6ICJCLSIsICdjJzogIkMtIiwgJ2QnOiAiRC0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJzogIkUtIn0pCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHNlbGYudGRiLl9kYl9wcmludCgpCisKKyAgICAgICAgIyBUaGlzIHNlbGVjdCBzaG91bGQgcmV0dXJuIDAgcm93cy4gIGl0IGlzIGRlc2lnbmVkIHRvIHRlc3QKKyAgICAgICAgIyB0aGUgYnVnIGlkZW50aWZpZWQgYW5kIGZpeGVkIGluIHNvdXJjZWZvcmdlIGJ1ZyAjIDU5MDQ0OQorICAgICAgICAjIChCaWcgVGhhbmtzIHRvICJSb2IgVGlsbG90c29uIChuOW10YikiIGZvciB0cmFja2luZyB0aGlzIGRvd24KKyAgICAgICAgIyBhbmQgc3VwcGx5aW5nIGEgZml4ISEgIFRoaXMgb25lIGNhdXNlZCBtYW55IGhlYWRhY2hlcyB0byBzYXkKKyAgICAgICAgIyB0aGUgbGVhc3QuLi4pCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCh0YWJuYW1lLCBbJ2InLCAnYScsICdkJ10sCisgICAgICAgICAgICBjb25kaXRpb25zPXsnZSc6IGRidGFibGVzLkV4YWN0Q29uZCgnRScpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2EnOiBkYnRhYmxlcy5FeGFjdENvbmQoJ0EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdkJzogZGJ0YWJsZXMuUHJlZml4Q29uZCgnLScpCisgICAgICAgICAgICAgICAgICAgICAgIH0gKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAwLCB2YWx1ZXMpCisKKworICAgIGRlZiB0ZXN0X0NyZWF0ZU9yRXh0ZW5kKHNlbGYpOgorICAgICAgICB0YWJuYW1lID0gInRlc3RfQ3JlYXRlT3JFeHRlbmQiCisKKyAgICAgICAgc2VsZi50ZGIuQ3JlYXRlT3JFeHRlbmRUYWJsZSgKKyAgICAgICAgICAgIHRhYm5hbWUsIFsnbmFtZScsICd0YXN0ZScsICdmaWxsaW5nJywgJ2FsY29ob2wgY29udGVudCcsICdwcmljZSddKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3Rhc3RlJzogJ2NyYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlsbGluZyc6ICdubycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcyBpdCBHdWlubmVzcz8nOiAnbm8nfSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiSW5zZXJ0IHNob3VsZCd2ZSBmYWlsZWQgZHVlIHRvIGJhZCBjb2x1bW4gbmFtZSIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi50ZGIuQ3JlYXRlT3JFeHRlbmRUYWJsZSh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbmFtZScsICd0YXN0ZScsICdpcyBpdCBHdWlubmVzcz8nXSkKKworICAgICAgICAjIHRoZXNlIHNob3VsZCBib3RoIHN1Y2NlZWQgYXMgdGhlIHRhYmxlIHNob3VsZCBjb250YWluIHRoZSB1bmlvbiBvZiBib3RoIHNldHMgb2YgY29sdW1ucy4KKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHsndGFzdGUnOiAnY3JhcCcsICdmaWxsaW5nJzogJ25vJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgaXQgR3Vpbm5lc3M/JzogJ25vJ30pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J3Rhc3RlJzogJ2dyZWF0JywgJ2ZpbGxpbmcnOiAneWVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMgaXQgR3Vpbm5lc3M/JzogJ3llcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnR3Vpbm5lc3MnfSkKKworCisgICAgZGVmIHRlc3RfQ29uZE9ianMoc2VsZik6CisgICAgICAgIHRhYm5hbWUgPSAidGVzdF9Db25kT2JqcyIKKworICAgICAgICBzZWxmLnRkYi5DcmVhdGVUYWJsZSh0YWJuYW1lLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdwJ10pCisKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHsnYSc6ICJ0aGUgbGV0dGVyIEEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJzogInRoZSBsZXR0ZXIgQiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnOiAiaXMgZm9yIGNvb2tpZSJ9KQorICAgICAgICBzZWxmLnRkYi5JbnNlcnQodGFibmFtZSwgeydhJzogImlzIGZvciBhYXJkdmFyayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2UnOiAidGhlIGxldHRlciBFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYyc6ICJpcyBmb3IgY29va2llIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCc6ICJpcyBmb3IgZG9nIn0pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J2EnOiAidGhlIGxldHRlciBBIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZSc6ICJ0aGUgbGV0dGVyIEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJzogImlzIGZvciBjb29raWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJzogImlzIGZvciBQeXRob24ifSkKKworICAgICAgICB2YWx1ZXMgPSBzZWxmLnRkYi5TZWxlY3QoCisgICAgICAgICAgICB0YWJuYW1lLCBbJ3AnLCAnZSddLAorICAgICAgICAgICAgY29uZGl0aW9ucz17J2UnOiBkYnRhYmxlcy5QcmVmaXhDb25kKCd0aGUgbCcpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMiwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnZSddLCB2YWx1ZXNbMV1bJ2UnXSwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHZhbHVlc1swXVsncCddLCB2YWx1ZXNbMV1bJ3AnXSwgdmFsdWVzKQorCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCgKKyAgICAgICAgICAgIHRhYm5hbWUsIFsnZCcsICdhJ10sCisgICAgICAgICAgICBjb25kaXRpb25zPXsnYSc6IGRidGFibGVzLkxpa2VDb25kKCclYWFyZHZhcmslJyl9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAxLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydkJ10sICJpcyBmb3IgZG9nIiwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnYSddLCAiaXMgZm9yIGFhcmR2YXJrIiwgdmFsdWVzKQorCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCh0YWJuYW1lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydiJzogZGJ0YWJsZXMuQ29uZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlJzpkYnRhYmxlcy5MaWtlQ29uZCgnJWxldHRlciUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYSc6ZGJ0YWJsZXMuUHJlZml4Q29uZCgnaXMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZCc6ZGJ0YWJsZXMuRXhhY3RDb25kKCdpcyBmb3IgZG9nJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2MnOmRidGFibGVzLlByZWZpeENvbmQoJ2lzIGZvcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwJzpsYW1iZGEgczogbm90IHN9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAxLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydkJ10sICJpcyBmb3IgZG9nIiwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnYSddLCAiaXMgZm9yIGFhcmR2YXJrIiwgdmFsdWVzKQorCisgICAgZGVmIHRlc3RfRGVsZXRlKHNlbGYpOgorICAgICAgICB0YWJuYW1lID0gInRlc3RfRGVsZXRlIgorICAgICAgICBzZWxmLnRkYi5DcmVhdGVUYWJsZSh0YWJuYW1lLCBbJ3gnLCAneScsICd6J10pCisKKyAgICAgICAgIyBwcmlvciB0byAyMDAxLTA1LTA5IHRoZXJlIHdhcyBhIGJ1ZyB3aGVyZSBEZWxldGUoKSB3b3VsZAorICAgICAgICAjIGZhaWwgaWYgaXQgZW5jb3VudGVyZWQgYW55IHJvd3MgdGhhdCBkaWQgbm90IGhhdmUgdmFsdWVzIGluCisgICAgICAgICMgZXZlcnkgY29sdW1uLgorICAgICAgICAjIEh1bnRlZCBhbmQgU3F1YXNoZWQgYnkgPERvbnd1bGZmPiAoSnVra2EgU2FudGFsYSAtIGRvbnd1bGZmQG5pYy5maSkKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHsneCc6ICdYMScsICd5JzonWTEnfSkKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHsneCc6ICdYMicsICd5JzonWTInLCAneic6ICdaMid9KQorCisgICAgICAgIHNlbGYudGRiLkRlbGV0ZSh0YWJuYW1lLCBjb25kaXRpb25zPXsneCc6IGRidGFibGVzLlByZWZpeENvbmQoJ1gnKX0pCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCh0YWJuYW1lLCBbJ3knXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM9eyd4JzogZGJ0YWJsZXMuUHJlZml4Q29uZCgnWCcpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgMCkKKworICAgIGRlZiB0ZXN0X01vZGlmeShzZWxmKToKKyAgICAgICAgdGFibmFtZSA9ICJ0ZXN0X01vZGlmeSIKKyAgICAgICAgc2VsZi50ZGIuQ3JlYXRlVGFibGUodGFibmFtZSwgWydOYW1lJywgJ1R5cGUnLCAnQWNjZXNzJ10pCisKKyAgICAgICAgc2VsZi50ZGIuSW5zZXJ0KHRhYm5hbWUsIHsnTmFtZSc6ICdJbmRleCB0byBNUDMgZmlsZXMuZG9jJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVHlwZSc6ICdXb3JkJywgJ0FjY2Vzcyc6ICc4J30pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J05hbWUnOiAnTmlmdHkuTVAzJywgJ0FjY2Vzcyc6ICcxJ30pCisgICAgICAgIHNlbGYudGRiLkluc2VydCh0YWJuYW1lLCB7J1R5cGUnOiAnVW5rbm93bicsICdBY2Nlc3MnOiAnMCd9KQorCisgICAgICAgIGRlZiBzZXRfdHlwZSh0eXBlKToKKyAgICAgICAgICAgIGlmIHR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ01QMycKKyAgICAgICAgICAgIHJldHVybiB0eXBlCisKKyAgICAgICAgZGVmIGluY3JlbWVudF9hY2Nlc3MoY291bnQpOgorICAgICAgICAgICAgcmV0dXJuIHN0cihpbnQoY291bnQpKzEpCisKKyAgICAgICAgZGVmIHJlbW92ZV92YWx1ZSh2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYudGRiLk1vZGlmeSh0YWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucz17J0FjY2Vzcyc6IGRidGFibGVzLkV4YWN0Q29uZCgnMCcpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzPXsnQWNjZXNzJzogcmVtb3ZlX3ZhbHVlfSkKKyAgICAgICAgc2VsZi50ZGIuTW9kaWZ5KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zPXsnTmFtZSc6IGRidGFibGVzLkxpa2VDb25kKCclTVAzJScpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzPXsnVHlwZSc6IHNldF90eXBlfSkKKyAgICAgICAgc2VsZi50ZGIuTW9kaWZ5KHRhYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zPXsnTmFtZSc6IGRidGFibGVzLkxpa2VDb25kKCclJyl9LAorICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3M9eydBY2Nlc3MnOiBpbmNyZW1lbnRfYWNjZXNzfSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRkYi5Nb2RpZnkodGFibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zPXsnTmFtZSc6IGRidGFibGVzLkxpa2VDb25kKCclJyl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzPXsnQWNjZXNzJzogJ1doYXQgaXMgeW91ciBxdWVzdD8nfSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICMgc3VjY2VzcywgdGhlIHN0cmluZyB2YWx1ZSBpbiBtYXBwaW5ncyBpc24ndCBjYWxsYWJsZQorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAid2h5IHdhcyBUeXBlRXJyb3Igbm90IHJhaXNlZCBmb3IgYmFkIGNhbGxhYmxlPyIKKworICAgICAgICAjIERlbGV0ZSBrZXkgaW4gc2VsZWN0IGNvbmRpdGlvbnMKKyAgICAgICAgdmFsdWVzID0gc2VsZi50ZGIuU2VsZWN0KAorICAgICAgICAgICAgdGFibmFtZSwgTm9uZSwKKyAgICAgICAgICAgIGNvbmRpdGlvbnM9eydUeXBlJzogZGJ0YWJsZXMuRXhhY3RDb25kKCdVbmtub3duJyl9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAxLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydOYW1lJ10sIE5vbmUsIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ0FjY2VzcyddLCBOb25lLCB2YWx1ZXMpCisKKyAgICAgICAgIyBNb2RpZnkgdmFsdWUgYnkgc2VsZWN0IGNvbmRpdGlvbnMKKyAgICAgICAgdmFsdWVzID0gc2VsZi50ZGIuU2VsZWN0KAorICAgICAgICAgICAgdGFibmFtZSwgTm9uZSwKKyAgICAgICAgICAgIGNvbmRpdGlvbnM9eydOYW1lJzogZGJ0YWJsZXMuRXhhY3RDb25kKCdOaWZ0eS5NUDMnKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIDEsIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ1R5cGUnXSwgIk1QMyIsIHZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXNbMF1bJ0FjY2VzcyddLCAiMiIsIHZhbHVlcykKKworICAgICAgICAjIE1ha2Ugc3VyZSBjaGFuZ2UgYXBwbGllZCBvbmx5IHRvIHNlbGVjdCBjb25kaXRpb25zCisgICAgICAgIHZhbHVlcyA9IHNlbGYudGRiLlNlbGVjdCgKKyAgICAgICAgICAgIHRhYm5hbWUsIE5vbmUsIGNvbmRpdGlvbnM9eydOYW1lJzogZGJ0YWJsZXMuTGlrZUNvbmQoJyVkb2MlJyl9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAxLCB2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzWzBdWydUeXBlJ10sICJXb3JkIiwgdmFsdWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1swXVsnQWNjZXNzJ10sICI5IiwgdmFsdWVzKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRhYmxlREJUZXN0Q2FzZSkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZjNWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2RidGFibGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmZjNWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGJ0YWJsZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDU4NTc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGlzdHJpYnV0ZWRfdHJhbnNhY3Rpb25zLnB5CkBAIC0wLDAgKzEsMTUyIEBACisiIiJUZXN0Q2FzZXMgZm9yIGRpc3RyaWJ1dGVkIHRyYW5zYWN0aW9ucy4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdGVzdF9zdXBwb3J0LCBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIFwKKyAgICAgICAgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IHZlcmJvc2UKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgREJUeG5fZGlzdHJpYnV0ZWQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG51bV90eG5zPTEyMzQKKyAgICBub3N5bmM9VHJ1ZQorICAgIG11c3Rfb3Blbl9kYj1GYWxzZQorICAgIGRlZiBfY3JlYXRlX2VudihzZWxmLCBtdXN0X29wZW5fZGIpIDoKKyAgICAgICAgc2VsZi5kYmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5kYmVudi5zZXRfdHhfbWF4KHNlbGYubnVtX3R4bnMpCisgICAgICAgIHNlbGYuZGJlbnYuc2V0X2xrX21heF9sb2NrZXJzKHNlbGYubnVtX3R4bnMqMikKKyAgICAgICAgc2VsZi5kYmVudi5zZXRfbGtfbWF4X2xvY2tzKHNlbGYubnVtX3R4bnMqMikKKyAgICAgICAgc2VsZi5kYmVudi5zZXRfbGtfbWF4X29iamVjdHMoc2VsZi5udW1fdHhucyoyKQorICAgICAgICBpZiBzZWxmLm5vc3luYyA6CisgICAgICAgICAgICBzZWxmLmRiZW52LnNldF9mbGFncyhkYi5EQl9UWE5fTk9TWU5DLFRydWUpCisgICAgICAgIHNlbGYuZGJlbnYub3BlbihzZWxmLmhvbWVEaXIsIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCB8CisgICAgICAgICAgICAgICAgZGIuREJfUkVDT1ZFUiB8CisgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9UWE4gfCBkYi5EQl9JTklUX0xPRyB8IGRiLkRCX0lOSVRfTVBPT0wgfAorICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfTE9DSywgMDY2NikKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKHNlbGYuZGJlbnYpCisgICAgICAgIHNlbGYuZGIuc2V0X3JlX2xlbihkYi5EQl9HSURfU0laRSkKKyAgICAgICAgaWYgbXVzdF9vcGVuX2RiIDoKKyAgICAgICAgICAgIHR4bj1zZWxmLmRiZW52LnR4bl9iZWdpbigpCisgICAgICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfUVVFVUUsIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCwgMDY2NiwKKyAgICAgICAgICAgICAgICAgICAgdHhuPXR4bikKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorCisgICAgZGVmIHNldFVwKHNlbGYpIDoKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9ICJ0ZXN0IgorICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX2VudihtdXN0X29wZW5fZGI9VHJ1ZSkKKworICAgIGRlZiBfZGVzdHJveV9lbnYoc2VsZik6CisgICAgICAgIGlmIHNlbGYubm9zeW5jIG9yIChkYi52ZXJzaW9uKClbOjJdID09ICg0LDYpKTogICMgS25vd24gYnVnCisgICAgICAgICAgICBzZWxmLmRiZW52LmxvZ19mbHVzaCgpCisgICAgICAgIHNlbGYuZGIuY2xvc2UoKQorICAgICAgICBzZWxmLmRiZW52LmNsb3NlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fZGVzdHJveV9lbnYoKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiBfcmVjcmVhdGVfZW52KHNlbGYsbXVzdF9vcGVuX2RiKSA6CisgICAgICAgIHNlbGYuX2Rlc3Ryb3lfZW52KCkKKyAgICAgICAgc2VsZi5fY3JlYXRlX2VudihtdXN0X29wZW5fZGIpCisKKyAgICBkZWYgdGVzdDAxX2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucyhzZWxmKSA6CisgICAgICAgIHR4bnM9c2V0KCkKKyAgICAgICAgYWRhcHQgPSBsYW1iZGEgeCA6IHgKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdID49IDMgOgorICAgICAgICAgICAgYWRhcHQgPSBsYW1iZGEgeCA6IGJ5dGVzKHgsICJhc2NpaSIpCisgICAgIyBDcmVhdGUgdHJhbnNhY3Rpb25zLCAicHJlcGFyZSIgdGhlbSwgYW5kCisgICAgIyBsZXQgdGhlbSBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYubnVtX3R4bnMpIDoKKyAgICAgICAgICAgIHR4biA9IHNlbGYuZGJlbnYudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIGdpZCA9ICIlJSVkZCIgJWRiLkRCX0dJRF9TSVpFCisgICAgICAgICAgICBnaWQgPSBhZGFwdChnaWQgJWkpCisgICAgICAgICAgICBzZWxmLmRiLnB1dChpLCBnaWQsIHR4bj10eG4sIGZsYWdzPWRiLkRCX0FQUEVORCkKKyAgICAgICAgICAgIHR4bnMuYWRkKGdpZCkKKyAgICAgICAgICAgIHR4bi5wcmVwYXJlKGdpZCkKKyAgICAgICAgZGVsIHR4bgorCisgICAgICAgIHNlbGYuX3JlY3JlYXRlX2VudihzZWxmLm11c3Rfb3Blbl9kYikKKworICAgICMgR2V0ICJ0byBiZSByZWNvdmVyZWQiIHRyYW5zYWN0aW9ucyBidXQKKyAgICAjIGxldCB0aGVtIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgorICAgICAgICByZWNvdmVyZWRfdHhucz1zZWxmLmRiZW52LnR4bl9yZWNvdmVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm51bV90eG5zLGxlbihyZWNvdmVyZWRfdHhucykpCisgICAgICAgIGZvciBnaWQsdHhuIGluIHJlY292ZXJlZF90eG5zIDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnaWQgaW4gdHhucykKKyAgICAgICAgZGVsIHR4bgorICAgICAgICBkZWwgcmVjb3ZlcmVkX3R4bnMKKworICAgICAgICBzZWxmLl9yZWNyZWF0ZV9lbnYoc2VsZi5tdXN0X29wZW5fZGIpCisKKyAgICAjIEdldCAidG8gYmUgcmVjb3ZlcmVkIiB0cmFuc2FjdGlvbnMuIENvbW1pdCwgYWJvcnQgYW5kCisgICAgIyBkaXNjYXJkIHRoZW0uCisgICAgICAgIHJlY292ZXJlZF90eG5zPXNlbGYuZGJlbnYudHhuX3JlY292ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnVtX3R4bnMsbGVuKHJlY292ZXJlZF90eG5zKSkKKyAgICAgICAgZGlzY2FyZF90eG5zPXNldCgpCisgICAgICAgIGNvbW1pdHRlZF90eG5zPXNldCgpCisgICAgICAgIHN0YXRlPTAKKyAgICAgICAgZm9yIGdpZCx0eG4gaW4gcmVjb3ZlcmVkX3R4bnMgOgorICAgICAgICAgICAgaWYgc3RhdGU9PTAgb3Igc3RhdGU9PTE6CisgICAgICAgICAgICAgICAgY29tbWl0dGVkX3R4bnMuYWRkKGdpZCkKKyAgICAgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIGVsaWYgc3RhdGU9PTIgOgorICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICBlbGlmIHN0YXRlPT0zIDoKKyAgICAgICAgICAgICAgICB0eG4uZGlzY2FyZCgpCisgICAgICAgICAgICAgICAgZGlzY2FyZF90eG5zLmFkZChnaWQpCisgICAgICAgICAgICAgICAgc3RhdGU9LTEKKyAgICAgICAgICAgIHN0YXRlKz0xCisgICAgICAgIGRlbCB0eG4KKyAgICAgICAgZGVsIHJlY292ZXJlZF90eG5zCisKKyAgICAgICAgc2VsZi5fcmVjcmVhdGVfZW52KHNlbGYubXVzdF9vcGVuX2RiKQorCisgICAgIyBWZXJpZnkgdGhlIGRpc2NhcmRlZCB0cmFuc2FjdGlvbnMgYXJlIHN0aWxsCisgICAgIyBhcm91bmQsIGFuZCBkaXNwb3NlIHRoZW0uCisgICAgICAgIHJlY292ZXJlZF90eG5zPXNlbGYuZGJlbnYudHhuX3JlY292ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXNjYXJkX3R4bnMpLGxlbihyZWNvdmVyZWRfdHhucykpCisgICAgICAgIGZvciBnaWQsdHhuIGluIHJlY292ZXJlZF90eG5zIDoKKyAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgIGRlbCB0eG4KKyAgICAgICAgZGVsIHJlY292ZXJlZF90eG5zCisKKyAgICAgICAgc2VsZi5fcmVjcmVhdGVfZW52KG11c3Rfb3Blbl9kYj1UcnVlKQorCisgICAgIyBCZSBzdXJlIHRoZXJlIGFyZSBub3QgcGVuZGluZyB0cmFuc2FjdGlvbnMuCisgICAgIyBDaGVjayBhbHNvIGRhdGFiYXNlIHNpemUuCisgICAgICAgIHJlY292ZXJlZF90eG5zPXNlbGYuZGJlbnYudHhuX3JlY292ZXIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlY292ZXJlZF90eG5zKT09MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29tbWl0dGVkX3R4bnMpLHNlbGYuZGIuc3RhdCgpWyJua2V5cyJdKQorCitjbGFzcyBEQlR4bl9kaXN0cmlidXRlZFNZTkMoREJUeG5fZGlzdHJpYnV0ZWQpOgorICAgIG5vc3luYz1GYWxzZQorCitjbGFzcyBEQlR4bl9kaXN0cmlidXRlZF9tdXN0X29wZW5fZGIoREJUeG5fZGlzdHJpYnV0ZWQpOgorICAgIG11c3Rfb3Blbl9kYj1UcnVlCisKK2NsYXNzIERCVHhuX2Rpc3RyaWJ1dGVkU1lOQ19tdXN0X29wZW5fZGIoREJUeG5fZGlzdHJpYnV0ZWQpOgorICAgIG5vc3luYz1GYWxzZQorICAgIG11c3Rfb3Blbl9kYj1UcnVlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCw1KSA6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCVHhuX2Rpc3RyaWJ1dGVkKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJUeG5fZGlzdHJpYnV0ZWRTWU5DKSkKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNikgOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQlR4bl9kaXN0cmlidXRlZF9tdXN0X29wZW5fZGIpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQlR4bl9kaXN0cmlidXRlZFNZTkNfbXVzdF9vcGVuX2RiKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGlzdHJpYnV0ZWRfdHJhbnNhY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzMDlmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZGlzdHJpYnV0ZWRfdHJhbnNhY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzMDlmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2Rpc3RyaWJ1dGVkX3RyYW5zYWN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9lYXJseV9jbG9zZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI1Mjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHkKQEAgLTAsMCArMSwyMTUgQEAKKyIiIlRlc3RDYXNlcyBmb3IgY2hlY2tpbmcgdGhhdCBpdCBkb2VzIG5vdCBzZWdmYXVsdCB3aGVuIGEgREJFbnYgb2JqZWN0CitpcyBjbG9zZWQgYmVmb3JlIGl0cyBEQiBvYmplY3RzLgorIiIiCisKK2ltcG9ydCBvcywgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIyBXZSdyZSBnb2luZyB0byBnZXQgd2FybmluZ3MgaW4gdGhpcyBtb2R1bGUgYWJvdXQgdHJ5aW5nIHRvIGNsb3NlIHRoZSBkYiB3aGVuCisjIGl0cyBlbnYgaXMgYWxyZWFkeSBjbG9zZWQuICBMZXQncyBqdXN0IGlnbm9yZSB0aG9zZS4KK3RyeToKKyAgICBpbXBvcnQgd2FybmluZ3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J0RCIGNvdWxkIG5vdCBiZSBjbG9zZWQgaW4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PVJ1bnRpbWVXYXJuaW5nKQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERCRW52Q2xvc2VkRWFybHlDcmFzaCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gInRlc3QiCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIHRlc3QwMV9jbG9zZV9kYmVudl9iZWZvcmVfZGIoc2VsZik6CisgICAgICAgIGRiZW52ID0gZGIuREJFbnYoKQorICAgICAgICBkYmVudi5vcGVuKHNlbGYuaG9tZURpciwKKyAgICAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0NEQnwgZGIuREJfQ1JFQVRFIHxkYi5EQl9USFJFQUR8ZGIuREJfSU5JVF9NUE9PTCwKKyAgICAgICAgICAgICAgICAgICAwNjY2KQorCisgICAgICAgIGQgPSBkYi5EQihkYmVudikKKyAgICAgICAgZDIgPSBkYi5EQihkYmVudikKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJOb1N1Y2hGaWxlRXJyb3IsIGQyLm9wZW4sCisgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSsiMiIsIGRiLkRCX0JUUkVFLCBkYi5EQl9USFJFQUQsIDA2NjYpCisKKyAgICAgICAgZC5wdXQoInRlc3QiLCJ0aGlzIGlzIGEgdGVzdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoInRlc3QiKSwgInRoaXMgaXMgYSB0ZXN0IiwgInB1dCE9Z2V0IikKKyAgICAgICAgZGJlbnYuY2xvc2UoKSAgIyBUaGlzICJjbG9zZSIgc2hvdWxkIGNsb3NlIHRoZSBjaGlsZCBkYiBoYW5kbGUgYWxzbworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkVycm9yLCBkLmdldCwgInRlc3QiKQorCisgICAgZGVmIHRlc3QwMl9jbG9zZV9kYmVudl9iZWZvcmVfZGJjdXJzb3Ioc2VsZik6CisgICAgICAgIGRiZW52ID0gZGIuREJFbnYoKQorICAgICAgICBkYmVudi5vcGVuKHNlbGYuaG9tZURpciwKKyAgICAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0NEQnwgZGIuREJfQ1JFQVRFIHxkYi5EQl9USFJFQUR8ZGIuREJfSU5JVF9NUE9PTCwKKyAgICAgICAgICAgICAgICAgICAwNjY2KQorCisgICAgICAgIGQgPSBkYi5EQihkYmVudikKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisKKyAgICAgICAgZC5wdXQoInRlc3QiLCJ0aGlzIGlzIGEgdGVzdCIpCisgICAgICAgIGQucHV0KCJ0ZXN0MiIsImFub3RoZXIgdGVzdCIpCisgICAgICAgIGQucHV0KCJ0ZXN0MyIsImFub3RoZXIgb25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgidGVzdCIpLCAidGhpcyBpcyBhIHRlc3QiLCAicHV0IT1nZXQiKQorICAgICAgICBjPWQuY3Vyc29yKCkKKyAgICAgICAgYy5maXJzdCgpCisgICAgICAgIGMubmV4dCgpCisgICAgICAgIGQuY2xvc2UoKSAgIyBUaGlzICJjbG9zZSIgc2hvdWxkIGNsb3NlIHRoZSBjaGlsZCBkYiBoYW5kbGUgYWxzbworICAgICAjIGRiLmNsb3NlIHNob3VsZCBjbG9zZSB0aGUgY2hpbGQgY3Vyc29yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCRXJyb3IsYy5uZXh0KQorCisgICAgICAgIGQgPSBkYi5EQihkYmVudikKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisgICAgICAgIGM9ZC5jdXJzb3IoKQorICAgICAgICBjLmZpcnN0KCkKKyAgICAgICAgYy5uZXh0KCkKKyAgICAgICAgZGJlbnYuY2xvc2UoKQorICAgICMgVGhlICJjbG9zZSIgc2hvdWxkIGNsb3NlIHRoZSBjaGlsZCBkYiBoYW5kbGUgYWxzbywgd2l0aCBjdXJzb3JzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCRXJyb3IsIGMubmV4dCkKKworICAgIGRlZiB0ZXN0MDNfY2xvc2VfZGJfYmVmb3JlX2RiY3Vyc29yX3dpdGhvdXRfZW52KHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MucGF0aAorICAgICAgICBwYXRoPW9zLnBhdGguam9pbihzZWxmLmhvbWVEaXIsc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5vcGVuKHBhdGgsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisKKyAgICAgICAgZC5wdXQoInRlc3QiLCJ0aGlzIGlzIGEgdGVzdCIpCisgICAgICAgIGQucHV0KCJ0ZXN0MiIsImFub3RoZXIgdGVzdCIpCisgICAgICAgIGQucHV0KCJ0ZXN0MyIsImFub3RoZXIgb25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgidGVzdCIpLCAidGhpcyBpcyBhIHRlc3QiLCAicHV0IT1nZXQiKQorICAgICAgICBjPWQuY3Vyc29yKCkKKyAgICAgICAgYy5maXJzdCgpCisgICAgICAgIGMubmV4dCgpCisgICAgICAgIGQuY2xvc2UoKQorICAgICMgVGhlICJjbG9zZSIgc2hvdWxkIGNsb3NlIHRoZSBjaGlsZCBkYiBoYW5kbGUgYWxzbworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkVycm9yLCBjLm5leHQpCisKKyAgICBkZWYgdGVzdDA0X2Nsb3NlX21hc3NpdmUoc2VsZik6CisgICAgICAgIGRiZW52ID0gZGIuREJFbnYoKQorICAgICAgICBkYmVudi5vcGVuKHNlbGYuaG9tZURpciwKKyAgICAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0NEQnwgZGIuREJfQ1JFQVRFIHxkYi5EQl9USFJFQUR8ZGIuREJfSU5JVF9NUE9PTCwKKyAgICAgICAgICAgICAgICAgICAwNjY2KQorCisgICAgICAgIGRicz1bZGIuREIoZGJlbnYpIGZvciBpIGluIHhyYW5nZSgxNildCisgICAgICAgIGN1cnNvcnM9W10KKyAgICAgICAgZm9yIGkgaW4gZGJzIDoKKyAgICAgICAgICAgIGkub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFELCAwNjY2KQorCisgICAgICAgIGRic1sxMF0ucHV0KCJ0ZXN0IiwidGhpcyBpcyBhIHRlc3QiKQorICAgICAgICBkYnNbMTBdLnB1dCgidGVzdDIiLCJhbm90aGVyIHRlc3QiKQorICAgICAgICBkYnNbMTBdLnB1dCgidGVzdDMiLCJhbm90aGVyIG9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGJzWzRdLmdldCgidGVzdCIpLCAidGhpcyBpcyBhIHRlc3QiLCAicHV0IT1nZXQiKQorCisgICAgICAgIGZvciBpIGluIGRicyA6CisgICAgICAgICAgICBjdXJzb3JzLmV4dGVuZChbaS5jdXJzb3IoKSBmb3IgaiBpbiB4cmFuZ2UoMzIpXSkKKworICAgICAgICBmb3IgaSBpbiBkYnNbOjozXSA6CisgICAgICAgICAgICBpLmNsb3NlKCkKKyAgICAgICAgZm9yIGkgaW4gY3Vyc29yc1s6OjNdIDoKKyAgICAgICAgICAgIGkuY2xvc2UoKQorCisgICAgIyBDaGVjayBmb3IgbWlzc2luZyBleGNlcHRpb24gaW4gREIhIChhZnRlciBEQiBjbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJFcnJvciwgZGJzWzldLmdldCwgInRlc3QiKQorCisgICAgIyBDaGVjayBmb3IgbWlzc2luZyBleGNlcHRpb24gaW4gREJDdXJzb3IhIChhZnRlciBEQiBjbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJFcnJvciwgY3Vyc29yc1sxMDFdLmZpcnN0KQorCisgICAgICAgIGN1cnNvcnNbODBdLmZpcnN0KCkKKyAgICAgICAgY3Vyc29yc1s4MF0ubmV4dCgpCisgICAgICAgIGRiZW52LmNsb3NlKCkgICMgVGhpcyAiY2xvc2UiIHNob3VsZCBjbG9zZSB0aGUgY2hpbGQgZGIgaGFuZGxlIGFsc28KKyAgICAjIENoZWNrIGZvciBtaXNzaW5nIGV4Y2VwdGlvbiEgKGFmdGVyIERCRW52IGNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkVycm9yLCBjdXJzb3JzWzgwXS5uZXh0KQorCisgICAgZGVmIHRlc3QwNV9jbG9zZV9kYmVudl9kZWxldGVfZGJfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgZGJlbnYgPSBkYi5EQkVudigpCisgICAgICAgIGRiZW52Lm9wZW4oc2VsZi5ob21lRGlyLAorICAgICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfQ0RCfCBkYi5EQl9DUkVBVEUgfGRiLkRCX1RIUkVBRHxkYi5EQl9JTklUX01QT09MLAorICAgICAgICAgICAgICAgICAgIDA2NjYpCisKKyAgICAgICAgZCA9IGRiLkRCKGRiZW52KQorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSB8IGRiLkRCX1RIUkVBRCwgMDY2NikKKworICAgICAgICBkYmVudi5jbG9zZSgpICAjIFRoaXMgImNsb3NlIiBzaG91bGQgY2xvc2UgdGhlIGNoaWxkIGRiIGhhbmRsZSBhbHNvCisKKyAgICAgICAgZGVsIGQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGdjID0gTm9uZQorICAgICAgICBpZiBnYzoKKyAgICAgICAgICAgICMgZm9yY2UgZC5fX2RlbF9fIFtEQl9kZWFsbG9jXSB0byBiZSBjYWxsZWQKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgZGVmIHRlc3QwNl9jbG9zZV90eG5fYmVmb3JlX2R1cF9jdXJzb3Ioc2VsZikgOgorICAgICAgICBkYmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgZGJlbnYub3BlbihzZWxmLmhvbWVEaXIsZGIuREJfSU5JVF9UWE4gfCBkYi5EQl9JTklUX01QT09MIHwKKyAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0xPRyB8IGRiLkRCX0NSRUFURSkKKyAgICAgICAgZCA9IGRiLkRCKGRiZW52KQorICAgICAgICB0eG4gPSBkYmVudi50eG5fYmVnaW4oKQorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSwgZGJ0eXBlID0gZGIuREJfSEFTSCwgZmxhZ3MgPSBkYi5EQl9DUkVBVEUsCisgICAgICAgICAgICAgICAgdHhuPXR4bikKKyAgICAgICAgZC5wdXQoIlhYWCIsICJ5eXkiLCB0eG49dHhuKQorICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgdHhuID0gZGJlbnYudHhuX2JlZ2luKCkKKyAgICAgICAgYzEgPSBkLmN1cnNvcih0eG4pCisgICAgICAgIGMyID0gYzEuZHVwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoIlhYWCIsICJ5eXkiKSwgYzEuZmlyc3QoKSkKKworICAgICAgICAjIE5vdCBpbnRlcmVzdGVkIGluIHdhcm5pbmdzIGFib3V0IGltcGxpY2l0IGNsb3NlLgorICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAjIENvbXBsZXRlbHkgcmVzZXR0aW5nIHRoZSB3YXJuaW5nIHN0YXRlIGlzCisgICAgICAgICAgICAjIHByb2JsZW1hdGljIHdpdGggcHl0aG9uID49Mi42IHdpdGggLTMgKHB5M2sgd2FybmluZyksCisgICAgICAgICAgICAjIGJlY2F1c2Ugc29tZSBzdGRsaWIgbW9kdWxlcyBzZWxlY3RpdmVseSBpZ25vcmVzIHdhcm5pbmdzLgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICB3YXJuaW5ncy5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAjIFdoZW4gd2UgZHJvcCBzdXBwb3J0IGZvciBweXRob24gMi40CisgICAgICAgICAgICAjIHdlIGNvdWxkIHVzZTogKGluIDIuNSB3ZSBuZWVkIGEgX19mdXR1cmVfXyBzdGF0ZW1lbnQpCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgICMgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiaWdub3JlIikKKyAgICAgICAgICAgICMgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBXZSBjYW4gbm90IHVzZSAid2l0aCIgYXMgaXMsIGJlY2F1c2UgaXQgd291bGQgYmUgaW52YWxpZCBzeW50YXgKKyAgICAgICAgICAgICMgaW4gcHl0aG9uIDIuNCBhbmQgKHdpdGggbm8gX19mdXR1cmVfXykgMi41LgorICAgICAgICAgICAgIyBIZXJlIHdlIHNpbXVsYXRlICJ3aXRoIiBmb2xsb3dpbmcgUEVQIDM0MyA6CisgICAgICAgICAgICB3ID0gd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKQorICAgICAgICAgICAgdy5fX2VudGVyX18oKQorICAgICAgICAgICAgdHJ5IDoKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImlnbm9yZSIpCisgICAgICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICBmaW5hbGx5IDoKKyAgICAgICAgICAgICAgICB3Ll9fZXhpdF9fKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkN1cnNvckNsb3NlZEVycm9yLCBjMi5maXJzdCkKKworICAgIGRlZiB0ZXN0MDdfY2xvc2VfZGJfYmVmb3JlX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MucGF0aAorICAgICAgICBwYXRoPW9zLnBhdGguam9pbihzZWxmLmhvbWVEaXIsc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5vcGVuKHBhdGgsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisgICAgICAgIGRicz1kYi5EQlNlcXVlbmNlKGQpCisgICAgICAgIGQuY2xvc2UoKSAgIyBUaGlzICJjbG9zZSIgc2hvdWxkIGNsb3NlIHRoZSBjaGlsZCBEQlNlcXVlbmNlIGFsc28KKyAgICAgICAgZGJzLmNsb3NlKCkgICMgSWYgbm90IGNsb3NlZCwgY29yZSBkdW1wIChpbiBCZXJrZWxleSBEQiA0LjYuKikKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoREJFbnZDbG9zZWRFYXJseUNyYXNoKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNWI1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9lYXJseV9jbG9zZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZWFybHlfY2xvc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNWI1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9lYXJseV9jbG9zZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZmlsZWlkLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZmlsZWlkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NWVjODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9maWxlaWQucHkKQEAgLTAsMCArMSw2MSBAQAorIiIiVGVzdENhc2UgZm9yIHJlc2V0aW5nIEZpbGUgSUQuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworY2xhc3MgRmlsZWlkUmVzZXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRiX3BhdGhfMSA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisgICAgICAgIHNlbGYuZGJfcGF0aF8yID0gZ2V0X25ld19kYXRhYmFzZV9wYXRoKCkKKyAgICAgICAgc2VsZi5kYl9lbnZfcGF0aCA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisKKyAgICBkZWYgdGVzdF9maWxlaWRfcmVzZXQoc2VsZik6CisgICAgICAgICMgY3JlYXRlIERCIDEKKyAgICAgICAgc2VsZi5kYjEgPSBkYi5EQigpCisgICAgICAgIHNlbGYuZGIxLm9wZW4oc2VsZi5kYl9wYXRoXzEsIGRidHlwZT1kYi5EQl9IQVNILCBmbGFncz0oZGIuREJfQ1JFQVRFfGRiLkRCX0VYQ0wpKQorICAgICAgICBzZWxmLmRiMS5wdXQoJ3NwYW0nLCAnZWdncycpCisgICAgICAgIHNlbGYuZGIxLmNsb3NlKCkKKworICAgICAgICBzaHV0aWwuY29weShzZWxmLmRiX3BhdGhfMSwgc2VsZi5kYl9wYXRoXzIpCisKKyAgICAgICAgc2VsZi5kYjIgPSBkYi5EQigpCisgICAgICAgIHNlbGYuZGIyLm9wZW4oc2VsZi5kYl9wYXRoXzIsIGRidHlwZT1kYi5EQl9IQVNIKQorICAgICAgICBzZWxmLmRiMi5wdXQoJ3NwYW0nLCAnc3BhbScpCisgICAgICAgIHNlbGYuZGIyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmRiX2VudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5kYl9lbnYub3BlbihzZWxmLmRiX2Vudl9wYXRoLCBkYi5EQl9DUkVBVEV8ZGIuREJfSU5JVF9NUE9PTCkKKworICAgICAgICAjIHVzZSBmaWxlaWRfcmVzZXQoKSBoZXJlCisgICAgICAgIHNlbGYuZGJfZW52LmZpbGVpZF9yZXNldChzZWxmLmRiX3BhdGhfMikKKworICAgICAgICBzZWxmLmRiMSA9IGRiLkRCKHNlbGYuZGJfZW52KQorICAgICAgICBzZWxmLmRiMS5vcGVuKHNlbGYuZGJfcGF0aF8xLCBkYnR5cGU9ZGIuREJfSEFTSCwgZmxhZ3M9ZGIuREJfUkRPTkxZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIxLmdldCgnc3BhbScpLCAnZWdncycpCisKKyAgICAgICAgc2VsZi5kYjIgPSBkYi5EQihzZWxmLmRiX2VudikKKyAgICAgICAgc2VsZi5kYjIub3BlbihzZWxmLmRiX3BhdGhfMiwgZGJ0eXBlPWRiLkRCX0hBU0gsIGZsYWdzPWRiLkRCX1JET05MWSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiMi5nZXQoJ3NwYW0nKSwgJ3NwYW0nKQorCisgICAgICAgIHNlbGYuZGIxLmNsb3NlKCkKKyAgICAgICAgc2VsZi5kYjIuY2xvc2UoKQorCisgICAgICAgIHNlbGYuZGJfZW52LmNsb3NlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLmRiX3BhdGhfMSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLmRiX3BhdGhfMikKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmRiX2Vudl9wYXRoKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsIDQpOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShGaWxlaWRSZXNldFRlc3RDYXNlKSkKKyAgICByZXR1cm4gc3VpdGUKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2ZpbGVpZC5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9maWxlaWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTdlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9maWxlaWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2ZpbGVpZC5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9maWxlaWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZTdlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9maWxlaWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZ2V0X25vbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2M2I1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2dldF9ub25lLnB5CkBAIC0wLDAgKzEsOTIgQEAKKyIiIgorVGVzdENhc2VzIGZvciBjaGVja2luZyBzZXRfZ2V0X3JldHVybnNfbm9uZS4KKyIiIgorCitpbXBvcnQgb3MsIHN0cmluZworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB2ZXJib3NlLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBHZXRSZXR1cm5zTm9uZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRfbmV3X2RhdGFiYXNlX3BhdGgoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVzdDAxX2dldF9yZXR1cm5zX25vbmUoc2VsZik6CisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorICAgICAgICBkLnNldF9nZXRfcmV0dXJuc19ub25lKDEpCisKKyAgICAgICAgZm9yIHggaW4gc3RyaW5nLmxldHRlcnM6CisgICAgICAgICAgICBkLnB1dCh4LCB4ICogNDApCisKKyAgICAgICAgZGF0YSA9IGQuZ2V0KCdiYWQga2V5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBOb25lKQorCisgICAgICAgIGRhdGEgPSBkLmdldChzdHJpbmcubGV0dGVyc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzdHJpbmcubGV0dGVyc1swXSo0MCkKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgYyA9IGQuY3Vyc29yKCkKKyAgICAgICAgcmVjID0gYy5maXJzdCgpCisgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBsZW4oc3RyaW5nLmxldHRlcnMpKQorCisgICAgICAgIGMuY2xvc2UoKQorICAgICAgICBkLmNsb3NlKCkKKworCisgICAgZGVmIHRlc3QwMl9nZXRfcmFpc2VzX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUpCisgICAgICAgIGQuc2V0X2dldF9yZXR1cm5zX25vbmUoMCkKKworICAgICAgICBmb3IgeCBpbiBzdHJpbmcubGV0dGVyczoKKyAgICAgICAgICAgIGQucHV0KHgsIHggKiA0MCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQk5vdEZvdW5kRXJyb3IsIGQuZ2V0LCAnYmFkIGtleScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLmdldCwgJ2JhZCBrZXknKQorCisgICAgICAgIGRhdGEgPSBkLmdldChzdHJpbmcubGV0dGVyc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzdHJpbmcubGV0dGVyc1swXSo0MCkKKworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZXhjZXB0aW9uSGFwcGVuZWQgPSAwCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIHJlYyA9IGMuZmlyc3QoKQorICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlYyA9IGMubmV4dCgpCisgICAgICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yOiAgIyBlbmQgb2YgdGhlIHJlY29yZHMKKyAgICAgICAgICAgICAgICBleGNlcHRpb25IYXBwZW5lZCA9IDEKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVjLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhjZXB0aW9uSGFwcGVuZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGxlbihzdHJpbmcubGV0dGVycykpCisKKyAgICAgICAgYy5jbG9zZSgpCisgICAgICAgIGQuY2xvc2UoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoR2V0UmV0dXJuc05vbmVUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZ2V0X25vbmUucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZ2V0X25vbmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9nZXRfbm9uZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZ2V0X25vbmUucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfZ2V0X25vbmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTVlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9nZXRfbm9uZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwZGZmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2pvaW4ucHkKQEAgLTAsMCArMSw5OSBAQAorIiIiVGVzdENhc2VzIGZvciB1c2luZyB0aGUgREIuam9pbiBhbmQgREJDdXJzb3Iuam9pbl9pdGVtIG1ldGhvZHMuCisiIiIKKworaW1wb3J0IG9zCisKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgZGJzaGVsdmUsIHRlc3Rfc3VwcG9ydCwgdmVyYm9zZSwgXAorICAgICAgICBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQcm9kdWN0SW5kZXggPSBbCisgICAgKCdhcHBsZScsICJDb252ZW5pZW5jZSBTdG9yZSIpLAorICAgICgnYmx1ZWJlcnJ5JywgIkZhcm1lcidzIE1hcmtldCIpLAorICAgICgnc2hvdGd1bicsICJTLU1hcnQiKSwgICAgICAgICAgICAgICMgQWlzbGUgMTIKKyAgICAoJ3BlYXInLCAiRmFybWVyJ3MgTWFya2V0IiksCisgICAgKCdjaGFpbnNhdycsICJTLU1hcnQiKSwgICAgICAgICAgICAgIyAiU2hvcCBzbWFydC4gIFNob3AgUy1NYXJ0ISIKKyAgICAoJ3N0cmF3YmVycnknLCAiRmFybWVyJ3MgTWFya2V0IiksCitdCisKK0NvbG9ySW5kZXggPSBbCisgICAgKCdibHVlJywgImJsdWViZXJyeSIpLAorICAgICgncmVkJywgImFwcGxlIiksCisgICAgKCdyZWQnLCAiY2hhaW5zYXciKSwKKyAgICAoJ3JlZCcsICJzdHJhd2JlcnJ5IiksCisgICAgKCd5ZWxsb3cnLCAicGVhY2giKSwKKyAgICAoJ3llbGxvdycsICJwZWFyIiksCisgICAgKCdibGFjaycsICJzaG90Z3VuIiksCitdCisKK2NsYXNzIEpvaW5UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAga2V5dHlwZSA9ICcnCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyArICcuZGInCisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9DSyApCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgdGVzdDAxX2pvaW4oc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMV9qb2luLi4uIiAlIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgIyBjcmVhdGUgYW5kIHBvcHVsYXRlIHByaW1hcnkgaW5kZXgKKyAgICAgICAgcHJpREIgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgcHJpREIub3BlbihzZWxmLmZpbGVuYW1lLCAicHJpbWFyeSIsIGRiLkRCX0JUUkVFLCBkYi5EQl9DUkVBVEUpCisgICAgICAgIG1hcChsYW1iZGEgdCwgcHJpREI9cHJpREI6IHByaURCLnB1dCgqdCksIFByb2R1Y3RJbmRleCkKKworICAgICAgICAjIGNyZWF0ZSBhbmQgcG9wdWxhdGUgc2Vjb25kYXJ5IGluZGV4CisgICAgICAgIHNlY0RCID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlY0RCLnNldF9mbGFncyhkYi5EQl9EVVAgfCBkYi5EQl9EVVBTT1JUKQorICAgICAgICBzZWNEQi5vcGVuKHNlbGYuZmlsZW5hbWUsICJzZWNvbmRhcnkiLCBkYi5EQl9CVFJFRSwgZGIuREJfQ1JFQVRFKQorICAgICAgICBtYXAobGFtYmRhIHQsIHNlY0RCPXNlY0RCOiBzZWNEQi5wdXQoKnQpLCBDb2xvckluZGV4KQorCisgICAgICAgIHNDdXJzb3IgPSBOb25lCisgICAgICAgIGpDdXJzb3IgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbGV0cyBsb29rIHVwIGFsbCBvZiB0aGUgcmVkIFByb2R1Y3RzCisgICAgICAgICAgICBzQ3Vyc29yID0gc2VjREIuY3Vyc29yKCkKKyAgICAgICAgICAgICMgRG9uJ3QgZG8gdGhlIC5zZXQoKSBpbiBhbiBhc3NlcnQsIG9yIHlvdSBjYW4gZ2V0IGEgYm9ndXMgZmFpbHVyZQorICAgICAgICAgICAgIyB3aGVuIHJ1bm5pbmcgcHl0aG9uIC1PCisgICAgICAgICAgICB0bXAgPSBzQ3Vyc29yLnNldCgncmVkJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0bXApCisKKyAgICAgICAgICAgICMgRklYTUU6IGpDdXJzb3IgZG9lc24ndCBwcm9wZXJseSBob2xkIGEgcmVmZXJlbmNlIHRvIGl0cworICAgICAgICAgICAgIyBjdXJzb3JzLCBpZiB0aGV5IGFyZSBjbG9zZWQgYmVmb3JlIGpjdXJzb3IgaXMgdXNlZCBpdAorICAgICAgICAgICAgIyBjYW4gY2F1c2UgYSBjcmFzaC4KKyAgICAgICAgICAgIGpDdXJzb3IgPSBwcmlEQi5qb2luKFtzQ3Vyc29yXSkKKworICAgICAgICAgICAgaWYgakN1cnNvci5nZXQoMCkgIT0gKCdhcHBsZScsICJDb252ZW5pZW5jZSBTdG9yZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiam9pbiBjdXJzb3IgcG9zaXRpb25lZCB3cm9uZyIpCisgICAgICAgICAgICBpZiBqQ3Vyc29yLmpvaW5faXRlbSgpICE9ICdjaGFpbnNhdyc6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJEQkN1cnNvci5qb2luX2l0ZW0gcmV0dXJuZWQgd3JvbmcgaXRlbSIpCisgICAgICAgICAgICBpZiBqQ3Vyc29yLmdldCgwKVswXSAhPSAnc3RyYXdiZXJyeSc6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJqb2luIGN1cnNvciByZXR1cm5lZCB3cm9uZyB0aGluZyIpCisgICAgICAgICAgICBpZiBqQ3Vyc29yLmdldCgwKTogICMgdGhlcmUgd2VyZSBvbmx5IHRocmVlIHJlZCBpdGVtcyB0byByZXR1cm4KKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImpvaW4gY3Vyc29yIHJldHVybmVkIHRvbyBtYW55IGl0ZW1zIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGpDdXJzb3I6CisgICAgICAgICAgICAgICAgakN1cnNvci5jbG9zZSgpCisgICAgICAgICAgICBpZiBzQ3Vyc29yOgorICAgICAgICAgICAgICAgIHNDdXJzb3IuY2xvc2UoKQorICAgICAgICAgICAgcHJpREIuY2xvc2UoKQorICAgICAgICAgICAgc2VjREIuY2xvc2UoKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSm9pblRlc3RDYXNlKSkKKworICAgIHJldHVybiBzdWl0ZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9qb2luLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM5YTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9qb2luLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM5YTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfam9pbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbG9jay5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjYThkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHkKQEAgLTAsMCArMSwxODQgQEAKKyIiIgorVGVzdENhc2VzIGZvciB0ZXN0aW5nIHRoZSBsb2NraW5nIHN1Yi1zeXN0ZW0uCisiIiIKKworaW1wb3J0IHRpbWUKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdGVzdF9zdXBwb3J0LCB2ZXJib3NlLCBoYXZlX3RocmVhZHMsIFwKKyAgICAgICAgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworaWYgaGF2ZV90aHJlYWRzIDoKKyAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCisgICAgaW1wb3J0IHN5cworICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IGN1cnJlbnRUaHJlYWQKKyAgICBlbHNlIDoKKyAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IGN1cnJlbnRfdGhyZWFkIGFzIGN1cnJlbnRUaHJlYWQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTG9ja2luZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfVEhSRUFEIHwgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0xPQ0sgfCBkYi5EQl9DUkVBVEUpCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworCisgICAgZGVmIHRlc3QwMV9zaW1wbGUoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMV9zaW1wbGUuLi4iICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBhbklEID0gc2VsZi5lbnYubG9ja19pZCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAibG9ja2VyIElEOiAlcyIgJSBhbklECisgICAgICAgIGxvY2sgPSBzZWxmLmVudi5sb2NrX2dldChhbklELCAic29tZSBsb2NrZWQgdGhpbmciLCBkYi5EQl9MT0NLX1dSSVRFKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIkFxdWlyZWQgbG9jazogJXMiICUgbG9jaworICAgICAgICBzZWxmLmVudi5sb2NrX3B1dChsb2NrKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIlJlbGVhc2VkIGxvY2s6ICVzIiAlIGxvY2sKKyAgICAgICAgc2VsZi5lbnYubG9ja19pZF9mcmVlKGFuSUQpCisKKworICAgIGRlZiB0ZXN0MDJfdGhyZWFkZWQoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMl90aHJlYWRlZC4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIHRocmVhZHMgPSBbXQorICAgICAgICB0aHJlYWRzLmFwcGVuZChUaHJlYWQodGFyZ2V0ID0gc2VsZi50aGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkYi5EQl9MT0NLX1dSSVRFLCkpKQorICAgICAgICB0aHJlYWRzLmFwcGVuZChUaHJlYWQodGFyZ2V0ID0gc2VsZi50aGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkYi5EQl9MT0NLX1JFQUQsKSkpCisgICAgICAgIHRocmVhZHMuYXBwZW5kKFRocmVhZCh0YXJnZXQgPSBzZWxmLnRoZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGRiLkRCX0xPQ0tfUkVBRCwpKSkKKyAgICAgICAgdGhyZWFkcy5hcHBlbmQoVGhyZWFkKHRhcmdldCA9IHNlbGYudGhlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oZGIuREJfTE9DS19XUklURSwpKSkKKyAgICAgICAgdGhyZWFkcy5hcHBlbmQoVGhyZWFkKHRhcmdldCA9IHNlbGYudGhlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oZGIuREJfTE9DS19SRUFELCkpKQorICAgICAgICB0aHJlYWRzLmFwcGVuZChUaHJlYWQodGFyZ2V0ID0gc2VsZi50aGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShkYi5EQl9MT0NLX1JFQUQsKSkpCisgICAgICAgIHRocmVhZHMuYXBwZW5kKFRocmVhZCh0YXJnZXQgPSBzZWxmLnRoZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGRiLkRCX0xPQ0tfV1JJVEUsKSkpCisgICAgICAgIHRocmVhZHMuYXBwZW5kKFRocmVhZCh0YXJnZXQgPSBzZWxmLnRoZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGRiLkRCX0xPQ0tfV1JJVEUsKSkpCisgICAgICAgIHRocmVhZHMuYXBwZW5kKFRocmVhZCh0YXJnZXQgPSBzZWxmLnRoZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGRiLkRCX0xPQ0tfV1JJVEUsKSkpCisKKyAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgICAgICB0LnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHQuam9pbigpCisKKyAgICAgICAgZGVmIHRlc3QwM19sb2NrX3RpbWVvdXQoc2VsZik6CisgICAgICAgICAgICBzZWxmLmVudi5zZXRfdGltZW91dCgwLCBkYi5EQl9TRVRfTE9DS19USU1FT1VUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudi5nZXRfdGltZW91dChkYi5EQl9TRVRfTE9DS19USU1FT1VUKSwgMCkKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDAsIGRiLkRCX1NFVF9UWE5fVElNRU9VVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnYuZ2V0X3RpbWVvdXQoZGIuREJfU0VUX1RYTl9USU1FT1VUKSwgMCkKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDEyMzQ1NiwgZGIuREJfU0VUX0xPQ0tfVElNRU9VVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnYuZ2V0X3RpbWVvdXQoZGIuREJfU0VUX0xPQ0tfVElNRU9VVCksIDEyMzQ1NikKKyAgICAgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDc4OTAxMjMsIGRiLkRCX1NFVF9UWE5fVElNRU9VVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnYuZ2V0X3RpbWVvdXQoZGIuREJfU0VUX1RYTl9USU1FT1VUKSwgNzg5MDEyMykKKworICAgIGRlZiB0ZXN0MDRfbG9ja190aW1lb3V0MihzZWxmKToKKyAgICAgICAgc2VsZi5lbnYuc2V0X3RpbWVvdXQoMCwgZGIuREJfU0VUX0xPQ0tfVElNRU9VVCkKKyAgICAgICAgc2VsZi5lbnYuc2V0X3RpbWVvdXQoMCwgZGIuREJfU0VUX1RYTl9USU1FT1VUKQorICAgICAgICBzZWxmLmVudi5zZXRfdGltZW91dCgxMjM0NTYsIGRiLkRCX1NFVF9MT0NLX1RJTUVPVVQpCisgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDc4OTAxMjMsIGRiLkRCX1NFVF9UWE5fVElNRU9VVCkKKworICAgICAgICBkZWYgZGVhZGxvY2tfZGV0ZWN0aW9uKCkgOgorICAgICAgICAgICAgd2hpbGUgbm90IGRlYWRsb2NrX2RldGVjdGlvbi5lbmQgOgorICAgICAgICAgICAgICAgIGRlYWRsb2NrX2RldGVjdGlvbi5jb3VudCA9IFwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbnYubG9ja19kZXRlY3QoZGIuREJfTE9DS19FWFBJUkUpCisgICAgICAgICAgICAgICAgaWYgZGVhZGxvY2tfZGV0ZWN0aW9uLmNvdW50IDoKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgbm90IGRlYWRsb2NrX2RldGVjdGlvbi5lbmQgOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKworICAgICAgICBkZWFkbG9ja19kZXRlY3Rpb24uZW5kPUZhbHNlCisgICAgICAgIGRlYWRsb2NrX2RldGVjdGlvbi5jb3VudD0wCisgICAgICAgIHQ9VGhyZWFkKHRhcmdldD1kZWFkbG9ja19kZXRlY3Rpb24pCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHNlbGYuZW52LnNldF90aW1lb3V0KDEwMDAwMCwgZGIuREJfU0VUX0xPQ0tfVElNRU9VVCkKKyAgICAgICAgYW5JRCA9IHNlbGYuZW52LmxvY2tfaWQoKQorICAgICAgICBhbklEMiA9IHNlbGYuZW52LmxvY2tfaWQoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGFuSUQsIGFuSUQyKQorICAgICAgICBsb2NrID0gc2VsZi5lbnYubG9ja19nZXQoYW5JRCwgInNoYXJlZCBsb2NrIiwgZGIuREJfTE9DS19XUklURSkKKyAgICAgICAgc3RhcnRfdGltZT10aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQkxvY2tOb3RHcmFudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgc2VsZi5lbnYubG9ja19nZXQsYW5JRDIsICJzaGFyZWQgbG9jayIsIGRiLkRCX0xPQ0tfUkVBRCkKKyAgICAgICAgZW5kX3RpbWU9dGltZS50aW1lKCkKKyAgICAgICAgZGVhZGxvY2tfZGV0ZWN0aW9uLmVuZD1UcnVlCisgICAgICAgICMgRmxvYXRpbmcgcG9pbnQgcm91bmRpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChlbmRfdGltZS1zdGFydF90aW1lKSA+PSAwLjA5OTkpCisgICAgICAgIHNlbGYuZW52LmxvY2tfcHV0KGxvY2spCisgICAgICAgIHQuam9pbigpCisKKyAgICAgICAgc2VsZi5lbnYubG9ja19pZF9mcmVlKGFuSUQpCisgICAgICAgIHNlbGYuZW52LmxvY2tfaWRfZnJlZShhbklEMikKKworICAgICAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVhZGxvY2tfZGV0ZWN0aW9uLmNvdW50PjApCisKKyAgICBkZWYgdGhlVGhyZWFkKHNlbGYsIGxvY2tUeXBlKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkubmFtZQorCisgICAgICAgIGlmIGxvY2tUeXBlID09ICBkYi5EQl9MT0NLX1dSSVRFOgorICAgICAgICAgICAgbHQgPSAid3JpdGUiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsdCA9ICJyZWFkIgorCisgICAgICAgIGFuSUQgPSBzZWxmLmVudi5sb2NrX2lkKCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczogbG9ja2VyIElEOiAlcyIgJSAobmFtZSwgYW5JRCkKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwMCkgOgorICAgICAgICAgICAgbG9jayA9IHNlbGYuZW52LmxvY2tfZ2V0KGFuSUQsICJzb21lIGxvY2tlZCB0aGluZyIsIGxvY2tUeXBlKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiJXM6IEFxdWlyZWQgJXMgbG9jazogJXMiICUgKG5hbWUsIGx0LCBsb2NrKQorCisgICAgICAgICAgICBzZWxmLmVudi5sb2NrX3B1dChsb2NrKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiJXM6IFJlbGVhc2VkICVzIGxvY2s6ICVzIiAlIChuYW1lLCBsdCwgbG9jaykKKworICAgICAgICBzZWxmLmVudi5sb2NrX2lkX2ZyZWUoYW5JRCkKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIGlmIGhhdmVfdGhyZWFkczoKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoTG9ja2luZ1Rlc3RDYXNlKSkKKyAgICBlbHNlOgorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShMb2NraW5nVGVzdENhc2UsICd0ZXN0MDEnKSkKKworICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWZmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X2xvY2sucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWZmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9sb2NrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9taXNjLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWU5MjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weQpAQCAtMCwwICsxLDEzOCBAQAorIiIiTWlzY2VsbGFuZW91cyBic2RkYiBtb2R1bGUgdGVzdCBjYXNlcworIiIiCisKK2ltcG9ydCBvcywgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIGRic2hlbHZlLCBoYXNob3BlbiwgdGVzdF9zdXBwb3J0LCBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBNaXNjVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtdHJlZShzZWxmLmhvbWVEaXIpCisKKyAgICBkZWYgdGVzdDAxX2JhZHBvaW50ZXIoc2VsZik6CisgICAgICAgIGRicyA9IGRic2hlbHZlLm9wZW4oc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZGJzLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZGIuREJFcnJvciwgZGJzLmdldCwgImZvbyIpCisKKyAgICBkZWYgdGVzdDAyX2RiX2hvbWUoc2VsZik6CisgICAgICAgIGVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgIyBjaGVjayBmb3IgY3Jhc2ggZml4ZWQgd2hlbiBkYl9ob21lIGlzIHVzZWQgYmVmb3JlIG9wZW4oKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZW52LmRiX2hvbWUgaXMgTm9uZSkKKyAgICAgICAgZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5ob21lRGlyLCBlbnYuZGJfaG9tZSkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKHNlbGYuaG9tZURpciwgImFzY2lpIiksIGVudi5kYl9ob21lKQorCisgICAgZGVmIHRlc3QwM19yZXByX2Nsb3NlZF9kYihzZWxmKToKKyAgICAgICAgZGIgPSBoYXNob3BlbihzZWxmLmZpbGVuYW1lKQorICAgICAgICBkYi5jbG9zZSgpCisgICAgICAgIHJwID0gcmVwcihkYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChycCwgInt9IikKKworICAgIGRlZiB0ZXN0MDRfcmVwcl9kYihzZWxmKSA6CisgICAgICAgIGRiID0gaGFzaG9wZW4oc2VsZi5maWxlbmFtZSkKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApIDoKKyAgICAgICAgICAgIGRiW3JlcHIoaSldID0gcmVwcigxMDAqaSkKKyAgICAgICAgICAgIGRbcmVwcihpKV0gPSByZXByKDEwMCppKQorICAgICAgICBkYi5jbG9zZSgpCisgICAgICAgIGRiID0gaGFzaG9wZW4oc2VsZi5maWxlbmFtZSkKKyAgICAgICAgcnAgPSByZXByKGRiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJwLCByZXByKGQpKQorICAgICAgICBkYi5jbG9zZSgpCisKKyAgICAjIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci9pbmRleC5waHA/ZnVuYz1kZXRhaWwmYWlkPTE3MDg4NjgmZ3JvdXBfaWQ9MTM5MDAmYXRpZD0zMTM5MDAKKyAgICAjCisgICAgIyBTZWUgdGhlIGJ1ZyByZXBvcnQgZm9yIGRldGFpbHMuCisgICAgIworICAgICMgVGhlIHByb2JsZW0gd2FzIHRoYXQgbWFrZV9rZXlfZGJ0KCkgd2FzIG5vdCBhbGxvY2F0aW5nIGEgY29weSBvZgorICAgICMgc3RyaW5nIGtleXMgYnV0IEZSRUVfREJUKCkgd2FzIGFsd2F5cyBiZWluZyB0b2xkIHRvIGZyZWUgaXQgd2hlbiB0aGUKKyAgICAjIGRhdGFiYXNlIHdhcyBvcGVuZWQgd2l0aCBEQl9USFJFQUQuCisgICAgZGVmIHRlc3QwNV9kb3VibGVfZnJlZV9tYWtlX2tleV9kYnQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRiMSA9IGRiLkRCKCkKKyAgICAgICAgICAgIGRiMS5vcGVuKHNlbGYuZmlsZW5hbWUsIE5vbmUsIGRiLkRCX0JUUkVFLAorICAgICAgICAgICAgICAgICAgICAgZGIuREJfQ1JFQVRFIHwgZGIuREJfVEhSRUFEKQorCisgICAgICAgICAgICBjdXJzID0gZGIxLmN1cnNvcigpCisgICAgICAgICAgICB0ID0gY3Vycy5nZXQoIi9mb28iLCBkYi5EQl9TRVQpCisgICAgICAgICAgICAjIGRvdWJsZSBmcmVlIGhhcHBlbmVkIGR1cmluZyBleGl0IGZyb20gREJDX2dldAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGIxLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSkKKworICAgIGRlZiB0ZXN0MDZfa2V5X3dpdGhfbnVsbF9ieXRlcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGIxID0gZGIuREIoKQorICAgICAgICAgICAgZGIxLm9wZW4oc2VsZi5maWxlbmFtZSwgTm9uZSwgZGIuREJfSEFTSCwgZGIuREJfQ1JFQVRFKQorICAgICAgICAgICAgZGIxWydhJ10gPSAnZWg/JworICAgICAgICAgICAgZGIxWydhXHgwMCddID0gJ2VoIHplZC4nCisgICAgICAgICAgICBkYjFbJ2FceDAwYSddID0gJ2VoIHplZCBlaD8nCisgICAgICAgICAgICBkYjFbJ2FhYSddID0gJ2VoIGVoIGVoIScKKyAgICAgICAgICAgIGtleXMgPSBkYjEua2V5cygpCisgICAgICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbJ2EnLCAnYVx4MDAnLCAnYVx4MDBhJywgJ2FhYSddLCBrZXlzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYjFbJ2EnXSwgJ2VoPycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiMVsnYVx4MDAnXSwgJ2VoIHplZC4nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYjFbJ2FceDAwYSddLCAnZWggemVkIGVoPycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRiMVsnYWFhJ10sICdlaCBlaCBlaCEnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGIxLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSkKKworICAgIGRlZiB0ZXN0MDdfREJfc2V0X2ZsYWdzX3BlcnNpc3RzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYjEgPSBkYi5EQigpCisgICAgICAgICAgICBkYjEuc2V0X2ZsYWdzKGRiLkRCX0RVUFNPUlQpCisgICAgICAgICAgICBkYjEub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUpCisgICAgICAgICAgICBkYjFbJ2EnXSA9ICdlaCcKKyAgICAgICAgICAgIGRiMVsnYSddID0gJ0EnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ2EnLCAnQScpXSwgZGIxLml0ZW1zKCkpCisgICAgICAgICAgICBkYjEucHV0KCdhJywgJ0FhJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWygnYScsICdBJyksICgnYScsICdBYScpXSwgZGIxLml0ZW1zKCkpCisgICAgICAgICAgICBkYjEuY2xvc2UoKQorICAgICAgICAgICAgZGIxID0gZGIuREIoKQorICAgICAgICAgICAgIyBubyBzZXRfZmxhZ3MgY2FsbCwgd2UncmUgdGVzdGluZyB0aGF0IGl0IHJlYWRzIGFuZCBvYmV5cworICAgICAgICAgICAgIyB0aGUgZmxhZ3Mgb24gb3Blbi4KKyAgICAgICAgICAgIGRiMS5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX0hBU0gpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ2EnLCAnQScpLCAoJ2EnLCAnQWEnKV0sIGRiMS5pdGVtcygpKQorICAgICAgICAgICAgIyBpZiBpdCByZWFkIHRoZSBmbGFncyByaWdodCB0aGlzIHdpbGwgcmVwbGFjZSBhbGwgdmFsdWVzCisgICAgICAgICAgICAjIGZvciBrZXkgJ2EnIGluc3RlYWQgb2YgYWRkaW5nIGEgbmV3IG9uZS4gIChhcyBhIGRpY3Qgc2hvdWxkKQorICAgICAgICAgICAgZGIxWydhJ10gPSAnbmV3IEEnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ2EnLCAnbmV3IEEnKV0sIGRiMS5pdGVtcygpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGIxLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSkKKworCisgICAgZGVmIHRlc3QwOF9FeGNlcHRpb25UeXBlcyhzZWxmKSA6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGRiLkRCRXJyb3IsIEV4Y2VwdGlvbikpCisgICAgICAgIGZvciBpLCBqIGluIGRiLl9fZGljdF9fLml0ZW1zKCkgOgorICAgICAgICAgICAgaWYgaS5zdGFydHN3aXRoKCJEQiIpIGFuZCBpLmVuZHN3aXRoKCJFcnJvciIpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhqLCBkYi5EQkVycm9yKSwgbXNnPWkpCisgICAgICAgICAgICAgICAgaWYgaSBub3QgaW4gKCJEQktleUVtcHR5RXJyb3IiLCAiREJOb3RGb3VuZEVycm9yIikgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaiwgS2V5RXJyb3IpLCBtc2c9aSkKKworICAgICAgICAjIFRoaXMgdHdvIGV4Y2VwdGlvbnMgaGF2ZSB0d28gYmFzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZGIuREJLZXlFbXB0eUVycm9yLCBLZXlFcnJvcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGRiLkRCTm90Rm91bmRFcnJvciwgS2V5RXJyb3IpKQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKE1pc2NUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9taXNjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGM1NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9taXNjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGM1NmY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfbWlzYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5IGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhODQ3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHkKQEAgLTAsMCArMSw2OCBAQAorCitpbXBvcnQgb3MKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCBzeXMKKworaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGNQaWNrbGUgPSBOb25lCitlbHNlIDoKKyAgICBjUGlja2xlID0gTm9uZQorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgcGlja2xlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlZlcmlmeSB0aGF0IERCRXJyb3IgY2FuIGJlIHBpY2tsZWQgYW5kIHVucGlja2xlZCIiIgorICAgIGRiX25hbWUgPSAndGVzdC1kYm9iai5kYicKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ob21lRGlyID0gZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnZGInKToKKyAgICAgICAgICAgIGRlbCBzZWxmLmRiCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2VudicpOgorICAgICAgICAgICAgZGVsIHNlbGYuZW52CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIF9iYXNlX3Rlc3RfcGlja2xlX0RCRXJyb3Ioc2VsZiwgcGlja2xlKToKKyAgICAgICAgc2VsZi5lbnYgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZW52Lm9wZW4oc2VsZi5ob21lRGlyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX01QT09MKQorICAgICAgICBzZWxmLmRiID0gZGIuREIoc2VsZi5lbnYpCisgICAgICAgIHNlbGYuZGIub3BlbihzZWxmLmRiX25hbWUsIGRiLkRCX0hBU0gsIGRiLkRCX0NSRUFURSkKKyAgICAgICAgc2VsZi5kYi5wdXQoJ3NwYW0nLCAnZWdncycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYlsnc3BhbSddLCAnZWdncycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGIucHV0KCdzcGFtJywgJ2hhbScsIGZsYWdzPWRiLkRCX05PT1ZFUldSSVRFKQorICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgZWdnOgorICAgICAgICAgICAgcGlja2xlZEVnZyA9IHBpY2tsZS5kdW1wcyhlZ2cpCisgICAgICAgICAgICAjcHJpbnQgcmVwcihwaWNrbGVkRWdnKQorICAgICAgICAgICAgcm90dGVuRWdnID0gcGlja2xlLmxvYWRzKHBpY2tsZWRFZ2cpCisgICAgICAgICAgICBpZiByb3R0ZW5FZ2cuYXJncyAhPSBlZ2cuYXJncyBvciB0eXBlKHJvdHRlbkVnZykgIT0gdHlwZShlZ2cpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgKHJvdHRlbkVnZywgJyE9JywgZWdnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCAid2hlcmUncyBteSBEQkVycm9yIGV4Y2VwdGlvbj8hPyIKKworICAgICAgICBzZWxmLmRiLmNsb3NlKCkKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorCisgICAgZGVmIHRlc3QwMV9waWNrbGVfREJFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5fYmFzZV90ZXN0X3BpY2tsZV9EQkVycm9yKHBpY2tsZT1waWNrbGUpCisKKyAgICBpZiBjUGlja2xlOgorICAgICAgICBkZWYgdGVzdDAyX2NQaWNrbGVfREJFcnJvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX2Jhc2VfdGVzdF9waWNrbGVfREJFcnJvcihwaWNrbGU9Y1BpY2tsZSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKHBpY2tsZVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3Rlc3Rfc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjZjk3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjZjk3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3BpY2tsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHkgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjEzZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfcXVldWUucHkKQEAgLTAsMCArMSwxNjMgQEAKKyIiIgorVGVzdENhc2VzIGZvciBleGVyY2lzaW5nIGEgUXVldWUgREIuCisiIiIKKworaW1wb3J0IG9zLCBzdHJpbmcKK2Zyb20gcHByaW50IGltcG9ydCBwcHJpbnQKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgdmVyYm9zZSwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFNpbXBsZVF1ZXVlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGdldF9uZXdfZGF0YWJhc2VfcGF0aCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGVuYW1lKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworICAgIGRlZiB0ZXN0MDFfYmFzaWMoc2VsZik6CisgICAgICAgICMgQmFzaWMgUXVldWUgdGVzdHMgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgREJDdXJzb3IuY29uc3VtZSBtZXRob2QuCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDAxX2Jhc2ljLi4uIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisKKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5zZXRfcmVfbGVuKDQwKSAgIyBRdWV1ZXMgbXVzdCBiZSBmaXhlZCBsZW5ndGgKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX1FVRVVFLCBkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJiZWZvcmUgYXBwZW5kcyIgKyAnLScgKiAzMAorICAgICAgICAgICAgcHByaW50KGQuc3RhdCgpKQorCisgICAgICAgIGZvciB4IGluIHN0cmluZy5sZXR0ZXJzOgorICAgICAgICAgICAgZC5hcHBlbmQoeCAqIDQwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBsZW4oc3RyaW5nLmxldHRlcnMpKQorCisgICAgICAgIGQucHV0KDEwMCwgInNvbWUgbW9yZSBkYXRhIikKKyAgICAgICAgZC5wdXQoMTAxLCAiYW5kIHNvbWUgbW9yZSAiKQorICAgICAgICBkLnB1dCg3NSwgICJvdXQgb2Ygb3JkZXIiKQorICAgICAgICBkLnB1dCgxLCAgICJyZXBsYWNlbWVudCBkYXRhIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgbGVuKHN0cmluZy5sZXR0ZXJzKSszKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYmVmb3JlIGNsb3NlIiArICctJyAqIDMwCisgICAgICAgICAgICBwcHJpbnQoZC5zdGF0KCkpCisKKyAgICAgICAgZC5jbG9zZSgpCisgICAgICAgIGRlbCBkCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYWZ0ZXIgb3BlbiIgKyAnLScgKiAzMAorICAgICAgICAgICAgcHByaW50KGQuc3RhdCgpKQorCisgICAgICAgICMgVGVzdCAidHhuIiBhcyBhIHBvc2l0aW9uYWwgcGFyYW1ldGVyCisgICAgICAgIGQuYXBwZW5kKCJvbmUgbW9yZSIsIE5vbmUpCisgICAgICAgICMgVGVzdCAidHhuIiBhcyBhIGtleXdvcmQgcGFyYW1ldGVyCisgICAgICAgIGQuYXBwZW5kKCJhbm90aGVyIG9uZSIsIHR4bj1Ob25lKQorCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJhZnRlciBhcHBlbmQiICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICByZWMgPSBjLmNvbnN1bWUoKQorICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgcmVjID0gYy5jb25zdW1lKCkKKyAgICAgICAgYy5jbG9zZSgpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJhZnRlciBjb25zdW1lIGxvb3AiICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCwgXAorICAgICAgICAgICAgICAgImlmIHlvdSBzZWUgdGhpcyBtZXNzYWdlIHRoZW4geW91IG5lZWQgdG8gcmVidWlsZCAiIFwKKyAgICAgICAgICAgICAgICJCZXJrZWxleSBEQiAzLjEuMTcgd2l0aCB0aGUgcGF0Y2ggaW4gcGF0Y2hlcy9xYW1fc3RhdC5kaWZmIikKKworICAgICAgICBkLmNsb3NlKCkKKworCisKKyAgICBkZWYgdGVzdDAyX2Jhc2ljUG9zdDMyKHNlbGYpOgorICAgICAgICAjIEJhc2ljIFF1ZXVlIHRlc3RzIHVzaW5nIHRoZSBuZXcgREIuY29uc3VtZSBtZXRob2QgaW4gREIgMy4yKworICAgICAgICAjIChObyBjdXJzb3IgbmVlZGVkKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMl9iYXNpY1Bvc3QzMi4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQuc2V0X3JlX2xlbig0MCkgICMgUXVldWVzIG11c3QgYmUgZml4ZWQgbGVuZ3RoCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYi5EQl9RVUVVRSwgZGIuREJfQ1JFQVRFKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYmVmb3JlIGFwcGVuZHMiICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICBmb3IgeCBpbiBzdHJpbmcubGV0dGVyczoKKyAgICAgICAgICAgIGQuYXBwZW5kKHggKiA0MCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgbGVuKHN0cmluZy5sZXR0ZXJzKSkKKworICAgICAgICBkLnB1dCgxMDAsICJzb21lIG1vcmUgZGF0YSIpCisgICAgICAgIGQucHV0KDEwMSwgImFuZCBzb21lIG1vcmUgIikKKyAgICAgICAgZC5wdXQoNzUsICAib3V0IG9mIG9yZGVyIikKKyAgICAgICAgZC5wdXQoMSwgICAicmVwbGFjZW1lbnQgZGF0YSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIGxlbihzdHJpbmcubGV0dGVycykrMykKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImJlZm9yZSBjbG9zZSIgKyAnLScgKiAzMAorICAgICAgICAgICAgcHByaW50KGQuc3RhdCgpKQorCisgICAgICAgIGQuY2xvc2UoKQorICAgICAgICBkZWwgZAorICAgICAgICBkID0gZGIuREIoKQorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSkKKyAgICAgICAgI2Quc2V0X2dldF9yZXR1cm5zX25vbmUodHJ1ZSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImFmdGVyIG9wZW4iICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICBkLmFwcGVuZCgib25lIG1vcmUiKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiYWZ0ZXIgYXBwZW5kIiArICctJyAqIDMwCisgICAgICAgICAgICBwcHJpbnQoZC5zdGF0KCkpCisKKyAgICAgICAgcmVjID0gZC5jb25zdW1lKCkKKyAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGQuY29uc3VtZSgpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJhZnRlciBjb25zdW1lIGxvb3AiICsgJy0nICogMzAKKyAgICAgICAgICAgIHBwcmludChkLnN0YXQoKSkKKworICAgICAgICBkLmNsb3NlKCkKKworCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShTaW1wbGVRdWV1ZVRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjOTllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9xdWV1ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjOTllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3F1ZXVlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjk1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weQpAQCAtMCwwICsxLDMyMCBAQAorIiIiVGVzdENhc2VzIGZvciBleGVyY2lzaW5nIGEgUmVjbm8gREIuCisiIiIKKworaW1wb3J0IG9zLCBzeXMKK2ltcG9ydCBlcnJubworZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIHZlcmJvc2UsIGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCwgZ2V0X25ld19kYXRhYmFzZV9wYXRoCisKK2xldHRlcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBTaW1wbGVSZWNub1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpZiAoc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KSkgb3IgKChzeXMudmVyc2lvbl9pbmZvID49ICgzLCAwKSkgYW5kCisgICAgICAgICAgICAoc3lzLnZlcnNpb25faW5mbyA8ICgzLCAyKSkpIDoKKyAgICAgICAgZGVmIGFzc2VydElzSW5zdGFuY2Uoc2VsZiwgb2JqLCBkYXRhdHlwZSwgbXNnPU5vbmUpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydEVxdWFsKHR5cGUob2JqKSwgZGF0YXR5cGUsIG1zZz1tc2cpCisgICAgICAgIGRlZiBhc3NlcnRHcmVhdGVyRXF1YWwoc2VsZiwgYSwgYiwgbXNnPU5vbmUpIDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFzc2VydFRydWUoYT49YiwgbXNnPW1zZykKKworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZ2V0X25ld19kYXRhYmFzZV9wYXRoKCkKKyAgICAgICAgc2VsZi5ob21lRGlyID0gTm9uZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGlmIHNlbGYuaG9tZURpcjoKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyKQorCisgICAgZGVmIHRlc3QwMV9iYXNpYyhzZWxmKToKKyAgICAgICAgZCA9IGRiLkRCKCkKKworICAgICAgICBnZXRfcmV0dXJuc19ub25lID0gZC5zZXRfZ2V0X3JldHVybnNfbm9uZSgyKQorICAgICAgICBkLnNldF9nZXRfcmV0dXJuc19ub25lKGdldF9yZXR1cm5zX25vbmUpCisKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX1JFQ05PLCBkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgZm9yIHggaW4gbGV0dGVyczoKKyAgICAgICAgICAgIHJlY25vID0gZC5hcHBlbmQoeCAqIDYwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJlY25vLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChyZWNubywgMSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjbm8sCisKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQKKworICAgICAgICBzdGF0ID0gZC5zdGF0KCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHBwcmludChzdGF0KQorCisgICAgICAgIGZvciByZWNubyBpbiByYW5nZSgxLCBsZW4oZCkrMSk6CisgICAgICAgICAgICBkYXRhID0gZFtyZWNub10KKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgZGF0YQorCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGF0YSwgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBkLmdldChyZWNubykpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGRbMF0gICMgVGhpcyBzaG91bGQgcmFpc2UgYSBLZXlFcnJvciE/IT8hCisgICAgICAgIGV4Y2VwdCBkYi5EQkludmFsaWRBcmdFcnJvciwgdmFsOgorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA2KSA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWxbMF0sIGRiLkVJTlZBTCkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLmFyZ3NbMF0sIGRiLkVJTlZBTCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKQorCisgICAgICAgICMgdGVzdCB0aGF0IGhhc19rZXkgcmFpc2VzIERCIGV4Y2VwdGlvbnMgKGZpeGVkIGluIHB5YnNkZGIgNC4zLjIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGQuaGFzX2tleSgwKQorICAgICAgICBleGNlcHQgZGIuREJFcnJvciwgdmFsOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJoYXNfa2V5IGRpZCBub3QgcmFpc2UgYSBwcm9wZXIgZXhjZXB0aW9uIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZFsxMDBdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gZC5nZXQoMTAwKQorICAgICAgICBleGNlcHQgZGIuREJOb3RGb3VuZEVycm9yLCB2YWw6CisgICAgICAgICAgICBpZiBnZXRfcmV0dXJuc19ub25lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCBleGNlcHRpb24iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBOb25lKQorCisgICAgICAgIGtleXMgPSBkLmtleXMoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQga2V5cworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoa2V5cywgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGtleXNbMF0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oa2V5cyksIGxlbihkKSkKKworICAgICAgICBpdGVtcyA9IGQuaXRlbXMoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHByaW50KGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoaXRlbXMsIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpdGVtc1swXSwgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0ZW1zWzBdKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGl0ZW1zWzBdWzBdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShpdGVtc1swXVsxXSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdGVtcyksIGxlbihkKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KDI1KSkKKworICAgICAgICBkZWwgZFsyNV0KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoMjUpKQorCisgICAgICAgIGQuZGVsZXRlKDEzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGQuaGFzX2tleSgxMykpCisKKyAgICAgICAgZGF0YSA9IGQuZ2V0X2JvdGgoMjYsICJ6IiAqIDYwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICJ6IiAqIDYwLCAnd2FzICVyJyAlIGRhdGEpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCBkYXRhCisKKyAgICAgICAgZmQgPSBkLmZkKCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IGZkCisKKyAgICAgICAgYyA9IGQuY3Vyc29yKCkKKyAgICAgICAgcmVjID0gYy5maXJzdCgpCisgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgcmVjCisgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorCisgICAgICAgIGMuc2V0KDUwKQorICAgICAgICByZWMgPSBjLmN1cnJlbnQoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgcmVjCisKKyAgICAgICAgYy5wdXQoLTEsICJhIHJlcGxhY2VtZW50IHJlY29yZCIsIGRiLkRCX0NVUlJFTlQpCisKKyAgICAgICAgYy5zZXQoNTApCisgICAgICAgIHJlYyA9IGMuY3VycmVudCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjLCAoNTAsICJhIHJlcGxhY2VtZW50IHJlY29yZCIpKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgcmVjCisKKyAgICAgICAgcmVjID0gYy5zZXRfcmFuZ2UoMzApCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCByZWMKKworICAgICAgICAjIHRlc3QgdGhhdCBub24tZXhpc3RlbnQga2V5IGxvb2t1cHMgd29yayAoYW5kIHRoYXQKKyAgICAgICAgIyBEQkNfc2V0X3JhbmdlIGRvZXNuJ3QgaGF2ZSBhIG1lbWxlYWsgdW5kZXIgdmFsZ3JpbmQpCisgICAgICAgIHJlYyA9IGMuc2V0X3JhbmdlKDk5OTk5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWMsIE5vbmUpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCByZWMKKworICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgZC5jbG9zZSgpCisKKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisKKyAgICAgICAgIyBwdXQgYSByZWNvcmQgYmV5b25kIHRoZSBjb25zZWN1dGl2ZSBlbmQgb2YgdGhlIHJlY25vJ3MKKyAgICAgICAgZFsxMDBdID0gIndheSBvdXQgdGhlcmUiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxMDBdLCAid2F5IG91dCB0aGVyZSIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGRbOTldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkLmdldCg5OSkKKyAgICAgICAgZXhjZXB0IGRiLkRCS2V5RW1wdHlFcnJvciwgdmFsOgorICAgICAgICAgICAgaWYgZ2V0X3JldHVybnNfbm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuZXhwZWN0ZWQgREJLZXlFbXB0eUVycm9yIGV4Y2VwdGlvbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbFswXSwgZGIuREJfS0VZRU1QVFkpCisgICAgICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLmFyZ3NbMF0sIGRiLkRCX0tFWUVNUFRZKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50IHZhbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IGdldF9yZXR1cm5zX25vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24iKQorCisgICAgICAgIHJlYyA9IGMuc2V0KDQwKQorICAgICAgICB3aGlsZSByZWM6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IHJlYworICAgICAgICAgICAgcmVjID0gYy5uZXh0KCkKKworICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgZC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdDAyX1dpdGhTb3VyY2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBBIFJlY25vIGZpbGUgdGhhdCBpcyBnaXZlbiBhICJiYWNraW5nIHNvdXJjZSBmaWxlIiBpcyBlc3NlbnRpYWxseSBhCisgICAgICAgIHNpbXBsZSBBU0NJSSBmaWxlLiAgTm9ybWFsbHkgZWFjaCByZWNvcmQgaXMgZGVsaW1pdGVkIGJ5IFxuIGFuZCBzbyBpcworICAgICAgICBqdXN0IGEgbGluZSBpbiB0aGUgZmlsZSwgYnV0IHlvdSBjYW4gc2V0IGEgZGlmZmVyZW50IHJlY29yZCBkZWxpbWl0ZXIKKyAgICAgICAgaWYgbmVlZGVkLgorICAgICAgICAiIiIKKyAgICAgICAgaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuaG9tZURpciA9IGhvbWVEaXIKKyAgICAgICAgc291cmNlID0gb3MucGF0aC5qb2luKGhvbWVEaXIsICd0ZXN0X3JlY25vLnR4dCcpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGhvbWVEaXIpOgorICAgICAgICAgICAgb3MubWtkaXIoaG9tZURpcikKKyAgICAgICAgZiA9IG9wZW4oc291cmNlLCAndycpICMgY3JlYXRlIHRoZSBmaWxlCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgICMgVGhpcyBpcyB0aGUgZGVmYXVsdCB2YWx1ZSwganVzdCBjaGVja2luZyBpZiBib3RoIGludAorICAgICAgICBkLnNldF9yZV9kZWxpbSgweDBBKQorICAgICAgICBkLnNldF9yZV9kZWxpbSgnXG4nKSAgIyBhbmQgY2hhciBjYW4gYmUgdXNlZC4uLgorICAgICAgICBkLnNldF9yZV9zb3VyY2Uoc291cmNlKQorICAgICAgICBkLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfUkVDTk8sIGRiLkRCX0NSRUFURSkKKworICAgICAgICBkYXRhID0gIlRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nIi5zcGxpdCgpCisgICAgICAgIGZvciBkYXR1bSBpbiBkYXRhOgorICAgICAgICAgICAgZC5hcHBlbmQoZGF0dW0pCisgICAgICAgIGQuc3luYygpCisgICAgICAgIGQuY2xvc2UoKQorCisgICAgICAgICMgZ2V0IHRoZSB0ZXh0IGZyb20gdGhlIGJhY2tpbmcgc291cmNlCisgICAgICAgIGYgPSBvcGVuKHNvdXJjZSwgJ3InKQorICAgICAgICB0ZXh0ID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRleHQgPSB0ZXh0LnN0cmlwKCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50IHRleHQKKyAgICAgICAgICAgIHByaW50IGRhdGEKKyAgICAgICAgICAgIHByaW50IHRleHQuc3BsaXQoJ1xuJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuc3BsaXQoJ1xuJyksIGRhdGEpCisKKyAgICAgICAgIyBvcGVuIGFzIGEgREIgYWdhaW4KKyAgICAgICAgZCA9IGRiLkRCKCkKKyAgICAgICAgZC5zZXRfcmVfc291cmNlKHNvdXJjZSkKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX1JFQ05PKQorCisgICAgICAgIGRbM10gPSAncmVkZGlzaC1icm93bicKKyAgICAgICAgZFs4XSA9ICdjb21hdG9zZScKKworICAgICAgICBkLnN5bmMoKQorICAgICAgICBkLmNsb3NlKCkKKworICAgICAgICBmID0gb3Blbihzb3VyY2UsICdyJykKKyAgICAgICAgdGV4dCA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0ZXh0ID0gdGV4dC5zdHJpcCgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCB0ZXh0CisgICAgICAgICAgICBwcmludCB0ZXh0LnNwbGl0KCdcbicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LnNwbGl0KCdcbicpLAorICAgICAgICAgICAiVGhlIHF1aWNrIHJlZGRpc2gtYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBjb21hdG9zZSBkb2ciLnNwbGl0KCkpCisKKyAgICBkZWYgdGVzdDAzX0ZpeGVkTGVuZ3RoKHNlbGYpOgorICAgICAgICBkID0gZGIuREIoKQorICAgICAgICBkLnNldF9yZV9sZW4oNDApICAjIGZpeGVkIGxlbmd0aCByZWNvcmRzLCA0MCBieXRlcyBsb25nCisgICAgICAgIGQuc2V0X3JlX3BhZCgnLScpICMgc2V0cyB0aGUgcGFkIGNoYXJhY3Rlci4uLgorICAgICAgICBkLnNldF9yZV9wYWQoNDUpICAjIC4uLnRlc3QgYm90aCBpbnQgYW5kIGNoYXIKKyAgICAgICAgZC5vcGVuKHNlbGYuZmlsZW5hbWUsIGRiLkRCX1JFQ05PLCBkYi5EQl9DUkVBVEUpCisKKyAgICAgICAgZm9yIHggaW4gbGV0dGVyczoKKyAgICAgICAgICAgIGQuYXBwZW5kKHggKiAzNSkgICAgIyBUaGVzZSB3aWxsIGJlIHBhZGRlZAorCisgICAgICAgIGQuYXBwZW5kKCcuJyAqIDQwKSAgICAgICMgdGhpcyBvbmUgd2lsbCBiZSBleGFjdAorCisgICAgICAgIHRyeTogICAgICAgICAgICAgICAgICAgICMgdGhpcyBvbmUgd2lsbCBmYWlsCisgICAgICAgICAgICBkLmFwcGVuZCgnYmFkJyAqIDIwKQorICAgICAgICBleGNlcHQgZGIuREJJbnZhbGlkQXJnRXJyb3IsIHZhbDoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsWzBdLCBkYi5FSU5WQUwpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbC5hcmdzWzBdLCBkYi5FSU5WQUwpCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCB2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICBjID0gZC5jdXJzb3IoKQorICAgICAgICByZWMgPSBjLmZpcnN0KCkKKyAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCByZWMKKyAgICAgICAgICAgIHJlYyA9IGMubmV4dCgpCisKKyAgICAgICAgYy5jbG9zZSgpCisgICAgICAgIGQuY2xvc2UoKQorCisgICAgZGVmIHRlc3QwNF9nZXRfc2l6ZV9lbXB0eShzZWxmKSA6CisgICAgICAgIGQgPSBkYi5EQigpCisgICAgICAgIGQub3BlbihzZWxmLmZpbGVuYW1lLCBkYnR5cGU9ZGIuREJfUkVDTk8sIGZsYWdzPWRiLkRCX0NSRUFURSkKKworICAgICAgICByb3dfaWQgPSBkLmFwcGVuZCgnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZC5nZXRfc2l6ZShrZXk9cm93X2lkKSkKKyAgICAgICAgcm93X2lkID0gZC5hcHBlbmQoJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZC5nZXRfc2l6ZShrZXk9cm93X2lkKSkKKworCisKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShTaW1wbGVSZWNub1Rlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMGM1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZWNuby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyMGM1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3JlY25vLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3JlcGxpY2F0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyYWIyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weQpAQCAtMCwwICsxLDU0MyBAQAorIiIiVGVzdENhc2VzIGZvciBkaXN0cmlidXRlZCB0cmFuc2FjdGlvbnMuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdF9hbGwgaW1wb3J0IGRiLCB0ZXN0X3N1cHBvcnQsIGhhdmVfdGhyZWFkcywgdmVyYm9zZSwgXAorICAgICAgICBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgsIGdldF9uZXdfZGF0YWJhc2VfcGF0aAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERCUmVwbGljYXRpb24odW5pdHRlc3QuVGVzdENhc2UpIDoKKyAgICBkZWYgc2V0VXAoc2VsZikgOgorICAgICAgICBzZWxmLmhvbWVEaXJNYXN0ZXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmhvbWVEaXJDbGllbnQgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIgPSBkYi5EQkVudigpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQgPSBkYi5EQkVudigpCisKKyAgICAgICAgIyBNdXN0IHVzZSAiREJfVEhSRUFEIiBiZWNhdXNlIHRoZSBSZXBsaWNhdGlvbiBNYW5hZ2VyIHdpbGwKKyAgICAgICAgIyBiZSBleGVjdXRlZCBpbiBvdGhlciB0aHJlYWRzIGJ1dCB3aWxsIHVzZSB0aGUgc2FtZSBlbnZpcm9ubWVudC4KKyAgICAgICAgIyBodHRwOi8vZm9ydW1zLm9yYWNsZS5jb20vZm9ydW1zL3RocmVhZC5qc3BhP3RocmVhZElEPTY0NTc4OCZ0c3RhcnQ9MAorICAgICAgICBzZWxmLmRiZW52TWFzdGVyLm9wZW4oc2VsZi5ob21lRGlyTWFzdGVyLCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9JTklUX1RYTgorICAgICAgICAgICAgICAgIHwgZGIuREJfSU5JVF9MT0cgfCBkYi5EQl9JTklUX01QT09MIHwgZGIuREJfSU5JVF9MT0NLIHwKKyAgICAgICAgICAgICAgICBkYi5EQl9JTklUX1JFUCB8IGRiLkRCX1JFQ09WRVIgfCBkYi5EQl9USFJFQUQsIDA2NjYpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQub3BlbihzZWxmLmhvbWVEaXJDbGllbnQsIGRiLkRCX0NSRUFURSB8IGRiLkRCX0lOSVRfVFhOCisgICAgICAgICAgICAgICAgfCBkYi5EQl9JTklUX0xPRyB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sgfAorICAgICAgICAgICAgICAgIGRiLkRCX0lOSVRfUkVQIHwgZGIuREJfUkVDT1ZFUiB8IGRiLkRCX1RIUkVBRCwgMDY2NikKKworICAgICAgICBzZWxmLmNvbmZpcm1lZF9tYXN0ZXI9c2VsZi5jbGllbnRfc3RhcnR1cGRvbmU9RmFsc2UKKyAgICAgICAgZGVmIGNvbmZpcm1lZF9tYXN0ZXIoYSxiLGMpIDoKKyAgICAgICAgICAgIGlmIGI9PWRiLkRCX0VWRU5UX1JFUF9NQVNURVIgOgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlybWVkX21hc3Rlcj1UcnVlCisKKyAgICAgICAgZGVmIGNsaWVudF9zdGFydHVwZG9uZShhLGIsYykgOgorICAgICAgICAgICAgaWYgYj09ZGIuREJfRVZFTlRfUkVQX1NUQVJUVVBET05FIDoKKyAgICAgICAgICAgICAgICBzZWxmLmNsaWVudF9zdGFydHVwZG9uZT1UcnVlCisKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5zZXRfZXZlbnRfbm90aWZ5KGNvbmZpcm1lZF9tYXN0ZXIpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQuc2V0X2V2ZW50X25vdGlmeShjbGllbnRfc3RhcnR1cGRvbmUpCisKKyAgICAgICAgI3NlbGYuZGJlbnZNYXN0ZXIuc2V0X3ZlcmJvc2UoZGIuREJfVkVSQl9SRVBMSUNBVElPTiwgVHJ1ZSkKKyAgICAgICAgI3NlbGYuZGJlbnZNYXN0ZXIuc2V0X3ZlcmJvc2UoZGIuREJfVkVSQl9GSUxFT1BTX0FMTCwgVHJ1ZSkKKyAgICAgICAgI3NlbGYuZGJlbnZDbGllbnQuc2V0X3ZlcmJvc2UoZGIuREJfVkVSQl9SRVBMSUNBVElPTiwgVHJ1ZSkKKyAgICAgICAgI3NlbGYuZGJlbnZDbGllbnQuc2V0X3ZlcmJvc2UoZGIuREJfVkVSQl9GSUxFT1BTX0FMTCwgVHJ1ZSkKKworICAgICAgICBzZWxmLmRiTWFzdGVyID0gc2VsZi5kYkNsaWVudCA9IE5vbmUKKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRiQ2xpZW50IDoKKyAgICAgICAgICAgIHNlbGYuZGJDbGllbnQuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLmRiTWFzdGVyIDoKKyAgICAgICAgICAgIHNlbGYuZGJNYXN0ZXIuY2xvc2UoKQorCisgICAgICAgICMgSGVyZSB3ZSBhc3NpZ24gZHVtbXkgZXZlbnQgaGFuZGxlcnMgdG8gYWxsb3cgR0Mgb2YgdGhlIHRlc3Qgb2JqZWN0LgorICAgICAgICAjIFNpbmNlIHRoZSBkdW1teSBoYW5kbGVyIGRvZXNuJ3QgdXNlIGFueSBvdXRlciBzY29wZSB2YXJpYWJsZSwgaXQKKyAgICAgICAgIyBkb2Vzbid0IGtlZXAgYW55IHJlZmVyZW5jZSB0byB0aGUgdGVzdCBvYmplY3QuCisgICAgICAgIGRlZiBkdW1teSgqYXJncykgOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnNldF9ldmVudF9ub3RpZnkoZHVtbXkpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQuc2V0X2V2ZW50X25vdGlmeShkdW1teSkKKworICAgICAgICBzZWxmLmRiZW52Q2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5jbG9zZSgpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyQ2xpZW50KQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpck1hc3RlcikKKworY2xhc3MgREJSZXBsaWNhdGlvbk1hbmFnZXIoREJSZXBsaWNhdGlvbikgOgorICAgIGRlZiB0ZXN0MDFfYmFzaWNfcmVwbGljYXRpb24oc2VsZikgOgorICAgICAgICBtYXN0ZXJfcG9ydCA9IHRlc3Rfc3VwcG9ydC5maW5kX3VudXNlZF9wb3J0KCkKKyAgICAgICAgY2xpZW50X3BvcnQgPSB0ZXN0X3N1cHBvcnQuZmluZF91bnVzZWRfcG9ydCgpCisgICAgICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNSwgMikgOgorICAgICAgICAgICAgc2VsZi5zaXRlID0gc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3Jfc2l0ZSgiMTI3LjAuMC4xIiwgbWFzdGVyX3BvcnQpCisgICAgICAgICAgICBzZWxmLnNpdGUuc2V0X2NvbmZpZyhkYi5EQl9HUk9VUF9DUkVBVE9SLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5zaXRlLnNldF9jb25maWcoZGIuREJfTE9DQUxfU0lURSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuc2l0ZTIgPSBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zaXRlKCIxMjcuMC4wLjEiLCBjbGllbnRfcG9ydCkKKworICAgICAgICAgICAgc2VsZi5zaXRlMyA9IHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX3NpdGUoIjEyNy4wLjAuMSIsIG1hc3Rlcl9wb3J0KQorICAgICAgICAgICAgc2VsZi5zaXRlMy5zZXRfY29uZmlnKGRiLkRCX0JPT1RTVFJBUF9IRUxQRVIsIFRydWUpCisgICAgICAgICAgICBzZWxmLnNpdGU0ID0gc2VsZi5kYmVudkNsaWVudC5yZXBtZ3Jfc2l0ZSgiMTI3LjAuMC4xIiwgY2xpZW50X3BvcnQpCisgICAgICAgICAgICBzZWxmLnNpdGU0LnNldF9jb25maWcoZGIuREJfTE9DQUxfU0lURSwgVHJ1ZSkKKworICAgICAgICAgICAgZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfQk9PVFNUUkFQX0hFTFBFUjogW0ZhbHNlLCBGYWxzZSwgVHJ1ZSwgRmFsc2VdLAorICAgICAgICAgICAgICAgICAgICBkYi5EQl9HUk9VUF9DUkVBVE9SOiBbVHJ1ZSwgRmFsc2UsIEZhbHNlLCBGYWxzZV0sCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0xFR0FDWTogW0ZhbHNlLCBGYWxzZSwgRmFsc2UsIEZhbHNlXSwKKyAgICAgICAgICAgICAgICAgICAgZGIuREJfTE9DQUxfU0lURTogW1RydWUsIEZhbHNlLCBGYWxzZSwgVHJ1ZV0sCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX1JFUE1HUl9QRUVSOiBbRmFsc2UsIEZhbHNlLCBGYWxzZSwgRmFsc2UgXSwKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciBpLCBqIGluIGQuaXRlbXMoKSA6CisgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgemlwKFtzZWxmLnNpdGUsIHNlbGYuc2l0ZTIsIHNlbGYuc2l0ZTMsIHNlbGYuc2l0ZTRdLCBqKSA6CisgICAgICAgICAgICAgICAgICAgIGlmIHYgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsuZ2V0X2NvbmZpZyhpKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGsuZ2V0X2NvbmZpZyhpKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLnNpdGUuZ2V0X2VpZCgpLCBzZWxmLnNpdGUyLmdldF9laWQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5zaXRlMy5nZXRfZWlkKCksIHNlbGYuc2l0ZTQuZ2V0X2VpZCgpKQorCisgICAgICAgICAgICBmb3IgaSwgaiBpbiB6aXAoW3NlbGYuc2l0ZSwgc2VsZi5zaXRlMiwgc2VsZi5zaXRlMywgc2VsZi5zaXRlNF0sIFwKKyAgICAgICAgICAgICAgICAgICAgW21hc3Rlcl9wb3J0LCBjbGllbnRfcG9ydCwgbWFzdGVyX3BvcnQsIGNsaWVudF9wb3J0XSkgOgorICAgICAgICAgICAgICAgIGFkZHIgPSBpLmdldF9hZGRyZXNzKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkZHIsICgiMTI3LjAuMC4xIiwgaikpCisKKyAgICAgICAgICAgIGZvciBpIGluIFtzZWxmLnNpdGUsIHNlbGYuc2l0ZTJdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuZ2V0X2FkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3NpdGVfYnlfZWlkKGkuZ2V0X2VpZCgpKS5nZXRfYWRkcmVzcygpKQorICAgICAgICAgICAgZm9yIGkgaW4gW3NlbGYuc2l0ZTMsIHNlbGYuc2l0ZTRdIDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuZ2V0X2FkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX3NpdGVfYnlfZWlkKGkuZ2V0X2VpZCgpKS5nZXRfYWRkcmVzcygpKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3NldF9sb2NhbF9zaXRlKCIxMjcuMC4wLjEiLCBtYXN0ZXJfcG9ydCkKKyAgICAgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX3NldF9sb2NhbF9zaXRlKCIxMjcuMC4wLjEiLCBjbGllbnRfcG9ydCkKKyAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX2FkZF9yZW1vdGVfc2l0ZSgiMTI3LjAuMC4xIiwgY2xpZW50X3BvcnQpCisgICAgICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9hZGRfcmVtb3RlX3NpdGUoIjEyNy4wLjAuMSIsIG1hc3Rlcl9wb3J0KQorCisgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zZXRfbnNpdGVzKDIpCisgICAgICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9zZXRfbnNpdGVzKDIpCisKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X3ByaW9yaXR5KDEwKQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9zZXRfcHJpb3JpdHkoMCkKKworICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zZXRfdGltZW91dChkYi5EQl9SRVBfQ09OTkVDVElPTl9SRVRSWSwxMDAxMjMpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF90aW1lb3V0KGRiLkRCX1JFUF9DT05ORUNUSU9OX1JFVFJZLDEwMDMyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52TWFzdGVyLnJlcF9nZXRfdGltZW91dCgKKyAgICAgICAgICAgIGRiLkRCX1JFUF9DT05ORUNUSU9OX1JFVFJZKSwgMTAwMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZDbGllbnQucmVwX2dldF90aW1lb3V0KAorICAgICAgICAgICAgZGIuREJfUkVQX0NPTk5FQ1RJT05fUkVUUlkpLCAxMDAzMjEpCisKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X3RpbWVvdXQoZGIuREJfUkVQX0VMRUNUSU9OX1RJTUVPVVQsIDEwMDIzNCkKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc2V0X3RpbWVvdXQoZGIuREJfUkVQX0VMRUNUSU9OX1RJTUVPVVQsIDEwMDQzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52TWFzdGVyLnJlcF9nZXRfdGltZW91dCgKKyAgICAgICAgICAgIGRiLkRCX1JFUF9FTEVDVElPTl9USU1FT1VUKSwgMTAwMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZDbGllbnQucmVwX2dldF90aW1lb3V0KAorICAgICAgICAgICAgZGIuREJfUkVQX0VMRUNUSU9OX1RJTUVPVVQpLCAxMDA0MzIpCisKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X3RpbWVvdXQoZGIuREJfUkVQX0VMRUNUSU9OX1JFVFJZLCAxMDAzNDUpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF90aW1lb3V0KGRiLkRCX1JFUF9FTEVDVElPTl9SRVRSWSwgMTAwNTQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZNYXN0ZXIucmVwX2dldF90aW1lb3V0KAorICAgICAgICAgICAgZGIuREJfUkVQX0VMRUNUSU9OX1JFVFJZKSwgMTAwMzQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZDbGllbnQucmVwX2dldF90aW1lb3V0KAorICAgICAgICAgICAgZGIuREJfUkVQX0VMRUNUSU9OX1JFVFJZKSwgMTAwNTQzKQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3NldF9hY2tfcG9saWN5KGRiLkRCX1JFUE1HUl9BQ0tTX0FMTCkKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBtZ3Jfc2V0X2Fja19wb2xpY3koZGIuREJfUkVQTUdSX0FDS1NfQUxMKQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3N0YXJ0KDEsIGRiLkRCX1JFUF9NQVNURVIpOworICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcG1ncl9zdGFydCgxLCBkYi5EQl9SRVBfQ0xJRU5UKTsKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZNYXN0ZXIucmVwX2dldF9uc2l0ZXMoKSwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZDbGllbnQucmVwX2dldF9uc2l0ZXMoKSwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZNYXN0ZXIucmVwX2dldF9wcmlvcml0eSgpLDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZDbGllbnQucmVwX2dldF9wcmlvcml0eSgpLDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYmVudk1hc3Rlci5yZXBtZ3JfZ2V0X2Fja19wb2xpY3koKSwKKyAgICAgICAgICAgICAgICBkYi5EQl9SRVBNR1JfQUNLU19BTEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYmVudkNsaWVudC5yZXBtZ3JfZ2V0X2Fja19wb2xpY3koKSwKKyAgICAgICAgICAgICAgICBkYi5EQl9SRVBNR1JfQUNLU19BTEwpCisKKyAgICAgICAgIyBUaGUgdGltZW91dCBpcyBuZWNlc3NhcnkgaW4gQkRCIDQuNSwgc2luY2UgREJfRVZFTlRfUkVQX1NUQVJUVVBET05FCisgICAgICAgICMgaXMgbm90IGdlbmVyYXRlZCBpZiB0aGUgbWFzdGVyIGhhcyBubyBuZXcgdHJhbnNhY3Rpb25zLgorICAgICAgICAjIFRoaXMgaXMgc29sdmVkIGluIEJEQiA0LjYgKCMxNTU0MikuCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHRpbWVvdXQgPSB0aW1lLnRpbWUoKSs2MAorICAgICAgICB3aGlsZSAodGltZS50aW1lKCk8dGltZW91dCkgYW5kIG5vdCAoc2VsZi5jb25maXJtZWRfbWFzdGVyIGFuZCBzZWxmLmNsaWVudF9zdGFydHVwZG9uZSkgOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKQorICAgICAgICAjIHNlbGYuY2xpZW50X3N0YXJ0dXBkb25lIGRvZXMgbm90IGFsd2F5cyBnZXQgc2V0IHRvIFRydWUgd2l0aGluCisgICAgICAgICMgdGhlIHRpbWVvdXQuICBPbiB3aW5kb3dzIHRoaXMgbWF5IGJlIGEgZGVlcCBpc3N1ZSwgb24gb3RoZXIKKyAgICAgICAgIyBwbGF0Zm9ybXMgaXQgaXMgbGlrZWx5IGp1c3QgYSB0aW1pbmcgaXNzdWUsIGVzcGVjaWFsbHkgb24gc2xvdworICAgICAgICAjIHZpcnRob3N0IGJ1aWxkYm90cyAoc2VlIGlzc3VlIDM4OTIgZm9yIG1vcmUpLiAgRXZlbiB0aG91Z2gKKyAgICAgICAgIyB0aGUgdGltZW91dCB0cmlnZ2VycywgdGhlIHJlc3Qgb2YgdGhpcyB0ZXN0IG1ldGhvZCB1c3VhbGx5IHBhc3NlcworICAgICAgICAjIChidXQgbm90IGFsbCBvZiBpdCBhbHdheXMsIHNlZSBiZWxvdykuICBTbyB3ZSBqdXN0IG5vdGUgdGhlCisgICAgICAgICMgdGltZW91dCBvbiBzdGRlcnIgYW5kIGtlZXAgc29sZGVyaW5nIG9uLgorICAgICAgICBpZiB0aW1lLnRpbWUoKT50aW1lb3V0OgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgKCJYWFg6IHRpbWVvdXQgaGFwcGVuZWQgYmVmb3JlIgorICAgICAgICAgICAgICAgICJzdGFydHVwIHdhcyBjb25maXJtZWQgLSBzZWUgaXNzdWUgMzg5MiIpCisgICAgICAgICAgICBzdGFydHVwX3RpbWVvdXQgPSBUcnVlCisKKyAgICAgICAgZCA9IHNlbGYuZGJlbnZNYXN0ZXIucmVwbWdyX3NpdGVfbGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQorICAgICAgICBkID0gZC52YWx1ZXMoKVswXSAgIyBUaGVyZSBpcyBvbmx5IG9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMF0sICIxMjcuMC4wLjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIGNsaWVudF9wb3J0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGRbMl09PWRiLkRCX1JFUE1HUl9DT05ORUNURUQpIG9yIFwKKyAgICAgICAgICAgICAgICAoZFsyXT09ZGIuREJfUkVQTUdSX0RJU0NPTk5FQ1RFRCkpCisKKyAgICAgICAgZCA9IHNlbGYuZGJlbnZDbGllbnQucmVwbWdyX3NpdGVfbGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQorICAgICAgICBkID0gZC52YWx1ZXMoKVswXSAgIyBUaGVyZSBpcyBvbmx5IG9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMF0sICIxMjcuMC4wLjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIG1hc3Rlcl9wb3J0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGRbMl09PWRiLkRCX1JFUE1HUl9DT05ORUNURUQpIG9yIFwKKyAgICAgICAgICAgICAgICAoZFsyXT09ZGIuREJfUkVQTUdSX0RJU0NPTk5FQ1RFRCkpCisKKyAgICAgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDYpIDoKKyAgICAgICAgICAgIGQgPSBzZWxmLmRiZW52TWFzdGVyLnJlcG1ncl9zdGF0KGZsYWdzPWRiLkRCX1NUQVRfQ0xFQVIpOworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJtc2dzX3F1ZXVlZCIgaW4gZCkKKworICAgICAgICBzZWxmLmRiTWFzdGVyPWRiLkRCKHNlbGYuZGJlbnZNYXN0ZXIpCisgICAgICAgIHR4bj1zZWxmLmRiZW52TWFzdGVyLnR4bl9iZWdpbigpCisgICAgICAgIHNlbGYuZGJNYXN0ZXIub3BlbigidGVzdCIsIGRiLkRCX0hBU0gsIGRiLkRCX0NSRUFURSwgMDY2NiwgdHhuPXR4bikKKyAgICAgICAgdHhuLmNvbW1pdCgpCisKKyAgICAgICAgaW1wb3J0IHRpbWUsb3MucGF0aAorICAgICAgICB0aW1lb3V0PXRpbWUudGltZSgpKzEwCisgICAgICAgIHdoaWxlICh0aW1lLnRpbWUoKTx0aW1lb3V0KSBhbmQgXAorICAgICAgICAgIG5vdCAob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuaG9tZURpckNsaWVudCwidGVzdCIpKSkgOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAxKQorCisgICAgICAgIHNlbGYuZGJDbGllbnQ9ZGIuREIoc2VsZi5kYmVudkNsaWVudCkKKyAgICAgICAgd2hpbGUgVHJ1ZSA6CisgICAgICAgICAgICB0eG49c2VsZi5kYmVudkNsaWVudC50eG5fYmVnaW4oKQorICAgICAgICAgICAgdHJ5IDoKKyAgICAgICAgICAgICAgICBzZWxmLmRiQ2xpZW50Lm9wZW4oInRlc3QiLCBkYi5EQl9IQVNILCBmbGFncz1kYi5EQl9SRE9OTFksCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPTA2NjYsIHR4bj10eG4pCisgICAgICAgICAgICBleGNlcHQgZGIuREJSZXBIYW5kbGVEZWFkRXJyb3IgOgorICAgICAgICAgICAgICAgIHR4bi5hYm9ydCgpCisgICAgICAgICAgICAgICAgc2VsZi5kYkNsaWVudC5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5kYkNsaWVudD1kYi5EQihzZWxmLmRiZW52Q2xpZW50KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICB0eG49c2VsZi5kYmVudk1hc3Rlci50eG5fYmVnaW4oKQorICAgICAgICBzZWxmLmRiTWFzdGVyLnB1dCgiQUJDIiwgIjEyMyIsIHR4bj10eG4pCisgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICB0aW1lb3V0PXRpbWUudGltZSgpKzEwCisgICAgICAgIHY9Tm9uZQorICAgICAgICB3aGlsZSAodGltZS50aW1lKCk8dGltZW91dCkgYW5kICh2IGlzIE5vbmUpIDoKKyAgICAgICAgICAgIHR4bj1zZWxmLmRiZW52Q2xpZW50LnR4bl9iZWdpbigpCisgICAgICAgICAgICB2PXNlbGYuZGJDbGllbnQuZ2V0KCJBQkMiLCB0eG49dHhuKQorICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICBpZiB2IGlzIE5vbmUgOgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMikKKyAgICAgICAgIyBJZiBzdGFydHVwIGRpZCBub3QgaGFwcGVuIGJlZm9yZSB0aGUgdGltZW91dCBhYm92ZSwgdGhlbiB0aGlzIHRlc3QKKyAgICAgICAgIyBzb21ldGltZXMgZmFpbHMuICBUaGlzIGhhcHBlbnMgcmFuZG9tbHksIHdoaWNoIGNhdXNlcyBidWlsZGJvdAorICAgICAgICAjIGluc3RhYmlsaXR5LCBidXQgYWxsIHRoZSBvdGhlciBic2RkYiB0ZXN0cyBwYXNzLiAgU2luY2UgYnNkZGIzIGluIHRoZQorICAgICAgICAjIHN0ZGxpYiBpcyBjdXJyZW50bHkgbm90IGdldHRpbmcgYWN0aXZlIG1haW50ZW5hbmNlLCBhbmQgaXMgZ29uZSBpbgorICAgICAgICAjIHB5M2ssIHdlIGp1c3Qgc2tpcCB0aGUgZW5kIG9mIHRoZSB0ZXN0IGluIHRoYXQgY2FzZS4KKyAgICAgICAgaWYgdGltZS50aW1lKCk+PXRpbWVvdXQgYW5kIHN0YXJ0dXBfdGltZW91dDoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInJlcGxpY2F0aW9uIHRlc3Qgc2tpcHBlZCBkdWUgdG8gcmFuZG9tIGZhaWx1cmUsICIKKyAgICAgICAgICAgICAgICAic2VlIGlzc3VlIDM4OTIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS50aW1lKCk8dGltZW91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgdikKKworICAgICAgICB0eG49c2VsZi5kYmVudk1hc3Rlci50eG5fYmVnaW4oKQorICAgICAgICBzZWxmLmRiTWFzdGVyLmRlbGV0ZSgiQUJDIiwgdHhuPXR4bikKKyAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgIHRpbWVvdXQ9dGltZS50aW1lKCkrMTAKKyAgICAgICAgd2hpbGUgKHRpbWUudGltZSgpPHRpbWVvdXQpIGFuZCAodiBpcyBub3QgTm9uZSkgOgorICAgICAgICAgICAgdHhuPXNlbGYuZGJlbnZDbGllbnQudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIHY9c2VsZi5kYkNsaWVudC5nZXQoIkFCQyIsIHR4bj10eG4pCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZSA6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS50aW1lKCk8dGltZW91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCB2KQorCitjbGFzcyBEQkJhc2VSZXBsaWNhdGlvbihEQlJlcGxpY2F0aW9uKSA6CisgICAgZGVmIHNldFVwKHNlbGYpIDoKKyAgICAgICAgREJSZXBsaWNhdGlvbi5zZXRVcChzZWxmKQorICAgICAgICBkZWYgY29uZmlybWVkX21hc3RlcihhLGIsYykgOgorICAgICAgICAgICAgaWYgKGIgPT0gZGIuREJfRVZFTlRfUkVQX01BU1RFUikgb3IgKGIgPT0gZGIuREJfRVZFTlRfUkVQX0VMRUNURUQpIDoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbmZpcm1lZF9tYXN0ZXIgPSBUcnVlCisKKyAgICAgICAgZGVmIGNsaWVudF9zdGFydHVwZG9uZShhLGIsYykgOgorICAgICAgICAgICAgaWYgYiA9PSBkYi5EQl9FVkVOVF9SRVBfU1RBUlRVUERPTkUgOgorICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X3N0YXJ0dXBkb25lID0gVHJ1ZQorCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIuc2V0X2V2ZW50X25vdGlmeShjb25maXJtZWRfbWFzdGVyKQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnNldF9ldmVudF9ub3RpZnkoY2xpZW50X3N0YXJ0dXBkb25lKQorCisgICAgICAgIGltcG9ydCBRdWV1ZQorICAgICAgICBzZWxmLm0yYyA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi5jMm0gPSBRdWV1ZS5RdWV1ZSgpCisKKyAgICAgICAgIyBUaGVyZSBhcmUgb25seSB0d28gbm9kZXMsIHNvIHdlIGRvbid0IG5lZWQgdG8KKyAgICAgICAgIyBkbyBhbnkgcm91dGluZyBkZWNpc2lvbgorICAgICAgICBkZWYgbTJjKGRiZW52LCBjb250cm9sLCByZWMsIGxzbnAsIGVudmlkLCBmbGFncykgOgorICAgICAgICAgICAgc2VsZi5tMmMucHV0KChjb250cm9sLCByZWMpKQorCisgICAgICAgIGRlZiBjMm0oZGJlbnYsIGNvbnRyb2wsIHJlYywgbHNucCwgZW52aWQsIGZsYWdzKSA6CisgICAgICAgICAgICBzZWxmLmMybS5wdXQoKGNvbnRyb2wsIHJlYykpCisKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X3RyYW5zcG9ydCgxMyxtMmMpCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF9wcmlvcml0eSgxMCkKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc2V0X3RyYW5zcG9ydCgzLGMybSkKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc2V0X3ByaW9yaXR5KDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52TWFzdGVyLnJlcF9nZXRfcHJpb3JpdHkoKSwxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiZW52Q2xpZW50LnJlcF9nZXRfcHJpb3JpdHkoKSwwKQorCisgICAgICAgICNzZWxmLmRiZW52TWFzdGVyLnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfUkVQTElDQVRJT04sIFRydWUpCisgICAgICAgICNzZWxmLmRiZW52TWFzdGVyLnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfRklMRU9QU19BTEwsIFRydWUpCisgICAgICAgICNzZWxmLmRiZW52Q2xpZW50LnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfUkVQTElDQVRJT04sIFRydWUpCisgICAgICAgICNzZWxmLmRiZW52Q2xpZW50LnNldF92ZXJib3NlKGRiLkRCX1ZFUkJfRklMRU9QU19BTEwsIFRydWUpCisKKyAgICAgICAgZGVmIHRocmVhZF9tYXN0ZXIoKSA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50aHJlYWRfZG8oc2VsZi5kYmVudk1hc3Rlciwgc2VsZi5jMm0sIDMsCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWFzdGVyX2RvaW5nX2VsZWN0aW9uLCBUcnVlKQorCisgICAgICAgIGRlZiB0aHJlYWRfY2xpZW50KCkgOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGhyZWFkX2RvKHNlbGYuZGJlbnZDbGllbnQsIHNlbGYubTJjLCAxMywKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfZG9pbmdfZWxlY3Rpb24sIEZhbHNlKQorCisgICAgICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKKyAgICAgICAgdF9tPVRocmVhZCh0YXJnZXQ9dGhyZWFkX21hc3RlcikKKyAgICAgICAgdF9jPVRocmVhZCh0YXJnZXQ9dGhyZWFkX2NsaWVudCkKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICB0X20uc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICB0X2Muc2V0RGFlbW9uKFRydWUpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgdF9tLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHRfYy5kYWVtb24gPSBUcnVlCisKKyAgICAgICAgc2VsZi50X20gPSB0X20KKyAgICAgICAgc2VsZi50X2MgPSB0X2MKKworICAgICAgICBzZWxmLmRiTWFzdGVyID0gc2VsZi5kYkNsaWVudCA9IE5vbmUKKworICAgICAgICBzZWxmLm1hc3Rlcl9kb2luZ19lbGVjdGlvbj1bRmFsc2VdCisgICAgICAgIHNlbGYuY2xpZW50X2RvaW5nX2VsZWN0aW9uPVtGYWxzZV0KKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRiQ2xpZW50IDoKKyAgICAgICAgICAgIHNlbGYuZGJDbGllbnQuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLmRiTWFzdGVyIDoKKyAgICAgICAgICAgIHNlbGYuZGJNYXN0ZXIuY2xvc2UoKQorICAgICAgICBzZWxmLm0yYy5wdXQoTm9uZSkKKyAgICAgICAgc2VsZi5jMm0ucHV0KE5vbmUpCisgICAgICAgIHNlbGYudF9tLmpvaW4oKQorICAgICAgICBzZWxmLnRfYy5qb2luKCkKKworICAgICAgICAjIEhlcmUgd2UgYXNzaWduIGR1bW15IGV2ZW50IGhhbmRsZXJzIHRvIGFsbG93IEdDIG9mIHRoZSB0ZXN0IG9iamVjdC4KKyAgICAgICAgIyBTaW5jZSB0aGUgZHVtbXkgaGFuZGxlciBkb2Vzbid0IHVzZSBhbnkgb3V0ZXIgc2NvcGUgdmFyaWFibGUsIGl0CisgICAgICAgICMgZG9lc24ndCBrZWVwIGFueSByZWZlcmVuY2UgdG8gdGhlIHRlc3Qgb2JqZWN0LgorICAgICAgICBkZWYgZHVtbXkoKmFyZ3MpIDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5zZXRfZXZlbnRfbm90aWZ5KGR1bW15KQorICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnNldF9ldmVudF9ub3RpZnkoZHVtbXkpCisgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3NldF90cmFuc3BvcnQoMTMsZHVtbXkpCisgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX3NldF90cmFuc3BvcnQoMyxkdW1teSkKKworICAgICAgICBzZWxmLmRiZW52Q2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5jbG9zZSgpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5ob21lRGlyQ2xpZW50KQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpck1hc3RlcikKKworICAgIGRlZiBiYXNpY19yZXBfdGhyZWFkaW5nKHNlbGYpIDoKKyAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc3RhcnQoZmxhZ3M9ZGIuREJfUkVQX01BU1RFUikKKyAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc3RhcnQoZmxhZ3M9ZGIuREJfUkVQX0NMSUVOVCkKKworICAgICAgICBkZWYgdGhyZWFkX2RvKGVudiwgcSwgZW52aWQsIGVsZWN0aW9uX3N0YXR1cywgbXVzdF9iZV9tYXN0ZXIpIDoKKyAgICAgICAgICAgIHdoaWxlIFRydWUgOgorICAgICAgICAgICAgICAgIHY9cS5nZXQoKQorICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZSA6IHJldHVybgorICAgICAgICAgICAgICAgIGVudi5yZXBfcHJvY2Vzc19tZXNzYWdlKHZbMF0sIHZbMV0sIGVudmlkKQorCisgICAgICAgIHNlbGYudGhyZWFkX2RvID0gdGhyZWFkX2RvCisKKyAgICAgICAgc2VsZi50X20uc3RhcnQoKQorICAgICAgICBzZWxmLnRfYy5zdGFydCgpCisKKyAgICBkZWYgdGVzdDAxX2Jhc2ljX3JlcGxpY2F0aW9uKHNlbGYpIDoKKyAgICAgICAgc2VsZi5iYXNpY19yZXBfdGhyZWFkaW5nKCkKKworICAgICAgICAjIFRoZSB0aW1lb3V0IGlzIG5lY2Vzc2FyeSBpbiBCREIgNC41LCBzaW5jZSBEQl9FVkVOVF9SRVBfU1RBUlRVUERPTkUKKyAgICAgICAgIyBpcyBub3QgZ2VuZXJhdGVkIGlmIHRoZSBtYXN0ZXIgaGFzIG5vIG5ldyB0cmFuc2FjdGlvbnMuCisgICAgICAgICMgVGhpcyBpcyBzb2x2ZWQgaW4gQkRCIDQuNiAoIzE1NTQyKS4KKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgdGltZW91dCA9IHRpbWUudGltZSgpKzYwCisgICAgICAgIHdoaWxlICh0aW1lLnRpbWUoKTx0aW1lb3V0KSBhbmQgbm90IChzZWxmLmNvbmZpcm1lZF9tYXN0ZXIgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5jbGllbnRfc3RhcnR1cGRvbmUpIDoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUudGltZSgpPHRpbWVvdXQpCisKKyAgICAgICAgc2VsZi5kYk1hc3Rlcj1kYi5EQihzZWxmLmRiZW52TWFzdGVyKQorICAgICAgICB0eG49c2VsZi5kYmVudk1hc3Rlci50eG5fYmVnaW4oKQorICAgICAgICBzZWxmLmRiTWFzdGVyLm9wZW4oInRlc3QiLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUsIDA2NjYsIHR4bj10eG4pCisgICAgICAgIHR4bi5jb21taXQoKQorCisgICAgICAgIGltcG9ydCB0aW1lLG9zLnBhdGgKKyAgICAgICAgdGltZW91dD10aW1lLnRpbWUoKSsxMAorICAgICAgICB3aGlsZSAodGltZS50aW1lKCk8dGltZW91dCkgYW5kIFwKKyAgICAgICAgICBub3QgKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLmhvbWVEaXJDbGllbnQsInRlc3QiKSkpIDoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKworICAgICAgICBzZWxmLmRiQ2xpZW50PWRiLkRCKHNlbGYuZGJlbnZDbGllbnQpCisgICAgICAgIHdoaWxlIFRydWUgOgorICAgICAgICAgICAgdHhuPXNlbGYuZGJlbnZDbGllbnQudHhuX2JlZ2luKCkKKyAgICAgICAgICAgIHRyeSA6CisgICAgICAgICAgICAgICAgc2VsZi5kYkNsaWVudC5vcGVuKCJ0ZXN0IiwgZGIuREJfSEFTSCwgZmxhZ3M9ZGIuREJfUkRPTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZT0wNjY2LCB0eG49dHhuKQorICAgICAgICAgICAgZXhjZXB0IGRiLkRCUmVwSGFuZGxlRGVhZEVycm9yIDoKKyAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorICAgICAgICAgICAgICAgIHNlbGYuZGJDbGllbnQuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuZGJDbGllbnQ9ZGIuREIoc2VsZi5kYmVudkNsaWVudCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgZCA9IHNlbGYuZGJlbnZNYXN0ZXIucmVwX3N0YXQoZmxhZ3M9ZGIuREJfU1RBVF9DTEVBUik7CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgibWFzdGVyX2NoYW5nZXMiIGluIGQpCisKKyAgICAgICAgdHhuPXNlbGYuZGJlbnZNYXN0ZXIudHhuX2JlZ2luKCkKKyAgICAgICAgc2VsZi5kYk1hc3Rlci5wdXQoIkFCQyIsICIxMjMiLCB0eG49dHhuKQorICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgdGltZW91dD10aW1lLnRpbWUoKSsxMAorICAgICAgICB2PU5vbmUKKyAgICAgICAgd2hpbGUgKHRpbWUudGltZSgpPHRpbWVvdXQpIGFuZCAodiBpcyBOb25lKSA6CisgICAgICAgICAgICB0eG49c2VsZi5kYmVudkNsaWVudC50eG5fYmVnaW4oKQorICAgICAgICAgICAgdj1zZWxmLmRiQ2xpZW50LmdldCgiQUJDIiwgdHhuPXR4bikKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgaWYgdiBpcyBOb25lIDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLnRpbWUoKTx0aW1lb3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCB2KQorCisgICAgICAgIHR4bj1zZWxmLmRiZW52TWFzdGVyLnR4bl9iZWdpbigpCisgICAgICAgIHNlbGYuZGJNYXN0ZXIuZGVsZXRlKCJBQkMiLCB0eG49dHhuKQorICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgdGltZW91dD10aW1lLnRpbWUoKSsxMAorICAgICAgICB3aGlsZSAodGltZS50aW1lKCk8dGltZW91dCkgYW5kICh2IGlzIG5vdCBOb25lKSA6CisgICAgICAgICAgICB0eG49c2VsZi5kYmVudkNsaWVudC50eG5fYmVnaW4oKQorICAgICAgICAgICAgdj1zZWxmLmRiQ2xpZW50LmdldCgiQUJDIiwgdHhuPXR4bikKKyAgICAgICAgICAgIHR4bi5jb21taXQoKQorICAgICAgICAgICAgaWYgdiBpcyBOb25lIDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLnRpbWUoKTx0aW1lb3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHYpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNykgOgorICAgICAgICBkZWYgdGVzdDAyX3Rlc3RfcmVxdWVzdChzZWxmKSA6CisgICAgICAgICAgICBzZWxmLmJhc2ljX3JlcF90aHJlYWRpbmcoKQorICAgICAgICAgICAgKG1pbmltdW0sIG1heGltdW0pID0gc2VsZi5kYmVudkNsaWVudC5yZXBfZ2V0X3JlcXVlc3QoKQorICAgICAgICAgICAgc2VsZi5kYmVudkNsaWVudC5yZXBfc2V0X3JlcXVlc3QobWluaW11bS0xLCBtYXhpbXVtKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGJlbnZDbGllbnQucmVwX2dldF9yZXF1ZXN0KCksCisgICAgICAgICAgICAgICAgICAgIChtaW5pbXVtLTEsIG1heGltdW0rMSkpCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNikgOgorICAgICAgICBkZWYgdGVzdDAzX21hc3Rlcl9lbGVjdGlvbihzZWxmKSA6CisgICAgICAgICAgICAjIEdldCByZWFkeSB0byBob2xkIGFuIGVsZWN0aW9uCisgICAgICAgICAgICAjc2VsZi5kYmVudk1hc3Rlci5yZXBfc3RhcnQoZmxhZ3M9ZGIuREJfUkVQX01BU1RFUikKKyAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3N0YXJ0KGZsYWdzPWRiLkRCX1JFUF9DTElFTlQpCisgICAgICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9zdGFydChmbGFncz1kYi5EQl9SRVBfQ0xJRU5UKQorCisgICAgICAgICAgICBkZWYgdGhyZWFkX2RvKGVudiwgcSwgZW52aWQsIGVsZWN0aW9uX3N0YXR1cywgbXVzdF9iZV9tYXN0ZXIpIDoKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlIDoKKyAgICAgICAgICAgICAgICAgICAgdj1xLmdldCgpCisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZSA6IHJldHVybgorICAgICAgICAgICAgICAgICAgICByID0gZW52LnJlcF9wcm9jZXNzX21lc3NhZ2UodlswXSx2WzFdLGVudmlkKQorICAgICAgICAgICAgICAgICAgICBpZiBtdXN0X2JlX21hc3RlciBhbmQgc2VsZi5jb25maXJtZWRfbWFzdGVyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX3N0YXJ0KGZsYWdzID0gZGIuREJfUkVQX01BU1RFUikKKyAgICAgICAgICAgICAgICAgICAgICAgIG11c3RfYmVfbWFzdGVyID0gRmFsc2UKKworICAgICAgICAgICAgICAgICAgICBpZiByWzBdID09IGRiLkRCX1JFUF9IT0xERUxFQ1RJT04gOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVmIGVsZWN0KCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LnJlcF9lbGVjdCgyLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Rpb25fc3RhdHVzWzBdID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQlJlcFVuYXZhaWxFcnJvciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgZWxlY3Rpb25fc3RhdHVzWzBdIGFuZCBub3Qgc2VsZi5jb25maXJtZWRfbWFzdGVyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlY3Rpb25fc3RhdHVzWzBdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ9VGhyZWFkKHRhcmdldD1lbGVjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKworICAgICAgICAgICAgc2VsZi50aHJlYWRfZG8gPSB0aHJlYWRfZG8KKworICAgICAgICAgICAgc2VsZi50X20uc3RhcnQoKQorICAgICAgICAgICAgc2VsZi50X2Muc3RhcnQoKQorCisgICAgICAgICAgICBzZWxmLmRiZW52TWFzdGVyLnJlcF9zZXRfdGltZW91dChkYi5EQl9SRVBfRUxFQ1RJT05fVElNRU9VVCwgNTAwMDApCisgICAgICAgICAgICBzZWxmLmRiZW52Q2xpZW50LnJlcF9zZXRfdGltZW91dChkYi5EQl9SRVBfRUxFQ1RJT05fVElNRU9VVCwgNTAwMDApCisgICAgICAgICAgICBzZWxmLmNsaWVudF9kb2luZ19lbGVjdGlvblswXSA9IFRydWUKKyAgICAgICAgICAgIHdoaWxlIFRydWUgOgorICAgICAgICAgICAgICAgIHRyeSA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGJlbnZDbGllbnQucmVwX2VsZWN0KDIsIDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xpZW50X2RvaW5nX2VsZWN0aW9uWzBdID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgZGIuREJSZXBVbmF2YWlsRXJyb3IgOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNvbmZpcm1lZF9tYXN0ZXIpCisKKyAgICAgICAgICAgICMgUmFjZSBjb25kaXRpb24gc2hvd2VkIHVwIGFmdGVyIHVwZ3JhZGluZyB0byBTb2xhcmlzIDEwIFVwZGF0ZSAxMAorICAgICAgICAgICAgIyBodHRwczovL2ZvcnVtcy5vcmFjbGUuY29tL2ZvcnVtcy90aHJlYWQuanNwYT9tZXNzYWdlSUQ9OTkwMjg2MAorICAgICAgICAgICAgIyBqY2VhQGpjZWEuZXM6IFNlZSBwcml2YXRlIGVtYWlsIGZyb20gUGF1bGEgQmluZ2hhbSAoT3JhY2xlKSwKKyAgICAgICAgICAgICMgaW4gMjAxMTA5MjkuCisgICAgICAgICAgICB3aGlsZSBub3QgKHNlbGYuZGJlbnZDbGllbnQucmVwX3N0YXQoKVsic3RhcnR1cF9jb21wbGV0ZSJdKSA6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgaWYgZGIudmVyc2lvbigpID49ICg0LDcpIDoKKyAgICAgICAgZGVmIHRlc3QwNF90ZXN0X2Nsb2Nrc2tldyhzZWxmKSA6CisgICAgICAgICAgICBmYXN0LCBzbG93ID0gMTIzNCwgMTIzMAorICAgICAgICAgICAgc2VsZi5kYmVudk1hc3Rlci5yZXBfc2V0X2Nsb2Nrc2tldyhmYXN0LCBzbG93KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoZmFzdCwgc2xvdyksCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGJlbnZNYXN0ZXIucmVwX2dldF9jbG9ja3NrZXcoKSkKKyAgICAgICAgICAgIHNlbGYuYmFzaWNfcmVwX3RocmVhZGluZygpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGlmIGRiLnZlcnNpb24oKSA+PSAoNCwgNikgOgorICAgICAgICBkYmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgdHJ5IDoKKyAgICAgICAgICAgIGRiZW52LnJlcG1ncl9nZXRfYWNrX3BvbGljeSgpCisgICAgICAgICAgICBSZXBsaWNhdGlvbk1hbmFnZXJfYXZhaWxhYmxlPVRydWUKKyAgICAgICAgZXhjZXB0IDoKKyAgICAgICAgICAgIFJlcGxpY2F0aW9uTWFuYWdlcl9hdmFpbGFibGU9RmFsc2UKKyAgICAgICAgZGJlbnYuY2xvc2UoKQorICAgICAgICBkZWwgZGJlbnYKKyAgICAgICAgaWYgUmVwbGljYXRpb25NYW5hZ2VyX2F2YWlsYWJsZSA6CisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQlJlcGxpY2F0aW9uTWFuYWdlcikpCisKKyAgICAgICAgaWYgaGF2ZV90aHJlYWRzIDoKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKERCQmFzZVJlcGxpY2F0aW9uKSkKKworICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weWMgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmY2FmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3JlcGxpY2F0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weW8gYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9yZXBsaWNhdGlvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmY2FmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3JlcGxpY2F0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYWExMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF9zZXF1ZW5jZS5weQpAQCAtMCwwICsxLDEzNiBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKKworZnJvbSB0ZXN0X2FsbCBpbXBvcnQgZGIsIHRlc3Rfc3VwcG9ydCwgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworCitjbGFzcyBEQlNlcXVlbmNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmludF8zMl9tYXggPSAweDEwMDAwMDAwMAorICAgICAgICBzZWxmLmhvbWVEaXIgPSBnZXRfbmV3X2Vudmlyb25tZW50X3BhdGgoKQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gInRlc3QiCisKKyAgICAgICAgc2VsZi5kYmVudiA9IGRiLkRCRW52KCkKKyAgICAgICAgc2VsZi5kYmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCwgMDY2NikKKyAgICAgICAgc2VsZi5kID0gZGIuREIoc2VsZi5kYmVudikKKyAgICAgICAgc2VsZi5kLm9wZW4oc2VsZi5maWxlbmFtZSwgZGIuREJfQlRSRUUsIGRiLkRCX0NSRUFURSwgMDY2NikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnc2VxJyk6CisgICAgICAgICAgICBzZWxmLnNlcS5jbG9zZSgpCisgICAgICAgICAgICBkZWwgc2VsZi5zZXEKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnZCcpOgorICAgICAgICAgICAgc2VsZi5kLmNsb3NlKCkKKyAgICAgICAgICAgIGRlbCBzZWxmLmQKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnZGJlbnYnKToKKyAgICAgICAgICAgIHNlbGYuZGJlbnYuY2xvc2UoKQorICAgICAgICAgICAgZGVsIHNlbGYuZGJlbnYKKworICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXEgPSBkYi5EQlNlcXVlbmNlKHNlbGYuZCwgZmxhZ3M9MCkKKyAgICAgICAgc3RhcnRfdmFsdWUgPSAxMCAqIHNlbGYuaW50XzMyX21heAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4QTAwMDAwMDAwLCBzdGFydF92YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5pbml0aWFsX3ZhbHVlKHN0YXJ0X3ZhbHVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5vcGVuKGtleT0naWQnLCB0eG49Tm9uZSwgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydF92YWx1ZSwgc2VsZi5zZXEuZ2V0KDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0X3ZhbHVlICsgNSwgc2VsZi5zZXEuZ2V0KCkpCisKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEub3BlbihrZXk9J2ZvbycsIHR4bj1Ob25lLCBmbGFncz1kYi5EQl9DUkVBVEUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLnJlbW92ZSh0eG49Tm9uZSwgZmxhZ3M9MCkpCisgICAgICAgIGRlbCBzZWxmLnNlcQorCisgICAgZGVmIHRlc3RfZ2V0X2tleShzZWxmKToKKyAgICAgICAgc2VsZi5zZXEgPSBkYi5EQlNlcXVlbmNlKHNlbGYuZCwgZmxhZ3M9MCkKKyAgICAgICAga2V5ID0gJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5vcGVuKGtleT1rZXksIHR4bj1Ob25lLCBmbGFncz1kYi5EQl9DUkVBVEUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleSwgc2VsZi5zZXEuZ2V0X2tleSgpKQorCisgICAgZGVmIHRlc3RfZ2V0X2RicChzZWxmKToKKyAgICAgICAgc2VsZi5zZXEgPSBkYi5EQlNlcXVlbmNlKHNlbGYuZCwgZmxhZ3M9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5vcGVuKGtleT0nZm9vJywgdHhuPU5vbmUsIGZsYWdzPWRiLkRCX0NSRUFURSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLCBzZWxmLnNlcS5nZXRfZGJwKCkpCisKKyAgICBkZWYgdGVzdF9jYWNoZXNpemUoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIGNhc2hlX3NpemUgPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLnNldF9jYWNoZXNpemUoY2FzaGVfc2l6ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEub3BlbihrZXk9J2ZvbycsIHR4bj1Ob25lLCBmbGFncz1kYi5EQl9DUkVBVEUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc2hlX3NpemUsIHNlbGYuc2VxLmdldF9jYWNoZXNpemUoKSkKKworICAgIGRlZiB0ZXN0X2ZsYWdzKHNlbGYpOgorICAgICAgICBzZWxmLnNlcSA9IGRiLkRCU2VxdWVuY2Uoc2VsZi5kLCBmbGFncz0wKQorICAgICAgICBmbGFnID0gZGIuREJfU0VRX1dSQVA7CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEuc2V0X2ZsYWdzKGZsYWcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLm9wZW4oa2V5PSdmb28nLCB0eG49Tm9uZSwgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbGFnLCBzZWxmLnNlcS5nZXRfZmxhZ3MoKSAmIGZsYWcpCisKKyAgICBkZWYgdGVzdF9yYW5nZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXEgPSBkYi5EQlNlcXVlbmNlKHNlbGYuZCwgZmxhZ3M9MCkKKyAgICAgICAgc2VxX3JhbmdlID0gKDEwICogc2VsZi5pbnRfMzJfbWF4LCAxMSAqIHNlbGYuaW50XzMyX21heCAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEuc2V0X3JhbmdlKHNlcV9yYW5nZSkpCisgICAgICAgIHNlbGYuc2VxLmluaXRpYWxfdmFsdWUoc2VxX3JhbmdlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLm9wZW4oa2V5PSdmb28nLCB0eG49Tm9uZSwgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXFfcmFuZ2UsIHNlbGYuc2VxLmdldF9yYW5nZSgpKQorCisgICAgZGVmIHRlc3Rfc3RhdChzZWxmKToKKyAgICAgICAgc2VsZi5zZXEgPSBkYi5EQlNlcXVlbmNlKHNlbGYuZCwgZmxhZ3M9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLnNlcS5vcGVuKGtleT0nZm9vJywgdHhuPU5vbmUsIGZsYWdzPWRiLkRCX0NSRUFURSkpCisgICAgICAgIHN0YXQgPSBzZWxmLnNlcS5zdGF0KCkKKyAgICAgICAgZm9yIHBhcmFtIGluICgnbm93YWl0JywgJ21pbicsICdtYXgnLCAndmFsdWUnLCAnY3VycmVudCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2ZsYWdzJywgJ2NhY2hlX3NpemUnLCAnbGFzdF92YWx1ZScsICd3YWl0Jyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocGFyYW0gaW4gc3RhdCwgInBhcmFtZXRlciAlcyBpc24ndCBpbiBzdGF0IGluZm8iICUgcGFyYW0pCisKKyAgICBpZiBkYi52ZXJzaW9uKCkgPj0gKDQsNykgOgorICAgICAgICAjIFRoaXMgY29kZSBjaGVja3MgYSBjcmFzaCBzb2x2ZWQgaW4gQmVya2VsZXkgREIgNC43CisgICAgICAgIGRlZiB0ZXN0X3N0YXRfY3Jhc2goc2VsZikgOgorICAgICAgICAgICAgZD1kYi5EQigpCisgICAgICAgICAgICBkLm9wZW4oTm9uZSxkYnR5cGU9ZGIuREJfSEFTSCxmbGFncz1kYi5EQl9DUkVBVEUpICAjIEluIFJBTQorICAgICAgICAgICAgc2VxID0gZGIuREJTZXF1ZW5jZShkLCBmbGFncz0wKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhkYi5EQk5vdEZvdW5kRXJyb3IsIHNlcS5vcGVuLAorICAgICAgICAgICAgICAgICAgICBrZXk9J2lkJywgdHhuPU5vbmUsIGZsYWdzPTApCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGRiLkRCSW52YWxpZEFyZ0Vycm9yLCBzZXEuc3RhdCkKKworICAgICAgICAgICAgZC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF82NGJpdHMoc2VsZikgOgorICAgICAgICAjIFdlIGRvbid0IHVzZSBib3RoIGV4dHJlbWVzIGJlY2F1c2UgdGhleSBhcmUgcHJvYmxlbWF0aWMKKyAgICAgICAgdmFsdWVfcGx1cz0oMUw8PDYzKS0yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTIyMzM3MjAzNjg1NDc3NTgwNkwsdmFsdWVfcGx1cykKKyAgICAgICAgdmFsdWVfbWludXM9KC0xTDw8NjMpKzEgICMgVHdvIGNvbXBsZW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtOTIyMzM3MjAzNjg1NDc3NTgwN0wsdmFsdWVfbWludXMpCisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEuaW5pdGlhbF92YWx1ZSh2YWx1ZV9wbHVzLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuc2VxLm9wZW4oa2V5PSdpZCcsIHR4bj1Ob25lLAorICAgICAgICAgICAgZmxhZ3M9ZGIuREJfQ1JFQVRFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZV9wbHVzLTEsIHNlbGYuc2VxLmdldCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZV9wbHVzLCBzZWxmLnNlcS5nZXQoMSkpCisKKyAgICAgICAgc2VsZi5zZXEucmVtb3ZlKHR4bj1Ob25lLCBmbGFncz0wKQorCisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQsIGZsYWdzPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEuaW5pdGlhbF92YWx1ZSh2YWx1ZV9taW51cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5zZXEub3BlbihrZXk9J2lkJywgdHhuPU5vbmUsCisgICAgICAgICAgICBmbGFncz1kYi5EQl9DUkVBVEUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlX21pbnVzLCBzZWxmLnNlcS5nZXQoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVfbWludXMrMSwgc2VsZi5zZXEuZ2V0KDEpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuc2VxID0gZGIuREJTZXF1ZW5jZShzZWxmLmQpCisgICAgICAgIHNlbGYuc2VxLmNsb3NlKCkgICMgWW91IGNhbiBjbG9zZSBhIFNlcXVlbmNlIG11bHRpcGxlIHRpbWVzCisgICAgICAgIHNlbGYuc2VxLmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXEuY2xvc2UoKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShEQlNlcXVlbmNlVGVzdCkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5YyBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA1MjNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfc2VxdWVuY2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5byBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3NlcXVlbmNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA1MjNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3Rfc2VxdWVuY2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weSBiL2xpYi9weXRob24yLjcvYnNkZGIvdGVzdC90ZXN0X3RocmVhZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjIxMmU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CkBAIC0wLDAgKzEsNTE3IEBACisiIiJUZXN0Q2FzZXMgZm9yIG11bHRpLXRocmVhZGVkIGFjY2VzcyB0byBhIERCLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBlcnJubworZnJvbSByYW5kb20gaW1wb3J0IHJhbmRvbQorCitEQVNIID0gJy0nCisKK3RyeToKKyAgICBXaW5kb3dzRXJyb3IKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgY2xhc3MgV2luZG93c0Vycm9yKEV4Y2VwdGlvbik6CisgICAgICAgIHBhc3MKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3RfYWxsIGltcG9ydCBkYiwgZGJ1dGlscywgdGVzdF9zdXBwb3J0LCB2ZXJib3NlLCBoYXZlX3RocmVhZHMsIFwKKyAgICAgICAgZ2V0X25ld19lbnZpcm9ubWVudF9wYXRoLCBnZXRfbmV3X2RhdGFiYXNlX3BhdGgKKworaWYgaGF2ZV90aHJlYWRzIDoKKyAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCisgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgY3VycmVudFRocmVhZAorICAgIGVsc2UgOgorICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgY3VycmVudF90aHJlYWQgYXMgY3VycmVudFRocmVhZAorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEJhc2VUaHJlYWRlZFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkYnR5cGUgICAgICAgPSBkYi5EQl9VTktOT1dOICAjIG11c3QgYmUgc2V0IGluIGRlcml2ZWQgY2xhc3MKKyAgICBkYm9wZW5mbGFncyAgPSAwCisgICAgZGJzZXRmbGFncyAgID0gMAorICAgIGVudmZsYWdzICAgICA9IDAKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIGRidXRpbHMuX2RlYWRsb2NrX1ZlcmJvc2VGaWxlID0gc3lzLnN0ZG91dAorCisgICAgICAgIHNlbGYuaG9tZURpciA9IGdldF9uZXdfZW52aXJvbm1lbnRfcGF0aCgpCisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLnNldEVudk9wdHMoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgc2VsZi5lbnZmbGFncyB8IGRiLkRCX0NSRUFURSkKKworICAgICAgICBzZWxmLmZpbGVuYW1lID0gc2VsZi5fX2NsYXNzX18uX19uYW1lX18gKyAnLmRiJworICAgICAgICBzZWxmLmQgPSBkYi5EQihzZWxmLmVudikKKyAgICAgICAgaWYgc2VsZi5kYnNldGZsYWdzOgorICAgICAgICAgICAgc2VsZi5kLnNldF9mbGFncyhzZWxmLmRic2V0ZmxhZ3MpCisgICAgICAgIHNlbGYuZC5vcGVuKHNlbGYuZmlsZW5hbWUsIHNlbGYuZGJ0eXBlLCBzZWxmLmRib3BlbmZsYWdzfGRiLkRCX0NSRUFURSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5kLmNsb3NlKCkKKyAgICAgICAgc2VsZi5lbnYuY2xvc2UoKQorICAgICAgICB0ZXN0X3N1cHBvcnQucm10cmVlKHNlbGYuaG9tZURpcikKKworICAgIGRlZiBzZXRFbnZPcHRzKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgbWFrZURhdGEoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIERBU0guam9pbihba2V5XSAqIDUpCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitjbGFzcyBDb25jdXJyZW50RGF0YVN0b3JlQmFzZShCYXNlVGhyZWFkZWRUZXN0Q2FzZSk6CisgICAgZGJvcGVuZmxhZ3MgPSBkYi5EQl9USFJFQUQKKyAgICBlbnZmbGFncyAgICA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfQ0RCIHwgZGIuREJfSU5JVF9NUE9PTAorICAgIHJlYWRlcnMgICAgID0gMCAjIGRlcml2ZWQgY2xhc3Mgc2hvdWxkIHNldAorICAgIHdyaXRlcnMgICAgID0gMAorICAgIHJlY29yZHMgICAgID0gMTAwMAorCisgICAgZGVmIHRlc3QwMV8xV3JpdGVyTXVsdGlSZWFkZXJzKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1xuJywgJy09JyAqIDMwCisgICAgICAgICAgICBwcmludCAiUnVubmluZyAlcy50ZXN0MDFfMVdyaXRlck11bHRpUmVhZGVycy4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGtleXM9cmFuZ2Uoc2VsZi5yZWNvcmRzKQorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGtleXMpCisgICAgICAgIHJlY29yZHNfcGVyX3dyaXRlcj1zZWxmLnJlY29yZHMvL3NlbGYud3JpdGVycworICAgICAgICByZWFkZXJzX3Blcl93cml0ZXI9c2VsZi5yZWFkZXJzLy9zZWxmLndyaXRlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlY29yZHMsc2VsZi53cml0ZXJzKnJlY29yZHNfcGVyX3dyaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlYWRlcnMsc2VsZi53cml0ZXJzKnJlYWRlcnNfcGVyX3dyaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChyZWNvcmRzX3Blcl93cml0ZXIlcmVhZGVyc19wZXJfd3JpdGVyKT09MCkKKyAgICAgICAgcmVhZGVycyA9IFtdCisKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKHNlbGYucmVhZGVycyk6CisgICAgICAgICAgICBydCA9IFRocmVhZCh0YXJnZXQgPSBzZWxmLnJlYWRlclRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSAoc2VsZi5kLCB4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAncmVhZGVyICVkJyAlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICApI3ZlcmJvc2UgPSB2ZXJib3NlKQorICAgICAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgICAgIHJ0LnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgcnQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcmVhZGVycy5hcHBlbmQocnQpCisKKyAgICAgICAgd3JpdGVycz1bXQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2Uoc2VsZi53cml0ZXJzKToKKyAgICAgICAgICAgIGE9a2V5c1tyZWNvcmRzX3Blcl93cml0ZXIqeDpyZWNvcmRzX3Blcl93cml0ZXIqKHgrMSldCisgICAgICAgICAgICBhLnNvcnQoKSAgIyBHZW5lcmF0ZSBjb25mbGljdHMKKyAgICAgICAgICAgIGI9cmVhZGVyc1tyZWFkZXJzX3Blcl93cml0ZXIqeDpyZWFkZXJzX3Blcl93cml0ZXIqKHgrMSldCisgICAgICAgICAgICB3dCA9IFRocmVhZCh0YXJnZXQgPSBzZWxmLndyaXRlclRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSAoc2VsZi5kLCBhLCBiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAnd3JpdGVyICVkJyAlIHgsCisgICAgICAgICAgICAgICAgICAgICAgICApI3ZlcmJvc2UgPSB2ZXJib3NlKQorICAgICAgICAgICAgd3JpdGVycy5hcHBlbmQod3QpCisKKyAgICAgICAgZm9yIHQgaW4gd3JpdGVyczoKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgICAgICB0LnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgZWxzZSA6CisgICAgICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICB0LnN0YXJ0KCkKKworICAgICAgICBmb3IgdCBpbiB3cml0ZXJzOgorICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgZm9yIHQgaW4gcmVhZGVyczoKKyAgICAgICAgICAgIHQuam9pbigpCisKKyAgICBkZWYgd3JpdGVyVGhyZWFkKHNlbGYsIGQsIGtleXMsIHJlYWRlcnMpOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkubmFtZQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IGNyZWF0aW5nIHJlY29yZHMgJWQgLSAlZCIgJSAobmFtZSwgc3RhcnQsIHN0b3ApCisKKyAgICAgICAgY291bnQ9bGVuKGtleXMpLy9sZW4ocmVhZGVycykKKyAgICAgICAgY291bnQyPWNvdW50CisgICAgICAgIGZvciB4IGluIGtleXMgOgorICAgICAgICAgICAga2V5ID0gJyUwNGQnICUgeAorICAgICAgICAgICAgZGJ1dGlscy5EZWFkbG9ja1dyYXAoZC5wdXQsIGtleSwgc2VsZi5tYWtlRGF0YShrZXkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3JldHJpZXM9MTIpCisgICAgICAgICAgICBpZiB2ZXJib3NlIGFuZCB4ICUgMTAwID09IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiByZWNvcmRzICVkIC0gJWQgZmluaXNoZWQiICUgKG5hbWUsIHN0YXJ0LCB4KQorCisgICAgICAgICAgICBjb3VudDItPTEKKyAgICAgICAgICAgIGlmIG5vdCBjb3VudDIgOgorICAgICAgICAgICAgICAgIHJlYWRlcnMucG9wKCkuc3RhcnQoKQorICAgICAgICAgICAgICAgIGNvdW50Mj1jb3VudAorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IGZpbmlzaGVkIGNyZWF0aW5nIHJlY29yZHMiICUgbmFtZQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IHRocmVhZCBmaW5pc2hlZCIgJSBuYW1lCisKKyAgICBkZWYgcmVhZGVyVGhyZWFkKHNlbGYsIGQsIHJlYWRlck51bSk6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5uYW1lCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDUpIDoKKyAgICAgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgIHJlYyA9IGMuZmlyc3QoKQorICAgICAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICBrZXksIGRhdGEgPSByZWMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWFrZURhdGEoa2V5KSwgZGF0YSkKKyAgICAgICAgICAgICAgICByZWMgPSBjLm5leHQoKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiJXM6IGZvdW5kICVkIHJlY29yZHMiICUgKG5hbWUsIGNvdW50KQorICAgICAgICAgICAgYy5jbG9zZSgpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczogdGhyZWFkIGZpbmlzaGVkIiAlIG5hbWUKKworCitjbGFzcyBCVHJlZUNvbmN1cnJlbnREYXRhU3RvcmUoQ29uY3VycmVudERhdGFTdG9yZUJhc2UpOgorICAgIGRidHlwZSAgPSBkYi5EQl9CVFJFRQorICAgIHdyaXRlcnMgPSAyCisgICAgcmVhZGVycyA9IDEwCisgICAgcmVjb3JkcyA9IDEwMDAKKworCitjbGFzcyBIYXNoQ29uY3VycmVudERhdGFTdG9yZShDb25jdXJyZW50RGF0YVN0b3JlQmFzZSk6CisgICAgZGJ0eXBlICA9IGRiLkRCX0hBU0gKKyAgICB3cml0ZXJzID0gMgorICAgIHJlYWRlcnMgPSAxMAorICAgIHJlY29yZHMgPSAxMDAwCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgU2ltcGxlVGhyZWFkZWRCYXNlKEJhc2VUaHJlYWRlZFRlc3RDYXNlKToKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIGVudmZsYWdzICAgID0gZGIuREJfVEhSRUFEIHwgZGIuREJfSU5JVF9NUE9PTCB8IGRiLkRCX0lOSVRfTE9DSworICAgIHJlYWRlcnMgPSAxMAorICAgIHdyaXRlcnMgPSAyCisgICAgcmVjb3JkcyA9IDEwMDAKKworICAgIGRlZiBzZXRFbnZPcHRzKHNlbGYpOgorICAgICAgICBzZWxmLmVudi5zZXRfbGtfZGV0ZWN0KGRiLkRCX0xPQ0tfREVGQVVMVCkKKworICAgIGRlZiB0ZXN0MDJfU2ltcGxlTG9ja3Moc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwMl9TaW1wbGVMb2Nrcy4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisKKyAgICAgICAga2V5cz1yYW5nZShzZWxmLnJlY29yZHMpCisgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgcmFuZG9tLnNodWZmbGUoa2V5cykKKyAgICAgICAgcmVjb3Jkc19wZXJfd3JpdGVyPXNlbGYucmVjb3Jkcy8vc2VsZi53cml0ZXJzCisgICAgICAgIHJlYWRlcnNfcGVyX3dyaXRlcj1zZWxmLnJlYWRlcnMvL3NlbGYud3JpdGVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVjb3JkcyxzZWxmLndyaXRlcnMqcmVjb3Jkc19wZXJfd3JpdGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmVhZGVycyxzZWxmLndyaXRlcnMqcmVhZGVyc19wZXJfd3JpdGVyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKHJlY29yZHNfcGVyX3dyaXRlciVyZWFkZXJzX3Blcl93cml0ZXIpPT0wKQorCisgICAgICAgIHJlYWRlcnMgPSBbXQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2Uoc2VsZi5yZWFkZXJzKToKKyAgICAgICAgICAgIHJ0ID0gVGhyZWFkKHRhcmdldCA9IHNlbGYucmVhZGVyVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJncyA9IChzZWxmLmQsIHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICdyZWFkZXIgJWQnICUgeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICkjdmVyYm9zZSA9IHZlcmJvc2UpCisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICAgICAgcnQuc2V0RGFlbW9uKFRydWUpCisgICAgICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgICAgICBydC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICByZWFkZXJzLmFwcGVuZChydCkKKworICAgICAgICB3cml0ZXJzID0gW10KKyAgICAgICAgZm9yIHggaW4geHJhbmdlKHNlbGYud3JpdGVycyk6CisgICAgICAgICAgICBhPWtleXNbcmVjb3Jkc19wZXJfd3JpdGVyKng6cmVjb3Jkc19wZXJfd3JpdGVyKih4KzEpXQorICAgICAgICAgICAgYS5zb3J0KCkgICMgR2VuZXJhdGUgY29uZmxpY3RzCisgICAgICAgICAgICBiPXJlYWRlcnNbcmVhZGVyc19wZXJfd3JpdGVyKng6cmVhZGVyc19wZXJfd3JpdGVyKih4KzEpXQorICAgICAgICAgICAgd3QgPSBUaHJlYWQodGFyZ2V0ID0gc2VsZi53cml0ZXJUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gKHNlbGYuZCwgYSwgYiksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ3dyaXRlciAlZCcgJSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgKSN2ZXJib3NlID0gdmVyYm9zZSkKKyAgICAgICAgICAgIHdyaXRlcnMuYXBwZW5kKHd0KQorCisgICAgICAgIGZvciB0IGluIHdyaXRlcnM6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgZm9yIHQgaW4gd3JpdGVyczoKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgIGZvciB0IGluIHJlYWRlcnM6CisgICAgICAgICAgICB0LmpvaW4oKQorCisgICAgZGVmIHdyaXRlclRocmVhZChzZWxmLCBkLCBrZXlzLCByZWFkZXJzKToKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDMgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgZWxzZSA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLm5hbWUKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlczogY3JlYXRpbmcgcmVjb3JkcyAlZCAtICVkIiAlIChuYW1lLCBzdGFydCwgc3RvcCkKKworICAgICAgICBjb3VudD1sZW4oa2V5cykvL2xlbihyZWFkZXJzKQorICAgICAgICBjb3VudDI9Y291bnQKKyAgICAgICAgZm9yIHggaW4ga2V5cyA6CisgICAgICAgICAgICBrZXkgPSAnJTA0ZCcgJSB4CisgICAgICAgICAgICBkYnV0aWxzLkRlYWRsb2NrV3JhcChkLnB1dCwga2V5LCBzZWxmLm1ha2VEYXRhKGtleSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcmV0cmllcz0xMikKKworICAgICAgICAgICAgaWYgdmVyYm9zZSBhbmQgeCAlIDEwMCA9PSAwOgorICAgICAgICAgICAgICAgIHByaW50ICIlczogcmVjb3JkcyAlZCAtICVkIGZpbmlzaGVkIiAlIChuYW1lLCBzdGFydCwgeCkKKworICAgICAgICAgICAgY291bnQyLT0xCisgICAgICAgICAgICBpZiBub3QgY291bnQyIDoKKyAgICAgICAgICAgICAgICByZWFkZXJzLnBvcCgpLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICBjb3VudDI9Y291bnQKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiB0aHJlYWQgZmluaXNoZWQiICUgbmFtZQorCisgICAgZGVmIHJlYWRlclRocmVhZChzZWxmLCBkLCByZWFkZXJOdW0pOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkubmFtZQorCisgICAgICAgIGMgPSBkLmN1cnNvcigpCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICByZWMgPSBkYnV0aWxzLkRlYWRsb2NrV3JhcChjLmZpcnN0LCBtYXhfcmV0cmllcz0xMCkKKyAgICAgICAgd2hpbGUgcmVjOgorICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAga2V5LCBkYXRhID0gcmVjCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWFrZURhdGEoa2V5KSwgZGF0YSkKKyAgICAgICAgICAgIHJlYyA9IGRidXRpbHMuRGVhZGxvY2tXcmFwKGMubmV4dCwgbWF4X3JldHJpZXM9MTApCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IGZvdW5kICVkIHJlY29yZHMiICUgKG5hbWUsIGNvdW50KQorICAgICAgICBjLmNsb3NlKCkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVzOiB0aHJlYWQgZmluaXNoZWQiICUgbmFtZQorCisKK2NsYXNzIEJUcmVlU2ltcGxlVGhyZWFkZWQoU2ltcGxlVGhyZWFkZWRCYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorCisKK2NsYXNzIEhhc2hTaW1wbGVUaHJlYWRlZChTaW1wbGVUaHJlYWRlZEJhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIFRocmVhZGVkVHJhbnNhY3Rpb25zQmFzZShCYXNlVGhyZWFkZWRUZXN0Q2FzZSk6CisgICAgZGJvcGVuZmxhZ3MgPSBkYi5EQl9USFJFQUQgfCBkYi5EQl9BVVRPX0NPTU1JVAorICAgIGVudmZsYWdzICAgID0gKGRiLkRCX1RIUkVBRCB8CisgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9NUE9PTCB8CisgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9MT0NLIHwKKyAgICAgICAgICAgICAgICAgICBkYi5EQl9JTklUX0xPRyB8CisgICAgICAgICAgICAgICAgICAgZGIuREJfSU5JVF9UWE4KKyAgICAgICAgICAgICAgICAgICApCisgICAgcmVhZGVycyA9IDAKKyAgICB3cml0ZXJzID0gMAorICAgIHJlY29yZHMgPSAyMDAwCisgICAgdHhuRmxhZyA9IDAKKworICAgIGRlZiBzZXRFbnZPcHRzKHNlbGYpOgorICAgICAgICAjc2VsZi5lbnYuc2V0X2xrX2RldGVjdChkYi5EQl9MT0NLX0RFRkFVTFQpCisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0MDNfVGhyZWFkZWRUcmFuc2FjdGlvbnMoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnXG4nLCAnLT0nICogMzAKKyAgICAgICAgICAgIHByaW50ICJSdW5uaW5nICVzLnRlc3QwM19UaHJlYWRlZFRyYW5zYWN0aW9ucy4uLiIgJSBcCisgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgIGtleXM9cmFuZ2Uoc2VsZi5yZWNvcmRzKQorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGtleXMpCisgICAgICAgIHJlY29yZHNfcGVyX3dyaXRlcj1zZWxmLnJlY29yZHMvL3NlbGYud3JpdGVycworICAgICAgICByZWFkZXJzX3Blcl93cml0ZXI9c2VsZi5yZWFkZXJzLy9zZWxmLndyaXRlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlY29yZHMsc2VsZi53cml0ZXJzKnJlY29yZHNfcGVyX3dyaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJlYWRlcnMsc2VsZi53cml0ZXJzKnJlYWRlcnNfcGVyX3dyaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChyZWNvcmRzX3Blcl93cml0ZXIlcmVhZGVyc19wZXJfd3JpdGVyKT09MCkKKworICAgICAgICByZWFkZXJzPVtdCisgICAgICAgIGZvciB4IGluIHhyYW5nZShzZWxmLnJlYWRlcnMpOgorICAgICAgICAgICAgcnQgPSBUaHJlYWQodGFyZ2V0ID0gc2VsZi5yZWFkZXJUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gKHNlbGYuZCwgeCksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ3JlYWRlciAlZCcgJSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgKSN2ZXJib3NlID0gdmVyYm9zZSkKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgICAgICBydC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHJ0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHJlYWRlcnMuYXBwZW5kKHJ0KQorCisgICAgICAgIHdyaXRlcnMgPSBbXQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2Uoc2VsZi53cml0ZXJzKToKKyAgICAgICAgICAgIGE9a2V5c1tyZWNvcmRzX3Blcl93cml0ZXIqeDpyZWNvcmRzX3Blcl93cml0ZXIqKHgrMSldCisgICAgICAgICAgICBiPXJlYWRlcnNbcmVhZGVyc19wZXJfd3JpdGVyKng6cmVhZGVyc19wZXJfd3JpdGVyKih4KzEpXQorICAgICAgICAgICAgd3QgPSBUaHJlYWQodGFyZ2V0ID0gc2VsZi53cml0ZXJUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gKHNlbGYuZCwgYSwgYiksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gJ3dyaXRlciAlZCcgJSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgKSN2ZXJib3NlID0gdmVyYm9zZSkKKyAgICAgICAgICAgIHdyaXRlcnMuYXBwZW5kKHd0KQorCisgICAgICAgIGR0ID0gVGhyZWFkKHRhcmdldCA9IHNlbGYuZGVhZGxvY2tUaHJlYWQpCisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIGR0LnNldERhZW1vbihUcnVlKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIGR0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgZHQuc3RhcnQoKQorCisgICAgICAgIGZvciB0IGluIHdyaXRlcnM6CisgICAgICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICAgICAgdC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgZm9yIHQgaW4gd3JpdGVyczoKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgIGZvciB0IGluIHJlYWRlcnM6CisgICAgICAgICAgICB0LmpvaW4oKQorCisgICAgICAgIHNlbGYuZG9Mb2NrRGV0ZWN0ID0gRmFsc2UKKyAgICAgICAgZHQuam9pbigpCisKKyAgICBkZWYgd3JpdGVyVGhyZWFkKHNlbGYsIGQsIGtleXMsIHJlYWRlcnMpOgorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMyA6CisgICAgICAgICAgICBuYW1lID0gY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICBlbHNlIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkubmFtZQorCisgICAgICAgIGNvdW50PWxlbihrZXlzKS8vbGVuKHJlYWRlcnMpCisgICAgICAgIHdoaWxlIGxlbihrZXlzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0eG4gPSBzZWxmLmVudi50eG5fYmVnaW4oTm9uZSwgc2VsZi50eG5GbGFnKQorICAgICAgICAgICAgICAgIGtleXMyPWtleXNbOmNvdW50XQorICAgICAgICAgICAgICAgIGZvciB4IGluIGtleXMyIDoKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gJyUwNGQnICUgeAorICAgICAgICAgICAgICAgICAgICBkLnB1dChrZXksIHNlbGYubWFrZURhdGEoa2V5KSwgdHhuKQorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlIGFuZCB4ICUgMTAwID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiJXM6IHJlY29yZHMgJWQgLSAlZCBmaW5pc2hlZCIgJSAobmFtZSwgc3RhcnQsIHgpCisgICAgICAgICAgICAgICAgdHhuLmNvbW1pdCgpCisgICAgICAgICAgICAgICAga2V5cz1rZXlzW2NvdW50Ol0KKyAgICAgICAgICAgICAgICByZWFkZXJzLnBvcCgpLnN0YXJ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCAoZGIuREJMb2NrRGVhZGxvY2tFcnJvciwgZGIuREJMb2NrTm90R3JhbnRlZEVycm9yKSwgdmFsOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBBYm9ydGluZyB0cmFuc2FjdGlvbiAoJXMpIiAlIChuYW1lLCB2YWxbMV0pCisgICAgICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBBYm9ydGluZyB0cmFuc2FjdGlvbiAoJXMpIiAlIChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuYXJnc1sxXSkKKyAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IHRocmVhZCBmaW5pc2hlZCIgJSBuYW1lCisKKyAgICBkZWYgcmVhZGVyVGhyZWFkKHNlbGYsIGQsIHJlYWRlck51bSk6CisgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPCAzIDoKKyAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpCisgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRUaHJlYWQoKS5uYW1lCisKKyAgICAgICAgZmluaXNoZWQgPSBGYWxzZQorICAgICAgICB3aGlsZSBub3QgZmluaXNoZWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHhuID0gc2VsZi5lbnYudHhuX2JlZ2luKE5vbmUsIHNlbGYudHhuRmxhZykKKyAgICAgICAgICAgICAgICBjID0gZC5jdXJzb3IodHhuKQorICAgICAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgICAgIHJlYyA9IGMuZmlyc3QoKQorICAgICAgICAgICAgICAgIHdoaWxlIHJlYzoKKyAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgICAgICBrZXksIGRhdGEgPSByZWMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1ha2VEYXRhKGtleSksIGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHJlYyA9IGMubmV4dCgpCisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiVzOiBmb3VuZCAlZCByZWNvcmRzIiAlIChuYW1lLCBjb3VudCkKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgICAgICB0eG4uY29tbWl0KCkKKyAgICAgICAgICAgICAgICBmaW5pc2hlZCA9IFRydWUKKyAgICAgICAgICAgIGV4Y2VwdCAoZGIuREJMb2NrRGVhZGxvY2tFcnJvciwgZGIuREJMb2NrTm90R3JhbnRlZEVycm9yKSwgdmFsOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNikgOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBBYm9ydGluZyB0cmFuc2FjdGlvbiAoJXMpIiAlIChuYW1lLCB2YWxbMV0pCisgICAgICAgICAgICAgICAgICAgIGVsc2UgOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzOiBBYm9ydGluZyB0cmFuc2FjdGlvbiAoJXMpIiAlIChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwuYXJnc1sxXSkKKyAgICAgICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgICAgICB0eG4uYWJvcnQoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXM6IHRocmVhZCBmaW5pc2hlZCIgJSBuYW1lCisKKyAgICBkZWYgZGVhZGxvY2tUaHJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuZG9Mb2NrRGV0ZWN0ID0gVHJ1ZQorICAgICAgICB3aGlsZSBzZWxmLmRvTG9ja0RldGVjdDoKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wNSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhYm9ydGVkID0gc2VsZi5lbnYubG9ja19kZXRlY3QoCisgICAgICAgICAgICAgICAgICAgIGRiLkRCX0xPQ0tfUkFORE9NLCBkYi5EQl9MT0NLX0NPTkZMSUNUKQorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2UgYW5kIGFib3J0ZWQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJkZWFkbG9jazogQWJvcnRlZCAlZCBkZWFkbG9ja2VkIHRyYW5zYWN0aW9uKHMpIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICUgYWJvcnRlZAorICAgICAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisKK2NsYXNzIEJUcmVlVGhyZWFkZWRUcmFuc2FjdGlvbnMoVGhyZWFkZWRUcmFuc2FjdGlvbnNCYXNlKToKKyAgICBkYnR5cGUgPSBkYi5EQl9CVFJFRQorICAgIHdyaXRlcnMgPSAyCisgICAgcmVhZGVycyA9IDEwCisgICAgcmVjb3JkcyA9IDEwMDAKKworY2xhc3MgSGFzaFRocmVhZGVkVHJhbnNhY3Rpb25zKFRocmVhZGVkVHJhbnNhY3Rpb25zQmFzZSk6CisgICAgZGJ0eXBlID0gZGIuREJfSEFTSAorICAgIHdyaXRlcnMgPSAyCisgICAgcmVhZGVycyA9IDEwCisgICAgcmVjb3JkcyA9IDEwMDAKKworY2xhc3MgQlRyZWVUaHJlYWRlZE5vV2FpdFRyYW5zYWN0aW9ucyhUaHJlYWRlZFRyYW5zYWN0aW9uc0Jhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0JUUkVFCisgICAgd3JpdGVycyA9IDIKKyAgICByZWFkZXJzID0gMTAKKyAgICByZWNvcmRzID0gMTAwMAorICAgIHR4bkZsYWcgPSBkYi5EQl9UWE5fTk9XQUlUCisKK2NsYXNzIEhhc2hUaHJlYWRlZE5vV2FpdFRyYW5zYWN0aW9ucyhUaHJlYWRlZFRyYW5zYWN0aW9uc0Jhc2UpOgorICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKKyAgICB3cml0ZXJzID0gMgorICAgIHJlYWRlcnMgPSAxMAorICAgIHJlY29yZHMgPSAxMDAwCisgICAgdHhuRmxhZyA9IGRiLkRCX1RYTl9OT1dBSVQKKworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgIGlmIGhhdmVfdGhyZWFkczoKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVDb25jdXJyZW50RGF0YVN0b3JlKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSGFzaENvbmN1cnJlbnREYXRhU3RvcmUpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShCVHJlZVNpbXBsZVRocmVhZGVkKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoSGFzaFNpbXBsZVRocmVhZGVkKSkKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoQlRyZWVUaHJlYWRlZFRyYW5zYWN0aW9ucykpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEhhc2hUaHJlYWRlZFRyYW5zYWN0aW9ucykpCisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKEJUcmVlVGhyZWFkZWROb1dhaXRUcmFuc2FjdGlvbnMpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShIYXNoVGhyZWFkZWROb1dhaXRUcmFuc2FjdGlvbnMpKQorCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgIlRocmVhZHMgbm90IGF2YWlsYWJsZSwgc2tpcHBpbmcgdGhyZWFkIHRlc3RzLiIKKworICAgIHJldHVybiBzdWl0ZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0ndGVzdF9zdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF90aHJlYWQucHljIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDMwMTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2JzZGRiL3Rlc3QvdGVzdF90aHJlYWQucHlvIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDMwMTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ic2RkYi90ZXN0L3Rlc3RfdGhyZWFkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NQcm9maWxlLnB5IGIvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMmVmZDA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weQpAQCAtMCwwICsxLDE5OSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJQeXRob24gaW50ZXJmYWNlIGZvciB0aGUgJ2xzcHJvZicgcHJvZmlsZXIuCisgICBDb21wYXRpYmxlIHdpdGggdGhlICdwcm9maWxlJyBtb2R1bGUuCisiIiIKKworX19hbGxfXyA9IFsicnVuIiwgInJ1bmN0eCIsICJoZWxwIiwgIlByb2ZpbGUiXQorCitpbXBvcnQgX2xzcHJvZgorCisjIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworIyBTaW1wbGUgaW50ZXJmYWNlCisKK2RlZiBydW4oc3RhdGVtZW50LCBmaWxlbmFtZT1Ob25lLCBzb3J0PS0xKToKKyAgICAiIiJSdW4gc3RhdGVtZW50IHVuZGVyIHByb2ZpbGVyIG9wdGlvbmFsbHkgc2F2aW5nIHJlc3VsdHMgaW4gZmlsZW5hbWUKKworICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZQorICAgICJleGVjIiBzdGF0ZW1lbnQsIGFuZCBhbiBvcHRpb25hbCBmaWxlIG5hbWUuICBJbiBhbGwgY2FzZXMgdGhpcworICAgIHJvdXRpbmUgYXR0ZW1wdHMgdG8gImV4ZWMiIGl0cyBmaXJzdCBhcmd1bWVudCBhbmQgZ2F0aGVyIHByb2ZpbGluZworICAgIHN0YXRpc3RpY3MgZnJvbSB0aGUgZXhlY3V0aW9uLiBJZiBubyBmaWxlIG5hbWUgaXMgcHJlc2VudCwgdGhlbiB0aGlzCisgICAgZnVuY3Rpb24gYXV0b21hdGljYWxseSBwcmludHMgYSBzaW1wbGUgcHJvZmlsaW5nIHJlcG9ydCwgc29ydGVkIGJ5IHRoZQorICAgIHN0YW5kYXJkIG5hbWUgc3RyaW5nIChmaWxlL2xpbmUvZnVuY3Rpb24tbmFtZSkgdGhhdCBpcyBwcmVzZW50ZWQgaW4KKyAgICBlYWNoIGxpbmUuCisgICAgIiIiCisgICAgcHJvZiA9IFByb2ZpbGUoKQorICAgIHJlc3VsdCA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb2YgPSBwcm9mLnJ1bihzdGF0ZW1lbnQpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJvZi5kdW1wX3N0YXRzKGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gcHJvZi5wcmludF9zdGF0cyhzb3J0KQorICAgIHJldHVybiByZXN1bHQKKworZGVmIHJ1bmN0eChzdGF0ZW1lbnQsIGdsb2JhbHMsIGxvY2FscywgZmlsZW5hbWU9Tm9uZSwgc29ydD0tMSk6CisgICAgIiIiUnVuIHN0YXRlbWVudCB1bmRlciBwcm9maWxlciwgc3VwcGx5aW5nIHlvdXIgb3duIGdsb2JhbHMgYW5kIGxvY2FscywKKyAgICBvcHRpb25hbGx5IHNhdmluZyByZXN1bHRzIGluIGZpbGVuYW1lLgorCisgICAgc3RhdGVtZW50IGFuZCBmaWxlbmFtZSBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyBwcm9maWxlLnJ1bgorICAgICIiIgorICAgIHByb2YgPSBQcm9maWxlKCkKKyAgICByZXN1bHQgPSBOb25lCisgICAgdHJ5OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm9mID0gcHJvZi5ydW5jdHgoc3RhdGVtZW50LCBnbG9iYWxzLCBsb2NhbHMpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIGlmIGZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJvZi5kdW1wX3N0YXRzKGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0ID0gcHJvZi5wcmludF9zdGF0cyhzb3J0KQorICAgIHJldHVybiByZXN1bHQKKworIyBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KK2RlZiBoZWxwKCk6CisgICAgcHJpbnQgIkRvY3VtZW50YXRpb24gZm9yIHRoZSBwcm9maWxlL2NQcm9maWxlIG1vZHVsZXMgY2FuIGJlIGZvdW5kICIKKyAgICBwcmludCAiaW4gdGhlIFB5dGhvbiBMaWJyYXJ5IFJlZmVyZW5jZSwgc2VjdGlvbiAnVGhlIFB5dGhvbiBQcm9maWxlcicuIgorCisjIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCitjbGFzcyBQcm9maWxlKF9sc3Byb2YuUHJvZmlsZXIpOgorICAgICIiIlByb2ZpbGUoY3VzdG9tX3RpbWVyPU5vbmUsIHRpbWVfdW5pdD1Ob25lLCBzdWJjYWxscz1UcnVlLCBidWlsdGlucz1UcnVlKQorCisgICAgQnVpbGRzIGEgcHJvZmlsZXIgb2JqZWN0IHVzaW5nIHRoZSBzcGVjaWZpZWQgdGltZXIgZnVuY3Rpb24uCisgICAgVGhlIGRlZmF1bHQgdGltZXIgaXMgYSBmYXN0IGJ1aWx0LWluIG9uZSBiYXNlZCBvbiByZWFsIHRpbWUuCisgICAgRm9yIGN1c3RvbSB0aW1lciBmdW5jdGlvbnMgcmV0dXJuaW5nIGludGVnZXJzLCB0aW1lX3VuaXQgY2FuCisgICAgYmUgYSBmbG9hdCBzcGVjaWZ5aW5nIGEgc2NhbGUgKGkuZS4gaG93IGxvbmcgZWFjaCBpbnRlZ2VyIHVuaXQKKyAgICBpcywgaW4gc2Vjb25kcykuCisgICAgIiIiCisKKyAgICAjIE1vc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgaXMgaW4gdGhlIGJhc2UgY2xhc3MuCisgICAgIyBUaGlzIHN1YmNsYXNzIG9ubHkgYWRkcyBjb252ZW5pZW50IGFuZCBiYWNrd2FyZC1jb21wYXRpYmxlIG1ldGhvZHMuCisKKyAgICBkZWYgcHJpbnRfc3RhdHMoc2VsZiwgc29ydD0tMSk6CisgICAgICAgIGltcG9ydCBwc3RhdHMKKyAgICAgICAgcHN0YXRzLlN0YXRzKHNlbGYpLnN0cmlwX2RpcnMoKS5zb3J0X3N0YXRzKHNvcnQpLnByaW50X3N0YXRzKCkKKworICAgIGRlZiBkdW1wX3N0YXRzKHNlbGYsIGZpbGUpOgorICAgICAgICBpbXBvcnQgbWFyc2hhbAorICAgICAgICBmID0gb3BlbihmaWxlLCAnd2InKQorICAgICAgICBzZWxmLmNyZWF0ZV9zdGF0cygpCisgICAgICAgIG1hcnNoYWwuZHVtcChzZWxmLnN0YXRzLCBmKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBjcmVhdGVfc3RhdHMoc2VsZik6CisgICAgICAgIHNlbGYuZGlzYWJsZSgpCisgICAgICAgIHNlbGYuc25hcHNob3Rfc3RhdHMoKQorCisgICAgZGVmIHNuYXBzaG90X3N0YXRzKHNlbGYpOgorICAgICAgICBlbnRyaWVzID0gc2VsZi5nZXRzdGF0cygpCisgICAgICAgIHNlbGYuc3RhdHMgPSB7fQorICAgICAgICBjYWxsZXJzZGljdHMgPSB7fQorICAgICAgICAjIGNhbGwgaW5mb3JtYXRpb24KKyAgICAgICAgZm9yIGVudHJ5IGluIGVudHJpZXM6CisgICAgICAgICAgICBmdW5jID0gbGFiZWwoZW50cnkuY29kZSkKKyAgICAgICAgICAgIG5jID0gZW50cnkuY2FsbGNvdW50ICAgICAgICAgIyBuY2FsbHMgY29sdW1uIG9mIHBzdGF0cyAoYmVmb3JlICcvJykKKyAgICAgICAgICAgIGNjID0gbmMgLSBlbnRyeS5yZWNjYWxsY291bnQgIyBuY2FsbHMgY29sdW1uIG9mIHBzdGF0cyAoYWZ0ZXIgJy8nKQorICAgICAgICAgICAgdHQgPSBlbnRyeS5pbmxpbmV0aW1lICAgICAgICAjIHRvdHRpbWUgY29sdW1uIG9mIHBzdGF0cworICAgICAgICAgICAgY3QgPSBlbnRyeS50b3RhbHRpbWUgICAgICAgICAjIGN1bXRpbWUgY29sdW1uIG9mIHBzdGF0cworICAgICAgICAgICAgY2FsbGVycyA9IHt9CisgICAgICAgICAgICBjYWxsZXJzZGljdHNbaWQoZW50cnkuY29kZSldID0gY2FsbGVycworICAgICAgICAgICAgc2VsZi5zdGF0c1tmdW5jXSA9IGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzCisgICAgICAgICMgc3ViY2FsbCBpbmZvcm1hdGlvbgorICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmNhbGxzOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBsYWJlbChlbnRyeS5jb2RlKQorICAgICAgICAgICAgICAgIGZvciBzdWJlbnRyeSBpbiBlbnRyeS5jYWxsczoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVycyA9IGNhbGxlcnNkaWN0c1tpZChzdWJlbnRyeS5jb2RlKV0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgbmMgPSBzdWJlbnRyeS5jYWxsY291bnQKKyAgICAgICAgICAgICAgICAgICAgY2MgPSBuYyAtIHN1YmVudHJ5LnJlY2NhbGxjb3VudAorICAgICAgICAgICAgICAgICAgICB0dCA9IHN1YmVudHJ5LmlubGluZXRpbWUKKyAgICAgICAgICAgICAgICAgICAgY3QgPSBzdWJlbnRyeS50b3RhbHRpbWUKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVuYyBpbiBjYWxsZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IGNhbGxlcnNbZnVuY10KKyAgICAgICAgICAgICAgICAgICAgICAgIG5jICs9IHByZXZbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNjICs9IHByZXZbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHR0ICs9IHByZXZbMl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN0ICs9IHByZXZbM10KKyAgICAgICAgICAgICAgICAgICAgY2FsbGVyc1tmdW5jXSA9IG5jLCBjYywgdHQsIGN0CisKKyAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBieSBjbGllbnRzIHRvIHVzZQorICAgICMgYSBwcm9maWxlciB0byBwcm9maWxlIGEgc3RhdGVtZW50LCBnaXZlbiBhcyBhIHN0cmluZy4KKworICAgIGRlZiBydW4oc2VsZiwgY21kKToKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIGRpY3QgPSBfX21haW5fXy5fX2RpY3RfXworICAgICAgICByZXR1cm4gc2VsZi5ydW5jdHgoY21kLCBkaWN0LCBkaWN0KQorCisgICAgZGVmIHJ1bmN0eChzZWxmLCBjbWQsIGdsb2JhbHMsIGxvY2Fscyk6CisgICAgICAgIHNlbGYuZW5hYmxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyBjbWQgaW4gZ2xvYmFscywgbG9jYWxzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmRpc2FibGUoKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgIyBUaGlzIG1ldGhvZCBpcyBtb3JlIHVzZWZ1bCB0byBwcm9maWxlIGEgc2luZ2xlIGZ1bmN0aW9uIGNhbGwuCisgICAgZGVmIHJ1bmNhbGwoc2VsZiwgZnVuYywgKmFyZ3MsICoqa3cpOgorICAgICAgICBzZWxmLmVuYWJsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5kaXNhYmxlKCkKKworIyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworZGVmIGxhYmVsKGNvZGUpOgorICAgIGlmIGlzaW5zdGFuY2UoY29kZSwgc3RyKToKKyAgICAgICAgcmV0dXJuICgnficsIDAsIGNvZGUpICAgICMgYnVpbHQtaW4gZnVuY3Rpb25zICgnficgc29ydHMgYXQgdGhlIGVuZCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gKGNvZGUuY29fZmlsZW5hbWUsIGNvZGUuY29fZmlyc3RsaW5lbm8sIGNvZGUuY29fbmFtZSkKKworIyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKworZGVmIG1haW4oKToKKyAgICBpbXBvcnQgb3MsIHN5cworICAgIGZyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorICAgIHVzYWdlID0gImNQcm9maWxlLnB5IFstbyBvdXRwdXRfZmlsZV9wYXRoXSBbLXMgc29ydF0gc2NyaXB0ZmlsZSBbYXJnXSAuLi4iCisgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKHVzYWdlPXVzYWdlKQorICAgIHBhcnNlci5hbGxvd19pbnRlcnNwZXJzZWRfYXJncyA9IEZhbHNlCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1vJywgJy0tb3V0ZmlsZScsIGRlc3Q9Im91dGZpbGUiLAorICAgICAgICBoZWxwPSJTYXZlIHN0YXRzIHRvIDxvdXRmaWxlPiIsIGRlZmF1bHQ9Tm9uZSkKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXMnLCAnLS1zb3J0JywgZGVzdD0ic29ydCIsCisgICAgICAgIGhlbHA9IlNvcnQgb3JkZXIgd2hlbiBwcmludGluZyB0byBzdGRvdXQsIGJhc2VkIG9uIHBzdGF0cy5TdGF0cyBjbGFzcyIsCisgICAgICAgIGRlZmF1bHQ9LTEpCisKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBwYXJzZXIucHJpbnRfdXNhZ2UoKQorICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorICAgIHN5cy5hcmd2WzpdID0gYXJncworCisgICAgaWYgbGVuKGFyZ3MpID4gMDoKKyAgICAgICAgcHJvZ25hbWUgPSBhcmdzWzBdCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmRpcm5hbWUocHJvZ25hbWUpKQorICAgICAgICB3aXRoIG9wZW4ocHJvZ25hbWUsICdyYicpIGFzIGZwOgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZnAucmVhZCgpLCBwcm9nbmFtZSwgJ2V4ZWMnKQorICAgICAgICBnbG9icyA9IHsKKyAgICAgICAgICAgICdfX2ZpbGVfXyc6IHByb2duYW1lLAorICAgICAgICAgICAgJ19fbmFtZV9fJzogJ19fbWFpbl9fJywKKyAgICAgICAgICAgICdfX3BhY2thZ2VfXyc6IE5vbmUsCisgICAgICAgIH0KKyAgICAgICAgcnVuY3R4KGNvZGUsIGdsb2JzLCBOb25lLCBvcHRpb25zLm91dGZpbGUsIG9wdGlvbnMuc29ydCkKKyAgICBlbHNlOgorICAgICAgICBwYXJzZXIucHJpbnRfdXNhZ2UoKQorICAgIHJldHVybiBwYXJzZXIKKworIyBXaGVuIGludm9rZWQgYXMgbWFpbiBwcm9ncmFtLCBpbnZva2UgdGhlIHByb2ZpbGVyIG9uIGEgc2NyaXB0CitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L2NQcm9maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVmZDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L2NQcm9maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTVmZDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jUHJvZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jYWxlbmRhci5weSBiL2xpYi9weXRob24yLjcvY2FsZW5kYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQxYjJmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2FsZW5kYXIucHkKQEAgLTAsMCArMSw3MTMgQEAKKyIiIkNhbGVuZGFyIHByaW50aW5nIGZ1bmN0aW9ucworCitOb3RlIHdoZW4gY29tcGFyaW5nIHRoZXNlIGNhbGVuZGFycyB0byB0aGUgb25lcyBwcmludGVkIGJ5IGNhbCgxKTogQnkKK2RlZmF1bHQsIHRoZXNlIGNhbGVuZGFycyBoYXZlIE1vbmRheSBhcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLCBhbmQKK1N1bmRheSBhcyB0aGUgbGFzdCAodGhlIEV1cm9wZWFuIGNvbnZlbnRpb24pLiBVc2Ugc2V0Zmlyc3R3ZWVrZGF5KCkgdG8KK3NldCB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrICgwPU1vbmRheSwgNj1TdW5kYXkpLiIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBsb2NhbGUgYXMgX2xvY2FsZQorCitfX2FsbF9fID0gWyJJbGxlZ2FsTW9udGhFcnJvciIsICJJbGxlZ2FsV2Vla2RheUVycm9yIiwgInNldGZpcnN0d2Vla2RheSIsCisgICAgICAgICAgICJmaXJzdHdlZWtkYXkiLCAiaXNsZWFwIiwgImxlYXBkYXlzIiwgIndlZWtkYXkiLCAibW9udGhyYW5nZSIsCisgICAgICAgICAgICJtb250aGNhbGVuZGFyIiwgInBybW9udGgiLCAibW9udGgiLCAicHJjYWwiLCAiY2FsZW5kYXIiLAorICAgICAgICAgICAidGltZWdtIiwgIm1vbnRoX25hbWUiLCAibW9udGhfYWJiciIsICJkYXlfbmFtZSIsICJkYXlfYWJiciJdCisKKyMgRXhjZXB0aW9uIHJhaXNlZCBmb3IgYmFkIGlucHV0ICh3aXRoIHN0cmluZyBwYXJhbWV0ZXIgZm9yIGRldGFpbHMpCitlcnJvciA9IFZhbHVlRXJyb3IKKworIyBFeGNlcHRpb25zIHJhaXNlZCBmb3IgYmFkIGlucHV0CitjbGFzcyBJbGxlZ2FsTW9udGhFcnJvcihWYWx1ZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9udGgpOgorICAgICAgICBzZWxmLm1vbnRoID0gbW9udGgKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJiYWQgbW9udGggbnVtYmVyICVyOyBtdXN0IGJlIDEtMTIiICUgc2VsZi5tb250aAorCisKK2NsYXNzIElsbGVnYWxXZWVrZGF5RXJyb3IoVmFsdWVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdlZWtkYXkpOgorICAgICAgICBzZWxmLndlZWtkYXkgPSB3ZWVrZGF5CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiYmFkIHdlZWtkYXkgbnVtYmVyICVyOyBtdXN0IGJlIDAgKE1vbmRheSkgdG8gNiAoU3VuZGF5KSIgJSBzZWxmLndlZWtkYXkKKworCisjIENvbnN0YW50cyBmb3IgbW9udGhzIHJlZmVyZW5jZWQgbGF0ZXIKK0phbnVhcnkgPSAxCitGZWJydWFyeSA9IDIKKworIyBOdW1iZXIgb2YgZGF5cyBwZXIgbW9udGggKGV4Y2VwdCBmb3IgRmVicnVhcnkgaW4gbGVhcCB5ZWFycykKK21kYXlzID0gWzAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzFdCisKKyMgVGhpcyBtb2R1bGUgdXNlZCB0byBoYXZlIGhhcmQtY29kZWQgbGlzdHMgb2YgZGF5IGFuZCBtb250aCBuYW1lcywgYXMKKyMgRW5nbGlzaCBzdHJpbmdzLiAgVGhlIGNsYXNzZXMgZm9sbG93aW5nIGVtdWxhdGUgYSByZWFkLW9ubHkgdmVyc2lvbiBvZgorIyB0aGF0LCBidXQgc3VwcGx5IGxvY2FsaXplZCBuYW1lcy4gIE5vdGUgdGhhdCB0aGUgdmFsdWVzIGFyZSBjb21wdXRlZAorIyBmcmVzaCBvbiBlYWNoIGNhbGwsIGluIGNhc2UgdGhlIHVzZXIgY2hhbmdlcyBsb2NhbGUgYmV0d2VlbiBjYWxscy4KKworY2xhc3MgX2xvY2FsaXplZF9tb250aDoKKworICAgIF9tb250aHMgPSBbZGF0ZXRpbWUuZGF0ZSgyMDAxLCBpKzEsIDEpLnN0cmZ0aW1lIGZvciBpIGluIHJhbmdlKDEyKV0KKyAgICBfbW9udGhzLmluc2VydCgwLCBsYW1iZGEgeDogIiIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0KToKKyAgICAgICAgc2VsZi5mb3JtYXQgPSBmb3JtYXQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgZnVuY3MgPSBzZWxmLl9tb250aHNbaV0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShpLCBzbGljZSk6CisgICAgICAgICAgICByZXR1cm4gW2Yoc2VsZi5mb3JtYXQpIGZvciBmIGluIGZ1bmNzXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGZ1bmNzKHNlbGYuZm9ybWF0KQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAxMworCisKK2NsYXNzIF9sb2NhbGl6ZWRfZGF5OgorCisgICAgIyBKYW51YXJ5IDEsIDIwMDEsIHdhcyBhIE1vbmRheS4KKyAgICBfZGF5cyA9IFtkYXRldGltZS5kYXRlKDIwMDEsIDEsIGkrMSkuc3RyZnRpbWUgZm9yIGkgaW4gcmFuZ2UoNyldCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0KToKKyAgICAgICAgc2VsZi5mb3JtYXQgPSBmb3JtYXQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgZnVuY3MgPSBzZWxmLl9kYXlzW2ldCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaSwgc2xpY2UpOgorICAgICAgICAgICAgcmV0dXJuIFtmKHNlbGYuZm9ybWF0KSBmb3IgZiBpbiBmdW5jc10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmdW5jcyhzZWxmLmZvcm1hdCkKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gNworCisKKyMgRnVsbCBhbmQgYWJicmV2aWF0ZWQgbmFtZXMgb2Ygd2Vla2RheXMKK2RheV9uYW1lID0gX2xvY2FsaXplZF9kYXkoJyVBJykKK2RheV9hYmJyID0gX2xvY2FsaXplZF9kYXkoJyVhJykKKworIyBGdWxsIGFuZCBhYmJyZXZpYXRlZCBuYW1lcyBvZiBtb250aHMgKDEtYmFzZWQgYXJyYXlzISEhKQorbW9udGhfbmFtZSA9IF9sb2NhbGl6ZWRfbW9udGgoJyVCJykKK21vbnRoX2FiYnIgPSBfbG9jYWxpemVkX21vbnRoKCclYicpCisKKyMgQ29uc3RhbnRzIGZvciB3ZWVrZGF5cworKE1PTkRBWSwgVFVFU0RBWSwgV0VETkVTREFZLCBUSFVSU0RBWSwgRlJJREFZLCBTQVRVUkRBWSwgU1VOREFZKSA9IHJhbmdlKDcpCisKKworZGVmIGlzbGVhcCh5ZWFyKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBmb3IgbGVhcCB5ZWFycywgRmFsc2UgZm9yIG5vbi1sZWFwIHllYXJzLiIiIgorICAgIHJldHVybiB5ZWFyICUgNCA9PSAwIGFuZCAoeWVhciAlIDEwMCAhPSAwIG9yIHllYXIgJSA0MDAgPT0gMCkKKworCitkZWYgbGVhcGRheXMoeTEsIHkyKToKKyAgICAiIiJSZXR1cm4gbnVtYmVyIG9mIGxlYXAgeWVhcnMgaW4gcmFuZ2UgW3kxLCB5MikuCisgICAgICAgQXNzdW1lIHkxIDw9IHkyLiIiIgorICAgIHkxIC09IDEKKyAgICB5MiAtPSAxCisgICAgcmV0dXJuICh5Mi8vNCAtIHkxLy80KSAtICh5Mi8vMTAwIC0geTEvLzEwMCkgKyAoeTIvLzQwMCAtIHkxLy80MDApCisKKworZGVmIHdlZWtkYXkoeWVhciwgbW9udGgsIGRheSk6CisgICAgIiIiUmV0dXJuIHdlZWtkYXkgKDAtNiB+IE1vbi1TdW4pIGZvciB5ZWFyICgxOTcwLS4uLiksIG1vbnRoICgxLTEyKSwKKyAgICAgICBkYXkgKDEtMzEpLiIiIgorICAgIHJldHVybiBkYXRldGltZS5kYXRlKHllYXIsIG1vbnRoLCBkYXkpLndlZWtkYXkoKQorCisKK2RlZiBtb250aHJhbmdlKHllYXIsIG1vbnRoKToKKyAgICAiIiJSZXR1cm4gd2Vla2RheSAoMC02IH4gTW9uLVN1bikgYW5kIG51bWJlciBvZiBkYXlzICgyOC0zMSkgZm9yCisgICAgICAgeWVhciwgbW9udGguIiIiCisgICAgaWYgbm90IDEgPD0gbW9udGggPD0gMTI6CisgICAgICAgIHJhaXNlIElsbGVnYWxNb250aEVycm9yKG1vbnRoKQorICAgIGRheTEgPSB3ZWVrZGF5KHllYXIsIG1vbnRoLCAxKQorICAgIG5kYXlzID0gbWRheXNbbW9udGhdICsgKG1vbnRoID09IEZlYnJ1YXJ5IGFuZCBpc2xlYXAoeWVhcikpCisgICAgcmV0dXJuIGRheTEsIG5kYXlzCisKKworY2xhc3MgQ2FsZW5kYXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBCYXNlIGNhbGVuZGFyIGNsYXNzLiBUaGlzIGNsYXNzIGRvZXNuJ3QgZG8gYW55IGZvcm1hdHRpbmcuIEl0IHNpbXBseQorICAgIHByb3ZpZGVzIGRhdGEgdG8gc3ViY2xhc3Nlcy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXk9MCk6CisgICAgICAgIHNlbGYuZmlyc3R3ZWVrZGF5ID0gZmlyc3R3ZWVrZGF5ICMgMCA9IE1vbmRheSwgNiA9IFN1bmRheQorCisgICAgZGVmIGdldGZpcnN0d2Vla2RheShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpcnN0d2Vla2RheSAlIDcKKworICAgIGRlZiBzZXRmaXJzdHdlZWtkYXkoc2VsZiwgZmlyc3R3ZWVrZGF5KToKKyAgICAgICAgc2VsZi5fZmlyc3R3ZWVrZGF5ID0gZmlyc3R3ZWVrZGF5CisKKyAgICBmaXJzdHdlZWtkYXkgPSBwcm9wZXJ0eShnZXRmaXJzdHdlZWtkYXksIHNldGZpcnN0d2Vla2RheSkKKworICAgIGRlZiBpdGVyd2Vla2RheXMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBpdGVyYXRvciBmb3Igb25lIHdlZWsgb2Ygd2Vla2RheSBudW1iZXJzIHN0YXJ0aW5nIHdpdGggdGhlCisgICAgICAgIGNvbmZpZ3VyZWQgZmlyc3Qgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5maXJzdHdlZWtkYXksIHNlbGYuZmlyc3R3ZWVrZGF5ICsgNyk6CisgICAgICAgICAgICB5aWVsZCBpJTcKKworICAgIGRlZiBpdGVybW9udGhkYXRlcyhzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIG9uZSBtb250aC4gVGhlIGl0ZXJhdG9yIHdpbGwgeWllbGQgZGF0ZXRpbWUuZGF0ZQorICAgICAgICB2YWx1ZXMgYW5kIHdpbGwgYWx3YXlzIGl0ZXJhdGUgdGhyb3VnaCBjb21wbGV0ZSB3ZWVrcywgc28gaXQgd2lsbCB5aWVsZAorICAgICAgICBkYXRlcyBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgbW9udGguCisgICAgICAgICIiIgorICAgICAgICBkYXRlID0gZGF0ZXRpbWUuZGF0ZSh5ZWFyLCBtb250aCwgMSkKKyAgICAgICAgIyBHbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdlZWsKKyAgICAgICAgZGF5cyA9IChkYXRlLndlZWtkYXkoKSAtIHNlbGYuZmlyc3R3ZWVrZGF5KSAlIDcKKyAgICAgICAgZGF0ZSAtPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz1kYXlzKQorICAgICAgICBvbmVkYXkgPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz0xKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgZGF0ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRhdGUgKz0gb25lZGF5CisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICAjIEFkZGluZyBvbmUgZGF5IGNvdWxkIGZhaWwgYWZ0ZXIgZGF0ZXRpbWUuTUFYWUVBUgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBkYXRlLm1vbnRoICE9IG1vbnRoIGFuZCBkYXRlLndlZWtkYXkoKSA9PSBzZWxmLmZpcnN0d2Vla2RheToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGl0ZXJtb250aGRheXMyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIExpa2UgaXRlcm1vbnRoZGF0ZXMoKSwgYnV0IHdpbGwgeWllbGQgKGRheSBudW1iZXIsIHdlZWtkYXkgbnVtYmVyKQorICAgICAgICB0dXBsZXMuIEZvciBkYXlzIG91dHNpZGUgdGhlIHNwZWNpZmllZCBtb250aCB0aGUgZGF5IG51bWJlciBpcyAwLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGRhdGUgaW4gc2VsZi5pdGVybW9udGhkYXRlcyh5ZWFyLCBtb250aCk6CisgICAgICAgICAgICBpZiBkYXRlLm1vbnRoICE9IG1vbnRoOgorICAgICAgICAgICAgICAgIHlpZWxkICgwLCBkYXRlLndlZWtkYXkoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgKGRhdGUuZGF5LCBkYXRlLndlZWtkYXkoKSkKKworICAgIGRlZiBpdGVybW9udGhkYXlzKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIExpa2UgaXRlcm1vbnRoZGF0ZXMoKSwgYnV0IHdpbGwgeWllbGQgZGF5IG51bWJlcnMuIEZvciBkYXlzIG91dHNpZGUKKyAgICAgICAgdGhlIHNwZWNpZmllZCBtb250aCB0aGUgZGF5IG51bWJlciBpcyAwLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGRhdGUgaW4gc2VsZi5pdGVybW9udGhkYXRlcyh5ZWFyLCBtb250aCk6CisgICAgICAgICAgICBpZiBkYXRlLm1vbnRoICE9IG1vbnRoOgorICAgICAgICAgICAgICAgIHlpZWxkIDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgZGF0ZS5kYXkKKworICAgIGRlZiBtb250aGRhdGVzY2FsZW5kYXIoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbWF0cml4IChsaXN0IG9mIGxpc3RzKSByZXByZXNlbnRpbmcgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICBFYWNoIHJvdyByZXByZXNlbnRzIGEgd2Vlazsgd2VlayBlbnRyaWVzIGFyZSBkYXRldGltZS5kYXRlIHZhbHVlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGRhdGVzID0gbGlzdChzZWxmLml0ZXJtb250aGRhdGVzKHllYXIsIG1vbnRoKSkKKyAgICAgICAgcmV0dXJuIFsgZGF0ZXNbaTppKzddIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRlcyksIDcpIF0KKworICAgIGRlZiBtb250aGRheXMyY2FsZW5kYXIoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbWF0cml4IHJlcHJlc2VudGluZyBhIG1vbnRoJ3MgY2FsZW5kYXIuCisgICAgICAgIEVhY2ggcm93IHJlcHJlc2VudHMgYSB3ZWVrOyB3ZWVrIGVudHJpZXMgYXJlCisgICAgICAgIChkYXkgbnVtYmVyLCB3ZWVrZGF5IG51bWJlcikgdHVwbGVzLiBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGgKKyAgICAgICAgYXJlIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBkYXlzID0gbGlzdChzZWxmLml0ZXJtb250aGRheXMyKHllYXIsIG1vbnRoKSkKKyAgICAgICAgcmV0dXJuIFsgZGF5c1tpOmkrN10gZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGRheXMpLCA3KSBdCisKKyAgICBkZWYgbW9udGhkYXlzY2FsZW5kYXIoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbWF0cml4IHJlcHJlc2VudGluZyBhIG1vbnRoJ3MgY2FsZW5kYXIuCisgICAgICAgIEVhY2ggcm93IHJlcHJlc2VudHMgYSB3ZWVrOyBkYXlzIG91dHNpZGUgdGhpcyBtb250aCBhcmUgemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIGRheXMgPSBsaXN0KHNlbGYuaXRlcm1vbnRoZGF5cyh5ZWFyLCBtb250aCkpCisgICAgICAgIHJldHVybiBbIGRheXNbaTppKzddIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXlzKSwgNykgXQorCisgICAgZGVmIHllYXJkYXRlc2NhbGVuZGFyKHNlbGYsIHllYXIsIHdpZHRoPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcuIFRoZSByZXR1cm4KKyAgICAgICAgdmFsdWUgaXMgYSBsaXN0IG9mIG1vbnRoIHJvd3MuIEVhY2ggbW9udGggcm93IGNvbnRhaW5zIHVwdG8gd2lkdGggbW9udGhzLgorICAgICAgICBFYWNoIG1vbnRoIGNvbnRhaW5zIGJldHdlZW4gNCBhbmQgNiB3ZWVrcyBhbmQgZWFjaCB3ZWVrIGNvbnRhaW5zIDEtNworICAgICAgICBkYXlzLiBEYXlzIGFyZSBkYXRldGltZS5kYXRlIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICBtb250aHMgPSBbCisgICAgICAgICAgICBzZWxmLm1vbnRoZGF0ZXNjYWxlbmRhcih5ZWFyLCBpKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoSmFudWFyeSwgSmFudWFyeSsxMikKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gW21vbnRoc1tpOmkrd2lkdGhdIGZvciBpIGluIHJhbmdlKDAsIGxlbihtb250aHMpLCB3aWR0aCkgXQorCisgICAgZGVmIHllYXJkYXlzMmNhbGVuZGFyKHNlbGYsIHllYXIsIHdpZHRoPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcgKHNpbWlsYXIgdG8KKyAgICAgICAgeWVhcmRhdGVzY2FsZW5kYXIoKSkuIEVudHJpZXMgaW4gdGhlIHdlZWsgbGlzdHMgYXJlCisgICAgICAgIChkYXkgbnVtYmVyLCB3ZWVrZGF5IG51bWJlcikgdHVwbGVzLiBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlCisgICAgICAgIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBtb250aHMgPSBbCisgICAgICAgICAgICBzZWxmLm1vbnRoZGF5czJjYWxlbmRhcih5ZWFyLCBpKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoSmFudWFyeSwgSmFudWFyeSsxMikKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gW21vbnRoc1tpOmkrd2lkdGhdIGZvciBpIGluIHJhbmdlKDAsIGxlbihtb250aHMpLCB3aWR0aCkgXQorCisgICAgZGVmIHllYXJkYXlzY2FsZW5kYXIoc2VsZiwgeWVhciwgd2lkdGg9Myk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgeWVhciByZWFkeSBmb3IgZm9ybWF0dGluZyAoc2ltaWxhciB0bworICAgICAgICB5ZWFyZGF0ZXNjYWxlbmRhcigpKS4gRW50cmllcyBpbiB0aGUgd2VlayBsaXN0cyBhcmUgZGF5IG51bWJlcnMuCisgICAgICAgIERheSBudW1iZXJzIG91dHNpZGUgdGhpcyBtb250aCBhcmUgemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIG1vbnRocyA9IFsKKyAgICAgICAgICAgIHNlbGYubW9udGhkYXlzY2FsZW5kYXIoeWVhciwgaSkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIpCisgICAgICAgIF0KKyAgICAgICAgcmV0dXJuIFttb250aHNbaTppK3dpZHRoXSBmb3IgaSBpbiByYW5nZSgwLCBsZW4obW9udGhzKSwgd2lkdGgpIF0KKworCitjbGFzcyBUZXh0Q2FsZW5kYXIoQ2FsZW5kYXIpOgorICAgICIiIgorICAgIFN1YmNsYXNzIG9mIENhbGVuZGFyIHRoYXQgb3V0cHV0cyBhIGNhbGVuZGFyIGFzIGEgc2ltcGxlIHBsYWluIHRleHQKKyAgICBzaW1pbGFyIHRvIHRoZSBVTklYIHByb2dyYW0gY2FsLgorICAgICIiIgorCisgICAgZGVmIHByd2VlayhzZWxmLCB0aGV3ZWVrLCB3aWR0aCk6CisgICAgICAgICIiIgorICAgICAgICBQcmludCBhIHNpbmdsZSB3ZWVrIChubyBuZXdsaW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHByaW50IHNlbGYuZm9ybWF0d2Vlayh0aGV3ZWVrLCB3aWR0aCksCisKKyAgICBkZWYgZm9ybWF0ZGF5KHNlbGYsIGRheSwgd2Vla2RheSwgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGZvcm1hdHRlZCBkYXkuCisgICAgICAgICIiIgorICAgICAgICBpZiBkYXkgPT0gMDoKKyAgICAgICAgICAgIHMgPSAnJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9ICclMmknICUgZGF5ICAgICAgICAgICAgICMgcmlnaHQtYWxpZ24gc2luZ2xlLWRpZ2l0IGRheXMKKyAgICAgICAgcmV0dXJuIHMuY2VudGVyKHdpZHRoKQorCisgICAgZGVmIGZvcm1hdHdlZWsoc2VsZiwgdGhld2Vlaywgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIHNpbmdsZSB3ZWVrIGluIGEgc3RyaW5nIChubyBuZXdsaW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLmZvcm1hdGRheShkLCB3ZCwgd2lkdGgpIGZvciAoZCwgd2QpIGluIHRoZXdlZWspCisKKyAgICBkZWYgZm9ybWF0d2Vla2RheShzZWxmLCBkYXksIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBmb3JtYXR0ZWQgd2VlayBkYXkgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdpZHRoID49IDk6CisgICAgICAgICAgICBuYW1lcyA9IGRheV9uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lcyA9IGRheV9hYmJyCisgICAgICAgIHJldHVybiBuYW1lc1tkYXldWzp3aWR0aF0uY2VudGVyKHdpZHRoKQorCisgICAgZGVmIGZvcm1hdHdlZWtoZWFkZXIoc2VsZiwgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgaGVhZGVyIGZvciBhIHdlZWsuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJyAnLmpvaW4oc2VsZi5mb3JtYXR3ZWVrZGF5KGksIHdpZHRoKSBmb3IgaSBpbiBzZWxmLml0ZXJ3ZWVrZGF5cygpKQorCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2lkdGgsIHdpdGh5ZWFyPVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZm9ybWF0dGVkIG1vbnRoIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBzID0gbW9udGhfbmFtZVt0aGVtb250aF0KKyAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICBzID0gIiVzICVyIiAlIChzLCB0aGV5ZWFyKQorICAgICAgICByZXR1cm4gcy5jZW50ZXIod2lkdGgpCisKKyAgICBkZWYgcHJtb250aChzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgdz0wLCBsPTApOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICAiIiIKKyAgICAgICAgcHJpbnQgc2VsZi5mb3JtYXRtb250aCh0aGV5ZWFyLCB0aGVtb250aCwgdywgbCksCisKKyAgICBkZWYgZm9ybWF0bW9udGgoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHc9MCwgbD0wKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1vbnRoJ3MgY2FsZW5kYXIgc3RyaW5nIChtdWx0aS1saW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHcgPSBtYXgoMiwgdykKKyAgICAgICAgbCA9IG1heCgxLCBsKQorICAgICAgICBzID0gc2VsZi5mb3JtYXRtb250aG5hbWUodGhleWVhciwgdGhlbW9udGgsIDcgKiAodyArIDEpIC0gMSkKKyAgICAgICAgcyA9IHMucnN0cmlwKCkKKyAgICAgICAgcyArPSAnXG4nICogbAorICAgICAgICBzICs9IHNlbGYuZm9ybWF0d2Vla2hlYWRlcih3KS5yc3RyaXAoKQorICAgICAgICBzICs9ICdcbicgKiBsCisgICAgICAgIGZvciB3ZWVrIGluIHNlbGYubW9udGhkYXlzMmNhbGVuZGFyKHRoZXllYXIsIHRoZW1vbnRoKToKKyAgICAgICAgICAgIHMgKz0gc2VsZi5mb3JtYXR3ZWVrKHdlZWssIHcpLnJzdHJpcCgpCisgICAgICAgICAgICBzICs9ICdcbicgKiBsCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgZm9ybWF0eWVhcihzZWxmLCB0aGV5ZWFyLCB3PTIsIGw9MSwgYz02LCBtPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIHllYXIncyBjYWxlbmRhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgdyA9IG1heCgyLCB3KQorICAgICAgICBsID0gbWF4KDEsIGwpCisgICAgICAgIGMgPSBtYXgoMiwgYykKKyAgICAgICAgY29sd2lkdGggPSAodyArIDEpICogNyAtIDEKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICBhKHJlcHIodGhleWVhcikuY2VudGVyKGNvbHdpZHRoKm0rYyoobS0xKSkucnN0cmlwKCkpCisgICAgICAgIGEoJ1xuJypsKQorICAgICAgICBoZWFkZXIgPSBzZWxmLmZvcm1hdHdlZWtoZWFkZXIodykKKyAgICAgICAgZm9yIChpLCByb3cpIGluIGVudW1lcmF0ZShzZWxmLnllYXJkYXlzMmNhbGVuZGFyKHRoZXllYXIsIG0pKToKKyAgICAgICAgICAgICMgbW9udGhzIGluIHRoaXMgcm93CisgICAgICAgICAgICBtb250aHMgPSByYW5nZShtKmkrMSwgbWluKG0qKGkrMSkrMSwgMTMpKQorICAgICAgICAgICAgYSgnXG4nKmwpCisgICAgICAgICAgICBuYW1lcyA9IChzZWxmLmZvcm1hdG1vbnRobmFtZSh0aGV5ZWFyLCBrLCBjb2x3aWR0aCwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBtb250aHMpCisgICAgICAgICAgICBhKGZvcm1hdHN0cmluZyhuYW1lcywgY29sd2lkdGgsIGMpLnJzdHJpcCgpKQorICAgICAgICAgICAgYSgnXG4nKmwpCisgICAgICAgICAgICBoZWFkZXJzID0gKGhlYWRlciBmb3IgayBpbiBtb250aHMpCisgICAgICAgICAgICBhKGZvcm1hdHN0cmluZyhoZWFkZXJzLCBjb2x3aWR0aCwgYykucnN0cmlwKCkpCisgICAgICAgICAgICBhKCdcbicqbCkKKyAgICAgICAgICAgICMgbWF4IG51bWJlciBvZiB3ZWVrcyBmb3IgdGhpcyByb3cKKyAgICAgICAgICAgIGhlaWdodCA9IG1heChsZW4oY2FsKSBmb3IgY2FsIGluIHJvdykKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGhlaWdodCk6CisgICAgICAgICAgICAgICAgd2Vla3MgPSBbXQorICAgICAgICAgICAgICAgIGZvciBjYWwgaW4gcm93OgorICAgICAgICAgICAgICAgICAgICBpZiBqID49IGxlbihjYWwpOgorICAgICAgICAgICAgICAgICAgICAgICAgd2Vla3MuYXBwZW5kKCcnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgd2Vla3MuYXBwZW5kKHNlbGYuZm9ybWF0d2VlayhjYWxbal0sIHcpKQorICAgICAgICAgICAgICAgIGEoZm9ybWF0c3RyaW5nKHdlZWtzLCBjb2x3aWR0aCwgYykucnN0cmlwKCkpCisgICAgICAgICAgICAgICAgYSgnXG4nICogbCkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odikKKworICAgIGRlZiBwcnllYXIoc2VsZiwgdGhleWVhciwgdz0wLCBsPTAsIGM9NiwgbT0zKToKKyAgICAgICAgIiIiUHJpbnQgYSB5ZWFyJ3MgY2FsZW5kYXIuIiIiCisgICAgICAgIHByaW50IHNlbGYuZm9ybWF0eWVhcih0aGV5ZWFyLCB3LCBsLCBjLCBtKQorCisKK2NsYXNzIEhUTUxDYWxlbmRhcihDYWxlbmRhcik6CisgICAgIiIiCisgICAgVGhpcyBjYWxlbmRhciByZXR1cm5zIGNvbXBsZXRlIEhUTUwgcGFnZXMuCisgICAgIiIiCisKKyAgICAjIENTUyBjbGFzc2VzIGZvciB0aGUgZGF5IDx0ZD5zCisgICAgY3NzY2xhc3NlcyA9IFsibW9uIiwgInR1ZSIsICJ3ZWQiLCAidGh1IiwgImZyaSIsICJzYXQiLCAic3VuIl0KKworICAgIGRlZiBmb3JtYXRkYXkoc2VsZiwgZGF5LCB3ZWVrZGF5KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGRheSBhcyBhIHRhYmxlIGNlbGwuCisgICAgICAgICIiIgorICAgICAgICBpZiBkYXkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnPHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD4nICMgZGF5IG91dHNpZGUgbW9udGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnPHRkIGNsYXNzPSIlcyI+JWQ8L3RkPicgJSAoc2VsZi5jc3NjbGFzc2VzW3dlZWtkYXldLCBkYXkpCisKKyAgICBkZWYgZm9ybWF0d2VlayhzZWxmLCB0aGV3ZWVrKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGNvbXBsZXRlIHdlZWsgYXMgYSB0YWJsZSByb3cuCisgICAgICAgICIiIgorICAgICAgICBzID0gJycuam9pbihzZWxmLmZvcm1hdGRheShkLCB3ZCkgZm9yIChkLCB3ZCkgaW4gdGhld2VlaykKKyAgICAgICAgcmV0dXJuICc8dHI+JXM8L3RyPicgJSBzCisKKyAgICBkZWYgZm9ybWF0d2Vla2RheShzZWxmLCBkYXkpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgd2Vla2RheSBuYW1lIGFzIGEgdGFibGUgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICc8dGggY2xhc3M9IiVzIj4lczwvdGg+JyAlIChzZWxmLmNzc2NsYXNzZXNbZGF5XSwgZGF5X2FiYnJbZGF5XSkKKworICAgIGRlZiBmb3JtYXR3ZWVraGVhZGVyKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgaGVhZGVyIGZvciBhIHdlZWsgYXMgYSB0YWJsZSByb3cuCisgICAgICAgICIiIgorICAgICAgICBzID0gJycuam9pbihzZWxmLmZvcm1hdHdlZWtkYXkoaSkgZm9yIGkgaW4gc2VsZi5pdGVyd2Vla2RheXMoKSkKKyAgICAgICAgcmV0dXJuICc8dHI+JXM8L3RyPicgJSBzCisKKyAgICBkZWYgZm9ybWF0bW9udGhuYW1lKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1vbnRoIG5hbWUgYXMgYSB0YWJsZSByb3cuCisgICAgICAgICIiIgorICAgICAgICBpZiB3aXRoeWVhcjoKKyAgICAgICAgICAgIHMgPSAnJXMgJXMnICUgKG1vbnRoX25hbWVbdGhlbW9udGhdLCB0aGV5ZWFyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcyA9ICclcycgJSBtb250aF9uYW1lW3RoZW1vbnRoXQorICAgICAgICByZXR1cm4gJzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj4lczwvdGg+PC90cj4nICUgcworCisgICAgZGVmIGZvcm1hdG1vbnRoKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCBtb250aCBhcyBhIHRhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICBhKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+JykKKyAgICAgICAgYSgnXG4nKQorICAgICAgICBhKHNlbGYuZm9ybWF0bW9udGhuYW1lKHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj13aXRoeWVhcikpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYShzZWxmLmZvcm1hdHdlZWtoZWFkZXIoKSkKKyAgICAgICAgYSgnXG4nKQorICAgICAgICBmb3Igd2VlayBpbiBzZWxmLm1vbnRoZGF5czJjYWxlbmRhcih0aGV5ZWFyLCB0aGVtb250aCk6CisgICAgICAgICAgICBhKHNlbGYuZm9ybWF0d2Vlayh3ZWVrKSkKKyAgICAgICAgICAgIGEoJ1xuJykKKyAgICAgICAgYSgnPC90YWJsZT4nKQorICAgICAgICBhKCdcbicpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpCisKKyAgICBkZWYgZm9ybWF0eWVhcihzZWxmLCB0aGV5ZWFyLCB3aWR0aD0zKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCB5ZWFyIGFzIGEgdGFibGUgb2YgdGFibGVzLgorICAgICAgICAiIiIKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICB3aWR0aCA9IG1heCh3aWR0aCwgMSkKKyAgICAgICAgYSgnPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ieWVhciI+JykKKyAgICAgICAgYSgnXG4nKQorICAgICAgICBhKCc8dHI+PHRoIGNvbHNwYW49IiVkIiBjbGFzcz0ieWVhciI+JXM8L3RoPjwvdHI+JyAlICh3aWR0aCwgdGhleWVhcikpCisgICAgICAgIGZvciBpIGluIHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIsIHdpZHRoKToKKyAgICAgICAgICAgICMgbW9udGhzIGluIHRoaXMgcm93CisgICAgICAgICAgICBtb250aHMgPSByYW5nZShpLCBtaW4oaSt3aWR0aCwgMTMpKQorICAgICAgICAgICAgYSgnPHRyPicpCisgICAgICAgICAgICBmb3IgbSBpbiBtb250aHM6CisgICAgICAgICAgICAgICAgYSgnPHRkPicpCisgICAgICAgICAgICAgICAgYShzZWxmLmZvcm1hdG1vbnRoKHRoZXllYXIsIG0sIHdpdGh5ZWFyPUZhbHNlKSkKKyAgICAgICAgICAgICAgICBhKCc8L3RkPicpCisgICAgICAgICAgICBhKCc8L3RyPicpCisgICAgICAgIGEoJzwvdGFibGU+JykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odikKKworICAgIGRlZiBmb3JtYXR5ZWFycGFnZShzZWxmLCB0aGV5ZWFyLCB3aWR0aD0zLCBjc3M9J2NhbGVuZGFyLmNzcycsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZm9ybWF0dGVkIHllYXIgYXMgYSBjb21wbGV0ZSBIVE1MIHBhZ2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICBhKCc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIlcyI/PlxuJyAlIGVuY29kaW5nKQorICAgICAgICBhKCc8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+XG4nKQorICAgICAgICBhKCc8aHRtbD5cbicpCisgICAgICAgIGEoJzxoZWFkPlxuJykKKyAgICAgICAgYSgnPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JXMiIC8+XG4nICUgZW5jb2RpbmcpCisgICAgICAgIGlmIGNzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGEoJzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IiVzIiAvPlxuJyAlIGNzcykKKyAgICAgICAgYSgnPHRpdGxlPkNhbGVuZGFyIGZvciAlZDwvdGl0bGU+XG4nICUgdGhleWVhcikKKyAgICAgICAgYSgnPC9oZWFkPlxuJykKKyAgICAgICAgYSgnPGJvZHk+XG4nKQorICAgICAgICBhKHNlbGYuZm9ybWF0eWVhcih0aGV5ZWFyLCB3aWR0aCkpCisgICAgICAgIGEoJzwvYm9keT5cbicpCisgICAgICAgIGEoJzwvaHRtbD5cbicpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpLmVuY29kZShlbmNvZGluZywgInhtbGNoYXJyZWZyZXBsYWNlIikKKworCitjbGFzcyBUaW1lRW5jb2Rpbmc6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2FsZSk6CisgICAgICAgIHNlbGYubG9jYWxlID0gbG9jYWxlCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLm9sZGxvY2FsZSA9IF9sb2NhbGUuZ2V0bG9jYWxlKF9sb2NhbGUuTENfVElNRSkKKyAgICAgICAgX2xvY2FsZS5zZXRsb2NhbGUoX2xvY2FsZS5MQ19USU1FLCBzZWxmLmxvY2FsZSkKKyAgICAgICAgcmV0dXJuIF9sb2NhbGUuZ2V0bG9jYWxlKF9sb2NhbGUuTENfVElNRSlbMV0KKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIF9sb2NhbGUuc2V0bG9jYWxlKF9sb2NhbGUuTENfVElNRSwgc2VsZi5vbGRsb2NhbGUpCisKKworY2xhc3MgTG9jYWxlVGV4dENhbGVuZGFyKFRleHRDYWxlbmRhcik6CisgICAgIiIiCisgICAgVGhpcyBjbGFzcyBjYW4gYmUgcGFzc2VkIGEgbG9jYWxlIG5hbWUgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB3aWxsIHJldHVybgorICAgIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIGluIHRoZSBzcGVjaWZpZWQgbG9jYWxlLiBJZiB0aGlzIGxvY2FsZSBpbmNsdWRlcworICAgIGFuIGVuY29kaW5nIGFsbCBzdHJpbmdzIGNvbnRhaW5pbmcgbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgd2lsbCBiZSByZXR1cm5lZAorICAgIGFzIHVuaWNvZGUuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5PTAsIGxvY2FsZT1Ob25lKToKKyAgICAgICAgVGV4dENhbGVuZGFyLl9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheSkKKyAgICAgICAgaWYgbG9jYWxlIGlzIE5vbmU6CisgICAgICAgICAgICBsb2NhbGUgPSBfbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKQorICAgICAgICBzZWxmLmxvY2FsZSA9IGxvY2FsZQorCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5LCB3aWR0aCk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIGlmIHdpZHRoID49IDk6CisgICAgICAgICAgICAgICAgbmFtZXMgPSBkYXlfbmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lcyA9IGRheV9hYmJyCisgICAgICAgICAgICBuYW1lID0gbmFtZXNbZGF5XQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgcmV0dXJuIG5hbWVbOndpZHRoXS5jZW50ZXIod2lkdGgpCisKKyAgICBkZWYgZm9ybWF0bW9udGhuYW1lKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aWR0aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIHMgPSBtb250aF9uYW1lW3RoZW1vbnRoXQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcyA9IHMuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICAgICAgcyA9ICIlcyAlciIgJSAocywgdGhleWVhcikKKyAgICAgICAgICAgIHJldHVybiBzLmNlbnRlcih3aWR0aCkKKworCitjbGFzcyBMb2NhbGVIVE1MQ2FsZW5kYXIoSFRNTENhbGVuZGFyKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGNhbiBiZSBwYXNzZWQgYSBsb2NhbGUgbmFtZSBpbiB0aGUgY29uc3RydWN0b3IgYW5kIHdpbGwgcmV0dXJuCisgICAgbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgaW4gdGhlIHNwZWNpZmllZCBsb2NhbGUuIElmIHRoaXMgbG9jYWxlIGluY2x1ZGVzCisgICAgYW4gZW5jb2RpbmcgYWxsIHN0cmluZ3MgY29udGFpbmluZyBtb250aCBhbmQgd2Vla2RheSBuYW1lcyB3aWxsIGJlIHJldHVybmVkCisgICAgYXMgdW5pY29kZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5PTAsIGxvY2FsZT1Ob25lKToKKyAgICAgICAgSFRNTENhbGVuZGFyLl9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheSkKKyAgICAgICAgaWYgbG9jYWxlIGlzIE5vbmU6CisgICAgICAgICAgICBsb2NhbGUgPSBfbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKQorICAgICAgICBzZWxmLmxvY2FsZSA9IGxvY2FsZQorCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5KToKKyAgICAgICAgd2l0aCBUaW1lRW5jb2Rpbmcoc2VsZi5sb2NhbGUpIGFzIGVuY29kaW5nOgorICAgICAgICAgICAgcyA9IGRheV9hYmJyW2RheV0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHMgPSBzLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHJldHVybiAnPHRoIGNsYXNzPSIlcyI+JXM8L3RoPicgJSAoc2VsZi5jc3NjbGFzc2VzW2RheV0sIHMpCisKKyAgICBkZWYgZm9ybWF0bW9udGhuYW1lKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aXRoeWVhcj1UcnVlKToKKyAgICAgICAgd2l0aCBUaW1lRW5jb2Rpbmcoc2VsZi5sb2NhbGUpIGFzIGVuY29kaW5nOgorICAgICAgICAgICAgcyA9IG1vbnRoX25hbWVbdGhlbW9udGhdCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzID0gcy5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBpZiB3aXRoeWVhcjoKKyAgICAgICAgICAgICAgICBzID0gJyVzICVzJyAlIChzLCB0aGV5ZWFyKQorICAgICAgICAgICAgcmV0dXJuICc8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+JXM8L3RoPjwvdHI+JyAlIHMKKworCisjIFN1cHBvcnQgZm9yIG9sZCBtb2R1bGUgbGV2ZWwgaW50ZXJmYWNlCitjID0gVGV4dENhbGVuZGFyKCkKKworZmlyc3R3ZWVrZGF5ID0gYy5nZXRmaXJzdHdlZWtkYXkKKworZGVmIHNldGZpcnN0d2Vla2RheShmaXJzdHdlZWtkYXkpOgorICAgIHRyeToKKyAgICAgICAgZmlyc3R3ZWVrZGF5Ll9faW5kZXhfXworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcmFpc2UgSWxsZWdhbFdlZWtkYXlFcnJvcihmaXJzdHdlZWtkYXkpCisgICAgaWYgbm90IE1PTkRBWSA8PSBmaXJzdHdlZWtkYXkgPD0gU1VOREFZOgorICAgICAgICByYWlzZSBJbGxlZ2FsV2Vla2RheUVycm9yKGZpcnN0d2Vla2RheSkKKyAgICBjLmZpcnN0d2Vla2RheSA9IGZpcnN0d2Vla2RheQorCittb250aGNhbGVuZGFyID0gYy5tb250aGRheXNjYWxlbmRhcgorcHJ3ZWVrID0gYy5wcndlZWsKK3dlZWsgPSBjLmZvcm1hdHdlZWsKK3dlZWtoZWFkZXIgPSBjLmZvcm1hdHdlZWtoZWFkZXIKK3BybW9udGggPSBjLnBybW9udGgKK21vbnRoID0gYy5mb3JtYXRtb250aAorY2FsZW5kYXIgPSBjLmZvcm1hdHllYXIKK3ByY2FsID0gYy5wcnllYXIKKworCisjIFNwYWNpbmcgb2YgbW9udGggY29sdW1ucyBmb3IgbXVsdGktY29sdW1uIHllYXIgY2FsZW5kYXIKK19jb2x3aWR0aCA9IDcqMyAtIDEgICAgICAgICAjIEFtb3VudCBwcmludGVkIGJ5IHByd2VlaygpCitfc3BhY2luZyA9IDYgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2Ygc3BhY2VzIGJldHdlZW4gY29sdW1ucworCisKK2RlZiBmb3JtYXQoY29scywgY29sd2lkdGg9X2NvbHdpZHRoLCBzcGFjaW5nPV9zcGFjaW5nKToKKyAgICAiIiJQcmludHMgbXVsdGktY29sdW1uIGZvcm1hdHRpbmcgZm9yIHllYXIgY2FsZW5kYXJzIiIiCisgICAgcHJpbnQgZm9ybWF0c3RyaW5nKGNvbHMsIGNvbHdpZHRoLCBzcGFjaW5nKQorCisKK2RlZiBmb3JtYXRzdHJpbmcoY29scywgY29sd2lkdGg9X2NvbHdpZHRoLCBzcGFjaW5nPV9zcGFjaW5nKToKKyAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIGZvcm1hdHRlZCBmcm9tIG4gc3RyaW5ncywgY2VudGVyZWQgd2l0aGluIG4gY29sdW1ucy4iIiIKKyAgICBzcGFjaW5nICo9ICcgJworICAgIHJldHVybiBzcGFjaW5nLmpvaW4oYy5jZW50ZXIoY29sd2lkdGgpIGZvciBjIGluIGNvbHMpCisKKworRVBPQ0ggPSAxOTcwCitfRVBPQ0hfT1JEID0gZGF0ZXRpbWUuZGF0ZShFUE9DSCwgMSwgMSkudG9vcmRpbmFsKCkKKworCitkZWYgdGltZWdtKHR1cGxlKToKKyAgICAiIiJVbnJlbGF0ZWQgYnV0IGhhbmR5IGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBVbml4IHRpbWVzdGFtcCBmcm9tIEdNVC4iIiIKKyAgICB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCA9IHR1cGxlWzo2XQorICAgIGRheXMgPSBkYXRldGltZS5kYXRlKHllYXIsIG1vbnRoLCAxKS50b29yZGluYWwoKSAtIF9FUE9DSF9PUkQgKyBkYXkgLSAxCisgICAgaG91cnMgPSBkYXlzKjI0ICsgaG91cgorICAgIG1pbnV0ZXMgPSBob3Vycyo2MCArIG1pbnV0ZQorICAgIHNlY29uZHMgPSBtaW51dGVzKjYwICsgc2Vjb25kCisgICAgcmV0dXJuIHNlY29uZHMKKworCitkZWYgbWFpbihhcmdzKToKKyAgICBpbXBvcnQgb3B0cGFyc2UKKyAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIodXNhZ2U9InVzYWdlOiAlcHJvZyBbb3B0aW9uc10gW3llYXIgW21vbnRoXV0iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLXciLCAiLS13aWR0aCIsCisgICAgICAgIGRlc3Q9IndpZHRoIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0yLAorICAgICAgICBoZWxwPSJ3aWR0aCBvZiBkYXRlIGNvbHVtbiAoZGVmYXVsdCAyLCB0ZXh0IG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1sIiwgIi0tbGluZXMiLAorICAgICAgICBkZXN0PSJsaW5lcyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MSwKKyAgICAgICAgaGVscD0ibnVtYmVyIG9mIGxpbmVzIGZvciBlYWNoIHdlZWsgKGRlZmF1bHQgMSwgdGV4dCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItcyIsICItLXNwYWNpbmciLAorICAgICAgICBkZXN0PSJzcGFjaW5nIiwgdHlwZT0iaW50IiwgZGVmYXVsdD02LAorICAgICAgICBoZWxwPSJzcGFjaW5nIGJldHdlZW4gbW9udGhzIChkZWZhdWx0IDYsIHRleHQgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLW0iLCAiLS1tb250aHMiLAorICAgICAgICBkZXN0PSJtb250aHMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTMsCisgICAgICAgIGhlbHA9Im1vbnRocyBwZXIgcm93IChkZWZhdWx0IDMsIHRleHQgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLWMiLCAiLS1jc3MiLAorICAgICAgICBkZXN0PSJjc3MiLCBkZWZhdWx0PSJjYWxlbmRhci5jc3MiLAorICAgICAgICBoZWxwPSJDU1MgdG8gdXNlIGZvciBwYWdlIChodG1sIG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1MIiwgIi0tbG9jYWxlIiwKKyAgICAgICAgZGVzdD0ibG9jYWxlIiwgZGVmYXVsdD1Ob25lLAorICAgICAgICBoZWxwPSJsb2NhbGUgdG8gYmUgdXNlZCBmcm9tIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1lIiwgIi0tZW5jb2RpbmciLAorICAgICAgICBkZXN0PSJlbmNvZGluZyIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgaGVscD0iRW5jb2RpbmcgdG8gdXNlIGZvciBvdXRwdXQiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLXQiLCAiLS10eXBlIiwKKyAgICAgICAgZGVzdD0idHlwZSIsIGRlZmF1bHQ9InRleHQiLAorICAgICAgICBjaG9pY2VzPSgidGV4dCIsICJodG1sIiksCisgICAgICAgIGhlbHA9Im91dHB1dCB0eXBlICh0ZXh0IG9yIGh0bWwpIgorICAgICkKKworICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisKKyAgICBpZiBvcHRpb25zLmxvY2FsZSBhbmQgbm90IG9wdGlvbnMuZW5jb2Rpbmc6CisgICAgICAgIHBhcnNlci5lcnJvcigiaWYgLS1sb2NhbGUgaXMgc3BlY2lmaWVkIC0tZW5jb2RpbmcgaXMgcmVxdWlyZWQiKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgbG9jYWxlID0gb3B0aW9ucy5sb2NhbGUsIG9wdGlvbnMuZW5jb2RpbmcKKworICAgIGlmIG9wdGlvbnMudHlwZSA9PSAiaHRtbCI6CisgICAgICAgIGlmIG9wdGlvbnMubG9jYWxlOgorICAgICAgICAgICAgY2FsID0gTG9jYWxlSFRNTENhbGVuZGFyKGxvY2FsZT1sb2NhbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjYWwgPSBIVE1MQ2FsZW5kYXIoKQorICAgICAgICBlbmNvZGluZyA9IG9wdGlvbnMuZW5jb2RpbmcKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIG9wdGRpY3QgPSBkaWN0KGVuY29kaW5nPWVuY29kaW5nLCBjc3M9b3B0aW9ucy5jc3MpCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICAgICAgcHJpbnQgY2FsLmZvcm1hdHllYXJwYWdlKGRhdGV0aW1lLmRhdGUudG9kYXkoKS55ZWFyLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBwcmludCBjYWwuZm9ybWF0eWVhcnBhZ2UoaW50KGFyZ3NbMV0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgZWxzZToKKyAgICAgICAgaWYgb3B0aW9ucy5sb2NhbGU6CisgICAgICAgICAgICBjYWwgPSBMb2NhbGVUZXh0Q2FsZW5kYXIobG9jYWxlPWxvY2FsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNhbCA9IFRleHRDYWxlbmRhcigpCisgICAgICAgIG9wdGRpY3QgPSBkaWN0KHc9b3B0aW9ucy53aWR0aCwgbD1vcHRpb25zLmxpbmVzKQorICAgICAgICBpZiBsZW4oYXJncykgIT0gMzoKKyAgICAgICAgICAgIG9wdGRpY3RbImMiXSA9IG9wdGlvbnMuc3BhY2luZworICAgICAgICAgICAgb3B0ZGljdFsibSJdID0gb3B0aW9ucy5tb250aHMKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0eWVhcihkYXRldGltZS5kYXRlLnRvZGF5KCkueWVhciwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAyOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoaW50KGFyZ3NbMV0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDM6CisgICAgICAgICAgICByZXN1bHQgPSBjYWwuZm9ybWF0bW9udGgoaW50KGFyZ3NbMV0pLCBpbnQoYXJnc1syXSksICoqb3B0ZGljdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlci5lcnJvcigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgaWYgb3B0aW9ucy5lbmNvZGluZzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5lbmNvZGUob3B0aW9ucy5lbmNvZGluZykKKyAgICAgICAgcHJpbnQgcmVzdWx0CisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKHN5cy5hcmd2KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jYWxlbmRhci5weWMgYi9saWIvcHl0aG9uMi43L2NhbGVuZGFyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JlMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jYWxlbmRhci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jYWxlbmRhci5weW8gYi9saWIvcHl0aG9uMi43L2NhbGVuZGFyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2JlMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jYWxlbmRhci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jZ2kucHkgYi9saWIvcHl0aG9uMi43L2NnaS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NzA3OWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jZ2kucHkKQEAgLTAsMCArMSwxMDUwIEBACisjISAvdXNyL2xvY2FsL2Jpbi9weXRob24KKworIyBOT1RFOiB0aGUgYWJvdmUgIi91c3IvbG9jYWwvYmluL3B5dGhvbiIgaXMgTk9UIGEgbWlzdGFrZS4gIEl0IGlzCisjIGludGVudGlvbmFsbHkgTk9UICIvdXNyL2Jpbi9lbnYgcHl0aG9uIi4gIE9uIG1hbnkgc3lzdGVtcworIyAoZS5nLiBTb2xhcmlzKSwgL3Vzci9sb2NhbC9iaW4gaXMgbm90IGluICRQQVRIIGFzIHBhc3NlZCB0byBDR0kKKyMgc2NyaXB0cywgYW5kIC91c3IvbG9jYWwvYmluIGlzIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSB3aGVyZSBQeXRob24gaXMKKyMgaW5zdGFsbGVkLCBzbyAvdXNyL2Jpbi9lbnYgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgcHl0aG9uLiAgR3JhbnRlZCwKKyMgYmluYXJ5IGluc3RhbGxhdGlvbnMgYnkgTGludXggdmVuZG9ycyBvZnRlbiBpbnN0YWxsIFB5dGhvbiBpbgorIyAvdXNyL2Jpbi4gIFNvIGxldCB0aG9zZSB2ZW5kb3JzIHBhdGNoIGNnaS5weSB0byBtYXRjaCB0aGVpciBjaG9pY2UKKyMgb2YgaW5zdGFsbGF0aW9uLgorCisiIiJTdXBwb3J0IG1vZHVsZSBmb3IgQ0dJIChDb21tb24gR2F0ZXdheSBJbnRlcmZhY2UpIHNjcmlwdHMuCisKK1RoaXMgbW9kdWxlIGRlZmluZXMgYSBudW1iZXIgb2YgdXRpbGl0aWVzIGZvciB1c2UgYnkgQ0dJIHNjcmlwdHMKK3dyaXR0ZW4gaW4gUHl0aG9uLgorIiIiCisKKyMgWFhYIFBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlIGEgc2xpbW1lZCB2ZXJzaW9uIHRoYXQgZG9lc24ndCBjb250YWluCisjIGFsbCB0aG9zZSBiYWNrd2FyZHMgY29tcGF0aWJsZSBhbmQgZGVidWdnaW5nIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucz8KKworIyBIaXN0b3J5CisjIC0tLS0tLS0KKyMKKyMgTWljaGFlbCBNY0xheSBzdGFydGVkIHRoaXMgbW9kdWxlLiAgU3RldmUgTWFqZXdza2kgY2hhbmdlZCB0aGUKKyMgaW50ZXJmYWNlIHRvIFN2Rm9ybUNvbnRlbnREaWN0IGFuZCBGb3JtQ29udGVudERpY3QuICBUaGUgbXVsdGlwYXJ0CisjIHBhcnNpbmcgd2FzIGluc3BpcmVkIGJ5IGNvZGUgc3VibWl0dGVkIGJ5IEFuZHJlYXMgUGFlcGNrZS4gIEd1aWRvIHZhbgorIyBSb3NzdW0gcmV3cm90ZSwgcmVmb3JtYXR0ZWQgYW5kIGRvY3VtZW50ZWQgdGhlIG1vZHVsZSBhbmQgaXMgY3VycmVudGx5CisjIHJlc3BvbnNpYmxlIGZvciBpdHMgbWFpbnRlbmFuY2UuCisjCisKK19fdmVyc2lvbl9fID0gIjIuNiIKKworCisjIEltcG9ydHMKKyMgPT09PT09PQorCitmcm9tIG9wZXJhdG9yIGltcG9ydCBhdHRyZ2V0dGVyCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBVc2VyRGljdAoraW1wb3J0IHVybHBhcnNlCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IGZpbHRlcndhcm5pbmdzLCBjYXRjaF93YXJuaW5ncywgd2Fybgord2l0aCBjYXRjaF93YXJuaW5ncygpOgorICAgIGlmIHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKm1pbWV0b29scyBoYXMgYmVlbiByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICBmaWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4qcmZjODIyIGhhcyBiZWVuIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgaW1wb3J0IG1pbWV0b29scworICAgIGltcG9ydCByZmM4MjIKKwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK19fYWxsX18gPSBbIk1pbmlGaWVsZFN0b3JhZ2UiLCAiRmllbGRTdG9yYWdlIiwgIkZvcm1Db250ZW50RGljdCIsCisgICAgICAgICAgICJTdkZvcm1Db250ZW50RGljdCIsICJJbnRlcnBGb3JtQ29udGVudERpY3QiLCAiRm9ybUNvbnRlbnQiLAorICAgICAgICAgICAicGFyc2UiLCAicGFyc2VfcXMiLCAicGFyc2VfcXNsIiwgInBhcnNlX211bHRpcGFydCIsCisgICAgICAgICAgICJwYXJzZV9oZWFkZXIiLCAicHJpbnRfZXhjZXB0aW9uIiwgInByaW50X2Vudmlyb24iLAorICAgICAgICAgICAicHJpbnRfZm9ybSIsICJwcmludF9kaXJlY3RvcnkiLCAicHJpbnRfYXJndW1lbnRzIiwKKyAgICAgICAgICAgInByaW50X2Vudmlyb25fdXNhZ2UiLCAiZXNjYXBlIl0KKworIyBMb2dnaW5nIHN1cHBvcnQKKyMgPT09PT09PT09PT09PT09CisKK2xvZ2ZpbGUgPSAiIiAgICAgICAgICAgICMgRmlsZW5hbWUgdG8gbG9nIHRvLCBpZiBub3QgZW1wdHkKK2xvZ2ZwID0gTm9uZSAgICAgICAgICAgICMgRmlsZSBvYmplY3QgdG8gbG9nIHRvLCBpZiBub3QgTm9uZQorCitkZWYgaW5pdGxvZygqYWxsYXJncyk6CisgICAgIiIiV3JpdGUgYSBsb2cgbWVzc2FnZSwgaWYgdGhlcmUgaXMgYSBsb2cgZmlsZS4KKworICAgIEV2ZW4gdGhvdWdoIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluaXRsb2coKSwgeW91IHNob3VsZCBhbHdheXMKKyAgICB1c2UgbG9nKCk7IGxvZyBpcyBhIHZhcmlhYmxlIHRoYXQgaXMgc2V0IGVpdGhlciB0byBpbml0bG9nCisgICAgKGluaXRpYWxseSksIHRvIGRvbG9nIChvbmNlIHRoZSBsb2cgZmlsZSBoYXMgYmVlbiBvcGVuZWQpLCBvciB0bworICAgIG5vbG9nICh3aGVuIGxvZ2dpbmcgaXMgZGlzYWJsZWQpLgorCisgICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgZm9ybWF0IHN0cmluZzsgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgKGlmCisgICAgYW55KSBhcmUgYXJndW1lbnRzIHRvIHRoZSAlIG9wZXJhdG9yLCBzbyBlLmcuCisgICAgICAgIGxvZygiJXM6ICVzIiwgImEiLCAiYiIpCisgICAgd2lsbCB3cml0ZSAiYTogYiIgdG8gdGhlIGxvZyBmaWxlLCBmb2xsb3dlZCBieSBhIG5ld2xpbmUuCisKKyAgICBJZiB0aGUgZ2xvYmFsIGxvZ2ZwIGlzIG5vdCBOb25lLCBpdCBzaG91bGQgYmUgYSBmaWxlIG9iamVjdCB0bworICAgIHdoaWNoIGxvZyBkYXRhIGlzIHdyaXR0ZW4uCisKKyAgICBJZiB0aGUgZ2xvYmFsIGxvZ2ZwIGlzIE5vbmUsIHRoZSBnbG9iYWwgbG9nZmlsZSBtYXkgYmUgYSBzdHJpbmcKKyAgICBnaXZpbmcgYSBmaWxlbmFtZSB0byBvcGVuLCBpbiBhcHBlbmQgbW9kZS4gIFRoaXMgZmlsZSBzaG91bGQgYmUKKyAgICB3b3JsZCB3cml0YWJsZSEhISAgSWYgdGhlIGZpbGUgY2FuJ3QgYmUgb3BlbmVkLCBsb2dnaW5nIGlzCisgICAgc2lsZW50bHkgZGlzYWJsZWQgKHNpbmNlIHRoZXJlIGlzIG5vIHNhZmUgcGxhY2Ugd2hlcmUgd2UgY291bGQKKyAgICBzZW5kIGFuIGVycm9yIG1lc3NhZ2UpLgorCisgICAgIiIiCisgICAgZ2xvYmFsIGxvZ2ZwLCBsb2cKKyAgICBpZiBsb2dmaWxlIGFuZCBub3QgbG9nZnA6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvZ2ZwID0gb3Blbihsb2dmaWxlLCAiYSIpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgIGlmIG5vdCBsb2dmcDoKKyAgICAgICAgbG9nID0gbm9sb2cKKyAgICBlbHNlOgorICAgICAgICBsb2cgPSBkb2xvZworICAgIGxvZygqYWxsYXJncykKKworZGVmIGRvbG9nKGZtdCwgKmFyZ3MpOgorICAgICIiIldyaXRlIGEgbG9nIG1lc3NhZ2UgdG8gdGhlIGxvZyBmaWxlLiAgU2VlIGluaXRsb2coKSBmb3IgZG9jcy4iIiIKKyAgICBsb2dmcC53cml0ZShmbXQlYXJncyArICJcbiIpCisKK2RlZiBub2xvZygqYWxsYXJncyk6CisgICAgIiIiRHVtbXkgZnVuY3Rpb24sIGFzc2lnbmVkIHRvIGxvZyB3aGVuIGxvZ2dpbmcgaXMgZGlzYWJsZWQuIiIiCisgICAgcGFzcworCitsb2cgPSBpbml0bG9nICAgICAgICAgICAjIFRoZSBjdXJyZW50IGxvZ2dpbmcgZnVuY3Rpb24KKworCisjIFBhcnNpbmcgZnVuY3Rpb25zCisjID09PT09PT09PT09PT09PT09CisKKyMgTWF4aW11bSBpbnB1dCB3ZSB3aWxsIGFjY2VwdCB3aGVuIFJFUVVFU1RfTUVUSE9EIGlzIFBPU1QKKyMgMCA9PT4gdW5saW1pdGVkIGlucHV0CittYXhsZW4gPSAwCisKK2RlZiBwYXJzZShmcD1Ob25lLCBlbnZpcm9uPW9zLmVudmlyb24sIGtlZXBfYmxhbmtfdmFsdWVzPTAsIHN0cmljdF9wYXJzaW5nPTApOgorICAgICIiIlBhcnNlIGEgcXVlcnkgaW4gdGhlIGVudmlyb25tZW50IG9yIGZyb20gYSBmaWxlIChkZWZhdWx0IHN0ZGluKQorCisgICAgICAgIEFyZ3VtZW50cywgYWxsIG9wdGlvbmFsOgorCisgICAgICAgIGZwICAgICAgICAgICAgICA6IGZpbGUgcG9pbnRlcjsgZGVmYXVsdDogc3lzLnN0ZGluCisKKyAgICAgICAgZW52aXJvbiAgICAgICAgIDogZW52aXJvbm1lbnQgZGljdGlvbmFyeTsgZGVmYXVsdDogb3MuZW52aXJvbgorCisgICAgICAgIGtlZXBfYmxhbmtfdmFsdWVzOiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBibGFuayB2YWx1ZXMgaW4KKyAgICAgICAgICAgIHBlcmNlbnQtZW5jb2RlZCBmb3JtcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBibGFuayBzdHJpbmdzLgorICAgICAgICAgICAgQSB0cnVlIHZhbHVlIGluZGljYXRlcyB0aGF0IGJsYW5rcyBzaG91bGQgYmUgcmV0YWluZWQgYXMKKyAgICAgICAgICAgIGJsYW5rIHN0cmluZ3MuICBUaGUgZGVmYXVsdCBmYWxzZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdAorICAgICAgICAgICAgYmxhbmsgdmFsdWVzIGFyZSB0byBiZSBpZ25vcmVkIGFuZCB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZQorICAgICAgICAgICAgbm90IGluY2x1ZGVkLgorCisgICAgICAgIHN0cmljdF9wYXJzaW5nOiBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBkbyB3aXRoIHBhcnNpbmcgZXJyb3JzLgorICAgICAgICAgICAgSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSwgZXJyb3JzIGFyZSBzaWxlbnRseSBpZ25vcmVkLgorICAgICAgICAgICAgSWYgdHJ1ZSwgZXJyb3JzIHJhaXNlIGEgVmFsdWVFcnJvciBleGNlcHRpb24uCisgICAgIiIiCisgICAgaWYgZnAgaXMgTm9uZToKKyAgICAgICAgZnAgPSBzeXMuc3RkaW4KKyAgICBpZiBub3QgJ1JFUVVFU1RfTUVUSE9EJyBpbiBlbnZpcm9uOgorICAgICAgICBlbnZpcm9uWydSRVFVRVNUX01FVEhPRCddID0gJ0dFVCcgICAgICAgIyBGb3IgdGVzdGluZyBzdGFuZC1hbG9uZQorICAgIGlmIGVudmlyb25bJ1JFUVVFU1RfTUVUSE9EJ10gPT0gJ1BPU1QnOgorICAgICAgICBjdHlwZSwgcGRpY3QgPSBwYXJzZV9oZWFkZXIoZW52aXJvblsnQ09OVEVOVF9UWVBFJ10pCisgICAgICAgIGlmIGN0eXBlID09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJzoKKyAgICAgICAgICAgIHJldHVybiBwYXJzZV9tdWx0aXBhcnQoZnAsIHBkaWN0KQorICAgICAgICBlbGlmIGN0eXBlID09ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOgorICAgICAgICAgICAgY2xlbmd0aCA9IGludChlbnZpcm9uWydDT05URU5UX0xFTkdUSCddKQorICAgICAgICAgICAgaWYgbWF4bGVuIGFuZCBjbGVuZ3RoID4gbWF4bGVuOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdNYXhpbXVtIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZGVkJworICAgICAgICAgICAgcXMgPSBmcC5yZWFkKGNsZW5ndGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxcyA9ICcnICAgICAgICAgICAgICAgICAgICAgIyBVbmtub3duIGNvbnRlbnQtdHlwZQorICAgICAgICBpZiAnUVVFUllfU1RSSU5HJyBpbiBlbnZpcm9uOgorICAgICAgICAgICAgaWYgcXM6IHFzID0gcXMgKyAnJicKKyAgICAgICAgICAgIHFzID0gcXMgKyBlbnZpcm9uWydRVUVSWV9TVFJJTkcnXQorICAgICAgICBlbGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgICAgIGlmIHFzOiBxcyA9IHFzICsgJyYnCisgICAgICAgICAgICBxcyA9IHFzICsgc3lzLmFyZ3ZbMV0KKyAgICAgICAgZW52aXJvblsnUVVFUllfU1RSSU5HJ10gPSBxcyAgICAjIFhYWCBTaG91bGRuJ3QsIHJlYWxseQorICAgIGVsaWYgJ1FVRVJZX1NUUklORycgaW4gZW52aXJvbjoKKyAgICAgICAgcXMgPSBlbnZpcm9uWydRVUVSWV9TVFJJTkcnXQorICAgIGVsc2U6CisgICAgICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgICAgIHFzID0gc3lzLmFyZ3ZbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHFzID0gIiIKKyAgICAgICAgZW52aXJvblsnUVVFUllfU1RSSU5HJ10gPSBxcyAgICAjIFhYWCBTaG91bGRuJ3QsIHJlYWxseQorICAgIHJldHVybiB1cmxwYXJzZS5wYXJzZV9xcyhxcywga2VlcF9ibGFua192YWx1ZXMsIHN0cmljdF9wYXJzaW5nKQorCisKKyMgcGFyc2UgcXVlcnkgc3RyaW5nIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHVybHBhcnNlLAorIyB0aGlzIGlzIGRvbmUgaW4gb3JkZXIgdG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJsaXR5LgorCitkZWYgcGFyc2VfcXMocXMsIGtlZXBfYmxhbmtfdmFsdWVzPTAsIHN0cmljdF9wYXJzaW5nPTApOgorICAgICIiIlBhcnNlIGEgcXVlcnkgZ2l2ZW4gYXMgYSBzdHJpbmcgYXJndW1lbnQuIiIiCisgICAgd2FybigiY2dpLnBhcnNlX3FzIGlzIGRlcHJlY2F0ZWQsIHVzZSB1cmxwYXJzZS5wYXJzZV9xcyBpbnN0ZWFkIiwKKyAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgcmV0dXJuIHVybHBhcnNlLnBhcnNlX3FzKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcywgc3RyaWN0X3BhcnNpbmcpCisKKworZGVmIHBhcnNlX3FzbChxcywga2VlcF9ibGFua192YWx1ZXM9MCwgc3RyaWN0X3BhcnNpbmc9MCk6CisgICAgIiIiUGFyc2UgYSBxdWVyeSBnaXZlbiBhcyBhIHN0cmluZyBhcmd1bWVudC4iIiIKKyAgICB3YXJuKCJjZ2kucGFyc2VfcXNsIGlzIGRlcHJlY2F0ZWQsIHVzZSB1cmxwYXJzZS5wYXJzZV9xc2wgaW5zdGVhZCIsCisgICAgICAgICBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgIHJldHVybiB1cmxwYXJzZS5wYXJzZV9xc2wocXMsIGtlZXBfYmxhbmtfdmFsdWVzLCBzdHJpY3RfcGFyc2luZykKKworZGVmIHBhcnNlX211bHRpcGFydChmcCwgcGRpY3QpOgorICAgICIiIlBhcnNlIG11bHRpcGFydCBpbnB1dC4KKworICAgIEFyZ3VtZW50czoKKyAgICBmcCAgIDogaW5wdXQgZmlsZQorICAgIHBkaWN0OiBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgb3RoZXIgcGFyYW1ldGVycyBvZiBjb250ZW50LXR5cGUgaGVhZGVyCisKKyAgICBSZXR1cm5zIGEgZGljdGlvbmFyeSBqdXN0IGxpa2UgcGFyc2VfcXMoKToga2V5cyBhcmUgdGhlIGZpZWxkIG5hbWVzLCBlYWNoCisgICAgdmFsdWUgaXMgYSBsaXN0IG9mIHZhbHVlcyBmb3IgdGhhdCBmaWVsZC4gIFRoaXMgaXMgZWFzeSB0byB1c2UgYnV0IG5vdAorICAgIG11Y2ggZ29vZCBpZiB5b3UgYXJlIGV4cGVjdGluZyBtZWdhYnl0ZXMgdG8gYmUgdXBsb2FkZWQgLS0gaW4gdGhhdCBjYXNlLAorICAgIHVzZSB0aGUgRmllbGRTdG9yYWdlIGNsYXNzIGluc3RlYWQgd2hpY2ggaXMgbXVjaCBtb3JlIGZsZXhpYmxlLiAgTm90ZQorICAgIHRoYXQgY29udGVudC10eXBlIGlzIHRoZSByYXcsIHVucGFyc2VkIGNvbnRlbnRzIG9mIHRoZSBjb250ZW50LXR5cGUKKyAgICBoZWFkZXIuCisKKyAgICBYWFggVGhpcyBkb2VzIG5vdCBwYXJzZSBuZXN0ZWQgbXVsdGlwYXJ0IHBhcnRzIC0tIHVzZSBGaWVsZFN0b3JhZ2UgZm9yCisgICAgdGhhdC4KKworICAgIFhYWCBUaGlzIHNob3VsZCByZWFsbHkgYmUgc3Vic3VtZWQgYnkgRmllbGRTdG9yYWdlIGFsdG9nZXRoZXIgLS0gbm8KKyAgICBwb2ludCBpbiBoYXZpbmcgdHdvIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgc2FtZSBwYXJzaW5nIGFsZ29yaXRobS4KKyAgICBBbHNvLCBGaWVsZFN0b3JhZ2UgcHJvdGVjdHMgaXRzZWxmIGJldHRlciBhZ2FpbnN0IGNlcnRhaW4gRG9TIGF0dGFja3MKKyAgICBieSBsaW1pdGluZyB0aGUgc2l6ZSBvZiB0aGUgZGF0YSByZWFkIGluIG9uZSBjaHVuay4gIFRoZSBBUEkgaGVyZQorICAgIGRvZXMgbm90IHN1cHBvcnQgdGhhdCBraW5kIG9mIHByb3RlY3Rpb24uICBUaGlzIGFsc28gYWZmZWN0cyBwYXJzZSgpCisgICAgc2luY2UgaXQgY2FuIGNhbGwgcGFyc2VfbXVsdGlwYXJ0KCkuCisKKyAgICAiIiIKKyAgICBib3VuZGFyeSA9ICIiCisgICAgaWYgJ2JvdW5kYXJ5JyBpbiBwZGljdDoKKyAgICAgICAgYm91bmRhcnkgPSBwZGljdFsnYm91bmRhcnknXQorICAgIGlmIG5vdCB2YWxpZF9ib3VuZGFyeShib3VuZGFyeSk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICAoJ0ludmFsaWQgYm91bmRhcnkgaW4gbXVsdGlwYXJ0IGZvcm06ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGJvdW5kYXJ5LCkpCisKKyAgICBuZXh0cGFydCA9ICItLSIgKyBib3VuZGFyeQorICAgIGxhc3RwYXJ0ID0gIi0tIiArIGJvdW5kYXJ5ICsgIi0tIgorICAgIHBhcnRkaWN0ID0ge30KKyAgICB0ZXJtaW5hdG9yID0gIiIKKworICAgIHdoaWxlIHRlcm1pbmF0b3IgIT0gbGFzdHBhcnQ6CisgICAgICAgIGJ5dGVzID0gLTEKKyAgICAgICAgZGF0YSA9IE5vbmUKKyAgICAgICAgaWYgdGVybWluYXRvcjoKKyAgICAgICAgICAgICMgQXQgc3RhcnQgb2YgbmV4dCBwYXJ0LiAgUmVhZCBoZWFkZXJzIGZpcnN0LgorICAgICAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKGZwKQorICAgICAgICAgICAgY2xlbmd0aCA9IGhlYWRlcnMuZ2V0aGVhZGVyKCdjb250ZW50LWxlbmd0aCcpCisgICAgICAgICAgICBpZiBjbGVuZ3RoOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYnl0ZXMgPSBpbnQoY2xlbmd0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgYnl0ZXMgPiAwOgorICAgICAgICAgICAgICAgIGlmIG1heGxlbiBhbmQgYnl0ZXMgPiBtYXhsZW46CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdNYXhpbXVtIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZGVkJworICAgICAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKGJ5dGVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkYXRhID0gIiIKKyAgICAgICAgIyBSZWFkIGxpbmVzIHVudGlsIGVuZCBvZiBwYXJ0LgorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgdGVybWluYXRvciA9IGxhc3RwYXJ0ICMgRW5kIG91dGVyIGxvb3AKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGluZVs6Ml0gPT0gIi0tIjoKKyAgICAgICAgICAgICAgICB0ZXJtaW5hdG9yID0gbGluZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgaWYgdGVybWluYXRvciBpbiAobmV4dHBhcnQsIGxhc3RwYXJ0KToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAjIERvbmUgd2l0aCBwYXJ0LgorICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBieXRlcyA8IDA6CisgICAgICAgICAgICBpZiBsaW5lczoKKyAgICAgICAgICAgICAgICAjIFN0cmlwIGZpbmFsIGxpbmUgdGVybWluYXRvcgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1stMV0KKyAgICAgICAgICAgICAgICBpZiBsaW5lWy0yOl0gPT0gIlxyXG4iOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lWy0xOl0gPT0gIlxuIjoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgIGxpbmVzWy0xXSA9IGxpbmUKKyAgICAgICAgICAgICAgICBkYXRhID0gIiIuam9pbihsaW5lcykKKyAgICAgICAgbGluZSA9IGhlYWRlcnNbJ2NvbnRlbnQtZGlzcG9zaXRpb24nXQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGtleSwgcGFyYW1zID0gcGFyc2VfaGVhZGVyKGxpbmUpCisgICAgICAgIGlmIGtleSAhPSAnZm9ybS1kYXRhJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmICduYW1lJyBpbiBwYXJhbXM6CisgICAgICAgICAgICBuYW1lID0gcGFyYW1zWyduYW1lJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5hbWUgaW4gcGFydGRpY3Q6CisgICAgICAgICAgICBwYXJ0ZGljdFtuYW1lXS5hcHBlbmQoZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnRkaWN0W25hbWVdID0gW2RhdGFdCisKKyAgICByZXR1cm4gcGFydGRpY3QKKworCitkZWYgX3BhcnNlcGFyYW0ocyk6CisgICAgd2hpbGUgc1s6MV0gPT0gJzsnOgorICAgICAgICBzID0gc1sxOl0KKyAgICAgICAgZW5kID0gcy5maW5kKCc7JykKKyAgICAgICAgd2hpbGUgZW5kID4gMCBhbmQgKHMuY291bnQoJyInLCAwLCBlbmQpIC0gcy5jb3VudCgnXFwiJywgMCwgZW5kKSkgJSAyOgorICAgICAgICAgICAgZW5kID0gcy5maW5kKCc7JywgZW5kICsgMSkKKyAgICAgICAgaWYgZW5kIDwgMDoKKyAgICAgICAgICAgIGVuZCA9IGxlbihzKQorICAgICAgICBmID0gc1s6ZW5kXQorICAgICAgICB5aWVsZCBmLnN0cmlwKCkKKyAgICAgICAgcyA9IHNbZW5kOl0KKworZGVmIHBhcnNlX2hlYWRlcihsaW5lKToKKyAgICAiIiJQYXJzZSBhIENvbnRlbnQtdHlwZSBsaWtlIGhlYWRlci4KKworICAgIFJldHVybiB0aGUgbWFpbiBjb250ZW50LXR5cGUgYW5kIGEgZGljdGlvbmFyeSBvZiBvcHRpb25zLgorCisgICAgIiIiCisgICAgcGFydHMgPSBfcGFyc2VwYXJhbSgnOycgKyBsaW5lKQorICAgIGtleSA9IHBhcnRzLm5leHQoKQorICAgIHBkaWN0ID0ge30KKyAgICBmb3IgcCBpbiBwYXJ0czoKKyAgICAgICAgaSA9IHAuZmluZCgnPScpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIG5hbWUgPSBwWzppXS5zdHJpcCgpLmxvd2VyKCkKKyAgICAgICAgICAgIHZhbHVlID0gcFtpKzE6XS5zdHJpcCgpCisgICAgICAgICAgICBpZiBsZW4odmFsdWUpID49IDIgYW5kIHZhbHVlWzBdID09IHZhbHVlWy0xXSA9PSAnIic6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOi0xXQorICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXCcsICdcXCcpLnJlcGxhY2UoJ1xcIicsICciJykKKyAgICAgICAgICAgIHBkaWN0W25hbWVdID0gdmFsdWUKKyAgICByZXR1cm4ga2V5LCBwZGljdAorCisKKyMgQ2xhc3NlcyBmb3IgZmllbGQgc3RvcmFnZQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE1pbmlGaWVsZFN0b3JhZ2U6CisKKyAgICAiIiJMaWtlIEZpZWxkU3RvcmFnZSwgZm9yIHVzZSB3aGVuIG5vIGZpbGUgdXBsb2FkcyBhcmUgcG9zc2libGUuIiIiCisKKyAgICAjIER1bW15IGF0dHJpYnV0ZXMKKyAgICBmaWxlbmFtZSA9IE5vbmUKKyAgICBsaXN0ID0gTm9uZQorICAgIHR5cGUgPSBOb25lCisgICAgZmlsZSA9IE5vbmUKKyAgICB0eXBlX29wdGlvbnMgPSB7fQorICAgIGRpc3Bvc2l0aW9uID0gTm9uZQorICAgIGRpc3Bvc2l0aW9uX29wdGlvbnMgPSB7fQorICAgIGhlYWRlcnMgPSB7fQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IgZnJvbSBmaWVsZCBuYW1lIGFuZCB2YWx1ZS4iIiIKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgIyBzZWxmLmZpbGUgPSBTdHJpbmdJTyh2YWx1ZSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHByaW50YWJsZSByZXByZXNlbnRhdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuICJNaW5pRmllbGRTdG9yYWdlKCVyLCAlcikiICUgKHNlbGYubmFtZSwgc2VsZi52YWx1ZSkKKworCitjbGFzcyBGaWVsZFN0b3JhZ2U6CisKKyAgICAiIiJTdG9yZSBhIHNlcXVlbmNlIG9mIGZpZWxkcywgcmVhZGluZyBtdWx0aXBhcnQvZm9ybS1kYXRhLgorCisgICAgVGhpcyBjbGFzcyBwcm92aWRlcyBuYW1pbmcsIHR5cGluZywgZmlsZXMgc3RvcmVkIG9uIGRpc2ssIGFuZAorICAgIG1vcmUuICBBdCB0aGUgdG9wIGxldmVsLCBpdCBpcyBhY2Nlc3NpYmxlIGxpa2UgYSBkaWN0aW9uYXJ5LCB3aG9zZQorICAgIGtleXMgYXJlIHRoZSBmaWVsZCBuYW1lcy4gIChOb3RlOiBOb25lIGNhbiBvY2N1ciBhcyBhIGZpZWxkIG5hbWUuKQorICAgIFRoZSBpdGVtcyBhcmUgZWl0aGVyIGEgUHl0aG9uIGxpc3QgKGlmIHRoZXJlJ3MgbXVsdGlwbGUgdmFsdWVzKSBvcgorICAgIGFub3RoZXIgRmllbGRTdG9yYWdlIG9yIE1pbmlGaWVsZFN0b3JhZ2Ugb2JqZWN0LiAgSWYgaXQncyBhIHNpbmdsZQorICAgIG9iamVjdCwgaXQgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKworICAgIG5hbWU6IHRoZSBmaWVsZCBuYW1lLCBpZiBzcGVjaWZpZWQ7IG90aGVyd2lzZSBOb25lCisKKyAgICBmaWxlbmFtZTogdGhlIGZpbGVuYW1lLCBpZiBzcGVjaWZpZWQ7IG90aGVyd2lzZSBOb25lOyB0aGlzIGlzIHRoZQorICAgICAgICBjbGllbnQgc2lkZSBmaWxlbmFtZSwgKm5vdCogdGhlIGZpbGUgbmFtZSBvbiB3aGljaCBpdCBpcworICAgICAgICBzdG9yZWQgKHRoYXQncyBhIHRlbXBvcmFyeSBmaWxlIHlvdSBkb24ndCBkZWFsIHdpdGgpCisKKyAgICB2YWx1ZTogdGhlIHZhbHVlIGFzIGEgKnN0cmluZyo7IGZvciBmaWxlIHVwbG9hZHMsIHRoaXMKKyAgICAgICAgdHJhbnNwYXJlbnRseSByZWFkcyB0aGUgZmlsZSBldmVyeSB0aW1lIHlvdSByZXF1ZXN0IHRoZSB2YWx1ZQorCisgICAgZmlsZTogdGhlIGZpbGUoLWxpa2UpIG9iamVjdCBmcm9tIHdoaWNoIHlvdSBjYW4gcmVhZCB0aGUgZGF0YTsKKyAgICAgICAgTm9uZSBpZiB0aGUgZGF0YSBpcyBzdG9yZWQgYSBzaW1wbGUgc3RyaW5nCisKKyAgICB0eXBlOiB0aGUgY29udGVudC10eXBlLCBvciBOb25lIGlmIG5vdCBzcGVjaWZpZWQKKworICAgIHR5cGVfb3B0aW9uczogZGljdGlvbmFyeSBvZiBvcHRpb25zIHNwZWNpZmllZCBvbiB0aGUgY29udGVudC10eXBlCisgICAgICAgIGxpbmUKKworICAgIGRpc3Bvc2l0aW9uOiBjb250ZW50LWRpc3Bvc2l0aW9uLCBvciBOb25lIGlmIG5vdCBzcGVjaWZpZWQKKworICAgIGRpc3Bvc2l0aW9uX29wdGlvbnM6IGRpY3Rpb25hcnkgb2YgY29ycmVzcG9uZGluZyBvcHRpb25zCisKKyAgICBoZWFkZXJzOiBhIGRpY3Rpb25hcnkoLWxpa2UpIG9iamVjdCAoc29tZXRpbWVzIHJmYzgyMi5NZXNzYWdlIG9yIGEKKyAgICAgICAgc3ViY2xhc3MgdGhlcmVvZikgY29udGFpbmluZyAqYWxsKiBoZWFkZXJzCisKKyAgICBUaGUgY2xhc3MgaXMgc3ViY2xhc3NhYmxlLCBtb3N0bHkgZm9yIHRoZSBwdXJwb3NlIG9mIG92ZXJyaWRpbmcKKyAgICB0aGUgbWFrZV9maWxlKCkgbWV0aG9kLCB3aGljaCBpcyBjYWxsZWQgaW50ZXJuYWxseSB0byBjb21lIHVwIHdpdGgKKyAgICBhIGZpbGUgb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8KKyAgICBvdmVycmlkZSB0aGUgZGVmYXVsdCBjaG9pY2Ugb2Ygc3RvcmluZyBhbGwgZmlsZXMgaW4gYSB0ZW1wb3JhcnkKKyAgICBkaXJlY3RvcnkgYW5kIHVubGlua2luZyB0aGVtIGFzIHNvb24gYXMgdGhleSBoYXZlIGJlZW4gb3BlbmVkLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnA9Tm9uZSwgaGVhZGVycz1Ob25lLCBvdXRlcmJvdW5kYXJ5PSIiLAorICAgICAgICAgICAgICAgICBlbnZpcm9uPW9zLmVudmlyb24sIGtlZXBfYmxhbmtfdmFsdWVzPTAsIHN0cmljdF9wYXJzaW5nPTApOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4gIFJlYWQgbXVsdGlwYXJ0LyogdW50aWwgbGFzdCBwYXJ0LgorCisgICAgICAgIEFyZ3VtZW50cywgYWxsIG9wdGlvbmFsOgorCisgICAgICAgIGZwICAgICAgICAgICAgICA6IGZpbGUgcG9pbnRlcjsgZGVmYXVsdDogc3lzLnN0ZGluCisgICAgICAgICAgICAobm90IHVzZWQgd2hlbiB0aGUgcmVxdWVzdCBtZXRob2QgaXMgR0VUKQorCisgICAgICAgIGhlYWRlcnMgICAgICAgICA6IGhlYWRlciBkaWN0aW9uYXJ5LWxpa2Ugb2JqZWN0OyBkZWZhdWx0OgorICAgICAgICAgICAgdGFrZW4gZnJvbSBlbnZpcm9uIGFzIHBlciBDR0kgc3BlYworCisgICAgICAgIG91dGVyYm91bmRhcnkgICA6IHRlcm1pbmF0aW5nIG11bHRpcGFydCBib3VuZGFyeQorICAgICAgICAgICAgKGZvciBpbnRlcm5hbCB1c2Ugb25seSkKKworICAgICAgICBlbnZpcm9uICAgICAgICAgOiBlbnZpcm9ubWVudCBkaWN0aW9uYXJ5OyBkZWZhdWx0OiBvcy5lbnZpcm9uCisKKyAgICAgICAga2VlcF9ibGFua192YWx1ZXM6IGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGJsYW5rIHZhbHVlcyBpbgorICAgICAgICAgICAgcGVyY2VudC1lbmNvZGVkIGZvcm1zIHNob3VsZCBiZSB0cmVhdGVkIGFzIGJsYW5rIHN0cmluZ3MuCisgICAgICAgICAgICBBIHRydWUgdmFsdWUgaW5kaWNhdGVzIHRoYXQgYmxhbmtzIHNob3VsZCBiZSByZXRhaW5lZCBhcworICAgICAgICAgICAgYmxhbmsgc3RyaW5ncy4gIFRoZSBkZWZhdWx0IGZhbHNlIHZhbHVlIGluZGljYXRlcyB0aGF0CisgICAgICAgICAgICBibGFuayB2YWx1ZXMgYXJlIHRvIGJlIGlnbm9yZWQgYW5kIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlCisgICAgICAgICAgICBub3QgaW5jbHVkZWQuCisKKyAgICAgICAgc3RyaWN0X3BhcnNpbmc6IGZsYWcgaW5kaWNhdGluZyB3aGF0IHRvIGRvIHdpdGggcGFyc2luZyBlcnJvcnMuCisgICAgICAgICAgICBJZiBmYWxzZSAodGhlIGRlZmF1bHQpLCBlcnJvcnMgYXJlIHNpbGVudGx5IGlnbm9yZWQuCisgICAgICAgICAgICBJZiB0cnVlLCBlcnJvcnMgcmFpc2UgYSBWYWx1ZUVycm9yIGV4Y2VwdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgbWV0aG9kID0gJ0dFVCcKKyAgICAgICAgc2VsZi5rZWVwX2JsYW5rX3ZhbHVlcyA9IGtlZXBfYmxhbmtfdmFsdWVzCisgICAgICAgIHNlbGYuc3RyaWN0X3BhcnNpbmcgPSBzdHJpY3RfcGFyc2luZworICAgICAgICBpZiAnUkVRVUVTVF9NRVRIT0QnIGluIGVudmlyb246CisgICAgICAgICAgICBtZXRob2QgPSBlbnZpcm9uWydSRVFVRVNUX01FVEhPRCddLnVwcGVyKCkKKyAgICAgICAgc2VsZi5xc19vbl9wb3N0ID0gTm9uZQorICAgICAgICBpZiBtZXRob2QgPT0gJ0dFVCcgb3IgbWV0aG9kID09ICdIRUFEJzoKKyAgICAgICAgICAgIGlmICdRVUVSWV9TVFJJTkcnIGluIGVudmlyb246CisgICAgICAgICAgICAgICAgcXMgPSBlbnZpcm9uWydRVUVSWV9TVFJJTkcnXQorICAgICAgICAgICAgZWxpZiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICAgICAgcXMgPSBzeXMuYXJndlsxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBxcyA9ICIiCisgICAgICAgICAgICBmcCA9IFN0cmluZ0lPKHFzKQorICAgICAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGhlYWRlcnMgPSB7J2NvbnRlbnQtdHlwZSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0KKyAgICAgICAgaWYgaGVhZGVycyBpcyBOb25lOgorICAgICAgICAgICAgaGVhZGVycyA9IHt9CisgICAgICAgICAgICBpZiBtZXRob2QgPT0gJ1BPU1QnOgorICAgICAgICAgICAgICAgICMgU2V0IGRlZmF1bHQgY29udGVudC10eXBlIGZvciBQT1NUIHRvIHdoYXQncyB0cmFkaXRpb25hbAorICAgICAgICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIKKyAgICAgICAgICAgIGlmICdDT05URU5UX1RZUEUnIGluIGVudmlyb246CisgICAgICAgICAgICAgICAgaGVhZGVyc1snY29udGVudC10eXBlJ10gPSBlbnZpcm9uWydDT05URU5UX1RZUEUnXQorICAgICAgICAgICAgaWYgJ1FVRVJZX1NUUklORycgaW4gZW52aXJvbjoKKyAgICAgICAgICAgICAgICBzZWxmLnFzX29uX3Bvc3QgPSBlbnZpcm9uWydRVUVSWV9TVFJJTkcnXQorICAgICAgICAgICAgaWYgJ0NPTlRFTlRfTEVOR1RIJyBpbiBlbnZpcm9uOgorICAgICAgICAgICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtbGVuZ3RoJ10gPSBlbnZpcm9uWydDT05URU5UX0xFTkdUSCddCisgICAgICAgIHNlbGYuZnAgPSBmcCBvciBzeXMuc3RkaW4KKyAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycworICAgICAgICBzZWxmLm91dGVyYm91bmRhcnkgPSBvdXRlcmJvdW5kYXJ5CisKKyAgICAgICAgIyBQcm9jZXNzIGNvbnRlbnQtZGlzcG9zaXRpb24gaGVhZGVyCisgICAgICAgIGNkaXNwLCBwZGljdCA9ICIiLCB7fQorICAgICAgICBpZiAnY29udGVudC1kaXNwb3NpdGlvbicgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgY2Rpc3AsIHBkaWN0ID0gcGFyc2VfaGVhZGVyKHNlbGYuaGVhZGVyc1snY29udGVudC1kaXNwb3NpdGlvbiddKQorICAgICAgICBzZWxmLmRpc3Bvc2l0aW9uID0gY2Rpc3AKKyAgICAgICAgc2VsZi5kaXNwb3NpdGlvbl9vcHRpb25zID0gcGRpY3QKKyAgICAgICAgc2VsZi5uYW1lID0gTm9uZQorICAgICAgICBpZiAnbmFtZScgaW4gcGRpY3Q6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBwZGljdFsnbmFtZSddCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBOb25lCisgICAgICAgIGlmICdmaWxlbmFtZScgaW4gcGRpY3Q6CisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gcGRpY3RbJ2ZpbGVuYW1lJ10KKworICAgICAgICAjIFByb2Nlc3MgY29udGVudC10eXBlIGhlYWRlcgorICAgICAgICAjCisgICAgICAgICMgSG9ub3IgYW55IGV4aXN0aW5nIGNvbnRlbnQtdHlwZSBoZWFkZXIuICBCdXQgaWYgdGhlcmUgaXMgbm8KKyAgICAgICAgIyBjb250ZW50LXR5cGUgaGVhZGVyLCB1c2Ugc29tZSBzZW5zaWJsZSBkZWZhdWx0cy4gIEFzc3VtZQorICAgICAgICAjIG91dGVyYm91bmRhcnkgaXMgIiIgYXQgdGhlIG91dGVyIGxldmVsLCBidXQgc29tZXRoaW5nIG5vbi1mYWxzZQorICAgICAgICAjIGluc2lkZSBhIG11bHRpLXBhcnQuICBUaGUgZGVmYXVsdCBmb3IgYW4gaW5uZXIgcGFydCBpcyB0ZXh0L3BsYWluLAorICAgICAgICAjIGJ1dCBmb3IgYW4gb3V0ZXIgcGFydCBpdCBzaG91bGQgYmUgdXJsZW5jb2RlZC4gIFRoaXMgc2hvdWxkIGNhdGNoCisgICAgICAgICMgYm9ndXMgY2xpZW50cyB3aGljaCBlcnJvbmVvdXNseSBmb3JnZXQgdG8gaW5jbHVkZSBhIGNvbnRlbnQtdHlwZQorICAgICAgICAjIGhlYWRlci4KKyAgICAgICAgIworICAgICAgICAjIFNlZSBiZWxvdyBmb3Igd2hhdCB3ZSBkbyBpZiB0aGVyZSBkb2VzIGV4aXN0IGEgY29udGVudC10eXBlIGhlYWRlciwKKyAgICAgICAgIyBidXQgaXQgaGFwcGVucyB0byBiZSBzb21ldGhpbmcgd2UgZG9uJ3QgdW5kZXJzdGFuZC4KKyAgICAgICAgaWYgJ2NvbnRlbnQtdHlwZScgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgY3R5cGUsIHBkaWN0ID0gcGFyc2VfaGVhZGVyKHNlbGYuaGVhZGVyc1snY29udGVudC10eXBlJ10pCisgICAgICAgIGVsaWYgc2VsZi5vdXRlcmJvdW5kYXJ5IG9yIG1ldGhvZCAhPSAnUE9TVCc6CisgICAgICAgICAgICBjdHlwZSwgcGRpY3QgPSAidGV4dC9wbGFpbiIsIHt9CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdHlwZSwgcGRpY3QgPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJywge30KKyAgICAgICAgc2VsZi50eXBlID0gY3R5cGUKKyAgICAgICAgc2VsZi50eXBlX29wdGlvbnMgPSBwZGljdAorICAgICAgICBzZWxmLmlubmVyYm91bmRhcnkgPSAiIgorICAgICAgICBpZiAnYm91bmRhcnknIGluIHBkaWN0OgorICAgICAgICAgICAgc2VsZi5pbm5lcmJvdW5kYXJ5ID0gcGRpY3RbJ2JvdW5kYXJ5J10KKyAgICAgICAgY2xlbiA9IC0xCisgICAgICAgIGlmICdjb250ZW50LWxlbmd0aCcgaW4gc2VsZi5oZWFkZXJzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsZW4gPSBpbnQoc2VsZi5oZWFkZXJzWydjb250ZW50LWxlbmd0aCddKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgbWF4bGVuIGFuZCBjbGVuID4gbWF4bGVuOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdNYXhpbXVtIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZGVkJworICAgICAgICBzZWxmLmxlbmd0aCA9IGNsZW4KKworICAgICAgICBzZWxmLmxpc3QgPSBzZWxmLmZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuZG9uZSA9IDAKKyAgICAgICAgaWYgY3R5cGUgPT0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc6CisgICAgICAgICAgICBzZWxmLnJlYWRfdXJsZW5jb2RlZCgpCisgICAgICAgIGVsaWYgY3R5cGVbOjEwXSA9PSAnbXVsdGlwYXJ0Lyc6CisgICAgICAgICAgICBzZWxmLnJlYWRfbXVsdGkoZW52aXJvbiwga2VlcF9ibGFua192YWx1ZXMsIHN0cmljdF9wYXJzaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWFkX3NpbmdsZSgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHByaW50YWJsZSByZXByZXNlbnRhdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuICJGaWVsZFN0b3JhZ2UoJXIsICVyLCAlcikiICUgKAorICAgICAgICAgICAgICAgIHNlbGYubmFtZSwgc2VsZi5maWxlbmFtZSwgc2VsZi52YWx1ZSkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5rZXlzKCkpCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5hbWUgIT0gJ3ZhbHVlJzoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBuYW1lCisgICAgICAgIGlmIHNlbGYuZmlsZToKKyAgICAgICAgICAgIHNlbGYuZmlsZS5zZWVrKDApCisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuZmlsZS5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuZmlsZS5zZWVrKDApCisgICAgICAgIGVsaWYgc2VsZi5saXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLmxpc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gTm9uZQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAiIiJEaWN0aW9uYXJ5IHN0eWxlIGluZGV4aW5nLiIiIgorICAgICAgICBpZiBzZWxmLmxpc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIm5vdCBpbmRleGFibGUiCisgICAgICAgIGZvdW5kID0gW10KKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5saXN0OgorICAgICAgICAgICAgaWYgaXRlbS5uYW1lID09IGtleTogZm91bmQuYXBwZW5kKGl0ZW0pCisgICAgICAgIGlmIG5vdCBmb3VuZDoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCBrZXkKKyAgICAgICAgaWYgbGVuKGZvdW5kKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIGZvdW5kWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZm91bmQKKworICAgIGRlZiBnZXR2YWx1ZShzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIkRpY3Rpb25hcnkgc3R5bGUgZ2V0KCkgbWV0aG9kLCBpbmNsdWRpbmcgJ3ZhbHVlJyBsb29rdXAuIiIiCisgICAgICAgIGlmIGtleSBpbiBzZWxmOgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KKyAgICAgICAgICAgIGlmIHR5cGUodmFsdWUpIGlzIHR5cGUoW10pOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXAoYXR0cmdldHRlcigndmFsdWUnKSwgdmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworICAgIGRlZiBnZXRmaXJzdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIiBSZXR1cm4gdGhlIGZpcnN0IHZhbHVlIHJlY2VpdmVkLiIiIgorICAgICAgICBpZiBrZXkgaW4gc2VsZjoKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZltrZXldCisgICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSBpcyB0eXBlKFtdKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWVbMF0udmFsdWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIGdldGxpc3Qoc2VsZiwga2V5KToKKyAgICAgICAgIiIiIFJldHVybiBsaXN0IG9mIHJlY2VpdmVkIHZhbHVlcy4iIiIKKyAgICAgICAgaWYga2V5IGluIHNlbGY6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGZba2V5XQorICAgICAgICAgICAgaWYgdHlwZSh2YWx1ZSkgaXMgdHlwZShbXSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcChhdHRyZ2V0dGVyKCd2YWx1ZScpLCB2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFt2YWx1ZS52YWx1ZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICIiIkRpY3Rpb25hcnkgc3R5bGUga2V5cygpIG1ldGhvZC4iIiIKKyAgICAgICAgaWYgc2VsZi5saXN0IGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJub3QgaW5kZXhhYmxlIgorICAgICAgICByZXR1cm4gbGlzdChzZXQoaXRlbS5uYW1lIGZvciBpdGVtIGluIHNlbGYubGlzdCkpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICAiIiJEaWN0aW9uYXJ5IHN0eWxlIGhhc19rZXkoKSBtZXRob2QuIiIiCisgICAgICAgIGlmIHNlbGYubGlzdCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAibm90IGluZGV4YWJsZSIKKyAgICAgICAgcmV0dXJuIGFueShpdGVtLm5hbWUgPT0ga2V5IGZvciBpdGVtIGluIHNlbGYubGlzdCkKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgIiIiRGljdGlvbmFyeSBzdHlsZSBfX2NvbnRhaW5zX18gbWV0aG9kLiIiIgorICAgICAgICBpZiBzZWxmLmxpc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIm5vdCBpbmRleGFibGUiCisgICAgICAgIHJldHVybiBhbnkoaXRlbS5uYW1lID09IGtleSBmb3IgaXRlbSBpbiBzZWxmLmxpc3QpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiRGljdGlvbmFyeSBzdHlsZSBsZW4oeCkgc3VwcG9ydC4iIiIKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmtleXMoKSkKKworICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5saXN0KQorCisgICAgZGVmIHJlYWRfdXJsZW5jb2RlZChzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJlYWQgZGF0YSBpbiBxdWVyeSBzdHJpbmcgZm9ybWF0LiIiIgorICAgICAgICBxcyA9IHNlbGYuZnAucmVhZChzZWxmLmxlbmd0aCkKKyAgICAgICAgaWYgc2VsZi5xc19vbl9wb3N0OgorICAgICAgICAgICAgcXMgKz0gJyYnICsgc2VsZi5xc19vbl9wb3N0CisgICAgICAgIHNlbGYubGlzdCA9IGxpc3QgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiB1cmxwYXJzZS5wYXJzZV9xc2wocXMsIHNlbGYua2VlcF9ibGFua192YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyaWN0X3BhcnNpbmcpOgorICAgICAgICAgICAgbGlzdC5hcHBlbmQoTWluaUZpZWxkU3RvcmFnZShrZXksIHZhbHVlKSkKKyAgICAgICAgc2VsZi5za2lwX2xpbmVzKCkKKworICAgIEZpZWxkU3RvcmFnZUNsYXNzID0gTm9uZQorCisgICAgZGVmIHJlYWRfbXVsdGkoc2VsZiwgZW52aXJvbiwga2VlcF9ibGFua192YWx1ZXMsIHN0cmljdF9wYXJzaW5nKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJlYWQgYSBwYXJ0IHRoYXQgaXMgaXRzZWxmIG11bHRpcGFydC4iIiIKKyAgICAgICAgaWIgPSBzZWxmLmlubmVyYm91bmRhcnkKKyAgICAgICAgaWYgbm90IHZhbGlkX2JvdW5kYXJ5KGliKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdJbnZhbGlkIGJvdW5kYXJ5IGluIG11bHRpcGFydCBmb3JtOiAlcicgJSAoaWIsKQorICAgICAgICBzZWxmLmxpc3QgPSBbXQorICAgICAgICBpZiBzZWxmLnFzX29uX3Bvc3Q6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiB1cmxwYXJzZS5wYXJzZV9xc2woc2VsZi5xc19vbl9wb3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmtlZXBfYmxhbmtfdmFsdWVzLCBzZWxmLnN0cmljdF9wYXJzaW5nKToKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3QuYXBwZW5kKE1pbmlGaWVsZFN0b3JhZ2Uoa2V5LCB2YWx1ZSkpCisgICAgICAgICAgICBGaWVsZFN0b3JhZ2VDbGFzcyA9IE5vbmUKKworICAgICAgICBrbGFzcyA9IHNlbGYuRmllbGRTdG9yYWdlQ2xhc3Mgb3Igc2VsZi5fX2NsYXNzX18KKyAgICAgICAgcGFydCA9IGtsYXNzKHNlbGYuZnAsIHt9LCBpYiwKKyAgICAgICAgICAgICAgICAgICAgIGVudmlyb24sIGtlZXBfYmxhbmtfdmFsdWVzLCBzdHJpY3RfcGFyc2luZykKKyAgICAgICAgIyBUaHJvdyBmaXJzdCBwYXJ0IGF3YXkKKyAgICAgICAgd2hpbGUgbm90IHBhcnQuZG9uZToKKyAgICAgICAgICAgIGhlYWRlcnMgPSByZmM4MjIuTWVzc2FnZShzZWxmLmZwKQorICAgICAgICAgICAgcGFydCA9IGtsYXNzKHNlbGYuZnAsIGhlYWRlcnMsIGliLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb24sIGtlZXBfYmxhbmtfdmFsdWVzLCBzdHJpY3RfcGFyc2luZykKKyAgICAgICAgICAgIHNlbGYubGlzdC5hcHBlbmQocGFydCkKKyAgICAgICAgc2VsZi5za2lwX2xpbmVzKCkKKworICAgIGRlZiByZWFkX3NpbmdsZShzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJlYWQgYW4gYXRvbWljIHBhcnQuIiIiCisgICAgICAgIGlmIHNlbGYubGVuZ3RoID49IDA6CisgICAgICAgICAgICBzZWxmLnJlYWRfYmluYXJ5KCkKKyAgICAgICAgICAgIHNlbGYuc2tpcF9saW5lcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJlYWRfbGluZXMoKQorICAgICAgICBzZWxmLmZpbGUuc2VlaygwKQorCisgICAgYnVmc2l6ZSA9IDgqMTAyNCAgICAgICAgICAgICMgSS9PIGJ1ZmZlcmluZyBzaXplIGZvciBjb3B5IHRvIGZpbGUKKworICAgIGRlZiByZWFkX2JpbmFyeShzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHJlYWQgYmluYXJ5IGRhdGEuIiIiCisgICAgICAgIHNlbGYuZmlsZSA9IHNlbGYubWFrZV9maWxlKCdiJykKKyAgICAgICAgdG9kbyA9IHNlbGYubGVuZ3RoCisgICAgICAgIGlmIHRvZG8gPj0gMDoKKyAgICAgICAgICAgIHdoaWxlIHRvZG8gPiAwOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLmZwLnJlYWQobWluKHRvZG8sIHNlbGYuYnVmc2l6ZSkpCisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IC0xCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgdG9kbyA9IHRvZG8gLSBsZW4oZGF0YSkKKworICAgIGRlZiByZWFkX2xpbmVzKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbDogcmVhZCBsaW5lcyB1bnRpbCBFT0Ygb3Igb3V0ZXJib3VuZGFyeS4iIiIKKyAgICAgICAgc2VsZi5maWxlID0gc2VsZi5fX2ZpbGUgPSBTdHJpbmdJTygpCisgICAgICAgIGlmIHNlbGYub3V0ZXJib3VuZGFyeToKKyAgICAgICAgICAgIHNlbGYucmVhZF9saW5lc190b19vdXRlcmJvdW5kYXJ5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVhZF9saW5lc190b19lb2YoKQorCisgICAgZGVmIF9fd3JpdGUoc2VsZiwgbGluZSk6CisgICAgICAgIGlmIHNlbGYuX19maWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5fX2ZpbGUudGVsbCgpICsgbGVuKGxpbmUpID4gMTAwMDoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLm1ha2VfZmlsZSgnJykKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUud3JpdGUoc2VsZi5fX2ZpbGUuZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlLndyaXRlKGxpbmUpCisKKyAgICBkZWYgcmVhZF9saW5lc190b19lb2Yoc2VsZik6CisgICAgICAgICIiIkludGVybmFsOiByZWFkIGxpbmVzIHVudGlsIEVPRi4iIiIKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKDE8PDE2KQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5kb25lID0gLTEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5fX3dyaXRlKGxpbmUpCisKKyAgICBkZWYgcmVhZF9saW5lc190b19vdXRlcmJvdW5kYXJ5KHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbDogcmVhZCBsaW5lcyB1bnRpbCBvdXRlcmJvdW5kYXJ5LiIiIgorICAgICAgICBuZXh0ID0gIi0tIiArIHNlbGYub3V0ZXJib3VuZGFyeQorICAgICAgICBsYXN0ID0gbmV4dCArICItLSIKKyAgICAgICAgZGVsaW0gPSAiIgorICAgICAgICBsYXN0X2xpbmVfbGZlbmQgPSBUcnVlCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgxPDwxNikKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZG9uZSA9IC0xCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxpbmVbOjJdID09ICItLSIgYW5kIGxhc3RfbGluZV9sZmVuZDoKKyAgICAgICAgICAgICAgICBzdHJpcHBlZGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBzdHJpcHBlZGxpbmUgPT0gbmV4dDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBzdHJpcHBlZGxpbmUgPT0gbGFzdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kb25lID0gMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgb2RlbGltID0gZGVsaW0KKyAgICAgICAgICAgIGlmIGxpbmVbLTI6XSA9PSAiXHJcbiI6CisgICAgICAgICAgICAgICAgZGVsaW0gPSAiXHJcbiIKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgICAgICAgICAgbGFzdF9saW5lX2xmZW5kID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBsaW5lWy0xXSA9PSAiXG4iOgorICAgICAgICAgICAgICAgIGRlbGltID0gIlxuIgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgICAgICBsYXN0X2xpbmVfbGZlbmQgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlbGltID0gIiIKKyAgICAgICAgICAgICAgICBsYXN0X2xpbmVfbGZlbmQgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5fX3dyaXRlKG9kZWxpbSArIGxpbmUpCisKKyAgICBkZWYgc2tpcF9saW5lcyhzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHNraXAgbGluZXMgdW50aWwgb3V0ZXIgYm91bmRhcnkgaWYgZGVmaW5lZC4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYub3V0ZXJib3VuZGFyeSBvciBzZWxmLmRvbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbmV4dCA9ICItLSIgKyBzZWxmLm91dGVyYm91bmRhcnkKKyAgICAgICAgbGFzdCA9IG5leHQgKyAiLS0iCisgICAgICAgIGxhc3RfbGluZV9sZmVuZCA9IFRydWUKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKDE8PDE2KQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5kb25lID0gLTEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGluZVs6Ml0gPT0gIi0tIiBhbmQgbGFzdF9saW5lX2xmZW5kOgorICAgICAgICAgICAgICAgIHN0cmlwcGVkbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIHN0cmlwcGVkbGluZSA9PSBuZXh0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIHN0cmlwcGVkbGluZSA9PSBsYXN0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSAxCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsYXN0X2xpbmVfbGZlbmQgPSBsaW5lLmVuZHN3aXRoKCdcbicpCisKKyAgICBkZWYgbWFrZV9maWxlKHNlbGYsIGJpbmFyeT1Ob25lKToKKyAgICAgICAgIiIiT3ZlcnJpZGFibGU6IHJldHVybiBhIHJlYWRhYmxlICYgd3JpdGFibGUgZmlsZS4KKworICAgICAgICBUaGUgZmlsZSB3aWxsIGJlIHVzZWQgYXMgZm9sbG93czoKKyAgICAgICAgLSBkYXRhIGlzIHdyaXR0ZW4gdG8gaXQKKyAgICAgICAgLSBzZWVrKDApCisgICAgICAgIC0gZGF0YSBpcyByZWFkIGZyb20gaXQKKworICAgICAgICBUaGUgJ2JpbmFyeScgYXJndW1lbnQgaXMgdW51c2VkIC0tIHRoZSBmaWxlIGlzIGFsd2F5cyBvcGVuZWQKKyAgICAgICAgaW4gYmluYXJ5IG1vZGUuCisKKyAgICAgICAgVGhpcyB2ZXJzaW9uIG9wZW5zIGEgdGVtcG9yYXJ5IGZpbGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcsCisgICAgICAgIGFuZCBpbW1lZGlhdGVseSBkZWxldGVzICh1bmxpbmtzKSBpdC4gIFRoZSB0cmljayAob24gVW5peCEpIGlzCisgICAgICAgIHRoYXQgdGhlIGZpbGUgY2FuIHN0aWxsIGJlIHVzZWQsIGJ1dCBpdCBjYW4ndCBiZSBvcGVuZWQgYnkKKyAgICAgICAgYW5vdGhlciBwcm9jZXNzLCBhbmQgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGRlbGV0ZWQgd2hlbiBpdAorICAgICAgICBpcyBjbG9zZWQgb3Igd2hlbiB0aGUgY3VycmVudCBwcm9jZXNzIHRlcm1pbmF0ZXMuCisKKyAgICAgICAgSWYgeW91IHdhbnQgYSBtb3JlIHBlcm1hbmVudCBmaWxlLCB5b3UgZGVyaXZlIGEgY2xhc3Mgd2hpY2gKKyAgICAgICAgb3ZlcnJpZGVzIHRoaXMgbWV0aG9kLiAgSWYgeW91IHdhbnQgYSB2aXNpYmxlIHRlbXBvcmFyeSBmaWxlCisgICAgICAgIHRoYXQgaXMgbmV2ZXJ0aGVsZXNzIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCB3aGVuIHRoZSBzY3JpcHQKKyAgICAgICAgdGVybWluYXRlcywgdHJ5IGRlZmluaW5nIGEgX19kZWxfXyBtZXRob2QgaW4gYSBkZXJpdmVkIGNsYXNzCisgICAgICAgIHdoaWNoIHVubGlua3MgdGhlIHRlbXBvcmFyeSBmaWxlcyB5b3UgaGF2ZSBjcmVhdGVkLgorCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICAgICAgcmV0dXJuIHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoIncrYiIpCisKKworCisjIEJhY2t3YXJkcyBDb21wYXRpYmlsaXR5IENsYXNzZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBGb3JtQ29udGVudERpY3QoVXNlckRpY3QuVXNlckRpY3QpOgorICAgICIiIkZvcm0gY29udGVudCBhcyBkaWN0aW9uYXJ5IHdpdGggYSBsaXN0IG9mIHZhbHVlcyBwZXIgZmllbGQuCisKKyAgICBmb3JtID0gRm9ybUNvbnRlbnREaWN0KCkKKworICAgIGZvcm1ba2V5XSAtPiBbdmFsdWUsIHZhbHVlLCAuLi5dCisgICAga2V5IGluIGZvcm0gLT4gQm9vbGVhbgorICAgIGZvcm0ua2V5cygpIC0+IFtrZXksIGtleSwgLi4uXQorICAgIGZvcm0udmFsdWVzKCkgLT4gW1t2YWwsIHZhbCwgLi4uXSwgW3ZhbCwgdmFsLCAuLi5dLCAuLi5dCisgICAgZm9ybS5pdGVtcygpIC0+ICBbKGtleSwgW3ZhbCwgdmFsLCAuLi5dKSwgKGtleSwgW3ZhbCwgdmFsLCAuLi5dKSwgLi4uXQorICAgIGZvcm0uZGljdCA9PSB7a2V5OiBbdmFsLCB2YWwsIC4uLl0sIC4uLn0KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbnZpcm9uPW9zLmVudmlyb24sIGtlZXBfYmxhbmtfdmFsdWVzPTAsIHN0cmljdF9wYXJzaW5nPTApOgorICAgICAgICBzZWxmLmRpY3QgPSBzZWxmLmRhdGEgPSBwYXJzZShlbnZpcm9uPWVudmlyb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBfYmxhbmtfdmFsdWVzPWtlZXBfYmxhbmtfdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RfcGFyc2luZz1zdHJpY3RfcGFyc2luZykKKyAgICAgICAgc2VsZi5xdWVyeV9zdHJpbmcgPSBlbnZpcm9uWydRVUVSWV9TVFJJTkcnXQorCisKK2NsYXNzIFN2Rm9ybUNvbnRlbnREaWN0KEZvcm1Db250ZW50RGljdCk6CisgICAgIiIiRm9ybSBjb250ZW50IGFzIGRpY3Rpb25hcnkgZXhwZWN0aW5nIGEgc2luZ2xlIHZhbHVlIHBlciBmaWVsZC4KKworICAgIElmIHlvdSBvbmx5IGV4cGVjdCBhIHNpbmdsZSB2YWx1ZSBmb3IgZWFjaCBmaWVsZCwgdGhlbiBmb3JtW2tleV0KKyAgICB3aWxsIHJldHVybiB0aGF0IHNpbmdsZSB2YWx1ZS4gIEl0IHdpbGwgcmFpc2UgYW4gSW5kZXhFcnJvciBpZgorICAgIHRoYXQgZXhwZWN0YXRpb24gaXMgbm90IHRydWUuICBJZiB5b3UgZXhwZWN0IGEgZmllbGQgdG8gaGF2ZQorICAgIHBvc3NpYmxlIG11bHRpcGxlIHZhbHVlcywgdGhhbiB5b3UgY2FuIHVzZSBmb3JtLmdldGxpc3Qoa2V5KSB0bworICAgIGdldCBhbGwgb2YgdGhlIHZhbHVlcy4gIHZhbHVlcygpIGFuZCBpdGVtcygpIGFyZSBhIGNvbXByb21pc2U6CisgICAgdGhleSByZXR1cm4gc2luZ2xlIHN0cmluZ3Mgd2hlcmUgdGhlcmUgaXMgYSBzaW5nbGUgdmFsdWUsIGFuZAorICAgIGxpc3RzIG9mIHN0cmluZ3Mgb3RoZXJ3aXNlLgorCisgICAgIiIiCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGxlbihzZWxmLmRpY3Rba2V5XSkgPiAxOgorICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvciwgJ2V4cGVjdGluZyBhIHNpbmdsZSB2YWx1ZScKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdFtrZXldWzBdCisgICAgZGVmIGdldGxpc3Qoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdFtrZXldCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIHZhbHVlIGluIHNlbGYuZGljdC52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGxlbih2YWx1ZSkgPT0gMToKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHZhbHVlWzBdKQorICAgICAgICAgICAgZWxzZTogcmVzdWx0LmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5kaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBsZW4odmFsdWUpID09IDE6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoa2V5LCB2YWx1ZVswXSkpCisgICAgICAgICAgICBlbHNlOiByZXN1bHQuYXBwZW5kKChrZXksIHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2NsYXNzIEludGVycEZvcm1Db250ZW50RGljdChTdkZvcm1Db250ZW50RGljdCk6CisgICAgIiIiVGhpcyBjbGFzcyBpcyBwcmVzZW50IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBvbmx5LiIiIgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB2ID0gU3ZGb3JtQ29udGVudERpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQorICAgICAgICBpZiB2WzBdIGluICcwMTIzNDU2Nzg5Ky0uJzoKKyAgICAgICAgICAgIHRyeTogcmV0dXJuIGludCh2KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgdHJ5OiByZXR1cm4gZmxvYXQodikKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICByZXR1cm4gdi5zdHJpcCgpCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGZba2V5XSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5kaWN0W2tleV0pCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5rZXlzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoa2V5LCBzZWxmW2tleV0pKQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoa2V5LCBzZWxmLmRpY3Rba2V5XSkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBGb3JtQ29udGVudChGb3JtQ29udGVudERpY3QpOgorICAgICIiIlRoaXMgY2xhc3MgaXMgcHJlc2VudCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seS4iIiIKKyAgICBkZWYgdmFsdWVzKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSBpbiBzZWxmLmRpY3QgOnJldHVybiBzZWxmLmRpY3Rba2V5XQorICAgICAgICBlbHNlOiByZXR1cm4gTm9uZQorICAgIGRlZiBpbmRleGVkX3ZhbHVlKHNlbGYsIGtleSwgbG9jYXRpb24pOgorICAgICAgICBpZiBrZXkgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgaWYgbGVuKHNlbGYuZGljdFtrZXldKSA+IGxvY2F0aW9uOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRpY3Rba2V5XVtsb2NhdGlvbl0KKyAgICAgICAgICAgIGVsc2U6IHJldHVybiBOb25lCisgICAgICAgIGVsc2U6IHJldHVybiBOb25lCisgICAgZGVmIHZhbHVlKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleSBpbiBzZWxmLmRpY3Q6IHJldHVybiBzZWxmLmRpY3Rba2V5XVswXQorICAgICAgICBlbHNlOiByZXR1cm4gTm9uZQorICAgIGRlZiBsZW5ndGgoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmRpY3Rba2V5XSkKKyAgICBkZWYgc3RyaXBwZWQoc2VsZiwga2V5KToKKyAgICAgICAgaWYga2V5IGluIHNlbGYuZGljdDogcmV0dXJuIHNlbGYuZGljdFtrZXldWzBdLnN0cmlwKCkKKyAgICAgICAgZWxzZTogcmV0dXJuIE5vbmUKKyAgICBkZWYgcGFycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdAorCisKKyMgVGVzdC9kZWJ1ZyBjb2RlCisjID09PT09PT09PT09PT09PQorCitkZWYgdGVzdChlbnZpcm9uPW9zLmVudmlyb24pOgorICAgICIiIlJvYnVzdCB0ZXN0IENHSSBzY3JpcHQsIHVzYWJsZSBhcyBtYWluIHByb2dyYW0uCisKKyAgICBXcml0ZSBtaW5pbWFsIEhUVFAgaGVhZGVycyBhbmQgZHVtcCBhbGwgaW5mb3JtYXRpb24gcHJvdmlkZWQgdG8KKyAgICB0aGUgc2NyaXB0IGluIEhUTUwgZm9ybS4KKworICAgICIiIgorICAgIHByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbCIKKyAgICBwcmludAorICAgIHN5cy5zdGRlcnIgPSBzeXMuc3Rkb3V0CisgICAgdHJ5OgorICAgICAgICBmb3JtID0gRmllbGRTdG9yYWdlKCkgICAjIFJlcGxhY2Ugd2l0aCBvdGhlciBjbGFzc2VzIHRvIHRlc3QgdGhvc2UKKyAgICAgICAgcHJpbnRfZGlyZWN0b3J5KCkKKyAgICAgICAgcHJpbnRfYXJndW1lbnRzKCkKKyAgICAgICAgcHJpbnRfZm9ybShmb3JtKQorICAgICAgICBwcmludF9lbnZpcm9uKGVudmlyb24pCisgICAgICAgIHByaW50X2Vudmlyb25fdXNhZ2UoKQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgZXhlYyAidGVzdGluZyBwcmludF9leGNlcHRpb24oKSAtLSA8ST5pdGFsaWNzPzwvST4iCisgICAgICAgIGRlZiBnKGY9Zik6CisgICAgICAgICAgICBmKCkKKyAgICAgICAgcHJpbnQgIjxIMz5XaGF0IGZvbGxvd3MgaXMgYSB0ZXN0LCBub3QgYW4gYWN0dWFsIGV4Y2VwdGlvbjo8L0gzPiIKKyAgICAgICAgZygpCisgICAgZXhjZXB0OgorICAgICAgICBwcmludF9leGNlcHRpb24oKQorCisgICAgcHJpbnQgIjxIMT5TZWNvbmQgdHJ5IHdpdGggYSBzbWFsbCBtYXhsZW4uLi48L0gxPiIKKworICAgIGdsb2JhbCBtYXhsZW4KKyAgICBtYXhsZW4gPSA1MAorICAgIHRyeToKKyAgICAgICAgZm9ybSA9IEZpZWxkU3RvcmFnZSgpICAgIyBSZXBsYWNlIHdpdGggb3RoZXIgY2xhc3NlcyB0byB0ZXN0IHRob3NlCisgICAgICAgIHByaW50X2RpcmVjdG9yeSgpCisgICAgICAgIHByaW50X2FyZ3VtZW50cygpCisgICAgICAgIHByaW50X2Zvcm0oZm9ybSkKKyAgICAgICAgcHJpbnRfZW52aXJvbihlbnZpcm9uKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnRfZXhjZXB0aW9uKCkKKworZGVmIHByaW50X2V4Y2VwdGlvbih0eXBlPU5vbmUsIHZhbHVlPU5vbmUsIHRiPU5vbmUsIGxpbWl0PU5vbmUpOgorICAgIGlmIHR5cGUgaXMgTm9uZToKKyAgICAgICAgdHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgcHJpbnQKKyAgICBwcmludCAiPEgzPlRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTo8L0gzPiIKKyAgICBsaXN0ID0gdHJhY2ViYWNrLmZvcm1hdF90Yih0YiwgbGltaXQpICsgXAorICAgICAgICAgICB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHR5cGUsIHZhbHVlKQorICAgIHByaW50ICI8UFJFPiVzPEI+JXM8L0I+PC9QUkU+IiAlICgKKyAgICAgICAgZXNjYXBlKCIiLmpvaW4obGlzdFs6LTFdKSksCisgICAgICAgIGVzY2FwZShsaXN0Wy0xXSksCisgICAgICAgICkKKyAgICBkZWwgdGIKKworZGVmIHByaW50X2Vudmlyb24oZW52aXJvbj1vcy5lbnZpcm9uKToKKyAgICAiIiJEdW1wIHRoZSBzaGVsbCBlbnZpcm9ubWVudCBhcyBIVE1MLiIiIgorICAgIGtleXMgPSBlbnZpcm9uLmtleXMoKQorICAgIGtleXMuc29ydCgpCisgICAgcHJpbnQKKyAgICBwcmludCAiPEgzPlNoZWxsIEVudmlyb25tZW50OjwvSDM+IgorICAgIHByaW50ICI8REw+IgorICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgcHJpbnQgIjxEVD4iLCBlc2NhcGUoa2V5KSwgIjxERD4iLCBlc2NhcGUoZW52aXJvbltrZXldKQorICAgIHByaW50ICI8L0RMPiIKKyAgICBwcmludAorCitkZWYgcHJpbnRfZm9ybShmb3JtKToKKyAgICAiIiJEdW1wIHRoZSBjb250ZW50cyBvZiBhIGZvcm0gYXMgSFRNTC4iIiIKKyAgICBrZXlzID0gZm9ybS5rZXlzKCkKKyAgICBrZXlzLnNvcnQoKQorICAgIHByaW50CisgICAgcHJpbnQgIjxIMz5Gb3JtIENvbnRlbnRzOjwvSDM+IgorICAgIGlmIG5vdCBrZXlzOgorICAgICAgICBwcmludCAiPFA+Tm8gZm9ybSBmaWVsZHMuIgorICAgIHByaW50ICI8REw+IgorICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgcHJpbnQgIjxEVD4iICsgZXNjYXBlKGtleSkgKyAiOiIsCisgICAgICAgIHZhbHVlID0gZm9ybVtrZXldCisgICAgICAgIHByaW50ICI8aT4iICsgZXNjYXBlKHJlcHIodHlwZSh2YWx1ZSkpKSArICI8L2k+IgorICAgICAgICBwcmludCAiPEREPiIgKyBlc2NhcGUocmVwcih2YWx1ZSkpCisgICAgcHJpbnQgIjwvREw+IgorICAgIHByaW50CisKK2RlZiBwcmludF9kaXJlY3RvcnkoKToKKyAgICAiIiJEdW1wIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhcyBIVE1MLiIiIgorICAgIHByaW50CisgICAgcHJpbnQgIjxIMz5DdXJyZW50IFdvcmtpbmcgRGlyZWN0b3J5OjwvSDM+IgorICAgIHRyeToKKyAgICAgICAgcHdkID0gb3MuZ2V0Y3dkKCkKKyAgICBleGNlcHQgb3MuZXJyb3IsIG1zZzoKKyAgICAgICAgcHJpbnQgIm9zLmVycm9yOiIsIGVzY2FwZShzdHIobXNnKSkKKyAgICBlbHNlOgorICAgICAgICBwcmludCBlc2NhcGUocHdkKQorICAgIHByaW50CisKK2RlZiBwcmludF9hcmd1bWVudHMoKToKKyAgICBwcmludAorICAgIHByaW50ICI8SDM+Q29tbWFuZCBMaW5lIEFyZ3VtZW50czo8L0gzPiIKKyAgICBwcmludAorICAgIHByaW50IHN5cy5hcmd2CisgICAgcHJpbnQKKworZGVmIHByaW50X2Vudmlyb25fdXNhZ2UoKToKKyAgICAiIiJEdW1wIGEgbGlzdCBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCBieSBDR0kgYXMgSFRNTC4iIiIKKyAgICBwcmludCAiIiIKKzxIMz5UaGVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY291bGQgaGF2ZSBiZWVuIHNldDo8L0gzPgorPFVMPgorPExJPkFVVEhfVFlQRQorPExJPkNPTlRFTlRfTEVOR1RICis8TEk+Q09OVEVOVF9UWVBFCis8TEk+REFURV9HTVQKKzxMST5EQVRFX0xPQ0FMCis8TEk+RE9DVU1FTlRfTkFNRQorPExJPkRPQ1VNRU5UX1JPT1QKKzxMST5ET0NVTUVOVF9VUkkKKzxMST5HQVRFV0FZX0lOVEVSRkFDRQorPExJPkxBU1RfTU9ESUZJRUQKKzxMST5QQVRICis8TEk+UEFUSF9JTkZPCis8TEk+UEFUSF9UUkFOU0xBVEVECis8TEk+UVVFUllfU1RSSU5HCis8TEk+UkVNT1RFX0FERFIKKzxMST5SRU1PVEVfSE9TVAorPExJPlJFTU9URV9JREVOVAorPExJPlJFTU9URV9VU0VSCis8TEk+UkVRVUVTVF9NRVRIT0QKKzxMST5TQ1JJUFRfTkFNRQorPExJPlNFUlZFUl9OQU1FCis8TEk+U0VSVkVSX1BPUlQKKzxMST5TRVJWRVJfUFJPVE9DT0wKKzxMST5TRVJWRVJfUk9PVAorPExJPlNFUlZFUl9TT0ZUV0FSRQorPC9VTD4KK0luIGFkZGl0aW9uLCBIVFRQIGhlYWRlcnMgc2VudCBieSB0aGUgc2VydmVyIG1heSBiZSBwYXNzZWQgaW4gdGhlCitlbnZpcm9ubWVudCBhcyB3ZWxsLiAgSGVyZSBhcmUgc29tZSBjb21tb24gdmFyaWFibGUgbmFtZXM6Cis8VUw+Cis8TEk+SFRUUF9BQ0NFUFQKKzxMST5IVFRQX0NPTk5FQ1RJT04KKzxMST5IVFRQX0hPU1QKKzxMST5IVFRQX1BSQUdNQQorPExJPkhUVFBfUkVGRVJFUgorPExJPkhUVFBfVVNFUl9BR0VOVAorPC9VTD4KKyIiIgorCisKKyMgVXRpbGl0aWVzCisjID09PT09PT09PQorCitkZWYgZXNjYXBlKHMsIHF1b3RlPU5vbmUpOgorICAgICcnJ1JlcGxhY2Ugc3BlY2lhbCBjaGFyYWN0ZXJzICImIiwgIjwiIGFuZCAiPiIgdG8gSFRNTC1zYWZlIHNlcXVlbmNlcy4KKyAgICBJZiB0aGUgb3B0aW9uYWwgZmxhZyBxdW90ZSBpcyB0cnVlLCB0aGUgcXVvdGF0aW9uIG1hcmsgY2hhcmFjdGVyICgiKQorICAgIGlzIGFsc28gdHJhbnNsYXRlZC4nJycKKyAgICBzID0gcy5yZXBsYWNlKCImIiwgIiZhbXA7IikgIyBNdXN0IGJlIGRvbmUgZmlyc3QhCisgICAgcyA9IHMucmVwbGFjZSgiPCIsICImbHQ7IikKKyAgICBzID0gcy5yZXBsYWNlKCI+IiwgIiZndDsiKQorICAgIGlmIHF1b3RlOgorICAgICAgICBzID0gcy5yZXBsYWNlKCciJywgIiZxdW90OyIpCisgICAgcmV0dXJuIHMKKworZGVmIHZhbGlkX2JvdW5kYXJ5KHMsIF92Yl9wYXR0ZXJuPSJeWyAtfl17MCwyMDB9WyEtfl0kIik6CisgICAgaW1wb3J0IHJlCisgICAgcmV0dXJuIHJlLm1hdGNoKF92Yl9wYXR0ZXJuLCBzKQorCisjIEludm9rZSBtYWlubGluZQorIyA9PT09PT09PT09PT09PT0KKworIyBDYWxsIHRlc3QoKSB3aGVuIHRoaXMgZmlsZSBpcyBydW4gYXMgYSBzY3JpcHQgKG5vdCBpbXBvcnRlZCBhcyBhIG1vZHVsZSkKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NnaS5weWMgYi9saWIvcHl0aG9uMi43L2NnaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjOTljMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2dpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NnaS5weW8gYi9saWIvcHl0aG9uMi43L2NnaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjOTljMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2dpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NnaXRiLnB5IGIvbGliL3B5dGhvbjIuNy9jZ2l0Yi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWNjNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jZ2l0Yi5weQpAQCAtMCwwICsxLDMyMyBAQAorIiIiTW9yZSBjb21wcmVoZW5zaXZlIHRyYWNlYmFjayBmb3JtYXR0aW5nIGZvciBQeXRob24gc2NyaXB0cy4KKworVG8gZW5hYmxlIHRoaXMgbW9kdWxlLCBkbzoKKworICAgIGltcG9ydCBjZ2l0YjsgY2dpdGIuZW5hYmxlKCkKKworYXQgdGhlIHRvcCBvZiB5b3VyIHNjcmlwdC4gIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gZW5hYmxlKCkgYXJlOgorCisgICAgZGlzcGxheSAgICAgLSBpZiB0cnVlLCB0cmFjZWJhY2tzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIHdlYiBicm93c2VyCisgICAgbG9nZGlyICAgICAgLSBpZiBzZXQsIHRyYWNlYmFja3MgYXJlIHdyaXR0ZW4gdG8gZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkKKyAgICBjb250ZXh0ICAgICAtIG51bWJlciBvZiBsaW5lcyBvZiBzb3VyY2UgY29kZSB0byBzaG93IGZvciBlYWNoIHN0YWNrIGZyYW1lCisgICAgZm9ybWF0ICAgICAgLSAndGV4dCcgb3IgJ2h0bWwnIGNvbnRyb2xzIHRoZSBvdXRwdXQgZm9ybWF0CisKK0J5IGRlZmF1bHQsIHRyYWNlYmFja3MgYXJlIGRpc3BsYXllZCBidXQgbm90IHNhdmVkLCB0aGUgY29udGV4dCBpcyA1IGxpbmVzCithbmQgdGhlIG91dHB1dCBmb3JtYXQgaXMgJ2h0bWwnIChmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUKK29yaWdpbmFsIHVzZSBvZiB0aGlzIG1vZHVsZSkKKworQWx0ZXJuYXRpdmVseSwgaWYgeW91IGhhdmUgY2F1Z2h0IGFuIGV4Y2VwdGlvbiBhbmQgd2FudCBjZ2l0YiB0byBkaXNwbGF5IGl0Citmb3IgeW91LCBjYWxsIGNnaXRiLmhhbmRsZXIoKS4gIFRoZSBvcHRpb25hbCBhcmd1bWVudCB0byBoYW5kbGVyKCkgaXMgYQorMy1pdGVtIHR1cGxlIChldHlwZSwgZXZhbHVlLCBldGIpIGp1c3QgbGlrZSB0aGUgdmFsdWUgb2Ygc3lzLmV4Y19pbmZvKCkuCitUaGUgZGVmYXVsdCBoYW5kbGVyIGRpc3BsYXlzIG91dHB1dCBhcyBIVE1MLgorCisiIiIKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQga2V5d29yZAoraW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IG9zCitpbXBvcnQgcHlkb2MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB0b2tlbml6ZQoraW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IHR5cGVzCisKK2RlZiByZXNldCgpOgorICAgICIiIlJldHVybiBhIHN0cmluZyB0aGF0IHJlc2V0cyB0aGUgQ0dJIGFuZCBicm93c2VyIHRvIGEga25vd24gc3RhdGUuIiIiCisgICAgcmV0dXJuICcnJzwhLS06IHNwYW0KK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sCisKKzxib2R5IGJnY29sb3I9IiNmMGYwZjgiPjxmb250IGNvbG9yPSIjZjBmMGY4IiBzaXplPSItNSI+IC0tPgorPGJvZHkgYmdjb2xvcj0iI2YwZjBmOCI+PGZvbnQgY29sb3I9IiNmMGYwZjgiIHNpemU9Ii01Ij4gLS0+IC0tPgorPC9mb250PiA8L2ZvbnQ+IDwvZm9udD4gPC9zY3JpcHQ+IDwvb2JqZWN0PiA8L2Jsb2NrcXVvdGU+IDwvcHJlPgorPC90YWJsZT4gPC90YWJsZT4gPC90YWJsZT4gPC90YWJsZT4gPC90YWJsZT4gPC9mb250PiA8L2ZvbnQ+IDwvZm9udD4nJycKKworX19VTkRFRl9fID0gW10gICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBzcGVjaWFsIHNlbnRpbmVsIG9iamVjdAorZGVmIHNtYWxsKHRleHQpOgorICAgIGlmIHRleHQ6CisgICAgICAgIHJldHVybiAnPHNtYWxsPicgKyB0ZXh0ICsgJzwvc21hbGw+JworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJworCitkZWYgc3Ryb25nKHRleHQpOgorICAgIGlmIHRleHQ6CisgICAgICAgIHJldHVybiAnPHN0cm9uZz4nICsgdGV4dCArICc8L3N0cm9uZz4nCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICcnCisKK2RlZiBncmV5KHRleHQpOgorICAgIGlmIHRleHQ6CisgICAgICAgIHJldHVybiAnPGZvbnQgY29sb3I9IiM5MDkwOTAiPicgKyB0ZXh0ICsgJzwvZm9udD4nCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICcnCisKK2RlZiBsb29rdXAobmFtZSwgZnJhbWUsIGxvY2Fscyk6CisgICAgIiIiRmluZCB0aGUgdmFsdWUgZm9yIGEgZ2l2ZW4gbmFtZSBpbiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuIiIiCisgICAgaWYgbmFtZSBpbiBsb2NhbHM6CisgICAgICAgIHJldHVybiAnbG9jYWwnLCBsb2NhbHNbbmFtZV0KKyAgICBpZiBuYW1lIGluIGZyYW1lLmZfZ2xvYmFsczoKKyAgICAgICAgcmV0dXJuICdnbG9iYWwnLCBmcmFtZS5mX2dsb2JhbHNbbmFtZV0KKyAgICBpZiAnX19idWlsdGluc19fJyBpbiBmcmFtZS5mX2dsb2JhbHM6CisgICAgICAgIGJ1aWx0aW5zID0gZnJhbWUuZl9nbG9iYWxzWydfX2J1aWx0aW5zX18nXQorICAgICAgICBpZiB0eXBlKGJ1aWx0aW5zKSBpcyB0eXBlKHt9KToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gYnVpbHRpbnM6CisgICAgICAgICAgICAgICAgcmV0dXJuICdidWlsdGluJywgYnVpbHRpbnNbbmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoYnVpbHRpbnMsIG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiAnYnVpbHRpbicsIGdldGF0dHIoYnVpbHRpbnMsIG5hbWUpCisgICAgcmV0dXJuIE5vbmUsIF9fVU5ERUZfXworCitkZWYgc2NhbnZhcnMocmVhZGVyLCBmcmFtZSwgbG9jYWxzKToKKyAgICAiIiJTY2FuIG9uZSBsb2dpY2FsIGxpbmUgb2YgUHl0aG9uIGFuZCBsb29rIHVwIHZhbHVlcyBvZiB2YXJpYWJsZXMgdXNlZC4iIiIKKyAgICB2YXJzLCBsYXN0dG9rZW4sIHBhcmVudCwgcHJlZml4LCB2YWx1ZSA9IFtdLCBOb25lLCBOb25lLCAnJywgX19VTkRFRl9fCisgICAgZm9yIHR0eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSBpbiB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMocmVhZGVyKToKKyAgICAgICAgaWYgdHR5cGUgPT0gdG9rZW5pemUuTkVXTElORTogYnJlYWsKKyAgICAgICAgaWYgdHR5cGUgPT0gdG9rZW5pemUuTkFNRSBhbmQgdG9rZW4gbm90IGluIGtleXdvcmQua3dsaXN0OgorICAgICAgICAgICAgaWYgbGFzdHRva2VuID09ICcuJzoKKyAgICAgICAgICAgICAgICBpZiBwYXJlbnQgaXMgbm90IF9fVU5ERUZfXzoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHBhcmVudCwgdG9rZW4sIF9fVU5ERUZfXykKKyAgICAgICAgICAgICAgICAgICAgdmFycy5hcHBlbmQoKHByZWZpeCArIHRva2VuLCBwcmVmaXgsIHZhbHVlKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd2hlcmUsIHZhbHVlID0gbG9va3VwKHRva2VuLCBmcmFtZSwgbG9jYWxzKQorICAgICAgICAgICAgICAgIHZhcnMuYXBwZW5kKCh0b2tlbiwgd2hlcmUsIHZhbHVlKSkKKyAgICAgICAgZWxpZiB0b2tlbiA9PSAnLic6CisgICAgICAgICAgICBwcmVmaXggKz0gbGFzdHRva2VuICsgJy4nCisgICAgICAgICAgICBwYXJlbnQgPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyZW50LCBwcmVmaXggPSBOb25lLCAnJworICAgICAgICBsYXN0dG9rZW4gPSB0b2tlbgorICAgIHJldHVybiB2YXJzCisKK2RlZiBodG1sKGVpbmZvLCBjb250ZXh0PTUpOgorICAgICIiIlJldHVybiBhIG5pY2UgSFRNTCBkb2N1bWVudCBkZXNjcmliaW5nIGEgZ2l2ZW4gdHJhY2ViYWNrLiIiIgorICAgIGV0eXBlLCBldmFsdWUsIGV0YiA9IGVpbmZvCisgICAgaWYgdHlwZShldHlwZSkgaXMgdHlwZXMuQ2xhc3NUeXBlOgorICAgICAgICBldHlwZSA9IGV0eXBlLl9fbmFtZV9fCisgICAgcHl2ZXIgPSAnUHl0aG9uICcgKyBzeXMudmVyc2lvbi5zcGxpdCgpWzBdICsgJzogJyArIHN5cy5leGVjdXRhYmxlCisgICAgZGF0ZSA9IHRpbWUuY3RpbWUodGltZS50aW1lKCkpCisgICAgaGVhZCA9ICc8Ym9keSBiZ2NvbG9yPSIjZjBmMGY4Ij4nICsgcHlkb2MuaHRtbC5oZWFkaW5nKAorICAgICAgICAnPGJpZz48YmlnPiVzPC9iaWc+PC9iaWc+JyAlCisgICAgICAgIHN0cm9uZyhweWRvYy5odG1sLmVzY2FwZShzdHIoZXR5cGUpKSksCisgICAgICAgICcjZmZmZmZmJywgJyM2NjIyYWEnLCBweXZlciArICc8YnI+JyArIGRhdGUpICsgJycnCis8cD5BIHByb2JsZW0gb2NjdXJyZWQgaW4gYSBQeXRob24gc2NyaXB0LiAgSGVyZSBpcyB0aGUgc2VxdWVuY2Ugb2YKK2Z1bmN0aW9uIGNhbGxzIGxlYWRpbmcgdXAgdG8gdGhlIGVycm9yLCBpbiB0aGUgb3JkZXIgdGhleSBvY2N1cnJlZC48L3A+JycnCisKKyAgICBpbmRlbnQgPSAnPHR0PicgKyBzbWFsbCgnJm5ic3A7JyAqIDUpICsgJyZuYnNwOzwvdHQ+JworICAgIGZyYW1lcyA9IFtdCisgICAgcmVjb3JkcyA9IGluc3BlY3QuZ2V0aW5uZXJmcmFtZXMoZXRiLCBjb250ZXh0KQorICAgIGZvciBmcmFtZSwgZmlsZSwgbG51bSwgZnVuYywgbGluZXMsIGluZGV4IGluIHJlY29yZHM6CisgICAgICAgIGlmIGZpbGU6CisgICAgICAgICAgICBmaWxlID0gb3MucGF0aC5hYnNwYXRoKGZpbGUpCisgICAgICAgICAgICBsaW5rID0gJzxhIGhyZWY9ImZpbGU6Ly8lcyI+JXM8L2E+JyAlIChmaWxlLCBweWRvYy5odG1sLmVzY2FwZShmaWxlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGUgPSBsaW5rID0gJz8nCisgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMgPSBpbnNwZWN0LmdldGFyZ3ZhbHVlcyhmcmFtZSkKKyAgICAgICAgY2FsbCA9ICcnCisgICAgICAgIGlmIGZ1bmMgIT0gJz8nOgorICAgICAgICAgICAgY2FsbCA9ICdpbiAnICsgc3Ryb25nKGZ1bmMpICsgXAorICAgICAgICAgICAgICAgIGluc3BlY3QuZm9ybWF0YXJndmFsdWVzKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMsCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZhbHVlPWxhbWJkYSB2YWx1ZTogJz0nICsgcHlkb2MuaHRtbC5yZXByKHZhbHVlKSkKKworICAgICAgICBoaWdobGlnaHQgPSB7fQorICAgICAgICBkZWYgcmVhZGVyKGxudW09W2xudW1dKToKKyAgICAgICAgICAgIGhpZ2hsaWdodFtsbnVtWzBdXSA9IDEKKyAgICAgICAgICAgIHRyeTogcmV0dXJuIGxpbmVjYWNoZS5nZXRsaW5lKGZpbGUsIGxudW1bMF0pCisgICAgICAgICAgICBmaW5hbGx5OiBsbnVtWzBdICs9IDEKKyAgICAgICAgdmFycyA9IHNjYW52YXJzKHJlYWRlciwgZnJhbWUsIGxvY2FscykKKworICAgICAgICByb3dzID0gWyc8dHI+PHRkIGJnY29sb3I9IiNkOGJiZmYiPiVzJXMgJXM8L3RkPjwvdHI+JyAlCisgICAgICAgICAgICAgICAgKCc8YmlnPiZuYnNwOzwvYmlnPicsIGxpbmssIGNhbGwpXQorICAgICAgICBpZiBpbmRleCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGkgPSBsbnVtIC0gaW5kZXgKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgIG51bSA9IHNtYWxsKCcmbmJzcDsnICogKDUtbGVuKHN0cihpKSkpICsgc3RyKGkpKSArICcmbmJzcDsnCisgICAgICAgICAgICAgICAgaWYgaSBpbiBoaWdobGlnaHQ6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnPHR0Pj0mZ3Q7JXMlczwvdHQ+JyAlIChudW0sIHB5ZG9jLmh0bWwucHJlZm9ybWF0KGxpbmUpKQorICAgICAgICAgICAgICAgICAgICByb3dzLmFwcGVuZCgnPHRyPjx0ZCBiZ2NvbG9yPSIjZmZjY2VlIj4lczwvdGQ+PC90cj4nICUgbGluZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJzx0dD4mbmJzcDsmbmJzcDslcyVzPC90dD4nICUgKG51bSwgcHlkb2MuaHRtbC5wcmVmb3JtYXQobGluZSkpCisgICAgICAgICAgICAgICAgICAgIHJvd3MuYXBwZW5kKCc8dHI+PHRkPiVzPC90ZD48L3RyPicgJSBncmV5KGxpbmUpKQorICAgICAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgIGRvbmUsIGR1bXAgPSB7fSwgW10KKyAgICAgICAgZm9yIG5hbWUsIHdoZXJlLCB2YWx1ZSBpbiB2YXJzOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBkb25lOiBjb250aW51ZQorICAgICAgICAgICAgZG9uZVtuYW1lXSA9IDEKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBfX1VOREVGX186CisgICAgICAgICAgICAgICAgaWYgd2hlcmUgaW4gKCdnbG9iYWwnLCAnYnVpbHRpbicpOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gKCc8ZW0+JXM8L2VtPiAnICUgd2hlcmUpICsgc3Ryb25nKG5hbWUpCisgICAgICAgICAgICAgICAgZWxpZiB3aGVyZSA9PSAnbG9jYWwnOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gc3Ryb25nKG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHdoZXJlICsgc3Ryb25nKG5hbWUuc3BsaXQoJy4nKVstMV0pCisgICAgICAgICAgICAgICAgZHVtcC5hcHBlbmQoJyVzJm5ic3A7PSAlcycgJSAobmFtZSwgcHlkb2MuaHRtbC5yZXByKHZhbHVlKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kKG5hbWUgKyAnIDxlbT51bmRlZmluZWQ8L2VtPicpCisKKyAgICAgICAgcm93cy5hcHBlbmQoJzx0cj48dGQ+JXM8L3RkPjwvdHI+JyAlIHNtYWxsKGdyZXkoJywgJy5qb2luKGR1bXApKSkpCisgICAgICAgIGZyYW1lcy5hcHBlbmQoJycnCis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTAgYm9yZGVyPTA+CislczwvdGFibGU+JycnICUgJ1xuJy5qb2luKHJvd3MpKQorCisgICAgZXhjZXB0aW9uID0gWyc8cD4lczogJXMnICUgKHN0cm9uZyhweWRvYy5odG1sLmVzY2FwZShzdHIoZXR5cGUpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB5ZG9jLmh0bWwuZXNjYXBlKHN0cihldmFsdWUpKSldCisgICAgaWYgaXNpbnN0YW5jZShldmFsdWUsIEJhc2VFeGNlcHRpb24pOgorICAgICAgICBmb3IgbmFtZSBpbiBkaXIoZXZhbHVlKToKKyAgICAgICAgICAgIGlmIG5hbWVbOjFdID09ICdfJzogY29udGludWUKKyAgICAgICAgICAgIHZhbHVlID0gcHlkb2MuaHRtbC5yZXByKGdldGF0dHIoZXZhbHVlLCBuYW1lKSkKKyAgICAgICAgICAgIGV4Y2VwdGlvbi5hcHBlbmQoJ1xuPGJyPiVzJXMmbmJzcDs9XG4lcycgJSAoaW5kZW50LCBuYW1lLCB2YWx1ZSkpCisKKyAgICByZXR1cm4gaGVhZCArICcnLmpvaW4oZnJhbWVzKSArICcnLmpvaW4oZXhjZXB0aW9uKSArICcnJworCisKKzwhLS0gVGhlIGFib3ZlIGlzIGEgZGVzY3JpcHRpb24gb2YgYW4gZXJyb3IgaW4gYSBQeXRob24gcHJvZ3JhbSwgZm9ybWF0dGVkCisgICAgIGZvciBhIFdlYiBicm93c2VyIGJlY2F1c2UgdGhlICdjZ2l0YicgbW9kdWxlIHdhcyBlbmFibGVkLiAgSW4gY2FzZSB5b3UKKyAgICAgYXJlIG5vdCByZWFkaW5nIHRoaXMgaW4gYSBXZWIgYnJvd3NlciwgaGVyZSBpcyB0aGUgb3JpZ2luYWwgdHJhY2ViYWNrOgorCislcworLS0+CisnJycgJSBweWRvYy5odG1sLmVzY2FwZSgKKyAgICAgICAgICAnJy5qb2luKHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKGV0eXBlLCBldmFsdWUsIGV0YikpKQorCitkZWYgdGV4dChlaW5mbywgY29udGV4dD01KToKKyAgICAiIiJSZXR1cm4gYSBwbGFpbiB0ZXh0IGRvY3VtZW50IGRlc2NyaWJpbmcgYSBnaXZlbiB0cmFjZWJhY2suIiIiCisgICAgZXR5cGUsIGV2YWx1ZSwgZXRiID0gZWluZm8KKyAgICBpZiB0eXBlKGV0eXBlKSBpcyB0eXBlcy5DbGFzc1R5cGU6CisgICAgICAgIGV0eXBlID0gZXR5cGUuX19uYW1lX18KKyAgICBweXZlciA9ICdQeXRob24gJyArIHN5cy52ZXJzaW9uLnNwbGl0KClbMF0gKyAnOiAnICsgc3lzLmV4ZWN1dGFibGUKKyAgICBkYXRlID0gdGltZS5jdGltZSh0aW1lLnRpbWUoKSkKKyAgICBoZWFkID0gIiVzXG4lc1xuJXNcbiIgJSAoc3RyKGV0eXBlKSwgcHl2ZXIsIGRhdGUpICsgJycnCitBIHByb2JsZW0gb2NjdXJyZWQgaW4gYSBQeXRob24gc2NyaXB0LiAgSGVyZSBpcyB0aGUgc2VxdWVuY2Ugb2YKK2Z1bmN0aW9uIGNhbGxzIGxlYWRpbmcgdXAgdG8gdGhlIGVycm9yLCBpbiB0aGUgb3JkZXIgdGhleSBvY2N1cnJlZC4KKycnJworCisgICAgZnJhbWVzID0gW10KKyAgICByZWNvcmRzID0gaW5zcGVjdC5nZXRpbm5lcmZyYW1lcyhldGIsIGNvbnRleHQpCisgICAgZm9yIGZyYW1lLCBmaWxlLCBsbnVtLCBmdW5jLCBsaW5lcywgaW5kZXggaW4gcmVjb3JkczoKKyAgICAgICAgZmlsZSA9IGZpbGUgYW5kIG9zLnBhdGguYWJzcGF0aChmaWxlKSBvciAnPycKKyAgICAgICAgYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscyA9IGluc3BlY3QuZ2V0YXJndmFsdWVzKGZyYW1lKQorICAgICAgICBjYWxsID0gJycKKyAgICAgICAgaWYgZnVuYyAhPSAnPyc6CisgICAgICAgICAgICBjYWxsID0gJ2luICcgKyBmdW5jICsgXAorICAgICAgICAgICAgICAgIGluc3BlY3QuZm9ybWF0YXJndmFsdWVzKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMsCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZhbHVlPWxhbWJkYSB2YWx1ZTogJz0nICsgcHlkb2MudGV4dC5yZXByKHZhbHVlKSkKKworICAgICAgICBoaWdobGlnaHQgPSB7fQorICAgICAgICBkZWYgcmVhZGVyKGxudW09W2xudW1dKToKKyAgICAgICAgICAgIGhpZ2hsaWdodFtsbnVtWzBdXSA9IDEKKyAgICAgICAgICAgIHRyeTogcmV0dXJuIGxpbmVjYWNoZS5nZXRsaW5lKGZpbGUsIGxudW1bMF0pCisgICAgICAgICAgICBmaW5hbGx5OiBsbnVtWzBdICs9IDEKKyAgICAgICAgdmFycyA9IHNjYW52YXJzKHJlYWRlciwgZnJhbWUsIGxvY2FscykKKworICAgICAgICByb3dzID0gWycgJXMgJXMnICUgKGZpbGUsIGNhbGwpXQorICAgICAgICBpZiBpbmRleCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGkgPSBsbnVtIC0gaW5kZXgKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgIG51bSA9ICclNWQgJyAlIGkKKyAgICAgICAgICAgICAgICByb3dzLmFwcGVuZChudW0rbGluZS5yc3RyaXAoKSkKKyAgICAgICAgICAgICAgICBpICs9IDEKKworICAgICAgICBkb25lLCBkdW1wID0ge30sIFtdCisgICAgICAgIGZvciBuYW1lLCB3aGVyZSwgdmFsdWUgaW4gdmFyczoKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZG9uZTogY29udGludWUKKyAgICAgICAgICAgIGRvbmVbbmFtZV0gPSAxCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgX19VTkRFRl9fOgorICAgICAgICAgICAgICAgIGlmIHdoZXJlID09ICdnbG9iYWwnOiBuYW1lID0gJ2dsb2JhbCAnICsgbmFtZQorICAgICAgICAgICAgICAgIGVsaWYgd2hlcmUgIT0gJ2xvY2FsJzogbmFtZSA9IHdoZXJlICsgbmFtZS5zcGxpdCgnLicpWy0xXQorICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kKCclcyA9ICVzJyAlIChuYW1lLCBweWRvYy50ZXh0LnJlcHIodmFsdWUpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZHVtcC5hcHBlbmQobmFtZSArICcgdW5kZWZpbmVkJykKKworICAgICAgICByb3dzLmFwcGVuZCgnXG4nLmpvaW4oZHVtcCkpCisgICAgICAgIGZyYW1lcy5hcHBlbmQoJ1xuJXNcbicgJSAnXG4nLmpvaW4ocm93cykpCisKKyAgICBleGNlcHRpb24gPSBbJyVzOiAlcycgJSAoc3RyKGV0eXBlKSwgc3RyKGV2YWx1ZSkpXQorICAgIGlmIGlzaW5zdGFuY2UoZXZhbHVlLCBCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKGV2YWx1ZSk6CisgICAgICAgICAgICB2YWx1ZSA9IHB5ZG9jLnRleHQucmVwcihnZXRhdHRyKGV2YWx1ZSwgbmFtZSkpCisgICAgICAgICAgICBleGNlcHRpb24uYXBwZW5kKCdcbiVzJXMgPSAlcycgJSAoIiAiKjQsIG5hbWUsIHZhbHVlKSkKKworICAgIHJldHVybiBoZWFkICsgJycuam9pbihmcmFtZXMpICsgJycuam9pbihleGNlcHRpb24pICsgJycnCisKK1RoZSBhYm92ZSBpcyBhIGRlc2NyaXB0aW9uIG9mIGFuIGVycm9yIGluIGEgUHl0aG9uIHByb2dyYW0uICBIZXJlIGlzCit0aGUgb3JpZ2luYWwgdHJhY2ViYWNrOgorCislcworJycnICUgJycuam9pbih0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbihldHlwZSwgZXZhbHVlLCBldGIpKQorCitjbGFzcyBIb29rOgorICAgICIiIkEgaG9vayB0byByZXBsYWNlIHN5cy5leGNlcHRob29rIHRoYXQgc2hvd3MgdHJhY2ViYWNrcyBpbiBIVE1MLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpc3BsYXk9MSwgbG9nZGlyPU5vbmUsIGNvbnRleHQ9NSwgZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgICBmb3JtYXQ9Imh0bWwiKToKKyAgICAgICAgc2VsZi5kaXNwbGF5ID0gZGlzcGxheSAgICAgICAgICAjIHNlbmQgdHJhY2ViYWNrcyB0byBicm93c2VyIGlmIHRydWUKKyAgICAgICAgc2VsZi5sb2dkaXIgPSBsb2dkaXIgICAgICAgICAgICAjIGxvZyB0cmFjZWJhY2tzIHRvIGZpbGVzIGlmIG5vdCBOb25lCisgICAgICAgIHNlbGYuY29udGV4dCA9IGNvbnRleHQgICAgICAgICAgIyBudW1iZXIgb2Ygc291cmNlIGNvZGUgbGluZXMgcGVyIGZyYW1lCisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUgb3Igc3lzLnN0ZG91dCAgIyBwbGFjZSB0byBzZW5kIHRoZSBvdXRwdXQKKyAgICAgICAgc2VsZi5mb3JtYXQgPSBmb3JtYXQKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBldHlwZSwgZXZhbHVlLCBldGIpOgorICAgICAgICBzZWxmLmhhbmRsZSgoZXR5cGUsIGV2YWx1ZSwgZXRiKSkKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgaW5mbz1Ob25lKToKKyAgICAgICAgaW5mbyA9IGluZm8gb3Igc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgaWYgc2VsZi5mb3JtYXQgPT0gImh0bWwiOgorICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKHJlc2V0KCkpCisKKyAgICAgICAgZm9ybWF0dGVyID0gKHNlbGYuZm9ybWF0PT0iaHRtbCIpIGFuZCBodG1sIG9yIHRleHQKKyAgICAgICAgcGxhaW4gPSBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkb2MgPSBmb3JtYXR0ZXIoaW5mbywgc2VsZi5jb250ZXh0KQorICAgICAgICBleGNlcHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICMganVzdCBpbiBjYXNlIHNvbWV0aGluZyBnb2VzIHdyb25nCisgICAgICAgICAgICBkb2MgPSAnJy5qb2luKHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKCppbmZvKSkKKyAgICAgICAgICAgIHBsYWluID0gVHJ1ZQorCisgICAgICAgIGlmIHNlbGYuZGlzcGxheToKKyAgICAgICAgICAgIGlmIHBsYWluOgorICAgICAgICAgICAgICAgIGRvYyA9IGRvYy5yZXBsYWNlKCcmJywgJyZhbXA7JykucmVwbGFjZSgnPCcsICcmbHQ7JykKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUud3JpdGUoJzxwcmU+JyArIGRvYyArICc8L3ByZT5cbicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZShkb2MgKyAnXG4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKCc8cD5BIHByb2JsZW0gb2NjdXJyZWQgaW4gYSBQeXRob24gc2NyaXB0LlxuJykKKworICAgICAgICBpZiBzZWxmLmxvZ2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN1ZmZpeCA9IFsnLnR4dCcsICcuaHRtbCddW3NlbGYuZm9ybWF0PT0iaHRtbCJdCisgICAgICAgICAgICAoZmQsIHBhdGgpID0gdGVtcGZpbGUubWtzdGVtcChzdWZmaXg9c3VmZml4LCBkaXI9c2VsZi5sb2dkaXIpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWxlID0gb3MuZmRvcGVuKGZkLCAndycpCisgICAgICAgICAgICAgICAgZmlsZS53cml0ZShkb2MpCisgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgbXNnID0gJyVzIGNvbnRhaW5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGVycm9yLicgJSBwYXRoCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgbXNnID0gJ1RyaWVkIHRvIHNhdmUgdHJhY2ViYWNrIHRvICVzLCBidXQgZmFpbGVkLicgJSBwYXRoCisKKyAgICAgICAgICAgIGlmIHNlbGYuZm9ybWF0ID09ICdodG1sJzoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUud3JpdGUoJzxwPiVzPC9wPlxuJyAlIG1zZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlLndyaXRlKG1zZyArICdcbicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZmlsZS5mbHVzaCgpCisgICAgICAgIGV4Y2VwdDogcGFzcworCitoYW5kbGVyID0gSG9vaygpLmhhbmRsZQorZGVmIGVuYWJsZShkaXNwbGF5PTEsIGxvZ2Rpcj1Ob25lLCBjb250ZXh0PTUsIGZvcm1hdD0iaHRtbCIpOgorICAgICIiIkluc3RhbGwgYW4gZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCBmb3JtYXRzIHRyYWNlYmFja3MgYXMgSFRNTC4KKworICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCAnZGlzcGxheScgY2FuIGJlIHNldCB0byAwIHRvIHN1cHByZXNzIHNlbmRpbmcgdGhlCisgICAgdHJhY2ViYWNrIHRvIHRoZSBicm93c2VyLCBhbmQgJ2xvZ2RpcicgY2FuIGJlIHNldCB0byBhIGRpcmVjdG9yeSB0byBjYXVzZQorICAgIHRyYWNlYmFja3MgdG8gYmUgd3JpdHRlbiB0byBmaWxlcyB0aGVyZS4iIiIKKyAgICBzeXMuZXhjZXB0aG9vayA9IEhvb2soZGlzcGxheT1kaXNwbGF5LCBsb2dkaXI9bG9nZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0PWNvbnRleHQsIGZvcm1hdD1mb3JtYXQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NnaXRiLnB5YyBiL2xpYi9weXRob24yLjcvY2dpdGIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjY5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NnaXRiLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NnaXRiLnB5byBiL2xpYi9weXRob24yLjcvY2dpdGIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjY5MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NnaXRiLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NodW5rLnB5IGIvbGliL3B5dGhvbjIuNy9jaHVuay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZiYzEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jaHVuay5weQpAQCAtMCwwICsxLDE2NyBAQAorIiIiU2ltcGxlIGNsYXNzIHRvIHJlYWQgSUZGIGNodW5rcy4KKworQW4gSUZGIGNodW5rICh1c2VkIGluIGZvcm1hdHMgc3VjaCBhcyBBSUZGLCBUSUZGLCBSTUZGIChSZWFsTWVkaWEgRmlsZQorRm9ybWF0KSkgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgorCisrLS0tLS0tLS0tLS0tLS0tLSsKK3wgSUQgKDQgYnl0ZXMpICAgfAorKy0tLS0tLS0tLS0tLS0tLS0rCit8IHNpemUgKDQgYnl0ZXMpIHwKKystLS0tLS0tLS0tLS0tLS0tKworfCBkYXRhICAgICAgICAgICB8Cit8IC4uLiAgICAgICAgICAgIHwKKystLS0tLS0tLS0tLS0tLS0tKworCitUaGUgSUQgaXMgYSA0LWJ5dGUgc3RyaW5nIHdoaWNoIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgY2h1bmsuCisKK1RoZSBzaXplIGZpZWxkIChhIDMyLWJpdCB2YWx1ZSwgZW5jb2RlZCB1c2luZyBiaWctZW5kaWFuIGJ5dGUgb3JkZXIpCitnaXZlcyB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUgY2h1bmssIGluY2x1ZGluZyB0aGUgOC1ieXRlIGhlYWRlci4KKworVXN1YWxseSBhbiBJRkYtdHlwZSBmaWxlIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIGNodW5rcy4gIFRoZSBwcm9wb3NlZAordXNhZ2Ugb2YgdGhlIENodW5rIGNsYXNzIGRlZmluZWQgaGVyZSBpcyB0byBpbnN0YW50aWF0ZSBhbiBpbnN0YW5jZSBhdAordGhlIHN0YXJ0IG9mIGVhY2ggY2h1bmsgYW5kIHJlYWQgZnJvbSB0aGUgaW5zdGFuY2UgdW50aWwgaXQgcmVhY2hlcwordGhlIGVuZCwgYWZ0ZXIgd2hpY2ggYSBuZXcgaW5zdGFuY2UgY2FuIGJlIGluc3RhbnRpYXRlZC4gIEF0IHRoZSBlbmQKK29mIHRoZSBmaWxlLCBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSB3aWxsIGZhaWwgd2l0aCBhIEVPRkVycm9yCitleGNlcHRpb24uCisKK1VzYWdlOgord2hpbGUgVHJ1ZToKKyAgICB0cnk6CisgICAgICAgIGNodW5rID0gQ2h1bmsoZmlsZSkKKyAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgIGJyZWFrCisgICAgY2h1bmt0eXBlID0gY2h1bmsuZ2V0bmFtZSgpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgZGF0YSA9IGNodW5rLnJlYWQobmJ5dGVzKQorICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBkbyBzb21ldGhpbmcgd2l0aCBkYXRhCisKK1RoZSBpbnRlcmZhY2UgaXMgZmlsZS1saWtlLiAgVGhlIGltcGxlbWVudGVkIG1ldGhvZHMgYXJlOgorcmVhZCwgY2xvc2UsIHNlZWssIHRlbGwsIGlzYXR0eS4KK0V4dHJhIG1ldGhvZHMgYXJlOiBza2lwKCkgKGNhbGxlZCBieSBjbG9zZSwgc2tpcHMgdG8gdGhlIGVuZCBvZiB0aGUgY2h1bmspLAorZ2V0bmFtZSgpIChyZXR1cm5zIHRoZSBuYW1lIChJRCkgb2YgdGhlIGNodW5rKQorCitUaGUgX19pbml0X18gbWV0aG9kIGhhcyBvbmUgcmVxdWlyZWQgYXJndW1lbnQsIGEgZmlsZS1saWtlIG9iamVjdAorKGluY2x1ZGluZyBhIGNodW5rIGluc3RhbmNlKSwgYW5kIG9uZSBvcHRpb25hbCBhcmd1bWVudCwgYSBmbGFnIHdoaWNoCitzcGVjaWZpZXMgd2hldGhlciBvciBub3QgY2h1bmtzIGFyZSBhbGlnbmVkIG9uIDItYnl0ZSBib3VuZGFyaWVzLiAgVGhlCitkZWZhdWx0IGlzIDEsIGkuZS4gYWxpZ25lZC4KKyIiIgorCitjbGFzcyBDaHVuazoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgYWxpZ249VHJ1ZSwgYmlnZW5kaWFuPVRydWUsIGluY2xoZWFkZXI9RmFsc2UpOgorICAgICAgICBpbXBvcnQgc3RydWN0CisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5hbGlnbiA9IGFsaWduICAgICAgIyB3aGV0aGVyIHRvIGFsaWduIHRvIHdvcmQgKDItYnl0ZSkgYm91bmRhcmllcworICAgICAgICBpZiBiaWdlbmRpYW46CisgICAgICAgICAgICBzdHJmbGFnID0gJz4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHJmbGFnID0gJzwnCisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5jaHVua25hbWUgPSBmaWxlLnJlYWQoNCkKKyAgICAgICAgaWYgbGVuKHNlbGYuY2h1bmtuYW1lKSA8IDQ6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNodW5rc2l6ZSA9IHN0cnVjdC51bnBhY2soc3RyZmxhZysnTCcsIGZpbGUucmVhZCg0KSlbMF0KKyAgICAgICAgZXhjZXB0IHN0cnVjdC5lcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIGlmIGluY2xoZWFkZXI6CisgICAgICAgICAgICBzZWxmLmNodW5rc2l6ZSA9IHNlbGYuY2h1bmtzaXplIC0gOCAjIHN1YnRyYWN0IGhlYWRlcgorICAgICAgICBzZWxmLnNpemVfcmVhZCA9IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5vZmZzZXQgPSBzZWxmLmZpbGUudGVsbCgpCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5zZWVrYWJsZSA9IEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlZWthYmxlID0gVHJ1ZQorCisgICAgZGVmIGdldG5hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSAoSUQpIG9mIHRoZSBjdXJyZW50IGNodW5rLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5jaHVua25hbWUKKworICAgIGRlZiBnZXRzaXplKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgY2h1bmsuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmNodW5rc2l6ZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBzZWxmLnNraXAoKQorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcywgd2hlbmNlPTApOgorICAgICAgICAiIiJTZWVrIHRvIHNwZWNpZmllZCBwb3NpdGlvbiBpbnRvIHRoZSBjaHVuay4KKyAgICAgICAgRGVmYXVsdCBwb3NpdGlvbiBpcyAwIChzdGFydCBvZiBjaHVuaykuCisgICAgICAgIElmIHRoZSBmaWxlIGlzIG5vdCBzZWVrYWJsZSwgdGhpcyB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgaWYgbm90IHNlbGYuc2Vla2FibGU6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiY2Fubm90IHNlZWsiCisgICAgICAgIGlmIHdoZW5jZSA9PSAxOgorICAgICAgICAgICAgcG9zID0gcG9zICsgc2VsZi5zaXplX3JlYWQKKyAgICAgICAgZWxpZiB3aGVuY2UgPT0gMjoKKyAgICAgICAgICAgIHBvcyA9IHBvcyArIHNlbGYuY2h1bmtzaXplCisgICAgICAgIGlmIHBvcyA8IDAgb3IgcG9zID4gc2VsZi5jaHVua3NpemU6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgc2VsZi5maWxlLnNlZWsoc2VsZi5vZmZzZXQgKyBwb3MsIDApCisgICAgICAgIHNlbGYuc2l6ZV9yZWFkID0gcG9zCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2l6ZV9yZWFkCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKKyAgICAgICAgIiIiUmVhZCBhdCBtb3N0IHNpemUgYnl0ZXMgZnJvbSB0aGUgY2h1bmsuCisgICAgICAgIElmIHNpemUgaXMgb21pdHRlZCBvciBuZWdhdGl2ZSwgcmVhZCB1bnRpbCB0aGUgZW5kCisgICAgICAgIG9mIHRoZSBjaHVuay4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIKKyAgICAgICAgaWYgc2VsZi5zaXplX3JlYWQgPj0gc2VsZi5jaHVua3NpemU6CisgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICBzaXplID0gc2VsZi5jaHVua3NpemUgLSBzZWxmLnNpemVfcmVhZAorICAgICAgICBpZiBzaXplID4gc2VsZi5jaHVua3NpemUgLSBzZWxmLnNpemVfcmVhZDoKKyAgICAgICAgICAgIHNpemUgPSBzZWxmLmNodW5rc2l6ZSAtIHNlbGYuc2l6ZV9yZWFkCisgICAgICAgIGRhdGEgPSBzZWxmLmZpbGUucmVhZChzaXplKQorICAgICAgICBzZWxmLnNpemVfcmVhZCA9IHNlbGYuc2l6ZV9yZWFkICsgbGVuKGRhdGEpCisgICAgICAgIGlmIHNlbGYuc2l6ZV9yZWFkID09IHNlbGYuY2h1bmtzaXplIGFuZCBcCisgICAgICAgICAgIHNlbGYuYWxpZ24gYW5kIFwKKyAgICAgICAgICAgKHNlbGYuY2h1bmtzaXplICYgMSk6CisgICAgICAgICAgICBkdW1teSA9IHNlbGYuZmlsZS5yZWFkKDEpCisgICAgICAgICAgICBzZWxmLnNpemVfcmVhZCA9IHNlbGYuc2l6ZV9yZWFkICsgbGVuKGR1bW15KQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHNraXAoc2VsZik6CisgICAgICAgICIiIlNraXAgdGhlIHJlc3Qgb2YgdGhlIGNodW5rLgorICAgICAgICBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIHRoZSBjb250ZW50cyBvZiB0aGUgY2h1bmssCisgICAgICAgIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgc28gdGhhdCB0aGUgZmlsZSBwb2ludHMgdG8KKyAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGNodW5rLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIgorICAgICAgICBpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG4gPSBzZWxmLmNodW5rc2l6ZSAtIHNlbGYuc2l6ZV9yZWFkCisgICAgICAgICAgICAgICAgIyBtYXliZSBmaXggYWxpZ25tZW50CisgICAgICAgICAgICAgICAgaWYgc2VsZi5hbGlnbiBhbmQgKHNlbGYuY2h1bmtzaXplICYgMSk6CisgICAgICAgICAgICAgICAgICAgIG4gPSBuICsgMQorICAgICAgICAgICAgICAgIHNlbGYuZmlsZS5zZWVrKG4sIDEpCisgICAgICAgICAgICAgICAgc2VsZi5zaXplX3JlYWQgPSBzZWxmLnNpemVfcmVhZCArIG4KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2hpbGUgc2VsZi5zaXplX3JlYWQgPCBzZWxmLmNodW5rc2l6ZToKKyAgICAgICAgICAgIG4gPSBtaW4oODE5Miwgc2VsZi5jaHVua3NpemUgLSBzZWxmLnNpemVfcmVhZCkKKyAgICAgICAgICAgIGR1bW15ID0gc2VsZi5yZWFkKG4pCisgICAgICAgICAgICBpZiBub3QgZHVtbXk6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY2h1bmsucHljIGIvbGliL3B5dGhvbjIuNy9jaHVuay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiOTI4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2h1bmsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY2h1bmsucHlvIGIvbGliL3B5dGhvbjIuNy9jaHVuay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNiOTI4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY2h1bmsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY21kLnB5IGIvbGliL3B5dGhvbjIuNy9jbWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDViYTdlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY21kLnB5CkBAIC0wLDAgKzEsNDA0IEBACisiIiJBIGdlbmVyaWMgY2xhc3MgdG8gYnVpbGQgbGluZS1vcmllbnRlZCBjb21tYW5kIGludGVycHJldGVycy4KKworSW50ZXJwcmV0ZXJzIGNvbnN0cnVjdGVkIHdpdGggdGhpcyBjbGFzcyBvYmV5IHRoZSBmb2xsb3dpbmcgY29udmVudGlvbnM6CisKKzEuIEVuZCBvZiBmaWxlIG9uIGlucHV0IGlzIHByb2Nlc3NlZCBhcyB0aGUgY29tbWFuZCAnRU9GJy4KKzIuIEEgY29tbWFuZCBpcyBwYXJzZWQgb3V0IG9mIGVhY2ggbGluZSBieSBjb2xsZWN0aW5nIHRoZSBwcmVmaXggY29tcG9zZWQKKyAgIG9mIGNoYXJhY3RlcnMgaW4gdGhlIGlkZW50Y2hhcnMgbWVtYmVyLgorMy4gQSBjb21tYW5kIGBmb28nIGlzIGRpc3BhdGNoZWQgdG8gYSBtZXRob2QgJ2RvX2ZvbygpJzsgdGhlIGRvXyBtZXRob2QKKyAgIGlzIHBhc3NlZCBhIHNpbmdsZSBhcmd1bWVudCBjb25zaXN0aW5nIG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUuCis0LiBUeXBpbmcgYW4gZW1wdHkgbGluZSByZXBlYXRzIHRoZSBsYXN0IGNvbW1hbmQuICAoQWN0dWFsbHksIGl0IGNhbGxzIHRoZQorICAgbWV0aG9kIGBlbXB0eWxpbmUnLCB3aGljaCBtYXkgYmUgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzLikKKzUuIFRoZXJlIGlzIGEgcHJlZGVmaW5lZCBgaGVscCcgbWV0aG9kLiAgR2l2ZW4gYW4gYXJndW1lbnQgYHRvcGljJywgaXQKKyAgIGNhbGxzIHRoZSBjb21tYW5kIGBoZWxwX3RvcGljJy4gIFdpdGggbm8gYXJndW1lbnRzLCBpdCBsaXN0cyBhbGwgdG9waWNzCisgICB3aXRoIGRlZmluZWQgaGVscF8gZnVuY3Rpb25zLCBicm9rZW4gaW50byB1cCB0byB0aHJlZSB0b3BpY3M7IGRvY3VtZW50ZWQKKyAgIGNvbW1hbmRzLCBtaXNjZWxsYW5lb3VzIGhlbHAgdG9waWNzLCBhbmQgdW5kb2N1bWVudGVkIGNvbW1hbmRzLgorNi4gVGhlIGNvbW1hbmQgJz8nIGlzIGEgc3lub255bSBmb3IgYGhlbHAnLiAgVGhlIGNvbW1hbmQgJyEnIGlzIGEgc3lub255bQorICAgZm9yIGBzaGVsbCcsIGlmIGEgZG9fc2hlbGwgbWV0aG9kIGV4aXN0cy4KKzcuIElmIGNvbXBsZXRpb24gaXMgZW5hYmxlZCwgY29tcGxldGluZyBjb21tYW5kcyB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSwKKyAgIGFuZCBjb21wbGV0aW5nIG9mIGNvbW1hbmRzIGFyZ3MgaXMgZG9uZSBieSBjYWxsaW5nIGNvbXBsZXRlX2ZvbygpIHdpdGgKKyAgIGFyZ3VtZW50cyB0ZXh0LCBsaW5lLCBiZWdpZHgsIGVuZGlkeC4gIHRleHQgaXMgc3RyaW5nIHdlIGFyZSBtYXRjaGluZworICAgYWdhaW5zdCwgYWxsIHJldHVybmVkIG1hdGNoZXMgbXVzdCBiZWdpbiB3aXRoIGl0LiAgbGluZSBpcyB0aGUgY3VycmVudAorICAgaW5wdXQgbGluZSAobHN0cmlwcGVkKSwgYmVnaWR4IGFuZCBlbmRpZHggYXJlIHRoZSBiZWdpbm5pbmcgYW5kIGVuZAorICAgaW5kZXhlcyBvZiB0aGUgdGV4dCBiZWluZyBtYXRjaGVkLCB3aGljaCBjb3VsZCBiZSB1c2VkIHRvIHByb3ZpZGUKKyAgIGRpZmZlcmVudCBjb21wbGV0aW9uIGRlcGVuZGluZyB1cG9uIHdoaWNoIHBvc2l0aW9uIHRoZSBhcmd1bWVudCBpcyBpbi4KKworVGhlIGBkZWZhdWx0JyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gdG8gaW50ZXJjZXB0IGNvbW1hbmRzIGZvciB3aGljaCB0aGVyZQoraXMgbm8gZG9fIG1ldGhvZC4KKworVGhlIGBjb21wbGV0ZWRlZmF1bHQnIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBpbnRlcmNlcHQgY29tcGxldGlvbnMgZm9yCitjb21tYW5kcyB0aGF0IGhhdmUgbm8gY29tcGxldGVfIG1ldGhvZC4KKworVGhlIGRhdGEgbWVtYmVyIGBzZWxmLnJ1bGVyJyBzZXRzIHRoZSBjaGFyYWN0ZXIgdXNlZCB0byBkcmF3IHNlcGFyYXRvciBsaW5lcworaW4gdGhlIGhlbHAgbWVzc2FnZXMuICBJZiBlbXB0eSwgbm8gcnVsZXIgbGluZSBpcyBkcmF3bi4gIEl0IGRlZmF1bHRzIHRvICI9Ii4KKworSWYgdGhlIHZhbHVlIG9mIGBzZWxmLmludHJvJyBpcyBub25lbXB0eSB3aGVuIHRoZSBjbWRsb29wIG1ldGhvZCBpcyBjYWxsZWQsCitpdCBpcyBwcmludGVkIG91dCBvbiBpbnRlcnByZXRlciBzdGFydHVwLiAgVGhpcyB2YWx1ZSBtYXkgYmUgb3ZlcnJpZGRlbgordmlhIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHRoZSBjbWRsb29wKCkgbWV0aG9kLgorCitUaGUgZGF0YSBtZW1iZXJzIGBzZWxmLmRvY19oZWFkZXInLCBgc2VsZi5taXNjX2hlYWRlcicsIGFuZAorYHNlbGYudW5kb2NfaGVhZGVyJyBzZXQgdGhlIGhlYWRlcnMgdXNlZCBmb3IgdGhlIGhlbHAgZnVuY3Rpb24ncworbGlzdGluZ3Mgb2YgZG9jdW1lbnRlZCBmdW5jdGlvbnMsIG1pc2NlbGxhbmVvdXMgdG9waWNzLCBhbmQgdW5kb2N1bWVudGVkCitmdW5jdGlvbnMgcmVzcGVjdGl2ZWx5LgorCitUaGVzZSBpbnRlcnByZXRlcnMgdXNlIHJhd19pbnB1dDsgdGh1cywgaWYgdGhlIHJlYWRsaW5lIG1vZHVsZSBpcyBsb2FkZWQsCit0aGV5IGF1dG9tYXRpY2FsbHkgc3VwcG9ydCBFbWFjcy1saWtlIGNvbW1hbmQgaGlzdG9yeSBhbmQgZWRpdGluZyBmZWF0dXJlcy4KKyIiIgorCitpbXBvcnQgc3RyaW5nCisKK19fYWxsX18gPSBbIkNtZCJdCisKK1BST01QVCA9ICcoQ21kKSAnCitJREVOVENIQVJTID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgJ18nCisKK2NsYXNzIENtZDoKKyAgICAiIiJBIHNpbXBsZSBmcmFtZXdvcmsgZm9yIHdyaXRpbmcgbGluZS1vcmllbnRlZCBjb21tYW5kIGludGVycHJldGVycy4KKworICAgIFRoZXNlIGFyZSBvZnRlbiB1c2VmdWwgZm9yIHRlc3QgaGFybmVzc2VzLCBhZG1pbmlzdHJhdGl2ZSB0b29scywgYW5kCisgICAgcHJvdG90eXBlcyB0aGF0IHdpbGwgbGF0ZXIgYmUgd3JhcHBlZCBpbiBhIG1vcmUgc29waGlzdGljYXRlZCBpbnRlcmZhY2UuCisKKyAgICBBIENtZCBpbnN0YW5jZSBvciBzdWJjbGFzcyBpbnN0YW5jZSBpcyBhIGxpbmUtb3JpZW50ZWQgaW50ZXJwcmV0ZXIKKyAgICBmcmFtZXdvcmsuICBUaGVyZSBpcyBubyBnb29kIHJlYXNvbiB0byBpbnN0YW50aWF0ZSBDbWQgaXRzZWxmOyByYXRoZXIsCisgICAgaXQncyB1c2VmdWwgYXMgYSBzdXBlcmNsYXNzIG9mIGFuIGludGVycHJldGVyIGNsYXNzIHlvdSBkZWZpbmUgeW91cnNlbGYKKyAgICBpbiBvcmRlciB0byBpbmhlcml0IENtZCdzIG1ldGhvZHMgYW5kIGVuY2Fwc3VsYXRlIGFjdGlvbiBtZXRob2RzLgorCisgICAgIiIiCisgICAgcHJvbXB0ID0gUFJPTVBUCisgICAgaWRlbnRjaGFycyA9IElERU5UQ0hBUlMKKyAgICBydWxlciA9ICc9JworICAgIGxhc3RjbWQgPSAnJworICAgIGludHJvID0gTm9uZQorICAgIGRvY19sZWFkZXIgPSAiIgorICAgIGRvY19oZWFkZXIgPSAiRG9jdW1lbnRlZCBjb21tYW5kcyAodHlwZSBoZWxwIDx0b3BpYz4pOiIKKyAgICBtaXNjX2hlYWRlciA9ICJNaXNjZWxsYW5lb3VzIGhlbHAgdG9waWNzOiIKKyAgICB1bmRvY19oZWFkZXIgPSAiVW5kb2N1bWVudGVkIGNvbW1hbmRzOiIKKyAgICBub2hlbHAgPSAiKioqIE5vIGhlbHAgb24gJXMiCisgICAgdXNlX3Jhd2lucHV0ID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbXBsZXRla2V5PSd0YWInLCBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSk6CisgICAgICAgICIiIkluc3RhbnRpYXRlIGEgbGluZS1vcmllbnRlZCBpbnRlcnByZXRlciBmcmFtZXdvcmsuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICdjb21wbGV0ZWtleScgaXMgdGhlIHJlYWRsaW5lIG5hbWUgb2YgYQorICAgICAgICBjb21wbGV0aW9uIGtleTsgaXQgZGVmYXVsdHMgdG8gdGhlIFRhYiBrZXkuIElmIGNvbXBsZXRla2V5IGlzCisgICAgICAgIG5vdCBOb25lIGFuZCB0aGUgcmVhZGxpbmUgbW9kdWxlIGlzIGF2YWlsYWJsZSwgY29tbWFuZCBjb21wbGV0aW9uCisgICAgICAgIGlzIGRvbmUgYXV0b21hdGljYWxseS4gVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBzdGRpbiBhbmQgc3Rkb3V0CisgICAgICAgIHNwZWNpZnkgYWx0ZXJuYXRlIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBvYmplY3RzOyBpZiBub3Qgc3BlY2lmaWVkLAorICAgICAgICBzeXMuc3RkaW4gYW5kIHN5cy5zdGRvdXQgYXJlIHVzZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3RkaW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnN0ZGluID0gc3RkaW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgaWYgc3Rkb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zdGRvdXQgPSBzdGRvdXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLmNtZHF1ZXVlID0gW10KKyAgICAgICAgc2VsZi5jb21wbGV0ZWtleSA9IGNvbXBsZXRla2V5CisKKyAgICBkZWYgY21kbG9vcChzZWxmLCBpbnRybz1Ob25lKToKKyAgICAgICAgIiIiUmVwZWF0ZWRseSBpc3N1ZSBhIHByb21wdCwgYWNjZXB0IGlucHV0LCBwYXJzZSBhbiBpbml0aWFsIHByZWZpeAorICAgICAgICBvZmYgdGhlIHJlY2VpdmVkIGlucHV0LCBhbmQgZGlzcGF0Y2ggdG8gYWN0aW9uIG1ldGhvZHMsIHBhc3NpbmcgdGhlbQorICAgICAgICB0aGUgcmVtYWluZGVyIG9mIHRoZSBsaW5lIGFzIGFyZ3VtZW50LgorCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYucHJlbG9vcCgpCisgICAgICAgIGlmIHNlbGYudXNlX3Jhd2lucHV0IGFuZCBzZWxmLmNvbXBsZXRla2V5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCByZWFkbGluZQorICAgICAgICAgICAgICAgIHNlbGYub2xkX2NvbXBsZXRlciA9IHJlYWRsaW5lLmdldF9jb21wbGV0ZXIoKQorICAgICAgICAgICAgICAgIHJlYWRsaW5lLnNldF9jb21wbGV0ZXIoc2VsZi5jb21wbGV0ZSkKKyAgICAgICAgICAgICAgICByZWFkbGluZS5wYXJzZV9hbmRfYmluZChzZWxmLmNvbXBsZXRla2V5KyI6IGNvbXBsZXRlIikKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGludHJvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuaW50cm8gPSBpbnRybworICAgICAgICAgICAgaWYgc2VsZi5pbnRybzoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZShzdHIoc2VsZi5pbnRybykrIlxuIikKKyAgICAgICAgICAgIHN0b3AgPSBOb25lCisgICAgICAgICAgICB3aGlsZSBub3Qgc3RvcDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNtZHF1ZXVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5jbWRxdWV1ZS5wb3AoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnVzZV9yYXdpbnB1dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gcmF3X2lucHV0KHNlbGYucHJvbXB0KQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnRU9GJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoc2VsZi5wcm9tcHQpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5zdGRpbi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbGVuKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSAnRU9GJworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoJ1xyXG4nKQorICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnByZWNtZChsaW5lKQorICAgICAgICAgICAgICAgIHN0b3AgPSBzZWxmLm9uZWNtZChsaW5lKQorICAgICAgICAgICAgICAgIHN0b3AgPSBzZWxmLnBvc3RjbWQoc3RvcCwgbGluZSkKKyAgICAgICAgICAgIHNlbGYucG9zdGxvb3AoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgc2VsZi51c2VfcmF3aW5wdXQgYW5kIHNlbGYuY29tcGxldGVrZXk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcmVhZGxpbmUKKyAgICAgICAgICAgICAgICAgICAgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcihzZWxmLm9sZF9jb21wbGV0ZXIpCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKworICAgIGRlZiBwcmVjbWQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkhvb2sgbWV0aG9kIGV4ZWN1dGVkIGp1c3QgYmVmb3JlIHRoZSBjb21tYW5kIGxpbmUgaXMKKyAgICAgICAgaW50ZXJwcmV0ZWQsIGJ1dCBhZnRlciB0aGUgaW5wdXQgcHJvbXB0IGlzIGdlbmVyYXRlZCBhbmQgaXNzdWVkLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gbGluZQorCisgICAgZGVmIHBvc3RjbWQoc2VsZiwgc3RvcCwgbGluZSk6CisgICAgICAgICIiIkhvb2sgbWV0aG9kIGV4ZWN1dGVkIGp1c3QgYWZ0ZXIgYSBjb21tYW5kIGRpc3BhdGNoIGlzIGZpbmlzaGVkLiIiIgorICAgICAgICByZXR1cm4gc3RvcAorCisgICAgZGVmIHByZWxvb3Aoc2VsZik6CisgICAgICAgICIiIkhvb2sgbWV0aG9kIGV4ZWN1dGVkIG9uY2Ugd2hlbiB0aGUgY21kbG9vcCgpIG1ldGhvZCBpcyBjYWxsZWQuIiIiCisgICAgICAgIHBhc3MKKworICAgIGRlZiBwb3N0bG9vcChzZWxmKToKKyAgICAgICAgIiIiSG9vayBtZXRob2QgZXhlY3V0ZWQgb25jZSB3aGVuIHRoZSBjbWRsb29wKCkgbWV0aG9kIGlzIGFib3V0IHRvCisgICAgICAgIHJldHVybi4KKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHBhcnNlbGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiUGFyc2UgdGhlIGxpbmUgaW50byBhIGNvbW1hbmQgbmFtZSBhbmQgYSBzdHJpbmcgY29udGFpbmluZworICAgICAgICB0aGUgYXJndW1lbnRzLiAgUmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgKGNvbW1hbmQsIGFyZ3MsIGxpbmUpLgorICAgICAgICAnY29tbWFuZCcgYW5kICdhcmdzJyBtYXkgYmUgTm9uZSBpZiB0aGUgbGluZSBjb3VsZG4ndCBiZSBwYXJzZWQuCisgICAgICAgICIiIgorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIGxpbmUKKyAgICAgICAgZWxpZiBsaW5lWzBdID09ICc/JzoKKyAgICAgICAgICAgIGxpbmUgPSAnaGVscCAnICsgbGluZVsxOl0KKyAgICAgICAgZWxpZiBsaW5lWzBdID09ICchJzoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2RvX3NoZWxsJyk6CisgICAgICAgICAgICAgICAgbGluZSA9ICdzaGVsbCAnICsgbGluZVsxOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIGxpbmUKKyAgICAgICAgaSwgbiA9IDAsIGxlbihsaW5lKQorICAgICAgICB3aGlsZSBpIDwgbiBhbmQgbGluZVtpXSBpbiBzZWxmLmlkZW50Y2hhcnM6IGkgPSBpKzEKKyAgICAgICAgY21kLCBhcmcgPSBsaW5lWzppXSwgbGluZVtpOl0uc3RyaXAoKQorICAgICAgICByZXR1cm4gY21kLCBhcmcsIGxpbmUKKworICAgIGRlZiBvbmVjbWQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkludGVycHJldCB0aGUgYXJndW1lbnQgYXMgdGhvdWdoIGl0IGhhZCBiZWVuIHR5cGVkIGluIHJlc3BvbnNlCisgICAgICAgIHRvIHRoZSBwcm9tcHQuCisKKyAgICAgICAgVGhpcyBtYXkgYmUgb3ZlcnJpZGRlbiwgYnV0IHNob3VsZCBub3Qgbm9ybWFsbHkgbmVlZCB0byBiZTsKKyAgICAgICAgc2VlIHRoZSBwcmVjbWQoKSBhbmQgcG9zdGNtZCgpIG1ldGhvZHMgZm9yIHVzZWZ1bCBleGVjdXRpb24gaG9va3MuCisgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciBpbnRlcnByZXRhdGlvbiBvZgorICAgICAgICBjb21tYW5kcyBieSB0aGUgaW50ZXJwcmV0ZXIgc2hvdWxkIHN0b3AuCisKKyAgICAgICAgIiIiCisgICAgICAgIGNtZCwgYXJnLCBsaW5lID0gc2VsZi5wYXJzZWxpbmUobGluZSkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5lbXB0eWxpbmUoKQorICAgICAgICBpZiBjbWQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlZmF1bHQobGluZSkKKyAgICAgICAgc2VsZi5sYXN0Y21kID0gbGluZQorICAgICAgICBpZiBsaW5lID09ICdFT0YnIDoKKyAgICAgICAgICAgIHNlbGYubGFzdGNtZCA9ICcnCisgICAgICAgIGlmIGNtZCA9PSAnJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlZmF1bHQobGluZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihzZWxmLCAnZG9fJyArIGNtZCkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0KGxpbmUpCisgICAgICAgICAgICByZXR1cm4gZnVuYyhhcmcpCisKKyAgICBkZWYgZW1wdHlsaW5lKHNlbGYpOgorICAgICAgICAiIiJDYWxsZWQgd2hlbiBhbiBlbXB0eSBsaW5lIGlzIGVudGVyZWQgaW4gcmVzcG9uc2UgdG8gdGhlIHByb21wdC4KKworICAgICAgICBJZiB0aGlzIG1ldGhvZCBpcyBub3Qgb3ZlcnJpZGRlbiwgaXQgcmVwZWF0cyB0aGUgbGFzdCBub25lbXB0eQorICAgICAgICBjb21tYW5kIGVudGVyZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYubGFzdGNtZDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9uZWNtZChzZWxmLmxhc3RjbWQpCisKKyAgICBkZWYgZGVmYXVsdChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiQ2FsbGVkIG9uIGFuIGlucHV0IGxpbmUgd2hlbiB0aGUgY29tbWFuZCBwcmVmaXggaXMgbm90IHJlY29nbml6ZWQuCisKKyAgICAgICAgSWYgdGhpcyBtZXRob2QgaXMgbm90IG92ZXJyaWRkZW4sIGl0IHByaW50cyBhbiBlcnJvciBtZXNzYWdlIGFuZAorICAgICAgICByZXR1cm5zLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSgnKioqIFVua25vd24gc3ludGF4OiAlc1xuJyVsaW5lKQorCisgICAgZGVmIGNvbXBsZXRlZGVmYXVsdChzZWxmLCAqaWdub3JlZCk6CisgICAgICAgICIiIk1ldGhvZCBjYWxsZWQgdG8gY29tcGxldGUgYW4gaW5wdXQgbGluZSB3aGVuIG5vIGNvbW1hbmQtc3BlY2lmaWMKKyAgICAgICAgY29tcGxldGVfKigpIG1ldGhvZCBpcyBhdmFpbGFibGUuCisKKyAgICAgICAgQnkgZGVmYXVsdCwgaXQgcmV0dXJucyBhbiBlbXB0eSBsaXN0LgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBjb21wbGV0ZW5hbWVzKHNlbGYsIHRleHQsICppZ25vcmVkKToKKyAgICAgICAgZG90ZXh0ID0gJ2RvXycrdGV4dAorICAgICAgICByZXR1cm4gW2FbMzpdIGZvciBhIGluIHNlbGYuZ2V0X25hbWVzKCkgaWYgYS5zdGFydHN3aXRoKGRvdGV4dCldCisKKyAgICBkZWYgY29tcGxldGUoc2VsZiwgdGV4dCwgc3RhdGUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgcG9zc2libGUgY29tcGxldGlvbiBmb3IgJ3RleHQnLgorCisgICAgICAgIElmIGEgY29tbWFuZCBoYXMgbm90IGJlZW4gZW50ZXJlZCwgdGhlbiBjb21wbGV0ZSBhZ2FpbnN0IGNvbW1hbmQgbGlzdC4KKyAgICAgICAgT3RoZXJ3aXNlIHRyeSB0byBjYWxsIGNvbXBsZXRlXzxjb21tYW5kPiB0byBnZXQgbGlzdCBvZiBjb21wbGV0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHN0YXRlID09IDA6CisgICAgICAgICAgICBpbXBvcnQgcmVhZGxpbmUKKyAgICAgICAgICAgIG9yaWdsaW5lID0gcmVhZGxpbmUuZ2V0X2xpbmVfYnVmZmVyKCkKKyAgICAgICAgICAgIGxpbmUgPSBvcmlnbGluZS5sc3RyaXAoKQorICAgICAgICAgICAgc3RyaXBwZWQgPSBsZW4ob3JpZ2xpbmUpIC0gbGVuKGxpbmUpCisgICAgICAgICAgICBiZWdpZHggPSByZWFkbGluZS5nZXRfYmVnaWR4KCkgLSBzdHJpcHBlZAorICAgICAgICAgICAgZW5kaWR4ID0gcmVhZGxpbmUuZ2V0X2VuZGlkeCgpIC0gc3RyaXBwZWQKKyAgICAgICAgICAgIGlmIGJlZ2lkeD4wOgorICAgICAgICAgICAgICAgIGNtZCwgYXJncywgZm9vID0gc2VsZi5wYXJzZWxpbmUobGluZSkKKyAgICAgICAgICAgICAgICBpZiBjbWQgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgIGNvbXBmdW5jID0gc2VsZi5jb21wbGV0ZWRlZmF1bHQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wZnVuYyA9IGdldGF0dHIoc2VsZiwgJ2NvbXBsZXRlXycgKyBjbWQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBmdW5jID0gc2VsZi5jb21wbGV0ZWRlZmF1bHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tcGZ1bmMgPSBzZWxmLmNvbXBsZXRlbmFtZXMKKyAgICAgICAgICAgIHNlbGYuY29tcGxldGlvbl9tYXRjaGVzID0gY29tcGZ1bmModGV4dCwgbGluZSwgYmVnaWR4LCBlbmRpZHgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXBsZXRpb25fbWF0Y2hlc1tzdGF0ZV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldF9uYW1lcyhzZWxmKToKKyAgICAgICAgIyBUaGlzIG1ldGhvZCB1c2VkIHRvIHB1bGwgaW4gYmFzZSBjbGFzcyBhdHRyaWJ1dGVzCisgICAgICAgICMgYXQgYSB0aW1lIGRpcigpIGRpZG4ndCBkbyBpdCB5ZXQuCisgICAgICAgIHJldHVybiBkaXIoc2VsZi5fX2NsYXNzX18pCisKKyAgICBkZWYgY29tcGxldGVfaGVscChzZWxmLCAqYXJncyk6CisgICAgICAgIGNvbW1hbmRzID0gc2V0KHNlbGYuY29tcGxldGVuYW1lcygqYXJncykpCisgICAgICAgIHRvcGljcyA9IHNldChhWzU6XSBmb3IgYSBpbiBzZWxmLmdldF9uYW1lcygpCisgICAgICAgICAgICAgICAgICAgICBpZiBhLnN0YXJ0c3dpdGgoJ2hlbHBfJyArIGFyZ3NbMF0pKQorICAgICAgICByZXR1cm4gbGlzdChjb21tYW5kcyB8IHRvcGljcykKKworICAgIGRlZiBkb19oZWxwKHNlbGYsIGFyZyk6CisgICAgICAgICdMaXN0IGF2YWlsYWJsZSBjb21tYW5kcyB3aXRoICJoZWxwIiBvciBkZXRhaWxlZCBoZWxwIHdpdGggImhlbHAgY21kIi4nCisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgICMgWFhYIGNoZWNrIGFyZyBzeW50YXgKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihzZWxmLCAnaGVscF8nICsgYXJnKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZG9jPWdldGF0dHIoc2VsZiwgJ2RvXycgKyBhcmcpLl9fZG9jX18KKyAgICAgICAgICAgICAgICAgICAgaWYgZG9jOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoIiVzXG4iJXN0cihkb2MpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoIiVzXG4iJXN0cihzZWxmLm5vaGVscCAlIChhcmcsKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWVzID0gc2VsZi5nZXRfbmFtZXMoKQorICAgICAgICAgICAgY21kc19kb2MgPSBbXQorICAgICAgICAgICAgY21kc191bmRvYyA9IFtdCisgICAgICAgICAgICBoZWxwID0ge30KKyAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgICAgIGlmIG5hbWVbOjVdID09ICdoZWxwXyc6CisgICAgICAgICAgICAgICAgICAgIGhlbHBbbmFtZVs1Ol1dPTEKKyAgICAgICAgICAgIG5hbWVzLnNvcnQoKQorICAgICAgICAgICAgIyBUaGVyZSBjYW4gYmUgZHVwbGljYXRlcyBpZiByb3V0aW5lcyBvdmVycmlkZGVuCisgICAgICAgICAgICBwcmV2bmFtZSA9ICcnCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICBpZiBuYW1lWzozXSA9PSAnZG9fJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSBwcmV2bmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHByZXZuYW1lID0gbmFtZQorICAgICAgICAgICAgICAgICAgICBjbWQ9bmFtZVszOl0KKyAgICAgICAgICAgICAgICAgICAgaWYgY21kIGluIGhlbHA6CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2RvYy5hcHBlbmQoY21kKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGhlbHBbY21kXQorICAgICAgICAgICAgICAgICAgICBlbGlmIGdldGF0dHIoc2VsZiwgbmFtZSkuX19kb2NfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfZG9jLmFwcGVuZChjbWQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX3VuZG9jLmFwcGVuZChjbWQpCisgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSgiJXNcbiIlc3RyKHNlbGYuZG9jX2xlYWRlcikpCisgICAgICAgICAgICBzZWxmLnByaW50X3RvcGljcyhzZWxmLmRvY19oZWFkZXIsICAgY21kc19kb2MsICAgMTUsODApCisgICAgICAgICAgICBzZWxmLnByaW50X3RvcGljcyhzZWxmLm1pc2NfaGVhZGVyLCAgaGVscC5rZXlzKCksMTUsODApCisgICAgICAgICAgICBzZWxmLnByaW50X3RvcGljcyhzZWxmLnVuZG9jX2hlYWRlciwgY21kc191bmRvYywgMTUsODApCisKKyAgICBkZWYgcHJpbnRfdG9waWNzKHNlbGYsIGhlYWRlciwgY21kcywgY21kbGVuLCBtYXhjb2wpOgorICAgICAgICBpZiBjbWRzOgorICAgICAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoIiVzXG4iJXN0cihoZWFkZXIpKQorICAgICAgICAgICAgaWYgc2VsZi5ydWxlcjoKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSgiJXNcbiIlc3RyKHNlbGYucnVsZXIgKiBsZW4oaGVhZGVyKSkpCisgICAgICAgICAgICBzZWxmLmNvbHVtbml6ZShjbWRzLCBtYXhjb2wtMSkKKyAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKCJcbiIpCisKKyAgICBkZWYgY29sdW1uaXplKHNlbGYsIGxpc3QsIGRpc3BsYXl3aWR0aD04MCk6CisgICAgICAgICIiIkRpc3BsYXkgYSBsaXN0IG9mIHN0cmluZ3MgYXMgYSBjb21wYWN0IHNldCBvZiBjb2x1bW5zLgorCisgICAgICAgIEVhY2ggY29sdW1uIGlzIG9ubHkgYXMgd2lkZSBhcyBuZWNlc3NhcnkuCisgICAgICAgIENvbHVtbnMgYXJlIHNlcGFyYXRlZCBieSB0d28gc3BhY2VzIChvbmUgd2FzIG5vdCBsZWdpYmxlIGVub3VnaCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgbGlzdDoKKyAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKCI8ZW1wdHk+XG4iKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5vbnN0cmluZ3MgPSBbaSBmb3IgaSBpbiByYW5nZShsZW4obGlzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShsaXN0W2ldLCBzdHIpXQorICAgICAgICBpZiBub25zdHJpbmdzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAoImxpc3RbaV0gbm90IGEgc3RyaW5nIGZvciBpIGluICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCAiLmpvaW4obWFwKHN0ciwgbm9uc3RyaW5ncykpKQorICAgICAgICBzaXplID0gbGVuKGxpc3QpCisgICAgICAgIGlmIHNpemUgPT0gMToKKyAgICAgICAgICAgIHNlbGYuc3Rkb3V0LndyaXRlKCclc1xuJyVzdHIobGlzdFswXSkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBUcnkgZXZlcnkgcm93IGNvdW50IGZyb20gMSB1cHdhcmRzCisgICAgICAgIGZvciBucm93cyBpbiByYW5nZSgxLCBsZW4obGlzdCkpOgorICAgICAgICAgICAgbmNvbHMgPSAoc2l6ZStucm93cy0xKSAvLyBucm93cworICAgICAgICAgICAgY29sd2lkdGhzID0gW10KKyAgICAgICAgICAgIHRvdHdpZHRoID0gLTIKKyAgICAgICAgICAgIGZvciBjb2wgaW4gcmFuZ2UobmNvbHMpOgorICAgICAgICAgICAgICAgIGNvbHdpZHRoID0gMAorICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcmFuZ2UobnJvd3MpOgorICAgICAgICAgICAgICAgICAgICBpID0gcm93ICsgbnJvd3MqY29sCisgICAgICAgICAgICAgICAgICAgIGlmIGkgPj0gc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHggPSBsaXN0W2ldCisgICAgICAgICAgICAgICAgICAgIGNvbHdpZHRoID0gbWF4KGNvbHdpZHRoLCBsZW4oeCkpCisgICAgICAgICAgICAgICAgY29sd2lkdGhzLmFwcGVuZChjb2x3aWR0aCkKKyAgICAgICAgICAgICAgICB0b3R3aWR0aCArPSBjb2x3aWR0aCArIDIKKyAgICAgICAgICAgICAgICBpZiB0b3R3aWR0aCA+IGRpc3BsYXl3aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHRvdHdpZHRoIDw9IGRpc3BsYXl3aWR0aDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbnJvd3MgPSBsZW4obGlzdCkKKyAgICAgICAgICAgIG5jb2xzID0gMQorICAgICAgICAgICAgY29sd2lkdGhzID0gWzBdCisgICAgICAgIGZvciByb3cgaW4gcmFuZ2UobnJvd3MpOgorICAgICAgICAgICAgdGV4dHMgPSBbXQorICAgICAgICAgICAgZm9yIGNvbCBpbiByYW5nZShuY29scyk6CisgICAgICAgICAgICAgICAgaSA9IHJvdyArIG5yb3dzKmNvbAorICAgICAgICAgICAgICAgIGlmIGkgPj0gc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgeCA9ICIiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxpc3RbaV0KKyAgICAgICAgICAgICAgICB0ZXh0cy5hcHBlbmQoeCkKKyAgICAgICAgICAgIHdoaWxlIHRleHRzIGFuZCBub3QgdGV4dHNbLTFdOgorICAgICAgICAgICAgICAgIGRlbCB0ZXh0c1stMV0KKyAgICAgICAgICAgIGZvciBjb2wgaW4gcmFuZ2UobGVuKHRleHRzKSk6CisgICAgICAgICAgICAgICAgdGV4dHNbY29sXSA9IHRleHRzW2NvbF0ubGp1c3QoY29sd2lkdGhzW2NvbF0pCisgICAgICAgICAgICBzZWxmLnN0ZG91dC53cml0ZSgiJXNcbiIlc3RyKCIgICIuam9pbih0ZXh0cykpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jbWQucHljIGIvbGliL3B5dGhvbjIuNy9jbWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTk2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NtZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jbWQucHlvIGIvbGliL3B5dGhvbjIuNy9jbWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTk2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NtZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2RlLnB5IGIvbGliL3B5dGhvbjIuNy9jb2RlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzlkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvZGUucHkKQEAgLTAsMCArMSwzMTAgQEAKKyIiIlV0aWxpdGllcyBuZWVkZWQgdG8gZW11bGF0ZSBQeXRob24ncyBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlci4KKworIiIiCisKKyMgSW5zcGlyZWQgYnkgc2ltaWxhciBjb2RlIGJ5IEplZmYgRXBsZXIgYW5kIEZyZWRyaWsgTHVuZGguCisKKworaW1wb3J0IHN5cworaW1wb3J0IHRyYWNlYmFjaworZnJvbSBjb2Rlb3AgaW1wb3J0IENvbW1hbmRDb21waWxlciwgY29tcGlsZV9jb21tYW5kCisKK19fYWxsX18gPSBbIkludGVyYWN0aXZlSW50ZXJwcmV0ZXIiLCAiSW50ZXJhY3RpdmVDb25zb2xlIiwgImludGVyYWN0IiwKKyAgICAgICAgICAgImNvbXBpbGVfY29tbWFuZCJdCisKK2RlZiBzb2Z0c3BhY2UoZmlsZSwgbmV3dmFsdWUpOgorICAgIG9sZHZhbHVlID0gMAorICAgIHRyeToKKyAgICAgICAgb2xkdmFsdWUgPSBmaWxlLnNvZnRzcGFjZQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHRyeToKKyAgICAgICAgZmlsZS5zb2Z0c3BhY2UgPSBuZXd2YWx1ZQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICMgImF0dHJpYnV0ZS1sZXNzIG9iamVjdCIgb3IgInJlYWQtb25seSBhdHRyaWJ1dGVzIgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIG9sZHZhbHVlCisKK2NsYXNzIEludGVyYWN0aXZlSW50ZXJwcmV0ZXI6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgSW50ZXJhY3RpdmVDb25zb2xlLgorCisgICAgVGhpcyBjbGFzcyBkZWFscyB3aXRoIHBhcnNpbmcgYW5kIGludGVycHJldGVyIHN0YXRlICh0aGUgdXNlcidzCisgICAgbmFtZXNwYWNlKTsgaXQgZG9lc24ndCBkZWFsIHdpdGggaW5wdXQgYnVmZmVyaW5nIG9yIHByb21wdGluZyBvcgorICAgIGlucHV0IGZpbGUgbmFtaW5nICh0aGUgZmlsZW5hbWUgaXMgYWx3YXlzIHBhc3NlZCBpbiBleHBsaWNpdGx5KS4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2Fscz1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsICdsb2NhbHMnIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgZGljdGlvbmFyeSBpbgorICAgICAgICB3aGljaCBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQ7IGl0IGRlZmF1bHRzIHRvIGEgbmV3bHkgY3JlYXRlZAorICAgICAgICBkaWN0aW9uYXJ5IHdpdGgga2V5ICJfX25hbWVfXyIgc2V0IHRvICJfX2NvbnNvbGVfXyIgYW5kIGtleQorICAgICAgICAiX19kb2NfXyIgc2V0IHRvIE5vbmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxvY2FscyBpcyBOb25lOgorICAgICAgICAgICAgbG9jYWxzID0geyJfX25hbWVfXyI6ICJfX2NvbnNvbGVfXyIsICJfX2RvY19fIjogTm9uZX0KKyAgICAgICAgc2VsZi5sb2NhbHMgPSBsb2NhbHMKKyAgICAgICAgc2VsZi5jb21waWxlID0gQ29tbWFuZENvbXBpbGVyKCkKKworICAgIGRlZiBydW5zb3VyY2Uoc2VsZiwgc291cmNlLCBmaWxlbmFtZT0iPGlucHV0PiIsIHN5bWJvbD0ic2luZ2xlIik6CisgICAgICAgICIiIkNvbXBpbGUgYW5kIHJ1biBzb21lIHNvdXJjZSBpbiB0aGUgaW50ZXJwcmV0ZXIuCisKKyAgICAgICAgQXJndW1lbnRzIGFyZSBhcyBmb3IgY29tcGlsZV9jb21tYW5kKCkuCisKKyAgICAgICAgT25lIHNldmVyYWwgdGhpbmdzIGNhbiBoYXBwZW46CisKKyAgICAgICAgMSkgVGhlIGlucHV0IGlzIGluY29ycmVjdDsgY29tcGlsZV9jb21tYW5kKCkgcmFpc2VkIGFuCisgICAgICAgIGV4Y2VwdGlvbiAoU3ludGF4RXJyb3Igb3IgT3ZlcmZsb3dFcnJvcikuICBBIHN5bnRheCB0cmFjZWJhY2sKKyAgICAgICAgd2lsbCBiZSBwcmludGVkIGJ5IGNhbGxpbmcgdGhlIHNob3dzeW50YXhlcnJvcigpIG1ldGhvZC4KKworICAgICAgICAyKSBUaGUgaW5wdXQgaXMgaW5jb21wbGV0ZSwgYW5kIG1vcmUgaW5wdXQgaXMgcmVxdWlyZWQ7CisgICAgICAgIGNvbXBpbGVfY29tbWFuZCgpIHJldHVybmVkIE5vbmUuICBOb3RoaW5nIGhhcHBlbnMuCisKKyAgICAgICAgMykgVGhlIGlucHV0IGlzIGNvbXBsZXRlOyBjb21waWxlX2NvbW1hbmQoKSByZXR1cm5lZCBhIGNvZGUKKyAgICAgICAgb2JqZWN0LiAgVGhlIGNvZGUgaXMgZXhlY3V0ZWQgYnkgY2FsbGluZyBzZWxmLnJ1bmNvZGUoKSAod2hpY2gKKyAgICAgICAgYWxzbyBoYW5kbGVzIHJ1bi10aW1lIGV4Y2VwdGlvbnMsIGV4Y2VwdCBmb3IgU3lzdGVtRXhpdCkuCisKKyAgICAgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBUcnVlIGluIGNhc2UgMiwgRmFsc2UgaW4gdGhlIG90aGVyIGNhc2VzICh1bmxlc3MKKyAgICAgICAgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCkuICBUaGUgcmV0dXJuIHZhbHVlIGNhbiBiZSB1c2VkIHRvCisgICAgICAgIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSBzeXMucHMxIG9yIHN5cy5wczIgdG8gcHJvbXB0IHRoZSBuZXh0CisgICAgICAgIGxpbmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvZGUgPSBzZWxmLmNvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgc3ltYm9sKQorICAgICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFN5bnRheEVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICMgQ2FzZSAxCisgICAgICAgICAgICBzZWxmLnNob3dzeW50YXhlcnJvcihmaWxlbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIGlmIGNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICMgQ2FzZSAyCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICMgQ2FzZSAzCisgICAgICAgIHNlbGYucnVuY29kZShjb2RlKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBydW5jb2RlKHNlbGYsIGNvZGUpOgorICAgICAgICAiIiJFeGVjdXRlIGEgY29kZSBvYmplY3QuCisKKyAgICAgICAgV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzLCBzZWxmLnNob3d0cmFjZWJhY2soKSBpcyBjYWxsZWQgdG8KKyAgICAgICAgZGlzcGxheSBhIHRyYWNlYmFjay4gIEFsbCBleGNlcHRpb25zIGFyZSBjYXVnaHQgZXhjZXB0CisgICAgICAgIFN5c3RlbUV4aXQsIHdoaWNoIGlzIHJlcmFpc2VkLgorCisgICAgICAgIEEgbm90ZSBhYm91dCBLZXlib2FyZEludGVycnVwdDogdGhpcyBleGNlcHRpb24gbWF5IG9jY3VyCisgICAgICAgIGVsc2V3aGVyZSBpbiB0aGlzIGNvZGUsIGFuZCBtYXkgbm90IGFsd2F5cyBiZSBjYXVnaHQuICBUaGUKKyAgICAgICAgY2FsbGVyIHNob3VsZCBiZSBwcmVwYXJlZCB0byBkZWFsIHdpdGggaXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBzZWxmLmxvY2FscworICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuc2hvd3RyYWNlYmFjaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzb2Z0c3BhY2Uoc3lzLnN0ZG91dCwgMCk6CisgICAgICAgICAgICAgICAgcHJpbnQKKworICAgIGRlZiBzaG93c3ludGF4ZXJyb3Ioc2VsZiwgZmlsZW5hbWU9Tm9uZSk6CisgICAgICAgICIiIkRpc3BsYXkgdGhlIHN5bnRheCBlcnJvciB0aGF0IGp1c3Qgb2NjdXJyZWQuCisKKyAgICAgICAgVGhpcyBkb2Vzbid0IGRpc3BsYXkgYSBzdGFjayB0cmFjZSBiZWNhdXNlIHRoZXJlIGlzbid0IG9uZS4KKworICAgICAgICBJZiBhIGZpbGVuYW1lIGlzIGdpdmVuLCBpdCBpcyBzdHVmZmVkIGluIHRoZSBleGNlcHRpb24gaW5zdGVhZAorICAgICAgICBvZiB3aGF0IHdhcyB0aGVyZSBiZWZvcmUgKGJlY2F1c2UgUHl0aG9uJ3MgcGFyc2VyIGFsd2F5cyB1c2VzCisgICAgICAgICI8c3RyaW5nPiIgd2hlbiByZWFkaW5nIGZyb20gYSBzdHJpbmcpLgorCisgICAgICAgIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiBieSBzZWxmLndyaXRlKCksIGJlbG93LgorCisgICAgICAgICIiIgorICAgICAgICB0eXBlLCB2YWx1ZSwgc3lzLmxhc3RfdHJhY2ViYWNrID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgc3lzLmxhc3RfdHlwZSA9IHR5cGUKKyAgICAgICAgc3lzLmxhc3RfdmFsdWUgPSB2YWx1ZQorICAgICAgICBpZiBmaWxlbmFtZSBhbmQgdHlwZSBpcyBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgICMgV29yayBoYXJkIHRvIHN0dWZmIHRoZSBjb3JyZWN0IGZpbGVuYW1lIGluIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtc2csIChkdW1teV9maWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpID0gdmFsdWUKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIE5vdCB0aGUgZm9ybWF0IHdlIGV4cGVjdDsgbGVhdmUgaXQgYWxvbmUKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgU3R1ZmYgaW4gdGhlIHJpZ2h0IGZpbGVuYW1lCisgICAgICAgICAgICAgICAgdmFsdWUgPSBTeW50YXhFcnJvcihtc2csIChmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpKQorICAgICAgICAgICAgICAgIHN5cy5sYXN0X3ZhbHVlID0gdmFsdWUKKyAgICAgICAgbGlzdCA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkodHlwZSwgdmFsdWUpCisgICAgICAgIG1hcChzZWxmLndyaXRlLCBsaXN0KQorCisgICAgZGVmIHNob3d0cmFjZWJhY2soc2VsZik6CisgICAgICAgICIiIkRpc3BsYXkgdGhlIGV4Y2VwdGlvbiB0aGF0IGp1c3Qgb2NjdXJyZWQuCisKKyAgICAgICAgV2UgcmVtb3ZlIHRoZSBmaXJzdCBzdGFjayBpdGVtIGJlY2F1c2UgaXQgaXMgb3VyIG93biBjb2RlLgorCisgICAgICAgIFRoZSBvdXRwdXQgaXMgd3JpdHRlbiBieSBzZWxmLndyaXRlKCksIGJlbG93LgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0eXBlLCB2YWx1ZSwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgc3lzLmxhc3RfdHlwZSA9IHR5cGUKKyAgICAgICAgICAgIHN5cy5sYXN0X3ZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIHN5cy5sYXN0X3RyYWNlYmFjayA9IHRiCisgICAgICAgICAgICB0Ymxpc3QgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YikKKyAgICAgICAgICAgIGRlbCB0Ymxpc3RbOjFdCisgICAgICAgICAgICBsaXN0ID0gdHJhY2ViYWNrLmZvcm1hdF9saXN0KHRibGlzdCkKKyAgICAgICAgICAgIGlmIGxpc3Q6CisgICAgICAgICAgICAgICAgbGlzdC5pbnNlcnQoMCwgIlRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiIpCisgICAgICAgICAgICBsaXN0W2xlbihsaXN0KTpdID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSh0eXBlLCB2YWx1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRibGlzdCA9IHRiID0gTm9uZQorICAgICAgICBtYXAoc2VsZi53cml0ZSwgbGlzdCkKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiV3JpdGUgYSBzdHJpbmcuCisKKyAgICAgICAgVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gd3JpdGVzIHRvIHN5cy5zdGRlcnI7IGEgc3ViY2xhc3MgbWF5CisgICAgICAgIHJlcGxhY2UgdGhpcyB3aXRoIGEgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGRhdGEpCisKKworY2xhc3MgSW50ZXJhY3RpdmVDb25zb2xlKEludGVyYWN0aXZlSW50ZXJwcmV0ZXIpOgorICAgICIiIkNsb3NlbHkgZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGludGVyYWN0aXZlIFB5dGhvbiBpbnRlcnByZXRlci4KKworICAgIFRoaXMgY2xhc3MgYnVpbGRzIG9uIEludGVyYWN0aXZlSW50ZXJwcmV0ZXIgYW5kIGFkZHMgcHJvbXB0aW5nCisgICAgdXNpbmcgdGhlIGZhbWlsaWFyIHN5cy5wczEgYW5kIHN5cy5wczIsIGFuZCBpbnB1dCBidWZmZXJpbmcuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2NhbHM9Tm9uZSwgZmlsZW5hbWU9Ijxjb25zb2xlPiIpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4KKworICAgICAgICBUaGUgb3B0aW9uYWwgbG9jYWxzIGFyZ3VtZW50IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQorICAgICAgICBJbnRlcmFjdGl2ZUludGVycHJldGVyIGJhc2UgY2xhc3MuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGZpbGVuYW1lIGFyZ3VtZW50IHNob3VsZCBzcGVjaWZ5IHRoZSAoZmlsZSluYW1lCisgICAgICAgIG9mIHRoZSBpbnB1dCBzdHJlYW07IGl0IHdpbGwgc2hvdyB1cCBpbiB0cmFjZWJhY2tzLgorCisgICAgICAgICIiIgorICAgICAgICBJbnRlcmFjdGl2ZUludGVycHJldGVyLl9faW5pdF9fKHNlbGYsIGxvY2FscykKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYucmVzZXRidWZmZXIoKQorCisgICAgZGVmIHJlc2V0YnVmZmVyKHNlbGYpOgorICAgICAgICAiIiJSZXNldCB0aGUgaW5wdXQgYnVmZmVyLiIiIgorICAgICAgICBzZWxmLmJ1ZmZlciA9IFtdCisKKyAgICBkZWYgaW50ZXJhY3Qoc2VsZiwgYmFubmVyPU5vbmUpOgorICAgICAgICAiIiJDbG9zZWx5IGVtdWxhdGUgdGhlIGludGVyYWN0aXZlIFB5dGhvbiBjb25zb2xlLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBiYW5uZXIgYXJndW1lbnQgc3BlY2lmeSB0aGUgYmFubmVyIHRvIHByaW50CisgICAgICAgIGJlZm9yZSB0aGUgZmlyc3QgaW50ZXJhY3Rpb247IGJ5IGRlZmF1bHQgaXQgcHJpbnRzIGEgYmFubmVyCisgICAgICAgIHNpbWlsYXIgdG8gdGhlIG9uZSBwcmludGVkIGJ5IHRoZSByZWFsIFB5dGhvbiBpbnRlcnByZXRlciwKKyAgICAgICAgZm9sbG93ZWQgYnkgdGhlIGN1cnJlbnQgY2xhc3MgbmFtZSBpbiBwYXJlbnRoZXNlcyAoc28gYXMgbm90CisgICAgICAgIHRvIGNvbmZ1c2UgdGhpcyB3aXRoIHRoZSByZWFsIGludGVycHJldGVyIC0tIHNpbmNlIGl0J3Mgc28KKyAgICAgICAgY2xvc2UhKS4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnBzMQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzeXMucHMxID0gIj4+PiAiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5wczIKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc3lzLnBzMiA9ICIuLi4gIgorICAgICAgICBjcHJ0ID0gJ1R5cGUgImhlbHAiLCAiY29weXJpZ2h0IiwgImNyZWRpdHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4nCisgICAgICAgIGlmIGJhbm5lciBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiUHl0aG9uICVzIG9uICVzXG4lc1xuKCVzKVxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgIChzeXMudmVyc2lvbiwgc3lzLnBsYXRmb3JtLCBjcHJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18uX19uYW1lX18pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZSgiJXNcbiIgJSBzdHIoYmFubmVyKSkKKyAgICAgICAgbW9yZSA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBtb3JlOgorICAgICAgICAgICAgICAgICAgICBwcm9tcHQgPSBzeXMucHMyCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJvbXB0ID0gc3lzLnBzMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYucmF3X2lucHV0KHByb21wdCkKKyAgICAgICAgICAgICAgICAgICAgIyBDYW4gYmUgTm9uZSBpZiBzeXMuc3RkaW4gd2FzIHJlZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyA9IGdldGF0dHIoc3lzLnN0ZGluLCAiZW5jb2RpbmciLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyBhbmQgbm90IGlzaW5zdGFuY2UobGluZSwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCJcbiIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9yZSA9IHNlbGYucHVzaChsaW5lKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIlxuS2V5Ym9hcmRJbnRlcnJ1cHRcbiIpCisgICAgICAgICAgICAgICAgc2VsZi5yZXNldGJ1ZmZlcigpCisgICAgICAgICAgICAgICAgbW9yZSA9IDAKKworICAgIGRlZiBwdXNoKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJQdXNoIGEgbGluZSB0byB0aGUgaW50ZXJwcmV0ZXIuCisKKyAgICAgICAgVGhlIGxpbmUgc2hvdWxkIG5vdCBoYXZlIGEgdHJhaWxpbmcgbmV3bGluZTsgaXQgbWF5IGhhdmUKKyAgICAgICAgaW50ZXJuYWwgbmV3bGluZXMuICBUaGUgbGluZSBpcyBhcHBlbmRlZCB0byBhIGJ1ZmZlciBhbmQgdGhlCisgICAgICAgIGludGVycHJldGVyJ3MgcnVuc291cmNlKCkgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIHRoZQorICAgICAgICBjb25jYXRlbmF0ZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlciBhcyBzb3VyY2UuICBJZiB0aGlzCisgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBjb21tYW5kIHdhcyBleGVjdXRlZCBvciBpbnZhbGlkLCB0aGUgYnVmZmVyCisgICAgICAgIGlzIHJlc2V0OyBvdGhlcndpc2UsIHRoZSBjb21tYW5kIGlzIGluY29tcGxldGUsIGFuZCB0aGUgYnVmZmVyCisgICAgICAgIGlzIGxlZnQgYXMgaXQgd2FzIGFmdGVyIHRoZSBsaW5lIHdhcyBhcHBlbmRlZC4gIFRoZSByZXR1cm4KKyAgICAgICAgdmFsdWUgaXMgMSBpZiBtb3JlIGlucHV0IGlzIHJlcXVpcmVkLCAwIGlmIHRoZSBsaW5lIHdhcyBkZWFsdAorICAgICAgICB3aXRoIGluIHNvbWUgd2F5ICh0aGlzIGlzIHRoZSBzYW1lIGFzIHJ1bnNvdXJjZSgpKS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5idWZmZXIuYXBwZW5kKGxpbmUpCisgICAgICAgIHNvdXJjZSA9ICJcbiIuam9pbihzZWxmLmJ1ZmZlcikKKyAgICAgICAgbW9yZSA9IHNlbGYucnVuc291cmNlKHNvdXJjZSwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgaWYgbm90IG1vcmU6CisgICAgICAgICAgICBzZWxmLnJlc2V0YnVmZmVyKCkKKyAgICAgICAgcmV0dXJuIG1vcmUKKworICAgIGRlZiByYXdfaW5wdXQoc2VsZiwgcHJvbXB0PSIiKToKKyAgICAgICAgIiIiV3JpdGUgYSBwcm9tcHQgYW5kIHJlYWQgYSBsaW5lLgorCisgICAgICAgIFRoZSByZXR1cm5lZCBsaW5lIGRvZXMgbm90IGluY2x1ZGUgdGhlIHRyYWlsaW5nIG5ld2xpbmUuCisgICAgICAgIFdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSBFT0Yga2V5IHNlcXVlbmNlLCBFT0ZFcnJvciBpcyByYWlzZWQuCisKKyAgICAgICAgVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgYnVpbHQtaW4gZnVuY3Rpb24KKyAgICAgICAgcmF3X2lucHV0KCk7IGEgc3ViY2xhc3MgbWF5IHJlcGxhY2UgdGhpcyB3aXRoIGEgZGlmZmVyZW50CisgICAgICAgIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gcmF3X2lucHV0KHByb21wdCkKKworCitkZWYgaW50ZXJhY3QoYmFubmVyPU5vbmUsIHJlYWRmdW5jPU5vbmUsIGxvY2FsPU5vbmUpOgorICAgICIiIkNsb3NlbHkgZW11bGF0ZSB0aGUgaW50ZXJhY3RpdmUgUHl0aG9uIGludGVycHJldGVyLgorCisgICAgVGhpcyBpcyBhIGJhY2t3YXJkcyBjb21wYXRpYmxlIGludGVyZmFjZSB0byB0aGUgSW50ZXJhY3RpdmVDb25zb2xlCisgICAgY2xhc3MuICBXaGVuIHJlYWRmdW5jIGlzIG5vdCBzcGVjaWZpZWQsIGl0IGF0dGVtcHRzIHRvIGltcG9ydCB0aGUKKyAgICByZWFkbGluZSBtb2R1bGUgdG8gZW5hYmxlIEdOVSByZWFkbGluZSBpZiBpdCBpcyBhdmFpbGFibGUuCisKKyAgICBBcmd1bWVudHMgKGFsbCBvcHRpb25hbCwgYWxsIGRlZmF1bHQgdG8gTm9uZSk6CisKKyAgICBiYW5uZXIgLS0gcGFzc2VkIHRvIEludGVyYWN0aXZlQ29uc29sZS5pbnRlcmFjdCgpCisgICAgcmVhZGZ1bmMgLS0gaWYgbm90IE5vbmUsIHJlcGxhY2VzIEludGVyYWN0aXZlQ29uc29sZS5yYXdfaW5wdXQoKQorICAgIGxvY2FsIC0tIHBhc3NlZCB0byBJbnRlcmFjdGl2ZUludGVycHJldGVyLl9faW5pdF9fKCkKKworICAgICIiIgorICAgIGNvbnNvbGUgPSBJbnRlcmFjdGl2ZUNvbnNvbGUobG9jYWwpCisgICAgaWYgcmVhZGZ1bmMgaXMgbm90IE5vbmU6CisgICAgICAgIGNvbnNvbGUucmF3X2lucHV0ID0gcmVhZGZ1bmMKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgcmVhZGxpbmUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIGNvbnNvbGUuaW50ZXJhY3QoYmFubmVyKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW50ZXJhY3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2RlLnB5YyBiL2xpYi9weXRob24yLjcvY29kZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MzllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2RlLnB5byBiL2xpYi9weXRob24yLjcvY29kZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5MzllZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2RlY3MucHkgYi9saWIvcHl0aG9uMi43L2NvZGVjcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNkNjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2RlY3MucHkKQEAgLTAsMCArMSwxMDk4IEBACisiIiIgY29kZWNzIC0tIFB5dGhvbiBDb2RlYyBSZWdpc3RyeSwgQVBJIGFuZCBoZWxwZXJzLgorCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIjIgorCitpbXBvcnQgX19idWlsdGluX18sIHN5cworCisjIyMgUmVnaXN0cnkgYW5kIGJ1aWx0aW4gc3RhdGVsZXNzIGNvZGVjIGZ1bmN0aW9ucworCit0cnk6CisgICAgZnJvbSBfY29kZWNzIGltcG9ydCAqCitleGNlcHQgSW1wb3J0RXJyb3IsIHdoeToKKyAgICByYWlzZSBTeXN0ZW1FcnJvcignRmFpbGVkIHRvIGxvYWQgdGhlIGJ1aWx0aW4gY29kZWNzOiAlcycgJSB3aHkpCisKK19fYWxsX18gPSBbInJlZ2lzdGVyIiwgImxvb2t1cCIsICJvcGVuIiwgIkVuY29kZWRGaWxlIiwgIkJPTSIsICJCT01fQkUiLAorICAgICAgICAgICAiQk9NX0xFIiwgIkJPTTMyX0JFIiwgIkJPTTMyX0xFIiwgIkJPTTY0X0JFIiwgIkJPTTY0X0xFIiwKKyAgICAgICAgICAgIkJPTV9VVEY4IiwgIkJPTV9VVEYxNiIsICJCT01fVVRGMTZfTEUiLCAiQk9NX1VURjE2X0JFIiwKKyAgICAgICAgICAgIkJPTV9VVEYzMiIsICJCT01fVVRGMzJfTEUiLCAiQk9NX1VURjMyX0JFIiwKKyAgICAgICAgICAgInN0cmljdF9lcnJvcnMiLCAiaWdub3JlX2Vycm9ycyIsICJyZXBsYWNlX2Vycm9ycyIsCisgICAgICAgICAgICJ4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMiLAorICAgICAgICAgICAicmVnaXN0ZXJfZXJyb3IiLCAibG9va3VwX2Vycm9yIl0KKworIyMjIENvbnN0YW50cworCisjCisjIEJ5dGUgT3JkZXIgTWFyayAoQk9NID0gWkVSTyBXSURUSCBOTy1CUkVBSyBTUEFDRSA9IFUrRkVGRikKKyMgYW5kIGl0cyBwb3NzaWJsZSBieXRlIHN0cmluZyB2YWx1ZXMKKyMgZm9yIFVURjgvVVRGMTYvVVRGMzIgb3V0cHV0IGFuZCBsaXR0bGUvYmlnIGVuZGlhbiBtYWNoaW5lcworIworCisjIFVURi04CitCT01fVVRGOCA9ICdceGVmXHhiYlx4YmYnCisKKyMgVVRGLTE2LCBsaXR0bGUgZW5kaWFuCitCT01fTEUgPSBCT01fVVRGMTZfTEUgPSAnXHhmZlx4ZmUnCisKKyMgVVRGLTE2LCBiaWcgZW5kaWFuCitCT01fQkUgPSBCT01fVVRGMTZfQkUgPSAnXHhmZVx4ZmYnCisKKyMgVVRGLTMyLCBsaXR0bGUgZW5kaWFuCitCT01fVVRGMzJfTEUgPSAnXHhmZlx4ZmVceDAwXHgwMCcKKworIyBVVEYtMzIsIGJpZyBlbmRpYW4KK0JPTV9VVEYzMl9CRSA9ICdceDAwXHgwMFx4ZmVceGZmJworCitpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorCisgICAgIyBVVEYtMTYsIG5hdGl2ZSBlbmRpYW5uZXNzCisgICAgQk9NID0gQk9NX1VURjE2ID0gQk9NX1VURjE2X0xFCisKKyAgICAjIFVURi0zMiwgbmF0aXZlIGVuZGlhbm5lc3MKKyAgICBCT01fVVRGMzIgPSBCT01fVVRGMzJfTEUKKworZWxzZToKKworICAgICMgVVRGLTE2LCBuYXRpdmUgZW5kaWFubmVzcworICAgIEJPTSA9IEJPTV9VVEYxNiA9IEJPTV9VVEYxNl9CRQorCisgICAgIyBVVEYtMzIsIG5hdGl2ZSBlbmRpYW5uZXNzCisgICAgQk9NX1VURjMyID0gQk9NX1VURjMyX0JFCisKKyMgT2xkIGJyb2tlbiBuYW1lcyAoZG9uJ3QgdXNlIGluIG5ldyBjb2RlKQorQk9NMzJfTEUgPSBCT01fVVRGMTZfTEUKK0JPTTMyX0JFID0gQk9NX1VURjE2X0JFCitCT002NF9MRSA9IEJPTV9VVEYzMl9MRQorQk9NNjRfQkUgPSBCT01fVVRGMzJfQkUKKworCisjIyMgQ29kZWMgYmFzZSBjbGFzc2VzIChkZWZpbmluZyB0aGUgQVBJKQorCitjbGFzcyBDb2RlY0luZm8odHVwbGUpOgorCisgICAgZGVmIF9fbmV3X18oY2xzLCBlbmNvZGUsIGRlY29kZSwgc3RyZWFtcmVhZGVyPU5vbmUsIHN0cmVhbXdyaXRlcj1Ob25lLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9Tm9uZSwgaW5jcmVtZW50YWxkZWNvZGVyPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgIHNlbGYgPSB0dXBsZS5fX25ld19fKGNscywgKGVuY29kZSwgZGVjb2RlLCBzdHJlYW1yZWFkZXIsIHN0cmVhbXdyaXRlcikpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5lbmNvZGUgPSBlbmNvZGUKKyAgICAgICAgc2VsZi5kZWNvZGUgPSBkZWNvZGUKKyAgICAgICAgc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIgPSBpbmNyZW1lbnRhbGVuY29kZXIKKyAgICAgICAgc2VsZi5pbmNyZW1lbnRhbGRlY29kZXIgPSBpbmNyZW1lbnRhbGRlY29kZXIKKyAgICAgICAgc2VsZi5zdHJlYW13cml0ZXIgPSBzdHJlYW13cml0ZXIKKyAgICAgICAgc2VsZi5zdHJlYW1yZWFkZXIgPSBzdHJlYW1yZWFkZXIKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8JXMuJXMgb2JqZWN0IGZvciBlbmNvZGluZyAlcyBhdCAweCV4PiIgJSAoc2VsZi5fX2NsYXNzX18uX19tb2R1bGVfXywgc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYubmFtZSwgaWQoc2VsZikpCisKK2NsYXNzIENvZGVjOgorCisgICAgIiIiIERlZmluZXMgdGhlIGludGVyZmFjZSBmb3Igc3RhdGVsZXNzIGVuY29kZXJzL2RlY29kZXJzLgorCisgICAgICAgIFRoZSAuZW5jb2RlKCkvLmRlY29kZSgpIG1ldGhvZHMgbWF5IHVzZSBkaWZmZXJlbnQgZXJyb3IKKyAgICAgICAgaGFuZGxpbmcgc2NoZW1lcyBieSBwcm92aWRpbmcgdGhlIGVycm9ycyBhcmd1bWVudC4gVGhlc2UKKyAgICAgICAgc3RyaW5nIHZhbHVlcyBhcmUgcHJlZGVmaW5lZDoKKworICAgICAgICAgJ3N0cmljdCcgLSByYWlzZSBhIFZhbHVlRXJyb3IgZXJyb3IgKG9yIGEgc3ViY2xhc3MpCisgICAgICAgICAnaWdub3JlJyAtIGlnbm9yZSB0aGUgY2hhcmFjdGVyIGFuZCBjb250aW51ZSB3aXRoIHRoZSBuZXh0CisgICAgICAgICAncmVwbGFjZScgLSByZXBsYWNlIHdpdGggYSBzdWl0YWJsZSByZXBsYWNlbWVudCBjaGFyYWN0ZXI7CisgICAgICAgICAgICAgICAgICAgIFB5dGhvbiB3aWxsIHVzZSB0aGUgb2ZmaWNpYWwgVStGRkZEIFJFUExBQ0VNRU5UCisgICAgICAgICAgICAgICAgICAgIENIQVJBQ1RFUiBmb3IgdGhlIGJ1aWx0aW4gVW5pY29kZSBjb2RlY3Mgb24KKyAgICAgICAgICAgICAgICAgICAgZGVjb2RpbmcgYW5kICc/JyBvbiBlbmNvZGluZy4KKyAgICAgICAgICd4bWxjaGFycmVmcmVwbGFjZScgLSBSZXBsYWNlIHdpdGggdGhlIGFwcHJvcHJpYXRlIFhNTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciByZWZlcmVuY2UgKG9ubHkgZm9yIGVuY29kaW5nKS4KKyAgICAgICAgICdiYWNrc2xhc2hyZXBsYWNlJyAgLSBSZXBsYWNlIHdpdGggYmFja3NsYXNoZWQgZXNjYXBlIHNlcXVlbmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IGZvciBlbmNvZGluZykuCisKKyAgICAgICAgVGhlIHNldCBvZiBhbGxvd2VkIHZhbHVlcyBjYW4gYmUgZXh0ZW5kZWQgdmlhIHJlZ2lzdGVyX2Vycm9yLgorCisgICAgIiIiCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKworICAgICAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICAgICAnc3RyaWN0JyBoYW5kbGluZy4KKworICAgICAgICAgICAgVGhlIG1ldGhvZCBtYXkgbm90IHN0b3JlIHN0YXRlIGluIHRoZSBDb2RlYyBpbnN0YW5jZS4gVXNlCisgICAgICAgICAgICBTdHJlYW1Db2RlYyBmb3IgY29kZWNzIHdoaWNoIGhhdmUgdG8ga2VlcCBzdGF0ZSBpbiBvcmRlciB0bworICAgICAgICAgICAgbWFrZSBlbmNvZGluZy9kZWNvZGluZyBlZmZpY2llbnQuCisKKyAgICAgICAgICAgIFRoZSBlbmNvZGVyIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgemVybyBsZW5ndGggaW5wdXQgYW5kCisgICAgICAgICAgICByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IG9mIHRoZSBvdXRwdXQgb2JqZWN0IHR5cGUgaW4gdGhpcworICAgICAgICAgICAgc2l0dWF0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorCisgICAgICAgICIiIiBEZWNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgICAgIGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBiZl9nZXRyZWFkYnVmCisgICAgICAgICAgICBidWZmZXIgc2xvdC4gUHl0aG9uIHN0cmluZ3MsIGJ1ZmZlciBvYmplY3RzIGFuZCBtZW1vcnkKKyAgICAgICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgorCisgICAgICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICAgICAnc3RyaWN0JyBoYW5kbGluZy4KKworICAgICAgICAgICAgVGhlIG1ldGhvZCBtYXkgbm90IHN0b3JlIHN0YXRlIGluIHRoZSBDb2RlYyBpbnN0YW5jZS4gVXNlCisgICAgICAgICAgICBTdHJlYW1Db2RlYyBmb3IgY29kZWNzIHdoaWNoIGhhdmUgdG8ga2VlcCBzdGF0ZSBpbiBvcmRlciB0bworICAgICAgICAgICAgbWFrZSBlbmNvZGluZy9kZWNvZGluZyBlZmZpY2llbnQuCisKKyAgICAgICAgICAgIFRoZSBkZWNvZGVyIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgemVybyBsZW5ndGggaW5wdXQgYW5kCisgICAgICAgICAgICByZXR1cm4gYW4gZW1wdHkgb2JqZWN0IG9mIHRoZSBvdXRwdXQgb2JqZWN0IHR5cGUgaW4gdGhpcworICAgICAgICAgICAgc2l0dWF0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihvYmplY3QpOgorICAgICIiIgorICAgIEFuIEluY3JlbWVudGFsRW5jb2RlciBlbmNvZGVzIGFuIGlucHV0IGluIG11bHRpcGxlIHN0ZXBzLiBUaGUgaW5wdXQgY2FuIGJlCisgICAgcGFzc2VkIHBpZWNlIGJ5IHBpZWNlIHRvIHRoZSBlbmNvZGUoKSBtZXRob2QuIFRoZSBJbmNyZW1lbnRhbEVuY29kZXIgcmVtZW1iZXJzCisgICAgdGhlIHN0YXRlIG9mIHRoZSBFbmNvZGluZyBwcm9jZXNzIGJldHdlZW4gY2FsbHMgdG8gZW5jb2RlKCkuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgICIiIgorICAgICAgICBDcmVhdGVzIGFuIEluY3JlbWVudGFsRW5jb2RlciBpbnN0YW5jZS4KKworICAgICAgICBUaGUgSW5jcmVtZW50YWxFbmNvZGVyIG1heSB1c2UgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nIHNjaGVtZXMgYnkKKyAgICAgICAgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gU2VlIHRoZSBtb2R1bGUgZG9jc3RyaW5nCisgICAgICAgIGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIgorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgRW5jb2RlcyBpbnB1dCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlc2V0cyB0aGUgZW5jb2RlciB0byB0aGUgaW5pdGlhbCBzdGF0ZS4KKyAgICAgICAgIiIiCisKKyAgICBkZWYgZ2V0c3RhdGUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGVuY29kZXIuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgIiIiCisgICAgICAgIFNldCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZW5jb2Rlci4gc3RhdGUgbXVzdCBoYXZlIGJlZW4KKyAgICAgICAgcmV0dXJuZWQgYnkgZ2V0c3RhdGUoKS4KKyAgICAgICAgIiIiCisKK2NsYXNzIEJ1ZmZlcmVkSW5jcmVtZW50YWxFbmNvZGVyKEluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgIiIiCisgICAgVGhpcyBzdWJjbGFzcyBvZiBJbmNyZW1lbnRhbEVuY29kZXIgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2VjbGFzcyBmb3IgYW4KKyAgICBpbmNyZW1lbnRhbCBlbmNvZGVyIGlmIHRoZSBlbmNvZGVyIG11c3Qga2VlcCBzb21lIG9mIHRoZSBvdXRwdXQgaW4gYQorICAgIGJ1ZmZlciBiZXR3ZWVuIGNhbGxzIHRvIGVuY29kZSgpLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBJbmNyZW1lbnRhbEVuY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiICMgdW5lbmNvZGVkIGlucHV0IHRoYXQgaXMga2VwdCBiZXR3ZWVuIGNhbGxzIHRvIGVuY29kZSgpCisKKyAgICBkZWYgX2J1ZmZlcl9lbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICAjIE92ZXJ3cml0ZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzOiBJdCBtdXN0IGVuY29kZSBpbnB1dAorICAgICAgICAjIGFuZCByZXR1cm4gYW4gKG91dHB1dCwgbGVuZ3RoIGNvbnN1bWVkKSB0dXBsZQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgICMgZW5jb2RlIGlucHV0ICh0YWtpbmcgdGhlIGJ1ZmZlciBpbnRvIGFjY291bnQpCisgICAgICAgIGRhdGEgPSBzZWxmLmJ1ZmZlciArIGlucHV0CisgICAgICAgIChyZXN1bHQsIGNvbnN1bWVkKSA9IHNlbGYuX2J1ZmZlcl9lbmNvZGUoZGF0YSwgc2VsZi5lcnJvcnMsIGZpbmFsKQorICAgICAgICAjIGtlZXAgdW5lbmNvZGVkIGlucHV0IHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgc2VsZi5idWZmZXIgPSBkYXRhW2NvbnN1bWVkOl0KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBJbmNyZW1lbnRhbEVuY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIgorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5idWZmZXIgb3IgMAorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5idWZmZXIgPSBzdGF0ZSBvciAiIgorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBBbiBJbmNyZW1lbnRhbERlY29kZXIgZGVjb2RlcyBhbiBpbnB1dCBpbiBtdWx0aXBsZSBzdGVwcy4gVGhlIGlucHV0IGNhbiBiZQorICAgIHBhc3NlZCBwaWVjZSBieSBwaWVjZSB0byB0aGUgZGVjb2RlKCkgbWV0aG9kLiBUaGUgSW5jcmVtZW50YWxEZWNvZGVyCisgICAgcmVtZW1iZXJzIHRoZSBzdGF0ZSBvZiB0aGUgZGVjb2RpbmcgcHJvY2VzcyBiZXR3ZWVuIGNhbGxzIHRvIGRlY29kZSgpLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlcyBhIEluY3JlbWVudGFsRGVjb2RlciBpbnN0YW5jZS4KKworICAgICAgICBUaGUgSW5jcmVtZW50YWxEZWNvZGVyIG1heSB1c2UgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nIHNjaGVtZXMgYnkKKyAgICAgICAgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gU2VlIHRoZSBtb2R1bGUgZG9jc3RyaW5nCisgICAgICAgIGZvciBhIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIERlY29kZXMgaW5wdXQgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZyBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXNldHMgdGhlIGRlY29kZXIgdG8gdGhlIGluaXRpYWwgc3RhdGUuCisgICAgICAgICIiIgorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNvZGVyLgorCisgICAgICAgIFRoaXMgbXVzdCBiZSBhIChidWZmZXJlZF9pbnB1dCwgYWRkaXRpb25hbF9zdGF0ZV9pbmZvKSB0dXBsZS4KKyAgICAgICAgYnVmZmVyZWRfaW5wdXQgbXVzdCBiZSBhIGJ5dGVzIG9iamVjdCBjb250YWluaW5nIGJ5dGVzIHRoYXQKKyAgICAgICAgd2VyZSBwYXNzZWQgdG8gZGVjb2RlKCkgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBjb252ZXJ0ZWQuCisgICAgICAgIGFkZGl0aW9uYWxfc3RhdGVfaW5mbyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIKKyAgICAgICAgcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgZGVjb2RlciBXSVRIT1VUIHlldCBoYXZpbmcKKyAgICAgICAgcHJvY2Vzc2VkIHRoZSBjb250ZW50cyBvZiBidWZmZXJlZF9pbnB1dC4gIEluIHRoZSBpbml0aWFsIHN0YXRlCisgICAgICAgIGFuZCBhZnRlciByZXNldCgpLCBnZXRzdGF0ZSgpIG11c3QgcmV0dXJuIChiIiIsIDApLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIChiIiIsIDApCisKKyAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICAiIiIKKyAgICAgICAgU2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBkZWNvZGVyLgorCisgICAgICAgIHN0YXRlIG11c3QgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IGdldHN0YXRlKCkuICBUaGUgZWZmZWN0IG9mCisgICAgICAgIHNldHN0YXRlKChiIiIsIDApKSBtdXN0IGJlIGVxdWl2YWxlbnQgdG8gcmVzZXQoKS4KKyAgICAgICAgIiIiCisKK2NsYXNzIEJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgIiIiCisgICAgVGhpcyBzdWJjbGFzcyBvZiBJbmNyZW1lbnRhbERlY29kZXIgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2VjbGFzcyBmb3IgYW4KKyAgICBpbmNyZW1lbnRhbCBkZWNvZGVyIGlmIHRoZSBkZWNvZGVyIG11c3QgYmUgYWJsZSB0byBoYW5kbGUgaW5jb21wbGV0ZSBieXRlCisgICAgc2VxdWVuY2VzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBJbmNyZW1lbnRhbERlY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiICMgdW5kZWNvZGVkIGlucHV0IHRoYXQgaXMga2VwdCBiZXR3ZWVuIGNhbGxzIHRvIGRlY29kZSgpCisKKyAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICAjIE92ZXJ3cml0ZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzOiBJdCBtdXN0IGRlY29kZSBpbnB1dAorICAgICAgICAjIGFuZCByZXR1cm4gYW4gKG91dHB1dCwgbGVuZ3RoIGNvbnN1bWVkKSB0dXBsZQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgICMgZGVjb2RlIGlucHV0ICh0YWtpbmcgdGhlIGJ1ZmZlciBpbnRvIGFjY291bnQpCisgICAgICAgIGRhdGEgPSBzZWxmLmJ1ZmZlciArIGlucHV0CisgICAgICAgIChyZXN1bHQsIGNvbnN1bWVkKSA9IHNlbGYuX2J1ZmZlcl9kZWNvZGUoZGF0YSwgc2VsZi5lcnJvcnMsIGZpbmFsKQorICAgICAgICAjIGtlZXAgdW5kZWNvZGVkIGlucHV0IHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgc2VsZi5idWZmZXIgPSBkYXRhW2NvbnN1bWVkOl0KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBJbmNyZW1lbnRhbERlY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIgorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAjIGFkZGl0aW9uYWwgc3RhdGUgaW5mbyBpcyBhbHdheXMgMAorICAgICAgICByZXR1cm4gKHNlbGYuYnVmZmVyLCAwKQorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgIyBpZ25vcmUgYWRkaXRpb25hbCBzdGF0ZSBpbmZvCisgICAgICAgIHNlbGYuYnVmZmVyID0gc3RhdGVbMF0KKworIworIyBUaGUgU3RyZWFtV3JpdGVyIGFuZCBTdHJlYW1SZWFkZXIgY2xhc3MgcHJvdmlkZSBnZW5lcmljIHdvcmtpbmcKKyMgaW50ZXJmYWNlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgbmV3IGVuY29kaW5nIHN1Ym1vZHVsZXMKKyMgdmVyeSBlYXNpbHkuIFNlZSBlbmNvZGluZ3MvdXRmXzgucHkgZm9yIGFuIGV4YW1wbGUgb24gaG93IHRoaXMgaXMKKyMgZG9uZS4KKyMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAgICAgIiIiIENyZWF0ZXMgYSBTdHJlYW1Xcml0ZXIgaW5zdGFuY2UuCisKKyAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciB3cml0aW5nCisgICAgICAgICAgICAoYmluYXJ5KSBkYXRhLgorCisgICAgICAgICAgICBUaGUgU3RyZWFtV3JpdGVyIG1heSB1c2UgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCisgICAgICAgICAgICBzY2hlbWVzIGJ5IHByb3ZpZGluZyB0aGUgZXJyb3JzIGtleXdvcmQgYXJndW1lbnQuIFRoZXNlCisgICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBwcmVkZWZpbmVkOgorCisgICAgICAgICAgICAgJ3N0cmljdCcgLSByYWlzZSBhIFZhbHVlRXJyb3IgKG9yIGEgc3ViY2xhc3MpCisgICAgICAgICAgICAgJ2lnbm9yZScgLSBpZ25vcmUgdGhlIGNoYXJhY3RlciBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dAorICAgICAgICAgICAgICdyZXBsYWNlJy0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyCisgICAgICAgICAgICAgJ3htbGNoYXJyZWZyZXBsYWNlJyAtIFJlcGxhY2Ugd2l0aCB0aGUgYXBwcm9wcmlhdGUgWE1MCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciByZWZlcmVuY2UuCisgICAgICAgICAgICAgJ2JhY2tzbGFzaHJlcGxhY2UnICAtIFJlcGxhY2Ugd2l0aCBiYWNrc2xhc2hlZCBlc2NhcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxdWVuY2VzIChvbmx5IGZvciBlbmNvZGluZykuCisKKyAgICAgICAgICAgIFRoZSBzZXQgb2YgYWxsb3dlZCBwYXJhbWV0ZXIgdmFsdWVzIGNhbiBiZSBleHRlbmRlZCB2aWEKKyAgICAgICAgICAgIHJlZ2lzdGVyX2Vycm9yLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKyAgICAgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKworICAgIGRlZiB3cml0ZShzZWxmLCBvYmplY3QpOgorCisgICAgICAgICIiIiBXcml0ZXMgdGhlIG9iamVjdCdzIGNvbnRlbnRzIGVuY29kZWQgdG8gc2VsZi5zdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICBkYXRhLCBjb25zdW1lZCA9IHNlbGYuZW5jb2RlKG9iamVjdCwgc2VsZi5lcnJvcnMpCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBsaXN0KToKKworICAgICAgICAiIiIgV3JpdGVzIHRoZSBjb25jYXRlbmF0ZWQgbGlzdCBvZiBzdHJpbmdzIHRvIHRoZSBzdHJlYW0KKyAgICAgICAgICAgIHVzaW5nIC53cml0ZSgpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53cml0ZSgnJy5qb2luKGxpc3QpKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorCisgICAgICAgICIiIiBGbHVzaGVzIGFuZCByZXNldHMgdGhlIGNvZGVjIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcGluZyBzdGF0ZS4KKworICAgICAgICAgICAgQ2FsbGluZyB0aGlzIG1ldGhvZCBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGRhdGEgb24gdGhlCisgICAgICAgICAgICBvdXRwdXQgaXMgcHV0IGludG8gYSBjbGVhbiBzdGF0ZSwgdGhhdCBhbGxvd3MgYXBwZW5kaW5nCisgICAgICAgICAgICBvZiBuZXcgZnJlc2ggZGF0YSB3aXRob3V0IGhhdmluZyB0byByZXNjYW4gdGhlIHdob2xlCisgICAgICAgICAgICBzdHJlYW0gdG8gcmVjb3ZlciBzdGF0ZS4KKworICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHNlZWsoc2VsZiwgb2Zmc2V0LCB3aGVuY2U9MCk6CisgICAgICAgIHNlbGYuc3RyZWFtLnNlZWsob2Zmc2V0LCB3aGVuY2UpCisgICAgICAgIGlmIHdoZW5jZSA9PSAwIGFuZCBvZmZzZXQgPT0gMDoKKyAgICAgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHI9Z2V0YXR0cik6CisKKyAgICAgICAgIiIiIEluaGVyaXQgYWxsIG90aGVyIG1ldGhvZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSwgbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorCisjIyMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAgICAgIiIiIENyZWF0ZXMgYSBTdHJlYW1SZWFkZXIgaW5zdGFuY2UuCisKKyAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdCBvcGVuIGZvciByZWFkaW5nCisgICAgICAgICAgICAoYmluYXJ5KSBkYXRhLgorCisgICAgICAgICAgICBUaGUgU3RyZWFtUmVhZGVyIG1heSB1c2UgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nCisgICAgICAgICAgICBzY2hlbWVzIGJ5IHByb3ZpZGluZyB0aGUgZXJyb3JzIGtleXdvcmQgYXJndW1lbnQuIFRoZXNlCisgICAgICAgICAgICBwYXJhbWV0ZXJzIGFyZSBwcmVkZWZpbmVkOgorCisgICAgICAgICAgICAgJ3N0cmljdCcgLSByYWlzZSBhIFZhbHVlRXJyb3IgKG9yIGEgc3ViY2xhc3MpCisgICAgICAgICAgICAgJ2lnbm9yZScgLSBpZ25vcmUgdGhlIGNoYXJhY3RlciBhbmQgY29udGludWUgd2l0aCB0aGUgbmV4dAorICAgICAgICAgICAgICdyZXBsYWNlJy0gcmVwbGFjZSB3aXRoIGEgc3VpdGFibGUgcmVwbGFjZW1lbnQgY2hhcmFjdGVyOworCisgICAgICAgICAgICBUaGUgc2V0IG9mIGFsbG93ZWQgcGFyYW1ldGVyIHZhbHVlcyBjYW4gYmUgZXh0ZW5kZWQgdmlhCisgICAgICAgICAgICByZWdpc3Rlcl9lcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIHNlbGYuYnl0ZWJ1ZmZlciA9ICIiCisgICAgICAgICMgRm9yIHN0ci0+c3RyIGRlY29kaW5nIHRoaXMgd2lsbCBzdGF5IGEgc3RyCisgICAgICAgICMgRm9yIHN0ci0+dW5pY29kZSBkZWNvZGluZyB0aGUgZmlyc3QgcmVhZCB3aWxsIHByb21vdGUgaXQgdG8gdW5pY29kZQorICAgICAgICBzZWxmLmNoYXJidWZmZXIgPSAiIgorICAgICAgICBzZWxmLmxpbmVidWZmZXIgPSBOb25lCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xLCBjaGFycz0tMSwgZmlyc3RsaW5lPUZhbHNlKToKKworICAgICAgICAiIiIgRGVjb2RlcyBkYXRhIGZyb20gdGhlIHN0cmVhbSBzZWxmLnN0cmVhbSBhbmQgcmV0dXJucyB0aGUKKyAgICAgICAgICAgIHJlc3VsdGluZyBvYmplY3QuCisKKyAgICAgICAgICAgIGNoYXJzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gcmVhZCBmcm9tIHRoZQorICAgICAgICAgICAgc3RyZWFtLiByZWFkKCkgd2lsbCBuZXZlciByZXR1cm4gbW9yZSB0aGFuIGNoYXJzCisgICAgICAgICAgICBjaGFyYWN0ZXJzLCBidXQgaXQgbWlnaHQgcmV0dXJuIGxlc3MsIGlmIHRoZXJlIGFyZSBub3QgZW5vdWdoCisgICAgICAgICAgICBjaGFyYWN0ZXJzIGF2YWlsYWJsZS4KKworICAgICAgICAgICAgc2l6ZSBpbmRpY2F0ZXMgdGhlIGFwcHJveGltYXRlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvCisgICAgICAgICAgICByZWFkIGZyb20gdGhlIHN0cmVhbSBmb3IgZGVjb2RpbmcgcHVycG9zZXMuIFRoZSBkZWNvZGVyCisgICAgICAgICAgICBjYW4gbW9kaWZ5IHRoaXMgc2V0dGluZyBhcyBhcHByb3ByaWF0ZS4gVGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICAgIC0xIGluZGljYXRlcyB0byByZWFkIGFuZCBkZWNvZGUgYXMgbXVjaCBhcyBwb3NzaWJsZS4gIHNpemUKKyAgICAgICAgICAgIGlzIGludGVuZGVkIHRvIHByZXZlbnQgaGF2aW5nIHRvIGRlY29kZSBodWdlIGZpbGVzIGluIG9uZQorICAgICAgICAgICAgc3RlcC4KKworICAgICAgICAgICAgSWYgZmlyc3RsaW5lIGlzIHRydWUsIGFuZCBhIFVuaWNvZGVEZWNvZGVFcnJvciBoYXBwZW5zCisgICAgICAgICAgICBhZnRlciB0aGUgZmlyc3QgbGluZSB0ZXJtaW5hdG9yIGluIHRoZSBpbnB1dCBvbmx5IHRoZSBmaXJzdCBsaW5lCisgICAgICAgICAgICB3aWxsIGJlIHJldHVybmVkLCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQgd2lsbCBiZSBrZXB0IHVudGlsIHRoZQorICAgICAgICAgICAgbmV4dCBjYWxsIHRvIHJlYWQoKS4KKworICAgICAgICAgICAgVGhlIG1ldGhvZCBzaG91bGQgdXNlIGEgZ3JlZWR5IHJlYWQgc3RyYXRlZ3kgbWVhbmluZyB0aGF0CisgICAgICAgICAgICBpdCBzaG91bGQgcmVhZCBhcyBtdWNoIGRhdGEgYXMgaXMgYWxsb3dlZCB3aXRoaW4gdGhlCisgICAgICAgICAgICBkZWZpbml0aW9uIG9mIHRoZSBlbmNvZGluZyBhbmQgdGhlIGdpdmVuIHNpemUsIGUuZy4gIGlmCisgICAgICAgICAgICBvcHRpb25hbCBlbmNvZGluZyBlbmRpbmdzIG9yIHN0YXRlIG1hcmtlcnMgYXJlIGF2YWlsYWJsZQorICAgICAgICAgICAgb24gdGhlIHN0cmVhbSwgdGhlc2Ugc2hvdWxkIGJlIHJlYWQgdG9vLgorICAgICAgICAiIiIKKyAgICAgICAgIyBJZiB3ZSBoYXZlIGxpbmVzIGNhY2hlZCwgZmlyc3QgbWVyZ2UgdGhlbSBiYWNrIGludG8gY2hhcmFjdGVycworICAgICAgICBpZiBzZWxmLmxpbmVidWZmZXI6CisgICAgICAgICAgICBzZWxmLmNoYXJidWZmZXIgPSAiIi5qb2luKHNlbGYubGluZWJ1ZmZlcikKKyAgICAgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9IE5vbmUKKworICAgICAgICAjIHJlYWQgdW50aWwgd2UgZ2V0IHRoZSByZXF1aXJlZCBudW1iZXIgb2YgY2hhcmFjdGVycyAoaWYgYXZhaWxhYmxlKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgIyBjYW4gdGhlIHJlcXVlc3QgY2FuIGJlIHNhdGlzZmllZCBmcm9tIHRoZSBjaGFyYWN0ZXIgYnVmZmVyPworICAgICAgICAgICAgaWYgY2hhcnMgPCAwOgorICAgICAgICAgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNoYXJidWZmZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuY2hhcmJ1ZmZlcikgPj0gc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbGVuKHNlbGYuY2hhcmJ1ZmZlcikgPj0gY2hhcnM6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIHdlIG5lZWQgbW9yZSBkYXRhCisgICAgICAgICAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgICAgICAgICBuZXdkYXRhID0gc2VsZi5zdHJlYW0ucmVhZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld2RhdGEgPSBzZWxmLnN0cmVhbS5yZWFkKHNpemUpCisgICAgICAgICAgICAjIGRlY29kZSBieXRlcyAodGhvc2UgcmVtYWluaW5nIGZyb20gdGhlIGxhc3QgY2FsbCBpbmNsdWRlZCkKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLmJ5dGVidWZmZXIgKyBuZXdkYXRhCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmV3Y2hhcnMsIGRlY29kZWRieXRlcyA9IHNlbGYuZGVjb2RlKGRhdGEsIHNlbGYuZXJyb3JzKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciwgZXhjOgorICAgICAgICAgICAgICAgIGlmIGZpcnN0bGluZToKKyAgICAgICAgICAgICAgICAgICAgbmV3Y2hhcnMsIGRlY29kZWRieXRlcyA9IHNlbGYuZGVjb2RlKGRhdGFbOmV4Yy5zdGFydF0sIHNlbGYuZXJyb3JzKQorICAgICAgICAgICAgICAgICAgICBsaW5lcyA9IG5ld2NoYXJzLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmVzKTw9MToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICMga2VlcCB1bmRlY29kZWQgYnl0ZXMgdW50aWwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgc2VsZi5ieXRlYnVmZmVyID0gZGF0YVtkZWNvZGVkYnl0ZXM6XQorICAgICAgICAgICAgIyBwdXQgbmV3IGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJhY3RlciBidWZmZXIKKyAgICAgICAgICAgIHNlbGYuY2hhcmJ1ZmZlciArPSBuZXdjaGFycworICAgICAgICAgICAgIyB0aGVyZSB3YXMgbm8gZGF0YSBhdmFpbGFibGUKKyAgICAgICAgICAgIGlmIG5vdCBuZXdkYXRhOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGNoYXJzIDwgMDoKKyAgICAgICAgICAgICMgUmV0dXJuIGV2ZXJ5dGhpbmcgd2UndmUgZ290CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmNoYXJidWZmZXIKKyAgICAgICAgICAgIHNlbGYuY2hhcmJ1ZmZlciA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFJldHVybiB0aGUgZmlyc3QgY2hhcnMgY2hhcmFjdGVycworICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jaGFyYnVmZmVyWzpjaGFyc10KKyAgICAgICAgICAgIHNlbGYuY2hhcmJ1ZmZlciA9IHNlbGYuY2hhcmJ1ZmZlcltjaGFyczpdCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPU5vbmUsIGtlZXBlbmRzPVRydWUpOgorCisgICAgICAgICIiIiBSZWFkIG9uZSBsaW5lIGZyb20gdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIHRoZQorICAgICAgICAgICAgZGVjb2RlZCBkYXRhLgorCisgICAgICAgICAgICBzaXplLCBpZiBnaXZlbiwgaXMgcGFzc2VkIGFzIHNpemUgYXJndW1lbnQgdG8gdGhlCisgICAgICAgICAgICByZWFkKCkgbWV0aG9kLgorCisgICAgICAgICIiIgorICAgICAgICAjIElmIHdlIGhhdmUgbGluZXMgY2FjaGVkIGZyb20gYW4gZWFybGllciByZWFkLCByZXR1cm4KKyAgICAgICAgIyB0aGVtIHVuY29uZGl0aW9uYWxseQorICAgICAgICBpZiBzZWxmLmxpbmVidWZmZXI6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5saW5lYnVmZmVyWzBdCisgICAgICAgICAgICBkZWwgc2VsZi5saW5lYnVmZmVyWzBdCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5saW5lYnVmZmVyKSA9PSAxOgorICAgICAgICAgICAgICAgICMgcmV2ZXJ0IHRvIGNoYXJidWZmZXIgbW9kZTsgd2UgbWlnaHQgbmVlZCBtb3JlIGRhdGEKKyAgICAgICAgICAgICAgICAjIG5leHQgdGltZQorICAgICAgICAgICAgICAgIHNlbGYuY2hhcmJ1ZmZlciA9IHNlbGYubGluZWJ1ZmZlclswXQorICAgICAgICAgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9IE5vbmUKKyAgICAgICAgICAgIGlmIG5vdCBrZWVwZW5kczoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5zcGxpdGxpbmVzKEZhbHNlKVswXQorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKworICAgICAgICByZWFkc2l6ZSA9IHNpemUgb3IgNzIKKyAgICAgICAgbGluZSA9ICIiCisgICAgICAgICMgSWYgc2l6ZSBpcyBnaXZlbiwgd2UgY2FsbCByZWFkKCkgb25seSBvbmNlCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWFkKHJlYWRzaXplLCBmaXJzdGxpbmU9VHJ1ZSkKKyAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSBhdCBhICJcciIgcmVhZCBvbmUgZXh0cmEgY2hhcmFjdGVyICh3aGljaCBtaWdodAorICAgICAgICAgICAgICAgICMgYmUgYSAiXG4iKSB0byBnZXQgYSBwcm9wZXIgbGluZSBlbmRpbmcuIElmIHRoZSBzdHJlYW0gaXMKKyAgICAgICAgICAgICAgICAjIHRlbXBvcmFyaWx5IGV4aGF1c3RlZCB3ZSByZXR1cm4gdGhlIHdyb25nIGxpbmUgZW5kaW5nLgorICAgICAgICAgICAgICAgIGlmIGRhdGEuZW5kc3dpdGgoIlxyIik6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gc2VsZi5yZWFkKHNpemU9MSwgY2hhcnM9MSkKKworICAgICAgICAgICAgbGluZSArPSBkYXRhCisgICAgICAgICAgICBsaW5lcyA9IGxpbmUuc3BsaXRsaW5lcyhUcnVlKQorICAgICAgICAgICAgaWYgbGluZXM6CisgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmVzKSA+IDE6CisgICAgICAgICAgICAgICAgICAgICMgTW9yZSB0aGFuIG9uZSBsaW5lIHJlc3VsdDsgdGhlIGZpcnN0IGxpbmUgaXMgYSBmdWxsIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgIyB0byByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVzWzBdCisgICAgICAgICAgICAgICAgICAgIGRlbCBsaW5lc1swXQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4obGluZXMpID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2FjaGUgdGhlIHJlbWFpbmluZyBsaW5lcworICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbLTFdICs9IHNlbGYuY2hhcmJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lYnVmZmVyID0gbGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hhcmJ1ZmZlciA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBvbmUgcmVtYWluaW5nIGxpbmUsIHB1dCBpdCBiYWNrIGludG8gY2hhcmJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGFyYnVmZmVyID0gbGluZXNbMF0gKyBzZWxmLmNoYXJidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGtlZXBlbmRzOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3BsaXRsaW5lcyhGYWxzZSlbMF0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsaW5lMHdpdGhlbmQgPSBsaW5lc1swXQorICAgICAgICAgICAgICAgIGxpbmUwd2l0aG91dGVuZCA9IGxpbmVzWzBdLnNwbGl0bGluZXMoRmFsc2UpWzBdCisgICAgICAgICAgICAgICAgaWYgbGluZTB3aXRoZW5kICE9IGxpbmUwd2l0aG91dGVuZDogIyBXZSByZWFsbHkgaGF2ZSBhIGxpbmUgZW5kCisgICAgICAgICAgICAgICAgICAgICMgUHV0IHRoZSByZXN0IGJhY2sgdG9nZXRoZXIgYW5kIGtlZXAgaXQgdW50aWwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoYXJidWZmZXIgPSAiIi5qb2luKGxpbmVzWzE6XSkgKyBzZWxmLmNoYXJidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgaWYga2VlcGVuZHM6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZTB3aXRoZW5kCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZTB3aXRob3V0ZW5kCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIHdlIGRpZG4ndCBnZXQgYW55dGhpbmcgb3IgdGhpcyB3YXMgb3VyIG9ubHkgdHJ5CisgICAgICAgICAgICBpZiBub3QgZGF0YSBvciBzaXplIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIGxpbmUgYW5kIG5vdCBrZWVwZW5kczoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3BsaXRsaW5lcyhGYWxzZSlbMF0KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgcmVhZHNpemU8ODAwMDoKKyAgICAgICAgICAgICAgICByZWFkc2l6ZSAqPSAyCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50PU5vbmUsIGtlZXBlbmRzPVRydWUpOgorCisgICAgICAgICIiIiBSZWFkIGFsbCBsaW5lcyBhdmFpbGFibGUgb24gdGhlIGlucHV0IHN0cmVhbQorICAgICAgICAgICAgYW5kIHJldHVybiB0aGVtIGFzIGxpc3Qgb2YgbGluZXMuCisKKyAgICAgICAgICAgIExpbmUgYnJlYWtzIGFyZSBpbXBsZW1lbnRlZCB1c2luZyB0aGUgY29kZWMncyBkZWNvZGVyCisgICAgICAgICAgICBtZXRob2QgYW5kIGFyZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBlbnRyaWVzLgorCisgICAgICAgICAgICBzaXplaGludCwgaWYgZ2l2ZW4sIGlzIGlnbm9yZWQgc2luY2UgdGhlcmUgaXMgbm8gZWZmaWNpZW50CisgICAgICAgICAgICB3YXkgdG8gZmluZGluZyB0aGUgdHJ1ZSBlbmQtb2YtbGluZS4KKworICAgICAgICAiIiIKKyAgICAgICAgZGF0YSA9IHNlbGYucmVhZCgpCisgICAgICAgIHJldHVybiBkYXRhLnNwbGl0bGluZXMoa2VlcGVuZHMpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisKKyAgICAgICAgIiIiIFJlc2V0cyB0aGUgY29kZWMgYnVmZmVycyB1c2VkIGZvciBrZWVwaW5nIHN0YXRlLgorCisgICAgICAgICAgICBOb3RlIHRoYXQgbm8gc3RyZWFtIHJlcG9zaXRpb25pbmcgc2hvdWxkIHRha2UgcGxhY2UuCisgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYmUgYWJsZSB0byByZWNvdmVyCisgICAgICAgICAgICBmcm9tIGRlY29kaW5nIGVycm9ycy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ieXRlYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5jaGFyYnVmZmVyID0gdSIiCisgICAgICAgIHNlbGYubGluZWJ1ZmZlciA9IE5vbmUKKworICAgIGRlZiBzZWVrKHNlbGYsIG9mZnNldCwgd2hlbmNlPTApOgorICAgICAgICAiIiIgU2V0IHRoZSBpbnB1dCBzdHJlYW0ncyBjdXJyZW50IHBvc2l0aW9uLgorCisgICAgICAgICAgICBSZXNldHMgdGhlIGNvZGVjIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcGluZyBzdGF0ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RyZWFtLnNlZWsob2Zmc2V0LCB3aGVuY2UpCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIG5leHQoc2VsZik6CisKKyAgICAgICAgIiIiIFJldHVybiB0aGUgbmV4dCBkZWNvZGVkIGxpbmUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiIiIgorICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICByZXR1cm4gbGluZQorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cj1nZXRhdHRyKToKKworICAgICAgICAiIiIgSW5oZXJpdCBhbGwgb3RoZXIgbWV0aG9kcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLCBuYW1lKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdGIpOgorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisKKyMjIworCitjbGFzcyBTdHJlYW1SZWFkZXJXcml0ZXI6CisKKyAgICAiIiIgU3RyZWFtUmVhZGVyV3JpdGVyIGluc3RhbmNlcyBhbGxvdyB3cmFwcGluZyBzdHJlYW1zIHdoaWNoCisgICAgICAgIHdvcmsgaW4gYm90aCByZWFkIGFuZCB3cml0ZSBtb2Rlcy4KKworICAgICAgICBUaGUgZGVzaWduIGlzIHN1Y2ggdGhhdCBvbmUgY2FuIHVzZSB0aGUgZmFjdG9yeSBmdW5jdGlvbnMKKyAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNvZGVjLmxvb2t1cCgpIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCB0aGUKKyAgICAgICAgaW5zdGFuY2UuCisKKyAgICAiIiIKKyAgICAjIE9wdGlvbmFsIGF0dHJpYnV0ZXMgc2V0IGJ5IHRoZSBmaWxlIHdyYXBwZXJzIGJlbG93CisgICAgZW5jb2RpbmcgPSAndW5rbm93bicKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIFJlYWRlciwgV3JpdGVyLCBlcnJvcnM9J3N0cmljdCcpOgorCisgICAgICAgICIiIiBDcmVhdGVzIGEgU3RyZWFtUmVhZGVyV3JpdGVyIGluc3RhbmNlLgorCisgICAgICAgICAgICBzdHJlYW0gbXVzdCBiZSBhIFN0cmVhbS1saWtlIG9iamVjdC4KKworICAgICAgICAgICAgUmVhZGVyLCBXcml0ZXIgbXVzdCBiZSBmYWN0b3J5IGZ1bmN0aW9ucyBvciBjbGFzc2VzCisgICAgICAgICAgICBwcm92aWRpbmcgdGhlIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyIGludGVyZmFjZSByZXNwLgorCisgICAgICAgICAgICBFcnJvciBoYW5kbGluZyBpcyBkb25lIGluIHRoZSBzYW1lIHdheSBhcyBkZWZpbmVkIGZvciB0aGUKKyAgICAgICAgICAgIFN0cmVhbVdyaXRlci9SZWFkZXJzLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQorICAgICAgICBzZWxmLnJlYWRlciA9IFJlYWRlcihzdHJlYW0sIGVycm9ycykKKyAgICAgICAgc2VsZi53cml0ZXIgPSBXcml0ZXIoc3RyZWFtLCBlcnJvcnMpCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPS0xKToKKworICAgICAgICByZXR1cm4gc2VsZi5yZWFkZXIucmVhZChzaXplKQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9Tm9uZSk6CisKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZGVyLnJlYWRsaW5lKHNpemUpCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50PU5vbmUpOgorCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRlci5yZWFkbGluZXMoc2l6ZWhpbnQpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKworICAgICAgICAiIiIgUmV0dXJuIHRoZSBuZXh0IGRlY29kZWQgbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRlci5uZXh0KCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKworICAgICAgICByZXR1cm4gc2VsZi53cml0ZXIud3JpdGUoZGF0YSkKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGxpc3QpOgorCisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci53cml0ZWxpbmVzKGxpc3QpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisKKyAgICAgICAgc2VsZi5yZWFkZXIucmVzZXQoKQorICAgICAgICBzZWxmLndyaXRlci5yZXNldCgpCisKKyAgICBkZWYgc2VlayhzZWxmLCBvZmZzZXQsIHdoZW5jZT0wKToKKyAgICAgICAgc2VsZi5zdHJlYW0uc2VlayhvZmZzZXQsIHdoZW5jZSkKKyAgICAgICAgc2VsZi5yZWFkZXIucmVzZXQoKQorICAgICAgICBpZiB3aGVuY2UgPT0gMCBhbmQgb2Zmc2V0ID09IDA6CisgICAgICAgICAgICBzZWxmLndyaXRlci5yZXNldCgpCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cj1nZXRhdHRyKToKKworICAgICAgICAiIiIgSW5oZXJpdCBhbGwgb3RoZXIgbWV0aG9kcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuc3RyZWFtLCBuYW1lKQorCisgICAgIyB0aGVzZSBhcmUgbmVlZGVkIHRvIG1ha2UgIndpdGggY29kZWNzLm9wZW4oLi4uKSIgd29yayBwcm9wZXJseQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdGIpOgorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisKKyMjIworCitjbGFzcyBTdHJlYW1SZWNvZGVyOgorCisgICAgIiIiIFN0cmVhbVJlY29kZXIgaW5zdGFuY2VzIHByb3ZpZGUgYSBmcm9udGVuZCAtIGJhY2tlbmQKKyAgICAgICAgdmlldyBvZiBlbmNvZGluZyBkYXRhLgorCisgICAgICAgIFRoZXkgdXNlIHRoZSBjb21wbGV0ZSBzZXQgb2YgQVBJcyByZXR1cm5lZCBieSB0aGUKKyAgICAgICAgY29kZWNzLmxvb2t1cCgpIGZ1bmN0aW9uIHRvIGltcGxlbWVudCB0aGVpciB0YXNrLgorCisgICAgICAgIERhdGEgd3JpdHRlbiB0byB0aGUgc3RyZWFtIGlzIGZpcnN0IGRlY29kZWQgaW50byBhbgorICAgICAgICBpbnRlcm1lZGlhdGUgZm9ybWF0ICh3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGdpdmVuIGNvZGVjCisgICAgICAgIGNvbWJpbmF0aW9uKSBhbmQgdGhlbiB3cml0dGVuIHRvIHRoZSBzdHJlYW0gdXNpbmcgYW4gaW5zdGFuY2UKKyAgICAgICAgb2YgdGhlIHByb3ZpZGVkIFdyaXRlciBjbGFzcy4KKworICAgICAgICBJbiB0aGUgb3RoZXIgZGlyZWN0aW9uLCBkYXRhIGlzIHJlYWQgZnJvbSB0aGUgc3RyZWFtIHVzaW5nIGEKKyAgICAgICAgUmVhZGVyIGluc3RhbmNlIGFuZCB0aGVuIHJldHVybiBlbmNvZGVkIGRhdGEgdG8gdGhlIGNhbGxlci4KKworICAgICIiIgorICAgICMgT3B0aW9uYWwgYXR0cmlidXRlcyBzZXQgYnkgdGhlIGZpbGUgd3JhcHBlcnMgYmVsb3cKKyAgICBkYXRhX2VuY29kaW5nID0gJ3Vua25vd24nCisgICAgZmlsZV9lbmNvZGluZyA9ICd1bmtub3duJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZW5jb2RlLCBkZWNvZGUsIFJlYWRlciwgV3JpdGVyLAorICAgICAgICAgICAgICAgICBlcnJvcnM9J3N0cmljdCcpOgorCisgICAgICAgICIiIiBDcmVhdGVzIGEgU3RyZWFtUmVjb2RlciBpbnN0YW5jZSB3aGljaCBpbXBsZW1lbnRzIGEgdHdvLXdheQorICAgICAgICAgICAgY29udmVyc2lvbjogZW5jb2RlIGFuZCBkZWNvZGUgd29yayBvbiB0aGUgZnJvbnRlbmQgKHRoZQorICAgICAgICAgICAgaW5wdXQgdG8gLnJlYWQoKSBhbmQgb3V0cHV0IG9mIC53cml0ZSgpKSB3aGlsZQorICAgICAgICAgICAgUmVhZGVyIGFuZCBXcml0ZXIgd29yayBvbiB0aGUgYmFja2VuZCAocmVhZGluZyBhbmQKKyAgICAgICAgICAgIHdyaXRpbmcgdG8gdGhlIHN0cmVhbSkuCisKKyAgICAgICAgICAgIFlvdSBjYW4gdXNlIHRoZXNlIG9iamVjdHMgdG8gZG8gdHJhbnNwYXJlbnQgZGlyZWN0CisgICAgICAgICAgICByZWNvZGluZ3MgZnJvbSBlLmcuIGxhdGluLTEgdG8gdXRmLTggYW5kIGJhY2suCisKKyAgICAgICAgICAgIHN0cmVhbSBtdXN0IGJlIGEgZmlsZS1saWtlIG9iamVjdC4KKworICAgICAgICAgICAgZW5jb2RlLCBkZWNvZGUgbXVzdCBhZGhlcmUgdG8gdGhlIENvZGVjIGludGVyZmFjZSwgUmVhZGVyLAorICAgICAgICAgICAgV3JpdGVyIG11c3QgYmUgZmFjdG9yeSBmdW5jdGlvbnMgb3IgY2xhc3NlcyBwcm92aWRpbmcgdGhlCisgICAgICAgICAgICBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlciBpbnRlcmZhY2UgcmVzcC4KKworICAgICAgICAgICAgZW5jb2RlIGFuZCBkZWNvZGUgYXJlIG5lZWRlZCBmb3IgdGhlIGZyb250ZW5kIHRyYW5zbGF0aW9uLAorICAgICAgICAgICAgUmVhZGVyIGFuZCBXcml0ZXIgZm9yIHRoZSBiYWNrZW5kIHRyYW5zbGF0aW9uLiBVbmljb2RlIGlzCisgICAgICAgICAgICB1c2VkIGFzIGludGVybWVkaWF0ZSBlbmNvZGluZy4KKworICAgICAgICAgICAgRXJyb3IgaGFuZGxpbmcgaXMgZG9uZSBpbiB0aGUgc2FtZSB3YXkgYXMgZGVmaW5lZCBmb3IgdGhlCisgICAgICAgICAgICBTdHJlYW1Xcml0ZXIvUmVhZGVycy4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKyAgICAgICAgc2VsZi5lbmNvZGUgPSBlbmNvZGUKKyAgICAgICAgc2VsZi5kZWNvZGUgPSBkZWNvZGUKKyAgICAgICAgc2VsZi5yZWFkZXIgPSBSZWFkZXIoc3RyZWFtLCBlcnJvcnMpCisgICAgICAgIHNlbGYud3JpdGVyID0gV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQorICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSk6CisKKyAgICAgICAgZGF0YSA9IHNlbGYucmVhZGVyLnJlYWQoc2l6ZSkKKyAgICAgICAgZGF0YSwgYnl0ZXNlbmNvZGVkID0gc2VsZi5lbmNvZGUoZGF0YSwgc2VsZi5lcnJvcnMpCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT1Ob25lKToKKworICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWFkZXIucmVhZGxpbmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYucmVhZGVyLnJlYWRsaW5lKHNpemUpCisgICAgICAgIGRhdGEsIGJ5dGVzZW5jb2RlZCA9IHNlbGYuZW5jb2RlKGRhdGEsIHNlbGYuZXJyb3JzKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCBzaXplaGludD1Ob25lKToKKworICAgICAgICBkYXRhID0gc2VsZi5yZWFkZXIucmVhZCgpCisgICAgICAgIGRhdGEsIGJ5dGVzZW5jb2RlZCA9IHNlbGYuZW5jb2RlKGRhdGEsIHNlbGYuZXJyb3JzKQorICAgICAgICByZXR1cm4gZGF0YS5zcGxpdGxpbmVzKDEpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKworICAgICAgICAiIiIgUmV0dXJuIHRoZSBuZXh0IGRlY29kZWQgbGluZSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIiIiCisgICAgICAgIGRhdGEgPSBzZWxmLnJlYWRlci5uZXh0KCkKKyAgICAgICAgZGF0YSwgYnl0ZXNlbmNvZGVkID0gc2VsZi5lbmNvZGUoZGF0YSwgc2VsZi5lcnJvcnMpCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisKKyAgICAgICAgZGF0YSwgYnl0ZXNkZWNvZGVkID0gc2VsZi5kZWNvZGUoZGF0YSwgc2VsZi5lcnJvcnMpCisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci53cml0ZShkYXRhKQorCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgbGlzdCk6CisKKyAgICAgICAgZGF0YSA9ICcnLmpvaW4obGlzdCkKKyAgICAgICAgZGF0YSwgYnl0ZXNkZWNvZGVkID0gc2VsZi5kZWNvZGUoZGF0YSwgc2VsZi5lcnJvcnMpCisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci53cml0ZShkYXRhKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorCisgICAgICAgIHNlbGYucmVhZGVyLnJlc2V0KCkKKyAgICAgICAgc2VsZi53cml0ZXIucmVzZXQoKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHI9Z2V0YXR0cik6CisKKyAgICAgICAgIiIiIEluaGVyaXQgYWxsIG90aGVyIG1ldGhvZHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSwgbmFtZSkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorCisjIyMgU2hvcnRjdXRzCisKK2RlZiBvcGVuKGZpbGVuYW1lLCBtb2RlPSdyYicsIGVuY29kaW5nPU5vbmUsIGVycm9ycz0nc3RyaWN0JywgYnVmZmVyaW5nPTEpOgorCisgICAgIiIiIE9wZW4gYW4gZW5jb2RlZCBmaWxlIHVzaW5nIHRoZSBnaXZlbiBtb2RlIGFuZCByZXR1cm4KKyAgICAgICAgYSB3cmFwcGVkIHZlcnNpb24gcHJvdmlkaW5nIHRyYW5zcGFyZW50IGVuY29kaW5nL2RlY29kaW5nLgorCisgICAgICAgIE5vdGU6IFRoZSB3cmFwcGVkIHZlcnNpb24gd2lsbCBvbmx5IGFjY2VwdCB0aGUgb2JqZWN0IGZvcm1hdAorICAgICAgICBkZWZpbmVkIGJ5IHRoZSBjb2RlY3MsIGkuZS4gVW5pY29kZSBvYmplY3RzIGZvciBtb3N0IGJ1aWx0aW4KKyAgICAgICAgY29kZWNzLiBPdXRwdXQgaXMgYWxzbyBjb2RlYyBkZXBlbmRlbnQgYW5kIHdpbGwgdXN1YWxseSBiZQorICAgICAgICBVbmljb2RlIGFzIHdlbGwuCisKKyAgICAgICAgRmlsZXMgYXJlIGFsd2F5cyBvcGVuZWQgaW4gYmluYXJ5IG1vZGUsIGV2ZW4gaWYgbm8gYmluYXJ5IG1vZGUKKyAgICAgICAgd2FzIHNwZWNpZmllZC4gVGhpcyBpcyBkb25lIHRvIGF2b2lkIGRhdGEgbG9zcyBkdWUgdG8gZW5jb2RpbmdzCisgICAgICAgIHVzaW5nIDgtYml0IHZhbHVlcy4gVGhlIGRlZmF1bHQgZmlsZSBtb2RlIGlzICdyYicgbWVhbmluZyB0bworICAgICAgICBvcGVuIHRoZSBmaWxlIGluIGJpbmFyeSByZWFkIG1vZGUuCisKKyAgICAgICAgZW5jb2Rpbmcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB3aGljaCBpcyB0byBiZSB1c2VkIGZvciB0aGUKKyAgICAgICAgZmlsZS4KKworICAgICAgICBlcnJvcnMgbWF5IGJlIGdpdmVuIHRvIGRlZmluZSB0aGUgZXJyb3IgaGFuZGxpbmcuIEl0IGRlZmF1bHRzCisgICAgICAgIHRvICdzdHJpY3QnIHdoaWNoIGNhdXNlcyBWYWx1ZUVycm9ycyB0byBiZSByYWlzZWQgaW4gY2FzZSBhbgorICAgICAgICBlbmNvZGluZyBlcnJvciBvY2N1cnMuCisKKyAgICAgICAgYnVmZmVyaW5nIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIGZvciB0aGUgYnVpbHRpbiBvcGVuKCkgQVBJLgorICAgICAgICBJdCBkZWZhdWx0cyB0byBsaW5lIGJ1ZmZlcmVkLgorCisgICAgICAgIFRoZSByZXR1cm5lZCB3cmFwcGVkIGZpbGUgb2JqZWN0IHByb3ZpZGVzIGFuIGV4dHJhIGF0dHJpYnV0ZQorICAgICAgICAuZW5jb2Rpbmcgd2hpY2ggYWxsb3dzIHF1ZXJ5aW5nIHRoZSB1c2VkIGVuY29kaW5nLiBUaGlzCisgICAgICAgIGF0dHJpYnV0ZSBpcyBvbmx5IGF2YWlsYWJsZSBpZiBhbiBlbmNvZGluZyB3YXMgc3BlY2lmaWVkIGFzCisgICAgICAgIHBhcmFtZXRlci4KKworICAgICIiIgorICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICBpZiAnVScgaW4gbW9kZToKKyAgICAgICAgICAgICMgTm8gYXV0b21hdGljIGNvbnZlcnNpb24gb2YgJ1xuJyBpcyBkb25lIG9uIHJlYWRpbmcgYW5kIHdyaXRpbmcKKyAgICAgICAgICAgIG1vZGUgPSBtb2RlLnN0cmlwKCkucmVwbGFjZSgnVScsICcnKQorICAgICAgICAgICAgaWYgbW9kZVs6MV0gbm90IGluIHNldCgncndhJyk6CisgICAgICAgICAgICAgICAgbW9kZSA9ICdyJyArIG1vZGUKKyAgICAgICAgaWYgJ2InIG5vdCBpbiBtb2RlOgorICAgICAgICAgICAgIyBGb3JjZSBvcGVuaW5nIG9mIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlCisgICAgICAgICAgICBtb2RlID0gbW9kZSArICdiJworICAgIGZpbGUgPSBfX2J1aWx0aW5fXy5vcGVuKGZpbGVuYW1lLCBtb2RlLCBidWZmZXJpbmcpCisgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIGZpbGUKKyAgICBpbmZvID0gbG9va3VwKGVuY29kaW5nKQorICAgIHNydyA9IFN0cmVhbVJlYWRlcldyaXRlcihmaWxlLCBpbmZvLnN0cmVhbXJlYWRlciwgaW5mby5zdHJlYW13cml0ZXIsIGVycm9ycykKKyAgICAjIEFkZCBhdHRyaWJ1dGVzIHRvIHNpbXBsaWZ5IGludHJvc3BlY3Rpb24KKyAgICBzcncuZW5jb2RpbmcgPSBlbmNvZGluZworICAgIHJldHVybiBzcncKKworZGVmIEVuY29kZWRGaWxlKGZpbGUsIGRhdGFfZW5jb2RpbmcsIGZpbGVfZW5jb2Rpbmc9Tm9uZSwgZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBSZXR1cm4gYSB3cmFwcGVkIHZlcnNpb24gb2YgZmlsZSB3aGljaCBwcm92aWRlcyB0cmFuc3BhcmVudAorICAgICAgICBlbmNvZGluZyB0cmFuc2xhdGlvbi4KKworICAgICAgICBTdHJpbmdzIHdyaXR0ZW4gdG8gdGhlIHdyYXBwZWQgZmlsZSBhcmUgaW50ZXJwcmV0ZWQgYWNjb3JkaW5nCisgICAgICAgIHRvIHRoZSBnaXZlbiBkYXRhX2VuY29kaW5nIGFuZCB0aGVuIHdyaXR0ZW4gdG8gdGhlIG9yaWdpbmFsCisgICAgICAgIGZpbGUgYXMgc3RyaW5nIHVzaW5nIGZpbGVfZW5jb2RpbmcuIFRoZSBpbnRlcm1lZGlhdGUgZW5jb2RpbmcKKyAgICAgICAgd2lsbCB1c3VhbGx5IGJlIFVuaWNvZGUgYnV0IGRlcGVuZHMgb24gdGhlIHNwZWNpZmllZCBjb2RlY3MuCisKKyAgICAgICAgU3RyaW5ncyBhcmUgcmVhZCBmcm9tIHRoZSBmaWxlIHVzaW5nIGZpbGVfZW5jb2RpbmcgYW5kIHRoZW4KKyAgICAgICAgcGFzc2VkIGJhY2sgdG8gdGhlIGNhbGxlciBhcyBzdHJpbmcgdXNpbmcgZGF0YV9lbmNvZGluZy4KKworICAgICAgICBJZiBmaWxlX2VuY29kaW5nIGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gZGF0YV9lbmNvZGluZy4KKworICAgICAgICBlcnJvcnMgbWF5IGJlIGdpdmVuIHRvIGRlZmluZSB0aGUgZXJyb3IgaGFuZGxpbmcuIEl0IGRlZmF1bHRzCisgICAgICAgIHRvICdzdHJpY3QnIHdoaWNoIGNhdXNlcyBWYWx1ZUVycm9ycyB0byBiZSByYWlzZWQgaW4gY2FzZSBhbgorICAgICAgICBlbmNvZGluZyBlcnJvciBvY2N1cnMuCisKKyAgICAgICAgVGhlIHJldHVybmVkIHdyYXBwZWQgZmlsZSBvYmplY3QgcHJvdmlkZXMgdHdvIGV4dHJhIGF0dHJpYnV0ZXMKKyAgICAgICAgLmRhdGFfZW5jb2RpbmcgYW5kIC5maWxlX2VuY29kaW5nIHdoaWNoIHJlZmxlY3QgdGhlIGdpdmVuCisgICAgICAgIHBhcmFtZXRlcnMgb2YgdGhlIHNhbWUgbmFtZS4gVGhlIGF0dHJpYnV0ZXMgY2FuIGJlIHVzZWQgZm9yCisgICAgICAgIGludHJvc3BlY3Rpb24gYnkgUHl0aG9uIHByb2dyYW1zLgorCisgICAgIiIiCisgICAgaWYgZmlsZV9lbmNvZGluZyBpcyBOb25lOgorICAgICAgICBmaWxlX2VuY29kaW5nID0gZGF0YV9lbmNvZGluZworICAgIGRhdGFfaW5mbyA9IGxvb2t1cChkYXRhX2VuY29kaW5nKQorICAgIGZpbGVfaW5mbyA9IGxvb2t1cChmaWxlX2VuY29kaW5nKQorICAgIHNyID0gU3RyZWFtUmVjb2RlcihmaWxlLCBkYXRhX2luZm8uZW5jb2RlLCBkYXRhX2luZm8uZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2luZm8uc3RyZWFtcmVhZGVyLCBmaWxlX2luZm8uc3RyZWFtd3JpdGVyLCBlcnJvcnMpCisgICAgIyBBZGQgYXR0cmlidXRlcyB0byBzaW1wbGlmeSBpbnRyb3NwZWN0aW9uCisgICAgc3IuZGF0YV9lbmNvZGluZyA9IGRhdGFfZW5jb2RpbmcKKyAgICBzci5maWxlX2VuY29kaW5nID0gZmlsZV9lbmNvZGluZworICAgIHJldHVybiBzcgorCisjIyMgSGVscGVycyBmb3IgY29kZWMgbG9va3VwCisKK2RlZiBnZXRlbmNvZGVyKGVuY29kaW5nKToKKworICAgICIiIiBMb29rdXAgdXAgdGhlIGNvZGVjIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIHJldHVybgorICAgICAgICBpdHMgZW5jb2RlciBmdW5jdGlvbi4KKworICAgICAgICBSYWlzZXMgYSBMb29rdXBFcnJvciBpbiBjYXNlIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gbG9va3VwKGVuY29kaW5nKS5lbmNvZGUKKworZGVmIGdldGRlY29kZXIoZW5jb2RpbmcpOgorCisgICAgIiIiIExvb2t1cCB1cCB0aGUgY29kZWMgZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgcmV0dXJuCisgICAgICAgIGl0cyBkZWNvZGVyIGZ1bmN0aW9uLgorCisgICAgICAgIFJhaXNlcyBhIExvb2t1cEVycm9yIGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZC4KKworICAgICIiIgorICAgIHJldHVybiBsb29rdXAoZW5jb2RpbmcpLmRlY29kZQorCitkZWYgZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKToKKworICAgICIiIiBMb29rdXAgdXAgdGhlIGNvZGVjIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIHJldHVybgorICAgICAgICBpdHMgSW5jcmVtZW50YWxFbmNvZGVyIGNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb24uCisKKyAgICAgICAgUmFpc2VzIGEgTG9va3VwRXJyb3IgaW4gY2FzZSB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kCisgICAgICAgIG9yIHRoZSBjb2RlY3MgZG9lc24ndCBwcm92aWRlIGFuIGluY3JlbWVudGFsIGVuY29kZXIuCisKKyAgICAiIiIKKyAgICBlbmNvZGVyID0gbG9va3VwKGVuY29kaW5nKS5pbmNyZW1lbnRhbGVuY29kZXIKKyAgICBpZiBlbmNvZGVyIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIExvb2t1cEVycm9yKGVuY29kaW5nKQorICAgIHJldHVybiBlbmNvZGVyCisKK2RlZiBnZXRpbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcpOgorCisgICAgIiIiIExvb2t1cCB1cCB0aGUgY29kZWMgZm9yIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgcmV0dXJuCisgICAgICAgIGl0cyBJbmNyZW1lbnRhbERlY29kZXIgY2xhc3Mgb3IgZmFjdG9yeSBmdW5jdGlvbi4KKworICAgICAgICBSYWlzZXMgYSBMb29rdXBFcnJvciBpbiBjYXNlIHRoZSBlbmNvZGluZyBjYW5ub3QgYmUgZm91bmQKKyAgICAgICAgb3IgdGhlIGNvZGVjcyBkb2Vzbid0IHByb3ZpZGUgYW4gaW5jcmVtZW50YWwgZGVjb2Rlci4KKworICAgICIiIgorICAgIGRlY29kZXIgPSBsb29rdXAoZW5jb2RpbmcpLmluY3JlbWVudGFsZGVjb2RlcgorICAgIGlmIGRlY29kZXIgaXMgTm9uZToKKyAgICAgICAgcmFpc2UgTG9va3VwRXJyb3IoZW5jb2RpbmcpCisgICAgcmV0dXJuIGRlY29kZXIKKworZGVmIGdldHJlYWRlcihlbmNvZGluZyk6CisKKyAgICAiIiIgTG9va3VwIHVwIHRoZSBjb2RlYyBmb3IgdGhlIGdpdmVuIGVuY29kaW5nIGFuZCByZXR1cm4KKyAgICAgICAgaXRzIFN0cmVhbVJlYWRlciBjbGFzcyBvciBmYWN0b3J5IGZ1bmN0aW9uLgorCisgICAgICAgIFJhaXNlcyBhIExvb2t1cEVycm9yIGluIGNhc2UgdGhlIGVuY29kaW5nIGNhbm5vdCBiZSBmb3VuZC4KKworICAgICIiIgorICAgIHJldHVybiBsb29rdXAoZW5jb2RpbmcpLnN0cmVhbXJlYWRlcgorCitkZWYgZ2V0d3JpdGVyKGVuY29kaW5nKToKKworICAgICIiIiBMb29rdXAgdXAgdGhlIGNvZGVjIGZvciB0aGUgZ2l2ZW4gZW5jb2RpbmcgYW5kIHJldHVybgorICAgICAgICBpdHMgU3RyZWFtV3JpdGVyIGNsYXNzIG9yIGZhY3RvcnkgZnVuY3Rpb24uCisKKyAgICAgICAgUmFpc2VzIGEgTG9va3VwRXJyb3IgaW4gY2FzZSB0aGUgZW5jb2RpbmcgY2Fubm90IGJlIGZvdW5kLgorCisgICAgIiIiCisgICAgcmV0dXJuIGxvb2t1cChlbmNvZGluZykuc3RyZWFtd3JpdGVyCisKK2RlZiBpdGVyZW5jb2RlKGl0ZXJhdG9yLCBlbmNvZGluZywgZXJyb3JzPSdzdHJpY3QnLCAqKmt3YXJncyk6CisgICAgIiIiCisgICAgRW5jb2RpbmcgaXRlcmF0b3IuCisKKyAgICBFbmNvZGVzIHRoZSBpbnB1dCBzdHJpbmdzIGZyb20gdGhlIGl0ZXJhdG9yIHVzaW5nIGEgSW5jcmVtZW50YWxFbmNvZGVyLgorCisgICAgZXJyb3JzIGFuZCBrd2FyZ3MgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBJbmNyZW1lbnRhbEVuY29kZXIKKyAgICBjb25zdHJ1Y3Rvci4KKyAgICAiIiIKKyAgICBlbmNvZGVyID0gZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKShlcnJvcnMsICoqa3dhcmdzKQorICAgIGZvciBpbnB1dCBpbiBpdGVyYXRvcjoKKyAgICAgICAgb3V0cHV0ID0gZW5jb2Rlci5lbmNvZGUoaW5wdXQpCisgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgIHlpZWxkIG91dHB1dAorICAgIG91dHB1dCA9IGVuY29kZXIuZW5jb2RlKCIiLCBUcnVlKQorICAgIGlmIG91dHB1dDoKKyAgICAgICAgeWllbGQgb3V0cHV0CisKK2RlZiBpdGVyZGVjb2RlKGl0ZXJhdG9yLCBlbmNvZGluZywgZXJyb3JzPSdzdHJpY3QnLCAqKmt3YXJncyk6CisgICAgIiIiCisgICAgRGVjb2RpbmcgaXRlcmF0b3IuCisKKyAgICBEZWNvZGVzIHRoZSBpbnB1dCBzdHJpbmdzIGZyb20gdGhlIGl0ZXJhdG9yIHVzaW5nIGEgSW5jcmVtZW50YWxEZWNvZGVyLgorCisgICAgZXJyb3JzIGFuZCBrd2FyZ3MgYXJlIHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBJbmNyZW1lbnRhbERlY29kZXIKKyAgICBjb25zdHJ1Y3Rvci4KKyAgICAiIiIKKyAgICBkZWNvZGVyID0gZ2V0aW5jcmVtZW50YWxkZWNvZGVyKGVuY29kaW5nKShlcnJvcnMsICoqa3dhcmdzKQorICAgIGZvciBpbnB1dCBpbiBpdGVyYXRvcjoKKyAgICAgICAgb3V0cHV0ID0gZGVjb2Rlci5kZWNvZGUoaW5wdXQpCisgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgIHlpZWxkIG91dHB1dAorICAgIG91dHB1dCA9IGRlY29kZXIuZGVjb2RlKCIiLCBUcnVlKQorICAgIGlmIG91dHB1dDoKKyAgICAgICAgeWllbGQgb3V0cHV0CisKKyMjIyBIZWxwZXJzIGZvciBjaGFybWFwLWJhc2VkIGNvZGVjcworCitkZWYgbWFrZV9pZGVudGl0eV9kaWN0KHJuZyk6CisKKyAgICAiIiIgbWFrZV9pZGVudGl0eV9kaWN0KHJuZykgLT4gZGljdAorCisgICAgICAgIFJldHVybiBhIGRpY3Rpb25hcnkgd2hlcmUgZWxlbWVudHMgb2YgdGhlIHJuZyBzZXF1ZW5jZSBhcmUKKyAgICAgICAgbWFwcGVkIHRvIHRoZW1zZWx2ZXMuCisKKyAgICAiIiIKKyAgICByZXMgPSB7fQorICAgIGZvciBpIGluIHJuZzoKKyAgICAgICAgcmVzW2ldPWkKKyAgICByZXR1cm4gcmVzCisKK2RlZiBtYWtlX2VuY29kaW5nX21hcChkZWNvZGluZ19tYXApOgorCisgICAgIiIiIENyZWF0ZXMgYW4gZW5jb2RpbmcgbWFwIGZyb20gYSBkZWNvZGluZyBtYXAuCisKKyAgICAgICAgSWYgYSB0YXJnZXQgbWFwcGluZyBpbiB0aGUgZGVjb2RpbmcgbWFwIG9jY3VycyBtdWx0aXBsZQorICAgICAgICB0aW1lcywgdGhlbiB0aGF0IHRhcmdldCBpcyBtYXBwZWQgdG8gTm9uZSAodW5kZWZpbmVkIG1hcHBpbmcpLAorICAgICAgICBjYXVzaW5nIGFuIGV4Y2VwdGlvbiB3aGVuIGVuY291bnRlcmVkIGJ5IHRoZSBjaGFybWFwIGNvZGVjCisgICAgICAgIGR1cmluZyB0cmFuc2xhdGlvbi4KKworICAgICAgICBPbmUgZXhhbXBsZSB3aGVyZSB0aGlzIGhhcHBlbnMgaXMgY3A4NzUucHkgd2hpY2ggZGVjb2RlcworICAgICAgICBtdWx0aXBsZSBjaGFyYWN0ZXIgdG8gXHUwMDFhLgorCisgICAgIiIiCisgICAgbSA9IHt9CisgICAgZm9yIGssdiBpbiBkZWNvZGluZ19tYXAuaXRlbXMoKToKKyAgICAgICAgaWYgbm90IHYgaW4gbToKKyAgICAgICAgICAgIG1bdl0gPSBrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtW3ZdID0gTm9uZQorICAgIHJldHVybiBtCisKKyMjIyBlcnJvciBoYW5kbGVycworCit0cnk6CisgICAgc3RyaWN0X2Vycm9ycyA9IGxvb2t1cF9lcnJvcigic3RyaWN0IikKKyAgICBpZ25vcmVfZXJyb3JzID0gbG9va3VwX2Vycm9yKCJpZ25vcmUiKQorICAgIHJlcGxhY2VfZXJyb3JzID0gbG9va3VwX2Vycm9yKCJyZXBsYWNlIikKKyAgICB4bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMgPSBsb29rdXBfZXJyb3IoInhtbGNoYXJyZWZyZXBsYWNlIikKKyAgICBiYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyA9IGxvb2t1cF9lcnJvcigiYmFja3NsYXNocmVwbGFjZSIpCitleGNlcHQgTG9va3VwRXJyb3I6CisgICAgIyBJbiAtLWRpc2FibGUtdW5pY29kZSBidWlsZHMsIHRoZXNlIGVycm9yIGhhbmRsZXIgYXJlIG1pc3NpbmcKKyAgICBzdHJpY3RfZXJyb3JzID0gTm9uZQorICAgIGlnbm9yZV9lcnJvcnMgPSBOb25lCisgICAgcmVwbGFjZV9lcnJvcnMgPSBOb25lCisgICAgeG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzID0gTm9uZQorICAgIGJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzID0gTm9uZQorCisjIFRlbGwgbW9kdWxlZmluZGVyIHRoYXQgdXNpbmcgY29kZWNzIHByb2JhYmx5IG5lZWRzIHRoZSBlbmNvZGluZ3MKKyMgcGFja2FnZQorX2ZhbHNlID0gMAoraWYgX2ZhbHNlOgorICAgIGltcG9ydCBlbmNvZGluZ3MKKworIyMjIFRlc3RzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisKKyAgICAjIE1ha2Ugc3Rkb3V0IHRyYW5zbGF0ZSBMYXRpbi0xIG91dHB1dCBpbnRvIFVURi04IG91dHB1dAorICAgIHN5cy5zdGRvdXQgPSBFbmNvZGVkRmlsZShzeXMuc3Rkb3V0LCAnbGF0aW4tMScsICd1dGYtOCcpCisKKyAgICAjIEhhdmUgc3RkaW4gdHJhbnNsYXRlIExhdGluLTEgaW5wdXQgaW50byBVVEYtOCBpbnB1dAorICAgIHN5cy5zdGRpbiA9IEVuY29kZWRGaWxlKHN5cy5zdGRpbiwgJ3V0Zi04JywgJ2xhdGluLTEnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2RlY3MucHljIGIvbGliL3B5dGhvbjIuNy9jb2RlY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2FkODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvZGVjcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2RlY3MucHlvIGIvbGliL3B5dGhvbjIuNy9jb2RlY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0M2FkODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvZGVjcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHkgYi9saWIvcHl0aG9uMi43L2NvZGVvcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjE2ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHkKQEAgLTAsMCArMSwxNjggQEAKK3IiIiJVdGlsaXRpZXMgdG8gY29tcGlsZSBwb3NzaWJseSBpbmNvbXBsZXRlIFB5dGhvbiBzb3VyY2UgY29kZS4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgdHdvIGludGVyZmFjZXMsIGJyb2FkbHkgc2ltaWxhciB0byB0aGUgYnVpbHRpbgorZnVuY3Rpb24gY29tcGlsZSgpLCB3aGljaCB0YWtlIHByb2dyYW0gdGV4dCwgYSBmaWxlbmFtZSBhbmQgYSAnbW9kZScKK2FuZDoKKworLSBSZXR1cm4gY29kZSBvYmplY3QgaWYgdGhlIGNvbW1hbmQgaXMgY29tcGxldGUgYW5kIHZhbGlkCistIFJldHVybiBOb25lIGlmIHRoZSBjb21tYW5kIGlzIGluY29tcGxldGUKKy0gUmFpc2UgU3ludGF4RXJyb3IsIFZhbHVlRXJyb3Igb3IgT3ZlcmZsb3dFcnJvciBpZiB0aGUgY29tbWFuZCBpcyBhCisgIHN5bnRheCBlcnJvciAoT3ZlcmZsb3dFcnJvciBhbmQgVmFsdWVFcnJvciBjYW4gYmUgcHJvZHVjZWQgYnkKKyAgbWFsZm9ybWVkIGxpdGVyYWxzKS4KKworQXBwcm9hY2g6CisKK0ZpcnN0LCBjaGVjayBpZiB0aGUgc291cmNlIGNvbnNpc3RzIGVudGlyZWx5IG9mIGJsYW5rIGxpbmVzIGFuZAorY29tbWVudHM7IGlmIHNvLCByZXBsYWNlIGl0IHdpdGggJ3Bhc3MnLCBiZWNhdXNlIHRoZSBidWlsdC1pbgorcGFyc2VyIGRvZXNuJ3QgYWx3YXlzIGRvIHRoZSByaWdodCB0aGluZyBmb3IgdGhlc2UuCisKK0NvbXBpbGUgdGhyZWUgdGltZXM6IGFzIGlzLCB3aXRoIFxuLCBhbmQgd2l0aCBcblxuIGFwcGVuZGVkLiAgSWYgaXQKK2NvbXBpbGVzIGFzIGlzLCBpdCdzIGNvbXBsZXRlLiAgSWYgaXQgY29tcGlsZXMgd2l0aCBvbmUgXG4gYXBwZW5kZWQsCit3ZSBleHBlY3QgbW9yZS4gIElmIGl0IGRvZXNuJ3QgY29tcGlsZSBlaXRoZXIgd2F5LCB3ZSBjb21wYXJlIHRoZQorZXJyb3Igd2UgZ2V0IHdoZW4gY29tcGlsaW5nIHdpdGggXG4gb3IgXG5cbiBhcHBlbmRlZC4gIElmIHRoZSBlcnJvcnMKK2FyZSB0aGUgc2FtZSwgdGhlIGNvZGUgaXMgYnJva2VuLiAgQnV0IGlmIHRoZSBlcnJvcnMgYXJlIGRpZmZlcmVudCwgd2UKK2V4cGVjdCBtb3JlLiAgTm90IGludHVpdGl2ZTsgbm90IGV2ZW4gZ3VhcmFudGVlZCB0byBob2xkIGluIGZ1dHVyZQorcmVsZWFzZXM7IGJ1dCB0aGlzIG1hdGNoZXMgdGhlIGNvbXBpbGVyJ3MgYmVoYXZpb3IgZnJvbSBQeXRob24gMS40Cit0aHJvdWdoIDIuMiwgYXQgbGVhc3QuCisKK0NhdmVhdDoKKworSXQgaXMgcG9zc2libGUgKGJ1dCBub3QgbGlrZWx5KSB0aGF0IHRoZSBwYXJzZXIgc3RvcHMgcGFyc2luZyB3aXRoIGEKK3N1Y2Nlc3NmdWwgb3V0Y29tZSBiZWZvcmUgcmVhY2hpbmcgdGhlIGVuZCBvZiB0aGUgc291cmNlOyBpbiB0aGlzCitjYXNlLCB0cmFpbGluZyBzeW1ib2xzIG1heSBiZSBpZ25vcmVkIGluc3RlYWQgb2YgY2F1c2luZyBhbiBlcnJvci4KK0ZvciBleGFtcGxlLCBhIGJhY2tzbGFzaCBmb2xsb3dlZCBieSB0d28gbmV3bGluZXMgbWF5IGJlIGZvbGxvd2VkIGJ5CithcmJpdHJhcnkgZ2FyYmFnZS4gIFRoaXMgd2lsbCBiZSBmaXhlZCBvbmNlIHRoZSBBUEkgZm9yIHRoZSBwYXJzZXIgaXMKK2JldHRlci4KKworVGhlIHR3byBpbnRlcmZhY2VzIGFyZToKKworY29tcGlsZV9jb21tYW5kKHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCk6CisKKyAgICBDb21waWxlcyBhIHNpbmdsZSBjb21tYW5kIGluIHRoZSBtYW5uZXIgZGVzY3JpYmVkIGFib3ZlLgorCitDb21tYW5kQ29tcGlsZXIoKToKKworICAgIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGhhdmUgX19jYWxsX18gbWV0aG9kcyBpZGVudGljYWwgaW4KKyAgICBzaWduYXR1cmUgdG8gY29tcGlsZV9jb21tYW5kOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGlmIHRoZQorICAgIGluc3RhbmNlIGNvbXBpbGVzIHByb2dyYW0gdGV4dCBjb250YWluaW5nIGEgX19mdXR1cmVfXyBzdGF0ZW1lbnQsCisgICAgdGhlIGluc3RhbmNlICdyZW1lbWJlcnMnIGFuZCBjb21waWxlcyBhbGwgc3Vic2VxdWVudCBwcm9ncmFtIHRleHRzCisgICAgd2l0aCB0aGUgc3RhdGVtZW50IGluIGZvcmNlLgorCitUaGUgbW9kdWxlIGFsc28gcHJvdmlkZXMgYW5vdGhlciBjbGFzczoKKworQ29tcGlsZSgpOgorCisgICAgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYWN0IGxpa2UgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGNvbXBpbGUsCisgICAgYnV0IHdpdGggJ21lbW9yeScgaW4gdGhlIHNlbnNlIGRlc2NyaWJlZCBhYm92ZS4KKyIiIgorCitpbXBvcnQgX19mdXR1cmVfXworCitfZmVhdHVyZXMgPSBbZ2V0YXR0cihfX2Z1dHVyZV9fLCBmbmFtZSkKKyAgICAgICAgICAgICBmb3IgZm5hbWUgaW4gX19mdXR1cmVfXy5hbGxfZmVhdHVyZV9uYW1lc10KKworX19hbGxfXyA9IFsiY29tcGlsZV9jb21tYW5kIiwgIkNvbXBpbGUiLCAiQ29tbWFuZENvbXBpbGVyIl0KKworUHlDRl9ET05UX0lNUExZX0RFREVOVCA9IDB4MjAwICAgICAgICAgICMgTWF0Y2hlcyBweXRob25ydW4uaAorCitkZWYgX21heWJlX2NvbXBpbGUoY29tcGlsZXIsIHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCk6CisgICAgIyBDaGVjayBmb3Igc291cmNlIGNvbnNpc3Rpbmcgb2Ygb25seSBibGFuayBsaW5lcyBhbmQgY29tbWVudHMKKyAgICBmb3IgbGluZSBpbiBzb3VyY2Uuc3BsaXQoIlxuIik6CisgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgaWYgbGluZSBhbmQgbGluZVswXSAhPSAnIyc6CisgICAgICAgICAgICBicmVhayAgICAgICAgICAgICAgICMgTGVhdmUgaXQgYWxvbmUKKyAgICBlbHNlOgorICAgICAgICBpZiBzeW1ib2wgIT0gImV2YWwiOgorICAgICAgICAgICAgc291cmNlID0gInBhc3MiICAgICAjIFJlcGxhY2UgaXQgd2l0aCBhICdwYXNzJyBzdGF0ZW1lbnQKKworICAgIGVyciA9IGVycjEgPSBlcnIyID0gTm9uZQorICAgIGNvZGUgPSBjb2RlMSA9IGNvZGUyID0gTm9uZQorCisgICAgdHJ5OgorICAgICAgICBjb2RlID0gY29tcGlsZXIoc291cmNlLCBmaWxlbmFtZSwgc3ltYm9sKQorICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgZXJyOgorICAgICAgICBwYXNzCisKKyAgICB0cnk6CisgICAgICAgIGNvZGUxID0gY29tcGlsZXIoc291cmNlICsgIlxuIiwgZmlsZW5hbWUsIHN5bWJvbCkKKyAgICBleGNlcHQgU3ludGF4RXJyb3IsIGVycjE6CisgICAgICAgIHBhc3MKKworICAgIHRyeToKKyAgICAgICAgY29kZTIgPSBjb21waWxlcihzb3VyY2UgKyAiXG5cbiIsIGZpbGVuYW1lLCBzeW1ib2wpCisgICAgZXhjZXB0IFN5bnRheEVycm9yLCBlcnIyOgorICAgICAgICBwYXNzCisKKyAgICBpZiBjb2RlOgorICAgICAgICByZXR1cm4gY29kZQorICAgIGlmIG5vdCBjb2RlMSBhbmQgcmVwcihlcnIxKSA9PSByZXByKGVycjIpOgorICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgZXJyMQorCitkZWYgX2NvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgc3ltYm9sKToKKyAgICByZXR1cm4gY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCBzeW1ib2wsIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQpCisKK2RlZiBjb21waWxlX2NvbW1hbmQoc291cmNlLCBmaWxlbmFtZT0iPGlucHV0PiIsIHN5bWJvbD0ic2luZ2xlIik6CisgICAgciIiIkNvbXBpbGUgYSBjb21tYW5kIGFuZCBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBpbmNvbXBsZXRlLgorCisgICAgQXJndW1lbnRzOgorCisgICAgc291cmNlIC0tIHRoZSBzb3VyY2Ugc3RyaW5nOyBtYXkgY29udGFpbiBcbiBjaGFyYWN0ZXJzCisgICAgZmlsZW5hbWUgLS0gb3B0aW9uYWwgZmlsZW5hbWUgZnJvbSB3aGljaCBzb3VyY2Ugd2FzIHJlYWQ7IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAiPGlucHV0PiIKKyAgICBzeW1ib2wgLS0gb3B0aW9uYWwgZ3JhbW1hciBzdGFydCBzeW1ib2w7ICJzaW5nbGUiIChkZWZhdWx0KSBvciAiZXZhbCIKKworICAgIFJldHVybiB2YWx1ZSAvIGV4Y2VwdGlvbnMgcmFpc2VkOgorCisgICAgLSBSZXR1cm4gYSBjb2RlIG9iamVjdCBpZiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZSBhbmQgdmFsaWQKKyAgICAtIFJldHVybiBOb25lIGlmIHRoZSBjb21tYW5kIGlzIGluY29tcGxldGUKKyAgICAtIFJhaXNlIFN5bnRheEVycm9yLCBWYWx1ZUVycm9yIG9yIE92ZXJmbG93RXJyb3IgaWYgdGhlIGNvbW1hbmQgaXMgYQorICAgICAgc3ludGF4IGVycm9yIChPdmVyZmxvd0Vycm9yIGFuZCBWYWx1ZUVycm9yIGNhbiBiZSBwcm9kdWNlZCBieQorICAgICAgbWFsZm9ybWVkIGxpdGVyYWxzKS4KKyAgICAiIiIKKyAgICByZXR1cm4gX21heWJlX2NvbXBpbGUoX2NvbXBpbGUsIHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCkKKworY2xhc3MgQ29tcGlsZToKKyAgICAiIiJJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBiZWhhdmUgbXVjaCBsaWtlIHRoZSBidWlsdC1pbiBjb21waWxlCisgICAgZnVuY3Rpb24sIGJ1dCBpZiBvbmUgaXMgdXNlZCB0byBjb21waWxlIHRleHQgY29udGFpbmluZyBhIGZ1dHVyZQorICAgIHN0YXRlbWVudCwgaXQgInJlbWVtYmVycyIgYW5kIGNvbXBpbGVzIGFsbCBzdWJzZXF1ZW50IHByb2dyYW0gdGV4dHMKKyAgICB3aXRoIHRoZSBzdGF0ZW1lbnQgaW4gZm9yY2UuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmZsYWdzID0gUHlDRl9ET05UX0lNUExZX0RFREVOVAorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHNvdXJjZSwgZmlsZW5hbWUsIHN5bWJvbCk6CisgICAgICAgIGNvZGVvYiA9IGNvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgc3ltYm9sLCBzZWxmLmZsYWdzLCAxKQorICAgICAgICBmb3IgZmVhdHVyZSBpbiBfZmVhdHVyZXM6CisgICAgICAgICAgICBpZiBjb2Rlb2IuY29fZmxhZ3MgJiBmZWF0dXJlLmNvbXBpbGVyX2ZsYWc6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFncyB8PSBmZWF0dXJlLmNvbXBpbGVyX2ZsYWcKKyAgICAgICAgcmV0dXJuIGNvZGVvYgorCitjbGFzcyBDb21tYW5kQ29tcGlsZXI6CisgICAgIiIiSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgaGF2ZSBfX2NhbGxfXyBtZXRob2RzIGlkZW50aWNhbCBpbgorICAgIHNpZ25hdHVyZSB0byBjb21waWxlX2NvbW1hbmQ7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgaWYgdGhlCisgICAgaW5zdGFuY2UgY29tcGlsZXMgcHJvZ3JhbSB0ZXh0IGNvbnRhaW5pbmcgYSBfX2Z1dHVyZV9fIHN0YXRlbWVudCwKKyAgICB0aGUgaW5zdGFuY2UgJ3JlbWVtYmVycycgYW5kIGNvbXBpbGVzIGFsbCBzdWJzZXF1ZW50IHByb2dyYW0gdGV4dHMKKyAgICB3aXRoIHRoZSBzdGF0ZW1lbnQgaW4gZm9yY2UuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwpOgorICAgICAgICBzZWxmLmNvbXBpbGVyID0gQ29tcGlsZSgpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgc291cmNlLCBmaWxlbmFtZT0iPGlucHV0PiIsIHN5bWJvbD0ic2luZ2xlIik6CisgICAgICAgIHIiIiJDb21waWxlIGEgY29tbWFuZCBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgaW5jb21wbGV0ZS4KKworICAgICAgICBBcmd1bWVudHM6CisKKyAgICAgICAgc291cmNlIC0tIHRoZSBzb3VyY2Ugc3RyaW5nOyBtYXkgY29udGFpbiBcbiBjaGFyYWN0ZXJzCisgICAgICAgIGZpbGVuYW1lIC0tIG9wdGlvbmFsIGZpbGVuYW1lIGZyb20gd2hpY2ggc291cmNlIHdhcyByZWFkOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ICI8aW5wdXQ+IgorICAgICAgICBzeW1ib2wgLS0gb3B0aW9uYWwgZ3JhbW1hciBzdGFydCBzeW1ib2w7ICJzaW5nbGUiIChkZWZhdWx0KSBvcgorICAgICAgICAgICAgICAgICAgImV2YWwiCisKKyAgICAgICAgUmV0dXJuIHZhbHVlIC8gZXhjZXB0aW9ucyByYWlzZWQ6CisKKyAgICAgICAgLSBSZXR1cm4gYSBjb2RlIG9iamVjdCBpZiB0aGUgY29tbWFuZCBpcyBjb21wbGV0ZSBhbmQgdmFsaWQKKyAgICAgICAgLSBSZXR1cm4gTm9uZSBpZiB0aGUgY29tbWFuZCBpcyBpbmNvbXBsZXRlCisgICAgICAgIC0gUmFpc2UgU3ludGF4RXJyb3IsIFZhbHVlRXJyb3Igb3IgT3ZlcmZsb3dFcnJvciBpZiB0aGUgY29tbWFuZCBpcyBhCisgICAgICAgICAgc3ludGF4IGVycm9yIChPdmVyZmxvd0Vycm9yIGFuZCBWYWx1ZUVycm9yIGNhbiBiZSBwcm9kdWNlZCBieQorICAgICAgICAgIG1hbGZvcm1lZCBsaXRlcmFscykuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gX21heWJlX2NvbXBpbGUoc2VsZi5jb21waWxlciwgc291cmNlLCBmaWxlbmFtZSwgc3ltYm9sKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHljIGIvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWY3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvZGVvcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHlvIGIvbGliL3B5dGhvbjIuNy9jb2Rlb3AucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWY3ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvZGVvcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2xsZWN0aW9ucy5weSBiL2xpYi9weXRob24yLjcvY29sbGVjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzMmU0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29sbGVjdGlvbnMucHkKQEAgLTAsMCArMSw2OTMgQEAKK19fYWxsX18gPSBbJ0NvdW50ZXInLCAnZGVxdWUnLCAnZGVmYXVsdGRpY3QnLCAnbmFtZWR0dXBsZScsICdPcmRlcmVkRGljdCddCisjIEZvciBib290c3RyYXBwaW5nIHJlYXNvbnMsIHRoZSBjb2xsZWN0aW9uIEFCQ3MgYXJlIGRlZmluZWQgaW4gX2FiY29sbC5weS4KKyMgVGhleSBzaG91bGQgaG93ZXZlciBiZSBjb25zaWRlcmVkIGFuIGludGVncmFsIHBhcnQgb2YgY29sbGVjdGlvbnMucHkuCitmcm9tIF9hYmNvbGwgaW1wb3J0ICoKK2ltcG9ydCBfYWJjb2xsCitfX2FsbF9fICs9IF9hYmNvbGwuX19hbGxfXworCitmcm9tIF9jb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUsIGRlZmF1bHRkaWN0Citmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyIGFzIF9pdGVtZ2V0dGVyLCBlcSBhcyBfZXEKK2Zyb20ga2V5d29yZCBpbXBvcnQgaXNrZXl3b3JkIGFzIF9pc2tleXdvcmQKK2ltcG9ydCBzeXMgYXMgX3N5cworaW1wb3J0IGhlYXBxIGFzIF9oZWFwcQorZnJvbSBpdGVydG9vbHMgaW1wb3J0IHJlcGVhdCBhcyBfcmVwZWF0LCBjaGFpbiBhcyBfY2hhaW4sIHN0YXJtYXAgYXMgX3N0YXJtYXAKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwIGFzIF9pbWFwCisKK3RyeToKKyAgICBmcm9tIHRocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIGR1bW15X3RocmVhZCBpbXBvcnQgZ2V0X2lkZW50IGFzIF9nZXRfaWRlbnQKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIE9yZGVyZWREaWN0CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBPcmRlcmVkRGljdChkaWN0KToKKyAgICAnRGljdGlvbmFyeSB0aGF0IHJlbWVtYmVycyBpbnNlcnRpb24gb3JkZXInCisgICAgIyBBbiBpbmhlcml0ZWQgZGljdCBtYXBzIGtleXMgdG8gdmFsdWVzLgorICAgICMgVGhlIGluaGVyaXRlZCBkaWN0IHByb3ZpZGVzIF9fZ2V0aXRlbV9fLCBfX2xlbl9fLCBfX2NvbnRhaW5zX18sIGFuZCBnZXQuCisgICAgIyBUaGUgcmVtYWluaW5nIG1ldGhvZHMgYXJlIG9yZGVyLWF3YXJlLgorICAgICMgQmlnLU8gcnVubmluZyB0aW1lcyBmb3IgYWxsIG1ldGhvZHMgYXJlIHRoZSBzYW1lIGFzIHJlZ3VsYXIgZGljdGlvbmFyaWVzLgorCisgICAgIyBUaGUgaW50ZXJuYWwgc2VsZi5fX21hcCBkaWN0IG1hcHMga2V5cyB0byBsaW5rcyBpbiBhIGRvdWJseSBsaW5rZWQgbGlzdC4KKyAgICAjIFRoZSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3Qgc3RhcnRzIGFuZCBlbmRzIHdpdGggYSBzZW50aW5lbCBlbGVtZW50LgorICAgICMgVGhlIHNlbnRpbmVsIGVsZW1lbnQgbmV2ZXIgZ2V0cyBkZWxldGVkICh0aGlzIHNpbXBsaWZpZXMgdGhlIGFsZ29yaXRobSkuCisgICAgIyBFYWNoIGxpbmsgaXMgc3RvcmVkIGFzIGEgbGlzdCBvZiBsZW5ndGggdGhyZWU6ICBbUFJFViwgTkVYVCwgS0VZXS4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgJycnSW5pdGlhbGl6ZSBhbiBvcmRlcmVkIGRpY3Rpb25hcnkuICBUaGUgc2lnbmF0dXJlIGlzIHRoZSBzYW1lIGFzCisgICAgICAgIHJlZ3VsYXIgZGljdGlvbmFyaWVzLCBidXQga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlCisgICAgICAgIHRoZWlyIGluc2VydGlvbiBvcmRlciBpcyBhcmJpdHJhcnkuCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2V4cGVjdGVkIGF0IG1vc3QgMSBhcmd1bWVudHMsIGdvdCAlZCcgJSBsZW4oYXJncykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX19yb290CisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuX19yb290ID0gcm9vdCA9IFtdICAgICAgICAgICAgICAgICAgICAgIyBzZW50aW5lbCBub2RlCisgICAgICAgICAgICByb290WzpdID0gW3Jvb3QsIHJvb3QsIE5vbmVdCisgICAgICAgICAgICBzZWxmLl9fbWFwID0ge30KKyAgICAgICAgc2VsZi5fX3VwZGF0ZSgqYXJncywgKiprd2RzKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUsIGRpY3Rfc2V0aXRlbT1kaWN0Ll9fc2V0aXRlbV9fKToKKyAgICAgICAgJ29kLl9fc2V0aXRlbV9fKGksIHkpIDw9PT4gb2RbaV09eScKKyAgICAgICAgIyBTZXR0aW5nIGEgbmV3IGl0ZW0gY3JlYXRlcyBhIG5ldyBsaW5rIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0LAorICAgICAgICAjIGFuZCB0aGUgaW5oZXJpdGVkIGRpY3Rpb25hcnkgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcga2V5L3ZhbHVlIHBhaXIuCisgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHJvb3QgPSBzZWxmLl9fcm9vdAorICAgICAgICAgICAgbGFzdCA9IHJvb3RbMF0KKyAgICAgICAgICAgIGxhc3RbMV0gPSByb290WzBdID0gc2VsZi5fX21hcFtrZXldID0gW2xhc3QsIHJvb3QsIGtleV0KKyAgICAgICAgcmV0dXJuIGRpY3Rfc2V0aXRlbShzZWxmLCBrZXksIHZhbHVlKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSwgZGljdF9kZWxpdGVtPWRpY3QuX19kZWxpdGVtX18pOgorICAgICAgICAnb2QuX19kZWxpdGVtX18oeSkgPD09PiBkZWwgb2RbeV0nCisgICAgICAgICMgRGVsZXRpbmcgYW4gZXhpc3RpbmcgaXRlbSB1c2VzIHNlbGYuX19tYXAgdG8gZmluZCB0aGUgbGluayB3aGljaCBnZXRzCisgICAgICAgICMgcmVtb3ZlZCBieSB1cGRhdGluZyB0aGUgbGlua3MgaW4gdGhlIHByZWRlY2Vzc29yIGFuZCBzdWNjZXNzb3Igbm9kZXMuCisgICAgICAgIGRpY3RfZGVsaXRlbShzZWxmLCBrZXkpCisgICAgICAgIGxpbmtfcHJldiwgbGlua19uZXh0LCBfID0gc2VsZi5fX21hcC5wb3Aoa2V5KQorICAgICAgICBsaW5rX3ByZXZbMV0gPSBsaW5rX25leHQgICAgICAgICAgICAgICAgICAgICAgICAjIHVwZGF0ZSBsaW5rX3ByZXZbTkVYVF0KKyAgICAgICAgbGlua19uZXh0WzBdID0gbGlua19wcmV2ICAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgbGlua19uZXh0W1BSRVZdCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICdvZC5fX2l0ZXJfXygpIDw9PT4gaXRlcihvZCknCisgICAgICAgICMgVHJhdmVyc2UgdGhlIGxpbmtlZCBsaXN0IGluIG9yZGVyLgorICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKKyAgICAgICAgY3VyciA9IHJvb3RbMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydCBhdCB0aGUgZmlyc3Qgbm9kZQorICAgICAgICB3aGlsZSBjdXJyIGlzIG5vdCByb290OgorICAgICAgICAgICAgeWllbGQgY3VyclsyXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHlpZWxkIHRoZSBjdXJyW0tFWV0KKyAgICAgICAgICAgIGN1cnIgPSBjdXJyWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtb3ZlIHRvIG5leHQgbm9kZQorCisgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgJ29kLl9fcmV2ZXJzZWRfXygpIDw9PT4gcmV2ZXJzZWQob2QpJworICAgICAgICAjIFRyYXZlcnNlIHRoZSBsaW5rZWQgbGlzdCBpbiByZXZlcnNlIG9yZGVyLgorICAgICAgICByb290ID0gc2VsZi5fX3Jvb3QKKyAgICAgICAgY3VyciA9IHJvb3RbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFydCBhdCB0aGUgbGFzdCBub2RlCisgICAgICAgIHdoaWxlIGN1cnIgaXMgbm90IHJvb3Q6CisgICAgICAgICAgICB5aWVsZCBjdXJyWzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeWllbGQgdGhlIGN1cnJbS0VZXQorICAgICAgICAgICAgY3VyciA9IGN1cnJbMF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1vdmUgdG8gcHJldmlvdXMgbm9kZQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAnb2QuY2xlYXIoKSAtPiBOb25lLiAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIG9kLicKKyAgICAgICAgcm9vdCA9IHNlbGYuX19yb290CisgICAgICAgIHJvb3RbOl0gPSBbcm9vdCwgcm9vdCwgTm9uZV0KKyAgICAgICAgc2VsZi5fX21hcC5jbGVhcigpCisgICAgICAgIGRpY3QuY2xlYXIoc2VsZikKKworICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIGRvIG5vdCBkZXBlbmQgb24gdGhlIGludGVybmFsIHN0cnVjdHVyZSAtLQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICdvZC5rZXlzKCkgLT4gbGlzdCBvZiBrZXlzIGluIG9kJworICAgICAgICByZXR1cm4gbGlzdChzZWxmKQorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgJ29kLnZhbHVlcygpIC0+IGxpc3Qgb2YgdmFsdWVzIGluIG9kJworICAgICAgICByZXR1cm4gW3NlbGZba2V5XSBmb3Iga2V5IGluIHNlbGZdCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICdvZC5pdGVtcygpIC0+IGxpc3Qgb2YgKGtleSwgdmFsdWUpIHBhaXJzIGluIG9kJworICAgICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQorCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICAnb2QuaXRlcmtleXMoKSAtPiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIGluIG9kJworICAgICAgICByZXR1cm4gaXRlcihzZWxmKQorCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgICdvZC5pdGVydmFsdWVzIC0+IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIHZhbHVlcyBpbiBvZCcKKyAgICAgICAgZm9yIGsgaW4gc2VsZjoKKyAgICAgICAgICAgIHlpZWxkIHNlbGZba10KKworICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CisgICAgICAgICdvZC5pdGVyaXRlbXMgLT4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgKGtleSwgdmFsdWUpIHBhaXJzIGluIG9kJworICAgICAgICBmb3IgayBpbiBzZWxmOgorICAgICAgICAgICAgeWllbGQgKGssIHNlbGZba10pCisKKyAgICB1cGRhdGUgPSBNdXRhYmxlTWFwcGluZy51cGRhdGUKKworICAgIF9fdXBkYXRlID0gdXBkYXRlICMgbGV0IHN1YmNsYXNzZXMgb3ZlcnJpZGUgdXBkYXRlIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18KKworICAgIF9fbWFya2VyID0gb2JqZWN0KCkKKworICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PV9fbWFya2VyKToKKyAgICAgICAgJycnb2QucG9wKGtbLGRdKSAtPiB2LCByZW1vdmUgc3BlY2lmaWVkIGtleSBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIHZhbHVlLiAgSWYga2V5IGlzIG5vdCBmb3VuZCwgZCBpcyByZXR1cm5lZCBpZiBnaXZlbiwgb3RoZXJ3aXNlIEtleUVycm9yCisgICAgICAgIGlzIHJhaXNlZC4KKworICAgICAgICAnJycKKyAgICAgICAgaWYga2V5IGluIHNlbGY6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2tleV0KKyAgICAgICAgICAgIGRlbCBzZWxmW2tleV0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgaWYgZGVmYXVsdCBpcyBzZWxmLl9fbWFya2VyOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3Ioa2V5KQorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIHNldGRlZmF1bHQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAnb2Quc2V0ZGVmYXVsdChrWyxkXSkgLT4gb2QuZ2V0KGssZCksIGFsc28gc2V0IG9kW2tdPWQgaWYgayBub3QgaW4gb2QnCisgICAgICAgIGlmIGtleSBpbiBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgICAgICBzZWxmW2tleV0gPSBkZWZhdWx0CisgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICBkZWYgcG9waXRlbShzZWxmLCBsYXN0PVRydWUpOgorICAgICAgICAnJydvZC5wb3BpdGVtKCkgLT4gKGssIHYpLCByZXR1cm4gYW5kIHJlbW92ZSBhIChrZXksIHZhbHVlKSBwYWlyLgorICAgICAgICBQYWlycyBhcmUgcmV0dXJuZWQgaW4gTElGTyBvcmRlciBpZiBsYXN0IGlzIHRydWUgb3IgRklGTyBvcmRlciBpZiBmYWxzZS4KKworICAgICAgICAnJycKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignZGljdGlvbmFyeSBpcyBlbXB0eScpCisgICAgICAgIGtleSA9IG5leHQocmV2ZXJzZWQoc2VsZikgaWYgbGFzdCBlbHNlIGl0ZXIoc2VsZikpCisgICAgICAgIHZhbHVlID0gc2VsZi5wb3Aoa2V5KQorICAgICAgICByZXR1cm4ga2V5LCB2YWx1ZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYsIF9yZXByX3J1bm5pbmc9e30pOgorICAgICAgICAnb2QuX19yZXByX18oKSA8PT0+IHJlcHIob2QpJworICAgICAgICBjYWxsX2tleSA9IGlkKHNlbGYpLCBfZ2V0X2lkZW50KCkKKyAgICAgICAgaWYgY2FsbF9rZXkgaW4gX3JlcHJfcnVubmluZzoKKyAgICAgICAgICAgIHJldHVybiAnLi4uJworICAgICAgICBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XSA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICAgICAgcmV0dXJuICclcygpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywpCisgICAgICAgICAgICByZXR1cm4gJyVzKCVyKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaXRlbXMoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCBfcmVwcl9ydW5uaW5nW2NhbGxfa2V5XQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICdSZXR1cm4gc3RhdGUgaW5mb3JtYXRpb24gZm9yIHBpY2tsaW5nJworICAgICAgICBpdGVtcyA9IFtbaywgc2VsZltrXV0gZm9yIGsgaW4gc2VsZl0KKyAgICAgICAgaW5zdF9kaWN0ID0gdmFycyhzZWxmKS5jb3B5KCkKKyAgICAgICAgZm9yIGsgaW4gdmFycyhPcmRlcmVkRGljdCgpKToKKyAgICAgICAgICAgIGluc3RfZGljdC5wb3AoaywgTm9uZSkKKyAgICAgICAgaWYgaW5zdF9kaWN0OgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKGl0ZW1zLCksIGluc3RfZGljdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLCAoaXRlbXMsKQorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgICdvZC5jb3B5KCkgLT4gYSBzaGFsbG93IGNvcHkgb2Ygb2QnCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21rZXlzKGNscywgaXRlcmFibGUsIHZhbHVlPU5vbmUpOgorICAgICAgICAnJydPRC5mcm9ta2V5cyhTWywgdl0pIC0+IE5ldyBvcmRlcmVkIGRpY3Rpb25hcnkgd2l0aCBrZXlzIGZyb20gUy4KKyAgICAgICAgSWYgbm90IHNwZWNpZmllZCwgdGhlIHZhbHVlIGRlZmF1bHRzIHRvIE5vbmUuCisKKyAgICAgICAgJycnCisgICAgICAgIHNlbGYgPSBjbHMoKQorICAgICAgICBmb3Iga2V5IGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAnJydvZC5fX2VxX18oeSkgPD09PiBvZD09eS4gIENvbXBhcmlzb24gdG8gYW5vdGhlciBPRCBpcyBvcmRlci1zZW5zaXRpdmUKKyAgICAgICAgd2hpbGUgY29tcGFyaXNvbiB0byBhIHJlZ3VsYXIgbWFwcGluZyBpcyBvcmRlci1pbnNlbnNpdGl2ZS4KKworICAgICAgICAnJycKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT3JkZXJlZERpY3QpOgorICAgICAgICAgICAgcmV0dXJuIGRpY3QuX19lcV9fKHNlbGYsIG90aGVyKSBhbmQgYWxsKF9pbWFwKF9lcSwgc2VsZiwgb3RoZXIpKQorICAgICAgICByZXR1cm4gZGljdC5fX2VxX18oc2VsZiwgb3RoZXIpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgJ29kLl9fbmVfXyh5KSA8PT0+IG9kIT15JworICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICAgICMgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIHN1cHBvcnQgcHl0aG9uIDMueCBzdHlsZSBkaWN0aW9uYXJ5IHZpZXdzIC0tCisKKyAgICBkZWYgdmlld2tleXMoc2VsZik6CisgICAgICAgICJvZC52aWV3a2V5cygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBrZXlzIgorICAgICAgICByZXR1cm4gS2V5c1ZpZXcoc2VsZikKKworICAgIGRlZiB2aWV3dmFsdWVzKHNlbGYpOgorICAgICAgICAib2Qudmlld3ZhbHVlcygpIC0+IGFuIG9iamVjdCBwcm92aWRpbmcgYSB2aWV3IG9uIG9kJ3MgdmFsdWVzIgorICAgICAgICByZXR1cm4gVmFsdWVzVmlldyhzZWxmKQorCisgICAgZGVmIHZpZXdpdGVtcyhzZWxmKToKKyAgICAgICAgIm9kLnZpZXdpdGVtcygpIC0+IGEgc2V0LWxpa2Ugb2JqZWN0IHByb3ZpZGluZyBhIHZpZXcgb24gb2QncyBpdGVtcyIKKyAgICAgICAgcmV0dXJuIEl0ZW1zVmlldyhzZWxmKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgbmFtZWR0dXBsZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworX2NsYXNzX3RlbXBsYXRlID0gJycnXAorY2xhc3Mge3R5cGVuYW1lfSh0dXBsZSk6CisgICAgJ3t0eXBlbmFtZX0oe2FyZ19saXN0fSknCisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgX2ZpZWxkcyA9IHtmaWVsZF9uYW1lcyFyfQorCisgICAgZGVmIF9fbmV3X18oX2Nscywge2FyZ19saXN0fSk6CisgICAgICAgICdDcmVhdGUgbmV3IGluc3RhbmNlIG9mIHt0eXBlbmFtZX0oe2FyZ19saXN0fSknCisgICAgICAgIHJldHVybiBfdHVwbGUuX19uZXdfXyhfY2xzLCAoe2FyZ19saXN0fSkpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX21ha2UoY2xzLCBpdGVyYWJsZSwgbmV3PXR1cGxlLl9fbmV3X18sIGxlbj1sZW4pOgorICAgICAgICAnTWFrZSBhIG5ldyB7dHlwZW5hbWV9IG9iamVjdCBmcm9tIGEgc2VxdWVuY2Ugb3IgaXRlcmFibGUnCisgICAgICAgIHJlc3VsdCA9IG5ldyhjbHMsIGl0ZXJhYmxlKQorICAgICAgICBpZiBsZW4ocmVzdWx0KSAhPSB7bnVtX2ZpZWxkczpkfToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQge251bV9maWVsZHM6ZH0gYXJndW1lbnRzLCBnb3QgJWQnICUgbGVuKHJlc3VsdCkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgJ1JldHVybiBhIG5pY2VseSBmb3JtYXR0ZWQgcmVwcmVzZW50YXRpb24gc3RyaW5nJworICAgICAgICByZXR1cm4gJ3t0eXBlbmFtZX0oe3JlcHJfZm10fSknICUgc2VsZgorCisgICAgZGVmIF9hc2RpY3Qoc2VsZik6CisgICAgICAgICdSZXR1cm4gYSBuZXcgT3JkZXJlZERpY3Qgd2hpY2ggbWFwcyBmaWVsZCBuYW1lcyB0byB0aGVpciB2YWx1ZXMnCisgICAgICAgIHJldHVybiBPcmRlcmVkRGljdCh6aXAoc2VsZi5fZmllbGRzLCBzZWxmKSkKKworICAgIGRlZiBfcmVwbGFjZShfc2VsZiwgKiprd2RzKToKKyAgICAgICAgJ1JldHVybiBhIG5ldyB7dHlwZW5hbWV9IG9iamVjdCByZXBsYWNpbmcgc3BlY2lmaWVkIGZpZWxkcyB3aXRoIG5ldyB2YWx1ZXMnCisgICAgICAgIHJlc3VsdCA9IF9zZWxmLl9tYWtlKG1hcChrd2RzLnBvcCwge2ZpZWxkX25hbWVzIXJ9LCBfc2VsZikpCisgICAgICAgIGlmIGt3ZHM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdHb3QgdW5leHBlY3RlZCBmaWVsZCBuYW1lczogJXInICUga3dkcy5rZXlzKCkpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgJ1JldHVybiBzZWxmIGFzIGEgcGxhaW4gdHVwbGUuICBVc2VkIGJ5IGNvcHkgYW5kIHBpY2tsZS4nCisgICAgICAgIHJldHVybiB0dXBsZShzZWxmKQorCit7ZmllbGRfZGVmc30KKycnJworCitfcmVwcl90ZW1wbGF0ZSA9ICd7bmFtZX09JXInCisKK19maWVsZF90ZW1wbGF0ZSA9ICcnJ1wKKyAgICB7bmFtZX0gPSBfcHJvcGVydHkoX2l0ZW1nZXR0ZXIoe2luZGV4OmR9KSwgZG9jPSdBbGlhcyBmb3IgZmllbGQgbnVtYmVyIHtpbmRleDpkfScpCisnJycKKworZGVmIG5hbWVkdHVwbGUodHlwZW5hbWUsIGZpZWxkX25hbWVzLCB2ZXJib3NlPUZhbHNlLCByZW5hbWU9RmFsc2UpOgorICAgICIiIlJldHVybnMgYSBuZXcgc3ViY2xhc3Mgb2YgdHVwbGUgd2l0aCBuYW1lZCBmaWVsZHMuCisKKyAgICA+Pj4gUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsIFsneCcsICd5J10pCisgICAgPj4+IFBvaW50Ll9fZG9jX18gICAgICAgICAgICAgICAgICAgIyBkb2NzdHJpbmcgZm9yIHRoZSBuZXcgY2xhc3MKKyAgICAnUG9pbnQoeCwgeSknCisgICAgPj4+IHAgPSBQb2ludCgxMSwgeT0yMikgICAgICAgICAgICAgIyBpbnN0YW50aWF0ZSB3aXRoIHBvc2l0aW9uYWwgYXJncyBvciBrZXl3b3JkcworICAgID4+PiBwWzBdICsgcFsxXSAgICAgICAgICAgICAgICAgICAgICMgaW5kZXhhYmxlIGxpa2UgYSBwbGFpbiB0dXBsZQorICAgIDMzCisgICAgPj4+IHgsIHkgPSBwICAgICAgICAgICAgICAgICAgICAgICAgIyB1bnBhY2sgbGlrZSBhIHJlZ3VsYXIgdHVwbGUKKyAgICA+Pj4geCwgeQorICAgICgxMSwgMjIpCisgICAgPj4+IHAueCArIHAueSAgICAgICAgICAgICAgICAgICAgICAgIyBmaWVsZHMgYWxzbyBhY2Nlc3NhYmxlIGJ5IG5hbWUKKyAgICAzMworICAgID4+PiBkID0gcC5fYXNkaWN0KCkgICAgICAgICAgICAgICAgICMgY29udmVydCB0byBhIGRpY3Rpb25hcnkKKyAgICA+Pj4gZFsneCddCisgICAgMTEKKyAgICA+Pj4gUG9pbnQoKipkKSAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgZnJvbSBhIGRpY3Rpb25hcnkKKyAgICBQb2ludCh4PTExLCB5PTIyKQorICAgID4+PiBwLl9yZXBsYWNlKHg9MTAwKSAgICAgICAgICAgICAgICMgX3JlcGxhY2UoKSBpcyBsaWtlIHN0ci5yZXBsYWNlKCkgYnV0IHRhcmdldHMgbmFtZWQgZmllbGRzCisgICAgUG9pbnQoeD0xMDAsIHk9MjIpCisKKyAgICAiIiIKKworICAgICMgVmFsaWRhdGUgdGhlIGZpZWxkIG5hbWVzLiAgQXQgdGhlIHVzZXIncyBvcHRpb24sIGVpdGhlciBnZW5lcmF0ZSBhbiBlcnJvcgorICAgICMgbWVzc2FnZSBvciBhdXRvbWF0aWNhbGx5IHJlcGxhY2UgdGhlIGZpZWxkIG5hbWUgd2l0aCBhIHZhbGlkIG5hbWUuCisgICAgaWYgaXNpbnN0YW5jZShmaWVsZF9uYW1lcywgYmFzZXN0cmluZyk6CisgICAgICAgIGZpZWxkX25hbWVzID0gZmllbGRfbmFtZXMucmVwbGFjZSgnLCcsICcgJykuc3BsaXQoKQorICAgIGZpZWxkX25hbWVzID0gbWFwKHN0ciwgZmllbGRfbmFtZXMpCisgICAgaWYgcmVuYW1lOgorICAgICAgICBzZWVuID0gc2V0KCkKKyAgICAgICAgZm9yIGluZGV4LCBuYW1lIGluIGVudW1lcmF0ZShmaWVsZF9uYW1lcyk6CisgICAgICAgICAgICBpZiAobm90IGFsbChjLmlzYWxudW0oKSBvciBjPT0nXycgZm9yIGMgaW4gbmFtZSkKKyAgICAgICAgICAgICAgICBvciBfaXNrZXl3b3JkKG5hbWUpCisgICAgICAgICAgICAgICAgb3Igbm90IG5hbWUKKyAgICAgICAgICAgICAgICBvciBuYW1lWzBdLmlzZGlnaXQoKQorICAgICAgICAgICAgICAgIG9yIG5hbWUuc3RhcnRzd2l0aCgnXycpCisgICAgICAgICAgICAgICAgb3IgbmFtZSBpbiBzZWVuKToKKyAgICAgICAgICAgICAgICBmaWVsZF9uYW1lc1tpbmRleF0gPSAnXyVkJyAlIGluZGV4CisgICAgICAgICAgICBzZWVuLmFkZChuYW1lKQorICAgIGZvciBuYW1lIGluIFt0eXBlbmFtZV0gKyBmaWVsZF9uYW1lczoKKyAgICAgICAgaWYgbm90IGFsbChjLmlzYWxudW0oKSBvciBjPT0nXycgZm9yIGMgaW4gbmFtZSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdUeXBlIG5hbWVzIGFuZCBmaWVsZCBuYW1lcyBjYW4gb25seSBjb250YWluICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCB1bmRlcnNjb3JlczogJXInICUgbmFtZSkKKyAgICAgICAgaWYgX2lza2V5d29yZChuYW1lKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1R5cGUgbmFtZXMgYW5kIGZpZWxkIG5hbWVzIGNhbm5vdCBiZSBhICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmQ6ICVyJyAlIG5hbWUpCisgICAgICAgIGlmIG5hbWVbMF0uaXNkaWdpdCgpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVHlwZSBuYW1lcyBhbmQgZmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYSBudW1iZXI6ICVyJyAlIG5hbWUpCisgICAgc2VlbiA9IHNldCgpCisgICAgZm9yIG5hbWUgaW4gZmllbGRfbmFtZXM6CisgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnXycpIGFuZCBub3QgcmVuYW1lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRmllbGQgbmFtZXMgY2Fubm90IHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZTogJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXInICUgbmFtZSkKKyAgICAgICAgaWYgbmFtZSBpbiBzZWVuOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignRW5jb3VudGVyZWQgZHVwbGljYXRlIGZpZWxkIG5hbWU6ICVyJyAlIG5hbWUpCisgICAgICAgIHNlZW4uYWRkKG5hbWUpCisKKyAgICAjIEZpbGwtaW4gdGhlIGNsYXNzIHRlbXBsYXRlCisgICAgY2xhc3NfZGVmaW5pdGlvbiA9IF9jbGFzc190ZW1wbGF0ZS5mb3JtYXQoCisgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUsCisgICAgICAgIGZpZWxkX25hbWVzID0gdHVwbGUoZmllbGRfbmFtZXMpLAorICAgICAgICBudW1fZmllbGRzID0gbGVuKGZpZWxkX25hbWVzKSwKKyAgICAgICAgYXJnX2xpc3QgPSByZXByKHR1cGxlKGZpZWxkX25hbWVzKSkucmVwbGFjZSgiJyIsICIiKVsxOi0xXSwKKyAgICAgICAgcmVwcl9mbXQgPSAnLCAnLmpvaW4oX3JlcHJfdGVtcGxhdGUuZm9ybWF0KG5hbWU9bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmllbGRfbmFtZXMpLAorICAgICAgICBmaWVsZF9kZWZzID0gJ1xuJy5qb2luKF9maWVsZF90ZW1wbGF0ZS5mb3JtYXQoaW5kZXg9aW5kZXgsIG5hbWU9bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaW5kZXgsIG5hbWUgaW4gZW51bWVyYXRlKGZpZWxkX25hbWVzKSkKKyAgICApCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgY2xhc3NfZGVmaW5pdGlvbgorCisgICAgIyBFeGVjdXRlIHRoZSB0ZW1wbGF0ZSBzdHJpbmcgaW4gYSB0ZW1wb3JhcnkgbmFtZXNwYWNlIGFuZCBzdXBwb3J0CisgICAgIyB0cmFjaW5nIHV0aWxpdGllcyBieSBzZXR0aW5nIGEgdmFsdWUgZm9yIGZyYW1lLmZfZ2xvYmFsc1snX19uYW1lX18nXQorICAgIG5hbWVzcGFjZSA9IGRpY3QoX2l0ZW1nZXR0ZXI9X2l0ZW1nZXR0ZXIsIF9fbmFtZV9fPSduYW1lZHR1cGxlXyVzJyAlIHR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3Q9T3JkZXJlZERpY3QsIF9wcm9wZXJ0eT1wcm9wZXJ0eSwgX3R1cGxlPXR1cGxlKQorICAgIHRyeToKKyAgICAgICAgZXhlYyBjbGFzc19kZWZpbml0aW9uIGluIG5hbWVzcGFjZQorICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgorICAgICAgICByYWlzZSBTeW50YXhFcnJvcihlLm1lc3NhZ2UgKyAnOlxuJyArIGNsYXNzX2RlZmluaXRpb24pCisgICAgcmVzdWx0ID0gbmFtZXNwYWNlW3R5cGVuYW1lXQorCisgICAgIyBGb3IgcGlja2xpbmcgdG8gd29yaywgdGhlIF9fbW9kdWxlX18gdmFyaWFibGUgbmVlZHMgdG8gYmUgc2V0IHRvIHRoZSBmcmFtZQorICAgICMgd2hlcmUgdGhlIG5hbWVkIHR1cGxlIGlzIGNyZWF0ZWQuICBCeXBhc3MgdGhpcyBzdGVwIGluIGVudmlyb21lbnRzIHdoZXJlCisgICAgIyBzeXMuX2dldGZyYW1lIGlzIG5vdCBkZWZpbmVkIChKeXRob24gZm9yIGV4YW1wbGUpIG9yIHN5cy5fZ2V0ZnJhbWUgaXMgbm90CisgICAgIyBkZWZpbmVkIGZvciBhcmd1bWVudHMgZ3JlYXRlciB0aGFuIDAgKElyb25QeXRob24pLgorICAgIHRyeToKKyAgICAgICAgcmVzdWx0Ll9fbW9kdWxlX18gPSBfc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycsICdfX21haW5fXycpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgIHBhc3MKKworICAgIHJldHVybiByZXN1bHQKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyAgQ291bnRlcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIENvdW50ZXIoZGljdCk6CisgICAgJycnRGljdCBzdWJjbGFzcyBmb3IgY291bnRpbmcgaGFzaGFibGUgaXRlbXMuICBTb21ldGltZXMgY2FsbGVkIGEgYmFnCisgICAgb3IgbXVsdGlzZXQuICBFbGVtZW50cyBhcmUgc3RvcmVkIGFzIGRpY3Rpb25hcnkga2V5cyBhbmQgdGhlaXIgY291bnRzCisgICAgYXJlIHN0b3JlZCBhcyBkaWN0aW9uYXJ5IHZhbHVlcy4KKworICAgID4+PiBjID0gQ291bnRlcignYWJjZGVhYmNkYWJjYWJhJykgICMgY291bnQgZWxlbWVudHMgZnJvbSBhIHN0cmluZworCisgICAgPj4+IGMubW9zdF9jb21tb24oMykgICAgICAgICAgICAgICAgIyB0aHJlZSBtb3N0IGNvbW1vbiBlbGVtZW50cworICAgIFsoJ2EnLCA1KSwgKCdiJywgNCksICgnYycsIDMpXQorICAgID4+PiBzb3J0ZWQoYykgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCBhbGwgdW5pcXVlIGVsZW1lbnRzCisgICAgWydhJywgJ2InLCAnYycsICdkJywgJ2UnXQorICAgID4+PiAnJy5qb2luKHNvcnRlZChjLmVsZW1lbnRzKCkpKSAgICMgbGlzdCBlbGVtZW50cyB3aXRoIHJlcGV0aXRpb25zCisgICAgJ2FhYWFhYmJiYmNjY2RkZScKKyAgICA+Pj4gc3VtKGMudmFsdWVzKCkpICAgICAgICAgICAgICAgICAjIHRvdGFsIG9mIGFsbCBjb3VudHMKKyAgICAxNQorCisgICAgPj4+IGNbJ2EnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb3VudCBvZiBsZXR0ZXIgJ2EnCisgICAgNQorICAgID4+PiBmb3IgZWxlbSBpbiAnc2hhemFtJzogICAgICAgICAgICMgdXBkYXRlIGNvdW50cyBmcm9tIGFuIGl0ZXJhYmxlCisgICAgLi4uICAgICBjW2VsZW1dICs9IDEgICAgICAgICAgICAgICAgIyBieSBhZGRpbmcgMSB0byBlYWNoIGVsZW1lbnQncyBjb3VudAorICAgID4+PiBjWydhJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHRoZXJlIGFyZSBzZXZlbiAnYScKKyAgICA3CisgICAgPj4+IGRlbCBjWydiJ10gICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgYWxsICdiJworICAgID4+PiBjWydiJ10gICAgICAgICAgICAgICAgICAgICAgICAgICMgbm93IHRoZXJlIGFyZSB6ZXJvICdiJworICAgIDAKKworICAgID4+PiBkID0gQ291bnRlcignc2ltc2FsYWJpbScpICAgICAgICMgbWFrZSBhbm90aGVyIGNvdW50ZXIKKyAgICA+Pj4gYy51cGRhdGUoZCkgICAgICAgICAgICAgICAgICAgICAjIGFkZCBpbiB0aGUgc2Vjb25kIGNvdW50ZXIKKyAgICA+Pj4gY1snYSddICAgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdyB0aGVyZSBhcmUgbmluZSAnYScKKyAgICA5CisKKyAgICA+Pj4gYy5jbGVhcigpICAgICAgICAgICAgICAgICAgICAgICAjIGVtcHR5IHRoZSBjb3VudGVyCisgICAgPj4+IGMKKyAgICBDb3VudGVyKCkKKworICAgIE5vdGU6ICBJZiBhIGNvdW50IGlzIHNldCB0byB6ZXJvIG9yIHJlZHVjZWQgdG8gemVybywgaXQgd2lsbCByZW1haW4KKyAgICBpbiB0aGUgY291bnRlciB1bnRpbCB0aGUgZW50cnkgaXMgZGVsZXRlZCBvciB0aGUgY291bnRlciBpcyBjbGVhcmVkOgorCisgICAgPj4+IGMgPSBDb3VudGVyKCdhYWFiYmMnKQorICAgID4+PiBjWydiJ10gLT0gMiAgICAgICAgICAgICAgICAgICAgICMgcmVkdWNlIHRoZSBjb3VudCBvZiAnYicgYnkgdHdvCisgICAgPj4+IGMubW9zdF9jb21tb24oKSAgICAgICAgICAgICAgICAgIyAnYicgaXMgc3RpbGwgaW4sIGJ1dCBpdHMgY291bnQgaXMgemVybworICAgIFsoJ2EnLCAzKSwgKCdjJywgMSksICgnYicsIDApXQorCisgICAgJycnCisgICAgIyBSZWZlcmVuY2VzOgorICAgICMgICBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL011bHRpc2V0CisgICAgIyAgIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9zbWFsbHRhbGsvbWFudWFsLWJhc2UvaHRtbF9ub2RlL0JhZy5odG1sCisgICAgIyAgIGh0dHA6Ly93d3cuZGVtbzJzLmNvbS9UdXRvcmlhbC9DcHAvMDM4MF9fc2V0LW11bHRpc2V0L0NhdGFsb2cwMzgwX19zZXQtbXVsdGlzZXQuaHRtCisgICAgIyAgIGh0dHA6Ly9jb2RlLmFjdGl2ZXN0YXRlLmNvbS9yZWNpcGVzLzI1OTE3NC8KKyAgICAjICAgS251dGgsIFRBT0NQIFZvbC4gSUkgc2VjdGlvbiA0LjYuMworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZXJhYmxlPU5vbmUsICoqa3dkcyk6CisgICAgICAgICcnJ0NyZWF0ZSBhIG5ldywgZW1wdHkgQ291bnRlciBvYmplY3QuICBBbmQgaWYgZ2l2ZW4sIGNvdW50IGVsZW1lbnRzCisgICAgICAgIGZyb20gYW4gaW5wdXQgaXRlcmFibGUuICBPciwgaW5pdGlhbGl6ZSB0aGUgY291bnQgZnJvbSBhbm90aGVyIG1hcHBpbmcKKyAgICAgICAgb2YgZWxlbWVudHMgdG8gdGhlaXIgY291bnRzLgorCisgICAgICAgID4+PiBjID0gQ291bnRlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIG5ldywgZW1wdHkgY291bnRlcgorICAgICAgICA+Pj4gYyA9IENvdW50ZXIoJ2dhbGxhaGFkJykgICAgICAgICAgICAgICAgICMgYSBuZXcgY291bnRlciBmcm9tIGFuIGl0ZXJhYmxlCisgICAgICAgID4+PiBjID0gQ291bnRlcih7J2EnOiA0LCAnYic6IDJ9KSAgICAgICAgICAgIyBhIG5ldyBjb3VudGVyIGZyb20gYSBtYXBwaW5nCisgICAgICAgID4+PiBjID0gQ291bnRlcihhPTQsIGI9MikgICAgICAgICAgICAgICAgICAgIyBhIG5ldyBjb3VudGVyIGZyb20ga2V5d29yZCBhcmdzCisKKyAgICAgICAgJycnCisgICAgICAgIHN1cGVyKENvdW50ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi51cGRhdGUoaXRlcmFibGUsICoqa3dkcykKKworICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAnVGhlIGNvdW50IG9mIGVsZW1lbnRzIG5vdCBpbiB0aGUgQ291bnRlciBpcyB6ZXJvLicKKyAgICAgICAgIyBOZWVkZWQgc28gdGhhdCBzZWxmW21pc3NpbmdfaXRlbV0gZG9lcyBub3QgcmFpc2UgS2V5RXJyb3IKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBtb3N0X2NvbW1vbihzZWxmLCBuPU5vbmUpOgorICAgICAgICAnJydMaXN0IHRoZSBuIG1vc3QgY29tbW9uIGVsZW1lbnRzIGFuZCB0aGVpciBjb3VudHMgZnJvbSB0aGUgbW9zdAorICAgICAgICBjb21tb24gdG8gdGhlIGxlYXN0LiAgSWYgbiBpcyBOb25lLCB0aGVuIGxpc3QgYWxsIGVsZW1lbnQgY291bnRzLgorCisgICAgICAgID4+PiBDb3VudGVyKCdhYmNkZWFiY2RhYmNhYmEnKS5tb3N0X2NvbW1vbigzKQorICAgICAgICBbKCdhJywgNSksICgnYicsIDQpLCAoJ2MnLCAzKV0KKworICAgICAgICAnJycKKyAgICAgICAgIyBFbXVsYXRlIEJhZy5zb3J0ZWRCeUNvdW50IGZyb20gU21hbGx0YWxrCisgICAgICAgIGlmIG4gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWQoc2VsZi5pdGVyaXRlbXMoKSwga2V5PV9pdGVtZ2V0dGVyKDEpLCByZXZlcnNlPVRydWUpCisgICAgICAgIHJldHVybiBfaGVhcHEubmxhcmdlc3Qobiwgc2VsZi5pdGVyaXRlbXMoKSwga2V5PV9pdGVtZ2V0dGVyKDEpKQorCisgICAgZGVmIGVsZW1lbnRzKHNlbGYpOgorICAgICAgICAnJydJdGVyYXRvciBvdmVyIGVsZW1lbnRzIHJlcGVhdGluZyBlYWNoIGFzIG1hbnkgdGltZXMgYXMgaXRzIGNvdW50LgorCisgICAgICAgID4+PiBjID0gQ291bnRlcignQUJDQUJDJykKKyAgICAgICAgPj4+IHNvcnRlZChjLmVsZW1lbnRzKCkpCisgICAgICAgIFsnQScsICdBJywgJ0InLCAnQicsICdDJywgJ0MnXQorCisgICAgICAgICMgS251dGgncyBleGFtcGxlIGZvciBwcmltZSBmYWN0b3JzIG9mIDE4MzY6ICAyKioyICogMyoqMyAqIDE3KioxCisgICAgICAgID4+PiBwcmltZV9mYWN0b3JzID0gQ291bnRlcih7MjogMiwgMzogMywgMTc6IDF9KQorICAgICAgICA+Pj4gcHJvZHVjdCA9IDEKKyAgICAgICAgPj4+IGZvciBmYWN0b3IgaW4gcHJpbWVfZmFjdG9ycy5lbGVtZW50cygpOiAgICAgIyBsb29wIG92ZXIgZmFjdG9ycworICAgICAgICAuLi4gICAgIHByb2R1Y3QgKj0gZmFjdG9yICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBtdWx0aXBseSB0aGVtCisgICAgICAgID4+PiBwcm9kdWN0CisgICAgICAgIDE4MzYKKworICAgICAgICBOb3RlLCBpZiBhbiBlbGVtZW50J3MgY291bnQgaGFzIGJlZW4gc2V0IHRvIHplcm8gb3IgaXMgYSBuZWdhdGl2ZQorICAgICAgICBudW1iZXIsIGVsZW1lbnRzKCkgd2lsbCBpZ25vcmUgaXQuCisKKyAgICAgICAgJycnCisgICAgICAgICMgRW11bGF0ZSBCYWcuZG8gZnJvbSBTbWFsbHRhbGsgYW5kIE11bHRpc2V0LmJlZ2luIGZyb20gQysrLgorICAgICAgICByZXR1cm4gX2NoYWluLmZyb21faXRlcmFibGUoX3N0YXJtYXAoX3JlcGVhdCwgc2VsZi5pdGVyaXRlbXMoKSkpCisKKyAgICAjIE92ZXJyaWRlIGRpY3QgbWV0aG9kcyB3aGVyZSBuZWNlc3NhcnkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9ta2V5cyhjbHMsIGl0ZXJhYmxlLCB2PU5vbmUpOgorICAgICAgICAjIFRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgbWV0aG9kIGZvciBjb3VudGVycyBiZWNhdXNlIHNldHRpbmcgdj0xCisgICAgICAgICMgbWVhbnMgdGhhdCBubyBlbGVtZW50IGNhbiBoYXZlIGEgY291bnQgZ3JlYXRlciB0aGFuIG9uZS4KKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICdDb3VudGVyLmZyb21rZXlzKCkgaXMgdW5kZWZpbmVkLiAgVXNlIENvdW50ZXIoaXRlcmFibGUpIGluc3RlYWQuJykKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgaXRlcmFibGU9Tm9uZSwgKiprd2RzKToKKyAgICAgICAgJycnTGlrZSBkaWN0LnVwZGF0ZSgpIGJ1dCBhZGQgY291bnRzIGluc3RlYWQgb2YgcmVwbGFjaW5nIHRoZW0uCisKKyAgICAgICAgU291cmNlIGNhbiBiZSBhbiBpdGVyYWJsZSwgYSBkaWN0aW9uYXJ5LCBvciBhbm90aGVyIENvdW50ZXIgaW5zdGFuY2UuCisKKyAgICAgICAgPj4+IGMgPSBDb3VudGVyKCd3aGljaCcpCisgICAgICAgID4+PiBjLnVwZGF0ZSgnd2l0Y2gnKSAgICAgICAgICAgIyBhZGQgZWxlbWVudHMgZnJvbSBhbm90aGVyIGl0ZXJhYmxlCisgICAgICAgID4+PiBkID0gQ291bnRlcignd2F0Y2gnKQorICAgICAgICA+Pj4gYy51cGRhdGUoZCkgICAgICAgICAgICAgICAgICMgYWRkIGVsZW1lbnRzIGZyb20gYW5vdGhlciBjb3VudGVyCisgICAgICAgID4+PiBjWydoJ10gICAgICAgICAgICAgICAgICAgICAgIyBmb3VyICdoJyBpbiB3aGljaCwgd2l0Y2gsIGFuZCB3YXRjaAorICAgICAgICA0CisKKyAgICAgICAgJycnCisgICAgICAgICMgVGhlIHJlZ3VsYXIgZGljdC51cGRhdGUoKSBvcGVyYXRpb24gbWFrZXMgbm8gc2Vuc2UgaGVyZSBiZWNhdXNlIHRoZQorICAgICAgICAjIHJlcGxhY2UgYmVoYXZpb3IgcmVzdWx0cyBpbiB0aGUgc29tZSBvZiBvcmlnaW5hbCB1bnRvdWNoZWQgY291bnRzCisgICAgICAgICMgYmVpbmcgbWl4ZWQtaW4gd2l0aCBhbGwgb2YgdGhlIG90aGVyIGNvdW50cyBmb3IgYSBtaXNtYXNoIHRoYXQKKyAgICAgICAgIyBkb2Vzbid0IGhhdmUgYSBzdHJhaWdodC1mb3J3YXJkIGludGVycHJldGF0aW9uIGluIG1vc3QgY291bnRpbmcKKyAgICAgICAgIyBjb250ZXh0cy4gIEluc3RlYWQsIHdlIGltcGxlbWVudCBzdHJhaWdodC1hZGRpdGlvbi4gIEJvdGggdGhlIGlucHV0cworICAgICAgICAjIGFuZCBvdXRwdXRzIGFyZSBhbGxvd2VkIHRvIGNvbnRhaW4gemVybyBhbmQgbmVnYXRpdmUgY291bnRzLgorCisgICAgICAgIGlmIGl0ZXJhYmxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVyYWJsZSwgTWFwcGluZyk6CisgICAgICAgICAgICAgICAgaWYgc2VsZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZl9nZXQgPSBzZWxmLmdldAorICAgICAgICAgICAgICAgICAgICBmb3IgZWxlbSwgY291bnQgaW4gaXRlcmFibGUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmW2VsZW1dID0gc2VsZl9nZXQoZWxlbSwgMCkgKyBjb3VudAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN1cGVyKENvdW50ZXIsIHNlbGYpLnVwZGF0ZShpdGVyYWJsZSkgIyBmYXN0IHBhdGggd2hlbiBjb3VudGVyIGlzIGVtcHR5CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGZfZ2V0ID0gc2VsZi5nZXQKKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZltlbGVtXSA9IHNlbGZfZ2V0KGVsZW0sIDApICsgMQorICAgICAgICBpZiBrd2RzOgorICAgICAgICAgICAgc2VsZi51cGRhdGUoa3dkcykKKworICAgIGRlZiBzdWJ0cmFjdChzZWxmLCBpdGVyYWJsZT1Ob25lLCAqKmt3ZHMpOgorICAgICAgICAnJydMaWtlIGRpY3QudXBkYXRlKCkgYnV0IHN1YnRyYWN0cyBjb3VudHMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlbS4KKyAgICAgICAgQ291bnRzIGNhbiBiZSByZWR1Y2VkIGJlbG93IHplcm8uICBCb3RoIHRoZSBpbnB1dHMgYW5kIG91dHB1dHMgYXJlCisgICAgICAgIGFsbG93ZWQgdG8gY29udGFpbiB6ZXJvIGFuZCBuZWdhdGl2ZSBjb3VudHMuCisKKyAgICAgICAgU291cmNlIGNhbiBiZSBhbiBpdGVyYWJsZSwgYSBkaWN0aW9uYXJ5LCBvciBhbm90aGVyIENvdW50ZXIgaW5zdGFuY2UuCisKKyAgICAgICAgPj4+IGMgPSBDb3VudGVyKCd3aGljaCcpCisgICAgICAgID4+PiBjLnN1YnRyYWN0KCd3aXRjaCcpICAgICAgICAgICAgICMgc3VidHJhY3QgZWxlbWVudHMgZnJvbSBhbm90aGVyIGl0ZXJhYmxlCisgICAgICAgID4+PiBjLnN1YnRyYWN0KENvdW50ZXIoJ3dhdGNoJykpICAgICMgc3VidHJhY3QgZWxlbWVudHMgZnJvbSBhbm90aGVyIGNvdW50ZXIKKyAgICAgICAgPj4+IGNbJ2gnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyAyIGluIHdoaWNoLCBtaW51cyAxIGluIHdpdGNoLCBtaW51cyAxIGluIHdhdGNoCisgICAgICAgIDAKKyAgICAgICAgPj4+IGNbJ3cnXSAgICAgICAgICAgICAgICAgICAgICAgICAgIyAxIGluIHdoaWNoLCBtaW51cyAxIGluIHdpdGNoLCBtaW51cyAxIGluIHdhdGNoCisgICAgICAgIC0xCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIGl0ZXJhYmxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZl9nZXQgPSBzZWxmLmdldAorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVyYWJsZSwgTWFwcGluZyk6CisgICAgICAgICAgICAgICAgZm9yIGVsZW0sIGNvdW50IGluIGl0ZXJhYmxlLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGZbZWxlbV0gPSBzZWxmX2dldChlbGVtLCAwKSAtIGNvdW50CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBlbGVtIGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgICAgICAgICBzZWxmW2VsZW1dID0gc2VsZl9nZXQoZWxlbSwgMCkgLSAxCisgICAgICAgIGlmIGt3ZHM6CisgICAgICAgICAgICBzZWxmLnN1YnRyYWN0KGt3ZHMpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgJ1JldHVybiBhIHNoYWxsb3cgY29weS4nCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmKQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXywgKGRpY3Qoc2VsZiksKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGVsZW0pOgorICAgICAgICAnTGlrZSBkaWN0Ll9fZGVsaXRlbV9fKCkgYnV0IGRvZXMgbm90IHJhaXNlIEtleUVycm9yIGZvciBtaXNzaW5nIHZhbHVlcy4nCisgICAgICAgIGlmIGVsZW0gaW4gc2VsZjoKKyAgICAgICAgICAgIHN1cGVyKENvdW50ZXIsIHNlbGYpLl9fZGVsaXRlbV9fKGVsZW0pCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuICclcygpJyAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIGl0ZW1zID0gJywgJy5qb2luKG1hcCgnJXI6ICVyJy5fX21vZF9fLCBzZWxmLm1vc3RfY29tbW9uKCkpKQorICAgICAgICByZXR1cm4gJyVzKHslc30pJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgaXRlbXMpCisKKyAgICAjIE11bHRpc2V0LXN0eWxlIG1hdGhlbWF0aWNhbCBvcGVyYXRpb25zIGRpc2N1c3NlZCBpbjoKKyAgICAjICAgICAgIEtudXRoIFRBT0NQIFZvbHVtZSBJSSBzZWN0aW9uIDQuNi4zIGV4ZXJjaXNlIDE5CisgICAgIyAgICAgICBhbmQgYXQgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NdWx0aXNldAorICAgICMKKyAgICAjIE91dHB1dHMgZ3VhcmFudGVlZCB0byBvbmx5IGluY2x1ZGUgcG9zaXRpdmUgY291bnRzLgorICAgICMKKyAgICAjIFRvIHN0cmlwIG5lZ2F0aXZlIGFuZCB6ZXJvIGNvdW50cywgYWRkLWluIGFuIGVtcHR5IGNvdW50ZXI6CisgICAgIyAgICAgICBjICs9IENvdW50ZXIoKQorCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAnJydBZGQgY291bnRzIGZyb20gdHdvIGNvdW50ZXJzLgorCisgICAgICAgID4+PiBDb3VudGVyKCdhYmJiJykgKyBDb3VudGVyKCdiY2MnKQorICAgICAgICBDb3VudGVyKHsnYic6IDQsICdjJzogMiwgJ2EnOiAxfSkKKworICAgICAgICAnJycKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIENvdW50ZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJlc3VsdCA9IENvdW50ZXIoKQorICAgICAgICBmb3IgZWxlbSwgY291bnQgaW4gc2VsZi5pdGVtcygpOgorICAgICAgICAgICAgbmV3Y291bnQgPSBjb3VudCArIG90aGVyW2VsZW1dCisgICAgICAgICAgICBpZiBuZXdjb3VudCA+IDA6CisgICAgICAgICAgICAgICAgcmVzdWx0W2VsZW1dID0gbmV3Y291bnQKKyAgICAgICAgZm9yIGVsZW0sIGNvdW50IGluIG90aGVyLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBlbGVtIG5vdCBpbiBzZWxmIGFuZCBjb3VudCA+IDA6CisgICAgICAgICAgICAgICAgcmVzdWx0W2VsZW1dID0gY291bnQKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAnJycgU3VidHJhY3QgY291bnQsIGJ1dCBrZWVwIG9ubHkgcmVzdWx0cyB3aXRoIHBvc2l0aXZlIGNvdW50cy4KKworICAgICAgICA+Pj4gQ291bnRlcignYWJiYmMnKSAtIENvdW50ZXIoJ2JjY2QnKQorICAgICAgICBDb3VudGVyKHsnYic6IDIsICdhJzogMX0pCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBDb3VudGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXN1bHQgPSBDb3VudGVyKCkKKyAgICAgICAgZm9yIGVsZW0sIGNvdW50IGluIHNlbGYuaXRlbXMoKToKKyAgICAgICAgICAgIG5ld2NvdW50ID0gY291bnQgLSBvdGhlcltlbGVtXQorICAgICAgICAgICAgaWYgbmV3Y291bnQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtlbGVtXSA9IG5ld2NvdW50CisgICAgICAgIGZvciBlbGVtLCBjb3VudCBpbiBvdGhlci5pdGVtcygpOgorICAgICAgICAgICAgaWYgZWxlbSBub3QgaW4gc2VsZiBhbmQgY291bnQgPCAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtlbGVtXSA9IDAgLSBjb3VudAorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19vcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgJycnVW5pb24gaXMgdGhlIG1heGltdW0gb2YgdmFsdWUgaW4gZWl0aGVyIG9mIHRoZSBpbnB1dCBjb3VudGVycy4KKworICAgICAgICA+Pj4gQ291bnRlcignYWJiYicpIHwgQ291bnRlcignYmNjJykKKyAgICAgICAgQ291bnRlcih7J2InOiAzLCAnYyc6IDIsICdhJzogMX0pCisKKyAgICAgICAgJycnCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBDb3VudGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXN1bHQgPSBDb3VudGVyKCkKKyAgICAgICAgZm9yIGVsZW0sIGNvdW50IGluIHNlbGYuaXRlbXMoKToKKyAgICAgICAgICAgIG90aGVyX2NvdW50ID0gb3RoZXJbZWxlbV0KKyAgICAgICAgICAgIG5ld2NvdW50ID0gb3RoZXJfY291bnQgaWYgY291bnQgPCBvdGhlcl9jb3VudCBlbHNlIGNvdW50CisgICAgICAgICAgICBpZiBuZXdjb3VudCA+IDA6CisgICAgICAgICAgICAgICAgcmVzdWx0W2VsZW1dID0gbmV3Y291bnQKKyAgICAgICAgZm9yIGVsZW0sIGNvdW50IGluIG90aGVyLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBlbGVtIG5vdCBpbiBzZWxmIGFuZCBjb3VudCA+IDA6CisgICAgICAgICAgICAgICAgcmVzdWx0W2VsZW1dID0gY291bnQKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9fYW5kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAnJycgSW50ZXJzZWN0aW9uIGlzIHRoZSBtaW5pbXVtIG9mIGNvcnJlc3BvbmRpbmcgY291bnRzLgorCisgICAgICAgID4+PiBDb3VudGVyKCdhYmJiJykgJiBDb3VudGVyKCdiY2MnKQorICAgICAgICBDb3VudGVyKHsnYic6IDF9KQorCisgICAgICAgICcnJworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgQ291bnRlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmVzdWx0ID0gQ291bnRlcigpCisgICAgICAgIGZvciBlbGVtLCBjb3VudCBpbiBzZWxmLml0ZW1zKCk6CisgICAgICAgICAgICBvdGhlcl9jb3VudCA9IG90aGVyW2VsZW1dCisgICAgICAgICAgICBuZXdjb3VudCA9IGNvdW50IGlmIGNvdW50IDwgb3RoZXJfY291bnQgZWxzZSBvdGhlcl9jb3VudAorICAgICAgICAgICAgaWYgbmV3Y291bnQgPiAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtlbGVtXSA9IG5ld2NvdW50CisgICAgICAgIHJldHVybiByZXN1bHQKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgdmVyaWZ5IHRoYXQgaW5zdGFuY2VzIGNhbiBiZSBwaWNrbGVkCisgICAgZnJvbSBjUGlja2xlIGltcG9ydCBsb2FkcywgZHVtcHMKKyAgICBQb2ludCA9IG5hbWVkdHVwbGUoJ1BvaW50JywgJ3gsIHknLCBUcnVlKQorICAgIHAgPSBQb2ludCh4PTEwLCB5PTIwKQorICAgIGFzc2VydCBwID09IGxvYWRzKGR1bXBzKHApKQorCisgICAgIyB0ZXN0IGFuZCBkZW1vbnN0cmF0ZSBhYmlsaXR5IHRvIG92ZXJyaWRlIG1ldGhvZHMKKyAgICBjbGFzcyBQb2ludChuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKSk6CisgICAgICAgIF9fc2xvdHNfXyA9ICgpCisgICAgICAgIEBwcm9wZXJ0eQorICAgICAgICBkZWYgaHlwb3Qoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gKHNlbGYueCAqKiAyICsgc2VsZi55ICoqIDIpICoqIDAuNQorICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAnUG9pbnQ6IHg9JTYuM2YgIHk9JTYuM2YgIGh5cG90PSU2LjNmJyAlIChzZWxmLngsIHNlbGYueSwgc2VsZi5oeXBvdCkKKworICAgIGZvciBwIGluIFBvaW50KDMsIDQpLCBQb2ludCgxNCwgNS83Lik6CisgICAgICAgIHByaW50IHAKKworICAgIGNsYXNzIFBvaW50KG5hbWVkdHVwbGUoJ1BvaW50JywgJ3ggeScpKToKKyAgICAgICAgJ1BvaW50IGNsYXNzIHdpdGggb3B0aW1pemVkIF9tYWtlKCkgYW5kIF9yZXBsYWNlKCkgd2l0aG91dCBlcnJvci1jaGVja2luZycKKyAgICAgICAgX19zbG90c19fID0gKCkKKyAgICAgICAgX21ha2UgPSBjbGFzc21ldGhvZCh0dXBsZS5fX25ld19fKQorICAgICAgICBkZWYgX3JlcGxhY2Uoc2VsZiwgX21hcD1tYXAsICoqa3dkcyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbWFrZShfbWFwKGt3ZHMuZ2V0LCAoJ3gnLCAneScpLCBzZWxmKSkKKworICAgIHByaW50IFBvaW50KDExLCAyMikuX3JlcGxhY2UoeD0xMDApCisKKyAgICBQb2ludDNEID0gbmFtZWR0dXBsZSgnUG9pbnQzRCcsIFBvaW50Ll9maWVsZHMgKyAoJ3onLCkpCisgICAgcHJpbnQgUG9pbnQzRC5fX2RvY19fCisKKyAgICBpbXBvcnQgZG9jdGVzdAorICAgIFRlc3RSZXN1bHRzID0gbmFtZWR0dXBsZSgnVGVzdFJlc3VsdHMnLCAnZmFpbGVkIGF0dGVtcHRlZCcpCisgICAgcHJpbnQgVGVzdFJlc3VsdHMoKmRvY3Rlc3QudGVzdG1vZCgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2xsZWN0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L2NvbGxlY3Rpb25zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTI5NmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2xsZWN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2xsZWN0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L2NvbGxlY3Rpb25zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzY4Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb2xsZWN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb2xvcnN5cy5weSBiL2xpYi9weXRob24yLjcvY29sb3JzeXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZjMGNmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29sb3JzeXMucHkKQEAgLTAsMCArMSwxNTYgQEAKKyIiIkNvbnZlcnNpb24gZnVuY3Rpb25zIGJldHdlZW4gUkdCIGFuZCBvdGhlciBjb2xvciBzeXN0ZW1zLgorCitUaGlzIG1vZHVsZXMgcHJvdmlkZXMgdHdvIGZ1bmN0aW9ucyBmb3IgZWFjaCBjb2xvciBzeXN0ZW0gQUJDOgorCisgIHJnYl90b19hYmMociwgZywgYikgLS0+IGEsIGIsIGMKKyAgYWJjX3RvX3JnYihhLCBiLCBjKSAtLT4gciwgZywgYgorCitBbGwgaW5wdXRzIGFuZCBvdXRwdXRzIGFyZSB0cmlwbGVzIG9mIGZsb2F0cyBpbiB0aGUgcmFuZ2UgWzAuMC4uLjEuMF0KKyh3aXRoIHRoZSBleGNlcHRpb24gb2YgSSBhbmQgUSwgd2hpY2ggY292ZXJzIGEgc2xpZ2h0bHkgbGFyZ2VyIHJhbmdlKS4KK0lucHV0cyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBtYXkgY2F1c2UgZXhjZXB0aW9ucyBvciBpbnZhbGlkIG91dHB1dHMuCisKK1N1cHBvcnRlZCBjb2xvciBzeXN0ZW1zOgorUkdCOiBSZWQsIEdyZWVuLCBCbHVlIGNvbXBvbmVudHMKK1lJUTogTHVtaW5hbmNlLCBDaHJvbWluYW5jZSAodXNlZCBieSBjb21wb3NpdGUgdmlkZW8gc2lnbmFscykKK0hMUzogSHVlLCBMdW1pbmFuY2UsIFNhdHVyYXRpb24KK0hTVjogSHVlLCBTYXR1cmF0aW9uLCBWYWx1ZQorIiIiCisKKyMgUmVmZXJlbmNlczoKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ZSVEKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9ITFNfY29sb3Jfc3BhY2UKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IU1ZfY29sb3Jfc3BhY2UKKworX19hbGxfXyA9IFsicmdiX3RvX3lpcSIsInlpcV90b19yZ2IiLCJyZ2JfdG9faGxzIiwiaGxzX3RvX3JnYiIsCisgICAgICAgICAgICJyZ2JfdG9faHN2IiwiaHN2X3RvX3JnYiJdCisKKyMgU29tZSBmbG9hdGluZyBwb2ludCBjb25zdGFudHMKKworT05FX1RISVJEID0gMS4wLzMuMAorT05FX1NJWFRIID0gMS4wLzYuMAorVFdPX1RISVJEID0gMi4wLzMuMAorCisjIFlJUTogdXNlZCBieSBjb21wb3NpdGUgdmlkZW8gc2lnbmFscyAobGluZWFyIGNvbWJpbmF0aW9ucyBvZiBSR0IpCisjIFk6IHBlcmNlaXZlZCBncmV5IGxldmVsICgwLjAgPT0gYmxhY2ssIDEuMCA9PSB3aGl0ZSkKKyMgSSwgUTogY29sb3IgY29tcG9uZW50cworCitkZWYgcmdiX3RvX3lpcShyLCBnLCBiKToKKyAgICB5ID0gMC4zMCpyICsgMC41OSpnICsgMC4xMSpiCisgICAgaSA9IDAuNjAqciAtIDAuMjgqZyAtIDAuMzIqYgorICAgIHEgPSAwLjIxKnIgLSAwLjUyKmcgKyAwLjMxKmIKKyAgICByZXR1cm4gKHksIGksIHEpCisKK2RlZiB5aXFfdG9fcmdiKHksIGksIHEpOgorICAgIHIgPSB5ICsgMC45NDgyNjIqaSArIDAuNjI0MDEzKnEKKyAgICBnID0geSAtIDAuMjc2MDY2KmkgLSAwLjYzOTgxMCpxCisgICAgYiA9IHkgLSAxLjEwNTQ1MCppICsgMS43Mjk4NjAqcQorICAgIGlmIHIgPCAwLjA6CisgICAgICAgIHIgPSAwLjAKKyAgICBpZiBnIDwgMC4wOgorICAgICAgICBnID0gMC4wCisgICAgaWYgYiA8IDAuMDoKKyAgICAgICAgYiA9IDAuMAorICAgIGlmIHIgPiAxLjA6CisgICAgICAgIHIgPSAxLjAKKyAgICBpZiBnID4gMS4wOgorICAgICAgICBnID0gMS4wCisgICAgaWYgYiA+IDEuMDoKKyAgICAgICAgYiA9IDEuMAorICAgIHJldHVybiAociwgZywgYikKKworCisjIEhMUzogSHVlLCBMdW1pbmFuY2UsIFNhdHVyYXRpb24KKyMgSDogcG9zaXRpb24gaW4gdGhlIHNwZWN0cnVtCisjIEw6IGNvbG9yIGxpZ2h0bmVzcworIyBTOiBjb2xvciBzYXR1cmF0aW9uCisKK2RlZiByZ2JfdG9faGxzKHIsIGcsIGIpOgorICAgIG1heGMgPSBtYXgociwgZywgYikKKyAgICBtaW5jID0gbWluKHIsIGcsIGIpCisgICAgIyBYWFggQ2FuIG9wdGltaXplIChtYXhjK21pbmMpIGFuZCAobWF4Yy1taW5jKQorICAgIGwgPSAobWluYyttYXhjKS8yLjAKKyAgICBpZiBtaW5jID09IG1heGM6CisgICAgICAgIHJldHVybiAwLjAsIGwsIDAuMAorICAgIGlmIGwgPD0gMC41OgorICAgICAgICBzID0gKG1heGMtbWluYykgLyAobWF4YyttaW5jKQorICAgIGVsc2U6CisgICAgICAgIHMgPSAobWF4Yy1taW5jKSAvICgyLjAtbWF4Yy1taW5jKQorICAgIHJjID0gKG1heGMtcikgLyAobWF4Yy1taW5jKQorICAgIGdjID0gKG1heGMtZykgLyAobWF4Yy1taW5jKQorICAgIGJjID0gKG1heGMtYikgLyAobWF4Yy1taW5jKQorICAgIGlmIHIgPT0gbWF4YzoKKyAgICAgICAgaCA9IGJjLWdjCisgICAgZWxpZiBnID09IG1heGM6CisgICAgICAgIGggPSAyLjArcmMtYmMKKyAgICBlbHNlOgorICAgICAgICBoID0gNC4wK2djLXJjCisgICAgaCA9IChoLzYuMCkgJSAxLjAKKyAgICByZXR1cm4gaCwgbCwgcworCitkZWYgaGxzX3RvX3JnYihoLCBsLCBzKToKKyAgICBpZiBzID09IDAuMDoKKyAgICAgICAgcmV0dXJuIGwsIGwsIGwKKyAgICBpZiBsIDw9IDAuNToKKyAgICAgICAgbTIgPSBsICogKDEuMCtzKQorICAgIGVsc2U6CisgICAgICAgIG0yID0gbCtzLShsKnMpCisgICAgbTEgPSAyLjAqbCAtIG0yCisgICAgcmV0dXJuIChfdihtMSwgbTIsIGgrT05FX1RISVJEKSwgX3YobTEsIG0yLCBoKSwgX3YobTEsIG0yLCBoLU9ORV9USElSRCkpCisKK2RlZiBfdihtMSwgbTIsIGh1ZSk6CisgICAgaHVlID0gaHVlICUgMS4wCisgICAgaWYgaHVlIDwgT05FX1NJWFRIOgorICAgICAgICByZXR1cm4gbTEgKyAobTItbTEpKmh1ZSo2LjAKKyAgICBpZiBodWUgPCAwLjU6CisgICAgICAgIHJldHVybiBtMgorICAgIGlmIGh1ZSA8IFRXT19USElSRDoKKyAgICAgICAgcmV0dXJuIG0xICsgKG0yLW0xKSooVFdPX1RISVJELWh1ZSkqNi4wCisgICAgcmV0dXJuIG0xCisKKworIyBIU1Y6IEh1ZSwgU2F0dXJhdGlvbiwgVmFsdWUKKyMgSDogcG9zaXRpb24gaW4gdGhlIHNwZWN0cnVtCisjIFM6IGNvbG9yIHNhdHVyYXRpb24gKCJwdXJpdHkiKQorIyBWOiBjb2xvciBicmlnaHRuZXNzCisKK2RlZiByZ2JfdG9faHN2KHIsIGcsIGIpOgorICAgIG1heGMgPSBtYXgociwgZywgYikKKyAgICBtaW5jID0gbWluKHIsIGcsIGIpCisgICAgdiA9IG1heGMKKyAgICBpZiBtaW5jID09IG1heGM6CisgICAgICAgIHJldHVybiAwLjAsIDAuMCwgdgorICAgIHMgPSAobWF4Yy1taW5jKSAvIG1heGMKKyAgICByYyA9IChtYXhjLXIpIC8gKG1heGMtbWluYykKKyAgICBnYyA9IChtYXhjLWcpIC8gKG1heGMtbWluYykKKyAgICBiYyA9IChtYXhjLWIpIC8gKG1heGMtbWluYykKKyAgICBpZiByID09IG1heGM6CisgICAgICAgIGggPSBiYy1nYworICAgIGVsaWYgZyA9PSBtYXhjOgorICAgICAgICBoID0gMi4wK3JjLWJjCisgICAgZWxzZToKKyAgICAgICAgaCA9IDQuMCtnYy1yYworICAgIGggPSAoaC82LjApICUgMS4wCisgICAgcmV0dXJuIGgsIHMsIHYKKworZGVmIGhzdl90b19yZ2IoaCwgcywgdik6CisgICAgaWYgcyA9PSAwLjA6CisgICAgICAgIHJldHVybiB2LCB2LCB2CisgICAgaSA9IGludChoKjYuMCkgIyBYWFggYXNzdW1lIGludCgpIHRydW5jYXRlcyEKKyAgICBmID0gKGgqNi4wKSAtIGkKKyAgICBwID0gdiooMS4wIC0gcykKKyAgICBxID0gdiooMS4wIC0gcypmKQorICAgIHQgPSB2KigxLjAgLSBzKigxLjAtZikpCisgICAgaSA9IGklNgorICAgIGlmIGkgPT0gMDoKKyAgICAgICAgcmV0dXJuIHYsIHQsIHAKKyAgICBpZiBpID09IDE6CisgICAgICAgIHJldHVybiBxLCB2LCBwCisgICAgaWYgaSA9PSAyOgorICAgICAgICByZXR1cm4gcCwgdiwgdAorICAgIGlmIGkgPT0gMzoKKyAgICAgICAgcmV0dXJuIHAsIHEsIHYKKyAgICBpZiBpID09IDQ6CisgICAgICAgIHJldHVybiB0LCBwLCB2CisgICAgaWYgaSA9PSA1OgorICAgICAgICByZXR1cm4gdiwgcCwgcQorICAgICMgQ2Fubm90IGdldCBoZXJlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5YyBiL2xpYi9weXRob24yLjcvY29sb3JzeXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWEwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5byBiL2xpYi9weXRob24yLjcvY29sb3JzeXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWEwMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbG9yc3lzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbW1hbmRzLnB5IGIvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGU4ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weQpAQCAtMCwwICsxLDkwIEBACisiIiJFeGVjdXRlIHNoZWxsIGNvbW1hbmRzIHZpYSBvcy5wb3BlbigpIGFuZCByZXR1cm4gc3RhdHVzLCBvdXRwdXQuCisKK0ludGVyZmFjZSBzdW1tYXJ5OgorCisgICAgICAgaW1wb3J0IGNvbW1hbmRzCisKKyAgICAgICBvdXR0ZXh0ID0gY29tbWFuZHMuZ2V0b3V0cHV0KGNtZCkKKyAgICAgICAoZXhpdHN0YXR1cywgb3V0dGV4dCkgPSBjb21tYW5kcy5nZXRzdGF0dXNvdXRwdXQoY21kKQorICAgICAgIG91dHRleHQgPSBjb21tYW5kcy5nZXRzdGF0dXMoZmlsZSkgICMgcmV0dXJucyBvdXRwdXQgb2YgImxzIC1sZCBmaWxlIgorCitBIHRyYWlsaW5nIG5ld2xpbmUgaXMgcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQgc3RyaW5nLgorCitFbmNhcHN1bGF0ZXMgdGhlIGJhc2ljIG9wZXJhdGlvbjoKKworICAgICAgcGlwZSA9IG9zLnBvcGVuKCd7ICcgKyBjbWQgKyAnOyB9IDI+JjEnLCAncicpCisgICAgICB0ZXh0ID0gcGlwZS5yZWFkKCkKKyAgICAgIHN0cyA9IHBpcGUuY2xvc2UoKQorCisgW05vdGU6ICBpdCB3b3VsZCBiZSBuaWNlIHRvIGFkZCBmdW5jdGlvbnMgdG8gaW50ZXJwcmV0IHRoZSBleGl0IHN0YXR1cy5dCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIGNvbW1hbmRzIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjA7ICIKKyAgICAgICAgICJ1c2UgdGhlIHN1YnByb2Nlc3MgbW9kdWxlIGluc3RlYWQiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworX19hbGxfXyA9IFsiZ2V0c3RhdHVzb3V0cHV0IiwiZ2V0b3V0cHV0IiwiZ2V0c3RhdHVzIl0KKworIyBNb2R1bGUgJ2NvbW1hbmRzJworIworIyBWYXJpb3VzIHRvb2xzIGZvciBleGVjdXRpbmcgY29tbWFuZHMgYW5kIGxvb2tpbmcgYXQgdGhlaXIgb3V0cHV0IGFuZCBzdGF0dXMuCisjCisjIE5CIFRoaXMgb25seSB3b3JrcyAoYW5kIGlzIG9ubHkgcmVsZXZhbnQpIGZvciBVTklYLgorCisKKyMgR2V0ICdscyAtbCcgc3RhdHVzIGZvciBhbiBvYmplY3QgaW50byBhIHN0cmluZworIworZGVmIGdldHN0YXR1cyhmaWxlKToKKyAgICAiIiJSZXR1cm4gb3V0cHV0IG9mICJscyAtbGQgPGZpbGU+IiBpbiBhIHN0cmluZy4iIiIKKyAgICBpbXBvcnQgd2FybmluZ3MKKyAgICB3YXJuaW5ncy53YXJuKCJjb21tYW5kcy5nZXRzdGF0dXMoKSBpcyBkZXByZWNhdGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorICAgIHJldHVybiBnZXRvdXRwdXQoJ2xzIC1sZCcgKyBta2FyZyhmaWxlKSkKKworCisjIEdldCB0aGUgb3V0cHV0IGZyb20gYSBzaGVsbCBjb21tYW5kIGludG8gYSBzdHJpbmcuCisjIFRoZSBleGl0IHN0YXR1cyBpcyBpZ25vcmVkOyBhIHRyYWlsaW5nIG5ld2xpbmUgaXMgc3RyaXBwZWQuCisjIEFzc3VtZSB0aGUgY29tbWFuZCB3aWxsIHdvcmsgd2l0aCAneyAuLi4gOyB9IDI+JjEnIGFyb3VuZCBpdC4uCisjCitkZWYgZ2V0b3V0cHV0KGNtZCk6CisgICAgIiIiUmV0dXJuIG91dHB1dCAoc3Rkb3V0IG9yIHN0ZGVycikgb2YgZXhlY3V0aW5nIGNtZCBpbiBhIHNoZWxsLiIiIgorICAgIHJldHVybiBnZXRzdGF0dXNvdXRwdXQoY21kKVsxXQorCisKKyMgRGl0dG8gYnV0IHByZXNlcnZpbmcgdGhlIGV4aXQgc3RhdHVzLgorIyBSZXR1cm5zIGEgcGFpciAoc3RzLCBvdXRwdXQpCisjCitkZWYgZ2V0c3RhdHVzb3V0cHV0KGNtZCk6CisgICAgIiIiUmV0dXJuIChzdGF0dXMsIG91dHB1dCkgb2YgZXhlY3V0aW5nIGNtZCBpbiBhIHNoZWxsLiIiIgorICAgIGltcG9ydCBvcworICAgIHBpcGUgPSBvcy5wb3BlbigneyAnICsgY21kICsgJzsgfSAyPiYxJywgJ3InKQorICAgIHRleHQgPSBwaXBlLnJlYWQoKQorICAgIHN0cyA9IHBpcGUuY2xvc2UoKQorICAgIGlmIHN0cyBpcyBOb25lOiBzdHMgPSAwCisgICAgaWYgdGV4dFstMTpdID09ICdcbic6IHRleHQgPSB0ZXh0WzotMV0KKyAgICByZXR1cm4gc3RzLCB0ZXh0CisKKworIyBNYWtlIGNvbW1hbmQgYXJndW1lbnQgZnJvbSBkaXJlY3RvcnkgYW5kIHBhdGhuYW1lIChwcmVmaXggc3BhY2UsIGFkZCBxdW90ZXMpLgorIworZGVmIG1rMmFyZyhoZWFkLCB4KToKKyAgICBpbXBvcnQgb3MKKyAgICByZXR1cm4gbWthcmcob3MucGF0aC5qb2luKGhlYWQsIHgpKQorCisKKyMgTWFrZSBhIHNoZWxsIGNvbW1hbmQgYXJndW1lbnQgZnJvbSBhIHN0cmluZy4KKyMgUmV0dXJuIGEgc3RyaW5nIGJlZ2lubmluZyB3aXRoIGEgc3BhY2UgZm9sbG93ZWQgYnkgYSBzaGVsbC1xdW90ZWQKKyMgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQuCisjIFR3byBzdHJhdGVnaWVzOiBlbmNsb3NlIGluIHNpbmdsZSBxdW90ZXMgaWYgaXQgY29udGFpbnMgbm9uZTsKKyMgb3RoZXJ3aXNlLCBlbmNsb3NlIGluIGRvdWJsZSBxdW90ZXMgYW5kIHByZWZpeCBxdW90YWJsZSBjaGFyYWN0ZXJzCisjIHdpdGggYmFja3NsYXNoLgorIworZGVmIG1rYXJnKHgpOgorICAgIGlmICdcJycgbm90IGluIHg6CisgICAgICAgIHJldHVybiAnIFwnJyArIHggKyAnXCcnCisgICAgcyA9ICcgIicKKyAgICBmb3IgYyBpbiB4OgorICAgICAgICBpZiBjIGluICdcXCQiYCc6CisgICAgICAgICAgICBzID0gcyArICdcXCcKKyAgICAgICAgcyA9IHMgKyBjCisgICAgcyA9IHMgKyAnIicKKyAgICByZXR1cm4gcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weWMgYi9saWIvcHl0aG9uMi43L2NvbW1hbmRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTIxOTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weW8gYi9saWIvcHl0aG9uMi43L2NvbW1hbmRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTIxOTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21tYW5kcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlYWxsLnB5IGIvbGliL3B5dGhvbjIuNy9jb21waWxlYWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YmNiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVhbGwucHkKQEAgLTAsMCArMSwyMjkgQEAKKyIiIk1vZHVsZS9zY3JpcHQgdG8gYnl0ZS1jb21waWxlIGFsbCAucHkgZmlsZXMgdG8gLnB5YyAob3IgLnB5bykgZmlsZXMuCisKK1doZW4gY2FsbGVkIGFzIGEgc2NyaXB0IHdpdGggYXJndW1lbnRzLCB0aGlzIGNvbXBpbGVzIHRoZSBkaXJlY3RvcmllcworZ2l2ZW4gYXMgYXJndW1lbnRzIHJlY3Vyc2l2ZWx5OyB0aGUgLWwgb3B0aW9uIHByZXZlbnRzIGl0IGZyb20KK3JlY3Vyc2luZyBpbnRvIGRpcmVjdG9yaWVzLgorCitXaXRob3V0IGFyZ3VtZW50cywgaWYgY29tcGlsZXMgYWxsIG1vZHVsZXMgb24gc3lzLnBhdGgsIHdpdGhvdXQKK3JlY3Vyc2luZyBpbnRvIHN1YmRpcmVjdG9yaWVzLiAgKEV2ZW4gdGhvdWdoIGl0IHNob3VsZCBkbyBzbyBmb3IKK3BhY2thZ2VzIC0tIGZvciBub3csIHlvdSdsbCBoYXZlIHRvIGRlYWwgd2l0aCBwYWNrYWdlcyBzZXBhcmF0ZWx5LikKKworU2VlIG1vZHVsZSBweV9jb21waWxlIGZvciBkZXRhaWxzIG9mIHRoZSBhY3R1YWwgYnl0ZS1jb21waWxhdGlvbi4KKyIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcHlfY29tcGlsZQoraW1wb3J0IHN0cnVjdAoraW1wb3J0IGltcAorCitfX2FsbF9fID0gWyJjb21waWxlX2RpciIsImNvbXBpbGVfZmlsZSIsImNvbXBpbGVfcGF0aCJdCisKK2RlZiBjb21waWxlX2RpcihkaXIsIG1heGxldmVscz0xMCwgZGRpcj1Ob25lLAorICAgICAgICAgICAgICAgIGZvcmNlPTAsIHJ4PU5vbmUsIHF1aWV0PTApOgorICAgICIiIkJ5dGUtY29tcGlsZSBhbGwgbW9kdWxlcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0b3J5IHRyZWUuCisKKyAgICBBcmd1bWVudHMgKG9ubHkgZGlyIGlzIHJlcXVpcmVkKToKKworICAgIGRpcjogICAgICAgdGhlIGRpcmVjdG9yeSB0byBieXRlLWNvbXBpbGUKKyAgICBtYXhsZXZlbHM6IG1heGltdW0gcmVjdXJzaW9uIGxldmVsIChkZWZhdWx0IDEwKQorICAgIGRkaXI6ICAgICAgdGhlIGRpcmVjdG9yeSB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBwYXRoIHRvIHRoZQorICAgICAgICAgICAgICAgZmlsZSBhcyBpdCBpcyBjb21waWxlZCBpbnRvIGVhY2ggYnl0ZS1jb2RlIGZpbGUuCisgICAgZm9yY2U6ICAgICBpZiAxLCBmb3JjZSBjb21waWxhdGlvbiwgZXZlbiBpZiB0aW1lc3RhbXBzIGFyZSB1cC10by1kYXRlCisgICAgcXVpZXQ6ICAgICBpZiAxLCBiZSBxdWlldCBkdXJpbmcgY29tcGlsYXRpb24KKyAgICAiIiIKKyAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgIHByaW50ICdMaXN0aW5nJywgZGlyLCAnLi4uJworICAgIHRyeToKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcikKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHByaW50ICJDYW4ndCBsaXN0IiwgZGlyCisgICAgICAgIG5hbWVzID0gW10KKyAgICBuYW1lcy5zb3J0KCkKKyAgICBzdWNjZXNzID0gMQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXIsIG5hbWUpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGFuZCBzeXMudmVyc2lvbi5maW5kKCJHQ0MiKSA+PSAwOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBmdWxsbmFtZS5yZXBsYWNlKCdcXCcsJy8nKQorICAgICAgICBpZiBkZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGZpbGUgPSBvcy5wYXRoLmpvaW4oZGRpciwgbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRmaWxlID0gTm9uZQorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICAgICBpZiBub3QgY29tcGlsZV9maWxlKGZ1bGxuYW1lLCBkZGlyLCBmb3JjZSwgcngsIHF1aWV0KToKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICBlbGlmIG1heGxldmVscyA+IDAgYW5kIFwKKyAgICAgICAgICAgICBuYW1lICE9IG9zLmN1cmRpciBhbmQgbmFtZSAhPSBvcy5wYXJkaXIgYW5kIFwKKyAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKSBhbmQgXAorICAgICAgICAgICAgIG5vdCBvcy5wYXRoLmlzbGluayhmdWxsbmFtZSk6CisgICAgICAgICAgICBpZiBub3QgY29tcGlsZV9kaXIoZnVsbG5hbWUsIG1heGxldmVscyAtIDEsIGRmaWxlLCBmb3JjZSwgcngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpZXQpOgorICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgcmV0dXJuIHN1Y2Nlc3MKKworZGVmIGNvbXBpbGVfZmlsZShmdWxsbmFtZSwgZGRpcj1Ob25lLCBmb3JjZT0wLCByeD1Ob25lLCBxdWlldD0wKToKKyAgICAiIiJCeXRlLWNvbXBpbGUgb25lIGZpbGUuCisKKyAgICBBcmd1bWVudHMgKG9ubHkgZnVsbG5hbWUgaXMgcmVxdWlyZWQpOgorCisgICAgZnVsbG5hbWU6ICB0aGUgZmlsZSB0byBieXRlLWNvbXBpbGUKKyAgICBkZGlyOiAgICAgIGlmIGdpdmVuLCB0aGUgZGlyZWN0b3J5IG5hbWUgY29tcGlsZWQgaW4gdG8gdGhlCisgICAgICAgICAgICAgICBieXRlLWNvZGUgZmlsZS4KKyAgICBmb3JjZTogICAgIGlmIDEsIGZvcmNlIGNvbXBpbGF0aW9uLCBldmVuIGlmIHRpbWVzdGFtcHMgYXJlIHVwLXRvLWRhdGUKKyAgICBxdWlldDogICAgIGlmIDEsIGJlIHF1aWV0IGR1cmluZyBjb21waWxhdGlvbgorICAgICIiIgorICAgIHN1Y2Nlc3MgPSAxCisgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZnVsbG5hbWUpCisgICAgaWYgZGRpciBpcyBub3QgTm9uZToKKyAgICAgICAgZGZpbGUgPSBvcy5wYXRoLmpvaW4oZGRpciwgbmFtZSkKKyAgICBlbHNlOgorICAgICAgICBkZmlsZSA9IE5vbmUKKyAgICBpZiByeCBpcyBub3QgTm9uZToKKyAgICAgICAgbW8gPSByeC5zZWFyY2goZnVsbG5hbWUpCisgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MKKyAgICBpZiBvcy5wYXRoLmlzZmlsZShmdWxsbmFtZSk6CisgICAgICAgIGhlYWQsIHRhaWwgPSBuYW1lWzotM10sIG5hbWVbLTM6XQorICAgICAgICBpZiB0YWlsID09ICcucHknOgorICAgICAgICAgICAgaWYgbm90IGZvcmNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbXRpbWUgPSBpbnQob3Muc3RhdChmdWxsbmFtZSkuc3RfbXRpbWUpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdCA9IHN0cnVjdC5wYWNrKCc8NHNsJywgaW1wLmdldF9tYWdpYygpLCBtdGltZSkKKyAgICAgICAgICAgICAgICAgICAgY2ZpbGUgPSBmdWxsbmFtZSArIChfX2RlYnVnX18gYW5kICdjJyBvciAnbycpCisgICAgICAgICAgICAgICAgICAgIHdpdGggb3BlbihjZmlsZSwgJ3JiJykgYXMgY2hhbmRsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9IGNoYW5kbGUucmVhZCg4KQorICAgICAgICAgICAgICAgICAgICBpZiBleHBlY3QgPT0gYWN0dWFsOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgICAgIHByaW50ICdDb21waWxpbmcnLCBmdWxsbmFtZSwgJy4uLicKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvayA9IHB5X2NvbXBpbGUuY29tcGlsZShmdWxsbmFtZSwgTm9uZSwgZGZpbGUsIFRydWUpCisgICAgICAgICAgICBleGNlcHQgcHlfY29tcGlsZS5QeUNvbXBpbGVFcnJvcixlcnI6CisgICAgICAgICAgICAgICAgaWYgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdDb21waWxpbmcnLCBmdWxsbmFtZSwgJy4uLicKKyAgICAgICAgICAgICAgICBwcmludCBlcnIubXNnCisgICAgICAgICAgICAgICAgc3VjY2VzcyA9IDAKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgICAgIHByaW50ICJTb3JyeSIsIGUKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBvayA9PSAwOgorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgIHJldHVybiBzdWNjZXNzCisKK2RlZiBjb21waWxlX3BhdGgoc2tpcF9jdXJkaXI9MSwgbWF4bGV2ZWxzPTAsIGZvcmNlPTAsIHF1aWV0PTApOgorICAgICIiIkJ5dGUtY29tcGlsZSBhbGwgbW9kdWxlIG9uIHN5cy5wYXRoLgorCisgICAgQXJndW1lbnRzIChhbGwgb3B0aW9uYWwpOgorCisgICAgc2tpcF9jdXJkaXI6IGlmIHRydWUsIHNraXAgY3VycmVudCBkaXJlY3RvcnkgKGRlZmF1bHQgdHJ1ZSkKKyAgICBtYXhsZXZlbHM6ICAgbWF4IHJlY3Vyc2lvbiBsZXZlbCAoZGVmYXVsdCAwKQorICAgIGZvcmNlOiBhcyBmb3IgY29tcGlsZV9kaXIoKSAoZGVmYXVsdCAwKQorICAgIHF1aWV0OiBhcyBmb3IgY29tcGlsZV9kaXIoKSAoZGVmYXVsdCAwKQorICAgICIiIgorICAgIHN1Y2Nlc3MgPSAxCisgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgaWYgKG5vdCBkaXIgb3IgZGlyID09IG9zLmN1cmRpcikgYW5kIHNraXBfY3VyZGlyOgorICAgICAgICAgICAgcHJpbnQgJ1NraXBwaW5nIGN1cnJlbnQgZGlyZWN0b3J5JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgYW5kIGNvbXBpbGVfZGlyKGRpciwgbWF4bGV2ZWxzLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlLCBxdWlldD1xdWlldCkKKyAgICByZXR1cm4gc3VjY2VzcworCitkZWYgZXhwYW5kX2FyZ3MoYXJncywgZmxpc3QpOgorICAgICIiInJlYWQgbmFtZXMgaW4gZmxpc3QgYW5kIGFwcGVuZCB0byBhcmdzIiIiCisgICAgZXhwYW5kZWQgPSBhcmdzWzpdCisgICAgaWYgZmxpc3Q6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGZsaXN0ID09ICctJzoKKyAgICAgICAgICAgICAgICBmZCA9IHN5cy5zdGRpbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmZCA9IG9wZW4oZmxpc3QpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGxpbmUgPSBmZC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhwYW5kZWQuYXBwZW5kKGxpbmVbOi0xXSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBwcmludCAiRXJyb3IgcmVhZGluZyBmaWxlIGxpc3QgJXMiICUgZmxpc3QKKyAgICAgICAgICAgIHJhaXNlCisgICAgcmV0dXJuIGV4cGFuZGVkCisKK2RlZiBtYWluKCk6CisgICAgIiIiU2NyaXB0IG1haW4gcHJvZ3JhbS4iIiIKKyAgICBpbXBvcnQgZ2V0b3B0CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdsZnFkOng6aTonKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgcHJpbnQgbXNnCisgICAgICAgIHByaW50ICJ1c2FnZTogcHl0aG9uIGNvbXBpbGVhbGwucHkgWy1sXSBbLWZdIFstcV0gWy1kIGRlc3RkaXJdICIgXAorICAgICAgICAgICAgICAiWy14IHJlZ2V4cF0gWy1pIGxpc3RdIFtkaXJlY3Rvcnl8ZmlsZSAuLi5dIgorICAgICAgICBwcmludAorICAgICAgICBwcmludCAiYXJndW1lbnRzOiB6ZXJvIG9yIG1vcmUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIHRvIGNvbXBpbGU7ICIgXAorICAgICAgICAgICAgICAiaWYgbm8gYXJndW1lbnRzIGdpdmVuLCAiCisgICAgICAgIHByaW50ICIgICAgICAgICAgIGRlZmF1bHRzIHRvIHRoZSBlcXVpdmFsZW50IG9mIC1sIHN5cy5wYXRoIgorICAgICAgICBwcmludAorICAgICAgICBwcmludCAib3B0aW9uczoiCisgICAgICAgIHByaW50ICItbDogZG9uJ3QgcmVjdXJzZSBpbnRvIHN1YmRpcmVjdG9yaWVzIgorICAgICAgICBwcmludCAiLWY6IGZvcmNlIHJlYnVpbGQgZXZlbiBpZiB0aW1lc3RhbXBzIGFyZSB1cC10by1kYXRlIgorICAgICAgICBwcmludCAiLXE6IG91dHB1dCBvbmx5IGVycm9yIG1lc3NhZ2VzIgorICAgICAgICBwcmludCAiLWQgZGVzdGRpcjogZGlyZWN0b3J5IHRvIHByZXBlbmQgdG8gZmlsZSBwYXRocyBmb3IgdXNlIGluICIgXAorICAgICAgICAgICAgICAiY29tcGlsZS10aW1lIHRyYWNlYmFja3MgYW5kIGluIgorICAgICAgICBwcmludCAiICAgICAgICAgICAgcnVudGltZSB0cmFjZWJhY2tzIGluIGNhc2VzIHdoZXJlIHRoZSBzb3VyY2UgIiBcCisgICAgICAgICAgICAgICJmaWxlIGlzIHVuYXZhaWxhYmxlIgorICAgICAgICBwcmludCAiLXggcmVnZXhwOiBza2lwIGZpbGVzIG1hdGNoaW5nIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcmVnZXhwOyAiIFwKKyAgICAgICAgICAgICAgInRoZSByZWdleHAgaXMgc2VhcmNoZWQgZm9yIgorICAgICAgICBwcmludCAiICAgICAgICAgICBpbiB0aGUgZnVsbCBwYXRoIG9mIGVhY2ggZmlsZSBjb25zaWRlcmVkIGZvciAiIFwKKyAgICAgICAgICAgICAgImNvbXBpbGF0aW9uIgorICAgICAgICBwcmludCAiLWkgZmlsZTogYWRkIGFsbCB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGxpc3RlZCBpbiBmaWxlIHRvICIgXAorICAgICAgICAgICAgICAidGhlIGxpc3QgY29uc2lkZXJlZCBmb3IiCisgICAgICAgIHByaW50ICcgICAgICAgICBjb21waWxhdGlvbjsgaWYgIi0iLCBuYW1lcyBhcmUgcmVhZCBmcm9tIHN0ZGluJworCisgICAgICAgIHN5cy5leGl0KDIpCisgICAgbWF4bGV2ZWxzID0gMTAKKyAgICBkZGlyID0gTm9uZQorICAgIGZvcmNlID0gMAorICAgIHF1aWV0ID0gMAorICAgIHJ4ID0gTm9uZQorICAgIGZsaXN0ID0gTm9uZQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy1sJzogbWF4bGV2ZWxzID0gMAorICAgICAgICBpZiBvID09ICctZCc6IGRkaXIgPSBhCisgICAgICAgIGlmIG8gPT0gJy1mJzogZm9yY2UgPSAxCisgICAgICAgIGlmIG8gPT0gJy1xJzogcXVpZXQgPSAxCisgICAgICAgIGlmIG8gPT0gJy14JzoKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgcnggPSByZS5jb21waWxlKGEpCisgICAgICAgIGlmIG8gPT0gJy1pJzogZmxpc3QgPSBhCisgICAgaWYgZGRpcjoKKyAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDEgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKGFyZ3NbMF0pOgorICAgICAgICAgICAgcHJpbnQgIi1kIGRlc3RkaXIgcmVxdWlyZSBleGFjdGx5IG9uZSBkaXJlY3RvcnkgYXJndW1lbnQiCisgICAgICAgICAgICBzeXMuZXhpdCgyKQorICAgIHN1Y2Nlc3MgPSAxCisgICAgdHJ5OgorICAgICAgICBpZiBhcmdzIG9yIGZsaXN0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGZsaXN0OgorICAgICAgICAgICAgICAgICAgICBhcmdzID0gZXhwYW5kX2FyZ3MoYXJncywgZmxpc3QpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgaWYgc3VjY2VzczoKKyAgICAgICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoYXJnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjb21waWxlX2RpcihhcmcsIG1heGxldmVscywgZGRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSwgcngsIHF1aWV0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gMAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNvbXBpbGVfZmlsZShhcmcsIGRkaXIsIGZvcmNlLCByeCwgcXVpZXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWNjZXNzID0gY29tcGlsZV9wYXRoKCkKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHByaW50ICJcbltpbnRlcnJ1cHRlZF0iCisgICAgICAgIHN1Y2Nlc3MgPSAwCisgICAgcmV0dXJuIHN1Y2Nlc3MKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBleGl0X3N0YXR1cyA9IGludChub3QgbWFpbigpKQorICAgIHN5cy5leGl0KGV4aXRfc3RhdHVzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlYWxsLnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyYWZmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlYWxsLnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyYWZmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZWFsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2ZjY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMSBAQAorIiIiUGFja2FnZSBmb3IgcGFyc2luZyBhbmQgY29tcGlsaW5nIFB5dGhvbiBzb3VyY2UgY29kZQorCitUaGVyZSBhcmUgc2V2ZXJhbCBmdW5jdGlvbnMgZGVmaW5lZCBhdCB0aGUgdG9wIGxldmVsIHRoYXQgYXJlIGltcG9ydGVkCitmcm9tIG1vZHVsZXMgY29udGFpbmVkIGluIHRoZSBwYWNrYWdlLgorCitwYXJzZShidWYsIG1vZGU9ImV4ZWMiKSAtPiBBU1QKKyAgICBDb252ZXJ0cyBhIHN0cmluZyBjb250YWluaW5nIFB5dGhvbiBzb3VyY2UgY29kZSB0byBhbiBhYnN0cmFjdAorICAgIHN5bnRheCB0cmVlIChBU1QpLiAgVGhlIEFTVCBpcyBkZWZpbmVkIGluIGNvbXBpbGVyLmFzdC4KKworcGFyc2VGaWxlKHBhdGgpIC0+IEFTVAorICAgIFRoZSBzYW1lIGFzIHBhcnNlKG9wZW4ocGF0aCkpCisKK3dhbGsoYXN0LCB2aXNpdG9yLCB2ZXJib3NlPU5vbmUpCisgICAgRG9lcyBhIHByZS1vcmRlciB3YWxrIG92ZXIgdGhlIGFzdCB1c2luZyB0aGUgdmlzaXRvciBpbnN0YW5jZS4KKyAgICBTZWUgY29tcGlsZXIudmlzaXRvciBmb3IgZGV0YWlscy4KKworY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCBtb2RlLCBmbGFncz1Ob25lLCBkb250X2luaGVyaXQ9Tm9uZSkKKyAgICBSZXR1cm5zIGEgY29kZSBvYmplY3QuICBBIHJlcGxhY2VtZW50IGZvciB0aGUgYnVpbHRpbiBjb21waWxlKCkgZnVuY3Rpb24uCisKK2NvbXBpbGVGaWxlKGZpbGVuYW1lKQorICAgIEdlbmVyYXRlcyBhIC5weWMgZmlsZSBieSBjb21waWxpbmcgZmlsZW5hbWUuCisiIiIKKworaW1wb3J0IHdhcm5pbmdzCisKK3dhcm5pbmdzLndhcm4oIlRoZSBjb21waWxlciBwYWNrYWdlIGlzIGRlcHJlY2F0ZWQgYW5kIHJlbW92ZWQgaW4gUHl0aG9uIDMueC4iLAorICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKworZnJvbSBjb21waWxlci50cmFuc2Zvcm1lciBpbXBvcnQgcGFyc2UsIHBhcnNlRmlsZQorZnJvbSBjb21waWxlci52aXNpdG9yIGltcG9ydCB3YWxrCitmcm9tIGNvbXBpbGVyLnB5Y29kZWdlbiBpbXBvcnQgY29tcGlsZSwgY29tcGlsZUZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhNDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhNDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvYXN0LnB5IGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9hc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzZmMxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvYXN0LnB5CkBAIC0wLDAgKzEsMTQxOSBAQAorIiIiUHl0aG9uIGFic3RyYWN0IHN5bnRheCBub2RlIGRlZmluaXRpb25zCisKK1RoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBUb29scy9jb21waWxlci9hc3RnZW4ucHkKKyIiIgorZnJvbSBjb21waWxlci5jb25zdHMgaW1wb3J0IENPX1ZBUkFSR1MsIENPX1ZBUktFWVdPUkRTCisKK2RlZiBmbGF0dGVuKHNlcSk6CisgICAgbCA9IFtdCisgICAgZm9yIGVsdCBpbiBzZXE6CisgICAgICAgIHQgPSB0eXBlKGVsdCkKKyAgICAgICAgaWYgdCBpcyB0dXBsZSBvciB0IGlzIGxpc3Q6CisgICAgICAgICAgICBmb3IgZWx0MiBpbiBmbGF0dGVuKGVsdCk6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoZWx0MikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGwuYXBwZW5kKGVsdCkKKyAgICByZXR1cm4gbAorCitkZWYgZmxhdHRlbl9ub2RlcyhzZXEpOgorICAgIHJldHVybiBbbiBmb3IgbiBpbiBmbGF0dGVuKHNlcSkgaWYgaXNpbnN0YW5jZShuLCBOb2RlKV0KKworbm9kZXMgPSB7fQorCitjbGFzcyBOb2RlOgorICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGFzdCBub2Rlcy4iIiIKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHBhc3MgIyBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgbiBpbiBzZWxmLmdldENoaWxkcmVuKCk6CisgICAgICAgICAgICB5aWVsZCBuCisgICAgZGVmIGFzTGlzdChzZWxmKTogIyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0Q2hpbGRyZW4oKQorICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBwYXNzICMgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcworCitjbGFzcyBFbXB0eU5vZGUoTm9kZSk6CisgICAgcGFzcworCitjbGFzcyBFeHByZXNzaW9uKE5vZGUpOgorICAgICMgRXhwcmVzc2lvbiBpcyBhbiBhcnRpZmljaWFsIG5vZGUgY2xhc3MgdG8gc3VwcG9ydCAiZXZhbCIKKyAgICBub2Rlc1siZXhwcmVzc2lvbiJdID0gIkV4cHJlc3Npb24iCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5vZGUsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubm9kZSwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJFeHByZXNzaW9uKCVzKSIgJSAocmVwcihzZWxmLm5vZGUpKQorCitjbGFzcyBBZGQoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnRyaWdodCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0cmlnaHRbMF0KKyAgICAgICAgc2VsZi5yaWdodCA9IGxlZnRyaWdodFsxXQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkFkZCgoJXMsICVzKSkiICUgKHJlcHIoc2VsZi5sZWZ0KSwgcmVwcihzZWxmLnJpZ2h0KSkKKworY2xhc3MgQW5kKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkFuZCglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBBc3NBdHRyKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBhdHRybmFtZSwgZmxhZ3MsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLmF0dHJuYW1lID0gYXR0cm5hbWUKKyAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsIHNlbGYuYXR0cm5hbWUsIHNlbGYuZmxhZ3MKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkFzc0F0dHIoJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByKSwgcmVwcihzZWxmLmF0dHJuYW1lKSwgcmVwcihzZWxmLmZsYWdzKSkKKworY2xhc3MgQXNzTGlzdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJBc3NMaXN0KCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIEFzc05hbWUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZsYWdzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUsIHNlbGYuZmxhZ3MKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJBc3NOYW1lKCVzLCAlcykiICUgKHJlcHIoc2VsZi5uYW1lKSwgcmVwcihzZWxmLmZsYWdzKSkKKworY2xhc3MgQXNzVHVwbGUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQXNzVHVwbGUoJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCkKKworY2xhc3MgQXNzZXJ0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0LCBmYWlsLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5mYWlsID0gZmFpbAorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLnRlc3QpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmZhaWwpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLnRlc3QpCisgICAgICAgIGlmIHNlbGYuZmFpbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmZhaWwpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJBc3NlcnQoJXMsICVzKSIgJSAocmVwcihzZWxmLnRlc3QpLCByZXByKHNlbGYuZmFpbCkpCisKK2NsYXNzIEFzc2lnbihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGV4cHIsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLm5vZGVzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJBc3NpZ24oJXMsICVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwgcmVwcihzZWxmLmV4cHIpKQorCitjbGFzcyBBdWdBc3NpZ24oTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGUsIG9wLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZSA9IG5vZGUKKyAgICAgICAgc2VsZi5vcCA9IG9wCisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubm9kZSwgc2VsZi5vcCwgc2VsZi5leHByCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubm9kZSwgc2VsZi5leHByCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQXVnQXNzaWduKCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYubm9kZSksIHJlcHIoc2VsZi5vcCksIHJlcHIoc2VsZi5leHByKSkKKworY2xhc3MgQmFja3F1b3RlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkJhY2txdW90ZSglcykiICUgKHJlcHIoc2VsZi5leHByKSwpCisKK2NsYXNzIEJpdGFuZChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJCaXRhbmQoJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCkKKworY2xhc3MgQml0b3IoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQml0b3IoJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCkKKworY2xhc3MgQml0eG9yKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkJpdHhvciglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBCcmVhayhOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gKCkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJCcmVhaygpIgorCitjbGFzcyBDYWxsRnVuYyhOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZSwgYXJncywgc3Rhcl9hcmdzID0gTm9uZSwgZHN0YXJfYXJncyA9IE5vbmUsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICBzZWxmLmFyZ3MgPSBhcmdzCisgICAgICAgIHNlbGYuc3Rhcl9hcmdzID0gc3Rhcl9hcmdzCisgICAgICAgIHNlbGYuZHN0YXJfYXJncyA9IGRzdGFyX2FyZ3MKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5ub2RlKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLmFyZ3MpKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5zdGFyX2FyZ3MpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmRzdGFyX2FyZ3MpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLm5vZGUpCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYuYXJncykpCisgICAgICAgIGlmIHNlbGYuc3Rhcl9hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuc3Rhcl9hcmdzKQorICAgICAgICBpZiBzZWxmLmRzdGFyX2FyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5kc3Rhcl9hcmdzKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQ2FsbEZ1bmMoJXMsICVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYubm9kZSksIHJlcHIoc2VsZi5hcmdzKSwgcmVwcihzZWxmLnN0YXJfYXJncyksIHJlcHIoc2VsZi5kc3Rhcl9hcmdzKSkKKworY2xhc3MgQ2xhc3MoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGJhc2VzLCBkb2MsIGNvZGUsIGRlY29yYXRvcnMgPSBOb25lLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5iYXNlcyA9IGJhc2VzCisgICAgICAgIHNlbGYuZG9jID0gZG9jCisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKyAgICAgICAgc2VsZi5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLm5hbWUpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYuYmFzZXMpKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5kb2MpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmNvZGUpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmRlY29yYXRvcnMpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYuYmFzZXMpKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5jb2RlKQorICAgICAgICBpZiBzZWxmLmRlY29yYXRvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5kZWNvcmF0b3JzKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQ2xhc3MoJXMsICVzLCAlcywgJXMsICVzKSIgJSAocmVwcihzZWxmLm5hbWUpLCByZXByKHNlbGYuYmFzZXMpLCByZXByKHNlbGYuZG9jKSwgcmVwcihzZWxmLmNvZGUpLCByZXByKHNlbGYuZGVjb3JhdG9ycykpCisKK2NsYXNzIENvbXBhcmUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIG9wcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYub3BzID0gb3BzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5vcHMpKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm9wcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJDb21wYXJlKCVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByKSwgcmVwcihzZWxmLm9wcykpCisKK2NsYXNzIENvbnN0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQ29uc3QoJXMpIiAlIChyZXByKHNlbGYudmFsdWUpLCkKKworY2xhc3MgQ29udGludWUoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQ29udGludWUoKSIKKworY2xhc3MgRGVjb3JhdG9ycyhOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJEZWNvcmF0b3JzKCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIERpY3QoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZW1zLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuaXRlbXMgPSBpdGVtcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLml0ZW1zKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYuaXRlbXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRGljdCglcykiICUgKHJlcHIoc2VsZi5pdGVtcyksKQorCitjbGFzcyBEaXNjYXJkKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkRpc2NhcmQoJXMpIiAlIChyZXByKHNlbGYuZXhwciksKQorCitjbGFzcyBEaXYoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnRyaWdodCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0cmlnaHRbMF0KKyAgICAgICAgc2VsZi5yaWdodCA9IGxlZnRyaWdodFsxXQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkRpdigoJXMsICVzKSkiICUgKHJlcHIoc2VsZi5sZWZ0KSwgcmVwcihzZWxmLnJpZ2h0KSkKKworY2xhc3MgRWxsaXBzaXMoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRWxsaXBzaXMoKSIKKworY2xhc3MgRXhlYyhOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgbG9jYWxzLCBnbG9iYWxzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5sb2NhbHMgPSBsb2NhbHMKKyAgICAgICAgc2VsZi5nbG9iYWxzID0gZ2xvYmFscworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmxvY2FscykKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZ2xvYmFscykKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgaWYgc2VsZi5sb2NhbHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5sb2NhbHMpCisgICAgICAgIGlmIHNlbGYuZ2xvYmFscyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmdsb2JhbHMpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJFeGVjKCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuZXhwciksIHJlcHIoc2VsZi5sb2NhbHMpLCByZXByKHNlbGYuZ2xvYmFscykpCisKK2NsYXNzIEZsb29yRGl2KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0cmlnaHQsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdHJpZ2h0WzBdCisgICAgICAgIHNlbGYucmlnaHQgPSBsZWZ0cmlnaHRbMV0KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJGbG9vckRpdigoJXMsICVzKSkiICUgKHJlcHIoc2VsZi5sZWZ0KSwgcmVwcihzZWxmLnJpZ2h0KSkKKworY2xhc3MgRm9yKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhc3NpZ24sIGxpc3QsIGJvZHksIGVsc2VfLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuYXNzaWduID0gYXNzaWduCisgICAgICAgIHNlbGYubGlzdCA9IGxpc3QKKyAgICAgICAgc2VsZi5ib2R5ID0gYm9keQorICAgICAgICBzZWxmLmVsc2VfID0gZWxzZV8KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5hc3NpZ24pCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmxpc3QpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmJvZHkpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmVsc2VfKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5hc3NpZ24pCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmxpc3QpCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmJvZHkpCisgICAgICAgIGlmIHNlbGYuZWxzZV8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5lbHNlXykKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkZvciglcywgJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5hc3NpZ24pLCByZXByKHNlbGYubGlzdCksIHJlcHIoc2VsZi5ib2R5KSwgcmVwcihzZWxmLmVsc2VfKSkKKworY2xhc3MgRnJvbShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kbmFtZSwgbmFtZXMsIGxldmVsLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubW9kbmFtZSA9IG1vZG5hbWUKKyAgICAgICAgc2VsZi5uYW1lcyA9IG5hbWVzCisgICAgICAgIHNlbGYubGV2ZWwgPSBsZXZlbAorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tb2RuYW1lLCBzZWxmLm5hbWVzLCBzZWxmLmxldmVsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRnJvbSglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLm1vZG5hbWUpLCByZXByKHNlbGYubmFtZXMpLCByZXByKHNlbGYubGV2ZWwpKQorCitjbGFzcyBGdW5jdGlvbihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVjb3JhdG9ycywgbmFtZSwgYXJnbmFtZXMsIGRlZmF1bHRzLCBmbGFncywgZG9jLCBjb2RlLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZGVjb3JhdG9ycyA9IGRlY29yYXRvcnMKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmFyZ25hbWVzID0gYXJnbmFtZXMKKyAgICAgICAgc2VsZi5kZWZhdWx0cyA9IGRlZmF1bHRzCisgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLmRvYyA9IGRvYworICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIHNlbGYudmFyYXJncyA9IHNlbGYua3dhcmdzID0gTm9uZQorICAgICAgICBpZiBmbGFncyAmIENPX1ZBUkFSR1M6CisgICAgICAgICAgICBzZWxmLnZhcmFyZ3MgPSAxCisgICAgICAgIGlmIGZsYWdzICYgQ09fVkFSS0VZV09SRFM6CisgICAgICAgICAgICBzZWxmLmt3YXJncyA9IDEKKworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmRlY29yYXRvcnMpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLm5hbWUpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmFyZ25hbWVzKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLmRlZmF1bHRzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZmxhZ3MpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmRvYykKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuY29kZSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgaWYgc2VsZi5kZWNvcmF0b3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZGVjb3JhdG9ycykKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5kZWZhdWx0cykpCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmNvZGUpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJGdW5jdGlvbiglcywgJXMsICVzLCAlcywgJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5kZWNvcmF0b3JzKSwgcmVwcihzZWxmLm5hbWUpLCByZXByKHNlbGYuYXJnbmFtZXMpLCByZXByKHNlbGYuZGVmYXVsdHMpLCByZXByKHNlbGYuZmxhZ3MpLCByZXByKHNlbGYuZG9jKSwgcmVwcihzZWxmLmNvZGUpKQorCitjbGFzcyBHZW5FeHByKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgc2VsZi5hcmduYW1lcyA9IFsnLjAnXQorICAgICAgICBzZWxmLnZhcmFyZ3MgPSBzZWxmLmt3YXJncyA9IE5vbmUKKworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jb2RlLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvZGUsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiR2VuRXhwciglcykiICUgKHJlcHIoc2VsZi5jb2RlKSwpCisKK2NsYXNzIEdlbkV4cHJGb3IoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFzc2lnbiwgaXRlciwgaWZzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuYXNzaWduID0gYXNzaWduCisgICAgICAgIHNlbGYuaXRlciA9IGl0ZXIKKyAgICAgICAgc2VsZi5pZnMgPSBpZnMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgc2VsZi5pc19vdXRtb3N0ID0gRmFsc2UKKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5hc3NpZ24pCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLml0ZXIpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYuaWZzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuYXNzaWduKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5pdGVyKQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLmlmcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJHZW5FeHByRm9yKCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuYXNzaWduKSwgcmVwcihzZWxmLml0ZXIpLCByZXByKHNlbGYuaWZzKSkKKworY2xhc3MgR2VuRXhwcklmKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYudGVzdCA9IHRlc3QKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGVzdCwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXN0LAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkdlbkV4cHJJZiglcykiICUgKHJlcHIoc2VsZi50ZXN0KSwpCisKK2NsYXNzIEdlbkV4cHJJbm5lcihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgcXVhbHMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLnF1YWxzID0gcXVhbHMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLnF1YWxzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5xdWFscykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJHZW5FeHBySW5uZXIoJXMsICVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCByZXByKHNlbGYucXVhbHMpKQorCitjbGFzcyBHZXRhdHRyKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBhdHRybmFtZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYuYXR0cm5hbWUgPSBhdHRybmFtZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLCBzZWxmLmF0dHJuYW1lCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJHZXRhdHRyKCVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByKSwgcmVwcihzZWxmLmF0dHJuYW1lKSkKKworY2xhc3MgR2xvYmFsKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5hbWVzID0gbmFtZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZXMsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiR2xvYmFsKCVzKSIgJSAocmVwcihzZWxmLm5hbWVzKSwpCisKK2NsYXNzIElmKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0cywgZWxzZV8sIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi50ZXN0cyA9IHRlc3RzCisgICAgICAgIHNlbGYuZWxzZV8gPSBlbHNlXworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYudGVzdHMpKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5lbHNlXykKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi50ZXN0cykpCisgICAgICAgIGlmIHNlbGYuZWxzZV8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5lbHNlXykKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIklmKCVzLCAlcykiICUgKHJlcHIoc2VsZi50ZXN0cyksIHJlcHIoc2VsZi5lbHNlXykpCisKK2NsYXNzIElmRXhwKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0LCB0aGVuLCBlbHNlXywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYudGhlbiA9IHRoZW4KKyAgICAgICAgc2VsZi5lbHNlXyA9IGVsc2VfCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlc3QsIHNlbGYudGhlbiwgc2VsZi5lbHNlXworCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlc3QsIHNlbGYudGhlbiwgc2VsZi5lbHNlXworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIklmRXhwKCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYudGVzdCksIHJlcHIoc2VsZi50aGVuKSwgcmVwcihzZWxmLmVsc2VfKSkKKworY2xhc3MgSW1wb3J0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5hbWVzID0gbmFtZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZXMsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSW1wb3J0KCVzKSIgJSAocmVwcihzZWxmLm5hbWVzKSwpCisKK2NsYXNzIEludmVydChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJJbnZlcnQoJXMpIiAlIChyZXByKHNlbGYuZXhwciksKQorCitjbGFzcyBLZXl3b3JkKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lLCBzZWxmLmV4cHIKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIktleXdvcmQoJXMsICVzKSIgJSAocmVwcihzZWxmLm5hbWUpLCByZXByKHNlbGYuZXhwcikpCisKK2NsYXNzIExhbWJkYShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnbmFtZXMsIGRlZmF1bHRzLCBmbGFncywgY29kZSwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmFyZ25hbWVzID0gYXJnbmFtZXMKKyAgICAgICAgc2VsZi5kZWZhdWx0cyA9IGRlZmF1bHRzCisgICAgICAgIHNlbGYuZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIHNlbGYudmFyYXJncyA9IHNlbGYua3dhcmdzID0gTm9uZQorICAgICAgICBpZiBmbGFncyAmIENPX1ZBUkFSR1M6CisgICAgICAgICAgICBzZWxmLnZhcmFyZ3MgPSAxCisgICAgICAgIGlmIGZsYWdzICYgQ09fVkFSS0VZV09SRFM6CisgICAgICAgICAgICBzZWxmLmt3YXJncyA9IDEKKworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmFyZ25hbWVzKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLmRlZmF1bHRzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZmxhZ3MpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmNvZGUpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYuZGVmYXVsdHMpKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5jb2RlKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTGFtYmRhKCVzLCAlcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmFyZ25hbWVzKSwgcmVwcihzZWxmLmRlZmF1bHRzKSwgcmVwcihzZWxmLmZsYWdzKSwgcmVwcihzZWxmLmNvZGUpKQorCitjbGFzcyBMZWZ0U2hpZnQoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnRyaWdodCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0cmlnaHRbMF0KKyAgICAgICAgc2VsZi5yaWdodCA9IGxlZnRyaWdodFsxXQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxlZnRTaGlmdCgoJXMsICVzKSkiICUgKHJlcHIoc2VsZi5sZWZ0KSwgcmVwcihzZWxmLnJpZ2h0KSkKKworY2xhc3MgTGlzdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJMaXN0KCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIExpc3RDb21wKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBxdWFscywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmV4cHIgPSBleHByCisgICAgICAgIHNlbGYucXVhbHMgPSBxdWFscworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYucXVhbHMpKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLnF1YWxzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxpc3RDb21wKCVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByKSwgcmVwcihzZWxmLnF1YWxzKSkKKworY2xhc3MgTGlzdENvbXBGb3IoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFzc2lnbiwgbGlzdCwgaWZzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuYXNzaWduID0gYXNzaWduCisgICAgICAgIHNlbGYubGlzdCA9IGxpc3QKKyAgICAgICAgc2VsZi5pZnMgPSBpZnMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5hc3NpZ24pCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmxpc3QpCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYuaWZzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuYXNzaWduKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5saXN0KQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLmlmcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJMaXN0Q29tcEZvciglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmFzc2lnbiksIHJlcHIoc2VsZi5saXN0KSwgcmVwcihzZWxmLmlmcykpCisKK2NsYXNzIExpc3RDb21wSWYoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3QsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi50ZXN0ID0gdGVzdAorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZXN0LAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlc3QsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTGlzdENvbXBJZiglcykiICUgKHJlcHIoc2VsZi50ZXN0KSwpCisKK2NsYXNzIFNldENvbXAoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIHF1YWxzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5xdWFscyA9IHF1YWxzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcikKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5xdWFscykpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYucXVhbHMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiU2V0Q29tcCglcywgJXMpIiAlIChyZXByKHNlbGYuZXhwciksIHJlcHIoc2VsZi5xdWFscykpCisKK2NsYXNzIERpY3RDb21wKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIHZhbHVlLCBxdWFscywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmtleSA9IGtleQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5xdWFscyA9IHF1YWxzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYua2V5KQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi52YWx1ZSkKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5xdWFscykpCisgICAgICAgIHJldHVybiB0dXBsZShjaGlsZHJlbikKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmtleSkKKyAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYudmFsdWUpCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYucXVhbHMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRGljdENvbXAoJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5rZXkpLCByZXByKHNlbGYudmFsdWUpLCByZXByKHNlbGYucXVhbHMpKQorCitjbGFzcyBNb2QoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxlZnRyaWdodCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0cmlnaHRbMF0KKyAgICAgICAgc2VsZi5yaWdodCA9IGxlZnRyaWdodFsxXQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk1vZCgoJXMsICVzKSkiICUgKHJlcHIoc2VsZi5sZWZ0KSwgcmVwcihzZWxmLnJpZ2h0KSkKKworY2xhc3MgTW9kdWxlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkb2MsIG5vZGUsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5kb2MgPSBkb2MKKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kb2MsIHNlbGYubm9kZQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5vZGUsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTW9kdWxlKCVzLCAlcykiICUgKHJlcHIoc2VsZi5kb2MpLCByZXByKHNlbGYubm9kZSkpCisKK2NsYXNzIE11bChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGVmdHJpZ2h0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGVmdCA9IGxlZnRyaWdodFswXQorICAgICAgICBzZWxmLnJpZ2h0ID0gbGVmdHJpZ2h0WzFdCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiTXVsKCglcywgJXMpKSIgJSAocmVwcihzZWxmLmxlZnQpLCByZXByKHNlbGYucmlnaHQpKQorCitjbGFzcyBOYW1lKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJOYW1lKCVzKSIgJSAocmVwcihzZWxmLm5hbWUpLCkKKworY2xhc3MgTm90KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk5vdCglcykiICUgKHJlcHIoc2VsZi5leHByKSwpCisKK2NsYXNzIE9yKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk9yKCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIFBhc3MoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUGFzcygpIgorCitjbGFzcyBQb3dlcihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGVmdHJpZ2h0LCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubGVmdCA9IGxlZnRyaWdodFswXQorICAgICAgICBzZWxmLnJpZ2h0ID0gbGVmdHJpZ2h0WzFdCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sZWZ0LCBzZWxmLnJpZ2h0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUG93ZXIoKCVzLCAlcykpIiAlIChyZXByKHNlbGYubGVmdCksIHJlcHIoc2VsZi5yaWdodCkpCisKK2NsYXNzIFByaW50KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgZGVzdCwgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5kZXN0ID0gZGVzdAorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmV4dGVuZChmbGF0dGVuKHNlbGYubm9kZXMpKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5kZXN0KQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgaWYgc2VsZi5kZXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZGVzdCkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlByaW50KCVzLCAlcykiICUgKHJlcHIoc2VsZi5ub2RlcyksIHJlcHIoc2VsZi5kZXN0KSkKKworY2xhc3MgUHJpbnRubChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGRlc3QsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYuZGVzdCA9IGRlc3QKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLm5vZGVzKSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZGVzdCkKKyAgICAgICAgcmV0dXJuIHR1cGxlKGNoaWxkcmVuKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIGlmIHNlbGYuZGVzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmRlc3QpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJQcmludG5sKCVzLCAlcykiICUgKHJlcHIoc2VsZi5ub2RlcyksIHJlcHIoc2VsZi5kZXN0KSkKKworY2xhc3MgUmFpc2UoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIxLCBleHByMiwgZXhwcjMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByMSA9IGV4cHIxCisgICAgICAgIHNlbGYuZXhwcjIgPSBleHByMgorICAgICAgICBzZWxmLmV4cHIzID0gZXhwcjMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByMSkKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuZXhwcjIpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIzKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBpZiBzZWxmLmV4cHIxIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZXhwcjEpCisgICAgICAgIGlmIHNlbGYuZXhwcjIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByMikKKyAgICAgICAgaWYgc2VsZi5leHByMyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmV4cHIzKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiUmFpc2UoJXMsICVzLCAlcykiICUgKHJlcHIoc2VsZi5leHByMSksIHJlcHIoc2VsZi5leHByMiksIHJlcHIoc2VsZi5leHByMykpCisKK2NsYXNzIFJldHVybihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlJldHVybiglcykiICUgKHJlcHIoc2VsZi52YWx1ZSksKQorCitjbGFzcyBSaWdodFNoaWZ0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0cmlnaHQsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdHJpZ2h0WzBdCisgICAgICAgIHNlbGYucmlnaHQgPSBsZWZ0cmlnaHRbMV0KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJSaWdodFNoaWZ0KCglcywgJXMpKSIgJSAocmVwcihzZWxmLmxlZnQpLCByZXByKHNlbGYucmlnaHQpKQorCitjbGFzcyBTZXQoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGVzLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYubm9kZXMgPSBub2RlcworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUoZmxhdHRlbihzZWxmLm5vZGVzKSkKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICBub2RlbGlzdCA9IFtdCisgICAgICAgIG5vZGVsaXN0LmV4dGVuZChmbGF0dGVuX25vZGVzKHNlbGYubm9kZXMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiU2V0KCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIFNsaWNlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBmbGFncywgbG93ZXIsIHVwcGVyLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5mbGFncyA9IGZsYWdzCisgICAgICAgIHNlbGYubG93ZXIgPSBsb3dlcgorICAgICAgICBzZWxmLnVwcGVyID0gdXBwZXIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5mbGFncykKKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYubG93ZXIpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLnVwcGVyKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBpZiBzZWxmLmxvd2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYubG93ZXIpCisgICAgICAgIGlmIHNlbGYudXBwZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi51cHBlcikKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlNsaWNlKCVzLCAlcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCByZXByKHNlbGYuZmxhZ3MpLCByZXByKHNlbGYubG93ZXIpLCByZXByKHNlbGYudXBwZXIpKQorCitjbGFzcyBTbGljZW9iaihOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ub2RlcyA9IG5vZGVzCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiB0dXBsZShmbGF0dGVuKHNlbGYubm9kZXMpKQorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIG5vZGVsaXN0ID0gW10KKyAgICAgICAgbm9kZWxpc3QuZXh0ZW5kKGZsYXR0ZW5fbm9kZXMoc2VsZi5ub2RlcykpCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJTbGljZW9iaiglcykiICUgKHJlcHIoc2VsZi5ub2RlcyksKQorCitjbGFzcyBTdG10KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlN0bXQoJXMpIiAlIChyZXByKHNlbGYubm9kZXMpLCkKKworY2xhc3MgU3ViKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsZWZ0cmlnaHQsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5sZWZ0ID0gbGVmdHJpZ2h0WzBdCisgICAgICAgIHNlbGYucmlnaHQgPSBsZWZ0cmlnaHRbMV0KKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi5yaWdodAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxlZnQsIHNlbGYucmlnaHQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJTdWIoKCVzLCAlcykpIiAlIChyZXByKHNlbGYubGVmdCksIHJlcHIoc2VsZi5yaWdodCkpCisKK2NsYXNzIFN1YnNjcmlwdChOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhwciwgZmxhZ3MsIHN1YnMsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKKyAgICAgICAgc2VsZi5zdWJzID0gc3VicworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmV4cHIpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmZsYWdzKQorICAgICAgICBjaGlsZHJlbi5leHRlbmQoZmxhdHRlbihzZWxmLnN1YnMpKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLnN1YnMpKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiU3Vic2NyaXB0KCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuZXhwciksIHJlcHIoc2VsZi5mbGFncyksIHJlcHIoc2VsZi5zdWJzKSkKKworY2xhc3MgVHJ5RXhjZXB0KE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBib2R5LCBoYW5kbGVycywgZWxzZV8sIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5ib2R5ID0gYm9keQorICAgICAgICBzZWxmLmhhbmRsZXJzID0gaGFuZGxlcnMKKyAgICAgICAgc2VsZi5lbHNlXyA9IGVsc2VfCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIGNoaWxkcmVuID0gW10KKyAgICAgICAgY2hpbGRyZW4uYXBwZW5kKHNlbGYuYm9keSkKKyAgICAgICAgY2hpbGRyZW4uZXh0ZW5kKGZsYXR0ZW4oc2VsZi5oYW5kbGVycykpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmVsc2VfKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5ib2R5KQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLmhhbmRsZXJzKSkKKyAgICAgICAgaWYgc2VsZi5lbHNlXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVsaXN0LmFwcGVuZChzZWxmLmVsc2VfKQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVHJ5RXhjZXB0KCVzLCAlcywgJXMpIiAlIChyZXByKHNlbGYuYm9keSksIHJlcHIoc2VsZi5oYW5kbGVycyksIHJlcHIoc2VsZi5lbHNlXykpCisKK2NsYXNzIFRyeUZpbmFsbHkoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJvZHksIGZpbmFsLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuYm9keSA9IGJvZHkKKyAgICAgICAgc2VsZi5maW5hbCA9IGZpbmFsCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgZ2V0Q2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJvZHksIHNlbGYuZmluYWwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ib2R5LCBzZWxmLmZpbmFsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVHJ5RmluYWxseSglcywgJXMpIiAlIChyZXByKHNlbGYuYm9keSksIHJlcHIoc2VsZi5maW5hbCkpCisKK2NsYXNzIFR1cGxlKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlcywgbGluZW5vPU5vbmUpOgorICAgICAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKGZsYXR0ZW4oc2VsZi5ub2RlcykpCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5leHRlbmQoZmxhdHRlbl9ub2RlcyhzZWxmLm5vZGVzKSkKKyAgICAgICAgcmV0dXJuIHR1cGxlKG5vZGVsaXN0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlR1cGxlKCVzKSIgJSAocmVwcihzZWxmLm5vZGVzKSwpCisKK2NsYXNzIFVuYXJ5QWRkKE5vZGUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwciA9IGV4cHIKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwciwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlVuYXJ5QWRkKCVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCkKKworY2xhc3MgVW5hcnlTdWIoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHByLAorCisgICAgZGVmIGdldENoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmV4cHIsCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVW5hcnlTdWIoJXMpIiAlIChyZXByKHNlbGYuZXhwciksKQorCitjbGFzcyBXaGlsZShOb2RlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdCwgYm9keSwgZWxzZV8sIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi50ZXN0ID0gdGVzdAorICAgICAgICBzZWxmLmJvZHkgPSBib2R5CisgICAgICAgIHNlbGYuZWxzZV8gPSBlbHNlXworICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLnRlc3QpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmJvZHkpCisgICAgICAgIGNoaWxkcmVuLmFwcGVuZChzZWxmLmVsc2VfKQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi50ZXN0KQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5ib2R5KQorICAgICAgICBpZiBzZWxmLmVsc2VfIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbm9kZWxpc3QuYXBwZW5kKHNlbGYuZWxzZV8pCisgICAgICAgIHJldHVybiB0dXBsZShub2RlbGlzdCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJXaGlsZSglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLnRlc3QpLCByZXByKHNlbGYuYm9keSksIHJlcHIoc2VsZi5lbHNlXykpCisKK2NsYXNzIFdpdGgoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cHIsIHZhcnMsIGJvZHksIGxpbmVubz1Ob25lKToKKyAgICAgICAgc2VsZi5leHByID0gZXhwcgorICAgICAgICBzZWxmLnZhcnMgPSB2YXJzCisgICAgICAgIHNlbGYuYm9keSA9IGJvZHkKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBnZXRDaGlsZHJlbihzZWxmKToKKyAgICAgICAgY2hpbGRyZW4gPSBbXQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi52YXJzKQorICAgICAgICBjaGlsZHJlbi5hcHBlbmQoc2VsZi5ib2R5KQorICAgICAgICByZXR1cm4gdHVwbGUoY2hpbGRyZW4pCisKKyAgICBkZWYgZ2V0Q2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgbm9kZWxpc3QgPSBbXQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5leHByKQorICAgICAgICBpZiBzZWxmLnZhcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi52YXJzKQorICAgICAgICBub2RlbGlzdC5hcHBlbmQoc2VsZi5ib2R5KQorICAgICAgICByZXR1cm4gdHVwbGUobm9kZWxpc3QpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiV2l0aCglcywgJXMsICVzKSIgJSAocmVwcihzZWxmLmV4cHIpLCByZXByKHNlbGYudmFycyksIHJlcHIoc2VsZi5ib2R5KSkKKworY2xhc3MgWWllbGQoTm9kZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworCisgICAgZGVmIGdldENoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSwKKworICAgIGRlZiBnZXRDaGlsZE5vZGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSwKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJZaWVsZCglcykiICUgKHJlcHIoc2VsZi52YWx1ZSksKQorCitmb3IgbmFtZSwgb2JqIGluIGdsb2JhbHMoKS5pdGVtcygpOgorICAgIGlmIGlzaW5zdGFuY2Uob2JqLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhvYmosIE5vZGUpOgorICAgICAgICBub2Rlc1tuYW1lLmxvd2VyKCldID0gb2JqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyMzNmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvYXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2FzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyMzNmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvYXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2NvbnN0cy5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvY29uc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MGIxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2NvbnN0cy5weQpAQCAtMCwwICsxLDIzIEBACisjIG9wZXJhdGlvbiBmbGFncworT1BfQVNTSUdOID0gJ09QX0FTU0lHTicKK09QX0RFTEVURSA9ICdPUF9ERUxFVEUnCitPUF9BUFBMWSA9ICdPUF9BUFBMWScKKworU0NfTE9DQUwgPSAxCitTQ19HTE9CQUxfSU1QTElDSVQgPSAyCitTQ19HTE9CQUxfRVhQTElDSVQgPSAzCitTQ19GUkVFID0gNAorU0NfQ0VMTCA9IDUKK1NDX1VOS05PV04gPSA2CisKK0NPX09QVElNSVpFRCA9IDB4MDAwMQorQ09fTkVXTE9DQUxTID0gMHgwMDAyCitDT19WQVJBUkdTID0gMHgwMDA0CitDT19WQVJLRVlXT1JEUyA9IDB4MDAwOAorQ09fTkVTVEVEID0gMHgwMDEwCitDT19HRU5FUkFUT1IgPSAweDAwMjAKK0NPX0dFTkVSQVRPUl9BTExPV0VEID0gMAorQ09fRlVUVVJFX0RJVklTSU9OID0gMHgyMDAwCitDT19GVVRVUkVfQUJTSU1QT1JUID0gMHg0MDAwCitDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQgPSAweDgwMDAKK0NPX0ZVVFVSRV9QUklOVF9GVU5DVElPTiA9IDB4MTAwMDAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvY29uc3RzLnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvY29uc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRlZGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9jb25zdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvY29uc3RzLnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvY29uc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRlZGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9jb25zdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvZnV0dXJlLnB5IGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9mdXR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1ZTVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvZnV0dXJlLnB5CkBAIC0wLDAgKzEsNzQgQEAKKyIiIlBhcnNlciBmb3IgZnV0dXJlIHN0YXRlbWVudHMKKworIiIiCisKK2Zyb20gY29tcGlsZXIgaW1wb3J0IGFzdCwgd2FsaworCitkZWYgaXNfZnV0dXJlKHN0bXQpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHN0YXRlbWVudCBpcyBhIHdlbGwtZm9ybWVkIGZ1dHVyZSBzdGF0ZW1lbnQiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShzdG10LCBhc3QuRnJvbSk6CisgICAgICAgIHJldHVybiAwCisgICAgaWYgc3RtdC5tb2RuYW1lID09ICJfX2Z1dHVyZV9fIjoKKyAgICAgICAgcmV0dXJuIDEKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gMAorCitjbGFzcyBGdXR1cmVQYXJzZXI6CisKKyAgICBmZWF0dXJlcyA9ICgibmVzdGVkX3Njb3BlcyIsICJnZW5lcmF0b3JzIiwgImRpdmlzaW9uIiwKKyAgICAgICAgICAgICAgICAiYWJzb2x1dGVfaW1wb3J0IiwgIndpdGhfc3RhdGVtZW50IiwgInByaW50X2Z1bmN0aW9uIiwKKyAgICAgICAgICAgICAgICAidW5pY29kZV9saXRlcmFscyIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZm91bmQgPSB7fSAjIHNldAorCisgICAgZGVmIHZpc2l0TW9kdWxlKHNlbGYsIG5vZGUpOgorICAgICAgICBzdG10ID0gbm9kZS5ub2RlCisgICAgICAgIGZvciBzIGluIHN0bXQubm9kZXM6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja19zdG10KHMpOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgY2hlY2tfc3RtdChzZWxmLCBzdG10KToKKyAgICAgICAgaWYgaXNfZnV0dXJlKHN0bXQpOgorICAgICAgICAgICAgZm9yIG5hbWUsIGFzbmFtZSBpbiBzdG10Lm5hbWVzOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5mZWF0dXJlczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mb3VuZFtuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZnV0dXJlIGZlYXR1cmUgJXMgaXMgbm90IGRlZmluZWQiICUgbmFtZQorICAgICAgICAgICAgc3RtdC52YWxpZF9mdXR1cmUgPSAxCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGdldF9mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgZmVhdHVyZXMgZW5hYmxlZCBieSBmdXR1cmUgc3RhdGVtZW50cyIiIgorICAgICAgICByZXR1cm4gc2VsZi5mb3VuZC5rZXlzKCkKKworY2xhc3MgQmFkRnV0dXJlUGFyc2VyOgorICAgICIiIkNoZWNrIGZvciBpbnZhbGlkIGZ1dHVyZSBzdGF0ZW1lbnRzIiIiCisKKyAgICBkZWYgdmlzaXRGcm9tKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBoYXNhdHRyKG5vZGUsICd2YWxpZF9mdXR1cmUnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub2RlLm1vZG5hbWUgIT0gIl9fZnV0dXJlX18iOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiaW52YWxpZCBmdXR1cmUgc3RhdGVtZW50ICIgKyByZXByKG5vZGUpCisKK2RlZiBmaW5kX2Z1dHVyZXMobm9kZSk6CisgICAgcDEgPSBGdXR1cmVQYXJzZXIoKQorICAgIHAyID0gQmFkRnV0dXJlUGFyc2VyKCkKKyAgICB3YWxrKG5vZGUsIHAxKQorICAgIHdhbGsobm9kZSwgcDIpCisgICAgcmV0dXJuIHAxLmdldF9mZWF0dXJlcygpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaW1wb3J0IHN5cworICAgIGZyb20gY29tcGlsZXIgaW1wb3J0IHBhcnNlRmlsZSwgd2FsaworCisgICAgZm9yIGZpbGUgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICBwcmludCBmaWxlCisgICAgICAgIHRyZWUgPSBwYXJzZUZpbGUoZmlsZSkKKyAgICAgICAgdiA9IEZ1dHVyZVBhcnNlcigpCisgICAgICAgIHdhbGsodHJlZSwgdikKKyAgICAgICAgcHJpbnQgdi5mb3VuZAorICAgICAgICBwcmludApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9mdXR1cmUucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9mdXR1cmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNWJlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2Z1dHVyZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9mdXR1cmUucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9mdXR1cmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNWJlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL2Z1dHVyZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9taXNjLnB5IGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9taXNjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OGM3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL21pc2MucHkKQEAgLTAsMCArMSw3MyBAQAorCitkZWYgZmxhdHRlbih0dXApOgorICAgIGVsdHMgPSBbXQorICAgIGZvciBlbHQgaW4gdHVwOgorICAgICAgICBpZiBpc2luc3RhbmNlKGVsdCwgdHVwbGUpOgorICAgICAgICAgICAgZWx0cyA9IGVsdHMgKyBmbGF0dGVuKGVsdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsdHMuYXBwZW5kKGVsdCkKKyAgICByZXR1cm4gZWx0cworCitjbGFzcyBTZXQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmVsdHMgPSB7fQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZWx0cykKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGVsdCk6CisgICAgICAgIHJldHVybiBlbHQgaW4gc2VsZi5lbHRzCisgICAgZGVmIGFkZChzZWxmLCBlbHQpOgorICAgICAgICBzZWxmLmVsdHNbZWx0XSA9IGVsdAorICAgIGRlZiBlbGVtZW50cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWx0cy5rZXlzKCkKKyAgICBkZWYgaGFzX2VsdChzZWxmLCBlbHQpOgorICAgICAgICByZXR1cm4gZWx0IGluIHNlbGYuZWx0cworICAgIGRlZiByZW1vdmUoc2VsZiwgZWx0KToKKyAgICAgICAgZGVsIHNlbGYuZWx0c1tlbHRdCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIGMgPSBTZXQoKQorICAgICAgICBjLmVsdHMudXBkYXRlKHNlbGYuZWx0cykKKyAgICAgICAgcmV0dXJuIGMKKworY2xhc3MgU3RhY2s6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnN0YWNrID0gW10KKyAgICAgICAgc2VsZi5wb3AgPSBzZWxmLnN0YWNrLnBvcAorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuc3RhY2spCisgICAgZGVmIHB1c2goc2VsZiwgZWx0KToKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoZWx0KQorICAgIGRlZiB0b3Aoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0YWNrWy0xXQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6ICMgbmVlZGVkIGJ5IHZpc2l0Q29udGludWUoKQorICAgICAgICByZXR1cm4gc2VsZi5zdGFja1tpbmRleF0KKworTUFOR0xFX0xFTiA9IDI1NiAjIG1hZ2ljIGNvbnN0YW50IGZyb20gY29tcGlsZS5jCisKK2RlZiBtYW5nbGUobmFtZSwga2xhc3MpOgorICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ19fJyk6CisgICAgICAgIHJldHVybiBuYW1lCisgICAgaWYgbGVuKG5hbWUpICsgMiA+PSBNQU5HTEVfTEVOOgorICAgICAgICByZXR1cm4gbmFtZQorICAgIGlmIG5hbWUuZW5kc3dpdGgoJ19fJyk6CisgICAgICAgIHJldHVybiBuYW1lCisgICAgdHJ5OgorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBrbGFzc1tpXSA9PSAnXyc6CisgICAgICAgICAgICBpID0gaSArIDEKKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgcmV0dXJuIG5hbWUKKyAgICBrbGFzcyA9IGtsYXNzW2k6XQorCisgICAgdGxlbiA9IGxlbihrbGFzcykgKyBsZW4obmFtZSkKKyAgICBpZiB0bGVuID4gTUFOR0xFX0xFTjoKKyAgICAgICAga2xhc3MgPSBrbGFzc1s6TUFOR0xFX0xFTi10bGVuXQorCisgICAgcmV0dXJuICJfJXMlcyIgJSAoa2xhc3MsIG5hbWUpCisKK2RlZiBzZXRfZmlsZW5hbWUoZmlsZW5hbWUsIHRyZWUpOgorICAgICIiIlNldCB0aGUgZmlsZW5hbWUgYXR0cmlidXRlIHRvIGZpbGVuYW1lIG9uIGV2ZXJ5IG5vZGUgaW4gdHJlZSIiIgorICAgIHdvcmtsaXN0ID0gW3RyZWVdCisgICAgd2hpbGUgd29ya2xpc3Q6CisgICAgICAgIG5vZGUgPSB3b3JrbGlzdC5wb3AoMCkKKyAgICAgICAgbm9kZS5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHdvcmtsaXN0LmV4dGVuZChub2RlLmdldENoaWxkTm9kZXMoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvbWlzYy5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL21pc2MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL21pc2MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvbWlzYy5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL21pc2MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL21pc2MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODZiZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWFzc2VtLnB5CkBAIC0wLDAgKzEsNzYzIEBACisiIiJBIGZsb3cgZ3JhcGggcmVwcmVzZW50YXRpb24gZm9yIFB5dGhvbiBieXRlY29kZSIiIgorCitpbXBvcnQgZGlzCitpbXBvcnQgdHlwZXMKK2ltcG9ydCBzeXMKKworZnJvbSBjb21waWxlciBpbXBvcnQgbWlzYworZnJvbSBjb21waWxlci5jb25zdHMgXAorICAgICBpbXBvcnQgQ09fT1BUSU1JWkVELCBDT19ORVdMT0NBTFMsIENPX1ZBUkFSR1MsIENPX1ZBUktFWVdPUkRTCisKK2NsYXNzIEZsb3dHcmFwaDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3VycmVudCA9IHNlbGYuZW50cnkgPSBCbG9jaygpCisgICAgICAgIHNlbGYuZXhpdCA9IEJsb2NrKCJleGl0IikKKyAgICAgICAgc2VsZi5ibG9ja3MgPSBtaXNjLlNldCgpCisgICAgICAgIHNlbGYuYmxvY2tzLmFkZChzZWxmLmVudHJ5KQorICAgICAgICBzZWxmLmJsb2Nrcy5hZGQoc2VsZi5leGl0KQorCisgICAgZGVmIHN0YXJ0QmxvY2soc2VsZiwgYmxvY2spOgorICAgICAgICBpZiBzZWxmLl9kZWJ1ZzoKKyAgICAgICAgICAgIGlmIHNlbGYuY3VycmVudDoKKyAgICAgICAgICAgICAgICBwcmludCAiZW5kIiwgcmVwcihzZWxmLmN1cnJlbnQpCisgICAgICAgICAgICAgICAgcHJpbnQgIiAgICBuZXh0Iiwgc2VsZi5jdXJyZW50Lm5leHQKKyAgICAgICAgICAgICAgICBwcmludCAiICAgIHByZXYiLCBzZWxmLmN1cnJlbnQucHJldgorICAgICAgICAgICAgICAgIHByaW50ICIgICAiLCBzZWxmLmN1cnJlbnQuZ2V0X2NoaWxkcmVuKCkKKyAgICAgICAgICAgIHByaW50IHJlcHIoYmxvY2spCisgICAgICAgIHNlbGYuY3VycmVudCA9IGJsb2NrCisKKyAgICBkZWYgbmV4dEJsb2NrKHNlbGYsIGJsb2NrPU5vbmUpOgorICAgICAgICAjIFhYWCB0aGluayB3ZSBuZWVkIHRvIHNwZWNpZnkgd2hlbiB0aGVyZSBpcyBpbXBsaWNpdCB0cmFuc2ZlcgorICAgICAgICAjIGZyb20gb25lIGJsb2NrIHRvIHRoZSBuZXh0LiAgbWlnaHQgYmUgYmV0dGVyIHRvIHJlcHJlc2VudCB0aGlzCisgICAgICAgICMgd2l0aCBleHBsaWNpdCBKVU1QX0FCU09MVVRFIGluc3RydWN0aW9ucyB0aGF0IGFyZSBvcHRpbWl6ZWQKKyAgICAgICAgIyBvdXQgd2hlbiB0aGV5IGFyZSB1bm5lY2Vzc2FyeS4KKyAgICAgICAgIworICAgICAgICAjIEkgdGhpbmsgdGhpcyBzdHJhdGVneSB3b3JrczogZWFjaCBibG9jayBoYXMgYSBjaGlsZAorICAgICAgICAjIGRlc2lnbmF0ZWQgYXMgIm5leHQiIHdoaWNoIGlzIHJldHVybmVkIGFzIHRoZSBsYXN0IG9mIHRoZQorICAgICAgICAjIGNoaWxkcmVuLiAgYmVjYXVzZSB0aGUgbm9kZXMgaW4gYSBncmFwaCBhcmUgZW1pdHRlZCBpbgorICAgICAgICAjIHJldmVyc2UgcG9zdCBvcmRlciwgdGhlICJuZXh0IiBibG9jayB3aWxsIGFsd2F5cyBiZSBlbWl0dGVkCisgICAgICAgICMgaW1tZWRpYXRlbHkgYWZ0ZXIgaXRzIHBhcmVudC4KKyAgICAgICAgIyBXb3JyeTogbWFpbnRhaW5pbmcgdGhpcyBpbnZhcmlhbnQgY291bGQgYmUgdHJpY2t5CisgICAgICAgIGlmIGJsb2NrIGlzIE5vbmU6CisgICAgICAgICAgICBibG9jayA9IHNlbGYubmV3QmxvY2soKQorCisgICAgICAgICMgTm90ZTogSWYgdGhlIGN1cnJlbnQgYmxvY2sgZW5kcyB3aXRoIGFuIHVuY29uZGl0aW9uYWwgY29udHJvbAorICAgICAgICAjIHRyYW5zZmVyLCB0aGVuIGl0IGlzIHRlY2hpY2FsbHkgaW5jb3JyZWN0IHRvIGFkZCBhbiBpbXBsaWNpdAorICAgICAgICAjIHRyYW5zZmVyIHRvIHRoZSBibG9jayBncmFwaC4gRG9pbmcgc28gcmVzdWx0cyBpbiBjb2RlIGdlbmVyYXRpb24KKyAgICAgICAgIyBmb3IgdW5yZWFjaGFibGUgYmxvY2tzLiAgVGhhdCBkb2Vzbid0IGFwcGVhciB0byBiZSB2ZXJ5IGNvbW1vbgorICAgICAgICAjIHdpdGggUHl0aG9uIGNvZGUgYW5kIHNpbmNlIHRoZSBidWlsdC1pbiBjb21waWxlciBkb2Vzbid0IG9wdGltaXplCisgICAgICAgICMgaXQgb3V0IHdlIGRvbid0IGVpdGhlci4KKyAgICAgICAgc2VsZi5jdXJyZW50LmFkZE5leHQoYmxvY2spCisgICAgICAgIHNlbGYuc3RhcnRCbG9jayhibG9jaykKKworICAgIGRlZiBuZXdCbG9jayhzZWxmKToKKyAgICAgICAgYiA9IEJsb2NrKCkKKyAgICAgICAgc2VsZi5ibG9ja3MuYWRkKGIpCisgICAgICAgIHJldHVybiBiCisKKyAgICBkZWYgc3RhcnRFeGl0QmxvY2soc2VsZik6CisgICAgICAgIHNlbGYuc3RhcnRCbG9jayhzZWxmLmV4aXQpCisKKyAgICBfZGVidWcgPSAwCisKKyAgICBkZWYgX2VuYWJsZV9kZWJ1ZyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGVidWcgPSAxCisKKyAgICBkZWYgX2Rpc2FibGVfZGVidWcoc2VsZik6CisgICAgICAgIHNlbGYuX2RlYnVnID0gMAorCisgICAgZGVmIGVtaXQoc2VsZiwgKmluc3QpOgorICAgICAgICBpZiBzZWxmLl9kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ICJcdCIsIGluc3QKKyAgICAgICAgaWYgbGVuKGluc3QpID09IDIgYW5kIGlzaW5zdGFuY2UoaW5zdFsxXSwgQmxvY2spOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50LmFkZE91dEVkZ2UoaW5zdFsxXSkKKyAgICAgICAgc2VsZi5jdXJyZW50LmVtaXQoaW5zdCkKKworICAgIGRlZiBnZXRCbG9ja3NJbk9yZGVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGJsb2NrcyBpbiByZXZlcnNlIHBvc3RvcmRlcgorCisgICAgICAgIGkuZS4gZWFjaCBub2RlIGFwcGVhcnMgYmVmb3JlIGFsbCBvZiBpdHMgc3VjY2Vzc29ycworICAgICAgICAiIiIKKyAgICAgICAgb3JkZXIgPSBvcmRlcl9ibG9ja3Moc2VsZi5lbnRyeSwgc2VsZi5leGl0KQorICAgICAgICByZXR1cm4gb3JkZXIKKworICAgIGRlZiBnZXRCbG9ja3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJsb2Nrcy5lbGVtZW50cygpCisKKyAgICBkZWYgZ2V0Um9vdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIG5vZGVzIGFwcHJvcHJpYXRlIGZvciB1c2Ugd2l0aCBkb21pbmF0b3IiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZW50cnkKKworICAgIGRlZiBnZXRDb250YWluZWRHcmFwaHMoc2VsZik6CisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgYiBpbiBzZWxmLmdldEJsb2NrcygpOgorICAgICAgICAgICAgbC5leHRlbmQoYi5nZXRDb250YWluZWRHcmFwaHMoKSkKKyAgICAgICAgcmV0dXJuIGwKKworCitkZWYgb3JkZXJfYmxvY2tzKHN0YXJ0X2Jsb2NrLCBleGl0X2Jsb2NrKToKKyAgICAiIiJPcmRlciBibG9ja3Mgc28gdGhhdCB0aGV5IGFyZSBlbWl0dGVkIGluIHRoZSByaWdodCBvcmRlciIiIgorICAgICMgUnVsZXM6CisgICAgIyAtIHdoZW4gYSBibG9jayBoYXMgYSBuZXh0IGJsb2NrLCB0aGUgbmV4dCBibG9jayBtdXN0IGJlIGVtaXR0ZWQganVzdCBhZnRlcgorICAgICMgLSB3aGVuIGEgYmxvY2sgaGFzIGZvbGxvd2VycyAocmVsYXRpdmUganVtcHMpLCBpdCBtdXN0IGJlIGVtaXR0ZWQgYmVmb3JlCisgICAgIyAgIHRoZW0KKyAgICAjIC0gYWxsIHJlYWNoYWJsZSBibG9ja3MgbXVzdCBiZSBlbWl0dGVkCisgICAgb3JkZXIgPSBbXQorCisgICAgIyBGaW5kIGFsbCB0aGUgYmxvY2tzIHRvIGJlIGVtaXR0ZWQuCisgICAgcmVtYWluaW5nID0gc2V0KCkKKyAgICB0b2RvID0gW3N0YXJ0X2Jsb2NrXQorICAgIHdoaWxlIHRvZG86CisgICAgICAgIGIgPSB0b2RvLnBvcCgpCisgICAgICAgIGlmIGIgaW4gcmVtYWluaW5nOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmVtYWluaW5nLmFkZChiKQorICAgICAgICBmb3IgYyBpbiBiLmdldF9jaGlsZHJlbigpOgorICAgICAgICAgICAgaWYgYyBub3QgaW4gcmVtYWluaW5nOgorICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKGMpCisKKyAgICAjIEEgYmxvY2sgaXMgZG9taW5hdGVkIGJ5IGFub3RoZXIgYmxvY2sgaWYgdGhhdCBibG9jayBtdXN0IGJlIGVtaXR0ZWQKKyAgICAjIGJlZm9yZSBpdC4KKyAgICBkb21pbmF0b3JzID0ge30KKyAgICBmb3IgYiBpbiByZW1haW5pbmc6CisgICAgICAgIGlmIF9fZGVidWdfXyBhbmQgYi5uZXh0OgorICAgICAgICAgICAgYXNzZXJ0IGIgaXMgYi5uZXh0WzBdLnByZXZbMF0sIChiLCBiLm5leHQpCisgICAgICAgICMgTWFrZSBzdXJlIGV2ZXJ5IGJsb2NrIGFwcGVhcnMgaW4gZG9taW5hdG9ycywgZXZlbiBpZiBubworICAgICAgICAjIG90aGVyIGJsb2NrIG11c3QgcHJlY2VkZSBpdC4KKyAgICAgICAgZG9taW5hdG9ycy5zZXRkZWZhdWx0KGIsIHNldCgpKQorICAgICAgICAjIHByZWNlZWRpbmcgYmxvY2tzIGRvbWluYXRlIGZvbGxvd2luZyBibG9ja3MKKyAgICAgICAgZm9yIGMgaW4gYi5nZXRfZm9sbG93ZXJzKCk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGRvbWluYXRvcnMuc2V0ZGVmYXVsdChjLCBzZXQoKSkuYWRkKGIpCisgICAgICAgICAgICAgICAgIyBBbnkgYmxvY2sgdGhhdCBoYXMgYSBuZXh0IHBvaW50ZXIgbGVhZGluZyB0byBjIGlzIGFsc28KKyAgICAgICAgICAgICAgICAjIGRvbWluYXRlZCBiZWNhdXNlIHRoZSB3aG9sZSBjaGFpbiB3aWxsIGJlIGVtaXR0ZWQgYXQgb25jZS4KKyAgICAgICAgICAgICAgICAjIFdhbGsgYmFja3dhcmRzIGFuZCBhZGQgdGhlbSBhbGwuCisgICAgICAgICAgICAgICAgaWYgYy5wcmV2IGFuZCBjLnByZXZbMF0gaXMgbm90IGI6CisgICAgICAgICAgICAgICAgICAgIGMgPSBjLnByZXZbMF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGZpbmRfbmV4dCgpOgorICAgICAgICAjIEZpbmQgYSBibG9jayB0aGF0IGNhbiBiZSBlbWl0dGVkIG5leHQuCisgICAgICAgIGZvciBiIGluIHJlbWFpbmluZzoKKyAgICAgICAgICAgIGZvciBjIGluIGRvbWluYXRvcnNbYl06CisgICAgICAgICAgICAgICAgaWYgYyBpbiByZW1haW5pbmc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrICMgY2FuJ3QgZW1pdCB5ZXQsIGRvbWluYXRlZCBieSBhIHJlbWFpbmluZyBibG9jaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gYgorICAgICAgICBhc3NlcnQgMCwgJ2NpcmN1bGFyIGRlcGVuZGVuY3ksIGNhbm5vdCBmaW5kIG5leHQgYmxvY2snCisKKyAgICBiID0gc3RhcnRfYmxvY2sKKyAgICB3aGlsZSAxOgorICAgICAgICBvcmRlci5hcHBlbmQoYikKKyAgICAgICAgcmVtYWluaW5nLmRpc2NhcmQoYikKKyAgICAgICAgaWYgYi5uZXh0OgorICAgICAgICAgICAgYiA9IGIubmV4dFswXQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxpZiBiIGlzIG5vdCBleGl0X2Jsb2NrIGFuZCBub3QgYi5oYXNfdW5jb25kaXRpb25hbF90cmFuc2ZlcigpOgorICAgICAgICAgICAgb3JkZXIuYXBwZW5kKGV4aXRfYmxvY2spCisgICAgICAgIGlmIG5vdCByZW1haW5pbmc6CisgICAgICAgICAgICBicmVhaworICAgICAgICBiID0gZmluZF9uZXh0KCkKKyAgICByZXR1cm4gb3JkZXIKKworCitjbGFzcyBCbG9jazoKKyAgICBfY291bnQgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGFiZWw9JycpOgorICAgICAgICBzZWxmLmluc3RzID0gW10KKyAgICAgICAgc2VsZi5vdXRFZGdlcyA9IHNldCgpCisgICAgICAgIHNlbGYubGFiZWwgPSBsYWJlbAorICAgICAgICBzZWxmLmJpZCA9IEJsb2NrLl9jb3VudAorICAgICAgICBzZWxmLm5leHQgPSBbXQorICAgICAgICBzZWxmLnByZXYgPSBbXQorICAgICAgICBCbG9jay5fY291bnQgPSBCbG9jay5fY291bnQgKyAxCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubGFiZWw6CisgICAgICAgICAgICByZXR1cm4gIjxibG9jayAlcyBpZD0lZD4iICUgKHNlbGYubGFiZWwsIHNlbGYuYmlkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICI8YmxvY2sgaWQ9JWQ+IiAlIChzZWxmLmJpZCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpbnN0cyA9IG1hcChzdHIsIHNlbGYuaW5zdHMpCisgICAgICAgIHJldHVybiAiPGJsb2NrICVzICVkOlxuJXM+IiAlIChzZWxmLmxhYmVsLCBzZWxmLmJpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicuam9pbihpbnN0cykpCisKKyAgICBkZWYgZW1pdChzZWxmLCBpbnN0KToKKyAgICAgICAgb3AgPSBpbnN0WzBdCisgICAgICAgIHNlbGYuaW5zdHMuYXBwZW5kKGluc3QpCisKKyAgICBkZWYgZ2V0SW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnN0cworCisgICAgZGVmIGFkZE91dEVkZ2Uoc2VsZiwgYmxvY2spOgorICAgICAgICBzZWxmLm91dEVkZ2VzLmFkZChibG9jaykKKworICAgIGRlZiBhZGROZXh0KHNlbGYsIGJsb2NrKToKKyAgICAgICAgc2VsZi5uZXh0LmFwcGVuZChibG9jaykKKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLm5leHQpID09IDEsIG1hcChzdHIsIHNlbGYubmV4dCkKKyAgICAgICAgYmxvY2sucHJldi5hcHBlbmQoc2VsZikKKyAgICAgICAgYXNzZXJ0IGxlbihibG9jay5wcmV2KSA9PSAxLCBtYXAoc3RyLCBibG9jay5wcmV2KQorCisgICAgX3VuY29uZF90cmFuc2ZlciA9ICgnUkVUVVJOX1ZBTFVFJywgJ1JBSVNFX1ZBUkFSR1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0pVTVBfQUJTT0xVVEUnLCAnSlVNUF9GT1JXQVJEJywgJ0NPTlRJTlVFX0xPT1AnLAorICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGhhc191bmNvbmRpdGlvbmFsX3RyYW5zZmVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIFRydWUgaWYgdGhlcmUgaXMgYW4gdW5jb25kaXRpb25hbCB0cmFuc2ZlciB0byBhbiBvdGhlciBibG9jaworICAgICAgICBhdCB0aGUgZW5kIG9mIHRoaXMgYmxvY2suIFRoaXMgbWVhbnMgdGhlcmUgaXMgbm8gcmlzayBmb3IgdGhlIGJ5dGVjb2RlCisgICAgICAgIGV4ZWN1dGVyIHRvIGdvIHBhc3QgdGhpcyBibG9jaydzIGJ5dGVjb2RlLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcCwgYXJnID0gc2VsZi5pbnN0c1stMV0KKyAgICAgICAgZXhjZXB0IChJbmRleEVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gb3AgaW4gc2VsZi5fdW5jb25kX3RyYW5zZmVyCisKKyAgICBkZWYgZ2V0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLm91dEVkZ2VzKSArIHNlbGYubmV4dAorCisgICAgZGVmIGdldF9mb2xsb3dlcnMoc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgd2hvbGUgbGlzdCBvZiBmb2xsb3dlcnMsIGluY2x1ZGluZyB0aGUgbmV4dCBibG9jay4iIiIKKyAgICAgICAgZm9sbG93ZXJzID0gc2V0KHNlbGYubmV4dCkKKyAgICAgICAgIyBCbG9ja3MgdGhhdCBtdXN0IGJlIGVtaXR0ZWQgKmFmdGVyKiB0aGlzIG9uZSwgYmVjYXVzZSBvZgorICAgICAgICAjIGJ5dGVjb2RlIG9mZnNldHMgKGUuZy4gcmVsYXRpdmUganVtcHMpIHBvaW50aW5nIHRvIHRoZW0uCisgICAgICAgIGZvciBpbnN0IGluIHNlbGYuaW5zdHM6CisgICAgICAgICAgICBpZiBpbnN0WzBdIGluIFB5Rmxvd0dyYXBoLmhhc2pyZWw6CisgICAgICAgICAgICAgICAgZm9sbG93ZXJzLmFkZChpbnN0WzFdKQorICAgICAgICByZXR1cm4gZm9sbG93ZXJzCisKKyAgICBkZWYgZ2V0Q29udGFpbmVkR3JhcGhzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIGdyYXBocyBjb250YWluZWQgd2l0aGluIHRoaXMgYmxvY2suCisKKyAgICAgICAgRm9yIGV4YW1wbGUsIGEgTUFLRV9GVU5DVElPTiBibG9jayB3aWxsIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8KKyAgICAgICAgdGhlIGdyYXBoIGZvciB0aGUgZnVuY3Rpb24gYm9keS4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbnRhaW5lZCA9IFtdCisgICAgICAgIGZvciBpbnN0IGluIHNlbGYuaW5zdHM6CisgICAgICAgICAgICBpZiBsZW4oaW5zdCkgPT0gMToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgb3AgPSBpbnN0WzFdCisgICAgICAgICAgICBpZiBoYXNhdHRyKG9wLCAnZ3JhcGgnKToKKyAgICAgICAgICAgICAgICBjb250YWluZWQuYXBwZW5kKG9wLmdyYXBoKQorICAgICAgICByZXR1cm4gY29udGFpbmVkCisKKyMgZmxhZ3MgZm9yIGNvZGUgb2JqZWN0cworCisjIHRoZSBGbG93R3JhcGggaXMgdHJhbnNmb3JtZWQgaW4gcGxhY2U7IGl0IGV4aXN0cyBpbiBvbmUgb2YgdGhlc2Ugc3RhdGVzCitSQVcgPSAiUkFXIgorRkxBVCA9ICJGTEFUIgorQ09OViA9ICJDT05WIgorRE9ORSA9ICJET05FIgorCitjbGFzcyBQeUZsb3dHcmFwaChGbG93R3JhcGgpOgorICAgIHN1cGVyX2luaXQgPSBGbG93R3JhcGguX19pbml0X18KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmaWxlbmFtZSwgYXJncz0oKSwgb3B0aW1pemVkPTAsIGtsYXNzPU5vbmUpOgorICAgICAgICBzZWxmLnN1cGVyX2luaXQoKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmRvY3N0cmluZyA9IE5vbmUKKyAgICAgICAgc2VsZi5hcmdzID0gYXJncyAjIFhYWAorICAgICAgICBzZWxmLmFyZ2NvdW50ID0gZ2V0QXJnQ291bnQoYXJncykKKyAgICAgICAgc2VsZi5rbGFzcyA9IGtsYXNzCisgICAgICAgIGlmIG9wdGltaXplZDoKKyAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSBDT19PUFRJTUlaRUQgfCBDT19ORVdMT0NBTFMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmxhZ3MgPSAwCisgICAgICAgIHNlbGYuY29uc3RzID0gW10KKyAgICAgICAgc2VsZi5uYW1lcyA9IFtdCisgICAgICAgICMgRnJlZSB2YXJpYWJsZXMgZm91bmQgYnkgdGhlIHN5bWJvbCB0YWJsZSBzY2FuLCBpbmNsdWRpbmcKKyAgICAgICAgIyB2YXJpYWJsZXMgdXNlZCBvbmx5IGluIG5lc3RlZCBzY29wZXMsIGFyZSBpbmNsdWRlZCBoZXJlLgorICAgICAgICBzZWxmLmZyZWV2YXJzID0gW10KKyAgICAgICAgc2VsZi5jZWxsdmFycyA9IFtdCisgICAgICAgICMgVGhlIGNsb3N1cmUgbGlzdCBpcyB1c2VkIHRvIHRyYWNrIHRoZSBvcmRlciBvZiBjZWxsCisgICAgICAgICMgdmFyaWFibGVzIGFuZCBmcmVlIHZhcmlhYmxlcyBpbiB0aGUgcmVzdWx0aW5nIGNvZGUgb2JqZWN0LgorICAgICAgICAjIFRoZSBvZmZzZXRzIHVzZWQgYnkgTE9BRF9DTE9TVVJFL0xPQURfREVSRUYgcmVmZXIgdG8gYm90aAorICAgICAgICAjIGtpbmRzIG9mIHZhcmlhYmxlcy4KKyAgICAgICAgc2VsZi5jbG9zdXJlID0gW10KKyAgICAgICAgc2VsZi52YXJuYW1lcyA9IGxpc3QoYXJncykgb3IgW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYudmFybmFtZXMpKToKKyAgICAgICAgICAgIHZhciA9IHNlbGYudmFybmFtZXNbaV0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFyLCBUdXBsZUFyZyk6CisgICAgICAgICAgICAgICAgc2VsZi52YXJuYW1lc1tpXSA9IHZhci5nZXROYW1lKCkKKyAgICAgICAgc2VsZi5zdGFnZSA9IFJBVworCisgICAgZGVmIHNldERvY3N0cmluZyhzZWxmLCBkb2MpOgorICAgICAgICBzZWxmLmRvY3N0cmluZyA9IGRvYworCisgICAgZGVmIHNldEZsYWcoc2VsZiwgZmxhZyk6CisgICAgICAgIHNlbGYuZmxhZ3MgPSBzZWxmLmZsYWdzIHwgZmxhZworICAgICAgICBpZiBmbGFnID09IENPX1ZBUkFSR1M6CisgICAgICAgICAgICBzZWxmLmFyZ2NvdW50ID0gc2VsZi5hcmdjb3VudCAtIDEKKworICAgIGRlZiBjaGVja0ZsYWcoc2VsZiwgZmxhZyk6CisgICAgICAgIGlmIHNlbGYuZmxhZ3MgJiBmbGFnOgorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBzZXRGcmVlVmFycyhzZWxmLCBuYW1lcyk6CisgICAgICAgIHNlbGYuZnJlZXZhcnMgPSBsaXN0KG5hbWVzKQorCisgICAgZGVmIHNldENlbGxWYXJzKHNlbGYsIG5hbWVzKToKKyAgICAgICAgc2VsZi5jZWxsdmFycyA9IG5hbWVzCisKKyAgICBkZWYgZ2V0Q29kZShzZWxmKToKKyAgICAgICAgIiIiR2V0IGEgUHl0aG9uIGNvZGUgb2JqZWN0IiIiCisgICAgICAgIGFzc2VydCBzZWxmLnN0YWdlID09IFJBVworICAgICAgICBzZWxmLmNvbXB1dGVTdGFja0RlcHRoKCkKKyAgICAgICAgc2VsZi5mbGF0dGVuR3JhcGgoKQorICAgICAgICBhc3NlcnQgc2VsZi5zdGFnZSA9PSBGTEFUCisgICAgICAgIHNlbGYuY29udmVydEFyZ3MoKQorICAgICAgICBhc3NlcnQgc2VsZi5zdGFnZSA9PSBDT05WCisgICAgICAgIHNlbGYubWFrZUJ5dGVDb2RlKCkKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhZ2UgPT0gRE9ORQorICAgICAgICByZXR1cm4gc2VsZi5uZXdDb2RlT2JqZWN0KCkKKworICAgIGRlZiBkdW1wKHNlbGYsIGlvPU5vbmUpOgorICAgICAgICBpZiBpbzoKKyAgICAgICAgICAgIHNhdmUgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gaW8KKyAgICAgICAgcGMgPSAwCisgICAgICAgIGZvciB0IGluIHNlbGYuaW5zdHM6CisgICAgICAgICAgICBvcG5hbWUgPSB0WzBdCisgICAgICAgICAgICBpZiBvcG5hbWUgPT0gIlNFVF9MSU5FTk8iOgorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBpZiBsZW4odCkgPT0gMToKKyAgICAgICAgICAgICAgICBwcmludCAiXHQiLCAiJTNkIiAlIHBjLCBvcG5hbWUKKyAgICAgICAgICAgICAgICBwYyA9IHBjICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAiXHQiLCAiJTNkIiAlIHBjLCBvcG5hbWUsIHRbMV0KKyAgICAgICAgICAgICAgICBwYyA9IHBjICsgMworICAgICAgICBpZiBpbzoKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlCisKKyAgICBkZWYgY29tcHV0ZVN0YWNrRGVwdGgoc2VsZik6CisgICAgICAgICIiIkNvbXB1dGUgdGhlIG1heCBzdGFjayBkZXB0aC4KKworICAgICAgICBBcHByb2FjaCBpcyB0byBjb21wdXRlIHRoZSBzdGFjayBlZmZlY3Qgb2YgZWFjaCBiYXNpYyBibG9jay4KKyAgICAgICAgVGhlbiBmaW5kIHRoZSBwYXRoIHRocm91Z2ggdGhlIGNvZGUgd2l0aCB0aGUgbGFyZ2VzdCB0b3RhbAorICAgICAgICBlZmZlY3QuCisgICAgICAgICIiIgorICAgICAgICBkZXB0aCA9IHt9CisgICAgICAgIGV4aXQgPSBOb25lCisgICAgICAgIGZvciBiIGluIHNlbGYuZ2V0QmxvY2tzKCk6CisgICAgICAgICAgICBkZXB0aFtiXSA9IGZpbmREZXB0aChiLmdldEluc3RydWN0aW9ucygpKQorCisgICAgICAgIHNlZW4gPSB7fQorCisgICAgICAgIGRlZiBtYXhfZGVwdGgoYiwgZCk6CisgICAgICAgICAgICBpZiBiIGluIHNlZW46CisgICAgICAgICAgICAgICAgcmV0dXJuIGQKKyAgICAgICAgICAgIHNlZW5bYl0gPSAxCisgICAgICAgICAgICBkID0gZCArIGRlcHRoW2JdCisgICAgICAgICAgICBjaGlsZHJlbiA9IGIuZ2V0X2NoaWxkcmVuKCkKKyAgICAgICAgICAgIGlmIGNoaWxkcmVuOgorICAgICAgICAgICAgICAgIHJldHVybiBtYXgoW21heF9kZXB0aChjLCBkKSBmb3IgYyBpbiBjaGlsZHJlbl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG5vdCBiLmxhYmVsID09ICJleGl0IjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1heF9kZXB0aChzZWxmLmV4aXQsIGQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQKKworICAgICAgICBzZWxmLnN0YWNrc2l6ZSA9IG1heF9kZXB0aChzZWxmLmVudHJ5LCAwKQorCisgICAgZGVmIGZsYXR0ZW5HcmFwaChzZWxmKToKKyAgICAgICAgIiIiQXJyYW5nZSB0aGUgYmxvY2tzIGluIG9yZGVyIGFuZCByZXNvbHZlIGp1bXBzIiIiCisgICAgICAgIGFzc2VydCBzZWxmLnN0YWdlID09IFJBVworICAgICAgICBzZWxmLmluc3RzID0gaW5zdHMgPSBbXQorICAgICAgICBwYyA9IDAKKyAgICAgICAgYmVnaW4gPSB7fQorICAgICAgICBlbmQgPSB7fQorICAgICAgICBmb3IgYiBpbiBzZWxmLmdldEJsb2Nrc0luT3JkZXIoKToKKyAgICAgICAgICAgIGJlZ2luW2JdID0gcGMKKyAgICAgICAgICAgIGZvciBpbnN0IGluIGIuZ2V0SW5zdHJ1Y3Rpb25zKCk6CisgICAgICAgICAgICAgICAgaW5zdHMuYXBwZW5kKGluc3QpCisgICAgICAgICAgICAgICAgaWYgbGVuKGluc3QpID09IDE6CisgICAgICAgICAgICAgICAgICAgIHBjID0gcGMgKyAxCisgICAgICAgICAgICAgICAgZWxpZiBpbnN0WzBdICE9ICJTRVRfTElORU5PIjoKKyAgICAgICAgICAgICAgICAgICAgIyBhcmcgdGFrZXMgMiBieXRlcworICAgICAgICAgICAgICAgICAgICBwYyA9IHBjICsgMworICAgICAgICAgICAgZW5kW2JdID0gcGMKKyAgICAgICAgcGMgPSAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpbnN0cykpOgorICAgICAgICAgICAgaW5zdCA9IGluc3RzW2ldCisgICAgICAgICAgICBpZiBsZW4oaW5zdCkgPT0gMToKKyAgICAgICAgICAgICAgICBwYyA9IHBjICsgMQorICAgICAgICAgICAgZWxpZiBpbnN0WzBdICE9ICJTRVRfTElORU5PIjoKKyAgICAgICAgICAgICAgICBwYyA9IHBjICsgMworICAgICAgICAgICAgb3BuYW1lID0gaW5zdFswXQorICAgICAgICAgICAgaWYgb3BuYW1lIGluIHNlbGYuaGFzanJlbDoKKyAgICAgICAgICAgICAgICBvcGFyZyA9IGluc3RbMV0KKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBiZWdpbltvcGFyZ10gLSBwYworICAgICAgICAgICAgICAgIGluc3RzW2ldID0gb3BuYW1lLCBvZmZzZXQKKyAgICAgICAgICAgIGVsaWYgb3BuYW1lIGluIHNlbGYuaGFzamFiczoKKyAgICAgICAgICAgICAgICBpbnN0c1tpXSA9IG9wbmFtZSwgYmVnaW5baW5zdFsxXV0KKyAgICAgICAgc2VsZi5zdGFnZSA9IEZMQVQKKworICAgIGhhc2pyZWwgPSBzZXQoKQorICAgIGZvciBpIGluIGRpcy5oYXNqcmVsOgorICAgICAgICBoYXNqcmVsLmFkZChkaXMub3BuYW1lW2ldKQorICAgIGhhc2phYnMgPSBzZXQoKQorICAgIGZvciBpIGluIGRpcy5oYXNqYWJzOgorICAgICAgICBoYXNqYWJzLmFkZChkaXMub3BuYW1lW2ldKQorCisgICAgZGVmIGNvbnZlcnRBcmdzKHNlbGYpOgorICAgICAgICAiIiJDb252ZXJ0IGFyZ3VtZW50cyBmcm9tIHN5bWJvbGljIHRvIGNvbmNyZXRlIGZvcm0iIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhZ2UgPT0gRkxBVAorICAgICAgICBzZWxmLmNvbnN0cy5pbnNlcnQoMCwgc2VsZi5kb2NzdHJpbmcpCisgICAgICAgIHNlbGYuc29ydF9jZWxsdmFycygpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmluc3RzKSk6CisgICAgICAgICAgICB0ID0gc2VsZi5pbnN0c1tpXQorICAgICAgICAgICAgaWYgbGVuKHQpID09IDI6CisgICAgICAgICAgICAgICAgb3BuYW1lLCBvcGFyZyA9IHQKKyAgICAgICAgICAgICAgICBjb252ID0gc2VsZi5fY29udmVydGVycy5nZXQob3BuYW1lLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIGNvbnY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdHNbaV0gPSBvcG5hbWUsIGNvbnYoc2VsZiwgb3BhcmcpCisgICAgICAgIHNlbGYuc3RhZ2UgPSBDT05WCisKKyAgICBkZWYgc29ydF9jZWxsdmFycyhzZWxmKToKKyAgICAgICAgIiIiU29ydCBjZWxsdmFycyBpbiB0aGUgb3JkZXIgb2YgdmFybmFtZXMgYW5kIHBydW5lIGZyb20gZnJlZXZhcnMuCisgICAgICAgICIiIgorICAgICAgICBjZWxscyA9IHt9CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuY2VsbHZhcnM6CisgICAgICAgICAgICBjZWxsc1tuYW1lXSA9IDEKKyAgICAgICAgc2VsZi5jZWxsdmFycyA9IFtuYW1lIGZvciBuYW1lIGluIHNlbGYudmFybmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluIGNlbGxzXQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmNlbGx2YXJzOgorICAgICAgICAgICAgZGVsIGNlbGxzW25hbWVdCisgICAgICAgIHNlbGYuY2VsbHZhcnMgPSBzZWxmLmNlbGx2YXJzICsgY2VsbHMua2V5cygpCisgICAgICAgIHNlbGYuY2xvc3VyZSA9IHNlbGYuY2VsbHZhcnMgKyBzZWxmLmZyZWV2YXJzCisKKyAgICBkZWYgX2xvb2t1cE5hbWUoc2VsZiwgbmFtZSwgbGlzdCk6CisgICAgICAgICIiIlJldHVybiBpbmRleCBvZiBuYW1lIGluIGxpc3QsIGFwcGVuZGluZyBpZiBuZWNlc3NhcnkKKworICAgICAgICBUaGlzIHJvdXRpbmUgdXNlcyBhIGxpc3QgaW5zdGVhZCBvZiBhIGRpY3Rpb25hcnksIGJlY2F1c2UgYQorICAgICAgICBkaWN0aW9uYXJ5IGNhbid0IHN0b3JlIHR3byBkaWZmZXJlbnQga2V5cyBpZiB0aGUga2V5cyBoYXZlIHRoZQorICAgICAgICBzYW1lIHZhbHVlIGJ1dCBkaWZmZXJlbnQgdHlwZXMsIGUuZy4gMiBhbmQgMkwuICBUaGUgY29tcGlsZXIKKyAgICAgICAgbXVzdCB0cmVhdCB0aGVzZSB0d28gc2VwYXJhdGVseSwgc28gaXQgZG9lcyBhbiBleHBsaWNpdCB0eXBlCisgICAgICAgIGNvbXBhcmlzb24gYmVmb3JlIGNvbXBhcmluZyB0aGUgdmFsdWVzLgorICAgICAgICAiIiIKKyAgICAgICAgdCA9IHR5cGUobmFtZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpc3QpKToKKyAgICAgICAgICAgIGlmIHQgPT0gdHlwZShsaXN0W2ldKSBhbmQgbGlzdFtpXSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgIGVuZCA9IGxlbihsaXN0KQorICAgICAgICBsaXN0LmFwcGVuZChuYW1lKQorICAgICAgICByZXR1cm4gZW5kCisKKyAgICBfY29udmVydGVycyA9IHt9CisgICAgZGVmIF9jb252ZXJ0X0xPQURfQ09OU1Qoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgaGFzYXR0cihhcmcsICdnZXRDb2RlJyk6CisgICAgICAgICAgICBhcmcgPSBhcmcuZ2V0Q29kZSgpCisgICAgICAgIHJldHVybiBzZWxmLl9sb29rdXBOYW1lKGFyZywgc2VsZi5jb25zdHMpCisKKyAgICBkZWYgX2NvbnZlcnRfTE9BRF9GQVNUKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLm5hbWVzKQorICAgICAgICByZXR1cm4gc2VsZi5fbG9va3VwTmFtZShhcmcsIHNlbGYudmFybmFtZXMpCisgICAgX2NvbnZlcnRfU1RPUkVfRkFTVCA9IF9jb252ZXJ0X0xPQURfRkFTVAorICAgIF9jb252ZXJ0X0RFTEVURV9GQVNUID0gX2NvbnZlcnRfTE9BRF9GQVNUCisKKyAgICBkZWYgX2NvbnZlcnRfTE9BRF9OQU1FKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIHNlbGYua2xhc3MgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLnZhcm5hbWVzKQorICAgICAgICByZXR1cm4gc2VsZi5fbG9va3VwTmFtZShhcmcsIHNlbGYubmFtZXMpCisKKyAgICBkZWYgX2NvbnZlcnRfTkFNRShzZWxmLCBhcmcpOgorICAgICAgICBpZiBzZWxmLmtsYXNzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9sb29rdXBOYW1lKGFyZywgc2VsZi52YXJuYW1lcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLm5hbWVzKQorICAgIF9jb252ZXJ0X1NUT1JFX05BTUUgPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfREVMRVRFX05BTUUgPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfSU1QT1JUX05BTUUgPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfSU1QT1JUX0ZST00gPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfU1RPUkVfQVRUUiA9IF9jb252ZXJ0X05BTUUKKyAgICBfY29udmVydF9MT0FEX0FUVFIgPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfREVMRVRFX0FUVFIgPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfTE9BRF9HTE9CQUwgPSBfY29udmVydF9OQU1FCisgICAgX2NvbnZlcnRfU1RPUkVfR0xPQkFMID0gX2NvbnZlcnRfTkFNRQorICAgIF9jb252ZXJ0X0RFTEVURV9HTE9CQUwgPSBfY29udmVydF9OQU1FCisKKyAgICBkZWYgX2NvbnZlcnRfREVSRUYoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5fbG9va3VwTmFtZShhcmcsIHNlbGYubmFtZXMpCisgICAgICAgIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLnZhcm5hbWVzKQorICAgICAgICByZXR1cm4gc2VsZi5fbG9va3VwTmFtZShhcmcsIHNlbGYuY2xvc3VyZSkKKyAgICBfY29udmVydF9MT0FEX0RFUkVGID0gX2NvbnZlcnRfREVSRUYKKyAgICBfY29udmVydF9TVE9SRV9ERVJFRiA9IF9jb252ZXJ0X0RFUkVGCisKKyAgICBkZWYgX2NvbnZlcnRfTE9BRF9DTE9TVVJFKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuX2xvb2t1cE5hbWUoYXJnLCBzZWxmLnZhcm5hbWVzKQorICAgICAgICByZXR1cm4gc2VsZi5fbG9va3VwTmFtZShhcmcsIHNlbGYuY2xvc3VyZSkKKworICAgIF9jbXAgPSBsaXN0KGRpcy5jbXBfb3ApCisgICAgZGVmIF9jb252ZXJ0X0NPTVBBUkVfT1Aoc2VsZiwgYXJnKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NtcC5pbmRleChhcmcpCisKKyAgICAjIHNpbWlsYXJseSBmb3Igb3RoZXIgb3Bjb2Rlcy4uLgorCisgICAgZm9yIG5hbWUsIG9iaiBpbiBsb2NhbHMoKS5pdGVtcygpOgorICAgICAgICBpZiBuYW1lWzo5XSA9PSAiX2NvbnZlcnRfIjoKKyAgICAgICAgICAgIG9wbmFtZSA9IG5hbWVbOTpdCisgICAgICAgICAgICBfY29udmVydGVyc1tvcG5hbWVdID0gb2JqCisgICAgZGVsIG5hbWUsIG9iaiwgb3BuYW1lCisKKyAgICBkZWYgbWFrZUJ5dGVDb2RlKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5zdGFnZSA9PSBDT05WCisgICAgICAgIHNlbGYubG5vdGFiID0gbG5vdGFiID0gTGluZUFkZHJUYWJsZSgpCisgICAgICAgIGZvciB0IGluIHNlbGYuaW5zdHM6CisgICAgICAgICAgICBvcG5hbWUgPSB0WzBdCisgICAgICAgICAgICBpZiBsZW4odCkgPT0gMToKKyAgICAgICAgICAgICAgICBsbm90YWIuYWRkQ29kZShzZWxmLm9wbnVtW29wbmFtZV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9wYXJnID0gdFsxXQorICAgICAgICAgICAgICAgIGlmIG9wbmFtZSA9PSAiU0VUX0xJTkVOTyI6CisgICAgICAgICAgICAgICAgICAgIGxub3RhYi5uZXh0TGluZShvcGFyZykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBoaSwgbG8gPSB0d29ieXRlKG9wYXJnKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbG5vdGFiLmFkZENvZGUoc2VsZi5vcG51bVtvcG5hbWVdLCBsbywgaGkpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHByaW50IG9wbmFtZSwgb3BhcmcKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5vcG51bVtvcG5hbWVdLCBsbywgaGkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5zdGFnZSA9IERPTkUKKworICAgIG9wbnVtID0ge30KKyAgICBmb3IgbnVtIGluIHJhbmdlKGxlbihkaXMub3BuYW1lKSk6CisgICAgICAgIG9wbnVtW2Rpcy5vcG5hbWVbbnVtXV0gPSBudW0KKyAgICBkZWwgbnVtCisKKyAgICBkZWYgbmV3Q29kZU9iamVjdChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuc3RhZ2UgPT0gRE9ORQorICAgICAgICBpZiAoc2VsZi5mbGFncyAmIENPX05FV0xPQ0FMUykgPT0gMDoKKyAgICAgICAgICAgIG5sb2NhbHMgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBubG9jYWxzID0gbGVuKHNlbGYudmFybmFtZXMpCisgICAgICAgIGFyZ2NvdW50ID0gc2VsZi5hcmdjb3VudAorICAgICAgICBpZiBzZWxmLmZsYWdzICYgQ09fVkFSS0VZV09SRFM6CisgICAgICAgICAgICBhcmdjb3VudCA9IGFyZ2NvdW50IC0gMQorICAgICAgICByZXR1cm4gdHlwZXMuQ29kZVR5cGUoYXJnY291bnQsIG5sb2NhbHMsIHNlbGYuc3RhY2tzaXplLCBzZWxmLmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sbm90YWIuZ2V0Q29kZSgpLCBzZWxmLmdldENvbnN0cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUoc2VsZi5uYW1lcyksIHR1cGxlKHNlbGYudmFybmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgc2VsZi5uYW1lLCBzZWxmLmxub3RhYi5maXJzdGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxub3RhYi5nZXRUYWJsZSgpLCB0dXBsZShzZWxmLmZyZWV2YXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlKHNlbGYuY2VsbHZhcnMpKQorCisgICAgZGVmIGdldENvbnN0cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgZm9yIHRoZSBjb25zdCBzbG90IG9mIHRoZSBjb2RlIG9iamVjdAorCisgICAgICAgIE11c3QgY29udmVydCByZWZlcmVuY2VzIHRvIGNvZGUgKE1BS0VfRlVOQ1RJT04pIHRvIGNvZGUKKyAgICAgICAgb2JqZWN0cyByZWN1cnNpdmVseS4KKyAgICAgICAgIiIiCisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgZWx0IGluIHNlbGYuY29uc3RzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShlbHQsIFB5Rmxvd0dyYXBoKToKKyAgICAgICAgICAgICAgICBlbHQgPSBlbHQuZ2V0Q29kZSgpCisgICAgICAgICAgICBsLmFwcGVuZChlbHQpCisgICAgICAgIHJldHVybiB0dXBsZShsKQorCitkZWYgaXNKdW1wKG9wbmFtZSk6CisgICAgaWYgb3BuYW1lWzo0XSA9PSAnSlVNUCc6CisgICAgICAgIHJldHVybiAxCisKK2NsYXNzIFR1cGxlQXJnOgorICAgICIiIkhlbHBlciBmb3IgbWFya2luZyBmdW5jIGRlZnMgd2l0aCBuZXN0ZWQgdHVwbGVzIGluIGFyZ2xpc3QiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY291bnQsIG5hbWVzKToKKyAgICAgICAgc2VsZi5jb3VudCA9IGNvdW50CisgICAgICAgIHNlbGYubmFtZXMgPSBuYW1lcworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJUdXBsZUFyZyglcywgJXMpIiAlIChzZWxmLmNvdW50LCBzZWxmLm5hbWVzKQorICAgIGRlZiBnZXROYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gIi4lZCIgJSBzZWxmLmNvdW50CisKK2RlZiBnZXRBcmdDb3VudChhcmdzKToKKyAgICBhcmdjb3VudCA9IGxlbihhcmdzKQorICAgIGlmIGFyZ3M6CisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCBUdXBsZUFyZyk6CisgICAgICAgICAgICAgICAgbnVtTmFtZXMgPSBsZW4obWlzYy5mbGF0dGVuKGFyZy5uYW1lcykpCisgICAgICAgICAgICAgICAgYXJnY291bnQgPSBhcmdjb3VudCAtIG51bU5hbWVzCisgICAgcmV0dXJuIGFyZ2NvdW50CisKK2RlZiB0d29ieXRlKHZhbCk6CisgICAgIiIiQ29udmVydCBhbiBpbnQgYXJndW1lbnQgaW50byBoaWdoIGFuZCBsb3cgYnl0ZXMiIiIKKyAgICBhc3NlcnQgaXNpbnN0YW5jZSh2YWwsIGludCkKKyAgICByZXR1cm4gZGl2bW9kKHZhbCwgMjU2KQorCitjbGFzcyBMaW5lQWRkclRhYmxlOgorICAgICIiImxub3RhYgorCisgICAgVGhpcyBjbGFzcyBidWlsZHMgdGhlIGxub3RhYiwgd2hpY2ggaXMgZG9jdW1lbnRlZCBpbiBjb21waWxlLmMuCisgICAgSGVyZSdzIGEgYnJpZWYgcmVjYXA6CisKKyAgICBGb3IgZWFjaCBTRVRfTElORU5PIGluc3RydWN0aW9uIGFmdGVyIHRoZSBmaXJzdCBvbmUsIHR3byBieXRlcyBhcmUKKyAgICBhZGRlZCB0byBsbm90YWIuICAoSW4gc29tZSBjYXNlcywgbXVsdGlwbGUgdHdvLWJ5dGUgZW50cmllcyBhcmUKKyAgICBhZGRlZC4pICBUaGUgZmlyc3QgYnl0ZSBpcyB0aGUgZGlzdGFuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0aGUKKyAgICBpbnN0cnVjdGlvbiBmb3IgdGhlIGxhc3QgU0VUX0xJTkVOTyBhbmQgdGhlIGN1cnJlbnQgU0VUX0xJTkVOTy4KKyAgICBUaGUgc2Vjb25kIGJ5dGUgaXMgb2Zmc2V0IGluIGxpbmUgbnVtYmVycy4gIElmIGVpdGhlciBvZmZzZXQgaXMKKyAgICBncmVhdGVyIHRoYW4gMjU1LCBtdWx0aXBsZSB0d28tYnl0ZSBlbnRyaWVzIGFyZSBhZGRlZCAtLSBzZWUKKyAgICBjb21waWxlLmMgZm9yIHRoZSBkZWxpY2F0ZSBkZXRhaWxzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNvZGUgPSBbXQorICAgICAgICBzZWxmLmNvZGVPZmZzZXQgPSAwCisgICAgICAgIHNlbGYuZmlyc3RsaW5lID0gMAorICAgICAgICBzZWxmLmxhc3RsaW5lID0gMAorICAgICAgICBzZWxmLmxhc3RvZmYgPSAwCisgICAgICAgIHNlbGYubG5vdGFiID0gW10KKworICAgIGRlZiBhZGRDb2RlKHNlbGYsICphcmdzKToKKyAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgc2VsZi5jb2RlLmFwcGVuZChjaHIoYXJnKSkKKyAgICAgICAgc2VsZi5jb2RlT2Zmc2V0ID0gc2VsZi5jb2RlT2Zmc2V0ICsgbGVuKGFyZ3MpCisKKyAgICBkZWYgbmV4dExpbmUoc2VsZiwgbGluZW5vKToKKyAgICAgICAgaWYgc2VsZi5maXJzdGxpbmUgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuZmlyc3RsaW5lID0gbGluZW5vCisgICAgICAgICAgICBzZWxmLmxhc3RsaW5lID0gbGluZW5vCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGNvbXB1dGUgZGVsdGFzCisgICAgICAgICAgICBhZGRyID0gc2VsZi5jb2RlT2Zmc2V0IC0gc2VsZi5sYXN0b2ZmCisgICAgICAgICAgICBsaW5lID0gbGluZW5vIC0gc2VsZi5sYXN0bGluZQorICAgICAgICAgICAgIyBQeXRob24gYXNzdW1lcyB0aGF0IGxpbmVubyBhbHdheXMgaW5jcmVhc2VzIHdpdGgKKyAgICAgICAgICAgICMgaW5jcmVhc2luZyBieXRlY29kZSBhZGRyZXNzIChsbm90YWIgaXMgdW5zaWduZWQgY2hhcikuCisgICAgICAgICAgICAjIERlcGVuZGluZyBvbiB3aGVuIFNFVF9MSU5FTk8gaW5zdHJ1Y3Rpb25zIGFyZSBlbWl0dGVkCisgICAgICAgICAgICAjIHRoaXMgaXMgbm90IGFsd2F5cyB0cnVlLiAgQ29uc2lkZXIgdGhlIGNvZGU6CisgICAgICAgICAgICAjICAgICBhID0gKDEsCisgICAgICAgICAgICAjICAgICAgICAgIGIpCisgICAgICAgICAgICAjIEluIHRoZSBieXRlY29kZSBzdHJlYW0sIHRoZSBhc3NpZ25tZW50IHRvICJhIiBvY2N1cnMKKyAgICAgICAgICAgICMgYWZ0ZXIgdGhlIGxvYWRpbmcgb2YgImIiLiAgVGhpcyB3b3JrcyB3aXRoIHRoZSBDIFB5dGhvbgorICAgICAgICAgICAgIyBjb21waWxlciBiZWNhdXNlIGl0IG9ubHkgZ2VuZXJhdGVzIGEgU0VUX0xJTkVOTyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgIyBmb3IgdGhlIGFzc2lnbm1lbnQuCisgICAgICAgICAgICBpZiBsaW5lID49IDA6CisgICAgICAgICAgICAgICAgcHVzaCA9IHNlbGYubG5vdGFiLmFwcGVuZAorICAgICAgICAgICAgICAgIHdoaWxlIGFkZHIgPiAyNTU6CisgICAgICAgICAgICAgICAgICAgIHB1c2goMjU1KTsgcHVzaCgwKQorICAgICAgICAgICAgICAgICAgICBhZGRyIC09IDI1NQorICAgICAgICAgICAgICAgIHdoaWxlIGxpbmUgPiAyNTU6CisgICAgICAgICAgICAgICAgICAgIHB1c2goYWRkcik7IHB1c2goMjU1KQorICAgICAgICAgICAgICAgICAgICBsaW5lIC09IDI1NQorICAgICAgICAgICAgICAgICAgICBhZGRyID0gMAorICAgICAgICAgICAgICAgIGlmIGFkZHIgPiAwIG9yIGxpbmUgPiAwOgorICAgICAgICAgICAgICAgICAgICBwdXNoKGFkZHIpOyBwdXNoKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5sYXN0bGluZSA9IGxpbmVubworICAgICAgICAgICAgICAgIHNlbGYubGFzdG9mZiA9IHNlbGYuY29kZU9mZnNldAorCisgICAgZGVmIGdldENvZGUoc2VsZik6CisgICAgICAgIHJldHVybiAnJy5qb2luKHNlbGYuY29kZSkKKworICAgIGRlZiBnZXRUYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4obWFwKGNociwgc2VsZi5sbm90YWIpKQorCitjbGFzcyBTdGFja0RlcHRoVHJhY2tlcjoKKyAgICAjIFhYWCAxLiBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygc3RhY2sgZGVwdGggb24ganVtcHMKKyAgICAjIFhYWCAyLiBhdCBsZWFzdCBwYXJ0bHkgYXMgYSByZXN1bHQsIHRoaXMgY29kZSBpcyBicm9rZW4KKworICAgIGRlZiBmaW5kRGVwdGgoc2VsZiwgaW5zdHMsIGRlYnVnPTApOgorICAgICAgICBkZXB0aCA9IDAKKyAgICAgICAgbWF4RGVwdGggPSAwCisgICAgICAgIGZvciBpIGluIGluc3RzOgorICAgICAgICAgICAgb3BuYW1lID0gaVswXQorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQgaSwKKyAgICAgICAgICAgIGRlbHRhID0gc2VsZi5lZmZlY3QuZ2V0KG9wbmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyBkZWx0YQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIG5vdyBjaGVjayBwYXR0ZXJucworICAgICAgICAgICAgICAgIGZvciBwYXQsIHBhdF9kZWx0YSBpbiBzZWxmLnBhdHRlcm5zOgorICAgICAgICAgICAgICAgICAgICBpZiBvcG5hbWVbOmxlbihwYXQpXSA9PSBwYXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IHBhdF9kZWx0YQorICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSBkZXB0aCArIGRlbHRhCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICMgaWYgd2Ugc3RpbGwgaGF2ZW4ndCBmb3VuZCBhIG1hdGNoCisgICAgICAgICAgICAgICAgaWYgZGVsdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZiwgb3BuYW1lLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiBtZXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggPSBkZXB0aCArIG1ldGgoaVsxXSkKKyAgICAgICAgICAgIGlmIGRlcHRoID4gbWF4RGVwdGg6CisgICAgICAgICAgICAgICAgbWF4RGVwdGggPSBkZXB0aAorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQgZGVwdGgsIG1heERlcHRoCisgICAgICAgIHJldHVybiBtYXhEZXB0aAorCisgICAgZWZmZWN0ID0geworICAgICAgICAnUE9QX1RPUCc6IC0xLAorICAgICAgICAnRFVQX1RPUCc6IDEsCisgICAgICAgICdMSVNUX0FQUEVORCc6IC0xLAorICAgICAgICAnU0VUX0FERCc6IC0xLAorICAgICAgICAnTUFQX0FERCc6IC0yLAorICAgICAgICAnU0xJQ0UrMSc6IC0xLAorICAgICAgICAnU0xJQ0UrMic6IC0xLAorICAgICAgICAnU0xJQ0UrMyc6IC0yLAorICAgICAgICAnU1RPUkVfU0xJQ0UrMCc6IC0xLAorICAgICAgICAnU1RPUkVfU0xJQ0UrMSc6IC0yLAorICAgICAgICAnU1RPUkVfU0xJQ0UrMic6IC0yLAorICAgICAgICAnU1RPUkVfU0xJQ0UrMyc6IC0zLAorICAgICAgICAnREVMRVRFX1NMSUNFKzAnOiAtMSwKKyAgICAgICAgJ0RFTEVURV9TTElDRSsxJzogLTIsCisgICAgICAgICdERUxFVEVfU0xJQ0UrMic6IC0yLAorICAgICAgICAnREVMRVRFX1NMSUNFKzMnOiAtMywKKyAgICAgICAgJ1NUT1JFX1NVQlNDUic6IC0zLAorICAgICAgICAnREVMRVRFX1NVQlNDUic6IC0yLAorICAgICAgICAjIFBSSU5UX0VYUFI/CisgICAgICAgICdQUklOVF9JVEVNJzogLTEsCisgICAgICAgICdSRVRVUk5fVkFMVUUnOiAtMSwKKyAgICAgICAgJ1lJRUxEX1ZBTFVFJzogLTEsCisgICAgICAgICdFWEVDX1NUTVQnOiAtMywKKyAgICAgICAgJ0JVSUxEX0NMQVNTJzogLTIsCisgICAgICAgICdTVE9SRV9OQU1FJzogLTEsCisgICAgICAgICdTVE9SRV9BVFRSJzogLTIsCisgICAgICAgICdERUxFVEVfQVRUUic6IC0xLAorICAgICAgICAnU1RPUkVfR0xPQkFMJzogLTEsCisgICAgICAgICdCVUlMRF9NQVAnOiAxLAorICAgICAgICAnQ09NUEFSRV9PUCc6IC0xLAorICAgICAgICAnU1RPUkVfRkFTVCc6IC0xLAorICAgICAgICAnSU1QT1JUX1NUQVInOiAtMSwKKyAgICAgICAgJ0lNUE9SVF9OQU1FJzogLTEsCisgICAgICAgICdJTVBPUlRfRlJPTSc6IDEsCisgICAgICAgICdMT0FEX0FUVFInOiAwLCAjIHVubGlrZSBvdGhlciBsb2FkcworICAgICAgICAjIGNsb3NlIGVub3VnaC4uLgorICAgICAgICAnU0VUVVBfRVhDRVBUJzogMywKKyAgICAgICAgJ1NFVFVQX0ZJTkFMTFknOiAzLAorICAgICAgICAnRk9SX0lURVInOiAxLAorICAgICAgICAnV0lUSF9DTEVBTlVQJzogLTEsCisgICAgICAgIH0KKyAgICAjIHVzZSBwYXR0ZXJuIG1hdGNoCisgICAgcGF0dGVybnMgPSBbCisgICAgICAgICgnQklOQVJZXycsIC0xKSwKKyAgICAgICAgKCdMT0FEXycsIDEpLAorICAgICAgICBdCisKKyAgICBkZWYgVU5QQUNLX1NFUVVFTkNFKHNlbGYsIGNvdW50KToKKyAgICAgICAgcmV0dXJuIGNvdW50LTEKKyAgICBkZWYgQlVJTERfVFVQTEUoc2VsZiwgY291bnQpOgorICAgICAgICByZXR1cm4gLWNvdW50KzEKKyAgICBkZWYgQlVJTERfTElTVChzZWxmLCBjb3VudCk6CisgICAgICAgIHJldHVybiAtY291bnQrMQorICAgIGRlZiBCVUlMRF9TRVQoc2VsZiwgY291bnQpOgorICAgICAgICByZXR1cm4gLWNvdW50KzEKKyAgICBkZWYgQ0FMTF9GVU5DVElPTihzZWxmLCBhcmdjKToKKyAgICAgICAgaGksIGxvID0gZGl2bW9kKGFyZ2MsIDI1NikKKyAgICAgICAgcmV0dXJuIC0obG8gKyBoaSAqIDIpCisgICAgZGVmIENBTExfRlVOQ1RJT05fVkFSKHNlbGYsIGFyZ2MpOgorICAgICAgICByZXR1cm4gc2VsZi5DQUxMX0ZVTkNUSU9OKGFyZ2MpLTEKKyAgICBkZWYgQ0FMTF9GVU5DVElPTl9LVyhzZWxmLCBhcmdjKToKKyAgICAgICAgcmV0dXJuIHNlbGYuQ0FMTF9GVU5DVElPTihhcmdjKS0xCisgICAgZGVmIENBTExfRlVOQ1RJT05fVkFSX0tXKHNlbGYsIGFyZ2MpOgorICAgICAgICByZXR1cm4gc2VsZi5DQUxMX0ZVTkNUSU9OKGFyZ2MpLTIKKyAgICBkZWYgTUFLRV9GVU5DVElPTihzZWxmLCBhcmdjKToKKyAgICAgICAgcmV0dXJuIC1hcmdjCisgICAgZGVmIE1BS0VfQ0xPU1VSRShzZWxmLCBhcmdjKToKKyAgICAgICAgIyBYWFggbmVlZCB0byBhY2NvdW50IGZvciBmcmVlIHZhcmlhYmxlcyB0b28hCisgICAgICAgIHJldHVybiAtYXJnYworICAgIGRlZiBCVUlMRF9TTElDRShzZWxmLCBhcmdjKToKKyAgICAgICAgaWYgYXJnYyA9PSAyOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGVsaWYgYXJnYyA9PSAzOgorICAgICAgICAgICAgcmV0dXJuIC0yCisgICAgZGVmIERVUF9UT1BYKHNlbGYsIGFyZ2MpOgorICAgICAgICByZXR1cm4gYXJnYworCitmaW5kRGVwdGggPSBTdGFja0RlcHRoVHJhY2tlcigpLmZpbmREZXB0aApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWFzc2VtLnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4NzI3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWFzc2VtLnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkNmU0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHlhc3NlbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWNvZGVnZW4ucHkgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3B5Y29kZWdlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTE1OTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWNvZGVnZW4ucHkKQEAgLTAsMCArMSwxNTU1IEBACitpbXBvcnQgaW1wCitpbXBvcnQgb3MKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3lzCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworZnJvbSBjb21waWxlciBpbXBvcnQgYXN0LCBwYXJzZSwgd2Fsaywgc3ludGF4Citmcm9tIGNvbXBpbGVyIGltcG9ydCBweWFzc2VtLCBtaXNjLCBmdXR1cmUsIHN5bWJvbHMKK2Zyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCBTQ19MT0NBTCwgU0NfR0xPQkFMX0lNUExJQ0lULCBTQ19HTE9CQUxfRVhQTElDSVQsIFwKKyAgICAgU0NfRlJFRSwgU0NfQ0VMTAorZnJvbSBjb21waWxlci5jb25zdHMgaW1wb3J0IChDT19WQVJBUkdTLCBDT19WQVJLRVlXT1JEUywgQ09fTkVXTE9DQUxTLAorICAgICBDT19ORVNURUQsIENPX0dFTkVSQVRPUiwgQ09fRlVUVVJFX0RJVklTSU9OLAorICAgICBDT19GVVRVUkVfQUJTSU1QT1JULCBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQsIENPX0ZVVFVSRV9QUklOVF9GVU5DVElPTikKK2Zyb20gY29tcGlsZXIucHlhc3NlbSBpbXBvcnQgVHVwbGVBcmcKKworIyBYWFggVGhlIHZlcnNpb24tc3BlY2lmaWMgY29kZSBjYW4gZ28sIHNpbmNlIHRoaXMgY29kZSBvbmx5IHdvcmtzIHdpdGggMi54LgorIyBEbyB3ZSBoYXZlIFB5dGhvbiAxLnggb3IgUHl0aG9uIDIueD8KK3RyeToKKyAgICBWRVJTSU9OID0gc3lzLnZlcnNpb25faW5mb1swXQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIFZFUlNJT04gPSAxCisKK2NhbGxmdW5jX29wY29kZV9pbmZvID0geworICAgICMgKEhhdmUgKmFyZ3MsIEhhdmUgKiphcmdzKSA6IG9wY29kZQorICAgICgwLDApIDogIkNBTExfRlVOQ1RJT04iLAorICAgICgxLDApIDogIkNBTExfRlVOQ1RJT05fVkFSIiwKKyAgICAoMCwxKSA6ICJDQUxMX0ZVTkNUSU9OX0tXIiwKKyAgICAoMSwxKSA6ICJDQUxMX0ZVTkNUSU9OX1ZBUl9LVyIsCit9CisKK0xPT1AgPSAxCitFWENFUFQgPSAyCitUUllfRklOQUxMWSA9IDMKK0VORF9GSU5BTExZID0gNAorCitkZWYgY29tcGlsZUZpbGUoZmlsZW5hbWUsIGRpc3BsYXk9MCk6CisgICAgZiA9IG9wZW4oZmlsZW5hbWUsICdVJykKKyAgICBidWYgPSBmLnJlYWQoKQorICAgIGYuY2xvc2UoKQorICAgIG1vZCA9IE1vZHVsZShidWYsIGZpbGVuYW1lKQorICAgIHRyeToKKyAgICAgICAgbW9kLmNvbXBpbGUoZGlzcGxheSkKKyAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgIHJhaXNlCisgICAgZWxzZToKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUgKyAiYyIsICJ3YiIpCisgICAgICAgIG1vZC5kdW1wKGYpCisgICAgICAgIGYuY2xvc2UoKQorCitkZWYgY29tcGlsZShzb3VyY2UsIGZpbGVuYW1lLCBtb2RlLCBmbGFncz1Ob25lLCBkb250X2luaGVyaXQ9Tm9uZSk6CisgICAgIiIiUmVwbGFjZW1lbnQgZm9yIGJ1aWx0aW4gY29tcGlsZSgpIGZ1bmN0aW9uIiIiCisgICAgaWYgZmxhZ3MgaXMgbm90IE5vbmUgb3IgZG9udF9pbmhlcml0IGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJub3QgaW1wbGVtZW50ZWQgeWV0IgorCisgICAgaWYgbW9kZSA9PSAic2luZ2xlIjoKKyAgICAgICAgZ2VuID0gSW50ZXJhY3RpdmUoc291cmNlLCBmaWxlbmFtZSkKKyAgICBlbGlmIG1vZGUgPT0gImV4ZWMiOgorICAgICAgICBnZW4gPSBNb2R1bGUoc291cmNlLCBmaWxlbmFtZSkKKyAgICBlbGlmIG1vZGUgPT0gImV2YWwiOgorICAgICAgICBnZW4gPSBFeHByZXNzaW9uKHNvdXJjZSwgZmlsZW5hbWUpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY29tcGlsZSgpIDNyZCBhcmcgbXVzdCBiZSAnZXhlYycgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICInZXZhbCcgb3IgJ3NpbmdsZSciKQorICAgIGdlbi5jb21waWxlKCkKKyAgICByZXR1cm4gZ2VuLmNvZGUKKworY2xhc3MgQWJzdHJhY3RDb21waWxlTW9kZToKKworICAgIG1vZGUgPSBOb25lICMgZGVmaW5lZCBieSBzdWJjbGFzcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLnNvdXJjZSA9IHNvdXJjZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5jb2RlID0gTm9uZQorCisgICAgZGVmIF9nZXRfdHJlZShzZWxmKToKKyAgICAgICAgdHJlZSA9IHBhcnNlKHNlbGYuc291cmNlLCBzZWxmLm1vZGUpCisgICAgICAgIG1pc2Muc2V0X2ZpbGVuYW1lKHNlbGYuZmlsZW5hbWUsIHRyZWUpCisgICAgICAgIHN5bnRheC5jaGVjayh0cmVlKQorICAgICAgICByZXR1cm4gdHJlZQorCisgICAgZGVmIGNvbXBpbGUoc2VsZik6CisgICAgICAgIHBhc3MgIyBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcworCisgICAgZGVmIGdldENvZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvZGUKKworY2xhc3MgRXhwcmVzc2lvbihBYnN0cmFjdENvbXBpbGVNb2RlKToKKworICAgIG1vZGUgPSAiZXZhbCIKKworICAgIGRlZiBjb21waWxlKHNlbGYpOgorICAgICAgICB0cmVlID0gc2VsZi5fZ2V0X3RyZWUoKQorICAgICAgICBnZW4gPSBFeHByZXNzaW9uQ29kZUdlbmVyYXRvcih0cmVlKQorICAgICAgICBzZWxmLmNvZGUgPSBnZW4uZ2V0Q29kZSgpCisKK2NsYXNzIEludGVyYWN0aXZlKEFic3RyYWN0Q29tcGlsZU1vZGUpOgorCisgICAgbW9kZSA9ICJzaW5nbGUiCisKKyAgICBkZWYgY29tcGlsZShzZWxmKToKKyAgICAgICAgdHJlZSA9IHNlbGYuX2dldF90cmVlKCkKKyAgICAgICAgZ2VuID0gSW50ZXJhY3RpdmVDb2RlR2VuZXJhdG9yKHRyZWUpCisgICAgICAgIHNlbGYuY29kZSA9IGdlbi5nZXRDb2RlKCkKKworY2xhc3MgTW9kdWxlKEFic3RyYWN0Q29tcGlsZU1vZGUpOgorCisgICAgbW9kZSA9ICJleGVjIgorCisgICAgZGVmIGNvbXBpbGUoc2VsZiwgZGlzcGxheT0wKToKKyAgICAgICAgdHJlZSA9IHNlbGYuX2dldF90cmVlKCkKKyAgICAgICAgZ2VuID0gTW9kdWxlQ29kZUdlbmVyYXRvcih0cmVlKQorICAgICAgICBpZiBkaXNwbGF5OgorICAgICAgICAgICAgaW1wb3J0IHBwcmludAorICAgICAgICAgICAgcHJpbnQgcHByaW50LnBwcmludCh0cmVlKQorICAgICAgICBzZWxmLmNvZGUgPSBnZW4uZ2V0Q29kZSgpCisKKyAgICBkZWYgZHVtcChzZWxmLCBmKToKKyAgICAgICAgZi53cml0ZShzZWxmLmdldFB5Y0hlYWRlcigpKQorICAgICAgICBtYXJzaGFsLmR1bXAoc2VsZi5jb2RlLCBmKQorCisgICAgTUFHSUMgPSBpbXAuZ2V0X21hZ2ljKCkKKworICAgIGRlZiBnZXRQeWNIZWFkZXIoc2VsZik6CisgICAgICAgICMgY29tcGlsZS5jIHVzZXMgbWFyc2hhbCB0byB3cml0ZSBhIGxvbmcgZGlyZWN0bHksIHdpdGgKKyAgICAgICAgIyBjYWxsaW5nIHRoZSBpbnRlcmZhY2UgdGhhdCB3b3VsZCBhbHNvIGdlbmVyYXRlIGEgMS1ieXRlIGNvZGUKKyAgICAgICAgIyB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBzaW1wbGVzdCB3YXkgdG8gZ2V0IHRoZQorICAgICAgICAjIHNhbWUgZWZmZWN0IGlzIHRvIGNhbGwgbWFyc2hhbCBhbmQgdGhlbiBza2lwIHRoZSBjb2RlLgorICAgICAgICBtdGltZSA9IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgbXRpbWUgPSBzdHJ1Y3QucGFjaygnPGknLCBtdGltZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuTUFHSUMgKyBtdGltZQorCitjbGFzcyBMb2NhbE5hbWVGaW5kZXI6CisgICAgIiIiRmluZCBsb2NhbCBuYW1lcyBpbiBzY29wZSIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lcz0oKSk6CisgICAgICAgIHNlbGYubmFtZXMgPSBtaXNjLlNldCgpCisgICAgICAgIHNlbGYuZ2xvYmFscyA9IG1pc2MuU2V0KCkKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBzZWxmLm5hbWVzLmFkZChuYW1lKQorCisgICAgIyBYWFggbGlzdCBjb21wcmVoZW5zaW9ucyBhbmQgZm9yIGxvb3BzCisKKyAgICBkZWYgZ2V0TG9jYWxzKHNlbGYpOgorICAgICAgICBmb3IgZWx0IGluIHNlbGYuZ2xvYmFscy5lbGVtZW50cygpOgorICAgICAgICAgICAgaWYgc2VsZi5uYW1lcy5oYXNfZWx0KGVsdCk6CisgICAgICAgICAgICAgICAgc2VsZi5uYW1lcy5yZW1vdmUoZWx0KQorICAgICAgICByZXR1cm4gc2VsZi5uYW1lcworCisgICAgZGVmIHZpc2l0RGljdChzZWxmLCBub2RlKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHZpc2l0R2xvYmFsKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgbmFtZSBpbiBub2RlLm5hbWVzOgorICAgICAgICAgICAgc2VsZi5nbG9iYWxzLmFkZChuYW1lKQorCisgICAgZGVmIHZpc2l0RnVuY3Rpb24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYubmFtZXMuYWRkKG5vZGUubmFtZSkKKworICAgIGRlZiB2aXNpdExhbWJkYShzZWxmLCBub2RlKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHZpc2l0SW1wb3J0KHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgbmFtZSwgYWxpYXMgaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIHNlbGYubmFtZXMuYWRkKGFsaWFzIG9yIG5hbWUpCisKKyAgICBkZWYgdmlzaXRGcm9tKHNlbGYsIG5vZGUpOgorICAgICAgICBmb3IgbmFtZSwgYWxpYXMgaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIHNlbGYubmFtZXMuYWRkKGFsaWFzIG9yIG5hbWUpCisKKyAgICBkZWYgdmlzaXRDbGFzcyhzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uYW1lcy5hZGQobm9kZS5uYW1lKQorCisgICAgZGVmIHZpc2l0QXNzTmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5uYW1lcy5hZGQobm9kZS5uYW1lKQorCitkZWYgaXNfY29uc3RhbnRfZmFsc2Uobm9kZSk6CisgICAgaWYgaXNpbnN0YW5jZShub2RlLCBhc3QuQ29uc3QpOgorICAgICAgICBpZiBub3Qgbm9kZS52YWx1ZToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgcmV0dXJuIDAKKworY2xhc3MgQ29kZUdlbmVyYXRvcjoKKyAgICAiIiJEZWZpbmVzIGJhc2ljIGNvZGUgZ2VuZXJhdG9yIGZvciBQeXRob24gYnl0ZWNvZGUKKworICAgIFRoaXMgY2xhc3MgaXMgYW4gYWJzdHJhY3QgYmFzZSBjbGFzcy4gIENvbmNyZXRlIHN1YmNsYXNzZXMgbXVzdAorICAgIGRlZmluZSBhbiBfX2luaXRfXygpIHRoYXQgZGVmaW5lcyBzZWxmLmdyYXBoIGFuZCB0aGVuIGNhbGxzIHRoZQorICAgIF9faW5pdF9fKCkgZGVmaW5lZCBpbiB0aGlzIGNsYXNzLgorCisgICAgVGhlIGNvbmNyZXRlIGNsYXNzIG11c3QgYWxzbyBkZWZpbmUgdGhlIGNsYXNzIGF0dHJpYnV0ZXMKKyAgICBOYW1lRmluZGVyLCBGdW5jdGlvbkdlbiwgYW5kIENsYXNzR2VuLiAgVGhlc2UgYXR0cmlidXRlcyBjYW4gYmUKKyAgICBkZWZpbmVkIGluIHRoZSBpbml0Q2xhc3MoKSBtZXRob2QsIHdoaWNoIGlzIGEgaG9vayBmb3IKKyAgICBpbml0aWFsaXppbmcgdGhlc2UgbWV0aG9kcyBhZnRlciBhbGwgdGhlIGNsYXNzZXMgaGF2ZSBiZWVuCisgICAgZGVmaW5lZC4KKyAgICAiIiIKKworICAgIG9wdGltaXplZCA9IDAgIyBpcyBuYW1lc3BhY2UgYWNjZXNzIG9wdGltaXplZD8KKyAgICBfX2luaXRpYWxpemVkID0gTm9uZQorICAgIGNsYXNzX25hbWUgPSBOb25lICMgcHJvdmlkZSBkZWZhdWx0IGZvciBpbnN0YW5jZSB2YXJpYWJsZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9faW5pdGlhbGl6ZWQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5pdENsYXNzKCkKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9faW5pdGlhbGl6ZWQgPSAxCisgICAgICAgIHNlbGYuY2hlY2tDbGFzcygpCisgICAgICAgIHNlbGYubG9jYWxzID0gbWlzYy5TdGFjaygpCisgICAgICAgIHNlbGYuc2V0dXBzID0gbWlzYy5TdGFjaygpCisgICAgICAgIHNlbGYubGFzdF9saW5lbm8gPSBOb25lCisgICAgICAgIHNlbGYuX3NldHVwR3JhcGhEZWxlZ2F0aW9uKCkKKyAgICAgICAgc2VsZi5fZGl2X29wID0gIkJJTkFSWV9ESVZJREUiCisKKyAgICAgICAgIyBYWFggc2V0IGZsYWdzIGJhc2VkIG9uIGZ1dHVyZSBmZWF0dXJlcworICAgICAgICBmdXR1cmVzID0gc2VsZi5nZXRfbW9kdWxlKCkuZnV0dXJlcworICAgICAgICBmb3IgZmVhdHVyZSBpbiBmdXR1cmVzOgorICAgICAgICAgICAgaWYgZmVhdHVyZSA9PSAiZGl2aXNpb24iOgorICAgICAgICAgICAgICAgIHNlbGYuZ3JhcGguc2V0RmxhZyhDT19GVVRVUkVfRElWSVNJT04pCisgICAgICAgICAgICAgICAgc2VsZi5fZGl2X29wID0gIkJJTkFSWV9UUlVFX0RJVklERSIKKyAgICAgICAgICAgIGVsaWYgZmVhdHVyZSA9PSAiYWJzb2x1dGVfaW1wb3J0IjoKKyAgICAgICAgICAgICAgICBzZWxmLmdyYXBoLnNldEZsYWcoQ09fRlVUVVJFX0FCU0lNUE9SVCkKKyAgICAgICAgICAgIGVsaWYgZmVhdHVyZSA9PSAid2l0aF9zdGF0ZW1lbnQiOgorICAgICAgICAgICAgICAgIHNlbGYuZ3JhcGguc2V0RmxhZyhDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQpCisgICAgICAgICAgICBlbGlmIGZlYXR1cmUgPT0gInByaW50X2Z1bmN0aW9uIjoKKyAgICAgICAgICAgICAgICBzZWxmLmdyYXBoLnNldEZsYWcoQ09fRlVUVVJFX1BSSU5UX0ZVTkNUSU9OKQorCisgICAgZGVmIGluaXRDbGFzcyhzZWxmKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggY2xhc3MiIiIKKworICAgIGRlZiBjaGVja0NsYXNzKHNlbGYpOgorICAgICAgICAiIiJWZXJpZnkgdGhhdCBjbGFzcyBpcyBjb25zdHJ1Y3RlZCBjb3JyZWN0bHkiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXNzZXJ0IGhhc2F0dHIoc2VsZiwgJ2dyYXBoJykKKyAgICAgICAgICAgIGFzc2VydCBnZXRhdHRyKHNlbGYsICdOYW1lRmluZGVyJykKKyAgICAgICAgICAgIGFzc2VydCBnZXRhdHRyKHNlbGYsICdGdW5jdGlvbkdlbicpCisgICAgICAgICAgICBhc3NlcnQgZ2V0YXR0cihzZWxmLCAnQ2xhc3NHZW4nKQorICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIGludHJvID0gIkJhZCBjbGFzcyBjb25zdHJ1Y3Rpb24gZm9yICVzIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgaW50cm8KKworICAgIGRlZiBfc2V0dXBHcmFwaERlbGVnYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuZW1pdCA9IHNlbGYuZ3JhcGguZW1pdAorICAgICAgICBzZWxmLm5ld0Jsb2NrID0gc2VsZi5ncmFwaC5uZXdCbG9jaworICAgICAgICBzZWxmLnN0YXJ0QmxvY2sgPSBzZWxmLmdyYXBoLnN0YXJ0QmxvY2sKKyAgICAgICAgc2VsZi5uZXh0QmxvY2sgPSBzZWxmLmdyYXBoLm5leHRCbG9jaworICAgICAgICBzZWxmLnNldERvY3N0cmluZyA9IHNlbGYuZ3JhcGguc2V0RG9jc3RyaW5nCisKKyAgICBkZWYgZ2V0Q29kZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgY29kZSBvYmplY3QiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ3JhcGguZ2V0Q29kZSgpCisKKyAgICBkZWYgbWFuZ2xlKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBzZWxmLmNsYXNzX25hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbWlzYy5tYW5nbGUobmFtZSwgc2VsZi5jbGFzc19uYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiBwYXJzZVN5bWJvbHMoc2VsZiwgdHJlZSk6CisgICAgICAgIHMgPSBzeW1ib2xzLlN5bWJvbFZpc2l0b3IoKQorICAgICAgICB3YWxrKHRyZWUsIHMpCisgICAgICAgIHJldHVybiBzLnNjb3BlcworCisgICAgZGVmIGdldF9tb2R1bGUoc2VsZik6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgInNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIgorCisgICAgIyBOZXh0IGZpdmUgbWV0aG9kcyBoYW5kbGUgbmFtZSBhY2Nlc3MKKworICAgIGRlZiBpc0xvY2FsTmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYubG9jYWxzLnRvcCgpLmhhc19lbHQobmFtZSkKKworICAgIGRlZiBzdG9yZU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX25hbWVPcCgnU1RPUkUnLCBuYW1lKQorCisgICAgZGVmIGxvYWROYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9uYW1lT3AoJ0xPQUQnLCBuYW1lKQorCisgICAgZGVmIGRlbE5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX25hbWVPcCgnREVMRVRFJywgbmFtZSkKKworICAgIGRlZiBfbmFtZU9wKHNlbGYsIHByZWZpeCwgbmFtZSk6CisgICAgICAgIG5hbWUgPSBzZWxmLm1hbmdsZShuYW1lKQorICAgICAgICBzY29wZSA9IHNlbGYuc2NvcGUuY2hlY2tfbmFtZShuYW1lKQorICAgICAgICBpZiBzY29wZSA9PSBTQ19MT0NBTDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLm9wdGltaXplZDoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQocHJlZml4ICsgJ19OQU1FJywgbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfRkFTVCcsIG5hbWUpCisgICAgICAgIGVsaWYgc2NvcGUgPT0gU0NfR0xPQkFMX0VYUExJQ0lUOgorICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfR0xPQkFMJywgbmFtZSkKKyAgICAgICAgZWxpZiBzY29wZSA9PSBTQ19HTE9CQUxfSU1QTElDSVQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5vcHRpbWl6ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfTkFNRScsIG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdChwcmVmaXggKyAnX0dMT0JBTCcsIG5hbWUpCisgICAgICAgIGVsaWYgc2NvcGUgPT0gU0NfRlJFRSBvciBzY29wZSA9PSBTQ19DRUxMOgorICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfREVSRUYnLCBuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAidW5zdXBwb3J0ZWQgc2NvcGUgZm9yIHZhciAlczogJWQiICUgXAorICAgICAgICAgICAgICAgICAgKG5hbWUsIHNjb3BlKQorCisgICAgZGVmIF9pbXBsaWNpdE5hbWVPcChzZWxmLCBwcmVmaXgsIG5hbWUpOgorICAgICAgICAiIiJFbWl0IG5hbWUgb3BzIGZvciBuYW1lcyBnZW5lcmF0ZWQgaW1wbGljaXRseSBieSBmb3IgbG9vcHMKKworICAgICAgICBUaGUgaW50ZXJwcmV0ZXIgZ2VuZXJhdGVzIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCBhIHBlcmlvZCBvcgorICAgICAgICBkb2xsYXIgc2lnbi4gIFRoZSBzeW1ib2wgdGFibGUgaWdub3JlcyB0aGVzZSBuYW1lcyBiZWNhdXNlCisgICAgICAgIHRoZXkgYXJlbid0IHByZXNlbnQgaW4gdGhlIHByb2dyYW0gdGV4dC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYub3B0aW1pemVkOgorICAgICAgICAgICAgc2VsZi5lbWl0KHByZWZpeCArICdfRkFTVCcsIG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVtaXQocHJlZml4ICsgJ19OQU1FJywgbmFtZSkKKworICAgICMgVGhlIHNldF9saW5lbm8oKSBmdW5jdGlvbiBhbmQgdGhlIGV4cGxpY2l0IGVtaXQoKSBjYWxscyBmb3IKKyAgICAjIFNFVF9MSU5FTk8gYmVsb3cgYXJlIG9ubHkgdXNlZCB0byBnZW5lcmF0ZSB0aGUgbGluZSBudW1iZXIgdGFibGUuCisgICAgIyBBcyBvZiBQeXRob24gMi4zLCB0aGUgaW50ZXJwcmV0ZXIgZG9lcyBub3QgaGF2ZSBhIFNFVF9MSU5FTk8KKyAgICAjIGluc3RydWN0aW9uLiAgcHlhc3NlbSB0cmVhdHMgU0VUX0xJTkVOTyBvcGNvZGVzIGFzIGEgc3BlY2lhbCBjYXNlLgorCisgICAgZGVmIHNldF9saW5lbm8oc2VsZiwgbm9kZSwgZm9yY2U9RmFsc2UpOgorICAgICAgICAiIiJFbWl0IFNFVF9MSU5FTk8gaWYgbmVjZXNzYXJ5LgorCisgICAgICAgIFRoZSBpbnN0cnVjdGlvbiBpcyBjb25zaWRlcmVkIG5lY2Vzc2FyeSBpZiB0aGUgbm9kZSBoYXMgYQorICAgICAgICBsaW5lbm8gYXR0cmlidXRlIGFuZCBpdCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgbGFzdCBsaW5lbm8KKyAgICAgICAgZW1pdHRlZC4KKworICAgICAgICBSZXR1cm5zIHRydWUgaWYgU0VUX0xJTkVOTyB3YXMgZW1pdHRlZC4KKworICAgICAgICBUaGVyZSBhcmUgbm8gcnVsZXMgZm9yIHdoZW4gYW4gQVNUIG5vZGUgc2hvdWxkIGhhdmUgYSBsaW5lbm8KKyAgICAgICAgYXR0cmlidXRlLiAgVGhlIHRyYW5zZm9ybWVyIGFuZCBBU1QgY29kZSBuZWVkIHRvIGJlIHJldmlld2VkCisgICAgICAgIGFuZCBhIGNvbnNpc3RlbnQgcG9saWN5IGltcGxlbWVudGVkIGFuZCBkb2N1bWVudGVkLiAgVW50aWwKKyAgICAgICAgdGhlbiwgdGhpcyBtZXRob2Qgd29ya3MgYXJvdW5kIG1pc3NpbmcgbGluZSBudW1iZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgbGluZW5vID0gZ2V0YXR0cihub2RlLCAnbGluZW5vJywgTm9uZSkKKyAgICAgICAgaWYgbGluZW5vIGlzIG5vdCBOb25lIGFuZCAobGluZW5vICE9IHNlbGYubGFzdF9saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZm9yY2UpOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdTRVRfTElORU5PJywgbGluZW5vKQorICAgICAgICAgICAgc2VsZi5sYXN0X2xpbmVubyA9IGxpbmVubworICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIFRoZSBmaXJzdCBmZXcgdmlzaXRvciBtZXRob2RzIGhhbmRsZSBub2RlcyB0aGF0IGdlbmVyYXRvciBuZXcKKyAgICAjIGNvZGUgb2JqZWN0cy4gIFRoZXkgdXNlIGNsYXNzIGF0dHJpYnV0ZXMgdG8gZGV0ZXJtaW5lIHdoYXQKKyAgICAjIHNwZWNpYWxpemVkIGNvZGUgZ2VuZXJhdG9ycyB0byB1c2UuCisKKyAgICBOYW1lRmluZGVyID0gTG9jYWxOYW1lRmluZGVyCisgICAgRnVuY3Rpb25HZW4gPSBOb25lCisgICAgQ2xhc3NHZW4gPSBOb25lCisKKyAgICBkZWYgdmlzaXRNb2R1bGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2NvcGVzID0gc2VsZi5wYXJzZVN5bWJvbHMobm9kZSkKKyAgICAgICAgc2VsZi5zY29wZSA9IHNlbGYuc2NvcGVzW25vZGVdCisgICAgICAgIHNlbGYuZW1pdCgnU0VUX0xJTkVOTycsIDApCisgICAgICAgIGlmIG5vZGUuZG9jOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgbm9kZS5kb2MpCisgICAgICAgICAgICBzZWxmLnN0b3JlTmFtZSgnX19kb2NfXycpCisgICAgICAgIGxuZiA9IHdhbGsobm9kZS5ub2RlLCBzZWxmLk5hbWVGaW5kZXIoKSwgdmVyYm9zZT0wKQorICAgICAgICBzZWxmLmxvY2Fscy5wdXNoKGxuZi5nZXRMb2NhbHMoKSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLm5vZGUpCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIE5vbmUpCisgICAgICAgIHNlbGYuZW1pdCgnUkVUVVJOX1ZBTFVFJykKKworICAgIGRlZiB2aXNpdEV4cHJlc3Npb24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLnNjb3BlcyA9IHNlbGYucGFyc2VTeW1ib2xzKG5vZGUpCisgICAgICAgIHNlbGYuc2NvcGUgPSBzZWxmLnNjb3Blc1tub2RlXQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUubm9kZSkKKyAgICAgICAgc2VsZi5lbWl0KCdSRVRVUk5fVkFMVUUnKQorCisgICAgZGVmIHZpc2l0RnVuY3Rpb24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuX3Zpc2l0RnVuY09yTGFtYmRhKG5vZGUsIGlzTGFtYmRhPTApCisgICAgICAgIGlmIG5vZGUuZG9jOgorICAgICAgICAgICAgc2VsZi5zZXREb2NzdHJpbmcobm9kZS5kb2MpCisgICAgICAgIHNlbGYuc3RvcmVOYW1lKG5vZGUubmFtZSkKKworICAgIGRlZiB2aXNpdExhbWJkYShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5fdmlzaXRGdW5jT3JMYW1iZGEobm9kZSwgaXNMYW1iZGE9MSkKKworICAgIGRlZiBfdmlzaXRGdW5jT3JMYW1iZGEoc2VsZiwgbm9kZSwgaXNMYW1iZGE9MCk6CisgICAgICAgIGlmIG5vdCBpc0xhbWJkYSBhbmQgbm9kZS5kZWNvcmF0b3JzOgorICAgICAgICAgICAgZm9yIGRlY29yYXRvciBpbiBub2RlLmRlY29yYXRvcnMubm9kZXM6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChkZWNvcmF0b3IpCisgICAgICAgICAgICBuZGVjb3JhdG9ycyA9IGxlbihub2RlLmRlY29yYXRvcnMubm9kZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZGVjb3JhdG9ycyA9IDAKKworICAgICAgICBnZW4gPSBzZWxmLkZ1bmN0aW9uR2VuKG5vZGUsIHNlbGYuc2NvcGVzLCBpc0xhbWJkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNsYXNzX25hbWUsIHNlbGYuZ2V0X21vZHVsZSgpKQorICAgICAgICB3YWxrKG5vZGUuY29kZSwgZ2VuKQorICAgICAgICBnZW4uZmluaXNoKCkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIGZvciBkZWZhdWx0IGluIG5vZGUuZGVmYXVsdHM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KGRlZmF1bHQpCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgbGVuKG5vZGUuZGVmYXVsdHMpKQorICAgICAgICBmb3IgaSBpbiByYW5nZShuZGVjb3JhdG9ycyk6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAxKQorCisgICAgZGVmIHZpc2l0Q2xhc3Moc2VsZiwgbm9kZSk6CisgICAgICAgIGdlbiA9IHNlbGYuQ2xhc3NHZW4obm9kZSwgc2VsZi5zY29wZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfbW9kdWxlKCkpCisgICAgICAgIHdhbGsobm9kZS5jb2RlLCBnZW4pCisgICAgICAgIGdlbi5maW5pc2goKQorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgbm9kZS5uYW1lKQorICAgICAgICBmb3IgYmFzZSBpbiBub2RlLmJhc2VzOgorICAgICAgICAgICAgc2VsZi52aXNpdChiYXNlKQorICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX1RVUExFJywgbGVuKG5vZGUuYmFzZXMpKQorICAgICAgICBzZWxmLl9tYWtlQ2xvc3VyZShnZW4sIDApCisgICAgICAgIHNlbGYuZW1pdCgnQ0FMTF9GVU5DVElPTicsIDApCisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfQ0xBU1MnKQorICAgICAgICBzZWxmLnN0b3JlTmFtZShub2RlLm5hbWUpCisKKyAgICAjIFRoZSByZXN0IGFyZSBzdGFuZGFyZCB2aXNpdG9yIG1ldGhvZHMKKworICAgICMgVGhlIG5leHQgZmV3IGltcGxlbWVudCBjb250cm9sLWZsb3cgc3RhdGVtZW50cworCisgICAgZGVmIHZpc2l0SWYoc2VsZiwgbm9kZSk6CisgICAgICAgIGVuZCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBudW10ZXN0cyA9IGxlbihub2RlLnRlc3RzKQorICAgICAgICBmb3IgaSBpbiByYW5nZShudW10ZXN0cyk6CisgICAgICAgICAgICB0ZXN0LCBzdWl0ZSA9IG5vZGUudGVzdHNbaV0KKyAgICAgICAgICAgIGlmIGlzX2NvbnN0YW50X2ZhbHNlKHRlc3QpOgorICAgICAgICAgICAgICAgICMgWFhYIHdpbGwgbmVlZCB0byBjaGVjayBnZW5lcmF0b3Igc3R1ZmYgaGVyZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLnNldF9saW5lbm8odGVzdCkKKyAgICAgICAgICAgIHNlbGYudmlzaXQodGVzdCkKKyAgICAgICAgICAgIG5leHRUZXN0ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ1BPUF9KVU1QX0lGX0ZBTFNFJywgbmV4dFRlc3QpCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgICAgICBzZWxmLnZpc2l0KHN1aXRlKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0ZPUldBUkQnLCBlbmQpCisgICAgICAgICAgICBzZWxmLnN0YXJ0QmxvY2sobmV4dFRlc3QpCisgICAgICAgIGlmIG5vZGUuZWxzZV86CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZWxzZV8pCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGVuZCkKKworICAgIGRlZiB2aXNpdFdoaWxlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKworICAgICAgICBsb29wID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGVsc2VfID0gc2VsZi5uZXdCbG9jaygpCisKKyAgICAgICAgYWZ0ZXIgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgc2VsZi5lbWl0KCdTRVRVUF9MT09QJywgYWZ0ZXIpCisKKyAgICAgICAgc2VsZi5uZXh0QmxvY2sobG9vcCkKKyAgICAgICAgc2VsZi5zZXR1cHMucHVzaCgoTE9PUCwgbG9vcCkpCisKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUsIGZvcmNlPVRydWUpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS50ZXN0KQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9KVU1QX0lGX0ZBTFNFJywgZWxzZV8gb3IgYWZ0ZXIpCisKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYm9keSkKKyAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0FCU09MVVRFJywgbG9vcCkKKworICAgICAgICBzZWxmLnN0YXJ0QmxvY2soZWxzZV8pICMgb3IganVzdCB0aGUgUE9QcyBpZiBub3QgZWxzZSBjbGF1c2UKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfQkxPQ0snKQorICAgICAgICBzZWxmLnNldHVwcy5wb3AoKQorICAgICAgICBpZiBub2RlLmVsc2VfOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmVsc2VfKQorICAgICAgICBzZWxmLm5leHRCbG9jayhhZnRlcikKKworICAgIGRlZiB2aXNpdEZvcihzZWxmLCBub2RlKToKKyAgICAgICAgc3RhcnQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgYW5jaG9yID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGFmdGVyID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIHNlbGYuc2V0dXBzLnB1c2goKExPT1AsIHN0YXJ0KSkKKworICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5lbWl0KCdTRVRVUF9MT09QJywgYWZ0ZXIpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5saXN0KQorICAgICAgICBzZWxmLmVtaXQoJ0dFVF9JVEVSJykKKworICAgICAgICBzZWxmLm5leHRCbG9jayhzdGFydCkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUsIGZvcmNlPTEpCisgICAgICAgIHNlbGYuZW1pdCgnRk9SX0lURVInLCBhbmNob3IpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5hc3NpZ24pCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ib2R5KQorICAgICAgICBzZWxmLmVtaXQoJ0pVTVBfQUJTT0xVVEUnLCBzdGFydCkKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soYW5jaG9yKQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9CTE9DSycpCisgICAgICAgIHNlbGYuc2V0dXBzLnBvcCgpCisgICAgICAgIGlmIG5vZGUuZWxzZV86CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZWxzZV8pCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGFmdGVyKQorCisgICAgZGVmIHZpc2l0QnJlYWsoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLnNldHVwczoKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiJ2JyZWFrJyBvdXRzaWRlIGxvb3AgKCVzLCAlZCkiICUgXAorICAgICAgICAgICAgICAgICAgKG5vZGUuZmlsZW5hbWUsIG5vZGUubGluZW5vKQorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5lbWl0KCdCUkVBS19MT09QJykKKworICAgIGRlZiB2aXNpdENvbnRpbnVlKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub3Qgc2VsZi5zZXR1cHM6CisgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgIidjb250aW51ZScgb3V0c2lkZSBsb29wICglcywgJWQpIiAlIFwKKyAgICAgICAgICAgICAgICAgIChub2RlLmZpbGVuYW1lLCBub2RlLmxpbmVubykKKyAgICAgICAga2luZCwgYmxvY2sgPSBzZWxmLnNldHVwcy50b3AoKQorICAgICAgICBpZiBraW5kID09IExPT1A6CisgICAgICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9BQlNPTFVURScsIGJsb2NrKQorICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICBlbGlmIGtpbmQgPT0gRVhDRVBUIG9yIGtpbmQgPT0gVFJZX0ZJTkFMTFk6CisgICAgICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgICAgICMgZmluZCB0aGUgYmxvY2sgdGhhdCBzdGFydHMgdGhlIGxvb3AKKyAgICAgICAgICAgIHRvcCA9IGxlbihzZWxmLnNldHVwcykKKyAgICAgICAgICAgIHdoaWxlIHRvcCA+IDA6CisgICAgICAgICAgICAgICAgdG9wID0gdG9wIC0gMQorICAgICAgICAgICAgICAgIGtpbmQsIGxvb3BfYmxvY2sgPSBzZWxmLnNldHVwc1t0b3BdCisgICAgICAgICAgICAgICAgaWYga2luZCA9PSBMT09QOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYga2luZCAhPSBMT09QOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiJ2NvbnRpbnVlJyBvdXRzaWRlIGxvb3AgKCVzLCAlZCkiICUgXAorICAgICAgICAgICAgICAgICAgICAgIChub2RlLmZpbGVuYW1lLCBub2RlLmxpbmVubykKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnQ09OVElOVUVfTE9PUCcsIGxvb3BfYmxvY2spCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgIGVsaWYga2luZCA9PSBFTkRfRklOQUxMWToKKyAgICAgICAgICAgIG1zZyA9ICInY29udGludWUnIG5vdCBhbGxvd2VkIGluc2lkZSAnZmluYWxseScgY2xhdXNlICglcywgJWQpIgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsIG1zZyAlIChub2RlLmZpbGVuYW1lLCBub2RlLmxpbmVubykKKworICAgIGRlZiB2aXNpdFRlc3Qoc2VsZiwgbm9kZSwganVtcCk6CisgICAgICAgIGVuZCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5ub2Rlc1s6LTFdOgorICAgICAgICAgICAgc2VsZi52aXNpdChjaGlsZCkKKyAgICAgICAgICAgIHNlbGYuZW1pdChqdW1wLCBlbmQpCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ub2Rlc1stMV0pCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGVuZCkKKworICAgIGRlZiB2aXNpdEFuZChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdFRlc3Qobm9kZSwgJ0pVTVBfSUZfRkFMU0VfT1JfUE9QJykKKworICAgIGRlZiB2aXNpdE9yKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnZpc2l0VGVzdChub2RlLCAnSlVNUF9JRl9UUlVFX09SX1BPUCcpCisKKyAgICBkZWYgdmlzaXRJZkV4cChzZWxmLCBub2RlKToKKyAgICAgICAgZW5kYmxvY2sgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgZWxzZWJsb2NrID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS50ZXN0KQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9KVU1QX0lGX0ZBTFNFJywgZWxzZWJsb2NrKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGhlbikKKyAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0ZPUldBUkQnLCBlbmRibG9jaykKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soZWxzZWJsb2NrKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZWxzZV8pCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGVuZGJsb2NrKQorCisgICAgZGVmIHZpc2l0Q29tcGFyZShzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIGNsZWFudXAgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgZm9yIG9wLCBjb2RlIGluIG5vZGUub3BzWzotMV06CisgICAgICAgICAgICBzZWxmLnZpc2l0KGNvZGUpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfVEhSRUUnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdDT01QQVJFX09QJywgb3ApCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0pVTVBfSUZfRkFMU0VfT1JfUE9QJywgY2xlYW51cCkKKyAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgIyBub3cgZG8gdGhlIGxhc3QgY29tcGFyaXNvbgorICAgICAgICBpZiBub2RlLm9wczoKKyAgICAgICAgICAgIG9wLCBjb2RlID0gbm9kZS5vcHNbLTFdCisgICAgICAgICAgICBzZWxmLnZpc2l0KGNvZGUpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0NPTVBBUkVfT1AnLCBvcCkKKyAgICAgICAgaWYgbGVuKG5vZGUub3BzKSA+IDE6CisgICAgICAgICAgICBlbmQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9GT1JXQVJEJywgZW5kKQorICAgICAgICAgICAgc2VsZi5zdGFydEJsb2NrKGNsZWFudXApCisgICAgICAgICAgICBzZWxmLmVtaXQoJ1JPVF9UV08nKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdQT1BfVE9QJykKKyAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKGVuZCkKKworICAgICMgbGlzdCBjb21wcmVoZW5zaW9ucworICAgIGRlZiB2aXNpdExpc3RDb21wKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgIyBzZXR1cCBsaXN0CisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfTElTVCcsIDApCisKKyAgICAgICAgc3RhY2sgPSBbXQorICAgICAgICBmb3IgaSwgZm9yXyBpbiB6aXAocmFuZ2UobGVuKG5vZGUucXVhbHMpKSwgbm9kZS5xdWFscyk6CisgICAgICAgICAgICBzdGFydCwgYW5jaG9yID0gc2VsZi52aXNpdChmb3JfKQorICAgICAgICAgICAgY29udCA9IE5vbmUKKyAgICAgICAgICAgIGZvciBpZl8gaW4gZm9yXy5pZnM6CisgICAgICAgICAgICAgICAgaWYgY29udCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBjb250ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChpZl8sIGNvbnQpCisgICAgICAgICAgICBzdGFjay5pbnNlcnQoMCwgKHN0YXJ0LCBjb250LCBhbmNob3IpKQorCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBzZWxmLmVtaXQoJ0xJU1RfQVBQRU5EJywgbGVuKG5vZGUucXVhbHMpICsgMSkKKworICAgICAgICBmb3Igc3RhcnQsIGNvbnQsIGFuY2hvciBpbiBzdGFjazoKKyAgICAgICAgICAgIGlmIGNvbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soY29udCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9BQlNPTFVURScsIHN0YXJ0KQorICAgICAgICAgICAgc2VsZi5zdGFydEJsb2NrKGFuY2hvcikKKworICAgIGRlZiB2aXNpdFNldENvbXAoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICAjIHNldHVwIGxpc3QKKyAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9TRVQnLCAwKQorCisgICAgICAgIHN0YWNrID0gW10KKyAgICAgICAgZm9yIGksIGZvcl8gaW4gemlwKHJhbmdlKGxlbihub2RlLnF1YWxzKSksIG5vZGUucXVhbHMpOgorICAgICAgICAgICAgc3RhcnQsIGFuY2hvciA9IHNlbGYudmlzaXQoZm9yXykKKyAgICAgICAgICAgIGNvbnQgPSBOb25lCisgICAgICAgICAgICBmb3IgaWZfIGluIGZvcl8uaWZzOgorICAgICAgICAgICAgICAgIGlmIGNvbnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29udCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICAgICAgICAgIHNlbGYudmlzaXQoaWZfLCBjb250KQorICAgICAgICAgICAgc3RhY2suaW5zZXJ0KDAsIChzdGFydCwgY29udCwgYW5jaG9yKSkKKworICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgc2VsZi5lbWl0KCdTRVRfQUREJywgbGVuKG5vZGUucXVhbHMpICsgMSkKKworICAgICAgICBmb3Igc3RhcnQsIGNvbnQsIGFuY2hvciBpbiBzdGFjazoKKyAgICAgICAgICAgIGlmIGNvbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soY29udCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9BQlNPTFVURScsIHN0YXJ0KQorICAgICAgICAgICAgc2VsZi5zdGFydEJsb2NrKGFuY2hvcikKKworICAgIGRlZiB2aXNpdERpY3RDb21wKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgIyBzZXR1cCBsaXN0CisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfTUFQJywgMCkKKworICAgICAgICBzdGFjayA9IFtdCisgICAgICAgIGZvciBpLCBmb3JfIGluIHppcChyYW5nZShsZW4obm9kZS5xdWFscykpLCBub2RlLnF1YWxzKToKKyAgICAgICAgICAgIHN0YXJ0LCBhbmNob3IgPSBzZWxmLnZpc2l0KGZvcl8pCisgICAgICAgICAgICBjb250ID0gTm9uZQorICAgICAgICAgICAgZm9yIGlmXyBpbiBmb3JfLmlmczoKKyAgICAgICAgICAgICAgICBpZiBjb250IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KGlmXywgY29udCkKKyAgICAgICAgICAgIHN0YWNrLmluc2VydCgwLCAoc3RhcnQsIGNvbnQsIGFuY2hvcikpCisKKyAgICAgICAgc2VsZi52aXNpdChub2RlLnZhbHVlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUua2V5KQorICAgICAgICBzZWxmLmVtaXQoJ01BUF9BREQnLCBsZW4obm9kZS5xdWFscykgKyAxKQorCisgICAgICAgIGZvciBzdGFydCwgY29udCwgYW5jaG9yIGluIHN0YWNrOgorICAgICAgICAgICAgaWYgY29udDoKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRCbG9jayhjb250KQorICAgICAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0FCU09MVVRFJywgc3RhcnQpCisgICAgICAgICAgICBzZWxmLnN0YXJ0QmxvY2soYW5jaG9yKQorCisgICAgZGVmIHZpc2l0TGlzdENvbXBGb3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHN0YXJ0ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGFuY2hvciA9IHNlbGYubmV3QmxvY2soKQorCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5saXN0KQorICAgICAgICBzZWxmLmVtaXQoJ0dFVF9JVEVSJykKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soc3RhcnQpCisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlLCBmb3JjZT1UcnVlKQorICAgICAgICBzZWxmLmVtaXQoJ0ZPUl9JVEVSJywgYW5jaG9yKQorICAgICAgICBzZWxmLm5leHRCbG9jaygpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5hc3NpZ24pCisgICAgICAgIHJldHVybiBzdGFydCwgYW5jaG9yCisKKyAgICBkZWYgdmlzaXRMaXN0Q29tcElmKHNlbGYsIG5vZGUsIGJyYW5jaCk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlLCBmb3JjZT1UcnVlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCkKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfSlVNUF9JRl9GQUxTRScsIGJyYW5jaCkKKyAgICAgICAgc2VsZi5uZXdCbG9jaygpCisKKyAgICBkZWYgX21ha2VDbG9zdXJlKHNlbGYsIGdlbiwgYXJncyk6CisgICAgICAgIGZyZWVzID0gZ2VuLnNjb3BlLmdldF9mcmVlX3ZhcnMoKQorICAgICAgICBpZiBmcmVlczoKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZyZWVzOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DTE9TVVJFJywgbmFtZSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfVFVQTEUnLCBsZW4oZnJlZXMpKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdNQUtFX0NMT1NVUkUnLCBhcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdNQUtFX0ZVTkNUSU9OJywgYXJncykKKworICAgIGRlZiB2aXNpdEdlbkV4cHIoc2VsZiwgbm9kZSk6CisgICAgICAgIGdlbiA9IEdlbkV4cHJDb2RlR2VuZXJhdG9yKG5vZGUsIHNlbGYuc2NvcGVzLCBzZWxmLmNsYXNzX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X21vZHVsZSgpKQorICAgICAgICB3YWxrKG5vZGUuY29kZSwgZ2VuKQorICAgICAgICBnZW4uZmluaXNoKCkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgMCkKKyAgICAgICAgIyBwcmVjb21wdXRhdGlvbiBvZiBvdXRtb3N0IGl0ZXJhYmxlCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5jb2RlLnF1YWxzWzBdLml0ZXIpCisgICAgICAgIHNlbGYuZW1pdCgnR0VUX0lURVInKQorICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAxKQorCisgICAgZGVmIHZpc2l0R2VuRXhwcklubmVyKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgIyBzZXR1cCBsaXN0CisKKyAgICAgICAgc3RhY2sgPSBbXQorICAgICAgICBmb3IgaSwgZm9yXyBpbiB6aXAocmFuZ2UobGVuKG5vZGUucXVhbHMpKSwgbm9kZS5xdWFscyk6CisgICAgICAgICAgICBzdGFydCwgYW5jaG9yLCBlbmQgPSBzZWxmLnZpc2l0KGZvcl8pCisgICAgICAgICAgICBjb250ID0gTm9uZQorICAgICAgICAgICAgZm9yIGlmXyBpbiBmb3JfLmlmczoKKyAgICAgICAgICAgICAgICBpZiBjb250IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGNvbnQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KGlmXywgY29udCkKKyAgICAgICAgICAgIHN0YWNrLmluc2VydCgwLCAoc3RhcnQsIGNvbnQsIGFuY2hvciwgZW5kKSkKKworICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgc2VsZi5lbWl0KCdZSUVMRF9WQUxVRScpCisgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisKKyAgICAgICAgZm9yIHN0YXJ0LCBjb250LCBhbmNob3IsIGVuZCBpbiBzdGFjazoKKyAgICAgICAgICAgIGlmIGNvbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soY29udCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnSlVNUF9BQlNPTFVURScsIHN0YXJ0KQorICAgICAgICAgICAgc2VsZi5zdGFydEJsb2NrKGFuY2hvcikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX0JMT0NLJykKKyAgICAgICAgICAgIHNlbGYuc2V0dXBzLnBvcCgpCisgICAgICAgICAgICBzZWxmLm5leHRCbG9jayhlbmQpCisKKyAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgTm9uZSkKKworICAgIGRlZiB2aXNpdEdlbkV4cHJGb3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHN0YXJ0ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGFuY2hvciA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBlbmQgPSBzZWxmLm5ld0Jsb2NrKCkKKworICAgICAgICBzZWxmLnNldHVwcy5wdXNoKChMT09QLCBzdGFydCkpCisgICAgICAgIHNlbGYuZW1pdCgnU0VUVVBfTE9PUCcsIGVuZCkKKworICAgICAgICBpZiBub2RlLmlzX291dG1vc3Q6CisgICAgICAgICAgICBzZWxmLmxvYWROYW1lKCcuMCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuaXRlcikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnR0VUX0lURVInKQorCisgICAgICAgIHNlbGYubmV4dEJsb2NrKHN0YXJ0KQorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSwgZm9yY2U9VHJ1ZSkKKyAgICAgICAgc2VsZi5lbWl0KCdGT1JfSVRFUicsIGFuY2hvcikKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuYXNzaWduKQorICAgICAgICByZXR1cm4gc3RhcnQsIGFuY2hvciwgZW5kCisKKyAgICBkZWYgdmlzaXRHZW5FeHBySWYoc2VsZiwgbm9kZSwgYnJhbmNoKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUsIGZvcmNlPVRydWUpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS50ZXN0KQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9KVU1QX0lGX0ZBTFNFJywgYnJhbmNoKQorICAgICAgICBzZWxmLm5ld0Jsb2NrKCkKKworICAgICMgZXhjZXB0aW9uIHJlbGF0ZWQKKworICAgIGRlZiB2aXNpdEFzc2VydChzZWxmLCBub2RlKToKKyAgICAgICAgIyBYWFggd291bGQgYmUgaW50ZXJlc3RpbmcgdG8gaW1wbGVtZW50IHRoaXMgdmlhIGEKKyAgICAgICAgIyB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgQVNUIGJlZm9yZSB0aGlzIHN0YWdlCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGVuZCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgICAgICAjIFhYWCBBc3NlcnRpb25FcnJvciBhcHBlYXJzIHRvIGJlIHNwZWNpYWwgY2FzZSAtLSBpdCBpcyBhbHdheXMKKyAgICAgICAgICAgICMgbG9hZGVkIGFzIGEgZ2xvYmFsIGV2ZW4gaWYgdGhlcmUgaXMgYSBsb2NhbCBuYW1lLiAgSSBndWVzcyB0aGlzCisgICAgICAgICAgICAjIGlzIGEgc29ydCBvZiByZW5hbWluZyBvcC4KKyAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS50ZXN0KQorICAgICAgICAgICAgc2VsZi5lbWl0KCdQT1BfSlVNUF9JRl9UUlVFJywgZW5kKQorICAgICAgICAgICAgc2VsZi5uZXh0QmxvY2soKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0dMT0JBTCcsICdBc3NlcnRpb25FcnJvcicpCisgICAgICAgICAgICBpZiBub2RlLmZhaWw6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmZhaWwpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdSQUlTRV9WQVJBUkdTJywgMikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdSQUlTRV9WQVJBUkdTJywgMSkKKyAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKGVuZCkKKworICAgIGRlZiB2aXNpdFJhaXNlKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgbiA9IDAKKyAgICAgICAgaWYgbm9kZS5leHByMToKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByMSkKKyAgICAgICAgICAgIG4gPSBuICsgMQorICAgICAgICBpZiBub2RlLmV4cHIyOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIyKQorICAgICAgICAgICAgbiA9IG4gKyAxCisgICAgICAgIGlmIG5vZGUuZXhwcjM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcjMpCisgICAgICAgICAgICBuID0gbiArIDEKKyAgICAgICAgc2VsZi5lbWl0KCdSQUlTRV9WQVJBUkdTJywgbikKKworICAgIGRlZiB2aXNpdFRyeUV4Y2VwdChzZWxmLCBub2RlKToKKyAgICAgICAgYm9keSA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBoYW5kbGVycyA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBlbmQgPSBzZWxmLm5ld0Jsb2NrKCkKKyAgICAgICAgaWYgbm9kZS5lbHNlXzoKKyAgICAgICAgICAgIGxFbHNlID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsRWxzZSA9IGVuZAorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5lbWl0KCdTRVRVUF9FWENFUFQnLCBoYW5kbGVycykKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soYm9keSkKKyAgICAgICAgc2VsZi5zZXR1cHMucHVzaCgoRVhDRVBULCBib2R5KSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmJvZHkpCisgICAgICAgIHNlbGYuZW1pdCgnUE9QX0JMT0NLJykKKyAgICAgICAgc2VsZi5zZXR1cHMucG9wKCkKKyAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0ZPUldBUkQnLCBsRWxzZSkKKyAgICAgICAgc2VsZi5zdGFydEJsb2NrKGhhbmRsZXJzKQorCisgICAgICAgIGxhc3QgPSBsZW4obm9kZS5oYW5kbGVycykgLSAxCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihub2RlLmhhbmRsZXJzKSk6CisgICAgICAgICAgICBleHByLCB0YXJnZXQsIGJvZHkgPSBub2RlLmhhbmRsZXJzW2ldCisgICAgICAgICAgICBzZWxmLnNldF9saW5lbm8oZXhwcikKKyAgICAgICAgICAgIGlmIGV4cHI6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgICAgICAgICBzZWxmLnZpc2l0KGV4cHIpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdDT01QQVJFX09QJywgJ2V4Y2VwdGlvbiBtYXRjaCcpCisgICAgICAgICAgICAgICAgbmV4dCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX0pVTVBfSUZfRkFMU0UnLCBuZXh0KQorICAgICAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisgICAgICAgICAgICBpZiB0YXJnZXQ6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdCh0YXJnZXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQorICAgICAgICAgICAgc2VsZi52aXNpdChib2R5KQorICAgICAgICAgICAgc2VsZi5lbWl0KCdKVU1QX0ZPUldBUkQnLCBlbmQpCisgICAgICAgICAgICBpZiBleHByOgorICAgICAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKG5leHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubmV4dEJsb2NrKCkKKyAgICAgICAgc2VsZi5lbWl0KCdFTkRfRklOQUxMWScpCisgICAgICAgIGlmIG5vZGUuZWxzZV86CisgICAgICAgICAgICBzZWxmLm5leHRCbG9jayhsRWxzZSkKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5lbHNlXykKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soZW5kKQorCisgICAgZGVmIHZpc2l0VHJ5RmluYWxseShzZWxmLCBub2RlKToKKyAgICAgICAgYm9keSA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBmaW5hbCA9IHNlbGYubmV3QmxvY2soKQorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi5lbWl0KCdTRVRVUF9GSU5BTExZJywgZmluYWwpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGJvZHkpCisgICAgICAgIHNlbGYuc2V0dXBzLnB1c2goKFRSWV9GSU5BTExZLCBib2R5KSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmJvZHkpCisgICAgICAgIHNlbGYuZW1pdCgnUE9QX0JMT0NLJykKKyAgICAgICAgc2VsZi5zZXR1cHMucG9wKCkKKyAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgTm9uZSkKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soZmluYWwpCisgICAgICAgIHNlbGYuc2V0dXBzLnB1c2goKEVORF9GSU5BTExZLCBmaW5hbCkpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5maW5hbCkKKyAgICAgICAgc2VsZi5lbWl0KCdFTkRfRklOQUxMWScpCisgICAgICAgIHNlbGYuc2V0dXBzLnBvcCgpCisKKyAgICBfX3dpdGhfY291bnQgPSAwCisKKyAgICBkZWYgdmlzaXRXaXRoKHNlbGYsIG5vZGUpOgorICAgICAgICBib2R5ID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIGZpbmFsID0gc2VsZi5uZXdCbG9jaygpCisgICAgICAgIHNlbGYuX193aXRoX2NvdW50ICs9IDEKKyAgICAgICAgdmFsdWV2YXIgPSAiX1slZF0iICUgc2VsZi5fX3dpdGhfY291bnQKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQVRUUicsICdfX2V4aXRfXycpCisgICAgICAgIHNlbGYuZW1pdCgnUk9UX1RXTycpCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9BVFRSJywgJ19fZW50ZXJfXycpCisgICAgICAgIHNlbGYuZW1pdCgnQ0FMTF9GVU5DVElPTicsIDApCisgICAgICAgIGlmIG5vZGUudmFycyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdQT1BfVE9QJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2ltcGxpY2l0TmFtZU9wKCdTVE9SRScsIHZhbHVldmFyKQorICAgICAgICBzZWxmLmVtaXQoJ1NFVFVQX0ZJTkFMTFknLCBmaW5hbCkKKyAgICAgICAgc2VsZi5uZXh0QmxvY2soYm9keSkKKyAgICAgICAgc2VsZi5zZXR1cHMucHVzaCgoVFJZX0ZJTkFMTFksIGJvZHkpKQorICAgICAgICBpZiBub2RlLnZhcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9pbXBsaWNpdE5hbWVPcCgnTE9BRCcsIHZhbHVldmFyKQorICAgICAgICAgICAgc2VsZi5faW1wbGljaXROYW1lT3AoJ0RFTEVURScsIHZhbHVldmFyKQorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLnZhcnMpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5ib2R5KQorICAgICAgICBzZWxmLmVtaXQoJ1BPUF9CTE9DSycpCisgICAgICAgIHNlbGYuc2V0dXBzLnBvcCgpCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIE5vbmUpCisgICAgICAgIHNlbGYubmV4dEJsb2NrKGZpbmFsKQorICAgICAgICBzZWxmLnNldHVwcy5wdXNoKChFTkRfRklOQUxMWSwgZmluYWwpKQorICAgICAgICBzZWxmLmVtaXQoJ1dJVEhfQ0xFQU5VUCcpCisgICAgICAgIHNlbGYuZW1pdCgnRU5EX0ZJTkFMTFknKQorICAgICAgICBzZWxmLnNldHVwcy5wb3AoKQorICAgICAgICBzZWxmLl9fd2l0aF9jb3VudCAtPSAxCisKKyAgICAjIG1pc2MKKworICAgIGRlZiB2aXNpdERpc2NhcmQoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfVE9QJykKKworICAgIGRlZiB2aXNpdENvbnN0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBub2RlLnZhbHVlKQorCisgICAgZGVmIHZpc2l0S2V5d29yZChzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgbm9kZS5uYW1lKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKworICAgIGRlZiB2aXNpdEdsb2JhbChzZWxmLCBub2RlKToKKyAgICAgICAgIyBubyBjb2RlIHRvIGdlbmVyYXRlCisgICAgICAgIHBhc3MKKworICAgIGRlZiB2aXNpdE5hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLmxvYWROYW1lKG5vZGUubmFtZSkKKworICAgIGRlZiB2aXNpdFBhc3Moc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorCisgICAgZGVmIHZpc2l0SW1wb3J0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgbGV2ZWwgPSAwIGlmIHNlbGYuZ3JhcGguY2hlY2tGbGFnKENPX0ZVVFVSRV9BQlNJTVBPUlQpIGVsc2UgLTEKKyAgICAgICAgZm9yIG5hbWUsIGFsaWFzIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBpZiBWRVJTSU9OID4gMToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBsZXZlbCkKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBOb25lKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdJTVBPUlRfTkFNRScsIG5hbWUpCisgICAgICAgICAgICBtb2QgPSBuYW1lLnNwbGl0KCIuIilbMF0KKyAgICAgICAgICAgIGlmIGFsaWFzOgorICAgICAgICAgICAgICAgIHNlbGYuX3Jlc29sdmVEb3RzKG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5zdG9yZU5hbWUoYWxpYXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RvcmVOYW1lKG1vZCkKKworICAgIGRlZiB2aXNpdEZyb20oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBsZXZlbCA9IG5vZGUubGV2ZWwKKyAgICAgICAgaWYgbGV2ZWwgPT0gMCBhbmQgbm90IHNlbGYuZ3JhcGguY2hlY2tGbGFnKENPX0ZVVFVSRV9BQlNJTVBPUlQpOgorICAgICAgICAgICAgbGV2ZWwgPSAtMQorICAgICAgICBmcm9tbGlzdCA9IHR1cGxlKG5hbWUgZm9yIChuYW1lLCBhbGlhcykgaW4gbm9kZS5uYW1lcykKKyAgICAgICAgaWYgVkVSU0lPTiA+IDE6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBsZXZlbCkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGZyb21saXN0KQorICAgICAgICBzZWxmLmVtaXQoJ0lNUE9SVF9OQU1FJywgbm9kZS5tb2RuYW1lKQorICAgICAgICBmb3IgbmFtZSwgYWxpYXMgaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIGlmIFZFUlNJT04gPiAxOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gJyonOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWVzcGFjZSA9IDAKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdJTVBPUlRfU1RBUicpCisgICAgICAgICAgICAgICAgICAgICMgVGhlcmUgY2FuIG9ubHkgYmUgb25lIG5hbWUgdy8gZnJvbSAuLi4gaW1wb3J0ICoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihub2RlLm5hbWVzKSA9PSAxCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnSU1QT1JUX0ZST00nLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXNvbHZlRG90cyhuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0b3JlTmFtZShhbGlhcyBvciBuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0lNUE9SVF9GUk9NJywgbmFtZSkKKyAgICAgICAgc2VsZi5lbWl0KCdQT1BfVE9QJykKKworICAgIGRlZiBfcmVzb2x2ZURvdHMoc2VsZiwgbmFtZSk6CisgICAgICAgIGVsdHMgPSBuYW1lLnNwbGl0KCIuIikKKyAgICAgICAgaWYgbGVuKGVsdHMpID09IDE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIGVsdCBpbiBlbHRzWzE6XToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9BVFRSJywgZWx0KQorCisgICAgZGVmIHZpc2l0R2V0YXR0cihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9BVFRSJywgc2VsZi5tYW5nbGUobm9kZS5hdHRybmFtZSkpCisKKyAgICAjIG5leHQgZml2ZSBpbXBsZW1lbnQgYXNzaWdubWVudHMKKworICAgIGRlZiB2aXNpdEFzc2lnbihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBkdXBzID0gbGVuKG5vZGUubm9kZXMpIC0gMQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obm9kZS5ub2RlcykpOgorICAgICAgICAgICAgZWx0ID0gbm9kZS5ub2Rlc1tpXQorICAgICAgICAgICAgaWYgaSA8IGR1cHM6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdEVVBfVE9QJykKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZWx0LCBhc3QuTm9kZSk6CisgICAgICAgICAgICAgICAgc2VsZi52aXNpdChlbHQpCisKKyAgICBkZWYgdmlzaXRBc3NOYW1lKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub2RlLmZsYWdzID09ICdPUF9BU1NJR04nOgorICAgICAgICAgICAgc2VsZi5zdG9yZU5hbWUobm9kZS5uYW1lKQorICAgICAgICBlbGlmIG5vZGUuZmxhZ3MgPT0gJ09QX0RFTEVURSc6CisgICAgICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgICAgIHNlbGYuZGVsTmFtZShub2RlLm5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAib29wcyIsIG5vZGUuZmxhZ3MKKworICAgIGRlZiB2aXNpdEFzc0F0dHIoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByKQorICAgICAgICBpZiBub2RlLmZsYWdzID09ICdPUF9BU1NJR04nOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdTVE9SRV9BVFRSJywgc2VsZi5tYW5nbGUobm9kZS5hdHRybmFtZSkpCisgICAgICAgIGVsaWYgbm9kZS5mbGFncyA9PSAnT1BfREVMRVRFJzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnREVMRVRFX0FUVFInLCBzZWxmLm1hbmdsZShub2RlLmF0dHJuYW1lKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJ3YXJuaW5nOiB1bmV4cGVjdGVkIGZsYWdzOiIsIG5vZGUuZmxhZ3MKKyAgICAgICAgICAgIHByaW50IG5vZGUKKworICAgIGRlZiBfdmlzaXRBc3NTZXF1ZW5jZShzZWxmLCBub2RlLCBvcD0nVU5QQUNLX1NFUVVFTkNFJyk6CisgICAgICAgIGlmIGZpbmRPcChub2RlKSAhPSAnT1BfREVMRVRFJzoKKyAgICAgICAgICAgIHNlbGYuZW1pdChvcCwgbGVuKG5vZGUubm9kZXMpKQorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5ub2RlczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQoY2hpbGQpCisKKyAgICBpZiBWRVJTSU9OID4gMToKKyAgICAgICAgdmlzaXRBc3NUdXBsZSA9IF92aXNpdEFzc1NlcXVlbmNlCisgICAgICAgIHZpc2l0QXNzTGlzdCA9IF92aXNpdEFzc1NlcXVlbmNlCisgICAgZWxzZToKKyAgICAgICAgZGVmIHZpc2l0QXNzVHVwbGUoc2VsZiwgbm9kZSk6CisgICAgICAgICAgICBzZWxmLl92aXNpdEFzc1NlcXVlbmNlKG5vZGUsICdVTlBBQ0tfVFVQTEUnKQorCisgICAgICAgIGRlZiB2aXNpdEFzc0xpc3Qoc2VsZiwgbm9kZSk6CisgICAgICAgICAgICBzZWxmLl92aXNpdEFzc1NlcXVlbmNlKG5vZGUsICdVTlBBQ0tfTElTVCcpCisKKyAgICAjIGF1Z21lbnRlZCBhc3NpZ25tZW50CisKKyAgICBkZWYgdmlzaXRBdWdBc3NpZ24oc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBhdWdfbm9kZSA9IHdyYXBfYXVnKG5vZGUubm9kZSkKKyAgICAgICAgc2VsZi52aXNpdChhdWdfbm9kZSwgImxvYWQiKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgc2VsZi5lbWl0KHNlbGYuX2F1Z21lbnRlZF9vcGNvZGVbbm9kZS5vcF0pCisgICAgICAgIHNlbGYudmlzaXQoYXVnX25vZGUsICJzdG9yZSIpCisKKyAgICBfYXVnbWVudGVkX29wY29kZSA9IHsKKyAgICAgICAgJys9JyA6ICdJTlBMQUNFX0FERCcsCisgICAgICAgICctPScgOiAnSU5QTEFDRV9TVUJUUkFDVCcsCisgICAgICAgICcqPScgOiAnSU5QTEFDRV9NVUxUSVBMWScsCisgICAgICAgICcvPScgOiAnSU5QTEFDRV9ESVZJREUnLAorICAgICAgICAnLy89JzogJ0lOUExBQ0VfRkxPT1JfRElWSURFJywKKyAgICAgICAgJyU9JyA6ICdJTlBMQUNFX01PRFVMTycsCisgICAgICAgICcqKj0nOiAnSU5QTEFDRV9QT1dFUicsCisgICAgICAgICc+Pj0nOiAnSU5QTEFDRV9SU0hJRlQnLAorICAgICAgICAnPDw9JzogJ0lOUExBQ0VfTFNISUZUJywKKyAgICAgICAgJyY9JyA6ICdJTlBMQUNFX0FORCcsCisgICAgICAgICdePScgOiAnSU5QTEFDRV9YT1InLAorICAgICAgICAnfD0nIDogJ0lOUExBQ0VfT1InLAorICAgICAgICB9CisKKyAgICBkZWYgdmlzaXRBdWdOYW1lKHNlbGYsIG5vZGUsIG1vZGUpOgorICAgICAgICBpZiBtb2RlID09ICJsb2FkIjoKKyAgICAgICAgICAgIHNlbGYubG9hZE5hbWUobm9kZS5uYW1lKQorICAgICAgICBlbGlmIG1vZGUgPT0gInN0b3JlIjoKKyAgICAgICAgICAgIHNlbGYuc3RvcmVOYW1lKG5vZGUubmFtZSkKKworICAgIGRlZiB2aXNpdEF1Z0dldGF0dHIoc2VsZiwgbm9kZSwgbW9kZSk6CisgICAgICAgIGlmIG1vZGUgPT0gImxvYWQiOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0FUVFInLCBzZWxmLm1hbmdsZShub2RlLmF0dHJuYW1lKSkKKyAgICAgICAgZWxpZiBtb2RlID09ICJzdG9yZSI6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ1JPVF9UV08nKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdTVE9SRV9BVFRSJywgc2VsZi5tYW5nbGUobm9kZS5hdHRybmFtZSkpCisKKyAgICBkZWYgdmlzaXRBdWdTbGljZShzZWxmLCBub2RlLCBtb2RlKToKKyAgICAgICAgaWYgbW9kZSA9PSAibG9hZCI6CisgICAgICAgICAgICBzZWxmLnZpc2l0U2xpY2Uobm9kZSwgMSkKKyAgICAgICAgZWxpZiBtb2RlID09ICJzdG9yZSI6CisgICAgICAgICAgICBzbGljZSA9IDAKKyAgICAgICAgICAgIGlmIG5vZGUubG93ZXI6CisgICAgICAgICAgICAgICAgc2xpY2UgPSBzbGljZSB8IDEKKyAgICAgICAgICAgIGlmIG5vZGUudXBwZXI6CisgICAgICAgICAgICAgICAgc2xpY2UgPSBzbGljZSB8IDIKKyAgICAgICAgICAgIGlmIHNsaWNlID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfVFdPJykKKyAgICAgICAgICAgIGVsaWYgc2xpY2UgPT0gMzoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ1JPVF9GT1VSJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfVEhSRUUnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdTVE9SRV9TTElDRSslZCcgJSBzbGljZSkKKworICAgIGRlZiB2aXNpdEF1Z1N1YnNjcmlwdChzZWxmLCBub2RlLCBtb2RlKToKKyAgICAgICAgaWYgbW9kZSA9PSAibG9hZCI6CisgICAgICAgICAgICBzZWxmLnZpc2l0U3Vic2NyaXB0KG5vZGUsIDEpCisgICAgICAgIGVsaWYgbW9kZSA9PSAic3RvcmUiOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfVEhSRUUnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdTVE9SRV9TVUJTQ1InKQorCisgICAgZGVmIHZpc2l0RXhlYyhzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIGlmIG5vZGUubG9jYWxzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmxvY2FscykKKyAgICAgICAgaWYgbm9kZS5nbG9iYWxzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmdsb2JhbHMpCisgICAgICAgIHNlbGYuZW1pdCgnRVhFQ19TVE1UJykKKworICAgIGRlZiB2aXNpdENhbGxGdW5jKHNlbGYsIG5vZGUpOgorICAgICAgICBwb3MgPSAwCisgICAgICAgIGt3ID0gMAorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLm5vZGUpCisgICAgICAgIGZvciBhcmcgaW4gbm9kZS5hcmdzOgorICAgICAgICAgICAgc2VsZi52aXNpdChhcmcpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgYXN0LktleXdvcmQpOgorICAgICAgICAgICAgICAgIGt3ID0ga3cgKyAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBvcyA9IHBvcyArIDEKKyAgICAgICAgaWYgbm9kZS5zdGFyX2FyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuc3Rhcl9hcmdzKQorICAgICAgICBpZiBub2RlLmRzdGFyX2FyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZHN0YXJfYXJncykKKyAgICAgICAgaGF2ZV9zdGFyID0gbm9kZS5zdGFyX2FyZ3MgaXMgbm90IE5vbmUKKyAgICAgICAgaGF2ZV9kc3RhciA9IG5vZGUuZHN0YXJfYXJncyBpcyBub3QgTm9uZQorICAgICAgICBvcGNvZGUgPSBjYWxsZnVuY19vcGNvZGVfaW5mb1toYXZlX3N0YXIsIGhhdmVfZHN0YXJdCisgICAgICAgIHNlbGYuZW1pdChvcGNvZGUsIGt3IDw8IDggfCBwb3MpCisKKyAgICBkZWYgdmlzaXRQcmludChzZWxmLCBub2RlLCBuZXdsaW5lPTApOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgaWYgbm9kZS5kZXN0OgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmRlc3QpCisgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLm5vZGVzOgorICAgICAgICAgICAgaWYgbm9kZS5kZXN0OgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnRFVQX1RPUCcpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGNoaWxkKQorICAgICAgICAgICAgaWYgbm9kZS5kZXN0OgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnUk9UX1RXTycpCisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdQUklOVF9JVEVNX1RPJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdQUklOVF9JVEVNJykKKyAgICAgICAgaWYgbm9kZS5kZXN0IGFuZCBub3QgbmV3bGluZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnUE9QX1RPUCcpCisKKyAgICBkZWYgdmlzaXRQcmludG5sKHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnZpc2l0UHJpbnQobm9kZSwgbmV3bGluZT0xKQorICAgICAgICBpZiBub2RlLmRlc3Q6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ1BSSU5UX05FV0xJTkVfVE8nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdQUklOVF9ORVdMSU5FJykKKworICAgIGRlZiB2aXNpdFJldHVybihzZWxmLCBub2RlKToKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSkKKyAgICAgICAgc2VsZi5lbWl0KCdSRVRVUk5fVkFMVUUnKQorCisgICAgZGVmIHZpc2l0WWllbGQoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudmFsdWUpCisgICAgICAgIHNlbGYuZW1pdCgnWUlFTERfVkFMVUUnKQorCisgICAgIyBzbGljZSBhbmQgc3Vic2NyaXB0IHN0dWZmCisKKyAgICBkZWYgdmlzaXRTbGljZShzZWxmLCBub2RlLCBhdWdfZmxhZz1Ob25lKToKKyAgICAgICAgIyBhdWdfZmxhZyBpcyB1c2VkIGJ5IHZpc2l0QXVnU2xpY2UKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNsaWNlID0gMAorICAgICAgICBpZiBub2RlLmxvd2VyOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmxvd2VyKQorICAgICAgICAgICAgc2xpY2UgPSBzbGljZSB8IDEKKyAgICAgICAgaWYgbm9kZS51cHBlcjoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS51cHBlcikKKyAgICAgICAgICAgIHNsaWNlID0gc2xpY2UgfCAyCisgICAgICAgIGlmIGF1Z19mbGFnOgorICAgICAgICAgICAgaWYgc2xpY2UgPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQorICAgICAgICAgICAgZWxpZiBzbGljZSA9PSAzOgorICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnRFVQX1RPUFgnLCAzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1BYJywgMikKKyAgICAgICAgaWYgbm9kZS5mbGFncyA9PSAnT1BfQVBQTFknOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdTTElDRSslZCcgJSBzbGljZSkKKyAgICAgICAgZWxpZiBub2RlLmZsYWdzID09ICdPUF9BU1NJR04nOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdTVE9SRV9TTElDRSslZCcgJSBzbGljZSkKKyAgICAgICAgZWxpZiBub2RlLmZsYWdzID09ICdPUF9ERUxFVEUnOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdERUxFVEVfU0xJQ0UrJWQnICUgc2xpY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAid2VpcmQgc2xpY2UiLCBub2RlLmZsYWdzCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIHZpc2l0U3Vic2NyaXB0KHNlbGYsIG5vZGUsIGF1Z19mbGFnPU5vbmUpOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuZXhwcikKKyAgICAgICAgZm9yIHN1YiBpbiBub2RlLnN1YnM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KHN1YikKKyAgICAgICAgaWYgbGVuKG5vZGUuc3VicykgPiAxOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9UVVBMRScsIGxlbihub2RlLnN1YnMpKQorICAgICAgICBpZiBhdWdfZmxhZzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnRFVQX1RPUFgnLCAyKQorICAgICAgICBpZiBub2RlLmZsYWdzID09ICdPUF9BUFBMWSc6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0JJTkFSWV9TVUJTQ1InKQorICAgICAgICBlbGlmIG5vZGUuZmxhZ3MgPT0gJ09QX0FTU0lHTic6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ1NUT1JFX1NVQlNDUicpCisgICAgICAgIGVsaWYgbm9kZS5mbGFncyA9PSAnT1BfREVMRVRFJzoKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnREVMRVRFX1NVQlNDUicpCisKKyAgICAjIGJpbmFyeSBvcHMKKworICAgIGRlZiBiaW5hcnlPcChzZWxmLCBub2RlLCBvcCk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5sZWZ0KQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUucmlnaHQpCisgICAgICAgIHNlbGYuZW1pdChvcCkKKworICAgIGRlZiB2aXNpdEFkZChzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmluYXJ5T3Aobm9kZSwgJ0JJTkFSWV9BREQnKQorCisgICAgZGVmIHZpc2l0U3ViKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5iaW5hcnlPcChub2RlLCAnQklOQVJZX1NVQlRSQUNUJykKKworICAgIGRlZiB2aXNpdE11bChzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmluYXJ5T3Aobm9kZSwgJ0JJTkFSWV9NVUxUSVBMWScpCisKKyAgICBkZWYgdmlzaXREaXYoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpbmFyeU9wKG5vZGUsIHNlbGYuX2Rpdl9vcCkKKworICAgIGRlZiB2aXNpdEZsb29yRGl2KHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5iaW5hcnlPcChub2RlLCAnQklOQVJZX0ZMT09SX0RJVklERScpCisKKyAgICBkZWYgdmlzaXRNb2Qoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpbmFyeU9wKG5vZGUsICdCSU5BUllfTU9EVUxPJykKKworICAgIGRlZiB2aXNpdFBvd2VyKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5iaW5hcnlPcChub2RlLCAnQklOQVJZX1BPV0VSJykKKworICAgIGRlZiB2aXNpdExlZnRTaGlmdChzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmluYXJ5T3Aobm9kZSwgJ0JJTkFSWV9MU0hJRlQnKQorCisgICAgZGVmIHZpc2l0UmlnaHRTaGlmdChzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmluYXJ5T3Aobm9kZSwgJ0JJTkFSWV9SU0hJRlQnKQorCisgICAgIyB1bmFyeSBvcHMKKworICAgIGRlZiB1bmFyeU9wKHNlbGYsIG5vZGUsIG9wKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNlbGYuZW1pdChvcCkKKworICAgIGRlZiB2aXNpdEludmVydChzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYudW5hcnlPcChub2RlLCAnVU5BUllfSU5WRVJUJykKKworICAgIGRlZiB2aXNpdFVuYXJ5U3ViKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi51bmFyeU9wKG5vZGUsICdVTkFSWV9ORUdBVElWRScpCisKKyAgICBkZWYgdmlzaXRVbmFyeUFkZChzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYudW5hcnlPcChub2RlLCAnVU5BUllfUE9TSVRJVkUnKQorCisgICAgZGVmIHZpc2l0VW5hcnlJbnZlcnQoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLnVuYXJ5T3Aobm9kZSwgJ1VOQVJZX0lOVkVSVCcpCisKKyAgICBkZWYgdmlzaXROb3Qoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLnVuYXJ5T3Aobm9kZSwgJ1VOQVJZX05PVCcpCisKKyAgICBkZWYgdmlzaXRCYWNrcXVvdGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLnVuYXJ5T3Aobm9kZSwgJ1VOQVJZX0NPTlZFUlQnKQorCisgICAgIyBiaXQgb3BzCisKKyAgICBkZWYgYml0T3Aoc2VsZiwgbm9kZXMsIG9wKToKKyAgICAgICAgc2VsZi52aXNpdChub2Rlc1swXSkKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZXNbMTpdOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlKQorICAgICAgICAgICAgc2VsZi5lbWl0KG9wKQorCisgICAgZGVmIHZpc2l0Qml0YW5kKHNlbGYsIG5vZGUpOgorICAgICAgICByZXR1cm4gc2VsZi5iaXRPcChub2RlLm5vZGVzLCAnQklOQVJZX0FORCcpCisKKyAgICBkZWYgdmlzaXRCaXRvcihzZWxmLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYml0T3Aobm9kZS5ub2RlcywgJ0JJTkFSWV9PUicpCisKKyAgICBkZWYgdmlzaXRCaXR4b3Ioc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJpdE9wKG5vZGUubm9kZXMsICdCSU5BUllfWE9SJykKKworICAgICMgb2JqZWN0IGNvbnN0cnVjdG9ycworCisgICAgZGVmIHZpc2l0RWxsaXBzaXMoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIEVsbGlwc2lzKQorCisgICAgZGVmIHZpc2l0VHVwbGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBmb3IgZWx0IGluIG5vZGUubm9kZXM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KGVsdCkKKyAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9UVVBMRScsIGxlbihub2RlLm5vZGVzKSkKKworICAgIGRlZiB2aXNpdExpc3Qoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBmb3IgZWx0IGluIG5vZGUubm9kZXM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KGVsdCkKKyAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9MSVNUJywgbGVuKG5vZGUubm9kZXMpKQorCisgICAgZGVmIHZpc2l0U2V0KHNlbGYsIG5vZGUpOgorICAgICAgICBzZWxmLnNldF9saW5lbm8obm9kZSkKKyAgICAgICAgZm9yIGVsdCBpbiBub2RlLm5vZGVzOgorICAgICAgICAgICAgc2VsZi52aXNpdChlbHQpCisgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfU0VUJywgbGVuKG5vZGUubm9kZXMpKQorCisgICAgZGVmIHZpc2l0U2xpY2VvYmooc2VsZiwgbm9kZSk6CisgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLm5vZGVzOgorICAgICAgICAgICAgc2VsZi52aXNpdChjaGlsZCkKKyAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9TTElDRScsIGxlbihub2RlLm5vZGVzKSkKKworICAgIGRlZiB2aXNpdERpY3Qoc2VsZiwgbm9kZSk6CisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQorICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX01BUCcsIDApCisgICAgICAgIGZvciBrLCB2IGluIG5vZGUuaXRlbXM6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ0RVUF9UT1AnKQorICAgICAgICAgICAgc2VsZi52aXNpdChrKQorICAgICAgICAgICAgc2VsZi52aXNpdCh2KQorICAgICAgICAgICAgc2VsZi5lbWl0KCdST1RfVEhSRUUnKQorICAgICAgICAgICAgc2VsZi5lbWl0KCdTVE9SRV9TVUJTQ1InKQorCitjbGFzcyBOZXN0ZWRTY29wZU1peGluOgorICAgICIiIkRlZmluZXMgaW5pdENsYXNzKCkgZm9yIG5lc3RlZCBzY29waW5nIChQeXRob24gMi4yLWNvbXBhdGlibGUpIiIiCisgICAgZGVmIGluaXRDbGFzcyhzZWxmKToKKyAgICAgICAgc2VsZi5fX2NsYXNzX18uTmFtZUZpbmRlciA9IExvY2FsTmFtZUZpbmRlcgorICAgICAgICBzZWxmLl9fY2xhc3NfXy5GdW5jdGlvbkdlbiA9IEZ1bmN0aW9uQ29kZUdlbmVyYXRvcgorICAgICAgICBzZWxmLl9fY2xhc3NfXy5DbGFzc0dlbiA9IENsYXNzQ29kZUdlbmVyYXRvcgorCitjbGFzcyBNb2R1bGVDb2RlR2VuZXJhdG9yKE5lc3RlZFNjb3BlTWl4aW4sIENvZGVHZW5lcmF0b3IpOgorICAgIF9fc3VwZXJfaW5pdCA9IENvZGVHZW5lcmF0b3IuX19pbml0X18KKworICAgIHNjb3BlcyA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cmVlKToKKyAgICAgICAgc2VsZi5ncmFwaCA9IHB5YXNzZW0uUHlGbG93R3JhcGgoIjxtb2R1bGU+IiwgdHJlZS5maWxlbmFtZSkKKyAgICAgICAgc2VsZi5mdXR1cmVzID0gZnV0dXJlLmZpbmRfZnV0dXJlcyh0cmVlKQorICAgICAgICBzZWxmLl9fc3VwZXJfaW5pdCgpCisgICAgICAgIHdhbGsodHJlZSwgc2VsZikKKworICAgIGRlZiBnZXRfbW9kdWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBFeHByZXNzaW9uQ29kZUdlbmVyYXRvcihOZXN0ZWRTY29wZU1peGluLCBDb2RlR2VuZXJhdG9yKToKKyAgICBfX3N1cGVyX2luaXQgPSBDb2RlR2VuZXJhdG9yLl9faW5pdF9fCisKKyAgICBzY29wZXMgPSBOb25lCisgICAgZnV0dXJlcyA9ICgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSk6CisgICAgICAgIHNlbGYuZ3JhcGggPSBweWFzc2VtLlB5Rmxvd0dyYXBoKCI8ZXhwcmVzc2lvbj4iLCB0cmVlLmZpbGVuYW1lKQorICAgICAgICBzZWxmLl9fc3VwZXJfaW5pdCgpCisgICAgICAgIHdhbGsodHJlZSwgc2VsZikKKworICAgIGRlZiBnZXRfbW9kdWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBJbnRlcmFjdGl2ZUNvZGVHZW5lcmF0b3IoTmVzdGVkU2NvcGVNaXhpbiwgQ29kZUdlbmVyYXRvcik6CisKKyAgICBfX3N1cGVyX2luaXQgPSBDb2RlR2VuZXJhdG9yLl9faW5pdF9fCisKKyAgICBzY29wZXMgPSBOb25lCisgICAgZnV0dXJlcyA9ICgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHJlZSk6CisgICAgICAgIHNlbGYuZ3JhcGggPSBweWFzc2VtLlB5Rmxvd0dyYXBoKCI8aW50ZXJhY3RpdmU+IiwgdHJlZS5maWxlbmFtZSkKKyAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoKQorICAgICAgICBzZWxmLnNldF9saW5lbm8odHJlZSkKKyAgICAgICAgd2Fsayh0cmVlLCBzZWxmKQorICAgICAgICBzZWxmLmVtaXQoJ1JFVFVSTl9WQUxVRScpCisKKyAgICBkZWYgZ2V0X21vZHVsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiB2aXNpdERpc2NhcmQoc2VsZiwgbm9kZSk6CisgICAgICAgICMgWFhYIERpc2NhcmQgbWVhbnMgaXQncyBhbiBleHByZXNzaW9uLiAgUGVyaGFwcyB0aGlzIGlzIGEgYmFkCisgICAgICAgICMgbmFtZS4KKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIpCisgICAgICAgIHNlbGYuZW1pdCgnUFJJTlRfRVhQUicpCisKK2NsYXNzIEFic3RyYWN0RnVuY3Rpb25Db2RlOgorICAgIG9wdGltaXplZCA9IDEKKyAgICBsYW1iZGFDb3VudCA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBzY29wZXMsIGlzTGFtYmRhLCBjbGFzc19uYW1lLCBtb2QpOgorICAgICAgICBzZWxmLmNsYXNzX25hbWUgPSBjbGFzc19uYW1lCisgICAgICAgIHNlbGYubW9kdWxlID0gbW9kCisgICAgICAgIGlmIGlzTGFtYmRhOgorICAgICAgICAgICAga2xhc3MgPSBGdW5jdGlvbkNvZGVHZW5lcmF0b3IKKyAgICAgICAgICAgIG5hbWUgPSAiPGxhbWJkYS4lZD4iICUga2xhc3MubGFtYmRhQ291bnQKKyAgICAgICAgICAgIGtsYXNzLmxhbWJkYUNvdW50ID0ga2xhc3MubGFtYmRhQ291bnQgKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gZnVuYy5uYW1lCisKKyAgICAgICAgYXJncywgaGFzVHVwbGVBcmcgPSBnZW5lcmF0ZUFyZ0xpc3QoZnVuYy5hcmduYW1lcykKKyAgICAgICAgc2VsZi5ncmFwaCA9IHB5YXNzZW0uUHlGbG93R3JhcGgobmFtZSwgZnVuYy5maWxlbmFtZSwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVkPTEpCisgICAgICAgIHNlbGYuaXNMYW1iZGEgPSBpc0xhbWJkYQorICAgICAgICBzZWxmLnN1cGVyX2luaXQoKQorCisgICAgICAgIGlmIG5vdCBpc0xhbWJkYSBhbmQgZnVuYy5kb2M6CisgICAgICAgICAgICBzZWxmLnNldERvY3N0cmluZyhmdW5jLmRvYykKKworICAgICAgICBsbmYgPSB3YWxrKGZ1bmMuY29kZSwgc2VsZi5OYW1lRmluZGVyKGFyZ3MpLCB2ZXJib3NlPTApCisgICAgICAgIHNlbGYubG9jYWxzLnB1c2gobG5mLmdldExvY2FscygpKQorICAgICAgICBpZiBmdW5jLnZhcmFyZ3M6CisgICAgICAgICAgICBzZWxmLmdyYXBoLnNldEZsYWcoQ09fVkFSQVJHUykKKyAgICAgICAgaWYgZnVuYy5rd2FyZ3M6CisgICAgICAgICAgICBzZWxmLmdyYXBoLnNldEZsYWcoQ09fVkFSS0VZV09SRFMpCisgICAgICAgIHNlbGYuc2V0X2xpbmVubyhmdW5jKQorICAgICAgICBpZiBoYXNUdXBsZUFyZzoKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJhdGVBcmdVbnBhY2soZnVuYy5hcmduYW1lcykKKworICAgIGRlZiBnZXRfbW9kdWxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGUKKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHNlbGYuZ3JhcGguc3RhcnRFeGl0QmxvY2soKQorICAgICAgICBpZiBub3Qgc2VsZi5pc0xhbWJkYToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIE5vbmUpCisgICAgICAgIHNlbGYuZW1pdCgnUkVUVVJOX1ZBTFVFJykKKworICAgIGRlZiBnZW5lcmF0ZUFyZ1VucGFjayhzZWxmLCBhcmdzKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFyZ3MpKToKKyAgICAgICAgICAgIGFyZyA9IGFyZ3NbaV0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJnLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0ZBU1QnLCAnLiVkJyAlIChpICogMikpCisgICAgICAgICAgICAgICAgc2VsZi51bnBhY2tTZXF1ZW5jZShhcmcpCisKKyAgICBkZWYgdW5wYWNrU2VxdWVuY2Uoc2VsZiwgdHVwKToKKyAgICAgICAgaWYgVkVSU0lPTiA+IDE6CisgICAgICAgICAgICBzZWxmLmVtaXQoJ1VOUEFDS19TRVFVRU5DRScsIGxlbih0dXApKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbWl0KCdVTlBBQ0tfVFVQTEUnLCBsZW4odHVwKSkKKyAgICAgICAgZm9yIGVsdCBpbiB0dXA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVsdCwgdHVwbGUpOgorICAgICAgICAgICAgICAgIHNlbGYudW5wYWNrU2VxdWVuY2UoZWx0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9uYW1lT3AoJ1NUT1JFJywgZWx0KQorCisgICAgdW5wYWNrVHVwbGUgPSB1bnBhY2tTZXF1ZW5jZQorCitjbGFzcyBGdW5jdGlvbkNvZGVHZW5lcmF0b3IoTmVzdGVkU2NvcGVNaXhpbiwgQWJzdHJhY3RGdW5jdGlvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvcik6CisgICAgc3VwZXJfaW5pdCA9IENvZGVHZW5lcmF0b3IuX19pbml0X18gIyBjYWxsIGJlIG90aGVyIGluaXQKKyAgICBzY29wZXMgPSBOb25lCisKKyAgICBfX3N1cGVyX2luaXQgPSBBYnN0cmFjdEZ1bmN0aW9uQ29kZS5fX2luaXRfXworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMsIHNjb3BlcywgaXNMYW1iZGEsIGNsYXNzX25hbWUsIG1vZCk6CisgICAgICAgIHNlbGYuc2NvcGVzID0gc2NvcGVzCisgICAgICAgIHNlbGYuc2NvcGUgPSBzY29wZXNbZnVuY10KKyAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoZnVuYywgc2NvcGVzLCBpc0xhbWJkYSwgY2xhc3NfbmFtZSwgbW9kKQorICAgICAgICBzZWxmLmdyYXBoLnNldEZyZWVWYXJzKHNlbGYuc2NvcGUuZ2V0X2ZyZWVfdmFycygpKQorICAgICAgICBzZWxmLmdyYXBoLnNldENlbGxWYXJzKHNlbGYuc2NvcGUuZ2V0X2NlbGxfdmFycygpKQorICAgICAgICBpZiBzZWxmLnNjb3BlLmdlbmVyYXRvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZ3JhcGguc2V0RmxhZyhDT19HRU5FUkFUT1IpCisKK2NsYXNzIEdlbkV4cHJDb2RlR2VuZXJhdG9yKE5lc3RlZFNjb3BlTWl4aW4sIEFic3RyYWN0RnVuY3Rpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvcik6CisgICAgc3VwZXJfaW5pdCA9IENvZGVHZW5lcmF0b3IuX19pbml0X18gIyBjYWxsIGJlIG90aGVyIGluaXQKKyAgICBzY29wZXMgPSBOb25lCisKKyAgICBfX3N1cGVyX2luaXQgPSBBYnN0cmFjdEZ1bmN0aW9uQ29kZS5fX2luaXRfXworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdleHAsIHNjb3BlcywgY2xhc3NfbmFtZSwgbW9kKToKKyAgICAgICAgc2VsZi5zY29wZXMgPSBzY29wZXMKKyAgICAgICAgc2VsZi5zY29wZSA9IHNjb3Blc1tnZXhwXQorICAgICAgICBzZWxmLl9fc3VwZXJfaW5pdChnZXhwLCBzY29wZXMsIDEsIGNsYXNzX25hbWUsIG1vZCkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRGcmVlVmFycyhzZWxmLnNjb3BlLmdldF9mcmVlX3ZhcnMoKSkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRDZWxsVmFycyhzZWxmLnNjb3BlLmdldF9jZWxsX3ZhcnMoKSkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRGbGFnKENPX0dFTkVSQVRPUikKKworY2xhc3MgQWJzdHJhY3RDbGFzc0NvZGU6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2xhc3MsIHNjb3BlcywgbW9kdWxlKToKKyAgICAgICAgc2VsZi5jbGFzc19uYW1lID0ga2xhc3MubmFtZQorICAgICAgICBzZWxmLm1vZHVsZSA9IG1vZHVsZQorICAgICAgICBzZWxmLmdyYXBoID0gcHlhc3NlbS5QeUZsb3dHcmFwaChrbGFzcy5uYW1lLCBrbGFzcy5maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZWQ9MCwga2xhc3M9MSkKKyAgICAgICAgc2VsZi5zdXBlcl9pbml0KCkKKyAgICAgICAgbG5mID0gd2FsayhrbGFzcy5jb2RlLCBzZWxmLk5hbWVGaW5kZXIoKSwgdmVyYm9zZT0wKQorICAgICAgICBzZWxmLmxvY2Fscy5wdXNoKGxuZi5nZXRMb2NhbHMoKSkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRGbGFnKENPX05FV0xPQ0FMUykKKyAgICAgICAgaWYga2xhc3MuZG9jOgorICAgICAgICAgICAgc2VsZi5zZXREb2NzdHJpbmcoa2xhc3MuZG9jKQorCisgICAgZGVmIGdldF9tb2R1bGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1vZHVsZQorCisgICAgZGVmIGZpbmlzaChzZWxmKToKKyAgICAgICAgc2VsZi5ncmFwaC5zdGFydEV4aXRCbG9jaygpCisgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9MT0NBTFMnKQorICAgICAgICBzZWxmLmVtaXQoJ1JFVFVSTl9WQUxVRScpCisKK2NsYXNzIENsYXNzQ29kZUdlbmVyYXRvcihOZXN0ZWRTY29wZU1peGluLCBBYnN0cmFjdENsYXNzQ29kZSwgQ29kZUdlbmVyYXRvcik6CisgICAgc3VwZXJfaW5pdCA9IENvZGVHZW5lcmF0b3IuX19pbml0X18KKyAgICBzY29wZXMgPSBOb25lCisKKyAgICBfX3N1cGVyX2luaXQgPSBBYnN0cmFjdENsYXNzQ29kZS5fX2luaXRfXworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtsYXNzLCBzY29wZXMsIG1vZHVsZSk6CisgICAgICAgIHNlbGYuc2NvcGVzID0gc2NvcGVzCisgICAgICAgIHNlbGYuc2NvcGUgPSBzY29wZXNba2xhc3NdCisgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KGtsYXNzLCBzY29wZXMsIG1vZHVsZSkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRGcmVlVmFycyhzZWxmLnNjb3BlLmdldF9mcmVlX3ZhcnMoKSkKKyAgICAgICAgc2VsZi5ncmFwaC5zZXRDZWxsVmFycyhzZWxmLnNjb3BlLmdldF9jZWxsX3ZhcnMoKSkKKyAgICAgICAgc2VsZi5zZXRfbGluZW5vKGtsYXNzKQorICAgICAgICBzZWxmLmVtaXQoIkxPQURfR0xPQkFMIiwgIl9fbmFtZV9fIikKKyAgICAgICAgc2VsZi5zdG9yZU5hbWUoIl9fbW9kdWxlX18iKQorICAgICAgICBpZiBrbGFzcy5kb2M6CisgICAgICAgICAgICBzZWxmLmVtaXQoIkxPQURfQ09OU1QiLCBrbGFzcy5kb2MpCisgICAgICAgICAgICBzZWxmLnN0b3JlTmFtZSgnX19kb2NfXycpCisKK2RlZiBnZW5lcmF0ZUFyZ0xpc3QoYXJnbGlzdCk6CisgICAgIiIiR2VuZXJhdGUgYW4gYXJnIGxpc3QgbWFya2luZyBUdXBsZUFyZ3MiIiIKKyAgICBhcmdzID0gW10KKyAgICBleHRyYSA9IFtdCisgICAgY291bnQgPSAwCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFyZ2xpc3QpKToKKyAgICAgICAgZWx0ID0gYXJnbGlzdFtpXQorICAgICAgICBpZiBpc2luc3RhbmNlKGVsdCwgc3RyKToKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGVsdCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGVsdCwgdHVwbGUpOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoVHVwbGVBcmcoaSAqIDIsIGVsdCkpCisgICAgICAgICAgICBleHRyYS5leHRlbmQobWlzYy5mbGF0dGVuKGVsdCkpCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVuZXhwZWN0IGFyZ3VtZW50IHR5cGU6IiwgZWx0CisgICAgcmV0dXJuIGFyZ3MgKyBleHRyYSwgY291bnQKKworZGVmIGZpbmRPcChub2RlKToKKyAgICAiIiJGaW5kIHRoZSBvcCAoREVMRVRFLCBMT0FELCBTVE9SRSkgaW4gYW4gQXNzVHVwbGUgdHJlZSIiIgorICAgIHYgPSBPcEZpbmRlcigpCisgICAgd2Fsayhub2RlLCB2LCB2ZXJib3NlPTApCisgICAgcmV0dXJuIHYub3AKKworY2xhc3MgT3BGaW5kZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm9wID0gTm9uZQorICAgIGRlZiB2aXNpdEFzc05hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIHNlbGYub3AgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYub3AgPSBub2RlLmZsYWdzCisgICAgICAgIGVsaWYgc2VsZi5vcCAhPSBub2RlLmZsYWdzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1peGVkIG9wcyBpbiBzdG10IgorICAgIHZpc2l0QXNzQXR0ciA9IHZpc2l0QXNzTmFtZQorICAgIHZpc2l0U3Vic2NyaXB0ID0gdmlzaXRBc3NOYW1lCisKK2NsYXNzIERlbGVnYXRvcjoKKyAgICAiIiJCYXNlIGNsYXNzIHRvIHN1cHBvcnQgZGVsZWdhdGlvbiBmb3IgYXVnbWVudGVkIGFzc2lnbm1lbnQgbm9kZXMKKworICAgIFRvIGdlbmVyYXRvciBjb2RlIGZvciBhdWdtZW50ZWQgYXNzaWdubWVudHMsIHdlIHVzZSB0aGUgZm9sbG93aW5nCisgICAgd3JhcHBlciBjbGFzc2VzLiAgSW4gdmlzaXRBdWdBc3NpZ24sIHRoZSBsZWZ0LWhhbmQgZXhwcmVzc2lvbiBub2RlCisgICAgaXMgdmlzaXRlZCB0d2ljZS4gIFRoZSBmaXJzdCB0aW1lIHRoZSB2aXNpdCB1c2VzIHRoZSBub3JtYWwgbWV0aG9kCisgICAgZm9yIHRoYXQgbm9kZSAuICBUaGUgc2Vjb25kIHRpbWUgdGhlIHZpc2l0IHVzZXMgYSBkaWZmZXJlbnQgbWV0aG9kCisgICAgdGhhdCBnZW5lcmF0ZXMgdGhlIGFwcHJvcHJpYXRlIGNvZGUgdG8gcGVyZm9ybSB0aGUgYXNzaWdubWVudC4KKyAgICBUaGVzZSBkZWxlZ2F0b3IgY2xhc3NlcyB3cmFwIHRoZSBvcmlnaW5hbCBBU1Qgbm9kZXMgaW4gb3JkZXIgdG8KKyAgICBzdXBwb3J0IHRoZSB2YXJpYW50IHZpc2l0IG1ldGhvZHMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaik6CisgICAgICAgIHNlbGYub2JqID0gb2JqCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYub2JqLCBhdHRyKQorCitjbGFzcyBBdWdHZXRhdHRyKERlbGVnYXRvcik6CisgICAgcGFzcworCitjbGFzcyBBdWdOYW1lKERlbGVnYXRvcik6CisgICAgcGFzcworCitjbGFzcyBBdWdTbGljZShEZWxlZ2F0b3IpOgorICAgIHBhc3MKKworY2xhc3MgQXVnU3Vic2NyaXB0KERlbGVnYXRvcik6CisgICAgcGFzcworCit3cmFwcGVyID0geworICAgIGFzdC5HZXRhdHRyOiBBdWdHZXRhdHRyLAorICAgIGFzdC5OYW1lOiBBdWdOYW1lLAorICAgIGFzdC5TbGljZTogQXVnU2xpY2UsCisgICAgYXN0LlN1YnNjcmlwdDogQXVnU3Vic2NyaXB0LAorICAgIH0KKworZGVmIHdyYXBfYXVnKG5vZGUpOgorICAgIHJldHVybiB3cmFwcGVyW25vZGUuX19jbGFzc19fXShub2RlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGZvciBmaWxlIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgY29tcGlsZUZpbGUoZmlsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5YyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjRjZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWNvZGVnZW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5byBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvcHljb2RlZ2VuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDlhYTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9weWNvZGVnZW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ltYm9scy5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ltYm9scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmVlYzUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW1ib2xzLnB5CkBAIC0wLDAgKzEsNDYyIEBACisiIiJNb2R1bGUgc3ltYm9sLXRhYmxlIGdlbmVyYXRvciIiIgorCitmcm9tIGNvbXBpbGVyIGltcG9ydCBhc3QKK2Zyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCBTQ19MT0NBTCwgU0NfR0xPQkFMX0lNUExJQ0lULCBTQ19HTE9CQUxfRVhQTElDSVQsIFwKKyAgICBTQ19GUkVFLCBTQ19DRUxMLCBTQ19VTktOT1dOCitmcm9tIGNvbXBpbGVyLm1pc2MgaW1wb3J0IG1hbmdsZQoraW1wb3J0IHR5cGVzCisKKworaW1wb3J0IHN5cworCitNQU5HTEVfTEVOID0gMjU2CisKK2NsYXNzIFNjb3BlOgorICAgICMgWFhYIGhvdyBtdWNoIGluZm9ybWF0aW9uIGRvIEkgbmVlZCBhYm91dCBlYWNoIG5hbWU/CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZHVsZSwga2xhc3M9Tm9uZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKKyAgICAgICAgc2VsZi5kZWZzID0ge30KKyAgICAgICAgc2VsZi51c2VzID0ge30KKyAgICAgICAgc2VsZi5nbG9iYWxzID0ge30KKyAgICAgICAgc2VsZi5wYXJhbXMgPSB7fQorICAgICAgICBzZWxmLmZyZWVzID0ge30KKyAgICAgICAgc2VsZi5jZWxscyA9IHt9CisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQorICAgICAgICAjIG5lc3RlZCBpcyB0cnVlIGlmIHRoZSBjbGFzcyBjb3VsZCBjb250YWluIGZyZWUgdmFyaWFibGVzLAorICAgICAgICAjIGkuZS4gaWYgaXQgaXMgbmVzdGVkIHdpdGhpbiBhbm90aGVyIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLm5lc3RlZCA9IE5vbmUKKyAgICAgICAgc2VsZi5nZW5lcmF0b3IgPSBOb25lCisgICAgICAgIHNlbGYua2xhc3MgPSBOb25lCisgICAgICAgIGlmIGtsYXNzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGtsYXNzKSk6CisgICAgICAgICAgICAgICAgaWYga2xhc3NbaV0gIT0gJ18nOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmtsYXNzID0ga2xhc3NbaTpdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPCVzOiAlcz4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLm5hbWUpCisKKyAgICBkZWYgbWFuZ2xlKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBzZWxmLmtsYXNzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbmFtZQorICAgICAgICByZXR1cm4gbWFuZ2xlKG5hbWUsIHNlbGYua2xhc3MpCisKKyAgICBkZWYgYWRkX2RlZihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5kZWZzW3NlbGYubWFuZ2xlKG5hbWUpXSA9IDEKKworICAgIGRlZiBhZGRfdXNlKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnVzZXNbc2VsZi5tYW5nbGUobmFtZSldID0gMQorCisgICAgZGVmIGFkZF9nbG9iYWwoc2VsZiwgbmFtZSk6CisgICAgICAgIG5hbWUgPSBzZWxmLm1hbmdsZShuYW1lKQorICAgICAgICBpZiBuYW1lIGluIHNlbGYudXNlcyBvciBuYW1lIGluIHNlbGYuZGVmczoKKyAgICAgICAgICAgIHBhc3MgIyBYWFggd2FybiBhYm91dCBnbG9iYWwgZm9sbG93aW5nIGRlZi91c2UKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnBhcmFtczoKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiJXMgaW4gJXMgaXMgZ2xvYmFsIGFuZCBwYXJhbWV0ZXIiICUgXAorICAgICAgICAgICAgICAgICAgKG5hbWUsIHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi5nbG9iYWxzW25hbWVdID0gMQorICAgICAgICBzZWxmLm1vZHVsZS5hZGRfZGVmKG5hbWUpCisKKyAgICBkZWYgYWRkX3BhcmFtKHNlbGYsIG5hbWUpOgorICAgICAgICBuYW1lID0gc2VsZi5tYW5nbGUobmFtZSkKKyAgICAgICAgc2VsZi5kZWZzW25hbWVdID0gMQorICAgICAgICBzZWxmLnBhcmFtc1tuYW1lXSA9IDEKKworICAgIGRlZiBnZXRfbmFtZXMoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBkLnVwZGF0ZShzZWxmLmRlZnMpCisgICAgICAgIGQudXBkYXRlKHNlbGYudXNlcykKKyAgICAgICAgZC51cGRhdGUoc2VsZi5nbG9iYWxzKQorICAgICAgICByZXR1cm4gZC5rZXlzKCkKKworICAgIGRlZiBhZGRfY2hpbGQoc2VsZiwgY2hpbGQpOgorICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChjaGlsZCkKKworICAgIGRlZiBnZXRfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNoaWxkcmVuCisKKyAgICBkZWYgREVCVUcoc2VsZik6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHNlbGYubmFtZSwgc2VsZi5uZXN0ZWQgYW5kICJuZXN0ZWQiIG9yICIiCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJcdGdsb2JhbHM6ICIsIHNlbGYuZ2xvYmFscworICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiXHRjZWxsczogIiwgc2VsZi5jZWxscworICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiXHRkZWZzOiAiLCBzZWxmLmRlZnMKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlx0dXNlczogIiwgc2VsZi51c2VzCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJcdGZyZWVzOiIsIHNlbGYuZnJlZXMKKworICAgIGRlZiBjaGVja19uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gc2NvcGUgb2YgbmFtZS4KKworICAgICAgICBUaGUgc2NvcGUgb2YgYSBuYW1lIGNvdWxkIGJlIExPQ0FMLCBHTE9CQUwsIEZSRUUsIG9yIENFTEwuCisgICAgICAgICIiIgorICAgICAgICBpZiBuYW1lIGluIHNlbGYuZ2xvYmFsczoKKyAgICAgICAgICAgIHJldHVybiBTQ19HTE9CQUxfRVhQTElDSVQKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLmNlbGxzOgorICAgICAgICAgICAgcmV0dXJuIFNDX0NFTEwKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLmRlZnM6CisgICAgICAgICAgICByZXR1cm4gU0NfTE9DQUwKKyAgICAgICAgaWYgc2VsZi5uZXN0ZWQgYW5kIChuYW1lIGluIHNlbGYuZnJlZXMgb3IgbmFtZSBpbiBzZWxmLnVzZXMpOgorICAgICAgICAgICAgcmV0dXJuIFNDX0ZSRUUKKyAgICAgICAgaWYgc2VsZi5uZXN0ZWQ6CisgICAgICAgICAgICByZXR1cm4gU0NfVU5LTk9XTgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFNDX0dMT0JBTF9JTVBMSUNJVAorCisgICAgZGVmIGdldF9mcmVlX3ZhcnMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLm5lc3RlZDoKKyAgICAgICAgICAgIHJldHVybiAoKQorICAgICAgICBmcmVlID0ge30KKyAgICAgICAgZnJlZS51cGRhdGUoc2VsZi5mcmVlcykKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi51c2VzLmtleXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuZGVmcyBhbmQgbmFtZSBub3QgaW4gc2VsZi5nbG9iYWxzOgorICAgICAgICAgICAgICAgIGZyZWVbbmFtZV0gPSAxCisgICAgICAgIHJldHVybiBmcmVlLmtleXMoKQorCisgICAgZGVmIGhhbmRsZV9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICBmcmVlcyA9IGNoaWxkLmdldF9mcmVlX3ZhcnMoKQorICAgICAgICAgICAgZ2xvYmFscyA9IHNlbGYuYWRkX2ZyZWVzKGZyZWVzKQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYmFsczoKKyAgICAgICAgICAgICAgICBjaGlsZC5mb3JjZV9nbG9iYWwobmFtZSkKKworICAgIGRlZiBmb3JjZV9nbG9iYWwoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkZvcmNlIG5hbWUgdG8gYmUgZ2xvYmFsIGluIHNjb3BlLgorCisgICAgICAgIFNvbWUgY2hpbGQgb2YgdGhlIGN1cnJlbnQgbm9kZSBoYWQgYSBmcmVlIHJlZmVyZW5jZSB0byBuYW1lLgorICAgICAgICBXaGVuIHRoZSBjaGlsZCB3YXMgcHJvY2Vzc2VkLCBpdCB3YXMgbGFiZWxsZWQgYSBmcmVlCisgICAgICAgIHZhcmlhYmxlLiAgTm93IHRoYXQgYWxsIGl0cyBlbmNsb3Npbmcgc2NvcGUgaGF2ZSBiZWVuCisgICAgICAgIHByb2Nlc3NlZCwgdGhlIG5hbWUgaXMga25vd24gdG8gYmUgYSBnbG9iYWwgb3IgYnVpbHRpbi4gIFNvCisgICAgICAgIHdhbGsgYmFjayBkb3duIHRoZSBjaGlsZCBjaGFpbiBhbmQgc2V0IHRoZSBuYW1lIHRvIGJlIGdsb2JhbAorICAgICAgICByYXRoZXIgdGhhbiBmcmVlLgorCisgICAgICAgIEJlIGNhcmVmdWwgdG8gc3RvcCBpZiBhIGNoaWxkIGRvZXMgbm90IHRoaW5rIHRoZSBuYW1lIGlzCisgICAgICAgIGZyZWUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmdsb2JhbHNbbmFtZV0gPSAxCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5mcmVlczoKKyAgICAgICAgICAgIGRlbCBzZWxmLmZyZWVzW25hbWVdCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgaWYgY2hpbGQuY2hlY2tfbmFtZShuYW1lKSA9PSBTQ19GUkVFOgorICAgICAgICAgICAgICAgIGNoaWxkLmZvcmNlX2dsb2JhbChuYW1lKQorCisgICAgZGVmIGFkZF9mcmVlcyhzZWxmLCBuYW1lcyk6CisgICAgICAgICIiIlByb2Nlc3MgbGlzdCBvZiBmcmVlIHZhcnMgZnJvbSBuZXN0ZWQgc2NvcGUuCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3Qgb2YgbmFtZXMgdGhhdCBhcmUgZWl0aGVyIDEpIGRlY2xhcmVkIGdsb2JhbCBpbiB0aGUKKyAgICAgICAgcGFyZW50IG9yIDIpIHVuZGVmaW5lZCBpbiBhIHRvcC1sZXZlbCBwYXJlbnQuICBJbiBlaXRoZXIgY2FzZSwKKyAgICAgICAgdGhlIG5lc3RlZCBzY29wZSBzaG91bGQgdHJlYXQgdGhlbSBhcyBnbG9iYWxzLgorICAgICAgICAiIiIKKyAgICAgICAgY2hpbGRfZ2xvYmFscyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgc2MgPSBzZWxmLmNoZWNrX25hbWUobmFtZSkKKyAgICAgICAgICAgIGlmIHNlbGYubmVzdGVkOgorICAgICAgICAgICAgICAgIGlmIHNjID09IFNDX1VOS05PV04gb3Igc2MgPT0gU0NfRlJFRSBcCisgICAgICAgICAgICAgICAgICAgb3IgaXNpbnN0YW5jZShzZWxmLCBDbGFzc1Njb3BlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcmVlc1tuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICBlbGlmIHNjID09IFNDX0dMT0JBTF9JTVBMSUNJVDoKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRfZ2xvYmFscy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VsZiwgRnVuY3Rpb25TY29wZSkgYW5kIHNjID09IFNDX0xPQ0FMOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNlbGxzW25hbWVdID0gMQorICAgICAgICAgICAgICAgIGVsaWYgc2MgIT0gU0NfQ0VMTDoKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRfZ2xvYmFscy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2MgPT0gU0NfTE9DQUw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2VsbHNbbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgZWxpZiBzYyAhPSBTQ19DRUxMOgorICAgICAgICAgICAgICAgICAgICBjaGlsZF9nbG9iYWxzLmFwcGVuZChuYW1lKQorICAgICAgICByZXR1cm4gY2hpbGRfZ2xvYmFscworCisgICAgZGVmIGdldF9jZWxsX3ZhcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNlbGxzLmtleXMoKQorCitjbGFzcyBNb2R1bGVTY29wZShTY29wZSk6CisgICAgX19zdXBlcl9pbml0ID0gU2NvcGUuX19pbml0X18KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoImdsb2JhbCIsIHNlbGYpCisKK2NsYXNzIEZ1bmN0aW9uU2NvcGUoU2NvcGUpOgorICAgIHBhc3MKKworY2xhc3MgR2VuRXhwclNjb3BlKFNjb3BlKToKKyAgICBfX3N1cGVyX2luaXQgPSBTY29wZS5fX2luaXRfXworCisgICAgX19jb3VudGVyID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSwga2xhc3M9Tm9uZSk6CisgICAgICAgIGkgPSBzZWxmLl9fY291bnRlcgorICAgICAgICBzZWxmLl9fY291bnRlciArPSAxCisgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KCJnZW5lcmF0b3IgZXhwcmVzc2lvbjwlZD4iJWksIG1vZHVsZSwga2xhc3MpCisgICAgICAgIHNlbGYuYWRkX3BhcmFtKCcuMCcpCisKKyAgICBkZWYgZ2V0X25hbWVzKHNlbGYpOgorICAgICAgICBrZXlzID0gU2NvcGUuZ2V0X25hbWVzKHNlbGYpCisgICAgICAgIHJldHVybiBrZXlzCisKK2NsYXNzIExhbWJkYVNjb3BlKEZ1bmN0aW9uU2NvcGUpOgorICAgIF9fc3VwZXJfaW5pdCA9IFNjb3BlLl9faW5pdF9fCisKKyAgICBfX2NvdW50ZXIgPSAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlLCBrbGFzcz1Ob25lKToKKyAgICAgICAgaSA9IHNlbGYuX19jb3VudGVyCisgICAgICAgIHNlbGYuX19jb3VudGVyICs9IDEKKyAgICAgICAgc2VsZi5fX3N1cGVyX2luaXQoImxhbWJkYS4lZCIgJSBpLCBtb2R1bGUsIGtsYXNzKQorCitjbGFzcyBDbGFzc1Njb3BlKFNjb3BlKToKKyAgICBfX3N1cGVyX2luaXQgPSBTY29wZS5fX2luaXRfXworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZHVsZSk6CisgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KG5hbWUsIG1vZHVsZSwgbmFtZSkKKworY2xhc3MgU3ltYm9sVmlzaXRvcjoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2NvcGVzID0ge30KKyAgICAgICAgc2VsZi5rbGFzcyA9IE5vbmUKKworICAgICMgbm9kZSB0aGF0IGRlZmluZSBuZXcgc2NvcGVzCisKKyAgICBkZWYgdmlzaXRNb2R1bGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHNjb3BlID0gc2VsZi5tb2R1bGUgPSBzZWxmLnNjb3Blc1tub2RlXSA9IE1vZHVsZVNjb3BlKCkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLm5vZGUsIHNjb3BlKQorCisgICAgdmlzaXRFeHByZXNzaW9uID0gdmlzaXRNb2R1bGUKKworICAgIGRlZiB2aXNpdEZ1bmN0aW9uKHNlbGYsIG5vZGUsIHBhcmVudCk6CisgICAgICAgIGlmIG5vZGUuZGVjb3JhdG9yczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5kZWNvcmF0b3JzLCBwYXJlbnQpCisgICAgICAgIHBhcmVudC5hZGRfZGVmKG5vZGUubmFtZSkKKyAgICAgICAgZm9yIG4gaW4gbm9kZS5kZWZhdWx0czoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobiwgcGFyZW50KQorICAgICAgICBzY29wZSA9IEZ1bmN0aW9uU2NvcGUobm9kZS5uYW1lLCBzZWxmLm1vZHVsZSwgc2VsZi5rbGFzcykKKyAgICAgICAgaWYgcGFyZW50Lm5lc3RlZCBvciBpc2luc3RhbmNlKHBhcmVudCwgRnVuY3Rpb25TY29wZSk6CisgICAgICAgICAgICBzY29wZS5uZXN0ZWQgPSAxCisgICAgICAgIHNlbGYuc2NvcGVzW25vZGVdID0gc2NvcGUKKyAgICAgICAgc2VsZi5fZG9fYXJncyhzY29wZSwgbm9kZS5hcmduYW1lcykKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmNvZGUsIHNjb3BlKQorICAgICAgICBzZWxmLmhhbmRsZV9mcmVlX3ZhcnMoc2NvcGUsIHBhcmVudCkKKworICAgIGRlZiB2aXNpdEdlbkV4cHIoc2VsZiwgbm9kZSwgcGFyZW50KToKKyAgICAgICAgc2NvcGUgPSBHZW5FeHByU2NvcGUoc2VsZi5tb2R1bGUsIHNlbGYua2xhc3MpOworICAgICAgICBpZiBwYXJlbnQubmVzdGVkIG9yIGlzaW5zdGFuY2UocGFyZW50LCBGdW5jdGlvblNjb3BlKSBcCisgICAgICAgICAgICAgICAgb3IgaXNpbnN0YW5jZShwYXJlbnQsIEdlbkV4cHJTY29wZSk6CisgICAgICAgICAgICBzY29wZS5uZXN0ZWQgPSAxCisKKyAgICAgICAgc2VsZi5zY29wZXNbbm9kZV0gPSBzY29wZQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuY29kZSwgc2NvcGUpCisKKyAgICAgICAgc2VsZi5oYW5kbGVfZnJlZV92YXJzKHNjb3BlLCBwYXJlbnQpCisKKyAgICBkZWYgdmlzaXRHZW5FeHBySW5uZXIoc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBmb3IgZ2VuZm9yIGluIG5vZGUucXVhbHM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KGdlbmZvciwgc2NvcGUpCisKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIsIHNjb3BlKQorCisgICAgZGVmIHZpc2l0R2VuRXhwckZvcihzZWxmLCBub2RlLCBzY29wZSk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5hc3NpZ24sIHNjb3BlLCAxKQorICAgICAgICBzZWxmLnZpc2l0KG5vZGUuaXRlciwgc2NvcGUpCisgICAgICAgIGZvciBpZl8gaW4gbm9kZS5pZnM6CisgICAgICAgICAgICBzZWxmLnZpc2l0KGlmXywgc2NvcGUpCisKKyAgICBkZWYgdmlzaXRHZW5FeHBySWYoc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBzZWxmLnZpc2l0KG5vZGUudGVzdCwgc2NvcGUpCisKKyAgICBkZWYgdmlzaXRMYW1iZGEoc2VsZiwgbm9kZSwgcGFyZW50LCBhc3NpZ249MCk6CisgICAgICAgICMgTGFtYmRhIGlzIGFuIGV4cHJlc3Npb24sIHNvIGl0IGNvdWxkIGFwcGVhciBpbiBhbiBleHByZXNzaW9uCisgICAgICAgICMgY29udGV4dCB3aGVyZSBhc3NpZ24gaXMgcGFzc2VkLiAgVGhlIHRyYW5zZm9ybWVyIHNob3VsZCBjYXRjaAorICAgICAgICAjIGFueSBjb2RlIHRoYXQgaGFzIGEgbGFtYmRhIG9uIHRoZSBsZWZ0LWhhbmQgc2lkZS4KKyAgICAgICAgYXNzZXJ0IG5vdCBhc3NpZ24KKworICAgICAgICBmb3IgbiBpbiBub2RlLmRlZmF1bHRzOgorICAgICAgICAgICAgc2VsZi52aXNpdChuLCBwYXJlbnQpCisgICAgICAgIHNjb3BlID0gTGFtYmRhU2NvcGUoc2VsZi5tb2R1bGUsIHNlbGYua2xhc3MpCisgICAgICAgIGlmIHBhcmVudC5uZXN0ZWQgb3IgaXNpbnN0YW5jZShwYXJlbnQsIEZ1bmN0aW9uU2NvcGUpOgorICAgICAgICAgICAgc2NvcGUubmVzdGVkID0gMQorICAgICAgICBzZWxmLnNjb3Blc1tub2RlXSA9IHNjb3BlCisgICAgICAgIHNlbGYuX2RvX2FyZ3Moc2NvcGUsIG5vZGUuYXJnbmFtZXMpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5jb2RlLCBzY29wZSkKKyAgICAgICAgc2VsZi5oYW5kbGVfZnJlZV92YXJzKHNjb3BlLCBwYXJlbnQpCisKKyAgICBkZWYgX2RvX2FyZ3Moc2VsZiwgc2NvcGUsIGFyZ3MpOgorICAgICAgICBmb3IgbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgaWYgdHlwZShuYW1lKSA9PSB0eXBlcy5UdXBsZVR5cGU6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9fYXJncyhzY29wZSwgbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2NvcGUuYWRkX3BhcmFtKG5hbWUpCisKKyAgICBkZWYgaGFuZGxlX2ZyZWVfdmFycyhzZWxmLCBzY29wZSwgcGFyZW50KToKKyAgICAgICAgcGFyZW50LmFkZF9jaGlsZChzY29wZSkKKyAgICAgICAgc2NvcGUuaGFuZGxlX2NoaWxkcmVuKCkKKworICAgIGRlZiB2aXNpdENsYXNzKHNlbGYsIG5vZGUsIHBhcmVudCk6CisgICAgICAgIHBhcmVudC5hZGRfZGVmKG5vZGUubmFtZSkKKyAgICAgICAgZm9yIG4gaW4gbm9kZS5iYXNlczoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobiwgcGFyZW50KQorICAgICAgICBzY29wZSA9IENsYXNzU2NvcGUobm9kZS5uYW1lLCBzZWxmLm1vZHVsZSkKKyAgICAgICAgaWYgcGFyZW50Lm5lc3RlZCBvciBpc2luc3RhbmNlKHBhcmVudCwgRnVuY3Rpb25TY29wZSk6CisgICAgICAgICAgICBzY29wZS5uZXN0ZWQgPSAxCisgICAgICAgIGlmIG5vZGUuZG9jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2NvcGUuYWRkX2RlZignX19kb2NfXycpCisgICAgICAgIHNjb3BlLmFkZF9kZWYoJ19fbW9kdWxlX18nKQorICAgICAgICBzZWxmLnNjb3Blc1tub2RlXSA9IHNjb3BlCisgICAgICAgIHByZXYgPSBzZWxmLmtsYXNzCisgICAgICAgIHNlbGYua2xhc3MgPSBub2RlLm5hbWUKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmNvZGUsIHNjb3BlKQorICAgICAgICBzZWxmLmtsYXNzID0gcHJldgorICAgICAgICBzZWxmLmhhbmRsZV9mcmVlX3ZhcnMoc2NvcGUsIHBhcmVudCkKKworICAgICMgbmFtZSBjYW4gYmUgYSBkZWYgb3IgYSB1c2UKKworICAgICMgWFhYIGEgZmV3IGNhbGxzIGFuZCBub2RlcyBleHBlY3QgYSB0aGlyZCAiYXNzaWduIiBhcmcgdGhhdCBpcworICAgICMgdHJ1ZSBpZiB0aGUgbmFtZSBpcyBiZWluZyB1c2VkIGFzIGFuIGFzc2lnbm1lbnQuICBvbmx5CisgICAgIyBleHByZXNzaW9ucyBjb250YWluZWQgd2l0aGluIHN0YXRlbWVudHMgbWF5IGhhdmUgdGhlIGFzc2lnbiBhcmcuCisKKyAgICBkZWYgdmlzaXROYW1lKHNlbGYsIG5vZGUsIHNjb3BlLCBhc3NpZ249MCk6CisgICAgICAgIGlmIGFzc2lnbjoKKyAgICAgICAgICAgIHNjb3BlLmFkZF9kZWYobm9kZS5uYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2NvcGUuYWRkX3VzZShub2RlLm5hbWUpCisKKyAgICAjIG9wZXJhdGlvbnMgdGhhdCBiaW5kIG5ldyBuYW1lcworCisgICAgZGVmIHZpc2l0Rm9yKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmFzc2lnbiwgc2NvcGUsIDEpCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5saXN0LCBzY29wZSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmJvZHksIHNjb3BlKQorICAgICAgICBpZiBub2RlLmVsc2VfOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmVsc2VfLCBzY29wZSkKKworICAgIGRlZiB2aXNpdEZyb20oc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBmb3IgbmFtZSwgYXNuYW1lIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBpZiBuYW1lID09ICIqIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2NvcGUuYWRkX2RlZihhc25hbWUgb3IgbmFtZSkKKworICAgIGRlZiB2aXNpdEltcG9ydChzZWxmLCBub2RlLCBzY29wZSk6CisgICAgICAgIGZvciBuYW1lLCBhc25hbWUgaW4gbm9kZS5uYW1lczoKKyAgICAgICAgICAgIGkgPSBuYW1lLmZpbmQoIi4iKQorICAgICAgICAgICAgaWYgaSA+IC0xOgorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzppXQorICAgICAgICAgICAgc2NvcGUuYWRkX2RlZihhc25hbWUgb3IgbmFtZSkKKworICAgIGRlZiB2aXNpdEdsb2JhbChzZWxmLCBub2RlLCBzY29wZSk6CisgICAgICAgIGZvciBuYW1lIGluIG5vZGUubmFtZXM6CisgICAgICAgICAgICBzY29wZS5hZGRfZ2xvYmFsKG5hbWUpCisKKyAgICBkZWYgdmlzaXRBc3NpZ24oc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICAiIiJQcm9wYWdhdGUgYXNzaWdubWVudCBmbGFnIGRvd24gdG8gY2hpbGQgbm9kZXMuCisKKyAgICAgICAgVGhlIEFzc2lnbiBub2RlIGRvZXNuJ3QgaXRzZWxmIGNvbnRhaW5zIHRoZSB2YXJpYWJsZXMgYmVpbmcKKyAgICAgICAgYXNzaWduZWQgdG8uICBJbnN0ZWFkLCB0aGUgY2hpbGRyZW4gaW4gbm9kZS5ub2RlcyBhcmUgdmlzaXRlZAorICAgICAgICB3aXRoIHRoZSBhc3NpZ24gZmxhZyBzZXQgdG8gdHJ1ZS4gIFdoZW4gdGhlIG5hbWVzIG9jY3VyIGluCisgICAgICAgIHRob3NlIG5vZGVzLCB0aGV5IGFyZSBtYXJrZWQgYXMgZGVmcy4KKworICAgICAgICBTb21lIG5hbWVzIHRoYXQgb2NjdXIgaW4gYW4gYXNzaWdubWVudCB0YXJnZXQgYXJlIG5vdCBib3VuZCBieQorICAgICAgICB0aGUgYXNzaWdubWVudCwgZS5nLiBhIG5hbWUgb2NjdXJyaW5nIGluc2lkZSBhIHNsaWNlLiAgVGhlCisgICAgICAgIHZpc2l0b3IgaGFuZGxlcyB0aGVzZSBub2RlcyBzcGVjaWFsbHk7IHRoZXkgZG8gbm90IHByb3BhZ2F0ZQorICAgICAgICB0aGUgYXNzaWduIGZsYWcgdG8gdGhlaXIgY2hpbGRyZW4uCisgICAgICAgICIiIgorICAgICAgICBmb3IgbiBpbiBub2RlLm5vZGVzOgorICAgICAgICAgICAgc2VsZi52aXNpdChuLCBzY29wZSwgMSkKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIsIHNjb3BlKQorCisgICAgZGVmIHZpc2l0QXNzTmFtZShzZWxmLCBub2RlLCBzY29wZSwgYXNzaWduPTEpOgorICAgICAgICBzY29wZS5hZGRfZGVmKG5vZGUubmFtZSkKKworICAgIGRlZiB2aXNpdEFzc0F0dHIoc2VsZiwgbm9kZSwgc2NvcGUsIGFzc2lnbj0wKToKKyAgICAgICAgc2VsZi52aXNpdChub2RlLmV4cHIsIHNjb3BlLCAwKQorCisgICAgZGVmIHZpc2l0U3Vic2NyaXB0KHNlbGYsIG5vZGUsIHNjb3BlLCBhc3NpZ249MCk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByLCBzY29wZSwgMCkKKyAgICAgICAgZm9yIG4gaW4gbm9kZS5zdWJzOgorICAgICAgICAgICAgc2VsZi52aXNpdChuLCBzY29wZSwgMCkKKworICAgIGRlZiB2aXNpdFNsaWNlKHNlbGYsIG5vZGUsIHNjb3BlLCBhc3NpZ249MCk6CisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByLCBzY29wZSwgMCkKKyAgICAgICAgaWYgbm9kZS5sb3dlcjoKKyAgICAgICAgICAgIHNlbGYudmlzaXQobm9kZS5sb3dlciwgc2NvcGUsIDApCisgICAgICAgIGlmIG5vZGUudXBwZXI6CisgICAgICAgICAgICBzZWxmLnZpc2l0KG5vZGUudXBwZXIsIHNjb3BlLCAwKQorCisgICAgZGVmIHZpc2l0QXVnQXNzaWduKHNlbGYsIG5vZGUsIHNjb3BlKToKKyAgICAgICAgIyBJZiB0aGUgTEhTIGlzIGEgbmFtZSwgdGhlbiB0aGlzIGNvdW50cyBhcyBhc3NpZ25tZW50LgorICAgICAgICAjIE90aGVyd2lzZSwgaXQncyBqdXN0IHVzZS4KKyAgICAgICAgc2VsZi52aXNpdChub2RlLm5vZGUsIHNjb3BlKQorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUubm9kZSwgYXN0Lk5hbWUpOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLm5vZGUsIHNjb3BlLCAxKSAjIFhYWCB3b3JyeSBhYm91dCB0aGlzCisgICAgICAgIHNlbGYudmlzaXQobm9kZS5leHByLCBzY29wZSkKKworICAgICMgcHJ1bmUgaWYgc3RhdGVtZW50cyBpZiB0ZXN0cyBhcmUgZmFsc2UKKworICAgIF9jb25zdF90eXBlcyA9IHR5cGVzLlN0cmluZ1R5cGUsIHR5cGVzLkludFR5cGUsIHR5cGVzLkZsb2F0VHlwZQorCisgICAgZGVmIHZpc2l0SWYoc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBmb3IgdGVzdCwgYm9keSBpbiBub2RlLnRlc3RzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0LCBhc3QuQ29uc3QpOgorICAgICAgICAgICAgICAgIGlmIHR5cGUodGVzdC52YWx1ZSkgaW4gc2VsZi5fY29uc3RfdHlwZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB0ZXN0LnZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYudmlzaXQodGVzdCwgc2NvcGUpCisgICAgICAgICAgICBzZWxmLnZpc2l0KGJvZHksIHNjb3BlKQorICAgICAgICBpZiBub2RlLmVsc2VfOgorICAgICAgICAgICAgc2VsZi52aXNpdChub2RlLmVsc2VfLCBzY29wZSkKKworICAgICMgYSB5aWVsZCBzdGF0ZW1lbnQgc2lnbmFscyBhIGdlbmVyYXRvcgorCisgICAgZGVmIHZpc2l0WWllbGQoc2VsZiwgbm9kZSwgc2NvcGUpOgorICAgICAgICBzY29wZS5nZW5lcmF0b3IgPSAxCisgICAgICAgIHNlbGYudmlzaXQobm9kZS52YWx1ZSwgc2NvcGUpCisKK2RlZiBsaXN0X2VxKGwxLCBsMik6CisgICAgcmV0dXJuIHNvcnRlZChsMSkgPT0gc29ydGVkKGwyKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCBzeXMKKyAgICBmcm9tIGNvbXBpbGVyIGltcG9ydCBwYXJzZUZpbGUsIHdhbGsKKyAgICBpbXBvcnQgc3ltdGFibGUKKworICAgIGRlZiBnZXRfbmFtZXMoc3ltcyk6CisgICAgICAgIHJldHVybiBbcyBmb3IgcyBpbiBbcy5nZXRfbmFtZSgpIGZvciBzIGluIHN5bXMuZ2V0X3N5bWJvbHMoKV0KKyAgICAgICAgICAgICAgICBpZiBub3QgKHMuc3RhcnRzd2l0aCgnX1snKSBvciBzLnN0YXJ0c3dpdGgoJy4nKSldCisKKyAgICBmb3IgZmlsZSBpbiBzeXMuYXJndlsxOl06CisgICAgICAgIHByaW50IGZpbGUKKyAgICAgICAgZiA9IG9wZW4oZmlsZSkKKyAgICAgICAgYnVmID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHN5bXMgPSBzeW10YWJsZS5zeW10YWJsZShidWYsIGZpbGUsICJleGVjIikKKyAgICAgICAgbW9kX25hbWVzID0gZ2V0X25hbWVzKHN5bXMpCisgICAgICAgIHRyZWUgPSBwYXJzZUZpbGUoZmlsZSkKKyAgICAgICAgcyA9IFN5bWJvbFZpc2l0b3IoKQorICAgICAgICB3YWxrKHRyZWUsIHMpCisKKyAgICAgICAgIyBjb21wYXJlIG1vZHVsZS1sZXZlbCBzeW1ib2xzCisgICAgICAgIG5hbWVzMiA9IHMuc2NvcGVzW3RyZWVdLmdldF9uYW1lcygpCisKKyAgICAgICAgaWYgbm90IGxpc3RfZXEobW9kX25hbWVzLCBuYW1lczIpOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICJvb3BzIiwgZmlsZQorICAgICAgICAgICAgcHJpbnQgc29ydGVkKG1vZF9uYW1lcykKKyAgICAgICAgICAgIHByaW50IHNvcnRlZChuYW1lczIpCisgICAgICAgICAgICBzeXMuZXhpdCgtMSkKKworICAgICAgICBkID0ge30KKyAgICAgICAgZC51cGRhdGUocy5zY29wZXMpCisgICAgICAgIGRlbCBkW3RyZWVdCisgICAgICAgIHNjb3BlcyA9IGQudmFsdWVzKCkKKyAgICAgICAgZGVsIGQKKworICAgICAgICBmb3IgcyBpbiBzeW1zLmdldF9zeW1ib2xzKCk6CisgICAgICAgICAgICBpZiBzLmlzX25hbWVzcGFjZSgpOgorICAgICAgICAgICAgICAgIGwgPSBbc2MgZm9yIHNjIGluIHNjb3BlcworICAgICAgICAgICAgICAgICAgICAgaWYgc2MubmFtZSA9PSBzLmdldF9uYW1lKCldCisgICAgICAgICAgICAgICAgaWYgbGVuKGwpID4gMToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNraXBwaW5nIiwgcy5nZXRfbmFtZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpc3RfZXEoZ2V0X25hbWVzKHMuZ2V0X25hbWVzcGFjZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbFswXS5nZXRfbmFtZXMoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBzLmdldF9uYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHNvcnRlZChnZXRfbmFtZXMocy5nZXRfbmFtZXNwYWNlKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc29ydGVkKGxbMF0uZ2V0X25hbWVzKCkpCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgtMSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ltYm9scy5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMDBkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ltYm9scy5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZDlmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bWJvbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ludGF4LnB5IGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW50YXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1ZDljMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvc3ludGF4LnB5CkBAIC0wLDAgKzEsNDYgQEAKKyIiIkNoZWNrIGZvciBlcnJzIGluIHRoZSBBU1QuCisKK1RoZSBQeXRob24gcGFyc2VyIGRvZXMgbm90IGNhdGNoIGFsbCBzeW50YXggZXJyb3JzLiAgT3RoZXJzLCBsaWtlCithc3NpZ25tZW50cyB3aXRoIGludmFsaWQgdGFyZ2V0cywgYXJlIGNhdWdodCBpbiB0aGUgY29kZSBnZW5lcmF0aW9uCitwaGFzZS4KKworVGhlIGNvbXBpbGVyIHBhY2thZ2UgY2F0Y2hlcyBzb21lIGVycm9ycyBpbiB0aGUgdHJhbnNmb3JtZXIgbW9kdWxlLgorQnV0IGl0IHNlZW1zIGNsZWFyZXIgdG8gd3JpdGUgY2hlY2tlcnMgdGhhdCB1c2UgdGhlIEFTVCB0byBkZXRlY3QKK2Vycm9ycy4KKyIiIgorCitmcm9tIGNvbXBpbGVyIGltcG9ydCBhc3QsIHdhbGsKKworZGVmIGNoZWNrKHRyZWUsIG11bHRpPU5vbmUpOgorICAgIHYgPSBTeW50YXhFcnJvckNoZWNrZXIobXVsdGkpCisgICAgd2Fsayh0cmVlLCB2KQorICAgIHJldHVybiB2LmVycm9ycworCitjbGFzcyBTeW50YXhFcnJvckNoZWNrZXI6CisgICAgIiIiQSB2aXNpdG9yIHRvIGZpbmQgc3ludGF4IGVycm9ycyBpbiB0aGUgQVNULiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG11bHRpPU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgbmV3IHZpc2l0b3Igb2JqZWN0LgorCisgICAgICAgIElmIG9wdGlvbmFsIGFyZ3VtZW50IG11bHRpIGlzIG5vdCBOb25lLCB0aGVuIHByaW50IG1lc3NhZ2VzCisgICAgICAgIGZvciBlYWNoIGVycm9yIHJhdGhlciB0aGFuIHJhaXNpbmcgYSBTeW50YXhFcnJvciBmb3IgdGhlCisgICAgICAgIGZpcnN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5tdWx0aSA9IG11bHRpCisgICAgICAgIHNlbGYuZXJyb3JzID0gMAorCisgICAgZGVmIGVycm9yKHNlbGYsIG5vZGUsIG1zZyk6CisgICAgICAgIHNlbGYuZXJyb3JzID0gc2VsZi5lcnJvcnMgKyAxCisgICAgICAgIGlmIHNlbGYubXVsdGkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCAiJXM6JXM6ICVzIiAlIChub2RlLmZpbGVuYW1lLCBub2RlLmxpbmVubywgbXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICIlcyAoJXM6JXMpIiAlIChtc2csIG5vZGUuZmlsZW5hbWUsIG5vZGUubGluZW5vKQorCisgICAgZGVmIHZpc2l0QXNzaWduKHNlbGYsIG5vZGUpOgorICAgICAgICAjIHRoZSB0cmFuc2Zvcm1lciBtb2R1bGUgaGFuZGxlcyBtYW55IG9mIHRoZXNlCisgICAgICAgIHBhc3MKKyMjICAgICAgICBmb3IgdGFyZ2V0IGluIG5vZGUubm9kZXM6CisjIyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGFyZ2V0LCBhc3QuQXNzTGlzdCk6CisjIyAgICAgICAgICAgICAgICBpZiB0YXJnZXQubGluZW5vIGlzIE5vbmU6CisjIyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmxpbmVubyA9IG5vZGUubGluZW5vCisjIyAgICAgICAgICAgICAgICBzZWxmLmVycm9yKHRhcmdldCwgImNhbid0IGFzc2lnbiB0byBsaXN0IGNvbXByZWhlbnNpb24iKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW50YXgucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW50YXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmUzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bnRheC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW50YXgucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci9zeW50YXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmUzOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3N5bnRheC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci90cmFuc2Zvcm1lci5weSBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmNDYxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkKQEAgLTAsMCArMSwxNTM1IEBACisiIiJQYXJzZSB0cmVlIHRyYW5zZm9ybWF0aW9uIG1vZHVsZS4KKworVHJhbnNmb3JtcyBQeXRob24gc291cmNlIGNvZGUgaW50byBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSAoQVNUKQorZGVmaW5lZCBpbiB0aGUgYXN0IG1vZHVsZS4KKworVGhlIHNpbXBsZXN0IHdheXMgdG8gaW52b2tlIHRoaXMgbW9kdWxlIGFyZSB2aWEgcGFyc2UgYW5kIHBhcnNlRmlsZS4KK3BhcnNlKGJ1ZikgLT4gQVNUCitwYXJzZUZpbGUocGF0aCkgLT4gQVNUCisiIiIKKworIyBPcmlnaW5hbCB2ZXJzaW9uIHdyaXR0ZW4gYnkgR3JlZyBTdGVpbiAoZ3N0ZWluQGx5cmEub3JnKQorIyAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgQmlsbCBUdXR0IChyYXNzaWxvbkBsaW1hLm11ZGxpYi5vcmcpCisjIEZlYnJ1YXJ5IDE5OTcuCisjCisjIE1vZGlmaWNhdGlvbnMgYW5kIGltcHJvdmVtZW50cyBmb3IgUHl0aG9uIDIuMCBieSBKZXJlbXkgSHlsdG9uIGFuZAorIyBNYXJrIEhhbW1vbmQKKyMKKyMgU29tZSBmaXhlcyB0byB0cnkgdG8gaGF2ZSBjb3JyZWN0IGxpbmUgbnVtYmVyIG9uIGFsbW9zdCBhbGwgbm9kZXMKKyMgKGV4Y2VwdCBNb2R1bGUsIERpc2NhcmQgYW5kIFN0bXQpIGFkZGVkIGJ5IFN5bHZhaW4gVGhlbmF1bHQKKyMKKyMgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZToKKyMgQ29weXJpZ2h0IChDKSAxOTk3LTE5OTggR3JlZyBTdGVpbi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgVGhpcyBtb2R1bGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBCU0QtaXNoIGxpY2Vuc2UuIFNlZQorIyAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UuaHRtbAorIyBhbmQgcmVwbGFjZSBPV05FUiwgT1JHQU5JWkFUSU9OLCBhbmQgWUVBUiBhcyBhcHByb3ByaWF0ZS4KKworZnJvbSBjb21waWxlci5hc3QgaW1wb3J0ICoKK2ltcG9ydCBwYXJzZXIKK2ltcG9ydCBzeW1ib2wKK2ltcG9ydCB0b2tlbgorCitjbGFzcyBXYWxrZXJFcnJvcihTdGFuZGFyZEVycm9yKToKKyAgICBwYXNzCisKK2Zyb20gY29tcGlsZXIuY29uc3RzIGltcG9ydCBDT19WQVJBUkdTLCBDT19WQVJLRVlXT1JEUworZnJvbSBjb21waWxlci5jb25zdHMgaW1wb3J0IE9QX0FTU0lHTiwgT1BfREVMRVRFLCBPUF9BUFBMWQorCitkZWYgcGFyc2VGaWxlKHBhdGgpOgorICAgIGYgPSBvcGVuKHBhdGgsICJVIikKKyAgICAjIFhYWCBUaGUgcGFyc2VyIEFQSSB0b2xlcmF0ZXMgZmlsZXMgd2l0aG91dCBhIHRyYWlsaW5nIG5ld2xpbmUsCisgICAgIyBidXQgbm90IHN0cmluZ3Mgd2l0aG91dCBhIHRyYWlsaW5nIG5ld2xpbmUuICBBbHdheXMgYWRkIGFuIGV4dHJhCisgICAgIyBuZXdsaW5lIHRvIHRoZSBmaWxlIGNvbnRlbnRzLCBzaW5jZSB3ZSdyZSBnb2luZyB0aHJvdWdoIHRoZSBzdHJpbmcKKyAgICAjIHZlcnNpb24gb2YgdGhlIEFQSS4KKyAgICBzcmMgPSBmLnJlYWQoKSArICJcbiIKKyAgICBmLmNsb3NlKCkKKyAgICByZXR1cm4gcGFyc2Uoc3JjKQorCitkZWYgcGFyc2UoYnVmLCBtb2RlPSJleGVjIik6CisgICAgaWYgbW9kZSA9PSAiZXhlYyIgb3IgbW9kZSA9PSAic2luZ2xlIjoKKyAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVyKCkucGFyc2VzdWl0ZShidWYpCisgICAgZWxpZiBtb2RlID09ICJldmFsIjoKKyAgICAgICAgcmV0dXJuIFRyYW5zZm9ybWVyKCkucGFyc2VleHByKGJ1ZikKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjb21waWxlKCkgYXJnIDMgbXVzdCBiZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICdleGVjJyBvciAnZXZhbCcgb3IgJ3NpbmdsZSciKQorCitkZWYgYXNMaXN0KG5vZGVzKToKKyAgICBsID0gW10KKyAgICBmb3IgaXRlbSBpbiBub2RlczoKKyAgICAgICAgaWYgaGFzYXR0cihpdGVtLCAiYXNMaXN0Iik6CisgICAgICAgICAgICBsLmFwcGVuZChpdGVtLmFzTGlzdCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdHlwZShpdGVtKSBpcyB0eXBlKCAoTm9uZSwgTm9uZSkgKToKKyAgICAgICAgICAgICAgICBsLmFwcGVuZCh0dXBsZShhc0xpc3QoaXRlbSkpKQorICAgICAgICAgICAgZWxpZiB0eXBlKGl0ZW0pIGlzIHR5cGUoIFtdICk6CisgICAgICAgICAgICAgICAgbC5hcHBlbmQoYXNMaXN0KGl0ZW0pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsLmFwcGVuZChpdGVtKQorICAgIHJldHVybiBsCisKK2RlZiBleHRyYWN0TGluZU5vKGFzdCk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UoYXN0WzFdLCB0dXBsZSk6CisgICAgICAgICMgZ2V0IGEgdGVybWluYWwgbm9kZQorICAgICAgICByZXR1cm4gYXN0WzJdCisgICAgZm9yIGNoaWxkIGluIGFzdFsxOl06CisgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hpbGQsIHR1cGxlKToKKyAgICAgICAgICAgIGxpbmVubyA9IGV4dHJhY3RMaW5lTm8oY2hpbGQpCisgICAgICAgICAgICBpZiBsaW5lbm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVubworCitkZWYgTm9kZSgqYXJncyk6CisgICAga2luZCA9IGFyZ3NbMF0KKyAgICBpZiBraW5kIGluIG5vZGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gbm9kZXNba2luZF0oKmFyZ3NbMTpdKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcHJpbnQgbm9kZXNba2luZF0sIGxlbihhcmdzKSwgYXJncworICAgICAgICAgICAgcmFpc2UKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvciwgIkNhbid0IGZpbmQgYXBwcm9wcmlhdGUgTm9kZSB0eXBlOiAlcyIgJSBzdHIoYXJncykKKyAgICAgICAgI3JldHVybiBhcHBseShhc3QuTm9kZSwgYXJncykKKworY2xhc3MgVHJhbnNmb3JtZXI6CisgICAgIiIiVXRpbGl0eSBvYmplY3QgZm9yIHRyYW5zZm9ybWluZyBQeXRob24gcGFyc2UgdHJlZXMuCisKKyAgICBFeHBvc2VzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKyAgICAgICAgdHJlZSA9IHRyYW5zZm9ybShhc3RfdHJlZSkKKyAgICAgICAgdHJlZSA9IHBhcnNlc3VpdGUodGV4dCkKKyAgICAgICAgdHJlZSA9IHBhcnNlZXhwcih0ZXh0KQorICAgICAgICB0cmVlID0gcGFyc2VmaWxlKGZpbGVvYiB8IGZpbGVuYW1lKQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9kaXNwYXRjaCA9IHt9CisgICAgICAgIGZvciB2YWx1ZSwgbmFtZSBpbiBzeW1ib2wuc3ltX25hbWUuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fZGlzcGF0Y2hbdmFsdWVdID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorICAgICAgICBzZWxmLl9kaXNwYXRjaFt0b2tlbi5ORVdMSU5FXSA9IHNlbGYuY29tX05FV0xJTkUKKyAgICAgICAgc2VsZi5fYXRvbV9kaXNwYXRjaCA9IHt0b2tlbi5MUEFSOiBzZWxmLmF0b21fbHBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5MU1FCOiBzZWxmLmF0b21fbHNxYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5MQlJBQ0U6IHNlbGYuYXRvbV9sYnJhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uQkFDS1FVT1RFOiBzZWxmLmF0b21fYmFja3F1b3RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLk5VTUJFUjogc2VsZi5hdG9tX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5TVFJJTkc6IHNlbGYuYXRvbV9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4uTkFNRTogc2VsZi5hdG9tX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBzZWxmLmVuY29kaW5nID0gTm9uZQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCB0cmVlKToKKyAgICAgICAgIiIiVHJhbnNmb3JtIGFuIEFTVCBpbnRvIGEgbW9kaWZpZWQgcGFyc2UgdHJlZS4iIiIKKyAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKHRyZWUsIHR1cGxlKSBvciBpc2luc3RhbmNlKHRyZWUsIGxpc3QpKToKKyAgICAgICAgICAgIHRyZWUgPSBwYXJzZXIuc3QydHVwbGUodHJlZSwgbGluZV9pbmZvPTEpCisgICAgICAgIHJldHVybiBzZWxmLmNvbXBpbGVfbm9kZSh0cmVlKQorCisgICAgZGVmIHBhcnNlc3VpdGUoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIlJldHVybiBhIG1vZGlmaWVkIHBhcnNlIHRyZWUgZm9yIHRoZSBnaXZlbiBzdWl0ZSB0ZXh0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50cmFuc2Zvcm0ocGFyc2VyLnN1aXRlKHRleHQpKQorCisgICAgZGVmIHBhcnNlZXhwcihzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiUmV0dXJuIGEgbW9kaWZpZWQgcGFyc2UgdHJlZSBmb3IgdGhlIGdpdmVuIGV4cHJlc3Npb24gdGV4dC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhbnNmb3JtKHBhcnNlci5leHByKHRleHQpKQorCisgICAgZGVmIHBhcnNlZmlsZShzZWxmLCBmaWxlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbW9kaWZpZWQgcGFyc2UgdHJlZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBmaWxlLiIiIgorICAgICAgICBpZiB0eXBlKGZpbGUpID09IHR5cGUoJycpOgorICAgICAgICAgICAgZmlsZSA9IG9wZW4oZmlsZSkKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VzdWl0ZShmaWxlLnJlYWQoKSkKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjCisgICAgIyBQUklWQVRFIE1FVEhPRFMKKyAgICAjCisKKyAgICBkZWYgY29tcGlsZV9ub2RlKHNlbGYsIG5vZGUpOgorICAgICAgICAjIyMgZW1pdCBhIGxpbmUtbnVtYmVyIG5vZGU/CisgICAgICAgIG4gPSBub2RlWzBdCisKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuZW5jb2RpbmdfZGVjbDoKKyAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBub2RlWzJdCisgICAgICAgICAgICBub2RlID0gbm9kZVsxXQorICAgICAgICAgICAgbiA9IG5vZGVbMF0KKworICAgICAgICBpZiBuID09IHN5bWJvbC5zaW5nbGVfaW5wdXQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zaW5nbGVfaW5wdXQobm9kZVsxOl0pCisgICAgICAgIGlmIG4gPT0gc3ltYm9sLmZpbGVfaW5wdXQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlX2lucHV0KG5vZGVbMTpdKQorICAgICAgICBpZiBuID09IHN5bWJvbC5ldmFsX2lucHV0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXZhbF9pbnB1dChub2RlWzE6XSkKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wubGFtYmRlZjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxhbWJkZWYobm9kZVsxOl0pCisgICAgICAgIGlmIG4gPT0gc3ltYm9sLmZ1bmNkZWY6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mdW5jZGVmKG5vZGVbMTpdKQorICAgICAgICBpZiBuID09IHN5bWJvbC5jbGFzc2RlZjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNsYXNzZGVmKG5vZGVbMTpdKQorCisgICAgICAgIHJhaXNlIFdhbGtlckVycm9yLCAoJ3VuZXhwZWN0ZWQgbm9kZSB0eXBlJywgbikKKworICAgIGRlZiBzaW5nbGVfaW5wdXQoc2VsZiwgbm9kZSk6CisgICAgICAgICMjIyBkbyB3ZSB3YW50IHRvIGRvIGFueXRoaW5nIGFib3V0IGJlaW5nICJpbnRlcmFjdGl2ZSIgPworCisgICAgICAgICMgTkVXTElORSB8IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdCBORVdMSU5FCisgICAgICAgIG4gPSBub2RlWzBdWzBdCisgICAgICAgIGlmIG4gIT0gdG9rZW4uTkVXTElORToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9zdG10KG5vZGVbMF0pCisKKyAgICAgICAgcmV0dXJuIFBhc3MoKQorCisgICAgZGVmIGZpbGVfaW5wdXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBkb2MgPSBzZWxmLmdldF9kb2NzdHJpbmcobm9kZWxpc3QsIHN5bWJvbC5maWxlX2lucHV0KQorICAgICAgICBpZiBkb2MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgc3RtdHMgPSBbXQorICAgICAgICBmb3Igbm9kZSBpbiBub2RlbGlzdFtpOl06CisgICAgICAgICAgICBpZiBub2RlWzBdICE9IHRva2VuLkVORE1BUktFUiBhbmQgbm9kZVswXSAhPSB0b2tlbi5ORVdMSU5FOgorICAgICAgICAgICAgICAgIHNlbGYuY29tX2FwcGVuZF9zdG10KHN0bXRzLCBub2RlKQorICAgICAgICByZXR1cm4gTW9kdWxlKGRvYywgU3RtdChzdG10cykpCisKKyAgICBkZWYgZXZhbF9pbnB1dChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgZnJvbSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gaW5wdXQoKQorICAgICAgICAjIyMgaXMgdGhpcyBzdWZmaWNpZW50PworICAgICAgICByZXR1cm4gRXhwcmVzc2lvbihzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKSkKKworICAgIGRlZiBkZWNvcmF0b3JfbmFtZShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIGxpc3RsZW4gPSBsZW4obm9kZWxpc3QpCisgICAgICAgIGFzc2VydCBsaXN0bGVuID49IDEgYW5kIGxpc3RsZW4gJSAyID09IDEKKworICAgICAgICBpdGVtID0gc2VsZi5hdG9tX25hbWUobm9kZWxpc3QpCisgICAgICAgIGkgPSAxCisgICAgICAgIHdoaWxlIGkgPCBsaXN0bGVuOgorICAgICAgICAgICAgYXNzZXJ0IG5vZGVsaXN0W2ldWzBdID09IHRva2VuLkRPVAorICAgICAgICAgICAgYXNzZXJ0IG5vZGVsaXN0W2kgKyAxXVswXSA9PSB0b2tlbi5OQU1FCisgICAgICAgICAgICBpdGVtID0gR2V0YXR0cihpdGVtLCBub2RlbGlzdFtpICsgMV1bMV0pCisgICAgICAgICAgICBpICs9IDIKKworICAgICAgICByZXR1cm4gaXRlbQorCisgICAgZGVmIGRlY29yYXRvcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgJ0AnIGRvdHRlZF9uYW1lIFsgJygnIFthcmdsaXN0XSAnKScgXQorICAgICAgICBhc3NlcnQgbGVuKG5vZGVsaXN0KSBpbiAoMywgNSwgNikKKyAgICAgICAgYXNzZXJ0IG5vZGVsaXN0WzBdWzBdID09IHRva2VuLkFUCisgICAgICAgIGFzc2VydCBub2RlbGlzdFstMV1bMF0gPT0gdG9rZW4uTkVXTElORQorCisgICAgICAgIGFzc2VydCBub2RlbGlzdFsxXVswXSA9PSBzeW1ib2wuZG90dGVkX25hbWUKKyAgICAgICAgZnVuY25hbWUgPSBzZWxmLmRlY29yYXRvcl9uYW1lKG5vZGVsaXN0WzFdWzE6XSkKKworICAgICAgICBpZiBsZW4obm9kZWxpc3QpID4gMzoKKyAgICAgICAgICAgIGFzc2VydCBub2RlbGlzdFsyXVswXSA9PSB0b2tlbi5MUEFSCisgICAgICAgICAgICBleHByID0gc2VsZi5jb21fY2FsbF9mdW5jdGlvbihmdW5jbmFtZSwgbm9kZWxpc3RbM10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHByID0gZnVuY25hbWUKKworICAgICAgICByZXR1cm4gZXhwcgorCisgICAgZGVmIGRlY29yYXRvcnMoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGRlY29yYXRvcnM6IGRlY29yYXRvciAoW05FV0xJTkVdIGRlY29yYXRvcikqIE5FV0xJTkUKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBmb3IgZGVjX25vZGVsaXN0IGluIG5vZGVsaXN0OgorICAgICAgICAgICAgYXNzZXJ0IGRlY19ub2RlbGlzdFswXSA9PSBzeW1ib2wuZGVjb3JhdG9yCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQoc2VsZi5kZWNvcmF0b3IoZGVjX25vZGVsaXN0WzE6XSkpCisgICAgICAgIHJldHVybiBEZWNvcmF0b3JzKGl0ZW1zKQorCisgICAgZGVmIGRlY29yYXRlZChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIGFzc2VydCBub2RlbGlzdFswXVswXSA9PSBzeW1ib2wuZGVjb3JhdG9ycworICAgICAgICBpZiBub2RlbGlzdFsxXVswXSA9PSBzeW1ib2wuZnVuY2RlZjoKKyAgICAgICAgICAgIG4gPSBbbm9kZWxpc3RbMF1dICsgbGlzdChub2RlbGlzdFsxXVsxOl0pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5mdW5jZGVmKG4pCisgICAgICAgIGVsaWYgbm9kZWxpc3RbMV1bMF0gPT0gc3ltYm9sLmNsYXNzZGVmOgorICAgICAgICAgICAgZGVjb3JhdG9ycyA9IHNlbGYuZGVjb3JhdG9ycyhub2RlbGlzdFswXVsxOl0pCisgICAgICAgICAgICBjbHMgPSBzZWxmLmNsYXNzZGVmKG5vZGVsaXN0WzFdWzE6XSkKKyAgICAgICAgICAgIGNscy5kZWNvcmF0b3JzID0gZGVjb3JhdG9ycworICAgICAgICAgICAgcmV0dXJuIGNscworICAgICAgICByYWlzZSBXYWxrZXJFcnJvcigpCisKKyAgICBkZWYgZnVuY2RlZihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgICAgICAgICAgICAgICAgICAgIC02ICAgLTUgICAgLTQgICAgICAgICAtMyAgLTIgICAgLTEKKyAgICAgICAgIyBmdW5jZGVmOiBbZGVjb3JhdG9yc10gJ2RlZicgTkFNRSBwYXJhbWV0ZXJzICc6JyBzdWl0ZQorICAgICAgICAjIHBhcmFtZXRlcnM6ICcoJyBbdmFyYXJnc2xpc3RdICcpJworCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gNjoKKyAgICAgICAgICAgIGFzc2VydCBub2RlbGlzdFswXVswXSA9PSBzeW1ib2wuZGVjb3JhdG9ycworICAgICAgICAgICAgZGVjb3JhdG9ycyA9IHNlbGYuZGVjb3JhdG9ycyhub2RlbGlzdFswXVsxOl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgbGVuKG5vZGVsaXN0KSA9PSA1CisgICAgICAgICAgICBkZWNvcmF0b3JzID0gTm9uZQorCisgICAgICAgIGxpbmVubyA9IG5vZGVsaXN0Wy00XVsyXQorICAgICAgICBuYW1lID0gbm9kZWxpc3RbLTRdWzFdCisgICAgICAgIGFyZ3MgPSBub2RlbGlzdFstM11bMl0KKworICAgICAgICBpZiBhcmdzWzBdID09IHN5bWJvbC52YXJhcmdzbGlzdDoKKyAgICAgICAgICAgIG5hbWVzLCBkZWZhdWx0cywgZmxhZ3MgPSBzZWxmLmNvbV9hcmdsaXN0KGFyZ3NbMTpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZXMgPSBkZWZhdWx0cyA9ICgpCisgICAgICAgICAgICBmbGFncyA9IDAKKyAgICAgICAgZG9jID0gc2VsZi5nZXRfZG9jc3RyaW5nKG5vZGVsaXN0Wy0xXSkKKworICAgICAgICAjIGNvZGUgZm9yIGZ1bmN0aW9uCisgICAgICAgIGNvZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0Wy0xXSkKKworICAgICAgICBpZiBkb2MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjb2RlLCBTdG10KQorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29kZS5ub2Rlc1swXSwgRGlzY2FyZCkKKyAgICAgICAgICAgIGRlbCBjb2RlLm5vZGVzWzBdCisgICAgICAgIHJldHVybiBGdW5jdGlvbihkZWNvcmF0b3JzLCBuYW1lLCBuYW1lcywgZGVmYXVsdHMsIGZsYWdzLCBkb2MsIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bGluZW5vKQorCisgICAgZGVmIGxhbWJkZWYoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGxhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKKyAgICAgICAgaWYgbm9kZWxpc3RbMl1bMF0gPT0gc3ltYm9sLnZhcmFyZ3NsaXN0OgorICAgICAgICAgICAgbmFtZXMsIGRlZmF1bHRzLCBmbGFncyA9IHNlbGYuY29tX2FyZ2xpc3Qobm9kZWxpc3RbMl1bMTpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZXMgPSBkZWZhdWx0cyA9ICgpCisgICAgICAgICAgICBmbGFncyA9IDAKKworICAgICAgICAjIGNvZGUgZm9yIGxhbWJkYQorICAgICAgICBjb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFstMV0pCisKKyAgICAgICAgcmV0dXJuIExhbWJkYShuYW1lcywgZGVmYXVsdHMsIGZsYWdzLCBjb2RlLCBsaW5lbm89bm9kZWxpc3RbMV1bMl0pCisgICAgb2xkX2xhbWJkZWYgPSBsYW1iZGVmCisKKyAgICBkZWYgY2xhc3NkZWYoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGNsYXNzZGVmOiAnY2xhc3MnIE5BTUUgWycoJyBbdGVzdGxpc3RdICcpJ10gJzonIHN1aXRlCisKKyAgICAgICAgbmFtZSA9IG5vZGVsaXN0WzFdWzFdCisgICAgICAgIGRvYyA9IHNlbGYuZ2V0X2RvY3N0cmluZyhub2RlbGlzdFstMV0pCisgICAgICAgIGlmIG5vZGVsaXN0WzJdWzBdID09IHRva2VuLkNPTE9OOgorICAgICAgICAgICAgYmFzZXMgPSBbXQorICAgICAgICBlbGlmIG5vZGVsaXN0WzNdWzBdID09IHRva2VuLlJQQVI6CisgICAgICAgICAgICBiYXNlcyA9IFtdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlcyA9IHNlbGYuY29tX2Jhc2VzKG5vZGVsaXN0WzNdKQorCisgICAgICAgICMgY29kZSBmb3IgY2xhc3MKKyAgICAgICAgY29kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbLTFdKQorCisgICAgICAgIGlmIGRvYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvZGUsIFN0bXQpCisgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShjb2RlLm5vZGVzWzBdLCBEaXNjYXJkKQorICAgICAgICAgICAgZGVsIGNvZGUubm9kZXNbMF0KKworICAgICAgICByZXR1cm4gQ2xhc3MobmFtZSwgYmFzZXMsIGRvYywgY29kZSwgbGluZW5vPW5vZGVsaXN0WzFdWzJdKQorCisgICAgZGVmIHN0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gc2VsZi5jb21fc3RtdChub2RlbGlzdFswXSkKKworICAgIHNtYWxsX3N0bXQgPSBzdG10CisgICAgZmxvd19zdG10ID0gc3RtdAorICAgIGNvbXBvdW5kX3N0bXQgPSBzdG10CisKKyAgICBkZWYgc2ltcGxlX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHNtYWxsX3N0bXQgKCc7JyBzbWFsbF9zdG10KSogWyc7J10gTkVXTElORQorICAgICAgICBzdG10cyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihub2RlbGlzdCksIDIpOgorICAgICAgICAgICAgc2VsZi5jb21fYXBwZW5kX3N0bXQoc3RtdHMsIG5vZGVsaXN0W2ldKQorICAgICAgICByZXR1cm4gU3RtdChzdG10cykKKworICAgIGRlZiBwYXJhbWV0ZXJzKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IKKworICAgIGRlZiB2YXJhcmdzbGlzdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJhaXNlIFdhbGtlckVycm9yCisKKyAgICBkZWYgZnBkZWYoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvcgorCisgICAgZGVmIGZwbGlzdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJhaXNlIFdhbGtlckVycm9yCisKKyAgICBkZWYgZG90dGVkX25hbWUoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvcgorCisgICAgZGVmIGNvbXBfb3Aoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvcgorCisgICAgZGVmIHRyYWlsZXIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvcgorCisgICAgZGVmIHNsaWNlb3Aoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByYWlzZSBXYWxrZXJFcnJvcgorCisgICAgZGVmIGFyZ3VtZW50KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmFpc2UgV2Fsa2VyRXJyb3IKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjCisgICAgIyBTVEFURU1FTlQgTk9ERVMgIChpbnZva2VkIGJ5IGNvbV9ub2RlKCkpCisgICAgIworCisgICAgZGVmIGV4cHJfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgYXVnYXNzaWduIHRlc3RsaXN0IHwgdGVzdGxpc3QgKCc9JyB0ZXN0bGlzdCkqCisgICAgICAgIGVuID0gbm9kZWxpc3RbLTFdCisgICAgICAgIGV4cHJOb2RlID0gc2VsZi5sb29rdXBfbm9kZShlbikoZW5bMTpdKQorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDE6CisgICAgICAgICAgICByZXR1cm4gRGlzY2FyZChleHByTm9kZSwgbGluZW5vPWV4cHJOb2RlLmxpbmVubykKKyAgICAgICAgaWYgbm9kZWxpc3RbMV1bMF0gPT0gdG9rZW4uRVFVQUw6CisgICAgICAgICAgICBub2Rlc2wgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKG5vZGVsaXN0KSAtIDIsIDIpOgorICAgICAgICAgICAgICAgIG5vZGVzbC5hcHBlbmQoc2VsZi5jb21fYXNzaWduKG5vZGVsaXN0W2ldLCBPUF9BU1NJR04pKQorICAgICAgICAgICAgcmV0dXJuIEFzc2lnbihub2Rlc2wsIGV4cHJOb2RlLCBsaW5lbm89bm9kZWxpc3RbMV1bMl0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsdmFsID0gc2VsZi5jb21fYXVnYXNzaWduKG5vZGVsaXN0WzBdKQorICAgICAgICAgICAgb3AgPSBzZWxmLmNvbV9hdWdhc3NpZ25fb3Aobm9kZWxpc3RbMV0pCisgICAgICAgICAgICByZXR1cm4gQXVnQXNzaWduKGx2YWwsIG9wWzFdLCBleHByTm9kZSwgbGluZW5vPW9wWzJdKQorICAgICAgICByYWlzZSBXYWxrZXJFcnJvciwgImNhbid0IGdldCBoZXJlIgorCisgICAgZGVmIHByaW50X3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHByaW50IChbIHRlc3QgKCcsJyB0ZXN0KSogWycsJ10gXSB8ICc+PicgdGVzdCBbICgnLCcgdGVzdCkrIFsnLCddIF0pCisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAxOgorICAgICAgICAgICAgc3RhcnQgPSAxCisgICAgICAgICAgICBkZXN0ID0gTm9uZQorICAgICAgICBlbGlmIG5vZGVsaXN0WzFdWzBdID09IHRva2VuLlJJR0hUU0hJRlQ6CisgICAgICAgICAgICBhc3NlcnQgbGVuKG5vZGVsaXN0KSA9PSAzIFwKKyAgICAgICAgICAgICAgICAgICBvciBub2RlbGlzdFszXVswXSA9PSB0b2tlbi5DT01NQQorICAgICAgICAgICAgZGVzdCA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pCisgICAgICAgICAgICBzdGFydCA9IDQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlc3QgPSBOb25lCisgICAgICAgICAgICBzdGFydCA9IDEKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhcnQsIGxlbihub2RlbGlzdCksIDIpOgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHNlbGYuY29tX25vZGUobm9kZWxpc3RbaV0pKQorICAgICAgICBpZiBub2RlbGlzdFstMV1bMF0gPT0gdG9rZW4uQ09NTUE6CisgICAgICAgICAgICByZXR1cm4gUHJpbnQoaXRlbXMsIGRlc3QsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgcmV0dXJuIFByaW50bmwoaXRlbXMsIGRlc3QsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiBkZWxfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbV9hc3NpZ24obm9kZWxpc3RbMV0sIE9QX0RFTEVURSkKKworICAgIGRlZiBwYXNzX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gUGFzcyhsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgYnJlYWtfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJldHVybiBCcmVhayhsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgY29udGludWVfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJldHVybiBDb250aW51ZShsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgcmV0dXJuX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHJldHVybjogW3Rlc3RsaXN0XQorICAgICAgICBpZiBsZW4obm9kZWxpc3QpIDwgMjoKKyAgICAgICAgICAgIHJldHVybiBSZXR1cm4oQ29uc3QoTm9uZSksIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgcmV0dXJuIFJldHVybihzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIHlpZWxkX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBleHByID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFswXSkKKyAgICAgICAgcmV0dXJuIERpc2NhcmQoZXhwciwgbGluZW5vPWV4cHIubGluZW5vKQorCisgICAgZGVmIHlpZWxkX2V4cHIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID4gMToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFsxXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gQ29uc3QoTm9uZSkKKyAgICAgICAgcmV0dXJuIFlpZWxkKHZhbHVlLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgcmFpc2Vfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgcmFpc2U6IFt0ZXN0IFsnLCcgdGVzdCBbJywnIHRlc3RdXV0KKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+IDU6CisgICAgICAgICAgICBleHByMyA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbNV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHByMyA9IE5vbmUKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+IDM6CisgICAgICAgICAgICBleHByMiA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbM10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHByMiA9IE5vbmUKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+IDE6CisgICAgICAgICAgICBleHByMSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHByMSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIFJhaXNlKGV4cHIxLCBleHByMiwgZXhwcjMsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiBpbXBvcnRfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgaW1wb3J0X3N0bXQ6IGltcG9ydF9uYW1lIHwgaW1wb3J0X2Zyb20KKyAgICAgICAgYXNzZXJ0IGxlbihub2RlbGlzdCkgPT0gMQorICAgICAgICByZXR1cm4gc2VsZi5jb21fbm9kZShub2RlbGlzdFswXSkKKworICAgIGRlZiBpbXBvcnRfbmFtZShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgaW1wb3J0X25hbWU6ICdpbXBvcnQnIGRvdHRlZF9hc19uYW1lcworICAgICAgICByZXR1cm4gSW1wb3J0KHNlbGYuY29tX2RvdHRlZF9hc19uYW1lcyhub2RlbGlzdFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGltcG9ydF9mcm9tKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBpbXBvcnRfZnJvbTogJ2Zyb20nICgnLicqIGRvdHRlZF9uYW1lIHwgJy4nKSAnaW1wb3J0JyAoJyonIHwKKyAgICAgICAgIyAgICAnKCcgaW1wb3J0X2FzX25hbWVzICcpJyB8IGltcG9ydF9hc19uYW1lcykKKyAgICAgICAgYXNzZXJ0IG5vZGVsaXN0WzBdWzFdID09ICdmcm9tJworICAgICAgICBpZHggPSAxCisgICAgICAgIHdoaWxlIG5vZGVsaXN0W2lkeF1bMV0gPT0gJy4nOgorICAgICAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgbGV2ZWwgPSBpZHggLSAxCisgICAgICAgIGlmIG5vZGVsaXN0W2lkeF1bMF0gPT0gc3ltYm9sLmRvdHRlZF9uYW1lOgorICAgICAgICAgICAgZnJvbW5hbWUgPSBzZWxmLmNvbV9kb3R0ZWRfbmFtZShub2RlbGlzdFtpZHhdKQorICAgICAgICAgICAgaWR4ICs9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZyb21uYW1lID0gIiIKKyAgICAgICAgYXNzZXJ0IG5vZGVsaXN0W2lkeF1bMV0gPT0gJ2ltcG9ydCcKKyAgICAgICAgaWYgbm9kZWxpc3RbaWR4ICsgMV1bMF0gPT0gdG9rZW4uU1RBUjoKKyAgICAgICAgICAgIHJldHVybiBGcm9tKGZyb21uYW1lLCBbKCcqJywgTm9uZSldLCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpZHggKyAxICsgKG5vZGVsaXN0W2lkeCArIDFdWzBdID09IHRva2VuLkxQQVIpXQorICAgICAgICAgICAgcmV0dXJuIEZyb20oZnJvbW5hbWUsIHNlbGYuY29tX2ltcG9ydF9hc19uYW1lcyhub2RlKSwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgZ2xvYmFsX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGdsb2JhbDogTkFNRSAoJywnIE5BTUUpKgorICAgICAgICBuYW1lcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlbGlzdCksIDIpOgorICAgICAgICAgICAgbmFtZXMuYXBwZW5kKG5vZGVsaXN0W2ldWzFdKQorICAgICAgICByZXR1cm4gR2xvYmFsKG5hbWVzLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgZXhlY19zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBleGVjX3N0bXQ6ICdleGVjJyBleHByIFsnaW4nIGV4cHIgWycsJyBleHByXV0KKyAgICAgICAgZXhwcjEgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID49IDQ6CisgICAgICAgICAgICBleHByMiA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbM10pCisgICAgICAgICAgICBpZiBsZW4obm9kZWxpc3QpID49IDY6CisgICAgICAgICAgICAgICAgZXhwcjMgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHByMyA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4cHIyID0gZXhwcjMgPSBOb25lCisKKyAgICAgICAgcmV0dXJuIEV4ZWMoZXhwcjEsIGV4cHIyLCBleHByMywgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIGFzc2VydF9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyAnYXNzZXJ0JzogdGVzdCwgWycsJyB0ZXN0XQorICAgICAgICBleHByMSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pCisgICAgICAgIGlmIChsZW4obm9kZWxpc3QpID09IDQpOgorICAgICAgICAgICAgZXhwcjIgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzNdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwcjIgPSBOb25lCisgICAgICAgIHJldHVybiBBc3NlcnQoZXhwcjEsIGV4cHIyLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgaWZfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgaWY6IHRlc3QgJzonIHN1aXRlICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKiBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgdGVzdHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4obm9kZWxpc3QpIC0gMywgNCk6CisgICAgICAgICAgICB0ZXN0Tm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbaSArIDFdKQorICAgICAgICAgICAgc3VpdGVOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpICsgM10pCisgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoKHRlc3ROb2RlLCBzdWl0ZU5vZGUpKQorCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgJSA0ID09IDM6CisgICAgICAgICAgICBlbHNlTm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbLTFdKQorIyMgICAgICBlbHNlTm9kZS5saW5lbm8gPSBub2RlbGlzdFstMV1bMV1bMl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsc2VOb2RlID0gTm9uZQorICAgICAgICByZXR1cm4gSWYodGVzdHMsIGVsc2VOb2RlLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgd2hpbGVfc3RtdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgJ3doaWxlJyB0ZXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KKworICAgICAgICB0ZXN0Tm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pCisgICAgICAgIGJvZHlOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFszXSkKKworICAgICAgICBpZiBsZW4obm9kZWxpc3QpID4gNDoKKyAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFs2XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsc2VOb2RlID0gTm9uZQorCisgICAgICAgIHJldHVybiBXaGlsZSh0ZXN0Tm9kZSwgYm9keU5vZGUsIGVsc2VOb2RlLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKKyAgICBkZWYgZm9yX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjICdmb3InIGV4cHJsaXN0ICdpbicgZXhwcmxpc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorCisgICAgICAgIGFzc2lnbk5vZGUgPSBzZWxmLmNvbV9hc3NpZ24obm9kZWxpc3RbMV0sIE9QX0FTU0lHTikKKyAgICAgICAgbGlzdE5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzNdKQorICAgICAgICBib2R5Tm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbNV0pCisKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA+IDg6CisgICAgICAgICAgICBlbHNlTm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbOF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbHNlTm9kZSA9IE5vbmUKKworICAgICAgICByZXR1cm4gRm9yKGFzc2lnbk5vZGUsIGxpc3ROb2RlLCBib2R5Tm9kZSwgZWxzZU5vZGUsCisgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgZGVmIHRyeV9zdG10KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX3RyeV9leGNlcHRfZmluYWxseShub2RlbGlzdCkKKworICAgIGRlZiB3aXRoX3N0bXQoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gc2VsZi5jb21fd2l0aChub2RlbGlzdCkKKworICAgIGRlZiB3aXRoX3ZhcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJldHVybiBzZWxmLmNvbV93aXRoX3Zhcihub2RlbGlzdCkKKworICAgIGRlZiBzdWl0ZShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgc2ltcGxlX3N0bXQgfCBORVdMSU5FIElOREVOVCBORVdMSU5FKiAoc3RtdCBORVdMSU5FKikrIERFREVOVAorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDE6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fc3RtdChub2RlbGlzdFswXSkKKworICAgICAgICBzdG10cyA9IFtdCisgICAgICAgIGZvciBub2RlIGluIG5vZGVsaXN0OgorICAgICAgICAgICAgaWYgbm9kZVswXSA9PSBzeW1ib2wuc3RtdDoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbV9hcHBlbmRfc3RtdChzdG10cywgbm9kZSkKKyAgICAgICAgcmV0dXJuIFN0bXQoc3RtdHMpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIworICAgICMgRVhQUkVTU0lPTiBOT0RFUyAgKGludm9rZWQgYnkgY29tX25vZGUoKSkKKyAgICAjCisKKyAgICBkZWYgdGVzdGxpc3Qoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHRlc3RsaXN0OiBleHByICgnLCcgZXhwcikqIFsnLCddCisgICAgICAgICMgdGVzdGxpc3Rfc2FmZTogdGVzdCBbKCcsJyB0ZXN0KSsgWycsJ11dCisgICAgICAgICMgZXhwcmxpc3Q6IGV4cHIgKCcsJyBleHByKSogWycsJ10KKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX2JpbmFyeShUdXBsZSwgbm9kZWxpc3QpCisKKyAgICB0ZXN0bGlzdF9zYWZlID0gdGVzdGxpc3QgIyBYWFgKKyAgICB0ZXN0bGlzdDEgPSB0ZXN0bGlzdAorICAgIGV4cHJsaXN0ID0gdGVzdGxpc3QKKworICAgIGRlZiB0ZXN0bGlzdF9jb21wKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyB0ZXN0ICggY29tcF9mb3IgfCAoJywnIHRlc3QpKiBbJywnXSApCisgICAgICAgIGFzc2VydCBub2RlbGlzdFswXVswXSA9PSBzeW1ib2wudGVzdAorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDIgYW5kIG5vZGVsaXN0WzFdWzBdID09IHN5bWJvbC5jb21wX2ZvcjoKKyAgICAgICAgICAgIHRlc3QgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2dlbmVyYXRvcl9leHByZXNzaW9uKHRlc3QsIG5vZGVsaXN0WzFdKQorICAgICAgICByZXR1cm4gc2VsZi50ZXN0bGlzdChub2RlbGlzdCkKKworICAgIGRlZiB0ZXN0KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBvcl90ZXN0IFsnaWYnIG9yX3Rlc3QgJ2Vsc2UnIHRlc3RdIHwgbGFtYmRlZgorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDEgYW5kIG5vZGVsaXN0WzBdWzBdID09IHN5bWJvbC5sYW1iZGVmOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubGFtYmRlZihub2RlbGlzdFswXSkKKyAgICAgICAgdGhlbiA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPiAxOgorICAgICAgICAgICAgYXNzZXJ0IGxlbihub2RlbGlzdCkgPT0gNQorICAgICAgICAgICAgYXNzZXJ0IG5vZGVsaXN0WzFdWzFdID09ICdpZicKKyAgICAgICAgICAgIGFzc2VydCBub2RlbGlzdFszXVsxXSA9PSAnZWxzZScKKyAgICAgICAgICAgIHRlc3QgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKQorICAgICAgICAgICAgZWxzZV8gPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzRdKQorICAgICAgICAgICAgcmV0dXJuIElmRXhwKHRlc3QsIHRoZW4sIGVsc2VfLCBsaW5lbm89bm9kZWxpc3RbMV1bMl0pCisgICAgICAgIHJldHVybiB0aGVuCisKKyAgICBkZWYgb3JfdGVzdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgYW5kX3Rlc3QgKCdvcicgYW5kX3Rlc3QpKiB8IGxhbWJkZWYKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAxIGFuZCBub2RlbGlzdFswXVswXSA9PSBzeW1ib2wubGFtYmRlZjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxhbWJkZWYobm9kZWxpc3RbMF0pCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9iaW5hcnkoT3IsIG5vZGVsaXN0KQorICAgIG9sZF90ZXN0ID0gb3JfdGVzdAorCisgICAgZGVmIGFuZF90ZXN0KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBub3RfdGVzdCAoJ2FuZCcgbm90X3Rlc3QpKgorICAgICAgICByZXR1cm4gc2VsZi5jb21fYmluYXJ5KEFuZCwgbm9kZWxpc3QpCisKKyAgICBkZWYgbm90X3Rlc3Qoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjICdub3QnIG5vdF90ZXN0IHwgY29tcGFyaXNvbgorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0Wy0xXSkKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAyOgorICAgICAgICAgICAgcmV0dXJuIE5vdChyZXN1bHQsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGNvbXBhcmlzb24oc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGNvbXBhcmlzb246IGV4cHIgKGNvbXBfb3AgZXhwcikqCisgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDE6CisgICAgICAgICAgICByZXR1cm4gbm9kZQorCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIG5sID0gbm9kZWxpc3RbaS0xXQorCisgICAgICAgICAgICAjIGNvbXBfb3A6ICc8JyB8ICc+JyB8ICc9JyB8ICc+PScgfCAnPD0nIHwgJzw+JyB8ICchPScgfCAnPT0nCisgICAgICAgICAgICAjICAgICAgICAgIHwgJ2luJyB8ICdub3QnICdpbicgfCAnaXMnIHwgJ2lzJyAnbm90JworICAgICAgICAgICAgbiA9IG5sWzFdCisgICAgICAgICAgICBpZiBuWzBdID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgdHlwZSA9IG5bMV0KKyAgICAgICAgICAgICAgICBpZiBsZW4obmwpID09IDM6CisgICAgICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gJ25vdCc6CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gJ25vdCBpbicKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAnaXMgbm90JworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0eXBlID0gX2NtcF90eXBlc1tuWzBdXQorCisgICAgICAgICAgICBsaW5lbm8gPSBubFsxXVsyXQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoKHR5cGUsIHNlbGYuY29tX25vZGUobm9kZWxpc3RbaV0pKSkKKworICAgICAgICAjIHdlIG5lZWQgYSBzcGVjaWFsICJjb21wYXJlIiBub2RlIHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoCisgICAgICAgICMgICAzIDwgeCA8IDUgICBmcm9tICAgICgzIDwgeCkgPCA1CisgICAgICAgICMgdGhlIHR3byBoYXZlIHZlcnkgZGlmZmVyZW50IHNlbWFudGljcyBhbmQgcmVzdWx0cyAobm90ZSB0aGF0IHRoZQorICAgICAgICAjIGxhdHRlciBmb3JtIGlzIGFsd2F5cyB0cnVlKQorCisgICAgICAgIHJldHVybiBDb21wYXJlKG5vZGUsIHJlc3VsdHMsIGxpbmVubz1saW5lbm8pCisKKyAgICBkZWYgZXhwcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgeG9yX2V4cHIgKCd8JyB4b3JfZXhwcikqCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9iaW5hcnkoQml0b3IsIG5vZGVsaXN0KQorCisgICAgZGVmIHhvcl9leHByKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyB4b3JfZXhwciAoJ14nIHhvcl9leHByKSoKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX2JpbmFyeShCaXR4b3IsIG5vZGVsaXN0KQorCisgICAgZGVmIGFuZF9leHByKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyB4b3JfZXhwciAoJyYnIHhvcl9leHByKSoKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX2JpbmFyeShCaXRhbmQsIG5vZGVsaXN0KQorCisgICAgZGVmIHNoaWZ0X2V4cHIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHNoaWZ0X2V4cHIgKCc8PCd8Jz4+JyBzaGlmdF9leHByKSoKKyAgICAgICAgbm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIsIGxlbihub2RlbGlzdCksIDIpOgorICAgICAgICAgICAgcmlnaHQgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKQorICAgICAgICAgICAgaWYgbm9kZWxpc3RbaS0xXVswXSA9PSB0b2tlbi5MRUZUU0hJRlQ6CisgICAgICAgICAgICAgICAgbm9kZSA9IExlZnRTaGlmdChbbm9kZSwgcmlnaHRdLCBsaW5lbm89bm9kZWxpc3RbMV1bMl0pCisgICAgICAgICAgICBlbGlmIG5vZGVsaXN0W2ktMV1bMF0gPT0gdG9rZW4uUklHSFRTSElGVDoKKyAgICAgICAgICAgICAgICBub2RlID0gUmlnaHRTaGlmdChbbm9kZSwgcmlnaHRdLCBsaW5lbm89bm9kZWxpc3RbMV1bMl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmV4cGVjdGVkIHRva2VuOiAlcyIgJSBub2RlbGlzdFtpLTFdWzBdCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgYXJpdGhfZXhwcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzBdKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4obm9kZWxpc3QpLCAyKToKKyAgICAgICAgICAgIHJpZ2h0ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpXSkKKyAgICAgICAgICAgIGlmIG5vZGVsaXN0W2ktMV1bMF0gPT0gdG9rZW4uUExVUzoKKyAgICAgICAgICAgICAgICBub2RlID0gQWRkKFtub2RlLCByaWdodF0sIGxpbmVubz1ub2RlbGlzdFsxXVsyXSkKKyAgICAgICAgICAgIGVsaWYgbm9kZWxpc3RbaS0xXVswXSA9PSB0b2tlbi5NSU5VUzoKKyAgICAgICAgICAgICAgICBub2RlID0gU3ViKFtub2RlLCByaWdodF0sIGxpbmVubz1ub2RlbGlzdFsxXVsyXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVuZXhwZWN0ZWQgdG9rZW46ICVzIiAlIG5vZGVsaXN0W2ktMV1bMF0KKyAgICAgICAgcmV0dXJuIG5vZGUKKworICAgIGRlZiB0ZXJtKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgbm9kZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIsIGxlbihub2RlbGlzdCksIDIpOgorICAgICAgICAgICAgcmlnaHQgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKQorICAgICAgICAgICAgdCA9IG5vZGVsaXN0W2ktMV1bMF0KKyAgICAgICAgICAgIGlmIHQgPT0gdG9rZW4uU1RBUjoKKyAgICAgICAgICAgICAgICBub2RlID0gTXVsKFtub2RlLCByaWdodF0pCisgICAgICAgICAgICBlbGlmIHQgPT0gdG9rZW4uU0xBU0g6CisgICAgICAgICAgICAgICAgbm9kZSA9IERpdihbbm9kZSwgcmlnaHRdKQorICAgICAgICAgICAgZWxpZiB0ID09IHRva2VuLlBFUkNFTlQ6CisgICAgICAgICAgICAgICAgbm9kZSA9IE1vZChbbm9kZSwgcmlnaHRdKQorICAgICAgICAgICAgZWxpZiB0ID09IHRva2VuLkRPVUJMRVNMQVNIOgorICAgICAgICAgICAgICAgIG5vZGUgPSBGbG9vckRpdihbbm9kZSwgcmlnaHRdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5leHBlY3RlZCB0b2tlbjogJXMiICUgdAorICAgICAgICAgICAgbm9kZS5saW5lbm8gPSBub2RlbGlzdFsxXVsyXQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIGZhY3RvcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIGVsdCA9IG5vZGVsaXN0WzBdCisgICAgICAgIHQgPSBlbHRbMF0KKyAgICAgICAgbm9kZSA9IHNlbGYubG9va3VwX25vZGUobm9kZWxpc3RbLTFdKShub2RlbGlzdFstMV1bMTpdKQorICAgICAgICAjIG5lZWQgdG8gaGFuZGxlICh1bmFyeSBvcCljb25zdGFudCBoZXJlLi4uCisgICAgICAgIGlmIHQgPT0gdG9rZW4uUExVUzoKKyAgICAgICAgICAgIHJldHVybiBVbmFyeUFkZChub2RlLCBsaW5lbm89ZWx0WzJdKQorICAgICAgICBlbGlmIHQgPT0gdG9rZW4uTUlOVVM6CisgICAgICAgICAgICByZXR1cm4gVW5hcnlTdWIobm9kZSwgbGluZW5vPWVsdFsyXSkKKyAgICAgICAgZWxpZiB0ID09IHRva2VuLlRJTERFOgorICAgICAgICAgICAgbm9kZSA9IEludmVydChub2RlLCBsaW5lbm89ZWx0WzJdKQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIHBvd2VyKHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyBwb3dlcjogYXRvbSB0cmFpbGVyKiAoJyoqJyBmYWN0b3IpKgorICAgICAgICBub2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFswXSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGVsaXN0KSk6CisgICAgICAgICAgICBlbHQgPSBub2RlbGlzdFtpXQorICAgICAgICAgICAgaWYgZWx0WzBdID09IHRva2VuLkRPVUJMRVNUQVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIFBvd2VyKFtub2RlLCBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMV0pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPWVsdFsyXSkKKworICAgICAgICAgICAgbm9kZSA9IHNlbGYuY29tX2FwcGx5X3RyYWlsZXIobm9kZSwgZWx0KQorCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgYXRvbShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdG9tX2Rpc3BhdGNoW25vZGVsaXN0WzBdWzBdXShub2RlbGlzdCkKKworICAgIGRlZiBhdG9tX2xwYXIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBpZiBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5SUEFSOgorICAgICAgICAgICAgcmV0dXJuIFR1cGxlKCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQorCisgICAgZGVmIGF0b21fbHNxYihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIGlmIG5vZGVsaXN0WzFdWzBdID09IHRva2VuLlJTUUI6CisgICAgICAgICAgICByZXR1cm4gTGlzdCgoKSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorICAgICAgICByZXR1cm4gc2VsZi5jb21fbGlzdF9jb25zdHJ1Y3Rvcihub2RlbGlzdFsxXSkKKworICAgIGRlZiBhdG9tX2xicmFjZShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIGlmIG5vZGVsaXN0WzFdWzBdID09IHRva2VuLlJCUkFDRToKKyAgICAgICAgICAgIHJldHVybiBEaWN0KCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9kaWN0b3JzZXRtYWtlcihub2RlbGlzdFsxXSkKKworICAgIGRlZiBhdG9tX2JhY2txdW90ZShzZWxmLCBub2RlbGlzdCk6CisgICAgICAgIHJldHVybiBCYWNrcXVvdGUoc2VsZi5jb21fbm9kZShub2RlbGlzdFsxXSkpCisKKyAgICBkZWYgYXRvbV9udW1iZXIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIyMgbmVlZCB0byB2ZXJpZnkgdGhpcyBtYXRjaGVzIGNvbXBpbGUuYworICAgICAgICBrID0gZXZhbChub2RlbGlzdFswXVsxXSkKKyAgICAgICAgcmV0dXJuIENvbnN0KGssIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiBkZWNvZGVfbGl0ZXJhbChzZWxmLCBsaXQpOgorICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgorICAgICAgICAgICAgIyB0aGlzIGlzIHBhcnRpY3VsYXJseSBmcmFnaWxlICYgYSBiaXQgb2YgYQorICAgICAgICAgICAgIyBoYWNrLi4uIGNoYW5nZXMgaW4gY29tcGlsZS5jOnBhcnNlc3RyIGFuZAorICAgICAgICAgICAgIyB0b2tlbml6ZXIuYyBtdXN0IGJlIHJlZmxlY3RlZCBoZXJlLgorICAgICAgICAgICAgaWYgc2VsZi5lbmNvZGluZyBub3QgaW4gWyd1dGYtOCcsICdpc28tODg1OS0xJ106CisgICAgICAgICAgICAgICAgbGl0ID0gdW5pY29kZShsaXQsICd1dGYtOCcpLmVuY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgcmV0dXJuIGV2YWwoIiMgY29kaW5nOiAlc1xuJXMiICUgKHNlbGYuZW5jb2RpbmcsIGxpdCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZXZhbChsaXQpCisKKyAgICBkZWYgYXRvbV9zdHJpbmcoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICBrID0gJycKKyAgICAgICAgZm9yIG5vZGUgaW4gbm9kZWxpc3Q6CisgICAgICAgICAgICBrICs9IHNlbGYuZGVjb2RlX2xpdGVyYWwobm9kZVsxXSkKKyAgICAgICAgcmV0dXJuIENvbnN0KGssIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKworICAgIGRlZiBhdG9tX25hbWUoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICByZXR1cm4gTmFtZShub2RlbGlzdFswXVsxXSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMKKyAgICAjIElOVEVSTkFMIFBBUlNJTkcgVVRJTElUSUVTCisgICAgIworCisgICAgIyBUaGUgdXNlIG9mIGNvbV9ub2RlKCkgaW50cm9kdWNlcyBhIGxvdCBvZiBleHRyYSBzdGFjayBmcmFtZXMsCisgICAgIyBlbm91Z2ggdG8gY2F1c2UgYSBzdGFjayBvdmVyZmxvdyBjb21waWxpbmcgdGVzdC50ZXN0X3BhcnNlciB3aXRoCisgICAgIyB0aGUgc3RhbmRhcmQgaW50ZXJwcmV0ZXIgcmVjdXJzaW9ubGltaXQuICBUaGUgY29tX25vZGUoKSBpcyBhCisgICAgIyBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGhpZGVzIHRoZSBkaXNwYXRjaCBkZXRhaWxzLCBidXQgY29tZXMKKyAgICAjIGF0IGEgdmVyeSBoaWdoIGNvc3QuICBJdCBpcyBtb3JlIGVmZmljaWVudCB0byBkaXNwYXRjaCBkaXJlY3RseQorICAgICMgaW4gdGhlIGNhbGxlcnMuICBJbiB0aGVzZSBjYXNlcywgdXNlIGxvb2t1cF9ub2RlKCkgYW5kIGNhbGwgdGhlCisgICAgIyBkaXNwYXRjaGVkIG5vZGUgZGlyZWN0bHkuCisKKyAgICBkZWYgbG9va3VwX25vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9kaXNwYXRjaFtub2RlWzBdXQorCisgICAgZGVmIGNvbV9ub2RlKHNlbGYsIG5vZGUpOgorICAgICAgICAjIE5vdGU6IGNvbXBpbGUuYyBoYXMgaGFuZGxpbmcgaW4gY29tX25vZGUgZm9yIGRlbF9zdG10LCBwYXNzX3N0bXQsCisgICAgICAgICMgICAgICAgYnJlYWtfc3RtdCwgc3RtdCwgc21hbGxfc3RtdCwgZmxvd19zdG10LCBzaW1wbGVfc3RtdCwKKyAgICAgICAgIyAgICAgICBhbmQgY29tcG91bmRfc3RtdC4KKyAgICAgICAgIyAgICAgICBXZSdsbCBqdXN0IGRpc3BhdGNoIHRoZW0uCisgICAgICAgIHJldHVybiBzZWxmLl9kaXNwYXRjaFtub2RlWzBdXShub2RlWzE6XSkKKworICAgIGRlZiBjb21fTkVXTElORShzZWxmLCAqYXJncyk6CisgICAgICAgICMgQSAnOycgYXQgdGhlIGVuZCBvZiBhIGxpbmUgY2FuIG1ha2UgYSBORVdMSU5FIHRva2VuIGFwcGVhcgorICAgICAgICAjIGhlcmUsIFJlbmRlciBpdCBoYXJtbGVzcy4gKGdlbmMgZGlzY2FyZHMgKCdkaXNjYXJkJywKKyAgICAgICAgIyAoJ2NvbnN0JywgeHh4eCkpIE5vZGVzKQorICAgICAgICByZXR1cm4gRGlzY2FyZChDb25zdChOb25lKSkKKworICAgIGRlZiBjb21fYXJnbGlzdChzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgdmFyYXJnc2xpc3Q6CisgICAgICAgICMgICAgIChmcGRlZiBbJz0nIHRlc3RdICcsJykqICgnKicgTkFNRSBbJywnICcqKicgTkFNRV0gfCAnKionIE5BTUUpCisgICAgICAgICMgICB8IGZwZGVmIFsnPScgdGVzdF0gKCcsJyBmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10KKyAgICAgICAgIyBmcGRlZjogTkFNRSB8ICcoJyBmcGxpc3QgJyknCisgICAgICAgICMgZnBsaXN0OiBmcGRlZiAoJywnIGZwZGVmKSogWycsJ10KKyAgICAgICAgbmFtZXMgPSBbXQorICAgICAgICBkZWZhdWx0cyA9IFtdCisgICAgICAgIGZsYWdzID0gMAorCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIGkgPCBsZW4obm9kZWxpc3QpOgorICAgICAgICAgICAgbm9kZSA9IG5vZGVsaXN0W2ldCisgICAgICAgICAgICBpZiBub2RlWzBdID09IHRva2VuLlNUQVIgb3Igbm9kZVswXSA9PSB0b2tlbi5ET1VCTEVTVEFSOgorICAgICAgICAgICAgICAgIGlmIG5vZGVbMF0gPT0gdG9rZW4uU1RBUjoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVsaXN0W2krMV0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm9kZVswXSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYXBwZW5kKG5vZGVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgQ09fVkFSQVJHUworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAzCisKKyAgICAgICAgICAgICAgICBpZiBpIDwgbGVuKG5vZGVsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgIyBzaG91bGQgYmUgRE9VQkxFU1RBUgorICAgICAgICAgICAgICAgICAgICB0ID0gbm9kZWxpc3RbaV1bMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgdCA9PSB0b2tlbi5ET1VCTEVTVEFSOgorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVsaXN0W2krMV0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bmV4cGVjdGVkIHRva2VuOiAlcyIgJSB0CisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChub2RlWzFdKQorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgQ09fVkFSS0VZV09SRFMKKworICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgZnBkZWY6IE5BTUUgfCAnKCcgZnBsaXN0ICcpJworICAgICAgICAgICAgbmFtZXMuYXBwZW5kKHNlbGYuY29tX2ZwZGVmKG5vZGUpKQorCisgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgIGlmIGkgPCBsZW4obm9kZWxpc3QpIGFuZCBub2RlbGlzdFtpXVswXSA9PSB0b2tlbi5FUVVBTDoKKyAgICAgICAgICAgICAgICBkZWZhdWx0cy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlbGlzdFtpICsgMV0pKQorICAgICAgICAgICAgICAgIGkgPSBpICsgMgorICAgICAgICAgICAgZWxpZiBsZW4oZGVmYXVsdHMpOgorICAgICAgICAgICAgICAgICMgd2UgaGF2ZSBhbHJlYWR5IHNlZW4gYW4gYXJndW1lbnQgd2l0aCBkZWZhdWx0LCBidXQgaGVyZQorICAgICAgICAgICAgICAgICMgY2FtZSBvbmUgd2l0aG91dAorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAibm9uLWRlZmF1bHQgYXJndW1lbnQgZm9sbG93cyBkZWZhdWx0IGFyZ3VtZW50IgorCisgICAgICAgICAgICAjIHNraXAgdGhlIGNvbW1hCisgICAgICAgICAgICBpID0gaSArIDEKKworICAgICAgICByZXR1cm4gbmFtZXMsIGRlZmF1bHRzLCBmbGFncworCisgICAgZGVmIGNvbV9mcGRlZihzZWxmLCBub2RlKToKKyAgICAgICAgIyBmcGRlZjogTkFNRSB8ICcoJyBmcGxpc3QgJyknCisgICAgICAgIGlmIG5vZGVbMV1bMF0gPT0gdG9rZW4uTFBBUjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9mcGxpc3Qobm9kZVsyXSkKKyAgICAgICAgcmV0dXJuIG5vZGVbMV1bMV0KKworICAgIGRlZiBjb21fZnBsaXN0KHNlbGYsIG5vZGUpOgorICAgICAgICAjIGZwbGlzdDogZnBkZWYgKCcsJyBmcGRlZikqIFsnLCddCisgICAgICAgIGlmIGxlbihub2RlKSA9PSAyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2ZwZGVmKG5vZGVbMV0pCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obm9kZSksIDIpOgorICAgICAgICAgICAgbGlzdC5hcHBlbmQoc2VsZi5jb21fZnBkZWYobm9kZVtpXSkpCisgICAgICAgIHJldHVybiB0dXBsZShsaXN0KQorCisgICAgZGVmIGNvbV9kb3R0ZWRfbmFtZShzZWxmLCBub2RlKToKKyAgICAgICAgIyBTdHJpbmcgdG9nZXRoZXIgdGhlIGRvdHRlZCBuYW1lcyBhbmQgcmV0dXJuIHRoZSBzdHJpbmcKKyAgICAgICAgbmFtZSA9ICIiCisgICAgICAgIGZvciBuIGluIG5vZGU6CisgICAgICAgICAgICBpZiB0eXBlKG4pID09IHR5cGUoKCkpIGFuZCBuWzBdID09IDE6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyBuWzFdICsgJy4nCisgICAgICAgIHJldHVybiBuYW1lWzotMV0KKworICAgIGRlZiBjb21fZG90dGVkX2FzX25hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgIGFzc2VydCBub2RlWzBdID09IHN5bWJvbC5kb3R0ZWRfYXNfbmFtZQorICAgICAgICBub2RlID0gbm9kZVsxOl0KKyAgICAgICAgZG90ID0gc2VsZi5jb21fZG90dGVkX25hbWUobm9kZVswXVsxOl0pCisgICAgICAgIGlmIGxlbihub2RlKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIGRvdCwgTm9uZQorICAgICAgICBhc3NlcnQgbm9kZVsxXVsxXSA9PSAnYXMnCisgICAgICAgIGFzc2VydCBub2RlWzJdWzBdID09IHRva2VuLk5BTUUKKyAgICAgICAgcmV0dXJuIGRvdCwgbm9kZVsyXVsxXQorCisgICAgZGVmIGNvbV9kb3R0ZWRfYXNfbmFtZXMoc2VsZiwgbm9kZSk6CisgICAgICAgIGFzc2VydCBub2RlWzBdID09IHN5bWJvbC5kb3R0ZWRfYXNfbmFtZXMKKyAgICAgICAgbm9kZSA9IG5vZGVbMTpdCisgICAgICAgIG5hbWVzID0gW3NlbGYuY29tX2RvdHRlZF9hc19uYW1lKG5vZGVbMF0pXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4obm9kZSksIDIpOgorICAgICAgICAgICAgbmFtZXMuYXBwZW5kKHNlbGYuY29tX2RvdHRlZF9hc19uYW1lKG5vZGVbaV0pKQorICAgICAgICByZXR1cm4gbmFtZXMKKworICAgIGRlZiBjb21faW1wb3J0X2FzX25hbWUoc2VsZiwgbm9kZSk6CisgICAgICAgIGFzc2VydCBub2RlWzBdID09IHN5bWJvbC5pbXBvcnRfYXNfbmFtZQorICAgICAgICBub2RlID0gbm9kZVsxOl0KKyAgICAgICAgYXNzZXJ0IG5vZGVbMF1bMF0gPT0gdG9rZW4uTkFNRQorICAgICAgICBpZiBsZW4obm9kZSkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBub2RlWzBdWzFdLCBOb25lCisgICAgICAgIGFzc2VydCBub2RlWzFdWzFdID09ICdhcycsIG5vZGUKKyAgICAgICAgYXNzZXJ0IG5vZGVbMl1bMF0gPT0gdG9rZW4uTkFNRQorICAgICAgICByZXR1cm4gbm9kZVswXVsxXSwgbm9kZVsyXVsxXQorCisgICAgZGVmIGNvbV9pbXBvcnRfYXNfbmFtZXMoc2VsZiwgbm9kZSk6CisgICAgICAgIGFzc2VydCBub2RlWzBdID09IHN5bWJvbC5pbXBvcnRfYXNfbmFtZXMKKyAgICAgICAgbm9kZSA9IG5vZGVbMTpdCisgICAgICAgIG5hbWVzID0gW3NlbGYuY29tX2ltcG9ydF9hc19uYW1lKG5vZGVbMF0pXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyLCBsZW4obm9kZSksIDIpOgorICAgICAgICAgICAgbmFtZXMuYXBwZW5kKHNlbGYuY29tX2ltcG9ydF9hc19uYW1lKG5vZGVbaV0pKQorICAgICAgICByZXR1cm4gbmFtZXMKKworICAgIGRlZiBjb21fYmFzZXMoc2VsZiwgbm9kZSk6CisgICAgICAgIGJhc2VzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGUpLCAyKToKKyAgICAgICAgICAgIGJhc2VzLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVbaV0pKQorICAgICAgICByZXR1cm4gYmFzZXMKKworICAgIGRlZiBjb21fdHJ5X2V4Y2VwdF9maW5hbGx5KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyAoJ3RyeScgJzonIHN1aXRlCisgICAgICAgICMgICgoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0gWydmaW5hbGx5JyAnOicgc3VpdGVdCisgICAgICAgICMgICB8ICdmaW5hbGx5JyAnOicgc3VpdGUpKQorCisgICAgICAgIGlmIG5vZGVsaXN0WzNdWzBdID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAjIGZpcnN0IGNsYXVzZSBpcyBhIGZpbmFsbHkgY2xhdXNlOiBvbmx5IHRyeS1maW5hbGx5CisgICAgICAgICAgICByZXR1cm4gVHJ5RmluYWxseShzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tX25vZGUobm9kZWxpc3RbNV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorCisgICAgICAgICN0cnlleGNlcHQ6ICBbVHJ5Tm9kZSwgW2V4Y2VwdF9jbGF1c2VzXSwgZWxzZU5vZGUpXQorICAgICAgICBjbGF1c2VzID0gW10KKyAgICAgICAgZWxzZU5vZGUgPSBOb25lCisgICAgICAgIGZpbmFsbHlOb2RlID0gTm9uZQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzLCBsZW4obm9kZWxpc3QpLCAzKToKKyAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpXQorICAgICAgICAgICAgaWYgbm9kZVswXSA9PSBzeW1ib2wuZXhjZXB0X2NsYXVzZToKKyAgICAgICAgICAgICAgICAjIGV4Y2VwdF9jbGF1c2U6ICdleGNlcHQnIFtleHByIFsoJywnIHwgJ2FzJykgZXhwcl1dICovCisgICAgICAgICAgICAgICAgaWYgbGVuKG5vZGUpID4gMjoKKyAgICAgICAgICAgICAgICAgICAgZXhwcjEgPSBzZWxmLmNvbV9ub2RlKG5vZGVbMl0pCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKSA+IDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBleHByMiA9IHNlbGYuY29tX2Fzc2lnbihub2RlWzRdLCBPUF9BU1NJR04pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBleHByMiA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBleHByMSA9IGV4cHIyID0gTm9uZQorICAgICAgICAgICAgICAgIGNsYXVzZXMuYXBwZW5kKChleHByMSwgZXhwcjIsIHNlbGYuY29tX25vZGUobm9kZWxpc3RbaSsyXSkpKQorCisgICAgICAgICAgICBpZiBub2RlWzBdID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICAgICAgaWYgbm9kZVsxXSA9PSAnZWxzZSc6CisgICAgICAgICAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICAgICAgICAgIGVsaWYgbm9kZVsxXSA9PSAnZmluYWxseSc6CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHlOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICB0cnlfZXhjZXB0ID0gVHJ5RXhjZXB0KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLCBjbGF1c2VzLCBlbHNlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIGlmIGZpbmFsbHlOb2RlOgorICAgICAgICAgICAgcmV0dXJuIFRyeUZpbmFsbHkodHJ5X2V4Y2VwdCwgZmluYWxseU5vZGUsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB0cnlfZXhjZXB0CisKKyAgICBkZWYgY29tX3dpdGgoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIHdpdGhfc3RtdDogJ3dpdGgnIHdpdGhfaXRlbSAoJywnIHdpdGhfaXRlbSkqICc6JyBzdWl0ZQorICAgICAgICBib2R5ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFstMV0pCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihub2RlbGlzdCkgLSAzLCAwLCAtMik6CisgICAgICAgICAgICByZXQgPSBzZWxmLmNvbV93aXRoX2l0ZW0obm9kZWxpc3RbaV0sIGJvZHksIG5vZGVsaXN0WzBdWzJdKQorICAgICAgICAgICAgaWYgaSA9PSAxOgorICAgICAgICAgICAgICAgIHJldHVybiByZXQKKyAgICAgICAgICAgIGJvZHkgPSByZXQKKworICAgIGRlZiBjb21fd2l0aF9pdGVtKHNlbGYsIG5vZGVsaXN0LCBib2R5LCBsaW5lbm8pOgorICAgICAgICAjIHdpdGhfaXRlbTogdGVzdCBbJ2FzJyBleHByXQorICAgICAgICBpZiBsZW4obm9kZWxpc3QpID09IDQ6CisgICAgICAgICAgICB2YXIgPSBzZWxmLmNvbV9hc3NpZ24obm9kZWxpc3RbM10sIE9QX0FTU0lHTikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhciA9IE5vbmUKKyAgICAgICAgZXhwciA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pCisgICAgICAgIHJldHVybiBXaXRoKGV4cHIsIHZhciwgYm9keSwgbGluZW5vPWxpbmVubykKKworICAgIGRlZiBjb21fYXVnYXNzaWduX29wKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZVswXSA9PSBzeW1ib2wuYXVnYXNzaWduCisgICAgICAgIHJldHVybiBub2RlWzFdCisKKyAgICBkZWYgY29tX2F1Z2Fzc2lnbihzZWxmLCBub2RlKToKKyAgICAgICAgIiIiUmV0dXJuIG5vZGUgc3VpdGFibGUgZm9yIGx2YWx1ZSBvZiBhdWdtZW50ZWQgYXNzaWdubWVudAorCisgICAgICAgIE5hbWVzLCBzbGljZXMsIGFuZCBhdHRyaWJ1dGVzIGFyZSB0aGUgb25seSBhbGxvd2FibGUgbm9kZXMuCisgICAgICAgICIiIgorICAgICAgICBsID0gc2VsZi5jb21fbm9kZShub2RlKQorICAgICAgICBpZiBsLl9fY2xhc3NfXyBpbiAoTmFtZSwgU2xpY2UsIFN1YnNjcmlwdCwgR2V0YXR0cik6CisgICAgICAgICAgICByZXR1cm4gbAorICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiB0byAlcyIgJSBsLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgZGVmIGNvbV9hc3NpZ24oc2VsZiwgbm9kZSwgYXNzaWduaW5nKToKKyAgICAgICAgIyByZXR1cm4gYSBub2RlIHN1aXRhYmxlIGZvciB1c2UgYXMgYW4gImx2YWx1ZSIKKyAgICAgICAgIyBsb29wIHRvIGF2b2lkIHRyaXZpYWwgcmVjdXJzaW9uCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0ID0gbm9kZVswXQorICAgICAgICAgICAgaWYgdCBpbiAoc3ltYm9sLmV4cHJsaXN0LCBzeW1ib2wudGVzdGxpc3QsIHN5bWJvbC50ZXN0bGlzdF9zYWZlLCBzeW1ib2wudGVzdGxpc3RfY29tcCk6CisgICAgICAgICAgICAgICAgaWYgbGVuKG5vZGUpID4gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2Fzc2lnbl90dXBsZShub2RlLCBhc3NpZ25pbmcpCisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVbMV0KKyAgICAgICAgICAgIGVsaWYgdCBpbiBfYXNzaWduX3R5cGVzOgorICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKSA+IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIHRvIG9wZXJhdG9yIgorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlWzFdCisgICAgICAgICAgICBlbGlmIHQgPT0gc3ltYm9sLnBvd2VyOgorICAgICAgICAgICAgICAgIGlmIG5vZGVbMV1bMF0gIT0gc3ltYm9sLmF0b206CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIHRvIG9wZXJhdG9yIgorICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKSA+IDI6CisgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgPSBzZWxmLmNvbV9ub2RlKG5vZGVbMV0pCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDIsIGxlbihub2RlKS0xKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoID0gbm9kZVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hbMF0gPT0gdG9rZW4uRE9VQkxFU1RBUjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiB0byBvcGVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgPSBzZWxmLmNvbV9hcHBseV90cmFpbGVyKHByaW1hcnksIGNoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fYXNzaWduX3RyYWlsZXIocHJpbWFyeSwgbm9kZVstMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25pbmcpCisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVbMV0KKyAgICAgICAgICAgIGVsaWYgdCA9PSBzeW1ib2wuYXRvbToKKyAgICAgICAgICAgICAgICB0ID0gbm9kZVsxXVswXQorICAgICAgICAgICAgICAgIGlmIHQgPT0gdG9rZW4uTFBBUjoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGVbMl0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm9kZVswXSA9PSB0b2tlbi5SUEFSOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJjYW4ndCBhc3NpZ24gdG8gKCkiCisgICAgICAgICAgICAgICAgZWxpZiB0ID09IHRva2VuLkxTUUI6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlWzJdCisgICAgICAgICAgICAgICAgICAgIGlmIG5vZGVbMF0gPT0gdG9rZW4uUlNRQjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIHRvIFtdIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fYXNzaWduX2xpc3Qobm9kZSwgYXNzaWduaW5nKQorICAgICAgICAgICAgICAgIGVsaWYgdCA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fYXNzaWduX25hbWUobm9kZVsxXSwgYXNzaWduaW5nKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiY2FuJ3QgYXNzaWduIHRvIGxpdGVyYWwiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAiYmFkIGFzc2lnbm1lbnQgKCVzKSIgJSB0CisKKyAgICBkZWYgY29tX2Fzc2lnbl90dXBsZShzZWxmLCBub2RlLCBhc3NpZ25pbmcpOgorICAgICAgICBhc3NpZ25zID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGUpLCAyKToKKyAgICAgICAgICAgIGFzc2lnbnMuYXBwZW5kKHNlbGYuY29tX2Fzc2lnbihub2RlW2ldLCBhc3NpZ25pbmcpKQorICAgICAgICByZXR1cm4gQXNzVHVwbGUoYXNzaWducywgbGluZW5vPWV4dHJhY3RMaW5lTm8obm9kZSkpCisKKyAgICBkZWYgY29tX2Fzc2lnbl9saXN0KHNlbGYsIG5vZGUsIGFzc2lnbmluZyk6CisgICAgICAgIGFzc2lnbnMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obm9kZSksIDIpOgorICAgICAgICAgICAgaWYgaSArIDEgPCBsZW4obm9kZSk6CisgICAgICAgICAgICAgICAgaWYgbm9kZVtpICsgMV1bMF0gPT0gc3ltYm9sLmxpc3RfZm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiB0byBsaXN0IGNvbXByZWhlbnNpb24iCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5vZGVbaSArIDFdWzBdID09IHRva2VuLkNPTU1BLCBub2RlW2kgKyAxXQorICAgICAgICAgICAgYXNzaWducy5hcHBlbmQoc2VsZi5jb21fYXNzaWduKG5vZGVbaV0sIGFzc2lnbmluZykpCisgICAgICAgIHJldHVybiBBc3NMaXN0KGFzc2lnbnMsIGxpbmVubz1leHRyYWN0TGluZU5vKG5vZGUpKQorCisgICAgZGVmIGNvbV9hc3NpZ25fbmFtZShzZWxmLCBub2RlLCBhc3NpZ25pbmcpOgorICAgICAgICByZXR1cm4gQXNzTmFtZShub2RlWzFdLCBhc3NpZ25pbmcsIGxpbmVubz1ub2RlWzJdKQorCisgICAgZGVmIGNvbV9hc3NpZ25fdHJhaWxlcihzZWxmLCBwcmltYXJ5LCBub2RlLCBhc3NpZ25pbmcpOgorICAgICAgICB0ID0gbm9kZVsxXVswXQorICAgICAgICBpZiB0ID09IHRva2VuLkRPVDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9hc3NpZ25fYXR0cihwcmltYXJ5LCBub2RlWzJdLCBhc3NpZ25pbmcpCisgICAgICAgIGlmIHQgPT0gdG9rZW4uTFNRQjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbV9zdWJzY3JpcHRsaXN0KHByaW1hcnksIG5vZGVbMl0sIGFzc2lnbmluZykKKyAgICAgICAgaWYgdCA9PSB0b2tlbi5MUEFSOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbCIKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJ1bmtub3duIHRyYWlsZXIgdHlwZTogJXMiICUgdAorCisgICAgZGVmIGNvbV9hc3NpZ25fYXR0cihzZWxmLCBwcmltYXJ5LCBub2RlLCBhc3NpZ25pbmcpOgorICAgICAgICByZXR1cm4gQXNzQXR0cihwcmltYXJ5LCBub2RlWzFdLCBhc3NpZ25pbmcsIGxpbmVubz1ub2RlWy0xXSkKKworICAgIGRlZiBjb21fYmluYXJ5KHNlbGYsIGNvbnN0cnVjdG9yLCBub2RlbGlzdCk6CisgICAgICAgICJDb21waWxlICdOT0RFIChPUCBOT0RFKSonIGludG8gKHR5cGUsIFsgbm9kZTEsIC4uLiwgbm9kZU4gXSkuIgorICAgICAgICBsID0gbGVuKG5vZGVsaXN0KQorICAgICAgICBpZiBsID09IDE6CisgICAgICAgICAgICBuID0gbm9kZWxpc3RbMF0KKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvb2t1cF9ub2RlKG4pKG5bMTpdKQorICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGwsIDIpOgorICAgICAgICAgICAgbiA9IG5vZGVsaXN0W2ldCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQoc2VsZi5sb29rdXBfbm9kZShuKShuWzE6XSkpCisgICAgICAgIHJldHVybiBjb25zdHJ1Y3RvcihpdGVtcywgbGluZW5vPWV4dHJhY3RMaW5lTm8obm9kZWxpc3QpKQorCisgICAgZGVmIGNvbV9zdG10KHNlbGYsIG5vZGUpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmxvb2t1cF9ub2RlKG5vZGUpKG5vZGVbMTpdKQorICAgICAgICBhc3NlcnQgcmVzdWx0IGlzIG5vdCBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCBTdG10KToKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgcmV0dXJuIFN0bXQoW3Jlc3VsdF0pCisKKyAgICBkZWYgY29tX2FwcGVuZF9zdG10KHNlbGYsIHN0bXRzLCBub2RlKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5sb29rdXBfbm9kZShub2RlKShub2RlWzE6XSkKKyAgICAgICAgYXNzZXJ0IHJlc3VsdCBpcyBub3QgTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgU3RtdCk6CisgICAgICAgICAgICBzdG10cy5leHRlbmQocmVzdWx0Lm5vZGVzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RtdHMuYXBwZW5kKHJlc3VsdCkKKworICAgIGRlZiBjb21fbGlzdF9jb25zdHJ1Y3RvcihzZWxmLCBub2RlbGlzdCk6CisgICAgICAgICMgbGlzdG1ha2VyOiB0ZXN0ICggbGlzdF9mb3IgfCAoJywnIHRlc3QpKiBbJywnXSApCisgICAgICAgIHZhbHVlcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlbGlzdCkpOgorICAgICAgICAgICAgaWYgbm9kZWxpc3RbaV1bMF0gPT0gc3ltYm9sLmxpc3RfZm9yOgorICAgICAgICAgICAgICAgIGFzc2VydCBsZW4obm9kZWxpc3RbaTpdKSA9PSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX2xpc3RfY29tcHJlaGVuc2lvbih2YWx1ZXNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlbGlzdFtpXSkKKyAgICAgICAgICAgIGVsaWYgbm9kZWxpc3RbaV1bMF0gPT0gdG9rZW4uQ09NTUE6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlbGlzdFtpXSkpCisgICAgICAgIHJldHVybiBMaXN0KHZhbHVlcywgbGluZW5vPXZhbHVlc1swXS5saW5lbm8pCisKKyAgICBkZWYgY29tX2xpc3RfY29tcHJlaGVuc2lvbihzZWxmLCBleHByLCBub2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29tX2NvbXByZWhlbnNpb24oZXhwciwgTm9uZSwgbm9kZSwgJ2xpc3QnKQorCisgICAgZGVmIGNvbV9jb21wcmVoZW5zaW9uKHNlbGYsIGV4cHIxLCBleHByMiwgbm9kZSwgdHlwZSk6CisgICAgICAgICMgbGlzdF9pdGVyOiBsaXN0X2ZvciB8IGxpc3RfaWYKKyAgICAgICAgIyBsaXN0X2ZvcjogJ2ZvcicgZXhwcmxpc3QgJ2luJyB0ZXN0bGlzdCBbbGlzdF9pdGVyXQorICAgICAgICAjIGxpc3RfaWY6ICdpZicgdGVzdCBbbGlzdF9pdGVyXQorCisgICAgICAgICMgWFhYIHNob3VsZCByYWlzZSBTeW50YXhFcnJvciBmb3IgYXNzaWdubWVudAorICAgICAgICAjIFhYWChhdmFzc2Fsb3R0aSkgU2V0IGFuZCBkaWN0IGNvbXByZWhlbnNpb25zIHNob3VsZCBoYXZlIGdlbmVyYXRvcgorICAgICAgICAjICAgICAgICAgICAgICAgICAgc2VtYW50aWNzLiBJbiBvdGhlciB3b3JkcywgdGhleSBzaG91bGRuJ3QgbGVhaworICAgICAgICAjICAgICAgICAgICAgICAgICAgdmFyaWFibGVzIG91dHNpZGUgb2YgdGhlIGNvbXByZWhlbnNpb24ncyBzY29wZS4KKworICAgICAgICBsaW5lbm8gPSBub2RlWzFdWzJdCisgICAgICAgIGZvcnMgPSBbXQorICAgICAgICB3aGlsZSBub2RlOgorICAgICAgICAgICAgdCA9IG5vZGVbMV1bMV0KKyAgICAgICAgICAgIGlmIHQgPT0gJ2Zvcic6CisgICAgICAgICAgICAgICAgYXNzaWduTm9kZSA9IHNlbGYuY29tX2Fzc2lnbihub2RlWzJdLCBPUF9BU1NJR04pCisgICAgICAgICAgICAgICAgY29tcE5vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVbNF0pCisgICAgICAgICAgICAgICAgbmV3Zm9yID0gTGlzdENvbXBGb3IoYXNzaWduTm9kZSwgY29tcE5vZGUsIFtdKQorICAgICAgICAgICAgICAgIG5ld2Zvci5saW5lbm8gPSBub2RlWzFdWzJdCisgICAgICAgICAgICAgICAgZm9ycy5hcHBlbmQobmV3Zm9yKQorICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKSA9PSA1OgorICAgICAgICAgICAgICAgICAgICBub2RlID0gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAnbGlzdCc6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9saXN0X2l0ZXIobm9kZVs1XSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5jb21fY29tcF9pdGVyKG5vZGVbNV0pCisgICAgICAgICAgICBlbGlmIHQgPT0gJ2lmJzoKKyAgICAgICAgICAgICAgICB0ZXN0ID0gc2VsZi5jb21fbm9kZShub2RlWzJdKQorICAgICAgICAgICAgICAgIG5ld2lmID0gTGlzdENvbXBJZih0ZXN0LCBsaW5lbm89bm9kZVsxXVsyXSkKKyAgICAgICAgICAgICAgICBuZXdmb3IuaWZzLmFwcGVuZChuZXdpZikKKyAgICAgICAgICAgICAgICBpZiBsZW4obm9kZSkgPT0gMzoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIHR5cGUgPT0gJ2xpc3QnOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5jb21fbGlzdF9pdGVyKG5vZGVbM10pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuY29tX2NvbXBfaXRlcihub2RlWzNdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgidW5leHBlY3RlZCBjb21wcmVoZW5zaW9uIGVsZW1lbnQ6ICVzICVkIgorICAgICAgICAgICAgICAgICAgICAgICAlIChub2RlLCBsaW5lbm8pKQorICAgICAgICBpZiB0eXBlID09ICdsaXN0JzoKKyAgICAgICAgICAgIHJldHVybiBMaXN0Q29tcChleHByMSwgZm9ycywgbGluZW5vPWxpbmVubykKKyAgICAgICAgZWxpZiB0eXBlID09ICdzZXQnOgorICAgICAgICAgICAgcmV0dXJuIFNldENvbXAoZXhwcjEsIGZvcnMsIGxpbmVubz1saW5lbm8pCisgICAgICAgIGVsaWYgdHlwZSA9PSAnZGljdCc6CisgICAgICAgICAgICByZXR1cm4gRGljdENvbXAoZXhwcjEsIGV4cHIyLCBmb3JzLCBsaW5lbm89bGluZW5vKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5leHBlY3RlZCBjb21wcmVoZW5zaW9uIHR5cGU6ICIgKyByZXByKHR5cGUpKQorCisgICAgZGVmIGNvbV9saXN0X2l0ZXIoc2VsZiwgbm9kZSk6CisgICAgICAgIGFzc2VydCBub2RlWzBdID09IHN5bWJvbC5saXN0X2l0ZXIKKyAgICAgICAgcmV0dXJuIG5vZGVbMV0KKworICAgIGRlZiBjb21fY29tcF9pdGVyKHNlbGYsIG5vZGUpOgorICAgICAgICBhc3NlcnQgbm9kZVswXSA9PSBzeW1ib2wuY29tcF9pdGVyCisgICAgICAgIHJldHVybiBub2RlWzFdCisKKyAgICBkZWYgY29tX2dlbmVyYXRvcl9leHByZXNzaW9uKHNlbGYsIGV4cHIsIG5vZGUpOgorICAgICAgICAjIGNvbXBfaXRlcjogY29tcF9mb3IgfCBjb21wX2lmCisgICAgICAgICMgY29tcF9mb3I6ICdmb3InIGV4cHJsaXN0ICdpbicgdGVzdCBbY29tcF9pdGVyXQorICAgICAgICAjIGNvbXBfaWY6ICdpZicgdGVzdCBbY29tcF9pdGVyXQorCisgICAgICAgIGxpbmVubyA9IG5vZGVbMV1bMl0KKyAgICAgICAgZm9ycyA9IFtdCisgICAgICAgIHdoaWxlIG5vZGU6CisgICAgICAgICAgICB0ID0gbm9kZVsxXVsxXQorICAgICAgICAgICAgaWYgdCA9PSAnZm9yJzoKKyAgICAgICAgICAgICAgICBhc3NpZ25Ob2RlID0gc2VsZi5jb21fYXNzaWduKG5vZGVbMl0sIE9QX0FTU0lHTikKKyAgICAgICAgICAgICAgICBnZW5Ob2RlID0gc2VsZi5jb21fbm9kZShub2RlWzRdKQorICAgICAgICAgICAgICAgIG5ld2ZvciA9IEdlbkV4cHJGb3IoYXNzaWduTm9kZSwgZ2VuTm9kZSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZVsxXVsyXSkKKyAgICAgICAgICAgICAgICBmb3JzLmFwcGVuZChuZXdmb3IpCisgICAgICAgICAgICAgICAgaWYgKGxlbihub2RlKSkgPT0gNToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5jb21fY29tcF9pdGVyKG5vZGVbNV0pCisgICAgICAgICAgICBlbGlmIHQgPT0gJ2lmJzoKKyAgICAgICAgICAgICAgICB0ZXN0ID0gc2VsZi5jb21fbm9kZShub2RlWzJdKQorICAgICAgICAgICAgICAgIG5ld2lmID0gR2VuRXhwcklmKHRlc3QsIGxpbmVubz1ub2RlWzFdWzJdKQorICAgICAgICAgICAgICAgIG5ld2Zvci5pZnMuYXBwZW5kKG5ld2lmKQorICAgICAgICAgICAgICAgIGlmIGxlbihub2RlKSA9PSAzOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNvbV9jb21wX2l0ZXIobm9kZVszXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICgidW5leHBlY3RlZCBnZW5lcmF0b3IgZXhwcmVzc2lvbiBlbGVtZW50OiAlcyAlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIChub2RlLCBsaW5lbm8pKQorICAgICAgICBmb3JzWzBdLmlzX291dG1vc3QgPSBUcnVlCisgICAgICAgIHJldHVybiBHZW5FeHByKEdlbkV4cHJJbm5lcihleHByLCBmb3JzKSwgbGluZW5vPWxpbmVubykKKworICAgIGRlZiBjb21fZGljdG9yc2V0bWFrZXIoc2VsZiwgbm9kZWxpc3QpOgorICAgICAgICAjIGRpY3RvcnNldG1ha2VyOiAoICh0ZXN0ICc6JyB0ZXN0IChjb21wX2ZvciB8ICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSkgfAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICh0ZXN0IChjb21wX2ZvciB8ICgnLCcgdGVzdCkqIFsnLCddKSkgKQorICAgICAgICBhc3NlcnQgbm9kZWxpc3RbMF0gPT0gc3ltYm9sLmRpY3RvcnNldG1ha2VyCisgICAgICAgIG5vZGVsaXN0ID0gbm9kZWxpc3RbMTpdCisgICAgICAgIGlmIGxlbihub2RlbGlzdCkgPT0gMSBvciBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5DT01NQToKKyAgICAgICAgICAgICMgc2V0IGxpdGVyYWwKKyAgICAgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihub2RlbGlzdCksIDIpOgorICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSkKKyAgICAgICAgICAgIHJldHVybiBTZXQoaXRlbXMsIGxpbmVubz1pdGVtc1swXS5saW5lbm8pCisgICAgICAgIGVsaWYgbm9kZWxpc3RbMV1bMF0gPT0gc3ltYm9sLmNvbXBfZm9yOgorICAgICAgICAgICAgIyBzZXQgY29tcHJlaGVuc2lvbgorICAgICAgICAgICAgZXhwciA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fY29tcHJlaGVuc2lvbihleHByLCBOb25lLCBub2RlbGlzdFsxXSwgJ3NldCcpCisgICAgICAgIGVsaWYgbGVuKG5vZGVsaXN0KSA+IDMgYW5kIG5vZGVsaXN0WzNdWzBdID09IHN5bWJvbC5jb21wX2ZvcjoKKyAgICAgICAgICAgICMgZGljdCBjb21wcmVoZW5zaW9uCisgICAgICAgICAgICBhc3NlcnQgbm9kZWxpc3RbMV1bMF0gPT0gdG9rZW4uQ09MT04KKyAgICAgICAgICAgIGtleSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMF0pCisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fY29tcHJlaGVuc2lvbihrZXksIHZhbHVlLCBub2RlbGlzdFszXSwgJ2RpY3QnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBkaWN0IGxpdGVyYWwKKyAgICAgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihub2RlbGlzdCksIDQpOgorICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgoc2VsZi5jb21fbm9kZShub2RlbGlzdFtpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMl0pKSkKKyAgICAgICAgICAgIHJldHVybiBEaWN0KGl0ZW1zLCBsaW5lbm89aXRlbXNbMF1bMF0ubGluZW5vKQorCisgICAgZGVmIGNvbV9hcHBseV90cmFpbGVyKHNlbGYsIHByaW1hcnlOb2RlLCBub2RlbGlzdCk6CisgICAgICAgIHQgPSBub2RlbGlzdFsxXVswXQorICAgICAgICBpZiB0ID09IHRva2VuLkxQQVI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fY2FsbF9mdW5jdGlvbihwcmltYXJ5Tm9kZSwgbm9kZWxpc3RbMl0pCisgICAgICAgIGlmIHQgPT0gdG9rZW4uRE9UOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3NlbGVjdF9tZW1iZXIocHJpbWFyeU5vZGUsIG5vZGVsaXN0WzJdKQorICAgICAgICBpZiB0ID09IHRva2VuLkxTUUI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fc3Vic2NyaXB0bGlzdChwcmltYXJ5Tm9kZSwgbm9kZWxpc3RbMl0sIE9QX0FQUExZKQorCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yLCAndW5rbm93biBub2RlIHR5cGU6ICVzJyAlIHQKKworICAgIGRlZiBjb21fc2VsZWN0X21lbWJlcihzZWxmLCBwcmltYXJ5Tm9kZSwgbm9kZWxpc3QpOgorICAgICAgICBpZiBub2RlbGlzdFswXSAhPSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJtZW1iZXIgbXVzdCBiZSBhIG5hbWUiCisgICAgICAgIHJldHVybiBHZXRhdHRyKHByaW1hcnlOb2RlLCBub2RlbGlzdFsxXSwgbGluZW5vPW5vZGVsaXN0WzJdKQorCisgICAgZGVmIGNvbV9jYWxsX2Z1bmN0aW9uKHNlbGYsIHByaW1hcnlOb2RlLCBub2RlbGlzdCk6CisgICAgICAgIGlmIG5vZGVsaXN0WzBdID09IHRva2VuLlJQQVI6CisgICAgICAgICAgICByZXR1cm4gQ2FsbEZ1bmMocHJpbWFyeU5vZGUsIFtdLCBsaW5lbm89ZXh0cmFjdExpbmVObyhub2RlbGlzdCkpCisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBrdyA9IDAKKyAgICAgICAgc3Rhcl9ub2RlID0gZHN0YXJfbm9kZSA9IE5vbmUKKyAgICAgICAgbGVuX25vZGVsaXN0ID0gbGVuKG5vZGVsaXN0KQorICAgICAgICBpID0gMQorICAgICAgICB3aGlsZSBpIDwgbGVuX25vZGVsaXN0OgorICAgICAgICAgICAgbm9kZSA9IG5vZGVsaXN0W2ldCisKKyAgICAgICAgICAgIGlmIG5vZGVbMF09PXRva2VuLlNUQVI6CisgICAgICAgICAgICAgICAgaWYgc3Rhcl9ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgJ2FscmVhZHkgaGF2ZSB0aGUgdmFyYXJncyBpbmRlbnRpZmllcicKKyAgICAgICAgICAgICAgICBzdGFyX25vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMV0pCisgICAgICAgICAgICAgICAgaSA9IGkgKyAzCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgbm9kZVswXT09dG9rZW4uRE9VQkxFU1RBUjoKKyAgICAgICAgICAgICAgICBpZiBkc3Rhcl9ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvciwgJ2FscmVhZHkgaGF2ZSB0aGUga3dhcmdzIGluZGVudGlmaWVyJworICAgICAgICAgICAgICAgIGRzdGFyX25vZGUgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMV0pCisgICAgICAgICAgICAgICAgaSA9IGkgKyAzCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBwb3NpdGlvbmFsIG9yIG5hbWVkIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGt3LCByZXN1bHQgPSBzZWxmLmNvbV9hcmd1bWVudChub2RlLCBrdywgc3Rhcl9ub2RlKQorCisgICAgICAgICAgICBpZiBsZW5fbm9kZWxpc3QgIT0gMiBhbmQgaXNpbnN0YW5jZShyZXN1bHQsIEdlbkV4cHIpIFwKKyAgICAgICAgICAgICAgIGFuZCBsZW4obm9kZSkgPT0gMyBhbmQgbm9kZVsyXVswXSA9PSBzeW1ib2wuY29tcF9mb3I6CisgICAgICAgICAgICAgICAgIyBhbGxvdyBmKHggZm9yIHggaW4geSksIGJ1dCByZWplY3QgZih4IGZvciB4IGluIHksIDEpCisgICAgICAgICAgICAgICAgIyBzaG91bGQgdXNlIGYoKHggZm9yIHggaW4geSksIDEpIGluc3RlYWQgb2YgZih4IGZvciB4IGluIHksIDEpCisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICdnZW5lcmF0b3IgZXhwcmVzc2lvbiBuZWVkcyBwYXJlbnRoZXNpcycKKworICAgICAgICAgICAgYXJncy5hcHBlbmQocmVzdWx0KQorICAgICAgICAgICAgaSA9IGkgKyAyCisKKyAgICAgICAgcmV0dXJuIENhbGxGdW5jKHByaW1hcnlOb2RlLCBhcmdzLCBzdGFyX25vZGUsIGRzdGFyX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89ZXh0cmFjdExpbmVObyhub2RlbGlzdCkpCisKKyAgICBkZWYgY29tX2FyZ3VtZW50KHNlbGYsIG5vZGVsaXN0LCBrdywgc3Rhcl9ub2RlKToKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAzIGFuZCBub2RlbGlzdFsyXVswXSA9PSBzeW1ib2wuY29tcF9mb3I6CisgICAgICAgICAgICB0ZXN0ID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFsxXSkKKyAgICAgICAgICAgIHJldHVybiAwLCBzZWxmLmNvbV9nZW5lcmF0b3JfZXhwcmVzc2lvbih0ZXN0LCBub2RlbGlzdFsyXSkKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAyOgorICAgICAgICAgICAgaWYga3c6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJub24ta2V5d29yZCBhcmcgYWZ0ZXIga2V5d29yZCBhcmciCisgICAgICAgICAgICBpZiBzdGFyX25vZGU6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJvbmx5IG5hbWVkIGFyZ3VtZW50cyBtYXkgZm9sbG93ICpleHByZXNzaW9uIgorICAgICAgICAgICAgcmV0dXJuIDAsIHNlbGYuY29tX25vZGUobm9kZWxpc3RbMV0pCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29tX25vZGUobm9kZWxpc3RbM10pCisgICAgICAgIG4gPSBub2RlbGlzdFsxXQorICAgICAgICB3aGlsZSBsZW4obikgPT0gMiBhbmQgblswXSAhPSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgbiA9IG5bMV0KKyAgICAgICAgaWYgblswXSAhPSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IsICJrZXl3b3JkIGNhbid0IGJlIGFuIGV4cHJlc3Npb24gKCVzKSIlblswXQorICAgICAgICBub2RlID0gS2V5d29yZChuWzFdLCByZXN1bHQsIGxpbmVubz1uWzJdKQorICAgICAgICByZXR1cm4gMSwgbm9kZQorCisgICAgZGVmIGNvbV9zdWJzY3JpcHRsaXN0KHNlbGYsIHByaW1hcnksIG5vZGVsaXN0LCBhc3NpZ25pbmcpOgorICAgICAgICAjIHNsaWNpbmc6ICAgICAgc2ltcGxlX3NsaWNpbmcgfCBleHRlbmRlZF9zbGljaW5nCisgICAgICAgICMgc2ltcGxlX3NsaWNpbmc6ICAgcHJpbWFyeSAiWyIgc2hvcnRfc2xpY2UgIl0iCisgICAgICAgICMgZXh0ZW5kZWRfc2xpY2luZzogcHJpbWFyeSAiWyIgc2xpY2VfbGlzdCAiXSIKKyAgICAgICAgIyBzbGljZV9saXN0OiAgIHNsaWNlX2l0ZW0gKCIsIiBzbGljZV9pdGVtKSogWyIsIl0KKworICAgICAgICAjIGJhY2t3YXJkcyBjb21wYXQgc2xpY2UgZm9yICdbaTpqXScKKyAgICAgICAgaWYgbGVuKG5vZGVsaXN0KSA9PSAyOgorICAgICAgICAgICAgc3ViID0gbm9kZWxpc3RbMV0KKyAgICAgICAgICAgIGlmIChzdWJbMV1bMF0gPT0gdG9rZW4uQ09MT04gb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW4oc3ViKSA+IDIgYW5kIHN1YlsyXVswXSA9PSB0b2tlbi5DT0xPTikpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViWy0xXVswXSAhPSBzeW1ib2wuc2xpY2VvcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fc2xpY2UocHJpbWFyeSwgc3ViLCBhc3NpZ25pbmcpCisKKyAgICAgICAgc3Vic2NyaXB0cyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlbGlzdCksIDIpOgorICAgICAgICAgICAgc3Vic2NyaXB0cy5hcHBlbmQoc2VsZi5jb21fc3Vic2NyaXB0KG5vZGVsaXN0W2ldKSkKKyAgICAgICAgcmV0dXJuIFN1YnNjcmlwdChwcmltYXJ5LCBhc3NpZ25pbmcsIHN1YnNjcmlwdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPWV4dHJhY3RMaW5lTm8obm9kZWxpc3QpKQorCisgICAgZGVmIGNvbV9zdWJzY3JpcHQoc2VsZiwgbm9kZSk6CisgICAgICAgICMgc2xpY2VfaXRlbTogZXhwcmVzc2lvbiB8IHByb3Blcl9zbGljZSB8IGVsbGlwc2lzCisgICAgICAgIGNoID0gbm9kZVsxXQorICAgICAgICB0ID0gY2hbMF0KKyAgICAgICAgaWYgdCA9PSB0b2tlbi5ET1QgYW5kIG5vZGVbMl1bMF0gPT0gdG9rZW4uRE9UOgorICAgICAgICAgICAgcmV0dXJuIEVsbGlwc2lzKCkKKyAgICAgICAgaWYgdCA9PSB0b2tlbi5DT0xPTiBvciBsZW4obm9kZSkgPiAyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3NsaWNlb2JqKG5vZGUpCisgICAgICAgIHJldHVybiBzZWxmLmNvbV9ub2RlKGNoKQorCisgICAgZGVmIGNvbV9zbGljZW9iaihzZWxmLCBub2RlKToKKyAgICAgICAgIyBwcm9wZXJfc2xpY2U6IHNob3J0X3NsaWNlIHwgbG9uZ19zbGljZQorICAgICAgICAjIHNob3J0X3NsaWNlOiAgW2xvd2VyX2JvdW5kXSAiOiIgW3VwcGVyX2JvdW5kXQorICAgICAgICAjIGxvbmdfc2xpY2U6ICAgc2hvcnRfc2xpY2UgIjoiIFtzdHJpZGVdCisgICAgICAgICMgbG93ZXJfYm91bmQ6ICBleHByZXNzaW9uCisgICAgICAgICMgdXBwZXJfYm91bmQ6ICBleHByZXNzaW9uCisgICAgICAgICMgc3RyaWRlOiAgICAgICBleHByZXNzaW9uCisgICAgICAgICMKKyAgICAgICAgIyBOb3RlOiBhIHN0cmlkZSBtYXkgYmUgZnVydGhlciBzbGljaW5nLi4uCisKKyAgICAgICAgaXRlbXMgPSBbXQorCisgICAgICAgIGlmIG5vZGVbMV1bMF0gPT0gdG9rZW4uQ09MT046CisgICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29uc3QoTm9uZSkpCisgICAgICAgICAgICBpID0gMgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHNlbGYuY29tX25vZGUobm9kZVsxXSkpCisgICAgICAgICAgICAjIGkgPT0gMiBpcyBhIENPTE9OCisgICAgICAgICAgICBpID0gMworCisgICAgICAgIGlmIGkgPCBsZW4obm9kZSkgYW5kIG5vZGVbaV1bMF0gPT0gc3ltYm9sLnRlc3Q6CisgICAgICAgICAgICBpdGVtcy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlW2ldKSkKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKENvbnN0KE5vbmUpKQorCisgICAgICAgICMgYSBzaG9ydF9zbGljZSBoYXMgYmVlbiBidWlsdC4gbG9vayBmb3IgbG9uZ19zbGljZSBub3cgYnkgbG9va2luZworICAgICAgICAjIGZvciBzdHJpZGVzLi4uCisgICAgICAgIGZvciBqIGluIHJhbmdlKGksIGxlbihub2RlKSk6CisgICAgICAgICAgICBjaCA9IG5vZGVbal0KKyAgICAgICAgICAgIGlmIGxlbihjaCkgPT0gMjoKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoQ29uc3QoTm9uZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChzZWxmLmNvbV9ub2RlKGNoWzJdKSkKKyAgICAgICAgcmV0dXJuIFNsaWNlb2JqKGl0ZW1zLCBsaW5lbm89ZXh0cmFjdExpbmVObyhub2RlKSkKKworICAgIGRlZiBjb21fc2xpY2Uoc2VsZiwgcHJpbWFyeSwgbm9kZSwgYXNzaWduaW5nKToKKyAgICAgICAgIyBzaG9ydF9zbGljZTogIFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF0KKyAgICAgICAgbG93ZXIgPSB1cHBlciA9IE5vbmUKKyAgICAgICAgaWYgbGVuKG5vZGUpID09IDM6CisgICAgICAgICAgICBpZiBub2RlWzFdWzBdID09IHRva2VuLkNPTE9OOgorICAgICAgICAgICAgICAgIHVwcGVyID0gc2VsZi5jb21fbm9kZShub2RlWzJdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb3dlciA9IHNlbGYuY29tX25vZGUobm9kZVsxXSkKKyAgICAgICAgZWxpZiBsZW4obm9kZSkgPT0gNDoKKyAgICAgICAgICAgIGxvd2VyID0gc2VsZi5jb21fbm9kZShub2RlWzFdKQorICAgICAgICAgICAgdXBwZXIgPSBzZWxmLmNvbV9ub2RlKG5vZGVbM10pCisgICAgICAgIHJldHVybiBTbGljZShwcmltYXJ5LCBhc3NpZ25pbmcsIGxvd2VyLCB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgIGxpbmVubz1leHRyYWN0TGluZU5vKG5vZGUpKQorCisgICAgZGVmIGdldF9kb2NzdHJpbmcoc2VsZiwgbm9kZSwgbj1Ob25lKToKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgbiA9IG5vZGVbMF0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlWzE6XQorICAgICAgICBpZiBuID09IHN5bWJvbC5zdWl0ZToKKyAgICAgICAgICAgIGlmIGxlbihub2RlKSA9PSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9kb2NzdHJpbmcobm9kZVswXSkKKyAgICAgICAgICAgIGZvciBzdWIgaW4gbm9kZToKKyAgICAgICAgICAgICAgICBpZiBzdWJbMF0gPT0gc3ltYm9sLnN0bXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9kb2NzdHJpbmcoc3ViKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuZmlsZV9pbnB1dDoKKyAgICAgICAgICAgIGZvciBzdWIgaW4gbm9kZToKKyAgICAgICAgICAgICAgICBpZiBzdWJbMF0gPT0gc3ltYm9sLnN0bXQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9kb2NzdHJpbmcoc3ViKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgbiA9PSBzeW1ib2wuYXRvbToKKyAgICAgICAgICAgIGlmIG5vZGVbMF1bMF0gPT0gdG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgICAgIHMgPSAnJworICAgICAgICAgICAgICAgIGZvciB0IGluIG5vZGU6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgZXZhbCh0WzFdKQorICAgICAgICAgICAgICAgIHJldHVybiBzCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBuID09IHN5bWJvbC5zdG10IG9yIG4gPT0gc3ltYm9sLnNpbXBsZV9zdG10IFwKKyAgICAgICAgICAgb3IgbiA9PSBzeW1ib2wuc21hbGxfc3RtdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9kb2NzdHJpbmcobm9kZVswXSkKKyAgICAgICAgaWYgbiBpbiBfZG9jX25vZGVzIGFuZCBsZW4obm9kZSkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9kb2NzdHJpbmcobm9kZVswXSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitfZG9jX25vZGVzID0gWworICAgIHN5bWJvbC5leHByX3N0bXQsCisgICAgc3ltYm9sLnRlc3RsaXN0LAorICAgIHN5bWJvbC50ZXN0bGlzdF9zYWZlLAorICAgIHN5bWJvbC50ZXN0LAorICAgIHN5bWJvbC5vcl90ZXN0LAorICAgIHN5bWJvbC5hbmRfdGVzdCwKKyAgICBzeW1ib2wubm90X3Rlc3QsCisgICAgc3ltYm9sLmNvbXBhcmlzb24sCisgICAgc3ltYm9sLmV4cHIsCisgICAgc3ltYm9sLnhvcl9leHByLAorICAgIHN5bWJvbC5hbmRfZXhwciwKKyAgICBzeW1ib2wuc2hpZnRfZXhwciwKKyAgICBzeW1ib2wuYXJpdGhfZXhwciwKKyAgICBzeW1ib2wudGVybSwKKyAgICBzeW1ib2wuZmFjdG9yLAorICAgIHN5bWJvbC5wb3dlciwKKyAgICBdCisKKyMgY29tcF9vcDogJzwnIHwgJz4nIHwgJz0nIHwgJz49JyB8ICc8PScgfCAnPD4nIHwgJyE9JyB8ICc9PScKKyMgICAgICAgICAgICAgfCAnaW4nIHwgJ25vdCcgJ2luJyB8ICdpcycgfCAnaXMnICdub3QnCitfY21wX3R5cGVzID0geworICAgIHRva2VuLkxFU1MgOiAnPCcsCisgICAgdG9rZW4uR1JFQVRFUiA6ICc+JywKKyAgICB0b2tlbi5FUUVRVUFMIDogJz09JywKKyAgICB0b2tlbi5FUVVBTCA6ICc9PScsCisgICAgdG9rZW4uTEVTU0VRVUFMIDogJzw9JywKKyAgICB0b2tlbi5HUkVBVEVSRVFVQUwgOiAnPj0nLAorICAgIHRva2VuLk5PVEVRVUFMIDogJyE9JywKKyAgICB9CisKK19sZWdhbF9ub2RlX3R5cGVzID0gWworICAgIHN5bWJvbC5mdW5jZGVmLAorICAgIHN5bWJvbC5jbGFzc2RlZiwKKyAgICBzeW1ib2wuc3RtdCwKKyAgICBzeW1ib2wuc21hbGxfc3RtdCwKKyAgICBzeW1ib2wuZmxvd19zdG10LAorICAgIHN5bWJvbC5zaW1wbGVfc3RtdCwKKyAgICBzeW1ib2wuY29tcG91bmRfc3RtdCwKKyAgICBzeW1ib2wuZXhwcl9zdG10LAorICAgIHN5bWJvbC5wcmludF9zdG10LAorICAgIHN5bWJvbC5kZWxfc3RtdCwKKyAgICBzeW1ib2wucGFzc19zdG10LAorICAgIHN5bWJvbC5icmVha19zdG10LAorICAgIHN5bWJvbC5jb250aW51ZV9zdG10LAorICAgIHN5bWJvbC5yZXR1cm5fc3RtdCwKKyAgICBzeW1ib2wucmFpc2Vfc3RtdCwKKyAgICBzeW1ib2wuaW1wb3J0X3N0bXQsCisgICAgc3ltYm9sLmdsb2JhbF9zdG10LAorICAgIHN5bWJvbC5leGVjX3N0bXQsCisgICAgc3ltYm9sLmFzc2VydF9zdG10LAorICAgIHN5bWJvbC5pZl9zdG10LAorICAgIHN5bWJvbC53aGlsZV9zdG10LAorICAgIHN5bWJvbC5mb3Jfc3RtdCwKKyAgICBzeW1ib2wudHJ5X3N0bXQsCisgICAgc3ltYm9sLndpdGhfc3RtdCwKKyAgICBzeW1ib2wuc3VpdGUsCisgICAgc3ltYm9sLnRlc3RsaXN0LAorICAgIHN5bWJvbC50ZXN0bGlzdF9zYWZlLAorICAgIHN5bWJvbC50ZXN0LAorICAgIHN5bWJvbC5hbmRfdGVzdCwKKyAgICBzeW1ib2wubm90X3Rlc3QsCisgICAgc3ltYm9sLmNvbXBhcmlzb24sCisgICAgc3ltYm9sLmV4cHJsaXN0LAorICAgIHN5bWJvbC5leHByLAorICAgIHN5bWJvbC54b3JfZXhwciwKKyAgICBzeW1ib2wuYW5kX2V4cHIsCisgICAgc3ltYm9sLnNoaWZ0X2V4cHIsCisgICAgc3ltYm9sLmFyaXRoX2V4cHIsCisgICAgc3ltYm9sLnRlcm0sCisgICAgc3ltYm9sLmZhY3RvciwKKyAgICBzeW1ib2wucG93ZXIsCisgICAgc3ltYm9sLmF0b20sCisgICAgXQorCitpZiBoYXNhdHRyKHN5bWJvbCwgJ3lpZWxkX3N0bXQnKToKKyAgICBfbGVnYWxfbm9kZV90eXBlcy5hcHBlbmQoc3ltYm9sLnlpZWxkX3N0bXQpCitpZiBoYXNhdHRyKHN5bWJvbCwgJ3lpZWxkX2V4cHInKToKKyAgICBfbGVnYWxfbm9kZV90eXBlcy5hcHBlbmQoc3ltYm9sLnlpZWxkX2V4cHIpCisKK19hc3NpZ25fdHlwZXMgPSBbCisgICAgc3ltYm9sLnRlc3QsCisgICAgc3ltYm9sLm9yX3Rlc3QsCisgICAgc3ltYm9sLmFuZF90ZXN0LAorICAgIHN5bWJvbC5ub3RfdGVzdCwKKyAgICBzeW1ib2wuY29tcGFyaXNvbiwKKyAgICBzeW1ib2wuZXhwciwKKyAgICBzeW1ib2wueG9yX2V4cHIsCisgICAgc3ltYm9sLmFuZF9leHByLAorICAgIHN5bWJvbC5zaGlmdF9leHByLAorICAgIHN5bWJvbC5hcml0aF9leHByLAorICAgIHN5bWJvbC50ZXJtLAorICAgIHN5bWJvbC5mYWN0b3IsCisgICAgXQorCitfbmFtZXMgPSB7fQorZm9yIGssIHYgaW4gc3ltYm9sLnN5bV9uYW1lLml0ZW1zKCk6CisgICAgX25hbWVzW2tdID0gdgorZm9yIGssIHYgaW4gdG9rZW4udG9rX25hbWUuaXRlbXMoKToKKyAgICBfbmFtZXNba10gPSB2CisKK2RlZiBkZWJ1Z190cmVlKHRyZWUpOgorICAgIGwgPSBbXQorICAgIGZvciBlbHQgaW4gdHJlZToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShlbHQsIGludCk6CisgICAgICAgICAgICBsLmFwcGVuZChfbmFtZXMuZ2V0KGVsdCwgZWx0KSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGVsdCwgc3RyKToKKyAgICAgICAgICAgIGwuYXBwZW5kKGVsdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGwuYXBwZW5kKGRlYnVnX3RyZWUoZWx0KSkKKyAgICByZXR1cm4gbApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci90cmFuc2Zvcm1lci5weWMgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmZkYzUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci90cmFuc2Zvcm1lci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci90cmFuc2Zvcm1lci5weW8gYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJkOWRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci90cmFuc2Zvcm1lci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGY1NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3Zpc2l0b3IucHkKQEAgLTAsMCArMSwxMTMgQEAKK2Zyb20gY29tcGlsZXIgaW1wb3J0IGFzdAorCisjIFhYWCBzaG91bGQgcHJvYmFibHkgcmVuYW1lIEFTVFZpc2l0b3IgdG8gQVNUV2Fsa2VyCisjIFhYWCBjYW4gaXQgYmUgbWFkZSBldmVuIG1vcmUgZ2VuZXJpYz8KKworY2xhc3MgQVNUVmlzaXRvcjoKKyAgICAiIiJQZXJmb3JtcyBhIGRlcHRoLWZpcnN0IHdhbGsgb2YgdGhlIEFTVAorCisgICAgVGhlIEFTVFZpc2l0b3Igd2lsbCB3YWxrIHRoZSBBU1QsIHBlcmZvcm1pbmcgZWl0aGVyIGEgcHJlb3JkZXIgb3IKKyAgICBwb3N0b3JkZXIgdHJhdmVyc2FsIGRlcGVuZGluZyBvbiB3aGljaCBtZXRob2QgaXMgY2FsbGVkLgorCisgICAgbWV0aG9kczoKKyAgICBwcmVvcmRlcih0cmVlLCB2aXNpdG9yKQorICAgIHBvc3RvcmRlcih0cmVlLCB2aXNpdG9yKQorICAgICAgICB0cmVlOiBhbiBpbnN0YW5jZSBvZiBhc3QuTm9kZQorICAgICAgICB2aXNpdG9yOiBhbiBpbnN0YW5jZSB3aXRoIHZpc2l0WFhYIG1ldGhvZHMKKworICAgIFRoZSBBU1RWaXNpdG9yIGlzIHJlc3BvbnNpYmxlIGZvciB3YWxraW5nIG92ZXIgdGhlIHRyZWUgaW4gdGhlCisgICAgY29ycmVjdCBvcmRlci4gIEZvciBlYWNoIG5vZGUsIGl0IGNoZWNrcyB0aGUgdmlzaXRvciBhcmd1bWVudCBmb3IKKyAgICBhIG1ldGhvZCBuYW1lZCAndmlzaXROb2RlVHlwZScgd2hlcmUgTm9kZVR5cGUgaXMgdGhlIG5hbWUgb2YgdGhlCisgICAgbm9kZSdzIGNsYXNzLCBlLmcuIENsYXNzLiAgSWYgdGhlIG1ldGhvZCBleGlzdHMsIGl0IGlzIGNhbGxlZAorICAgIHdpdGggdGhlIG5vZGUgYXMgaXRzIHNvbGUgYXJndW1lbnQuCisKKyAgICBUaGUgdmlzaXRvciBtZXRob2QgZm9yIGEgcGFydGljdWxhciBub2RlIHR5cGUgY2FuIGNvbnRyb2wgaG93CisgICAgY2hpbGQgbm9kZXMgYXJlIHZpc2l0ZWQgZHVyaW5nIGEgcHJlb3JkZXIgd2Fsay4gIChJdCBjYW4ndCBjb250cm9sCisgICAgdGhlIG9yZGVyIGR1cmluZyBhIHBvc3RvcmRlciB3YWxrLCBiZWNhdXNlIGl0IGlzIGNhbGxlZCBfYWZ0ZXJfCisgICAgdGhlIHdhbGsgaGFzIG9jY3VycmVkLikgIFRoZSBBU1RWaXNpdG9yIG1vZGlmaWVzIHRoZSB2aXNpdG9yCisgICAgYXJndW1lbnQgYnkgYWRkaW5nIGEgdmlzaXQgbWV0aG9kIHRvIHRoZSB2aXNpdG9yOyB0aGlzIG1ldGhvZCBjYW4KKyAgICBiZSB1c2VkIHRvIHZpc2l0IGEgY2hpbGQgbm9kZSBvZiBhcmJpdHJhcnkgdHlwZS4KKyAgICAiIiIKKworICAgIFZFUkJPU0UgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubm9kZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2FjaGUgPSB7fQorCisgICAgZGVmIGRlZmF1bHQoc2VsZiwgbm9kZSwgKmFyZ3MpOgorICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5nZXRDaGlsZE5vZGVzKCk6CisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGNoaWxkLCAqYXJncykKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCBub2RlLCAqYXJncyk6CisgICAgICAgIHNlbGYubm9kZSA9IG5vZGUKKyAgICAgICAga2xhc3MgPSBub2RlLl9fY2xhc3NfXworICAgICAgICBtZXRoID0gc2VsZi5fY2FjaGUuZ2V0KGtsYXNzLCBOb25lKQorICAgICAgICBpZiBtZXRoIGlzIE5vbmU6CisgICAgICAgICAgICBjbGFzc05hbWUgPSBrbGFzcy5fX25hbWVfXworICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoc2VsZi52aXNpdG9yLCAndmlzaXQnICsgY2xhc3NOYW1lLCBzZWxmLmRlZmF1bHQpCisgICAgICAgICAgICBzZWxmLl9jYWNoZVtrbGFzc10gPSBtZXRoCisjIyAgICAgICAgaWYgc2VsZi5WRVJCT1NFID4gMDoKKyMjICAgICAgICAgICAgY2xhc3NOYW1lID0ga2xhc3MuX19uYW1lX18KKyMjICAgICAgICAgICAgaWYgc2VsZi5WRVJCT1NFID09IDE6CisjIyAgICAgICAgICAgICAgICBpZiBtZXRoID09IDA6CisjIyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImRpc3BhdGNoIiwgY2xhc3NOYW1lCisjIyAgICAgICAgICAgIGVsc2U6CisjIyAgICAgICAgICAgICAgICBwcmludCAiZGlzcGF0Y2giLCBjbGFzc05hbWUsIChtZXRoIGFuZCBtZXRoLl9fbmFtZV9fIG9yICcnKQorICAgICAgICByZXR1cm4gbWV0aChub2RlLCAqYXJncykKKworICAgIGRlZiBwcmVvcmRlcihzZWxmLCB0cmVlLCB2aXNpdG9yLCAqYXJncyk6CisgICAgICAgICIiIkRvIHByZW9yZGVyIHdhbGsgb2YgdHJlZSB1c2luZyB2aXNpdG9yIiIiCisgICAgICAgIHNlbGYudmlzaXRvciA9IHZpc2l0b3IKKyAgICAgICAgdmlzaXRvci52aXNpdCA9IHNlbGYuZGlzcGF0Y2gKKyAgICAgICAgc2VsZi5kaXNwYXRjaCh0cmVlLCAqYXJncykgIyBYWFggKmFyZ3MgbWFrZSBzZW5zZT8KKworY2xhc3MgRXhhbXBsZUFTVFZpc2l0b3IoQVNUVmlzaXRvcik6CisgICAgIiIiUHJpbnRzIGV4YW1wbGVzIG9mIHRoZSBub2RlcyB0aGF0IGFyZW4ndCB2aXNpdGVkCisKKyAgICBUaGlzIHZpc2l0b3ItZHJpdmVyIGlzIG9ubHkgdXNlZnVsIGZvciBkZXZlbG9wbWVudCwgd2hlbiBpdCdzCisgICAgaGVscGZ1bCB0byBkZXZlbG9wIGEgdmlzaXRvciBpbmNyZW1lbnRhbGx5LCBhbmQgZ2V0IGZlZWRiYWNrIG9uIHdoYXQKKyAgICB5b3Ugc3RpbGwgaGF2ZSB0byBkby4KKyAgICAiIiIKKyAgICBleGFtcGxlcyA9IHt9CisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgbm9kZSwgKmFyZ3MpOgorICAgICAgICBzZWxmLm5vZGUgPSBub2RlCisgICAgICAgIG1ldGggPSBzZWxmLl9jYWNoZS5nZXQobm9kZS5fX2NsYXNzX18sIE5vbmUpCisgICAgICAgIGNsYXNzTmFtZSA9IG5vZGUuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIGlmIG1ldGggaXMgTm9uZToKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYudmlzaXRvciwgJ3Zpc2l0JyArIGNsYXNzTmFtZSwgMCkKKyAgICAgICAgICAgIHNlbGYuX2NhY2hlW25vZGUuX19jbGFzc19fXSA9IG1ldGgKKyAgICAgICAgaWYgc2VsZi5WRVJCT1NFID4gMToKKyAgICAgICAgICAgIHByaW50ICJkaXNwYXRjaCIsIGNsYXNzTmFtZSwgKG1ldGggYW5kIG1ldGguX19uYW1lX18gb3IgJycpCisgICAgICAgIGlmIG1ldGg6CisgICAgICAgICAgICBtZXRoKG5vZGUsICphcmdzKQorICAgICAgICBlbGlmIHNlbGYuVkVSQk9TRSA+IDA6CisgICAgICAgICAgICBrbGFzcyA9IG5vZGUuX19jbGFzc19fCisgICAgICAgICAgICBpZiBrbGFzcyBub3QgaW4gc2VsZi5leGFtcGxlczoKKyAgICAgICAgICAgICAgICBzZWxmLmV4YW1wbGVzW2tsYXNzXSA9IGtsYXNzCisgICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgICAgICBwcmludCBzZWxmLnZpc2l0b3IKKyAgICAgICAgICAgICAgICBwcmludCBrbGFzcworICAgICAgICAgICAgICAgIGZvciBhdHRyIGluIGRpcihub2RlKToKKyAgICAgICAgICAgICAgICAgICAgaWYgYXR0clswXSAhPSAnXyc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiXHQiLCAiJS0xMi4xMnMiICUgYXR0ciwgZ2V0YXR0cihub2RlLCBhdHRyKQorICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0KG5vZGUsICphcmdzKQorCisjIFhYWCB0aGlzIGlzIGFuIEFQSSBjaGFuZ2UKKworX3dhbGtlciA9IEFTVFZpc2l0b3IKK2RlZiB3YWxrKHRyZWUsIHZpc2l0b3IsIHdhbGtlcj1Ob25lLCB2ZXJib3NlPU5vbmUpOgorICAgIGlmIHdhbGtlciBpcyBOb25lOgorICAgICAgICB3YWxrZXIgPSBfd2Fsa2VyKCkKKyAgICBpZiB2ZXJib3NlIGlzIG5vdCBOb25lOgorICAgICAgICB3YWxrZXIuVkVSQk9TRSA9IHZlcmJvc2UKKyAgICB3YWxrZXIucHJlb3JkZXIodHJlZSwgdmlzaXRvcikKKyAgICByZXR1cm4gd2Fsa2VyLnZpc2l0b3IKKworZGVmIGR1bXBOb2RlKG5vZGUpOgorICAgIHByaW50IG5vZGUuX19jbGFzc19fCisgICAgZm9yIGF0dHIgaW4gZGlyKG5vZGUpOgorICAgICAgICBpZiBhdHRyWzBdICE9ICdfJzoKKyAgICAgICAgICAgIHByaW50ICJcdCIsICIlLTEwLjEwcyIgJSBhdHRyLCBnZXRhdHRyKG5vZGUsIGF0dHIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3Zpc2l0b3IucHljIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMxODYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbXBpbGVyL3Zpc2l0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMxODYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb21waWxlci92aXNpdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbmZpZy9NYWtlZmlsZSBiL2xpYi9weXRob24yLjcvY29uZmlnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZDdjYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9NYWtlZmlsZQpAQCAtMCwwICsxLDE0MDcgQEAKKyMgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBNYWtlZmlsZS5wcmUgYnkgbWFrZXNldHVwLgorIyBUb3AtbGV2ZWwgTWFrZWZpbGUgZm9yIFB5dGhvbgorIworIyBBcyBkaXN0cmlidXRlZCwgdGhpcyBmaWxlIGlzIGNhbGxlZCBNYWtlZmlsZS5wcmUuaW47IGl0IGlzIHByb2Nlc3NlZAorIyBpbnRvIHRoZSByZWFsIE1ha2VmaWxlIGJ5IHJ1bm5pbmcgdGhlIHNjcmlwdCAuL2NvbmZpZ3VyZSwgd2hpY2gKKyMgcmVwbGFjZXMgdGhpbmdzIGxpa2UgQHNwYW1AIHdpdGggdmFsdWVzIGFwcHJvcHJpYXRlIGZvciB5b3VyIHN5c3RlbS4KKyMgVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBlZGl0IE1ha2VmaWxlLCB5b3VyIGNoYW5nZXMgZ2V0IGxvc3QgdGhlIG5leHQKKyMgdGltZSB5b3UgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LiAgSWRlYWxseSwgeW91IGNhbiBkbzoKKyMKKyMJLi9jb25maWd1cmUKKyMJbWFrZQorIwltYWtlIHRlc3QKKyMJbWFrZSBpbnN0YWxsCisjCisjIElmIHlvdSBoYXZlIGEgcHJldmlvdXMgdmVyc2lvbiBvZiBQeXRob24gaW5zdGFsbGVkIHRoYXQgeW91IGRvbid0CisjIHdhbnQgdG8gb3ZlcndyaXRlLCB5b3UgY2FuIHVzZSAibWFrZSBhbHRpbnN0YWxsIiBpbnN0ZWFkIG9mICJtYWtlCisjIGluc3RhbGwiLiAgUmVmZXIgdG8gdGhlICJJbnN0YWxsaW5nIiBzZWN0aW9uIGluIHRoZSBSRUFETUUgZmlsZSBmb3IKKyMgYWRkaXRpb25hbCBkZXRhaWxzLgorIworIyBTZWUgYWxzbyB0aGUgc2VjdGlvbiAiQnVpbGQgaW5zdHJ1Y3Rpb25zIiBpbiB0aGUgUkVBRE1FIGZpbGUuCisKKyMgPT09IFZhcmlhYmxlcyBzZXQgYnkgbWFrZXNldHVwID09PQorCitNT0RPQkpTPSAgICAgICAgICBNb2R1bGVzL3Bvc2l4bW9kdWxlLm8gIE1vZHVsZXMvdGhyZWFkbW9kdWxlLm8gIE1vZHVsZXMvc2lnbmFsbW9kdWxlLm8gIE1vZHVsZXMvZXJybm9tb2R1bGUubyAgTW9kdWxlcy9fc3JlLm8gIE1vZHVsZXMvX2NvZGVjc21vZHVsZS5vICBNb2R1bGVzL193ZWFrcmVmLm8gIE1vZHVsZXMvemlwaW1wb3J0Lm8gIE1vZHVsZXMvc3ltdGFibGVtb2R1bGUubyAgTW9kdWxlcy94eHN1YnR5cGUubworTU9ETElCUz0gICAgICAgICQoTE9DQUxNT0RMSUJTKSAkKEJBU0VNT0RMSUJTKQorCisjID09PSBWYXJpYWJsZXMgc2V0IGJ5IGNvbmZpZ3VyZQorVkVSU0lPTj0JMi43CitzcmNkaXI9CQkvcy9uZGstdG9vbGNoYWluL3NyYy9weXRob24vUHl0aG9uLTIuNy41CitWUEFUSD0JCS9zL25kay10b29sY2hhaW4vc3JjL3B5dGhvbi9QeXRob24tMi43LjUKK01TWVNWUEFUSD0JL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNQorYWJzX3NyY2Rpcj0JL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNQorYWJzX2J1aWxkZGlyPQkvdG1wL25kay1hbmRyZXdoc2llaC9idWlsZGhvc3QvYnVpbGQtcHl0aG9uLWxpbnV4LXg4Nl82NC0yLjcuNQorYnVpbGQ9CQl4ODZfNjQtcGMtbGludXgtZ251Citob3N0PQkJeDg2XzY0LXBjLWxpbnV4LWdudQorCitDQz0JCXg4Nl82NC1saW51eC1nbnUtZ2NjIC1wdGhyZWFkCitDWFg9CQl4ODZfNjQtbGludXgtZ251LWcrKyAtcHRocmVhZAorTUFJTkNDPQkJJChDQykKK0xJTktDQz0JCSQoUFVSSUZZKSAkKE1BSU5DQykKK0FSPQkJeDg2XzY0LWxpbnV4LWdudS1hcgorUkFOTElCPQkJeDg2XzY0LWxpbnV4LWdudS1yYW5saWIKK1NWTlZFUlNJT049CXN2bnZlcnNpb24gJChzcmNkaXIpCitIR1ZFUlNJT049CWhnIGlkIC1pICQoc3JjZGlyKQorSEdUQUc9CQloZyBpZCAtdCAkKHNyY2RpcikKK0hHQlJBTkNIPQloZyBpZCAtYiAkKHNyY2RpcikKKworR05VTEQ9ICAgICAgICAgIHllcworCisjIFNoZWxsIHVzZWQgYnkgbWFrZSAoc29tZSB2ZXJzaW9ucyBkZWZhdWx0IHRvIHRoZSBsb2dpbiBzaGVsbCwgd2hpY2ggaXMgYmFkKQorU0hFTEw9CQkvYmluL3NoCisKKyMgVXNlIHRoaXMgdG8gbWFrZSBhIGxpbmsgYmV0d2VlbiBweXRob24kKFZFUlNJT04pIGFuZCBweXRob24gaW4gJChCSU5ESVIpCitMTj0JCWxuCisKKyMgUG9ydGFibGUgaW5zdGFsbCBzY3JpcHQgKGNvbmZpZ3VyZSBkb2Vzbid0IGFsd2F5cyBndWVzcyByaWdodCkKK0lOU1RBTEw9CS91c3IvYmluL2luc3RhbGwgLWMKK0lOU1RBTExfUFJPR1JBTT0ke0lOU1RBTEx9CitJTlNUQUxMX1NDUklQVD0gJHtJTlNUQUxMfQorSU5TVEFMTF9EQVRBPQkke0lOU1RBTEx9IC1tIDY0NAorIyBTaGFyZWQgbGlicmFyaWVzIG11c3QgYmUgaW5zdGFsbGVkIHdpdGggZXhlY3V0YWJsZSBtb2RlIG9uIHNvbWUgc3lzdGVtczsKKyMgcmF0aGVyIHRoYW4gZmlndXJpbmcgb3V0IGV4YWN0bHkgd2hpY2gsIHdlIGFsd2F5cyBnaXZlIHRoZW0gZXhlY3V0YWJsZSBtb2RlLgorIyBBbHNvLCBtYWtpbmcgdGhlbSByZWFkLW9ubHkgc2VlbXMgdG8gYmUgYSBnb29kIGlkZWEuLi4KK0lOU1RBTExfU0hBUkVEPSAke0lOU1RBTEx9IC1tIDU1NQorCitNS0RJUl9QPQkvYmluL21rZGlyIC1wCisKK01BS0VTRVRVUD0gICAgICAkKHNyY2RpcikvTW9kdWxlcy9tYWtlc2V0dXAKKworIyBDb21waWxlciBvcHRpb25zCitPUFQ9CQktRE5ERUJVRyAKK0JBU0VDRkxBR1M9CSAtZm5vLXN0cmljdC1hbGlhc2luZworQ0ZMQUdTPQkJJChCQVNFQ0ZMQUdTKSAtTzIgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1zICQoT1BUKSAkKEVYVFJBX0NGTEFHUykKKyMgQm90aCBDUFBGTEFHUyBhbmQgTERGTEFHUyBuZWVkIHRvIGNvbnRhaW4gdGhlIHNoZWxsJ3MgdmFsdWUgZm9yIHNldHVwLnB5IHRvCisjIGJlIGFibGUgdG8gYnVpbGQgZXh0ZW5zaW9uIG1vZHVsZXMgdXNpbmcgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZCBpbiB0aGUKKyMgZW52aXJvbm1lbnQgdmFyaWFibGVzCitDUFBGTEFHUz0JLUkuIC1JSW5jbHVkZSAtSSQoc3JjZGlyKS9JbmNsdWRlIAorTERGTEFHUz0JCitMRExBU1Q9CQkKK1NHSV9BQkk9CQorQ0NTSEFSRUQ9CS1mUElDCitMSU5LRk9SU0hBUkVEPQktWGxpbmtlciAtZXhwb3J0LWR5bmFtaWMKK0FSRkxBR1M9CXJjCisjIEV4dHJhIEMgZmxhZ3MgYWRkZWQgZm9yIGJ1aWxkaW5nIHRoZSBpbnRlcnByZXRlciBvYmplY3QgZmlsZXMuCitDRkxBR1NGT1JTSEFSRUQ9CisjIEMgZmxhZ3MgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIGludGVycHJldGVyIG9iamVjdCBmaWxlcworUFlfQ0ZMQUdTPQkkKENGTEFHUykgJChDUFBGTEFHUykgJChDRkxBR1NGT1JTSEFSRUQpIC1EUHlfQlVJTERfQ09SRQorCisjIDsgb24gV2luZG93cyBvdGhlcndpc2UgOgorREVMSU09CQk6CisjIE1hY2hpbmUtZGVwZW5kZW50IHN1YmRpcmVjdG9yaWVzCitNQUNIREVQPQlsaW51eDIKKworIyBNdWx0aWFyY2ggZGlyZWN0b3J5IChtYXkgYmUgZW1wdHkpCitNVUxUSUFSQ0g9CQorCisjIEluc3RhbGwgcHJlZml4IGZvciBhcmNoaXRlY3R1cmUtaW5kZXBlbmRlbnQgZmlsZXMKK3ByZWZpeD0JCS90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NAorCisjIEluc3RhbGwgcHJlZml4IGZvciBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IGZpbGVzCitleGVjX3ByZWZpeD0JJHtwcmVmaXh9CisKKyMgSW5zdGFsbCBwcmVmaXggZm9yIGRhdGEgZmlsZXMKK2RhdGFyb290ZGlyPSAgICAke3ByZWZpeH0vc2hhcmUKKworIyBFeHBhbmRlZCBkaXJlY3RvcmllcworQklORElSPQkJJHtleGVjX3ByZWZpeH0vYmluCitMSUJESVI9CQkke2V4ZWNfcHJlZml4fS9saWIKK01BTkRJUj0JCSR7ZGF0YXJvb3RkaXJ9L21hbgorSU5DTFVERURJUj0JJHtwcmVmaXh9L2luY2x1ZGUKK0NPTkZJTkNMVURFRElSPQkkKGV4ZWNfcHJlZml4KS9pbmNsdWRlCitTQ1JJUFRESVI9CSQocHJlZml4KS9saWIKKworIyBEZXRhaWxlZCBkZXN0aW5hdGlvbiBkaXJlY3RvcmllcworQklOTElCREVTVD0JJChMSUJESVIpL3B5dGhvbiQoVkVSU0lPTikKK0xJQkRFU1Q9CSQoU0NSSVBURElSKS9weXRob24kKFZFUlNJT04pCitJTkNMVURFUFk9CSQoSU5DTFVERURJUikvcHl0aG9uJChWRVJTSU9OKQorQ09ORklOQ0xVREVQWT0JJChDT05GSU5DTFVERURJUikvcHl0aG9uJChWRVJTSU9OKQorTElCUD0JCSQoTElCRElSKS9weXRob24kKFZFUlNJT04pCisKKyMgU3ltYm9scyB1c2VkIGZvciB1c2luZyBzaGFyZWQgbGlicmFyaWVzCitTTz0JCS5zbworTERTSEFSRUQ9CXg4Nl82NC1saW51eC1nbnUtZ2NjIC1zaGFyZWQgICQoTERGTEFHUykKK0JMRFNIQVJFRD0JeDg2XzY0LWxpbnV4LWdudS1nY2MgLXNoYXJlZCAgJChMREZMQUdTKQorTERDWFhTSEFSRUQ9CXg4Nl82NC1saW51eC1nbnUtZ2NjIC1zaGFyZWQgCitERVNUU0hBUkVEPQkkKEJJTkxJQkRFU1QpL2xpYi1keW5sb2FkCisKKyMgRXhlY3V0YWJsZSBzdWZmaXggKC5leGUgb24gV2luZG93cyBhbmQgTWFjIE9TIFgpCitFWEU9CQkKK0JVSUxERVhFPQkKKworIyBTaG9ydCBuYW1lIGFuZCBsb2NhdGlvbiBmb3IgTWFjIE9TIFggUHl0aG9uIGZyYW1ld29yaworVU5JVkVSU0FMU0RLPQorUFlUSE9ORlJBTUVXT1JLPQkKK1BZVEhPTkZSQU1FV09SS0RJUj0Jbm8tZnJhbWV3b3JrCitQWVRIT05GUkFNRVdPUktQUkVGSVg9CQorUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUj0gCisjIERlcGxveW1lbnQgdGFyZ2V0IHNlbGVjdGVkIGR1cmluZyBjb25maWd1cmUsIHRvIGJlIGNoZWNrZWQKKyMgYnkgZGlzdHV0aWxzLiBUaGUgZXhwb3J0IHN0YXRlbWVudCBpcyBuZWVkZWQgdG8gZW5zdXJlIHRoYXQgdGhlCisjIGRlcGxveW1lbnQgdGFyZ2V0IGlzIGFjdGl2ZSBkdXJpbmcgYnVpbGQuCitNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQ9CisjZXhwb3J0IE1BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVAorCisjIE9wdGlvbnMgdG8gZW5hYmxlIHByZWJpbmRpbmcgKGZvciBmYXN0IHN0YXJ0dXAgcHJpb3IgdG8gTWFjIE9TIFggMTAuMykKK09USEVSX0xJQlRPT0xfT1BUPQorCisjIEVudmlyb25tZW50IHRvIHJ1biBzaGFyZWQgcHl0aG9uIHdpdGhvdXQgaW5zdGFsbGVkIGxpYnJhcmllcworUlVOU0hBUkVEPSAgICAgICAKKworIyBNb2RlcyBmb3IgZGlyZWN0b3JpZXMsIGV4ZWN1dGFibGVzIGFuZCBkYXRhIGZpbGVzIGNyZWF0ZWQgYnkgdGhlCisjIGluc3RhbGwgcHJvY2Vzcy4gIERlZmF1bHQgdG8gdXNlci1vbmx5LXdyaXRhYmxlIGZvciBhbGwgZmlsZSB0eXBlcy4KK0RJUk1PREU9CTc1NQorRVhFTU9ERT0JNzU1CitGSUxFTU9ERT0JNjQ0CisKKyMgY29uZmlndXJlIHNjcmlwdCBhcmd1bWVudHMKK0NPTkZJR19BUkdTPQkgJy0tcHJlZml4PS90bXAvbmRrLWFuZHJld2hzaWVoL2J1aWxkaG9zdC9pbnN0YWxsL3ByZWJ1aWx0L2xpbnV4LXg4Nl82NCcgJy0tYnVpbGQ9eDg2XzY0LWxpbnV4LWdudScgJy0taG9zdD14ODZfNjQtbGludXgtZ251JyAnLS13aXRoLWJ1aWxkLXN5c3Jvb3QnICctLWRpc2FibGUtaXB2NicgJ2J1aWxkX2FsaWFzPXg4Nl82NC1saW51eC1nbnUnICdob3N0X2FsaWFzPXg4Nl82NC1saW51eC1nbnUnICdDQz14ODZfNjQtbGludXgtZ251LWdjYycgJ0NGTEFHUz0tTzIgLU9zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1zJyAnTERGTEFHUz0nCisKKworIyBTdWJkaXJlY3RvcmllcyB3aXRoIGNvZGUKK1NSQ0RJUlM9IAlQYXJzZXIgR3JhbW1hciBPYmplY3RzIFB5dGhvbiBNb2R1bGVzIE1hYworCisjIE90aGVyIHN1YmRpcmVjdG9yaWVzCitTVUJESVJTVE9PPQlJbmNsdWRlIExpYiBNaXNjIERlbW8KKworIyBGaWxlcyBhbmQgZGlyZWN0b3JpZXMgdG8gYmUgZGlzdHJpYnV0ZWQKK0NPTkZJR0ZJTEVTPQljb25maWd1cmUgY29uZmlndXJlLmFjIGFjY29uZmlnLmggcHljb25maWcuaC5pbiBNYWtlZmlsZS5wcmUuaW4KK0RJU1RGSUxFUz0JUkVBRE1FIENoYW5nZUxvZyAkKENPTkZJR0ZJTEVTKQorRElTVERJUlM9CSQoU1VCRElSUykgJChTVUJESVJTVE9PKSBFeHQtZHVtbXkKK0RJU1Q9CQkkKERJU1RGSUxFUykgJChESVNURElSUykKKworCitMSUJSQVJZPQlsaWJweXRob24kKFZFUlNJT04pLmEKK0xETElCUkFSWT0gICAgICBsaWJweXRob24kKFZFUlNJT04pLmEKK0JMRExJQlJBUlk9ICAgICAkKExETElCUkFSWSkKK0RMTExJQlJBUlk9CQorTERMSUJSQVJZRElSPSAgIAorSU5TVFNPTkFNRT0JJChMRExJQlJBUlkpCisKKworTElCUz0JCS1scHRocmVhZCAtbGRsICAtbHV0aWwKK0xJQk09CQktbG0KK0xJQkM9CQkKK1NZU0xJQlM9CSQoTElCTSkgJChMSUJDKQorU0hMSUJTPQkJJChMSUJTKQorCitUSFJFQURPQko9CVB5dGhvbi90aHJlYWQubworRExJTkNMRElSPQkuCitEWU5MT0FERklMRT0JZHlubG9hZF9zaGxpYi5vCitNQUNIREVQX09CSlM9CQorTElCT0JKRElSPQlQeXRob24vCitMSUJPQkpTPQkKK1VOSUNPREVfT0JKUz0gICBPYmplY3RzL3VuaWNvZGVvYmplY3QubyBPYmplY3RzL3VuaWNvZGVjdHlwZS5vCisKK1BZVEhPTj0JCXB5dGhvbiQoRVhFKQorQlVJTERQWVRIT049CXB5dGhvbiQoQlVJTERFWEUpCisKK1BZVEhPTl9GT1JfQlVJTEQ9Li8kKEJVSUxEUFlUSE9OKSAtRQorX1BZVEhPTl9IT1NUX1BMQVRGT1JNPQorSE9TVF9HTlVfVFlQRT0gIHg4Nl82NC1wYy1saW51eC1nbnUKKworIyBUaGUgdGFzayB0byBydW4gd2hpbGUgaW5zdHJ1bWVudCB3aGVuIGJ1aWxkaW5nIHRoZSBwcm9maWxlLW9wdCB0YXJnZXQKK1BST0ZJTEVfVEFTSz0JJChzcmNkaXIpL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weSAtbiAyIC0td2l0aC1nYyAtLXdpdGgtc3lzY2hlY2sKKyNQUk9GSUxFX1RBU0s9CSQoc3JjZGlyKS9MaWIvdGVzdC9yZWdydGVzdC5weQorCisjID09PSBEZWZpbml0aW9ucyBhZGRlZCBieSBtYWtlc2V0dXAgPT09CisKK0xPQ0FMTU9ETElCUz0gICAgICAgICAgCitCQVNFTU9ETElCUz0KK0dMSEFDSz0tRGNsZWFyPV9fR0xjbGVhcgorUFlUSE9OUEFUSD0kKENPUkVQWVRIT05QQVRIKQorQ09SRVBZVEhPTlBBVEg9JChERVNUUEFUSCkkKFNJVEVQQVRIKSQoVEVTVFBBVEgpJChNQUNIREVQUEFUSCkkKEVYVFJBTUFDSERFUFBBVEgpJChUS1BBVEgpJChPTERQQVRIKQorT0xEUEFUSD0kKERFTElNKWxpYi1vbGQKK1RLUEFUSD0kKERFTElNKWxpYi10aworRVhUUkFNQUNIREVQUEFUSD0KK01BQ0hERVBQQVRIPSQoREVMSU0pcGxhdC0kKE1BQ0hERVApCitURVNUUEFUSD0KK1NJVEVQQVRIPQorREVTVFBBVEg9CitNQUNIREVTVExJQj0kKEJJTkxJQkRFU1QpCitERVNUTElCPSQoTElCREVTVCkKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIE1vZHVsZXMKK01PRFVMRV9PQkpTPQlcCisJCU1vZHVsZXMvY29uZmlnLm8gXAorCQlNb2R1bGVzL2dldHBhdGgubyBcCisJCU1vZHVsZXMvbWFpbi5vIFwKKwkJTW9kdWxlcy9nY21vZHVsZS5vCisKKyMgVXNlZCBvZiBzaWduYWxtb2R1bGUubyBpcyBub3QgYXZhaWxhYmxlCitTSUdOQUxfT0JKUz0JCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgR3JhbW1hcgorR1JBTU1BUl9IPQlJbmNsdWRlL2dyYW1pbml0LmgKK0dSQU1NQVJfQz0JUHl0aG9uL2dyYW1pbml0LmMKK0dSQU1NQVJfSU5QVVQ9CSQoc3JjZGlyKS9HcmFtbWFyL0dyYW1tYXIKKworCitMSUJGRklfSU5DTFVERURJUj0JCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFBhcnNlcgorUEdFTj0JCVBhcnNlci9wZ2VuJChFWEUpCisKK1BTUkNTPQkJXAorCQlQYXJzZXIvYWNjZWxlci5jIFwKKwkJUGFyc2VyL2dyYW1tYXIxLmMgXAorCQlQYXJzZXIvbGlzdG5vZGUuYyBcCisJCVBhcnNlci9ub2RlLmMgXAorCQlQYXJzZXIvcGFyc2VyLmMgXAorCQlQYXJzZXIvcGFyc2V0b2suYyBcCisJCVBhcnNlci9iaXRzZXQuYyBcCisJCVBhcnNlci9tZXRhZ3JhbW1hci5jIFwKKwkJUGFyc2VyL2ZpcnN0c2V0cy5jIFwKKwkJUGFyc2VyL2dyYW1tYXIuYyBcCisJCVBhcnNlci9wZ2VuLmMKKworUE9CSlM9CQlcCisJCVBhcnNlci9hY2NlbGVyLm8gXAorCQlQYXJzZXIvZ3JhbW1hcjEubyBcCisJCVBhcnNlci9saXN0bm9kZS5vIFwKKwkJUGFyc2VyL25vZGUubyBcCisJCVBhcnNlci9wYXJzZXIubyBcCisJCVBhcnNlci9wYXJzZXRvay5vIFwKKwkJUGFyc2VyL2JpdHNldC5vIFwKKwkJUGFyc2VyL21ldGFncmFtbWFyLm8gXAorCQlQYXJzZXIvZmlyc3RzZXRzLm8gXAorCQlQYXJzZXIvZ3JhbW1hci5vIFwKKwkJUGFyc2VyL3BnZW4ubworCitQQVJTRVJfT0JKUz0JJChQT0JKUykgUGFyc2VyL215cmVhZGxpbmUubyBQYXJzZXIvdG9rZW5pemVyLm8KKworUEdTUkNTPQkJXAorCQlPYmplY3RzL29ibWFsbG9jLmMgXAorCQlQeXRob24vbXlzbnByaW50Zi5jIFwKKwkJUHl0aG9uL3B5Y3R5cGUuYyBcCisJCVBhcnNlci90b2tlbml6ZXJfcGdlbi5jIFwKKwkJUGFyc2VyL3ByaW50Z3JhbW1hci5jIFwKKwkJUGFyc2VyL3BnZW5tYWluLmMKKworUEdPQkpTPQkJXAorCQlPYmplY3RzL29ibWFsbG9jLm8gXAorCQlQeXRob24vbXlzbnByaW50Zi5vIFwKKwkJUHl0aG9uL3B5Y3R5cGUubyBcCisJCVBhcnNlci90b2tlbml6ZXJfcGdlbi5vIFwKKwkJUGFyc2VyL3ByaW50Z3JhbW1hci5vIFwKKwkJUGFyc2VyL3BnZW5tYWluLm8KKworUEFSU0VSX0hFQURFUlM9IFwKKwkJUGFyc2VyL3BhcnNlci5oIFwKKwkJUGFyc2VyL3Rva2VuaXplci5oCisKK1BHRU5TUkNTPQkkKFBTUkNTKSAkKFBHU1JDUykKK1BHRU5PQkpTPQkkKFBPQkpTKSAkKFBHT0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQVNUCitBU1RfSF9ESVI9CUluY2x1ZGUKK0FTVF9IPQkJJChBU1RfSF9ESVIpL1B5dGhvbi1hc3QuaAorQVNUX0NfRElSPQlQeXRob24KK0FTVF9DPQkJJChBU1RfQ19ESVIpL1B5dGhvbi1hc3QuYworQVNUX0FTREw9CSQoc3JjZGlyKS9QYXJzZXIvUHl0aG9uLmFzZGwKKworQVNETEdFTl9GSUxFUz0JJChzcmNkaXIpL1BhcnNlci9hc2RsLnB5ICQoc3JjZGlyKS9QYXJzZXIvYXNkbF9jLnB5CisjIFhYWCBOb3RlIHRoYXQgYSBidWlsZCBub3cgcmVxdWlyZXMgUHl0aG9uIGV4aXN0IGJlZm9yZSB0aGUgYnVpbGQgc3RhcnRzCitBU0RMR0VOPQkkKHNyY2RpcikvUGFyc2VyL2FzZGxfYy5weQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBQeXRob24KK1BZVEhPTl9PQkpTPQlcCisJCVB5dGhvbi9fd2FybmluZ3MubyBcCisJCVB5dGhvbi9QeXRob24tYXN0Lm8gXAorCQlQeXRob24vYXNkbC5vIFwKKwkJUHl0aG9uL2FzdC5vIFwKKwkJUHl0aG9uL2JsdGlubW9kdWxlLm8gXAorCQlQeXRob24vY2V2YWwubyBcCisJCVB5dGhvbi9jb21waWxlLm8gXAorCQlQeXRob24vY29kZWNzLm8gXAorCQlQeXRob24vZXJyb3JzLm8gXAorCQlQeXRob24vZnJvemVuLm8gXAorCQlQeXRob24vZnJvemVubWFpbi5vIFwKKwkJUHl0aG9uL2Z1dHVyZS5vIFwKKwkJUHl0aG9uL2dldGFyZ3MubyBcCisJCVB5dGhvbi9nZXRjb21waWxlci5vIFwKKwkJUHl0aG9uL2dldGNvcHlyaWdodC5vIFwKKwkJUHl0aG9uL2dldHBsYXRmb3JtLm8gXAorCQlQeXRob24vZ2V0dmVyc2lvbi5vIFwKKwkJUHl0aG9uL2dyYW1pbml0Lm8gXAorCQlQeXRob24vaW1wb3J0Lm8gXAorCQlQeXRob24vaW1wb3J0ZGwubyBcCisJCVB5dGhvbi9tYXJzaGFsLm8gXAorCQlQeXRob24vbW9kc3VwcG9ydC5vIFwKKwkJUHl0aG9uL215c3RydG91bC5vIFwKKwkJUHl0aG9uL215c25wcmludGYubyBcCisJCVB5dGhvbi9wZWVwaG9sZS5vIFwKKwkJUHl0aG9uL3B5YXJlbmEubyBcCisJCVB5dGhvbi9weWN0eXBlLm8gXAorCQlQeXRob24vcHlmcGUubyBcCisJCVB5dGhvbi9weW1hdGgubyBcCisJCVB5dGhvbi9weXN0YXRlLm8gXAorCQlQeXRob24vcHl0aG9ucnVuLm8gXAorICAgICAgICAgICAgICAgIFB5dGhvbi9yYW5kb20ubyBcCisJCVB5dGhvbi9zdHJ1Y3RtZW1iZXIubyBcCisJCVB5dGhvbi9zeW10YWJsZS5vIFwKKwkJUHl0aG9uL3N5c21vZHVsZS5vIFwKKwkJUHl0aG9uL3RyYWNlYmFjay5vIFwKKwkJUHl0aG9uL2dldG9wdC5vIFwKKwkJUHl0aG9uL3B5c3RyY21wLm8gXAorCQlQeXRob24vcHlzdHJ0b2QubyBcCisJCVB5dGhvbi9kdG9hLm8gXAorCQlQeXRob24vZm9ybWF0dGVyX3VuaWNvZGUubyBcCisJCVB5dGhvbi9mb3JtYXR0ZXJfc3RyaW5nLm8gXAorCQlQeXRob24vJChEWU5MT0FERklMRSkgXAorCQkkKExJQk9CSlMpIFwKKwkJJChNQUNIREVQX09CSlMpIFwKKwkJJChUSFJFQURPQkopCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT2JqZWN0cworT0JKRUNUX09CSlM9CVwKKwkJT2JqZWN0cy9hYnN0cmFjdC5vIFwKKwkJT2JqZWN0cy9ib29sb2JqZWN0Lm8gXAorCQlPYmplY3RzL2J1ZmZlcm9iamVjdC5vIFwKKwkJT2JqZWN0cy9ieXRlc19tZXRob2RzLm8gXAorCQlPYmplY3RzL2J5dGVhcnJheW9iamVjdC5vIFwKKwkJT2JqZWN0cy9jYXBzdWxlLm8gXAorCQlPYmplY3RzL2NlbGxvYmplY3QubyBcCisJCU9iamVjdHMvY2xhc3NvYmplY3QubyBcCisJCU9iamVjdHMvY29iamVjdC5vIFwKKwkJT2JqZWN0cy9jb2Rlb2JqZWN0Lm8gXAorCQlPYmplY3RzL2NvbXBsZXhvYmplY3QubyBcCisJCU9iamVjdHMvZGVzY3JvYmplY3QubyBcCisJCU9iamVjdHMvZW51bW9iamVjdC5vIFwKKwkJT2JqZWN0cy9leGNlcHRpb25zLm8gXAorCQlPYmplY3RzL2dlbm9iamVjdC5vIFwKKwkJT2JqZWN0cy9maWxlb2JqZWN0Lm8gXAorCQlPYmplY3RzL2Zsb2F0b2JqZWN0Lm8gXAorCQlPYmplY3RzL2ZyYW1lb2JqZWN0Lm8gXAorCQlPYmplY3RzL2Z1bmNvYmplY3QubyBcCisJCU9iamVjdHMvaW50b2JqZWN0Lm8gXAorCQlPYmplY3RzL2l0ZXJvYmplY3QubyBcCisJCU9iamVjdHMvbGlzdG9iamVjdC5vIFwKKwkJT2JqZWN0cy9sb25nb2JqZWN0Lm8gXAorCQlPYmplY3RzL2RpY3RvYmplY3QubyBcCisJCU9iamVjdHMvbWVtb3J5b2JqZWN0Lm8gXAorCQlPYmplY3RzL21ldGhvZG9iamVjdC5vIFwKKwkJT2JqZWN0cy9tb2R1bGVvYmplY3QubyBcCisJCU9iamVjdHMvb2JqZWN0Lm8gXAorCQlPYmplY3RzL29ibWFsbG9jLm8gXAorCQlPYmplY3RzL3Jhbmdlb2JqZWN0Lm8gXAorCQlPYmplY3RzL3NldG9iamVjdC5vIFwKKwkJT2JqZWN0cy9zbGljZW9iamVjdC5vIFwKKwkJT2JqZWN0cy9zdHJpbmdvYmplY3QubyBcCisJCU9iamVjdHMvc3RydWN0c2VxLm8gXAorCQlPYmplY3RzL3R1cGxlb2JqZWN0Lm8gXAorCQlPYmplY3RzL3R5cGVvYmplY3QubyBcCisJCU9iamVjdHMvd2Vha3JlZm9iamVjdC5vIFwKKwkJJChVTklDT0RFX09CSlMpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgb2JqZWN0cyB0aGF0IGdldCBsaW5rZWQgaW50byB0aGUgUHl0aG9uIGxpYnJhcnkKK0xJQlJBUllfT0JKUz0JXAorCQlNb2R1bGVzL2dldGJ1aWxkaW5mby5vIFwKKwkJJChQQVJTRVJfT0JKUykgXAorCQkkKE9CSkVDVF9PQkpTKSBcCisJCSQoUFlUSE9OX09CSlMpIFwKKwkJJChNT0RVTEVfT0JKUykgXAorCQkkKFNJR05BTF9PQkpTKSBcCisJCSQoTU9ET0JKUykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBSdWxlcworCisjIERlZmF1bHQgdGFyZ2V0CithbGw6CQlidWlsZF9hbGwKK2J1aWxkX2FsbDoJJChCVUlMRFBZVEhPTikgb2xkc2hhcmVkbW9kcyBzaGFyZWRtb2RzIGdkYmhvb2tzCisKKyMgQ29tcGlsZSBhIGJpbmFyeSB3aXRoIGdjYyBwcm9maWxlIGd1aWRlZCBvcHRpbWl6YXRpb24uCitwcm9maWxlLW9wdDoKKwlAZWNobyAiQnVpbGRpbmcgd2l0aCBzdXBwb3J0IGZvciBwcm9maWxlIGdlbmVyYXRpb246IgorCSQoTUFLRSkgY2xlYW4KKwkkKE1BS0UpIGJ1aWxkX2FsbF9nZW5lcmF0ZV9wcm9maWxlCisJQGVjaG8gIlJ1bm5pbmcgYmVuY2htYXJrIHRvIGdlbmVyYXRlIHByb2ZpbGUgZGF0YToiCisJJChNQUtFKSBwcm9maWxlLXJlbW92YWwKKwkkKE1BS0UpIHJ1bl9wcm9maWxlX3Rhc2sKKwlAZWNobyAiUmVidWlsZGluZyB3aXRoIHByb2ZpbGUgZ3VpZGVkIG9wdGltaXphdGlvbnM6IgorCSQoTUFLRSkgY2xlYW4KKwkkKE1BS0UpIGJ1aWxkX2FsbF91c2VfcHJvZmlsZQorCitidWlsZF9hbGxfZ2VuZXJhdGVfcHJvZmlsZToKKwkkKE1BS0UpIGFsbCBDRkxBR1M9IiQoQ0ZMQUdTKSAtZnByb2ZpbGUtZ2VuZXJhdGUiIExJQlM9IiQoTElCUykgLWxnY292IgorCitydW5fcHJvZmlsZV90YXNrOgorCTogIyBGSVhNRTogY2FuJ3QgcnVuIGZvciBhIGNyb3NzIGJ1aWxkCisJLi8kKEJVSUxEUFlUSE9OKSAkKFBST0ZJTEVfVEFTSykKKworYnVpbGRfYWxsX3VzZV9wcm9maWxlOgorCSQoTUFLRSkgYWxsIENGTEFHUz0iJChDRkxBR1MpIC1mcHJvZmlsZS11c2UiCisKK2NvdmVyYWdlOgorCUBlY2hvICJCdWlsZGluZyB3aXRoIHN1cHBvcnQgZm9yIGNvdmVyYWdlIGNoZWNraW5nOiIKKwkkKE1BS0UpIGNsZWFuCisJJChNQUtFKSBhbGwgQ0ZMQUdTPSIkKENGTEFHUykgLU8wIC1wZyAtZnByb2ZpbGUtYXJjcyAtZnRlc3QtY292ZXJhZ2UiIExJQlM9IiQoTElCUykgLWxnY292IgorCisKKyMgQnVpbGQgdGhlIGludGVycHJldGVyCiskKEJVSUxEUFlUSE9OKToJTW9kdWxlcy9weXRob24ubyAkKExJQlJBUlkpICQoTERMSUJSQVJZKQorCQkkKExJTktDQykgJChMREZMQUdTKSAkKExJTktGT1JTSEFSRUQpIC1vICRAIFwKKwkJCU1vZHVsZXMvcHl0aG9uLm8gXAorCQkJJChCTERMSUJSQVJZKSAkKExJQlMpICQoTU9ETElCUykgJChTWVNMSUJTKSAkKExETEFTVCkKKworcGxhdGZvcm06ICQoQlVJTERQWVRIT04pIHB5YnVpbGRkaXIudHh0CisJJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgLWMgJ2ltcG9ydCBzeXMgOyBmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtIDsgcHJpbnQgZ2V0X3BsYXRmb3JtKCkrIi0iK3N5cy52ZXJzaW9uWzA6M10nID5wbGF0Zm9ybQorCisjIENyZWF0ZSBidWlsZCBkaXJlY3RvcnkgYW5kIGdlbmVyYXRlIHRoZSBzeXNjb25maWcgYnVpbGQtdGltZSBkYXRhIHRoZXJlLgorIyBweWJ1aWxkZGlyLnR4dCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgYnVpbGQgZGlyIGFuZCBpcyB1c2VkIGZvcgorIyBzeXMucGF0aCBmaXh1cCAtLSBzZWUgTW9kdWxlcy9nZXRwYXRoLmMuCitweWJ1aWxkZGlyLnR4dDogJChCVUlMRFBZVEhPTikKKwkJJChSVU5TSEFSRUQpICQoUFlUSE9OX0ZPUl9CVUlMRCkgLVMgLW0gc3lzY29uZmlnIC0tZ2VuZXJhdGUtcG9zaXgtdmFycworCisjIEJ1aWxkIHRoZSBzaGFyZWQgbW9kdWxlcworIyBVbmRlciBHTlUgbWFrZSwgTUFLRUZMQUdTIGFyZSBzb3J0ZWQgYW5kIG5vcm1hbGl6ZWQ7IHRoZSAncycgZm9yCisjIC1zLCAtLXNpbGVudCBvciAtLXF1aWV0IGlzIGFsd2F5cyB0aGUgZmlyc3QgY2hhci4KKyMgVW5kZXIgQlNEIG1ha2UsIE1BS0VGTEFHUyBtaWdodCBiZSAiIC1zIC12IHg9eSIuCitzaGFyZWRtb2RzOiAkKEJVSUxEUFlUSE9OKSBweWJ1aWxkZGlyLnR4dAorCUBjYXNlICIkJE1BS0VGTEFHUyIgaW4gXAorCSAgICAqXCAtcyp8cyopIHF1aWV0PSItcSI7OyBcCisJICAgICopIHF1aWV0PSIiOzsgXAorCWVzYWM7IFwKKwkkKFJVTlNIQVJFRCkgQ0M9JyQoQ0MpJyBMRFNIQVJFRD0nJChCTERTSEFSRUQpJyBPUFQ9JyQoT1BUKScgXAorCQkkKFBZVEhPTl9GT1JfQlVJTEQpICQoc3JjZGlyKS9zZXR1cC5weSAkJHF1aWV0IGJ1aWxkCisKKyMgQnVpbGQgc3RhdGljIGxpYnJhcnkKKyMgYXZvaWQgbG9uZyBjb21tYW5kIGxpbmVzLCBzYW1lIGFzIExJQlJBUllfT0JKUworJChMSUJSQVJZKTogJChMSUJSQVJZX09CSlMpCisJLXJtIC1mICRACisJJChBUikgJChBUkZMQUdTKSAkQCBNb2R1bGVzL2dldGJ1aWxkaW5mby5vCisJJChBUikgJChBUkZMQUdTKSAkQCAkKFBBUlNFUl9PQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChPQkpFQ1RfT0JKUykKKwkkKEFSKSAkKEFSRkxBR1MpICRAICQoUFlUSE9OX09CSlMpCisJJChBUikgJChBUkZMQUdTKSAkQCAkKE1PRFVMRV9PQkpTKSAkKFNJR05BTF9PQkpTKQorCSQoQVIpICQoQVJGTEFHUykgJEAgJChNT0RPQkpTKQorCSQoUkFOTElCKSAkQAorCitsaWJweXRob24kKFZFUlNJT04pLnNvOiAkKExJQlJBUllfT0JKUykKKwlpZiB0ZXN0ICQoSU5TVFNPTkFNRSkgIT0gJChMRExJQlJBUlkpOyB0aGVuIFwKKwkJJChCTERTSEFSRUQpIC1XbCwtaCQoSU5TVFNPTkFNRSkgLW8gJChJTlNUU09OQU1FKSAkKExJQlJBUllfT0JKUykgJChNT0RMSUJTKSAkKFNITElCUykgJChMSUJDKSAkKExJQk0pICQoTERMQVNUKTsgXAorCQkkKExOKSAtZiAkKElOU1RTT05BTUUpICRAOyBcCisJZWxzZSBcCisJCSQoQkxEU0hBUkVEKSAtbyAkQCAkKExJQlJBUllfT0JKUykgJChNT0RMSUJTKSAkKFNITElCUykgJChMSUJDKSAkKExJQk0pICQoTERMQVNUKTsgXAorCWZpCisKK2xpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWI6ICQoTElCUkFSWV9PQkpTKQorCSAkKENDKSAtZHluYW1pY2xpYiAtV2wsLXNpbmdsZV9tb2R1bGUgJChMREZMQUdTKSAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwIC1XbCwtaW5zdGFsbF9uYW1lLCQocHJlZml4KS9saWIvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiAtV2wsLWNvbXBhdGliaWxpdHlfdmVyc2lvbiwkKFZFUlNJT04pIC1XbCwtY3VycmVudF92ZXJzaW9uLCQoVkVSU0lPTikgLW8gJEAgJChMSUJSQVJZX09CSlMpICQoU0hMSUJTKSAkKExJQkMpICQoTElCTSkgJChMRExBU1QpOyBcCisKKworbGlicHl0aG9uJChWRVJTSU9OKS5zbDogJChMSUJSQVJZX09CSlMpCisJJChMRFNIQVJFRCkgLW8gJEAgJChMSUJSQVJZX09CSlMpICQoTU9ETElCUykgJChTSExJQlMpICQoTElCQykgJChMSUJNKSAkKExETEFTVCkKKworIyBDb3B5IHVwIHRoZSBnZGIgcHl0aG9uIGhvb2tzIGludG8gYSBwb3NpdGlvbiB3aGVyZSB0aGV5IGNhbiBiZSBhdXRvbWF0aWNhbGx5CisjIGxvYWRlZCBieSBnZGIgZHVyaW5nIExpYi90ZXN0L3Rlc3RfZ2RiLnB5CisjCisjIERpc3RyaWJ1dG9ycyBhcmUgbGlrZWx5IHRvIHdhbnQgdG8gaW5zdGFsbCB0aGlzIHNvbWV3aGVyZSBlbHNlIGUuZy4gcmVsYXRpdmUKKyMgdG8gdGhlIHN0cmlwcGVkIERXQVJGIGRhdGEgZm9yIHRoZSBzaGFyZWQgbGlicmFyeS4KK2dkYmhvb2tzOiAkKEJVSUxEUFlUSE9OKS1nZGIucHkKKworU1JDX0dEQl9IT09LUz0kKHNyY2RpcikvVG9vbHMvZ2RiL2xpYnB5dGhvbi5weQorJChCVUlMRFBZVEhPTiktZ2RiLnB5OiAkKFNSQ19HREJfSE9PS1MpCisJJChJTlNUQUxMX0RBVEEpICQoU1JDX0dEQl9IT09LUykgJChCVUlMRFBZVEhPTiktZ2RiLnB5CisKKyMgVGhpcyBydWxlIGlzIGhlcmUgZm9yIE9QRU5TVEVQL1JoYXBzb2R5L01hY09TWC4gSXQgYnVpbGRzIGEgdGVtcG9yYXJ5CisjIG1pbmltYWwgZnJhbWV3b3JrIChub3QgaW5jbHVkaW5nIHRoZSBMaWIgZGlyZWN0b3J5IGFuZCBzdWNoKSBpbiB0aGUgY3VycmVudAorIyBkaXJlY3RvcnkuCitSRVNTUkNESVI9TWFjL1Jlc291cmNlcy9mcmFtZXdvcmsKKyQoUFlUSE9ORlJBTUVXT1JLRElSKS9WZXJzaW9ucy8kKFZFUlNJT04pLyQoUFlUSE9ORlJBTUVXT1JLKTogXAorCQkkKExJQlJBUlkpIFwKKwkJJChSRVNTUkNESVIpL0luZm8ucGxpc3QKKwkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChQWVRIT05GUkFNRVdPUktESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikKKwkkKENDKSAtbyAkKExETElCUkFSWSkgJChMREZMQUdTKSAgLWR5bmFtaWNsaWIgXAorCQktYWxsX2xvYWQgJChMSUJSQVJZKSAtV2wsLXNpbmdsZV9tb2R1bGUgXAorCQktaW5zdGFsbF9uYW1lICQoREVTVERJUikkKFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVIpL1ZlcnNpb25zLyQoVkVSU0lPTikvJChQWVRIT05GUkFNRVdPUkspIFwKKwkJLWNvbXBhdGliaWxpdHlfdmVyc2lvbiAkKFZFUlNJT04pIFwKKwkJLWN1cnJlbnRfdmVyc2lvbiAkKFZFUlNJT04pOworCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAgXAorCQkkKFBZVEhPTkZSQU1FV09SS0RJUikvVmVyc2lvbnMvJChWRVJTSU9OKS9SZXNvdXJjZXMvRW5nbGlzaC5scHJvagorCSQoSU5TVEFMTF9EQVRBKSAkKFJFU1NSQ0RJUikvSW5mby5wbGlzdCBcCisJCSQoUFlUSE9ORlJBTUVXT1JLRElSKS9WZXJzaW9ucy8kKFZFUlNJT04pL1Jlc291cmNlcy9JbmZvLnBsaXN0CisJJChMTikgLWZzbiAkKFZFUlNJT04pICQoUFlUSE9ORlJBTUVXT1JLRElSKS9WZXJzaW9ucy9DdXJyZW50CisJJChMTikgLWZzbiBWZXJzaW9ucy9DdXJyZW50LyQoUFlUSE9ORlJBTUVXT1JLKSAkKFBZVEhPTkZSQU1FV09SS0RJUikvJChQWVRIT05GUkFNRVdPUkspCisJJChMTikgLWZzbiBWZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMgJChQWVRIT05GUkFNRVdPUktESVIpL0hlYWRlcnMKKwkkKExOKSAtZnNuIFZlcnNpb25zL0N1cnJlbnQvUmVzb3VyY2VzICQoUFlUSE9ORlJBTUVXT1JLRElSKS9SZXNvdXJjZXMKKworIyBUaGlzIHJ1bGUgYnVpbGRzIHRoZSBDeWd3aW4gUHl0aG9uIERMTCBhbmQgaW1wb3J0IGxpYnJhcnkgaWYgY29uZmlndXJlZAorIyBmb3IgYSBzaGFyZWQgY29yZSBsaWJyYXJ5OyBvdGhlcndpc2UsIHRoaXMgcnVsZSBpcyBhIG5vb3AuCiskKERMTExJQlJBUlkpIGxpYnB5dGhvbiQoVkVSU0lPTikuZGxsLmE6ICQoTElCUkFSWV9PQkpTKQorCWlmIHRlc3QgLW4gIiQoRExMTElCUkFSWSkiOyB0aGVuIFwKKwkJJChMRFNIQVJFRCkgLVdsLC0tb3V0LWltcGxpYj0kQCAtbyAkKERMTExJQlJBUlkpICReIFwKKwkJCSQoTElCUykgJChNT0RMSUJTKSAkKFNZU0xJQlMpICQoTERMQVNUKTsgXAorCWVsc2UgdHJ1ZTsgXAorCWZpCisKKworb2xkc2hhcmVkbW9kczogJChTSEFSRURNT0RTKQorCisKK01ha2VmaWxlIE1vZHVsZXMvY29uZmlnLmM6IE1ha2VmaWxlLnByZSBcCisJCQkJJChzcmNkaXIpL01vZHVsZXMvY29uZmlnLmMuaW4gXAorCQkJCSQoTUFLRVNFVFVQKSBcCisJCQkJTW9kdWxlcy9TZXR1cC5jb25maWcgXAorCQkJCU1vZHVsZXMvU2V0dXAgXAorCQkJCU1vZHVsZXMvU2V0dXAubG9jYWwKKwkkKFNIRUxMKSAkKE1BS0VTRVRVUCkgLWMgJChzcmNkaXIpL01vZHVsZXMvY29uZmlnLmMuaW4gXAorCQkJCS1zIE1vZHVsZXMgXAorCQkJCU1vZHVsZXMvU2V0dXAuY29uZmlnIFwKKwkJCQlNb2R1bGVzL1NldHVwLmxvY2FsIFwKKwkJCQlNb2R1bGVzL1NldHVwCisJQG12IGNvbmZpZy5jIE1vZHVsZXMKKwlAZWNobyAiVGhlIE1ha2VmaWxlIHdhcyB1cGRhdGVkLCB5b3UgbWF5IG5lZWQgdG8gcmUtcnVuIG1ha2UuIgorCisKK01vZHVsZXMvU2V0dXA6ICQoc3JjZGlyKS9Nb2R1bGVzL1NldHVwLmRpc3QKKwlAaWYgdGVzdCAtZiBNb2R1bGVzL1NldHVwOyB0aGVuIFwKKwkJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOyBcCisJCWVjaG8gIk1vZHVsZXMvU2V0dXAuZGlzdCBpcyBuZXdlciB0aGFuIE1vZHVsZXMvU2V0dXA7IjsgXAorCQllY2hvICJjaGVjayB0byBtYWtlIHN1cmUgeW91IGhhdmUgYWxsIHRoZSB1cGRhdGVzIHlvdSI7IFwKKwkJZWNobyAibmVlZCBpbiB5b3VyIE1vZHVsZXMvU2V0dXAgZmlsZS4iOyBcCisJCWVjaG8gIlVzdWFsbHksIGNvcHlpbmcgTW9kdWxlcy9TZXR1cC5kaXN0IHRvIE1vZHVsZXMvU2V0dXAgd2lsbCB3b3JrLiI7IFwKKwkJZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iOyBcCisJZmkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTcGVjaWFsIHJ1bGVzIGZvciBvYmplY3QgZmlsZXMKKworTW9kdWxlcy9nZXRidWlsZGluZm8ubzogJChQQVJTRVJfT0JKUykgXAorCQkkKE9CSkVDVF9PQkpTKSBcCisJCSQoUFlUSE9OX09CSlMpIFwKKwkJJChNT0RVTEVfT0JKUykgXAorCQkkKFNJR05BTF9PQkpTKSBcCisJCSQoTU9ET0JKUykgXAorCQkkKHNyY2RpcikvTW9kdWxlcy9nZXRidWlsZGluZm8uYworCSQoQ0MpIC1jICQoUFlfQ0ZMQUdTKSBcCisJICAgICAgLURTVk5WRVJTSU9OPSJcImBMQ19BTEw9QyAkKFNWTlZFUlNJT04pYFwiIiBcCisJICAgICAgLURIR1ZFUlNJT049IlwiYExDX0FMTD1DICQoSEdWRVJTSU9OKWBcIiIgXAorCSAgICAgIC1ESEdUQUc9IlwiYExDX0FMTD1DICQoSEdUQUcpYFwiIiBcCisJICAgICAgLURIR0JSQU5DSD0iXCJgTENfQUxMPUMgJChIR0JSQU5DSClgXCIiIFwKKwkgICAgICAtbyAkQCAkKHNyY2RpcikvTW9kdWxlcy9nZXRidWlsZGluZm8uYworCisjIGRlZmF1bHQgc3lzLnBhdGggY2FsY3VsYXRpb25zCitNb2R1bGVzL2dldHBhdGgubzogJChzcmNkaXIpL01vZHVsZXMvZ2V0cGF0aC5jIE1ha2VmaWxlCisJJChDQykgLWMgJChQWV9DRkxBR1MpIC1EUFlUSE9OUEFUSD0nIiQoUFlUSE9OUEFUSCkiJyBcCisJCS1EUFJFRklYPSciJChwcmVmaXgpIicgXAorCQktREVYRUNfUFJFRklYPSciJChleGVjX3ByZWZpeCkiJyBcCisJCS1EVkVSU0lPTj0nIiQoVkVSU0lPTikiJyBcCisJCS1EVlBBVEg9JyIkKE1TWVNWUEFUSCkiJyBcCisJCS1vICRAICQoc3JjZGlyKS9Nb2R1bGVzL2dldHBhdGguYworCisjIGRlZmF1bHQgc3lzLnBhdGggY2FsY3VsYXRpb25zIGZvciB3aW5kb3dzIHBsYXRmb3JtcworUEMvZ2V0cGF0aHAubzogJChzcmNkaXIpL1BDL2dldHBhdGhwLmMKKwkkKENDKSAtYyAkKFBZX0NGTEFHUykgLW8gJEAgJChzcmNkaXIpL1BDL2dldHBhdGhwLmMKKworTW9kdWxlcy9weXRob24ubzogJChzcmNkaXIpL01vZHVsZXMvcHl0aG9uLmMKKwkkKE1BSU5DQykgLWMgJChQWV9DRkxBR1MpIC1vICRAICQoc3JjZGlyKS9Nb2R1bGVzL3B5dGhvbi5jCisKK01vZHVsZXMvcG9zaXhtb2R1bGUubzogJChzcmNkaXIpL01vZHVsZXMvcG9zaXhtb2R1bGUuYyAkKHNyY2RpcikvTW9kdWxlcy9wb3NpeG1vZHVsZS5oCisKK01vZHVsZXMvZ3JwbW9kdWxlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL2dycG1vZHVsZS5jICQoc3JjZGlyKS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmgKKworTW9kdWxlcy9wd2Rtb2R1bGUubzogJChzcmNkaXIpL01vZHVsZXMvcHdkbW9kdWxlLmMgJChzcmNkaXIpL01vZHVsZXMvcG9zaXhtb2R1bGUuaAorCiskKEdSQU1NQVJfSCk6ICQoR1JBTU1BUl9JTlBVVCkgJChQR0VOU1JDUykKKwkJQCQoTUtESVJfUCkgSW5jbHVkZQorCQkkKE1BS0UpICQoUEdFTikKKwkJJChQR0VOKSAkKEdSQU1NQVJfSU5QVVQpICQoR1JBTU1BUl9IKSAkKEdSQU1NQVJfQykKKyQoR1JBTU1BUl9DKTogJChHUkFNTUFSX0gpICQoR1JBTU1BUl9JTlBVVCkgJChQR0VOU1JDUykKKwkJJChNQUtFKSAkKEdSQU1NQVJfSCkKKwkJdG91Y2ggJChHUkFNTUFSX0MpCisKKyQoUEdFTik6CSQoUEdFTk9CSlMpCisJCSQoQ0MpICQoT1BUKSAkKExERkxBR1MpICQoUEdFTk9CSlMpICQoTElCUykgLW8gJChQR0VOKQorCitQYXJzZXIvZ3JhbW1hci5vOgkkKHNyY2RpcikvUGFyc2VyL2dyYW1tYXIuYyBcCisJCQkJJChzcmNkaXIpL0luY2x1ZGUvdG9rZW4uaCBcCisJCQkJJChzcmNkaXIpL0luY2x1ZGUvZ3JhbW1hci5oCitQYXJzZXIvbWV0YWdyYW1tYXIubzoJJChzcmNkaXIpL1BhcnNlci9tZXRhZ3JhbW1hci5jCisKK1BhcnNlci90b2tlbml6ZXJfcGdlbi5vOgkkKHNyY2RpcikvUGFyc2VyL3Rva2VuaXplci5jCisKK1BhcnNlci9wZ2VubWFpbi5vOgkkKHNyY2RpcikvSW5jbHVkZS9wYXJzZXRvay5oCisKKyQoQVNUX0gpOiAkKEFTVF9BU0RMKSAkKEFTRExHRU5fRklMRVMpCisJJChNS0RJUl9QKSAkKEFTVF9IX0RJUikKKwkkKEFTRExHRU4pIC1oICQoQVNUX0hfRElSKSAkKEFTVF9BU0RMKQorCiskKEFTVF9DKTogJChBU1RfQVNETCkgJChBU0RMR0VOX0ZJTEVTKQorCSQoTUtESVJfUCkgJChBU1RfQ19ESVIpCisJJChBU0RMR0VOKSAtYyAkKEFTVF9DX0RJUikgJChBU1RfQVNETCkKKworUHl0aG9uL2NvbXBpbGUubyBQeXRob24vc3ltdGFibGUubyBQeXRob24vYXN0Lm86ICQoR1JBTU1BUl9IKSAkKEFTVF9IKQorCitQeXRob24vZ2V0cGxhdGZvcm0ubzogJChzcmNkaXIpL1B5dGhvbi9nZXRwbGF0Zm9ybS5jCisJCSQoQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtRFBMQVRGT1JNPSciJChNQUNIREVQKSInIC1vICRAICQoc3JjZGlyKS9QeXRob24vZ2V0cGxhdGZvcm0uYworCitQeXRob24vaW1wb3J0ZGwubzogJChzcmNkaXIpL1B5dGhvbi9pbXBvcnRkbC5jCisJCSQoQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtSSQoRExJTkNMRElSKSAtbyAkQCAkKHNyY2RpcikvUHl0aG9uL2ltcG9ydGRsLmMKKworT2JqZWN0cy91bmljb2RlY3R5cGUubzoJJChzcmNkaXIpL09iamVjdHMvdW5pY29kZWN0eXBlLmMgXAorCQkJCSQoc3JjZGlyKS9PYmplY3RzL3VuaWNvZGV0eXBlX2RiLmgKKworU1RSSU5HTElCX0hFQURFUlM9IFwKKwkJJChzcmNkaXIpL0luY2x1ZGUvYnl0ZXNfbWV0aG9kcy5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL2NvdW50LmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvY3R5cGUuaCBcCisJCSQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi9mYXN0c2VhcmNoLmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvZmluZC5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL2Zvcm1hdHRlci5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL3BhcnRpdGlvbi5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL3NwbGl0LmggXAorCQkkKHNyY2RpcikvT2JqZWN0cy9zdHJpbmdsaWIvc3RyaW5nZGVmcy5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL3N0cmluZ19mb3JtYXQuaCBcCisJCSQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi90cmFuc21vZ3JpZnkuaCBcCisJCSQoc3JjZGlyKS9PYmplY3RzL3N0cmluZ2xpYi91bmljb2RlZGVmcy5oIFwKKwkJJChzcmNkaXIpL09iamVjdHMvc3RyaW5nbGliL2xvY2FsZXV0aWwuaAorCitPYmplY3RzL3VuaWNvZGVvYmplY3QubzogJChzcmNkaXIpL09iamVjdHMvdW5pY29kZW9iamVjdC5jIFwKKwkJCQkkKFNUUklOR0xJQl9IRUFERVJTKQorCitPYmplY3RzL2J5dGVhcnJheW9iamVjdC5vOiAkKHNyY2RpcikvT2JqZWN0cy9ieXRlYXJyYXlvYmplY3QuYyBcCisJCQkJJChTVFJJTkdMSUJfSEVBREVSUykKKworT2JqZWN0cy9zdHJpbmdvYmplY3QubzogJChzcmNkaXIpL09iamVjdHMvc3RyaW5nb2JqZWN0LmMgXAorCQkJCSQoU1RSSU5HTElCX0hFQURFUlMpCisKK1B5dGhvbi9mb3JtYXR0ZXJfdW5pY29kZS5vOiAkKHNyY2RpcikvUHl0aG9uL2Zvcm1hdHRlcl91bmljb2RlLmMgXAorCQkJCSQoU1RSSU5HTElCX0hFQURFUlMpCisKK1B5dGhvbi9mb3JtYXR0ZXJfc3RyaW5nLm86ICQoc3JjZGlyKS9QeXRob24vZm9ybWF0dGVyX3N0cmluZy5jIFwKKwkJCQkkKFNUUklOR0xJQl9IRUFERVJTKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEhlYWRlciBmaWxlcworCitQWVRIT05fSEVBREVSUz0gXAorCQlJbmNsdWRlL1B5dGhvbi1hc3QuaCBcCisJCUluY2x1ZGUvUHl0aG9uLmggXAorCQlJbmNsdWRlL2Fic3RyYWN0LmggXAorCQlJbmNsdWRlL2FzZGwuaCBcCisJCUluY2x1ZGUvYXN0LmggXAorCQlJbmNsdWRlL2JpdHNldC5oIFwKKwkJSW5jbHVkZS9ib29sb2JqZWN0LmggXAorCQlJbmNsdWRlL2J5dGVhcnJheW9iamVjdC5oIFwKKwkJSW5jbHVkZS9ieXRlc19tZXRob2RzLmggXAorCQlJbmNsdWRlL2J5dGVzb2JqZWN0LmggXAorCQlJbmNsdWRlL2J1ZmZlcm9iamVjdC5oIFwKKwkJSW5jbHVkZS9jZWxsb2JqZWN0LmggXAorCQlJbmNsdWRlL2NldmFsLmggXAorCQlJbmNsdWRlL2NsYXNzb2JqZWN0LmggXAorCQlJbmNsdWRlL2NvYmplY3QuaCBcCisJCUluY2x1ZGUvY29kZS5oIFwKKwkJSW5jbHVkZS9jb2RlY3MuaCBcCisJCUluY2x1ZGUvY29tcGlsZS5oIFwKKwkJSW5jbHVkZS9jb21wbGV4b2JqZWN0LmggXAorCQlJbmNsdWRlL2Rlc2Nyb2JqZWN0LmggXAorCQlJbmNsdWRlL2RpY3RvYmplY3QuaCBcCisJCUluY2x1ZGUvZHRvYS5oIFwKKwkJSW5jbHVkZS9lbnVtb2JqZWN0LmggXAorCQlJbmNsdWRlL2VycmNvZGUuaCBcCisJCUluY2x1ZGUvZXZhbC5oIFwKKwkJSW5jbHVkZS9maWxlb2JqZWN0LmggXAorCQlJbmNsdWRlL2Zsb2F0b2JqZWN0LmggXAorCQlJbmNsdWRlL2ZyYW1lb2JqZWN0LmggXAorCQlJbmNsdWRlL2Z1bmNvYmplY3QuaCBcCisJCUluY2x1ZGUvZ2Vub2JqZWN0LmggXAorCQlJbmNsdWRlL2ltcG9ydC5oIFwKKwkJSW5jbHVkZS9pbnRvYmplY3QuaCBcCisJCUluY2x1ZGUvaW50cmNoZWNrLmggXAorCQlJbmNsdWRlL2l0ZXJvYmplY3QuaCBcCisJCUluY2x1ZGUvbGlzdG9iamVjdC5oIFwKKwkJSW5jbHVkZS9sb25naW50cmVwci5oIFwKKwkJSW5jbHVkZS9sb25nb2JqZWN0LmggXAorCQlJbmNsdWRlL21hcnNoYWwuaCBcCisJCUluY2x1ZGUvbWVtb3J5b2JqZWN0LmggXAorCQlJbmNsdWRlL21ldGFncmFtbWFyLmggXAorCQlJbmNsdWRlL21ldGhvZG9iamVjdC5oIFwKKwkJSW5jbHVkZS9tb2RzdXBwb3J0LmggXAorCQlJbmNsdWRlL21vZHVsZW9iamVjdC5oIFwKKwkJSW5jbHVkZS9ub2RlLmggXAorCQlJbmNsdWRlL29iamVjdC5oIFwKKwkJSW5jbHVkZS9vYmppbXBsLmggXAorCQlJbmNsdWRlL29wY29kZS5oIFwKKwkJSW5jbHVkZS9vc2RlZnMuaCBcCisJCUluY2x1ZGUvcGFyc2V0b2suaCBcCisJCUluY2x1ZGUvcGF0Y2hsZXZlbC5oIFwKKwkJSW5jbHVkZS9wZ2VuLmggXAorCQlJbmNsdWRlL3BnZW5oZWFkZXJzLmggXAorCQlJbmNsdWRlL3B5YXJlbmEuaCBcCisJCUluY2x1ZGUvcHljYXBzdWxlLmggXAorCQlJbmNsdWRlL3B5Y3R5cGUuaCBcCisJCUluY2x1ZGUvcHlkZWJ1Zy5oIFwKKwkJSW5jbHVkZS9weWVycm9ycy5oIFwKKwkJSW5jbHVkZS9weWZwZS5oIFwKKwkJSW5jbHVkZS9weW1hdGguaCBcCisJCUluY2x1ZGUvcHlnZXRvcHQuaCBcCisJCUluY2x1ZGUvcHltZW0uaCBcCisJCUluY2x1ZGUvcHlwb3J0LmggXAorCQlJbmNsdWRlL3B5c3RhdGUuaCBcCisJCUluY2x1ZGUvcHlzdHJjbXAuaCBcCisJCUluY2x1ZGUvcHlzdHJ0b2QuaCBcCisJCUluY2x1ZGUvcHl0aG9ucnVuLmggXAorCQlJbmNsdWRlL3B5dGhyZWFkLmggXAorCQlJbmNsdWRlL3Jhbmdlb2JqZWN0LmggXAorCQlJbmNsdWRlL3NldG9iamVjdC5oIFwKKwkJSW5jbHVkZS9zbGljZW9iamVjdC5oIFwKKwkJSW5jbHVkZS9zdHJpbmdvYmplY3QuaCBcCisJCUluY2x1ZGUvc3RydWN0bWVtYmVyLmggXAorCQlJbmNsdWRlL3N0cnVjdHNlcS5oIFwKKwkJSW5jbHVkZS9zeW10YWJsZS5oIFwKKwkJSW5jbHVkZS9zeXNtb2R1bGUuaCBcCisJCUluY2x1ZGUvdHJhY2ViYWNrLmggXAorCQlJbmNsdWRlL3R1cGxlb2JqZWN0LmggXAorCQlJbmNsdWRlL3Vjbmhhc2guaCBcCisJCUluY2x1ZGUvdW5pY29kZW9iamVjdC5oIFwKKwkJSW5jbHVkZS93YXJuaW5ncy5oIFwKKwkJSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmggXAorCQlweWNvbmZpZy5oIFwKKwkJJChQQVJTRVJfSEVBREVSUykKKworJChMSUJSQVJZX09CSlMpICQoTU9ET0JKUykgTW9kdWxlcy9weXRob24ubzogJChQWVRIT05fSEVBREVSUykKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGVzdCB0aGUgaW50ZXJwcmV0ZXIgKHR3aWNlLCBvbmNlIHdpdGhvdXQgLnB5YyBmaWxlcywgb25jZSB3aXRoKQorIyBJbiB0aGUgcGFzdCwgd2UndmUgaGFkIHByb2JsZW1zIHdoZXJlIGJ1Z3MgaW4gdGhlIG1hcnNoYWxsaW5nIG9yCisjIGVsc2V3aGVyZSBjYXVzZWQgYnl0ZWNvZGUgcmVhZCBmcm9tIC5weWMgZmlsZXMgdG8gYmVoYXZlIGRpZmZlcmVudGx5CisjIHRoYW4gYnl0ZWNvZGUgZ2VuZXJhdGVkIGRpcmVjdGx5IGZyb20gYSAucHkgc291cmNlIGZpbGUuICBTb21ldGltZXMKKyMgdGhlIGJ5dGVjb2RlIHJlYWQgZnJvbSBhIC5weWMgZmlsZSBoYWQgdGhlIGJ1Zywgc29tZXRpbWVzIHRoZSBkaXJlY3RseQorIyBnZW5lcmF0ZWQgYnl0ZWNvZGUuICBUaGlzIGlzIHNvbWV0aW1lcyBhIHZlcnkgc2h5IGJ1ZyBuZWVkaW5nIGEgbG90IG9mCisjIHNhbXBsZSBkYXRhLgorCitURVNUT1BUUz0JLWwgJChFWFRSQVRFU1RPUFRTKQorVEVTVFBST0c9CSQoc3JjZGlyKS9MaWIvdGVzdC9yZWdydGVzdC5weQorVEVTVFBZVEhPTj0JJChSVU5TSEFSRUQpIC4vJChCVUlMRFBZVEhPTikgLVdkIC0zIC1FIC10dCAkKFRFU1RQWVRIT05PUFRTKQordGVzdDoJCWFsbCBwbGF0Zm9ybQorCQktZmluZCAkKHNyY2RpcikvTGliIC1uYW1lICcqLnB5W2NvXScgLXByaW50IHwgeGFyZ3Mgcm0gLWYKKwkJLSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgJChURVNUT1BUUykKKwkJJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAkKFRFU1RPUFRTKQorCit0ZXN0YWxsOglhbGwgcGxhdGZvcm0KKwkJLWZpbmQgJChzcmNkaXIpL0xpYiAtbmFtZSAnKi5weVtjb10nIC1wcmludCB8IHhhcmdzIHJtIC1mCisJCSQoVEVTVFBZVEhPTikgJChzcmNkaXIpL0xpYi9jb21waWxlYWxsLnB5CisJCS1maW5kICQoc3JjZGlyKS9MaWIgLW5hbWUgJyoucHlbY29dJyAtcHJpbnQgfCB4YXJncyBybSAtZgorCQktJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAtdWFsbCAkKFRFU1RPUFRTKQorCQkkKFRFU1RQWVRIT04pICQoVEVTVFBST0cpIC11YWxsICQoVEVTVE9QVFMpCisKKyMgIFJ1biB0aGUgdW5pdGVzdHMgZm9yIGJvdGggYXJjaGl0ZWN0dXJlcyBpbiBhIFVuaXZlcnNhbCBidWlsZCBvbiBPU1gKKyMgIE11c3QgYmUgcnVuIG9uIGFuIEludGVsIGJveC4KK3Rlc3R1bml2ZXJzYWw6CWFsbCBwbGF0Zm9ybQorCQlpZiBbIGBhcmNoYCAhPSAnaTM4NicgXTt0aGVuIFwKKwkJCWVjaG8gIlRoaXMgY2FuIG9ubHkgYmUgdXNlZCBvbiBPU1gvaTM4NiIgO1wKKwkJCWV4aXQgMSA7XAorCQlmaQorCQktZmluZCAkKHNyY2RpcikvTGliIC1uYW1lICcqLnB5W2NvXScgLXByaW50IHwgeGFyZ3Mgcm0gLWYKKwkJLSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgLXVhbGwgJChURVNUT1BUUykKKwkJJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAtdWFsbCAkKFRFU1RPUFRTKQorCQkkKFJVTlNIQVJFRCkgL3Vzci9saWJleGVjL29haC90cmFuc2xhdGUgLi8kKEJVSUxEUFlUSE9OKSAtRSAtdHQgJChURVNUUFJPRykgLXVhbGwgJChURVNUT1BUUykKKworCisjIExpa2UgdGVzdGFsbCwgYnV0IHdpdGggYSBzaW5nbGUgcGFzcyBvbmx5CisjIHJ1biBhbiBvcHRpb25hbCBzY3JpcHQgdG8gaW5jbHVkZSBzb21lIGluZm9ybWF0aW9uIGFib3V0IHRoZSBidWlsZCBlbnZpcm9ubWVudAorYnVpbGRib3R0ZXN0OglhbGwgcGxhdGZvcm0KKwkJLUBpZiB3aGljaCBweWJ1aWxkYm90LmlkZW50aWZ5ID4vZGV2L251bGwgMj4mMTsgdGhlbiBcCisJCQlweWJ1aWxkYm90LmlkZW50aWZ5ICJDQz0nJChDQyknIiAiQ1hYPSckKENYWCknIjsgXAorCQlmaQorCQkkKFRFU1RQWVRIT04pIC1SICQoVEVTVFBST0cpIC11YWxsIC1yd1cgJChURVNUT1BUUykKKworUVVJQ0tURVNUT1BUUz0JJChURVNUT1BUUykgLXggdGVzdF9zdWJwcm9jZXNzIHRlc3RfaW8gdGVzdF9saWIydG8zIFwKKwkJdGVzdF9tdWx0aWJ5dGVjb2RlYyB0ZXN0X3VybGxpYjJfbG9jYWxuZXQgdGVzdF9pdGVydG9vbHMgXAorCQl0ZXN0X211bHRpcHJvY2Vzc2luZyB0ZXN0X21haWxib3ggdGVzdF9zb2NrZXQgdGVzdF9wb2xsIFwKKwkJdGVzdF9zZWxlY3QgdGVzdF96aXBmaWxlCitxdWlja3Rlc3Q6CWFsbCBwbGF0Zm9ybQorCQktZmluZCAkKHNyY2RpcikvTGliIC1uYW1lICcqLnB5W2NvXScgLXByaW50IHwgeGFyZ3Mgcm0gLWYKKwkJLSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgJChRVUlDS1RFU1RPUFRTKQorCQkkKFRFU1RQWVRIT04pICQoVEVTVFBST0cpICQoUVVJQ0tURVNUT1BUUykKKworTUVNVEVTVE9QVFM9ICAgICQoUVVJQ0tURVNUT1BUUykgLXggdGVzdF9kbCB0ZXN0X19fYWxsX18gdGVzdF9mb3JrMSBcCisJCXRlc3RfbG9uZ2V4cAorbWVtdGVzdDoJYWxsIHBsYXRmb3JtCisJCS1ybSAtZiAkKHNyY2RpcikvTGliL3Rlc3QvKi5weVtjb10KKwkJLSQoVEVTVFBZVEhPTikgJChURVNUUFJPRykgJChNRU1URVNUT1BUUykKKwkJJChURVNUUFlUSE9OKSAkKFRFU1RQUk9HKSAkKE1FTVRFU1RPUFRTKQorCisjIEluc3RhbGwgZXZlcnl0aGluZworaW5zdGFsbDoJIGFsdGluc3RhbGwgYmluaW5zdGFsbCBtYW5pbnN0YWxsIAorCisjIEluc3RhbGwgYWxtb3N0IGV2ZXJ5dGhpbmcgd2l0aG91dCBkaXN0dXJiaW5nIHByZXZpb3VzIHZlcnNpb25zCithbHRpbnN0YWxsOgkgYWx0YmluaW5zdGFsbCBsaWJpbnN0YWxsIGluY2xpbnN0YWxsIFwKKwkJCQlsaWJhaW5zdGFsbCBhbHRtYW5pbnN0YWxsIFwKKyAgICAgICAgICAgICAgICBzaGFyZWRpbnN0YWxsIG9sZHNoYXJlZGluc3RhbGwgCisKKyMgSW5zdGFsbCBzaGFyZWQgbGlicmFyaWVzIGVuYWJsZWQgYnkgU2V0dXAKK0RFU1RESVJTPQkkKGV4ZWNfcHJlZml4KSAkKExJQkRJUikgJChCSU5MSUJERVNUKSAkKERFU1RTSEFSRUQpCisKK29sZHNoYXJlZGluc3RhbGw6ICQoREVTVFNIQVJFRCkgJChTSEFSRURNT0RTKQorCQlAZm9yIGkgaW4gWCAkKFNIQVJFRE1PRFMpOyBkbyBcCisJCSAgaWYgdGVzdCAkJGkgIT0gWDsgdGhlbiBcCisJCSAgICBlY2hvICQoSU5TVEFMTF9TSEFSRUQpICQkaSAkKERFU1RTSEFSRUQpL2BiYXNlbmFtZSAkJGlgOyBcCisJCSAgICAkKElOU1RBTExfU0hBUkVEKSAkJGkgJChERVNURElSKSQoREVTVFNIQVJFRCkvYGJhc2VuYW1lICQkaWA7IFwKKwkJICBmaTsgXAorCQlkb25lCisKKyQoREVTVFNIQVJFRCk6CisJCUBmb3IgaSBpbiAkKERFU1RESVJTKTsgXAorCQlkbyBcCisJCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCisJCQkJZWNobyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICQkaSI7IFwKKwkJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkaTsgXAorCQkJZWxzZSAgICB0cnVlOyBcCisJCQlmaTsgXAorCQlkb25lCisKKworIyBJbnN0YWxsIHRoZSBpbnRlcnByZXRlciBieSBjcmVhdGluZyBhIHN5bWxpbmsgY2hhaW46CisjICAkKFBZVEhPTikgLT4gcHl0aG9uMiAtPiBweXRob24kKFZFUlNJT04pKQorIyBBbHNvIGNyZWF0ZSBlcXVpdmFsZW50IGNoYWlucyBmb3Igb3RoZXIgaW5zdGFsbGVkIGZpbGVzCitiaW5pbnN0YWxsOglhbHRiaW5pbnN0YWxsCisJLWlmIHRlc3QgLWYgJChERVNURElSKSQoQklORElSKS8kKFBZVEhPTikgLW8gLWggJChERVNURElSKSQoQklORElSKS8kKFBZVEhPTik7IFwKKwl0aGVuIHJtIC1mICQoREVTVERJUikkKEJJTkRJUikvJChQWVRIT04pOyBcCisJZWxzZSB0cnVlOyBcCisJZmkKKwktcm0gLWYgJChERVNURElSKSQoQklORElSKS9weXRob24yJChFWEUpCisJKGNkICQoREVTVERJUikkKEJJTkRJUik7ICQoTE4pIC1zIHB5dGhvbiQoVkVSU0lPTikkKEVYRSkgcHl0aG9uMiQoRVhFKSkKKwkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgLXMgcHl0aG9uMiQoRVhFKSAkKFBZVEhPTikpCisJLXJtIC1mICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uMi1jb25maWcKKwkoY2QgJChERVNURElSKSQoQklORElSKTsgJChMTikgLXMgcHl0aG9uJChWRVJTSU9OKS1jb25maWcgcHl0aG9uMi1jb25maWcpCisJLXJtIC1mICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uLWNvbmZpZworCShjZCAkKERFU1RESVIpJChCSU5ESVIpOyAkKExOKSAtcyBweXRob24yLWNvbmZpZyBweXRob24tY29uZmlnKQorCS10ZXN0IC1kICQoREVTVERJUikkKExJQlBDKSB8fCAkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQoTElCUEMpCisJLXJtIC1mICQoREVTVERJUikkKExJQlBDKS9weXRob24yLnBjCisJKGNkICQoREVTVERJUikkKExJQlBDKTsgJChMTikgLXMgcHl0aG9uLSQoVkVSU0lPTikucGMgcHl0aG9uMi5wYykKKwktcm0gLWYgJChERVNURElSKSQoTElCUEMpL3B5dGhvbi5wYworCShjZCAkKERFU1RESVIpJChMSUJQQyk7ICQoTE4pIC1zIHB5dGhvbjIucGMgcHl0aG9uLnBjKQorCisjIEluc3RhbGwgdGhlIGludGVycHJldGVyIHdpdGggJChWRVJTSU9OKSBhZmZpeGVkCisjIFRoaXMgZ29lcyBpbnRvICQoZXhlY19wcmVmaXgpCithbHRiaW5pbnN0YWxsOgkkKEJVSUxEUFlUSE9OKQorCUBmb3IgaSBpbiAkKEJJTkRJUikgJChMSUJESVIpOyBcCisJZG8gXAorCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCisJCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkJGk7IFwKKwkJZWxzZQl0cnVlOyBcCisJCWZpOyBcCisJZG9uZQorCSQoSU5TVEFMTF9QUk9HUkFNKSAkKEJVSUxEUFlUSE9OKSAkKERFU1RESVIpJChCSU5ESVIpL3B5dGhvbiQoVkVSU0lPTikkKEVYRSkKKwlpZiB0ZXN0IC1mICQoTERMSUJSQVJZKTsgdGhlbiBcCisJCWlmIHRlc3QgLW4gIiQoRExMTElCUkFSWSkiIDsgdGhlbiBcCisJCQkkKElOU1RBTExfU0hBUkVEKSAkKERMTExJQlJBUlkpICQoREVTVERJUikkKEJJTkRJUik7IFwKKwkJCW1rZGlyIC1wICQoREVTVERJUikkKExJQlBMKTsgJChJTlNUQUxMX1NIQVJFRCkgJChMRExJQlJBUlkpICQoREVTVERJUikkKExJQlBMKTsgXAorCQllbHNlIFwKKwkJCSQoSU5TVEFMTF9TSEFSRUQpICQoTERMSUJSQVJZKSAkKERFU1RESVIpJChMSUJESVIpLyQoSU5TVFNPTkFNRSk7IFwKKwkJCWlmIHRlc3QgJChMRExJQlJBUlkpICE9ICQoSU5TVFNPTkFNRSk7IHRoZW4gXAorCQkJCShjZCAkKERFU1RESVIpJChMSUJESVIpOyAkKExOKSAtc2YgJChJTlNUU09OQU1FKSAkKExETElCUkFSWSkpIFwKKwkJCWZpIFwKKwkJZmk7IFwKKwllbHNlCXRydWU7IFwKKwlmaQorCisjIEluc3RhbGwgdGhlIHZlcnNpb25lZCBtYW51YWwgcGFnZQorYWx0bWFuaW5zdGFsbDoKKwlAZm9yIGkgaW4gJChNQU5ESVIpICQoTUFORElSKS9tYW4xOyBcCisJZG8gXAorCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCisJCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkJGk7IFwKKwkJZWxzZQl0cnVlOyBcCisJCWZpOyBcCisJZG9uZQorCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTWlzYy9weXRob24ubWFuIFwKKwkJJChERVNURElSKSQoTUFORElSKS9tYW4xL3B5dGhvbiQoVkVSU0lPTikuMQorCisjIEluc3RhbGwgdGhlIHVudmVyc2lvbmVkIG1hbnVhbCBwYWdlcworbWFuaW5zdGFsbDoJYWx0bWFuaW5zdGFsbAorCS1ybSAtZiAkKERFU1RESVIpJChNQU5ESVIpL21hbjEvcHl0aG9uMi4xCisJKGNkICQoREVTVERJUikkKE1BTkRJUikvbWFuMTsgJChMTikgLXMgcHl0aG9uJChWRVJTSU9OKS4xIHB5dGhvbjIuMSkKKwktcm0gLWYgJChERVNURElSKSQoTUFORElSKS9tYW4xL3B5dGhvbi4xCisJKGNkICQoREVTVERJUikkKE1BTkRJUikvbWFuMTsgJChMTikgLXMgcHl0aG9uMi4xIHB5dGhvbi4xKQorCisjIEluc3RhbGwgdGhlIGxpYnJhcnkKK1BMQVRESVI9CXBsYXQtJChNQUNIREVQKQorRVhUUkFQTEFURElSPSAKK0VYVFJBTUFDSERFUFBBVEg9CitNQUNIREVQUz0JJChQTEFURElSKSAkKEVYVFJBUExBVERJUikKK1hNTExJQlNVQkRJUlM9ICB4bWwgeG1sL2RvbSB4bWwvZXRyZWUgeG1sL3BhcnNlcnMgeG1sL3NheAorUExBVE1BQ0RJUlM9IHBsYXQtbWFjIHBsYXQtbWFjL0NhcmJvbiBwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMgXAorCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcyBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yIFwKKwlwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvRXhwbG9yZXIgXAorCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9GaW5kZXIgXAorCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9OZXRzY2FwZSBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N0ZFN1aXRlcyBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1N5c3RlbUV2ZW50cyBcCisJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL1Rlcm1pbmFsCitQTEFUTUFDUEFUSD06cGxhdC1tYWM6cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzCitMSUJTVUJESVJTPQlsaWItdGsgbGliLXRrL3Rlc3QgbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyIFwKKwkJbGliLXRrL3Rlc3QvdGVzdF90dGsgc2l0ZS1wYWNrYWdlcyB0ZXN0IHRlc3QvZGF0YSBcCisJCXRlc3QvY2prZW5jb2RpbmdzIHRlc3QvZGVjaW1hbHRlc3RkYXRhIHRlc3QveG1sdGVzdGRhdGEgdGVzdC9zdWJwcm9jZXNzZGF0YSBcCisJCXRlc3QvdHJhY2VkbW9kdWxlcyBcCisJCWVuY29kaW5ncyBjb21waWxlciBob3RzaG90IFwKKwkJZW1haWwgZW1haWwvbWltZSBlbWFpbC90ZXN0IGVtYWlsL3Rlc3QvZGF0YSBcCisJCWpzb24ganNvbi90ZXN0cyBcCisJCXNxbGl0ZTMgc3FsaXRlMy90ZXN0IFwKKwkJbG9nZ2luZyBic2RkYiBic2RkYi90ZXN0IGNzdiBpbXBvcnRsaWIgd3NnaXJlZiBcCisJCWxpYjJ0bzMgbGliMnRvMy9maXhlcyBsaWIydG8zL3BnZW4yIGxpYjJ0bzMvdGVzdHMgXAorCQlsaWIydG8zL3Rlc3RzL2RhdGEgbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycyBsaWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMgXAorCQljdHlwZXMgY3R5cGVzL3Rlc3QgY3R5cGVzL21hY2hvbGliIGlkbGVsaWIgaWRsZWxpYi9JY29ucyBcCisJCWRpc3R1dGlscyBkaXN0dXRpbHMvY29tbWFuZCBkaXN0dXRpbHMvdGVzdHMgJChYTUxMSUJTVUJESVJTKSBcCisJCW11bHRpcHJvY2Vzc2luZyBtdWx0aXByb2Nlc3NpbmcvZHVtbXkgXAorCQl1bml0dGVzdCB1bml0dGVzdC90ZXN0IFwKKwkJbGliLW9sZCBcCisJCWN1cnNlcyBweWRvY19kYXRhICQoTUFDSERFUFMpCitsaWJpbnN0YWxsOglidWlsZF9hbGwgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpICQoc3JjZGlyKS9Nb2R1bGVzL3h4bW9kdWxlLmMKKwlAZm9yIGkgaW4gJChTQ1JJUFRESVIpICQoTElCREVTVCk7IFwKKwlkbyBcCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkJGkiOyBcCisJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkaTsgXAorCQllbHNlCXRydWU7IFwKKwkJZmk7IFwKKwlkb25lCisJQGZvciBkIGluICQoTElCU1VCRElSUyk7IFwKKwlkbyBcCisJCWE9JChzcmNkaXIpL0xpYi8kJGQ7IFwKKwkJaWYgdGVzdCAhIC1kICQkYTsgdGhlbiBjb250aW51ZTsgZWxzZSB0cnVlOyBmaTsgXAorCQliPSQoTElCREVTVCkvJCRkOyBcCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRiOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkJGIiOyBcCisJCQkkKElOU1RBTEwpIC1kIC1tICQoRElSTU9ERSkgJChERVNURElSKSQkYjsgXAorCQllbHNlCXRydWU7IFwKKwkJZmk7IFwKKwlkb25lCisJQGZvciBpIGluICQoc3JjZGlyKS9MaWIvKi5weSBgY2F0IHB5YnVpbGRkaXIudHh0YC9fc3lzY29uZmlnZGF0YS5weSAkKHNyY2RpcikvTGliLyouZG9jICQoc3JjZGlyKS9MaWIvKi5lZ2ctaW5mbyA7IFwKKwlkbyBcCisJCWlmIHRlc3QgLXggJCRpOyB0aGVuIFwKKwkJCSQoSU5TVEFMTF9TQ1JJUFQpICQkaSAkKERFU1RESVIpJChMSUJERVNUKTsgXAorCQkJZWNobyAkKElOU1RBTExfU0NSSVBUKSAkJGkgJChMSUJERVNUKTsgXAorCQllbHNlIFwKKwkJCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQoTElCREVTVCk7IFwKKwkJCWVjaG8gJChJTlNUQUxMX0RBVEEpICQkaSAkKExJQkRFU1QpOyBcCisJCWZpOyBcCisJZG9uZQorCUBmb3IgZCBpbiAkKExJQlNVQkRJUlMpOyBcCisJZG8gXAorCQlhPSQoc3JjZGlyKS9MaWIvJCRkOyBcCisJCWlmIHRlc3QgISAtZCAkJGE7IHRoZW4gY29udGludWU7IGVsc2UgdHJ1ZTsgZmk7IFwKKwkJaWYgdGVzdCBgbHMgJCRhIHwgd2MgLWxgIC1sdCAxOyB0aGVuIGNvbnRpbnVlOyBmaTsgXAorCQliPSQoTElCREVTVCkvJCRkOyBcCisJCWZvciBpIGluICQkYS8qOyBcCisJCWRvIFwKKwkJCWNhc2UgJCRpIGluIFwKKwkJCSpDVlMpIDs7IFwKKwkJCSoucHlbY29dKSA7OyBcCisJCQkqLm9yaWcpIDs7IFwKKwkJCSp+KSA7OyBcCisJCQkqKSBcCisJCQkJaWYgdGVzdCAtZCAkJGk7IHRoZW4gY29udGludWU7IGZpOyBcCisJCQkJaWYgdGVzdCAteCAkJGk7IHRoZW4gXAorCQkJCSAgICBlY2hvICQoSU5TVEFMTF9TQ1JJUFQpICQkaSAkJGI7IFwKKwkJCQkgICAgJChJTlNUQUxMX1NDUklQVCkgJCRpICQoREVTVERJUikkJGI7IFwKKwkJCQllbHNlIFwKKwkJCQkgICAgZWNobyAkKElOU1RBTExfREFUQSkgJCRpICQkYjsgXAorCQkJCSAgICAkKElOU1RBTExfREFUQSkgJCRpICQoREVTVERJUikkJGI7IFwKKwkJCQlmaTs7IFwKKwkJCWVzYWM7IFwKKwkJZG9uZTsgXAorCWRvbmUKKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL0xJQ0VOU0UgJChERVNURElSKSQoTElCREVTVCkvTElDRU5TRS50eHQKKwlpZiB0ZXN0IC1kICQoREVTVERJUikkKExJQkRFU1QpL2Rpc3R1dGlscy90ZXN0czsgdGhlbiBcCisJCSQoSU5TVEFMTF9EQVRBKSAkKHNyY2RpcikvTW9kdWxlcy94eG1vZHVsZS5jIFwKKwkJCSQoREVTVERJUikkKExJQkRFU1QpL2Rpc3R1dGlscy90ZXN0cyA7IFwKKwlmaQorCVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLVdpIC10dCAkKERFU1RESVIpJChMSUJERVNUKS9jb21waWxlYWxsLnB5IFwKKwkJLWQgJChMSUJERVNUKSAtZiBcCisJCS14ICdiYWRfY29kaW5nfGJhZHN5bnRheHxzaXRlLXBhY2thZ2VzfGxpYjJ0bzMvdGVzdHMvZGF0YScgXAorCQkkKERFU1RESVIpJChMSUJERVNUKQorCVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgJChSVU5TSEFSRUQpIFwKKwkJJChQWVRIT05fRk9SX0JVSUxEKSAtV2kgLXR0IC1PICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQktZCAkKExJQkRFU1QpIC1mIFwKKwkJLXggJ2JhZF9jb2Rpbmd8YmFkc3ludGF4fHNpdGUtcGFja2FnZXN8bGliMnRvMy90ZXN0cy9kYXRhJyBcCisJCSQoREVTVERJUikkKExJQkRFU1QpCisJLVBZVEhPTlBBVEg9JChERVNURElSKSQoTElCREVTVCkgICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLVdpIC10ICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQktZCAkKExJQkRFU1QpL3NpdGUtcGFja2FnZXMgLWYgXAorCQkteCBiYWRzeW50YXggJChERVNURElSKSQoTElCREVTVCkvc2l0ZS1wYWNrYWdlcworCS1QWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLVdpIC10IC1PICQoREVTVERJUikkKExJQkRFU1QpL2NvbXBpbGVhbGwucHkgXAorCQktZCAkKExJQkRFU1QpL3NpdGUtcGFja2FnZXMgLWYgXAorCQkteCBiYWRzeW50YXggJChERVNURElSKSQoTElCREVTVCkvc2l0ZS1wYWNrYWdlcworCS1QWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLW0gbGliMnRvMy5wZ2VuMi5kcml2ZXIgJChERVNURElSKSQoTElCREVTVCkvbGliMnRvMy9HcmFtbWFyLnR4dAorCS1QWVRIT05QQVRIPSQoREVTVERJUikkKExJQkRFU1QpICQoUlVOU0hBUkVEKSBcCisJCSQoUFlUSE9OX0ZPUl9CVUlMRCkgLW0gbGliMnRvMy5wZ2VuMi5kcml2ZXIgJChERVNURElSKSQoTElCREVTVCkvbGliMnRvMy9QYXR0ZXJuR3JhbW1hci50eHQKKworIyBDcmVhdGUgdGhlIFBMQVRESVIgc291cmNlIGRpcmVjdG9yeSwgaWYgb25lIHdhc24ndCBkaXN0cmlidXRlZC4uCiskKHNyY2RpcikvTGliLyQoUExBVERJUik6CisJbWtkaXIgJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpCisJY3AgJChzcmNkaXIpL0xpYi9wbGF0LWdlbmVyaWMvcmVnZW4gJChzcmNkaXIpL0xpYi8kKFBMQVRESVIpL3JlZ2VuCisJZXhwb3J0IFBBVEg7IFBBVEg9ImBwd2RgOiQkUEFUSCI7IFwKKwlleHBvcnQgUFlUSE9OUEFUSDsgUFlUSE9OUEFUSD0iJChzcmNkaXIpL0xpYjokKGFic19idWlsZGRpcikvYGNhdCBweWJ1aWxkZGlyLnR4dGAiOyBcCisJZXhwb3J0IERZTERfRlJBTUVXT1JLX1BBVEg7IERZTERfRlJBTUVXT1JLX1BBVEg9ImBwd2RgIjsgXAorCWV4cG9ydCBFWEU7IEVYRT0iJChCVUlMREVYRSkiOyBcCisJaWYgWyAtbiAiJChNVUxUSUFSQ0gpIiBdOyB0aGVuIGV4cG9ydCBNVUxUSUFSQ0g7IE1VTFRJQVJDSD0kKE1VTFRJQVJDSCk7IGZpOyBcCisJZXhwb3J0IFBZVEhPTl9GT1JfQlVJTEQ7IFwKKwlpZiBbICIkKGJ1aWxkKSIgPSAiJChob3N0KSIgXTsgdGhlbiBcCisJICBQWVRIT05fRk9SX0JVSUxEPSIkKEJVSUxEUFlUSE9OKSI7IFwKKwllbHNlIFwKKwkgIFBZVEhPTl9GT1JfQlVJTEQ9IiQoUFlUSE9OX0ZPUl9CVUlMRCkiOyBcCisJZmk7IFwKKwljZCAkKHNyY2RpcikvTGliLyQoUExBVERJUik7ICQoUlVOU0hBUkVEKSAuL3JlZ2VuICIkKENDKSIKKworcHl0aG9uLWNvbmZpZzogJChzcmNkaXIpL01pc2MvcHl0aG9uLWNvbmZpZy5pbgorCSMgU3Vic3RpdHV0aW9uIGhhcHBlbnMgaGVyZSwgYXMgdGhlIGNvbXBsZXRlbHktZXhwYW5kZWQgQklORElSCisJIyBpcyBub3QgYXZhaWxhYmxlIGluIGNvbmZpZ3VyZQorCXNlZCAtZSAicyxARVhFTkFNRUAsJChCSU5ESVIpL3B5dGhvbiQoVkVSU0lPTikkKEVYRSksIiA8ICQoc3JjZGlyKS9NaXNjL3B5dGhvbi1jb25maWcuaW4gPnB5dGhvbi1jb25maWcKKwkjIFJlcGxhY2UgbWFrZWZpbGUgY29tcGF0LiB2YXJpYWJsZSByZWZlcmVuY2VzIHdpdGggc2hlbGwgc2NyaXB0IGNvbXBhdC4gb25lczsgJChWQVIpIC0+ICR7VkFSfQorCXNlZCAtZSAicyxcJCQoXChbQS1aYS16MC05X10qXCkpLFwkJFx7XDFcfSxnIiA8IE1pc2MvcHl0aG9uLWNvbmZpZy5zaCA+cHl0aG9uLWNvbmZpZy5zaAorCisjIEluc3RhbGwgdGhlIGluY2x1ZGUgZmlsZXMKK0lOQ0xESVJTVE9NQUtFPSQoSU5DTFVERURJUikgJChDT05GSU5DTFVERURJUikgJChJTkNMVURFUFkpICQoQ09ORklOQ0xVREVQWSkKK2luY2xpbnN0YWxsOgorCUBmb3IgaSBpbiAkKElOQ0xESVJTVE9NQUtFKTsgXAorCWRvIFwKKwkJaWYgdGVzdCAhIC1kICQoREVTVERJUikkJGk7IHRoZW4gXAorCQkJZWNobyAiQ3JlYXRpbmcgZGlyZWN0b3J5ICQkaSI7IFwKKwkJCSQoSU5TVEFMTCkgLWQgLW0gJChESVJNT0RFKSAkKERFU1RESVIpJCRpOyBcCisJCWVsc2UJdHJ1ZTsgXAorCQlmaTsgXAorCWRvbmUKKwlAZm9yIGkgaW4gJChzcmNkaXIpL0luY2x1ZGUvKi5oOyBcCisJZG8gXAorCQllY2hvICQoSU5TVEFMTF9EQVRBKSAkJGkgJChJTkNMVURFUFkpOyBcCisJCSQoSU5TVEFMTF9EQVRBKSAkJGkgJChERVNURElSKSQoSU5DTFVERVBZKTsgXAorCWRvbmUKKwkkKElOU1RBTExfREFUQSkgcHljb25maWcuaCAkKERFU1RESVIpJChDT05GSU5DTFVERVBZKS9weWNvbmZpZy5oCisKKyMgSW5zdGFsbCB0aGUgbGlicmFyeSBhbmQgbWlzY2VsbGFuZW91cyBzdHVmZiBuZWVkZWQgZm9yIGV4dGVuZGluZy9lbWJlZGRpbmcKKyMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKK0xJQlBMPQkJJChMSUJQKS9jb25maWcKKworIyBwa2djb25maWcgZGlyZWN0b3J5CitMSUJQQz0JCSQoTElCRElSKS9wa2djb25maWcKKworbGliYWluc3RhbGw6CWFsbCBweXRob24tY29uZmlnCisJQGZvciBpIGluICQoTElCRElSKSAkKExJQlApICQoTElCUEwpICQoTElCUEMpOyBcCisJZG8gXAorCQlpZiB0ZXN0ICEgLWQgJChERVNURElSKSQkaTsgdGhlbiBcCisJCQllY2hvICJDcmVhdGluZyBkaXJlY3RvcnkgJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkJGk7IFwKKwkJZWxzZQl0cnVlOyBcCisJCWZpOyBcCisJZG9uZQorCUBpZiB0ZXN0IC1kICQoTElCUkFSWSk7IHRoZW4gOjsgZWxzZSBcCisJCWlmIHRlc3QgIiQoUFlUSE9ORlJBTUVXT1JLRElSKSIgPSBuby1mcmFtZXdvcms7IHRoZW4gXAorCQkJaWYgdGVzdCAiJChTTykiID0gLmRsbDsgdGhlbiBcCisJCQkJJChJTlNUQUxMX0RBVEEpICQoTERMSUJSQVJZKSAkKERFU1RESVIpJChMSUJQTCkgOyBcCisJCQllbHNlIFwKKwkJCQkkKElOU1RBTExfREFUQSkgJChMSUJSQVJZKSAkKERFU1RESVIpJChMSUJQTCkvJChMSUJSQVJZKSA7IFwKKwkJCQkkKFJBTkxJQikgJChERVNURElSKSQoTElCUEwpLyQoTElCUkFSWSkgOyBcCisJCQlmaTsgXAorCQllbHNlIFwKKwkJCWVjaG8gU2tpcCBpbnN0YWxsIG9mICQoTElCUkFSWSkgLSB1c2UgbWFrZSBmcmFtZXdvcmtpbnN0YWxsOyBcCisJCWZpOyBcCisJZmkKKwkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9jb25maWcuYyAkKERFU1RESVIpJChMSUJQTCkvY29uZmlnLmMKKwkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9weXRob24ubyAkKERFU1RESVIpJChMSUJQTCkvcHl0aG9uLm8KKwkkKElOU1RBTExfREFUQSkgJChzcmNkaXIpL01vZHVsZXMvY29uZmlnLmMuaW4gJChERVNURElSKSQoTElCUEwpL2NvbmZpZy5jLmluCisJJChJTlNUQUxMX0RBVEEpIE1ha2VmaWxlICQoREVTVERJUikkKExJQlBMKS9NYWtlZmlsZQorCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwICQoREVTVERJUikkKExJQlBMKS9TZXR1cAorCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLmxvY2FsICQoREVTVERJUikkKExJQlBMKS9TZXR1cC5sb2NhbAorCSQoSU5TVEFMTF9EQVRBKSBNb2R1bGVzL1NldHVwLmNvbmZpZyAkKERFU1RESVIpJChMSUJQTCkvU2V0dXAuY29uZmlnCisJJChJTlNUQUxMX0RBVEEpIE1pc2MvcHl0aG9uLnBjICQoREVTVERJUikkKExJQlBDKS9weXRob24tJChWRVJTSU9OKS5wYworCSQoSU5TVEFMTF9TQ1JJUFQpICQoc3JjZGlyKS9Nb2R1bGVzL21ha2VzZXR1cCAkKERFU1RESVIpJChMSUJQTCkvbWFrZXNldHVwCisJJChJTlNUQUxMX1NDUklQVCkgJChzcmNkaXIpL2luc3RhbGwtc2ggJChERVNURElSKSQoTElCUEwpL2luc3RhbGwtc2gKKwkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uJChWRVJTSU9OKS1jb25maWcKKwkkKElOU1RBTExfU0NSSVBUKSBweXRob24tY29uZmlnLnNoICQoREVTVERJUikkKEJJTkRJUikvcHl0aG9uLWNvbmZpZy5zaAorCXJtIHB5dGhvbi1jb25maWcKKwlAaWYgWyAtcyBNb2R1bGVzL3B5dGhvbi5leHAgLWEgXAorCQkiYGVjaG8gJChNQUNIREVQKSB8IHNlZCAncy9eXCguLi5cKS4qL1wxLydgIiA9ICJhaXgiIF07IHRoZW4gXAorCQllY2hvOyBlY2hvICJJbnN0YWxsaW5nIHN1cHBvcnQgZmlsZXMgZm9yIGJ1aWxkaW5nIHNoYXJlZCBleHRlbnNpb24gbW9kdWxlcyBvbiBBSVg6IjsgXAorCQkkKElOU1RBTExfREFUQSkgTW9kdWxlcy9weXRob24uZXhwCQlcCisJCQkJJChERVNURElSKSQoTElCUEwpL3B5dGhvbi5leHA7CQlcCisJCWVjaG87IGVjaG8gIiQoTElCUEwpL3B5dGhvbi5leHAiOwkJXAorCQkkKElOU1RBTExfU0NSSVBUKSAkKHNyY2RpcikvTW9kdWxlcy9tYWtleHBfYWl4CVwKKwkJCQkkKERFU1RESVIpJChMSUJQTCkvbWFrZXhwX2FpeDsJCVwKKwkJZWNobyAiJChMSUJQTCkvbWFrZXhwX2FpeCI7CQkJXAorCQkkKElOU1RBTExfU0NSSVBUKSAkKHNyY2RpcikvTW9kdWxlcy9sZF9zb19haXgJXAorCQkJCSQoREVTVERJUikkKExJQlBMKS9sZF9zb19haXg7CQlcCisJCWVjaG8gIiQoTElCUEwpL2xkX3NvX2FpeCI7CQkJXAorCQllY2hvOyBlY2hvICJTZWUgTWlzYy9BSVgtTk9URVMgZm9yIGRldGFpbHMuIjsJXAorCWVsc2UgdHJ1ZTsgXAorCWZpCisJQGNhc2UgIiQoTUFDSERFUCkiIGluIGJlb3MqKSBcCisJCWVjaG87IGVjaG8gIkluc3RhbGxpbmcgc3VwcG9ydCBmaWxlcyBmb3IgYnVpbGRpbmcgc2hhcmVkIGV4dGVuc2lvbiBtb2R1bGVzIG9uIEJlT1M6IjsgXAorCQkkKElOU1RBTExfREFUQSkgTWlzYy9CZU9TLU5PVEVTICQoREVTVERJUikkKExJQlBMKS9SRUFETUU7CVwKKwkJZWNobzsgZWNobyAiJChMSUJQTCkvUkVBRE1FIjsJCQlcCisJCSQoSU5TVEFMTF9TQ1JJUFQpIE1vZHVsZXMvYXJfYmVvcyAkKERFU1RESVIpJChMSUJQTCkvYXJfYmVvczsgXAorCQllY2hvICIkKExJQlBMKS9hcl9iZW9zIjsJCQlcCisJCSQoSU5TVEFMTF9TQ1JJUFQpIE1vZHVsZXMvbGRfc29fYmVvcyAkKERFU1RESVIpJChMSUJQTCkvbGRfc29fYmVvczsgXAorCQllY2hvICIkKExJQlBMKS9sZF9zb19iZW9zIjsJCQlcCisJCWVjaG87IGVjaG8gIlNlZSBNaXNjL0JlT1MtTk9URVMgZm9yIGRldGFpbHMuIjsJXAorCQk7OyBcCisJZXNhYworCisjIEluc3RhbGwgdGhlIGR5bmFtaWNhbGx5IGxvYWRhYmxlIG1vZHVsZXMKKyMgVGhpcyBnb2VzIGludG8gJChleGVjX3ByZWZpeCkKK3NoYXJlZGluc3RhbGw6IHNoYXJlZG1vZHMKKwkkKFJVTlNIQVJFRCkgJChQWVRIT05fRk9SX0JVSUxEKSAkKHNyY2Rpcikvc2V0dXAucHkgaW5zdGFsbCBcCisJICAgCS0tcHJlZml4PSQocHJlZml4KSBcCisJCS0taW5zdGFsbC1zY3JpcHRzPSQoQklORElSKSBcCisJCS0taW5zdGFsbC1wbGF0bGliPSQoREVTVFNIQVJFRCkgXAorCQktLXJvb3Q9JChERVNURElSKS8KKwktcm0gJChERVNURElSKSQoREVTVFNIQVJFRCkvX3N5c2NvbmZpZ2RhdGEucHkqCisKKyMgSGVyZSBhcmUgYSBjb3VwbGUgb2YgdGFyZ2V0cyBmb3IgTWFjT1NYIGFnYWluLCB0byBpbnN0YWxsIGEgZnVsbAorIyBmcmFtZXdvcmstYmFzZWQgUHl0aG9uLiBmcmFtZXdvcmtpbnN0YWxsIGluc3RhbGxzIGV2ZXJ5dGhpbmcsIHRoZQorIyBzdWJ0YXJnZXRzIGluc3RhbGwgc3BlY2lmaWMgcGFydHMuIE11Y2ggb2YgdGhlIGFjdHVhbCB3b3JrIGlzIG9mZmxvYWRlZCB0bworIyB0aGUgTWFrZWZpbGUgaW4gTWFjCisjCisjCisjIFRoaXMgdGFyZ2V0IGlzIGhlcmUgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGl0eSwgcHJldmlvdXMgdmVyc2lvbnMgb2YgUHl0aG9uCisjIGhhZG4ndCBpbnRlZ3JhdGVkIGZyYW1ld29yayBpbnN0YWxsYXRpb24gaW4gdGhlIG5vcm1hbCBpbnN0YWxsIHByb2Nlc3MuCitmcmFtZXdvcmtpbnN0YWxsOiBpbnN0YWxsCisKKyMgT24gaW5zdGFsbCwgd2UgcmUtbWFrZSB0aGUgZnJhbWV3b3JrCisjIHN0cnVjdHVyZSBpbiB0aGUgaW5zdGFsbCBsb2NhdGlvbiwgL0xpYnJhcnkvRnJhbWV3b3Jrcy8gb3IgdGhlIGFyZ3VtZW50IHRvCisjIC0tZW5hYmxlLWZyYW1ld29yay4gSWYgLS1lbmFibGUtZnJhbWV3b3JrIGhhcyBiZWVuIHNwZWNpZmllZCB0aGVuIHdlIGhhdmUKKyMgYXV0b21hdGljYWxseSBzZXQgcHJlZml4IHRvIHRoZSBsb2NhdGlvbiBkZWVwIGRvd24gaW4gdGhlIGZyYW1ld29yaywgc28gd2UKKyMgb25seSBoYXZlIHRvIGNhdGVyIGZvciB0aGUgc3RydWN0dXJhbCBiaXRzIG9mIHRoZSBmcmFtZXdvcmsuCisKK2ZyYW1ld29ya2luc3RhbGxmcmFtZXdvcms6IGZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmUgaW5zdGFsbCBmcmFtZXdvcmtpbnN0YWxsbWFjbGliCisKK2ZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmU6CSQoTERMSUJSQVJZKQorCUBpZiB0ZXN0ICIkKFBZVEhPTkZSQU1FV09SS0RJUikiID0gbm8tZnJhbWV3b3JrOyB0aGVuIFwKKwkJZWNobyBOb3QgY29uZmlndXJlZCB3aXRoIC0tZW5hYmxlLWZyYW1ld29yazsgXAorCQlleGl0IDE7IFwKKwllbHNlIHRydWU7IFwKKwlmaQorCUBmb3IgaSBpbiAkKHByZWZpeCkvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ogJChwcmVmaXgpL2xpYjsgZG9cCisJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKKwkJCWVjaG8gIkNyZWF0aW5nIGRpcmVjdG9yeSAkKERFU1RESVIpJCRpIjsgXAorCQkJJChJTlNUQUxMKSAtZCAtbSAkKERJUk1PREUpICQoREVTVERJUikkJGk7IFwKKwkJZWxzZQl0cnVlOyBcCisJCWZpOyBcCisJZG9uZQorCSQoTE4pIC1mc24gaW5jbHVkZS9weXRob24kKFZFUlNJT04pICQoREVTVERJUikkKHByZWZpeCkvSGVhZGVycworCXNlZCAncy8lVkVSU0lPTiUvJyJgJChSVU5TSEFSRUQpIC4vJChCVUlMRFBZVEhPTikgLWMgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQgcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSdgIicvZycgPCAkKFJFU1NSQ0RJUikvSW5mby5wbGlzdCA+ICQoREVTVERJUikkKHByZWZpeCkvUmVzb3VyY2VzL0luZm8ucGxpc3QKKwkkKExOKSAtZnNuICQoVkVSU0lPTikgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvVmVyc2lvbnMvQ3VycmVudAorCSQoTE4pIC1mc24gVmVyc2lvbnMvQ3VycmVudC8kKFBZVEhPTkZSQU1FV09SSykgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvJChQWVRIT05GUkFNRVdPUkspCisJJChMTikgLWZzbiBWZXJzaW9ucy9DdXJyZW50L0hlYWRlcnMgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvSGVhZGVycworCSQoTE4pIC1mc24gVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvUmVzb3VyY2VzCisJJChJTlNUQUxMX1NIQVJFRCkgJChMRExJQlJBUlkpICQoREVTVERJUikkKFBZVEhPTkZSQU1FV09SS1BSRUZJWCkvJChMRExJQlJBUlkpCisKKyMgVGhpcyBpbnN0YWxscyBNYWMvTGliIGludG8gdGhlIGZyYW1ld29yaworIyBJbnN0YWxsIGEgbnVtYmVyIG9mIHN5bWxpbmtzIHRvIGtlZXAgc29mdHdhcmUgdGhhdCBleHBlY3RzIGEgbm9ybWFsIHVuaXgKKyMgaW5zdGFsbCAod2hpY2ggaW5jbHVkZXMgcHl0aG9uLWNvbmZpZykgaGFwcHkuCitmcmFtZXdvcmtpbnN0YWxsbWFjbGliOgorCWxuIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWcvbGlicHl0aG9uJChWRVJTSU9OKS5hIgorCWxuIC1mcyAiLi4vLi4vLi4vJChQWVRIT05GUkFNRVdPUkspIiAiJChERVNURElSKSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKS9jb25maWcvbGlicHl0aG9uJChWRVJTSU9OKS5keWxpYiIKKwlsbiAtZnMgIi4uLyQoUFlUSE9ORlJBTUVXT1JLKSIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL2xpYnB5dGhvbiQoVkVSU0lPTikuZHlsaWIiCisJY2QgTWFjICYmICQoTUFLRSkgaW5zdGFsbG1hY3N1YnRyZWUgREVTVERJUj0iJChERVNURElSKSIKKworIyBUaGlzIGluc3RhbGxzIHRoZSBJREUsIHRoZSBMYXVuY2hlciBhbmQgb3RoZXIgYXBwcyBpbnRvIC9BcHBsaWNhdGlvbnMKK2ZyYW1ld29ya2luc3RhbGxhcHBzOgorCWNkIE1hYyAmJiAkKE1BS0UpIGluc3RhbGxhcHBzIERFU1RESVI9IiQoREVTVERJUikiCisKKyMgVGhpcyBpbnN0YWxsIHRoZSB1bml4IHB5dGhvbiBhbmQgcHl0aG9udyB0b29scyBpbiAvdXNyL2xvY2FsL2JpbgorZnJhbWV3b3JraW5zdGFsbHVuaXh0b29sczoKKwljZCBNYWMgJiYgJChNQUtFKSBpbnN0YWxsdW5peHRvb2xzIERFU1RESVI9IiQoREVTVERJUikiCisKK2ZyYW1ld29ya2FsdGluc3RhbGx1bml4dG9vbHM6CisJY2QgTWFjICYmICQoTUFLRSkgYWx0aW5zdGFsbHVuaXh0b29scyBERVNURElSPSIkKERFU1RESVIpIgorCisjIFRoaXMgaW5zdGFsbHMgdGhlIERlbW9zIGFuZCBUb29scyBpbnRvIHRoZSBhcHBsaWNhdGlvbnMgZGlyZWN0b3J5LgorIyBJdCBpcyBub3QgcGFydCBvZiBhIG5vcm1hbCBmcmFtZXdvcmtpbnN0YWxsCitmcmFtZXdvcmtpbnN0YWxsZXh0cmFzOgorCWNkIE1hYyAmJiAkKE1BS0UpIGluc3RhbGxleHRyYXMgREVTVERJUj0iJChERVNURElSKSIKKworIyBUaGlzIGluc3RhbGxzIGEgZmV3IG9mIHRoZSB1c2VmdWwgc2NyaXB0cyBpbiBUb29scy9zY3JpcHRzCitzY3JpcHRzaW5zdGFsbDoKKwlTUkNESVI9JChzcmNkaXIpICQoUlVOU0hBUkVEKSBcCisJJChQWVRIT05fRk9SX0JVSUxEKSAkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9zZXR1cC5weSBpbnN0YWxsIFwKKwktLXByZWZpeD0kKHByZWZpeCkgXAorCS0taW5zdGFsbC1zY3JpcHRzPSQoQklORElSKSBcCisJLS1yb290PSQoREVTVERJUikvCisKKyMgQnVpbGQgdGhlIHRvcGxldmVsIE1ha2VmaWxlCitNYWtlZmlsZS5wcmU6IE1ha2VmaWxlLnByZS5pbiBjb25maWcuc3RhdHVzCisJQ09ORklHX0ZJTEVTPU1ha2VmaWxlLnByZSBDT05GSUdfSEVBREVSUz0gJChTSEVMTCkgY29uZmlnLnN0YXR1cworCSQoTUFLRSkgLWYgTWFrZWZpbGUucHJlIE1ha2VmaWxlCisKKyMgUnVuIHRoZSBjb25maWd1cmUgc2NyaXB0LgorY29uZmlnLnN0YXR1czoJJChzcmNkaXIpL2NvbmZpZ3VyZQorCSQoU0hFTEwpICQoc3JjZGlyKS9jb25maWd1cmUgJChDT05GSUdfQVJHUykKKworLlBSRUNJT1VTOiBjb25maWcuc3RhdHVzICQoQlVJTERQWVRIT04pIE1ha2VmaWxlIE1ha2VmaWxlLnByZQorCisjIFNvbWUgbWFrZSdzIHB1dCB0aGUgb2JqZWN0IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisuYy5vOgorCSQoQ0MpIC1jICQoUFlfQ0ZMQUdTKSAtbyAkQCAkPAorCisjIFJ1biByZWluZGVudCBvbiB0aGUgbGlicmFyeQorcmVpbmRlbnQ6CisJLi8kKEJVSUxEUFlUSE9OKSAkKHNyY2RpcikvVG9vbHMvc2NyaXB0cy9yZWluZGVudC5weSAtciAkKHNyY2RpcikvTGliCisKKyMgUmVydW4gY29uZmlndXJlIHdpdGggdGhlIHNhbWUgb3B0aW9ucyBhcyBpdCB3YXMgcnVuIGxhc3QgdGltZSwKKyMgcHJvdmlkZWQgdGhlIGNvbmZpZy5zdGF0dXMgc2NyaXB0IGV4aXN0cworcmVjaGVjazoKKwkkKFNIRUxMKSBjb25maWcuc3RhdHVzIC0tcmVjaGVjaworCSQoU0hFTEwpIGNvbmZpZy5zdGF0dXMKKworIyBSZWJ1aWxkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZyb20gY29uZmlndXJlLmFjOyBhbHNvIHJlYnVpbGQgcHljb25maWcuaC5pbgorYXV0b2NvbmY6CisJKGNkICQoc3JjZGlyKTsgYXV0b2NvbmYpCisJKGNkICQoc3JjZGlyKTsgYXV0b2hlYWRlcikKKworIyBDcmVhdGUgYSB0YWdzIGZpbGUgZm9yIHZpCit0YWdzOjoKKwljZCAkKHNyY2Rpcik7IFwKKwljdGFncyAtdyAtdCBJbmNsdWRlLyouaDsgXAorCWZvciBpIGluICQoU1JDRElSUyk7IGRvIGN0YWdzIC13IC10IC1hICQkaS8qLltjaF07IFwKKwlkb25lOyBcCisJc29ydCAtbyB0YWdzIHRhZ3MKKworIyBDcmVhdGUgYSB0YWdzIGZpbGUgZm9yIEdOVSBFbWFjcworVEFHUzo6CisJY2QgJChzcmNkaXIpOyBcCisJZXRhZ3MgSW5jbHVkZS8qLmg7IFwKKwlmb3IgaSBpbiAkKFNSQ0RJUlMpOyBkbyBldGFncyAtYSAkJGkvKi5bY2hdOyBkb25lCisKKyMgVG91Y2ggZ2VuZXJhdGVkIGZpbGVzCit0b3VjaDoKKwl0b3VjaCBJbmNsdWRlL1B5dGhvbi1hc3QuaCBQeXRob24vUHl0aG9uLWFzdC5jCisKKyMgU2FuaXRhdGlvbiB0YXJnZXRzIC0tIGNsZWFuIGxlYXZlcyBsaWJyYXJpZXMsIGV4ZWN1dGFibGVzIGFuZCB0YWdzCisjIGZpbGVzLCB3aGljaCBjbG9iYmVyIHJlbW92ZXMgYXMgd2VsbAorcHljcmVtb3ZhbDoKKwlmaW5kICQoc3JjZGlyKSAtbmFtZSAnKi5weVtjb10nIC1leGVjIHJtIC1mIHt9ICc7JworCitjbGVhbjogcHljcmVtb3ZhbAorCWZpbmQgLiAtbmFtZSAnKi5bb2FdJyAtZXhlYyBybSAtZiB7fSAnOycKKwlmaW5kIC4gLW5hbWUgJyouc1tvbF0nIC1leGVjIHJtIC1mIHt9ICc7JworCWZpbmQgLiAtbmFtZSAnKi5zby5bMC05XSouWzAtOV0qJyAtZXhlYyBybSAtZiB7fSAnOycKKwlmaW5kIGJ1aWxkIC1uYW1lICdmZmljb25maWcuaCcgLWV4ZWMgcm0gLWYge30gJzsnIHx8IHRydWUKKwlmaW5kIGJ1aWxkIC1uYW1lICdmZmljb25maWcucHknIC1leGVjIHJtIC1mIHt9ICc7JyB8fCB0cnVlCisJLXJtIC1mIExpYi9saWIydG8zLypHcmFtbWFyKi5waWNrbGUKKworcHJvZmlsZS1yZW1vdmFsOgorCWZpbmQgLiAtbmFtZSAnKi5nYz8/JyAtZXhlYyBybSAtZiB7fSAnOycKKworY2xvYmJlcjogY2xlYW4gcHJvZmlsZS1yZW1vdmFsCisJLXJtIC1mICQoQlVJTERQWVRIT04pICQoUEdFTikgJChMSUJSQVJZKSAkKExETElCUkFSWSkgJChETExMSUJSQVJZKSBcCisJCXRhZ3MgVEFHUyBcCisJCWNvbmZpZy5jYWNoZSBjb25maWcubG9nIHB5Y29uZmlnLmggTW9kdWxlcy9jb25maWcuYworCS1ybSAtcmYgYnVpbGQgcGxhdGZvcm0KKwktcm0gLXJmICQoUFlUSE9ORlJBTUVXT1JLRElSKQorCisjIE1ha2UgdGhpbmdzIGV4dHJhIGNsZWFuLCBiZWZvcmUgbWFraW5nIGEgZGlzdHJpYnV0aW9uOgorIyByZW1vdmUgYWxsIGdlbmVyYXRlZCBmaWxlcywgZXZlbiBNYWtlZmlsZVsucHJlXQorIyBLZWVwIGNvbmZpZ3VyZSBhbmQgUHl0aG9uLWFzdC5bY2hdLCBpdCdzIHBvc3NpYmxlIHRoZXkgY2FuJ3QgYmUgZ2VuZXJhdGVkCitkaXN0Y2xlYW46IGNsb2JiZXIKKwlmb3IgZmlsZSBpbiBMaWIvdGVzdC9kYXRhLyogOyBkbyBcCisJICAgIGlmIHRlc3QgIiQkZmlsZSIgIT0gIkxpYi90ZXN0L2RhdGEvUkVBRE1FIjsgdGhlbiBybSAiJCRmaWxlIjsgZmk7IFwKKwlkb25lCisJLXJtIC1mIGNvcmUgTWFrZWZpbGUgTWFrZWZpbGUucHJlIGNvbmZpZy5zdGF0dXMgXAorCQlNb2R1bGVzL1NldHVwIE1vZHVsZXMvU2V0dXAubG9jYWwgTW9kdWxlcy9TZXR1cC5jb25maWcgXAorCQlNb2R1bGVzL2xkX3NvX2FpeCBNb2R1bGVzL3B5dGhvbi5leHAgTWlzYy9weXRob24ucGMKKwktcm0gLWYgcHl0aG9uKi1nZGIucHkKKwktcm0gLWYgcHlidWlsZGRpci50eHQKKwlmaW5kICQoc3JjZGlyKSAnKCcgLW5hbWUgJyouZmRjJyAtbyAtbmFtZSAnKn4nIFwKKwkJCSAgIC1vIC1uYW1lICdbQCwjXSonIC1vIC1uYW1lICcqLm9sZCcgXAorCQkJICAgLW8gLW5hbWUgJyoub3JpZycgLW8gLW5hbWUgJyoucmVqJyBcCisJCQkgICAtbyAtbmFtZSAnKi5iYWsnICcpJyBcCisJCQkgICAtZXhlYyBybSAtZiB7fSAnOycKKworIyBDaGVjayBmb3Igc21lbGx5IGV4cG9ydGVkIHN5bWJvbHMgKG5vdCBzdGFydGluZyB3aXRoIFB5L19QeSkKK3NtZWxseTogYWxsCisJbm0gLXAgJChMSUJSQVJZKSB8IFwKKwkJc2VkIC1uICIvIFtUREJdIC9zLy4qIC8vcCIgfCBncmVwIC12ICJeXypQeSIgfCBzb3J0IC11OyBcCisKKyMgRmluZCBmaWxlcyB3aXRoIGZ1bm55IG5hbWVzCitmdW5ueToKKwlmaW5kICQoU1VCRElSUykgJChTVUJESVJTVE9PKSAtdHlwZSBkIFwKKwkJLW8gLW5hbWUgJyouW2Noc10nIFwKKwkJLW8gLW5hbWUgJyoucHknIFwKKwkJLW8gLW5hbWUgJyouZG9jJyBcCisJCS1vIC1uYW1lICcqLnN0eScgXAorCQktbyAtbmFtZSAnKi5iaWInIFwKKwkJLW8gLW5hbWUgJyouZGF0JyBcCisJCS1vIC1uYW1lICcqLmVsJyBcCisJCS1vIC1uYW1lICcqLmZkJyBcCisJCS1vIC1uYW1lICcqLmluJyBcCisJCS1vIC1uYW1lICcqLnRleCcgXAorCQktbyAtbmFtZSAnKixbdnB0XScgXAorCQktbyAtbmFtZSAnU2V0dXAnIFwKKwkJLW8gLW5hbWUgJ1NldHVwLionIFwKKwkJLW8gLW5hbWUgUkVBRE1FIFwKKwkJLW8gLW5hbWUgTWFrZWZpbGUgXAorCQktbyAtbmFtZSBDaGFuZ2VMb2cgXAorCQktbyAtbmFtZSBSZXBvc2l0b3J5IFwKKwkJLW8gLW5hbWUgUm9vdCBcCisJCS1vIC1uYW1lIEVudHJpZXMgXAorCQktbyAtbmFtZSBUYWcgXAorCQktbyAtbmFtZSB0YWdzIFwKKwkJLW8gLW5hbWUgVEFHUyBcCisJCS1vIC1uYW1lIC5jdnNpZ25vcmUgXAorCQktbyAtbmFtZSBNQU5JRkVTVCBcCisJCS1vIC1wcmludAorCisjIFBlcmZvcm0gc29tZSB2ZXJpZmljYXRpb24gY2hlY2tzIG9uIGFueSBtb2RpZmllZCBmaWxlcy4KK3BhdGNoY2hlY2s6CisJJChSVU5TSEFSRUQpIC4vJChCVUlMRFBZVEhPTikgJChzcmNkaXIpL1Rvb2xzL3NjcmlwdHMvcGF0Y2hjaGVjay5weQorCisjIERlcGVuZGVuY2llcworCitQeXRob24vdGhyZWFkLm86ICAkKHNyY2RpcikvUHl0aG9uL3RocmVhZF9hdGhlb3MuaCAkKHNyY2RpcikvUHl0aG9uL3RocmVhZF9iZW9zLmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfY3RocmVhZC5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX2Zvb2Jhci5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX2x3cC5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX250LmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfb3MyLmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfcHRoLmggJChzcmNkaXIpL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX3NnaS5oICQoc3JjZGlyKS9QeXRob24vdGhyZWFkX3NvbGFyaXMuaCAkKHNyY2RpcikvUHl0aG9uL3RocmVhZF93aW5jZS5oCisKKyMgRGVjbGFyZSB0YXJnZXRzIHRoYXQgYXJlbid0IHJlYWwgZmlsZXMKKy5QSE9OWTogYWxsIGJ1aWxkX2FsbCBzaGFyZWRtb2RzIG9sZHNoYXJlZG1vZHMgdGVzdCBxdWlja3Rlc3QgbWVtdGVzdAorLlBIT05ZOiBpbnN0YWxsIGFsdGluc3RhbGwgb2xkc2hhcmVkaW5zdGFsbCBiaW5pbnN0YWxsIGFsdGJpbmluc3RhbGwKKy5QSE9OWTogbWFuaW5zdGFsbCBsaWJpbnN0YWxsIGluY2xpbnN0YWxsIGxpYmFpbnN0YWxsIHNoYXJlZGluc3RhbGwKKy5QSE9OWTogZnJhbWV3b3JraW5zdGFsbCBmcmFtZXdvcmtpbnN0YWxsZnJhbWV3b3JrIGZyYW1ld29ya2luc3RhbGxzdHJ1Y3R1cmUKKy5QSE9OWTogZnJhbWV3b3JraW5zdGFsbG1hY2xpYiBmcmFtZXdvcmtpbnN0YWxsYXBwcyBmcmFtZXdvcmtpbnN0YWxsdW5peHRvb2xzCisuUEhPTlk6IGZyYW1ld29ya2FsdGluc3RhbGx1bml4dG9vbHMgcmVjaGVjayBhdXRvY29uZiBjbGVhbiBjbG9iYmVyIGRpc3RjbGVhbgorLlBIT05ZOiBzbWVsbHkgZnVubnkgcGF0Y2hjaGVjayB0b3VjaCBhbHRtYW5pbnN0YWxsCisuUEhPTlk6IGdkYmhvb2tzCisKKyMgSUYgWU9VIFBVVCBBTllUSElORyBIRVJFIElUIFdJTEwgR08gQVdBWQorCisjIFJ1bGVzIGFwcGVuZGVkIGJ5IG1ha2VkZXBlbmQKKworTW9kdWxlcy9wb3NpeG1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy9wb3NpeG1vZHVsZS5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMgLW8gTW9kdWxlcy9wb3NpeG1vZHVsZS5vCitNb2R1bGVzL3Bvc2l4bW9kdWxlJChTTyk6ICBNb2R1bGVzL3Bvc2l4bW9kdWxlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9wb3NpeG1vZHVsZS5vICAgLW8gTW9kdWxlcy9wb3NpeG1vZHVsZSQoU08pCitNb2R1bGVzL3RocmVhZG1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy90aHJlYWRtb2R1bGUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy90aHJlYWRtb2R1bGUuYyAtbyBNb2R1bGVzL3RocmVhZG1vZHVsZS5vCitNb2R1bGVzL3RocmVhZG1vZHVsZSQoU08pOiAgTW9kdWxlcy90aHJlYWRtb2R1bGUubzsgJChCTERTSEFSRUQpICBNb2R1bGVzL3RocmVhZG1vZHVsZS5vICAgLW8gTW9kdWxlcy90aHJlYWRtb2R1bGUkKFNPKQorTW9kdWxlcy9zaWduYWxtb2R1bGUubzogJChzcmNkaXIpL01vZHVsZXMvc2lnbmFsbW9kdWxlLmM7ICQoQ0MpICQoUFlfQ0ZMQUdTKSAgLWMgJChzcmNkaXIpL01vZHVsZXMvc2lnbmFsbW9kdWxlLmMgLW8gTW9kdWxlcy9zaWduYWxtb2R1bGUubworTW9kdWxlcy9zaWduYWxtb2R1bGUkKFNPKTogIE1vZHVsZXMvc2lnbmFsbW9kdWxlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9zaWduYWxtb2R1bGUubyAgIC1vIE1vZHVsZXMvc2lnbmFsbW9kdWxlJChTTykKK01vZHVsZXMvZXJybm9tb2R1bGUubzogJChzcmNkaXIpL01vZHVsZXMvZXJybm9tb2R1bGUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy9lcnJub21vZHVsZS5jIC1vIE1vZHVsZXMvZXJybm9tb2R1bGUubworTW9kdWxlcy9lcnJub21vZHVsZSQoU08pOiAgTW9kdWxlcy9lcnJub21vZHVsZS5vOyAkKEJMRFNIQVJFRCkgIE1vZHVsZXMvZXJybm9tb2R1bGUubyAgIC1vIE1vZHVsZXMvZXJybm9tb2R1bGUkKFNPKQorTW9kdWxlcy9fc3JlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL19zcmUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy9fc3JlLmMgLW8gTW9kdWxlcy9fc3JlLm8KK01vZHVsZXMvX3NyZSQoU08pOiAgTW9kdWxlcy9fc3JlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9fc3JlLm8gICAtbyBNb2R1bGVzL19zcmUkKFNPKQorTW9kdWxlcy9fY29kZWNzbW9kdWxlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMgLW8gTW9kdWxlcy9fY29kZWNzbW9kdWxlLm8KK01vZHVsZXMvX2NvZGVjc21vZHVsZSQoU08pOiAgTW9kdWxlcy9fY29kZWNzbW9kdWxlLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9fY29kZWNzbW9kdWxlLm8gICAtbyBNb2R1bGVzL19jb2RlY3Ntb2R1bGUkKFNPKQorTW9kdWxlcy9fd2Vha3JlZi5vOiAkKHNyY2RpcikvTW9kdWxlcy9fd2Vha3JlZi5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL193ZWFrcmVmLmMgLW8gTW9kdWxlcy9fd2Vha3JlZi5vCitNb2R1bGVzL193ZWFrcmVmJChTTyk6ICBNb2R1bGVzL193ZWFrcmVmLm87ICQoQkxEU0hBUkVEKSAgTW9kdWxlcy9fd2Vha3JlZi5vICAgLW8gTW9kdWxlcy9fd2Vha3JlZiQoU08pCitNb2R1bGVzL3ppcGltcG9ydC5vOiAkKHNyY2RpcikvTW9kdWxlcy96aXBpbXBvcnQuYzsgJChDQykgJChQWV9DRkxBR1MpICAtYyAkKHNyY2RpcikvTW9kdWxlcy96aXBpbXBvcnQuYyAtbyBNb2R1bGVzL3ppcGltcG9ydC5vCitNb2R1bGVzL3ppcGltcG9ydCQoU08pOiAgTW9kdWxlcy96aXBpbXBvcnQubzsgJChCTERTSEFSRUQpICBNb2R1bGVzL3ppcGltcG9ydC5vICAgLW8gTW9kdWxlcy96aXBpbXBvcnQkKFNPKQorTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vOiAkKHNyY2RpcikvTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMgLW8gTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vCitNb2R1bGVzL19zeW10YWJsZW1vZHVsZSQoU08pOiAgTW9kdWxlcy9zeW10YWJsZW1vZHVsZS5vOyAkKEJMRFNIQVJFRCkgIE1vZHVsZXMvc3ltdGFibGVtb2R1bGUubyAgIC1vIE1vZHVsZXMvX3N5bXRhYmxlbW9kdWxlJChTTykKK01vZHVsZXMveHhzdWJ0eXBlLm86ICQoc3JjZGlyKS9Nb2R1bGVzL3h4c3VidHlwZS5jOyAkKENDKSAkKFBZX0NGTEFHUykgIC1jICQoc3JjZGlyKS9Nb2R1bGVzL3h4c3VidHlwZS5jIC1vIE1vZHVsZXMveHhzdWJ0eXBlLm8KK01vZHVsZXMveHhzdWJ0eXBlJChTTyk6ICBNb2R1bGVzL3h4c3VidHlwZS5vOyAkKEJMRFNIQVJFRCkgIE1vZHVsZXMveHhzdWJ0eXBlLm8gICAtbyBNb2R1bGVzL3h4c3VidHlwZSQoU08pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbmZpZy9TZXR1cCBiL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MjBmZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9TZXR1cApAQCAtMCwwICsxLDUwMCBAQAorIyAtKi0gbWFrZWZpbGUgLSotCisjIFRoZSBmaWxlIFNldHVwIGlzIHVzZWQgYnkgdGhlIG1ha2VzZXR1cCBzY3JpcHQgdG8gY29uc3RydWN0IHRoZSBmaWxlcworIyBNYWtlZmlsZSBhbmQgY29uZmlnLmMsIGZyb20gTWFrZWZpbGUucHJlIGFuZCBjb25maWcuYy5pbiwKKyMgcmVzcGVjdGl2ZWx5LiAgVGhlIGZpbGUgU2V0dXAgaXRzZWxmIGlzIGluaXRpYWxseSBjb3BpZWQgZnJvbQorIyBTZXR1cC5kaXN0OyBvbmNlIGl0IGV4aXN0cyBpdCB3aWxsIG5vdCBiZSBvdmVyd3JpdHRlbiwgc28geW91IGNhbiBlZGl0CisjIFNldHVwIHRvIHlvdXIgaGVhcnQncyBjb250ZW50LiAgTm90ZSB0aGF0IE1ha2VmaWxlLnByZSBpcyBjcmVhdGVkCisjIGZyb20gTWFrZWZpbGUucHJlLmluIGJ5IHRoZSB0b3BsZXZlbCBjb25maWd1cmUgc2NyaXB0LgorCisjIChWUEFUSCBub3RlczogU2V0dXAgYW5kIE1ha2VmaWxlLnByZSBhcmUgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgYXMKKyMgYXJlIE1ha2VmaWxlIGFuZCBjb25maWcuYzsgdGhlICouaW4gYW5kICouZGlzdCBmaWxlcyBhcmUgaW4gdGhlIHNvdXJjZQorIyBkaXJlY3RvcnkuKQorCisjIEVhY2ggbGluZSBpbiB0aGlzIGZpbGUgZGVzY3JpYmVzIG9uZSBvciBtb3JlIG9wdGlvbmFsIG1vZHVsZXMuCisjIE1vZHVsZXMgZW5hYmxlZCBoZXJlIHdpbGwgbm90IGJlIGNvbXBpbGVkIGJ5IHRoZSBzZXR1cC5weSBzY3JpcHQsCisjIHNvIHRoZSBmaWxlIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHNldHVwLnB5J3MgYmVoYXZpb3IuCisKKyMgTGluZXMgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyMKKyMgPG1vZHVsZT4gLi4uIFs8c291cmNlZmlsZT4gLi4uXSBbPGNwcGFyZz4gLi4uXSBbPGxpYnJhcnk+IC4uLl0KKyMKKyMgPHNvdXJjZWZpbGU+IGlzIGFueXRoaW5nIGVuZGluZyBpbiAuYyAoLkMsIC5jYywgLmMrKyBhcmUgQysrIGZpbGVzKQorIyA8Y3BwYXJnPiBpcyBhbnl0aGluZyBzdGFydGluZyB3aXRoIC1JLCAtRCwgLVUgb3IgLUMKKyMgPGxpYnJhcnk+IGlzIGFueXRoaW5nIGVuZGluZyBpbiAuYSBvciBiZWdpbm5pbmcgd2l0aCAtbCBvciAtTAorIyA8bW9kdWxlPiBpcyBhbnl0aGluZyBlbHNlIGJ1dCBzaG91bGQgYmUgYSB2YWxpZCBQeXRob24KKyMgaWRlbnRpZmllciAobGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlcywgYmVnaW5uaW5nIHdpdGggbm9uLWRpZ2l0KQorIworIyAoQXMgdGhlIG1ha2VzZXR1cCBzY3JpcHQgY2hhbmdlcywgaXQgbWF5IHJlY29nbml6ZSBzb21lIG90aGVyCisjIGFyZ3VtZW50cyBhcyB3ZWxsLCBlLmcuICouc28gYW5kICouc2wgYXMgbGlicmFyaWVzLiAgU2VlIHRoZSBiaWcKKyMgY2FzZSBzdGF0ZW1lbnQgaW4gdGhlIG1ha2VzZXR1cCBzY3JpcHQuKQorIworIyBMaW5lcyBjYW4gYWxzbyBoYXZlIHRoZSBmb3JtCisjCisjIDxuYW1lPiA9IDx2YWx1ZT4KKyMKKyMgd2hpY2ggZGVmaW5lcyBhIE1ha2UgdmFyaWFibGUgZGVmaW5pdGlvbiBpbnNlcnRlZCBpbnRvIE1ha2VmaWxlLmluCisjCisjIEZpbmFsbHksIGlmIGEgbGluZSBjb250YWlucyBqdXN0IHRoZSB3b3JkICIqc2hhcmVkKiIgKHdpdGhvdXQgdGhlCisjIHF1b3RlcyBidXQgd2l0aCB0aGUgc3RhcnMpLCB0aGVuIHRoZSBmb2xsb3dpbmcgbW9kdWxlcyB3aWxsIG5vdCBiZQorIyBidWlsdCBzdGF0aWNhbGx5LiAgVGhlIGJ1aWxkIHByb2Nlc3Mgd29ya3MgbGlrZSB0aGlzOgorIworIyAxLiBCdWlsZCBhbGwgbW9kdWxlcyB0aGF0IGFyZSBkZWNsYXJlZCBhcyBzdGF0aWMgaW4gTW9kdWxlcy9TZXR1cCwKKyMgICAgY29tYmluZSB0aGVtIGludG8gbGlicHl0aG9ueHkuYSwgY29tYmluZSB0aGF0IGludG8gcHl0aG9uLgorIyAyLiBCdWlsZCBhbGwgbW9kdWxlcyB0aGF0IGFyZSBsaXN0ZWQgYXMgc2hhcmVkIGluIE1vZHVsZXMvU2V0dXAuCisjIDMuIEludm9rZSBzZXR1cC5weS4gVGhhdCBidWlsZHMgYWxsIG1vZHVsZXMgdGhhdAorIyAgICBhKSBhcmUgbm90IGJ1aWx0aW4sIGFuZAorIyAgICBiKSBhcmUgbm90IGxpc3RlZCBpbiBNb2R1bGVzL1NldHVwLCBhbmQKKyMgICAgYykgY2FuIGJlIGJ1aWxkIG9uIHRoZSB0YXJnZXQKKyMKKyMgVGhlcmVmb3JlLCBtb2R1bGVzIGRlY2xhcmVkIHRvIGJlIHNoYXJlZCB3aWxsIG5vdCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgY29uZmlnLmMgZmlsZSwgbm9yIGluIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUKKyMgYWRkZWQgdG8gdGhlIGxpYnJhcnkgYXJjaGl2ZSwgYW5kIHRoZWlyIGxpbmtlciBvcHRpb25zIHdvbid0IGJlCisjIGFkZGVkIHRvIHRoZSBsaW5rZXIgb3B0aW9ucy4gUnVsZXMgdG8gY3JlYXRlIHRoZWlyIC5vIGZpbGVzIGFuZAorIyB0aGVpciBzaGFyZWQgbGlicmFyaWVzIHdpbGwgc3RpbGwgYmUgYWRkZWQgdG8gdGhlIE1ha2VmaWxlLCBhbmQKKyMgdGhlaXIgbmFtZXMgd2lsbCBiZSBjb2xsZWN0ZWQgaW4gdGhlIE1ha2UgdmFyaWFibGUgU0hBUkVETU9EUy4gIFRoaXMKKyMgaXMgdXNlZCB0byBidWlsZCBtb2R1bGVzIGFzIHNoYXJlZCBsaWJyYXJpZXMuICAoVGhleSBjYW4gYmUKKyMgaW5zdGFsbGVkIHVzaW5nICJtYWtlIHNoYXJlZGluc3RhbGwiLCB3aGljaCBpcyBpbXBsaWVkIGJ5IHRoZQorIyB0b3BsZXZlbCAibWFrZSBpbnN0YWxsIiB0YXJnZXQuKSAgKEZvciBjb21wYXRpYmlsaXR5LAorIyAqbm9jb25maWcqIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgKnNoYXJlZCouKQorIworIyBJbiBhZGRpdGlvbiwgKnN0YXRpYyogZXhwbGljaXRseSBkZWNsYXJlcyB0aGUgZm9sbG93aW5nIG1vZHVsZXMgdG8KKyMgYmUgc3RhdGljLiAgTGluZXMgY29udGFpbmluZyAiKnN0YXRpYyoiIGFuZCAiKnNoYXJlZCoiIG1heSB0aHVzCisjIGFsdGVybmF0ZSB0aHJvdWdob3V0IHRoaXMgZmlsZS4KKworIyBOT1RFOiBBcyBhIHN0YW5kYXJkIHBvbGljeSwgYXMgbWFueSBtb2R1bGVzIGFzIGNhbiBiZSBzdXBwb3J0ZWQgYnkgYQorIyBwbGF0Zm9ybSBzaG91bGQgYmUgcHJlc2VudC4gIFRoZSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBhbGwgbW9kdWxlcworIyBlbmFibGVkIHRoYXQgYXJlIHN1cHBvcnRlZCBieSBtb3N0IHBsYXRmb3JtcyBhbmQgZG9uJ3QgcmVxdWlyZSB5b3UKKyMgdG8gZnRwIHNvdXJjZXMgZnJvbSBlbHNld2hlcmUuCisKKworIyBTb21lIHNwZWNpYWwgcnVsZXMgdG8gZGVmaW5lIFBZVEhPTlBBVEguCisjIEVkaXQgdGhlIGRlZmluaXRpb25zIGJlbG93IHRvIGluZGljYXRlIHdoaWNoIG9wdGlvbnMgeW91IGFyZSB1c2luZy4KKyMgRG9uJ3QgYWRkIGFueSB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzIQorCisjIERpcmVjdG9yaWVzIHdoZXJlIGxpYnJhcnkgZmlsZXMgZ2V0IGluc3RhbGxlZC4KKyMgREVTVExJQiBpcyBmb3IgUHl0aG9uIG1vZHVsZXM7IE1BQ0hERVNUTElCIGZvciBzaGFyZWQgbGlicmFyaWVzLgorREVTVExJQj0kKExJQkRFU1QpCitNQUNIREVTVExJQj0kKEJJTkxJQkRFU1QpCisKKyMgTk9URTogYWxsIHRoZSBwYXRocyBhcmUgbm93IHJlbGF0aXZlIHRvIHRoZSBwcmVmaXggdGhhdCBpcyBjb21wdXRlZAorIyBhdCBydW4gdGltZSEKKworIyBTdGFuZGFyZCBwYXRoIC0tIGRvbid0IGVkaXQuCisjIE5vIGxlYWRpbmcgY29sb24gc2luY2UgdGhpcyBpcyB0aGUgZmlyc3QgZW50cnkuCisjIEVtcHR5IHNpbmNlIHRoaXMgaXMgbm93IGp1c3QgdGhlIHJ1bnRpbWUgcHJlZml4LgorREVTVFBBVEg9CisKKyMgU2l0ZSBzcGVjaWZpYyBwYXRoIGNvbXBvbmVudHMgLS0gc2hvdWxkIGJlZ2luIHdpdGggJChERUxJTSkgaWYgbm9uLWVtcHR5CitTSVRFUEFUSD0KKworIyBTdGFuZGFyZCBwYXRoIGNvbXBvbmVudHMgZm9yIHRlc3QgbW9kdWxlcworVEVTVFBBVEg9CisKKyMgUGF0aCBjb21wb25lbnRzIGZvciBtYWNoaW5lLSBvciBzeXN0ZW0tZGVwZW5kZW50IG1vZHVsZXMgYW5kIHNoYXJlZCBsaWJyYXJpZXMKK01BQ0hERVBQQVRIPSQoREVMSU0pcGxhdC0kKE1BQ0hERVApCitFWFRSQU1BQ0hERVBQQVRIPQorCisjIFBhdGggY29tcG9uZW50IGZvciB0aGUgVGtpbnRlci1yZWxhdGVkIG1vZHVsZXMKKyMgVGhlIFRLUEFUSCB2YXJpYWJsZSBpcyBhbHdheXMgZW5hYmxlZCwgdG8gc2F2ZSB5b3UgdGhlIGVmZm9ydC4KK1RLUEFUSD0kKERFTElNKWxpYi10aworCisjIFBhdGggY29tcG9uZW50IGZvciBvbGQgbW9kdWxlcy4KK09MRFBBVEg9JChERUxJTSlsaWItb2xkCisKK0NPUkVQWVRIT05QQVRIPSQoREVTVFBBVEgpJChTSVRFUEFUSCkkKFRFU1RQQVRIKSQoTUFDSERFUFBBVEgpJChFWFRSQU1BQ0hERVBQQVRIKSQoVEtQQVRIKSQoT0xEUEFUSCkKK1BZVEhPTlBBVEg9JChDT1JFUFlUSE9OUEFUSCkKKworCisjIFRoZSBtb2R1bGVzIGxpc3RlZCBoZXJlIGNhbid0IGJlIGJ1aWx0IGFzIHNoYXJlZCBsaWJyYXJpZXMgZm9yCisjIHZhcmlvdXMgcmVhc29uczsgdGhlcmVmb3JlIHRoZXkgYXJlIGxpc3RlZCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlCisjIG5vcm1hbCBvcmRlci4KKworIyBUaGlzIG9ubHkgY29udGFpbnMgdGhlIG1pbmltYWwgc2V0IG9mIG1vZHVsZXMgcmVxdWlyZWQgdG8gcnVuIHRoZSAKKyMgc2V0dXAucHkgc2NyaXB0IGluIHRoZSByb290IG9mIHRoZSBQeXRob24gc291cmNlIHRyZWUuCisKK2Vycm5vIGVycm5vbW9kdWxlLmMJCSMgcG9zaXggKFVOSVgpIGVycm5vIHZhbHVlcworI0ZJWE1FOiBzZXR1cC5weSBkZXRlY3QgdGhpcyBtb2R1bGUgYWxvbmcgd2l0aCBncnAgYW5kIHNwd2QuCisjRklYTUU6IHdoYXQgYWJvdXQgdG8gY29tbWVudCA/CisjcHdkIHB3ZG1vZHVsZS5jCQkJIyB0aGlzIGlzIG5lZWRlZCB0byBmaW5kIG91dCB0aGUgdXNlcidzIGhvbWUgZGlyCisJCQkJIyBpZiAkSE9NRSBpcyBub3Qgc2V0Citfc3JlIF9zcmUuYwkJCSMgRnJlZHJpayBMdW5kaCdzIG5ldyByZWd1bGFyIGV4cHJlc3Npb25zCitfY29kZWNzIF9jb2RlY3Ntb2R1bGUuYwkJIyBhY2Nlc3MgdG8gdGhlIGJ1aWx0aW4gY29kZWNzIGFuZCBjb2RlYyByZWdpc3RyeQorX3dlYWtyZWYgX3dlYWtyZWYuYyAgICAgICAgICAgICAjIHdlYWsgcmVmZXJlbmNlcworCisjIFRoZSB6aXBpbXBvcnQgbW9kdWxlIGlzIGFsd2F5cyBpbXBvcnRlZCBhdCBzdGFydHVwLiBIYXZpbmcgaXQgYXMgYQorIyBidWlsdGluIG1vZHVsZSBhdm9pZHMgc29tZSBib290c3RyYXBwaW5nIHByb2JsZW1zIGFuZCByZWR1Y2VzIG92ZXJoZWFkLgoremlwaW1wb3J0IHppcGltcG9ydC5jCisKKyMgVGhlIHJlc3Qgb2YgdGhlIG1vZHVsZXMgbGlzdGVkIGluIHRoaXMgZmlsZSBhcmUgYWxsIGNvbW1lbnRlZCBvdXQgYnkKKyMgZGVmYXVsdC4gIFVzdWFsbHkgdGhleSBjYW4gYmUgZGV0ZWN0ZWQgYW5kIGJ1aWx0IGFzIGR5bmFtaWNhbGx5CisjIGxvYWRlZCBtb2R1bGVzIGJ5IHRoZSBuZXcgc2V0dXAucHkgc2NyaXB0IGFkZGVkIGluIFB5dGhvbiAyLjEuICBJZgorIyB5b3UncmUgb24gYSBwbGF0Zm9ybSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCBkeW5hbWljIGxvYWRpbmcsIHdhbnQgdG8gCisjIGNvbXBpbGUgbW9kdWxlcyBzdGF0aWNhbGx5IGludG8gdGhlIFB5dGhvbiBiaW5hcnksIG9yIG5lZWQgdG8gCisjIHNwZWNpZnkgc29tZSBvZGQgc2V0IG9mIGNvbXBpbGVyIHN3aXRjaGVzLCB5b3UgY2FuIHVuY29tbWVudCB0aGUgCisjIGFwcHJvcHJpYXRlIGxpbmVzIGJlbG93LgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBUaGUgUHl0aG9uIHN5bXRhYmxlIG1vZHVsZSBkZXBlbmRzIG9uIC5oIGZpbGVzIHRoYXQgc2V0dXAucHkgZG9lc24ndCB0cmFjaworX3N5bXRhYmxlIHN5bXRhYmxlbW9kdWxlLmMKKworIyBUaGUgU0dJIHNwZWNpZmljIEdMIG1vZHVsZToKKworR0xIQUNLPS1EY2xlYXI9X19HTGNsZWFyCisjZ2wgZ2xtb2R1bGUuYyBjZ2Vuc3VwcG9ydC5jIC1JJChzcmNkaXIpICQoR0xIQUNLKSAtbGdsIC1sWDExCisKKyMgUHVyZSBtb2R1bGUuICBDYW5ub3QgYmUgbGlua2VkIGR5bmFtaWNhbGx5LgorIyAtRFdJVEhfUVVBTlRJRlksIC1EV0lUSF9QVVJJRlksIG9yIC1EV0lUSF9BTExfUFVSRQorI1dISUNIX1BVUkVfUFJPRFVDVFM9LURXSVRIX0FMTF9QVVJFCisjUFVSRV9JTkNMUz0tSS91c3IvbG9jYWwvaW5jbHVkZQorI1BVUkVfU1RVQkxJQlM9LUwvdXNyL2xvY2FsL2xpYiAtbHB1cmlmeV9zdHVicyAtbHF1YW50aWZ5X3N0dWJzCisjcHVyZSBwdXJlbW9kdWxlLmMgJChXSElDSF9QVVJFX1BST0RVQ1RTKSAkKFBVUkVfSU5DTFMpICQoUFVSRV9TVFVCTElCUykKKworIyBVbmNvbW1lbnRpbmcgdGhlIGZvbGxvd2luZyBsaW5lIHRlbGxzIG1ha2VzZXR1cCB0aGF0IGFsbCBmb2xsb3dpbmcKKyMgbW9kdWxlcyBhcmUgdG8gYmUgYnVpbHQgYXMgc2hhcmVkIGxpYnJhcmllcyAoc2VlIGFib3ZlIGZvciBtb3JlCisjIGRldGFpbDsgYWxzbyBub3RlIHRoYXQgKnN0YXRpYyogcmV2ZXJzZXMgdGhpcyBlZmZlY3QpOgorCisjKnNoYXJlZCoKKworIyBHTlUgcmVhZGxpbmUuICBVbmxpa2UgcHJldmlvdXMgUHl0aG9uIGluY2FybmF0aW9ucywgR05VIHJlYWRsaW5lIGlzCisjIG5vdyBpbmNvcnBvcmF0ZWQgaW4gYW4gb3B0aW9uYWwgbW9kdWxlLCBjb25maWd1cmVkIGluIHRoZSBTZXR1cCBmaWxlCisjIGluc3RlYWQgb2YgYnkgYSBjb25maWd1cmUgc2NyaXB0IHN3aXRjaC4gIFlvdSBtYXkgaGF2ZSB0byBpbnNlcnQgYQorIyAtTCBvcHRpb24gcG9pbnRpbmcgdG8gdGhlIGRpcmVjdG9yeSB3aGVyZSBsaWJyZWFkbGluZS4qIGxpdmVzLAorIyBhbmQgeW91IG1heSBoYXZlIHRvIGNoYW5nZSAtbHRlcm1jYXAgdG8gLWx0ZXJtbGliIG9yIHBlcmhhcHMgcmVtb3ZlCisjIGl0LCBkZXBlbmRpbmcgb24geW91ciBzeXN0ZW0gLS0gc2VlIHRoZSBHTlUgcmVhZGxpbmUgaW5zdHJ1Y3Rpb25zLgorIyBJdCdzIG9rYXkgZm9yIHRoaXMgdG8gYmUgYSBzaGFyZWQgbGlicmFyeSwgdG9vLgorCisjcmVhZGxpbmUgcmVhZGxpbmUuYyAtbHJlYWRsaW5lIC1sdGVybWNhcAorCisKKyMgTW9kdWxlcyB0aGF0IHNob3VsZCBhbHdheXMgYmUgcHJlc2VudCAobm9uIFVOSVggZGVwZW5kZW50KToKKworI2FycmF5IGFycmF5bW9kdWxlLmMJIyBhcnJheSBvYmplY3RzCisjY21hdGggY21hdGhtb2R1bGUuYyBfbWF0aC5jICMgLWxtICMgY29tcGxleCBtYXRoIGxpYnJhcnkgZnVuY3Rpb25zCisjbWF0aCBtYXRobW9kdWxlLmMgX21hdGguYyAjIC1sbSAjIG1hdGggbGlicmFyeSBmdW5jdGlvbnMsIGUuZy4gc2luKCkKKyNfc3RydWN0IF9zdHJ1Y3QuYwkjIGJpbmFyeSBzdHJ1Y3R1cmUgcGFja2luZy91bnBhY2tpbmcKKyN0aW1lIHRpbWVtb2R1bGUuYyAjIC1sbSAjIHRpbWUgb3BlcmF0aW9ucyBhbmQgdmFyaWFibGVzCisjb3BlcmF0b3Igb3BlcmF0b3IuYwkjIG9wZXJhdG9yLmFkZCgpIGFuZCBzaW1pbGFyIGdvb2RpZXMKKyNfdGVzdGNhcGkgX3Rlc3RjYXBpbW9kdWxlLmMgICAgIyBQeXRob24gQyBBUEkgdGVzdCBtb2R1bGUKKyNfcmFuZG9tIF9yYW5kb21tb2R1bGUuYwkjIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisjX2NvbGxlY3Rpb25zIF9jb2xsZWN0aW9uc21vZHVsZS5jICMgQ29udGFpbmVyIHR5cGVzCisjX2hlYXBxIF9oZWFwcW1vZHVsZS5jCQkjIEhlYXBxIHR5cGUKKyNpdGVydG9vbHMgaXRlcnRvb2xzbW9kdWxlLmMJIyBGdW5jdGlvbnMgY3JlYXRpbmcgaXRlcmF0b3JzIGZvciBlZmZpY2llbnQgbG9vcGluZyAKKyNzdHJvcCBzdHJvcG1vZHVsZS5jCQkjIFN0cmluZyBtYW5pcHVsYXRpb25zCisjX2Z1bmN0b29scyBfZnVuY3Rvb2xzbW9kdWxlLmMJIyBUb29scyBmb3Igd29ya2luZyB3aXRoIGZ1bmN0aW9ucyBhbmQgY2FsbGFibGUgb2JqZWN0cworI19lbGVtZW50dHJlZSAtSSQoc3JjZGlyKS9Nb2R1bGVzL2V4cGF0IC1ESEFWRV9FWFBBVF9DT05GSUdfSCAtRFVTRV9QWUVYUEFUX0NBUEkgX2VsZW1lbnR0cmVlLmMJIyBlbGVtZW50dHJlZSBhY2NlbGVyYXRvcgorI19waWNrbGUgX3BpY2tsZS5jCSMgcGlja2xlIGFjY2VsZXJhdG9yCisjZGF0ZXRpbWUgZGF0ZXRpbWVtb2R1bGUuYwkjIGRhdGUvdGltZSB0eXBlCisjX2Jpc2VjdCBfYmlzZWN0bW9kdWxlLmMJIyBCaXNlY3Rpb24gYWxnb3JpdGhtcworCisjdW5pY29kZWRhdGEgdW5pY29kZWRhdGEuYyAgICAjIHN0YXRpYyBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZQorCisjIGFjY2VzcyB0byBJU08gQyBsb2NhbGUgc3VwcG9ydAorI19sb2NhbGUgX2xvY2FsZW1vZHVsZS5jICAjIC1saW50bAorCisjIFN0YW5kYXJkIEkvTyBiYXNlbGluZQorI19pbyAtSSQoc3JjZGlyKS9Nb2R1bGVzL19pbyBfaW8vYnVmZmVyZWRpby5jIF9pby9ieXRlc2lvLmMgX2lvL2ZpbGVpby5jIF9pby9pb2Jhc2UuYyBfaW8vX2lvbW9kdWxlLmMgX2lvL3N0cmluZ2lvLmMgX2lvL3RleHRpby5jCisKKworIyBNb2R1bGVzIHdpdGggc29tZSBVTklYIGRlcGVuZGVuY2llcyAtLSBvbiBieSBkZWZhdWx0OgorIyAoSWYgeW91IGhhdmUgYSByZWFsbHkgYmFja3dhcmQgVU5JWCwgc2VsZWN0IGFuZCBzb2NrZXQgbWF5IG5vdCBiZQorIyBzdXBwb3J0ZWQuLi4pCisKKyNmY250bCBmY250bG1vZHVsZS5jCSMgZmNudGwoMikgYW5kIGlvY3RsKDIpCisjc3B3ZCBzcHdkbW9kdWxlLmMJCSMgc3B3ZCgzKSAKKyNncnAgZ3JwbW9kdWxlLmMJCSMgZ3JwKDMpCisjc2VsZWN0IHNlbGVjdG1vZHVsZS5jCSMgc2VsZWN0KDIpOyBub3Qgb24gYW5jaWVudCBTeXN0ZW0gVgorCisjIE1lbW9yeS1tYXBwZWQgZmlsZXMgKGFsc28gd29ya3Mgb24gV2luMzIpLgorI21tYXAgbW1hcG1vZHVsZS5jCisKKyMgQ1NWIGZpbGUgaGVscGVyCisjX2NzdiBfY3N2LmMKKworIyBTb2NrZXQgbW9kdWxlIGhlbHBlciBmb3Igc29ja2V0KDIpCisjX3NvY2tldCBzb2NrZXRtb2R1bGUuYyB0aW1lbW9kdWxlLmMKKworIyBTb2NrZXQgbW9kdWxlIGhlbHBlciBmb3IgU1NMIHN1cHBvcnQ7IHlvdSBtdXN0IGNvbW1lbnQgb3V0IHRoZSBvdGhlcgorIyBzb2NrZXQgbGluZSBhYm92ZSwgYW5kIHBvc3NpYmx5IGVkaXQgdGhlIFNTTCB2YXJpYWJsZToKKyNTU0w9L3Vzci9sb2NhbC9zc2wKKyNfc3NsIF9zc2wuYyBcCisjCS1EVVNFX1NTTCAtSSQoU1NMKS9pbmNsdWRlIC1JJChTU0wpL2luY2x1ZGUvb3BlbnNzbCBcCisjCS1MJChTU0wpL2xpYiAtbHNzbCAtbGNyeXB0bworCisjIFRoZSBjcnlwdCBtb2R1bGUgaXMgbm93IGRpc2FibGVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBpdCBicmVha3MgYnVpbGRzCisjIG9uIG1hbnkgc3lzdGVtcyAod2hlcmUgLWxjcnlwdCBpcyBuZWVkZWQpLCBlLmcuIExpbnV4IChJIGJlbGlldmUpLgorIworIyBGaXJzdCwgbG9vayBhdCBTZXR1cC5jb25maWc7IGNvbmZpZ3VyZSBtYXkgaGF2ZSBzZXQgdGhpcyBmb3IgeW91LgorCisjY3J5cHQgY3J5cHRtb2R1bGUuYyAjIC1sY3J5cHQJIyBjcnlwdCgzKTsgbmVlZHMgLWxjcnlwdCBvbiBzb21lIHN5c3RlbXMKKworCisjIFNvbWUgbW9yZSBVTklYIGRlcGVuZGVudCBtb2R1bGVzIC0tIG9mZiBieSBkZWZhdWx0LCBzaW5jZSB0aGVzZQorIyBhcmUgbm90IHN1cHBvcnRlZCBieSBhbGwgVU5JWCBzeXN0ZW1zOgorCisjbmlzIG5pc21vZHVsZS5jIC1sbnNsCSMgU3VuIHllbGxvdyBwYWdlcyAtLSBub3QgZXZlcnl3aGVyZQorI3Rlcm1pb3MgdGVybWlvcy5jCSMgU3RlZW4gTHVtaG9sdCdzIHRlcm1pb3MgbW9kdWxlCisjcmVzb3VyY2UgcmVzb3VyY2UuYwkjIEplcmVteSBIeWx0b24ncyBybGltaXQgaW50ZXJmYWNlCisKKworIyBNdWx0aW1lZGlhIG1vZHVsZXMgLS0gb2ZmIGJ5IGRlZmF1bHQuCisjIFRoZXNlIGRvbid0IHdvcmsgZm9yIDY0LWJpdCBwbGF0Zm9ybXMhISEKKyMgIzk5MzE3MyBzYXlzIGF1ZGlvb3Agd29ya3Mgb24gNjQtYml0IHBsYXRmb3JtcywgdGhvdWdoLgorIyBUaGVzZSByZXByZXNlbnQgYXVkaW8gc2FtcGxlcyBvciBpbWFnZXMgYXMgc3RyaW5nczoKKworI2F1ZGlvb3AgYXVkaW9vcC5jCSMgT3BlcmF0aW9ucyBvbiBhdWRpbyBzYW1wbGVzCisjaW1hZ2VvcCBpbWFnZW9wLmMJIyBPcGVyYXRpb25zIG9uIGltYWdlcworCisKKyMgTm90ZSB0aGF0IHRoZSBfbWQ1IGFuZCBfc2hhIG1vZHVsZXMgYXJlIG5vcm1hbGx5IG9ubHkgYnVpbHQgaWYgdGhlCisjIHN5c3RlbSBkb2VzIG5vdCBoYXZlIHRoZSBPcGVuU1NMIGxpYnMgY29udGFpbmluZyBhbiBvcHRpbWl6ZWQgdmVyc2lvbi4KKworIyBUaGUgX21kNSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1CisjIE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSwgZGVzY3JpYmVkIGluIFJGQyAxMzIxLiAgVGhlIG5lY2Vzc2FyeSBmaWxlcworIyBtZDUuYyBhbmQgbWQ1LmggYXJlIGluY2x1ZGVkIGhlcmUuCisKKyNfbWQ1IG1kNW1vZHVsZS5jIG1kNS5jCisKKworIyBUaGUgX3NoYSBtb2R1bGUgaW1wbGVtZW50cyB0aGUgU0hBIGNoZWNrc3VtIGFsZ29yaXRobXMuCisjIChOSVNUJ3MgU2VjdXJlIEhhc2ggQWxnb3JpdGhtcy4pCisjX3NoYSBzaGFtb2R1bGUuYworI19zaGEyNTYgc2hhMjU2bW9kdWxlLmMKKyNfc2hhNTEyIHNoYTUxMm1vZHVsZS5jCisKKworIyBTR0kgSVJJWCBzcGVjaWZpYyBtb2R1bGVzIC0tIG9mZiBieSBkZWZhdWx0LgorCisjIFRoZXNlIG1vZHVsZSB3b3JrIG9uIGFueSBTR0kgbWFjaGluZToKKworIyAqKiogZ2wgbXVzdCBiZSBlbmFibGVkIGhpZ2hlciB1cCBpbiB0aGlzIGZpbGUgKioqCisjZm0gZm1tb2R1bGUuYyAkKEdMSEFDSykgLWxmbSAtbGdsCQkjIEZvbnQgTWFuYWdlcgorI3NnaSBzZ2ltb2R1bGUuYwkJCSMgc2dpLm5hcCgpIGFuZCBhIGZldyBtb3JlCisKKyMgVGhpcyBtb2R1bGUgcmVxdWlyZXMgdGhlIGhlYWRlciBmaWxlCisjIC91c3IvcGVvcGxlLzREZ2lmdHMvaXJpc3Rvb2xzL2luY2x1ZGUvaXpvb20uaDoKKyNpbWdmaWxlIGltZ2ZpbGUuYyAtbGltYWdlIC1sZ3V0aWwgLWxnbCAtbG0JIyBJbWFnZSBQcm9jZXNzaW5nIFV0aWxpdGllcworCisKKyMgVGhlc2UgbW9kdWxlcyByZXF1aXJlIHRoZSBNdWx0aW1lZGlhIERldmVsb3BtZW50IE9wdGlvbiAoSSB0aGluayk6CisKKyNhbCBhbG1vZHVsZS5jIC1sYXVkaW8JCQkjIEF1ZGlvIExpYnJhcnkKKyNjZCBjZG1vZHVsZS5jIC1sY2RhdWRpbyAtbGRzIC1sbWVkaWFkCSMgQ0QgQXVkaW8gTGlicmFyeQorI2NsIGNsbW9kdWxlLmMgLWxjbCAtbGF3YXJlYXVkaW8JIyBDb21wcmVzc2lvbiBMaWJyYXJ5Cisjc3Ygc3Ztb2R1bGUuYyB5dXZjb252ZXJ0LmMgLWxzdmlkZW8gLWxYZXh0IC1sWDExCSMgU3RhcnRlciBWaWRlbworCisKKyMgVGhlIEZPUk1TIGxpYnJhcnksIGJ5IE1hcmsgT3Zlcm1hcnMsIGltcGxlbWVudHMgdXNlciBpbnRlcmZhY2UKKyMgY29tcG9uZW50cyBzdWNoIGFzIGRpYWxvZ3MgYW5kIGJ1dHRvbnMgdXNpbmcgU0dJJ3MgR0wgYW5kIEZNCisjIGxpYnJhcmllcy4gIFlvdSBtdXN0IGZ0cCB0aGUgRk9STVMgbGlicmFyeSBzZXBhcmF0ZWx5IGZyb20KKyMgZnRwOi8vZnRwLmNzLnJ1dS5ubC9wdWIvU0dJL0ZPUk1TLiAgSXQgd2FzIHRlc3RlZCB3aXRoIEZPUk1TIDIuMmEuCisjIE5PVEU6IGlmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdXNlIEZPUk1TIGFuZCBjdXJzZXMgc2ltdWx0YW5lb3VzbHkKKyMgKG9yIGJvdGggbGluayB0aGVtIHN0YXRpY2FsbHkgaW50byB0aGUgc2FtZSBiaW5hcnkpLCB5b3UgbXVzdAorIyBjb21waWxlIGFsbCBvZiBGT1JNUyB3aXRoIHRoZSBjYyBvcHRpb24gIi1EY2xlYXI9X19HTGNsZWFyIi4KKworIyBUaGUgRk9STVMgdmFyaWFibGUgbXVzdCBwb2ludCB0byB0aGUgRk9STVMgc3ViZGlyZWN0b3J5IG9mIHRoZSBmb3JtcworIyB0b3BsZXZlbCBkaXJlY3Rvcnk6CisKKyNGT1JNUz0vdWZzL2d1aWRvL3NyYy9mb3Jtcy9GT1JNUworI2ZsIGZsbW9kdWxlLmMgLUkkKEZPUk1TKSAkKEdMSEFDSykgJChGT1JNUykvbGliZm9ybXMuYSAtbGZtIC1sZ2wKKworCisjIFN1bk9TIHNwZWNpZmljIG1vZHVsZXMgLS0gb2ZmIGJ5IGRlZmF1bHQ6CisKKyNzdW5hdWRpb2RldiBzdW5hdWRpb2Rldi5jCisKKworIyBBIExpbnV4IHNwZWNpZmljIG1vZHVsZSAtLSBvZmYgYnkgZGVmYXVsdDsgdGhpcyBtYXkgYWxzbyB3b3JrIG9uIAorIyBzb21lICpCU0RzLgorCisjbGludXhhdWRpb2RldiBsaW51eGF1ZGlvZGV2LmMKKworCisjIEdlb3JnZSBOZXZpbGxlLU5laWwncyB0aW1pbmcgbW9kdWxlOgorCisjdGltaW5nIHRpbWluZ21vZHVsZS5jCisKKworIyBUaGUgX3RraW50ZXIgbW9kdWxlLgorIworIyBUaGUgY29tbWFuZCBmb3IgX3RraW50ZXIgaXMgbG9uZyBhbmQgc2l0ZSBzcGVjaWZpYy4gIFBsZWFzZQorIyB1bmNvbW1lbnQgYW5kL29yIGVkaXQgdGhvc2UgcGFydHMgYXMgaW5kaWNhdGVkLiAgSWYgeW91IGRvbid0IGhhdmUgYQorIyBzcGVjaWZpYyBleHRlbnNpb24gKGUuZy4gVGl4IG9yIEJMVCksIGxlYXZlIHRoZSBjb3JyZXNwb25kaW5nIGxpbmUKKyMgY29tbWVudGVkIG91dC4gIChMZWF2ZSB0aGUgdHJhaWxpbmcgYmFja3NsYXNoZXMgaW4hICBJZiB5b3UKKyMgZXhwZXJpZW5jZSBzdHJhbmdlIGVycm9ycywgeW91IG1heSB3YW50IHRvIGpvaW4gYWxsIHVuY29tbWVudGVkCisjIGxpbmVzIGFuZCByZW1vdmUgdGhlIGJhY2tzbGFzaGVzIC0tIHRoZSBiYWNrc2xhc2ggaW50ZXJwcmV0YXRpb24gaXMKKyMgZG9uZSBieSB0aGUgc2hlbGwncyAicmVhZCIgY29tbWFuZCBhbmQgaXQgbWF5IG5vdCBiZSBpbXBsZW1lbnRlZCBvbgorIyBldmVyeSBzeXN0ZW0uCisKKyMgKioqIEFsd2F5cyB1bmNvbW1lbnQgdGhpcyAobGVhdmUgdGhlIGxlYWRpbmcgdW5kZXJzY29yZSBpbiEpOgorIyBfdGtpbnRlciBfdGtpbnRlci5jIHRrYXBwaW5pdC5jIC1EV0lUSF9BUFBJTklUIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCB0byByZWZsZWN0IHdoZXJlIHlvdXIgVGNsL1RrIGxpYnJhcmllcyBhcmU6CisjCS1ML3Vzci9sb2NhbC9saWIgXAorIyAqKiogVW5jb21tZW50IGFuZCBlZGl0IHRvIHJlZmxlY3Qgd2hlcmUgeW91ciBUY2wvVGsgaGVhZGVycyBhcmU6CisjCS1JL3Vzci9sb2NhbC9pbmNsdWRlIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCB0byByZWZsZWN0IHdoZXJlIHlvdXIgWDExIGhlYWRlciBmaWxlcyBhcmU6CisjCS1JL3Vzci9YMTFSNi9pbmNsdWRlIFwKKyMgKioqIE9yIHVuY29tbWVudCB0aGlzIGZvciBTb2xhcmlzOgorIwktSS91c3Ivb3Blbndpbi9pbmNsdWRlIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCBmb3IgVGl4IGV4dGVuc2lvbiBvbmx5OgorIwktRFdJVEhfVElYIC1sdGl4OC4xLjguMiBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgZm9yIEJMVCBleHRlbnNpb24gb25seToKKyMJLURXSVRIX0JMVCAtSS91c3IvbG9jYWwvYmx0L2JsdDguMC11bm9mZi9pbmNsdWRlIC1sQkxUOC4wIFwKKyMgKioqIFVuY29tbWVudCBhbmQgZWRpdCBmb3IgUElMIChUa0ltYWdpbmcpIGV4dGVuc2lvbiBvbmx5OgorIyAgICAgKFNlZSBodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tL3Byb2R1Y3RzL3BpbC8gZm9yIG1vcmUgaW5mbykKKyMJLURXSVRIX1BJTCAtSS4uL0V4dGVuc2lvbnMvSW1hZ2luZy9saWJJbWFnaW5nICB0a0ltYWdpbmcuYyBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgZm9yIFRPR0wgZXh0ZW5zaW9uIG9ubHk6CisjCS1EV0lUSF9UT0dMIHRvZ2wuYyBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgdG8gcmVmbGVjdCB5b3VyIFRjbC9UayB2ZXJzaW9uczoKKyMJLWx0azguMiAtbHRjbDguMiBcCisjICoqKiBVbmNvbW1lbnQgYW5kIGVkaXQgdG8gcmVmbGVjdCB3aGVyZSB5b3VyIFgxMSBsaWJyYXJpZXMgYXJlOgorIwktTC91c3IvWDExUjYvbGliIFwKKyMgKioqIE9yIHVuY29tbWVudCB0aGlzIGZvciBTb2xhcmlzOgorIwktTC91c3Ivb3Blbndpbi9saWIgXAorIyAqKiogVW5jb21tZW50IHRoZXNlIGZvciBUT0dMIGV4dGVuc2lvbiBvbmx5OgorIwktbEdMIC1sR0xVIC1sWGV4dCAtbFhtdSBcCisjICoqKiBVbmNvbW1lbnQgZm9yIEFJWDoKKyMJLWxsZCBcCisjICoqKiBBbHdheXMgdW5jb21tZW50IHRoaXM7IFgxMSBsaWJyYXJpZXMgdG8gbGluayB3aXRoOgorIwktbFgxMQorCisjIExhbmNlIEVsbGluZ2hhdXMncyBzeXNsb2cgbW9kdWxlCisjc3lzbG9nIHN5c2xvZ21vZHVsZS5jCQkjIHN5c2xvZyBkYWVtb24gaW50ZXJmYWNlCisKKworIyBDdXJzZXMgc3VwcG9ydCwgcmVxdXJpbmcgdGhlIFN5c3RlbSBWIHZlcnNpb24gb2YgY3Vyc2VzLCBvZnRlbgorIyBwcm92aWRlZCBieSB0aGUgbmN1cnNlcyBsaWJyYXJ5LiAgZS5nLiBvbiBMaW51eCwgbGluayB3aXRoIC1sbmN1cnNlcworIyBpbnN0ZWFkIG9mIC1sY3Vyc2VzKS4KKyMKKyMgRmlyc3QsIGxvb2sgYXQgU2V0dXAuY29uZmlnOyBjb25maWd1cmUgbWF5IGhhdmUgc2V0IHRoaXMgZm9yIHlvdS4KKworI19jdXJzZXMgX2N1cnNlc21vZHVsZS5jIC1sY3Vyc2VzIC1sdGVybWNhcAorIyBXcmFwcGVyIGZvciB0aGUgcGFuZWwgbGlicmFyeSB0aGF0J3MgcGFydCBvZiBuY3Vyc2VzIGFuZCBTWVNWIGN1cnNlcy4KKyNfY3Vyc2VzX3BhbmVsIF9jdXJzZXNfcGFuZWwuYyAtbHBhbmVsIC1sbmN1cnNlcyAKKworCisjIEdlbmVyaWMgKFN1bk9TIC8gU1ZSNCkgZHluYW1pYyBsb2FkaW5nIG1vZHVsZS4KKyMgVGhpcyBpcyBub3QgbmVlZGVkIGZvciBkeW5hbWljIGxvYWRpbmcgb2YgUHl0aG9uIG1vZHVsZXMgLS0KKyMgaXQgaXMgYSBoaWdobHkgZXhwZXJpbWVudGFsIGFuZCBkYW5nZXJvdXMgZGV2aWNlIGZvciBjYWxsaW5nCisjICphcmJpdHJhcnkqIEMgZnVuY3Rpb25zIGluICphcmJpdHJhcnkqIHNoYXJlZCBsaWJyYXJpZXM6CisKKyNkbCBkbG1vZHVsZS5jCisKKworIyBNb2R1bGVzIHRoYXQgcHJvdmlkZSBwZXJzaXN0ZW50IGRpY3Rpb25hcnktbGlrZSBzZW1hbnRpY3MuICBZb3Ugd2lsbAorIyBwcm9iYWJseSB3YW50IHRvIGFycmFuZ2UgZm9yIGF0IGxlYXN0IG9uZSBvZiB0aGVtIHRvIGJlIGF2YWlsYWJsZSBvbgorIyB5b3VyIG1hY2hpbmUsIHRob3VnaCBub25lIGFyZSBkZWZpbmVkIGJ5IGRlZmF1bHQgYmVjYXVzZSBvZiBsaWJyYXJ5CisjIGRlcGVuZGVuY2llcy4gIFRoZSBQeXRob24gbW9kdWxlIGFueWRibS5weSBwcm92aWRlcyBhbgorIyBpbXBsZW1lbnRhdGlvbiBpbmRlcGVuZGVudCB3cmFwcGVyIGZvciB0aGVzZTsgZHVtYmRibS5weSBwcm92aWRlcworIyBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkgKGJ1dCBzbG93ZXIgb2YgY291cnNlKSBpbXBsZW1lbnRlZCBpbiBQeXRob24uCisKKyMgVGhlIHN0YW5kYXJkIFVuaXggZGJtIG1vZHVsZSBoYXMgYmVlbiBtb3ZlZCB0byBTZXR1cC5jb25maWcgc28gdGhhdAorIyBpdCB3aWxsIGJlIGNvbXBpbGVkIGFzIGEgc2hhcmVkIGxpYnJhcnkgYnkgZGVmYXVsdC4gIENvbXBpbGluZyBpdCBhcworIyBhIGJ1aWx0LWluIG1vZHVsZSBjYXVzZXMgY29uZmxpY3RzIHdpdGggdGhlIHB5YnNkZGIzIG1vZHVsZSBzaW5jZSBpdAorIyBjcmVhdGVzIGEgc3RhdGljIGRlcGVuZGVuY3kgb24gYW4gb3V0LW9mLWRhdGUgdmVyc2lvbiBvZiBkYi5zby4KKyMKKyMgRmlyc3QsIGxvb2sgYXQgU2V0dXAuY29uZmlnOyBjb25maWd1cmUgbWF5IGhhdmUgc2V0IHRoaXMgZm9yIHlvdS4KKworI2RibSBkYm1tb2R1bGUuYyAJIyBkYm0oMykgbWF5IHJlcXVpcmUgLWxuZGJtIG9yIHNpbWlsYXIKKworIyBBbnRob255IEJheHRlcidzIGdkYm0gbW9kdWxlLiAgR05VIGRibSgzKSB3aWxsIHJlcXVpcmUgLWxnZGJtOgorIworIyBGaXJzdCwgbG9vayBhdCBTZXR1cC5jb25maWc7IGNvbmZpZ3VyZSBtYXkgaGF2ZSBzZXQgdGhpcyBmb3IgeW91LgorCisjZ2RibSBnZGJtbW9kdWxlLmMgLUkvdXNyL2xvY2FsL2luY2x1ZGUgLUwvdXNyL2xvY2FsL2xpYiAtbGdkYm0KKworCisjIFNsZWVweWNhdCBCZXJrZWxleSBEQiBpbnRlcmZhY2UuCisjCisjIFRoaXMgcmVxdWlyZXMgdGhlIFNsZWVweWNhdCBEQiBjb2RlLCBzZWUgaHR0cDovL3d3dy5zbGVlcHljYXQuY29tLworIyBUaGUgZWFybGllc3Qgc3VwcG9ydGVkIHZlcnNpb24gb2YgdGhhdCBsaWJyYXJ5IGlzIDMuMCwgdGhlIGxhdGVzdAorIyBzdXBwb3J0ZWQgdmVyc2lvbiBpcyA0LjAgKDQuMSBpcyBzcGVjaWZpY2FsbHkgbm90IHN1cHBvcnRlZCwgYXMgdGhhdAorIyBjaGFuZ2VzIHRoZSBzZW1hbnRpY3Mgb2YgdHJhbnNhY3Rpb25hbCBkYXRhYmFzZXMpLiBBIGxpc3Qgb2YgYXZhaWxhYmxlCisjIHJlbGVhc2VzIGNhbiBiZSBmb3VuZCBhdAorIworIyBodHRwOi8vd3d3LnNsZWVweWNhdC5jb20vdXBkYXRlL2luZGV4Lmh0bWwKKyMKKyMgRWRpdCB0aGUgdmFyaWFibGVzIERCIGFuZCBEQkxJQlZFUnRvIHBvaW50IHRvIHRoZSBkYiB0b3AgZGlyZWN0b3J5CisjIGFuZCB0aGUgc3ViZGlyZWN0b3J5IG9mIFBPUlQgd2hlcmUgeW91IGJ1aWx0IGl0LgorI0RCPS91c3IvbG9jYWwvQmVya2VsZXlEQi40LjAKKyNEQkxJQlZFUj00LjAKKyNEQklOQz0kKERCKS9pbmNsdWRlCisjREJMSUI9JChEQikvbGliCisjX2JzZGRiIF9ic2RkYi5jIC1JJChEQklOQykgLUwkKERCTElCKSAtbGRiLSQoREJMSUJWRVIpCisKKyMgSGlzdG9yaWNhbCBCZXJrZWxleSBEQiAxLjg1CisjCisjIFRoaXMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHRoZSAxLjg1IHZlcnNpb24gb2YgdGhlIEJlcmtlbGV5IERCIGxpYnJhcnkgaGFzCisjIGJ1Z3MgdGhhdCBjYW4gY2F1c2UgZGF0YSBjb3JydXB0aW9uLiBJZiB5b3UgY2FuLCB1c2UgbGF0ZXIgdmVyc2lvbnMgb2YgdGhlCisjIGxpYnJhcnkgaW5zdGVhZCwgYXZhaWxhYmxlIGZyb20gPGh0dHA6Ly93d3cuc2xlZXB5Y2F0LmNvbS8+LgorCisjREI9L2RlcG90L3N1bmRyeS9zcmMvYmVya2VsZXktZGIvZGIuMS44NQorI0RCUE9SVD0kKERCKS9QT1JUL2lyaXguNS4zCisjYnNkZGIxODUgYnNkZGJtb2R1bGUuYyAtSSQoREJQT1JUKS9pbmNsdWRlIC1JJChEQlBPUlQpICQoREJQT1JUKS9saWJkYi5hCisKKworCisjIEhlbHBlciBtb2R1bGUgZm9yIHZhcmlvdXMgYXNjaWktZW5jb2RlcnMKKyNiaW5hc2NpaSBiaW5hc2NpaS5jCisKKyMgRnJlZCBEcmFrZSdzIGludGVyZmFjZSB0byB0aGUgUHl0aG9uIHBhcnNlcgorI3BhcnNlciBwYXJzZXJtb2R1bGUuYworCisjIGNTdHJpbmdJTyBhbmQgY1BpY2tsZQorI2NTdHJpbmdJTyBjU3RyaW5nSU8uYworI2NQaWNrbGUgY1BpY2tsZS5jCisKKworIyBMZWUgQnVzYnkncyBTSUdGUEUgbW9kdWxlcy4KKyMgVGhlIGxpYnJhcnkgdG8gbGluayBmcGVjdGwgd2l0aCBpcyBwbGF0Zm9ybSBzcGVjaWZpYy4KKyMgQ2hvb3NlICpvbmUqIG9mIHRoZSBvcHRpb25zIGJlbG93IGZvciBmcGVjdGw6CisKKyMgRm9yIFNHSSBJUklYICh0ZXN0ZWQgb24gNS4zKToKKyNmcGVjdGwgZnBlY3RsbW9kdWxlLmMgLWxmcGUKKworIyBGb3IgU29sYXJpcyB3aXRoIFN1blBybyBjb21waWxlciAodGVzdGVkIG9uIFNvbGFyaXMgMi41IHdpdGggU3VuUHJvIEMgNC4yKToKKyMgKFdpdGhvdXQgdGhlIGNvbXBpbGVyIHlvdSBkb24ndCBoYXZlIC1sc3VubWF0aC4pCisjZnBlY3RsIGZwZWN0bG1vZHVsZS5jIC1SL29wdC9TVU5Xc3Byby9saWIgLWxzdW5tYXRoIC1sbQorCisjIEZvciBvdGhlciBzeXN0ZW1zOiBzZWUgaW5zdHJ1Y3Rpb25zIGluIGZwZWN0bG1vZHVsZS5jLgorI2ZwZWN0bCBmcGVjdGxtb2R1bGUuYyAuLi4KKworIyBUZXN0IG1vZHVsZSBmb3IgZnBlY3RsLiAgTm8gZXh0cmEgbGlicmFyaWVzIG5lZWRlZC4KKyNmcGV0ZXN0IGZwZXRlc3Rtb2R1bGUuYworCisjIEFuZHJldyBLdWNobGluZydzIHpsaWIgbW9kdWxlLgorIyBUaGlzIHJlcXVpcmUgemxpYiAxLjEuMyAob3IgbGF0ZXIpLgorIyBTZWUgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLworI3psaWIgemxpYm1vZHVsZS5jIC1JJChwcmVmaXgpL2luY2x1ZGUgLUwkKGV4ZWNfcHJlZml4KS9saWIgLWx6CisKKyMgSW50ZXJmYWNlIHRvIHRoZSBFeHBhdCBYTUwgcGFyc2VyCisjCisjIEV4cGF0IHdhcyB3cml0dGVuIGJ5IEphbWVzIENsYXJrIGFuZCBpcyBub3cgbWFpbnRhaW5lZCBieSBhIGdyb3VwIG9mCisjIGRldmVsb3BlcnMgb24gU291cmNlRm9yZ2U7IHNlZSB3d3cubGliZXhwYXQub3JnIGZvciBtb3JlCisjIGluZm9ybWF0aW9uLiAgVGhlIHB5ZXhwYXQgbW9kdWxlIHdhcyB3cml0dGVuIGJ5IFBhdWwgUHJlc2NvZCBhZnRlciBhCisjIHByb3RvdHlwZSBieSBKYWNrIEphbnNlbi4gIFNvdXJjZSBvZiBFeHBhdCAxLjk1LjIgaXMgaW5jbHVkZWQgaW4KKyMgTW9kdWxlcy9leHBhdC8uICBVc2FnZSBvZiBhIHN5c3RlbSBzaGFyZWQgbGliZXhwYXQuc28vZXhwYXQuZGxsIGlzCisjIG5vdCBhZHZpc2VkLgorIworIyBNb3JlIGluZm9ybWF0aW9uIG9uIEV4cGF0IGNhbiBiZSBmb3VuZCBhdCB3d3cubGliZXhwYXQub3JnLgorIworI3B5ZXhwYXQgZXhwYXQveG1scGFyc2UuYyBleHBhdC94bWxyb2xlLmMgZXhwYXQveG1sdG9rLmMgcHlleHBhdC5jIC1JJChzcmNkaXIpL01vZHVsZXMvZXhwYXQgLURIQVZFX0VYUEFUX0NPTkZJR19IIC1EVVNFX1BZRVhQQVRfQ0FQSQorCisKKyMgSHllLVNoaWsgQ2hhbmcncyBDSktDb2RlY3MKKworIyBtdWx0aWJ5dGVjb2RlYyBpcyByZXF1aXJlZCBmb3IgYWxsIHRoZSBvdGhlciBDSksgY29kZWMgbW9kdWxlcworI19tdWx0aWJ5dGVjb2RlYyBjamtjb2RlY3MvbXVsdGlieXRlY29kZWMuYworCisjX2NvZGVjc19jbiBjamtjb2RlY3MvX2NvZGVjc19jbi5jCisjX2NvZGVjc19oayBjamtjb2RlY3MvX2NvZGVjc19oay5jCisjX2NvZGVjc19pc28yMDIyIGNqa2NvZGVjcy9fY29kZWNzX2lzbzIwMjIuYworI19jb2RlY3NfanAgY2prY29kZWNzL19jb2RlY3NfanAuYworI19jb2RlY3Nfa3IgY2prY29kZWNzL19jb2RlY3Nfa3IuYworI19jb2RlY3NfdHcgY2prY29kZWNzL19jb2RlY3NfdHcuYworCisjIEV4YW1wbGUgLS0gaW5jbHVkZWQgZm9yIHJlZmVyZW5jZSBvbmx5OgorIyB4eCB4eG1vZHVsZS5jCisKKyMgQW5vdGhlciBleGFtcGxlIC0tIHRoZSAneHhzdWJ0eXBlJyBtb2R1bGUgc2hvd3MgQy1sZXZlbCBzdWJ0eXBpbmcgaW4gYWN0aW9uCit4eHN1YnR5cGUgeHhzdWJ0eXBlLmMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmNvbmZpZyBiL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDI3OGJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb25maWcvU2V0dXAuY29uZmlnCkBAIC0wLDAgKzEsMjYgQEAKKyMgVGhpcyBmaWxlIGlzIHRyYW5zbW9ncmlmaWVkIGludG8gU2V0dXAuY29uZmlnIGJ5IGNvbmZpZy5zdGF0dXMuCisKKyMgVGhlIHB1cnBvc2Ugb2YgdGhpcyBmaWxlIGlzIHRvIGNvbmRpdGlvbmFsbHkgZW5hYmxlIGNlcnRhaW4gbW9kdWxlcworIyBiYXNlZCBvbiBjb25maWd1cmUtdGltZSBvcHRpb25zLgorCisjIGluaXQgc3lzdGVtIGNhbGxzKHBvc2l4L250Ly4uLikgZm9yIElOSVRGVU5DICh1c2VkIGJ5IG1ha2VzZXR1cCkKK3Bvc2l4IHBvc2l4bW9kdWxlLmMKKworIyBUaHJlYWRpbmcKK3RocmVhZCB0aHJlYWRtb2R1bGUuYworCisjIFRoZSBzaWduYWwgbW9kdWxlCitzaWduYWwgc2lnbmFsbW9kdWxlLmMKKworIyBPbiB3aW4zMiBob3N0KG1pbmd3IGJ1aWxkIGluIE1TWVMgZW52aXJvbm1lbnQpIHNob3cgdGhhdCBzaXRlLnB5CisjIGZhaWwgdG8gbG9hZCBpZiBzb21lIG1vZHVsZXMgYXJlIG5vdCBidWlsZC1pbjoKKyNfZnVuY3Rvb2xzIF9mdW5jdG9vbHNtb2R1bGUuYwkjIFRvb2xzIGZvciB3b3JraW5nIHdpdGggZnVuY3Rpb25zIGFuZCBjYWxsYWJsZSBvYmplY3RzCisjb3BlcmF0b3Igb3BlcmF0b3IuYwkjIG9wZXJhdG9yLmFkZCgpIGFuZCBzaW1pbGFyIGdvb2RpZXMKKyNfbG9jYWxlIF9sb2NhbGVtb2R1bGUuYwkjIC1saW50bAorI193aW5yZWcgLi4vUEMvX3dpbnJlZy5jCisjdGltZSB0aW1lbW9kdWxlLmMKKyNtc3ZjcnQgLi4vUEMvbXN2Y3J0bW9kdWxlLmMKKworCisjIFRoZSByZXN0IG9mIHRoZSBtb2R1bGVzIHByZXZpb3VzbHkgbGlzdGVkIGluIHRoaXMgZmlsZSBhcmUgYnVpbHQKKyMgYnkgdGhlIHNldHVwLnB5IHNjcmlwdCBpbiBQeXRob24gMi4xIGFuZCBsYXRlci4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmxvY2FsIGIvbGliL3B5dGhvbjIuNy9jb25maWcvU2V0dXAubG9jYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyOTgzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29uZmlnL1NldHVwLmxvY2FsCkBAIC0wLDAgKzEgQEAKKyMgRWRpdCB0aGlzIGZpbGUgZm9yIGxvY2FsIHNldHVwIGNoYW5nZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL2NvbmZpZy5jIGIvbGliL3B5dGhvbjIuNy9jb25maWcvY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBkYjI1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29uZmlnL2NvbmZpZy5jCkBAIC0wLDAgKzEsODggQEAKKy8qIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gL3MvbmRrLXRvb2xjaGFpbi9zcmMvcHl0aG9uL1B5dGhvbi0yLjcuNS9Nb2R1bGVzL2NvbmZpZy5jLmluIGJ5IG1ha2VzZXR1cC4gKi8KKy8qIC0qLSBDIC0qLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQ29weXJpZ2h0IChjKSAyMDAwLCBCZU9wZW4uY29tLgorQ29weXJpZ2h0IChjKSAxOTk1LTIwMDAsIENvcnBvcmF0aW9uIGZvciBOYXRpb25hbCBSZXNlYXJjaCBJbml0aWF0aXZlcy4KK0NvcHlyaWdodCAoYykgMTk5MC0xOTk1LCBTdGljaHRpbmcgTWF0aGVtYXRpc2NoIENlbnRydW0uCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitTZWUgdGhlIGZpbGUgIk1pc2MvQ09QWVJJR0hUIiBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kCityZWRpc3RyaWJ1dGlvbiBvZiB0aGlzIGZpbGUsIGFuZCBmb3IgYSBESVNDTEFJTUVSIE9GIEFMTCBXQVJSQU5USUVTLgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBNb2R1bGUgY29uZmlndXJhdGlvbiAqLworCisvKiAhISEgISEhICEhISBUaGlzIGZpbGUgaXMgZWRpdGVkIGJ5IHRoZSBtYWtlc2V0dXAgc2NyaXB0ICEhISAhISEgISEhICovCisKKy8qIFRoaXMgZmlsZSBjb250YWlucyB0aGUgdGFibGUgb2YgYnVpbHQtaW4gbW9kdWxlcy4KKyAgIFNlZSBpbml0X2J1aWx0aW4oKSBpbiBpbXBvcnQuYy4gKi8KKworI2luY2x1ZGUgIlB5dGhvbi5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworZXh0ZXJuIHZvaWQgaW5pdHBvc2l4KHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdHRocmVhZCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRzaWduYWwodm9pZCk7CitleHRlcm4gdm9pZCBpbml0ZXJybm8odm9pZCk7CitleHRlcm4gdm9pZCBpbml0X3NyZSh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfY29kZWNzKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF93ZWFrcmVmKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdHppcGltcG9ydCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfc3ltdGFibGUodm9pZCk7CitleHRlcm4gdm9pZCBpbml0eHhzdWJ0eXBlKHZvaWQpOworCisvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDEgLS0gKi8KKworZXh0ZXJuIHZvaWQgUHlNYXJzaGFsX0luaXQodm9pZCk7CitleHRlcm4gdm9pZCBpbml0aW1wKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdGdjKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF9hc3Qodm9pZCk7CitleHRlcm4gdm9pZCBfUHlXYXJuaW5nc19Jbml0KHZvaWQpOworCitzdHJ1Y3QgX2luaXR0YWIgX1B5SW1wb3J0X0luaXR0YWJbXSA9IHsKKworCXsicG9zaXgiLCBpbml0cG9zaXh9LAorCXsidGhyZWFkIiwgaW5pdHRocmVhZH0sCisJeyJzaWduYWwiLCBpbml0c2lnbmFsfSwKKwl7ImVycm5vIiwgaW5pdGVycm5vfSwKKwl7Il9zcmUiLCBpbml0X3NyZX0sCisJeyJfY29kZWNzIiwgaW5pdF9jb2RlY3N9LAorCXsiX3dlYWtyZWYiLCBpbml0X3dlYWtyZWZ9LAorCXsiemlwaW1wb3J0IiwgaW5pdHppcGltcG9ydH0sCisJeyJfc3ltdGFibGUiLCBpbml0X3N5bXRhYmxlfSwKKwl7Inh4c3VidHlwZSIsIGluaXR4eHN1YnR5cGV9LAorCisvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDIgLS0gKi8KKworICAgIC8qIFRoaXMgbW9kdWxlIGxpdmVzIGluIG1hcnNoYWwuYyAqLworICAgIHsibWFyc2hhbCIsIFB5TWFyc2hhbF9Jbml0fSwKKworICAgIC8qIFRoaXMgbGl2ZXMgaW4gaW1wb3J0LmMgKi8KKyAgICB7ImltcCIsIGluaXRpbXB9LAorCisgICAgLyogVGhpcyBsaXZlcyBpbiBQeXRob24vUHl0aG9uLWFzdC5jICovCisgICAgeyJfYXN0IiwgaW5pdF9hc3R9LAorCisgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCisgICAgeyJfX21haW5fXyIsIE5VTEx9LAorICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKKyAgICB7InN5cyIsIE5VTEx9LAorICAgIHsiZXhjZXB0aW9ucyIsIE5VTEx9LAorCisgICAgLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCisgICAgeyJnYyIsIGluaXRnY30sCisKKyAgICAvKiBUaGlzIGxpdmVzIGluIF93YXJuaW5ncy5jICovCisgICAgeyJfd2FybmluZ3MiLCBfUHlXYXJuaW5nc19Jbml0fSwKKworICAgIC8qIFNlbnRpbmVsICovCisgICAgezAsIDB9Cit9OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbmZpZy9jb25maWcuYy5pbiBiL2xpYi9weXRob24yLjcvY29uZmlnL2NvbmZpZy5jLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYTQyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9jb25maWcuYy5pbgpAQCAtMCwwICsxLDY1IEBACisvKiAtKi0gQyAtKi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0NvcHlyaWdodCAoYykgMjAwMCwgQmVPcGVuLmNvbS4KK0NvcHlyaWdodCAoYykgMTk5NS0yMDAwLCBDb3Jwb3JhdGlvbiBmb3IgTmF0aW9uYWwgUmVzZWFyY2ggSW5pdGlhdGl2ZXMuCitDb3B5cmlnaHQgKGMpIDE5OTAtMTk5NSwgU3RpY2h0aW5nIE1hdGhlbWF0aXNjaCBDZW50cnVtLgorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworU2VlIHRoZSBmaWxlICJNaXNjL0NPUFlSSUdIVCIgZm9yIGluZm9ybWF0aW9uIG9uIHVzYWdlIGFuZAorcmVkaXN0cmlidXRpb24gb2YgdGhpcyBmaWxlLCBhbmQgZm9yIGEgRElTQ0xBSU1FUiBPRiBBTEwgV0FSUkFOVElFUy4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTW9kdWxlIGNvbmZpZ3VyYXRpb24gKi8KKworLyogISEhICEhISAhISEgVGhpcyBmaWxlIGlzIGVkaXRlZCBieSB0aGUgbWFrZXNldHVwIHNjcmlwdCAhISEgISEhICEhISAqLworCisvKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHRhYmxlIG9mIGJ1aWx0LWluIG1vZHVsZXMuCisgICBTZWUgaW5pdF9idWlsdGluKCkgaW4gaW1wb3J0LmMuICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIC0tIEFERE1PRFVMRSBNQVJLRVIgMSAtLSAqLworCitleHRlcm4gdm9pZCBQeU1hcnNoYWxfSW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRpbXAodm9pZCk7CitleHRlcm4gdm9pZCBpbml0Z2Modm9pZCk7CitleHRlcm4gdm9pZCBpbml0X2FzdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9QeVdhcm5pbmdzX0luaXQodm9pZCk7CisKK3N0cnVjdCBfaW5pdHRhYiBfUHlJbXBvcnRfSW5pdHRhYltdID0geworCisvKiAtLSBBRERNT0RVTEUgTUFSS0VSIDIgLS0gKi8KKworICAgIC8qIFRoaXMgbW9kdWxlIGxpdmVzIGluIG1hcnNoYWwuYyAqLworICAgIHsibWFyc2hhbCIsIFB5TWFyc2hhbF9Jbml0fSwKKworICAgIC8qIFRoaXMgbGl2ZXMgaW4gaW1wb3J0LmMgKi8KKyAgICB7ImltcCIsIGluaXRpbXB9LAorCisgICAgLyogVGhpcyBsaXZlcyBpbiBQeXRob24vUHl0aG9uLWFzdC5jICovCisgICAgeyJfYXN0IiwgaW5pdF9hc3R9LAorCisgICAgLyogVGhlc2UgZW50cmllcyBhcmUgaGVyZSBmb3Igc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzICovCisgICAgeyJfX21haW5fXyIsIE5VTEx9LAorICAgIHsiX19idWlsdGluX18iLCBOVUxMfSwKKyAgICB7InN5cyIsIE5VTEx9LAorICAgIHsiZXhjZXB0aW9ucyIsIE5VTEx9LAorCisgICAgLyogVGhpcyBsaXZlcyBpbiBnY21vZHVsZS5jICovCisgICAgeyJnYyIsIGluaXRnY30sCisKKyAgICAvKiBUaGlzIGxpdmVzIGluIF93YXJuaW5ncy5jICovCisgICAgeyJfd2FybmluZ3MiLCBfUHlXYXJuaW5nc19Jbml0fSwKKworICAgIC8qIFNlbnRpbmVsICovCisgICAgezAsIDB9Cit9OworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbmZpZy9pbnN0YWxsLXNoIGIvbGliL3B5dGhvbjIuNy9jb25maWcvaW5zdGFsbC1zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZWMyN2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb25maWcvaW5zdGFsbC1zaApAQCAtMCwwICsxLDI5NCBAQAorIyEvYmluL3NoCisjCisjIGluc3RhbGwgLSBpbnN0YWxsIGEgcHJvZ3JhbSwgc2NyaXB0LCBvciBkYXRhZmlsZQorIworIyBUaGlzIG9yaWdpbmF0ZXMgZnJvbSBYMTFSNSAobWl0L3V0aWwvc2NyaXB0cy9pbnN0YWxsLnNoKSwgd2hpY2ggd2FzCisjIGxhdGVyIHJlbGVhc2VkIGluIFgxMVI2ICh4Yy9jb25maWcvdXRpbC9pbnN0YWxsLnNoKSB3aXRoIHRoZQorIyBmb2xsb3dpbmcgY29weXJpZ2h0IGFuZCBsaWNlbnNlLgorIworIyBDb3B5cmlnaHQgKEMpIDE5OTQgWCBDb25zb3J0aXVtCisjCisjIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKKyMgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisjIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisjIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorIyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcworIyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorIworIyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorIyBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyMKKyMgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyMgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisjIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyMgWCBDT05TT1JUSVVNIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTgorIyBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUMtCisjIFRJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisjCisjIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIHRoZSBYIENvbnNvcnRpdW0gc2hhbGwgbm90CisjIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsLQorIyBpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gZnJvbSB0aGUgWCBDb25zb3ItCisjIHRpdW0uCisjCisjCisjIEZTRiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSBhcmUgaW4gdGhlIHB1YmxpYyBkb21haW4uCisjCisjIENhbGxpbmcgdGhpcyBzY3JpcHQgaW5zdGFsbC1zaCBpcyBwcmVmZXJyZWQgb3ZlciBpbnN0YWxsLnNoLCB0byBwcmV2ZW50CisjIGBtYWtlJyBpbXBsaWNpdCBydWxlcyBmcm9tIGNyZWF0aW5nIGEgZmlsZSBjYWxsZWQgaW5zdGFsbCBmcm9tIGl0CisjIHdoZW4gdGhlcmUgaXMgbm8gTWFrZWZpbGUuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgQlNEIGluc3RhbGwgc2NyaXB0LCBidXQgd2FzIHdyaXR0ZW4KKyMgZnJvbSBzY3JhdGNoLiAgSXQgY2FuIG9ubHkgaW5zdGFsbCBvbmUgZmlsZSBhdCBhIHRpbWUsIGEgcmVzdHJpY3Rpb24KKyMgc2hhcmVkIHdpdGggbWFueSBPUydzIGluc3RhbGwgcHJvZ3JhbXMuCisKKworIyBzZXQgRE9JVFBST0cgdG8gZWNobyB0byB0ZXN0IHRoaXMgc2NyaXB0CisKKyMgRG9uJ3QgdXNlIDotIHNpbmNlIDQuM0JTRCBhbmQgZWFybGllciBzaGVsbHMgZG9uJ3QgbGlrZSBpdC4KK2RvaXQ9IiR7RE9JVFBST0ctfSIKKworCisjIHB1dCBpbiBhYnNvbHV0ZSBwYXRocyBpZiB5b3UgZG9uJ3QgaGF2ZSB0aGVtIGluIHlvdXIgcGF0aDsgb3IgdXNlIGVudi4gdmFycy4KKworbXZwcm9nPSIke01WUFJPRy1tdn0iCitjcHByb2c9IiR7Q1BQUk9HLWNwfSIKK2NobW9kcHJvZz0iJHtDSE1PRFBST0ctY2htb2R9IgorY2hvd25wcm9nPSIke0NIT1dOUFJPRy1jaG93bn0iCitjaGdycHByb2c9IiR7Q0hHUlBQUk9HLWNoZ3JwfSIKK3N0cmlwcHJvZz0iJHtTVFJJUFBST0ctc3RyaXB9Igorcm1wcm9nPSIke1JNUFJPRy1ybX0iCitta2RpcnByb2c9IiR7TUtESVJQUk9HLW1rZGlyfSIKKwordHJhbnNmb3JtYmFzZW5hbWU9IiIKK3RyYW5zZm9ybV9hcmc9IiIKK2luc3RjbWQ9IiRtdnByb2ciCitjaG1vZGNtZD0iJGNobW9kcHJvZyAwNzU1IgorY2hvd25jbWQ9IiIKK2NoZ3JwY21kPSIiCitzdHJpcGNtZD0iIgorcm1jbWQ9IiRybXByb2cgLWYiCittdmNtZD0iJG12cHJvZyIKK3NyYz0iIgorZHN0PSIiCitkaXJfYXJnPSIiCisKK3doaWxlIFsgeCIkMSIgIT0geCBdOyBkbworICAgIGNhc2UgJDEgaW4KKwktYykgaW5zdGNtZD0kY3Bwcm9nCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1kKSBkaXJfYXJnPXRydWUKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLW0pIGNobW9kY21kPSIkY2htb2Rwcm9nICQyIgorCSAgICBzaGlmdAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwktbykgY2hvd25jbWQ9IiRjaG93bnByb2cgJDIiCisJICAgIHNoaWZ0CisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKworCS1nKSBjaGdycGNtZD0iJGNoZ3JwcHJvZyAkMiIKKwkgICAgc2hpZnQKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXMpIHN0cmlwY21kPSRzdHJpcHByb2cKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLXQ9KikgdHJhbnNmb3JtYXJnPWBlY2hvICQxIHwgc2VkICdzLy10PS8vJ2AKKwkgICAgc2hpZnQKKwkgICAgY29udGludWU7OworCisJLWI9KikgdHJhbnNmb3JtYmFzZW5hbWU9YGVjaG8gJDEgfCBzZWQgJ3MvLWI9Ly8nYAorCSAgICBzaGlmdAorCSAgICBjb250aW51ZTs7CisKKwkqKSAgaWYgWyB4IiRzcmMiID0geCBdCisJICAgIHRoZW4KKwkJc3JjPSQxCisJICAgIGVsc2UKKwkJIyB0aGlzIGNvbG9uIGlzIHRvIHdvcmsgYXJvdW5kIGEgMzg2QlNEIC9iaW4vc2ggYnVnCisJCToKKwkJZHN0PSQxCisJICAgIGZpCisJICAgIHNoaWZ0CisJICAgIGNvbnRpbnVlOzsKKyAgICBlc2FjCitkb25lCisKK2lmIFsgeCIkc3JjIiA9IHggXQordGhlbgorCWVjaG8gIiQwOiBubyBpbnB1dCBmaWxlIHNwZWNpZmllZCIgPiYyCisJZXhpdCAxCitlbHNlCisJOgorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF07IHRoZW4KKwlkc3Q9JHNyYworCXNyYz0iIgorCisJaWYgWyAtZCAiJGRzdCIgXTsgdGhlbgorCQlpbnN0Y21kPToKKwkJY2htb2RjbWQ9IiIKKwllbHNlCisJCWluc3RjbWQ9JG1rZGlycHJvZworCWZpCitlbHNlCisKKyMgV2FpdGluZyBmb3IgdGhpcyB0byBiZSBkZXRlY3RlZCBieSB0aGUgIiRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZAorIyBtaWdodCBjYXVzZSBkaXJlY3RvcmllcyB0byBiZSBjcmVhdGVkLCB3aGljaCB3b3VsZCBiZSBlc3BlY2lhbGx5IGJhZAorIyBpZiAkc3JjIChhbmQgdGh1cyAkZHN0dG1wKSBjb250YWlucyAnKicuCisKKwlpZiBbIC1mICIkc3JjIiBdIHx8IFsgLWQgIiRzcmMiIF0KKwl0aGVuCisJCToKKwllbHNlCisJCWVjaG8gIiQwOiAkc3JjIGRvZXMgbm90IGV4aXN0IiA+JjIKKwkJZXhpdCAxCisJZmkKKworCWlmIFsgeCIkZHN0IiA9IHggXQorCXRoZW4KKwkJZWNobyAiJDA6IG5vIGRlc3RpbmF0aW9uIHNwZWNpZmllZCIgPiYyCisJCWV4aXQgMQorCWVsc2UKKwkJOgorCWZpCisKKyMgSWYgZGVzdGluYXRpb24gaXMgYSBkaXJlY3RvcnksIGFwcGVuZCB0aGUgaW5wdXQgZmlsZW5hbWU7IGlmIHlvdXIgc3lzdGVtCisjIGRvZXMgbm90IGxpa2UgZG91YmxlIHNsYXNoZXMgaW4gZmlsZW5hbWVzLCB5b3UgbWF5IG5lZWQgdG8gYWRkIHNvbWUgbG9naWMKKworCWlmIFsgLWQgIiRkc3QiIF0KKwl0aGVuCisJCWRzdD0kZHN0L2BiYXNlbmFtZSAiJHNyYyJgCisJZWxzZQorCQk6CisJZmkKK2ZpCisKKyMjIHRoaXMgc2VkIGNvbW1hbmQgZW11bGF0ZXMgdGhlIGRpcm5hbWUgY29tbWFuZAorZHN0ZGlyPWBlY2hvICIkZHN0IiB8IHNlZCAtZSAncyxbXi9dKiQsLDtzLC8kLCw7cyxeJCwuLCdgCisKKyMgTWFrZSBzdXJlIHRoYXQgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBleGlzdHMuCisjICB0aGlzIHBhcnQgaXMgdGFrZW4gZnJvbSBOb2FoIEZyaWVkbWFuJ3MgbWtpbnN0YWxsZGlycyBzY3JpcHQKKworIyBTa2lwIGxvdHMgb2Ygc3RhdCBjYWxscyBpbiB0aGUgdXN1YWwgY2FzZS4KK2lmIFsgISAtZCAiJGRzdGRpciIgXTsgdGhlbgorZGVmYXVsdElGUz0nCisJJworSUZTPSIke0lGUy0kZGVmYXVsdElGU30iCisKK29JRlM9JElGUworIyBTb21lIHNoJ3MgY2FuJ3QgaGFuZGxlIElGUz0vIGZvciBzb21lIHJlYXNvbi4KK0lGUz0nJScKK3NldCAtIGBlY2hvICIkZHN0ZGlyIiB8IHNlZCAtZSAnc0AvQCVAZycgLWUgJ3NAXiVAL0AnYAorSUZTPSRvSUZTCisKK3BhdGhjb21wPScnCisKK3doaWxlIFsgJCMgLW5lIDAgXSA7IGRvCisJcGF0aGNvbXA9JHBhdGhjb21wJDEKKwlzaGlmdAorCisJaWYgWyAhIC1kICIkcGF0aGNvbXAiIF0gOworICAgICAgICB0aGVuCisJCSRta2RpcnByb2cgIiRwYXRoY29tcCIKKwllbHNlCisJCToKKwlmaQorCisJcGF0aGNvbXA9JHBhdGhjb21wLworZG9uZQorZmkKKworaWYgWyB4IiRkaXJfYXJnIiAhPSB4IF0KK3RoZW4KKwkkZG9pdCAkaW5zdGNtZCAiJGRzdCIgJiYKKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgIiRkc3QiOyBlbHNlIDogOyBmaSAmJgorCWlmIFsgeCIkY2hncnBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hncnBjbWQgIiRkc3QiOyBlbHNlIDogOyBmaSAmJgorCWlmIFsgeCIkc3RyaXBjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkc3RyaXBjbWQgIiRkc3QiOyBlbHNlIDogOyBmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgIiRkc3QiOyBlbHNlIDogOyBmaQorZWxzZQorCisjIElmIHdlJ3JlIGdvaW5nIHRvIHJlbmFtZSB0aGUgZmluYWwgZXhlY3V0YWJsZSwgZGV0ZXJtaW5lIHRoZSBuYW1lIG5vdy4KKworCWlmIFsgeCIkdHJhbnNmb3JtYXJnIiA9IHggXQorCXRoZW4KKwkJZHN0ZmlsZT1gYmFzZW5hbWUgIiRkc3QiYAorCWVsc2UKKwkJZHN0ZmlsZT1gYmFzZW5hbWUgIiRkc3QiICR0cmFuc2Zvcm1iYXNlbmFtZSB8CisJCQlzZWQgJHRyYW5zZm9ybWFyZ2AkdHJhbnNmb3JtYmFzZW5hbWUKKwlmaQorCisjIGRvbid0IGFsbG93IHRoZSBzZWQgY29tbWFuZCB0byBjb21wbGV0ZWx5IGVsaW1pbmF0ZSB0aGUgZmlsZW5hbWUKKworCWlmIFsgeCIkZHN0ZmlsZSIgPSB4IF0KKwl0aGVuCisJCWRzdGZpbGU9YGJhc2VuYW1lICIkZHN0ImAKKwllbHNlCisJCToKKwlmaQorCisjIE1ha2UgYSBjb3VwbGUgb2YgdGVtcCBmaWxlIG5hbWVzIGluIHRoZSBwcm9wZXIgZGlyZWN0b3J5LgorCisJZHN0dG1wPSRkc3RkaXIvI2luc3QuJCQjCisJcm10bXA9JGRzdGRpci8jcm0uJCQjCisKKyMgVHJhcCB0byBjbGVhbiB1cCB0ZW1wIGZpbGVzIGF0IGV4aXQuCisKKwl0cmFwICdzdGF0dXM9JD87IHJtIC1mICIkZHN0dG1wIiAiJHJtdG1wIiAmJiBleGl0ICRzdGF0dXMnIDAKKwl0cmFwICcoZXhpdCAkPyk7IGV4aXQnIDEgMiAxMyAxNQorCisjIE1vdmUgb3IgY29weSB0aGUgZmlsZSBuYW1lIHRvIHRoZSB0ZW1wIG5hbWUKKworCSRkb2l0ICRpbnN0Y21kICIkc3JjIiAiJGRzdHRtcCIgJiYKKworIyBhbmQgc2V0IGFueSBvcHRpb25zOyBkbyBjaG1vZCBsYXN0IHRvIHByZXNlcnZlIHNldHVpZCBiaXRzCisKKyMgSWYgYW55IG9mIHRoZXNlIGZhaWwsIHdlIGFib3J0IHRoZSB3aG9sZSB0aGluZy4gIElmIHdlIHdhbnQgdG8KKyMgaWdub3JlIGVycm9ycyBmcm9tIGFueSBvZiB0aGVzZSwganVzdCBtYWtlIHN1cmUgbm90IHRvIGlnbm9yZQorIyBlcnJvcnMgZnJvbSB0aGUgYWJvdmUgIiRkb2l0ICRpbnN0Y21kICRzcmMgJGRzdHRtcCIgY29tbWFuZC4KKworCWlmIFsgeCIkY2hvd25jbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2hvd25jbWQgIiRkc3R0bXAiOyBlbHNlIDo7ZmkgJiYKKwlpZiBbIHgiJGNoZ3JwY21kIiAhPSB4IF07IHRoZW4gJGRvaXQgJGNoZ3JwY21kICIkZHN0dG1wIjsgZWxzZSA6O2ZpICYmCisJaWYgWyB4IiRzdHJpcGNtZCIgIT0geCBdOyB0aGVuICRkb2l0ICRzdHJpcGNtZCAiJGRzdHRtcCI7IGVsc2UgOjtmaSAmJgorCWlmIFsgeCIkY2htb2RjbWQiICE9IHggXTsgdGhlbiAkZG9pdCAkY2htb2RjbWQgIiRkc3R0bXAiOyBlbHNlIDo7ZmkgJiYKKworIyBOb3cgcmVtb3ZlIG9yIG1vdmUgYXNpZGUgYW55IG9sZCBmaWxlIGF0IGRlc3RpbmF0aW9uIGxvY2F0aW9uLiAgV2UgdHJ5IHRoaXMKKyMgdHdvIHdheXMgc2luY2Ugcm0gY2FuJ3QgdW5saW5rIGl0c2VsZiBvbiBzb21lIHN5c3RlbXMgYW5kIHRoZSBkZXN0aW5hdGlvbgorIyBmaWxlIG1pZ2h0IGJlIGJ1c3kgZm9yIG90aGVyIHJlYXNvbnMuICBJbiB0aGlzIGNhc2UsIHRoZSBmaW5hbCBjbGVhbnVwCisjIG1pZ2h0IGZhaWwgYnV0IHRoZSBuZXcgZmlsZSBzaG91bGQgc3RpbGwgaW5zdGFsbCBzdWNjZXNzZnVsbHkuCisKK3sKKwlpZiBbIC1mICIkZHN0ZGlyLyRkc3RmaWxlIiBdCisJdGhlbgorCQkkZG9pdCAkcm1jbWQgLWYgIiRkc3RkaXIvJGRzdGZpbGUiIDI+L2Rldi9udWxsIHx8CisJCSRkb2l0ICRtdmNtZCAtZiAiJGRzdGRpci8kZHN0ZmlsZSIgIiRybXRtcCIgMj4vZGV2L251bGwgfHwKKwkJeworCQkgIGVjaG8gIiQwOiBjYW5ub3QgdW5saW5rIG9yIHJlbmFtZSAkZHN0ZGlyLyRkc3RmaWxlIiA+JjIKKwkJICAoZXhpdCAxKTsgZXhpdAorCQl9CisJZWxzZQorCQk6CisJZmkKK30gJiYKKworIyBOb3cgcmVuYW1lIHRoZSBmaWxlIHRvIHRoZSByZWFsIGRlc3RpbmF0aW9uLgorCisJJGRvaXQgJG12Y21kICIkZHN0dG1wIiAiJGRzdGRpci8kZHN0ZmlsZSIKKworZmkgJiYKKworIyBUaGUgZmluYWwgbGl0dGxlIHRyaWNrIHRvICJjb3JyZWN0bHkiIHBhc3MgdGhlIGV4aXQgc3RhdHVzIHRvIHRoZSBleGl0IHRyYXAuCisKK3sKKwkoZXhpdCAwKTsgZXhpdAorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb25maWcvbGlicHl0aG9uMi43LmEgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9saWJweXRob24yLjcuYQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2IxYTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb25maWcvbGlicHl0aG9uMi43LmEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jb25maWcvbWFrZXNldHVwIGIvbGliL3B5dGhvbjIuNy9jb25maWcvbWFrZXNldHVwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg4NjJjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvbmZpZy9tYWtlc2V0dXAKQEAgLTAsMCArMSwyOTcgQEAKKyMhIC9iaW4vc2gKKworIyBDb252ZXJ0IHRlbXBsYXRlcyBpbnRvIE1ha2VmaWxlIGFuZCBjb25maWcuYywgYmFzZWQgb24gdGhlIG1vZHVsZQorIyBkZWZpbml0aW9ucyBmb3VuZCBpbiB0aGUgZmlsZSBTZXR1cC4KKyMKKyMgVXNhZ2U6IG1ha2VzZXR1cCBbLXMgZGlyXSBbLWMgZmlsZV0gWy1tIGZpbGVdIFtTZXR1cF0gLi4uIFstbiBbU2V0dXBdIC4uLl0KKyMKKyMgT3B0aW9uczoKKyMgLXMgZGlyZWN0b3J5OiBhbHRlcm5hdGl2ZSBzb3VyY2UgZGlyZWN0b3J5IChkZWZhdWx0IC4pCisjIC1sIGRpcmVjdG9yeTogbGlicmFyeSBzb3VyY2UgZGlyZWN0b3J5IChkZWZhdWx0IGRlcml2ZWQgZnJvbSAkMCkKKyMgLWMgZmlsZTogICAgICBhbHRlcm5hdGl2ZSBjb25maWcuYyB0ZW1wbGF0ZSAoZGVmYXVsdCAkbGliZGlyL2NvbmZpZy5jLmluKQorIyAtYyAtOiAgICAgICAgIGRvbid0IHdyaXRlIGNvbmZpZy5jCisjIC1tIGZpbGU6ICAgICAgYWx0ZXJuYXRpdmUgTWFrZWZpbGUgdGVtcGxhdGUgKGRlZmF1bHQgLi9NYWtlZmlsZS5wcmUpCisjIC1tIC06ICAgICAgICAgZG9uJ3Qgd3JpdGUgTWFrZWZpbGUKKyMKKyMgUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgb25lIG9yIG1vcmUgU2V0dXAgZmlsZXMgKGRlZmF1bHQgLi9TZXR1cCkuCisjIFNldHVwIGZpbGVzIGFmdGVyIGEgLW4gb3B0aW9uIGFyZSB1c2VkIGZvciB0aGVpciB2YXJpYWJsZXMsIG1vZHVsZXMKKyMgYW5kIGxpYnJhcmllcyBidXQgbm90IGZvciB0aGVpciAubyBmaWxlcy4KKyMKKyMgU2VlIFNldHVwLmRpc3QgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCBvZiB0aGUgU2V0dXAgZmlsZS4KKyMKKyMgVGhlIGZvbGxvd2luZyBlZGl0cyBhcmUgbWFkZToKKyMKKyMgQ29weWluZyBjb25maWcuYy5pbiB0byBjb25maWcuYzoKKyMgLSBpbnNlcnQgYW4gaWRlbnRpZnlpbmcgY29tbWVudCBhdCB0aGUgc3RhcnQKKyMgLSBmb3IgZWFjaCA8bW9kdWxlPiBtZW50aW9uZWQgaW4gU2V0dXAgYmVmb3JlICpub2NvbmZpZyo6CisjICAgKyBpbnNlcnQgJ2V4dGVybiB2b2lkIGluaXQ8bW9kdWxlPih2b2lkKTsnIGJlZm9yZSBNQVJLRVIgMQorIyAgICsgaW5zZXJ0ICd7Ijxtb2R1bGU+IiwgaW5pdG1vZHVsZX0sJyBiZWZvcmUgTUFSS0VSIDIKKyMKKyMgQ29weWluZyBNYWtlZmlsZS5wcmUgdG8gTWFrZWZpbGU6CisjIC0gaW5zZXJ0IGFuIGlkZW50aWZ5aW5nIGNvbW1lbnQgYXQgdGhlIHN0YXJ0CisjIC0gcmVwbGFjZSBfTU9ET0JKU18gYnkgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBmcm9tIFNldHVwIChleGNlcHQgZm9yCisjICAgU2V0dXAgZmlsZXMgYWZ0ZXIgYSAtbiBvcHRpb24pCisjIC0gcmVwbGFjZSBfTU9ETElCU18gYnkgdGhlIGxpc3Qgb2YgbGlicmFyaWVzIGZyb20gU2V0dXAKKyMgLSBmb3IgZWFjaCBvYmplY3QgZmlsZSBtZW50aW9uZWQgaW4gU2V0dXAsIGFwcGVuZCBhIHJ1bGUKKyMgICAnPGZpbGU+Lm86IDxmaWxlPi5jOyA8YnVpbGQgY29tbWFuZHM+JyB0byB0aGUgZW5kIG9mIHRoZSBNYWtlZmlsZQorIyAtIGZvciBlYWNoIG1vZHVsZSBtZW50aW9uZWQgaW4gU2V0dXAsIGFwcGVuZCBhIHJ1bGUKKyMgICB3aGljaCBjcmVhdGVzIGEgc2hhcmVkIGxpYnJhcnkgdmVyc2lvbiB0byB0aGUgZW5kIG9mIHRoZSBNYWtlZmlsZQorIyAtIGZvciBlYWNoIHZhcmlhYmxlIGRlZmluaXRpb24gZm91bmQgaW4gU2V0dXAsIGluc2VydCB0aGUgZGVmaW5pdGlvbgorIyAgIGJlZm9yZSB0aGUgY29tbWVudCAnRGVmaW5pdGlvbnMgYWRkZWQgYnkgbWFrZXNldHVwJworCisjIExvb3Agb3ZlciBjb21tYW5kIGxpbmUgb3B0aW9ucwordXNhZ2U9JwordXNhZ2U6IG1ha2VzZXR1cCBbLXMgc3JjZGlyXSBbLWwgbGliZGlyXSBbLWMgY29uZmlnLmMuaW5dIFstbSBNYWtlZmlsZS5wcmVdCisgICAgICAgICAgICAgICAgIFtTZXR1cF0gLi4uIFstbiBbU2V0dXBdIC4uLl0nCitzcmNkaXI9Jy4nCitsaWJkaXI9JycKK2NvbmZpZz0nJworbWFrZXByZT0nJworbm9vYmplY3RzPScnCitkb2NvbmZpZz15ZXMKK3doaWxlIDoKK2RvCisJY2FzZSAkMSBpbgorCS1zKQlzaGlmdDsgc3JjZGlyPSQxOyBzaGlmdDs7CisJLWwpCXNoaWZ0OyBsaWJkaXI9JDE7IHNoaWZ0OzsKKwktYykJc2hpZnQ7IGNvbmZpZz0kMTsgc2hpZnQ7OworCS1tKQlzaGlmdDsgbWFrZXByZT0kMTsgc2hpZnQ7OworCS0tKQlzaGlmdDsgYnJlYWs7OworCS1uKQlub29iamVjdHM9eWVzOzsKKwktKikJZWNobyAiJHVzYWdlIiAxPiYyOyBleGl0IDI7OworCSopCWJyZWFrOzsKKwllc2FjCitkb25lCisKKyMgU2V0IGRlZmF1bHQgbGliZGlyIGFuZCBjb25maWcgaWYgbm90IHNldCBieSBjb21tYW5kIGxpbmUKKyMgKE5vdCBhbGwgc3lzdGVtcyBoYXZlIGRpcm5hbWUpCitjYXNlICRsaWJkaXIgaW4KKycnKQljYXNlICQwIGluCisJKi8qKQlsaWJkaXI9YGVjaG8gJDAgfCBzZWQgJ3MsL1teL10qJCwsJ2A7OworCSopCWxpYmRpcj0uOzsKKwllc2FjOzsKK2VzYWMKK2Nhc2UgJGNvbmZpZyBpbgorJycpCWNvbmZpZz0kbGliZGlyL2NvbmZpZy5jLmluOzsKK2VzYWMKK2Nhc2UgJG1ha2VwcmUgaW4KKycnKQltYWtlcHJlPU1ha2VmaWxlLnByZTs7Citlc2FjCisKKyMgTmV3bGluZSBmb3Igc2VkIGkgYW5kIGEgY29tbWFuZHMKK05MPSdcCisnCisKKyMgU2V0dXAgdG8gbGluayB3aXRoIGV4dHJhIGxpYnJhcmllcyB3aGVuIG1ha2Vpbmcgc2hhcmVkIGV4dGVuc2lvbnMuCisjIEN1cnJlbnRseSwgb25seSBDeWd3aW4gbmVlZHMgdGhpcyBiYWdnYWdlLgorY2FzZSBgdW5hbWUgLXNgIGluCitDWUdXSU4qKSBpZiB0ZXN0ICRsaWJkaXIgPSAuCisJIHRoZW4KKwkgCUV4dHJhTGliRGlyPS4KKwkgZWxzZQorCSAJRXh0cmFMaWJEaXI9JyQoTElCUEwpJworCSBmaQorCSBFeHRyYUxpYnM9Ii1MJEV4dHJhTGliRGlyIC1scHl0aG9uXCQoVkVSU0lPTikiOzsKK2VzYWMKKworIyBNYWluIGxvb3AKK2ZvciBpIGluICR7Ki1TZXR1cH0KK2RvCisJY2FzZSAkaSBpbgorCS1uKQllY2hvICcqbm9vYmplY3RzKic7OworCSopCWVjaG8gJypkb2NvbmZpZyonOyBjYXQgIiRpIjs7CisJZXNhYworZG9uZSB8CitzZWQgLWUgJ3MvWyAJXSojLiovLycgLWUgJy9eWyAJXSokL2QnIHwKKygKKwlydWxlc2Y9IkBydWxlcy4kJCIKKwl0cmFwICdybSAtZiAkcnVsZXNmJyAwIDEgMiAzCisJZWNobyAiCisjIFJ1bGVzIGFwcGVuZGVkIGJ5IG1ha2VkZXBlbmQKKyIgPiRydWxlc2YKKwlERUZTPQorCU1PRFM9CisJU0hBUkVETU9EUz0KKwlPQkpTPQorCUxJQlM9CisJTE9DQUxMSUJTPQorCUJBU0VMSUJTPQorCXdoaWxlIHJlYWQgbGluZQorCWRvCisJCSMgdG8gaGFuZGxlIGJhY2tzbGFzaGVzIGZvciBzaCdzIHRoYXQgZG9uJ3QgYXV0b21hdGljYWxseQorCQkjIGNvbnRpbnVlIGEgcmVhZCB3aGVuIHRoZSBsYXN0IGNoYXIgaXMgYSBiYWNrc2xhc2gKKwkJd2hpbGUgZWNobyAkbGluZSB8IGdyZXAgJ1xcJCcgPiAvZGV2L251bGwKKwkJZG8KKwkJCXJlYWQgZXh0cmFsaW5lCisJCQlsaW5lPWBlY2hvICRsaW5lfCBzZWQgcy8uJC8vYCRleHRyYWxpbmUKKwkJZG9uZQorCisJCSMgT3V0cHV0IERFRlMgaW4gcmV2ZXJzZSBvcmRlciBzbyBmaXJzdCBkZWZpbml0aW9uIG92ZXJyaWRlcworCQljYXNlICRsaW5lIGluCisJCSo9KikJREVGUz0iJGxpbmUkTkwkREVGUyI7IGNvbnRpbnVlOzsKKwkJJ2luY2x1ZGUgJyopCURFRlM9IiRsaW5lJE5MJERFRlMiOyBjb250aW51ZTs7CisJCScqbm9vYmplY3RzKicpCisJCQljYXNlICRub29iamVjdHMgaW4KKwkJCXllcykJOzsKKwkJCSopCUxPQ0FMTElCUz0kTElCUzsgTElCUz07OworCQkJZXNhYworCQkJbm9vYmplY3RzPXllczsKKwkJCWNvbnRpbnVlOzsKKwkJJypkb2NvbmZpZyonKQlkb2NvbmZpZz15ZXM7IGNvbnRpbnVlOzsKKwkJJypzdGF0aWMqJykJZG9jb25maWc9eWVzOyBjb250aW51ZTs7CisJCScqbm9jb25maWcqJykJZG9jb25maWc9bm87IGNvbnRpbnVlOzsKKwkJJypzaGFyZWQqJykJZG9jb25maWc9bm87IGNvbnRpbnVlOzsKKwkJZXNhYworCQlzcmNzPQorCQljcHBzPQorCQlsaWJzPQorCQltb2RzPQorCQlza2lwPQorCQlmb3IgYXJnIGluICRsaW5lCisJCWRvCisJCQljYXNlICRza2lwIGluCisJCQlsaWJzKQlsaWJzPSIkbGlicyAkYXJnIjsgc2tpcD07IGNvbnRpbnVlOzsKKwkJCWNwcHMpCWNwcHM9IiRjcHBzICRhcmciOyBza2lwPTsgY29udGludWU7OworCQkJc3JjcykJc3Jjcz0iJHNyY3MgJGFyZyI7IHNraXA9OyBjb250aW51ZTs7CisJCQllc2FjCisJCQljYXNlICRhcmcgaW4KKwkJCS1mcmFtZXdvcmspCWxpYnM9IiRsaWJzICRhcmciOyBza2lwPWxpYnM7CisJCQkJICAgICAgICAjIE9TWC9PU1hTL0RhcndpbiBmcmFtZXdvcmsgbGluayBjbWQKKwkJCQkJOzsKKwkJCS1bSURVQ2ZGXSopCWNwcHM9IiRjcHBzICRhcmciOzsKKwkJCS1YY29tcGlsZXIpCXNraXA9Y3Bwczs7CisJCQktWGxpbmtlcikJbGlicz0iJGxpYnMgJGFyZyI7IHNraXA9bGliczs7CisJCQktcnBhdGgpCQlsaWJzPSIkbGlicyAkYXJnIjsgc2tpcD1saWJzOzsKKwkJCS0tcnBhdGgpCWxpYnM9IiRsaWJzICRhcmciOyBza2lwPWxpYnM7OworCQkJLVtBLVpsXSopCWxpYnM9IiRsaWJzICRhcmciOzsKKwkJCSouYSkJCWxpYnM9IiRsaWJzICRhcmciOzsKKwkJCSouc28pCQlsaWJzPSIkbGlicyAkYXJnIjs7CisJCQkqLnNsKQkJbGlicz0iJGxpYnMgJGFyZyI7OworCQkJLyoubykJCWxpYnM9IiRsaWJzICRhcmciOzsKKwkJCSouZGVmKQkJbGlicz0iJGxpYnMgJGFyZyI7OworCQkJKi5vKQkJc3Jjcz0iJHNyY3MgYGJhc2VuYW1lICRhcmcgLm9gLmMiOzsKKwkJCSouW2NDXSkJCXNyY3M9IiRzcmNzICRhcmciOzsKKwkJCSoubSkJCXNyY3M9IiRzcmNzICRhcmciOzsgIyBPYmplY3RpdmUtQyBzcmMKKwkJCSouY2MpCQlzcmNzPSIkc3JjcyAkYXJnIjs7CisJCQkqLmMrKykJCXNyY3M9IiRzcmNzICRhcmciOzsKKwkJCSouY3h4KQkJc3Jjcz0iJHNyY3MgJGFyZyI7OworCQkJKi5jcHApCQlzcmNzPSIkc3JjcyAkYXJnIjs7CisJCQlcJCopCQlsaWJzPSIkbGlicyAkYXJnIgorCQkJCQljcHBzPSIkY3BwcyAkYXJnIjs7CisJCQkqLiopCQllY2hvIDE+JjIgImJhZCB3b3JkICRhcmcgaW4gJGxpbmUiCisJCQkJCWV4aXQgMTs7CisJCQktdSkJCXNraXA9bGliczsgbGlicz0iJGxpYnMgLXUiOzsKKwkJCVthLXpBLVpfXSopCW1vZHM9IiRtb2RzICRhcmciOzsKKwkJCSopCQllY2hvIDE+JjIgImJhZCB3b3JkICRhcmcgaW4gJGxpbmUiCisJCQkJCWV4aXQgMTs7CisJCQllc2FjCisJCWRvbmUKKwkJY2FzZSAkZG9jb25maWcgaW4KKwkJeWVzKQorCQkJTElCUz0iJExJQlMgJGxpYnMiCisJCQlNT0RTPSIkTU9EUyAkbW9kcyIKKwkJCTs7CisJCWVzYWMKKwkJY2FzZSAkbm9vYmplY3RzIGluCisJCXllcykJY29udGludWU7OworCQllc2FjCisJCW9ianM9JycKKwkJZm9yIHNyYyBpbiAkc3JjcworCQlkbworCQkJY2FzZSAkc3JjIGluCisJCQkqLmMpICAgb2JqPWBiYXNlbmFtZSAkc3JjIC5jYC5vOyBjYz0nJChDQyknOzsKKwkJCSouY2MpICBvYmo9YGJhc2VuYW1lICRzcmMgLmNjYC5vOyBjYz0nJChDWFgpJzs7CisJCQkqLmMrKykgb2JqPWBiYXNlbmFtZSAkc3JjIC5jKytgLm87IGNjPSckKENYWCknOzsKKwkJCSouQykgICBvYmo9YGJhc2VuYW1lICRzcmMgLkNgLm87IGNjPSckKENYWCknOzsKKwkJCSouY3h4KSBvYmo9YGJhc2VuYW1lICRzcmMgLmN4eGAubzsgY2M9JyQoQ1hYKSc7OworCQkJKi5jcHApIG9iaj1gYmFzZW5hbWUgJHNyYyAuY3BwYC5vOyBjYz0nJChDWFgpJzs7CisJCQkqLm0pICAgb2JqPWBiYXNlbmFtZSAkc3JjIC5tYC5vOyBjYz0nJChDQyknOzsgIyBPYmotQworCQkJKikgICAgIGNvbnRpbnVlOzsKKwkJCWVzYWMKKwkJCW9iaj0iJHNyY2Rpci8kb2JqIgorCQkJb2Jqcz0iJG9ianMgJG9iaiIKKwkJCWNhc2UgJHNyYyBpbgorCQkJZ2xtb2R1bGUuYykgOzsKKwkJCS8qKSA7OworCQkJXCQqKSA7OworCQkJKikgc3JjPSckKHNyY2RpcikvJyIkc3JjZGlyLyRzcmMiOzsKKwkJCWVzYWMKKwkJCWNhc2UgJGRvY29uZmlnIGluCisJCQlubykJY2M9IiRjYyBcJChDQ1NIQVJFRCkgXCQoQ0ZMQUdTKSBcJChDUFBGTEFHUykiOzsKKwkJCSopCisJCQkJY2M9IiRjYyBcJChQWV9DRkxBR1MpIjs7CisJCQllc2FjCisJCQlydWxlPSIkb2JqOiAkc3JjOyAkY2MgJGNwcHMgLWMgJHNyYyAtbyAkb2JqIgorCQkJZWNobyAiJHJ1bGUiID4+JHJ1bGVzZgorCQlkb25lCisJCWNhc2UgJGRvY29uZmlnIGluCisJCXllcykJT0JKUz0iJE9CSlMgJG9ianMiOzsKKwkJZXNhYworCQlmb3IgbW9kIGluICRtb2RzCisJCWRvCisJCQljYXNlICRvYmpzIGluCisJCQkqJG1vZC5vKikJYmFzZT0kbW9kOzsKKwkJCSopCQliYXNlPSR7bW9kfW1vZHVsZTs7CisJCQllc2FjCisJCQlmaWxlPSIkc3JjZGlyLyRiYXNlXCQoU08pIgorCQkJY2FzZSAkZG9jb25maWcgaW4KKwkJCW5vKQlTSEFSRURNT0RTPSIkU0hBUkVETU9EUyAkZmlsZSI7OworCQkJZXNhYworCQkJcnVsZT0iJGZpbGU6ICRvYmpzIgorCQkJcnVsZT0iJHJ1bGU7IFwkKEJMRFNIQVJFRCkgJG9ianMgJGxpYnMgJEV4dHJhTGlicyAtbyAkZmlsZSIKKwkJCWVjaG8gIiRydWxlIiA+PiRydWxlc2YKKwkJZG9uZQorCWRvbmUKKworCWNhc2UgJFNIQVJFRE1PRFMgaW4KKwknJykJOzsKKwkqKQlERUZTPSJTSEFSRURNT0RTPSRTSEFSRURNT0RTJE5MJERFRlMiOzsKKwllc2FjCisKKwljYXNlICRub29iamVjdHMgaW4KKwl5ZXMpCUJBU0VMSUJTPSRMSUJTOzsKKwkqKQlMT0NBTExJQlM9JExJQlM7OworCWVzYWMKKwlMSUJTPSckKExPQ0FMTU9ETElCUykgJChCQVNFTU9ETElCUyknCisJREVGUz0iQkFTRU1PRExJQlM9JEJBU0VMSUJTJE5MJERFRlMiCisJREVGUz0iTE9DQUxNT0RMSUJTPSRMT0NBTExJQlMkTkwkREVGUyIKKworCUVYVERFQ0xTPQorCUlOSVRCSVRTPQorCWZvciBtb2QgaW4gJE1PRFMKKwlkbworCQlFWFRERUNMUz0iJHtFWFRERUNMU31leHRlcm4gdm9pZCBpbml0JG1vZCh2b2lkKTskTkwiCisJCUlOSVRCSVRTPSIke0lOSVRCSVRTfQl7XCIkbW9kXCIsIGluaXQkbW9kfSwkTkwiCisJZG9uZQorCisKKwljYXNlICRjb25maWcgaW4KKwktKSAgOzsKKwkqKSAgc2VkIC1lICIKKwkJMWkkTkwvKiBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBmcm9tICRjb25maWcgYnkgbWFrZXNldHVwLiAqLworCQkvTUFSS0VSIDEvaSROTCRFWFRERUNMUworIAorCQkvTUFSS0VSIDIvaSROTCRJTklUQklUUworCisJCSIgJGNvbmZpZyA+Y29uZmlnLmMKKwkgICAgOzsKKwllc2FjCisKKwljYXNlICRtYWtlcHJlIGluCisJLSkJOzsKKwkqKQlzZWRmPSJAc2VkLmluLiQkIgorCQl0cmFwICdybSAtZiAkc2VkZicgMCAxIDIgMworCQllY2hvICIxaVxcIiA+JHNlZGYKKwkJc3RyPSIjIEdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gJG1ha2VwcmUgYnkgbWFrZXNldHVwLiIKKwkJZWNobyAiJHN0ciIgPj4kc2VkZgorCQllY2hvICJzJV9NT0RPQkpTXyUkT0JKUyUiID4+JHNlZGYKKwkJZWNobyAicyVfTU9ETElCU18lJExJQlMlIiA+PiRzZWRmCisJCWVjaG8gIi9EZWZpbml0aW9ucyBhZGRlZCBieSBtYWtlc2V0dXAvYSROTCROTCRERUZTIiA+PiRzZWRmCisJCXNlZCAtZiAkc2VkZiAkbWFrZXByZSA+TWFrZWZpbGUKKwkJY2F0ICRydWxlc2YgPj5NYWtlZmlsZQorCQlybSAtZiAkc2VkZgorCSAgICA7OworCWVzYWMKKworCXJtIC1mICRydWxlc2YKKykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29uZmlnL3B5dGhvbi5vIGIvbGliL3B5dGhvbjIuNy9jb25maWcvcHl0aG9uLm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI0YjJlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY29uZmlnL3B5dGhvbi5vCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29udGV4dGxpYi5weSBiL2xpYi9weXRob24yLjcvY29udGV4dGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDUyMDViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb250ZXh0bGliLnB5CkBAIC0wLDAgKzEsMTU0IEBACisiIiJVdGlsaXRpZXMgZm9yIHdpdGgtc3RhdGVtZW50IGNvbnRleHRzLiAgU2VlIFBFUCAzNDMuIiIiCisKK2ltcG9ydCBzeXMKK2Zyb20gZnVuY3Rvb2xzIGltcG9ydCB3cmFwcworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybgorCitfX2FsbF9fID0gWyJjb250ZXh0bWFuYWdlciIsICJuZXN0ZWQiLCAiY2xvc2luZyJdCisKK2NsYXNzIEdlbmVyYXRvckNvbnRleHRNYW5hZ2VyKG9iamVjdCk6CisgICAgIiIiSGVscGVyIGZvciBAY29udGV4dG1hbmFnZXIgZGVjb3JhdG9yLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdlbik6CisgICAgICAgIHNlbGYuZ2VuID0gZ2VuCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW4ubmV4dCgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJnZW5lcmF0b3IgZGlkbid0IHlpZWxkIikKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgaWYgdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZ2VuLm5leHQoKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiZ2VuZXJhdG9yIGRpZG4ndCBzdG9wIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBOZWVkIHRvIGZvcmNlIGluc3RhbnRpYXRpb24gc28gd2UgY2FuIHJlbGlhYmx5CisgICAgICAgICAgICAgICAgIyB0ZWxsIGlmIHdlIGdldCB0aGUgc2FtZSBleGNlcHRpb24gYmFjaworICAgICAgICAgICAgICAgIHZhbHVlID0gdHlwZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5nZW4udGhyb3codHlwZSwgdmFsdWUsIHRyYWNlYmFjaykKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImdlbmVyYXRvciBkaWRuJ3Qgc3RvcCBhZnRlciB0aHJvdygpIikKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uLCBleGM6CisgICAgICAgICAgICAgICAgIyBTdXBwcmVzcyB0aGUgZXhjZXB0aW9uICp1bmxlc3MqIGl0J3MgdGhlIHNhbWUgZXhjZXB0aW9uIHRoYXQKKyAgICAgICAgICAgICAgICAjIHdhcyBwYXNzZWQgdG8gdGhyb3coKS4gIFRoaXMgcHJldmVudHMgYSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgIyByYWlzZWQgaW5zaWRlIHRoZSAid2l0aCIgc3RhdGVtZW50IGZyb20gYmVpbmcgc3VwcHJlc3NlZAorICAgICAgICAgICAgICAgIHJldHVybiBleGMgaXMgbm90IHZhbHVlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBvbmx5IHJlLXJhaXNlIGlmIGl0J3MgKm5vdCogdGhlIGV4Y2VwdGlvbiB0aGF0IHdhcworICAgICAgICAgICAgICAgICMgcGFzc2VkIHRvIHRocm93KCksIGJlY2F1c2UgX19leGl0X18oKSBtdXN0IG5vdCByYWlzZQorICAgICAgICAgICAgICAgICMgYW4gZXhjZXB0aW9uIHVubGVzcyBfX2V4aXRfXygpIGl0c2VsZiBmYWlsZWQuICBCdXQgdGhyb3coKQorICAgICAgICAgICAgICAgICMgaGFzIHRvIHJhaXNlIHRoZSBleGNlcHRpb24gdG8gc2lnbmFsIHByb3BhZ2F0aW9uLCBzbyB0aGlzCisgICAgICAgICAgICAgICAgIyBmaXhlcyB0aGUgaW1wZWRhbmNlIG1pc21hdGNoIGJldHdlZW4gdGhlIHRocm93KCkgcHJvdG9jb2wKKyAgICAgICAgICAgICAgICAjIGFuZCB0aGUgX19leGl0X18oKSBwcm90b2NvbC4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgaWYgc3lzLmV4Y19pbmZvKClbMV0gaXMgbm90IHZhbHVlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisKK2RlZiBjb250ZXh0bWFuYWdlcihmdW5jKToKKyAgICAiIiJAY29udGV4dG1hbmFnZXIgZGVjb3JhdG9yLgorCisgICAgVHlwaWNhbCB1c2FnZToKKworICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHNvbWVfZ2VuZXJhdG9yKDxhcmd1bWVudHM+KToKKyAgICAgICAgICAgIDxzZXR1cD4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZCA8dmFsdWU+CisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIDxjbGVhbnVwPgorCisgICAgVGhpcyBtYWtlcyB0aGlzOgorCisgICAgICAgIHdpdGggc29tZV9nZW5lcmF0b3IoPGFyZ3VtZW50cz4pIGFzIDx2YXJpYWJsZT46CisgICAgICAgICAgICA8Ym9keT4KKworICAgIGVxdWl2YWxlbnQgdG8gdGhpczoKKworICAgICAgICA8c2V0dXA+CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDx2YXJpYWJsZT4gPSA8dmFsdWU+CisgICAgICAgICAgICA8Ym9keT4KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIDxjbGVhbnVwPgorCisgICAgIiIiCisgICAgQHdyYXBzKGZ1bmMpCisgICAgZGVmIGhlbHBlcigqYXJncywgKiprd2RzKToKKyAgICAgICAgcmV0dXJuIEdlbmVyYXRvckNvbnRleHRNYW5hZ2VyKGZ1bmMoKmFyZ3MsICoqa3dkcykpCisgICAgcmV0dXJuIGhlbHBlcgorCisKK0Bjb250ZXh0bWFuYWdlcgorZGVmIG5lc3RlZCgqbWFuYWdlcnMpOgorICAgICIiIkNvbWJpbmUgbXVsdGlwbGUgY29udGV4dCBtYW5hZ2VycyBpbnRvIGEgc2luZ2xlIG5lc3RlZCBjb250ZXh0IG1hbmFnZXIuCisKKyAgIFRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgdGhlIG11bHRpcGxlIG1hbmFnZXIgZm9ybQorICAgb2YgdGhlIHdpdGggc3RhdGVtZW50LgorCisgICBUaGUgb25lIGFkdmFudGFnZSBvZiB0aGlzIGZ1bmN0aW9uIG92ZXIgdGhlIG11bHRpcGxlIG1hbmFnZXIgZm9ybSBvZiB0aGUKKyAgIHdpdGggc3RhdGVtZW50IGlzIHRoYXQgYXJndW1lbnQgdW5wYWNraW5nIGFsbG93cyBpdCB0byBiZQorICAgdXNlZCB3aXRoIGEgdmFyaWFibGUgbnVtYmVyIG9mIGNvbnRleHQgbWFuYWdlcnMgYXMgZm9sbG93czoKKworICAgICAgd2l0aCBuZXN0ZWQoKm1hbmFnZXJzKToKKyAgICAgICAgICBkb19zb21ldGhpbmcoKQorCisgICAgIiIiCisgICAgd2FybigiV2l0aC1zdGF0ZW1lbnRzIG5vdyBkaXJlY3RseSBzdXBwb3J0IG11bHRpcGxlIGNvbnRleHQgbWFuYWdlcnMiLAorICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAzKQorICAgIGV4aXRzID0gW10KKyAgICB2YXJzID0gW10KKyAgICBleGMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICB0cnk6CisgICAgICAgIGZvciBtZ3IgaW4gbWFuYWdlcnM6CisgICAgICAgICAgICBleGl0ID0gbWdyLl9fZXhpdF9fCisgICAgICAgICAgICBlbnRlciA9IG1nci5fX2VudGVyX18KKyAgICAgICAgICAgIHZhcnMuYXBwZW5kKGVudGVyKCkpCisgICAgICAgICAgICBleGl0cy5hcHBlbmQoZXhpdCkKKyAgICAgICAgeWllbGQgdmFycworICAgIGV4Y2VwdDoKKyAgICAgICAgZXhjID0gc3lzLmV4Y19pbmZvKCkKKyAgICBmaW5hbGx5OgorICAgICAgICB3aGlsZSBleGl0czoKKyAgICAgICAgICAgIGV4aXQgPSBleGl0cy5wb3AoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGV4aXQoKmV4Yyk6CisgICAgICAgICAgICAgICAgICAgIGV4YyA9IChOb25lLCBOb25lLCBOb25lKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGV4YyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIGlmIGV4YyAhPSAoTm9uZSwgTm9uZSwgTm9uZSk6CisgICAgICAgICAgICAjIERvbid0IHJlbHkgb24gc3lzLmV4Y19pbmZvKCkgc3RpbGwgY29udGFpbmluZworICAgICAgICAgICAgIyB0aGUgcmlnaHQgaW5mb3JtYXRpb24uIEFub3RoZXIgZXhjZXB0aW9uIG1heQorICAgICAgICAgICAgIyBoYXZlIGJlZW4gcmFpc2VkIGFuZCBjYXVnaHQgYnkgYW4gZXhpdCBtZXRob2QKKyAgICAgICAgICAgIHJhaXNlIGV4Y1swXSwgZXhjWzFdLCBleGNbMl0KKworCitjbGFzcyBjbG9zaW5nKG9iamVjdCk6CisgICAgIiIiQ29udGV4dCB0byBhdXRvbWF0aWNhbGx5IGNsb3NlIHNvbWV0aGluZyBhdCB0aGUgZW5kIG9mIGEgYmxvY2suCisKKyAgICBDb2RlIGxpa2UgdGhpczoKKworICAgICAgICB3aXRoIGNsb3NpbmcoPG1vZHVsZT4ub3Blbig8YXJndW1lbnRzPikpIGFzIGY6CisgICAgICAgICAgICA8YmxvY2s+CisKKyAgICBpcyBlcXVpdmFsZW50IHRvIHRoaXM6CisKKyAgICAgICAgZiA9IDxtb2R1bGU+Lm9wZW4oPGFyZ3VtZW50cz4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDxibG9jaz4KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRoaW5nKToKKyAgICAgICAgc2VsZi50aGluZyA9IHRoaW5nCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGhpbmcKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgc2VsZi50aGluZy5jbG9zZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbnRleHRsaWIucHljIGIvbGliL3B5dGhvbjIuNy9jb250ZXh0bGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzQxZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb250ZXh0bGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvbnRleHRsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9jb250ZXh0bGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzQxZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb250ZXh0bGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Nvb2tpZWxpYi5weSBiL2xpYi9weXRob24yLjcvY29va2llbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzhkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Nvb2tpZWxpYi5weQpAQCAtMCwwICsxLDE3OTQgQEAKK3IiIiJIVFRQIGNvb2tpZSBoYW5kbGluZyBmb3Igd2ViIGNsaWVudHMuCisKK1RoaXMgbW9kdWxlIGhhcyAobm93IGZhaXJseSBkaXN0YW50KSBvcmlnaW5zIGluIEdpc2xlIEFhcycgUGVybCBtb2R1bGUKK0hUVFA6OkNvb2tpZXMsIGZyb20gdGhlIGxpYnd3dy1wZXJsIGxpYnJhcnkuCisKK0RvY3N0cmluZ3MsIGNvbW1lbnRzIGFuZCBkZWJ1ZyBzdHJpbmdzIGluIHRoaXMgY29kZSByZWZlciB0byB0aGUKK2F0dHJpYnV0ZXMgb2YgdGhlIEhUVFAgY29va2llIHN5c3RlbSBhcyBjb29raWUtYXR0cmlidXRlcywgdG8gZGlzdGluZ3Vpc2gKK3RoZW0gY2xlYXJseSBmcm9tIFB5dGhvbiBhdHRyaWJ1dGVzLgorCitDbGFzcyBkaWFncmFtIChub3RlIHRoYXQgQlNEREJDb29raWVKYXIgYW5kIHRoZSBNU0lFKiBjbGFzc2VzIGFyZSBub3QKK2Rpc3RyaWJ1dGVkIHdpdGggdGhlIFB5dGhvbiBzdGFuZGFyZCBsaWJyYXJ5LCBidXQgYXJlIGF2YWlsYWJsZSBmcm9tCitodHRwOi8vd3d3c2VhcmNoLnNmLm5ldC8pOgorCisgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVKYXJfX19fCisgICAgICAgICAgICAgICAgICAgICAgICAvICAgICBcICAgICAgXAorICAgICAgICAgICAgRmlsZUNvb2tpZUphciAgICAgIFwgICAgICBcCisgICAgICAgICAgICAgLyAgICB8ICAgXCAgICAgICAgIFwgICAgICBcCisgTW96aWxsYUNvb2tpZUphciB8IExXUENvb2tpZUphciBcICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIHwgICAgICBcCisgICAgICAgICAgICAgICAgICB8ICAgLS0tTVNJRUJhc2UgfCAgICAgICBcCisgICAgICAgICAgICAgICAgICB8ICAvICAgICAgfCAgICAgfCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfCAvICAgTVNJRURCQ29va2llSmFyIEJTRERCQ29va2llSmFyCisgICAgICAgICAgICAgICAgICB8LworICAgICAgICAgICAgICAgTVNJRUNvb2tpZUphcgorCisiIiIKKworX19hbGxfXyA9IFsnQ29va2llJywgJ0Nvb2tpZUphcicsICdDb29raWVQb2xpY3knLCAnRGVmYXVsdENvb2tpZVBvbGljeScsCisgICAgICAgICAgICdGaWxlQ29va2llSmFyJywgJ0xXUENvb2tpZUphcicsICdsd3BfY29va2llX3N0cicsICdMb2FkRXJyb3InLAorICAgICAgICAgICAnTW96aWxsYUNvb2tpZUphciddCisKK2ltcG9ydCByZSwgdXJscGFyc2UsIGNvcHksIHRpbWUsIHVybGxpYgordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcgYXMgX3RocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgX3RocmVhZGluZworaW1wb3J0IGh0dHBsaWIgICMgb25seSBmb3IgdGhlIGRlZmF1bHQgSFRUUCBwb3J0Citmcm9tIGNhbGVuZGFyIGltcG9ydCB0aW1lZ20KKworZGVidWcgPSBGYWxzZSAgICMgc2V0IHRvIFRydWUgdG8gZW5hYmxlIGRlYnVnZ2luZyB2aWEgdGhlIGxvZ2dpbmcgbW9kdWxlCitsb2dnZXIgPSBOb25lCisKK2RlZiBfZGVidWcoKmFyZ3MpOgorICAgIGlmIG5vdCBkZWJ1ZzoKKyAgICAgICAgcmV0dXJuCisgICAgZ2xvYmFsIGxvZ2dlcgorICAgIGlmIG5vdCBsb2dnZXI6CisgICAgICAgIGltcG9ydCBsb2dnaW5nCisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb29raWVsaWIiKQorICAgIHJldHVybiBsb2dnZXIuZGVidWcoKmFyZ3MpCisKKworREVGQVVMVF9IVFRQX1BPUlQgPSBzdHIoaHR0cGxpYi5IVFRQX1BPUlQpCitNSVNTSU5HX0ZJTEVOQU1FX1RFWFQgPSAoImEgZmlsZW5hbWUgd2FzIG5vdCBzdXBwbGllZCAobm9yIHdhcyB0aGUgQ29va2llSmFyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2UgaW5pdGlhbGlzZWQgd2l0aCBvbmUpIikKKworZGVmIF93YXJuX3VuaGFuZGxlZF9leGNlcHRpb24oKToKKyAgICAjIFRoZXJlIGFyZSBhIGZldyBjYXRjaC1hbGwgZXhjZXB0OiBzdGF0ZW1lbnRzIGluIHRoaXMgbW9kdWxlLCBmb3IKKyAgICAjIGNhdGNoaW5nIGlucHV0IHRoYXQncyBiYWQgaW4gdW5leHBlY3RlZCB3YXlzLiAgV2FybiBpZiBhbnkKKyAgICAjIGV4Y2VwdGlvbnMgYXJlIGNhdWdodCB0aGVyZS4KKyAgICBpbXBvcnQgd2FybmluZ3MsIHRyYWNlYmFjaywgU3RyaW5nSU8KKyAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgIHRyYWNlYmFjay5wcmludF9leGMoTm9uZSwgZikKKyAgICBtc2cgPSBmLmdldHZhbHVlKCkKKyAgICB3YXJuaW5ncy53YXJuKCJjb29raWVsaWIgYnVnIVxuJXMiICUgbXNnLCBzdGFja2xldmVsPTIpCisKKworIyBEYXRlL3RpbWUgY29udmVyc2lvbgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitFUE9DSF9ZRUFSID0gMTk3MAorZGVmIF90aW1lZ20odHQpOgorICAgIHllYXIsIG1vbnRoLCBtZGF5LCBob3VyLCBtaW4sIHNlYyA9IHR0Wzo2XQorICAgIGlmICgoeWVhciA+PSBFUE9DSF9ZRUFSKSBhbmQgKDEgPD0gbW9udGggPD0gMTIpIGFuZCAoMSA8PSBtZGF5IDw9IDMxKSBhbmQKKyAgICAgICAgKDAgPD0gaG91ciA8PSAyNCkgYW5kICgwIDw9IG1pbiA8PSA1OSkgYW5kICgwIDw9IHNlYyA8PSA2MSkpOgorICAgICAgICByZXR1cm4gdGltZWdtKHR0KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKK0RBWVMgPSBbIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biJdCitNT05USFMgPSBbIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKyAgICAgICAgICAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXQorTU9OVEhTX0xPV0VSID0gW10KK2ZvciBtb250aCBpbiBNT05USFM6IE1PTlRIU19MT1dFUi5hcHBlbmQobW9udGgubG93ZXIoKSkKKworZGVmIHRpbWUyaXNveih0PU5vbmUpOgorICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGltZSBpbiBzZWNvbmRzIHNpbmNlIGVwb2NoLCB0LgorCisgICAgSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IGFuIGFyZ3VtZW50LCBpdCB3aWxsIHVzZSB0aGUgY3VycmVudAorICAgIHRpbWUuCisKKyAgICBUaGUgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgbGlrZSAiWVlZWS1NTS1ERCBoaDptbTpzc1oiLAorICAgIHJlcHJlc2VudGluZyBVbml2ZXJzYWwgVGltZSAoVVRDLCBha2EgR01UKS4gIEFuIGV4YW1wbGUgb2YgdGhpcyBmb3JtYXQgaXM6CisKKyAgICAxOTk0LTExLTI0IDA4OjQ5OjM3WgorCisgICAgIiIiCisgICAgaWYgdCBpcyBOb25lOiB0ID0gdGltZS50aW1lKCkKKyAgICB5ZWFyLCBtb24sIG1kYXksIGhvdXIsIG1pbiwgc2VjID0gdGltZS5nbXRpbWUodClbOjZdCisgICAgcmV0dXJuICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZFoiICUgKAorICAgICAgICB5ZWFyLCBtb24sIG1kYXksIGhvdXIsIG1pbiwgc2VjKQorCitkZWYgdGltZTJuZXRzY2FwZSh0PU5vbmUpOgorICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRpbmcgdGltZSBpbiBzZWNvbmRzIHNpbmNlIGVwb2NoLCB0LgorCisgICAgSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRob3V0IGFuIGFyZ3VtZW50LCBpdCB3aWxsIHVzZSB0aGUgY3VycmVudAorICAgIHRpbWUuCisKKyAgICBUaGUgZm9ybWF0IG9mIHRoZSByZXR1cm5lZCBzdHJpbmcgaXMgbGlrZSB0aGlzOgorCisgICAgV2VkLCBERC1Nb24tWVlZWSBISDpNTTpTUyBHTVQKKworICAgICIiIgorICAgIGlmIHQgaXMgTm9uZTogdCA9IHRpbWUudGltZSgpCisgICAgeWVhciwgbW9uLCBtZGF5LCBob3VyLCBtaW4sIHNlYywgd2RheSA9IHRpbWUuZ210aW1lKHQpWzo3XQorICAgIHJldHVybiAiJXMgJTAyZC0lcy0lMDRkICUwMmQ6JTAyZDolMDJkIEdNVCIgJSAoCisgICAgICAgIERBWVNbd2RheV0sIG1kYXksIE1PTlRIU1ttb24tMV0sIHllYXIsIGhvdXIsIG1pbiwgc2VjKQorCisKK1VUQ19aT05FUyA9IHsiR01UIjogTm9uZSwgIlVUQyI6IE5vbmUsICJVVCI6IE5vbmUsICJaIjogTm9uZX0KKworVElNRVpPTkVfUkUgPSByZS5jb21waWxlKHIiXihbLStdKT8oXGRcZD8pOj8oXGRcZCk/JCIpCitkZWYgb2Zmc2V0X2Zyb21fdHpfc3RyaW5nKHR6KToKKyAgICBvZmZzZXQgPSBOb25lCisgICAgaWYgdHogaW4gVVRDX1pPTkVTOgorICAgICAgICBvZmZzZXQgPSAwCisgICAgZWxzZToKKyAgICAgICAgbSA9IFRJTUVaT05FX1JFLnNlYXJjaCh0eikKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIG9mZnNldCA9IDM2MDAgKiBpbnQobS5ncm91cCgyKSkKKyAgICAgICAgICAgIGlmIG0uZ3JvdXAoMyk6CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0ICsgNjAgKiBpbnQobS5ncm91cCgzKSkKKyAgICAgICAgICAgIGlmIG0uZ3JvdXAoMSkgPT0gJy0nOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IC1vZmZzZXQKKyAgICByZXR1cm4gb2Zmc2V0CisKK2RlZiBfc3RyMnRpbWUoZGF5LCBtb24sIHlyLCBociwgbWluLCBzZWMsIHR6KToKKyAgICAjIHRyYW5zbGF0ZSBtb250aCBuYW1lIHRvIG51bWJlcgorICAgICMgbW9udGggbnVtYmVycyBzdGFydCB3aXRoIDEgKEphbnVhcnkpCisgICAgdHJ5OgorICAgICAgICBtb24gPSBNT05USFNfTE9XRVIuaW5kZXgobW9uLmxvd2VyKCkpKzEKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgIyBtYXliZSBpdCdzIGFscmVhZHkgYSBudW1iZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1vbiA9IGludChtb24pCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgMSA8PSBpbW9uIDw9IDEyOgorICAgICAgICAgICAgbW9uID0gaW1vbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgbWFrZSBzdXJlIGNsb2NrIGVsZW1lbnRzIGFyZSBkZWZpbmVkCisgICAgaWYgaHIgaXMgTm9uZTogaHIgPSAwCisgICAgaWYgbWluIGlzIE5vbmU6IG1pbiA9IDAKKyAgICBpZiBzZWMgaXMgTm9uZTogc2VjID0gMAorCisgICAgeXIgPSBpbnQoeXIpCisgICAgZGF5ID0gaW50KGRheSkKKyAgICBociA9IGludChocikKKyAgICBtaW4gPSBpbnQobWluKQorICAgIHNlYyA9IGludChzZWMpCisKKyAgICBpZiB5ciA8IDEwMDA6CisgICAgICAgICMgZmluZCAib2J2aW91cyIgeWVhcgorICAgICAgICBjdXJfeXIgPSB0aW1lLmxvY2FsdGltZSh0aW1lLnRpbWUoKSlbMF0KKyAgICAgICAgbSA9IGN1cl95ciAlIDEwMAorICAgICAgICB0bXAgPSB5cgorICAgICAgICB5ciA9IHlyICsgY3VyX3lyIC0gbQorICAgICAgICBtID0gbSAtIHRtcAorICAgICAgICBpZiBhYnMobSkgPiA1MDoKKyAgICAgICAgICAgIGlmIG0gPiAwOiB5ciA9IHlyICsgMTAwCisgICAgICAgICAgICBlbHNlOiB5ciA9IHlyIC0gMTAwCisKKyAgICAjIGNvbnZlcnQgVVRDIHRpbWUgdHVwbGUgdG8gc2Vjb25kcyBzaW5jZSBlcG9jaCAobm90IHRpbWV6b25lLWFkanVzdGVkKQorICAgIHQgPSBfdGltZWdtKCh5ciwgbW9uLCBkYXksIGhyLCBtaW4sIHNlYywgdHopKQorCisgICAgaWYgdCBpcyBub3QgTm9uZToKKyAgICAgICAgIyBhZGp1c3QgdGltZSB1c2luZyB0aW1lem9uZSBzdHJpbmcsIHRvIGdldCBhYnNvbHV0ZSB0aW1lIHNpbmNlIGVwb2NoCisgICAgICAgIGlmIHR6IGlzIE5vbmU6CisgICAgICAgICAgICB0eiA9ICJVVEMiCisgICAgICAgIHR6ID0gdHoudXBwZXIoKQorICAgICAgICBvZmZzZXQgPSBvZmZzZXRfZnJvbV90el9zdHJpbmcodHopCisgICAgICAgIGlmIG9mZnNldCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgdCA9IHQgLSBvZmZzZXQKKworICAgIHJldHVybiB0CisKK1NUUklDVF9EQVRFX1JFID0gcmUuY29tcGlsZSgKKyAgICByIl5bU01UV0ZdW2Etel1bYS16XSwgKFxkXGQpIChbSkZNQVNPTkRdW2Etel1bYS16XSkgIgorICAgICIoXGRcZFxkXGQpIChcZFxkKTooXGRcZCk6KFxkXGQpIEdNVCQiKQorV0VFS0RBWV9SRSA9IHJlLmNvbXBpbGUoCisgICAgciJeKD86U3VufE1vbnxUdWV8V2VkfFRodXxGcml8U2F0KVthLXpdKiw/XHMqIiwgcmUuSSkKK0xPT1NFX0hUVFBfREFURV9SRSA9IHJlLmNvbXBpbGUoCisgICAgciIiIl4KKyAgICAoXGRcZD8pICAgICAgICAgICAgIyBkYXkKKyAgICAgICAoPzpccyt8Wy1cL10pCisgICAgKFx3KykgICAgICAgICAgICAgICMgbW9udGgKKyAgICAgICAgKD86XHMrfFstXC9dKQorICAgIChcZCspICAgICAgICAgICAgICAjIHllYXIKKyAgICAoPzoKKyAgICAgICAgICAoPzpccyt8OikgICAgIyBzZXBhcmF0b3IgYmVmb3JlIGNsb2NrCisgICAgICAgKFxkXGQ/KTooXGRcZCkgICMgaG91cjptaW4KKyAgICAgICAoPzo6KFxkXGQpKT8gICAgIyBvcHRpb25hbCBzZWNvbmRzCisgICAgKT8gICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgY2xvY2sKKyAgICAgICBccyoKKyAgICAoWy0rXT9cZHsyLDR9fCg/IVtBUGFwXVtNbV1cYilbQS1aYS16XSspPyAjIHRpbWV6b25lCisgICAgICAgXHMqCisgICAgKD86XChcdytcKSk/ICAgICAgICMgQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgdGltZXpvbmUgaW4gcGFyZW5zLgorICAgICAgIFxzKiQiIiIsIHJlLlgpCitkZWYgaHR0cDJ0aW1lKHRleHQpOgorICAgICIiIlJldHVybnMgdGltZSBpbiBzZWNvbmRzIHNpbmNlIGVwb2NoIG9mIHRpbWUgcmVwcmVzZW50ZWQgYnkgYSBzdHJpbmcuCisKKyAgICBSZXR1cm4gdmFsdWUgaXMgYW4gaW50ZWdlci4KKworICAgIE5vbmUgaXMgcmV0dXJuZWQgaWYgdGhlIGZvcm1hdCBvZiBzdHIgaXMgdW5yZWNvZ25pemVkLCB0aGUgdGltZSBpcyBvdXRzaWRlCisgICAgdGhlIHJlcHJlc2VudGFibGUgcmFuZ2UsIG9yIHRoZSB0aW1lem9uZSBzdHJpbmcgaXMgbm90IHJlY29nbml6ZWQuICBJZiB0aGUKKyAgICBzdHJpbmcgY29udGFpbnMgbm8gdGltZXpvbmUsIFVUQyBpcyBhc3N1bWVkLgorCisgICAgVGhlIHRpbWV6b25lIGluIHRoZSBzdHJpbmcgbWF5IGJlIG51bWVyaWNhbCAobGlrZSAiLTA4MDAiIG9yICIrMDEwMCIpIG9yIGEKKyAgICBzdHJpbmcgdGltZXpvbmUgKGxpa2UgIlVUQyIsICJHTVQiLCAiQlNUIiBvciAiRVNUIikuICBDdXJyZW50bHksIG9ubHkgdGhlCisgICAgdGltZXpvbmUgc3RyaW5ncyBlcXVpdmFsZW50IHRvIFVUQyAoemVybyBvZmZzZXQpIGFyZSBrbm93biB0byB0aGUgZnVuY3Rpb24uCisKKyAgICBUaGUgZnVuY3Rpb24gbG9vc2VseSBwYXJzZXMgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgorCisgICAgV2VkLCAwOSBGZWIgMTk5NCAyMjoyMzozMiBHTVQgICAgICAgLS0gSFRUUCBmb3JtYXQKKyAgICBUdWVzZGF5LCAwOC1GZWItOTQgMTQ6MTU6MjkgR01UICAgICAtLSBvbGQgcmZjODUwIEhUVFAgZm9ybWF0CisgICAgVHVlc2RheSwgMDgtRmViLTE5OTQgMTQ6MTU6MjkgR01UICAgLS0gYnJva2VuIHJmYzg1MCBIVFRQIGZvcm1hdAorICAgIDA5IEZlYiAxOTk0IDIyOjIzOjMyIEdNVCAgICAgICAgICAgIC0tIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5KQorICAgIDA4LUZlYi05NCAxNDoxNToyOSBHTVQgICAgICAgICAgICAgIC0tIHJmYzg1MCBmb3JtYXQgKG5vIHdlZWtkYXkpCisgICAgMDgtRmViLTE5OTQgMTQ6MTU6MjkgR01UICAgICAgICAgICAgLS0gYnJva2VuIHJmYzg1MCBmb3JtYXQgKG5vIHdlZWtkYXkpCisKKyAgICBUaGUgcGFyc2VyIGlnbm9yZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIFRoZSB0aW1lIG1heSBiZQorICAgIGFic2VudC4KKworICAgIElmIHRoZSB5ZWFyIGlzIGdpdmVuIHdpdGggb25seSAyIGRpZ2l0cywgdGhlIGZ1bmN0aW9uIHdpbGwgc2VsZWN0IHRoZQorICAgIGNlbnR1cnkgdGhhdCBtYWtlcyB0aGUgeWVhciBjbG9zZXN0IHRvIHRoZSBjdXJyZW50IGRhdGUuCisKKyAgICAiIiIKKyAgICAjIGZhc3QgZXhpdCBmb3Igc3RyaWN0bHkgY29uZm9ybWluZyBzdHJpbmcKKyAgICBtID0gU1RSSUNUX0RBVEVfUkUuc2VhcmNoKHRleHQpCisgICAgaWYgbToKKyAgICAgICAgZyA9IG0uZ3JvdXBzKCkKKyAgICAgICAgbW9uID0gTU9OVEhTX0xPV0VSLmluZGV4KGdbMV0ubG93ZXIoKSkgKyAxCisgICAgICAgIHR0ID0gKGludChnWzJdKSwgbW9uLCBpbnQoZ1swXSksCisgICAgICAgICAgICAgIGludChnWzNdKSwgaW50KGdbNF0pLCBmbG9hdChnWzVdKSkKKyAgICAgICAgcmV0dXJuIF90aW1lZ20odHQpCisKKyAgICAjIE5vLCB3ZSBuZWVkIHNvbWUgbWVzc3kgcGFyc2luZy4uLgorCisgICAgIyBjbGVhbiB1cAorICAgIHRleHQgPSB0ZXh0LmxzdHJpcCgpCisgICAgdGV4dCA9IFdFRUtEQVlfUkUuc3ViKCIiLCB0ZXh0LCAxKSAgIyBVc2VsZXNzIHdlZWtkYXkKKworICAgICMgdHogaXMgdGltZSB6b25lIHNwZWNpZmllciBzdHJpbmcKKyAgICBkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHogPSBbTm9uZV0qNworCisgICAgIyBsb29zZSByZWdleHAgcGFyc2UKKyAgICBtID0gTE9PU0VfSFRUUF9EQVRFX1JFLnNlYXJjaCh0ZXh0KQorICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgIGRheSwgbW9uLCB5ciwgaHIsIG1pbiwgc2VjLCB0eiA9IG0uZ3JvdXBzKCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZSAgIyBiYWQgZm9ybWF0CisKKyAgICByZXR1cm4gX3N0cjJ0aW1lKGRheSwgbW9uLCB5ciwgaHIsIG1pbiwgc2VjLCB0eikKKworSVNPX0RBVEVfUkUgPSByZS5jb21waWxlKAorICAgICIiIl4KKyAgICAoXGR7NH0pICAgICAgICAgICAgICAjIHllYXIKKyAgICAgICBbLVwvXT8KKyAgICAoXGRcZD8pICAgICAgICAgICAgICAjIG51bWVyaWNhbCBtb250aAorICAgICAgIFstXC9dPworICAgIChcZFxkPykgICAgICAgICAgICAgICMgZGF5CisgICAoPzoKKyAgICAgICAgICg/OlxzK3xbLTpUdF0pICAjIHNlcGFyYXRvciBiZWZvcmUgY2xvY2sKKyAgICAgIChcZFxkPyk6PyhcZFxkKSAgICAjIGhvdXI6bWluCisgICAgICAoPzo6PyhcZFxkKD86XC5cZCopPykpPyAgIyBvcHRpb25hbCBzZWNvbmRzIChhbmQgZnJhY3Rpb25hbCkKKyAgICk/ICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIGNsb2NrCisgICAgICBccyoKKyAgIChbLStdP1xkXGQ/Oj8oOj9cZFxkKT8KKyAgICB8Wnx6KT8gICAgICAgICAgICAgICAjIHRpbWV6b25lICAoWiBpcyAiemVybyBtZXJpZGlhbiIsIGkuZS4gR01UKQorICAgICAgXHMqJCIiIiwgcmUuWCkKK2RlZiBpc28ydGltZSh0ZXh0KToKKyAgICAiIiIKKyAgICBBcyBmb3IgaHR0cDJ0aW1lLCBidXQgcGFyc2VzIHRoZSBJU08gODYwMSBmb3JtYXRzOgorCisgICAgMTk5NC0wMi0wMyAxNDoxNToyOSAtMDEwMCAgICAtLSBJU08gODYwMSBmb3JtYXQKKyAgICAxOTk0LTAyLTAzIDE0OjE1OjI5ICAgICAgICAgIC0tIHpvbmUgaXMgb3B0aW9uYWwKKyAgICAxOTk0LTAyLTAzICAgICAgICAgICAgICAgICAgIC0tIG9ubHkgZGF0ZQorICAgIDE5OTQtMDItMDNUMTQ6MTU6MjkgICAgICAgICAgLS0gVXNlIFQgYXMgc2VwYXJhdG9yCisgICAgMTk5NDAyMDNUMTQxNTI5WiAgICAgICAgICAgICAtLSBJU08gODYwMSBjb21wYWN0IGZvcm1hdAorICAgIDE5OTQwMjAzICAgICAgICAgICAgICAgICAgICAgLS0gb25seSBkYXRlCisKKyAgICAiIiIKKyAgICAjIGNsZWFuIHVwCisgICAgdGV4dCA9IHRleHQubHN0cmlwKCkKKworICAgICMgdHogaXMgdGltZSB6b25lIHNwZWNpZmllciBzdHJpbmcKKyAgICBkYXksIG1vbiwgeXIsIGhyLCBtaW4sIHNlYywgdHogPSBbTm9uZV0qNworCisgICAgIyBsb29zZSByZWdleHAgcGFyc2UKKyAgICBtID0gSVNPX0RBVEVfUkUuc2VhcmNoKHRleHQpCisgICAgaWYgbSBpcyBub3QgTm9uZToKKyAgICAgICAgIyBYWFggdGhlcmUncyBhbiBleHRyYSBiaXQgb2YgdGhlIHRpbWV6b25lIEknbSBpZ25vcmluZyBoZXJlOiBpcworICAgICAgICAjICAgdGhpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8/CisgICAgICAgIHlyLCBtb24sIGRheSwgaHIsIG1pbiwgc2VjLCB0eiwgXyA9IG0uZ3JvdXBzKCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZSAgIyBiYWQgZm9ybWF0CisKKyAgICByZXR1cm4gX3N0cjJ0aW1lKGRheSwgbW9uLCB5ciwgaHIsIG1pbiwgc2VjLCB0eikKKworCisjIEhlYWRlciBwYXJzaW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB1bm1hdGNoZWQobWF0Y2gpOgorICAgICIiIlJldHVybiB1bm1hdGNoZWQgcGFydCBvZiByZS5NYXRjaCBvYmplY3QuIiIiCisgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oMCkKKyAgICByZXR1cm4gbWF0Y2guc3RyaW5nWzpzdGFydF0rbWF0Y2guc3RyaW5nW2VuZDpdCisKK0hFQURFUl9UT0tFTl9SRSA9ICAgICAgICByZS5jb21waWxlKHIiXlxzKihbXj1cczssXSspIikKK0hFQURFUl9RVU9URURfVkFMVUVfUkUgPSByZS5jb21waWxlKHIiXlxzKj1ccypcIihbXlwiXFxdKig/OlxcLlteXCJcXF0qKSopXCIiKQorSEVBREVSX1ZBTFVFX1JFID0gICAgICAgIHJlLmNvbXBpbGUociJeXHMqPVxzKihbXlxzOyxdKikiKQorSEVBREVSX0VTQ0FQRV9SRSA9IHJlLmNvbXBpbGUociJcXCguKSIpCitkZWYgc3BsaXRfaGVhZGVyX3dvcmRzKGhlYWRlcl92YWx1ZXMpOgorICAgIHIiIiJQYXJzZSBoZWFkZXIgdmFsdWVzIGludG8gYSBsaXN0IG9mIGxpc3RzIGNvbnRhaW5pbmcga2V5LHZhbHVlIHBhaXJzLgorCisgICAgVGhlIGZ1bmN0aW9uIGtub3dzIGhvdyB0byBkZWFsIHdpdGggIiwiLCAiOyIgYW5kICI9IiBhcyB3ZWxsIGFzIHF1b3RlZAorICAgIHZhbHVlcyBhZnRlciAiPSIuICBBIGxpc3Qgb2Ygc3BhY2Ugc2VwYXJhdGVkIHRva2VucyBhcmUgcGFyc2VkIGFzIGlmIHRoZXkKKyAgICB3ZXJlIHNlcGFyYXRlZCBieSAiOyIuCisKKyAgICBJZiB0aGUgaGVhZGVyX3ZhbHVlcyBwYXNzZWQgYXMgYXJndW1lbnQgY29udGFpbnMgbXVsdGlwbGUgdmFsdWVzLCB0aGVuIHRoZXkKKyAgICBhcmUgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgYSBzaW5nbGUgdmFsdWUgc2VwYXJhdGVkIGJ5IGNvbW1hICIsIi4KKworICAgIFRoaXMgbWVhbnMgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgcGFyc2luZyBoZWFkZXIgZmllbGRzIHRoYXQKKyAgICBmb2xsb3cgdGhpcyBzeW50YXggKEJORiBhcyBmcm9tIHRoZSBIVFRQLzEuMSBzcGVjaWZpY2F0aW9uLCBidXQgd2UgcmVsYXgKKyAgICB0aGUgcmVxdWlyZW1lbnQgZm9yIHRva2VucykuCisKKyAgICAgIGhlYWRlcnMgICAgICAgICAgID0gI2hlYWRlcgorICAgICAgaGVhZGVyICAgICAgICAgICAgPSAodG9rZW4gfCBwYXJhbWV0ZXIpICooIFsiOyJdICh0b2tlbiB8IHBhcmFtZXRlcikpCisKKyAgICAgIHRva2VuICAgICAgICAgICAgID0gMSo8YW55IENIQVIgZXhjZXB0IENUTHMgb3Igc2VwYXJhdG9ycz4KKyAgICAgIHNlcGFyYXRvcnMgICAgICAgID0gIigiIHwgIikiIHwgIjwiIHwgIj4iIHwgIkAiCisgICAgICAgICAgICAgICAgICAgICAgICB8ICIsIiB8ICI7IiB8ICI6IiB8ICJcIiB8IDwiPgorICAgICAgICAgICAgICAgICAgICAgICAgfCAiLyIgfCAiWyIgfCAiXSIgfCAiPyIgfCAiPSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHwgInsiIHwgIn0iIHwgU1AgfCBIVAorCisgICAgICBxdW90ZWQtc3RyaW5nICAgICA9ICggPCI+ICoocWR0ZXh0IHwgcXVvdGVkLXBhaXIgKSA8Ij4gKQorICAgICAgcWR0ZXh0ICAgICAgICAgICAgPSA8YW55IFRFWFQgZXhjZXB0IDwiPj4KKyAgICAgIHF1b3RlZC1wYWlyICAgICAgID0gIlwiIENIQVIKKworICAgICAgcGFyYW1ldGVyICAgICAgICAgPSBhdHRyaWJ1dGUgIj0iIHZhbHVlCisgICAgICBhdHRyaWJ1dGUgICAgICAgICA9IHRva2VuCisgICAgICB2YWx1ZSAgICAgICAgICAgICA9IHRva2VuIHwgcXVvdGVkLXN0cmluZworCisgICAgRWFjaCBoZWFkZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSBsaXN0IG9mIGtleS92YWx1ZSBwYWlycy4gIFRoZSB2YWx1ZSBmb3IgYQorICAgIHNpbXBsZSB0b2tlbiAobm90IHBhcnQgb2YgYSBwYXJhbWV0ZXIpIGlzIE5vbmUuICBTeW50YWN0aWNhbGx5IGluY29ycmVjdAorICAgIGhlYWRlcnMgd2lsbCBub3QgbmVjZXNzYXJpbHkgYmUgcGFyc2VkIGFzIHlvdSB3b3VsZCB3YW50LgorCisgICAgVGhpcyBpcyBlYXNpZXIgdG8gZGVzY3JpYmUgd2l0aCBzb21lIGV4YW1wbGVzOgorCisgICAgPj4+IHNwbGl0X2hlYWRlcl93b3JkcyhbJ2Zvbz0iYmFyIjsgcG9ydD0iODAsODEiOyBkaXNjYXJkLCBiYXI9YmF6J10pCisgICAgW1soJ2ZvbycsICdiYXInKSwgKCdwb3J0JywgJzgwLDgxJyksICgnZGlzY2FyZCcsIE5vbmUpXSwgWygnYmFyJywgJ2JheicpXV0KKyAgICA+Pj4gc3BsaXRfaGVhZGVyX3dvcmRzKFsndGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIiddKQorICAgIFtbKCd0ZXh0L2h0bWwnLCBOb25lKSwgKCdjaGFyc2V0JywgJ2lzby04ODU5LTEnKV1dCisgICAgPj4+IHNwbGl0X2hlYWRlcl93b3JkcyhbcidCYXNpYyByZWFsbT0iXCJmb29cYmFyXCIiJ10pCisgICAgW1soJ0Jhc2ljJywgTm9uZSksICgncmVhbG0nLCAnImZvb2JhciInKV1dCisKKyAgICAiIiIKKyAgICBhc3NlcnQgbm90IGlzaW5zdGFuY2UoaGVhZGVyX3ZhbHVlcywgYmFzZXN0cmluZykKKyAgICByZXN1bHQgPSBbXQorICAgIGZvciB0ZXh0IGluIGhlYWRlcl92YWx1ZXM6CisgICAgICAgIG9yaWdfdGV4dCA9IHRleHQKKyAgICAgICAgcGFpcnMgPSBbXQorICAgICAgICB3aGlsZSB0ZXh0OgorICAgICAgICAgICAgbSA9IEhFQURFUl9UT0tFTl9SRS5zZWFyY2godGV4dCkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgdGV4dCA9IHVubWF0Y2hlZChtKQorICAgICAgICAgICAgICAgIG5hbWUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgbSA9IEhFQURFUl9RVU9URURfVkFMVUVfUkUuc2VhcmNoKHRleHQpCisgICAgICAgICAgICAgICAgaWYgbTogICMgcXVvdGVkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSB1bm1hdGNoZWQobSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gSEVBREVSX0VTQ0FQRV9SRS5zdWIociJcMSIsIHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG0gPSBIRUFERVJfVkFMVUVfUkUuc2VhcmNoKHRleHQpCisgICAgICAgICAgICAgICAgICAgIGlmIG06ICAjIHVucXVvdGVkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdW5tYXRjaGVkKG0pCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gdmFsdWUsIGEgbG9uZSB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lCisgICAgICAgICAgICAgICAgcGFpcnMuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCisgICAgICAgICAgICBlbGlmIHRleHQubHN0cmlwKCkuc3RhcnRzd2l0aCgiLCIpOgorICAgICAgICAgICAgICAgICMgY29uY2F0ZW5hdGVkIGhlYWRlcnMsIGFzIHBlciBSRkMgMjYxNiBzZWN0aW9uIDQuMgorICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LmxzdHJpcCgpWzE6XQorICAgICAgICAgICAgICAgIGlmIHBhaXJzOiByZXN1bHQuYXBwZW5kKHBhaXJzKQorICAgICAgICAgICAgICAgIHBhaXJzID0gW10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBza2lwIGp1bmsKKyAgICAgICAgICAgICAgICBub25fanVuaywgbnJfanVua19jaGFycyA9IHJlLnN1Ym4oIl5bPVxzO10qIiwgIiIsIHRleHQpCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5yX2p1bmtfY2hhcnMgPiAwLCAoCisgICAgICAgICAgICAgICAgICAgICJzcGxpdF9oZWFkZXJfd29yZHMgYnVnOiAnJXMnLCAnJXMnLCAlcyIgJQorICAgICAgICAgICAgICAgICAgICAob3JpZ190ZXh0LCB0ZXh0LCBwYWlycykpCisgICAgICAgICAgICAgICAgdGV4dCA9IG5vbl9qdW5rCisgICAgICAgIGlmIHBhaXJzOiByZXN1bHQuYXBwZW5kKHBhaXJzKQorICAgIHJldHVybiByZXN1bHQKKworSEVBREVSX0pPSU5fRVNDQVBFX1JFID0gcmUuY29tcGlsZShyIihbXCJcXF0pIikKK2RlZiBqb2luX2hlYWRlcl93b3JkcyhsaXN0cyk6CisgICAgIiIiRG8gdGhlIGludmVyc2UgKGFsbW9zdCkgb2YgdGhlIGNvbnZlcnNpb24gZG9uZSBieSBzcGxpdF9oZWFkZXJfd29yZHMuCisKKyAgICBUYWtlcyBhIGxpc3Qgb2YgbGlzdHMgb2YgKGtleSwgdmFsdWUpIHBhaXJzIGFuZCBwcm9kdWNlcyBhIHNpbmdsZSBoZWFkZXIKKyAgICB2YWx1ZS4gIEF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHF1b3RlZCBpZiBuZWVkZWQuCisKKyAgICA+Pj4gam9pbl9oZWFkZXJfd29yZHMoW1soInRleHQvcGxhaW4iLCBOb25lKSwgKCJjaGFyc2V0IiwgImlzby04ODU5LzEiKV1dKQorICAgICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS8xIicKKyAgICA+Pj4gam9pbl9oZWFkZXJfd29yZHMoW1soInRleHQvcGxhaW4iLCBOb25lKV0sIFsoImNoYXJzZXQiLCAiaXNvLTg4NTkvMSIpXV0pCisgICAgJ3RleHQvcGxhaW4sIGNoYXJzZXQ9Imlzby04ODU5LzEiJworCisgICAgIiIiCisgICAgaGVhZGVycyA9IFtdCisgICAgZm9yIHBhaXJzIGluIGxpc3RzOgorICAgICAgICBhdHRyID0gW10KKyAgICAgICAgZm9yIGssIHYgaW4gcGFpcnM6CisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIG5vdCByZS5zZWFyY2gociJeXHcrJCIsIHYpOgorICAgICAgICAgICAgICAgICAgICB2ID0gSEVBREVSX0pPSU5fRVNDQVBFX1JFLnN1YihyIlxcXDEiLCB2KSAgIyBlc2NhcGUgIiBhbmQgXAorICAgICAgICAgICAgICAgICAgICB2ID0gJyIlcyInICUgdgorICAgICAgICAgICAgICAgIGsgPSAiJXM9JXMiICUgKGssIHYpCisgICAgICAgICAgICBhdHRyLmFwcGVuZChrKQorICAgICAgICBpZiBhdHRyOiBoZWFkZXJzLmFwcGVuZCgiOyAiLmpvaW4oYXR0cikpCisgICAgcmV0dXJuICIsICIuam9pbihoZWFkZXJzKQorCitkZWYgX3N0cmlwX3F1b3Rlcyh0ZXh0KToKKyAgICBpZiB0ZXh0LnN0YXJ0c3dpdGgoJyInKToKKyAgICAgICAgdGV4dCA9IHRleHRbMTpdCisgICAgaWYgdGV4dC5lbmRzd2l0aCgnIicpOgorICAgICAgICB0ZXh0ID0gdGV4dFs6LTFdCisgICAgcmV0dXJuIHRleHQKKworZGVmIHBhcnNlX25zX2hlYWRlcnMobnNfaGVhZGVycyk6CisgICAgIiIiQWQtaG9jIHBhcnNlciBmb3IgTmV0c2NhcGUgcHJvdG9jb2wgY29va2llLWF0dHJpYnV0ZXMuCisKKyAgICBUaGUgb2xkIE5ldHNjYXBlIGNvb2tpZSBmb3JtYXQgZm9yIFNldC1Db29raWUgY2FuIGZvciBpbnN0YW5jZSBjb250YWluCisgICAgYW4gdW5xdW90ZWQgIiwiIGluIHRoZSBleHBpcmVzIGZpZWxkLCBzbyB3ZSBoYXZlIHRvIHVzZSB0aGlzIGFkLWhvYworICAgIHBhcnNlciBpbnN0ZWFkIG9mIHNwbGl0X2hlYWRlcl93b3Jkcy4KKworICAgIFhYWCBUaGlzIG1heSBub3QgbWFrZSB0aGUgYmVzdCBwb3NzaWJsZSBlZmZvcnQgdG8gcGFyc2UgYWxsIHRoZSBjcmFwCisgICAgdGhhdCBOZXRzY2FwZSBDb29raWUgaGVhZGVycyBjb250YWluLiAgUm9uYWxkIFRzY2hhbGFyJ3MgSFRUUENsaWVudAorICAgIHBhcnNlciBpcyBwcm9iYWJseSBiZXR0ZXIsIHNvIGNvdWxkIGRvIHdvcnNlIHRoYW4gZm9sbG93aW5nIHRoYXQgaWYKKyAgICB0aGlzIGV2ZXIgZ2l2ZXMgYW55IHRyb3VibGUuCisKKyAgICBDdXJyZW50bHksIHRoaXMgaXMgYWxzbyB1c2VkIGZvciBwYXJzaW5nIFJGQyAyMTA5IGNvb2tpZXMuCisKKyAgICAiIiIKKyAgICBrbm93bl9hdHRycyA9ICgiZXhwaXJlcyIsICJkb21haW4iLCAicGF0aCIsICJzZWN1cmUiLAorICAgICAgICAgICAgICAgICAgICMgUkZDIDIxMDkgYXR0cnMgKG1heSB0dXJuIHVwIGluIE5ldHNjYXBlIGNvb2tpZXMsIHRvbykKKyAgICAgICAgICAgICAgICAgICAidmVyc2lvbiIsICJwb3J0IiwgIm1heC1hZ2UiKQorCisgICAgcmVzdWx0ID0gW10KKyAgICBmb3IgbnNfaGVhZGVyIGluIG5zX2hlYWRlcnM6CisgICAgICAgIHBhaXJzID0gW10KKyAgICAgICAgdmVyc2lvbl9zZXQgPSBGYWxzZQorICAgICAgICBmb3IgaWksIHBhcmFtIGluIGVudW1lcmF0ZShyZS5zcGxpdChyIjtccyoiLCBuc19oZWFkZXIpKToKKyAgICAgICAgICAgIHBhcmFtID0gcGFyYW0ucnN0cmlwKCkKKyAgICAgICAgICAgIGlmIHBhcmFtID09ICIiOiBjb250aW51ZQorICAgICAgICAgICAgaWYgIj0iIG5vdCBpbiBwYXJhbToKKyAgICAgICAgICAgICAgICBrLCB2ID0gcGFyYW0sIE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaywgdiA9IHJlLnNwbGl0KHIiXHMqPVxzKiIsIHBhcmFtLCAxKQorICAgICAgICAgICAgICAgIGsgPSBrLmxzdHJpcCgpCisgICAgICAgICAgICBpZiBpaSAhPSAwOgorICAgICAgICAgICAgICAgIGxjID0gay5sb3dlcigpCisgICAgICAgICAgICAgICAgaWYgbGMgaW4ga25vd25fYXR0cnM6CisgICAgICAgICAgICAgICAgICAgIGsgPSBsYworICAgICAgICAgICAgICAgIGlmIGsgPT0gInZlcnNpb24iOgorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYW4gUkZDIDIxMDkgY29va2llLgorICAgICAgICAgICAgICAgICAgICB2ID0gX3N0cmlwX3F1b3Rlcyh2KQorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uX3NldCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBrID09ICJleHBpcmVzIjoKKyAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IGV4cGlyZXMgZGF0ZSB0byBzZWNvbmRzIHNpbmNlIGVwb2NoCisgICAgICAgICAgICAgICAgICAgIHYgPSBodHRwMnRpbWUoX3N0cmlwX3F1b3Rlcyh2KSkgICMgTm9uZSBpZiBpbnZhbGlkCisgICAgICAgICAgICBwYWlycy5hcHBlbmQoKGssIHYpKQorCisgICAgICAgIGlmIHBhaXJzOgorICAgICAgICAgICAgaWYgbm90IHZlcnNpb25fc2V0OgorICAgICAgICAgICAgICAgIHBhaXJzLmFwcGVuZCgoInZlcnNpb24iLCAiMCIpKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwYWlycykKKworICAgIHJldHVybiByZXN1bHQKKworCitJUFY0X1JFID0gcmUuY29tcGlsZShyIlwuXGQrJCIpCitkZWYgaXNfSEROKHRleHQpOgorICAgICIiIlJldHVybiBUcnVlIGlmIHRleHQgaXMgYSBob3N0IGRvbWFpbiBuYW1lLiIiIgorICAgICMgWFhYCisgICAgIyBUaGlzIG1heSB3ZWxsIGJlIHdyb25nLiAgV2hpY2ggUkZDIGlzIEhETiBkZWZpbmVkIGluLCBpZiBhbnkgKGZvcgorICAgICMgIHRoZSBwdXJwb3NlcyBvZiBSRkMgMjk2NSk/CisgICAgIyBGb3IgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdoYXQgYWJvdXQgSVB2Nj8gIFJlbWVtYmVyIHRvIGxvb2sKKyAgICAjICBhdCBvdGhlciB1c2VzIG9mIElQVjRfUkUgYWxzbywgaWYgY2hhbmdlIHRoaXMuCisgICAgaWYgSVBWNF9SRS5zZWFyY2godGV4dCk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIHRleHQgPT0gIiI6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIHRleHRbMF0gPT0gIi4iIG9yIHRleHRbLTFdID09ICIuIjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworZGVmIGRvbWFpbl9tYXRjaChBLCBCKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBkb21haW4gQSBkb21haW4tbWF0Y2hlcyBkb21haW4gQiwgYWNjb3JkaW5nIHRvIFJGQyAyOTY1LgorCisgICAgQSBhbmQgQiBtYXkgYmUgaG9zdCBkb21haW4gbmFtZXMgb3IgSVAgYWRkcmVzc2VzLgorCisgICAgUkZDIDI5NjUsIHNlY3Rpb24gMToKKworICAgIEhvc3QgbmFtZXMgY2FuIGJlIHNwZWNpZmllZCBlaXRoZXIgYXMgYW4gSVAgYWRkcmVzcyBvciBhIEhETiBzdHJpbmcuCisgICAgU29tZXRpbWVzIHdlIGNvbXBhcmUgb25lIGhvc3QgbmFtZSB3aXRoIGFub3RoZXIuICAoU3VjaCBjb21wYXJpc29ucyBTSEFMTAorICAgIGJlIGNhc2UtaW5zZW5zaXRpdmUuKSAgSG9zdCBBJ3MgbmFtZSBkb21haW4tbWF0Y2hlcyBob3N0IEIncyBpZgorCisgICAgICAgICAqICB0aGVpciBob3N0IG5hbWUgc3RyaW5ncyBzdHJpbmctY29tcGFyZSBlcXVhbDsgb3IKKworICAgICAgICAgKiBBIGlzIGEgSEROIHN0cmluZyBhbmQgaGFzIHRoZSBmb3JtIE5CLCB3aGVyZSBOIGlzIGEgbm9uLWVtcHR5CisgICAgICAgICAgICBuYW1lIHN0cmluZywgQiBoYXMgdGhlIGZvcm0gLkInLCBhbmQgQicgaXMgYSBIRE4gc3RyaW5nLiAgKFNvLAorICAgICAgICAgICAgeC55LmNvbSBkb21haW4tbWF0Y2hlcyAuWS5jb20gYnV0IG5vdCBZLmNvbS4pCisKKyAgICBOb3RlIHRoYXQgZG9tYWluLW1hdGNoIGlzIG5vdCBhIGNvbW11dGF0aXZlIG9wZXJhdGlvbjogYS5iLmMuY29tCisgICAgZG9tYWluLW1hdGNoZXMgLmMuY29tLCBidXQgbm90IHRoZSByZXZlcnNlLgorCisgICAgIiIiCisgICAgIyBOb3RlIHRoYXQsIGlmIEEgb3IgQiBhcmUgSVAgYWRkcmVzc2VzLCB0aGUgb25seSByZWxldmFudCBwYXJ0IG9mIHRoZQorICAgICMgZGVmaW5pdGlvbiBvZiB0aGUgZG9tYWluLW1hdGNoIGFsZ29yaXRobSBpcyB0aGUgZGlyZWN0IHN0cmluZy1jb21wYXJlLgorICAgIEEgPSBBLmxvd2VyKCkKKyAgICBCID0gQi5sb3dlcigpCisgICAgaWYgQSA9PSBCOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIG5vdCBpc19IRE4oQSk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGkgPSBBLnJmaW5kKEIpCisgICAgaWYgaSA9PSAtMSBvciBpID09IDA6CisgICAgICAgICMgQSBkb2VzIG5vdCBoYXZlIGZvcm0gTkIsIG9yIE4gaXMgdGhlIGVtcHR5IHN0cmluZworICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBub3QgQi5zdGFydHN3aXRoKCIuIik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGlmIG5vdCBpc19IRE4oQlsxOl0pOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgbGliZXJhbF9pc19IRE4odGV4dCk6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgdGV4dCBpcyBhIHNvcnQtb2YtbGlrZSBhIGhvc3QgZG9tYWluIG5hbWUuCisKKyAgICBGb3IgYWNjZXB0aW5nL2Jsb2NraW5nIGRvbWFpbnMuCisKKyAgICAiIiIKKyAgICBpZiBJUFY0X1JFLnNlYXJjaCh0ZXh0KToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIFRydWUKKworZGVmIHVzZXJfZG9tYWluX21hdGNoKEEsIEIpOgorICAgICIiIkZvciBibG9ja2luZy9hY2NlcHRpbmcgZG9tYWlucy4KKworICAgIEEgYW5kIEIgbWF5IGJlIGhvc3QgZG9tYWluIG5hbWVzIG9yIElQIGFkZHJlc3Nlcy4KKworICAgICIiIgorICAgIEEgPSBBLmxvd2VyKCkKKyAgICBCID0gQi5sb3dlcigpCisgICAgaWYgbm90IChsaWJlcmFsX2lzX0hETihBKSBhbmQgbGliZXJhbF9pc19IRE4oQikpOgorICAgICAgICBpZiBBID09IEI6CisgICAgICAgICAgICAjIGVxdWFsIElQIGFkZHJlc3NlcworICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaW5pdGlhbF9kb3QgPSBCLnN0YXJ0c3dpdGgoIi4iKQorICAgIGlmIGluaXRpYWxfZG90IGFuZCBBLmVuZHN3aXRoKEIpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGlmIG5vdCBpbml0aWFsX2RvdCBhbmQgQSA9PSBCOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCitjdXRfcG9ydF9yZSA9IHJlLmNvbXBpbGUociI6XGQrJCIpCitkZWYgcmVxdWVzdF9ob3N0KHJlcXVlc3QpOgorICAgICIiIlJldHVybiByZXF1ZXN0LWhvc3QsIGFzIGRlZmluZWQgYnkgUkZDIDI5NjUuCisKKyAgICBWYXJpYXRpb24gZnJvbSBSRkM6IHJldHVybmVkIHZhbHVlIGlzIGxvd2VyY2FzZWQsIGZvciBjb252ZW5pZW50CisgICAgY29tcGFyaXNvbi4KKworICAgICIiIgorICAgIHVybCA9IHJlcXVlc3QuZ2V0X2Z1bGxfdXJsKCkKKyAgICBob3N0ID0gdXJscGFyc2UudXJscGFyc2UodXJsKVsxXQorICAgIGlmIGhvc3QgPT0gIiI6CisgICAgICAgIGhvc3QgPSByZXF1ZXN0LmdldF9oZWFkZXIoIkhvc3QiLCAiIikKKworICAgICMgcmVtb3ZlIHBvcnQsIGlmIHByZXNlbnQKKyAgICBob3N0ID0gY3V0X3BvcnRfcmUuc3ViKCIiLCBob3N0LCAxKQorICAgIHJldHVybiBob3N0Lmxvd2VyKCkKKworZGVmIGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCk6CisgICAgIiIiUmV0dXJuIGEgdHVwbGUgKHJlcXVlc3QtaG9zdCwgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lKS4KKworICAgIEFzIGRlZmluZWQgYnkgUkZDIDI5NjUsIGV4Y2VwdCBib3RoIGFyZSBsb3dlcmNhc2VkLgorCisgICAgIiIiCisgICAgZXJobiA9IHJlcV9ob3N0ID0gcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgaWYgcmVxX2hvc3QuZmluZCgiLiIpID09IC0xIGFuZCBub3QgSVBWNF9SRS5zZWFyY2gocmVxX2hvc3QpOgorICAgICAgICBlcmhuID0gcmVxX2hvc3QgKyAiLmxvY2FsIgorICAgIHJldHVybiByZXFfaG9zdCwgZXJobgorCitkZWYgcmVxdWVzdF9wYXRoKHJlcXVlc3QpOgorICAgICIiIlBhdGggY29tcG9uZW50IG9mIHJlcXVlc3QtVVJJLCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LiIiIgorICAgIHVybCA9IHJlcXVlc3QuZ2V0X2Z1bGxfdXJsKCkKKyAgICBwYXJ0cyA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKKyAgICBwYXRoID0gZXNjYXBlX3BhdGgocGFydHMucGF0aCkKKyAgICBpZiBub3QgcGF0aC5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICMgZml4IGJhZCBSRkMgMjM5NiBhYnNvbHV0ZVVSSQorICAgICAgICBwYXRoID0gIi8iICsgcGF0aAorICAgIHJldHVybiBwYXRoCisKK2RlZiByZXF1ZXN0X3BvcnQocmVxdWVzdCk6CisgICAgaG9zdCA9IHJlcXVlc3QuZ2V0X2hvc3QoKQorICAgIGkgPSBob3N0LmZpbmQoJzonKQorICAgIGlmIGkgPj0gMDoKKyAgICAgICAgcG9ydCA9IGhvc3RbaSsxOl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW50KHBvcnQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgX2RlYnVnKCJub25udW1lcmljIHBvcnQ6ICclcyciLCBwb3J0KQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICBwb3J0ID0gREVGQVVMVF9IVFRQX1BPUlQKKyAgICByZXR1cm4gcG9ydAorCisjIENoYXJhY3RlcnMgaW4gYWRkaXRpb24gdG8gQS1aLCBhLXosIDAtOSwgJ18nLCAnLicsIGFuZCAnLScgdGhhdCBkb24ndAorIyBuZWVkIHRvIGJlIGVzY2FwZWQgdG8gZm9ybSBhIHZhbGlkIEhUVFAgVVJMIChSRkNzIDIzOTYgYW5kIDE3MzgpLgorSFRUUF9QQVRIX1NBRkUgPSAiJS87OkAmPSskLCF+KicoKSIKK0VTQ0FQRURfQ0hBUl9SRSA9IHJlLmNvbXBpbGUociIlKFswLTlhLWZBLUZdWzAtOWEtZkEtRl0pIikKK2RlZiB1cHBlcmNhc2VfZXNjYXBlZF9jaGFyKG1hdGNoKToKKyAgICByZXR1cm4gIiUlJXMiICUgbWF0Y2guZ3JvdXAoMSkudXBwZXIoKQorZGVmIGVzY2FwZV9wYXRoKHBhdGgpOgorICAgICIiIkVzY2FwZSBhbnkgaW52YWxpZCBjaGFyYWN0ZXJzIGluIEhUVFAgVVJMLCBhbmQgdXBwZXJjYXNlIGFsbCBlc2NhcGVzLiIiIgorICAgICMgVGhlcmUncyBubyBrbm93aW5nIHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHdhcyB1c2VkIHRvIGNyZWF0ZSBVUkxzCisgICAgIyBjb250YWluaW5nICUtZXNjYXBlcywgYnV0IHNpbmNlIHdlIGhhdmUgdG8gcGljayBvbmUgdG8gZXNjYXBlIGludmFsaWQKKyAgICAjIHBhdGggY2hhcmFjdGVycywgd2UgcGljayBVVEYtOCwgYXMgcmVjb21tZW5kZWQgaW4gdGhlIEhUTUwgNC4wCisgICAgIyBzcGVjaWZpY2F0aW9uOgorICAgICMgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MC9hcHBlbmRpeC9ub3Rlcy5odG1sI2gtQi4yLjEKKyAgICAjIEFuZCBoZXJlLCBraW5kIG9mOiBkcmFmdC1maWVsZGluZy11cmktcmZjMjM5NmJpcy0wMworICAgICMgKEFuZCBpbiBkcmFmdCBJUkkgc3BlY2lmaWNhdGlvbjogZHJhZnQtZHVlcnN0LWlyaS0wNSkKKyAgICAjIChBbmQgaGVyZSwgZm9yIG5ldyBVUkkgc2NoZW1lczogUkZDIDI3MTgpCisgICAgaWYgaXNpbnN0YW5jZShwYXRoLCB1bmljb2RlKToKKyAgICAgICAgcGF0aCA9IHBhdGguZW5jb2RlKCJ1dGYtOCIpCisgICAgcGF0aCA9IHVybGxpYi5xdW90ZShwYXRoLCBIVFRQX1BBVEhfU0FGRSkKKyAgICBwYXRoID0gRVNDQVBFRF9DSEFSX1JFLnN1Yih1cHBlcmNhc2VfZXNjYXBlZF9jaGFyLCBwYXRoKQorICAgIHJldHVybiBwYXRoCisKK2RlZiByZWFjaChoKToKKyAgICAiIiJSZXR1cm4gcmVhY2ggb2YgaG9zdCBoLCBhcyBkZWZpbmVkIGJ5IFJGQyAyOTY1LCBzZWN0aW9uIDEuCisKKyAgICBUaGUgcmVhY2ggUiBvZiBhIGhvc3QgbmFtZSBIIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworICAgICAgICogIElmCisKKyAgICAgICAgICAtICBIIGlzIHRoZSBob3N0IGRvbWFpbiBuYW1lIG9mIGEgaG9zdDsgYW5kLAorCisgICAgICAgICAgLSAgSCBoYXMgdGhlIGZvcm0gQS5COyBhbmQKKworICAgICAgICAgIC0gIEEgaGFzIG5vIGVtYmVkZGVkICh0aGF0IGlzLCBpbnRlcmlvcikgZG90czsgYW5kCisKKyAgICAgICAgICAtICBCIGhhcyBhdCBsZWFzdCBvbmUgZW1iZWRkZWQgZG90LCBvciBCIGlzIHRoZSBzdHJpbmcgImxvY2FsIi4KKyAgICAgICAgICAgICB0aGVuIHRoZSByZWFjaCBvZiBIIGlzIC5CLgorCisgICAgICAgKiAgT3RoZXJ3aXNlLCB0aGUgcmVhY2ggb2YgSCBpcyBILgorCisgICAgPj4+IHJlYWNoKCJ3d3cuYWNtZS5jb20iKQorICAgICcuYWNtZS5jb20nCisgICAgPj4+IHJlYWNoKCJhY21lLmNvbSIpCisgICAgJ2FjbWUuY29tJworICAgID4+PiByZWFjaCgiYWNtZS5sb2NhbCIpCisgICAgJy5sb2NhbCcKKworICAgICIiIgorICAgIGkgPSBoLmZpbmQoIi4iKQorICAgIGlmIGkgPj0gMDoKKyAgICAgICAgI2EgPSBoWzppXSAgIyB0aGlzIGxpbmUgaXMgb25seSBoZXJlIHRvIHNob3cgd2hhdCBhIGlzCisgICAgICAgIGIgPSBoW2krMTpdCisgICAgICAgIGkgPSBiLmZpbmQoIi4iKQorICAgICAgICBpZiBpc19IRE4oaCkgYW5kIChpID49IDAgb3IgYiA9PSAibG9jYWwiKToKKyAgICAgICAgICAgIHJldHVybiAiLiIrYgorICAgIHJldHVybiBoCisKK2RlZiBpc190aGlyZF9wYXJ0eShyZXF1ZXN0KToKKyAgICAiIiIKKworICAgIFJGQyAyOTY1LCBzZWN0aW9uIDMuMy42OgorCisgICAgICAgIEFuIHVudmVyaWZpYWJsZSB0cmFuc2FjdGlvbiBpcyB0byBhIHRoaXJkLXBhcnR5IGhvc3QgaWYgaXRzIHJlcXVlc3QtCisgICAgICAgIGhvc3QgVSBkb2VzIG5vdCBkb21haW4tbWF0Y2ggdGhlIHJlYWNoIFIgb2YgdGhlIHJlcXVlc3QtaG9zdCBPIGluIHRoZQorICAgICAgICBvcmlnaW4gdHJhbnNhY3Rpb24uCisKKyAgICAiIiIKKyAgICByZXFfaG9zdCA9IHJlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgIGlmIG5vdCBkb21haW5fbWF0Y2gocmVxX2hvc3QsIHJlYWNoKHJlcXVlc3QuZ2V0X29yaWdpbl9yZXFfaG9zdCgpKSk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgQ29va2llOgorICAgICIiIkhUVFAgQ29va2llLgorCisgICAgVGhpcyBjbGFzcyByZXByZXNlbnRzIGJvdGggTmV0c2NhcGUgYW5kIFJGQyAyOTY1IGNvb2tpZXMuCisKKyAgICBUaGlzIGlzIGRlbGliZXJhdGVseSBhIHZlcnkgc2ltcGxlIGNsYXNzLiAgSXQganVzdCBob2xkcyBhdHRyaWJ1dGVzLiAgSXQncworICAgIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBDb29raWUgaW5zdGFuY2VzIHRoYXQgZG9uJ3QgY29tcGx5IHdpdGggdGhlIGNvb2tpZQorICAgIHN0YW5kYXJkcy4gIENvb2tpZUphci5tYWtlX2Nvb2tpZXMgaXMgdGhlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIENvb2tpZQorICAgIG9iamVjdHMgLS0gaXQgZGVhbHMgd2l0aCBjb29raWUgcGFyc2luZywgc3VwcGx5aW5nIGRlZmF1bHRzLCBhbmQKKyAgICBub3JtYWxpc2luZyB0byB0aGUgcmVwcmVzZW50YXRpb24gdXNlZCBpbiB0aGlzIGNsYXNzLiAgQ29va2llUG9saWN5IGlzCisgICAgcmVzcG9uc2libGUgZm9yIGNoZWNraW5nIHRoZW0gdG8gc2VlIHdoZXRoZXIgdGhleSBzaG91bGQgYmUgYWNjZXB0ZWQgZnJvbQorICAgIGFuZCByZXR1cm5lZCB0byB0aGUgc2VydmVyLgorCisgICAgTm90ZSB0aGF0IHRoZSBwb3J0IG1heSBiZSBwcmVzZW50IGluIHRoZSBoZWFkZXJzLCBidXQgdW5zcGVjaWZpZWQgKCJQb3J0IgorICAgIHJhdGhlciB0aGFuIlBvcnQ9ODAiLCBmb3IgZXhhbXBsZSk7IGlmIHRoaXMgaXMgdGhlIGNhc2UsIHBvcnQgaXMgTm9uZS4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24sIG5hbWUsIHZhbHVlLAorICAgICAgICAgICAgICAgICBwb3J0LCBwb3J0X3NwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgZG9tYWluLCBkb21haW5fc3BlY2lmaWVkLCBkb21haW5faW5pdGlhbF9kb3QsCisgICAgICAgICAgICAgICAgIHBhdGgsIHBhdGhfc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICBzZWN1cmUsCisgICAgICAgICAgICAgICAgIGV4cGlyZXMsCisgICAgICAgICAgICAgICAgIGRpc2NhcmQsCisgICAgICAgICAgICAgICAgIGNvbW1lbnQsCisgICAgICAgICAgICAgICAgIGNvbW1lbnRfdXJsLAorICAgICAgICAgICAgICAgICByZXN0LAorICAgICAgICAgICAgICAgICByZmMyMTA5PUZhbHNlLAorICAgICAgICAgICAgICAgICApOgorCisgICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6IHZlcnNpb24gPSBpbnQodmVyc2lvbikKKyAgICAgICAgaWYgZXhwaXJlcyBpcyBub3QgTm9uZTogZXhwaXJlcyA9IGludChleHBpcmVzKQorICAgICAgICBpZiBwb3J0IGlzIE5vbmUgYW5kIHBvcnRfc3BlY2lmaWVkIGlzIFRydWU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpZiBwb3J0IGlzIE5vbmUsIHBvcnRfc3BlY2lmaWVkIG11c3QgYmUgZmFsc2UiKQorCisgICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLnBvcnRfc3BlY2lmaWVkID0gcG9ydF9zcGVjaWZpZWQKKyAgICAgICAgIyBub3JtYWxpc2UgY2FzZSwgYXMgcGVyIFJGQyAyOTY1IHNlY3Rpb24gMy4zLjMKKyAgICAgICAgc2VsZi5kb21haW4gPSBkb21haW4ubG93ZXIoKQorICAgICAgICBzZWxmLmRvbWFpbl9zcGVjaWZpZWQgPSBkb21haW5fc3BlY2lmaWVkCisgICAgICAgICMgU2lnaC4gIFdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoZSBkb21haW4gZ2l2ZW4gaW4gdGhlCisgICAgICAgICMgY29va2llLWF0dHJpYnV0ZSBoYWQgYW4gaW5pdGlhbCBkb3QsIGluIG9yZGVyIHRvIGZvbGxvdyBSRkMgMjk2NQorICAgICAgICAjIChhcyBjbGFyaWZpZWQgaW4gZHJhZnQgZXJyYXRhKS4gIE5lZWRlZCBmb3IgdGhlIHJldHVybmVkICREb21haW4KKyAgICAgICAgIyB2YWx1ZS4KKyAgICAgICAgc2VsZi5kb21haW5faW5pdGlhbF9kb3QgPSBkb21haW5faW5pdGlhbF9kb3QKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLnBhdGhfc3BlY2lmaWVkID0gcGF0aF9zcGVjaWZpZWQKKyAgICAgICAgc2VsZi5zZWN1cmUgPSBzZWN1cmUKKyAgICAgICAgc2VsZi5leHBpcmVzID0gZXhwaXJlcworICAgICAgICBzZWxmLmRpc2NhcmQgPSBkaXNjYXJkCisgICAgICAgIHNlbGYuY29tbWVudCA9IGNvbW1lbnQKKyAgICAgICAgc2VsZi5jb21tZW50X3VybCA9IGNvbW1lbnRfdXJsCisgICAgICAgIHNlbGYucmZjMjEwOSA9IHJmYzIxMDkKKworICAgICAgICBzZWxmLl9yZXN0ID0gY29weS5jb3B5KHJlc3QpCisKKyAgICBkZWYgaGFzX25vbnN0YW5kYXJkX2F0dHIoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBuYW1lIGluIHNlbGYuX3Jlc3QKKyAgICBkZWYgZ2V0X25vbnN0YW5kYXJkX2F0dHIoc2VsZiwgbmFtZSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jlc3QuZ2V0KG5hbWUsIGRlZmF1bHQpCisgICAgZGVmIHNldF9ub25zdGFuZGFyZF9hdHRyKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fcmVzdFtuYW1lXSA9IHZhbHVlCisKKyAgICBkZWYgaXNfZXhwaXJlZChzZWxmLCBub3c9Tm9uZSk6CisgICAgICAgIGlmIG5vdyBpcyBOb25lOiBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBpZiAoc2VsZi5leHBpcmVzIGlzIG5vdCBOb25lKSBhbmQgKHNlbGYuZXhwaXJlcyA8PSBub3cpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wb3J0IGlzIE5vbmU6IHAgPSAiIgorICAgICAgICBlbHNlOiBwID0gIjoiK3NlbGYucG9ydAorICAgICAgICBsaW1pdCA9IHNlbGYuZG9tYWluICsgcCArIHNlbGYucGF0aAorICAgICAgICBpZiBzZWxmLnZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmFtZXZhbHVlID0gIiVzPSVzIiAlIChzZWxmLm5hbWUsIHNlbGYudmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1ldmFsdWUgPSBzZWxmLm5hbWUKKyAgICAgICAgcmV0dXJuICI8Q29va2llICVzIGZvciAlcz4iICUgKG5hbWV2YWx1ZSwgbGltaXQpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiAoInZlcnNpb24iLCAibmFtZSIsICJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAicG9ydCIsICJwb3J0X3NwZWNpZmllZCIsCisgICAgICAgICAgICAgICAgICAgICAiZG9tYWluIiwgImRvbWFpbl9zcGVjaWZpZWQiLCAiZG9tYWluX2luaXRpYWxfZG90IiwKKyAgICAgICAgICAgICAgICAgICAgICJwYXRoIiwgInBhdGhfc3BlY2lmaWVkIiwKKyAgICAgICAgICAgICAgICAgICAgICJzZWN1cmUiLCAiZXhwaXJlcyIsICJkaXNjYXJkIiwgImNvbW1lbnQiLCAiY29tbWVudF91cmwiLAorICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgIGF0dHIgPSBnZXRhdHRyKHNlbGYsIG5hbWUpCisgICAgICAgICAgICBhcmdzLmFwcGVuZCgiJXM9JXMiICUgKG5hbWUsIHJlcHIoYXR0cikpKQorICAgICAgICBhcmdzLmFwcGVuZCgicmVzdD0lcyIgJSByZXByKHNlbGYuX3Jlc3QpKQorICAgICAgICBhcmdzLmFwcGVuZCgicmZjMjEwOT0lcyIgJSByZXByKHNlbGYucmZjMjEwOSkpCisgICAgICAgIHJldHVybiAiQ29va2llKCVzKSIgJSAiLCAiLmpvaW4oYXJncykKKworCitjbGFzcyBDb29raWVQb2xpY3k6CisgICAgIiIiRGVmaW5lcyB3aGljaCBjb29raWVzIGdldCBhY2NlcHRlZCBmcm9tIGFuZCByZXR1cm5lZCB0byBzZXJ2ZXIuCisKKyAgICBNYXkgYWxzbyBtb2RpZnkgY29va2llcywgdGhvdWdoIHRoaXMgaXMgcHJvYmFibHkgYSBiYWQgaWRlYS4KKworICAgIFRoZSBzdWJjbGFzcyBEZWZhdWx0Q29va2llUG9saWN5IGRlZmluZXMgdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBOZXRzY2FwZQorICAgIGFuZCBSRkMgMjk2NSBjb29raWVzIC0tIG92ZXJyaWRlIHRoYXQgaWYgeW91IHdhbnQgYSBjdXN0b21pc2VkIHBvbGljeS4KKworICAgICIiIgorICAgIGRlZiBzZXRfb2soc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgKGFuZCBvbmx5IGlmKSBjb29raWUgc2hvdWxkIGJlIGFjY2VwdGVkIGZyb20gc2VydmVyLgorCisgICAgICAgIEN1cnJlbnRseSwgcHJlLWV4cGlyZWQgY29va2llcyBuZXZlciBnZXQgdGhpcyBmYXIgLS0gdGhlIENvb2tpZUphcgorICAgICAgICBjbGFzcyBkZWxldGVzIHN1Y2ggY29va2llcyBpdHNlbGYuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoKQorCisgICAgZGVmIHJldHVybl9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAoYW5kIG9ubHkgaWYpIGNvb2tpZSBzaG91bGQgYmUgcmV0dXJuZWQgdG8gc2VydmVyLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBkb21haW5fcmV0dXJuX29rKHNlbGYsIGRvbWFpbiwgcmVxdWVzdCk6CisgICAgICAgICIiIlJldHVybiBmYWxzZSBpZiBjb29raWVzIHNob3VsZCBub3QgYmUgcmV0dXJuZWQsIGdpdmVuIGNvb2tpZSBkb21haW4uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBhdGhfcmV0dXJuX29rKHNlbGYsIHBhdGgsIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gZmFsc2UgaWYgY29va2llcyBzaG91bGQgbm90IGJlIHJldHVybmVkLCBnaXZlbiBjb29raWUgcGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBUcnVlCisKKworY2xhc3MgRGVmYXVsdENvb2tpZVBvbGljeShDb29raWVQb2xpY3kpOgorICAgICIiIkltcGxlbWVudHMgdGhlIHN0YW5kYXJkIHJ1bGVzIGZvciBhY2NlcHRpbmcgYW5kIHJldHVybmluZyBjb29raWVzLiIiIgorCisgICAgRG9tYWluU3RyaWN0Tm9Eb3RzID0gMQorICAgIERvbWFpblN0cmljdE5vbkRvbWFpbiA9IDIKKyAgICBEb21haW5SRkMyOTY1TWF0Y2ggPSA0CisKKyAgICBEb21haW5MaWJlcmFsID0gMAorICAgIERvbWFpblN0cmljdCA9IERvbWFpblN0cmljdE5vRG90c3xEb21haW5TdHJpY3ROb25Eb21haW4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBibG9ja2VkX2RvbWFpbnM9Tm9uZSwgYWxsb3dlZF9kb21haW5zPU5vbmUsCisgICAgICAgICAgICAgICAgIG5ldHNjYXBlPVRydWUsIHJmYzI5NjU9RmFsc2UsCisgICAgICAgICAgICAgICAgIHJmYzIxMDlfYXNfbmV0c2NhcGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgaGlkZV9jb29raWUyPUZhbHNlLAorICAgICAgICAgICAgICAgICBzdHJpY3RfZG9tYWluPUZhbHNlLAorICAgICAgICAgICAgICAgICBzdHJpY3RfcmZjMjk2NV91bnZlcmlmaWFibGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X25zX3VudmVyaWZpYWJsZT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgc3RyaWN0X25zX2RvbWFpbj1Eb21haW5MaWJlcmFsLAorICAgICAgICAgICAgICAgICBzdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyPUZhbHNlLAorICAgICAgICAgICAgICAgICBzdHJpY3RfbnNfc2V0X3BhdGg9RmFsc2UsCisgICAgICAgICAgICAgICAgICk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yIGFyZ3VtZW50cyBzaG91bGQgYmUgcGFzc2VkIGFzIGtleXdvcmQgYXJndW1lbnRzIG9ubHkuIiIiCisgICAgICAgIHNlbGYubmV0c2NhcGUgPSBuZXRzY2FwZQorICAgICAgICBzZWxmLnJmYzI5NjUgPSByZmMyOTY1CisgICAgICAgIHNlbGYucmZjMjEwOV9hc19uZXRzY2FwZSA9IHJmYzIxMDlfYXNfbmV0c2NhcGUKKyAgICAgICAgc2VsZi5oaWRlX2Nvb2tpZTIgPSBoaWRlX2Nvb2tpZTIKKyAgICAgICAgc2VsZi5zdHJpY3RfZG9tYWluID0gc3RyaWN0X2RvbWFpbgorICAgICAgICBzZWxmLnN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZSA9IHN0cmljdF9yZmMyOTY1X3VudmVyaWZpYWJsZQorICAgICAgICBzZWxmLnN0cmljdF9uc191bnZlcmlmaWFibGUgPSBzdHJpY3RfbnNfdW52ZXJpZmlhYmxlCisgICAgICAgIHNlbGYuc3RyaWN0X25zX2RvbWFpbiA9IHN0cmljdF9uc19kb21haW4KKyAgICAgICAgc2VsZi5zdHJpY3RfbnNfc2V0X2luaXRpYWxfZG9sbGFyID0gc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhcgorICAgICAgICBzZWxmLnN0cmljdF9uc19zZXRfcGF0aCA9IHN0cmljdF9uc19zZXRfcGF0aAorCisgICAgICAgIGlmIGJsb2NrZWRfZG9tYWlucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2Jsb2NrZWRfZG9tYWlucyA9IHR1cGxlKGJsb2NrZWRfZG9tYWlucykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Jsb2NrZWRfZG9tYWlucyA9ICgpCisKKyAgICAgICAgaWYgYWxsb3dlZF9kb21haW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYWxsb3dlZF9kb21haW5zID0gdHVwbGUoYWxsb3dlZF9kb21haW5zKQorICAgICAgICBzZWxmLl9hbGxvd2VkX2RvbWFpbnMgPSBhbGxvd2VkX2RvbWFpbnMKKworICAgIGRlZiBibG9ja2VkX2RvbWFpbnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc2VxdWVuY2Ugb2YgYmxvY2tlZCBkb21haW5zIChhcyBhIHR1cGxlKS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Jsb2NrZWRfZG9tYWlucworICAgIGRlZiBzZXRfYmxvY2tlZF9kb21haW5zKHNlbGYsIGJsb2NrZWRfZG9tYWlucyk6CisgICAgICAgICIiIlNldCB0aGUgc2VxdWVuY2Ugb2YgYmxvY2tlZCBkb21haW5zLiIiIgorICAgICAgICBzZWxmLl9ibG9ja2VkX2RvbWFpbnMgPSB0dXBsZShibG9ja2VkX2RvbWFpbnMpCisKKyAgICBkZWYgaXNfYmxvY2tlZChzZWxmLCBkb21haW4pOgorICAgICAgICBmb3IgYmxvY2tlZF9kb21haW4gaW4gc2VsZi5fYmxvY2tlZF9kb21haW5zOgorICAgICAgICAgICAgaWYgdXNlcl9kb21haW5fbWF0Y2goZG9tYWluLCBibG9ja2VkX2RvbWFpbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYWxsb3dlZF9kb21haW5zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gTm9uZSwgb3IgdGhlIHNlcXVlbmNlIG9mIGFsbG93ZWQgZG9tYWlucyAoYXMgYSB0dXBsZSkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9hbGxvd2VkX2RvbWFpbnMKKyAgICBkZWYgc2V0X2FsbG93ZWRfZG9tYWlucyhzZWxmLCBhbGxvd2VkX2RvbWFpbnMpOgorICAgICAgICAiIiJTZXQgdGhlIHNlcXVlbmNlIG9mIGFsbG93ZWQgZG9tYWlucywgb3IgTm9uZS4iIiIKKyAgICAgICAgaWYgYWxsb3dlZF9kb21haW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYWxsb3dlZF9kb21haW5zID0gdHVwbGUoYWxsb3dlZF9kb21haW5zKQorICAgICAgICBzZWxmLl9hbGxvd2VkX2RvbWFpbnMgPSBhbGxvd2VkX2RvbWFpbnMKKworICAgIGRlZiBpc19ub3RfYWxsb3dlZChzZWxmLCBkb21haW4pOgorICAgICAgICBpZiBzZWxmLl9hbGxvd2VkX2RvbWFpbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgYWxsb3dlZF9kb21haW4gaW4gc2VsZi5fYWxsb3dlZF9kb21haW5zOgorICAgICAgICAgICAgaWYgdXNlcl9kb21haW5fbWF0Y2goZG9tYWluLCBhbGxvd2VkX2RvbWFpbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICIiIgorICAgICAgICBJZiB5b3Ugb3ZlcnJpZGUgLnNldF9vaygpLCBiZSBzdXJlIHRvIGNhbGwgdGhpcyBtZXRob2QuICBJZiBpdCByZXR1cm5zCisgICAgICAgIGZhbHNlLCBzbyBzaG91bGQgeW91ciBzdWJjbGFzcyAoYXNzdW1pbmcgeW91ciBzdWJjbGFzcyB3YW50cyB0byBiZSBtb3JlCisgICAgICAgIHN0cmljdCBhYm91dCB3aGljaCBjb29raWVzIHRvIGFjY2VwdCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIF9kZWJ1ZygiIC0gY2hlY2tpbmcgY29va2llICVzPSVzIiwgY29va2llLm5hbWUsIGNvb2tpZS52YWx1ZSkKKworICAgICAgICBhc3NlcnQgY29va2llLm5hbWUgaXMgbm90IE5vbmUKKworICAgICAgICBmb3IgbiBpbiAidmVyc2lvbiIsICJ2ZXJpZmlhYmlsaXR5IiwgIm5hbWUiLCAicGF0aCIsICJkb21haW4iLCAicG9ydCI6CisgICAgICAgICAgICBmbl9uYW1lID0gInNldF9va18iK24KKyAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzZWxmLCBmbl9uYW1lKQorICAgICAgICAgICAgaWYgbm90IGZuKGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfb2tfdmVyc2lvbihzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBjb29raWUudmVyc2lvbiBpcyBOb25lOgorICAgICAgICAgICAgIyBWZXJzaW9uIGlzIGFsd2F5cyBzZXQgdG8gMCBieSBwYXJzZV9uc19oZWFkZXJzIGlmIGl0J3MgYSBOZXRzY2FwZQorICAgICAgICAgICAgIyBjb29raWUsIHNvIHRoaXMgbXVzdCBiZSBhbiBpbnZhbGlkIFJGQyAyOTY1IGNvb2tpZS4KKyAgICAgICAgICAgIF9kZWJ1ZygiICAgU2V0LUNvb2tpZTIgd2l0aG91dCB2ZXJzaW9uIGF0dHJpYnV0ZSAoJXM9JXMpIiwKKyAgICAgICAgICAgICAgICAgICBjb29raWUubmFtZSwgY29va2llLnZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID4gMCBhbmQgbm90IHNlbGYucmZjMjk2NToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgUkZDIDI5NjUgY29va2llcyBhcmUgc3dpdGNoZWQgb2ZmIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIG5vdCBzZWxmLm5ldHNjYXBlOgorICAgICAgICAgICAgX2RlYnVnKCIgICBOZXRzY2FwZSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3ZlcmlmaWFiaWxpdHkoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgcmVxdWVzdC5pc191bnZlcmlmaWFibGUoKSBhbmQgaXNfdGhpcmRfcGFydHkocmVxdWVzdCk6CisgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIHNlbGYuc3RyaWN0X3JmYzI5NjVfdW52ZXJpZmlhYmxlOgorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgdGhpcmQtcGFydHkgUkZDIDI5NjUgY29va2llIGR1cmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnZlcmlmaWFibGUgdHJhbnNhY3Rpb24iKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxpZiBjb29raWUudmVyc2lvbiA9PSAwIGFuZCBzZWxmLnN0cmljdF9uc191bnZlcmlmaWFibGU6CisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICB0aGlyZC1wYXJ0eSBOZXRzY2FwZSBjb29raWUgZHVyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVudmVyaWZpYWJsZSB0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX25hbWUoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgIyBUcnkgYW5kIHN0b3Agc2VydmVycyBzZXR0aW5nIFYwIGNvb2tpZXMgZGVzaWduZWQgdG8gaGFjayBvdGhlcgorICAgICAgICAjIHNlcnZlcnMgdGhhdCBrbm93IGJvdGggVjAgYW5kIFYxIHByb3RvY29scy4KKyAgICAgICAgaWYgKGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIHNlbGYuc3RyaWN0X25zX3NldF9pbml0aWFsX2RvbGxhciBhbmQKKyAgICAgICAgICAgIGNvb2tpZS5uYW1lLnN0YXJ0c3dpdGgoIiQiKSk6CisgICAgICAgICAgICBfZGVidWcoIiAgIGlsbGVnYWwgbmFtZSAoc3RhcnRzIHdpdGggJyQnKTogJyVzJyIsIGNvb2tpZS5uYW1lKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2V0X29rX3BhdGgoc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnBhdGhfc3BlY2lmaWVkOgorICAgICAgICAgICAgcmVxX3BhdGggPSByZXF1ZXN0X3BhdGgocmVxdWVzdCkKKyAgICAgICAgICAgIGlmICgoY29va2llLnZlcnNpb24gPiAwIG9yCisgICAgICAgICAgICAgICAgIChjb29raWUudmVyc2lvbiA9PSAwIGFuZCBzZWxmLnN0cmljdF9uc19zZXRfcGF0aCkpIGFuZAorICAgICAgICAgICAgICAgIG5vdCByZXFfcGF0aC5zdGFydHN3aXRoKGNvb2tpZS5wYXRoKSk6CisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBwYXRoIGF0dHJpYnV0ZSAlcyBpcyBub3QgYSBwcmVmaXggb2YgcmVxdWVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICJwYXRoICVzIiwgY29va2llLnBhdGgsIHJlcV9wYXRoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNldF9va19kb21haW4oc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgc2VsZi5pc19ibG9ja2VkKGNvb2tpZS5kb21haW4pOgorICAgICAgICAgICAgX2RlYnVnKCIgICBkb21haW4gJXMgaXMgaW4gdXNlciBibG9jay1saXN0IiwgY29va2llLmRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmlzX25vdF9hbGxvd2VkKGNvb2tpZS5kb21haW4pOgorICAgICAgICAgICAgX2RlYnVnKCIgICBkb21haW4gJXMgaXMgbm90IGluIHVzZXIgYWxsb3ctbGlzdCIsIGNvb2tpZS5kb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgY29va2llLmRvbWFpbl9zcGVjaWZpZWQ6CisgICAgICAgICAgICByZXFfaG9zdCwgZXJobiA9IGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICAgICAgICAgIGRvbWFpbiA9IGNvb2tpZS5kb21haW4KKyAgICAgICAgICAgIGlmIHNlbGYuc3RyaWN0X2RvbWFpbiBhbmQgKGRvbWFpbi5jb3VudCgiLiIpID49IDIpOgorICAgICAgICAgICAgICAgICMgWFhYIFRoaXMgc2hvdWxkIHByb2JhYmx5IGJlIGNvbXBhcmVkIHdpdGggdGhlIEtvbnF1ZXJvcgorICAgICAgICAgICAgICAgICMgKGtjb29raWVqYXIuY3BwKSBhbmQgTW96aWxsYSBpbXBsZW1lbnRhdGlvbnMsIGJ1dCBpdCdzIGEKKyAgICAgICAgICAgICAgICAjIGxvc2luZyBiYXR0bGUuCisgICAgICAgICAgICAgICAgaSA9IGRvbWFpbi5yZmluZCgiLiIpCisgICAgICAgICAgICAgICAgaiA9IGRvbWFpbi5yZmluZCgiLiIsIDAsIGkpCisgICAgICAgICAgICAgICAgaWYgaiA9PSAwOiAgIyBkb21haW4gbGlrZSAuZm9vLmJhcgorICAgICAgICAgICAgICAgICAgICB0bGQgPSBkb21haW5baSsxOl0KKyAgICAgICAgICAgICAgICAgICAgc2xkID0gZG9tYWluW2orMTppXQorICAgICAgICAgICAgICAgICAgICBpZiBzbGQubG93ZXIoKSBpbiAoImNvIiwgImFjIiwgImNvbSIsICJlZHUiLCAib3JnIiwgIm5ldCIsCisgICAgICAgICAgICAgICAgICAgICAgICJnb3YiLCAibWlsIiwgImludCIsICJhZXJvIiwgImJpeiIsICJjYXQiLCAiY29vcCIsCisgICAgICAgICAgICAgICAgICAgICAgICJpbmZvIiwgImpvYnMiLCAibW9iaSIsICJtdXNldW0iLCAibmFtZSIsICJwcm8iLAorICAgICAgICAgICAgICAgICAgICAgICAidHJhdmVsIiwgImV1IikgYW5kIGxlbih0bGQpID09IDI6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGRvbWFpbiBsaWtlIC5jby51aworICAgICAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBjb3VudHJ5LWNvZGUgc2Vjb25kIGxldmVsIGRvbWFpbiAlcyIsIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgZG9tYWluLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgICAgICB1bmRvdHRlZF9kb21haW4gPSBkb21haW5bMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHVuZG90dGVkX2RvbWFpbiA9IGRvbWFpbgorICAgICAgICAgICAgZW1iZWRkZWRfZG90cyA9ICh1bmRvdHRlZF9kb21haW4uZmluZCgiLiIpID49IDApCisgICAgICAgICAgICBpZiBub3QgZW1iZWRkZWRfZG90cyBhbmQgZG9tYWluICE9ICIubG9jYWwiOgorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbm9uLWxvY2FsIGRvbWFpbiAlcyBjb250YWlucyBubyBlbWJlZGRlZCBkb3QiLAorICAgICAgICAgICAgICAgICAgICAgICBkb21haW4pCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiBjb29raWUudmVyc2lvbiA9PSAwOgorICAgICAgICAgICAgICAgIGlmIChub3QgZXJobi5lbmRzd2l0aChkb21haW4pIGFuZAorICAgICAgICAgICAgICAgICAgICAobm90IGVyaG4uc3RhcnRzd2l0aCgiLiIpIGFuZAorICAgICAgICAgICAgICAgICAgICAgbm90ICgiLiIrZXJobikuZW5kc3dpdGgoZG9tYWluKSkpOgorICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIGVmZmVjdGl2ZSByZXF1ZXN0LWhvc3QgJXMgKGV2ZW4gd2l0aCBhZGRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5pdGlhbCBkb3QpIGRvZXMgbm90IGVuZCB3aXRoICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyaG4sIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiAoY29va2llLnZlcnNpb24gPiAwIG9yCisgICAgICAgICAgICAgICAgKHNlbGYuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuRG9tYWluUkZDMjk2NU1hdGNoKSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGRvbWFpbl9tYXRjaChlcmhuLCBkb21haW4pOgorICAgICAgICAgICAgICAgICAgICBfZGVidWcoIiAgIGVmZmVjdGl2ZSByZXF1ZXN0LWhvc3QgJXMgZG9lcyBub3QgZG9tYWluLW1hdGNoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyIsIGVyaG4sIGRvbWFpbikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBpZiAoY29va2llLnZlcnNpb24gPiAwIG9yCisgICAgICAgICAgICAgICAgKHNlbGYuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuRG9tYWluU3RyaWN0Tm9Eb3RzKSk6CisgICAgICAgICAgICAgICAgaG9zdF9wcmVmaXggPSByZXFfaG9zdFs6LWxlbihkb21haW4pXQorICAgICAgICAgICAgICAgIGlmIChob3N0X3ByZWZpeC5maW5kKCIuIikgPj0gMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgbm90IElQVjRfUkUuc2VhcmNoKHJlcV9ob3N0KSk6CisgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgaG9zdCBwcmVmaXggJXMgZm9yIGRvbWFpbiAlcyBjb250YWlucyBhIGRvdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0X3ByZWZpeCwgZG9tYWluKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZXRfb2tfcG9ydChzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiBjb29raWUucG9ydF9zcGVjaWZpZWQ6CisgICAgICAgICAgICByZXFfcG9ydCA9IHJlcXVlc3RfcG9ydChyZXF1ZXN0KQorICAgICAgICAgICAgaWYgcmVxX3BvcnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXFfcG9ydCA9ICI4MCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVxX3BvcnQgPSBzdHIocmVxX3BvcnQpCisgICAgICAgICAgICBmb3IgcCBpbiBjb29raWUucG9ydC5zcGxpdCgiLCIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW50KHApCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgYmFkIHBvcnQgJXMgKG5vdCBudW1lcmljKSIsIHApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgIGlmIHAgPT0gcmVxX3BvcnQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgcmVxdWVzdCBwb3J0ICglcykgbm90IGZvdW5kIGluICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxX3BvcnQsIGNvb2tpZS5wb3J0KQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAiIiIKKyAgICAgICAgSWYgeW91IG92ZXJyaWRlIC5yZXR1cm5fb2soKSwgYmUgc3VyZSB0byBjYWxsIHRoaXMgbWV0aG9kLiAgSWYgaXQKKyAgICAgICAgcmV0dXJucyBmYWxzZSwgc28gc2hvdWxkIHlvdXIgc3ViY2xhc3MgKGFzc3VtaW5nIHlvdXIgc3ViY2xhc3Mgd2FudHMgdG8KKyAgICAgICAgYmUgbW9yZSBzdHJpY3QgYWJvdXQgd2hpY2ggY29va2llcyB0byByZXR1cm4pLgorCisgICAgICAgICIiIgorICAgICAgICAjIFBhdGggaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGJ5IC5wYXRoX3JldHVybl9vaygpLCBhbmQgZG9tYWluCisgICAgICAgICMgYmxvY2tpbmcgZG9uZSBieSAuZG9tYWluX3JldHVybl9vaygpLgorICAgICAgICBfZGVidWcoIiAtIGNoZWNraW5nIGNvb2tpZSAlcz0lcyIsIGNvb2tpZS5uYW1lLCBjb29raWUudmFsdWUpCisKKyAgICAgICAgZm9yIG4gaW4gInZlcnNpb24iLCAidmVyaWZpYWJpbGl0eSIsICJzZWN1cmUiLCAiZXhwaXJlcyIsICJwb3J0IiwgImRvbWFpbiI6CisgICAgICAgICAgICBmbl9uYW1lID0gInJldHVybl9va18iK24KKyAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzZWxmLCBmbl9uYW1lKQorICAgICAgICAgICAgaWYgbm90IGZuKGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmV0dXJuX29rX3ZlcnNpb24oc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gPiAwIGFuZCBub3Qgc2VsZi5yZmMyOTY1OgorICAgICAgICAgICAgX2RlYnVnKCIgICBSRkMgMjk2NSBjb29raWVzIGFyZSBzd2l0Y2hlZCBvZmYiKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgbm90IHNlbGYubmV0c2NhcGU6CisgICAgICAgICAgICBfZGVidWcoIiAgIE5ldHNjYXBlIGNvb2tpZXMgYXJlIHN3aXRjaGVkIG9mZiIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2tfdmVyaWZpYWJpbGl0eShzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICBpZiByZXF1ZXN0LmlzX3VudmVyaWZpYWJsZSgpIGFuZCBpc190aGlyZF9wYXJ0eShyZXF1ZXN0KToKKyAgICAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID4gMCBhbmQgc2VsZi5zdHJpY3RfcmZjMjk2NV91bnZlcmlmaWFibGU6CisgICAgICAgICAgICAgICAgX2RlYnVnKCIgICB0aGlyZC1wYXJ0eSBSRkMgMjk2NSBjb29raWUgZHVyaW5nIHVudmVyaWZpYWJsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbGlmIGNvb2tpZS52ZXJzaW9uID09IDAgYW5kIHNlbGYuc3RyaWN0X25zX3VudmVyaWZpYWJsZToKKyAgICAgICAgICAgICAgICBfZGVidWcoIiAgIHRoaXJkLXBhcnR5IE5ldHNjYXBlIGNvb2tpZSBkdXJpbmcgdW52ZXJpZmlhYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgInRyYW5zYWN0aW9uIikKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiByZXR1cm5fb2tfc2VjdXJlKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5zZWN1cmUgYW5kIHJlcXVlc3QuZ2V0X3R5cGUoKSAhPSAiaHR0cHMiOgorICAgICAgICAgICAgX2RlYnVnKCIgICBzZWN1cmUgY29va2llIHdpdGggbm9uLXNlY3VyZSByZXF1ZXN0IikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va19leHBpcmVzKHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5pc19leHBpcmVkKHNlbGYuX25vdyk6CisgICAgICAgICAgICBfZGVidWcoIiAgIGNvb2tpZSBleHBpcmVkIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va19wb3J0KHNlbGYsIGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgIGlmIGNvb2tpZS5wb3J0OgorICAgICAgICAgICAgcmVxX3BvcnQgPSByZXF1ZXN0X3BvcnQocmVxdWVzdCkKKyAgICAgICAgICAgIGlmIHJlcV9wb3J0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmVxX3BvcnQgPSAiODAiCisgICAgICAgICAgICBmb3IgcCBpbiBjb29raWUucG9ydC5zcGxpdCgiLCIpOgorICAgICAgICAgICAgICAgIGlmIHAgPT0gcmVxX3BvcnQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgcmVxdWVzdCBwb3J0ICVzIGRvZXMgbm90IG1hdGNoIGNvb2tpZSBwb3J0ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVxX3BvcnQsIGNvb2tpZS5wb3J0KQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJldHVybl9va19kb21haW4oc2VsZiwgY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgcmVxX2hvc3QsIGVyaG4gPSBlZmZfcmVxdWVzdF9ob3N0KHJlcXVlc3QpCisgICAgICAgIGRvbWFpbiA9IGNvb2tpZS5kb21haW4KKworICAgICAgICAjIHN0cmljdCBjaGVjayBvZiBub24tZG9tYWluIGNvb2tpZXM6IE1vemlsbGEgZG9lcyB0aGlzLCBNU0lFNSBkb2Vzbid0CisgICAgICAgIGlmIChjb29raWUudmVyc2lvbiA9PSAwIGFuZAorICAgICAgICAgICAgKHNlbGYuc3RyaWN0X25zX2RvbWFpbiAmIHNlbGYuRG9tYWluU3RyaWN0Tm9uRG9tYWluKSBhbmQKKyAgICAgICAgICAgIG5vdCBjb29raWUuZG9tYWluX3NwZWNpZmllZCBhbmQgZG9tYWluICE9IGVyaG4pOgorICAgICAgICAgICAgX2RlYnVnKCIgICBjb29raWUgd2l0aCB1bnNwZWNpZmllZCBkb21haW4gZG9lcyBub3Qgc3RyaW5nLWNvbXBhcmUgIgorICAgICAgICAgICAgICAgICAgICJlcXVhbCB0byByZXF1ZXN0IGRvbWFpbiIpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBjb29raWUudmVyc2lvbiA+IDAgYW5kIG5vdCBkb21haW5fbWF0Y2goZXJobiwgZG9tYWluKToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lICVzIGRvZXMgbm90IGRvbWFpbi1tYXRjaCAiCisgICAgICAgICAgICAgICAgICAgIlJGQyAyOTY1IGNvb2tpZSBkb21haW4gJXMiLCBlcmhuLCBkb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgY29va2llLnZlcnNpb24gPT0gMCBhbmQgbm90ICgiLiIrZXJobikuZW5kc3dpdGgoZG9tYWluKToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgcmVxdWVzdC1ob3N0ICVzIGRvZXMgbm90IG1hdGNoIE5ldHNjYXBlIGNvb2tpZSBkb21haW4gIgorICAgICAgICAgICAgICAgICAgICIlcyIsIHJlcV9ob3N0LCBkb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBkb21haW5fcmV0dXJuX29rKHNlbGYsIGRvbWFpbiwgcmVxdWVzdCk6CisgICAgICAgICMgTGliZXJhbCBjaGVjayBvZi4gIFRoaXMgaXMgaGVyZSBhcyBhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQKKyAgICAgICAgIyBoYXZpbmcgdG8gbG9hZCBsb3RzIG9mIE1TSUUgY29va2llIGZpbGVzIHVubGVzcyBuZWNlc3NhcnkuCisgICAgICAgIHJlcV9ob3N0LCBlcmhuID0gZWZmX3JlcXVlc3RfaG9zdChyZXF1ZXN0KQorICAgICAgICBpZiBub3QgcmVxX2hvc3Quc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICAgICAgcmVxX2hvc3QgPSAiLiIrcmVxX2hvc3QKKyAgICAgICAgaWYgbm90IGVyaG4uc3RhcnRzd2l0aCgiLiIpOgorICAgICAgICAgICAgZXJobiA9ICIuIitlcmhuCisgICAgICAgIGlmIG5vdCAocmVxX2hvc3QuZW5kc3dpdGgoZG9tYWluKSBvciBlcmhuLmVuZHN3aXRoKGRvbWFpbikpOgorICAgICAgICAgICAgI19kZWJ1ZygiICAgcmVxdWVzdCBkb21haW4gJXMgZG9lcyBub3QgbWF0Y2ggY29va2llIGRvbWFpbiAlcyIsCisgICAgICAgICAgICAjICAgICAgIHJlcV9ob3N0LCBkb21haW4pCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBpZiBzZWxmLmlzX2Jsb2NrZWQoZG9tYWluKToKKyAgICAgICAgICAgIF9kZWJ1ZygiICAgZG9tYWluICVzIGlzIGluIHVzZXIgYmxvY2stbGlzdCIsIGRvbWFpbikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmlzX25vdF9hbGxvd2VkKGRvbWFpbik6CisgICAgICAgICAgICBfZGVidWcoIiAgIGRvbWFpbiAlcyBpcyBub3QgaW4gdXNlciBhbGxvdy1saXN0IiwgZG9tYWluKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBwYXRoX3JldHVybl9vayhzZWxmLCBwYXRoLCByZXF1ZXN0KToKKyAgICAgICAgX2RlYnVnKCItIGNoZWNraW5nIGNvb2tpZSBwYXRoPSVzIiwgcGF0aCkKKyAgICAgICAgcmVxX3BhdGggPSByZXF1ZXN0X3BhdGgocmVxdWVzdCkKKyAgICAgICAgaWYgbm90IHJlcV9wYXRoLnN0YXJ0c3dpdGgocGF0aCk6CisgICAgICAgICAgICBfZGVidWcoIiAgJXMgZG9lcyBub3QgcGF0aC1tYXRjaCAlcyIsIHJlcV9wYXRoLCBwYXRoKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKworZGVmIHZhbHNfc29ydGVkX2J5X2tleShhZGljdCk6CisgICAga2V5cyA9IGFkaWN0LmtleXMoKQorICAgIGtleXMuc29ydCgpCisgICAgcmV0dXJuIG1hcChhZGljdC5nZXQsIGtleXMpCisKK2RlZiBkZWVwdmFsdWVzKG1hcHBpbmcpOgorICAgICIiIkl0ZXJhdGVzIG92ZXIgbmVzdGVkIG1hcHBpbmcsIGRlcHRoLWZpcnN0LCBpbiBzb3J0ZWQgb3JkZXIgYnkga2V5LiIiIgorICAgIHZhbHVlcyA9IHZhbHNfc29ydGVkX2J5X2tleShtYXBwaW5nKQorICAgIGZvciBvYmogaW4gdmFsdWVzOgorICAgICAgICBtYXBwaW5nID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqLml0ZW1zCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1hcHBpbmcgPSBUcnVlCisgICAgICAgICAgICBmb3Igc3Vib2JqIGluIGRlZXB2YWx1ZXMob2JqKToKKyAgICAgICAgICAgICAgICB5aWVsZCBzdWJvYmoKKyAgICAgICAgaWYgbm90IG1hcHBpbmc6CisgICAgICAgICAgICB5aWVsZCBvYmoKKworCisjIFVzZWQgYXMgc2Vjb25kIHBhcmFtZXRlciB0byBkaWN0LmdldCgpIG1ldGhvZCwgdG8gZGlzdGluZ3Vpc2ggYWJzZW50CisjIGRpY3Qga2V5IGZyb20gb25lIHdpdGggYSBOb25lIHZhbHVlLgorY2xhc3MgQWJzZW50OiBwYXNzCisKK2NsYXNzIENvb2tpZUphcjoKKyAgICAiIiJDb2xsZWN0aW9uIG9mIEhUVFAgY29va2llcy4KKworICAgIFlvdSBtYXkgbm90IG5lZWQgdG8ga25vdyBhYm91dCB0aGlzIGNsYXNzOiB0cnkKKyAgICB1cmxsaWIyLmJ1aWxkX29wZW5lcihIVFRQQ29va2llUHJvY2Vzc29yKS5vcGVuKHVybCkuCisKKyAgICAiIiIKKworICAgIG5vbl93b3JkX3JlID0gcmUuY29tcGlsZShyIlxXIikKKyAgICBxdW90ZV9yZSA9IHJlLmNvbXBpbGUociIoW1wiXFxdKSIpCisgICAgc3RyaWN0X2RvbWFpbl9yZSA9IHJlLmNvbXBpbGUociJcLj9bXi5dKiIpCisgICAgZG9tYWluX3JlID0gcmUuY29tcGlsZShyIlteLl0qIikKKyAgICBkb3RzX3JlID0gcmUuY29tcGlsZShyIl5cLisiKQorCisgICAgbWFnaWNfcmUgPSByIl5cI0xXUC1Db29raWVzLShcZCtcLlxkKykiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9saWN5PU5vbmUpOgorICAgICAgICBpZiBwb2xpY3kgaXMgTm9uZToKKyAgICAgICAgICAgIHBvbGljeSA9IERlZmF1bHRDb29raWVQb2xpY3koKQorICAgICAgICBzZWxmLl9wb2xpY3kgPSBwb2xpY3kKKworICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sgPSBfdGhyZWFkaW5nLlJMb2NrKCkKKyAgICAgICAgc2VsZi5fY29va2llcyA9IHt9CisKKyAgICBkZWYgc2V0X3BvbGljeShzZWxmLCBwb2xpY3kpOgorICAgICAgICBzZWxmLl9wb2xpY3kgPSBwb2xpY3kKKworICAgIGRlZiBfY29va2llc19mb3JfZG9tYWluKHNlbGYsIGRvbWFpbiwgcmVxdWVzdCk6CisgICAgICAgIGNvb2tpZXMgPSBbXQorICAgICAgICBpZiBub3Qgc2VsZi5fcG9saWN5LmRvbWFpbl9yZXR1cm5fb2soZG9tYWluLCByZXF1ZXN0KToKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBfZGVidWcoIkNoZWNraW5nICVzIGZvciBjb29raWVzIHRvIHJldHVybiIsIGRvbWFpbikKKyAgICAgICAgY29va2llc19ieV9wYXRoID0gc2VsZi5fY29va2llc1tkb21haW5dCisgICAgICAgIGZvciBwYXRoIGluIGNvb2tpZXNfYnlfcGF0aC5rZXlzKCk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fcG9saWN5LnBhdGhfcmV0dXJuX29rKHBhdGgsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBjb29raWVzX2J5X25hbWUgPSBjb29raWVzX2J5X3BhdGhbcGF0aF0KKyAgICAgICAgICAgIGZvciBjb29raWUgaW4gY29va2llc19ieV9uYW1lLnZhbHVlcygpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9wb2xpY3kucmV0dXJuX29rKGNvb2tpZSwgcmVxdWVzdCk6CisgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbm90IHJldHVybmluZyBjb29raWUiKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgaXQncyBhIG1hdGNoIikKKyAgICAgICAgICAgICAgICBjb29raWVzLmFwcGVuZChjb29raWUpCisgICAgICAgIHJldHVybiBjb29raWVzCisKKyAgICBkZWYgX2Nvb2tpZXNfZm9yX3JlcXVlc3Qoc2VsZiwgcmVxdWVzdCk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29va2llcyB0byBiZSByZXR1cm5lZCB0byBzZXJ2ZXIuIiIiCisgICAgICAgIGNvb2tpZXMgPSBbXQorICAgICAgICBmb3IgZG9tYWluIGluIHNlbGYuX2Nvb2tpZXMua2V5cygpOgorICAgICAgICAgICAgY29va2llcy5leHRlbmQoc2VsZi5fY29va2llc19mb3JfZG9tYWluKGRvbWFpbiwgcmVxdWVzdCkpCisgICAgICAgIHJldHVybiBjb29raWVzCisKKyAgICBkZWYgX2Nvb2tpZV9hdHRycyhzZWxmLCBjb29raWVzKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb29raWUtYXR0cmlidXRlcyB0byBiZSByZXR1cm5lZCB0byBzZXJ2ZXIuCisKKyAgICAgICAgbGlrZSBbJ2Zvbz0iYmFyIjsgJFBhdGg9Ii8iJywgLi4uXQorCisgICAgICAgIFRoZSAkVmVyc2lvbiBhdHRyaWJ1dGUgaXMgYWxzbyBhZGRlZCB3aGVuIGFwcHJvcHJpYXRlIChjdXJyZW50bHkgb25seQorICAgICAgICBvbmNlIHBlciByZXF1ZXN0KS4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBhZGQgY29va2llcyBpbiBvcmRlciBvZiBtb3N0IHNwZWNpZmljIChpZS4gbG9uZ2VzdCkgcGF0aCBmaXJzdAorICAgICAgICBjb29raWVzLnNvcnQoa2V5PWxhbWJkYSBhcmc6IGxlbihhcmcucGF0aCksIHJldmVyc2U9VHJ1ZSkKKworICAgICAgICB2ZXJzaW9uX3NldCA9IEZhbHNlCisKKyAgICAgICAgYXR0cnMgPSBbXQorICAgICAgICBmb3IgY29va2llIGluIGNvb2tpZXM6CisgICAgICAgICAgICAjIHNldCB2ZXJzaW9uIG9mIENvb2tpZSBoZWFkZXIKKyAgICAgICAgICAgICMgWFhYCisgICAgICAgICAgICAjIFdoYXQgc2hvdWxkIGl0IGJlIGlmIG11bHRpcGxlIG1hdGNoaW5nIFNldC1Db29raWUgaGVhZGVycyBoYXZlCisgICAgICAgICAgICAjICBkaWZmZXJlbnQgdmVyc2lvbnMgdGhlbXNlbHZlcz8KKyAgICAgICAgICAgICMgQW5zd2VyOiB0aGVyZSBpcyBubyBhbnN3ZXI7IHdhcyBzdXBwb3NlZCB0byBiZSBzZXR0bGVkIGJ5CisgICAgICAgICAgICAjICBSRkMgMjk2NSBlcnJhdGEsIGJ1dCB0aGF0IG1heSBuZXZlciBhcHBlYXIuLi4KKyAgICAgICAgICAgIHZlcnNpb24gPSBjb29raWUudmVyc2lvbgorICAgICAgICAgICAgaWYgbm90IHZlcnNpb25fc2V0OgorICAgICAgICAgICAgICAgIHZlcnNpb25fc2V0ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIHZlcnNpb24gPiAwOgorICAgICAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoIiRWZXJzaW9uPSVzIiAlIHZlcnNpb24pCisKKyAgICAgICAgICAgICMgcXVvdGUgY29va2llIHZhbHVlIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgIyAobm90IGZvciBOZXRzY2FwZSBwcm90b2NvbCwgd2hpY2ggYWxyZWFkeSBoYXMgYW55IHF1b3RlcworICAgICAgICAgICAgIyAgaW50YWN0LCBkdWUgdG8gdGhlIHBvb3JseS1zcGVjaWZpZWQgTmV0c2NhcGUgQ29va2llOiBzeW50YXgpCisgICAgICAgICAgICBpZiAoKGNvb2tpZS52YWx1ZSBpcyBub3QgTm9uZSkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5ub25fd29yZF9yZS5zZWFyY2goY29va2llLnZhbHVlKSBhbmQgdmVyc2lvbiA+IDApOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5xdW90ZV9yZS5zdWIociJcXFwxIiwgY29va2llLnZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvb2tpZS52YWx1ZQorCisgICAgICAgICAgICAjIGFkZCBjb29raWUtYXR0cmlidXRlcyB0byBiZSByZXR1cm5lZCBpbiBDb29raWUgaGVhZGVyCisgICAgICAgICAgICBpZiBjb29raWUudmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBhdHRycy5hcHBlbmQoY29va2llLm5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgiJXM9JXMiICUgKGNvb2tpZS5uYW1lLCB2YWx1ZSkpCisgICAgICAgICAgICBpZiB2ZXJzaW9uID4gMDoKKyAgICAgICAgICAgICAgICBpZiBjb29raWUucGF0aF9zcGVjaWZpZWQ6CisgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZCgnJFBhdGg9IiVzIicgJSBjb29raWUucGF0aCkKKyAgICAgICAgICAgICAgICBpZiBjb29raWUuZG9tYWluLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gY29va2llLmRvbWFpbgorICAgICAgICAgICAgICAgICAgICBpZiAobm90IGNvb2tpZS5kb21haW5faW5pdGlhbF9kb3QgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBkb21haW4uc3RhcnRzd2l0aCgiLiIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbiA9IGRvbWFpblsxOl0KKyAgICAgICAgICAgICAgICAgICAgYXR0cnMuYXBwZW5kKCckRG9tYWluPSIlcyInICUgZG9tYWluKQorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5wb3J0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwID0gIiRQb3J0IgorICAgICAgICAgICAgICAgICAgICBpZiBjb29raWUucG9ydF9zcGVjaWZpZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwID0gcCArICgnPSIlcyInICUgY29va2llLnBvcnQpCisgICAgICAgICAgICAgICAgICAgIGF0dHJzLmFwcGVuZChwKQorCisgICAgICAgIHJldHVybiBhdHRycworCisgICAgZGVmIGFkZF9jb29raWVfaGVhZGVyKHNlbGYsIHJlcXVlc3QpOgorICAgICAgICAiIiJBZGQgY29ycmVjdCBDb29raWU6IGhlYWRlciB0byByZXF1ZXN0ICh1cmxsaWIyLlJlcXVlc3Qgb2JqZWN0KS4KKworICAgICAgICBUaGUgQ29va2llMiBoZWFkZXIgaXMgYWxzbyBhZGRlZCB1bmxlc3MgcG9saWN5LmhpZGVfY29va2llMiBpcyB0cnVlLgorCisgICAgICAgICIiIgorICAgICAgICBfZGVidWcoImFkZF9jb29raWVfaGVhZGVyIikKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisKKyAgICAgICAgICAgIHNlbGYuX3BvbGljeS5fbm93ID0gc2VsZi5fbm93ID0gaW50KHRpbWUudGltZSgpKQorCisgICAgICAgICAgICBjb29raWVzID0gc2VsZi5fY29va2llc19mb3JfcmVxdWVzdChyZXF1ZXN0KQorCisgICAgICAgICAgICBhdHRycyA9IHNlbGYuX2Nvb2tpZV9hdHRycyhjb29raWVzKQorICAgICAgICAgICAgaWYgYXR0cnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcigiQ29va2llIik6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29va2llIiwgIjsgIi5qb2luKGF0dHJzKSkKKworICAgICAgICAgICAgIyBpZiBuZWNlc3NhcnksIGFkdmVydGlzZSB0aGF0IHdlIGtub3cgUkZDIDI5NjUKKyAgICAgICAgICAgIGlmIChzZWxmLl9wb2xpY3kucmZjMjk2NSBhbmQgbm90IHNlbGYuX3BvbGljeS5oaWRlX2Nvb2tpZTIgYW5kCisgICAgICAgICAgICAgICAgbm90IHJlcXVlc3QuaGFzX2hlYWRlcigiQ29va2llMiIpKToKKyAgICAgICAgICAgICAgICBmb3IgY29va2llIGluIGNvb2tpZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uICE9IDE6CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJDb29raWUyIiwgJyRWZXJzaW9uPSIxIicpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb29raWVzX2xvY2sucmVsZWFzZSgpCisKKyAgICAgICAgc2VsZi5jbGVhcl9leHBpcmVkX2Nvb2tpZXMoKQorCisgICAgZGVmIF9ub3JtYWxpemVkX2Nvb2tpZV90dXBsZXMoc2VsZiwgYXR0cnNfc2V0KToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgdHVwbGVzIGNvbnRhaW5pbmcgbm9ybWFsaXNlZCBjb29raWUgaW5mb3JtYXRpb24uCisKKyAgICAgICAgYXR0cnNfc2V0IGlzIHRoZSBsaXN0IG9mIGxpc3RzIG9mIGtleSx2YWx1ZSBwYWlycyBleHRyYWN0ZWQgZnJvbQorICAgICAgICB0aGUgU2V0LUNvb2tpZSBvciBTZXQtQ29va2llMiBoZWFkZXJzLgorCisgICAgICAgIFR1cGxlcyBhcmUgbmFtZSwgdmFsdWUsIHN0YW5kYXJkLCByZXN0LCB3aGVyZSBuYW1lIGFuZCB2YWx1ZSBhcmUgdGhlCisgICAgICAgIGNvb2tpZSBuYW1lIGFuZCB2YWx1ZSwgc3RhbmRhcmQgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIHN0YW5kYXJkCisgICAgICAgIGNvb2tpZS1hdHRyaWJ1dGVzIChkaXNjYXJkLCBzZWN1cmUsIHZlcnNpb24sIGV4cGlyZXMgb3IgbWF4LWFnZSwKKyAgICAgICAgZG9tYWluLCBwYXRoIGFuZCBwb3J0KSBhbmQgcmVzdCBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgcmVzdCBvZgorICAgICAgICB0aGUgY29va2llLWF0dHJpYnV0ZXMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGNvb2tpZV90dXBsZXMgPSBbXQorCisgICAgICAgIGJvb2xlYW5fYXR0cnMgPSAiZGlzY2FyZCIsICJzZWN1cmUiCisgICAgICAgIHZhbHVlX2F0dHJzID0gKCJ2ZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImV4cGlyZXMiLCAibWF4LWFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICJkb21haW4iLCAicGF0aCIsICJwb3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgImNvbW1lbnQiLCAiY29tbWVudHVybCIpCisKKyAgICAgICAgZm9yIGNvb2tpZV9hdHRycyBpbiBhdHRyc19zZXQ6CisgICAgICAgICAgICBuYW1lLCB2YWx1ZSA9IGNvb2tpZV9hdHRyc1swXQorCisgICAgICAgICAgICAjIEJ1aWxkIGRpY3Rpb25hcnkgb2Ygc3RhbmRhcmQgY29va2llLWF0dHJpYnV0ZXMgKHN0YW5kYXJkKSBhbmQKKyAgICAgICAgICAgICMgZGljdGlvbmFyeSBvZiBvdGhlciBjb29raWUtYXR0cmlidXRlcyAocmVzdCkuCisKKyAgICAgICAgICAgICMgTm90ZTogZXhwaXJ5IHRpbWUgaXMgbm9ybWFsaXNlZCB0byBzZWNvbmRzIHNpbmNlIGVwb2NoLiAgVjAKKyAgICAgICAgICAgICMgY29va2llcyBzaG91bGQgaGF2ZSB0aGUgRXhwaXJlcyBjb29raWUtYXR0cmlidXRlLCBhbmQgVjEgY29va2llcworICAgICAgICAgICAgIyBzaG91bGQgaGF2ZSBNYXgtQWdlLCBidXQgc2luY2UgVjEgaW5jbHVkZXMgUkZDIDIxMDkgY29va2llcyAoYW5kCisgICAgICAgICAgICAjIHNpbmNlIFYwIGNvb2tpZXMgbWF5IGJlIGEgbWlzaC1tYXNoIG9mIE5ldHNjYXBlIGFuZCBSRkMgMjEwOSksIHdlCisgICAgICAgICAgICAjIGFjY2VwdCBlaXRoZXIgKGJ1dCBwcmVmZXIgTWF4LUFnZSkuCisgICAgICAgICAgICBtYXhfYWdlX3NldCA9IEZhbHNlCisKKyAgICAgICAgICAgIGJhZF9jb29raWUgPSBGYWxzZQorCisgICAgICAgICAgICBzdGFuZGFyZCA9IHt9CisgICAgICAgICAgICByZXN0ID0ge30KKyAgICAgICAgICAgIGZvciBrLCB2IGluIGNvb2tpZV9hdHRyc1sxOl06CisgICAgICAgICAgICAgICAgbGMgPSBrLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAjIGRvbid0IGxvc2UgY2FzZSBkaXN0aW5jdGlvbiBmb3IgdW5rbm93biBmaWVsZHMKKyAgICAgICAgICAgICAgICBpZiBsYyBpbiB2YWx1ZV9hdHRycyBvciBsYyBpbiBib29sZWFuX2F0dHJzOgorICAgICAgICAgICAgICAgICAgICBrID0gbGMKKyAgICAgICAgICAgICAgICBpZiBrIGluIGJvb2xlYW5fYXR0cnMgYW5kIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBib29sZWFuIGNvb2tpZS1hdHRyaWJ1dGUgaXMgcHJlc2VudCwgYnV0IGhhcyBubyB2YWx1ZQorICAgICAgICAgICAgICAgICAgICAjIChsaWtlICJkaXNjYXJkIiwgcmF0aGVyIHRoYW4gInBvcnQ9ODAiKQorICAgICAgICAgICAgICAgICAgICB2ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGsgaW4gc3RhbmRhcmQ6CisgICAgICAgICAgICAgICAgICAgICMgb25seSBmaXJzdCB2YWx1ZSBpcyBzaWduaWZpY2FudAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGsgPT0gImRvbWFpbiI6CisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbWlzc2luZyB2YWx1ZSBmb3IgZG9tYWluIGF0dHJpYnV0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBiYWRfY29va2llID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBSRkMgMjk2NSBzZWN0aW9uIDMuMy4zCisgICAgICAgICAgICAgICAgICAgIHYgPSB2Lmxvd2VyKCkKKyAgICAgICAgICAgICAgICBpZiBrID09ICJleHBpcmVzIjoKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF4X2FnZV9zZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFByZWZlciBtYXgtYWdlIHRvIGV4cGlyZXMgKGxpa2UgTW96aWxsYSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kZWJ1ZygiICAgbWlzc2luZyBvciBpbnZhbGlkIHZhbHVlIGZvciBleHBpcmVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGU6IHRyZWF0aW5nIGFzIHNlc3Npb24gY29va2llIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgayA9PSAibWF4LWFnZSI6CisgICAgICAgICAgICAgICAgICAgIG1heF9hZ2Vfc2V0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gaW50KHYpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBtaXNzaW5nIG9yIGludmFsaWQgKG5vbi1udW1lcmljKSB2YWx1ZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heC1hZ2UgYXR0cmlidXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9jb29raWUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgUkZDIDI5NjUgTWF4LUFnZSB0byBzZWNvbmRzIHNpbmNlIGVwb2NoCisgICAgICAgICAgICAgICAgICAgICMgWFhYIFN0cmljdGx5IHlvdSdyZSBzdXBwb3NlZCB0byBmb2xsb3cgUkZDIDI2MTYKKyAgICAgICAgICAgICAgICAgICAgIyAgIGFnZS1jYWxjdWxhdGlvbiBydWxlcy4gIFJlbWVtYmVyIHRoYXQgemVybyBNYXgtQWdlIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgIyAgIGlzIGEgcmVxdWVzdCB0byBkaXNjYXJkIChvbGQgYW5kIG5ldykgY29va2llLCB0aG91Z2guCisgICAgICAgICAgICAgICAgICAgIGsgPSAiZXhwaXJlcyIKKyAgICAgICAgICAgICAgICAgICAgdiA9IHNlbGYuX25vdyArIHYKKyAgICAgICAgICAgICAgICBpZiAoayBpbiB2YWx1ZV9hdHRycykgb3IgKGsgaW4gYm9vbGVhbl9hdHRycyk6CisgICAgICAgICAgICAgICAgICAgIGlmICh2IGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBrIG5vdCBpbiAoInBvcnQiLCAiY29tbWVudCIsICJjb21tZW50dXJsIikpOgorICAgICAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgICBtaXNzaW5nIHZhbHVlIGZvciAlcyBhdHRyaWJ1dGUiICUgaykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhZF9jb29raWUgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZFtrXSA9IHYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXN0W2tdID0gdgorCisgICAgICAgICAgICBpZiBiYWRfY29va2llOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGNvb2tpZV90dXBsZXMuYXBwZW5kKChuYW1lLCB2YWx1ZSwgc3RhbmRhcmQsIHJlc3QpKQorCisgICAgICAgIHJldHVybiBjb29raWVfdHVwbGVzCisKKyAgICBkZWYgX2Nvb2tpZV9mcm9tX2Nvb2tpZV90dXBsZShzZWxmLCB0dXAsIHJlcXVlc3QpOgorICAgICAgICAjIHN0YW5kYXJkIGlzIGRpY3Qgb2Ygc3RhbmRhcmQgY29va2llLWF0dHJpYnV0ZXMsIHJlc3QgaXMgZGljdCBvZiB0aGUKKyAgICAgICAgIyByZXN0IG9mIHRoZW0KKyAgICAgICAgbmFtZSwgdmFsdWUsIHN0YW5kYXJkLCByZXN0ID0gdHVwCisKKyAgICAgICAgZG9tYWluID0gc3RhbmRhcmQuZ2V0KCJkb21haW4iLCBBYnNlbnQpCisgICAgICAgIHBhdGggPSBzdGFuZGFyZC5nZXQoInBhdGgiLCBBYnNlbnQpCisgICAgICAgIHBvcnQgPSBzdGFuZGFyZC5nZXQoInBvcnQiLCBBYnNlbnQpCisgICAgICAgIGV4cGlyZXMgPSBzdGFuZGFyZC5nZXQoImV4cGlyZXMiLCBBYnNlbnQpCisKKyAgICAgICAgIyBzZXQgdGhlIGVhc3kgZGVmYXVsdHMKKyAgICAgICAgdmVyc2lvbiA9IHN0YW5kYXJkLmdldCgidmVyc2lvbiIsIE5vbmUpCisgICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGludCh2ZXJzaW9uKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUgICMgaW52YWxpZCB2ZXJzaW9uLCBpZ25vcmUgY29va2llCisgICAgICAgIHNlY3VyZSA9IHN0YW5kYXJkLmdldCgic2VjdXJlIiwgRmFsc2UpCisgICAgICAgICMgKGRpc2NhcmQgaXMgYWxzbyBzZXQgaWYgZXhwaXJlcyBpcyBBYnNlbnQpCisgICAgICAgIGRpc2NhcmQgPSBzdGFuZGFyZC5nZXQoImRpc2NhcmQiLCBGYWxzZSkKKyAgICAgICAgY29tbWVudCA9IHN0YW5kYXJkLmdldCgiY29tbWVudCIsIE5vbmUpCisgICAgICAgIGNvbW1lbnRfdXJsID0gc3RhbmRhcmQuZ2V0KCJjb21tZW50dXJsIiwgTm9uZSkKKworICAgICAgICAjIHNldCBkZWZhdWx0IHBhdGgKKyAgICAgICAgaWYgcGF0aCBpcyBub3QgQWJzZW50IGFuZCBwYXRoICE9ICIiOgorICAgICAgICAgICAgcGF0aF9zcGVjaWZpZWQgPSBUcnVlCisgICAgICAgICAgICBwYXRoID0gZXNjYXBlX3BhdGgocGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGhfc3BlY2lmaWVkID0gRmFsc2UKKyAgICAgICAgICAgIHBhdGggPSByZXF1ZXN0X3BhdGgocmVxdWVzdCkKKyAgICAgICAgICAgIGkgPSBwYXRoLnJmaW5kKCIvIikKKyAgICAgICAgICAgIGlmIGkgIT0gLTE6CisgICAgICAgICAgICAgICAgaWYgdmVyc2lvbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICAjIE5ldHNjYXBlIHNwZWMgcGFydHMgY29tcGFueSBmcm9tIHJlYWxpdHkgaGVyZQorICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFs6aV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aFs6aSsxXQorICAgICAgICAgICAgaWYgbGVuKHBhdGgpID09IDA6IHBhdGggPSAiLyIKKworICAgICAgICAjIHNldCBkZWZhdWx0IGRvbWFpbgorICAgICAgICBkb21haW5fc3BlY2lmaWVkID0gZG9tYWluIGlzIG5vdCBBYnNlbnQKKyAgICAgICAgIyBidXQgZmlyc3Qgd2UgaGF2ZSB0byByZW1lbWJlciB3aGV0aGVyIGl0IHN0YXJ0cyB3aXRoIGEgZG90CisgICAgICAgIGRvbWFpbl9pbml0aWFsX2RvdCA9IEZhbHNlCisgICAgICAgIGlmIGRvbWFpbl9zcGVjaWZpZWQ6CisgICAgICAgICAgICBkb21haW5faW5pdGlhbF9kb3QgPSBib29sKGRvbWFpbi5zdGFydHN3aXRoKCIuIikpCisgICAgICAgIGlmIGRvbWFpbiBpcyBBYnNlbnQ6CisgICAgICAgICAgICByZXFfaG9zdCwgZXJobiA9IGVmZl9yZXF1ZXN0X2hvc3QocmVxdWVzdCkKKyAgICAgICAgICAgIGRvbWFpbiA9IGVyaG4KKyAgICAgICAgZWxpZiBub3QgZG9tYWluLnN0YXJ0c3dpdGgoIi4iKToKKyAgICAgICAgICAgIGRvbWFpbiA9ICIuIitkb21haW4KKworICAgICAgICAjIHNldCBkZWZhdWx0IHBvcnQKKyAgICAgICAgcG9ydF9zcGVjaWZpZWQgPSBGYWxzZQorICAgICAgICBpZiBwb3J0IGlzIG5vdCBBYnNlbnQ6CisgICAgICAgICAgICBpZiBwb3J0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBQb3J0IGF0dHIgcHJlc2VudCwgYnV0IGhhcyBubyB2YWx1ZTogZGVmYXVsdCB0byByZXF1ZXN0IHBvcnQuCisgICAgICAgICAgICAgICAgIyBDb29raWUgc2hvdWxkIHRoZW4gb25seSBiZSBzZW50IGJhY2sgb24gdGhhdCBwb3J0LgorICAgICAgICAgICAgICAgIHBvcnQgPSByZXF1ZXN0X3BvcnQocmVxdWVzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcG9ydF9zcGVjaWZpZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcG9ydCA9IHJlLnN1YihyIlxzKyIsICIiLCBwb3J0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBObyBwb3J0IGF0dHIgcHJlc2VudC4gIENvb2tpZSBjYW4gYmUgc2VudCBiYWNrIG9uIGFueSBwb3J0LgorICAgICAgICAgICAgcG9ydCA9IE5vbmUKKworICAgICAgICAjIHNldCBkZWZhdWx0IGV4cGlyZXMgYW5kIGRpc2NhcmQKKyAgICAgICAgaWYgZXhwaXJlcyBpcyBBYnNlbnQ6CisgICAgICAgICAgICBleHBpcmVzID0gTm9uZQorICAgICAgICAgICAgZGlzY2FyZCA9IFRydWUKKyAgICAgICAgZWxpZiBleHBpcmVzIDw9IHNlbGYuX25vdzoKKyAgICAgICAgICAgICMgRXhwaXJ5IGRhdGUgaW4gcGFzdCBpcyByZXF1ZXN0IHRvIGRlbGV0ZSBjb29raWUuICBUaGlzIGNhbid0IGJlCisgICAgICAgICAgICAjIGluIERlZmF1bHRDb29raWVQb2xpY3ksIGJlY2F1c2UgY2FuJ3QgZGVsZXRlIGNvb2tpZXMgdGhlcmUuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jbGVhcihkb21haW4sIHBhdGgsIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgX2RlYnVnKCJFeHBpcmluZyBjb29raWUsIGRvbWFpbj0nJXMnLCBwYXRoPSclcycsIG5hbWU9JyVzJyIsCisgICAgICAgICAgICAgICAgICAgZG9tYWluLCBwYXRoLCBuYW1lKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXR1cm4gQ29va2llKHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgcG9ydCwgcG9ydF9zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLCBkb21haW5fc3BlY2lmaWVkLCBkb21haW5faW5pdGlhbF9kb3QsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgcGF0aF9zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAgIGV4cGlyZXMsCisgICAgICAgICAgICAgICAgICAgICAgZGlzY2FyZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb21tZW50LAorICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRfdXJsLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3QpCisKKyAgICBkZWYgX2Nvb2tpZXNfZnJvbV9hdHRyc19zZXQoc2VsZiwgYXR0cnNfc2V0LCByZXF1ZXN0KToKKyAgICAgICAgY29va2llX3R1cGxlcyA9IHNlbGYuX25vcm1hbGl6ZWRfY29va2llX3R1cGxlcyhhdHRyc19zZXQpCisKKyAgICAgICAgY29va2llcyA9IFtdCisgICAgICAgIGZvciB0dXAgaW4gY29va2llX3R1cGxlczoKKyAgICAgICAgICAgIGNvb2tpZSA9IHNlbGYuX2Nvb2tpZV9mcm9tX2Nvb2tpZV90dXBsZSh0dXAsIHJlcXVlc3QpCisgICAgICAgICAgICBpZiBjb29raWU6IGNvb2tpZXMuYXBwZW5kKGNvb2tpZSkKKyAgICAgICAgcmV0dXJuIGNvb2tpZXMKKworICAgIGRlZiBfcHJvY2Vzc19yZmMyMTA5X2Nvb2tpZXMoc2VsZiwgY29va2llcyk6CisgICAgICAgIHJmYzIxMDlfYXNfbnMgPSBnZXRhdHRyKHNlbGYuX3BvbGljeSwgJ3JmYzIxMDlfYXNfbmV0c2NhcGUnLCBOb25lKQorICAgICAgICBpZiByZmMyMTA5X2FzX25zIGlzIE5vbmU6CisgICAgICAgICAgICByZmMyMTA5X2FzX25zID0gbm90IHNlbGYuX3BvbGljeS5yZmMyOTY1CisgICAgICAgIGZvciBjb29raWUgaW4gY29va2llczoKKyAgICAgICAgICAgIGlmIGNvb2tpZS52ZXJzaW9uID09IDE6CisgICAgICAgICAgICAgICAgY29va2llLnJmYzIxMDkgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgcmZjMjEwOV9hc19uczoKKyAgICAgICAgICAgICAgICAgICAgIyB0cmVhdCAyMTA5IGNvb2tpZXMgYXMgTmV0c2NhcGUgY29va2llcyByYXRoZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAjIGFzIFJGQzI5NjUgY29va2llcworICAgICAgICAgICAgICAgICAgICBjb29raWUudmVyc2lvbiA9IDAKKworICAgIGRlZiBtYWtlX2Nvb2tpZXMoc2VsZiwgcmVzcG9uc2UsIHJlcXVlc3QpOgorICAgICAgICAiIiJSZXR1cm4gc2VxdWVuY2Ugb2YgQ29va2llIG9iamVjdHMgZXh0cmFjdGVkIGZyb20gcmVzcG9uc2Ugb2JqZWN0LiIiIgorICAgICAgICAjIGdldCBjb29raWUtYXR0cmlidXRlcyBmb3IgUkZDIDI5NjUgYW5kIE5ldHNjYXBlIHByb3RvY29scworICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2UuaW5mbygpCisgICAgICAgIHJmYzI5NjVfaGRycyA9IGhlYWRlcnMuZ2V0aGVhZGVycygiU2V0LUNvb2tpZTIiKQorICAgICAgICBuc19oZHJzID0gaGVhZGVycy5nZXRoZWFkZXJzKCJTZXQtQ29va2llIikKKworICAgICAgICByZmMyOTY1ID0gc2VsZi5fcG9saWN5LnJmYzI5NjUKKyAgICAgICAgbmV0c2NhcGUgPSBzZWxmLl9wb2xpY3kubmV0c2NhcGUKKworICAgICAgICBpZiAoKG5vdCByZmMyOTY1X2hkcnMgYW5kIG5vdCBuc19oZHJzKSBvcgorICAgICAgICAgICAgKG5vdCBuc19oZHJzIGFuZCBub3QgcmZjMjk2NSkgb3IKKyAgICAgICAgICAgIChub3QgcmZjMjk2NV9oZHJzIGFuZCBub3QgbmV0c2NhcGUpIG9yCisgICAgICAgICAgICAobm90IG5ldHNjYXBlIGFuZCBub3QgcmZjMjk2NSkpOgorICAgICAgICAgICAgcmV0dXJuIFtdICAjIG5vIHJlbGV2YW50IGNvb2tpZSBoZWFkZXJzOiBxdWljayBleGl0CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29va2llcyA9IHNlbGYuX2Nvb2tpZXNfZnJvbV9hdHRyc19zZXQoCisgICAgICAgICAgICAgICAgc3BsaXRfaGVhZGVyX3dvcmRzKHJmYzI5NjVfaGRycyksIHJlcXVlc3QpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBfd2Fybl91bmhhbmRsZWRfZXhjZXB0aW9uKCkKKyAgICAgICAgICAgIGNvb2tpZXMgPSBbXQorCisgICAgICAgIGlmIG5zX2hkcnMgYW5kIG5ldHNjYXBlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgUkZDIDIxMDkgYW5kIE5ldHNjYXBlIGNvb2tpZXMKKyAgICAgICAgICAgICAgICBuc19jb29raWVzID0gc2VsZi5fY29va2llc19mcm9tX2F0dHJzX3NldCgKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VfbnNfaGVhZGVycyhuc19oZHJzKSwgcmVxdWVzdCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgX3dhcm5fdW5oYW5kbGVkX2V4Y2VwdGlvbigpCisgICAgICAgICAgICAgICAgbnNfY29va2llcyA9IFtdCisgICAgICAgICAgICBzZWxmLl9wcm9jZXNzX3JmYzIxMDlfY29va2llcyhuc19jb29raWVzKQorCisgICAgICAgICAgICAjIExvb2sgZm9yIE5ldHNjYXBlIGNvb2tpZXMgKGZyb20gU2V0LUNvb2tpZSBoZWFkZXJzKSB0aGF0IG1hdGNoCisgICAgICAgICAgICAjIGNvcnJlc3BvbmRpbmcgUkZDIDI5NjUgY29va2llcyAoZnJvbSBTZXQtQ29va2llMiBoZWFkZXJzKS4KKyAgICAgICAgICAgICMgRm9yIGVhY2ggbWF0Y2gsIGtlZXAgdGhlIFJGQyAyOTY1IGNvb2tpZSBhbmQgaWdub3JlIHRoZSBOZXRzY2FwZQorICAgICAgICAgICAgIyBjb29raWUgKFJGQyAyOTY1IHNlY3Rpb24gOS4xKS4gIEFjdHVhbGx5LCBSRkMgMjEwOSBjb29raWVzIGFyZQorICAgICAgICAgICAgIyBidW5kbGVkIGluIHdpdGggdGhlIE5ldHNjYXBlIGNvb2tpZXMgZm9yIHRoaXMgcHVycG9zZSwgd2hpY2ggaXMKKyAgICAgICAgICAgICMgcmVhc29uYWJsZSBiZWhhdmlvdXIuCisgICAgICAgICAgICBpZiByZmMyOTY1OgorICAgICAgICAgICAgICAgIGxvb2t1cCA9IHt9CisgICAgICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBjb29raWVzOgorICAgICAgICAgICAgICAgICAgICBsb29rdXBbKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSldID0gTm9uZQorCisgICAgICAgICAgICAgICAgZGVmIG5vX21hdGNoaW5nX3JmYzI5NjUobnNfY29va2llLCBsb29rdXA9bG9va3VwKToKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gbnNfY29va2llLmRvbWFpbiwgbnNfY29va2llLnBhdGgsIG5zX2Nvb2tpZS5uYW1lCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXkgbm90IGluIGxvb2t1cAorICAgICAgICAgICAgICAgIG5zX2Nvb2tpZXMgPSBmaWx0ZXIobm9fbWF0Y2hpbmdfcmZjMjk2NSwgbnNfY29va2llcykKKworICAgICAgICAgICAgaWYgbnNfY29va2llczoKKyAgICAgICAgICAgICAgICBjb29raWVzLmV4dGVuZChuc19jb29raWVzKQorCisgICAgICAgIHJldHVybiBjb29raWVzCisKKyAgICBkZWYgc2V0X2Nvb2tpZV9pZl9vayhzZWxmLCBjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAiIiJTZXQgYSBjb29raWUgaWYgcG9saWN5IHNheXMgaXQncyBPSyB0byBkbyBzby4iIiIKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9wb2xpY3kuX25vdyA9IHNlbGYuX25vdyA9IGludCh0aW1lLnRpbWUoKSkKKworICAgICAgICAgICAgaWYgc2VsZi5fcG9saWN5LnNldF9vayhjb29raWUsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Nvb2tpZShjb29raWUpCisKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHNldF9jb29raWUoc2VsZiwgY29va2llKToKKyAgICAgICAgIiIiU2V0IGEgY29va2llLCB3aXRob3V0IGNoZWNraW5nIHdoZXRoZXIgb3Igbm90IGl0IHNob3VsZCBiZSBzZXQuIiIiCisgICAgICAgIGMgPSBzZWxmLl9jb29raWVzCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgY29va2llLmRvbWFpbiBub3QgaW4gYzogY1tjb29raWUuZG9tYWluXSA9IHt9CisgICAgICAgICAgICBjMiA9IGNbY29va2llLmRvbWFpbl0KKyAgICAgICAgICAgIGlmIGNvb2tpZS5wYXRoIG5vdCBpbiBjMjogYzJbY29va2llLnBhdGhdID0ge30KKyAgICAgICAgICAgIGMzID0gYzJbY29va2llLnBhdGhdCisgICAgICAgICAgICBjM1tjb29raWUubmFtZV0gPSBjb29raWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBleHRyYWN0X2Nvb2tpZXMoc2VsZiwgcmVzcG9uc2UsIHJlcXVlc3QpOgorICAgICAgICAiIiJFeHRyYWN0IGNvb2tpZXMgZnJvbSByZXNwb25zZSwgd2hlcmUgYWxsb3dhYmxlIGdpdmVuIHRoZSByZXF1ZXN0LiIiIgorICAgICAgICBfZGVidWcoImV4dHJhY3RfY29va2llczogJXMiLCByZXNwb25zZS5pbmZvKCkpCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcG9saWN5Ll9ub3cgPSBzZWxmLl9ub3cgPSBpbnQodGltZS50aW1lKCkpCisKKyAgICAgICAgICAgIGZvciBjb29raWUgaW4gc2VsZi5tYWtlX2Nvb2tpZXMocmVzcG9uc2UsIHJlcXVlc3QpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3BvbGljeS5zZXRfb2soY29va2llLCByZXF1ZXN0KToKKyAgICAgICAgICAgICAgICAgICAgX2RlYnVnKCIgc2V0dGluZyBjb29raWU6ICVzIiwgY29va2llKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNldF9jb29raWUoY29va2llKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIGNsZWFyKHNlbGYsIGRvbWFpbj1Ob25lLCBwYXRoPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkNsZWFyIHNvbWUgY29va2llcy4KKworICAgICAgICBJbnZva2luZyB0aGlzIG1ldGhvZCB3aXRob3V0IGFyZ3VtZW50cyB3aWxsIGNsZWFyIGFsbCBjb29raWVzLiAgSWYKKyAgICAgICAgZ2l2ZW4gYSBzaW5nbGUgYXJndW1lbnQsIG9ubHkgY29va2llcyBiZWxvbmdpbmcgdG8gdGhhdCBkb21haW4gd2lsbCBiZQorICAgICAgICByZW1vdmVkLiAgSWYgZ2l2ZW4gdHdvIGFyZ3VtZW50cywgY29va2llcyBiZWxvbmdpbmcgdG8gdGhlIHNwZWNpZmllZAorICAgICAgICBwYXRoIHdpdGhpbiB0aGF0IGRvbWFpbiBhcmUgcmVtb3ZlZC4gIElmIGdpdmVuIHRocmVlIGFyZ3VtZW50cywgdGhlbgorICAgICAgICB0aGUgY29va2llIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBwYXRoIGFuZCBkb21haW4gaXMgcmVtb3ZlZC4KKworICAgICAgICBSYWlzZXMgS2V5RXJyb3IgaWYgbm8gbWF0Y2hpbmcgY29va2llIGV4aXN0cy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIChkb21haW4gaXMgTm9uZSkgb3IgKHBhdGggaXMgTm9uZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImRvbWFpbiBhbmQgcGF0aCBtdXN0IGJlIGdpdmVuIHRvIHJlbW92ZSBhIGNvb2tpZSBieSBuYW1lIikKKyAgICAgICAgICAgIGRlbCBzZWxmLl9jb29raWVzW2RvbWFpbl1bcGF0aF1bbmFtZV0KKyAgICAgICAgZWxpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgZG9tYWluIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImRvbWFpbiBtdXN0IGJlIGdpdmVuIHRvIHJlbW92ZSBjb29raWVzIGJ5IHBhdGgiKQorICAgICAgICAgICAgZGVsIHNlbGYuX2Nvb2tpZXNbZG9tYWluXVtwYXRoXQorICAgICAgICBlbGlmIGRvbWFpbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlbCBzZWxmLl9jb29raWVzW2RvbWFpbl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXMgPSB7fQorCisgICAgZGVmIGNsZWFyX3Nlc3Npb25fY29va2llcyhzZWxmKToKKyAgICAgICAgIiIiRGlzY2FyZCBhbGwgc2Vzc2lvbiBjb29raWVzLgorCisgICAgICAgIE5vdGUgdGhhdCB0aGUgLnNhdmUoKSBtZXRob2Qgd29uJ3Qgc2F2ZSBzZXNzaW9uIGNvb2tpZXMgYW55d2F5LCB1bmxlc3MKKyAgICAgICAgeW91IGFzayBvdGhlcndpc2UgYnkgcGFzc2luZyBhIHRydWUgaWdub3JlX2Rpc2NhcmQgYXJndW1lbnQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5kaXNjYXJkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyKGNvb2tpZS5kb21haW4sIGNvb2tpZS5wYXRoLCBjb29raWUubmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiBjbGVhcl9leHBpcmVkX2Nvb2tpZXMoc2VsZik6CisgICAgICAgICIiIkRpc2NhcmQgYWxsIGV4cGlyZWQgY29va2llcy4KKworICAgICAgICBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kOiBleHBpcmVkIGNvb2tpZXMgYXJlIG5ldmVyCisgICAgICAgIHNlbnQgYmFjayB0byB0aGUgc2VydmVyIChwcm92aWRlZCB5b3UncmUgdXNpbmcgRGVmYXVsdENvb2tpZVBvbGljeSksCisgICAgICAgIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBDb29raWVKYXIgaXRzZWxmIGV2ZXJ5IHNvIG9mdGVuLCBhbmQgdGhlCisgICAgICAgIC5zYXZlKCkgbWV0aG9kIHdvbid0IHNhdmUgZXhwaXJlZCBjb29raWVzIGFueXdheSAodW5sZXNzIHlvdSBhc2sKKyAgICAgICAgb3RoZXJ3aXNlIGJ5IHBhc3NpbmcgYSB0cnVlIGlnbm9yZV9leHBpcmVzIGFyZ3VtZW50KS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY29va2llc19sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOgorICAgICAgICAgICAgICAgIGlmIGNvb2tpZS5pc19leHBpcmVkKG5vdyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xlYXIoY29va2llLmRvbWFpbiwgY29va2llLnBhdGgsIGNvb2tpZS5uYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gZGVlcHZhbHVlcyhzZWxmLl9jb29raWVzKQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBudW1iZXIgb2YgY29udGFpbmVkIGNvb2tpZXMuIiIiCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBjb29raWUgaW4gc2VsZjogaSA9IGkgKyAxCisgICAgICAgIHJldHVybiBpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHIgPSBbXQorICAgICAgICBmb3IgY29va2llIGluIHNlbGY6IHIuYXBwZW5kKHJlcHIoY29va2llKSkKKyAgICAgICAgcmV0dXJuICI8JXNbJXNdPiIgJSAoc2VsZi5fX2NsYXNzX18sICIsICIuam9pbihyKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByID0gW10KKyAgICAgICAgZm9yIGNvb2tpZSBpbiBzZWxmOiByLmFwcGVuZChzdHIoY29va2llKSkKKyAgICAgICAgcmV0dXJuICI8JXNbJXNdPiIgJSAoc2VsZi5fX2NsYXNzX18sICIsICIuam9pbihyKSkKKworCisjIGRlcml2ZXMgZnJvbSBJT0Vycm9yIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjQuMAorY2xhc3MgTG9hZEVycm9yKElPRXJyb3IpOiBwYXNzCisKK2NsYXNzIEZpbGVDb29raWVKYXIoQ29va2llSmFyKToKKyAgICAiIiJDb29raWVKYXIgdGhhdCBjYW4gYmUgbG9hZGVkIGZyb20gYW5kIHNhdmVkIHRvIGEgZmlsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZT1Ob25lLCBkZWxheWxvYWQ9RmFsc2UsIHBvbGljeT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIENvb2tpZXMgYXJlIE5PVCBsb2FkZWQgZnJvbSB0aGUgbmFtZWQgZmlsZSB1bnRpbCBlaXRoZXIgdGhlIC5sb2FkKCkgb3IKKyAgICAgICAgLnJldmVydCgpIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIENvb2tpZUphci5fX2luaXRfXyhzZWxmLCBwb2xpY3kpCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbGVuYW1lKyIiCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmlsZW5hbWUgbXVzdCBiZSBzdHJpbmctbGlrZSIpCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmRlbGF5bG9hZCA9IGJvb2woZGVsYXlsb2FkKQorCisgICAgZGVmIHNhdmUoc2VsZiwgZmlsZW5hbWU9Tm9uZSwgaWdub3JlX2Rpc2NhcmQ9RmFsc2UsIGlnbm9yZV9leHBpcmVzPUZhbHNlKToKKyAgICAgICAgIiIiU2F2ZSBjb29raWVzIHRvIGEgZmlsZS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigpCisKKyAgICBkZWYgbG9hZChzZWxmLCBmaWxlbmFtZT1Ob25lLCBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICAiIiJMb2FkIGNvb2tpZXMgZnJvbSBhIGZpbGUuIiIiCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOiBmaWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlIFZhbHVlRXJyb3IoTUlTU0lOR19GSUxFTkFNRV9URVhUKQorCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9yZWFsbHlfbG9hZChmLCBmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQsIGlnbm9yZV9leHBpcmVzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgcmV2ZXJ0KHNlbGYsIGZpbGVuYW1lPU5vbmUsCisgICAgICAgICAgICAgICBpZ25vcmVfZGlzY2FyZD1GYWxzZSwgaWdub3JlX2V4cGlyZXM9RmFsc2UpOgorICAgICAgICAiIiJDbGVhciBhbGwgY29va2llcyBhbmQgcmVsb2FkIGNvb2tpZXMgZnJvbSBhIHNhdmVkIGZpbGUuCisKKyAgICAgICAgUmFpc2VzIExvYWRFcnJvciAob3IgSU9FcnJvcikgaWYgcmV2ZXJzaW9uIGlzIG5vdCBzdWNjZXNzZnVsOyB0aGUKKyAgICAgICAgb2JqZWN0J3Mgc3RhdGUgd2lsbCBub3QgYmUgYWx0ZXJlZCBpZiB0aGlzIGhhcHBlbnMuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGVuYW1lIGlzIG5vdCBOb25lOiBmaWxlbmFtZSA9IHNlbGYuZmlsZW5hbWUKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlIFZhbHVlRXJyb3IoTUlTU0lOR19GSUxFTkFNRV9URVhUKQorCisgICAgICAgIHNlbGYuX2Nvb2tpZXNfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorCisgICAgICAgICAgICBvbGRfc3RhdGUgPSBjb3B5LmRlZXBjb3B5KHNlbGYuX2Nvb2tpZXMpCisgICAgICAgICAgICBzZWxmLl9jb29raWVzID0ge30KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmxvYWQoZmlsZW5hbWUsIGlnbm9yZV9kaXNjYXJkLCBpZ25vcmVfZXhwaXJlcykKKyAgICAgICAgICAgIGV4Y2VwdCAoTG9hZEVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb29raWVzID0gb2xkX3N0YXRlCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29va2llc19sb2NrLnJlbGVhc2UoKQorCitmcm9tIF9MV1BDb29raWVKYXIgaW1wb3J0IExXUENvb2tpZUphciwgbHdwX2Nvb2tpZV9zdHIKK2Zyb20gX01vemlsbGFDb29raWVKYXIgaW1wb3J0IE1vemlsbGFDb29raWVKYXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29va2llbGliLnB5YyBiL2xpYi9weXRob24yLjcvY29va2llbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDUwYjgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb29raWVsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29va2llbGliLnB5byBiL2xpYi9weXRob24yLjcvY29va2llbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM0ZGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb29raWVsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY29weS5weSBiL2xpYi9weXRob24yLjcvY29weS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjI3YTJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb3B5LnB5CkBAIC0wLDAgKzEsNDMzIEBACisiIiJHZW5lcmljIChzaGFsbG93IGFuZCBkZWVwKSBjb3B5aW5nIG9wZXJhdGlvbnMuCisKK0ludGVyZmFjZSBzdW1tYXJ5OgorCisgICAgICAgIGltcG9ydCBjb3B5CisKKyAgICAgICAgeCA9IGNvcHkuY29weSh5KSAgICAgICAgIyBtYWtlIGEgc2hhbGxvdyBjb3B5IG9mIHkKKyAgICAgICAgeCA9IGNvcHkuZGVlcGNvcHkoeSkgICAgIyBtYWtlIGEgZGVlcCBjb3B5IG9mIHkKKworRm9yIG1vZHVsZSBzcGVjaWZpYyBlcnJvcnMsIGNvcHkuRXJyb3IgaXMgcmFpc2VkLgorCitUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNoYWxsb3cgYW5kIGRlZXAgY29weWluZyBpcyBvbmx5IHJlbGV2YW50IGZvcgorY29tcG91bmQgb2JqZWN0cyAob2JqZWN0cyB0aGF0IGNvbnRhaW4gb3RoZXIgb2JqZWN0cywgbGlrZSBsaXN0cyBvcgorY2xhc3MgaW5zdGFuY2VzKS4KKworLSBBIHNoYWxsb3cgY29weSBjb25zdHJ1Y3RzIGEgbmV3IGNvbXBvdW5kIG9iamVjdCBhbmQgdGhlbiAodG8gdGhlCisgIGV4dGVudCBwb3NzaWJsZSkgaW5zZXJ0cyAqdGhlIHNhbWUgb2JqZWN0cyogaW50byBpdCB0aGF0IHRoZQorICBvcmlnaW5hbCBjb250YWlucy4KKworLSBBIGRlZXAgY29weSBjb25zdHJ1Y3RzIGEgbmV3IGNvbXBvdW5kIG9iamVjdCBhbmQgdGhlbiwgcmVjdXJzaXZlbHksCisgIGluc2VydHMgKmNvcGllcyogaW50byBpdCBvZiB0aGUgb2JqZWN0cyBmb3VuZCBpbiB0aGUgb3JpZ2luYWwuCisKK1R3byBwcm9ibGVtcyBvZnRlbiBleGlzdCB3aXRoIGRlZXAgY29weSBvcGVyYXRpb25zIHRoYXQgZG9uJ3QgZXhpc3QKK3dpdGggc2hhbGxvdyBjb3B5IG9wZXJhdGlvbnM6CisKKyBhKSByZWN1cnNpdmUgb2JqZWN0cyAoY29tcG91bmQgb2JqZWN0cyB0aGF0LCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LAorICAgIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlbXNlbHZlcykgbWF5IGNhdXNlIGEgcmVjdXJzaXZlIGxvb3AKKworIGIpIGJlY2F1c2UgZGVlcCBjb3B5IGNvcGllcyAqZXZlcnl0aGluZyogaXQgbWF5IGNvcHkgdG9vIG11Y2gsIGUuZy4KKyAgICBhZG1pbmlzdHJhdGl2ZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBzaG91bGQgYmUgc2hhcmVkIGV2ZW4gYmV0d2VlbgorICAgIGNvcGllcworCitQeXRob24ncyBkZWVwIGNvcHkgb3BlcmF0aW9uIGF2b2lkcyB0aGVzZSBwcm9ibGVtcyBieToKKworIGEpIGtlZXBpbmcgYSB0YWJsZSBvZiBvYmplY3RzIGFscmVhZHkgY29waWVkIGR1cmluZyB0aGUgY3VycmVudAorICAgIGNvcHlpbmcgcGFzcworCisgYikgbGV0dGluZyB1c2VyLWRlZmluZWQgY2xhc3NlcyBvdmVycmlkZSB0aGUgY29weWluZyBvcGVyYXRpb24gb3IgdGhlCisgICAgc2V0IG9mIGNvbXBvbmVudHMgY29waWVkCisKK1RoaXMgdmVyc2lvbiBkb2VzIG5vdCBjb3B5IHR5cGVzIGxpa2UgbW9kdWxlLCBjbGFzcywgZnVuY3Rpb24sIG1ldGhvZCwKK25vciBzdGFjayB0cmFjZSwgc3RhY2sgZnJhbWUsIG5vciBmaWxlLCBzb2NrZXQsIHdpbmRvdywgbm9yIGFycmF5LCBub3IKK2FueSBzaW1pbGFyIHR5cGVzLgorCitDbGFzc2VzIGNhbiB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlcyB0byBjb250cm9sIGNvcHlpbmcgdGhhdCB0aGV5IHVzZQordG8gY29udHJvbCBwaWNrbGluZzogdGhleSBjYW4gZGVmaW5lIG1ldGhvZHMgY2FsbGVkIF9fZ2V0aW5pdGFyZ3NfXygpLAorX19nZXRzdGF0ZV9fKCkgYW5kIF9fc2V0c3RhdGVfXygpLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBtb2R1bGUKKyJwaWNrbGUiIGZvciBpbmZvcm1hdGlvbiBvbiB0aGVzZSBtZXRob2RzLgorIiIiCisKK2ltcG9ydCB0eXBlcworaW1wb3J0IHdlYWtyZWYKK2Zyb20gY29weV9yZWcgaW1wb3J0IGRpc3BhdGNoX3RhYmxlCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworZXJyb3IgPSBFcnJvciAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCit0cnk6CisgICAgZnJvbSBvcmcucHl0aG9uLmNvcmUgaW1wb3J0IFB5U3RyaW5nTWFwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgUHlTdHJpbmdNYXAgPSBOb25lCisKK19fYWxsX18gPSBbIkVycm9yIiwgImNvcHkiLCAiZGVlcGNvcHkiXQorCitkZWYgY29weSh4KToKKyAgICAiIiJTaGFsbG93IGNvcHkgb3BlcmF0aW9uIG9uIGFyYml0cmFyeSBQeXRob24gb2JqZWN0cy4KKworICAgIFNlZSB0aGUgbW9kdWxlJ3MgX19kb2NfXyBzdHJpbmcgZm9yIG1vcmUgaW5mby4KKyAgICAiIiIKKworICAgIGNscyA9IHR5cGUoeCkKKworICAgIGNvcGllciA9IF9jb3B5X2Rpc3BhdGNoLmdldChjbHMpCisgICAgaWYgY29waWVyOgorICAgICAgICByZXR1cm4gY29waWVyKHgpCisKKyAgICBjb3BpZXIgPSBnZXRhdHRyKGNscywgIl9fY29weV9fIiwgTm9uZSkKKyAgICBpZiBjb3BpZXI6CisgICAgICAgIHJldHVybiBjb3BpZXIoeCkKKworICAgIHJlZHVjdG9yID0gZGlzcGF0Y2hfdGFibGUuZ2V0KGNscykKKyAgICBpZiByZWR1Y3RvcjoKKyAgICAgICAgcnYgPSByZWR1Y3Rvcih4KQorICAgIGVsc2U6CisgICAgICAgIHJlZHVjdG9yID0gZ2V0YXR0cih4LCAiX19yZWR1Y2VfZXhfXyIsIE5vbmUpCisgICAgICAgIGlmIHJlZHVjdG9yOgorICAgICAgICAgICAgcnYgPSByZWR1Y3RvcigyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsICJfX3JlZHVjZV9fIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHJlZHVjdG9yOgorICAgICAgICAgICAgICAgIHJ2ID0gcmVkdWN0b3IoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvcigidW4oc2hhbGxvdyljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlcyIgJSBjbHMpCisKKyAgICByZXR1cm4gX3JlY29uc3RydWN0KHgsIHJ2LCAwKQorCisKK19jb3B5X2Rpc3BhdGNoID0gZCA9IHt9CisKK2RlZiBfY29weV9pbW11dGFibGUoeCk6CisgICAgcmV0dXJuIHgKK2ZvciB0IGluICh0eXBlKE5vbmUpLCBpbnQsIGxvbmcsIGZsb2F0LCBib29sLCBzdHIsIHR1cGxlLAorICAgICAgICAgIGZyb3plbnNldCwgdHlwZSwgeHJhbmdlLCB0eXBlcy5DbGFzc1R5cGUsCisgICAgICAgICAgdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZSwgdHlwZShFbGxpcHNpcyksCisgICAgICAgICAgdHlwZXMuRnVuY3Rpb25UeXBlLCB3ZWFrcmVmLnJlZik6CisgICAgZFt0XSA9IF9jb3B5X2ltbXV0YWJsZQorZm9yIG5hbWUgaW4gKCJDb21wbGV4VHlwZSIsICJVbmljb2RlVHlwZSIsICJDb2RlVHlwZSIpOgorICAgIHQgPSBnZXRhdHRyKHR5cGVzLCBuYW1lLCBOb25lKQorICAgIGlmIHQgaXMgbm90IE5vbmU6CisgICAgICAgIGRbdF0gPSBfY29weV9pbW11dGFibGUKKworZGVmIF9jb3B5X3dpdGhfY29uc3RydWN0b3IoeCk6CisgICAgcmV0dXJuIHR5cGUoeCkoeCkKK2ZvciB0IGluIChsaXN0LCBkaWN0LCBzZXQpOgorICAgIGRbdF0gPSBfY29weV93aXRoX2NvbnN0cnVjdG9yCisKK2RlZiBfY29weV93aXRoX2NvcHlfbWV0aG9kKHgpOgorICAgIHJldHVybiB4LmNvcHkoKQoraWYgUHlTdHJpbmdNYXAgaXMgbm90IE5vbmU6CisgICAgZFtQeVN0cmluZ01hcF0gPSBfY29weV93aXRoX2NvcHlfbWV0aG9kCisKK2RlZiBfY29weV9pbnN0KHgpOgorICAgIGlmIGhhc2F0dHIoeCwgJ19fY29weV9fJyk6CisgICAgICAgIHJldHVybiB4Ll9fY29weV9fKCkKKyAgICBpZiBoYXNhdHRyKHgsICdfX2dldGluaXRhcmdzX18nKToKKyAgICAgICAgYXJncyA9IHguX19nZXRpbml0YXJnc19fKCkKKyAgICAgICAgeSA9IHguX19jbGFzc19fKCphcmdzKQorICAgIGVsc2U6CisgICAgICAgIHkgPSBfRW1wdHlDbGFzcygpCisgICAgICAgIHkuX19jbGFzc19fID0geC5fX2NsYXNzX18KKyAgICBpZiBoYXNhdHRyKHgsICdfX2dldHN0YXRlX18nKToKKyAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpCisgICAgZWxzZToKKyAgICAgICAgc3RhdGUgPSB4Ll9fZGljdF9fCisgICAgaWYgaGFzYXR0cih5LCAnX19zZXRzdGF0ZV9fJyk6CisgICAgICAgIHkuX19zZXRzdGF0ZV9fKHN0YXRlKQorICAgIGVsc2U6CisgICAgICAgIHkuX19kaWN0X18udXBkYXRlKHN0YXRlKQorICAgIHJldHVybiB5CitkW3R5cGVzLkluc3RhbmNlVHlwZV0gPSBfY29weV9pbnN0CisKK2RlbCBkCisKK2RlZiBkZWVwY29weSh4LCBtZW1vPU5vbmUsIF9uaWw9W10pOgorICAgICIiIkRlZXAgY29weSBvcGVyYXRpb24gb24gYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLgorCisgICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgbW9yZSBpbmZvLgorICAgICIiIgorCisgICAgaWYgbWVtbyBpcyBOb25lOgorICAgICAgICBtZW1vID0ge30KKworICAgIGQgPSBpZCh4KQorICAgIHkgPSBtZW1vLmdldChkLCBfbmlsKQorICAgIGlmIHkgaXMgbm90IF9uaWw6CisgICAgICAgIHJldHVybiB5CisKKyAgICBjbHMgPSB0eXBlKHgpCisKKyAgICBjb3BpZXIgPSBfZGVlcGNvcHlfZGlzcGF0Y2guZ2V0KGNscykKKyAgICBpZiBjb3BpZXI6CisgICAgICAgIHkgPSBjb3BpZXIoeCwgbWVtbykKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpc3NjID0gaXNzdWJjbGFzcyhjbHMsIHR5cGUpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6ICMgY2xzIGlzIG5vdCBhIGNsYXNzIChvbGQgQm9vc3Q7IHNlZSBTRiAjNTAyMDg1KQorICAgICAgICAgICAgaXNzYyA9IDAKKyAgICAgICAgaWYgaXNzYzoKKyAgICAgICAgICAgIHkgPSBfZGVlcGNvcHlfYXRvbWljKHgsIG1lbW8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3BpZXIgPSBnZXRhdHRyKHgsICJfX2RlZXBjb3B5X18iLCBOb25lKQorICAgICAgICAgICAgaWYgY29waWVyOgorICAgICAgICAgICAgICAgIHkgPSBjb3BpZXIobWVtbykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVkdWN0b3IgPSBkaXNwYXRjaF90YWJsZS5nZXQoY2xzKQorICAgICAgICAgICAgICAgIGlmIHJlZHVjdG9yOgorICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKHgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVkdWN0b3IgPSBnZXRhdHRyKHgsICJfX3JlZHVjZV9leF9fIiwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVkdWN0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICBydiA9IHJlZHVjdG9yKDIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y3RvciA9IGdldGF0dHIoeCwgIl9fcmVkdWNlX18iLCBOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVkdWN0b3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSByZWR1Y3RvcigpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW4oZGVlcCljb3B5YWJsZSBvYmplY3Qgb2YgdHlwZSAlcyIgJSBjbHMpCisgICAgICAgICAgICAgICAgeSA9IF9yZWNvbnN0cnVjdCh4LCBydiwgMSwgbWVtbykKKworICAgIG1lbW9bZF0gPSB5CisgICAgX2tlZXBfYWxpdmUoeCwgbWVtbykgIyBNYWtlIHN1cmUgeCBsaXZlcyBhdCBsZWFzdCBhcyBsb25nIGFzIGQKKyAgICByZXR1cm4geQorCitfZGVlcGNvcHlfZGlzcGF0Y2ggPSBkID0ge30KKworZGVmIF9kZWVwY29weV9hdG9taWMoeCwgbWVtbyk6CisgICAgcmV0dXJuIHgKK2RbdHlwZShOb25lKV0gPSBfZGVlcGNvcHlfYXRvbWljCitkW3R5cGUoRWxsaXBzaXMpXSA9IF9kZWVwY29weV9hdG9taWMKK2RbaW50XSA9IF9kZWVwY29weV9hdG9taWMKK2RbbG9uZ10gPSBfZGVlcGNvcHlfYXRvbWljCitkW2Zsb2F0XSA9IF9kZWVwY29weV9hdG9taWMKK2RbYm9vbF0gPSBfZGVlcGNvcHlfYXRvbWljCit0cnk6CisgICAgZFtjb21wbGV4XSA9IF9kZWVwY29weV9hdG9taWMKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworZFtzdHJdID0gX2RlZXBjb3B5X2F0b21pYwordHJ5OgorICAgIGRbdW5pY29kZV0gPSBfZGVlcGNvcHlfYXRvbWljCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK3RyeToKKyAgICBkW3R5cGVzLkNvZGVUeXBlXSA9IF9kZWVwY29weV9hdG9taWMKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBwYXNzCitkW3R5cGVdID0gX2RlZXBjb3B5X2F0b21pYworZFt4cmFuZ2VdID0gX2RlZXBjb3B5X2F0b21pYworZFt0eXBlcy5DbGFzc1R5cGVdID0gX2RlZXBjb3B5X2F0b21pYworZFt0eXBlcy5CdWlsdGluRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWMKK2RbdHlwZXMuRnVuY3Rpb25UeXBlXSA9IF9kZWVwY29weV9hdG9taWMKK2Rbd2Vha3JlZi5yZWZdID0gX2RlZXBjb3B5X2F0b21pYworCitkZWYgX2RlZXBjb3B5X2xpc3QoeCwgbWVtbyk6CisgICAgeSA9IFtdCisgICAgbWVtb1tpZCh4KV0gPSB5CisgICAgZm9yIGEgaW4geDoKKyAgICAgICAgeS5hcHBlbmQoZGVlcGNvcHkoYSwgbWVtbykpCisgICAgcmV0dXJuIHkKK2RbbGlzdF0gPSBfZGVlcGNvcHlfbGlzdAorCitkZWYgX2RlZXBjb3B5X3R1cGxlKHgsIG1lbW8pOgorICAgIHkgPSBbXQorICAgIGZvciBhIGluIHg6CisgICAgICAgIHkuYXBwZW5kKGRlZXBjb3B5KGEsIG1lbW8pKQorICAgIGQgPSBpZCh4KQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIG1lbW9bZF0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oeCkpOgorICAgICAgICBpZiB4W2ldIGlzIG5vdCB5W2ldOgorICAgICAgICAgICAgeSA9IHR1cGxlKHkpCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHkgPSB4CisgICAgbWVtb1tkXSA9IHkKKyAgICByZXR1cm4geQorZFt0dXBsZV0gPSBfZGVlcGNvcHlfdHVwbGUKKworZGVmIF9kZWVwY29weV9kaWN0KHgsIG1lbW8pOgorICAgIHkgPSB7fQorICAgIG1lbW9baWQoeCldID0geQorICAgIGZvciBrZXksIHZhbHVlIGluIHguaXRlcml0ZW1zKCk6CisgICAgICAgIHlbZGVlcGNvcHkoa2V5LCBtZW1vKV0gPSBkZWVwY29weSh2YWx1ZSwgbWVtbykKKyAgICByZXR1cm4geQorZFtkaWN0XSA9IF9kZWVwY29weV9kaWN0CitpZiBQeVN0cmluZ01hcCBpcyBub3QgTm9uZToKKyAgICBkW1B5U3RyaW5nTWFwXSA9IF9kZWVwY29weV9kaWN0CisKK2RlZiBfZGVlcGNvcHlfbWV0aG9kKHgsIG1lbW8pOiAjIENvcHkgaW5zdGFuY2UgbWV0aG9kcworICAgIHJldHVybiB0eXBlKHgpKHguaW1fZnVuYywgZGVlcGNvcHkoeC5pbV9zZWxmLCBtZW1vKSwgeC5pbV9jbGFzcykKK19kZWVwY29weV9kaXNwYXRjaFt0eXBlcy5NZXRob2RUeXBlXSA9IF9kZWVwY29weV9tZXRob2QKKworZGVmIF9rZWVwX2FsaXZlKHgsIG1lbW8pOgorICAgICIiIktlZXBzIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgeCBpbiB0aGUgbWVtby4KKworICAgIEJlY2F1c2Ugd2UgcmVtZW1iZXIgb2JqZWN0cyBieSB0aGVpciBpZCwgd2UgaGF2ZQorICAgIHRvIGFzc3VyZSB0aGF0IHBvc3NpYmx5IHRlbXBvcmFyeSBvYmplY3RzIGFyZSBrZXB0CisgICAgYWxpdmUgYnkgcmVmZXJlbmNpbmcgdGhlbS4KKyAgICBXZSBzdG9yZSBhIHJlZmVyZW5jZSBhdCB0aGUgaWQgb2YgdGhlIG1lbW8sIHdoaWNoIHNob3VsZAorICAgIG5vcm1hbGx5IG5vdCBiZSB1c2VkIHVubGVzcyBzb21lb25lIHRyaWVzIHRvIGRlZXBjb3B5CisgICAgdGhlIG1lbW8gaXRzZWxmLi4uCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBtZW1vW2lkKG1lbW8pXS5hcHBlbmQoeCkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICMgYWhhLCB0aGlzIGlzIHRoZSBmaXJzdCBvbmUgOi0pCisgICAgICAgIG1lbW9baWQobWVtbyldPVt4XQorCitkZWYgX2RlZXBjb3B5X2luc3QoeCwgbWVtbyk6CisgICAgaWYgaGFzYXR0cih4LCAnX19kZWVwY29weV9fJyk6CisgICAgICAgIHJldHVybiB4Ll9fZGVlcGNvcHlfXyhtZW1vKQorICAgIGlmIGhhc2F0dHIoeCwgJ19fZ2V0aW5pdGFyZ3NfXycpOgorICAgICAgICBhcmdzID0geC5fX2dldGluaXRhcmdzX18oKQorICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbykKKyAgICAgICAgeSA9IHguX19jbGFzc19fKCphcmdzKQorICAgIGVsc2U6CisgICAgICAgIHkgPSBfRW1wdHlDbGFzcygpCisgICAgICAgIHkuX19jbGFzc19fID0geC5fX2NsYXNzX18KKyAgICBtZW1vW2lkKHgpXSA9IHkKKyAgICBpZiBoYXNhdHRyKHgsICdfX2dldHN0YXRlX18nKToKKyAgICAgICAgc3RhdGUgPSB4Ll9fZ2V0c3RhdGVfXygpCisgICAgZWxzZToKKyAgICAgICAgc3RhdGUgPSB4Ll9fZGljdF9fCisgICAgc3RhdGUgPSBkZWVwY29weShzdGF0ZSwgbWVtbykKKyAgICBpZiBoYXNhdHRyKHksICdfX3NldHN0YXRlX18nKToKKyAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpCisgICAgZWxzZToKKyAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpCisgICAgcmV0dXJuIHkKK2RbdHlwZXMuSW5zdGFuY2VUeXBlXSA9IF9kZWVwY29weV9pbnN0CisKK2RlZiBfcmVjb25zdHJ1Y3QoeCwgaW5mbywgZGVlcCwgbWVtbz1Ob25lKToKKyAgICBpZiBpc2luc3RhbmNlKGluZm8sIHN0cik6CisgICAgICAgIHJldHVybiB4CisgICAgYXNzZXJ0IGlzaW5zdGFuY2UoaW5mbywgdHVwbGUpCisgICAgaWYgbWVtbyBpcyBOb25lOgorICAgICAgICBtZW1vID0ge30KKyAgICBuID0gbGVuKGluZm8pCisgICAgYXNzZXJ0IG4gaW4gKDIsIDMsIDQsIDUpCisgICAgY2FsbGFibGUsIGFyZ3MgPSBpbmZvWzoyXQorICAgIGlmIG4gPiAyOgorICAgICAgICBzdGF0ZSA9IGluZm9bMl0KKyAgICBlbHNlOgorICAgICAgICBzdGF0ZSA9IHt9CisgICAgaWYgbiA+IDM6CisgICAgICAgIGxpc3RpdGVyID0gaW5mb1szXQorICAgIGVsc2U6CisgICAgICAgIGxpc3RpdGVyID0gTm9uZQorICAgIGlmIG4gPiA0OgorICAgICAgICBkaWN0aXRlciA9IGluZm9bNF0KKyAgICBlbHNlOgorICAgICAgICBkaWN0aXRlciA9IE5vbmUKKyAgICBpZiBkZWVwOgorICAgICAgICBhcmdzID0gZGVlcGNvcHkoYXJncywgbWVtbykKKyAgICB5ID0gY2FsbGFibGUoKmFyZ3MpCisgICAgbWVtb1tpZCh4KV0gPSB5CisKKyAgICBpZiBzdGF0ZToKKyAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgIHN0YXRlID0gZGVlcGNvcHkoc3RhdGUsIG1lbW8pCisgICAgICAgIGlmIGhhc2F0dHIoeSwgJ19fc2V0c3RhdGVfXycpOgorICAgICAgICAgICAgeS5fX3NldHN0YXRlX18oc3RhdGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHN0YXRlLCB0dXBsZSkgYW5kIGxlbihzdGF0ZSkgPT0gMjoKKyAgICAgICAgICAgICAgICBzdGF0ZSwgc2xvdHN0YXRlID0gc3RhdGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2xvdHN0YXRlID0gTm9uZQorICAgICAgICAgICAgaWYgc3RhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeS5fX2RpY3RfXy51cGRhdGUoc3RhdGUpCisgICAgICAgICAgICBpZiBzbG90c3RhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2xvdHN0YXRlLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHksIGtleSwgdmFsdWUpCisKKyAgICBpZiBsaXN0aXRlciBpcyBub3QgTm9uZToKKyAgICAgICAgZm9yIGl0ZW0gaW4gbGlzdGl0ZXI6CisgICAgICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgICAgIGl0ZW0gPSBkZWVwY29weShpdGVtLCBtZW1vKQorICAgICAgICAgICAgeS5hcHBlbmQoaXRlbSkKKyAgICBpZiBkaWN0aXRlciBpcyBub3QgTm9uZToKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdGl0ZXI6CisgICAgICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgICAgIGtleSA9IGRlZXBjb3B5KGtleSwgbWVtbykKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGRlZXBjb3B5KHZhbHVlLCBtZW1vKQorICAgICAgICAgICAgeVtrZXldID0gdmFsdWUKKyAgICByZXR1cm4geQorCitkZWwgZAorCitkZWwgdHlwZXMKKworIyBIZWxwZXIgZm9yIGluc3RhbmNlIGNyZWF0aW9uIHdpdGhvdXQgY2FsbGluZyBfX2luaXRfXworY2xhc3MgX0VtcHR5Q2xhc3M6CisgICAgcGFzcworCitkZWYgX3Rlc3QoKToKKyAgICBsID0gW05vbmUsIDEsIDJMLCAzLjE0LCAneHl6enknLCAoMSwgMkwpLCBbMy4xNCwgJ2FiYyddLAorICAgICAgICAgeydhYmMnOiAnQUJDJ30sICgpLCBbXSwge31dCisgICAgbDEgPSBjb3B5KGwpCisgICAgcHJpbnQgbDE9PWwKKyAgICBsMSA9IG1hcChjb3B5LCBsKQorICAgIHByaW50IGwxPT1sCisgICAgbDEgPSBkZWVwY29weShsKQorICAgIHByaW50IGwxPT1sCisgICAgY2xhc3MgQzoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZz1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuYSA9IDEKKyAgICAgICAgICAgIHNlbGYuYXJnID0gYXJnCisgICAgICAgICAgICBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmlsZSA9IF9fZmlsZV9fCisgICAgICAgICAgICBzZWxmLmZwID0gb3BlbihmaWxlKQorICAgICAgICAgICAgc2VsZi5mcC5jbG9zZSgpCisgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4geydhJzogc2VsZi5hLCAnYXJnJzogc2VsZi5hcmd9CisgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc3RhdGUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBrZXksIHZhbHVlKQorICAgICAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW89Tm9uZSk6CisgICAgICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXyhkZWVwY29weShzZWxmLmFyZywgbWVtbykpCisgICAgICAgICAgICBuZXcuYSA9IHNlbGYuYQorICAgICAgICAgICAgcmV0dXJuIG5ldworICAgIGMgPSBDKCdhcmd1bWVudCBza2V0Y2gnKQorICAgIGwuYXBwZW5kKGMpCisgICAgbDIgPSBjb3B5KGwpCisgICAgcHJpbnQgbCA9PSBsMgorICAgIHByaW50IGwKKyAgICBwcmludCBsMgorICAgIGwyID0gZGVlcGNvcHkobCkKKyAgICBwcmludCBsID09IGwyCisgICAgcHJpbnQgbAorICAgIHByaW50IGwyCisgICAgbC5hcHBlbmQoe2xbMV06IGwsICd4eXonOiBsWzJdfSkKKyAgICBsMyA9IGNvcHkobCkKKyAgICBpbXBvcnQgcmVwcgorICAgIHByaW50IG1hcChyZXByLnJlcHIsIGwpCisgICAgcHJpbnQgbWFwKHJlcHIucmVwciwgbDEpCisgICAgcHJpbnQgbWFwKHJlcHIucmVwciwgbDIpCisgICAgcHJpbnQgbWFwKHJlcHIucmVwciwgbDMpCisgICAgbDMgPSBkZWVwY29weShsKQorICAgIGltcG9ydCByZXByCisgICAgcHJpbnQgbWFwKHJlcHIucmVwciwgbCkKKyAgICBwcmludCBtYXAocmVwci5yZXByLCBsMSkKKyAgICBwcmludCBtYXAocmVwci5yZXByLCBsMikKKyAgICBwcmludCBtYXAocmVwci5yZXByLCBsMykKKyAgICBjbGFzcyBvZGljdChkaWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGQgPSB7fSk6CisgICAgICAgICAgICBzZWxmLmEgPSA5OQorICAgICAgICAgICAgZGljdC5fX2luaXRfXyhzZWxmLCBkKQorICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaywgaSk6CisgICAgICAgICAgICBkaWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGssIGkpCisgICAgICAgICAgICBzZWxmLmEKKyAgICBvID0gb2RpY3QoeyJBIiA6ICJCIn0pCisgICAgeCA9IGRlZXBjb3B5KG8pCisgICAgcHJpbnQobywgeCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvcHkucHljIGIvbGliL3B5dGhvbjIuNy9jb3B5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGFhMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb3B5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvcHkucHlvIGIvbGliL3B5dGhvbjIuNy9jb3B5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzQ3YzFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb3B5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvcHlfcmVnLnB5IGIvbGliL3B5dGhvbjIuNy9jb3B5X3JlZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE3MTUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jb3B5X3JlZy5weQpAQCAtMCwwICsxLDIwMSBAQAorIiIiSGVscGVyIHRvIHByb3ZpZGUgZXh0ZW5zaWJpbGl0eSBmb3IgcGlja2xlL2NQaWNrbGUuCisKK1RoaXMgaXMgb25seSB1c2VmdWwgdG8gYWRkIHBpY2tsZSBzdXBwb3J0IGZvciBleHRlbnNpb24gdHlwZXMgZGVmaW5lZCBpbgorQywgbm90IGZvciBpbnN0YW5jZXMgb2YgdXNlci1kZWZpbmVkIGNsYXNzZXMuCisiIiIKKworZnJvbSB0eXBlcyBpbXBvcnQgQ2xhc3NUeXBlIGFzIF9DbGFzc1R5cGUKKworX19hbGxfXyA9IFsicGlja2xlIiwgImNvbnN0cnVjdG9yIiwKKyAgICAgICAgICAgImFkZF9leHRlbnNpb24iLCAicmVtb3ZlX2V4dGVuc2lvbiIsICJjbGVhcl9leHRlbnNpb25fY2FjaGUiXQorCitkaXNwYXRjaF90YWJsZSA9IHt9CisKK2RlZiBwaWNrbGUob2JfdHlwZSwgcGlja2xlX2Z1bmN0aW9uLCBjb25zdHJ1Y3Rvcl9vYj1Ob25lKToKKyAgICBpZiB0eXBlKG9iX3R5cGUpIGlzIF9DbGFzc1R5cGU6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY29weV9yZWcgaXMgbm90IGludGVuZGVkIGZvciB1c2Ugd2l0aCBjbGFzc2VzIikKKworICAgIGlmIG5vdCBoYXNhdHRyKHBpY2tsZV9mdW5jdGlvbiwgJ19fY2FsbF9fJyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigicmVkdWN0aW9uIGZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxhYmxlIikKKyAgICBkaXNwYXRjaF90YWJsZVtvYl90eXBlXSA9IHBpY2tsZV9mdW5jdGlvbgorCisgICAgIyBUaGUgY29uc3RydWN0b3Jfb2IgZnVuY3Rpb24gaXMgYSB2ZXN0aWdlIG9mIHNhZmUgZm9yIHVucGlja2xpbmcuCisgICAgIyBUaGVyZSBpcyBubyByZWFzb24gZm9yIHRoZSBjYWxsZXIgdG8gcGFzcyBpdCBhbnltb3JlLgorICAgIGlmIGNvbnN0cnVjdG9yX29iIGlzIG5vdCBOb25lOgorICAgICAgICBjb25zdHJ1Y3Rvcihjb25zdHJ1Y3Rvcl9vYikKKworZGVmIGNvbnN0cnVjdG9yKG9iamVjdCk6CisgICAgaWYgbm90IGhhc2F0dHIob2JqZWN0LCAnX19jYWxsX18nKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjb25zdHJ1Y3RvcnMgbXVzdCBiZSBjYWxsYWJsZSIpCisKKyMgRXhhbXBsZTogcHJvdmlkZSBwaWNrbGluZyBzdXBwb3J0IGZvciBjb21wbGV4IG51bWJlcnMuCisKK3RyeToKKyAgICBjb21wbGV4CitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisKKyAgICBkZWYgcGlja2xlX2NvbXBsZXgoYyk6CisgICAgICAgIHJldHVybiBjb21wbGV4LCAoYy5yZWFsLCBjLmltYWcpCisKKyAgICBwaWNrbGUoY29tcGxleCwgcGlja2xlX2NvbXBsZXgsIGNvbXBsZXgpCisKKyMgU3VwcG9ydCBmb3IgcGlja2xpbmcgbmV3LXN0eWxlIG9iamVjdHMKKworZGVmIF9yZWNvbnN0cnVjdG9yKGNscywgYmFzZSwgc3RhdGUpOgorICAgIGlmIGJhc2UgaXMgb2JqZWN0OgorICAgICAgICBvYmogPSBvYmplY3QuX19uZXdfXyhjbHMpCisgICAgZWxzZToKKyAgICAgICAgb2JqID0gYmFzZS5fX25ld19fKGNscywgc3RhdGUpCisgICAgICAgIGlmIGJhc2UuX19pbml0X18gIT0gb2JqZWN0Ll9faW5pdF9fOgorICAgICAgICAgICAgYmFzZS5fX2luaXRfXyhvYmosIHN0YXRlKQorICAgIHJldHVybiBvYmoKKworX0hFQVBUWVBFID0gMTw8OQorCisjIFB5dGhvbiBjb2RlIGZvciBvYmplY3QuX19yZWR1Y2VfZXhfXyBmb3IgcHJvdG9jb2xzIDAgYW5kIDEKKworZGVmIF9yZWR1Y2VfZXgoc2VsZiwgcHJvdG8pOgorICAgIGFzc2VydCBwcm90byA8IDIKKyAgICBmb3IgYmFzZSBpbiBzZWxmLl9fY2xhc3NfXy5fX21yb19fOgorICAgICAgICBpZiBoYXNhdHRyKGJhc2UsICdfX2ZsYWdzX18nKSBhbmQgbm90IGJhc2UuX19mbGFnc19fICYgX0hFQVBUWVBFOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBiYXNlID0gb2JqZWN0ICMgbm90IHJlYWxseSByZWFjaGFibGUKKyAgICBpZiBiYXNlIGlzIG9iamVjdDoKKyAgICAgICAgc3RhdGUgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgaWYgYmFzZSBpcyBzZWxmLl9fY2xhc3NfXzoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbid0IHBpY2tsZSAlcyBvYmplY3RzIiAlIGJhc2UuX19uYW1lX18KKyAgICAgICAgc3RhdGUgPSBiYXNlKHNlbGYpCisgICAgYXJncyA9IChzZWxmLl9fY2xhc3NfXywgYmFzZSwgc3RhdGUpCisgICAgdHJ5OgorICAgICAgICBnZXRzdGF0ZSA9IHNlbGYuX19nZXRzdGF0ZV9fCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBpZiBnZXRhdHRyKHNlbGYsICJfX3Nsb3RzX18iLCBOb25lKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYSBjbGFzcyB0aGF0IGRlZmluZXMgX19zbG90c19fIHdpdGhvdXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZpbmluZyBfX2dldHN0YXRlX18gY2Fubm90IGJlIHBpY2tsZWQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkaWN0ID0gc2VsZi5fX2RpY3RfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBkaWN0ID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGRpY3QgPSBnZXRzdGF0ZSgpCisgICAgaWYgZGljdDoKKyAgICAgICAgcmV0dXJuIF9yZWNvbnN0cnVjdG9yLCBhcmdzLCBkaWN0CisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9yZWNvbnN0cnVjdG9yLCBhcmdzCisKKyMgSGVscGVyIGZvciBfX3JlZHVjZV9leF9fIHByb3RvY29sIDIKKworZGVmIF9fbmV3b2JqX18oY2xzLCAqYXJncyk6CisgICAgcmV0dXJuIGNscy5fX25ld19fKGNscywgKmFyZ3MpCisKK2RlZiBfc2xvdG5hbWVzKGNscyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzbG90IG5hbWVzIGZvciBhIGdpdmVuIGNsYXNzLgorCisgICAgVGhpcyBuZWVkcyB0byBmaW5kIHNsb3RzIGRlZmluZWQgYnkgdGhlIGNsYXNzIGFuZCBpdHMgYmFzZXMsIHNvIHdlCisgICAgY2FuJ3Qgc2ltcGx5IHJldHVybiB0aGUgX19zbG90c19fIGF0dHJpYnV0ZS4gIFdlIG11c3Qgd2FsayBkb3duCisgICAgdGhlIE1ldGhvZCBSZXNvbHV0aW9uIE9yZGVyIGFuZCBjb25jYXRlbmF0ZSB0aGUgX19zbG90c19fIG9mIGVhY2gKKyAgICBjbGFzcyBmb3VuZCB0aGVyZS4gIChUaGlzIGFzc3VtZXMgY2xhc3NlcyBkb24ndCBtb2RpZnkgdGhlaXIKKyAgICBfX3Nsb3RzX18gYXR0cmlidXRlIHRvIG1pc3JlcHJlc2VudCB0aGVpciBzbG90cyBhZnRlciB0aGUgY2xhc3MgaXMKKyAgICBkZWZpbmVkLikKKyAgICAiIiIKKworICAgICMgR2V0IHRoZSB2YWx1ZSBmcm9tIGEgY2FjaGUgaW4gdGhlIGNsYXNzIGlmIHBvc3NpYmxlCisgICAgbmFtZXMgPSBjbHMuX19kaWN0X18uZ2V0KCJfX3Nsb3RuYW1lc19fIikKKyAgICBpZiBuYW1lcyBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIG5hbWVzCisKKyAgICAjIE5vdCBjYWNoZWQgLS0gY2FsY3VsYXRlIHRoZSB2YWx1ZQorICAgIG5hbWVzID0gW10KKyAgICBpZiBub3QgaGFzYXR0cihjbHMsICJfX3Nsb3RzX18iKToKKyAgICAgICAgIyBUaGlzIGNsYXNzIGhhcyBubyBzbG90cworICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyBTbG90cyBmb3VuZCAtLSBnYXRoZXIgc2xvdCBuYW1lcyBmcm9tIGFsbCBiYXNlIGNsYXNzZXMKKyAgICAgICAgZm9yIGMgaW4gY2xzLl9fbXJvX186CisgICAgICAgICAgICBpZiAiX19zbG90c19fIiBpbiBjLl9fZGljdF9fOgorICAgICAgICAgICAgICAgIHNsb3RzID0gYy5fX2RpY3RfX1snX19zbG90c19fJ10KKyAgICAgICAgICAgICAgICAjIGlmIGNsYXNzIGhhcyBhIHNpbmdsZSBzbG90LCBpdCBjYW4gYmUgZ2l2ZW4gYXMgYSBzdHJpbmcKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNsb3RzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICAgICAgc2xvdHMgPSAoc2xvdHMsKQorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIHNsb3RzOgorICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgZGVzY3JpcHRvcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiAoIl9fZGljdF9fIiwgIl9fd2Vha3JlZl9fIik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAjIG1hbmdsZWQgbmFtZXMKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBuYW1lLnN0YXJ0c3dpdGgoJ19fJykgYW5kIG5vdCBuYW1lLmVuZHN3aXRoKCdfXycpOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMuYXBwZW5kKCdfJXMlcycgJSAoYy5fX25hbWVfXywgbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQobmFtZSkKKworICAgICMgQ2FjaGUgdGhlIG91dGNvbWUgaW4gdGhlIGNsYXNzIGlmIGF0IGFsbCBwb3NzaWJsZQorICAgIHRyeToKKyAgICAgICAgY2xzLl9fc2xvdG5hbWVzX18gPSBuYW1lcworICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcyAjIEJ1dCBkb24ndCBkaWUgaWYgd2UgY2FuJ3QKKworICAgIHJldHVybiBuYW1lcworCisjIEEgcmVnaXN0cnkgb2YgZXh0ZW5zaW9uIGNvZGVzLiAgVGhpcyBpcyBhbiBhZC1ob2MgY29tcHJlc3Npb24KKyMgbWVjaGFuaXNtLiAgV2hlbmV2ZXIgYSBnbG9iYWwgcmVmZXJlbmNlIHRvIDxtb2R1bGU+LCA8bmFtZT4gaXMgYWJvdXQKKyMgdG8gYmUgcGlja2xlZCwgdGhlICg8bW9kdWxlPiwgPG5hbWU+KSB0dXBsZSBpcyBsb29rZWQgdXAgaGVyZSB0byBzZWUKKyMgaWYgaXQgaXMgYSByZWdpc3RlcmVkIGV4dGVuc2lvbiBjb2RlIGZvciBpdC4gIEV4dGVuc2lvbiBjb2RlcyBhcmUKKyMgdW5pdmVyc2FsLCBzbyB0aGF0IHRoZSBtZWFuaW5nIG9mIGEgcGlja2xlIGRvZXMgbm90IGRlcGVuZCBvbgorIyBjb250ZXh0LiAgKFRoZXJlIGFyZSBhbHNvIHNvbWUgY29kZXMgcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZSB0aGF0CisjIGRvbid0IGhhdmUgdGhpcyByZXN0cmljdGlvbi4pICBDb2RlcyBhcmUgcG9zaXRpdmUgaW50czsgMCBpcworIyByZXNlcnZlZC4KKworX2V4dGVuc2lvbl9yZWdpc3RyeSA9IHt9ICAgICAgICAgICAgICAgICMga2V5IC0+IGNvZGUKK19pbnZlcnRlZF9yZWdpc3RyeSA9IHt9ICAgICAgICAgICAgICAgICAjIGNvZGUgLT4ga2V5CitfZXh0ZW5zaW9uX2NhY2hlID0ge30gICAgICAgICAgICAgICAgICAgIyBjb2RlIC0+IG9iamVjdAorIyBEb24ndCBldmVyIHJlYmluZCB0aG9zZSBuYW1lczogIGNQaWNrbGUgZ3JhYnMgYSByZWZlcmVuY2UgdG8gdGhlbSB3aGVuCisjIGl0J3MgaW5pdGlhbGl6ZWQsIGFuZCB3b24ndCBzZWUgYSByZWJpbmRpbmcuCisKK2RlZiBhZGRfZXh0ZW5zaW9uKG1vZHVsZSwgbmFtZSwgY29kZSk6CisgICAgIiIiUmVnaXN0ZXIgYW4gZXh0ZW5zaW9uIGNvZGUuIiIiCisgICAgY29kZSA9IGludChjb2RlKQorICAgIGlmIG5vdCAxIDw9IGNvZGUgPD0gMHg3ZmZmZmZmZjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImNvZGUgb3V0IG9mIHJhbmdlIgorICAgIGtleSA9IChtb2R1bGUsIG5hbWUpCisgICAgaWYgKF9leHRlbnNpb25fcmVnaXN0cnkuZ2V0KGtleSkgPT0gY29kZSBhbmQKKyAgICAgICAgX2ludmVydGVkX3JlZ2lzdHJ5LmdldChjb2RlKSA9PSBrZXkpOgorICAgICAgICByZXR1cm4gIyBSZWR1bmRhbnQgcmVnaXN0cmF0aW9ucyBhcmUgYmVuaWduCisgICAgaWYga2V5IGluIF9leHRlbnNpb25fcmVnaXN0cnk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImtleSAlcyBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBjb2RlICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGtleSwgX2V4dGVuc2lvbl9yZWdpc3RyeVtrZXldKSkKKyAgICBpZiBjb2RlIGluIF9pbnZlcnRlZF9yZWdpc3RyeToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiY29kZSAlcyBpcyBhbHJlYWR5IGluIHVzZSBmb3Iga2V5ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUsIF9pbnZlcnRlZF9yZWdpc3RyeVtjb2RlXSkpCisgICAgX2V4dGVuc2lvbl9yZWdpc3RyeVtrZXldID0gY29kZQorICAgIF9pbnZlcnRlZF9yZWdpc3RyeVtjb2RlXSA9IGtleQorCitkZWYgcmVtb3ZlX2V4dGVuc2lvbihtb2R1bGUsIG5hbWUsIGNvZGUpOgorICAgICIiIlVucmVnaXN0ZXIgYW4gZXh0ZW5zaW9uIGNvZGUuICBGb3IgdGVzdGluZyBvbmx5LiIiIgorICAgIGtleSA9IChtb2R1bGUsIG5hbWUpCisgICAgaWYgKF9leHRlbnNpb25fcmVnaXN0cnkuZ2V0KGtleSkgIT0gY29kZSBvcgorICAgICAgICBfaW52ZXJ0ZWRfcmVnaXN0cnkuZ2V0KGNvZGUpICE9IGtleSk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImtleSAlcyBpcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGNvZGUgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5LCBjb2RlKSkKKyAgICBkZWwgX2V4dGVuc2lvbl9yZWdpc3RyeVtrZXldCisgICAgZGVsIF9pbnZlcnRlZF9yZWdpc3RyeVtjb2RlXQorICAgIGlmIGNvZGUgaW4gX2V4dGVuc2lvbl9jYWNoZToKKyAgICAgICAgZGVsIF9leHRlbnNpb25fY2FjaGVbY29kZV0KKworZGVmIGNsZWFyX2V4dGVuc2lvbl9jYWNoZSgpOgorICAgIF9leHRlbnNpb25fY2FjaGUuY2xlYXIoKQorCisjIFN0YW5kYXJkIGV4dGVuc2lvbiBjb2RlIGFzc2lnbm1lbnRzCisKKyMgUmVzZXJ2ZWQgcmFuZ2VzCisKKyMgRmlyc3QgIExhc3QgQ291bnQgIFB1cnBvc2UKKyMgICAgIDEgICAxMjcgICAxMjcgIFJlc2VydmVkIGZvciBQeXRob24gc3RhbmRhcmQgbGlicmFyeQorIyAgIDEyOCAgIDE5MSAgICA2NCAgUmVzZXJ2ZWQgZm9yIFpvcGUKKyMgICAxOTIgICAyMzkgICAgNDggIFJlc2VydmVkIGZvciAzcmQgcGFydGllcworIyAgIDI0MCAgIDI1NSAgICAxNiAgUmVzZXJ2ZWQgZm9yIHByaXZhdGUgdXNlICh3aWxsIG5ldmVyIGJlIGFzc2lnbmVkKQorIyAgIDI1NiAgIEluZiAgIEluZiAgUmVzZXJ2ZWQgZm9yIGZ1dHVyZSBhc3NpZ25tZW50CisKKyMgRXh0ZW5zaW9uIGNvZGVzIGFyZSBhc3NpZ25lZCBieSB0aGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvcHlfcmVnLnB5YyBiL2xpYi9weXRob24yLjcvY29weV9yZWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjZlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvcHlfcmVnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2NvcHlfcmVnLnB5byBiL2xpYi9weXRob24yLjcvY29weV9yZWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5Y2E5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2NvcHlfcmVnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Nzdi5weSBiL2xpYi9weXRob24yLjcvY3N2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NGVkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Nzdi5weQpAQCAtMCwwICsxLDQ1MSBAQAorCisiIiIKK2Nzdi5weSAtIHJlYWQvd3JpdGUvaW52ZXN0aWdhdGUgQ1NWIGZpbGVzCisiIiIKKworaW1wb3J0IHJlCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcmVkdWNlCitmcm9tIF9jc3YgaW1wb3J0IEVycm9yLCBfX3ZlcnNpb25fXywgd3JpdGVyLCByZWFkZXIsIHJlZ2lzdGVyX2RpYWxlY3QsIFwKKyAgICAgICAgICAgICAgICAgdW5yZWdpc3Rlcl9kaWFsZWN0LCBnZXRfZGlhbGVjdCwgbGlzdF9kaWFsZWN0cywgXAorICAgICAgICAgICAgICAgICBmaWVsZF9zaXplX2xpbWl0LCBcCisgICAgICAgICAgICAgICAgIFFVT1RFX01JTklNQUwsIFFVT1RFX0FMTCwgUVVPVEVfTk9OTlVNRVJJQywgUVVPVEVfTk9ORSwgXAorICAgICAgICAgICAgICAgICBfX2RvY19fCitmcm9tIF9jc3YgaW1wb3J0IERpYWxlY3QgYXMgX0RpYWxlY3QKKwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK19fYWxsX18gPSBbICJRVU9URV9NSU5JTUFMIiwgIlFVT1RFX0FMTCIsICJRVU9URV9OT05OVU1FUklDIiwgIlFVT1RFX05PTkUiLAorICAgICAgICAgICAgIkVycm9yIiwgIkRpYWxlY3QiLCAiX19kb2NfXyIsICJleGNlbCIsICJleGNlbF90YWIiLAorICAgICAgICAgICAgImZpZWxkX3NpemVfbGltaXQiLCAicmVhZGVyIiwgIndyaXRlciIsCisgICAgICAgICAgICAicmVnaXN0ZXJfZGlhbGVjdCIsICJnZXRfZGlhbGVjdCIsICJsaXN0X2RpYWxlY3RzIiwgIlNuaWZmZXIiLAorICAgICAgICAgICAgInVucmVnaXN0ZXJfZGlhbGVjdCIsICJfX3ZlcnNpb25fXyIsICJEaWN0UmVhZGVyIiwgIkRpY3RXcml0ZXIiIF0KKworY2xhc3MgRGlhbGVjdDoKKyAgICAiIiJEZXNjcmliZSBhbiBFeGNlbCBkaWFsZWN0LgorCisgICAgVGhpcyBtdXN0IGJlIHN1YmNsYXNzZWQgKHNlZSBjc3YuZXhjZWwpLiAgVmFsaWQgYXR0cmlidXRlcyBhcmU6CisgICAgZGVsaW1pdGVyLCBxdW90ZWNoYXIsIGVzY2FwZWNoYXIsIGRvdWJsZXF1b3RlLCBza2lwaW5pdGlhbHNwYWNlLAorICAgIGxpbmV0ZXJtaW5hdG9yLCBxdW90aW5nLgorCisgICAgIiIiCisgICAgX25hbWUgPSAiIgorICAgIF92YWxpZCA9IEZhbHNlCisgICAgIyBwbGFjZWhvbGRlcnMKKyAgICBkZWxpbWl0ZXIgPSBOb25lCisgICAgcXVvdGVjaGFyID0gTm9uZQorICAgIGVzY2FwZWNoYXIgPSBOb25lCisgICAgZG91YmxlcXVvdGUgPSBOb25lCisgICAgc2tpcGluaXRpYWxzcGFjZSA9IE5vbmUKKyAgICBsaW5ldGVybWluYXRvciA9IE5vbmUKKyAgICBxdW90aW5nID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyAhPSBEaWFsZWN0OgorICAgICAgICAgICAgc2VsZi5fdmFsaWQgPSBUcnVlCisgICAgICAgIHNlbGYuX3ZhbGlkYXRlKCkKKworICAgIGRlZiBfdmFsaWRhdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9EaWFsZWN0KHNlbGYpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6CisgICAgICAgICAgICAjIFdlIGRvIHRoaXMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBweTIuMworICAgICAgICAgICAgcmFpc2UgRXJyb3Ioc3RyKGUpKQorCitjbGFzcyBleGNlbChEaWFsZWN0KToKKyAgICAiIiJEZXNjcmliZSB0aGUgdXN1YWwgcHJvcGVydGllcyBvZiBFeGNlbC1nZW5lcmF0ZWQgQ1NWIGZpbGVzLiIiIgorICAgIGRlbGltaXRlciA9ICcsJworICAgIHF1b3RlY2hhciA9ICciJworICAgIGRvdWJsZXF1b3RlID0gVHJ1ZQorICAgIHNraXBpbml0aWFsc3BhY2UgPSBGYWxzZQorICAgIGxpbmV0ZXJtaW5hdG9yID0gJ1xyXG4nCisgICAgcXVvdGluZyA9IFFVT1RFX01JTklNQUwKK3JlZ2lzdGVyX2RpYWxlY3QoImV4Y2VsIiwgZXhjZWwpCisKK2NsYXNzIGV4Y2VsX3RhYihleGNlbCk6CisgICAgIiIiRGVzY3JpYmUgdGhlIHVzdWFsIHByb3BlcnRpZXMgb2YgRXhjZWwtZ2VuZXJhdGVkIFRBQi1kZWxpbWl0ZWQgZmlsZXMuIiIiCisgICAgZGVsaW1pdGVyID0gJ1x0JworcmVnaXN0ZXJfZGlhbGVjdCgiZXhjZWwtdGFiIiwgZXhjZWxfdGFiKQorCisKK2NsYXNzIERpY3RSZWFkZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYsIGZpZWxkbmFtZXM9Tm9uZSwgcmVzdGtleT1Ob25lLCByZXN0dmFsPU5vbmUsCisgICAgICAgICAgICAgICAgIGRpYWxlY3Q9ImV4Y2VsIiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHNlbGYuX2ZpZWxkbmFtZXMgPSBmaWVsZG5hbWVzICAgIyBsaXN0IG9mIGtleXMgZm9yIHRoZSBkaWN0CisgICAgICAgIHNlbGYucmVzdGtleSA9IHJlc3RrZXkgICAgICAgICAgIyBrZXkgdG8gY2F0Y2ggbG9uZyByb3dzCisgICAgICAgIHNlbGYucmVzdHZhbCA9IHJlc3R2YWwgICAgICAgICAgIyBkZWZhdWx0IHZhbHVlIGZvciBzaG9ydCByb3dzCisgICAgICAgIHNlbGYucmVhZGVyID0gcmVhZGVyKGYsIGRpYWxlY3QsICphcmdzLCAqKmt3ZHMpCisgICAgICAgIHNlbGYuZGlhbGVjdCA9IGRpYWxlY3QKKyAgICAgICAgc2VsZi5saW5lX251bSA9IDAKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBmaWVsZG5hbWVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9maWVsZG5hbWVzIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fZmllbGRuYW1lcyA9IHNlbGYucmVhZGVyLm5leHQoKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmxpbmVfbnVtID0gc2VsZi5yZWFkZXIubGluZV9udW0KKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpZWxkbmFtZXMKKworICAgIEBmaWVsZG5hbWVzLnNldHRlcgorICAgIGRlZiBmaWVsZG5hbWVzKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fZmllbGRuYW1lcyA9IHZhbHVlCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5saW5lX251bSA9PSAwOgorICAgICAgICAgICAgIyBVc2VkIG9ubHkgZm9yIGl0cyBzaWRlIGVmZmVjdC4KKyAgICAgICAgICAgIHNlbGYuZmllbGRuYW1lcworICAgICAgICByb3cgPSBzZWxmLnJlYWRlci5uZXh0KCkKKyAgICAgICAgc2VsZi5saW5lX251bSA9IHNlbGYucmVhZGVyLmxpbmVfbnVtCisKKyAgICAgICAgIyB1bmxpa2UgdGhlIGJhc2ljIHJlYWRlciwgd2UgcHJlZmVyIG5vdCB0byByZXR1cm4gYmxhbmtzLAorICAgICAgICAjIGJlY2F1c2Ugd2Ugd2lsbCB0eXBpY2FsbHkgd2luZCB1cCB3aXRoIGEgZGljdCBmdWxsIG9mIE5vbmUKKyAgICAgICAgIyB2YWx1ZXMKKyAgICAgICAgd2hpbGUgcm93ID09IFtdOgorICAgICAgICAgICAgcm93ID0gc2VsZi5yZWFkZXIubmV4dCgpCisgICAgICAgIGQgPSBkaWN0KHppcChzZWxmLmZpZWxkbmFtZXMsIHJvdykpCisgICAgICAgIGxmID0gbGVuKHNlbGYuZmllbGRuYW1lcykKKyAgICAgICAgbHIgPSBsZW4ocm93KQorICAgICAgICBpZiBsZiA8IGxyOgorICAgICAgICAgICAgZFtzZWxmLnJlc3RrZXldID0gcm93W2xmOl0KKyAgICAgICAgZWxpZiBsZiA+IGxyOgorICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmZpZWxkbmFtZXNbbHI6XToKKyAgICAgICAgICAgICAgICBkW2tleV0gPSBzZWxmLnJlc3R2YWwKKyAgICAgICAgcmV0dXJuIGQKKworCitjbGFzcyBEaWN0V3JpdGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBmaWVsZG5hbWVzLCByZXN0dmFsPSIiLCBleHRyYXNhY3Rpb249InJhaXNlIiwKKyAgICAgICAgICAgICAgICAgZGlhbGVjdD0iZXhjZWwiLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgc2VsZi5maWVsZG5hbWVzID0gZmllbGRuYW1lcyAgICAjIGxpc3Qgb2Yga2V5cyBmb3IgdGhlIGRpY3QKKyAgICAgICAgc2VsZi5yZXN0dmFsID0gcmVzdHZhbCAgICAgICAgICAjIGZvciB3cml0aW5nIHNob3J0IGRpY3RzCisgICAgICAgIGlmIGV4dHJhc2FjdGlvbi5sb3dlcigpIG5vdCBpbiAoInJhaXNlIiwgImlnbm9yZSIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgKCJleHRyYXNhY3Rpb24gKCVzKSBtdXN0IGJlICdyYWlzZScgb3IgJ2lnbm9yZSciICUKKyAgICAgICAgICAgICAgICAgICBleHRyYXNhY3Rpb24pCisgICAgICAgIHNlbGYuZXh0cmFzYWN0aW9uID0gZXh0cmFzYWN0aW9uCisgICAgICAgIHNlbGYud3JpdGVyID0gd3JpdGVyKGYsIGRpYWxlY3QsICphcmdzLCAqKmt3ZHMpCisKKyAgICBkZWYgd3JpdGVoZWFkZXIoc2VsZik6CisgICAgICAgIGhlYWRlciA9IGRpY3QoemlwKHNlbGYuZmllbGRuYW1lcywgc2VsZi5maWVsZG5hbWVzKSkKKyAgICAgICAgc2VsZi53cml0ZXJvdyhoZWFkZXIpCisKKyAgICBkZWYgX2RpY3RfdG9fbGlzdChzZWxmLCByb3dkaWN0KToKKyAgICAgICAgaWYgc2VsZi5leHRyYXNhY3Rpb24gPT0gInJhaXNlIjoKKyAgICAgICAgICAgIHdyb25nX2ZpZWxkcyA9IFtrIGZvciBrIGluIHJvd2RpY3QgaWYgayBub3QgaW4gc2VsZi5maWVsZG5hbWVzXQorICAgICAgICAgICAgaWYgd3JvbmdfZmllbGRzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImRpY3QgY29udGFpbnMgZmllbGRzIG5vdCBpbiBmaWVsZG5hbWVzOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIuam9pbih3cm9uZ19maWVsZHMpKQorICAgICAgICByZXR1cm4gW3Jvd2RpY3QuZ2V0KGtleSwgc2VsZi5yZXN0dmFsKSBmb3Iga2V5IGluIHNlbGYuZmllbGRuYW1lc10KKworICAgIGRlZiB3cml0ZXJvdyhzZWxmLCByb3dkaWN0KToKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGVyLndyaXRlcm93KHNlbGYuX2RpY3RfdG9fbGlzdChyb3dkaWN0KSkKKworICAgIGRlZiB3cml0ZXJvd3Moc2VsZiwgcm93ZGljdHMpOgorICAgICAgICByb3dzID0gW10KKyAgICAgICAgZm9yIHJvd2RpY3QgaW4gcm93ZGljdHM6CisgICAgICAgICAgICByb3dzLmFwcGVuZChzZWxmLl9kaWN0X3RvX2xpc3Qocm93ZGljdCkpCisgICAgICAgIHJldHVybiBzZWxmLndyaXRlci53cml0ZXJvd3Mocm93cykKKworIyBHdWFyZCBTbmlmZmVyJ3MgdHlwZSBjaGVja2luZyBhZ2FpbnN0IGJ1aWxkcyB0aGF0IGV4Y2x1ZGUgY29tcGxleCgpCit0cnk6CisgICAgY29tcGxleAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBjb21wbGV4ID0gZmxvYXQKKworY2xhc3MgU25pZmZlcjoKKyAgICAnJycKKyAgICAiU25pZmZzIiB0aGUgZm9ybWF0IG9mIGEgQ1NWIGZpbGUgKGkuZS4gZGVsaW1pdGVyLCBxdW90ZWNoYXIpCisgICAgUmV0dXJucyBhIERpYWxlY3Qgb2JqZWN0LgorICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBpbiBjYXNlIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgcG9zc2libGUgZGVsaW1pdGVyCisgICAgICAgIHNlbGYucHJlZmVycmVkID0gWycsJywgJ1x0JywgJzsnLCAnICcsICc6J10KKworCisgICAgZGVmIHNuaWZmKHNlbGYsIHNhbXBsZSwgZGVsaW1pdGVycz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBkaWFsZWN0IChvciBOb25lKSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzYW1wbGUKKyAgICAgICAgIiIiCisKKyAgICAgICAgcXVvdGVjaGFyLCBkb3VibGVxdW90ZSwgZGVsaW1pdGVyLCBza2lwaW5pdGlhbHNwYWNlID0gXAorICAgICAgICAgICAgICAgICAgIHNlbGYuX2d1ZXNzX3F1b3RlX2FuZF9kZWxpbWl0ZXIoc2FtcGxlLCBkZWxpbWl0ZXJzKQorICAgICAgICBpZiBub3QgZGVsaW1pdGVyOgorICAgICAgICAgICAgZGVsaW1pdGVyLCBza2lwaW5pdGlhbHNwYWNlID0gc2VsZi5fZ3Vlc3NfZGVsaW1pdGVyKHNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJzKQorCisgICAgICAgIGlmIG5vdCBkZWxpbWl0ZXI6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgIkNvdWxkIG5vdCBkZXRlcm1pbmUgZGVsaW1pdGVyIgorCisgICAgICAgIGNsYXNzIGRpYWxlY3QoRGlhbGVjdCk6CisgICAgICAgICAgICBfbmFtZSA9ICJzbmlmZmVkIgorICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicKKyAgICAgICAgICAgIHF1b3RpbmcgPSBRVU9URV9NSU5JTUFMCisgICAgICAgICAgICAjIGVzY2FwZWNoYXIgPSAnJworCisgICAgICAgIGRpYWxlY3QuZG91YmxlcXVvdGUgPSBkb3VibGVxdW90ZQorICAgICAgICBkaWFsZWN0LmRlbGltaXRlciA9IGRlbGltaXRlcgorICAgICAgICAjIF9jc3YucmVhZGVyIHdvbid0IGFjY2VwdCBhIHF1b3RlY2hhciBvZiAnJworICAgICAgICBkaWFsZWN0LnF1b3RlY2hhciA9IHF1b3RlY2hhciBvciAnIicKKyAgICAgICAgZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlID0gc2tpcGluaXRpYWxzcGFjZQorCisgICAgICAgIHJldHVybiBkaWFsZWN0CisKKworICAgIGRlZiBfZ3Vlc3NfcXVvdGVfYW5kX2RlbGltaXRlcihzZWxmLCBkYXRhLCBkZWxpbWl0ZXJzKToKKyAgICAgICAgIiIiCisgICAgICAgIExvb2tzIGZvciB0ZXh0IGVuY2xvc2VkIGJldHdlZW4gdHdvIGlkZW50aWNhbCBxdW90ZXMKKyAgICAgICAgKHRoZSBwcm9iYWJsZSBxdW90ZWNoYXIpIHdoaWNoIGFyZSBwcmVjZWRlZCBhbmQgZm9sbG93ZWQKKyAgICAgICAgYnkgdGhlIHNhbWUgY2hhcmFjdGVyICh0aGUgcHJvYmFibGUgZGVsaW1pdGVyKS4KKyAgICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgICAgICAgICAgLCdzb21lIHRleHQnLAorICAgICAgICBUaGUgcXVvdGUgd2l0aCB0aGUgbW9zdCB3aW5zLCBzYW1lIHdpdGggdGhlIGRlbGltaXRlci4KKyAgICAgICAgSWYgdGhlcmUgaXMgbm8gcXVvdGVjaGFyIHRoZSBkZWxpbWl0ZXIgY2FuJ3QgYmUgZGV0ZXJtaW5lZAorICAgICAgICB0aGlzIHdheS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgbWF0Y2hlcyA9IFtdCisgICAgICAgIGZvciByZXN0ciBpbiAoJyg/UDxkZWxpbT5bXlx3XG4iXCddKSg/UDxzcGFjZT4gPykoP1A8cXVvdGU+WyJcJ10pLio/KD9QPXF1b3RlKSg/UD1kZWxpbSknLCAjICwiLio/IiwKKyAgICAgICAgICAgICAgICAgICAgICAnKD86XnxcbikoP1A8cXVvdGU+WyJcJ10pLio/KD9QPXF1b3RlKSg/UDxkZWxpbT5bXlx3XG4iXCddKSg/UDxzcGFjZT4gPyknLCAgICMgICIuKj8iLAorICAgICAgICAgICAgICAgICAgICAgICcoP1A8ZGVsaW0+PlteXHdcbiJcJ10pKD9QPHNwYWNlPiA/KSg/UDxxdW90ZT5bIlwnXSkuKj8oP1A9cXVvdGUpKD86JHxcbiknLCAgIyAsIi4qPyIKKyAgICAgICAgICAgICAgICAgICAgICAnKD86XnxcbikoP1A8cXVvdGU+WyJcJ10pLio/KD9QPXF1b3RlKSg/OiR8XG4pJyk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICIuKj8iIChubyBkZWxpbSwgbm8gc3BhY2UpCisgICAgICAgICAgICByZWdleHAgPSByZS5jb21waWxlKHJlc3RyLCByZS5ET1RBTEwgfCByZS5NVUxUSUxJTkUpCisgICAgICAgICAgICBtYXRjaGVzID0gcmVnZXhwLmZpbmRhbGwoZGF0YSkKKyAgICAgICAgICAgIGlmIG1hdGNoZXM6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiBub3QgbWF0Y2hlczoKKyAgICAgICAgICAgICMgKHF1b3RlY2hhciwgZG91YmxlcXVvdGUsIGRlbGltaXRlciwgc2tpcGluaXRpYWxzcGFjZSkKKyAgICAgICAgICAgIHJldHVybiAoJycsIEZhbHNlLCBOb25lLCAwKQorICAgICAgICBxdW90ZXMgPSB7fQorICAgICAgICBkZWxpbXMgPSB7fQorICAgICAgICBzcGFjZXMgPSAwCisgICAgICAgIGZvciBtIGluIG1hdGNoZXM6CisgICAgICAgICAgICBuID0gcmVnZXhwLmdyb3VwaW5kZXhbJ3F1b3RlJ10gLSAxCisgICAgICAgICAgICBrZXkgPSBtW25dCisgICAgICAgICAgICBpZiBrZXk6CisgICAgICAgICAgICAgICAgcXVvdGVzW2tleV0gPSBxdW90ZXMuZ2V0KGtleSwgMCkgKyAxCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbiA9IHJlZ2V4cC5ncm91cGluZGV4WydkZWxpbSddIC0gMQorICAgICAgICAgICAgICAgIGtleSA9IG1bbl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYga2V5IGFuZCAoZGVsaW1pdGVycyBpcyBOb25lIG9yIGtleSBpbiBkZWxpbWl0ZXJzKToKKyAgICAgICAgICAgICAgICBkZWxpbXNba2V5XSA9IGRlbGltcy5nZXQoa2V5LCAwKSArIDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuID0gcmVnZXhwLmdyb3VwaW5kZXhbJ3NwYWNlJ10gLSAxCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG1bbl06CisgICAgICAgICAgICAgICAgc3BhY2VzICs9IDEKKworICAgICAgICBxdW90ZWNoYXIgPSByZWR1Y2UobGFtYmRhIGEsIGIsIHF1b3RlcyA9IHF1b3RlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChxdW90ZXNbYV0gPiBxdW90ZXNbYl0pIGFuZCBhIG9yIGIsIHF1b3Rlcy5rZXlzKCkpCisKKyAgICAgICAgaWYgZGVsaW1zOgorICAgICAgICAgICAgZGVsaW0gPSByZWR1Y2UobGFtYmRhIGEsIGIsIGRlbGltcyA9IGRlbGltczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWxpbXNbYV0gPiBkZWxpbXNbYl0pIGFuZCBhIG9yIGIsIGRlbGltcy5rZXlzKCkpCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gZGVsaW1zW2RlbGltXSA9PSBzcGFjZXMKKyAgICAgICAgICAgIGlmIGRlbGltID09ICdcbic6ICMgbW9zdCBsaWtlbHkgYSBmaWxlIHdpdGggYSBzaW5nbGUgY29sdW1uCisgICAgICAgICAgICAgICAgZGVsaW0gPSAnJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0aGVyZSBpcyAqbm8qIGRlbGltaXRlciwgaXQncyBhIHNpbmdsZSBjb2x1bW4gb2YgcXVvdGVkIGRhdGEKKyAgICAgICAgICAgIGRlbGltID0gJycKKyAgICAgICAgICAgIHNraXBpbml0aWFsc3BhY2UgPSAwCisKKyAgICAgICAgIyBpZiB3ZSBzZWUgYW4gZXh0cmEgcXVvdGUgYmV0d2VlbiBkZWxpbWl0ZXJzLCB3ZSd2ZSBnb3QgYQorICAgICAgICAjIGRvdWJsZSBxdW90ZWQgZm9ybWF0CisgICAgICAgIGRxX3JlZ2V4cCA9IHJlLmNvbXBpbGUociIoKCUoZGVsaW0pcyl8XilcVyolKHF1b3RlKXNbXiUoZGVsaW0pc1xuXSolKHF1b3RlKXNbXiUoZGVsaW0pc1xuXSolKHF1b3RlKXNcVyooKCUoZGVsaW0pcyl8JCkiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnZGVsaW0nOmRlbGltLCAncXVvdGUnOnF1b3RlY2hhcn0sIHJlLk1VTFRJTElORSkKKworCisKKyAgICAgICAgaWYgZHFfcmVnZXhwLnNlYXJjaChkYXRhKToKKyAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZQorCisgICAgICAgIHJldHVybiAocXVvdGVjaGFyLCBkb3VibGVxdW90ZSwgZGVsaW0sIHNraXBpbml0aWFsc3BhY2UpCisKKworICAgIGRlZiBfZ3Vlc3NfZGVsaW1pdGVyKHNlbGYsIGRhdGEsIGRlbGltaXRlcnMpOgorICAgICAgICAiIiIKKyAgICAgICAgVGhlIGRlbGltaXRlciAvc2hvdWxkLyBvY2N1ciB0aGUgc2FtZSBudW1iZXIgb2YgdGltZXMgb24KKyAgICAgICAgZWFjaCByb3cuIEhvd2V2ZXIsIGR1ZSB0byBtYWxmb3JtZWQgZGF0YSwgaXQgbWF5IG5vdC4gV2UgZG9uJ3Qgd2FudAorICAgICAgICBhbiBhbGwgb3Igbm90aGluZyBhcHByb2FjaCwgc28gd2UgYWxsb3cgZm9yIHNtYWxsIHZhcmlhdGlvbnMgaW4gdGhpcworICAgICAgICBudW1iZXIuCisgICAgICAgICAgMSkgYnVpbGQgYSB0YWJsZSBvZiB0aGUgZnJlcXVlbmN5IG9mIGVhY2ggY2hhcmFjdGVyIG9uIGV2ZXJ5IGxpbmUuCisgICAgICAgICAgMikgYnVpbGQgYSB0YWJsZSBvZiBmcmVxdWVuY2llcyBvZiB0aGlzIGZyZXF1ZW5jeSAobWV0YS1mcmVxdWVuY3k/KSwKKyAgICAgICAgICAgICBlLmcuICAneCBvY2N1cnJlZCA1IHRpbWVzIGluIDEwIHJvd3MsIDYgdGltZXMgaW4gMTAwMCByb3dzLAorICAgICAgICAgICAgIDcgdGltZXMgaW4gMiByb3dzJworICAgICAgICAgIDMpIHVzZSB0aGUgbW9kZSBvZiB0aGUgbWV0YS1mcmVxdWVuY3kgdG8gZGV0ZXJtaW5lIHRoZSAvZXhwZWN0ZWQvCisgICAgICAgICAgICAgZnJlcXVlbmN5IGZvciB0aGF0IGNoYXJhY3RlcgorICAgICAgICAgIDQpIGZpbmQgb3V0IGhvdyBvZnRlbiB0aGUgY2hhcmFjdGVyIGFjdHVhbGx5IG1lZXRzIHRoYXQgZ29hbAorICAgICAgICAgIDUpIHRoZSBjaGFyYWN0ZXIgdGhhdCBiZXN0IG1lZXRzIGl0cyBnb2FsIGlzIHRoZSBkZWxpbWl0ZXIKKyAgICAgICAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSBkYXRhIGlzIGV2YWx1YXRlZCBpbiBjaHVua3MsIHNvIGl0IGNhbgorICAgICAgICB0cnkgYW5kIGV2YWx1YXRlIHRoZSBzbWFsbGVzdCBwb3J0aW9uIG9mIHRoZSBkYXRhIHBvc3NpYmxlLCBldmFsdWF0aW5nCisgICAgICAgIGFkZGl0aW9uYWwgY2h1bmtzIGFzIG5lY2Vzc2FyeS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZGF0YSA9IGZpbHRlcihOb25lLCBkYXRhLnNwbGl0KCdcbicpKQorCisgICAgICAgIGFzY2lpID0gW2NocihjKSBmb3IgYyBpbiByYW5nZSgxMjcpXSAjIDctYml0IEFTQ0lJCisKKyAgICAgICAgIyBidWlsZCBmcmVxdWVuY3kgdGFibGVzCisgICAgICAgIGNodW5rTGVuZ3RoID0gbWluKDEwLCBsZW4oZGF0YSkpCisgICAgICAgIGl0ZXJhdGlvbiA9IDAKKyAgICAgICAgY2hhckZyZXF1ZW5jeSA9IHt9CisgICAgICAgIG1vZGVzID0ge30KKyAgICAgICAgZGVsaW1zID0ge30KKyAgICAgICAgc3RhcnQsIGVuZCA9IDAsIG1pbihjaHVua0xlbmd0aCwgbGVuKGRhdGEpKQorICAgICAgICB3aGlsZSBzdGFydCA8IGxlbihkYXRhKToKKyAgICAgICAgICAgIGl0ZXJhdGlvbiArPSAxCisgICAgICAgICAgICBmb3IgbGluZSBpbiBkYXRhW3N0YXJ0OmVuZF06CisgICAgICAgICAgICAgICAgZm9yIGNoYXIgaW4gYXNjaWk6CisgICAgICAgICAgICAgICAgICAgIG1ldGFGcmVxdWVuY3kgPSBjaGFyRnJlcXVlbmN5LmdldChjaGFyLCB7fSkKKyAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGNvdW50IGV2ZW4gaWYgZnJlcXVlbmN5IGlzIDAKKyAgICAgICAgICAgICAgICAgICAgZnJlcSA9IGxpbmUuY291bnQoY2hhcikKKyAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZSBpcyB0aGUgbW9kZQorICAgICAgICAgICAgICAgICAgICBtZXRhRnJlcXVlbmN5W2ZyZXFdID0gbWV0YUZyZXF1ZW5jeS5nZXQoZnJlcSwgMCkgKyAxCisgICAgICAgICAgICAgICAgICAgIGNoYXJGcmVxdWVuY3lbY2hhcl0gPSBtZXRhRnJlcXVlbmN5CisKKyAgICAgICAgICAgIGZvciBjaGFyIGluIGNoYXJGcmVxdWVuY3kua2V5cygpOgorICAgICAgICAgICAgICAgIGl0ZW1zID0gY2hhckZyZXF1ZW5jeVtjaGFyXS5pdGVtcygpCisgICAgICAgICAgICAgICAgaWYgbGVuKGl0ZW1zKSA9PSAxIGFuZCBpdGVtc1swXVswXSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgZ2V0IHRoZSBtb2RlIG9mIHRoZSBmcmVxdWVuY2llcworICAgICAgICAgICAgICAgIGlmIGxlbihpdGVtcykgPiAxOgorICAgICAgICAgICAgICAgICAgICBtb2Rlc1tjaGFyXSA9IHJlZHVjZShsYW1iZGEgYSwgYjogYVsxXSA+IGJbMV0gYW5kIGEgb3IgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMpCisgICAgICAgICAgICAgICAgICAgICMgYWRqdXN0IHRoZSBtb2RlIC0gc3VidHJhY3QgdGhlIHN1bSBvZiBhbGwKKyAgICAgICAgICAgICAgICAgICAgIyBvdGhlciBmcmVxdWVuY2llcworICAgICAgICAgICAgICAgICAgICBpdGVtcy5yZW1vdmUobW9kZXNbY2hhcl0pCisgICAgICAgICAgICAgICAgICAgIG1vZGVzW2NoYXJdID0gKG1vZGVzW2NoYXJdWzBdLCBtb2Rlc1tjaGFyXVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHJlZHVjZShsYW1iZGEgYSwgYjogKDAsIGFbMV0gKyBiWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMpWzFdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZGVzW2NoYXJdID0gaXRlbXNbMF0KKworICAgICAgICAgICAgIyBidWlsZCBhIGxpc3Qgb2YgcG9zc2libGUgZGVsaW1pdGVycworICAgICAgICAgICAgbW9kZUxpc3QgPSBtb2Rlcy5pdGVtcygpCisgICAgICAgICAgICB0b3RhbCA9IGZsb2F0KGNodW5rTGVuZ3RoICogaXRlcmF0aW9uKQorICAgICAgICAgICAgIyAocm93cyBvZiBjb25zaXN0ZW50IGRhdGEpIC8gKG51bWJlciBvZiByb3dzKSA9IDEwMCUKKyAgICAgICAgICAgIGNvbnNpc3RlbmN5ID0gMS4wCisgICAgICAgICAgICAjIG1pbmltdW0gY29uc2lzdGVuY3kgdGhyZXNob2xkCisgICAgICAgICAgICB0aHJlc2hvbGQgPSAwLjkKKyAgICAgICAgICAgIHdoaWxlIGxlbihkZWxpbXMpID09IDAgYW5kIGNvbnNpc3RlbmN5ID49IHRocmVzaG9sZDoKKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBtb2RlTGlzdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgdlswXSA+IDAgYW5kIHZbMV0gPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2WzFdL3RvdGFsKSA+PSBjb25zaXN0ZW5jeSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVsaW1pdGVycyBpcyBOb25lIG9yIGsgaW4gZGVsaW1pdGVycykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltc1trXSA9IHYKKyAgICAgICAgICAgICAgICBjb25zaXN0ZW5jeSAtPSAwLjAxCisKKyAgICAgICAgICAgIGlmIGxlbihkZWxpbXMpID09IDE6CisgICAgICAgICAgICAgICAgZGVsaW0gPSBkZWxpbXMua2V5cygpWzBdCisgICAgICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IChkYXRhWzBdLmNvdW50KGRlbGltKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXS5jb3VudCgiJWMgIiAlIGRlbGltKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKGRlbGltLCBza2lwaW5pdGlhbHNwYWNlKQorCisgICAgICAgICAgICAjIGFuYWx5emUgYW5vdGhlciBjaHVua0xlbmd0aCBsaW5lcworICAgICAgICAgICAgc3RhcnQgPSBlbmQKKyAgICAgICAgICAgIGVuZCArPSBjaHVua0xlbmd0aAorCisgICAgICAgIGlmIG5vdCBkZWxpbXM6CisgICAgICAgICAgICByZXR1cm4gKCcnLCAwKQorCisgICAgICAgICMgaWYgdGhlcmUncyBtb3JlIHRoYW4gb25lLCBmYWxsIGJhY2sgdG8gYSAncHJlZmVycmVkJyBsaXN0CisgICAgICAgIGlmIGxlbihkZWxpbXMpID4gMToKKyAgICAgICAgICAgIGZvciBkIGluIHNlbGYucHJlZmVycmVkOgorICAgICAgICAgICAgICAgIGlmIGQgaW4gZGVsaW1zLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IChkYXRhWzBdLmNvdW50KGQpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXS5jb3VudCgiJWMgIiAlIGQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGQsIHNraXBpbml0aWFsc3BhY2UpCisKKyAgICAgICAgIyBub3RoaW5nIGVsc2UgaW5kaWNhdGVzIGEgcHJlZmVyZW5jZSwgcGljayB0aGUgY2hhcmFjdGVyIHRoYXQKKyAgICAgICAgIyBkb21pbmF0ZXMoPykKKyAgICAgICAgaXRlbXMgPSBbKHYsaykgZm9yIChrLHYpIGluIGRlbGltcy5pdGVtcygpXQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgZGVsaW0gPSBpdGVtc1stMV1bMV0KKworICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gKGRhdGFbMF0uY291bnQoZGVsaW0pID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVswXS5jb3VudCgiJWMgIiAlIGRlbGltKSkKKyAgICAgICAgcmV0dXJuIChkZWxpbSwgc2tpcGluaXRpYWxzcGFjZSkKKworCisgICAgZGVmIGhhc19oZWFkZXIoc2VsZiwgc2FtcGxlKToKKyAgICAgICAgIyBDcmVhdGVzIGEgZGljdGlvbmFyeSBvZiB0eXBlcyBvZiBkYXRhIGluIGVhY2ggY29sdW1uLiBJZiBhbnkKKyAgICAgICAgIyBjb2x1bW4gaXMgb2YgYSBzaW5nbGUgdHlwZSAoc2F5LCBpbnRlZ2VycyksICpleGNlcHQqIGZvciB0aGUgZmlyc3QKKyAgICAgICAgIyByb3csIHRoZW4gdGhlIGZpcnN0IHJvdyBpcyBwcmVzdW1lZCB0byBiZSBsYWJlbHMuIElmIHRoZSB0eXBlCisgICAgICAgICMgY2FuJ3QgYmUgZGV0ZXJtaW5lZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBhIHN0cmluZyBpbiB3aGljaCBjYXNlCisgICAgICAgICMgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIHRoZSBkZXRlcm1pbmluZyBmYWN0b3I6IGlmIGFsbCBvZiB0aGUKKyAgICAgICAgIyByb3dzIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGFyZSB0aGUgc2FtZSBsZW5ndGgsIGl0J3MgYSBoZWFkZXIuCisgICAgICAgICMgRmluYWxseSwgYSAndm90ZScgaXMgdGFrZW4gYXQgdGhlIGVuZCBmb3IgZWFjaCBjb2x1bW4sIGFkZGluZyBvcgorICAgICAgICAjIHN1YnRyYWN0aW5nIGZyb20gdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGZpcnN0IHJvdyBiZWluZyBhIGhlYWRlci4KKworICAgICAgICByZHIgPSByZWFkZXIoU3RyaW5nSU8oc2FtcGxlKSwgc2VsZi5zbmlmZihzYW1wbGUpKQorCisgICAgICAgIGhlYWRlciA9IHJkci5uZXh0KCkgIyBhc3N1bWUgZmlyc3Qgcm93IGlzIGhlYWRlcgorCisgICAgICAgIGNvbHVtbnMgPSBsZW4oaGVhZGVyKQorICAgICAgICBjb2x1bW5UeXBlcyA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKGNvbHVtbnMpOiBjb2x1bW5UeXBlc1tpXSA9IE5vbmUKKworICAgICAgICBjaGVja2VkID0gMAorICAgICAgICBmb3Igcm93IGluIHJkcjoKKyAgICAgICAgICAgICMgYXJiaXRyYXJ5IG51bWJlciBvZiByb3dzIHRvIGNoZWNrLCB0byBrZWVwIGl0IHNhbmUKKyAgICAgICAgICAgIGlmIGNoZWNrZWQgPiAyMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2hlY2tlZCArPSAxCisKKyAgICAgICAgICAgIGlmIGxlbihyb3cpICE9IGNvbHVtbnM6CisgICAgICAgICAgICAgICAgY29udGludWUgIyBza2lwIHJvd3MgdGhhdCBoYXZlIGlycmVndWxhciBudW1iZXIgb2YgY29sdW1ucworCisgICAgICAgICAgICBmb3IgY29sIGluIGNvbHVtblR5cGVzLmtleXMoKToKKworICAgICAgICAgICAgICAgIGZvciB0aGlzVHlwZSBpbiBbaW50LCBsb25nLCBmbG9hdCwgY29tcGxleF06CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNUeXBlKHJvd1tjb2xdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGZhbGxiYWNrIHRvIGxlbmd0aCBvZiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgdGhpc1R5cGUgPSBsZW4ocm93W2NvbF0pCisKKyAgICAgICAgICAgICAgICAjIHRyZWF0IGxvbmdzIGFzIGludHMKKyAgICAgICAgICAgICAgICBpZiB0aGlzVHlwZSA9PSBsb25nOgorICAgICAgICAgICAgICAgICAgICB0aGlzVHlwZSA9IGludAorCisgICAgICAgICAgICAgICAgaWYgdGhpc1R5cGUgIT0gY29sdW1uVHlwZXNbY29sXToKKyAgICAgICAgICAgICAgICAgICAgaWYgY29sdW1uVHlwZXNbY29sXSBpcyBOb25lOiAjIGFkZCBuZXcgY29sdW1uIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtblR5cGVzW2NvbF0gPSB0aGlzVHlwZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyB0eXBlIGlzIGluY29uc2lzdGVudCwgcmVtb3ZlIGNvbHVtbiBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnNpZGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBjb2x1bW5UeXBlc1tjb2xdCisKKyAgICAgICAgIyBmaW5hbGx5LCBjb21wYXJlIHJlc3VsdHMgYWdhaW5zdCBmaXJzdCByb3cgYW5kICJ2b3RlIgorICAgICAgICAjIG9uIHdoZXRoZXIgaXQncyBhIGhlYWRlcgorICAgICAgICBoYXNIZWFkZXIgPSAwCisgICAgICAgIGZvciBjb2wsIGNvbFR5cGUgaW4gY29sdW1uVHlwZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUoY29sVHlwZSkgPT0gdHlwZSgwKTogIyBpdCdzIGEgbGVuZ3RoCisgICAgICAgICAgICAgICAgaWYgbGVuKGhlYWRlcltjb2xdKSAhPSBjb2xUeXBlOgorICAgICAgICAgICAgICAgICAgICBoYXNIZWFkZXIgKz0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhhc0hlYWRlciAtPSAxCisgICAgICAgICAgICBlbHNlOiAjIGF0dGVtcHQgdHlwZWNhc3QKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNvbFR5cGUoaGVhZGVyW2NvbF0pCisgICAgICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBoYXNIZWFkZXIgKz0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhhc0hlYWRlciAtPSAxCisKKyAgICAgICAgcmV0dXJuIGhhc0hlYWRlciA+IDAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3N2LnB5YyBiL2xpYi9weXRob24yLjcvY3N2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWE2OTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jc3YucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3N2LnB5byBiL2xpYi9weXRob24yLjcvY3N2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWE2OTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jc3YucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5N2MxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNTU1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisiIiJjcmVhdGUgYW5kIG1hbmlwdWxhdGUgQyBkYXRhIHR5cGVzIGluIFB5dGhvbiIiIgorCitpbXBvcnQgb3MgYXMgX29zLCBzeXMgYXMgX3N5cworCitfX3ZlcnNpb25fXyA9ICIxLjEuMCIKKworZnJvbSBfY3R5cGVzIGltcG9ydCBVbmlvbiwgU3RydWN0dXJlLCBBcnJheQorZnJvbSBfY3R5cGVzIGltcG9ydCBfUG9pbnRlcgorZnJvbSBfY3R5cGVzIGltcG9ydCBDRnVuY1B0ciBhcyBfQ0Z1bmNQdHIKK2Zyb20gX2N0eXBlcyBpbXBvcnQgX192ZXJzaW9uX18gYXMgX2N0eXBlc192ZXJzaW9uCitmcm9tIF9jdHlwZXMgaW1wb3J0IFJUTERfTE9DQUwsIFJUTERfR0xPQkFMCitmcm9tIF9jdHlwZXMgaW1wb3J0IEFyZ3VtZW50RXJyb3IKKworZnJvbSBzdHJ1Y3QgaW1wb3J0IGNhbGNzaXplIGFzIF9jYWxjc2l6ZQorCitpZiBfX3ZlcnNpb25fXyAhPSBfY3R5cGVzX3ZlcnNpb246CisgICAgcmFpc2UgRXhjZXB0aW9uKCJWZXJzaW9uIG51bWJlciBtaXNtYXRjaCIsIF9fdmVyc2lvbl9fLCBfY3R5cGVzX3ZlcnNpb24pCisKK2lmIF9vcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IEZvcm1hdEVycm9yCisKK0RFRkFVTFRfTU9ERSA9IFJUTERfTE9DQUwKK2lmIF9vcy5uYW1lID09ICJwb3NpeCIgYW5kIF9zeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgIyBPbiBPUyBYIDEwLjMsIHdlIHVzZSBSVExEX0dMT0JBTCBhcyBkZWZhdWx0IG1vZGUKKyAgICAjIGJlY2F1c2UgUlRMRF9MT0NBTCBkb2VzIG5vdCB3b3JrIGF0IGxlYXN0IG9uIHNvbWUKKyAgICAjIGxpYnJhcmllcy4gIE9TIFggMTAuMyBpcyBEYXJ3aW4gNywgc28gd2UgY2hlY2sgZm9yCisgICAgIyB0aGF0LgorCisgICAgaWYgaW50KF9vcy51bmFtZSgpWzJdLnNwbGl0KCcuJylbMF0pIDwgODoKKyAgICAgICAgREVGQVVMVF9NT0RFID0gUlRMRF9HTE9CQUwKKworZnJvbSBfY3R5cGVzIGltcG9ydCBGVU5DRkxBR19DREVDTCBhcyBfRlVOQ0ZMQUdfQ0RFQ0wsIFwKKyAgICAgRlVOQ0ZMQUdfUFlUSE9OQVBJIGFzIF9GVU5DRkxBR19QWVRIT05BUEksIFwKKyAgICAgRlVOQ0ZMQUdfVVNFX0VSUk5PIGFzIF9GVU5DRkxBR19VU0VfRVJSTk8sIFwKKyAgICAgRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUiBhcyBfRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUgorCisiIiIKK1dJTk9MRUFQSSAtPiBIUkVTVUxUCitXSU5PTEVBUElfKHR5cGUpCisKK1NURE1FVEhPRENBTExUWVBFCisKK1NURE1FVEhPRChuYW1lKQorU1RETUVUSE9EXyh0eXBlLCBuYW1lKQorCitTVERBUElDQUxMVFlQRQorIiIiCisKK2RlZiBjcmVhdGVfc3RyaW5nX2J1ZmZlcihpbml0LCBzaXplPU5vbmUpOgorICAgICIiImNyZWF0ZV9zdHJpbmdfYnVmZmVyKGFTdHJpbmcpIC0+IGNoYXJhY3RlciBhcnJheQorICAgIGNyZWF0ZV9zdHJpbmdfYnVmZmVyKGFuSW50ZWdlcikgLT4gY2hhcmFjdGVyIGFycmF5CisgICAgY3JlYXRlX3N0cmluZ19idWZmZXIoYVN0cmluZywgYW5JbnRlZ2VyKSAtPiBjaGFyYWN0ZXIgYXJyYXkKKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKGluaXQsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IGxlbihpbml0KSsxCisgICAgICAgIGJ1ZnR5cGUgPSBjX2NoYXIgKiBzaXplCisgICAgICAgIGJ1ZiA9IGJ1ZnR5cGUoKQorICAgICAgICBidWYudmFsdWUgPSBpbml0CisgICAgICAgIHJldHVybiBidWYKKyAgICBlbGlmIGlzaW5zdGFuY2UoaW5pdCwgKGludCwgbG9uZykpOgorICAgICAgICBidWZ0eXBlID0gY19jaGFyICogaW5pdAorICAgICAgICBidWYgPSBidWZ0eXBlKCkKKyAgICAgICAgcmV0dXJuIGJ1ZgorICAgIHJhaXNlIFR5cGVFcnJvcihpbml0KQorCitkZWYgY19idWZmZXIoaW5pdCwgc2l6ZT1Ob25lKToKKyMjICAgICJkZXByZWNhdGVkLCB1c2UgY3JlYXRlX3N0cmluZ19idWZmZXIgaW5zdGVhZCIKKyMjICAgIGltcG9ydCB3YXJuaW5ncworIyMgICAgd2FybmluZ3Mud2FybigiY19idWZmZXIgaXMgZGVwcmVjYXRlZCwgdXNlIGNyZWF0ZV9zdHJpbmdfYnVmZmVyIGluc3RlYWQiLAorIyMgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICByZXR1cm4gY3JlYXRlX3N0cmluZ19idWZmZXIoaW5pdCwgc2l6ZSkKKworX2NfZnVuY3R5cGVfY2FjaGUgPSB7fQorZGVmIENGVU5DVFlQRShyZXN0eXBlLCAqYXJndHlwZXMsICoqa3cpOgorICAgICIiIkNGVU5DVFlQRShyZXN0eXBlLCAqYXJndHlwZXMsCisgICAgICAgICAgICAgICAgIHVzZV9lcnJubz1GYWxzZSwgdXNlX2xhc3RfZXJyb3I9RmFsc2UpIC0+IGZ1bmN0aW9uIHByb3RvdHlwZS4KKworICAgIHJlc3R5cGU6IHRoZSByZXN1bHQgdHlwZQorICAgIGFyZ3R5cGVzOiBhIHNlcXVlbmNlIHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50IHR5cGVzCisKKyAgICBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSBjYWxsZWQgaW4gZGlmZmVyZW50IHdheXMgdG8gY3JlYXRlIGEKKyAgICBjYWxsYWJsZSBvYmplY3Q6CisKKyAgICBwcm90b3R5cGUoaW50ZWdlciBhZGRyZXNzKSAtPiBmb3JlaWduIGZ1bmN0aW9uCisgICAgcHJvdG90eXBlKGNhbGxhYmxlKSAtPiBjcmVhdGUgYW5kIHJldHVybiBhIEMgY2FsbGFibGUgZnVuY3Rpb24gZnJvbSBjYWxsYWJsZQorICAgIHByb3RvdHlwZShpbnRlZ2VyIGluZGV4LCBtZXRob2QgbmFtZVssIHBhcmFtZmxhZ3NdKSAtPiBmb3JlaWduIGZ1bmN0aW9uIGNhbGxpbmcgYSBDT00gbWV0aG9kCisgICAgcHJvdG90eXBlKChvcmRpbmFsIG51bWJlciwgZGxsIG9iamVjdClbLCBwYXJhbWZsYWdzXSkgLT4gZm9yZWlnbiBmdW5jdGlvbiBleHBvcnRlZCBieSBvcmRpbmFsCisgICAgcHJvdG90eXBlKChmdW5jdGlvbiBuYW1lLCBkbGwgb2JqZWN0KVssIHBhcmFtZmxhZ3NdKSAtPiBmb3JlaWduIGZ1bmN0aW9uIGV4cG9ydGVkIGJ5IG5hbWUKKyAgICAiIiIKKyAgICBmbGFncyA9IF9GVU5DRkxBR19DREVDTAorICAgIGlmIGt3LnBvcCgidXNlX2Vycm5vIiwgRmFsc2UpOgorICAgICAgICBmbGFncyB8PSBfRlVOQ0ZMQUdfVVNFX0VSUk5PCisgICAgaWYga3cucG9wKCJ1c2VfbGFzdF9lcnJvciIsIEZhbHNlKToKKyAgICAgICAgZmxhZ3MgfD0gX0ZVTkNGTEFHX1VTRV9MQVNURVJST1IKKyAgICBpZiBrdzoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50KHMpICVzIiAlIGt3LmtleXMoKSkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBfY19mdW5jdHlwZV9jYWNoZVsocmVzdHlwZSwgYXJndHlwZXMsIGZsYWdzKV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGNsYXNzIENGdW5jdGlvblR5cGUoX0NGdW5jUHRyKToKKyAgICAgICAgICAgIF9hcmd0eXBlc18gPSBhcmd0eXBlcworICAgICAgICAgICAgX3Jlc3R5cGVfID0gcmVzdHlwZQorICAgICAgICAgICAgX2ZsYWdzXyA9IGZsYWdzCisgICAgICAgIF9jX2Z1bmN0eXBlX2NhY2hlWyhyZXN0eXBlLCBhcmd0eXBlcywgZmxhZ3MpXSA9IENGdW5jdGlvblR5cGUKKyAgICAgICAgcmV0dXJuIENGdW5jdGlvblR5cGUKKworaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgTG9hZExpYnJhcnkgYXMgX2Rsb3BlbgorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgRlVOQ0ZMQUdfU1REQ0FMTCBhcyBfRlVOQ0ZMQUdfU1REQ0FMTAorICAgIGlmIF9vcy5uYW1lID09ICJjZSI6CisgICAgICAgICMgJ2NlJyBkb2Vzbid0IGhhdmUgdGhlIHN0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uCisgICAgICAgIF9GVU5DRkxBR19TVERDQUxMID0gX0ZVTkNGTEFHX0NERUNMCisKKyAgICBfd2luX2Z1bmN0eXBlX2NhY2hlID0ge30KKyAgICBkZWYgV0lORlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzLCAqKmt3KToKKyAgICAgICAgIyBkb2NzdHJpbmcgc2V0IGxhdGVyICh2ZXJ5IHNpbWlsYXIgdG8gQ0ZVTkNUWVBFLl9fZG9jX18pCisgICAgICAgIGZsYWdzID0gX0ZVTkNGTEFHX1NURENBTEwKKyAgICAgICAgaWYga3cucG9wKCJ1c2VfZXJybm8iLCBGYWxzZSk6CisgICAgICAgICAgICBmbGFncyB8PSBfRlVOQ0ZMQUdfVVNFX0VSUk5PCisgICAgICAgIGlmIGt3LnBvcCgidXNlX2xhc3RfZXJyb3IiLCBGYWxzZSk6CisgICAgICAgICAgICBmbGFncyB8PSBfRlVOQ0ZMQUdfVVNFX0xBU1RFUlJPUgorICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudChzKSAlcyIgJSBrdy5rZXlzKCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBfd2luX2Z1bmN0eXBlX2NhY2hlWyhyZXN0eXBlLCBhcmd0eXBlcywgZmxhZ3MpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBjbGFzcyBXaW5GdW5jdGlvblR5cGUoX0NGdW5jUHRyKToKKyAgICAgICAgICAgICAgICBfYXJndHlwZXNfID0gYXJndHlwZXMKKyAgICAgICAgICAgICAgICBfcmVzdHlwZV8gPSByZXN0eXBlCisgICAgICAgICAgICAgICAgX2ZsYWdzXyA9IGZsYWdzCisgICAgICAgICAgICBfd2luX2Z1bmN0eXBlX2NhY2hlWyhyZXN0eXBlLCBhcmd0eXBlcywgZmxhZ3MpXSA9IFdpbkZ1bmN0aW9uVHlwZQorICAgICAgICAgICAgcmV0dXJuIFdpbkZ1bmN0aW9uVHlwZQorICAgIGlmIFdJTkZVTkNUWVBFLl9fZG9jX186CisgICAgICAgIFdJTkZVTkNUWVBFLl9fZG9jX18gPSBDRlVOQ1RZUEUuX19kb2NfXy5yZXBsYWNlKCJDRlVOQ1RZUEUiLCAiV0lORlVOQ1RZUEUiKQorCitlbGlmIF9vcy5uYW1lID09ICJwb3NpeCI6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBkbG9wZW4gYXMgX2Rsb3BlbgorCitmcm9tIF9jdHlwZXMgaW1wb3J0IHNpemVvZiwgYnlyZWYsIGFkZHJlc3NvZiwgYWxpZ25tZW50LCByZXNpemUKK2Zyb20gX2N0eXBlcyBpbXBvcnQgZ2V0X2Vycm5vLCBzZXRfZXJybm8KK2Zyb20gX2N0eXBlcyBpbXBvcnQgX1NpbXBsZUNEYXRhCisKK2RlZiBfY2hlY2tfc2l6ZSh0eXAsIHR5cGVjb2RlPU5vbmUpOgorICAgICMgQ2hlY2sgaWYgc2l6ZW9mKGN0eXBlc190eXBlKSBhZ2FpbnN0IHN0cnVjdC5jYWxjc2l6ZS4gIFRoaXMKKyAgICAjIHNob3VsZCBwcm90ZWN0IHNvbWV3aGF0IGFnYWluc3QgYSBtaXNjb25maWd1cmVkIGxpYmZmaS4KKyAgICBmcm9tIHN0cnVjdCBpbXBvcnQgY2FsY3NpemUKKyAgICBpZiB0eXBlY29kZSBpcyBOb25lOgorICAgICAgICAjIE1vc3QgX3R5cGVfIGNvZGVzIGFyZSB0aGUgc2FtZSBhcyB1c2VkIGluIHN0cnVjdAorICAgICAgICB0eXBlY29kZSA9IHR5cC5fdHlwZV8KKyAgICBhY3R1YWwsIHJlcXVpcmVkID0gc2l6ZW9mKHR5cCksIGNhbGNzaXplKHR5cGVjb2RlKQorICAgIGlmIGFjdHVhbCAhPSByZXF1aXJlZDoKKyAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoInNpemVvZiglcykgd3Jvbmc6ICVkIGluc3RlYWQgb2YgJWQiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwLCBhY3R1YWwsIHJlcXVpcmVkKSkKKworY2xhc3MgcHlfb2JqZWN0KF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gIk8iCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc3VwZXIocHlfb2JqZWN0LCBzZWxmKS5fX3JlcHJfXygpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuICIlcyg8TlVMTD4pIiAlIHR5cGUoc2VsZikuX19uYW1lX18KK19jaGVja19zaXplKHB5X29iamVjdCwgIlAiKQorCitjbGFzcyBjX3Nob3J0KF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImgiCitfY2hlY2tfc2l6ZShjX3Nob3J0KQorCitjbGFzcyBjX3VzaG9ydChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJIIgorX2NoZWNrX3NpemUoY191c2hvcnQpCisKK2NsYXNzIGNfbG9uZyhfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJsIgorX2NoZWNrX3NpemUoY19sb25nKQorCitjbGFzcyBjX3Vsb25nKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gIkwiCitfY2hlY2tfc2l6ZShjX3Vsb25nKQorCitpZiBfY2FsY3NpemUoImkiKSA9PSBfY2FsY3NpemUoImwiKToKKyAgICAjIGlmIGludCBhbmQgbG9uZyBoYXZlIHRoZSBzYW1lIHNpemUsIG1ha2UgY19pbnQgYW4gYWxpYXMgZm9yIGNfbG9uZworICAgIGNfaW50ID0gY19sb25nCisgICAgY191aW50ID0gY191bG9uZworZWxzZToKKyAgICBjbGFzcyBjX2ludChfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAiaSIKKyAgICBfY2hlY2tfc2l6ZShjX2ludCkKKworICAgIGNsYXNzIGNfdWludChfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAiSSIKKyAgICBfY2hlY2tfc2l6ZShjX3VpbnQpCisKK2NsYXNzIGNfZmxvYXQoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiZiIKK19jaGVja19zaXplKGNfZmxvYXQpCisKK2NsYXNzIGNfZG91YmxlKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImQiCitfY2hlY2tfc2l6ZShjX2RvdWJsZSkKKworY2xhc3MgY19sb25nZG91YmxlKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImciCitpZiBzaXplb2YoY19sb25nZG91YmxlKSA9PSBzaXplb2YoY19kb3VibGUpOgorICAgIGNfbG9uZ2RvdWJsZSA9IGNfZG91YmxlCisKK2lmIF9jYWxjc2l6ZSgibCIpID09IF9jYWxjc2l6ZSgicSIpOgorICAgICMgaWYgbG9uZyBhbmQgbG9uZyBsb25nIGhhdmUgdGhlIHNhbWUgc2l6ZSwgbWFrZSBjX2xvbmdsb25nIGFuIGFsaWFzIGZvciBjX2xvbmcKKyAgICBjX2xvbmdsb25nID0gY19sb25nCisgICAgY191bG9uZ2xvbmcgPSBjX3Vsb25nCitlbHNlOgorICAgIGNsYXNzIGNfbG9uZ2xvbmcoX1NpbXBsZUNEYXRhKToKKyAgICAgICAgX3R5cGVfID0gInEiCisgICAgX2NoZWNrX3NpemUoY19sb25nbG9uZykKKworICAgIGNsYXNzIGNfdWxvbmdsb25nKF9TaW1wbGVDRGF0YSk6CisgICAgICAgIF90eXBlXyA9ICJRIgorICAgICMjICAgIGRlZiBmcm9tX3BhcmFtKGNscywgdmFsKToKKyAgICAjIyAgICAgICAgcmV0dXJuICgnZCcsIGZsb2F0KHZhbCksIHZhbCkKKyAgICAjIyAgICBmcm9tX3BhcmFtID0gY2xhc3NtZXRob2QoZnJvbV9wYXJhbSkKKyAgICBfY2hlY2tfc2l6ZShjX3Vsb25nbG9uZykKKworY2xhc3MgY191Ynl0ZShfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJCIgorY191Ynl0ZS5fX2N0eXBlX2xlX18gPSBjX3VieXRlLl9fY3R5cGVfYmVfXyA9IGNfdWJ5dGUKKyMgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKKyMjY191Y2hhciA9IGNfdWJ5dGUKK19jaGVja19zaXplKGNfdWJ5dGUpCisKK2NsYXNzIGNfYnl0ZShfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJiIgorY19ieXRlLl9fY3R5cGVfbGVfXyA9IGNfYnl0ZS5fX2N0eXBlX2JlX18gPSBjX2J5dGUKK19jaGVja19zaXplKGNfYnl0ZSkKKworY2xhc3MgY19jaGFyKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gImMiCitjX2NoYXIuX19jdHlwZV9sZV9fID0gY19jaGFyLl9fY3R5cGVfYmVfXyA9IGNfY2hhcgorX2NoZWNrX3NpemUoY19jaGFyKQorCitjbGFzcyBjX2NoYXJfcChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJ6IgorICAgIGlmIF9vcy5uYW1lID09ICJudCI6CisgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgIGlmIG5vdCB3aW5kbGwua2VybmVsMzIuSXNCYWRTdHJpbmdQdHJBKHNlbGYsIC0xKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIiVzKCVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYudmFsdWUpCisgICAgICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIGNhc3Qoc2VsZiwgY192b2lkX3ApLnZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAiJXMoJXMpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgY2FzdChzZWxmLCBjX3ZvaWRfcCkudmFsdWUpCitfY2hlY2tfc2l6ZShjX2NoYXJfcCwgIlAiKQorCitjbGFzcyBjX3ZvaWRfcChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICJQIgorY192b2lkcCA9IGNfdm9pZF9wICMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKHRvIGEgYnVnKQorX2NoZWNrX3NpemUoY192b2lkX3ApCisKK2NsYXNzIGNfYm9vbChfU2ltcGxlQ0RhdGEpOgorICAgIF90eXBlXyA9ICI/IgorCitmcm9tIF9jdHlwZXMgaW1wb3J0IFBPSU5URVIsIHBvaW50ZXIsIF9wb2ludGVyX3R5cGVfY2FjaGUKKworZGVmIF9yZXNldF9jYWNoZSgpOgorICAgIF9wb2ludGVyX3R5cGVfY2FjaGUuY2xlYXIoKQorICAgIF9jX2Z1bmN0eXBlX2NhY2hlLmNsZWFyKCkKKyAgICBpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgICAgIF93aW5fZnVuY3R5cGVfY2FjaGUuY2xlYXIoKQorICAgICMgX1NpbXBsZUNEYXRhLmNfd2NoYXJfcF9mcm9tX3BhcmFtCisgICAgUE9JTlRFUihjX3djaGFyKS5mcm9tX3BhcmFtID0gY193Y2hhcl9wLmZyb21fcGFyYW0KKyAgICAjIF9TaW1wbGVDRGF0YS5jX2NoYXJfcF9mcm9tX3BhcmFtCisgICAgUE9JTlRFUihjX2NoYXIpLmZyb21fcGFyYW0gPSBjX2NoYXJfcC5mcm9tX3BhcmFtCisgICAgX3BvaW50ZXJfdHlwZV9jYWNoZVtOb25lXSA9IGNfdm9pZF9wCisgICAgIyBYWFggZm9yIHdoYXRldmVyIHJlYXNvbnMsIGNyZWF0aW5nIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBhIGNhbGxiYWNrCisgICAgIyBmdW5jdGlvbiBpcyBuZWVkZWQgZm9yIHRoZSB1bml0dGVzdHMgb24gV2luNjQgdG8gc3VjY2VlZC4gIFRoaXMgTUFZCisgICAgIyBiZSBhIGNvbXBpbGVyIGJ1Zywgc2luY2UgdGhlIHByb2JsZW0gb2NjdXJzIG9ubHkgd2hlbiBfY3R5cGVzIGlzCisgICAgIyBjb21waWxlZCB3aXRoIHRoZSBNUyBTREsgY29tcGlsZXIuICBPciBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlPworICAgIENGVU5DVFlQRShjX2ludCkobGFtYmRhOiBOb25lKQorCit0cnk6CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBzZXRfY29udmVyc2lvbl9tb2RlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgICAgIHNldF9jb252ZXJzaW9uX21vZGUoIm1iY3MiLCAiaWdub3JlIikKKyAgICBlbHNlOgorICAgICAgICBzZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorCisgICAgY2xhc3MgY193Y2hhcl9wKF9TaW1wbGVDRGF0YSk6CisgICAgICAgIF90eXBlXyA9ICJaIgorCisgICAgY2xhc3MgY193Y2hhcihfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAidSIKKworICAgIGRlZiBjcmVhdGVfdW5pY29kZV9idWZmZXIoaW5pdCwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiY3JlYXRlX3VuaWNvZGVfYnVmZmVyKGFTdHJpbmcpIC0+IGNoYXJhY3RlciBhcnJheQorICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIoYW5JbnRlZ2VyKSAtPiBjaGFyYWN0ZXIgYXJyYXkKKyAgICAgICAgY3JlYXRlX3VuaWNvZGVfYnVmZmVyKGFTdHJpbmcsIGFuSW50ZWdlcikgLT4gY2hhcmFjdGVyIGFycmF5CisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGluaXQsIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzaXplID0gbGVuKGluaXQpKzEKKyAgICAgICAgICAgIGJ1ZnR5cGUgPSBjX3djaGFyICogc2l6ZQorICAgICAgICAgICAgYnVmID0gYnVmdHlwZSgpCisgICAgICAgICAgICBidWYudmFsdWUgPSBpbml0CisgICAgICAgICAgICByZXR1cm4gYnVmCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbml0LCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICBidWZ0eXBlID0gY193Y2hhciAqIGluaXQKKyAgICAgICAgICAgIGJ1ZiA9IGJ1ZnR5cGUoKQorICAgICAgICAgICAgcmV0dXJuIGJ1ZgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoaW5pdCkKKworIyBYWFggRGVwcmVjYXRlZAorZGVmIFNldFBvaW50ZXJUeXBlKHBvaW50ZXIsIGNscyk6CisgICAgaWYgX3BvaW50ZXJfdHlwZV9jYWNoZS5nZXQoY2xzLCBOb25lKSBpcyBub3QgTm9uZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJUaGlzIHR5cGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGNhY2hlIikKKyAgICBpZiBpZChwb2ludGVyKSBub3QgaW4gX3BvaW50ZXJfdHlwZV9jYWNoZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJXaGF0J3MgdGhpcz8/PyIpCisgICAgcG9pbnRlci5zZXRfdHlwZShjbHMpCisgICAgX3BvaW50ZXJfdHlwZV9jYWNoZVtjbHNdID0gcG9pbnRlcgorICAgIGRlbCBfcG9pbnRlcl90eXBlX2NhY2hlW2lkKHBvaW50ZXIpXQorCisjIFhYWCBEZXByZWNhdGVkCitkZWYgQVJSQVkodHlwLCBsZW4pOgorICAgIHJldHVybiB0eXAgKiBsZW4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2NsYXNzIENETEwob2JqZWN0KToKKyAgICAiIiJBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudHMgYSBsb2FkZWQgZGxsL3NoYXJlZAorICAgIGxpYnJhcnksIGV4cG9ydGluZyBmdW5jdGlvbnMgdXNpbmcgdGhlIHN0YW5kYXJkIEMgY2FsbGluZworICAgIGNvbnZlbnRpb24gKG5hbWVkICdjZGVjbCcgb24gV2luZG93cykuCisKKyAgICBUaGUgZXhwb3J0ZWQgZnVuY3Rpb25zIGNhbiBiZSBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzLCBvciBieQorICAgIGluZGV4aW5nIHdpdGggdGhlIGZ1bmN0aW9uIG5hbWUuICBFeGFtcGxlczoKKworICAgIDxvYmo+LnFzb3J0IC0+IGNhbGxhYmxlIG9iamVjdAorICAgIDxvYmo+Wydxc29ydCddIC0+IGNhbGxhYmxlIG9iamVjdAorCisgICAgQ2FsbGluZyB0aGUgZnVuY3Rpb25zIHJlbGVhc2VzIHRoZSBQeXRob24gR0lMIGR1cmluZyB0aGUgY2FsbCBhbmQKKyAgICByZWFjcXVpcmVzIGl0IGFmdGVyd2FyZHMuCisgICAgIiIiCisgICAgX2Z1bmNfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMCisgICAgX2Z1bmNfcmVzdHlwZV8gPSBjX2ludAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdXNlX2Vycm5vPUZhbHNlLAorICAgICAgICAgICAgICAgICB1c2VfbGFzdF9lcnJvcj1GYWxzZSk6CisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgIGZsYWdzID0gc2VsZi5fZnVuY19mbGFnc18KKyAgICAgICAgaWYgdXNlX2Vycm5vOgorICAgICAgICAgICAgZmxhZ3MgfD0gX0ZVTkNGTEFHX1VTRV9FUlJOTworICAgICAgICBpZiB1c2VfbGFzdF9lcnJvcjoKKyAgICAgICAgICAgIGZsYWdzIHw9IF9GVU5DRkxBR19VU0VfTEFTVEVSUk9SCisKKyAgICAgICAgY2xhc3MgX0Z1bmNQdHIoX0NGdW5jUHRyKToKKyAgICAgICAgICAgIF9mbGFnc18gPSBmbGFncworICAgICAgICAgICAgX3Jlc3R5cGVfID0gc2VsZi5fZnVuY19yZXN0eXBlXworICAgICAgICBzZWxmLl9GdW5jUHRyID0gX0Z1bmNQdHIKKworICAgICAgICBpZiBoYW5kbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2hhbmRsZSA9IF9kbG9wZW4oc2VsZi5fbmFtZSwgbW9kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2hhbmRsZSA9IGhhbmRsZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjwlcyAnJXMnLCBoYW5kbGUgJXggYXQgJXg+IiAlIFwKKyAgICAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fbmFtZSwKKyAgICAgICAgICAgICAgICAoc2VsZi5faGFuZGxlICYgKF9zeXMubWF4aW50KjIgKyAxKSksCisgICAgICAgICAgICAgICAgaWQoc2VsZikgJiAoX3N5cy5tYXhpbnQqMiArIDEpKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ19fJykgYW5kIG5hbWUuZW5kc3dpdGgoJ19fJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQorICAgICAgICBmdW5jID0gc2VsZi5fX2dldGl0ZW1fXyhuYW1lKQorICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGZ1bmMpCisgICAgICAgIHJldHVybiBmdW5jCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZV9vcl9vcmRpbmFsKToKKyAgICAgICAgZnVuYyA9IHNlbGYuX0Z1bmNQdHIoKG5hbWVfb3Jfb3JkaW5hbCwgc2VsZikpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5hbWVfb3Jfb3JkaW5hbCwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgZnVuYy5fX25hbWVfXyA9IG5hbWVfb3Jfb3JkaW5hbAorICAgICAgICByZXR1cm4gZnVuYworCitjbGFzcyBQeURMTChDRExMKToKKyAgICAiIiJUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIFB5dGhvbiBsaWJyYXJ5IGl0c2VsZi4gIEl0IGFsbG93cyB0bworICAgIGFjY2VzcyBQeXRob24gQVBJIGZ1bmN0aW9ucy4gIFRoZSBHSUwgaXMgbm90IHJlbGVhc2VkLCBhbmQKKyAgICBQeXRob24gZXhjZXB0aW9ucyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkuCisgICAgIiIiCisgICAgX2Z1bmNfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMIHwgX0ZVTkNGTEFHX1BZVEhPTkFQSQorCitpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisKKyAgICBjbGFzcyBXaW5ETEwoQ0RMTCk6CisgICAgICAgICIiIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGRsbCBleHBvcnRpbmcgZnVuY3Rpb25zIHVzaW5nIHRoZQorICAgICAgICBXaW5kb3dzIHN0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgX2Z1bmNfZmxhZ3NfID0gX0ZVTkNGTEFHX1NURENBTEwKKworICAgICMgWFhYIEhtLCB3aGF0IGFib3V0IEhSRVNVTFQgYXMgbm9ybWFsIHBhcmFtZXRlcj8KKyAgICAjIE11c3RuJ3QgaXQgZGVyaXZlIGZyb20gY19sb25nIHRoZW4/CisgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBfY2hlY2tfSFJFU1VMVCwgX1NpbXBsZUNEYXRhCisgICAgY2xhc3MgSFJFU1VMVChfU2ltcGxlQ0RhdGEpOgorICAgICAgICBfdHlwZV8gPSAibCIKKyAgICAgICAgIyBfY2hlY2tfcmV0dmFsXyBpcyBjYWxsZWQgd2l0aCB0aGUgZnVuY3Rpb24ncyByZXN1bHQgd2hlbiBpdAorICAgICAgICAjIGlzIHVzZWQgYXMgcmVzdHlwZS4gIEl0IGNoZWNrcyBmb3IgdGhlIEZBSUxFRCBiaXQsIGFuZAorICAgICAgICAjIHJhaXNlcyBhIFdpbmRvd3NFcnJvciBpZiBpdCBpcyBzZXQuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgX2NoZWNrX3JldHZhbF8gbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIEMsIHNvIHRoYXQgdGhlCisgICAgICAgICMgbWV0aG9kIGRlZmluaXRpb24gaXRzZWxmIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgdHJhY2ViYWNrCisgICAgICAgICMgd2hlbiBpdCByYWlzZXMgYW4gZXJyb3IgLSB0aGF0IGlzIHdoYXQgd2Ugd2FudCAoYW5kIFB5dGhvbgorICAgICAgICAjIGRvZXNuJ3QgaGF2ZSBhIHdheSB0byByYWlzZSBhbiBleGNlcHRpb24gaW4gdGhlIGNhbGxlcidzCisgICAgICAgICMgZnJhbWUpLgorICAgICAgICBfY2hlY2tfcmV0dmFsXyA9IF9jaGVja19IUkVTVUxUCisKKyAgICBjbGFzcyBPbGVETEwoQ0RMTCk6CisgICAgICAgICIiIlRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGRsbCBleHBvcnRpbmcgZnVuY3Rpb25zIHVzaW5nIHRoZQorICAgICAgICBXaW5kb3dzIHN0ZGNhbGwgY2FsbGluZyBjb252ZW50aW9uLCBhbmQgcmV0dXJuaW5nIEhSRVNVTFQuCisgICAgICAgIEhSRVNVTFQgZXJyb3IgdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHJhaXNlZCBhcyBXaW5kb3dzRXJyb3IKKyAgICAgICAgZXhjZXB0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIF9mdW5jX2ZsYWdzXyA9IF9GVU5DRkxBR19TVERDQUxMCisgICAgICAgIF9mdW5jX3Jlc3R5cGVfID0gSFJFU1VMVAorCitjbGFzcyBMaWJyYXJ5TG9hZGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRsbHR5cGUpOgorICAgICAgICBzZWxmLl9kbGx0eXBlID0gZGxsdHlwZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lWzBdID09ICdfJzoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCisgICAgICAgIGRsbCA9IHNlbGYuX2RsbHR5cGUobmFtZSkKKyAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBkbGwpCisgICAgICAgIHJldHVybiBkbGwKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkKKworICAgIGRlZiBMb2FkTGlicmFyeShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RsbHR5cGUobmFtZSkKKworY2RsbCA9IExpYnJhcnlMb2FkZXIoQ0RMTCkKK3B5ZGxsID0gTGlicmFyeUxvYWRlcihQeURMTCkKKworaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgIHB5dGhvbmFwaSA9IFB5RExMKCJweXRob24gZGxsIiwgTm9uZSwgX3N5cy5kbGxoYW5kbGUpCitlbGlmIF9zeXMucGxhdGZvcm0gPT0gImN5Z3dpbiI6CisgICAgcHl0aG9uYXBpID0gUHlETEwoImxpYnB5dGhvbiVkLiVkLmRsbCIgJSBfc3lzLnZlcnNpb25faW5mb1s6Ml0pCitlbHNlOgorICAgIHB5dGhvbmFwaSA9IFB5RExMKE5vbmUpCisKKworaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgIHdpbmRsbCA9IExpYnJhcnlMb2FkZXIoV2luRExMKQorICAgIG9sZWRsbCA9IExpYnJhcnlMb2FkZXIoT2xlRExMKQorCisgICAgaWYgX29zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgR2V0TGFzdEVycm9yID0gd2luZGxsLmtlcm5lbDMyLkdldExhc3RFcnJvcgorICAgIGVsc2U6CisgICAgICAgIEdldExhc3RFcnJvciA9IHdpbmRsbC5jb3JlZGxsLkdldExhc3RFcnJvcgorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZ2V0X2xhc3RfZXJyb3IsIHNldF9sYXN0X2Vycm9yCisKKyAgICBkZWYgV2luRXJyb3IoY29kZT1Ob25lLCBkZXNjcj1Ob25lKToKKyAgICAgICAgaWYgY29kZSBpcyBOb25lOgorICAgICAgICAgICAgY29kZSA9IEdldExhc3RFcnJvcigpCisgICAgICAgIGlmIGRlc2NyIGlzIE5vbmU6CisgICAgICAgICAgICBkZXNjciA9IEZvcm1hdEVycm9yKGNvZGUpLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuIFdpbmRvd3NFcnJvcihjb2RlLCBkZXNjcikKKworaWYgc2l6ZW9mKGNfdWludCkgPT0gc2l6ZW9mKGNfdm9pZF9wKToKKyAgICBjX3NpemVfdCA9IGNfdWludAorICAgIGNfc3NpemVfdCA9IGNfaW50CitlbGlmIHNpemVvZihjX3Vsb25nKSA9PSBzaXplb2YoY192b2lkX3ApOgorICAgIGNfc2l6ZV90ID0gY191bG9uZworICAgIGNfc3NpemVfdCA9IGNfbG9uZworZWxpZiBzaXplb2YoY191bG9uZ2xvbmcpID09IHNpemVvZihjX3ZvaWRfcCk6CisgICAgY19zaXplX3QgPSBjX3Vsb25nbG9uZworICAgIGNfc3NpemVfdCA9IGNfbG9uZ2xvbmcKKworIyBmdW5jdGlvbnMKKworZnJvbSBfY3R5cGVzIGltcG9ydCBfbWVtbW92ZV9hZGRyLCBfbWVtc2V0X2FkZHIsIF9zdHJpbmdfYXRfYWRkciwgX2Nhc3RfYWRkcgorCisjIyB2b2lkICptZW1tb3ZlKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworbWVtbW92ZSA9IENGVU5DVFlQRShjX3ZvaWRfcCwgY192b2lkX3AsIGNfdm9pZF9wLCBjX3NpemVfdCkoX21lbW1vdmVfYWRkcikKKworIyMgdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBzaXplX3QpCittZW1zZXQgPSBDRlVOQ1RZUEUoY192b2lkX3AsIGNfdm9pZF9wLCBjX2ludCwgY19zaXplX3QpKF9tZW1zZXRfYWRkcikKKworZGVmIFBZRlVOQ1RZUEUocmVzdHlwZSwgKmFyZ3R5cGVzKToKKyAgICBjbGFzcyBDRnVuY3Rpb25UeXBlKF9DRnVuY1B0cik6CisgICAgICAgIF9hcmd0eXBlc18gPSBhcmd0eXBlcworICAgICAgICBfcmVzdHlwZV8gPSByZXN0eXBlCisgICAgICAgIF9mbGFnc18gPSBfRlVOQ0ZMQUdfQ0RFQ0wgfCBfRlVOQ0ZMQUdfUFlUSE9OQVBJCisgICAgcmV0dXJuIENGdW5jdGlvblR5cGUKKworX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCwgcHlfb2JqZWN0KShfY2FzdF9hZGRyKQorZGVmIGNhc3Qob2JqLCB0eXApOgorICAgIHJldHVybiBfY2FzdChvYmosIG9iaiwgdHlwKQorCitfc3RyaW5nX2F0ID0gUFlGVU5DVFlQRShweV9vYmplY3QsIGNfdm9pZF9wLCBjX2ludCkoX3N0cmluZ19hdF9hZGRyKQorZGVmIHN0cmluZ19hdChwdHIsIHNpemU9LTEpOgorICAgICIiInN0cmluZ19hdChhZGRyWywgc2l6ZV0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIHRoZSBzdHJpbmcgYXQgYWRkci4iIiIKKyAgICByZXR1cm4gX3N0cmluZ19hdChwdHIsIHNpemUpCisKK3RyeToKKyAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IF93c3RyaW5nX2F0X2FkZHIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIF93c3RyaW5nX2F0ID0gUFlGVU5DVFlQRShweV9vYmplY3QsIGNfdm9pZF9wLCBjX2ludCkoX3dzdHJpbmdfYXRfYWRkcikKKyAgICBkZWYgd3N0cmluZ19hdChwdHIsIHNpemU9LTEpOgorICAgICAgICAiIiJ3c3RyaW5nX2F0KGFkZHJbLCBzaXplXSkgLT4gc3RyaW5nCisKKyAgICAgICAgUmV0dXJuIHRoZSBzdHJpbmcgYXQgYWRkci4iIiIKKyAgICAgICAgcmV0dXJuIF93c3RyaW5nX2F0KHB0ciwgc2l6ZSkKKworCitpZiBfb3MubmFtZSBpbiAoIm50IiwgImNlIik6ICMgQ09NIHN0dWZmCisgICAgZGVmIERsbEdldENsYXNzT2JqZWN0KHJjbHNpZCwgcmlpZCwgcHB2KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlci5pbnByb2NzZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIC0yMTQ3MjIxMjMxICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCisKKyAgICBkZWYgRGxsQ2FuVW5sb2FkTm93KCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIuaW5wcm9jc2VydmVyIiwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAwICMgU19PSworICAgICAgICByZXR1cm4gY2NvbS5EbGxDYW5VbmxvYWROb3coKQorCitmcm9tIGN0eXBlcy5fZW5kaWFuIGltcG9ydCBCaWdFbmRpYW5TdHJ1Y3R1cmUsIExpdHRsZUVuZGlhblN0cnVjdHVyZQorCisjIEZpbGwgaW4gc3BlY2lmaWNhbGx5LXNpemVkIHR5cGVzCitjX2ludDggPSBjX2J5dGUKK2NfdWludDggPSBjX3VieXRlCitmb3Iga2luZCBpbiBbY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19sb25nbG9uZ106CisgICAgaWYgc2l6ZW9mKGtpbmQpID09IDI6IGNfaW50MTYgPSBraW5kCisgICAgZWxpZiBzaXplb2Yoa2luZCkgPT0gNDogY19pbnQzMiA9IGtpbmQKKyAgICBlbGlmIHNpemVvZihraW5kKSA9PSA4OiBjX2ludDY0ID0ga2luZAorZm9yIGtpbmQgaW4gW2NfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nXToKKyAgICBpZiBzaXplb2Yoa2luZCkgPT0gMjogY191aW50MTYgPSBraW5kCisgICAgZWxpZiBzaXplb2Yoa2luZCkgPT0gNDogY191aW50MzIgPSBraW5kCisgICAgZWxpZiBzaXplb2Yoa2luZCkgPT0gODogY191aW50NjQgPSBraW5kCitkZWwoa2luZCkKKworX3Jlc2V0X2NhY2hlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY5NjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTY5NjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL19lbmRpYW4ucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9fZW5kaWFuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MGU2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9fZW5kaWFuLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ltcG9ydCBzeXMKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK19hcnJheV90eXBlID0gdHlwZShBcnJheSkKKworZGVmIF9vdGhlcl9lbmRpYW4odHlwKToKKyAgICAiIiJSZXR1cm4gdGhlIHR5cGUgd2l0aCB0aGUgJ290aGVyJyBieXRlIG9yZGVyLiAgU2ltcGxlIHR5cGVzIGxpa2UKKyAgICBjX2ludCBhbmQgc28gb24gYWxyZWFkeSBoYXZlIF9fY3R5cGVfYmVfXyBhbmQgX19jdHlwZV9sZV9fCisgICAgYXR0cmlidXRlcyB3aGljaCBjb250YWluIHRoZSB0eXBlcywgZm9yIG1vcmUgY29tcGxpY2F0ZWQgdHlwZXMKKyAgICBhcnJheXMgYW5kIHN0cnVjdHVyZXMgYXJlIHN1cHBvcnRlZC4KKyAgICAiIiIKKyAgICAjIGNoZWNrIF9PVEhFUl9FTkRJQU4gYXR0cmlidXRlIChwcmVzZW50IGlmIHR5cCBpcyBwcmltaXRpdmUgdHlwZSkKKyAgICBpZiBoYXNhdHRyKHR5cCwgX09USEVSX0VORElBTik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHR5cCwgX09USEVSX0VORElBTikKKyAgICAjIGlmIHR5cCBpcyBhcnJheQorICAgIGlmIGlzaW5zdGFuY2UodHlwLCBfYXJyYXlfdHlwZSk6CisgICAgICAgIHJldHVybiBfb3RoZXJfZW5kaWFuKHR5cC5fdHlwZV8pICogdHlwLl9sZW5ndGhfCisgICAgIyBpZiB0eXAgaXMgc3RydWN0dXJlCisgICAgaWYgaXNzdWJjbGFzcyh0eXAsIFN0cnVjdHVyZSk6CisgICAgICAgIHJldHVybiB0eXAKKyAgICByYWlzZSBUeXBlRXJyb3IoIlRoaXMgdHlwZSBkb2VzIG5vdCBzdXBwb3J0IG90aGVyIGVuZGlhbjogJXMiICUgdHlwKQorCitjbGFzcyBfc3dhcHBlZF9tZXRhKHR5cGUoU3RydWN0dXJlKSk6CisgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIGF0dHJuYW1lLCB2YWx1ZSk6CisgICAgICAgIGlmIGF0dHJuYW1lID09ICJfZmllbGRzXyI6CisgICAgICAgICAgICBmaWVsZHMgPSBbXQorICAgICAgICAgICAgZm9yIGRlc2MgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgbmFtZSA9IGRlc2NbMF0KKyAgICAgICAgICAgICAgICB0eXAgPSBkZXNjWzFdCisgICAgICAgICAgICAgICAgcmVzdCA9IGRlc2NbMjpdCisgICAgICAgICAgICAgICAgZmllbGRzLmFwcGVuZCgobmFtZSwgX290aGVyX2VuZGlhbih0eXApKSArIHJlc3QpCisgICAgICAgICAgICB2YWx1ZSA9IGZpZWxkcworICAgICAgICBzdXBlcihfc3dhcHBlZF9tZXRhLCBzZWxmKS5fX3NldGF0dHJfXyhhdHRybmFtZSwgdmFsdWUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBOb3RlOiBUaGUgU3RydWN0dXJlIG1ldGFjbGFzcyBjaGVja3MgZm9yIHRoZSAqcHJlc2VuY2UqIChub3QgdGhlCisjIHZhbHVlISkgb2YgYSBfc3dhcHBlZF9ieXRlc18gYXR0cmlidXRlIHRvIGRldGVybWluZSB0aGUgYml0IG9yZGVyIGluCisjIHN0cnVjdHVyZXMgY29udGFpbmluZyBiaXQgZmllbGRzLgorCitpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgIF9PVEhFUl9FTkRJQU4gPSAiX19jdHlwZV9iZV9fIgorCisgICAgTGl0dGxlRW5kaWFuU3RydWN0dXJlID0gU3RydWN0dXJlCisKKyAgICBjbGFzcyBCaWdFbmRpYW5TdHJ1Y3R1cmUoU3RydWN0dXJlKToKKyAgICAgICAgIiIiU3RydWN0dXJlIHdpdGggYmlnIGVuZGlhbiBieXRlIG9yZGVyIiIiCisgICAgICAgIF9fbWV0YWNsYXNzX18gPSBfc3dhcHBlZF9tZXRhCisgICAgICAgIF9zd2FwcGVkYnl0ZXNfID0gTm9uZQorCitlbGlmIHN5cy5ieXRlb3JkZXIgPT0gImJpZyI6CisgICAgX09USEVSX0VORElBTiA9ICJfX2N0eXBlX2xlX18iCisKKyAgICBCaWdFbmRpYW5TdHJ1Y3R1cmUgPSBTdHJ1Y3R1cmUKKyAgICBjbGFzcyBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUoU3RydWN0dXJlKToKKyAgICAgICAgIiIiU3RydWN0dXJlIHdpdGggbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyIiIiCisgICAgICAgIF9fbWV0YWNsYXNzX18gPSBfc3dhcHBlZF9tZXRhCisgICAgICAgIF9zd2FwcGVkYnl0ZXNfID0gTm9uZQorCitlbHNlOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiSW52YWxpZCBieXRlb3JkZXIiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9fZW5kaWFuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRlYTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy9fZW5kaWFuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTRlYTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvX2VuZGlhbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvUkVBRE1FLmN0eXBlcyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL1JFQURNRS5jdHlwZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxMGNiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL1JFQURNRS5jdHlwZXMKQEAgLTAsMCArMSw3IEBACitGaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmcm9tIGZyb20gQm9iIElwcG9saXRvJ3MgcHkyYXBwLgorCitMaWNlbnNlOiBBbnkgY29tcG9uZW50cyBvZiB0aGUgcHkyYXBwIHN1aXRlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlcgordGhlIE1JVCBvciBQU0Ygb3BlbiBzb3VyY2UgbGljZW5zZXMuCisKK1RoaXMgaXMgdmVyc2lvbiAxLjAsIFNWTiByZXZpc2lvbiA3ODksIGZyb20gMjAwNi8wMS8yNS4KK1RoZSBtYWluIHJlcG9zaXRvcnkgaXMgaHR0cDovL3N2bi5yZWQtYmVhbi5jb20vYm9iL21hY2hvbGliL3RydW5rL21hY2hvbGliLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxNDlkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTIgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyIiIgorRW5vdWdoIE1hY2gtTyB0byBtYWtlIHlvdXIgaGVhZCBzcGluLgorCitTZWUgdGhlIHJlbGV2YW50IGhlYWRlciBmaWxlcyBpbiAvdXNyL2luY2x1ZGUvbWFjaC1vCisKK0FuZCBhbHNvIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbi4KKyIiIgorCitfX3ZlcnNpb25fXyA9ICcxLjAnCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0ZTU3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0ZTU3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzE0ZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsZC5weQpAQCAtMCwwICsxLDE2OSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIiIiCitkeWxkIGVtdWxhdGlvbgorIiIiCisKK2ltcG9ydCBvcworZnJvbSBmcmFtZXdvcmsgaW1wb3J0IGZyYW1ld29ya19pbmZvCitmcm9tIGR5bGliIGltcG9ydCBkeWxpYl9pbmZvCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgKgorCitfX2FsbF9fID0gWworICAgICdkeWxkX2ZpbmQnLCAnZnJhbWV3b3JrX2ZpbmQnLAorICAgICdmcmFtZXdvcmtfaW5mbycsICdkeWxpYl9pbmZvJywKK10KKworIyBUaGVzZSBhcmUgdGhlIGRlZmF1bHRzIGFzIHBlciBtYW4gZHlsZCgxKQorIworREVGQVVMVF9GUkFNRVdPUktfRkFMTEJBQ0sgPSBbCisgICAgb3MucGF0aC5leHBhbmR1c2VyKCJ+L0xpYnJhcnkvRnJhbWV3b3JrcyIpLAorICAgICIvTGlicmFyeS9GcmFtZXdvcmtzIiwKKyAgICAiL05ldHdvcmsvTGlicmFyeS9GcmFtZXdvcmtzIiwKKyAgICAiL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MiLAorXQorCitERUZBVUxUX0xJQlJBUllfRkFMTEJBQ0sgPSBbCisgICAgb3MucGF0aC5leHBhbmR1c2VyKCJ+L2xpYiIpLAorICAgICIvdXNyL2xvY2FsL2xpYiIsCisgICAgIi9saWIiLAorICAgICIvdXNyL2xpYiIsCitdCisKK2RlZiBlbnN1cmVfdXRmOChzKToKKyAgICAiIiJOb3QgYWxsIG9mIFB5T2JqQyBhbmQgUHl0aG9uIHVuZGVyc3RhbmQgdW5pY29kZSBwYXRocyB2ZXJ5IHdlbGwgeWV0IiIiCisgICAgaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKKyAgICAgICAgcmV0dXJuIHMuZW5jb2RlKCd1dGY4JykKKyAgICByZXR1cm4gcworCitkZWYgZHlsZF9lbnYoZW52LCB2YXIpOgorICAgIGlmIGVudiBpcyBOb25lOgorICAgICAgICBlbnYgPSBvcy5lbnZpcm9uCisgICAgcnZhbCA9IGVudi5nZXQodmFyKQorICAgIGlmIHJ2YWwgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIFtdCisgICAgcmV0dXJuIHJ2YWwuc3BsaXQoJzonKQorCitkZWYgZHlsZF9pbWFnZV9zdWZmaXgoZW52PU5vbmUpOgorICAgIGlmIGVudiBpcyBOb25lOgorICAgICAgICBlbnYgPSBvcy5lbnZpcm9uCisgICAgcmV0dXJuIGVudi5nZXQoJ0RZTERfSU1BR0VfU1VGRklYJykKKworZGVmIGR5bGRfZnJhbWV3b3JrX3BhdGgoZW52PU5vbmUpOgorICAgIHJldHVybiBkeWxkX2VudihlbnYsICdEWUxEX0ZSQU1FV09SS19QQVRIJykKKworZGVmIGR5bGRfbGlicmFyeV9wYXRoKGVudj1Ob25lKToKKyAgICByZXR1cm4gZHlsZF9lbnYoZW52LCAnRFlMRF9MSUJSQVJZX1BBVEgnKQorCitkZWYgZHlsZF9mYWxsYmFja19mcmFtZXdvcmtfcGF0aChlbnY9Tm9uZSk6CisgICAgcmV0dXJuIGR5bGRfZW52KGVudiwgJ0RZTERfRkFMTEJBQ0tfRlJBTUVXT1JLX1BBVEgnKQorCitkZWYgZHlsZF9mYWxsYmFja19saWJyYXJ5X3BhdGgoZW52PU5vbmUpOgorICAgIHJldHVybiBkeWxkX2VudihlbnYsICdEWUxEX0ZBTExCQUNLX0xJQlJBUllfUEFUSCcpCisKK2RlZiBkeWxkX2ltYWdlX3N1ZmZpeF9zZWFyY2goaXRlcmF0b3IsIGVudj1Ob25lKToKKyAgICAiIiJGb3IgYSBwb3RlbnRpYWwgcGF0aCBpdGVyYXRvciwgYWRkIERZTERfSU1BR0VfU1VGRklYIHNlbWFudGljcyIiIgorICAgIHN1ZmZpeCA9IGR5bGRfaW1hZ2Vfc3VmZml4KGVudikKKyAgICBpZiBzdWZmaXggaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yCisgICAgZGVmIF9pbmplY3QoaXRlcmF0b3I9aXRlcmF0b3IsIHN1ZmZpeD1zdWZmaXgpOgorICAgICAgICBmb3IgcGF0aCBpbiBpdGVyYXRvcjoKKyAgICAgICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy5keWxpYicpOgorICAgICAgICAgICAgICAgIHlpZWxkIHBhdGhbOi1sZW4oJy5keWxpYicpXSArIHN1ZmZpeCArICcuZHlsaWInCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIHBhdGggKyBzdWZmaXgKKyAgICAgICAgICAgIHlpZWxkIHBhdGgKKyAgICByZXR1cm4gX2luamVjdCgpCisKK2RlZiBkeWxkX292ZXJyaWRlX3NlYXJjaChuYW1lLCBlbnY9Tm9uZSk6CisgICAgIyBJZiBEWUxEX0ZSQU1FV09SS19QQVRIIGlzIHNldCBhbmQgdGhpcyBkeWxpYl9uYW1lIGlzIGEKKyAgICAjIGZyYW1ld29yayBuYW1lLCB1c2UgdGhlIGZpcnN0IGZpbGUgdGhhdCBleGlzdHMgaW4gdGhlIGZyYW1ld29yaworICAgICMgcGF0aCBpZiBhbnkuICBJZiB0aGVyZSBpcyBub25lIGdvIG9uIHRvIHNlYXJjaCB0aGUgRFlMRF9MSUJSQVJZX1BBVEgKKyAgICAjIGlmIGFueS4KKworICAgIGZyYW1ld29yayA9IGZyYW1ld29ya19pbmZvKG5hbWUpCisKKyAgICBpZiBmcmFtZXdvcmsgaXMgbm90IE5vbmU6CisgICAgICAgIGZvciBwYXRoIGluIGR5bGRfZnJhbWV3b3JrX3BhdGgoZW52KToKKyAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCBmcmFtZXdvcmtbJ25hbWUnXSkKKworICAgICMgSWYgRFlMRF9MSUJSQVJZX1BBVEggaXMgc2V0IHRoZW4gdXNlIHRoZSBmaXJzdCBmaWxlIHRoYXQgZXhpc3RzCisgICAgIyBpbiB0aGUgcGF0aC4gIElmIG5vbmUgdXNlIHRoZSBvcmlnaW5hbCBuYW1lLgorICAgIGZvciBwYXRoIGluIGR5bGRfbGlicmFyeV9wYXRoKGVudik6CisgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCBvcy5wYXRoLmJhc2VuYW1lKG5hbWUpKQorCitkZWYgZHlsZF9leGVjdXRhYmxlX3BhdGhfc2VhcmNoKG5hbWUsIGV4ZWN1dGFibGVfcGF0aD1Ob25lKToKKyAgICAjIElmIHdlIGhhdmVuJ3QgZG9uZSBhbnkgc2VhcmNoaW5nIGFuZCBmb3VuZCBhIGxpYnJhcnkgYW5kIHRoZQorICAgICMgZHlsaWJfbmFtZSBzdGFydHMgd2l0aCAiQGV4ZWN1dGFibGVfcGF0aC8iIHRoZW4gY29uc3RydWN0IHRoZQorICAgICMgbGlicmFyeSBuYW1lLgorICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnQGV4ZWN1dGFibGVfcGF0aC8nKSBhbmQgZXhlY3V0YWJsZV9wYXRoIGlzIG5vdCBOb25lOgorICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4oZXhlY3V0YWJsZV9wYXRoLCBuYW1lW2xlbignQGV4ZWN1dGFibGVfcGF0aC8nKTpdKQorCitkZWYgZHlsZF9kZWZhdWx0X3NlYXJjaChuYW1lLCBlbnY9Tm9uZSk6CisgICAgeWllbGQgbmFtZQorCisgICAgZnJhbWV3b3JrID0gZnJhbWV3b3JrX2luZm8obmFtZSkKKworICAgIGlmIGZyYW1ld29yayBpcyBub3QgTm9uZToKKyAgICAgICAgZmFsbGJhY2tfZnJhbWV3b3JrX3BhdGggPSBkeWxkX2ZhbGxiYWNrX2ZyYW1ld29ya19wYXRoKGVudikKKyAgICAgICAgZm9yIHBhdGggaW4gZmFsbGJhY2tfZnJhbWV3b3JrX3BhdGg6CisgICAgICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocGF0aCwgZnJhbWV3b3JrWyduYW1lJ10pCisKKyAgICBmYWxsYmFja19saWJyYXJ5X3BhdGggPSBkeWxkX2ZhbGxiYWNrX2xpYnJhcnlfcGF0aChlbnYpCisgICAgZm9yIHBhdGggaW4gZmFsbGJhY2tfbGlicmFyeV9wYXRoOgorICAgICAgICB5aWVsZCBvcy5wYXRoLmpvaW4ocGF0aCwgb3MucGF0aC5iYXNlbmFtZShuYW1lKSkKKworICAgIGlmIGZyYW1ld29yayBpcyBub3QgTm9uZSBhbmQgbm90IGZhbGxiYWNrX2ZyYW1ld29ya19wYXRoOgorICAgICAgICBmb3IgcGF0aCBpbiBERUZBVUxUX0ZSQU1FV09SS19GQUxMQkFDSzoKKyAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCBmcmFtZXdvcmtbJ25hbWUnXSkKKworICAgIGlmIG5vdCBmYWxsYmFja19saWJyYXJ5X3BhdGg6CisgICAgICAgIGZvciBwYXRoIGluIERFRkFVTFRfTElCUkFSWV9GQUxMQkFDSzoKKyAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihwYXRoLCBvcy5wYXRoLmJhc2VuYW1lKG5hbWUpKQorCitkZWYgZHlsZF9maW5kKG5hbWUsIGV4ZWN1dGFibGVfcGF0aD1Ob25lLCBlbnY9Tm9uZSk6CisgICAgIiIiCisgICAgRmluZCBhIGxpYnJhcnkgb3IgZnJhbWV3b3JrIHVzaW5nIGR5bGQgc2VtYW50aWNzCisgICAgIiIiCisgICAgbmFtZSA9IGVuc3VyZV91dGY4KG5hbWUpCisgICAgZXhlY3V0YWJsZV9wYXRoID0gZW5zdXJlX3V0ZjgoZXhlY3V0YWJsZV9wYXRoKQorICAgIGZvciBwYXRoIGluIGR5bGRfaW1hZ2Vfc3VmZml4X3NlYXJjaChjaGFpbigKKyAgICAgICAgICAgICAgICBkeWxkX292ZXJyaWRlX3NlYXJjaChuYW1lLCBlbnYpLAorICAgICAgICAgICAgICAgIGR5bGRfZXhlY3V0YWJsZV9wYXRoX3NlYXJjaChuYW1lLCBleGVjdXRhYmxlX3BhdGgpLAorICAgICAgICAgICAgICAgIGR5bGRfZGVmYXVsdF9zZWFyY2gobmFtZSwgZW52KSwKKyAgICAgICAgICAgICksIGVudik6CisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgcmV0dXJuIHBhdGgKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJkeWxpYiAlcyBjb3VsZCBub3QgYmUgZm91bmQiICUgKG5hbWUsKSkKKworZGVmIGZyYW1ld29ya19maW5kKGZuLCBleGVjdXRhYmxlX3BhdGg9Tm9uZSwgZW52PU5vbmUpOgorICAgICIiIgorICAgIEZpbmQgYSBmcmFtZXdvcmsgdXNpbmcgZHlsZCBzZW1hbnRpY3MgaW4gYSB2ZXJ5IGxvb3NlIG1hbm5lci4KKworICAgIFdpbGwgdGFrZSBpbnB1dCBzdWNoIGFzOgorICAgICAgICBQeXRob24KKyAgICAgICAgUHl0aG9uLmZyYW1ld29yaworICAgICAgICBQeXRob24uZnJhbWV3b3JrL1ZlcnNpb25zL0N1cnJlbnQKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBkeWxkX2ZpbmQoZm4sIGV4ZWN1dGFibGVfcGF0aD1leGVjdXRhYmxlX3BhdGgsIGVudj1lbnYpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgIHBhc3MKKyAgICBmbXdrX2luZGV4ID0gZm4ucmZpbmQoJy5mcmFtZXdvcmsnKQorICAgIGlmIGZtd2tfaW5kZXggPT0gLTE6CisgICAgICAgIGZtd2tfaW5kZXggPSBsZW4oZm4pCisgICAgICAgIGZuICs9ICcuZnJhbWV3b3JrJworICAgIGZuID0gb3MucGF0aC5qb2luKGZuLCBvcy5wYXRoLmJhc2VuYW1lKGZuWzpmbXdrX2luZGV4XSkpCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gZHlsZF9maW5kKGZuLCBleGVjdXRhYmxlX3BhdGg9ZXhlY3V0YWJsZV9wYXRoLCBlbnY9ZW52KQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICByYWlzZSBlCisKK2RlZiB0ZXN0X2R5bGRfZmluZCgpOgorICAgIGVudiA9IHt9CisgICAgYXNzZXJ0IGR5bGRfZmluZCgnbGliU3lzdGVtLmR5bGliJykgPT0gJy91c3IvbGliL2xpYlN5c3RlbS5keWxpYicKKyAgICBhc3NlcnQgZHlsZF9maW5kKCdTeXN0ZW0uZnJhbWV3b3JrL1N5c3RlbScpID09ICcvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9TeXN0ZW0uZnJhbWV3b3JrL1N5c3RlbScKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X2R5bGRfZmluZCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTA3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzA4NjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxpYi5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2RkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxpYi5weQpAQCAtMCwwICsxLDY2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisiIiIKK0dlbmVyaWMgZHlsaWIgcGF0aCBtYW5pcHVsYXRpb24KKyIiIgorCitpbXBvcnQgcmUKKworX19hbGxfXyA9IFsnZHlsaWJfaW5mbyddCisKK0RZTElCX1JFID0gcmUuY29tcGlsZShyIiIiKD94KQorKD9QPGxvY2F0aW9uPl4uKikoPzpefC8pCisoP1A8bmFtZT4KKyAgICAoP1A8c2hvcnRuYW1lPlx3Kz8pCisgICAgKD86XC4oP1A8dmVyc2lvbj5bXi5fXSspKT8KKyAgICAoPzpfKD9QPHN1ZmZpeD5bXi5fXSspKT8KKyAgICBcLmR5bGliJAorKQorIiIiKQorCitkZWYgZHlsaWJfaW5mbyhmaWxlbmFtZSk6CisgICAgIiIiCisgICAgQSBkeWxpYiBuYW1lIGNhbiB0YWtlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvdXIgZm9ybXM6CisgICAgICAgIExvY2F0aW9uL05hbWUuU29tZVZlcnNpb25fU3VmZml4LmR5bGliCisgICAgICAgIExvY2F0aW9uL05hbWUuU29tZVZlcnNpb24uZHlsaWIKKyAgICAgICAgTG9jYXRpb24vTmFtZV9TdWZmaXguZHlsaWIKKyAgICAgICAgTG9jYXRpb24vTmFtZS5keWxpYgorCisgICAgcmV0dXJucyBOb25lIGlmIG5vdCBmb3VuZCBvciBhIG1hcHBpbmcgZXF1aXZhbGVudCB0bzoKKyAgICAgICAgZGljdCgKKyAgICAgICAgICAgIGxvY2F0aW9uPSdMb2NhdGlvbicsCisgICAgICAgICAgICBuYW1lPSdOYW1lLlNvbWVWZXJzaW9uX1N1ZmZpeC5keWxpYicsCisgICAgICAgICAgICBzaG9ydG5hbWU9J05hbWUnLAorICAgICAgICAgICAgdmVyc2lvbj0nU29tZVZlcnNpb24nLAorICAgICAgICAgICAgc3VmZml4PSdTdWZmaXgnLAorICAgICAgICApCisKKyAgICBOb3RlIHRoYXQgU29tZVZlcnNpb24gYW5kIFN1ZmZpeCBhcmUgb3B0aW9uYWwgYW5kIG1heSBiZSBOb25lCisgICAgaWYgbm90IHByZXNlbnQuCisgICAgIiIiCisgICAgaXNfZHlsaWIgPSBEWUxJQl9SRS5tYXRjaChmaWxlbmFtZSkKKyAgICBpZiBub3QgaXNfZHlsaWI6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIGlzX2R5bGliLmdyb3VwZGljdCgpCisKKworZGVmIHRlc3RfZHlsaWJfaW5mbygpOgorICAgIGRlZiBkKGxvY2F0aW9uPU5vbmUsIG5hbWU9Tm9uZSwgc2hvcnRuYW1lPU5vbmUsIHZlcnNpb249Tm9uZSwgc3VmZml4PU5vbmUpOgorICAgICAgICByZXR1cm4gZGljdCgKKyAgICAgICAgICAgIGxvY2F0aW9uPWxvY2F0aW9uLAorICAgICAgICAgICAgbmFtZT1uYW1lLAorICAgICAgICAgICAgc2hvcnRuYW1lPXNob3J0bmFtZSwKKyAgICAgICAgICAgIHZlcnNpb249dmVyc2lvbiwKKyAgICAgICAgICAgIHN1ZmZpeD1zdWZmaXgKKyAgICAgICAgKQorICAgIGFzc2VydCBkeWxpYl9pbmZvKCdjb21wbGV0ZWx5L2ludmFsaWQnKSBpcyBOb25lCisgICAgYXNzZXJ0IGR5bGliX2luZm8oJ2NvbXBsZXRlbHkvaW52YWxpZGVfZGVidWcnKSBpcyBOb25lCisgICAgYXNzZXJ0IGR5bGliX2luZm8oJ1AvRm9vLmR5bGliJykgPT0gZCgnUCcsICdGb28uZHlsaWInLCAnRm9vJykKKyAgICBhc3NlcnQgZHlsaWJfaW5mbygnUC9Gb29fZGVidWcuZHlsaWInKSA9PSBkKCdQJywgJ0Zvb19kZWJ1Zy5keWxpYicsICdGb28nLCBzdWZmaXg9J2RlYnVnJykKKyAgICBhc3NlcnQgZHlsaWJfaW5mbygnUC9Gb28uQS5keWxpYicpID09IGQoJ1AnLCAnRm9vLkEuZHlsaWInLCAnRm9vJywgJ0EnKQorICAgIGFzc2VydCBkeWxpYl9pbmZvKCdQL0Zvb19kZWJ1Zy5BLmR5bGliJykgPT0gZCgnUCcsICdGb29fZGVidWcuQS5keWxpYicsICdGb29fZGVidWcnLCAnQScpCisgICAgYXNzZXJ0IGR5bGliX2luZm8oJ1AvRm9vLkFfZGVidWcuZHlsaWInKSA9PSBkKCdQJywgJ0Zvby5BX2RlYnVnLmR5bGliJywgJ0ZvbycsICdBJywgJ2RlYnVnJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X2R5bGliX2luZm8oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NjZmNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDNkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9keWxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZmV0Y2hfbWFjaG9saWIgYi9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9mZXRjaF9tYWNob2xpYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNmQ2YTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZmV0Y2hfbWFjaG9saWIKQEAgLTAsMCArMSwyIEBACisjIS9iaW4vc2gKK3N2biBleHBvcnQgLS1mb3JjZSBodHRwOi8vc3ZuLnJlZC1iZWFuLmNvbS9ib2IvbWFjaG9saWIvdHJ1bmsvbWFjaG9saWIvIC4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZldGNoX21hY2hvbGliLmJhdCBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZldGNoX21hY2hvbGliLmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWUxYzBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZmV0Y2hfbWFjaG9saWIuYmF0CkBAIC0wLDAgKzEgQEAKK3N2biBleHBvcnQgLS1mb3JjZSBodHRwOi8vc3ZuLnJlZC1iZWFuLmNvbS9ib2IvbWFjaG9saWIvdHJ1bmsvbWFjaG9saWIvIC4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDdmYjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZnJhbWV3b3JrLnB5CkBAIC0wLDAgKzEsNjggQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyIiIgorR2VuZXJpYyBmcmFtZXdvcmsgcGF0aCBtYW5pcHVsYXRpb24KKyIiIgorCitpbXBvcnQgcmUKKworX19hbGxfXyA9IFsnZnJhbWV3b3JrX2luZm8nXQorCitTVFJJQ1RfRlJBTUVXT1JLX1JFID0gcmUuY29tcGlsZShyIiIiKD94KQorKD9QPGxvY2F0aW9uPl4uKikoPzpefC8pCisoP1A8bmFtZT4KKyAgICAoP1A8c2hvcnRuYW1lPlx3KykuZnJhbWV3b3JrLworICAgICg/OlZlcnNpb25zLyg/UDx2ZXJzaW9uPlteL10rKS8pPworICAgICg/UD1zaG9ydG5hbWUpCisgICAgKD86Xyg/UDxzdWZmaXg+W15fXSspKT8KKykkCisiIiIpCisKK2RlZiBmcmFtZXdvcmtfaW5mbyhmaWxlbmFtZSk6CisgICAgIiIiCisgICAgQSBmcmFtZXdvcmsgbmFtZSBjYW4gdGFrZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3VyIGZvcm1zOgorICAgICAgICBMb2NhdGlvbi9OYW1lLmZyYW1ld29yay9WZXJzaW9ucy9Tb21lVmVyc2lvbi9OYW1lX1N1ZmZpeAorICAgICAgICBMb2NhdGlvbi9OYW1lLmZyYW1ld29yay9WZXJzaW9ucy9Tb21lVmVyc2lvbi9OYW1lCisgICAgICAgIExvY2F0aW9uL05hbWUuZnJhbWV3b3JrL05hbWVfU3VmZml4CisgICAgICAgIExvY2F0aW9uL05hbWUuZnJhbWV3b3JrL05hbWUKKworICAgIHJldHVybnMgTm9uZSBpZiBub3QgZm91bmQsIG9yIGEgbWFwcGluZyBlcXVpdmFsZW50IHRvOgorICAgICAgICBkaWN0KAorICAgICAgICAgICAgbG9jYXRpb249J0xvY2F0aW9uJywKKyAgICAgICAgICAgIG5hbWU9J05hbWUuZnJhbWV3b3JrL1ZlcnNpb25zL1NvbWVWZXJzaW9uL05hbWVfU3VmZml4JywKKyAgICAgICAgICAgIHNob3J0bmFtZT0nTmFtZScsCisgICAgICAgICAgICB2ZXJzaW9uPSdTb21lVmVyc2lvbicsCisgICAgICAgICAgICBzdWZmaXg9J1N1ZmZpeCcsCisgICAgICAgICkKKworICAgIE5vdGUgdGhhdCBTb21lVmVyc2lvbiBhbmQgU3VmZml4IGFyZSBvcHRpb25hbCBhbmQgbWF5IGJlIE5vbmUKKyAgICBpZiBub3QgcHJlc2VudAorICAgICIiIgorICAgIGlzX2ZyYW1ld29yayA9IFNUUklDVF9GUkFNRVdPUktfUkUubWF0Y2goZmlsZW5hbWUpCisgICAgaWYgbm90IGlzX2ZyYW1ld29yazoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gaXNfZnJhbWV3b3JrLmdyb3VwZGljdCgpCisKK2RlZiB0ZXN0X2ZyYW1ld29ya19pbmZvKCk6CisgICAgZGVmIGQobG9jYXRpb249Tm9uZSwgbmFtZT1Ob25lLCBzaG9ydG5hbWU9Tm9uZSwgdmVyc2lvbj1Ob25lLCBzdWZmaXg9Tm9uZSk6CisgICAgICAgIHJldHVybiBkaWN0KAorICAgICAgICAgICAgbG9jYXRpb249bG9jYXRpb24sCisgICAgICAgICAgICBuYW1lPW5hbWUsCisgICAgICAgICAgICBzaG9ydG5hbWU9c2hvcnRuYW1lLAorICAgICAgICAgICAgdmVyc2lvbj12ZXJzaW9uLAorICAgICAgICAgICAgc3VmZml4PXN1ZmZpeAorICAgICAgICApCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdjb21wbGV0ZWx5L2ludmFsaWQnKSBpcyBOb25lCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdjb21wbGV0ZWx5L2ludmFsaWQvX2RlYnVnJykgaXMgTm9uZQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yaycpIGlzIE5vbmUKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsvX2RlYnVnJykgaXMgTm9uZQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yay9GJykgPT0gZCgnUCcsICdGLmZyYW1ld29yay9GJywgJ0YnKQorICAgIGFzc2VydCBmcmFtZXdvcmtfaW5mbygnUC9GLmZyYW1ld29yay9GX2RlYnVnJykgPT0gZCgnUCcsICdGLmZyYW1ld29yay9GX2RlYnVnJywgJ0YnLCBzdWZmaXg9J2RlYnVnJykKKyAgICBhc3NlcnQgZnJhbWV3b3JrX2luZm8oJ1AvRi5mcmFtZXdvcmsvVmVyc2lvbnMnKSBpcyBOb25lCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrL1ZlcnNpb25zL0EnKSBpcyBOb25lCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrL1ZlcnNpb25zL0EvRicpID09IGQoJ1AnLCAnRi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9GJywgJ0YnLCAnQScpCisgICAgYXNzZXJ0IGZyYW1ld29ya19pbmZvKCdQL0YuZnJhbWV3b3JrL1ZlcnNpb25zL0EvRl9kZWJ1ZycpID09IGQoJ1AnLCAnRi5mcmFtZXdvcmsvVmVyc2lvbnMvQS9GX2RlYnVnJywgJ0YnLCAnQScsICdkZWJ1ZycpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9mcmFtZXdvcmtfaW5mbygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZnJhbWV3b3JrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGRlOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZnJhbWV3b3JrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZnJhbWV3b3JrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWQxYTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvbWFjaG9saWIvZnJhbWV3b3JrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhlNDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDIwOCBAQAoraW1wb3J0IG9zLCBzeXMsIHVuaXR0ZXN0LCBnZXRvcHQsIHRpbWUKKwordXNlX3Jlc291cmNlcyA9IFtdCisKK2NsYXNzIFJlc291cmNlRGVuaWVkKEV4Y2VwdGlvbik6CisgICAgIiIiVGVzdCBza2lwcGVkIGJlY2F1c2UgaXQgcmVxdWVzdGVkIGEgZGlzYWxsb3dlZCByZXNvdXJjZS4KKworICAgIFRoaXMgaXMgcmFpc2VkIHdoZW4gYSB0ZXN0IGNhbGxzIHJlcXVpcmVzKCkgZm9yIGEgcmVzb3VyY2UgdGhhdAorICAgIGhhcyBub3QgYmUgZW5hYmxlZC4gIFJlc291cmNlcyBhcmUgZGVmaW5lZCBieSB0ZXN0IG1vZHVsZXMuCisgICAgIiIiCisKK2RlZiBpc19yZXNvdXJjZV9lbmFibGVkKHJlc291cmNlKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYSByZXNvdXJjZSBpcyBlbmFibGVkLgorCisgICAgSWYgdGhlIGNhbGxlcidzIG1vZHVsZSBpcyBfX21haW5fXyB0aGVuIGF1dG9tYXRpY2FsbHkgcmV0dXJuIFRydWUuIiIiCisgICAgaWYgc3lzLl9nZXRmcmFtZSgpLmZfYmFjay5mX2dsb2JhbHMuZ2V0KCJfX25hbWVfXyIpID09ICJfX21haW5fXyI6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmVzdWx0ID0gdXNlX3Jlc291cmNlcyBpcyBub3QgTm9uZSBhbmQgXAorICAgICAgICAgICAocmVzb3VyY2UgaW4gdXNlX3Jlc291cmNlcyBvciAiKiIgaW4gdXNlX3Jlc291cmNlcykKKyAgICBpZiBub3QgcmVzdWx0OgorICAgICAgICBfdW5hdmFpbFtyZXNvdXJjZV0gPSBOb25lCisgICAgcmV0dXJuIHJlc3VsdAorCitfdW5hdmFpbCA9IHt9CitkZWYgcmVxdWlyZXMocmVzb3VyY2UsIG1zZz1Ob25lKToKKyAgICAiIiJSYWlzZSBSZXNvdXJjZURlbmllZCBpZiB0aGUgc3BlY2lmaWVkIHJlc291cmNlIGlzIG5vdCBhdmFpbGFibGUuCisKKyAgICBJZiB0aGUgY2FsbGVyJ3MgbW9kdWxlIGlzIF9fbWFpbl9fIHRoZW4gYXV0b21hdGljYWxseSByZXR1cm4gVHJ1ZS4iIiIKKyAgICAjIHNlZSBpZiB0aGUgY2FsbGVyJ3MgbW9kdWxlIGlzIF9fbWFpbl9fIC0gaWYgc28sIHRyZWF0IGFzIGlmCisgICAgIyB0aGUgcmVzb3VyY2Ugd2FzIHNldAorICAgIGlmIHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2suZl9nbG9iYWxzLmdldCgiX19uYW1lX18iKSA9PSAiX19tYWluX18iOgorICAgICAgICByZXR1cm4KKyAgICBpZiBub3QgaXNfcmVzb3VyY2VfZW5hYmxlZChyZXNvdXJjZSk6CisgICAgICAgIGlmIG1zZyBpcyBOb25lOgorICAgICAgICAgICAgbXNnID0gIlVzZSBvZiB0aGUgYCVzJyByZXNvdXJjZSBub3QgZW5hYmxlZCIgJSByZXNvdXJjZQorICAgICAgICByYWlzZSBSZXNvdXJjZURlbmllZChtc2cpCisKK2RlZiBmaW5kX3BhY2thZ2VfbW9kdWxlcyhwYWNrYWdlLCBtYXNrKToKKyAgICBpbXBvcnQgZm5tYXRjaAorICAgIGlmIChoYXNhdHRyKHBhY2thZ2UsICJfX2xvYWRlcl9fIikgYW5kCisgICAgICAgICAgICBoYXNhdHRyKHBhY2thZ2UuX19sb2FkZXJfXywgJ19maWxlcycpKToKKyAgICAgICAgcGF0aCA9IHBhY2thZ2UuX19uYW1lX18ucmVwbGFjZSgiLiIsIG9zLnBhdGguc2VwKQorICAgICAgICBtYXNrID0gb3MucGF0aC5qb2luKHBhdGgsIG1hc2spCisgICAgICAgIGZvciBmbm0gaW4gcGFja2FnZS5fX2xvYWRlcl9fLl9maWxlcy5pdGVya2V5cygpOgorICAgICAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoY2FzZShmbm0sIG1hc2spOgorICAgICAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguc3BsaXRleHQoZm5tKVswXS5yZXBsYWNlKG9zLnBhdGguc2VwLCAiLiIpCisgICAgZWxzZToKKyAgICAgICAgcGF0aCA9IHBhY2thZ2UuX19wYXRoX19bMF0KKyAgICAgICAgZm9yIGZubSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoY2FzZShmbm0sIG1hc2spOgorICAgICAgICAgICAgICAgIHlpZWxkICIlcy4lcyIgJSAocGFja2FnZS5fX25hbWVfXywgb3MucGF0aC5zcGxpdGV4dChmbm0pWzBdKQorCitkZWYgZ2V0X3Rlc3RzKHBhY2thZ2UsIG1hc2ssIHZlcmJvc2l0eSwgZXhjbHVkZT0oKSk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBza2lwcGVkIHRlc3QgbW9kdWxlcywgYW5kIGEgbGlzdCBvZiB0ZXN0IGNhc2VzLiIiIgorICAgIHRlc3RzID0gW10KKyAgICBza2lwcGVkID0gW10KKyAgICBmb3IgbW9kbmFtZSBpbiBmaW5kX3BhY2thZ2VfbW9kdWxlcyhwYWNrYWdlLCBtYXNrKToKKyAgICAgICAgaWYgbW9kbmFtZS5zcGxpdCgiLiIpWy0xXSBpbiBleGNsdWRlOgorICAgICAgICAgICAgc2tpcHBlZC5hcHBlbmQobW9kbmFtZSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2l0eSA+IDE6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlNraXBwZWQgJXM6IGV4Y2x1ZGVkIiAlIG1vZG5hbWUKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18obW9kbmFtZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCisgICAgICAgIGV4Y2VwdCAoUmVzb3VyY2VEZW5pZWQsIHVuaXR0ZXN0LlNraXBUZXN0KSBhcyBkZXRhaWw6CisgICAgICAgICAgICBza2lwcGVkLmFwcGVuZChtb2RuYW1lKQorICAgICAgICAgICAgaWYgdmVyYm9zaXR5ID4gMToKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiU2tpcHBlZCAlczogJXMiICUgKG1vZG5hbWUsIGRldGFpbCkKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBuYW1lIGluIGRpcihtb2QpOgorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJfIik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG8gPSBnZXRhdHRyKG1vZCwgbmFtZSkKKyAgICAgICAgICAgIGlmIHR5cGUobykgaXMgdHlwZSh1bml0dGVzdC5UZXN0Q2FzZSkgYW5kIGlzc3ViY2xhc3MobywgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIHRlc3RzLmFwcGVuZChvKQorICAgIHJldHVybiBza2lwcGVkLCB0ZXN0cworCitkZWYgdXNhZ2UoKToKKyAgICBwcmludCBfX2RvY19fCisgICAgcmV0dXJuIDEKKworZGVmIHRlc3Rfd2l0aF9yZWZjb3VudHMocnVubmVyLCB2ZXJib3NpdHksIHRlc3RjYXNlKToKKyAgICAiIiJSdW4gdGVzdGNhc2Ugc2V2ZXJhbCB0aW1lcywgdHJhY2tpbmcgcmVmZXJlbmNlIGNvdW50cy4iIiIKKyAgICBpbXBvcnQgZ2MKKyAgICBpbXBvcnQgY3R5cGVzCisgICAgcHRjID0gY3R5cGVzLl9wb2ludGVyX3R5cGVfY2FjaGUuY29weSgpCisgICAgY2ZjID0gY3R5cGVzLl9jX2Z1bmN0eXBlX2NhY2hlLmNvcHkoKQorICAgIHdmYyA9IGN0eXBlcy5fd2luX2Z1bmN0eXBlX2NhY2hlLmNvcHkoKQorCisgICAgIyB3aGVuIHNlYXJjaGluZyBmb3IgcmVmY291bnQgbGVha3MsIHdlIGhhdmUgdG8gbWFudWFsbHkgcmVzZXQgYW55CisgICAgIyBjYWNoZXMgdGhhdCBjdHlwZXMgaGFzLgorICAgIGRlZiBjbGVhbnVwKCk6CisgICAgICAgIGN0eXBlcy5fcG9pbnRlcl90eXBlX2NhY2hlID0gcHRjLmNvcHkoKQorICAgICAgICBjdHlwZXMuX2NfZnVuY3R5cGVfY2FjaGUgPSBjZmMuY29weSgpCisgICAgICAgIGN0eXBlcy5fd2luX2Z1bmN0eXBlX2NhY2hlID0gd2ZjLmNvcHkoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgIHRlc3QgPSB1bml0dGVzdC5tYWtlU3VpdGUodGVzdGNhc2UpCisgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBydW5uZXIucnVuKHRlc3QpCisgICAgICAgIGNsZWFudXAoKQorICAgIENPVU5UID0gNQorICAgIHJlZmNvdW50cyA9IFtOb25lXSAqIENPVU5UCisgICAgZm9yIGkgaW4gcmFuZ2UoQ09VTlQpOgorICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcnVubmVyLnJ1bih0ZXN0KQorICAgICAgICBjbGVhbnVwKCkKKyAgICAgICAgcmVmY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKSAtIHJjCisgICAgaWYgZmlsdGVyKE5vbmUsIHJlZmNvdW50cyk6CisgICAgICAgIHByaW50ICIlcyBsZWFrczpcblx0IiAlIHRlc3RjYXNlLCByZWZjb3VudHMKKyAgICBlbGlmIHZlcmJvc2l0eToKKyAgICAgICAgcHJpbnQgIiVzOiBvay4iICUgdGVzdGNhc2UKKworY2xhc3MgVGVzdFJ1bm5lcih1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcik6CisgICAgZGVmIHJ1bihzZWxmLCB0ZXN0LCBza2lwcGVkKToKKyAgICAgICAgIlJ1biB0aGUgZ2l2ZW4gdGVzdCBjYXNlIG9yIHRlc3Qgc3VpdGUuIgorICAgICAgICAjIFNhbWUgYXMgdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIucnVuLCBleGNlcHQgdGhhdCBpdCByZXBvcnRzCisgICAgICAgICMgc2tpcHBlZCB0ZXN0cy4KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fbWFrZVJlc3VsdCgpCisgICAgICAgIHN0YXJ0VGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHRlc3QocmVzdWx0KQorICAgICAgICBzdG9wVGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHRpbWVUYWtlbiA9IHN0b3BUaW1lIC0gc3RhcnRUaW1lCisgICAgICAgIHJlc3VsdC5wcmludEVycm9ycygpCisgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4ocmVzdWx0LnNlcGFyYXRvcjIpCisgICAgICAgIHJ1biA9IHJlc3VsdC50ZXN0c1J1bgorICAgICAgICBpZiBfdW5hdmFpbDogI3NraXBwZWQ6CisgICAgICAgICAgICByZXF1ZXN0ZWQgPSBfdW5hdmFpbC5rZXlzKCkKKyAgICAgICAgICAgIHJlcXVlc3RlZC5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIlJhbiAlZCB0ZXN0JXMgaW4gJS4zZnMgKCVzIG1vZHVsZSVzIHNraXBwZWQpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChydW4sIHJ1biAhPSAxIGFuZCAicyIgb3IgIiIsIHRpbWVUYWtlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihza2lwcGVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihza2lwcGVkKSAhPSAxIGFuZCAicyIgb3IgIiIpKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiVW5hdmFpbGFibGUgcmVzb3VyY2VzOiAlcyIgJSAiLCAiLmpvaW4ocmVxdWVzdGVkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIlJhbiAlZCB0ZXN0JXMgaW4gJS4zZnMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1biwgcnVuICE9IDEgYW5kICJzIiBvciAiIiwgdGltZVRha2VuKSkKKyAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigpCisgICAgICAgIGlmIG5vdCByZXN1bHQud2FzU3VjY2Vzc2Z1bCgpOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIkZBSUxFRCAoIikKKyAgICAgICAgICAgIGZhaWxlZCwgZXJyb3JlZCA9IG1hcChsZW4sIChyZXN1bHQuZmFpbHVyZXMsIHJlc3VsdC5lcnJvcnMpKQorICAgICAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCJmYWlsdXJlcz0lZCIgJSBmYWlsZWQpCisgICAgICAgICAgICBpZiBlcnJvcmVkOgorICAgICAgICAgICAgICAgIGlmIGZhaWxlZDogc2VsZi5zdHJlYW0ud3JpdGUoIiwgIikKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiZXJyb3JzPSVkIiAlIGVycm9yZWQpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCIpIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIk9LIikKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2RlZiBtYWluKCpwYWNrYWdlcyk6CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJycXZ1Ong6IikKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yOgorICAgICAgICByZXR1cm4gdXNhZ2UoKQorCisgICAgdmVyYm9zaXR5ID0gMQorICAgIHNlYXJjaF9sZWFrcyA9IEZhbHNlCisgICAgZXhjbHVkZSA9IFtdCisgICAgZm9yIGZsYWcsIHZhbHVlIGluIG9wdHM6CisgICAgICAgIGlmIGZsYWcgPT0gIi1xIjoKKyAgICAgICAgICAgIHZlcmJvc2l0eSAtPSAxCisgICAgICAgIGVsaWYgZmxhZyA9PSAiLXYiOgorICAgICAgICAgICAgdmVyYm9zaXR5ICs9IDEKKyAgICAgICAgZWxpZiBmbGFnID09ICItciI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLmdldHRvdGFscmVmY291bnQKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiLXIgZmxhZyByZXF1aXJlcyBQeXRob24gZGVidWcgYnVpbGQiCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBzZWFyY2hfbGVha3MgPSBUcnVlCisgICAgICAgIGVsaWYgZmxhZyA9PSAiLXUiOgorICAgICAgICAgICAgdXNlX3Jlc291cmNlcy5leHRlbmQodmFsdWUuc3BsaXQoIiwiKSkKKyAgICAgICAgZWxpZiBmbGFnID09ICIteCI6CisgICAgICAgICAgICBleGNsdWRlLmV4dGVuZCh2YWx1ZS5zcGxpdCgiLCIpKQorCisgICAgbWFzayA9ICJ0ZXN0XyoucHkiCisgICAgaWYgYXJnczoKKyAgICAgICAgbWFzayA9IGFyZ3NbMF0KKworICAgIGZvciBwYWNrYWdlIGluIHBhY2thZ2VzOgorICAgICAgICBydW5fdGVzdHMocGFja2FnZSwgbWFzaywgdmVyYm9zaXR5LCBzZWFyY2hfbGVha3MsIGV4Y2x1ZGUpCisKKworZGVmIHJ1bl90ZXN0cyhwYWNrYWdlLCBtYXNrLCB2ZXJib3NpdHksIHNlYXJjaF9sZWFrcywgZXhjbHVkZSk6CisgICAgc2tpcHBlZCwgdGVzdGNhc2VzID0gZ2V0X3Rlc3RzKHBhY2thZ2UsIG1hc2ssIHZlcmJvc2l0eSwgZXhjbHVkZSkKKyAgICBydW5uZXIgPSBUZXN0UnVubmVyKHZlcmJvc2l0eT12ZXJib3NpdHkpCisKKyAgICBzdWl0ZXMgPSBbdW5pdHRlc3QubWFrZVN1aXRlKG8pIGZvciBvIGluIHRlc3RjYXNlc10KKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShzdWl0ZXMpCisgICAgcmVzdWx0ID0gcnVubmVyLnJ1bihzdWl0ZSwgc2tpcHBlZCkKKworICAgIGlmIHNlYXJjaF9sZWFrczoKKyAgICAgICAgIyBodW50IGZvciByZWZjb3VudCBsZWFrcworICAgICAgICBydW5uZXIgPSBCYXNpY1Rlc3RSdW5uZXIoKQorICAgICAgICBmb3IgdCBpbiB0ZXN0Y2FzZXM6CisgICAgICAgICAgICB0ZXN0X3dpdGhfcmVmY291bnRzKHJ1bm5lciwgdmVyYm9zaXR5LCB0KQorCisgICAgcmV0dXJuIGJvb2wocmVzdWx0LmVycm9ycykKKworY2xhc3MgQmFzaWNUZXN0UnVubmVyOgorICAgIGRlZiBydW4oc2VsZiwgdGVzdCk6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmIxNTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmIxNTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9ydW50ZXN0cy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzMWZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHkKQEAgLTAsMCArMSwxOSBAQAorIiIiVXNhZ2U6IHJ1bnRlc3RzLnB5IFstcV0gWy1yXSBbLXZdIFstdSByZXNvdXJjZXNdIFttYXNrXQorCitSdW4gYWxsIHRlc3RzIGZvdW5kIGluIHRoaXMgZGlyZWN0b3J5LCBhbmQgcHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSByZXN1bHRzLgorQ29tbWFuZCBsaW5lIGZsYWdzOgorICAtcSAgICAgcXVpZXQgbW9kZTogZG9uJ3QgcHJudCBhbnl0aGluZyB3aGlsZSB0aGUgdGVzdHMgYXJlIHJ1bm5pbmcKKyAgLXIgICAgIHJ1biB0ZXN0cyByZXBlYXRlZGx5LCBsb29rIGZvciByZWZjb3VudCBsZWFrcworICAtdTxyZXNvdXJjZXM+CisgICAgICAgICBBZGQgcmVzb3VyY2VzIHRvIHRoZSBsaXRzIG9mIGFsbG93ZWQgcmVzb3VyY2VzLiAnKicgYWxsb3dzIGFsbAorICAgICAgICAgcmVzb3VyY2VzLgorICAtdiAgICAgdmVyYm9zZSBtb2RlOiBwcmludCB0aGUgdGVzdCBjdXJyZW50bHkgZXhlY3V0ZWQKKyAgLXg8dGVzdDFbLHRlc3QyLi4uXT4KKyAgICAgICAgIEV4Y2x1ZGUgc3BlY2lmaWVkIHRlc3RzLgorICBtYXNrICAgbWFzayB0byBzZWxlY3QgZmlsZW5hbWVzIGNvbnRhaW5pbmcgdGVzdGNhc2VzLCB3aWxkY2FyZHMgYWxsb3dlZAorIiIiCitpbXBvcnQgc3lzCitpbXBvcnQgY3R5cGVzLnRlc3QKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChjdHlwZXMudGVzdC5tYWluKGN0eXBlcy50ZXN0KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9ydW50ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiNzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC9ydW50ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiNzY1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvcnVudGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5MmI1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5CkBAIC0wLDAgKzEsNjAgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgQW5vblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYW5vbihzZWxmKToKKyAgICAgICAgY2xhc3MgQU5PTihVbmlvbik6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJfIiwgQU5PTiksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2ludCldCisgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuYi5vZmZzZXQsIHNpemVvZihjX2ludCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBTk9OLmEub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEFOT04uYi5vZmZzZXQsIDApCisKKyAgICBkZWYgdGVzdF9hbm9uX25vbnNlcShzZWxmKToKKyAgICAgICAgIyBUeXBlRXJyb3I6IF9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sICJfYW5vbnltb3VzXyI6IDQyfSkpCisKKyAgICBkZWYgdGVzdF9hbm9uX25vbm1lbWJlcihzZWxmKToKKyAgICAgICAgIyBBdHRyaWJ1dGVFcnJvcjogdHlwZSBvYmplY3QgJ05hbWUnIGhhcyBubyBhdHRyaWJ1dGUgJ3gnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB0eXBlKFN0cnVjdHVyZSkoIk5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cnVjdHVyZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJfZmllbGRzXyI6IFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfYW5vbnltb3VzXyI6IFsieCJdfSkpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWQoc2VsZik6CisgICAgICAgIGNsYXNzIEFOT05fUyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpXQorCisgICAgICAgIGNsYXNzIEFOT05fVShVbmlvbik6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIl8iLCBBTk9OX1MpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpXQorICAgICAgICAgICAgX2Fub255bW91c18gPSBbIl8iXQorCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXyIsIEFOT05fVSksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2ludCldCisgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuYS5vZmZzZXQsIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWS5iLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkueS5vZmZzZXQsIHNpemVvZihjX2ludCkgKiAyKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMzkzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMzkzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc4NjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHkKQEAgLTAsMCArMSw2NCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBiaW5hc2NpaSBpbXBvcnQgaGV4bGlmeQoraW1wb3J0IHJlCisKK2RlZiBkdW1wKG9iaik6CisgICAgIyBoZWxwZXIgZnVuY3Rpb24gdG8gZHVtcCBtZW1vcnkgY29udGVudHMgaW4gaGV4LCB3aXRoIGEgaHlwaGVuCisgICAgIyBiZXR3ZWVuIHRoZSBieXRlcy4KKyAgICBoID0gaGV4bGlmeShtZW1vcnl2aWV3KG9iaikpCisgICAgcmV0dXJuIHJlLnN1YihyIiguLikiLCByIlwxLSIsIGgpWzotMV0KKworCitjbGFzcyBWYWx1ZShTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygidmFsIiwgY19ieXRlKV0KKworY2xhc3MgQ29udGFpbmVyKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJwdmFsdWVzIiwgUE9JTlRFUihWYWx1ZSkpXQorCitjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgYW4gYXJyYXkgb2YgNCB2YWx1ZXMKKyAgICAgICAgdmFsX2FycmF5ID0gKFZhbHVlICogNCkoKQorCisgICAgICAgICMgY3JlYXRlIGEgY29udGFpbmVyLCB3aGljaCBob2xkcyBhIHBvaW50ZXIgdG8gdGhlIHB2YWx1ZXMgYXJyYXkuCisgICAgICAgIGMgPSBDb250YWluZXIoKQorICAgICAgICBjLnB2YWx1ZXMgPSB2YWxfYXJyYXkKKworICAgICAgICAjIG1lbW9yeSBjb250YWlucyA0IE5VTCBieXRlcyBub3csIHRoYXQncyBjb3JyZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjAwLTAwLTAwLTAwIiwgZHVtcCh2YWxfYXJyYXkpKQorCisgICAgICAgICMgc2V0IHRoZSB2YWx1ZXMgb2YgdGhlIGFycmF5IHRocm91Z2ggdGhlIHBvaW50ZXI6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgYy5wdmFsdWVzW2ldLnZhbCA9IGkgKyAxCisKKyAgICAgICAgdmFsdWVzID0gW2MucHZhbHVlc1tpXS52YWwgZm9yIGkgaW4gcmFuZ2UoNCldCisKKyAgICAgICAgIyBUaGVzZSBhcmUgdGhlIGV4cGVjdGVkIHJlc3VsdHM6IGhlcmUgcyB0aGUgYnVnIQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgKHZhbHVlcywgZHVtcCh2YWxfYXJyYXkpKSwKKyAgICAgICAgICAgIChbMSwgMiwgMywgNF0sICIwMS0wMi0wMy0wNCIpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisKKyAgICAgICAgdmFsX2FycmF5ID0gKFZhbHVlICogNCkoKQorCisgICAgICAgICMgbWVtb3J5IGNvbnRhaW5zIDQgTlVMIGJ5dGVzIG5vdywgdGhhdCdzIGNvcnJlY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMDAtMDAtMDAtMDAiLCBkdW1wKHZhbF9hcnJheSkpCisKKyAgICAgICAgcHRyID0gY2FzdCh2YWxfYXJyYXksIFBPSU5URVIoVmFsdWUpKQorICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgICAgIHB0cltpXS52YWwgPSBpICsgMQorCisgICAgICAgIHZhbHVlcyA9IFtwdHJbaV0udmFsIGZvciBpIGluIHJhbmdlKDQpXQorCisgICAgICAgICMgVGhlc2UgYXJlIHRoZSBleHBlY3RlZCByZXN1bHRzOiBoZXJlIHMgdGhlIGJ1ZyEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICh2YWx1ZXMsIGR1bXAodmFsX2FycmF5KSksCisgICAgICAgICAgICAoWzEsIDIsIDMsIDRdLCAiMDEtMDItMDMtMDQiKQorICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjYWNjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheV9pbl9wb2ludGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJjYWNjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheV9pbl9wb2ludGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjVmOGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weQpAQCAtMCwwICsxLDEzNCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitmb3JtYXRzID0gImJCaEhpSWxMcVFmZCIKKworZm9ybWF0cyA9IGNfYnl0ZSwgY191Ynl0ZSwgY19zaG9ydCwgY191c2hvcnQsIGNfaW50LCBjX3VpbnQsIFwKKyAgICAgICAgICBjX2xvbmcsIGNfdWxvbmdsb25nLCBjX2Zsb2F0LCBjX2RvdWJsZSwgY19sb25nZG91YmxlCisKK2NsYXNzIEFycmF5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgY2xhc3NlcyBob2xkaW5nIHNpbXBsZSBudW1lcmljIHR5cGVzLCBhbmQgY2hlY2sKKyAgICAgICAgIyB2YXJpb3VzIHByb3BlcnRpZXMuCisKKyAgICAgICAgaW5pdCA9IHJhbmdlKDE1LCAyNSkKKworICAgICAgICBmb3IgZm10IGluIGZvcm1hdHM6CisgICAgICAgICAgICBhbGVuID0gbGVuKGluaXQpCisgICAgICAgICAgICBpbnRfYXJyYXkgPSBBUlJBWShmbXQsIGFsZW4pCisKKyAgICAgICAgICAgIGlhID0gaW50X2FycmF5KCppbml0KQorICAgICAgICAgICAgIyBsZW5ndGggb2YgaW5zdGFuY2Ugb2s/CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpYSksIGFsZW4pCisKKyAgICAgICAgICAgICMgc2xvdCB2YWx1ZXMgb2s/CisgICAgICAgICAgICB2YWx1ZXMgPSBbaWFbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKGluaXQpKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBpbml0KQorCisgICAgICAgICAgICAjIGNoYW5nZSB0aGUgaXRlbXMKKyAgICAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IHNldGl0ZW0KKyAgICAgICAgICAgIG5ld192YWx1ZXMgPSByYW5nZSg0MiwgNDIrYWxlbikKKyAgICAgICAgICAgIFtzZXRpdGVtKGlhLCBuLCBuZXdfdmFsdWVzW25dKSBmb3IgbiBpbiByYW5nZShhbGVuKV0KKyAgICAgICAgICAgIHZhbHVlcyA9IFtpYVtpXSBmb3IgaSBpbiByYW5nZShsZW4oaW5pdCkpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIG5ld192YWx1ZXMpCisKKyAgICAgICAgICAgICMgYXJlIHRoZSBpdGVtcyBpbml0aWFsaXplZCB0byAwPworICAgICAgICAgICAgaWEgPSBpbnRfYXJyYXkoKQorICAgICAgICAgICAgdmFsdWVzID0gW2lhW2ldIGZvciBpIGluIHJhbmdlKGxlbihpbml0KSldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzBdICogbGVuKGluaXQpKQorCisgICAgICAgICAgICAjIFRvbyBtYW55IGluaXRpYWxpemVycyBzaG91bGQgYmUgY2F1Z2h0CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBpbnRfYXJyYXksICpyYW5nZShhbGVuKjIpKQorCisgICAgICAgIENoYXJBcnJheSA9IEFSUkFZKGNfY2hhciwgMykKKworICAgICAgICBjYSA9IENoYXJBcnJheSgiYSIsICJiIiwgImMiKQorCisgICAgICAgICMgU2hvdWxkIHRoaXMgd29yaz8gSXQgZG9lc24ndDoKKyAgICAgICAgIyBDaGFyQXJyYXkoImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgQ2hhckFycmF5LCAiYWJjIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhWzBdLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FbMV0sICJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVsyXSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhWy0zXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhWy0yXSwgImIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhWy0xXSwgImMiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNhKSwgMykKKworICAgICAgICAjIHNsaWNpbmcgaXMgbm93IHN1cHBvcnRlZCwgYnV0IG5vdCBleHRlbmRlZCBzbGljaW5nICgzLWFyZ3VtZW50KSEKKyAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgZ2V0c2xpY2UsIGRlbGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRzbGljZSwgY2EsIDAsIDEsIC0xKQorCisgICAgICAgICMgY2Fubm90IGRlbGV0ZSBpdGVtcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGl0ZW0sIGNhLCAwKQorCisgICAgZGVmIHRlc3RfbnVtZXJpY19hcnJheXMoc2VsZik6CisKKyAgICAgICAgYWxlbiA9IDUKKworICAgICAgICBudW1hcnJheSA9IEFSUkFZKGNfaW50LCBhbGVuKQorCisgICAgICAgIG5hID0gbnVtYXJyYXkoKQorICAgICAgICB2YWx1ZXMgPSBbbmFbaV0gZm9yIGkgaW4gcmFuZ2UoYWxlbildCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMF0gKiBhbGVuKQorCisgICAgICAgIG5hID0gbnVtYXJyYXkoKltjX2ludCgpXSAqIGFsZW4pCisgICAgICAgIHZhbHVlcyA9IFtuYVtpXSBmb3IgaSBpbiByYW5nZShhbGVuKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIFswXSphbGVuKQorCisgICAgICAgIG5hID0gbnVtYXJyYXkoMSwgMiwgMywgNCwgNSkKKyAgICAgICAgdmFsdWVzID0gW2kgZm9yIGkgaW4gbmFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMSwgMiwgMywgNCwgNV0pCisKKyAgICAgICAgbmEgPSBudW1hcnJheSgqbWFwKGNfaW50LCAoMSwgMiwgMywgNCwgNSkpKQorICAgICAgICB2YWx1ZXMgPSBbaSBmb3IgaSBpbiBuYV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIFsxLCAyLCAzLCA0LCA1XSkKKworICAgIGRlZiB0ZXN0X2NsYXNzY2FjaGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgQVJSQVkoY19pbnQsIDMpIGlzIEFSUkFZKGNfaW50LCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEFSUkFZKGNfaW50LCAzKSBpcyBBUlJBWShjX2ludCwgMykpCisKKyAgICBkZWYgdGVzdF9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgICMgRmFpbGVkIHdpdGggMC45LjgsIHJlcG9ydGVkIGJ5IEpVcm5lcgorICAgICAgICBwID0gY3JlYXRlX3N0cmluZ19idWZmZXIoImZvbyIpCisgICAgICAgIHN6ID0gKGNfY2hhciAqIDMpLmZyb21fYWRkcmVzcyhhZGRyZXNzb2YocCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOl0sICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6XSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjotMV0sICJvb2YiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6M10sICJmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzelsxOjQ6Ml0sICJvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzei52YWx1ZSwgImZvbyIpCisKKyAgICB0cnk6CisgICAgICAgIGNyZWF0ZV91bmljb2RlX2J1ZmZlcgorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF9mcm9tX2FkZHJlc3NXKHNlbGYpOgorICAgICAgICAgICAgcCA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigiZm9vIikKKyAgICAgICAgICAgIHN6ID0gKGNfd2NoYXIgKiAzKS5mcm9tX2FkZHJlc3MoYWRkcmVzc29mKHApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6XSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6XSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6LTFdLCAib29mIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjozXSwgImYiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzelsxOjQ6Ml0sICJvIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3oudmFsdWUsICJmb28iKQorCisgICAgZGVmIHRlc3RfY2FjaGUoc2VsZik6CisgICAgICAgICMgQXJyYXkgdHlwZXMgYXJlIGNhY2hlZCBpbnRlcm5hbGx5IGluIHRoZSBfY3R5cGVzIGV4dGVuc2lvbiwKKyAgICAgICAgIyBpbiBhIFdlYWtWYWx1ZURpY3Rpb25hcnkuICBNYWtlIHN1cmUgdGhlIGFycmF5IHR5cGUgaXMKKyAgICAgICAgIyByZW1vdmVkIGZyb20gdGhlIGNhY2hlIHdoZW4gdGhlIGl0ZW10eXBlIGdvZXMgYXdheS4gIFRoaXMKKyAgICAgICAgIyB0ZXN0IHdpbGwgbm90IGZhaWwsIGJ1dCB3aWxsIHNob3cgYSBsZWFrIGluIHRoZSB0ZXN0c3VpdGUuCisKKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgdHlwZToKKyAgICAgICAgY2xhc3MgbXlfaW50KGNfaW50KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgYXJyYXkgdHlwZSBiYXNlZCBvbiBpdDoKKyAgICAgICAgdDEgPSBteV9pbnQgKiAxCisgICAgICAgIHQyID0gbXlfaW50ICogMQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgaXMgdDIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDY1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NDY1YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTUzZTY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weQpAQCAtMCwwICsxLDIzMyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IF9jdHlwZXNfdGVzdAoraW1wb3J0IHN5cworCitkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKwordHJ5OgorICAgIENBTExCQUNLX0ZVTkNUWVBFID0gV0lORlVOQ1RZUEUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBmYWtlIHRvIGVuYWJsZSB0aGlzIHRlc3Qgb24gTGludXgKKyAgICBDQUxMQkFDS19GVU5DVFlQRSA9IENGVU5DVFlQRQorCitjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpXQorCitjbGFzcyBCYXNpY1dyYXBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHdyYXAoc2VsZiwgcGFyYW0pOgorICAgICAgICByZXR1cm4gcGFyYW0KKworICAgIGRlZiB0ZXN0X3djaGFyX3Bhcm0oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNfd2NoYXIKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19pX2JoaWxmZAorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY193Y2hhciwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKDEpLCBzZWxmLndyYXAodSJ4IiksIHNlbGYud3JhcCgzKSwgc2VsZi53cmFwKDQpLCBzZWxmLndyYXAoNS4wKSwgc2VsZi53cmFwKDYuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAxMzkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlc3VsdCksIGludCkKKworICAgIGRlZiB0ZXN0X3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZi5yZXN0eXBlID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtQT0lOVEVSKGNfaW50KV0KKworICAgICAgICAjIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgdmFsdWUgY19pbnQoNDIpIHBhc3NlZCB0byB0aGUKKyAgICAgICAgIyBmdW5jdGlvbiBpcyBzdGlsbCBhbGl2ZSB3aGlsZSB0aGUgcG9pbnRlciAodGhlIHJlc3VsdCkgaXMKKyAgICAgICAgIyB1c2VkLgorCisgICAgICAgIHYgPSBjX2ludCg0MikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvaW50ZXIodikuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcChwb2ludGVyKHYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIFBPSU5URVIoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgNDIpCisKKyAgICAgICAgIyBUaGlzIG9uIHdvcmtzLi4uCisgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKHBvaW50ZXIodikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgdi52YWx1ZSkKKworICAgICAgICBwID0gcG9pbnRlcihjX2ludCg5OSkpCisgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKHApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgOTkpCisKKyAgICBkZWYgdGVzdF9zaG9ydHMoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKworICAgICAgICBhcmdzID0gW10KKyAgICAgICAgZXhwZWN0ZWQgPSBbMjYyMTQ0LCAxMzEwNzIsIDY1NTM2LCAzMjc2OCwgMTYzODQsIDgxOTIsIDQwOTYsIDIwNDgsCisgICAgICAgICAgICAgICAgICAgIDEwMjQsIDUxMiwgMjU2LCAxMjgsIDY0LCAzMiwgMTYsIDgsIDQsIDIsIDFdCisKKyAgICAgICAgZGVmIGNhbGxiYWNrKHYpOgorICAgICAgICAgICAgYXJncy5hcHBlbmQodikKKyAgICAgICAgICAgIHJldHVybiB2CisKKyAgICAgICAgQ2FsbEJhY2sgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KQorCisgICAgICAgIGNiID0gQ2FsbEJhY2soY2FsbGJhY2spCisgICAgICAgIGYoc2VsZi53cmFwKDIqKjE4KSwgc2VsZi53cmFwKGNiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBleHBlY3RlZCkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrcyhzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfaV9pZgorICAgICAgICBmLnJlc3R5cGUgPSBjX2ludAorICAgICAgICBmLmFyZ3R5cGVzID0gTm9uZQorCisgICAgICAgIE15Q2FsbGJhY2sgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CisgICAgICAgICAgICAjcHJpbnQgImNhbGxlZCBiYWNrIHdpdGgiLCB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorCisgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMTgpCisKKyAgICAgICAgIyB0ZXN0IHdpdGggcHJvdG90eXBlCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19pbnQsIE15Q2FsbGJhY2tdCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKworICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgtMTApLCBzZWxmLndyYXAoY2IpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMTgpCisKKyAgICAgICAgQW5vdGhlckNhbGxiYWNrID0gQ0FMTEJBQ0tfRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50KQorCisgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgcHJvdG90eXBlIHdvcmtzOiB3ZSBjYWxsIGYgd2l0aCB3cm9uZworICAgICAgICAjIGFyZ3VtZW50IHR5cGVzCisgICAgICAgIGNiID0gQW5vdGhlckNhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmLCBzZWxmLndyYXAoLTEwKSwgc2VsZi53cmFwKGNiKSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrc18yKHNlbGYpOgorICAgICAgICAjIENhbiBhbHNvIHVzZSBzaW1wbGUgZGF0YXR5cGVzIGFzIGFyZ3VtZW50IHR5cGUgc3BlY2lmaWVycworICAgICAgICAjIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisgICAgICAgICMgSW4gdGhpcyBjYXNlIHRoZSBjYWxsIHJlY2VpdmVzIGFuIGluc3RhbmNlIG9mIHRoYXQgdHlwZQorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19pX2lmCisgICAgICAgIGYucmVzdHlwZSA9IGNfaW50CisKKyAgICAgICAgTXlDYWxsYmFjayA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpCisKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2ludCwgTXlDYWxsYmFja10KKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGludCkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKyAgICAgICAgcmVzdWx0ID0gZihzZWxmLndyYXAoLTEwKSwgc2VsZi53cmFwKGNiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKKworICAgIGRlZiB0ZXN0X2xvbmdsb25nX2NhbGxiYWNrcyhzZWxmKToKKworICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19xX3FmCisgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKKworICAgICAgICBNeUNhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfbG9uZ2xvbmcsIGNfbG9uZ2xvbmcpCisKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2xvbmdsb25nLCBNeUNhbGxiYWNrXQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZykpKQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlICYgMHg3RkZGRkZGRgorCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzNTc3NjI1NTg3LCBpbnQoZihzZWxmLndyYXAoMTAwMDAwMDAwMDAwMCksIHNlbGYud3JhcChjYikpKSkKKworICAgIGRlZiB0ZXN0X2J5dmFsKHNlbGYpOgorICAgICAgICAjIHdpdGhvdXQgcHJvdG90eXBlCisgICAgICAgIHB0aW4gPSBQT0lOVCgxLCAyKQorICAgICAgICBwdG91dCA9IFBPSU5UKCkKKyAgICAgICAgIyBFWFBPUlQgaW50IF90ZXN0ZnVuY19ieXZhbChwb2ludCBpbiwgcG9pbnQgKnBvdXQpCisgICAgICAgIHJlc3VsdCA9IGRsbC5fdGVzdGZ1bmNfYnl2YWwocHRpbiwgYnlyZWYocHRvdXQpKQorICAgICAgICBnb3QgPSByZXN1bHQsIHB0b3V0LngsIHB0b3V0LnkKKyAgICAgICAgZXhwZWN0ZWQgPSAzLCAxLCAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgICAgICAjIHdpdGggcHJvdG90eXBlCisgICAgICAgIHB0aW4gPSBQT0lOVCgxMDEsIDEwMikKKyAgICAgICAgcHRvdXQgPSBQT0lOVCgpCisgICAgICAgIGRsbC5fdGVzdGZ1bmNfYnl2YWwuYXJndHlwZXMgPSAoUE9JTlQsIFBPSU5URVIoUE9JTlQpKQorICAgICAgICBkbGwuX3Rlc3RmdW5jX2J5dmFsLnJlc3R5cGUgPSBjX2ludAorICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHNlbGYud3JhcChwdGluKSwgYnlyZWYocHRvdXQpKQorICAgICAgICBnb3QgPSByZXN1bHQsIHB0b3V0LngsIHB0b3V0LnkKKyAgICAgICAgZXhwZWN0ZWQgPSAyMDMsIDEwMSwgMTAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fMkgoc2VsZik6CisgICAgICAgIGNsYXNzIFMySChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX3Nob3J0KV0KKyAgICAgICAgZGxsLnJldF8yaF9mdW5jLnJlc3R5cGUgPSBTMkgKKyAgICAgICAgZGxsLnJldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KKyAgICAgICAgaW5wID0gUzJIKDk5LCA4OCkKKyAgICAgICAgczJoID0gZGxsLnJldF8yaF9mdW5jKHNlbGYud3JhcChpbnApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzMmgueCwgczJoLnkpLCAoOTkqMiwgODgqMykpCisKKyAgICAjIFRoaXMgaXMga25vd24gY2RlY2wgaW5jb21wYXRpYmlsaXR5IGJldHdlZW4gR0NDCisgICAgIyBhbmQgTVNWQy4gSXQgaXMgYWRkcmVzc2VkIGluIEdDQyBpc3N1ZSAjMzY4MzQuCisgICAgIyBQeXRob24gbGliZmZpIGRldGVjdCBpdCBhbmQgY29tcGxhaW4uCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgc3lzLnZlcnNpb24uZmluZCgiR0NDIikgPj0gMCwgJ1hGQUlMIEdDQyhtaW5ndyknKQorICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fOEgoc2VsZik6CisgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJmIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJnIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgY19pbnQpXQorICAgICAgICBkbGwucmV0XzhpX2Z1bmMucmVzdHlwZSA9IFM4SQorICAgICAgICBkbGwucmV0XzhpX2Z1bmMuYXJndHlwZXMgPSBbUzhJXQorICAgICAgICBpbnAgPSBTOEkoOSwgOCwgNywgNiwgNSwgNCwgMywgMikKKyAgICAgICAgczhpID0gZGxsLnJldF84aV9mdW5jKHNlbGYud3JhcChpbnApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2FzX3BhcmFtKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19pbnQKKworICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYSA9IEEoKQorICAgICAgICBhLl9hc19wYXJhbWV0ZXJfID0gYQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBjX2ludC5mcm9tX3BhcmFtKGEpCisKKworI35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworY2xhc3MgQXNQYXJhbVdyYXBwZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyYW0pOgorICAgICAgICBzZWxmLl9hc19wYXJhbWV0ZXJfID0gcGFyYW0KKworY2xhc3MgQXNQYXJhbVdyYXBwZXJUZXN0Q2FzZShCYXNpY1dyYXBUZXN0Q2FzZSk6CisgICAgd3JhcCA9IEFzUGFyYW1XcmFwcGVyCisKKyN+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK2NsYXNzIEFzUGFyYW1Qcm9wZXJ0eVdyYXBwZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyYW0pOgorICAgICAgICBzZWxmLl9wYXJhbSA9IHBhcmFtCisKKyAgICBkZWYgZ2V0UGFyYW1ldGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGFyYW0KKyAgICBfYXNfcGFyYW1ldGVyXyA9IHByb3BlcnR5KGdldFBhcmFtZXRlcikKKworY2xhc3MgQXNQYXJhbVByb3BlcnR5V3JhcHBlclRlc3RDYXNlKEJhc2ljV3JhcFRlc3RDYXNlKToKKyAgICB3cmFwID0gQXNQYXJhbVByb3BlcnR5V3JhcHBlcgorCisjfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWM3MjUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWM3MjUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JjYzY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKQEAgLTAsMCArMSwyNjQgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworCitpbXBvcnQgY3R5cGVzCitpbXBvcnQgX2N0eXBlc190ZXN0CisKK2NsYXNzIEJJVFMoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIkEiLCBjX2ludCwgMSksCisgICAgICAgICAgICAgICAgKCJCIiwgY19pbnQsIDIpLAorICAgICAgICAgICAgICAgICgiQyIsIGNfaW50LCAzKSwKKyAgICAgICAgICAgICAgICAoIkQiLCBjX2ludCwgNCksCisgICAgICAgICAgICAgICAgKCJFIiwgY19pbnQsIDUpLAorICAgICAgICAgICAgICAgICgiRiIsIGNfaW50LCA2KSwKKyAgICAgICAgICAgICAgICAoIkciLCBjX2ludCwgNyksCisgICAgICAgICAgICAgICAgKCJIIiwgY19pbnQsIDgpLAorICAgICAgICAgICAgICAgICgiSSIsIGNfaW50LCA5KSwKKworICAgICAgICAgICAgICAgICgiTSIsIGNfc2hvcnQsIDEpLAorICAgICAgICAgICAgICAgICgiTiIsIGNfc2hvcnQsIDIpLAorICAgICAgICAgICAgICAgICgiTyIsIGNfc2hvcnQsIDMpLAorICAgICAgICAgICAgICAgICgiUCIsIGNfc2hvcnQsIDQpLAorICAgICAgICAgICAgICAgICgiUSIsIGNfc2hvcnQsIDUpLAorICAgICAgICAgICAgICAgICgiUiIsIGNfc2hvcnQsIDYpLAorICAgICAgICAgICAgICAgICgiUyIsIGNfc2hvcnQsIDcpXQorCitmdW5jID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLnVucGFja19iaXRmaWVsZHMKK2Z1bmMuYXJndHlwZXMgPSBQT0lOVEVSKEJJVFMpLCBjX2NoYXIKKworIyNmb3IgbiBpbiAiQUJDREVGR0hJTU5PUFFSUyI6CisjIyAgICBwcmludCBuLCBoZXgoZ2V0YXR0cihCSVRTLCBuKS5zaXplKSwgZ2V0YXR0cihCSVRTLCBuKS5vZmZzZXQKKworY2xhc3MgQ19UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDUxMik6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiAiQUJDREVGR0hJIjoKKyAgICAgICAgICAgICAgICBiID0gQklUUygpCisgICAgICAgICAgICAgICAgc2V0YXR0cihiLCBuYW1lLCBpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG5hbWUsIGksIGdldGF0dHIoYiwgbmFtZSkpLCAobmFtZSwgaSwgZnVuYyhieXJlZihiKSwgbmFtZSkpKQorCisgICAgZGVmIHRlc3Rfc2hvcnRzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gIk1OT1BRUlMiOgorICAgICAgICAgICAgICAgIGIgPSBCSVRTKCkKKyAgICAgICAgICAgICAgICBzZXRhdHRyKGIsIG5hbWUsIGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCisKK3NpZ25lZF9pbnRfdHlwZXMgPSAoY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nKQordW5zaWduZWRfaW50X3R5cGVzID0gKGNfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nKQoraW50X3R5cGVzID0gdW5zaWduZWRfaW50X3R5cGVzICsgc2lnbmVkX2ludF90eXBlcworCitjbGFzcyBCaXRGaWVsZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbG9uZ2xvbmcoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfbG9uZ2xvbmcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZywgNjIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19sb25nbG9uZywgMSldCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2xvbmdsb25nKSkKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmEsIHguYiwgeC5jID0gLTEsIDcsIC0xCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguYSwgeC5iLCB4LmMpLCAoLTEsIDcsIC0xKSkKKworICAgIGRlZiB0ZXN0X3Vsb25nbG9uZyhzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY191bG9uZ2xvbmcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY191bG9uZ2xvbmcsIDYyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfdWxvbmdsb25nLCAxKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfbG9uZ2xvbmcpKQorICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguYSwgeC5iLCB4LmMpLCAoMCwgMCwgMCkpCisgICAgICAgIHguYSwgeC5iLCB4LmMgPSA3LCA3LCA3CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguYSwgeC5iLCB4LmMpLCAoMSwgNywgMSkpCisKKyAgICBkZWYgdGVzdF9zaWduZWQoc2VsZik6CisgICAgICAgIGZvciBjX3R5cCBpbiBzaWduZWRfaW50X3R5cGVzOgorICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiZHVtbXkiLCBjX3R5cCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJhIiwgY190eXAsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdHlwLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3R5cCwgMSldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSoyKQorCisgICAgICAgICAgICB4ID0gWCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjX3R5cCwgeC5hLCB4LmIsIHguYyksIChjX3R5cCwgMCwgMCwgMCkpCisgICAgICAgICAgICB4LmEgPSAtMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIC0xLCAwLCAwKSkKKyAgICAgICAgICAgIHguYSwgeC5iID0gMCwgLTEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAtMSwgMCkpCisKKworICAgIGRlZiB0ZXN0X3Vuc2lnbmVkKHNlbGYpOgorICAgICAgICBmb3IgY190eXAgaW4gdW5zaWduZWRfaW50X3R5cGVzOgorICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdHlwLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3R5cCwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY190eXAsIDEpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisKKyAgICAgICAgICAgIHggPSBYKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKKyAgICAgICAgICAgIHguYSA9IC0xCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjX3R5cCwgeC5hLCB4LmIsIHguYyksIChjX3R5cCwgNywgMCwgMCkpCisgICAgICAgICAgICB4LmEsIHguYiA9IDAsIC0xCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjX3R5cCwgeC5hLCB4LmIsIHguYyksIChjX3R5cCwgMCwgNywgMCkpCisKKworICAgIGRlZiBmYWlsX2ZpZWxkcyhzZWxmLCAqZmllbGRzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2V4Y2VwdCh0eXBlKFN0cnVjdHVyZSksICJYIiwgKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJfZmllbGRzXyI6IGZpZWxkc30pCisKKyAgICBkZWYgdGVzdF9ub25pbnRfdHlwZXMoc2VsZik6CisgICAgICAgICMgYml0IGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgb24gbm9uLWludGVnZXIgdHlwZXMuCisgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY19jaGFyX3AsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgY19jaGFyX3AnKSkKKworICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfdm9pZF9wLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfdm9pZF9wJykpCisKKyAgICAgICAgaWYgY19pbnQgIT0gY19sb25nOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBQT0lOVEVSKGNfaW50KSwgMSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgTFBfY19pbnQnKSkKKworICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfY2hhciwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX2NoYXInKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjX3djaGFyCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIGNfd2NoYXIsIDEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfd2NoYXInKSkKKworICAgICAgICBjbGFzcyBEdW1teShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgRHVtbXksIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgRHVtbXknKSkKKworICAgIGRlZiB0ZXN0X3NpbmdsZV9iaXRmaWVsZF9zaXplKHNlbGYpOgorICAgICAgICBmb3IgY190eXAgaW4gaW50X3R5cGVzOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3R5cCwgLTEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCisKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCisKKyAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3R5cCwgMSldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSkKKworICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdHlwLCBzaXplb2YoY190eXApKjgpXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIHNpemVvZihjX3R5cCkqOCArIDEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCisKKyAgICBkZWYgdGVzdF9tdWx0aV9iaXRmaWVsZHNfc2l6ZShzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3Nob3J0KSkKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3Nob3J0LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYTEiLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfc2hvcnQsIDE0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfc2hvcnQsIDEpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfc2hvcnQpKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5hLm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmExLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfc2hvcnQsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19zaG9ydCwgMTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19zaG9ydCwgMTQpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfc2hvcnQpKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5hLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5jLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjIpCisKKworICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzLCAqKmt3KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZGV0YWlsOgorICAgICAgICAgICAgcmV0dXJuIGRldGFpbC5fX2NsYXNzX18sIHN0cihkZXRhaWwpCisKKyAgICBkZWYgdGVzdF9taXhlZF8xKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQsIDQpXQorICAgICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpKjIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKKworICAgIGRlZiB0ZXN0X21peGVkXzIoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCwgMzIpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfMyhzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdWJ5dGUsIDQpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfYnl0ZSkpCisKKyAgICBkZWYgdGVzdF9taXhlZF80KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3Nob3J0LCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfc2hvcnQsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19pbnQsIDI0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfc2hvcnQsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgY19zaG9ydCwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImYiLCBjX2ludCwgMjQpXQorICAgICAgICAjIE1TVkMgZG9lcyBOT1QgY29tYmluZSBjX3Nob3J0IGFuZCBjX2ludCBpbnRvIG9uZSBmaWVsZCwgR0NDCisgICAgICAgICMgZG9lcyAodW5sZXNzIEdDQyBpcyBydW4gd2l0aCAnLW1tcy1iaXRmaWVsZHMnIHdoaWNoCisgICAgICAgICMgcHJvZHVjZXMgY29kZSBjb21wYXRpYmxlIHdpdGggTVNWQykuCisgICAgICAgIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiA0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiAyKQorCisgICAgZGVmIHRlc3RfYW5vbl9iaXRmaWVsZHMoc2VsZik6CisgICAgICAgICMgYW5vbnltb3VzIGJpdC1maWVsZHMgZ2F2ZSBhIHN0cmFuZ2UgZXJyb3IgbWVzc2FnZQorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY191Ynl0ZSwgNCldCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiXyIsIFgpXQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihjdHlwZXMsICJjX3VpbnQzMiIpLCAiY19pbnQzMiBpcyByZXF1aXJlZCIpCisgICAgZGVmIHRlc3RfdWludDMyKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3VpbnQzMiwgMzIpXQorICAgICAgICB4ID0gWCgpCisgICAgICAgIHguYSA9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxMCkKKyAgICAgICAgeC5hID0gMHhGRENCQTk4NworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMHhGRENCQTk4NykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoY3R5cGVzLCAiY191aW50NjQiKSwgImNfaW50NjQgaXMgcmVxdWlyZWQiKQorICAgIGRlZiB0ZXN0X3VpbnQ2NChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY191aW50NjQsIDY0KV0KKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmEgPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMTApCisgICAgICAgIHguYSA9IDB4RkVEQ0JBOTg3NjU0MzIxMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMHhGRURDQkE5ODc2NTQzMjExKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDVmODY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDVmODY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk0NWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkKQEAgLTAsMCArMSw3NCBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBTdHJpbmdCdWZmZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6CisgICAgICAgIGIgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcigzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgMzIgKiBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgc3RyKQorCisgICAgICAgIGIgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcigiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQorCisgICAgZGVmIHRlc3RfYnVmZmVyX2ludGVyZmFjZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnl0ZWFycmF5KGNyZWF0ZV9zdHJpbmdfYnVmZmVyKDApKSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJ5dGVhcnJheShjcmVhdGVfc3RyaW5nX2J1ZmZlcigxKSkpLCAxKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2NvbnZlcnNpb24oc2VsZik6CisgICAgICAgIGIgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfY2hhcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgImFiY1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjoyXSwgImFjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKKworICAgIHRyeToKKyAgICAgICAgY193Y2hhcgorICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBkZWYgdGVzdF91bmljb2RlX2J1ZmZlcihzZWxmKToKKyAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoMzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgMzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgMzIgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyB1bmljb2RlKQorCisgICAgICAgICAgICBiID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKHUiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sIHUiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQorCisgICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfY29udmVyc2lvbihzZWxmKToKKyAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyB1bmljb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzBdLCB1ImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6XSwgImFiY1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6NV0sICJhIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE3MjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWE3MjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmQ3NWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CkBAIC0wLDAgKzEsMjk0IEBACitpbXBvcnQgc3lzLCB1bml0dGVzdCwgc3RydWN0LCBtYXRoLCBjdHlwZXMKK2Zyb20gYmluYXNjaWkgaW1wb3J0IGhleGxpZnkKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworZGVmIGJpbihzKToKKyAgICByZXR1cm4gaGV4bGlmeShtZW1vcnl2aWV3KHMpKS51cHBlcigpCisKKyMgRWFjaCAqc2ltcGxlKiB0eXBlIHRoYXQgc3VwcG9ydHMgZGlmZmVyZW50IGJ5dGUgb3JkZXJzIGhhcyBhbgorIyBfX2N0eXBlX2JlX18gYXR0cmlidXRlIHRoYXQgc3BlY2lmaWVzIHRoZSBzYW1lIHR5cGUgaW4gQklHIEVORElBTgorIyBieXRlIG9yZGVyLCBhbmQgYSBfX2N0eXBlX2xlX18gYXR0cmlidXRlIHRoYXQgaXMgdGhlIHNhbWUgdHlwZSBpbgorIyBMSVRUTEUgRU5ESUFOIGJ5dGUgb3JkZXIuCisjCisjIEZvciBTdHJ1Y3R1cmVzIGFuZCBVbmlvbnMsIHRoZXNlIHR5cGVzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIFhfdGVzdChzZWxmKToKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIHN5cy5ieXRlb3JkZXIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMzIpOgorICAgICAgICAgICAgYml0cyA9IEJJVFMoKQorICAgICAgICAgICAgc2V0YXR0cihiaXRzLCAiaSVzIiAlIGksIDEpCisgICAgICAgICAgICBkdW1wKGJpdHMpCisKKyAgICBkZWYgdGVzdF9lbmRpYW5fc2hvcnQoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3Nob3J0Ll9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3Nob3J0Ll9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc2hvcnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQorICAgICAgICBzID0gY19zaG9ydC5fX2N0eXBlX2JlX18oMHgxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNCkKKworICAgICAgICBzID0gY19zaG9ydC5fX2N0eXBlX2xlX18oMHgxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGgiLCAweDEyMzQpKSwgIjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNCkKKworICAgICAgICBzID0gY191c2hvcnQuX19jdHlwZV9iZV9fKDB4MTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5oIiwgMHgxMjM0KSksICIxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQpCisKKyAgICAgICAgcyA9IGNfdXNob3J0Ll9fY3R5cGVfbGVfXygweDEyMzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aCIsIDB4MTIzNCkpLCAiMzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0KQorCisgICAgZGVmIHRlc3RfZW5kaWFuX2ludChzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2xlX18gaXMgY19pbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2ludCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2JlX18gaXMgY19pbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2ludCkKKworICAgICAgICBzID0gY19pbnQuX19jdHlwZV9iZV9fKDB4MTIzNDU2NzgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+aSIsIDB4MTIzNDU2NzgpKSwgIjEyMzQ1Njc4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0NTY3OCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3OCkKKworICAgICAgICBzID0gY19pbnQuX19jdHlwZV9sZV9fKDB4MTIzNDU2NzgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aSIsIDB4MTIzNDU2NzgpKSwgIjc4NTYzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3OCkKKworICAgICAgICBzID0gY191aW50Ll9fY3R5cGVfYmVfXygweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPkkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCisKKyAgICAgICAgcyA9IGNfdWludC5fX2N0eXBlX2xlX18oMHgxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIjxJIiwgMHgxMjM0NTY3OCkpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjc4NTYzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorCisgICAgZGVmIHRlc3RfZW5kaWFuX2xvbmdsb25nKHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfbG9uZ2xvbmcuX19jdHlwZV9sZV9fIGlzIGNfbG9uZ2xvbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19sb25nbG9uZy5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfbG9uZ2xvbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19sb25nbG9uZy5fX2N0eXBlX2JlX18gaXMgY19sb25nbG9uZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2xvbmdsb25nLl9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19sb25nbG9uZykKKworICAgICAgICBzID0gY19sb25nbG9uZy5fX2N0eXBlX2JlX18oMHgxMjM0NTY3ODkwQUJDREVGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPnEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIjEyMzQ1Njc4OTBBQkNERUYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQ1Njc4OTBBQkNERUYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKworICAgICAgICBzID0gY19sb25nbG9uZy5fX2N0eXBlX2xlX18oMHgxMjM0NTY3ODkwQUJDREVGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPHEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKworICAgICAgICBzID0gY191bG9uZ2xvbmcuX19jdHlwZV9iZV9fKDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5RIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCisKKyAgICAgICAgcyA9IGNfdWxvbmdsb25nLl9fY3R5cGVfbGVfXygweDEyMzQ1Njc4OTBBQkNERUYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8USIsIDB4MTIzNDU2Nzg5MEFCQ0RFRikpLCAiRUZDREFCOTA3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiRUZDREFCOTA3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQorCisgICAgZGVmIHRlc3RfZW5kaWFuX2Zsb2F0KHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9sZV9fIGlzIGNfZmxvYXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19mbG9hdC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfZmxvYXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19mbG9hdC5fX2N0eXBlX2JlX18gaXMgY19mbG9hdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2Zsb2F0Ll9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19mbG9hdCkKKyAgICAgICAgcyA9IGNfZmxvYXQobWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soImYiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgIyBIbSwgd2hhdCdzIHRoZSBwcmVjaXNpb24gb2YgYSBmbG9hdCBjb21wYXJlZCB0byBhIGRvdWJsZT8KKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzLnZhbHVlLCBtYXRoLnBpLCA2KQorICAgICAgICBzID0gY19mbG9hdC5fX2N0eXBlX2xlX18obWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzLnZhbHVlLCBtYXRoLnBpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGYiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgcyA9IGNfZmxvYXQuX19jdHlwZV9iZV9fKG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5mIiwgbWF0aC5waSkpLCBiaW4ocykpCisKKyAgICBkZWYgdGVzdF9lbmRpYW5fZG91YmxlKHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZG91YmxlLl9fY3R5cGVfbGVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfZG91YmxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZG91YmxlLl9fY3R5cGVfYmVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfZG91YmxlKQorICAgICAgICBzID0gY19kb3VibGUobWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiZCIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzID0gY19kb3VibGUuX19jdHlwZV9sZV9fKG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIjxkIiwgbWF0aC5waSkpLCBiaW4ocykpCisgICAgICAgIHMgPSBjX2RvdWJsZS5fX2N0eXBlX2JlX18obWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmQiLCBtYXRoLnBpKSksIGJpbihzKSkKKworICAgIGRlZiB0ZXN0X2VuZGlhbl9vdGhlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfYnl0ZS5fX2N0eXBlX2xlX18gaXMgY19ieXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19ieXRlLl9fY3R5cGVfYmVfXyBpcyBjX2J5dGUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfdWJ5dGUuX19jdHlwZV9sZV9fIGlzIGNfdWJ5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3VieXRlLl9fY3R5cGVfYmVfXyBpcyBjX3VieXRlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2NoYXIuX19jdHlwZV9sZV9fIGlzIGNfY2hhcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfY2hhci5fX2N0eXBlX2JlX18gaXMgY19jaGFyKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X2ZpZWxkc18xKHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgYmFzZSA9IEJpZ0VuZGlhblN0cnVjdHVyZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorCisgICAgICAgIGNsYXNzIFQoYmFzZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdWJ5dGUpLAorICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgKCJkIiwgY191c2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAoImUiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICgiZiIsIGNfdWludCksCisgICAgICAgICAgICAgICAgICAgICgiZyIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfdWxvbmcpLAorICAgICAgICAgICAgICAgICAgICAoImkiLCBjX2xvbmdsb25nKSwKKyAgICAgICAgICAgICAgICAgICAgKCJrIiwgY191bG9uZ2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAoImwiLCBjX2Zsb2F0KSwKKyAgICAgICAgICAgICAgICAgICAgKCJtIiwgY19kb3VibGUpLAorICAgICAgICAgICAgICAgICAgICAoIm4iLCBjX2NoYXIpLAorCisgICAgICAgICAgICAgICAgICAgICgiYjEiLCBjX2J5dGUsIDMpLAorICAgICAgICAgICAgICAgICAgICAoImIyIiwgY19ieXRlLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgKCJiMyIsIGNfYnl0ZSwgMiksCisgICAgICAgICAgICAgICAgICAgICgiYSIsIGNfaW50ICogMyAqIDMgKiAzKV0KKyAgICAgICAgVC5fZmllbGRzXyA9IF9maWVsZHNfCisKKyAgICAgICAgIyB0aGVzZSBmaWVsZHMgZG8gbm90IHN1cHBvcnQgZGlmZmVyZW50IGJ5dGUgb3JkZXI6CisgICAgICAgIGZvciB0eXAgaW4gY193Y2hhciwgY192b2lkX3AsIFBPSU5URVIoY19pbnQpOgorICAgICAgICAgICAgX2ZpZWxkc18uYXBwZW5kKCgieCIsIHR5cCkpCisgICAgICAgICAgICBjbGFzcyBUKGJhc2UpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgVCwgIl9maWVsZHNfIiwgWygieCIsIHR5cCldKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X3N0cnVjdChzZWxmKToKKyAgICAgICAgIyBuZXN0ZWQgc3RydWN0dXJlcyB3aXRoIGRpZmZlcmVudCBieXRlb3JkZXJzCisKKyAgICAgICAgIyBjcmVhdGUgbmVzdGVkIHN0cnVjdHVyZXMgd2l0aCBnaXZlbiBieXRlb3JkZXJzIGFuZCBzZXQgbWVtb3J5IHRvIGRhdGEKKworICAgICAgICBmb3IgbmVzdGVkLCBkYXRhIGluICgKKyAgICAgICAgICAgIChCaWdFbmRpYW5TdHJ1Y3R1cmUsIGInXDBcMFwwXDFcMFwwXDBcMicpLAorICAgICAgICAgICAgKExpdHRsZUVuZGlhblN0cnVjdHVyZSwgYidcMVwwXDBcMFwyXDBcMFwwJyksCisgICAgICAgICk6CisgICAgICAgICAgICBmb3IgcGFyZW50IGluICgKKyAgICAgICAgICAgICAgICBCaWdFbmRpYW5TdHJ1Y3R1cmUsCisgICAgICAgICAgICAgICAgTGl0dGxlRW5kaWFuU3RydWN0dXJlLAorICAgICAgICAgICAgICAgIFN0cnVjdHVyZSwKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgY2xhc3MgTmVzdGVkU3RydWN0dXJlKG5lc3RlZCk6CisgICAgICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfdWludDMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY191aW50MzIpXQorCisgICAgICAgICAgICAgICAgY2xhc3MgVGVzdFN0cnVjdHVyZShwYXJlbnQpOgorICAgICAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoInBvaW50IiwgTmVzdGVkU3RydWN0dXJlKV0KKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEpLCBzaXplb2YoVGVzdFN0cnVjdHVyZSkpCisgICAgICAgICAgICAgICAgcHRyID0gUE9JTlRFUihUZXN0U3RydWN0dXJlKQorICAgICAgICAgICAgICAgIHMgPSBjYXN0KGRhdGEsIHB0cilbMF0KKyAgICAgICAgICAgICAgICBkZWwgY3R5cGVzLl9wb2ludGVyX3R5cGVfY2FjaGVbVGVzdFN0cnVjdHVyZV0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucG9pbnQueCwgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucG9pbnQueSwgMikKKworICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHNfMihzZWxmKToKKyAgICAgICAgIyBzdGFuZGFyZCBwYWNraW5nIGluIHN0cnVjdCB1c2VzIG5vIGFsaWdubWVudC4KKyAgICAgICAgIyBTbywgd2UgaGF2ZSB0byBhbGlnbiB1c2luZyBwYWQgYnl0ZXMuCisgICAgICAgICMKKyAgICAgICAgIyBVbmFsaWduZWQgYWNjZXNzZXMgd2lsbCBjcmFzaCBQeXRob24gKG9uIHRob3NlIHBsYXRmb3JtcyB0aGF0CisgICAgICAgICMgZG9uJ3QgYWxsb3cgaXQsIGxpa2Ugc3BhcmMgc29sYXJpcykuCisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBiYXNlID0gQmlnRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPmJ4aGlkIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorICAgICAgICAgICAgZm10ID0gIjxieGhpZCIKKworICAgICAgICBjbGFzcyBTKGJhc2UpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJiIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19kb3VibGUpXQorCisgICAgICAgIHMxID0gUygweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCisgICAgICAgIHMyID0gc3RydWN0LnBhY2soZm10LCAweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMxKSwgYmluKHMyKSkKKworICAgIGRlZiB0ZXN0X3VuYWxpZ25lZF9ub25uYXRpdmVfc3RydWN0X2ZpZWxkcyhzZWxmKToKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKKyAgICAgICAgICAgIGJhc2UgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZtdCA9ICI+YiBoIHhpIHhkIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorICAgICAgICAgICAgZm10ID0gIjxiIGggeGkgeGQiCisKKyAgICAgICAgY2xhc3MgUyhiYXNlKToKKyAgICAgICAgICAgIF9wYWNrXyA9IDEKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfYnl0ZSksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfc2hvcnQpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8xIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsIGNfaW50KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMiIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCBjX2RvdWJsZSldCisKKyAgICAgICAgczEgPSBTKCkKKyAgICAgICAgczEuYiA9IDB4MTIKKyAgICAgICAgczEuaCA9IDB4MTIzNAorICAgICAgICBzMS5pID0gMHgxMjM0NTY3OAorICAgICAgICBzMS5kID0gMy4xNAorICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzMSksIGJpbihzMikpCisKKyAgICBkZWYgdGVzdF91bmFsaWduZWRfbmF0aXZlX3N0cnVjdF9maWVsZHMoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBmbXQgPSAiPGIgaCB4aSB4ZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZtdCA9ICI+YiBoIHhpIHhkIgorCisgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9wYWNrXyA9IDEKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfYnl0ZSksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfc2hvcnQpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8xIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsIGNfaW50KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMiIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCBjX2RvdWJsZSldCisKKyAgICAgICAgczEgPSBTKCkKKyAgICAgICAgczEuYiA9IDB4MTIKKyAgICAgICAgczEuaCA9IDB4MTIzNAorICAgICAgICBzMS5pID0gMHgxMjM0NTY3OAorICAgICAgICBzMS5kID0gMy4xNAorICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzMSksIGJpbihzMikpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE5MzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE5MzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTBjMTdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQpAQCAtMCwwICsxLDI1NiBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBDYWxsYmFja3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGZ1bmN0eXBlID0gQ0ZVTkNUWVBFCisKKyMjICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyMjICAgICAgICBpbXBvcnQgZ2MKKyMjICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgIGRlZiBjYWxsYmFjayhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuZ290X2FyZ3MgPSBhcmdzCisgICAgICAgIHJldHVybiBhcmdzWy0xXQorCisgICAgZGVmIGNoZWNrX3R5cGUoc2VsZiwgdHlwLCBhcmcpOgorICAgICAgICBQUk9UTyA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyh0eXAsIHR5cCkKKyAgICAgICAgcmVzdWx0ID0gUFJPVE8oc2VsZi5jYWxsYmFjaykoYXJnKQorICAgICAgICBpZiB0eXAgPT0gY19mbG9hdDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocmVzdWx0LCBhcmcsIHBsYWNlcz01KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9hcmdzLCAoYXJnLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgYXJnKQorCisgICAgICAgIFBST1RPID0gc2VsZi5mdW5jdHlwZS5pbV9mdW5jKHR5cCwgY19ieXRlLCB0eXApCisgICAgICAgIHJlc3VsdCA9IFBST1RPKHNlbGYuY2FsbGJhY2spKC0zLCBhcmcpCisgICAgICAgIGlmIHR5cCA9PSBjX2Zsb2F0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyZXN1bHQsIGFyZywgcGxhY2VzPTUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ290X2FyZ3MsICgtMywgYXJnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBhcmcpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjCisKKyAgICBkZWYgdGVzdF9ieXRlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19ieXRlLCA0MikKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfYnl0ZSwgLTQyKQorCisgICAgZGVmIHRlc3RfdWJ5dGUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3VieXRlLCA0MikKKworICAgIGRlZiB0ZXN0X3Nob3J0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19zaG9ydCwgNDIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3Nob3J0LCAtNDIpCisKKyAgICBkZWYgdGVzdF91c2hvcnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3VzaG9ydCwgNDIpCisKKyAgICBkZWYgdGVzdF9pbnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2ludCwgNDIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2ludCwgLTQyKQorCisgICAgZGVmIHRlc3RfdWludChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfdWludCwgNDIpCisKKyAgICBkZWYgdGVzdF9sb25nKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19sb25nLCA0MikKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZywgLTQyKQorCisgICAgZGVmIHRlc3RfdWxvbmcoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3Vsb25nLCA0MikKKworICAgIGRlZiB0ZXN0X2xvbmdsb25nKHNlbGYpOgorICAgICAgICAjIHRlc3Qgc29tZSA2NC1iaXQgdmFsdWVzLCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZ2xvbmcsIDU5NDgyOTE3NTcyNDUyNzc0NjcpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2xvbmdsb25nLCAtNTIyOTM4ODkwOTc4NDE5MDU4MCkKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfbG9uZ2xvbmcsIDQyKQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19sb25nbG9uZywgLTQyKQorCisgICAgZGVmIHRlc3RfdWxvbmdsb25nKHNlbGYpOgorICAgICAgICAjIHRlc3Qgc29tZSA2NC1iaXQgdmFsdWVzLCB3aXRoIGFuZCB3aXRob3V0IG1zYiBzZXQuCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3Vsb25nbG9uZywgMTA5NTU0MTIyNDIxNzAzMzk3ODIpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX3Vsb25nbG9uZywgMzY2NTg4NTQ5OTg0MTE2NzQ1OCkKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfdWxvbmdsb25nLCA0MikKKworICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgorICAgICAgICAjIG9ubHkgYWxtb3N0IGVxdWFsOiBkb3VibGUgLT4gZmxvYXQgLT4gZG91YmxlCisgICAgICAgIGltcG9ydCBtYXRoCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2Zsb2F0LCBtYXRoLmUpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2Zsb2F0LCAtbWF0aC5lKQorCisgICAgZGVmIHRlc3RfZG91YmxlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19kb3VibGUsIDMuMTQpCisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2RvdWJsZSwgLTMuMTQpCisKKyAgICBkZWYgdGVzdF9sb25nZG91YmxlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19sb25nZG91YmxlLCAzLjE0KQorICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19sb25nZG91YmxlLCAtMy4xNCkKKworICAgIGRlZiB0ZXN0X2NoYXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXIsICJ4IikKKyAgICAgICAgc2VsZi5jaGVja190eXBlKGNfY2hhciwgImEiKQorCisgICAgIyBkaXNhYmxlZDogd291bGQgbm93IChjb3JyZWN0bHkpIHJhaXNlIGEgUnVudGltZVdhcm5pbmcgYWJvdXQKKyAgICAjIGEgbWVtb3J5IGxlYWsuICBBIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbm5vdCByZXR1cm4gYSBub24taW50ZWdyYWwKKyAgICAjIEMgdHlwZSB3aXRob3V0IGNhdXNpbmcgYSBtZW1vcnkgbGVhay4KKyMjICAgIGRlZiB0ZXN0X2NoYXJfcChzZWxmKToKKyMjICAgICAgICBzZWxmLmNoZWNrX3R5cGUoY19jaGFyX3AsICJhYmMiKQorIyMgICAgICAgIHNlbGYuY2hlY2tfdHlwZShjX2NoYXJfcCwgImRlZiIpCisKKyAgICBkZWYgdGVzdF9weW9iamVjdChzZWxmKToKKyAgICAgICAgbyA9ICgpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKKyAgICAgICAgZm9yIG8gaW4gKCksIFtdLCBvYmplY3QoKToKKyAgICAgICAgICAgIGluaXRpYWwgPSBncmMobykKKyAgICAgICAgICAgICMgVGhpcyBjYWxsIGxlYWtzIGEgcmVmZXJlbmNlIHRvICdvJy4uLgorICAgICAgICAgICAgc2VsZi5jaGVja190eXBlKHB5X29iamVjdCwgbykKKyAgICAgICAgICAgIGJlZm9yZSA9IGdyYyhvKQorICAgICAgICAgICAgIyAuLi5idXQgdGhpcyBjYWxsIGRvZXNuJ3QgbGVhayBhbnkgbW9yZS4gIFdoZXJlIGlzIHRoZSByZWZjb3VudD8KKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHlwZShweV9vYmplY3QsIG8pCisgICAgICAgICAgICBhZnRlciA9IGdyYyhvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYWZ0ZXIsIG8pLCAoYmVmb3JlLCBvKSkKKworICAgIGRlZiB0ZXN0X3Vuc3VwcG9ydGVkX3Jlc3R5cGVfMShzZWxmKToKKyAgICAgICAgIyBPbmx5ICJmdW5kYW1lbnRhbCIgcmVzdWx0IHR5cGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGNhbGxiYWNrCisgICAgICAgICMgZnVuY3Rpb25zLCB0aGUgdHlwZSBtdXN0IGhhdmUgYSBub24tTlVMTCBzdGdkaWN0LT5zZXRmdW5jLgorICAgICAgICAjIFBPSU5URVIoY19kb3VibGUpLCBmb3IgZXhhbXBsZSwgaXMgbm90IHN1cHBvcnRlZC4KKworICAgICAgICBwcm90b3R5cGUgPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmMoUE9JTlRFUihjX2RvdWJsZSkpCisgICAgICAgICMgVGhlIHR5cGUgaXMgY2hlY2tlZCB3aGVuIHRoZSBwcm90b3R5cGUgaXMgY2FsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG90eXBlLCBsYW1iZGE6IE5vbmUpCisKKyAgICBkZWYgdGVzdF91bnN1cHBvcnRlZF9yZXN0eXBlXzIoc2VsZik6CisgICAgICAgIHByb3RvdHlwZSA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyhvYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG90eXBlLCBsYW1iZGE6IE5vbmUpCisKKyAgICBkZWYgdGVzdF9pc3N1ZV83OTU5KHNlbGYpOgorICAgICAgICBwcm90byA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyhOb25lKQorCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmdW5jKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi52ID0gcHJvdG8oc2VsZi5mdW5jKQorCisgICAgICAgIGltcG9ydCBnYworICAgICAgICBmb3IgaSBpbiByYW5nZSgzMik6CisgICAgICAgICAgICBYKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGxpdmUgPSBbeCBmb3IgeCBpbiBnYy5nZXRfb2JqZWN0cygpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBYKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGl2ZSksIDApCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEyNDgzKHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY2xhc3MgTmFzdHk6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgQ0ZVTkNUWVBFKE5vbmUpKGxhbWJkYSB4PU5hc3R5KCk6IE5vbmUpCisKKwordHJ5OgorICAgIFdJTkZVTkNUWVBFCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgU3RkY2FsbENhbGxiYWNrcyhDYWxsYmFja3MpOgorICAgICAgICBmdW5jdHlwZSA9IFdJTkZVTkNUWVBFCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgU2FtcGxlQ2FsbGJhY2tzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW50ZWdyYXRlKHNlbGYpOgorICAgICAgICAjIERlcml2ZWQgZnJvbSBzb21lIHRoZW4gbm9uLXdvcmtpbmcgY29kZSwgcG9zdGVkIGJ5IERhdmlkIEZvc3RlcgorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworICAgICAgICAjIFRoZSBmdW5jdGlvbiBwcm90b3R5cGUgY2FsbGVkIGJ5ICdpbnRlZ3JhdGUnOiBkb3VibGUgZnVuYyhkb3VibGUpOworICAgICAgICBDQUxMQkFDSyA9IENGVU5DVFlQRShjX2RvdWJsZSwgY19kb3VibGUpCisKKyAgICAgICAgIyBUaGUgaW50ZWdyYXRlIGZ1bmN0aW9uIGl0c2VsZiwgZXhwb3NlZCBmcm9tIHRoZSBfY3R5cGVzX3Rlc3QgZGxsCisgICAgICAgIGludGVncmF0ZSA9IGRsbC5pbnRlZ3JhdGUKKyAgICAgICAgaW50ZWdyYXRlLmFyZ3R5cGVzID0gKGNfZG91YmxlLCBjX2RvdWJsZSwgQ0FMTEJBQ0ssIGNfbG9uZykKKyAgICAgICAgaW50ZWdyYXRlLnJlc3R5cGUgPSBjX2RvdWJsZQorCisgICAgICAgIGRlZiBmdW5jKHgpOgorICAgICAgICAgICAgcmV0dXJuIHgqKjIKKworICAgICAgICByZXN1bHQgPSBpbnRlZ3JhdGUoMC4wLCAxLjAsIENBTExCQUNLKGZ1bmMpLCAxMCkKKyAgICAgICAgZGlmZiA9IGFicyhyZXN1bHQgLSAxLi8zLikKKworICAgICAgICBzZWxmLmFzc2VydExlc3MoZGlmZiwgMC4wMSwgIiVzIG5vdCBsZXNzIHRoYW4gMC4wMSIgJSBkaWZmKQorCisgICAgZGVmIHRlc3RfaXNzdWVfODk1OV9hKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKKyAgICAgICAgbGliY19wYXRoID0gZmluZF9saWJyYXJ5KCJjIikKKyAgICAgICAgaWYgbm90IGxpYmNfcGF0aDoKKyAgICAgICAgICAgIHJldHVybiAjIGNhbm5vdCB0ZXN0CisgICAgICAgIGxpYmMgPSBDRExMKGxpYmNfcGF0aCkKKworICAgICAgICBAQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKGNfaW50KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIGRlZiBjbXBfZnVuYyhhLCBiKToKKyAgICAgICAgICAgIHJldHVybiBhWzBdIC0gYlswXQorCisgICAgICAgIGFycmF5ID0gKGNfaW50ICogNSkoNSwgMSwgOTksIDcsIDMzKQorCisgICAgICAgIGxpYmMucXNvcnQoYXJyYXksIGxlbihhcnJheSksIHNpemVvZihjX2ludCksIGNtcF9mdW5jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5WzpdLCBbMSwgNSwgNywgMzMsIDk5XSkKKworICAgIHRyeToKKyAgICAgICAgV0lORlVOQ1RZUEUKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZGVmIHRlc3RfaXNzdWVfODk1OV9iKHNlbGYpOgorICAgICAgICAgICAgZnJvbSBjdHlwZXMud2ludHlwZXMgaW1wb3J0IEJPT0wsIEhXTkQsIExQQVJBTQorICAgICAgICAgICAgZ2xvYmFsIHdpbmRvd0NvdW50CisgICAgICAgICAgICB3aW5kb3dDb3VudCA9IDAKKworICAgICAgICAgICAgQFdJTkZVTkNUWVBFKEJPT0wsIEhXTkQsIExQQVJBTSkKKyAgICAgICAgICAgIGRlZiBFbnVtV2luZG93c0NhbGxiYWNrRnVuYyhod25kLCBsUGFyYW0pOgorICAgICAgICAgICAgICAgIGdsb2JhbCB3aW5kb3dDb3VudAorICAgICAgICAgICAgICAgIHdpbmRvd0NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZSAjQWxsb3cgd2luZG93cyB0byBrZWVwIGVudW1lcmF0aW5nCisKKyAgICAgICAgICAgIHdpbmRsbC51c2VyMzIuRW51bVdpbmRvd3MoRW51bVdpbmRvd3NDYWxsYmFja0Z1bmMsIDApCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19yZWdpc3Rlcl9pbnQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzgyNzU6IGJ1Z2d5IGhhbmRsaW5nIG9mIGNhbGxiYWNrIGFyZ3MgdW5kZXIgV2luNjQKKyAgICAgICAgIyBOT1RFOiBzaG91bGQgYmUgcnVuIG9uIHJlbGVhc2UgYnVpbGRzIGFzIHdlbGwKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIENBTExCQUNLID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQpCisgICAgICAgICMgQWxsIHRoaXMgZnVuY3Rpb24gZG9lcyBpcyBjYWxsIHRoZSBjYWxsYmFjayB3aXRoIGl0cyBhcmdzIHNxdWFyZWQKKyAgICAgICAgZnVuYyA9IGRsbC5fdGVzdGZ1bmNfY2JrX3JlZ19pbnQKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQsIENBTExCQUNLKQorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2ludAorCisgICAgICAgIGRlZiBjYWxsYmFjayhhLCBiLCBjLCBkLCBlKToKKyAgICAgICAgICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgZQorCisgICAgICAgIHJlc3VsdCA9IGZ1bmMoMiwgMywgNCwgNSwgNiwgQ0FMTEJBQ0soY2FsbGJhY2spKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgY2FsbGJhY2soMioyLCAzKjMsIDQqNCwgNSo1LCA2KjYpKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfcmVnaXN0ZXJfZG91YmxlKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4Mjc1OiBidWdneSBoYW5kbGluZyBvZiBjYWxsYmFjayBhcmdzIHVuZGVyIFdpbjY0CisgICAgICAgICMgTk9URTogc2hvdWxkIGJlIHJ1biBvbiByZWxlYXNlIGJ1aWxkcyBhcyB3ZWxsCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBDQUxMQkFDSyA9IENGVU5DVFlQRShjX2RvdWJsZSwgY19kb3VibGUsIGNfZG91YmxlLCBjX2RvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19kb3VibGUsIGNfZG91YmxlKQorICAgICAgICAjIEFsbCB0aGlzIGZ1bmN0aW9uIGRvZXMgaXMgY2FsbCB0aGUgY2FsbGJhY2sgd2l0aCBpdHMgYXJncyBzcXVhcmVkCisgICAgICAgIGZ1bmMgPSBkbGwuX3Rlc3RmdW5jX2Nia19yZWdfZG91YmxlCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoY19kb3VibGUsIGNfZG91YmxlLCBjX2RvdWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjX2RvdWJsZSwgY19kb3VibGUsIENBTExCQUNLKQorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2RvdWJsZQorCisgICAgICAgIGRlZiBjYWxsYmFjayhhLCBiLCBjLCBkLCBlKToKKyAgICAgICAgICAgIHJldHVybiBhICsgYiArIGMgKyBkICsgZQorCisgICAgICAgIHJlc3VsdCA9IGZ1bmMoMS4xLCAyLjIsIDMuMywgNC40LCA1LjUsIENBTExCQUNLKGNhbGxiYWNrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soMS4xKjEuMSwgMi4yKjIuMiwgMy4zKjMuMywgNC40KjQuNCwgNS41KjUuNSkpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY2ZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY2ZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZmZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKQEAgLTAsMCArMSw4OSBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworCitjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FycmF5MnBvaW50ZXIoc2VsZik6CisgICAgICAgIGFycmF5ID0gKGNfaW50ICogMykoNDIsIDE3LCAyKQorCisgICAgICAgICMgY2FzdGluZyBhbiBhcnJheSB0byBhIHBvaW50ZXIgd29ya3MuCisgICAgICAgIHB0ciA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKworICAgICAgICBpZiAyKnNpemVvZihjX3Nob3J0KSA9PSBzaXplb2YoY19pbnQpOgorICAgICAgICAgICAgcHRyID0gY2FzdChhcnJheSwgUE9JTlRFUihjX3Nob3J0KSkKKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDYpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNDIsIDAsIDE3LCAwLCAyLCAwXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDYpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgNDIsIDAsIDE3LCAwLCAyXSkKKworICAgIGRlZiB0ZXN0X2FkZHJlc3MycG9pbnRlcihzZWxmKToKKyAgICAgICAgYXJyYXkgPSAoY19pbnQgKiAzKSg0MiwgMTcsIDIpCisKKyAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3NvZihhcnJheSkKKyAgICAgICAgcHRyID0gY2FzdChjX3ZvaWRfcChhZGRyZXNzKSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQorCisgICAgICAgIHB0ciA9IGNhc3QoYWRkcmVzcywgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQorCisgICAgZGVmIHRlc3RfcDJhX29iamVjdHMoc2VsZik6CisgICAgICAgIGFycmF5ID0gKGNfY2hhcl9wICogNSkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5Ll9vYmplY3RzLCBOb25lKQorICAgICAgICBhcnJheVswXSA9ICJmb28gYmFyIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQorCisgICAgICAgIHAgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfY2hhcl9wKSkKKyAgICAgICAgIyBhcnJheSBhbmQgcCBzaGFyZSBhIGNvbW1vbiBfb2JqZWN0cyBhdHRyaWJ1dGUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAuX29iamVjdHMgaXMgYXJyYXkuX29iamVjdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJyYXkuX29iamVjdHMsIHsnMCc6ICJmb28gYmFyIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHBbMF0gPSAic3BhbSBzcGFtIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuX29iamVjdHMsIHsnMCc6ICJzcGFtIHNwYW0iLCBpZChhcnJheSk6IGFycmF5fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFycmF5Ll9vYmplY3RzIGlzIHAuX29iamVjdHMpCisgICAgICAgIHBbMV0gPSAiZm9vIGJhciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLl9vYmplY3RzLCB7JzEnOiAnZm9vIGJhcicsICcwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKKworICAgIGRlZiB0ZXN0X290aGVyKHNlbGYpOgorICAgICAgICBwID0gY2FzdCgoY19pbnQgKiA0KSgxLCAyLCAzLCA0KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NF0sIFsxLDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMzotMTotMV0sIFs0LCAzLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCisgICAgICAgIGNfaW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMzotMTotMV0sIFs0LCAzLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCisgICAgICAgIHBbMl0gPSA5NgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjRdLCBbMSwgMiwgOTYsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6XSwgWzEsIDIsIDk2LCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzM6LTE6LTFdLCBbNCwgOTYsIDIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6M10sIFsxLCA0XSkKKyAgICAgICAgY19pbnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjRdLCBbMSwgMiwgOTYsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6XSwgWzEsIDIsIDk2LCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzM6LTE6LTFdLCBbNCwgOTYsIDIsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6M10sIFsxLCA0XSkKKworICAgIGRlZiB0ZXN0X2NoYXJfcChzZWxmKToKKyAgICAgICAgIyBUaGlzIGRpZG4ndCB3b3JrOiBiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24KKyAgICAgICAgcyA9IGNfY2hhcl9wKCJoaWhvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX2NoYXJfcCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWhvIikKKworICAgIHRyeToKKyAgICAgICAgY193Y2hhcl9wCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGRlZiB0ZXN0X3djaGFyX3Aoc2VsZik6CisgICAgICAgICAgICBzID0gY193Y2hhcl9wKCJoaWhvIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FzdChjYXN0KHMsIGNfdm9pZF9wKSwgY193Y2hhcl9wKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWhvIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYxMDljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWYxMDljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5M2NiZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CkBAIC0wLDAgKzEsMjExIEBACisjIEEgbG90IG9mIGZhaWx1cmVzIGluIHRoZXNlIHRlc3RzIG9uIE1hYyBPUyBYLgorIyBCeXRlIG9yZGVyIHJlbGF0ZWQ/CisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBDRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBfZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKKyAgICBkZWYgUyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGNfbG9uZ2xvbmcuaW5fZGxsKHNlbGYuX2RsbCwgImxhc3RfdGZfYXJnX3MiKS52YWx1ZQorICAgIGRlZiBVKHNlbGYpOgorICAgICAgICByZXR1cm4gY191bG9uZ2xvbmcuaW5fZGxsKHNlbGYuX2RsbCwgImxhc3RfdGZfYXJnX3UiKS52YWx1ZQorCisgICAgZGVmIHRlc3RfYnl0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2IucmVzdHlwZSA9IGNfYnl0ZQorICAgICAgICBzZWxmLl9kbGwudGZfYi5hcmd0eXBlcyA9IChjX2J5dGUsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iKC0xMjYpLCAtNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0xMjYpCisKKyAgICBkZWYgdGVzdF9ieXRlX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iYi5yZXN0eXBlID0gY19ieXRlCisgICAgICAgIHNlbGYuX2RsbC50Zl9iYi5hcmd0eXBlcyA9IChjX2J5dGUsIGNfYnl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmIoMCwgLTEyNiksIC00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTEyNikKKworICAgIGRlZiB0ZXN0X3VieXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfQi5yZXN0eXBlID0gY191Ynl0ZQorICAgICAgICBzZWxmLl9kbGwudGZfQi5hcmd0eXBlcyA9IChjX3VieXRlLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfQigyNTUpLCA4NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgMjU1KQorCisgICAgZGVmIHRlc3RfdWJ5dGVfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JCLnJlc3R5cGUgPSBjX3VieXRlCisgICAgICAgIHNlbGYuX2RsbC50Zl9iQi5hcmd0eXBlcyA9IChjX2J5dGUsIGNfdWJ5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JCKDAsIDI1NSksIDg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCAyNTUpCisKKyAgICBkZWYgdGVzdF9zaG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2gucmVzdHlwZSA9IGNfc2hvcnQKKyAgICAgICAgc2VsZi5fZGxsLnRmX2guYXJndHlwZXMgPSAoY19zaG9ydCwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2goLTMyNzY2KSwgLTEwOTIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMzI3NjYpCisKKyAgICBkZWYgdGVzdF9zaG9ydF9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmgucmVzdHlwZSA9IGNfc2hvcnQKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JoLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19zaG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmgoMCwgLTMyNzY2KSwgLTEwOTIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMzI3NjYpCisKKyAgICBkZWYgdGVzdF91c2hvcnQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9ILnJlc3R5cGUgPSBjX3VzaG9ydAorICAgICAgICBzZWxmLl9kbGwudGZfSC5hcmd0eXBlcyA9IChjX3VzaG9ydCwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX0goNjU1MzUpLCAyMTg0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNjU1MzUpCisKKyAgICBkZWYgdGVzdF91c2hvcnRfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JILnJlc3R5cGUgPSBjX3VzaG9ydAorICAgICAgICBzZWxmLl9kbGwudGZfYkguYXJndHlwZXMgPSAoY19ieXRlLCBjX3VzaG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYkgoMCwgNjU1MzUpLCAyMTg0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNjU1MzUpCisKKyAgICBkZWYgdGVzdF9pbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9pLnJlc3R5cGUgPSBjX2ludAorICAgICAgICBzZWxmLl9kbGwudGZfaS5hcmd0eXBlcyA9IChjX2ludCwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2koLTIxNDc0ODM2NDYpLCAtNzE1ODI3ODgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKworICAgIGRlZiB0ZXN0X2ludF9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmkucmVzdHlwZSA9IGNfaW50CisgICAgICAgIHNlbGYuX2RsbC50Zl9iaS5hcmd0eXBlcyA9IChjX2J5dGUsIGNfaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iaSgwLCAtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQorCisgICAgZGVmIHRlc3RfdWludChzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX0kucmVzdHlwZSA9IGNfdWludAorICAgICAgICBzZWxmLl9kbGwudGZfSS5hcmd0eXBlcyA9IChjX3VpbnQsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9JKDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorCisgICAgZGVmIHRlc3RfdWludF9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYkkucmVzdHlwZSA9IGNfdWludAorICAgICAgICBzZWxmLl9kbGwudGZfYkkuYXJndHlwZXMgPSAoY19ieXRlLCBjX3VpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JJKDAsIDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2wucmVzdHlwZSA9IGNfbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfbC5hcmd0eXBlcyA9IChjX2xvbmcsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9sKC0yMTQ3NDgzNjQ2KSwgLTcxNTgyNzg4MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTIxNDc0ODM2NDYpCisKKyAgICBkZWYgdGVzdF9sb25nX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9ibC5yZXN0eXBlID0gY19sb25nCisgICAgICAgIHNlbGYuX2RsbC50Zl9ibC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmwoMCwgLTIxNDc0ODM2NDYpLCAtNzE1ODI3ODgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKworICAgIGRlZiB0ZXN0X3Vsb25nKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfTC5yZXN0eXBlID0gY191bG9uZworICAgICAgICBzZWxmLl9kbGwudGZfTC5hcmd0eXBlcyA9IChjX3Vsb25nLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfTCg0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKKworICAgIGRlZiB0ZXN0X3Vsb25nX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iTC5yZXN0eXBlID0gY191bG9uZworICAgICAgICBzZWxmLl9kbGwudGZfYkwuYXJndHlwZXMgPSAoY19jaGFyLCBjX3Vsb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iTCgnICcsIDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorCisgICAgZGVmIHRlc3RfbG9uZ2xvbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9xLnJlc3R5cGUgPSBjX2xvbmdsb25nCisgICAgICAgIHNlbGYuX2RsbC50Zl9xLmFyZ3R5cGVzID0gKGNfbG9uZ2xvbmcsICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfcSgtOTIyMzM3MjAzNjg1NDc3NTgwNiksIC0zMDc0NDU3MzQ1NjE4MjU4NjAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKKworICAgIGRlZiB0ZXN0X2xvbmdsb25nX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9icS5yZXN0eXBlID0gY19sb25nbG9uZworICAgICAgICBzZWxmLl9kbGwudGZfYnEuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmdsb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9icSgwLCAtOTIyMzM3MjAzNjg1NDc3NTgwNiksIC0zMDc0NDU3MzQ1NjE4MjU4NjAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKKworICAgIGRlZiB0ZXN0X3Vsb25nbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX1EucmVzdHlwZSA9IGNfdWxvbmdsb25nCisgICAgICAgIHNlbGYuX2RsbC50Zl9RLmFyZ3R5cGVzID0gKGNfdWxvbmdsb25nLCApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX1EoMTg0NDY3NDQwNzM3MDk1NTE2MTUpLCA2MTQ4OTE0NjkxMjM2NTE3MjA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCAxODQ0Njc0NDA3MzcwOTU1MTYxNSkKKworICAgIGRlZiB0ZXN0X3Vsb25nbG9uZ19wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYlEucmVzdHlwZSA9IGNfdWxvbmdsb25nCisgICAgICAgIHNlbGYuX2RsbC50Zl9iUS5hcmd0eXBlcyA9IChjX2J5dGUsIGNfdWxvbmdsb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iUSgwLCAxODQ0Njc0NDA3MzcwOTU1MTYxNSksIDYxNDg5MTQ2OTEyMzY1MTcyMDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9mLnJlc3R5cGUgPSBjX2Zsb2F0CisgICAgICAgIHNlbGYuX2RsbC50Zl9mLmFyZ3R5cGVzID0gKGNfZmxvYXQsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9mKC00Mi4pLCAtMTQuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtNDIpCisKKyAgICBkZWYgdGVzdF9mbG9hdF9wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfYmYucmVzdHlwZSA9IGNfZmxvYXQKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JmLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19mbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmYoMCwgLTQyLiksIC0xNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC00MikKKworICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2QucmVzdHlwZSA9IGNfZG91YmxlCisgICAgICAgIHNlbGYuX2RsbC50Zl9kLmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfZCg0Mi4pLCAxNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIDQyKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3BsdXMoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50Zl9iZC5yZXN0eXBlID0gY19kb3VibGUKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JkLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19kb3VibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JkKDAsIDQyLiksIDE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCisKKyAgICBkZWYgdGVzdF9sb25nZG91YmxlKHNlbGYpOgorICAgICAgICBzZWxmLl9kbGwudGZfRC5yZXN0eXBlID0gY19sb25nZG91YmxlCisgICAgICAgIHNlbGYuX2RsbC50Zl9ELmFyZ3R5cGVzID0gKGNfbG9uZ2RvdWJsZSwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX0QoNDIuKSwgMTQuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCA0MikKKworICAgIGRlZiB0ZXN0X2xvbmdkb3VibGVfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JELnJlc3R5cGUgPSBjX2xvbmdkb3VibGUKKyAgICAgICAgc2VsZi5fZGxsLnRmX2JELmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19sb25nZG91YmxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iRCgwLCA0Mi4pLCAxNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIDQyKQorCisgICAgZGVmIHRlc3RfY2FsbHdpdGhyZXN1bHQoc2VsZik6CisgICAgICAgIGRlZiBwcm9jZXNzX3Jlc3VsdChyZXN1bHQpOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIDIKKyAgICAgICAgc2VsZi5fZGxsLnRmX2kucmVzdHlwZSA9IHByb2Nlc3NfcmVzdWx0CisgICAgICAgIHNlbGYuX2RsbC50Zl9pLmFyZ3R5cGVzID0gKGNfaW50LCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfaSg0MiksIDI4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfaSgtNDIpLCAtMjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC00MikKKworICAgIGRlZiB0ZXN0X3ZvaWQoc2VsZik6CisgICAgICAgIHNlbGYuX2RsbC50dl9pLnJlc3R5cGUgPSBOb25lCisgICAgICAgIHNlbGYuX2RsbC50dl9pLmFyZ3R5cGVzID0gKGNfaW50LCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudHZfaSg0MiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50dl9pKC00MiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC00MikKKworIyBUaGUgZm9sbG93aW5nIHJlcGVhdGVzIHRoZSBhYm92ZSB0ZXN0cyB3aXRoIHN0ZGNhbGwgZnVuY3Rpb25zICh3aGVyZQorIyB0aGV5IGFyZSBhdmFpbGFibGUpCit0cnk6CisgICAgV2luRExMCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3Mgc3RkY2FsbF9kbGwoV2luRExMKToKKyAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgaWYgbmFtZVs6Ml0gPT0gJ19fJyBhbmQgbmFtZVstMjpdID09ICdfXyc6CisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKyAgICAgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKCgic18iICsgbmFtZSwgc2VsZikpCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGZ1bmMpCisgICAgICAgICAgICByZXR1cm4gZnVuYworCisgICAgY2xhc3Mgc3RkY2FsbENGdW5jdGlvbnMoQ0Z1bmN0aW9ucyk6CisgICAgICAgIF9kbGwgPSBzdGRjYWxsX2RsbChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIHBhc3MKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmZTc1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJmZTc1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWNjYzU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5CkBAIC0wLDAgKzEsMzkgQEAKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitjbGFzcyBDSEVDS0VEKGNfaW50KToKKyAgICBkZWYgX2NoZWNrX3JldHZhbF8odmFsdWUpOgorICAgICAgICAjIFJlY2VpdmVzIGEgQ0hFQ0tFRCBpbnN0YW5jZS4KKyAgICAgICAgcmV0dXJuIHN0cih2YWx1ZS52YWx1ZSkKKyAgICBfY2hlY2tfcmV0dmFsXyA9IHN0YXRpY21ldGhvZChfY2hlY2tfcmV0dmFsXykKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jaGVja3JldHZhbChzZWxmKToKKworICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0CisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisKKyAgICAgICAgZGxsLl90ZXN0ZnVuY19wX3AucmVzdHlwZSA9IENIRUNLRUQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiNDIiLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisKKyAgICAgICAgZGxsLl90ZXN0ZnVuY19wX3AucmVzdHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisKKyAgICAgICAgZGVsIGRsbC5fdGVzdGZ1bmNfcF9wLnJlc3R5cGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQorCisgICAgdHJ5OgorICAgICAgICBvbGVkbGwKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZGVmIHRlc3Rfb2xlZGxsKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZWRsbC5vbGVhdXQzMi5DcmVhdGVUeXBlTGliMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBOb25lLCBOb25lKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzZWI0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMzZWI0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9jaGVja3JldHZhbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2RlbGF0dHIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRkNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2RlbGF0dHIucHkKQEAgLTAsMCArMSwyMSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJmb28iLCBjX2ludCldCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXR0ciwgY19pbnQoNDIpLCAidmFsdWUiKQorCisgICAgZGVmIHRlc3RfY2hhcmFycmF5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF0dHIsIChjX2NoYXIgKiA1KSgpLCAidmFsdWUiKQorCisgICAgZGVmIHRlc3Rfc3RydWN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF0dHIsIFgoKSwgImZvbyIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4NjhjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9kZWxhdHRyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZGVsYXR0ci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4NjhjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9kZWxhdHRyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJyY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5MTNmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weQpAQCAtMCwwICsxLDE5IEBACitpbXBvcnQgc3lzCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorCisjI2NsYXNzIEhNT0RVTEUoU3RydWN0dXJlKToKKyMjICAgIF9maWVsZHNfID0gWygidmFsdWUiLCBjX3ZvaWRfcCldCisKKyMjICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyMjICAgICAgICByZXR1cm4gIjxITU9EVUxFICVzPiIgJSBzZWxmLnZhbHVlCisKKyMjd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEucmVzdHlwZSA9IEhNT0RVTEUKKworIyNwcmludCB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSgicHl0aG9uMjMuZGxsIikKKyMjcHJpbnQgaGV4KHN5cy5kbGxoYW5kbGUpCisKKyMjZGVmIG5vbnplcm8oaGFuZGxlKToKKyMjICAgIHJldHVybiAoR2V0TGFzdEVycm9yKCksIGhhbmRsZSkKKworIyN3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQS5lcnJjaGVjayA9IG5vbnplcm8KKyMjcHJpbnQgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoInNwYW0iKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2VycmNoZWNrLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiOGM4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2VycmNoZWNrLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiOGM4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJjaGVjay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTViZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHkKQEAgLTAsMCArMSw4MCBAQAoraW1wb3J0IHVuaXR0ZXN0LCBvcywgZXJybm8KK2Zyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIGN0eXBlcy51dGlsIGltcG9ydCBmaW5kX2xpYnJhcnkKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfb3BlbihzZWxmKToKKyAgICAgICAgbGliY19uYW1lID0gZmluZF9saWJyYXJ5KCJjIikKKyAgICAgICAgaWYgbGliY19uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiVW5hYmxlIHRvIGZpbmQgQyBsaWJyYXJ5IikKKyAgICAgICAgbGliYyA9IENETEwobGliY19uYW1lLCB1c2VfZXJybm89VHJ1ZSkKKyAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICAgICAgbGliY19vcGVuID0gbGliYy5fb3BlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGliY19vcGVuID0gbGliYy5vcGVuCisKKyAgICAgICAgbGliY19vcGVuLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfaW50CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaWJjX29wZW4oIiIsIDApLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJybm8oKSwgZXJybm8uRU5PRU5UKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0X2Vycm5vKDMyKSwgZXJybm8uRU5PRU5UKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJubygpLCAzMikKKworICAgICAgICBpZiB0aHJlYWRpbmc6CisgICAgICAgICAgICBkZWYgX3dvcmtlcigpOgorICAgICAgICAgICAgICAgIHNldF9lcnJubygwKQorCisgICAgICAgICAgICAgICAgbGliYyA9IENETEwobGliY19uYW1lLCB1c2VfZXJybm89RmFsc2UpCisgICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICAgICAgICAgICAgICBsaWJjX29wZW4gPSBsaWJjLl9vcGVuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGliY19vcGVuID0gbGliYy5vcGVuCisgICAgICAgICAgICAgICAgbGliY19vcGVuLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfaW50CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaWJjX29wZW4oIiIsIDApLCAtMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJubygpLCAwKQorCisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3dvcmtlcikKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgdC5qb2luKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJybm8oKSwgMzIpCisgICAgICAgICAgICBzZXRfZXJybm8oMCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLm5hbWUgPT0gIm50IiwgJ1Rlc3Qgc3BlY2lmaWMgdG8gV2luZG93cycpCisgICAgZGVmIHRlc3RfR2V0TGFzdEVycm9yKHNlbGYpOgorICAgICAgICBkbGwgPSBXaW5ETEwoImtlcm5lbDMyIiwgdXNlX2xhc3RfZXJyb3I9VHJ1ZSkKKyAgICAgICAgR2V0TW9kdWxlSGFuZGxlID0gZGxsLkdldE1vZHVsZUhhbmRsZUEKKyAgICAgICAgR2V0TW9kdWxlSGFuZGxlLmFyZ3R5cGVzID0gW2Nfd2NoYXJfcF0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIEdldE1vZHVsZUhhbmRsZSgiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2xhc3RfZXJyb3IoKSwgMTI2KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0X2xhc3RfZXJyb3IoMzIpLCAxMjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2xhc3RfZXJyb3IoKSwgMzIpCisKKyAgICAgICAgZGVmIF93b3JrZXIoKToKKyAgICAgICAgICAgIHNldF9sYXN0X2Vycm9yKDApCisKKyAgICAgICAgICAgIGRsbCA9IFdpbkRMTCgia2VybmVsMzIiLCB1c2VfbGFzdF9lcnJvcj1GYWxzZSkKKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZSA9IGRsbC5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUuYXJndHlwZXMgPSBbY193Y2hhcl9wXQorICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlKCJiYXIiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDApCisKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PV93b3JrZXIpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2xhc3RfZXJyb3IoKSwgMzIpCisKKyAgICAgICAgc2V0X2xhc3RfZXJyb3IoMCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJuby5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGY1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9lcnJuby5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGY1OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlNzg5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CkBAIC0wLDAgKzEsODIgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgaXNfcmVzb3VyY2VfZW5hYmxlZAorCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICBsaWJfZ2wgPSBmaW5kX2xpYnJhcnkoIk9wZW5HTDMyIikKKyAgICBsaWJfZ2x1ID0gZmluZF9saWJyYXJ5KCJHbHUzMiIpCisgICAgbGliX2dsZSA9IE5vbmUKK2VsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgIGxpYl9nbCA9IGxpYl9nbHUgPSBmaW5kX2xpYnJhcnkoIk9wZW5HTCIpCisgICAgbGliX2dsZSA9IE5vbmUKK2Vsc2U6CisgICAgbGliX2dsID0gZmluZF9saWJyYXJ5KCJHTCIpCisgICAgbGliX2dsdSA9IGZpbmRfbGlicmFyeSgiR0xVIikKKyAgICBsaWJfZ2xlID0gZmluZF9saWJyYXJ5KCJnbGUiKQorCisjIyBwcmludCwgZm9yIGRlYnVnZ2luZworaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgicHJpbnRpbmciKToKKyAgICBpZiBsaWJfZ2wgb3IgbGliX2dsdSBvciBsaWJfZ2xlOgorICAgICAgICBwcmludCAiT3BlbkdMIGxpYnJhcmllczoiCisgICAgICAgIGZvciBpdGVtIGluICgoIkdMIiwgbGliX2dsKSwKKyAgICAgICAgICAgICAgICAgICAgICgiR0xVIiwgbGliX2dsdSksCisgICAgICAgICAgICAgICAgICAgICAoImdsZSIsIGxpYl9nbGUpKToKKyAgICAgICAgICAgIHByaW50ICJcdCIsIGl0ZW0KKworCisjIE9uIHNvbWUgc3lzdGVtcywgbG9hZGluZyB0aGUgT3BlbkdMIGxpYnJhcmllcyBuZWVkcyB0aGUgUlRMRF9HTE9CQUwgbW9kZS4KK2NsYXNzIFRlc3RfT3BlbkdMX2xpYnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5nbCA9IHNlbGYuZ2x1ID0gc2VsZi5nbGUgPSBOb25lCisgICAgICAgIGlmIGxpYl9nbDoKKyAgICAgICAgICAgIHNlbGYuZ2wgPSBDRExMKGxpYl9nbCwgbW9kZT1SVExEX0dMT0JBTCkKKyAgICAgICAgaWYgbGliX2dsdToKKyAgICAgICAgICAgIHNlbGYuZ2x1ID0gQ0RMTChsaWJfZ2x1LCBSVExEX0dMT0JBTCkKKyAgICAgICAgaWYgbGliX2dsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmdsZSA9IENETEwobGliX2dsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGlmIGxpYl9nbDoKKyAgICAgICAgZGVmIHRlc3RfZ2woc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmdsOgorICAgICAgICAgICAgICAgIHNlbGYuZ2wuZ2xDbGVhckluZGV4CisKKyAgICBpZiBsaWJfZ2x1OgorICAgICAgICBkZWYgdGVzdF9nbHUoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmdsdToKKyAgICAgICAgICAgICAgICBzZWxmLmdsdS5nbHVCZWdpbkN1cnZlCisKKyAgICBpZiBsaWJfZ2xlOgorICAgICAgICBkZWYgdGVzdF9nbGUoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmdsZToKKyAgICAgICAgICAgICAgICBzZWxmLmdsZS5nbGVHZXRKb2luU3R5bGUKKworIyNpZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSAhPSAiZGFyd2luIjoKKworIyMgICAgIyBPbiBwbGF0Zm9ybXMgd2hlcmUgdGhlIGRlZmF1bHQgc2hhcmVkIGxpYnJhcnkgc3VmZml4IGlzICcuc28nLAorIyMgICAgIyBhdCBsZWFzdCBzb21lIGxpYnJhcmllcyBjYW4gYmUgbG9hZGVkIGFzIGF0dHJpYnV0ZXMgb2YgdGhlIGNkbGwKKyMjICAgICMgb2JqZWN0LCBzaW5jZSBjdHlwZXMgbm93IHRyaWVzIGxvYWRpbmcgdGhlIGxpYiBhZ2FpbgorIyMgICAgIyB3aXRoICcuc28nIGFwcGVuZGVkIG9mIHRoZSBmaXJzdCB0cnkgZmFpbHMuCisjIyAgICAjCisjIyAgICAjIFdvbid0IHdvcmsgZm9yIGxpYmMsIHVuZm9ydHVuYXRlbHkuICBPVE9ILCBpdCBpc24ndAorIyMgICAgIyBuZWVkZWQgZm9yIGxpYmMgc2luY2UgdGhpcyBpcyBhbHJlYWR5IG1hcHBlZCBpbnRvIHRoZSBjdXJyZW50CisjIyAgICAjIHByb2Nlc3MgKD8pCisjIyAgICAjCisjIyAgICAjIE9uIE1BQyBPU1gsIGl0IHdvbid0IHdvcmsgZWl0aGVyLCBiZWNhdXNlIGRsb3BlbigpIG5lZWRzIGEgZnVsbCBwYXRoLAorIyMgICAgIyBhbmQgdGhlIGRlZmF1bHQgc3VmZml4IGlzIGVpdGhlciBub25lIG9yICcuZHlsaWInLgorCisjIyAgICBjbGFzcyBMb2FkTGlicyh1bml0dGVzdC5UZXN0Q2FzZSk6CisjIyAgICAgICAgZGVmIHRlc3RfbGlibShzZWxmKToKKyMjICAgICAgICAgICAgaW1wb3J0IG1hdGgKKyMjICAgICAgICAgICAgbGlibSA9IGNkbGwubGlibQorIyMgICAgICAgICAgICBzcXJ0ID0gbGlibS5zcXJ0CisjIyAgICAgICAgICAgIHNxcnQuYXJndHlwZXMgPSAoY19kb3VibGUsKQorIyMgICAgICAgICAgICBzcXJ0LnJlc3R5cGUgPSBjX2RvdWJsZQorIyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxcnQoMiksIG1hdGguc3FydCgyKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGIzODI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGIzODI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI0ZmI3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5CkBAIC0wLDAgKzEsODEgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBnYworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFgoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImNfaW50IiwgY19pbnQpXQorICAgIGluaXRfY2FsbGVkID0gRmFsc2UKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2luaXRfY2FsbGVkID0gVHJ1ZQorCitjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mb21fYnVmZmVyKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoImkiLCByYW5nZSgxNikpCisgICAgICAgIHggPSAoY19pbnQgKiAxNikuZnJvbV9idWZmZXIoYSkKKworICAgICAgICB5ID0gWC5mcm9tX2J1ZmZlcihhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuY19pbnQsIGFbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeS5pbml0X2NhbGxlZCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbOl0sIGEudG9saXN0KCkpCisKKyAgICAgICAgYVswXSwgYVstMV0gPSAyMDAsIC0yMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCBhLnRvbGlzdCgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGluIHguX29iamVjdHMudmFsdWVzKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY19pbnQuZnJvbV9idWZmZXIsIGEsIC0xKQorCisgICAgICAgIGV4cGVjdGVkID0geFs6XQorICAgICAgICBkZWwgYTsgZ2MuY29sbGVjdCgpOyBnYy5jb2xsZWN0KCk7IGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbOl0sIGV4cGVjdGVkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNfY2hhciAqIDE2KS5mcm9tX2J1ZmZlciwgImEiICogMTYpCisKKyAgICBkZWYgdGVzdF9mb21fYnVmZmVyX3dpdGhfb2Zmc2V0KHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoImkiLCByYW5nZSgxNikpCisgICAgICAgIHggPSAoY19pbnQgKiAxNSkuZnJvbV9idWZmZXIoYSwgc2l6ZW9mKGNfaW50KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbOl0sIGEudG9saXN0KClbMTpdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IChjX2ludCAqIDE2KS5mcm9tX2J1ZmZlcihhLCBzaXplb2YoY19pbnQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAoY19pbnQgKiAxKS5mcm9tX2J1ZmZlcihhLCAxNiAqIHNpemVvZihjX2ludCkpKQorCisgICAgZGVmIHRlc3RfZnJvbV9idWZmZXJfY29weShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCJpIiwgcmFuZ2UoMTYpKQorICAgICAgICB4ID0gKGNfaW50ICogMTYpLmZyb21fYnVmZmVyX2NvcHkoYSkKKworICAgICAgICB5ID0gWC5mcm9tX2J1ZmZlcl9jb3B5KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5jX2ludCwgYVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh5LmluaXRfY2FsbGVkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgcmFuZ2UoMTYpKQorCisgICAgICAgIGFbMF0sIGFbLTFdID0gMjAwLCAtMjAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgcmFuZ2UoMTYpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjX2ludC5mcm9tX2J1ZmZlciwgYSwgLTEpCisKKyAgICAgICAgZGVsIGE7IGdjLmNvbGxlY3QoKTsgZ2MuY29sbGVjdCgpOyBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCByYW5nZSgxNikpCisKKyAgICAgICAgeCA9IChjX2NoYXIgKiAxNikuZnJvbV9idWZmZXJfY29weSgiYSIgKiAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCAiYSIgKiAxNikKKworICAgIGRlZiB0ZXN0X2ZvbV9idWZmZXJfY29weV93aXRoX29mZnNldChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCJpIiwgcmFuZ2UoMTYpKQorICAgICAgICB4ID0gKGNfaW50ICogMTUpLmZyb21fYnVmZmVyX2NvcHkoYSwgc2l6ZW9mKGNfaW50KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbOl0sIGEudG9saXN0KClbMTpdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoY19pbnQgKiAxNikuZnJvbV9idWZmZXJfY29weSwgYSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGNfaW50ICogMSkuZnJvbV9idWZmZXJfY29weSwgYSwgMTYgKiBzaXplb2YoY19pbnQpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Zjk1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnJvbWJ1ZmZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Zjk1YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnJvbWJ1ZmZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWFmNWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKQEAgLTAsMCArMSwxMjcgQEAKK2ltcG9ydCBvcywgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK3RyeToKKyAgICBXSU5GVU5DVFlQRQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAjIGZha2UgdG8gZW5hYmxlIHRoaXMgdGVzdCBvbiBMaW51eAorICAgIFdJTkZVTkNUWVBFID0gQ0ZVTkNUWVBFCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKK2xpYiA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCitjbGFzcyBDRnVuY1B0clRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgWCA9IFdJTkZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQpCisKKyAgICAgICAgZGVmIGZ1bmMoKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIGxlbihhcmdzKQorCisgICAgICAgIHggPSBYKGZ1bmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5yZXN0eXBlLCBjX2ludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmFyZ3R5cGVzLCAoY19pbnQsIGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIHNpemVvZihjX3ZvaWRwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3ZvaWRwKSkKKworICAgIGRlZiB0ZXN0X2ZpcnN0KHNlbGYpOgorICAgICAgICBTdGRDYWxsYmFjayA9IFdJTkZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQpCisgICAgICAgIENkZWNsQ2FsbGJhY2sgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBjX2ludCkKKworICAgICAgICBkZWYgZnVuYyhhLCBiKToKKyAgICAgICAgICAgIHJldHVybiBhICsgYgorCisgICAgICAgIHMgPSBTdGRDYWxsYmFjayhmdW5jKQorICAgICAgICBjID0gQ2RlY2xDYWxsYmFjayhmdW5jKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocygxLCAyKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjKDEsIDIpLCAzKQorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgbm8gbG9uZ2VyIHJhaXNlcyBhIFR5cGVFcnJvciAtIGl0IGlzIG5vdworICAgICAgICAjIHBvc3NpYmxlLCBhcyBpbiBDLCB0byBjYWxsIGNkZWNsIGZ1bmN0aW9ucyB3aXRoIG1vcmUgcGFyYW1ldGVycy4KKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYywgMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjKDEsIDIsIDMsIDQsIDUsIDYpLCAzKQorICAgICAgICBpZiBub3QgV0lORlVOQ1RZUEUgaXMgQ0ZVTkNUWVBFIGFuZCBvcy5uYW1lICE9ICJjZSI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHMsIDEsIDIsIDMpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3R1cmVzKHNlbGYpOgorICAgICAgICBXTkRQUk9DID0gV0lORlVOQ1RZUEUoY19sb25nLCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKKworICAgICAgICBkZWYgd25kcHJvYyhod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKToKKyAgICAgICAgICAgIHJldHVybiBod25kICsgbXNnICsgd1BhcmFtICsgbFBhcmFtCisKKyAgICAgICAgSElOU1RBTkNFID0gY19pbnQKKyAgICAgICAgSElDT04gPSBjX2ludAorICAgICAgICBIQ1VSU09SID0gY19pbnQKKyAgICAgICAgTFBDVFNUUiA9IGNfY2hhcl9wCisKKyAgICAgICAgY2xhc3MgV05EQ0xBU1MoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygic3R5bGUiLCBjX3VpbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJscGZuV25kUHJvYyIsIFdORFBST0MpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjYkNsc0V4dHJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJjYlduZEV4dHJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJoSW5zdGFuY2UiLCBISU5TVEFOQ0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJoSWNvbiIsIEhJQ09OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaEN1cnNvciIsIEhDVVJTT1IpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJscHN6TWVudU5hbWUiLCBMUENUU1RSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibHBzekNsYXNzTmFtZSIsIExQQ1RTVFIpXQorCisgICAgICAgIHduZGNsYXNzID0gV05EQ0xBU1MoKQorICAgICAgICB3bmRjbGFzcy5scGZuV25kUHJvYyA9IFdORFBST0Mod25kcHJvYykKKworICAgICAgICBXTkRQUk9DXzIgPSBXSU5GVU5DVFlQRShjX2xvbmcsIGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50KQorCisgICAgICAgICMgVGhpcyBpcyBubyBsb25nZXIgdHJ1ZSwgbm93IHRoYXQgV0lORlVOQ1RZUEUgY2FjaGVzIGNyZWF0ZWQgdHlwZXMgaW50ZXJuYWxseS4KKyAgICAgICAgIyMgIyBDRnVuY1B0ciBzdWJjbGFzc2VzIGFyZSBjb21wYXJlZCBieSBpZGVudGl0eSwgc28gdGhpcyByYWlzZXMgYSBUeXBlRXJyb3I6CisgICAgICAgICMjIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgd25kY2xhc3MsCisgICAgICAgICMjICAgICAgICAgICAgICAgICAgImxwZm5XbmRQcm9jIiwgV05EUFJPQ18yKHduZHByb2MpKQorICAgICAgICAjIGluc3RlYWQ6CisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFdORFBST0MgaXMgV05EUFJPQ18yKQorICAgICAgICAjICd3bmRjbGFzcy5scGZuV25kUHJvYycgbGVha3MgOTQgcmVmZXJlbmNlcy4gIFdoeT8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3bmRjbGFzcy5scGZuV25kUHJvYygxLCAyLCAzLCA0KSwgMTApCisKKworICAgICAgICBmID0gd25kY2xhc3MubHBmblduZFByb2MKKworICAgICAgICBkZWwgd25kY2xhc3MKKyAgICAgICAgZGVsIHduZHByb2MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoMTAsIDExLCAxMiwgMTMpLCA0NikKKworICAgIGRlZiB0ZXN0X2RsbGZ1bmN0aW9ucyhzZWxmKToKKworICAgICAgICBkZWYgTm9OdWxsSGFuZGxlKHZhbHVlKToKKyAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICByYWlzZSBXaW5FcnJvcigpCisgICAgICAgICAgICByZXR1cm4gdmFsdWUKKworICAgICAgICBzdHJjaHIgPSBsaWIubXlfc3RyY2hyCisgICAgICAgIHN0cmNoci5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgc3RyY2hyLmFyZ3R5cGVzID0gKGNfY2hhcl9wLCBjX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWZnaGkiLCAiYiIpLCAiYmNkZWZnaGkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmZ2hpIiwgIngiKSwgTm9uZSkKKworCisgICAgICAgIHN0cnRvayA9IGxpYi5teV9zdHJ0b2sKKyAgICAgICAgc3RydG9rLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICAjIE5laXRoZXIgb2YgdGhpcyBkb2VzIHdvcms6IHN0cnRvayBjaGFuZ2VzIHRoZSBidWZmZXIgaXQgaXMgcGFzc2VkCisjIyAgICAgICAgc3RydG9rLmFyZ3R5cGVzID0gKGNfY2hhcl9wLCBjX2NoYXJfcCkKKyMjICAgICAgICBzdHJ0b2suYXJndHlwZXMgPSAoY19zdHJpbmcsIGNfY2hhcl9wKQorCisgICAgICAgIGRlZiBjX3N0cmluZyhpbml0KToKKyAgICAgICAgICAgIHNpemUgPSBsZW4oaW5pdCkgKyAxCisgICAgICAgICAgICByZXR1cm4gKGNfY2hhcipzaXplKSgqaW5pdCkKKworICAgICAgICBzID0gImFcbmJcbmMiCisgICAgICAgIGIgPSBjX3N0cmluZyhzKQorCisjIyAgICAgICAgYiA9IChjX2NoYXIgKiAobGVuKHMpKzEpKSgpCisjIyAgICAgICAgYi52YWx1ZSA9IHMKKworIyMgICAgICAgIGIgPSBjX3N0cmluZyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnRvayhiLCAiXG4iKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnRvayhOb25lLCAiXG4iKSwgImIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnRvayhOb25lLCAiXG4iKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnRvayhOb25lLCAiXG4iKSwgTm9uZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQxZmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmQxZmJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmQzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5CkBAIC0wLDAgKzEsNDEyIEBACisiIiIKK0hlcmUgaXMgcHJvYmFibHkgdGhlIHBsYWNlIHRvIHdyaXRlIHRoZSBkb2NzLCBzaW5jZSB0aGUgdGVzdC1jYXNlcworc2hvdyBob3cgdGhlIHR5cGUgYmVoYXZlLgorCitMYXRlci4uLgorIiIiCisKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgc3lzLCB1bml0dGVzdAorCit0cnk6CisgICAgV0lORlVOQ1RZUEUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBmYWtlIHRvIGVuYWJsZSB0aGlzIHRlc3Qgb24gTGludXgKKyAgICBXSU5GVU5DVFlQRSA9IENGVU5DVFlQRQorCitpbXBvcnQgX2N0eXBlc190ZXN0CitkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKK2lmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgIHdpbmRsbCA9IFdpbkRMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKK2NsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCldCitjbGFzcyBSRUNUKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJsZWZ0IiwgY19pbnQpLCAoInRvcCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAoInJpZ2h0IiwgY19pbnQpLCAoImJvdHRvbSIsIGNfaW50KV0KK2NsYXNzIEZ1bmN0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbXJvKHNlbGYpOgorICAgICAgICAjIGluIFB5dGhvbiAyLjMsIHRoaXMgcmFpc2VzIFR5cGVFcnJvcjogTVJPIGNvbmZsaWN0IGFtb25nIGJhc2VzIGNsYXNzZXMsCisgICAgICAgICMgaW4gUHl0aG9uIDIuMiBpdCB3b3Jrcy4KKyAgICAgICAgIworICAgICAgICAjIEJ1dCBpbiBlYXJseSB2ZXJzaW9ucyBvZiBfY3R5cGVzLmMsIHRoZSByZXN1bHQgb2YgdHBfbmV3CisgICAgICAgICMgd2Fzbid0IGNoZWNrZWQsIGFuZCBpdCBldmVuIGNyYXNoZWQgUHl0aG9uLgorICAgICAgICAjIEZvdW5kIGJ5IEdyZWcgQ2hhcG1hbi4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCwgQXJyYXkpOgorICAgICAgICAgICAgICAgIF9sZW5ndGhfID0gNQorICAgICAgICAgICAgICAgIF90eXBlXyA9ICJpIgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisKKyAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBfUG9pbnRlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCwgX1BvaW50ZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCwgX1NpbXBsZUNEYXRhKToKKyAgICAgICAgICAgICAgICBfdHlwZV8gPSAiaSIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCwgU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFtdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKworICAgIGRlZiB0ZXN0X3djaGFyX3Bhcm0oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNfd2NoYXIKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19pX2JoaWxmZAorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY193Y2hhciwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIHJlc3VsdCA9IGYoMSwgdSJ4IiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAxMzkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisKKyAgICBkZWYgdGVzdF93Y2hhcl9yZXN1bHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNfd2NoYXIKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19pX2JoaWxmZAorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIGYucmVzdHlwZSA9IGNfd2NoYXIKKyAgICAgICAgcmVzdWx0ID0gZigwLCAwLCAwLCAwLCAwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgdSdceDAwJykKKworICAgIGRlZiB0ZXN0X3ZvaWRyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX3YKKyAgICAgICAgZi5yZXN0eXBlID0gTm9uZQorICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBjX2ludCwgUE9JTlRFUihjX2ludCldCisgICAgICAgIHJlc3VsdCA9IGNfaW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmKDEsIDIsIGJ5cmVmKHJlc3VsdCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC52YWx1ZSwgMykKKworICAgIGRlZiB0ZXN0X2ludHJlc3VsdChzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQorICAgICAgICBmLnJlc3R5cGUgPSBjX2ludAorICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisKKyAgICAgICAgcmVzdWx0ID0gZigtMSwgLTIsIC0zLCAtNCwgLTUuMCwgLTYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0yMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKKworICAgICAgICAjIElmIHdlIGRlY2xhcmUgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBhIHNob3J0LAorICAgICAgICAjIGlzIHRoZSBoaWdoIHBhcnQgc3BsaXQgb2ZmPworICAgICAgICBmLnJlc3R5cGUgPSBjX3Nob3J0CisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKKworICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDB4MTAwMDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisKKyAgICAgICAgIyBZb3UgY2Fubm90IGFzc2lnbiBjaGFyYWN0ZXIgZm9ybWF0IGNvZGVzIGFzIHJlc3R5cGUgYW55IGxvbmdlcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGYsICJyZXN0eXBlIiwgImkiKQorCisgICAgZGVmIHRlc3RfZmxvYXRyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2ZfYmhpbGZkCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KKyAgICAgICAgZi5yZXN0eXBlID0gY19mbG9hdAorICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKworICAgICAgICByZXN1bHQgPSBmKC0xLCAtMiwgLTMsIC00LCAtNS4wLCAtNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisKKyAgICBkZWYgdGVzdF9kb3VibGVyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2RfYmhpbGZkCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KKyAgICAgICAgZi5yZXN0eXBlID0gY19kb3VibGUKKyAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisKKyAgICAgICAgcmVzdWx0ID0gZigtMSwgLTIsIC0zLCAtNCwgLTUuMCwgLTYuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0yMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorCisgICAgZGVmIHRlc3RfbG9uZ2RvdWJsZXJlc3VsdChzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfRF9iaGlsZkQKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfbG9uZ2RvdWJsZV0KKyAgICAgICAgZi5yZXN0eXBlID0gY19sb25nZG91YmxlCisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorCisgICAgICAgIHJlc3VsdCA9IGYoLTEsIC0yLCAtMywgLTQsIC01LjAsIC02LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKworICAgIGRlZiB0ZXN0X2xvbmdsb25ncmVzdWx0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjX2xvbmdsb25nCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcV9iaGlsZmQKKyAgICAgICAgZi5yZXN0eXBlID0gY19sb25nbG9uZworICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKworICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19xX2JoaWxmZHEKKyAgICAgICAgZi5yZXN0eXBlID0gY19sb25nbG9uZworICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGUsIGNfbG9uZ2xvbmddCisgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjAsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNDIpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdyZXN1bHQoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmLmFyZ3R5cGVzID0gTm9uZQorICAgICAgICBmLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICByZXN1bHQgPSBmKCIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgIjEyMyIpCisKKyAgICAgICAgcmVzdWx0ID0gZihOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZi5yZXN0eXBlID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgZi5hcmd0eXBlcyA9IFtQT0lOVEVSKGNfaW50KV0KKworICAgICAgICAjIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgdmFsdWUgY19pbnQoNDIpIHBhc3NlZCB0byB0aGUKKyAgICAgICAgIyBmdW5jdGlvbiBpcyBzdGlsbCBhbGl2ZSB3aGlsZSB0aGUgcG9pbnRlciAodGhlIHJlc3VsdCkgaXMKKyAgICAgICAgIyB1c2VkLgorCisgICAgICAgIHYgPSBjX2ludCg0MikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvaW50ZXIodikuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICByZXN1bHQgPSBmKHBvaW50ZXIodikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBQT0lOVEVSKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDQyKQorCisgICAgICAgICMgVGhpcyBvbiB3b3Jrcy4uLgorICAgICAgICByZXN1bHQgPSBmKHBvaW50ZXIodikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCB2LnZhbHVlKQorCisgICAgICAgIHAgPSBwb2ludGVyKGNfaW50KDk5KSkKKyAgICAgICAgcmVzdWx0ID0gZihwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgOTkpCisKKyAgICAgICAgYXJnID0gYnlyZWYodikKKyAgICAgICAgcmVzdWx0ID0gZihhcmcpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVzdWx0LmNvbnRlbnRzLCB2LnZhbHVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGYsIGJ5cmVmKGNfc2hvcnQoMjIpKSkKKworICAgICAgICAjIEl0IGlzIGRhbmdlcm91cywgaG93ZXZlciwgYmVjYXVzZSB5b3UgZG9uJ3QgY29udHJvbCB0aGUgbGlmZXRpbWUKKyAgICAgICAgIyBvZiB0aGUgcG9pbnRlcjoKKyAgICAgICAgcmVzdWx0ID0gZihieXJlZihjX2ludCg5OSkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlc3VsdC5jb250ZW50cywgOTkpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmLnJlc3R5cGUgPSBjX2ludAorCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieSIsIGNfaW50KV0KKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIFgoKSkgI2Nhbm5vdCBjb252ZXJ0IHBhcmFtZXRlcgorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgIGRlZiB0ZXN0X3Nob3J0cyhzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfaV9pZgorCisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBleHBlY3RlZCA9IFsyNjIxNDQsIDEzMTA3MiwgNjU1MzYsIDMyNzY4LCAxNjM4NCwgODE5MiwgNDA5NiwgMjA0OCwKKyAgICAgICAgICAgICAgICAgICAgMTAyNCwgNTEyLCAyNTYsIDEyOCwgNjQsIDMyLCAxNiwgOCwgNCwgMiwgMV0KKworICAgICAgICBkZWYgY2FsbGJhY2sodik6CisgICAgICAgICAgICBhcmdzLmFwcGVuZCh2KQorICAgICAgICAgICAgcmV0dXJuIHYKKworICAgICAgICBDYWxsQmFjayA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpCisKKyAgICAgICAgY2IgPSBDYWxsQmFjayhjYWxsYmFjaykKKyAgICAgICAgZigyKioxOCwgY2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgZXhwZWN0ZWQpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrcyhzZWxmKToKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfaV9pZgorICAgICAgICBmLnJlc3R5cGUgPSBjX2ludAorICAgICAgICBmLmFyZ3R5cGVzID0gTm9uZQorCisgICAgICAgIE15Q2FsbGJhY2sgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CisgICAgICAgICAgICAjcHJpbnQgImNhbGxlZCBiYWNrIHdpdGgiLCB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICByZXN1bHQgPSBmKC0xMCwgY2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMTgpCisKKyAgICAgICAgIyB0ZXN0IHdpdGggcHJvdG90eXBlCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19pbnQsIE15Q2FsbGJhY2tdCisgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKKyAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQorCisgICAgICAgIEFub3RoZXJDYWxsYmFjayA9IFdJTkZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKKworICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHByb3RvdHlwZSB3b3Jrczogd2UgY2FsbCBmIHdpdGggd3JvbmcKKyAgICAgICAgIyBhcmd1bWVudCB0eXBlcworICAgICAgICBjYiA9IEFub3RoZXJDYWxsYmFjayhjYWxsYmFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZiwgLTEwLCBjYikKKworCisgICAgZGVmIHRlc3RfY2FsbGJhY2tzXzIoc2VsZik6CisgICAgICAgICMgQ2FuIGFsc28gdXNlIHNpbXBsZSBkYXRhdHlwZXMgYXMgYXJndW1lbnQgdHlwZSBzcGVjaWZpZXJzCisgICAgICAgICMgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbi4KKyAgICAgICAgIyBJbiB0aGlzIGNhc2UgdGhlIGNhbGwgcmVjZWl2ZXMgYW4gaW5zdGFuY2Ugb2YgdGhhdCB0eXBlCisgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2NhbGxiYWNrX2lfaWYKKyAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKKworICAgICAgICBNeUNhbGxiYWNrID0gQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCkKKworICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBNeUNhbGxiYWNrXQorCisgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CisgICAgICAgICAgICAjcHJpbnQgImNhbGxlZCBiYWNrIHdpdGgiLCB2YWx1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgaW50KQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICByZXN1bHQgPSBmKC0xMCwgY2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMTgpCisKKyAgICBkZWYgdGVzdF9sb25nbG9uZ19jYWxsYmFja3Moc2VsZik6CisKKyAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfY2FsbGJhY2tfcV9xZgorICAgICAgICBmLnJlc3R5cGUgPSBjX2xvbmdsb25nCisKKyAgICAgICAgTXlDYWxsYmFjayA9IENGVU5DVFlQRShjX2xvbmdsb25nLCBjX2xvbmdsb25nKQorCisgICAgICAgIGYuYXJndHlwZXMgPSBbY19sb25nbG9uZywgTXlDYWxsYmFja10KKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKSkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmIDB4N0ZGRkZGRkYKKworICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMzU3NzYyNTU4NywgZigxMDAwMDAwMDAwMDAwLCBjYikpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCBkbGwsICJfeHh4X3l5eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfaW50LmluX2RsbCwgZGxsLCAiX3h4eF95eXkiKQorCisgICAgZGVmIHRlc3RfYnl2YWwoc2VsZik6CisKKyAgICAgICAgIyB3aXRob3V0IHByb3RvdHlwZQorICAgICAgICBwdGluID0gUE9JTlQoMSwgMikKKyAgICAgICAgcHRvdXQgPSBQT0lOVCgpCisgICAgICAgICMgRVhQT1JUIGludCBfdGVzdGZ1bmNfYnl2YWwocG9pbnQgaW4sIHBvaW50ICpwb3V0KQorICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHB0aW4sIGJ5cmVmKHB0b3V0KSkKKyAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CisgICAgICAgIGV4cGVjdGVkID0gMywgMSwgMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgIyB3aXRoIHByb3RvdHlwZQorICAgICAgICBwdGluID0gUE9JTlQoMTAxLCAxMDIpCisgICAgICAgIHB0b3V0ID0gUE9JTlQoKQorICAgICAgICBkbGwuX3Rlc3RmdW5jX2J5dmFsLmFyZ3R5cGVzID0gKFBPSU5ULCBQT0lOVEVSKFBPSU5UKSkKKyAgICAgICAgZGxsLl90ZXN0ZnVuY19ieXZhbC5yZXN0eXBlID0gY19pbnQKKyAgICAgICAgcmVzdWx0ID0gZGxsLl90ZXN0ZnVuY19ieXZhbChwdGluLCBieXJlZihwdG91dCkpCisgICAgICAgIGdvdCA9IHJlc3VsdCwgcHRvdXQueCwgcHRvdXQueQorICAgICAgICBleHBlY3RlZCA9IDIwMywgMTAxLCAxMDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl8ySChzZWxmKToKKyAgICAgICAgY2xhc3MgUzJIKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfc2hvcnQpXQorICAgICAgICBkbGwucmV0XzJoX2Z1bmMucmVzdHlwZSA9IFMySAorICAgICAgICBkbGwucmV0XzJoX2Z1bmMuYXJndHlwZXMgPSBbUzJIXQorICAgICAgICBpbnAgPSBTMkgoOTksIDg4KQorICAgICAgICBzMmggPSBkbGwucmV0XzJoX2Z1bmMoaW5wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzMmgueCwgczJoLnkpLCAoOTkqMiwgODgqMykpCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl8ySF9zdGRjYWxsKHNlbGYpOgorICAgICAgICAgICAgY2xhc3MgUzJIKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19zaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19zaG9ydCldCisKKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLnJlc3R5cGUgPSBTMkgKKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KKyAgICAgICAgICAgIHMyaCA9IHdpbmRsbC5zX3JldF8yaF9mdW5jKFMySCg5OSwgODgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQorCisgICAgIyBUaGlzIGlzIGtub3duIGNkZWNsIGluY29tcGF0aWJpbGl0eSBiZXR3ZWVuIEdDQworICAgICMgYW5kIE1TVkMuIEl0IGlzIGFkZHJlc3NlZCBpbiBHQ0MgaXNzdWUgIzM2ODM0LgorICAgICMgUHl0aG9uIGxpYmZmaSBkZXRlY3QgaXQgYW5kIGNvbXBsYWluLgorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIgYW5kIHN5cy52ZXJzaW9uLmZpbmQoIkdDQyIpID49IDAsICdYRkFJTCBHQ0MobWluZ3cpJykKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzhIKHNlbGYpOgorICAgICAgICBjbGFzcyBTOEkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZyIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfaW50KV0KKyAgICAgICAgZGxsLnJldF84aV9mdW5jLnJlc3R5cGUgPSBTOEkKKyAgICAgICAgZGxsLnJldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KKyAgICAgICAgaW5wID0gUzhJKDksIDgsIDcsIDYsIDUsIDQsIDMsIDIpCisgICAgICAgIHM4aSA9IGRsbC5yZXRfOGlfZnVuYyhpbnApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg5KjIsIDgqMywgNyo0LCA2KjUsIDUqNiwgNCo3LCAzKjgsIDIqOSkpCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl84SF9zdGRjYWxsKHNlbGYpOgorICAgICAgICAgICAgY2xhc3MgUzhJKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImYiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJnIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfaW50KV0KKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF84aV9mdW5jLnJlc3R5cGUgPSBTOEkKKyAgICAgICAgICAgIHdpbmRsbC5zX3JldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KKyAgICAgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQorICAgICAgICAgICAgczhpID0gd2luZGxsLnNfcmV0XzhpX2Z1bmMoaW5wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczhpLmEsIHM4aS5iLCBzOGkuYywgczhpLmQsIHM4aS5lLCBzOGkuZiwgczhpLmcsIHM4aS5oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg5KjIsIDgqMywgNyo0LCA2KjUsIDUqNiwgNCo3LCAzKjgsIDIqOSkpCisKKyAgICBkZWYgdGVzdF9zZjE2NTEyMzUoc2VsZik6CisgICAgICAgICMgc2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi8xNjUxMjM1CisKKyAgICAgICAgcHJvdG8gPSBDRlVOQ1RZUEUoY19pbnQsIFJFQ1QsIFBPSU5UKQorICAgICAgICBkZWYgY2FsbGJhY2soKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBjYWxsYmFjayA9IHByb3RvKGNhbGxiYWNrKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBsYW1iZGE6IGNhbGxiYWNrKCgxLCAyLCAzLCA0KSwgUE9JTlQoKSkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOTEzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOTEzZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDNlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weQpAQCAtMCwwICsxLDQyIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGhlIGluY29tcGxldGUgcG9pbnRlciBleGFtcGxlIGZyb20gdGhlIHR1dG9yaWFsCisjCisKK2NsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW5jb21wbGV0ZV9leGFtcGxlKHNlbGYpOgorICAgICAgICBscGNlbGwgPSBQT0lOVEVSKCJjZWxsIikKKyAgICAgICAgY2xhc3MgY2VsbChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyX3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJuZXh0IiwgbHBjZWxsKV0KKworICAgICAgICBTZXRQb2ludGVyVHlwZShscGNlbGwsIGNlbGwpCisKKyAgICAgICAgYzEgPSBjZWxsKCkKKyAgICAgICAgYzEubmFtZSA9ICJmb28iCisgICAgICAgIGMyID0gY2VsbCgpCisgICAgICAgIGMyLm5hbWUgPSAiYmFyIgorCisgICAgICAgIGMxLm5leHQgPSBwb2ludGVyKGMyKQorICAgICAgICBjMi5uZXh0ID0gcG9pbnRlcihjMSkKKworICAgICAgICBwID0gYzEKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSg4KToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocC5uYW1lKQorICAgICAgICAgICAgcCA9IHAubmV4dFswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWyJmb28iLCAiYmFyIl0gKiA0KQorCisgICAgICAgICMgdG8gbm90IGxlYWsgcmVmZXJlbmNlcywgd2UgbXVzdCBjbGVhbiBfcG9pbnRlcl90eXBlX2NhY2hlCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBfcG9pbnRlcl90eXBlX2NhY2hlCisgICAgICAgIGRlbCBfcG9pbnRlcl90eXBlX2NhY2hlW2NlbGxdCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmUwZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmUwZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiZDFmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5CkBAIC0wLDAgKzEsNDAgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAoImIiLCBjX2ludCldCisgICAgbmV3X3dhc19jYWxsZWQgPSBGYWxzZQorCisgICAgZGVmIF9fbmV3X18oY2xzKToKKyAgICAgICAgcmVzdWx0ID0gc3VwZXIoWCwgY2xzKS5fX25ld19fKGNscykKKyAgICAgICAgcmVzdWx0Lm5ld193YXNfY2FsbGVkID0gVHJ1ZQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYSA9IDkKKyAgICAgICAgc2VsZi5iID0gMTIKKworY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygieCIsIFgpXQorCisKK2NsYXNzIEluaXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoZSBvbmx5IGFjY2Vzc2luZyBhIG5lc3RlZCBzdHJ1Y3R1cmUKKyAgICAgICAgIyBkb2Vzbid0IGNhbGwgdGhlIHN0cnVjdHVyZSdzIF9fbmV3X18gYW5kIF9faW5pdF9fCisgICAgICAgIHkgPSBZKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeS54LmEsIHkueC5iKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkueC5uZXdfd2FzX2NhbGxlZCwgRmFsc2UpCisKKyAgICAgICAgIyBCdXQgZXhwbGljaXRseSBjcmVhdGluZyBhbiBYIHN0cnVjdHVyZSBjYWxscyBfX25ld19fIGFuZCBfX2luaXRfXywgb2YgY291cnNlLgorICAgICAgICB4ID0gWCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguYSwgeC5iKSwgKDksIDEyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm5ld193YXNfY2FsbGVkLCBUcnVlKQorCisgICAgICAgIHkueCA9IHgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeS54LmEsIHkueC5iKSwgKDksIDEyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LngubmV3X3dhc19jYWxsZWQsIEZhbHNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjgyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjgyYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjQ1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHkKQEAgLTAsMCArMSw1IEBACisjIHN1cGVyc2VlZGVkIGJ5IHRlc3RfbnVtYmVycy5weQoraW1wb3J0IHVuaXR0ZXN0CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY1ZTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZWdlcnMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY1ZTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVnZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTViMWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weQpAQCAtMCwwICsxLDEwMyBAQAorIyBUaGlzIHRlc3RzIHRoZSBpbnRlcm5hbCBfb2JqZWN0cyBhdHRyaWJ1dGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKKworIyBYWFggVGhpcyB0ZXN0IG11c3QgYmUgcmV2aWV3ZWQgZm9yIGNvcnJlY3RuZXNzISEhCisKKyIiIgorY3R5cGVzJyB0eXBlcyBhcmUgY29udGFpbmVyIHR5cGVzLgorCitUaGV5IGhhdmUgYW4gaW50ZXJuYWwgbWVtb3J5IGJsb2NrLCB3aGljaCBvbmx5IGNvbnNpc3RzIG9mIHNvbWUgYnl0ZXMsCitidXQgaXQgaGFzIHRvIGtlZXAgcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzIGFzIHdlbGwuIFRoaXMgaXMgbm90CityZWFsbHkgbmVlZGVkIGZvciB0cml2aWFsIEMgdHlwZXMgbGlrZSBpbnQgb3IgY2hhciwgYnV0IGl0IGlzIGltcG9ydGFudAorZm9yIGFnZ3JlZ2F0ZSB0eXBlcyBsaWtlIHN0cmluZ3Mgb3IgcG9pbnRlcnMgaW4gcGFydGljdWxhci4KKworV2hhdCBhYm91dCBwb2ludGVycz8KKworIiIiCisKK2NsYXNzIE9iamVjdHNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGFzc2VydFNhbWUoc2VsZiwgYSwgYik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoYSksIGlkKGIpKQorCisgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKKyAgICAgICAgaSA9IDQyMDAwMTIzCisgICAgICAgIHJlZmNudCA9IGdyYyhpKQorICAgICAgICBjaSA9IGNfaW50KGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmY250LCBncmMoaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2kuX29iamVjdHMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jX2NoYXJfcChzZWxmKToKKyAgICAgICAgcyA9ICJIZWxsbywgV29ybGQiCisgICAgICAgIHJlZmNudCA9IGdyYyhzKQorICAgICAgICBjcyA9IGNfY2hhcl9wKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVmY250ICsgMSwgZ3JjKHMpKQorICAgICAgICBzZWxmLmFzc2VydFNhbWUoY3MuX29iamVjdHMsIHMpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfc3RydWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksICgiYiIsIGNfaW50KV0KKworICAgICAgICBhID0gNDIxMjM0CisgICAgICAgIGIgPSA0MjEyMzUKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCisgICAgICAgIHguYSA9IGEKKyAgICAgICAgeC5iID0gYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9lbWJlZGRlZF9zdHJ1Y3RzKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksICgiYiIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBYKSwgKCJ5IiwgWCldCisKKyAgICAgICAgeSA9IFkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX29iamVjdHMsIE5vbmUpCisKKyAgICAgICAgeDEsIHgyID0gWCgpLCBYKCkKKyAgICAgICAgeS54LCB5LnkgPSB4MSwgeDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9vYmplY3RzLCB7IjAiOiB7fSwgIjEiOiB7fX0pCisgICAgICAgIHgxLmEsIHgyLmIgPSA0MiwgOTMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9vYmplY3RzLCB7IjAiOiB7fSwgIjEiOiB7fX0pCisKKyAgICBkZWYgdGVzdF94eHgoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfY2hhcl9wKSwgKCJiIiwgY19jaGFyX3ApXQorCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIFgpLCAoInkiLCBYKV0KKworICAgICAgICBzMSA9ICJIZWxsbywgV29ybGQiCisgICAgICAgIHMyID0gIkhhbGxvLCBXZWx0IgorCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC5hID0gczEKKyAgICAgICAgeC5iID0gczIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCB7IjAiOiBzMSwgIjEiOiBzMn0pCisKKyAgICAgICAgeSA9IFkoKQorICAgICAgICB5LnggPSB4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgeyIwIjogeyIwIjogczEsICIxIjogczJ9fSkKKyMjICAgICAgICB4ID0geS54CisjIyAgICAgICAgZGVsIHkKKyMjICAgICAgICBwcmludCB4Ll9iX2Jhc2VfLl9vYmplY3RzCisKKyAgICBkZWYgdGVzdF9wdHJfc3RydWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImRhdGEiLCBQT0lOVEVSKGNfaW50KSldCisKKyAgICAgICAgQSA9IGNfaW50KjQKKyAgICAgICAgYSA9IEEoMTEsIDIyLCAzMywgNDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fb2JqZWN0cywgTm9uZSkKKworICAgICAgICB4ID0gWCgpCisgICAgICAgIHguZGF0YSA9IGEKKyMjWFhYICAgICAgICBwcmludCB4Ll9vYmplY3RzCisjI1hYWCAgICAgICAgcHJpbnQgeC5kYXRhWzBdCisjI1hYWCAgICAgICAgcHJpbnQgeC5kYXRhLl9vYmplY3RzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTYyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OTYyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwNGMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weQpAQCAtMCwwICsxLDE1MiBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBTaW1wbGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY2ludChzZWxmKToKKyAgICAgICAgeCA9IGNfaW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LnZhbHVlID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4ID0gY19pbnQoOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2NjaGFycChzZWxmKToKKyAgICAgICAgeCA9IGNfY2hhcl9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LnZhbHVlID0gImFiYyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCAiYWJjIikKKyAgICAgICAgeCA9IGNfY2hhcl9wKCJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCAic3BhbSIpCisKK2NsYXNzIFN0cnVjdHVyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jaW50X3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQpXQorCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICB4LmEgPSA0MgorICAgICAgICB4LmIgPSA5OQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jY2hhcnBfc3RydWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2NoYXJfcCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2NoYXJfcCldCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorCisgICAgICAgIHguYSA9ICJzcGFtIgorICAgICAgICB4LmIgPSAiZm9vIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIHsiMCI6ICJzcGFtIiwgIjEiOiAiZm9vIn0pCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Rfc3RydWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCldCisgICAgICAgIGNsYXNzIFJFQ1QoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygidWwiLCBQT0lOVCksICgibHIiLCBQT0lOVCldCisKKyAgICAgICAgciA9IFJFQ1QoKQorICAgICAgICByLnVsLnggPSAwCisgICAgICAgIHIudWwueSA9IDEKKyAgICAgICAgci5sci54ID0gMgorICAgICAgICByLmxyLnkgPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5fb2JqZWN0cywgTm9uZSkKKworICAgICAgICByID0gUkVDVCgpCisgICAgICAgIHB0ID0gUE9JTlQoMSwgMikKKyAgICAgICAgci51bCA9IHB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5fb2JqZWN0cywgeycwJzoge319KQorICAgICAgICByLnVsLnggPSAyMgorICAgICAgICByLnVsLnkgPSA0NAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuX29iamVjdHMsIHsnMCc6IHt9fSkKKyAgICAgICAgci5sciA9IFBPSU5UKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLl9vYmplY3RzLCB7JzAnOiB7fSwgJzEnOiB7fX0pCisKK2NsYXNzIEFycmF5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NpbnRfYXJyYXkoc2VsZik6CisgICAgICAgIElOVEFSUiA9IGNfaW50ICogMworCisgICAgICAgIGlhID0gSU5UQVJSKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpYS5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgaWFbMF0gPSAxCisgICAgICAgIGlhWzFdID0gMgorICAgICAgICBpYVsyXSA9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpYS5fb2JqZWN0cywgTm9uZSkKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImEiLCBJTlRBUlIpXQorCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC54ID0gMTAwMAorICAgICAgICB4LmFbMF0gPSA0MgorICAgICAgICB4LmFbMV0gPSA5NgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCisgICAgICAgIHguYSA9IGlhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgeycxJzoge319KQorCitjbGFzcyBQb2ludGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3BfY2ludChzZWxmKToKKyAgICAgICAgaSA9IGNfaW50KDQyKQorICAgICAgICB4ID0gcG9pbnRlcihpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIHsnMSc6IGl9KQorCitjbGFzcyBEZWxldGVQb2ludGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBYX3Rlc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygicCIsIFBPSU5URVIoY19jaGFyX3ApKV0KKyAgICAgICAgeCA9IFgoKQorICAgICAgICBpID0gY19jaGFyX3AoImFiYyBkZWYiKQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCisgICAgICAgIHByaW50ICIyPyIsIGdyYyhpKQorICAgICAgICB4LnAgPSBwb2ludGVyKGkpCisgICAgICAgIHByaW50ICIzPyIsIGdyYyhpKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzMjApOgorICAgICAgICAgICAgY19pbnQoOTkpCisgICAgICAgICAgICB4LnBbMF0KKyAgICAgICAgcHJpbnQgeC5wWzBdCisjIyAgICAgICAgZGVsIHgKKyMjICAgICAgICBwcmludCAiMj8iLCBncmMoaSkKKyMjICAgICAgICBkZWwgaQorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMyMCk6CisgICAgICAgICAgICBjX2ludCg5OSkKKyAgICAgICAgICAgIHgucFswXQorICAgICAgICBwcmludCB4LnBbMF0KKyAgICAgICAgcHJpbnQgeC5wLmNvbnRlbnRzCisjIyAgICAgICAgcHJpbnQgeC5fb2JqZWN0cworCisgICAgICAgIHgucFswXSA9ICJzcGFtIHNwYW0iCisjIyAgICAgICAgcHJpbnQgeC5wWzBdCisgICAgICAgIHByaW50ICIrIiAqIDQyCisgICAgICAgIHByaW50IHguX29iamVjdHMKKworY2xhc3MgUG9pbnRlclRvU3RydWN0dXJlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpXQorICAgICAgICBjbGFzcyBSRUNUKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBQT0lOVEVSKFBPSU5UKSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBQT0lOVEVSKFBPSU5UKSldCisgICAgICAgIHIgPSBSRUNUKCkKKyAgICAgICAgcDEgPSBQT0lOVCgxLCAyKQorCisgICAgICAgIHIuYSA9IHBvaW50ZXIocDEpCisgICAgICAgIHIuYiA9IHBvaW50ZXIocDEpCisjIyAgICAgICAgZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludCBhcyBwcAorIyMgICAgICAgIHBwKHAxLl9vYmplY3RzKQorIyMgICAgICAgIHBwKHIuX29iamVjdHMpCisKKyAgICAgICAgci5hWzBdLnggPSA0MgorICAgICAgICByLmFbMF0ueSA9IDk5CisKKyAgICAgICAgIyB0byBhdm9pZCBsZWFraW5nIHdoZW4gdGVzdHMgYXJlIHJ1biBzZXZlcmFsIHRpbWVzCisgICAgICAgICMgY2xlYW4gdXAgdGhlIHR5cGVzIGxlZnQgaW4gdGhlIGNhY2hlLgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtQT0lOVF0KKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTg3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTg3YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RjNDYzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5CkBAIC0wLDAgKzEsMjkgQEAKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IF9jdHlwZXNfdGVzdAorCitsaWIgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworY2xhc3MgTGliVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc3FydChzZWxmKToKKyAgICAgICAgbGliLm15X3NxcnQuYXJndHlwZXMgPSBjX2RvdWJsZSwKKyAgICAgICAgbGliLm15X3NxcnQucmVzdHlwZSA9IGNfZG91YmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGliLm15X3NxcnQoNC4wKSwgMi4wKQorICAgICAgICBpbXBvcnQgbWF0aAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpYi5teV9zcXJ0KDIuMCksIG1hdGguc3FydCgyLjApKQorCisgICAgZGVmIHRlc3RfcXNvcnQoc2VsZik6CisgICAgICAgIGNvbXBhcmVmdW5jID0gQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKGNfY2hhciksIFBPSU5URVIoY19jaGFyKSkKKyAgICAgICAgbGliLm15X3Fzb3J0LmFyZ3R5cGVzID0gY192b2lkX3AsIGNfc2l6ZV90LCBjX3NpemVfdCwgY29tcGFyZWZ1bmMKKyAgICAgICAgbGliLm15X3Fzb3J0LnJlc3R5cGUgPSBOb25lCisKKyAgICAgICAgZGVmIHNvcnQoYSwgYik6CisgICAgICAgICAgICByZXR1cm4gY21wKGFbMF0sIGJbMF0pCisKKyAgICAgICAgY2hhcnMgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcigic3BhbSwgc3BhbSwgYW5kIHNwYW0iKQorICAgICAgICBsaWIubXlfcXNvcnQoY2hhcnMsIGxlbihjaGFycyktMSwgc2l6ZW9mKGNfY2hhciksIGNvbXBhcmVmdW5jKHNvcnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYXJzLnJhdywgIiAgICwsYWFhYWRtbW1ucHBwc3NzXHgwMCIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMWM4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkMWM4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NjgzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQpAQCAtMCwwICsxLDEwNiBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBzeXMsIHVuaXR0ZXN0CitpbXBvcnQgb3MKK2Zyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgaXNfcmVzb3VyY2VfZW5hYmxlZAorCitsaWJjX25hbWUgPSBOb25lCitpZiBvcy5uYW1lID09ICJudCI6CisgICAgbGliY19uYW1lID0gZmluZF9saWJyYXJ5KCJjIikKK2VsaWYgb3MubmFtZSA9PSAiY2UiOgorICAgIGxpYmNfbmFtZSA9ICJjb3JlZGxsIgorZWxpZiBzeXMucGxhdGZvcm0gPT0gImN5Z3dpbiI6CisgICAgbGliY19uYW1lID0gImN5Z3dpbjEuZGxsIgorZWxzZToKKyAgICBsaWJjX25hbWUgPSBmaW5kX2xpYnJhcnkoImMiKQorCitpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJwcmludGluZyIpOgorICAgIHByaW50ICJsaWJjX25hbWUgaXMiLCBsaWJjX25hbWUKKworY2xhc3MgTG9hZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICB1bmtub3duZGxsID0gInh4cmFuZG9tbmFtZXh4IgorCisgICAgaWYgbGliY19uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICBkZWYgdGVzdF9sb2FkKHNlbGYpOgorICAgICAgICAgICAgQ0RMTChsaWJjX25hbWUpCisgICAgICAgICAgICBDRExMKG9zLnBhdGguYmFzZW5hbWUobGliY19uYW1lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIENETEwsIHNlbGYudW5rbm93bmRsbCkKKworICAgIGlmIGxpYmNfbmFtZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5iYXNlbmFtZShsaWJjX25hbWUpID09ICJsaWJjLnNvLjYiOgorICAgICAgICBkZWYgdGVzdF9sb2FkX3ZlcnNpb24oc2VsZik6CisgICAgICAgICAgICBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJjLnNvLjYiKQorICAgICAgICAgICAgIyBsaW51eCB1c2VzIHZlcnNpb24sIGxpYmMgOSBzaG91bGQgbm90IGV4aXN0CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLkxvYWRMaWJyYXJ5LCAibGliYy5zby45IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwuTG9hZExpYnJhcnksIHNlbGYudW5rbm93bmRsbCkKKworICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluICgiYyIsICJtIik6CisgICAgICAgICAgICBsaWIgPSBmaW5kX2xpYnJhcnkobmFtZSkKKyAgICAgICAgICAgIGlmIGxpYjoKKyAgICAgICAgICAgICAgICBjZGxsLkxvYWRMaWJyYXJ5KGxpYikKKyAgICAgICAgICAgICAgICBDRExMKGxpYikKKworICAgIGlmIG9zLm5hbWUgaW4gKCJudCIsICJjZSIpOgorICAgICAgICBkZWYgdGVzdF9sb2FkX2xpYnJhcnkoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxpYmNfbmFtZSBpcyBOb25lKQorICAgICAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgicHJpbnRpbmciKToKKyAgICAgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImtlcm5lbDMyIikKKyAgICAgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoInVzZXIzMiIpCisKKyAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIHdpbmRsbFsia2VybmVsMzIiXS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgd2luZGxsLkxvYWRMaWJyYXJ5KCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICBXaW5ETEwoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgZWxpZiBvcy5uYW1lID09ICJjZSI6CisgICAgICAgICAgICAgICAgd2luZGxsLmNvcmVkbGwuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIHdpbmRsbFsiY29yZWRsbCJdLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICAgICAgV2luRExMKCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVworCisgICAgICAgIGRlZiB0ZXN0X2xvYWRfb3JkaW5hbF9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgICAgICBpbXBvcnQgX2N0eXBlc190ZXN0CisgICAgICAgICAgICBkbGwgPSBXaW5ETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAgICAgIyBXZSBsb2FkIHRoZSBzYW1lIGZ1bmN0aW9uIGJvdGggdmlhIG9yZGluYWwgYW5kIG5hbWUKKyAgICAgICAgICAgIGZ1bmNfb3JkID0gZGxsWzJdCisgICAgICAgICAgICBmdW5jX25hbWUgPSBkbGwuR2V0U3RyaW5nCisgICAgICAgICAgICAjIGFkZHJlc3NvZiBnZXRzIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBmdW5jdGlvbiBwb2ludGVyIGlzIHN0b3JlZAorICAgICAgICAgICAgYV9vcmQgPSBhZGRyZXNzb2YoZnVuY19vcmQpCisgICAgICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQorICAgICAgICAgICAgZl9vcmRfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX29yZCkudmFsdWUKKyAgICAgICAgICAgIGZfbmFtZV9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfbmFtZSkudmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZGxsLl9fZ2V0aXRlbV9fLCAxMjM0KQorCisgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICBkZWYgdGVzdF8xNzAzMjg2X0Eoc2VsZik6CisgICAgICAgICAgICBmcm9tIF9jdHlwZXMgaW1wb3J0IExvYWRMaWJyYXJ5LCBGcmVlTGlicmFyeQorICAgICAgICAgICAgIyBPbiB3aW5YUCA2NC1iaXQsIGFkdmFwaTMyIGxvYWRzIGF0IGFuIGFkZHJlc3MgdGhhdCBkb2VzCisgICAgICAgICAgICAjIE5PVCBmaXQgaW50byBhIDMyLWJpdCBpbnRlZ2VyLiAgRnJlZUxpYnJhcnkgbXVzdCBiZSBhYmxlCisgICAgICAgICAgICAjIHRvIGFjY2VwdCB0aGlzIGFkZHJlc3MuCisKKyAgICAgICAgICAgICMgVGhlc2UgYXJlIHRlc3RzIGZvciBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTcwMzI4NgorICAgICAgICAgICAgaGFuZGxlID0gTG9hZExpYnJhcnkoImFkdmFwaTMyIikKKyAgICAgICAgICAgIEZyZWVMaWJyYXJ5KGhhbmRsZSkKKworICAgICAgICBkZWYgdGVzdF8xNzAzMjg2X0Ioc2VsZik6CisgICAgICAgICAgICAjIFNpbmNlIG9uIHdpblhQIDY0LWJpdCBhZHZhcGkzMiBsb2FkcyBsaWtlIGRlc2NyaWJlZAorICAgICAgICAgICAgIyBhYm92ZSwgdGhlIChhcmJpdHJhcmlseSBzZWxlY3RlZCkgQ2xvc2VFdmVudExvZyBmdW5jdGlvbgorICAgICAgICAgICAgIyBhbHNvIGhhcyBhIGhpZ2ggYWRkcmVzcy4gICdjYWxsX2Z1bmN0aW9uJyBzaG91bGQgYWNjZXB0CisgICAgICAgICAgICAjIGFkZHJlc3NlcyBzbyBsYXJnZS4KKyAgICAgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgY2FsbF9mdW5jdGlvbgorICAgICAgICAgICAgYWR2YXBpMzIgPSB3aW5kbGwuYWR2YXBpMzIKKyAgICAgICAgICAgICMgQ2FsbGluZyBDbG9zZUV2ZW50TG9nIHdpdGggYSBOVUxMIGFyZ3VtZW50IHNob3VsZCBmYWlsLAorICAgICAgICAgICAgIyBidXQgdGhlIGNhbGwgc2hvdWxkIG5vdCBzZWdmYXVsdCBvciBzby4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYWR2YXBpMzIuQ2xvc2VFdmVudExvZyhOb25lKSkKKyAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5hcmd0eXBlcyA9IGNfdm9pZF9wLCBjX2NoYXJfcAorICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLnJlc3R5cGUgPSBjX3ZvaWRfcAorICAgICAgICAgICAgcHJvYyA9IHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcyhhZHZhcGkzMi5faGFuZGxlLCAiQ2xvc2VFdmVudExvZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvYykKKyAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgcmVhbCB0ZXN0OiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgJ2NhbGxfZnVuY3Rpb24nCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGNhbGxfZnVuY3Rpb24ocHJvYywgKE5vbmUsKSkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMDViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIzMDViNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRhODQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQpAQCAtMCwwICsxLDYyIEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCisjIEJvYiBJcHBvbGl0bzoKKyIiIgorT2suLiB0aGUgY29kZSB0byBmaW5kIHRoZSBmaWxlbmFtZSBmb3IgX19nZXRhdHRyX18gc2hvdWxkIGxvb2sKK3NvbWV0aGluZyBsaWtlOgorCitpbXBvcnQgb3MKK2Zyb20gbWFjaG9saWIuZHlsZCBpbXBvcnQgZHlsZF9maW5kCisKK2RlZiBmaW5kX2xpYihuYW1lKToKKyAgICAgcG9zc2libGUgPSBbJ2xpYicrbmFtZSsnLmR5bGliJywgbmFtZSsnLmR5bGliJywKKyAgICAgbmFtZSsnLmZyYW1ld29yay8nK25hbWVdCisgICAgIGZvciBkeWxpYiBpbiBwb3NzaWJsZToKKyAgICAgICAgIHRyeToKKyAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5yZWFscGF0aChkeWxkX2ZpbmQoZHlsaWIpKQorICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgcGFzcworICAgICByYWlzZSBWYWx1ZUVycm9yLCAiJXMgbm90IGZvdW5kIiAlIChuYW1lLCkKKworSXQnbGwgaGF2ZSBvdXRwdXQgbGlrZSB0aGlzOgorCisgPj4+IGZpbmRfbGliKCdwdGhyZWFkJykKKycvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYicKKyA+Pj4gZmluZF9saWIoJ3onKQorJy91c3IvbGliL2xpYnouMS5keWxpYicKKyA+Pj4gZmluZF9saWIoJ0lPS2l0JykKKycvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9JT0tpdC5mcmFtZXdvcmsvVmVyc2lvbnMvQS9JT0tpdCcKKworLWJvYgorCisiIiIKKworZnJvbSBjdHlwZXMubWFjaG9saWIuZHlsZCBpbXBvcnQgZHlsZF9maW5kCisKK2RlZiBmaW5kX2xpYihuYW1lKToKKyAgICBwb3NzaWJsZSA9IFsnbGliJytuYW1lKycuZHlsaWInLCBuYW1lKycuZHlsaWInLCBuYW1lKycuZnJhbWV3b3JrLycrbmFtZV0KKyAgICBmb3IgZHlsaWIgaW4gcG9zc2libGU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLnJlYWxwYXRoKGR5bGRfZmluZChkeWxpYikpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIHJhaXNlIFZhbHVlRXJyb3IoIiVzIG5vdCBmb3VuZCIgJSAobmFtZSwpKQorCitjbGFzcyBNYWNoT1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgZGVmIHRlc3RfZmluZChzZWxmKToKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX2xpYigncHRocmVhZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliJykKKworICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9saWIoJ3onKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zdGFydHN3aXRoKCcvdXNyL2xpYi9saWJ6LjEnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuZW5kc3dpdGgoJy5keWxpYicpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbmRfbGliKCdJT0tpdCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9TeXN0ZW0vTGlicmFyeS9GcmFtZXdvcmtzL0lPS2l0LmZyYW1ld29yay9WZXJzaW9ucy9BL0lPS2l0JykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWZmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYWZmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzI2MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5CkBAIC0wLDAgKzEsNzkgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgTWVtRnVuY3Rpb25zVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisjIyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyMjICAgICAgICAjIHN0cmluZ19hdCBhbmQgd3N0cmluZ19hdCBtdXN0IHVzZSB0aGUgUHl0aG9uIGNhbGxpbmcKKyMjICAgICAgICAjIGNvbnZlbnRpb24gKHdoaWNoIGFjcXVpcmVzIHRoZSBHSUwgYW5kIGNoZWNrcyB0aGUgUHl0aG9uCisjIyAgICAgICAgIyBlcnJvciBmbGFnKS4gIFByb3Zva2UgYW4gZXJyb3IgYW5kIGNhdGNoIGl0OyBzZWUgYWxzbyBpc3N1ZQorIyMgICAgICAgICMgIzM1NTQ6IDxodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMzU1ND4KKyMjICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFN5c3RlbUVycm9yKSwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHdzdHJpbmdfYXQodSJmb28iLCBzeXMubWF4aW50IC0gMSkpCisjIyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIE1lbW9yeUVycm9yLCBTeXN0ZW1FcnJvciksCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzdHJpbmdfYXQoImZvbyIsIHN5cy5tYXhpbnQgLSAxKSkKKworICAgIGRlZiB0ZXN0X21lbW1vdmUoc2VsZik6CisgICAgICAgICMgbGFyZ2UgYnVmZmVycyBhcHBhcmVudGx5IGluY3JlYXNlIHRoZSBjaGFuY2UgdGhhdCB0aGUgbWVtb3J5CisgICAgICAgICMgaXMgYWxsb2NhdGVkIGluIGhpZ2ggYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgYSA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKDEwMDAwMDApCisgICAgICAgIHAgPSAiSGVsbG8sIFdvcmxkIgorICAgICAgICByZXN1bHQgPSBtZW1tb3ZlKGEsIHAsIGxlbihwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChyZXN1bHQpLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQocmVzdWx0LCA1KSwgIkhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQocmVzdWx0LCAxNiksICJIZWxsbywgV29ybGRcMFwwXDBcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgMCksICIiKQorCisgICAgZGVmIHRlc3RfbWVtc2V0KHNlbGYpOgorICAgICAgICBhID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMTAwMDAwMCkKKyAgICAgICAgcmVzdWx0ID0gbWVtc2V0KGEsIG9yZCgneCcpLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnZhbHVlLCAieHh4eHh4eHh4eHh4eHh4eCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQocmVzdWx0KSwgInh4eHh4eHh4eHh4eHh4eHgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChhKSwgInh4eHh4eHh4eHh4eHh4eHgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChhLCAyMCksICJ4eHh4eHh4eHh4eHh4eHh4XDBcMFwwXDAiKQorCisgICAgZGVmIHRlc3RfY2FzdChzZWxmKToKKyAgICAgICAgYSA9IChjX3VieXRlICogMzIpKCptYXAob3JkLCAiYWJjZGVmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FzdChhLCBjX2NoYXJfcCkudmFsdWUsICJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6N10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjc6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk3LCA5OCwgOTksIDEwMCwgMTAxLCAxMDIsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs2Oi0xOi0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDEwMiwgMTAxLCAxMDAsIDk5LCA5OCwgOTddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6NzoyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk3LCA5OSwgMTAxLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjc6N10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs5N10pCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfYXQoc2VsZik6CisgICAgICAgIHMgPSBzdHJpbmdfYXQoImZvbyBiYXIiKQorICAgICAgICAjIFhYWCBUaGUgZm9sbG93aW5nIG1heSBiZSB3cm9uZywgZGVwZW5kaW5nIG9uIGhvdyBQeXRob24KKyAgICAgICAgIyBtYW5hZ2VzIHN0cmluZyBpbnN0YW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzeXMuZ2V0cmVmY291bnQocykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLCAiZm9vIGJhciIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQoImZvbyBiYXIiLCA4KSwgImZvbyBiYXJcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KCJmb28gYmFyIiwgMyksICJmb28iKQorCisgICAgdHJ5OgorICAgICAgICBjcmVhdGVfdW5pY29kZV9idWZmZXIKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZGVmIHRlc3Rfd3N0cmluZ19hdChzZWxmKToKKyAgICAgICAgICAgIHAgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoIkhlbGxvLCBXb3JsZCIpCisgICAgICAgICAgICBhID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKDEwMDAwMDApCisgICAgICAgICAgICByZXN1bHQgPSBtZW1tb3ZlKGEsIHAsIGxlbihwKSAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3N0cmluZ19hdChhKSwgIkhlbGxvLCBXb3JsZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgNSksICJIZWxsbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDApLCAiIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NTFjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4NTFjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyMzkwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5CkBAIC0wLDAgKzEsMjg2IEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3RydWN0CisKK2RlZiB2YWxpZF9yYW5nZXMoKnR5cGVzKToKKyAgICAjIGdpdmVuIGEgc2VxdWVuY2Ugb2YgbnVtZXJpYyB0eXBlcywgY29sbGVjdCB0aGVpciBfdHlwZV8KKyAgICAjIGF0dHJpYnV0ZSwgd2hpY2ggaXMgYSBzaW5nbGUgZm9ybWF0IGNoYXJhY3RlciBjb21wYXRpYmxlIHdpdGgKKyAgICAjIHRoZSBzdHJ1Y3QgbW9kdWxlLCB1c2UgdGhlIHN0cnVjdCBtb2R1bGUgdG8gY2FsY3VsYXRlIHRoZQorICAgICMgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBhbGxvd2VkIGZvciB0aGlzIGZvcm1hdC4KKyAgICAjIFJldHVybnMgYSBsaXN0IG9mIChtaW4sIG1heCkgdmFsdWVzLgorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIHQgaW4gdHlwZXM6CisgICAgICAgIGZtdCA9IHQuX3R5cGVfCisgICAgICAgIHNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoZm10KQorICAgICAgICBhID0gc3RydWN0LnVucGFjayhmbXQsICgiXHgwMCIqMzIpWzpzaXplXSlbMF0KKyAgICAgICAgYiA9IHN0cnVjdC51bnBhY2soZm10LCAoIlx4RkYiKjMyKVs6c2l6ZV0pWzBdCisgICAgICAgIGMgPSBzdHJ1Y3QudW5wYWNrKGZtdCwgKCJceDdGIisiXHgwMCIqMzIpWzpzaXplXSlbMF0KKyAgICAgICAgZCA9IHN0cnVjdC51bnBhY2soZm10LCAoIlx4ODAiKyJceEZGIiozMilbOnNpemVdKVswXQorICAgICAgICByZXN1bHQuYXBwZW5kKChtaW4oYSwgYiwgYywgZCksIG1heChhLCBiLCBjLCBkKSkpCisgICAgcmV0dXJuIHJlc3VsdAorCitBcmdUeXBlID0gdHlwZShieXJlZihjX2ludCgwKSkpCisKK3Vuc2lnbmVkX3R5cGVzID0gW2NfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmddCitzaWduZWRfdHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nXQorCitib29sX3R5cGVzID0gW10KKworZmxvYXRfdHlwZXMgPSBbY19kb3VibGUsIGNfZmxvYXRdCisKK3RyeToKKyAgICBjX3Vsb25nbG9uZworICAgIGNfbG9uZ2xvbmcKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICB1bnNpZ25lZF90eXBlcy5hcHBlbmQoY191bG9uZ2xvbmcpCisgICAgc2lnbmVkX3R5cGVzLmFwcGVuZChjX2xvbmdsb25nKQorCit0cnk6CisgICAgY19ib29sCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgYm9vbF90eXBlcy5hcHBlbmQoY19ib29sKQorCit1bnNpZ25lZF9yYW5nZXMgPSB2YWxpZF9yYW5nZXMoKnVuc2lnbmVkX3R5cGVzKQorc2lnbmVkX3JhbmdlcyA9IHZhbGlkX3Jhbmdlcygqc2lnbmVkX3R5cGVzKQorYm9vbF92YWx1ZXMgPSBbVHJ1ZSwgRmFsc2UsIDAsIDEsIC0xLCA1MDAwLCAndGVzdCcsIFtdLCBbMV1dCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgTnVtYmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9pbml0KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgdG8gemVybworICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KCkudmFsdWUsIDApCisKKyAgICBkZWYgdGVzdF91bnNpZ25lZF92YWx1ZXMoc2VsZik6CisgICAgICAgICMgdGhlIHZhbHVlIGdpdmVuIHRvIHRoZSBjb25zdHJ1Y3RvciBpcyBhdmFpbGFibGUKKyAgICAgICAgIyBhcyB0aGUgJ3ZhbHVlJyBhdHRyaWJ1dGUKKyAgICAgICAgZm9yIHQsIChsLCBoKSBpbiB6aXAodW5zaWduZWRfdHlwZXMsIHVuc2lnbmVkX3Jhbmdlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQobCkudmFsdWUsIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQoaCkudmFsdWUsIGgpCisKKyAgICBkZWYgdGVzdF9zaWduZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIHNlZSBhYm92ZQorICAgICAgICBmb3IgdCwgKGwsIGgpIGluIHppcChzaWduZWRfdHlwZXMsIHNpZ25lZF9yYW5nZXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGwpLnZhbHVlLCBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGgpLnZhbHVlLCBoKQorCisgICAgZGVmIHRlc3RfYm9vbF92YWx1ZXMoc2VsZik6CisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IHRydXRoCisgICAgICAgIGZvciB0LCB2IGluIHppcChib29sX3R5cGVzLCBib29sX3ZhbHVlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQodikudmFsdWUsIHRydXRoKHYpKQorCisgICAgZGVmIHRlc3RfdHlwZWVycm9yKHNlbGYpOgorICAgICAgICAjIE9ubHkgbnVtYmVycyBhcmUgYWxsb3dlZCBpbiB0aGUgY29udHJ1Y3RvciwKKyAgICAgICAgIyBvdGhlcndpc2UgVHlwZUVycm9yIGlzIHJhaXNlZAorICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LCAiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgTm9uZSkKKworIyMgICAgZGVmIHRlc3RfdmFsaWRfcmFuZ2VzKHNlbGYpOgorIyMgICAgICAgICMgaW52YWxpZCB2YWx1ZXMgb2YgdGhlIGNvcnJlY3QgdHlwZQorIyMgICAgICAgICMgcmFpc2UgVmFsdWVFcnJvciAobm90IE92ZXJmbG93RXJyb3IpCisjIyAgICAgICAgZm9yIHQsIChsLCBoKSBpbiB6aXAodW5zaWduZWRfdHlwZXMsIHVuc2lnbmVkX3Jhbmdlcyk6CisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQsIGwtMSkKKyMjICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdCwgaCsxKQorCisgICAgZGVmIHRlc3RfZnJvbV9wYXJhbShzZWxmKToKKyAgICAgICAgIyB0aGUgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2QgYXR0cmlidXRlIGFsd2F5cworICAgICAgICAjIHJldHVybnMgUHlDQXJnT2JqZWN0IGluc3RhbmNlcworICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBcmdUeXBlLCB0eXBlKHQuZnJvbV9wYXJhbSgwKSkpCisKKyAgICBkZWYgdGVzdF9ieXJlZihzZWxmKToKKyAgICAgICAgIyBjYWxsaW5nIGJ5cmVmIHJldHVybnMgYWxzbyBhIFB5Q0FyZ09iamVjdCBpbnN0YW5jZQorICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzICsgYm9vbF90eXBlczoKKyAgICAgICAgICAgIHBhcm0gPSBieXJlZih0KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEFyZ1R5cGUsIHR5cGUocGFybSkpCisKKworICAgIGRlZiB0ZXN0X2Zsb2F0cyhzZWxmKToKKyAgICAgICAgIyBjX2Zsb2F0IGFuZCBjX2RvdWJsZSBjYW4gYmUgY3JlYXRlZCBmcm9tCisgICAgICAgICMgUHl0aG9uIGludCwgbG9uZyBhbmQgZmxvYXQKKyAgICAgICAgY2xhc3MgRmxvYXRMaWtlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyLjAKKyAgICAgICAgZiA9IEZsb2F0TGlrZSgpCisgICAgICAgIGZvciB0IGluIGZsb2F0X3R5cGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KDIuMCkudmFsdWUsIDIuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgyKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KDJMKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGYpLnZhbHVlLCAyLjApCisKKyAgICBkZWYgdGVzdF9pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgY2xhc3MgRmxvYXRMaWtlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyLjAKKyAgICAgICAgZiA9IEZsb2F0TGlrZSgpCisgICAgICAgIGNsYXNzIEludExpa2Uob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyCisgICAgICAgIGkgPSBJbnRMaWtlKCkKKyAgICAgICAgIyBpbnRlZ2VycyBjYW5ub3QgYmUgY29uc3RydWN0ZWQgZnJvbSBmbG9hdHMsCisgICAgICAgICMgYnV0IGZyb20gaW50ZWdlci1saWtlIG9iamVjdHMKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIDMuMTQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIGYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQoaSkudmFsdWUsIDIpCisKKyAgICBkZWYgdGVzdF9zaXplcyhzZWxmKToKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlcyArIGJvb2xfdHlwZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSh0Ll90eXBlXykKKyAgICAgICAgICAgIGV4Y2VwdCBzdHJ1Y3QuZXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgc2l6ZW9mIG9mIHRoZSB0eXBlLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih0KSwgc2l6ZSkKKyAgICAgICAgICAgICMgYW5kIHNpemVvZiBvZiBhbiBpbnN0YW5jZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YodCgpKSwgc2l6ZSkKKworICAgIGRlZiB0ZXN0X2FsaWdubWVudHMoc2VsZik6CisgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXM6CisgICAgICAgICAgICBjb2RlID0gdC5fdHlwZV8gIyB0aGUgdHlwZWNvZGUKKyAgICAgICAgICAgIGFsaWduID0gc3RydWN0LmNhbGNzaXplKCJjJWMiICUgY29kZSkgLSBzdHJ1Y3QuY2FsY3NpemUoY29kZSkKKworICAgICAgICAgICAgIyBhbGlnbm1lbnQgb2YgdGhlIHR5cGUuLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZSwgYWxpZ24pKQorICAgICAgICAgICAgIyBhbmQgYWxpZ25tZW50IG9mIGFuIGluc3RhbmNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjb2RlLCBhbGlnbm1lbnQodCgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29kZSwgYWxpZ24pKQorCisgICAgZGVmIHRlc3RfaW50X2Zyb21fYWRkcmVzcyhzZWxmKToKKyAgICAgICAgZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKKyAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXM6CisgICAgICAgICAgICAjIHRoZSBhcnJheSBtb2R1bGUgZG9lc24ndCBzdXBwb3J0IGFsbCBmb3JtYXQgY29kZXMKKyAgICAgICAgICAgICMgKG5vICdxJyBvciAnUScpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYXJyYXkodC5fdHlwZV8pCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYSA9IGFycmF5KHQuX3R5cGVfLCBbMTAwXSkKKworICAgICAgICAgICAgIyB2IG5vdyBpcyBhbiBpbnRlZ2VyIGF0IGFuICdleHRlcm5hbCcgbWVtb3J5IGxvY2F0aW9uCisgICAgICAgICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHYpLCB0KQorCisgICAgICAgICAgICAjIGNoYW5naW5nIHRoZSB2YWx1ZSBhdCB0aGUgbWVtb3J5IGxvY2F0aW9uIGNoYW5nZXMgdidzIHZhbHVlIGFsc28KKyAgICAgICAgICAgIGFbMF0gPSA0MgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorCisKKyAgICBkZWYgdGVzdF9mbG9hdF9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CisgICAgICAgIGZvciB0IGluIGZsb2F0X3R5cGVzOgorICAgICAgICAgICAgYSA9IGFycmF5KHQuX3R5cGVfLCBbMy4xNF0pCisgICAgICAgICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgdCkKKyAgICAgICAgICAgIGFbMF0gPSAyLjM0NTZlMTcKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHYpIGlzIHQpCisKKyAgICBkZWYgdGVzdF9jaGFyX2Zyb21fYWRkcmVzcyhzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfY2hhcgorICAgICAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQorCisgICAgICAgIGEgPSBhcnJheSgnYycsICd4JykKKyAgICAgICAgdiA9IGNfY2hhci5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHYpIGlzIGNfY2hhcikKKworICAgICAgICBhWzBdID0gJz8nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKworICAgICMgYXJyYXkgZG9lcyBub3Qgc3VwcG9ydCBjX2Jvb2wgLyAndCcKKyAgICAjIGRlZiB0ZXN0X2Jvb2xfZnJvbV9hZGRyZXNzKHNlbGYpOgorICAgICMgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2Jvb2wKKyAgICAjICAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQorICAgICMgICAgIGEgPSBhcnJheShjX2Jvb2wuX3R5cGVfLCBbVHJ1ZV0pCisgICAgIyAgICAgdiA9IHQuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKKyAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHYpIGlzIHQpCisgICAgIyAgICAgYVswXSA9IEZhbHNlCisgICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2KSBpcyB0KQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBjX2ludCgpIGNhbiBiZSBpbml0aWFsaXplZCBmcm9tIFB5dGhvbidzIGludCwgYW5kIGNfaW50LgorICAgICAgICAjIE5vdCBmcm9tIGNfbG9uZyBvciBzbywgd2hpY2ggc2VlbXMgc3RyYW5nZSwgYWJkIHNob3VsZAorICAgICAgICAjIHByb2JhYmx5IGJlIGNoYW5nZWQ6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19pbnQsIGNfbG9uZyg0MikpCisKKyAgICBkZWYgdGVzdF9mbG9hdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBiaWdfaW50ID0gaW50KHN5cy5mbG9hdF9pbmZvLm1heCkgKiAyCisgICAgICAgIGZvciB0IGluIGZsb2F0X3R5cGVzICsgW2NfbG9uZ2RvdWJsZV06CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB0LCBiaWdfaW50KQorICAgICAgICAgICAgaWYgKGhhc2F0dHIodCwgIl9fY3R5cGVfYmVfXyIpKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB0Ll9fY3R5cGVfYmVfXywgYmlnX2ludCkKKyAgICAgICAgICAgIGlmIChoYXNhdHRyKHQsICJfX2N0eXBlX2xlX18iKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdC5fX2N0eXBlX2xlX18sIGJpZ19pbnQpCisKKyMjICAgIGRlZiB0ZXN0X3BlcmYoc2VsZik6CisjIyAgICAgICAgY2hlY2tfcGVyZigpCisKK2Zyb20gY3R5cGVzIGltcG9ydCBfU2ltcGxlQ0RhdGEKK2NsYXNzIGNfaW50X1MoX1NpbXBsZUNEYXRhKToKKyAgICBfdHlwZV8gPSAiaSIKKyAgICBfX3Nsb3RzX18gPSBbXQorCitkZWYgcnVuX3Rlc3QocmVwLCBtc2csIGZ1bmMsIGFyZz1Ob25lKToKKyMjICAgIGl0ZW1zID0gW05vbmVdICogcmVwCisgICAgaXRlbXMgPSByYW5nZShyZXApCisgICAgZnJvbSB0aW1lIGltcG9ydCBjbG9jaworICAgIGlmIGFyZyBpcyBub3QgTm9uZToKKyAgICAgICAgc3RhcnQgPSBjbG9jaygpCisgICAgICAgIGZvciBpIGluIGl0ZW1zOgorICAgICAgICAgICAgZnVuYyhhcmcpOyBmdW5jKGFyZyk7IGZ1bmMoYXJnKTsgZnVuYyhhcmcpOyBmdW5jKGFyZykKKyAgICAgICAgc3RvcCA9IGNsb2NrKCkKKyAgICBlbHNlOgorICAgICAgICBzdGFydCA9IGNsb2NrKCkKKyAgICAgICAgZm9yIGkgaW4gaXRlbXM6CisgICAgICAgICAgICBmdW5jKCk7IGZ1bmMoKTsgZnVuYygpOyBmdW5jKCk7IGZ1bmMoKQorICAgICAgICBzdG9wID0gY2xvY2soKQorICAgIHByaW50ICIlMTVzOiAlLjJmIHVzIiAlIChtc2csICgoc3RvcC1zdGFydCkqMWU2LzUvcmVwKSkKKworZGVmIGNoZWNrX3BlcmYoKToKKyAgICAjIENvbnN0cnVjdCA1IG9iamVjdHMKKyAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19pbnQKKworICAgIFJFUCA9IDIwMDAwMAorCisgICAgcnVuX3Rlc3QoUkVQLCAiaW50KCkiLCBpbnQpCisgICAgcnVuX3Rlc3QoUkVQLCAiaW50KDk5OSkiLCBpbnQpCisgICAgcnVuX3Rlc3QoUkVQLCAiY19pbnQoKSIsIGNfaW50KQorICAgIHJ1bl90ZXN0KFJFUCwgImNfaW50KDk5OSkiLCBjX2ludCkKKyAgICBydW5fdGVzdChSRVAsICJjX2ludF9TKCkiLCBjX2ludF9TKQorICAgIHJ1bl90ZXN0KFJFUCwgImNfaW50X1MoOTk5KSIsIGNfaW50X1MpCisKKyMgUHl0aG9uIDIuMyAtT08sIHdpbjJrLCBQNCA3MDAgTUh6OgorIworIyAgICAgICAgICBpbnQoKTogMC44NyB1cworIyAgICAgICBpbnQoOTk5KTogMC44NyB1cworIyAgICAgICAgY19pbnQoKTogMy4zNSB1cworIyAgICAgY19pbnQoOTk5KTogMy4zNCB1cworIyAgICAgIGNfaW50X1MoKTogMy4yMyB1cworIyAgIGNfaW50X1MoOTk5KTogMy4yNCB1cworCisjIFB5dGhvbiAyLjIgLU9PLCB3aW4yaywgUDQgNzAwIE1IejoKKyMKKyMgICAgICAgICAgaW50KCk6IDAuODkgdXMKKyMgICAgICAgaW50KDk5OSk6IDAuODkgdXMKKyMgICAgICAgIGNfaW50KCk6IDkuOTkgdXMKKyMgICAgIGNfaW50KDk5OSk6IDEwLjAyIHVzCisjICAgICAgY19pbnRfUygpOiA5Ljg3IHVzCisjICAgY19pbnRfUyg5OTkpOiA5Ljg1IHVzCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisjIyAgICBjaGVja19wZXJmKCkKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBjZjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTBjZjZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MjFkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9vYmplY3RzLnB5CkBAIC0wLDAgKzEsNzAgQEAKK3InJycKK1RoaXMgdGVzdHMgdGhlICdfb2JqZWN0cycgYXR0cmlidXRlIG9mIGN0eXBlcyBpbnN0YW5jZXMuICAnX29iamVjdHMnCitob2xkcyByZWZlcmVuY2VzIHRvIG9iamVjdHMgdGhhdCBtdXN0IGJlIGtlcHQgYWxpdmUgYXMgbG9uZyBhcyB0aGUKK2N0eXBlcyBpbnN0YW5jZSwgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIG1lbW9yeSBidWZmZXIgaXMgdmFsaWQuCisKK1dBUk5JTkc6IFRoZSAnX29iamVjdHMnIGF0dHJpYnV0ZSBpcyBleHBvc2VkIE9OTFkgZm9yIGRlYnVnZ2luZyBjdHlwZXMgaXRzZWxmLAoraXQgTVVTVCBORVZFUiBCRSBNT0RJRklFRCEKKworJ19vYmplY3RzJyBpcyBpbml0aWFsaXplZCB0byBhIGRpY3Rpb25hcnkgb24gZmlyc3QgdXNlLCBiZWZvcmUgdGhhdCBpdAoraXMgTm9uZS4KKworSGVyZSBpcyBhbiBhcnJheSBvZiBzdHJpbmcgcG9pbnRlcnM6CisKKz4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorPj4+IGFycmF5ID0gKGNfY2hhcl9wICogNSkoKQorPj4+IHByaW50IGFycmF5Ll9vYmplY3RzCitOb25lCis+Pj4KKworVGhlIG1lbW9yeSBibG9jayBzdG9yZXMgcG9pbnRlcnMgdG8gc3RyaW5ncywgYW5kIHRoZSBzdHJpbmdzIGl0c2VsZgorYXNzaWduZWQgZnJvbSBQeXRob24gbXVzdCBiZSBrZXB0LgorCis+Pj4gYXJyYXlbNF0gPSAnZm9vIGJhcicKKz4+PiBhcnJheS5fb2JqZWN0cworeyc0JzogJ2ZvbyBiYXInfQorPj4+IGFycmF5WzRdCisnZm9vIGJhcicKKz4+PgorCitJdCBnZXRzIG1vcmUgY29tcGxpY2F0ZWQgd2hlbiB0aGUgY3R5cGVzIGluc3RhbmNlIGl0c2VsZiBpcyBjb250YWluZWQKK2luIGEgJ2Jhc2UnIG9iamVjdC4KKworPj4+IGNsYXNzIFgoU3RydWN0dXJlKToKKy4uLiAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCksICgiYXJyYXkiLCBjX2NoYXJfcCAqIDUpXQorLi4uCis+Pj4geCA9IFgoKQorPj4+IHByaW50IHguX29iamVjdHMKK05vbmUKKz4+PgorCitUaGUnYXJyYXknIGF0dHJpYnV0ZSBvZiB0aGUgJ3gnIG9iamVjdCBzaGFyZXMgcGFydCBvZiB0aGUgbWVtb3J5IGJ1ZmZlcgorb2YgJ3gnICgnX2JfYmFzZV8nIGlzIGVpdGhlciBOb25lLCBvciB0aGUgcm9vdCBvYmplY3Qgb3duaW5nIHRoZSBtZW1vcnkgYmxvY2spOgorCis+Pj4gcHJpbnQgeC5hcnJheS5fYl9iYXNlXyAjIGRvY3Rlc3Q6ICtFTExJUFNJUworPGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cy5YIG9iamVjdCBhdCAweC4uLj4KKz4+PgorCis+Pj4geC5hcnJheVswXSA9ICdzcGFtIHNwYW0gc3BhbScKKz4+PiB4Ll9vYmplY3RzCit7JzA6Mic6ICdzcGFtIHNwYW0gc3BhbSd9Cis+Pj4geC5hcnJheS5fYl9iYXNlXy5fb2JqZWN0cworeycwOjInOiAnc3BhbSBzcGFtIHNwYW0nfQorPj4+CisKKycnJworCitpbXBvcnQgdW5pdHRlc3QsIGRvY3Rlc3QsIHN5cworCitpbXBvcnQgY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA+IDB4MDIwNDAwMDA6CisgICAgICAgICMgUHl0aG9uIDIuMyBoYXMgbm8gRUxMSVBTSVMgZmxhZywgc28gd2UgZG9uJ3QgdGVzdCB3aXRoIHRoaXMKKyAgICAgICAgIyB2ZXJzaW9uOgorICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgIGRvY3Rlc3QudGVzdG1vZChjdHlwZXMudGVzdC50ZXN0X29iamVjdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgc3lzLmhleHZlcnNpb24gPiAweDAyMDQwMDAwOgorICAgICAgICBkb2N0ZXN0LnRlc3Rtb2QoY3R5cGVzLnRlc3QudGVzdF9vYmplY3RzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NWUyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NWUyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjcwNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTAsMCArMSwxODggQEAKK2ltcG9ydCB1bml0dGVzdCwgc3lzCisKK2NsYXNzIFNpbXBsZVR5cGVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgc2V0X2NvbnZlcnNpb25fbW9kZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnByZXZfY29udl9tb2RlID0gc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBzZXRfY29udmVyc2lvbl9tb2RlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNldF9jb252ZXJzaW9uX21vZGUoKnNlbGYucHJldl9jb252X21vZGUpCisKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzZXMoc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3ZvaWRfcCwgY19jaGFyX3AKKyAgICAgICAgIyBjdHlwZXMgMC45LjUgYW5kIGJlZm9yZSBkaWQgb3ZlcndyaXRlIGZyb21fcGFyYW0gaW4gU2ltcGxlVHlwZV9uZXcKKyAgICAgICAgY2xhc3MgQ1ZPSURQKGNfdm9pZF9wKToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAqIDIKKyAgICAgICAgICAgIGZyb21fcGFyYW0gPSBjbGFzc21ldGhvZChmcm9tX3BhcmFtKQorCisgICAgICAgIGNsYXNzIENDSEFSUChjX2NoYXJfcCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIHZhbHVlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiA0CisgICAgICAgICAgICBmcm9tX3BhcmFtID0gY2xhc3NtZXRob2QoZnJvbV9wYXJhbSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENWT0lEUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ0NIQVJQLmZyb21fcGFyYW0oImFiYyIpLCAiYWJjYWJjYWJjYWJjIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY193Y2hhcl9wCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNsYXNzIENXQ0hBUlAoY193Y2hhcl9wKToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAqIDMKKyAgICAgICAgICAgIGZyb21fcGFyYW0gPSBjbGFzc21ldGhvZChmcm9tX3BhcmFtKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1dDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiYyIpCisKKyAgICAjIFhYWCBSZXBsYWNlIGJ5IGNfY2hhcl9wIHRlc3RzCisgICAgZGVmIHRlc3RfY3N0cmluZ3Moc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX2NoYXJfcCwgYnlyZWYKKworICAgICAgICAjIGNfY2hhcl9wLmZyb21fcGFyYW0gb24gYSBQeXRob24gU3RyaW5nIHBhY2tzIHRoZSBzdHJpbmcKKyAgICAgICAgIyBpbnRvIGEgY3BhcmFtIG9iamVjdAorICAgICAgICBzID0gIjEyMyIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfY2hhcl9wLmZyb21fcGFyYW0ocykuX29iaiBpcyBzKQorCisgICAgICAgICMgbmV3IGluIDAuOS4xOiBjb252ZXJ0IChlbmNvZGUpIHVuaWNvZGUgdG8gYXNjaWkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX2NoYXJfcC5mcm9tX3BhcmFtKHUiMTIzIikuX29iaiwgIjEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgY19jaGFyX3AuZnJvbV9wYXJhbSwgdSIxMjNcMzc3IikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfY2hhcl9wLmZyb21fcGFyYW0sIDQyKQorCisgICAgICAgICMgY2FsbGluZyBjX2NoYXJfcC5mcm9tX3BhcmFtIHdpdGggYSBjX2NoYXJfcCBpbnN0YW5jZQorICAgICAgICAjIHJldHVybnMgdGhlIGFyZ3VtZW50IGl0c2VsZjoKKyAgICAgICAgYSA9IGNfY2hhcl9wKCIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19jaGFyX3AuZnJvbV9wYXJhbShhKSBpcyBhKQorCisgICAgZGVmIHRlc3RfY3dfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3djaGFyX3AKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorIyMgICAgICAgICAgICBwcmludCAiKE5vIGNfd2NoYXJfcCkiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcyA9IHUiMTIzIgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3djaGFyX3AuZnJvbV9wYXJhbShzKS5fb2JqIGlzIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfd2NoYXJfcC5mcm9tX3BhcmFtLCA0MikKKworICAgICAgICAgICAgIyBuZXcgaW4gMC45LjE6IGNvbnZlcnQgKGRlY29kZSkgYXNjaWkgdG8gdW5pY29kZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3djaGFyX3AuZnJvbV9wYXJhbSgiMTIzIikuX29iaiwgdSIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNfd2NoYXJfcC5mcm9tX3BhcmFtLCAiMTIzXDM3NyIpCisKKyAgICAgICAgcGEgPSBjX3djaGFyX3AuZnJvbV9wYXJhbShjX3djaGFyX3AodSIxMjMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHBhKSwgY193Y2hhcl9wKQorCisgICAgZGVmIHRlc3RfaW50X3BvaW50ZXJzKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19zaG9ydCwgY191aW50LCBjX2ludCwgY19sb25nLCBQT0lOVEVSLCBwb2ludGVyCisgICAgICAgIExQSU5UID0gUE9JTlRFUihjX2ludCkKKworIyMgICAgICAgIHAgPSBwb2ludGVyKGNfaW50KDQyKSkKKyMjICAgICAgICB4ID0gTFBJTlQuZnJvbV9wYXJhbShwKQorICAgICAgICB4ID0gTFBJTlQuZnJvbV9wYXJhbShwb2ludGVyKGNfaW50KDQyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTFBJTlQoY19pbnQoNDIpKS5jb250ZW50cy52YWx1ZSwgNDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMUElOVC5mcm9tX3BhcmFtKE5vbmUpLCBOb25lKQorCisgICAgICAgIGlmIGNfaW50ICE9IGNfbG9uZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgcG9pbnRlcihjX2xvbmcoNDIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUElOVC5mcm9tX3BhcmFtLCBwb2ludGVyKGNfdWludCg0MikpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIHBvaW50ZXIoY19zaG9ydCg0MikpKQorCisgICAgZGVmIHRlc3RfYnlyZWZfcG9pbnRlcihzZWxmKToKKyAgICAgICAgIyBUaGUgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2Qgb2YgUE9JTlRFUih0eXApIGNsYXNzZXMgYWNjZXB0cyB3aGF0IGlzCisgICAgICAgICMgcmV0dXJuZWQgYnkgYnlyZWYob2JqKSwgaXQgdHlwZShvYmopID09IHR5cAorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19zaG9ydCwgY191aW50LCBjX2ludCwgY19sb25nLCBwb2ludGVyLCBQT0lOVEVSLCBieXJlZgorICAgICAgICBMUElOVCA9IFBPSU5URVIoY19pbnQpCisKKyAgICAgICAgTFBJTlQuZnJvbV9wYXJhbShieXJlZihjX2ludCg0MikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgYnlyZWYoY19zaG9ydCgyMikpKQorICAgICAgICBpZiBjX2ludCAhPSBjX2xvbmc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGJ5cmVmKGNfbG9uZygyMikpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGJ5cmVmKGNfdWludCgyMikpKQorCisgICAgZGVmIHRlc3RfYnlyZWZfcG9pbnRlcnBvaW50ZXIoc2VsZik6CisgICAgICAgICMgU2VlIGFib3ZlCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3Nob3J0LCBjX3VpbnQsIGNfaW50LCBjX2xvbmcsIHBvaW50ZXIsIFBPSU5URVIsIGJ5cmVmCisKKyAgICAgICAgTFBMUElOVCA9IFBPSU5URVIoUE9JTlRFUihjX2ludCkpCisgICAgICAgIExQTFBJTlQuZnJvbV9wYXJhbShieXJlZihwb2ludGVyKGNfaW50KDQyKSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBMUElOVC5mcm9tX3BhcmFtLCBieXJlZihwb2ludGVyKGNfc2hvcnQoMjIpKSkpCisgICAgICAgIGlmIGNfaW50ICE9IGNfbG9uZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBMUElOVC5mcm9tX3BhcmFtLCBieXJlZihwb2ludGVyKGNfbG9uZygyMikpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBMUExQSU5ULmZyb21fcGFyYW0sIGJ5cmVmKHBvaW50ZXIoY191aW50KDIyKSkpKQorCisgICAgZGVmIHRlc3RfYXJyYXlfcG9pbnRlcnMoc2VsZik6CisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBjX3Nob3J0LCBjX3VpbnQsIGNfaW50LCBjX2xvbmcsIFBPSU5URVIKKyAgICAgICAgSU5UQVJSQVkgPSBjX2ludCAqIDMKKyAgICAgICAgaWEgPSBJTlRBUlJBWSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGlhKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbaWFbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbMCwgMCwgMF0pCisKKyAgICAgICAgIyBQb2ludGVycyBhcmUgb25seSBjb21wYXRpYmxlIHdpdGggYXJyYXlzIGNvbnRhaW5pbmcgaXRlbXMgb2YKKyAgICAgICAgIyB0aGUgc2FtZSB0eXBlIQorICAgICAgICBMUElOVCA9IFBPSU5URVIoY19pbnQpCisgICAgICAgIExQSU5ULmZyb21fcGFyYW0oKGNfaW50KjMpKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTFBJTlQuZnJvbV9wYXJhbSwgY19zaG9ydCozKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGNfbG9uZyozKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIGNfdWludCozKQorCisjIyAgICBkZWYgdGVzdF9wZXJmb3JtYW5jZShzZWxmKToKKyMjICAgICAgICBjaGVja19wZXJmKCkKKworICAgIGRlZiB0ZXN0X25vY3R5cGVzX2FyZ3R5cGUoc2VsZik6CisgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IENETEwsIGNfdm9pZF9wLCBBcmd1bWVudEVycm9yCisKKyAgICAgICAgZnVuYyA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKS5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfdm9pZF9wCisgICAgICAgICMgVHlwZUVycm9yOiBoYXMgbm8gZnJvbV9wYXJhbSBtZXRob2QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBmdW5jLCAiYXJndHlwZXMiLCAob2JqZWN0LCkpCisKKyAgICAgICAgY2xhc3MgQWRhcHRlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZyb21fcGFyYW0oY2xzLCBvYmopOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhvYmplY3QoKSksIE5vbmUpCisKKyAgICAgICAgY2xhc3MgQWRhcHRlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZyb21fcGFyYW0oY2xzLCBvYmopOgorICAgICAgICAgICAgICAgIHJldHVybiBvYmoKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKEFkYXB0ZXIoKSwpCisgICAgICAgICMgZG9uJ3Qga25vdyBob3cgdG8gY29udmVydCBwYXJhbWV0ZXIgMQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBvYmplY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKGNfdm9pZF9wKDQyKSksIDQyKQorCisgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKG9iaikKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKEFkYXB0ZXIoKSwpCisgICAgICAgICMgQXJndW1lbnRFcnJvcjogYXJndW1lbnQgMTogVmFsdWVFcnJvcjogOTkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZnVuYywgOTkpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzUwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMzUwZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzY0NzNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKQEAgLTAsMCArMSwxOTYgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCByZSwgc3lzCisKK2lmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgVEhJU19FTkRJQU4gPSAiPCIKKyAgICBPVEhFUl9FTkRJQU4gPSAiPiIKK2Vsc2U6CisgICAgVEhJU19FTkRJQU4gPSAiPiIKKyAgICBPVEhFUl9FTkRJQU4gPSAiPCIKKworZGVmIG5vcm1hbGl6ZShmb3JtYXQpOgorICAgICMgUmVtb3ZlIGN1cnJlbnQgZW5kaWFuIHNwZWNpZmllciBhbmQgd2hpdGUgc3BhY2UgZnJvbSBhIGZvcm1hdAorICAgICMgc3RyaW5nCisgICAgaWYgZm9ybWF0IGlzIE5vbmU6CisgICAgICAgIHJldHVybiAiIgorICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKE9USEVSX0VORElBTiwgVEhJU19FTkRJQU4pCisgICAgcmV0dXJuIHJlLnN1YihyIlxzIiwgIiIsIGZvcm1hdCkKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9uYXRpdmVfdHlwZXMoc2VsZik6CisgICAgICAgIGZvciB0cCwgZm10LCBzaGFwZSwgaXRlbXRwIGluIG5hdGl2ZV90eXBlczoKKyAgICAgICAgICAgIG9iID0gdHAoKQorICAgICAgICAgICAgdiA9IG1lbW9yeXZpZXcob2IpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtYWxpemUodi5mb3JtYXQpLCBub3JtYWxpemUoZm10KSkKKyAgICAgICAgICAgICAgICBpZiBzaGFwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIHNoYXBlWzBdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpICogc2l6ZW9mKGl0ZW10cCksIHNpemVvZihvYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc2hhcGUsIHNoYXBlKQorICAgICAgICAgICAgICAgICMgY3R5cGVzIG9iamVjdCBhbHdheXMgaGF2ZSBhIG5vbi1zdHJpZGVkIG1lbW9yeSBibG9jaworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5zdHJpZGVzLCBOb25lKQorICAgICAgICAgICAgICAgICMgdGhleSBhcmUgYWx3YXlzIHJlYWQvd3JpdGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHYucmVhZG9ubHkpCisKKyAgICAgICAgICAgICAgICBpZiB2LnNoYXBlOgorICAgICAgICAgICAgICAgICAgICBuID0gMQorICAgICAgICAgICAgICAgICAgICBmb3IgZGltIGluIHYuc2hhcGU6CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiAqIGRpbQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4gKiB2Lml0ZW1zaXplLCBsZW4odi50b2J5dGVzKCkpKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gc2VlIHRoZSBmYWlsaW5nIHR5cGUKKyAgICAgICAgICAgICAgICBwcmludCh0cCkKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIHRlc3RfZW5kaWFuX3R5cGVzKHNlbGYpOgorICAgICAgICBmb3IgdHAsIGZtdCwgc2hhcGUsIGl0ZW10cCBpbiBlbmRpYW5fdHlwZXM6CisgICAgICAgICAgICBvYiA9IHRwKCkKKyAgICAgICAgICAgIHYgPSBtZW1vcnl2aWV3KG9iKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5mb3JtYXQsIGZtdCkKKyAgICAgICAgICAgICAgICBpZiBzaGFwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIHNoYXBlWzBdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpICogc2l6ZW9mKGl0ZW10cCksIHNpemVvZihvYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc2hhcGUsIHNoYXBlKQorICAgICAgICAgICAgICAgICMgY3R5cGVzIG9iamVjdCBhbHdheXMgaGF2ZSBhIG5vbi1zdHJpZGVkIG1lbW9yeSBibG9jaworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5zdHJpZGVzLCBOb25lKQorICAgICAgICAgICAgICAgICMgdGhleSBhcmUgYWx3YXlzIHJlYWQvd3JpdGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHYucmVhZG9ubHkpCisKKyAgICAgICAgICAgICAgICBpZiB2LnNoYXBlOgorICAgICAgICAgICAgICAgICAgICBuID0gMQorICAgICAgICAgICAgICAgICAgICBmb3IgZGltIGluIHYuc2hhcGU6CisgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiAqIGRpbQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIGxlbih2KSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIHNvIHRoYXQgd2UgY2FuIHNlZSB0aGUgZmFpbGluZyB0eXBlCisgICAgICAgICAgICAgICAgcHJpbnQodHApCisgICAgICAgICAgICAgICAgcmFpc2UKKworIyBkZWZpbmUgc29tZSBzdHJ1Y3R1cmUgY2xhc3NlcworCitjbGFzcyBQb2ludChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygieCIsIGNfbG9uZyksICgieSIsIGNfbG9uZyldCisKK2NsYXNzIFBhY2tlZFBvaW50KFN0cnVjdHVyZSk6CisgICAgX3BhY2tfID0gMgorICAgIF9maWVsZHNfID0gWygieCIsIGNfbG9uZyksICgieSIsIGNfbG9uZyldCisKK2NsYXNzIFBvaW50MihTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1BvaW50Mi5fZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLCAoInkiLCBjX2xvbmcpXQorCitjbGFzcyBFbXB0eVN0cnVjdChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gW10KKworY2xhc3MgYVVuaW9uKFVuaW9uKToKKyAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCldCisKK2NsYXNzIEluY29tcGxldGUoU3RydWN0dXJlKToKKyAgICBwYXNzCisKK2NsYXNzIENvbXBsZXRlKFN0cnVjdHVyZSk6CisgICAgcGFzcworUENvbXBsZXRlID0gUE9JTlRFUihDb21wbGV0ZSkKK0NvbXBsZXRlLl9maWVsZHNfID0gWygiYSIsIGNfbG9uZyldCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGhpcyB0YWJsZSBjb250YWlucyBmb3JtYXQgc3RyaW5ncyBhcyB0aGV5IGxvb2sgb24gbGl0dGxlIGVuZGlhbgorIyBtYWNoaW5lcy4gIFRoZSB0ZXN0IHJlcGxhY2VzICc8JyB3aXRoICc+JyBvbiBiaWcgZW5kaWFuIG1hY2hpbmVzLgorIworbmF0aXZlX3R5cGVzID0gWworICAgICMgdHlwZSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgICAgICAgICAgICAgICAgICBzaGFwZSAgICAgICAgICAgY2FsYyBpdGVtc2l6ZQorCisgICAgIyMgc2ltcGxlIHR5cGVzCisKKyAgICAoY19jaGFyLCAgICAgICAgICAgICAgICAgICAgIjxjIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfY2hhciksCisgICAgKGNfYnl0ZSwgICAgICAgICAgICAgICAgICAgICI8YiIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX2J5dGUpLAorICAgIChjX3VieXRlLCAgICAgICAgICAgICAgICAgICAiPEIiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY191Ynl0ZSksCisgICAgKGNfc2hvcnQsICAgICAgICAgICAgICAgICAgICI8aCIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX3Nob3J0KSwKKyAgICAoY191c2hvcnQsICAgICAgICAgICAgICAgICAgIjxIIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfdXNob3J0KSwKKworICAgICMgY19pbnQgYW5kIGNfdWludCBtYXkgYmUgYWxpYXNlcyB0byBjX2xvbmcKKyAgICAjKGNfaW50LCAgICAgICAgICAgICAgICAgICAgICI8aSIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX2ludCksCisgICAgIyhjX3VpbnQsICAgICAgICAgICAgICAgICAgICAiPEkiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY191aW50KSwKKworICAgIChjX2xvbmcsICAgICAgICAgICAgICAgICAgICAiPGwiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY19sb25nKSwKKyAgICAoY191bG9uZywgICAgICAgICAgICAgICAgICAgIjxMIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfdWxvbmcpLAorCisgICAgIyBjX2xvbmdsb25nIGFuZCBjX3Vsb25nbG9uZyBhcmUgYWxpYXNlcyBvbiA2NC1iaXQgcGxhdGZvcm1zCisgICAgIyhjX2xvbmdsb25nLCAgICAgICAgICAgICAgICAiPHEiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY19sb25nbG9uZyksCisgICAgIyhjX3Vsb25nbG9uZywgICAgICAgICAgICAgICAiPFEiLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY191bG9uZ2xvbmcpLAorCisgICAgKGNfZmxvYXQsICAgICAgICAgICAgICAgICAgICI8ZiIsICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBjX2Zsb2F0KSwKKyAgICAoY19kb3VibGUsICAgICAgICAgICAgICAgICAgIjxkIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGNfZG91YmxlKSwKKyAgICAjIGNfbG9uZ2RvdWJsZSBtYXkgYmUgYW4gYWxpYXMgdG8gY19kb3VibGUKKworICAgIChjX2Jvb2wsICAgICAgICAgICAgICAgICAgICAiPD8iLCAgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgY19ib29sKSwKKyAgICAocHlfb2JqZWN0LCAgICAgICAgICAgICAgICAgIjxPIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIHB5X29iamVjdCksCisKKyAgICAjIyBwb2ludGVycworCisgICAgKFBPSU5URVIoY19ieXRlKSwgICAgICAgICAgICImPGIiLCAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBQT0lOVEVSKGNfYnl0ZSkpLAorICAgIChQT0lOVEVSKFBPSU5URVIoY19sb25nKSksICAiJiY8bCIsICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgUE9JTlRFUihQT0lOVEVSKGNfbG9uZykpKSwKKworICAgICMjIGFycmF5cyBhbmQgcG9pbnRlcnMKKworICAgIChjX2RvdWJsZSAqIDQsICAgICAgICAgICAgICAiKDQpPGQiLCAgICAgICAgICAgICAgICAoNCwpLCAgICAgICAgICAgY19kb3VibGUpLAorICAgIChjX2Zsb2F0ICogNCAqIDMgKiAyLCAgICAgICAiKDIsMyw0KTxmIiwgICAgICAgICAgICAoMiwzLDQpLCAgICAgICAgY19mbG9hdCksCisgICAgKFBPSU5URVIoY19zaG9ydCkgKiAyLCAgICAgICIoMikmPGgiLCAgICAgICAgICAgICAgICgyLCksICAgICAgICAgICBQT0lOVEVSKGNfc2hvcnQpKSwKKyAgICAoUE9JTlRFUihjX3Nob3J0KSAqIDIgKiAzLCAgIigzLDIpJjxoIiwgICAgICAgICAgICAgKDMsMiwpLCAgICAgICAgIFBPSU5URVIoY19zaG9ydCkpLAorICAgIChQT0lOVEVSKGNfc2hvcnQgKiAyKSwgICAgICAiJigyKTxoIiwgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgUE9JTlRFUihjX3Nob3J0KSksCisKKyAgICAjIyBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMKKworICAgIChQb2ludCwgICAgICAgICAgICAgICAgICAgICAiVHs8bDp4OjxsOnk6fSIsICAgICAgICBOb25lLCAgICAgICAgICAgUG9pbnQpLAorICAgICMgcGFja2VkIHN0cnVjdHVyZXMgZG8gbm90IGltcGxlbWVudCB0aGUgcGVwCisgICAgKFBhY2tlZFBvaW50LCAgICAgICAgICAgICAgICJCIiwgICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBQYWNrZWRQb2ludCksCisgICAgKFBvaW50MiwgICAgICAgICAgICAgICAgICAgICJUezxsOng6PGw6eTp9IiwgICAgICAgIE5vbmUsICAgICAgICAgICBQb2ludDIpLAorICAgIChFbXB0eVN0cnVjdCwgICAgICAgICAgICAgICAiVHt9IiwgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgRW1wdHlTdHJ1Y3QpLAorICAgICMgdGhlIHBlcCBkb2VzJ3Qgc3VwcG9ydCB1bmlvbnMKKyAgICAoYVVuaW9uLCAgICAgICAgICAgICAgICAgICAgIkIiLCAgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIGFVbmlvbiksCisKKyAgICAjIyBwb2ludGVyIHRvIGluY29tcGxldGUgc3RydWN0dXJlCisgICAgKEluY29tcGxldGUsICAgICAgICAgICAgICAgICJCIiwgICAgICAgICAgICAgICAgICAgIE5vbmUsICAgICAgICAgICBJbmNvbXBsZXRlKSwKKyAgICAoUE9JTlRFUihJbmNvbXBsZXRlKSwgICAgICAgIiZCIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIFBPSU5URVIoSW5jb21wbGV0ZSkpLAorCisgICAgIyAnQ29tcGxldGUnIGlzIGEgc3RydWN0dXJlIHRoYXQgc3RhcnRzIGluY29tcGxldGUsIGJ1dCBpcyBjb21wbGV0ZWQgYWZ0ZXIgdGhlCisgICAgIyBwb2ludGVyIHR5cGUgdG8gaXQgaGFzIGJlZW4gY3JlYXRlZC4KKyAgICAoQ29tcGxldGUsICAgICAgICAgICAgICAgICAgIlR7PGw6YTp9IiwgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIENvbXBsZXRlKSwKKyAgICAjIFVuZm9ydHVuYXRlbHkgdGhlIHBvaW50ZXIgZm9ybWF0IHN0cmluZyBpcyBub3QgZml4ZWQuLi4KKyAgICAoUE9JTlRFUihDb21wbGV0ZSksICAgICAgICAgIiZCIiwgICAgICAgICAgICAgICAgICAgTm9uZSwgICAgICAgICAgIFBPSU5URVIoQ29tcGxldGUpKSwKKworICAgICMjIG90aGVyCisKKyAgICAjIGZ1bmN0aW9uIHNpZ25hdHVyZXMgYXJlIG5vdCBpbXBsZW1lbnRlZAorICAgIChDRlVOQ1RZUEUoTm9uZSksICAgICAgICAgICAiWHt9IiwgICAgICAgICAgICAgICAgICBOb25lLCAgICAgICAgICAgQ0ZVTkNUWVBFKE5vbmUpKSwKKworICAgIF0KKworY2xhc3MgQkVQb2ludChCaWdFbmRpYW5TdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygieCIsIGNfbG9uZyksICgieSIsIGNfbG9uZyldCisKK2NsYXNzIExFUG9pbnQoTGl0dGxlRW5kaWFuU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLCAoInkiLCBjX2xvbmcpXQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRoaXMgdGFibGUgY29udGFpbnMgZm9ybWF0IHN0cmluZ3MgYXMgdGhleSByZWFsbHkgbG9vaywgb24gYm90aCBiaWcKKyMgYW5kIGxpdHRsZSBlbmRpYW4gbWFjaGluZXMuCisjCitlbmRpYW5fdHlwZXMgPSBbCisgICAgKEJFUG9pbnQsICAgICAgICAgICAgICAgICAgICJUez5sOng6Pmw6eTp9IiwgICAgICAgIE5vbmUsICAgICAgICAgICBCRVBvaW50KSwKKyAgICAoTEVQb2ludCwgICAgICAgICAgICAgICAgICAgIlR7PGw6eDo8bDp5On0iLCAgICAgICAgTm9uZSwgICAgICAgICAgIExFUG9pbnQpLAorICAgIChQT0lOVEVSKEJFUG9pbnQpLCAgICAgICAgICAiJlR7Pmw6eDo+bDp5On0iLCAgICAgICBOb25lLCAgICAgICAgICAgUE9JTlRFUihCRVBvaW50KSksCisgICAgKFBPSU5URVIoTEVQb2ludCksICAgICAgICAgICImVHs8bDp4OjxsOnk6fSIsICAgICAgIE5vbmUsICAgICAgICAgICBQT0lOVEVSKExFUG9pbnQpKSwKKyAgICBdCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0ZjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0ZjQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGlja2xpbmcucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGlja2xpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM2Y2JlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weQpAQCAtMCwwICsxLDgzIEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBwaWNrbGUKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgX2N0eXBlc190ZXN0CitkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwgKCJiIiwgY19kb3VibGUpXQorICAgIGluaXRfY2FsbGVkID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIFguaW5pdF9jYWxsZWQgKz0gMQorICAgICAgICBzZWxmLnggPSA0MgorCitjbGFzcyBZKFgpOgorICAgIF9maWVsZHNfID0gWygic3RyIiwgY19jaGFyX3ApXQorCitjbGFzcyBQaWNrbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgZHVtcHMoc2VsZiwgaXRlbSk6CisgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHMoaXRlbSkKKworICAgIGRlZiBsb2FkcyhzZWxmLCBpdGVtKToKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhpdGVtKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBmb3Igc3JjIGluIFsKKyAgICAgICAgICAgIGNfaW50KDQyKSwKKyAgICAgICAgICAgIGNfZG91YmxlKDMuMTQpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGRzdCA9IHNlbGYubG9hZHMoc2VsZi5kdW1wcyhzcmMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmMuX19kaWN0X18sIGRzdC5fX2RpY3RfXykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtb3J5dmlldyhzcmMpLnRvYnl0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeXZpZXcoZHN0KS50b2J5dGVzKCkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Qoc2VsZik6CisgICAgICAgIFguaW5pdF9jYWxsZWQgPSAwCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmEgPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguaW5pdF9jYWxsZWQsIDEpCisKKyAgICAgICAgeSA9IHNlbGYubG9hZHMoc2VsZi5kdW1wcyh4KSkKKworICAgICAgICAjIGxvYWRzIG11c3QgTk9UIGNhbGwgX19pbml0X18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmluaXRfY2FsbGVkLCAxKQorCisgICAgICAgICMgY3R5cGVzIGluc3RhbmNlcyBhcmUgaWRlbnRpY2FsIHdoZW4gdGhlIGluc3RhbmNlIF9fZGljdF9fCisgICAgICAgICMgYW5kIHRoZSBtZW1vcnkgYnVmZmVyIGFyZSBpZGVudGljYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9fZGljdF9fLCB4Ll9fZGljdF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbW9yeXZpZXcoeSkudG9ieXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnl2aWV3KHgpLnRvYnl0ZXMoKSkKKworICAgIGRlZiB0ZXN0X3VucGlja2FibGUoc2VsZik6CisgICAgICAgICMgY3R5cGVzIG9iamVjdHMgdGhhdCBhcmUgcG9pbnRlcnMgb3IgY29udGFpbiBwb2ludGVycyBhcmUKKyAgICAgICAgIyB1bnBpY2thYmxlLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHNlbGYuZHVtcHMoWSgpKSkKKworICAgICAgICBwcm90b3R5cGUgPSBDRlVOQ1RZUEUoY19pbnQpCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gWworICAgICAgICAgICAgY19jaGFyX3AoKSwKKyAgICAgICAgICAgIGNfd2NoYXJfcCgpLAorICAgICAgICAgICAgY192b2lkX3AoKSwKKyAgICAgICAgICAgIHBvaW50ZXIoY19pbnQoNDIpKSwKKyAgICAgICAgICAgIGRsbC5fdGVzdGZ1bmNfcF9wLAorICAgICAgICAgICAgcHJvdG90eXBlKGxhbWJkYTogNDIpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogc2VsZi5kdW1wcyhpdGVtKSkKKworICAgIGRlZiB0ZXN0X3djaGFyKHNlbGYpOgorICAgICAgICBwaWNrbGUuZHVtcHMoY19jaGFyKCJ4IikpCisgICAgICAgICMgSXNzdWUgNTA0OQorICAgICAgICBwaWNrbGUuZHVtcHMoY193Y2hhcih1IngiKSkKKworY2xhc3MgUGlja2xlVGVzdF8xKFBpY2tsZVRlc3QpOgorICAgIGRlZiBkdW1wcyhzZWxmLCBpdGVtKToKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5kdW1wcyhpdGVtLCAxKQorCitjbGFzcyBQaWNrbGVUZXN0XzIoUGlja2xlVGVzdCk6CisgICAgZGVmIGR1bXBzKHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gcGlja2xlLmR1bXBzKGl0ZW0sIDIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGlja2xpbmcucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRmYjRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcGlja2xpbmcucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjRmYjRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BpY2tsaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiOGNlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weQpAQCAtMCwwICsxLDE5MiBAQAoraW1wb3J0IHVuaXR0ZXN0LCBzeXMKKworZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworY3R5cGVfdHlwZXMgPSBbY19ieXRlLCBjX3VieXRlLCBjX3Nob3J0LCBjX3VzaG9ydCwgY19pbnQsIGNfdWludCwKKyAgICAgICAgICAgICAgICAgY19sb25nLCBjX3Vsb25nLCBjX2xvbmdsb25nLCBjX3Vsb25nbG9uZywgY19kb3VibGUsIGNfZmxvYXRdCitweXRob25fdHlwZXMgPSBbaW50LCBpbnQsIGludCwgaW50LCBpbnQsIGxvbmcsCisgICAgICAgICAgICAgICAgaW50LCBsb25nLCBsb25nLCBsb25nLCBmbG9hdCwgZmxvYXRdCisKK2NsYXNzIFBvaW50ZXJzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcG9pbnRlcl9jcmFzaChzZWxmKToKKworICAgICAgICBjbGFzcyBBKFBPSU5URVIoY191bG9uZykpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIFBPSU5URVIoY191bG9uZykoY191bG9uZygyMikpCisgICAgICAgICMgUG9pbnRlciBjYW4ndCBzZXQgY29udGVudHM6IGhhcyBubyBfdHlwZV8KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBBLCBjX3Vsb25nKDMzKSkKKworICAgIGRlZiB0ZXN0X3Bhc3NfcG9pbnRlcnMoc2VsZik6CisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBmdW5jID0gZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19sb25nCisKKyAgICAgICAgaSA9IGNfaW50KDEyMzQ1Njc4KQorIyMgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoUE9JTlRFUihjX2ludCksKQorICAgICAgICBhZGRyZXNzID0gZnVuYyhieXJlZihpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX2ludC5mcm9tX2FkZHJlc3MoYWRkcmVzcykudmFsdWUsIDEyMzQ1Njc4KQorCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCisgICAgICAgIHJlcyA9IGZ1bmMocG9pbnRlcihpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuY29udGVudHMudmFsdWUsIDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1swXSwgMTIzNDU2NzgpCisKKyAgICBkZWYgdGVzdF9jaGFuZ2VfcG9pbnRlcnMoc2VsZik6CisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBmdW5jID0gZGxsLl90ZXN0ZnVuY19wX3AKKworICAgICAgICBpID0gY19pbnQoODc2NTQpCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoUE9JTlRFUihjX2ludCksKQorCisgICAgICAgIHJlcyA9IGZ1bmMocG9pbnRlcihpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF0sIDg3NjU0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5jb250ZW50cy52YWx1ZSwgODc2NTQpCisKKyAgICAgICAgIyBDIGNvZGU6ICpyZXMgPSA1NDM0NQorICAgICAgICByZXNbMF0gPSA1NDM0NQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkudmFsdWUsIDU0MzQ1KQorCisgICAgICAgICMgQyBjb2RlOgorICAgICAgICAjICAgaW50IHggPSAxMjMyMTsKKyAgICAgICAgIyAgIHJlcyA9ICZ4CisgICAgICAgIHJlcy5jb250ZW50cyA9IGNfaW50KDEyMzIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkudmFsdWUsIDU0MzQ1KQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tzX3dpdGhfcG9pbnRlcnMoc2VsZik6CisgICAgICAgICMgYSBmdW5jdGlvbiB0eXBlIHJlY2VpdmluZyBhIHBvaW50ZXIKKyAgICAgICAgUFJPVE9UWVBFID0gQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKGNfaW50KSkKKworICAgICAgICBzZWxmLnJlc3VsdCA9IFtdCisKKyAgICAgICAgZGVmIGZ1bmMoYXJnKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyMjICAgICAgICAgICAgICAgIHByaW50IGFyZ1tpXSwKKyAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdC5hcHBlbmQoYXJnW2ldKQorIyMgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgY2FsbGJhY2sgPSBQUk9UT1RZUEUoZnVuYykKKworICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIGV4cGVjdHMgYSBmdW5jdGlvbiBwb2ludGVyLAorICAgICAgICAjIGFuZCBjYWxscyB0aGlzIHdpdGggYW4gaW50ZWdlciBwb2ludGVyIGFzIHBhcmFtZXRlci4KKyAgICAgICAgIyBUaGUgaW50IHBvaW50ZXIgcG9pbnRzIHRvIGEgdGFibGUgY29udGFpbmluZyB0aGUgbnVtYmVycyAxLi4xMAorICAgICAgICBkb2l0ID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja193aXRoX3BvaW50ZXIKKworIyMgICAgICAgIGkgPSBjX2ludCg0MikKKyMjICAgICAgICBjYWxsYmFjayhieXJlZihpKSkKKyMjICAgICAgICBzZWxmLmFzc2VydFRydWUoaS52YWx1ZSA9PSA4NCkKKworICAgICAgICBkb2l0KGNhbGxiYWNrKQorIyMgICAgICAgIHByaW50IHNlbGYucmVzdWx0CisgICAgICAgIGRvaXQoY2FsbGJhY2spCisjIyAgICAgICAgcHJpbnQgc2VsZi5yZXN1bHQKKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgZGVsaXRlbQorICAgICAgICBmb3IgY3QsIHB0IGluIHppcChjdHlwZV90eXBlcywgcHl0aG9uX3R5cGVzKToKKyAgICAgICAgICAgIGkgPSBjdCg0MikKKyAgICAgICAgICAgIHAgPSBwb2ludGVyKGkpCisjIyAgICAgICAgICAgIHByaW50IHR5cGUocC5jb250ZW50cyksIGN0CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShwLmNvbnRlbnRzKSBpcyBjdCkKKyAgICAgICAgICAgICMgcC5jb250ZW50cyBpcyB0aGUgc2FtZSBhcyBwWzBdCisjIyAgICAgICAgICAgIHByaW50IHAuY29udGVudHMKKyMjICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAuY29udGVudHMgPT0gNDIpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwWzBdID09IDQyKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGl0ZW0sIHAsIDApCisKKyAgICBkZWYgdGVzdF9mcm9tX2FkZHJlc3Moc2VsZik6CisgICAgICAgIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CisgICAgICAgIGEgPSBhcnJheSgnaScsIFsxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMF0pCisgICAgICAgIGFkZHIgPSBhLmJ1ZmZlcl9pbmZvKClbMF0KKworICAgICAgICBwID0gUE9JTlRFUihQT0lOVEVSKGNfaW50KSkKKyMjICAgICAgICBwcmludCBkaXIocCkKKyMjICAgICAgICBwcmludCBwLmZyb21fYWRkcmVzcworIyMgICAgICAgIHByaW50IHAuZnJvbV9hZGRyZXNzKGFkZHIpWzBdWzBdCisKKyAgICBkZWYgdGVzdF9vdGhlcihzZWxmKToKKyAgICAgICAgY2xhc3MgVGFibGUoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfaW50KV0KKworICAgICAgICBwdCA9IHBvaW50ZXIoVGFibGUoMSwgMiwgMykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwdC5jb250ZW50cy5hLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB0LmNvbnRlbnRzLmIsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHQuY29udGVudHMuYywgMykKKworICAgICAgICBwdC5jb250ZW50cy5jID0gMzMKKworICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtUYWJsZV0KKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBwID0gcG9pbnRlcihjX2ludCg0MikpCisgICAgICAgICMgQWx0aG91Z2ggYSBwb2ludGVyIGNhbiBiZSBpbmRleGVkLCBpdCBoYSBubyBsZW5ndGgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsZW4sIHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFswXSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5jb250ZW50cy52YWx1ZSwgNDIpCisKKyAgICBkZWYgdGVzdF9jaGFycHAoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBhIGNoYXJhY3RlciBwb2ludGVyLXRvLXBvaW50ZXIgaXMgY29ycmVjdGx5IHBhc3NlZCIiIgorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgZnVuYyA9IGRsbC5fdGVzdGZ1bmNfY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKKyAgICAgICAgYXJndiA9IChjX2NoYXJfcCAqIDIpKCkKKyAgICAgICAgYXJnYyA9IGNfaW50KCAyICkKKyAgICAgICAgYXJndlswXSA9ICdoZWxsbycKKyAgICAgICAgYXJndlsxXSA9ICd3b3JsZCcKKyAgICAgICAgcmVzdWx0ID0gZnVuYyggYnlyZWYoYXJnYyksIGFyZ3YgKQorICAgICAgICBhc3NlcnQgcmVzdWx0ID09ICd3b3JsZCcsIHJlc3VsdAorCisgICAgZGVmIHRlc3RfYnVnXzE0Njc4NTIoc2VsZik6CisgICAgICAgICMgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhdGlkPTUzMjE1NCZhaWQ9MTQ2Nzg1MiZncm91cF9pZD03MTcwMgorICAgICAgICB4ID0gY19pbnQoNSkKKyAgICAgICAgZHVtbXkgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzMjAwMCk6CisgICAgICAgICAgICBkdW1teS5hcHBlbmQoY19pbnQoaSkpCisgICAgICAgIHkgPSBjX2ludCg2KQorICAgICAgICBwID0gcG9pbnRlcih4KQorICAgICAgICBwcCA9IHBvaW50ZXIocCkKKyAgICAgICAgcSA9IHBvaW50ZXIoeSkKKyAgICAgICAgcHBbMF0gPSBxICAgICAgICAgIyA8PT0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzBdLCA2KQorICAgIGRlZiB0ZXN0X2Nfdm9pZF9wKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvdHJhY2tlci8/ZnVuYz1kZXRhaWwmYWlkPTE1MTgxOTAmZ3JvdXBfaWQ9NTQ3MCZhdGlkPTEwNTQ3MAorICAgICAgICBpZiBzaXplb2YoY192b2lkX3ApID09IDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCisgICAgICAgIGVsaWYgc2l6ZW9mKGNfdm9pZF9wKSA9PSA4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGTCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3ZvaWRfcCwgMy4xNCkgIyBtYWtlIHN1cmUgZmxvYXRzIGFyZSBOT1QgYWNjZXB0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3ZvaWRfcCwgb2JqZWN0KCkpICMgbm9yIG90aGVyIG9iamVjdHMKKworICAgIGRlZiB0ZXN0X3BvaW50ZXJzX2Jvb2woc2VsZik6CisgICAgICAgICMgTlVMTCBwb2ludGVycyBoYXZlIGEgYm9vbGVhbiBGYWxzZSB2YWx1ZSwgbm9uLU5VTEwgcG9pbnRlcnMgVHJ1ZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKFBPSU5URVIoY19pbnQpKCkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKHBvaW50ZXIoY19pbnQoKSkpLCBUcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9vbChDRlVOQ1RZUEUoTm9uZSkoMCkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKENGVU5DVFlQRShOb25lKSg0MikpLCBUcnVlKQorCisgICAgICAgICMgQ09NIG1ldGhvZHMgYXJlIGJvb2xlYW4gVHJ1ZToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICBtdGggPSBXSU5GVU5DVFlQRShOb25lKSg0MiwgIm5hbWUiLCAoKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYm9vbChtdGgpLCBUcnVlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwYzgyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUwYmRhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJhNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKQEAgLTAsMCArMSwyMjEgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QKKworIyBJTVBPUlRBTlQgSU5GTzoKKyMKKyMgQ29uc2lkZXIgdGhpcyBjYWxsOgorIyAgICBmdW5jLnJlc3R5cGUgPSBjX2NoYXJfcAorIyAgICBmdW5jKGNfY2hhcl9wKCIxMjMiKSkKKyMgSXQgcmV0dXJucworIyAgICAiMTIzIgorIworIyBXSFkgSVMgVEhJUyBTTz8KKyMKKyMgYXJndW1lbnQgdHVwbGUgKGNfY2hhcl9wKCIxMjMiKSwgKSBpcyBkZXN0cm95ZWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uCisjIGZ1bmMgaXMgY2FsbGVkLCBidXQgTk9UIGJlZm9yZSB0aGUgcmVzdWx0IGlzIGFjdHVhbGx5IGJ1aWx0LgorIworIyBJZiB0aGUgYXJnbGlzdCB3b3VsZCBiZSBkZXN0cm95ZWQgQkVGT1JFIHRoZSByZXN1bHQgaGFzIGJlZW4gYnVpbHQsCisjIHRoZSBjX2NoYXJfcCgiMTIzIikgb2JqZWN0IHdvdWxkIGFscmVhZHkgaGF2ZSBhIHplcm8gcmVmY291bnQsCisjIGFuZCB0aGUgcG9pbnRlciBwYXNzZWQgdG8gKGFuZCByZXR1cm5lZCBieSkgdGhlIGZ1bmN0aW9uIHdvdWxkCisjIHByb2JhYmx5IHBvaW50IHRvIGRlYWxsb2NhdGVkIHNwYWNlLgorIworIyBJbiB0aGlzIGNhc2UsIHRoZXJlIHdvdWxkIGhhdmUgdG8gYmUgYW4gYWRkaXRpb25hbCByZWZlcmVuY2UgdG8gdGhlIGFyZ3VtZW50Li4uCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKK3Rlc3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworIyBSZXR1cm4gbWFjaGluZSBhZGRyZXNzIGBhYCBhcyBhIChwb3NzaWJseSBsb25nKSBub24tbmVnYXRpdmUgaW50ZWdlci4KKyMgU3RhcnRpbmcgd2l0aCBQeXRob24gMi41LCBpZChhbnl0aGluZykgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZSwgYW5kCisjIHRoZSBjdHlwZXMgYWRkcmVzc29mKCkgaW5oZXJpdHMgdGhhdCB2aWEgUHlMb25nX0Zyb21Wb2lkUHRyKCkuCitkZWYgcG9zaXRpdmVfYWRkcmVzcyhhKToKKyAgICBpZiBhID49IDA6CisgICAgICAgIHJldHVybiBhCisgICAgIyBWaWV3IHRoZSBiaXRzIGluIGBhYCBhcyB1bnNpZ25lZCBpbnN0ZWFkLgorICAgIGltcG9ydCBzdHJ1Y3QKKyAgICBudW1fYml0cyA9IHN0cnVjdC5jYWxjc2l6ZSgiUCIpICogOCAjIG51bSBiaXRzIGluIG5hdGl2ZSBtYWNoaW5lIGFkZHJlc3MKKyAgICBhICs9IDFMIDw8IG51bV9iaXRzCisgICAgYXNzZXJ0IGEgPj0gMAorICAgIHJldHVybiBhCisKK2RlZiBjX3didWZmZXIoaW5pdCk6CisgICAgbiA9IGxlbihpbml0KSArIDEKKyAgICByZXR1cm4gKGNfd2NoYXIgKiBuKSgqaW5pdCkKKworY2xhc3MgQ2hhclBvaW50ZXJzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfbG9uZworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gTm9uZQorCisgICAgZGVmIHRlc3RfcGFyYW1mbGFncyhzZWxmKToKKyAgICAgICAgIyBmdW5jdGlvbiByZXR1cm5zIGNfdm9pZF9wIHJlc3VsdCwKKyAgICAgICAgIyBhbmQgaGFzIGEgcmVxdWlyZWQgcGFyYW1ldGVyIG5hbWVkICdpbnB1dCcKKyAgICAgICAgcHJvdG90eXBlID0gQ0ZVTkNUWVBFKGNfdm9pZF9wLCBjX3ZvaWRfcCkKKyAgICAgICAgZnVuYyA9IHByb3RvdHlwZSgoIl90ZXN0ZnVuY19wX3AiLCB0ZXN0ZGxsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKDEsICJpbnB1dCIpLCkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGRldGFpbHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkZXRhaWxzKSwgInJlcXVpcmVkIGFyZ3VtZW50ICdpbnB1dCcgbWlzc2luZyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlR5cGVFcnJvciBub3QgcmFpc2VkIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhpbnB1dD1Ob25lKSwgTm9uZSkKKworCisgICAgZGVmIHRlc3RfaW50X3BvaW50ZXJfYXJnKHNlbGYpOgorICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfbG9uZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGZ1bmMoMCkpCisKKyAgICAgICAgY2kgPSBjX2ludCgwKQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfaW50KSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpdGl2ZV9hZGRyZXNzKGFkZHJlc3NvZihjaSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9hZGRyZXNzKGZ1bmMoYnlyZWYoY2kpKSkpCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfY2hhcl9wLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBieXJlZihjaSkpCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IFBPSU5URVIoY19zaG9ydCksCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIGJ5cmVmKGNpKSkKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX2RvdWJsZSksCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGZ1bmMsIGJ5cmVmKGNpKSkKKworICAgIGRlZiB0ZXN0X1BPSU5URVJfY19jaGFyX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX2NoYXIpLAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYygiMTIzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhjX2NoYXJfcChOb25lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfYnVmZmVyKCIxMjMiKSkpCisgICAgICAgIGNhID0gY19jaGFyKCJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorCisgICAgZGVmIHRlc3RfY19jaGFyX3BfYXJnKHNlbGYpOgorICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfY2hhcl9wCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX2NoYXJfcCwKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoIjEyMyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfY2hhcl9wKCIxMjMiKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2J1ZmZlcigiMTIzIikpKQorICAgICAgICBjYSA9IGNfY2hhcigiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKworICAgIGRlZiB0ZXN0X2Nfdm9pZF9wX2FyZyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcAorICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2NoYXJfcAorICAgICAgICBmdW5jLmFyZ3R5cGVzID0gY192b2lkX3AsCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2NoYXJfcCgiMTIzIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKKyAgICAgICAgY2EgPSBjX2NoYXIoImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisKKyAgICAgICAgZnVuYyhieXJlZihjX2ludCgpKSkKKyAgICAgICAgZnVuYyhwb2ludGVyKGNfaW50KCkpKQorICAgICAgICBmdW5jKChjX2ludCAqIDMpKCkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY193Y2hhcl9wCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKKworICAgIGRlZiB0ZXN0X2luc3RhbmNlKHNlbGYpOgorICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfdm9pZF9wCisKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIF9hc19wYXJhbWV0ZXJfID0gTm9uZQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX3ZvaWRfcCwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKFgoKSkpCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKFgoKSkpCisKK3RyeToKKyAgICBjX3djaGFyCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgV0NoYXJQb2ludGVyc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX2ludAorICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IE5vbmUKKworCisgICAgICAgIGRlZiB0ZXN0X1BPSU5URVJfY193Y2hhcl9hcmcoc2VsZik6CisgICAgICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCisgICAgICAgICAgICBmdW5jLnJlc3R5cGUgPSBjX3djaGFyX3AKKyAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfd2NoYXIpLAorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfd2NoYXJfcChOb25lKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2J1ZmZlcih1IjEyMyIpKSkKKyAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisKKyAgICAgICAgZGVmIHRlc3RfY193Y2hhcl9wX2FyZyhzZWxmKToKKyAgICAgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfd2NoYXJfcAorICAgICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfd2NoYXJfcCwKKworICAgICAgICAgICAgY193Y2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKHUiMTIzIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY193Y2hhcl9wKCIxMjMiKSkpCisKKyAgICAgICAgICAgICMgWFhYIEN1cnJlbnRseSwgdGhlc2UgcmFpc2UgVHlwZUVycm9ycywgYWx0aG91Z2ggdGhleSBzaG91bGRuJ3Q6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2J1ZmZlcigiMTIzIikpKQorICAgICAgICAgICAgY2EgPSBjX3djaGFyKCJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisKK2NsYXNzIEFycmF5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19haTgKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gUE9JTlRFUihjX2ludCkKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfaW50ICogOCwKKworICAgICAgICBmdW5jKChjX2ludCAqIDgpKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpKQorCisgICAgICAgICMgVGhpcyBkaWQgY3Jhc2ggYmVmb3JlOgorCisgICAgICAgIGRlZiBmdW5jKCk6IHBhc3MKKyAgICAgICAgQ0ZVTkNUWVBFKE5vbmUsIGNfaW50ICogMykoZnVuYykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMGQ3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMDE0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgxNzBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKQEAgLTAsMCArMSw5MCBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdCwgc3lzCitmcm9tIGN0eXBlcy50ZXN0IGltcG9ydCBpc19yZXNvdXJjZV9lbmFibGVkCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhpcyBzZWN0aW9uIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGN0eXBlc1xfX2luaXRfXy5weSwgd2hlbiBpdCdzIHJlYWR5LgorCitmcm9tIF9jdHlwZXMgaW1wb3J0IFB5T2JqX0Zyb21QdHIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCitpZiBzeXMudmVyc2lvbl9pbmZvID4gKDIsIDQpOgorICAgIGNfcHlfc3NpemVfdCA9IGNfc2l6ZV90CitlbHNlOgorICAgIGNfcHlfc3NpemVfdCA9IGNfaW50CisKK2NsYXNzIFB5dGhvbkFQSVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X1B5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHNlbGYpOgorICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSA9IHB5dGhvbmFwaS5QeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZQorCisgICAgICAgIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplLnJlc3R5cGUgPSBweV9vYmplY3QKKyAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUuYXJndHlwZXMgPSBjX2NoYXJfcCwgY19weV9zc2l6ZV90CisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiYWJjZGVmZ2hpIiwgMyksICJhYmMiKQorCisgICAgZGVmIHRlc3RfUHlTdHJpbmdfRnJvbVN0cmluZyhzZWxmKToKKyAgICAgICAgcHl0aG9uYXBpLlB5U3RyaW5nX0Zyb21TdHJpbmcucmVzdHlwZSA9IHB5X29iamVjdAorICAgICAgICBweXRob25hcGkuUHlTdHJpbmdfRnJvbVN0cmluZy5hcmd0eXBlcyA9IChjX2NoYXJfcCwpCisKKyAgICAgICAgcyA9ICJhYmMiCisgICAgICAgIHJlZmNudCA9IGdyYyhzKQorICAgICAgICBweW9iID0gcHl0aG9uYXBpLlB5U3RyaW5nX0Zyb21TdHJpbmcocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocyksIHJlZmNudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBweW9iKQorICAgICAgICBkZWwgcHlvYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhzKSwgcmVmY250KQorCisgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgicmVmY291bnQiKToKKyAgICAgICAgIyBUaGlzIHRlc3QgaXMgdW5yZWxpYWJsZSwgYmVjYXVzZSBpdCBpcyBwb3NzaWJsZSB0aGF0IGNvZGUgaW4KKyAgICAgICAgIyB1bml0dGVzdCBjaGFuZ2VzIHRoZSByZWZjb3VudCBvZiB0aGUgJzQyJyBpbnRlZ2VyLiAgU28sIGl0CisgICAgICAgICMgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgZGVmIHRlc3RfUHlJbnRfTG9uZyhzZWxmKToKKyAgICAgICAgICAgIHJlZjQyID0gZ3JjKDQyKQorICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nLnJlc3R5cGUgPSBweV9vYmplY3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nKDQyKSwgNDIpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKDQyKSwgcmVmNDIpCisKKyAgICAgICAgICAgIHB5dGhvbmFwaS5QeUludF9Bc0xvbmcuYXJndHlwZXMgPSAocHlfb2JqZWN0LCkKKyAgICAgICAgICAgIHB5dGhvbmFwaS5QeUludF9Bc0xvbmcucmVzdHlwZSA9IGNfbG9uZworCisgICAgICAgICAgICByZXMgPSBweXRob25hcGkuUHlJbnRfQXNMb25nKDQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocmVzKSwgcmVmNDIgKyAxKQorICAgICAgICAgICAgZGVsIHJlcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKKworICAgIGRlZiB0ZXN0X1B5T2JqX0Zyb21QdHIoc2VsZik6CisgICAgICAgIHMgPSAiYWJjIGRlZiBnaGkgamtsIgorICAgICAgICByZWYgPSBncmMocykKKyAgICAgICAgIyBpZChweXRob24tb2JqZWN0KSBpcyB0aGUgYWRkcmVzcworICAgICAgICBweW9iaiA9IFB5T2JqX0Zyb21QdHIoaWQocykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzIGlzIHB5b2JqKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWYgKyAxKQorICAgICAgICBkZWwgcHlvYmoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocyksIHJlZikKKworICAgIGRlZiB0ZXN0X1B5T1Nfc25wcmludGYoc2VsZik6CisgICAgICAgIFB5T1Nfc25wcmludGYgPSBweXRob25hcGkuUHlPU19zbnByaW50ZgorICAgICAgICBQeU9TX3NucHJpbnRmLmFyZ3R5cGVzID0gUE9JTlRFUihjX2NoYXIpLCBjX3NpemVfdCwgY19jaGFyX3AKKworICAgICAgICBidWYgPSBjX2J1ZmZlcigyNTYpCisgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIkhlbGxvIGZyb20gJXMiLCAiY3R5cGVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJIZWxsbyBmcm9tIGN0eXBlcyIpCisKKyAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiSGVsbG8gZnJvbSAlcyIsICJjdHlwZXMiLCAxLCAyLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvIGZyb20gY3R5cGVzIikKKworICAgICAgICAjIG5vdCBlbm91Z2ggYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgUHlPU19zbnByaW50ZiwgYnVmKQorCisgICAgZGVmIHRlc3RfcHlvYmplY3RfcmVwcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHB5X29iamVjdCgpKSwgInB5X29iamVjdCg8TlVMTD4pIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHB5X29iamVjdCg0MikpLCAicHlfb2JqZWN0KDQyKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihweV9vYmplY3Qob2JqZWN0KSksICJweV9vYmplY3QoJXIpIiAlIG9iamVjdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTk3YTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTk3YTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMyMTdjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CkBAIC0wLDAgKzEsNzUgQEAKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitpbXBvcnQgdW5pdHRlc3QsIHN5cworCitkZWYgY2FsbGJhY2tfZnVuYyhhcmcpOgorICAgIDQyIC8vIGFyZworICAgIHJhaXNlIFZhbHVlRXJyb3IoYXJnKQorCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKworICAgIGNsYXNzIGNhbGxfZnVuY3Rpb25fVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAjIF9jdHlwZXMuY2FsbF9mdW5jdGlvbiBpcyBkZXByZWNhdGVkIGFuZCBwcml2YXRlLCBidXQgdXNlZCBieQorICAgICAgICAjIEdhcnkgQmlzaHAncyByZWFkbGluZSBtb2R1bGUuICBJZiB3ZSBoYXZlIGl0LCB3ZSBtdXN0IHRlc3QgaXQgYXMgd2VsbC4KKworICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgY2FsbF9mdW5jdGlvbgorICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkxvYWRMaWJyYXJ5QS5yZXN0eXBlID0gY192b2lkX3AKKyAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5hcmd0eXBlcyA9IGNfdm9pZF9wLCBjX2NoYXJfcAorICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldFByb2NBZGRyZXNzLnJlc3R5cGUgPSBjX3ZvaWRfcAorCisgICAgICAgICAgICBoZGxsID0gd2luZGxsLmtlcm5lbDMyLkxvYWRMaWJyYXJ5QSgia2VybmVsMzIiKQorICAgICAgICAgICAgZnVuY2FkZHIgPSB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MoaGRsbCwgIkdldE1vZHVsZUhhbmRsZUEiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGxfZnVuY3Rpb24oZnVuY2FkZHIsIChOb25lLCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoTm9uZSkpCisKK2NsYXNzIENhbGxiYWNrVHJhY2JhY2tUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBXaGVuIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW4gYSBjdHlwZXMgY2FsbGJhY2sgZnVuY3Rpb24sIHRoZSBDCisgICAgIyBjb2RlIHByaW50cyBhIHRyYWNlYmFjay4KKyAgICAjCisgICAgIyBUaGlzIHRlc3QgbWFrZXMgc3VyZSB0aGUgZXhjZXB0aW9uIHR5cGVzICphbmQqIHRoZSBleGNlcHRpb24KKyAgICAjIHZhbHVlIGlzIHByaW50ZWQgY29ycmVjdGx5LgorICAgICMKKyAgICAjIENoYW5nZWQgaW4gMC45LjM6IE5vIGxvbmdlciBpcyAnKGluIGNhbGxiYWNrKScgcHJlcGVuZGVkIHRvIHRoZQorICAgICMgZXJyb3IgbWVzc2FnZSAtIGluc3RlYWQgYSBhZGRpdGlvbmFsIGZyYW1lIGZvciB0aGUgQyBjb2RlIGlzCisgICAgIyBjcmVhdGVkLCB0aGVuIGEgZnVsbCB0cmFjZWJhY2sgcHJpbnRlZC4gIFdoZW4gU3lzdGVtRXhpdCBpcworICAgICMgcmFpc2VkIGluIGEgY2FsbGJhY2sgZnVuY3Rpb24sIHRoZSBpbnRlcnByZXRlciBleGl0cy4KKworICAgIGRlZiBjYXB0dXJlX3N0ZGVycihzZWxmLCBmdW5jLCAqYXJncywgKiprdyk6CisgICAgICAgICMgaGVscGVyIC0gY2FsbCBmdW5jdGlvbiAnZnVuYycsIGFuZCByZXR1cm4gdGhlIGNhcHR1cmVkIHN0ZGVycgorICAgICAgICBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgb2xkX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgbG9nZ2VyID0gc3lzLnN0ZGVyciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBvbGRfc3RkZXJyCisgICAgICAgIHJldHVybiBsb2dnZXIuZ2V0dmFsdWUoKQorCisgICAgZGVmIHRlc3RfVmFsdWVFcnJvcihzZWxmKToKKyAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShjYWxsYmFja19mdW5jKQorICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlRXJyb3I6IDQyIikKKworICAgIGRlZiB0ZXN0X0ludGVnZXJEaXZpc2lvbkVycm9yKHNlbGYpOgorICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpKGNhbGxiYWNrX2Z1bmMpCisgICAgICAgIG91dCA9IHNlbGYuY2FwdHVyZV9zdGRlcnIoY2IsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV1bOjE5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiKQorCisgICAgZGVmIHRlc3RfRmxvYXREaXZpc2lvbkVycm9yKHNlbGYpOgorICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19kb3VibGUpKGNhbGxiYWNrX2Z1bmMpCisgICAgICAgIG91dCA9IHNlbGYuY2FwdHVyZV9zdGRlcnIoY2IsIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXVs6MTldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVyb0RpdmlzaW9uRXJyb3I6ICIpCisKKyAgICBkZWYgdGVzdF9UeXBlRXJyb3JEaXZpc2lvbkVycm9yKHNlbGYpOgorICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19jaGFyX3ApKGNhbGxiYWNrX2Z1bmMpCisgICAgICAgIG91dCA9IHNlbGYuY2FwdHVyZV9zdGRlcnIoY2IsICJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlR5cGVFcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAvLzogJ2ludCcgYW5kICdzdHInIikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNkZmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjNkZmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YTgxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5CkBAIC0wLDAgKzEsOTggQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGN0eXBlcworaW1wb3J0IGdjCisKK015Q2FsbGJhY2sgPSBjdHlwZXMuQ0ZVTkNUWVBFKGN0eXBlcy5jX2ludCwgY3R5cGVzLmNfaW50KQorT3RoZXJDYWxsYmFjayA9IGN0eXBlcy5DRlVOQ1RZUEUoY3R5cGVzLmNfaW50LCBjdHlwZXMuY19pbnQsIGN0eXBlcy5jX3Vsb25nbG9uZykKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorZGxsID0gY3R5cGVzLkNETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorCitjbGFzcyBSZWZjb3VudFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKKworICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19pX2lmCisgICAgICAgIGYucmVzdHlwZSA9IGN0eXBlcy5jX2ludAorICAgICAgICBmLmFyZ3R5cGVzID0gW2N0eXBlcy5jX2ludCwgTXlDYWxsYmFja10KKworICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgorICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKGNhbGxiYWNrKSwgMikKKyAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoY2FsbGJhY2spID4gMikKKyAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBjYiA9IE5vbmUKKworICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhjYWxsYmFjayksIDIpCisKKworICAgIGRlZiB0ZXN0X3JlZmNvdW50KHNlbGYpOgorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgZ2V0cmVmY291bnQgYXMgZ3JjCisgICAgICAgIGRlZiBmdW5jKCphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyB0aGlzIGlzIHRoZSBzdGFuZGFyZCByZWZjb3VudCBmb3IgZnVuYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhmdW5jKSwgMikKKworICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CisgICAgICAgIGYgPSBPdGhlckNhbGxiYWNrKGZ1bmMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPiAyKQorCisgICAgICAgICMgYW5kIG1heSByZWxlYXNlIGl0IGFnYWluCisgICAgICAgIGRlbCBmCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPj0gMikKKworICAgICAgICAjIGJ1dCBub3cgaXQgbXVzdCBiZSBnb25lCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID09IDIpCisKKyAgICAgICAgY2xhc3MgWChjdHlwZXMuU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIE90aGVyQ2FsbGJhY2spXQorICAgICAgICB4ID0gWCgpCisgICAgICAgIHguYSA9IE90aGVyQ2FsbGJhY2soZnVuYykKKworICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPiAyKQorCisgICAgICAgICMgYW5kIG1heSByZWxlYXNlIGl0IGFnYWluCisgICAgICAgIGRlbCB4CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPj0gMikKKworICAgICAgICAjIGFuZCBub3cgaXQgbXVzdCBiZSBnb25lIGFnYWluCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhmdW5jKSwgMikKKworICAgICAgICBmID0gT3RoZXJDYWxsYmFjayhmdW5jKQorCisgICAgICAgICMgdGhlIENGdW5jUHRyIGluc3RhbmNlIGhvbGRzIGF0ciBsZWFzdCBvbmUgcmVmY291bnQgb24gZnVuYzoKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyYyhmdW5jKSA+IDIpCisKKyAgICAgICAgIyBjcmVhdGUgYSBjeWNsZQorICAgICAgICBmLmN5Y2xlID0gZgorCisgICAgICAgIGRlbCBmCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhmdW5jKSwgMikKKworY2xhc3MgQW5vdGhlckxlYWsodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisKKyAgICAgICAgcHJvdG8gPSBjdHlwZXMuQ0ZVTkNUWVBFKGN0eXBlcy5jX2ludCwgY3R5cGVzLmNfaW50LCBjdHlwZXMuY19pbnQpCisgICAgICAgIGRlZiBmdW5jKGEsIGIpOgorICAgICAgICAgICAgcmV0dXJuIGEgKiBiICogMgorICAgICAgICBmID0gcHJvdG8oZnVuYykKKworICAgICAgICBhID0gc3lzLmdldHJlZmNvdW50KGN0eXBlcy5jX2ludCkKKyAgICAgICAgZigxLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChjdHlwZXMuY19pbnQpLCBhKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFlYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFlYjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWNjNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkKQEAgLTAsMCArMSwyOSBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAorCitzdWJjbGFzc2VzID0gW10KK2ZvciBiYXNlIGluIFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfbG9uZ2xvbmcsCisgICAgICAgIGNfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nLAorICAgICAgICBjX2Zsb2F0LCBjX2RvdWJsZSwgY19sb25nZG91YmxlLCBjX2Jvb2xdOgorICAgIGNsYXNzIFgoYmFzZSk6CisgICAgICAgIHBhc3MKKyAgICBzdWJjbGFzc2VzLmFwcGVuZChYKQorCitjbGFzcyBYKGNfY2hhcik6CisgICAgcGFzcworCisjIFRoaXMgdGVzdCBjaGVja3MgaWYgdGhlIF9fcmVwcl9fIGlzIGNvcnJlY3QgZm9yIHN1YmNsYXNzZXMgb2Ygc2ltcGxlIHR5cGVzCisKK2NsYXNzIFJlcHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9udW1iZXJzKHNlbGYpOgorICAgICAgICBmb3IgdHlwIGluIHN1YmNsYXNzZXM6CisgICAgICAgICAgICBiYXNlID0gdHlwLl9fYmFzZXNfX1swXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoYmFzZSg0MikpLnN0YXJ0c3dpdGgoYmFzZS5fX25hbWVfXykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI8WCBvYmplY3QgYXQiLCByZXByKHR5cCg0MikpWzoxMl0pCisKKyAgICBkZWYgdGVzdF9jaGFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJjX2NoYXIoJ3gnKSIsIHJlcHIoY19jaGFyKCd4JykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI8WCBvYmplY3QgYXQiLCByZXByKFgoJ3gnKSlbOjEyXSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAzNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjAzNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODI3ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5CkBAIC0wLDAgKzEsNjUgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCBvcworCitpbXBvcnQgX2N0eXBlc190ZXN0CisKK2NsYXNzIFJldHVybkZ1bmNQdHJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF93aXRoX3Byb3RvdHlwZShzZWxmKToKKyAgICAgICAgIyBUaGUgX2N0eXBlc190ZXN0IHNoYXJlZCBsaWIvZGxsIGV4cG9ydHMgcXVpdGUgc29tZSBmdW5jdGlvbnMgZm9yIHRlc3RpbmcuCisgICAgICAgICMgVGhlIGdldF9zdHJjaHIgZnVuY3Rpb24gcmV0dXJucyBhICpwb2ludGVyKiB0byB0aGUgQyBzdHJjaHIgZnVuY3Rpb24uCisgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICBnZXRfc3RyY2hyID0gZGxsLmdldF9zdHJjaHIKKyAgICAgICAgZ2V0X3N0cmNoci5yZXN0eXBlID0gQ0ZVTkNUWVBFKGNfY2hhcl9wLCBjX2NoYXJfcCwgY19jaGFyKQorICAgICAgICBzdHJjaHIgPSBnZXRfc3RyY2hyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoImFiY2RlZiIsICJiIiksICJiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAieCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBzdHJjaHIsICJhYmNkZWYiLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0cmNociwgImFiY2RlZiIpCisKKyAgICBkZWYgdGVzdF93aXRob3V0X3Byb3RvdHlwZShzZWxmKToKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGdldF9zdHJjaHIgPSBkbGwuZ2V0X3N0cmNocgorICAgICAgICAjIHRoZSBkZWZhdWx0ICdjX2ludCcgd291bGQgbm90IHdvcmsgb24gc3lzdGVtcyB3aGVyZSBzaXplb2YoaW50KSAhPSBzaXplb2Yodm9pZCAqKQorICAgICAgICBnZXRfc3RyY2hyLnJlc3R5cGUgPSBjX3ZvaWRfcAorICAgICAgICBhZGRyID0gZ2V0X3N0cmNocigpCisgICAgICAgICMgX0NGdW5jUHRyIGluc3RhbmNlcyBhcmUgbm93IGNhbGxhYmxlIHdpdGggYW4gaW50ZWdlciBhcmd1bWVudAorICAgICAgICAjIHdoaWNoIGRlbm90ZXMgYSBmdW5jdGlvbiBhZGRyZXNzOgorICAgICAgICBzdHJjaHIgPSBDRlVOQ1RZUEUoY19jaGFyX3AsIGNfY2hhcl9wLCBjX2NoYXIpKGFkZHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJjaHIoImFiY2RlZiIsICJiIiksICJiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAieCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBzdHJjaHIsICJhYmNkZWYiLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0cmNociwgImFiY2RlZiIpCisKKyAgICBkZWYgdGVzdF9mcm9tX2RsbChzZWxmKToKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgICMgX0NGdW5jUHRyIGluc3RhbmNlcyBhcmUgbm93IGNhbGxhYmxlIHdpdGggYSB0dXBsZSBhcmd1bWVudAorICAgICAgICAjIHdoaWNoIGRlbm90ZXMgYSBmdW5jdGlvbiBuYW1lIGFuZCBhIGRsbDoKKyAgICAgICAgc3RyY2hyID0gQ0ZVTkNUWVBFKGNfY2hhcl9wLCBjX2NoYXJfcCwgY19jaGFyKSgoIm15X3N0cmNociIsIGRsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJjaHIoYiJhYmNkZWYiLCBiImIiKSwgImJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoYiJhYmNkZWYiLCBiIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCBiImFiY2RlZiIsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsIGIiYWJjZGVmIikKKworICAgICMgSXNzdWUgNjA4MzogUmVmZXJlbmNlIGNvdW50aW5nIGJ1ZworICAgIGRlZiB0ZXN0X2Zyb21fZGxsX3JlZmNvdW50KHNlbGYpOgorICAgICAgICBjbGFzcyBCYWRTZXF1ZW5jZSh0dXBsZSk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJteV9zdHJjaHIiCisgICAgICAgICAgICAgICAgaWYga2V5ID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICAgICAgIyBfQ0Z1bmNQdHIgaW5zdGFuY2VzIGFyZSBub3cgY2FsbGFibGUgd2l0aCBhIHR1cGxlIGFyZ3VtZW50CisgICAgICAgICMgd2hpY2ggZGVub3RlcyBhIGZ1bmN0aW9uIG5hbWUgYW5kIGEgZGxsOgorICAgICAgICBzdHJjaHIgPSBDRlVOQ1RZUEUoY19jaGFyX3AsIGNfY2hhcl9wLCBjX2NoYXIpKAorICAgICAgICAgICAgICAgIEJhZFNlcXVlbmNlKCgibXlfc3RyY2hyIiwgQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJjaHIoYiJhYmNkZWYiLCBiImIiKSwgImJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoYiJhYmNkZWYiLCBiIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCBiImFiY2RlZiIsIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsIGIiYWJjZGVmIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzY5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMzY5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfcmV0dXJuZnVuY3B0cnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3M2ZiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5CkBAIC0wLDAgKzEsNTcgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgTXlJbnQoY19pbnQpOgorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgdHlwZShvdGhlcikgIT0gTXlJbnQ6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgcmV0dXJuIGNtcChzZWxmLnZhbHVlLCBvdGhlci52YWx1ZSkKKyAgICBkZWYgX19oYXNoX18oc2VsZik6ICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi52YWx1ZSkKKworY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE15SW50KDMpLCBNeUludCgzKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChNeUludCg0MiksIE15SW50KDQzKSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZV9yZXR2YWwoc2VsZik6CisgICAgICAgICMgVGVzdCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgY2FsbGJhY2sgaXMgaWdub3JlZAorICAgICAgICAjIGlmIHJlc3R5cGUgaXMgTm9uZQorICAgICAgICBwcm90byA9IENGVU5DVFlQRShOb25lKQorICAgICAgICBkZWYgZnVuYygpOgorICAgICAgICAgICAgcmV0dXJuICgxLCAiYWJjIiwgTm9uZSkKKworICAgICAgICBjYiA9IHByb3RvKGZ1bmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgY2IoKSkKKworCisgICAgZGVmIHRlc3RfaW50X2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBhcmdzID0gW10KKyAgICAgICAgZGVmIGZ1bmMoYXJnKToKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGFyZykKKyAgICAgICAgICAgIHJldHVybiBhcmcKKworICAgICAgICBjYiA9IENGVU5DVFlQRShOb25lLCBNeUludCkoZnVuYykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGNiKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGFyZ3NbLTFdKSwgTXlJbnQpCisKKyAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShmdW5jKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGNiKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGFyZ3NbLTFdKSwgaW50KQorCisgICAgZGVmIHRlc3RfaW50X3N0cnVjdChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgTXlJbnQpXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpLngsIE15SW50KCkpCisKKyAgICAgICAgcyA9IFgoKQorICAgICAgICBzLnggPSBNeUludCg0MikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMueCwgTXlJbnQoNDIpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMThkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMThkMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjVlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKQEAgLTAsMCArMSwzNCBAQAorIyBUZXN0IHNwZWNpZmljYWxseS1zaXplZCBjb250YWluZXJzLgorCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBTaXplc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF84KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHNpemVvZihjX2ludDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHNpemVvZihjX3VpbnQ4KSkKKworICAgIGRlZiB0ZXN0XzE2KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNpemVvZihjX2ludDE2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzaXplb2YoY191aW50MTYpKQorCisgICAgZGVmIHRlc3RfMzIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2l6ZW9mKGNfaW50MzIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNpemVvZihjX3VpbnQzMikpCisKKyAgICBkZWYgdGVzdF82NChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg4LCBzaXplb2YoY19pbnQ2NCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCwgc2l6ZW9mKGNfdWludDY0KSkKKworICAgIGRlZiB0ZXN0X3NpemVfdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoY192b2lkX3ApLCBzaXplb2YoY19zaXplX3QpKQorCisgICAgZGVmIHRlc3Rfc3NpemVfdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoY192b2lkX3ApLCBzaXplb2YoY19zc2l6ZV90KSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5ZjY4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5ZjY4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTYzMmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKQEAgLTAsMCArMSwxNzggQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitjbGFzcyBTbGljZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZ2V0c2xpY2VfY2ludChzZWxmKToKKyAgICAgICAgYSA9IChjX2ludCAqIDEwMCkoKnhyYW5nZSgxMTAwLCAxMjAwKSkKKyAgICAgICAgYiA9IHJhbmdlKDExMDAsIDEyMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjJdLCBiWzA6Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjI6XSwgYlswOjI6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIGxlbihiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzU6N10sIGJbNTo3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzU6NzpdLCBiWzU6NzpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTFdLCBiWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBiWzpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBiWzo6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwOjotMV0sIGJbMTA6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMwOjIwOi0xXSwgYlszMDoyMDotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6MTI6Nl0sIGJbOjEyOjZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMjo2OjRdLCBiWzI6Njo0XSkKKworICAgICAgICBhWzA6NV0gPSByYW5nZSg1LCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzA6NV0sIHJhbmdlKDUsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzA6NTpdLCByYW5nZSg1LCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs0OjotMV0sIHJhbmdlKDksIDQsIC0xKSkKKworICAgIGRlZiB0ZXN0X3NldHNsaWNlX2NpbnQoc2VsZik6CisgICAgICAgIGEgPSAoY19pbnQgKiAxMDApKCp4cmFuZ2UoMTEwMCwgMTIwMCkpCisgICAgICAgIGIgPSByYW5nZSgxMTAwLCAxMjAwKQorCisgICAgICAgIGFbMzI6NDddID0gcmFuZ2UoMzIsIDQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMzI6NDddLCByYW5nZSgzMiwgNDcpKQorICAgICAgICBhWzMyOjQ3XSA9IHJhbmdlKDEzMiwgMTQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMzI6NDc6XSwgcmFuZ2UoMTMyLCAxNDcpKQorICAgICAgICBhWzQ2OjMxOi0xXSA9IHJhbmdlKDIzMiwgMjQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMzI6NDc6MV0sIHJhbmdlKDI0NiwgMjMxLCAtMSkpCisKKyAgICAgICAgYVszMjo0N10gPSByYW5nZSgxMTMyLCAxMTQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOl0sIGIpCisgICAgICAgIGFbMzI6NDc6N10gPSByYW5nZSgzKQorICAgICAgICBiWzMyOjQ3OjddID0gcmFuZ2UoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBiKQorICAgICAgICBhWzMzOjotM10gPSByYW5nZSgxMikKKyAgICAgICAgYlszMzo6LTNdID0gcmFuZ2UoMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6XSwgYikKKworICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBzZXRzbGljZSwgc2V0aXRlbQorCisgICAgICAgICMgVHlwZUVycm9yOiBpbnQgZXhwZWN0ZWQgaW5zdGVhZCBvZiBzdHIgaW5zdGFuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRzbGljZSwgYSwgMCwgNSwgImFiY2RlIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRpdGVtLCBhLCBzbGljZSgwLCA1KSwgImFiY2RlIikKKyAgICAgICAgIyBUeXBlRXJyb3I6IGludCBleHBlY3RlZCBpbnN0ZWFkIG9mIHN0ciBpbnN0YW5jZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldHNsaWNlLCBhLCAwLCA1LCBbImEiLCAiYiIsICJjIiwgImQiLCAiZSJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGl0ZW0sIGEsIHNsaWNlKDAsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbImEiLCAiYiIsICJjIiwgImQiLCAiZSJdKQorICAgICAgICAjIFR5cGVFcnJvcjogaW50IGV4cGVjdGVkIGluc3RlYWQgb2YgZmxvYXQgaW5zdGFuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRzbGljZSwgYSwgMCwgNSwgWzEsIDIsIDMsIDQsIDMuMTRdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGl0ZW0sIGEsIHNsaWNlKDAsIDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbMSwgMiwgMywgNCwgMy4xNF0pCisgICAgICAgICMgVmFsdWVFcnJvcjogQ2FuIG9ubHkgYXNzaWduIHNlcXVlbmNlIG9mIHNhbWUgc2l6ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRzbGljZSwgYSwgMCwgNSwgcmFuZ2UoMzIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRpdGVtLCBhLCBzbGljZSgwLCA1KSwgcmFuZ2UoMzIpKQorCisgICAgZGVmIHRlc3RfY2hhcl9wdHIoc2VsZik6CisgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IFBPSU5URVIoY19jaGFyKQorICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQorICAgICAgICByZXMgPSBkbGwubXlfc3RyZHVwKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyldLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6M10sIHNbOjNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpOl0sIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0xOi0xOi0xXSwgc1s6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTE6NTotN10sIHNbOjU6LTddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1swOi0xOi0xXSwgc1swOjotMV0pCisKKyAgICAgICAgaW1wb3J0IG9wZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgc2xpY2UoMCwgTm9uZSwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgc2xpY2UoTm9uZSwgNSwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHNsaWNlKC01LCBOb25lLCBOb25lKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIDAsIDUsIHUiYWJjZGUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgc2xpY2UoMCwgNSksIHUiYWJjZGUiKQorICAgICAgICBkbGwubXlfZnJlZShyZXMpCisKKyAgICAgICAgZGxsLm15X3N0cmR1cC5yZXN0eXBlID0gUE9JTlRFUihjX2J5dGUpCisgICAgICAgIHJlcyA9IGRsbC5teV9zdHJkdXAocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKV0sIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKTpdLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIGRsbC5teV9mcmVlKHJlcykKKworICAgIGRlZiB0ZXN0X2NoYXJfcHRyX3dpdGhfZnJlZShzZWxmKToKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisKKyAgICAgICAgY2xhc3MgYWxsb2NhdGVkX2NfY2hhcl9wKGNfY2hhcl9wKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQorICAgICAgICBkZWYgZXJyY2hlY2socmVzdWx0LCBmdW5jLCBhcmdzKToKKyAgICAgICAgICAgIHJldHZhbCA9IHJlc3VsdC52YWx1ZQorICAgICAgICAgICAgZGxsLm15X2ZyZWUocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJldHZhbAorCisgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IGFsbG9jYXRlZF9jX2NoYXJfcAorICAgICAgICBkbGwubXlfc3RyZHVwLmVycmNoZWNrID0gZXJyY2hlY2sKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgZGxsLm15X3N0cmR1cC5lcnJjaGVjaworCisKKyAgICBkZWYgdGVzdF9jaGFyX2FycmF5KHNlbGYpOgorICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCisKKyAgICAgICAgcCA9IChjX2NoYXIgKiAyNykoKnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6XSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo6XSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo6LTFdLCBzWzo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbNTo6LTJdLCBzWzU6Oi0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzI6NTotM10sIHNbMjo1Oi0zXSkKKworCisgICAgdHJ5OgorICAgICAgICBjX3djaGFyCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGRlZiB0ZXN0X3djaGFyX3B0cihzZWxmKToKKyAgICAgICAgICAgIHMgPSB1ImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCisKKyAgICAgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQorICAgICAgICAgICAgZGxsLm15X3djc2R1cC5yZXN0eXBlID0gUE9JTlRFUihjX3djaGFyKQorICAgICAgICAgICAgZGxsLm15X3djc2R1cC5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCisgICAgICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQorICAgICAgICAgICAgcmVzID0gZGxsLm15X3djc2R1cChzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKV0sIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpOl0sIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTo1Oi03XSwgc1s6NTotN10pCisKKyAgICAgICAgICAgIGltcG9ydCBvcGVyYXRvcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcywgMCwgNSwgdSJhYmNkZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMsIHNsaWNlKDAsIDUpLCB1ImFiY2RlIikKKyAgICAgICAgICAgIGRsbC5teV9mcmVlKHJlcykKKworICAgICAgICAgICAgaWYgc2l6ZW9mKGNfd2NoYXIpID09IHNpemVvZihjX3Nob3J0KToKKyAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfc2hvcnQpCisgICAgICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19pbnQpOgorICAgICAgICAgICAgICAgIGRsbC5teV93Y3NkdXAucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCisgICAgICAgICAgICBlbGlmIHNpemVvZihjX3djaGFyKSA9PSBzaXplb2YoY19sb25nKToKKyAgICAgICAgICAgICAgICBkbGwubXlfd2NzZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfbG9uZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCisgICAgICAgICAgICB0bXBsID0gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpLTFdLCB0bXBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xOl0sIHRtcGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMjotMTotMV0sIHRtcGxbOjotMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMjo1Oi03XSwgdG1wbFs6NTotN10pCisgICAgICAgICAgICBkbGwubXlfZnJlZShyZXMpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc2OTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzc2OTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZWQ1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5CkBAIC0wLDAgKzEsNzUgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitsaWIgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKworY2xhc3MgU3RyaW5nUHRyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfX1BPSU5URVJfY19jaGFyKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoInN0ciIsIFBPSU5URVIoY19jaGFyKSldCisgICAgICAgIHggPSBYKCkKKworICAgICAgICAjIE5VTEwgcG9pbnRlciBhY2Nlc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZ2V0YXR0ciwgeC5zdHIsICJjb250ZW50cyIpCisgICAgICAgIGIgPSBjX2J1ZmZlcigiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGdldHJlZmNvdW50IGFzIGdyYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhiKSwgMikKKyAgICAgICAgeC5zdHIgPSBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKGIpLCAzKQorCisgICAgICAgICMgUE9JTlRFUihjX2NoYXIpIGFuZCBQeXRob24gc3RyaW5nIGlzIE5PVCBjb21wYXRpYmxlCisgICAgICAgICMgUE9JTlRFUihjX2NoYXIpIGFuZCBjX2J1ZmZlcigpIGlzIGNvbXBhdGlibGUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGIpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYltpXSwgeC5zdHJbaV0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCB4LCAic3RyIiwgIkhlbGxvLCBXb3JsZCIpCisKKyAgICBkZWYgdGVzdF9fY19jaGFyX3Aoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygic3RyIiwgY19jaGFyX3ApXQorICAgICAgICB4ID0gWCgpCisKKyAgICAgICAgIyBjX2NoYXJfcCBhbmQgUHl0aG9uIHN0cmluZyBpcyBjb21wYXRpYmxlCisgICAgICAgICMgY19jaGFyX3AgYW5kIGNfYnVmZmVyIGlzIE5PVCBjb21wYXRpYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHIsIE5vbmUpCisgICAgICAgIHguc3RyID0gIkhlbGxvLCBXb3JsZCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnN0ciwgIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIGIgPSBjX2J1ZmZlcigiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCB4LCAic3RyIiwgYikKKworCisgICAgZGVmIHRlc3RfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBzdHJjaHIgPSBsaWIubXlfc3RyY2hyCisgICAgICAgIHN0cmNoci5yZXN0eXBlID0gY19jaGFyX3AKKworICAgICAgICAjIGNfY2hhcl9wIGFuZCBQeXRob24gc3RyaW5nIGlzIGNvbXBhdGlibGUKKyAgICAgICAgIyBjX2NoYXJfcCBhbmQgY19idWZmZXIgYXJlIG5vdyBjb21wYXRpYmxlCisgICAgICAgIHN0cmNoci5hcmd0eXBlcyA9IGNfY2hhcl9wLCBjX2NoYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoImFiY2RlZiIsICJjIiksICJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoY19idWZmZXIoImFiY2RlZiIpLCAiYyIpLCAiY2RlZiIpCisKKyAgICAgICAgIyBQT0lOVEVSKGNfY2hhcikgYW5kIFB5dGhvbiBzdHJpbmcgaXMgTk9UIGNvbXBhdGlibGUKKyAgICAgICAgIyBQT0lOVEVSKGNfY2hhcikgYW5kIGNfYnVmZmVyKCkgaXMgY29tcGF0aWJsZQorICAgICAgICBzdHJjaHIuYXJndHlwZXMgPSBQT0lOVEVSKGNfY2hhciksIGNfY2hhcgorICAgICAgICBidWYgPSBjX2J1ZmZlcigiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoYnVmLCAiYyIpLCAiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAiYyIpLCAiY2RlZiIpCisKKyAgICAgICAgIyBYWFggVGhlc2UgY2FsbHMgYXJlIGRhbmdlcm91cywgYmVjYXVzZSB0aGUgZmlyc3QgYXJndW1lbnQKKyAgICAgICAgIyB0byBzdHJjaHIgaXMgbm8gbG9uZ2VyIHZhbGlkIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zIQorICAgICAgICAjIFNvIHdlIG11c3Qga2VlcCBhIHJlZmVyZW5jZSB0byBidWYgc2VwYXJhdGVseQorCisgICAgICAgIHN0cmNoci5yZXN0eXBlID0gUE9JTlRFUihjX2NoYXIpCisgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKCJhYmNkZWYiKQorICAgICAgICByID0gc3RyY2hyKGJ1ZiwgImMiKQorICAgICAgICB4ID0gclswXSwgclsxXSwgclsyXSwgclszXSwgcls0XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsICgiYyIsICJkIiwgImUiLCAiZiIsICJcMDAwIikpCisgICAgICAgIGRlbCBidWYKKyAgICAgICAgIyB4MSB3aWxsIE5PVCBiZSB0aGUgc2FtZSBhcyB4LCB1c3VhbGx5OgorICAgICAgICB4MSA9IHJbMF0sIHJbMV0sIHJbMl0sIHJbM10sIHJbNF0KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlZTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlZTk0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk0NWQwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5CkBAIC0wLDAgKzEsMjI1IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBTdHJpbmdBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgQlVGID0gY19jaGFyICogNAorCisgICAgICAgIGJ1ZiA9IEJVRigiYSIsICJiIiwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnJhdywgImFiY1wwMDAiKQorCisgICAgICAgIGJ1Zi52YWx1ZSA9ICJBQkNEIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgIkFCQ0QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5yYXcsICJBQkNEIikKKworICAgICAgICBidWYudmFsdWUgPSAieCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYucmF3LCAieFwwMDBDRCIpCisKKyAgICAgICAgYnVmWzFdID0gIloiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAieFpDRCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnJhdywgInhaQ0QiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGJ1ZiwgInZhbHVlIiwgImFhYWFhYWFhIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsIDQyKQorCisgICAgZGVmIHRlc3RfY19idWZmZXJfdmFsdWUoc2VsZiwgbWVtb3J5dmlldz1tZW1vcnl2aWV3KToKKyAgICAgICAgYnVmID0gY19idWZmZXIoMzIpCisKKyAgICAgICAgYnVmLnZhbHVlID0gIkhlbGxvLCBXb3JsZCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJIZWxsbywgV29ybGQiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBtZW1vcnl2aWV3KCJIZWxsbywgV29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsIG1lbW9yeXZpZXcoImFiYyIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJyYXciLCBtZW1vcnl2aWV3KCJ4IiAqIDEwMCkpCisKKyAgICBkZWYgdGVzdF9jX2J1ZmZlcl9yYXcoc2VsZiwgbWVtb3J5dmlldz1tZW1vcnl2aWV3KToKKyAgICAgICAgYnVmID0gY19idWZmZXIoMzIpCisKKyAgICAgICAgYnVmLnJhdyA9IG1lbW9yeXZpZXcoIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsIG1lbW9yeXZpZXcoImFiYyIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJyYXciLCBtZW1vcnl2aWV3KCJ4IiAqIDEwMCkpCisKKyAgICBkZWYgdGVzdF9jX2J1ZmZlcl9kZXByZWNhdGVkKHNlbGYpOgorICAgICAgICAjIENvbXBhdGliaWxpdHkgd2l0aCAyLngKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi50ZXN0X2NfYnVmZmVyX3ZhbHVlKGJ1ZmZlcikKKyAgICAgICAgICAgIHNlbGYudGVzdF9jX2J1ZmZlcl9yYXcoYnVmZmVyKQorCisgICAgZGVmIHRlc3RfcGFyYW1fMShzZWxmKToKKyAgICAgICAgQlVGID0gY19jaGFyICogNAorICAgICAgICBidWYgPSBCVUYoKQorIyMgICAgICAgIHByaW50IGNfY2hhcl9wLmZyb21fcGFyYW0oYnVmKQorCisgICAgZGVmIHRlc3RfcGFyYW1fMihzZWxmKToKKyAgICAgICAgQlVGID0gY19jaGFyICogNAorICAgICAgICBidWYgPSBCVUYoKQorIyMgICAgICAgIHByaW50IEJVRi5mcm9tX3BhcmFtKGNfY2hhcl9wKCJweXRob24iKSkKKyMjICAgICAgICBwcmludCBCVUYuZnJvbV9wYXJhbShCVUYoKiJweXRoIikpCisKK3RyeToKKyAgICBjX3djaGFyCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgV1N0cmluZ0FycmF5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgIEJVRiA9IGNfd2NoYXIgKiA0CisKKyAgICAgICAgICAgIGJ1ZiA9IEJVRih1ImEiLCB1ImIiLCB1ImMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiYWJjIikKKworICAgICAgICAgICAgYnVmLnZhbHVlID0gdSJBQkNEIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiQUJDRCIpCisKKyAgICAgICAgICAgIGJ1Zi52YWx1ZSA9IHUieCIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IngiKQorCisgICAgICAgICAgICBidWZbMV0gPSB1IloiCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4WkNEIikKKworY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBYWF90ZXN0X2Jhc2ljX3N0cmluZ3Moc2VsZik6CisgICAgICAgIGNzID0gY19zdHJpbmcoImFiY2RlZiIpCisKKyAgICAgICAgIyBDYW5ub3QgY2FsbCBsZW4gb24gYSBjX3N0cmluZyBhbnkgbG9uZ2VyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCBjcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoY3MpLCA3KQorCisgICAgICAgICMgVGhlIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IHRlcm1pbmF0aW5nIE5VTC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcy52YWx1ZSwgImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY19zdHJpbmcoImFiY1wwMDBkZWYiKS52YWx1ZSwgImFiYyIpCisKKyAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCAiYWJjZGVmXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY19zdHJpbmcoImFiY1wwMDBkZWYiKS5yYXcsICJhYmNcMDAwZGVmXDAwMCIpCisKKyAgICAgICAgIyBXZSBjYW4gY2hhbmdlIHRoZSB2YWx1ZToKKyAgICAgICAgY3MudmFsdWUgPSAiYWIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsICJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCAiYWJcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCisKKyAgICAgICAgY3MucmF3ID0gIlhZIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnZhbHVlLCAiWFkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnJhdywgIlhZXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19zdHJpbmcsIHUiMTIzIikKKworICAgIGRlZiBYWF90ZXN0X3NpemVkX3N0cmluZ3Moc2VsZik6CisKKyAgICAgICAgIyBOZXcgaW4gcmVsZWFzZXMgbGF0ZXIgdGhhbiAwLjQuMDoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3N0cmluZywgTm9uZSkKKworICAgICAgICAjIE5ldyBpbiByZWxlYXNlcyBsYXRlciB0aGFuIDAuNC4wOgorICAgICAgICAjIGNfc3RyaW5nKG51bWJlcikgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgb2Ygc2l6ZSBudW1iZXIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihjX3N0cmluZygzMikucmF3KSA9PSAzMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19zdHJpbmcsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3N0cmluZywgMCkKKworICAgICAgICAjIFRoZXNlIHRlc3RzIGZhaWwsIGJlY2F1c2UgaXQgaXMgbm8gbG9uZ2VyIGluaXRpYWxpemVkCisjIyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKDIpLnZhbHVlID09ICIiKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS5yYXcgPT0gIlwwMDBcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKDIpLnJhd1stMV0gPT0gIlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNfc3RyaW5nKDIpLnJhdykgPT0gMikKKworICAgIGRlZiBYWF90ZXN0X2luaXRpYWxpemVkX3N0cmluZ3Moc2VsZik6CisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1s6Ml0gPT0gImFiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1s6MjpdID09ICJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6LTFdID09ICJiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6Ml0gPT0gImEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3Wy0xXSA9PSAiXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCAyKS5yYXcgPT0gImFcMDAwIikKKworICAgIGRlZiBYWF90ZXN0X3Rvb2xvbmcoc2VsZik6CisgICAgICAgIGNzID0gY19zdHJpbmcoImFiY2RlZiIpCisgICAgICAgICMgTXVjaCB0b28gbG9uZyBzdHJpbmc6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCAiMTIzNDU2Nzg5MDEyMzQ1IikKKworICAgICAgICAjIE9uZSBjaGFyIHRvbyBsb25nIHZhbHVlczoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgY3MsICJ2YWx1ZSIsICIxMjM0NTY3IikKKworIyMgICAgZGVmIHRlc3RfcGVyZihzZWxmKToKKyMjICAgICAgICBjaGVja19wZXJmKCkKKwordHJ5OgorICAgIGNfd2NoYXIKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBXU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdF93Y2hhcihzZWxmKToKKyAgICAgICAgICAgIGNfd2NoYXIodSJ4IikKKyAgICAgICAgICAgIHJlcHIoYnlyZWYoY193Y2hhcih1IngiKSkpCisgICAgICAgICAgICBjX3djaGFyKCJ4IikKKworCisgICAgICAgIGRlZiBYX3Rlc3RfYmFzaWNfd3N0cmluZ3Moc2VsZik6CisgICAgICAgICAgICBjcyA9IGNfd3N0cmluZyh1ImFiY2RlZiIpCisKKyAgICAgICAgICAgICMgWFhYIFRoaXMgYmVoYXZpb3VyIGlzIGFib3V0IHRvIGNoYW5nZToKKyAgICAgICAgICAgICMgbGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlciBpbiBieXRlcy4KKyAgICAgICAgICAgICMgVGhpcyBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3Rlci4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplb2YoY3MpID09IDE0KQorCisgICAgICAgICAgICAjIFRoZSB2YWx1ZSBwcm9wZXJ0eSBpcyB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCB0ZXJtaW5hdGluZyBOVUwuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY3MudmFsdWUgPT0gdSJhYmNkZWYiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSA9PSB1ImFiYyIpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikudmFsdWUgPT0gdSJhYmMiKQorCisgICAgICAgICAgICAjIFRoZSByYXcgcHJvcGVydHkgaXMgdGhlIHRvdGFsIGJ1ZmZlciBjb250ZW50czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcy5yYXcgPT0gdSJhYmNkZWZcMDAwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikucmF3ID09IHUiYWJjXDAwMGRlZlwwMDAiKQorCisgICAgICAgICAgICAjIFdlIGNhbiBjaGFuZ2UgdGhlIHZhbHVlOgorICAgICAgICAgICAgY3MudmFsdWUgPSB1ImFiIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnZhbHVlID09IHUiYWIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnJhdyA9PSB1ImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfd3N0cmluZywgIjEyMyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3dzdHJpbmcsIDApCisKKyAgICAgICAgZGVmIFhfdGVzdF90b29sb25nKHNlbGYpOgorICAgICAgICAgICAgY3MgPSBjX3dzdHJpbmcodSJhYmNkZWYiKQorICAgICAgICAgICAgIyBNdWNoIHRvbyBsb25nIHN0cmluZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGF0dHIsIGNzLCAidmFsdWUiLCB1IjEyMzQ1Njc4OTAxMjM0NSIpCisKKyAgICAgICAgICAgICMgT25lIGNoYXIgdG9vIGxvbmcgdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgY3MsICJ2YWx1ZSIsIHUiMTIzNDU2NyIpCisKKworZGVmIHJ1bl90ZXN0KHJlcCwgbXNnLCBmdW5jLCBhcmcpOgorICAgIGl0ZW1zID0gcmFuZ2UocmVwKQorICAgIGZyb20gdGltZSBpbXBvcnQgY2xvY2sKKyAgICBzdGFydCA9IGNsb2NrKCkKKyAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgZnVuYyhhcmcpOyBmdW5jKGFyZyk7IGZ1bmMoYXJnKTsgZnVuYyhhcmcpOyBmdW5jKGFyZykKKyAgICBzdG9wID0gY2xvY2soKQorICAgIHByaW50ICIlMjBzOiAlLjJmIHVzIiAlIChtc2csICgoc3RvcC1zdGFydCkqMWU2LzUvcmVwKSkKKworZGVmIGNoZWNrX3BlcmYoKToKKyAgICAjIENvbnN0cnVjdCA1IG9iamVjdHMKKworICAgIFJFUCA9IDIwMDAwMAorCisgICAgcnVuX3Rlc3QoUkVQLCAiY19zdHJpbmcoTm9uZSkiLCBjX3N0cmluZywgTm9uZSkKKyAgICBydW5fdGVzdChSRVAsICJjX3N0cmluZygnYWJjJykiLCBjX3N0cmluZywgJ2FiYycpCisKKyMgUHl0aG9uIDIuMyAtT08sIHdpbjJrLCBQNCA3MDAgTUh6OgorIworIyAgICAgIGNfc3RyaW5nKE5vbmUpOiAxLjc1IHVzCisjICAgICBjX3N0cmluZygnYWJjJyk6IDIuNzQgdXMKKworIyBQeXRob24gMi4yIC1PTywgd2luMmssIFA0IDcwMCBNSHo6CisjCisjICAgICAgY19zdHJpbmcoTm9uZSk6IDIuOTUgdXMKKyMgICAgIGNfc3RyaW5nKCdhYmMnKTogMy42NyB1cworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisjIyAgICBjaGVja19wZXJmKCkKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI2M2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI2M2FjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJlYjNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5CkBAIC0wLDAgKzEsNTAgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworY2xhc3MgU3RydWN0RmllbGRzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgU3RydWN0dXJlL1VuaW9uIGNsYXNzZXMgbXVzdCBnZXQgJ2ZpbmFsaXplZCcgc29vbmVyIG9yCisgICAgIyBsYXRlciwgd2hlbiBvbmUgb2YgdGhlc2UgdGhpbmdzIGhhcHBlbjoKKyAgICAjCisgICAgIyAxLiBfZmllbGRzXyBpcyBzZXQuCisgICAgIyAyLiBBbiBpbnN0YW5jZSBpcyBjcmVhdGVkLgorICAgICMgMy4gVGhlIHR5cGUgaXMgdXNlZCBhcyBmaWVsZCBvZiBhbm90aGVyIFN0cnVjdHVyZS9Vbmlvbi4KKyAgICAjIDQuIFRoZSB0eXBlIGlzIHN1YmNsYXNzZWQKKyAgICAjCisgICAgIyBXaGVuIHRoZXkgYXJlIGZpbmFsaXplZCwgYXNzaWduaW5nIF9maWVsZHNfIGlzIG5vIGxvbmdlciBhbGxvd2VkLgorCisgICAgZGVmIHRlc3RfMV9BKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCAwKSAjIG5vdCBmaW5hbGl6ZWQKKyAgICAgICAgWC5fZmllbGRzXyA9IFtdICMgZmluYWxpemVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLCAiX2ZpZWxkc18iLCBbXSkKKworICAgIGRlZiB0ZXN0XzFfQihzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbXSAjIGZpbmFsaXplZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWCwgIl9maWVsZHNfIiwgW10pCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIFgoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWCwgIl9maWVsZHNfIiwgW10pCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFkoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIFgpXSAjIGZpbmFsaXplcyBYCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLCAiX2ZpZWxkc18iLCBbXSkKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgWShYKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQorICAgICAgICBZLl9maWVsZHNfID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmYyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxkcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmYyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxkcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDdjODE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTAsMCArMSw0NzggQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2Zyb20gc3RydWN0IGltcG9ydCBjYWxjc2l6ZQoraW1wb3J0IF90ZXN0Y2FwaQorCitjbGFzcyBTdWJjbGFzc2VzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBZKFgpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJiIiwgY19pbnQpXQorCisgICAgICAgIGNsYXNzIFooWCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoY19pbnQpKjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFopLCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuX2ZpZWxkc18sIFsoImIiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFouX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfZGVsYXllZChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgMCkKKyAgICAgICAgWC5fZmllbGRzXyA9IFsoImEiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgWShYKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWSksIHNpemVvZihYKSkKKyAgICAgICAgWS5fZmllbGRzXyA9IFsoImIiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgWihYKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWSksIHNpemVvZihjX2ludCkqMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWiksIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWS5fZmllbGRzXywgWygiYiIsIGNfaW50KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWi5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCisKK2NsYXNzIFN0cnVjdHVyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBmb3JtYXRzID0geyJjIjogY19jaGFyLAorICAgICAgICAgICAgICAgImIiOiBjX2J5dGUsCisgICAgICAgICAgICAgICAiQiI6IGNfdWJ5dGUsCisgICAgICAgICAgICAgICAiaCI6IGNfc2hvcnQsCisgICAgICAgICAgICAgICAiSCI6IGNfdXNob3J0LAorICAgICAgICAgICAgICAgImkiOiBjX2ludCwKKyAgICAgICAgICAgICAgICJJIjogY191aW50LAorICAgICAgICAgICAgICAgImwiOiBjX2xvbmcsCisgICAgICAgICAgICAgICAiTCI6IGNfdWxvbmcsCisgICAgICAgICAgICAgICAicSI6IGNfbG9uZ2xvbmcsCisgICAgICAgICAgICAgICAiUSI6IGNfdWxvbmdsb25nLAorICAgICAgICAgICAgICAgImYiOiBjX2Zsb2F0LAorICAgICAgICAgICAgICAgImQiOiBjX2RvdWJsZSwKKyAgICAgICAgICAgICAgIH0KKworICAgIGRlZiB0ZXN0X3NpbXBsZV9zdHJ1Y3RzKHNlbGYpOgorICAgICAgICBmb3IgY29kZSwgdHAgaW4gc2VsZi5mb3JtYXRzLml0ZW1zKCk6CisgICAgICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCB0cCldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzaXplb2YoWCksIGNvZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGNzaXplKCJjJWMwJWMiICUgKGNvZGUsIGNvZGUpKSwgY29kZSkpCisKKyAgICBkZWYgdGVzdF91bmlvbnMoc2VsZik6CisgICAgICAgIGZvciBjb2RlLCB0cCBpbiBzZWxmLmZvcm1hdHMuaXRlbXMoKToKKyAgICAgICAgICAgIGNsYXNzIFgoVW5pb24pOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfY2hhciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgdHApXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoc2l6ZW9mKFgpLCBjb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxjc2l6ZSgiJWMiICUgKGNvZGUpKSwgY29kZSkpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfYWxpZ25tZW50KHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2NoYXIgKiAzKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWCksIGNhbGNzaXplKCJzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBjYWxjc2l6ZSgiM3MiKSkKKworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2NoYXIgKiAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWSksIGNhbGNzaXplKCJpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBjYWxjc2l6ZSgiM3NpIikpCisKKyAgICAgICAgY2xhc3MgU0koU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIFgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgWSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpZ25tZW50KFNJKSwgbWF4KGFsaWdubWVudChZKSwgYWxpZ25tZW50KFgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoU0kpLCBjYWxjc2l6ZSgiM3MwaSAzc2kgMGkiKSkKKworICAgICAgICBjbGFzcyBJUyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJiIiwgWSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImEiLCBYKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWCksIGFsaWdubWVudChZKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKElTKSwgY2FsY3NpemUoIjNzaSAzcyAwaSIpKQorCisgICAgICAgIGNsYXNzIFhYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBYKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIFgpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChYWCksIGFsaWdubWVudChYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWFgpLCBjYWxjc2l6ZSgiM3MgM3MgMHMiKSkKKworICAgIGRlZiB0ZXN0X2VtdHB5KHNlbGYpOgorICAgICAgICAjIEkgaGFkIHByb2JsZW1zIHdpdGggdGhlc2UKKyAgICAgICAgIworICAgICAgICAjIEFsdGhvdWdoIHRoZXNlIGFyZSBwYXRvbG9naWNhbCBjYXNlczogRW1wdHkgU3RydWN0dXJlcyEKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgIGNsYXNzIFkoVW5pb24pOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbXQorCisgICAgICAgICMgSXMgdGhpcyByZWFsbHkgdGhlIGNvcnJlY3QgYWxpZ25tZW50LCBvciBzaG91bGQgaXQgYmUgMD8KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsaWdubWVudChYKSA9PSBhbGlnbm1lbnQoWSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpemVvZihYKSA9PSBzaXplb2YoWSkgPT0gMCkKKworICAgICAgICBjbGFzcyBYWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgWCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBYKV0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChYWCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFhYKSwgMCkKKworICAgIGRlZiB0ZXN0X2ZpZWxkcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoZSBvZmZzZXQgYW5kIHNpemUgYXR0cmlidXRlcyBvZiBTdHJ1Y3R1cmUvVW5vaW4gZmllbGRzLgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2NoYXIpXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC54Lm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnguc2l6ZSwgc2l6ZW9mKGNfaW50KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5vZmZzZXQsIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC55LnNpemUsIHNpemVvZihjX2NoYXIpKQorCisgICAgICAgICMgcmVhZG9ubHkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCisKKyAgICAgICAgY2xhc3MgWChVbmlvbik6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2NoYXIpXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC54Lm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnguc2l6ZSwgc2l6ZW9mKGNfaW50KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC55LnNpemUsIHNpemVvZihjX2NoYXIpKQorCisgICAgICAgICMgcmVhZG9ubHkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCisKKyAgICAgICAgIyBYWFggU2hvdWxkIHdlIGNoZWNrIG5lc3RlZCBkYXRhIHR5cGVzIGFsc28/CisgICAgICAgICMgb2Zmc2V0IGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUgY2xhc3MuLi4KKworICAgIGRlZiB0ZXN0X3BhY2tlZChzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQorICAgICAgICAgICAgX3BhY2tfID0gMQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIDEpCisKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQorICAgICAgICAgICAgX3BhY2tfID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgMikKKworICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZyldCisgICAgICAgICAgICBfcGFja18gPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCA0KQorCisgICAgICAgIGltcG9ydCBzdHJ1Y3QKKyAgICAgICAgbG9uZ2xvbmdfc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSgicSIpCisgICAgICAgIGxvbmdsb25nX2FsaWduID0gc3RydWN0LmNhbGNzaXplKCJicSIpIC0gbG9uZ2xvbmdfc2l6ZQorCisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KKyAgICAgICAgICAgIF9wYWNrXyA9IDgKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgbG9uZ2xvbmdfYWxpZ24gKyBsb25nbG9uZ19zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIG1pbig4LCBsb25nbG9uZ19hbGlnbikpCisKKworICAgICAgICBkID0geyJfZmllbGRzXyI6IFsoImEiLCAiYiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCAicSIpXSwKKyAgICAgICAgICAgICAiX3BhY2tfIjogLTF9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR5cGUoU3RydWN0dXJlKSwgIlgiLCAoU3RydWN0dXJlLCksIGQpCisKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBkID0geyJfZmllbGRzXyI6IFsoImEiLCBjX2J5dGUpXSwKKyAgICAgICAgICAgICAiX3BhY2tfIjogX3Rlc3RjYXBpLklOVF9NQVggKyAxfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0eXBlKFN0cnVjdHVyZSksICJYIiwgKFN0cnVjdHVyZSwpLCBkKQorICAgICAgICBkID0geyJfZmllbGRzXyI6IFsoImEiLCBjX2J5dGUpXSwKKyAgICAgICAgICAgICAiX3BhY2tfIjogX3Rlc3RjYXBpLlVJTlRfTUFYICsgMn0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHlwZShTdHJ1Y3R1cmUpLCAiWCIsIChTdHJ1Y3R1cmUsKSwgZCkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVycyhzZWxmKToKKyAgICAgICAgY2xhc3MgUGVyc29uKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIm5hbWUiLCBjX2NoYXIqNiksCisgICAgICAgICAgICAgICAgICAgICAgICAoImFnZSIsIGNfaW50KV0KKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBlcnNvbiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFBlcnNvbiwgImFzbGRramFzbGtkamFzbGtkaiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgUGVyc29uLCAiTmFtZSIsICJISSIpCisKKyAgICAgICAgIyBzaG9ydCBlbm91Z2gKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZXJzb24oIjEyMzQ1IiwgNSkubmFtZSwgIjEyMzQ1IikKKyAgICAgICAgIyBleGFjdCBmaXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZXJzb24oIjEyMzQ1NiIsIDUpLm5hbWUsICIxMjM0NTYiKQorICAgICAgICAjIHRvbyBsb25nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFBlcnNvbiwgIjEyMzQ1NjciLCA1KQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RpbmdfaW5pdGlhbGl6ZXJzKHNlbGYpOgorICAgICAgICBjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLCAoInkiLCBjX2ludCldCisgICAgICAgICMgY29uZmxpY3RpbmcgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgUE9JTlQsIDIsIDMsIHg9NCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQT0lOVCwgMiwgMywgeT00KQorCisgICAgICAgICMgdG9vIG1hbnkgaW5pdGlhbGl6ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgUE9JTlQsIDIsIDMsIDQpCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2luaXRpYWxpemVycyhzZWxmKToKKyAgICAgICAgY2xhc3MgUE9JTlQoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwgKCJ5IiwgY19pbnQpXQorICAgICAgICBwdCA9IFBPSU5UKDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHB0LngsIHB0LnkpLCAoMSwgMikpCisKKyAgICAgICAgcHQgPSBQT0lOVCh5PTIsIHg9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZmllbGRfdHlwZXMoc2VsZik6CisgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgUE9JTlQsICJfZmllbGRzXyIsIFsoIngiLCAxKSwgKCJ5IiwgMildKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9uYW1lKHNlbGYpOgorICAgICAgICAjIGZpZWxkIG5hbWUgbXVzdCBiZSBzdHJpbmcKKyAgICAgICAgZGVmIGRlY2xhcmVfd2l0aF9uYW1lKG5hbWUpOgorICAgICAgICAgICAgY2xhc3MgUyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWyhuYW1lLCBjX2ludCldCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWNsYXJlX3dpdGhfbmFtZSwgdSJ4XHhlOSIpCisKKyAgICBkZWYgdGVzdF9pbnRhcnJheV9maWVsZHMoc2VsZik6CisgICAgICAgIGNsYXNzIFNvbWVJbnRzKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCAqIDQpXQorCisgICAgICAgICMgY2FuIHVzZSB0dXBsZSB0byBpbml0aWFsaXplIGFycmF5IChidXQgbm90IGxpc3QhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6XSwgWzEsIDIsIDAsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6Ol0sIFsxLCAyLCAwLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOjotMV0sIFswLCAwLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOjoyXSwgWzEsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVsxOjU6Nl0sIFsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbNjo0Oi0xXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzpdLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzo6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICAjIHRvbyBsb25nCisgICAgICAgICMgWFhYIFNob3VsZCByYWlzZSBWYWx1ZUVycm9yPywgbm90IFJ1bnRpbWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIFNvbWVJbnRzLCAoMSwgMiwgMywgNCwgNSkpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfaW5pdGlhbGl6ZXJzKHNlbGYpOgorICAgICAgICAjIHRlc3QgaW5pdGlhbGl6aW5nIG5lc3RlZCBzdHJ1Y3R1cmVzCisgICAgICAgIGNsYXNzIFBob25lKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImFyZWFjb2RlIiwgY19jaGFyKjYpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJudW1iZXIiLCBjX2NoYXIqMTIpXQorCisgICAgICAgIGNsYXNzIFBlcnNvbihTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJuYW1lIiwgY19jaGFyICogMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJwaG9uZSIsIFBob25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYWdlIiwgY19pbnQpXQorCisgICAgICAgIHAgPSBQZXJzb24oIlNvbWVvbmUiLCAoIjEyMzQiLCAiNTY3OCIpLCA1KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uYW1lLCAiU29tZW9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5waG9uZS5hcmVhY29kZSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGhvbmUubnVtYmVyLCAiNTY3OCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5hZ2UsIDUpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3R1cmVzX3dpdGhfd2NoYXIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNfd2NoYXIKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAjIG5vIHVuaWNvZGUKKworICAgICAgICBjbGFzcyBQZXJzb25XKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIm5hbWUiLCBjX3djaGFyICogMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJhZ2UiLCBjX2ludCldCisKKyAgICAgICAgcCA9IFBlcnNvblcodSJTb21lb25lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5hbWUsICJTb21lb25lIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBlcnNvblcodSIxMjM0NTY3ODkwIikubmFtZSwgdSIxMjM0NTY3ODkwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZXJzb25XKHUiMTIzNDU2Nzg5MDEiKS5uYW1lLCB1IjEyMzQ1Njc4OTAxIikKKyAgICAgICAgIyBleGFjdCBmaXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZXJzb25XKHUiMTIzNDU2Nzg5MDEyIikubmFtZSwgdSIxMjM0NTY3ODkwMTIiKQorICAgICAgICAjdG9vIGxvbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgUGVyc29uVywgdSIxMjM0NTY3ODkwMTIzIikKKworICAgIGRlZiB0ZXN0X2luaXRfZXJyb3JzKHNlbGYpOgorICAgICAgICBjbGFzcyBQaG9uZShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhcmVhY29kZSIsIGNfY2hhcio2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgibnVtYmVyIiwgY19jaGFyKjEyKV0KKworICAgICAgICBjbGFzcyBQZXJzb24oU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhciAqIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgicGhvbmUiLCBQaG9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImFnZSIsIGNfaW50KV0KKworICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sICJTb21lb25lIiwgKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNscywgUnVudGltZUVycm9yKQorICAgICAgICAjIEluIFB5dGhvbiAyLjUsIEV4Y2VwdGlvbiBpcyBhIG5ldy1zdHlsZSBjbGFzcywgYW5kIHRoZSByZXByIGNoYW5nZWQKKyAgICAgICAgaWYgaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoUGhvbmUpIDx0eXBlICdleGNlcHRpb25zLlR5cGVFcnJvcic+OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0LCBpbnQgZm91bmQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSBleGNlcHRpb25zLlR5cGVFcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKKworICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sICJTb21lb25lIiwgKCJhIiwgImIiLCAiYyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNscywgUnVudGltZUVycm9yKQorICAgICAgICBpZiBpc3N1YmNsYXNzKEV4Y2VwdGlvbiwgb2JqZWN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgPHR5cGUgJ2V4Y2VwdGlvbnMuVHlwZUVycm9yJz46IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisKKyAgICBkZWYgdGVzdF9odWdlX2ZpZWxkX25hbWUoc2VsZik6CisgICAgICAgICMgaXNzdWUxMjg4MTogc2VnZmF1bHQgd2l0aCBsYXJnZSBzdHJ1Y3R1cmUgZmllbGQgbmFtZXMKKyAgICAgICAgZGVmIGNyZWF0ZV9jbGFzcyhsZW5ndGgpOgorICAgICAgICAgICAgY2xhc3MgUyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygneCcgKiBsZW5ndGgsIGNfaW50KV0KKworICAgICAgICBmb3IgbGVuZ3RoIGluIFsxMCAqKiBpIGZvciBpIGluIHJhbmdlKDAsIDgpXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjcmVhdGVfY2xhc3MobGVuZ3RoKQorICAgICAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgICAgICMgTWVtb3J5RXJyb3JzIGFyZSBPSywgd2UganVzdCBkb24ndCB3YW50IHRvIHNlZ2ZhdWx0CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGdldF9leGNlcHQoc2VsZiwgZnVuYywgKmFyZ3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jKCphcmdzKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBkZXRhaWw6CisgICAgICAgICAgICByZXR1cm4gZGV0YWlsLl9fY2xhc3NfXywgc3RyKGRldGFpbCkKKworCisjIyAgICBkZWYgdGVzdF9zdWJjbGFzc19jcmVhdGlvbihzZWxmKToKKyMjICAgICAgICBtZXRhID0gdHlwZShTdHJ1Y3R1cmUpCisjIyAgICAgICAgIyBzYW1lIGFzICdjbGFzcyBYKFN0cnVjdHVyZSk6IHBhc3MnCisjIyAgICAgICAgIyBmYWlscywgc2luY2Ugd2UgbmVlZCBlaXRoZXIgYSBfZmllbGRzXyBvciBhIF9hYnN0cmFjdF8gYXR0cmlidXRlCisjIyAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQobWV0YSwgIlgiLCAoU3RydWN0dXJlLCksIHt9KQorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNscywgbXNnKSwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXR0cmlidXRlRXJyb3IsICJjbGFzcyBtdXN0IGRlZmluZSBhICdfZmllbGRzXycgYXR0cmlidXRlIikpCisKKyAgICBkZWYgdGVzdF9hYnN0cmFjdF9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2Fic3RyYWN0XyA9ICJzb21ldGhpbmciCisgICAgICAgICMgdHJ5ICdYKCknCisgICAgICAgIGNscywgbXNnID0gc2VsZi5nZXRfZXhjZXB0KGV2YWwsICJYKCkiLCBsb2NhbHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY2xzLCBtc2cpLCAoVHlwZUVycm9yLCAiYWJzdHJhY3QgY2xhc3MiKSkKKworICAgIGRlZiB0ZXN0X21ldGhvZHMoc2VsZik6CisjIyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorIyMgICAgICAgICAgICBfZmllbGRzXyA9IFtdCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJpbl9kbGwiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZyb21fYWRkcmVzcyIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKKworICAgIGRlZiB0ZXN0X3Bvc2l0aW9uYWxfYXJncyhzZWxmKToKKyAgICAgICAgIyBzZWUgYWxzbyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNTA0MgorICAgICAgICBjbGFzcyBXKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCksICgiYiIsIGNfaW50KV0KKyAgICAgICAgY2xhc3MgWChXKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYyIsIGNfaW50KV0KKyAgICAgICAgY2xhc3MgWShYKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgWihZKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiZCIsIGNfaW50KSwgKCJlIiwgY19pbnQpLCAoImYiLCBjX2ludCldCisKKyAgICAgICAgeiA9IFooMSwgMiwgMywgNCwgNSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoei5hLCB6LmIsIHouYywgei5kLCB6LmUsIHouZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIDIsIDMsIDQsIDUsIDYpKQorICAgICAgICB6ID0gWigxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh6LmEsIHouYiwgei5jLCB6LmQsIHouZSwgei5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBaKDEsIDIsIDMsIDQsIDUsIDYsIDcpKQorCitjbGFzcyBQb2ludGVyTWVtYmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICMgYSBTdHJ1Y3R1cmUgd2l0aCBhIFBPSU5URVIgZmllbGQKKyAgICAgICAgY2xhc3MgUyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhcnJheSIsIFBPSU5URVIoY19pbnQpKV0KKworICAgICAgICBzID0gUygpCisgICAgICAgICMgV2UgY2FuIGFzc2lnbiBhcnJheXMgb2YgdGhlIGNvcnJlY3QgdHlwZQorICAgICAgICBzLmFycmF5ID0gKGNfaW50ICogMykoMSwgMiwgMykKKyAgICAgICAgaXRlbXMgPSBbcy5hcnJheVtpXSBmb3IgaSBpbiByYW5nZSgzKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgWzEsIDIsIDNdKQorCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBhcmUgYnVncywgYnV0IGFyZSBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaXR0ZXN0cworICAgICAgICAjIGFsc28gZGVzY3JpYmUgdGhlIGN1cnJlbnQgYmVoYXZpb3VyLgorICAgICAgICAjCisgICAgICAgICMgVGhpcyBmYWlscyB3aXRoIFN5c3RlbUVycm9yOiBiYWQgYXJnIHRvIGludGVybmFsIGZ1bmN0aW9uCisgICAgICAgICMgb3Igd2l0aCBJbmRleEVycm9yICh3aXRoIGEgcGF0Y2ggSSBoYXZlKQorCisgICAgICAgIHMuYXJyYXlbMF0gPSA0MgorCisgICAgICAgIGl0ZW1zID0gW3MuYXJyYXlbaV0gZm9yIGkgaW4gcmFuZ2UoMyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFs0MiwgMiwgM10pCisKKyAgICAgICAgcy5hcnJheVswXSA9IDEKKworIyMgICAgICAgIHMuYXJyYXlbMV0gPSA0MgorCisgICAgICAgIGl0ZW1zID0gW3MuYXJyYXlbaV0gZm9yIGkgaW4gcmFuZ2UoMyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKKworICAgIGRlZiB0ZXN0X25vbmVfdG9fcG9pbnRlcl9maWVsZHMoc2VsZik6CisgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgicCIsIFBPSU5URVIoY19pbnQpKV0KKworICAgICAgICBzID0gUygpCisgICAgICAgIHMueCA9IDEyMzQ1Njc4CisgICAgICAgIHMucCA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLngsIDEyMzQ1Njc4KQorCitjbGFzcyBUZXN0UmVjdXJzaXZlU3RydWN0dXJlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jb250YWluc19pdHNlbGYoc2VsZik6CisgICAgICAgIGNsYXNzIFJlY3Vyc2l2ZShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFJlY3Vyc2l2ZS5fZmllbGRzXyA9IFsoIm5leHQiLCBSZWN1cnNpdmUpXQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGRldGFpbHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKGRldGFpbHMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTdHJ1Y3R1cmUgb3IgdW5pb24gY2Fubm90IGNvbnRhaW4gaXRzZWxmIikKKworCisgICAgZGVmIHRlc3RfdmljZV92ZXJzYShzZWxmKToKKyAgICAgICAgY2xhc3MgRmlyc3QoU3RydWN0dXJlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgU2Vjb25kKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgRmlyc3QuX2ZpZWxkc18gPSBbKCJzZWNvbmQiLCBTZWNvbmQpXQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFNlY29uZC5fZmllbGRzXyA9IFsoImZpcnN0IiwgRmlyc3QpXQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGRldGFpbHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9maWVsZHNfIGlzIGZpbmFsIiBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihkZXRhaWxzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQXR0cmlidXRlRXJyb3Igbm90IHJhaXNlZCIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMzU3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkMzU3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNhY2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQpAQCAtMCwwICsxLDQ1IEBACitpbXBvcnQgc3lzLCB1bml0dGVzdAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKKworc3RydWN0dXJlcyA9IFtdCitieXRlc3dhcHBlZF9zdHJ1Y3R1cmVzID0gW10KKworCitpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgIFN3YXBwZWRTdHJ1Y3R1cmUgPSBCaWdFbmRpYW5TdHJ1Y3R1cmUKK2Vsc2U6CisgICAgU3dhcHBlZFN0cnVjdHVyZSA9IExpdHRsZUVuZGlhblN0cnVjdHVyZQorCitmb3IgdHlwIGluIFtjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nLAorICAgICAgICAgICAgY19mbG9hdCwgY19kb3VibGUsCisgICAgICAgICAgICBjX3VzaG9ydCwgY191aW50LCBjX3Vsb25nLCBjX3Vsb25nbG9uZ106CisgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgorICAgICAgICBfcGFja18gPSAxCisgICAgICAgIF9maWVsZHNfID0gWygicGFkIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgKCJ2YWx1ZSIsIHR5cCldCisgICAgY2xhc3MgWShTd2FwcGVkU3RydWN0dXJlKToKKyAgICAgICAgX3BhY2tfID0gMQorICAgICAgICBfZmllbGRzXyA9IFsoInBhZCIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICgidmFsdWUiLCB0eXApXQorICAgIHN0cnVjdHVyZXMuYXBwZW5kKFgpCisgICAgYnl0ZXN3YXBwZWRfc3RydWN0dXJlcy5hcHBlbmQoWSkKKworY2xhc3MgVGVzdFN0cnVjdHVyZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X25hdGl2ZShzZWxmKToKKyAgICAgICAgZm9yIHR5cCBpbiBzdHJ1Y3R1cmVzOgorIyMgICAgICAgICAgICBwcmludCB0eXAudmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKKyAgICAgICAgICAgIG8gPSB0eXAoKQorICAgICAgICAgICAgby52YWx1ZSA9IDQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby52YWx1ZSwgNCkKKworICAgIGRlZiB0ZXN0X3N3YXBwZWQoc2VsZik6CisgICAgICAgIGZvciB0eXAgaW4gYnl0ZXN3YXBwZWRfc3RydWN0dXJlczoKKyMjICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgdHlwLnZhbHVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cC52YWx1ZS5vZmZzZXQsIDEpCisgICAgICAgICAgICBvID0gdHlwKCkKKyAgICAgICAgICAgIG8udmFsdWUgPSA0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8udmFsdWUsIDQpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1Njg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTc0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtMCwwICsxLDEyOSBAQAorIyBjb2Rpbmc6IGxhdGluLTEKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGN0eXBlcworCit0cnk6CisgICAgY3R5cGVzLmNfd2NoYXIKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICBkbGwgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgd2NzbGVuID0gZGxsLm15X3djc2xlbgorICAgIHdjc2xlbi5hcmd0eXBlcyA9IFtjdHlwZXMuY193Y2hhcl9wXQorCisKKyAgICBjbGFzcyBVbmljb2RlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICBzZWxmLnByZXZfY29udl9tb2RlID0gY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisKKyAgICAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoKnNlbGYucHJldl9jb252X21vZGUpCisKKyAgICAgICAgZGVmIHRlc3RfYXNjaWlfc3RyaWN0KHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgInN0cmljdCIpCisgICAgICAgICAgICAjIG5vIGNvbnZlcnNpb25zIHRha2UgcGxhY2Ugd2l0aCB1bmljb2RlIGFyZ3VtZW50cworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgICMgc3RyaW5nIGFyZ3MgYXJlIGNvbnZlcnRlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3R5cGVzLkFyZ3VtZW50RXJyb3IsIHdjc2xlbiwgImFi5CIpCisKKyAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWLkIiksIDMpCisKKyAgICAgICAgZGVmIHRlc3RfYXNjaWlfaWdub3JlKHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQorICAgICAgICAgICAgIyBpZ25vcmUgZXJyb3IgbW9kZSBza2lwcyBub24tYXNjaWkgY2hhcmFjdGVycworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oIuT2/N8iKSwgMCkKKworICAgICAgICBkZWYgdGVzdF9sYXRpbjFfc3RyaWN0KHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImxhdGluLTEiLCAic3RyaWN0IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQorCisgICAgICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCisKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCB1ImFiXHVGRkZEXHVGRkZEXHVGRkZEXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjpdLCB1ImFiXHVGRkZEXHVGRkZEXHVGRkZEXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sIHUiXDBcdUZGRkRcdUZGRkRcdUZGRkRiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCB1ImFcdUZGRkRcdUZGRkQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQorCisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKKyAgICAgICAgICAgICMgaXMgdGhhdCBjb3JyZWN0PyBub3Qgc3VyZS4gIEJ1dCB3aXRoICdpZ25vcmUnLCB5b3UgZ2V0IHdoYXQgeW91IHBheSBmb3IuLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgdSJcMFwwXDBcMGJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQorCisgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAorICAgIGZ1bmMgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLl90ZXN0ZnVuY19wX3AKKworICAgIGNsYXNzIFN0cmluZ1Rlc3RDYXNlKFVuaWNvZGVUZXN0Q2FzZSk6CisgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgIHNlbGYucHJldl9jb252X21vZGUgPSBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBbY3R5cGVzLmNfY2hhcl9wXQorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY3R5cGVzLmNfY2hhcl9wCisKKyAgICAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoKnNlbGYucHJldl9jb252X21vZGUpCisgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gTm9uZQorICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY3R5cGVzLmNfaW50CisKKyAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjdHlwZXMuQXJndW1lbnRFcnJvciwgZnVuYywgdSJhYuQiKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX2lnbm9yZShzZWxmKToKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmModSLk9vzfIiksICIiKQorCisgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQorCisgICAgICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCisKKyAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFi5Pb8IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzpdLCAiYWI/Pz9cMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sICJhYj8/P1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCAiXDA/Pz9iYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6OjJdLCAiYT8/IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sICIiKQorCisgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKKyAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFi5Pb8IikKKyAgICAgICAgICAgICMgaXMgdGhhdCBjb3JyZWN0PyBub3Qgc3VyZS4gIEJ1dCB3aXRoICdpZ25vcmUnLCB5b3UgZ2V0IHdoYXQgeW91IHBheSBmb3IuLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiXDBcMFwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMFwwXDBcMGJhIikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU4NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU4NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYmZkNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CkBAIC0wLDAgKzEsODIgQEAKKyIiIgorQSB0ZXN0Y2FzZSB3aGljaCBhY2Nlc3NlcyAqdmFsdWVzKiBpbiBhIGRsbC4KKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY3R5cGVzIGltcG9ydCAqCisKK2ltcG9ydCBfY3R5cGVzX3Rlc3QKKworY2xhc3MgVmFsdWVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYW5faW50ZWdlcihzZWxmKToKKyAgICAgICAgY3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgYW5faW50ZWdlciA9IGNfaW50LmluX2RsbChjdGRsbCwgImFuX2ludGVnZXIiKQorICAgICAgICB4ID0gYW5faW50ZWdlci52YWx1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGN0ZGxsLmdldF9hbl9pbnRlZ2VyKCkpCisgICAgICAgIGFuX2ludGVnZXIudmFsdWUgKj0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgqMiwgY3RkbGwuZ2V0X2FuX2ludGVnZXIoKSkKKworICAgIGRlZiB0ZXN0X3VuZGVmaW5lZChzZWxmKToKKyAgICAgICAgY3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY19pbnQuaW5fZGxsLCBjdGRsbCwgIlVuZGVmaW5lZF9TeW1ib2wiKQorCisgICAgY2xhc3MgV2luX1ZhbHVlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgIiIiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2hlbiBweXRob24gaXRzZWxmIGlzIGEgZGxsL3NoYXJlZCBsaWJyYXJ5IiIiCisKKyAgICAgICAgZGVmIHRlc3Rfb3B0aW1pemVmbGFnKHNlbGYpOgorICAgICAgICAgICAgIyBUaGlzIHRlc3QgYWNjZXNzZXMgdGhlIFB5X09wdGltaXplRmxhZyBpbnRnZXIsIHdoaWNoIGlzCisgICAgICAgICAgICAjIGV4cG9ydGVkIGJ5IHRoZSBQeXRob24gZGxsLgorCisgICAgICAgICAgICAjIEl0J3MgdmFsdWUgaXMgc2V0IGRlcGVuZGluZyBvbiB0aGUgLU8gYW5kIC1PTyBmbGFnczoKKyAgICAgICAgICAgICMgaWYgbm90IGdpdmVuLCBpdCBpcyAwIGFuZCBfX2RlYnVnX18gaXMgMS4KKyAgICAgICAgICAgICMgSWYgLU8gaXMgZ2l2ZW4sIHRoZSBmbGFnIGlzIDEsIGZvciAtT08gaXQgaXMgMi4KKyAgICAgICAgICAgICMgZG9jc3RyaW5ncyBhcmUgYWxzbyByZW1vdmVkIGluIHRoZSBsYXR0ZXIgY2FzZS4KKyAgICAgICAgICAgIG9wdCA9IGNfaW50LmluX2RsbChweWRsbCwgIlB5X09wdGltaXplRmxhZyIpLnZhbHVlCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDApCisgICAgICAgICAgICBlbGlmIFZhbHVlc1Rlc3RDYXNlLl9fZG9jX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAyKQorCisgICAgICAgIGRlZiB0ZXN0X2Zyb3plbnRhYmxlKHNlbGYpOgorICAgICAgICAgICAgIyBQeXRob24gZXhwb3J0cyBhIFB5SW1wb3J0X0Zyb3plbk1vZHVsZXMgc3ltYm9sLiBUaGlzIGlzIGEKKyAgICAgICAgICAgICMgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzdHJ1Y3QgX2Zyb3plbiBlbnRyaWVzLiAgVGhlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICMgYXJyYXkgaXMgbWFya2VkIGJ5IGFuIGVudHJ5IGNvbnRhaW5pbmcgYSBOVUxMIG5hbWUgYW5kIHplcm8KKyAgICAgICAgICAgICMgc2l6ZS4KKworICAgICAgICAgICAgIyBJbiBzdGFuZGFyZCBQeXRob24sIHRoaXMgdGFibGUgY29udGFpbnMgYSBfX2hlbGxvX18KKyAgICAgICAgICAgICMgbW9kdWxlLCBhbmQgYSBfX3BoZWxsb19fIHBhY2thZ2UgY29udGFpbmluZyBhIHNwYW0KKyAgICAgICAgICAgICMgbW9kdWxlLgorICAgICAgICAgICAgY2xhc3Mgc3RydWN0X2Zyb3plbihTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygibmFtZSIsIGNfY2hhcl9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImNvZGUiLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInNpemUiLCBjX2ludCldCisgICAgICAgICAgICBGcm96ZW5UYWJsZSA9IFBPSU5URVIoc3RydWN0X2Zyb3plbikKKworICAgICAgICAgICAgZnQgPSBGcm96ZW5UYWJsZS5pbl9kbGwocHlkbGwsICJQeUltcG9ydF9Gcm96ZW5Nb2R1bGVzIikKKyAgICAgICAgICAgICMgZnQgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3RfZnJvemVuIGVudHJpZXM6CisgICAgICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgICAgICBmb3IgZW50cnkgaW4gZnQ6CisgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGRhbmdlcm91cy4gV2UgKmNhbiogaXRlcmF0ZSBvdmVyIGEgcG9pbnRlciwgYnV0CisgICAgICAgICAgICAgICAgIyB0aGUgbG9vcCB3aWxsIG5vdCB0ZXJtaW5hdGUgKG1heWJlIHdpdGggYW4gYWNjZXNzCisgICAgICAgICAgICAgICAgIyB2aW9sYXRpb247LSkgYmVjYXVzZSB0aGUgcG9pbnRlciBpbnN0YW5jZSBoYXMgbm8gc2l6ZS4KKyAgICAgICAgICAgICAgICBpZiBlbnRyeS5uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChlbnRyeS5uYW1lLCBlbnRyeS5zaXplKSkKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bOjJdID49ICgyLCAzKToKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFsoIl9faGVsbG9fXyIsIDEwNCksICgiX19waGVsbG9fXyIsIC0xMDQpLCAoIl9fcGhlbGxvX18uc3BhbSIsIDEwNCldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTAwKSwgKCJfX3BoZWxsb19fIiwgLTEwMCksICgiX19waGVsbG9fXy5zcGFtIiwgMTAwKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIGV4cGVjdGVkKQorCisgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgX3BvaW50ZXJfdHlwZV9jYWNoZQorICAgICAgICAgICAgZGVsIF9wb2ludGVyX3R5cGVfY2FjaGVbc3RydWN0X2Zyb3plbl0KKworICAgICAgICBkZWYgdGVzdF91bmRlZmluZWQoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX2ludC5pbl9kbGwsIHB5ZGxsLCAiVW5kZWZpbmVkX1N5bWJvbCIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjI5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDJhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQwOTUwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQpAQCAtMCwwICsxLDUwIEBACitmcm9tIGN0eXBlcyBpbXBvcnQgKgoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFZhclNpemVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZXNpemUoc2VsZik6CisgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiaXRlbSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYXJyYXkiLCBjX2ludCAqIDEpXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4Lml0ZW0gPSA0MgorICAgICAgICB4LmFycmF5WzBdID0gMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHgpLCBzaXplb2YoY19pbnQpICogMikKKworICAgICAgICAjIG1ha2Ugcm9vbSBmb3Igb25lIGFkZGl0aW9uYWwgaXRlbQorICAgICAgICBuZXdfc2l6ZSA9IHNpemVvZihYKSArIHNpemVvZihjX2ludCkgKiAxCisgICAgICAgIHJlc2l6ZSh4LCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIG5ld19zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisKKyAgICAgICAgIyBtYWtlIHJvb20gZm9yIDEwIGFkZGl0aW9uYWwgaXRlbXMKKyAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogOQorICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeC5pdGVtLCB4LmFycmF5WzBdKSwgKDQyLCAxMDApKQorCisgICAgICAgICMgbWFrZSByb29tIGZvciBvbmUgYWRkaXRpb25hbCBpdGVtCisgICAgICAgIG5ld19zaXplID0gc2l6ZW9mKFgpICsgc2l6ZW9mKGNfaW50KSAqIDEKKyAgICAgICAgcmVzaXplKHgsIG5ld19zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKKworICAgIGRlZiB0ZXN0X2FycmF5X2ludmFsaWRfbGVuZ3RoKHNlbGYpOgorICAgICAgICAjIGNhbm5vdCBjcmVhdGUgYXJyYXlzIHdpdGggbm9uLXBvc2l0aXZlIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBjX2ludCAqIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGNfaW50ICogLTMpCisKKyAgICBkZWYgdGVzdF96ZXJvc2l6ZWRfYXJyYXkoc2VsZik6CisgICAgICAgIGFycmF5ID0gKGNfaW50ICogMCkoKQorICAgICAgICAjIGFjY2Vzc2luZyBlbGVtZW50cyBvZiB6ZXJvLXNpemVkIGFycmF5cyByYWlzZSBJbmRleEVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAwLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIDEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgLTEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAtMSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMWY1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMWY1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U2ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CkBAIC0wLDAgKzEsOTMgQEAKKyMgV2luZG93cyBzcGVjaWZpYyB0ZXN0cworCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgaXNfcmVzb3VyY2VfZW5hYmxlZAoraW1wb3J0IHVuaXR0ZXN0LCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKKworaW1wb3J0IF9jdHlwZXNfdGVzdAorCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIiBhbmQgc2l6ZW9mKGNfdm9pZF9wKSA9PSBzaXplb2YoY19pbnQpOgorICAgICMgT25seSB3aW5kb3dzIDMyLWJpdCBoYXMgZGlmZmVyZW50IGNhbGxpbmcgY29udmVudGlvbnMuCisKKyAgICBjbGFzcyBXaW5kb3dzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdF9jYWxsY29udl8xKHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0aW5nIHN0ZGNhbGwgZnVuY3Rpb24KKworICAgICAgICAgICAgSXNXaW5kb3cgPSB3aW5kbGwudXNlcjMyLklzV2luZG93CisgICAgICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cyAoNCBieXRlcyBtaXNzaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgSXNXaW5kb3cpCisKKyAgICAgICAgICAgICMgVGhpcyBvbmUgc2hvdWxkIHN1Y2NlZWQuLi4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgSXNXaW5kb3coMCkpCisKKyAgICAgICAgICAgICMgVmFsdWVFcnJvcjogUHJvY2VkdXJlIHByb2JhYmx5IGNhbGxlZCB3aXRoIHRvbyBtYW55IGFyZ3VtZW50cyAoOCBieXRlcyBpbiBleGNlc3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdywgMCwgMCwgMCkKKworICAgICAgICBkZWYgdGVzdF9jYWxsY29udl8yKHNlbGYpOgorICAgICAgICAgICAgIyBDYWxsaW5nIHN0ZGNhbGwgZnVuY3Rpb24gYXMgY2RlY2wKKworICAgICAgICAgICAgSXNXaW5kb3cgPSBjZGxsLnVzZXIzMi5Jc1dpbmRvdworCisgICAgICAgICAgICAjIFZhbHVlRXJyb3I6IFByb2NlZHVyZSBjYWxsZWQgd2l0aCBub3QgZW5vdWdoIGFyZ3VtZW50cyAoNCBieXRlcyBtaXNzaW5nKQorICAgICAgICAgICAgIyBvciB3cm9uZyBjYWxsaW5nIGNvbnZlbnRpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCBOb25lKQorCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICBjbGFzcyBGdW5jdGlvbkNhbGxUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgiU0VIIik6CisgICAgICAgICAgICBkZWYgdGVzdF9TRUgoc2VsZik6CisgICAgICAgICAgICAgICAgIyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGludmFsaWQgYXJndW1lbnRzLCBhbmQgbWFrZSBzdXJlCisgICAgICAgICAgICAgICAgIyB0aGF0IGFjY2VzcyB2aW9sYXRpb25zIGFyZSB0cmFwcGVkIGFuZCByYWlzZSBhbgorICAgICAgICAgICAgICAgICMgZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEsIDMyKQorCisgICAgICAgIGRlZiB0ZXN0X25vYXJncyhzZWxmKToKKyAgICAgICAgICAgICMgVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBvbiB3aW4zMiB4NjQKKyAgICAgICAgICAgIHdpbmRsbC51c2VyMzIuR2V0RGVza3RvcFdpbmRvdygpCisKKyAgICBjbGFzcyBUZXN0V2ludHlwZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdF9IV05EKHNlbGYpOgorICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IHdpbnR5cGVzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih3aW50eXBlcy5IV05EKSwgc2l6ZW9mKGNfdm9pZF9wKSkKKworICAgICAgICBkZWYgdGVzdF9QQVJBTShzZWxmKToKKyAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuV1BBUkFNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX3ZvaWRfcCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih3aW50eXBlcy5MUEFSQU0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNfdm9pZF9wKSkKKworICAgICAgICBkZWYgdGVzdF9DT01FcnJvcihzZWxmKToKKyAgICAgICAgICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgQ09NRXJyb3IKKyAgICAgICAgICAgIGlmIHN1cHBvcnQuSEFWRV9ET0NTVFJJTkdTOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ09NRXJyb3IuX19kb2NfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYWlzZWQgd2hlbiBhIENPTSBtZXRob2QgY2FsbCBmYWlsZWQuIikKKworICAgICAgICAgICAgZXggPSBDT01FcnJvcigtMSwgInRleHQiLCAoImRldGFpbHMiLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmhyZXN1bHQsIC0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleC50ZXh0LCAidGV4dCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4LmRldGFpbHMsICgiZGV0YWlscyIsKSkKKworY2xhc3MgU3RydWN0dXJlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfYnlfdmFsdWUoc2VsZik6CisgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19sb25nKV0KKworICAgICAgICBjbGFzcyBSRUNUKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImxlZnQiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJ0b3AiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJyaWdodCIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgICAgICAgICAoImJvdHRvbSIsIGNfbG9uZyldCisKKyAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisKKyAgICAgICAgcHQgPSBQT0lOVCgxMCwgMTApCisgICAgICAgIHJlY3QgPSBSRUNUKDAsIDAsIDIwLCAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBkbGwuUG9pbnRJblJlY3QoYnlyZWYocmVjdCksIHB0KSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weWMgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNGY3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weW8gYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNGY3OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW50eXBlcy5weSBiL2xpYi9weXRob24yLjcvY3R5cGVzL3Rlc3QvdGVzdF93aW50eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDZmY2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5CkBAIC0wLDAgKzEsNDMgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdXaW5kb3dzLW9ubHkgdGVzdCcpCisKK2Zyb20gY3R5cGVzIGltcG9ydCAqCitmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKKworY2xhc3MgV2luVHlwZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF92YXJpYW50X2Jvb2woc2VsZik6CisgICAgICAgICMgcmVhZHMgMTYtYml0cyBmcm9tIG1lbW9yeSwgYW55dGhpbmcgbm9uLXplcm8gaXMgVHJ1ZQorICAgICAgICBmb3IgdHJ1ZV92YWx1ZSBpbiAoMSwgMzI3NjcsIDMyNzY4LCA2NTUzNSwgNjU1MzcpOgorICAgICAgICAgICAgdHJ1ZSA9IFBPSU5URVIoY19pbnQxNikoY19pbnQxNih0cnVlX3ZhbHVlKSkKKyAgICAgICAgICAgIHZhbHVlID0gY2FzdCh0cnVlLCBQT0lOVEVSKHdpbnR5cGVzLlZBUklBTlRfQk9PTCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodmFsdWUuY29udGVudHMpLCAnVkFSSUFOVF9CT09MKFRydWUpJykKKworICAgICAgICAgICAgdmIgPSB3aW50eXBlcy5WQVJJQU5UX0JPT0woKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2Yi52YWx1ZSwgRmFsc2UpCisgICAgICAgICAgICB2Yi52YWx1ZSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIFRydWUpCisgICAgICAgICAgICB2Yi52YWx1ZSA9IHRydWVfdmFsdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIFRydWUpCisKKyAgICAgICAgZm9yIGZhbHNlX3ZhbHVlIGluICgwLCA2NTUzNiwgMjYyMTQ0LCAyKiozMyk6CisgICAgICAgICAgICBmYWxzZSA9IFBPSU5URVIoY19pbnQxNikoY19pbnQxNihmYWxzZV92YWx1ZSkpCisgICAgICAgICAgICB2YWx1ZSA9IGNhc3QoZmFsc2UsIFBPSU5URVIod2ludHlwZXMuVkFSSUFOVF9CT09MKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih2YWx1ZS5jb250ZW50cyksICdWQVJJQU5UX0JPT0woRmFsc2UpJykKKworICAgICAgICAjIGFsbG93IGFueSBib29sIGNvbnZlcnNpb24gb24gYXNzaWdubWVudCB0byB2YWx1ZQorICAgICAgICBmb3Igc2V0X3ZhbHVlIGluICg2NTUzNiwgMjYyMTQ0LCAyKiozMyk6CisgICAgICAgICAgICB2YiA9IHdpbnR5cGVzLlZBUklBTlRfQk9PTCgpCisgICAgICAgICAgICB2Yi52YWx1ZSA9IHNldF92YWx1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2Yi52YWx1ZSwgVHJ1ZSkKKworICAgICAgICB2YiA9IHdpbnR5cGVzLlZBUklBTlRfQk9PTCgpCisgICAgICAgIHZiLnZhbHVlID0gWzIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0SXModmIudmFsdWUsIFRydWUpCisgICAgICAgIHZiLnZhbHVlID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRJcyh2Yi52YWx1ZSwgRmFsc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQyYzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy90ZXN0L3Rlc3Rfd2ludHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODQyYzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdGVzdC90ZXN0X3dpbnR5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N0eXBlcy91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTgwODdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdXRpbC5weQpAQCAtMCwwICsxLDI5MCBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworaW1wb3J0IHN5cywgb3MKKworIyBmaW5kX2xpYnJhcnkobmFtZSkgcmV0dXJucyB0aGUgcGF0aG5hbWUgb2YgYSBsaWJyYXJ5LCBvciBOb25lLgoraWYgb3MubmFtZSA9PSAibnQiOgorCisgICAgZGVmIF9nZXRfYnVpbGRfdmVyc2lvbigpOgorICAgICAgICAjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgIyBOT1RFOiBBcyBleGFtcGxlIGZvciBHQ0MobWluZ3cpIGJ1aWxkIHN5cy52ZXJzaW9uIHJldHVybjoKKyAgICAgICAgIyAnMi43YTAgKHRydW5rOjxSRVZJU0lPTj5NLCA8REFURT4sIDxUSU1FPikgXG5bR0NDIDMuNC41IChtaW5ndyBzcGVjaWFsKV0nCisgICAgICAgICMgJzIuN2EwICh0cnVuazo8UkVWSVNJT04+TSwgPERBVEU+LCA8VElNRT4pIFxuW0dDQyA0LjQuMF0nCisgICAgICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAiIiJSZXR1cm4gdGhlIHZlcnNpb24gb2YgTVNWQyB0aGF0IHdhcyB1c2VkIHRvIGJ1aWxkIFB5dGhvbi4KKworICAgICAgICBGb3IgUHl0aG9uIDIuMyBhbmQgdXAsIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBpbmNsdWRlZCBpbgorICAgICAgICBzeXMudmVyc2lvbi4gIEZvciBlYXJsaWVyIHZlcnNpb25zLCBhc3N1bWUgdGhlIGNvbXBpbGVyIGlzIE1TVkMgNi4KKyAgICAgICAgIiIiCisgICAgICAgICMgVGhpcyBmdW5jdGlvbiB3YXMgY29waWVkIGZyb20gTGliL2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHkKKyAgICAgICAgcHJlZml4ID0gIk1TQyB2LiIKKyAgICAgICAgaSA9IHN5cy52ZXJzaW9uLmZpbmQocHJlZml4KQorICAgICAgICBpZiBpID09IC0xOgorICAgICAgICAgICAgcmV0dXJuIDYKKyAgICAgICAgaSA9IGkgKyBsZW4ocHJlZml4KQorICAgICAgICBzLCByZXN0ID0gc3lzLnZlcnNpb25baTpdLnNwbGl0KCIgIiwgMSkKKyAgICAgICAgbWFqb3JWZXJzaW9uID0gaW50KHNbOi0yXSkgLSA2CisgICAgICAgIG1pbm9yVmVyc2lvbiA9IGludChzWzI6M10pIC8gMTAuMAorICAgICAgICAjIEkgZG9uJ3QgdGhpbmsgcGF0aHMgYXJlIGFmZmVjdGVkIGJ5IG1pbm9yIHZlcnNpb24gaW4gdmVyc2lvbiA2CisgICAgICAgIGlmIG1ham9yVmVyc2lvbiA9PSA2OgorICAgICAgICAgICAgbWlub3JWZXJzaW9uID0gMAorICAgICAgICBpZiBtYWpvclZlcnNpb24gPj0gNjoKKyAgICAgICAgICAgIHJldHVybiBtYWpvclZlcnNpb24gKyBtaW5vclZlcnNpb24KKyAgICAgICAgIyBlbHNlIHdlIGRvbid0IGtub3cgd2hhdCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciB0aGlzIGlzCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZmluZF9tc3ZjcnQoKToKKyAgICAgICAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAjIEZJWE1FOiBGb3IgR0NDKG1pbmd3KSBydW50aW1lIGRvbid0IGRlcGVuZCBmcm9tIGNvbXBpbGVyCisgICAgICAgICMgdmVyc2lvbiA7KS4gV2UgbWF5IHVzZSAtRF9fTVNWQ1JUX1ZFUlNJT05fXyB0byBkZXRlY3Qgd2hpY2gKKyAgICAgICAgIyB2ZXJpb24gaXMgcmVxdWVzdGVkIGJ5IHVzZXIsIGJ1dCB0aGUgbmFtZSBvZiB0aGUgbGlicmFyeQorICAgICAgICAjIHRvIGJlIGRlZmF1bHQuCisgICAgICAgICMgQXMgZXhhbXBsZSBXWFAgaXMgd2l0aCB2ZXJzaW9uIDcuMCBvZiBtc3ZjcnQuZGxsLgorICAgICAgICAjIEFueXdheSBzaW5jZSBfZ2V0X2J1aWxkX3ZlcnNpb24gcmV0dXJuIDYgaW4gbW9zdChzdGFuZGFyZCkKKyAgICAgICAgIyBjYXNlcyB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBtc3ZjcnR7ZH0uIE1heSBiZSBub3Qgc28gYmFkLgorICAgICAgICAjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiB0aGUgVkMgcnVudGltZSBkbGwiIiIKKyAgICAgICAgdmVyc2lvbiA9IF9nZXRfYnVpbGRfdmVyc2lvbigpCisgICAgICAgIGlmIHZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgICMgYmV0dGVyIGJlIHNhZmUgdGhhbiBzb3JyeQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgdmVyc2lvbiA8PSA2OgorICAgICAgICAgICAgY2xpYm5hbWUgPSAnbXN2Y3J0JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xpYm5hbWUgPSAnbXN2Y3IlZCcgJSAodmVyc2lvbiAqIDEwKQorCisgICAgICAgICMgSWYgcHl0aG9uIHdhcyBidWlsdCB3aXRoIGluIGRlYnVnIG1vZGUKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICBpZiBpbXAuZ2V0X3N1ZmZpeGVzKClbMF1bMF0gPT0gJ19kLnB5ZCc6CisgICAgICAgICAgICBjbGlibmFtZSArPSAnZCcKKyAgICAgICAgcmV0dXJuIGNsaWJuYW1lKycuZGxsJworCisgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKKyAgICAgICAgaWYgbmFtZSBpbiAoJ2MnLCAnbScpOgorICAgICAgICAgICAgcmV0dXJuIGZpbmRfbXN2Y3J0KCkKKyAgICAgICAgIyBTZWUgTVNETiBmb3IgdGhlIFJFQUwgc2VhcmNoIG9yZGVyLgorICAgICAgICBmb3IgZGlyZWN0b3J5IGluIG9zLmVudmlyb25bJ1BBVEgnXS5zcGxpdChvcy5wYXRoc2VwKToKKyAgICAgICAgICAgIGZuYW1lID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgbmFtZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm5hbWUKKyAgICAgICAgICAgIGlmIGZuYW1lLmxvd2VyKCkuZW5kc3dpdGgoIi5kbGwiKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm5hbWUgPSBmbmFtZSArICIuZGxsIgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBmbmFtZQorICAgICAgICByZXR1cm4gTm9uZQorCitpZiBvcy5uYW1lID09ICJjZSI6CisgICAgIyBzZWFyY2ggcGF0aCBhY2NvcmRpbmcgdG8gTVNETjoKKyAgICAjIC0gYWJzb2x1dGUgcGF0aCBzcGVjaWZpZWQgYnkgZmlsZW5hbWUKKyAgICAjIC0gVGhlIC5leGUgbGF1bmNoIGRpcmVjdG9yeQorICAgICMgLSB0aGUgV2luZG93cyBkaXJlY3RvcnkKKyAgICAjIC0gUk9NIGRsbCBmaWxlcyAod2hlcmUgYXJlIHRoZXk/KQorICAgICMgLSBPRU0gc3BlY2lmaWVkIHNlYXJjaCBwYXRoOiBIS0xNXExvYWRlclxTeXN0ZW1QYXRoCisgICAgZGVmIGZpbmRfbGlicmFyeShuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUKKworaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgZnJvbSBjdHlwZXMubWFjaG9saWIuZHlsZCBpbXBvcnQgZHlsZF9maW5kIGFzIF9keWxkX2ZpbmQKKyAgICBkZWYgZmluZF9saWJyYXJ5KG5hbWUpOgorICAgICAgICBwb3NzaWJsZSA9IFsnbGliJXMuZHlsaWInICUgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgJyVzLmR5bGliJyAlIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICclcy5mcmFtZXdvcmsvJXMnICUgKG5hbWUsIG5hbWUpXQorICAgICAgICBmb3IgbmFtZSBpbiBwb3NzaWJsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gX2R5bGRfZmluZChuYW1lKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworZWxpZiBvcy5uYW1lID09ICJwb3NpeCI6CisgICAgIyBBbmRyZWFzIERlZ2VydCdzIGZpbmQgZnVuY3Rpb25zLCB1c2luZyBnY2MsIC9zYmluL2xkY29uZmlnLCBvYmpkdW1wCisgICAgaW1wb3J0IHJlLCB0ZW1wZmlsZSwgZXJybm8KKworICAgIGRlZiBfZmluZExpYl9nY2MobmFtZSk6CisgICAgICAgIGV4cHIgPSByJ1teXChcKVxzXSpsaWIlc1wuW15cKFwpXHNdKicgJSByZS5lc2NhcGUobmFtZSkKKyAgICAgICAgZmRvdXQsIGNjb3V0ID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIG9zLmNsb3NlKGZkb3V0KQorICAgICAgICBjbWQgPSAnaWYgdHlwZSBnY2MgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIENDPWdjYzsgZWxpZiB0eXBlIGNjID4vZGV2L251bGwgMj4mMTsgdGhlbiBDQz1jYztlbHNlIGV4aXQgMTA7IGZpOycgXAorICAgICAgICAgICAgICAnJENDIC1XbCwtdCAtbyAnICsgY2NvdXQgKyAnIDI+JjEgLWwnICsgbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3MucG9wZW4oY21kKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyYWNlID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcnYgPSBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoY2NvdXQpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgcnYgPT0gMTA6CisgICAgICAgICAgICByYWlzZSBPU0Vycm9yLCAnZ2NjIG9yIGNjIGNvbW1hbmQgbm90IGZvdW5kJworICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgdHJhY2UpCisgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gcmVzLmdyb3VwKDApCisKKworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAic3Vub3M1IjoKKyAgICAgICAgIyB1c2UgL3Vzci9jY3MvYmluL2R1bXAgb24gc29sYXJpcworICAgICAgICBkZWYgX2dldF9zb25hbWUoZik6CisgICAgICAgICAgICBpZiBub3QgZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgY21kID0gIi91c3IvY2NzL2Jpbi9kdW1wIC1McHYgMj4vZGV2L251bGwgIiArIGYKKyAgICAgICAgICAgIGYgPSBvcy5wb3BlbihjbWQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgcmVzID0gcmUuc2VhcmNoKHInXFsuKlxdXHNTT05BTUVccysoW15cc10rKScsIGRhdGEpCisgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gcmVzLmdyb3VwKDEpCisgICAgZWxzZToKKyAgICAgICAgZGVmIF9nZXRfc29uYW1lKGYpOgorICAgICAgICAgICAgIyBhc3N1bWluZyBHTlUgYmludXRpbHMgLyBFTEYKKyAgICAgICAgICAgIGlmIG5vdCBmOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBjbWQgPSAnaWYgISB0eXBlIG9iamR1bXAgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIGV4aXQgMTA7IGZpOycgXAorICAgICAgICAgICAgICAgICAgIm9iamR1bXAgLXAgLWogLmR5bmFtaWMgMj4vZGV2L251bGwgIiArIGYKKyAgICAgICAgICAgIGYgPSBvcy5wb3BlbihjbWQpCisgICAgICAgICAgICBkdW1wID0gZi5yZWFkKCkKKyAgICAgICAgICAgIHJ2ID0gZi5jbG9zZSgpCisgICAgICAgICAgICBpZiBydiA9PSAxMDoKKyAgICAgICAgICAgICAgICByYWlzZSBPU0Vycm9yLCAnb2JqZHVtcCBjb21tYW5kIG5vdCBmb3VuZCcKKyAgICAgICAgICAgIGYgPSBvcy5wb3BlbihjbWQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgcmVzID0gcmUuc2VhcmNoKHInXHNTT05BTUVccysoW15cc10rKScsIGRhdGEpCisgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICByZXR1cm4gcmVzLmdyb3VwKDEpCisKKyAgICBpZiAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImZyZWVic2QiKQorICAgICAgICBvciBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgib3BlbmJzZCIpCisgICAgICAgIG9yIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJkcmFnb25mbHkiKSk6CisKKyAgICAgICAgZGVmIF9udW1fdmVyc2lvbihsaWJuYW1lKToKKyAgICAgICAgICAgICMgImxpYnh5ei5zby5NQUpPUi5NSU5PUiIgPT4gWyBNQUpPUiwgTUlOT1IgXQorICAgICAgICAgICAgcGFydHMgPSBsaWJuYW1lLnNwbGl0KCIuIikKKyAgICAgICAgICAgIG51bXMgPSBbXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzOgorICAgICAgICAgICAgICAgICAgICBudW1zLmluc2VydCgwLCBpbnQocGFydHMucG9wKCkpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmV0dXJuIG51bXMgb3IgWyBzeXMubWF4aW50IF0KKworICAgICAgICBkZWYgZmluZF9saWJyYXJ5KG5hbWUpOgorICAgICAgICAgICAgZW5hbWUgPSByZS5lc2NhcGUobmFtZSkKKyAgICAgICAgICAgIGV4cHIgPSByJzotbCVzXC5cUysgPT4gXFMqLyhsaWIlc1wuXFMrKScgJSAoZW5hbWUsIGVuYW1lKQorICAgICAgICAgICAgZiA9IG9zLnBvcGVuKCcvc2Jpbi9sZGNvbmZpZyAtciAyPi9kZXYvbnVsbCcpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgcmVzID0gcmUuZmluZGFsbChleHByLCBkYXRhKQorICAgICAgICAgICAgaWYgbm90IHJlczoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2dldF9zb25hbWUoX2ZpbmRMaWJfZ2NjKG5hbWUpKQorICAgICAgICAgICAgcmVzLnNvcnQoY21wPSBsYW1iZGEgeCx5OiBjbXAoX251bV92ZXJzaW9uKHgpLCBfbnVtX3ZlcnNpb24oeSkpKQorICAgICAgICAgICAgcmV0dXJuIHJlc1stMV0KKworICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJzdW5vczUiOgorCisgICAgICAgIGRlZiBfZmluZExpYl9jcmxlKG5hbWUsIGlzNjQpOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCcvdXNyL2Jpbi9jcmxlJyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgaWYgaXM2NDoKKyAgICAgICAgICAgICAgICBjbWQgPSAnZW52IExDX0FMTD1DIC91c3IvYmluL2NybGUgLTY0IDI+L2Rldi9udWxsJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjbWQgPSAnZW52IExDX0FMTD1DIC91c3IvYmluL2NybGUgMj4vZGV2L251bGwnCisKKyAgICAgICAgICAgIGZvciBsaW5lIGluIG9zLnBvcGVuKGNtZCkucmVhZGxpbmVzKCk6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnRGVmYXVsdCBMaWJyYXJ5IFBhdGggKEVMRik6Jyk6CisgICAgICAgICAgICAgICAgICAgIHBhdGhzID0gbGluZS5zcGxpdCgpWzRdCisKKyAgICAgICAgICAgIGlmIG5vdCBwYXRoczoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICAgICBmb3IgZGlyIGluIHBhdGhzLnNwbGl0KCI6Iik6CisgICAgICAgICAgICAgICAgbGliZmlsZSA9IG9zLnBhdGguam9pbihkaXIsICJsaWIlcy5zbyIgJSBuYW1lKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxpYmZpbGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGliZmlsZQorCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGRlZiBmaW5kX2xpYnJhcnkobmFtZSwgaXM2NCA9IEZhbHNlKToKKyAgICAgICAgICAgIHJldHVybiBfZ2V0X3NvbmFtZShfZmluZExpYl9jcmxlKG5hbWUsIGlzNjQpIG9yIF9maW5kTGliX2djYyhuYW1lKSkKKworICAgIGVsc2U6CisKKyAgICAgICAgZGVmIF9maW5kU29uYW1lX2xkY29uZmlnKG5hbWUpOgorICAgICAgICAgICAgaW1wb3J0IHN0cnVjdAorICAgICAgICAgICAgaWYgc3RydWN0LmNhbGNzaXplKCdsJykgPT0gNDoKKyAgICAgICAgICAgICAgICBtYWNoaW5lID0gb3MudW5hbWUoKVs0XSArICctMzInCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1hY2hpbmUgPSBvcy51bmFtZSgpWzRdICsgJy02NCcKKyAgICAgICAgICAgIG1hY2hfbWFwID0geworICAgICAgICAgICAgICAgICd4ODZfNjQtNjQnOiAnbGliYzYseDg2LTY0JywKKyAgICAgICAgICAgICAgICAncHBjNjQtNjQnOiAnbGliYzYsNjRiaXQnLAorICAgICAgICAgICAgICAgICdzcGFyYzY0LTY0JzogJ2xpYmM2LDY0Yml0JywKKyAgICAgICAgICAgICAgICAnczM5MHgtNjQnOiAnbGliYzYsNjRiaXQnLAorICAgICAgICAgICAgICAgICdpYTY0LTY0JzogJ2xpYmM2LElBLTY0JywKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBhYmlfdHlwZSA9IG1hY2hfbWFwLmdldChtYWNoaW5lLCAnbGliYzYnKQorCisgICAgICAgICAgICAjIFhYWCBhc3N1bWluZyBHTElCQydzIGxkY29uZmlnICh3aXRoIG9wdGlvbiAtcCkKKyAgICAgICAgICAgIGV4cHIgPSByJ1xzKyhsaWIlc1wuW15cc10rKVxzK1woJXMnICUgKHJlLmVzY2FwZShuYW1lKSwgYWJpX3R5cGUpCisgICAgICAgICAgICBmID0gb3MucG9wZW4oJy9zYmluL2xkY29uZmlnIC1wIDI+L2Rldi9udWxsJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgZGF0YSkKKyAgICAgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHJldHVybiByZXMuZ3JvdXAoMSkKKworICAgICAgICBkZWYgZmluZF9saWJyYXJ5KG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIF9maW5kU29uYW1lX2xkY29uZmlnKG5hbWUpIG9yIF9nZXRfc29uYW1lKF9maW5kTGliX2djYyhuYW1lKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0ZXN0IGNvZGUKKworZGVmIHRlc3QoKToKKyAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY2RsbAorICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgcHJpbnQgY2RsbC5tc3ZjcnQKKyAgICAgICAgcHJpbnQgY2RsbC5sb2FkKCJtc3ZjcnQiKQorICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoIm1zdmNydCIpCisKKyAgICBpZiBvcy5uYW1lID09ICJwb3NpeCI6CisgICAgICAgICMgZmluZCBhbmQgbG9hZF92ZXJzaW9uCisgICAgICAgIHByaW50IGZpbmRfbGlicmFyeSgibSIpCisgICAgICAgIHByaW50IGZpbmRfbGlicmFyeSgiYyIpCisgICAgICAgIHByaW50IGZpbmRfbGlicmFyeSgiYnoyIikKKworICAgICAgICAjIGdldGF0dHIKKyMjICAgICAgICBwcmludCBjZGxsLm0KKyMjICAgICAgICBwcmludCBjZGxsLmJ6MgorCisgICAgICAgICMgbG9hZAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICBwcmludCBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJtLmR5bGliIikKKyAgICAgICAgICAgIHByaW50IGNkbGwuTG9hZExpYnJhcnkoImxpYmNyeXB0by5keWxpYiIpCisgICAgICAgICAgICBwcmludCBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJTeXN0ZW0uZHlsaWIiKQorICAgICAgICAgICAgcHJpbnQgY2RsbC5Mb2FkTGlicmFyeSgiU3lzdGVtLmZyYW1ld29yay9TeXN0ZW0iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgY2RsbC5Mb2FkTGlicmFyeSgibGlibS5zbyIpCisgICAgICAgICAgICBwcmludCBjZGxsLkxvYWRMaWJyYXJ5KCJsaWJjcnlwdC5zbyIpCisgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImNyeXB0IikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3YWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3YWU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvd2ludHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFmYmI3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5CkBAIC0wLDAgKzEsMTg1IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlIG1vc3QgdXNlZnVsIHdpbmRvd3MgZGF0YXR5cGVzCitmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitCWVRFID0gY19ieXRlCitXT1JEID0gY191c2hvcnQKK0RXT1JEID0gY191bG9uZworCitXQ0hBUiA9IGNfd2NoYXIKK1VJTlQgPSBjX3VpbnQKK0lOVCA9IGNfaW50CisKK0RPVUJMRSA9IGNfZG91YmxlCitGTE9BVCA9IGNfZmxvYXQKKworQk9PTEVBTiA9IEJZVEUKK0JPT0wgPSBjX2xvbmcKKworZnJvbSBjdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQorY2xhc3MgVkFSSUFOVF9CT09MKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gInYiCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzKCVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYudmFsdWUpCisKK1VMT05HID0gY191bG9uZworTE9ORyA9IGNfbG9uZworCitVU0hPUlQgPSBjX3VzaG9ydAorU0hPUlQgPSBjX3Nob3J0CisKKyMgaW4gdGhlIHdpbmRvd3MgaGVhZGVyIGZpbGVzLCB0aGVzZSBhcmUgc3RydWN0dXJlcy4KK19MQVJHRV9JTlRFR0VSID0gTEFSR0VfSU5URUdFUiA9IGNfbG9uZ2xvbmcKK19VTEFSR0VfSU5URUdFUiA9IFVMQVJHRV9JTlRFR0VSID0gY191bG9uZ2xvbmcKKworTFBDT0xFU1RSID0gTFBPTEVTVFIgPSBPTEVTVFIgPSBjX3djaGFyX3AKK0xQQ1dTVFIgPSBMUFdTVFIgPSBjX3djaGFyX3AKK0xQQ1NUUiA9IExQU1RSID0gY19jaGFyX3AKK0xQQ1ZPSUQgPSBMUFZPSUQgPSBjX3ZvaWRfcAorCisjIFdQQVJBTSBpcyBkZWZpbmVkIGFzIFVJTlRfUFRSICh1bnNpZ25lZCB0eXBlKQorIyBMUEFSQU0gaXMgZGVmaW5lZCBhcyBMT05HX1BUUiAoc2lnbmVkIHR5cGUpCitpZiBzaXplb2YoY19sb25nKSA9PSBzaXplb2YoY192b2lkX3ApOgorICAgIFdQQVJBTSA9IGNfdWxvbmcKKyAgICBMUEFSQU0gPSBjX2xvbmcKK2VsaWYgc2l6ZW9mKGNfbG9uZ2xvbmcpID09IHNpemVvZihjX3ZvaWRfcCk6CisgICAgV1BBUkFNID0gY191bG9uZ2xvbmcKKyAgICBMUEFSQU0gPSBjX2xvbmdsb25nCisKK0FUT00gPSBXT1JECitMQU5HSUQgPSBXT1JECisKK0NPTE9SUkVGID0gRFdPUkQKK0xHUlBJRCA9IERXT1JECitMQ1RZUEUgPSBEV09SRAorCitMQ0lEID0gRFdPUkQKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBIQU5ETEUgdHlwZXMKK0hBTkRMRSA9IGNfdm9pZF9wICMgaW4gdGhlIGhlYWRlciBmaWxlczogdm9pZCAqCisKK0hBQ0NFTCA9IEhBTkRMRQorSEJJVE1BUCA9IEhBTkRMRQorSEJSVVNIID0gSEFORExFCitIQ09MT1JTUEFDRSA9IEhBTkRMRQorSERDID0gSEFORExFCitIREVTSyA9IEhBTkRMRQorSERXUCA9IEhBTkRMRQorSEVOSE1FVEFGSUxFID0gSEFORExFCitIRk9OVCA9IEhBTkRMRQorSEdESU9CSiA9IEhBTkRMRQorSEdMT0JBTCA9IEhBTkRMRQorSEhPT0sgPSBIQU5ETEUKK0hJQ09OID0gSEFORExFCitISU5TVEFOQ0UgPSBIQU5ETEUKK0hLRVkgPSBIQU5ETEUKK0hLTCA9IEhBTkRMRQorSExPQ0FMID0gSEFORExFCitITUVOVSA9IEhBTkRMRQorSE1FVEFGSUxFID0gSEFORExFCitITU9EVUxFID0gSEFORExFCitITU9OSVRPUiA9IEhBTkRMRQorSFBBTEVUVEUgPSBIQU5ETEUKK0hQRU4gPSBIQU5ETEUKK0hSR04gPSBIQU5ETEUKK0hSU1JDID0gSEFORExFCitIU1RSID0gSEFORExFCitIVEFTSyA9IEhBTkRMRQorSFdJTlNUQSA9IEhBTkRMRQorSFdORCA9IEhBTkRMRQorU0NfSEFORExFID0gSEFORExFCitTRVJWSUNFX1NUQVRVU19IQU5ETEUgPSBIQU5ETEUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTb21lIGltcG9ydGFudCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKKworY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygibGVmdCIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgKCJ0b3AiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICgicmlnaHQiLCBjX2xvbmcpLAorICAgICAgICAgICAgICAgICgiYm90dG9tIiwgY19sb25nKV0KK3RhZ1JFQ1QgPSBfUkVDVEwgPSBSRUNUTCA9IFJFQ1QKKworY2xhc3MgX1NNQUxMX1JFQ1QoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoJ0xlZnQnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ1RvcCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnUmlnaHQnLCBjX3Nob3J0KSwKKyAgICAgICAgICAgICAgICAoJ0JvdHRvbScsIGNfc2hvcnQpXQorU01BTExfUkVDVCA9IF9TTUFMTF9SRUNUCisKK2NsYXNzIF9DT09SRChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygnWCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnWScsIGNfc2hvcnQpXQorCitjbGFzcyBQT0lOVChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygieCIsIGNfbG9uZyksCisgICAgICAgICAgICAgICAgKCJ5IiwgY19sb25nKV0KK3RhZ1BPSU5UID0gX1BPSU5UTCA9IFBPSU5UTCA9IFBPSU5UCisKK2NsYXNzIFNJWkUoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImN4IiwgY19sb25nKSwKKyAgICAgICAgICAgICAgICAoImN5IiwgY19sb25nKV0KK3RhZ1NJWkUgPSBTSVpFTCA9IFNJWkUKKworZGVmIFJHQihyZWQsIGdyZWVuLCBibHVlKToKKyAgICByZXR1cm4gcmVkICsgKGdyZWVuIDw8IDgpICsgKGJsdWUgPDwgMTYpCisKK2NsYXNzIEZJTEVUSU1FKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJkd0xvd0RhdGVUaW1lIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiZHdIaWdoRGF0ZVRpbWUiLCBEV09SRCldCitfRklMRVRJTUUgPSBGSUxFVElNRQorCitjbGFzcyBNU0coU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImhXbmQiLCBIV05EKSwKKyAgICAgICAgICAgICAgICAoIm1lc3NhZ2UiLCBjX3VpbnQpLAorICAgICAgICAgICAgICAgICgid1BhcmFtIiwgV1BBUkFNKSwKKyAgICAgICAgICAgICAgICAoImxQYXJhbSIsIExQQVJBTSksCisgICAgICAgICAgICAgICAgKCJ0aW1lIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgicHQiLCBQT0lOVCldCit0YWdNU0cgPSBNU0cKK01BWF9QQVRIID0gMjYwCisKK2NsYXNzIFdJTjMyX0ZJTkRfREFUQUEoU3RydWN0dXJlKToKKyAgICBfZmllbGRzXyA9IFsoImR3RmlsZUF0dHJpYnV0ZXMiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJmdENyZWF0aW9uVGltZSIsIEZJTEVUSU1FKSwKKyAgICAgICAgICAgICAgICAoImZ0TGFzdEFjY2Vzc1RpbWUiLCBGSUxFVElNRSksCisgICAgICAgICAgICAgICAgKCJmdExhc3RXcml0ZVRpbWUiLCBGSUxFVElNRSksCisgICAgICAgICAgICAgICAgKCJuRmlsZVNpemVIaWdoIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgibkZpbGVTaXplTG93IiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiZHdSZXNlcnZlZDAiLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJkd1Jlc2VydmVkMSIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImNGaWxlTmFtZSIsIGNfY2hhciAqIE1BWF9QQVRIKSwKKyAgICAgICAgICAgICAgICAoImNBbHRlcm5hdGVGaWxlTmFtZSIsIGNfY2hhciAqIDE0KV0KKworY2xhc3MgV0lOMzJfRklORF9EQVRBVyhTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygiZHdGaWxlQXR0cmlidXRlcyIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImZ0Q3JlYXRpb25UaW1lIiwgRklMRVRJTUUpLAorICAgICAgICAgICAgICAgICgiZnRMYXN0QWNjZXNzVGltZSIsIEZJTEVUSU1FKSwKKyAgICAgICAgICAgICAgICAoImZ0TGFzdFdyaXRlVGltZSIsIEZJTEVUSU1FKSwKKyAgICAgICAgICAgICAgICAoIm5GaWxlU2l6ZUhpZ2giLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJuRmlsZVNpemVMb3ciLCBEV09SRCksCisgICAgICAgICAgICAgICAgKCJkd1Jlc2VydmVkMCIsIERXT1JEKSwKKyAgICAgICAgICAgICAgICAoImR3UmVzZXJ2ZWQxIiwgRFdPUkQpLAorICAgICAgICAgICAgICAgICgiY0ZpbGVOYW1lIiwgY193Y2hhciAqIE1BWF9QQVRIKSwKKyAgICAgICAgICAgICAgICAoImNBbHRlcm5hdGVGaWxlTmFtZSIsIGNfd2NoYXIgKiAxNCldCisKK19fYWxsX18gPSBbJ0FUT00nLCAnQk9PTCcsICdCT09MRUFOJywgJ0JZVEUnLCAnQ09MT1JSRUYnLCAnRE9VQkxFJywgJ0RXT1JEJywKKyAgICAgICAgICAgJ0ZJTEVUSU1FJywgJ0ZMT0FUJywgJ0hBQ0NFTCcsICdIQU5ETEUnLCAnSEJJVE1BUCcsICdIQlJVU0gnLAorICAgICAgICAgICAnSENPTE9SU1BBQ0UnLCAnSERDJywgJ0hERVNLJywgJ0hEV1AnLCAnSEVOSE1FVEFGSUxFJywgJ0hGT05UJywKKyAgICAgICAgICAgJ0hHRElPQkonLCAnSEdMT0JBTCcsICdISE9PSycsICdISUNPTicsICdISU5TVEFOQ0UnLCAnSEtFWScsCisgICAgICAgICAgICdIS0wnLCAnSExPQ0FMJywgJ0hNRU5VJywgJ0hNRVRBRklMRScsICdITU9EVUxFJywgJ0hNT05JVE9SJywKKyAgICAgICAgICAgJ0hQQUxFVFRFJywgJ0hQRU4nLCAnSFJHTicsICdIUlNSQycsICdIU1RSJywgJ0hUQVNLJywgJ0hXSU5TVEEnLAorICAgICAgICAgICAnSFdORCcsICdJTlQnLCAnTEFOR0lEJywgJ0xBUkdFX0lOVEVHRVInLCAnTENJRCcsICdMQ1RZUEUnLAorICAgICAgICAgICAnTEdSUElEJywgJ0xPTkcnLCAnTFBBUkFNJywgJ0xQQ09MRVNUUicsICdMUENTVFInLCAnTFBDVk9JRCcsCisgICAgICAgICAgICdMUENXU1RSJywgJ0xQT0xFU1RSJywgJ0xQU1RSJywgJ0xQVk9JRCcsICdMUFdTVFInLCAnTUFYX1BBVEgnLAorICAgICAgICAgICAnTVNHJywgJ09MRVNUUicsICdQT0lOVCcsICdQT0lOVEwnLCAnUkVDVCcsICdSRUNUTCcsICdSR0InLAorICAgICAgICAgICAnU0NfSEFORExFJywgJ1NFUlZJQ0VfU1RBVFVTX0hBTkRMRScsICdTSE9SVCcsICdTSVpFJywgJ1NJWkVMJywKKyAgICAgICAgICAgJ1NNQUxMX1JFQ1QnLCAnVUlOVCcsICdVTEFSR0VfSU5URUdFUicsICdVTE9ORycsICdVU0hPUlQnLAorICAgICAgICAgICAnVkFSSUFOVF9CT09MJywgJ1dDSEFSJywgJ1dJTjMyX0ZJTkRfREFUQUEnLCAnV0lOMzJfRklORF9EQVRBVycsCisgICAgICAgICAgICdXT1JEJywgJ1dQQVJBTScsICdfQ09PUkQnLCAnX0ZJTEVUSU1FJywgJ19MQVJHRV9JTlRFR0VSJywKKyAgICAgICAgICAgJ19QT0lOVEwnLCAnX1JFQ1RMJywgJ19TTUFMTF9SRUNUJywgJ19VTEFSR0VfSU5URUdFUicsICd0YWdNU0cnLAorICAgICAgICAgICAndGFnUE9JTlQnLCAndGFnUkVDVCcsICd0YWdTSVpFJ10KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5YyBiL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQzMGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvd2ludHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5byBiL2xpYi9weXRob24yLjcvY3R5cGVzL3dpbnR5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQzMGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdHlwZXMvd2ludHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvY3Vyc2VzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmNTlkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNTkgQEAKKyIiImN1cnNlcworCitUaGUgbWFpbiBwYWNrYWdlIGZvciBjdXJzZXMgc3VwcG9ydCBmb3IgUHl0aG9uLiAgTm9ybWFsbHkgdXNlZCBieSBpbXBvcnRpbmcKK3RoZSBwYWNrYWdlLCBhbmQgcGVyaGFwcyBhIHBhcnRpY3VsYXIgbW9kdWxlIGluc2lkZSBpdC4KKworICAgaW1wb3J0IGN1cnNlcworICAgZnJvbSBjdXJzZXMgaW1wb3J0IHRleHRwYWQKKyAgIGN1cnNlcy5pbml0c2NyKCkKKyAgIC4uLgorCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2Zyb20gX2N1cnNlcyBpbXBvcnQgKgorZnJvbSBjdXJzZXMud3JhcHBlciBpbXBvcnQgd3JhcHBlcgoraW1wb3J0IG9zIGFzIF9vcworaW1wb3J0IHN5cyBhcyBfc3lzCisKKyMgU29tZSBjb25zdGFudHMsIG1vc3Qgbm90YWJseSB0aGUgQUNTXyogb25lcywgYXJlIG9ubHkgYWRkZWQgdG8gdGhlIEMKKyMgX2N1cnNlcyBtb2R1bGUncyBkaWN0aW9uYXJ5IGFmdGVyIGluaXRzY3IoKSBpcyBjYWxsZWQuICAoU29tZQorIyB2ZXJzaW9ucyBvZiBTR0kncyBjdXJzZXMgZG9uJ3QgZGVmaW5lIHZhbHVlcyBmb3IgdGhvc2UgY29uc3RhbnRzCisjIHVudGlsIGluaXRzY3IoKSBoYXMgYmVlbiBjYWxsZWQuKSAgVGhpcyB3cmFwcGVyIGZ1bmN0aW9uIGNhbGxzIHRoZQorIyB1bmRlcmx5aW5nIEMgaW5pdHNjcigpLCBhbmQgdGhlbiBjb3BpZXMgdGhlIGNvbnN0YW50cyBmcm9tIHRoZQorIyBfY3Vyc2VzIG1vZHVsZSB0byB0aGUgY3Vyc2VzIHBhY2thZ2UncyBkaWN0aW9uYXJ5LiAgRG9uJ3QgZG8gJ2Zyb20KKyMgY3Vyc2VzIGltcG9ydCAqJyBpZiB5b3UnbGwgYmUgbmVlZGluZyB0aGUgQUNTXyogY29uc3RhbnRzLgorCitkZWYgaW5pdHNjcigpOgorICAgIGltcG9ydCBfY3Vyc2VzLCBjdXJzZXMKKyAgICAjIHdlIGNhbGwgc2V0dXB0ZXJtKCkgaGVyZSBiZWNhdXNlIGl0IHJhaXNlcyBhbiBlcnJvcgorICAgICMgaW5zdGVhZCBvZiBjYWxsaW5nIGV4aXQoKSBpbiBlcnJvciBjYXNlcy4KKyAgICBzZXR1cHRlcm0odGVybT1fb3MuZW52aXJvbi5nZXQoIlRFUk0iLCAidW5rbm93biIpLAorICAgICAgICAgICAgICBmZD1fc3lzLl9fc3Rkb3V0X18uZmlsZW5vKCkpCisgICAgc3Rkc2NyID0gX2N1cnNlcy5pbml0c2NyKCkKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfY3Vyc2VzLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgIGlmIGtleVswOjRdID09ICdBQ1NfJyBvciBrZXkgaW4gKCdMSU5FUycsICdDT0xTJyk6CisgICAgICAgICAgICBzZXRhdHRyKGN1cnNlcywga2V5LCB2YWx1ZSkKKworICAgIHJldHVybiBzdGRzY3IKKworIyBUaGlzIGlzIGEgc2ltaWxhciB3cmFwcGVyIGZvciBzdGFydF9jb2xvcigpLCB3aGljaCBhZGRzIHRoZSBDT0xPUlMgYW5kCisjIENPTE9SX1BBSVJTIHZhcmlhYmxlcyB3aGljaCBhcmUgb25seSBhdmFpbGFibGUgYWZ0ZXIgc3RhcnRfY29sb3IoKSBpcworIyBjYWxsZWQuCisKK2RlZiBzdGFydF9jb2xvcigpOgorICAgIGltcG9ydCBfY3Vyc2VzLCBjdXJzZXMKKyAgICByZXR2YWwgPSBfY3Vyc2VzLnN0YXJ0X2NvbG9yKCkKKyAgICBpZiBoYXNhdHRyKF9jdXJzZXMsICdDT0xPUlMnKToKKyAgICAgICAgY3Vyc2VzLkNPTE9SUyA9IF9jdXJzZXMuQ09MT1JTCisgICAgaWYgaGFzYXR0cihfY3Vyc2VzLCAnQ09MT1JfUEFJUlMnKToKKyAgICAgICAgY3Vyc2VzLkNPTE9SX1BBSVJTID0gX2N1cnNlcy5DT0xPUl9QQUlSUworICAgIHJldHVybiByZXR2YWwKKworIyBJbXBvcnQgUHl0aG9uIGhhc19rZXkoKSBpbXBsZW1lbnRhdGlvbiBpZiBfY3Vyc2VzIGRvZXNuJ3QgY29udGFpbiBoYXNfa2V5KCkKKwordHJ5OgorICAgIGhhc19rZXkKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZnJvbSBoYXNfa2V5IGltcG9ydCBoYXNfa2V5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiN2IxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2N1cnNlcy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBiN2IxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weSBiL2xpYi9weXRob24yLjcvY3Vyc2VzL2FzY2lpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMGZkOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weQpAQCAtMCwwICsxLDk5IEBACisiIiJDb25zdGFudHMgYW5kIG1lbWJlcnNoaXAgdGVzdHMgZm9yIEFTQ0lJIGNoYXJhY3RlcnMiIiIKKworTlVMICAgICA9IDB4MDAgICMgXkAKK1NPSCAgICAgPSAweDAxICAjIF5BCitTVFggICAgID0gMHgwMiAgIyBeQgorRVRYICAgICA9IDB4MDMgICMgXkMKK0VPVCAgICAgPSAweDA0ICAjIF5ECitFTlEgICAgID0gMHgwNSAgIyBeRQorQUNLICAgICA9IDB4MDYgICMgXkYKK0JFTCAgICAgPSAweDA3ICAjIF5HCitCUyAgICAgID0gMHgwOCAgIyBeSAorVEFCICAgICA9IDB4MDkgICMgXkkKK0hUICAgICAgPSAweDA5ICAjIF5JCitMRiAgICAgID0gMHgwYSAgIyBeSgorTkwgICAgICA9IDB4MGEgICMgXkoKK1ZUICAgICAgPSAweDBiICAjIF5LCitGRiAgICAgID0gMHgwYyAgIyBeTAorQ1IgICAgICA9IDB4MGQgICMgXk0KK1NPICAgICAgPSAweDBlICAjIF5OCitTSSAgICAgID0gMHgwZiAgIyBeTworRExFICAgICA9IDB4MTAgICMgXlAKK0RDMSAgICAgPSAweDExICAjIF5RCitEQzIgICAgID0gMHgxMiAgIyBeUgorREMzICAgICA9IDB4MTMgICMgXlMKK0RDNCAgICAgPSAweDE0ICAjIF5UCitOQUsgICAgID0gMHgxNSAgIyBeVQorU1lOICAgICA9IDB4MTYgICMgXlYKK0VUQiAgICAgPSAweDE3ICAjIF5XCitDQU4gICAgID0gMHgxOCAgIyBeWAorRU0gICAgICA9IDB4MTkgICMgXlkKK1NVQiAgICAgPSAweDFhICAjIF5aCitFU0MgICAgID0gMHgxYiAgIyBeWworRlMgICAgICA9IDB4MWMgICMgXlwKK0dTICAgICAgPSAweDFkICAjIF5dCitSUyAgICAgID0gMHgxZSAgIyBeXgorVVMgICAgICA9IDB4MWYgICMgXl8KK1NQICAgICAgPSAweDIwICAjIHNwYWNlCitERUwgICAgID0gMHg3ZiAgIyBkZWxldGUKKworY29udHJvbG5hbWVzID0gWworIk5VTCIsICJTT0giLCAiU1RYIiwgIkVUWCIsICJFT1QiLCAiRU5RIiwgIkFDSyIsICJCRUwiLAorIkJTIiwgICJIVCIsICAiTEYiLCAgIlZUIiwgICJGRiIsICAiQ1IiLCAgIlNPIiwgICJTSSIsCisiRExFIiwgIkRDMSIsICJEQzIiLCAiREMzIiwgIkRDNCIsICJOQUsiLCAiU1lOIiwgIkVUQiIsCisiQ0FOIiwgIkVNIiwgICJTVUIiLCAiRVNDIiwgIkZTIiwgICJHUyIsICAiUlMiLCAgIlVTIiwKKyJTUCIKK10KKworZGVmIF9jdG9pKGMpOgorICAgIGlmIHR5cGUoYykgPT0gdHlwZSgiIik6CisgICAgICAgIHJldHVybiBvcmQoYykKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gYworCitkZWYgaXNhbG51bShjKTogcmV0dXJuIGlzYWxwaGEoYykgb3IgaXNkaWdpdChjKQorZGVmIGlzYWxwaGEoYyk6IHJldHVybiBpc3VwcGVyKGMpIG9yIGlzbG93ZXIoYykKK2RlZiBpc2FzY2lpKGMpOiByZXR1cm4gX2N0b2koYykgPD0gMTI3ICAgICAgICAgICMgPworZGVmIGlzYmxhbmsoYyk6IHJldHVybiBfY3RvaShjKSBpbiAoOCwzMikKK2RlZiBpc2NudHJsKGMpOiByZXR1cm4gX2N0b2koYykgPD0gMzEKK2RlZiBpc2RpZ2l0KGMpOiByZXR1cm4gX2N0b2koYykgPj0gNDggYW5kIF9jdG9pKGMpIDw9IDU3CitkZWYgaXNncmFwaChjKTogcmV0dXJuIF9jdG9pKGMpID49IDMzIGFuZCBfY3RvaShjKSA8PSAxMjYKK2RlZiBpc2xvd2VyKGMpOiByZXR1cm4gX2N0b2koYykgPj0gOTcgYW5kIF9jdG9pKGMpIDw9IDEyMgorZGVmIGlzcHJpbnQoYyk6IHJldHVybiBfY3RvaShjKSA+PSAzMiBhbmQgX2N0b2koYykgPD0gMTI2CitkZWYgaXNwdW5jdChjKTogcmV0dXJuIF9jdG9pKGMpICE9IDMyIGFuZCBub3QgaXNhbG51bShjKQorZGVmIGlzc3BhY2UoYyk6IHJldHVybiBfY3RvaShjKSBpbiAoOSwgMTAsIDExLCAxMiwgMTMsIDMyKQorZGVmIGlzdXBwZXIoYyk6IHJldHVybiBfY3RvaShjKSA+PSA2NSBhbmQgX2N0b2koYykgPD0gOTAKK2RlZiBpc3hkaWdpdChjKTogcmV0dXJuIGlzZGlnaXQoYykgb3IgXAorICAgIChfY3RvaShjKSA+PSA2NSBhbmQgX2N0b2koYykgPD0gNzApIG9yIChfY3RvaShjKSA+PSA5NyBhbmQgX2N0b2koYykgPD0gMTAyKQorZGVmIGlzY3RybChjKTogcmV0dXJuIF9jdG9pKGMpIDwgMzIKK2RlZiBpc21ldGEoYyk6IHJldHVybiBfY3RvaShjKSA+IDEyNworCitkZWYgYXNjaWkoYyk6CisgICAgaWYgdHlwZShjKSA9PSB0eXBlKCIiKToKKyAgICAgICAgcmV0dXJuIGNocihfY3RvaShjKSAmIDB4N2YpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9jdG9pKGMpICYgMHg3ZgorCitkZWYgY3RybChjKToKKyAgICBpZiB0eXBlKGMpID09IHR5cGUoIiIpOgorICAgICAgICByZXR1cm4gY2hyKF9jdG9pKGMpICYgMHgxZikKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gX2N0b2koYykgJiAweDFmCisKK2RlZiBhbHQoYyk6CisgICAgaWYgdHlwZShjKSA9PSB0eXBlKCIiKToKKyAgICAgICAgcmV0dXJuIGNocihfY3RvaShjKSB8IDB4ODApCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9jdG9pKGMpIHwgMHg4MAorCitkZWYgdW5jdHJsKGMpOgorICAgIGJpdHMgPSBfY3RvaShjKQorICAgIGlmIGJpdHMgPT0gMHg3ZjoKKyAgICAgICAgcmVwID0gIl4/IgorICAgIGVsaWYgaXNwcmludChiaXRzICYgMHg3Zik6CisgICAgICAgIHJlcCA9IGNocihiaXRzICYgMHg3ZikKKyAgICBlbHNlOgorICAgICAgICByZXAgPSAiXiIgKyBjaHIoKChiaXRzICYgMHg3ZikgfCAweDIwKSArIDB4MjApCisgICAgaWYgYml0cyAmIDB4ODA6CisgICAgICAgIHJldHVybiAiISIgKyByZXAKKyAgICByZXR1cm4gcmVwCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weWMgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyMWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL2FzY2lpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weW8gYi9saWIvcHl0aG9uMi43L2N1cnNlcy9hc2NpaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyMWM5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL2FzY2lpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9oYXNfa2V5LnB5IGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvaGFzX2tleS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGQ1YTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvaGFzX2tleS5weQpAQCAtMCwwICsxLDE5MiBAQAorCisjCisjIEVtdWxhdGlvbiBvZiBoYXNfa2V5KCkgZnVuY3Rpb24gZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHVzZSBuY3Vyc2VzCisjCisKK2ltcG9ydCBfY3Vyc2VzCisKKyMgVGFibGUgbWFwcGluZyBjdXJzZXMga2V5cyB0byB0aGUgdGVybWluZm8gY2FwYWJpbGl0eSBuYW1lCisKK19jYXBhYmlsaXR5X25hbWVzID0geworICAgIF9jdXJzZXMuS0VZX0ExOiAna2ExJywKKyAgICBfY3Vyc2VzLktFWV9BMzogJ2thMycsCisgICAgX2N1cnNlcy5LRVlfQjI6ICdrYjInLAorICAgIF9jdXJzZXMuS0VZX0JBQ0tTUEFDRTogJ2ticycsCisgICAgX2N1cnNlcy5LRVlfQkVHOiAna2JlZycsCisgICAgX2N1cnNlcy5LRVlfQlRBQjogJ2tjYnQnLAorICAgIF9jdXJzZXMuS0VZX0MxOiAna2MxJywKKyAgICBfY3Vyc2VzLktFWV9DMzogJ2tjMycsCisgICAgX2N1cnNlcy5LRVlfQ0FOQ0VMOiAna2NhbicsCisgICAgX2N1cnNlcy5LRVlfQ0FUQUI6ICdrdGJjJywKKyAgICBfY3Vyc2VzLktFWV9DTEVBUjogJ2tjbHInLAorICAgIF9jdXJzZXMuS0VZX0NMT1NFOiAna2NsbycsCisgICAgX2N1cnNlcy5LRVlfQ09NTUFORDogJ2tjbWQnLAorICAgIF9jdXJzZXMuS0VZX0NPUFk6ICdrY3B5JywKKyAgICBfY3Vyc2VzLktFWV9DUkVBVEU6ICdrY3J0JywKKyAgICBfY3Vyc2VzLktFWV9DVEFCOiAna2N0YWInLAorICAgIF9jdXJzZXMuS0VZX0RDOiAna2RjaDEnLAorICAgIF9jdXJzZXMuS0VZX0RMOiAna2RsMScsCisgICAgX2N1cnNlcy5LRVlfRE9XTjogJ2tjdWQxJywKKyAgICBfY3Vyc2VzLktFWV9FSUM6ICdrcm1pcicsCisgICAgX2N1cnNlcy5LRVlfRU5EOiAna2VuZCcsCisgICAgX2N1cnNlcy5LRVlfRU5URVI6ICdrZW50JywKKyAgICBfY3Vyc2VzLktFWV9FT0w6ICdrZWwnLAorICAgIF9jdXJzZXMuS0VZX0VPUzogJ2tlZCcsCisgICAgX2N1cnNlcy5LRVlfRVhJVDogJ2tleHQnLAorICAgIF9jdXJzZXMuS0VZX0YwOiAna2YwJywKKyAgICBfY3Vyc2VzLktFWV9GMTogJ2tmMScsCisgICAgX2N1cnNlcy5LRVlfRjEwOiAna2YxMCcsCisgICAgX2N1cnNlcy5LRVlfRjExOiAna2YxMScsCisgICAgX2N1cnNlcy5LRVlfRjEyOiAna2YxMicsCisgICAgX2N1cnNlcy5LRVlfRjEzOiAna2YxMycsCisgICAgX2N1cnNlcy5LRVlfRjE0OiAna2YxNCcsCisgICAgX2N1cnNlcy5LRVlfRjE1OiAna2YxNScsCisgICAgX2N1cnNlcy5LRVlfRjE2OiAna2YxNicsCisgICAgX2N1cnNlcy5LRVlfRjE3OiAna2YxNycsCisgICAgX2N1cnNlcy5LRVlfRjE4OiAna2YxOCcsCisgICAgX2N1cnNlcy5LRVlfRjE5OiAna2YxOScsCisgICAgX2N1cnNlcy5LRVlfRjI6ICdrZjInLAorICAgIF9jdXJzZXMuS0VZX0YyMDogJ2tmMjAnLAorICAgIF9jdXJzZXMuS0VZX0YyMTogJ2tmMjEnLAorICAgIF9jdXJzZXMuS0VZX0YyMjogJ2tmMjInLAorICAgIF9jdXJzZXMuS0VZX0YyMzogJ2tmMjMnLAorICAgIF9jdXJzZXMuS0VZX0YyNDogJ2tmMjQnLAorICAgIF9jdXJzZXMuS0VZX0YyNTogJ2tmMjUnLAorICAgIF9jdXJzZXMuS0VZX0YyNjogJ2tmMjYnLAorICAgIF9jdXJzZXMuS0VZX0YyNzogJ2tmMjcnLAorICAgIF9jdXJzZXMuS0VZX0YyODogJ2tmMjgnLAorICAgIF9jdXJzZXMuS0VZX0YyOTogJ2tmMjknLAorICAgIF9jdXJzZXMuS0VZX0YzOiAna2YzJywKKyAgICBfY3Vyc2VzLktFWV9GMzA6ICdrZjMwJywKKyAgICBfY3Vyc2VzLktFWV9GMzE6ICdrZjMxJywKKyAgICBfY3Vyc2VzLktFWV9GMzI6ICdrZjMyJywKKyAgICBfY3Vyc2VzLktFWV9GMzM6ICdrZjMzJywKKyAgICBfY3Vyc2VzLktFWV9GMzQ6ICdrZjM0JywKKyAgICBfY3Vyc2VzLktFWV9GMzU6ICdrZjM1JywKKyAgICBfY3Vyc2VzLktFWV9GMzY6ICdrZjM2JywKKyAgICBfY3Vyc2VzLktFWV9GMzc6ICdrZjM3JywKKyAgICBfY3Vyc2VzLktFWV9GMzg6ICdrZjM4JywKKyAgICBfY3Vyc2VzLktFWV9GMzk6ICdrZjM5JywKKyAgICBfY3Vyc2VzLktFWV9GNDogJ2tmNCcsCisgICAgX2N1cnNlcy5LRVlfRjQwOiAna2Y0MCcsCisgICAgX2N1cnNlcy5LRVlfRjQxOiAna2Y0MScsCisgICAgX2N1cnNlcy5LRVlfRjQyOiAna2Y0MicsCisgICAgX2N1cnNlcy5LRVlfRjQzOiAna2Y0MycsCisgICAgX2N1cnNlcy5LRVlfRjQ0OiAna2Y0NCcsCisgICAgX2N1cnNlcy5LRVlfRjQ1OiAna2Y0NScsCisgICAgX2N1cnNlcy5LRVlfRjQ2OiAna2Y0NicsCisgICAgX2N1cnNlcy5LRVlfRjQ3OiAna2Y0NycsCisgICAgX2N1cnNlcy5LRVlfRjQ4OiAna2Y0OCcsCisgICAgX2N1cnNlcy5LRVlfRjQ5OiAna2Y0OScsCisgICAgX2N1cnNlcy5LRVlfRjU6ICdrZjUnLAorICAgIF9jdXJzZXMuS0VZX0Y1MDogJ2tmNTAnLAorICAgIF9jdXJzZXMuS0VZX0Y1MTogJ2tmNTEnLAorICAgIF9jdXJzZXMuS0VZX0Y1MjogJ2tmNTInLAorICAgIF9jdXJzZXMuS0VZX0Y1MzogJ2tmNTMnLAorICAgIF9jdXJzZXMuS0VZX0Y1NDogJ2tmNTQnLAorICAgIF9jdXJzZXMuS0VZX0Y1NTogJ2tmNTUnLAorICAgIF9jdXJzZXMuS0VZX0Y1NjogJ2tmNTYnLAorICAgIF9jdXJzZXMuS0VZX0Y1NzogJ2tmNTcnLAorICAgIF9jdXJzZXMuS0VZX0Y1ODogJ2tmNTgnLAorICAgIF9jdXJzZXMuS0VZX0Y1OTogJ2tmNTknLAorICAgIF9jdXJzZXMuS0VZX0Y2OiAna2Y2JywKKyAgICBfY3Vyc2VzLktFWV9GNjA6ICdrZjYwJywKKyAgICBfY3Vyc2VzLktFWV9GNjE6ICdrZjYxJywKKyAgICBfY3Vyc2VzLktFWV9GNjI6ICdrZjYyJywKKyAgICBfY3Vyc2VzLktFWV9GNjM6ICdrZjYzJywKKyAgICBfY3Vyc2VzLktFWV9GNzogJ2tmNycsCisgICAgX2N1cnNlcy5LRVlfRjg6ICdrZjgnLAorICAgIF9jdXJzZXMuS0VZX0Y5OiAna2Y5JywKKyAgICBfY3Vyc2VzLktFWV9GSU5EOiAna2ZuZCcsCisgICAgX2N1cnNlcy5LRVlfSEVMUDogJ2tobHAnLAorICAgIF9jdXJzZXMuS0VZX0hPTUU6ICdraG9tZScsCisgICAgX2N1cnNlcy5LRVlfSUM6ICdraWNoMScsCisgICAgX2N1cnNlcy5LRVlfSUw6ICdraWwxJywKKyAgICBfY3Vyc2VzLktFWV9MRUZUOiAna2N1YjEnLAorICAgIF9jdXJzZXMuS0VZX0xMOiAna2xsJywKKyAgICBfY3Vyc2VzLktFWV9NQVJLOiAna21yaycsCisgICAgX2N1cnNlcy5LRVlfTUVTU0FHRTogJ2ttc2cnLAorICAgIF9jdXJzZXMuS0VZX01PVkU6ICdrbW92JywKKyAgICBfY3Vyc2VzLktFWV9ORVhUOiAna254dCcsCisgICAgX2N1cnNlcy5LRVlfTlBBR0U6ICdrbnAnLAorICAgIF9jdXJzZXMuS0VZX09QRU46ICdrb3BuJywKKyAgICBfY3Vyc2VzLktFWV9PUFRJT05TOiAna29wdCcsCisgICAgX2N1cnNlcy5LRVlfUFBBR0U6ICdrcHAnLAorICAgIF9jdXJzZXMuS0VZX1BSRVZJT1VTOiAna3BydicsCisgICAgX2N1cnNlcy5LRVlfUFJJTlQ6ICdrcHJ0JywKKyAgICBfY3Vyc2VzLktFWV9SRURPOiAna3JkbycsCisgICAgX2N1cnNlcy5LRVlfUkVGRVJFTkNFOiAna3JlZicsCisgICAgX2N1cnNlcy5LRVlfUkVGUkVTSDogJ2tyZnInLAorICAgIF9jdXJzZXMuS0VZX1JFUExBQ0U6ICdrcnBsJywKKyAgICBfY3Vyc2VzLktFWV9SRVNUQVJUOiAna3JzdCcsCisgICAgX2N1cnNlcy5LRVlfUkVTVU1FOiAna3JlcycsCisgICAgX2N1cnNlcy5LRVlfUklHSFQ6ICdrY3VmMScsCisgICAgX2N1cnNlcy5LRVlfU0FWRTogJ2tzYXYnLAorICAgIF9jdXJzZXMuS0VZX1NCRUc6ICdrQkVHJywKKyAgICBfY3Vyc2VzLktFWV9TQ0FOQ0VMOiAna0NBTicsCisgICAgX2N1cnNlcy5LRVlfU0NPTU1BTkQ6ICdrQ01EJywKKyAgICBfY3Vyc2VzLktFWV9TQ09QWTogJ2tDUFknLAorICAgIF9jdXJzZXMuS0VZX1NDUkVBVEU6ICdrQ1JUJywKKyAgICBfY3Vyc2VzLktFWV9TREM6ICdrREMnLAorICAgIF9jdXJzZXMuS0VZX1NETDogJ2tETCcsCisgICAgX2N1cnNlcy5LRVlfU0VMRUNUOiAna3NsdCcsCisgICAgX2N1cnNlcy5LRVlfU0VORDogJ2tFTkQnLAorICAgIF9jdXJzZXMuS0VZX1NFT0w6ICdrRU9MJywKKyAgICBfY3Vyc2VzLktFWV9TRVhJVDogJ2tFWFQnLAorICAgIF9jdXJzZXMuS0VZX1NGOiAna2luZCcsCisgICAgX2N1cnNlcy5LRVlfU0ZJTkQ6ICdrRk5EJywKKyAgICBfY3Vyc2VzLktFWV9TSEVMUDogJ2tITFAnLAorICAgIF9jdXJzZXMuS0VZX1NIT01FOiAna0hPTScsCisgICAgX2N1cnNlcy5LRVlfU0lDOiAna0lDJywKKyAgICBfY3Vyc2VzLktFWV9TTEVGVDogJ2tMRlQnLAorICAgIF9jdXJzZXMuS0VZX1NNRVNTQUdFOiAna01TRycsCisgICAgX2N1cnNlcy5LRVlfU01PVkU6ICdrTU9WJywKKyAgICBfY3Vyc2VzLktFWV9TTkVYVDogJ2tOWFQnLAorICAgIF9jdXJzZXMuS0VZX1NPUFRJT05TOiAna09QVCcsCisgICAgX2N1cnNlcy5LRVlfU1BSRVZJT1VTOiAna1BSVicsCisgICAgX2N1cnNlcy5LRVlfU1BSSU5UOiAna1BSVCcsCisgICAgX2N1cnNlcy5LRVlfU1I6ICdrcmknLAorICAgIF9jdXJzZXMuS0VZX1NSRURPOiAna1JETycsCisgICAgX2N1cnNlcy5LRVlfU1JFUExBQ0U6ICdrUlBMJywKKyAgICBfY3Vyc2VzLktFWV9TUklHSFQ6ICdrUklUJywKKyAgICBfY3Vyc2VzLktFWV9TUlNVTUU6ICdrUkVTJywKKyAgICBfY3Vyc2VzLktFWV9TU0FWRTogJ2tTQVYnLAorICAgIF9jdXJzZXMuS0VZX1NTVVNQRU5EOiAna1NQRCcsCisgICAgX2N1cnNlcy5LRVlfU1RBQjogJ2todHMnLAorICAgIF9jdXJzZXMuS0VZX1NVTkRPOiAna1VORCcsCisgICAgX2N1cnNlcy5LRVlfU1VTUEVORDogJ2tzcGQnLAorICAgIF9jdXJzZXMuS0VZX1VORE86ICdrdW5kJywKKyAgICBfY3Vyc2VzLktFWV9VUDogJ2tjdXUxJworICAgIH0KKworZGVmIGhhc19rZXkoY2gpOgorICAgIGlmIGlzaW5zdGFuY2UoY2gsIHN0cik6CisgICAgICAgIGNoID0gb3JkKGNoKQorCisgICAgIyBGaWd1cmUgb3V0IHRoZSBjb3JyZWN0IGNhcGFiaWxpdHkgbmFtZSBmb3IgdGhlIGtleWNvZGUuCisgICAgY2FwYWJpbGl0eV9uYW1lID0gX2NhcGFiaWxpdHlfbmFtZXMuZ2V0KGNoKQorICAgIGlmIGNhcGFiaWxpdHlfbmFtZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICNDaGVjayB0aGUgY3VycmVudCB0ZXJtaW5hbCBkZXNjcmlwdGlvbiBmb3IgdGhhdCBjYXBhYmlsaXR5OworICAgICNpZiBwcmVzZW50LCByZXR1cm4gdHJ1ZSwgZWxzZSByZXR1cm4gZmFsc2UuCisgICAgaWYgX2N1cnNlcy50aWdldHN0ciggY2FwYWJpbGl0eV9uYW1lICk6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyBDb21wYXJlIHRoZSBvdXRwdXQgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlIG5jdXJzZXMgaGFzX2tleSwKKyAgICAjIG9uIHBsYXRmb3JtcyB3aGVyZSBoYXNfa2V5IGlzIGFscmVhZHkgYXZhaWxhYmxlCisgICAgdHJ5OgorICAgICAgICBMID0gW10KKyAgICAgICAgX2N1cnNlcy5pbml0c2NyKCkKKyAgICAgICAgZm9yIGtleSBpbiBfY2FwYWJpbGl0eV9uYW1lcy5rZXlzKCk6CisgICAgICAgICAgICBzeXN0ZW0gPSBrZXkgaW4gX2N1cnNlcworICAgICAgICAgICAgcHl0aG9uID0gaGFzX2tleShrZXkpCisgICAgICAgICAgICBpZiBzeXN0ZW0gIT0gcHl0aG9uOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKCAnTWlzbWF0Y2ggZm9yIGtleSAlcywgc3lzdGVtPSVpLCBQeXRob249JWknCisgICAgICAgICAgICAgICAgICAgICAgICAgICUgKF9jdXJzZXMua2V5bmFtZSgga2V5ICksIHN5c3RlbSwgcHl0aG9uKSApCisgICAgZmluYWxseToKKyAgICAgICAgX2N1cnNlcy5lbmR3aW4oKQorICAgICAgICBmb3IgaSBpbiBMOiBwcmludCBpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9oYXNfa2V5LnB5YyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL2hhc19rZXkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTQ4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9oYXNfa2V5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9oYXNfa2V5LnB5byBiL2xpYi9weXRob24yLjcvY3Vyc2VzL2hhc19rZXkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTQ4ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9oYXNfa2V5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weSBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3BhbmVsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhY2NhODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weQpAQCAtMCwwICsxLDggQEAKKyIiImN1cnNlcy5wYW5lbAorCitNb2R1bGUgZm9yIHVzaW5nIHBhbmVscyB3aXRoIGN1cnNlcy4KKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworZnJvbSBfY3Vyc2VzX3BhbmVsIGltcG9ydCAqCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weWMgYi9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkOWNkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3BhbmVsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weW8gYi9saWIvcHl0aG9uMi43L2N1cnNlcy9wYW5lbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkOWNkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3BhbmVsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy90ZXh0cGFkLnB5IGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvdGV4dHBhZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDUzNjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvdGV4dHBhZC5weQpAQCAtMCwwICsxLDE4OCBAQAorIiIiU2ltcGxlIHRleHRib3ggZWRpdGluZyB3aWRnZXQgd2l0aCBFbWFjcy1saWtlIGtleWJpbmRpbmdzLiIiIgorCitpbXBvcnQgY3Vyc2VzCitpbXBvcnQgY3Vyc2VzLmFzY2lpCisKK2RlZiByZWN0YW5nbGUod2luLCB1bHksIHVseCwgbHJ5LCBscngpOgorICAgICIiIkRyYXcgYSByZWN0YW5nbGUgd2l0aCBjb3JuZXJzIGF0IHRoZSBwcm92aWRlZCB1cHBlci1sZWZ0CisgICAgYW5kIGxvd2VyLXJpZ2h0IGNvb3JkaW5hdGVzLgorICAgICIiIgorICAgIHdpbi52bGluZSh1bHkrMSwgdWx4LCBjdXJzZXMuQUNTX1ZMSU5FLCBscnkgLSB1bHkgLSAxKQorICAgIHdpbi5obGluZSh1bHksIHVseCsxLCBjdXJzZXMuQUNTX0hMSU5FLCBscnggLSB1bHggLSAxKQorICAgIHdpbi5obGluZShscnksIHVseCsxLCBjdXJzZXMuQUNTX0hMSU5FLCBscnggLSB1bHggLSAxKQorICAgIHdpbi52bGluZSh1bHkrMSwgbHJ4LCBjdXJzZXMuQUNTX1ZMSU5FLCBscnkgLSB1bHkgLSAxKQorICAgIHdpbi5hZGRjaCh1bHksIHVseCwgY3Vyc2VzLkFDU19VTENPUk5FUikKKyAgICB3aW4uYWRkY2godWx5LCBscngsIGN1cnNlcy5BQ1NfVVJDT1JORVIpCisgICAgd2luLmFkZGNoKGxyeSwgbHJ4LCBjdXJzZXMuQUNTX0xSQ09STkVSKQorICAgIHdpbi5hZGRjaChscnksIHVseCwgY3Vyc2VzLkFDU19MTENPUk5FUikKKworY2xhc3MgVGV4dGJveDoKKyAgICAiIiJFZGl0aW5nIHdpZGdldCB1c2luZyB0aGUgaW50ZXJpb3Igb2YgYSB3aW5kb3cgb2JqZWN0LgorICAgICBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIEVtYWNzLWxpa2Uga2V5IGJpbmRpbmdzOgorCisgICAgQ3RybC1BICAgICAgR28gdG8gbGVmdCBlZGdlIG9mIHdpbmRvdy4KKyAgICBDdHJsLUIgICAgICBDdXJzb3IgbGVmdCwgd3JhcHBpbmcgdG8gcHJldmlvdXMgbGluZSBpZiBhcHByb3ByaWF0ZS4KKyAgICBDdHJsLUQgICAgICBEZWxldGUgY2hhcmFjdGVyIHVuZGVyIGN1cnNvci4KKyAgICBDdHJsLUUgICAgICBHbyB0byByaWdodCBlZGdlIChzdHJpcHNwYWNlcyBvZmYpIG9yIGVuZCBvZiBsaW5lIChzdHJpcHNwYWNlcyBvbikuCisgICAgQ3RybC1GICAgICAgQ3Vyc29yIHJpZ2h0LCB3cmFwcGluZyB0byBuZXh0IGxpbmUgd2hlbiBhcHByb3ByaWF0ZS4KKyAgICBDdHJsLUcgICAgICBUZXJtaW5hdGUsIHJldHVybmluZyB0aGUgd2luZG93IGNvbnRlbnRzLgorICAgIEN0cmwtSCAgICAgIERlbGV0ZSBjaGFyYWN0ZXIgYmFja3dhcmQuCisgICAgQ3RybC1KICAgICAgVGVybWluYXRlIGlmIHRoZSB3aW5kb3cgaXMgMSBsaW5lLCBvdGhlcndpc2UgaW5zZXJ0IG5ld2xpbmUuCisgICAgQ3RybC1LICAgICAgSWYgbGluZSBpcyBibGFuaywgZGVsZXRlIGl0LCBvdGhlcndpc2UgY2xlYXIgdG8gZW5kIG9mIGxpbmUuCisgICAgQ3RybC1MICAgICAgUmVmcmVzaCBzY3JlZW4uCisgICAgQ3RybC1OICAgICAgQ3Vyc29yIGRvd247IG1vdmUgZG93biBvbmUgbGluZS4KKyAgICBDdHJsLU8gICAgICBJbnNlcnQgYSBibGFuayBsaW5lIGF0IGN1cnNvciBsb2NhdGlvbi4KKyAgICBDdHJsLVAgICAgICBDdXJzb3IgdXA7IG1vdmUgdXAgb25lIGxpbmUuCisKKyAgICBNb3ZlIG9wZXJhdGlvbnMgZG8gbm90aGluZyBpZiB0aGUgY3Vyc29yIGlzIGF0IGFuIGVkZ2Ugd2hlcmUgdGhlIG1vdmVtZW50CisgICAgaXMgbm90IHBvc3NpYmxlLiAgVGhlIGZvbGxvd2luZyBzeW5vbnltcyBhcmUgc3VwcG9ydGVkIHdoZXJlIHBvc3NpYmxlOgorCisgICAgS0VZX0xFRlQgPSBDdHJsLUIsIEtFWV9SSUdIVCA9IEN0cmwtRiwgS0VZX1VQID0gQ3RybC1QLCBLRVlfRE9XTiA9IEN0cmwtTgorICAgIEtFWV9CQUNLU1BBQ0UgPSBDdHJsLWgKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2luLCBpbnNlcnRfbW9kZT1GYWxzZSk6CisgICAgICAgIHNlbGYud2luID0gd2luCisgICAgICAgIHNlbGYuaW5zZXJ0X21vZGUgPSBpbnNlcnRfbW9kZQorICAgICAgICAoc2VsZi5tYXh5LCBzZWxmLm1heHgpID0gd2luLmdldG1heHl4KCkKKyAgICAgICAgc2VsZi5tYXh5ID0gc2VsZi5tYXh5IC0gMQorICAgICAgICBzZWxmLm1heHggPSBzZWxmLm1heHggLSAxCisgICAgICAgIHNlbGYuc3RyaXBzcGFjZXMgPSAxCisgICAgICAgIHNlbGYubGFzdGNtZCA9IE5vbmUKKyAgICAgICAgd2luLmtleXBhZCgxKQorCisgICAgZGVmIF9lbmRfb2ZfbGluZShzZWxmLCB5KToKKyAgICAgICAgIiIiR28gdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBmaXJzdCBibGFuayBvbiB0aGUgZ2l2ZW4gbGluZSwKKyAgICAgICAgcmV0dXJuaW5nIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBub24tYmxhbmsgY2hhcmFjdGVyLiIiIgorICAgICAgICBsYXN0ID0gc2VsZi5tYXh4CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBjdXJzZXMuYXNjaWkuYXNjaWkoc2VsZi53aW4uaW5jaCh5LCBsYXN0KSkgIT0gY3Vyc2VzLmFzY2lpLlNQOgorICAgICAgICAgICAgICAgIGxhc3QgPSBtaW4oc2VsZi5tYXh4LCBsYXN0KzEpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbGFzdCA9PSAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsYXN0ID0gbGFzdCAtIDEKKyAgICAgICAgcmV0dXJuIGxhc3QKKworICAgIGRlZiBfaW5zZXJ0X3ByaW50YWJsZV9jaGFyKHNlbGYsIGNoKToKKyAgICAgICAgKHksIHgpID0gc2VsZi53aW4uZ2V0eXgoKQorICAgICAgICBpZiB5IDwgc2VsZi5tYXh5IG9yIHggPCBzZWxmLm1heHg6CisgICAgICAgICAgICBpZiBzZWxmLmluc2VydF9tb2RlOgorICAgICAgICAgICAgICAgIG9sZGNoID0gc2VsZi53aW4uaW5jaCgpCisgICAgICAgICAgICAjIFRoZSB0cnktY2F0Y2ggaWdub3JlcyB0aGUgZXJyb3Igd2UgdHJpZ2dlciBmcm9tIHNvbWUgY3Vyc2VzCisgICAgICAgICAgICAjIHZlcnNpb25zIGJ5IHRyeWluZyB0byB3cml0ZSBpbnRvIHRoZSBsb3dlc3QtcmlnaHRtb3N0IHNwb3QKKyAgICAgICAgICAgICMgaW4gdGhlIHdpbmRvdy4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5hZGRjaChjaCkKKyAgICAgICAgICAgIGV4Y2VwdCBjdXJzZXMuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgaWYgc2VsZi5pbnNlcnRfbW9kZToKKyAgICAgICAgICAgICAgICAoYmFja3ksIGJhY2t4KSA9IHNlbGYud2luLmdldHl4KCkKKyAgICAgICAgICAgICAgICBpZiBjdXJzZXMuYXNjaWkuaXNwcmludChvbGRjaCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luc2VydF9wcmludGFibGVfY2hhcihvbGRjaCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZShiYWNreSwgYmFja3gpCisKKyAgICBkZWYgZG9fY29tbWFuZChzZWxmLCBjaCk6CisgICAgICAgICJQcm9jZXNzIGEgc2luZ2xlIGVkaXRpbmcgY29tbWFuZC4iCisgICAgICAgICh5LCB4KSA9IHNlbGYud2luLmdldHl4KCkKKyAgICAgICAgc2VsZi5sYXN0Y21kID0gY2gKKyAgICAgICAgaWYgY3Vyc2VzLmFzY2lpLmlzcHJpbnQoY2gpOgorICAgICAgICAgICAgaWYgeSA8IHNlbGYubWF4eSBvciB4IDwgc2VsZi5tYXh4OgorICAgICAgICAgICAgICAgIHNlbGYuX2luc2VydF9wcmludGFibGVfY2hhcihjaCkKKyAgICAgICAgZWxpZiBjaCA9PSBjdXJzZXMuYXNjaWkuU09IOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgXmEKKyAgICAgICAgICAgIHNlbGYud2luLm1vdmUoeSwgMCkKKyAgICAgICAgZWxpZiBjaCBpbiAoY3Vyc2VzLmFzY2lpLlNUWCxjdXJzZXMuS0VZX0xFRlQsIGN1cnNlcy5hc2NpaS5CUyxjdXJzZXMuS0VZX0JBQ0tTUEFDRSk6CisgICAgICAgICAgICBpZiB4ID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHksIHgtMSkKKyAgICAgICAgICAgIGVsaWYgeSA9PSAwOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdHJpcHNwYWNlczoKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHktMSwgc2VsZi5fZW5kX29mX2xpbmUoeS0xKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53aW4ubW92ZSh5LTEsIHNlbGYubWF4eCkKKyAgICAgICAgICAgIGlmIGNoIGluIChjdXJzZXMuYXNjaWkuQlMsIGN1cnNlcy5LRVlfQkFDS1NQQUNFKToKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5kZWxjaCgpCisgICAgICAgIGVsaWYgY2ggPT0gY3Vyc2VzLmFzY2lpLkVPVDogICAgICAgICAgICAgICAgICAgICAgICAgICAjIF5kCisgICAgICAgICAgICBzZWxmLndpbi5kZWxjaCgpCisgICAgICAgIGVsaWYgY2ggPT0gY3Vyc2VzLmFzY2lpLkVOUTogICAgICAgICAgICAgICAgICAgICAgICAgICAjIF5lCisgICAgICAgICAgICBpZiBzZWxmLnN0cmlwc3BhY2VzOgorICAgICAgICAgICAgICAgIHNlbGYud2luLm1vdmUoeSwgc2VsZi5fZW5kX29mX2xpbmUoeSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud2luLm1vdmUoeSwgc2VsZi5tYXh4KQorICAgICAgICBlbGlmIGNoIGluIChjdXJzZXMuYXNjaWkuQUNLLCBjdXJzZXMuS0VZX1JJR0hUKTogICAgICAgIyBeZgorICAgICAgICAgICAgaWYgeCA8IHNlbGYubWF4eDoKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHksIHgrMSkKKyAgICAgICAgICAgIGVsaWYgeSA9PSBzZWxmLm1heHk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHkrMSwgMCkKKyAgICAgICAgZWxpZiBjaCA9PSBjdXJzZXMuYXNjaWkuQkVMOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgXmcKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsaWYgY2ggPT0gY3Vyc2VzLmFzY2lpLk5MOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIF5qCisgICAgICAgICAgICBpZiBzZWxmLm1heHkgPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxpZiB5IDwgc2VsZi5tYXh5OgorICAgICAgICAgICAgICAgIHNlbGYud2luLm1vdmUoeSsxLCAwKQorICAgICAgICBlbGlmIGNoID09IGN1cnNlcy5hc2NpaS5WVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBeaworICAgICAgICAgICAgaWYgeCA9PSAwIGFuZCBzZWxmLl9lbmRfb2ZfbGluZSh5KSA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYud2luLmRlbGV0ZWxuKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBmaXJzdCB1bmRvIHRoZSBlZmZlY3Qgb2Ygc2VsZi5fZW5kX29mX2xpbmUKKyAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHksIHgpCisgICAgICAgICAgICAgICAgc2VsZi53aW4uY2xydG9lb2woKQorICAgICAgICBlbGlmIGNoID09IGN1cnNlcy5hc2NpaS5GRjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBebAorICAgICAgICAgICAgc2VsZi53aW4ucmVmcmVzaCgpCisgICAgICAgIGVsaWYgY2ggaW4gKGN1cnNlcy5hc2NpaS5TTywgY3Vyc2VzLktFWV9ET1dOKTogICAgICAgICAjIF5uCisgICAgICAgICAgICBpZiB5IDwgc2VsZi5tYXh5OgorICAgICAgICAgICAgICAgIHNlbGYud2luLm1vdmUoeSsxLCB4KQorICAgICAgICAgICAgICAgIGlmIHggPiBzZWxmLl9lbmRfb2ZfbGluZSh5KzEpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHkrMSwgc2VsZi5fZW5kX29mX2xpbmUoeSsxKSkKKyAgICAgICAgZWxpZiBjaCA9PSBjdXJzZXMuYXNjaWkuU0k6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgXm8KKyAgICAgICAgICAgIHNlbGYud2luLmluc2VydGxuKCkKKyAgICAgICAgZWxpZiBjaCBpbiAoY3Vyc2VzLmFzY2lpLkRMRSwgY3Vyc2VzLktFWV9VUCk6ICAgICAgICAgICMgXnAKKyAgICAgICAgICAgIGlmIHkgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYud2luLm1vdmUoeS0xLCB4KQorICAgICAgICAgICAgICAgIGlmIHggPiBzZWxmLl9lbmRfb2ZfbGluZSh5LTEpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHktMSwgc2VsZi5fZW5kX29mX2xpbmUoeS0xKSkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBnYXRoZXIoc2VsZik6CisgICAgICAgICJDb2xsZWN0IGFuZCByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSB3aW5kb3cuIgorICAgICAgICByZXN1bHQgPSAiIgorICAgICAgICBmb3IgeSBpbiByYW5nZShzZWxmLm1heHkrMSk6CisgICAgICAgICAgICBzZWxmLndpbi5tb3ZlKHksIDApCisgICAgICAgICAgICBzdG9wID0gc2VsZi5fZW5kX29mX2xpbmUoeSkKKyAgICAgICAgICAgIGlmIHN0b3AgPT0gMCBhbmQgc2VsZi5zdHJpcHNwYWNlczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2Uoc2VsZi5tYXh4KzEpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RyaXBzcGFjZXMgYW5kIHggPiBzdG9wOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIGNocihjdXJzZXMuYXNjaWkuYXNjaWkoc2VsZi53aW4uaW5jaCh5LCB4KSkpCisgICAgICAgICAgICBpZiBzZWxmLm1heHkgPiAwOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICJcbiIKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGVkaXQoc2VsZiwgdmFsaWRhdGU9Tm9uZSk6CisgICAgICAgICJFZGl0IGluIHRoZSB3aWRnZXQgd2luZG93IGFuZCBjb2xsZWN0IHRoZSByZXN1bHRzLiIKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGNoID0gc2VsZi53aW4uZ2V0Y2goKQorICAgICAgICAgICAgaWYgdmFsaWRhdGU6CisgICAgICAgICAgICAgICAgY2ggPSB2YWxpZGF0ZShjaCkKKyAgICAgICAgICAgIGlmIG5vdCBjaDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZG9fY29tbWFuZChjaCk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYud2luLnJlZnJlc2goKQorICAgICAgICByZXR1cm4gc2VsZi5nYXRoZXIoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGRlZiB0ZXN0X2VkaXRib3goc3Rkc2NyKToKKyAgICAgICAgbmNvbHMsIG5saW5lcyA9IDksIDQKKyAgICAgICAgdWx5LCB1bHggPSAxNSwgMjAKKyAgICAgICAgc3Rkc2NyLmFkZHN0cih1bHktMiwgdWx4LCAiVXNlIEN0cmwtRyB0byBlbmQgZWRpdGluZy4iKQorICAgICAgICB3aW4gPSBjdXJzZXMubmV3d2luKG5saW5lcywgbmNvbHMsIHVseSwgdWx4KQorICAgICAgICByZWN0YW5nbGUoc3Rkc2NyLCB1bHktMSwgdWx4LTEsIHVseSArIG5saW5lcywgdWx4ICsgbmNvbHMpCisgICAgICAgIHN0ZHNjci5yZWZyZXNoKCkKKyAgICAgICAgcmV0dXJuIFRleHRib3god2luKS5lZGl0KCkKKworICAgIHN0ciA9IGN1cnNlcy53cmFwcGVyKHRlc3RfZWRpdGJveCkKKyAgICBwcmludCAnQ29udGVudHMgb2YgdGV4dCBib3g6JywgcmVwcihzdHIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy90ZXh0cGFkLnB5YyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3RleHRwYWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjlkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy90ZXh0cGFkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy90ZXh0cGFkLnB5byBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3RleHRwYWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MjlkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy90ZXh0cGFkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy93cmFwcGVyLnB5IGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvd3JhcHBlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgzY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9jdXJzZXMvd3JhcHBlci5weQpAQCAtMCwwICsxLDUwIEBACisiIiJjdXJzZXMud3JhcHBlcgorCitDb250YWlucyBvbmUgZnVuY3Rpb24sIHdyYXBwZXIoKSwgd2hpY2ggcnVucyBhbm90aGVyIGZ1bmN0aW9uIHdoaWNoCitzaG91bGQgYmUgdGhlIHJlc3Qgb2YgeW91ciBjdXJzZXMtYmFzZWQgYXBwbGljYXRpb24uICBJZiB0aGUKK2FwcGxpY2F0aW9uIHJhaXNlcyBhbiBleGNlcHRpb24sIHdyYXBwZXIoKSB3aWxsIHJlc3RvcmUgdGhlIHRlcm1pbmFsCit0byBhIHNhbmUgc3RhdGUgc28geW91IGNhbiByZWFkIHRoZSByZXN1bHRpbmcgdHJhY2ViYWNrLgorCisiIiIKKworaW1wb3J0IGN1cnNlcworCitkZWYgd3JhcHBlcihmdW5jLCAqYXJncywgKiprd2RzKToKKyAgICAiIiJXcmFwcGVyIGZ1bmN0aW9uIHRoYXQgaW5pdGlhbGl6ZXMgY3Vyc2VzIGFuZCBjYWxscyBhbm90aGVyIGZ1bmN0aW9uLAorICAgIHJlc3RvcmluZyBub3JtYWwga2V5Ym9hcmQvc2NyZWVuIGJlaGF2aW9yIG9uIGVycm9yLgorICAgIFRoZSBjYWxsYWJsZSBvYmplY3QgJ2Z1bmMnIGlzIHRoZW4gcGFzc2VkIHRoZSBtYWluIHdpbmRvdyAnc3Rkc2NyJworICAgIGFzIGl0cyBmaXJzdCBhcmd1bWVudCwgZm9sbG93ZWQgYnkgYW55IG90aGVyIGFyZ3VtZW50cyBwYXNzZWQgdG8KKyAgICB3cmFwcGVyKCkuCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICAgICMgSW5pdGlhbGl6ZSBjdXJzZXMKKyAgICAgICAgc3Rkc2NyID0gY3Vyc2VzLmluaXRzY3IoKQorCisgICAgICAgICMgVHVybiBvZmYgZWNob2luZyBvZiBrZXlzLCBhbmQgZW50ZXIgY2JyZWFrIG1vZGUsCisgICAgICAgICMgd2hlcmUgbm8gYnVmZmVyaW5nIGlzIHBlcmZvcm1lZCBvbiBrZXlib2FyZCBpbnB1dAorICAgICAgICBjdXJzZXMubm9lY2hvKCkKKyAgICAgICAgY3Vyc2VzLmNicmVhaygpCisKKyAgICAgICAgIyBJbiBrZXlwYWQgbW9kZSwgZXNjYXBlIHNlcXVlbmNlcyBmb3Igc3BlY2lhbCBrZXlzCisgICAgICAgICMgKGxpa2UgdGhlIGN1cnNvciBrZXlzKSB3aWxsIGJlIGludGVycHJldGVkIGFuZAorICAgICAgICAjIGEgc3BlY2lhbCB2YWx1ZSBsaWtlIGN1cnNlcy5LRVlfTEVGVCB3aWxsIGJlIHJldHVybmVkCisgICAgICAgIHN0ZHNjci5rZXlwYWQoMSkKKworICAgICAgICAjIFN0YXJ0IGNvbG9yLCB0b28uICBIYXJtbGVzcyBpZiB0aGUgdGVybWluYWwgZG9lc24ndCBoYXZlCisgICAgICAgICMgY29sb3I7IHVzZXIgY2FuIHRlc3Qgd2l0aCBoYXNfY29sb3IoKSBsYXRlciBvbi4gIFRoZSB0cnkvY2F0Y2gKKyAgICAgICAgIyB3b3JrcyBhcm91bmQgYSBtaW5vciBiaXQgb2Ygb3Zlci1jb25zY2llbnRpb3VzbmVzcyBpbiB0aGUgY3Vyc2VzCisgICAgICAgICMgbW9kdWxlIC0tIHRoZSBlcnJvciByZXR1cm4gZnJvbSBDIHN0YXJ0X2NvbG9yKCkgaXMgaWdub3JhYmxlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXJzZXMuc3RhcnRfY29sb3IoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmV0dXJuIGZ1bmMoc3Rkc2NyLCAqYXJncywgKiprd2RzKQorICAgIGZpbmFsbHk6CisgICAgICAgICMgU2V0IGV2ZXJ5dGhpbmcgYmFjayB0byBub3JtYWwKKyAgICAgICAgaWYgJ3N0ZHNjcicgaW4gbG9jYWxzKCk6CisgICAgICAgICAgICBzdGRzY3Iua2V5cGFkKDApCisgICAgICAgICAgICBjdXJzZXMuZWNobygpCisgICAgICAgICAgICBjdXJzZXMubm9jYnJlYWsoKQorICAgICAgICAgICAgY3Vyc2VzLmVuZHdpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy93cmFwcGVyLnB5YyBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3dyYXBwZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTNiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy93cmFwcGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2N1cnNlcy93cmFwcGVyLnB5byBiL2xpYi9weXRob24yLjcvY3Vyc2VzL3dyYXBwZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTNiNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2N1cnNlcy93cmFwcGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2RiaGFzaC5weSBiL2xpYi9weXRob24yLjcvZGJoYXNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDUzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RiaGFzaC5weQpAQCAtMCwwICsxLDE4IEBACisiIiJQcm92aWRlIGEgKGcpZGJtLWNvbXBhdGlibGUgaW50ZXJmYWNlIHRvIGJzZGRiLmhhc2hvcGVuLiIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLndhcm5weTNrKCJpbiAzLngsIHRoZSBkYmhhc2ggbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQiLCBzdGFja2xldmVsPTIpCit0cnk6CisgICAgaW1wb3J0IGJzZGRiCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBwcmV2ZW50IGEgc2Vjb25kIGltcG9ydCBvZiB0aGlzIG1vZHVsZSBmcm9tIHNwdXJpb3VzbHkgc3VjY2VlZGluZworICAgIGRlbCBzeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICByYWlzZQorCitfX2FsbF9fID0gWyJlcnJvciIsIm9wZW4iXQorCitlcnJvciA9IGJzZGRiLmVycm9yICAgICAgICAgICAgICAgICAgICAgIyBFeHBvcnRlZCBmb3IgYW55ZGJtCisKK2RlZiBvcGVuKGZpbGUsIGZsYWcgPSAncicsIG1vZGU9MDY2Nik6CisgICAgcmV0dXJuIGJzZGRiLmhhc2hvcGVuKGZpbGUsIGZsYWcsIG1vZGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2RiaGFzaC5weWMgYi9saWIvcHl0aG9uMi43L2RiaGFzaC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmZmRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGJoYXNoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2RiaGFzaC5weW8gYi9saWIvcHl0aG9uMi43L2RiaGFzaC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmZmRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGJoYXNoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2RlY2ltYWwucHkgYi9saWIvcHl0aG9uMi43L2RlY2ltYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYxMTI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGVjaW1hbC5weQpAQCAtMCwwICsxLDYxOTggQEAKKyMgQ29weXJpZ2h0IChjKSAyMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisjIFdyaXR0ZW4gYnkgRXJpYyBQcmljZSA8ZXByaWNlIGF0IHRqaHNzdC5lZHU+CisjICAgIGFuZCBGYWN1bmRvIEJhdGlzdGEgPGZhY3VuZG8gYXQgdGFuaXF1ZXRpbC5jb20uYXI+CisjICAgIGFuZCBSYXltb25kIEhldHRpbmdlciA8cHl0aG9uIGF0IHJjbi5jb20+CisjICAgIGFuZCBBYWh6IDxhYWh6IGF0IHBvYm94LmNvbT4KKyMgICAgYW5kIFRpbSBQZXRlcnMKKworIyBUaGlzIG1vZHVsZSBpcyBjdXJyZW50bHkgUHkyLjMgY29tcGF0aWJsZSBhbmQgc2hvdWxkIGJlIGtlcHQgdGhhdCB3YXkKKyMgdW5sZXNzIGEgbWFqb3IgY29tcGVsbGluZyBhZHZhbnRhZ2UgYXJpc2VzLiAgSU9XLCAyLjMgY29tcGF0aWJpbGl0eSBpcworIyBzdHJvbmdseSBwcmVmZXJyZWQsIGJ1dCBub3QgZ3VhcmFudGVlZC4KKworIyBBbHNvLCB0aGlzIG1vZHVsZSBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxhdGVzdCB1cGRhdGVzIG9mCisjIHRoZSBJQk0gc3BlY2lmaWNhdGlvbiBhcyBpdCBldm9sdmVzLiAgVGhvc2UgdXBkYXRlcyB3aWxsIGJlIHRyZWF0ZWQKKyMgYXMgYnVnIGZpeGVzIChkZXZpYXRpb24gZnJvbSB0aGUgc3BlYyBpcyBhIGNvbXBhdGliaWxpdHksIHVzYWJpbGl0eQorIyBidWcpIGFuZCB3aWxsIGJlIGJhY2twb3J0ZWQuICBBdCB0aGlzIHBvaW50IHRoZSBzcGVjIGlzIHN0YWJpbGl6aW5nCisjIGFuZCB0aGUgdXBkYXRlcyBhcmUgYmVjb21pbmcgZmV3ZXIsIHNtYWxsZXIsIGFuZCBsZXNzIHNpZ25pZmljYW50LgorCisiIiIKK1RoaXMgaXMgYSBQeTIuMyBpbXBsZW1lbnRhdGlvbiBvZiBkZWNpbWFsIGZsb2F0aW5nIHBvaW50IGFyaXRobWV0aWMgYmFzZWQgb24KK3RoZSBHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBTcGVjaWZpY2F0aW9uOgorCisgICAgaHR0cDovL3NwZWxlb3Ryb3ZlLmNvbS9kZWNpbWFsL2RlY2FyaXRoLmh0bWwKKworYW5kIElFRUUgc3RhbmRhcmQgODU0LTE5ODc6CisKKyAgICB3d3cuY3MuYmVya2VsZXkuZWR1L35lanIvcHJvamVjdHMvNzU0L3ByaXZhdGUvZHJhZnRzLzg1NC0xOTg3L2Rpci5odG1sCisKK0RlY2ltYWwgZmxvYXRpbmcgcG9pbnQgaGFzIGZpbml0ZSBwcmVjaXNpb24gd2l0aCBhcmJpdHJhcmlseSBsYXJnZSBib3VuZHMuCisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgbW9kdWxlIGlzIHRvIHN1cHBvcnQgYXJpdGhtZXRpYyB1c2luZyBmYW1pbGlhcgorInNjaG9vbGhvdXNlIiBydWxlcyBhbmQgdG8gYXZvaWQgc29tZSBvZiB0aGUgdHJpY2t5IHJlcHJlc2VudGF0aW9uCitpc3N1ZXMgYXNzb2NpYXRlZCB3aXRoIGJpbmFyeSBmbG9hdGluZyBwb2ludC4gIFRoZSBwYWNrYWdlIGlzIGVzcGVjaWFsbHkKK3VzZWZ1bCBmb3IgZmluYW5jaWFsIGFwcGxpY2F0aW9ucyBvciBmb3IgY29udGV4dHMgd2hlcmUgdXNlcnMgaGF2ZQorZXhwZWN0YXRpb25zIHRoYXQgYXJlIGF0IG9kZHMgd2l0aCBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgKGZvciBpbnN0YW5jZSwKK2luIGJpbmFyeSBmbG9hdGluZyBwb2ludCwgMS4wMCAlIDAuMSBnaXZlcyAwLjA5OTk5OTk5OTk5OTk5OTk1IGluc3RlYWQKK29mIHRoZSBleHBlY3RlZCBEZWNpbWFsKCcwLjAwJykgcmV0dXJuZWQgYnkgZGVjaW1hbCBmbG9hdGluZyBwb2ludCkuCisKK0hlcmUgYXJlIHNvbWUgZXhhbXBsZXMgb2YgdXNpbmcgdGhlIGRlY2ltYWwgbW9kdWxlOgorCis+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCAqCis+Pj4gc2V0Y29udGV4dChFeHRlbmRlZENvbnRleHQpCis+Pj4gRGVjaW1hbCgwKQorRGVjaW1hbCgnMCcpCis+Pj4gRGVjaW1hbCgnMScpCitEZWNpbWFsKCcxJykKKz4+PiBEZWNpbWFsKCctLjAxMjMnKQorRGVjaW1hbCgnLTAuMDEyMycpCis+Pj4gRGVjaW1hbCgxMjM0NTYpCitEZWNpbWFsKCcxMjM0NTYnKQorPj4+IERlY2ltYWwoJzEyMy40NWUxMjM0NTY3ODkwMTIzNDU2Nzg5MCcpCitEZWNpbWFsKCcxLjIzNDVFKzEyMzQ1Njc4OTAxMjM0NTY3ODkyJykKKz4+PiBEZWNpbWFsKCcxLjMzJykgKyBEZWNpbWFsKCcxLjI3JykKK0RlY2ltYWwoJzIuNjAnKQorPj4+IERlY2ltYWwoJzEyLjM0JykgKyBEZWNpbWFsKCczLjg3JykgLSBEZWNpbWFsKCcxOC40MScpCitEZWNpbWFsKCctMi4yMCcpCis+Pj4gZGlnID0gRGVjaW1hbCgxKQorPj4+IHByaW50IGRpZyAvIERlY2ltYWwoMykKKzAuMzMzMzMzMzMzCis+Pj4gZ2V0Y29udGV4dCgpLnByZWMgPSAxOAorPj4+IHByaW50IGRpZyAvIERlY2ltYWwoMykKKzAuMzMzMzMzMzMzMzMzMzMzMzMzCis+Pj4gcHJpbnQgZGlnLnNxcnQoKQorMQorPj4+IHByaW50IERlY2ltYWwoMykuc3FydCgpCisxLjczMjA1MDgwNzU2ODg3NzI5Cis+Pj4gcHJpbnQgRGVjaW1hbCgzKSAqKiAxMjMKKzQuODUxOTI3ODA5NzY4OTY0MjdFKzU4Cis+Pj4gaW5mID0gRGVjaW1hbCgxKSAvIERlY2ltYWwoMCkKKz4+PiBwcmludCBpbmYKK0luZmluaXR5Cis+Pj4gbmVnaW5mID0gRGVjaW1hbCgtMSkgLyBEZWNpbWFsKDApCis+Pj4gcHJpbnQgbmVnaW5mCistSW5maW5pdHkKKz4+PiBwcmludCBuZWdpbmYgKyBpbmYKK05hTgorPj4+IHByaW50IG5lZ2luZiAqIGluZgorLUluZmluaXR5Cis+Pj4gcHJpbnQgZGlnIC8gMAorSW5maW5pdHkKKz4+PiBnZXRjb250ZXh0KCkudHJhcHNbRGl2aXNpb25CeVplcm9dID0gMQorPj4+IHByaW50IGRpZyAvIDAKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCisgIC4uLgorICAuLi4KK0RpdmlzaW9uQnlaZXJvOiB4IC8gMAorPj4+IGMgPSBDb250ZXh0KCkKKz4+PiBjLnRyYXBzW0ludmFsaWRPcGVyYXRpb25dID0gMAorPj4+IHByaW50IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0KKzAKKz4+PiBjLmRpdmlkZShEZWNpbWFsKDApLCBEZWNpbWFsKDApKQorRGVjaW1hbCgnTmFOJykKKz4+PiBjLnRyYXBzW0ludmFsaWRPcGVyYXRpb25dID0gMQorPj4+IHByaW50IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0KKzEKKz4+PiBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dID0gMAorPj4+IHByaW50IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0KKzAKKz4+PiBwcmludCBjLmRpdmlkZShEZWNpbWFsKDApLCBEZWNpbWFsKDApKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KKyAgLi4uCisgIC4uLgorSW52YWxpZE9wZXJhdGlvbjogMCAvIDAKKz4+PiBwcmludCBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dCisxCis+Pj4gYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDAKKz4+PiBjLnRyYXBzW0ludmFsaWRPcGVyYXRpb25dID0gMAorPj4+IHByaW50IGMuZGl2aWRlKERlY2ltYWwoMCksIERlY2ltYWwoMCkpCitOYU4KKz4+PiBwcmludCBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dCisxCis+Pj4KKyIiIgorCitfX2FsbF9fID0gWworICAgICMgVHdvIG1ham9yIGNsYXNzZXMKKyAgICAnRGVjaW1hbCcsICdDb250ZXh0JywKKworICAgICMgQ29udGV4dHMKKyAgICAnRGVmYXVsdENvbnRleHQnLCAnQmFzaWNDb250ZXh0JywgJ0V4dGVuZGVkQ29udGV4dCcsCisKKyAgICAjIEV4Y2VwdGlvbnMKKyAgICAnRGVjaW1hbEV4Y2VwdGlvbicsICdDbGFtcGVkJywgJ0ludmFsaWRPcGVyYXRpb24nLCAnRGl2aXNpb25CeVplcm8nLAorICAgICdJbmV4YWN0JywgJ1JvdW5kZWQnLCAnU3Vibm9ybWFsJywgJ092ZXJmbG93JywgJ1VuZGVyZmxvdycsCisKKyAgICAjIENvbnN0YW50cyBmb3IgdXNlIGluIHNldHRpbmcgdXAgY29udGV4dHMKKyAgICAnUk9VTkRfRE9XTicsICdST1VORF9IQUxGX1VQJywgJ1JPVU5EX0hBTEZfRVZFTicsICdST1VORF9DRUlMSU5HJywKKyAgICAnUk9VTkRfRkxPT1InLCAnUk9VTkRfVVAnLCAnUk9VTkRfSEFMRl9ET1dOJywgJ1JPVU5EXzA1VVAnLAorCisgICAgIyBGdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyBjb250ZXh0cworICAgICdzZXRjb250ZXh0JywgJ2dldGNvbnRleHQnLCAnbG9jYWxjb250ZXh0JworXQorCitfX3ZlcnNpb25fXyA9ICcxLjcwJyAgICAjIEhpZ2hlc3QgdmVyc2lvbiBvZiB0aGUgc3BlYyB0aGlzIGNvbXBsaWVzIHdpdGgKKworaW1wb3J0IGNvcHkgYXMgX2NvcHkKK2ltcG9ydCBtYXRoIGFzIF9tYXRoCitpbXBvcnQgbnVtYmVycyBhcyBfbnVtYmVycworCit0cnk6CisgICAgZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZSBhcyBfbmFtZWR0dXBsZQorICAgIERlY2ltYWxUdXBsZSA9IF9uYW1lZHR1cGxlKCdEZWNpbWFsVHVwbGUnLCAnc2lnbiBkaWdpdHMgZXhwb25lbnQnKQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIERlY2ltYWxUdXBsZSA9IGxhbWJkYSAqYXJnczogYXJncworCisjIFJvdW5kaW5nCitST1VORF9ET1dOID0gJ1JPVU5EX0RPV04nCitST1VORF9IQUxGX1VQID0gJ1JPVU5EX0hBTEZfVVAnCitST1VORF9IQUxGX0VWRU4gPSAnUk9VTkRfSEFMRl9FVkVOJworUk9VTkRfQ0VJTElORyA9ICdST1VORF9DRUlMSU5HJworUk9VTkRfRkxPT1IgPSAnUk9VTkRfRkxPT1InCitST1VORF9VUCA9ICdST1VORF9VUCcKK1JPVU5EX0hBTEZfRE9XTiA9ICdST1VORF9IQUxGX0RPV04nCitST1VORF8wNVVQID0gJ1JPVU5EXzA1VVAnCisKKyMgRXJyb3JzCisKK2NsYXNzIERlY2ltYWxFeGNlcHRpb24oQXJpdGhtZXRpY0Vycm9yKToKKyAgICAiIiJCYXNlIGV4Y2VwdGlvbiBjbGFzcy4KKworICAgIFVzZWQgZXhjZXB0aW9ucyBkZXJpdmUgZnJvbSB0aGlzLgorICAgIElmIGFuIGV4Y2VwdGlvbiBkZXJpdmVzIGZyb20gYW5vdGhlciBleGNlcHRpb24gYmVzaWRlcyB0aGlzIChzdWNoIGFzCisgICAgVW5kZXJmbG93IChJbmV4YWN0LCBSb3VuZGVkLCBTdWJub3JtYWwpIHRoYXQgaW5kaWNhdGVzIHRoYXQgaXQgaXMgb25seQorICAgIGNhbGxlZCBpZiB0aGUgb3RoZXJzIGFyZSBwcmVzZW50LiAgVGhpcyBpc24ndCBhY3R1YWxseSB1c2VkIGZvcgorICAgIGFueXRoaW5nLCB0aG91Z2guCisKKyAgICBoYW5kbGUgIC0tIENhbGxlZCB3aGVuIGNvbnRleHQuX3JhaXNlX2Vycm9yIGlzIGNhbGxlZCBhbmQgdGhlCisgICAgICAgICAgICAgICB0cmFwX2VuYWJsZXIgaXMgbm90IHNldC4gIEZpcnN0IGFyZ3VtZW50IGlzIHNlbGYsIHNlY29uZCBpcyB0aGUKKyAgICAgICAgICAgICAgIGNvbnRleHQuICBNb3JlIGFyZ3VtZW50cyBjYW4gYmUgZ2l2ZW4sIHRob3NlIGJlaW5nIGFmdGVyCisgICAgICAgICAgICAgICB0aGUgZXhwbGFuYXRpb24gaW4gX3JhaXNlX2Vycm9yIChGb3IgZXhhbXBsZSwKKyAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKE5ld0Vycm9yLCAnKC14KSEnLCBzZWxmLl9zaWduKSB3b3VsZAorICAgICAgICAgICAgICAgY2FsbCBOZXdFcnJvcigpLmhhbmRsZShjb250ZXh0LCBzZWxmLl9zaWduKS4pCisKKyAgICBUbyBkZWZpbmUgYSBuZXcgZXhjZXB0aW9uLCBpdCBzaG91bGQgYmUgc3VmZmljaWVudCB0byBoYXZlIGl0IGRlcml2ZQorICAgIGZyb20gRGVjaW1hbEV4Y2VwdGlvbi4KKyAgICAiIiIKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNvbnRleHQsICphcmdzKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIENsYW1wZWQoRGVjaW1hbEV4Y2VwdGlvbik6CisgICAgIiIiRXhwb25lbnQgb2YgYSAwIGNoYW5nZWQgdG8gZml0IGJvdW5kcy4KKworICAgIFRoaXMgb2NjdXJzIGFuZCBzaWduYWxzIGNsYW1wZWQgaWYgdGhlIGV4cG9uZW50IG9mIGEgcmVzdWx0IGhhcyBiZWVuCisgICAgYWx0ZXJlZCBpbiBvcmRlciB0byBmaXQgdGhlIGNvbnN0cmFpbnRzIG9mIGEgc3BlY2lmaWMgY29uY3JldGUKKyAgICByZXByZXNlbnRhdGlvbi4gIFRoaXMgbWF5IG9jY3VyIHdoZW4gdGhlIGV4cG9uZW50IG9mIGEgemVybyByZXN1bHQgd291bGQKKyAgICBiZSBvdXRzaWRlIHRoZSBib3VuZHMgb2YgYSByZXByZXNlbnRhdGlvbiwgb3Igd2hlbiBhIGxhcmdlIG5vcm1hbAorICAgIG51bWJlciB3b3VsZCBoYXZlIGFuIGVuY29kZWQgZXhwb25lbnQgdGhhdCBjYW5ub3QgYmUgcmVwcmVzZW50ZWQuICBJbgorICAgIHRoaXMgbGF0dGVyIGNhc2UsIHRoZSBleHBvbmVudCBpcyByZWR1Y2VkIHRvIGZpdCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBudW1iZXIgb2YgemVybyBkaWdpdHMgYXJlIGFwcGVuZGVkIHRvIHRoZSBjb2VmZmljaWVudCAoImZvbGQtZG93biIpLgorICAgICIiIgorCitjbGFzcyBJbnZhbGlkT3BlcmF0aW9uKERlY2ltYWxFeGNlcHRpb24pOgorICAgICIiIkFuIGludmFsaWQgb3BlcmF0aW9uIHdhcyBwZXJmb3JtZWQuCisKKyAgICBWYXJpb3VzIGJhZCB0aGluZ3MgY2F1c2UgdGhpczoKKworICAgIFNvbWV0aGluZyBjcmVhdGVzIGEgc2lnbmFsaW5nIE5hTgorICAgIC1JTkYgKyBJTkYKKyAgICAwICogKCstKUlORgorICAgICgrLSlJTkYgLyAoKy0pSU5GCisgICAgeCAlIDAKKyAgICAoKy0pSU5GICUgeAorICAgIHguX3Jlc2NhbGUoIG5vbi1pbnRlZ2VyICkKKyAgICBzcXJ0KC14KSAsIHggPiAwCisgICAgMCAqKiAwCisgICAgeCAqKiAobm9uLWludGVnZXIpCisgICAgeCAqKiAoKy0pSU5GCisgICAgQW4gb3BlcmFuZCBpcyBpbnZhbGlkCisKKyAgICBUaGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gYWZ0ZXIgdGhlc2UgaXMgYSBxdWlldCBwb3NpdGl2ZSBOYU4sCisgICAgZXhjZXB0IHdoZW4gdGhlIGNhdXNlIGlzIGEgc2lnbmFsaW5nIE5hTiwgaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzCisgICAgYWxzbyBhIHF1aWV0IE5hTiwgYnV0IHdpdGggdGhlIG9yaWdpbmFsIHNpZ24sIGFuZCBhbiBvcHRpb25hbAorICAgIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uCisgICAgIiIiCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCAqYXJncyk6CisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKGFyZ3NbMF0uX3NpZ24sIGFyZ3NbMF0uX2ludCwgJ24nLCBUcnVlKQorICAgICAgICAgICAgcmV0dXJuIGFucy5fZml4X25hbihjb250ZXh0KQorICAgICAgICByZXR1cm4gX05hTgorCitjbGFzcyBDb252ZXJzaW9uU3ludGF4KEludmFsaWRPcGVyYXRpb24pOgorICAgICIiIlRyeWluZyB0byBjb252ZXJ0IGJhZGx5IGZvcm1lZCBzdHJpbmcuCisKKyAgICBUaGlzIG9jY3VycyBhbmQgc2lnbmFscyBpbnZhbGlkLW9wZXJhdGlvbiBpZiBhbiBzdHJpbmcgaXMgYmVpbmcKKyAgICBjb252ZXJ0ZWQgdG8gYSBudW1iZXIgYW5kIGl0IGRvZXMgbm90IGNvbmZvcm0gdG8gdGhlIG51bWVyaWMgc3RyaW5nCisgICAgc3ludGF4LiAgVGhlIHJlc3VsdCBpcyBbMCxxTmFOXS4KKyAgICAiIiIKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNvbnRleHQsICphcmdzKToKKyAgICAgICAgcmV0dXJuIF9OYU4KKworY2xhc3MgRGl2aXNpb25CeVplcm8oRGVjaW1hbEV4Y2VwdGlvbiwgWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICIiIkRpdmlzaW9uIGJ5IDAuCisKKyAgICBUaGlzIG9jY3VycyBhbmQgc2lnbmFscyBkaXZpc2lvbi1ieS16ZXJvIGlmIGRpdmlzaW9uIG9mIGEgZmluaXRlIG51bWJlcgorICAgIGJ5IHplcm8gd2FzIGF0dGVtcHRlZCAoZHVyaW5nIGEgZGl2aWRlLWludGVnZXIgb3IgZGl2aWRlIG9wZXJhdGlvbiwgb3IgYQorICAgIHBvd2VyIG9wZXJhdGlvbiB3aXRoIG5lZ2F0aXZlIHJpZ2h0LWhhbmQgb3BlcmFuZCksIGFuZCB0aGUgZGl2aWRlbmQgd2FzCisgICAgbm90IHplcm8uCisKKyAgICBUaGUgcmVzdWx0IG9mIHRoZSBvcGVyYXRpb24gaXMgW3NpZ24saW5mXSwgd2hlcmUgc2lnbiBpcyB0aGUgZXhjbHVzaXZlCisgICAgb3Igb2YgdGhlIHNpZ25zIG9mIHRoZSBvcGVyYW5kcyBmb3IgZGl2aWRlLCBvciBpcyAxIGZvciBhbiBvZGQgcG93ZXIgb2YKKyAgICAtMCwgZm9yIHBvd2VyLgorICAgICIiIgorCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCBzaWduLCAqYXJncyk6CisgICAgICAgIHJldHVybiBfU2lnbmVkSW5maW5pdHlbc2lnbl0KKworY2xhc3MgRGl2aXNpb25JbXBvc3NpYmxlKEludmFsaWRPcGVyYXRpb24pOgorICAgICIiIkNhbm5vdCBwZXJmb3JtIHRoZSBkaXZpc2lvbiBhZGVxdWF0ZWx5LgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgaW52YWxpZC1vcGVyYXRpb24gaWYgdGhlIGludGVnZXIgcmVzdWx0IG9mIGEKKyAgICBkaXZpZGUtaW50ZWdlciBvciByZW1haW5kZXIgb3BlcmF0aW9uIGhhZCB0b28gbWFueSBkaWdpdHMgKHdvdWxkIGJlCisgICAgbG9uZ2VyIHRoYW4gcHJlY2lzaW9uKS4gIFRoZSByZXN1bHQgaXMgWzAscU5hTl0uCisgICAgIiIiCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNvbnRleHQsICphcmdzKToKKyAgICAgICAgcmV0dXJuIF9OYU4KKworY2xhc3MgRGl2aXNpb25VbmRlZmluZWQoSW52YWxpZE9wZXJhdGlvbiwgWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICIiIlVuZGVmaW5lZCByZXN1bHQgb2YgZGl2aXNpb24uCisKKyAgICBUaGlzIG9jY3VycyBhbmQgc2lnbmFscyBpbnZhbGlkLW9wZXJhdGlvbiBpZiBkaXZpc2lvbiBieSB6ZXJvIHdhcworICAgIGF0dGVtcHRlZCAoZHVyaW5nIGEgZGl2aWRlLWludGVnZXIsIGRpdmlkZSwgb3IgcmVtYWluZGVyIG9wZXJhdGlvbiksIGFuZAorICAgIHRoZSBkaXZpZGVuZCBpcyBhbHNvIHplcm8uICBUaGUgcmVzdWx0IGlzIFswLHFOYU5dLgorICAgICIiIgorCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCAqYXJncyk6CisgICAgICAgIHJldHVybiBfTmFOCisKK2NsYXNzIEluZXhhY3QoRGVjaW1hbEV4Y2VwdGlvbik6CisgICAgIiIiSGFkIHRvIHJvdW5kLCBsb3NpbmcgaW5mb3JtYXRpb24uCisKKyAgICBUaGlzIG9jY3VycyBhbmQgc2lnbmFscyBpbmV4YWN0IHdoZW5ldmVyIHRoZSByZXN1bHQgb2YgYW4gb3BlcmF0aW9uIGlzCisgICAgbm90IGV4YWN0ICh0aGF0IGlzLCBpdCBuZWVkZWQgdG8gYmUgcm91bmRlZCBhbmQgYW55IGRpc2NhcmRlZCBkaWdpdHMKKyAgICB3ZXJlIG5vbi16ZXJvKSwgb3IgaWYgYW4gb3ZlcmZsb3cgb3IgdW5kZXJmbG93IGNvbmRpdGlvbiBvY2N1cnMuICBUaGUKKyAgICByZXN1bHQgaW4gYWxsIGNhc2VzIGlzIHVuY2hhbmdlZC4KKworICAgIFRoZSBpbmV4YWN0IHNpZ25hbCBtYXkgYmUgdGVzdGVkIChvciB0cmFwcGVkKSB0byBkZXRlcm1pbmUgaWYgYSBnaXZlbgorICAgIG9wZXJhdGlvbiAob3Igc2VxdWVuY2Ugb2Ygb3BlcmF0aW9ucykgd2FzIGluZXhhY3QuCisgICAgIiIiCisKK2NsYXNzIEludmFsaWRDb250ZXh0KEludmFsaWRPcGVyYXRpb24pOgorICAgICIiIkludmFsaWQgY29udGV4dC4gIFVua25vd24gcm91bmRpbmcsIGZvciBleGFtcGxlLgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgaW52YWxpZC1vcGVyYXRpb24gaWYgYW4gaW52YWxpZCBjb250ZXh0IHdhcworICAgIGRldGVjdGVkIGR1cmluZyBhbiBvcGVyYXRpb24uICBUaGlzIGNhbiBvY2N1ciBpZiBjb250ZXh0cyBhcmUgbm90IGNoZWNrZWQKKyAgICBvbiBjcmVhdGlvbiBhbmQgZWl0aGVyIHRoZSBwcmVjaXNpb24gZXhjZWVkcyB0aGUgY2FwYWJpbGl0eSBvZiB0aGUKKyAgICB1bmRlcmx5aW5nIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9uIG9yIGFuIHVua25vd24gb3IgdW5zdXBwb3J0ZWQgcm91bmRpbmcKKyAgICB3YXMgc3BlY2lmaWVkLiAgVGhlc2UgYXNwZWN0cyBvZiB0aGUgY29udGV4dCBuZWVkIG9ubHkgYmUgY2hlY2tlZCB3aGVuCisgICAgdGhlIHZhbHVlcyBhcmUgcmVxdWlyZWQgdG8gYmUgdXNlZC4gIFRoZSByZXN1bHQgaXMgWzAscU5hTl0uCisgICAgIiIiCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGNvbnRleHQsICphcmdzKToKKyAgICAgICAgcmV0dXJuIF9OYU4KKworY2xhc3MgUm91bmRlZChEZWNpbWFsRXhjZXB0aW9uKToKKyAgICAiIiJOdW1iZXIgZ290IHJvdW5kZWQgKG5vdCAgbmVjZXNzYXJpbHkgY2hhbmdlZCBkdXJpbmcgcm91bmRpbmcpLgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgcm91bmRlZCB3aGVuZXZlciB0aGUgcmVzdWx0IG9mIGFuIG9wZXJhdGlvbiBpcworICAgIHJvdW5kZWQgKHRoYXQgaXMsIHNvbWUgemVybyBvciBub24temVybyBkaWdpdHMgd2VyZSBkaXNjYXJkZWQgZnJvbSB0aGUKKyAgICBjb2VmZmljaWVudCksIG9yIGlmIGFuIG92ZXJmbG93IG9yIHVuZGVyZmxvdyBjb25kaXRpb24gb2NjdXJzLiAgVGhlCisgICAgcmVzdWx0IGluIGFsbCBjYXNlcyBpcyB1bmNoYW5nZWQuCisKKyAgICBUaGUgcm91bmRlZCBzaWduYWwgbWF5IGJlIHRlc3RlZCAob3IgdHJhcHBlZCkgdG8gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4KKyAgICBvcGVyYXRpb24gKG9yIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMpIGNhdXNlZCBhIGxvc3Mgb2YgcHJlY2lzaW9uLgorICAgICIiIgorCitjbGFzcyBTdWJub3JtYWwoRGVjaW1hbEV4Y2VwdGlvbik6CisgICAgIiIiRXhwb25lbnQgPCBFbWluIGJlZm9yZSByb3VuZGluZy4KKworICAgIFRoaXMgb2NjdXJzIGFuZCBzaWduYWxzIHN1Ym5vcm1hbCB3aGVuZXZlciB0aGUgcmVzdWx0IG9mIGEgY29udmVyc2lvbiBvcgorICAgIG9wZXJhdGlvbiBpcyBzdWJub3JtYWwgKHRoYXQgaXMsIGl0cyBhZGp1c3RlZCBleHBvbmVudCBpcyBsZXNzIHRoYW4KKyAgICBFbWluLCBiZWZvcmUgYW55IHJvdW5kaW5nKS4gIFRoZSByZXN1bHQgaW4gYWxsIGNhc2VzIGlzIHVuY2hhbmdlZC4KKworICAgIFRoZSBzdWJub3JtYWwgc2lnbmFsIG1heSBiZSB0ZXN0ZWQgKG9yIHRyYXBwZWQpIHRvIGRldGVybWluZSBpZiBhIGdpdmVuCisgICAgb3Igb3BlcmF0aW9uIChvciBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zKSB5aWVsZGVkIGEgc3Vibm9ybWFsIHJlc3VsdC4KKyAgICAiIiIKKworY2xhc3MgT3ZlcmZsb3coSW5leGFjdCwgUm91bmRlZCk6CisgICAgIiIiTnVtZXJpY2FsIG92ZXJmbG93LgorCisgICAgVGhpcyBvY2N1cnMgYW5kIHNpZ25hbHMgb3ZlcmZsb3cgaWYgdGhlIGFkanVzdGVkIGV4cG9uZW50IG9mIGEgcmVzdWx0CisgICAgKGZyb20gYSBjb252ZXJzaW9uIG9yIGZyb20gYW4gb3BlcmF0aW9uIHRoYXQgaXMgbm90IGFuIGF0dGVtcHQgdG8gZGl2aWRlCisgICAgYnkgemVybyksIGFmdGVyIHJvdW5kaW5nLCB3b3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIGxhcmdlc3QgdmFsdWUgdGhhdAorICAgIGNhbiBiZSBoYW5kbGVkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiAodGhlIHZhbHVlIEVtYXgpLgorCisgICAgVGhlIHJlc3VsdCBkZXBlbmRzIG9uIHRoZSByb3VuZGluZyBtb2RlOgorCisgICAgRm9yIHJvdW5kLWhhbGYtdXAgYW5kIHJvdW5kLWhhbGYtZXZlbiAoYW5kIGZvciByb3VuZC1oYWxmLWRvd24gYW5kCisgICAgcm91bmQtdXAsIGlmIGltcGxlbWVudGVkKSwgdGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIGlzIFtzaWduLGluZl0sCisgICAgd2hlcmUgc2lnbiBpcyB0aGUgc2lnbiBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdC4gIEZvciByb3VuZC1kb3duLCB0aGUKKyAgICByZXN1bHQgaXMgdGhlIGxhcmdlc3QgZmluaXRlIG51bWJlciB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBpbiB0aGUKKyAgICBjdXJyZW50IHByZWNpc2lvbiwgd2l0aCB0aGUgc2lnbiBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdC4gIEZvcgorICAgIHJvdW5kLWNlaWxpbmcsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgZm9yIHJvdW5kLWRvd24gaWYgdGhlIHNpZ24gb2YKKyAgICB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdCBpcyAxLCBvciBpcyBbMCxpbmZdIG90aGVyd2lzZS4gIEZvciByb3VuZC1mbG9vciwKKyAgICB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lIGFzIGZvciByb3VuZC1kb3duIGlmIHRoZSBzaWduIG9mIHRoZSBpbnRlcm1lZGlhdGUKKyAgICByZXN1bHQgaXMgMCwgb3IgaXMgWzEsaW5mXSBvdGhlcndpc2UuICBJbiBhbGwgY2FzZXMsIEluZXhhY3QgYW5kIFJvdW5kZWQKKyAgICB3aWxsIGFsc28gYmUgcmFpc2VkLgorICAgICIiIgorCisgICAgZGVmIGhhbmRsZShzZWxmLCBjb250ZXh0LCBzaWduLCAqYXJncyk6CisgICAgICAgIGlmIGNvbnRleHQucm91bmRpbmcgaW4gKFJPVU5EX0hBTEZfVVAsIFJPVU5EX0hBTEZfRVZFTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk9VTkRfSEFMRl9ET1dOLCBST1VORF9VUCk6CisgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3NpZ25dCisgICAgICAgIGlmIHNpZ24gPT0gMDoKKyAgICAgICAgICAgIGlmIGNvbnRleHQucm91bmRpbmcgPT0gUk9VTkRfQ0VJTElORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3NpZ25dCisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzaWduLCAnOScqY29udGV4dC5wcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuRW1heC1jb250ZXh0LnByZWMrMSkKKyAgICAgICAgaWYgc2lnbiA9PSAxOgorICAgICAgICAgICAgaWYgY29udGV4dC5yb3VuZGluZyA9PSBST1VORF9GTE9PUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3NpZ25dCisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzaWduLCAnOScqY29udGV4dC5wcmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LkVtYXgtY29udGV4dC5wcmVjKzEpCisKKworY2xhc3MgVW5kZXJmbG93KEluZXhhY3QsIFJvdW5kZWQsIFN1Ym5vcm1hbCk6CisgICAgIiIiTnVtZXJpY2FsIHVuZGVyZmxvdyB3aXRoIHJlc3VsdCByb3VuZGVkIHRvIDAuCisKKyAgICBUaGlzIG9jY3VycyBhbmQgc2lnbmFscyB1bmRlcmZsb3cgaWYgYSByZXN1bHQgaXMgaW5leGFjdCBhbmQgdGhlCisgICAgYWRqdXN0ZWQgZXhwb25lbnQgb2YgdGhlIHJlc3VsdCB3b3VsZCBiZSBzbWFsbGVyIChtb3JlIG5lZ2F0aXZlKSB0aGFuCisgICAgdGhlIHNtYWxsZXN0IHZhbHVlIHRoYXQgY2FuIGJlIGhhbmRsZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uICh0aGUgdmFsdWUKKyAgICBFbWluKS4gIFRoYXQgaXMsIHRoZSByZXN1bHQgaXMgYm90aCBpbmV4YWN0IGFuZCBzdWJub3JtYWwuCisKKyAgICBUaGUgcmVzdWx0IGFmdGVyIGFuIHVuZGVyZmxvdyB3aWxsIGJlIGEgc3Vibm9ybWFsIG51bWJlciByb3VuZGVkLCBpZgorICAgIG5lY2Vzc2FyeSwgc28gdGhhdCBpdHMgZXhwb25lbnQgaXMgbm90IGxlc3MgdGhhbiBFdGlueS4gIFRoaXMgbWF5IHJlc3VsdAorICAgIGluIDAgd2l0aCB0aGUgc2lnbiBvZiB0aGUgaW50ZXJtZWRpYXRlIHJlc3VsdCBhbmQgYW4gZXhwb25lbnQgb2YgRXRpbnkuCisKKyAgICBJbiBhbGwgY2FzZXMsIEluZXhhY3QsIFJvdW5kZWQsIGFuZCBTdWJub3JtYWwgd2lsbCBhbHNvIGJlIHJhaXNlZC4KKyAgICAiIiIKKworIyBMaXN0IG9mIHB1YmxpYyB0cmFwcyBhbmQgZmxhZ3MKK19zaWduYWxzID0gW0NsYW1wZWQsIERpdmlzaW9uQnlaZXJvLCBJbmV4YWN0LCBPdmVyZmxvdywgUm91bmRlZCwKKyAgICAgICAgICAgVW5kZXJmbG93LCBJbnZhbGlkT3BlcmF0aW9uLCBTdWJub3JtYWxdCisKKyMgTWFwIGNvbmRpdGlvbnMgKHBlciB0aGUgc3BlYykgdG8gc2lnbmFscworX2NvbmRpdGlvbl9tYXAgPSB7Q29udmVyc2lvblN5bnRheDpJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgRGl2aXNpb25JbXBvc3NpYmxlOkludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICBEaXZpc2lvblVuZGVmaW5lZDpJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgSW52YWxpZENvbnRleHQ6SW52YWxpZE9wZXJhdGlvbn0KKworIyMjIyMgQ29udGV4dCBGdW5jdGlvbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBUaGUgZ2V0Y29udGV4dCgpIGFuZCBzZXRjb250ZXh0KCkgZnVuY3Rpb24gbWFuYWdlIGFjY2VzcyB0byBhIHRocmVhZC1sb2NhbAorIyBjdXJyZW50IGNvbnRleHQuICBQeTIuNCBvZmZlcnMgZGlyZWN0IHN1cHBvcnQgZm9yIHRocmVhZCBsb2NhbHMuICBJZiB0aGF0CisjIGlzIG5vdCBhdmFpbGFibGUsIHVzZSB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpIHdoaWNoIGlzIHNsb3dlciBidXQgd2lsbAorIyB3b3JrIGZvciBvbGRlciBQeXRob25zLiAgSWYgdGhyZWFkcyBhcmUgbm90IHBhcnQgb2YgdGhlIGJ1aWxkLCBjcmVhdGUgYQorIyBtb2NrIHRocmVhZGluZyBvYmplY3Qgd2l0aCB0aHJlYWRpbmcubG9jYWwoKSByZXR1cm5pbmcgdGhlIG1vZHVsZSBuYW1lc3BhY2UuCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBQeXRob24gd2FzIGNvbXBpbGVkIHdpdGhvdXQgdGhyZWFkczsgY3JlYXRlIGEgbW9jayBvYmplY3QgaW5zdGVhZAorICAgIGltcG9ydCBzeXMKKyAgICBjbGFzcyBNb2NrVGhyZWFkaW5nKG9iamVjdCk6CisgICAgICAgIGRlZiBsb2NhbChzZWxmLCBzeXM9c3lzKToKKyAgICAgICAgICAgIHJldHVybiBzeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICB0aHJlYWRpbmcgPSBNb2NrVGhyZWFkaW5nKCkKKyAgICBkZWwgc3lzLCBNb2NrVGhyZWFkaW5nCisKK3RyeToKKyAgICB0aHJlYWRpbmcubG9jYWwKKworZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorCisgICAgIyBUbyBmaXggcmVsb2FkaW5nLCBmb3JjZSBpdCB0byBjcmVhdGUgYSBuZXcgY29udGV4dAorICAgICMgT2xkIGNvbnRleHRzIGhhdmUgZGlmZmVyZW50IGV4Y2VwdGlvbnMgaW4gdGhlaXIgZGljdHMsIG1ha2luZyBwcm9ibGVtcy4KKyAgICBpZiBoYXNhdHRyKHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCksICdfX2RlY2ltYWxfY29udGV4dF9fJyk6CisgICAgICAgIGRlbCB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLl9fZGVjaW1hbF9jb250ZXh0X18KKworICAgIGRlZiBzZXRjb250ZXh0KGNvbnRleHQpOgorICAgICAgICAiIiJTZXQgdGhpcyB0aHJlYWQncyBjb250ZXh0IHRvIGNvbnRleHQuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaW4gKERlZmF1bHRDb250ZXh0LCBCYXNpY0NvbnRleHQsIEV4dGVuZGVkQ29udGV4dCk6CisgICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb3B5KCkKKyAgICAgICAgICAgIGNvbnRleHQuY2xlYXJfZmxhZ3MoKQorICAgICAgICB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLl9fZGVjaW1hbF9jb250ZXh0X18gPSBjb250ZXh0CisKKyAgICBkZWYgZ2V0Y29udGV4dCgpOgorICAgICAgICAiIiJSZXR1cm5zIHRoaXMgdGhyZWFkJ3MgY29udGV4dC4KKworICAgICAgICBJZiB0aGlzIHRocmVhZCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGNvbnRleHQsIHJldHVybnMKKyAgICAgICAgYSBuZXcgY29udGV4dCBhbmQgc2V0cyB0aGlzIHRocmVhZCdzIGNvbnRleHQuCisgICAgICAgIE5ldyBjb250ZXh0cyBhcmUgY29waWVzIG9mIERlZmF1bHRDb250ZXh0LgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCkuX19kZWNpbWFsX2NvbnRleHRfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBjb250ZXh0ID0gQ29udGV4dCgpCisgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLl9fZGVjaW1hbF9jb250ZXh0X18gPSBjb250ZXh0CisgICAgICAgICAgICByZXR1cm4gY29udGV4dAorCitlbHNlOgorCisgICAgbG9jYWwgPSB0aHJlYWRpbmcubG9jYWwoKQorICAgIGlmIGhhc2F0dHIobG9jYWwsICdfX2RlY2ltYWxfY29udGV4dF9fJyk6CisgICAgICAgIGRlbCBsb2NhbC5fX2RlY2ltYWxfY29udGV4dF9fCisKKyAgICBkZWYgZ2V0Y29udGV4dChfbG9jYWw9bG9jYWwpOgorICAgICAgICAiIiJSZXR1cm5zIHRoaXMgdGhyZWFkJ3MgY29udGV4dC4KKworICAgICAgICBJZiB0aGlzIHRocmVhZCBkb2VzIG5vdCB5ZXQgaGF2ZSBhIGNvbnRleHQsIHJldHVybnMKKyAgICAgICAgYSBuZXcgY29udGV4dCBhbmQgc2V0cyB0aGlzIHRocmVhZCdzIGNvbnRleHQuCisgICAgICAgIE5ldyBjb250ZXh0cyBhcmUgY29waWVzIG9mIERlZmF1bHRDb250ZXh0LgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIF9sb2NhbC5fX2RlY2ltYWxfY29udGV4dF9fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGNvbnRleHQgPSBDb250ZXh0KCkKKyAgICAgICAgICAgIF9sb2NhbC5fX2RlY2ltYWxfY29udGV4dF9fID0gY29udGV4dAorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQKKworICAgIGRlZiBzZXRjb250ZXh0KGNvbnRleHQsIF9sb2NhbD1sb2NhbCk6CisgICAgICAgICIiIlNldCB0aGlzIHRocmVhZCdzIGNvbnRleHQgdG8gY29udGV4dC4iIiIKKyAgICAgICAgaWYgY29udGV4dCBpbiAoRGVmYXVsdENvbnRleHQsIEJhc2ljQ29udGV4dCwgRXh0ZW5kZWRDb250ZXh0KToKKyAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNvcHkoKQorICAgICAgICAgICAgY29udGV4dC5jbGVhcl9mbGFncygpCisgICAgICAgIF9sb2NhbC5fX2RlY2ltYWxfY29udGV4dF9fID0gY29udGV4dAorCisgICAgZGVsIHRocmVhZGluZywgbG9jYWwgICAgICAgICMgRG9uJ3QgY29udGFtaW5hdGUgdGhlIG5hbWVzcGFjZQorCitkZWYgbG9jYWxjb250ZXh0KGN0eD1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBjb250ZXh0IG1hbmFnZXIgZm9yIGEgY29weSBvZiB0aGUgc3VwcGxpZWQgY29udGV4dAorCisgICAgVXNlcyBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgY29udGV4dCBpZiBubyBjb250ZXh0IGlzIHNwZWNpZmllZAorICAgIFRoZSByZXR1cm5lZCBjb250ZXh0IG1hbmFnZXIgY3JlYXRlcyBhIGxvY2FsIGRlY2ltYWwgY29udGV4dAorICAgIGluIGEgd2l0aCBzdGF0ZW1lbnQ6CisgICAgICAgIGRlZiBzaW4oeCk6CisgICAgICAgICAgICAgd2l0aCBsb2NhbGNvbnRleHQoKSBhcyBjdHg6CisgICAgICAgICAgICAgICAgIGN0eC5wcmVjICs9IDIKKyAgICAgICAgICAgICAgICAgIyBSZXN0IG9mIHNpbiBjYWxjdWxhdGlvbiBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgIyB1c2VzIGEgcHJlY2lzaW9uIDIgZ3JlYXRlciB0aGFuIG5vcm1hbAorICAgICAgICAgICAgIHJldHVybiArcyAgIyBDb252ZXJ0IHJlc3VsdCB0byBub3JtYWwgcHJlY2lzaW9uCisKKyAgICAgICAgIGRlZiBzaW4oeCk6CisgICAgICAgICAgICAgd2l0aCBsb2NhbGNvbnRleHQoRXh0ZW5kZWRDb250ZXh0KToKKyAgICAgICAgICAgICAgICAgIyBSZXN0IG9mIHNpbiBjYWxjdWxhdGlvbiBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAgIyB1c2VzIHRoZSBFeHRlbmRlZCBDb250ZXh0IGZyb20gdGhlCisgICAgICAgICAgICAgICAgICMgR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgU3BlY2lmaWNhdGlvbgorICAgICAgICAgICAgIHJldHVybiArcyAgIyBDb252ZXJ0IHJlc3VsdCB0byBub3JtYWwgY29udGV4dAorCisgICAgPj4+IHNldGNvbnRleHQoRGVmYXVsdENvbnRleHQpCisgICAgPj4+IHByaW50IGdldGNvbnRleHQoKS5wcmVjCisgICAgMjgKKyAgICA+Pj4gd2l0aCBsb2NhbGNvbnRleHQoKToKKyAgICAuLi4gICAgIGN0eCA9IGdldGNvbnRleHQoKQorICAgIC4uLiAgICAgY3R4LnByZWMgKz0gMgorICAgIC4uLiAgICAgcHJpbnQgY3R4LnByZWMKKyAgICAuLi4KKyAgICAzMAorICAgID4+PiB3aXRoIGxvY2FsY29udGV4dChFeHRlbmRlZENvbnRleHQpOgorICAgIC4uLiAgICAgcHJpbnQgZ2V0Y29udGV4dCgpLnByZWMKKyAgICAuLi4KKyAgICA5CisgICAgPj4+IHByaW50IGdldGNvbnRleHQoKS5wcmVjCisgICAgMjgKKyAgICAiIiIKKyAgICBpZiBjdHggaXMgTm9uZTogY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgcmV0dXJuIF9Db250ZXh0TWFuYWdlcihjdHgpCisKKworIyMjIyMgRGVjaW1hbCBjbGFzcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIERlY2ltYWwob2JqZWN0KToKKyAgICAiIiJGbG9hdGluZyBwb2ludCBjbGFzcyBmb3IgZGVjaW1hbCBhcml0aG1ldGljLiIiIgorCisgICAgX19zbG90c19fID0gKCdfZXhwJywnX2ludCcsJ19zaWduJywgJ19pc19zcGVjaWFsJykKKyAgICAjIEdlbmVyYWxseSwgdGhlIHZhbHVlIG9mIHRoZSBEZWNpbWFsIGluc3RhbmNlIGlzIGdpdmVuIGJ5CisgICAgIyAgKC0xKSoqX3NpZ24gKiBfaW50ICogMTAqKl9leHAKKyAgICAjIFNwZWNpYWwgdmFsdWVzIGFyZSBzaWduaWZpZWQgYnkgX2lzX3NwZWNpYWwgPT0gVHJ1ZQorCisgICAgIyBXZSdyZSBpbW11dGFibGUsIHNvIHVzZSBfX25ld19fIG5vdCBfX2luaXRfXworICAgIGRlZiBfX25ld19fKGNscywgdmFsdWU9IjAiLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJDcmVhdGUgYSBkZWNpbWFsIHBvaW50IGluc3RhbmNlLgorCisgICAgICAgID4+PiBEZWNpbWFsKCczLjE0JykgICAgICAgICAgICAgICMgc3RyaW5nIGlucHV0CisgICAgICAgIERlY2ltYWwoJzMuMTQnKQorICAgICAgICA+Pj4gRGVjaW1hbCgoMCwgKDMsIDEsIDQpLCAtMikpICAjIHR1cGxlIChzaWduLCBkaWdpdF90dXBsZSwgZXhwb25lbnQpCisgICAgICAgIERlY2ltYWwoJzMuMTQnKQorICAgICAgICA+Pj4gRGVjaW1hbCgzMTQpICAgICAgICAgICAgICAgICAjIGludCBvciBsb25nCisgICAgICAgIERlY2ltYWwoJzMxNCcpCisgICAgICAgID4+PiBEZWNpbWFsKERlY2ltYWwoMzE0KSkgICAgICAgICMgYW5vdGhlciBkZWNpbWFsIGluc3RhbmNlCisgICAgICAgIERlY2ltYWwoJzMxNCcpCisgICAgICAgID4+PiBEZWNpbWFsKCcgIDMuMTQgIFxcbicpICAgICAgICAjIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2Ugb2theQorICAgICAgICBEZWNpbWFsKCczLjE0JykKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlIGNvZWZmaWNpZW50LCBzZWxmLl9pbnQsIGlzIGFjdHVhbGx5IHN0b3JlZCBhcworICAgICAgICAjIGEgc3RyaW5nIHJhdGhlciB0aGFuIGFzIGEgdHVwbGUgb2YgZGlnaXRzLiAgVGhpcyBzcGVlZHMgdXAKKyAgICAgICAgIyB0aGUgImRpZ2l0cyB0byBpbnRlZ2VyIiBhbmQgImludGVnZXIgdG8gZGlnaXRzIiBjb252ZXJzaW9ucworICAgICAgICAjIHRoYXQgYXJlIHVzZWQgaW4gYWxtb3N0IGV2ZXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9uIG9uCisgICAgICAgICMgRGVjaW1hbHMuICBUaGlzIGlzIGFuIGludGVybmFsIGRldGFpbDogdGhlIGFzX3R1cGxlIGZ1bmN0aW9uCisgICAgICAgICMgYW5kIHRoZSBEZWNpbWFsIGNvbnN0cnVjdG9yIHN0aWxsIGRlYWwgd2l0aCB0dXBsZXMgb2YKKyAgICAgICAgIyBkaWdpdHMuCisKKyAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscykKKworICAgICAgICAjIEZyb20gYSBzdHJpbmcKKyAgICAgICAgIyBSRXMgaW5zaXN0IG9uIHJlYWwgc3RyaW5ncywgc28gd2UgY2FuIHRvby4KKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBtID0gX3BhcnNlcih2YWx1ZS5zdHJpcCgpKQorICAgICAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihDb252ZXJzaW9uU3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBsaXRlcmFsIGZvciBEZWNpbWFsOiAlciIgJSB2YWx1ZSkKKworICAgICAgICAgICAgaWYgbS5ncm91cCgnc2lnbicpID09ICItIjoKKyAgICAgICAgICAgICAgICBzZWxmLl9zaWduID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9zaWduID0gMAorICAgICAgICAgICAgaW50cGFydCA9IG0uZ3JvdXAoJ2ludCcpCisgICAgICAgICAgICBpZiBpbnRwYXJ0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgZmluaXRlIG51bWJlcgorICAgICAgICAgICAgICAgIGZyYWNwYXJ0ID0gbS5ncm91cCgnZnJhYycpIG9yICcnCisgICAgICAgICAgICAgICAgZXhwID0gaW50KG0uZ3JvdXAoJ2V4cCcpIG9yICcwJykKKyAgICAgICAgICAgICAgICBzZWxmLl9pbnQgPSBzdHIoaW50KGludHBhcnQrZnJhY3BhcnQpKQorICAgICAgICAgICAgICAgIHNlbGYuX2V4cCA9IGV4cCAtIGxlbihmcmFjcGFydCkKKyAgICAgICAgICAgICAgICBzZWxmLl9pc19zcGVjaWFsID0gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGlhZyA9IG0uZ3JvdXAoJ2RpYWcnKQorICAgICAgICAgICAgICAgIGlmIGRpYWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgTmFOCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ludCA9IHN0cihpbnQoZGlhZyBvciAnMCcpKS5sc3RyaXAoJzAnKQorICAgICAgICAgICAgICAgICAgICBpZiBtLmdyb3VwKCdzaWduYWwnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cCA9ICdOJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwID0gJ24nCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBpbmZpbml0eQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnQgPSAnMCcKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwID0gJ0YnCisgICAgICAgICAgICAgICAgc2VsZi5faXNfc3BlY2lhbCA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgIyBGcm9tIGFuIGludGVnZXIKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGludCxsb25nKSk6CisgICAgICAgICAgICBpZiB2YWx1ZSA+PSAwOgorICAgICAgICAgICAgICAgIHNlbGYuX3NpZ24gPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3NpZ24gPSAxCisgICAgICAgICAgICBzZWxmLl9leHAgPSAwCisgICAgICAgICAgICBzZWxmLl9pbnQgPSBzdHIoYWJzKHZhbHVlKSkKKyAgICAgICAgICAgIHNlbGYuX2lzX3NwZWNpYWwgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAjIEZyb20gYW5vdGhlciBkZWNpbWFsCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIERlY2ltYWwpOgorICAgICAgICAgICAgc2VsZi5fZXhwICA9IHZhbHVlLl9leHAKKyAgICAgICAgICAgIHNlbGYuX3NpZ24gPSB2YWx1ZS5fc2lnbgorICAgICAgICAgICAgc2VsZi5faW50ICA9IHZhbHVlLl9pbnQKKyAgICAgICAgICAgIHNlbGYuX2lzX3NwZWNpYWwgID0gdmFsdWUuX2lzX3NwZWNpYWwKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgIyBGcm9tIGFuIGludGVybmFsIHdvcmtpbmcgdmFsdWUKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgX1dvcmtSZXApOgorICAgICAgICAgICAgc2VsZi5fc2lnbiA9IHZhbHVlLnNpZ24KKyAgICAgICAgICAgIHNlbGYuX2ludCA9IHN0cih2YWx1ZS5pbnQpCisgICAgICAgICAgICBzZWxmLl9leHAgPSBpbnQodmFsdWUuZXhwKQorICAgICAgICAgICAgc2VsZi5faXNfc3BlY2lhbCA9IEZhbHNlCisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICMgdHVwbGUvbGlzdCBjb252ZXJzaW9uIChwb3NzaWJseSBmcm9tIGFzX3R1cGxlKCkpCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LHR1cGxlKSk6CisgICAgICAgICAgICBpZiBsZW4odmFsdWUpICE9IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCB0dXBsZSBzaXplIGluIGNyZWF0aW9uIG9mIERlY2ltYWwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gbGlzdCBvciB0dXBsZS4gIFRoZSBsaXN0IG9yIHR1cGxlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaG91bGQgaGF2ZSBleGFjdGx5IHRocmVlIGVsZW1lbnRzLicpCisgICAgICAgICAgICAjIHByb2Nlc3Mgc2lnbi4gIFRoZSBpc2luc3RhbmNlIHRlc3QgcmVqZWN0cyBmbG9hdHMKKyAgICAgICAgICAgIGlmIG5vdCAoaXNpbnN0YW5jZSh2YWx1ZVswXSwgKGludCwgbG9uZykpIGFuZCB2YWx1ZVswXSBpbiAoMCwxKSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBzaWduLiAgVGhlIGZpcnN0IHZhbHVlIGluIHRoZSB0dXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGJlIGFuIGludGVnZXI7IGVpdGhlciAwIGZvciBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3NpdGl2ZSBudW1iZXIgb3IgMSBmb3IgYSBuZWdhdGl2ZSBudW1iZXIuIikKKyAgICAgICAgICAgIHNlbGYuX3NpZ24gPSB2YWx1ZVswXQorICAgICAgICAgICAgaWYgdmFsdWVbMl0gPT0gJ0YnOgorICAgICAgICAgICAgICAgICMgaW5maW5pdHk6IHZhbHVlWzFdIGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICBzZWxmLl9pbnQgPSAnMCcKKyAgICAgICAgICAgICAgICBzZWxmLl9leHAgPSB2YWx1ZVsyXQorICAgICAgICAgICAgICAgIHNlbGYuX2lzX3NwZWNpYWwgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgcHJvY2VzcyBhbmQgdmFsaWRhdGUgdGhlIGRpZ2l0cyBpbiB2YWx1ZVsxXQorICAgICAgICAgICAgICAgIGRpZ2l0cyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGRpZ2l0IGluIHZhbHVlWzFdOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGRpZ2l0LCAoaW50LCBsb25nKSkgYW5kIDAgPD0gZGlnaXQgPD0gOToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCBsZWFkaW5nIHplcm9zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkaWdpdHMgb3IgZGlnaXQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWdpdHMuYXBwZW5kKGRpZ2l0KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGhlIHNlY29uZCB2YWx1ZSBpbiB0aGUgdHVwbGUgbXVzdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBjb21wb3NlZCBvZiBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCB0aHJvdWdoIDkuIikKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZVsyXSBpbiAoJ24nLCAnTicpOgorICAgICAgICAgICAgICAgICAgICAjIE5hTjogZGlnaXRzIGZvcm0gdGhlIGRpYWdub3N0aWMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW50ID0gJycuam9pbihtYXAoc3RyLCBkaWdpdHMpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHAgPSB2YWx1ZVsyXQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pc19zcGVjaWFsID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZVsyXSwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgICAgICAgICAjIGZpbml0ZSBudW1iZXI6IGRpZ2l0cyBnaXZlIHRoZSBjb2VmZmljaWVudAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnQgPSAnJy5qb2luKG1hcChzdHIsIGRpZ2l0cyBvciBbMF0pKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9leHAgPSB2YWx1ZVsyXQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pc19zcGVjaWFsID0gRmFsc2UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaGUgdGhpcmQgdmFsdWUgaW4gdGhlIHR1cGxlIG11c3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBhbiBpbnRlZ2VyLCBvciBvbmUgb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5ncyAnRicsICduJywgJ04nLiIpCisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICAgICAgICAgIHZhbHVlID0gRGVjaW1hbC5mcm9tX2Zsb2F0KHZhbHVlKQorICAgICAgICAgICAgc2VsZi5fZXhwICA9IHZhbHVlLl9leHAKKyAgICAgICAgICAgIHNlbGYuX3NpZ24gPSB2YWx1ZS5fc2lnbgorICAgICAgICAgICAgc2VsZi5faW50ICA9IHZhbHVlLl9pbnQKKyAgICAgICAgICAgIHNlbGYuX2lzX3NwZWNpYWwgID0gdmFsdWUuX2lzX3NwZWNpYWwKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCAlciB0byBEZWNpbWFsIiAlIHZhbHVlKQorCisgICAgIyBAY2xhc3NtZXRob2QsIGJ1dCBAZGVjb3JhdG9yIGlzIG5vdCB2YWxpZCBQeXRob24gMi4zIHN5bnRheCwgc28KKyAgICAjIGRvbid0IHVzZSBpdCAoc2VlIG5vdGVzIG9uIFB5Mi4zIGNvbXBhdGliaWxpdHkgYXQgdG9wIG9mIGZpbGUpCisgICAgZGVmIGZyb21fZmxvYXQoY2xzLCBmKToKKyAgICAgICAgIiIiQ29udmVydHMgYSBmbG9hdCB0byBhIGRlY2ltYWwgbnVtYmVyLCBleGFjdGx5LgorCisgICAgICAgIE5vdGUgdGhhdCBEZWNpbWFsLmZyb21fZmxvYXQoMC4xKSBpcyBub3QgdGhlIHNhbWUgYXMgRGVjaW1hbCgnMC4xJykuCisgICAgICAgIFNpbmNlIDAuMSBpcyBub3QgZXhhY3RseSByZXByZXNlbnRhYmxlIGluIGJpbmFyeSBmbG9hdGluZyBwb2ludCwgdGhlCisgICAgICAgIHZhbHVlIGlzIHN0b3JlZCBhcyB0aGUgbmVhcmVzdCByZXByZXNlbnRhYmxlIHZhbHVlIHdoaWNoIGlzCisgICAgICAgIDB4MS45OTk5OTk5OTk5OTlhcC00LiAgVGhlIGV4YWN0IGVxdWl2YWxlbnQgb2YgdGhlIHZhbHVlIGluIGRlY2ltYWwKKyAgICAgICAgaXMgMC4xMDAwMDAwMDAwMDAwMDAwMDU1NTExMTUxMjMxMjU3ODI3MDIxMTgxNTgzNDA0NTQxMDE1NjI1LgorCisgICAgICAgID4+PiBEZWNpbWFsLmZyb21fZmxvYXQoMC4xKQorICAgICAgICBEZWNpbWFsKCcwLjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjUnKQorICAgICAgICA+Pj4gRGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCduYW4nKSkKKyAgICAgICAgRGVjaW1hbCgnTmFOJykKKyAgICAgICAgPj4+IERlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnaW5mJykpCisgICAgICAgIERlY2ltYWwoJ0luZmluaXR5JykKKyAgICAgICAgPj4+IERlY2ltYWwuZnJvbV9mbG9hdCgtZmxvYXQoJ2luZicpKQorICAgICAgICBEZWNpbWFsKCctSW5maW5pdHknKQorICAgICAgICA+Pj4gRGVjaW1hbC5mcm9tX2Zsb2F0KC0wLjApCisgICAgICAgIERlY2ltYWwoJy0wJykKKworICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmLCAoaW50LCBsb25nKSk6ICAgICAgICAjIGhhbmRsZSBpbnRlZ2VyIGlucHV0cworICAgICAgICAgICAgcmV0dXJuIGNscyhmKQorICAgICAgICBpZiBfbWF0aC5pc2luZihmKSBvciBfbWF0aC5pc25hbihmKTogICMgcmFpc2VzIFR5cGVFcnJvciBpZiBub3QgYSBmbG9hdAorICAgICAgICAgICAgcmV0dXJuIGNscyhyZXByKGYpKQorICAgICAgICBpZiBfbWF0aC5jb3B5c2lnbigxLjAsIGYpID09IDEuMDoKKyAgICAgICAgICAgIHNpZ24gPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaWduID0gMQorICAgICAgICBuLCBkID0gYWJzKGYpLmFzX2ludGVnZXJfcmF0aW8oKQorICAgICAgICBrID0gZC5iaXRfbGVuZ3RoKCkgLSAxCisgICAgICAgIHJlc3VsdCA9IF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgc3RyKG4qNSoqayksIC1rKQorICAgICAgICBpZiBjbHMgaXMgRGVjaW1hbDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbHMocmVzdWx0KQorICAgIGZyb21fZmxvYXQgPSBjbGFzc21ldGhvZChmcm9tX2Zsb2F0KQorCisgICAgZGVmIF9pc25hbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB3aGV0aGVyIHRoZSBudW1iZXIgaXMgbm90IGFjdHVhbGx5IG9uZS4KKworICAgICAgICAwIGlmIGEgbnVtYmVyCisgICAgICAgIDEgaWYgTmFOCisgICAgICAgIDIgaWYgc05hTgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGV4cCA9IHNlbGYuX2V4cAorICAgICAgICAgICAgaWYgZXhwID09ICduJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgZWxpZiBleHAgPT0gJ04nOgorICAgICAgICAgICAgICAgIHJldHVybiAyCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgX2lzaW5maW5pdHkoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgd2hldGhlciB0aGUgbnVtYmVyIGlzIGluZmluaXRlCisKKyAgICAgICAgMCBpZiBmaW5pdGUgb3Igbm90IGEgbnVtYmVyCisgICAgICAgIDEgaWYgK0lORgorICAgICAgICAtMSBpZiAtSU5GCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9leHAgPT0gJ0YnOgorICAgICAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgX2NoZWNrX25hbnMoc2VsZiwgb3RoZXI9Tm9uZSwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB3aGV0aGVyIHRoZSBudW1iZXIgaXMgbm90IGFjdHVhbGx5IG9uZS4KKworICAgICAgICBpZiBzZWxmLCBvdGhlciBhcmUgc05hTiwgc2lnbmFsCisgICAgICAgIGlmIHNlbGYsIG90aGVyIGFyZSBOYU4gcmV0dXJuIG5hbgorICAgICAgICByZXR1cm4gMAorCisgICAgICAgIERvbmUgYmVmb3JlIG9wZXJhdGlvbnMuCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGZfaXNfbmFuID0gc2VsZi5faXNuYW4oKQorICAgICAgICBpZiBvdGhlciBpcyBOb25lOgorICAgICAgICAgICAgb3RoZXJfaXNfbmFuID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG90aGVyX2lzX25hbiA9IG90aGVyLl9pc25hbigpCisKKyAgICAgICAgaWYgc2VsZl9pc19uYW4gb3Igb3RoZXJfaXNfbmFuOgorICAgICAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICAgICAgaWYgc2VsZl9pc19uYW4gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3NOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgICAgICAgICBpZiBvdGhlcl9pc19uYW4gPT0gMjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3NOYU4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKQorICAgICAgICAgICAgaWYgc2VsZl9pc19uYW46CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeF9uYW4oY29udGV4dCkKKworICAgICAgICAgICAgcmV0dXJuIG90aGVyLl9maXhfbmFuKGNvbnRleHQpCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgX2NvbXBhcmVfY2hlY2tfbmFucyhzZWxmLCBvdGhlciwgY29udGV4dCk6CisgICAgICAgICIiIlZlcnNpb24gb2YgX2NoZWNrX25hbnMgdXNlZCBmb3IgdGhlIHNpZ25hbGluZyBjb21wYXJpc29ucworICAgICAgICBjb21wYXJlX3NpZ25hbCwgX19sZV9fLCBfX2x0X18sIF9fZ2VfXywgX19ndF9fLgorCisgICAgICAgIFNpZ25hbCBJbnZhbGlkT3BlcmF0aW9uIGlmIGVpdGhlciBzZWxmIG9yIG90aGVyIGlzIGEgKHF1aWV0CisgICAgICAgIG9yIHNpZ25hbGluZykgTmFOLiAgU2lnbmFsaW5nIE5hTnMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgcXVpZXQKKyAgICAgICAgTmFOcy4KKworICAgICAgICBSZXR1cm4gMCBpZiBuZWl0aGVyIG9wZXJhbmQgaXMgYSBOYU4uCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgaWYgc2VsZi5pc19zbmFuKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wYXJpc29uIGludm9sdmluZyBzTmFOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKyAgICAgICAgICAgIGVsaWYgb3RoZXIuaXNfc25hbigpOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29tcGFyaXNvbiBpbnZvbHZpbmcgc05hTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKQorICAgICAgICAgICAgZWxpZiBzZWxmLmlzX3FuYW4oKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gaW52b2x2aW5nIE5hTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisgICAgICAgICAgICBlbGlmIG90aGVyLmlzX3FuYW4oKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXBhcmlzb24gaW52b2x2aW5nIE5hTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyKQorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIG5vbnplcm87IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgTmFOcyBhbmQgaW5maW5pdGllcyBhcmUgY29uc2lkZXJlZCBub256ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lzX3NwZWNpYWwgb3Igc2VsZi5faW50ICE9ICcwJworCisgICAgZGVmIF9jbXAoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJlIHRoZSB0d28gbm9uLU5hTiBkZWNpbWFsIGluc3RhbmNlcyBzZWxmIGFuZCBvdGhlci4KKworICAgICAgICBSZXR1cm5zIC0xIGlmIHNlbGYgPCBvdGhlciwgMCBpZiBzZWxmID09IG90aGVyIGFuZCAxCisgICAgICAgIGlmIHNlbGYgPiBvdGhlci4gIFRoaXMgcm91dGluZSBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuIiIiCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIHNlbGZfaW5mID0gc2VsZi5faXNpbmZpbml0eSgpCisgICAgICAgICAgICBvdGhlcl9pbmYgPSBvdGhlci5faXNpbmZpbml0eSgpCisgICAgICAgICAgICBpZiBzZWxmX2luZiA9PSBvdGhlcl9pbmY6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsaWYgc2VsZl9pbmYgPCBvdGhlcl9pbmY6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgIyBjaGVjayBmb3IgemVyb3M7ICBEZWNpbWFsKCcwJykgPT0gRGVjaW1hbCgnLTAnKQorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gLSgoLTEpKipvdGhlci5fc2lnbikKKyAgICAgICAgaWYgbm90IG90aGVyOgorICAgICAgICAgICAgcmV0dXJuICgtMSkqKnNlbGYuX3NpZ24KKworICAgICAgICAjIElmIGRpZmZlcmVudCBzaWducywgbmVnIG9uZSBpcyBsZXNzCisgICAgICAgIGlmIG90aGVyLl9zaWduIDwgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiBzZWxmLl9zaWduIDwgb3RoZXIuX3NpZ246CisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHNlbGZfYWRqdXN0ZWQgPSBzZWxmLmFkanVzdGVkKCkKKyAgICAgICAgb3RoZXJfYWRqdXN0ZWQgPSBvdGhlci5hZGp1c3RlZCgpCisgICAgICAgIGlmIHNlbGZfYWRqdXN0ZWQgPT0gb3RoZXJfYWRqdXN0ZWQ6CisgICAgICAgICAgICBzZWxmX3BhZGRlZCA9IHNlbGYuX2ludCArICcwJyooc2VsZi5fZXhwIC0gb3RoZXIuX2V4cCkKKyAgICAgICAgICAgIG90aGVyX3BhZGRlZCA9IG90aGVyLl9pbnQgKyAnMCcqKG90aGVyLl9leHAgLSBzZWxmLl9leHApCisgICAgICAgICAgICBpZiBzZWxmX3BhZGRlZCA9PSBvdGhlcl9wYWRkZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsaWYgc2VsZl9wYWRkZWQgPCBvdGhlcl9wYWRkZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0oLTEpKipzZWxmLl9zaWduCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAoLTEpKipzZWxmLl9zaWduCisgICAgICAgIGVsaWYgc2VsZl9hZGp1c3RlZCA+IG90aGVyX2FkanVzdGVkOgorICAgICAgICAgICAgcmV0dXJuICgtMSkqKnNlbGYuX3NpZ24KKyAgICAgICAgZWxzZTogIyBzZWxmX2FkanVzdGVkIDwgb3RoZXJfYWRqdXN0ZWQKKyAgICAgICAgICAgIHJldHVybiAtKCgtMSkqKnNlbGYuX3NpZ24pCisKKyAgICAjIE5vdGU6IFRoZSBEZWNpbWFsIHN0YW5kYXJkIGRvZXNuJ3QgY292ZXIgcmljaCBjb21wYXJpc29ucyBmb3IKKyAgICAjIERlY2ltYWxzLiAgSW4gcGFydGljdWxhciwgdGhlIHNwZWNpZmljYXRpb24gaXMgc2lsZW50IG9uIHRoZQorICAgICMgc3ViamVjdCBvZiB3aGF0IHNob3VsZCBoYXBwZW4gZm9yIGEgY29tcGFyaXNvbiBpbnZvbHZpbmcgYSBOYU4uCisgICAgIyBXZSB0YWtlIHRoZSBmb2xsb3dpbmcgYXBwcm9hY2g6CisgICAgIworICAgICMgICA9PSBjb21wYXJpc29ucyBpbnZvbHZpbmcgYSBxdWlldCBOYU4gYWx3YXlzIHJldHVybiBGYWxzZQorICAgICMgICAhPSBjb21wYXJpc29ucyBpbnZvbHZpbmcgYSBxdWlldCBOYU4gYWx3YXlzIHJldHVybiBUcnVlCisgICAgIyAgID09IG9yICE9IGNvbXBhcmlzb25zIGludm9sdmluZyBhIHNpZ25hbGluZyBOYU4gc2lnbmFsCisgICAgIyAgICAgIEludmFsaWRPcGVyYXRpb24sIGFuZCByZXR1cm4gRmFsc2Ugb3IgVHJ1ZSBhcyBhYm92ZSBpZiB0aGUKKyAgICAjICAgICAgSW52YWxpZE9wZXJhdGlvbiBpcyBub3QgdHJhcHBlZC4KKyAgICAjICAgPCwgPiwgPD0gYW5kID49IGNvbXBhcmlzb25zIGludm9sdmluZyBhIChxdWlldCBvciBzaWduYWxpbmcpCisgICAgIyAgICAgIE5hTiBzaWduYWwgSW52YWxpZE9wZXJhdGlvbiwgYW5kIHJldHVybiBGYWxzZSBpZiB0aGUKKyAgICAjICAgICAgSW52YWxpZE9wZXJhdGlvbiBpcyBub3QgdHJhcHBlZC4KKyAgICAjCisgICAgIyBUaGlzIGJlaGF2aW9yIGlzIGRlc2lnbmVkIHRvIGNvbmZvcm0gYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0bworICAgICMgdGhhdCBzcGVjaWZpZWQgYnkgSUVFRSA3NTQuCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCBhbGxvd19mbG9hdD1UcnVlKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICBpZiBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA9PSAwCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCBhbGxvd19mbG9hdD1UcnVlKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICBpZiBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpICE9IDAKKworICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIGFsbG93X2Zsb2F0PVRydWUpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisgICAgICAgIGFucyA9IHNlbGYuX2NvbXBhcmVfY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBzZWxmLl9jbXAob3RoZXIpIDwgMAorCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgYWxsb3dfZmxvYXQ9VHJ1ZSkKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKyAgICAgICAgYW5zID0gc2VsZi5fY29tcGFyZV9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPD0gMAorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgYWxsb3dfZmxvYXQ9VHJ1ZSkKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKyAgICAgICAgYW5zID0gc2VsZi5fY29tcGFyZV9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NtcChvdGhlcikgPiAwCisKKyAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCBhbGxvd19mbG9hdD1UcnVlKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICBhbnMgPSBzZWxmLl9jb21wYXJlX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi5fY21wKG90aGVyKSA+PSAwCisKKyAgICBkZWYgY29tcGFyZShzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiQ29tcGFyZXMgb25lIHRvIGFub3RoZXIuCisKKyAgICAgICAgLTEgPT4gYSA8IGIKKyAgICAgICAgMCAgPT4gYSA9IGIKKyAgICAgICAgMSAgPT4gYSA+IGIKKyAgICAgICAgTmFOID0+IG9uZSBpcyBOYU4KKyAgICAgICAgTGlrZSBfX2NtcF9fLCBidXQgcmV0dXJucyBEZWNpbWFsIGluc3RhbmNlcy4KKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICAjIENvbXBhcmUoTmFOLCBOYU4pID0gTmFOCisgICAgICAgIGlmIChzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyIGFuZCBvdGhlci5faXNfc3BlY2lhbCk6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmLl9jbXAob3RoZXIpKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAiIiJ4Ll9faGFzaF9fKCkgPD09PiBoYXNoKHgpIiIiCisgICAgICAgICMgRGVjaW1hbCBpbnRlZ2VycyBtdXN0IGhhc2ggdGhlIHNhbWUgYXMgdGhlIGludHMKKyAgICAgICAgIworICAgICAgICAjIFRoZSBoYXNoIG9mIGEgbm9uc3BlY2lhbCBub25pbnRlZ2VyIERlY2ltYWwgbXVzdCBkZXBlbmQgb25seQorICAgICAgICAjIG9uIHRoZSB2YWx1ZSBvZiB0aGF0IERlY2ltYWwsIGFuZCBub3Qgb24gaXRzIHJlcHJlc2VudGF0aW9uLgorICAgICAgICAjIEZvciBleGFtcGxlOiBoYXNoKERlY2ltYWwoJzEwMEUtMScpKSA9PSBoYXNoKERlY2ltYWwoJzEwJykpLgorCisgICAgICAgICMgRXF1YWxpdHkgY29tcGFyaXNvbnMgaW52b2x2aW5nIHNpZ25hbGluZyBuYW5zIGNhbiByYWlzZSBhbgorICAgICAgICAjIGV4Y2VwdGlvbjsgc2luY2UgZXF1YWxpdHkgY2hlY2tzIGFyZSBpbXBsaWNpdGx5IGFuZAorICAgICAgICAjIHVucHJlZGljdGFibHkgdXNlZCB3aGVuIGNoZWNraW5nIHNldCBhbmQgZGljdCBtZW1iZXJzaGlwLCB3ZQorICAgICAgICAjIHByZXZlbnQgc2lnbmFsaW5nIG5hbnMgZnJvbSBiZWluZyB1c2VkIGFzIHNldCBlbGVtZW50cyBvcgorICAgICAgICAjIGRpY3Qga2V5cyBieSBtYWtpbmcgX19oYXNoX18gcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgaWYgc2VsZi5pc19zbmFuKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgaGFzaCBhIHNpZ25hbGluZyBOYU4gdmFsdWUuJykKKyAgICAgICAgICAgIGVsaWYgc2VsZi5pc19uYW4oKToKKyAgICAgICAgICAgICAgICAjIDAgdG8gbWF0Y2ggaGFzaChmbG9hdCgnbmFuJykpCisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyB2YWx1ZXMgY2hvc2VuIHRvIG1hdGNoIGhhc2goZmxvYXQoJ2luZicpKSBhbmQKKyAgICAgICAgICAgICAgICAjIGhhc2goZmxvYXQoJy1pbmYnKSkuCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0yNzE4MjgKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzE0MTU5CisKKyAgICAgICAgIyBJbiBQeXRob24gMi43LCB3ZSdyZSBhbGxvd2luZyBjb21wYXJpc29ucyAoYnV0IG5vdAorICAgICAgICAjIGFyaXRobWV0aWMgb3BlcmF0aW9ucykgYmV0d2VlbiBmbG9hdHMgYW5kIERlY2ltYWxzOyAgc28gaWYKKyAgICAgICAgIyBhIERlY2ltYWwgaW5zdGFuY2UgaXMgZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIGEgZmxvYXQgdGhlbgorICAgICAgICAjIGl0cyBoYXNoIHNob3VsZCBtYXRjaCB0aGF0IG9mIHRoZSBmbG9hdC4KKyAgICAgICAgc2VsZl9hc19mbG9hdCA9IGZsb2F0KHNlbGYpCisgICAgICAgIGlmIERlY2ltYWwuZnJvbV9mbG9hdChzZWxmX2FzX2Zsb2F0KSA9PSBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIGhhc2goc2VsZl9hc19mbG9hdCkKKworICAgICAgICBpZiBzZWxmLl9pc2ludGVnZXIoKToKKyAgICAgICAgICAgIG9wID0gX1dvcmtSZXAoc2VsZi50b19pbnRlZ3JhbF92YWx1ZSgpKQorICAgICAgICAgICAgIyB0byBtYWtlIGNvbXB1dGF0aW9uIGZlYXNpYmxlIGZvciBEZWNpbWFscyB3aXRoIGxhcmdlCisgICAgICAgICAgICAjIGV4cG9uZW50LCB3ZSB1c2UgdGhlIGZhY3QgdGhhdCBoYXNoKG4pID09IGhhc2gobSkgZm9yCisgICAgICAgICAgICAjIGFueSB0d28gbm9uemVybyBpbnRlZ2VycyBuIGFuZCBtIHN1Y2ggdGhhdCAoaSkgbiBhbmQgbQorICAgICAgICAgICAgIyBoYXZlIHRoZSBzYW1lIHNpZ24sIGFuZCAoaWkpIG4gaXMgY29uZ3J1ZW50IHRvIG0gbW9kdWxvCisgICAgICAgICAgICAjIDIqKjY0LTEuICBTbyB3ZSBjYW4gcmVwbGFjZSBoYXNoKCgtMSkqKnMqYyoxMCoqZSkgd2l0aAorICAgICAgICAgICAgIyBoYXNoKCgtMSkqKnMqYypwb3coMTAsIGUsIDIqKjY0LTEpLgorICAgICAgICAgICAgcmV0dXJuIGhhc2goKC0xKSoqb3Auc2lnbipvcC5pbnQqcG93KDEwLCBvcC5leHAsIDIqKjY0LTEpKQorICAgICAgICAjIFRoZSB2YWx1ZSBvZiBhIG5vbnplcm8gbm9uc3BlY2lhbCBEZWNpbWFsIGluc3RhbmNlIGlzCisgICAgICAgICMgZmFpdGhmdWxseSByZXByZXNlbnRlZCBieSB0aGUgdHJpcGxlIGNvbnNpc3Rpbmcgb2YgaXRzIHNpZ24sCisgICAgICAgICMgaXRzIGFkanVzdGVkIGV4cG9uZW50LCBhbmQgaXRzIGNvZWZmaWNpZW50IHdpdGggdHJhaWxpbmcKKyAgICAgICAgIyB6ZXJvcyByZW1vdmVkLgorICAgICAgICByZXR1cm4gaGFzaCgoc2VsZi5fc2lnbiwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cCtsZW4oc2VsZi5faW50KSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ludC5yc3RyaXAoJzAnKSkpCisKKyAgICBkZWYgYXNfdHVwbGUoc2VsZik6CisgICAgICAgICIiIlJlcHJlc2VudHMgdGhlIG51bWJlciBhcyBhIHRyaXBsZSB0dXBsZS4KKworICAgICAgICBUbyBzaG93IHRoZSBpbnRlcm5hbHMgZXhhY3RseSBhcyB0aGV5IGFyZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBEZWNpbWFsVHVwbGUoc2VsZi5fc2lnbiwgdHVwbGUobWFwKGludCwgc2VsZi5faW50KSksIHNlbGYuX2V4cCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmVwcmVzZW50cyB0aGUgbnVtYmVyIGFzIGFuIGluc3RhbmNlIG9mIERlY2ltYWwuIiIiCisgICAgICAgICMgSW52YXJpYW50OiAgZXZhbChyZXByKGQpKSA9PSBkCisgICAgICAgIHJldHVybiAiRGVjaW1hbCgnJXMnKSIgJSBzdHIoc2VsZikKKworICAgIGRlZiBfX3N0cl9fKHNlbGYsIGVuZz1GYWxzZSwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbnVtYmVyIGluIHNjaWVudGlmaWMgbm90YXRpb24uCisKKyAgICAgICAgQ2FwdHVyZXMgYWxsIG9mIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2lnbiA9IFsnJywgJy0nXVtzZWxmLl9zaWduXQorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgaWYgc2VsZi5fZXhwID09ICdGJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArICdJbmZpbml0eScKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fZXhwID09ICduJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArICdOYU4nICsgc2VsZi5faW50CisgICAgICAgICAgICBlbHNlOiAjIHNlbGYuX2V4cCA9PSAnTicKKyAgICAgICAgICAgICAgICByZXR1cm4gc2lnbiArICdzTmFOJyArIHNlbGYuX2ludAorCisgICAgICAgICMgbnVtYmVyIG9mIGRpZ2l0cyBvZiBzZWxmLl9pbnQgdG8gbGVmdCBvZiBkZWNpbWFsIHBvaW50CisgICAgICAgIGxlZnRkaWdpdHMgPSBzZWxmLl9leHAgKyBsZW4oc2VsZi5faW50KQorCisgICAgICAgICMgZG90cGxhY2UgaXMgbnVtYmVyIG9mIGRpZ2l0cyBvZiBzZWxmLl9pbnQgdG8gdGhlIGxlZnQgb2YgdGhlCisgICAgICAgICMgZGVjaW1hbCBwb2ludCBpbiB0aGUgbWFudGlzc2Egb2YgdGhlIG91dHB1dCBzdHJpbmcgKHRoYXQgaXMsCisgICAgICAgICMgYWZ0ZXIgYWRqdXN0aW5nIHRoZSBleHBvbmVudCkKKyAgICAgICAgaWYgc2VsZi5fZXhwIDw9IDAgYW5kIGxlZnRkaWdpdHMgPiAtNjoKKyAgICAgICAgICAgICMgbm8gZXhwb25lbnQgcmVxdWlyZWQKKyAgICAgICAgICAgIGRvdHBsYWNlID0gbGVmdGRpZ2l0cworICAgICAgICBlbGlmIG5vdCBlbmc6CisgICAgICAgICAgICAjIHVzdWFsIHNjaWVudGlmaWMgbm90YXRpb246IDEgZGlnaXQgb24gbGVmdCBvZiB0aGUgcG9pbnQKKyAgICAgICAgICAgIGRvdHBsYWNlID0gMQorICAgICAgICBlbGlmIHNlbGYuX2ludCA9PSAnMCc6CisgICAgICAgICAgICAjIGVuZ2luZWVyaW5nIG5vdGF0aW9uLCB6ZXJvCisgICAgICAgICAgICBkb3RwbGFjZSA9IChsZWZ0ZGlnaXRzICsgMSkgJSAzIC0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBlbmdpbmVlcmluZyBub3RhdGlvbiwgbm9uemVybworICAgICAgICAgICAgZG90cGxhY2UgPSAobGVmdGRpZ2l0cyAtIDEpICUgMyArIDEKKworICAgICAgICBpZiBkb3RwbGFjZSA8PSAwOgorICAgICAgICAgICAgaW50cGFydCA9ICcwJworICAgICAgICAgICAgZnJhY3BhcnQgPSAnLicgKyAnMCcqKC1kb3RwbGFjZSkgKyBzZWxmLl9pbnQKKyAgICAgICAgZWxpZiBkb3RwbGFjZSA+PSBsZW4oc2VsZi5faW50KToKKyAgICAgICAgICAgIGludHBhcnQgPSBzZWxmLl9pbnQrJzAnKihkb3RwbGFjZS1sZW4oc2VsZi5faW50KSkKKyAgICAgICAgICAgIGZyYWNwYXJ0ID0gJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGludHBhcnQgPSBzZWxmLl9pbnRbOmRvdHBsYWNlXQorICAgICAgICAgICAgZnJhY3BhcnQgPSAnLicgKyBzZWxmLl9pbnRbZG90cGxhY2U6XQorICAgICAgICBpZiBsZWZ0ZGlnaXRzID09IGRvdHBsYWNlOgorICAgICAgICAgICAgZXhwID0gJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgICAgICBleHAgPSBbJ2UnLCAnRSddW2NvbnRleHQuY2FwaXRhbHNdICsgIiUrZCIgJSAobGVmdGRpZ2l0cy1kb3RwbGFjZSkKKworICAgICAgICByZXR1cm4gc2lnbiArIGludHBhcnQgKyBmcmFjcGFydCArIGV4cAorCisgICAgZGVmIHRvX2VuZ19zdHJpbmcoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiQ29udmVydCB0byBlbmdpbmVlcmluZy10eXBlIHN0cmluZy4KKworICAgICAgICBFbmdpbmVlcmluZyBub3RhdGlvbiBoYXMgYW4gZXhwb25lbnQgd2hpY2ggaXMgYSBtdWx0aXBsZSBvZiAzLCBzbyB0aGVyZQorICAgICAgICBhcmUgdXAgdG8gMyBkaWdpdHMgbGVmdCBvZiB0aGUgZGVjaW1hbCBwbGFjZS4KKworICAgICAgICBTYW1lIHJ1bGVzIGZvciB3aGVuIGluIGV4cG9uZW50aWFsIGFuZCB3aGVuIGFzIGEgdmFsdWUgYXMgaW4gX19zdHJfXy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fc3RyX18oZW5nPVRydWUsIGNvbnRleHQ9Y29udGV4dCkKKworICAgIGRlZiBfX25lZ19fKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgYSBjb3B5IHdpdGggdGhlIHNpZ24gc3dpdGNoZWQuCisKKyAgICAgICAgUm91bmRzLCBpZiBpdCBoYXMgcmVhc29uLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgaWYgbm90IHNlbGYgYW5kIGNvbnRleHQucm91bmRpbmcgIT0gUk9VTkRfRkxPT1I6CisgICAgICAgICAgICAjIC1EZWNpbWFsKCcwJykgaXMgRGVjaW1hbCgnMCcpLCBub3QgRGVjaW1hbCgnLTAnKSwgZXhjZXB0CisgICAgICAgICAgICAjIGluIFJPVU5EX0ZMT09SIHJvdW5kaW5nIG1vZGUuCisgICAgICAgICAgICBhbnMgPSBzZWxmLmNvcHlfYWJzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFucyA9IHNlbGYuY29weV9uZWdhdGUoKQorCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIF9fcG9zX18oc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGNvcHksIHVubGVzcyBpdCBpcyBhIHNOYU4uCisKKyAgICAgICAgUm91bmRzIHRoZSBudW1iZXIgKGlmIG1vcmUgdGhlbiBwcmVjaXNpb24gZGlnaXRzKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgaWYgbm90IHNlbGYgYW5kIGNvbnRleHQucm91bmRpbmcgIT0gUk9VTkRfRkxPT1I6CisgICAgICAgICAgICAjICsgKC0wKSA9IDAsIGV4Y2VwdCBpbiBST1VORF9GTE9PUiByb3VuZGluZyBtb2RlLgorICAgICAgICAgICAgYW5zID0gc2VsZi5jb3B5X2FicygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbnMgPSBEZWNpbWFsKHNlbGYpCisKKyAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICBkZWYgX19hYnNfXyhzZWxmLCByb3VuZD1UcnVlLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiBzZWxmLgorCisgICAgICAgIElmIHRoZSBrZXl3b3JkIGFyZ3VtZW50ICdyb3VuZCcgaXMgZmFsc2UsIGRvIG5vdCByb3VuZC4gIFRoZQorICAgICAgICBleHByZXNzaW9uIHNlbGYuX19hYnNfXyhyb3VuZD1GYWxzZSkgaXMgZXF1aXZhbGVudCB0bworICAgICAgICBzZWxmLmNvcHlfYWJzKCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgcm91bmQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb3B5X2FicygpCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBzZWxmLl9zaWduOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fX25lZ19fKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX19wb3NfXyhjb250ZXh0PWNvbnRleHQpCisKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgc2VsZiArIG90aGVyLgorCisgICAgICAgIC1JTkYgKyBJTkYgKG9yIHRoZSByZXZlcnNlKSBjYXVzZSBJbnZhbGlkT3BlcmF0aW9uIGVycm9ycy4KKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgICMgSWYgYm90aCBJTkYsIHNhbWUgc2lnbiA9PiBzYW1lIGFzIGJvdGgsIG9wcG9zaXRlID0+IGVycm9yLgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NpZ24gIT0gb3RoZXIuX3NpZ24gYW5kIG90aGVyLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnLUlORiArIElORicpCisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKyAgICAgICAgICAgIGlmIG90aGVyLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwob3RoZXIpICAjIENhbid0IGJvdGggYmUgaW5maW5pdHkgaGVyZQorCisgICAgICAgIGV4cCA9IG1pbihzZWxmLl9leHAsIG90aGVyLl9leHApCisgICAgICAgIG5lZ2F0aXZlemVybyA9IDAKKyAgICAgICAgaWYgY29udGV4dC5yb3VuZGluZyA9PSBST1VORF9GTE9PUiBhbmQgc2VsZi5fc2lnbiAhPSBvdGhlci5fc2lnbjoKKyAgICAgICAgICAgICMgSWYgdGhlIGFuc3dlciBpcyAwLCB0aGUgc2lnbiBzaG91bGQgYmUgbmVnYXRpdmUsIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgIG5lZ2F0aXZlemVybyA9IDEKKworICAgICAgICBpZiBub3Qgc2VsZiBhbmQgbm90IG90aGVyOgorICAgICAgICAgICAgc2lnbiA9IG1pbihzZWxmLl9zaWduLCBvdGhlci5fc2lnbikKKyAgICAgICAgICAgIGlmIG5lZ2F0aXZlemVybzoKKyAgICAgICAgICAgICAgICBzaWduID0gMQorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShzaWduLCAnMCcsIGV4cCkKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgZXhwID0gbWF4KGV4cCwgb3RoZXIuX2V4cCAtIGNvbnRleHQucHJlYy0xKQorICAgICAgICAgICAgYW5zID0gb3RoZXIuX3Jlc2NhbGUoZXhwLCBjb250ZXh0LnJvdW5kaW5nKQorICAgICAgICAgICAgYW5zID0gYW5zLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgIHJldHVybiBhbnMKKyAgICAgICAgaWYgbm90IG90aGVyOgorICAgICAgICAgICAgZXhwID0gbWF4KGV4cCwgc2VsZi5fZXhwIC0gY29udGV4dC5wcmVjLTEpCisgICAgICAgICAgICBhbnMgPSBzZWxmLl9yZXNjYWxlKGV4cCwgY29udGV4dC5yb3VuZGluZykKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgb3AxID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgb3AyID0gX1dvcmtSZXAob3RoZXIpCisgICAgICAgIG9wMSwgb3AyID0gX25vcm1hbGl6ZShvcDEsIG9wMiwgY29udGV4dC5wcmVjKQorCisgICAgICAgIHJlc3VsdCA9IF9Xb3JrUmVwKCkKKyAgICAgICAgaWYgb3AxLnNpZ24gIT0gb3AyLnNpZ246CisgICAgICAgICAgICAjIEVxdWFsIGFuZCBvcHBvc2l0ZQorICAgICAgICAgICAgaWYgb3AxLmludCA9PSBvcDIuaW50OgorICAgICAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUobmVnYXRpdmV6ZXJvLCAnMCcsIGV4cCkKKyAgICAgICAgICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKyAgICAgICAgICAgIGlmIG9wMS5pbnQgPCBvcDIuaW50OgorICAgICAgICAgICAgICAgIG9wMSwgb3AyID0gb3AyLCBvcDEKKyAgICAgICAgICAgICAgICAjIE9LLCBub3cgYWJzKG9wMSkgPiBhYnMob3AyKQorICAgICAgICAgICAgaWYgb3AxLnNpZ24gPT0gMToKKyAgICAgICAgICAgICAgICByZXN1bHQuc2lnbiA9IDEKKyAgICAgICAgICAgICAgICBvcDEuc2lnbiwgb3AyLnNpZ24gPSBvcDIuc2lnbiwgb3AxLnNpZ24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0LnNpZ24gPSAwCisgICAgICAgICAgICAgICAgIyBTbyB3ZSBrbm93IHRoZSBzaWduLCBhbmQgb3AxID4gMC4KKyAgICAgICAgZWxpZiBvcDEuc2lnbiA9PSAxOgorICAgICAgICAgICAgcmVzdWx0LnNpZ24gPSAxCisgICAgICAgICAgICBvcDEuc2lnbiwgb3AyLnNpZ24gPSAoMCwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdC5zaWduID0gMAorICAgICAgICAjIE5vdywgb3AxID4gYWJzKG9wMikgPiAwCisKKyAgICAgICAgaWYgb3AyLnNpZ24gPT0gMDoKKyAgICAgICAgICAgIHJlc3VsdC5pbnQgPSBvcDEuaW50ICsgb3AyLmludAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0LmludCA9IG9wMS5pbnQgLSBvcDIuaW50CisKKyAgICAgICAgcmVzdWx0LmV4cCA9IG9wMS5leHAKKyAgICAgICAgYW5zID0gRGVjaW1hbChyZXN1bHQpCisgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgIHJldHVybiBhbnMKKworICAgIF9fcmFkZF9fID0gX19hZGRfXworCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBzZWxmIC0gb3RoZXIiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAjIHNlbGYgLSBvdGhlciBpcyBjb21wdXRlZCBhcyBzZWxmICsgb3RoZXIuY29weV9uZWdhdGUoKQorICAgICAgICByZXR1cm4gc2VsZi5fX2FkZF9fKG90aGVyLmNvcHlfbmVnYXRlKCksIGNvbnRleHQ9Y29udGV4dCkKKworICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIG90aGVyIC0gc2VsZiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgICAgIHJldHVybiBvdGhlci5fX3N1Yl9fKHNlbGYsIGNvbnRleHQ9Y29udGV4dCkKKworICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gc2VsZiAqIG90aGVyLgorCisgICAgICAgICgrLSkgSU5GICogMCAob3IgaXRzIHJldmVyc2UpIHJhaXNlIEludmFsaWRPcGVyYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICByZXN1bHRzaWduID0gc2VsZi5fc2lnbiBeIG90aGVyLl9zaWduCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgaWYgbm90IG90aGVyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJygrLSlJTkYgKiAwJykKKyAgICAgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3Jlc3VsdHNpZ25dCisKKyAgICAgICAgICAgIGlmIG90aGVyLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnMCAqICgrLSlJTkYnKQorICAgICAgICAgICAgICAgIHJldHVybiBfU2lnbmVkSW5maW5pdHlbcmVzdWx0c2lnbl0KKworICAgICAgICByZXN1bHRleHAgPSBzZWxmLl9leHAgKyBvdGhlci5fZXhwCisKKyAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIG11bHRpcGx5aW5nIGJ5IHplcm8KKyAgICAgICAgaWYgbm90IHNlbGYgb3Igbm90IG90aGVyOgorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRzaWduLCAnMCcsIHJlc3VsdGV4cCkKKyAgICAgICAgICAgICMgRml4aW5nIGluIGNhc2UgdGhlIGV4cG9uZW50IGlzIG91dCBvZiBib3VuZHMKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIG11bHRpcGx5aW5nIGJ5IHBvd2VyIG9mIDEwCisgICAgICAgIGlmIHNlbGYuX2ludCA9PSAnMSc6CisgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKHJlc3VsdHNpZ24sIG90aGVyLl9pbnQsIHJlc3VsdGV4cCkKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisgICAgICAgIGlmIG90aGVyLl9pbnQgPT0gJzEnOgorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRzaWduLCBzZWxmLl9pbnQsIHJlc3VsdGV4cCkKKyAgICAgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgb3AxID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgb3AyID0gX1dvcmtSZXAob3RoZXIpCisKKyAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRzaWduLCBzdHIob3AxLmludCAqIG9wMi5pbnQpLCByZXN1bHRleHApCisgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisKKyAgICAgICAgcmV0dXJuIGFucworICAgIF9fcm11bF9fID0gX19tdWxfXworCisgICAgZGVmIF9fdHJ1ZWRpdl9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gc2VsZiAvIG90aGVyLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBzaWduID0gc2VsZi5fc2lnbiBeIG90aGVyLl9zaWduCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgYW5kIG90aGVyLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICcoKy0pSU5GLygrLSlJTkYnKQorCisgICAgICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtzaWduXQorCisgICAgICAgICAgICBpZiBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKENsYW1wZWQsICdEaXZpc2lvbiBieSBpbmZpbml0eScpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgJzAnLCBjb250ZXh0LkV0aW55KCkpCisKKyAgICAgICAgIyBTcGVjaWFsIGNhc2VzIGZvciB6ZXJvZXMKKyAgICAgICAgaWYgbm90IG90aGVyOgorICAgICAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uVW5kZWZpbmVkLCAnMCAvIDAnKQorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uQnlaZXJvLCAneCAvIDAnLCBzaWduKQorCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgZXhwID0gc2VsZi5fZXhwIC0gb3RoZXIuX2V4cAorICAgICAgICAgICAgY29lZmYgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE9LLCBzbyBuZWl0aGVyID0gMCwgSU5GIG9yIE5hTgorICAgICAgICAgICAgc2hpZnQgPSBsZW4ob3RoZXIuX2ludCkgLSBsZW4oc2VsZi5faW50KSArIGNvbnRleHQucHJlYyArIDEKKyAgICAgICAgICAgIGV4cCA9IHNlbGYuX2V4cCAtIG90aGVyLl9leHAgLSBzaGlmdAorICAgICAgICAgICAgb3AxID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgICAgIG9wMiA9IF9Xb3JrUmVwKG90aGVyKQorICAgICAgICAgICAgaWYgc2hpZnQgPj0gMDoKKyAgICAgICAgICAgICAgICBjb2VmZiwgcmVtYWluZGVyID0gZGl2bW9kKG9wMS5pbnQgKiAxMCoqc2hpZnQsIG9wMi5pbnQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvZWZmLCByZW1haW5kZXIgPSBkaXZtb2Qob3AxLmludCwgb3AyLmludCAqIDEwKiotc2hpZnQpCisgICAgICAgICAgICBpZiByZW1haW5kZXI6CisgICAgICAgICAgICAgICAgIyByZXN1bHQgaXMgbm90IGV4YWN0OyBhZGp1c3QgdG8gZW5zdXJlIGNvcnJlY3Qgcm91bmRpbmcKKyAgICAgICAgICAgICAgICBpZiBjb2VmZiAlIDUgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgKz0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHJlc3VsdCBpcyBleGFjdDsgZ2V0IGFzIGNsb3NlIHRvIGlkZWFsIGV4cG9uZW50IGFzIHBvc3NpYmxlCisgICAgICAgICAgICAgICAgaWRlYWxfZXhwID0gc2VsZi5fZXhwIC0gb3RoZXIuX2V4cAorICAgICAgICAgICAgICAgIHdoaWxlIGV4cCA8IGlkZWFsX2V4cCBhbmQgY29lZmYgJSAxMCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb2VmZiAvLz0gMTAKKyAgICAgICAgICAgICAgICAgICAgZXhwICs9IDEKKworICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKHNpZ24sIHN0cihjb2VmZiksIGV4cCkKKyAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICBkZWYgX2RpdmlkZShzZWxmLCBvdGhlciwgY29udGV4dCk6CisgICAgICAgICIiIlJldHVybiAoc2VsZiAvLyBvdGhlciwgc2VsZiAlIG90aGVyKSwgdG8gY29udGV4dC5wcmVjIHByZWNpc2lvbi4KKworICAgICAgICBBc3N1bWVzIHRoYXQgbmVpdGhlciBzZWxmIG5vciBvdGhlciBpcyBhIE5hTiwgdGhhdCBzZWxmIGlzIG5vdAorICAgICAgICBpbmZpbml0ZSBhbmQgdGhhdCBvdGhlciBpcyBub256ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgc2lnbiA9IHNlbGYuX3NpZ24gXiBvdGhlci5fc2lnbgorICAgICAgICBpZiBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgaWRlYWxfZXhwID0gc2VsZi5fZXhwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZGVhbF9leHAgPSBtaW4oc2VsZi5fZXhwLCBvdGhlci5fZXhwKQorCisgICAgICAgIGV4cGRpZmYgPSBzZWxmLmFkanVzdGVkKCkgLSBvdGhlci5hZGp1c3RlZCgpCisgICAgICAgIGlmIG5vdCBzZWxmIG9yIG90aGVyLl9pc2luZmluaXR5KCkgb3IgZXhwZGlmZiA8PSAtMjoKKyAgICAgICAgICAgIHJldHVybiAoX2RlY19mcm9tX3RyaXBsZShzaWduLCAnMCcsIDApLAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXNjYWxlKGlkZWFsX2V4cCwgY29udGV4dC5yb3VuZGluZykpCisgICAgICAgIGlmIGV4cGRpZmYgPD0gY29udGV4dC5wcmVjOgorICAgICAgICAgICAgb3AxID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgICAgIG9wMiA9IF9Xb3JrUmVwKG90aGVyKQorICAgICAgICAgICAgaWYgb3AxLmV4cCA+PSBvcDIuZXhwOgorICAgICAgICAgICAgICAgIG9wMS5pbnQgKj0gMTAqKihvcDEuZXhwIC0gb3AyLmV4cCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3AyLmludCAqPSAxMCoqKG9wMi5leHAgLSBvcDEuZXhwKQorICAgICAgICAgICAgcSwgciA9IGRpdm1vZChvcDEuaW50LCBvcDIuaW50KQorICAgICAgICAgICAgaWYgcSA8IDEwKipjb250ZXh0LnByZWM6CisgICAgICAgICAgICAgICAgcmV0dXJuIChfZGVjX2Zyb21fdHJpcGxlKHNpZ24sIHN0cihxKSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sIHN0cihyKSwgaWRlYWxfZXhwKSkKKworICAgICAgICAjIEhlcmUgdGhlIHF1b3RpZW50IGlzIHRvbyBsYXJnZSB0byBiZSByZXByZXNlbnRhYmxlCisgICAgICAgIGFucyA9IGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uSW1wb3NzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1b3RpZW50IHRvbyBsYXJnZSBpbiAvLywgJSBvciBkaXZtb2QnKQorICAgICAgICByZXR1cm4gYW5zLCBhbnMKKworICAgIGRlZiBfX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlN3YXBzIHNlbGYvb3RoZXIgYW5kIHJldHVybnMgX190cnVlZGl2X18uIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisgICAgICAgIHJldHVybiBvdGhlci5fX3RydWVkaXZfXyhzZWxmLCBjb250ZXh0PWNvbnRleHQpCisKKyAgICBfX2Rpdl9fID0gX190cnVlZGl2X18KKyAgICBfX3JkaXZfXyA9IF9fcnRydWVkaXZfXworCisgICAgZGVmIF9fZGl2bW9kX18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gKHNlbGYgLy8gb3RoZXIsIHNlbGYgJSBvdGhlcikKKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiAoYW5zLCBhbnMpCisKKyAgICAgICAgc2lnbiA9IHNlbGYuX3NpZ24gXiBvdGhlci5fc2lnbgorICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICBpZiBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIGFucyA9IGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICdkaXZtb2QoSU5GLCBJTkYpJykKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zLCBhbnMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIChfU2lnbmVkSW5maW5pdHlbc2lnbl0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnSU5GICUgeCcpKQorCisgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgICAgIGFucyA9IGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uVW5kZWZpbmVkLCAnZGl2bW9kKDAsIDApJykKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zLCBhbnMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIChjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvbkJ5WmVybywgJ3ggLy8gMCcsIHNpZ24pLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3ggJSAwJykpCisKKyAgICAgICAgcXVvdGllbnQsIHJlbWFpbmRlciA9IHNlbGYuX2RpdmlkZShvdGhlciwgY29udGV4dCkKKyAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLl9maXgoY29udGV4dCkKKyAgICAgICAgcmV0dXJuIHF1b3RpZW50LCByZW1haW5kZXIKKworICAgIGRlZiBfX3JkaXZtb2RfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiU3dhcHMgc2VsZi9vdGhlciBhbmQgcmV0dXJucyBfX2Rpdm1vZF9fLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorICAgICAgICByZXR1cm4gb3RoZXIuX19kaXZtb2RfXyhzZWxmLCBjb250ZXh0PWNvbnRleHQpCisKKyAgICBkZWYgX19tb2RfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYgJSBvdGhlcgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnSU5GICUgeCcpCisgICAgICAgIGVsaWYgbm90IG90aGVyOgorICAgICAgICAgICAgaWYgc2VsZjoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3ggJSAwJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uVW5kZWZpbmVkLCAnMCAlIDAnKQorCisgICAgICAgIHJlbWFpbmRlciA9IHNlbGYuX2RpdmlkZShvdGhlciwgY29udGV4dClbMV0KKyAgICAgICAgcmVtYWluZGVyID0gcmVtYWluZGVyLl9maXgoY29udGV4dCkKKyAgICAgICAgcmV0dXJuIHJlbWFpbmRlcgorCisgICAgZGVmIF9fcm1vZF9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJTd2FwcyBzZWxmL290aGVyIGFuZCByZXR1cm5zIF9fbW9kX18uIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisgICAgICAgIHJldHVybiBvdGhlci5fX21vZF9fKHNlbGYsIGNvbnRleHQ9Y29udGV4dCkKKworICAgIGRlZiByZW1haW5kZXJfbmVhcihzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbWFpbmRlciBuZWFyZXN0IHRvIDAtICBhYnMocmVtYWluZGVyLW5lYXIpIDw9IG90aGVyLzIKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgICMgc2VsZiA9PSArLy1pbmZpbml0eSAtPiBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZW1haW5kZXJfbmVhcihpbmZpbml0eSwgeCknKQorCisgICAgICAgICMgb3RoZXIgPT0gMCAtPiBlaXRoZXIgSW52YWxpZE9wZXJhdGlvbiBvciBEaXZpc2lvblVuZGVmaW5lZAorICAgICAgICBpZiBub3Qgb3RoZXI6CisgICAgICAgICAgICBpZiBzZWxmOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVtYWluZGVyX25lYXIoeCwgMCknKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoRGl2aXNpb25VbmRlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZW1haW5kZXJfbmVhcigwLCAwKScpCisKKyAgICAgICAgIyBvdGhlciA9ICsvLWluZmluaXR5IC0+IHJlbWFpbmRlciA9IHNlbGYKKyAgICAgICAgaWYgb3RoZXIuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIGFucyA9IERlY2ltYWwoc2VsZikKKyAgICAgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgICAgICMgc2VsZiA9IDAgLT4gcmVtYWluZGVyID0gc2VsZiwgd2l0aCBpZGVhbCBleHBvbmVudAorICAgICAgICBpZGVhbF9leHBvbmVudCA9IG1pbihzZWxmLl9leHAsIG90aGVyLl9leHApCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCAnMCcsIGlkZWFsX2V4cG9uZW50KQorICAgICAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICAgICAgIyBjYXRjaCBtb3N0IGNhc2VzIG9mIGxhcmdlIG9yIHNtYWxsIHF1b3RpZW50CisgICAgICAgIGV4cGRpZmYgPSBzZWxmLmFkanVzdGVkKCkgLSBvdGhlci5hZGp1c3RlZCgpCisgICAgICAgIGlmIGV4cGRpZmYgPj0gY29udGV4dC5wcmVjICsgMToKKyAgICAgICAgICAgICMgZXhwZGlmZiA+PSBwcmVjKzEgPT4gYWJzKHNlbGYvb3RoZXIpID4gMTAqKnByZWMKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihEaXZpc2lvbkltcG9zc2libGUpCisgICAgICAgIGlmIGV4cGRpZmYgPD0gLTI6CisgICAgICAgICAgICAjIGV4cGRpZmYgPD0gLTIgPT4gYWJzKHNlbGYvb3RoZXIpIDwgMC4xCisgICAgICAgICAgICBhbnMgPSBzZWxmLl9yZXNjYWxlKGlkZWFsX2V4cG9uZW50LCBjb250ZXh0LnJvdW5kaW5nKQorICAgICAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICAgICAgIyBhZGp1c3QgYm90aCBhcmd1bWVudHMgdG8gaGF2ZSB0aGUgc2FtZSBleHBvbmVudCwgdGhlbiBkaXZpZGUKKyAgICAgICAgb3AxID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgb3AyID0gX1dvcmtSZXAob3RoZXIpCisgICAgICAgIGlmIG9wMS5leHAgPj0gb3AyLmV4cDoKKyAgICAgICAgICAgIG9wMS5pbnQgKj0gMTAqKihvcDEuZXhwIC0gb3AyLmV4cCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wMi5pbnQgKj0gMTAqKihvcDIuZXhwIC0gb3AxLmV4cCkKKyAgICAgICAgcSwgciA9IGRpdm1vZChvcDEuaW50LCBvcDIuaW50KQorICAgICAgICAjIHJlbWFpbmRlciBpcyByKjEwKippZGVhbF9leHBvbmVudDsgb3RoZXIgaXMgKy8tb3AyLmludCAqCisgICAgICAgICMgMTAqKmlkZWFsX2V4cG9uZW50LiAgIEFwcGx5IGNvcnJlY3Rpb24gdG8gZW5zdXJlIHRoYXQKKyAgICAgICAgIyBhYnMocmVtYWluZGVyKSA8PSBhYnMob3RoZXIpLzIKKyAgICAgICAgaWYgMipyICsgKHEmMSkgPiBvcDIuaW50OgorICAgICAgICAgICAgciAtPSBvcDIuaW50CisgICAgICAgICAgICBxICs9IDEKKworICAgICAgICBpZiBxID49IDEwKipjb250ZXh0LnByZWM6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoRGl2aXNpb25JbXBvc3NpYmxlKQorCisgICAgICAgICMgcmVzdWx0IGhhcyBzYW1lIHNpZ24gYXMgc2VsZiB1bmxlc3MgciBpcyBuZWdhdGl2ZQorICAgICAgICBzaWduID0gc2VsZi5fc2lnbgorICAgICAgICBpZiByIDwgMDoKKyAgICAgICAgICAgIHNpZ24gPSAxLXNpZ24KKyAgICAgICAgICAgIHIgPSAtcgorCisgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgc3RyKHIpLCBpZGVhbF9leHBvbmVudCkKKyAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICBkZWYgX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJzZWxmIC8vIG90aGVyIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICBpZiBvdGhlci5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnSU5GIC8vIElORicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBfU2lnbmVkSW5maW5pdHlbc2VsZi5fc2lnbiBeIG90aGVyLl9zaWduXQorCisgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIGlmIHNlbGY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uQnlaZXJvLCAneCAvLyAwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2lnbiBeIG90aGVyLl9zaWduKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoRGl2aXNpb25VbmRlZmluZWQsICcwIC8vIDAnKQorCisgICAgICAgIHJldHVybiBzZWxmLl9kaXZpZGUob3RoZXIsIGNvbnRleHQpWzBdCisKKyAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiU3dhcHMgc2VsZi9vdGhlciBhbmQgcmV0dXJucyBfX2Zsb29yZGl2X18uIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIpCisgICAgICAgIGlmIG90aGVyIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyCisgICAgICAgIHJldHVybiBvdGhlci5fX2Zsb29yZGl2X18oc2VsZiwgY29udGV4dD1jb250ZXh0KQorCisgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgIiIiRmxvYXQgcmVwcmVzZW50YXRpb24uIiIiCisgICAgICAgIGlmIHNlbGYuX2lzbmFuKCk6CisgICAgICAgICAgICBpZiBzZWxmLmlzX3NuYW4oKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgY29udmVydCBzaWduYWxpbmcgTmFOIHRvIGZsb2F0IikKKyAgICAgICAgICAgIHMgPSAiLW5hbiIgaWYgc2VsZi5fc2lnbiBlbHNlICJuYW4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gc3RyKHNlbGYpCisgICAgICAgIHJldHVybiBmbG9hdChzKQorCisgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICIiIkNvbnZlcnRzIHNlbGYgdG8gYW4gaW50LCB0cnVuY2F0aW5nIGlmIG5lY2Vzc2FyeS4iIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIHNlbGYuX2lzbmFuKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IGNvbnZlcnQgTmFOIHRvIGludGVnZXIiKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigiQ2Fubm90IGNvbnZlcnQgaW5maW5pdHkgdG8gaW50ZWdlciIpCisgICAgICAgIHMgPSAoLTEpKipzZWxmLl9zaWduCisgICAgICAgIGlmIHNlbGYuX2V4cCA+PSAwOgorICAgICAgICAgICAgcmV0dXJuIHMqaW50KHNlbGYuX2ludCkqMTAqKnNlbGYuX2V4cAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHMqaW50KHNlbGYuX2ludFs6c2VsZi5fZXhwXSBvciAnMCcpCisKKyAgICBfX3RydW5jX18gPSBfX2ludF9fCisKKyAgICBkZWYgcmVhbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICByZWFsID0gcHJvcGVydHkocmVhbCkKKworICAgIGRlZiBpbWFnKHNlbGYpOgorICAgICAgICByZXR1cm4gRGVjaW1hbCgwKQorICAgIGltYWcgPSBwcm9wZXJ0eShpbWFnKQorCisgICAgZGVmIGNvbmp1Z2F0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGNvbXBsZXgoZmxvYXQoc2VsZikpCisKKyAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICIiIkNvbnZlcnRzIHRvIGEgbG9uZy4KKworICAgICAgICBFcXVpdmFsZW50IHRvIGxvbmcoaW50KHNlbGYpKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGxvbmcoc2VsZi5fX2ludF9fKCkpCisKKyAgICBkZWYgX2ZpeF9uYW4oc2VsZiwgY29udGV4dCk6CisgICAgICAgICIiIkRlY2FwaXRhdGUgdGhlIHBheWxvYWQgb2YgYSBOYU4gdG8gZml0IHRoZSBjb250ZXh0IiIiCisgICAgICAgIHBheWxvYWQgPSBzZWxmLl9pbnQKKworICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIHBheWxvYWQgaXMgcHJlY2lzaW9uIGlmIF9jbGFtcD0wLAorICAgICAgICAjIHByZWNpc2lvbi0xIGlmIF9jbGFtcD0xLgorICAgICAgICBtYXhfcGF5bG9hZF9sZW4gPSBjb250ZXh0LnByZWMgLSBjb250ZXh0Ll9jbGFtcAorICAgICAgICBpZiBsZW4ocGF5bG9hZCkgPiBtYXhfcGF5bG9hZF9sZW46CisgICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZFtsZW4ocGF5bG9hZCktbWF4X3BheWxvYWRfbGVuOl0ubHN0cmlwKCcwJykKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sIHBheWxvYWQsIHNlbGYuX2V4cCwgVHJ1ZSkKKyAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKworICAgIGRlZiBfZml4KHNlbGYsIGNvbnRleHQpOgorICAgICAgICAiIiJSb3VuZCBpZiBpdCBpcyBuZWNlc3NhcnkgdG8ga2VlcCBzZWxmIHdpdGhpbiBwcmVjIHByZWNpc2lvbi4KKworICAgICAgICBSb3VuZHMgYW5kIGZpeGVzIHRoZSBleHBvbmVudC4gIERvZXMgbm90IHJhaXNlIG9uIGEgc05hTi4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIHNlbGYgLSBEZWNpbWFsIGluc3RhbmNlCisgICAgICAgIGNvbnRleHQgLSBjb250ZXh0IHVzZWQuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBpZiBzZWxmLl9pc25hbigpOgorICAgICAgICAgICAgICAgICMgZGVjYXBpdGF0ZSBwYXlsb2FkIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXhfbmFuKGNvbnRleHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgc2VsZiBpcyArLy1JbmZpbml0eTsgcmV0dXJuIHVuYWx0ZXJlZAorICAgICAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisKKyAgICAgICAgIyBpZiBzZWxmIGlzIHplcm8gdGhlbiBleHBvbmVudCBzaG91bGQgYmUgYmV0d2VlbiBFdGlueSBhbmQKKyAgICAgICAgIyBFbWF4IGlmIF9jbGFtcD09MCwgYW5kIGJldHdlZW4gRXRpbnkgYW5kIEV0b3AgaWYgX2NsYW1wPT0xLgorICAgICAgICBFdGlueSA9IGNvbnRleHQuRXRpbnkoKQorICAgICAgICBFdG9wID0gY29udGV4dC5FdG9wKCkKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICBleHBfbWF4ID0gW2NvbnRleHQuRW1heCwgRXRvcF1bY29udGV4dC5fY2xhbXBdCisgICAgICAgICAgICBuZXdfZXhwID0gbWluKG1heChzZWxmLl9leHAsIEV0aW55KSwgZXhwX21heCkKKyAgICAgICAgICAgIGlmIG5ld19leHAgIT0gc2VsZi5fZXhwOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKENsYW1wZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgJzAnLCBuZXdfZXhwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorCisgICAgICAgICMgZXhwX21pbiBpcyB0aGUgc21hbGxlc3QgYWxsb3dhYmxlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQsCisgICAgICAgICMgZXF1YWwgdG8gbWF4KHNlbGYuYWRqdXN0ZWQoKS1jb250ZXh0LnByZWMrMSwgRXRpbnkpCisgICAgICAgIGV4cF9taW4gPSBsZW4oc2VsZi5faW50KSArIHNlbGYuX2V4cCAtIGNvbnRleHQucHJlYworICAgICAgICBpZiBleHBfbWluID4gRXRvcDoKKyAgICAgICAgICAgICMgb3ZlcmZsb3c6IGV4cF9taW4gPiBFdG9wIGlmZiBzZWxmLmFkanVzdGVkKCkgPiBFbWF4CisgICAgICAgICAgICBhbnMgPSBjb250ZXh0Ll9yYWlzZV9lcnJvcihPdmVyZmxvdywgJ2Fib3ZlIEVtYXgnLCBzZWxmLl9zaWduKQorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW5leGFjdCkKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFJvdW5kZWQpCisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgc2VsZl9pc19zdWJub3JtYWwgPSBleHBfbWluIDwgRXRpbnkKKyAgICAgICAgaWYgc2VsZl9pc19zdWJub3JtYWw6CisgICAgICAgICAgICBleHBfbWluID0gRXRpbnkKKworICAgICAgICAjIHJvdW5kIGlmIHNlbGYgaGFzIHRvbyBtYW55IGRpZ2l0cworICAgICAgICBpZiBzZWxmLl9leHAgPCBleHBfbWluOgorICAgICAgICAgICAgZGlnaXRzID0gbGVuKHNlbGYuX2ludCkgKyBzZWxmLl9leHAgLSBleHBfbWluCisgICAgICAgICAgICBpZiBkaWdpdHMgPCAwOgorICAgICAgICAgICAgICAgIHNlbGYgPSBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sICcxJywgZXhwX21pbi0xKQorICAgICAgICAgICAgICAgIGRpZ2l0cyA9IDAKKyAgICAgICAgICAgIHJvdW5kaW5nX21ldGhvZCA9IHNlbGYuX3BpY2tfcm91bmRpbmdfZnVuY3Rpb25bY29udGV4dC5yb3VuZGluZ10KKyAgICAgICAgICAgIGNoYW5nZWQgPSByb3VuZGluZ19tZXRob2Qoc2VsZiwgZGlnaXRzKQorICAgICAgICAgICAgY29lZmYgPSBzZWxmLl9pbnRbOmRpZ2l0c10gb3IgJzAnCisgICAgICAgICAgICBpZiBjaGFuZ2VkID4gMDoKKyAgICAgICAgICAgICAgICBjb2VmZiA9IHN0cihpbnQoY29lZmYpKzEpCisgICAgICAgICAgICAgICAgaWYgbGVuKGNvZWZmKSA+IGNvbnRleHQucHJlYzoKKyAgICAgICAgICAgICAgICAgICAgY29lZmYgPSBjb2VmZls6LTFdCisgICAgICAgICAgICAgICAgICAgIGV4cF9taW4gKz0gMQorCisgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIHJvdW5kaW5nIHB1c2hlZCB0aGUgZXhwb25lbnQgb3V0IG9mIHJhbmdlCisgICAgICAgICAgICBpZiBleHBfbWluID4gRXRvcDoKKyAgICAgICAgICAgICAgICBhbnMgPSBjb250ZXh0Ll9yYWlzZV9lcnJvcihPdmVyZmxvdywgJ2Fib3ZlIEVtYXgnLCBzZWxmLl9zaWduKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sIGNvZWZmLCBleHBfbWluKQorCisgICAgICAgICAgICAjIHJhaXNlIHRoZSBhcHByb3ByaWF0ZSBzaWduYWxzLCB0YWtpbmcgY2FyZSB0byByZXNwZWN0CisgICAgICAgICAgICAjIHRoZSBwcmVjZWRlbmNlIGRlc2NyaWJlZCBpbiB0aGUgc3BlY2lmaWNhdGlvbgorICAgICAgICAgICAgaWYgY2hhbmdlZCBhbmQgc2VsZl9pc19zdWJub3JtYWw6CisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoVW5kZXJmbG93KQorICAgICAgICAgICAgaWYgc2VsZl9pc19zdWJub3JtYWw6CisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoU3Vibm9ybWFsKQorICAgICAgICAgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbmV4YWN0KQorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoUm91bmRlZCkKKyAgICAgICAgICAgIGlmIG5vdCBhbnM6CisgICAgICAgICAgICAgICAgIyByYWlzZSBDbGFtcGVkIG9uIHVuZGVyZmxvdyB0byAwCisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoQ2xhbXBlZCkKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBzZWxmX2lzX3N1Ym5vcm1hbDoKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFN1Ym5vcm1hbCkKKworICAgICAgICAjIGZvbGQgZG93biBpZiBfY2xhbXAgPT0gMSBhbmQgc2VsZiBoYXMgdG9vIGZldyBkaWdpdHMKKyAgICAgICAgaWYgY29udGV4dC5fY2xhbXAgPT0gMSBhbmQgc2VsZi5fZXhwID4gRXRvcDoKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKENsYW1wZWQpCisgICAgICAgICAgICBzZWxmX3BhZGRlZCA9IHNlbGYuX2ludCArICcwJyooc2VsZi5fZXhwIC0gRXRvcCkKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sIHNlbGZfcGFkZGVkLCBFdG9wKQorCisgICAgICAgICMgaGVyZSBzZWxmIHdhcyByZXByZXNlbnRhYmxlIHRvIGJlZ2luIHdpdGg7IHJldHVybiB1bmNoYW5nZWQKKyAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKworICAgICMgZm9yIGVhY2ggb2YgdGhlIHJvdW5kaW5nIGZ1bmN0aW9ucyBiZWxvdzoKKyAgICAjICAgc2VsZiBpcyBhIGZpbml0ZSwgbm9uemVybyBEZWNpbWFsCisgICAgIyAgIHByZWMgaXMgYW4gaW50ZWdlciBzYXRpc2Z5aW5nIDAgPD0gcHJlYyA8IGxlbihzZWxmLl9pbnQpCisgICAgIworICAgICMgZWFjaCBmdW5jdGlvbiByZXR1cm5zIGVpdGhlciAtMSwgMCwgb3IgMSwgYXMgZm9sbG93czoKKyAgICAjICAgMSBpbmRpY2F0ZXMgdGhhdCBzZWxmIHNob3VsZCBiZSByb3VuZGVkIHVwIChhd2F5IGZyb20gemVybykKKyAgICAjICAgMCBpbmRpY2F0ZXMgdGhhdCBzZWxmIHNob3VsZCBiZSB0cnVuY2F0ZWQsIGFuZCB0aGF0IGFsbCB0aGUKKyAgICAjICAgICBkaWdpdHMgdG8gYmUgdHJ1bmNhdGVkIGFyZSB6ZXJvcyAoc28gdGhlIHZhbHVlIGlzIHVuY2hhbmdlZCkKKyAgICAjICAtMSBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBhcmUgbm9uemVybyBkaWdpdHMgdG8gYmUgdHJ1bmNhdGVkCisKKyAgICBkZWYgX3JvdW5kX2Rvd24oc2VsZiwgcHJlYyk6CisgICAgICAgICIiIkFsc28ga25vd24gYXMgcm91bmQtdG93YXJkcy0wLCB0cnVuY2F0ZS4iIiIKKyAgICAgICAgaWYgX2FsbF96ZXJvcyhzZWxmLl9pbnQsIHByZWMpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIF9yb3VuZF91cChzZWxmLCBwcmVjKToKKyAgICAgICAgIiIiUm91bmRzIGF3YXkgZnJvbSAwLiIiIgorICAgICAgICByZXR1cm4gLXNlbGYuX3JvdW5kX2Rvd24ocHJlYykKKworICAgIGRlZiBfcm91bmRfaGFsZl91cChzZWxmLCBwcmVjKToKKyAgICAgICAgIiIiUm91bmRzIDUgdXAgKGF3YXkgZnJvbSAwKSIiIgorICAgICAgICBpZiBzZWxmLl9pbnRbcHJlY10gaW4gJzU2Nzg5JzoKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsaWYgX2FsbF96ZXJvcyhzZWxmLl9pbnQsIHByZWMpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIF9yb3VuZF9oYWxmX2Rvd24oc2VsZiwgcHJlYyk6CisgICAgICAgICIiIlJvdW5kIDUgZG93biIiIgorICAgICAgICBpZiBfZXhhY3RfaGFsZihzZWxmLl9pbnQsIHByZWMpOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcm91bmRfaGFsZl91cChwcmVjKQorCisgICAgZGVmIF9yb3VuZF9oYWxmX2V2ZW4oc2VsZiwgcHJlYyk6CisgICAgICAgICIiIlJvdW5kIDUgdG8gZXZlbiwgcmVzdCB0byBuZWFyZXN0LiIiIgorICAgICAgICBpZiBfZXhhY3RfaGFsZihzZWxmLl9pbnQsIHByZWMpIGFuZCBcCisgICAgICAgICAgICAgICAgKHByZWMgPT0gMCBvciBzZWxmLl9pbnRbcHJlYy0xXSBpbiAnMDI0NjgnKToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JvdW5kX2hhbGZfdXAocHJlYykKKworICAgIGRlZiBfcm91bmRfY2VpbGluZyhzZWxmLCBwcmVjKToKKyAgICAgICAgIiIiUm91bmRzIHVwIChub3QgYXdheSBmcm9tIDAgaWYgbmVnYXRpdmUuKSIiIgorICAgICAgICBpZiBzZWxmLl9zaWduOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JvdW5kX2Rvd24ocHJlYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAtc2VsZi5fcm91bmRfZG93bihwcmVjKQorCisgICAgZGVmIF9yb3VuZF9mbG9vcihzZWxmLCBwcmVjKToKKyAgICAgICAgIiIiUm91bmRzIGRvd24gKG5vdCB0b3dhcmRzIDAgaWYgbmVnYXRpdmUpIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9zaWduOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JvdW5kX2Rvd24ocHJlYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAtc2VsZi5fcm91bmRfZG93bihwcmVjKQorCisgICAgZGVmIF9yb3VuZF8wNXVwKHNlbGYsIHByZWMpOgorICAgICAgICAiIiJSb3VuZCBkb3duIHVubGVzcyBkaWdpdCBwcmVjLTEgaXMgMCBvciA1LiIiIgorICAgICAgICBpZiBwcmVjIGFuZCBzZWxmLl9pbnRbcHJlYy0xXSBub3QgaW4gJzA1JzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yb3VuZF9kb3duKHByZWMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gLXNlbGYuX3JvdW5kX2Rvd24ocHJlYykKKworICAgIF9waWNrX3JvdW5kaW5nX2Z1bmN0aW9uID0gZGljdCgKKyAgICAgICAgUk9VTkRfRE9XTiA9IF9yb3VuZF9kb3duLAorICAgICAgICBST1VORF9VUCA9IF9yb3VuZF91cCwKKyAgICAgICAgUk9VTkRfSEFMRl9VUCA9IF9yb3VuZF9oYWxmX3VwLAorICAgICAgICBST1VORF9IQUxGX0RPV04gPSBfcm91bmRfaGFsZl9kb3duLAorICAgICAgICBST1VORF9IQUxGX0VWRU4gPSBfcm91bmRfaGFsZl9ldmVuLAorICAgICAgICBST1VORF9DRUlMSU5HID0gX3JvdW5kX2NlaWxpbmcsCisgICAgICAgIFJPVU5EX0ZMT09SID0gX3JvdW5kX2Zsb29yLAorICAgICAgICBST1VORF8wNVVQID0gX3JvdW5kXzA1dXAsCisgICAgKQorCisgICAgZGVmIGZtYShzZWxmLCBvdGhlciwgdGhpcmQsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkZ1c2VkIG11bHRpcGx5LWFkZC4KKworICAgICAgICBSZXR1cm5zIHNlbGYqb3RoZXIrdGhpcmQgd2l0aCBubyByb3VuZGluZyBvZiB0aGUgaW50ZXJtZWRpYXRlCisgICAgICAgIHByb2R1Y3Qgc2VsZipvdGhlci4KKworICAgICAgICBzZWxmIGFuZCBvdGhlciBhcmUgbXVsdGlwbGllZCB0b2dldGhlciwgd2l0aCBubyByb3VuZGluZyBvZgorICAgICAgICB0aGUgcmVzdWx0LiAgVGhlIHRoaXJkIG9wZXJhbmQgaXMgdGhlbiBhZGRlZCB0byB0aGUgcmVzdWx0LAorICAgICAgICBhbmQgYSBzaW5nbGUgZmluYWwgcm91bmRpbmcgaXMgcGVyZm9ybWVkLgorICAgICAgICAiIiIKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgIyBjb21wdXRlIHByb2R1Y3Q7IHJhaXNlIEludmFsaWRPcGVyYXRpb24gaWYgZWl0aGVyIG9wZXJhbmQgaXMKKyAgICAgICAgIyBhIHNpZ25hbGluZyBOYU4gb3IgaWYgdGhlIHByb2R1Y3QgaXMgemVybyB0aW1lcyBpbmZpbml0eS4KKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgICAgICBpZiBzZWxmLl9leHAgPT0gJ04nOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnc05hTicsIHNlbGYpCisgICAgICAgICAgICBpZiBvdGhlci5fZXhwID09ICdOJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwgJ3NOYU4nLCBvdGhlcikKKyAgICAgICAgICAgIGlmIHNlbGYuX2V4cCA9PSAnbic6CisgICAgICAgICAgICAgICAgcHJvZHVjdCA9IHNlbGYKKyAgICAgICAgICAgIGVsaWYgb3RoZXIuX2V4cCA9PSAnbic6CisgICAgICAgICAgICAgICAgcHJvZHVjdCA9IG90aGVyCisgICAgICAgICAgICBlbGlmIHNlbGYuX2V4cCA9PSAnRic6CisgICAgICAgICAgICAgICAgaWYgbm90IG90aGVyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJTkYgKiAwIGluIGZtYScpCisgICAgICAgICAgICAgICAgcHJvZHVjdCA9IF9TaWduZWRJbmZpbml0eVtzZWxmLl9zaWduIF4gb3RoZXIuX3NpZ25dCisgICAgICAgICAgICBlbGlmIG90aGVyLl9leHAgPT0gJ0YnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwICogSU5GIGluIGZtYScpCisgICAgICAgICAgICAgICAgcHJvZHVjdCA9IF9TaWduZWRJbmZpbml0eVtzZWxmLl9zaWduIF4gb3RoZXIuX3NpZ25dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm9kdWN0ID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduIF4gb3RoZXIuX3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoaW50KHNlbGYuX2ludCkgKiBpbnQob3RoZXIuX2ludCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXhwICsgb3RoZXIuX2V4cCkKKworICAgICAgICB0aGlyZCA9IF9jb252ZXJ0X290aGVyKHRoaXJkLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBwcm9kdWN0Ll9fYWRkX18odGhpcmQsIGNvbnRleHQpCisKKyAgICBkZWYgX3Bvd2VyX21vZHVsbyhzZWxmLCBvdGhlciwgbW9kdWxvLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJUaHJlZSBhcmd1bWVudCB2ZXJzaW9uIG9mIF9fcG93X18iIiIKKworICAgICAgICAjIGlmIGNhbid0IGNvbnZlcnQgb3RoZXIgYW5kIG1vZHVsbyB0byBEZWNpbWFsLCByYWlzZQorICAgICAgICAjIFR5cGVFcnJvcjsgdGhlcmUncyBubyBwb2ludCByZXR1cm5pbmcgTm90SW1wbGVtZW50ZWQgKG5vCisgICAgICAgICMgZXF1aXZhbGVudCBvZiBfX3Jwb3dfXyBmb3IgdGhyZWUgYXJndW1lbnQgcG93KQorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisgICAgICAgIG1vZHVsbyA9IF9jb252ZXJ0X290aGVyKG1vZHVsbywgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICAjIGRlYWwgd2l0aCBOYU5zOiBpZiB0aGVyZSBhcmUgYW55IHNOYU5zIHRoZW4gZmlyc3Qgb25lIHdpbnMsCisgICAgICAgICMgKGkuZS4gYmVoYXZpb3VyIGZvciBOYU5zIGlzIGlkZW50aWNhbCB0byB0aGF0IG9mIGZtYSkKKyAgICAgICAgc2VsZl9pc19uYW4gPSBzZWxmLl9pc25hbigpCisgICAgICAgIG90aGVyX2lzX25hbiA9IG90aGVyLl9pc25hbigpCisgICAgICAgIG1vZHVsb19pc19uYW4gPSBtb2R1bG8uX2lzbmFuKCkKKyAgICAgICAgaWYgc2VsZl9pc19uYW4gb3Igb3RoZXJfaXNfbmFuIG9yIG1vZHVsb19pc19uYW46CisgICAgICAgICAgICBpZiBzZWxmX2lzX25hbiA9PSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnc05hTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKyAgICAgICAgICAgIGlmIG90aGVyX2lzX25hbiA9PSAyOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnc05hTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIpCisgICAgICAgICAgICBpZiBtb2R1bG9faXNfbmFuID09IDI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICdzTmFOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bG8pCisgICAgICAgICAgICBpZiBzZWxmX2lzX25hbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4X25hbihjb250ZXh0KQorICAgICAgICAgICAgaWYgb3RoZXJfaXNfbmFuOgorICAgICAgICAgICAgICAgIHJldHVybiBvdGhlci5fZml4X25hbihjb250ZXh0KQorICAgICAgICAgICAgcmV0dXJuIG1vZHVsby5fZml4X25hbihjb250ZXh0KQorCisgICAgICAgICMgY2hlY2sgaW5wdXRzOiB3ZSBhcHBseSBzYW1lIHJlc3RyaWN0aW9ucyBhcyBQeXRob24ncyBwb3coKQorICAgICAgICBpZiBub3QgKHNlbGYuX2lzaW50ZWdlcigpIGFuZAorICAgICAgICAgICAgICAgIG90aGVyLl9pc2ludGVnZXIoKSBhbmQKKyAgICAgICAgICAgICAgICBtb2R1bG8uX2lzaW50ZWdlcigpKToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwb3coKSAzcmQgYXJndW1lbnQgbm90IGFsbG93ZWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmxlc3MgYWxsIGFyZ3VtZW50cyBhcmUgaW50ZWdlcnMnKQorICAgICAgICBpZiBvdGhlciA8IDA6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG93KCkgMm5kIGFyZ3VtZW50IGNhbm5vdCBiZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25lZ2F0aXZlIHdoZW4gM3JkIGFyZ3VtZW50IHNwZWNpZmllZCcpCisgICAgICAgIGlmIG5vdCBtb2R1bG86CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG93KCkgM3JkIGFyZ3VtZW50IGNhbm5vdCBiZSAwJykKKworICAgICAgICAjIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gZm9yIGRlY2ltYWw6IHRoZSBtb2R1bHVzIG11c3QgYmUgbGVzcworICAgICAgICAjIHRoYW4gMTAqKnByZWMgaW4gYWJzb2x1dGUgdmFsdWUKKyAgICAgICAgaWYgbW9kdWxvLmFkanVzdGVkKCkgPj0gY29udGV4dC5wcmVjOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3VmZmljaWVudCBwcmVjaXNpb246IHBvdygpIDNyZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZ3VtZW50IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHJlY2lzaW9uIGRpZ2l0cycpCisKKyAgICAgICAgIyBkZWZpbmUgMCoqMCA9PSBOYU4sIGZvciBjb25zaXN0ZW5jeSB3aXRoIHR3by1hcmd1bWVudCBwb3cKKyAgICAgICAgIyAoZXZlbiB0aG91Z2ggaXQgaHVydHMhKQorICAgICAgICBpZiBub3Qgb3RoZXIgYW5kIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F0IGxlYXN0IG9uZSBvZiBwb3coKSAxc3QgYXJndW1lbnQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbmQgMm5kIGFyZ3VtZW50IG11c3QgYmUgbm9uemVybyA7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwKiowIGlzIG5vdCBkZWZpbmVkJykKKworICAgICAgICAjIGNvbXB1dGUgc2lnbiBvZiByZXN1bHQKKyAgICAgICAgaWYgb3RoZXIuX2lzZXZlbigpOgorICAgICAgICAgICAgc2lnbiA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpZ24gPSBzZWxmLl9zaWduCisKKyAgICAgICAgIyBjb252ZXJ0IG1vZHVsbyB0byBhIFB5dGhvbiBpbnRlZ2VyLCBhbmQgc2VsZiBhbmQgb3RoZXIgdG8KKyAgICAgICAgIyBEZWNpbWFsIGludGVnZXJzIChpLmUuIGZvcmNlIHRoZWlyIGV4cG9uZW50cyB0byBiZSA+PSAwKQorICAgICAgICBtb2R1bG8gPSBhYnMoaW50KG1vZHVsbykpCisgICAgICAgIGJhc2UgPSBfV29ya1JlcChzZWxmLnRvX2ludGVncmFsX3ZhbHVlKCkpCisgICAgICAgIGV4cG9uZW50ID0gX1dvcmtSZXAob3RoZXIudG9faW50ZWdyYWxfdmFsdWUoKSkKKworICAgICAgICAjIGNvbXB1dGUgcmVzdWx0IHVzaW5nIGludGVnZXIgcG93KCkKKyAgICAgICAgYmFzZSA9IChiYXNlLmludCAlIG1vZHVsbyAqIHBvdygxMCwgYmFzZS5leHAsIG1vZHVsbykpICUgbW9kdWxvCisgICAgICAgIGZvciBpIGluIHhyYW5nZShleHBvbmVudC5leHApOgorICAgICAgICAgICAgYmFzZSA9IHBvdyhiYXNlLCAxMCwgbW9kdWxvKQorICAgICAgICBiYXNlID0gcG93KGJhc2UsIGV4cG9uZW50LmludCwgbW9kdWxvKQorCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNpZ24sIHN0cihiYXNlKSwgMCkKKworICAgIGRlZiBfcG93ZXJfZXhhY3Qoc2VsZiwgb3RoZXIsIHApOgorICAgICAgICAiIiJBdHRlbXB0IHRvIGNvbXB1dGUgc2VsZioqb3RoZXIgZXhhY3RseS4KKworICAgICAgICBHaXZlbiBEZWNpbWFscyBzZWxmIGFuZCBvdGhlciBhbmQgYW4gaW50ZWdlciBwLCBhdHRlbXB0IHRvCisgICAgICAgIGNvbXB1dGUgYW4gZXhhY3QgcmVzdWx0IGZvciB0aGUgcG93ZXIgc2VsZioqb3RoZXIsIHdpdGggcAorICAgICAgICBkaWdpdHMgb2YgcHJlY2lzaW9uLiAgUmV0dXJuIE5vbmUgaWYgc2VsZioqb3RoZXIgaXMgbm90CisgICAgICAgIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBpbiBwIGRpZ2l0cy4KKworICAgICAgICBBc3N1bWVzIHRoYXQgZWxpbWluYXRpb24gb2Ygc3BlY2lhbCBjYXNlcyBoYXMgYWxyZWFkeSBiZWVuCisgICAgICAgIHBlcmZvcm1lZDogc2VsZiBhbmQgb3RoZXIgbXVzdCBib3RoIGJlIG5vbnNwZWNpYWw7IHNlbGYgbXVzdAorICAgICAgICBiZSBwb3NpdGl2ZSBhbmQgbm90IG51bWVyaWNhbGx5IGVxdWFsIHRvIDE7IG90aGVyIG11c3QgYmUKKyAgICAgICAgbm9uemVyby4gIEZvciBlZmZpY2llbmN5LCBvdGhlci5fZXhwIHNob3VsZCBub3QgYmUgdG9vIGxhcmdlLAorICAgICAgICBzbyB0aGF0IDEwKiphYnMob3RoZXIuX2V4cCkgaXMgYSBmZWFzaWJsZSBjYWxjdWxhdGlvbi4iIiIKKworICAgICAgICAjIEluIHRoZSBjb21tZW50cyBiZWxvdywgd2Ugd3JpdGUgeCBmb3IgdGhlIHZhbHVlIG9mIHNlbGYgYW5kIHkgZm9yIHRoZQorICAgICAgICAjIHZhbHVlIG9mIG90aGVyLiAgV3JpdGUgeCA9IHhjKjEwKip4ZSBhbmQgYWJzKHkpID0geWMqMTAqKnllLCB3aXRoIHhjCisgICAgICAgICMgYW5kIHljIHBvc2l0aXZlIGludGVnZXJzIG5vdCBkaXZpc2libGUgYnkgMTAuCisKKyAgICAgICAgIyBUaGUgbWFpbiBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIGlkZW50aWZ5IHRoZSAqZmFpbHVyZSoKKyAgICAgICAgIyBvZiB4Kip5IHRvIGJlIGV4YWN0bHkgcmVwcmVzZW50YWJsZSB3aXRoIGFzIGxpdHRsZSBlZmZvcnQgYXMKKyAgICAgICAgIyBwb3NzaWJsZS4gIFNvIHdlIGxvb2sgZm9yIGNoZWFwIGFuZCBlYXN5IHRlc3RzIHRoYXQKKyAgICAgICAgIyBlbGltaW5hdGUgdGhlIHBvc3NpYmlsaXR5IG9mIHgqKnkgYmVpbmcgZXhhY3QuICBPbmx5IGlmIGFsbAorICAgICAgICAjIHRoZXNlIHRlc3RzIGFyZSBwYXNzZWQgZG8gd2UgZ28gb24gdG8gYWN0dWFsbHkgY29tcHV0ZSB4Kip5LgorCisgICAgICAgICMgSGVyZSdzIHRoZSBtYWluIGlkZWEuICBFeHByZXNzIHkgYXMgYSByYXRpb25hbCBudW1iZXIgbS9uLCB3aXRoIG0gYW5kCisgICAgICAgICMgbiByZWxhdGl2ZWx5IHByaW1lIGFuZCBuPjAuICBUaGVuIGZvciB4Kip5IHRvIGJlIGV4YWN0bHkKKyAgICAgICAgIyByZXByZXNlbnRhYmxlIChhdCAqYW55KiBwcmVjaXNpb24pLCB4YyBtdXN0IGJlIHRoZSBudGggcG93ZXIgb2YgYQorICAgICAgICAjIHBvc2l0aXZlIGludGVnZXIgYW5kIHhlIG11c3QgYmUgZGl2aXNpYmxlIGJ5IG4uICBJZiB5IGlzIG5lZ2F0aXZlCisgICAgICAgICMgdGhlbiBhZGRpdGlvbmFsbHkgeGMgbXVzdCBiZSBhIHBvd2VyIG9mIGVpdGhlciAyIG9yIDUsIGhlbmNlIGEgcG93ZXIKKyAgICAgICAgIyBvZiAyKipuIG9yIDUqKm4uCisgICAgICAgICMKKyAgICAgICAgIyBUaGVyZSdzIGEgbGltaXQgdG8gaG93IHNtYWxsIHx5fCBjYW4gYmU6IGlmIHk9bS9uIGFzIGFib3ZlCisgICAgICAgICMgdGhlbjoKKyAgICAgICAgIworICAgICAgICAjICAoMSkgaWYgeGMgIT0gMSB0aGVuIGZvciB0aGUgcmVzdWx0IHRvIGJlIHJlcHJlc2VudGFibGUgd2UKKyAgICAgICAgIyAgICAgIG5lZWQgeGMqKigxL24pID49IDIsIGFuZCBoZW5jZSBhbHNvIHhjKip8eXwgPj0gMi4gIFNvCisgICAgICAgICMgICAgICBpZiB8eXwgPD0gMS9uYml0cyh4YykgdGhlbiB4YyA8IDIqKm5iaXRzKHhjKSA8PQorICAgICAgICAjICAgICAgMioqKDEvfHl8KSwgaGVuY2UgeGMqKnx5fCA8IDIgYW5kIHRoZSByZXN1bHQgaXMgbm90CisgICAgICAgICMgICAgICByZXByZXNlbnRhYmxlLgorICAgICAgICAjCisgICAgICAgICMgICgyKSBpZiB4ZSAhPSAwLCB8eGV8KigxL24pID49IDEsIHNvIHx4ZXwqfHl8ID49IDEuICBIZW5jZSBpZgorICAgICAgICAjICAgICAgfHl8IDwgMS98eGV8IHRoZW4gdGhlIHJlc3VsdCBpcyBub3QgcmVwcmVzZW50YWJsZS4KKyAgICAgICAgIworICAgICAgICAjIE5vdGUgdGhhdCBzaW5jZSB4IGlzIG5vdCBlcXVhbCB0byAxLCBhdCBsZWFzdCBvbmUgb2YgKDEpIGFuZAorICAgICAgICAjICgyKSBtdXN0IGFwcGx5LiAgTm93IHx5fCA8IDEvbmJpdHMoeGMpIGlmZiB8eWN8Km5iaXRzKHhjKSA8CisgICAgICAgICMgMTAqKi15ZSBpZmYgbGVuKHN0cih8eWN8Km5iaXRzKHhjKSkgPD0gLXllLgorICAgICAgICAjCisgICAgICAgICMgVGhlcmUncyBhbHNvIGEgbGltaXQgdG8gaG93IGxhcmdlIHkgY2FuIGJlLCBhdCBsZWFzdCBpZiBpdCdzCisgICAgICAgICMgcG9zaXRpdmU6IHRoZSBub3JtYWxpemVkIHJlc3VsdCB3aWxsIGhhdmUgY29lZmZpY2llbnQgeGMqKnksCisgICAgICAgICMgc28gaWYgaXQncyByZXByZXNlbnRhYmxlIHRoZW4geGMqKnkgPCAxMCoqcCwgYW5kIHkgPAorICAgICAgICAjIHAvbG9nMTAoeGMpLiAgSGVuY2UgaWYgeSpsb2cxMCh4YykgPj0gcCB0aGVuIHRoZSByZXN1bHQgaXMKKyAgICAgICAgIyBub3QgZXhhY3RseSByZXByZXNlbnRhYmxlLgorCisgICAgICAgICMgaWYgbGVuKHN0cihhYnMoeWMqeGUpKSA8PSAteWUgdGhlbiBhYnMoeWMqeGUpIDwgMTAqKi15ZSwKKyAgICAgICAgIyBzbyB8eXwgPCAxL3hlIGFuZCB0aGUgcmVzdWx0IGlzIG5vdCByZXByZXNlbnRhYmxlLgorICAgICAgICAjIFNpbWlsYXJseSwgbGVuKHN0cihhYnMoeWMpKnhjX2JpdHMpKSA8PSAteWUgaW1wbGllcyB8eXwKKyAgICAgICAgIyA8IDEvbmJpdHMoeGMpLgorCisgICAgICAgIHggPSBfV29ya1JlcChzZWxmKQorICAgICAgICB4YywgeGUgPSB4LmludCwgeC5leHAKKyAgICAgICAgd2hpbGUgeGMgJSAxMCA9PSAwOgorICAgICAgICAgICAgeGMgLy89IDEwCisgICAgICAgICAgICB4ZSArPSAxCisKKyAgICAgICAgeSA9IF9Xb3JrUmVwKG90aGVyKQorICAgICAgICB5YywgeWUgPSB5LmludCwgeS5leHAKKyAgICAgICAgd2hpbGUgeWMgJSAxMCA9PSAwOgorICAgICAgICAgICAgeWMgLy89IDEwCisgICAgICAgICAgICB5ZSArPSAxCisKKyAgICAgICAgIyBjYXNlIHdoZXJlIHhjID09IDE6IHJlc3VsdCBpcyAxMCoqKHhlKnkpLCB3aXRoIHhlKnkKKyAgICAgICAgIyByZXF1aXJlZCB0byBiZSBhbiBpbnRlZ2VyCisgICAgICAgIGlmIHhjID09IDE6CisgICAgICAgICAgICB4ZSAqPSB5YworICAgICAgICAgICAgIyByZXN1bHQgaXMgbm93IDEwKiooeGUgKiAxMCoqeWUpOyAgeGUgKiAxMCoqeWUgbXVzdCBiZSBpbnRlZ3JhbAorICAgICAgICAgICAgd2hpbGUgeGUgJSAxMCA9PSAwOgorICAgICAgICAgICAgICAgIHhlIC8vPSAxMAorICAgICAgICAgICAgICAgIHllICs9IDEKKyAgICAgICAgICAgIGlmIHllIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZXhwb25lbnQgPSB4ZSAqIDEwKip5ZQorICAgICAgICAgICAgaWYgeS5zaWduID09IDE6CisgICAgICAgICAgICAgICAgZXhwb25lbnQgPSAtZXhwb25lbnQKKyAgICAgICAgICAgICMgaWYgb3RoZXIgaXMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyLCB1c2UgaWRlYWwgZXhwb25lbnQKKyAgICAgICAgICAgIGlmIG90aGVyLl9pc2ludGVnZXIoKSBhbmQgb3RoZXIuX3NpZ24gPT0gMDoKKyAgICAgICAgICAgICAgICBpZGVhbF9leHBvbmVudCA9IHNlbGYuX2V4cCppbnQob3RoZXIpCisgICAgICAgICAgICAgICAgemVyb3MgPSBtaW4oZXhwb25lbnQtaWRlYWxfZXhwb25lbnQsIHAtMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgemVyb3MgPSAwCisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZSgwLCAnMScgKyAnMCcqemVyb3MsIGV4cG9uZW50LXplcm9zKQorCisgICAgICAgICMgY2FzZSB3aGVyZSB5IGlzIG5lZ2F0aXZlOiB4YyBtdXN0IGJlIGVpdGhlciBhIHBvd2VyCisgICAgICAgICMgb2YgMiBvciBhIHBvd2VyIG9mIDUuCisgICAgICAgIGlmIHkuc2lnbiA9PSAxOgorICAgICAgICAgICAgbGFzdF9kaWdpdCA9IHhjICUgMTAKKyAgICAgICAgICAgIGlmIGxhc3RfZGlnaXQgaW4gKDIsNCw2LDgpOgorICAgICAgICAgICAgICAgICMgcXVpY2sgdGVzdCBmb3IgcG93ZXIgb2YgMgorICAgICAgICAgICAgICAgIGlmIHhjICYgLXhjICE9IHhjOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgICMgbm93IHhjIGlzIGEgcG93ZXIgb2YgMjsgZSBpcyBpdHMgZXhwb25lbnQKKyAgICAgICAgICAgICAgICBlID0gX25iaXRzKHhjKS0xCisKKyAgICAgICAgICAgICAgICAjIFdlIG5vdyBoYXZlOgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjICAgeCA9IDIqKmUgKiAxMCoqeGUsIGUgPiAwLCBhbmQgeSA8IDAuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVGhlIGV4YWN0IHJlc3VsdCBpczoKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyAgIHgqKnkgPSA1KiooLWUqeSkgKiAxMCoqKGUqeSArIHhlKnkpCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgcHJvdmlkZWQgdGhhdCBib3RoIGUqeSBhbmQgeGUqeSBhcmUgaW50ZWdlcnMuICBOb3RlIHRoYXQgaWYKKyAgICAgICAgICAgICAgICAjIDUqKigtZSp5KSA+PSAxMCoqcCwgdGhlbiB0aGUgcmVzdWx0IGNhbid0IGJlIGV4cHJlc3NlZAorICAgICAgICAgICAgICAgICMgZXhhY3RseSB3aXRoIHAgZGlnaXRzIG9mIHByZWNpc2lvbi4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBVc2luZyB0aGUgYWJvdmUsIHdlIGNhbiBndWFyZCBhZ2FpbnN0IGxhcmdlIHZhbHVlcyBvZiB5ZS4KKyAgICAgICAgICAgICAgICAjIDkzLzY1IGlzIGFuIHVwcGVyIGJvdW5kIGZvciBsb2coMTApL2xvZyg1KSwgc28gaWYKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyAgIHllID49IGxlbihzdHIoOTMqcC8vNjUpKQorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIHRoZW4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyAgIC1lKnkgPj0gLXkgPj0gMTAqKnllID4gOTMqcC82NSA+IHAqbG9nKDEwKS9sb2coNSksCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgc28gNSoqKC1lKnkpID49IDEwKipwLCBhbmQgdGhlIGNvZWZmaWNpZW50IG9mIHRoZSByZXN1bHQKKyAgICAgICAgICAgICAgICAjIGNhbid0IGJlIGV4cHJlc3NlZCBpbiBwIGRpZ2l0cy4KKworICAgICAgICAgICAgICAgICMgZW1heCA+PSBsYXJnZXN0IGUgc3VjaCB0aGF0IDUqKmUgPCAxMCoqcC4KKyAgICAgICAgICAgICAgICBlbWF4ID0gcCo5My8vNjUKKyAgICAgICAgICAgICAgICBpZiB5ZSA+PSBsZW4oc3RyKGVtYXgpKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgICAgICMgRmluZCAtZSp5IGFuZCAteGUqeTsgYm90aCBtdXN0IGJlIGludGVnZXJzCisgICAgICAgICAgICAgICAgZSA9IF9kZWNpbWFsX2xzaGlmdF9leGFjdChlICogeWMsIHllKQorICAgICAgICAgICAgICAgIHhlID0gX2RlY2ltYWxfbHNoaWZ0X2V4YWN0KHhlICogeWMsIHllKQorICAgICAgICAgICAgICAgIGlmIGUgaXMgTm9uZSBvciB4ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICAgICAgICAgaWYgZSA+IGVtYXg6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgeGMgPSA1KiplCisKKyAgICAgICAgICAgIGVsaWYgbGFzdF9kaWdpdCA9PSA1OgorICAgICAgICAgICAgICAgICMgZSA+PSBsb2dfNSh4YykgaWYgeGMgaXMgYSBwb3dlciBvZiA1OyB3ZSBoYXZlCisgICAgICAgICAgICAgICAgIyBlcXVhbGl0eSBhbGwgdGhlIHdheSB1cCB0byB4Yz01KioyNjU4CisgICAgICAgICAgICAgICAgZSA9IF9uYml0cyh4YykqMjgvLzY1CisgICAgICAgICAgICAgICAgeGMsIHJlbWFpbmRlciA9IGRpdm1vZCg1KiplLCB4YykKKyAgICAgICAgICAgICAgICBpZiByZW1haW5kZXI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgd2hpbGUgeGMgJSA1ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHhjIC8vPSA1CisgICAgICAgICAgICAgICAgICAgIGUgLT0gMQorCisgICAgICAgICAgICAgICAgIyBHdWFyZCBhZ2FpbnN0IGxhcmdlIHZhbHVlcyBvZiB5ZSwgdXNpbmcgdGhlIHNhbWUgbG9naWMgYXMgaW4KKyAgICAgICAgICAgICAgICAjIHRoZSAneGMgaXMgYSBwb3dlciBvZiAyJyBicmFuY2guICAxMC8zIGlzIGFuIHVwcGVyIGJvdW5kIGZvcgorICAgICAgICAgICAgICAgICMgbG9nKDEwKS9sb2coMikuCisgICAgICAgICAgICAgICAgZW1heCA9IHAqMTAvLzMKKyAgICAgICAgICAgICAgICBpZiB5ZSA+PSBsZW4oc3RyKGVtYXgpKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgICAgIGUgPSBfZGVjaW1hbF9sc2hpZnRfZXhhY3QoZSAqIHljLCB5ZSkKKyAgICAgICAgICAgICAgICB4ZSA9IF9kZWNpbWFsX2xzaGlmdF9leGFjdCh4ZSAqIHljLCB5ZSkKKyAgICAgICAgICAgICAgICBpZiBlIGlzIE5vbmUgb3IgeGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgICAgIGlmIGUgPiBlbWF4OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHhjID0gMioqZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICAgICBpZiB4YyA+PSAxMCoqcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgeGUgPSAtZS14ZQorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMCwgc3RyKHhjKSwgeGUpCisKKyAgICAgICAgIyBub3cgeSBpcyBwb3NpdGl2ZTsgZmluZCBtIGFuZCBuIHN1Y2ggdGhhdCB5ID0gbS9uCisgICAgICAgIGlmIHllID49IDA6CisgICAgICAgICAgICBtLCBuID0geWMqMTAqKnllLCAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB4ZSAhPSAwIGFuZCBsZW4oc3RyKGFicyh5Yyp4ZSkpKSA8PSAteWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHhjX2JpdHMgPSBfbmJpdHMoeGMpCisgICAgICAgICAgICBpZiB4YyAhPSAxIGFuZCBsZW4oc3RyKGFicyh5YykqeGNfYml0cykpIDw9IC15ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgbSwgbiA9IHljLCAxMCoqKC15ZSkKKyAgICAgICAgICAgIHdoaWxlIG0gJSAyID09IG4gJSAyID09IDA6CisgICAgICAgICAgICAgICAgbSAvLz0gMgorICAgICAgICAgICAgICAgIG4gLy89IDIKKyAgICAgICAgICAgIHdoaWxlIG0gJSA1ID09IG4gJSA1ID09IDA6CisgICAgICAgICAgICAgICAgbSAvLz0gNQorICAgICAgICAgICAgICAgIG4gLy89IDUKKworICAgICAgICAjIGNvbXB1dGUgbnRoIHJvb3Qgb2YgeGMqMTAqKnhlCisgICAgICAgIGlmIG4gPiAxOgorICAgICAgICAgICAgIyBpZiAxIDwgeGMgPCAyKipuIHRoZW4geGMgaXNuJ3QgYW4gbnRoIHBvd2VyCisgICAgICAgICAgICBpZiB4YyAhPSAxIGFuZCB4Y19iaXRzIDw9IG46CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgeGUsIHJlbSA9IGRpdm1vZCh4ZSwgbikKKyAgICAgICAgICAgIGlmIHJlbSAhPSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgICAgICMgY29tcHV0ZSBudGggcm9vdCBvZiB4YyB1c2luZyBOZXd0b24ncyBtZXRob2QKKyAgICAgICAgICAgIGEgPSAxTCA8PCAtKC1fbmJpdHMoeGMpLy9uKSAjIGluaXRpYWwgZXN0aW1hdGUKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcSwgciA9IGRpdm1vZCh4YywgYSoqKG4tMSkpCisgICAgICAgICAgICAgICAgaWYgYSA8PSBxOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGEgPSAoYSoobi0xKSArIHEpLy9uCisgICAgICAgICAgICBpZiBub3QgKGEgPT0gcSBhbmQgciA9PSAwKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgeGMgPSBhCisKKyAgICAgICAgIyBub3cgeGMqMTAqKnhlIGlzIHRoZSBudGggcm9vdCBvZiB0aGUgb3JpZ2luYWwgeGMqMTAqKnhlCisgICAgICAgICMgY29tcHV0ZSBtdGggcG93ZXIgb2YgeGMqMTAqKnhlCisKKyAgICAgICAgIyBpZiBtID4gcCoxMDAvL19sb2cxMF9sYih4YykgdGhlbiBtID4gcC9sb2cxMCh4YyksIGhlbmNlIHhjKiptID4KKyAgICAgICAgIyAxMCoqcCBhbmQgdGhlIHJlc3VsdCBpcyBub3QgcmVwcmVzZW50YWJsZS4KKyAgICAgICAgaWYgeGMgPiAxIGFuZCBtID4gcCoxMDAvL19sb2cxMF9sYih4Yyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICB4YyA9IHhjKiptCisgICAgICAgIHhlICo9IG0KKyAgICAgICAgaWYgeGMgPiAxMCoqcDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBieSB0aGlzIHBvaW50IHRoZSByZXN1bHQgKmlzKiBleGFjdGx5IHJlcHJlc2VudGFibGUKKyAgICAgICAgIyBhZGp1c3QgdGhlIGV4cG9uZW50IHRvIGdldCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgaWRlYWwKKyAgICAgICAgIyBleHBvbmVudCwgaWYgbmVjZXNzYXJ5CisgICAgICAgIHN0cl94YyA9IHN0cih4YykKKyAgICAgICAgaWYgb3RoZXIuX2lzaW50ZWdlcigpIGFuZCBvdGhlci5fc2lnbiA9PSAwOgorICAgICAgICAgICAgaWRlYWxfZXhwb25lbnQgPSBzZWxmLl9leHAqaW50KG90aGVyKQorICAgICAgICAgICAgemVyb3MgPSBtaW4oeGUtaWRlYWxfZXhwb25lbnQsIHAtbGVuKHN0cl94YykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB6ZXJvcyA9IDAKKyAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMCwgc3RyX3hjKycwJyp6ZXJvcywgeGUtemVyb3MpCisKKyAgICBkZWYgX19wb3dfXyhzZWxmLCBvdGhlciwgbW9kdWxvPU5vbmUsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBzZWxmICoqIG90aGVyIFsgJSBtb2R1bG9dLgorCisgICAgICAgIFdpdGggdHdvIGFyZ3VtZW50cywgY29tcHV0ZSBzZWxmKipvdGhlci4KKworICAgICAgICBXaXRoIHRocmVlIGFyZ3VtZW50cywgY29tcHV0ZSAoc2VsZioqb3RoZXIpICUgbW9kdWxvLiAgRm9yIHRoZQorICAgICAgICB0aHJlZSBhcmd1bWVudCBmb3JtLCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBvbiB0aGUKKyAgICAgICAgYXJndW1lbnRzIGhvbGQ6CisKKyAgICAgICAgIC0gYWxsIHRocmVlIGFyZ3VtZW50cyBtdXN0IGJlIGludGVncmFsCisgICAgICAgICAtIG90aGVyIG11c3QgYmUgbm9ubmVnYXRpdmUKKyAgICAgICAgIC0gZWl0aGVyIHNlbGYgb3Igb3RoZXIgKG9yIGJvdGgpIG11c3QgYmUgbm9uemVybworICAgICAgICAgLSBtb2R1bG8gbXVzdCBiZSBub256ZXJvIGFuZCBtdXN0IGhhdmUgYXQgbW9zdCBwIGRpZ2l0cywKKyAgICAgICAgICAgd2hlcmUgcCBpcyB0aGUgY29udGV4dCBwcmVjaXNpb24uCisKKyAgICAgICAgSWYgYW55IG9mIHRoZXNlIHJlc3RyaWN0aW9ucyBpcyB2aW9sYXRlZCB0aGUgSW52YWxpZE9wZXJhdGlvbgorICAgICAgICBmbGFnIGlzIHJhaXNlZC4KKworICAgICAgICBUaGUgcmVzdWx0IG9mIHBvdyhzZWxmLCBvdGhlciwgbW9kdWxvKSBpcyBpZGVudGljYWwgdG8gdGhlCisgICAgICAgIHJlc3VsdCB0aGF0IHdvdWxkIGJlIG9idGFpbmVkIGJ5IGNvbXB1dGluZyAoc2VsZioqb3RoZXIpICUKKyAgICAgICAgbW9kdWxvIHdpdGggdW5ib3VuZGVkIHByZWNpc2lvbiwgYnV0IGlzIGNvbXB1dGVkIG1vcmUKKyAgICAgICAgZWZmaWNpZW50bHkuICBJdCBpcyBhbHdheXMgZXhhY3QuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG1vZHVsbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3dlcl9tb2R1bG8ob3RoZXIsIG1vZHVsbywgY29udGV4dCkKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyKQorICAgICAgICBpZiBvdGhlciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICAjIGVpdGhlciBhcmd1bWVudCBpcyBhIE5hTiA9PiByZXN1bHQgaXMgTmFOCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAjIDAqKjAgPSBOYU4gKCEpLCB4KiowID0gMSBmb3Igbm9uemVybyB4IChpbmNsdWRpbmcgKy8tSW5maW5pdHkpCisgICAgICAgIGlmIG5vdCBvdGhlcjoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLCAnMCAqKiAwJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9PbmUKKworICAgICAgICAjIHJlc3VsdCBoYXMgc2lnbiAxIGlmZiBzZWxmLl9zaWduIGlzIDEgYW5kIG90aGVyIGlzIGFuIG9kZCBpbnRlZ2VyCisgICAgICAgIHJlc3VsdF9zaWduID0gMAorICAgICAgICBpZiBzZWxmLl9zaWduID09IDE6CisgICAgICAgICAgICBpZiBvdGhlci5faXNpbnRlZ2VyKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IG90aGVyLl9pc2V2ZW4oKToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3NpZ24gPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgLXZlKipub25pbnRlZ2VyID0gTmFOCisgICAgICAgICAgICAgICAgIyAoLTApKipub25pbnRlZ2VyID0gMCoqbm9uaW50ZWdlcgorICAgICAgICAgICAgICAgIGlmIHNlbGY6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3ggKiogeSB3aXRoIHggbmVnYXRpdmUgYW5kIHkgbm90IGFuIGludGVnZXInKQorICAgICAgICAgICAgIyBuZWdhdGUgc2VsZiwgd2l0aG91dCBkb2luZyBhbnkgdW53YW50ZWQgcm91bmRpbmcKKyAgICAgICAgICAgIHNlbGYgPSBzZWxmLmNvcHlfbmVnYXRlKCkKKworICAgICAgICAjIDAqKigrdmUgb3IgSW5mKT0gMDsgMCoqKC12ZSBvciAtSW5mKSA9IEluZmluaXR5CisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgaWYgb3RoZXIuX3NpZ24gPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRfc2lnbiwgJzAnLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3Jlc3VsdF9zaWduXQorCisgICAgICAgICMgSW5mKiooK3ZlIG9yIEluZikgPSBJbmY7IEluZioqKC12ZSBvciAtSW5mKSA9IDAKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgaWYgb3RoZXIuX3NpZ24gPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gX1NpZ25lZEluZmluaXR5W3Jlc3VsdF9zaWduXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShyZXN1bHRfc2lnbiwgJzAnLCAwKQorCisgICAgICAgICMgMSoqb3RoZXIgPSAxLCBidXQgdGhlIGNob2ljZSBvZiBleHBvbmVudCBhbmQgdGhlIGZsYWdzCisgICAgICAgICMgZGVwZW5kIG9uIHRoZSBleHBvbmVudCBvZiBzZWxmLCBhbmQgb24gd2hldGhlciBvdGhlciBpcyBhCisgICAgICAgICMgcG9zaXRpdmUgaW50ZWdlciwgYSBuZWdhdGl2ZSBpbnRlZ2VyLCBvciBuZWl0aGVyCisgICAgICAgIGlmIHNlbGYgPT0gX09uZToKKyAgICAgICAgICAgIGlmIG90aGVyLl9pc2ludGVnZXIoKToKKyAgICAgICAgICAgICAgICAjIGV4cCA9IG1heChzZWxmLl9leHAqbWF4KGludChvdGhlciksIDApLAorICAgICAgICAgICAgICAgICMgMS1jb250ZXh0LnByZWMpIGJ1dCBldmFsdWF0aW5nIGludChvdGhlcikgZGlyZWN0bHkKKyAgICAgICAgICAgICAgICAjIGlzIGRhbmdlcm91cyB1bnRpbCB3ZSBrbm93IG90aGVyIGlzIHNtYWxsIChvdGhlcgorICAgICAgICAgICAgICAgICMgY291bGQgYmUgMWU5OTk5OTk5OTkpCisgICAgICAgICAgICAgICAgaWYgb3RoZXIuX3NpZ24gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IDAKKyAgICAgICAgICAgICAgICBlbGlmIG90aGVyID4gY29udGV4dC5wcmVjOgorICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyID0gY29udGV4dC5wcmVjCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGllciA9IGludChvdGhlcikKKworICAgICAgICAgICAgICAgIGV4cCA9IHNlbGYuX2V4cCAqIG11bHRpcGxpZXIKKyAgICAgICAgICAgICAgICBpZiBleHAgPCAxLWNvbnRleHQucHJlYzoKKyAgICAgICAgICAgICAgICAgICAgZXhwID0gMS1jb250ZXh0LnByZWMKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoUm91bmRlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW5leGFjdCkKKyAgICAgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihSb3VuZGVkKQorICAgICAgICAgICAgICAgIGV4cCA9IDEtY29udGV4dC5wcmVjCisKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHJlc3VsdF9zaWduLCAnMScrJzAnKi1leHAsIGV4cCkKKworICAgICAgICAjIGNvbXB1dGUgYWRqdXN0ZWQgZXhwb25lbnQgb2Ygc2VsZgorICAgICAgICBzZWxmX2FkaiA9IHNlbGYuYWRqdXN0ZWQoKQorCisgICAgICAgICMgc2VsZiAqKiBpbmZpbml0eSBpcyBpbmZpbml0eSBpZiBzZWxmID4gMSwgMCBpZiBzZWxmIDwgMQorICAgICAgICAjIHNlbGYgKiogLWluZmluaXR5IGlzIGluZmluaXR5IGlmIHNlbGYgPCAxLCAwIGlmIHNlbGYgPiAxCisgICAgICAgIGlmIG90aGVyLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICBpZiAob3RoZXIuX3NpZ24gPT0gMCkgPT0gKHNlbGZfYWRqIDwgMCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUocmVzdWx0X3NpZ24sICcwJywgMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9TaWduZWRJbmZpbml0eVtyZXN1bHRfc2lnbl0KKworICAgICAgICAjIGZyb20gaGVyZSBvbiwgdGhlIHJlc3VsdCBhbHdheXMgZ29lcyB0aHJvdWdoIHRoZSBjYWxsCisgICAgICAgICMgdG8gX2ZpeCBhdCB0aGUgZW5kIG9mIHRoaXMgZnVuY3Rpb24uCisgICAgICAgIGFucyA9IE5vbmUKKyAgICAgICAgZXhhY3QgPSBGYWxzZQorCisgICAgICAgICMgY3J1ZGUgdGVzdCB0byBjYXRjaCBjYXNlcyBvZiBleHRyZW1lIG92ZXJmbG93L3VuZGVyZmxvdy4gIElmCisgICAgICAgICMgbG9nMTAoc2VsZikqb3RoZXIgPj0gMTAqKmJvdW5kIGFuZCBib3VuZCA+PSBsZW4oc3RyKEVtYXgpKQorICAgICAgICAjIHRoZW4gMTAqKmJvdW5kID49IDEwKipsZW4oc3RyKEVtYXgpKSA+PSBFbWF4KzEgYW5kIGhlbmNlCisgICAgICAgICMgc2VsZioqb3RoZXIgPj0gMTAqKihFbWF4KzEpLCBzbyBvdmVyZmxvdyBvY2N1cnMuICBUaGUgdGVzdAorICAgICAgICAjIGZvciB1bmRlcmZsb3cgaXMgc2ltaWxhci4KKyAgICAgICAgYm91bmQgPSBzZWxmLl9sb2cxMF9leHBfYm91bmQoKSArIG90aGVyLmFkanVzdGVkKCkKKyAgICAgICAgaWYgKHNlbGZfYWRqID49IDApID09IChvdGhlci5fc2lnbiA9PSAwKToKKyAgICAgICAgICAgICMgc2VsZiA+IDEgYW5kIG90aGVyICt2ZSwgb3Igc2VsZiA8IDEgYW5kIG90aGVyIC12ZQorICAgICAgICAgICAgIyBwb3NzaWJpbGl0eSBvZiBvdmVyZmxvdworICAgICAgICAgICAgaWYgYm91bmQgPj0gbGVuKHN0cihjb250ZXh0LkVtYXgpKToKKyAgICAgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKHJlc3VsdF9zaWduLCAnMScsIGNvbnRleHQuRW1heCsxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBzZWxmID4gMSBhbmQgb3RoZXIgLXZlLCBvciBzZWxmIDwgMSBhbmQgb3RoZXIgK3ZlCisgICAgICAgICAgICAjIHBvc3NpYmlsaXR5IG9mIHVuZGVyZmxvdyB0byAwCisgICAgICAgICAgICBFdGlueSA9IGNvbnRleHQuRXRpbnkoKQorICAgICAgICAgICAgaWYgYm91bmQgPj0gbGVuKHN0cigtRXRpbnkpKToKKyAgICAgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKHJlc3VsdF9zaWduLCAnMScsIEV0aW55LTEpCisKKyAgICAgICAgIyB0cnkgZm9yIGFuIGV4YWN0IHJlc3VsdCB3aXRoIHByZWNpc2lvbiArMQorICAgICAgICBpZiBhbnMgaXMgTm9uZToKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX3Bvd2VyX2V4YWN0KG90aGVyLCBjb250ZXh0LnByZWMgKyAxKQorICAgICAgICAgICAgaWYgYW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIHJlc3VsdF9zaWduID09IDE6CisgICAgICAgICAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoMSwgYW5zLl9pbnQsIGFucy5fZXhwKQorICAgICAgICAgICAgICAgIGV4YWN0ID0gVHJ1ZQorCisgICAgICAgICMgdXN1YWwgY2FzZTogaW5leGFjdCByZXN1bHQsIHgqKnkgY29tcHV0ZWQgZGlyZWN0bHkgYXMgZXhwKHkqbG9nKHgpKQorICAgICAgICBpZiBhbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHAgPSBjb250ZXh0LnByZWMKKyAgICAgICAgICAgIHggPSBfV29ya1JlcChzZWxmKQorICAgICAgICAgICAgeGMsIHhlID0geC5pbnQsIHguZXhwCisgICAgICAgICAgICB5ID0gX1dvcmtSZXAob3RoZXIpCisgICAgICAgICAgICB5YywgeWUgPSB5LmludCwgeS5leHAKKyAgICAgICAgICAgIGlmIHkuc2lnbiA9PSAxOgorICAgICAgICAgICAgICAgIHljID0gLXljCisKKyAgICAgICAgICAgICMgY29tcHV0ZSBjb3JyZWN0bHkgcm91bmRlZCByZXN1bHQ6ICBzdGFydCB3aXRoIHByZWNpc2lvbiArMywKKyAgICAgICAgICAgICMgdGhlbiBpbmNyZWFzZSBwcmVjaXNpb24gdW50aWwgcmVzdWx0IGlzIHVuYW1iaWd1b3VzbHkgcm91bmRhYmxlCisgICAgICAgICAgICBleHRyYSA9IDMKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgY29lZmYsIGV4cCA9IF9kcG93ZXIoeGMsIHhlLCB5YywgeWUsIHArZXh0cmEpCisgICAgICAgICAgICAgICAgaWYgY29lZmYgJSAoNSoxMCoqKGxlbihzdHIoY29lZmYpKS1wLTEpKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleHRyYSArPSAzCisKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUocmVzdWx0X3NpZ24sIHN0cihjb2VmZiksIGV4cCkKKworICAgICAgICAjIHVubGlrZSBleHAsIGxuIGFuZCBsb2cxMCwgdGhlIHBvd2VyIGZ1bmN0aW9uIHJlc3BlY3RzIHRoZQorICAgICAgICAjIHJvdW5kaW5nIG1vZGU7IG5vIG5lZWQgdG8gc3dpdGNoIHRvIFJPVU5EX0hBTEZfRVZFTiBoZXJlCisKKyAgICAgICAgIyBUaGVyZSdzIGEgZGlmZmljdWx0eSBoZXJlIHdoZW4gJ290aGVyJyBpcyBub3QgYW4gaW50ZWdlciBhbmQKKyAgICAgICAgIyB0aGUgcmVzdWx0IGlzIGV4YWN0LiAgSW4gdGhpcyBjYXNlLCB0aGUgc3BlY2lmaWNhdGlvbgorICAgICAgICAjIHJlcXVpcmVzIHRoYXQgdGhlIEluZXhhY3QgZmxhZyBiZSByYWlzZWQgKGluIHNwaXRlIG9mCisgICAgICAgICMgZXhhY3RuZXNzKSwgYnV0IHNpbmNlIHRoZSByZXN1bHQgaXMgZXhhY3QgX2ZpeCB3b24ndCBkbyB0aGlzCisgICAgICAgICMgZm9yIHVzLiAgKENvcnJlc3BvbmRpbmdseSwgdGhlIFVuZGVyZmxvdyBzaWduYWwgc2hvdWxkIGFsc28KKyAgICAgICAgIyBiZSByYWlzZWQgZm9yIHN1Ym5vcm1hbCByZXN1bHRzLikgIFdlIGNhbid0IGRpcmVjdGx5IHJhaXNlCisgICAgICAgICMgdGhlc2Ugc2lnbmFscyBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIGNhbGxpbmcgX2ZpeCwgc2luY2UKKyAgICAgICAgIyB0aGF0IHdvdWxkIHZpb2xhdGUgdGhlIHByZWNlZGVuY2UgZm9yIHNpZ25hbHMuICBTbyB3ZSB3cmFwCisgICAgICAgICMgdGhlIC5fZml4IGNhbGwgaW4gYSB0ZW1wb3JhcnkgY29udGV4dCwgYW5kIHJlcmFpc2UKKyAgICAgICAgIyBhZnRlcndhcmRzLgorICAgICAgICBpZiBleGFjdCBhbmQgbm90IG90aGVyLl9pc2ludGVnZXIoKToKKyAgICAgICAgICAgICMgcGFkIHdpdGggemVyb3MgdXAgdG8gbGVuZ3RoIGNvbnRleHQucHJlYysxIGlmIG5lY2Vzc2FyeTsgdGhpcworICAgICAgICAgICAgIyBlbnN1cmVzIHRoYXQgdGhlIFJvdW5kZWQgc2lnbmFsIHdpbGwgYmUgcmFpc2VkLgorICAgICAgICAgICAgaWYgbGVuKGFucy5faW50KSA8PSBjb250ZXh0LnByZWM6CisgICAgICAgICAgICAgICAgZXhwZGlmZiA9IGNvbnRleHQucHJlYyArIDEgLSBsZW4oYW5zLl9pbnQpCisgICAgICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShhbnMuX3NpZ24sIGFucy5faW50KycwJypleHBkaWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zLl9leHAtZXhwZGlmZikKKworICAgICAgICAgICAgIyBjcmVhdGUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGNvbnRleHQsIHdpdGggY2xlYXJlZCBmbGFncy90cmFwcworICAgICAgICAgICAgbmV3Y29udGV4dCA9IGNvbnRleHQuY29weSgpCisgICAgICAgICAgICBuZXdjb250ZXh0LmNsZWFyX2ZsYWdzKCkKKyAgICAgICAgICAgIGZvciBleGNlcHRpb24gaW4gX3NpZ25hbHM6CisgICAgICAgICAgICAgICAgbmV3Y29udGV4dC50cmFwc1tleGNlcHRpb25dID0gMAorCisgICAgICAgICAgICAjIHJvdW5kIGluIHRoZSBuZXcgY29udGV4dAorICAgICAgICAgICAgYW5zID0gYW5zLl9maXgobmV3Y29udGV4dCkKKworICAgICAgICAgICAgIyByYWlzZSBJbmV4YWN0LCBhbmQgaWYgbmVjZXNzYXJ5LCBVbmRlcmZsb3cKKyAgICAgICAgICAgIG5ld2NvbnRleHQuX3JhaXNlX2Vycm9yKEluZXhhY3QpCisgICAgICAgICAgICBpZiBuZXdjb250ZXh0LmZsYWdzW1N1Ym5vcm1hbF06CisgICAgICAgICAgICAgICAgbmV3Y29udGV4dC5fcmFpc2VfZXJyb3IoVW5kZXJmbG93KQorCisgICAgICAgICAgICAjIHByb3BhZ2F0ZSBzaWduYWxzIHRvIHRoZSBvcmlnaW5hbCBjb250ZXh0OyBfZml4IGNvdWxkCisgICAgICAgICAgICAjIGhhdmUgcmFpc2VkIGFueSBvZiBPdmVyZmxvdywgVW5kZXJmbG93LCBTdWJub3JtYWwsCisgICAgICAgICAgICAjIEluZXhhY3QsIFJvdW5kZWQsIENsYW1wZWQuICBPdmVyZmxvdyBuZWVkcyB0aGUgY29ycmVjdAorICAgICAgICAgICAgIyBhcmd1bWVudHMuICBOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIHRoZSBleGNlcHRpb25zIGlzCisgICAgICAgICAgICAjIGltcG9ydGFudCBoZXJlLgorICAgICAgICAgICAgaWYgbmV3Y29udGV4dC5mbGFnc1tPdmVyZmxvd106CisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoT3ZlcmZsb3csICdhYm92ZSBFbWF4JywgYW5zLl9zaWduKQorICAgICAgICAgICAgZm9yIGV4Y2VwdGlvbiBpbiBVbmRlcmZsb3csIFN1Ym5vcm1hbCwgSW5leGFjdCwgUm91bmRlZCwgQ2xhbXBlZDoKKyAgICAgICAgICAgICAgICBpZiBuZXdjb250ZXh0LmZsYWdzW2V4Y2VwdGlvbl06CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKGV4Y2VwdGlvbikKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYW5zID0gYW5zLl9maXgoY29udGV4dCkKKworICAgICAgICByZXR1cm4gYW5zCisKKyAgICBkZWYgX19ycG93X18oc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlN3YXBzIHNlbGYvb3RoZXIgYW5kIHJldHVybnMgX19wb3dfXy4iIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlcikKKyAgICAgICAgaWYgb3RoZXIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByZXR1cm4gb3RoZXIKKyAgICAgICAgcmV0dXJuIG90aGVyLl9fcG93X18oc2VsZiwgY29udGV4dD1jb250ZXh0KQorCisgICAgZGVmIG5vcm1hbGl6ZShzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJOb3JtYWxpemUtIHN0cmlwIHRyYWlsaW5nIDBzLCBjaGFuZ2UgYW55dGhpbmcgZXF1YWwgdG8gMCB0byAwZTAiIiIKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBkdXAgPSBzZWxmLl9maXgoY29udGV4dCkKKyAgICAgICAgaWYgZHVwLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICByZXR1cm4gZHVwCisKKyAgICAgICAgaWYgbm90IGR1cDoKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKGR1cC5fc2lnbiwgJzAnLCAwKQorICAgICAgICBleHBfbWF4ID0gW2NvbnRleHQuRW1heCwgY29udGV4dC5FdG9wKCldW2NvbnRleHQuX2NsYW1wXQorICAgICAgICBlbmQgPSBsZW4oZHVwLl9pbnQpCisgICAgICAgIGV4cCA9IGR1cC5fZXhwCisgICAgICAgIHdoaWxlIGR1cC5faW50W2VuZC0xXSA9PSAnMCcgYW5kIGV4cCA8IGV4cF9tYXg6CisgICAgICAgICAgICBleHAgKz0gMQorICAgICAgICAgICAgZW5kIC09IDEKKyAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoZHVwLl9zaWduLCBkdXAuX2ludFs6ZW5kXSwgZXhwKQorCisgICAgZGVmIHF1YW50aXplKHNlbGYsIGV4cCwgcm91bmRpbmc9Tm9uZSwgY29udGV4dD1Ob25lLCB3YXRjaGV4cD1UcnVlKToKKyAgICAgICAgIiIiUXVhbnRpemUgc2VsZiBzbyBpdHMgZXhwb25lbnQgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiBleHAuCisKKyAgICAgICAgU2ltaWxhciB0byBzZWxmLl9yZXNjYWxlKGV4cC5fZXhwKSBidXQgd2l0aCBlcnJvciBjaGVja2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIGV4cCA9IF9jb252ZXJ0X290aGVyKGV4cCwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKyAgICAgICAgaWYgcm91bmRpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIHJvdW5kaW5nID0gY29udGV4dC5yb3VuZGluZworCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3IgZXhwLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhleHAsIGNvbnRleHQpCisgICAgICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgICAgICBpZiBleHAuX2lzaW5maW5pdHkoKSBvciBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICAgICAgaWYgZXhwLl9pc2luZmluaXR5KCkgYW5kIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikgICMgaWYgYm90aCBhcmUgaW5mLCBpdCBpcyBPSworICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdWFudGl6ZSB3aXRoIG9uZSBJTkYnKQorCisgICAgICAgICMgaWYgd2UncmUgbm90IHdhdGNoaW5nIGV4cG9uZW50cywgZG8gYSBzaW1wbGUgcmVzY2FsZQorICAgICAgICBpZiBub3Qgd2F0Y2hleHA6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9yZXNjYWxlKGV4cC5fZXhwLCByb3VuZGluZykKKyAgICAgICAgICAgICMgcmFpc2UgSW5leGFjdCBhbmQgUm91bmRlZCB3aGVyZSBhcHByb3ByaWF0ZQorICAgICAgICAgICAgaWYgYW5zLl9leHAgPiBzZWxmLl9leHA6CisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoUm91bmRlZCkKKyAgICAgICAgICAgICAgICBpZiBhbnMgIT0gc2VsZjoKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW5leGFjdCkKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAjIGV4cC5fZXhwIHNob3VsZCBiZSBiZXR3ZWVuIEV0aW55IGFuZCBFbWF4CisgICAgICAgIGlmIG5vdCAoY29udGV4dC5FdGlueSgpIDw9IGV4cC5fZXhwIDw9IGNvbnRleHQuRW1heCk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAndGFyZ2V0IGV4cG9uZW50IG91dCBvZiBib3VuZHMgaW4gcXVhbnRpemUnKQorCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCAnMCcsIGV4cC5fZXhwKQorICAgICAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICAgICAgc2VsZl9hZGp1c3RlZCA9IHNlbGYuYWRqdXN0ZWQoKQorICAgICAgICBpZiBzZWxmX2FkanVzdGVkID4gY29udGV4dC5FbWF4OgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cG9uZW50IG9mIHF1YW50aXplIHJlc3VsdCB0b28gbGFyZ2UgZm9yIGN1cnJlbnQgY29udGV4dCcpCisgICAgICAgIGlmIHNlbGZfYWRqdXN0ZWQgLSBleHAuX2V4cCArIDEgPiBjb250ZXh0LnByZWM6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVhbnRpemUgcmVzdWx0IGhhcyB0b28gbWFueSBkaWdpdHMgZm9yIGN1cnJlbnQgY29udGV4dCcpCisKKyAgICAgICAgYW5zID0gc2VsZi5fcmVzY2FsZShleHAuX2V4cCwgcm91bmRpbmcpCisgICAgICAgIGlmIGFucy5hZGp1c3RlZCgpID4gY29udGV4dC5FbWF4OgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cG9uZW50IG9mIHF1YW50aXplIHJlc3VsdCB0b28gbGFyZ2UgZm9yIGN1cnJlbnQgY29udGV4dCcpCisgICAgICAgIGlmIGxlbihhbnMuX2ludCkgPiBjb250ZXh0LnByZWM6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncXVhbnRpemUgcmVzdWx0IGhhcyB0b28gbWFueSBkaWdpdHMgZm9yIGN1cnJlbnQgY29udGV4dCcpCisKKyAgICAgICAgIyByYWlzZSBhcHByb3ByaWF0ZSBmbGFncworICAgICAgICBpZiBhbnMgYW5kIGFucy5hZGp1c3RlZCgpIDwgY29udGV4dC5FbWluOgorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoU3Vibm9ybWFsKQorICAgICAgICBpZiBhbnMuX2V4cCA+IHNlbGYuX2V4cDoKKyAgICAgICAgICAgIGlmIGFucyAhPSBzZWxmOgorICAgICAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKEluZXhhY3QpCisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihSb3VuZGVkKQorCisgICAgICAgICMgY2FsbCB0byBmaXggdGFrZXMgY2FyZSBvZiBhbnkgbmVjZXNzYXJ5IGZvbGRkb3duLCBhbmQKKyAgICAgICAgIyBzaWduYWxzIENsYW1wZWQgaWYgbmVjZXNzYXJ5CisgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgIHJldHVybiBhbnMKKworICAgIGRlZiBzYW1lX3F1YW50dW0oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGFuZCBvdGhlciBoYXZlIHRoZSBzYW1lIGV4cG9uZW50OyBvdGhlcndpc2UKKyAgICAgICAgcmV0dXJuIEZhbHNlLgorCisgICAgICAgIElmIGVpdGhlciBvcGVyYW5kIGlzIGEgc3BlY2lhbCB2YWx1ZSwgdGhlIGZvbGxvd2luZyBydWxlcyBhcmUgdXNlZDoKKyAgICAgICAgICAgKiByZXR1cm4gVHJ1ZSBpZiBib3RoIG9wZXJhbmRzIGFyZSBpbmZpbml0aWVzCisgICAgICAgICAgICogcmV0dXJuIFRydWUgaWYgYm90aCBvcGVyYW5kcyBhcmUgTmFOcworICAgICAgICAgICAqIG90aGVyd2lzZSwgcmV0dXJuIEZhbHNlLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLmlzX25hbigpIGFuZCBvdGhlci5pc19uYW4oKSBvcgorICAgICAgICAgICAgICAgICAgICBzZWxmLmlzX2luZmluaXRlKCkgYW5kIG90aGVyLmlzX2luZmluaXRlKCkpCisgICAgICAgIHJldHVybiBzZWxmLl9leHAgPT0gb3RoZXIuX2V4cAorCisgICAgZGVmIF9yZXNjYWxlKHNlbGYsIGV4cCwgcm91bmRpbmcpOgorICAgICAgICAiIiJSZXNjYWxlIHNlbGYgc28gdGhhdCB0aGUgZXhwb25lbnQgaXMgZXhwLCBlaXRoZXIgYnkgcGFkZGluZyB3aXRoIHplcm9zCisgICAgICAgIG9yIGJ5IHRydW5jYXRpbmcgZGlnaXRzLCB1c2luZyB0aGUgZ2l2ZW4gcm91bmRpbmcgbW9kZS4KKworICAgICAgICBTcGVjaWFscyBhcmUgcmV0dXJuZWQgd2l0aG91dCBjaGFuZ2UuICBUaGlzIG9wZXJhdGlvbiBpcworICAgICAgICBxdWlldDogaXQgcmFpc2VzIG5vIGZsYWdzLCBhbmQgdXNlcyBubyBpbmZvcm1hdGlvbiBmcm9tIHRoZQorICAgICAgICBjb250ZXh0LgorCisgICAgICAgIGV4cCA9IGV4cCB0byBzY2FsZSB0byAoYW4gaW50ZWdlcikKKyAgICAgICAgcm91bmRpbmcgPSByb3VuZGluZyBtb2RlCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCAnMCcsIGV4cCkKKworICAgICAgICBpZiBzZWxmLl9leHAgPj0gZXhwOgorICAgICAgICAgICAgIyBwYWQgYW5zd2VyIHdpdGggemVyb3MgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ludCArICcwJyooc2VsZi5fZXhwIC0gZXhwKSwgZXhwKQorCisgICAgICAgICMgdG9vIG1hbnkgZGlnaXRzOyByb3VuZCBhbmQgbG9zZSBkYXRhLiAgSWYgc2VsZi5hZGp1c3RlZCgpIDwKKyAgICAgICAgIyBleHAtMSwgcmVwbGFjZSBzZWxmIGJ5IDEwKiooZXhwLTEpIGJlZm9yZSByb3VuZGluZworICAgICAgICBkaWdpdHMgPSBsZW4oc2VsZi5faW50KSArIHNlbGYuX2V4cCAtIGV4cAorICAgICAgICBpZiBkaWdpdHMgPCAwOgorICAgICAgICAgICAgc2VsZiA9IF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgJzEnLCBleHAtMSkKKyAgICAgICAgICAgIGRpZ2l0cyA9IDAKKyAgICAgICAgdGhpc19mdW5jdGlvbiA9IHNlbGYuX3BpY2tfcm91bmRpbmdfZnVuY3Rpb25bcm91bmRpbmddCisgICAgICAgIGNoYW5nZWQgPSB0aGlzX2Z1bmN0aW9uKHNlbGYsIGRpZ2l0cykKKyAgICAgICAgY29lZmYgPSBzZWxmLl9pbnRbOmRpZ2l0c10gb3IgJzAnCisgICAgICAgIGlmIGNoYW5nZWQgPT0gMToKKyAgICAgICAgICAgIGNvZWZmID0gc3RyKGludChjb2VmZikrMSkKKyAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgY29lZmYsIGV4cCkKKworICAgIGRlZiBfcm91bmQoc2VsZiwgcGxhY2VzLCByb3VuZGluZyk6CisgICAgICAgICIiIlJvdW5kIGEgbm9uemVybywgbm9uc3BlY2lhbCBEZWNpbWFsIHRvIGEgZml4ZWQgbnVtYmVyIG9mCisgICAgICAgIHNpZ25pZmljYW50IGZpZ3VyZXMsIHVzaW5nIHRoZSBnaXZlbiByb3VuZGluZyBtb2RlLgorCisgICAgICAgIEluZmluaXRpZXMsIE5hTnMgYW5kIHplcm9zIGFyZSByZXR1cm5lZCB1bmFsdGVyZWQuCisKKyAgICAgICAgVGhpcyBvcGVyYXRpb24gaXMgcXVpZXQ6IGl0IHJhaXNlcyBubyBmbGFncywgYW5kIHVzZXMgbm8KKyAgICAgICAgaW5mb3JtYXRpb24gZnJvbSB0aGUgY29udGV4dC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgcGxhY2VzIDw9IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJhcmd1bWVudCBzaG91bGQgYmUgYXQgbGVhc3QgMSBpbiBfcm91bmQiKQorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKyAgICAgICAgYW5zID0gc2VsZi5fcmVzY2FsZShzZWxmLmFkanVzdGVkKCkrMS1wbGFjZXMsIHJvdW5kaW5nKQorICAgICAgICAjIGl0IGNhbiBoYXBwZW4gdGhhdCB0aGUgcmVzY2FsZSBhbHRlcnMgdGhlIGFkanVzdGVkIGV4cG9uZW50OworICAgICAgICAjIGZvciBleGFtcGxlIHdoZW4gcm91bmRpbmcgOTkuOTcgdG8gMyBzaWduaWZpY2FudCBmaWd1cmVzLgorICAgICAgICAjIFdoZW4gdGhpcyBoYXBwZW5zIHdlIGVuZCB1cCB3aXRoIGFuIGV4dHJhIDAgYXQgdGhlIGVuZCBvZgorICAgICAgICAjIHRoZSBudW1iZXI7IGEgc2Vjb25kIHJlc2NhbGUgZml4ZXMgdGhpcy4KKyAgICAgICAgaWYgYW5zLmFkanVzdGVkKCkgIT0gc2VsZi5hZGp1c3RlZCgpOgorICAgICAgICAgICAgYW5zID0gYW5zLl9yZXNjYWxlKGFucy5hZGp1c3RlZCgpKzEtcGxhY2VzLCByb3VuZGluZykKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIHRvX2ludGVncmFsX2V4YWN0KHNlbGYsIHJvdW5kaW5nPU5vbmUsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJvdW5kcyB0byBhIG5lYXJieSBpbnRlZ2VyLgorCisgICAgICAgIElmIG5vIHJvdW5kaW5nIG1vZGUgaXMgc3BlY2lmaWVkLCB0YWtlIHRoZSByb3VuZGluZyBtb2RlIGZyb20KKyAgICAgICAgdGhlIGNvbnRleHQuICBUaGlzIG1ldGhvZCByYWlzZXMgdGhlIFJvdW5kZWQgYW5kIEluZXhhY3QgZmxhZ3MKKyAgICAgICAgd2hlbiBhcHByb3ByaWF0ZS4KKworICAgICAgICBTZWUgYWxzbzogdG9faW50ZWdyYWxfdmFsdWUsIHdoaWNoIGRvZXMgZXhhY3RseSB0aGUgc2FtZSBhcworICAgICAgICB0aGlzIG1ldGhvZCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IHJhaXNlIEluZXhhY3Qgb3IgUm91bmRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgICAgICByZXR1cm4gYW5zCisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorICAgICAgICBpZiBzZWxmLl9leHAgPj0gMDoKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoc2VsZi5fc2lnbiwgJzAnLCAwKQorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIGlmIHJvdW5kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICByb3VuZGluZyA9IGNvbnRleHQucm91bmRpbmcKKyAgICAgICAgYW5zID0gc2VsZi5fcmVzY2FsZSgwLCByb3VuZGluZykKKyAgICAgICAgaWYgYW5zICE9IHNlbGY6CisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbmV4YWN0KQorICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihSb3VuZGVkKQorICAgICAgICByZXR1cm4gYW5zCisKKyAgICBkZWYgdG9faW50ZWdyYWxfdmFsdWUoc2VsZiwgcm91bmRpbmc9Tm9uZSwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUm91bmRzIHRvIHRoZSBuZWFyZXN0IGludGVnZXIsIHdpdGhvdXQgcmFpc2luZyBpbmV4YWN0LCByb3VuZGVkLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIGlmIHJvdW5kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICByb3VuZGluZyA9IGNvbnRleHQucm91bmRpbmcKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgICAgIHJldHVybiBhbnMKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisgICAgICAgIGlmIHNlbGYuX2V4cCA+PSAwOgorICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXNjYWxlKDAsIHJvdW5kaW5nKQorCisgICAgIyB0aGUgbWV0aG9kIG5hbWUgY2hhbmdlZCwgYnV0IHdlIHByb3ZpZGUgYWxzbyB0aGUgb2xkIG9uZSwgZm9yIGNvbXBhdGliaWxpdHkKKyAgICB0b19pbnRlZ3JhbCA9IHRvX2ludGVncmFsX3ZhbHVlCisKKyAgICBkZWYgc3FydChzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHNxdWFyZSByb290IG9mIHNlbGYuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgYW5kIHNlbGYuX3NpZ24gPT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgIyBleHBvbmVudCA9IHNlbGYuX2V4cCAvLyAyLiAgc3FydCgtMCkgPSAtMAorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLCAnMCcsIHNlbGYuX2V4cCAvLyAyKQorICAgICAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICAgICAgaWYgc2VsZi5fc2lnbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sICdzcXJ0KC14KSwgeCA+IDAnKQorCisgICAgICAgICMgQXQgdGhpcyBwb2ludCBzZWxmIHJlcHJlc2VudHMgYSBwb3NpdGl2ZSBudW1iZXIuICBMZXQgcCBiZQorICAgICAgICAjIHRoZSBkZXNpcmVkIHByZWNpc2lvbiBhbmQgZXhwcmVzcyBzZWxmIGluIHRoZSBmb3JtIGMqMTAwKiplCisgICAgICAgICMgd2l0aCBjIGEgcG9zaXRpdmUgcmVhbCBudW1iZXIgYW5kIGUgYW4gaW50ZWdlciwgYyBhbmQgZQorICAgICAgICAjIGJlaW5nIGNob3NlbiBzbyB0aGF0IDEwMCoqKHAtMSkgPD0gYyA8IDEwMCoqcC4gIFRoZW4gdGhlCisgICAgICAgICMgKGV4YWN0KSBzcXVhcmUgcm9vdCBvZiBzZWxmIGlzIHNxcnQoYykqMTAqKmUsIGFuZCAxMCoqKHAtMSkKKyAgICAgICAgIyA8PSBzcXJ0KGMpIDwgMTAqKnAsIHNvIHRoZSBjbG9zZXN0IHJlcHJlc2VudGFibGUgRGVjaW1hbCBhdAorICAgICAgICAjIHByZWNpc2lvbiBwIGlzIG4qMTAqKmUgd2hlcmUgbiA9IHJvdW5kX2hhbGZfZXZlbihzcXJ0KGMpKSwKKyAgICAgICAgIyB0aGUgY2xvc2VzdCBpbnRlZ2VyIHRvIHNxcnQoYykgd2l0aCB0aGUgZXZlbiBpbnRlZ2VyIGNob3NlbgorICAgICAgICAjIGluIHRoZSBjYXNlIG9mIGEgdGllLgorICAgICAgICAjCisgICAgICAgICMgVG8gZW5zdXJlIGNvcnJlY3Qgcm91bmRpbmcgaW4gYWxsIGNhc2VzLCB3ZSB1c2UgdGhlCisgICAgICAgICMgZm9sbG93aW5nIHRyaWNrOiB3ZSBjb21wdXRlIHRoZSBzcXVhcmUgcm9vdCB0byBhbiBleHRyYQorICAgICAgICAjIHBsYWNlIChwcmVjaXNpb24gcCsxIGluc3RlYWQgb2YgcHJlY2lzaW9uIHApLCByb3VuZGluZyBkb3duLgorICAgICAgICAjIFRoZW4sIGlmIHRoZSByZXN1bHQgaXMgaW5leGFjdCBhbmQgaXRzIGxhc3QgZGlnaXQgaXMgMCBvciA1LAorICAgICAgICAjIHdlIGluY3JlYXNlIHRoZSBsYXN0IGRpZ2l0IHRvIDEgb3IgNiByZXNwZWN0aXZlbHk7IGlmIGl0J3MKKyAgICAgICAgIyBleGFjdCB3ZSBsZWF2ZSB0aGUgbGFzdCBkaWdpdCBhbG9uZS4gIE5vdyB0aGUgZmluYWwgcm91bmQgdG8KKyAgICAgICAgIyBwIHBsYWNlcyAob3IgZmV3ZXIgaW4gdGhlIGNhc2Ugb2YgdW5kZXJmbG93KSB3aWxsIHJvdW5kCisgICAgICAgICMgY29ycmVjdGx5IGFuZCByYWlzZSB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MuCisKKyAgICAgICAgIyB1c2UgYW4gZXh0cmEgZGlnaXQgb2YgcHJlY2lzaW9uCisgICAgICAgIHByZWMgPSBjb250ZXh0LnByZWMrMQorCisgICAgICAgICMgd3JpdGUgYXJndW1lbnQgaW4gdGhlIGZvcm0gYyoxMDAqKmUgd2hlcmUgZSA9IHNlbGYuX2V4cC8vMgorICAgICAgICAjIGlzIHRoZSAnaWRlYWwnIGV4cG9uZW50LCB0byBiZSB1c2VkIGlmIHRoZSBzcXVhcmUgcm9vdCBpcworICAgICAgICAjIGV4YWN0bHkgcmVwcmVzZW50YWJsZS4gIGwgaXMgdGhlIG51bWJlciBvZiAnZGlnaXRzJyBvZiBjIGluCisgICAgICAgICMgYmFzZSAxMDAsIHNvIHRoYXQgMTAwKioobC0xKSA8PSBjIDwgMTAwKipsLgorICAgICAgICBvcCA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgIGUgPSBvcC5leHAgPj4gMQorICAgICAgICBpZiBvcC5leHAgJiAxOgorICAgICAgICAgICAgYyA9IG9wLmludCAqIDEwCisgICAgICAgICAgICBsID0gKGxlbihzZWxmLl9pbnQpID4+IDEpICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IG9wLmludAorICAgICAgICAgICAgbCA9IGxlbihzZWxmLl9pbnQpKzEgPj4gMQorCisgICAgICAgICMgcmVzY2FsZSBzbyB0aGF0IGMgaGFzIGV4YWN0bHkgcHJlYyBiYXNlIDEwMCAnZGlnaXRzJworICAgICAgICBzaGlmdCA9IHByZWMtbAorICAgICAgICBpZiBzaGlmdCA+PSAwOgorICAgICAgICAgICAgYyAqPSAxMDAqKnNoaWZ0CisgICAgICAgICAgICBleGFjdCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGMsIHJlbWFpbmRlciA9IGRpdm1vZChjLCAxMDAqKi1zaGlmdCkKKyAgICAgICAgICAgIGV4YWN0ID0gbm90IHJlbWFpbmRlcgorICAgICAgICBlIC09IHNoaWZ0CisKKyAgICAgICAgIyBmaW5kIG4gPSBmbG9vcihzcXJ0KGMpKSB1c2luZyBOZXd0b24ncyBtZXRob2QKKyAgICAgICAgbiA9IDEwKipwcmVjCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBxID0gYy8vbgorICAgICAgICAgICAgaWYgbiA8PSBxOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG4gPSBuICsgcSA+PiAxCisgICAgICAgIGV4YWN0ID0gZXhhY3QgYW5kIG4qbiA9PSBjCisKKyAgICAgICAgaWYgZXhhY3Q6CisgICAgICAgICAgICAjIHJlc3VsdCBpcyBleGFjdDsgcmVzY2FsZSB0byB1c2UgaWRlYWwgZXhwb25lbnQgZQorICAgICAgICAgICAgaWYgc2hpZnQgPj0gMDoKKyAgICAgICAgICAgICAgICAjIGFzc2VydCBuICUgMTAqKnNoaWZ0ID09IDAKKyAgICAgICAgICAgICAgICBuIC8vPSAxMCoqc2hpZnQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbiAqPSAxMCoqLXNoaWZ0CisgICAgICAgICAgICBlICs9IHNoaWZ0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHJlc3VsdCBpcyBub3QgZXhhY3Q7IGZpeCBsYXN0IGRpZ2l0IGFzIGRlc2NyaWJlZCBhYm92ZQorICAgICAgICAgICAgaWYgbiAlIDUgPT0gMDoKKyAgICAgICAgICAgICAgICBuICs9IDEKKworICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKDAsIHN0cihuKSwgZSkKKworICAgICAgICAjIHJvdW5kLCBhbmQgZml0IHRvIGN1cnJlbnQgY29udGV4dAorICAgICAgICBjb250ZXh0ID0gY29udGV4dC5fc2hhbGxvd19jb3B5KCkKKyAgICAgICAgcm91bmRpbmcgPSBjb250ZXh0Ll9zZXRfcm91bmRpbmcoUk9VTkRfSEFMRl9FVkVOKQorICAgICAgICBhbnMgPSBhbnMuX2ZpeChjb250ZXh0KQorICAgICAgICBjb250ZXh0LnJvdW5kaW5nID0gcm91bmRpbmcKKworICAgICAgICByZXR1cm4gYW5zCisKKyAgICBkZWYgbWF4KHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBsYXJnZXIgdmFsdWUuCisKKyAgICAgICAgTGlrZSBtYXgoc2VsZiwgb3RoZXIpIGV4Y2VwdCBpZiBvbmUgaXMgbm90IGEgbnVtYmVyLCByZXR1cm5zCisgICAgICAgIE5hTiAoYW5kIHNpZ25hbHMgaWYgb25lIGlzIHNOYU4pLiAgQWxzbyByb3VuZHMuCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICAjIElmIG9uZSBvcGVyYW5kIGlzIGEgcXVpZXQgTmFOIGFuZCB0aGUgb3RoZXIgaXMgbnVtYmVyLCB0aGVuIHRoZQorICAgICAgICAgICAgIyBudW1iZXIgaXMgYWx3YXlzIHJldHVybmVkCisgICAgICAgICAgICBzbiA9IHNlbGYuX2lzbmFuKCkKKyAgICAgICAgICAgIG9uID0gb3RoZXIuX2lzbmFuKCkKKyAgICAgICAgICAgIGlmIHNuIG9yIG9uOgorICAgICAgICAgICAgICAgIGlmIG9uID09IDEgYW5kIHNuID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgICAgICBpZiBzbiA9PSAxIGFuZCBvbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorCisgICAgICAgIGMgPSBzZWxmLl9jbXAob3RoZXIpCisgICAgICAgIGlmIGMgPT0gMDoKKyAgICAgICAgICAgICMgSWYgYm90aCBvcGVyYW5kcyBhcmUgZmluaXRlIGFuZCBlcXVhbCBpbiBudW1lcmljYWwgdmFsdWUKKyAgICAgICAgICAgICMgdGhlbiBhbiBvcmRlcmluZyBpcyBhcHBsaWVkOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBJZiB0aGUgc2lnbnMgZGlmZmVyIHRoZW4gbWF4IHJldHVybnMgdGhlIG9wZXJhbmQgd2l0aCB0aGUKKyAgICAgICAgICAgICMgcG9zaXRpdmUgc2lnbiBhbmQgbWluIHJldHVybnMgdGhlIG9wZXJhbmQgd2l0aCB0aGUgbmVnYXRpdmUgc2lnbgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBJZiB0aGUgc2lnbnMgYXJlIHRoZSBzYW1lIHRoZW4gdGhlIGV4cG9uZW50IGlzIHVzZWQgdG8gc2VsZWN0CisgICAgICAgICAgICAjIHRoZSByZXN1bHQuICBUaGlzIGlzIGV4YWN0bHkgdGhlIG9yZGVyaW5nIHVzZWQgaW4gY29tcGFyZV90b3RhbC4KKyAgICAgICAgICAgIGMgPSBzZWxmLmNvbXBhcmVfdG90YWwob3RoZXIpCisKKyAgICAgICAgaWYgYyA9PSAtMToKKyAgICAgICAgICAgIGFucyA9IG90aGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbnMgPSBzZWxmCisKKyAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICBkZWYgbWluKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzbWFsbGVyIHZhbHVlLgorCisgICAgICAgIExpa2UgbWluKHNlbGYsIG90aGVyKSBleGNlcHQgaWYgb25lIGlzIG5vdCBhIG51bWJlciwgcmV0dXJucworICAgICAgICBOYU4gKGFuZCBzaWduYWxzIGlmIG9uZSBpcyBzTmFOKS4gIEFsc28gcm91bmRzLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG90aGVyLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgIyBJZiBvbmUgb3BlcmFuZCBpcyBhIHF1aWV0IE5hTiBhbmQgdGhlIG90aGVyIGlzIG51bWJlciwgdGhlbiB0aGUKKyAgICAgICAgICAgICMgbnVtYmVyIGlzIGFsd2F5cyByZXR1cm5lZAorICAgICAgICAgICAgc24gPSBzZWxmLl9pc25hbigpCisgICAgICAgICAgICBvbiA9IG90aGVyLl9pc25hbigpCisgICAgICAgICAgICBpZiBzbiBvciBvbjoKKyAgICAgICAgICAgICAgICBpZiBvbiA9PSAxIGFuZCBzbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4KGNvbnRleHQpCisgICAgICAgICAgICAgICAgaWYgc24gPT0gMSBhbmQgb24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG90aGVyLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKworICAgICAgICBjID0gc2VsZi5fY21wKG90aGVyKQorICAgICAgICBpZiBjID09IDA6CisgICAgICAgICAgICBjID0gc2VsZi5jb21wYXJlX3RvdGFsKG90aGVyKQorCisgICAgICAgIGlmIGMgPT0gLTE6CisgICAgICAgICAgICBhbnMgPSBzZWxmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbnMgPSBvdGhlcgorCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIF9pc2ludGVnZXIoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgd2hldGhlciBzZWxmIGlzIGFuIGludGVnZXIiIiIKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLl9leHAgPj0gMDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJlc3QgPSBzZWxmLl9pbnRbc2VsZi5fZXhwOl0KKyAgICAgICAgcmV0dXJuIHJlc3QgPT0gJzAnKmxlbihyZXN0KQorCisgICAgZGVmIF9pc2V2ZW4oc2VsZik6CisgICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiBzZWxmIGlzIGV2ZW4uICBBc3N1bWVzIHNlbGYgaXMgYW4gaW50ZWdlci4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYgb3Igc2VsZi5fZXhwID4gMDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBzZWxmLl9pbnRbLTErc2VsZi5fZXhwXSBpbiAnMDI0NjgnCisKKyAgICBkZWYgYWRqdXN0ZWQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgYWRqdXN0ZWQgZXhwb25lbnQgb2Ygc2VsZiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZXhwICsgbGVuKHNlbGYuX2ludCkgLSAxCisgICAgICAgICMgSWYgTmFOIG9yIEluZmluaXR5LCBzZWxmLl9leHAgaXMgc3RyaW5nCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGNhbm9uaWNhbChzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzYW1lIERlY2ltYWwgb2JqZWN0LgorCisgICAgICAgIEFzIHdlIGRvIG5vdCBoYXZlIGRpZmZlcmVudCBlbmNvZGluZ3MgZm9yIHRoZSBzYW1lIG51bWJlciwgdGhlCisgICAgICAgIHJlY2VpdmVkIG9iamVjdCBhbHJlYWR5IGlzIGluIGl0cyBjYW5vbmljYWwgZm9ybS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgY29tcGFyZV9zaWduYWwoc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkNvbXBhcmVzIHNlbGYgdG8gdGhlIG90aGVyIG9wZXJhbmQgbnVtZXJpY2FsbHkuCisKKyAgICAgICAgSXQncyBwcmV0dHkgbXVjaCBsaWtlIGNvbXBhcmUoKSwgYnV0IGFsbCBOYU5zIHNpZ25hbCwgd2l0aCBzaWduYWxpbmcKKyAgICAgICAgTmFOcyB0YWtpbmcgcHJlY2VkZW5jZSBvdmVyIHF1aWV0IE5hTnMuCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0ID0gVHJ1ZSkKKyAgICAgICAgYW5zID0gc2VsZi5fY29tcGFyZV9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisgICAgICAgIHJldHVybiBzZWxmLmNvbXBhcmUob3RoZXIsIGNvbnRleHQ9Y29udGV4dCkKKworICAgIGRlZiBjb21wYXJlX3RvdGFsKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyZXMgc2VsZiB0byBvdGhlciB1c2luZyB0aGUgYWJzdHJhY3QgcmVwcmVzZW50YXRpb25zLgorCisgICAgICAgIFRoaXMgaXMgbm90IGxpa2UgdGhlIHN0YW5kYXJkIGNvbXBhcmUsIHdoaWNoIHVzZSB0aGVpciBudW1lcmljYWwKKyAgICAgICAgdmFsdWUuIE5vdGUgdGhhdCBhIHRvdGFsIG9yZGVyaW5nIGlzIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBhYnN0cmFjdAorICAgICAgICByZXByZXNlbnRhdGlvbnMuCisgICAgICAgICIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgIyBpZiBvbmUgaXMgbmVnYXRpdmUgYW5kIHRoZSBvdGhlciBpcyBwb3NpdGl2ZSwgaXQncyBlYXN5CisgICAgICAgIGlmIHNlbGYuX3NpZ24gYW5kIG5vdCBvdGhlci5fc2lnbjoKKyAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKyAgICAgICAgaWYgbm90IHNlbGYuX3NpZ24gYW5kIG90aGVyLl9zaWduOgorICAgICAgICAgICAgcmV0dXJuIF9PbmUKKyAgICAgICAgc2lnbiA9IHNlbGYuX3NpZ24KKworICAgICAgICAjIGxldCdzIGhhbmRsZSBib3RoIE5hTiB0eXBlcworICAgICAgICBzZWxmX25hbiA9IHNlbGYuX2lzbmFuKCkKKyAgICAgICAgb3RoZXJfbmFuID0gb3RoZXIuX2lzbmFuKCkKKyAgICAgICAgaWYgc2VsZl9uYW4gb3Igb3RoZXJfbmFuOgorICAgICAgICAgICAgaWYgc2VsZl9uYW4gPT0gb3RoZXJfbmFuOgorICAgICAgICAgICAgICAgICMgY29tcGFyZSBwYXlsb2FkcyBhcyB0aG91Z2ggdGhleSdyZSBpbnRlZ2VycworICAgICAgICAgICAgICAgIHNlbGZfa2V5ID0gbGVuKHNlbGYuX2ludCksIHNlbGYuX2ludAorICAgICAgICAgICAgICAgIG90aGVyX2tleSA9IGxlbihvdGhlci5faW50KSwgb3RoZXIuX2ludAorICAgICAgICAgICAgICAgIGlmIHNlbGZfa2V5IDwgb3RoZXJfa2V5OgorICAgICAgICAgICAgICAgICAgICBpZiBzaWduOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9PbmUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKyAgICAgICAgICAgICAgICBpZiBzZWxmX2tleSA+IG90aGVyX2tleToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2lnbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgICAgICAgICAgcmV0dXJuIF9aZXJvCisKKyAgICAgICAgICAgIGlmIHNpZ246CisgICAgICAgICAgICAgICAgaWYgc2VsZl9uYW4gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9OZWdhdGl2ZU9uZQorICAgICAgICAgICAgICAgIGlmIG90aGVyX25hbiA9PSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX09uZQorICAgICAgICAgICAgICAgIGlmIHNlbGZfbmFuID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKyAgICAgICAgICAgICAgICBpZiBvdGhlcl9uYW4gPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9PbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZl9uYW4gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9PbmUKKyAgICAgICAgICAgICAgICBpZiBvdGhlcl9uYW4gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9OZWdhdGl2ZU9uZQorICAgICAgICAgICAgICAgIGlmIHNlbGZfbmFuID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgICAgICAgICAgaWYgb3RoZXJfbmFuID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVPbmUKKworICAgICAgICBpZiBzZWxmIDwgb3RoZXI6CisgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlT25lCisgICAgICAgIGlmIHNlbGYgPiBvdGhlcjoKKyAgICAgICAgICAgIHJldHVybiBfT25lCisKKyAgICAgICAgaWYgc2VsZi5fZXhwIDwgb3RoZXIuX2V4cDoKKyAgICAgICAgICAgIGlmIHNpZ246CisgICAgICAgICAgICAgICAgcmV0dXJuIF9PbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9OZWdhdGl2ZU9uZQorICAgICAgICBpZiBzZWxmLl9leHAgPiBvdGhlci5fZXhwOgorICAgICAgICAgICAgaWYgc2lnbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gX05lZ2F0aXZlT25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBfT25lCisgICAgICAgIHJldHVybiBfWmVybworCisKKyAgICBkZWYgY29tcGFyZV90b3RhbF9tYWcoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJlcyBzZWxmIHRvIG90aGVyIHVzaW5nIGFic3RyYWN0IHJlcHIuLCBpZ25vcmluZyBzaWduLgorCisgICAgICAgIExpa2UgY29tcGFyZV90b3RhbCwgYnV0IHdpdGggb3BlcmFuZCdzIHNpZ24gaWdub3JlZCBhbmQgYXNzdW1lZCB0byBiZSAwLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIHMgPSBzZWxmLmNvcHlfYWJzKCkKKyAgICAgICAgbyA9IG90aGVyLmNvcHlfYWJzKCkKKyAgICAgICAgcmV0dXJuIHMuY29tcGFyZV90b3RhbChvKQorCisgICAgZGVmIGNvcHlfYWJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgY29weSB3aXRoIHRoZSBzaWduIHNldCB0byAwLiAiIiIKKyAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMCwgc2VsZi5faW50LCBzZWxmLl9leHAsIHNlbGYuX2lzX3NwZWNpYWwpCisKKyAgICBkZWYgY29weV9uZWdhdGUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgYSBjb3B5IHdpdGggdGhlIHNpZ24gaW52ZXJ0ZWQuIiIiCisgICAgICAgIGlmIHNlbGYuX3NpZ246CisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZSgwLCBzZWxmLl9pbnQsIHNlbGYuX2V4cCwgc2VsZi5faXNfc3BlY2lhbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDEsIHNlbGYuX2ludCwgc2VsZi5fZXhwLCBzZWxmLl9pc19zcGVjaWFsKQorCisgICAgZGVmIGNvcHlfc2lnbihzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybnMgc2VsZiB3aXRoIHRoZSBzaWduIG9mIG90aGVyLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKG90aGVyLl9zaWduLCBzZWxmLl9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2V4cCwgc2VsZi5faXNfc3BlY2lhbCkKKworICAgIGRlZiBleHAoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyBlICoqIHNlbGYuIiIiCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgICMgZXhwKE5hTikgPSBOYU4KKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAjIGV4cCgtSW5maW5pdHkpID0gMAorICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgPT0gLTE6CisgICAgICAgICAgICByZXR1cm4gX1plcm8KKworICAgICAgICAjIGV4cCgwKSA9IDEKKyAgICAgICAgaWYgbm90IHNlbGY6CisgICAgICAgICAgICByZXR1cm4gX09uZQorCisgICAgICAgICMgZXhwKEluZmluaXR5KSA9IEluZmluaXR5CisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKworICAgICAgICAjIHRoZSByZXN1bHQgaXMgbm93IGd1YXJhbnRlZWQgdG8gYmUgaW5leGFjdCAodGhlIHRydWUKKyAgICAgICAgIyBtYXRoZW1hdGljYWwgcmVzdWx0IGlzIHRyYW5zY2VuZGVudGFsKS4gVGhlcmUncyBubyBuZWVkIHRvCisgICAgICAgICMgcmFpc2UgUm91bmRlZCBhbmQgSW5leGFjdCBoZXJlLS0tdGhleSdsbCBhbHdheXMgYmUgcmFpc2VkIGFzCisgICAgICAgICMgYSByZXN1bHQgb2YgdGhlIGNhbGwgdG8gX2ZpeC4KKyAgICAgICAgcCA9IGNvbnRleHQucHJlYworICAgICAgICBhZGogPSBzZWxmLmFkanVzdGVkKCkKKworICAgICAgICAjIHdlIG9ubHkgbmVlZCB0byBkbyBhbnkgY29tcHV0YXRpb24gZm9yIHF1aXRlIGEgc21hbGwgcmFuZ2UKKyAgICAgICAgIyBvZiBhZGp1c3RlZCBleHBvbmVudHMtLS1mb3IgZXhhbXBsZSwgLTI5IDw9IGFkaiA8PSAxMCBmb3IKKyAgICAgICAgIyB0aGUgZGVmYXVsdCBjb250ZXh0LiAgRm9yIHNtYWxsZXIgZXhwb25lbnQgdGhlIHJlc3VsdCBpcworICAgICAgICAjIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gMSBhdCB0aGUgZ2l2ZW4gcHJlY2lzaW9uLCB3aGlsZSBmb3IKKyAgICAgICAgIyBsYXJnZXIgZXhwb25lbnQgdGhlIHJlc3VsdCBlaXRoZXIgb3ZlcmZsb3dzIG9yIHVuZGVyZmxvd3MuCisgICAgICAgIGlmIHNlbGYuX3NpZ24gPT0gMCBhbmQgYWRqID4gbGVuKHN0cigoY29udGV4dC5FbWF4KzEpKjMpKToKKyAgICAgICAgICAgICMgb3ZlcmZsb3cKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoMCwgJzEnLCBjb250ZXh0LkVtYXgrMSkKKyAgICAgICAgZWxpZiBzZWxmLl9zaWduID09IDEgYW5kIGFkaiA+IGxlbihzdHIoKC1jb250ZXh0LkV0aW55KCkrMSkqMykpOgorICAgICAgICAgICAgIyB1bmRlcmZsb3cgdG8gMAorICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZSgwLCAnMScsIGNvbnRleHQuRXRpbnkoKS0xKQorICAgICAgICBlbGlmIHNlbGYuX3NpZ24gPT0gMCBhbmQgYWRqIDwgLXA6CisgICAgICAgICAgICAjIHArMSBkaWdpdHM7IGZpbmFsIHJvdW5kIHdpbGwgcmFpc2UgY29ycmVjdCBmbGFncworICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZSgwLCAnMScgKyAnMCcqKHAtMSkgKyAnMScsIC1wKQorICAgICAgICBlbGlmIHNlbGYuX3NpZ24gPT0gMSBhbmQgYWRqIDwgLXAtMToKKyAgICAgICAgICAgICMgcCsxIGRpZ2l0czsgZmluYWwgcm91bmQgd2lsbCByYWlzZSBjb3JyZWN0IGZsYWdzCisgICAgICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKDAsICc5JyoocCsxKSwgLXAtMSkKKyAgICAgICAgIyBnZW5lcmFsIGNhc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgICAgIGMsIGUgPSBvcC5pbnQsIG9wLmV4cAorICAgICAgICAgICAgaWYgb3Auc2lnbiA9PSAxOgorICAgICAgICAgICAgICAgIGMgPSAtYworCisgICAgICAgICAgICAjIGNvbXB1dGUgY29ycmVjdGx5IHJvdW5kZWQgcmVzdWx0OiBpbmNyZWFzZSBwcmVjaXNpb24gYnkKKyAgICAgICAgICAgICMgMyBkaWdpdHMgYXQgYSB0aW1lIHVudGlsIHdlIGdldCBhbiB1bmFtYmlndW91c2x5CisgICAgICAgICAgICAjIHJvdW5kYWJsZSByZXN1bHQKKyAgICAgICAgICAgIGV4dHJhID0gMworICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBjb2VmZiwgZXhwID0gX2RleHAoYywgZSwgcCtleHRyYSkKKyAgICAgICAgICAgICAgICBpZiBjb2VmZiAlICg1KjEwKioobGVuKHN0cihjb2VmZikpLXAtMSkpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4dHJhICs9IDMKKworICAgICAgICAgICAgYW5zID0gX2RlY19mcm9tX3RyaXBsZSgwLCBzdHIoY29lZmYpLCBleHApCisKKyAgICAgICAgIyBhdCB0aGlzIHN0YWdlLCBhbnMgc2hvdWxkIHJvdW5kIGNvcnJlY3RseSB3aXRoICphbnkqCisgICAgICAgICMgcm91bmRpbmcgbW9kZSwgbm90IGp1c3Qgd2l0aCBST1VORF9IQUxGX0VWRU4KKyAgICAgICAgY29udGV4dCA9IGNvbnRleHQuX3NoYWxsb3dfY29weSgpCisgICAgICAgIHJvdW5kaW5nID0gY29udGV4dC5fc2V0X3JvdW5kaW5nKFJPVU5EX0hBTEZfRVZFTikKKyAgICAgICAgYW5zID0gYW5zLl9maXgoY29udGV4dCkKKyAgICAgICAgY29udGV4dC5yb3VuZGluZyA9IHJvdW5kaW5nCisKKyAgICAgICAgcmV0dXJuIGFucworCisgICAgZGVmIGlzX2Nhbm9uaWNhbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBpcyBjYW5vbmljYWw7IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgQ3VycmVudGx5LCB0aGUgZW5jb2Rpbmcgb2YgYSBEZWNpbWFsIGluc3RhbmNlIGlzIGFsd2F5cworICAgICAgICBjYW5vbmljYWwsIHNvIHRoaXMgbWV0aG9kIHJldHVybnMgVHJ1ZSBmb3IgYW55IERlY2ltYWwuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGlzX2Zpbml0ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBpcyBmaW5pdGU7IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgQSBEZWNpbWFsIGluc3RhbmNlIGlzIGNvbnNpZGVyZWQgZmluaXRlIGlmIGl0IGlzIG5laXRoZXIKKyAgICAgICAgaW5maW5pdGUgbm9yIGEgTmFOLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9pc19zcGVjaWFsCisKKyAgICBkZWYgaXNfaW5maW5pdGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgaW5maW5pdGU7IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9leHAgPT0gJ0YnCisKKyAgICBkZWYgaXNfbmFuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIGEgcU5hTiBvciBzTmFOOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZXhwIGluICgnbicsICdOJykKKworICAgIGRlZiBpc19ub3JtYWwoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBpcyBhIG5vcm1hbCBudW1iZXI7IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuIiIiCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igbm90IHNlbGY6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgICAgICByZXR1cm4gY29udGV4dC5FbWluIDw9IHNlbGYuYWRqdXN0ZWQoKQorCisgICAgZGVmIGlzX3FuYW4oc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgYSBxdWlldCBOYU47IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9leHAgPT0gJ24nCisKKyAgICBkZWYgaXNfc2lnbmVkKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBzZWxmIGlzIG5lZ2F0aXZlOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2lnbiA9PSAxCisKKyAgICBkZWYgaXNfc25hbihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgc2VsZiBpcyBhIHNpZ25hbGluZyBOYU47IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9leHAgPT0gJ04nCisKKyAgICBkZWYgaXNfc3Vibm9ybWFsKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgc3Vibm9ybWFsOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsIG9yIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuYWRqdXN0ZWQoKSA8IGNvbnRleHQuRW1pbgorCisgICAgZGVmIGlzX3plcm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgYSB6ZXJvOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLiIiIgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX2lzX3NwZWNpYWwgYW5kIHNlbGYuX2ludCA9PSAnMCcKKworICAgIGRlZiBfbG5fZXhwX2JvdW5kKHNlbGYpOgorICAgICAgICAiIiJDb21wdXRlIGEgbG93ZXIgYm91bmQgZm9yIHRoZSBhZGp1c3RlZCBleHBvbmVudCBvZiBzZWxmLmxuKCkuCisgICAgICAgIEluIG90aGVyIHdvcmRzLCBjb21wdXRlIHIgc3VjaCB0aGF0IHNlbGYubG4oKSA+PSAxMCoqci4gIEFzc3VtZXMKKyAgICAgICAgdGhhdCBzZWxmIGlzIGZpbml0ZSBhbmQgcG9zaXRpdmUgYW5kIHRoYXQgc2VsZiAhPSAxLgorICAgICAgICAiIiIKKworICAgICAgICAjIGZvciAwLjEgPD0geCA8PSAxMCB3ZSB1c2UgdGhlIGluZXF1YWxpdGllcyAxLTEveCA8PSBsbih4KSA8PSB4LTEKKyAgICAgICAgYWRqID0gc2VsZi5fZXhwICsgbGVuKHNlbGYuX2ludCkgLSAxCisgICAgICAgIGlmIGFkaiA+PSAxOgorICAgICAgICAgICAgIyBhcmd1bWVudCA+PSAxMDsgd2UgdXNlIDIzLzEwID0gMi4zIGFzIGEgbG93ZXIgYm91bmQgZm9yIGxuKDEwKQorICAgICAgICAgICAgcmV0dXJuIGxlbihzdHIoYWRqKjIzLy8xMCkpIC0gMQorICAgICAgICBpZiBhZGogPD0gLTI6CisgICAgICAgICAgICAjIGFyZ3VtZW50IDw9IDAuMQorICAgICAgICAgICAgcmV0dXJuIGxlbihzdHIoKC0xLWFkaikqMjMvLzEwKSkgLSAxCisgICAgICAgIG9wID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgYywgZSA9IG9wLmludCwgb3AuZXhwCisgICAgICAgIGlmIGFkaiA9PSAwOgorICAgICAgICAgICAgIyAxIDwgc2VsZiA8IDEwCisgICAgICAgICAgICBudW0gPSBzdHIoYy0xMCoqLWUpCisgICAgICAgICAgICBkZW4gPSBzdHIoYykKKyAgICAgICAgICAgIHJldHVybiBsZW4obnVtKSAtIGxlbihkZW4pIC0gKG51bSA8IGRlbikKKyAgICAgICAgIyBhZGogPT0gLTEsIDAuMSA8PSBzZWxmIDwgMQorICAgICAgICByZXR1cm4gZSArIGxlbihzdHIoMTAqKi1lIC0gYykpIC0gMQorCisKKyAgICBkZWYgbG4oc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbmF0dXJhbCAoYmFzZSBlKSBsb2dhcml0aG0gb2Ygc2VsZi4iIiIKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgIyBsbihOYU4pID0gTmFOCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMoY29udGV4dD1jb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgIyBsbigwLjApID09IC1JbmZpbml0eQorICAgICAgICBpZiBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVJbmZpbml0eQorCisgICAgICAgICMgbG4oSW5maW5pdHkpID0gSW5maW5pdHkKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpID09IDE6CisgICAgICAgICAgICByZXR1cm4gX0luZmluaXR5CisKKyAgICAgICAgIyBsbigxLjApID09IDAuMAorICAgICAgICBpZiBzZWxmID09IF9PbmU6CisgICAgICAgICAgICByZXR1cm4gX1plcm8KKworICAgICAgICAjIGxuKG5lZ2F0aXZlKSByYWlzZXMgSW52YWxpZE9wZXJhdGlvbgorICAgICAgICBpZiBzZWxmLl9zaWduID09IDE6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG4gb2YgYSBuZWdhdGl2ZSB2YWx1ZScpCisKKyAgICAgICAgIyByZXN1bHQgaXMgaXJyYXRpb25hbCwgc28gbmVjZXNzYXJpbHkgaW5leGFjdAorICAgICAgICBvcCA9IF9Xb3JrUmVwKHNlbGYpCisgICAgICAgIGMsIGUgPSBvcC5pbnQsIG9wLmV4cAorICAgICAgICBwID0gY29udGV4dC5wcmVjCisKKyAgICAgICAgIyBjb3JyZWN0bHkgcm91bmRlZCByZXN1bHQ6IHJlcGVhdGVkbHkgaW5jcmVhc2UgcHJlY2lzaW9uIGJ5IDMKKyAgICAgICAgIyB1bnRpbCB3ZSBnZXQgYW4gdW5hbWJpZ3VvdXNseSByb3VuZGFibGUgcmVzdWx0CisgICAgICAgIHBsYWNlcyA9IHAgLSBzZWxmLl9sbl9leHBfYm91bmQoKSArIDIgIyBhdCBsZWFzdCBwKzMgcGxhY2VzCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjb2VmZiA9IF9kbG9nKGMsIGUsIHBsYWNlcykKKyAgICAgICAgICAgICMgYXNzZXJ0IGxlbihzdHIoYWJzKGNvZWZmKSkpLXAgPj0gMQorICAgICAgICAgICAgaWYgY29lZmYgJSAoNSoxMCoqKGxlbihzdHIoYWJzKGNvZWZmKSkpLXAtMSkpOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBwbGFjZXMgKz0gMworICAgICAgICBhbnMgPSBfZGVjX2Zyb21fdHJpcGxlKGludChjb2VmZjwwKSwgc3RyKGFicyhjb2VmZikpLCAtcGxhY2VzKQorCisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9zaGFsbG93X2NvcHkoKQorICAgICAgICByb3VuZGluZyA9IGNvbnRleHQuX3NldF9yb3VuZGluZyhST1VORF9IQUxGX0VWRU4pCisgICAgICAgIGFucyA9IGFucy5fZml4KGNvbnRleHQpCisgICAgICAgIGNvbnRleHQucm91bmRpbmcgPSByb3VuZGluZworICAgICAgICByZXR1cm4gYW5zCisKKyAgICBkZWYgX2xvZzEwX2V4cF9ib3VuZChzZWxmKToKKyAgICAgICAgIiIiQ29tcHV0ZSBhIGxvd2VyIGJvdW5kIGZvciB0aGUgYWRqdXN0ZWQgZXhwb25lbnQgb2Ygc2VsZi5sb2cxMCgpLgorICAgICAgICBJbiBvdGhlciB3b3JkcywgZmluZCByIHN1Y2ggdGhhdCBzZWxmLmxvZzEwKCkgPj0gMTAqKnIuCisgICAgICAgIEFzc3VtZXMgdGhhdCBzZWxmIGlzIGZpbml0ZSBhbmQgcG9zaXRpdmUgYW5kIHRoYXQgc2VsZiAhPSAxLgorICAgICAgICAiIiIKKworICAgICAgICAjIEZvciB4ID49IDEwIG9yIHggPCAwLjEgd2Ugb25seSBuZWVkIGEgYm91bmQgb24gdGhlIGludGVnZXIKKyAgICAgICAgIyBwYXJ0IG9mIGxvZzEwKHNlbGYpLCBhbmQgdGhpcyBjb21lcyBkaXJlY3RseSBmcm9tIHRoZQorICAgICAgICAjIGV4cG9uZW50IG9mIHguICBGb3IgMC4xIDw9IHggPD0gMTAgd2UgdXNlIHRoZSBpbmVxdWFsaXRpZXMKKyAgICAgICAgIyAxLTEveCA8PSBsb2coeCkgPD0geC0xLiBJZiB4ID4gMSB3ZSBoYXZlIHxsb2cxMCh4KXwgPgorICAgICAgICAjICgxLTEveCkvMi4zMSA+IDAuICBJZiB4IDwgMSB0aGVuIHxsb2cxMCh4KXwgPiAoMS14KS8yLjMxID4gMAorCisgICAgICAgIGFkaiA9IHNlbGYuX2V4cCArIGxlbihzZWxmLl9pbnQpIC0gMQorICAgICAgICBpZiBhZGogPj0gMToKKyAgICAgICAgICAgICMgc2VsZiA+PSAxMAorICAgICAgICAgICAgcmV0dXJuIGxlbihzdHIoYWRqKSktMQorICAgICAgICBpZiBhZGogPD0gLTI6CisgICAgICAgICAgICAjIHNlbGYgPCAwLjEKKyAgICAgICAgICAgIHJldHVybiBsZW4oc3RyKC0xLWFkaikpLTEKKyAgICAgICAgb3AgPSBfV29ya1JlcChzZWxmKQorICAgICAgICBjLCBlID0gb3AuaW50LCBvcC5leHAKKyAgICAgICAgaWYgYWRqID09IDA6CisgICAgICAgICAgICAjIDEgPCBzZWxmIDwgMTAKKyAgICAgICAgICAgIG51bSA9IHN0cihjLTEwKiotZSkKKyAgICAgICAgICAgIGRlbiA9IHN0cigyMzEqYykKKyAgICAgICAgICAgIHJldHVybiBsZW4obnVtKSAtIGxlbihkZW4pIC0gKG51bSA8IGRlbikgKyAyCisgICAgICAgICMgYWRqID09IC0xLCAwLjEgPD0gc2VsZiA8IDEKKyAgICAgICAgbnVtID0gc3RyKDEwKiotZS1jKQorICAgICAgICByZXR1cm4gbGVuKG51bSkgKyBlIC0gKG51bSA8ICIyMzEiKSAtIDEKKworICAgIGRlZiBsb2cxMChzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBiYXNlIDEwIGxvZ2FyaXRobSBvZiBzZWxmLiIiIgorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICAjIGxvZzEwKE5hTikgPSBOYU4KKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhjb250ZXh0PWNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICAjIGxvZzEwKDAuMCkgPT0gLUluZmluaXR5CisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIF9OZWdhdGl2ZUluZmluaXR5CisKKyAgICAgICAgIyBsb2cxMChJbmZpbml0eSkgPSBJbmZpbml0eQorICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBfSW5maW5pdHkKKworICAgICAgICAjIGxvZzEwKG5lZ2F0aXZlIG9yIC1JbmZpbml0eSkgcmFpc2VzIEludmFsaWRPcGVyYXRpb24KKyAgICAgICAgaWYgc2VsZi5fc2lnbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvZzEwIG9mIGEgbmVnYXRpdmUgdmFsdWUnKQorCisgICAgICAgICMgbG9nMTAoMTAqKm4pID0gbgorICAgICAgICBpZiBzZWxmLl9pbnRbMF0gPT0gJzEnIGFuZCBzZWxmLl9pbnRbMTpdID09ICcwJyoobGVuKHNlbGYuX2ludCkgLSAxKToKKyAgICAgICAgICAgICMgYW5zd2VyIG1heSBuZWVkIHJvdW5kaW5nCisgICAgICAgICAgICBhbnMgPSBEZWNpbWFsKHNlbGYuX2V4cCArIGxlbihzZWxmLl9pbnQpIC0gMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgcmVzdWx0IGlzIGlycmF0aW9uYWwsIHNvIG5lY2Vzc2FyaWx5IGluZXhhY3QKKyAgICAgICAgICAgIG9wID0gX1dvcmtSZXAoc2VsZikKKyAgICAgICAgICAgIGMsIGUgPSBvcC5pbnQsIG9wLmV4cAorICAgICAgICAgICAgcCA9IGNvbnRleHQucHJlYworCisgICAgICAgICAgICAjIGNvcnJlY3RseSByb3VuZGVkIHJlc3VsdDogcmVwZWF0ZWRseSBpbmNyZWFzZSBwcmVjaXNpb24KKyAgICAgICAgICAgICMgdW50aWwgcmVzdWx0IGlzIHVuYW1iaWd1b3VzbHkgcm91bmRhYmxlCisgICAgICAgICAgICBwbGFjZXMgPSBwLXNlbGYuX2xvZzEwX2V4cF9ib3VuZCgpKzIKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgY29lZmYgPSBfZGxvZzEwKGMsIGUsIHBsYWNlcykKKyAgICAgICAgICAgICAgICAjIGFzc2VydCBsZW4oc3RyKGFicyhjb2VmZikpKS1wID49IDEKKyAgICAgICAgICAgICAgICBpZiBjb2VmZiAlICg1KjEwKioobGVuKHN0cihhYnMoY29lZmYpKSktcC0xKSk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcGxhY2VzICs9IDMKKyAgICAgICAgICAgIGFucyA9IF9kZWNfZnJvbV90cmlwbGUoaW50KGNvZWZmPDApLCBzdHIoYWJzKGNvZWZmKSksIC1wbGFjZXMpCisKKyAgICAgICAgY29udGV4dCA9IGNvbnRleHQuX3NoYWxsb3dfY29weSgpCisgICAgICAgIHJvdW5kaW5nID0gY29udGV4dC5fc2V0X3JvdW5kaW5nKFJPVU5EX0hBTEZfRVZFTikKKyAgICAgICAgYW5zID0gYW5zLl9maXgoY29udGV4dCkKKyAgICAgICAgY29udGV4dC5yb3VuZGluZyA9IHJvdW5kaW5nCisgICAgICAgIHJldHVybiBhbnMKKworICAgIGRlZiBsb2diKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIiBSZXR1cm5zIHRoZSBleHBvbmVudCBvZiB0aGUgbWFnbml0dWRlIG9mIHNlbGYncyBNU0QuCisKKyAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGUgaW50ZWdlciB3aGljaCBpcyB0aGUgZXhwb25lbnQgb2YgdGhlIG1hZ25pdHVkZQorICAgICAgICBvZiB0aGUgbW9zdCBzaWduaWZpY2FudCBkaWdpdCBvZiBzZWxmIChhcyB0aG91Z2ggaXQgd2VyZSB0cnVuY2F0ZWQKKyAgICAgICAgdG8gYSBzaW5nbGUgZGlnaXQgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoYXQgZGlnaXQgYW5kCisgICAgICAgIHdpdGhvdXQgbGltaXRpbmcgdGhlIHJlc3VsdGluZyBleHBvbmVudCkuCisgICAgICAgICIiIgorICAgICAgICAjIGxvZ2IoTmFOKSA9IE5hTgorICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICAjIGxvZ2IoKy8tSW5mKSA9ICtJbmYKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgcmV0dXJuIF9JbmZpbml0eQorCisgICAgICAgICMgbG9nYigwKSA9IC1JbmYsIERpdmlzaW9uQnlaZXJvCisgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKERpdmlzaW9uQnlaZXJvLCAnbG9nYigwKScsIDEpCisKKyAgICAgICAgIyBvdGhlcndpc2UsIHNpbXBseSByZXR1cm4gdGhlIGFkanVzdGVkIGV4cG9uZW50IG9mIHNlbGYsIGFzIGEKKyAgICAgICAgIyBEZWNpbWFsLiAgTm90ZSB0aGF0IG5vIGF0dGVtcHQgaXMgbWFkZSB0byBmaXQgdGhlIHJlc3VsdAorICAgICAgICAjIGludG8gdGhlIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgYW5zID0gRGVjaW1hbChzZWxmLmFkanVzdGVkKCkpCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIF9pc2xvZ2ljYWwoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHNlbGYgaXMgYSBsb2dpY2FsIG9wZXJhbmQuCisKKyAgICAgICAgRm9yIGJlaW5nIGxvZ2ljYWwsIGl0IG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIHdpdGggYSBzaWduIG9mIDAsCisgICAgICAgIGFuIGV4cG9uZW50IG9mIDAsIGFuZCBhIGNvZWZmaWNpZW50IHdob3NlIGRpZ2l0cyBtdXN0IGFsbCBiZQorICAgICAgICBlaXRoZXIgMCBvciAxLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fc2lnbiAhPSAwIG9yIHNlbGYuX2V4cCAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBkaWcgaW4gc2VsZi5faW50OgorICAgICAgICAgICAgaWYgZGlnIG5vdCBpbiAnMDEnOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIF9maWxsX2xvZ2ljYWwoc2VsZiwgY29udGV4dCwgb3BhLCBvcGIpOgorICAgICAgICBkaWYgPSBjb250ZXh0LnByZWMgLSBsZW4ob3BhKQorICAgICAgICBpZiBkaWYgPiAwOgorICAgICAgICAgICAgb3BhID0gJzAnKmRpZiArIG9wYQorICAgICAgICBlbGlmIGRpZiA8IDA6CisgICAgICAgICAgICBvcGEgPSBvcGFbLWNvbnRleHQucHJlYzpdCisgICAgICAgIGRpZiA9IGNvbnRleHQucHJlYyAtIGxlbihvcGIpCisgICAgICAgIGlmIGRpZiA+IDA6CisgICAgICAgICAgICBvcGIgPSAnMCcqZGlmICsgb3BiCisgICAgICAgIGVsaWYgZGlmIDwgMDoKKyAgICAgICAgICAgIG9wYiA9IG9wYlstY29udGV4dC5wcmVjOl0KKyAgICAgICAgcmV0dXJuIG9wYSwgb3BiCisKKyAgICBkZWYgbG9naWNhbF9hbmQoc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkFwcGxpZXMgYW4gJ2FuZCcgb3BlcmF0aW9uIGJldHdlZW4gc2VsZiBhbmQgb3RoZXIncyBkaWdpdHMuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzbG9naWNhbCgpIG9yIG5vdCBvdGhlci5faXNsb2dpY2FsKCk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbikKKworICAgICAgICAjIGZpbGwgdG8gY29udGV4dC5wcmVjCisgICAgICAgIChvcGEsIG9wYikgPSBzZWxmLl9maWxsX2xvZ2ljYWwoY29udGV4dCwgc2VsZi5faW50LCBvdGhlci5faW50KQorCisgICAgICAgICMgbWFrZSB0aGUgb3BlcmF0aW9uLCBhbmQgY2xlYW4gc3RhcnRpbmcgemVyb2VzCisgICAgICAgIHJlc3VsdCA9ICIiLmpvaW4oW3N0cihpbnQoYSkmaW50KGIpKSBmb3IgYSxiIGluIHppcChvcGEsb3BiKV0pCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDAsIHJlc3VsdC5sc3RyaXAoJzAnKSBvciAnMCcsIDApCisKKyAgICBkZWYgbG9naWNhbF9pbnZlcnQoc2VsZiwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiSW52ZXJ0IGFsbCBpdHMgZGlnaXRzLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHJldHVybiBzZWxmLmxvZ2ljYWxfeG9yKF9kZWNfZnJvbV90cmlwbGUoMCwnMScqY29udGV4dC5wcmVjLDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KQorCisgICAgZGVmIGxvZ2ljYWxfb3Ioc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkFwcGxpZXMgYW4gJ29yJyBvcGVyYXRpb24gYmV0d2VlbiBzZWxmIGFuZCBvdGhlcidzIGRpZ2l0cy4iIiIKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBpZiBub3Qgc2VsZi5faXNsb2dpY2FsKCkgb3Igbm90IG90aGVyLl9pc2xvZ2ljYWwoKToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uKQorCisgICAgICAgICMgZmlsbCB0byBjb250ZXh0LnByZWMKKyAgICAgICAgKG9wYSwgb3BiKSA9IHNlbGYuX2ZpbGxfbG9naWNhbChjb250ZXh0LCBzZWxmLl9pbnQsIG90aGVyLl9pbnQpCisKKyAgICAgICAgIyBtYWtlIHRoZSBvcGVyYXRpb24sIGFuZCBjbGVhbiBzdGFydGluZyB6ZXJvZXMKKyAgICAgICAgcmVzdWx0ID0gIiIuam9pbihbc3RyKGludChhKXxpbnQoYikpIGZvciBhLGIgaW4gemlwKG9wYSxvcGIpXSkKKyAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMCwgcmVzdWx0LmxzdHJpcCgnMCcpIG9yICcwJywgMCkKKworICAgIGRlZiBsb2dpY2FsX3hvcihzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiQXBwbGllcyBhbiAneG9yJyBvcGVyYXRpb24gYmV0d2VlbiBzZWxmIGFuZCBvdGhlcidzIGRpZ2l0cy4iIiIKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBpZiBub3Qgc2VsZi5faXNsb2dpY2FsKCkgb3Igbm90IG90aGVyLl9pc2xvZ2ljYWwoKToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uKQorCisgICAgICAgICMgZmlsbCB0byBjb250ZXh0LnByZWMKKyAgICAgICAgKG9wYSwgb3BiKSA9IHNlbGYuX2ZpbGxfbG9naWNhbChjb250ZXh0LCBzZWxmLl9pbnQsIG90aGVyLl9pbnQpCisKKyAgICAgICAgIyBtYWtlIHRoZSBvcGVyYXRpb24sIGFuZCBjbGVhbiBzdGFydGluZyB6ZXJvZXMKKyAgICAgICAgcmVzdWx0ID0gIiIuam9pbihbc3RyKGludChhKV5pbnQoYikpIGZvciBhLGIgaW4gemlwKG9wYSxvcGIpXSkKKyAgICAgICAgcmV0dXJuIF9kZWNfZnJvbV90cmlwbGUoMCwgcmVzdWx0LmxzdHJpcCgnMCcpIG9yICcwJywgMCkKKworICAgIGRlZiBtYXhfbWFnKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJDb21wYXJlcyB0aGUgdmFsdWVzIG51bWVyaWNhbGx5IHdpdGggdGhlaXIgc2lnbiBpZ25vcmVkLiIiIgorICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIGlmIHNlbGYuX2lzX3NwZWNpYWwgb3Igb3RoZXIuX2lzX3NwZWNpYWw6CisgICAgICAgICAgICAjIElmIG9uZSBvcGVyYW5kIGlzIGEgcXVpZXQgTmFOIGFuZCB0aGUgb3RoZXIgaXMgbnVtYmVyLCB0aGVuIHRoZQorICAgICAgICAgICAgIyBudW1iZXIgaXMgYWx3YXlzIHJldHVybmVkCisgICAgICAgICAgICBzbiA9IHNlbGYuX2lzbmFuKCkKKyAgICAgICAgICAgIG9uID0gb3RoZXIuX2lzbmFuKCkKKyAgICAgICAgICAgIGlmIHNuIG9yIG9uOgorICAgICAgICAgICAgICAgIGlmIG9uID09IDEgYW5kIHNuID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9maXgoY29udGV4dCkKKyAgICAgICAgICAgICAgICBpZiBzbiA9PSAxIGFuZCBvbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorCisgICAgICAgIGMgPSBzZWxmLmNvcHlfYWJzKCkuX2NtcChvdGhlci5jb3B5X2FicygpKQorICAgICAgICBpZiBjID09IDA6CisgICAgICAgICAgICBjID0gc2VsZi5jb21wYXJlX3RvdGFsKG90aGVyKQorCisgICAgICAgIGlmIGMgPT0gLTE6CisgICAgICAgICAgICBhbnMgPSBvdGhlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYW5zID0gc2VsZgorCisgICAgICAgIHJldHVybiBhbnMuX2ZpeChjb250ZXh0KQorCisgICAgZGVmIG1pbl9tYWcoc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIkNvbXBhcmVzIHRoZSB2YWx1ZXMgbnVtZXJpY2FsbHkgd2l0aCB0aGVpciBzaWduIGlnbm9yZWQuIiIiCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgaWYgc2VsZi5faXNfc3BlY2lhbCBvciBvdGhlci5faXNfc3BlY2lhbDoKKyAgICAgICAgICAgICMgSWYgb25lIG9wZXJhbmQgaXMgYSBxdWlldCBOYU4gYW5kIHRoZSBvdGhlciBpcyBudW1iZXIsIHRoZW4gdGhlCisgICAgICAgICAgICAjIG51bWJlciBpcyBhbHdheXMgcmV0dXJuZWQKKyAgICAgICAgICAgIHNuID0gc2VsZi5faXNuYW4oKQorICAgICAgICAgICAgb24gPSBvdGhlci5faXNuYW4oKQorICAgICAgICAgICAgaWYgc24gb3Igb246CisgICAgICAgICAgICAgICAgaWYgb24gPT0gMSBhbmQgc24gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpeChjb250ZXh0KQorICAgICAgICAgICAgICAgIGlmIHNuID09IDEgYW5kIG9uID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvdGhlci5fZml4KGNvbnRleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisKKyAgICAgICAgYyA9IHNlbGYuY29weV9hYnMoKS5fY21wKG90aGVyLmNvcHlfYWJzKCkpCisgICAgICAgIGlmIGMgPT0gMDoKKyAgICAgICAgICAgIGMgPSBzZWxmLmNvbXBhcmVfdG90YWwob3RoZXIpCisKKyAgICAgICAgaWYgYyA9PSAtMToKKyAgICAgICAgICAgIGFucyA9IHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFucyA9IG90aGVyCisKKyAgICAgICAgcmV0dXJuIGFucy5fZml4KGNvbnRleHQpCisKKyAgICBkZWYgbmV4dF9taW51cyhzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBsYXJnZXN0IHJlcHJlc2VudGFibGUgbnVtYmVyIHNtYWxsZXIgdGhhbiBpdHNlbGYuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKSA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiBfTmVnYXRpdmVJbmZpbml0eQorICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKDAsICc5Jypjb250ZXh0LnByZWMsIGNvbnRleHQuRXRvcCgpKQorCisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNvcHkoKQorICAgICAgICBjb250ZXh0Ll9zZXRfcm91bmRpbmcoUk9VTkRfRkxPT1IpCisgICAgICAgIGNvbnRleHQuX2lnbm9yZV9hbGxfZmxhZ3MoKQorICAgICAgICBuZXdfc2VsZiA9IHNlbGYuX2ZpeChjb250ZXh0KQorICAgICAgICBpZiBuZXdfc2VsZiAhPSBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIG5ld19zZWxmCisgICAgICAgIHJldHVybiBzZWxmLl9fc3ViX18oX2RlY19mcm9tX3RyaXBsZSgwLCAnMScsIGNvbnRleHQuRXRpbnkoKS0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KQorCisgICAgZGVmIG5leHRfcGx1cyhzZWxmLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlciBsYXJnZXIgdGhhbiBpdHNlbGYuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKGNvbnRleHQ9Y29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKSA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIF9JbmZpbml0eQorICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCkgPT0gLTE6CisgICAgICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZSgxLCAnOScqY29udGV4dC5wcmVjLCBjb250ZXh0LkV0b3AoKSkKKworICAgICAgICBjb250ZXh0ID0gY29udGV4dC5jb3B5KCkKKyAgICAgICAgY29udGV4dC5fc2V0X3JvdW5kaW5nKFJPVU5EX0NFSUxJTkcpCisgICAgICAgIGNvbnRleHQuX2lnbm9yZV9hbGxfZmxhZ3MoKQorICAgICAgICBuZXdfc2VsZiA9IHNlbGYuX2ZpeChjb250ZXh0KQorICAgICAgICBpZiBuZXdfc2VsZiAhPSBzZWxmOgorICAgICAgICAgICAgcmV0dXJuIG5ld19zZWxmCisgICAgICAgIHJldHVybiBzZWxmLl9fYWRkX18oX2RlY19mcm9tX3RyaXBsZSgwLCAnMScsIGNvbnRleHQuRXRpbnkoKS0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0KQorCisgICAgZGVmIG5leHRfdG93YXJkKHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgY2xvc2VzdCB0byBzZWxmLCBpbiB0aGUgZGlyZWN0aW9uIHRvd2FyZHMgb3RoZXIuCisKKyAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGUgY2xvc2VzdCByZXByZXNlbnRhYmxlIG51bWJlciB0byBzZWxmCisgICAgICAgIChleGNsdWRpbmcgc2VsZikgdGhhdCBpcyBpbiB0aGUgZGlyZWN0aW9uIHRvd2FyZHMgb3RoZXIsCisgICAgICAgIHVubGVzcyBib3RoIGhhdmUgdGhlIHNhbWUgdmFsdWUuICBJZiB0aGUgdHdvIG9wZXJhbmRzIGFyZQorICAgICAgICBudW1lcmljYWxseSBlcXVhbCwgdGhlbiB0aGUgcmVzdWx0IGlzIGEgY29weSBvZiBzZWxmIHdpdGggdGhlCisgICAgICAgIHNpZ24gc2V0IHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBzaWduIG9mIG90aGVyLgorICAgICAgICAiIiIKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgY29tcGFyaXNvbiA9IHNlbGYuX2NtcChvdGhlcikKKyAgICAgICAgaWYgY29tcGFyaXNvbiA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29weV9zaWduKG90aGVyKQorCisgICAgICAgIGlmIGNvbXBhcmlzb24gPT0gLTE6CisgICAgICAgICAgICBhbnMgPSBzZWxmLm5leHRfcGx1cyhjb250ZXh0KQorICAgICAgICBlbHNlOiAjIGNvbXBhcmlzb24gPT0gMQorICAgICAgICAgICAgYW5zID0gc2VsZi5uZXh0X21pbnVzKGNvbnRleHQpCisKKyAgICAgICAgIyBkZWNpZGUgd2hpY2ggZmxhZ3MgdG8gcmFpc2UgdXNpbmcgdmFsdWUgb2YgYW5zCisgICAgICAgIGlmIGFucy5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoT3ZlcmZsb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5maW5pdGUgcmVzdWx0IGZyb20gbmV4dF90b3dhcmQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zLl9zaWduKQorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoSW5leGFjdCkKKyAgICAgICAgICAgIGNvbnRleHQuX3JhaXNlX2Vycm9yKFJvdW5kZWQpCisgICAgICAgIGVsaWYgYW5zLmFkanVzdGVkKCkgPCBjb250ZXh0LkVtaW46CisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihVbmRlcmZsb3cpCisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihTdWJub3JtYWwpCisgICAgICAgICAgICBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbmV4YWN0KQorICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoUm91bmRlZCkKKyAgICAgICAgICAgICMgaWYgcHJlY2lzaW9uID09IDEgdGhlbiB3ZSBkb24ndCByYWlzZSBDbGFtcGVkIGZvciBhCisgICAgICAgICAgICAjIHJlc3VsdCAwRS1FdGlueS4KKyAgICAgICAgICAgIGlmIG5vdCBhbnM6CisgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoQ2xhbXBlZCkKKworICAgICAgICByZXR1cm4gYW5zCisKKyAgICBkZWYgbnVtYmVyX2NsYXNzKHNlbGYsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB0aGUgY2xhc3Mgb2Ygc2VsZi4KKworICAgICAgICBUaGUgY2xhc3MgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgc3RyaW5nczoKKyAgICAgICAgICBzTmFOCisgICAgICAgICAgTmFOCisgICAgICAgICAgLUluZmluaXR5CisgICAgICAgICAgLU5vcm1hbAorICAgICAgICAgIC1TdWJub3JtYWwKKyAgICAgICAgICAtWmVybworICAgICAgICAgICtaZXJvCisgICAgICAgICAgK1N1Ym5vcm1hbAorICAgICAgICAgICtOb3JtYWwKKyAgICAgICAgICArSW5maW5pdHkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaXNfc25hbigpOgorICAgICAgICAgICAgcmV0dXJuICJzTmFOIgorICAgICAgICBpZiBzZWxmLmlzX3FuYW4oKToKKyAgICAgICAgICAgIHJldHVybiAiTmFOIgorICAgICAgICBpbmYgPSBzZWxmLl9pc2luZmluaXR5KCkKKyAgICAgICAgaWYgaW5mID09IDE6CisgICAgICAgICAgICByZXR1cm4gIitJbmZpbml0eSIKKyAgICAgICAgaWYgaW5mID09IC0xOgorICAgICAgICAgICAgcmV0dXJuICItSW5maW5pdHkiCisgICAgICAgIGlmIHNlbGYuaXNfemVybygpOgorICAgICAgICAgICAgaWYgc2VsZi5fc2lnbjoKKyAgICAgICAgICAgICAgICByZXR1cm4gIi1aZXJvIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gIitaZXJvIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIGlmIHNlbGYuaXNfc3Vibm9ybWFsKGNvbnRleHQ9Y29udGV4dCk6CisgICAgICAgICAgICBpZiBzZWxmLl9zaWduOgorICAgICAgICAgICAgICAgIHJldHVybiAiLVN1Ym5vcm1hbCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICIrU3Vibm9ybWFsIgorICAgICAgICAjIGp1c3QgYSBub3JtYWwsIHJlZ3VsYXIsIGJvcmluZyBudW1iZXIsIDopCisgICAgICAgIGlmIHNlbGYuX3NpZ246CisgICAgICAgICAgICByZXR1cm4gIi1Ob3JtYWwiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIitOb3JtYWwiCisKKyAgICBkZWYgcmFkaXgoc2VsZik6CisgICAgICAgICIiIkp1c3QgcmV0dXJucyAxMCwgYXMgdGhpcyBpcyBEZWNpbWFsLCA6KSIiIgorICAgICAgICByZXR1cm4gRGVjaW1hbCgxMCkKKworICAgIGRlZiByb3RhdGUoc2VsZiwgb3RoZXIsIGNvbnRleHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgYSByb3RhdGVkIGNvcHkgb2Ygc2VsZiwgdmFsdWUtb2Ytb3RoZXIgdGltZXMuIiIiCisgICAgICAgIGlmIGNvbnRleHQgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRleHQgPSBnZXRjb250ZXh0KCkKKworICAgICAgICBvdGhlciA9IF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PVRydWUpCisKKyAgICAgICAgYW5zID0gc2VsZi5fY2hlY2tfbmFucyhvdGhlciwgY29udGV4dCkKKyAgICAgICAgaWYgYW5zOgorICAgICAgICAgICAgcmV0dXJuIGFucworCisgICAgICAgIGlmIG90aGVyLl9leHAgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uKQorICAgICAgICBpZiBub3QgKC1jb250ZXh0LnByZWMgPD0gaW50KG90aGVyKSA8PSBjb250ZXh0LnByZWMpOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24pCisKKyAgICAgICAgaWYgc2VsZi5faXNpbmZpbml0eSgpOgorICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwoc2VsZikKKworICAgICAgICAjIGdldCB2YWx1ZXMsIHBhZCBpZiBuZWNlc3NhcnkKKyAgICAgICAgdG9yb3QgPSBpbnQob3RoZXIpCisgICAgICAgIHJvdGRpZyA9IHNlbGYuX2ludAorICAgICAgICB0b3BhZCA9IGNvbnRleHQucHJlYyAtIGxlbihyb3RkaWcpCisgICAgICAgIGlmIHRvcGFkID4gMDoKKyAgICAgICAgICAgIHJvdGRpZyA9ICcwJyp0b3BhZCArIHJvdGRpZworICAgICAgICBlbGlmIHRvcGFkIDwgMDoKKyAgICAgICAgICAgIHJvdGRpZyA9IHJvdGRpZ1stdG9wYWQ6XQorCisgICAgICAgICMgbGV0J3Mgcm90YXRlIQorICAgICAgICByb3RhdGVkID0gcm90ZGlnW3Rvcm90Ol0gKyByb3RkaWdbOnRvcm90XQorICAgICAgICByZXR1cm4gX2RlY19mcm9tX3RyaXBsZShzZWxmLl9zaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVkLmxzdHJpcCgnMCcpIG9yICcwJywgc2VsZi5fZXhwKQorCisgICAgZGVmIHNjYWxlYihzZWxmLCBvdGhlciwgY29udGV4dD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJucyBzZWxmIG9wZXJhbmQgYWZ0ZXIgYWRkaW5nIHRoZSBzZWNvbmQgdmFsdWUgdG8gaXRzIGV4cC4iIiIKKyAgICAgICAgaWYgY29udGV4dCBpcyBOb25lOgorICAgICAgICAgICAgY29udGV4dCA9IGdldGNvbnRleHQoKQorCisgICAgICAgIG90aGVyID0gX2NvbnZlcnRfb3RoZXIob3RoZXIsIHJhaXNlaXQ9VHJ1ZSkKKworICAgICAgICBhbnMgPSBzZWxmLl9jaGVja19uYW5zKG90aGVyLCBjb250ZXh0KQorICAgICAgICBpZiBhbnM6CisgICAgICAgICAgICByZXR1cm4gYW5zCisKKyAgICAgICAgaWYgb3RoZXIuX2V4cCAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuX3JhaXNlX2Vycm9yKEludmFsaWRPcGVyYXRpb24pCisgICAgICAgIGxpbWluZiA9IC0yICogKGNvbnRleHQuRW1heCArIGNvbnRleHQucHJlYykKKyAgICAgICAgbGltc3VwID0gIDIgKiAoY29udGV4dC5FbWF4ICsgY29udGV4dC5wcmVjKQorICAgICAgICBpZiBub3QgKGxpbWluZiA8PSBpbnQob3RoZXIpIDw9IGxpbXN1cCk6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbikKKworICAgICAgICBpZiBzZWxmLl9pc2luZmluaXR5KCk6CisgICAgICAgICAgICByZXR1cm4gRGVjaW1hbChzZWxmKQorCisgICAgICAgIGQgPSBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sIHNlbGYuX2ludCwgc2VsZi5fZXhwICsgaW50KG90aGVyKSkKKyAgICAgICAgZCA9IGQuX2ZpeChjb250ZXh0KQorICAgICAgICByZXR1cm4gZAorCisgICAgZGVmIHNoaWZ0KHNlbGYsIG90aGVyLCBjb250ZXh0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIGEgc2hpZnRlZCBjb3B5IG9mIHNlbGYsIHZhbHVlLW9mLW90aGVyIHRpbWVzLiIiIgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgb3RoZXIgPSBfY29udmVydF9vdGhlcihvdGhlciwgcmFpc2VpdD1UcnVlKQorCisgICAgICAgIGFucyA9IHNlbGYuX2NoZWNrX25hbnMob3RoZXIsIGNvbnRleHQpCisgICAgICAgIGlmIGFuczoKKyAgICAgICAgICAgIHJldHVybiBhbnMKKworICAgICAgICBpZiBvdGhlci5fZXhwICE9IDA6CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5fcmFpc2VfZXJyb3IoSW52YWxpZE9wZXJhdGlvbikKKyAgICAgICAgaWYgbm90ICgtY29udGV4dC5wcmVjIDw9IGludChvdGhlcikgPD0gY29udGV4dC5wcmVjKToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0Ll9yYWlzZV9lcnJvcihJbnZhbGlkT3BlcmF0aW9uKQorCisgICAgICAgIGlmIHNlbGYuX2lzaW5maW5pdHkoKToKKyAgICAgICAgICAgIHJldHVybiBEZWNpbWFsKHNlbGYpCisKKyAgICAgICAgIyBnZXQgdmFsdWVzLCBwYWQgaWYgbmVjZXNzYXJ5CisgICAgICAgIHRvcm90ID0gaW50KG90aGVyKQorICAgICAgICByb3RkaWcgPSBzZWxmLl9pbnQKKyAgICAgICAgdG9wYWQgPSBjb250ZXh0LnByZWMgLSBsZW4ocm90ZGlnKQorICAgICAgICBpZiB0b3BhZCA+IDA6CisgICAgICAgICAgICByb3RkaWcgPSAnMCcqdG9wYWQgKyByb3RkaWcKKyAgICAgICAgZWxpZiB0b3BhZCA8IDA6CisgICAgICAgICAgICByb3RkaWcgPSByb3RkaWdbLXRvcGFkOl0KKworICAgICAgICAjIGxldCdzIHNoaWZ0IQorICAgICAgICBpZiB0b3JvdCA8IDA6CisgICAgICAgICAgICBzaGlmdGVkID0gcm90ZGlnWzp0b3JvdF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNoaWZ0ZWQgPSByb3RkaWcgKyAnMCcqdG9yb3QKKyAgICAgICAgICAgIHNoaWZ0ZWQgPSBzaGlmdGVkWy1jb250ZXh0LnByZWM6XQorCisgICAgICAgIHJldHVybiBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdGVkLmxzdHJpcCgnMCcpIG9yICcwJywgc2VsZi5fZXhwKQorCisgICAgIyBTdXBwb3J0IGZvciBwaWNrbGluZywgY29weSwgYW5kIGRlZXBjb3B5CisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5fX2NsYXNzX18sIChzdHIoc2VsZiksKSkKKworICAgIGRlZiBfX2NvcHlfXyhzZWxmKToKKyAgICAgICAgaWYgdHlwZShzZWxmKSBpcyBEZWNpbWFsOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYgICAgICMgSSdtIGltbXV0YWJsZTsgdGhlcmVmb3JlIEkgYW0gbXkgb3duIGNsb25lCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzdHIoc2VsZikpCisKKyAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW8pOgorICAgICAgICBpZiB0eXBlKHNlbGYpIGlzIERlY2ltYWw6CisgICAgICAgICAgICByZXR1cm4gc2VsZiAgICAgIyBNeSBjb21wb25lbnRzIGFyZSBhbHNvIGltbXV0YWJsZQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc3RyKHNlbGYpKQorCisgICAgIyBQRVAgMzEwMSBzdXBwb3J0LiAgdGhlIF9sb2NhbGVjb252IGtleXdvcmQgYXJndW1lbnQgc2hvdWxkIGJlCisgICAgIyBjb25zaWRlcmVkIHByaXZhdGU6IGl0J3MgcHJvdmlkZWQgZm9yIGVhc2Ugb2YgdGVzdGluZyBvbmx5LgorICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIHNwZWNpZmllciwgY29udGV4dD1Ob25lLCBfbG9jYWxlY29udj1Ob25lKToKKyAgICAgICAgIiIiRm9ybWF0IGEgRGVjaW1hbCBpbnN0YW5jZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuIHNwZWNpZmllci4KKworICAgICAgICBUaGUgc3BlY2lmaWVyIHNob3VsZCBiZSBhIHN0YW5kYXJkIGZvcm1hdCBzcGVjaWZpZXIsIHdpdGggdGhlCisgICAgICAgIGZvcm0gZGVzY3JpYmVkIGluIFBFUCAzMTAxLiAgRm9ybWF0dGluZyB0eXBlcyAnZScsICdFJywgJ2YnLAorICAgICAgICAnRicsICdnJywgJ0cnLCAnbicgYW5kICclJyBhcmUgc3VwcG9ydGVkLiAgSWYgdGhlIGZvcm1hdHRpbmcKKyAgICAgICAgdHlwZSBpcyBvbWl0dGVkIGl0IGRlZmF1bHRzIHRvICdnJyBvciAnRycsIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgdmFsdWUgb2YgY29udGV4dC5jYXBpdGFscy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBOb3RlOiBQRVAgMzEwMSBzYXlzIHRoYXQgaWYgdGhlIHR5cGUgaXMgbm90IHByZXNlbnQgdGhlbgorICAgICAgICAjIHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCisgICAgICAgICMgV2UgdGFrZSB0aGUgbGliZXJ0eSBvZiBpZ25vcmluZyB0aGlzIHJlcXVpcmVtZW50IGZvcgorICAgICAgICAjIERlY2ltYWwtLS1pdCdzIHByZXN1bWFibHkgdGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgIyBmb3JtYXQoZmxvYXQsICcnKSBiZWhhdmVzIHNpbWlsYXJseSB0byBzdHIoZmxvYXQpLgorICAgICAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBjb250ZXh0ID0gZ2V0Y29udGV4dCgpCisKKyAgICAgICAgc3BlYyA9IF9wYXJzZV9mb3JtYXRfc3BlY2lmaWVyKHNwZWNpZmllciwgX2xvY2FsZWNvbnY9X2xvY2FsZWNvbnYpCisKKyAgICAgICAgIyBzcGVjaWFsIHZhbHVlcyBkb24ndCBjYXJlIGFib3V0IHRoZSB0eXBlIG9yIHByZWNpc2lvbgorICAgICAgICBpZiBzZWxmLl9pc19zcGVjaWFsOgorICAgICAgICAgICAgc2lnbiA9IF9mb3JtYXRfc2lnbihzZWxmLl9zaWduLCBzcGVjKQorICAgICAgICAgICAgYm9keSA9IHN0cihzZWxmLmNvcHlfYWJzKCkpCisgICAgICAgICAgICByZXR1cm4gX2Zvcm1hdF9hbGlnbihzaWduLCBib2R5LCBzcGVjKQorCisgICAgICAgICMgYSB0eXBlIG9mIE5vbmUgZGVmYXVsdHMgdG8gJ2cnIG9yICdHJywgZGVwZW5kaW5nIG9uIGNvbnRleHQKKyAgICAgICAgaWYgc3BlY1sndHlwZSddIGlzIE5vbmU6CisgICAgICAgICAgICBzcGVjWyd0eXBlJ10gPSBbJ2cnLCAnRyddW2NvbnRleHQuY2FwaXRhbHNdCisKKyAgICAgICAgIyBpZiB0eXBlIGlzICclJywgYWRqdXN0IGV4cG9uZW50IG9mIHNlbGYgYWNjb3JkaW5nbHkKKyAgICAgICAgaWYgc3BlY1sndHlwZSddID09ICclJzoKKyAgICAgICAgICAgIHNlbGYgPSBfZGVjX2Zyb21fdHJpcGxlKHNlbGYuX3NpZ24sIHNlbGYuX2ludCwgc2VsZi5fZXhwKzIpCisKKyAgICAgICAgIyByb3VuZCBpZiBuZWNlc3NhcnksIHRha2luZyByb3VuZGluZyBtb2RlIGZyb20gdGhlIGNvbnRleHQKKyAgICAgICAgcm91bmRpbmcgPSBjb250ZXh0LnJvdW5kaW5nCisgICAgICAgIHByZWNpc2lvbiA9IHNwZWNbJ3ByZWNpc2lvbiddCisgICAgICAgIGlmIHByZWNpc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNwZWNbJ3R5cGUnXSBpbiAnZUUnOgorICAgICAgICAgICAgICAgIHNlbGYgPSBzZWxmLl9yb3VuZChwcmVjaXNpb24rMSwgcm91bmRpbmcpCisgICAgICAgICAgICBlbGlmIHNwZWNbJ3R5cGUnXSBpbiAnZkYlJzoKKyAgICAgICAgICAgICAgICBzZWxmID0gc2VsZi5fcmVzY2FsZSgtcHJlY2lzaW9uLCByb3VuZGluZykKKyAgICAgICAgICAgIGVsaWYgc3BlY1sndHlwZSddIGluICdnRycgYW5kIGxlbihzZWxmLl9pbnQpID4gcHJlY2lzaW9uOgorICAgICAgICAgICAgICAgIHNlbGYgPSBzZWxmLl9yb3VuZChwcmVjaXNpb24sIHJvdW5kaW5nKQorICAgICAgICAjIHNwZWNpYWwgY2FzZTogemVyb3Mgd2l0aCBhIHBvc2l0aXZlIGV4cG9uZW50IGNhbid0IGJlCisgICAgICAgICMgcmVwcmVzZW50ZWQgaW4gZml4ZWQgcG9pbnQ7IHJlc2NhbGUgdGhlbSB0byAwZTAuCisgICAgICAgIGlmIG5vdCBzZWxmIGFuZCBzZWxmLl9leHAgPiAwIGFuZCBzcGVjWyd0eXBlJ10gaW4gJ2ZGJSc6CisgICAgICAgICAgICBzZWxmID0gc2VsZi5fcmVzY2FsZSgwLCByb3VuZGluZykKKworICAgICAgICAjIGZpZ3VyZSBvdXQgcGxhY2VtZW50IG9mIHRoZSBkZWNpbWFsIHBvaW50CisgICAgICAgIGxlZnRkaWdpdHMgPSBzZWxmLl9leHAgKyBsZW4oc2VsZi5faW50KQorICAgICAgICBpZiBzcGVjWyd0eXBlJ10gaW4gJ2VFJzoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmIGFuZCBwcmVjaXNpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZG90cGxhY2UgPSAxIC0gcHJlY2lzaW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRvdHBsYWNlID0gMQorICAgICAgICBlbGlmIHNwZWNbJ3R5cGUnXSBpbiAnZkYlJzoKKyAgICAgICAgICAgIGRvdHBsYWNlID0gbGVmdGRpZ2l0cworICAgICAgICBlbGlmIHNwZWNbJ3R5cGUnXSBpbiAnZ0cnOgorICAgICAgICAgICAgaWYgc2VsZi5fZXhwIDw9IDAgYW5kIGxlZnRkaWdpdHMgPiAtNjoKKyAgICAgICAgICAgICAgICBkb3RwbGFjZSA9IGxlZnRkaWdpdHMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZG90cGxhY2UgPSAxCisKKyAgICAgICAgIyBmaW5kIGRpZ2l0cyBiZWZvcmUgYW5kIGFmdGVyIGRlY2ltYWwgcG9pbnQsIGFuZCBnZXQgZXhwb25lbnQKKyAgICAgICAgaWYgZG90cGxhY2UgPCAwOgorICAgICAgICAgICAgaW50cGFydCA9ICcwJworICAgICAgICAgICAgZnJhY3BhcnQgPSAnMCcqKC1kb3RwbGFjZSkgKyBzZWxmLl9pbnQKKyAgICAgICAgZWxpZiBkb3RwbGFjZSA+IGxlbihzZWxmLl9pbnQpOgorICAgICAgICAgICAgaW50cGFydCA9IHNlbGYuX2ludCArICcwJyooZG90cGxhY2UtbGVuKHNlbGYuX2ludCkpCisgICAgICAgICAgICBmcmFjcGFydCA9ICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbnRwYXJ0ID0gc2VsZi5faW50Wzpkb3RwbGFjZV0gb3IgJzAnCisgICAgICAgICAgICBmcmFjcGFydCA9IHNlbGYuX2ludFtkb3RwbGFjZTpdCisgICAgICAgIGV4cCA9IGxlZnRkaWdpdHMtZG90cGxhY2UKKworICAgICAgICAjIGRvbmUgd2l0aCB0aGUgZGVjaW1hbC1zcGVjaWZpYyBzdHVmZjsgIGhhbmQgb3ZlciB0aGUgcmVzdAorICAgICAgICAjIG9mIHRoZSBmb3JtYXR0aW5nIHRvIHRoZSBfZm9ybWF0X251bWJlciBmdW5jdGlvbgorICAgICAgICByZXR1cm4gX2Zvcm1hdF9udW1iZXIoc2VsZi5fc2lnbiwgaW50cGFydCwgZnJhY3BhcnQsIGV4cCwgc3BlYykKKworZGVmIF9kZWNfZnJvbV90cmlwbGUoc2lnbiwgY29lZmZpY2llbnQsIGV4cG9uZW50LCBzcGVjaWFsPUZhbHNlKToKKyAgICAiIiJDcmVhdGUgYSBkZWNpbWFsIGluc3RhbmNlIGRpcmVjdGx5LCB3aXRob3V0IGFueSB2YWxpZGF0aW9uLAorICAgIG5vcm1hbGl6YXRpb24gKGUuZy4gcmVtb3ZhbCBvZiBsZWFkaW5nIHplcm9zKSBvciBhcmd1bWVudAorICAgIGNvbnZlcnNpb24uCisKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIGZvciAqaW50ZXJuYWwgdXNlIG9ubHkqLgorICAgICIiIgorCisgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKERlY2ltYWwpCisgICAgc2VsZi5fc2lnbiA9IHNpZ24KKyAgICBzZWxmLl9pbnQgPSBjb2VmZmljaWVudAorICAgIHNlbGYuX2V4cCA9IGV4cG9uZW50CisgICAgc2VsZi5faXNfc3BlY2lhbCA9IHNwZWNpYWwKKworICAgIHJldHVybiBzZWxmCisKKyMgUmVnaXN0ZXIgRGVjaW1hbCBhcyBhIGtpbmQgb2YgTnVtYmVyIChhbiBhYnN0cmFjdCBiYXNlIGNsYXNzKS4KKyMgSG93ZXZlciwgZG8gbm90IHJlZ2lzdGVyIGl0IGFzIFJlYWwgKGJlY2F1c2UgRGVjaW1hbHMgYXJlIG5vdAorIyBpbnRlcm9wZXJhYmxlIHdpdGggZmxvYXRzKS4KK19udW1iZXJzLk51bWJlci5yZWdpc3RlcihEZWNpbWFsKQorCisKKyMjIyMjIENvbnRleHQgY2xhc3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBfQ29udGV4dE1hbmFnZXIob2JqZWN0KToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgY2xhc3MgdG8gc3VwcG9ydCBsb2NhbGNvbnRleHQoKS4KKworICAgICAgU2V0cyBhIGNvcHkgb2YgdGhlIHN1cHBsaWVkIGNvbnRleHQgaW4gX19lbnRlcl9fKCkgYW5kIHJlc3RvcmVzCisgICAgICB0aGUgcHJldmlvdXMgZGVjaW1hbCBjb250ZXh0IGluIF9fZXhpdF9fKCkKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmV3X2NvbnRleHQpOgorICAgICAgICBzZWxmLm5ld19jb250ZXh0ID0gbmV3X2NvbnRleHQuY29weSgpCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zYXZlZF9jb250ZXh0ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHNldGNvbnRleHQoc2VsZi5uZXdfY29udGV4dCkKKyAgICAgICAgcmV0dXJuIHNlbGYubmV3X2NvbnRleHQKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdCwgdiwgdGIpOgorICAgICAgICBzZXRjb250ZXh0KHNlbGYuc2F2ZWRfY29udGV4dCkKKworY2xhc3MgQ29udGV4dChvYmplY3QpOgorICAgICIiIkNvbnRhaW5zIHRoZSBjb250ZXh0IGZvciBhIERlY2ltYWwgaW5zdGFuY2UuCisKKyAgICBDb250YWluczoKKyAgICBwcmVjIC0gcHJlY2lzaW9uIChmb3IgdXNlIGluIHJvdW5kaW5nLCBkaXZpc2lvbiwgc3F1YXJlIHJvb3RzLi4pCisgICAgcm91bmRpbmcgLSByb3VuZGluZyB0eXBlIChob3cgeW91IHJvdW5kKQorICAgIHRyYXBzIC0gSWYgdHJhcHNbZXhjZXB0aW9uXSA9IDEsIHRoZW4gdGhlIGV4Y2VwdGlvbiBpcworICAgICAgICAgICAgICAgICAgICByYWlzZWQgd2hlbiBpdCBpcyBjYXVzZWQuICBPdGhlcndpc2UsIGEgdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RpdHV0ZWQgaW4uCisgICAgZmxhZ3MgIC0gV2hlbiBhbiBleGNlcHRpb24gaXMgY2F1c2VkLCBmbGFnc1tleGNlcHRpb25dIGlzIHNldC4KKyAgICAgICAgICAgICAoV2hldGhlciBvciBub3QgdGhlIHRyYXBfZW5hYmxlciBpcyBzZXQpCisgICAgICAgICAgICAgU2hvdWxkIGJlIHJlc2V0IGJ5IHVzZXIgb2YgRGVjaW1hbCBpbnN0YW5jZS4KKyAgICBFbWluIC0gICBNaW5pbXVtIGV4cG9uZW50CisgICAgRW1heCAtICAgTWF4aW11bSBleHBvbmVudAorICAgIGNhcGl0YWxzIC0gICAgICBJZiAxLCAxKjEwXjEgaXMgcHJpbnRlZCBhcyAxRSsxLgorICAgICAgICAgICAgICAgICAgICBJZiAwLCBwcmludGVkIGFzIDFlMQorICAgIF9jbGFtcCAtIElmIDEsIGNoYW5nZSBleHBvbmVudHMgaWYgdG9vIGhpZ2ggKERlZmF1bHQgMCkKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcmVjPU5vbmUsIHJvdW5kaW5nPU5vbmUsCisgICAgICAgICAgICAgICAgIHRyYXBzPU5vbmUsIGZsYWdzPU5vbmUsCisgICAgICAgICAgICAgICAgIEVtaW49Tm9uZSwgRW1heD1Ob25lLAorICAgICAgICAgICAgICAgICBjYXBpdGFscz1Ob25lLCBfY2xhbXA9MCwKKyAgICAgICAgICAgICAgICAgX2lnbm9yZWRfZmxhZ3M9Tm9uZSk6CisgICAgICAgICMgU2V0IGRlZmF1bHRzOyBmb3IgZXZlcnl0aGluZyBleGNlcHQgZmxhZ3MgYW5kIF9pZ25vcmVkX2ZsYWdzLAorICAgICAgICAjIGluaGVyaXQgZnJvbSBEZWZhdWx0Q29udGV4dC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGMgPSBEZWZhdWx0Q29udGV4dAorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYucHJlYyA9IHByZWMgaWYgcHJlYyBpcyBub3QgTm9uZSBlbHNlIGRjLnByZWMKKyAgICAgICAgc2VsZi5yb3VuZGluZyA9IHJvdW5kaW5nIGlmIHJvdW5kaW5nIGlzIG5vdCBOb25lIGVsc2UgZGMucm91bmRpbmcKKyAgICAgICAgc2VsZi5FbWluID0gRW1pbiBpZiBFbWluIGlzIG5vdCBOb25lIGVsc2UgZGMuRW1pbgorICAgICAgICBzZWxmLkVtYXggPSBFbWF4IGlmIEVtYXggaXMgbm90IE5vbmUgZWxzZSBkYy5FbWF4CisgICAgICAgIHNlbGYuY2FwaXRhbHMgPSBjYXBpdGFscyBpZiBjYXBpdGFscyBpcyBub3QgTm9uZSBlbHNlIGRjLmNhcGl0YWxzCisgICAgICAgIHNlbGYuX2NsYW1wID0gX2NsYW1wIGlmIF9jbGFtcCBpcyBub3QgTm9uZSBlbHNlIGRjLl9jbGFtcAorCisgICAgICAgIGlmIF9pZ25vcmVkX2ZsYWdzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9pZ25vcmVkX2ZsYWdzID0gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2lnbm9yZWRfZmxhZ3MgPSBfaWdub3JlZF9mbGFncworCisgICAgICAgIGlmIHRyYXBzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRyYXBzID0gZGMudHJhcHMuY29weSgpCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodHJhcHMsIGRpY3QpOgorICAgICAgICAgICAgc2VsZi50cmFwcyA9IGRpY3QoKHMsIGludChzIGluIHRyYXBzKSkgZm9yIHMgaW4gX3NpZ25hbHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRyYXBzID0gdHJhcHMKKworICAgICAgICBpZiBmbGFncyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5mbGFncyA9IGRpY3QuZnJvbWtleXMoX3NpZ25hbHMsIDApCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZmxhZ3MsIGRpY3QpOgorICAgICAgICAgICAgc2VsZi5mbGFncyA9IGRpY3QoKHMsIGludChzIGluIGZsYWdzKSkgZm9yIHMgaW4gX3NpZ25hbHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZsYWdzID0gZmxhZ3MKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiU2hvdyB0aGUgY3VycmVudCBjb250ZXh0LiIiIgorICAgICAgICBzID0gW10KKyAgICAgICAgcy5hcHBlbmQoJ0NvbnRleHQocHJlYz0lKHByZWMpZCwgcm91bmRpbmc9JShyb3VuZGluZylzLCAnCisgICAgICAgICAgICAgICAgICdFbWluPSUoRW1pbilkLCBFbWF4PSUoRW1heClkLCBjYXBpdGFscz0lKGNhcGl0YWxzKWQnCisgICAgICAgICAgICAgICAgICUgdmFycyhzZWxmKSkKKyAgICAgICAgbmFtZXMgPSBbZi5fX25hbWVfXyBmb3IgZiwgdiBpbiBzZWxmLmZsYWdzLml0ZW1zKCkgaWYgdl0KKyAgICAgICAgcy5hcHBlbmQoJ2ZsYWdzPVsnICsgJywgJy5qb2luKG5hbWVzKSArICddJykKKyAgICAgICAgbmFtZXMgPSBbdC5fX25hbWVfXyBmb3IgdCwgdiBpbiBzZWxmLnRyYXBzLml0ZW1zKCkgaWYgdl0KKyAgICAgICAgcy5hcHBlbmQoJ3RyYXBzPVsnICsgJywgJy5qb2luKG5hbWVzKSArICddJykKKyAgICAgICAgcmV0dXJuICcsICcuam9pbihzKSArICcpJworCisgICAgZGVmIGNsZWFyX2ZsYWdzKHNlbGYpOgorICAgICAgICAiIiJSZXNldCBhbGwgZmxhZ3MgdG8gemVybyIiIgorICAgICAgICBmb3IgZmxhZyBpbiBzZWxmLmZsYWdzOgorICAgICAgICAgICAgc2VsZi5mbGFnc1tmbGFnXSA9IDAKKworICAgIGRlZiBfc2hhbGxvd19jb3B5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IGZyb20gc2VsZi4iIiIKKyAgICAgICAgbmMgPSBDb250ZXh0KHNlbGYucHJlYywgc2VsZi5yb3VuZGluZywgc2VsZi50cmFwcywKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MsIHNlbGYuRW1pbiwgc2VsZi5FbWF4LAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYXBpdGFscywgc2VsZi5fY2xhbXAsIHNlbGYuX2lnbm9yZWRfZmxhZ3MpCisgICAgICAgIHJldHVybiBuYworCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgYSBkZWVwIGNvcHkgZnJvbSBzZWxmLiIiIgorICAgICAgICBuYyA9IENvbnRleHQoc2VsZi5wcmVjLCBzZWxmLnJvdW5kaW5nLCBzZWxmLnRyYXBzLmNvcHkoKSwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmxhZ3MuY29weSgpLCBzZWxmLkVtaW4sIHNlbGYuRW1heCwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FwaXRhbHMsIHNlbGYuX2NsYW1wLCBzZWxmLl9pZ25vcmVkX2ZsYWdzKQorICAgICAgICByZXR1cm4gbmMKKyAgICBfX2NvcHlfXyA9IGNvcHkKKworICAgIGRlZiBfcmFpc2VfZXJyb3Ioc2VsZiwgY29uZGl0aW9uLCBleHBsYW5hdGlvbiA9IE5vbmUsICphcmdzKToKKyAgICAgICAgIiIiSGFuZGxlcyBhbiBlcnJvcgorCisgICAgICAgIElmIHRoZSBmbGFnIGlzIGluIF9pZ25vcmVkX2ZsYWdzLCByZXR1cm5zIHRoZSBkZWZhdWx0IHJlc3BvbnNlLgorICAgICAgICBPdGhlcndpc2UsIGl0IHNldHMgdGhlIGZsYWcsIHRoZW4sIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIHRyYXBfZW5hYmxlciBpcyBzZXQsIGl0IHJlcmFpc2VzIHRoZSBleGNlcHRpb24uICBPdGhlcndpc2UsIGl0IHJldHVybnMKKyAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWUgYWZ0ZXIgc2V0dGluZyB0aGUgZmxhZy4KKyAgICAgICAgIiIiCisgICAgICAgIGVycm9yID0gX2NvbmRpdGlvbl9tYXAuZ2V0KGNvbmRpdGlvbiwgY29uZGl0aW9uKQorICAgICAgICBpZiBlcnJvciBpbiBzZWxmLl9pZ25vcmVkX2ZsYWdzOgorICAgICAgICAgICAgIyBEb24ndCB0b3VjaCB0aGUgZmxhZworICAgICAgICAgICAgcmV0dXJuIGVycm9yKCkuaGFuZGxlKHNlbGYsICphcmdzKQorCisgICAgICAgIHNlbGYuZmxhZ3NbZXJyb3JdID0gMQorICAgICAgICBpZiBub3Qgc2VsZi50cmFwc1tlcnJvcl06CisgICAgICAgICAgICAjIFRoZSBlcnJvcnMgZGVmaW5lIGhvdyB0byBoYW5kbGUgdGhlbXNlbHZlcy4KKyAgICAgICAgICAgIHJldHVybiBjb25kaXRpb24oKS5oYW5kbGUoc2VsZiwgKmFyZ3MpCisKKyAgICAgICAgIyBFcnJvcnMgc2hvdWxkIG9ubHkgYmUgcmlza2VkIG9uIGNvcGllcyBvZiB0aGUgY29udGV4dAorICAgICAgICAjIHNlbGYuX2lnbm9yZWRfZmxhZ3MgPSBbXQorICAgICAgICByYWlzZSBlcnJvcihleHBsYW5hdGlvbikKKworICAgIGRlZiBfaWdub3JlX2FsbF9mbGFncyhzZWxmKToKKyAgICAgICAgIiIiSWdub3JlIGFsbCBmbGFncywgaWYgdGhleSBhcmUgcmFpc2VkIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pZ25vcmVfZmxhZ3MoKl9zaWduYWxzKQorCisgICAgZGVmIF9pZ25vcmVfZmxhZ3Moc2VsZiwgKmZsYWdzKToKKyAgICAgICAgIiIiSWdub3JlIHRoZSBmbGFncywgaWYgdGhleSBhcmUgcmFpc2VkIiIiCisgICAgICAgICMgRG8gbm90IG11dGF0ZS0tIFRoaXMgd2F5LCBjb3BpZXMgb2YgYSBjb250ZXh0IGxlYXZlIHRoZSBvcmlnaW5hbAorICAgICAgICAjIGFsb25lLgorICAgICAgICBzZWxmLl9pZ25vcmVkX2ZsYWdzID0gKHNlbGYuX2lnbm9yZWRfZmxhZ3MgKyBsaXN0KGZsYWdzKSkKKyAgICAgICAgcmV0dXJuIGxpc3QoZmxhZ3MpCisKKyAgICBkZWYgX3JlZ2FyZF9mbGFncyhzZWxmLCAqZmxhZ3MpOgorICAgICAgICAiIiJTdG9wIGlnbm9yaW5nIHRoZSBmbGFncywgaWYgdGhleSBhcmUgcmFpc2VkIiIiCisgICAgICAgIGlmIGZsYWdzIGFuZCBpc2luc3RhbmNlKGZsYWdzWzBdLCAodHVwbGUsbGlzdCkpOgorICAgICAgICAgICAgZmxhZ3MgPSBmbGFnc1swXQorICAgICAgICBmb3IgZmxhZyBpbiBmbGFnczoKKyAgICAgICAgICAgIHNlbGYuX2lnbm9yZWRfZmxhZ3MucmVtb3ZlKGZsYWcpCisKKyAgICAjIFdlIGluaGVyaXQgb2JqZWN0Ll9faGFzaF9fLCBzbyB3ZSBtdXN0IGRlbnkgdGhpcyBleHBsaWNpdGx5CisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgRXRpbnkoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgRXRpbnkgKD0gRW1pbiAtIHByZWMgKyAxKSIiIgorICAgICAgICByZXR1cm4gaW50KHNlbGYuRW1pbiAtIHNlbGYucHJlYyArIDEpCisKKyAgICBkZWYgRXRvcChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBtYXhpbXVtIGV4cG9uZW50ICg9IEVtYXggLSBwcmVjICsgMSkiIiIKKyAgICAgICAgcmV0dXJuIGludChzZWxmLkVtYXggLSBzZWxmLnByZWMgKyAxKQorCisgICAgZGVmIF9zZXRfcm91bmRpbmcoc2VsZiwgdHlwZSk6CisgICAgICAgICIiIlNldHMgdGhlIHJvdW5kaW5nIHR5cGUuCisKKyAgICAgICAgU2V0cyB0aGUgcm91bmRpbmcgdHlwZSwgYW5kIHJldHVybnMgdGhlIGN1cnJlbnQgKHByZXZpb3VzKQorICAgICAgICByb3VuZGluZyB0eXBlLiAgT2Z0ZW4gdXNlZCBsaWtlOgorCisgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LmNvcHkoKQorICAgICAgICAjIHNvIHlvdSBkb24ndCBjaGFuZ2UgdGhlIGNhbGxpbmcgY29udGV4dAorICAgICAgICAjIGlmIGFuIGVycm9yIG9jY3VycyBpbiB0aGUgbWlkZGxlLgorICAgICAgICByb3VuZGluZyA9IGNvbnRleHQuX3NldF9yb3VuZGluZyhST1VORF9VUCkKKyAgICAgICAgdmFsID0gc2VsZi5fX3N1Yl9fKG90aGVyLCBjb250ZXh0PWNvbnRleHQpCisgICAgICAgIGNvbnRleHQuX3NldF9yb3VuZGluZyhyb3VuZGluZykKKworICAgICAgICBUaGlzIHdpbGwgbWFrZSBpdCByb3VuZCB1cCBmb3IgdGhhdCBvcGVyYXRpb24uCisgICAgICAgICIiIgorICAgICAgICByb3VuZGluZyA9IHNlbGYucm91bmRpbmcKKyAgICAgICAgc2VsZi5yb3VuZGluZz0gdHlwZQorICAgICAgICByZXR1cm4gcm91bmRpbmcKKworICAgIGRlZiBjcmVhdGVfZGVjaW1hbChzZWxmLCBudW09JzAnKToKKyAgICAgICAgIiIiQ3JlYXRlcyBhIG5ldyBEZWNpbWFsIGluc3RhbmNlIGJ1dCB1c2luZyBzZWxmIGFzIGNvbnRleHQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgdG8tbnVtYmVyIG9wZXJhdGlvbiBvZiB0aGUKKyAgICAgICAgSUJNIERlY2ltYWwgc3BlY2lmaWNhdGlvbi4iIiIKKworICAgICAgICBpZiBpc2luc3RhbmNlKG51bSwgYmFzZXN0cmluZykgYW5kIG51bSAhPSBudW0uc3RyaXAoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yYWlzZV9lcnJvcihDb252ZXJzaW9uU3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyB0cmFpbGluZyBvciBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJtaXR0ZWQuIikKKworICAgICAgICBkID0gRGVjaW1hbChudW0sIGNvbnRleHQ9c2VsZikKKyAgICAgICAgaWYgZC5faXNuYW4oKSBhbmQgbGVuKGQuX2ludCkgPiBzZWxmLnByZWMgLSBzZWxmLl9jbGFtcDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yYWlzZV9lcnJvcihDb252ZXJzaW9uU3ludGF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaWFnbm9zdGljIGluZm8gdG9vIGxvbmcgaW4gTmFOIikKKyAgICAgICAgcmV0dXJuIGQuX2ZpeChzZWxmKQorCisgICAgZGVmIGNyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoc2VsZiwgZik6CisgICAgICAgICIiIkNyZWF0ZXMgYSBuZXcgRGVjaW1hbCBpbnN0YW5jZSBmcm9tIGEgZmxvYXQgYnV0IHJvdW5kaW5nIHVzaW5nIHNlbGYKKyAgICAgICAgYXMgdGhlIGNvbnRleHQuCisKKyAgICAgICAgPj4+IGNvbnRleHQgPSBDb250ZXh0KHByZWM9NSwgcm91bmRpbmc9Uk9VTkRfRE9XTikKKyAgICAgICAgPj4+IGNvbnRleHQuY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdCgzLjE0MTU5MjY1MzU4OTc5MzIpCisgICAgICAgIERlY2ltYWwoJzMuMTQxNScpCisgICAgICAgID4+PiBjb250ZXh0ID0gQ29udGV4dChwcmVjPTUsIHRyYXBzPVtJbmV4YWN0XSkKKyAgICAgICAgPj4+IGNvbnRleHQuY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdCgzLjE0MTU5MjY1MzU4OTc5MzIpCisgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgICAgIC4uLgorICAgICAgICBJbmV4YWN0OiBOb25lCisKKyAgICAgICAgIiIiCisgICAgICAgIGQgPSBEZWNpbWFsLmZyb21fZmxvYXQoZikgICAgICAgIyBBbiBleGFjdCBjb252ZXJzaW9uCisgICAgICAgIHJldHVybiBkLl9maXgoc2VsZikgICAgICAgICAgICAgIyBBcHBseSB0aGUgY29udGV4dCByb3VuZGluZworCisgICAgIyBNZXRob2RzCisgICAgZGVmIGFicyhzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIG9wZXJhbmQuCisKKyAgICAgICAgSWYgdGhlIG9wZXJhbmQgaXMgbmVnYXRpdmUsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgdXNpbmcgdGhlIG1pbnVzCisgICAgICAgIG9wZXJhdGlvbiBvbiB0aGUgb3BlcmFuZC4gIE90aGVyd2lzZSwgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB1c2luZworICAgICAgICB0aGUgcGx1cyBvcGVyYXRpb24gb24gdGhlIG9wZXJhbmQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5hYnMoRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJzIuMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWJzKERlY2ltYWwoJy0xMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5hYnMoRGVjaW1hbCgnMTAxLjUnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAxLjUnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmFicyhEZWNpbWFsKCctMTAxLjUnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAxLjUnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmFicygtMSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5fX2Fic19fKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBhZGQoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybiB0aGUgc3VtIG9mIHRoZSB0d28gb3BlcmFuZHMuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5hZGQoRGVjaW1hbCgnMTInKSwgRGVjaW1hbCgnNy4wMCcpKQorICAgICAgICBEZWNpbWFsKCcxOS4wMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWRkKERlY2ltYWwoJzFFKzInKSwgRGVjaW1hbCgnMS4wMUUrNCcpKQorICAgICAgICBEZWNpbWFsKCcxLjAyRSs0JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5hZGQoMSwgRGVjaW1hbCgyKSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuYWRkKERlY2ltYWwoOCksIDUpCisgICAgICAgIERlY2ltYWwoJzEzJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5hZGQoNSwgNSkKKyAgICAgICAgRGVjaW1hbCgnMTAnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19hZGRfXyhiLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIHIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgX2FwcGx5KHNlbGYsIGEpOgorICAgICAgICByZXR1cm4gc3RyKGEuX2ZpeChzZWxmKSkKKworICAgIGRlZiBjYW5vbmljYWwoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIHNhbWUgRGVjaW1hbCBvYmplY3QuCisKKyAgICAgICAgQXMgd2UgZG8gbm90IGhhdmUgZGlmZmVyZW50IGVuY29kaW5ncyBmb3IgdGhlIHNhbWUgbnVtYmVyLCB0aGUKKyAgICAgICAgcmVjZWl2ZWQgb2JqZWN0IGFscmVhZHkgaXMgaW4gaXRzIGNhbm9uaWNhbCBmb3JtLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY2Fub25pY2FsKERlY2ltYWwoJzIuNTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMi41MCcpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gYS5jYW5vbmljYWwoY29udGV4dD1zZWxmKQorCisgICAgZGVmIGNvbXBhcmUoc2VsZiwgYSwgYik6CisgICAgICAgICIiIkNvbXBhcmVzIHZhbHVlcyBudW1lcmljYWxseS4KKworICAgICAgICBJZiB0aGUgc2lnbnMgb2YgdGhlIG9wZXJhbmRzIGRpZmZlciwgYSB2YWx1ZSByZXByZXNlbnRpbmcgZWFjaCBvcGVyYW5kCisgICAgICAgICgnLTEnIGlmIHRoZSBvcGVyYW5kIGlzIGxlc3MgdGhhbiB6ZXJvLCAnMCcgaWYgdGhlIG9wZXJhbmQgaXMgemVybyBvcgorICAgICAgICBuZWdhdGl2ZSB6ZXJvLCBvciAnMScgaWYgdGhlIG9wZXJhbmQgaXMgZ3JlYXRlciB0aGFuIHplcm8pIGlzIHVzZWQgaW4KKyAgICAgICAgcGxhY2Ugb2YgdGhhdCBvcGVyYW5kIGZvciB0aGUgY29tcGFyaXNvbiBpbnN0ZWFkIG9mIHRoZSBhY3R1YWwKKyAgICAgICAgb3BlcmFuZC4KKworICAgICAgICBUaGUgY29tcGFyaXNvbiBpcyB0aGVuIGVmZmVjdGVkIGJ5IHN1YnRyYWN0aW5nIHRoZSBzZWNvbmQgb3BlcmFuZCBmcm9tCisgICAgICAgIHRoZSBmaXJzdCBhbmQgdGhlbiByZXR1cm5pbmcgYSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiB0aGUKKyAgICAgICAgc3VidHJhY3Rpb246ICctMScgaWYgdGhlIHJlc3VsdCBpcyBsZXNzIHRoYW4gemVybywgJzAnIGlmIHRoZSByZXN1bHQgaXMKKyAgICAgICAgemVybyBvciBuZWdhdGl2ZSB6ZXJvLCBvciAnMScgaWYgdGhlIHJlc3VsdCBpcyBncmVhdGVyIHRoYW4gemVyby4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoRGVjaW1hbCgnMi4xJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoRGVjaW1hbCgnMi4xJyksIERlY2ltYWwoJzIuMScpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlKERlY2ltYWwoJzIuMScpLCBEZWNpbWFsKCcyLjEwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoRGVjaW1hbCgnMycpLCBEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZShEZWNpbWFsKCcyLjEnKSwgRGVjaW1hbCgnLTMnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZShEZWNpbWFsKCctMycpLCBEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoMSwgMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoRGVjaW1hbCgxKSwgMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmUoMSwgRGVjaW1hbCgyKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuY29tcGFyZShiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgY29tcGFyZV9zaWduYWwoc2VsZiwgYSwgYik6CisgICAgICAgICIiIkNvbXBhcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIHR3byBvcGVyYW5kcyBudW1lcmljYWxseS4KKworICAgICAgICBJdCdzIHByZXR0eSBtdWNoIGxpa2UgY29tcGFyZSgpLCBidXQgYWxsIE5hTnMgc2lnbmFsLCB3aXRoIHNpZ25hbGluZworICAgICAgICBOYU5zIHRha2luZyBwcmVjZWRlbmNlIG92ZXIgcXVpZXQgTmFOcy4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dAorICAgICAgICA+Pj4gYy5jb21wYXJlX3NpZ25hbChEZWNpbWFsKCcyLjEnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBjLmNvbXBhcmVfc2lnbmFsKERlY2ltYWwoJzIuMScpLCBEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBjLmZsYWdzW0ludmFsaWRPcGVyYXRpb25dID0gMAorICAgICAgICA+Pj4gcHJpbnQgYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXQorICAgICAgICAwCisgICAgICAgID4+PiBjLmNvbXBhcmVfc2lnbmFsKERlY2ltYWwoJ05hTicpLCBEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnTmFOJykKKyAgICAgICAgPj4+IHByaW50IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0KKyAgICAgICAgMQorICAgICAgICA+Pj4gYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDAKKyAgICAgICAgPj4+IHByaW50IGMuZmxhZ3NbSW52YWxpZE9wZXJhdGlvbl0KKyAgICAgICAgMAorICAgICAgICA+Pj4gYy5jb21wYXJlX3NpZ25hbChEZWNpbWFsKCdzTmFOJyksIERlY2ltYWwoJzIuMScpKQorICAgICAgICBEZWNpbWFsKCdOYU4nKQorICAgICAgICA+Pj4gcHJpbnQgYy5mbGFnc1tJbnZhbGlkT3BlcmF0aW9uXQorICAgICAgICAxCisgICAgICAgID4+PiBjLmNvbXBhcmVfc2lnbmFsKC0xLCAyKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBjLmNvbXBhcmVfc2lnbmFsKERlY2ltYWwoLTEpLCAyKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBjLmNvbXBhcmVfc2lnbmFsKC0xLCBEZWNpbWFsKDIpKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5jb21wYXJlX3NpZ25hbChiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgY29tcGFyZV90b3RhbChzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiQ29tcGFyZXMgdHdvIG9wZXJhbmRzIHVzaW5nIHRoZWlyIGFic3RyYWN0IHJlcHJlc2VudGF0aW9uLgorCisgICAgICAgIFRoaXMgaXMgbm90IGxpa2UgdGhlIHN0YW5kYXJkIGNvbXBhcmUsIHdoaWNoIHVzZSB0aGVpciBudW1lcmljYWwKKyAgICAgICAgdmFsdWUuIE5vdGUgdGhhdCBhIHRvdGFsIG9yZGVyaW5nIGlzIGRlZmluZWQgZm9yIGFsbCBwb3NzaWJsZSBhYnN0cmFjdAorICAgICAgICByZXByZXNlbnRhdGlvbnMuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlX3RvdGFsKERlY2ltYWwoJzEyLjczJyksIERlY2ltYWwoJzEyNy45JykpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlX3RvdGFsKERlY2ltYWwoJy0xMjcnKSwgIERlY2ltYWwoJzEyJykpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb21wYXJlX3RvdGFsKERlY2ltYWwoJzEyLjMwJyksIERlY2ltYWwoJzEyLjMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmVfdG90YWwoRGVjaW1hbCgnMTIuMzAnKSwgRGVjaW1hbCgnMTIuMzAnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZV90b3RhbChEZWNpbWFsKCcxMi4zJyksICBEZWNpbWFsKCcxMi4zMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29tcGFyZV90b3RhbChEZWNpbWFsKCcxMi4zJyksICBEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmVfdG90YWwoMSwgMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmVfdG90YWwoRGVjaW1hbCgxKSwgMikKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvbXBhcmVfdG90YWwoMSwgRGVjaW1hbCgyKSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuY29tcGFyZV90b3RhbChiKQorCisgICAgZGVmIGNvbXBhcmVfdG90YWxfbWFnKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJDb21wYXJlcyB0d28gb3BlcmFuZHMgdXNpbmcgdGhlaXIgYWJzdHJhY3QgcmVwcmVzZW50YXRpb24gaWdub3Jpbmcgc2lnbi4KKworICAgICAgICBMaWtlIGNvbXBhcmVfdG90YWwsIGJ1dCB3aXRoIG9wZXJhbmQncyBzaWduIGlnbm9yZWQgYW5kIGFzc3VtZWQgdG8gYmUgMC4KKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmNvbXBhcmVfdG90YWxfbWFnKGIpCisKKyAgICBkZWYgY29weV9hYnMoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgYSBjb3B5IG9mIHRoZSBvcGVyYW5kIHdpdGggdGhlIHNpZ24gc2V0IHRvIDAuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X2FicyhEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnMi4xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X2FicyhEZWNpbWFsKCctMTAwJykpCisgICAgICAgIERlY2ltYWwoJzEwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9hYnMoLTEpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuY29weV9hYnMoKQorCisgICAgZGVmIGNvcHlfZGVjaW1hbChzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGNvcHkgb2YgdGhlIGRlY2ltYWwgb2JqZWN0LgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9kZWNpbWFsKERlY2ltYWwoJzIuMScpKQorICAgICAgICBEZWNpbWFsKCcyLjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfZGVjaW1hbChEZWNpbWFsKCctMS4wMCcpKQorICAgICAgICBEZWNpbWFsKCctMS4wMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9kZWNpbWFsKDEpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIERlY2ltYWwoYSkKKworICAgIGRlZiBjb3B5X25lZ2F0ZShzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGNvcHkgb2YgdGhlIG9wZXJhbmQgd2l0aCB0aGUgc2lnbiBpbnZlcnRlZC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfbmVnYXRlKERlY2ltYWwoJzEwMS41JykpCisgICAgICAgIERlY2ltYWwoJy0xMDEuNScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9uZWdhdGUoRGVjaW1hbCgnLTEwMS41JykpCisgICAgICAgIERlY2ltYWwoJzEwMS41JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X25lZ2F0ZSgxKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5jb3B5X25lZ2F0ZSgpCisKKyAgICBkZWYgY29weV9zaWduKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJDb3BpZXMgdGhlIHNlY29uZCBvcGVyYW5kJ3Mgc2lnbiB0byB0aGUgZmlyc3Qgb25lLgorCisgICAgICAgIEluIGRldGFpbCwgaXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIGZpcnN0IG9wZXJhbmQgd2l0aCB0aGUgc2lnbgorICAgICAgICBlcXVhbCB0byB0aGUgc2lnbiBvZiB0aGUgc2Vjb25kIG9wZXJhbmQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X3NpZ24oRGVjaW1hbCggJzEuNTAnKSwgRGVjaW1hbCgnNy4zMycpKQorICAgICAgICBEZWNpbWFsKCcxLjUwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X3NpZ24oRGVjaW1hbCgnLTEuNTAnKSwgRGVjaW1hbCgnNy4zMycpKQorICAgICAgICBEZWNpbWFsKCcxLjUwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5jb3B5X3NpZ24oRGVjaW1hbCggJzEuNTAnKSwgRGVjaW1hbCgnLTcuMzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuNTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmNvcHlfc2lnbihEZWNpbWFsKCctMS41MCcpLCBEZWNpbWFsKCctNy4zMycpKQorICAgICAgICBEZWNpbWFsKCctMS41MCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9zaWduKDEsIC0yKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9zaWduKERlY2ltYWwoMSksIC0yKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuY29weV9zaWduKDEsIERlY2ltYWwoLTIpKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5jb3B5X3NpZ24oYikKKworICAgIGRlZiBkaXZpZGUoc2VsZiwgYSwgYik6CisgICAgICAgICIiIkRlY2ltYWwgZGl2aXNpb24gaW4gYSBzcGVjaWZpZWQgY29udGV4dC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKCcxJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMC4zMzMzMzMzMzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKCcyJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMC42NjY2NjY2NjcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKCc1JyksIERlY2ltYWwoJzInKSkKKyAgICAgICAgRGVjaW1hbCgnMi41JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCcxMCcpKQorICAgICAgICBEZWNpbWFsKCcwLjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKCcxMicpLCBEZWNpbWFsKCcxMicpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnOC4wMCcpLCBEZWNpbWFsKCcyJykpCisgICAgICAgIERlY2ltYWwoJzQuMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKCcyLjQwMCcpLCBEZWNpbWFsKCcyLjAnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4yMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2aWRlKERlY2ltYWwoJzEwMDAnKSwgRGVjaW1hbCgnMTAwJykpCisgICAgICAgIERlY2ltYWwoJzEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoRGVjaW1hbCgnMTAwMCcpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzEwMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKCcyLjQwRSs2JyksIERlY2ltYWwoJzInKSkKKyAgICAgICAgRGVjaW1hbCgnMS4yMEUrNicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2aWRlKDUsIDUpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZShEZWNpbWFsKDUpLCA1KQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGUoNSwgRGVjaW1hbCg1KSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByID0gYS5fX2Rpdl9fKGIsIGNvbnRleHQ9c2VsZikKKyAgICAgICAgaWYgciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXMgdG8gRGVjaW1hbCIgJSBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBkaXZpZGVfaW50KHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJEaXZpZGVzIHR3byBudW1iZXJzIGFuZCByZXR1cm5zIHRoZSBpbnRlZ2VyIHBhcnQgb2YgdGhlIHJlc3VsdC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZV9pbnQoRGVjaW1hbCgnMicpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZV9pbnQoRGVjaW1hbCgnMTAnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZpZGVfaW50KERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMC4zJykpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZV9pbnQoMTAsIDMpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZV9pbnQoRGVjaW1hbCgxMCksIDMpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdmlkZV9pbnQoMTAsIERlY2ltYWwoMykpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19mbG9vcmRpdl9fKGIsIGNvbnRleHQ9c2VsZikKKyAgICAgICAgaWYgciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXMgdG8gRGVjaW1hbCIgJSBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBkaXZtb2Qoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybiAoYSAvLyBiLCBhICUgYikuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZtb2QoRGVjaW1hbCg4KSwgRGVjaW1hbCgzKSkKKyAgICAgICAgKERlY2ltYWwoJzInKSwgRGVjaW1hbCgnMicpKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdm1vZChEZWNpbWFsKDgpLCBEZWNpbWFsKDQpKQorICAgICAgICAoRGVjaW1hbCgnMicpLCBEZWNpbWFsKCcwJykpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZGl2bW9kKDgsIDQpCisgICAgICAgIChEZWNpbWFsKCcyJyksIERlY2ltYWwoJzAnKSkKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5kaXZtb2QoRGVjaW1hbCg4KSwgNCkKKyAgICAgICAgKERlY2ltYWwoJzInKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmRpdm1vZCg4LCBEZWNpbWFsKDQpKQorICAgICAgICAoRGVjaW1hbCgnMicpLCBEZWNpbWFsKCcwJykpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByID0gYS5fX2Rpdm1vZF9fKGIsIGNvbnRleHQ9c2VsZikKKyAgICAgICAgaWYgciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXMgdG8gRGVjaW1hbCIgJSBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiBleHAoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgZSAqKiBhLgorCisgICAgICAgID4+PiBjID0gRXh0ZW5kZWRDb250ZXh0LmNvcHkoKQorICAgICAgICA+Pj4gYy5FbWluID0gLTk5OQorICAgICAgICA+Pj4gYy5FbWF4ID0gOTk5CisgICAgICAgID4+PiBjLmV4cChEZWNpbWFsKCctSW5maW5pdHknKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBjLmV4cChEZWNpbWFsKCctMScpKQorICAgICAgICBEZWNpbWFsKCcwLjM2Nzg3OTQ0MScpCisgICAgICAgID4+PiBjLmV4cChEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gYy5leHAoRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcyLjcxODI4MTgzJykKKyAgICAgICAgPj4+IGMuZXhwKERlY2ltYWwoJzAuNjkzMTQ3MTgxJykpCisgICAgICAgIERlY2ltYWwoJzIuMDAwMDAwMDAnKQorICAgICAgICA+Pj4gYy5leHAoRGVjaW1hbCgnK0luZmluaXR5JykpCisgICAgICAgIERlY2ltYWwoJ0luZmluaXR5JykKKyAgICAgICAgPj4+IGMuZXhwKDEwKQorICAgICAgICBEZWNpbWFsKCcyMjAyNi40NjU4JykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPV9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuZXhwKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBmbWEoc2VsZiwgYSwgYiwgYyk6CisgICAgICAgICIiIlJldHVybnMgYSBtdWx0aXBsaWVkIGJ5IGIsIHBsdXMgYy4KKworICAgICAgICBUaGUgZmlyc3QgdHdvIG9wZXJhbmRzIGFyZSBtdWx0aXBsaWVkIHRvZ2V0aGVyLCB1c2luZyBtdWx0aXBseSwKKyAgICAgICAgdGhlIHRoaXJkIG9wZXJhbmQgaXMgdGhlbiBhZGRlZCB0byB0aGUgcmVzdWx0IG9mIHRoYXQKKyAgICAgICAgbXVsdGlwbGljYXRpb24sIHVzaW5nIGFkZCwgYWxsIHdpdGggb25seSBvbmUgZmluYWwgcm91bmRpbmcuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5mbWEoRGVjaW1hbCgnMycpLCBEZWNpbWFsKCc1JyksIERlY2ltYWwoJzcnKSkKKyAgICAgICAgRGVjaW1hbCgnMjInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmZtYShEZWNpbWFsKCczJyksIERlY2ltYWwoJy01JyksIERlY2ltYWwoJzcnKSkKKyAgICAgICAgRGVjaW1hbCgnLTgnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmZtYShEZWNpbWFsKCc4ODg1NjUyOTAnKSwgRGVjaW1hbCgnMTU1Ny45NjkzMCcpLCBEZWNpbWFsKCctODYwODcuNzU3OCcpKQorICAgICAgICBEZWNpbWFsKCcxLjM4NDM1NzM2RSsxMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuZm1hKDEsIDMsIDQpCisgICAgICAgIERlY2ltYWwoJzcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmZtYSgxLCBEZWNpbWFsKDMpLCA0KQorICAgICAgICBEZWNpbWFsKCc3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5mbWEoMSwgMywgRGVjaW1hbCg0KSkKKyAgICAgICAgRGVjaW1hbCgnNycpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5mbWEoYiwgYywgY29udGV4dD1zZWxmKQorCisgICAgZGVmIGlzX2Nhbm9uaWNhbChzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgY2Fub25pY2FsOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgIEN1cnJlbnRseSwgdGhlIGVuY29kaW5nIG9mIGEgRGVjaW1hbCBpbnN0YW5jZSBpcyBhbHdheXMKKyAgICAgICAgY2Fub25pY2FsLCBzbyB0aGlzIG1ldGhvZCByZXR1cm5zIFRydWUgZm9yIGFueSBEZWNpbWFsLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfY2Fub25pY2FsKERlY2ltYWwoJzIuNTAnKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGEuaXNfY2Fub25pY2FsKCkKKworICAgIGRlZiBpc19maW5pdGUoc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIGZpbml0ZTsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICBBIERlY2ltYWwgaW5zdGFuY2UgaXMgY29uc2lkZXJlZCBmaW5pdGUgaWYgaXQgaXMgbmVpdGhlcgorICAgICAgICBpbmZpbml0ZSBub3IgYSBOYU4uCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19maW5pdGUoRGVjaW1hbCgnMi41MCcpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfZmluaXRlKERlY2ltYWwoJy0wLjMnKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX2Zpbml0ZShEZWNpbWFsKCcwJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19maW5pdGUoRGVjaW1hbCgnSW5mJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfZmluaXRlKERlY2ltYWwoJ05hTicpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX2Zpbml0ZSgxKQorICAgICAgICBUcnVlCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5pc19maW5pdGUoKQorCisgICAgZGVmIGlzX2luZmluaXRlKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcyBpbmZpbml0ZTsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX2luZmluaXRlKERlY2ltYWwoJzIuNTAnKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19pbmZpbml0ZShEZWNpbWFsKCctSW5mJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19pbmZpbml0ZShEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19pbmZpbml0ZSgxKQorICAgICAgICBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuaXNfaW5maW5pdGUoKQorCisgICAgZGVmIGlzX25hbihzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgYSBxTmFOIG9yIHNOYU47CisgICAgICAgIG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19uYW4oRGVjaW1hbCgnMi41MCcpKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX25hbihEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX25hbihEZWNpbWFsKCctc05hTicpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfbmFuKDEpCisgICAgICAgIEZhbHNlCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5pc19uYW4oKQorCisgICAgZGVmIGlzX25vcm1hbChzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgYSBub3JtYWwgbnVtYmVyOworICAgICAgICBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgID4+PiBjID0gRXh0ZW5kZWRDb250ZXh0LmNvcHkoKQorICAgICAgICA+Pj4gYy5FbWluID0gLTk5OQorICAgICAgICA+Pj4gYy5FbWF4ID0gOTk5CisgICAgICAgID4+PiBjLmlzX25vcm1hbChEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IGMuaXNfbm9ybWFsKERlY2ltYWwoJzAuMUUtOTk5JykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX25vcm1hbChEZWNpbWFsKCcwLjAwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX25vcm1hbChEZWNpbWFsKCctSW5mJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX25vcm1hbChEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IGMuaXNfbm9ybWFsKDEpCisgICAgICAgIFRydWUKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmlzX25vcm1hbChjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgaXNfcW5hbihzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgYSBxdWlldCBOYU47IG90aGVyd2lzZSByZXR1cm4gRmFsc2UuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19xbmFuKERlY2ltYWwoJzIuNTAnKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19xbmFuKERlY2ltYWwoJ05hTicpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfcW5hbihEZWNpbWFsKCdzTmFOJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfcW5hbigxKQorICAgICAgICBGYWxzZQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuaXNfcW5hbigpCisKKyAgICBkZWYgaXNfc2lnbmVkKHNlbGYsIGEpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiB0aGUgb3BlcmFuZCBpcyBuZWdhdGl2ZTsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3NpZ25lZChEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfc2lnbmVkKERlY2ltYWwoJy0xMicpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfc2lnbmVkKERlY2ltYWwoJy0wJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19zaWduZWQoOCkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19zaWduZWQoLTgpCisgICAgICAgIFRydWUKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmlzX3NpZ25lZCgpCisKKyAgICBkZWYgaXNfc25hbihzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgYSBzaWduYWxpbmcgTmFOOworICAgICAgICBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfc25hbihEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfc25hbihEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5pc19zbmFuKERlY2ltYWwoJ3NOYU4nKSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3NuYW4oMSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmlzX3NuYW4oKQorCisgICAgZGVmIGlzX3N1Ym5vcm1hbChzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIG9wZXJhbmQgaXMgc3Vibm9ybWFsOyBvdGhlcndpc2UgcmV0dXJuIEZhbHNlLgorCisgICAgICAgID4+PiBjID0gRXh0ZW5kZWRDb250ZXh0LmNvcHkoKQorICAgICAgICA+Pj4gYy5FbWluID0gLTk5OQorICAgICAgICA+Pj4gYy5FbWF4ID0gOTk5CisgICAgICAgID4+PiBjLmlzX3N1Ym5vcm1hbChEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX3N1Ym5vcm1hbChEZWNpbWFsKCcwLjFFLTk5OScpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBjLmlzX3N1Ym5vcm1hbChEZWNpbWFsKCcwLjAwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX3N1Ym5vcm1hbChEZWNpbWFsKCctSW5mJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBjLmlzX3N1Ym5vcm1hbChEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IGMuaXNfc3Vibm9ybWFsKDEpCisgICAgICAgIEZhbHNlCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5pc19zdWJub3JtYWwoY29udGV4dD1zZWxmKQorCisgICAgZGVmIGlzX3plcm8oc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBvcGVyYW5kIGlzIGEgemVybzsgb3RoZXJ3aXNlIHJldHVybiBGYWxzZS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3plcm8oRGVjaW1hbCgnMCcpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfemVybyhEZWNpbWFsKCcyLjUwJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfemVybyhEZWNpbWFsKCctMEUrMicpKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuaXNfemVybygxKQorICAgICAgICBGYWxzZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmlzX3plcm8oMCkKKyAgICAgICAgVHJ1ZQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuaXNfemVybygpCisKKyAgICBkZWYgbG4oc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIG5hdHVyYWwgKGJhc2UgZSkgbG9nYXJpdGhtIG9mIHRoZSBvcGVyYW5kLgorCisgICAgICAgID4+PiBjID0gRXh0ZW5kZWRDb250ZXh0LmNvcHkoKQorICAgICAgICA+Pj4gYy5FbWluID0gLTk5OQorICAgICAgICA+Pj4gYy5FbWF4ID0gOTk5CisgICAgICAgID4+PiBjLmxuKERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnLUluZmluaXR5JykKKyAgICAgICAgPj4+IGMubG4oRGVjaW1hbCgnMS4wMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBjLmxuKERlY2ltYWwoJzIuNzE4MjgxODMnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wMDAwMDAwMCcpCisgICAgICAgID4+PiBjLmxuKERlY2ltYWwoJzEwJykpCisgICAgICAgIERlY2ltYWwoJzIuMzAyNTg1MDknKQorICAgICAgICA+Pj4gYy5sbihEZWNpbWFsKCcrSW5maW5pdHknKSkKKyAgICAgICAgRGVjaW1hbCgnSW5maW5pdHknKQorICAgICAgICA+Pj4gYy5sbigxKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmxuKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBsb2cxMChzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgYmFzZSAxMCBsb2dhcml0aG0gb2YgdGhlIG9wZXJhbmQuCisKKyAgICAgICAgPj4+IGMgPSBFeHRlbmRlZENvbnRleHQuY29weSgpCisgICAgICAgID4+PiBjLkVtaW4gPSAtOTk5CisgICAgICAgID4+PiBjLkVtYXggPSA5OTkKKyAgICAgICAgPj4+IGMubG9nMTAoRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCctSW5maW5pdHknKQorICAgICAgICA+Pj4gYy5sb2cxMChEZWNpbWFsKCcwLjAwMScpKQorICAgICAgICBEZWNpbWFsKCctMycpCisgICAgICAgID4+PiBjLmxvZzEwKERlY2ltYWwoJzEuMDAwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gYy5sb2cxMChEZWNpbWFsKCcyJykpCisgICAgICAgIERlY2ltYWwoJzAuMzAxMDI5OTk2JykKKyAgICAgICAgPj4+IGMubG9nMTAoRGVjaW1hbCgnMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBjLmxvZzEwKERlY2ltYWwoJzcwJykpCisgICAgICAgIERlY2ltYWwoJzEuODQ1MDk4MDQnKQorICAgICAgICA+Pj4gYy5sb2cxMChEZWNpbWFsKCcrSW5maW5pdHknKSkKKyAgICAgICAgRGVjaW1hbCgnSW5maW5pdHknKQorICAgICAgICA+Pj4gYy5sb2cxMCgwKQorICAgICAgICBEZWNpbWFsKCctSW5maW5pdHknKQorICAgICAgICA+Pj4gYy5sb2cxMCgxKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmxvZzEwKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBsb2diKHNlbGYsIGEpOgorICAgICAgICAiIiIgUmV0dXJucyB0aGUgZXhwb25lbnQgb2YgdGhlIG1hZ25pdHVkZSBvZiB0aGUgb3BlcmFuZCdzIE1TRC4KKworICAgICAgICBUaGUgcmVzdWx0IGlzIHRoZSBpbnRlZ2VyIHdoaWNoIGlzIHRoZSBleHBvbmVudCBvZiB0aGUgbWFnbml0dWRlCisgICAgICAgIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IGRpZ2l0IG9mIHRoZSBvcGVyYW5kIChhcyB0aG91Z2ggdGhlCisgICAgICAgIG9wZXJhbmQgd2VyZSB0cnVuY2F0ZWQgdG8gYSBzaW5nbGUgZGlnaXQgd2hpbGUgbWFpbnRhaW5pbmcgdGhlCisgICAgICAgIHZhbHVlIG9mIHRoYXQgZGlnaXQgYW5kIHdpdGhvdXQgbGltaXRpbmcgdGhlIHJlc3VsdGluZyBleHBvbmVudCkuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2diKERlY2ltYWwoJzI1MCcpKQorICAgICAgICBEZWNpbWFsKCcyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2diKERlY2ltYWwoJzIuNTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9nYihEZWNpbWFsKCcwLjAzJykpCisgICAgICAgIERlY2ltYWwoJy0yJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2diKERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnLUluZmluaXR5JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2diKDEpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2IoMTApCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2IoMTAwKQorICAgICAgICBEZWNpbWFsKCcyJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmxvZ2IoY29udGV4dD1zZWxmKQorCisgICAgZGVmIGxvZ2ljYWxfYW5kKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJBcHBsaWVzIHRoZSBsb2dpY2FsIG9wZXJhdGlvbiAnYW5kJyBiZXR3ZWVuIGVhY2ggb3BlcmFuZCdzIGRpZ2l0cy4KKworICAgICAgICBUaGUgb3BlcmFuZHMgbXVzdCBiZSBib3RoIGxvZ2ljYWwgbnVtYmVycy4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfYW5kKERlY2ltYWwoJzAnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2FuZChEZWNpbWFsKCcwJyksIERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9hbmQoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfYW5kKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2FuZChEZWNpbWFsKCcxMTAwJyksIERlY2ltYWwoJzEwMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9hbmQoRGVjaW1hbCgnMTExMScpLCBEZWNpbWFsKCcxMCcpKQorICAgICAgICBEZWNpbWFsKCcxMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9hbmQoMTEwLCAxMTAxKQorICAgICAgICBEZWNpbWFsKCcxMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfYW5kKERlY2ltYWwoMTEwKSwgMTEwMSkKKyAgICAgICAgRGVjaW1hbCgnMTAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2FuZCgxMTAsIERlY2ltYWwoMTEwMSkpCisgICAgICAgIERlY2ltYWwoJzEwMCcpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5sb2dpY2FsX2FuZChiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbG9naWNhbF9pbnZlcnQoc2VsZiwgYSk6CisgICAgICAgICIiIkludmVydCBhbGwgdGhlIGRpZ2l0cyBpbiB0aGUgb3BlcmFuZC4KKworICAgICAgICBUaGUgb3BlcmFuZCBtdXN0IGJlIGEgbG9naWNhbCBudW1iZXIuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2ludmVydChEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzExMTExMTExMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9pbnZlcnQoRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxMTExMTExMTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfaW52ZXJ0KERlY2ltYWwoJzExMTExMTExMScpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX2ludmVydChEZWNpbWFsKCcxMDEwMTAxMDEnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAxMDEwMTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfaW52ZXJ0KDExMDEpCisgICAgICAgIERlY2ltYWwoJzExMTExMDAxMCcpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5sb2dpY2FsX2ludmVydChjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbG9naWNhbF9vcihzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiQXBwbGllcyB0aGUgbG9naWNhbCBvcGVyYXRpb24gJ29yJyBiZXR3ZWVuIGVhY2ggb3BlcmFuZCdzIGRpZ2l0cy4KKworICAgICAgICBUaGUgb3BlcmFuZHMgbXVzdCBiZSBib3RoIGxvZ2ljYWwgbnVtYmVycy4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoRGVjaW1hbCgnMCcpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoRGVjaW1hbCgnMCcpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoRGVjaW1hbCgnMTEwMCcpLCBEZWNpbWFsKCcxMDEwJykpCisgICAgICAgIERlY2ltYWwoJzExMTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoRGVjaW1hbCgnMTExMCcpLCBEZWNpbWFsKCcxMCcpKQorICAgICAgICBEZWNpbWFsKCcxMTEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX29yKDExMCwgMTEwMSkKKyAgICAgICAgRGVjaW1hbCgnMTExMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF9vcihEZWNpbWFsKDExMCksIDExMDEpCisgICAgICAgIERlY2ltYWwoJzExMTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfb3IoMTEwLCBEZWNpbWFsKDExMDEpKQorICAgICAgICBEZWNpbWFsKCcxMTExJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLmxvZ2ljYWxfb3IoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIGxvZ2ljYWxfeG9yKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJBcHBsaWVzIHRoZSBsb2dpY2FsIG9wZXJhdGlvbiAneG9yJyBiZXR3ZWVuIGVhY2ggb3BlcmFuZCdzIGRpZ2l0cy4KKworICAgICAgICBUaGUgb3BlcmFuZHMgbXVzdCBiZSBib3RoIGxvZ2ljYWwgbnVtYmVycy4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfeG9yKERlY2ltYWwoJzAnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX3hvcihEZWNpbWFsKCcwJyksIERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF94b3IoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfeG9yKERlY2ltYWwoJzEnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX3hvcihEZWNpbWFsKCcxMTAwJyksIERlY2ltYWwoJzEwMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX3hvcihEZWNpbWFsKCcxMTExJyksIERlY2ltYWwoJzEwJykpCisgICAgICAgIERlY2ltYWwoJzExMDEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LmxvZ2ljYWxfeG9yKDExMCwgMTEwMSkKKyAgICAgICAgRGVjaW1hbCgnMTAxMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubG9naWNhbF94b3IoRGVjaW1hbCgxMTApLCAxMTAxKQorICAgICAgICBEZWNpbWFsKCcxMDExJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5sb2dpY2FsX3hvcigxMTAsIERlY2ltYWwoMTEwMSkpCisgICAgICAgIERlY2ltYWwoJzEwMTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubG9naWNhbF94b3IoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIG1heChzZWxmLCBhLCBiKToKKyAgICAgICAgIiIibWF4IGNvbXBhcmVzIHR3byB2YWx1ZXMgbnVtZXJpY2FsbHkgYW5kIHJldHVybnMgdGhlIG1heGltdW0uCisKKyAgICAgICAgSWYgZWl0aGVyIG9wZXJhbmQgaXMgYSBOYU4gdGhlbiB0aGUgZ2VuZXJhbCBydWxlcyBhcHBseS4KKyAgICAgICAgT3RoZXJ3aXNlLCB0aGUgb3BlcmFuZHMgYXJlIGNvbXBhcmVkIGFzIHRob3VnaCBieSB0aGUgY29tcGFyZQorICAgICAgICBvcGVyYXRpb24uICBJZiB0aGV5IGFyZSBudW1lcmljYWxseSBlcXVhbCB0aGVuIHRoZSBsZWZ0LWhhbmQgb3BlcmFuZAorICAgICAgICBpcyBjaG9zZW4gYXMgdGhlIHJlc3VsdC4gIE90aGVyd2lzZSB0aGUgbWF4aW11bSAoY2xvc2VyIHRvIHBvc2l0aXZlCisgICAgICAgIGluZmluaXR5KSBvZiB0aGUgdHdvIG9wZXJhbmRzIGlzIGNob3NlbiBhcyB0aGUgcmVzdWx0LgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4KERlY2ltYWwoJzMnKSwgRGVjaW1hbCgnMicpKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tYXgoRGVjaW1hbCgnLTEwJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4KERlY2ltYWwoJzEuMCcpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heChEZWNpbWFsKCc3JyksIERlY2ltYWwoJ05hTicpKQorICAgICAgICBEZWNpbWFsKCc3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tYXgoMSwgMikKKyAgICAgICAgRGVjaW1hbCgnMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4KERlY2ltYWwoMSksIDIpCisgICAgICAgIERlY2ltYWwoJzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heCgxLCBEZWNpbWFsKDIpKQorICAgICAgICBEZWNpbWFsKCcyJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm1heChiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbWF4X21hZyhzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiQ29tcGFyZXMgdGhlIHZhbHVlcyBudW1lcmljYWxseSB3aXRoIHRoZWlyIHNpZ24gaWdub3JlZC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heF9tYWcoRGVjaW1hbCgnNycpLCBEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgRGVjaW1hbCgnNycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4X21hZyhEZWNpbWFsKCc3JyksIERlY2ltYWwoJy0xMCcpKQorICAgICAgICBEZWNpbWFsKCctMTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1heF9tYWcoMSwgLTIpCisgICAgICAgIERlY2ltYWwoJy0yJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tYXhfbWFnKERlY2ltYWwoMSksIC0yKQorICAgICAgICBEZWNpbWFsKCctMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWF4X21hZygxLCBEZWNpbWFsKC0yKSkKKyAgICAgICAgRGVjaW1hbCgnLTInKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubWF4X21hZyhiLCBjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbWluKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJtaW4gY29tcGFyZXMgdHdvIHZhbHVlcyBudW1lcmljYWxseSBhbmQgcmV0dXJucyB0aGUgbWluaW11bS4KKworICAgICAgICBJZiBlaXRoZXIgb3BlcmFuZCBpcyBhIE5hTiB0aGVuIHRoZSBnZW5lcmFsIHJ1bGVzIGFwcGx5LgorICAgICAgICBPdGhlcndpc2UsIHRoZSBvcGVyYW5kcyBhcmUgY29tcGFyZWQgYXMgdGhvdWdoIGJ5IHRoZSBjb21wYXJlCisgICAgICAgIG9wZXJhdGlvbi4gIElmIHRoZXkgYXJlIG51bWVyaWNhbGx5IGVxdWFsIHRoZW4gdGhlIGxlZnQtaGFuZCBvcGVyYW5kCisgICAgICAgIGlzIGNob3NlbiBhcyB0aGUgcmVzdWx0LiAgT3RoZXJ3aXNlIHRoZSBtaW5pbXVtIChjbG9zZXIgdG8gbmVnYXRpdmUKKyAgICAgICAgaW5maW5pdHkpIG9mIHRoZSB0d28gb3BlcmFuZHMgaXMgY2hvc2VuIGFzIHRoZSByZXN1bHQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW4oRGVjaW1hbCgnMycpLCBEZWNpbWFsKCcyJykpCisgICAgICAgIERlY2ltYWwoJzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbihEZWNpbWFsKCctMTAnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCctMTAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbihEZWNpbWFsKCcxLjAnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcxLjAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbihEZWNpbWFsKCc3JyksIERlY2ltYWwoJ05hTicpKQorICAgICAgICBEZWNpbWFsKCc3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW4oMSwgMikKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWluKERlY2ltYWwoMSksIDIpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbigxLCBEZWNpbWFsKDI5KSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS5taW4oYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIG1pbl9tYWcoc2VsZiwgYSwgYik6CisgICAgICAgICIiIkNvbXBhcmVzIHRoZSB2YWx1ZXMgbnVtZXJpY2FsbHkgd2l0aCB0aGVpciBzaWduIGlnbm9yZWQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW5fbWFnKERlY2ltYWwoJzMnKSwgRGVjaW1hbCgnLTInKSkKKyAgICAgICAgRGVjaW1hbCgnLTInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbl9tYWcoRGVjaW1hbCgnLTMnKSwgRGVjaW1hbCgnTmFOJykpCisgICAgICAgIERlY2ltYWwoJy0zJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW5fbWFnKDEsIC0yKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW5fbWFnKERlY2ltYWwoMSksIC0yKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW5fbWFnKDEsIERlY2ltYWwoLTIpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm1pbl9tYWcoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIG1pbnVzKHNlbGYsIGEpOgorICAgICAgICAiIiJNaW51cyBjb3JyZXNwb25kcyB0byB1bmFyeSBwcmVmaXggbWludXMgaW4gUHl0aG9uLgorCisgICAgICAgIFRoZSBvcGVyYXRpb24gaXMgZXZhbHVhdGVkIHVzaW5nIHRoZSBzYW1lIHJ1bGVzIGFzIHN1YnRyYWN0OyB0aGUKKyAgICAgICAgb3BlcmF0aW9uIG1pbnVzKGEpIGlzIGNhbGN1bGF0ZWQgYXMgc3VidHJhY3QoJzAnLCBhKSB3aGVyZSB0aGUgJzAnCisgICAgICAgIGhhcyB0aGUgc2FtZSBleHBvbmVudCBhcyB0aGUgb3BlcmFuZC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm1pbnVzKERlY2ltYWwoJzEuMycpKQorICAgICAgICBEZWNpbWFsKCctMS4zJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5taW51cyhEZWNpbWFsKCctMS4zJykpCisgICAgICAgIERlY2ltYWwoJzEuMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubWludXMoMSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuX19uZWdfXyhjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbXVsdGlwbHkoc2VsZiwgYSwgYik6CisgICAgICAgICIiIm11bHRpcGx5IG11bHRpcGxpZXMgdHdvIG9wZXJhbmRzLgorCisgICAgICAgIElmIGVpdGhlciBvcGVyYW5kIGlzIGEgc3BlY2lhbCB2YWx1ZSB0aGVuIHRoZSBnZW5lcmFsIHJ1bGVzIGFwcGx5LgorICAgICAgICBPdGhlcndpc2UsIHRoZSBvcGVyYW5kcyBhcmUgbXVsdGlwbGllZCB0b2dldGhlcgorICAgICAgICAoJ2xvbmcgbXVsdGlwbGljYXRpb24nKSwgcmVzdWx0aW5nIGluIGEgbnVtYmVyIHdoaWNoIG1heSBiZSBhcyBsb25nIGFzCisgICAgICAgIHRoZSBzdW0gb2YgdGhlIGxlbmd0aHMgb2YgdGhlIHR3byBvcGVyYW5kcy4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm11bHRpcGx5KERlY2ltYWwoJzEuMjAnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCczLjYwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tdWx0aXBseShEZWNpbWFsKCc3JyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm11bHRpcGx5KERlY2ltYWwoJzAuOScpLCBEZWNpbWFsKCcwLjgnKSkKKyAgICAgICAgRGVjaW1hbCgnMC43MicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubXVsdGlwbHkoRGVjaW1hbCgnMC45JyksIERlY2ltYWwoJy0wJykpCisgICAgICAgIERlY2ltYWwoJy0wLjAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm11bHRpcGx5KERlY2ltYWwoJzY1NDMyMScpLCBEZWNpbWFsKCc2NTQzMjEnKSkKKyAgICAgICAgRGVjaW1hbCgnNC4yODEzNTk3MUUrMTEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm11bHRpcGx5KDcsIDcpCisgICAgICAgIERlY2ltYWwoJzQ5JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5tdWx0aXBseShEZWNpbWFsKDcpLCA3KQorICAgICAgICBEZWNpbWFsKCc0OScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubXVsdGlwbHkoNywgRGVjaW1hbCg3KSkKKyAgICAgICAgRGVjaW1hbCgnNDknKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgciA9IGEuX19tdWxfXyhiLCBjb250ZXh0PXNlbGYpCisgICAgICAgIGlmIHIgaXMgTm90SW1wbGVtZW50ZWQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiByCisKKyAgICBkZWYgbmV4dF9taW51cyhzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIG51bWJlciBzbWFsbGVyIHRoYW4gYS4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm5leHRfbWludXMoRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCcwLjk5OTk5OTk5OScpCisgICAgICAgID4+PiBjLm5leHRfbWludXMoRGVjaW1hbCgnMUUtMTAwNycpKQorICAgICAgICBEZWNpbWFsKCcwRS0xMDA3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5uZXh0X21pbnVzKERlY2ltYWwoJy0xLjAwMDAwMDAzJykpCisgICAgICAgIERlY2ltYWwoJy0xLjAwMDAwMDA0JykKKyAgICAgICAgPj4+IGMubmV4dF9taW51cyhEZWNpbWFsKCdJbmZpbml0eScpKQorICAgICAgICBEZWNpbWFsKCc5Ljk5OTk5OTk5RSs5OTknKQorICAgICAgICA+Pj4gYy5uZXh0X21pbnVzKDEpCisgICAgICAgIERlY2ltYWwoJzAuOTk5OTk5OTk5JykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm5leHRfbWludXMoY29udGV4dD1zZWxmKQorCisgICAgZGVmIG5leHRfcGx1cyhzZWxmLCBhKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIgbGFyZ2VyIHRoYW4gYS4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm5leHRfcGx1cyhEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzEuMDAwMDAwMDEnKQorICAgICAgICA+Pj4gYy5uZXh0X3BsdXMoRGVjaW1hbCgnLTFFLTEwMDcnKSkKKyAgICAgICAgRGVjaW1hbCgnLTBFLTEwMDcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm5leHRfcGx1cyhEZWNpbWFsKCctMS4wMDAwMDAwMycpKQorICAgICAgICBEZWNpbWFsKCctMS4wMDAwMDAwMicpCisgICAgICAgID4+PiBjLm5leHRfcGx1cyhEZWNpbWFsKCctSW5maW5pdHknKSkKKyAgICAgICAgRGVjaW1hbCgnLTkuOTk5OTk5OTlFKzk5OScpCisgICAgICAgID4+PiBjLm5leHRfcGx1cygxKQorICAgICAgICBEZWNpbWFsKCcxLjAwMDAwMDAxJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLm5leHRfcGx1cyhjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgbmV4dF90b3dhcmQoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybnMgdGhlIG51bWJlciBjbG9zZXN0IHRvIGEsIGluIGRpcmVjdGlvbiB0b3dhcmRzIGIuCisKKyAgICAgICAgVGhlIHJlc3VsdCBpcyB0aGUgY2xvc2VzdCByZXByZXNlbnRhYmxlIG51bWJlciBmcm9tIHRoZSBmaXJzdAorICAgICAgICBvcGVyYW5kIChidXQgbm90IHRoZSBmaXJzdCBvcGVyYW5kKSB0aGF0IGlzIGluIHRoZSBkaXJlY3Rpb24KKyAgICAgICAgdG93YXJkcyB0aGUgc2Vjb25kIG9wZXJhbmQsIHVubGVzcyB0aGUgb3BlcmFuZHMgaGF2ZSB0aGUgc2FtZQorICAgICAgICB2YWx1ZS4KKworICAgICAgICA+Pj4gYyA9IEV4dGVuZGVkQ29udGV4dC5jb3B5KCkKKyAgICAgICAgPj4+IGMuRW1pbiA9IC05OTkKKyAgICAgICAgPj4+IGMuRW1heCA9IDk5OQorICAgICAgICA+Pj4gYy5uZXh0X3Rvd2FyZChEZWNpbWFsKCcxJyksIERlY2ltYWwoJzInKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wMDAwMDAwMScpCisgICAgICAgID4+PiBjLm5leHRfdG93YXJkKERlY2ltYWwoJy0xRS0xMDA3JyksIERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnLTBFLTEwMDcnKQorICAgICAgICA+Pj4gYy5uZXh0X3Rvd2FyZChEZWNpbWFsKCctMS4wMDAwMDAwMycpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJy0xLjAwMDAwMDAyJykKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoRGVjaW1hbCgnMScpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzAuOTk5OTk5OTk5JykKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoRGVjaW1hbCgnMUUtMTAwNycpLCBEZWNpbWFsKCctMTAwJykpCisgICAgICAgIERlY2ltYWwoJzBFLTEwMDcnKQorICAgICAgICA+Pj4gYy5uZXh0X3Rvd2FyZChEZWNpbWFsKCctMS4wMDAwMDAwMycpLCBEZWNpbWFsKCctMTAnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuMDAwMDAwMDQnKQorICAgICAgICA+Pj4gYy5uZXh0X3Rvd2FyZChEZWNpbWFsKCcwLjAwJyksIERlY2ltYWwoJy0wLjAwMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnLTAuMDAnKQorICAgICAgICA+Pj4gYy5uZXh0X3Rvd2FyZCgwLCAxKQorICAgICAgICBEZWNpbWFsKCcxRS0xMDA3JykKKyAgICAgICAgPj4+IGMubmV4dF90b3dhcmQoRGVjaW1hbCgwKSwgMSkKKyAgICAgICAgRGVjaW1hbCgnMUUtMTAwNycpCisgICAgICAgID4+PiBjLm5leHRfdG93YXJkKDAsIERlY2ltYWwoMSkpCisgICAgICAgIERlY2ltYWwoJzFFLTEwMDcnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubmV4dF90b3dhcmQoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIG5vcm1hbGl6ZShzZWxmLCBhKToKKyAgICAgICAgIiIibm9ybWFsaXplIHJlZHVjZXMgYW4gb3BlcmFuZCB0byBpdHMgc2ltcGxlc3QgZm9ybS4KKworICAgICAgICBFc3NlbnRpYWxseSBhIHBsdXMgb3BlcmF0aW9uIHdpdGggYWxsIHRyYWlsaW5nIHplcm9zIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgcmVzdWx0LgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubm9ybWFsaXplKERlY2ltYWwoJzIuMScpKQorICAgICAgICBEZWNpbWFsKCcyLjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0Lm5vcm1hbGl6ZShEZWNpbWFsKCctMi4wJykpCisgICAgICAgIERlY2ltYWwoJy0yJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5ub3JtYWxpemUoRGVjaW1hbCgnMS4yMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4yJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5ub3JtYWxpemUoRGVjaW1hbCgnLTEyMCcpKQorICAgICAgICBEZWNpbWFsKCctMS4yRSsyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5ub3JtYWxpemUoRGVjaW1hbCgnMTIwLjAwJykpCisgICAgICAgIERlY2ltYWwoJzEuMkUrMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubm9ybWFsaXplKERlY2ltYWwoJzAuMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQubm9ybWFsaXplKDYpCisgICAgICAgIERlY2ltYWwoJzYnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubm9ybWFsaXplKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBudW1iZXJfY2xhc3Moc2VsZiwgYSk6CisgICAgICAgICIiIlJldHVybnMgYW4gaW5kaWNhdGlvbiBvZiB0aGUgY2xhc3Mgb2YgdGhlIG9wZXJhbmQuCisKKyAgICAgICAgVGhlIGNsYXNzIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHN0cmluZ3M6CisgICAgICAgICAgLXNOYU4KKyAgICAgICAgICAtTmFOCisgICAgICAgICAgLUluZmluaXR5CisgICAgICAgICAgLU5vcm1hbAorICAgICAgICAgIC1TdWJub3JtYWwKKyAgICAgICAgICAtWmVybworICAgICAgICAgICtaZXJvCisgICAgICAgICAgK1N1Ym5vcm1hbAorICAgICAgICAgICtOb3JtYWwKKyAgICAgICAgICArSW5maW5pdHkKKworICAgICAgICA+Pj4gYyA9IENvbnRleHQoRXh0ZW5kZWRDb250ZXh0KQorICAgICAgICA+Pj4gYy5FbWluID0gLTk5OQorICAgICAgICA+Pj4gYy5FbWF4ID0gOTk5CisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCdJbmZpbml0eScpKQorICAgICAgICAnK0luZmluaXR5JworICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgnMUUtMTAnKSkKKyAgICAgICAgJytOb3JtYWwnCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCcyLjUwJykpCisgICAgICAgICcrTm9ybWFsJworICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgnMC4xRS05OTknKSkKKyAgICAgICAgJytTdWJub3JtYWwnCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCcwJykpCisgICAgICAgICcrWmVybycKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJy0wJykpCisgICAgICAgICctWmVybycKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJy0wLjFFLTk5OScpKQorICAgICAgICAnLVN1Ym5vcm1hbCcKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJy0xRS0xMCcpKQorICAgICAgICAnLU5vcm1hbCcKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJy0yLjUwJykpCisgICAgICAgICctTm9ybWFsJworICAgICAgICA+Pj4gYy5udW1iZXJfY2xhc3MoRGVjaW1hbCgnLUluZmluaXR5JykpCisgICAgICAgICctSW5maW5pdHknCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcyhEZWNpbWFsKCdOYU4nKSkKKyAgICAgICAgJ05hTicKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJy1OYU4nKSkKKyAgICAgICAgJ05hTicKKyAgICAgICAgPj4+IGMubnVtYmVyX2NsYXNzKERlY2ltYWwoJ3NOYU4nKSkKKyAgICAgICAgJ3NOYU4nCisgICAgICAgID4+PiBjLm51bWJlcl9jbGFzcygxMjMpCisgICAgICAgICcrTm9ybWFsJworICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEubnVtYmVyX2NsYXNzKGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBwbHVzKHNlbGYsIGEpOgorICAgICAgICAiIiJQbHVzIGNvcnJlc3BvbmRzIHRvIHVuYXJ5IHByZWZpeCBwbHVzIGluIFB5dGhvbi4KKworICAgICAgICBUaGUgb3BlcmF0aW9uIGlzIGV2YWx1YXRlZCB1c2luZyB0aGUgc2FtZSBydWxlcyBhcyBhZGQ7IHRoZQorICAgICAgICBvcGVyYXRpb24gcGx1cyhhKSBpcyBjYWxjdWxhdGVkIGFzIGFkZCgnMCcsIGEpIHdoZXJlIHRoZSAnMCcKKyAgICAgICAgaGFzIHRoZSBzYW1lIGV4cG9uZW50IGFzIHRoZSBvcGVyYW5kLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucGx1cyhEZWNpbWFsKCcxLjMnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4zJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5wbHVzKERlY2ltYWwoJy0xLjMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEuMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucGx1cygtMSkKKyAgICAgICAgRGVjaW1hbCgnLTEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuX19wb3NfXyhjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgcG93ZXIoc2VsZiwgYSwgYiwgbW9kdWxvPU5vbmUpOgorICAgICAgICAiIiJSYWlzZXMgYSB0byB0aGUgcG93ZXIgb2YgYiwgdG8gbW9kdWxvIGlmIGdpdmVuLgorCisgICAgICAgIFdpdGggdHdvIGFyZ3VtZW50cywgY29tcHV0ZSBhKipiLiAgSWYgYSBpcyBuZWdhdGl2ZSB0aGVuIGIKKyAgICAgICAgbXVzdCBiZSBpbnRlZ3JhbC4gIFRoZSByZXN1bHQgd2lsbCBiZSBpbmV4YWN0IHVubGVzcyBiIGlzCisgICAgICAgIGludGVncmFsIGFuZCB0aGUgcmVzdWx0IGlzIGZpbml0ZSBhbmQgY2FuIGJlIGV4cHJlc3NlZCBleGFjdGx5CisgICAgICAgIGluICdwcmVjaXNpb24nIGRpZ2l0cy4KKworICAgICAgICBXaXRoIHRocmVlIGFyZ3VtZW50cywgY29tcHV0ZSAoYSoqYikgJSBtb2R1bG8uICBGb3IgdGhlCisgICAgICAgIHRocmVlIGFyZ3VtZW50IGZvcm0sIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zIG9uIHRoZQorICAgICAgICBhcmd1bWVudHMgaG9sZDoKKworICAgICAgICAgLSBhbGwgdGhyZWUgYXJndW1lbnRzIG11c3QgYmUgaW50ZWdyYWwKKyAgICAgICAgIC0gYiBtdXN0IGJlIG5vbm5lZ2F0aXZlCisgICAgICAgICAtIGF0IGxlYXN0IG9uZSBvZiBhIG9yIGIgbXVzdCBiZSBub256ZXJvCisgICAgICAgICAtIG1vZHVsbyBtdXN0IGJlIG5vbnplcm8gYW5kIGhhdmUgYXQgbW9zdCAncHJlY2lzaW9uJyBkaWdpdHMKKworICAgICAgICBUaGUgcmVzdWx0IG9mIHBvdyhhLCBiLCBtb2R1bG8pIGlzIGlkZW50aWNhbCB0byB0aGUgcmVzdWx0CisgICAgICAgIHRoYXQgd291bGQgYmUgb2J0YWluZWQgYnkgY29tcHV0aW5nIChhKipiKSAlIG1vZHVsbyB3aXRoCisgICAgICAgIHVuYm91bmRlZCBwcmVjaXNpb24sIGJ1dCBpcyBjb21wdXRlZCBtb3JlIGVmZmljaWVudGx5LiAgSXQgaXMKKyAgICAgICAgYWx3YXlzIGV4YWN0LgorCisgICAgICAgID4+PiBjID0gRXh0ZW5kZWRDb250ZXh0LmNvcHkoKQorICAgICAgICA+Pj4gYy5FbWluID0gLTk5OQorICAgICAgICA+Pj4gYy5FbWF4ID0gOTk5CisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJzInKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCc4JykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnLTInKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCctOCcpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJzInKSwgRGVjaW1hbCgnLTMnKSkKKyAgICAgICAgRGVjaW1hbCgnMC4xMjUnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCcxLjcnKSwgRGVjaW1hbCgnOCcpKQorICAgICAgICBEZWNpbWFsKCc2OS43NTc1NzQ0JykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnMTAnKSwgRGVjaW1hbCgnMC4zMDEwMjk5OTYnKSkKKyAgICAgICAgRGVjaW1hbCgnMi4wMDAwMDAwMCcpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJ0luZmluaXR5JyksIERlY2ltYWwoJy0xJykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCdJbmZpbml0eScpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCdJbmZpbml0eScpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJ0luZmluaXR5JykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnLUluZmluaXR5JyksIERlY2ltYWwoJy0xJykpCisgICAgICAgIERlY2ltYWwoJy0wJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnLUluZmluaXR5JyksIERlY2ltYWwoJzAnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJy1JbmZpbml0eScpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJy1JbmZpbml0eScpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJy1JbmZpbml0eScpLCBEZWNpbWFsKCcyJykpCisgICAgICAgIERlY2ltYWwoJ0luZmluaXR5JykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnMCcpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJ05hTicpCisKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnMycpLCBEZWNpbWFsKCc3JyksIERlY2ltYWwoJzE2JykpCisgICAgICAgIERlY2ltYWwoJzExJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnLTMnKSwgRGVjaW1hbCgnNycpLCBEZWNpbWFsKCcxNicpKQorICAgICAgICBEZWNpbWFsKCctMTEnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCctMycpLCBEZWNpbWFsKCc4JyksIERlY2ltYWwoJzE2JykpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCczJyksIERlY2ltYWwoJzcnKSwgRGVjaW1hbCgnLTE2JykpCisgICAgICAgIERlY2ltYWwoJzExJykKKyAgICAgICAgPj4+IGMucG93ZXIoRGVjaW1hbCgnMjNFMTIzNDUnKSwgRGVjaW1hbCgnNjdFMTg5JyksIERlY2ltYWwoJzEyMzQ1Njc4OScpKQorICAgICAgICBEZWNpbWFsKCcxMTcyOTgzMCcpCisgICAgICAgID4+PiBjLnBvd2VyKERlY2ltYWwoJy0wJyksIERlY2ltYWwoJzE3JyksIERlY2ltYWwoJzE3MjknKSkKKyAgICAgICAgRGVjaW1hbCgnLTAnKQorICAgICAgICA+Pj4gYy5wb3dlcihEZWNpbWFsKCctMjMnKSwgRGVjaW1hbCgnMCcpLCBEZWNpbWFsKCc2NTUzNycpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5wb3dlcig3LCA3KQorICAgICAgICBEZWNpbWFsKCc4MjM1NDMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnBvd2VyKERlY2ltYWwoNyksIDcpCisgICAgICAgIERlY2ltYWwoJzgyMzU0MycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucG93ZXIoNywgRGVjaW1hbCg3KSwgMikKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByID0gYS5fX3Bvd19fKGIsIG1vZHVsbywgY29udGV4dD1zZWxmKQorICAgICAgICBpZiByIGlzIE5vdEltcGxlbWVudGVkOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJVbmFibGUgdG8gY29udmVydCAlcyB0byBEZWNpbWFsIiAlIGIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIHF1YW50aXplKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm5zIGEgdmFsdWUgZXF1YWwgdG8gJ2EnIChyb3VuZGVkKSwgaGF2aW5nIHRoZSBleHBvbmVudCBvZiAnYicuCisKKyAgICAgICAgVGhlIGNvZWZmaWNpZW50IG9mIHRoZSByZXN1bHQgaXMgZGVyaXZlZCBmcm9tIHRoYXQgb2YgdGhlIGxlZnQtaGFuZAorICAgICAgICBvcGVyYW5kLiAgSXQgbWF5IGJlIHJvdW5kZWQgdXNpbmcgdGhlIGN1cnJlbnQgcm91bmRpbmcgc2V0dGluZyAoaWYgdGhlCisgICAgICAgIGV4cG9uZW50IGlzIGJlaW5nIGluY3JlYXNlZCksIG11bHRpcGxpZWQgYnkgYSBwb3NpdGl2ZSBwb3dlciBvZiB0ZW4gKGlmCisgICAgICAgIHRoZSBleHBvbmVudCBpcyBiZWluZyBkZWNyZWFzZWQpLCBvciBpcyB1bmNoYW5nZWQgKGlmIHRoZSBleHBvbmVudCBpcworICAgICAgICBhbHJlYWR5IGVxdWFsIHRvIHRoYXQgb2YgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCkuCisKKyAgICAgICAgVW5saWtlIG90aGVyIG9wZXJhdGlvbnMsIGlmIHRoZSBsZW5ndGggb2YgdGhlIGNvZWZmaWNpZW50IGFmdGVyIHRoZQorICAgICAgICBxdWFudGl6ZSBvcGVyYXRpb24gd291bGQgYmUgZ3JlYXRlciB0aGFuIHByZWNpc2lvbiB0aGVuIGFuIEludmFsaWQKKyAgICAgICAgb3BlcmF0aW9uIGNvbmRpdGlvbiBpcyByYWlzZWQuICBUaGlzIGd1YXJhbnRlZXMgdGhhdCwgdW5sZXNzIHRoZXJlIGlzCisgICAgICAgIGFuIGVycm9yIGNvbmRpdGlvbiwgdGhlIGV4cG9uZW50IG9mIHRoZSByZXN1bHQgb2YgYSBxdWFudGl6ZSBpcyBhbHdheXMKKyAgICAgICAgZXF1YWwgdG8gdGhhdCBvZiB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kLgorCisgICAgICAgIEFsc28gdW5saWtlIG90aGVyIG9wZXJhdGlvbnMsIHF1YW50aXplIHdpbGwgbmV2ZXIgcmFpc2UgVW5kZXJmbG93LCBldmVuCisgICAgICAgIGlmIHRoZSByZXN1bHQgaXMgc3Vibm9ybWFsIGFuZCBpbmV4YWN0LgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnMi4xNycpLCBEZWNpbWFsKCcwLjAwMScpKQorICAgICAgICBEZWNpbWFsKCcyLjE3MCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnMi4xNycpLCBEZWNpbWFsKCcwLjAxJykpCisgICAgICAgIERlY2ltYWwoJzIuMTcnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMC4xJykpCisgICAgICAgIERlY2ltYWwoJzIuMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnMi4xNycpLCBEZWNpbWFsKCcxZSswJykpCisgICAgICAgIERlY2ltYWwoJzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMWUrMScpKQorICAgICAgICBEZWNpbWFsKCcwRSsxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCctSW5mJyksIERlY2ltYWwoJ0luZmluaXR5JykpCisgICAgICAgIERlY2ltYWwoJy1JbmZpbml0eScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnMicpLCBEZWNpbWFsKCdJbmZpbml0eScpKQorICAgICAgICBEZWNpbWFsKCdOYU4nKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJy0wLjEnKSwgRGVjaW1hbCgnMScpKQorICAgICAgICBEZWNpbWFsKCctMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnLTAnKSwgRGVjaW1hbCgnMWUrNScpKQorICAgICAgICBEZWNpbWFsKCctMEUrNScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnKzM1MjM2NDUwLjYnKSwgRGVjaW1hbCgnMWUtMicpKQorICAgICAgICBEZWNpbWFsKCdOYU4nKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJy0zNTIzNjQ1MC42JyksIERlY2ltYWwoJzFlLTInKSkKKyAgICAgICAgRGVjaW1hbCgnTmFOJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCcyMTcnKSwgRGVjaW1hbCgnMWUtMScpKQorICAgICAgICBEZWNpbWFsKCcyMTcuMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucXVhbnRpemUoRGVjaW1hbCgnMjE3JyksIERlY2ltYWwoJzFlLTAnKSkKKyAgICAgICAgRGVjaW1hbCgnMjE3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5xdWFudGl6ZShEZWNpbWFsKCcyMTcnKSwgRGVjaW1hbCgnMWUrMScpKQorICAgICAgICBEZWNpbWFsKCcyLjJFKzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoJzIxNycpLCBEZWNpbWFsKCcxZSsyJykpCisgICAgICAgIERlY2ltYWwoJzJFKzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKDEsIDIpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKERlY2ltYWwoMSksIDIpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnF1YW50aXplKDEsIERlY2ltYWwoMikpCisgICAgICAgIERlY2ltYWwoJzEnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEucXVhbnRpemUoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIHJhZGl4KHNlbGYpOgorICAgICAgICAiIiJKdXN0IHJldHVybnMgMTAsIGFzIHRoaXMgaXMgRGVjaW1hbCwgOikKKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJhZGl4KCkKKyAgICAgICAgRGVjaW1hbCgnMTAnKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIERlY2ltYWwoMTApCisKKyAgICBkZWYgcmVtYWluZGVyKHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSByZW1haW5kZXIgZnJvbSBpbnRlZ2VyIGRpdmlzaW9uLgorCisgICAgICAgIFRoZSByZXN1bHQgaXMgdGhlIHJlc2lkdWUgb2YgdGhlIGRpdmlkZW5kIGFmdGVyIHRoZSBvcGVyYXRpb24gb2YKKyAgICAgICAgY2FsY3VsYXRpbmcgaW50ZWdlciBkaXZpc2lvbiBhcyBkZXNjcmliZWQgZm9yIGRpdmlkZS1pbnRlZ2VyLCByb3VuZGVkCisgICAgICAgIHRvIHByZWNpc2lvbiBkaWdpdHMgaWYgbmVjZXNzYXJ5LiAgVGhlIHNpZ24gb2YgdGhlIHJlc3VsdCwgaWYKKyAgICAgICAgbm9uLXplcm8sIGlzIHRoZSBzYW1lIGFzIHRoYXQgb2YgdGhlIG9yaWdpbmFsIGRpdmlkZW5kLgorCisgICAgICAgIFRoaXMgb3BlcmF0aW9uIHdpbGwgZmFpbCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzIGludGVnZXIgZGl2aXNpb24KKyAgICAgICAgKHRoYXQgaXMsIGlmIGludGVnZXIgZGl2aXNpb24gb24gdGhlIHNhbWUgdHdvIG9wZXJhbmRzIHdvdWxkIGZhaWwsIHRoZQorICAgICAgICByZW1haW5kZXIgY2Fubm90IGJlIGNhbGN1bGF0ZWQpLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyKERlY2ltYWwoJzIuMScpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzIuMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyKERlY2ltYWwoJzEwJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyKERlY2ltYWwoJy0xMCcpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJy0xJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yZW1haW5kZXIoRGVjaW1hbCgnMTAuMicpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzAuMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyKERlY2ltYWwoJzEwJyksIERlY2ltYWwoJzAuMycpKQorICAgICAgICBEZWNpbWFsKCcwLjEnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcihEZWNpbWFsKCczLjYnKSwgRGVjaW1hbCgnMS4zJykpCisgICAgICAgIERlY2ltYWwoJzEuMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyKDIyLCA2KQorICAgICAgICBEZWNpbWFsKCc0JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yZW1haW5kZXIoRGVjaW1hbCgyMiksIDYpCisgICAgICAgIERlY2ltYWwoJzQnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcigyMiwgRGVjaW1hbCg2KSkKKyAgICAgICAgRGVjaW1hbCgnNCcpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByID0gYS5fX21vZF9fKGIsIGNvbnRleHQ9c2VsZikKKyAgICAgICAgaWYgciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXMgdG8gRGVjaW1hbCIgJSBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiByZW1haW5kZXJfbmVhcihzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiUmV0dXJucyB0byBiZSAiYSAtIGIgKiBuIiwgd2hlcmUgbiBpcyB0aGUgaW50ZWdlciBuZWFyZXN0IHRoZSBleGFjdAorICAgICAgICB2YWx1ZSBvZiAieCAvIGIiIChpZiB0d28gaW50ZWdlcnMgYXJlIGVxdWFsbHkgbmVhciB0aGVuIHRoZSBldmVuIG9uZQorICAgICAgICBpcyBjaG9zZW4pLiAgSWYgdGhlIHJlc3VsdCBpcyBlcXVhbCB0byAwIHRoZW4gaXRzIHNpZ24gd2lsbCBiZSB0aGUKKyAgICAgICAgc2lnbiBvZiBhLgorCisgICAgICAgIFRoaXMgb3BlcmF0aW9uIHdpbGwgZmFpbCB1bmRlciB0aGUgc2FtZSBjb25kaXRpb25zIGFzIGludGVnZXIgZGl2aXNpb24KKyAgICAgICAgKHRoYXQgaXMsIGlmIGludGVnZXIgZGl2aXNpb24gb24gdGhlIHNhbWUgdHdvIG9wZXJhbmRzIHdvdWxkIGZhaWwsIHRoZQorICAgICAgICByZW1haW5kZXIgY2Fubm90IGJlIGNhbGN1bGF0ZWQpLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgnMi4xJyksIERlY2ltYWwoJzMnKSkKKyAgICAgICAgRGVjaW1hbCgnLTAuOScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgnMTAnKSwgRGVjaW1hbCgnNicpKQorICAgICAgICBEZWNpbWFsKCctMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgnMTAnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCcxJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yZW1haW5kZXJfbmVhcihEZWNpbWFsKCctMTAnKSwgRGVjaW1hbCgnMycpKQorICAgICAgICBEZWNpbWFsKCctMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgnMTAuMicpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIERlY2ltYWwoJzAuMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgnMTAnKSwgRGVjaW1hbCgnMC4zJykpCisgICAgICAgIERlY2ltYWwoJzAuMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgnMy42JyksIERlY2ltYWwoJzEuMycpKQorICAgICAgICBEZWNpbWFsKCctMC4zJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yZW1haW5kZXJfbmVhcigzLCAxMSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucmVtYWluZGVyX25lYXIoRGVjaW1hbCgzKSwgMTEpCisgICAgICAgIERlY2ltYWwoJzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJlbWFpbmRlcl9uZWFyKDMsIERlY2ltYWwoMTEpKQorICAgICAgICBEZWNpbWFsKCczJykKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnJlbWFpbmRlcl9uZWFyKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiByb3RhdGUoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybnMgYSByb3RhdGVkIGNvcHkgb2YgYSwgYiB0aW1lcy4KKworICAgICAgICBUaGUgY29lZmZpY2llbnQgb2YgdGhlIHJlc3VsdCBpcyBhIHJvdGF0ZWQgY29weSBvZiB0aGUgZGlnaXRzIGluCisgICAgICAgIHRoZSBjb2VmZmljaWVudCBvZiB0aGUgZmlyc3Qgb3BlcmFuZC4gIFRoZSBudW1iZXIgb2YgcGxhY2VzIG9mCisgICAgICAgIHJvdGF0aW9uIGlzIHRha2VuIGZyb20gdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSBzZWNvbmQgb3BlcmFuZCwKKyAgICAgICAgd2l0aCB0aGUgcm90YXRpb24gYmVpbmcgdG8gdGhlIGxlZnQgaWYgdGhlIHNlY29uZCBvcGVyYW5kIGlzCisgICAgICAgIHBvc2l0aXZlIG9yIHRvIHRoZSByaWdodCBvdGhlcndpc2UuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yb3RhdGUoRGVjaW1hbCgnMzQnKSwgRGVjaW1hbCgnOCcpKQorICAgICAgICBEZWNpbWFsKCc0MDAwMDAwMDMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJvdGF0ZShEZWNpbWFsKCcxMicpLCBEZWNpbWFsKCc5JykpCisgICAgICAgIERlY2ltYWwoJzEyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yb3RhdGUoRGVjaW1hbCgnMTIzNDU2Nzg5JyksIERlY2ltYWwoJy0yJykpCisgICAgICAgIERlY2ltYWwoJzg5MTIzNDU2NycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucm90YXRlKERlY2ltYWwoJzEyMzQ1Njc4OScpLCBEZWNpbWFsKCcwJykpCisgICAgICAgIERlY2ltYWwoJzEyMzQ1Njc4OScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucm90YXRlKERlY2ltYWwoJzEyMzQ1Njc4OScpLCBEZWNpbWFsKCcrMicpKQorICAgICAgICBEZWNpbWFsKCczNDU2Nzg5MTInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnJvdGF0ZSgxMzMzMzMzLCAxKQorICAgICAgICBEZWNpbWFsKCcxMzMzMzMzMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQucm90YXRlKERlY2ltYWwoMTMzMzMzMyksIDEpCisgICAgICAgIERlY2ltYWwoJzEzMzMzMzMwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5yb3RhdGUoMTMzMzMzMywgRGVjaW1hbCgxKSkKKyAgICAgICAgRGVjaW1hbCgnMTMzMzMzMzAnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEucm90YXRlKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBzYW1lX3F1YW50dW0oc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybnMgVHJ1ZSBpZiB0aGUgdHdvIG9wZXJhbmRzIGhhdmUgdGhlIHNhbWUgZXhwb25lbnQuCisKKyAgICAgICAgVGhlIHJlc3VsdCBpcyBuZXZlciBhZmZlY3RlZCBieSBlaXRoZXIgdGhlIHNpZ24gb3IgdGhlIGNvZWZmaWNpZW50IG9mCisgICAgICAgIGVpdGhlciBvcGVyYW5kLgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2FtZV9xdWFudHVtKERlY2ltYWwoJzIuMTcnKSwgRGVjaW1hbCgnMC4wMDEnKSkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zYW1lX3F1YW50dW0oRGVjaW1hbCgnMi4xNycpLCBEZWNpbWFsKCcwLjAxJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zYW1lX3F1YW50dW0oRGVjaW1hbCgnMi4xNycpLCBEZWNpbWFsKCcxJykpCisgICAgICAgIEZhbHNlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2FtZV9xdWFudHVtKERlY2ltYWwoJ0luZicpLCBEZWNpbWFsKCctSW5mJykpCisgICAgICAgIFRydWUKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zYW1lX3F1YW50dW0oMTAwMDAsIC0xKQorICAgICAgICBUcnVlCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2FtZV9xdWFudHVtKERlY2ltYWwoMTAwMDApLCAtMSkKKyAgICAgICAgVHJ1ZQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNhbWVfcXVhbnR1bSgxMDAwMCwgRGVjaW1hbCgtMSkpCisgICAgICAgIFRydWUKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnNhbWVfcXVhbnR1bShiKQorCisgICAgZGVmIHNjYWxlYiAoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybnMgdGhlIGZpcnN0IG9wZXJhbmQgYWZ0ZXIgYWRkaW5nIHRoZSBzZWNvbmQgdmFsdWUgaXRzIGV4cC4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNjYWxlYihEZWNpbWFsKCc3LjUwJyksIERlY2ltYWwoJy0yJykpCisgICAgICAgIERlY2ltYWwoJzAuMDc1MCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2NhbGViKERlY2ltYWwoJzcuNTAnKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCc3LjUwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zY2FsZWIoRGVjaW1hbCgnNy41MCcpLCBEZWNpbWFsKCczJykpCisgICAgICAgIERlY2ltYWwoJzcuNTBFKzMnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNjYWxlYigxLCA0KQorICAgICAgICBEZWNpbWFsKCcxRSs0JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zY2FsZWIoRGVjaW1hbCgxKSwgNCkKKyAgICAgICAgRGVjaW1hbCgnMUUrNCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc2NhbGViKDEsIERlY2ltYWwoNCkpCisgICAgICAgIERlY2ltYWwoJzFFKzQnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuc2NhbGViKGIsIGNvbnRleHQ9c2VsZikKKworICAgIGRlZiBzaGlmdChzZWxmLCBhLCBiKToKKyAgICAgICAgIiIiUmV0dXJucyBhIHNoaWZ0ZWQgY29weSBvZiBhLCBiIHRpbWVzLgorCisgICAgICAgIFRoZSBjb2VmZmljaWVudCBvZiB0aGUgcmVzdWx0IGlzIGEgc2hpZnRlZCBjb3B5IG9mIHRoZSBkaWdpdHMKKyAgICAgICAgaW4gdGhlIGNvZWZmaWNpZW50IG9mIHRoZSBmaXJzdCBvcGVyYW5kLiAgVGhlIG51bWJlciBvZiBwbGFjZXMKKyAgICAgICAgdG8gc2hpZnQgaXMgdGFrZW4gZnJvbSB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kLAorICAgICAgICB3aXRoIHRoZSBzaGlmdCBiZWluZyB0byB0aGUgbGVmdCBpZiB0aGUgc2Vjb25kIG9wZXJhbmQgaXMKKyAgICAgICAgcG9zaXRpdmUgb3IgdG8gdGhlIHJpZ2h0IG90aGVyd2lzZS4gIERpZ2l0cyBzaGlmdGVkIGludG8gdGhlCisgICAgICAgIGNvZWZmaWNpZW50IGFyZSB6ZXJvcy4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNoaWZ0KERlY2ltYWwoJzM0JyksIERlY2ltYWwoJzgnKSkKKyAgICAgICAgRGVjaW1hbCgnNDAwMDAwMDAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdChEZWNpbWFsKCcxMicpLCBEZWNpbWFsKCc5JykpCisgICAgICAgIERlY2ltYWwoJzAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNoaWZ0KERlY2ltYWwoJzEyMzQ1Njc4OScpLCBEZWNpbWFsKCctMicpKQorICAgICAgICBEZWNpbWFsKCcxMjM0NTY3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zaGlmdChEZWNpbWFsKCcxMjM0NTY3ODknKSwgRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcxMjM0NTY3ODknKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNoaWZ0KERlY2ltYWwoJzEyMzQ1Njc4OScpLCBEZWNpbWFsKCcrMicpKQorICAgICAgICBEZWNpbWFsKCczNDU2Nzg5MDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNoaWZ0KDg4ODg4ODg4LCAyKQorICAgICAgICBEZWNpbWFsKCc4ODg4ODg4MDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNoaWZ0KERlY2ltYWwoODg4ODg4ODgpLCAyKQorICAgICAgICBEZWNpbWFsKCc4ODg4ODg4MDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNoaWZ0KDg4ODg4ODg4LCBEZWNpbWFsKDIpKQorICAgICAgICBEZWNpbWFsKCc4ODg4ODg4MDAnKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuc2hpZnQoYiwgY29udGV4dD1zZWxmKQorCisgICAgZGVmIHNxcnQoc2VsZiwgYSk6CisgICAgICAgICIiIlNxdWFyZSByb290IG9mIGEgbm9uLW5lZ2F0aXZlIG51bWJlciB0byBjb250ZXh0IHByZWNpc2lvbi4KKworICAgICAgICBJZiB0aGUgcmVzdWx0IG11c3QgYmUgaW5leGFjdCwgaXQgaXMgcm91bmRlZCB1c2luZyB0aGUgcm91bmQtaGFsZi1ldmVuCisgICAgICAgIGFsZ29yaXRobS4KKworICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNxcnQoRGVjaW1hbCgnMCcpKQorICAgICAgICBEZWNpbWFsKCcwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KERlY2ltYWwoJy0wJykpCisgICAgICAgIERlY2ltYWwoJy0wJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KERlY2ltYWwoJzAuMzknKSkKKyAgICAgICAgRGVjaW1hbCgnMC42MjQ0OTk4MDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnNxcnQoRGVjaW1hbCgnMTAwJykpCisgICAgICAgIERlY2ltYWwoJzEwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KERlY2ltYWwoJzEnKSkKKyAgICAgICAgRGVjaW1hbCgnMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydChEZWNpbWFsKCcxLjAnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KERlY2ltYWwoJzEuMDAnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KERlY2ltYWwoJzcnKSkKKyAgICAgICAgRGVjaW1hbCgnMi42NDU3NTEzMScpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3FydChEZWNpbWFsKCcxMCcpKQorICAgICAgICBEZWNpbWFsKCczLjE2MjI3NzY2JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zcXJ0KDIpCisgICAgICAgIERlY2ltYWwoJzEuNDE0MjEzNTYnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnByZWMKKyAgICAgICAgOQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuc3FydChjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgc3VidHJhY3Qoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlJldHVybiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gb3BlcmFuZHMuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zdWJ0cmFjdChEZWNpbWFsKCcxLjMnKSwgRGVjaW1hbCgnMS4wNycpKQorICAgICAgICBEZWNpbWFsKCcwLjIzJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zdWJ0cmFjdChEZWNpbWFsKCcxLjMnKSwgRGVjaW1hbCgnMS4zMCcpKQorICAgICAgICBEZWNpbWFsKCcwLjAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC5zdWJ0cmFjdChEZWNpbWFsKCcxLjMnKSwgRGVjaW1hbCgnMi4wNycpKQorICAgICAgICBEZWNpbWFsKCctMC43NycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3VidHJhY3QoOCwgNSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3VidHJhY3QoRGVjaW1hbCg4KSwgNSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQuc3VidHJhY3QoOCwgRGVjaW1hbCg1KSkKKyAgICAgICAgRGVjaW1hbCgnMycpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByID0gYS5fX3N1Yl9fKGIsIGNvbnRleHQ9c2VsZikKKyAgICAgICAgaWYgciBpcyBOb3RJbXBsZW1lbnRlZDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXMgdG8gRGVjaW1hbCIgJSBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiB0b19lbmdfc3RyaW5nKHNlbGYsIGEpOgorICAgICAgICAiIiJDb252ZXJ0cyBhIG51bWJlciB0byBhIHN0cmluZywgdXNpbmcgc2NpZW50aWZpYyBub3RhdGlvbi4KKworICAgICAgICBUaGUgb3BlcmF0aW9uIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgY29udGV4dC4KKyAgICAgICAgIiIiCisgICAgICAgIGEgPSBfY29udmVydF9vdGhlcihhLCByYWlzZWl0PVRydWUpCisgICAgICAgIHJldHVybiBhLnRvX2VuZ19zdHJpbmcoY29udGV4dD1zZWxmKQorCisgICAgZGVmIHRvX3NjaV9zdHJpbmcoc2VsZiwgYSk6CisgICAgICAgICIiIkNvbnZlcnRzIGEgbnVtYmVyIHRvIGEgc3RyaW5nLCB1c2luZyBzY2llbnRpZmljIG5vdGF0aW9uLgorCisgICAgICAgIFRoZSBvcGVyYXRpb24gaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSBjb250ZXh0LgorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEuX19zdHJfXyhjb250ZXh0PXNlbGYpCisKKyAgICBkZWYgdG9faW50ZWdyYWxfZXhhY3Qoc2VsZiwgYSk6CisgICAgICAgICIiIlJvdW5kcyB0byBhbiBpbnRlZ2VyLgorCisgICAgICAgIFdoZW4gdGhlIG9wZXJhbmQgaGFzIGEgbmVnYXRpdmUgZXhwb25lbnQsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUKKyAgICAgICAgYXMgdXNpbmcgdGhlIHF1YW50aXplKCkgb3BlcmF0aW9uIHVzaW5nIHRoZSBnaXZlbiBvcGVyYW5kIGFzIHRoZQorICAgICAgICBsZWZ0LWhhbmQtb3BlcmFuZCwgMUUrMCBhcyB0aGUgcmlnaHQtaGFuZC1vcGVyYW5kLCBhbmQgdGhlIHByZWNpc2lvbgorICAgICAgICBvZiB0aGUgb3BlcmFuZCBhcyB0aGUgcHJlY2lzaW9uIHNldHRpbmc7IEluZXhhY3QgYW5kIFJvdW5kZWQgZmxhZ3MKKyAgICAgICAgYXJlIGFsbG93ZWQgaW4gdGhpcyBvcGVyYXRpb24uICBUaGUgcm91bmRpbmcgbW9kZSBpcyB0YWtlbiBmcm9tIHRoZQorICAgICAgICBjb250ZXh0LgorCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfZXhhY3QoRGVjaW1hbCgnMi4xJykpCisgICAgICAgIERlY2ltYWwoJzInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX2V4YWN0KERlY2ltYWwoJzEwMCcpKQorICAgICAgICBEZWNpbWFsKCcxMDAnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX2V4YWN0KERlY2ltYWwoJzEwMC4wJykpCisgICAgICAgIERlY2ltYWwoJzEwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfZXhhY3QoRGVjaW1hbCgnMTAxLjUnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF9leGFjdChEZWNpbWFsKCctMTAxLjUnKSkKKyAgICAgICAgRGVjaW1hbCgnLTEwMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfZXhhY3QoRGVjaW1hbCgnMTBFKzUnKSkKKyAgICAgICAgRGVjaW1hbCgnMS4wRSs2JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF9leGFjdChEZWNpbWFsKCc3Ljg5RSs3NycpKQorICAgICAgICBEZWNpbWFsKCc3Ljg5RSs3NycpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfZXhhY3QoRGVjaW1hbCgnLUluZicpKQorICAgICAgICBEZWNpbWFsKCctSW5maW5pdHknKQorICAgICAgICAiIiIKKyAgICAgICAgYSA9IF9jb252ZXJ0X290aGVyKGEsIHJhaXNlaXQ9VHJ1ZSkKKyAgICAgICAgcmV0dXJuIGEudG9faW50ZWdyYWxfZXhhY3QoY29udGV4dD1zZWxmKQorCisgICAgZGVmIHRvX2ludGVncmFsX3ZhbHVlKHNlbGYsIGEpOgorICAgICAgICAiIiJSb3VuZHMgdG8gYW4gaW50ZWdlci4KKworICAgICAgICBXaGVuIHRoZSBvcGVyYW5kIGhhcyBhIG5lZ2F0aXZlIGV4cG9uZW50LCB0aGUgcmVzdWx0IGlzIHRoZSBzYW1lCisgICAgICAgIGFzIHVzaW5nIHRoZSBxdWFudGl6ZSgpIG9wZXJhdGlvbiB1c2luZyB0aGUgZ2l2ZW4gb3BlcmFuZCBhcyB0aGUKKyAgICAgICAgbGVmdC1oYW5kLW9wZXJhbmQsIDFFKzAgYXMgdGhlIHJpZ2h0LWhhbmQtb3BlcmFuZCwgYW5kIHRoZSBwcmVjaXNpb24KKyAgICAgICAgb2YgdGhlIG9wZXJhbmQgYXMgdGhlIHByZWNpc2lvbiBzZXR0aW5nLCBleGNlcHQgdGhhdCBubyBmbGFncyB3aWxsCisgICAgICAgIGJlIHNldC4gIFRoZSByb3VuZGluZyBtb2RlIGlzIHRha2VuIGZyb20gdGhlIGNvbnRleHQuCisKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF92YWx1ZShEZWNpbWFsKCcyLjEnKSkKKyAgICAgICAgRGVjaW1hbCgnMicpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfdmFsdWUoRGVjaW1hbCgnMTAwJykpCisgICAgICAgIERlY2ltYWwoJzEwMCcpCisgICAgICAgID4+PiBFeHRlbmRlZENvbnRleHQudG9faW50ZWdyYWxfdmFsdWUoRGVjaW1hbCgnMTAwLjAnKSkKKyAgICAgICAgRGVjaW1hbCgnMTAwJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF92YWx1ZShEZWNpbWFsKCcxMDEuNScpKQorICAgICAgICBEZWNpbWFsKCcxMDInKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX3ZhbHVlKERlY2ltYWwoJy0xMDEuNScpKQorICAgICAgICBEZWNpbWFsKCctMTAyJykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF92YWx1ZShEZWNpbWFsKCcxMEUrNScpKQorICAgICAgICBEZWNpbWFsKCcxLjBFKzYnKQorICAgICAgICA+Pj4gRXh0ZW5kZWRDb250ZXh0LnRvX2ludGVncmFsX3ZhbHVlKERlY2ltYWwoJzcuODlFKzc3JykpCisgICAgICAgIERlY2ltYWwoJzcuODlFKzc3JykKKyAgICAgICAgPj4+IEV4dGVuZGVkQ29udGV4dC50b19pbnRlZ3JhbF92YWx1ZShEZWNpbWFsKCctSW5mJykpCisgICAgICAgIERlY2ltYWwoJy1JbmZpbml0eScpCisgICAgICAgICIiIgorICAgICAgICBhID0gX2NvbnZlcnRfb3RoZXIoYSwgcmFpc2VpdD1UcnVlKQorICAgICAgICByZXR1cm4gYS50b19pbnRlZ3JhbF92YWx1ZShjb250ZXh0PXNlbGYpCisKKyAgICAjIHRoZSBtZXRob2QgbmFtZSBjaGFuZ2VkLCBidXQgd2UgcHJvdmlkZSBhbHNvIHRoZSBvbGQgb25lLCBmb3IgY29tcGF0aWJpbGl0eQorICAgIHRvX2ludGVncmFsID0gdG9faW50ZWdyYWxfdmFsdWUKKworY2xhc3MgX1dvcmtSZXAob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoJ3NpZ24nLCdpbnQnLCdleHAnKQorICAgICMgc2lnbjogMCBvciAxCisgICAgIyBpbnQ6ICBpbnQgb3IgbG9uZworICAgICMgZXhwOiAgTm9uZSwgaW50LCBvciBzdHJpbmcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2lnbiA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuaW50ID0gMAorICAgICAgICAgICAgc2VsZi5leHAgPSBOb25lCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgRGVjaW1hbCk6CisgICAgICAgICAgICBzZWxmLnNpZ24gPSB2YWx1ZS5fc2lnbgorICAgICAgICAgICAgc2VsZi5pbnQgPSBpbnQodmFsdWUuX2ludCkKKyAgICAgICAgICAgIHNlbGYuZXhwID0gdmFsdWUuX2V4cAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBhc3NlcnQgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpCisgICAgICAgICAgICBzZWxmLnNpZ24gPSB2YWx1ZVswXQorICAgICAgICAgICAgc2VsZi5pbnQgPSB2YWx1ZVsxXQorICAgICAgICAgICAgc2VsZi5leHAgPSB2YWx1ZVsyXQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiglciwgJXIsICVyKSIgJSAoc2VsZi5zaWduLCBzZWxmLmludCwgc2VsZi5leHApCisKKyAgICBfX3N0cl9fID0gX19yZXByX18KKworCisKK2RlZiBfbm9ybWFsaXplKG9wMSwgb3AyLCBwcmVjID0gMCk6CisgICAgIiIiTm9ybWFsaXplcyBvcDEsIG9wMiB0byBoYXZlIHRoZSBzYW1lIGV4cCBhbmQgbGVuZ3RoIG9mIGNvZWZmaWNpZW50LgorCisgICAgRG9uZSBkdXJpbmcgYWRkaXRpb24uCisgICAgIiIiCisgICAgaWYgb3AxLmV4cCA8IG9wMi5leHA6CisgICAgICAgIHRtcCA9IG9wMgorICAgICAgICBvdGhlciA9IG9wMQorICAgIGVsc2U6CisgICAgICAgIHRtcCA9IG9wMQorICAgICAgICBvdGhlciA9IG9wMgorCisgICAgIyBMZXQgZXhwID0gbWluKHRtcC5leHAgLSAxLCB0bXAuYWRqdXN0ZWQoKSAtIHByZWNpc2lvbiAtIDEpLgorICAgICMgVGhlbiBhZGRpbmcgMTAqKmV4cCB0byB0bXAgaGFzIHRoZSBzYW1lIGVmZmVjdCAoYWZ0ZXIgcm91bmRpbmcpCisgICAgIyBhcyBhZGRpbmcgYW55IHBvc2l0aXZlIHF1YW50aXR5IHNtYWxsZXIgdGhhbiAxMCoqZXhwOyBzaW1pbGFybHkKKyAgICAjIGZvciBzdWJ0cmFjdGlvbi4gIFNvIGlmIG90aGVyIGlzIHNtYWxsZXIgdGhhbiAxMCoqZXhwIHdlIHJlcGxhY2UKKyAgICAjIGl0IHdpdGggMTAqKmV4cC4gIFRoaXMgYXZvaWRzIHRtcC5leHAgLSBvdGhlci5leHAgZ2V0dGluZyB0b28gbGFyZ2UuCisgICAgdG1wX2xlbiA9IGxlbihzdHIodG1wLmludCkpCisgICAgb3RoZXJfbGVuID0gbGVuKHN0cihvdGhlci5pbnQpKQorICAgIGV4cCA9IHRtcC5leHAgKyBtaW4oLTEsIHRtcF9sZW4gLSBwcmVjIC0gMikKKyAgICBpZiBvdGhlcl9sZW4gKyBvdGhlci5leHAgLSAxIDwgZXhwOgorICAgICAgICBvdGhlci5pbnQgPSAxCisgICAgICAgIG90aGVyLmV4cCA9IGV4cAorCisgICAgdG1wLmludCAqPSAxMCAqKiAodG1wLmV4cCAtIG90aGVyLmV4cCkKKyAgICB0bXAuZXhwID0gb3RoZXIuZXhwCisgICAgcmV0dXJuIG9wMSwgb3AyCisKKyMjIyMjIEludGVnZXIgYXJpdGhtZXRpYyBmdW5jdGlvbnMgdXNlZCBieSBsbiwgbG9nMTAsIGV4cCBhbmQgX19wb3dfXyAjIyMjIworCisjIFRoaXMgZnVuY3Rpb24gZnJvbSBUaW0gUGV0ZXJzIHdhcyB0YWtlbiBmcm9tIGhlcmU6CisjIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1saXN0LzE5OTktSnVseS8wMDc3NTguaHRtbAorIyBUaGUgY29ycmVjdGlvbiBiZWluZyBpbiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBmb3Igc3BlZWQsIGFuZAorIyB0aGUgd2hvbGUgZnVuY3Rpb24gaXMgbm90IHJlc29sdmVkIHdpdGggbWF0aC5sb2cgYmVjYXVzZSBvZiBhdm9pZGluZworIyB0aGUgdXNlIG9mIGZsb2F0cy4KK2RlZiBfbmJpdHMobiwgY29ycmVjdGlvbiA9IHsKKyAgICAgICAgJzAnOiA0LCAnMSc6IDMsICcyJzogMiwgJzMnOiAyLAorICAgICAgICAnNCc6IDEsICc1JzogMSwgJzYnOiAxLCAnNyc6IDEsCisgICAgICAgICc4JzogMCwgJzknOiAwLCAnYSc6IDAsICdiJzogMCwKKyAgICAgICAgJ2MnOiAwLCAnZCc6IDAsICdlJzogMCwgJ2YnOiAwfSk6CisgICAgIiIiTnVtYmVyIG9mIGJpdHMgaW4gYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIG4sCisgICAgb3IgMCBpZiBuID09IDAuCisgICAgIiIiCisgICAgaWYgbiA8IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBhcmd1bWVudCB0byBfbmJpdHMgc2hvdWxkIGJlIG5vbm5lZ2F0aXZlLiIpCisgICAgaGV4X24gPSAiJXgiICUgbgorICAgIHJldHVybiA0KmxlbihoZXhfbikgLSBjb3JyZWN0aW9uW2hleF9uWzBdXQorCitkZWYgX2RlY2ltYWxfbHNoaWZ0X2V4YWN0KG4sIGUpOgorICAgICIiIiBHaXZlbiBpbnRlZ2VycyBuIGFuZCBlLCByZXR1cm4gbiAqIDEwKiplIGlmIGl0J3MgYW4gaW50ZWdlciwgZWxzZSBOb25lLgorCisgICAgVGhlIGNvbXB1dGF0aW9uIGlzIGRlc2lnbmVkIHRvIGF2b2lkIGNvbXB1dGluZyBsYXJnZSBwb3dlcnMgb2YgMTAKKyAgICB1bm5lY2Vzc2FyaWx5LgorCisgICAgPj4+IF9kZWNpbWFsX2xzaGlmdF9leGFjdCgzLCA0KQorICAgIDMwMDAwCisgICAgPj4+IF9kZWNpbWFsX2xzaGlmdF9leGFjdCgzMDAsIC05OTk5OTk5OTkpICAjIHJldHVybnMgTm9uZQorCisgICAgIiIiCisgICAgaWYgbiA9PSAwOgorICAgICAgICByZXR1cm4gMAorICAgIGVsaWYgZSA+PSAwOgorICAgICAgICByZXR1cm4gbiAqIDEwKiplCisgICAgZWxzZToKKyAgICAgICAgIyB2YWxfbiA9IGxhcmdlc3QgcG93ZXIgb2YgMTAgZGl2aWRpbmcgbi4KKyAgICAgICAgc3RyX24gPSBzdHIoYWJzKG4pKQorICAgICAgICB2YWxfbiA9IGxlbihzdHJfbikgLSBsZW4oc3RyX24ucnN0cmlwKCcwJykpCisgICAgICAgIHJldHVybiBOb25lIGlmIHZhbF9uIDwgLWUgZWxzZSBuIC8vIDEwKiotZQorCitkZWYgX3NxcnRfbmVhcmVzdChuLCBhKToKKyAgICAiIiJDbG9zZXN0IGludGVnZXIgdG8gdGhlIHNxdWFyZSByb290IG9mIHRoZSBwb3NpdGl2ZSBpbnRlZ2VyIG4uICBhIGlzCisgICAgYW4gaW5pdGlhbCBhcHByb3hpbWF0aW9uIHRvIHRoZSBzcXVhcmUgcm9vdC4gIEFueSBwb3NpdGl2ZSBpbnRlZ2VyCisgICAgd2lsbCBkbyBmb3IgYSwgYnV0IHRoZSBjbG9zZXIgYSBpcyB0byB0aGUgc3F1YXJlIHJvb3Qgb2YgbiB0aGUKKyAgICBmYXN0ZXIgY29udmVyZ2VuY2Ugd2lsbCBiZS4KKworICAgICIiIgorICAgIGlmIG4gPD0gMCBvciBhIDw9IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkJvdGggYXJndW1lbnRzIHRvIF9zcXJ0X25lYXJlc3Qgc2hvdWxkIGJlIHBvc2l0aXZlLiIpCisKKyAgICBiPTAKKyAgICB3aGlsZSBhICE9IGI6CisgICAgICAgIGIsIGEgPSBhLCBhLS1uLy9hPj4xCisgICAgcmV0dXJuIGEKKworZGVmIF9yc2hpZnRfbmVhcmVzdCh4LCBzaGlmdCk6CisgICAgIiIiR2l2ZW4gYW4gaW50ZWdlciB4IGFuZCBhIG5vbm5lZ2F0aXZlIGludGVnZXIgc2hpZnQsIHJldHVybiBjbG9zZXN0CisgICAgaW50ZWdlciB0byB4IC8gMioqc2hpZnQ7IHVzZSByb3VuZC10by1ldmVuIGluIGNhc2Ugb2YgYSB0aWUuCisKKyAgICAiIiIKKyAgICBiLCBxID0gMUwgPDwgc2hpZnQsIHggPj4gc2hpZnQKKyAgICByZXR1cm4gcSArICgyKih4ICYgKGItMSkpICsgKHEmMSkgPiBiKQorCitkZWYgX2Rpdl9uZWFyZXN0KGEsIGIpOgorICAgICIiIkNsb3Nlc3QgaW50ZWdlciB0byBhL2IsIGEgYW5kIGIgcG9zaXRpdmUgaW50ZWdlcnM7IHJvdW5kcyB0byBldmVuCisgICAgaW4gdGhlIGNhc2Ugb2YgYSB0aWUuCisKKyAgICAiIiIKKyAgICBxLCByID0gZGl2bW9kKGEsIGIpCisgICAgcmV0dXJuIHEgKyAoMipyICsgKHEmMSkgPiBiKQorCitkZWYgX2lsb2coeCwgTSwgTCA9IDgpOgorICAgICIiIkludGVnZXIgYXBwcm94aW1hdGlvbiB0byBNKmxvZyh4L00pLCB3aXRoIGFic29sdXRlIGVycm9yIGJvdW5kYWJsZQorICAgIGluIHRlcm1zIG9ubHkgb2YgeC9NLgorCisgICAgR2l2ZW4gcG9zaXRpdmUgaW50ZWdlcnMgeCBhbmQgTSwgcmV0dXJuIGFuIGludGVnZXIgYXBwcm94aW1hdGlvbiB0bworICAgIE0gKiBsb2coeC9NKS4gIEZvciBMID0gOCBhbmQgMC4xIDw9IHgvTSA8PSAxMCB0aGUgZGlmZmVyZW5jZQorICAgIGJldHdlZW4gdGhlIGFwcHJveGltYXRpb24gYW5kIHRoZSBleGFjdCByZXN1bHQgaXMgYXQgbW9zdCAyMi4gIEZvcgorICAgIEwgPSA4IGFuZCAxLjAgPD0geC9NIDw9IDEwLjAgdGhlIGRpZmZlcmVuY2UgaXMgYXQgbW9zdCAxNS4gIEluCisgICAgYm90aCBjYXNlcyB0aGVzZSBhcmUgdXBwZXIgYm91bmRzIG9uIHRoZSBlcnJvcjsgaXQgd2lsbCB1c3VhbGx5IGJlCisgICAgbXVjaCBzbWFsbGVyLiIiIgorCisgICAgIyBUaGUgYmFzaWMgYWxnb3JpdGhtIGlzIHRoZSBmb2xsb3dpbmc6IGxldCBsb2cxcCBiZSB0aGUgZnVuY3Rpb24KKyAgICAjIGxvZzFwKHgpID0gbG9nKDEreCkuICBUaGVuIGxvZyh4L00pID0gbG9nMXAoKHgtTSkvTSkuICBXZSB1c2UKKyAgICAjIHRoZSByZWR1Y3Rpb24KKyAgICAjCisgICAgIyAgICBsb2cxcCh5KSA9IDIqbG9nMXAoeS8oMStzcXJ0KDEreSkpKQorICAgICMKKyAgICAjIHJlcGVhdGVkbHkgdW50aWwgdGhlIGFyZ3VtZW50IHRvIGxvZzFwIGlzIHNtYWxsICg8IDIqKi1MIGluCisgICAgIyBhYnNvbHV0ZSB2YWx1ZSkuICBGb3Igc21hbGwgeSB3ZSBjYW4gdXNlIHRoZSBUYXlsb3Igc2VyaWVzCisgICAgIyBleHBhbnNpb24KKyAgICAjCisgICAgIyAgICBsb2cxcCh5KSB+IHkgLSB5KioyLzIgKyB5KiozLzMgLSAuLi4gLSAoLXkpKipUL1QKKyAgICAjCisgICAgIyB0cnVuY2F0aW5nIGF0IFQgc3VjaCB0aGF0IHkqKlQgaXMgc21hbGwgZW5vdWdoLiAgVGhlIHdob2xlCisgICAgIyBjb21wdXRhdGlvbiBpcyBjYXJyaWVkIG91dCBpbiBhIGZvcm0gb2YgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYywKKyAgICAjIHdpdGggYSByZWFsIG51bWJlciB6IGJlaW5nIHJlcHJlc2VudGVkIGJ5IGFuIGludGVnZXIKKyAgICAjIGFwcHJveGltYXRpb24gdG8geipNLiAgVG8gYXZvaWQgbG9zcyBvZiBwcmVjaXNpb24sIHRoZSB5IGJlbG93CisgICAgIyBpcyBhY3R1YWxseSBhbiBpbnRlZ2VyIGFwcHJveGltYXRpb24gdG8gMioqUip5Kk0sIHdoZXJlIFIgaXMgdGhlCisgICAgIyBudW1iZXIgb2YgcmVkdWN0aW9ucyBwZXJmb3JtZWQgc28gZmFyLgorCisgICAgeSA9IHgtTQorICAgICMgYXJndW1lbnQgcmVkdWN0aW9uOyBSID0gbnVtYmVyIG9mIHJlZHVjdGlvbnMgcGVyZm9ybWVkCisgICAgUiA9IDAKKyAgICB3aGlsZSAoUiA8PSBMIGFuZCBsb25nKGFicyh5KSkgPDwgTC1SID49IE0gb3IKKyAgICAgICAgICAgUiA+IEwgYW5kIGFicyh5KSA+PiBSLUwgPj0gTSk6CisgICAgICAgIHkgPSBfZGl2X25lYXJlc3QobG9uZyhNKnkpIDw8IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgTSArIF9zcXJ0X25lYXJlc3QoTSooTStfcnNoaWZ0X25lYXJlc3QoeSwgUikpLCBNKSkKKyAgICAgICAgUiArPSAxCisKKyAgICAjIFRheWxvciBzZXJpZXMgd2l0aCBUIHRlcm1zCisgICAgVCA9IC1pbnQoLTEwKmxlbihzdHIoTSkpLy8oMypMKSkKKyAgICB5c2hpZnQgPSBfcnNoaWZ0X25lYXJlc3QoeSwgUikKKyAgICB3ID0gX2Rpdl9uZWFyZXN0KE0sIFQpCisgICAgZm9yIGsgaW4geHJhbmdlKFQtMSwgMCwgLTEpOgorICAgICAgICB3ID0gX2Rpdl9uZWFyZXN0KE0sIGspIC0gX2Rpdl9uZWFyZXN0KHlzaGlmdCp3LCBNKQorCisgICAgcmV0dXJuIF9kaXZfbmVhcmVzdCh3KnksIE0pCisKK2RlZiBfZGxvZzEwKGMsIGUsIHApOgorICAgICIiIkdpdmVuIGludGVnZXJzIGMsIGUgYW5kIHAgd2l0aCBjID4gMCwgcCA+PSAwLCBjb21wdXRlIGFuIGludGVnZXIKKyAgICBhcHByb3hpbWF0aW9uIHRvIDEwKipwICogbG9nMTAoYyoxMCoqZSksIHdpdGggYW4gYWJzb2x1dGUgZXJyb3Igb2YKKyAgICBhdCBtb3N0IDEuICBBc3N1bWVzIHRoYXQgYyoxMCoqZSBpcyBub3QgZXhhY3RseSAxLiIiIgorCisgICAgIyBpbmNyZWFzZSBwcmVjaXNpb24gYnkgMjsgY29tcGVuc2F0ZSBmb3IgdGhpcyBieSBkaXZpZGluZworICAgICMgZmluYWwgcmVzdWx0IGJ5IDEwMAorICAgIHAgKz0gMgorCisgICAgIyB3cml0ZSBjKjEwKiplIGFzIGQqMTAqKmYgd2l0aCBlaXRoZXI6CisgICAgIyAgIGYgPj0gMCBhbmQgMSA8PSBkIDw9IDEwLCBvcgorICAgICMgICBmIDw9IDAgYW5kIDAuMSA8PSBkIDw9IDEuCisgICAgIyBUaHVzIGZvciBjKjEwKiplIGNsb3NlIHRvIDEsIGYgPSAwCisgICAgbCA9IGxlbihzdHIoYykpCisgICAgZiA9IGUrbCAtIChlK2wgPj0gMSkKKworICAgIGlmIHAgPiAwOgorICAgICAgICBNID0gMTAqKnAKKyAgICAgICAgayA9IGUrcC1mCisgICAgICAgIGlmIGsgPj0gMDoKKyAgICAgICAgICAgIGMgKj0gMTAqKmsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGMgPSBfZGl2X25lYXJlc3QoYywgMTAqKi1rKQorCisgICAgICAgIGxvZ19kID0gX2lsb2coYywgTSkgIyBlcnJvciA8IDUgKyAyMiA9IDI3CisgICAgICAgIGxvZ18xMCA9IF9sb2cxMF9kaWdpdHMocCkgIyBlcnJvciA8IDEKKyAgICAgICAgbG9nX2QgPSBfZGl2X25lYXJlc3QobG9nX2QqTSwgbG9nXzEwKQorICAgICAgICBsb2dfdGVucG93ZXIgPSBmKk0gIyBleGFjdAorICAgIGVsc2U6CisgICAgICAgIGxvZ19kID0gMCAgIyBlcnJvciA8IDIuMzEKKyAgICAgICAgbG9nX3RlbnBvd2VyID0gX2Rpdl9uZWFyZXN0KGYsIDEwKiotcCkgIyBlcnJvciA8IDAuNQorCisgICAgcmV0dXJuIF9kaXZfbmVhcmVzdChsb2dfdGVucG93ZXIrbG9nX2QsIDEwMCkKKworZGVmIF9kbG9nKGMsIGUsIHApOgorICAgICIiIkdpdmVuIGludGVnZXJzIGMsIGUgYW5kIHAgd2l0aCBjID4gMCwgY29tcHV0ZSBhbiBpbnRlZ2VyCisgICAgYXBwcm94aW1hdGlvbiB0byAxMCoqcCAqIGxvZyhjKjEwKiplKSwgd2l0aCBhbiBhYnNvbHV0ZSBlcnJvciBvZgorICAgIGF0IG1vc3QgMS4gIEFzc3VtZXMgdGhhdCBjKjEwKiplIGlzIG5vdCBleGFjdGx5IDEuIiIiCisKKyAgICAjIEluY3JlYXNlIHByZWNpc2lvbiBieSAyLiBUaGUgcHJlY2lzaW9uIGluY3JlYXNlIGlzIGNvbXBlbnNhdGVkCisgICAgIyBmb3IgYXQgdGhlIGVuZCB3aXRoIGEgZGl2aXNpb24gYnkgMTAwLgorICAgIHAgKz0gMgorCisgICAgIyByZXdyaXRlIGMqMTAqKmUgYXMgZCoxMCoqZiB3aXRoIGVpdGhlciBmID49IDAgYW5kIDEgPD0gZCA8PSAxMCwKKyAgICAjIG9yIGYgPD0gMCBhbmQgMC4xIDw9IGQgPD0gMS4gIFRoZW4gd2UgY2FuIGNvbXB1dGUgMTAqKnAgKiBsb2coYyoxMCoqZSkKKyAgICAjIGFzIDEwKipwICogbG9nKGQpICsgMTAqKnAqZiAqIGxvZygxMCkuCisgICAgbCA9IGxlbihzdHIoYykpCisgICAgZiA9IGUrbCAtIChlK2wgPj0gMSkKKworICAgICMgY29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIDEwKipwKmxvZyhkKSwgd2l0aCBlcnJvciA8IDI3CisgICAgaWYgcCA+IDA6CisgICAgICAgIGsgPSBlK3AtZgorICAgICAgICBpZiBrID49IDA6CisgICAgICAgICAgICBjICo9IDEwKiprCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gX2Rpdl9uZWFyZXN0KGMsIDEwKiotaykgICMgZXJyb3Igb2YgPD0gMC41IGluIGMKKworICAgICAgICAjIF9pbG9nIG1hZ25pZmllcyBleGlzdGluZyBlcnJvciBpbiBjIGJ5IGEgZmFjdG9yIG9mIGF0IG1vc3QgMTAKKyAgICAgICAgbG9nX2QgPSBfaWxvZyhjLCAxMCoqcCkgIyBlcnJvciA8IDUgKyAyMiA9IDI3CisgICAgZWxzZToKKyAgICAgICAgIyBwIDw9IDA6IGp1c3QgYXBwcm94aW1hdGUgdGhlIHdob2xlIHRoaW5nIGJ5IDA7IGVycm9yIDwgMi4zMQorICAgICAgICBsb2dfZCA9IDAKKworICAgICMgY29tcHV0ZSBhcHByb3hpbWF0aW9uIHRvIGYqMTAqKnAqbG9nKDEwKSwgd2l0aCBlcnJvciA8IDExLgorICAgIGlmIGY6CisgICAgICAgIGV4dHJhID0gbGVuKHN0cihhYnMoZikpKS0xCisgICAgICAgIGlmIHAgKyBleHRyYSA+PSAwOgorICAgICAgICAgICAgIyBlcnJvciBpbiBmICogX2xvZzEwX2RpZ2l0cyhwK2V4dHJhKSA8IHxmfCAqIDEgPSB8ZnwKKyAgICAgICAgICAgICMgYWZ0ZXIgZGl2aXNpb24sIGVycm9yIDwgfGZ8LzEwKipleHRyYSArIDAuNSA8IDEwICsgMC41IDwgMTEKKyAgICAgICAgICAgIGZfbG9nX3RlbiA9IF9kaXZfbmVhcmVzdChmKl9sb2cxMF9kaWdpdHMocCtleHRyYSksIDEwKipleHRyYSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZfbG9nX3RlbiA9IDAKKyAgICBlbHNlOgorICAgICAgICBmX2xvZ190ZW4gPSAwCisKKyAgICAjIGVycm9yIGluIHN1bSA8IDExKzI3ID0gMzg7IGVycm9yIGFmdGVyIGRpdmlzaW9uIDwgMC4zOCArIDAuNSA8IDEKKyAgICByZXR1cm4gX2Rpdl9uZWFyZXN0KGZfbG9nX3RlbiArIGxvZ19kLCAxMDApCisKK2NsYXNzIF9Mb2cxME1lbW9pemUob2JqZWN0KToKKyAgICAiIiJDbGFzcyB0byBjb21wdXRlLCBzdG9yZSwgYW5kIGFsbG93IHJldHJpZXZhbCBvZiwgZGlnaXRzIG9mIHRoZQorICAgIGNvbnN0YW50IGxvZygxMCkgPSAyLjMwMjU4NS4uLi4gIFRoaXMgY29uc3RhbnQgaXMgbmVlZGVkIGJ5CisgICAgRGVjaW1hbC5sbiwgRGVjaW1hbC5sb2cxMCwgRGVjaW1hbC5leHAgYW5kIERlY2ltYWwuX19wb3dfXy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGlnaXRzID0gIjIzMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDExMDE0ODg2IgorCisgICAgZGVmIGdldGRpZ2l0cyhzZWxmLCBwKToKKyAgICAgICAgIiIiR2l2ZW4gYW4gaW50ZWdlciBwID49IDAsIHJldHVybiBmbG9vcigxMCoqcCkqbG9nKDEwKS4KKworICAgICAgICBGb3IgZXhhbXBsZSwgc2VsZi5nZXRkaWdpdHMoMykgcmV0dXJucyAyMzAyLgorICAgICAgICAiIiIKKyAgICAgICAgIyBkaWdpdHMgYXJlIHN0b3JlZCBhcyBhIHN0cmluZywgZm9yIHF1aWNrIGNvbnZlcnNpb24gdG8KKyAgICAgICAgIyBpbnRlZ2VyIGluIHRoZSBjYXNlIHRoYXQgd2UndmUgYWxyZWFkeSBjb21wdXRlZCBlbm91Z2gKKyAgICAgICAgIyBkaWdpdHM7IHRoZSBzdG9yZWQgZGlnaXRzIHNob3VsZCBhbHdheXMgYmUgY29ycmVjdAorICAgICAgICAjICh0cnVuY2F0ZWQsIG5vdCByb3VuZGVkIHRvIG5lYXJlc3QpLgorICAgICAgICBpZiBwIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInAgc2hvdWxkIGJlIG5vbm5lZ2F0aXZlIikKKworICAgICAgICBpZiBwID49IGxlbihzZWxmLmRpZ2l0cyk6CisgICAgICAgICAgICAjIGNvbXB1dGUgcCszLCBwKzYsIHArOSwgLi4uIGRpZ2l0czsgY29udGludWUgdW50aWwgYXQKKyAgICAgICAgICAgICMgbGVhc3Qgb25lIG9mIHRoZSBleHRyYSBkaWdpdHMgaXMgbm9uemVybworICAgICAgICAgICAgZXh0cmEgPSAzCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICMgY29tcHV0ZSBwK2V4dHJhIGRpZ2l0cywgY29ycmVjdCB0byB3aXRoaW4gMXVscAorICAgICAgICAgICAgICAgIE0gPSAxMCoqKHArZXh0cmErMikKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSBzdHIoX2Rpdl9uZWFyZXN0KF9pbG9nKDEwKk0sIE0pLCAxMDApKQorICAgICAgICAgICAgICAgIGlmIGRpZ2l0c1stZXh0cmE6XSAhPSAnMCcqZXh0cmE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXh0cmEgKz0gMworICAgICAgICAgICAgIyBrZWVwIGFsbCByZWxpYWJsZSBkaWdpdHMgc28gZmFyOyByZW1vdmUgdHJhaWxpbmcgemVyb3MKKyAgICAgICAgICAgICMgYW5kIG5leHQgbm9uemVybyBkaWdpdAorICAgICAgICAgICAgc2VsZi5kaWdpdHMgPSBkaWdpdHMucnN0cmlwKCcwJylbOi0xXQorICAgICAgICByZXR1cm4gaW50KHNlbGYuZGlnaXRzWzpwKzFdKQorCitfbG9nMTBfZGlnaXRzID0gX0xvZzEwTWVtb2l6ZSgpLmdldGRpZ2l0cworCitkZWYgX2lleHAoeCwgTSwgTD04KToKKyAgICAiIiJHaXZlbiBpbnRlZ2VycyB4IGFuZCBNLCBNID4gMCwgc3VjaCB0aGF0IHgvTSBpcyBzbWFsbCBpbiBhYnNvbHV0ZQorICAgIHZhbHVlLCBjb21wdXRlIGFuIGludGVnZXIgYXBwcm94aW1hdGlvbiB0byBNKmV4cCh4L00pLiAgRm9yIDAgPD0KKyAgICB4L00gPD0gMi40LCB0aGUgYWJzb2x1dGUgZXJyb3IgaW4gdGhlIHJlc3VsdCBpcyBib3VuZGVkIGJ5IDYwIChhbmQKKyAgICBpcyB1c3VhbGx5IG11Y2ggc21hbGxlcikuIiIiCisKKyAgICAjIEFsZ29yaXRobTogdG8gY29tcHV0ZSBleHAoeikgZm9yIGEgcmVhbCBudW1iZXIgeiwgZmlyc3QgZGl2aWRlIHoKKyAgICAjIGJ5IGEgc3VpdGFibGUgcG93ZXIgUiBvZiAyIHNvIHRoYXQgfHovMioqUnwgPCAyKiotTC4gIFRoZW4KKyAgICAjIGNvbXB1dGUgZXhwbTEoei8yKipSKSA9IGV4cCh6LzIqKlIpIC0gMSB1c2luZyB0aGUgdXN1YWwgVGF5bG9yCisgICAgIyBzZXJpZXMKKyAgICAjCisgICAgIyAgICAgZXhwbTEoeCkgPSB4ICsgeCoqMi8yISArIHgqKjMvMyEgKyAuLi4KKyAgICAjCisgICAgIyBOb3cgdXNlIHRoZSBpZGVudGl0eQorICAgICMKKyAgICAjICAgICBleHBtMSgyeCkgPSBleHBtMSh4KSooZXhwbTEoeCkrMikKKyAgICAjCisgICAgIyBSIHRpbWVzIHRvIGNvbXB1dGUgdGhlIHNlcXVlbmNlIGV4cG0xKHovMioqUiksCisgICAgIyBleHBtMSh6LzIqKihSLTEpKSwgLi4uICwgZXhwKHovMiksIGV4cCh6KS4KKworICAgICMgRmluZCBSIHN1Y2ggdGhhdCB4LzIqKlIvTSA8PSAyKiotTAorICAgIFIgPSBfbmJpdHMoKGxvbmcoeCk8PEwpLy9NKQorCisgICAgIyBUYXlsb3Igc2VyaWVzLiAgKDIqKkwpKipUID4gTQorICAgIFQgPSAtaW50KC0xMCpsZW4oc3RyKE0pKS8vKDMqTCkpCisgICAgeSA9IF9kaXZfbmVhcmVzdCh4LCBUKQorICAgIE1zaGlmdCA9IGxvbmcoTSk8PFIKKyAgICBmb3IgaSBpbiB4cmFuZ2UoVC0xLCAwLCAtMSk6CisgICAgICAgIHkgPSBfZGl2X25lYXJlc3QoeCooTXNoaWZ0ICsgeSksIE1zaGlmdCAqIGkpCisKKyAgICAjIEV4cGFuc2lvbgorICAgIGZvciBrIGluIHhyYW5nZShSLTEsIC0xLCAtMSk6CisgICAgICAgIE1zaGlmdCA9IGxvbmcoTSk8PChrKzIpCisgICAgICAgIHkgPSBfZGl2X25lYXJlc3QoeSooeStNc2hpZnQpLCBNc2hpZnQpCisKKyAgICByZXR1cm4gTSt5CisKK2RlZiBfZGV4cChjLCBlLCBwKToKKyAgICAiIiJDb21wdXRlIGFuIGFwcHJveGltYXRpb24gdG8gZXhwKGMqMTAqKmUpLCB3aXRoIHAgZGVjaW1hbCBwbGFjZXMgb2YKKyAgICBwcmVjaXNpb24uCisKKyAgICBSZXR1cm5zIGludGVnZXJzIGQsIGYgc3VjaCB0aGF0OgorCisgICAgICAxMCoqKHAtMSkgPD0gZCA8PSAxMCoqcCwgYW5kCisgICAgICAoZC0xKSoxMCoqZiA8IGV4cChjKjEwKiplKSA8IChkKzEpKjEwKipmCisKKyAgICBJbiBvdGhlciB3b3JkcywgZCoxMCoqZiBpcyBhbiBhcHByb3hpbWF0aW9uIHRvIGV4cChjKjEwKiplKSB3aXRoIHAKKyAgICBkaWdpdHMgb2YgcHJlY2lzaW9uLCBhbmQgd2l0aCBhbiBlcnJvciBpbiBkIG9mIGF0IG1vc3QgMS4gIFRoaXMgaXMKKyAgICBhbG1vc3QsIGJ1dCBub3QgcXVpdGUsIHRoZSBzYW1lIGFzIHRoZSBlcnJvciBiZWluZyA8IDF1bHA6IHdoZW4gZAorICAgID0gMTAqKihwLTEpIHRoZSBlcnJvciBjb3VsZCBiZSB1cCB0byAxMCB1bHAuIiIiCisKKyAgICAjIHdlJ2xsIGNhbGwgaWV4cCB3aXRoIE0gPSAxMCoqKHArMiksIGdpdmluZyBwKzMgZGlnaXRzIG9mIHByZWNpc2lvbgorICAgIHAgKz0gMgorCisgICAgIyBjb21wdXRlIGxvZygxMCkgd2l0aCBleHRyYSBwcmVjaXNpb24gPSBhZGp1c3RlZCBleHBvbmVudCBvZiBjKjEwKiplCisgICAgZXh0cmEgPSBtYXgoMCwgZSArIGxlbihzdHIoYykpIC0gMSkKKyAgICBxID0gcCArIGV4dHJhCisKKyAgICAjIGNvbXB1dGUgcXVvdGllbnQgYyoxMCoqZS8obG9nKDEwKSkgPSBjKjEwKiooZStxKS8obG9nKDEwKSoxMCoqcSksCisgICAgIyByb3VuZGluZyBkb3duCisgICAgc2hpZnQgPSBlK3EKKyAgICBpZiBzaGlmdCA+PSAwOgorICAgICAgICBjc2hpZnQgPSBjKjEwKipzaGlmdAorICAgIGVsc2U6CisgICAgICAgIGNzaGlmdCA9IGMvLzEwKiotc2hpZnQKKyAgICBxdW90LCByZW0gPSBkaXZtb2QoY3NoaWZ0LCBfbG9nMTBfZGlnaXRzKHEpKQorCisgICAgIyByZWR1Y2UgcmVtYWluZGVyIGJhY2sgdG8gb3JpZ2luYWwgcHJlY2lzaW9uCisgICAgcmVtID0gX2Rpdl9uZWFyZXN0KHJlbSwgMTAqKmV4dHJhKQorCisgICAgIyBlcnJvciBpbiByZXN1bHQgb2YgX2lleHAgPCAxMjA7ICBlcnJvciBhZnRlciBkaXZpc2lvbiA8IDAuNjIKKyAgICByZXR1cm4gX2Rpdl9uZWFyZXN0KF9pZXhwKHJlbSwgMTAqKnApLCAxMDAwKSwgcXVvdCAtIHAgKyAzCisKK2RlZiBfZHBvd2VyKHhjLCB4ZSwgeWMsIHllLCBwKToKKyAgICAiIiJHaXZlbiBpbnRlZ2VycyB4YywgeGUsIHljIGFuZCB5ZSByZXByZXNlbnRpbmcgRGVjaW1hbHMgeCA9IHhjKjEwKip4ZSBhbmQKKyAgICB5ID0geWMqMTAqKnllLCBjb21wdXRlIHgqKnkuICBSZXR1cm5zIGEgcGFpciBvZiBpbnRlZ2VycyAoYywgZSkgc3VjaCB0aGF0OgorCisgICAgICAxMCoqKHAtMSkgPD0gYyA8PSAxMCoqcCwgYW5kCisgICAgICAoYy0xKSoxMCoqZSA8IHgqKnkgPCAoYysxKSoxMCoqZQorCisgICAgaW4gb3RoZXIgd29yZHMsIGMqMTAqKmUgaXMgYW4gYXBwcm94aW1hdGlvbiB0byB4Kip5IHdpdGggcCBkaWdpdHMKKyAgICBvZiBwcmVjaXNpb24sIGFuZCB3aXRoIGFuIGVycm9yIGluIGMgb2YgYXQgbW9zdCAxLiAgKFRoaXMgaXMKKyAgICBhbG1vc3QsIGJ1dCBub3QgcXVpdGUsIHRoZSBzYW1lIGFzIHRoZSBlcnJvciBiZWluZyA8IDF1bHA6IHdoZW4gYworICAgID09IDEwKioocC0xKSB3ZSBjYW4gb25seSBndWFyYW50ZWUgZXJyb3IgPCAxMHVscC4pCisKKyAgICBXZSBhc3N1bWUgdGhhdDogeCBpcyBwb3NpdGl2ZSBhbmQgbm90IGVxdWFsIHRvIDEsIGFuZCB5IGlzIG5vbnplcm8uCisgICAgIiIiCisKKyAgICAjIEZpbmQgYiBzdWNoIHRoYXQgMTAqKihiLTEpIDw9IHx5fCA8PSAxMCoqYgorICAgIGIgPSBsZW4oc3RyKGFicyh5YykpKSArIHllCisKKyAgICAjIGxvZyh4KSA9IGx4YyoxMCoqKC1wLWItMSksIHRvIHArYisxIHBsYWNlcyBhZnRlciB0aGUgZGVjaW1hbCBwb2ludAorICAgIGx4YyA9IF9kbG9nKHhjLCB4ZSwgcCtiKzEpCisKKyAgICAjIGNvbXB1dGUgcHJvZHVjdCB5KmxvZyh4KSA9IHljKmx4YyoxMCoqKC1wLWItMSt5ZSkgPSBwYyoxMCoqKC1wLTEpCisgICAgc2hpZnQgPSB5ZS1iCisgICAgaWYgc2hpZnQgPj0gMDoKKyAgICAgICAgcGMgPSBseGMqeWMqMTAqKnNoaWZ0CisgICAgZWxzZToKKyAgICAgICAgcGMgPSBfZGl2X25lYXJlc3QobHhjKnljLCAxMCoqLXNoaWZ0KQorCisgICAgaWYgcGMgPT0gMDoKKyAgICAgICAgIyB3ZSBwcmVmZXIgYSByZXN1bHQgdGhhdCBpc24ndCBleGFjdGx5IDE7IHRoaXMgbWFrZXMgaXQKKyAgICAgICAgIyBlYXNpZXIgdG8gY29tcHV0ZSBhIGNvcnJlY3RseSByb3VuZGVkIHJlc3VsdCBpbiBfX3Bvd19fCisgICAgICAgIGlmICgobGVuKHN0cih4YykpICsgeGUgPj0gMSkgPT0gKHljID4gMCkpOiAjIGlmIHgqKnkgPiAxOgorICAgICAgICAgICAgY29lZmYsIGV4cCA9IDEwKioocC0xKSsxLCAxLXAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvZWZmLCBleHAgPSAxMCoqcC0xLCAtcAorICAgIGVsc2U6CisgICAgICAgIGNvZWZmLCBleHAgPSBfZGV4cChwYywgLShwKzEpLCBwKzEpCisgICAgICAgIGNvZWZmID0gX2Rpdl9uZWFyZXN0KGNvZWZmLCAxMCkKKyAgICAgICAgZXhwICs9IDEKKworICAgIHJldHVybiBjb2VmZiwgZXhwCisKK2RlZiBfbG9nMTBfbGIoYywgY29ycmVjdGlvbiA9IHsKKyAgICAgICAgJzEnOiAxMDAsICcyJzogNzAsICczJzogNTMsICc0JzogNDAsICc1JzogMzEsCisgICAgICAgICc2JzogMjMsICc3JzogMTYsICc4JzogMTAsICc5JzogNX0pOgorICAgICIiIkNvbXB1dGUgYSBsb3dlciBib3VuZCBmb3IgMTAwKmxvZzEwKGMpIGZvciBhIHBvc2l0aXZlIGludGVnZXIgYy4iIiIKKyAgICBpZiBjIDw9IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZSBhcmd1bWVudCB0byBfbG9nMTBfbGIgc2hvdWxkIGJlIG5vbm5lZ2F0aXZlLiIpCisgICAgc3RyX2MgPSBzdHIoYykKKyAgICByZXR1cm4gMTAwKmxlbihzdHJfYykgLSBjb3JyZWN0aW9uW3N0cl9jWzBdXQorCisjIyMjIyBIZWxwZXIgRnVuY3Rpb25zICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIF9jb252ZXJ0X290aGVyKG90aGVyLCByYWlzZWl0PUZhbHNlLCBhbGxvd19mbG9hdD1GYWxzZSk6CisgICAgIiIiQ29udmVydCBvdGhlciB0byBEZWNpbWFsLgorCisgICAgVmVyaWZpZXMgdGhhdCBpdCdzIG9rIHRvIHVzZSBpbiBhbiBpbXBsaWNpdCBjb25zdHJ1Y3Rpb24uCisgICAgSWYgYWxsb3dfZmxvYXQgaXMgdHJ1ZSwgYWxsb3cgY29udmVyc2lvbiBmcm9tIGZsb2F0OyAgdGhpcworICAgIGlzIHVzZWQgaW4gdGhlIGNvbXBhcmlzb24gbWV0aG9kcyAoX19lcV9fIGFuZCBmcmllbmRzKS4KKworICAgICIiIgorICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIERlY2ltYWwpOgorICAgICAgICByZXR1cm4gb3RoZXIKKyAgICBpZiBpc2luc3RhbmNlKG90aGVyLCAoaW50LCBsb25nKSk6CisgICAgICAgIHJldHVybiBEZWNpbWFsKG90aGVyKQorICAgIGlmIGFsbG93X2Zsb2F0IGFuZCBpc2luc3RhbmNlKG90aGVyLCBmbG9hdCk6CisgICAgICAgIHJldHVybiBEZWNpbWFsLmZyb21fZmxvYXQob3RoZXIpCisKKyAgICBpZiByYWlzZWl0OgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlVuYWJsZSB0byBjb252ZXJ0ICVzIHRvIERlY2ltYWwiICUgb3RoZXIpCisgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyMjIyMjIFNldHVwIFNwZWNpZmljIENvbnRleHRzICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgVGhlIGRlZmF1bHQgY29udGV4dCBwcm90b3R5cGUgdXNlZCBieSBDb250ZXh0KCkKKyMgSXMgbXV0YWJsZSwgc28gdGhhdCBuZXcgY29udGV4dHMgY2FuIGhhdmUgZGlmZmVyZW50IGRlZmF1bHQgdmFsdWVzCisKK0RlZmF1bHRDb250ZXh0ID0gQ29udGV4dCgKKyAgICAgICAgcHJlYz0yOCwgcm91bmRpbmc9Uk9VTkRfSEFMRl9FVkVOLAorICAgICAgICB0cmFwcz1bRGl2aXNpb25CeVplcm8sIE92ZXJmbG93LCBJbnZhbGlkT3BlcmF0aW9uXSwKKyAgICAgICAgZmxhZ3M9W10sCisgICAgICAgIEVtYXg9OTk5OTk5OTk5LAorICAgICAgICBFbWluPS05OTk5OTk5OTksCisgICAgICAgIGNhcGl0YWxzPTEKKykKKworIyBQcmUtbWFkZSBhbHRlcm5hdGUgY29udGV4dHMgb2ZmZXJlZCBieSB0aGUgc3BlY2lmaWNhdGlvbgorIyBEb24ndCBjaGFuZ2UgdGhlc2U7IHRoZSB1c2VyIHNob3VsZCBiZSBhYmxlIHRvIHNlbGVjdCB0aGVzZQorIyBjb250ZXh0cyBhbmQgYmUgYWJsZSB0byByZXByb2R1Y2UgcmVzdWx0cyBmcm9tIG90aGVyIGltcGxlbWVudGF0aW9ucworIyBvZiB0aGUgc3BlYy4KKworQmFzaWNDb250ZXh0ID0gQ29udGV4dCgKKyAgICAgICAgcHJlYz05LCByb3VuZGluZz1ST1VORF9IQUxGX1VQLAorICAgICAgICB0cmFwcz1bRGl2aXNpb25CeVplcm8sIE92ZXJmbG93LCBJbnZhbGlkT3BlcmF0aW9uLCBDbGFtcGVkLCBVbmRlcmZsb3ddLAorICAgICAgICBmbGFncz1bXSwKKykKKworRXh0ZW5kZWRDb250ZXh0ID0gQ29udGV4dCgKKyAgICAgICAgcHJlYz05LCByb3VuZGluZz1ST1VORF9IQUxGX0VWRU4sCisgICAgICAgIHRyYXBzPVtdLAorICAgICAgICBmbGFncz1bXSwKKykKKworCisjIyMjIyBjcnVkIGZvciBwYXJzaW5nIHN0cmluZ3MgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBwYXJzaW5nIG51bWVyaWMgc3RyaW5ncy4gIEFkZGl0aW9uYWwKKyMgY29tbWVudHM6CisjCisjIDEuIFVuY29tbWVudCB0aGUgdHdvICdccyonIGxpbmVzIHRvIGFsbG93IGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nCisjIHdoaXRlc3BhY2UuICBCdXQgbm90ZSB0aGF0IHRoZSBzcGVjaWZpY2F0aW9uIGRpc2FsbG93cyB3aGl0ZXNwYWNlIGluCisjIGEgbnVtZXJpYyBzdHJpbmcuCisjCisjIDIuIEZvciBmaW5pdGUgbnVtYmVycyAobm90IGluZmluaXRpZXMgYW5kIE5hTnMpIHRoZSBib2R5IG9mIHRoZQorIyBudW1iZXIgYmV0d2VlbiB0aGUgb3B0aW9uYWwgc2lnbiBhbmQgdGhlIG9wdGlvbmFsIGV4cG9uZW50IG11c3QgaGF2ZQorIyBhdCBsZWFzdCBvbmUgZGVjaW1hbCBkaWdpdCwgcG9zc2libHkgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBUaGUKKyMgbG9va2FoZWFkIGV4cHJlc3Npb24gJyg/PVxkfFwuXGQpJyBjaGVja3MgdGhpcy4KKworaW1wb3J0IHJlCitfcGFyc2VyID0gcmUuY29tcGlsZShyIiIiICAgICAgICAjIEEgbnVtZXJpYyBzdHJpbmcgY29uc2lzdHMgb2Y6CisjICAgIFxzKgorICAgICg/UDxzaWduPlstK10pPyAgICAgICAgICAgICAgIyBhbiBvcHRpb25hbCBzaWduLCBmb2xsb3dlZCBieSBlaXRoZXIuLi4KKyAgICAoCisgICAgICAgICg/PVxkfFwuXGQpICAgICAgICAgICAgICAjIC4uLmEgbnVtYmVyICh3aXRoIGF0IGxlYXN0IG9uZSBkaWdpdCkKKyAgICAgICAgKD9QPGludD5cZCopICAgICAgICAgICAgICMgaGF2aW5nIGEgKHBvc3NpYmx5IGVtcHR5KSBpbnRlZ2VyIHBhcnQKKyAgICAgICAgKFwuKD9QPGZyYWM+XGQqKSk/ICAgICAgICMgZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgZnJhY3Rpb25hbCBwYXJ0CisgICAgICAgIChFKD9QPGV4cD5bLStdP1xkKykpPyAgICAjIGZvbGxvd2VkIGJ5IGFuIG9wdGlvbmFsIGV4cG9uZW50LCBvci4uLgorICAgIHwKKyAgICAgICAgSW5mKGluaXR5KT8gICAgICAgICAgICAgICMgLi4uYW4gaW5maW5pdHksIG9yLi4uCisgICAgfAorICAgICAgICAoP1A8c2lnbmFsPnMpPyAgICAgICAgICAgIyAuLi5hbiAob3B0aW9uYWxseSBzaWduYWxpbmcpCisgICAgICAgIE5hTiAgICAgICAgICAgICAgICAgICAgICAjIE5hTgorICAgICAgICAoP1A8ZGlhZz5cZCopICAgICAgICAgICAgIyB3aXRoIChwb3NzaWJseSBlbXB0eSkgZGlhZ25vc3RpYyBpbmZvLgorICAgICkKKyMgICAgXHMqCisgICAgXFoKKyIiIiwgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UgfCByZS5VTklDT0RFKS5tYXRjaAorCitfYWxsX3plcm9zID0gcmUuY29tcGlsZSgnMCokJykubWF0Y2gKK19leGFjdF9oYWxmID0gcmUuY29tcGlsZSgnNTAqJCcpLm1hdGNoCisKKyMjIyMjIFBFUDMxMDEgc3VwcG9ydCBmdW5jdGlvbnMgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGUgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiBoYXZlIGxpdHRsZSB0byBkbyB3aXRoIHRoZSBEZWNpbWFsCisjIGNsYXNzLCBhbmQgY291bGQgcG90ZW50aWFsbHkgYmUgcmV1c2VkIG9yIGFkYXB0ZWQgZm9yIG90aGVyIHB1cmUKKyMgUHl0aG9uIG51bWVyaWMgY2xhc3NlcyB0aGF0IHdhbnQgdG8gaW1wbGVtZW50IF9fZm9ybWF0X18KKyMKKyMgQSBmb3JtYXQgc3BlY2lmaWVyIGZvciBEZWNpbWFsIGxvb2tzIGxpa2U6CisjCisjICAgW1tmaWxsXWFsaWduXVtzaWduXVswXVttaW5pbXVtd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdCisKK19wYXJzZV9mb3JtYXRfc3BlY2lmaWVyX3JlZ2V4ID0gcmUuY29tcGlsZShyIiIiXEEKKyg/OgorICAgKD9QPGZpbGw+Lik/CisgICAoP1A8YWxpZ24+Wzw+PV5dKQorKT8KKyg/UDxzaWduPlstKyBdKT8KKyg/UDx6ZXJvcGFkPjApPworKD9QPG1pbmltdW13aWR0aD4oPyEwKVxkKyk/CisoP1A8dGhvdXNhbmRzX3NlcD4sKT8KKyg/OlwuKD9QPHByZWNpc2lvbj4wfCg/ITApXGQrKSk/CisoP1A8dHlwZT5bZUVmRmdHbiVdKT8KK1xaCisiIiIsIHJlLlZFUkJPU0UpCisKK2RlbCByZQorCisjIFRoZSBsb2NhbGUgbW9kdWxlIGlzIG9ubHkgbmVlZGVkIGZvciB0aGUgJ24nIGZvcm1hdCBzcGVjaWZpZXIuICBUaGUKKyMgcmVzdCBvZiB0aGUgUEVQIDMxMDEgY29kZSBmdW5jdGlvbnMgcXVpdGUgaGFwcGlseSB3aXRob3V0IGl0LCBzbyB3ZQorIyBkb24ndCBjYXJlIHRvbyBtdWNoIGlmIGxvY2FsZSBpc24ndCBwcmVzZW50LgordHJ5OgorICAgIGltcG9ydCBsb2NhbGUgYXMgX2xvY2FsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworZGVmIF9wYXJzZV9mb3JtYXRfc3BlY2lmaWVyKGZvcm1hdF9zcGVjLCBfbG9jYWxlY29udj1Ob25lKToKKyAgICAiIiJQYXJzZSBhbmQgdmFsaWRhdGUgYSBmb3JtYXQgc3BlY2lmaWVyLgorCisgICAgVHVybnMgYSBzdGFuZGFyZCBudW1lcmljIGZvcm1hdCBzcGVjaWZpZXIgaW50byBhIGRpY3QsIHdpdGggdGhlCisgICAgZm9sbG93aW5nIGVudHJpZXM6CisKKyAgICAgIGZpbGw6IGZpbGwgY2hhcmFjdGVyIHRvIHBhZCBmaWVsZCB0byBtaW5pbXVtIHdpZHRoCisgICAgICBhbGlnbjogYWxpZ25tZW50IHR5cGUsIGVpdGhlciAnPCcsICc+JywgJz0nIG9yICdeJworICAgICAgc2lnbjogZWl0aGVyICcrJywgJy0nIG9yICcgJworICAgICAgbWluaW11bXdpZHRoOiBub25uZWdhdGl2ZSBpbnRlZ2VyIGdpdmluZyBtaW5pbXVtIHdpZHRoCisgICAgICB6ZXJvcGFkOiBib29sZWFuLCBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcGFkIHdpdGggemVyb3MKKyAgICAgIHRob3VzYW5kc19zZXA6IHN0cmluZyB0byB1c2UgYXMgdGhvdXNhbmRzIHNlcGFyYXRvciwgb3IgJycKKyAgICAgIGdyb3VwaW5nOiBncm91cGluZyBmb3IgdGhvdXNhbmRzIHNlcGFyYXRvcnMsIGluIGZvcm1hdAorICAgICAgICB1c2VkIGJ5IGxvY2FsZWNvbnYKKyAgICAgIGRlY2ltYWxfcG9pbnQ6IHN0cmluZyB0byB1c2UgZm9yIGRlY2ltYWwgcG9pbnQKKyAgICAgIHByZWNpc2lvbjogbm9ubmVnYXRpdmUgaW50ZWdlciBnaXZpbmcgcHJlY2lzaW9uLCBvciBOb25lCisgICAgICB0eXBlOiBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgJ2VFZkZnRyUnLCBvciBOb25lCisgICAgICB1bmljb2RlOiBib29sZWFuIChhbHdheXMgVHJ1ZSBmb3IgUHl0aG9uIDMueCkKKworICAgICIiIgorICAgIG0gPSBfcGFyc2VfZm9ybWF0X3NwZWNpZmllcl9yZWdleC5tYXRjaChmb3JtYXRfc3BlYykKKyAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgZm9ybWF0IHNwZWNpZmllcjogIiArIGZvcm1hdF9zcGVjKQorCisgICAgIyBnZXQgdGhlIGRpY3Rpb25hcnkKKyAgICBmb3JtYXRfZGljdCA9IG0uZ3JvdXBkaWN0KCkKKworICAgICMgemVyb3BhZDsgZGVmYXVsdHMgZm9yIGZpbGwgYW5kIGFsaWdubWVudC4gIElmIHplcm8gcGFkZGluZworICAgICMgaXMgcmVxdWVzdGVkLCB0aGUgZmlsbCBhbmQgYWxpZ24gZmllbGRzIHNob3VsZCBiZSBhYnNlbnQuCisgICAgZmlsbCA9IGZvcm1hdF9kaWN0WydmaWxsJ10KKyAgICBhbGlnbiA9IGZvcm1hdF9kaWN0WydhbGlnbiddCisgICAgZm9ybWF0X2RpY3RbJ3plcm9wYWQnXSA9IChmb3JtYXRfZGljdFsnemVyb3BhZCddIGlzIG5vdCBOb25lKQorICAgIGlmIGZvcm1hdF9kaWN0Wyd6ZXJvcGFkJ106CisgICAgICAgIGlmIGZpbGwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJGaWxsIGNoYXJhY3RlciBjb25mbGljdHMgd2l0aCAnMCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW4gZm9ybWF0IHNwZWNpZmllcjogIiArIGZvcm1hdF9zcGVjKQorICAgICAgICBpZiBhbGlnbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkFsaWdubWVudCBjb25mbGljdHMgd2l0aCAnMCcgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IHNwZWNpZmllcjogIiArIGZvcm1hdF9zcGVjKQorICAgIGZvcm1hdF9kaWN0WydmaWxsJ10gPSBmaWxsIG9yICcgJworICAgICMgUEVQIDMxMDEgb3JpZ2luYWxseSBzcGVjaWZpZWQgdGhhdCB0aGUgZGVmYXVsdCBhbGlnbm1lbnQgc2hvdWxkCisgICAgIyBiZSBsZWZ0OyAgaXQgd2FzIGxhdGVyIGFncmVlZCB0aGF0IHJpZ2h0LWFsaWduZWQgbWFrZXMgbW9yZSBzZW5zZQorICAgICMgZm9yIG51bWVyaWMgdHlwZXMuICBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTY4NTcuCisgICAgZm9ybWF0X2RpY3RbJ2FsaWduJ10gPSBhbGlnbiBvciAnPicKKworICAgICMgZGVmYXVsdCBzaWduIGhhbmRsaW5nOiAnLScgZm9yIG5lZ2F0aXZlLCAnJyBmb3IgcG9zaXRpdmUKKyAgICBpZiBmb3JtYXRfZGljdFsnc2lnbiddIGlzIE5vbmU6CisgICAgICAgIGZvcm1hdF9kaWN0WydzaWduJ10gPSAnLScKKworICAgICMgbWluaW11bXdpZHRoIGRlZmF1bHRzIHRvIDA7IHByZWNpc2lvbiByZW1haW5zIE5vbmUgaWYgbm90IGdpdmVuCisgICAgZm9ybWF0X2RpY3RbJ21pbmltdW13aWR0aCddID0gaW50KGZvcm1hdF9kaWN0WydtaW5pbXVtd2lkdGgnXSBvciAnMCcpCisgICAgaWYgZm9ybWF0X2RpY3RbJ3ByZWNpc2lvbiddIGlzIG5vdCBOb25lOgorICAgICAgICBmb3JtYXRfZGljdFsncHJlY2lzaW9uJ10gPSBpbnQoZm9ybWF0X2RpY3RbJ3ByZWNpc2lvbiddKQorCisgICAgIyBpZiBmb3JtYXQgdHlwZSBpcyAnZycgb3IgJ0cnIHRoZW4gYSBwcmVjaXNpb24gb2YgMCBtYWtlcyBsaXR0bGUKKyAgICAjIHNlbnNlOyBjb252ZXJ0IGl0IHRvIDEuICBTYW1lIGlmIGZvcm1hdCB0eXBlIGlzIHVuc3BlY2lmaWVkLgorICAgIGlmIGZvcm1hdF9kaWN0WydwcmVjaXNpb24nXSA9PSAwOgorICAgICAgICBpZiBmb3JtYXRfZGljdFsndHlwZSddIGlzIE5vbmUgb3IgZm9ybWF0X2RpY3RbJ3R5cGUnXSBpbiAnZ0cnOgorICAgICAgICAgICAgZm9ybWF0X2RpY3RbJ3ByZWNpc2lvbiddID0gMQorCisgICAgIyBkZXRlcm1pbmUgdGhvdXNhbmRzIHNlcGFyYXRvciwgZ3JvdXBpbmcsIGFuZCBkZWNpbWFsIHNlcGFyYXRvciwgYW5kCisgICAgIyBhZGQgYXBwcm9wcmlhdGUgZW50cmllcyB0byBmb3JtYXRfZGljdAorICAgIGlmIGZvcm1hdF9kaWN0Wyd0eXBlJ10gPT0gJ24nOgorICAgICAgICAjIGFwYXJ0IGZyb20gc2VwYXJhdG9ycywgJ24nIGJlaGF2ZXMganVzdCBsaWtlICdnJworICAgICAgICBmb3JtYXRfZGljdFsndHlwZSddID0gJ2cnCisgICAgICAgIGlmIF9sb2NhbGVjb252IGlzIE5vbmU6CisgICAgICAgICAgICBfbG9jYWxlY29udiA9IF9sb2NhbGUubG9jYWxlY29udigpCisgICAgICAgIGlmIGZvcm1hdF9kaWN0Wyd0aG91c2FuZHNfc2VwJ10gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFeHBsaWNpdCB0aG91c2FuZHMgc2VwYXJhdG9yIGNvbmZsaWN0cyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiduJyB0eXBlIGluIGZvcm1hdCBzcGVjaWZpZXI6ICIgKyBmb3JtYXRfc3BlYykKKyAgICAgICAgZm9ybWF0X2RpY3RbJ3Rob3VzYW5kc19zZXAnXSA9IF9sb2NhbGVjb252Wyd0aG91c2FuZHNfc2VwJ10KKyAgICAgICAgZm9ybWF0X2RpY3RbJ2dyb3VwaW5nJ10gPSBfbG9jYWxlY29udlsnZ3JvdXBpbmcnXQorICAgICAgICBmb3JtYXRfZGljdFsnZGVjaW1hbF9wb2ludCddID0gX2xvY2FsZWNvbnZbJ2RlY2ltYWxfcG9pbnQnXQorICAgIGVsc2U6CisgICAgICAgIGlmIGZvcm1hdF9kaWN0Wyd0aG91c2FuZHNfc2VwJ10gaXMgTm9uZToKKyAgICAgICAgICAgIGZvcm1hdF9kaWN0Wyd0aG91c2FuZHNfc2VwJ10gPSAnJworICAgICAgICBmb3JtYXRfZGljdFsnZ3JvdXBpbmcnXSA9IFszLCAwXQorICAgICAgICBmb3JtYXRfZGljdFsnZGVjaW1hbF9wb2ludCddID0gJy4nCisKKyAgICAjIHJlY29yZCB3aGV0aGVyIHJldHVybiB0eXBlIHNob3VsZCBiZSBzdHIgb3IgdW5pY29kZQorICAgIGZvcm1hdF9kaWN0Wyd1bmljb2RlJ10gPSBpc2luc3RhbmNlKGZvcm1hdF9zcGVjLCB1bmljb2RlKQorCisgICAgcmV0dXJuIGZvcm1hdF9kaWN0CisKK2RlZiBfZm9ybWF0X2FsaWduKHNpZ24sIGJvZHksIHNwZWMpOgorICAgICIiIkdpdmVuIGFuIHVucGFkZGVkLCBub24tYWxpZ25lZCBudW1lcmljIHN0cmluZyAnYm9keScgYW5kIHNpZ24KKyAgICBzdHJpbmcgJ3NpZ24nLCBhZGQgcGFkZGluZyBhbmQgYWxpZ25tZW50IGNvbmZvcm1pbmcgdG8gdGhlIGdpdmVuCisgICAgZm9ybWF0IHNwZWNpZmllciBkaWN0aW9uYXJ5ICdzcGVjJyAoYXMgcHJvZHVjZWQgYnkKKyAgICBwYXJzZV9mb3JtYXRfc3BlY2lmaWVyKS4KKworICAgIEFsc28gY29udmVydHMgcmVzdWx0IHRvIHVuaWNvZGUgaWYgbmVjZXNzYXJ5LgorCisgICAgIiIiCisgICAgIyBob3cgbXVjaCBleHRyYSBzcGFjZSBkbyB3ZSBoYXZlIHRvIHBsYXkgd2l0aD8KKyAgICBtaW5pbXVtd2lkdGggPSBzcGVjWydtaW5pbXVtd2lkdGgnXQorICAgIGZpbGwgPSBzcGVjWydmaWxsJ10KKyAgICBwYWRkaW5nID0gZmlsbCoobWluaW11bXdpZHRoIC0gbGVuKHNpZ24pIC0gbGVuKGJvZHkpKQorCisgICAgYWxpZ24gPSBzcGVjWydhbGlnbiddCisgICAgaWYgYWxpZ24gPT0gJzwnOgorICAgICAgICByZXN1bHQgPSBzaWduICsgYm9keSArIHBhZGRpbmcKKyAgICBlbGlmIGFsaWduID09ICc+JzoKKyAgICAgICAgcmVzdWx0ID0gcGFkZGluZyArIHNpZ24gKyBib2R5CisgICAgZWxpZiBhbGlnbiA9PSAnPSc6CisgICAgICAgIHJlc3VsdCA9IHNpZ24gKyBwYWRkaW5nICsgYm9keQorICAgIGVsaWYgYWxpZ24gPT0gJ14nOgorICAgICAgICBoYWxmID0gbGVuKHBhZGRpbmcpLy8yCisgICAgICAgIHJlc3VsdCA9IHBhZGRpbmdbOmhhbGZdICsgc2lnbiArIGJvZHkgKyBwYWRkaW5nW2hhbGY6XQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VucmVjb2duaXNlZCBhbGlnbm1lbnQgZmllbGQnKQorCisgICAgIyBtYWtlIHN1cmUgdGhhdCByZXN1bHQgaXMgdW5pY29kZSBpZiBuZWNlc3NhcnkKKyAgICBpZiBzcGVjWyd1bmljb2RlJ106CisgICAgICAgIHJlc3VsdCA9IHVuaWNvZGUocmVzdWx0KQorCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgX2dyb3VwX2xlbmd0aHMoZ3JvdXBpbmcpOgorICAgICIiIkNvbnZlcnQgYSBsb2NhbGVjb252LXN0eWxlIGdyb3VwaW5nIGludG8gYSAocG9zc2libHkgaW5maW5pdGUpCisgICAgaXRlcmFibGUgb2YgaW50ZWdlcnMgcmVwcmVzZW50aW5nIGdyb3VwIGxlbmd0aHMuCisKKyAgICAiIiIKKyAgICAjIFRoZSByZXN1bHQgZnJvbSBsb2NhbGVjb252KClbJ2dyb3VwaW5nJ10sIGFuZCB0aGUgaW5wdXQgdG8gdGhpcworICAgICMgZnVuY3Rpb24sIHNob3VsZCBiZSBhIGxpc3Qgb2YgaW50ZWdlcnMgaW4gb25lIG9mIHRoZQorICAgICMgZm9sbG93aW5nIHRocmVlIGZvcm1zOgorICAgICMKKyAgICAjICAgKDEpIGFuIGVtcHR5IGxpc3QsIG9yCisgICAgIyAgICgyKSBub25lbXB0eSBsaXN0IG9mIHBvc2l0aXZlIGludGVnZXJzICsgWzBdCisgICAgIyAgICgzKSBsaXN0IG9mIHBvc2l0aXZlIGludGVnZXJzICsgW2xvY2FsZS5DSEFSX01BWF0sIG9yCisKKyAgICBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4sIHJlcGVhdAorICAgIGlmIG5vdCBncm91cGluZzoKKyAgICAgICAgcmV0dXJuIFtdCisgICAgZWxpZiBncm91cGluZ1stMV0gPT0gMCBhbmQgbGVuKGdyb3VwaW5nKSA+PSAyOgorICAgICAgICByZXR1cm4gY2hhaW4oZ3JvdXBpbmdbOi0xXSwgcmVwZWF0KGdyb3VwaW5nWy0yXSkpCisgICAgZWxpZiBncm91cGluZ1stMV0gPT0gX2xvY2FsZS5DSEFSX01BWDoKKyAgICAgICAgcmV0dXJuIGdyb3VwaW5nWzotMV0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd1bnJlY29nbmlzZWQgZm9ybWF0IGZvciBncm91cGluZycpCisKK2RlZiBfaW5zZXJ0X3Rob3VzYW5kc19zZXAoZGlnaXRzLCBzcGVjLCBtaW5fd2lkdGg9MSk6CisgICAgIiIiSW5zZXJ0IHRob3VzYW5kcyBzZXBhcmF0b3JzIGludG8gYSBkaWdpdCBzdHJpbmcuCisKKyAgICBzcGVjIGlzIGEgZGljdGlvbmFyeSB3aG9zZSBrZXlzIHNob3VsZCBpbmNsdWRlICd0aG91c2FuZHNfc2VwJyBhbmQKKyAgICAnZ3JvdXBpbmcnOyB0eXBpY2FsbHkgaXQncyB0aGUgcmVzdWx0IG9mIHBhcnNpbmcgdGhlIGZvcm1hdAorICAgIHNwZWNpZmllciB1c2luZyBfcGFyc2VfZm9ybWF0X3NwZWNpZmllci4KKworICAgIFRoZSBtaW5fd2lkdGgga2V5d29yZCBhcmd1bWVudCBnaXZlcyB0aGUgbWluaW11bSBsZW5ndGggb2YgdGhlCisgICAgcmVzdWx0LCB3aGljaCB3aWxsIGJlIHBhZGRlZCBvbiB0aGUgbGVmdCB3aXRoIHplcm9zIGlmIG5lY2Vzc2FyeS4KKworICAgIElmIG5lY2Vzc2FyeSwgdGhlIHplcm8gcGFkZGluZyBhZGRzIGFuIGV4dHJhICcwJyBvbiB0aGUgbGVmdCB0bworICAgIGF2b2lkIGEgbGVhZGluZyB0aG91c2FuZHMgc2VwYXJhdG9yLiAgRm9yIGV4YW1wbGUsIGluc2VydGluZworICAgIGNvbW1hcyBldmVyeSB0aHJlZSBkaWdpdHMgaW4gJzEyMzQ1NicsIHdpdGggbWluX3dpZHRoPTgsIGdpdmVzCisgICAgJzAsMTIzLDQ1NicsIGV2ZW4gdGhvdWdoIHRoYXQgaGFzIGxlbmd0aCA5LgorCisgICAgIiIiCisKKyAgICBzZXAgPSBzcGVjWyd0aG91c2FuZHNfc2VwJ10KKyAgICBncm91cGluZyA9IHNwZWNbJ2dyb3VwaW5nJ10KKworICAgIGdyb3VwcyA9IFtdCisgICAgZm9yIGwgaW4gX2dyb3VwX2xlbmd0aHMoZ3JvdXBpbmcpOgorICAgICAgICBpZiBsIDw9IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJncm91cCBsZW5ndGggc2hvdWxkIGJlIHBvc2l0aXZlIikKKyAgICAgICAgIyBtYXgoLi4uLCAxKSBmb3JjZXMgYXQgbGVhc3QgMSBkaWdpdCB0byB0aGUgbGVmdCBvZiBhIHNlcGFyYXRvcgorICAgICAgICBsID0gbWluKG1heChsZW4oZGlnaXRzKSwgbWluX3dpZHRoLCAxKSwgbCkKKyAgICAgICAgZ3JvdXBzLmFwcGVuZCgnMCcqKGwgLSBsZW4oZGlnaXRzKSkgKyBkaWdpdHNbLWw6XSkKKyAgICAgICAgZGlnaXRzID0gZGlnaXRzWzotbF0KKyAgICAgICAgbWluX3dpZHRoIC09IGwKKyAgICAgICAgaWYgbm90IGRpZ2l0cyBhbmQgbWluX3dpZHRoIDw9IDA6CisgICAgICAgICAgICBicmVhaworICAgICAgICBtaW5fd2lkdGggLT0gbGVuKHNlcCkKKyAgICBlbHNlOgorICAgICAgICBsID0gbWF4KGxlbihkaWdpdHMpLCBtaW5fd2lkdGgsIDEpCisgICAgICAgIGdyb3Vwcy5hcHBlbmQoJzAnKihsIC0gbGVuKGRpZ2l0cykpICsgZGlnaXRzWy1sOl0pCisgICAgcmV0dXJuIHNlcC5qb2luKHJldmVyc2VkKGdyb3VwcykpCisKK2RlZiBfZm9ybWF0X3NpZ24oaXNfbmVnYXRpdmUsIHNwZWMpOgorICAgICIiIkRldGVybWluZSBzaWduIGNoYXJhY3Rlci4iIiIKKworICAgIGlmIGlzX25lZ2F0aXZlOgorICAgICAgICByZXR1cm4gJy0nCisgICAgZWxpZiBzcGVjWydzaWduJ10gaW4gJyArJzoKKyAgICAgICAgcmV0dXJuIHNwZWNbJ3NpZ24nXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJworCitkZWYgX2Zvcm1hdF9udW1iZXIoaXNfbmVnYXRpdmUsIGludHBhcnQsIGZyYWNwYXJ0LCBleHAsIHNwZWMpOgorICAgICIiIkZvcm1hdCBhIG51bWJlciwgZ2l2ZW4gdGhlIGZvbGxvd2luZyBkYXRhOgorCisgICAgaXNfbmVnYXRpdmU6IHRydWUgaWYgdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwgZWxzZSBmYWxzZQorICAgIGludHBhcnQ6IHN0cmluZyBvZiBkaWdpdHMgdGhhdCBtdXN0IGFwcGVhciBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQKKyAgICBmcmFjcGFydDogc3RyaW5nIG9mIGRpZ2l0cyB0aGF0IG11c3QgY29tZSBhZnRlciB0aGUgcG9pbnQKKyAgICBleHA6IGV4cG9uZW50LCBhcyBhbiBpbnRlZ2VyCisgICAgc3BlYzogZGljdGlvbmFyeSByZXN1bHRpbmcgZnJvbSBwYXJzaW5nIHRoZSBmb3JtYXQgc3BlY2lmaWVyCisKKyAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIGluZm9ybWF0aW9uIGluIHNwZWMgdG86CisgICAgICBpbnNlcnQgc2VwYXJhdG9ycyAoZGVjaW1hbCBzZXBhcmF0b3IgYW5kIHRob3VzYW5kcyBzZXBhcmF0b3JzKQorICAgICAgZm9ybWF0IHRoZSBzaWduCisgICAgICBmb3JtYXQgdGhlIGV4cG9uZW50CisgICAgICBhZGQgdHJhaWxpbmcgJyUnIGZvciB0aGUgJyUnIHR5cGUKKyAgICAgIHplcm8tcGFkIGlmIG5lY2Vzc2FyeQorICAgICAgZmlsbCBhbmQgYWxpZ24gaWYgbmVjZXNzYXJ5CisgICAgIiIiCisKKyAgICBzaWduID0gX2Zvcm1hdF9zaWduKGlzX25lZ2F0aXZlLCBzcGVjKQorCisgICAgaWYgZnJhY3BhcnQ6CisgICAgICAgIGZyYWNwYXJ0ID0gc3BlY1snZGVjaW1hbF9wb2ludCddICsgZnJhY3BhcnQKKworICAgIGlmIGV4cCAhPSAwIG9yIHNwZWNbJ3R5cGUnXSBpbiAnZUUnOgorICAgICAgICBlY2hhciA9IHsnRSc6ICdFJywgJ2UnOiAnZScsICdHJzogJ0UnLCAnZyc6ICdlJ31bc3BlY1sndHlwZSddXQorICAgICAgICBmcmFjcGFydCArPSAiezB9ezE6K30iLmZvcm1hdChlY2hhciwgZXhwKQorICAgIGlmIHNwZWNbJ3R5cGUnXSA9PSAnJSc6CisgICAgICAgIGZyYWNwYXJ0ICs9ICclJworCisgICAgaWYgc3BlY1snemVyb3BhZCddOgorICAgICAgICBtaW5fd2lkdGggPSBzcGVjWydtaW5pbXVtd2lkdGgnXSAtIGxlbihmcmFjcGFydCkgLSBsZW4oc2lnbikKKyAgICBlbHNlOgorICAgICAgICBtaW5fd2lkdGggPSAwCisgICAgaW50cGFydCA9IF9pbnNlcnRfdGhvdXNhbmRzX3NlcChpbnRwYXJ0LCBzcGVjLCBtaW5fd2lkdGgpCisKKyAgICByZXR1cm4gX2Zvcm1hdF9hbGlnbihzaWduLCBpbnRwYXJ0K2ZyYWNwYXJ0LCBzcGVjKQorCisKKyMjIyMjIFVzZWZ1bCBDb25zdGFudHMgKGludGVybmFsIHVzZSBvbmx5KSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIFJldXNhYmxlIGRlZmF1bHRzCitfSW5maW5pdHkgPSBEZWNpbWFsKCdJbmYnKQorX05lZ2F0aXZlSW5maW5pdHkgPSBEZWNpbWFsKCctSW5mJykKK19OYU4gPSBEZWNpbWFsKCdOYU4nKQorX1plcm8gPSBEZWNpbWFsKDApCitfT25lID0gRGVjaW1hbCgxKQorX05lZ2F0aXZlT25lID0gRGVjaW1hbCgtMSkKKworIyBfU2lnbmVkSW5maW5pdHlbc2lnbl0gaXMgaW5maW5pdHkgdy8gdGhhdCBzaWduCitfU2lnbmVkSW5maW5pdHkgPSAoX0luZmluaXR5LCBfTmVnYXRpdmVJbmZpbml0eSkKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IGRvY3Rlc3QsIHN5cworICAgIGRvY3Rlc3QudGVzdG1vZChzeXMubW9kdWxlc1tfX25hbWVfX10pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2RlY2ltYWwucHljIGIvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJmNjkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2RlY2ltYWwucHlvIGIvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWJmNjkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kZWNpbWFsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2RpZmZsaWIucHkgYi9saWIvcHl0aG9uMi43L2RpZmZsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiY2I3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlmZmxpYi5weQpAQCAtMCwwICsxLDIwNTkgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiCitNb2R1bGUgZGlmZmxpYiAtLSBoZWxwZXJzIGZvciBjb21wdXRpbmcgZGVsdGFzIGJldHdlZW4gb2JqZWN0cy4KKworRnVuY3Rpb24gZ2V0X2Nsb3NlX21hdGNoZXMod29yZCwgcG9zc2liaWxpdGllcywgbj0zLCBjdXRvZmY9MC42KToKKyAgICBVc2UgU2VxdWVuY2VNYXRjaGVyIHRvIHJldHVybiBsaXN0IG9mIHRoZSBiZXN0ICJnb29kIGVub3VnaCIgbWF0Y2hlcy4KKworRnVuY3Rpb24gY29udGV4dF9kaWZmKGEsIGIpOgorICAgIEZvciB0d28gbGlzdHMgb2Ygc3RyaW5ncywgcmV0dXJuIGEgZGVsdGEgaW4gY29udGV4dCBkaWZmIGZvcm1hdC4KKworRnVuY3Rpb24gbmRpZmYoYSwgYik6CisgICAgUmV0dXJuIGEgZGVsdGE6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYGFgIGFuZCBgYmAgKGxpc3RzIG9mIHN0cmluZ3MpLgorCitGdW5jdGlvbiByZXN0b3JlKGRlbHRhLCB3aGljaCk6CisgICAgUmV0dXJuIG9uZSBvZiB0aGUgdHdvIHNlcXVlbmNlcyB0aGF0IGdlbmVyYXRlZCBhbiBuZGlmZiBkZWx0YS4KKworRnVuY3Rpb24gdW5pZmllZF9kaWZmKGEsIGIpOgorICAgIEZvciB0d28gbGlzdHMgb2Ygc3RyaW5ncywgcmV0dXJuIGEgZGVsdGEgaW4gdW5pZmllZCBkaWZmIGZvcm1hdC4KKworQ2xhc3MgU2VxdWVuY2VNYXRjaGVyOgorICAgIEEgZmxleGlibGUgY2xhc3MgZm9yIGNvbXBhcmluZyBwYWlycyBvZiBzZXF1ZW5jZXMgb2YgYW55IHR5cGUuCisKK0NsYXNzIERpZmZlcjoKKyAgICBGb3IgcHJvZHVjaW5nIGh1bWFuLXJlYWRhYmxlIGRlbHRhcyBmcm9tIHNlcXVlbmNlcyBvZiBsaW5lcyBvZiB0ZXh0LgorCitDbGFzcyBIdG1sRGlmZjoKKyAgICBGb3IgcHJvZHVjaW5nIEhUTUwgc2lkZSBieSBzaWRlIGNvbXBhcmlzb24gd2l0aCBjaGFuZ2UgaGlnaGxpZ2h0cy4KKyIiIgorCitfX2FsbF9fID0gWydnZXRfY2xvc2VfbWF0Y2hlcycsICduZGlmZicsICdyZXN0b3JlJywgJ1NlcXVlbmNlTWF0Y2hlcicsCisgICAgICAgICAgICdEaWZmZXInLCdJU19DSEFSQUNURVJfSlVOSycsICdJU19MSU5FX0pVTksnLCAnY29udGV4dF9kaWZmJywKKyAgICAgICAgICAgJ3VuaWZpZWRfZGlmZicsICdIdG1sRGlmZicsICdNYXRjaCddCisKK2ltcG9ydCBoZWFwcQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZSBhcyBfbmFtZWR0dXBsZQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQorCitNYXRjaCA9IF9uYW1lZHR1cGxlKCdNYXRjaCcsICdhIGIgc2l6ZScpCisKK2RlZiBfY2FsY3VsYXRlX3JhdGlvKG1hdGNoZXMsIGxlbmd0aCk6CisgICAgaWYgbGVuZ3RoOgorICAgICAgICByZXR1cm4gMi4wICogbWF0Y2hlcyAvIGxlbmd0aAorICAgIHJldHVybiAxLjAKKworY2xhc3MgU2VxdWVuY2VNYXRjaGVyOgorCisgICAgIiIiCisgICAgU2VxdWVuY2VNYXRjaGVyIGlzIGEgZmxleGlibGUgY2xhc3MgZm9yIGNvbXBhcmluZyBwYWlycyBvZiBzZXF1ZW5jZXMgb2YKKyAgICBhbnkgdHlwZSwgc28gbG9uZyBhcyB0aGUgc2VxdWVuY2UgZWxlbWVudHMgYXJlIGhhc2hhYmxlLiAgVGhlIGJhc2ljCisgICAgYWxnb3JpdGhtIHByZWRhdGVzLCBhbmQgaXMgYSBsaXR0bGUgZmFuY2llciB0aGFuLCBhbiBhbGdvcml0aG0KKyAgICBwdWJsaXNoZWQgaW4gdGhlIGxhdGUgMTk4MCdzIGJ5IFJhdGNsaWZmIGFuZCBPYmVyc2hlbHAgdW5kZXIgdGhlCisgICAgaHlwZXJib2xpYyBuYW1lICJnZXN0YWx0IHBhdHRlcm4gbWF0Y2hpbmciLiAgVGhlIGJhc2ljIGlkZWEgaXMgdG8gZmluZAorICAgIHRoZSBsb25nZXN0IGNvbnRpZ3VvdXMgbWF0Y2hpbmcgc3Vic2VxdWVuY2UgdGhhdCBjb250YWlucyBubyAianVuayIKKyAgICBlbGVtZW50cyAoUi1PIGRvZXNuJ3QgYWRkcmVzcyBqdW5rKS4gIFRoZSBzYW1lIGlkZWEgaXMgdGhlbiBhcHBsaWVkCisgICAgcmVjdXJzaXZlbHkgdG8gdGhlIHBpZWNlcyBvZiB0aGUgc2VxdWVuY2VzIHRvIHRoZSBsZWZ0IGFuZCB0byB0aGUgcmlnaHQKKyAgICBvZiB0aGUgbWF0Y2hpbmcgc3Vic2VxdWVuY2UuICBUaGlzIGRvZXMgbm90IHlpZWxkIG1pbmltYWwgZWRpdAorICAgIHNlcXVlbmNlcywgYnV0IGRvZXMgdGVuZCB0byB5aWVsZCBtYXRjaGVzIHRoYXQgImxvb2sgcmlnaHQiIHRvIHBlb3BsZS4KKworICAgIFNlcXVlbmNlTWF0Y2hlciB0cmllcyB0byBjb21wdXRlIGEgImh1bWFuLWZyaWVuZGx5IGRpZmYiIGJldHdlZW4gdHdvCisgICAgc2VxdWVuY2VzLiAgVW5saWtlIGUuZy4gVU5JWCh0bSkgZGlmZiwgdGhlIGZ1bmRhbWVudGFsIG5vdGlvbiBpcyB0aGUKKyAgICBsb25nZXN0ICpjb250aWd1b3VzKiAmIGp1bmstZnJlZSBtYXRjaGluZyBzdWJzZXF1ZW5jZS4gIFRoYXQncyB3aGF0CisgICAgY2F0Y2hlcyBwZW9wbGVzJyBleWVzLiAgVGhlIFdpbmRvd3ModG0pIHdpbmRpZmYgaGFzIGFub3RoZXIgaW50ZXJlc3RpbmcKKyAgICBub3Rpb24sIHBhaXJpbmcgdXAgZWxlbWVudHMgdGhhdCBhcHBlYXIgdW5pcXVlbHkgaW4gZWFjaCBzZXF1ZW5jZS4KKyAgICBUaGF0LCBhbmQgdGhlIG1ldGhvZCBoZXJlLCBhcHBlYXIgdG8geWllbGQgbW9yZSBpbnR1aXRpdmUgZGlmZmVyZW5jZQorICAgIHJlcG9ydHMgdGhhbiBkb2VzIGRpZmYuICBUaGlzIG1ldGhvZCBhcHBlYXJzIHRvIGJlIHRoZSBsZWFzdCB2dWxuZXJhYmxlCisgICAgdG8gc3luY2hpbmcgdXAgb24gYmxvY2tzIG9mICJqdW5rIGxpbmVzIiwgdGhvdWdoIChsaWtlIGJsYW5rIGxpbmVzIGluCisgICAgb3JkaW5hcnkgdGV4dCBmaWxlcywgb3IgbWF5YmUgIjxQPiIgbGluZXMgaW4gSFRNTCBmaWxlcykuICBUaGF0IG1heSBiZQorICAgIGJlY2F1c2UgdGhpcyBpcyB0aGUgb25seSBtZXRob2Qgb2YgdGhlIDMgdGhhdCBoYXMgYSAqY29uY2VwdCogb2YKKyAgICAianVuayIgPHdpbms+LgorCisgICAgRXhhbXBsZSwgY29tcGFyaW5nIHR3byBzdHJpbmdzLCBhbmQgY29uc2lkZXJpbmcgYmxhbmtzIHRvIGJlICJqdW5rIjoKKworICAgID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKGxhbWJkYSB4OiB4ID09ICIgIiwKKyAgICAuLi4gICAgICAgICAgICAgICAgICAgICAicHJpdmF0ZSBUaHJlYWQgY3VycmVudFRocmVhZDsiLAorICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICJwcml2YXRlIHZvbGF0aWxlIFRocmVhZCBjdXJyZW50VGhyZWFkOyIpCisgICAgPj4+CisKKyAgICAucmF0aW8oKSByZXR1cm5zIGEgZmxvYXQgaW4gWzAsIDFdLCBtZWFzdXJpbmcgdGhlICJzaW1pbGFyaXR5IiBvZiB0aGUKKyAgICBzZXF1ZW5jZXMuICBBcyBhIHJ1bGUgb2YgdGh1bWIsIGEgLnJhdGlvKCkgdmFsdWUgb3ZlciAwLjYgbWVhbnMgdGhlCisgICAgc2VxdWVuY2VzIGFyZSBjbG9zZSBtYXRjaGVzOgorCisgICAgPj4+IHByaW50IHJvdW5kKHMucmF0aW8oKSwgMykKKyAgICAwLjg2NgorICAgID4+PgorCisgICAgSWYgeW91J3JlIG9ubHkgaW50ZXJlc3RlZCBpbiB3aGVyZSB0aGUgc2VxdWVuY2VzIG1hdGNoLAorICAgIC5nZXRfbWF0Y2hpbmdfYmxvY2tzKCkgaXMgaGFuZHk6CisKKyAgICA+Pj4gZm9yIGJsb2NrIGluIHMuZ2V0X21hdGNoaW5nX2Jsb2NrcygpOgorICAgIC4uLiAgICAgcHJpbnQgImFbJWRdIGFuZCBiWyVkXSBtYXRjaCBmb3IgJWQgZWxlbWVudHMiICUgYmxvY2sKKyAgICBhWzBdIGFuZCBiWzBdIG1hdGNoIGZvciA4IGVsZW1lbnRzCisgICAgYVs4XSBhbmQgYlsxN10gbWF0Y2ggZm9yIDIxIGVsZW1lbnRzCisgICAgYVsyOV0gYW5kIGJbMzhdIG1hdGNoIGZvciAwIGVsZW1lbnRzCisKKyAgICBOb3RlIHRoYXQgdGhlIGxhc3QgdHVwbGUgcmV0dXJuZWQgYnkgLmdldF9tYXRjaGluZ19ibG9ja3MoKSBpcyBhbHdheXMgYQorICAgIGR1bW15LCAobGVuKGEpLCBsZW4oYiksIDApLCBhbmQgdGhpcyBpcyB0aGUgb25seSBjYXNlIGluIHdoaWNoIHRoZSBsYXN0CisgICAgdHVwbGUgZWxlbWVudCAobnVtYmVyIG9mIGVsZW1lbnRzIG1hdGNoZWQpIGlzIDAuCisKKyAgICBJZiB5b3Ugd2FudCB0byBrbm93IGhvdyB0byBjaGFuZ2UgdGhlIGZpcnN0IHNlcXVlbmNlIGludG8gdGhlIHNlY29uZCwKKyAgICB1c2UgLmdldF9vcGNvZGVzKCk6CisKKyAgICA+Pj4gZm9yIG9wY29kZSBpbiBzLmdldF9vcGNvZGVzKCk6CisgICAgLi4uICAgICBwcmludCAiJTZzIGFbJWQ6JWRdIGJbJWQ6JWRdIiAlIG9wY29kZQorICAgICBlcXVhbCBhWzA6OF0gYlswOjhdCisgICAgaW5zZXJ0IGFbODo4XSBiWzg6MTddCisgICAgIGVxdWFsIGFbODoyOV0gYlsxNzozOF0KKworICAgIFNlZSB0aGUgRGlmZmVyIGNsYXNzIGZvciBhIGZhbmN5IGh1bWFuLWZyaWVuZGx5IGZpbGUgZGlmZmVyZW5jZXIsIHdoaWNoCisgICAgdXNlcyBTZXF1ZW5jZU1hdGNoZXIgYm90aCB0byBjb21wYXJlIHNlcXVlbmNlcyBvZiBsaW5lcywgYW5kIHRvIGNvbXBhcmUKKyAgICBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycyB3aXRoaW4gc2ltaWxhciAobmVhci1tYXRjaGluZykgbGluZXMuCisKKyAgICBTZWUgYWxzbyBmdW5jdGlvbiBnZXRfY2xvc2VfbWF0Y2hlcygpIGluIHRoaXMgbW9kdWxlLCB3aGljaCBzaG93cyBob3cKKyAgICBzaW1wbGUgY29kZSBidWlsZGluZyBvbiBTZXF1ZW5jZU1hdGNoZXIgY2FuIGJlIHVzZWQgdG8gZG8gdXNlZnVsIHdvcmsuCisKKyAgICBUaW1pbmc6ICBCYXNpYyBSLU8gaXMgY3ViaWMgdGltZSB3b3JzdCBjYXNlIGFuZCBxdWFkcmF0aWMgdGltZSBleHBlY3RlZAorICAgIGNhc2UuICBTZXF1ZW5jZU1hdGNoZXIgaXMgcXVhZHJhdGljIHRpbWUgZm9yIHRoZSB3b3JzdCBjYXNlIGFuZCBoYXMKKyAgICBleHBlY3RlZC1jYXNlIGJlaGF2aW9yIGRlcGVuZGVudCBpbiBhIGNvbXBsaWNhdGVkIHdheSBvbiBob3cgbWFueQorICAgIGVsZW1lbnRzIHRoZSBzZXF1ZW5jZXMgaGF2ZSBpbiBjb21tb247IGJlc3QgY2FzZSB0aW1lIGlzIGxpbmVhci4KKworICAgIE1ldGhvZHM6CisKKyAgICBfX2luaXRfXyhpc2p1bms9Tm9uZSwgYT0nJywgYj0nJykKKyAgICAgICAgQ29uc3RydWN0IGEgU2VxdWVuY2VNYXRjaGVyLgorCisgICAgc2V0X3NlcXMoYSwgYikKKyAgICAgICAgU2V0IHRoZSB0d28gc2VxdWVuY2VzIHRvIGJlIGNvbXBhcmVkLgorCisgICAgc2V0X3NlcTEoYSkKKyAgICAgICAgU2V0IHRoZSBmaXJzdCBzZXF1ZW5jZSB0byBiZSBjb21wYXJlZC4KKworICAgIHNldF9zZXEyKGIpCisgICAgICAgIFNldCB0aGUgc2Vjb25kIHNlcXVlbmNlIHRvIGJlIGNvbXBhcmVkLgorCisgICAgZmluZF9sb25nZXN0X21hdGNoKGFsbywgYWhpLCBibG8sIGJoaSkKKyAgICAgICAgRmluZCBsb25nZXN0IG1hdGNoaW5nIGJsb2NrIGluIGFbYWxvOmFoaV0gYW5kIGJbYmxvOmJoaV0uCisKKyAgICBnZXRfbWF0Y2hpbmdfYmxvY2tzKCkKKyAgICAgICAgUmV0dXJuIGxpc3Qgb2YgdHJpcGxlcyBkZXNjcmliaW5nIG1hdGNoaW5nIHN1YnNlcXVlbmNlcy4KKworICAgIGdldF9vcGNvZGVzKCkKKyAgICAgICAgUmV0dXJuIGxpc3Qgb2YgNS10dXBsZXMgZGVzY3JpYmluZyBob3cgdG8gdHVybiBhIGludG8gYi4KKworICAgIHJhdGlvKCkKKyAgICAgICAgUmV0dXJuIGEgbWVhc3VyZSBvZiB0aGUgc2VxdWVuY2VzJyBzaW1pbGFyaXR5IChmbG9hdCBpbiBbMCwxXSkuCisKKyAgICBxdWlja19yYXRpbygpCisgICAgICAgIFJldHVybiBhbiB1cHBlciBib3VuZCBvbiAucmF0aW8oKSByZWxhdGl2ZWx5IHF1aWNrbHkuCisKKyAgICByZWFsX3F1aWNrX3JhdGlvKCkKKyAgICAgICAgUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHJhdGlvKCkgdmVyeSBxdWlja2x5LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlzanVuaz1Ob25lLCBhPScnLCBiPScnLCBhdXRvanVuaz1UcnVlKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgU2VxdWVuY2VNYXRjaGVyLgorCisgICAgICAgIE9wdGlvbmFsIGFyZyBpc2p1bmsgaXMgTm9uZSAodGhlIGRlZmF1bHQpLCBvciBhIG9uZS1hcmd1bWVudAorICAgICAgICBmdW5jdGlvbiB0aGF0IHRha2VzIGEgc2VxdWVuY2UgZWxlbWVudCBhbmQgcmV0dXJucyB0cnVlIGlmZiB0aGUKKyAgICAgICAgZWxlbWVudCBpcyBqdW5rLiAgTm9uZSBpcyBlcXVpdmFsZW50IHRvIHBhc3NpbmcgImxhbWJkYSB4OiAwIiwgaS5lLgorICAgICAgICBubyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBqdW5rLiAgRm9yIGV4YW1wbGUsIHBhc3MKKyAgICAgICAgICAgIGxhbWJkYSB4OiB4IGluICIgXFx0IgorICAgICAgICBpZiB5b3UncmUgY29tcGFyaW5nIGxpbmVzIGFzIHNlcXVlbmNlcyBvZiBjaGFyYWN0ZXJzLCBhbmQgZG9uJ3QKKyAgICAgICAgd2FudCB0byBzeW5jaCB1cCBvbiBibGFua3Mgb3IgaGFyZCB0YWJzLgorCisgICAgICAgIE9wdGlvbmFsIGFyZyBhIGlzIHRoZSBmaXJzdCBvZiB0d28gc2VxdWVuY2VzIHRvIGJlIGNvbXBhcmVkLiAgQnkKKyAgICAgICAgZGVmYXVsdCwgYW4gZW1wdHkgc3RyaW5nLiAgVGhlIGVsZW1lbnRzIG9mIGEgbXVzdCBiZSBoYXNoYWJsZS4gIFNlZQorICAgICAgICBhbHNvIC5zZXRfc2VxcygpIGFuZCAuc2V0X3NlcTEoKS4KKworICAgICAgICBPcHRpb25hbCBhcmcgYiBpcyB0aGUgc2Vjb25kIG9mIHR3byBzZXF1ZW5jZXMgdG8gYmUgY29tcGFyZWQuICBCeQorICAgICAgICBkZWZhdWx0LCBhbiBlbXB0eSBzdHJpbmcuICBUaGUgZWxlbWVudHMgb2YgYiBtdXN0IGJlIGhhc2hhYmxlLiBTZWUKKyAgICAgICAgYWxzbyAuc2V0X3NlcXMoKSBhbmQgLnNldF9zZXEyKCkuCisKKyAgICAgICAgT3B0aW9uYWwgYXJnIGF1dG9qdW5rIHNob3VsZCBiZSBzZXQgdG8gRmFsc2UgdG8gZGlzYWJsZSB0aGUKKyAgICAgICAgImF1dG9tYXRpYyBqdW5rIGhldXJpc3RpYyIgdGhhdCB0cmVhdHMgcG9wdWxhciBlbGVtZW50cyBhcyBqdW5rCisgICAgICAgIChzZWUgbW9kdWxlIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24pLgorICAgICAgICAiIiIKKworICAgICAgICAjIE1lbWJlcnM6CisgICAgICAgICMgYQorICAgICAgICAjICAgICAgZmlyc3Qgc2VxdWVuY2UKKyAgICAgICAgIyBiCisgICAgICAgICMgICAgICBzZWNvbmQgc2VxdWVuY2U7IGRpZmZlcmVuY2VzIGFyZSBjb21wdXRlZCBhcyAid2hhdCBkbworICAgICAgICAjICAgICAgd2UgbmVlZCB0byBkbyB0byAnYScgdG8gY2hhbmdlIGl0IGludG8gJ2InPyIKKyAgICAgICAgIyBiMmoKKyAgICAgICAgIyAgICAgIGZvciB4IGluIGIsIGIyalt4XSBpcyBhIGxpc3Qgb2YgdGhlIGluZGljZXMgKGludG8gYikKKyAgICAgICAgIyAgICAgIGF0IHdoaWNoIHggYXBwZWFyczsganVuayBlbGVtZW50cyBkbyBub3QgYXBwZWFyCisgICAgICAgICMgZnVsbGJjb3VudAorICAgICAgICAjICAgICAgZm9yIHggaW4gYiwgZnVsbGJjb3VudFt4XSA9PSB0aGUgbnVtYmVyIG9mIHRpbWVzIHgKKyAgICAgICAgIyAgICAgIGFwcGVhcnMgaW4gYjsgb25seSBtYXRlcmlhbGl6ZWQgaWYgcmVhbGx5IG5lZWRlZCAodXNlZAorICAgICAgICAjICAgICAgb25seSBmb3IgY29tcHV0aW5nIHF1aWNrX3JhdGlvKCkpCisgICAgICAgICMgbWF0Y2hpbmdfYmxvY2tzCisgICAgICAgICMgICAgICBhIGxpc3Qgb2YgKGksIGosIGspIHRyaXBsZXMsIHdoZXJlIGFbaTppK2tdID09IGJbajpqK2tdOworICAgICAgICAjICAgICAgYXNjZW5kaW5nICYgbm9uLW92ZXJsYXBwaW5nIGluIGkgYW5kIGluIGo7IHRlcm1pbmF0ZWQgYnkKKyAgICAgICAgIyAgICAgIGEgZHVtbXkgKGxlbihhKSwgbGVuKGIpLCAwKSBzZW50aW5lbAorICAgICAgICAjIG9wY29kZXMKKyAgICAgICAgIyAgICAgIGEgbGlzdCBvZiAodGFnLCBpMSwgaTIsIGoxLCBqMikgdHVwbGVzLCB3aGVyZSB0YWcgaXMKKyAgICAgICAgIyAgICAgIG9uZSBvZgorICAgICAgICAjICAgICAgICAgICdyZXBsYWNlJyAgIGFbaTE6aTJdIHNob3VsZCBiZSByZXBsYWNlZCBieSBiW2oxOmoyXQorICAgICAgICAjICAgICAgICAgICdkZWxldGUnICAgIGFbaTE6aTJdIHNob3VsZCBiZSBkZWxldGVkCisgICAgICAgICMgICAgICAgICAgJ2luc2VydCcgICAgYltqMTpqMl0gc2hvdWxkIGJlIGluc2VydGVkCisgICAgICAgICMgICAgICAgICAgJ2VxdWFsJyAgICAgYVtpMTppMl0gPT0gYltqMTpqMl0KKyAgICAgICAgIyBpc2p1bmsKKyAgICAgICAgIyAgICAgIGEgdXNlci1zdXBwbGllZCBmdW5jdGlvbiB0YWtpbmcgYSBzZXF1ZW5jZSBlbGVtZW50IGFuZAorICAgICAgICAjICAgICAgcmV0dXJuaW5nIHRydWUgaWZmIHRoZSBlbGVtZW50IGlzICJqdW5rIiAtLSB0aGlzIGhhcworICAgICAgICAjICAgICAgc3VidGxlIGJ1dCBoZWxwZnVsIGVmZmVjdHMgb24gdGhlIGFsZ29yaXRobSwgd2hpY2ggSSdsbAorICAgICAgICAjICAgICAgZ2V0IGFyb3VuZCB0byB3cml0aW5nIHVwIHNvbWVkYXkgPDAuOSB3aW5rPi4KKyAgICAgICAgIyAgICAgIERPTidUIFVTRSEgIE9ubHkgX19jaGFpbl9iIHVzZXMgdGhpcy4gIFVzZSBpc2JqdW5rLgorICAgICAgICAjIGlzYmp1bmsKKyAgICAgICAgIyAgICAgIGZvciB4IGluIGIsIGlzYmp1bmsoeCkgPT0gaXNqdW5rKHgpIGJ1dCBtdWNoIGZhc3RlcjsKKyAgICAgICAgIyAgICAgIGl0J3MgcmVhbGx5IHRoZSBfX2NvbnRhaW5zX18gbWV0aG9kIG9mIGEgaGlkZGVuIGRpY3QuCisgICAgICAgICMgICAgICBET0VTIE5PVCBXT1JLIGZvciB4IGluIGEhCisgICAgICAgICMgaXNicG9wdWxhcgorICAgICAgICAjICAgICAgZm9yIHggaW4gYiwgaXNicG9wdWxhcih4KSBpcyB0cnVlIGlmZiBiIGlzIHJlYXNvbmFibHkgbG9uZworICAgICAgICAjICAgICAgKGF0IGxlYXN0IDIwMCBlbGVtZW50cykgYW5kIHggYWNjb3VudHMgZm9yIG1vcmUgdGhhbiAxICsgMSUgb2YKKyAgICAgICAgIyAgICAgIGl0cyBlbGVtZW50cyAod2hlbiBhdXRvanVuayBpcyBlbmFibGVkKS4KKyAgICAgICAgIyAgICAgIERPRVMgTk9UIFdPUksgZm9yIHggaW4gYSEKKworICAgICAgICBzZWxmLmlzanVuayA9IGlzanVuaworICAgICAgICBzZWxmLmEgPSBzZWxmLmIgPSBOb25lCisgICAgICAgIHNlbGYuYXV0b2p1bmsgPSBhdXRvanVuaworICAgICAgICBzZWxmLnNldF9zZXFzKGEsIGIpCisKKyAgICBkZWYgc2V0X3NlcXMoc2VsZiwgYSwgYik6CisgICAgICAgICIiIlNldCB0aGUgdHdvIHNlcXVlbmNlcyB0byBiZSBjb21wYXJlZC4KKworICAgICAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcigpCisgICAgICAgID4+PiBzLnNldF9zZXFzKCJhYmNkIiwgImJjZGUiKQorICAgICAgICA+Pj4gcy5yYXRpbygpCisgICAgICAgIDAuNzUKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5zZXRfc2VxMShhKQorICAgICAgICBzZWxmLnNldF9zZXEyKGIpCisKKyAgICBkZWYgc2V0X3NlcTEoc2VsZiwgYSk6CisgICAgICAgICIiIlNldCB0aGUgZmlyc3Qgc2VxdWVuY2UgdG8gYmUgY29tcGFyZWQuCisKKyAgICAgICAgVGhlIHNlY29uZCBzZXF1ZW5jZSB0byBiZSBjb21wYXJlZCBpcyBub3QgY2hhbmdlZC4KKworICAgICAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihOb25lLCAiYWJjZCIsICJiY2RlIikKKyAgICAgICAgPj4+IHMucmF0aW8oKQorICAgICAgICAwLjc1CisgICAgICAgID4+PiBzLnNldF9zZXExKCJiY2RlIikKKyAgICAgICAgPj4+IHMucmF0aW8oKQorICAgICAgICAxLjAKKyAgICAgICAgPj4+CisKKyAgICAgICAgU2VxdWVuY2VNYXRjaGVyIGNvbXB1dGVzIGFuZCBjYWNoZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICAgIHNlY29uZCBzZXF1ZW5jZSwgc28gaWYgeW91IHdhbnQgdG8gY29tcGFyZSBvbmUgc2VxdWVuY2UgUyBhZ2FpbnN0CisgICAgICAgIG1hbnkgc2VxdWVuY2VzLCB1c2UgLnNldF9zZXEyKFMpIG9uY2UgYW5kIGNhbGwgLnNldF9zZXExKHgpCisgICAgICAgIHJlcGVhdGVkbHkgZm9yIGVhY2ggb2YgdGhlIG90aGVyIHNlcXVlbmNlcy4KKworICAgICAgICBTZWUgYWxzbyBzZXRfc2VxcygpIGFuZCBzZXRfc2VxMigpLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBhIGlzIHNlbGYuYToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgIHNlbGYubWF0Y2hpbmdfYmxvY2tzID0gc2VsZi5vcGNvZGVzID0gTm9uZQorCisgICAgZGVmIHNldF9zZXEyKHNlbGYsIGIpOgorICAgICAgICAiIiJTZXQgdGhlIHNlY29uZCBzZXF1ZW5jZSB0byBiZSBjb21wYXJlZC4KKworICAgICAgICBUaGUgZmlyc3Qgc2VxdWVuY2UgdG8gYmUgY29tcGFyZWQgaXMgbm90IGNoYW5nZWQuCisKKyAgICAgICAgPj4+IHMgPSBTZXF1ZW5jZU1hdGNoZXIoTm9uZSwgImFiY2QiLCAiYmNkZSIpCisgICAgICAgID4+PiBzLnJhdGlvKCkKKyAgICAgICAgMC43NQorICAgICAgICA+Pj4gcy5zZXRfc2VxMigiYWJjZCIpCisgICAgICAgID4+PiBzLnJhdGlvKCkKKyAgICAgICAgMS4wCisgICAgICAgID4+PgorCisgICAgICAgIFNlcXVlbmNlTWF0Y2hlciBjb21wdXRlcyBhbmQgY2FjaGVzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAgICAgICBzZWNvbmQgc2VxdWVuY2UsIHNvIGlmIHlvdSB3YW50IHRvIGNvbXBhcmUgb25lIHNlcXVlbmNlIFMgYWdhaW5zdAorICAgICAgICBtYW55IHNlcXVlbmNlcywgdXNlIC5zZXRfc2VxMihTKSBvbmNlIGFuZCBjYWxsIC5zZXRfc2VxMSh4KQorICAgICAgICByZXBlYXRlZGx5IGZvciBlYWNoIG9mIHRoZSBvdGhlciBzZXF1ZW5jZXMuCisKKyAgICAgICAgU2VlIGFsc28gc2V0X3NlcXMoKSBhbmQgc2V0X3NlcTEoKS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgYiBpcyBzZWxmLmI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5iID0gYgorICAgICAgICBzZWxmLm1hdGNoaW5nX2Jsb2NrcyA9IHNlbGYub3Bjb2RlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5mdWxsYmNvdW50ID0gTm9uZQorICAgICAgICBzZWxmLl9fY2hhaW5fYigpCisKKyAgICAjIEZvciBlYWNoIGVsZW1lbnQgeCBpbiBiLCBzZXQgYjJqW3hdIHRvIGEgbGlzdCBvZiB0aGUgaW5kaWNlcyBpbgorICAgICMgYiB3aGVyZSB4IGFwcGVhcnM7IHRoZSBpbmRpY2VzIGFyZSBpbiBpbmNyZWFzaW5nIG9yZGVyOyBub3RlIHRoYXQKKyAgICAjIHRoZSBudW1iZXIgb2YgdGltZXMgeCBhcHBlYXJzIGluIGIgaXMgbGVuKGIyalt4XSkgLi4uCisgICAgIyB3aGVuIHNlbGYuaXNqdW5rIGlzIGRlZmluZWQsIGp1bmsgZWxlbWVudHMgZG9uJ3Qgc2hvdyB1cCBpbiB0aGlzCisgICAgIyBtYXAgYXQgYWxsLCB3aGljaCBzdG9wcyB0aGUgY2VudHJhbCBmaW5kX2xvbmdlc3RfbWF0Y2ggbWV0aG9kCisgICAgIyBmcm9tIHN0YXJ0aW5nIGFueSBtYXRjaGluZyBibG9jayBhdCBhIGp1bmsgZWxlbWVudCAuLi4KKyAgICAjIGFsc28gY3JlYXRlcyB0aGUgZmFzdCBpc2JqdW5rIGZ1bmN0aW9uIC4uLgorICAgICMgYjJqIGFsc28gZG9lcyBub3QgY29udGFpbiBlbnRyaWVzIGZvciAicG9wdWxhciIgZWxlbWVudHMsIG1lYW5pbmcKKyAgICAjIGVsZW1lbnRzIHRoYXQgYWNjb3VudCBmb3IgbW9yZSB0aGFuIDEgKyAxJSBvZiB0aGUgdG90YWwgZWxlbWVudHMsIGFuZAorICAgICMgd2hlbiB0aGUgc2VxdWVuY2UgaXMgcmVhc29uYWJseSBsYXJnZSAoPj0gMjAwIGVsZW1lbnRzKTsgdGhpcyBjYW4KKyAgICAjIGJlIHZpZXdlZCBhcyBhbiBhZGFwdGl2ZSBub3Rpb24gb2Ygc2VtaS1qdW5rLCBhbmQgeWllbGRzIGFuIGVub3Jtb3VzCisgICAgIyBzcGVlZHVwIHdoZW4sIGUuZy4sIGNvbXBhcmluZyBwcm9ncmFtIGZpbGVzIHdpdGggaHVuZHJlZHMgb2YKKyAgICAjIGluc3RhbmNlcyBvZiAicmV0dXJuIE5VTEw7IiAuLi4KKyAgICAjIG5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gYiBjaGFuZ2VzOyBzbyBmb3IgY3Jvc3MtcHJvZHVjdAorICAgICMga2luZHMgb2YgbWF0Y2hlcywgaXQncyBiZXN0IHRvIGNhbGwgc2V0X3NlcTIgb25jZSwgdGhlbiBzZXRfc2VxMQorICAgICMgcmVwZWF0ZWRseQorCisgICAgZGVmIF9fY2hhaW5fYihzZWxmKToKKyAgICAgICAgIyBCZWNhdXNlIGlzanVuayBpcyBhIHVzZXItZGVmaW5lZCAobm90IEMpIGZ1bmN0aW9uLCBhbmQgd2UgdGVzdAorICAgICAgICAjIGZvciBqdW5rIGEgTE9ULCBpdCdzIGltcG9ydGFudCB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGNhbGxzLgorICAgICAgICAjIEJlZm9yZSB0aGUgdHJpY2tzIGRlc2NyaWJlZCBoZXJlLCBfX2NoYWluX2Igd2FzIGJ5IGZhciB0aGUgbW9zdAorICAgICAgICAjIHRpbWUtY29uc3VtaW5nIHJvdXRpbmUgaW4gdGhlIHdob2xlIG1vZHVsZSEgIElmIGFueW9uZSBzZWVzCisgICAgICAgICMgSmltIFJvc2tpbmQsIHRoYW5rIGhpbSBhZ2FpbiBmb3IgcHJvZmlsZS5weSAtLSBJIG5ldmVyIHdvdWxkCisgICAgICAgICMgaGF2ZSBndWVzc2VkIHRoYXQuCisgICAgICAgICMgVGhlIGZpcnN0IHRyaWNrIGlzIHRvIGJ1aWxkIGIyaiBpZ25vcmluZyB0aGUgcG9zc2liaWxpdHkKKyAgICAgICAgIyBvZiBqdW5rLiAgSS5lLiwgd2UgZG9uJ3QgY2FsbCBpc2p1bmsgYXQgYWxsIHlldC4gIFRocm93aW5nCisgICAgICAgICMgb3V0IHRoZSBqdW5rIGxhdGVyIGlzIG11Y2ggY2hlYXBlciB0aGFuIGJ1aWxkaW5nIGIyaiAicmlnaHQiCisgICAgICAgICMgZnJvbSB0aGUgc3RhcnQuCisgICAgICAgIGIgPSBzZWxmLmIKKyAgICAgICAgc2VsZi5iMmogPSBiMmogPSB7fQorCisgICAgICAgIGZvciBpLCBlbHQgaW4gZW51bWVyYXRlKGIpOgorICAgICAgICAgICAgaW5kaWNlcyA9IGIyai5zZXRkZWZhdWx0KGVsdCwgW10pCisgICAgICAgICAgICBpbmRpY2VzLmFwcGVuZChpKQorCisgICAgICAgICMgUHVyZ2UganVuayBlbGVtZW50cworICAgICAgICBqdW5rID0gc2V0KCkKKyAgICAgICAgaXNqdW5rID0gc2VsZi5pc2p1bmsKKyAgICAgICAgaWYgaXNqdW5rOgorICAgICAgICAgICAgZm9yIGVsdCBpbiBsaXN0KGIyai5rZXlzKCkpOiAgIyB1c2luZyBsaXN0KCkgc2luY2UgYjJqIGlzIG1vZGlmaWVkCisgICAgICAgICAgICAgICAgaWYgaXNqdW5rKGVsdCk6CisgICAgICAgICAgICAgICAgICAgIGp1bmsuYWRkKGVsdCkKKyAgICAgICAgICAgICAgICAgICAgZGVsIGIyaltlbHRdCisKKyAgICAgICAgIyBQdXJnZSBwb3B1bGFyIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBqdW5rCisgICAgICAgIHBvcHVsYXIgPSBzZXQoKQorICAgICAgICBuID0gbGVuKGIpCisgICAgICAgIGlmIHNlbGYuYXV0b2p1bmsgYW5kIG4gPj0gMjAwOgorICAgICAgICAgICAgbnRlc3QgPSBuIC8vIDEwMCArIDEKKyAgICAgICAgICAgIGZvciBlbHQsIGlkeHMgaW4gbGlzdChiMmouaXRlbXMoKSk6CisgICAgICAgICAgICAgICAgaWYgbGVuKGlkeHMpID4gbnRlc3Q6CisgICAgICAgICAgICAgICAgICAgIHBvcHVsYXIuYWRkKGVsdCkKKyAgICAgICAgICAgICAgICAgICAgZGVsIGIyaltlbHRdCisKKyAgICAgICAgIyBOb3cgZm9yIHggaW4gYiwgaXNqdW5rKHgpID09IHggaW4ganVuaywgYnV0IHRoZSBsYXR0ZXIgaXMgbXVjaCBmYXN0ZXIuCisgICAgICAgICMgU2ljbmUgdGhlIG51bWJlciBvZiAqdW5pcXVlKiBqdW5rIGVsZW1lbnRzIGlzIHByb2JhYmx5IHNtYWxsLCB0aGUKKyAgICAgICAgIyBtZW1vcnkgYnVyZGVuIG9mIGtlZXBpbmcgdGhpcyBzZXQgYWxpdmUgaXMgbGlrZWx5IHRyaXZpYWwgY29tcGFyZWQgdG8KKyAgICAgICAgIyB0aGUgc2l6ZSBvZiBiMmouCisgICAgICAgIHNlbGYuaXNianVuayA9IGp1bmsuX19jb250YWluc19fCisgICAgICAgIHNlbGYuaXNicG9wdWxhciA9IHBvcHVsYXIuX19jb250YWluc19fCisKKyAgICBkZWYgZmluZF9sb25nZXN0X21hdGNoKHNlbGYsIGFsbywgYWhpLCBibG8sIGJoaSk6CisgICAgICAgICIiIkZpbmQgbG9uZ2VzdCBtYXRjaGluZyBibG9jayBpbiBhW2FsbzphaGldIGFuZCBiW2JsbzpiaGldLgorCisgICAgICAgIElmIGlzanVuayBpcyBub3QgZGVmaW5lZDoKKworICAgICAgICBSZXR1cm4gKGksaixrKSBzdWNoIHRoYXQgYVtpOmkra10gaXMgZXF1YWwgdG8gYltqOmora10sIHdoZXJlCisgICAgICAgICAgICBhbG8gPD0gaSA8PSBpK2sgPD0gYWhpCisgICAgICAgICAgICBibG8gPD0gaiA8PSBqK2sgPD0gYmhpCisgICAgICAgIGFuZCBmb3IgYWxsIChpJyxqJyxrJykgbWVldGluZyB0aG9zZSBjb25kaXRpb25zLAorICAgICAgICAgICAgayA+PSBrJworICAgICAgICAgICAgaSA8PSBpJworICAgICAgICAgICAgYW5kIGlmIGkgPT0gaScsIGogPD0gaicKKworICAgICAgICBJbiBvdGhlciB3b3Jkcywgb2YgYWxsIG1heGltYWwgbWF0Y2hpbmcgYmxvY2tzLCByZXR1cm4gb25lIHRoYXQKKyAgICAgICAgc3RhcnRzIGVhcmxpZXN0IGluIGEsIGFuZCBvZiBhbGwgdGhvc2UgbWF4aW1hbCBtYXRjaGluZyBibG9ja3MgdGhhdAorICAgICAgICBzdGFydCBlYXJsaWVzdCBpbiBhLCByZXR1cm4gdGhlIG9uZSB0aGF0IHN0YXJ0cyBlYXJsaWVzdCBpbiBiLgorCisgICAgICAgID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsICIgYWJjZCIsICJhYmNkIGFiY2QiKQorICAgICAgICA+Pj4gcy5maW5kX2xvbmdlc3RfbWF0Y2goMCwgNSwgMCwgOSkKKyAgICAgICAgTWF0Y2goYT0wLCBiPTQsIHNpemU9NSkKKworICAgICAgICBJZiBpc2p1bmsgaXMgZGVmaW5lZCwgZmlyc3QgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgYmxvY2sgaXMKKyAgICAgICAgZGV0ZXJtaW5lZCBhcyBhYm92ZSwgYnV0IHdpdGggdGhlIGFkZGl0aW9uYWwgcmVzdHJpY3Rpb24gdGhhdCBubworICAgICAgICBqdW5rIGVsZW1lbnQgYXBwZWFycyBpbiB0aGUgYmxvY2suICBUaGVuIHRoYXQgYmxvY2sgaXMgZXh0ZW5kZWQgYXMKKyAgICAgICAgZmFyIGFzIHBvc3NpYmxlIGJ5IG1hdGNoaW5nIChvbmx5KSBqdW5rIGVsZW1lbnRzIG9uIGJvdGggc2lkZXMuICBTbworICAgICAgICB0aGUgcmVzdWx0aW5nIGJsb2NrIG5ldmVyIG1hdGNoZXMgb24ganVuayBleGNlcHQgYXMgaWRlbnRpY2FsIGp1bmsKKyAgICAgICAgaGFwcGVucyB0byBiZSBhZGphY2VudCB0byBhbiAiaW50ZXJlc3RpbmciIG1hdGNoLgorCisgICAgICAgIEhlcmUncyB0aGUgc2FtZSBleGFtcGxlIGFzIGJlZm9yZSwgYnV0IGNvbnNpZGVyaW5nIGJsYW5rcyB0byBiZQorICAgICAgICBqdW5rLiAgVGhhdCBwcmV2ZW50cyAiIGFiY2QiIGZyb20gbWF0Y2hpbmcgdGhlICIgYWJjZCIgYXQgdGhlIHRhaWwKKyAgICAgICAgZW5kIG9mIHRoZSBzZWNvbmQgc2VxdWVuY2UgZGlyZWN0bHkuICBJbnN0ZWFkIG9ubHkgdGhlICJhYmNkIiBjYW4KKyAgICAgICAgbWF0Y2gsIGFuZCBtYXRjaGVzIHRoZSBsZWZ0bW9zdCAiYWJjZCIgaW4gdGhlIHNlY29uZCBzZXF1ZW5jZToKKworICAgICAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihsYW1iZGEgeDogeD09IiAiLCAiIGFiY2QiLCAiYWJjZCBhYmNkIikKKyAgICAgICAgPj4+IHMuZmluZF9sb25nZXN0X21hdGNoKDAsIDUsIDAsIDkpCisgICAgICAgIE1hdGNoKGE9MSwgYj0wLCBzaXplPTQpCisKKyAgICAgICAgSWYgbm8gYmxvY2tzIG1hdGNoLCByZXR1cm4gKGFsbywgYmxvLCAwKS4KKworICAgICAgICA+Pj4gcyA9IFNlcXVlbmNlTWF0Y2hlcihOb25lLCAiYWIiLCAiYyIpCisgICAgICAgID4+PiBzLmZpbmRfbG9uZ2VzdF9tYXRjaCgwLCAyLCAwLCAxKQorICAgICAgICBNYXRjaChhPTAsIGI9MCwgc2l6ZT0wKQorICAgICAgICAiIiIKKworICAgICAgICAjIENBVVRJT046ICBzdHJpcHBpbmcgY29tbW9uIHByZWZpeCBvciBzdWZmaXggd291bGQgYmUgaW5jb3JyZWN0LgorICAgICAgICAjIEUuZy4sCisgICAgICAgICMgICAgYWIKKyAgICAgICAgIyAgICBhY2FiCisgICAgICAgICMgTG9uZ2VzdCBtYXRjaGluZyBibG9jayBpcyAiYWIiLCBidXQgaWYgY29tbW9uIHByZWZpeCBpcworICAgICAgICAjIHN0cmlwcGVkLCBpdCdzICJhIiAodGllZCB3aXRoICJiIikuICBVTklYKHRtKSBkaWZmIGRvZXMgc28KKyAgICAgICAgIyBzdHJpcCwgc28gZW5kcyB1cCBjbGFpbWluZyB0aGF0IGFiIGlzIGNoYW5nZWQgdG8gYWNhYiBieQorICAgICAgICAjIGluc2VydGluZyAiY2EiIGluIHRoZSBtaWRkbGUuICBUaGF0J3MgbWluaW1hbCBidXQgdW5pbnR1aXRpdmU6CisgICAgICAgICMgIml0J3Mgb2J2aW91cyIgdGhhdCBzb21lb25lIGluc2VydGVkICJhYyIgYXQgdGhlIGZyb250LgorICAgICAgICAjIFdpbmRpZmYgZW5kcyB1cCBhdCB0aGUgc2FtZSBwbGFjZSBhcyBkaWZmLCBidXQgYnkgcGFpcmluZyB1cAorICAgICAgICAjIHRoZSB1bmlxdWUgJ2IncyBhbmQgdGhlbiBtYXRjaGluZyB0aGUgZmlyc3QgdHdvICdhJ3MuCisKKyAgICAgICAgYSwgYiwgYjJqLCBpc2JqdW5rID0gc2VsZi5hLCBzZWxmLmIsIHNlbGYuYjJqLCBzZWxmLmlzYmp1bmsKKyAgICAgICAgYmVzdGksIGJlc3RqLCBiZXN0c2l6ZSA9IGFsbywgYmxvLCAwCisgICAgICAgICMgZmluZCBsb25nZXN0IGp1bmstZnJlZSBtYXRjaAorICAgICAgICAjIGR1cmluZyBhbiBpdGVyYXRpb24gb2YgdGhlIGxvb3AsIGoybGVuW2pdID0gbGVuZ3RoIG9mIGxvbmdlc3QKKyAgICAgICAgIyBqdW5rLWZyZWUgbWF0Y2ggZW5kaW5nIHdpdGggYVtpLTFdIGFuZCBiW2pdCisgICAgICAgIGoybGVuID0ge30KKyAgICAgICAgbm90aGluZyA9IFtdCisgICAgICAgIGZvciBpIGluIHhyYW5nZShhbG8sIGFoaSk6CisgICAgICAgICAgICAjIGxvb2sgYXQgYWxsIGluc3RhbmNlcyBvZiBhW2ldIGluIGI7IG5vdGUgdGhhdCBiZWNhdXNlCisgICAgICAgICAgICAjIGIyaiBoYXMgbm8ganVuayBrZXlzLCB0aGUgbG9vcCBpcyBza2lwcGVkIGlmIGFbaV0gaXMganVuaworICAgICAgICAgICAgajJsZW5nZXQgPSBqMmxlbi5nZXQKKyAgICAgICAgICAgIG5ld2oybGVuID0ge30KKyAgICAgICAgICAgIGZvciBqIGluIGIyai5nZXQoYVtpXSwgbm90aGluZyk6CisgICAgICAgICAgICAgICAgIyBhW2ldIG1hdGNoZXMgYltqXQorICAgICAgICAgICAgICAgIGlmIGogPCBibG86CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgaiA+PSBiaGk6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgayA9IG5ld2oybGVuW2pdID0gajJsZW5nZXQoai0xLCAwKSArIDEKKyAgICAgICAgICAgICAgICBpZiBrID4gYmVzdHNpemU6CisgICAgICAgICAgICAgICAgICAgIGJlc3RpLCBiZXN0aiwgYmVzdHNpemUgPSBpLWsrMSwgai1rKzEsIGsKKyAgICAgICAgICAgIGoybGVuID0gbmV3ajJsZW4KKworICAgICAgICAjIEV4dGVuZCB0aGUgYmVzdCBieSBub24tanVuayBlbGVtZW50cyBvbiBlYWNoIGVuZC4gIEluIHBhcnRpY3VsYXIsCisgICAgICAgICMgInBvcHVsYXIiIG5vbi1qdW5rIGVsZW1lbnRzIGFyZW4ndCBpbiBiMmosIHdoaWNoIGdyZWF0bHkgc3BlZWRzCisgICAgICAgICMgdGhlIGlubmVyIGxvb3AgYWJvdmUsIGJ1dCBhbHNvIG1lYW5zICJ0aGUgYmVzdCIgbWF0Y2ggc28gZmFyCisgICAgICAgICMgZG9lc24ndCBjb250YWluIGFueSBqdW5rICpvciogcG9wdWxhciBub24tanVuayBlbGVtZW50cy4KKyAgICAgICAgd2hpbGUgYmVzdGkgPiBhbG8gYW5kIGJlc3RqID4gYmxvIGFuZCBcCisgICAgICAgICAgICAgIG5vdCBpc2JqdW5rKGJbYmVzdGotMV0pIGFuZCBcCisgICAgICAgICAgICAgIGFbYmVzdGktMV0gPT0gYltiZXN0ai0xXToKKyAgICAgICAgICAgIGJlc3RpLCBiZXN0aiwgYmVzdHNpemUgPSBiZXN0aS0xLCBiZXN0ai0xLCBiZXN0c2l6ZSsxCisgICAgICAgIHdoaWxlIGJlc3RpK2Jlc3RzaXplIDwgYWhpIGFuZCBiZXN0aitiZXN0c2l6ZSA8IGJoaSBhbmQgXAorICAgICAgICAgICAgICBub3QgaXNianVuayhiW2Jlc3RqK2Jlc3RzaXplXSkgYW5kIFwKKyAgICAgICAgICAgICAgYVtiZXN0aStiZXN0c2l6ZV0gPT0gYltiZXN0aitiZXN0c2l6ZV06CisgICAgICAgICAgICBiZXN0c2l6ZSArPSAxCisKKyAgICAgICAgIyBOb3cgdGhhdCB3ZSBoYXZlIGEgd2hvbGx5IGludGVyZXN0aW5nIG1hdGNoIChhbGJlaXQgcG9zc2libHkKKyAgICAgICAgIyBlbXB0eSEpLCB3ZSBtYXkgYXMgd2VsbCBzdWNrIHVwIHRoZSBtYXRjaGluZyBqdW5rIG9uIGVhY2gKKyAgICAgICAgIyBzaWRlIG9mIGl0IHRvby4gIENhbid0IHRoaW5rIG9mIGEgZ29vZCByZWFzb24gbm90IHRvLCBhbmQgaXQKKyAgICAgICAgIyBzYXZlcyBwb3N0LXByb2Nlc3NpbmcgdGhlIChwb3NzaWJseSBjb25zaWRlcmFibGUpIGV4cGVuc2Ugb2YKKyAgICAgICAgIyBmaWd1cmluZyBvdXQgd2hhdCB0byBkbyB3aXRoIGl0LiAgSW4gdGhlIGNhc2Ugb2YgYW4gZW1wdHkKKyAgICAgICAgIyBpbnRlcmVzdGluZyBtYXRjaCwgdGhpcyBpcyBjbGVhcmx5IHRoZSByaWdodCB0aGluZyB0byBkbywKKyAgICAgICAgIyBiZWNhdXNlIG5vIG90aGVyIGtpbmQgb2YgbWF0Y2ggaXMgcG9zc2libGUgaW4gdGhlIHJlZ2lvbnMuCisgICAgICAgIHdoaWxlIGJlc3RpID4gYWxvIGFuZCBiZXN0aiA+IGJsbyBhbmQgXAorICAgICAgICAgICAgICBpc2JqdW5rKGJbYmVzdGotMV0pIGFuZCBcCisgICAgICAgICAgICAgIGFbYmVzdGktMV0gPT0gYltiZXN0ai0xXToKKyAgICAgICAgICAgIGJlc3RpLCBiZXN0aiwgYmVzdHNpemUgPSBiZXN0aS0xLCBiZXN0ai0xLCBiZXN0c2l6ZSsxCisgICAgICAgIHdoaWxlIGJlc3RpK2Jlc3RzaXplIDwgYWhpIGFuZCBiZXN0aitiZXN0c2l6ZSA8IGJoaSBhbmQgXAorICAgICAgICAgICAgICBpc2JqdW5rKGJbYmVzdGorYmVzdHNpemVdKSBhbmQgXAorICAgICAgICAgICAgICBhW2Jlc3RpK2Jlc3RzaXplXSA9PSBiW2Jlc3RqK2Jlc3RzaXplXToKKyAgICAgICAgICAgIGJlc3RzaXplID0gYmVzdHNpemUgKyAxCisKKyAgICAgICAgcmV0dXJuIE1hdGNoKGJlc3RpLCBiZXN0aiwgYmVzdHNpemUpCisKKyAgICBkZWYgZ2V0X21hdGNoaW5nX2Jsb2NrcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGxpc3Qgb2YgdHJpcGxlcyBkZXNjcmliaW5nIG1hdGNoaW5nIHN1YnNlcXVlbmNlcy4KKworICAgICAgICBFYWNoIHRyaXBsZSBpcyBvZiB0aGUgZm9ybSAoaSwgaiwgbiksIGFuZCBtZWFucyB0aGF0CisgICAgICAgIGFbaTppK25dID09IGJbajpqK25dLiAgVGhlIHRyaXBsZXMgYXJlIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBpbgorICAgICAgICBpIGFuZCBpbiBqLiAgTmV3IGluIFB5dGhvbiAyLjUsIGl0J3MgYWxzbyBndWFyYW50ZWVkIHRoYXQgaWYKKyAgICAgICAgKGksIGosIG4pIGFuZCAoaScsIGonLCBuJykgYXJlIGFkamFjZW50IHRyaXBsZXMgaW4gdGhlIGxpc3QsIGFuZAorICAgICAgICB0aGUgc2Vjb25kIGlzIG5vdCB0aGUgbGFzdCB0cmlwbGUgaW4gdGhlIGxpc3QsIHRoZW4gaStuICE9IGknIG9yCisgICAgICAgIGorbiAhPSBqJy4gIElPVywgYWRqYWNlbnQgdHJpcGxlcyBuZXZlciBkZXNjcmliZSBhZGphY2VudCBlcXVhbAorICAgICAgICBibG9ja3MuCisKKyAgICAgICAgVGhlIGxhc3QgdHJpcGxlIGlzIGEgZHVtbXksIChsZW4oYSksIGxlbihiKSwgMCksIGFuZCBpcyB0aGUgb25seQorICAgICAgICB0cmlwbGUgd2l0aCBuPT0wLgorCisgICAgICAgID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsICJhYnhjZCIsICJhYmNkIikKKyAgICAgICAgPj4+IHMuZ2V0X21hdGNoaW5nX2Jsb2NrcygpCisgICAgICAgIFtNYXRjaChhPTAsIGI9MCwgc2l6ZT0yKSwgTWF0Y2goYT0zLCBiPTIsIHNpemU9MiksIE1hdGNoKGE9NSwgYj00LCBzaXplPTApXQorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLm1hdGNoaW5nX2Jsb2NrcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm1hdGNoaW5nX2Jsb2NrcworICAgICAgICBsYSwgbGIgPSBsZW4oc2VsZi5hKSwgbGVuKHNlbGYuYikKKworICAgICAgICAjIFRoaXMgaXMgbW9zdCBuYXR1cmFsbHkgZXhwcmVzc2VkIGFzIGEgcmVjdXJzaXZlIGFsZ29yaXRobSwgYnV0CisgICAgICAgICMgYXQgbGVhc3Qgb25lIHVzZXIgYnVtcGVkIGludG8gZXh0cmVtZSB1c2UgY2FzZXMgdGhhdCBleGNlZWRlZAorICAgICAgICAjIHRoZSByZWN1cnNpb24gbGltaXQgb24gdGhlaXIgYm94LiAgU28sIG5vdyB3ZSBtYWludGFpbiBhIGxpc3QKKyAgICAgICAgIyAoJ3F1ZXVlYCkgb2YgYmxvY2tzIHdlIHN0aWxsIG5lZWQgdG8gbG9vayBhdCwgYW5kIGFwcGVuZCBwYXJ0aWFsCisgICAgICAgICMgcmVzdWx0cyB0byBgbWF0Y2hpbmdfYmxvY2tzYCBpbiBhIGxvb3A7IHRoZSBtYXRjaGVzIGFyZSBzb3J0ZWQKKyAgICAgICAgIyBhdCB0aGUgZW5kLgorICAgICAgICBxdWV1ZSA9IFsoMCwgbGEsIDAsIGxiKV0KKyAgICAgICAgbWF0Y2hpbmdfYmxvY2tzID0gW10KKyAgICAgICAgd2hpbGUgcXVldWU6CisgICAgICAgICAgICBhbG8sIGFoaSwgYmxvLCBiaGkgPSBxdWV1ZS5wb3AoKQorICAgICAgICAgICAgaSwgaiwgayA9IHggPSBzZWxmLmZpbmRfbG9uZ2VzdF9tYXRjaChhbG8sIGFoaSwgYmxvLCBiaGkpCisgICAgICAgICAgICAjIGFbYWxvOmldIHZzIGJbYmxvOmpdIHVua25vd24KKyAgICAgICAgICAgICMgYVtpOmkra10gc2FtZSBhcyBiW2o6aitrXQorICAgICAgICAgICAgIyBhW2krazphaGldIHZzIGJbaitrOmJoaV0gdW5rbm93bgorICAgICAgICAgICAgaWYgazogICAjIGlmIGsgaXMgMCwgdGhlcmUgd2FzIG5vIG1hdGNoaW5nIGJsb2NrCisgICAgICAgICAgICAgICAgbWF0Y2hpbmdfYmxvY2tzLmFwcGVuZCh4KQorICAgICAgICAgICAgICAgIGlmIGFsbyA8IGkgYW5kIGJsbyA8IGo6CisgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmFwcGVuZCgoYWxvLCBpLCBibG8sIGopKQorICAgICAgICAgICAgICAgIGlmIGkrayA8IGFoaSBhbmQgaitrIDwgYmhpOgorICAgICAgICAgICAgICAgICAgICBxdWV1ZS5hcHBlbmQoKGkraywgYWhpLCBqK2ssIGJoaSkpCisgICAgICAgIG1hdGNoaW5nX2Jsb2Nrcy5zb3J0KCkKKworICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCB3ZSBoYXZlIGFkamFjZW50IGVxdWFsIGJsb2NrcyBpbiB0aGUKKyAgICAgICAgIyBtYXRjaGluZ19ibG9ja3MgbGlzdCBub3cuICBTdGFydGluZyB3aXRoIDIuNSwgdGhpcyBjb2RlIHdhcyBhZGRlZAorICAgICAgICAjIHRvIGNvbGxhcHNlIHRoZW0uCisgICAgICAgIGkxID0gajEgPSBrMSA9IDAKKyAgICAgICAgbm9uX2FkamFjZW50ID0gW10KKyAgICAgICAgZm9yIGkyLCBqMiwgazIgaW4gbWF0Y2hpbmdfYmxvY2tzOgorICAgICAgICAgICAgIyBJcyB0aGlzIGJsb2NrIGFkamFjZW50IHRvIGkxLCBqMSwgazE/CisgICAgICAgICAgICBpZiBpMSArIGsxID09IGkyIGFuZCBqMSArIGsxID09IGoyOgorICAgICAgICAgICAgICAgICMgWWVzLCBzbyBjb2xsYXBzZSB0aGVtIC0tIHRoaXMganVzdCBpbmNyZWFzZXMgdGhlIGxlbmd0aCBvZgorICAgICAgICAgICAgICAgICMgdGhlIGZpcnN0IGJsb2NrIGJ5IHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZCwgYW5kIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICMgYmxvY2sgc28gbGVuZ3RoZW5lZCByZW1haW5zIHRoZSBibG9jayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgICAgICAgICAgazEgKz0gazIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBOb3QgYWRqYWNlbnQuICBSZW1lbWJlciB0aGUgZmlyc3QgYmxvY2sgKGsxPT0wIG1lYW5zIGl0J3MKKyAgICAgICAgICAgICAgICAjIHRoZSBkdW1teSB3ZSBzdGFydGVkIHdpdGgpLCBhbmQgbWFrZSB0aGUgc2Vjb25kIGJsb2NrIHRoZQorICAgICAgICAgICAgICAgICMgbmV3IGJsb2NrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAgICAgICAgICBpZiBrMToKKyAgICAgICAgICAgICAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCgoaTEsIGoxLCBrMSkpCisgICAgICAgICAgICAgICAgaTEsIGoxLCBrMSA9IGkyLCBqMiwgazIKKyAgICAgICAgaWYgazE6CisgICAgICAgICAgICBub25fYWRqYWNlbnQuYXBwZW5kKChpMSwgajEsIGsxKSkKKworICAgICAgICBub25fYWRqYWNlbnQuYXBwZW5kKCAobGEsIGxiLCAwKSApCisgICAgICAgIHNlbGYubWF0Y2hpbmdfYmxvY2tzID0gbm9uX2FkamFjZW50CisgICAgICAgIHJldHVybiBtYXAoTWF0Y2guX21ha2UsIHNlbGYubWF0Y2hpbmdfYmxvY2tzKQorCisgICAgZGVmIGdldF9vcGNvZGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiA1LXR1cGxlcyBkZXNjcmliaW5nIGhvdyB0byB0dXJuIGEgaW50byBiLgorCisgICAgICAgIEVhY2ggdHVwbGUgaXMgb2YgdGhlIGZvcm0gKHRhZywgaTEsIGkyLCBqMSwgajIpLiAgVGhlIGZpcnN0IHR1cGxlCisgICAgICAgIGhhcyBpMSA9PSBqMSA9PSAwLCBhbmQgcmVtYWluaW5nIHR1cGxlcyBoYXZlIGkxID09IHRoZSBpMiBmcm9tIHRoZQorICAgICAgICB0dXBsZSBwcmVjZWRpbmcgaXQsIGFuZCBsaWtld2lzZSBmb3IgajEgPT0gdGhlIHByZXZpb3VzIGoyLgorCisgICAgICAgIFRoZSB0YWdzIGFyZSBzdHJpbmdzLCB3aXRoIHRoZXNlIG1lYW5pbmdzOgorCisgICAgICAgICdyZXBsYWNlJzogIGFbaTE6aTJdIHNob3VsZCBiZSByZXBsYWNlZCBieSBiW2oxOmoyXQorICAgICAgICAnZGVsZXRlJzogICBhW2kxOmkyXSBzaG91bGQgYmUgZGVsZXRlZC4KKyAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGoxPT1qMiBpbiB0aGlzIGNhc2UuCisgICAgICAgICdpbnNlcnQnOiAgIGJbajE6ajJdIHNob3VsZCBiZSBpbnNlcnRlZCBhdCBhW2kxOmkxXS4KKyAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGkxPT1pMiBpbiB0aGlzIGNhc2UuCisgICAgICAgICdlcXVhbCc6ICAgIGFbaTE6aTJdID09IGJbajE6ajJdCisKKyAgICAgICAgPj4+IGEgPSAicWFieGNkIgorICAgICAgICA+Pj4gYiA9ICJhYnljZGYiCisgICAgICAgID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsIGEsIGIpCisgICAgICAgID4+PiBmb3IgdGFnLCBpMSwgaTIsIGoxLCBqMiBpbiBzLmdldF9vcGNvZGVzKCk6CisgICAgICAgIC4uLiAgICBwcmludCAoIiU3cyBhWyVkOiVkXSAoJXMpIGJbJWQ6JWRdICglcykiICUKKyAgICAgICAgLi4uICAgICAgICAgICAodGFnLCBpMSwgaTIsIGFbaTE6aTJdLCBqMSwgajIsIGJbajE6ajJdKSkKKyAgICAgICAgIGRlbGV0ZSBhWzA6MV0gKHEpIGJbMDowXSAoKQorICAgICAgICAgIGVxdWFsIGFbMTozXSAoYWIpIGJbMDoyXSAoYWIpCisgICAgICAgIHJlcGxhY2UgYVszOjRdICh4KSBiWzI6M10gKHkpCisgICAgICAgICAgZXF1YWwgYVs0OjZdIChjZCkgYlszOjVdIChjZCkKKyAgICAgICAgIGluc2VydCBhWzY6Nl0gKCkgYls1OjZdIChmKQorICAgICAgICAiIiIKKworICAgICAgICBpZiBzZWxmLm9wY29kZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGNvZGVzCisgICAgICAgIGkgPSBqID0gMAorICAgICAgICBzZWxmLm9wY29kZXMgPSBhbnN3ZXIgPSBbXQorICAgICAgICBmb3IgYWksIGJqLCBzaXplIGluIHNlbGYuZ2V0X21hdGNoaW5nX2Jsb2NrcygpOgorICAgICAgICAgICAgIyBpbnZhcmlhbnQ6ICB3ZSd2ZSBwdW1wZWQgb3V0IGNvcnJlY3QgZGlmZnMgdG8gY2hhbmdlCisgICAgICAgICAgICAjIGFbOmldIGludG8gYls6al0sIGFuZCB0aGUgbmV4dCBtYXRjaGluZyBibG9jayBpcworICAgICAgICAgICAgIyBhW2FpOmFpK3NpemVdID09IGJbYmo6Ymorc2l6ZV0uICBTbyB3ZSBuZWVkIHRvIHB1bXAKKyAgICAgICAgICAgICMgb3V0IGEgZGlmZiB0byBjaGFuZ2UgYVtpOmFpXSBpbnRvIGJbajpial0sIHB1bXAgb3V0CisgICAgICAgICAgICAjIHRoZSBtYXRjaGluZyBibG9jaywgYW5kIG1vdmUgKGksaikgYmV5b25kIHRoZSBtYXRjaAorICAgICAgICAgICAgdGFnID0gJycKKyAgICAgICAgICAgIGlmIGkgPCBhaSBhbmQgaiA8IGJqOgorICAgICAgICAgICAgICAgIHRhZyA9ICdyZXBsYWNlJworICAgICAgICAgICAgZWxpZiBpIDwgYWk6CisgICAgICAgICAgICAgICAgdGFnID0gJ2RlbGV0ZScKKyAgICAgICAgICAgIGVsaWYgaiA8IGJqOgorICAgICAgICAgICAgICAgIHRhZyA9ICdpbnNlcnQnCisgICAgICAgICAgICBpZiB0YWc6CisgICAgICAgICAgICAgICAgYW5zd2VyLmFwcGVuZCggKHRhZywgaSwgYWksIGosIGJqKSApCisgICAgICAgICAgICBpLCBqID0gYWkrc2l6ZSwgYmorc2l6ZQorICAgICAgICAgICAgIyB0aGUgbGlzdCBvZiBtYXRjaGluZyBibG9ja3MgaXMgdGVybWluYXRlZCBieSBhCisgICAgICAgICAgICAjIHNlbnRpbmVsIHdpdGggc2l6ZSAwCisgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgIGFuc3dlci5hcHBlbmQoICgnZXF1YWwnLCBhaSwgaSwgYmosIGopICkKKyAgICAgICAgcmV0dXJuIGFuc3dlcgorCisgICAgZGVmIGdldF9ncm91cGVkX29wY29kZXMoc2VsZiwgbj0zKToKKyAgICAgICAgIiIiIElzb2xhdGUgY2hhbmdlIGNsdXN0ZXJzIGJ5IGVsaW1pbmF0aW5nIHJhbmdlcyB3aXRoIG5vIGNoYW5nZXMuCisKKyAgICAgICAgUmV0dXJuIGEgZ2VuZXJhdG9yIG9mIGdyb3VwcyB3aXRoIHVwdG8gbiBsaW5lcyBvZiBjb250ZXh0LgorICAgICAgICBFYWNoIGdyb3VwIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyByZXR1cm5lZCBieSBnZXRfb3Bjb2RlcygpLgorCisgICAgICAgID4+PiBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CisgICAgICAgID4+PiBhID0gbWFwKHN0ciwgcmFuZ2UoMSw0MCkpCisgICAgICAgID4+PiBiID0gYVs6XQorICAgICAgICA+Pj4gYls4OjhdID0gWydpJ10gICAgICMgTWFrZSBhbiBpbnNlcnRpb24KKyAgICAgICAgPj4+IGJbMjBdICs9ICd4JyAgICAgICAjIE1ha2UgYSByZXBsYWNlbWVudAorICAgICAgICA+Pj4gYlsyMzoyOF0gPSBbXSAgICAgICMgTWFrZSBhIGRlbGV0aW9uCisgICAgICAgID4+PiBiWzMwXSArPSAneScgICAgICAgIyBNYWtlIGFub3RoZXIgcmVwbGFjZW1lbnQKKyAgICAgICAgPj4+IHBwcmludChsaXN0KFNlcXVlbmNlTWF0Y2hlcihOb25lLGEsYikuZ2V0X2dyb3VwZWRfb3Bjb2RlcygpKSkKKyAgICAgICAgW1soJ2VxdWFsJywgNSwgOCwgNSwgOCksICgnaW5zZXJ0JywgOCwgOCwgOCwgOSksICgnZXF1YWwnLCA4LCAxMSwgOSwgMTIpXSwKKyAgICAgICAgIFsoJ2VxdWFsJywgMTYsIDE5LCAxNywgMjApLAorICAgICAgICAgICgncmVwbGFjZScsIDE5LCAyMCwgMjAsIDIxKSwKKyAgICAgICAgICAoJ2VxdWFsJywgMjAsIDIyLCAyMSwgMjMpLAorICAgICAgICAgICgnZGVsZXRlJywgMjIsIDI3LCAyMywgMjMpLAorICAgICAgICAgICgnZXF1YWwnLCAyNywgMzAsIDIzLCAyNildLAorICAgICAgICAgWygnZXF1YWwnLCAzMSwgMzQsIDI3LCAzMCksCisgICAgICAgICAgKCdyZXBsYWNlJywgMzQsIDM1LCAzMCwgMzEpLAorICAgICAgICAgICgnZXF1YWwnLCAzNSwgMzgsIDMxLCAzNCldXQorICAgICAgICAiIiIKKworICAgICAgICBjb2RlcyA9IHNlbGYuZ2V0X29wY29kZXMoKQorICAgICAgICBpZiBub3QgY29kZXM6CisgICAgICAgICAgICBjb2RlcyA9IFsoImVxdWFsIiwgMCwgMSwgMCwgMSldCisgICAgICAgICMgRml4dXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgZ3JvdXBzIGlmIHRoZXkgc2hvdyBubyBjaGFuZ2VzLgorICAgICAgICBpZiBjb2Rlc1swXVswXSA9PSAnZXF1YWwnOgorICAgICAgICAgICAgdGFnLCBpMSwgaTIsIGoxLCBqMiA9IGNvZGVzWzBdCisgICAgICAgICAgICBjb2Rlc1swXSA9IHRhZywgbWF4KGkxLCBpMi1uKSwgaTIsIG1heChqMSwgajItbiksIGoyCisgICAgICAgIGlmIGNvZGVzWy0xXVswXSA9PSAnZXF1YWwnOgorICAgICAgICAgICAgdGFnLCBpMSwgaTIsIGoxLCBqMiA9IGNvZGVzWy0xXQorICAgICAgICAgICAgY29kZXNbLTFdID0gdGFnLCBpMSwgbWluKGkyLCBpMStuKSwgajEsIG1pbihqMiwgajErbikKKworICAgICAgICBubiA9IG4gKyBuCisgICAgICAgIGdyb3VwID0gW10KKyAgICAgICAgZm9yIHRhZywgaTEsIGkyLCBqMSwgajIgaW4gY29kZXM6CisgICAgICAgICAgICAjIEVuZCB0aGUgY3VycmVudCBncm91cCBhbmQgc3RhcnQgYSBuZXcgb25lIHdoZW5ldmVyCisgICAgICAgICAgICAjIHRoZXJlIGlzIGEgbGFyZ2UgcmFuZ2Ugd2l0aCBubyBjaGFuZ2VzLgorICAgICAgICAgICAgaWYgdGFnID09ICdlcXVhbCcgYW5kIGkyLWkxID4gbm46CisgICAgICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKCh0YWcsIGkxLCBtaW4oaTIsIGkxK24pLCBqMSwgbWluKGoyLCBqMStuKSkpCisgICAgICAgICAgICAgICAgeWllbGQgZ3JvdXAKKyAgICAgICAgICAgICAgICBncm91cCA9IFtdCisgICAgICAgICAgICAgICAgaTEsIGoxID0gbWF4KGkxLCBpMi1uKSwgbWF4KGoxLCBqMi1uKQorICAgICAgICAgICAgZ3JvdXAuYXBwZW5kKCh0YWcsIGkxLCBpMiwgajEgLGoyKSkKKyAgICAgICAgaWYgZ3JvdXAgYW5kIG5vdCAobGVuKGdyb3VwKT09MSBhbmQgZ3JvdXBbMF1bMF0gPT0gJ2VxdWFsJyk6CisgICAgICAgICAgICB5aWVsZCBncm91cAorCisgICAgZGVmIHJhdGlvKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBtZWFzdXJlIG9mIHRoZSBzZXF1ZW5jZXMnIHNpbWlsYXJpdHkgKGZsb2F0IGluIFswLDFdKS4KKworICAgICAgICBXaGVyZSBUIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gYm90aCBzZXF1ZW5jZXMsIGFuZAorICAgICAgICBNIGlzIHRoZSBudW1iZXIgb2YgbWF0Y2hlcywgdGhpcyBpcyAyLjAqTSAvIFQuCisgICAgICAgIE5vdGUgdGhhdCB0aGlzIGlzIDEgaWYgdGhlIHNlcXVlbmNlcyBhcmUgaWRlbnRpY2FsLCBhbmQgMCBpZgorICAgICAgICB0aGV5IGhhdmUgbm90aGluZyBpbiBjb21tb24uCisKKyAgICAgICAgLnJhdGlvKCkgaXMgZXhwZW5zaXZlIHRvIGNvbXB1dGUgaWYgeW91IGhhdmVuJ3QgYWxyZWFkeSBjb21wdXRlZAorICAgICAgICAuZ2V0X21hdGNoaW5nX2Jsb2NrcygpIG9yIC5nZXRfb3Bjb2RlcygpLCBpbiB3aGljaCBjYXNlIHlvdSBtYXkKKyAgICAgICAgd2FudCB0byB0cnkgLnF1aWNrX3JhdGlvKCkgb3IgLnJlYWxfcXVpY2tfcmF0aW8oKSBmaXJzdCB0byBnZXQgYW4KKyAgICAgICAgdXBwZXIgYm91bmQuCisKKyAgICAgICAgPj4+IHMgPSBTZXF1ZW5jZU1hdGNoZXIoTm9uZSwgImFiY2QiLCAiYmNkZSIpCisgICAgICAgID4+PiBzLnJhdGlvKCkKKyAgICAgICAgMC43NQorICAgICAgICA+Pj4gcy5xdWlja19yYXRpbygpCisgICAgICAgIDAuNzUKKyAgICAgICAgPj4+IHMucmVhbF9xdWlja19yYXRpbygpCisgICAgICAgIDEuMAorICAgICAgICAiIiIKKworICAgICAgICBtYXRjaGVzID0gcmVkdWNlKGxhbWJkYSBzdW0sIHRyaXBsZTogc3VtICsgdHJpcGxlWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9tYXRjaGluZ19ibG9ja3MoKSwgMCkKKyAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVfcmF0aW8obWF0Y2hlcywgbGVuKHNlbGYuYSkgKyBsZW4oc2VsZi5iKSkKKworICAgIGRlZiBxdWlja19yYXRpbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIHVwcGVyIGJvdW5kIG9uIHJhdGlvKCkgcmVsYXRpdmVseSBxdWlja2x5LgorCisgICAgICAgIFRoaXMgaXNuJ3QgZGVmaW5lZCBiZXlvbmQgdGhhdCBpdCBpcyBhbiB1cHBlciBib3VuZCBvbiAucmF0aW8oKSwgYW5kCisgICAgICAgIGlzIGZhc3RlciB0byBjb21wdXRlLgorICAgICAgICAiIiIKKworICAgICAgICAjIHZpZXdpbmcgYSBhbmQgYiBhcyBtdWx0aXNldHMsIHNldCBtYXRjaGVzIHRvIHRoZSBjYXJkaW5hbGl0eQorICAgICAgICAjIG9mIHRoZWlyIGludGVyc2VjdGlvbjsgdGhpcyBjb3VudHMgdGhlIG51bWJlciBvZiBtYXRjaGVzCisgICAgICAgICMgd2l0aG91dCByZWdhcmQgdG8gb3JkZXIsIHNvIGlzIGNsZWFybHkgYW4gdXBwZXIgYm91bmQKKyAgICAgICAgaWYgc2VsZi5mdWxsYmNvdW50IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmZ1bGxiY291bnQgPSBmdWxsYmNvdW50ID0ge30KKyAgICAgICAgICAgIGZvciBlbHQgaW4gc2VsZi5iOgorICAgICAgICAgICAgICAgIGZ1bGxiY291bnRbZWx0XSA9IGZ1bGxiY291bnQuZ2V0KGVsdCwgMCkgKyAxCisgICAgICAgIGZ1bGxiY291bnQgPSBzZWxmLmZ1bGxiY291bnQKKyAgICAgICAgIyBhdmFpbFt4XSBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHggYXBwZWFycyBpbiAnYicgbGVzcyB0aGUKKyAgICAgICAgIyBudW1iZXIgb2YgdGltZXMgd2UndmUgc2VlbiBpdCBpbiAnYScgc28gZmFyIC4uLiBraW5kYQorICAgICAgICBhdmFpbCA9IHt9CisgICAgICAgIGF2YWlsaGFzLCBtYXRjaGVzID0gYXZhaWwuX19jb250YWluc19fLCAwCisgICAgICAgIGZvciBlbHQgaW4gc2VsZi5hOgorICAgICAgICAgICAgaWYgYXZhaWxoYXMoZWx0KToKKyAgICAgICAgICAgICAgICBudW1iID0gYXZhaWxbZWx0XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBudW1iID0gZnVsbGJjb3VudC5nZXQoZWx0LCAwKQorICAgICAgICAgICAgYXZhaWxbZWx0XSA9IG51bWIgLSAxCisgICAgICAgICAgICBpZiBudW1iID4gMDoKKyAgICAgICAgICAgICAgICBtYXRjaGVzID0gbWF0Y2hlcyArIDEKKyAgICAgICAgcmV0dXJuIF9jYWxjdWxhdGVfcmF0aW8obWF0Y2hlcywgbGVuKHNlbGYuYSkgKyBsZW4oc2VsZi5iKSkKKworICAgIGRlZiByZWFsX3F1aWNrX3JhdGlvKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gdXBwZXIgYm91bmQgb24gcmF0aW8oKSB2ZXJ5IHF1aWNrbHkuCisKKyAgICAgICAgVGhpcyBpc24ndCBkZWZpbmVkIGJleW9uZCB0aGF0IGl0IGlzIGFuIHVwcGVyIGJvdW5kIG9uIC5yYXRpbygpLCBhbmQKKyAgICAgICAgaXMgZmFzdGVyIHRvIGNvbXB1dGUgdGhhbiBlaXRoZXIgLnJhdGlvKCkgb3IgLnF1aWNrX3JhdGlvKCkuCisgICAgICAgICIiIgorCisgICAgICAgIGxhLCBsYiA9IGxlbihzZWxmLmEpLCBsZW4oc2VsZi5iKQorICAgICAgICAjIGNhbid0IGhhdmUgbW9yZSBtYXRjaGVzIHRoYW4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKKyAgICAgICAgIyBzaG9ydGVyIHNlcXVlbmNlCisgICAgICAgIHJldHVybiBfY2FsY3VsYXRlX3JhdGlvKG1pbihsYSwgbGIpLCBsYSArIGxiKQorCitkZWYgZ2V0X2Nsb3NlX21hdGNoZXMod29yZCwgcG9zc2liaWxpdGllcywgbj0zLCBjdXRvZmY9MC42KToKKyAgICAiIiJVc2UgU2VxdWVuY2VNYXRjaGVyIHRvIHJldHVybiBsaXN0IG9mIHRoZSBiZXN0ICJnb29kIGVub3VnaCIgbWF0Y2hlcy4KKworICAgIHdvcmQgaXMgYSBzZXF1ZW5jZSBmb3Igd2hpY2ggY2xvc2UgbWF0Y2hlcyBhcmUgZGVzaXJlZCAodHlwaWNhbGx5IGEKKyAgICBzdHJpbmcpLgorCisgICAgcG9zc2liaWxpdGllcyBpcyBhIGxpc3Qgb2Ygc2VxdWVuY2VzIGFnYWluc3Qgd2hpY2ggdG8gbWF0Y2ggd29yZAorICAgICh0eXBpY2FsbHkgYSBsaXN0IG9mIHN0cmluZ3MpLgorCisgICAgT3B0aW9uYWwgYXJnIG4gKGRlZmF1bHQgMykgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNsb3NlIG1hdGNoZXMgdG8KKyAgICByZXR1cm4uICBuIG11c3QgYmUgPiAwLgorCisgICAgT3B0aW9uYWwgYXJnIGN1dG9mZiAoZGVmYXVsdCAwLjYpIGlzIGEgZmxvYXQgaW4gWzAsIDFdLiAgUG9zc2liaWxpdGllcworICAgIHRoYXQgZG9uJ3Qgc2NvcmUgYXQgbGVhc3QgdGhhdCBzaW1pbGFyIHRvIHdvcmQgYXJlIGlnbm9yZWQuCisKKyAgICBUaGUgYmVzdCAobm8gbW9yZSB0aGFuIG4pIG1hdGNoZXMgYW1vbmcgdGhlIHBvc3NpYmlsaXRpZXMgYXJlIHJldHVybmVkCisgICAgaW4gYSBsaXN0LCBzb3J0ZWQgYnkgc2ltaWxhcml0eSBzY29yZSwgbW9zdCBzaW1pbGFyIGZpcnN0LgorCisgICAgPj4+IGdldF9jbG9zZV9tYXRjaGVzKCJhcHBlbCIsIFsiYXBlIiwgImFwcGxlIiwgInBlYWNoIiwgInB1cHB5Il0pCisgICAgWydhcHBsZScsICdhcGUnXQorICAgID4+PiBpbXBvcnQga2V5d29yZCBhcyBfa2V5d29yZAorICAgID4+PiBnZXRfY2xvc2VfbWF0Y2hlcygid2hlZWwiLCBfa2V5d29yZC5rd2xpc3QpCisgICAgWyd3aGlsZSddCisgICAgPj4+IGdldF9jbG9zZV9tYXRjaGVzKCJhcHBsZSIsIF9rZXl3b3JkLmt3bGlzdCkKKyAgICBbXQorICAgID4+PiBnZXRfY2xvc2VfbWF0Y2hlcygiYWNjZXB0IiwgX2tleXdvcmQua3dsaXN0KQorICAgIFsnZXhjZXB0J10KKyAgICAiIiIKKworICAgIGlmIG5vdCBuID4gIDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm4gbXVzdCBiZSA+IDA6ICVyIiAlIChuLCkpCisgICAgaWYgbm90IDAuMCA8PSBjdXRvZmYgPD0gMS4wOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjdXRvZmYgbXVzdCBiZSBpbiBbMC4wLCAxLjBdOiAlciIgJSAoY3V0b2ZmLCkpCisgICAgcmVzdWx0ID0gW10KKyAgICBzID0gU2VxdWVuY2VNYXRjaGVyKCkKKyAgICBzLnNldF9zZXEyKHdvcmQpCisgICAgZm9yIHggaW4gcG9zc2liaWxpdGllczoKKyAgICAgICAgcy5zZXRfc2VxMSh4KQorICAgICAgICBpZiBzLnJlYWxfcXVpY2tfcmF0aW8oKSA+PSBjdXRvZmYgYW5kIFwKKyAgICAgICAgICAgcy5xdWlja19yYXRpbygpID49IGN1dG9mZiBhbmQgXAorICAgICAgICAgICBzLnJhdGlvKCkgPj0gY3V0b2ZmOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgocy5yYXRpbygpLCB4KSkKKworICAgICMgTW92ZSB0aGUgYmVzdCBzY29yZXJzIHRvIGhlYWQgb2YgbGlzdAorICAgIHJlc3VsdCA9IGhlYXBxLm5sYXJnZXN0KG4sIHJlc3VsdCkKKyAgICAjIFN0cmlwIHNjb3JlcyBmb3IgdGhlIGJlc3QgbiBtYXRjaGVzCisgICAgcmV0dXJuIFt4IGZvciBzY29yZSwgeCBpbiByZXN1bHRdCisKK2RlZiBfY291bnRfbGVhZGluZyhsaW5lLCBjaCk6CisgICAgIiIiCisgICAgUmV0dXJuIG51bWJlciBvZiBgY2hgIGNoYXJhY3RlcnMgYXQgdGhlIHN0YXJ0IG9mIGBsaW5lYC4KKworICAgIEV4YW1wbGU6CisKKyAgICA+Pj4gX2NvdW50X2xlYWRpbmcoJyAgIGFiYycsICcgJykKKyAgICAzCisgICAgIiIiCisKKyAgICBpLCBuID0gMCwgbGVuKGxpbmUpCisgICAgd2hpbGUgaSA8IG4gYW5kIGxpbmVbaV0gPT0gY2g6CisgICAgICAgIGkgKz0gMQorICAgIHJldHVybiBpCisKK2NsYXNzIERpZmZlcjoKKyAgICByIiIiCisgICAgRGlmZmVyIGlzIGEgY2xhc3MgZm9yIGNvbXBhcmluZyBzZXF1ZW5jZXMgb2YgbGluZXMgb2YgdGV4dCwgYW5kCisgICAgcHJvZHVjaW5nIGh1bWFuLXJlYWRhYmxlIGRpZmZlcmVuY2VzIG9yIGRlbHRhcy4gIERpZmZlciB1c2VzCisgICAgU2VxdWVuY2VNYXRjaGVyIGJvdGggdG8gY29tcGFyZSBzZXF1ZW5jZXMgb2YgbGluZXMsIGFuZCB0byBjb21wYXJlCisgICAgc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMgd2l0aGluIHNpbWlsYXIgKG5lYXItbWF0Y2hpbmcpIGxpbmVzLgorCisgICAgRWFjaCBsaW5lIG9mIGEgRGlmZmVyIGRlbHRhIGJlZ2lucyB3aXRoIGEgdHdvLWxldHRlciBjb2RlOgorCisgICAgICAgICctICcgICAgbGluZSB1bmlxdWUgdG8gc2VxdWVuY2UgMQorICAgICAgICAnKyAnICAgIGxpbmUgdW5pcXVlIHRvIHNlcXVlbmNlIDIKKyAgICAgICAgJyAgJyAgICBsaW5lIGNvbW1vbiB0byBib3RoIHNlcXVlbmNlcworICAgICAgICAnPyAnICAgIGxpbmUgbm90IHByZXNlbnQgaW4gZWl0aGVyIGlucHV0IHNlcXVlbmNlCisKKyAgICBMaW5lcyBiZWdpbm5pbmcgd2l0aCAnPyAnIGF0dGVtcHQgdG8gZ3VpZGUgdGhlIGV5ZSB0byBpbnRyYWxpbmUKKyAgICBkaWZmZXJlbmNlcywgYW5kIHdlcmUgbm90IHByZXNlbnQgaW4gZWl0aGVyIGlucHV0IHNlcXVlbmNlLiAgVGhlc2UgbGluZXMKKyAgICBjYW4gYmUgY29uZnVzaW5nIGlmIHRoZSBzZXF1ZW5jZXMgY29udGFpbiB0YWIgY2hhcmFjdGVycy4KKworICAgIE5vdGUgdGhhdCBEaWZmZXIgbWFrZXMgbm8gY2xhaW0gdG8gcHJvZHVjZSBhICptaW5pbWFsKiBkaWZmLiAgVG8gdGhlCisgICAgY29udHJhcnksIG1pbmltYWwgZGlmZnMgYXJlIG9mdGVuIGNvdW50ZXItaW50dWl0aXZlLCBiZWNhdXNlIHRoZXkgc3luY2gKKyAgICB1cCBhbnl3aGVyZSBwb3NzaWJsZSwgc29tZXRpbWVzIGFjY2lkZW50YWwgbWF0Y2hlcyAxMDAgcGFnZXMgYXBhcnQuCisgICAgUmVzdHJpY3Rpbmcgc3luY2ggcG9pbnRzIHRvIGNvbnRpZ3VvdXMgbWF0Y2hlcyBwcmVzZXJ2ZXMgc29tZSBub3Rpb24gb2YKKyAgICBsb2NhbGl0eSwgYXQgdGhlIG9jY2FzaW9uYWwgY29zdCBvZiBwcm9kdWNpbmcgYSBsb25nZXIgZGlmZi4KKworICAgIEV4YW1wbGU6IENvbXBhcmluZyB0d28gdGV4dHMuCisKKyAgICBGaXJzdCB3ZSBzZXQgdXAgdGhlIHRleHRzLCBzZXF1ZW5jZXMgb2YgaW5kaXZpZHVhbCBzaW5nbGUtbGluZSBzdHJpbmdzCisgICAgZW5kaW5nIHdpdGggbmV3bGluZXMgKHN1Y2ggc2VxdWVuY2VzIGNhbiBhbHNvIGJlIG9idGFpbmVkIGZyb20gdGhlCisgICAgYHJlYWRsaW5lcygpYCBtZXRob2Qgb2YgZmlsZS1saWtlIG9iamVjdHMpOgorCisgICAgPj4+IHRleHQxID0gJycnICAxLiBCZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS4KKyAgICAuLi4gICAyLiBFeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC4KKyAgICAuLi4gICAzLiBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KKyAgICAuLi4gICA0LiBDb21wbGV4IGlzIGJldHRlciB0aGFuIGNvbXBsaWNhdGVkLgorICAgIC4uLiAnJycuc3BsaXRsaW5lcygxKQorICAgID4+PiBsZW4odGV4dDEpCisgICAgNAorICAgID4+PiB0ZXh0MVswXVstMV0KKyAgICAnXG4nCisgICAgPj4+IHRleHQyID0gJycnICAxLiBCZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS4KKyAgICAuLi4gICAzLiAgIFNpbXBsZSBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgorICAgIC4uLiAgIDQuIENvbXBsaWNhdGVkIGlzIGJldHRlciB0aGFuIGNvbXBsZXguCisgICAgLi4uICAgNS4gRmxhdCBpcyBiZXR0ZXIgdGhhbiBuZXN0ZWQuCisgICAgLi4uICcnJy5zcGxpdGxpbmVzKDEpCisKKyAgICBOZXh0IHdlIGluc3RhbnRpYXRlIGEgRGlmZmVyIG9iamVjdDoKKworICAgID4+PiBkID0gRGlmZmVyKCkKKworICAgIE5vdGUgdGhhdCB3aGVuIGluc3RhbnRpYXRpbmcgYSBEaWZmZXIgb2JqZWN0IHdlIG1heSBwYXNzIGZ1bmN0aW9ucyB0bworICAgIGZpbHRlciBvdXQgbGluZSBhbmQgY2hhcmFjdGVyICdqdW5rJy4gIFNlZSBEaWZmZXIuX19pbml0X18gZm9yIGRldGFpbHMuCisKKyAgICBGaW5hbGx5LCB3ZSBjb21wYXJlIHRoZSB0d286CisKKyAgICA+Pj4gcmVzdWx0ID0gbGlzdChkLmNvbXBhcmUodGV4dDEsIHRleHQyKSkKKworICAgICdyZXN1bHQnIGlzIGEgbGlzdCBvZiBzdHJpbmdzLCBzbyBsZXQncyBwcmV0dHktcHJpbnQgaXQ6CisKKyAgICA+Pj4gZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludCBhcyBfcHByaW50CisgICAgPj4+IF9wcHJpbnQocmVzdWx0KQorICAgIFsnICAgIDEuIEJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LlxuJywKKyAgICAgJy0gICAyLiBFeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC5cbicsCisgICAgICctICAgMy4gU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguXG4nLAorICAgICAnKyAgIDMuICAgU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguXG4nLAorICAgICAnPyAgICAgKytcbicsCisgICAgICctICAgNC4gQ29tcGxleCBpcyBiZXR0ZXIgdGhhbiBjb21wbGljYXRlZC5cbicsCisgICAgICc/ICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgIC0tLS0gXlxuJywKKyAgICAgJysgICA0LiBDb21wbGljYXRlZCBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LlxuJywKKyAgICAgJz8gICAgICAgICAgICsrKysgXiAgICAgICAgICAgICAgICAgICAgICBeXG4nLAorICAgICAnKyAgIDUuIEZsYXQgaXMgYmV0dGVyIHRoYW4gbmVzdGVkLlxuJ10KKworICAgIEFzIGEgc2luZ2xlIG11bHRpLWxpbmUgc3RyaW5nIGl0IGxvb2tzIGxpa2UgdGhpczoKKworICAgID4+PiBwcmludCAnJy5qb2luKHJlc3VsdCksCisgICAgICAgIDEuIEJlYXV0aWZ1bCBpcyBiZXR0ZXIgdGhhbiB1Z2x5LgorICAgIC0gICAyLiBFeHBsaWNpdCBpcyBiZXR0ZXIgdGhhbiBpbXBsaWNpdC4KKyAgICAtICAgMy4gU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguCisgICAgKyAgIDMuICAgU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguCisgICAgPyAgICAgKysKKyAgICAtICAgNC4gQ29tcGxleCBpcyBiZXR0ZXIgdGhhbiBjb21wbGljYXRlZC4KKyAgICA/ICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgIC0tLS0gXgorICAgICsgICA0LiBDb21wbGljYXRlZCBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgorICAgID8gICAgICAgICAgICsrKysgXiAgICAgICAgICAgICAgICAgICAgICBeCisgICAgKyAgIDUuIEZsYXQgaXMgYmV0dGVyIHRoYW4gbmVzdGVkLgorCisgICAgTWV0aG9kczoKKworICAgIF9faW5pdF9fKGxpbmVqdW5rPU5vbmUsIGNoYXJqdW5rPU5vbmUpCisgICAgICAgIENvbnN0cnVjdCBhIHRleHQgZGlmZmVyZW5jZXIsIHdpdGggb3B0aW9uYWwgZmlsdGVycy4KKworICAgIGNvbXBhcmUoYSwgYikKKyAgICAgICAgQ29tcGFyZSB0d28gc2VxdWVuY2VzIG9mIGxpbmVzOyBnZW5lcmF0ZSB0aGUgcmVzdWx0aW5nIGRlbHRhLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVqdW5rPU5vbmUsIGNoYXJqdW5rPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29uc3RydWN0IGEgdGV4dCBkaWZmZXJlbmNlciwgd2l0aCBvcHRpb25hbCBmaWx0ZXJzLgorCisgICAgICAgIFRoZSB0d28gb3B0aW9uYWwga2V5d29yZCBwYXJhbWV0ZXJzIGFyZSBmb3IgZmlsdGVyIGZ1bmN0aW9uczoKKworICAgICAgICAtIGBsaW5lanVua2A6IEEgZnVuY3Rpb24gdGhhdCBzaG91bGQgYWNjZXB0IGEgc2luZ2xlIHN0cmluZyBhcmd1bWVudCwKKyAgICAgICAgICBhbmQgcmV0dXJuIHRydWUgaWZmIHRoZSBzdHJpbmcgaXMganVuay4gVGhlIG1vZHVsZS1sZXZlbCBmdW5jdGlvbgorICAgICAgICAgIGBJU19MSU5FX0pVTktgIG1heSBiZSB1c2VkIHRvIGZpbHRlciBvdXQgbGluZXMgd2l0aG91dCB2aXNpYmxlCisgICAgICAgICAgY2hhcmFjdGVycywgZXhjZXB0IGZvciBhdCBtb3N0IG9uZSBzcGxhdCAoJyMnKS4gIEl0IGlzIHJlY29tbWVuZGVkCisgICAgICAgICAgdG8gbGVhdmUgbGluZWp1bmsgTm9uZTsgYXMgb2YgUHl0aG9uIDIuMywgdGhlIHVuZGVybHlpbmcKKyAgICAgICAgICBTZXF1ZW5jZU1hdGNoZXIgY2xhc3MgaGFzIGdyb3duIGFuIGFkYXB0aXZlIG5vdGlvbiBvZiAibm9pc2UiIGxpbmVzCisgICAgICAgICAgdGhhdCdzIGJldHRlciB0aGFuIGFueSBzdGF0aWMgZGVmaW5pdGlvbiB0aGUgYXV0aG9yIGhhcyBldmVyIGJlZW4KKyAgICAgICAgICBhYmxlIHRvIGNyYWZ0LgorCisgICAgICAgIC0gYGNoYXJqdW5rYDogQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBhY2NlcHQgYSBzdHJpbmcgb2YgbGVuZ3RoIDEuIFRoZQorICAgICAgICAgIG1vZHVsZS1sZXZlbCBmdW5jdGlvbiBgSVNfQ0hBUkFDVEVSX0pVTktgIG1heSBiZSB1c2VkIHRvIGZpbHRlciBvdXQKKyAgICAgICAgICB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKGEgYmxhbmsgb3IgdGFiOyAqKm5vdGUqKjogYmFkIGlkZWEgdG8gaW5jbHVkZQorICAgICAgICAgIG5ld2xpbmUgaW4gdGhpcyEpLiAgVXNlIG9mIElTX0NIQVJBQ1RFUl9KVU5LIGlzIHJlY29tbWVuZGVkLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLmxpbmVqdW5rID0gbGluZWp1bmsKKyAgICAgICAgc2VsZi5jaGFyanVuayA9IGNoYXJqdW5rCisKKyAgICBkZWYgY29tcGFyZShzZWxmLCBhLCBiKToKKyAgICAgICAgciIiIgorICAgICAgICBDb21wYXJlIHR3byBzZXF1ZW5jZXMgb2YgbGluZXM7IGdlbmVyYXRlIHRoZSByZXN1bHRpbmcgZGVsdGEuCisKKyAgICAgICAgRWFjaCBzZXF1ZW5jZSBtdXN0IGNvbnRhaW4gaW5kaXZpZHVhbCBzaW5nbGUtbGluZSBzdHJpbmdzIGVuZGluZyB3aXRoCisgICAgICAgIG5ld2xpbmVzLiBTdWNoIHNlcXVlbmNlcyBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUgYHJlYWRsaW5lcygpYCBtZXRob2QKKyAgICAgICAgb2YgZmlsZS1saWtlIG9iamVjdHMuICBUaGUgZGVsdGEgZ2VuZXJhdGVkIGFsc28gY29uc2lzdHMgb2YgbmV3bGluZS0KKyAgICAgICAgdGVybWluYXRlZCBzdHJpbmdzLCByZWFkeSB0byBiZSBwcmludGVkIGFzLWlzIHZpYSB0aGUgd3JpdGVsaW5lKCkKKyAgICAgICAgbWV0aG9kIG9mIGEgZmlsZS1saWtlIG9iamVjdC4KKworICAgICAgICBFeGFtcGxlOgorCisgICAgICAgID4+PiBwcmludCAnJy5qb2luKERpZmZlcigpLmNvbXBhcmUoJ29uZVxudHdvXG50aHJlZVxuJy5zcGxpdGxpbmVzKDEpLAorICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcmVcbnRyZWVcbmVtdVxuJy5zcGxpdGxpbmVzKDEpKSksCisgICAgICAgIC0gb25lCisgICAgICAgID8gIF4KKyAgICAgICAgKyBvcmUKKyAgICAgICAgPyAgXgorICAgICAgICAtIHR3bworICAgICAgICAtIHRocmVlCisgICAgICAgID8gIC0KKyAgICAgICAgKyB0cmVlCisgICAgICAgICsgZW11CisgICAgICAgICIiIgorCisgICAgICAgIGNydW5jaGVyID0gU2VxdWVuY2VNYXRjaGVyKHNlbGYubGluZWp1bmssIGEsIGIpCisgICAgICAgIGZvciB0YWcsIGFsbywgYWhpLCBibG8sIGJoaSBpbiBjcnVuY2hlci5nZXRfb3Bjb2RlcygpOgorICAgICAgICAgICAgaWYgdGFnID09ICdyZXBsYWNlJzoKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5fZmFuY3lfcmVwbGFjZShhLCBhbG8sIGFoaSwgYiwgYmxvLCBiaGkpCisgICAgICAgICAgICBlbGlmIHRhZyA9PSAnZGVsZXRlJzoKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5fZHVtcCgnLScsIGEsIGFsbywgYWhpKQorICAgICAgICAgICAgZWxpZiB0YWcgPT0gJ2luc2VydCc6CisgICAgICAgICAgICAgICAgZyA9IHNlbGYuX2R1bXAoJysnLCBiLCBibG8sIGJoaSkKKyAgICAgICAgICAgIGVsaWYgdGFnID09ICdlcXVhbCc6CisgICAgICAgICAgICAgICAgZyA9IHNlbGYuX2R1bXAoJyAnLCBhLCBhbG8sIGFoaSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ3Vua25vd24gdGFnICVyJyAlICh0YWcsKQorCisgICAgICAgICAgICBmb3IgbGluZSBpbiBnOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBfZHVtcChzZWxmLCB0YWcsIHgsIGxvLCBoaSk6CisgICAgICAgICIiIkdlbmVyYXRlIGNvbXBhcmlzb24gcmVzdWx0cyBmb3IgYSBzYW1lLXRhZ2dlZCByYW5nZS4iIiIKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxvLCBoaSk6CisgICAgICAgICAgICB5aWVsZCAnJXMgJXMnICUgKHRhZywgeFtpXSkKKworICAgIGRlZiBfcGxhaW5fcmVwbGFjZShzZWxmLCBhLCBhbG8sIGFoaSwgYiwgYmxvLCBiaGkpOgorICAgICAgICBhc3NlcnQgYWxvIDwgYWhpIGFuZCBibG8gPCBiaGkKKyAgICAgICAgIyBkdW1wIHRoZSBzaG9ydGVyIGJsb2NrIGZpcnN0IC0tIHJlZHVjZXMgdGhlIGJ1cmRlbiBvbiBzaG9ydC10ZXJtCisgICAgICAgICMgbWVtb3J5IGlmIHRoZSBibG9ja3MgYXJlIG9mIHZlcnkgZGlmZmVyZW50IHNpemVzCisgICAgICAgIGlmIGJoaSAtIGJsbyA8IGFoaSAtIGFsbzoKKyAgICAgICAgICAgIGZpcnN0ICA9IHNlbGYuX2R1bXAoJysnLCBiLCBibG8sIGJoaSkKKyAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuX2R1bXAoJy0nLCBhLCBhbG8sIGFoaSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0ICA9IHNlbGYuX2R1bXAoJy0nLCBhLCBhbG8sIGFoaSkKKyAgICAgICAgICAgIHNlY29uZCA9IHNlbGYuX2R1bXAoJysnLCBiLCBibG8sIGJoaSkKKworICAgICAgICBmb3IgZyBpbiBmaXJzdCwgc2Vjb25kOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZzoKKyAgICAgICAgICAgICAgICB5aWVsZCBsaW5lCisKKyAgICBkZWYgX2ZhbmN5X3JlcGxhY2Uoc2VsZiwgYSwgYWxvLCBhaGksIGIsIGJsbywgYmhpKToKKyAgICAgICAgciIiIgorICAgICAgICBXaGVuIHJlcGxhY2luZyBvbmUgYmxvY2sgb2YgbGluZXMgd2l0aCBhbm90aGVyLCBzZWFyY2ggdGhlIGJsb2NrcworICAgICAgICBmb3IgKnNpbWlsYXIqIGxpbmVzOyB0aGUgYmVzdC1tYXRjaGluZyBwYWlyIChpZiBhbnkpIGlzIHVzZWQgYXMgYQorICAgICAgICBzeW5jaCBwb2ludCwgYW5kIGludHJhbGluZSBkaWZmZXJlbmNlIG1hcmtpbmcgaXMgZG9uZSBvbiB0aGUKKyAgICAgICAgc2ltaWxhciBwYWlyLiBMb3RzIG9mIHdvcmssIGJ1dCBvZnRlbiB3b3J0aCBpdC4KKworICAgICAgICBFeGFtcGxlOgorCisgICAgICAgID4+PiBkID0gRGlmZmVyKCkKKyAgICAgICAgPj4+IHJlc3VsdHMgPSBkLl9mYW5jeV9yZXBsYWNlKFsnYWJjRGVmZ2hpSmtsXG4nXSwgMCwgMSwKKyAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYWJjZGVmR2hpamtsXG4nXSwgMCwgMSkKKyAgICAgICAgPj4+IHByaW50ICcnLmpvaW4ocmVzdWx0cyksCisgICAgICAgIC0gYWJjRGVmZ2hpSmtsCisgICAgICAgID8gICAgXiAgXiAgXgorICAgICAgICArIGFiY2RlZkdoaWprbAorICAgICAgICA/ICAgIF4gIF4gIF4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBkb24ndCBzeW5jaCB1cCB1bmxlc3MgdGhlIGxpbmVzIGhhdmUgYSBzaW1pbGFyaXR5IHNjb3JlIG9mIGF0CisgICAgICAgICMgbGVhc3QgY3V0b2ZmOyBiZXN0X3JhdGlvIHRyYWNrcyB0aGUgYmVzdCBzY29yZSBzZWVuIHNvIGZhcgorICAgICAgICBiZXN0X3JhdGlvLCBjdXRvZmYgPSAwLjc0LCAwLjc1CisgICAgICAgIGNydW5jaGVyID0gU2VxdWVuY2VNYXRjaGVyKHNlbGYuY2hhcmp1bmspCisgICAgICAgIGVxaSwgZXFqID0gTm9uZSwgTm9uZSAgICMgMXN0IGluZGljZXMgb2YgZXF1YWwgbGluZXMgKGlmIGFueSkKKworICAgICAgICAjIHNlYXJjaCBmb3IgdGhlIHBhaXIgdGhhdCBtYXRjaGVzIGJlc3Qgd2l0aG91dCBiZWluZyBpZGVudGljYWwKKyAgICAgICAgIyAoaWRlbnRpY2FsIGxpbmVzIG11c3QgYmUganVuayBsaW5lcywgJiB3ZSBkb24ndCB3YW50IHRvIHN5bmNoIHVwCisgICAgICAgICMgb24ganVuayAtLSB1bmxlc3Mgd2UgaGF2ZSB0bykKKyAgICAgICAgZm9yIGogaW4geHJhbmdlKGJsbywgYmhpKToKKyAgICAgICAgICAgIGJqID0gYltqXQorICAgICAgICAgICAgY3J1bmNoZXIuc2V0X3NlcTIoYmopCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoYWxvLCBhaGkpOgorICAgICAgICAgICAgICAgIGFpID0gYVtpXQorICAgICAgICAgICAgICAgIGlmIGFpID09IGJqOgorICAgICAgICAgICAgICAgICAgICBpZiBlcWkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVxaSwgZXFqID0gaSwgagorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGNydW5jaGVyLnNldF9zZXExKGFpKQorICAgICAgICAgICAgICAgICMgY29tcHV0aW5nIHNpbWlsYXJpdHkgaXMgZXhwZW5zaXZlLCBzbyB1c2UgdGhlIHF1aWNrCisgICAgICAgICAgICAgICAgIyB1cHBlciBib3VuZHMgZmlyc3QgLS0gaGF2ZSBzZWVuIHRoaXMgc3BlZWQgdXAgbWVzc3kKKyAgICAgICAgICAgICAgICAjIGNvbXBhcmVzIGJ5IGEgZmFjdG9yIG9mIDMuCisgICAgICAgICAgICAgICAgIyBub3RlIHRoYXQgcmF0aW8oKSBpcyBvbmx5IGV4cGVuc2l2ZSB0byBjb21wdXRlIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICMgdGltZSBpdCdzIGNhbGxlZCBvbiBhIHNlcXVlbmNlIHBhaXI7IHRoZSBleHBlbnNpdmUgcGFydAorICAgICAgICAgICAgICAgICMgb2YgdGhlIGNvbXB1dGF0aW9uIGlzIGNhY2hlZCBieSBjcnVuY2hlcgorICAgICAgICAgICAgICAgIGlmIGNydW5jaGVyLnJlYWxfcXVpY2tfcmF0aW8oKSA+IGJlc3RfcmF0aW8gYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICBjcnVuY2hlci5xdWlja19yYXRpbygpID4gYmVzdF9yYXRpbyBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgIGNydW5jaGVyLnJhdGlvKCkgPiBiZXN0X3JhdGlvOgorICAgICAgICAgICAgICAgICAgICBiZXN0X3JhdGlvLCBiZXN0X2ksIGJlc3RfaiA9IGNydW5jaGVyLnJhdGlvKCksIGksIGoKKyAgICAgICAgaWYgYmVzdF9yYXRpbyA8IGN1dG9mZjoKKyAgICAgICAgICAgICMgbm8gbm9uLWlkZW50aWNhbCAicHJldHR5IGNsb3NlIiBwYWlyCisgICAgICAgICAgICBpZiBlcWkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIG5vIGlkZW50aWNhbCBwYWlyIGVpdGhlciAtLSB0cmVhdCBpdCBhcyBhIHN0cmFpZ2h0IHJlcGxhY2UKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9wbGFpbl9yZXBsYWNlKGEsIGFsbywgYWhpLCBiLCBibG8sIGJoaSk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICMgbm8gY2xvc2UgcGFpciwgYnV0IGFuIGlkZW50aWNhbCBwYWlyIC0tIHN5bmNoIHVwIG9uIHRoYXQKKyAgICAgICAgICAgIGJlc3RfaSwgYmVzdF9qLCBiZXN0X3JhdGlvID0gZXFpLCBlcWosIDEuMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0aGVyZSdzIGEgY2xvc2UgcGFpciwgc28gZm9yZ2V0IHRoZSBpZGVudGljYWwgcGFpciAoaWYgYW55KQorICAgICAgICAgICAgZXFpID0gTm9uZQorCisgICAgICAgICMgYVtiZXN0X2ldIHZlcnkgc2ltaWxhciB0byBiW2Jlc3Rfal07IGVxaSBpcyBOb25lIGlmZiB0aGV5J3JlIG5vdAorICAgICAgICAjIGlkZW50aWNhbAorCisgICAgICAgICMgcHVtcCBvdXQgZGlmZnMgZnJvbSBiZWZvcmUgdGhlIHN5bmNoIHBvaW50CisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2ZhbmN5X2hlbHBlcihhLCBhbG8sIGJlc3RfaSwgYiwgYmxvLCBiZXN0X2opOgorICAgICAgICAgICAgeWllbGQgbGluZQorCisgICAgICAgICMgZG8gaW50cmFsaW5lIG1hcmtpbmcgb24gdGhlIHN5bmNoIHBhaXIKKyAgICAgICAgYWVsdCwgYmVsdCA9IGFbYmVzdF9pXSwgYltiZXN0X2pdCisgICAgICAgIGlmIGVxaSBpcyBOb25lOgorICAgICAgICAgICAgIyBwdW1wIG91dCBhICctJywgJz8nLCAnKycsICc/JyBxdWFkIGZvciB0aGUgc3luY2hlZCBsaW5lcworICAgICAgICAgICAgYXRhZ3MgPSBidGFncyA9ICIiCisgICAgICAgICAgICBjcnVuY2hlci5zZXRfc2VxcyhhZWx0LCBiZWx0KQorICAgICAgICAgICAgZm9yIHRhZywgYWkxLCBhaTIsIGJqMSwgYmoyIGluIGNydW5jaGVyLmdldF9vcGNvZGVzKCk6CisgICAgICAgICAgICAgICAgbGEsIGxiID0gYWkyIC0gYWkxLCBiajIgLSBiajEKKyAgICAgICAgICAgICAgICBpZiB0YWcgPT0gJ3JlcGxhY2UnOgorICAgICAgICAgICAgICAgICAgICBhdGFncyArPSAnXicgKiBsYQorICAgICAgICAgICAgICAgICAgICBidGFncyArPSAnXicgKiBsYgorICAgICAgICAgICAgICAgIGVsaWYgdGFnID09ICdkZWxldGUnOgorICAgICAgICAgICAgICAgICAgICBhdGFncyArPSAnLScgKiBsYQorICAgICAgICAgICAgICAgIGVsaWYgdGFnID09ICdpbnNlcnQnOgorICAgICAgICAgICAgICAgICAgICBidGFncyArPSAnKycgKiBsYgorICAgICAgICAgICAgICAgIGVsaWYgdGFnID09ICdlcXVhbCc6CisgICAgICAgICAgICAgICAgICAgIGF0YWdzICs9ICcgJyAqIGxhCisgICAgICAgICAgICAgICAgICAgIGJ0YWdzICs9ICcgJyAqIGxiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ3Vua25vd24gdGFnICVyJyAlICh0YWcsKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5fcWZvcm1hdChhZWx0LCBiZWx0LCBhdGFncywgYnRhZ3MpOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgdGhlIHN5bmNoIHBhaXIgaXMgaWRlbnRpY2FsCisgICAgICAgICAgICB5aWVsZCAnICAnICsgYWVsdAorCisgICAgICAgICMgcHVtcCBvdXQgZGlmZnMgZnJvbSBhZnRlciB0aGUgc3luY2ggcG9pbnQKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5fZmFuY3lfaGVscGVyKGEsIGJlc3RfaSsxLCBhaGksIGIsIGJlc3RfaisxLCBiaGkpOgorICAgICAgICAgICAgeWllbGQgbGluZQorCisgICAgZGVmIF9mYW5jeV9oZWxwZXIoc2VsZiwgYSwgYWxvLCBhaGksIGIsIGJsbywgYmhpKToKKyAgICAgICAgZyA9IFtdCisgICAgICAgIGlmIGFsbyA8IGFoaToKKyAgICAgICAgICAgIGlmIGJsbyA8IGJoaToKKyAgICAgICAgICAgICAgICBnID0gc2VsZi5fZmFuY3lfcmVwbGFjZShhLCBhbG8sIGFoaSwgYiwgYmxvLCBiaGkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGcgPSBzZWxmLl9kdW1wKCctJywgYSwgYWxvLCBhaGkpCisgICAgICAgIGVsaWYgYmxvIDwgYmhpOgorICAgICAgICAgICAgZyA9IHNlbGYuX2R1bXAoJysnLCBiLCBibG8sIGJoaSkKKworICAgICAgICBmb3IgbGluZSBpbiBnOgorICAgICAgICAgICAgeWllbGQgbGluZQorCisgICAgZGVmIF9xZm9ybWF0KHNlbGYsIGFsaW5lLCBibGluZSwgYXRhZ3MsIGJ0YWdzKToKKyAgICAgICAgciIiIgorICAgICAgICBGb3JtYXQgIj8iIG91dHB1dCBhbmQgZGVhbCB3aXRoIGxlYWRpbmcgdGFicy4KKworICAgICAgICBFeGFtcGxlOgorCisgICAgICAgID4+PiBkID0gRGlmZmVyKCkKKyAgICAgICAgPj4+IHJlc3VsdHMgPSBkLl9xZm9ybWF0KCdcdGFiY0RlZmdoaUprbFxuJywgJ1x0YWJjZGVmR2hpamtsXG4nLAorICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgJyAgXiBeICBeICAgICAgJywgJyAgXiBeICBeICAgICAgJykKKyAgICAgICAgPj4+IGZvciBsaW5lIGluIHJlc3VsdHM6IHByaW50IHJlcHIobGluZSkKKyAgICAgICAgLi4uCisgICAgICAgICctIFx0YWJjRGVmZ2hpSmtsXG4nCisgICAgICAgICc/IFx0IF4gXiAgXlxuJworICAgICAgICAnKyBcdGFiY2RlZkdoaWprbFxuJworICAgICAgICAnPyBcdCBeIF4gIF5cbicKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBDYW4gaHVydCwgYnV0IHdpbGwgcHJvYmFibHkgaGVscCBtb3N0IG9mIHRoZSB0aW1lLgorICAgICAgICBjb21tb24gPSBtaW4oX2NvdW50X2xlYWRpbmcoYWxpbmUsICJcdCIpLAorICAgICAgICAgICAgICAgICAgICAgX2NvdW50X2xlYWRpbmcoYmxpbmUsICJcdCIpKQorICAgICAgICBjb21tb24gPSBtaW4oY29tbW9uLCBfY291bnRfbGVhZGluZyhhdGFnc1s6Y29tbW9uXSwgIiAiKSkKKyAgICAgICAgY29tbW9uID0gbWluKGNvbW1vbiwgX2NvdW50X2xlYWRpbmcoYnRhZ3NbOmNvbW1vbl0sICIgIikpCisgICAgICAgIGF0YWdzID0gYXRhZ3NbY29tbW9uOl0ucnN0cmlwKCkKKyAgICAgICAgYnRhZ3MgPSBidGFnc1tjb21tb246XS5yc3RyaXAoKQorCisgICAgICAgIHlpZWxkICItICIgKyBhbGluZQorICAgICAgICBpZiBhdGFnczoKKyAgICAgICAgICAgIHlpZWxkICI/ICVzJXNcbiIgJSAoIlx0IiAqIGNvbW1vbiwgYXRhZ3MpCisKKyAgICAgICAgeWllbGQgIisgIiArIGJsaW5lCisgICAgICAgIGlmIGJ0YWdzOgorICAgICAgICAgICAgeWllbGQgIj8gJXMlc1xuIiAlICgiXHQiICogY29tbW9uLCBidGFncykKKworIyBXaXRoIHJlc3BlY3QgdG8ganVuaywgYW4gZWFybGllciB2ZXJzaW9uIG9mIG5kaWZmIHNpbXBseSByZWZ1c2VkIHRvCisjICpzdGFydCogYSBtYXRjaCB3aXRoIGEganVuayBlbGVtZW50LiAgVGhlIHJlc3VsdCB3YXMgY2FzZXMgbGlrZSB0aGlzOgorIyAgICAgYmVmb3JlOiBwcml2YXRlIFRocmVhZCBjdXJyZW50VGhyZWFkOworIyAgICAgYWZ0ZXI6ICBwcml2YXRlIHZvbGF0aWxlIFRocmVhZCBjdXJyZW50VGhyZWFkOworIyBJZiB5b3UgY29uc2lkZXIgd2hpdGVzcGFjZSB0byBiZSBqdW5rLCB0aGUgbG9uZ2VzdCBjb250aWd1b3VzIG1hdGNoCisjIG5vdCBzdGFydGluZyB3aXRoIGp1bmsgaXMgImUgVGhyZWFkIGN1cnJlbnRUaHJlYWQiLiAgU28gbmRpZmYgcmVwb3J0ZWQKKyMgdGhhdCAiZSB2b2xhdGlsIiB3YXMgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgJ3QnIGFuZCB0aGUgJ2UnIGluICJwcml2YXRlIi4KKyMgV2hpbGUgYW4gYWNjdXJhdGUgdmlldywgdG8gcGVvcGxlIHRoYXQncyBhYnN1cmQuICBUaGUgY3VycmVudCB2ZXJzaW9uCisjIGxvb2tzIGZvciBtYXRjaGluZyBibG9ja3MgdGhhdCBhcmUgZW50aXJlbHkganVuay1mcmVlLCB0aGVuIGV4dGVuZHMgdGhlCisjIGxvbmdlc3Qgb25lIG9mIHRob3NlIGFzIGZhciBhcyBwb3NzaWJsZSBidXQgb25seSB3aXRoIG1hdGNoaW5nIGp1bmsuCisjIFNvIG5vdyAiY3VycmVudFRocmVhZCIgaXMgbWF0Y2hlZCwgdGhlbiBleHRlbmRlZCB0byBzdWNrIHVwIHRoZQorIyBwcmVjZWRpbmcgYmxhbms7IHRoZW4gInByaXZhdGUiIGlzIG1hdGNoZWQsIGFuZCBleHRlbmRlZCB0byBzdWNrIHVwIHRoZQorIyBmb2xsb3dpbmcgYmxhbms7IHRoZW4gIlRocmVhZCIgaXMgbWF0Y2hlZDsgYW5kIGZpbmFsbHkgbmRpZmYgcmVwb3J0cworIyB0aGF0ICJ2b2xhdGlsZSAiIHdhcyBpbnNlcnRlZCBiZWZvcmUgIlRocmVhZCIuICBUaGUgb25seSBxdWliYmxlCisjIHJlbWFpbmluZyBpcyB0aGF0IHBlcmhhcHMgaXQgd2FzIHJlYWxseSB0aGUgY2FzZSB0aGF0ICIgdm9sYXRpbGUiCisjIHdhcyBpbnNlcnRlZCBhZnRlciAicHJpdmF0ZSIuICBJIGNhbiBsaXZlIHdpdGggdGhhdCA8d2luaz4uCisKK2ltcG9ydCByZQorCitkZWYgSVNfTElORV9KVU5LKGxpbmUsIHBhdD1yZS5jb21waWxlKHIiXHMqIz9ccyokIikubWF0Y2gpOgorICAgIHIiIiIKKyAgICBSZXR1cm4gMSBmb3IgaWdub3JhYmxlIGxpbmU6IGlmZiBgbGluZWAgaXMgYmxhbmsgb3IgY29udGFpbnMgYSBzaW5nbGUgJyMnLgorCisgICAgRXhhbXBsZXM6CisKKyAgICA+Pj4gSVNfTElORV9KVU5LKCdcbicpCisgICAgVHJ1ZQorICAgID4+PiBJU19MSU5FX0pVTksoJyAgIyAgIFxuJykKKyAgICBUcnVlCisgICAgPj4+IElTX0xJTkVfSlVOSygnaGVsbG9cbicpCisgICAgRmFsc2UKKyAgICAiIiIKKworICAgIHJldHVybiBwYXQobGluZSkgaXMgbm90IE5vbmUKKworZGVmIElTX0NIQVJBQ1RFUl9KVU5LKGNoLCB3cz0iIFx0Iik6CisgICAgciIiIgorICAgIFJldHVybiAxIGZvciBpZ25vcmFibGUgY2hhcmFjdGVyOiBpZmYgYGNoYCBpcyBhIHNwYWNlIG9yIHRhYi4KKworICAgIEV4YW1wbGVzOgorCisgICAgPj4+IElTX0NIQVJBQ1RFUl9KVU5LKCcgJykKKyAgICBUcnVlCisgICAgPj4+IElTX0NIQVJBQ1RFUl9KVU5LKCdcdCcpCisgICAgVHJ1ZQorICAgID4+PiBJU19DSEFSQUNURVJfSlVOSygnXG4nKQorICAgIEZhbHNlCisgICAgPj4+IElTX0NIQVJBQ1RFUl9KVU5LKCd4JykKKyAgICBGYWxzZQorICAgICIiIgorCisgICAgcmV0dXJuIGNoIGluIHdzCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgIFVuaWZpZWQgRGlmZgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBfZm9ybWF0X3JhbmdlX3VuaWZpZWQoc3RhcnQsIHN0b3ApOgorICAgICdDb252ZXJ0IHJhbmdlIHRvIHRoZSAiZWQiIGZvcm1hdCcKKyAgICAjIFBlciB0aGUgZGlmZiBzcGVjIGF0IGh0dHA6Ly93d3cudW5peC5vcmcvc2luZ2xlX3VuaXhfc3BlY2lmaWNhdGlvbi8KKyAgICBiZWdpbm5pbmcgPSBzdGFydCArIDEgICAgICMgbGluZXMgc3RhcnQgbnVtYmVyaW5nIHdpdGggb25lCisgICAgbGVuZ3RoID0gc3RvcCAtIHN0YXJ0CisgICAgaWYgbGVuZ3RoID09IDE6CisgICAgICAgIHJldHVybiAne30nLmZvcm1hdChiZWdpbm5pbmcpCisgICAgaWYgbm90IGxlbmd0aDoKKyAgICAgICAgYmVnaW5uaW5nIC09IDEgICAgICAgICMgZW1wdHkgcmFuZ2VzIGJlZ2luIGF0IGxpbmUganVzdCBiZWZvcmUgdGhlIHJhbmdlCisgICAgcmV0dXJuICd7fSx7fScuZm9ybWF0KGJlZ2lubmluZywgbGVuZ3RoKQorCitkZWYgdW5pZmllZF9kaWZmKGEsIGIsIGZyb21maWxlPScnLCB0b2ZpbGU9JycsIGZyb21maWxlZGF0ZT0nJywKKyAgICAgICAgICAgICAgICAgdG9maWxlZGF0ZT0nJywgbj0zLCBsaW5ldGVybT0nXG4nKToKKyAgICByIiIiCisgICAgQ29tcGFyZSB0d28gc2VxdWVuY2VzIG9mIGxpbmVzOyBnZW5lcmF0ZSB0aGUgZGVsdGEgYXMgYSB1bmlmaWVkIGRpZmYuCisKKyAgICBVbmlmaWVkIGRpZmZzIGFyZSBhIGNvbXBhY3Qgd2F5IG9mIHNob3dpbmcgbGluZSBjaGFuZ2VzIGFuZCBhIGZldworICAgIGxpbmVzIG9mIGNvbnRleHQuICBUaGUgbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgaXMgc2V0IGJ5ICduJyB3aGljaAorICAgIGRlZmF1bHRzIHRvIHRocmVlLgorCisgICAgQnkgZGVmYXVsdCwgdGhlIGRpZmYgY29udHJvbCBsaW5lcyAodGhvc2Ugd2l0aCAtLS0sICsrKywgb3IgQEApIGFyZQorICAgIGNyZWF0ZWQgd2l0aCBhIHRyYWlsaW5nIG5ld2xpbmUuICBUaGlzIGlzIGhlbHBmdWwgc28gdGhhdCBpbnB1dHMKKyAgICBjcmVhdGVkIGZyb20gZmlsZS5yZWFkbGluZXMoKSByZXN1bHQgaW4gZGlmZnMgdGhhdCBhcmUgc3VpdGFibGUgZm9yCisgICAgZmlsZS53cml0ZWxpbmVzKCkgc2luY2UgYm90aCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIGhhdmUgdHJhaWxpbmcKKyAgICBuZXdsaW5lcy4KKworICAgIEZvciBpbnB1dHMgdGhhdCBkbyBub3QgaGF2ZSB0cmFpbGluZyBuZXdsaW5lcywgc2V0IHRoZSBsaW5ldGVybQorICAgIGFyZ3VtZW50IHRvICIiIHNvIHRoYXQgdGhlIG91dHB1dCB3aWxsIGJlIHVuaWZvcm1seSBuZXdsaW5lIGZyZWUuCisKKyAgICBUaGUgdW5pZGlmZiBmb3JtYXQgbm9ybWFsbHkgaGFzIGEgaGVhZGVyIGZvciBmaWxlbmFtZXMgYW5kIG1vZGlmaWNhdGlvbgorICAgIHRpbWVzLiAgQW55IG9yIGFsbCBvZiB0aGVzZSBtYXkgYmUgc3BlY2lmaWVkIHVzaW5nIHN0cmluZ3MgZm9yCisgICAgJ2Zyb21maWxlJywgJ3RvZmlsZScsICdmcm9tZmlsZWRhdGUnLCBhbmQgJ3RvZmlsZWRhdGUnLgorICAgIFRoZSBtb2RpZmljYXRpb24gdGltZXMgYXJlIG5vcm1hbGx5IGV4cHJlc3NlZCBpbiB0aGUgSVNPIDg2MDEgZm9ybWF0LgorCisgICAgRXhhbXBsZToKKworICAgID4+PiBmb3IgbGluZSBpbiB1bmlmaWVkX2RpZmYoJ29uZSB0d28gdGhyZWUgZm91cicuc3BsaXQoKSwKKyAgICAuLi4gICAgICAgICAgICAgJ3plcm8gb25lIHRyZWUgZm91cicuc3BsaXQoKSwgJ09yaWdpbmFsJywgJ0N1cnJlbnQnLAorICAgIC4uLiAgICAgICAgICAgICAnMjAwNS0wMS0yNiAyMzozMDo1MCcsICcyMDEwLTA0LTAyIDEwOjIwOjUyJywKKyAgICAuLi4gICAgICAgICAgICAgbGluZXRlcm09JycpOgorICAgIC4uLiAgICAgcHJpbnQgbGluZSAgICAgICAgICAgICAgICAgICMgZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgLS0tIE9yaWdpbmFsICAgICAgICAyMDA1LTAxLTI2IDIzOjMwOjUwCisgICAgKysrIEN1cnJlbnQgICAgICAgICAyMDEwLTA0LTAyIDEwOjIwOjUyCisgICAgQEAgLTEsNCArMSw0IEBACisgICAgK3plcm8KKyAgICAgb25lCisgICAgLXR3bworICAgIC10aHJlZQorICAgICt0cmVlCisgICAgIGZvdXIKKyAgICAiIiIKKworICAgIHN0YXJ0ZWQgPSBGYWxzZQorICAgIGZvciBncm91cCBpbiBTZXF1ZW5jZU1hdGNoZXIoTm9uZSxhLGIpLmdldF9ncm91cGVkX29wY29kZXMobik6CisgICAgICAgIGlmIG5vdCBzdGFydGVkOgorICAgICAgICAgICAgc3RhcnRlZCA9IFRydWUKKyAgICAgICAgICAgIGZyb21kYXRlID0gJ1x0e30nLmZvcm1hdChmcm9tZmlsZWRhdGUpIGlmIGZyb21maWxlZGF0ZSBlbHNlICcnCisgICAgICAgICAgICB0b2RhdGUgPSAnXHR7fScuZm9ybWF0KHRvZmlsZWRhdGUpIGlmIHRvZmlsZWRhdGUgZWxzZSAnJworICAgICAgICAgICAgeWllbGQgJy0tLSB7fXt9e30nLmZvcm1hdChmcm9tZmlsZSwgZnJvbWRhdGUsIGxpbmV0ZXJtKQorICAgICAgICAgICAgeWllbGQgJysrKyB7fXt9e30nLmZvcm1hdCh0b2ZpbGUsIHRvZGF0ZSwgbGluZXRlcm0pCisKKyAgICAgICAgZmlyc3QsIGxhc3QgPSBncm91cFswXSwgZ3JvdXBbLTFdCisgICAgICAgIGZpbGUxX3JhbmdlID0gX2Zvcm1hdF9yYW5nZV91bmlmaWVkKGZpcnN0WzFdLCBsYXN0WzJdKQorICAgICAgICBmaWxlMl9yYW5nZSA9IF9mb3JtYXRfcmFuZ2VfdW5pZmllZChmaXJzdFszXSwgbGFzdFs0XSkKKyAgICAgICAgeWllbGQgJ0BAIC17fSAre30gQEB7fScuZm9ybWF0KGZpbGUxX3JhbmdlLCBmaWxlMl9yYW5nZSwgbGluZXRlcm0pCisKKyAgICAgICAgZm9yIHRhZywgaTEsIGkyLCBqMSwgajIgaW4gZ3JvdXA6CisgICAgICAgICAgICBpZiB0YWcgPT0gJ2VxdWFsJzoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBhW2kxOmkyXToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgJyAnICsgbGluZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiB0YWcgaW4gKCdyZXBsYWNlJywgJ2RlbGV0ZScpOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGFbaTE6aTJdOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAnLScgKyBsaW5lCisgICAgICAgICAgICBpZiB0YWcgaW4gKCdyZXBsYWNlJywgJ2luc2VydCcpOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGJbajE6ajJdOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAnKycgKyBsaW5lCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgIENvbnRleHQgRGlmZgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBfZm9ybWF0X3JhbmdlX2NvbnRleHQoc3RhcnQsIHN0b3ApOgorICAgICdDb252ZXJ0IHJhbmdlIHRvIHRoZSAiZWQiIGZvcm1hdCcKKyAgICAjIFBlciB0aGUgZGlmZiBzcGVjIGF0IGh0dHA6Ly93d3cudW5peC5vcmcvc2luZ2xlX3VuaXhfc3BlY2lmaWNhdGlvbi8KKyAgICBiZWdpbm5pbmcgPSBzdGFydCArIDEgICAgICMgbGluZXMgc3RhcnQgbnVtYmVyaW5nIHdpdGggb25lCisgICAgbGVuZ3RoID0gc3RvcCAtIHN0YXJ0CisgICAgaWYgbm90IGxlbmd0aDoKKyAgICAgICAgYmVnaW5uaW5nIC09IDEgICAgICAgICMgZW1wdHkgcmFuZ2VzIGJlZ2luIGF0IGxpbmUganVzdCBiZWZvcmUgdGhlIHJhbmdlCisgICAgaWYgbGVuZ3RoIDw9IDE6CisgICAgICAgIHJldHVybiAne30nLmZvcm1hdChiZWdpbm5pbmcpCisgICAgcmV0dXJuICd7fSx7fScuZm9ybWF0KGJlZ2lubmluZywgYmVnaW5uaW5nICsgbGVuZ3RoIC0gMSkKKworIyBTZWUgaHR0cDovL3d3dy51bml4Lm9yZy9zaW5nbGVfdW5peF9zcGVjaWZpY2F0aW9uLworZGVmIGNvbnRleHRfZGlmZihhLCBiLCBmcm9tZmlsZT0nJywgdG9maWxlPScnLAorICAgICAgICAgICAgICAgICBmcm9tZmlsZWRhdGU9JycsIHRvZmlsZWRhdGU9JycsIG49MywgbGluZXRlcm09J1xuJyk6CisgICAgciIiIgorICAgIENvbXBhcmUgdHdvIHNlcXVlbmNlcyBvZiBsaW5lczsgZ2VuZXJhdGUgdGhlIGRlbHRhIGFzIGEgY29udGV4dCBkaWZmLgorCisgICAgQ29udGV4dCBkaWZmcyBhcmUgYSBjb21wYWN0IHdheSBvZiBzaG93aW5nIGxpbmUgY2hhbmdlcyBhbmQgYSBmZXcKKyAgICBsaW5lcyBvZiBjb250ZXh0LiAgVGhlIG51bWJlciBvZiBjb250ZXh0IGxpbmVzIGlzIHNldCBieSAnbicgd2hpY2gKKyAgICBkZWZhdWx0cyB0byB0aHJlZS4KKworICAgIEJ5IGRlZmF1bHQsIHRoZSBkaWZmIGNvbnRyb2wgbGluZXMgKHRob3NlIHdpdGggKioqIG9yIC0tLSkgYXJlCisgICAgY3JlYXRlZCB3aXRoIGEgdHJhaWxpbmcgbmV3bGluZS4gIFRoaXMgaXMgaGVscGZ1bCBzbyB0aGF0IGlucHV0cworICAgIGNyZWF0ZWQgZnJvbSBmaWxlLnJlYWRsaW5lcygpIHJlc3VsdCBpbiBkaWZmcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IKKyAgICBmaWxlLndyaXRlbGluZXMoKSBzaW5jZSBib3RoIHRoZSBpbnB1dHMgYW5kIG91dHB1dHMgaGF2ZSB0cmFpbGluZworICAgIG5ld2xpbmVzLgorCisgICAgRm9yIGlucHV0cyB0aGF0IGRvIG5vdCBoYXZlIHRyYWlsaW5nIG5ld2xpbmVzLCBzZXQgdGhlIGxpbmV0ZXJtCisgICAgYXJndW1lbnQgdG8gIiIgc28gdGhhdCB0aGUgb3V0cHV0IHdpbGwgYmUgdW5pZm9ybWx5IG5ld2xpbmUgZnJlZS4KKworICAgIFRoZSBjb250ZXh0IGRpZmYgZm9ybWF0IG5vcm1hbGx5IGhhcyBhIGhlYWRlciBmb3IgZmlsZW5hbWVzIGFuZAorICAgIG1vZGlmaWNhdGlvbiB0aW1lcy4gIEFueSBvciBhbGwgb2YgdGhlc2UgbWF5IGJlIHNwZWNpZmllZCB1c2luZworICAgIHN0cmluZ3MgZm9yICdmcm9tZmlsZScsICd0b2ZpbGUnLCAnZnJvbWZpbGVkYXRlJywgYW5kICd0b2ZpbGVkYXRlJy4KKyAgICBUaGUgbW9kaWZpY2F0aW9uIHRpbWVzIGFyZSBub3JtYWxseSBleHByZXNzZWQgaW4gdGhlIElTTyA4NjAxIGZvcm1hdC4KKyAgICBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgc3RyaW5ncyBkZWZhdWx0IHRvIGJsYW5rcy4KKworICAgIEV4YW1wbGU6CisKKyAgICA+Pj4gcHJpbnQgJycuam9pbihjb250ZXh0X2RpZmYoJ29uZVxudHdvXG50aHJlZVxuZm91clxuJy5zcGxpdGxpbmVzKDEpLAorICAgIC4uLiAgICAgICAnemVyb1xub25lXG50cmVlXG5mb3VyXG4nLnNwbGl0bGluZXMoMSksICdPcmlnaW5hbCcsICdDdXJyZW50JykpLAorICAgICoqKiBPcmlnaW5hbAorICAgIC0tLSBDdXJyZW50CisgICAgKioqKioqKioqKioqKioqCisgICAgKioqIDEsNCAqKioqCisgICAgICBvbmUKKyAgICAhIHR3bworICAgICEgdGhyZWUKKyAgICAgIGZvdXIKKyAgICAtLS0gMSw0IC0tLS0KKyAgICArIHplcm8KKyAgICAgIG9uZQorICAgICEgdHJlZQorICAgICAgZm91cgorICAgICIiIgorCisgICAgcHJlZml4ID0gZGljdChpbnNlcnQ9JysgJywgZGVsZXRlPSctICcsIHJlcGxhY2U9JyEgJywgZXF1YWw9JyAgJykKKyAgICBzdGFydGVkID0gRmFsc2UKKyAgICBmb3IgZ3JvdXAgaW4gU2VxdWVuY2VNYXRjaGVyKE5vbmUsYSxiKS5nZXRfZ3JvdXBlZF9vcGNvZGVzKG4pOgorICAgICAgICBpZiBub3Qgc3RhcnRlZDoKKyAgICAgICAgICAgIHN0YXJ0ZWQgPSBUcnVlCisgICAgICAgICAgICBmcm9tZGF0ZSA9ICdcdHt9Jy5mb3JtYXQoZnJvbWZpbGVkYXRlKSBpZiBmcm9tZmlsZWRhdGUgZWxzZSAnJworICAgICAgICAgICAgdG9kYXRlID0gJ1x0e30nLmZvcm1hdCh0b2ZpbGVkYXRlKSBpZiB0b2ZpbGVkYXRlIGVsc2UgJycKKyAgICAgICAgICAgIHlpZWxkICcqKioge317fXt9Jy5mb3JtYXQoZnJvbWZpbGUsIGZyb21kYXRlLCBsaW5ldGVybSkKKyAgICAgICAgICAgIHlpZWxkICctLS0ge317fXt9Jy5mb3JtYXQodG9maWxlLCB0b2RhdGUsIGxpbmV0ZXJtKQorCisgICAgICAgIGZpcnN0LCBsYXN0ID0gZ3JvdXBbMF0sIGdyb3VwWy0xXQorICAgICAgICB5aWVsZCAnKioqKioqKioqKioqKioqJyArIGxpbmV0ZXJtCisKKyAgICAgICAgZmlsZTFfcmFuZ2UgPSBfZm9ybWF0X3JhbmdlX2NvbnRleHQoZmlyc3RbMV0sIGxhc3RbMl0pCisgICAgICAgIHlpZWxkICcqKioge30gKioqKnt9Jy5mb3JtYXQoZmlsZTFfcmFuZ2UsIGxpbmV0ZXJtKQorCisgICAgICAgIGlmIGFueSh0YWcgaW4gKCdyZXBsYWNlJywgJ2RlbGV0ZScpIGZvciB0YWcsIF8sIF8sIF8sIF8gaW4gZ3JvdXApOgorICAgICAgICAgICAgZm9yIHRhZywgaTEsIGkyLCBfLCBfIGluIGdyb3VwOgorICAgICAgICAgICAgICAgIGlmIHRhZyAhPSAnaW5zZXJ0JzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gYVtpMTppMl06CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBwcmVmaXhbdGFnXSArIGxpbmUKKworICAgICAgICBmaWxlMl9yYW5nZSA9IF9mb3JtYXRfcmFuZ2VfY29udGV4dChmaXJzdFszXSwgbGFzdFs0XSkKKyAgICAgICAgeWllbGQgJy0tLSB7fSAtLS0te30nLmZvcm1hdChmaWxlMl9yYW5nZSwgbGluZXRlcm0pCisKKyAgICAgICAgaWYgYW55KHRhZyBpbiAoJ3JlcGxhY2UnLCAnaW5zZXJ0JykgZm9yIHRhZywgXywgXywgXywgXyBpbiBncm91cCk6CisgICAgICAgICAgICBmb3IgdGFnLCBfLCBfLCBqMSwgajIgaW4gZ3JvdXA6CisgICAgICAgICAgICAgICAgaWYgdGFnICE9ICdkZWxldGUnOgorICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBiW2oxOmoyXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHByZWZpeFt0YWddICsgbGluZQorCitkZWYgbmRpZmYoYSwgYiwgbGluZWp1bms9Tm9uZSwgY2hhcmp1bms9SVNfQ0hBUkFDVEVSX0pVTkspOgorICAgIHIiIiIKKyAgICBDb21wYXJlIGBhYCBhbmQgYGJgIChsaXN0cyBvZiBzdHJpbmdzKTsgcmV0dXJuIGEgYERpZmZlcmAtc3R5bGUgZGVsdGEuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMgYGxpbmVqdW5rYCBhbmQgYGNoYXJqdW5rYCBhcmUgZm9yIGZpbHRlcgorICAgIGZ1bmN0aW9ucyAob3IgTm9uZSk6CisKKyAgICAtIGxpbmVqdW5rOiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGFjY2VwdCBhIHNpbmdsZSBzdHJpbmcgYXJndW1lbnQsIGFuZAorICAgICAgcmV0dXJuIHRydWUgaWZmIHRoZSBzdHJpbmcgaXMganVuay4gIFRoZSBkZWZhdWx0IGlzIE5vbmUsIGFuZCBpcworICAgICAgcmVjb21tZW5kZWQ7IGFzIG9mIFB5dGhvbiAyLjMsIGFuIGFkYXB0aXZlIG5vdGlvbiBvZiAibm9pc2UiIGxpbmVzIGlzCisgICAgICB1c2VkIHRoYXQgZG9lcyBhIGdvb2Qgam9iIG9uIGl0cyBvd24uCisKKyAgICAtIGNoYXJqdW5rOiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGFjY2VwdCBhIHN0cmluZyBvZiBsZW5ndGggMS4gVGhlCisgICAgICBkZWZhdWx0IGlzIG1vZHVsZS1sZXZlbCBmdW5jdGlvbiBJU19DSEFSQUNURVJfSlVOSywgd2hpY2ggZmlsdGVycyBvdXQKKyAgICAgIHdoaXRlc3BhY2UgY2hhcmFjdGVycyAoYSBibGFuayBvciB0YWI7IG5vdGU6IGJhZCBpZGVhIHRvIGluY2x1ZGUgbmV3bGluZQorICAgICAgaW4gdGhpcyEpLgorCisgICAgVG9vbHMvc2NyaXB0cy9uZGlmZi5weSBpcyBhIGNvbW1hbmQtbGluZSBmcm9udC1lbmQgdG8gdGhpcyBmdW5jdGlvbi4KKworICAgIEV4YW1wbGU6CisKKyAgICA+Pj4gZGlmZiA9IG5kaWZmKCdvbmVcbnR3b1xudGhyZWVcbicuc3BsaXRsaW5lcygxKSwKKyAgICAuLi4gICAgICAgICAgICAgICdvcmVcbnRyZWVcbmVtdVxuJy5zcGxpdGxpbmVzKDEpKQorICAgID4+PiBwcmludCAnJy5qb2luKGRpZmYpLAorICAgIC0gb25lCisgICAgPyAgXgorICAgICsgb3JlCisgICAgPyAgXgorICAgIC0gdHdvCisgICAgLSB0aHJlZQorICAgID8gIC0KKyAgICArIHRyZWUKKyAgICArIGVtdQorICAgICIiIgorICAgIHJldHVybiBEaWZmZXIobGluZWp1bmssIGNoYXJqdW5rKS5jb21wYXJlKGEsIGIpCisKK2RlZiBfbWRpZmYoZnJvbWxpbmVzLCB0b2xpbmVzLCBjb250ZXh0PU5vbmUsIGxpbmVqdW5rPU5vbmUsCisgICAgICAgICAgIGNoYXJqdW5rPUlTX0NIQVJBQ1RFUl9KVU5LKToKKyAgICByIiIiUmV0dXJucyBnZW5lcmF0b3IgeWllbGRpbmcgbWFya2VkIHVwIGZyb20vdG8gc2lkZSBieSBzaWRlIGRpZmZlcmVuY2VzLgorCisgICAgQXJndW1lbnRzOgorICAgIGZyb21saW5lcyAtLSBsaXN0IG9mIHRleHQgbGluZXMgdG8gY29tcGFyZWQgdG8gdG9saW5lcworICAgIHRvbGluZXMgLS0gbGlzdCBvZiB0ZXh0IGxpbmVzIHRvIGJlIGNvbXBhcmVkIHRvIGZyb21saW5lcworICAgIGNvbnRleHQgLS0gbnVtYmVyIG9mIGNvbnRleHQgbGluZXMgdG8gZGlzcGxheSBvbiBlYWNoIHNpZGUgb2YgZGlmZmVyZW5jZSwKKyAgICAgICAgICAgICAgIGlmIE5vbmUsIGFsbCBmcm9tL3RvIHRleHQgbGluZXMgd2lsbCBiZSBnZW5lcmF0ZWQuCisgICAgbGluZWp1bmsgLS0gcGFzc2VkIG9uIHRvIG5kaWZmIChzZWUgbmRpZmYgZG9jdW1lbnRhdGlvbikKKyAgICBjaGFyanVuayAtLSBwYXNzZWQgb24gdG8gbmRpZmYgKHNlZSBuZGlmZiBkb2N1bWVudGF0aW9uKQorCisgICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGFuIGludGVyYXRvciB3aGljaCByZXR1cm5zIGEgdHVwbGU6CisgICAgKGZyb20gbGluZSB0dXBsZSwgdG8gbGluZSB0dXBsZSwgYm9vbGVhbiBmbGFnKQorCisgICAgZnJvbS90byBsaW5lIHR1cGxlIC0tIChsaW5lIG51bSwgbGluZSB0ZXh0KQorICAgICAgICBsaW5lIG51bSAtLSBpbnRlZ2VyIG9yIE5vbmUgKHRvIGluZGljYXRlIGEgY29udGV4dCBzZXBhcmF0aW9uKQorICAgICAgICBsaW5lIHRleHQgLS0gb3JpZ2luYWwgbGluZSB0ZXh0IHdpdGggZm9sbG93aW5nIG1hcmtlcnMgaW5zZXJ0ZWQ6CisgICAgICAgICAgICAnXDArJyAtLSBtYXJrcyBzdGFydCBvZiBhZGRlZCB0ZXh0CisgICAgICAgICAgICAnXDAtJyAtLSBtYXJrcyBzdGFydCBvZiBkZWxldGVkIHRleHQKKyAgICAgICAgICAgICdcMF4nIC0tIG1hcmtzIHN0YXJ0IG9mIGNoYW5nZWQgdGV4dAorICAgICAgICAgICAgJ1wxJyAtLSBtYXJrcyBlbmQgb2YgYWRkZWQvZGVsZXRlZC9jaGFuZ2VkIHRleHQKKworICAgIGJvb2xlYW4gZmxhZyAtLSBOb25lIGluZGljYXRlcyBjb250ZXh0IHNlcGFyYXRpb24sIFRydWUgaW5kaWNhdGVzCisgICAgICAgIGVpdGhlciAiZnJvbSIgb3IgInRvIiBsaW5lIGNvbnRhaW5zIGEgY2hhbmdlLCBvdGhlcndpc2UgRmFsc2UuCisKKyAgICBUaGlzIGZ1bmN0aW9uL2l0ZXJhdG9yIHdhcyBvcmlnaW5hbGx5IGRldmVsb3BlZCB0byBnZW5lcmF0ZSBzaWRlIGJ5IHNpZGUKKyAgICBmaWxlIGRpZmZlcmVuY2UgZm9yIG1ha2luZyBIVE1MIHBhZ2VzIChzZWUgSHRtbERpZmYgY2xhc3MgZm9yIGV4YW1wbGUKKyAgICB1c2FnZSkuCisKKyAgICBOb3RlLCB0aGlzIGZ1bmN0aW9uIHV0aWxpemVzIHRoZSBuZGlmZiBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgc2lkZSBieQorICAgIHNpZGUgZGlmZmVyZW5jZSBtYXJrdXAuICBPcHRpb25hbCBuZGlmZiBhcmd1bWVudHMgbWF5IGJlIHBhc3NlZCB0byB0aGlzCisgICAgZnVuY3Rpb24gYW5kIHRoZXkgaW4gdHVybiB3aWxsIGJlIHBhc3NlZCB0byBuZGlmZi4KKyAgICAiIiIKKyAgICBpbXBvcnQgcmUKKworICAgICMgcmVndWxhciBleHByZXNzaW9uIGZvciBmaW5kaW5nIGludHJhbGluZSBjaGFuZ2UgaW5kaWNlcworICAgIGNoYW5nZV9yZSA9IHJlLmNvbXBpbGUoJyhcKyt8XC0rfFxeKyknKQorCisgICAgIyBjcmVhdGUgdGhlIGRpZmZlcmVuY2UgaXRlcmF0b3IgdG8gZ2VuZXJhdGUgdGhlIGRpZmZlcmVuY2VzCisgICAgZGlmZl9saW5lc19pdGVyYXRvciA9IG5kaWZmKGZyb21saW5lcyx0b2xpbmVzLGxpbmVqdW5rLGNoYXJqdW5rKQorCisgICAgZGVmIF9tYWtlX2xpbmUobGluZXMsIGZvcm1hdF9rZXksIHNpZGUsIG51bV9saW5lcz1bMCwwXSk6CisgICAgICAgICIiIlJldHVybnMgbGluZSBvZiB0ZXh0IHdpdGggdXNlcidzIGNoYW5nZSBtYXJrdXAgYW5kIGxpbmUgZm9ybWF0dGluZy4KKworICAgICAgICBsaW5lcyAtLSBsaXN0IG9mIGxpbmVzIGZyb20gdGhlIG5kaWZmIGdlbmVyYXRvciB0byBwcm9kdWNlIGEgbGluZSBvZgorICAgICAgICAgICAgICAgICB0ZXh0IGZyb20uICBXaGVuIHByb2R1Y2luZyB0aGUgbGluZSBvZiB0ZXh0IHRvIHJldHVybiwgdGhlCisgICAgICAgICAgICAgICAgIGxpbmVzIHVzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGlzIGxpc3QuCisgICAgICAgIGZvcm1hdF9rZXkgLS0gJysnIHJldHVybiBmaXJzdCBsaW5lIGluIGxpc3Qgd2l0aCAiYWRkIiBtYXJrdXAgYXJvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpcmUgbGluZS4KKyAgICAgICAgICAgICAgICAgICAgICAnLScgcmV0dXJuIGZpcnN0IGxpbmUgaW4gbGlzdCB3aXRoICJkZWxldGUiIG1hcmt1cCBhcm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudGlyZSBsaW5lLgorICAgICAgICAgICAgICAgICAgICAgICc/JyByZXR1cm4gZmlyc3QgbGluZSBpbiBsaXN0IHdpdGggYWRkL2RlbGV0ZS9jaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cmFsaW5lIG1hcmt1cCAoaW5kaWNlcyBvYnRhaW5lZCBmcm9tIHNlY29uZCBsaW5lKQorICAgICAgICAgICAgICAgICAgICAgIE5vbmUgcmV0dXJuIGZpcnN0IGxpbmUgaW4gbGlzdCB3aXRoIG5vIG1hcmt1cAorICAgICAgICBzaWRlIC0tIGluZGljZSBpbnRvIHRoZSBudW1fbGluZXMgbGlzdCAoMD1mcm9tLDE9dG8pCisgICAgICAgIG51bV9saW5lcyAtLSBmcm9tL3RvIGN1cnJlbnQgbGluZSBudW1iZXIuICBUaGlzIGlzIE5PVCBpbnRlbmRlZCB0byBiZSBhCisgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgcGFyYW1ldGVyLiAgSXQgaXMgcHJlc2VudCBhcyBhIGtleXdvcmQgYXJndW1lbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgIG1haW50YWluIG1lbW9yeSBvZiB0aGUgY3VycmVudCBsaW5lIG51bWJlcnMgYmV0d2VlbiBjYWxscworICAgICAgICAgICAgICAgICAgICAgb2YgdGhpcyBmdW5jdGlvbi4KKworICAgICAgICBOb3RlLCB0aGlzIGZ1bmN0aW9uIGlzIHB1cnBvc2VmdWxseSBub3QgZGVmaW5lZCBhdCB0aGUgbW9kdWxlIHNjb3BlIHNvCisgICAgICAgIHRoYXQgZGF0YSBpdCBuZWVkcyBmcm9tIGl0cyBwYXJlbnQgZnVuY3Rpb24gKHdpdGhpbiB3aG9zZSBjb250ZXh0IGl0CisgICAgICAgIGlzIGRlZmluZWQpIGRvZXMgbm90IG5lZWQgdG8gYmUgb2YgbW9kdWxlIHNjb3BlLgorICAgICAgICAiIiIKKyAgICAgICAgbnVtX2xpbmVzW3NpZGVdICs9IDEKKyAgICAgICAgIyBIYW5kbGUgY2FzZSB3aGVyZSBubyB1c2VyIG1hcmt1cCBpcyB0byBiZSBhZGRlZCwganVzdCByZXR1cm4gbGluZSBvZgorICAgICAgICAjIHRleHQgd2l0aCB1c2VyJ3MgbGluZSBmb3JtYXQgdG8gYWxsb3cgZm9yIHVzYWdlIG9mIHRoZSBsaW5lIG51bWJlci4KKyAgICAgICAgaWYgZm9ybWF0X2tleSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIChudW1fbGluZXNbc2lkZV0sbGluZXMucG9wKDApWzI6XSkKKyAgICAgICAgIyBIYW5kbGUgY2FzZSBvZiBpbnRyYWxpbmUgY2hhbmdlcworICAgICAgICBpZiBmb3JtYXRfa2V5ID09ICc/JzoKKyAgICAgICAgICAgIHRleHQsIG1hcmtlcnMgPSBsaW5lcy5wb3AoMCksIGxpbmVzLnBvcCgwKQorICAgICAgICAgICAgIyBmaW5kIGludHJhbGluZSBjaGFuZ2VzIChzdG9yZSBjaGFuZ2UgdHlwZSBhbmQgaW5kaWNlcyBpbiB0dXBsZXMpCisgICAgICAgICAgICBzdWJfaW5mbyA9IFtdCisgICAgICAgICAgICBkZWYgcmVjb3JkX3N1Yl9pbmZvKG1hdGNoX29iamVjdCxzdWJfaW5mbz1zdWJfaW5mbyk6CisgICAgICAgICAgICAgICAgc3ViX2luZm8uYXBwZW5kKFttYXRjaF9vYmplY3QuZ3JvdXAoMSlbMF0sbWF0Y2hfb2JqZWN0LnNwYW4oKV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoX29iamVjdC5ncm91cCgxKQorICAgICAgICAgICAgY2hhbmdlX3JlLnN1YihyZWNvcmRfc3ViX2luZm8sbWFya2VycykKKyAgICAgICAgICAgICMgcHJvY2VzcyBlYWNoIHR1cGxlIGluc2VydGluZyBvdXIgc3BlY2lhbCBtYXJrcyB0aGF0IHdvbid0IGJlCisgICAgICAgICAgICAjIG5vdGljZWQgYnkgYW4geG1sL2h0bWwgZXNjYXBlci4KKyAgICAgICAgICAgIGZvciBrZXksKGJlZ2luLGVuZCkgaW4gc3ViX2luZm9bOjotMV06CisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRbMDpiZWdpbl0rJ1wwJytrZXkrdGV4dFtiZWdpbjplbmRdKydcMScrdGV4dFtlbmQ6XQorICAgICAgICAgICAgdGV4dCA9IHRleHRbMjpdCisgICAgICAgICMgSGFuZGxlIGNhc2Ugb2YgYWRkL2RlbGV0ZSBlbnRpcmUgbGluZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dCA9IGxpbmVzLnBvcCgwKVsyOl0KKyAgICAgICAgICAgICMgaWYgbGluZSBvZiB0ZXh0IGlzIGp1c3QgYSBuZXdsaW5lLCBpbnNlcnQgYSBzcGFjZSBzbyB0aGVyZSBpcworICAgICAgICAgICAgIyBzb21ldGhpbmcgZm9yIHRoZSB1c2VyIHRvIGhpZ2hsaWdodCBhbmQgc2VlLgorICAgICAgICAgICAgaWYgbm90IHRleHQ6CisgICAgICAgICAgICAgICAgdGV4dCA9ICcgJworICAgICAgICAgICAgIyBpbnNlcnQgbWFya3MgdGhhdCB3b24ndCBiZSBub3RpY2VkIGJ5IGFuIHhtbC9odG1sIGVzY2FwZXIuCisgICAgICAgICAgICB0ZXh0ID0gJ1wwJyArIGZvcm1hdF9rZXkgKyB0ZXh0ICsgJ1wxJworICAgICAgICAjIFJldHVybiBsaW5lIG9mIHRleHQsIGZpcnN0IGFsbG93IHVzZXIncyBsaW5lIGZvcm1hdHRlciB0byBkbyBpdHMKKyAgICAgICAgIyB0aGluZyAoc3VjaCBhcyBhZGRpbmcgdGhlIGxpbmUgbnVtYmVyKSB0aGVuIHJlcGxhY2UgdGhlIHNwZWNpYWwKKyAgICAgICAgIyBtYXJrcyB3aXRoIHdoYXQgdGhlIHVzZXIncyBjaGFuZ2UgbWFya3VwLgorICAgICAgICByZXR1cm4gKG51bV9saW5lc1tzaWRlXSx0ZXh0KQorCisgICAgZGVmIF9saW5lX2l0ZXJhdG9yKCk6CisgICAgICAgICIiIllpZWxkcyBmcm9tL3RvIGxpbmVzIG9mIHRleHQgd2l0aCBhIGNoYW5nZSBpbmRpY2F0aW9uLgorCisgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgYW4gaXRlcmF0b3IuICBJdCBpdHNlbGYgcHVsbHMgbGluZXMgZnJvbSBhCisgICAgICAgIGRpZmZlcmVuY2luZyBpdGVyYXRvciwgcHJvY2Vzc2VzIHRoZW0gYW5kIHlpZWxkcyB0aGVtLiAgV2hlbiBpdCBjYW4KKyAgICAgICAgaXQgeWllbGRzIGJvdGggYSAiZnJvbSIgYW5kIGEgInRvIiBsaW5lLCBvdGhlcndpc2UgaXQgd2lsbCB5aWVsZCBvbmUKKyAgICAgICAgb3IgdGhlIG90aGVyLiAgSW4gYWRkaXRpb24gdG8geWllbGRpbmcgdGhlIGxpbmVzIG9mIGZyb20vdG8gdGV4dCwgYQorICAgICAgICBib29sZWFuIGZsYWcgaXMgeWllbGRlZCB0byBpbmRpY2F0ZSBpZiB0aGUgdGV4dCBsaW5lKHMpIGhhdmUKKyAgICAgICAgZGlmZmVyZW5jZXMgaW4gdGhlbS4KKworICAgICAgICBOb3RlLCB0aGlzIGZ1bmN0aW9uIGlzIHB1cnBvc2VmdWxseSBub3QgZGVmaW5lZCBhdCB0aGUgbW9kdWxlIHNjb3BlIHNvCisgICAgICAgIHRoYXQgZGF0YSBpdCBuZWVkcyBmcm9tIGl0cyBwYXJlbnQgZnVuY3Rpb24gKHdpdGhpbiB3aG9zZSBjb250ZXh0IGl0CisgICAgICAgIGlzIGRlZmluZWQpIGRvZXMgbm90IG5lZWQgdG8gYmUgb2YgbW9kdWxlIHNjb3BlLgorICAgICAgICAiIiIKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBudW1fYmxhbmtzX3BlbmRpbmcsIG51bV9ibGFua3NfdG9feWllbGQgPSAwLCAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAjIExvYWQgdXAgbmV4dCA0IGxpbmVzIHNvIHdlIGNhbiBsb29rIGFoZWFkLCBjcmVhdGUgc3RyaW5ncyB3aGljaAorICAgICAgICAgICAgIyBhcmUgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgZWFjaCBvZiB0aGUgNCBsaW5lcworICAgICAgICAgICAgIyBzbyB3ZSBjYW4gZG8gc29tZSB2ZXJ5IHJlYWRhYmxlIGNvbXBhcmlzb25zLgorICAgICAgICAgICAgd2hpbGUgbGVuKGxpbmVzKSA8IDQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoZGlmZl9saW5lc19pdGVyYXRvci5uZXh0KCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnWCcpCisgICAgICAgICAgICBzID0gJycuam9pbihbbGluZVswXSBmb3IgbGluZSBpbiBsaW5lc10pCisgICAgICAgICAgICBpZiBzLnN0YXJ0c3dpdGgoJ1gnKToKKyAgICAgICAgICAgICAgICAjIFdoZW4gbm8gbW9yZSBsaW5lcywgcHVtcCBvdXQgYW55IHJlbWFpbmluZyBibGFuayBsaW5lcyBzbyB0aGUKKyAgICAgICAgICAgICAgICAjIGNvcnJlc3BvbmRpbmcgYWRkL2RlbGV0ZSBsaW5lcyBnZXQgYSBtYXRjaGluZyBibGFuayBsaW5lIHNvCisgICAgICAgICAgICAgICAgIyBhbGwgbGluZSBwYWlycyBnZXQgeWllbGRlZCBhdCB0aGUgbmV4dCBsZXZlbC4KKyAgICAgICAgICAgICAgICBudW1fYmxhbmtzX3RvX3lpZWxkID0gbnVtX2JsYW5rc19wZW5kaW5nCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnLT8rPycpOgorICAgICAgICAgICAgICAgICMgc2ltcGxlIGludHJhbGluZSBjaGFuZ2UKKyAgICAgICAgICAgICAgICB5aWVsZCBfbWFrZV9saW5lKGxpbmVzLCc/JywwKSwgX21ha2VfbGluZShsaW5lcywnPycsMSksIFRydWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJy0tKysnKToKKyAgICAgICAgICAgICAgICAjIGluIGRlbGV0ZSBibG9jaywgYWRkIGJsb2NrIGNvbWluZzogd2UgZG8gTk9UIHdhbnQgdG8gZ2V0CisgICAgICAgICAgICAgICAgIyBjYXVnaHQgdXAgb24gYmxhbmsgbGluZXMgeWV0LCBqdXN0IHByb2Nlc3MgdGhlIGRlbGV0ZSBsaW5lCisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc19wZW5kaW5nIC09IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBfbWFrZV9saW5lKGxpbmVzLCctJywwKSwgTm9uZSwgVHJ1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgoJy0tPysnLCAnLS0rJywgJy0gJykpOgorICAgICAgICAgICAgICAgICMgaW4gZGVsZXRlIGJsb2NrIGFuZCBzZWUgYSBpbnRyYWxpbmUgY2hhbmdlIG9yIHVuY2hhbmdlZCBsaW5lCisgICAgICAgICAgICAgICAgIyBjb21pbmc6IHlpZWxkIHRoZSBkZWxldGUgbGluZSBhbmQgdGhlbiBibGFua3MKKyAgICAgICAgICAgICAgICBmcm9tX2xpbmUsdG9fbGluZSA9IF9tYWtlX2xpbmUobGluZXMsJy0nLDApLCBOb25lCisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc190b195aWVsZCxudW1fYmxhbmtzX3BlbmRpbmcgPSBudW1fYmxhbmtzX3BlbmRpbmctMSwwCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnLSs/Jyk6CisgICAgICAgICAgICAgICAgIyBpbnRyYWxpbmUgY2hhbmdlCisgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfbGluZShsaW5lcyxOb25lLDApLCBfbWFrZV9saW5lKGxpbmVzLCc/JywxKSwgVHJ1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnLT8rJyk6CisgICAgICAgICAgICAgICAgIyBpbnRyYWxpbmUgY2hhbmdlCisgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfbGluZShsaW5lcywnPycsMCksIF9tYWtlX2xpbmUobGluZXMsTm9uZSwxKSwgVHJ1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnLScpOgorICAgICAgICAgICAgICAgICMgZGVsZXRlIEZST00gbGluZQorICAgICAgICAgICAgICAgIG51bV9ibGFua3NfcGVuZGluZyAtPSAxCisgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfbGluZShsaW5lcywnLScsMCksIE5vbmUsIFRydWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzLnN0YXJ0c3dpdGgoJystLScpOgorICAgICAgICAgICAgICAgICMgaW4gYWRkIGJsb2NrLCBkZWxldGUgYmxvY2sgY29taW5nOiB3ZSBkbyBOT1Qgd2FudCB0byBnZXQKKyAgICAgICAgICAgICAgICAjIGNhdWdodCB1cCBvbiBibGFuayBsaW5lcyB5ZXQsIGp1c3QgcHJvY2VzcyB0aGUgYWRkIGxpbmUKKyAgICAgICAgICAgICAgICBudW1fYmxhbmtzX3BlbmRpbmcgKz0gMQorICAgICAgICAgICAgICAgIHlpZWxkIE5vbmUsIF9tYWtlX2xpbmUobGluZXMsJysnLDEpLCBUcnVlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcy5zdGFydHN3aXRoKCgnKyAnLCAnKy0nKSk6CisgICAgICAgICAgICAgICAgIyB3aWxsIGJlIGxlYXZpbmcgYW4gYWRkIGJsb2NrOiB5aWVsZCBibGFua3MgdGhlbiBhZGQgbGluZQorICAgICAgICAgICAgICAgIGZyb21fbGluZSwgdG9fbGluZSA9IE5vbmUsIF9tYWtlX2xpbmUobGluZXMsJysnLDEpCisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc190b195aWVsZCxudW1fYmxhbmtzX3BlbmRpbmcgPSBudW1fYmxhbmtzX3BlbmRpbmcrMSwwCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnKycpOgorICAgICAgICAgICAgICAgICMgaW5zaWRlIGFuIGFkZCBibG9jaywgeWllbGQgdGhlIGFkZCBsaW5lCisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc19wZW5kaW5nICs9IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBOb25lLCBfbWFrZV9saW5lKGxpbmVzLCcrJywxKSwgVHJ1ZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnICcpOgorICAgICAgICAgICAgICAgICMgdW5jaGFuZ2VkIHRleHQsIHlpZWxkIGl0IHRvIGJvdGggc2lkZXMKKyAgICAgICAgICAgICAgICB5aWVsZCBfbWFrZV9saW5lKGxpbmVzWzpdLE5vbmUsMCksX21ha2VfbGluZShsaW5lcyxOb25lLDEpLEZhbHNlCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgQ2F0Y2ggdXAgb24gdGhlIGJsYW5rIGxpbmVzIHNvIHdoZW4gd2UgeWllbGQgdGhlIG5leHQgZnJvbS90bworICAgICAgICAgICAgIyBwYWlyLCB0aGV5IGFyZSBsaW5lZCB1cC4KKyAgICAgICAgICAgIHdoaWxlKG51bV9ibGFua3NfdG9feWllbGQgPCAwKToKKyAgICAgICAgICAgICAgICBudW1fYmxhbmtzX3RvX3lpZWxkICs9IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBOb25lLCgnJywnXG4nKSxUcnVlCisgICAgICAgICAgICB3aGlsZShudW1fYmxhbmtzX3RvX3lpZWxkID4gMCk6CisgICAgICAgICAgICAgICAgbnVtX2JsYW5rc190b195aWVsZCAtPSAxCisgICAgICAgICAgICAgICAgeWllbGQgKCcnLCdcbicpLE5vbmUsVHJ1ZQorICAgICAgICAgICAgaWYgcy5zdGFydHN3aXRoKCdYJyk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tX2xpbmUsdG9fbGluZSxUcnVlCisKKyAgICBkZWYgX2xpbmVfcGFpcl9pdGVyYXRvcigpOgorICAgICAgICAiIiJZaWVsZHMgZnJvbS90byBsaW5lcyBvZiB0ZXh0IHdpdGggYSBjaGFuZ2UgaW5kaWNhdGlvbi4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIGFuIGl0ZXJhdG9yLiAgSXQgaXRzZWxmIHB1bGxzIGxpbmVzIGZyb20gdGhlIGxpbmUKKyAgICAgICAgaXRlcmF0b3IuICBJdHMgZGlmZmVyZW5jZSBmcm9tIHRoYXQgaXRlcmF0b3IgaXMgdGhhdCB0aGlzIGZ1bmN0aW9uCisgICAgICAgIGFsd2F5cyB5aWVsZHMgYSBwYWlyIG9mIGZyb20vdG8gdGV4dCBsaW5lcyAod2l0aCB0aGUgY2hhbmdlCisgICAgICAgIGluZGljYXRpb24pLiAgSWYgbmVjZXNzYXJ5IGl0IHdpbGwgY29sbGVjdCBzaW5nbGUgZnJvbS90byBsaW5lcworICAgICAgICB1bnRpbCBpdCBoYXMgYSBtYXRjaGluZyBwYWlyIGZyb20vdG8gcGFpciB0byB5aWVsZC4KKworICAgICAgICBOb3RlLCB0aGlzIGZ1bmN0aW9uIGlzIHB1cnBvc2VmdWxseSBub3QgZGVmaW5lZCBhdCB0aGUgbW9kdWxlIHNjb3BlIHNvCisgICAgICAgIHRoYXQgZGF0YSBpdCBuZWVkcyBmcm9tIGl0cyBwYXJlbnQgZnVuY3Rpb24gKHdpdGhpbiB3aG9zZSBjb250ZXh0IGl0CisgICAgICAgIGlzIGRlZmluZWQpIGRvZXMgbm90IG5lZWQgdG8gYmUgb2YgbW9kdWxlIHNjb3BlLgorICAgICAgICAiIiIKKyAgICAgICAgbGluZV9pdGVyYXRvciA9IF9saW5lX2l0ZXJhdG9yKCkKKyAgICAgICAgZnJvbWxpbmVzLHRvbGluZXM9W10sW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICMgQ29sbGVjdGluZyBsaW5lcyBvZiB0ZXh0IHVudGlsIHdlIGhhdmUgYSBmcm9tL3RvIHBhaXIKKyAgICAgICAgICAgIHdoaWxlIChsZW4oZnJvbWxpbmVzKT09MCBvciBsZW4odG9saW5lcyk9PTApOgorICAgICAgICAgICAgICAgIGZyb21fbGluZSwgdG9fbGluZSwgZm91bmRfZGlmZiA9bGluZV9pdGVyYXRvci5uZXh0KCkKKyAgICAgICAgICAgICAgICBpZiBmcm9tX2xpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZyb21saW5lcy5hcHBlbmQoKGZyb21fbGluZSxmb3VuZF9kaWZmKSkKKyAgICAgICAgICAgICAgICBpZiB0b19saW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB0b2xpbmVzLmFwcGVuZCgodG9fbGluZSxmb3VuZF9kaWZmKSkKKyAgICAgICAgICAgICMgT25jZSB3ZSBoYXZlIGEgcGFpciwgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgY29sbGVjdGlvbiBhbmQgeWllbGQgaXQKKyAgICAgICAgICAgIGZyb21fbGluZSwgZnJvbURpZmYgPSBmcm9tbGluZXMucG9wKDApCisgICAgICAgICAgICB0b19saW5lLCB0b19kaWZmID0gdG9saW5lcy5wb3AoMCkKKyAgICAgICAgICAgIHlpZWxkIChmcm9tX2xpbmUsdG9fbGluZSxmcm9tRGlmZiBvciB0b19kaWZmKQorCisgICAgIyBIYW5kbGUgY2FzZSB3aGVyZSB1c2VyIGRvZXMgbm90IHdhbnQgY29udGV4dCBkaWZmZXJlbmNpbmcsIGp1c3QgeWllbGQKKyAgICAjIHRoZW0gdXAgd2l0aG91dCBkb2luZyBhbnl0aGluZyBlbHNlIHdpdGggdGhlbS4KKyAgICBsaW5lX3BhaXJfaXRlcmF0b3IgPSBfbGluZV9wYWlyX2l0ZXJhdG9yKCkKKyAgICBpZiBjb250ZXh0IGlzIE5vbmU6CisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB5aWVsZCBsaW5lX3BhaXJfaXRlcmF0b3IubmV4dCgpCisgICAgIyBIYW5kbGUgY2FzZSB3aGVyZSB1c2VyIHdhbnRzIGNvbnRleHQgZGlmZmVyZW5jaW5nLiAgV2UgbXVzdCBkbyBzb21lCisgICAgIyBzdG9yYWdlIG9mIGxpbmVzIHVudGlsIHdlIGtub3cgZm9yIHN1cmUgdGhhdCB0aGV5IGFyZSB0byBiZSB5aWVsZGVkLgorICAgIGVsc2U6CisgICAgICAgIGNvbnRleHQgKz0gMQorICAgICAgICBsaW5lc190b193cml0ZSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICMgU3RvcmUgbGluZXMgdXAgdW50aWwgd2UgZmluZCBhIGRpZmZlcmVuY2UsIG5vdGUgdXNlIG9mIGEKKyAgICAgICAgICAgICMgY2lyY3VsYXIgcXVldWUgYmVjYXVzZSB3ZSBvbmx5IG5lZWQgdG8ga2VlcCBhcm91bmQgd2hhdAorICAgICAgICAgICAgIyB3ZSBuZWVkIGZvciBjb250ZXh0LgorICAgICAgICAgICAgaW5kZXgsIGNvbnRleHRMaW5lcyA9IDAsIFtOb25lXSooY29udGV4dCkKKyAgICAgICAgICAgIGZvdW5kX2RpZmYgPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUoZm91bmRfZGlmZiBpcyBGYWxzZSk6CisgICAgICAgICAgICAgICAgZnJvbV9saW5lLCB0b19saW5lLCBmb3VuZF9kaWZmID0gbGluZV9wYWlyX2l0ZXJhdG9yLm5leHQoKQorICAgICAgICAgICAgICAgIGkgPSBpbmRleCAlIGNvbnRleHQKKyAgICAgICAgICAgICAgICBjb250ZXh0TGluZXNbaV0gPSAoZnJvbV9saW5lLCB0b19saW5lLCBmb3VuZF9kaWZmKQorICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgICMgWWllbGQgbGluZXMgdGhhdCB3ZSBoYXZlIGNvbGxlY3RlZCBzbyBmYXIsIGJ1dCBmaXJzdCB5aWVsZAorICAgICAgICAgICAgIyB0aGUgdXNlcidzIHNlcGFyYXRvci4KKyAgICAgICAgICAgIGlmIGluZGV4ID4gY29udGV4dDoKKyAgICAgICAgICAgICAgICB5aWVsZCBOb25lLCBOb25lLCBOb25lCisgICAgICAgICAgICAgICAgbGluZXNfdG9fd3JpdGUgPSBjb250ZXh0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmVzX3RvX3dyaXRlID0gaW5kZXgKKyAgICAgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgICAgIHdoaWxlKGxpbmVzX3RvX3dyaXRlKToKKyAgICAgICAgICAgICAgICBpID0gaW5kZXggJSBjb250ZXh0CisgICAgICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHlpZWxkIGNvbnRleHRMaW5lc1tpXQorICAgICAgICAgICAgICAgIGxpbmVzX3RvX3dyaXRlIC09IDEKKyAgICAgICAgICAgICMgTm93IHlpZWxkIHRoZSBjb250ZXh0IGxpbmVzIGFmdGVyIHRoZSBjaGFuZ2UKKyAgICAgICAgICAgIGxpbmVzX3RvX3dyaXRlID0gY29udGV4dC0xCisgICAgICAgICAgICB3aGlsZShsaW5lc190b193cml0ZSk6CisgICAgICAgICAgICAgICAgZnJvbV9saW5lLCB0b19saW5lLCBmb3VuZF9kaWZmID0gbGluZV9wYWlyX2l0ZXJhdG9yLm5leHQoKQorICAgICAgICAgICAgICAgICMgSWYgYW5vdGhlciBjaGFuZ2Ugd2l0aGluIHRoZSBjb250ZXh0LCBleHRlbmQgdGhlIGNvbnRleHQKKyAgICAgICAgICAgICAgICBpZiBmb3VuZF9kaWZmOgorICAgICAgICAgICAgICAgICAgICBsaW5lc190b193cml0ZSA9IGNvbnRleHQtMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzX3RvX3dyaXRlIC09IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBmcm9tX2xpbmUsIHRvX2xpbmUsIGZvdW5kX2RpZmYKKworCitfZmlsZV90ZW1wbGF0ZSA9ICIiIgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+CisKKzxodG1sPgorCis8aGVhZD4KKyAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiCisgICAgICAgICAgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CisgICAgPHRpdGxlPjwvdGl0bGU+CisgICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4lKHN0eWxlcylzCisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHk+CisgICAgJSh0YWJsZSlzJShsZWdlbmQpcworPC9ib2R5PgorCis8L2h0bWw+IiIiCisKK19zdHlsZXMgPSAiIiIKKyAgICAgICAgdGFibGUuZGlmZiB7Zm9udC1mYW1pbHk6Q291cmllcjsgYm9yZGVyOm1lZGl1bTt9CisgICAgICAgIC5kaWZmX2hlYWRlciB7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwfQorICAgICAgICB0ZC5kaWZmX2hlYWRlciB7dGV4dC1hbGlnbjpyaWdodH0KKyAgICAgICAgLmRpZmZfbmV4dCB7YmFja2dyb3VuZC1jb2xvcjojYzBjMGMwfQorICAgICAgICAuZGlmZl9hZGQge2JhY2tncm91bmQtY29sb3I6I2FhZmZhYX0KKyAgICAgICAgLmRpZmZfY2hnIHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmNzd9CisgICAgICAgIC5kaWZmX3N1YiB7YmFja2dyb3VuZC1jb2xvcjojZmZhYWFhfSIiIgorCitfdGFibGVfdGVtcGxhdGUgPSAiIiIKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ18lKHByZWZpeClzX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgICUoaGVhZGVyX3JvdylzCisgICAgICAgIDx0Ym9keT4KKyUoZGF0YV9yb3dzKXMgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4iIiIKKworX2xlZ2VuZCA9ICIiIgorICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgc3VtbWFyeT0iTGVnZW5kcyI+CisgICAgICAgIDx0cj4gPHRoIGNvbHNwYW49IjIiPiBMZWdlbmRzIDwvdGg+IDwvdHI+CisgICAgICAgIDx0cj4gPHRkPiA8dGFibGUgYm9yZGVyPSIiIHN1bW1hcnk9IkNvbG9ycyI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0aD4gQ29sb3JzIDwvdGg+IDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwO0FkZGVkJm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfY2hnIj5DaGFuZ2VkPC90ZD4gPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX3N1YiI+RGVsZXRlZDwvdGQ+IDwvdHI+CisgICAgICAgICAgICAgICAgICA8L3RhYmxlPjwvdGQ+CisgICAgICAgICAgICAgPHRkPiA8dGFibGUgYm9yZGVyPSIiIHN1bW1hcnk9IkxpbmtzIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRoIGNvbHNwYW49IjIiPiBMaW5rcyA8L3RoPiA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+KGYpaXJzdCBjaGFuZ2U8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQ+KG4pZXh0IGNoYW5nZTwvdGQ+IDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD4odClvcDwvdGQ+IDwvdHI+CisgICAgICAgICAgICAgICAgICA8L3RhYmxlPjwvdGQ+IDwvdHI+CisgICAgPC90YWJsZT4iIiIKKworY2xhc3MgSHRtbERpZmYob2JqZWN0KToKKyAgICAiIiJGb3IgcHJvZHVjaW5nIEhUTUwgc2lkZSBieSBzaWRlIGNvbXBhcmlzb24gd2l0aCBjaGFuZ2UgaGlnaGxpZ2h0cy4KKworICAgIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIEhUTUwgdGFibGUgKG9yIGEgY29tcGxldGUgSFRNTCBmaWxlCisgICAgY29udGFpbmluZyB0aGUgdGFibGUpIHNob3dpbmcgYSBzaWRlIGJ5IHNpZGUsIGxpbmUgYnkgbGluZSBjb21wYXJpc29uCisgICAgb2YgdGV4dCB3aXRoIGludGVyLWxpbmUgYW5kIGludHJhLWxpbmUgY2hhbmdlIGhpZ2hsaWdodHMuICBUaGUgdGFibGUgY2FuCisgICAgYmUgZ2VuZXJhdGVkIGluIGVpdGhlciBmdWxsIG9yIGNvbnRleHR1YWwgZGlmZmVyZW5jZSBtb2RlLgorCisgICAgVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBwcm92aWRlZCBmb3IgSFRNTCBnZW5lcmF0aW9uOgorCisgICAgbWFrZV90YWJsZSAtLSBnZW5lcmF0ZXMgSFRNTCBmb3IgYSBzaW5nbGUgc2lkZSBieSBzaWRlIHRhYmxlCisgICAgbWFrZV9maWxlIC0tIGdlbmVyYXRlcyBjb21wbGV0ZSBIVE1MIGZpbGUgd2l0aCBhIHNpbmdsZSBzaWRlIGJ5IHNpZGUgdGFibGUKKworICAgIFNlZSB0b29scy9zY3JpcHRzL2RpZmYucHkgZm9yIGFuIGV4YW1wbGUgdXNhZ2Ugb2YgdGhpcyBjbGFzcy4KKyAgICAiIiIKKworICAgIF9maWxlX3RlbXBsYXRlID0gX2ZpbGVfdGVtcGxhdGUKKyAgICBfc3R5bGVzID0gX3N0eWxlcworICAgIF90YWJsZV90ZW1wbGF0ZSA9IF90YWJsZV90ZW1wbGF0ZQorICAgIF9sZWdlbmQgPSBfbGVnZW5kCisgICAgX2RlZmF1bHRfcHJlZml4ID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsdGFic2l6ZT04LHdyYXBjb2x1bW49Tm9uZSxsaW5lanVuaz1Ob25lLAorICAgICAgICAgICAgICAgICBjaGFyanVuaz1JU19DSEFSQUNURVJfSlVOSyk6CisgICAgICAgICIiIkh0bWxEaWZmIGluc3RhbmNlIGluaXRpYWxpemVyCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICB0YWJzaXplIC0tIHRhYiBzdG9wIHNwYWNpbmcsIGRlZmF1bHRzIHRvIDguCisgICAgICAgIHdyYXBjb2x1bW4gLS0gY29sdW1uIG51bWJlciB3aGVyZSBsaW5lcyBhcmUgYnJva2VuIGFuZCB3cmFwcGVkLAorICAgICAgICAgICAgZGVmYXVsdHMgdG8gTm9uZSB3aGVyZSBsaW5lcyBhcmUgbm90IHdyYXBwZWQuCisgICAgICAgIGxpbmVqdW5rLGNoYXJqdW5rIC0tIGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCBpbnRvIG5kaWZmKCkgKHVzZWQgdG8gYnkKKyAgICAgICAgICAgIEh0bWxEaWZmKCkgdG8gZ2VuZXJhdGUgdGhlIHNpZGUgYnkgc2lkZSBIVE1MIGRpZmZlcmVuY2VzKS4gIFNlZQorICAgICAgICAgICAgbmRpZmYoKSBkb2N1bWVudGF0aW9uIGZvciBhcmd1bWVudCBkZWZhdWx0IHZhbHVlcyBhbmQgZGVzY3JpcHRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdGFic2l6ZSA9IHRhYnNpemUKKyAgICAgICAgc2VsZi5fd3JhcGNvbHVtbiA9IHdyYXBjb2x1bW4KKyAgICAgICAgc2VsZi5fbGluZWp1bmsgPSBsaW5lanVuaworICAgICAgICBzZWxmLl9jaGFyanVuayA9IGNoYXJqdW5rCisKKyAgICBkZWYgbWFrZV9maWxlKHNlbGYsZnJvbWxpbmVzLHRvbGluZXMsZnJvbWRlc2M9JycsdG9kZXNjPScnLGNvbnRleHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICBudW1saW5lcz01KToKKyAgICAgICAgIiIiUmV0dXJucyBIVE1MIGZpbGUgb2Ygc2lkZSBieSBzaWRlIGNvbXBhcmlzb24gd2l0aCBjaGFuZ2UgaGlnaGxpZ2h0cworCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgZnJvbWxpbmVzIC0tIGxpc3Qgb2YgImZyb20iIGxpbmVzCisgICAgICAgIHRvbGluZXMgLS0gbGlzdCBvZiAidG8iIGxpbmVzCisgICAgICAgIGZyb21kZXNjIC0tICJmcm9tIiBmaWxlIGNvbHVtbiBoZWFkZXIgc3RyaW5nCisgICAgICAgIHRvZGVzYyAtLSAidG8iIGZpbGUgY29sdW1uIGhlYWRlciBzdHJpbmcKKyAgICAgICAgY29udGV4dCAtLSBzZXQgdG8gVHJ1ZSBmb3IgY29udGV4dHVhbCBkaWZmZXJlbmNlcyAoZGVmYXVsdHMgdG8gRmFsc2UKKyAgICAgICAgICAgIHdoaWNoIHNob3dzIGZ1bGwgZGlmZmVyZW5jZXMpLgorICAgICAgICBudW1saW5lcyAtLSBudW1iZXIgb2YgY29udGV4dCBsaW5lcy4gIFdoZW4gY29udGV4dCBpcyBzZXQgVHJ1ZSwKKyAgICAgICAgICAgIGNvbnRyb2xzIG51bWJlciBvZiBsaW5lcyBkaXNwbGF5ZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgY2hhbmdlLgorICAgICAgICAgICAgV2hlbiBjb250ZXh0IGlzIEZhbHNlLCBjb250cm9scyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHBsYWNlCisgICAgICAgICAgICB0aGUgIm5leHQiIGxpbmsgYW5jaG9ycyBiZWZvcmUgdGhlIG5leHQgY2hhbmdlIChzbyBjbGljayBvZgorICAgICAgICAgICAgIm5leHQiIGxpbmsganVtcHMgdG8ganVzdCBiZWZvcmUgdGhlIGNoYW5nZSkuCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBzZWxmLl9maWxlX3RlbXBsYXRlICUgZGljdCgKKyAgICAgICAgICAgIHN0eWxlcyA9IHNlbGYuX3N0eWxlcywKKyAgICAgICAgICAgIGxlZ2VuZCA9IHNlbGYuX2xlZ2VuZCwKKyAgICAgICAgICAgIHRhYmxlID0gc2VsZi5tYWtlX3RhYmxlKGZyb21saW5lcyx0b2xpbmVzLGZyb21kZXNjLHRvZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ9Y29udGV4dCxudW1saW5lcz1udW1saW5lcykpCisKKyAgICBkZWYgX3RhYl9uZXdsaW5lX3JlcGxhY2Uoc2VsZixmcm9tbGluZXMsdG9saW5lcyk6CisgICAgICAgICIiIlJldHVybnMgZnJvbS90byBsaW5lIGxpc3RzIHdpdGggdGFicyBleHBhbmRlZCBhbmQgbmV3bGluZXMgcmVtb3ZlZC4KKworICAgICAgICBJbnN0ZWFkIG9mIHRhYiBjaGFyYWN0ZXJzIGJlaW5nIHJlcGxhY2VkIGJ5IHRoZSBudW1iZXIgb2Ygc3BhY2VzCisgICAgICAgIG5lZWRlZCB0byBmaWxsIGluIHRvIHRoZSBuZXh0IHRhYiBzdG9wLCB0aGlzIGZ1bmN0aW9uIHdpbGwgZmlsbAorICAgICAgICB0aGUgc3BhY2Ugd2l0aCB0YWIgY2hhcmFjdGVycy4gIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBkaWZmZXJlbmNlCisgICAgICAgIGFsZ29yaXRobXMgY2FuIGlkZW50aWZ5IGNoYW5nZXMgaW4gYSBmaWxlIHdoZW4gdGFicyBhcmUgcmVwbGFjZWQgYnkKKyAgICAgICAgc3BhY2VzIGFuZCB2aWNlIHZlcnNhLiAgQXQgdGhlIGVuZCBvZiB0aGUgSFRNTCBnZW5lcmF0aW9uLCB0aGUgdGFiCisgICAgICAgIGNoYXJhY3RlcnMgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGEgbm9uYnJlYWthYmxlIHNwYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgZGVmIGV4cGFuZF90YWJzKGxpbmUpOgorICAgICAgICAgICAgIyBoaWRlIHJlYWwgc3BhY2VzCisgICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKCcgJywnXDAnKQorICAgICAgICAgICAgIyBleHBhbmQgdGFicyBpbnRvIHNwYWNlcworICAgICAgICAgICAgbGluZSA9IGxpbmUuZXhwYW5kdGFicyhzZWxmLl90YWJzaXplKQorICAgICAgICAgICAgIyByZXBsYWNlIHNwYWNlcyBmcm9tIGV4cGFuZGVkIHRhYnMgYmFjayBpbnRvIHRhYiBjaGFyYWN0ZXJzCisgICAgICAgICAgICAjICh3ZSdsbCByZXBsYWNlIHRoZW0gd2l0aCBtYXJrdXAgYWZ0ZXIgd2UgZG8gZGlmZmVyZW5jaW5nKQorICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgnICcsJ1x0JykKKyAgICAgICAgICAgIHJldHVybiBsaW5lLnJlcGxhY2UoJ1wwJywnICcpLnJzdHJpcCgnXG4nKQorICAgICAgICBmcm9tbGluZXMgPSBbZXhwYW5kX3RhYnMobGluZSkgZm9yIGxpbmUgaW4gZnJvbWxpbmVzXQorICAgICAgICB0b2xpbmVzID0gW2V4cGFuZF90YWJzKGxpbmUpIGZvciBsaW5lIGluIHRvbGluZXNdCisgICAgICAgIHJldHVybiBmcm9tbGluZXMsdG9saW5lcworCisgICAgZGVmIF9zcGxpdF9saW5lKHNlbGYsZGF0YV9saXN0LGxpbmVfbnVtLHRleHQpOgorICAgICAgICAiIiJCdWlsZHMgbGlzdCBvZiB0ZXh0IGxpbmVzIGJ5IHNwbGl0dGluZyB0ZXh0IGxpbmVzIGF0IHdyYXAgcG9pbnQKKworICAgICAgICBUaGlzIGZ1bmN0aW9uIHdpbGwgZGV0ZXJtaW5lIGlmIHRoZSBpbnB1dCB0ZXh0IGxpbmUgbmVlZHMgdG8gYmUKKyAgICAgICAgd3JhcHBlZCAoc3BsaXQpIGludG8gc2VwYXJhdGUgbGluZXMuICBJZiBzbywgdGhlIGZpcnN0IHdyYXAgcG9pbnQKKyAgICAgICAgd2lsbCBiZSBkZXRlcm1pbmVkIGFuZCB0aGUgZmlyc3QgbGluZSBhcHBlbmRlZCB0byB0aGUgb3V0cHV0CisgICAgICAgIHRleHQgbGluZSBsaXN0LiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHJlY3Vyc2l2ZWx5IHRvIGhhbmRsZQorICAgICAgICB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHNwbGl0IGxpbmUgdG8gZnVydGhlciBzcGxpdCBpdC4KKyAgICAgICAgIiIiCisgICAgICAgICMgaWYgYmxhbmsgbGluZSBvciBjb250ZXh0IHNlcGFyYXRvciwganVzdCBhZGQgaXQgdG8gdGhlIG91dHB1dCBsaXN0CisgICAgICAgIGlmIG5vdCBsaW5lX251bToKKyAgICAgICAgICAgIGRhdGFfbGlzdC5hcHBlbmQoKGxpbmVfbnVtLHRleHQpKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBpZiBsaW5lIHRleHQgZG9lc24ndCBuZWVkIHdyYXBwaW5nLCBqdXN0IGFkZCBpdCB0byB0aGUgb3V0cHV0IGxpc3QKKyAgICAgICAgc2l6ZSA9IGxlbih0ZXh0KQorICAgICAgICBtYXggPSBzZWxmLl93cmFwY29sdW1uCisgICAgICAgIGlmIChzaXplIDw9IG1heCkgb3IgKChzaXplIC0odGV4dC5jb3VudCgnXDAnKSozKSkgPD0gbWF4KToKKyAgICAgICAgICAgIGRhdGFfbGlzdC5hcHBlbmQoKGxpbmVfbnVtLHRleHQpKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBzY2FuIHRleHQgbG9va2luZyBmb3IgdGhlIHdyYXAgcG9pbnQsIGtlZXBpbmcgdHJhY2sgaWYgdGhlIHdyYXAKKyAgICAgICAgIyBwb2ludCBpcyBpbnNpZGUgbWFya2VycworICAgICAgICBpID0gMAorICAgICAgICBuID0gMAorICAgICAgICBtYXJrID0gJycKKyAgICAgICAgd2hpbGUgbiA8IG1heCBhbmQgaSA8IHNpemU6CisgICAgICAgICAgICBpZiB0ZXh0W2ldID09ICdcMCc6CisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgbWFyayA9IHRleHRbaV0KKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgIGVsaWYgdGV4dFtpXSA9PSAnXDEnOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIG1hcmsgPSAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICBuICs9IDEKKworICAgICAgICAjIHdyYXAgcG9pbnQgaXMgaW5zaWRlIHRleHQsIGJyZWFrIGl0IHVwIGludG8gc2VwYXJhdGUgbGluZXMKKyAgICAgICAgbGluZTEgPSB0ZXh0WzppXQorICAgICAgICBsaW5lMiA9IHRleHRbaTpdCisKKyAgICAgICAgIyBpZiB3cmFwIHBvaW50IGlzIGluc2lkZSBtYXJrZXJzLCBwbGFjZSBlbmQgbWFya2VyIGF0IGVuZCBvZiBmaXJzdAorICAgICAgICAjIGxpbmUgYW5kIHN0YXJ0IG1hcmtlciBhdCBiZWdpbm5pbmcgb2Ygc2Vjb25kIGxpbmUgYmVjYXVzZSBlYWNoCisgICAgICAgICMgbGluZSB3aWxsIGhhdmUgaXRzIG93biB0YWJsZSB0YWcgbWFya3VwIGFyb3VuZCBpdC4KKyAgICAgICAgaWYgbWFyazoKKyAgICAgICAgICAgIGxpbmUxID0gbGluZTEgKyAnXDEnCisgICAgICAgICAgICBsaW5lMiA9ICdcMCcgKyBtYXJrICsgbGluZTIKKworICAgICAgICAjIHRhY2sgb24gZmlyc3QgbGluZSBvbnRvIHRoZSBvdXRwdXQgbGlzdAorICAgICAgICBkYXRhX2xpc3QuYXBwZW5kKChsaW5lX251bSxsaW5lMSkpCisKKyAgICAgICAgIyB1c2UgdGhpcyByb3V0aW5lIGFnYWluIHRvIHdyYXAgdGhlIHJlbWFpbmluZyB0ZXh0CisgICAgICAgIHNlbGYuX3NwbGl0X2xpbmUoZGF0YV9saXN0LCc+JyxsaW5lMikKKworICAgIGRlZiBfbGluZV93cmFwcGVyKHNlbGYsZGlmZnMpOgorICAgICAgICAiIiJSZXR1cm5zIGl0ZXJhdG9yIHRoYXQgc3BsaXRzICh3cmFwcykgbWRpZmYgdGV4dCBsaW5lcyIiIgorCisgICAgICAgICMgcHVsbCBmcm9tL3RvIGRhdGEgYW5kIGZsYWdzIGZyb20gbWRpZmYgaXRlcmF0b3IKKyAgICAgICAgZm9yIGZyb21kYXRhLHRvZGF0YSxmbGFnIGluIGRpZmZzOgorICAgICAgICAgICAgIyBjaGVjayBmb3IgY29udGV4dCBzZXBhcmF0b3JzIGFuZCBwYXNzIHRoZW0gdGhyb3VnaAorICAgICAgICAgICAgaWYgZmxhZyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHlpZWxkIGZyb21kYXRhLHRvZGF0YSxmbGFnCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIChmcm9tbGluZSxmcm9tdGV4dCksKHRvbGluZSx0b3RleHQpID0gZnJvbWRhdGEsdG9kYXRhCisgICAgICAgICAgICAjIGZvciBlYWNoIGZyb20vdG8gbGluZSBzcGxpdCBpdCBhdCB0aGUgd3JhcCBjb2x1bW4gdG8gZm9ybQorICAgICAgICAgICAgIyBsaXN0IG9mIHRleHQgbGluZXMuCisgICAgICAgICAgICBmcm9tbGlzdCx0b2xpc3QgPSBbXSxbXQorICAgICAgICAgICAgc2VsZi5fc3BsaXRfbGluZShmcm9tbGlzdCxmcm9tbGluZSxmcm9tdGV4dCkKKyAgICAgICAgICAgIHNlbGYuX3NwbGl0X2xpbmUodG9saXN0LHRvbGluZSx0b3RleHQpCisgICAgICAgICAgICAjIHlpZWxkIGZyb20vdG8gbGluZSBpbiBwYWlycyBpbnNlcnRpbmcgYmxhbmsgbGluZXMgYXMKKyAgICAgICAgICAgICMgbmVjZXNzYXJ5IHdoZW4gb25lIHNpZGUgaGFzIG1vcmUgd3JhcHBlZCBsaW5lcworICAgICAgICAgICAgd2hpbGUgZnJvbWxpc3Qgb3IgdG9saXN0OgorICAgICAgICAgICAgICAgIGlmIGZyb21saXN0OgorICAgICAgICAgICAgICAgICAgICBmcm9tZGF0YSA9IGZyb21saXN0LnBvcCgwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZyb21kYXRhID0gKCcnLCcgJykKKyAgICAgICAgICAgICAgICBpZiB0b2xpc3Q6CisgICAgICAgICAgICAgICAgICAgIHRvZGF0YSA9IHRvbGlzdC5wb3AoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0b2RhdGEgPSAoJycsJyAnKQorICAgICAgICAgICAgICAgIHlpZWxkIGZyb21kYXRhLHRvZGF0YSxmbGFnCisKKyAgICBkZWYgX2NvbGxlY3RfbGluZXMoc2VsZixkaWZmcyk6CisgICAgICAgICIiIkNvbGxlY3RzIG1kaWZmIG91dHB1dCBpbnRvIHNlcGFyYXRlIGxpc3RzCisKKyAgICAgICAgQmVmb3JlIHN0b3JpbmcgdGhlIG1kaWZmIGZyb20vdG8gZGF0YSBpbnRvIGEgbGlzdCwgaXQgaXMgY29udmVydGVkCisgICAgICAgIGludG8gYSBzaW5nbGUgbGluZSBvZiB0ZXh0IHdpdGggSFRNTCBtYXJrdXAuCisgICAgICAgICIiIgorCisgICAgICAgIGZyb21saXN0LHRvbGlzdCxmbGFnbGlzdCA9IFtdLFtdLFtdCisgICAgICAgICMgcHVsbCBmcm9tL3RvIGRhdGEgYW5kIGZsYWdzIGZyb20gbWRpZmYgc3R5bGUgaXRlcmF0b3IKKyAgICAgICAgZm9yIGZyb21kYXRhLHRvZGF0YSxmbGFnIGluIGRpZmZzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgc3RvcmUgSFRNTCBtYXJrdXAgb2YgdGhlIGxpbmVzIGludG8gdGhlIGxpc3RzCisgICAgICAgICAgICAgICAgZnJvbWxpc3QuYXBwZW5kKHNlbGYuX2Zvcm1hdF9saW5lKDAsZmxhZywqZnJvbWRhdGEpKQorICAgICAgICAgICAgICAgIHRvbGlzdC5hcHBlbmQoc2VsZi5fZm9ybWF0X2xpbmUoMSxmbGFnLCp0b2RhdGEpKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGV4Y2VwdGlvbnMgb2NjdXIgZm9yIGxpbmVzIHdoZXJlIGNvbnRleHQgc2VwYXJhdG9ycyBnbworICAgICAgICAgICAgICAgIGZyb21saXN0LmFwcGVuZChOb25lKQorICAgICAgICAgICAgICAgIHRvbGlzdC5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIGZsYWdsaXN0LmFwcGVuZChmbGFnKQorICAgICAgICByZXR1cm4gZnJvbWxpc3QsdG9saXN0LGZsYWdsaXN0CisKKyAgICBkZWYgX2Zvcm1hdF9saW5lKHNlbGYsc2lkZSxmbGFnLGxpbmVudW0sdGV4dCk6CisgICAgICAgICIiIlJldHVybnMgSFRNTCBtYXJrdXAgb2YgImZyb20iIC8gInRvIiB0ZXh0IGxpbmVzCisKKyAgICAgICAgc2lkZSAtLSAwIG9yIDEgaW5kaWNhdGluZyAiZnJvbSIgb3IgInRvIiB0ZXh0CisgICAgICAgIGZsYWcgLS0gaW5kaWNhdGVzIGlmIGRpZmZlcmVuY2Ugb24gbGluZQorICAgICAgICBsaW5lbnVtIC0tIGxpbmUgbnVtYmVyICh1c2VkIGZvciBsaW5lIG51bWJlciBjb2x1bW4pCisgICAgICAgIHRleHQgLS0gbGluZSB0ZXh0IHRvIGJlIG1hcmtlZCB1cAorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZW51bSA9ICclZCcgJSBsaW5lbnVtCisgICAgICAgICAgICBpZCA9ICcgaWQ9IiVzJXMiJyAlIChzZWxmLl9wcmVmaXhbc2lkZV0sbGluZW51bSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICMgaGFuZGxlIGJsYW5rIGxpbmVzIHdoZXJlIGxpbmVudW0gaXMgJz4nIG9yICcnCisgICAgICAgICAgICBpZCA9ICcnCisgICAgICAgICMgcmVwbGFjZSB0aG9zZSB0aGluZ3MgdGhhdCB3b3VsZCBnZXQgY29uZnVzZWQgd2l0aCBIVE1MIHN5bWJvbHMKKyAgICAgICAgdGV4dD10ZXh0LnJlcGxhY2UoIiYiLCImYW1wOyIpLnJlcGxhY2UoIj4iLCImZ3Q7IikucmVwbGFjZSgiPCIsIiZsdDsiKQorCisgICAgICAgICMgbWFrZSBzcGFjZSBub24tYnJlYWthYmxlIHNvIHRoZXkgZG9uJ3QgZ2V0IGNvbXByZXNzZWQgb3IgbGluZSB3cmFwcGVkCisgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoJyAnLCcmbmJzcDsnKS5yc3RyaXAoKQorCisgICAgICAgIHJldHVybiAnPHRkIGNsYXNzPSJkaWZmX2hlYWRlciIlcz4lczwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4lczwvdGQ+JyBcCisgICAgICAgICAgICAgICAlIChpZCxsaW5lbnVtLHRleHQpCisKKyAgICBkZWYgX21ha2VfcHJlZml4KHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgdW5pcXVlIGFuY2hvciBwcmVmaXhlcyIiIgorCisgICAgICAgICMgR2VuZXJhdGUgYSB1bmlxdWUgYW5jaG9yIHByZWZpeCBzbyBtdWx0aXBsZSB0YWJsZXMKKyAgICAgICAgIyBjYW4gZXhpc3Qgb24gdGhlIHNhbWUgSFRNTCBwYWdlIHdpdGhvdXQgY29uZmxpY3RzLgorICAgICAgICBmcm9tcHJlZml4ID0gImZyb20lZF8iICUgSHRtbERpZmYuX2RlZmF1bHRfcHJlZml4CisgICAgICAgIHRvcHJlZml4ID0gInRvJWRfIiAlIEh0bWxEaWZmLl9kZWZhdWx0X3ByZWZpeAorICAgICAgICBIdG1sRGlmZi5fZGVmYXVsdF9wcmVmaXggKz0gMQorICAgICAgICAjIHN0b3JlIHByZWZpeGVzIHNvIGxpbmUgZm9ybWF0IG1ldGhvZCBoYXMgYWNjZXNzCisgICAgICAgIHNlbGYuX3ByZWZpeCA9IFtmcm9tcHJlZml4LHRvcHJlZml4XQorCisgICAgZGVmIF9jb252ZXJ0X2ZsYWdzKHNlbGYsZnJvbWxpc3QsdG9saXN0LGZsYWdsaXN0LGNvbnRleHQsbnVtbGluZXMpOgorICAgICAgICAiIiJNYWtlcyBsaXN0IG9mICJuZXh0IiBsaW5rcyIiIgorCisgICAgICAgICMgYWxsIGFuY2hvciBuYW1lcyB3aWxsIGJlIGdlbmVyYXRlZCB1c2luZyB0aGUgdW5pcXVlICJ0byIgcHJlZml4CisgICAgICAgIHRvcHJlZml4ID0gc2VsZi5fcHJlZml4WzFdCisKKyAgICAgICAgIyBwcm9jZXNzIGNoYW5nZSBmbGFncywgZ2VuZXJhdGluZyBtaWRkbGUgY29sdW1uIG9mIG5leHQgYW5jaG9ycy9saW5rcworICAgICAgICBuZXh0X2lkID0gWycnXSpsZW4oZmxhZ2xpc3QpCisgICAgICAgIG5leHRfaHJlZiA9IFsnJ10qbGVuKGZsYWdsaXN0KQorICAgICAgICBudW1fY2hnLCBpbl9jaGFuZ2UgPSAwLCBGYWxzZQorICAgICAgICBsYXN0ID0gMAorICAgICAgICBmb3IgaSxmbGFnIGluIGVudW1lcmF0ZShmbGFnbGlzdCk6CisgICAgICAgICAgICBpZiBmbGFnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBpbl9jaGFuZ2U6CisgICAgICAgICAgICAgICAgICAgIGluX2NoYW5nZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGkKKyAgICAgICAgICAgICAgICAgICAgIyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY2hhbmdlLCBkcm9wIGFuIGFuY2hvciBhIGZldyBsaW5lcworICAgICAgICAgICAgICAgICAgICAjICh0aGUgY29udGV4dCBsaW5lcykgYmVmb3JlIHRoZSBjaGFuZ2UgZm9yIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAjIGxpbmsKKyAgICAgICAgICAgICAgICAgICAgaSA9IG1heChbMCxpLW51bWxpbmVzXSkKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9pZFtpXSA9ICcgaWQ9ImRpZmZsaWJfY2hnXyVzXyVkIicgJSAodG9wcmVmaXgsbnVtX2NoZykKKyAgICAgICAgICAgICAgICAgICAgIyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgY2hhbmdlLCBkcm9wIGEgbGluayB0byB0aGUgbmV4dAorICAgICAgICAgICAgICAgICAgICAjIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICBudW1fY2hnICs9IDEKKyAgICAgICAgICAgICAgICAgICAgbmV4dF9ocmVmW2xhc3RdID0gJzxhIGhyZWY9IiNkaWZmbGliX2NoZ18lc18lZCI+bjwvYT4nICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgIHRvcHJlZml4LG51bV9jaGcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluX2NoYW5nZSA9IEZhbHNlCisgICAgICAgICMgY2hlY2sgZm9yIGNhc2VzIHdoZXJlIHRoZXJlIGlzIG5vIGNvbnRlbnQgdG8gYXZvaWQgZXhjZXB0aW9ucworICAgICAgICBpZiBub3QgZmxhZ2xpc3Q6CisgICAgICAgICAgICBmbGFnbGlzdCA9IFtGYWxzZV0KKyAgICAgICAgICAgIG5leHRfaWQgPSBbJyddCisgICAgICAgICAgICBuZXh0X2hyZWYgPSBbJyddCisgICAgICAgICAgICBsYXN0ID0gMAorICAgICAgICAgICAgaWYgY29udGV4dDoKKyAgICAgICAgICAgICAgICBmcm9tbGlzdCA9IFsnPHRkPjwvdGQ+PHRkPiZuYnNwO05vIERpZmZlcmVuY2VzIEZvdW5kJm5ic3A7PC90ZD4nXQorICAgICAgICAgICAgICAgIHRvbGlzdCA9IGZyb21saXN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZyb21saXN0ID0gdG9saXN0ID0gWyc8dGQ+PC90ZD48dGQ+Jm5ic3A7RW1wdHkgRmlsZSZuYnNwOzwvdGQ+J10KKyAgICAgICAgIyBpZiBub3QgYSBjaGFuZ2Ugb24gZmlyc3QgbGluZSwgZHJvcCBhIGxpbmsKKyAgICAgICAgaWYgbm90IGZsYWdsaXN0WzBdOgorICAgICAgICAgICAgbmV4dF9ocmVmWzBdID0gJzxhIGhyZWY9IiNkaWZmbGliX2NoZ18lc18wIj5mPC9hPicgJSB0b3ByZWZpeAorICAgICAgICAjIHJlZG8gdGhlIGxhc3QgbGluayB0byBsaW5rIHRvIHRoZSB0b3AKKyAgICAgICAgbmV4dF9ocmVmW2xhc3RdID0gJzxhIGhyZWY9IiNkaWZmbGliX2NoZ18lc190b3AiPnQ8L2E+JyAlICh0b3ByZWZpeCkKKworICAgICAgICByZXR1cm4gZnJvbWxpc3QsdG9saXN0LGZsYWdsaXN0LG5leHRfaHJlZixuZXh0X2lkCisKKyAgICBkZWYgbWFrZV90YWJsZShzZWxmLGZyb21saW5lcyx0b2xpbmVzLGZyb21kZXNjPScnLHRvZGVzYz0nJyxjb250ZXh0PUZhbHNlLAorICAgICAgICAgICAgICAgICAgIG51bWxpbmVzPTUpOgorICAgICAgICAiIiJSZXR1cm5zIEhUTUwgdGFibGUgb2Ygc2lkZSBieSBzaWRlIGNvbXBhcmlzb24gd2l0aCBjaGFuZ2UgaGlnaGxpZ2h0cworCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgZnJvbWxpbmVzIC0tIGxpc3Qgb2YgImZyb20iIGxpbmVzCisgICAgICAgIHRvbGluZXMgLS0gbGlzdCBvZiAidG8iIGxpbmVzCisgICAgICAgIGZyb21kZXNjIC0tICJmcm9tIiBmaWxlIGNvbHVtbiBoZWFkZXIgc3RyaW5nCisgICAgICAgIHRvZGVzYyAtLSAidG8iIGZpbGUgY29sdW1uIGhlYWRlciBzdHJpbmcKKyAgICAgICAgY29udGV4dCAtLSBzZXQgdG8gVHJ1ZSBmb3IgY29udGV4dHVhbCBkaWZmZXJlbmNlcyAoZGVmYXVsdHMgdG8gRmFsc2UKKyAgICAgICAgICAgIHdoaWNoIHNob3dzIGZ1bGwgZGlmZmVyZW5jZXMpLgorICAgICAgICBudW1saW5lcyAtLSBudW1iZXIgb2YgY29udGV4dCBsaW5lcy4gIFdoZW4gY29udGV4dCBpcyBzZXQgVHJ1ZSwKKyAgICAgICAgICAgIGNvbnRyb2xzIG51bWJlciBvZiBsaW5lcyBkaXNwbGF5ZWQgYmVmb3JlIGFuZCBhZnRlciB0aGUgY2hhbmdlLgorICAgICAgICAgICAgV2hlbiBjb250ZXh0IGlzIEZhbHNlLCBjb250cm9scyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIHBsYWNlCisgICAgICAgICAgICB0aGUgIm5leHQiIGxpbmsgYW5jaG9ycyBiZWZvcmUgdGhlIG5leHQgY2hhbmdlIChzbyBjbGljayBvZgorICAgICAgICAgICAgIm5leHQiIGxpbmsganVtcHMgdG8ganVzdCBiZWZvcmUgdGhlIGNoYW5nZSkuCisgICAgICAgICIiIgorCisgICAgICAgICMgbWFrZSB1bmlxdWUgYW5jaG9yIHByZWZpeGVzIHNvIHRoYXQgbXVsdGlwbGUgdGFibGVzIG1heSBleGlzdAorICAgICAgICAjIG9uIHRoZSBzYW1lIHBhZ2Ugd2l0aG91dCBjb25mbGljdC4KKyAgICAgICAgc2VsZi5fbWFrZV9wcmVmaXgoKQorCisgICAgICAgICMgY2hhbmdlIHRhYnMgdG8gc3BhY2VzIGJlZm9yZSBpdCBnZXRzIG1vcmUgZGlmZmljdWx0IGFmdGVyIHdlIGluc2VydAorICAgICAgICAjIG1hcmtrdXAKKyAgICAgICAgZnJvbWxpbmVzLHRvbGluZXMgPSBzZWxmLl90YWJfbmV3bGluZV9yZXBsYWNlKGZyb21saW5lcyx0b2xpbmVzKQorCisgICAgICAgICMgY3JlYXRlIGRpZmZzIGl0ZXJhdG9yIHdoaWNoIGdlbmVyYXRlcyBzaWRlIGJ5IHNpZGUgZnJvbS90byBkYXRhCisgICAgICAgIGlmIGNvbnRleHQ6CisgICAgICAgICAgICBjb250ZXh0X2xpbmVzID0gbnVtbGluZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbnRleHRfbGluZXMgPSBOb25lCisgICAgICAgIGRpZmZzID0gX21kaWZmKGZyb21saW5lcyx0b2xpbmVzLGNvbnRleHRfbGluZXMsbGluZWp1bms9c2VsZi5fbGluZWp1bmssCisgICAgICAgICAgICAgICAgICAgICAgY2hhcmp1bms9c2VsZi5fY2hhcmp1bmspCisKKyAgICAgICAgIyBzZXQgdXAgaXRlcmF0b3IgdG8gd3JhcCBsaW5lcyB0aGF0IGV4Y2VlZCBkZXNpcmVkIHdpZHRoCisgICAgICAgIGlmIHNlbGYuX3dyYXBjb2x1bW46CisgICAgICAgICAgICBkaWZmcyA9IHNlbGYuX2xpbmVfd3JhcHBlcihkaWZmcykKKworICAgICAgICAjIGNvbGxlY3QgdXAgZnJvbS90byBsaW5lcyBhbmQgZmxhZ3MgaW50byBsaXN0cyAoYWxzbyBmb3JtYXQgdGhlIGxpbmVzKQorICAgICAgICBmcm9tbGlzdCx0b2xpc3QsZmxhZ2xpc3QgPSBzZWxmLl9jb2xsZWN0X2xpbmVzKGRpZmZzKQorCisgICAgICAgICMgcHJvY2VzcyBjaGFuZ2UgZmxhZ3MsIGdlbmVyYXRpbmcgbWlkZGxlIGNvbHVtbiBvZiBuZXh0IGFuY2hvcnMvbGlua3MKKyAgICAgICAgZnJvbWxpc3QsdG9saXN0LGZsYWdsaXN0LG5leHRfaHJlZixuZXh0X2lkID0gc2VsZi5fY29udmVydF9mbGFncygKKyAgICAgICAgICAgIGZyb21saXN0LHRvbGlzdCxmbGFnbGlzdCxjb250ZXh0LG51bWxpbmVzKQorCisgICAgICAgIHMgPSBbXQorICAgICAgICBmbXQgPSAnICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiVzPiVzPC90ZD4lcycgKyBcCisgICAgICAgICAgICAgICc8dGQgY2xhc3M9ImRpZmZfbmV4dCI+JXM8L3RkPiVzPC90cj5cbicKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGZsYWdsaXN0KSk6CisgICAgICAgICAgICBpZiBmbGFnbGlzdFtpXSBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgbWRpZmYgeWllbGRzIE5vbmUgb24gc2VwYXJhdG9yIGxpbmVzIHNraXAgdGhlIGJvZ3VzIG9uZXMKKyAgICAgICAgICAgICAgICAjIGdlbmVyYXRlZCBmb3IgdGhlIGZpcnN0IGxpbmUKKyAgICAgICAgICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmQoJyAgICAgICAgPC90Ym9keT4gICAgICAgIFxuICAgICAgICA8dGJvZHk+XG4nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzLmFwcGVuZCggZm10ICUgKG5leHRfaWRbaV0sbmV4dF9ocmVmW2ldLGZyb21saXN0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRfaHJlZltpXSx0b2xpc3RbaV0pKQorICAgICAgICBpZiBmcm9tZGVzYyBvciB0b2Rlc2M6CisgICAgICAgICAgICBoZWFkZXJfcm93ID0gJzx0aGVhZD48dHI+JXMlcyVzJXM8L3RyPjwvdGhlYWQ+JyAlICgKKyAgICAgICAgICAgICAgICAnPHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+JywKKyAgICAgICAgICAgICAgICAnPHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+JXM8L3RoPicgJSBmcm9tZGVzYywKKyAgICAgICAgICAgICAgICAnPHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+JywKKyAgICAgICAgICAgICAgICAnPHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+JXM8L3RoPicgJSB0b2Rlc2MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkZXJfcm93ID0gJycKKworICAgICAgICB0YWJsZSA9IHNlbGYuX3RhYmxlX3RlbXBsYXRlICUgZGljdCgKKyAgICAgICAgICAgIGRhdGFfcm93cz0nJy5qb2luKHMpLAorICAgICAgICAgICAgaGVhZGVyX3Jvdz1oZWFkZXJfcm93LAorICAgICAgICAgICAgcHJlZml4PXNlbGYuX3ByZWZpeFsxXSkKKworICAgICAgICByZXR1cm4gdGFibGUucmVwbGFjZSgnXDArJywnPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4nKS4gXAorICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSgnXDAtJywnPHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4nKS4gXAorICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSgnXDBeJywnPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4nKS4gXAorICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZSgnXDEnLCc8L3NwYW4+JykuIFwKKyAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoJ1x0JywnJm5ic3A7JykKKworZGVsIHJlCisKK2RlZiByZXN0b3JlKGRlbHRhLCB3aGljaCk6CisgICAgciIiIgorICAgIEdlbmVyYXRlIG9uZSBvZiB0aGUgdHdvIHNlcXVlbmNlcyB0aGF0IGdlbmVyYXRlZCBhIGRlbHRhLgorCisgICAgR2l2ZW4gYSBgZGVsdGFgIHByb2R1Y2VkIGJ5IGBEaWZmZXIuY29tcGFyZSgpYCBvciBgbmRpZmYoKWAsIGV4dHJhY3QKKyAgICBsaW5lcyBvcmlnaW5hdGluZyBmcm9tIGZpbGUgMSBvciAyIChwYXJhbWV0ZXIgYHdoaWNoYCksIHN0cmlwcGluZyBvZmYgbGluZQorICAgIHByZWZpeGVzLgorCisgICAgRXhhbXBsZXM6CisKKyAgICA+Pj4gZGlmZiA9IG5kaWZmKCdvbmVcbnR3b1xudGhyZWVcbicuc3BsaXRsaW5lcygxKSwKKyAgICAuLi4gICAgICAgICAgICAgICdvcmVcbnRyZWVcbmVtdVxuJy5zcGxpdGxpbmVzKDEpKQorICAgID4+PiBkaWZmID0gbGlzdChkaWZmKQorICAgID4+PiBwcmludCAnJy5qb2luKHJlc3RvcmUoZGlmZiwgMSkpLAorICAgIG9uZQorICAgIHR3bworICAgIHRocmVlCisgICAgPj4+IHByaW50ICcnLmpvaW4ocmVzdG9yZShkaWZmLCAyKSksCisgICAgb3JlCisgICAgdHJlZQorICAgIGVtdQorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgdGFnID0gezE6ICItICIsIDI6ICIrICJ9W2ludCh3aGljaCldCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAoJ3Vua25vd24gZGVsdGEgY2hvaWNlIChtdXN0IGJlIDEgb3IgMik6ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB3aGljaCkKKyAgICBwcmVmaXhlcyA9ICgiICAiLCB0YWcpCisgICAgZm9yIGxpbmUgaW4gZGVsdGE6CisgICAgICAgIGlmIGxpbmVbOjJdIGluIHByZWZpeGVzOgorICAgICAgICAgICAgeWllbGQgbGluZVsyOl0KKworZGVmIF90ZXN0KCk6CisgICAgaW1wb3J0IGRvY3Rlc3QsIGRpZmZsaWIKKyAgICByZXR1cm4gZG9jdGVzdC50ZXN0bW9kKGRpZmZsaWIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaWZmbGliLnB5YyBiL2xpYi9weXRob24yLjcvZGlmZmxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyNjZmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlmZmxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaWZmbGliLnB5byBiL2xpYi9weXRob24yLjcvZGlmZmxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY3MzZlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlmZmxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXJjYWNoZS5weSBiL2xpYi9weXRob24yLjcvZGlyY2FjaGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0ZjBiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlyY2FjaGUucHkKQEAgLTAsMCArMSw0MSBAQAorIiIiUmVhZCBhbmQgY2FjaGUgZGlyZWN0b3J5IGxpc3RpbmdzLgorCitUaGUgbGlzdGRpcigpIHJvdXRpbmUgcmV0dXJucyBhIHNvcnRlZCBsaXN0IG9mIHRoZSBmaWxlcyBpbiBhIGRpcmVjdG9yeSwKK3VzaW5nIGEgY2FjaGUgdG8gYXZvaWQgcmVhZGluZyB0aGUgZGlyZWN0b3J5IG1vcmUgb2Z0ZW4gdGhhbiBuZWNlc3NhcnkuCitUaGUgYW5ub3RhdGUoKSByb3V0aW5lIGFwcGVuZHMgc2xhc2hlcyB0byBkaXJlY3Rvcmllcy4iIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIGRpcmNhY2hlIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworaW1wb3J0IG9zCisKK19fYWxsX18gPSBbImxpc3RkaXIiLCAib3BlbmRpciIsICJhbm5vdGF0ZSIsICJyZXNldCJdCisKK2NhY2hlID0ge30KKworZGVmIHJlc2V0KCk6CisgICAgIiIiUmVzZXQgdGhlIGNhY2hlIGNvbXBsZXRlbHkuIiIiCisgICAgZ2xvYmFsIGNhY2hlCisgICAgY2FjaGUgPSB7fQorCitkZWYgbGlzdGRpcihwYXRoKToKKyAgICAiIiJMaXN0IGRpcmVjdG9yeSBjb250ZW50cywgdXNpbmcgY2FjaGUuIiIiCisgICAgdHJ5OgorICAgICAgICBjYWNoZWRfbXRpbWUsIGxpc3QgPSBjYWNoZVtwYXRoXQorICAgICAgICBkZWwgY2FjaGVbcGF0aF0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGNhY2hlZF9tdGltZSwgbGlzdCA9IC0xLCBbXQorICAgIG10aW1lID0gb3Muc3RhdChwYXRoKS5zdF9tdGltZQorICAgIGlmIG10aW1lICE9IGNhY2hlZF9tdGltZToKKyAgICAgICAgbGlzdCA9IG9zLmxpc3RkaXIocGF0aCkKKyAgICAgICAgbGlzdC5zb3J0KCkKKyAgICBjYWNoZVtwYXRoXSA9IG10aW1lLCBsaXN0CisgICAgcmV0dXJuIGxpc3QKKworb3BlbmRpciA9IGxpc3RkaXIgIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCitkZWYgYW5ub3RhdGUoaGVhZCwgbGlzdCk6CisgICAgIiIiQWRkICcvJyBzdWZmaXhlcyB0byBkaXJlY3Rvcmllcy4iIiIKKyAgICBmb3IgaSBpbiByYW5nZShsZW4obGlzdCkpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihoZWFkLCBsaXN0W2ldKSk6CisgICAgICAgICAgICBsaXN0W2ldID0gbGlzdFtpXSArICcvJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXJjYWNoZS5weWMgYi9saWIvcHl0aG9uMi43L2RpcmNhY2hlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI1YzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXJjYWNoZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXJjYWNoZS5weW8gYi9saWIvcHl0aG9uMi43L2RpcmNhY2hlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjI1YzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXJjYWNoZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXMucHkgYi9saWIvcHl0aG9uMi43L2Rpcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWEwOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXMucHkKQEAgLTAsMCArMSwyMjQgQEAKKyIiIkRpc2Fzc2VtYmxlciBvZiBQeXRob24gYnl0ZSBjb2RlIGludG8gbW5lbW9uaWNzLiIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgdHlwZXMKKworZnJvbSBvcGNvZGUgaW1wb3J0ICoKK2Zyb20gb3Bjb2RlIGltcG9ydCBfX2FsbF9fIGFzIF9vcGNvZGVzX2FsbAorCitfX2FsbF9fID0gWyJkaXMiLCAiZGlzYXNzZW1ibGUiLCAiZGlzdGIiLCAiZGlzY28iLAorICAgICAgICAgICAiZmluZGxpbmVzdGFydHMiLCAiZmluZGxhYmVscyJdICsgX29wY29kZXNfYWxsCitkZWwgX29wY29kZXNfYWxsCisKK19oYXZlX2NvZGUgPSAodHlwZXMuTWV0aG9kVHlwZSwgdHlwZXMuRnVuY3Rpb25UeXBlLCB0eXBlcy5Db2RlVHlwZSwKKyAgICAgICAgICAgICAgdHlwZXMuQ2xhc3NUeXBlLCB0eXBlKQorCitkZWYgZGlzKHg9Tm9uZSk6CisgICAgIiIiRGlzYXNzZW1ibGUgY2xhc3NlcywgbWV0aG9kcywgZnVuY3Rpb25zLCBvciBjb2RlLgorCisgICAgV2l0aCBubyBhcmd1bWVudCwgZGlzYXNzZW1ibGUgdGhlIGxhc3QgdHJhY2ViYWNrLgorCisgICAgIiIiCisgICAgaWYgeCBpcyBOb25lOgorICAgICAgICBkaXN0YigpCisgICAgICAgIHJldHVybgorICAgIGlmIGlzaW5zdGFuY2UoeCwgdHlwZXMuSW5zdGFuY2VUeXBlKToKKyAgICAgICAgeCA9IHguX19jbGFzc19fCisgICAgaWYgaGFzYXR0cih4LCAnaW1fZnVuYycpOgorICAgICAgICB4ID0geC5pbV9mdW5jCisgICAgaWYgaGFzYXR0cih4LCAnZnVuY19jb2RlJyk6CisgICAgICAgIHggPSB4LmZ1bmNfY29kZQorICAgIGlmIGhhc2F0dHIoeCwgJ19fZGljdF9fJyk6CisgICAgICAgIGl0ZW1zID0geC5fX2RpY3RfXy5pdGVtcygpCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICBmb3IgbmFtZSwgeDEgaW4gaXRlbXM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgxLCBfaGF2ZV9jb2RlKToKKyAgICAgICAgICAgICAgICBwcmludCAiRGlzYXNzZW1ibHkgb2YgJXM6IiAlIG5hbWUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRpcyh4MSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJTb3JyeToiLCBtc2cKKyAgICAgICAgICAgICAgICBwcmludAorICAgIGVsaWYgaGFzYXR0cih4LCAnY29fY29kZScpOgorICAgICAgICBkaXNhc3NlbWJsZSh4KQorICAgIGVsaWYgaXNpbnN0YW5jZSh4LCBzdHIpOgorICAgICAgICBkaXNhc3NlbWJsZV9zdHJpbmcoeCkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgImRvbid0IGtub3cgaG93IHRvIGRpc2Fzc2VtYmxlICVzIG9iamVjdHMiICUgXAorICAgICAgICAgICAgICB0eXBlKHgpLl9fbmFtZV9fCisKK2RlZiBkaXN0Yih0Yj1Ob25lKToKKyAgICAiIiJEaXNhc3NlbWJsZSBhIHRyYWNlYmFjayAoZGVmYXVsdDogbGFzdCB0cmFjZWJhY2spLiIiIgorICAgIGlmIHRiIGlzIE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRiID0gc3lzLmxhc3RfdHJhY2ViYWNrCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIGxhc3QgdHJhY2ViYWNrIHRvIGRpc2Fzc2VtYmxlIgorICAgICAgICB3aGlsZSB0Yi50Yl9uZXh0OiB0YiA9IHRiLnRiX25leHQKKyAgICBkaXNhc3NlbWJsZSh0Yi50Yl9mcmFtZS5mX2NvZGUsIHRiLnRiX2xhc3RpKQorCitkZWYgZGlzYXNzZW1ibGUoY28sIGxhc3RpPS0xKToKKyAgICAiIiJEaXNhc3NlbWJsZSBhIGNvZGUgb2JqZWN0LiIiIgorICAgIGNvZGUgPSBjby5jb19jb2RlCisgICAgbGFiZWxzID0gZmluZGxhYmVscyhjb2RlKQorICAgIGxpbmVzdGFydHMgPSBkaWN0KGZpbmRsaW5lc3RhcnRzKGNvKSkKKyAgICBuID0gbGVuKGNvZGUpCisgICAgaSA9IDAKKyAgICBleHRlbmRlZF9hcmcgPSAwCisgICAgZnJlZSA9IE5vbmUKKyAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgYyA9IGNvZGVbaV0KKyAgICAgICAgb3AgPSBvcmQoYykKKyAgICAgICAgaWYgaSBpbiBsaW5lc3RhcnRzOgorICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICIlM2QiICUgbGluZXN0YXJ0c1tpXSwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICcgICAnLAorCisgICAgICAgIGlmIGkgPT0gbGFzdGk6IHByaW50ICctLT4nLAorICAgICAgICBlbHNlOiBwcmludCAnICAgJywKKyAgICAgICAgaWYgaSBpbiBsYWJlbHM6IHByaW50ICc+PicsCisgICAgICAgIGVsc2U6IHByaW50ICcgICcsCisgICAgICAgIHByaW50IHJlcHIoaSkucmp1c3QoNCksCisgICAgICAgIHByaW50IG9wbmFtZVtvcF0ubGp1c3QoMjApLAorICAgICAgICBpID0gaSsxCisgICAgICAgIGlmIG9wID49IEhBVkVfQVJHVU1FTlQ6CisgICAgICAgICAgICBvcGFyZyA9IG9yZChjb2RlW2ldKSArIG9yZChjb2RlW2krMV0pKjI1NiArIGV4dGVuZGVkX2FyZworICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gMAorICAgICAgICAgICAgaSA9IGkrMgorICAgICAgICAgICAgaWYgb3AgPT0gRVhURU5ERURfQVJHOgorICAgICAgICAgICAgICAgIGV4dGVuZGVkX2FyZyA9IG9wYXJnKjY1NTM2TAorICAgICAgICAgICAgcHJpbnQgcmVwcihvcGFyZykucmp1c3QoNSksCisgICAgICAgICAgICBpZiBvcCBpbiBoYXNjb25zdDoKKyAgICAgICAgICAgICAgICBwcmludCAnKCcgKyByZXByKGNvLmNvX2NvbnN0c1tvcGFyZ10pICsgJyknLAorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNuYW1lOgorICAgICAgICAgICAgICAgIHByaW50ICcoJyArIGNvLmNvX25hbWVzW29wYXJnXSArICcpJywKKyAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzanJlbDoKKyAgICAgICAgICAgICAgICBwcmludCAnKHRvICcgKyByZXByKGkgKyBvcGFyZykgKyAnKScsCisgICAgICAgICAgICBlbGlmIG9wIGluIGhhc2xvY2FsOgorICAgICAgICAgICAgICAgIHByaW50ICcoJyArIGNvLmNvX3Zhcm5hbWVzW29wYXJnXSArICcpJywKKyAgICAgICAgICAgIGVsaWYgb3AgaW4gaGFzY29tcGFyZToKKyAgICAgICAgICAgICAgICBwcmludCAnKCcgKyBjbXBfb3Bbb3BhcmddICsgJyknLAorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNmcmVlOgorICAgICAgICAgICAgICAgIGlmIGZyZWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZnJlZSA9IGNvLmNvX2NlbGx2YXJzICsgY28uY29fZnJlZXZhcnMKKyAgICAgICAgICAgICAgICBwcmludCAnKCcgKyBmcmVlW29wYXJnXSArICcpJywKKyAgICAgICAgcHJpbnQKKworZGVmIGRpc2Fzc2VtYmxlX3N0cmluZyhjb2RlLCBsYXN0aT0tMSwgdmFybmFtZXM9Tm9uZSwgbmFtZXM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzPU5vbmUpOgorICAgIGxhYmVscyA9IGZpbmRsYWJlbHMoY29kZSkKKyAgICBuID0gbGVuKGNvZGUpCisgICAgaSA9IDAKKyAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgYyA9IGNvZGVbaV0KKyAgICAgICAgb3AgPSBvcmQoYykKKyAgICAgICAgaWYgaSA9PSBsYXN0aTogcHJpbnQgJy0tPicsCisgICAgICAgIGVsc2U6IHByaW50ICcgICAnLAorICAgICAgICBpZiBpIGluIGxhYmVsczogcHJpbnQgJz4+JywKKyAgICAgICAgZWxzZTogcHJpbnQgJyAgJywKKyAgICAgICAgcHJpbnQgcmVwcihpKS5yanVzdCg0KSwKKyAgICAgICAgcHJpbnQgb3BuYW1lW29wXS5sanVzdCgxNSksCisgICAgICAgIGkgPSBpKzEKKyAgICAgICAgaWYgb3AgPj0gSEFWRV9BUkdVTUVOVDoKKyAgICAgICAgICAgIG9wYXJnID0gb3JkKGNvZGVbaV0pICsgb3JkKGNvZGVbaSsxXSkqMjU2CisgICAgICAgICAgICBpID0gaSsyCisgICAgICAgICAgICBwcmludCByZXByKG9wYXJnKS5yanVzdCg1KSwKKyAgICAgICAgICAgIGlmIG9wIGluIGhhc2NvbnN0OgorICAgICAgICAgICAgICAgIGlmIGNvbnN0YW50czoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJygnICsgcmVwcihjb25zdGFudHNbb3BhcmddKSArICcpJywKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnKCVkKSclb3BhcmcsCisgICAgICAgICAgICBlbGlmIG9wIGluIGhhc25hbWU6CisgICAgICAgICAgICAgICAgaWYgbmFtZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICcoJyArIG5hbWVzW29wYXJnXSArICcpJywKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnKCVkKSclb3BhcmcsCisgICAgICAgICAgICBlbGlmIG9wIGluIGhhc2pyZWw6CisgICAgICAgICAgICAgICAgcHJpbnQgJyh0byAnICsgcmVwcihpICsgb3BhcmcpICsgJyknLAorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNsb2NhbDoKKyAgICAgICAgICAgICAgICBpZiB2YXJuYW1lczoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJygnICsgdmFybmFtZXNbb3BhcmddICsgJyknLAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICcoJWQpJyAlIG9wYXJnLAorICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNjb21wYXJlOgorICAgICAgICAgICAgICAgIHByaW50ICcoJyArIGNtcF9vcFtvcGFyZ10gKyAnKScsCisgICAgICAgIHByaW50CisKK2Rpc2NvID0gZGlzYXNzZW1ibGUgICAgICAgICAgICAgICAgICAgICAjIFhYWCBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKworZGVmIGZpbmRsYWJlbHMoY29kZSk6CisgICAgIiIiRGV0ZWN0IGFsbCBvZmZzZXRzIGluIGEgYnl0ZSBjb2RlIHdoaWNoIGFyZSBqdW1wIHRhcmdldHMuCisKKyAgICBSZXR1cm4gdGhlIGxpc3Qgb2Ygb2Zmc2V0cy4KKworICAgICIiIgorICAgIGxhYmVscyA9IFtdCisgICAgbiA9IGxlbihjb2RlKQorICAgIGkgPSAwCisgICAgd2hpbGUgaSA8IG46CisgICAgICAgIGMgPSBjb2RlW2ldCisgICAgICAgIG9wID0gb3JkKGMpCisgICAgICAgIGkgPSBpKzEKKyAgICAgICAgaWYgb3AgPj0gSEFWRV9BUkdVTUVOVDoKKyAgICAgICAgICAgIG9wYXJnID0gb3JkKGNvZGVbaV0pICsgb3JkKGNvZGVbaSsxXSkqMjU2CisgICAgICAgICAgICBpID0gaSsyCisgICAgICAgICAgICBsYWJlbCA9IC0xCisgICAgICAgICAgICBpZiBvcCBpbiBoYXNqcmVsOgorICAgICAgICAgICAgICAgIGxhYmVsID0gaStvcGFyZworICAgICAgICAgICAgZWxpZiBvcCBpbiBoYXNqYWJzOgorICAgICAgICAgICAgICAgIGxhYmVsID0gb3BhcmcKKyAgICAgICAgICAgIGlmIGxhYmVsID49IDA6CisgICAgICAgICAgICAgICAgaWYgbGFiZWwgbm90IGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmFwcGVuZChsYWJlbCkKKyAgICByZXR1cm4gbGFiZWxzCisKK2RlZiBmaW5kbGluZXN0YXJ0cyhjb2RlKToKKyAgICAiIiJGaW5kIHRoZSBvZmZzZXRzIGluIGEgYnl0ZSBjb2RlIHdoaWNoIGFyZSBzdGFydCBvZiBsaW5lcyBpbiB0aGUgc291cmNlLgorCisgICAgR2VuZXJhdGUgcGFpcnMgKG9mZnNldCwgbGluZW5vKSBhcyBkZXNjcmliZWQgaW4gUHl0aG9uL2NvbXBpbGUuYy4KKworICAgICIiIgorICAgIGJ5dGVfaW5jcmVtZW50cyA9IFtvcmQoYykgZm9yIGMgaW4gY29kZS5jb19sbm90YWJbMDo6Ml1dCisgICAgbGluZV9pbmNyZW1lbnRzID0gW29yZChjKSBmb3IgYyBpbiBjb2RlLmNvX2xub3RhYlsxOjoyXV0KKworICAgIGxhc3RsaW5lbm8gPSBOb25lCisgICAgbGluZW5vID0gY29kZS5jb19maXJzdGxpbmVubworICAgIGFkZHIgPSAwCisgICAgZm9yIGJ5dGVfaW5jciwgbGluZV9pbmNyIGluIHppcChieXRlX2luY3JlbWVudHMsIGxpbmVfaW5jcmVtZW50cyk6CisgICAgICAgIGlmIGJ5dGVfaW5jcjoKKyAgICAgICAgICAgIGlmIGxpbmVubyAhPSBsYXN0bGluZW5vOgorICAgICAgICAgICAgICAgIHlpZWxkIChhZGRyLCBsaW5lbm8pCisgICAgICAgICAgICAgICAgbGFzdGxpbmVubyA9IGxpbmVubworICAgICAgICAgICAgYWRkciArPSBieXRlX2luY3IKKyAgICAgICAgbGluZW5vICs9IGxpbmVfaW5jcgorICAgIGlmIGxpbmVubyAhPSBsYXN0bGluZW5vOgorICAgICAgICB5aWVsZCAoYWRkciwgbGluZW5vKQorCitkZWYgX3Rlc3QoKToKKyAgICAiIiJTaW1wbGUgdGVzdCBwcm9ncmFtIHRvIGRpc2Fzc2VtYmxlIGEgZmlsZS4iIiIKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIGlmIHN5cy5hcmd2WzI6XToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInVzYWdlOiBweXRob24gZGlzLnB5IFstfGZpbGVdXG4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICAgICAgZm4gPSBzeXMuYXJndlsxXQorICAgICAgICBpZiBub3QgZm4gb3IgZm4gPT0gIi0iOgorICAgICAgICAgICAgZm4gPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgZm4gPSBOb25lCisgICAgaWYgZm4gaXMgTm9uZToKKyAgICAgICAgZiA9IHN5cy5zdGRpbgorICAgIGVsc2U6CisgICAgICAgIGYgPSBvcGVuKGZuKQorICAgIHNvdXJjZSA9IGYucmVhZCgpCisgICAgaWYgZm4gaXMgbm90IE5vbmU6CisgICAgICAgIGYuY2xvc2UoKQorICAgIGVsc2U6CisgICAgICAgIGZuID0gIjxzdGRpbj4iCisgICAgY29kZSA9IGNvbXBpbGUoc291cmNlLCBmbiwgImV4ZWMiKQorICAgIGRpcyhjb2RlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzLnB5YyBiL2xpYi9weXRob24yLjcvZGlzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBiNzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzLnB5byBiL2xpYi9weXRob24yLjcvZGlzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBiNzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL1JFQURNRSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhhMjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvUkVBRE1FCkBAIC0wLDAgKzEsMTMgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBEaXN0dXRpbHMgcGFja2FnZS4KKworVGhlcmUncyBhIGZ1bGwgZG9jdW1lbnRhdGlvbiBhdmFpbGFibGUgYXQ6CisKKyAgICBodHRwOi8vZG9jcy5weXRob24ub3JnL2Rpc3R1dGlscy8KKworVGhlIERpc3R1dGlscy1TSUcgd2ViIHBhZ2UgaXMgYWxzbyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQ6CisKKyAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2lncy9kaXN0dXRpbHMtc2lnLworCitXQVJOSU5HIDogRGlzdHV0aWxzIG11c3QgcmVtYWluIGNvbXBhdGlibGUgd2l0aCAyLjMKKworJElkJApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY0YmIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvX19pbml0X18ucHkKQEAgLTAsMCArMSwxOSBAQAorIiIiZGlzdHV0aWxzCisKK1RoZSBtYWluIHBhY2thZ2UgZm9yIHRoZSBQeXRob24gTW9kdWxlIERpc3RyaWJ1dGlvbiBVdGlsaXRpZXMuICBOb3JtYWxseQordXNlZCBmcm9tIGEgc2V0dXAgc2NyaXB0IGFzCisKKyAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCisKKyAgIHNldHVwICguLi4pCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKKyMgRGlzdHV0aWxzIHZlcnNpb24KKyMKKyMgVXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBQeXRob24gcmVsZWFzZSBwcm9jZXNzLgorIworIy0tc3RhcnQgY29uc3RhbnRzLS0KK19fdmVyc2lvbl9fID0gIjIuNy41IgorIy0tZW5kIGNvbnN0YW50cy0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmYTE4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmYTE4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0YjcyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weQpAQCAtMCwwICsxLDI0MyBAQAorIiIiZGlzdHV0aWxzLmFyY2hpdmVfdXRpbAorCitVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgY3JlYXRpbmcgYXJjaGl2ZSBmaWxlcyAodGFyYmFsbHMsIHppcCBmaWxlcywKK3RoYXQgc29ydCBvZiB0aGluZykuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KK2ltcG9ydCBzeXMKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IG1rcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCit0cnk6CisgICAgZnJvbSBwd2QgaW1wb3J0IGdldHB3bmFtCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZ2V0cHduYW0gPSBOb25lCisKK3RyeToKKyAgICBmcm9tIGdycCBpbXBvcnQgZ2V0Z3JuYW0KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnZXRncm5hbSA9IE5vbmUKKworZGVmIF9nZXRfZ2lkKG5hbWUpOgorICAgICIiIlJldHVybnMgYSBnaWQsIGdpdmVuIGEgZ3JvdXAgbmFtZS4iIiIKKyAgICBpZiBnZXRncm5hbSBpcyBOb25lIG9yIG5hbWUgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0cnk6CisgICAgICAgIHJlc3VsdCA9IGdldGdybmFtKG5hbWUpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gcmVzdWx0WzJdCisgICAgcmV0dXJuIE5vbmUKKworZGVmIF9nZXRfdWlkKG5hbWUpOgorICAgICIiIlJldHVybnMgYW4gdWlkLCBnaXZlbiBhIHVzZXIgbmFtZS4iIiIKKyAgICBpZiBnZXRwd25hbSBpcyBOb25lIG9yIG5hbWUgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0cnk6CisgICAgICAgIHJlc3VsdCA9IGdldHB3bmFtKG5hbWUpCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gcmVzdWx0WzJdCisgICAgcmV0dXJuIE5vbmUKKworZGVmIG1ha2VfdGFyYmFsbChiYXNlX25hbWUsIGJhc2VfZGlyLCBjb21wcmVzcz0iZ3ppcCIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLAorICAgICAgICAgICAgICAgICBvd25lcj1Ob25lLCBncm91cD1Ob25lKToKKyAgICAiIiJDcmVhdGUgYSAocG9zc2libHkgY29tcHJlc3NlZCkgdGFyIGZpbGUgZnJvbSBhbGwgdGhlIGZpbGVzIHVuZGVyCisgICAgJ2Jhc2VfZGlyJy4KKworICAgICdjb21wcmVzcycgbXVzdCBiZSAiZ3ppcCIgKHRoZSBkZWZhdWx0KSwgImNvbXByZXNzIiwgImJ6aXAyIiwgb3IgTm9uZS4KKyAgICAoY29tcHJlc3Mgd2lsbCBiZSBkZXByZWNhdGVkIGluIFB5dGhvbiAzLjIpCisKKyAgICAnb3duZXInIGFuZCAnZ3JvdXAnIGNhbiBiZSB1c2VkIHRvIGRlZmluZSBhbiBvd25lciBhbmQgYSBncm91cCBmb3IgdGhlCisgICAgYXJjaGl2ZSB0aGF0IGlzIGJlaW5nIGJ1aWx0LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IG93bmVyIGFuZCBncm91cAorICAgIHdpbGwgYmUgdXNlZC4KKworICAgIFRoZSBvdXRwdXQgdGFyIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9kaXInICsgICIudGFyIiwgcG9zc2libHkgcGx1cworICAgIHRoZSBhcHByb3ByaWF0ZSBjb21wcmVzc2lvbiBleHRlbnNpb24gKCIuZ3oiLCAiLmJ6MiIgb3IgIi5aIikuCisKKyAgICBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZW5hbWUuCisgICAgIiIiCisgICAgdGFyX2NvbXByZXNzaW9uID0geydnemlwJzogJ2d6JywgJ2J6aXAyJzogJ2J6MicsIE5vbmU6ICcnLCAnY29tcHJlc3MnOiAnJ30KKyAgICBjb21wcmVzc19leHQgPSB7J2d6aXAnOiAnLmd6JywgJ2J6aXAyJzogJy5iejInLCAnY29tcHJlc3MnOiAnLlonfQorCisgICAgIyBmbGFncyBmb3IgY29tcHJlc3Npb24gcHJvZ3JhbSwgZWFjaCBlbGVtZW50IG9mIGxpc3Qgd2lsbCBiZSBhbiBhcmd1bWVudAorICAgIGlmIGNvbXByZXNzIGlzIG5vdCBOb25lIGFuZCBjb21wcmVzcyBub3QgaW4gY29tcHJlc3NfZXh0LmtleXMoKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAoImJhZCB2YWx1ZSBmb3IgJ2NvbXByZXNzJzogbXVzdCBiZSBOb25lLCAnZ3ppcCcsICdiemlwMicgIgorICAgICAgICAgICAgICAgIm9yICdjb21wcmVzcyciKQorCisgICAgYXJjaGl2ZV9uYW1lID0gYmFzZV9uYW1lICsgJy50YXInCisgICAgaWYgY29tcHJlc3MgIT0gJ2NvbXByZXNzJzoKKyAgICAgICAgYXJjaGl2ZV9uYW1lICs9IGNvbXByZXNzX2V4dC5nZXQoY29tcHJlc3MsICcnKQorCisgICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZShhcmNoaXZlX25hbWUpLCBkcnlfcnVuPWRyeV9ydW4pCisKKyAgICAjIGNyZWF0aW5nIHRoZSB0YXJiYWxsCisgICAgaW1wb3J0IHRhcmZpbGUgICMgbGF0ZSBpbXBvcnQgc28gUHl0aG9uIGJ1aWxkIGl0c2VsZiBkb2Vzbid0IGJyZWFrCisKKyAgICBsb2cuaW5mbygnQ3JlYXRpbmcgdGFyIGFyY2hpdmUnKQorCisgICAgdWlkID0gX2dldF91aWQob3duZXIpCisgICAgZ2lkID0gX2dldF9naWQoZ3JvdXApCisKKyAgICBkZWYgX3NldF91aWRfZ2lkKHRhcmluZm8pOgorICAgICAgICBpZiBnaWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0YXJpbmZvLmdpZCA9IGdpZAorICAgICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGdyb3VwCisgICAgICAgIGlmIHVpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRhcmluZm8udWlkID0gdWlkCisgICAgICAgICAgICB0YXJpbmZvLnVuYW1lID0gb3duZXIKKyAgICAgICAgcmV0dXJuIHRhcmluZm8KKworICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lLCAnd3wlcycgJSB0YXJfY29tcHJlc3Npb25bY29tcHJlc3NdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXIuYWRkKGJhc2VfZGlyLCBmaWx0ZXI9X3NldF91aWRfZ2lkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICMgY29tcHJlc3Npb24gdXNpbmcgYGNvbXByZXNzYAorICAgIGlmIGNvbXByZXNzID09ICdjb21wcmVzcyc6CisgICAgICAgIHdhcm4oIidjb21wcmVzcycgd2lsbCBiZSBkZXByZWNhdGVkLiIsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICMgdGhlIG9wdGlvbiB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybQorICAgICAgICBjb21wcmVzc2VkX25hbWUgPSBhcmNoaXZlX25hbWUgKyBjb21wcmVzc19leHRbY29tcHJlc3NdCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgY21kID0gW2NvbXByZXNzLCBhcmNoaXZlX25hbWUsIGNvbXByZXNzZWRfbmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZCA9IFtjb21wcmVzcywgJy1mJywgYXJjaGl2ZV9uYW1lXQorICAgICAgICBzcGF3bihjbWQsIGRyeV9ydW49ZHJ5X3J1bikKKyAgICAgICAgcmV0dXJuIGNvbXByZXNzZWRfbmFtZQorCisgICAgcmV0dXJuIGFyY2hpdmVfbmFtZQorCitkZWYgbWFrZV96aXBmaWxlKGJhc2VfbmFtZSwgYmFzZV9kaXIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wKToKKyAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4KKworICAgIFRoZSBvdXRwdXQgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9uYW1lJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZQorICAgICJ6aXBmaWxlIiBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQICJ6aXAiIHV0aWxpdHkKKyAgICAoaWYgaW5zdGFsbGVkIGFuZCBmb3VuZCBvbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCkuICBJZiBuZWl0aGVyIHRvb2wgaXMKKyAgICBhdmFpbGFibGUsIHJhaXNlcyBEaXN0dXRpbHNFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwCisgICAgZmlsZS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB6aXBmaWxlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICB6aXBmaWxlID0gTm9uZQorCisgICAgemlwX2ZpbGVuYW1lID0gYmFzZV9uYW1lICsgIi56aXAiCisgICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZSh6aXBfZmlsZW5hbWUpLCBkcnlfcnVuPWRyeV9ydW4pCisKKyAgICAjIElmIHppcGZpbGUgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUsIHRyeSBzcGF3bmluZyBhbiBleHRlcm5hbAorICAgICMgJ3ppcCcgY29tbWFuZC4KKyAgICBpZiB6aXBmaWxlIGlzIE5vbmU6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICB6aXBvcHRpb25zID0gIi1yIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemlwb3B0aW9ucyA9ICItcnEiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3Bhd24oWyJ6aXAiLCB6aXBvcHRpb25zLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyXSwKKyAgICAgICAgICAgICAgICAgIGRyeV9ydW49ZHJ5X3J1bikKKyAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvcjoKKyAgICAgICAgICAgICMgWFhYIHJlYWxseSBzaG91bGQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAiY291bGRuJ3QgZmluZAorICAgICAgICAgICAgIyBleHRlcm5hbCAnemlwJyBjb21tYW5kIiBhbmQgInppcCBmYWlsZWQiLgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAoInVuYWJsZSB0byBjcmVhdGUgemlwIGZpbGUgJyVzJzogIgorICAgICAgICAgICAgICAgICAgICJjb3VsZCBuZWl0aGVyIGltcG9ydCB0aGUgJ3ppcGZpbGUnIG1vZHVsZSBub3IgIgorICAgICAgICAgICAgICAgICAgICJmaW5kIGEgc3RhbmRhbG9uZSB6aXAgdXRpbGl0eSIpICUgemlwX2ZpbGVuYW1lCisKKyAgICBlbHNlOgorICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgJyVzJyBhbmQgYWRkaW5nICclcycgdG8gaXQiLAorICAgICAgICAgICAgICAgICB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQorCisgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGJhc2VfZGlyKToKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUocGF0aCwgcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJhZGRpbmcgJyVzJyIgJSBwYXRoKQorICAgICAgICAgICAgemlwLmNsb3NlKCkKKworICAgIHJldHVybiB6aXBfZmlsZW5hbWUKKworQVJDSElWRV9GT1JNQVRTID0geworICAgICdnenRhcic6IChtYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2d6aXAnKV0sICJnemlwJ2VkIHRhci1maWxlIiksCisgICAgJ2J6dGFyJzogKG1ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnYnppcDInKV0sICJiemlwMidlZCB0YXItZmlsZSIpLAorICAgICd6dGFyJzogIChtYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgJ2NvbXByZXNzJyldLCAiY29tcHJlc3NlZCB0YXIgZmlsZSIpLAorICAgICd0YXInOiAgIChtYWtlX3RhcmJhbGwsIFsoJ2NvbXByZXNzJywgTm9uZSldLCAidW5jb21wcmVzc2VkIHRhciBmaWxlIiksCisgICAgJ3ppcCc6ICAgKG1ha2VfemlwZmlsZSwgW10sIlpJUCBmaWxlIikKKyAgICB9CisKK2RlZiBjaGVja19hcmNoaXZlX2Zvcm1hdHMoZm9ybWF0cyk6CisgICAgIiIiUmV0dXJucyB0aGUgZmlyc3QgZm9ybWF0IGZyb20gdGhlICdmb3JtYXQnIGxpc3QgdGhhdCBpcyB1bmtub3duLgorCisgICAgSWYgYWxsIGZvcm1hdHMgYXJlIGtub3duLCByZXR1cm5zIE5vbmUKKyAgICAiIiIKKyAgICBmb3IgZm9ybWF0IGluIGZvcm1hdHM6CisgICAgICAgIGlmIGZvcm1hdCBub3QgaW4gQVJDSElWRV9GT1JNQVRTOgorICAgICAgICAgICAgcmV0dXJuIGZvcm1hdAorICAgIHJldHVybiBOb25lCisKK2RlZiBtYWtlX2FyY2hpdmUoYmFzZV9uYW1lLCBmb3JtYXQsIHJvb3RfZGlyPU5vbmUsIGJhc2VfZGlyPU5vbmUsIHZlcmJvc2U9MCwKKyAgICAgICAgICAgICAgICAgZHJ5X3J1bj0wLCBvd25lcj1Ob25lLCBncm91cD1Ob25lKToKKyAgICAiIiJDcmVhdGUgYW4gYXJjaGl2ZSBmaWxlIChlZy4gemlwIG9yIHRhcikuCisKKyAgICAnYmFzZV9uYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBjcmVhdGUsIG1pbnVzIGFueSBmb3JtYXQtc3BlY2lmaWMKKyAgICBleHRlbnNpb247ICdmb3JtYXQnIGlzIHRoZSBhcmNoaXZlIGZvcm1hdDogb25lIG9mICJ6aXAiLCAidGFyIiwgInp0YXIiLAorICAgIG9yICJnenRhciIuCisKKyAgICAncm9vdF9kaXInIGlzIGEgZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlCisgICAgYXJjaGl2ZTsgaWUuIHdlIHR5cGljYWxseSBjaGRpciBpbnRvICdyb290X2RpcicgYmVmb3JlIGNyZWF0aW5nIHRoZQorICAgIGFyY2hpdmUuICAnYmFzZV9kaXInIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgd2Ugc3RhcnQgYXJjaGl2aW5nIGZyb207CisgICAgaWUuICdiYXNlX2Rpcicgd2lsbCBiZSB0aGUgY29tbW9uIHByZWZpeCBvZiBhbGwgZmlsZXMgYW5kCisgICAgZGlyZWN0b3JpZXMgaW4gdGhlIGFyY2hpdmUuICAncm9vdF9kaXInIGFuZCAnYmFzZV9kaXInIGJvdGggZGVmYXVsdAorICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGFyY2hpdmUgZmlsZS4KKworICAgICdvd25lcicgYW5kICdncm91cCcgYXJlIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBhcmNoaXZlLiBCeSBkZWZhdWx0LAorICAgIHVzZXMgdGhlIGN1cnJlbnQgb3duZXIgYW5kIGdyb3VwLgorICAgICIiIgorICAgIHNhdmVfY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICBpZiByb290X2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgbG9nLmRlYnVnKCJjaGFuZ2luZyBpbnRvICclcyciLCByb290X2RpcikKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5hYnNwYXRoKGJhc2VfbmFtZSkKKyAgICAgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgICAgICBvcy5jaGRpcihyb290X2RpcikKKworICAgIGlmIGJhc2VfZGlyIGlzIE5vbmU6CisgICAgICAgIGJhc2VfZGlyID0gb3MuY3VyZGlyCisKKyAgICBrd2FyZ3MgPSB7J2RyeV9ydW4nOiBkcnlfcnVufQorCisgICAgdHJ5OgorICAgICAgICBmb3JtYXRfaW5mbyA9IEFSQ0hJVkVfRk9STUFUU1tmb3JtYXRdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5rbm93biBhcmNoaXZlIGZvcm1hdCAnJXMnIiAlIGZvcm1hdAorCisgICAgZnVuYyA9IGZvcm1hdF9pbmZvWzBdCisgICAgZm9yIGFyZywgdmFsIGluIGZvcm1hdF9pbmZvWzFdOgorICAgICAgICBrd2FyZ3NbYXJnXSA9IHZhbAorCisgICAgaWYgZm9ybWF0ICE9ICd6aXAnOgorICAgICAgICBrd2FyZ3NbJ293bmVyJ10gPSBvd25lcgorICAgICAgICBrd2FyZ3NbJ2dyb3VwJ10gPSBncm91cAorCisgICAgdHJ5OgorICAgICAgICBmaWxlbmFtZSA9IGZ1bmMoYmFzZV9uYW1lLCBiYXNlX2RpciwgKiprd2FyZ3MpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsb2cuZGVidWcoImNoYW5naW5nIGJhY2sgdG8gJyVzJyIsIHNhdmVfY3dkKQorICAgICAgICAgICAgb3MuY2hkaXIoc2F2ZV9jd2QpCisKKyAgICByZXR1cm4gZmlsZW5hbWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYWI3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2FyY2hpdmVfdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYWI3ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9hcmNoaXZlX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZlN2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvYmNwcGNvbXBpbGVyLnB5CkBAIC0wLDAgKzEsMzk0IEBACisiIiJkaXN0dXRpbHMuYmNwcGNvbXBpbGVyCisKK0NvbnRhaW5zIEJvcmxhbmRDQ29tcGlsZXIsIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBDQ29tcGlsZXIgY2xhc3MKK2ZvciB0aGUgQm9ybGFuZCBDKysgY29tcGlsZXIuCisiIiIKKworIyBUaGlzIGltcGxlbWVudGF0aW9uIGJ5IEx5bGUgSm9obnNvbiwgYmFzZWQgb24gdGhlIG9yaWdpbmFsIG1zdmNjb21waWxlci5weQorIyBtb2R1bGUgYW5kIHVzaW5nIHRoZSBkaXJlY3Rpb25zIG9yaWdpbmFsbHkgcHVibGlzaGVkIGJ5IEdvcmRvbiBXaWxsaWFtcy4KKworIyBYWFggbG9va3MgbGlrZSB0aGVyZSdzIGEgTE9UIG9mIG92ZXJsYXAgYmV0d2VlbiB0aGVzZSB0d28gY2xhc3NlczoKKyMgc29tZW9uZSBzaG91bGQgc2l0IGRvd24gYW5kIGZhY3RvciBvdXQgdGhlIGNvbW1vbiBjb2RlIGFzCisjIFdpbmRvd3NDQ29tcGlsZXIhICAtLUdQVworCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKERpc3R1dGlsc0V4ZWNFcnJvciwgQ29tcGlsZUVycm9yLCBMaWJFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtFcnJvciwgVW5rbm93bkZpbGVFcnJvcikKK2Zyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgQ0NvbXBpbGVyLCBnZW5fcHJlcHJvY2Vzc19vcHRpb25zCitmcm9tIGRpc3R1dGlscy5maWxlX3V0aWwgaW1wb3J0IHdyaXRlX2ZpbGUKK2Zyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyBCQ1BQQ29tcGlsZXIoQ0NvbXBpbGVyKSA6CisgICAgIiIiQ29uY3JldGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGFuIGludGVyZmFjZSB0byB0aGUgQm9ybGFuZCBDL0MrKworICAgIGNvbXBpbGVyLCBhcyBkZWZpbmVkIGJ5IHRoZSBDQ29tcGlsZXIgYWJzdHJhY3QgY2xhc3MuCisgICAgIiIiCisKKyAgICBjb21waWxlcl90eXBlID0gJ2JjcHAnCisKKyAgICAjIEp1c3Qgc2V0IHRoaXMgc28gQ0NvbXBpbGVyJ3MgY29uc3RydWN0b3IgZG9lc24ndCBiYXJmLiAgV2UgY3VycmVudGx5CisgICAgIyBkb24ndCB1c2UgdGhlICdzZXRfZXhlY3V0YWJsZXMoKScgYnVyZWF1Y3JhY3kgcHJvdmlkZWQgYnkgQ0NvbXBpbGVyLAorICAgICMgYXMgaXQgcmVhbGx5IGlzbid0IG5lY2Vzc2FyeSBmb3IgdGhpcyBzb3J0IG9mIHNpbmdsZS1jb21waWxlciBjbGFzcy4KKyAgICAjIFdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHdpdGggVW5peENDb21waWxlciwKKyAgICAjIHRob3VnaCwgc28gaXQncyB3b3J0aCB0aGlua2luZyBhYm91dC4KKyAgICBleGVjdXRhYmxlcyA9IHt9CisKKyAgICAjIFByaXZhdGUgY2xhc3MgZGF0YSAobmVlZCB0byBkaXN0aW5ndWlzaCBDIGZyb20gQysrIHNvdXJjZSBmb3IgY29tcGlsZXIpCisgICAgX2NfZXh0ZW5zaW9ucyA9IFsnLmMnXQorICAgIF9jcHBfZXh0ZW5zaW9ucyA9IFsnLmNjJywgJy5jcHAnLCAnLmN4eCddCisKKyAgICAjIE5lZWRlZCBmb3IgdGhlIGZpbGVuYW1lIGdlbmVyYXRpb24gbWV0aG9kcyBwcm92aWRlZCBieSB0aGUKKyAgICAjIGJhc2UgY2xhc3MsIENDb21waWxlci4KKyAgICBzcmNfZXh0ZW5zaW9ucyA9IF9jX2V4dGVuc2lvbnMgKyBfY3BwX2V4dGVuc2lvbnMKKyAgICBvYmpfZXh0ZW5zaW9uID0gJy5vYmonCisgICAgc3RhdGljX2xpYl9leHRlbnNpb24gPSAnLmxpYicKKyAgICBzaGFyZWRfbGliX2V4dGVuc2lvbiA9ICcuZGxsJworICAgIHN0YXRpY19saWJfZm9ybWF0ID0gc2hhcmVkX2xpYl9mb3JtYXQgPSAnJXMlcycKKyAgICBleGVfZXh0ZW5zaW9uID0gJy5leGUnCisKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwKKyAgICAgICAgICAgICAgICAgIHZlcmJvc2U9MCwKKyAgICAgICAgICAgICAgICAgIGRyeV9ydW49MCwKKyAgICAgICAgICAgICAgICAgIGZvcmNlPTApOgorCisgICAgICAgIENDb21waWxlci5fX2luaXRfXyAoc2VsZiwgdmVyYm9zZSwgZHJ5X3J1biwgZm9yY2UpCisKKyAgICAgICAgIyBUaGVzZSBleGVjdXRhYmxlcyBhcmUgYXNzdW1lZCB0byBhbGwgYmUgaW4gdGhlIHBhdGguCisgICAgICAgICMgQm9ybGFuZCBkb2Vzbid0IHNlZW0gdG8gdXNlIGFueSBzcGVjaWFsIHJlZ2lzdHJ5IHNldHRpbmdzIHRvCisgICAgICAgICMgaW5kaWNhdGUgdGhlaXIgaW5zdGFsbGF0aW9uIGxvY2F0aW9ucy4KKworICAgICAgICBzZWxmLmNjID0gImJjYzMyLmV4ZSIKKyAgICAgICAgc2VsZi5saW5rZXIgPSAiaWxpbmszMi5leGUiCisgICAgICAgIHNlbGYubGliID0gInRsaWIuZXhlIgorCisgICAgICAgIHNlbGYucHJlcHJvY2Vzc19vcHRpb25zID0gTm9uZQorICAgICAgICBzZWxmLmNvbXBpbGVfb3B0aW9ucyA9IFsnL3RXTScsICcvTzInLCAnL3EnLCAnL2cwJ10KKyAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnNfZGVidWcgPSBbJy90V00nLCAnL09kJywgJy9xJywgJy9nMCddCisKKyAgICAgICAgc2VsZi5sZGZsYWdzX3NoYXJlZCA9IFsnL1RwZCcsICcvR24nLCAnL3EnLCAnL3gnXQorICAgICAgICBzZWxmLmxkZmxhZ3Nfc2hhcmVkX2RlYnVnID0gWycvVHBkJywgJy9HbicsICcvcScsICcveCddCisgICAgICAgIHNlbGYubGRmbGFnc19zdGF0aWMgPSBbXQorICAgICAgICBzZWxmLmxkZmxhZ3NfZXhlID0gWycvR24nLCAnL3EnLCAnL3gnXQorICAgICAgICBzZWxmLmxkZmxhZ3NfZXhlX2RlYnVnID0gWycvR24nLCAnL3EnLCAnL3gnLCcvciddCisKKworICAgICMgLS0gV29ya2VyIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgY29tcGlsZShzZWxmLCBzb3VyY2VzLAorICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9Tm9uZSwgbWFjcm9zPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLCBkZWJ1Zz0wLAorICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgZGVwZW5kcz1Ob25lKToKKworICAgICAgICBtYWNyb3MsIG9iamVjdHMsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzLCBidWlsZCA9IFwKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXR1cF9jb21waWxlKG91dHB1dF9kaXIsIG1hY3JvcywgaW5jbHVkZV9kaXJzLCBzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcywgZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgIGNvbXBpbGVfb3B0cyA9IGV4dHJhX3ByZWFyZ3Mgb3IgW10KKyAgICAgICAgY29tcGlsZV9vcHRzLmFwcGVuZCAoJy1jJykKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICBjb21waWxlX29wdHMuZXh0ZW5kIChzZWxmLmNvbXBpbGVfb3B0aW9uc19kZWJ1ZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbXBpbGVfb3B0cy5leHRlbmQgKHNlbGYuY29tcGlsZV9vcHRpb25zKQorCisgICAgICAgIGZvciBvYmogaW4gb2JqZWN0czoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzcmMsIGV4dCA9IGJ1aWxkW29ial0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBYWFggd2h5IGRvIHRoZSBub3JtcGF0aCBoZXJlPworICAgICAgICAgICAgc3JjID0gb3MucGF0aC5ub3JtcGF0aChzcmMpCisgICAgICAgICAgICBvYmogPSBvcy5wYXRoLm5vcm1wYXRoKG9iaikKKyAgICAgICAgICAgICMgWFhYIF9zZXR1cF9jb21waWxlKCkgZGlkIGEgbWtwYXRoKCkgdG9vIGJ1dCBiZWZvcmUgdGhlIG5vcm1wYXRoLgorICAgICAgICAgICAgIyBJcyBpdCBwb3NzaWJsZSB0byBza2lwIHRoZSBub3JtcGF0aD8KKyAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZShvYmopKQorCisgICAgICAgICAgICBpZiBleHQgPT0gJy5yZXMnOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhbHJlYWR5IGEgYmluYXJ5IGZpbGUgLS0gc2tpcCBpdC4KKyAgICAgICAgICAgICAgICBjb250aW51ZSAjIHRoZSAnZm9yJyBsb29wCisgICAgICAgICAgICBpZiBleHQgPT0gJy5yYyc6CisgICAgICAgICAgICAgICAgIyBUaGlzIG5lZWRzIHRvIGJlIGNvbXBpbGVkIHRvIGEgLnJlcyBmaWxlIC0tIGRvIGl0IG5vdy4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFsiYnJjYzMyIiwgIi1mbyIsIG9iaiwgc3JjXSkKKyAgICAgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisgICAgICAgICAgICAgICAgY29udGludWUgIyB0aGUgJ2ZvcicgbG9vcAorCisgICAgICAgICAgICAjIFRoZSBuZXh0IHR3byBhcmUgYm90aCBmb3IgdGhlIHJlYWwgY29tcGlsZXIuCisgICAgICAgICAgICBpZiBleHQgaW4gc2VsZi5fY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIGlucHV0X29wdCA9ICIiCisgICAgICAgICAgICBlbGlmIGV4dCBpbiBzZWxmLl9jcHBfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSAiLVAiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVW5rbm93biBmaWxlIHR5cGUgLS0gbm8gZXh0cmEgb3B0aW9ucy4gIFRoZSBjb21waWxlcgorICAgICAgICAgICAgICAgICMgd2lsbCBwcm9iYWJseSBmYWlsLCBidXQgbGV0IGl0IGp1c3QgaW4gY2FzZSB0aGlzIGlzIGEKKyAgICAgICAgICAgICAgICAjIGZpbGUgdGhlIGNvbXBpbGVyIHJlY29nbml6ZXMgZXZlbiBpZiB3ZSBkb24ndC4KKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSAiIgorCisgICAgICAgICAgICBvdXRwdXRfb3B0ID0gIi1vIiArIG9iagorCisgICAgICAgICAgICAjIENvbXBpbGVyIGNvbW1hbmQgbGluZSBzeW50YXggaXM6ICJiY2MzMiBbb3B0aW9uc10gZmlsZShzKSIuCisgICAgICAgICAgICAjIE5vdGUgdGhhdCB0aGUgc291cmNlIGZpbGUgbmFtZXMgbXVzdCBhcHBlYXIgYXQgdGhlIGVuZCBvZgorICAgICAgICAgICAgIyB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLmNjXSArIGNvbXBpbGVfb3B0cyArIHBwX29wdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dF9vcHQsIG91dHB1dF9vcHRdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncyArIFtzcmNdKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisKKyAgICAgICAgcmV0dXJuIG9iamVjdHMKKworICAgICMgY29tcGlsZSAoKQorCisKKyAgICBkZWYgY3JlYXRlX3N0YXRpY19saWIgKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2xpYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CisKKyAgICAgICAgKG9iamVjdHMsIG91dHB1dF9kaXIpID0gc2VsZi5fZml4X29iamVjdF9hcmdzIChvYmplY3RzLCBvdXRwdXRfZGlyKQorICAgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBcCisgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZmlsZW5hbWUgKG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPW91dHB1dF9kaXIpCisKKyAgICAgICAgaWYgc2VsZi5fbmVlZF9saW5rIChvYmplY3RzLCBvdXRwdXRfZmlsZW5hbWUpOgorICAgICAgICAgICAgbGliX2FyZ3MgPSBbb3V0cHV0X2ZpbGVuYW1lLCAnL3UnXSArIG9iamVjdHMKKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIHBhc3MgICAgICAgICAgICAgICAgICAgICMgWFhYIHdoYXQgZ29lcyBoZXJlPworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLmxpYl0gKyBsaWJfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBMaWJFcnJvciwgbXNnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2cuZGVidWcoInNraXBwaW5nICVzICh1cC10by1kYXRlKSIsIG91dHB1dF9maWxlbmFtZSkKKworICAgICMgY3JlYXRlX3N0YXRpY19saWIgKCkKKworCisgICAgZGVmIGxpbmsgKHNlbGYsCisgICAgICAgICAgICAgIHRhcmdldF9kZXNjLAorICAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsCisgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLAorICAgICAgICAgICAgICBkZWJ1Zz0wLAorICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCisgICAgICAgICAgICAgIGJ1aWxkX3RlbXA9Tm9uZSwKKyAgICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CisKKyAgICAgICAgIyBYWFggdGhpcyBpZ25vcmVzICdidWlsZF90ZW1wJyEgIHNob3VsZCBmb2xsb3cgdGhlIGxlYWQgb2YKKyAgICAgICAgIyBtc3ZjY29tcGlsZXIucHkKKworICAgICAgICAob2JqZWN0cywgb3V0cHV0X2RpcikgPSBzZWxmLl9maXhfb2JqZWN0X2FyZ3MgKG9iamVjdHMsIG91dHB1dF9kaXIpCisgICAgICAgIChsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMpID0gXAorICAgICAgICAgICAgc2VsZi5fZml4X2xpYl9hcmdzIChsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMpCisKKyAgICAgICAgaWYgcnVudGltZV9saWJyYXJ5X2RpcnM6CisgICAgICAgICAgICBsb2cud2FybigiSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCAncnVudGltZV9saWJyYXJ5X2RpcnMnOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICBzdHIocnVudGltZV9saWJyYXJ5X2RpcnMpKQorCisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsIG91dHB1dF9maWxlbmFtZSkKKworICAgICAgICBpZiBzZWxmLl9uZWVkX2xpbmsgKG9iamVjdHMsIG91dHB1dF9maWxlbmFtZSk6CisKKyAgICAgICAgICAgICMgRmlndXJlIG91dCBsaW5rZXIgYXJncyBiYXNlZCBvbiB0eXBlIG9mIHRhcmdldC4KKyAgICAgICAgICAgIGlmIHRhcmdldF9kZXNjID09IENDb21waWxlci5FWEVDVVRBQkxFOgorICAgICAgICAgICAgICAgIHN0YXJ0dXBfb2JqID0gJ2MwdzMyJworICAgICAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBsZF9hcmdzID0gc2VsZi5sZGZsYWdzX2V4ZV9kZWJ1Z1s6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxkX2FyZ3MgPSBzZWxmLmxkZmxhZ3NfZXhlWzpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJ0dXBfb2JqID0gJ2MwZDMyJworICAgICAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBsZF9hcmdzID0gc2VsZi5sZGZsYWdzX3NoYXJlZF9kZWJ1Z1s6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxkX2FyZ3MgPSBzZWxmLmxkZmxhZ3Nfc2hhcmVkWzpdCisKKworICAgICAgICAgICAgIyBDcmVhdGUgYSB0ZW1wb3JhcnkgZXhwb3J0cyBmaWxlIGZvciB1c2UgYnkgdGhlIGxpbmtlcgorICAgICAgICAgICAgaWYgZXhwb3J0X3N5bWJvbHMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkZWZfZmlsZSA9ICcnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0IChvdXRwdXRfZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgbW9kbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dCAodGFpbCkKKyAgICAgICAgICAgICAgICB0ZW1wX2RpciA9IG9zLnBhdGguZGlybmFtZShvYmplY3RzWzBdKSAjIHByZXNlcnZlIHRyZWUgc3RydWN0dXJlCisgICAgICAgICAgICAgICAgZGVmX2ZpbGUgPSBvcy5wYXRoLmpvaW4gKHRlbXBfZGlyLCAnJXMuZGVmJyAlIG1vZG5hbWUpCisgICAgICAgICAgICAgICAgY29udGVudHMgPSBbJ0VYUE9SVFMnXQorICAgICAgICAgICAgICAgIGZvciBzeW0gaW4gKGV4cG9ydF9zeW1ib2xzIG9yIFtdKToKKyAgICAgICAgICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKCcgICVzPV8lcycgJSAoc3ltLCBzeW0pKQorICAgICAgICAgICAgICAgIHNlbGYuZXhlY3V0ZSh3cml0ZV9maWxlLCAoZGVmX2ZpbGUsIGNvbnRlbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgJXMiICUgZGVmX2ZpbGUpCisKKyAgICAgICAgICAgICMgQm9ybGFuZCBDKysgaGFzIHByb2JsZW1zIHdpdGggJy8nIGluIHBhdGhzCisgICAgICAgICAgICBvYmplY3RzMiA9IG1hcChvcy5wYXRoLm5vcm1wYXRoLCBvYmplY3RzKQorICAgICAgICAgICAgIyBzcGxpdCBvYmplY3RzIGluIC5vYmogYW5kIC5yZXMgZmlsZXMKKyAgICAgICAgICAgICMgQm9ybGFuZCBDKysgbmVlZHMgdGhlbSBhdCBkaWZmZXJlbnQgcG9zaXRpb25zIGluIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgICAgICAgIG9iamVjdHMgPSBbc3RhcnR1cF9vYmpdCisgICAgICAgICAgICByZXNvdXJjZXMgPSBbXQorICAgICAgICAgICAgZm9yIGZpbGUgaW4gb2JqZWN0czI6CisgICAgICAgICAgICAgICAgKGJhc2UsIGV4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGgubm9ybWNhc2UoZmlsZSkpCisgICAgICAgICAgICAgICAgaWYgZXh0ID09ICcucmVzJzoKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFwcGVuZChmaWxlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9iamVjdHMuYXBwZW5kKGZpbGUpCisKKworICAgICAgICAgICAgZm9yIGwgaW4gbGlicmFyeV9kaXJzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kKCIvTCVzIiAlIG9zLnBhdGgubm9ybXBhdGgobCkpCisgICAgICAgICAgICBsZF9hcmdzLmFwcGVuZCgiL0wuIikgIyB3ZSBzb21ldGltZXMgdXNlIHJlbGF0aXZlIHBhdGhzCisKKyAgICAgICAgICAgICMgbGlzdCBvZiBvYmplY3QgZmlsZXMKKyAgICAgICAgICAgIGxkX2FyZ3MuZXh0ZW5kKG9iamVjdHMpCisKKyAgICAgICAgICAgICMgWFhYIHRoZSBjb21tYW5kLWxpbmUgc3ludGF4IGZvciBCb3JsYW5kIEMrKyBpcyBhIGJpdCB3b25reTsKKyAgICAgICAgICAgICMgY2VydGFpbiBmaWxlbmFtZXMgYXJlIGphbW1lZCB0b2dldGhlciBpbiBvbmUgYmlnIHN0cmluZywgYnV0CisgICAgICAgICAgICAjIGNvbW1hLWRlbGltaXRlZC4gIFRoaXMgZG9lc24ndCBtZXNoIHRvbyB3ZWxsIHdpdGggdGhlCisgICAgICAgICAgICAjIFVuaXgtY2VudHJpYyBhdHRpdHVkZSAod2l0aCBhIERPUy9XaW5kb3dzIHF1b3RpbmcgaGFjaykgb2YKKyAgICAgICAgICAgICMgJ3NwYXduKCknLCBzbyBjb25zdHJ1Y3RpbmcgdGhlIGFyZ3VtZW50IGxpc3QgaXMgYSBiaXQKKyAgICAgICAgICAgICMgYXdrd2FyZC4gIE5vdGUgdGhhdCBkb2luZyB0aGUgb2J2aW91cyB0aGluZyBhbmQgamFtbWluZyBhbGwKKyAgICAgICAgICAgICMgdGhlIGZpbGVuYW1lcyBhbmQgY29tbWFzIGludG8gb25lIGFyZ3VtZW50IHdvdWxkIGJlIHdyb25nLAorICAgICAgICAgICAgIyBiZWNhdXNlICdzcGF3bigpJyB3b3VsZCBxdW90ZSBhbnkgZmlsZW5hbWVzIHdpdGggc3BhY2VzIGluCisgICAgICAgICAgICAjIHRoZW0uICBBcmdoZ2hoIS4gIEFwcGFyZW50bHkgaXQgd29ya3MgZmluZSBhcyBjb2RlZC4uLgorCisgICAgICAgICAgICAjIG5hbWUgb2YgZGxsL2V4ZSBmaWxlCisgICAgICAgICAgICBsZF9hcmdzLmV4dGVuZChbJywnLG91dHB1dF9maWxlbmFtZV0pCisgICAgICAgICAgICAjIG5vIG1hcCBmaWxlIGFuZCBzdGFydCBsaWJyYXJpZXMKKyAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kKCcsLCcpCisKKyAgICAgICAgICAgIGZvciBsaWIgaW4gbGlicmFyaWVzOgorICAgICAgICAgICAgICAgICMgc2VlIGlmIHdlIGZpbmQgaXQgYW5kIGlmIHRoZXJlIGlzIGEgYmNwcCBzcGVjaWZpYyBsaWIKKyAgICAgICAgICAgICAgICAjICh4eHhfYmNwcC5saWIpCisgICAgICAgICAgICAgICAgbGliZmlsZSA9IHNlbGYuZmluZF9saWJyYXJ5X2ZpbGUobGlicmFyeV9kaXJzLCBsaWIsIGRlYnVnKQorICAgICAgICAgICAgICAgIGlmIGxpYmZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbGRfYXJncy5hcHBlbmQobGliKQorICAgICAgICAgICAgICAgICAgICAjIHByb2JhYmx5IGEgQkNQUCBpbnRlcm5hbCBsaWJyYXJ5IC0tIGRvbid0IHdhcm4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGZ1bGwgbmFtZSB3aGljaCBwcmVmZXJzIGJjcHBfeHh4LmxpYiBvdmVyIHh4eC5saWIKKyAgICAgICAgICAgICAgICAgICAgbGRfYXJncy5hcHBlbmQobGliZmlsZSkKKworICAgICAgICAgICAgIyBzb21lIGRlZmF1bHQgbGlicmFyaWVzCisgICAgICAgICAgICBsZF9hcmdzLmFwcGVuZCAoJ2ltcG9ydDMyJykKKyAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kICgnY3czMm10JykKKworICAgICAgICAgICAgIyBkZWYgZmlsZSBmb3IgZXhwb3J0IHN5bWJvbHMKKyAgICAgICAgICAgIGxkX2FyZ3MuZXh0ZW5kKFsnLCcsZGVmX2ZpbGVdKQorICAgICAgICAgICAgIyBhZGQgcmVzb3VyY2UgZmlsZXMKKyAgICAgICAgICAgIGxkX2FyZ3MuYXBwZW5kKCcsJykKKyAgICAgICAgICAgIGxkX2FyZ3MuZXh0ZW5kKHJlc291cmNlcykKKworCisgICAgICAgICAgICBpZiBleHRyYV9wcmVhcmdzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3NbOjBdID0gZXh0cmFfcHJlYXJncworICAgICAgICAgICAgaWYgZXh0cmFfcG9zdGFyZ3M6CisgICAgICAgICAgICAgICAgbGRfYXJncy5leHRlbmQoZXh0cmFfcG9zdGFyZ3MpCisKKyAgICAgICAgICAgIHNlbGYubWtwYXRoIChvcy5wYXRoLmRpcm5hbWUgKG91dHB1dF9maWxlbmFtZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3biAoW3NlbGYubGlua2VyXSArIGxkX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgTGlua0Vycm9yLCBtc2cKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyAlcyAodXAtdG8tZGF0ZSkiLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICAjIGxpbmsgKCkKKworICAgICMgLS0gTWlzY2VsbGFuZW91cyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworICAgIGRlZiBmaW5kX2xpYnJhcnlfZmlsZSAoc2VsZiwgZGlycywgbGliLCBkZWJ1Zz0wKToKKyAgICAgICAgIyBMaXN0IG9mIGVmZmVjdGl2ZSBsaWJyYXJ5IG5hbWVzIHRvIHRyeSwgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZToKKyAgICAgICAgIyB4eHhfYmNwcC5saWIgaXMgYmV0dGVyIHRoYW4geHh4LmxpYgorICAgICAgICAjIGFuZCB4eHhfZC5saWIgaXMgYmV0dGVyIHRoYW4geHh4LmxpYiBpZiBkZWJ1ZyBpcyBzZXQKKyAgICAgICAgIworICAgICAgICAjIFRoZSAiX2JjcHAiIHN1ZmZpeCBpcyB0byBoYW5kbGUgYSBQeXRob24gaW5zdGFsbGF0aW9uIGZvciBwZW9wbGUKKyAgICAgICAgIyB3aXRoIG11bHRpcGxlIGNvbXBpbGVycyAocHJpbWFyaWx5IERpc3R1dGlscyBoYWNrZXJzLCBJIHN1c3BlY3QKKyAgICAgICAgIyA7LSkuICBUaGUgaWRlYSBpcyB0aGV5J2QgaGF2ZSBvbmUgc3RhdGljIGxpYnJhcnkgZm9yIGVhY2gKKyAgICAgICAgIyBjb21waWxlciB0aGV5IGNhcmUgYWJvdXQsIHNpbmNlIChhbG1vc3Q/KSBldmVyeSBXaW5kb3dzIGNvbXBpbGVyCisgICAgICAgICMgc2VlbXMgdG8gaGF2ZSBhIGRpZmZlcmVudCBmb3JtYXQgZm9yIHN0YXRpYyBsaWJyYXJpZXMuCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgZGxpYiA9IChsaWIgKyAiX2QiKQorICAgICAgICAgICAgdHJ5X25hbWVzID0gKGRsaWIgKyAiX2JjcHAiLCBsaWIgKyAiX2JjcHAiLCBkbGliLCBsaWIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnlfbmFtZXMgPSAobGliICsgIl9iY3BwIiwgbGliKQorCisgICAgICAgIGZvciBkaXIgaW4gZGlyczoKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHRyeV9uYW1lczoKKyAgICAgICAgICAgICAgICBsaWJmaWxlID0gb3MucGF0aC5qb2luKGRpciwgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKG5hbWUpKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGxpYmZpbGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGliZmlsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBPb3BzLCBkaWRuJ3QgZmluZCBpdCBpbiAqYW55KiBvZiAnZGlycycKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIG92ZXJ3cml0ZSB0aGUgb25lIGZyb20gQ0NvbXBpbGVyIHRvIHN1cHBvcnQgcmMgYW5kIHJlcy1maWxlcworICAgIGRlZiBvYmplY3RfZmlsZW5hbWVzIChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfZmlsZW5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9kaXI9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj0nJyk6CisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgTm9uZTogb3V0cHV0X2RpciA9ICcnCisgICAgICAgIG9ial9uYW1lcyA9IFtdCisgICAgICAgIGZvciBzcmNfbmFtZSBpbiBzb3VyY2VfZmlsZW5hbWVzOgorICAgICAgICAgICAgIyB1c2Ugbm9ybWNhc2UgdG8gbWFrZSBzdXJlICcucmMnIGlzIHJlYWxseSAnLnJjJyBhbmQgbm90ICcuUkMnCisgICAgICAgICAgICAoYmFzZSwgZXh0KSA9IG9zLnBhdGguc3BsaXRleHQgKG9zLnBhdGgubm9ybWNhc2Uoc3JjX25hbWUpKQorICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiAoc2VsZi5zcmNfZXh0ZW5zaW9ucyArIFsnLnJjJywnLnJlcyddKToKKyAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRmlsZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZmlsZSB0eXBlICclcycgKGZyb20gJyVzJykiICUgXAorICAgICAgICAgICAgICAgICAgICAgIChleHQsIHNyY19uYW1lKQorICAgICAgICAgICAgaWYgc3RyaXBfZGlyOgorICAgICAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLmJhc2VuYW1lIChiYXNlKQorICAgICAgICAgICAgaWYgZXh0ID09ICcucmVzJzoKKyAgICAgICAgICAgICAgICAjIHRoZXNlIGNhbiBnbyB1bmNoYW5nZWQKKyAgICAgICAgICAgICAgICBvYmpfbmFtZXMuYXBwZW5kIChvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsIGJhc2UgKyBleHQpKQorICAgICAgICAgICAgZWxpZiBleHQgPT0gJy5yYyc6CisgICAgICAgICAgICAgICAgIyB0aGVzZSBuZWVkIHRvIGJlIGNvbXBpbGVkIHRvIC5yZXMtZmlsZXMKKyAgICAgICAgICAgICAgICBvYmpfbmFtZXMuYXBwZW5kIChvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsIGJhc2UgKyAnLnJlcycpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvYmpfbmFtZXMuYXBwZW5kIChvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBzZWxmLm9ial9leHRlbnNpb24pKQorICAgICAgICByZXR1cm4gb2JqX25hbWVzCisKKyAgICAjIG9iamVjdF9maWxlbmFtZXMgKCkKKworICAgIGRlZiBwcmVwcm9jZXNzIChzZWxmLAorICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIG1hY3Jvcz1Ob25lLAorICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lKToKKworICAgICAgICAoXywgbWFjcm9zLCBpbmNsdWRlX2RpcnMpID0gXAorICAgICAgICAgICAgc2VsZi5fZml4X2NvbXBpbGVfYXJncyhOb25lLCBtYWNyb3MsIGluY2x1ZGVfZGlycykKKyAgICAgICAgcHBfb3B0cyA9IGdlbl9wcmVwcm9jZXNzX29wdGlvbnMobWFjcm9zLCBpbmNsdWRlX2RpcnMpCisgICAgICAgIHBwX2FyZ3MgPSBbJ2NwcDMyLmV4ZSddICsgcHBfb3B0cworICAgICAgICBpZiBvdXRwdXRfZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBwX2FyZ3MuYXBwZW5kKCctbycgKyBvdXRwdXRfZmlsZSkKKyAgICAgICAgaWYgZXh0cmFfcHJlYXJnczoKKyAgICAgICAgICAgIHBwX2FyZ3NbOjBdID0gZXh0cmFfcHJlYXJncworICAgICAgICBpZiBleHRyYV9wb3N0YXJnczoKKyAgICAgICAgICAgIHBwX2FyZ3MuZXh0ZW5kKGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICBwcF9hcmdzLmFwcGVuZChzb3VyY2UpCisKKyAgICAgICAgIyBXZSBuZWVkIHRvIHByZXByb2Nlc3M6IGVpdGhlciB3ZSdyZSBiZWluZyBmb3JjZWQgdG8sIG9yIHRoZQorICAgICAgICAjIHNvdXJjZSBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIHRhcmdldCAob3IgdGhlIHRhcmdldCBkb2Vzbid0CisgICAgICAgICMgZXhpc3QpLgorICAgICAgICBpZiBzZWxmLmZvcmNlIG9yIG91dHB1dF9maWxlIGlzIE5vbmUgb3IgbmV3ZXIoc291cmNlLCBvdXRwdXRfZmlsZSk6CisgICAgICAgICAgICBpZiBvdXRwdXRfZmlsZToKKyAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24ocHBfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworCisgICAgIyBwcmVwcm9jZXNzKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWZmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2JjcHBjb21waWxlci5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWZmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9iY3BwY29tcGlsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjhkOGYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY2NvbXBpbGVyLnB5CkBAIC0wLDAgKzEsMTA5NyBAQAorIiIiZGlzdHV0aWxzLmNjb21waWxlcgorCitDb250YWlucyBDQ29tcGlsZXIsIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBkZWZpbmVzIHRoZSBpbnRlcmZhY2UKK2ZvciB0aGUgRGlzdHV0aWxzIGNvbXBpbGVyIGFic3RyYWN0aW9uIG1vZGVsLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgcmUKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoQ29tcGlsZUVycm9yLCBMaW5rRXJyb3IsIFVua25vd25GaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBEaXN0dXRpbHNNb2R1bGVFcnJvcikKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBtb3ZlX2ZpbGUKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCBta3BhdGgKK2Zyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcl9ncm91cAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgc3BsaXRfcXVvdGVkLCBleGVjdXRlCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisjIGZvbGxvd2luZyBpbXBvcnQgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyCisKK2NsYXNzIENDb21waWxlcjoKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIHRvIGRlZmluZSB0aGUgaW50ZXJmYWNlIHRoYXQgbXVzdCBiZSBpbXBsZW1lbnRlZAorICAgIGJ5IHJlYWwgY29tcGlsZXIgY2xhc3Nlcy4gIEFsc28gaGFzIHNvbWUgdXRpbGl0eSBtZXRob2RzIHVzZWQgYnkKKyAgICBzZXZlcmFsIGNvbXBpbGVyIGNsYXNzZXMuCisKKyAgICBUaGUgYmFzaWMgaWRlYSBiZWhpbmQgYSBjb21waWxlciBhYnN0cmFjdGlvbiBjbGFzcyBpcyB0aGF0IGVhY2gKKyAgICBpbnN0YW5jZSBjYW4gYmUgdXNlZCBmb3IgYWxsIHRoZSBjb21waWxlL2xpbmsgc3RlcHMgaW4gYnVpbGRpbmcgYQorICAgIHNpbmdsZSBwcm9qZWN0LiAgVGh1cywgYXR0cmlidXRlcyBjb21tb24gdG8gYWxsIG9mIHRob3NlIGNvbXBpbGUgYW5kCisgICAgbGluayBzdGVwcyAtLSBpbmNsdWRlIGRpcmVjdG9yaWVzLCBtYWNyb3MgdG8gZGVmaW5lLCBsaWJyYXJpZXMgdG8gbGluaworICAgIGFnYWluc3QsIGV0Yy4gLS0gYXJlIGF0dHJpYnV0ZXMgb2YgdGhlIGNvbXBpbGVyIGluc3RhbmNlLiAgVG8gYWxsb3cgZm9yCisgICAgdmFyaWFiaWxpdHkgaW4gaG93IGluZGl2aWR1YWwgZmlsZXMgYXJlIHRyZWF0ZWQsIG1vc3Qgb2YgdGhvc2UKKyAgICBhdHRyaWJ1dGVzIG1heSBiZSB2YXJpZWQgb24gYSBwZXItY29tcGlsYXRpb24gb3IgcGVyLWxpbmsgYmFzaXMuCisgICAgIiIiCisKKyAgICAjICdjb21waWxlcl90eXBlJyBpcyBhIGNsYXNzIGF0dHJpYnV0ZSB0aGF0IGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gIEl0CisgICAgIyBrZWVwcyBjb2RlIHRoYXQgd2FudHMgdG8ga25vdyB3aGF0IGtpbmQgb2YgY29tcGlsZXIgaXQncyBkZWFsaW5nIHdpdGgKKyAgICAjIGZyb20gaGF2aW5nIHRvIGltcG9ydCBhbGwgcG9zc2libGUgY29tcGlsZXIgY2xhc3NlcyBqdXN0IHRvIGRvIGFuCisgICAgIyAnaXNpbnN0YW5jZScuICBJbiBjb25jcmV0ZSBDQ29tcGlsZXIgc3ViY2xhc3NlcywgJ2NvbXBpbGVyX3R5cGUnCisgICAgIyBzaG91bGQgcmVhbGx5LCByZWFsbHkgYmUgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSAnY29tcGlsZXJfY2xhc3MnCisgICAgIyBkaWN0aW9uYXJ5IChzZWUgYmVsb3cgLS0gdXNlZCBieSB0aGUgJ25ld19jb21waWxlcigpJyBmYWN0b3J5CisgICAgIyBmdW5jdGlvbikgLS0gYXV0aG9ycyBvZiBuZXcgY29tcGlsZXIgaW50ZXJmYWNlIGNsYXNzZXMgYXJlCisgICAgIyByZXNwb25zaWJsZSBmb3IgdXBkYXRpbmcgJ2NvbXBpbGVyX2NsYXNzJyEKKyAgICBjb21waWxlcl90eXBlID0gTm9uZQorCisgICAgIyBYWFggdGhpbmdzIG5vdCBoYW5kbGVkIGJ5IHRoaXMgY29tcGlsZXIgYWJzdHJhY3Rpb24gbW9kZWw6CisgICAgIyAgICogY2xpZW50IGNhbid0IHByb3ZpZGUgYWRkaXRpb25hbCBvcHRpb25zIGZvciBhIGNvbXBpbGVyLAorICAgICMgICAgIGUuZy4gd2FybmluZywgb3B0aW1pemF0aW9uLCBkZWJ1Z2dpbmcgZmxhZ3MuICBQZXJoYXBzIHRoaXMKKyAgICAjICAgICBzaG91bGQgYmUgdGhlIGRvbWFpbiBvZiBjb25jcmV0ZSBjb21waWxlciBhYnN0cmFjdGlvbiBjbGFzc2VzCisgICAgIyAgICAgKFVuaXhDQ29tcGlsZXIsIE1TVkNDb21waWxlciwgZXRjLikgLS0gb3IgcGVyaGFwcyB0aGUgYmFzZQorICAgICMgICAgIGNsYXNzIHNob3VsZCBoYXZlIG1ldGhvZHMgZm9yIHRoZSBjb21tb24gb25lcy4KKyAgICAjICAgKiBjYW4ndCBjb21wbGV0ZWx5IG92ZXJyaWRlIHRoZSBpbmNsdWRlIG9yIGxpYnJhcnkgc2VhcmNoZworICAgICMgICAgIHBhdGgsIGllLiBubyAiY2MgLUkgLUlkaXIxIC1JZGlyMiIgb3IgImNjIC1MIC1MZGlyMSAtTGRpcjIiLgorICAgICMgICAgIEknbSBub3Qgc3VyZSBob3cgd2lkZWx5IHN1cHBvcnRlZCB0aGlzIGlzIGV2ZW4gYnkgVW5peAorICAgICMgICAgIGNvbXBpbGVycywgbXVjaCBsZXNzIG9uIG90aGVyIHBsYXRmb3Jtcy4gIEFuZCBJJ20gZXZlbiBsZXNzCisgICAgIyAgICAgc3VyZSBob3cgdXNlZnVsIGl0IGlzOyBtYXliZSBmb3IgY3Jvc3MtY29tcGlsaW5nLCBidXQKKyAgICAjICAgICBzdXBwb3J0IGZvciB0aGF0IGlzIGEgd2F5cyBvZmYuICAoQW5kIGFueXdheXMsIGNyb3NzCisgICAgIyAgICAgY29tcGlsZXJzIHByb2JhYmx5IGhhdmUgYSBkZWRpY2F0ZWQgYmluYXJ5IHdpdGggdGhlCisgICAgIyAgICAgcmlnaHQgcGF0aHMgY29tcGlsZWQgaW4uICBJIGhvcGUuKQorICAgICMgICAqIGNhbid0IGRvIHJlYWxseSBmcmVha3kgdGhpbmdzIHdpdGggdGhlIGxpYnJhcnkgbGlzdC9saWJyYXJ5CisgICAgIyAgICAgZGlycywgZS5nLiAiLUxkaXIxIC1sZm9vIC1MZGlyMiAtbGZvbyIgdG8gbGluayBhZ2FpbnN0CisgICAgIyAgICAgZGlmZmVyZW50IHZlcnNpb25zIG9mIGxpYmZvby5hIGluIGRpZmZlcmVudCBsb2NhdGlvbnMuICBJCisgICAgIyAgICAgdGhpbmsgdGhpcyBpcyB1c2VsZXNzIHdpdGhvdXQgdGhlIGFiaWxpdHkgdG8gbnVsbCBvdXQgdGhlCisgICAgIyAgICAgbGlicmFyeSBzZWFyY2ggcGF0aCBhbnl3YXlzLgorCisKKyAgICAjIFN1YmNsYXNzZXMgdGhhdCByZWx5IG9uIHRoZSBzdGFuZGFyZCBmaWxlbmFtZSBnZW5lcmF0aW9uIG1ldGhvZHMKKyAgICAjIGltcGxlbWVudGVkIGJlbG93IHNob3VsZCBvdmVycmlkZSB0aGVzZTsgc2VlIHRoZSBjb21tZW50IG5lYXIKKyAgICAjIHRob3NlIG1ldGhvZHMgKCdvYmplY3RfZmlsZW5hbWVzKCknIGV0LiBhbC4pIGZvciBkZXRhaWxzOgorICAgIHNyY19leHRlbnNpb25zID0gTm9uZSAgICAgICAgICAgICAgICMgbGlzdCBvZiBzdHJpbmdzCisgICAgb2JqX2V4dGVuc2lvbiA9IE5vbmUgICAgICAgICAgICAgICAgIyBzdHJpbmcKKyAgICBzdGF0aWNfbGliX2V4dGVuc2lvbiA9IE5vbmUKKyAgICBzaGFyZWRfbGliX2V4dGVuc2lvbiA9IE5vbmUgICAgICAgICAjIHN0cmluZworICAgIHN0YXRpY19saWJfZm9ybWF0ID0gTm9uZSAgICAgICAgICAgICMgZm9ybWF0IHN0cmluZworICAgIHNoYXJlZF9saWJfZm9ybWF0ID0gTm9uZSAgICAgICAgICAgICMgcHJvYi4gc2FtZSBhcyBzdGF0aWNfbGliX2Zvcm1hdAorICAgIGV4ZV9leHRlbnNpb24gPSBOb25lICAgICAgICAgICAgICAgICMgc3RyaW5nCisKKyAgICAjIERlZmF1bHQgbGFuZ3VhZ2Ugc2V0dGluZ3MuIGxhbmd1YWdlX21hcCBpcyB1c2VkIHRvIGRldGVjdCBhIHNvdXJjZQorICAgICMgZmlsZSBvciBFeHRlbnNpb24gdGFyZ2V0IGxhbmd1YWdlLCBjaGVja2luZyBzb3VyY2UgZmlsZW5hbWVzLgorICAgICMgbGFuZ3VhZ2Vfb3JkZXIgaXMgdXNlZCB0byBkZXRlY3QgdGhlIGxhbmd1YWdlIHByZWNlZGVuY2UsIHdoZW4gZGVjaWRpbmcKKyAgICAjIHdoYXQgbGFuZ3VhZ2UgdG8gdXNlIHdoZW4gbWl4aW5nIHNvdXJjZSB0eXBlcy4gRm9yIGV4YW1wbGUsIGlmIHNvbWUKKyAgICAjIGV4dGVuc2lvbiBoYXMgdHdvIGZpbGVzIHdpdGggIi5jIiBleHRlbnNpb24sIGFuZCBvbmUgd2l0aCAiLmNwcCIsIGl0CisgICAgIyBpcyBzdGlsbCBsaW5rZWQgYXMgYysrLgorICAgIGxhbmd1YWdlX21hcCA9IHsiLmMiICAgOiAiYyIsCisgICAgICAgICAgICAgICAgICAgICIuY2MiICA6ICJjKysiLAorICAgICAgICAgICAgICAgICAgICAiLmNwcCIgOiAiYysrIiwKKyAgICAgICAgICAgICAgICAgICAgIi5jeHgiIDogImMrKyIsCisgICAgICAgICAgICAgICAgICAgICIubSIgICA6ICJvYmpjIiwKKyAgICAgICAgICAgICAgICAgICB9CisgICAgbGFuZ3VhZ2Vfb3JkZXIgPSBbImMrKyIsICJvYmpjIiwgImMiXQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgZm9yY2U9MCk6CisgICAgICAgIHNlbGYuZHJ5X3J1biA9IGRyeV9ydW4KKyAgICAgICAgc2VsZi5mb3JjZSA9IGZvcmNlCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKworICAgICAgICAjICdvdXRwdXRfZGlyJzogYSBjb21tb24gb3V0cHV0IGRpcmVjdG9yeSBmb3Igb2JqZWN0LCBsaWJyYXJ5LAorICAgICAgICAjIHNoYXJlZCBvYmplY3QsIGFuZCBzaGFyZWQgbGlicmFyeSBmaWxlcworICAgICAgICBzZWxmLm91dHB1dF9kaXIgPSBOb25lCisKKyAgICAgICAgIyAnbWFjcm9zJzogYSBsaXN0IG9mIG1hY3JvIGRlZmluaXRpb25zIChvciB1bmRlZmluaXRpb25zKS4gIEEKKyAgICAgICAgIyBtYWNybyBkZWZpbml0aW9uIGlzIGEgMi10dXBsZSAobmFtZSwgdmFsdWUpLCB3aGVyZSB0aGUgdmFsdWUgaXMKKyAgICAgICAgIyBlaXRoZXIgYSBzdHJpbmcgb3IgTm9uZSAobm8gZXhwbGljaXQgdmFsdWUpLiAgQSBtYWNybworICAgICAgICAjIHVuZGVmaW5pdGlvbiBpcyBhIDEtdHVwbGUgKG5hbWUsKS4KKyAgICAgICAgc2VsZi5tYWNyb3MgPSBbXQorCisgICAgICAgICMgJ2luY2x1ZGVfZGlycyc6IGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGluY2x1ZGUgZmlsZXMKKyAgICAgICAgc2VsZi5pbmNsdWRlX2RpcnMgPSBbXQorCisgICAgICAgICMgJ2xpYnJhcmllcyc6IGEgbGlzdCBvZiBsaWJyYXJpZXMgdG8gaW5jbHVkZSBpbiBhbnkgbGluaworICAgICAgICAjIChsaWJyYXJ5IG5hbWVzLCBub3QgZmlsZW5hbWVzOiBlZy4gImZvbyIgbm90ICJsaWJmb28uYSIpCisgICAgICAgIHNlbGYubGlicmFyaWVzID0gW10KKworICAgICAgICAjICdsaWJyYXJ5X2RpcnMnOiBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBsaWJyYXJpZXMKKyAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMgPSBbXQorCisgICAgICAgICMgJ3J1bnRpbWVfbGlicmFyeV9kaXJzJzogYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IKKyAgICAgICAgIyBzaGFyZWQgbGlicmFyaWVzL29iamVjdHMgYXQgcnVudGltZQorICAgICAgICBzZWxmLnJ1bnRpbWVfbGlicmFyeV9kaXJzID0gW10KKworICAgICAgICAjICdvYmplY3RzJzogYSBsaXN0IG9mIG9iamVjdCBmaWxlcyAob3Igc2ltaWxhciwgc3VjaCBhcyBleHBsaWNpdGx5CisgICAgICAgICMgbmFtZWQgbGlicmFyeSBmaWxlcykgdG8gaW5jbHVkZSBvbiBhbnkgbGluaworICAgICAgICBzZWxmLm9iamVjdHMgPSBbXQorCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5leGVjdXRhYmxlcy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLnNldF9leGVjdXRhYmxlKGtleSwgc2VsZi5leGVjdXRhYmxlc1trZXldKQorCisgICAgZGVmIHNldF9leGVjdXRhYmxlcyhzZWxmLCAqKmFyZ3MpOgorICAgICAgICAiIiJEZWZpbmUgdGhlIGV4ZWN1dGFibGVzIChhbmQgb3B0aW9ucyBmb3IgdGhlbSkgdGhhdCB3aWxsIGJlIHJ1bgorICAgICAgICB0byBwZXJmb3JtIHRoZSB2YXJpb3VzIHN0YWdlcyBvZiBjb21waWxhdGlvbi4gIFRoZSBleGFjdCBzZXQgb2YKKyAgICAgICAgZXhlY3V0YWJsZXMgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGhlcmUgZGVwZW5kcyBvbiB0aGUgY29tcGlsZXIKKyAgICAgICAgY2xhc3MgKHZpYSB0aGUgJ2V4ZWN1dGFibGVzJyBjbGFzcyBhdHRyaWJ1dGUpLCBidXQgbW9zdCB3aWxsIGhhdmU6CisgICAgICAgICAgY29tcGlsZXIgICAgICB0aGUgQy9DKysgY29tcGlsZXIKKyAgICAgICAgICBsaW5rZXJfc28gICAgIGxpbmtlciB1c2VkIHRvIGNyZWF0ZSBzaGFyZWQgb2JqZWN0cyBhbmQgbGlicmFyaWVzCisgICAgICAgICAgbGlua2VyX2V4ZSAgICBsaW5rZXIgdXNlZCB0byBjcmVhdGUgYmluYXJ5IGV4ZWN1dGFibGVzCisgICAgICAgICAgYXJjaGl2ZXIgICAgICBzdGF0aWMgbGlicmFyeSBjcmVhdG9yCisKKyAgICAgICAgT24gcGxhdGZvcm1zIHdpdGggYSBjb21tYW5kLWxpbmUgKFVuaXgsIERPUy9XaW5kb3dzKSwgZWFjaCBvZiB0aGVzZQorICAgICAgICBpcyBhIHN0cmluZyB0aGF0IHdpbGwgYmUgc3BsaXQgaW50byBleGVjdXRhYmxlIG5hbWUgYW5kIChvcHRpb25hbCkKKyAgICAgICAgbGlzdCBvZiBhcmd1bWVudHMuICAoU3BsaXR0aW5nIHRoZSBzdHJpbmcgaXMgZG9uZSBzaW1pbGFybHkgdG8gaG93CisgICAgICAgIFVuaXggc2hlbGxzIG9wZXJhdGU6IHdvcmRzIGFyZSBkZWxpbWl0ZWQgYnkgc3BhY2VzLCBidXQgcXVvdGVzIGFuZAorICAgICAgICBiYWNrc2xhc2hlcyBjYW4gb3ZlcnJpZGUgdGhpcy4gIFNlZQorICAgICAgICAnZGlzdHV0aWxzLnV0aWwuc3BsaXRfcXVvdGVkKCknLikKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBOb3RlIHRoYXQgc29tZSBDQ29tcGlsZXIgaW1wbGVtZW50YXRpb24gY2xhc3NlcyB3aWxsIGRlZmluZSBjbGFzcworICAgICAgICAjIGF0dHJpYnV0ZXMgJ2NwcCcsICdjYycsIGV0Yy4gd2l0aCBoYXJkLWNvZGVkIGV4ZWN1dGFibGUgbmFtZXM7CisgICAgICAgICMgdGhpcyBpcyBhcHByb3ByaWF0ZSB3aGVuIGEgY29tcGlsZXIgY2xhc3MgaXMgZm9yIGV4YWN0bHkgb25lCisgICAgICAgICMgY29tcGlsZXIvT1MgY29tYmluYXRpb24gKGVnLiBNU1ZDQ29tcGlsZXIpLiAgT3RoZXIgY29tcGlsZXIKKyAgICAgICAgIyBjbGFzc2VzIChVbml4Q0NvbXBpbGVyLCBpbiBwYXJ0aWN1bGFyKSBhcmUgZHJpdmVuIGJ5IGluZm9ybWF0aW9uCisgICAgICAgICMgZGlzY292ZXJlZCBhdCBydW4tdGltZSwgc2luY2UgdGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHdheXMgdG8gZG8KKyAgICAgICAgIyBiYXNpY2FsbHkgdGhlIHNhbWUgdGhpbmdzIHdpdGggVW5peCBDIGNvbXBpbGVycy4KKworICAgICAgICBmb3Iga2V5IGluIGFyZ3Mua2V5cygpOgorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLmV4ZWN1dGFibGVzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBleGVjdXRhYmxlICclcycgZm9yIGNsYXNzICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoa2V5LCBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICAgICAgICAgIHNlbGYuc2V0X2V4ZWN1dGFibGUoa2V5LCBhcmdzW2tleV0pCisKKyAgICBkZWYgc2V0X2V4ZWN1dGFibGUoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgc3BsaXRfcXVvdGVkKHZhbHVlKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwga2V5LCB2YWx1ZSkKKworICAgIGRlZiBfZmluZF9tYWNybyhzZWxmLCBuYW1lKToKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIGRlZm4gaW4gc2VsZi5tYWNyb3M6CisgICAgICAgICAgICBpZiBkZWZuWzBdID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9jaGVja19tYWNyb19kZWZpbml0aW9ucyhzZWxmLCBkZWZpbml0aW9ucyk6CisgICAgICAgICIiIkVuc3VyZXMgdGhhdCBldmVyeSBlbGVtZW50IG9mICdkZWZpbml0aW9ucycgaXMgYSB2YWxpZCBtYWNybworICAgICAgICBkZWZpbml0aW9uLCBpZS4gZWl0aGVyIChuYW1lLHZhbHVlKSAyLXR1cGxlIG9yIGEgKG5hbWUsKSB0dXBsZS4gIERvCisgICAgICAgIG5vdGhpbmcgaWYgYWxsIGRlZmluaXRpb25zIGFyZSBPSywgcmFpc2UgVHlwZUVycm9yIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkZWZuIGluIGRlZmluaXRpb25zOgorICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKGRlZm4sIHR1cGxlKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgKGxlbiAoZGVmbikgPT0gMSBvcgorICAgICAgICAgICAgICAgICAgICAgKGxlbiAoZGVmbikgPT0gMiBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAoaXNpbnN0YW5jZShkZWZuWzFdLCBzdHIpIG9yIGRlZm5bMV0gaXMgTm9uZSkpKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShkZWZuWzBdLCBzdHIpKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImludmFsaWQgbWFjcm8gZGVmaW5pdGlvbiAnJXMnOiAiICUgZGVmbikgKyBcCisgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgdHVwbGUgKHN0cmluZywpLCAoc3RyaW5nLCBzdHJpbmcpLCBvciAiICsgXAorICAgICAgICAgICAgICAgICAgICAgICIoc3RyaW5nLCBOb25lKSIKKworCisgICAgIyAtLSBCb29ra2VlcGluZyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBkZWZpbmVfbWFjcm8oc2VsZiwgbmFtZSwgdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIkRlZmluZSBhIHByZXByb2Nlc3NvciBtYWNybyBmb3IgYWxsIGNvbXBpbGF0aW9ucyBkcml2ZW4gYnkgdGhpcworICAgICAgICBjb21waWxlciBvYmplY3QuICBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyICd2YWx1ZScgc2hvdWxkIGJlIGEKKyAgICAgICAgc3RyaW5nOyBpZiBpdCBpcyBub3Qgc3VwcGxpZWQsIHRoZW4gdGhlIG1hY3JvIHdpbGwgYmUgZGVmaW5lZAorICAgICAgICB3aXRob3V0IGFuIGV4cGxpY2l0IHZhbHVlIGFuZCB0aGUgZXhhY3Qgb3V0Y29tZSBkZXBlbmRzIG9uIHRoZQorICAgICAgICBjb21waWxlciB1c2VkIChYWFggdHJ1ZT8gZG9lcyBBTlNJIHNheSBhbnl0aGluZyBhYm91dCB0aGlzPykKKyAgICAgICAgIiIiCisgICAgICAgICMgRGVsZXRlIGZyb20gdGhlIGxpc3Qgb2YgbWFjcm8gZGVmaW5pdGlvbnMvdW5kZWZpbml0aW9ucyBpZgorICAgICAgICAjIGFscmVhZHkgdGhlcmUgKHNvIHRoYXQgdGhpcyBvbmUgd2lsbCB0YWtlIHByZWNlZGVuY2UpLgorICAgICAgICBpID0gc2VsZi5fZmluZF9tYWNybyAobmFtZSkKKyAgICAgICAgaWYgaSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlbCBzZWxmLm1hY3Jvc1tpXQorCisgICAgICAgIGRlZm4gPSAobmFtZSwgdmFsdWUpCisgICAgICAgIHNlbGYubWFjcm9zLmFwcGVuZCAoZGVmbikKKworICAgIGRlZiB1bmRlZmluZV9tYWNybyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiVW5kZWZpbmUgYSBwcmVwcm9jZXNzb3IgbWFjcm8gZm9yIGFsbCBjb21waWxhdGlvbnMgZHJpdmVuIGJ5CisgICAgICAgIHRoaXMgY29tcGlsZXIgb2JqZWN0LiAgSWYgdGhlIHNhbWUgbWFjcm8gaXMgZGVmaW5lZCBieQorICAgICAgICAnZGVmaW5lX21hY3JvKCknIGFuZCB1bmRlZmluZWQgYnkgJ3VuZGVmaW5lX21hY3JvKCknIHRoZSBsYXN0IGNhbGwKKyAgICAgICAgdGFrZXMgcHJlY2VkZW5jZSAoaW5jbHVkaW5nIG11bHRpcGxlIHJlZGVmaW5pdGlvbnMgb3IKKyAgICAgICAgdW5kZWZpbml0aW9ucykuICBJZiB0aGUgbWFjcm8gaXMgcmVkZWZpbmVkL3VuZGVmaW5lZCBvbiBhCisgICAgICAgIHBlci1jb21waWxhdGlvbiBiYXNpcyAoaWUuIGluIHRoZSBjYWxsIHRvICdjb21waWxlKCknKSwgdGhlbiB0aGF0CisgICAgICAgIHRha2VzIHByZWNlZGVuY2UuCisgICAgICAgICIiIgorICAgICAgICAjIERlbGV0ZSBmcm9tIHRoZSBsaXN0IG9mIG1hY3JvIGRlZmluaXRpb25zL3VuZGVmaW5pdGlvbnMgaWYKKyAgICAgICAgIyBhbHJlYWR5IHRoZXJlIChzbyB0aGF0IHRoaXMgb25lIHdpbGwgdGFrZSBwcmVjZWRlbmNlKS4KKyAgICAgICAgaSA9IHNlbGYuX2ZpbmRfbWFjcm8gKG5hbWUpCisgICAgICAgIGlmIGkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkZWwgc2VsZi5tYWNyb3NbaV0KKworICAgICAgICB1bmRlZm4gPSAobmFtZSwpCisgICAgICAgIHNlbGYubWFjcm9zLmFwcGVuZCAodW5kZWZuKQorCisgICAgZGVmIGFkZF9pbmNsdWRlX2RpcihzZWxmLCBkaXIpOgorICAgICAgICAiIiJBZGQgJ2RpcicgdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIGZvcgorICAgICAgICBoZWFkZXIgZmlsZXMuICBUaGUgY29tcGlsZXIgaXMgaW5zdHJ1Y3RlZCB0byBzZWFyY2ggZGlyZWN0b3JpZXMgaW4KKyAgICAgICAgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIHN1cHBsaWVkIGJ5IHN1Y2Nlc3NpdmUgY2FsbHMgdG8KKyAgICAgICAgJ2FkZF9pbmNsdWRlX2RpcigpJy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzLmFwcGVuZCAoZGlyKQorCisgICAgZGVmIHNldF9pbmNsdWRlX2RpcnMoc2VsZiwgZGlycyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgc2VhcmNoZWQgdG8gJ2RpcnMnIChhCisgICAgICAgIGxpc3Qgb2Ygc3RyaW5ncykuICBPdmVycmlkZXMgYW55IHByZWNlZGluZyBjYWxscyB0bworICAgICAgICAnYWRkX2luY2x1ZGVfZGlyKCknOyBzdWJzZXF1ZW5jZSBjYWxscyB0byAnYWRkX2luY2x1ZGVfZGlyKCknIGFkZAorICAgICAgICB0byB0aGUgbGlzdCBwYXNzZWQgdG8gJ3NldF9pbmNsdWRlX2RpcnMoKScuICBUaGlzIGRvZXMgbm90IGFmZmVjdAorICAgICAgICBhbnkgbGlzdCBvZiBzdGFuZGFyZCBpbmNsdWRlIGRpcmVjdG9yaWVzIHRoYXQgdGhlIGNvbXBpbGVyIG1heQorICAgICAgICBzZWFyY2ggYnkgZGVmYXVsdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gZGlyc1s6XQorCisgICAgZGVmIGFkZF9saWJyYXJ5KHNlbGYsIGxpYm5hbWUpOgorICAgICAgICAiIiJBZGQgJ2xpYm5hbWUnIHRvIHRoZSBsaXN0IG9mIGxpYnJhcmllcyB0aGF0IHdpbGwgYmUgaW5jbHVkZWQgaW4KKyAgICAgICAgYWxsIGxpbmtzIGRyaXZlbiBieSB0aGlzIGNvbXBpbGVyIG9iamVjdC4gIE5vdGUgdGhhdCAnbGlibmFtZScKKyAgICAgICAgc2hvdWxkICpub3QqIGJlIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIGEgbGlicmFyeSwgYnV0IHRoZQorICAgICAgICBuYW1lIG9mIHRoZSBsaWJyYXJ5IGl0c2VsZjogdGhlIGFjdHVhbCBmaWxlbmFtZSB3aWxsIGJlIGluZmVycmVkIGJ5CisgICAgICAgIHRoZSBsaW5rZXIsIHRoZSBjb21waWxlciwgb3IgdGhlIGNvbXBpbGVyIGNsYXNzIChkZXBlbmRpbmcgb24gdGhlCisgICAgICAgIHBsYXRmb3JtKS4KKworICAgICAgICBUaGUgbGlua2VyIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0byBsaW5rIGFnYWluc3QgbGlicmFyaWVzIGluIHRoZQorICAgICAgICBvcmRlciB0aGV5IHdlcmUgc3VwcGxpZWQgdG8gJ2FkZF9saWJyYXJ5KCknIGFuZC9vcgorICAgICAgICAnc2V0X2xpYnJhcmllcygpJy4gIEl0IGlzIHBlcmZlY3RseSB2YWxpZCB0byBkdXBsaWNhdGUgbGlicmFyeQorICAgICAgICBuYW1lczsgdGhlIGxpbmtlciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gbGluayBhZ2FpbnN0IGxpYnJhcmllcyBhcworICAgICAgICBtYW55IHRpbWVzIGFzIHRoZXkgYXJlIG1lbnRpb25lZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubGlicmFyaWVzLmFwcGVuZCAobGlibmFtZSkKKworICAgIGRlZiBzZXRfbGlicmFyaWVzKHNlbGYsIGxpYm5hbWVzKToKKyAgICAgICAgIiIiU2V0IHRoZSBsaXN0IG9mIGxpYnJhcmllcyB0byBiZSBpbmNsdWRlZCBpbiBhbGwgbGlua3MgZHJpdmVuIGJ5CisgICAgICAgIHRoaXMgY29tcGlsZXIgb2JqZWN0IHRvICdsaWJuYW1lcycgKGEgbGlzdCBvZiBzdHJpbmdzKS4gIFRoaXMgZG9lcworICAgICAgICBub3QgYWZmZWN0IGFueSBzdGFuZGFyZCBzeXN0ZW0gbGlicmFyaWVzIHRoYXQgdGhlIGxpbmtlciBtYXkKKyAgICAgICAgaW5jbHVkZSBieSBkZWZhdWx0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5saWJyYXJpZXMgPSBsaWJuYW1lc1s6XQorCisKKyAgICBkZWYgYWRkX2xpYnJhcnlfZGlyKHNlbGYsIGRpcik6CisgICAgICAgICIiIkFkZCAnZGlyJyB0byB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgc2VhcmNoZWQgZm9yCisgICAgICAgIGxpYnJhcmllcyBzcGVjaWZpZWQgdG8gJ2FkZF9saWJyYXJ5KCknIGFuZCAnc2V0X2xpYnJhcmllcygpJy4gIFRoZQorICAgICAgICBsaW5rZXIgd2lsbCBiZSBpbnN0cnVjdGVkIHRvIHNlYXJjaCBmb3IgbGlicmFyaWVzIGluIHRoZSBvcmRlciB0aGV5CisgICAgICAgIGFyZSBzdXBwbGllZCB0byAnYWRkX2xpYnJhcnlfZGlyKCknIGFuZC9vciAnc2V0X2xpYnJhcnlfZGlycygpJy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChkaXIpCisKKyAgICBkZWYgc2V0X2xpYnJhcnlfZGlycyhzZWxmLCBkaXJzKToKKyAgICAgICAgIiIiU2V0IHRoZSBsaXN0IG9mIGxpYnJhcnkgc2VhcmNoIGRpcmVjdG9yaWVzIHRvICdkaXJzJyAoYSBsaXN0IG9mCisgICAgICAgIHN0cmluZ3MpLiAgVGhpcyBkb2VzIG5vdCBhZmZlY3QgYW55IHN0YW5kYXJkIGxpYnJhcnkgc2VhcmNoIHBhdGgKKyAgICAgICAgdGhhdCB0aGUgbGlua2VyIG1heSBzZWFyY2ggYnkgZGVmYXVsdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gZGlyc1s6XQorCisgICAgZGVmIGFkZF9ydW50aW1lX2xpYnJhcnlfZGlyKHNlbGYsIGRpcik6CisgICAgICAgICIiIkFkZCAnZGlyJyB0byB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgc2VhcmNoZWQgZm9yCisgICAgICAgIHNoYXJlZCBsaWJyYXJpZXMgYXQgcnVudGltZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucnVudGltZV9saWJyYXJ5X2RpcnMuYXBwZW5kKGRpcikKKworICAgIGRlZiBzZXRfcnVudGltZV9saWJyYXJ5X2RpcnMoc2VsZiwgZGlycyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNoYXJlZCBsaWJyYXJpZXMgYXQKKyAgICAgICAgcnVudGltZSB0byAnZGlycycgKGEgbGlzdCBvZiBzdHJpbmdzKS4gIFRoaXMgZG9lcyBub3QgYWZmZWN0IGFueQorICAgICAgICBzdGFuZGFyZCBzZWFyY2ggcGF0aCB0aGF0IHRoZSBydW50aW1lIGxpbmtlciBtYXkgc2VhcmNoIGJ5CisgICAgICAgIGRlZmF1bHQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJ1bnRpbWVfbGlicmFyeV9kaXJzID0gZGlyc1s6XQorCisgICAgZGVmIGFkZF9saW5rX29iamVjdChzZWxmLCBvYmplY3QpOgorICAgICAgICAiIiJBZGQgJ29iamVjdCcgdG8gdGhlIGxpc3Qgb2Ygb2JqZWN0IGZpbGVzIChvciBhbmFsb2d1ZXMsIHN1Y2ggYXMKKyAgICAgICAgZXhwbGljaXRseSBuYW1lZCBsaWJyYXJ5IGZpbGVzIG9yIHRoZSBvdXRwdXQgb2YgInJlc291cmNlCisgICAgICAgIGNvbXBpbGVycyIpIHRvIGJlIGluY2x1ZGVkIGluIGV2ZXJ5IGxpbmsgZHJpdmVuIGJ5IHRoaXMgY29tcGlsZXIKKyAgICAgICAgb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5vYmplY3RzLmFwcGVuZChvYmplY3QpCisKKyAgICBkZWYgc2V0X2xpbmtfb2JqZWN0cyhzZWxmLCBvYmplY3RzKToKKyAgICAgICAgIiIiU2V0IHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyAob3IgYW5hbG9ndWVzKSB0byBiZSBpbmNsdWRlZCBpbgorICAgICAgICBldmVyeSBsaW5rIHRvICdvYmplY3RzJy4gIFRoaXMgZG9lcyBub3QgYWZmZWN0IGFueSBzdGFuZGFyZCBvYmplY3QKKyAgICAgICAgZmlsZXMgdGhhdCB0aGUgbGlua2VyIG1heSBpbmNsdWRlIGJ5IGRlZmF1bHQgKHN1Y2ggYXMgc3lzdGVtCisgICAgICAgIGxpYnJhcmllcykuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm9iamVjdHMgPSBvYmplY3RzWzpdCisKKworICAgICMgLS0gUHJpdmF0ZSB1dGlsaXR5IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIChoZXJlIGZvciB0aGUgY29udmVuaWVuY2Ugb2Ygc3ViY2xhc3NlcykKKworICAgICMgSGVscGVyIG1ldGhvZCB0byBwcmVwIGNvbXBpbGVyIGluIHN1YmNsYXNzIGNvbXBpbGUoKSBtZXRob2RzCisKKyAgICBkZWYgX3NldHVwX2NvbXBpbGUoc2VsZiwgb3V0ZGlyLCBtYWNyb3MsIGluY2RpcnMsIHNvdXJjZXMsIGRlcGVuZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhKToKKyAgICAgICAgIiIiUHJvY2VzcyBhcmd1bWVudHMgYW5kIGRlY2lkZSB3aGljaCBzb3VyY2UgZmlsZXMgdG8gY29tcGlsZS4iIiIKKyAgICAgICAgaWYgb3V0ZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBvdXRkaXIgPSBzZWxmLm91dHB1dF9kaXIKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShvdXRkaXIsIHN0cik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICInb3V0cHV0X2RpcicgbXVzdCBiZSBhIHN0cmluZyBvciBOb25lIgorCisgICAgICAgIGlmIG1hY3JvcyBpcyBOb25lOgorICAgICAgICAgICAgbWFjcm9zID0gc2VsZi5tYWNyb3MKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hY3JvcywgbGlzdCk6CisgICAgICAgICAgICBtYWNyb3MgPSBtYWNyb3MgKyAoc2VsZi5tYWNyb3Mgb3IgW10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICInbWFjcm9zJyAoaWYgc3VwcGxpZWQpIG11c3QgYmUgYSBsaXN0IG9mIHR1cGxlcyIKKworICAgICAgICBpZiBpbmNkaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBpbmNkaXJzID0gc2VsZi5pbmNsdWRlX2RpcnMKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGluY2RpcnMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgaW5jZGlycyA9IGxpc3QoaW5jZGlycykgKyAoc2VsZi5pbmNsdWRlX2RpcnMgb3IgW10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICInaW5jbHVkZV9kaXJzJyAoaWYgc3VwcGxpZWQpIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MiCisKKyAgICAgICAgaWYgZXh0cmEgaXMgTm9uZToKKyAgICAgICAgICAgIGV4dHJhID0gW10KKworICAgICAgICAjIEdldCB0aGUgbGlzdCBvZiBleHBlY3RlZCBvdXRwdXQgKG9iamVjdCkgZmlsZXMKKyAgICAgICAgb2JqZWN0cyA9IHNlbGYub2JqZWN0X2ZpbGVuYW1lcyhzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX2Rpcj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9b3V0ZGlyKQorICAgICAgICBhc3NlcnQgbGVuKG9iamVjdHMpID09IGxlbihzb3VyY2VzKQorCisgICAgICAgIHBwX29wdHMgPSBnZW5fcHJlcHJvY2Vzc19vcHRpb25zKG1hY3JvcywgaW5jZGlycykKKworICAgICAgICBidWlsZCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzb3VyY2VzKSk6CisgICAgICAgICAgICBzcmMgPSBzb3VyY2VzW2ldCisgICAgICAgICAgICBvYmogPSBvYmplY3RzW2ldCisgICAgICAgICAgICBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KHNyYylbMV0KKyAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZShvYmopKQorICAgICAgICAgICAgYnVpbGRbb2JqXSA9IChzcmMsIGV4dCkKKworICAgICAgICByZXR1cm4gbWFjcm9zLCBvYmplY3RzLCBleHRyYSwgcHBfb3B0cywgYnVpbGQKKworICAgIGRlZiBfZ2V0X2NjX2FyZ3Moc2VsZiwgcHBfb3B0cywgZGVidWcsIGJlZm9yZSk6CisgICAgICAgICMgd29ya3MgZm9yIHVuaXhjY29tcGlsZXIsIGVteGNjb21waWxlciwgY3lnd2luY2NvbXBpbGVyCisgICAgICAgIGNjX2FyZ3MgPSBwcF9vcHRzICsgWyctYyddCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgY2NfYXJnc1s6MF0gPSBbJy1nJ10KKyAgICAgICAgaWYgYmVmb3JlOgorICAgICAgICAgICAgY2NfYXJnc1s6MF0gPSBiZWZvcmUKKyAgICAgICAgcmV0dXJuIGNjX2FyZ3MKKworICAgIGRlZiBfZml4X2NvbXBpbGVfYXJncyhzZWxmLCBvdXRwdXRfZGlyLCBtYWNyb3MsIGluY2x1ZGVfZGlycyk6CisgICAgICAgICIiIlR5cGVjaGVjayBhbmQgZml4LXVwIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyB0byB0aGUgJ2NvbXBpbGUoKScKKyAgICAgICAgbWV0aG9kLCBhbmQgcmV0dXJuIGZpeGVkLXVwIHZhbHVlcy4gIFNwZWNpZmljYWxseTogaWYgJ291dHB1dF9kaXInCisgICAgICAgIGlzIE5vbmUsIHJlcGxhY2VzIGl0IHdpdGggJ3NlbGYub3V0cHV0X2Rpcic7IGVuc3VyZXMgdGhhdCAnbWFjcm9zJworICAgICAgICBpcyBhIGxpc3QsIGFuZCBhdWdtZW50cyBpdCB3aXRoICdzZWxmLm1hY3Jvcyc7IGVuc3VyZXMgdGhhdAorICAgICAgICAnaW5jbHVkZV9kaXJzJyBpcyBhIGxpc3QsIGFuZCBhdWdtZW50cyBpdCB3aXRoICdzZWxmLmluY2x1ZGVfZGlycycuCisgICAgICAgIEd1YXJhbnRlZXMgdGhhdCB0aGUgcmV0dXJuZWQgdmFsdWVzIGFyZSBvZiB0aGUgY29ycmVjdCB0eXBlLAorICAgICAgICBpLmUuIGZvciAnb3V0cHV0X2RpcicgZWl0aGVyIHN0cmluZyBvciBOb25lLCBhbmQgZm9yICdtYWNyb3MnIGFuZAorICAgICAgICAnaW5jbHVkZV9kaXJzJyBlaXRoZXIgbGlzdCBvciBOb25lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0X2RpciA9IHNlbGYub3V0cHV0X2RpcgorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG91dHB1dF9kaXIsIHN0cik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICInb3V0cHV0X2RpcicgbXVzdCBiZSBhIHN0cmluZyBvciBOb25lIgorCisgICAgICAgIGlmIG1hY3JvcyBpcyBOb25lOgorICAgICAgICAgICAgbWFjcm9zID0gc2VsZi5tYWNyb3MKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1hY3JvcywgbGlzdCk6CisgICAgICAgICAgICBtYWNyb3MgPSBtYWNyb3MgKyAoc2VsZi5tYWNyb3Mgb3IgW10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICInbWFjcm9zJyAoaWYgc3VwcGxpZWQpIG11c3QgYmUgYSBsaXN0IG9mIHR1cGxlcyIKKworICAgICAgICBpZiBpbmNsdWRlX2RpcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IHNlbGYuaW5jbHVkZV9kaXJzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpbmNsdWRlX2RpcnMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgaW5jbHVkZV9kaXJzID0gbGlzdCAoaW5jbHVkZV9kaXJzKSArIChzZWxmLmluY2x1ZGVfZGlycyBvciBbXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIidpbmNsdWRlX2RpcnMnIChpZiBzdXBwbGllZCkgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyIKKworICAgICAgICByZXR1cm4gb3V0cHV0X2RpciwgbWFjcm9zLCBpbmNsdWRlX2RpcnMKKworICAgIGRlZiBfZml4X29iamVjdF9hcmdzKHNlbGYsIG9iamVjdHMsIG91dHB1dF9kaXIpOgorICAgICAgICAiIiJUeXBlY2hlY2sgYW5kIGZpeCB1cCBzb21lIGFyZ3VtZW50cyBzdXBwbGllZCB0byB2YXJpb3VzIG1ldGhvZHMuCisgICAgICAgIFNwZWNpZmljYWxseTogZW5zdXJlIHRoYXQgJ29iamVjdHMnIGlzIGEgbGlzdDsgaWYgb3V0cHV0X2RpciBpcworICAgICAgICBOb25lLCByZXBsYWNlIHdpdGggc2VsZi5vdXRwdXRfZGlyLiAgUmV0dXJuIGZpeGVkIHZlcnNpb25zIG9mCisgICAgICAgICdvYmplY3RzJyBhbmQgJ291dHB1dF9kaXInLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob2JqZWN0cywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICInb2JqZWN0cycgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgb2Ygc3RyaW5ncyIKKyAgICAgICAgb2JqZWN0cyA9IGxpc3QgKG9iamVjdHMpCisKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0X2RpciA9IHNlbGYub3V0cHV0X2RpcgorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG91dHB1dF9kaXIsIHN0cik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICInb3V0cHV0X2RpcicgbXVzdCBiZSBhIHN0cmluZyBvciBOb25lIgorCisgICAgICAgIHJldHVybiAob2JqZWN0cywgb3V0cHV0X2RpcikKKworICAgIGRlZiBfZml4X2xpYl9hcmdzKHNlbGYsIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycyk6CisgICAgICAgICIiIlR5cGVjaGVjayBhbmQgZml4IHVwIHNvbWUgb2YgdGhlIGFyZ3VtZW50cyBzdXBwbGllZCB0byB0aGUKKyAgICAgICAgJ2xpbmtfKicgbWV0aG9kcy4gIFNwZWNpZmljYWxseTogZW5zdXJlIHRoYXQgYWxsIGFyZ3VtZW50cyBhcmUKKyAgICAgICAgbGlzdHMsIGFuZCBhdWdtZW50IHRoZW0gd2l0aCB0aGVpciBwZXJtYW5lbnQgdmVyc2lvbnMKKyAgICAgICAgKGVnLiAnc2VsZi5saWJyYXJpZXMnIGF1Z21lbnRzICdsaWJyYXJpZXMnKS4gIFJldHVybiBhIHR1cGxlIHdpdGgKKyAgICAgICAgZml4ZWQgdmVyc2lvbnMgb2YgYWxsIGFyZ3VtZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxpYnJhcmllcyBpcyBOb25lOgorICAgICAgICAgICAgbGlicmFyaWVzID0gc2VsZi5saWJyYXJpZXMKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGxpYnJhcmllcywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBsaWJyYXJpZXMgPSBsaXN0IChsaWJyYXJpZXMpICsgKHNlbGYubGlicmFyaWVzIG9yIFtdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ2xpYnJhcmllcycgKGlmIHN1cHBsaWVkKSBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIgorCisgICAgICAgIGlmIGxpYnJhcnlfZGlycyBpcyBOb25lOgorICAgICAgICAgICAgbGlicmFyeV9kaXJzID0gc2VsZi5saWJyYXJ5X2RpcnMKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGxpYnJhcnlfZGlycywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBsaWJyYXJ5X2RpcnMgPSBsaXN0IChsaWJyYXJ5X2RpcnMpICsgKHNlbGYubGlicmFyeV9kaXJzIG9yIFtdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ2xpYnJhcnlfZGlycycgKGlmIHN1cHBsaWVkKSBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIgorCisgICAgICAgIGlmIHJ1bnRpbWVfbGlicmFyeV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycyA9IHNlbGYucnVudGltZV9saWJyYXJ5X2RpcnMKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHJ1bnRpbWVfbGlicmFyeV9kaXJzLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzID0gKGxpc3QgKHJ1bnRpbWVfbGlicmFyeV9kaXJzKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5ydW50aW1lX2xpYnJhcnlfZGlycyBvciBbXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICIncnVudGltZV9saWJyYXJ5X2RpcnMnIChpZiBzdXBwbGllZCkgIiArIFwKKyAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzIgorCisgICAgICAgIHJldHVybiAobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzKQorCisgICAgZGVmIF9uZWVkX2xpbmsoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2ZpbGUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvIHJlbGluayB0aGUgZmlsZXMgbGlzdGVkIGluICdvYmplY3RzJworICAgICAgICB0byByZWNyZWF0ZSAnb3V0cHV0X2ZpbGUnLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5mb3JjZToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgbmV3ZXIgPSBuZXdlcl9ncm91cCAob2JqZWN0cywgb3V0cHV0X2ZpbGUsIG1pc3Npbmc9J25ld2VyJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3ZXIgPSBuZXdlcl9ncm91cCAob2JqZWN0cywgb3V0cHV0X2ZpbGUpCisgICAgICAgICAgICByZXR1cm4gbmV3ZXIKKworICAgIGRlZiBkZXRlY3RfbGFuZ3VhZ2Uoc2VsZiwgc291cmNlcyk6CisgICAgICAgICIiIkRldGVjdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBnaXZlbiBmaWxlLCBvciBsaXN0IG9mIGZpbGVzLiBVc2VzCisgICAgICAgIGxhbmd1YWdlX21hcCwgYW5kIGxhbmd1YWdlX29yZGVyIHRvIGRvIHRoZSBqb2IuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzb3VyY2VzLCBsaXN0KToKKyAgICAgICAgICAgIHNvdXJjZXMgPSBbc291cmNlc10KKyAgICAgICAgbGFuZyA9IE5vbmUKKyAgICAgICAgaW5kZXggPSBsZW4oc2VsZi5sYW5ndWFnZV9vcmRlcikKKyAgICAgICAgZm9yIHNvdXJjZSBpbiBzb3VyY2VzOgorICAgICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzb3VyY2UpCisgICAgICAgICAgICBleHRsYW5nID0gc2VsZi5sYW5ndWFnZV9tYXAuZ2V0KGV4dCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleHRpbmRleCA9IHNlbGYubGFuZ3VhZ2Vfb3JkZXIuaW5kZXgoZXh0bGFuZykKKyAgICAgICAgICAgICAgICBpZiBleHRpbmRleCA8IGluZGV4OgorICAgICAgICAgICAgICAgICAgICBsYW5nID0gZXh0bGFuZworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGV4dGluZGV4CisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBsYW5nCisKKyAgICAjIC0tIFdvcmtlciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcykKKworICAgIGRlZiBwcmVwcm9jZXNzKHNlbGYsIHNvdXJjZSwgb3V0cHV0X2ZpbGU9Tm9uZSwgbWFjcm9zPU5vbmUsCisgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPU5vbmUsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSk6CisgICAgICAgICIiIlByZXByb2Nlc3MgYSBzaW5nbGUgQy9DKysgc291cmNlIGZpbGUsIG5hbWVkIGluICdzb3VyY2UnLgorICAgICAgICBPdXRwdXQgd2lsbCBiZSB3cml0dGVuIHRvIGZpbGUgbmFtZWQgJ291dHB1dF9maWxlJywgb3Igc3Rkb3V0IGlmCisgICAgICAgICdvdXRwdXRfZmlsZScgbm90IHN1cHBsaWVkLiAgJ21hY3JvcycgaXMgYSBsaXN0IG9mIG1hY3JvCisgICAgICAgIGRlZmluaXRpb25zIGFzIGZvciAnY29tcGlsZSgpJywgd2hpY2ggd2lsbCBhdWdtZW50IHRoZSBtYWNyb3Mgc2V0CisgICAgICAgIHdpdGggJ2RlZmluZV9tYWNybygpJyBhbmQgJ3VuZGVmaW5lX21hY3JvKCknLiAgJ2luY2x1ZGVfZGlycycgaXMgYQorICAgICAgICBsaXN0IG9mIGRpcmVjdG9yeSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGRlZmF1bHQgbGlzdC4KKworICAgICAgICBSYWlzZXMgUHJlcHJvY2Vzc0Vycm9yIG9uIGZhaWx1cmUuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY29tcGlsZShzZWxmLCBzb3VyY2VzLCBvdXRwdXRfZGlyPU5vbmUsIG1hY3Jvcz1Ob25lLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgZGVwZW5kcz1Ob25lKToKKyAgICAgICAgIiIiQ29tcGlsZSBvbmUgb3IgbW9yZSBzb3VyY2UgZmlsZXMuCisKKyAgICAgICAgJ3NvdXJjZXMnIG11c3QgYmUgYSBsaXN0IG9mIGZpbGVuYW1lcywgbW9zdCBsaWtlbHkgQy9DKysKKyAgICAgICAgZmlsZXMsIGJ1dCBpbiByZWFsaXR5IGFueXRoaW5nIHRoYXQgY2FuIGJlIGhhbmRsZWQgYnkgYQorICAgICAgICBwYXJ0aWN1bGFyIGNvbXBpbGVyIGFuZCBjb21waWxlciBjbGFzcyAoZWcuIE1TVkNDb21waWxlciBjYW4KKyAgICAgICAgaGFuZGxlIHJlc291cmNlIGZpbGVzIGluICdzb3VyY2VzJykuICBSZXR1cm4gYSBsaXN0IG9mIG9iamVjdAorICAgICAgICBmaWxlbmFtZXMsIG9uZSBwZXIgc291cmNlIGZpbGVuYW1lIGluICdzb3VyY2VzJy4gIERlcGVuZGluZyBvbgorICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24sIG5vdCBhbGwgc291cmNlIGZpbGVzIHdpbGwgbmVjZXNzYXJpbHkgYmUKKyAgICAgICAgY29tcGlsZWQsIGJ1dCBhbGwgY29ycmVzcG9uZGluZyBvYmplY3QgZmlsZW5hbWVzIHdpbGwgYmUKKyAgICAgICAgcmV0dXJuZWQuCisKKyAgICAgICAgSWYgJ291dHB1dF9kaXInIGlzIGdpdmVuLCBvYmplY3QgZmlsZXMgd2lsbCBiZSBwdXQgdW5kZXIgaXQsIHdoaWxlCisgICAgICAgIHJldGFpbmluZyB0aGVpciBvcmlnaW5hbCBwYXRoIGNvbXBvbmVudC4gIFRoYXQgaXMsICJmb28vYmFyLmMiCisgICAgICAgIG5vcm1hbGx5IGNvbXBpbGVzIHRvICJmb28vYmFyLm8iIChmb3IgYSBVbml4IGltcGxlbWVudGF0aW9uKTsgaWYKKyAgICAgICAgJ291dHB1dF9kaXInIGlzICJidWlsZCIsIHRoZW4gaXQgd291bGQgY29tcGlsZSB0bworICAgICAgICAiYnVpbGQvZm9vL2Jhci5vIi4KKworICAgICAgICAnbWFjcm9zJywgaWYgZ2l2ZW4sIG11c3QgYmUgYSBsaXN0IG9mIG1hY3JvIGRlZmluaXRpb25zLiAgQSBtYWNybworICAgICAgICBkZWZpbml0aW9uIGlzIGVpdGhlciBhIChuYW1lLCB2YWx1ZSkgMi10dXBsZSBvciBhIChuYW1lLCkgMS10dXBsZS4KKyAgICAgICAgVGhlIGZvcm1lciBkZWZpbmVzIGEgbWFjcm87IGlmIHRoZSB2YWx1ZSBpcyBOb25lLCB0aGUgbWFjcm8gaXMKKyAgICAgICAgZGVmaW5lZCB3aXRob3V0IGFuIGV4cGxpY2l0IHZhbHVlLiAgVGhlIDEtdHVwbGUgY2FzZSB1bmRlZmluZXMgYQorICAgICAgICBtYWNyby4gIExhdGVyIGRlZmluaXRpb25zL3JlZGVmaW5pdGlvbnMvIHVuZGVmaW5pdGlvbnMgdGFrZQorICAgICAgICBwcmVjZWRlbmNlLgorCisgICAgICAgICdpbmNsdWRlX2RpcnMnLCBpZiBnaXZlbiwgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncywgdGhlCisgICAgICAgIGRpcmVjdG9yaWVzIHRvIGFkZCB0byB0aGUgZGVmYXVsdCBpbmNsdWRlIGZpbGUgc2VhcmNoIHBhdGggZm9yIHRoaXMKKyAgICAgICAgY29tcGlsYXRpb24gb25seS4KKworICAgICAgICAnZGVidWcnIGlzIGEgYm9vbGVhbjsgaWYgdHJ1ZSwgdGhlIGNvbXBpbGVyIHdpbGwgYmUgaW5zdHJ1Y3RlZCB0bworICAgICAgICBvdXRwdXQgZGVidWcgc3ltYm9scyBpbiAob3IgYWxvbmdzaWRlKSB0aGUgb2JqZWN0IGZpbGUocykuCisKKyAgICAgICAgJ2V4dHJhX3ByZWFyZ3MnIGFuZCAnZXh0cmFfcG9zdGFyZ3MnIGFyZSBpbXBsZW1lbnRhdGlvbi0gZGVwZW5kZW50LgorICAgICAgICBPbiBwbGF0Zm9ybXMgdGhhdCBoYXZlIHRoZSBub3Rpb24gb2YgYSBjb21tYW5kLWxpbmUgKGUuZy4gVW5peCwKKyAgICAgICAgRE9TL1dpbmRvd3MpLCB0aGV5IGFyZSBtb3N0IGxpa2VseSBsaXN0cyBvZiBzdHJpbmdzOiBleHRyYQorICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHRvIHByZXBhbmQvYXBwZW5kIHRvIHRoZSBjb21waWxlciBjb21tYW5kCisgICAgICAgIGxpbmUuICBPbiBvdGhlciBwbGF0Zm9ybXMsIGNvbnN1bHQgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzCisgICAgICAgIGRvY3VtZW50YXRpb24uICBJbiBhbnkgZXZlbnQsIHRoZXkgYXJlIGludGVuZGVkIGFzIGFuIGVzY2FwZSBoYXRjaAorICAgICAgICBmb3IgdGhvc2Ugb2NjYXNpb25zIHdoZW4gdGhlIGFic3RyYWN0IGNvbXBpbGVyIGZyYW1ld29yayBkb2Vzbid0CisgICAgICAgIGN1dCB0aGUgbXVzdGFyZC4KKworICAgICAgICAnZGVwZW5kcycsIGlmIGdpdmVuLCBpcyBhIGxpc3Qgb2YgZmlsZW5hbWVzIHRoYXQgYWxsIHRhcmdldHMKKyAgICAgICAgZGVwZW5kIG9uLiAgSWYgYSBzb3VyY2UgZmlsZSBpcyBvbGRlciB0aGFuIGFueSBmaWxlIGluCisgICAgICAgIGRlcGVuZHMsIHRoZW4gdGhlIHNvdXJjZSBmaWxlIHdpbGwgYmUgcmVjb21waWxlZC4gIFRoaXMKKyAgICAgICAgc3VwcG9ydHMgZGVwZW5kZW5jeSB0cmFja2luZywgYnV0IG9ubHkgYXQgYSBjb2Fyc2UKKyAgICAgICAgZ3JhbnVsYXJpdHkuCisKKyAgICAgICAgUmFpc2VzIENvbXBpbGVFcnJvciBvbiBmYWlsdXJlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBBIGNvbmNyZXRlIGNvbXBpbGVyIGNsYXNzIGNhbiBlaXRoZXIgb3ZlcnJpZGUgdGhpcyBtZXRob2QKKyAgICAgICAgIyBlbnRpcmVseSBvciBpbXBsZW1lbnQgX2NvbXBpbGUoKS4KKworICAgICAgICBtYWNyb3MsIG9iamVjdHMsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzLCBidWlsZCA9IFwKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXR1cF9jb21waWxlKG91dHB1dF9kaXIsIG1hY3JvcywgaW5jbHVkZV9kaXJzLCBzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcywgZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgIGNjX2FyZ3MgPSBzZWxmLl9nZXRfY2NfYXJncyhwcF9vcHRzLCBkZWJ1ZywgZXh0cmFfcHJlYXJncykKKworICAgICAgICBmb3Igb2JqIGluIG9iamVjdHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3JjLCBleHQgPSBidWlsZFtvYmpdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUob2JqLCBzcmMsIGV4dCwgY2NfYXJncywgZXh0cmFfcG9zdGFyZ3MsIHBwX29wdHMpCisKKyAgICAgICAgIyBSZXR1cm4gKmFsbCogb2JqZWN0IGZpbGVuYW1lcywgbm90IGp1c3QgdGhlIG9uZXMgd2UganVzdCBidWlsdC4KKyAgICAgICAgcmV0dXJuIG9iamVjdHMKKworICAgIGRlZiBfY29tcGlsZShzZWxmLCBvYmosIHNyYywgZXh0LCBjY19hcmdzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cyk6CisgICAgICAgICIiIkNvbXBpbGUgJ3NyYycgdG8gcHJvZHVjdCAnb2JqJy4iIiIKKworICAgICAgICAjIEEgY29uY3JldGUgY29tcGlsZXIgY2xhc3MgdGhhdCBkb2VzIG5vdCBvdmVycmlkZSBjb21waWxlKCkKKyAgICAgICAgIyBzaG91bGQgaW1wbGVtZW50IF9jb21waWxlKCkuCisgICAgICAgIHBhc3MKKworICAgIGRlZiBjcmVhdGVfc3RhdGljX2xpYihzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0wLCB0YXJnZXRfbGFuZz1Ob25lKToKKyAgICAgICAgIiIiTGluayBhIGJ1bmNoIG9mIHN0dWZmIHRvZ2V0aGVyIHRvIGNyZWF0ZSBhIHN0YXRpYyBsaWJyYXJ5IGZpbGUuCisgICAgICAgIFRoZSAiYnVuY2ggb2Ygc3R1ZmYiIGNvbnNpc3RzIG9mIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBzdXBwbGllZAorICAgICAgICBhcyAnb2JqZWN0cycsIHRoZSBleHRyYSBvYmplY3QgZmlsZXMgc3VwcGxpZWQgdG8KKyAgICAgICAgJ2FkZF9saW5rX29iamVjdCgpJyBhbmQvb3IgJ3NldF9saW5rX29iamVjdHMoKScsIHRoZSBsaWJyYXJpZXMKKyAgICAgICAgc3VwcGxpZWQgdG8gJ2FkZF9saWJyYXJ5KCknIGFuZC9vciAnc2V0X2xpYnJhcmllcygpJywgYW5kIHRoZQorICAgICAgICBsaWJyYXJpZXMgc3VwcGxpZWQgYXMgJ2xpYnJhcmllcycgKGlmIGFueSkuCisKKyAgICAgICAgJ291dHB1dF9saWJuYW1lJyBzaG91bGQgYmUgYSBsaWJyYXJ5IG5hbWUsIG5vdCBhIGZpbGVuYW1lOyB0aGUKKyAgICAgICAgZmlsZW5hbWUgd2lsbCBiZSBpbmZlcnJlZCBmcm9tIHRoZSBsaWJyYXJ5IG5hbWUuICAnb3V0cHV0X2RpcicgaXMKKyAgICAgICAgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGlicmFyeSBmaWxlIHdpbGwgYmUgcHV0LgorCisgICAgICAgICdkZWJ1ZycgaXMgYSBib29sZWFuOyBpZiB0cnVlLCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2lsbCBiZQorICAgICAgICBpbmNsdWRlZCBpbiB0aGUgbGlicmFyeSAobm90ZSB0aGF0IG9uIG1vc3QgcGxhdGZvcm1zLCBpdCBpcyB0aGUKKyAgICAgICAgY29tcGlsZSBzdGVwIHdoZXJlIHRoaXMgbWF0dGVyczogdGhlICdkZWJ1ZycgZmxhZyBpcyBpbmNsdWRlZCBoZXJlCisgICAgICAgIGp1c3QgZm9yIGNvbnNpc3RlbmN5KS4KKworICAgICAgICAndGFyZ2V0X2xhbmcnIGlzIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZm9yIHdoaWNoIHRoZSBnaXZlbiBvYmplY3RzCisgICAgICAgIGFyZSBiZWluZyBjb21waWxlZC4gVGhpcyBhbGxvd3Mgc3BlY2lmaWMgbGlua2FnZSB0aW1lIHRyZWF0bWVudCBvZgorICAgICAgICBjZXJ0YWluIGxhbmd1YWdlcy4KKworICAgICAgICBSYWlzZXMgTGliRXJyb3Igb24gZmFpbHVyZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworICAgICMgdmFsdWVzIGZvciB0YXJnZXRfZGVzYyBwYXJhbWV0ZXIgaW4gbGluaygpCisgICAgU0hBUkVEX09CSkVDVCA9ICJzaGFyZWRfb2JqZWN0IgorICAgIFNIQVJFRF9MSUJSQVJZID0gInNoYXJlZF9saWJyYXJ5IgorICAgIEVYRUNVVEFCTEUgPSAiZXhlY3V0YWJsZSIKKworICAgIGRlZiBsaW5rKHNlbGYsIHRhcmdldF9kZXNjLCBvYmplY3RzLCBvdXRwdXRfZmlsZW5hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZSk6CisgICAgICAgICIiIkxpbmsgYSBidW5jaCBvZiBzdHVmZiB0b2dldGhlciB0byBjcmVhdGUgYW4gZXhlY3V0YWJsZSBvcgorICAgICAgICBzaGFyZWQgbGlicmFyeSBmaWxlLgorCisgICAgICAgIFRoZSAiYnVuY2ggb2Ygc3R1ZmYiIGNvbnNpc3RzIG9mIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBzdXBwbGllZAorICAgICAgICBhcyAnb2JqZWN0cycuICAnb3V0cHV0X2ZpbGVuYW1lJyBzaG91bGQgYmUgYSBmaWxlbmFtZS4gIElmCisgICAgICAgICdvdXRwdXRfZGlyJyBpcyBzdXBwbGllZCwgJ291dHB1dF9maWxlbmFtZScgaXMgcmVsYXRpdmUgdG8gaXQKKyAgICAgICAgKGkuZS4gJ291dHB1dF9maWxlbmFtZScgY2FuIHByb3ZpZGUgZGlyZWN0b3J5IGNvbXBvbmVudHMgaWYKKyAgICAgICAgbmVlZGVkKS4KKworICAgICAgICAnbGlicmFyaWVzJyBpcyBhIGxpc3Qgb2YgbGlicmFyaWVzIHRvIGxpbmsgYWdhaW5zdC4gIFRoZXNlIGFyZQorICAgICAgICBsaWJyYXJ5IG5hbWVzLCBub3QgZmlsZW5hbWVzLCBzaW5jZSB0aGV5J3JlIHRyYW5zbGF0ZWQgaW50bworICAgICAgICBmaWxlbmFtZXMgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkgKGVnLiAiZm9vIiBiZWNvbWVzICJsaWJmb28uYSIKKyAgICAgICAgb24gVW5peCBhbmQgImZvby5saWIiIG9uIERPUy9XaW5kb3dzKS4gIEhvd2V2ZXIsIHRoZXkgY2FuIGluY2x1ZGUgYQorICAgICAgICBkaXJlY3RvcnkgY29tcG9uZW50LCB3aGljaCBtZWFucyB0aGUgbGlua2VyIHdpbGwgbG9vayBpbiB0aGF0CisgICAgICAgIHNwZWNpZmljIGRpcmVjdG9yeSByYXRoZXIgdGhhbiBzZWFyY2hpbmcgYWxsIHRoZSBub3JtYWwgbG9jYXRpb25zLgorCisgICAgICAgICdsaWJyYXJ5X2RpcnMnLCBpZiBzdXBwbGllZCwgc2hvdWxkIGJlIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0bworICAgICAgICBzZWFyY2ggZm9yIGxpYnJhcmllcyB0aGF0IHdlcmUgc3BlY2lmaWVkIGFzIGJhcmUgbGlicmFyeSBuYW1lcworICAgICAgICAoaWUuIG5vIGRpcmVjdG9yeSBjb21wb25lbnQpLiAgVGhlc2UgYXJlIG9uIHRvcCBvZiB0aGUgc3lzdGVtCisgICAgICAgIGRlZmF1bHQgYW5kIHRob3NlIHN1cHBsaWVkIHRvICdhZGRfbGlicmFyeV9kaXIoKScgYW5kL29yCisgICAgICAgICdzZXRfbGlicmFyeV9kaXJzKCknLiAgJ3J1bnRpbWVfbGlicmFyeV9kaXJzJyBpcyBhIGxpc3Qgb2YKKyAgICAgICAgZGlyZWN0b3JpZXMgdGhhdCB3aWxsIGJlIGVtYmVkZGVkIGludG8gdGhlIHNoYXJlZCBsaWJyYXJ5IGFuZCB1c2VkCisgICAgICAgIHRvIHNlYXJjaCBmb3Igb3RoZXIgc2hhcmVkIGxpYnJhcmllcyB0aGF0ICppdCogZGVwZW5kcyBvbiBhdAorICAgICAgICBydW4tdGltZS4gIChUaGlzIG1heSBvbmx5IGJlIHJlbGV2YW50IG9uIFVuaXguKQorCisgICAgICAgICdleHBvcnRfc3ltYm9scycgaXMgYSBsaXN0IG9mIHN5bWJvbHMgdGhhdCB0aGUgc2hhcmVkIGxpYnJhcnkgd2lsbAorICAgICAgICBleHBvcnQuICAoVGhpcyBhcHBlYXJzIHRvIGJlIHJlbGV2YW50IG9ubHkgb24gV2luZG93cy4pCisKKyAgICAgICAgJ2RlYnVnJyBpcyBhcyBmb3IgJ2NvbXBpbGUoKScgYW5kICdjcmVhdGVfc3RhdGljX2xpYigpJywgd2l0aCB0aGUKKyAgICAgICAgc2xpZ2h0IGRpc3RpbmN0aW9uIHRoYXQgaXQgYWN0dWFsbHkgbWF0dGVycyBvbiBtb3N0IHBsYXRmb3JtcyAoYXMKKyAgICAgICAgb3Bwb3NlZCB0byAnY3JlYXRlX3N0YXRpY19saWIoKScsIHdoaWNoIGluY2x1ZGVzIGEgJ2RlYnVnJyBmbGFnCisgICAgICAgIG1vc3RseSBmb3IgZm9ybSdzIHNha2UpLgorCisgICAgICAgICdleHRyYV9wcmVhcmdzJyBhbmQgJ2V4dHJhX3Bvc3RhcmdzJyBhcmUgYXMgZm9yICdjb21waWxlKCknIChleGNlcHQKKyAgICAgICAgb2YgY291cnNlIHRoYXQgdGhleSBzdXBwbHkgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgdGhlCisgICAgICAgIHBhcnRpY3VsYXIgbGlua2VyIGJlaW5nIHVzZWQpLgorCisgICAgICAgICd0YXJnZXRfbGFuZycgaXMgdGhlIHRhcmdldCBsYW5ndWFnZSBmb3Igd2hpY2ggdGhlIGdpdmVuIG9iamVjdHMKKyAgICAgICAgYXJlIGJlaW5nIGNvbXBpbGVkLiBUaGlzIGFsbG93cyBzcGVjaWZpYyBsaW5rYWdlIHRpbWUgdHJlYXRtZW50IG9mCisgICAgICAgIGNlcnRhaW4gbGFuZ3VhZ2VzLgorCisgICAgICAgIFJhaXNlcyBMaW5rRXJyb3Igb24gZmFpbHVyZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisgICAgIyBPbGQgJ2xpbmtfKigpJyBtZXRob2RzLCByZXdyaXR0ZW4gdG8gdXNlIHRoZSBuZXcgJ2xpbmsoKScgbWV0aG9kLgorCisgICAgZGVmIGxpbmtfc2hhcmVkX2xpYihzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX3RlbXA9Tm9uZSwgdGFyZ2V0X2xhbmc9Tm9uZSk6CisgICAgICAgIHNlbGYubGluayhDQ29tcGlsZXIuU0hBUkVEX0xJQlJBUlksIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZmlsZW5hbWUob3V0cHV0X2xpYm5hbWUsIGxpYl90eXBlPSdzaGFyZWQnKSwKKyAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICBleHBvcnRfc3ltYm9scywgZGVidWcsCisgICAgICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzLCBleHRyYV9wb3N0YXJncywgYnVpbGRfdGVtcCwgdGFyZ2V0X2xhbmcpCisKKworICAgIGRlZiBsaW5rX3NoYXJlZF9vYmplY3Qoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLCBleHBvcnRfc3ltYm9scz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRfdGVtcD1Ob25lLCB0YXJnZXRfbGFuZz1Ob25lKToKKyAgICAgICAgc2VsZi5saW5rKENDb21waWxlci5TSEFSRURfT0JKRUNULCBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lLCBvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHMsIGRlYnVnLAorICAgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncywgZXh0cmFfcG9zdGFyZ3MsIGJ1aWxkX3RlbXAsIHRhcmdldF9sYW5nKQorCisgICAgZGVmIGxpbmtfZXhlY3V0YWJsZShzZWxmLCBvYmplY3RzLCBvdXRwdXRfcHJvZ25hbWUsIG91dHB1dF9kaXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsIHRhcmdldF9sYW5nPU5vbmUpOgorICAgICAgICBzZWxmLmxpbmsoQ0NvbXBpbGVyLkVYRUNVVEFCTEUsIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGFibGVfZmlsZW5hbWUob3V0cHV0X3Byb2duYW1lKSwgb3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywgTm9uZSwKKyAgICAgICAgICAgICAgICAgIGRlYnVnLCBleHRyYV9wcmVhcmdzLCBleHRyYV9wb3N0YXJncywgTm9uZSwgdGFyZ2V0X2xhbmcpCisKKworICAgICMgLS0gTWlzY2VsbGFuZW91cyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUaGVzZSBhcmUgYWxsIHVzZWQgYnkgdGhlICdnZW5fbGliX29wdGlvbnMoKSBmdW5jdGlvbjsgdGhlcmUgaXMKKyAgICAjIG5vIGFwcHJvcHJpYXRlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc28gc3ViY2xhc3NlcyBzaG91bGQKKyAgICAjIGltcGxlbWVudCBhbGwgb2YgdGhlc2UuCisKKyAgICBkZWYgbGlicmFyeV9kaXJfb3B0aW9uKHNlbGYsIGRpcik6CisgICAgICAgICIiIlJldHVybiB0aGUgY29tcGlsZXIgb3B0aW9uIHRvIGFkZCAnZGlyJyB0byB0aGUgbGlzdCBvZgorICAgICAgICBkaXJlY3RvcmllcyBzZWFyY2hlZCBmb3IgbGlicmFyaWVzLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHJ1bnRpbWVfbGlicmFyeV9kaXJfb3B0aW9uKHNlbGYsIGRpcik6CisgICAgICAgICIiIlJldHVybiB0aGUgY29tcGlsZXIgb3B0aW9uIHRvIGFkZCAnZGlyJyB0byB0aGUgbGlzdCBvZgorICAgICAgICBkaXJlY3RvcmllcyBzZWFyY2hlZCBmb3IgcnVudGltZSBsaWJyYXJpZXMuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgbGlicmFyeV9vcHRpb24oc2VsZiwgbGliKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb21waWxlciBvcHRpb24gdG8gYWRkICdkaXInIHRvIHRoZSBsaXN0IG9mIGxpYnJhcmllcworICAgICAgICBsaW5rZWQgaW50byB0aGUgc2hhcmVkIGxpYnJhcnkgb3IgZXhlY3V0YWJsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBoYXNfZnVuY3Rpb24oc2VsZiwgZnVuY25hbWUsIGluY2x1ZGVzPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgZnVuY25hbWUgaXMgc3VwcG9ydGVkIG9uCisgICAgICAgIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0bworICAgICAgICBhdWdtZW50IHRoZSBjb21waWxhdGlvbiBlbnZpcm9ubWVudC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyB0aGlzIGNhbid0IGJlIGluY2x1ZGVkIGF0IG1vZHVsZSBzY29wZSBiZWNhdXNlIGl0IHRyaWVzIHRvCisgICAgICAgICMgaW1wb3J0IG1hdGggd2hpY2ggbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBhdCB0aGF0IHBvaW50IC0gbWF5YmUKKyAgICAgICAgIyB0aGUgbmVjZXNzYXJ5IGxvZ2ljIHNob3VsZCBqdXN0IGJlIGlubGluZWQ/CisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorICAgICAgICBpZiBpbmNsdWRlcyBpcyBOb25lOgorICAgICAgICAgICAgaW5jbHVkZXMgPSBbXQorICAgICAgICBpZiBpbmNsdWRlX2RpcnMgaXMgTm9uZToKKyAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IFtdCisgICAgICAgIGlmIGxpYnJhcmllcyBpcyBOb25lOgorICAgICAgICAgICAgbGlicmFyaWVzID0gW10KKyAgICAgICAgaWYgbGlicmFyeV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBsaWJyYXJ5X2RpcnMgPSBbXQorICAgICAgICBmZCwgZm5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCIuYyIsIGZ1bmNuYW1lLCB0ZXh0PVRydWUpCisgICAgICAgIGYgPSBvcy5mZG9wZW4oZmQsICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGluY2wgaW4gaW5jbHVkZXM6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiIiIjaW5jbHVkZSAiJXMiXG4iIiIgJSBpbmNsKQorICAgICAgICAgICAgZi53cml0ZSgiIiJcCittYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICAlcygpOworfQorIiIiICUgZnVuY25hbWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqZWN0cyA9IHNlbGYuY29tcGlsZShbZm5hbWVdLCBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzKQorICAgICAgICBleGNlcHQgQ29tcGlsZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5saW5rX2V4ZWN1dGFibGUob2JqZWN0cywgImEub3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1saWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9bGlicmFyeV9kaXJzKQorICAgICAgICBleGNlcHQgKExpbmtFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGZpbmRfbGlicmFyeV9maWxlIChzZWxmLCBkaXJzLCBsaWIsIGRlYnVnPTApOgorICAgICAgICAiIiJTZWFyY2ggdGhlIHNwZWNpZmllZCBsaXN0IG9mIGRpcmVjdG9yaWVzIGZvciBhIHN0YXRpYyBvciBzaGFyZWQKKyAgICAgICAgbGlicmFyeSBmaWxlICdsaWInIGFuZCByZXR1cm4gdGhlIGZ1bGwgcGF0aCB0byB0aGF0IGZpbGUuICBJZgorICAgICAgICAnZGVidWcnIHRydWUsIGxvb2sgZm9yIGEgZGVidWdnaW5nIHZlcnNpb24gKGlmIHRoYXQgbWFrZXMgc2Vuc2Ugb24KKyAgICAgICAgdGhlIGN1cnJlbnQgcGxhdGZvcm0pLiAgUmV0dXJuIE5vbmUgaWYgJ2xpYicgd2Fzbid0IGZvdW5kIGluIGFueSBvZgorICAgICAgICB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yaWVzLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgIyAtLSBGaWxlbmFtZSBnZW5lcmF0aW9uIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICMgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGZpbGVuYW1lIGdlbmVyYXRpbmcgbWV0aG9kcyBhcmUKKyAgICAjIHByZWp1ZGljZWQgdG93YXJkcyB0aGUgVW5peC9ET1MvV2luZG93cyB2aWV3IG9mIHRoZSB3b3JsZDoKKyAgICAjICAgKiBvYmplY3QgZmlsZXMgYXJlIG5hbWVkIGJ5IHJlcGxhY2luZyB0aGUgc291cmNlIGZpbGUgZXh0ZW5zaW9uCisgICAgIyAgICAgKGVnLiAuYy8uY3BwIC0+IC5vLy5vYmopCisgICAgIyAgICogbGlicmFyeSBmaWxlcyAoc2hhcmVkIG9yIHN0YXRpYykgYXJlIG5hbWVkIGJ5IHBsdWdnaW5nIHRoZQorICAgICMgICAgIGxpYnJhcnkgbmFtZSBhbmQgZXh0ZW5zaW9uIGludG8gYSBmb3JtYXQgc3RyaW5nLCBlZy4KKyAgICAjICAgICAibGliJXMuJXMiICUgKGxpYl9uYW1lLCAiLmEiKSBmb3IgVW5peCBzdGF0aWMgbGlicmFyaWVzCisgICAgIyAgICogZXhlY3V0YWJsZXMgYXJlIG5hbWVkIGJ5IGFwcGVuZGluZyBhbiBleHRlbnNpb24gKHBvc3NpYmx5CisgICAgIyAgICAgZW1wdHkpIHRvIHRoZSBwcm9ncmFtIG5hbWU6IGVnLiBwcm9nbmFtZSArICIuZXhlIiBmb3IKKyAgICAjICAgICBXaW5kb3dzCisgICAgIworICAgICMgVG8gcmVkdWNlIHJlZHVuZGFudCBjb2RlLCB0aGVzZSBtZXRob2RzIGV4cGVjdCB0byBmaW5kCisgICAgIyBzZXZlcmFsIGF0dHJpYnV0ZXMgaW4gdGhlIGN1cnJlbnQgb2JqZWN0IChwcmVzdW1hYmx5IGRlZmluZWQKKyAgICAjIGFzIGNsYXNzIGF0dHJpYnV0ZXMpOgorICAgICMgICAqIHNyY19leHRlbnNpb25zIC0KKyAgICAjICAgICBsaXN0IG9mIEMvQysrIHNvdXJjZSBmaWxlIGV4dGVuc2lvbnMsIGVnLiBbJy5jJywgJy5jcHAnXQorICAgICMgICAqIG9ial9leHRlbnNpb24gLQorICAgICMgICAgIG9iamVjdCBmaWxlIGV4dGVuc2lvbiwgZWcuICcubycgb3IgJy5vYmonCisgICAgIyAgICogc3RhdGljX2xpYl9leHRlbnNpb24gLQorICAgICMgICAgIGV4dGVuc2lvbiBmb3Igc3RhdGljIGxpYnJhcnkgZmlsZXMsIGVnLiAnLmEnIG9yICcubGliJworICAgICMgICAqIHNoYXJlZF9saWJfZXh0ZW5zaW9uIC0KKyAgICAjICAgICBleHRlbnNpb24gZm9yIHNoYXJlZCBsaWJyYXJ5L29iamVjdCBmaWxlcywgZWcuICcuc28nLCAnLmRsbCcKKyAgICAjICAgKiBzdGF0aWNfbGliX2Zvcm1hdCAtCisgICAgIyAgICAgZm9ybWF0IHN0cmluZyBmb3IgZ2VuZXJhdGluZyBzdGF0aWMgbGlicmFyeSBmaWxlbmFtZXMsCisgICAgIyAgICAgZWcuICdsaWIlcy4lcycgb3IgJyVzLiVzJworICAgICMgICAqIHNoYXJlZF9saWJfZm9ybWF0CisgICAgIyAgICAgZm9ybWF0IHN0cmluZyBmb3IgZ2VuZXJhdGluZyBzaGFyZWQgbGlicmFyeSBmaWxlbmFtZXMKKyAgICAjICAgICAocHJvYmFibHkgc2FtZSBhcyBzdGF0aWNfbGliX2Zvcm1hdCwgc2luY2UgdGhlIGV4dGVuc2lvbgorICAgICMgICAgIGlzIG9uZSBvZiB0aGUgaW50ZW5kZWQgcGFyYW1ldGVycyB0byB0aGUgZm9ybWF0IHN0cmluZykKKyAgICAjICAgKiBleGVfZXh0ZW5zaW9uIC0KKyAgICAjICAgICBleHRlbnNpb24gZm9yIGV4ZWN1dGFibGUgZmlsZXMsIGVnLiAnJyBvciAnLmV4ZScKKworICAgIGRlZiBvYmplY3RfZmlsZW5hbWVzKHNlbGYsIHNvdXJjZV9maWxlbmFtZXMsIHN0cmlwX2Rpcj0wLCBvdXRwdXRfZGlyPScnKToKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBOb25lOgorICAgICAgICAgICAgb3V0cHV0X2RpciA9ICcnCisgICAgICAgIG9ial9uYW1lcyA9IFtdCisgICAgICAgIGZvciBzcmNfbmFtZSBpbiBzb3VyY2VfZmlsZW5hbWVzOgorICAgICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzcmNfbmFtZSkKKyAgICAgICAgICAgIGJhc2UgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoYmFzZSlbMV0gIyBDaG9wIG9mZiB0aGUgZHJpdmUKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlW29zLnBhdGguaXNhYnMoYmFzZSk6XSAgIyBJZiBhYnMsIGNob3Agb2ZmIGxlYWRpbmcgLworICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiBzZWxmLnNyY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25GaWxlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBmaWxlIHR5cGUgJyVzJyAoZnJvbSAnJXMnKSIgJSAoZXh0LCBzcmNfbmFtZSkKKyAgICAgICAgICAgIGlmIHN0cmlwX2RpcjoKKyAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShiYXNlKQorICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZChvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBzZWxmLm9ial9leHRlbnNpb24pKQorICAgICAgICByZXR1cm4gb2JqX25hbWVzCisKKyAgICBkZWYgc2hhcmVkX29iamVjdF9maWxlbmFtZShzZWxmLCBiYXNlbmFtZSwgc3RyaXBfZGlyPTAsIG91dHB1dF9kaXI9JycpOgorICAgICAgICBhc3NlcnQgb3V0cHV0X2RpciBpcyBub3QgTm9uZQorICAgICAgICBpZiBzdHJpcF9kaXI6CisgICAgICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUgKGJhc2VuYW1lKQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIGJhc2VuYW1lICsgc2VsZi5zaGFyZWRfbGliX2V4dGVuc2lvbikKKworICAgIGRlZiBleGVjdXRhYmxlX2ZpbGVuYW1lKHNlbGYsIGJhc2VuYW1lLCBzdHJpcF9kaXI9MCwgb3V0cHV0X2Rpcj0nJyk6CisgICAgICAgIGFzc2VydCBvdXRwdXRfZGlyIGlzIG5vdCBOb25lCisgICAgICAgIGlmIHN0cmlwX2RpcjoKKyAgICAgICAgICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZSAoYmFzZW5hbWUpCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgYmFzZW5hbWUgKyAoc2VsZi5leGVfZXh0ZW5zaW9uIG9yICcnKSkKKworICAgIGRlZiBsaWJyYXJ5X2ZpbGVuYW1lKHNlbGYsIGxpYm5hbWUsIGxpYl90eXBlPSdzdGF0aWMnLCAgICAgIyBvciAnc2hhcmVkJworICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX2Rpcj0wLCBvdXRwdXRfZGlyPScnKToKKyAgICAgICAgYXNzZXJ0IG91dHB1dF9kaXIgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgbGliX3R5cGUgbm90IGluICgic3RhdGljIiwgInNoYXJlZCIsICJkeWxpYiIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIidsaWJfdHlwZScgbXVzdCBiZSBcInN0YXRpY1wiLCBcInNoYXJlZFwiIG9yIFwiZHlsaWJcIiIKKyAgICAgICAgZm10ID0gZ2V0YXR0cihzZWxmLCBsaWJfdHlwZSArICJfbGliX2Zvcm1hdCIpCisgICAgICAgIGV4dCA9IGdldGF0dHIoc2VsZiwgbGliX3R5cGUgKyAiX2xpYl9leHRlbnNpb24iKQorCisgICAgICAgIGRpciwgYmFzZSA9IG9zLnBhdGguc3BsaXQgKGxpYm5hbWUpCisgICAgICAgIGZpbGVuYW1lID0gZm10ICUgKGJhc2UsIGV4dCkKKyAgICAgICAgaWYgc3RyaXBfZGlyOgorICAgICAgICAgICAgZGlyID0gJycKKworICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIGRpciwgZmlsZW5hbWUpCisKKworICAgICMgLS0gVXRpbGl0eSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgYW5ub3VuY2Uoc2VsZiwgbXNnLCBsZXZlbD0xKToKKyAgICAgICAgbG9nLmRlYnVnKG1zZykKKworICAgIGRlZiBkZWJ1Z19wcmludChzZWxmLCBtc2cpOgorICAgICAgICBmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCBtc2cKKworICAgIGRlZiB3YXJuKHNlbGYsIG1zZyk6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIndhcm5pbmc6ICVzXG4iICUgbXNnKQorCisgICAgZGVmIGV4ZWN1dGUoc2VsZiwgZnVuYywgYXJncywgbXNnPU5vbmUsIGxldmVsPTEpOgorICAgICAgICBleGVjdXRlKGZ1bmMsIGFyZ3MsIG1zZywgc2VsZi5kcnlfcnVuKQorCisgICAgZGVmIHNwYXduKHNlbGYsIGNtZCk6CisgICAgICAgIHNwYXduKGNtZCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgbW92ZV9maWxlKHNlbGYsIHNyYywgZHN0KToKKyAgICAgICAgcmV0dXJuIG1vdmVfZmlsZShzcmMsIGRzdCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgbWtwYXRoKHNlbGYsIG5hbWUsIG1vZGU9MDc3Nyk6CisgICAgICAgIG1rcGF0aChuYW1lLCBtb2RlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKworCisjIGNsYXNzIENDb21waWxlcgorCisKKyMgTWFwIGEgc3lzLnBsYXRmb3JtL29zLm5hbWUgKCdwb3NpeCcsICdudCcpIHRvIHRoZSBkZWZhdWx0IGNvbXBpbGVyCisjIHR5cGUgZm9yIHRoYXQgcGxhdGZvcm0uIEtleXMgYXJlIGludGVycHJldGVkIGFzIHJlIG1hdGNoCisjIHBhdHRlcm5zLiBPcmRlciBpcyBpbXBvcnRhbnQ7IHBsYXRmb3JtIG1hcHBpbmdzIGFyZSBwcmVmZXJyZWQgb3ZlcgorIyBPUyBuYW1lcy4KK19kZWZhdWx0X2NvbXBpbGVycyA9ICgKKworICAgICMgUGxhdGZvcm0gc3RyaW5nIG1hcHBpbmdzCisKKyAgICAjIG9uIGEgY3lnd2luIGJ1aWx0IHB5dGhvbiB3ZSBjYW4gdXNlIGdjYyBsaWtlIGFuIG9yZGluYXJ5IFVOSVhpc2gKKyAgICAjIGNvbXBpbGVyCisgICAgKCdjeWd3aW4uKicsICd1bml4JyksCisgICAgKCdvczJlbXgnLCAnZW14JyksCisKKyAgICAjIE9TIG5hbWUgbWFwcGluZ3MKKyAgICAoJ3Bvc2l4JywgJ3VuaXgnKSwKKyAgICAoJ250JywgJ21zdmMnKSwKKworICAgICkKKworZGVmIGdldF9kZWZhdWx0X2NvbXBpbGVyKG9zbmFtZT1Ob25lLCBwbGF0Zm9ybT1Ob25lKToKKyAgICAiIiIgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGNvbXBpbGVyIHRvIHVzZSBmb3IgdGhlIGdpdmVuIHBsYXRmb3JtLgorCisgICAgICAgIG9zbmFtZSBzaG91bGQgYmUgb25lIG9mIHRoZSBzdGFuZGFyZCBQeXRob24gT1MgbmFtZXMgKGkuZS4gdGhlCisgICAgICAgIG9uZXMgcmV0dXJuZWQgYnkgb3MubmFtZSkgYW5kIHBsYXRmb3JtIHRoZSBjb21tb24gdmFsdWUKKyAgICAgICAgcmV0dXJuZWQgYnkgc3lzLnBsYXRmb3JtIGZvciB0aGUgcGxhdGZvcm0gaW4gcXVlc3Rpb24uCisKKyAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBvcy5uYW1lIGFuZCBzeXMucGxhdGZvcm0gaW4gY2FzZSB0aGUKKyAgICAgICAgcGFyYW1ldGVycyBhcmUgbm90IGdpdmVuLgorCisgICAgIiIiCisgICAgaWYgb3NuYW1lIGlzIE5vbmU6CisgICAgICAgIG9zbmFtZSA9IG9zLm5hbWUKKyAgICBpZiBwbGF0Zm9ybSBpcyBOb25lOgorICAgICAgICBwbGF0Zm9ybSA9IHN5cy5wbGF0Zm9ybQorICAgIGlmIG9zbmFtZSA9PSAibnQiIGFuZCBzeXMudmVyc2lvbi5maW5kKCdHQ0MnKSA+PSAwOgorICAgICAgICByZXR1cm4gJ21pbmd3MzInCisgICAgZm9yIHBhdHRlcm4sIGNvbXBpbGVyIGluIF9kZWZhdWx0X2NvbXBpbGVyczoKKyAgICAgICAgaWYgcmUubWF0Y2gocGF0dGVybiwgcGxhdGZvcm0pIGlzIG5vdCBOb25lIG9yIFwKKyAgICAgICAgICAgcmUubWF0Y2gocGF0dGVybiwgb3NuYW1lKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBjb21waWxlcgorICAgICMgRGVmYXVsdCB0byBVbml4IGNvbXBpbGVyCisgICAgcmV0dXJuICd1bml4JworCisjIE1hcCBjb21waWxlciB0eXBlcyB0byAobW9kdWxlX25hbWUsIGNsYXNzX25hbWUpIHBhaXJzIC0tIGllLiB3aGVyZSB0bworIyBmaW5kIHRoZSBjb2RlIHRoYXQgaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgdG8gdGhpcyBjb21waWxlci4gIChUaGUgbW9kdWxlCisjIGlzIGFzc3VtZWQgdG8gYmUgaW4gdGhlICdkaXN0dXRpbHMnIHBhY2thZ2UuKQorY29tcGlsZXJfY2xhc3MgPSB7ICd1bml4JzogICAgKCd1bml4Y2NvbXBpbGVyJywgJ1VuaXhDQ29tcGlsZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFuZGFyZCBVTklYLXN0eWxlIGNvbXBpbGVyIiksCisgICAgICAgICAgICAgICAgICAgJ21zdmMnOiAgICAoJ21zdmNjb21waWxlcicsICdNU1ZDQ29tcGlsZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaWNyb3NvZnQgVmlzdWFsIEMrKyIpLAorICAgICAgICAgICAgICAgICAgICdjeWd3aW4nOiAgKCdjeWd3aW5jY29tcGlsZXInLCAnQ3lnd2luQ0NvbXBpbGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3lnd2luIHBvcnQgb2YgR05VIEMgQ29tcGlsZXIgZm9yIFdpbjMyIiksCisgICAgICAgICAgICAgICAgICAgJ21pbmd3MzInOiAoJ2N5Z3dpbmNjb21waWxlcicsICdNaW5ndzMyQ0NvbXBpbGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWluZ3czMiBwb3J0IG9mIEdOVSBDIENvbXBpbGVyIGZvciBXaW4zMiIpLAorICAgICAgICAgICAgICAgICAgICdiY3BwJzogICAgKCdiY3BwY29tcGlsZXInLCAnQkNQUENvbXBpbGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQm9ybGFuZCBDKysgQ29tcGlsZXIiKSwKKyAgICAgICAgICAgICAgICAgICAnZW14JzogICAgICgnZW14Y2NvbXBpbGVyJywgJ0VNWENDb21waWxlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVNWCBwb3J0IG9mIEdOVSBDIENvbXBpbGVyIGZvciBPUy8yIiksCisgICAgICAgICAgICAgICAgIH0KKworZGVmIHNob3dfY29tcGlsZXJzKCk6CisgICAgIiIiUHJpbnQgbGlzdCBvZiBhdmFpbGFibGUgY29tcGlsZXJzICh1c2VkIGJ5IHRoZSAiLS1oZWxwLWNvbXBpbGVyIgorICAgIG9wdGlvbnMgdG8gImJ1aWxkIiwgImJ1aWxkX2V4dCIsICJidWlsZF9jbGliIikuCisgICAgIiIiCisgICAgIyBYWFggdGhpcyAia25vd3MiIHRoYXQgdGhlIGNvbXBpbGVyIG9wdGlvbiBpdCdzIGRlc2NyaWJpbmcgaXMKKyAgICAjICItLWNvbXBpbGVyIiwgd2hpY2gganVzdCBoYXBwZW5zIHRvIGJlIHRoZSBjYXNlIGZvciB0aGUgdGhyZWUKKyAgICAjIGNvbW1hbmRzIHRoYXQgdXNlIGl0LgorICAgIGZyb20gZGlzdHV0aWxzLmZhbmN5X2dldG9wdCBpbXBvcnQgRmFuY3lHZXRvcHQKKyAgICBjb21waWxlcnMgPSBbXQorICAgIGZvciBjb21waWxlciBpbiBjb21waWxlcl9jbGFzcy5rZXlzKCk6CisgICAgICAgIGNvbXBpbGVycy5hcHBlbmQoKCJjb21waWxlcj0iK2NvbXBpbGVyLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcl9jbGFzc1tjb21waWxlcl1bMl0pKQorICAgIGNvbXBpbGVycy5zb3J0KCkKKyAgICBwcmV0dHlfcHJpbnRlciA9IEZhbmN5R2V0b3B0KGNvbXBpbGVycykKKyAgICBwcmV0dHlfcHJpbnRlci5wcmludF9oZWxwKCJMaXN0IG9mIGF2YWlsYWJsZSBjb21waWxlcnM6IikKKworCitkZWYgbmV3X2NvbXBpbGVyKHBsYXQ9Tm9uZSwgY29tcGlsZXI9Tm9uZSwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGZvcmNlPTApOgorICAgICIiIkdlbmVyYXRlIGFuIGluc3RhbmNlIG9mIHNvbWUgQ0NvbXBpbGVyIHN1YmNsYXNzIGZvciB0aGUgc3VwcGxpZWQKKyAgICBwbGF0Zm9ybS9jb21waWxlciBjb21iaW5hdGlvbi4gICdwbGF0JyBkZWZhdWx0cyB0byAnb3MubmFtZScKKyAgICAoZWcuICdwb3NpeCcsICdudCcpLCBhbmQgJ2NvbXBpbGVyJyBkZWZhdWx0cyB0byB0aGUgZGVmYXVsdCBjb21waWxlcgorICAgIGZvciB0aGF0IHBsYXRmb3JtLiAgQ3VycmVudGx5IG9ubHkgJ3Bvc2l4JyBhbmQgJ250JyBhcmUgc3VwcG9ydGVkLCBhbmQKKyAgICB0aGUgZGVmYXVsdCBjb21waWxlcnMgYXJlICJ0cmFkaXRpb25hbCBVbml4IGludGVyZmFjZSIgKFVuaXhDQ29tcGlsZXIKKyAgICBjbGFzcykgYW5kIFZpc3VhbCBDKysgKE1TVkNDb21waWxlciBjbGFzcykuICBOb3RlIHRoYXQgaXQncyBwZXJmZWN0bHkKKyAgICBwb3NzaWJsZSB0byBhc2sgZm9yIGEgVW5peCBjb21waWxlciBvYmplY3QgdW5kZXIgV2luZG93cywgYW5kIGEKKyAgICBNaWNyb3NvZnQgY29tcGlsZXIgb2JqZWN0IHVuZGVyIFVuaXggLS0gaWYgeW91IHN1cHBseSBhIHZhbHVlIGZvcgorICAgICdjb21waWxlcicsICdwbGF0JyBpcyBpZ25vcmVkLgorICAgICIiIgorICAgIGlmIHBsYXQgaXMgTm9uZToKKyAgICAgICAgcGxhdCA9IG9zLm5hbWUKKworICAgIHRyeToKKyAgICAgICAgaWYgY29tcGlsZXIgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyID0gZ2V0X2RlZmF1bHRfY29tcGlsZXIocGxhdCkKKworICAgICAgICAobW9kdWxlX25hbWUsIGNsYXNzX25hbWUsIGxvbmdfZGVzY3JpcHRpb24pID0gY29tcGlsZXJfY2xhc3NbY29tcGlsZXJdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBtc2cgPSAiZG9uJ3Qga25vdyBob3cgdG8gY29tcGlsZSBDL0MrKyBjb2RlIG9uIHBsYXRmb3JtICclcyciICUgcGxhdAorICAgICAgICBpZiBjb21waWxlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgd2l0aCAnJXMnIGNvbXBpbGVyIiAlIGNvbXBpbGVyCisgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIG1zZworCisgICAgdHJ5OgorICAgICAgICBtb2R1bGVfbmFtZSA9ICJkaXN0dXRpbHMuIiArIG1vZHVsZV9uYW1lCisgICAgICAgIF9faW1wb3J0X18gKG1vZHVsZV9uYW1lKQorICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KKyAgICAgICAga2xhc3MgPSB2YXJzKG1vZHVsZSlbY2xhc3NfbmFtZV0KKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc01vZHVsZUVycm9yLCBcCisgICAgICAgICAgICAgICJjYW4ndCBjb21waWxlIEMvQysrIGNvZGU6IHVuYWJsZSB0byBsb2FkIG1vZHVsZSAnJXMnIiAlIFwKKyAgICAgICAgICAgICAgbW9kdWxlX25hbWUKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc01vZHVsZUVycm9yLCBcCisgICAgICAgICAgICAgICgiY2FuJ3QgY29tcGlsZSBDL0MrKyBjb2RlOiB1bmFibGUgdG8gZmluZCBjbGFzcyAnJXMnICIgKworICAgICAgICAgICAgICAgImluIG1vZHVsZSAnJXMnIikgJSAoY2xhc3NfbmFtZSwgbW9kdWxlX25hbWUpCisKKyAgICAjIFhYWCBUaGUgTm9uZSBpcyBuZWNlc3NhcnkgdG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyAgICAjIHdpdGggY2xhc3NlcyB0aGF0IGV4cGVjdCB2ZXJib3NlIHRvIGJlIHRoZSBmaXJzdCBwb3NpdGlvbmFsCisgICAgIyBhcmd1bWVudC4KKyAgICByZXR1cm4ga2xhc3MoTm9uZSwgZHJ5X3J1biwgZm9yY2UpCisKKworZGVmIGdlbl9wcmVwcm9jZXNzX29wdGlvbnMobWFjcm9zLCBpbmNsdWRlX2RpcnMpOgorICAgICIiIkdlbmVyYXRlIEMgcHJlLXByb2Nlc3NvciBvcHRpb25zICgtRCwgLVUsIC1JKSBhcyB1c2VkIGJ5IGF0IGxlYXN0CisgICAgdHdvIHR5cGVzIG9mIGNvbXBpbGVyczogdGhlIHR5cGljYWwgVW5peCBjb21waWxlciBhbmQgVmlzdWFsIEMrKy4KKyAgICAnbWFjcm9zJyBpcyB0aGUgdXN1YWwgdGhpbmcsIGEgbGlzdCBvZiAxLSBvciAyLXR1cGxlcywgd2hlcmUgKG5hbWUsKQorICAgIG1lYW5zIHVuZGVmaW5lICgtVSkgbWFjcm8gJ25hbWUnLCBhbmQgKG5hbWUsdmFsdWUpIG1lYW5zIGRlZmluZSAoLUQpCisgICAgbWFjcm8gJ25hbWUnIHRvICd2YWx1ZScuICAnaW5jbHVkZV9kaXJzJyBpcyBqdXN0IGEgbGlzdCBvZiBkaXJlY3RvcnkKKyAgICBuYW1lcyB0byBiZSBhZGRlZCB0byB0aGUgaGVhZGVyIGZpbGUgc2VhcmNoIHBhdGggKC1JKS4gIFJldHVybnMgYSBsaXN0CisgICAgb2YgY29tbWFuZC1saW5lIG9wdGlvbnMgc3VpdGFibGUgZm9yIGVpdGhlciBVbml4IGNvbXBpbGVycyBvciBWaXN1YWwKKyAgICBDKysuCisgICAgIiIiCisgICAgIyBYWFggaXQgd291bGQgYmUgbmljZSAobWFpbmx5IGFlc3RoZXRpYywgYW5kIHNvIHdlIGRvbid0IGdlbmVyYXRlCisgICAgIyBzdHVwaWQtbG9va2luZyBjb21tYW5kIGxpbmVzKSB0byBnbyBvdmVyICdtYWNyb3MnIGFuZCBlbGltaW5hdGUKKyAgICAjIHJlZHVuZGFudCBkZWZpbml0aW9ucy91bmRlZmluaXRpb25zIChpZS4gZW5zdXJlIHRoYXQgb25seSB0aGUKKyAgICAjIGxhdGVzdCBtZW50aW9uIG9mIGEgcGFydGljdWxhciBtYWNybyB3aW5kcyB1cCBvbiB0aGUgY29tbWFuZAorICAgICMgbGluZSkuICBJIGRvbid0IHRoaW5rIGl0J3MgZXNzZW50aWFsLCB0aG91Z2gsIHNpbmNlIG1vc3QgKGFsbD8pCisgICAgIyBVbml4IEMgY29tcGlsZXJzIG9ubHkgcGF5IGF0dGVudGlvbiB0byB0aGUgbGF0ZXN0IC1EIG9yIC1VCisgICAgIyBtZW50aW9uIG9mIGEgbWFjcm8gb24gdGhlaXIgY29tbWFuZCBsaW5lLiAgU2ltaWxhciBzaXR1YXRpb24gZm9yCisgICAgIyAnaW5jbHVkZV9kaXJzJy4gIEknbSBwdW50aW5nIG9uIGJvdGggZm9yIG5vdy4gIEFueXdheXMsIHdlZWRpbmcgb3V0CisgICAgIyByZWR1bmRhbmNpZXMgbGlrZSB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSB0aGUgcHJvdmluY2Ugb2YKKyAgICAjIENDb21waWxlciwgc2luY2UgdGhlIGRhdGEgc3RydWN0dXJlcyB1c2VkIGFyZSBpbmhlcml0ZWQgZnJvbSBpdAorICAgICMgYW5kIHRoZXJlZm9yZSBjb21tb24gdG8gYWxsIENDb21waWxlciBjbGFzc2VzLgorCisgICAgcHBfb3B0cyA9IFtdCisgICAgZm9yIG1hY3JvIGluIG1hY3JvczoKKworICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UobWFjcm8sIHR1cGxlKSBhbmQKKyAgICAgICAgICAgICAgICAxIDw9IGxlbiAobWFjcm8pIDw9IDIpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAoImJhZCBtYWNybyBkZWZpbml0aW9uICclcyc6ICIgKworICAgICAgICAgICAgICAgICAgICJlYWNoIGVsZW1lbnQgb2YgJ21hY3JvcycgbGlzdCBtdXN0IGJlIGEgMS0gb3IgMi10dXBsZSIpICUgXAorICAgICAgICAgICAgICAgICAgbWFjcm8KKworICAgICAgICBpZiBsZW4gKG1hY3JvKSA9PSAxOiAgICAgICAgIyB1bmRlZmluZSB0aGlzIG1hY3JvCisgICAgICAgICAgICBwcF9vcHRzLmFwcGVuZCAoIi1VJXMiICUgbWFjcm9bMF0pCisgICAgICAgIGVsaWYgbGVuIChtYWNybykgPT0gMjoKKyAgICAgICAgICAgIGlmIG1hY3JvWzFdIGlzIE5vbmU6ICAgICMgZGVmaW5lIHdpdGggbm8gZXhwbGljaXQgdmFsdWUKKyAgICAgICAgICAgICAgICBwcF9vcHRzLmFwcGVuZCAoIi1EJXMiICUgbWFjcm9bMF0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgWFhYICpkb24ndCogbmVlZCB0byBiZSBjbGV2ZXIgYWJvdXQgcXVvdGluZyB0aGUKKyAgICAgICAgICAgICAgICAjIG1hY3JvIHZhbHVlIGhlcmUsIGJlY2F1c2Ugd2UncmUgZ29pbmcgdG8gYXZvaWQgdGhlCisgICAgICAgICAgICAgICAgIyBzaGVsbCBhdCBhbGwgY29zdHMgd2hlbiB3ZSBzcGF3biB0aGUgY29tbWFuZCEKKyAgICAgICAgICAgICAgICBwcF9vcHRzLmFwcGVuZCAoIi1EJXM9JXMiICUgbWFjcm8pCisKKyAgICBmb3IgZGlyIGluIGluY2x1ZGVfZGlyczoKKyAgICAgICAgcHBfb3B0cy5hcHBlbmQgKCItSSVzIiAlIGRpcikKKworICAgIHJldHVybiBwcF9vcHRzCisKKworZGVmIGdlbl9saWJfb3B0aW9ucyhjb21waWxlciwgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywgbGlicmFyaWVzKToKKyAgICAiIiJHZW5lcmF0ZSBsaW5rZXIgb3B0aW9ucyBmb3Igc2VhcmNoaW5nIGxpYnJhcnkgZGlyZWN0b3JpZXMgYW5kCisgICAgbGlua2luZyB3aXRoIHNwZWNpZmljIGxpYnJhcmllcy4KKworICAgICdsaWJyYXJpZXMnIGFuZCAnbGlicmFyeV9kaXJzJyBhcmUsIHJlc3BlY3RpdmVseSwgbGlzdHMgb2YgbGlicmFyeSBuYW1lcworICAgIChub3QgZmlsZW5hbWVzISkgYW5kIHNlYXJjaCBkaXJlY3Rvcmllcy4gIFJldHVybnMgYSBsaXN0IG9mIGNvbW1hbmQtbGluZQorICAgIG9wdGlvbnMgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHNvbWUgY29tcGlsZXIgKGRlcGVuZGluZyBvbiB0aGUgdHdvIGZvcm1hdAorICAgIHN0cmluZ3MgcGFzc2VkIGluKS4KKyAgICAiIiIKKyAgICBsaWJfb3B0cyA9IFtdCisKKyAgICBmb3IgZGlyIGluIGxpYnJhcnlfZGlyczoKKyAgICAgICAgbGliX29wdHMuYXBwZW5kKGNvbXBpbGVyLmxpYnJhcnlfZGlyX29wdGlvbihkaXIpKQorCisgICAgZm9yIGRpciBpbiBydW50aW1lX2xpYnJhcnlfZGlyczoKKyAgICAgICAgb3B0ID0gY29tcGlsZXIucnVudGltZV9saWJyYXJ5X2Rpcl9vcHRpb24oZGlyKQorICAgICAgICBpZiBpc2luc3RhbmNlKG9wdCwgbGlzdCk6CisgICAgICAgICAgICBsaWJfb3B0cy5leHRlbmQob3B0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGliX29wdHMuYXBwZW5kKG9wdCkKKworICAgICMgWFhYIGl0J3MgaW1wb3J0YW50IHRoYXQgd2UgKm5vdCogcmVtb3ZlIHJlZHVuZGFudCBsaWJyYXJ5IG1lbnRpb25zIQorICAgICMgc29tZXRpbWVzIHlvdSByZWFsbHkgZG8gaGF2ZSB0byBzYXkgIi1sZm9vIC1sYmFyIC1sZm9vIiBpbiBvcmRlciB0bworICAgICMgcmVzb2x2ZSBhbGwgc3ltYm9scy4gIEkganVzdCBob3BlIHdlIG5ldmVyIGhhdmUgdG8gc2F5ICItbGZvbyBvYmoubworICAgICMgLWxiYXIiIHRvIGdldCB0aGluZ3MgdG8gd29yayAtLSB0aGF0J3MgY2VydGFpbmx5IGEgcG9zc2liaWxpdHksIGJ1dCBhCisgICAgIyBwcmV0dHkgbmFzdHkgd2F5IHRvIGFycmFuZ2UgeW91ciBDIGNvZGUuCisKKyAgICBmb3IgbGliIGluIGxpYnJhcmllczoKKyAgICAgICAgbGliX2RpciwgbGliX25hbWUgPSBvcy5wYXRoLnNwbGl0KGxpYikKKyAgICAgICAgaWYgbGliX2RpciAhPSAnJzoKKyAgICAgICAgICAgIGxpYl9maWxlID0gY29tcGlsZXIuZmluZF9saWJyYXJ5X2ZpbGUoW2xpYl9kaXJdLCBsaWJfbmFtZSkKKyAgICAgICAgICAgIGlmIGxpYl9maWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGxpYl9vcHRzLmFwcGVuZChsaWJfZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tcGlsZXIud2Fybigibm8gbGlicmFyeSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZm91bmQgKHNraXBwaW5nKSIgJSBsaWIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaWJfb3B0cy5hcHBlbmQoY29tcGlsZXIubGlicmFyeV9vcHRpb24obGliKSkKKworICAgIHJldHVybiBsaWJfb3B0cwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY2NvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThlYTk2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY2NvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1NjVjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Njb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY21kLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY21kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDU2NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jbWQucHkKQEAgLTAsMCArMSw0NTcgQEAKKyIiImRpc3R1dGlscy5jbWQKKworUHJvdmlkZXMgdGhlIENvbW1hbmQgY2xhc3MsIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgY29tbWFuZCBjbGFzc2VzCitpbiB0aGUgZGlzdHV0aWxzLmNvbW1hbmQgcGFja2FnZS4KKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cywgb3MsIHJlCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgdXRpbCwgZGlyX3V0aWwsIGZpbGVfdXRpbCwgYXJjaGl2ZV91dGlsLCBkZXBfdXRpbAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyBDb21tYW5kOgorICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGRlZmluaW5nIGNvbW1hbmQgY2xhc3NlcywgdGhlICJ3b3JrZXIgYmVlcyIKKyAgICBvZiB0aGUgRGlzdHV0aWxzLiAgQSB1c2VmdWwgYW5hbG9neSBmb3IgY29tbWFuZCBjbGFzc2VzIGlzIHRvIHRoaW5rIG9mCisgICAgdGhlbSBhcyBzdWJyb3V0aW5lcyB3aXRoIGxvY2FsIHZhcmlhYmxlcyBjYWxsZWQgIm9wdGlvbnMiLiAgVGhlIG9wdGlvbnMKKyAgICBhcmUgImRlY2xhcmVkIiBpbiAnaW5pdGlhbGl6ZV9vcHRpb25zKCknIGFuZCAiZGVmaW5lZCIgKGdpdmVuIHRoZWlyCisgICAgZmluYWwgdmFsdWVzLCBha2EgImZpbmFsaXplZCIpIGluICdmaW5hbGl6ZV9vcHRpb25zKCknLCBib3RoIG9mIHdoaWNoCisgICAgbXVzdCBiZSBkZWZpbmVkIGJ5IGV2ZXJ5IGNvbW1hbmQgY2xhc3MuICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiB0aGUKKyAgICB0d28gaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3B0aW9uIHZhbHVlcyBtaWdodCBjb21lIGZyb20gdGhlIG91dHNpZGUKKyAgICB3b3JsZCAoY29tbWFuZCBsaW5lLCBjb25maWcgZmlsZSwgLi4uKSwgYW5kIGFueSBvcHRpb25zIGRlcGVuZGVudCBvbgorICAgIG90aGVyIG9wdGlvbnMgbXVzdCBiZSBjb21wdXRlZCAqYWZ0ZXIqIHRoZXNlIG91dHNpZGUgaW5mbHVlbmNlcyBoYXZlCisgICAgYmVlbiBwcm9jZXNzZWQgLS0gaGVuY2UgJ2ZpbmFsaXplX29wdGlvbnMoKScuICBUaGUgImJvZHkiIG9mIHRoZQorICAgIHN1YnJvdXRpbmUsIHdoZXJlIGl0IGRvZXMgYWxsIGl0cyB3b3JrIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgaXRzCisgICAgb3B0aW9ucywgaXMgdGhlICdydW4oKScgbWV0aG9kLCB3aGljaCBtdXN0IGFsc28gYmUgaW1wbGVtZW50ZWQgYnkgZXZlcnkKKyAgICBjb21tYW5kIGNsYXNzLgorICAgICIiIgorCisgICAgIyAnc3ViX2NvbW1hbmRzJyBmb3JtYWxpemVzIHRoZSBub3Rpb24gb2YgYSAiZmFtaWx5IiBvZiBjb21tYW5kcywKKyAgICAjIGVnLiAiaW5zdGFsbCIgYXMgdGhlIHBhcmVudCB3aXRoIHN1Yi1jb21tYW5kcyAiaW5zdGFsbF9saWIiLAorICAgICMgImluc3RhbGxfaGVhZGVycyIsIGV0Yy4gIFRoZSBwYXJlbnQgb2YgYSBmYW1pbHkgb2YgY29tbWFuZHMKKyAgICAjIGRlZmluZXMgJ3N1Yl9jb21tYW5kcycgYXMgYSBjbGFzcyBhdHRyaWJ1dGU7IGl0J3MgYSBsaXN0IG9mCisgICAgIyAgICAoY29tbWFuZF9uYW1lIDogc3RyaW5nLCBwcmVkaWNhdGUgOiB1bmJvdW5kX21ldGhvZCB8IHN0cmluZyB8IE5vbmUpCisgICAgIyB0dXBsZXMsIHdoZXJlICdwcmVkaWNhdGUnIGlzIGEgbWV0aG9kIG9mIHRoZSBwYXJlbnQgY29tbWFuZCB0aGF0CisgICAgIyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZCBpcyBhcHBsaWNhYmxlIGluIHRoZQorICAgICMgY3VycmVudCBzaXR1YXRpb24uICAoRWcuIHdlICJpbnN0YWxsX2hlYWRlcnMiIGlzIG9ubHkgYXBwbGljYWJsZSBpZgorICAgICMgd2UgaGF2ZSBhbnkgQyBoZWFkZXIgZmlsZXMgdG8gaW5zdGFsbC4pICBJZiAncHJlZGljYXRlJyBpcyBOb25lLAorICAgICMgdGhhdCBjb21tYW5kIGlzIGFsd2F5cyBhcHBsaWNhYmxlLgorICAgICMKKyAgICAjICdzdWJfY29tbWFuZHMnIGlzIHVzdWFsbHkgZGVmaW5lZCBhdCB0aGUgKmVuZCogb2YgYSBjbGFzcywgYmVjYXVzZQorICAgICMgcHJlZGljYXRlcyBjYW4gYmUgdW5ib3VuZCBtZXRob2RzLCBzbyB0aGV5IG11c3QgYWxyZWFkeSBoYXZlIGJlZW4KKyAgICAjIGRlZmluZWQuICBUaGUgY2Fub25pY2FsIGV4YW1wbGUgaXMgdGhlICJpbnN0YWxsIiBjb21tYW5kLgorICAgIHN1Yl9jb21tYW5kcyA9IFtdCisKKworICAgICMgLS0gQ3JlYXRpb24vaW5pdGlhbGl6YXRpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCk6CisgICAgICAgICIiIkNyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBDb21tYW5kIG9iamVjdC4gIE1vc3QgaW1wb3J0YW50bHksCisgICAgICAgIGludm9rZXMgdGhlICdpbml0aWFsaXplX29wdGlvbnMoKScgbWV0aG9kLCB3aGljaCBpcyB0aGUgcmVhbAorICAgICAgICBpbml0aWFsaXplciBhbmQgZGVwZW5kcyBvbiB0aGUgYWN0dWFsIGNvbW1hbmQgYmVpbmcKKyAgICAgICAgaW5zdGFudGlhdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBsYXRlIGltcG9ydCBiZWNhdXNlIG9mIG11dHVhbCBkZXBlbmRlbmNlIGJldHdlZW4gdGhlc2UgY2xhc3NlcworICAgICAgICBmcm9tIGRpc3R1dGlscy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KKworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShkaXN0LCBEaXN0cmlidXRpb24pOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiZGlzdCBtdXN0IGJlIGEgRGlzdHJpYnV0aW9uIGluc3RhbmNlIgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBDb21tYW5kOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiQ29tbWFuZCBpcyBhbiBhYnN0cmFjdCBjbGFzcyIKKworICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbiA9IGRpc3QKKyAgICAgICAgc2VsZi5pbml0aWFsaXplX29wdGlvbnMoKQorCisgICAgICAgICMgUGVyLWNvbW1hbmQgdmVyc2lvbnMgb2YgdGhlIGdsb2JhbCBmbGFncywgc28gdGhhdCB0aGUgdXNlciBjYW4KKyAgICAgICAgIyBjdXN0b21pemUgRGlzdHV0aWxzJyBiZWhhdmlvdXIgY29tbWFuZC1ieS1jb21tYW5kIGFuZCBsZXQgc29tZQorICAgICAgICAjIGNvbW1hbmRzIGZhbGwgYmFjayBvbiB0aGUgRGlzdHJpYnV0aW9uJ3MgYmVoYXZpb3VyLiAgTm9uZSBtZWFucworICAgICAgICAjICJub3QgZGVmaW5lZCwgY2hlY2sgc2VsZi5kaXN0cmlidXRpb24ncyBjb3B5Iiwgd2hpbGUgMCBvciAxIG1lYW4KKyAgICAgICAgIyBmYWxzZSBhbmQgdHJ1ZSAoZHVoKS4gIE5vdGUgdGhhdCB0aGlzIG1lYW5zIGZpZ3VyaW5nIG91dCB0aGUgcmVhbAorICAgICAgICAjIHZhbHVlIG9mIGVhY2ggZmxhZyBpcyBhIHRvdWNoIGNvbXBsaWNhdGVkIC0tIGhlbmNlICJzZWxmLl9kcnlfcnVuIgorICAgICAgICAjIHdpbGwgYmUgaGFuZGxlZCBieSBfX2dldGF0dHJfXywgYmVsb3cuCisgICAgICAgICMgWFhYIFRoaXMgbmVlZHMgdG8gYmUgZml4ZWQuCisgICAgICAgIHNlbGYuX2RyeV9ydW4gPSBOb25lCisKKyAgICAgICAgIyB2ZXJib3NlIGlzIGxhcmdlbHkgaWdub3JlZCwgYnV0IG5lZWRzIHRvIGJlIHNldCBmb3IKKyAgICAgICAgIyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoSSB0aGluayk/CisgICAgICAgIHNlbGYudmVyYm9zZSA9IGRpc3QudmVyYm9zZQorCisgICAgICAgICMgU29tZSBjb21tYW5kcyBkZWZpbmUgYSAnc2VsZi5mb3JjZScgb3B0aW9uIHRvIGlnbm9yZSBmaWxlCisgICAgICAgICMgdGltZXN0YW1wcywgYnV0IG1ldGhvZHMgZGVmaW5lZCAqaGVyZSogYXNzdW1lIHRoYXQKKyAgICAgICAgIyAnc2VsZi5mb3JjZScgZXhpc3RzIGZvciBhbGwgY29tbWFuZHMuICBTbyBkZWZpbmUgaXQgaGVyZQorICAgICAgICAjIGp1c3QgdG8gYmUgc2FmZS4KKyAgICAgICAgc2VsZi5mb3JjZSA9IE5vbmUKKworICAgICAgICAjIFRoZSAnaGVscCcgZmxhZyBpcyBqdXN0IHVzZWQgZm9yIGNvbW1hbmQtbGluZSBwYXJzaW5nLCBzbworICAgICAgICAjIG5vbmUgb2YgdGhhdCBjb21wbGljYXRlZCBidXJlYXVjcmFjeSBpcyBuZWVkZWQuCisgICAgICAgIHNlbGYuaGVscCA9IDAKKworICAgICAgICAjICdmaW5hbGl6ZWQnIHJlY29yZHMgd2hldGhlciBvciBub3QgJ2ZpbmFsaXplX29wdGlvbnMoKScgaGFzIGJlZW4KKyAgICAgICAgIyBjYWxsZWQuICAnZmluYWxpemVfb3B0aW9ucygpJyBpdHNlbGYgc2hvdWxkIG5vdCBwYXkgYXR0ZW50aW9uIHRvCisgICAgICAgICMgdGhpcyBmbGFnOiBpdCBpcyB0aGUgYnVzaW5lc3Mgb2YgJ2Vuc3VyZV9maW5hbGl6ZWQoKScsIHdoaWNoCisgICAgICAgICMgYWx3YXlzIGNhbGxzICdmaW5hbGl6ZV9vcHRpb25zKCknLCB0byByZXNwZWN0L3VwZGF0ZSBpdC4KKyAgICAgICAgc2VsZi5maW5hbGl6ZWQgPSAwCisKKyAgICAjIFhYWCBBIG1vcmUgZXhwbGljaXQgd2F5IHRvIGN1c3RvbWl6ZSBkcnlfcnVuIHdvdWxkIGJlIGJldHRlci4KKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGF0dHIgPT0gJ2RyeV9ydW4nOgorICAgICAgICAgICAgbXl2YWwgPSBnZXRhdHRyKHNlbGYsICJfIiArIGF0dHIpCisgICAgICAgICAgICBpZiBteXZhbCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCBhdHRyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbXl2YWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCisKKyAgICBkZWYgZW5zdXJlX2ZpbmFsaXplZChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZmluYWxpemVkOgorICAgICAgICAgICAgc2VsZi5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5maW5hbGl6ZWQgPSAxCisKKyAgICAjIFN1YmNsYXNzZXMgbXVzdCBkZWZpbmU6CisgICAgIyAgIGluaXRpYWxpemVfb3B0aW9ucygpCisgICAgIyAgICAgcHJvdmlkZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIG9wdGlvbnM7IG1heSBiZSBjdXN0b21pemVkIGJ5CisgICAgIyAgICAgc2V0dXAgc2NyaXB0LCBieSBvcHRpb25zIGZyb20gY29uZmlnIGZpbGUocyksIG9yIGJ5IGNvbW1hbmQtbGluZQorICAgICMgICAgIG9wdGlvbnMKKyAgICAjICAgZmluYWxpemVfb3B0aW9ucygpCisgICAgIyAgICAgZGVjaWRlIG9uIHRoZSBmaW5hbCB2YWx1ZXMgZm9yIGFsbCBvcHRpb25zOyB0aGlzIGlzIGNhbGxlZAorICAgICMgICAgIGFmdGVyIGFsbCBwb3NzaWJsZSBpbnRlcnZlbnRpb24gZnJvbSB0aGUgb3V0c2lkZSB3b3JsZAorICAgICMgICAgIChjb21tYW5kLWxpbmUsIG9wdGlvbiBmaWxlLCBldGMuKSBoYXMgYmVlbiBwcm9jZXNzZWQKKyAgICAjICAgcnVuKCkKKyAgICAjICAgICBydW4gdGhlIGNvbW1hbmQ6IGRvIHdoYXRldmVyIGl0IGlzIHdlJ3JlIGhlcmUgdG8gZG8sCisgICAgIyAgICAgY29udHJvbGxlZCBieSB0aGUgY29tbWFuZCdzIHZhcmlvdXMgb3B0aW9uIHZhbHVlcworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiU2V0IGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdGhlIG9wdGlvbnMgdGhhdCB0aGlzIGNvbW1hbmQKKyAgICAgICAgc3VwcG9ydHMuICBOb3RlIHRoYXQgdGhlc2UgZGVmYXVsdHMgbWF5IGJlIG92ZXJyaWRkZW4gYnkgb3RoZXIKKyAgICAgICAgY29tbWFuZHMsIGJ5IHRoZSBzZXR1cCBzY3JpcHQsIGJ5IGNvbmZpZyBmaWxlcywgb3IgYnkgdGhlCisgICAgICAgIGNvbW1hbmQtbGluZS4gIFRodXMsIHRoaXMgaXMgbm90IHRoZSBwbGFjZSB0byBjb2RlIGRlcGVuZGVuY2llcworICAgICAgICBiZXR3ZWVuIG9wdGlvbnM7IGdlbmVyYWxseSwgJ2luaXRpYWxpemVfb3B0aW9ucygpJyBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgYXJlIGp1c3QgYSBidW5jaCBvZiAic2VsZi5mb28gPSBOb25lIiBhc3NpZ25tZW50cy4KKworICAgICAgICBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGFsbCBjb21tYW5kIGNsYXNzZXMuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgImFic3RyYWN0IG1ldGhvZCAtLSBzdWJjbGFzcyAlcyBtdXN0IG92ZXJyaWRlIiAlIHNlbGYuX19jbGFzc19fCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiU2V0IGZpbmFsIHZhbHVlcyBmb3IgYWxsIHRoZSBvcHRpb25zIHRoYXQgdGhpcyBjb21tYW5kIHN1cHBvcnRzLgorICAgICAgICBUaGlzIGlzIGFsd2F5cyBjYWxsZWQgYXMgbGF0ZSBhcyBwb3NzaWJsZSwgaWUuICBhZnRlciBhbnkgb3B0aW9uCisgICAgICAgIGFzc2lnbm1lbnRzIGZyb20gdGhlIGNvbW1hbmQtbGluZSBvciBmcm9tIG90aGVyIGNvbW1hbmRzIGhhdmUgYmVlbgorICAgICAgICBkb25lLiAgVGh1cywgdGhpcyBpcyB0aGUgcGxhY2UgdG8gY29kZSBvcHRpb24gZGVwZW5kZW5jaWVzOiBpZgorICAgICAgICAnZm9vJyBkZXBlbmRzIG9uICdiYXInLCB0aGVuIGl0IGlzIHNhZmUgdG8gc2V0ICdmb28nIGZyb20gJ2JhcicgYXMKKyAgICAgICAgbG9uZyBhcyAnZm9vJyBzdGlsbCBoYXMgdGhlIHNhbWUgdmFsdWUgaXQgd2FzIGFzc2lnbmVkIGluCisgICAgICAgICdpbml0aWFsaXplX29wdGlvbnMoKScuCisKKyAgICAgICAgVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhbGwgY29tbWFuZCBjbGFzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAgICJhYnN0cmFjdCBtZXRob2QgLS0gc3ViY2xhc3MgJXMgbXVzdCBvdmVycmlkZSIgJSBzZWxmLl9fY2xhc3NfXworCisKKyAgICBkZWYgZHVtcF9vcHRpb25zKHNlbGYsIGhlYWRlcj1Ob25lLCBpbmRlbnQ9IiIpOgorICAgICAgICBmcm9tIGRpc3R1dGlscy5mYW5jeV9nZXRvcHQgaW1wb3J0IGxvbmdvcHRfeGxhdGUKKyAgICAgICAgaWYgaGVhZGVyIGlzIE5vbmU6CisgICAgICAgICAgICBoZWFkZXIgPSAiY29tbWFuZCBvcHRpb25zIGZvciAnJXMnOiIgJSBzZWxmLmdldF9jb21tYW5kX25hbWUoKQorICAgICAgICBzZWxmLmFubm91bmNlKGluZGVudCArIGhlYWRlciwgbGV2ZWw9bG9nLklORk8pCisgICAgICAgIGluZGVudCA9IGluZGVudCArICIgICIKKyAgICAgICAgZm9yIChvcHRpb24sIF8sIF8pIGluIHNlbGYudXNlcl9vcHRpb25zOgorICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uLnRyYW5zbGF0ZShsb25nb3B0X3hsYXRlKQorICAgICAgICAgICAgaWYgb3B0aW9uWy0xXSA9PSAiPSI6CisgICAgICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uWzotMV0KKyAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLCBvcHRpb24pCisgICAgICAgICAgICBzZWxmLmFubm91bmNlKGluZGVudCArICIlcyA9ICVzIiAlIChvcHRpb24sIHZhbHVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9bG9nLklORk8pCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiJBIGNvbW1hbmQncyByYWlzb24gZCdldHJlOiBjYXJyeSBvdXQgdGhlIGFjdGlvbiBpdCBleGlzdHMgdG8KKyAgICAgICAgcGVyZm9ybSwgY29udHJvbGxlZCBieSB0aGUgb3B0aW9ucyBpbml0aWFsaXplZCBpbgorICAgICAgICAnaW5pdGlhbGl6ZV9vcHRpb25zKCknLCBjdXN0b21pemVkIGJ5IG90aGVyIGNvbW1hbmRzLCB0aGUgc2V0dXAKKyAgICAgICAgc2NyaXB0LCB0aGUgY29tbWFuZC1saW5lLCBhbmQgY29uZmlnIGZpbGVzLCBhbmQgZmluYWxpemVkIGluCisgICAgICAgICdmaW5hbGl6ZV9vcHRpb25zKCknLiAgQWxsIHRlcm1pbmFsIG91dHB1dCBhbmQgZmlsZXN5c3RlbQorICAgICAgICBpbnRlcmFjdGlvbiBzaG91bGQgYmUgZG9uZSBieSAncnVuKCknLgorCisgICAgICAgIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYWxsIGNvbW1hbmQgY2xhc3Nlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAiYWJzdHJhY3QgbWV0aG9kIC0tIHN1YmNsYXNzICVzIG11c3Qgb3ZlcnJpZGUiICUgc2VsZi5fX2NsYXNzX18KKworICAgIGRlZiBhbm5vdW5jZShzZWxmLCBtc2csIGxldmVsPTEpOgorICAgICAgICAiIiJJZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgbGV2ZWwgaXMgb2YgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICAgICdsZXZlbCcgcHJpbnQgJ21zZycgdG8gc3Rkb3V0LgorICAgICAgICAiIiIKKyAgICAgICAgbG9nLmxvZyhsZXZlbCwgbXNnKQorCisgICAgZGVmIGRlYnVnX3ByaW50KHNlbGYsIG1zZyk6CisgICAgICAgICIiIlByaW50ICdtc2cnIHRvIHN0ZG91dCBpZiB0aGUgZ2xvYmFsIERFQlVHICh0YWtlbiBmcm9tIHRoZQorICAgICAgICBESVNUVVRJTFNfREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUpIGZsYWcgaXMgdHJ1ZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRworICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIHByaW50IG1zZworICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisKKworICAgICMgLS0gT3B0aW9uIHZhbGlkYXRpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAodGhlc2UgYXJlIHZlcnkgaGFuZHkgaW4gd3JpdGluZyB0aGUgJ2ZpbmFsaXplX29wdGlvbnMoKScgbWV0aG9kKQorICAgICMKKyAgICAjIE5CLiB0aGUgZ2VuZXJhbCBwaGlsb3NvcGh5IGhlcmUgaXMgdG8gZW5zdXJlIHRoYXQgYSBwYXJ0aWN1bGFyIG9wdGlvbgorICAgICMgdmFsdWUgbWVldHMgY2VydGFpbiB0eXBlIGFuZCB2YWx1ZSBjb25zdHJhaW50cy4gIElmIG5vdCwgd2UgdHJ5IHRvCisgICAgIyBmb3JjZSBpdCBpbnRvIGNvbmZvcm1hbmNlIChlZy4gaWYgd2UgZXhwZWN0IGEgbGlzdCBidXQgaGF2ZSBhIHN0cmluZywKKyAgICAjIHNwbGl0IHRoZSBzdHJpbmcgb24gY29tbWEgYW5kL29yIHdoaXRlc3BhY2UpLiAgSWYgd2UgY2FuJ3QgZm9yY2UgdGhlCisgICAgIyBvcHRpb24gaW50byBjb25mb3JtYW5jZSwgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IuICBUaHVzLCBjb21tYW5kCisgICAgIyBjbGFzc2VzIG5lZWQgZG8gbm90aGluZyBtb3JlIHRoYW4gKGVnLikKKyAgICAjICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ2ZvbycpCisgICAgIyBhbmQgdGhleSBjYW4gYmUgZ3VhcmFudGVlZCB0aGF0IHRoZXJlYWZ0ZXIsIHNlbGYuZm9vIHdpbGwgYmUKKyAgICAjIGEgbGlzdCBvZiBzdHJpbmdzLgorCisgICAgZGVmIF9lbnN1cmVfc3RyaW5nbGlrZShzZWxmLCBvcHRpb24sIHdoYXQsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgb3B0aW9uKQorICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0aW9uLCBkZWZhdWx0KQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZSh2YWwsIHN0cik6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgIiclcycgbXVzdCBiZSBhICVzIChnb3QgYCVzYCkiICUgKG9wdGlvbiwgd2hhdCwgdmFsKQorICAgICAgICByZXR1cm4gdmFsCisKKyAgICBkZWYgZW5zdXJlX3N0cmluZyhzZWxmLCBvcHRpb24sIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIkVuc3VyZSB0aGF0ICdvcHRpb24nIGlzIGEgc3RyaW5nOyBpZiBub3QgZGVmaW5lZCwgc2V0IGl0IHRvCisgICAgICAgICdkZWZhdWx0Jy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Vuc3VyZV9zdHJpbmdsaWtlKG9wdGlvbiwgInN0cmluZyIsIGRlZmF1bHQpCisKKyAgICBkZWYgZW5zdXJlX3N0cmluZ19saXN0KHNlbGYsIG9wdGlvbik6CisgICAgICAgICIiIkVuc3VyZSB0aGF0ICdvcHRpb24nIGlzIGEgbGlzdCBvZiBzdHJpbmdzLiAgSWYgJ29wdGlvbicgaXMKKyAgICAgICAgY3VycmVudGx5IGEgc3RyaW5nLCB3ZSBzcGxpdCBpdCBlaXRoZXIgb24gLyxccyovIG9yIC9ccysvLCBzbworICAgICAgICAiZm9vIGJhciBiYXoiLCAiZm9vLGJhcixiYXoiLCBhbmQgImZvbywgICBiYXIgYmF6IiBhbGwgYmVjb21lCisgICAgICAgIFsiZm9vIiwgImJhciIsICJiYXoiXS4KKyAgICAgICAgIiIiCisgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgb3B0aW9uKQorICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsLCBzdHIpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBvcHRpb24sIHJlLnNwbGl0KHInLFxzKnxccysnLCB2YWwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGxpc3QpOgorICAgICAgICAgICAgICAgICMgY2hlY2tzIGlmIGFsbCBlbGVtZW50cyBhcmUgc3RyCisgICAgICAgICAgICAgICAgb2sgPSAxCisgICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlbGVtZW50LCBzdHIpOgorICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvayA9IDAKKworICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICInJXMnIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MgKGdvdCAlcikiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgKG9wdGlvbiwgdmFsKQorCisKKyAgICBkZWYgX2Vuc3VyZV90ZXN0ZWRfc3RyaW5nKHNlbGYsIG9wdGlvbiwgdGVzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hhdCwgZXJyb3JfZm10LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICB2YWwgPSBzZWxmLl9lbnN1cmVfc3RyaW5nbGlrZShvcHRpb24sIHdoYXQsIGRlZmF1bHQpCisgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZSBhbmQgbm90IHRlc3Rlcih2YWwpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICgiZXJyb3IgaW4gJyVzJyBvcHRpb246ICIgKyBlcnJvcl9mbXQpICUgKG9wdGlvbiwgdmFsKQorCisgICAgZGVmIGVuc3VyZV9maWxlbmFtZShzZWxmLCBvcHRpb24pOgorICAgICAgICAiIiJFbnN1cmUgdGhhdCAnb3B0aW9uJyBpcyB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBmaWxlLiIiIgorICAgICAgICBzZWxmLl9lbnN1cmVfdGVzdGVkX3N0cmluZyhvcHRpb24sIG9zLnBhdGguaXNmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBmaWxlIikKKworICAgIGRlZiBlbnN1cmVfZGlybmFtZShzZWxmLCBvcHRpb24pOgorICAgICAgICBzZWxmLl9lbnN1cmVfdGVzdGVkX3N0cmluZyhvcHRpb24sIG9zLnBhdGguaXNkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGRvZXMgbm90IGV4aXN0IG9yIGlzIG5vdCBhIGRpcmVjdG9yeSIpCisKKworICAgICMgLS0gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29tbWFuZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZ2V0X2NvbW1hbmRfbmFtZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnY29tbWFuZF9uYW1lJyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21tYW5kX25hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgZGVmIHNldF91bmRlZmluZWRfb3B0aW9ucyhzZWxmLCBzcmNfY21kLCAqb3B0aW9uX3BhaXJzKToKKyAgICAgICAgIiIiU2V0IHRoZSB2YWx1ZXMgb2YgYW55ICJ1bmRlZmluZWQiIG9wdGlvbnMgZnJvbSBjb3JyZXNwb25kaW5nCisgICAgICAgIG9wdGlvbiB2YWx1ZXMgaW4gc29tZSBvdGhlciBjb21tYW5kIG9iamVjdC4gICJVbmRlZmluZWQiIGhlcmUgbWVhbnMKKyAgICAgICAgImlzIE5vbmUiLCB3aGljaCBpcyB0aGUgY29udmVudGlvbiB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4gb3B0aW9uCisgICAgICAgIGhhcyBub3QgYmVlbiBjaGFuZ2VkIGJldHdlZW4gJ2luaXRpYWxpemVfb3B0aW9ucygpJyBhbmQKKyAgICAgICAgJ2ZpbmFsaXplX29wdGlvbnMoKScuICBVc3VhbGx5IGNhbGxlZCBmcm9tICdmaW5hbGl6ZV9vcHRpb25zKCknIGZvcgorICAgICAgICBvcHRpb25zIHRoYXQgZGVwZW5kIG9uIHNvbWUgb3RoZXIgY29tbWFuZCByYXRoZXIgdGhhbiBhbm90aGVyCisgICAgICAgIG9wdGlvbiBvZiB0aGUgc2FtZSBjb21tYW5kLiAgJ3NyY19jbWQnIGlzIHRoZSBvdGhlciBjb21tYW5kIGZyb20KKyAgICAgICAgd2hpY2ggb3B0aW9uIHZhbHVlcyB3aWxsIGJlIHRha2VuIChhIGNvbW1hbmQgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZAorICAgICAgICBmb3IgaXQgaWYgbmVjZXNzYXJ5KTsgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlCisgICAgICAgICcoc3JjX29wdGlvbixkc3Rfb3B0aW9uKScgdHVwbGVzIHdoaWNoIG1lYW4gInRha2UgdGhlIHZhbHVlIG9mCisgICAgICAgICdzcmNfb3B0aW9uJyBpbiB0aGUgJ3NyY19jbWQnIGNvbW1hbmQgb2JqZWN0LCBhbmQgY29weSBpdCB0bworICAgICAgICAnZHN0X29wdGlvbicgaW4gdGhlIGN1cnJlbnQgY29tbWFuZCBvYmplY3QiLgorICAgICAgICAiIiIKKworICAgICAgICAjIE9wdGlvbl9wYWlyczogbGlzdCBvZiAoc3JjX29wdGlvbiwgZHN0X29wdGlvbikgdHVwbGVzCisKKyAgICAgICAgc3JjX2NtZF9vYmogPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooc3JjX2NtZCkKKyAgICAgICAgc3JjX2NtZF9vYmouZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGZvciAoc3JjX29wdGlvbiwgZHN0X29wdGlvbikgaW4gb3B0aW9uX3BhaXJzOgorICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCBkc3Rfb3B0aW9uKSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgZHN0X29wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoc3JjX2NtZF9vYmosIHNyY19vcHRpb24pKQorCisKKyAgICBkZWYgZ2V0X2ZpbmFsaXplZF9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIGNyZWF0ZT0xKToKKyAgICAgICAgIiIiV3JhcHBlciBhcm91bmQgRGlzdHJpYnV0aW9uJ3MgJ2dldF9jb21tYW5kX29iaigpJyBtZXRob2Q6IGZpbmQKKyAgICAgICAgKGNyZWF0ZSBpZiBuZWNlc3NhcnkgYW5kICdjcmVhdGUnIGlzIHRydWUpIHRoZSBjb21tYW5kIG9iamVjdCBmb3IKKyAgICAgICAgJ2NvbW1hbmQnLCBjYWxsIGl0cyAnZW5zdXJlX2ZpbmFsaXplZCgpJyBtZXRob2QsIGFuZCByZXR1cm4gdGhlCisgICAgICAgIGZpbmFsaXplZCBjb21tYW5kIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIGNtZF9vYmogPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooY29tbWFuZCwgY3JlYXRlKQorICAgICAgICBjbWRfb2JqLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICByZXR1cm4gY21kX29iagorCisgICAgIyBYWFggcmVuYW1lIHRvICdnZXRfcmVpbml0aWFsaXplZF9jb21tYW5kKCknPyAoc2hvdWxkIGRvIHRoZQorICAgICMgc2FtZSBpbiBkaXN0LnB5LCBpZiBzbykKKyAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTApOgorICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24ucmVpbml0aWFsaXplX2NvbW1hbmQoCisgICAgICAgICAgICBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHMpCisKKyAgICBkZWYgcnVuX2NvbW1hbmQoc2VsZiwgY29tbWFuZCk6CisgICAgICAgICIiIlJ1biBzb21lIG90aGVyIGNvbW1hbmQ6IHVzZXMgdGhlICdydW5fY29tbWFuZCgpJyBtZXRob2Qgb2YKKyAgICAgICAgRGlzdHJpYnV0aW9uLCB3aGljaCBjcmVhdGVzIGFuZCBmaW5hbGl6ZXMgdGhlIGNvbW1hbmQgb2JqZWN0IGlmCisgICAgICAgIG5lY2Vzc2FyeSBhbmQgdGhlbiBpbnZva2VzIGl0cyAncnVuKCknIG1ldGhvZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLnJ1bl9jb21tYW5kKGNvbW1hbmQpCisKKyAgICBkZWYgZ2V0X3N1Yl9jb21tYW5kcyhzZWxmKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIHRoZSBzdWItY29tbWFuZHMgdGhhdCBhcmUgcmVsZXZhbnQgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgZGlzdHJpYnV0aW9uIChpZS4sIHRoYXQgbmVlZCB0byBiZSBydW4pLiAgVGhpcyBpcyBiYXNlZCBvbiB0aGUKKyAgICAgICAgJ3N1Yl9jb21tYW5kcycgY2xhc3MgYXR0cmlidXRlOiBlYWNoIHR1cGxlIGluIHRoYXQgbGlzdCBtYXkgaW5jbHVkZQorICAgICAgICBhIG1ldGhvZCB0aGF0IHdlIGNhbGwgdG8gZGV0ZXJtaW5lIGlmIHRoZSBzdWJjb21tYW5kIG5lZWRzIHRvIGJlCisgICAgICAgIHJ1biBmb3IgdGhlIGN1cnJlbnQgZGlzdHJpYnV0aW9uLiAgUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kIG5hbWVzLgorICAgICAgICAiIiIKKyAgICAgICAgY29tbWFuZHMgPSBbXQorICAgICAgICBmb3IgKGNtZF9uYW1lLCBtZXRob2QpIGluIHNlbGYuc3ViX2NvbW1hbmRzOgorICAgICAgICAgICAgaWYgbWV0aG9kIGlzIE5vbmUgb3IgbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIGNvbW1hbmRzLmFwcGVuZChjbWRfbmFtZSkKKyAgICAgICAgcmV0dXJuIGNvbW1hbmRzCisKKworICAgICMgLS0gRXh0ZXJuYWwgd29ybGQgbWFuaXB1bGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgd2FybihzZWxmLCBtc2cpOgorICAgICAgICBsb2cud2Fybigid2FybmluZzogJXM6ICVzXG4iICUKKyAgICAgICAgICAgICAgICAoc2VsZi5nZXRfY29tbWFuZF9uYW1lKCksIG1zZykpCisKKyAgICBkZWYgZXhlY3V0ZShzZWxmLCBmdW5jLCBhcmdzLCBtc2c9Tm9uZSwgbGV2ZWw9MSk6CisgICAgICAgIHV0aWwuZXhlY3V0ZShmdW5jLCBhcmdzLCBtc2csIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIG1rcGF0aChzZWxmLCBuYW1lLCBtb2RlPTA3NzcpOgorICAgICAgICBkaXJfdXRpbC5ta3BhdGgobmFtZSwgbW9kZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgY29weV9maWxlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV9tb2RlPTEsIHByZXNlcnZlX3RpbWVzPTEsIGxpbms9Tm9uZSwgbGV2ZWw9MSk6CisgICAgICAgICIiIkNvcHkgYSBmaWxlIHJlc3BlY3RpbmcgdmVyYm9zZSwgZHJ5LXJ1biBhbmQgZm9yY2UgZmxhZ3MuICAoVGhlCisgICAgICAgIGZvcm1lciB0d28gZGVmYXVsdCB0byB3aGF0ZXZlciBpcyBpbiB0aGUgRGlzdHJpYnV0aW9uIG9iamVjdCwgYW5kCisgICAgICAgIHRoZSBsYXR0ZXIgZGVmYXVsdHMgdG8gZmFsc2UgZm9yIGNvbW1hbmRzIHRoYXQgZG9uJ3QgZGVmaW5lIGl0LikiIiIKKworICAgICAgICByZXR1cm4gZmlsZV91dGlsLmNvcHlfZmlsZSgKKyAgICAgICAgICAgIGluZmlsZSwgb3V0ZmlsZSwKKyAgICAgICAgICAgIHByZXNlcnZlX21vZGUsIHByZXNlcnZlX3RpbWVzLAorICAgICAgICAgICAgbm90IHNlbGYuZm9yY2UsCisgICAgICAgICAgICBsaW5rLAorICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgY29weV90cmVlKHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV9tb2RlPTEsIHByZXNlcnZlX3RpbWVzPTEsIHByZXNlcnZlX3N5bWxpbmtzPTAsCisgICAgICAgICAgICAgICAgICAgbGV2ZWw9MSk6CisgICAgICAgICIiIkNvcHkgYW4gZW50aXJlIGRpcmVjdG9yeSB0cmVlIHJlc3BlY3RpbmcgdmVyYm9zZSwgZHJ5LXJ1biwKKyAgICAgICAgYW5kIGZvcmNlIGZsYWdzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGRpcl91dGlsLmNvcHlfdHJlZSgKKyAgICAgICAgICAgIGluZmlsZSwgb3V0ZmlsZSwKKyAgICAgICAgICAgIHByZXNlcnZlX21vZGUscHJlc2VydmVfdGltZXMscHJlc2VydmVfc3ltbGlua3MsCisgICAgICAgICAgICBub3Qgc2VsZi5mb3JjZSwKKyAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIG1vdmVfZmlsZSAoc2VsZiwgc3JjLCBkc3QsIGxldmVsPTEpOgorICAgICAgICAiIiJNb3ZlIGEgZmlsZSByZXNwZWN0aW5nIGRyeS1ydW4gZmxhZy4iIiIKKyAgICAgICAgcmV0dXJuIGZpbGVfdXRpbC5tb3ZlX2ZpbGUoc3JjLCBkc3QsIGRyeV9ydW4gPSBzZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgc3Bhd24gKHNlbGYsIGNtZCwgc2VhcmNoX3BhdGg9MSwgbGV2ZWw9MSk6CisgICAgICAgICIiIlNwYXduIGFuIGV4dGVybmFsIGNvbW1hbmQgcmVzcGVjdGluZyBkcnktcnVuIGZsYWcuIiIiCisgICAgICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorICAgICAgICBzcGF3bihjbWQsIHNlYXJjaF9wYXRoLCBkcnlfcnVuPSBzZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgbWFrZV9hcmNoaXZlKHNlbGYsIGJhc2VfbmFtZSwgZm9ybWF0LCByb290X2Rpcj1Ob25lLCBiYXNlX2Rpcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSk6CisgICAgICAgIHJldHVybiBhcmNoaXZlX3V0aWwubWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgZm9ybWF0LCByb290X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZV9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcj1vd25lciwgZ3JvdXA9Z3JvdXApCisKKyAgICBkZWYgbWFrZV9maWxlKHNlbGYsIGluZmlsZXMsIG91dGZpbGUsIGZ1bmMsIGFyZ3MsCisgICAgICAgICAgICAgICAgICBleGVjX21zZz1Ob25lLCBza2lwX21zZz1Ob25lLCBsZXZlbD0xKToKKyAgICAgICAgIiIiU3BlY2lhbCBjYXNlIG9mICdleGVjdXRlKCknIGZvciBvcGVyYXRpb25zIHRoYXQgcHJvY2VzcyBvbmUgb3IKKyAgICAgICAgbW9yZSBpbnB1dCBmaWxlcyBhbmQgZ2VuZXJhdGUgb25lIG91dHB1dCBmaWxlLiAgV29ya3MganVzdCBsaWtlCisgICAgICAgICdleGVjdXRlKCknLCBleGNlcHQgdGhlIG9wZXJhdGlvbiBpcyBza2lwcGVkIGFuZCBhIGRpZmZlcmVudAorICAgICAgICBtZXNzYWdlIHByaW50ZWQgaWYgJ291dGZpbGUnIGFscmVhZHkgZXhpc3RzIGFuZCBpcyBuZXdlciB0aGFuIGFsbAorICAgICAgICBmaWxlcyBsaXN0ZWQgaW4gJ2luZmlsZXMnLiAgSWYgdGhlIGNvbW1hbmQgZGVmaW5lZCAnc2VsZi5mb3JjZScsCisgICAgICAgIGFuZCBpdCBpcyB0cnVlLCB0aGVuIHRoZSBjb21tYW5kIGlzIHVuY29uZGl0aW9uYWxseSBydW4gLS0gZG9lcyBubworICAgICAgICB0aW1lc3RhbXAgY2hlY2tzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2tpcF9tc2cgaXMgTm9uZToKKyAgICAgICAgICAgIHNraXBfbXNnID0gInNraXBwaW5nICVzIChpbnB1dHMgdW5jaGFuZ2VkKSIgJSBvdXRmaWxlCisKKyAgICAgICAgIyBBbGxvdyAnaW5maWxlcycgdG8gYmUgYSBzaW5nbGUgc3RyaW5nCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5maWxlcywgc3RyKToKKyAgICAgICAgICAgIGluZmlsZXMgPSAoaW5maWxlcywpCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoaW5maWxlcywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICInaW5maWxlcycgbXVzdCBiZSBhIHN0cmluZywgb3IgYSBsaXN0IG9yIHR1cGxlIG9mIHN0cmluZ3MiCisKKyAgICAgICAgaWYgZXhlY19tc2cgaXMgTm9uZToKKyAgICAgICAgICAgIGV4ZWNfbXNnID0gImdlbmVyYXRpbmcgJXMgZnJvbSAlcyIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgIChvdXRmaWxlLCAnLCAnLmpvaW4oaW5maWxlcykpCisKKyAgICAgICAgIyBJZiAnb3V0ZmlsZScgbXVzdCBiZSByZWdlbmVyYXRlZCAoZWl0aGVyIGJlY2F1c2UgaXQgZG9lc24ndAorICAgICAgICAjIGV4aXN0LCBpcyBvdXQtb2YtZGF0ZSwgb3IgdGhlICdmb3JjZScgZmxhZyBpcyB0cnVlKSB0aGVuCisgICAgICAgICMgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgcHJlc3VtYWJseSByZWdlbmVyYXRlcyBpdAorICAgICAgICBpZiBzZWxmLmZvcmNlIG9yIGRlcF91dGlsLm5ld2VyX2dyb3VwKGluZmlsZXMsIG91dGZpbGUpOgorICAgICAgICAgICAgc2VsZi5leGVjdXRlKGZ1bmMsIGFyZ3MsIGV4ZWNfbXNnLCBsZXZlbCkKKworICAgICAgICAjIE90aGVyd2lzZSwgcHJpbnQgdGhlICJza2lwIiBtZXNzYWdlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2cuZGVidWcoc2tpcF9tc2cpCisKKyMgWFhYICdpbnN0YWxsX21pc2MnIGNsYXNzIG5vdCBjdXJyZW50bHkgdXNlZCAtLSBpdCB3YXMgdGhlIGJhc2UgY2xhc3MgZm9yCisjIGJvdGggJ2luc3RhbGxfc2NyaXB0cycgYW5kICdpbnN0YWxsX2RhdGEnLCBidXQgdGhleSBvdXRncmV3IGl0LiAgSXQgbWlnaHQKKyMgc3RpbGwgYmUgdXNlZnVsIGZvciAnaW5zdGFsbF9oZWFkZXJzJywgdGhvdWdoLCBzbyBJJ20ga2VlcGluZyBpdCBhcm91bmQKKyMgZm9yIHRoZSB0aW1lIGJlaW5nLgorCitjbGFzcyBpbnN0YWxsX21pc2MoQ29tbWFuZCk6CisgICAgIiIiQ29tbW9uIGJhc2UgY2xhc3MgZm9yIGluc3RhbGxpbmcgc29tZSBmaWxlcyBpbiBhIHN1YmRpcmVjdG9yeS4KKyAgICBDdXJyZW50bHkgdXNlZCBieSBpbnN0YWxsX2RhdGEgYW5kIGluc3RhbGxfc2NyaXB0cy4KKyAgICAiIiIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2luc3RhbGwtZGlyPScsICdkJywgImRpcmVjdG9yeSB0byBpbnN0YWxsIHRoZSBmaWxlcyB0byIpXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBbXQorCisgICAgZGVmIF9pbnN0YWxsX2Rpcl9mcm9tKHNlbGYsIGRpcm5hbWUpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsIChkaXJuYW1lLCAnaW5zdGFsbF9kaXInKSkKKworICAgIGRlZiBfY29weV9maWxlcyhzZWxmLCBmaWxlbGlzdCk6CisgICAgICAgIHNlbGYub3V0ZmlsZXMgPSBbXQorICAgICAgICBpZiBub3QgZmlsZWxpc3Q6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgZm9yIGYgaW4gZmlsZWxpc3Q6CisgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShmLCBzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICAgICAgc2VsZi5vdXRmaWxlcy5hcHBlbmQob3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGYpKQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vdXRmaWxlcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY21kLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2Nzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY21kLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2Nzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NtZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBiMTU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMyBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQKKworUGFja2FnZSBjb250YWluaW5nIGltcGxlbWVudGF0aW9uIG9mIGFsbCB0aGUgc3RhbmRhcmQgRGlzdHV0aWxzCitjb21tYW5kcy4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK19fYWxsX18gPSBbJ2J1aWxkJywKKyAgICAgICAgICAgJ2J1aWxkX3B5JywKKyAgICAgICAgICAgJ2J1aWxkX2V4dCcsCisgICAgICAgICAgICdidWlsZF9jbGliJywKKyAgICAgICAgICAgJ2J1aWxkX3NjcmlwdHMnLAorICAgICAgICAgICAnY2xlYW4nLAorICAgICAgICAgICAnaW5zdGFsbCcsCisgICAgICAgICAgICdpbnN0YWxsX2xpYicsCisgICAgICAgICAgICdpbnN0YWxsX2hlYWRlcnMnLAorICAgICAgICAgICAnaW5zdGFsbF9zY3JpcHRzJywKKyAgICAgICAgICAgJ2luc3RhbGxfZGF0YScsCisgICAgICAgICAgICdzZGlzdCcsCisgICAgICAgICAgICdyZWdpc3RlcicsCisgICAgICAgICAgICdiZGlzdCcsCisgICAgICAgICAgICdiZGlzdF9kdW1iJywKKyAgICAgICAgICAgJ2JkaXN0X3JwbScsCisgICAgICAgICAgICdiZGlzdF93aW5pbnN0JywKKyAgICAgICAgICAgJ3VwbG9hZCcsCisgICAgICAgICAgICdjaGVjaycsCisgICAgICAgICAgICMgVGhlc2UgdHdvIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZToKKyAgICAgICAgICAgIydiZGlzdF9zZHV4JywKKyAgICAgICAgICAgIydiZGlzdF9wa2d0b29sJywKKyAgICAgICAgICAgIyBOb3RlOgorICAgICAgICAgICAjIGJkaXN0X3BhY2thZ2VyIGlzIG5vdCBpbmNsdWRlZCBiZWNhdXNlIGl0IG9ubHkgcHJvdmlkZXMKKyAgICAgICAgICAgIyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzCisgICAgICAgICAgXQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJlMDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWJlMDZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5MTBiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHkKQEAgLTAsMCArMSwxNDYgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmJkaXN0CisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYmRpc3QnIGNvbW1hbmQgKGNyZWF0ZSBhIGJ1aWx0IFtiaW5hcnldCitkaXN0cmlidXRpb24pLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCisKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvcgorCisKK2RlZiBzaG93X2Zvcm1hdHMoKToKKyAgICAiIiJQcmludCBsaXN0IG9mIGF2YWlsYWJsZSBmb3JtYXRzIChhcmd1bWVudHMgdG8gIi0tZm9ybWF0IiBvcHRpb24pLgorICAgICIiIgorICAgIGZyb20gZGlzdHV0aWxzLmZhbmN5X2dldG9wdCBpbXBvcnQgRmFuY3lHZXRvcHQKKyAgICBmb3JtYXRzID0gW10KKyAgICBmb3IgZm9ybWF0IGluIGJkaXN0LmZvcm1hdF9jb21tYW5kczoKKyAgICAgICAgZm9ybWF0cy5hcHBlbmQoKCJmb3JtYXRzPSIgKyBmb3JtYXQsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBiZGlzdC5mb3JtYXRfY29tbWFuZFtmb3JtYXRdWzFdKSkKKyAgICBwcmV0dHlfcHJpbnRlciA9IEZhbmN5R2V0b3B0KGZvcm1hdHMpCisgICAgcHJldHR5X3ByaW50ZXIucHJpbnRfaGVscCgiTGlzdCBvZiBhdmFpbGFibGUgZGlzdHJpYnV0aW9uIGZvcm1hdHM6IikKKworCitjbGFzcyBiZGlzdChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhIGJ1aWx0IChiaW5hcnkpIGRpc3RyaWJ1dGlvbiIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2JkaXN0LWJhc2U9JywgJ2InLAorICAgICAgICAgICAgICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIGJ1aWx0IGRpc3RyaWJ1dGlvbnMiKSwKKyAgICAgICAgICAgICAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAorICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCisgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfcGxhdGZvcm0oKSksCisgICAgICAgICAgICAgICAgICAgICgnZm9ybWF0cz0nLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgImZvcm1hdHMgZm9yIGRpc3RyaWJ1dGlvbiAoY29tbWEtc2VwYXJhdGVkIGxpc3QpIiksCisgICAgICAgICAgICAgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAorICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiAiCisgICAgICAgICAgICAgICAgICAgICAiW2RlZmF1bHQ6IGRpc3RdIiksCisgICAgICAgICAgICAgICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKKyAgICAgICAgICAgICAgICAgICAgKCdvd25lcj0nLCAndScsCisgICAgICAgICAgICAgICAgICAgICAiT3duZXIgbmFtZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgdXNlcl0iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdncm91cD0nLCAnZycsCisgICAgICAgICAgICAgICAgICAgICAiR3JvdXAgbmFtZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgZ3JvdXBdIiksCisgICAgICAgICAgICAgICAgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydza2lwLWJ1aWxkJ10KKworICAgIGhlbHBfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdoZWxwLWZvcm1hdHMnLCBOb25lLAorICAgICAgICAgImxpc3RzIGF2YWlsYWJsZSBkaXN0cmlidXRpb24gZm9ybWF0cyIsIHNob3dfZm9ybWF0cyksCisgICAgICAgIF0KKworICAgICMgVGhlIGZvbGxvd2luZyBjb21tYW5kcyBkbyBub3QgdGFrZSBhIGZvcm1hdCBvcHRpb24gZnJvbSBiZGlzdAorICAgIG5vX2Zvcm1hdF9vcHRpb24gPSAoJ2JkaXN0X3JwbScsKQorCisgICAgIyBUaGlzIHdvbid0IGRvIGluIHJlYWxpdHk6IHdpbGwgbmVlZCB0byBkaXN0aW5ndWlzaCBSUE0taXNoIExpbnV4LAorICAgICMgRGViaWFuLWlzaCBMaW51eCwgU29sYXJpcywgRnJlZUJTRCwgLi4uLCBXaW5kb3dzLCBNYWMgT1MuCisgICAgZGVmYXVsdF9mb3JtYXQgPSB7J3Bvc2l4JzogJ2d6dGFyJywKKyAgICAgICAgICAgICAgICAgICAgICAnbnQnOiAnemlwJywKKyAgICAgICAgICAgICAgICAgICAgICAnb3MyJzogJ3ppcCd9CisKKyAgICAjIEVzdGFibGlzaCB0aGUgcHJlZmVycmVkIG9yZGVyIChmb3IgdGhlIC0taGVscC1mb3JtYXRzIG9wdGlvbikuCisgICAgZm9ybWF0X2NvbW1hbmRzID0gWydycG0nLCAnZ3p0YXInLCAnYnp0YXInLCAnenRhcicsICd0YXInLAorICAgICAgICAgICAgICAgICAgICAgICAnd2luaW5zdCcsICd6aXAnLCAnbXNpJ10KKworICAgICMgQW5kIHRoZSByZWFsIGluZm9ybWF0aW9uLgorICAgIGZvcm1hdF9jb21tYW5kID0geydycG0nOiAgICgnYmRpc3RfcnBtJywgICJSUE0gZGlzdHJpYnV0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgJ2d6dGFyJzogKCdiZGlzdF9kdW1iJywgImd6aXAnZWQgdGFyIGZpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAnYnp0YXInOiAoJ2JkaXN0X2R1bWInLCAiYnppcDInZWQgdGFyIGZpbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAnenRhcic6ICAoJ2JkaXN0X2R1bWInLCAiY29tcHJlc3NlZCB0YXIgZmlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICd0YXInOiAgICgnYmRpc3RfZHVtYicsICJ0YXIgZmlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICd3aW5pbnN0JzogKCdiZGlzdF93aW5pbnN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2luZG93cyBleGVjdXRhYmxlIGluc3RhbGxlciIpLAorICAgICAgICAgICAgICAgICAgICAgICd6aXAnOiAgICgnYmRpc3RfZHVtYicsICJaSVAgZmlsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICdtc2knOiAgICgnYmRpc3RfbXNpJywgICJNaWNyb3NvZnQgSW5zdGFsbGVyIikKKyAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYmRpc3RfYmFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCisgICAgICAgIHNlbGYuZm9ybWF0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gMAorICAgICAgICBzZWxmLmdyb3VwID0gTm9uZQorICAgICAgICBzZWxmLm93bmVyID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICMgaGF2ZSB0byBmaW5hbGl6ZSAncGxhdF9uYW1lJyBiZWZvcmUgJ2JkaXN0X2Jhc2UnCisgICAgICAgIGlmIHNlbGYucGxhdF9uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnNraXBfYnVpbGQ6CisgICAgICAgICAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBnZXRfcGxhdGZvcm0oKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpLnBsYXRfbmFtZQorCisgICAgICAgICMgJ2JkaXN0X2Jhc2UnIC0tIHBhcmVudCBvZiBwZXItYnVpbHQtZGlzdHJpYnV0aW9uLWZvcm1hdAorICAgICAgICAjIHRlbXBvcmFyeSBkaXJlY3RvcmllcyAoZWcuIHdlJ2xsIHByb2JhYmx5IGhhdmUKKyAgICAgICAgIyAiYnVpbGQvYmRpc3QuPHBsYXQ+L2R1bWIiLCAiYnVpbGQvYmRpc3QuPHBsYXQ+L3JwbSIsIGV0Yy4pCisgICAgICAgIGlmIHNlbGYuYmRpc3RfYmFzZSBpcyBOb25lOgorICAgICAgICAgICAgYnVpbGRfYmFzZSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpLmJ1aWxkX2Jhc2UKKyAgICAgICAgICAgIHNlbGYuYmRpc3RfYmFzZSA9IG9zLnBhdGguam9pbihidWlsZF9iYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZGlzdC4nICsgc2VsZi5wbGF0X25hbWUpCisKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ2Zvcm1hdHMnKQorICAgICAgICBpZiBzZWxmLmZvcm1hdHMgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHMgPSBbc2VsZi5kZWZhdWx0X2Zvcm1hdFtvcy5uYW1lXV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBidWlsdCBkaXN0cmlidXRpb25zICIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgIm9uIHBsYXRmb3JtICVzIiAlIG9zLm5hbWUKKworICAgICAgICBpZiBzZWxmLmRpc3RfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmRpc3RfZGlyID0gImRpc3QiCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjIEZpZ3VyZSBvdXQgd2hpY2ggc3ViLWNvbW1hbmRzIHdlIG5lZWQgdG8gcnVuLgorICAgICAgICBjb21tYW5kcyA9IFtdCisgICAgICAgIGZvciBmb3JtYXQgaW4gc2VsZi5mb3JtYXRzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbW1hbmRzLmFwcGVuZChzZWxmLmZvcm1hdF9jb21tYW5kW2Zvcm1hdF1bMF0pCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsICJpbnZhbGlkIGZvcm1hdCAnJXMnIiAlIGZvcm1hdAorCisgICAgICAgICMgUmVpbml0aWFsaXplIGFuZCBydW4gZWFjaCBjb21tYW5kLgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5mb3JtYXRzKSk6CisgICAgICAgICAgICBjbWRfbmFtZSA9IGNvbW1hbmRzW2ldCisgICAgICAgICAgICBzdWJfY21kID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZChjbWRfbmFtZSkKKyAgICAgICAgICAgIGlmIGNtZF9uYW1lIG5vdCBpbiBzZWxmLm5vX2Zvcm1hdF9vcHRpb246CisgICAgICAgICAgICAgICAgc3ViX2NtZC5mb3JtYXQgPSBzZWxmLmZvcm1hdHNbaV0KKworICAgICAgICAgICAgIyBwYXNzaW5nIHRoZSBvd25lciBhbmQgZ3JvdXAgbmFtZXMgZm9yIHRhciBhcmNoaXZpbmcKKyAgICAgICAgICAgIGlmIGNtZF9uYW1lID09ICdiZGlzdF9kdW1iJzoKKyAgICAgICAgICAgICAgICBzdWJfY21kLm93bmVyID0gc2VsZi5vd25lcgorICAgICAgICAgICAgICAgIHN1Yl9jbWQuZ3JvdXAgPSBzZWxmLmdyb3VwCisKKyAgICAgICAgICAgICMgSWYgd2UncmUgZ29pbmcgdG8gbmVlZCB0byBydW4gdGhpcyBjb21tYW5kIGFnYWluLCB0ZWxsIGl0IHRvCisgICAgICAgICAgICAjIGtlZXAgaXRzIHRlbXBvcmFyeSBmaWxlcyBhcm91bmQgc28gc3Vic2VxdWVudCBydW5zIGdvIGZhc3Rlci4KKyAgICAgICAgICAgIGlmIGNtZF9uYW1lIGluIGNvbW1hbmRzW2krMTpdOgorICAgICAgICAgICAgICAgIHN1Yl9jbWQua2VlcF90ZW1wID0gMQorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxYjc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYxYjc2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfZHVtYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjNjNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5CkBAIC0wLDAgKzEsMTMzIEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9kdW1iCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYmRpc3RfZHVtYicgY29tbWFuZCAoY3JlYXRlIGEgImR1bWIiIGJ1aWx0CitkaXN0cmlidXRpb24gLS0gaS5lLiwganVzdCBhbiBhcmNoaXZlIHRvIGJlIHVucGFja2VkIHVuZGVyICRwcmVmaXggb3IKKyRleGVjX3ByZWZpeCkuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKKworZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9weXRob25fdmVyc2lvbgorCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZSwgZW5zdXJlX3JlbGF0aXZlCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgYmRpc3RfZHVtYiAoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICdjcmVhdGUgYSAiZHVtYiIgYnVpbHQgZGlzdHJpYnV0aW9uJworCisgICAgdXNlcl9vcHRpb25zID0gWygnYmRpc3QtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICgncGxhdC1uYW1lPScsICdwJywKKyAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybSBuYW1lIHRvIGVtYmVkIGluIGdlbmVyYXRlZCBmaWxlbmFtZXMgIgorICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X3BsYXRmb3JtKCkpLAorICAgICAgICAgICAgICAgICAgICAoJ2Zvcm1hdD0nLCAnZicsCisgICAgICAgICAgICAgICAgICAgICAiYXJjaGl2ZSBmb3JtYXQgdG8gY3JlYXRlICh0YXIsIHp0YXIsIGd6dGFyLCB6aXApIiksCisgICAgICAgICAgICAgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAorICAgICAgICAgICAgICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCisgICAgICAgICAgICAgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAorICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiIpLAorICAgICAgICAgICAgICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCisgICAgICAgICAgICAgICAgICAgICgncmVsYXRpdmUnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgImJ1aWxkIHRoZSBhcmNoaXZlIHVzaW5nIHJlbGF0aXZlIHBhdGhzIgorICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiBmYWxzZSkiKSwKKyAgICAgICAgICAgICAgICAgICAgKCdvd25lcj0nLCAndScsCisgICAgICAgICAgICAgICAgICAgICAiT3duZXIgbmFtZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgdXNlcl0iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdncm91cD0nLCAnZycsCisgICAgICAgICAgICAgICAgICAgICAiR3JvdXAgbmFtZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB0YXIgZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICIgW2RlZmF1bHQ6IGN1cnJlbnQgZ3JvdXBdIiksCisgICAgICAgICAgICAgICAgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydrZWVwLXRlbXAnLCAnc2tpcC1idWlsZCcsICdyZWxhdGl2ZSddCisKKyAgICBkZWZhdWx0X2Zvcm1hdCA9IHsgJ3Bvc2l4JzogJ2d6dGFyJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ250JzogJ3ppcCcsCisgICAgICAgICAgICAgICAgICAgICAgICdvczInOiAnemlwJyB9CisKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLmJkaXN0X2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCisgICAgICAgIHNlbGYuZm9ybWF0ID0gTm9uZQorICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDAKKyAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gTm9uZQorICAgICAgICBzZWxmLnJlbGF0aXZlID0gMAorICAgICAgICBzZWxmLm93bmVyID0gTm9uZQorICAgICAgICBzZWxmLmdyb3VwID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQorICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ2R1bWInKQorCisgICAgICAgIGlmIHNlbGYuZm9ybWF0IGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXQgPSBzZWxmLmRlZmF1bHRfZm9ybWF0W29zLm5hbWVdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiZG9uJ3Qga25vdyBob3cgdG8gY3JlYXRlIGR1bWIgYnVpbHQgZGlzdHJpYnV0aW9ucyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIm9uIHBsYXRmb3JtICVzIikgJSBvcy5uYW1lCisKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdkaXN0X2RpcicsICdkaXN0X2RpcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3BsYXRfbmFtZScsICdwbGF0X25hbWUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdza2lwX2J1aWxkJywgJ3NraXBfYnVpbGQnKSkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnNraXBfYnVpbGQ6CisgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZCcpCisKKyAgICAgICAgaW5zdGFsbCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2luc3RhbGwnLCByZWluaXRfc3ViY29tbWFuZHM9MSkKKyAgICAgICAgaW5zdGFsbC5yb290ID0gc2VsZi5iZGlzdF9kaXIKKyAgICAgICAgaW5zdGFsbC5za2lwX2J1aWxkID0gc2VsZi5za2lwX2J1aWxkCisgICAgICAgIGluc3RhbGwud2Fybl9kaXIgPSAwCisKKyAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgdG8gJXMiICUgc2VsZi5iZGlzdF9kaXIpCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2luc3RhbGwnKQorCisgICAgICAgICMgQW5kIG1ha2UgYW4gYXJjaGl2ZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUKKyAgICAgICAgIyBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUuCisgICAgICAgIGFyY2hpdmVfYmFzZW5hbWUgPSAiJXMuJXMiICUgKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBsYXRfbmFtZSkKKworICAgICAgICAjIE9TLzIgb2JqZWN0cyB0byBhbnkgIjoiIGNoYXJhY3RlcnMgaW4gYSBmaWxlbmFtZSAoc3VjaCBhcyB3aGVuCisgICAgICAgICMgYSB0aW1lc3RhbXAgaXMgdXNlZCBpbiBhIHZlcnNpb24pIHNvIGNoYW5nZSB0aGVtIHRvIGh5cGhlbnMuCisgICAgICAgIGlmIG9zLm5hbWUgPT0gIm9zMiI6CisgICAgICAgICAgICBhcmNoaXZlX2Jhc2VuYW1lID0gYXJjaGl2ZV9iYXNlbmFtZS5yZXBsYWNlKCI6IiwgIi0iKQorCisgICAgICAgIHBzZXVkb2luc3RhbGxfcm9vdCA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBhcmNoaXZlX2Jhc2VuYW1lKQorICAgICAgICBpZiBub3Qgc2VsZi5yZWxhdGl2ZToKKyAgICAgICAgICAgIGFyY2hpdmVfcm9vdCA9IHNlbGYuYmRpc3RfZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAoc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkgYW5kCisgICAgICAgICAgICAgICAgKGluc3RhbGwuaW5zdGFsbF9iYXNlICE9IGluc3RhbGwuaW5zdGFsbF9wbGF0YmFzZSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImNhbid0IG1ha2UgYSBkdW1iIGJ1aWx0IGRpc3RyaWJ1dGlvbiB3aGVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJiYXNlIGFuZCBwbGF0YmFzZSBhcmUgZGlmZmVyZW50ICglcywgJXMpIgorICAgICAgICAgICAgICAgICAgICAgICAlIChyZXByKGluc3RhbGwuaW5zdGFsbF9iYXNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihpbnN0YWxsLmluc3RhbGxfcGxhdGJhc2UpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXJjaGl2ZV9yb290ID0gb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmVfcmVsYXRpdmUoaW5zdGFsbC5pbnN0YWxsX2Jhc2UpKQorCisgICAgICAgICMgTWFrZSB0aGUgYXJjaGl2ZQorICAgICAgICBmaWxlbmFtZSA9IHNlbGYubWFrZV9hcmNoaXZlKHBzZXVkb2luc3RhbGxfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdCwgcm9vdF9kaXI9YXJjaGl2ZV9yb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPXNlbGYub3duZXIsIGdyb3VwPXNlbGYuZ3JvdXApCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgcHl2ZXJzaW9uID0gZ2V0X3B5dGhvbl92ZXJzaW9uKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHB5dmVyc2lvbiA9ICdhbnknCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMuYXBwZW5kKCgnYmRpc3RfZHVtYicsIHB5dmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lKSkKKworICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CisgICAgICAgICAgICByZW1vdmVfdHJlZShzZWxmLmJkaXN0X2RpciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODAyMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X2R1bWIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODAyMjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9kdW1iLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwM2Y4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weQpAQCAtMCwwICsxLDc0MiBAQAorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYgTWFydGluIHZvbiBM9ndpcworIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisjIFRoZSBiZGlzdF93aW5pbnN0IGNvbW1hbmQgcHJvcGVyCisjIGJhc2VkIG9uIGJkaXN0X3dpbmluc3QKKyIiIgorSW1wbGVtZW50cyB0aGUgYmRpc3RfbXNpIGNvbW1hbmQuCisiIiIKK2ltcG9ydCBzeXMsIG9zCitmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl92ZXJzaW9uCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZQorZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCisKK2ltcG9ydCBtc2lsaWIKK2Zyb20gbXNpbGliIGltcG9ydCBzY2hlbWEsIHNlcXVlbmNlLCB0ZXh0Citmcm9tIG1zaWxpYiBpbXBvcnQgRGlyZWN0b3J5LCBGZWF0dXJlLCBEaWFsb2csIGFkZF9kYXRhCisKK2NsYXNzIFB5RGlhbG9nKERpYWxvZyk6CisgICAgIiIiRGlhbG9nIGNsYXNzIHdpdGggYSBmaXhlZCBsYXlvdXQ6IGNvbnRyb2xzIGF0IHRoZSB0b3AsIHRoZW4gYSBydWxlciwKKyAgICB0aGVuIGEgbGlzdCBvZiBidXR0b25zOiBiYWNrLCBuZXh0LCBjYW5jZWwuIE9wdGlvbmFsbHkgYSBiaXRtYXAgYXQgdGhlCisgICAgbGVmdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJEaWFsb2coZGF0YWJhc2UsIG5hbWUsIHgsIHksIHcsIGgsIGF0dHJpYnV0ZXMsIHRpdGxlLCBmaXJzdCwKKyAgICAgICAgZGVmYXVsdCwgY2FuY2VsLCBiaXRtYXA9dHJ1ZSkiIiIKKyAgICAgICAgRGlhbG9nLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICBydWxlciA9IHNlbGYuaCAtIDM2CisgICAgICAgICNpZiBrdy5nZXQoImJpdG1hcCIsIFRydWUpOgorICAgICAgICAjICAgIHNlbGYuYml0bWFwKCJCaXRtYXAiLCAwLCAwLCBibXdpZHRoLCBydWxlciwgIlB5dGhvbldpbiIpCisgICAgICAgIHNlbGYubGluZSgiQm90dG9tTGluZSIsIDAsIHJ1bGVyLCBzZWxmLncsIDApCisKKyAgICBkZWYgdGl0bGUoc2VsZiwgdGl0bGUpOgorICAgICAgICAiU2V0IHRoZSB0aXRsZSB0ZXh0IG9mIHRoZSBkaWFsb2cgYXQgdGhlIHRvcC4iCisgICAgICAgICMgbmFtZSwgeCwgeSwgdywgaCwgZmxhZ3M9VmlzaWJsZXxFbmFibGVkfFRyYW5zcGFyZW50fE5vUHJlZml4LAorICAgICAgICAjIHRleHQsIGluIFZlcmRhbmFCb2xkMTAKKyAgICAgICAgc2VsZi50ZXh0KCJUaXRsZSIsIDE1LCAxMCwgMzIwLCA2MCwgMHgzMDAwMywKKyAgICAgICAgICAgICAgICAgIHIie1xWZXJkYW5hQm9sZDEwfSVzIiAlIHRpdGxlKQorCisgICAgZGVmIGJhY2soc2VsZiwgdGl0bGUsIG5leHQsIG5hbWUgPSAiQmFjayIsIGFjdGl2ZSA9IDEpOgorICAgICAgICAiIiJBZGQgYSBiYWNrIGJ1dHRvbiB3aXRoIGEgZ2l2ZW4gdGl0bGUsIHRoZSB0YWItbmV4dCBidXR0b24sCisgICAgICAgIGl0cyBuYW1lIGluIHRoZSBDb250cm9sIHRhYmxlLCBwb3NzaWJseSBpbml0aWFsbHkgZGlzYWJsZWQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBidXR0b24sIHNvIHRoYXQgZXZlbnRzIGNhbiBiZSBhc3NvY2lhdGVkIiIiCisgICAgICAgIGlmIGFjdGl2ZToKKyAgICAgICAgICAgIGZsYWdzID0gMyAjIFZpc2libGV8RW5hYmxlZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmxhZ3MgPSAxICMgVmlzaWJsZQorICAgICAgICByZXR1cm4gc2VsZi5wdXNoYnV0dG9uKG5hbWUsIDE4MCwgc2VsZi5oLTI3ICwgNTYsIDE3LCBmbGFncywgdGl0bGUsIG5leHQpCisKKyAgICBkZWYgY2FuY2VsKHNlbGYsIHRpdGxlLCBuZXh0LCBuYW1lID0gIkNhbmNlbCIsIGFjdGl2ZSA9IDEpOgorICAgICAgICAiIiJBZGQgYSBjYW5jZWwgYnV0dG9uIHdpdGggYSBnaXZlbiB0aXRsZSwgdGhlIHRhYi1uZXh0IGJ1dHRvbiwKKyAgICAgICAgaXRzIG5hbWUgaW4gdGhlIENvbnRyb2wgdGFibGUsIHBvc3NpYmx5IGluaXRpYWxseSBkaXNhYmxlZC4KKworICAgICAgICBSZXR1cm4gdGhlIGJ1dHRvbiwgc28gdGhhdCBldmVudHMgY2FuIGJlIGFzc29jaWF0ZWQiIiIKKyAgICAgICAgaWYgYWN0aXZlOgorICAgICAgICAgICAgZmxhZ3MgPSAzICMgVmlzaWJsZXxFbmFibGVkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbGFncyA9IDEgIyBWaXNpYmxlCisgICAgICAgIHJldHVybiBzZWxmLnB1c2hidXR0b24obmFtZSwgMzA0LCBzZWxmLmgtMjcsIDU2LCAxNywgZmxhZ3MsIHRpdGxlLCBuZXh0KQorCisgICAgZGVmIG5leHQoc2VsZiwgdGl0bGUsIG5leHQsIG5hbWUgPSAiTmV4dCIsIGFjdGl2ZSA9IDEpOgorICAgICAgICAiIiJBZGQgYSBOZXh0IGJ1dHRvbiB3aXRoIGEgZ2l2ZW4gdGl0bGUsIHRoZSB0YWItbmV4dCBidXR0b24sCisgICAgICAgIGl0cyBuYW1lIGluIHRoZSBDb250cm9sIHRhYmxlLCBwb3NzaWJseSBpbml0aWFsbHkgZGlzYWJsZWQuCisKKyAgICAgICAgUmV0dXJuIHRoZSBidXR0b24sIHNvIHRoYXQgZXZlbnRzIGNhbiBiZSBhc3NvY2lhdGVkIiIiCisgICAgICAgIGlmIGFjdGl2ZToKKyAgICAgICAgICAgIGZsYWdzID0gMyAjIFZpc2libGV8RW5hYmxlZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmxhZ3MgPSAxICMgVmlzaWJsZQorICAgICAgICByZXR1cm4gc2VsZi5wdXNoYnV0dG9uKG5hbWUsIDIzNiwgc2VsZi5oLTI3LCA1NiwgMTcsIGZsYWdzLCB0aXRsZSwgbmV4dCkKKworICAgIGRlZiB4YnV0dG9uKHNlbGYsIG5hbWUsIHRpdGxlLCBuZXh0LCB4cG9zKToKKyAgICAgICAgIiIiQWRkIGEgYnV0dG9uIHdpdGggYSBnaXZlbiB0aXRsZSwgdGhlIHRhYi1uZXh0IGJ1dHRvbiwKKyAgICAgICAgaXRzIG5hbWUgaW4gdGhlIENvbnRyb2wgdGFibGUsIGdpdmluZyBpdHMgeCBwb3NpdGlvbjsgdGhlCisgICAgICAgIHktcG9zaXRpb24gaXMgYWxpZ25lZCB3aXRoIHRoZSBvdGhlciBidXR0b25zLgorCisgICAgICAgIFJldHVybiB0aGUgYnV0dG9uLCBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYXNzb2NpYXRlZCIiIgorICAgICAgICByZXR1cm4gc2VsZi5wdXNoYnV0dG9uKG5hbWUsIGludChzZWxmLncqeHBvcyAtIDI4KSwgc2VsZi5oLTI3LCA1NiwgMTcsIDMsIHRpdGxlLCBuZXh0KQorCitjbGFzcyBiZGlzdF9tc2kgKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGEgTWljcm9zb2Z0IEluc3RhbGxlciAoLm1zaSkgYmluYXJ5IGRpc3RyaWJ1dGlvbiIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsoJ2JkaXN0LWRpcj0nLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIHRoZSBkaXN0cmlidXRpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAorICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gZW1iZWQgaW4gZ2VuZXJhdGVkIGZpbGVuYW1lcyAiCisgICAgICAgICAgICAgICAgICAgICAiKGRlZmF1bHQ6ICVzKSIgJSBnZXRfcGxhdGZvcm0oKSksCisgICAgICAgICAgICAgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAorICAgICAgICAgICAgICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCisgICAgICAgICAgICAgICAgICAgICgndGFyZ2V0LXZlcnNpb249JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlIGEgc3BlY2lmaWMgcHl0aG9uIHZlcnNpb24iICsKKyAgICAgICAgICAgICAgICAgICAgICIgb24gdGhlIHRhcmdldCBzeXN0ZW0iKSwKKyAgICAgICAgICAgICAgICAgICAgKCduby10YXJnZXQtY29tcGlsZScsICdjJywKKyAgICAgICAgICAgICAgICAgICAgICJkbyBub3QgY29tcGlsZSAucHkgdG8gLnB5YyBvbiB0aGUgdGFyZ2V0IHN5c3RlbSIpLAorICAgICAgICAgICAgICAgICAgICAoJ25vLXRhcmdldC1vcHRpbWl6ZScsICdvJywKKyAgICAgICAgICAgICAgICAgICAgICJkbyBub3QgY29tcGlsZSAucHkgdG8gLnB5byAob3B0aW1pemVkKSIKKyAgICAgICAgICAgICAgICAgICAgICJvbiB0aGUgdGFyZ2V0IHN5c3RlbSIpLAorICAgICAgICAgICAgICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICAgICAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIGJ1aWx0IGRpc3RyaWJ1dGlvbnMgaW4iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAorICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGwtc2NyaXB0PScsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAiYmFzZW5hbWUgb2YgaW5zdGFsbGF0aW9uIHNjcmlwdCB0byBiZSBydW4gYWZ0ZXIiCisgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbGF0aW9uIG9yIGJlZm9yZSBkZWluc3RhbGxhdGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAoJ3ByZS1pbnN0YWxsLXNjcmlwdD0nLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIkZ1bGx5IHF1YWxpZmllZCBmaWxlbmFtZSBvZiBhIHNjcmlwdCB0byBiZSBydW4gYmVmb3JlICIKKyAgICAgICAgICAgICAgICAgICAgICJhbnkgZmlsZXMgYXJlIGluc3RhbGxlZC4gIFRoaXMgc2NyaXB0IG5lZWQgbm90IGJlIGluIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAiZGlzdHJpYnV0aW9uIiksCisgICAgICAgICAgICAgICAgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydrZWVwLXRlbXAnLCAnbm8tdGFyZ2V0LWNvbXBpbGUnLCAnbm8tdGFyZ2V0LW9wdGltaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3NraXAtYnVpbGQnXQorCisgICAgYWxsX3ZlcnNpb25zID0gWycyLjAnLCAnMi4xJywgJzIuMicsICcyLjMnLCAnMi40JywKKyAgICAgICAgICAgICAgICAgICAgJzIuNScsICcyLjYnLCAnMi43JywgJzIuOCcsICcyLjknLAorICAgICAgICAgICAgICAgICAgICAnMy4wJywgJzMuMScsICczLjInLCAnMy4zJywgJzMuNCcsCisgICAgICAgICAgICAgICAgICAgICczLjUnLCAnMy42JywgJzMuNycsICczLjgnLCAnMy45J10KKyAgICBvdGhlcl92ZXJzaW9uID0gJ1gnCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDAKKyAgICAgICAgc2VsZi5ub190YXJnZXRfY29tcGlsZSA9IDAKKyAgICAgICAgc2VsZi5ub190YXJnZXRfb3B0aW1pemUgPSAwCisgICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24gPSBOb25lCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmVfaW5zdGFsbF9zY3JpcHQgPSBOb25lCisgICAgICAgIHNlbGYudmVyc2lvbnMgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsICgnc2tpcF9idWlsZCcsICdza2lwX2J1aWxkJykpCisKKyAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIGJkaXN0X2Jhc2UgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3QnKS5iZGlzdF9iYXNlCisgICAgICAgICAgICBzZWxmLmJkaXN0X2RpciA9IG9zLnBhdGguam9pbihiZGlzdF9iYXNlLCAnbXNpJykKKworICAgICAgICBzaG9ydF92ZXJzaW9uID0gZ2V0X3B5dGhvbl92ZXJzaW9uKCkKKyAgICAgICAgaWYgKG5vdCBzZWxmLnRhcmdldF92ZXJzaW9uKSBhbmQgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CisgICAgICAgICAgICBzZWxmLnRhcmdldF92ZXJzaW9uID0gc2hvcnRfdmVyc2lvbgorCisgICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb246CisgICAgICAgICAgICBzZWxmLnZlcnNpb25zID0gW3NlbGYudGFyZ2V0X3ZlcnNpb25dCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkIGFuZCBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKVwKKyAgICAgICAgICAgICAgIGFuZCBzZWxmLnRhcmdldF92ZXJzaW9uICE9IHNob3J0X3ZlcnNpb246CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0IHZlcnNpb24gY2FuIG9ubHkgYmUgJXMsIG9yIHRoZSAnLS1za2lwLWJ1aWxkJyIgXAorICAgICAgICAgICAgICAgICAgICAgICIgb3B0aW9uIG11c3QgYmUgc3BlY2lmaWVkIiAlIChzaG9ydF92ZXJzaW9uLCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbnMgPSBsaXN0KHNlbGYuYWxsX3ZlcnNpb25zKQorCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZGlzdF9kaXInLCAnZGlzdF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdwbGF0X25hbWUnLCAncGxhdF9uYW1lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLnByZV9pbnN0YWxsX3NjcmlwdDoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCAidGhlIHByZS1pbnN0YWxsLXNjcmlwdCBmZWF0dXJlIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQiCisKKyAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3NjcmlwdDoKKyAgICAgICAgICAgIGZvciBzY3JpcHQgaW4gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0czoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmluc3RhbGxfc2NyaXB0ID09IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0KToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFsbF9zY3JpcHQgJyVzJyBub3QgZm91bmQgaW4gc2NyaXB0cyIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdAorICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0X2tleSA9IE5vbmUKKyAgICAjIGZpbmFsaXplX29wdGlvbnMoKQorCisKKyAgICBkZWYgcnVuIChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZDoKKyAgICAgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkJykKKworICAgICAgICBpbnN0YWxsID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbCcsIHJlaW5pdF9zdWJjb21tYW5kcz0xKQorICAgICAgICBpbnN0YWxsLnByZWZpeCA9IHNlbGYuYmRpc3RfZGlyCisgICAgICAgIGluc3RhbGwuc2tpcF9idWlsZCA9IHNlbGYuc2tpcF9idWlsZAorICAgICAgICBpbnN0YWxsLndhcm5fZGlyID0gMAorCisgICAgICAgIGluc3RhbGxfbGliID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZCgnaW5zdGFsbF9saWInKQorICAgICAgICAjIHdlIGRvIG5vdCB3YW50IHRvIGluY2x1ZGUgcHljIG9yIHB5byBmaWxlcworICAgICAgICBpbnN0YWxsX2xpYi5jb21waWxlID0gMAorICAgICAgICBpbnN0YWxsX2xpYi5vcHRpbWl6ZSA9IDAKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgICMgSWYgd2UgYXJlIGJ1aWxkaW5nIGFuIGluc3RhbGxlciBmb3IgYSBQeXRob24gdmVyc2lvbiBvdGhlcgorICAgICAgICAgICAgIyB0aGFuIHRoZSBvbmUgd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nLCB0aGVuIHdlIG5lZWQgdG8gZW5zdXJlCisgICAgICAgICAgICAjIG91ciBidWlsZF9saWIgcmVmbGVjdHMgdGhlIG90aGVyIFB5dGhvbiB2ZXJzaW9uIHJhdGhlciB0aGFuIG91cnMuCisgICAgICAgICAgICAjIE5vdGUgdGhhdCBmb3IgdGFyZ2V0X3ZlcnNpb24hPXN5cy52ZXJzaW9uLCB3ZSBtdXN0IGhhdmUgc2tpcHBlZCB0aGUKKyAgICAgICAgICAgICMgYnVpbGQgc3RlcCwgc28gdGhlcmUgaXMgbm8gaXNzdWUgd2l0aCBlbmZvcmNpbmcgdGhlIGJ1aWxkIG9mIHRoaXMKKyAgICAgICAgICAgICMgdmVyc2lvbi4KKyAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc2VsZi50YXJnZXRfdmVyc2lvbgorICAgICAgICAgICAgaWYgbm90IHRhcmdldF92ZXJzaW9uOgorICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLnNraXBfYnVpbGQsICJTaG91bGQgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhpcyIKKyAgICAgICAgICAgICAgICB0YXJnZXRfdmVyc2lvbiA9IHN5cy52ZXJzaW9uWzA6M10KKyAgICAgICAgICAgIHBsYXRfc3BlY2lmaWVyID0gIi4lcy0lcyIgJSAoc2VsZi5wbGF0X25hbWUsIHRhcmdldF92ZXJzaW9uKQorICAgICAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQorICAgICAgICAgICAgYnVpbGQuYnVpbGRfbGliID0gb3MucGF0aC5qb2luKGJ1aWxkLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpYicgKyBwbGF0X3NwZWNpZmllcikKKworICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyB0byAlcyIsIHNlbGYuYmRpc3RfZGlyKQorICAgICAgICBpbnN0YWxsLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgICMgYXZvaWQgd2FybmluZyBvZiAnaW5zdGFsbF9saWInIGFib3V0IGluc3RhbGxpbmcKKyAgICAgICAgIyBpbnRvIGEgZGlyZWN0b3J5IG5vdCBpbiBzeXMucGF0aAorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLCAnUFVSRUxJQicpKQorCisgICAgICAgIGluc3RhbGwucnVuKCkKKworICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKworICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmRpc3RfZGlyKQorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpCisgICAgICAgIGluc3RhbGxlcl9uYW1lID0gc2VsZi5nZXRfaW5zdGFsbGVyX2ZpbGVuYW1lKGZ1bGxuYW1lKQorICAgICAgICBpbnN0YWxsZXJfbmFtZSA9IG9zLnBhdGguYWJzcGF0aChpbnN0YWxsZXJfbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaW5zdGFsbGVyX25hbWUpOiBvcy51bmxpbmsoaW5zdGFsbGVyX25hbWUpCisKKyAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQorICAgICAgICBhdXRob3IgPSBtZXRhZGF0YS5hdXRob3IKKyAgICAgICAgaWYgbm90IGF1dGhvcjoKKyAgICAgICAgICAgIGF1dGhvciA9IG1ldGFkYXRhLm1haW50YWluZXIKKyAgICAgICAgaWYgbm90IGF1dGhvcjoKKyAgICAgICAgICAgIGF1dGhvciA9ICJVTktOT1dOIgorICAgICAgICB2ZXJzaW9uID0gbWV0YWRhdGEuZ2V0X3ZlcnNpb24oKQorICAgICAgICAjIFByb2R1Y3RWZXJzaW9uIG11c3QgYmUgc3RyaWN0bHkgbnVtZXJpYworICAgICAgICAjIFhYWCBuZWVkIHRvIGRlYWwgd2l0aCBwcmVyZWxlYXNlIHZlcnNpb25zCisgICAgICAgIHN2ZXJzaW9uID0gIiVkLiVkLiVkIiAlIFN0cmljdFZlcnNpb24odmVyc2lvbikudmVyc2lvbgorICAgICAgICAjIFByZWZpeCBQcm9kdWN0TmFtZSB3aXRoIFB5dGhvbiB4LnksIHNvIHRoYXQKKyAgICAgICAgIyBpdCBzb3J0cyB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBQeXRob24gcGFja2FnZXMKKyAgICAgICAgIyBpbiBBZGQtUmVtb3ZlLVByb2dyYW1zIChBUFIpCisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkKKyAgICAgICAgaWYgc2VsZi50YXJnZXRfdmVyc2lvbjoKKyAgICAgICAgICAgIHByb2R1Y3RfbmFtZSA9ICJQeXRob24gJXMgJXMiICUgKHNlbGYudGFyZ2V0X3ZlcnNpb24sIGZ1bGxuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvZHVjdF9uYW1lID0gIlB5dGhvbiAlcyIgJSAoZnVsbG5hbWUpCisgICAgICAgIHNlbGYuZGIgPSBtc2lsaWIuaW5pdF9kYXRhYmFzZShpbnN0YWxsZXJfbmFtZSwgc2NoZW1hLAorICAgICAgICAgICAgICAgIHByb2R1Y3RfbmFtZSwgbXNpbGliLmdlbl91dWlkKCksCisgICAgICAgICAgICAgICAgc3ZlcnNpb24sIGF1dGhvcikKKyAgICAgICAgbXNpbGliLmFkZF90YWJsZXMoc2VsZi5kYiwgc2VxdWVuY2UpCisgICAgICAgIHByb3BzID0gWygnRGlzdFZlcnNpb24nLCB2ZXJzaW9uKV0KKyAgICAgICAgZW1haWwgPSBtZXRhZGF0YS5hdXRob3JfZW1haWwgb3IgbWV0YWRhdGEubWFpbnRhaW5lcl9lbWFpbAorICAgICAgICBpZiBlbWFpbDoKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZCgoIkFSUENPTlRBQ1QiLCBlbWFpbCkpCisgICAgICAgIGlmIG1ldGFkYXRhLnVybDoKKyAgICAgICAgICAgIHByb3BzLmFwcGVuZCgoIkFSUFVSTElORk9BQk9VVCIsIG1ldGFkYXRhLnVybCkpCisgICAgICAgIGlmIHByb3BzOgorICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgJ1Byb3BlcnR5JywgcHJvcHMpCisKKyAgICAgICAgc2VsZi5hZGRfZmluZF9weXRob24oKQorICAgICAgICBzZWxmLmFkZF9maWxlcygpCisgICAgICAgIHNlbGYuYWRkX3NjcmlwdHMoKQorICAgICAgICBzZWxmLmFkZF91aSgpCisgICAgICAgIHNlbGYuZGIuQ29tbWl0KCkKKworICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZGlzdHJpYnV0aW9uLCAnZGlzdF9maWxlcycpOgorICAgICAgICAgICAgdHVwID0gJ2JkaXN0X21zaScsIHNlbGYudGFyZ2V0X3ZlcnNpb24gb3IgJ2FueScsIGZ1bGxuYW1lCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzLmFwcGVuZCh0dXApCisKKyAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgorICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgZGVmIGFkZF9maWxlcyhzZWxmKToKKyAgICAgICAgZGIgPSBzZWxmLmRiCisgICAgICAgIGNhYiA9IG1zaWxpYi5DQUIoImRpc3RmaWxlcyIpCisgICAgICAgIHJvb3RkaXIgPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5iZGlzdF9kaXIpCisKKyAgICAgICAgcm9vdCA9IERpcmVjdG9yeShkYiwgY2FiLCBOb25lLCByb290ZGlyLCAiVEFSR0VURElSIiwgIlNvdXJjZURpciIpCisgICAgICAgIGYgPSBGZWF0dXJlKGRiLCAiUHl0aG9uIiwgIlB5dGhvbiIsICJFdmVyeXRoaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgMCwgMSwgZGlyZWN0b3J5PSJUQVJHRVRESVIiKQorCisgICAgICAgIGl0ZW1zID0gWyhmLCByb290LCAnJyldCisgICAgICAgIGZvciB2ZXJzaW9uIGluIHNlbGYudmVyc2lvbnMgKyBbc2VsZi5vdGhlcl92ZXJzaW9uXToKKyAgICAgICAgICAgIHRhcmdldCA9ICJUQVJHRVRESVIiICsgdmVyc2lvbgorICAgICAgICAgICAgbmFtZSA9IGRlZmF1bHQgPSAiUHl0aG9uIiArIHZlcnNpb24KKyAgICAgICAgICAgIGRlc2MgPSAiRXZlcnl0aGluZyIKKyAgICAgICAgICAgIGlmIHZlcnNpb24gaXMgc2VsZi5vdGhlcl92ZXJzaW9uOgorICAgICAgICAgICAgICAgIHRpdGxlID0gIlB5dGhvbiBmcm9tIGFub3RoZXIgbG9jYXRpb24iCisgICAgICAgICAgICAgICAgbGV2ZWwgPSAyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRpdGxlID0gIlB5dGhvbiAlcyBmcm9tIHJlZ2lzdHJ5IiAlIHZlcnNpb24KKyAgICAgICAgICAgICAgICBsZXZlbCA9IDEKKyAgICAgICAgICAgIGYgPSBGZWF0dXJlKGRiLCBuYW1lLCB0aXRsZSwgZGVzYywgMSwgbGV2ZWwsIGRpcmVjdG9yeT10YXJnZXQpCisgICAgICAgICAgICBkaXIgPSBEaXJlY3RvcnkoZGIsIGNhYiwgcm9vdCwgcm9vdGRpciwgdGFyZ2V0LCBkZWZhdWx0KQorICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChmLCBkaXIsIHZlcnNpb24pKQorICAgICAgICBkYi5Db21taXQoKQorCisgICAgICAgIHNlZW4gPSB7fQorICAgICAgICBmb3IgZmVhdHVyZSwgZGlyLCB2ZXJzaW9uIGluIGl0ZW1zOgorICAgICAgICAgICAgdG9kbyA9IFtkaXJdCisgICAgICAgICAgICB3aGlsZSB0b2RvOgorICAgICAgICAgICAgICAgIGRpciA9IHRvZG8ucG9wKCkKKyAgICAgICAgICAgICAgICBmb3IgZmlsZSBpbiBvcy5saXN0ZGlyKGRpci5hYnNvbHV0ZSk6CisgICAgICAgICAgICAgICAgICAgIGFmaWxlID0gb3MucGF0aC5qb2luKGRpci5hYnNvbHV0ZSwgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihhZmlsZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCA9ICIlc3wlcyIgJSAoZGlyLm1ha2Vfc2hvcnQoZmlsZSksIGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gZmlsZSArIHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RpciA9IERpcmVjdG9yeShkYiwgY2FiLCBkaXIsIGZpbGUsIGRlZmF1bHQsIHNob3J0KQorICAgICAgICAgICAgICAgICAgICAgICAgdG9kby5hcHBlbmQobmV3ZGlyKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRpci5jb21wb25lbnQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyLnN0YXJ0X2NvbXBvbmVudChkaXIubG9naWNhbCwgZmVhdHVyZSwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFmaWxlIG5vdCBpbiBzZWVuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHNlZW5bYWZpbGVdID0gZGlyLmFkZF9maWxlKGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlsZT09c2VsZi5pbnN0YWxsX3NjcmlwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3NjcmlwdF9rZXk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBmaWxlcyB3aXRoIG5hbWUgJXMiICUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdF9rZXkgPSAnWyMlc10nICUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IHNlZW5bYWZpbGVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkR1cGxpY2F0ZUZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKGtleSArIHZlcnNpb24sIGRpci5jb21wb25lbnQsIGtleSwgTm9uZSwgZGlyLmxvZ2ljYWwpXSkKKyAgICAgICAgICAgIGRiLkNvbW1pdCgpCisgICAgICAgIGNhYi5jb21taXQoZGIpCisKKyAgICBkZWYgYWRkX2ZpbmRfcHl0aG9uKHNlbGYpOgorICAgICAgICAiIiJBZGRzIGNvZGUgdG8gdGhlIGluc3RhbGxlciB0byBjb21wdXRlIHRoZSBsb2NhdGlvbiBvZiBQeXRob24uCisKKyAgICAgICAgUHJvcGVydGllcyBQWVRIT04uTUFDSElORS5YLlkgYW5kIFBZVEhPTi5VU0VSLlguWSB3aWxsIGJlIHNldCBmcm9tIHRoZQorICAgICAgICByZWdpc3RyeSBmb3IgZWFjaCB2ZXJzaW9uIG9mIFB5dGhvbi4KKworICAgICAgICBQcm9wZXJ0aWVzIFRBUkdFVERJUlguWSB3aWxsIGJlIHNldCBmcm9tIFBZVEhPTi5VU0VSLlguWSBpZiBkZWZpbmVkLAorICAgICAgICBlbHNlIGZyb20gUFlUSE9OLk1BQ0hJTkUuWC5ZLgorCisgICAgICAgIFByb3BlcnRpZXMgUFlUSE9OWC5ZIHdpbGwgYmUgc2V0IHRvIFRBUkdFVERJUlguWVxccHl0aG9uLmV4ZSIiIgorCisgICAgICAgIHN0YXJ0ID0gNDAyCisgICAgICAgIGZvciB2ZXIgaW4gc2VsZi52ZXJzaW9uczoKKyAgICAgICAgICAgIGluc3RhbGxfcGF0aCA9IHIiU09GVFdBUkVcUHl0aG9uXFB5dGhvbkNvcmVcJXNcSW5zdGFsbFBhdGgiICUgdmVyCisgICAgICAgICAgICBtYWNoaW5lX3JlZyA9ICJweXRob24ubWFjaGluZS4iICsgdmVyCisgICAgICAgICAgICB1c2VyX3JlZyA9ICJweXRob24udXNlci4iICsgdmVyCisgICAgICAgICAgICBtYWNoaW5lX3Byb3AgPSAiUFlUSE9OLk1BQ0hJTkUuIiArIHZlcgorICAgICAgICAgICAgdXNlcl9wcm9wID0gIlBZVEhPTi5VU0VSLiIgKyB2ZXIKKyAgICAgICAgICAgIG1hY2hpbmVfYWN0aW9uID0gIlB5dGhvbkZyb21NYWNoaW5lIiArIHZlcgorICAgICAgICAgICAgdXNlcl9hY3Rpb24gPSAiUHl0aG9uRnJvbVVzZXIiICsgdmVyCisgICAgICAgICAgICBleGVfYWN0aW9uID0gIlB5dGhvbkV4ZSIgKyB2ZXIKKyAgICAgICAgICAgIHRhcmdldF9kaXJfcHJvcCA9ICJUQVJHRVRESVIiICsgdmVyCisgICAgICAgICAgICBleGVfcHJvcCA9ICJQWVRIT04iICsgdmVyCisgICAgICAgICAgICBpZiBtc2lsaWIuV2luNjQ6CisgICAgICAgICAgICAgICAgIyB0eXBlOiBtc2lkYkxvY2F0b3JUeXBlUmF3VmFsdWUgKyBtc2lkYkxvY2F0b3JUeXBlNjRiaXQKKyAgICAgICAgICAgICAgICBUeXBlID0gMisxNgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBUeXBlID0gMgorICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIlJlZ0xvY2F0b3IiLAorICAgICAgICAgICAgICAgICAgICBbKG1hY2hpbmVfcmVnLCAyLCBpbnN0YWxsX3BhdGgsIE5vbmUsIFR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgKHVzZXJfcmVnLCAxLCBpbnN0YWxsX3BhdGgsIE5vbmUsIFR5cGUpXSkKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJBcHBTZWFyY2giLAorICAgICAgICAgICAgICAgICAgICBbKG1hY2hpbmVfcHJvcCwgbWFjaGluZV9yZWcpLAorICAgICAgICAgICAgICAgICAgICAgKHVzZXJfcHJvcCwgdXNlcl9yZWcpXSkKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJDdXN0b21BY3Rpb24iLAorICAgICAgICAgICAgICAgICAgICBbKG1hY2hpbmVfYWN0aW9uLCA1MSsyNTYsIHRhcmdldF9kaXJfcHJvcCwgIlsiICsgbWFjaGluZV9wcm9wICsgIl0iKSwKKyAgICAgICAgICAgICAgICAgICAgICh1c2VyX2FjdGlvbiwgNTErMjU2LCB0YXJnZXRfZGlyX3Byb3AsICJbIiArIHVzZXJfcHJvcCArICJdIiksCisgICAgICAgICAgICAgICAgICAgICAoZXhlX2FjdGlvbiwgNTErMjU2LCBleGVfcHJvcCwgIlsiICsgdGFyZ2V0X2Rpcl9wcm9wICsgIl1cXHB5dGhvbi5leGUiKSwKKyAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgWyhtYWNoaW5lX2FjdGlvbiwgbWFjaGluZV9wcm9wLCBzdGFydCksCisgICAgICAgICAgICAgICAgICAgICAodXNlcl9hY3Rpb24sIHVzZXJfcHJvcCwgc3RhcnQgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgIChleGVfYWN0aW9uLCBOb25lLCBzdGFydCArIDIpLAorICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkluc3RhbGxVSVNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgWyhtYWNoaW5lX2FjdGlvbiwgbWFjaGluZV9wcm9wLCBzdGFydCksCisgICAgICAgICAgICAgICAgICAgICAodXNlcl9hY3Rpb24sIHVzZXJfcHJvcCwgc3RhcnQgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgIChleGVfYWN0aW9uLCBOb25lLCBzdGFydCArIDIpLAorICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkNvbmRpdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIFsoIlB5dGhvbiIgKyB2ZXIsIDAsICJOT1QgVEFSR0VURElSIiArIHZlcildKQorICAgICAgICAgICAgc3RhcnQgKz0gNAorICAgICAgICAgICAgYXNzZXJ0IHN0YXJ0IDwgNTAwCisKKyAgICBkZWYgYWRkX3NjcmlwdHMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9zY3JpcHQ6CisgICAgICAgICAgICBzdGFydCA9IDY4MDAKKyAgICAgICAgICAgIGZvciB2ZXIgaW4gc2VsZi52ZXJzaW9ucyArIFtzZWxmLm90aGVyX3ZlcnNpb25dOgorICAgICAgICAgICAgICAgIGluc3RhbGxfYWN0aW9uID0gImluc3RhbGxfc2NyaXB0LiIgKyB2ZXIKKyAgICAgICAgICAgICAgICBleGVfcHJvcCA9ICJQWVRIT04iICsgdmVyCisgICAgICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkN1c3RvbUFjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBbKGluc3RhbGxfYWN0aW9uLCA1MCwgZXhlX3Byb3AsIHNlbGYuaW5zdGFsbF9zY3JpcHRfa2V5KV0pCisgICAgICAgICAgICAgICAgYWRkX2RhdGEoc2VsZi5kYiwgIkluc3RhbGxFeGVjdXRlU2VxdWVuY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhpbnN0YWxsX2FjdGlvbiwgIiZQeXRob24lcz0zIiAlIHZlciwgc3RhcnQpXSkKKyAgICAgICAgICAgICAgICBzdGFydCArPSAxCisgICAgICAgICMgWFhYIHByZS1pbnN0YWxsIHNjcmlwdHMgYXJlIGN1cnJlbnRseSByZWZ1c2VkIGluIGZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICAjICAgICBidXQgaWYgdGhpcyBmZWF0dXJlIGlzIGNvbXBsZXRlZCwgaXQgd2lsbCBhbHNvIG5lZWQgdG8gYWRkCisgICAgICAgICMgICAgIGVudHJpZXMgZm9yIGVhY2ggdmVyc2lvbiBhcyB0aGUgYWJvdmUgY29kZSBkb2VzCisgICAgICAgIGlmIHNlbGYucHJlX2luc3RhbGxfc2NyaXB0OgorICAgICAgICAgICAgc2NyaXB0Zm4gPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsICJwcmVpbnN0YWxsLmJhdCIpCisgICAgICAgICAgICBmID0gb3BlbihzY3JpcHRmbiwgInciKQorICAgICAgICAgICAgIyBUaGUgYmF0Y2ggZmlsZSB3aWxsIGJlIGV4ZWN1dGVkIHdpdGggW1BZVEhPTl0sIHNvIHRoYXQgJTEKKyAgICAgICAgICAgICMgaXMgdGhlIHBhdGggdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcjsgJTAgd2lsbCBiZSB0aGUgcGF0aAorICAgICAgICAgICAgIyBvZiB0aGUgYmF0Y2ggZmlsZS4KKyAgICAgICAgICAgICMgcmVtID0iIiIKKyAgICAgICAgICAgICMgJTEgJTAKKyAgICAgICAgICAgICMgZXhpdAorICAgICAgICAgICAgIyAiIiIKKyAgICAgICAgICAgICMgPGFjdHVhbCBzY3JpcHQ+CisgICAgICAgICAgICBmLndyaXRlKCdyZW0gPSIiIlxuJTEgJTBcbmV4aXRcbiIiIlxuJykKKyAgICAgICAgICAgIGYud3JpdGUob3BlbihzZWxmLnByZV9pbnN0YWxsX3NjcmlwdCkucmVhZCgpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBhZGRfZGF0YShzZWxmLmRiLCAiQmluYXJ5IiwKKyAgICAgICAgICAgICAgICBbKCJQcmVJbnN0YWxsIiwgbXNpbGliLkJpbmFyeShzY3JpcHRmbikpCisgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJDdXN0b21BY3Rpb24iLAorICAgICAgICAgICAgICAgIFsoIlByZUluc3RhbGwiLCAyLCAiUHJlSW5zdGFsbCIsIE5vbmUpCisgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgICAgIGFkZF9kYXRhKHNlbGYuZGIsICJJbnN0YWxsRXhlY3V0ZVNlcXVlbmNlIiwKKyAgICAgICAgICAgICAgICAgICAgWygiUHJlSW5zdGFsbCIsICJOT1QgSW5zdGFsbGVkIiwgNDUwKV0pCisKKworICAgIGRlZiBhZGRfdWkoc2VsZik6CisgICAgICAgIGRiID0gc2VsZi5kYgorICAgICAgICB4ID0geSA9IDUwCisgICAgICAgIHcgPSAzNzAKKyAgICAgICAgaCA9IDMwMAorICAgICAgICB0aXRsZSA9ICJbUHJvZHVjdE5hbWVdIFNldHVwIgorCisgICAgICAgICMgc2VlICJEaWFsb2cgU3R5bGUgQml0cyIKKyAgICAgICAgbW9kYWwgPSAzICAgICAgIyB2aXNpYmxlIHwgbW9kYWwKKyAgICAgICAgbW9kZWxlc3MgPSAxICAgIyB2aXNpYmxlCisKKyAgICAgICAgIyBVSSBjdXN0b21pemF0aW9uIHByb3BlcnRpZXMKKyAgICAgICAgYWRkX2RhdGEoZGIsICJQcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICMgU2VlICJEZWZhdWx0VUlGb250IFByb3BlcnR5IgorICAgICAgICAgICAgICAgICBbKCJEZWZhdWx0VUlGb250IiwgIkRsZ0ZvbnQ4IiksCisgICAgICAgICAgICAgICAgICAjIFNlZSAiRXJyb3JEaWFsb2cgU3R5bGUgQml0IgorICAgICAgICAgICAgICAgICAgKCJFcnJvckRpYWxvZyIsICJFcnJvckRsZyIpLAorICAgICAgICAgICAgICAgICAgKCJQcm9ncmVzczEiLCAiSW5zdGFsbCIpLCAgICMgbW9kaWZpZWQgaW4gbWFpbnRlbmFuY2UgdHlwZSBkbGcKKyAgICAgICAgICAgICAgICAgICgiUHJvZ3Jlc3MyIiwgImluc3RhbGxzIiksCisgICAgICAgICAgICAgICAgICAoIk1haW50ZW5hbmNlRm9ybV9BY3Rpb24iLCAiUmVwYWlyIiksCisgICAgICAgICAgICAgICAgICAjIHBvc3NpYmxlIHZhbHVlczogQUxMLCBKVVNUTUUKKyAgICAgICAgICAgICAgICAgICgiV2hpY2hVc2VycyIsICJBTEwiKQorICAgICAgICAgICAgICAgICBdKQorCisgICAgICAgICMgRm9udHMsIHNlZSAiVGV4dFN0eWxlIFRhYmxlIgorICAgICAgICBhZGRfZGF0YShkYiwgIlRleHRTdHlsZSIsCisgICAgICAgICAgICAgICAgIFsoIkRsZ0ZvbnQ4IiwgIlRhaG9tYSIsIDksIE5vbmUsIDApLAorICAgICAgICAgICAgICAgICAgKCJEbGdGb250Qm9sZDgiLCAiVGFob21hIiwgOCwgTm9uZSwgMSksICNib2xkCisgICAgICAgICAgICAgICAgICAoIlZlcmRhbmFCb2xkMTAiLCAiVmVyZGFuYSIsIDEwLCBOb25lLCAxKSwKKyAgICAgICAgICAgICAgICAgICgiVmVyZGFuYVJlZDkiLCAiVmVyZGFuYSIsIDksIDI1NSwgMCksCisgICAgICAgICAgICAgICAgIF0pCisKKyAgICAgICAgIyBVSSBTZXF1ZW5jZXMsIHNlZSAiSW5zdGFsbFVJU2VxdWVuY2UgVGFibGUiLCAiVXNpbmcgYSBTZXF1ZW5jZSBUYWJsZSIKKyAgICAgICAgIyBOdW1iZXJzIGluZGljYXRlIHNlcXVlbmNlOyBzZWUgc2VxdWVuY2UucHkgZm9yIGhvdyB0aGVzZSBhY3Rpb24gaW50ZWdyYXRlCisgICAgICAgIGFkZF9kYXRhKGRiLCAiSW5zdGFsbFVJU2VxdWVuY2UiLAorICAgICAgICAgICAgICAgICBbKCJQcmVwYXJlRGxnIiwgIk5vdCBQcml2aWxlZ2VkIG9yIFdpbmRvd3M5eCBvciBJbnN0YWxsZWQiLCAxNDApLAorICAgICAgICAgICAgICAgICAgKCJXaGljaFVzZXJzRGxnIiwgIlByaXZpbGVnZWQgYW5kIG5vdCBXaW5kb3dzOXggYW5kIG5vdCBJbnN0YWxsZWQiLCAxNDEpLAorICAgICAgICAgICAgICAgICAgIyBJbiB0aGUgdXNlciBpbnRlcmZhY2UsIGFzc3VtZSBhbGwtdXNlcnMgaW5zdGFsbGF0aW9uIGlmIHByaXZpbGVnZWQuCisgICAgICAgICAgICAgICAgICAoIlNlbGVjdEZlYXR1cmVzRGxnIiwgIk5vdCBJbnN0YWxsZWQiLCAxMjMwKSwKKyAgICAgICAgICAgICAgICAgICMgWFhYIG5vIHN1cHBvcnQgZm9yIHJlc3VtZSBpbnN0YWxsYXRpb25zIHlldAorICAgICAgICAgICAgICAgICAgIygiUmVzdW1lRGxnIiwgIkluc3RhbGxlZCBBTkQgKFJFU1VNRSBPUiBQcmVzZWxlY3RlZCkiLCAxMjQwKSwKKyAgICAgICAgICAgICAgICAgICgiTWFpbnRlbmFuY2VUeXBlRGxnIiwgIkluc3RhbGxlZCBBTkQgTk9UIFJFU1VNRSBBTkQgTk9UIFByZXNlbGVjdGVkIiwgMTI1MCksCisgICAgICAgICAgICAgICAgICAoIlByb2dyZXNzRGxnIiwgTm9uZSwgMTI4MCldKQorCisgICAgICAgIGFkZF9kYXRhKGRiLCAnQWN0aW9uVGV4dCcsIHRleHQuQWN0aW9uVGV4dCkKKyAgICAgICAgYWRkX2RhdGEoZGIsICdVSVRleHQnLCB0ZXh0LlVJVGV4dCkKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgU3RhbmRhcmQgZGlhbG9nczogRmF0YWxFcnJvciwgVXNlckV4aXQsIEV4aXREaWFsb2cKKyAgICAgICAgZmF0YWw9UHlEaWFsb2coZGIsICJGYXRhbEVycm9yIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgIkZpbmlzaCIsICJGaW5pc2giLCAiRmluaXNoIikKKyAgICAgICAgZmF0YWwudGl0bGUoIltQcm9kdWN0TmFtZV0gSW5zdGFsbGVyIGVuZGVkIHByZW1hdHVyZWx5IikKKyAgICAgICAgZmF0YWwuYmFjaygiPCBCYWNrIiwgIkZpbmlzaCIsIGFjdGl2ZSA9IDApCisgICAgICAgIGZhdGFsLmNhbmNlbCgiQ2FuY2VsIiwgIkJhY2siLCBhY3RpdmUgPSAwKQorICAgICAgICBmYXRhbC50ZXh0KCJEZXNjcmlwdGlvbjEiLCAxNSwgNzAsIDMyMCwgODAsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICAgIltQcm9kdWN0TmFtZV0gc2V0dXAgZW5kZWQgcHJlbWF0dXJlbHkgYmVjYXVzZSBvZiBhbiBlcnJvci4gIFlvdXIgc3lzdGVtIGhhcyBub3QgYmVlbiBtb2RpZmllZC4gIFRvIGluc3RhbGwgdGhpcyBwcm9ncmFtIGF0IGEgbGF0ZXIgdGltZSwgcGxlYXNlIHJ1biB0aGUgaW5zdGFsbGF0aW9uIGFnYWluLiIpCisgICAgICAgIGZhdGFsLnRleHQoIkRlc2NyaXB0aW9uMiIsIDE1LCAxNTUsIDMyMCwgMjAsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICAgIkNsaWNrIHRoZSBGaW5pc2ggYnV0dG9uIHRvIGV4aXQgdGhlIEluc3RhbGxlci4iKQorICAgICAgICBjPWZhdGFsLm5leHQoIkZpbmlzaCIsICJDYW5jZWwiLCBuYW1lPSJGaW5pc2giKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiRXhpdCIpCisKKyAgICAgICAgdXNlcl9leGl0PVB5RGlhbG9nKGRiLCAiVXNlckV4aXQiLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAiRmluaXNoIiwgIkZpbmlzaCIsICJGaW5pc2giKQorICAgICAgICB1c2VyX2V4aXQudGl0bGUoIltQcm9kdWN0TmFtZV0gSW5zdGFsbGVyIHdhcyBpbnRlcnJ1cHRlZCIpCisgICAgICAgIHVzZXJfZXhpdC5iYWNrKCI8IEJhY2siLCAiRmluaXNoIiwgYWN0aXZlID0gMCkKKyAgICAgICAgdXNlcl9leGl0LmNhbmNlbCgiQ2FuY2VsIiwgIkJhY2siLCBhY3RpdmUgPSAwKQorICAgICAgICB1c2VyX2V4aXQudGV4dCgiRGVzY3JpcHRpb24xIiwgMTUsIDcwLCAzMjAsIDgwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgICJbUHJvZHVjdE5hbWVdIHNldHVwIHdhcyBpbnRlcnJ1cHRlZC4gIFlvdXIgc3lzdGVtIGhhcyBub3QgYmVlbiBtb2RpZmllZC4gICIKKyAgICAgICAgICAgICAgICAgICAiVG8gaW5zdGFsbCB0aGlzIHByb2dyYW0gYXQgYSBsYXRlciB0aW1lLCBwbGVhc2UgcnVuIHRoZSBpbnN0YWxsYXRpb24gYWdhaW4uIikKKyAgICAgICAgdXNlcl9leGl0LnRleHQoIkRlc2NyaXB0aW9uMiIsIDE1LCAxNTUsIDMyMCwgMjAsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICAgIkNsaWNrIHRoZSBGaW5pc2ggYnV0dG9uIHRvIGV4aXQgdGhlIEluc3RhbGxlci4iKQorICAgICAgICBjID0gdXNlcl9leGl0Lm5leHQoIkZpbmlzaCIsICJDYW5jZWwiLCBuYW1lPSJGaW5pc2giKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiRXhpdCIpCisKKyAgICAgICAgZXhpdF9kaWFsb2cgPSBQeURpYWxvZyhkYiwgIkV4aXREaWFsb2ciLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaW5pc2giLCAiRmluaXNoIiwgIkZpbmlzaCIpCisgICAgICAgIGV4aXRfZGlhbG9nLnRpdGxlKCJDb21wbGV0aW5nIHRoZSBbUHJvZHVjdE5hbWVdIEluc3RhbGxlciIpCisgICAgICAgIGV4aXRfZGlhbG9nLmJhY2soIjwgQmFjayIsICJGaW5pc2giLCBhY3RpdmUgPSAwKQorICAgICAgICBleGl0X2RpYWxvZy5jYW5jZWwoIkNhbmNlbCIsICJCYWNrIiwgYWN0aXZlID0gMCkKKyAgICAgICAgZXhpdF9kaWFsb2cudGV4dCgiRGVzY3JpcHRpb24iLCAxNSwgMjM1LCAzMjAsIDIwLCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgICJDbGljayB0aGUgRmluaXNoIGJ1dHRvbiB0byBleGl0IHRoZSBJbnN0YWxsZXIuIikKKyAgICAgICAgYyA9IGV4aXRfZGlhbG9nLm5leHQoIkZpbmlzaCIsICJDYW5jZWwiLCBuYW1lPSJGaW5pc2giKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiUmV0dXJuIikKKworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBSZXF1aXJlZCBkaWFsb2c6IEZpbGVzSW5Vc2UsIEVycm9yRGxnCisgICAgICAgIGludXNlID0gUHlEaWFsb2coZGIsICJGaWxlc0luVXNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCB3LCBoLAorICAgICAgICAgICAgICAgICAgICAgICAgIDE5LCAgICAgICAgICAgICAgICAjIEtlZXBNb2RlbGVzc3xNb2RhbHxWaXNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHJ5IiwgIlJldHJ5IiwgIlJldHJ5IiwgYml0bWFwPUZhbHNlKQorICAgICAgICBpbnVzZS50ZXh0KCJUaXRsZSIsIDE1LCA2LCAyMDAsIDE1LCAweDMwMDAzLAorICAgICAgICAgICAgICAgICAgIHIie1xEbGdGb250Qm9sZDh9RmlsZXMgaW4gVXNlIikKKyAgICAgICAgaW51c2UudGV4dCgiRGVzY3JpcHRpb24iLCAyMCwgMjMsIDI4MCwgMjAsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAiU29tZSBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZCBhcmUgY3VycmVudGx5IGluIHVzZS4iKQorICAgICAgICBpbnVzZS50ZXh0KCJUZXh0IiwgMjAsIDU1LCAzMzAsIDUwLCAzLAorICAgICAgICAgICAgICAgICAgICJUaGUgZm9sbG93aW5nIGFwcGxpY2F0aW9ucyBhcmUgdXNpbmcgZmlsZXMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQgYnkgdGhpcyBzZXR1cC4gQ2xvc2UgdGhlc2UgYXBwbGljYXRpb25zIGFuZCB0aGVuIGNsaWNrIFJldHJ5IHRvIGNvbnRpbnVlIHRoZSBpbnN0YWxsYXRpb24gb3IgQ2FuY2VsIHRvIGV4aXQgaXQuIikKKyAgICAgICAgaW51c2UuY29udHJvbCgiTGlzdCIsICJMaXN0Qm94IiwgMjAsIDEwNywgMzMwLCAxMzAsIDcsICJGaWxlSW5Vc2VQcm9jZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBjPWludXNlLmJhY2soIkV4aXQiLCAiSWdub3JlIiwgbmFtZT0iRXhpdCIpCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJFeGl0IikKKyAgICAgICAgYz1pbnVzZS5uZXh0KCJJZ25vcmUiLCAiUmV0cnkiLCBuYW1lPSJJZ25vcmUiKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiSWdub3JlIikKKyAgICAgICAgYz1pbnVzZS5jYW5jZWwoIlJldHJ5IiwgIkV4aXQiLCBuYW1lPSJSZXRyeSIpCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsIlJldHJ5IikKKworICAgICAgICAjIFNlZSAiRXJyb3IgRGlhbG9nIi4gU2VlICJJQ0UyMCIgZm9yIHRoZSByZXF1aXJlZCBuYW1lcyBvZiB0aGUgY29udHJvbHMuCisgICAgICAgIGVycm9yID0gRGlhbG9nKGRiLCAiRXJyb3JEbGciLAorICAgICAgICAgICAgICAgICAgICAgICA1MCwgMTAsIDMzMCwgMTAxLAorICAgICAgICAgICAgICAgICAgICAgICA2NTU0MywgICAgICAgIyBFcnJvcnxNaW5pbWl6ZXxNb2RhbHxWaXNpYmxlCisgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3JUZXh0IiwgTm9uZSwgTm9uZSkKKyAgICAgICAgZXJyb3IudGV4dCgiRXJyb3JUZXh0IiwgNTAsOSwyODAsNDgsMywgIiIpCisgICAgICAgICNlcnJvci5jb250cm9sKCJFcnJvckljb24iLCAiSWNvbiIsIDE1LCA5LCAyNCwgMjQsIDUyNDI4ODEsIE5vbmUsICJweS5pY28iLCBOb25lLCBOb25lKQorICAgICAgICBlcnJvci5wdXNoYnV0dG9uKCJOIiwxMjAsNzIsODEsMjEsMywiTm8iLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvck5vIikKKyAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiWSIsMjQwLDcyLDgxLDIxLDMsIlllcyIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9yWWVzIikKKyAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiQSIsMCw3Miw4MSwyMSwzLCJBYm9ydCIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9yQWJvcnQiKQorICAgICAgICBlcnJvci5wdXNoYnV0dG9uKCJDIiw0Miw3Miw4MSwyMSwzLCJDYW5jZWwiLE5vbmUpLmV2ZW50KCJFbmREaWFsb2ciLCJFcnJvckNhbmNlbCIpCisgICAgICAgIGVycm9yLnB1c2hidXR0b24oIkkiLDgxLDcyLDgxLDIxLDMsIklnbm9yZSIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9ySWdub3JlIikKKyAgICAgICAgZXJyb3IucHVzaGJ1dHRvbigiTyIsMTU5LDcyLDgxLDIxLDMsIk9rIixOb25lKS5ldmVudCgiRW5kRGlhbG9nIiwiRXJyb3JPayIpCisgICAgICAgIGVycm9yLnB1c2hidXR0b24oIlIiLDE5OCw3Miw4MSwyMSwzLCJSZXRyeSIsTm9uZSkuZXZlbnQoIkVuZERpYWxvZyIsIkVycm9yUmV0cnkiKQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIEdsb2JhbCAiUXVlcnkgQ2FuY2VsIiBkaWFsb2cKKyAgICAgICAgY2FuY2VsID0gRGlhbG9nKGRiLCAiQ2FuY2VsRGxnIiwgNTAsIDEwLCAyNjAsIDg1LCAzLCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJObyIsICJObyIsICJObyIpCisgICAgICAgIGNhbmNlbC50ZXh0KCJUZXh0IiwgNDgsIDE1LCAxOTQsIDMwLCAzLAorICAgICAgICAgICAgICAgICAgICAiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNhbmNlbCBbUHJvZHVjdE5hbWVdIGluc3RhbGxhdGlvbj8iKQorICAgICAgICAjY2FuY2VsLmNvbnRyb2woIkljb24iLCAiSWNvbiIsIDE1LCAxNSwgMjQsIDI0LCA1MjQyODgxLCBOb25lLAorICAgICAgICAjICAgICAgICAgICAgICAgInB5LmljbyIsIE5vbmUsIE5vbmUpCisgICAgICAgIGM9Y2FuY2VsLnB1c2hidXR0b24oIlllcyIsIDcyLCA1NywgNTYsIDE3LCAzLCAiWWVzIiwgIk5vIikKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIkV4aXQiKQorCisgICAgICAgIGM9Y2FuY2VsLnB1c2hidXR0b24oIk5vIiwgMTMyLCA1NywgNTYsIDE3LCAzLCAiTm8iLCAiWWVzIikKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgR2xvYmFsICJXYWl0IGZvciBjb3N0aW5nIiBkaWFsb2cKKyAgICAgICAgY29zdGluZyA9IERpYWxvZyhkYiwgIldhaXRGb3JDb3N0aW5nRGxnIiwgNTAsIDEwLCAyNjAsIDg1LCBtb2RhbCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHVybiIsICJSZXR1cm4iLCAiUmV0dXJuIikKKyAgICAgICAgY29zdGluZy50ZXh0KCJUZXh0IiwgNDgsIDE1LCAxOTQsIDMwLCAzLAorICAgICAgICAgICAgICAgICAgICAgIlBsZWFzZSB3YWl0IHdoaWxlIHRoZSBpbnN0YWxsZXIgZmluaXNoZXMgZGV0ZXJtaW5pbmcgeW91ciBkaXNrIHNwYWNlIHJlcXVpcmVtZW50cy4iKQorICAgICAgICBjID0gY29zdGluZy5wdXNoYnV0dG9uKCJSZXR1cm4iLCAxMDIsIDU3LCA1NiwgMTcsIDMsICJSZXR1cm4iLCBOb25lKQorICAgICAgICBjLmV2ZW50KCJFbmREaWFsb2ciLCAiRXhpdCIpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgUHJlcGFyYXRpb24gZGlhbG9nOiBubyB1c2VyIGlucHV0IGV4Y2VwdCBjYW5jZWxsYXRpb24KKyAgICAgICAgcHJlcCA9IFB5RGlhbG9nKGRiLCAiUHJlcGFyZURsZyIsIHgsIHksIHcsIGgsIG1vZGVsZXNzLCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYW5jZWwiLCAiQ2FuY2VsIiwgIkNhbmNlbCIpCisgICAgICAgIHByZXAudGV4dCgiRGVzY3JpcHRpb24iLCAxNSwgNzAsIDMyMCwgNDAsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICAiUGxlYXNlIHdhaXQgd2hpbGUgdGhlIEluc3RhbGxlciBwcmVwYXJlcyB0byBndWlkZSB5b3UgdGhyb3VnaCB0aGUgaW5zdGFsbGF0aW9uLiIpCisgICAgICAgIHByZXAudGl0bGUoIldlbGNvbWUgdG8gdGhlIFtQcm9kdWN0TmFtZV0gSW5zdGFsbGVyIikKKyAgICAgICAgYz1wcmVwLnRleHQoIkFjdGlvblRleHQiLCAxNSwgMTEwLCAzMjAsIDIwLCAweDMwMDAzLCAiUG9uZGVyaW5nLi4uIikKKyAgICAgICAgYy5tYXBwaW5nKCJBY3Rpb25UZXh0IiwgIlRleHQiKQorICAgICAgICBjPXByZXAudGV4dCgiQWN0aW9uRGF0YSIsIDE1LCAxMzUsIDMyMCwgMzAsIDB4MzAwMDMsIE5vbmUpCisgICAgICAgIGMubWFwcGluZygiQWN0aW9uRGF0YSIsICJUZXh0IikKKyAgICAgICAgcHJlcC5iYWNrKCJCYWNrIiwgTm9uZSwgYWN0aXZlPTApCisgICAgICAgIHByZXAubmV4dCgiTmV4dCIsIE5vbmUsIGFjdGl2ZT0wKQorICAgICAgICBjPXByZXAuY2FuY2VsKCJDYW5jZWwiLCBOb25lKQorICAgICAgICBjLmV2ZW50KCJTcGF3bkRpYWxvZyIsICJDYW5jZWxEbGciKQorCisgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIEZlYXR1cmUgKFB5dGhvbiBkaXJlY3RvcnkpIHNlbGVjdGlvbgorICAgICAgICBzZWxkbGcgPSBQeURpYWxvZyhkYiwgIlNlbGVjdEZlYXR1cmVzRGxnIiwgeCwgeSwgdywgaCwgbW9kYWwsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5leHQiLCAiTmV4dCIsICJDYW5jZWwiKQorICAgICAgICBzZWxkbGcudGl0bGUoIlNlbGVjdCBQeXRob24gSW5zdGFsbGF0aW9ucyIpCisKKyAgICAgICAgc2VsZGxnLnRleHQoIkhpbnQiLCAxNSwgMzAsIDMwMCwgMjAsIDMsCisgICAgICAgICAgICAgICAgICAgICJTZWxlY3QgdGhlIFB5dGhvbiBsb2NhdGlvbnMgd2hlcmUgJXMgc2hvdWxkIGJlIGluc3RhbGxlZC4iCisgICAgICAgICAgICAgICAgICAgICUgc2VsZi5kaXN0cmlidXRpb24uZ2V0X2Z1bGxuYW1lKCkpCisKKyAgICAgICAgc2VsZGxnLmJhY2soIjwgQmFjayIsIE5vbmUsIGFjdGl2ZT0wKQorICAgICAgICBjID0gc2VsZGxnLm5leHQoIk5leHQgPiIsICJDYW5jZWwiKQorICAgICAgICBvcmRlciA9IDEKKyAgICAgICAgYy5ldmVudCgiW1RBUkdFVERJUl0iLCAiW1NvdXJjZURpcl0iLCBvcmRlcmluZz1vcmRlcikKKyAgICAgICAgZm9yIHZlcnNpb24gaW4gc2VsZi52ZXJzaW9ucyArIFtzZWxmLm90aGVyX3ZlcnNpb25dOgorICAgICAgICAgICAgb3JkZXIgKz0gMQorICAgICAgICAgICAgYy5ldmVudCgiW1RBUkdFVERJUl0iLCAiW1RBUkdFVERJUiVzXSIgJSB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAiRkVBVFVSRV9TRUxFQ1RFRCBBTkQgJlB5dGhvbiVzPTMiICUgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJpbmc9b3JkZXIpCisgICAgICAgIGMuZXZlbnQoIlNwYXduV2FpdERpYWxvZyIsICJXYWl0Rm9yQ29zdGluZ0RsZyIsIG9yZGVyaW5nPW9yZGVyICsgMSkKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIsIG9yZGVyaW5nPW9yZGVyICsgMikKKyAgICAgICAgYyA9IHNlbGRsZy5jYW5jZWwoIkNhbmNlbCIsICJGZWF0dXJlcyIpCisgICAgICAgIGMuZXZlbnQoIlNwYXduRGlhbG9nIiwgIkNhbmNlbERsZyIpCisKKyAgICAgICAgYyA9IHNlbGRsZy5jb250cm9sKCJGZWF0dXJlcyIsICJTZWxlY3Rpb25UcmVlIiwgMTUsIDYwLCAzMDAsIDEyMCwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJGRUFUVVJFIiwgTm9uZSwgIlBhdGhFZGl0IiwgTm9uZSkKKyAgICAgICAgYy5ldmVudCgiW0ZFQVRVUkVfU0VMRUNURURdIiwgIjEiKQorICAgICAgICB2ZXIgPSBzZWxmLm90aGVyX3ZlcnNpb24KKyAgICAgICAgaW5zdGFsbF9vdGhlcl9jb25kID0gIkZFQVRVUkVfU0VMRUNURUQgQU5EICZQeXRob24lcz0zIiAlIHZlcgorICAgICAgICBkb250X2luc3RhbGxfb3RoZXJfY29uZCA9ICJGRUFUVVJFX1NFTEVDVEVEIEFORCAmUHl0aG9uJXM8PjMiICUgdmVyCisKKyAgICAgICAgYyA9IHNlbGRsZy50ZXh0KCJPdGhlciIsIDE1LCAyMDAsIDMwMCwgMTUsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvdmlkZSBhbiBhbHRlcm5hdGUgUHl0aG9uIGxvY2F0aW9uIikKKyAgICAgICAgYy5jb25kaXRpb24oIkVuYWJsZSIsIGluc3RhbGxfb3RoZXJfY29uZCkKKyAgICAgICAgYy5jb25kaXRpb24oIlNob3ciLCBpbnN0YWxsX290aGVyX2NvbmQpCisgICAgICAgIGMuY29uZGl0aW9uKCJEaXNhYmxlIiwgZG9udF9pbnN0YWxsX290aGVyX2NvbmQpCisgICAgICAgIGMuY29uZGl0aW9uKCJIaWRlIiwgZG9udF9pbnN0YWxsX290aGVyX2NvbmQpCisKKyAgICAgICAgYyA9IHNlbGRsZy5jb250cm9sKCJQYXRoRWRpdCIsICJQYXRoRWRpdCIsIDE1LCAyMTUsIDMwMCwgMTYsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEFSR0VURElSIiArIHZlciwgTm9uZSwgIk5leHQiLCBOb25lKQorICAgICAgICBjLmNvbmRpdGlvbigiRW5hYmxlIiwgaW5zdGFsbF9vdGhlcl9jb25kKQorICAgICAgICBjLmNvbmRpdGlvbigiU2hvdyIsIGluc3RhbGxfb3RoZXJfY29uZCkKKyAgICAgICAgYy5jb25kaXRpb24oIkRpc2FibGUiLCBkb250X2luc3RhbGxfb3RoZXJfY29uZCkKKyAgICAgICAgYy5jb25kaXRpb24oIkhpZGUiLCBkb250X2luc3RhbGxfb3RoZXJfY29uZCkKKworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBEaXNrIGNvc3QKKyAgICAgICAgY29zdCA9IFB5RGlhbG9nKGRiLCAiRGlza0Nvc3REbGciLCB4LCB5LCB3LCBoLCBtb2RhbCwgdGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiT0siLCAiT0siLCAiT0siLCBiaXRtYXA9RmFsc2UpCisgICAgICAgIGNvc3QudGV4dCgiVGl0bGUiLCAxNSwgNiwgMjAwLCAxNSwgMHgzMDAwMywKKyAgICAgICAgICAgICAgICAgICJ7XERsZ0ZvbnRCb2xkOH1EaXNrIFNwYWNlIFJlcXVpcmVtZW50cyIpCisgICAgICAgIGNvc3QudGV4dCgiRGVzY3JpcHRpb24iLCAyMCwgMjAsIDI4MCwgMjAsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICAiVGhlIGRpc2sgc3BhY2UgcmVxdWlyZWQgZm9yIHRoZSBpbnN0YWxsYXRpb24gb2YgdGhlIHNlbGVjdGVkIGZlYXR1cmVzLiIpCisgICAgICAgIGNvc3QudGV4dCgiVGV4dCIsIDIwLCA1MywgMzMwLCA2MCwgMywKKyAgICAgICAgICAgICAgICAgICJUaGUgaGlnaGxpZ2h0ZWQgdm9sdW1lcyAoaWYgYW55KSBkbyBub3QgaGF2ZSBlbm91Z2ggZGlzayBzcGFjZSAiCisgICAgICAgICAgICAgICJhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZmVhdHVyZXMuICBZb3UgY2FuIGVpdGhlciAiCisgICAgICAgICAgICAgICJyZW1vdmUgc29tZSBmaWxlcyBmcm9tIHRoZSBoaWdobGlnaHRlZCB2b2x1bWVzLCBvciBjaG9vc2UgdG8gIgorICAgICAgICAgICAgICAiaW5zdGFsbCBsZXNzIGZlYXR1cmVzIG9udG8gbG9jYWwgZHJpdmUocyksIG9yIHNlbGVjdCBkaWZmZXJlbnQgIgorICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZHJpdmUocykuIikKKyAgICAgICAgY29zdC5jb250cm9sKCJWb2x1bWVMaXN0IiwgIlZvbHVtZUNvc3RMaXN0IiwgMjAsIDEwMCwgMzMwLCAxNTAsIDM5MzIyMywKKyAgICAgICAgICAgICAgICAgICAgIE5vbmUsICJ7MTIwfXs3MH17NzB9ezcwfXs3MH0iLCBOb25lLCBOb25lKQorICAgICAgICBjb3N0LnhidXR0b24oIk9LIiwgIk9rIiwgTm9uZSwgMC41KS5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgICMgV2hpY2hVc2VycyBEaWFsb2cuIE9ubHkgYXZhaWxhYmxlIG9uIE5ULCBhbmQgZm9yIHByaXZpbGVnZWQgdXNlcnMuCisgICAgICAgICMgVGhpcyBtdXN0IGJlIHJ1biBiZWZvcmUgRmluZFJlbGF0ZWRQcm9kdWN0cywgYmVjYXVzZSB0aGF0IHdpbGwKKyAgICAgICAgIyB0YWtlIGludG8gYWNjb3VudCB3aGV0aGVyIHRoZSBwcmV2aW91cyBpbnN0YWxsYXRpb24gd2FzIHBlci11c2VyCisgICAgICAgICMgb3IgcGVyLW1hY2hpbmUuIFdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IGdvaW5nIGJhY2sgdG8gdGhpcworICAgICAgICAjIGRpYWxvZyBhZnRlciAiTmV4dCIgd2FzIHNlbGVjdGVkOyB0byBzdXBwb3J0IHRoaXMsIHdlIHdvdWxkIG5lZWQgdG8KKyAgICAgICAgIyBmaW5kIGhvdyB0byByZXNldCB0aGUgQUxMVVNFUlMgcHJvcGVydHksIGFuZCBob3cgdG8gcmUtcnVuCisgICAgICAgICMgRmluZFJlbGF0ZWRQcm9kdWN0cy4KKyAgICAgICAgIyBPbiBXaW5kb3dzOXgsIHRoZSBBTExVU0VSUyBwcm9wZXJ0eSBpcyBpZ25vcmVkIG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICAgICAgIyBhbmQgaW4gdGhlIFByb3BlcnR5IHRhYmxlLCBidXQgaW5zdGFsbGVyIGZhaWxzIGFjY29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbgorICAgICAgICAjIGlmIGEgZGlhbG9nIGF0dGVtcHRzIHRvIHNldCBBTExVU0VSUy4KKyAgICAgICAgd2hpY2h1c2VycyA9IFB5RGlhbG9nKGRiLCAiV2hpY2hVc2Vyc0RsZyIsIHgsIHksIHcsIGgsIG1vZGFsLCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWRtaW5JbnN0YWxsIiwgIk5leHQiLCAiQ2FuY2VsIikKKyAgICAgICAgd2hpY2h1c2Vycy50aXRsZSgiU2VsZWN0IHdoZXRoZXIgdG8gaW5zdGFsbCBbUHJvZHVjdE5hbWVdIGZvciBhbGwgdXNlcnMgb2YgdGhpcyBjb21wdXRlci4iKQorICAgICAgICAjIEEgcmFkaW8gZ3JvdXAgd2l0aCB0d28gb3B0aW9uczogYWxsdXNlcnMsIGp1c3RtZQorICAgICAgICBnID0gd2hpY2h1c2Vycy5yYWRpb2dyb3VwKCJBZG1pbkluc3RhbGwiLCAxNSwgNjAsIDI2MCwgNTAsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldoaWNoVXNlcnMiLCAiIiwgIk5leHQiKQorICAgICAgICBnLmFkZCgiQUxMIiwgMCwgNSwgMTUwLCAyMCwgIkluc3RhbGwgZm9yIGFsbCB1c2VycyIpCisgICAgICAgIGcuYWRkKCJKVVNUTUUiLCAwLCAyNSwgMTUwLCAyMCwgIkluc3RhbGwganVzdCBmb3IgbWUiKQorCisgICAgICAgIHdoaWNodXNlcnMuYmFjaygiQmFjayIsIE5vbmUsIGFjdGl2ZT0wKQorCisgICAgICAgIGMgPSB3aGljaHVzZXJzLm5leHQoIk5leHQgPiIsICJDYW5jZWwiKQorICAgICAgICBjLmV2ZW50KCJbQUxMVVNFUlNdIiwgIjEiLCAnV2hpY2hVc2Vycz0iQUxMIicsIDEpCisgICAgICAgIGMuZXZlbnQoIkVuZERpYWxvZyIsICJSZXR1cm4iLCBvcmRlcmluZyA9IDIpCisKKyAgICAgICAgYyA9IHdoaWNodXNlcnMuY2FuY2VsKCJDYW5jZWwiLCAiQWRtaW5JbnN0YWxsIikKKyAgICAgICAgYy5ldmVudCgiU3Bhd25EaWFsb2ciLCAiQ2FuY2VsRGxnIikKKworICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgIyBJbnN0YWxsYXRpb24gUHJvZ3Jlc3MgZGlhbG9nIChtb2RlbGVzcykKKyAgICAgICAgcHJvZ3Jlc3MgPSBQeURpYWxvZyhkYiwgIlByb2dyZXNzRGxnIiwgeCwgeSwgdywgaCwgbW9kZWxlc3MsIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5jZWwiLCAiQ2FuY2VsIiwgIkNhbmNlbCIsIGJpdG1hcD1GYWxzZSkKKyAgICAgICAgcHJvZ3Jlc3MudGV4dCgiVGl0bGUiLCAyMCwgMTUsIDIwMCwgMTUsIDB4MzAwMDMsCisgICAgICAgICAgICAgICAgICAgICAgIntcRGxnRm9udEJvbGQ4fVtQcm9ncmVzczFdIFtQcm9kdWN0TmFtZV0iKQorICAgICAgICBwcm9ncmVzcy50ZXh0KCJUZXh0IiwgMzUsIDY1LCAzMDAsIDMwLCAzLAorICAgICAgICAgICAgICAgICAgICAgICJQbGVhc2Ugd2FpdCB3aGlsZSB0aGUgSW5zdGFsbGVyIFtQcm9ncmVzczJdIFtQcm9kdWN0TmFtZV0uICIKKyAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBtYXkgdGFrZSBzZXZlcmFsIG1pbnV0ZXMuIikKKyAgICAgICAgcHJvZ3Jlc3MudGV4dCgiU3RhdHVzTGFiZWwiLCAzNSwgMTAwLCAzNSwgMjAsIDMsICJTdGF0dXM6IikKKworICAgICAgICBjPXByb2dyZXNzLnRleHQoIkFjdGlvblRleHQiLCA3MCwgMTAwLCB3LTcwLCAyMCwgMywgIlBvbmRlcmluZy4uLiIpCisgICAgICAgIGMubWFwcGluZygiQWN0aW9uVGV4dCIsICJUZXh0IikKKworICAgICAgICAjYz1wcm9ncmVzcy50ZXh0KCJBY3Rpb25EYXRhIiwgMzUsIDE0MCwgMzAwLCAyMCwgMywgTm9uZSkKKyAgICAgICAgI2MubWFwcGluZygiQWN0aW9uRGF0YSIsICJUZXh0IikKKworICAgICAgICBjPXByb2dyZXNzLmNvbnRyb2woIlByb2dyZXNzQmFyIiwgIlByb2dyZXNzQmFyIiwgMzUsIDEyMCwgMzAwLCAxMCwgNjU1MzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAiUHJvZ3Jlc3MgZG9uZSIsIE5vbmUsIE5vbmUpCisgICAgICAgIGMubWFwcGluZygiU2V0UHJvZ3Jlc3MiLCAiUHJvZ3Jlc3MiKQorCisgICAgICAgIHByb2dyZXNzLmJhY2soIjwgQmFjayIsICJOZXh0IiwgYWN0aXZlPUZhbHNlKQorICAgICAgICBwcm9ncmVzcy5uZXh0KCJOZXh0ID4iLCAiQ2FuY2VsIiwgYWN0aXZlPUZhbHNlKQorICAgICAgICBwcm9ncmVzcy5jYW5jZWwoIkNhbmNlbCIsICJCYWNrIikuZXZlbnQoIlNwYXduRGlhbG9nIiwgIkNhbmNlbERsZyIpCisKKyAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICAgICAjIE1haW50ZW5hbmNlIHR5cGU6IHJlcGFpci91bmluc3RhbGwKKyAgICAgICAgbWFpbnQgPSBQeURpYWxvZyhkYiwgIk1haW50ZW5hbmNlVHlwZURsZyIsIHgsIHksIHcsIGgsIG1vZGFsLCB0aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTmV4dCIsICJOZXh0IiwgIkNhbmNlbCIpCisgICAgICAgIG1haW50LnRpdGxlKCJXZWxjb21lIHRvIHRoZSBbUHJvZHVjdE5hbWVdIFNldHVwIFdpemFyZCIpCisgICAgICAgIG1haW50LnRleHQoIkJvZHlUZXh0IiwgMTUsIDYzLCAzMzAsIDQyLCAzLAorICAgICAgICAgICAgICAgICAgICJTZWxlY3Qgd2hldGhlciB5b3Ugd2FudCB0byByZXBhaXIgb3IgcmVtb3ZlIFtQcm9kdWN0TmFtZV0uIikKKyAgICAgICAgZz1tYWludC5yYWRpb2dyb3VwKCJSZXBhaXJSYWRpb0dyb3VwIiwgMTUsIDEwOCwgMzMwLCA2MCwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFpbnRlbmFuY2VGb3JtX0FjdGlvbiIsICIiLCAiTmV4dCIpCisgICAgICAgICNnLmFkZCgiQ2hhbmdlIiwgMCwgMCwgMjAwLCAxNywgIiZDaGFuZ2UgW1Byb2R1Y3ROYW1lXSIpCisgICAgICAgIGcuYWRkKCJSZXBhaXIiLCAwLCAxOCwgMjAwLCAxNywgIiZSZXBhaXIgW1Byb2R1Y3ROYW1lXSIpCisgICAgICAgIGcuYWRkKCJSZW1vdmUiLCAwLCAzNiwgMjAwLCAxNywgIlJlJm1vdmUgW1Byb2R1Y3ROYW1lXSIpCisKKyAgICAgICAgbWFpbnQuYmFjaygiPCBCYWNrIiwgTm9uZSwgYWN0aXZlPUZhbHNlKQorICAgICAgICBjPW1haW50Lm5leHQoIkZpbmlzaCIsICJDYW5jZWwiKQorICAgICAgICAjIENoYW5nZSBpbnN0YWxsYXRpb246IENoYW5nZSBwcm9ncmVzcyBkaWFsb2cgdG8gIkNoYW5nZSIsIHRoZW4gYXNrCisgICAgICAgICMgZm9yIGZlYXR1cmUgc2VsZWN0aW9uCisgICAgICAgICNjLmV2ZW50KCJbUHJvZ3Jlc3MxXSIsICJDaGFuZ2UiLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iQ2hhbmdlIicsIDEpCisgICAgICAgICNjLmV2ZW50KCJbUHJvZ3Jlc3MyXSIsICJjaGFuZ2VzIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IkNoYW5nZSInLCAyKQorCisgICAgICAgICMgUmVpbnN0YWxsOiBDaGFuZ2UgcHJvZ3Jlc3MgZGlhbG9nIHRvICJSZXBhaXIiLCB0aGVuIGludm9rZSByZWluc3RhbGwKKyAgICAgICAgIyBBbHNvIHNldCBsaXN0IG9mIHJlaW5zdGFsbGVkIGZlYXR1cmVzIHRvICJBTEwiCisgICAgICAgIGMuZXZlbnQoIltSRUlOU1RBTExdIiwgIkFMTCIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZXBhaXIiJywgNSkKKyAgICAgICAgYy5ldmVudCgiW1Byb2dyZXNzMV0iLCAiUmVwYWlyaW5nIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlcGFpciInLCA2KQorICAgICAgICBjLmV2ZW50KCJbUHJvZ3Jlc3MyXSIsICJyZXBhaXJzIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlcGFpciInLCA3KQorICAgICAgICBjLmV2ZW50KCJSZWluc3RhbGwiLCAiQUxMIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlcGFpciInLCA4KQorCisgICAgICAgICMgVW5pbnN0YWxsOiBDaGFuZ2UgcHJvZ3Jlc3MgdG8gIlJlbW92ZSIsIHRoZW4gaW52b2tlIHVuaW5zdGFsbAorICAgICAgICAjIEFsc28gc2V0IGxpc3Qgb2YgcmVtb3ZlZCBmZWF0dXJlcyB0byAiQUxMIgorICAgICAgICBjLmV2ZW50KCJbUkVNT1ZFXSIsICJBTEwiLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iUmVtb3ZlIicsIDExKQorICAgICAgICBjLmV2ZW50KCJbUHJvZ3Jlc3MxXSIsICJSZW1vdmluZyIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPSJSZW1vdmUiJywgMTIpCisgICAgICAgIGMuZXZlbnQoIltQcm9ncmVzczJdIiwgInJlbW92ZXMiLCAnTWFpbnRlbmFuY2VGb3JtX0FjdGlvbj0iUmVtb3ZlIicsIDEzKQorICAgICAgICBjLmV2ZW50KCJSZW1vdmUiLCAiQUxMIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IlJlbW92ZSInLCAxNCkKKworICAgICAgICAjIENsb3NlIGRpYWxvZyB3aGVuIG1haW50ZW5hbmNlIGFjdGlvbiBzY2hlZHVsZWQKKyAgICAgICAgYy5ldmVudCgiRW5kRGlhbG9nIiwgIlJldHVybiIsICdNYWludGVuYW5jZUZvcm1fQWN0aW9uPD4iQ2hhbmdlIicsIDIwKQorICAgICAgICAjYy5ldmVudCgiTmV3RGlhbG9nIiwgIlNlbGVjdEZlYXR1cmVzRGxnIiwgJ01haW50ZW5hbmNlRm9ybV9BY3Rpb249IkNoYW5nZSInLCAyMSkKKworICAgICAgICBtYWludC5jYW5jZWwoIkNhbmNlbCIsICJSZXBhaXJSYWRpb0dyb3VwIikuZXZlbnQoIlNwYXduRGlhbG9nIiwgIkNhbmNlbERsZyIpCisKKyAgICBkZWYgZ2V0X2luc3RhbGxlcl9maWxlbmFtZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgICMgRmFjdG9yZWQgb3V0IHRvIGFsbG93IG92ZXJyaWRpbmcgaW4gc3ViY2xhc3NlcworICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uOgorICAgICAgICAgICAgYmFzZV9uYW1lID0gIiVzLiVzLXB5JXMubXNpIiAlIChmdWxsbmFtZSwgc2VsZi5wbGF0X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0X3ZlcnNpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlX25hbWUgPSAiJXMuJXMubXNpIiAlIChmdWxsbmFtZSwgc2VsZi5wbGF0X25hbWUpCisgICAgICAgIGluc3RhbGxlcl9uYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZGlzdF9kaXIsIGJhc2VfbmFtZSkKKyAgICAgICAgcmV0dXJuIGluc3RhbGxlcl9uYW1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiNTIxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X21zaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0ZTg1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfbXNpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NTgyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weQpAQCAtMCwwICsxLDU4NyBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYmRpc3RfcnBtJyBjb21tYW5kIChjcmVhdGUgUlBNIHNvdXJjZSBhbmQgYmluYXJ5CitkaXN0cmlidXRpb25zKS4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgd3JpdGVfZmlsZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0dXRpbHNGaWxlRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvcikKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgYmRpc3RfcnBtIChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhbiBSUE0gZGlzdHJpYnV0aW9uIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2JkaXN0LWJhc2U9JywgTm9uZSwKKyAgICAgICAgICJiYXNlIGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgYnVpbHQgZGlzdHJpYnV0aW9ucyIpLAorICAgICAgICAoJ3JwbS1iYXNlPScsIE5vbmUsCisgICAgICAgICAiYmFzZSBkaXJlY3RvcnkgZm9yIGNyZWF0aW5nIFJQTXMgKGRlZmF1bHRzIHRvIFwicnBtXCIgdW5kZXIgIgorICAgICAgICAgIi0tYmRpc3QtYmFzZTsgbXVzdCBiZSBzcGVjaWZpZWQgZm9yIFJQTSAyKSIpLAorICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IGZpbmFsIFJQTSBmaWxlcyBpbiAiCisgICAgICAgICAiKGFuZCAuc3BlYyBmaWxlcyBpZiAtLXNwZWMtb25seSkiKSwKKyAgICAgICAgKCdweXRob249JywgTm9uZSwKKyAgICAgICAgICJwYXRoIHRvIFB5dGhvbiBpbnRlcnByZXRlciB0byBoYXJkLWNvZGUgaW4gdGhlIC5zcGVjIGZpbGUgIgorICAgICAgICAgIihkZWZhdWx0OiBcInB5dGhvblwiKSIpLAorICAgICAgICAoJ2ZpeC1weXRob24nLCBOb25lLAorICAgICAgICAgImhhcmQtY29kZSB0aGUgZXhhY3QgcGF0aCB0byB0aGUgY3VycmVudCBQeXRob24gaW50ZXJwcmV0ZXIgaW4gIgorICAgICAgICAgInRoZSAuc3BlYyBmaWxlIiksCisgICAgICAgICgnc3BlYy1vbmx5JywgTm9uZSwKKyAgICAgICAgICJvbmx5IHJlZ2VuZXJhdGUgc3BlYyBmaWxlIiksCisgICAgICAgICgnc291cmNlLW9ubHknLCBOb25lLAorICAgICAgICAgIm9ubHkgZ2VuZXJhdGUgc291cmNlIFJQTSIpLAorICAgICAgICAoJ2JpbmFyeS1vbmx5JywgTm9uZSwKKyAgICAgICAgICJvbmx5IGdlbmVyYXRlIGJpbmFyeSBSUE0iKSwKKyAgICAgICAgKCd1c2UtYnppcDInLCBOb25lLAorICAgICAgICAgInVzZSBiemlwMiBpbnN0ZWFkIG9mIGd6aXAgdG8gY3JlYXRlIHNvdXJjZSBkaXN0cmlidXRpb24iKSwKKworICAgICAgICAjIE1vcmUgbWV0YS1kYXRhOiB0b28gUlBNLXNwZWNpZmljIHRvIHB1dCBpbiB0aGUgc2V0dXAgc2NyaXB0LAorICAgICAgICAjIGJ1dCBuZWVkcyB0byBnbyBpbiB0aGUgLnNwZWMgZmlsZSAtLSBzbyB3ZSBtYWtlIHRoZXNlIG9wdGlvbnMKKyAgICAgICAgIyB0byAiYmRpc3RfcnBtIi4gIFRoZSBpZGVhIGlzIHRoYXQgcGFja2FnZXJzIHdvdWxkIHB1dCB0aGlzCisgICAgICAgICMgaW5mbyBpbiBzZXR1cC5jZmcsIGFsdGhvdWdoIHRoZXkgYXJlIG9mIGNvdXJzZSBmcmVlIHRvCisgICAgICAgICMgc3VwcGx5IGl0IG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgICAgICgnZGlzdHJpYnV0aW9uLW5hbWU9JywgTm9uZSwKKyAgICAgICAgICJuYW1lIG9mIHRoZSAoTGludXgpIGRpc3RyaWJ1dGlvbiB0byB3aGljaCB0aGlzICIKKyAgICAgICAgICJSUE0gYXBwbGllcyAoKm5vdCogdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBkaXN0cmlidXRpb24hKSIpLAorICAgICAgICAoJ2dyb3VwPScsIE5vbmUsCisgICAgICAgICAicGFja2FnZSBjbGFzc2lmaWNhdGlvbiBbZGVmYXVsdDogXCJEZXZlbG9wbWVudC9MaWJyYXJpZXNcIl0iKSwKKyAgICAgICAgKCdyZWxlYXNlPScsIE5vbmUsCisgICAgICAgICAiUlBNIHJlbGVhc2UgbnVtYmVyIiksCisgICAgICAgICgnc2VyaWFsPScsIE5vbmUsCisgICAgICAgICAiUlBNIHNlcmlhbCBudW1iZXIiKSwKKyAgICAgICAgKCd2ZW5kb3I9JywgTm9uZSwKKyAgICAgICAgICJSUE0gXCJ2ZW5kb3JcIiAoZWcuIFwiSm9lIEJsb3cgPGpvZUBleGFtcGxlLmNvbT5cIikgIgorICAgICAgICAgIltkZWZhdWx0OiBtYWludGFpbmVyIG9yIGF1dGhvciBmcm9tIHNldHVwIHNjcmlwdF0iKSwKKyAgICAgICAgKCdwYWNrYWdlcj0nLCBOb25lLAorICAgICAgICAgIlJQTSBwYWNrYWdlciAoZWcuIFwiSmFuZSBEb2UgPGphbmVAZXhhbXBsZS5uZXQ+XCIpIgorICAgICAgICAgIltkZWZhdWx0OiB2ZW5kb3JdIiksCisgICAgICAgICgnZG9jLWZpbGVzPScsIE5vbmUsCisgICAgICAgICAibGlzdCBvZiBkb2N1bWVudGF0aW9uIGZpbGVzIChzcGFjZSBvciBjb21tYS1zZXBhcmF0ZWQpIiksCisgICAgICAgICgnY2hhbmdlbG9nPScsIE5vbmUsCisgICAgICAgICAiUlBNIGNoYW5nZWxvZyIpLAorICAgICAgICAoJ2ljb249JywgTm9uZSwKKyAgICAgICAgICJuYW1lIG9mIGljb24gZmlsZSIpLAorICAgICAgICAoJ3Byb3ZpZGVzPScsIE5vbmUsCisgICAgICAgICAiY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoaXMgcGFja2FnZSIpLAorICAgICAgICAoJ3JlcXVpcmVzPScsIE5vbmUsCisgICAgICAgICAiY2FwYWJpbGl0aWVzIHJlcXVpcmVkIGJ5IHRoaXMgcGFja2FnZSIpLAorICAgICAgICAoJ2NvbmZsaWN0cz0nLCBOb25lLAorICAgICAgICAgImNhcGFiaWxpdGllcyB3aGljaCBjb25mbGljdCB3aXRoIHRoaXMgcGFja2FnZSIpLAorICAgICAgICAoJ2J1aWxkLXJlcXVpcmVzPScsIE5vbmUsCisgICAgICAgICAiY2FwYWJpbGl0aWVzIHJlcXVpcmVkIHRvIGJ1aWxkIHRoaXMgcGFja2FnZSIpLAorICAgICAgICAoJ29ic29sZXRlcz0nLCBOb25lLAorICAgICAgICAgImNhcGFiaWxpdGllcyBtYWRlIG9ic29sZXRlIGJ5IHRoaXMgcGFja2FnZSIpLAorICAgICAgICAoJ25vLWF1dG9yZXEnLCBOb25lLAorICAgICAgICAgImRvIG5vdCBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZSBkZXBlbmRlbmNpZXMiKSwKKworICAgICAgICAjIEFjdGlvbnMgdG8gdGFrZSB3aGVuIGJ1aWxkaW5nIFJQTQorICAgICAgICAoJ2tlZXAtdGVtcCcsICdrJywKKyAgICAgICAgICJkb24ndCBjbGVhbiB1cCBSUE0gYnVpbGQgZGlyZWN0b3J5IiksCisgICAgICAgICgnbm8ta2VlcC10ZW1wJywgTm9uZSwKKyAgICAgICAgICJjbGVhbiB1cCBSUE0gYnVpbGQgZGlyZWN0b3J5IFtkZWZhdWx0XSIpLAorICAgICAgICAoJ3VzZS1ycG0tb3B0LWZsYWdzJywgTm9uZSwKKyAgICAgICAgICJjb21waWxlIHdpdGggUlBNX09QVF9GTEFHUyB3aGVuIGJ1aWxkaW5nIGZyb20gc291cmNlIFJQTSIpLAorICAgICAgICAoJ25vLXJwbS1vcHQtZmxhZ3MnLCBOb25lLAorICAgICAgICAgImRvIG5vdCBwYXNzIGFueSBSUE0gQ0ZMQUdTIHRvIGNvbXBpbGVyIiksCisgICAgICAgICgncnBtMy1tb2RlJywgTm9uZSwKKyAgICAgICAgICJSUE0gMyBjb21wYXRpYmlsaXR5IG1vZGUgKGRlZmF1bHQpIiksCisgICAgICAgICgncnBtMi1tb2RlJywgTm9uZSwKKyAgICAgICAgICJSUE0gMiBjb21wYXRpYmlsaXR5IG1vZGUiKSwKKworICAgICAgICAjIEFkZCB0aGUgaG9va3MgbmVjZXNzYXJ5IGZvciBzcGVjaWZ5aW5nIGN1c3RvbSBzY3JpcHRzCisgICAgICAgICgncHJlcC1zY3JpcHQ9JywgTm9uZSwKKyAgICAgICAgICJTcGVjaWZ5IGEgc2NyaXB0IGZvciB0aGUgUFJFUCBwaGFzZSBvZiBSUE0gYnVpbGRpbmciKSwKKyAgICAgICAgKCdidWlsZC1zY3JpcHQ9JywgTm9uZSwKKyAgICAgICAgICJTcGVjaWZ5IGEgc2NyaXB0IGZvciB0aGUgQlVJTEQgcGhhc2Ugb2YgUlBNIGJ1aWxkaW5nIiksCisKKyAgICAgICAgKCdwcmUtaW5zdGFsbD0nLCBOb25lLAorICAgICAgICAgIlNwZWNpZnkgYSBzY3JpcHQgZm9yIHRoZSBwcmUtSU5TVEFMTCBwaGFzZSBvZiBSUE0gYnVpbGRpbmciKSwKKyAgICAgICAgKCdpbnN0YWxsLXNjcmlwdD0nLCBOb25lLAorICAgICAgICAgIlNwZWNpZnkgYSBzY3JpcHQgZm9yIHRoZSBJTlNUQUxMIHBoYXNlIG9mIFJQTSBidWlsZGluZyIpLAorICAgICAgICAoJ3Bvc3QtaW5zdGFsbD0nLCBOb25lLAorICAgICAgICAgIlNwZWNpZnkgYSBzY3JpcHQgZm9yIHRoZSBwb3N0LUlOU1RBTEwgcGhhc2Ugb2YgUlBNIGJ1aWxkaW5nIiksCisKKyAgICAgICAgKCdwcmUtdW5pbnN0YWxsPScsIE5vbmUsCisgICAgICAgICAiU3BlY2lmeSBhIHNjcmlwdCBmb3IgdGhlIHByZS1VTklOU1RBTEwgcGhhc2Ugb2YgUlBNIGJ1aWxkaW5nIiksCisgICAgICAgICgncG9zdC11bmluc3RhbGw9JywgTm9uZSwKKyAgICAgICAgICJTcGVjaWZ5IGEgc2NyaXB0IGZvciB0aGUgcG9zdC1VTklOU1RBTEwgcGhhc2Ugb2YgUlBNIGJ1aWxkaW5nIiksCisKKyAgICAgICAgKCdjbGVhbi1zY3JpcHQ9JywgTm9uZSwKKyAgICAgICAgICJTcGVjaWZ5IGEgc2NyaXB0IGZvciB0aGUgQ0xFQU4gcGhhc2Ugb2YgUlBNIGJ1aWxkaW5nIiksCisKKyAgICAgICAgKCd2ZXJpZnktc2NyaXB0PScsIE5vbmUsCisgICAgICAgICAiU3BlY2lmeSBhIHNjcmlwdCBmb3IgdGhlIFZFUklGWSBwaGFzZSBvZiB0aGUgUlBNIGJ1aWxkIiksCisKKyAgICAgICAgIyBBbGxvdyBhIHBhY2thZ2VyIHRvIGV4cGxpY2l0bHkgZm9yY2UgYW4gYXJjaGl0ZWN0dXJlCisgICAgICAgICgnZm9yY2UtYXJjaD0nLCBOb25lLAorICAgICAgICAgIkZvcmNlIGFuIGFyY2hpdGVjdHVyZSBvbnRvIHRoZSBSUE0gYnVpbGQgcHJvY2VzcyIpLAorCisgICAgICAgICgncXVpZXQnLCAncScsCisgICAgICAgICAiUnVuIHRoZSBJTlNUQUxMIHBoYXNlIG9mIFJQTSBidWlsZGluZyBpbiBxdWlldCBtb2RlIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsna2VlcC10ZW1wJywgJ3VzZS1ycG0tb3B0LWZsYWdzJywgJ3JwbTMtbW9kZScsCisgICAgICAgICAgICAgICAgICAgICAgICduby1hdXRvcmVxJywgJ3F1aWV0J10KKworICAgIG5lZ2F0aXZlX29wdCA9IHsnbm8ta2VlcC10ZW1wJzogJ2tlZXAtdGVtcCcsCisgICAgICAgICAgICAgICAgICAgICduby1ycG0tb3B0LWZsYWdzJzogJ3VzZS1ycG0tb3B0LWZsYWdzJywKKyAgICAgICAgICAgICAgICAgICAgJ3JwbTItbW9kZSc6ICdycG0zLW1vZGUnfQorCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5iZGlzdF9iYXNlID0gTm9uZQorICAgICAgICBzZWxmLnJwbV9iYXNlID0gTm9uZQorICAgICAgICBzZWxmLmRpc3RfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnB5dGhvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5maXhfcHl0aG9uID0gTm9uZQorICAgICAgICBzZWxmLnNwZWNfb25seSA9IE5vbmUKKyAgICAgICAgc2VsZi5iaW5hcnlfb25seSA9IE5vbmUKKyAgICAgICAgc2VsZi5zb3VyY2Vfb25seSA9IE5vbmUKKyAgICAgICAgc2VsZi51c2VfYnppcDIgPSBOb25lCisKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb25fbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5ncm91cCA9IE5vbmUKKyAgICAgICAgc2VsZi5yZWxlYXNlID0gTm9uZQorICAgICAgICBzZWxmLnNlcmlhbCA9IE5vbmUKKyAgICAgICAgc2VsZi52ZW5kb3IgPSBOb25lCisgICAgICAgIHNlbGYucGFja2FnZXIgPSBOb25lCisgICAgICAgIHNlbGYuZG9jX2ZpbGVzID0gTm9uZQorICAgICAgICBzZWxmLmNoYW5nZWxvZyA9IE5vbmUKKyAgICAgICAgc2VsZi5pY29uID0gTm9uZQorCisgICAgICAgIHNlbGYucHJlcF9zY3JpcHQgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfc2NyaXB0ID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0ID0gTm9uZQorICAgICAgICBzZWxmLmNsZWFuX3NjcmlwdCA9IE5vbmUKKyAgICAgICAgc2VsZi52ZXJpZnlfc2NyaXB0ID0gTm9uZQorICAgICAgICBzZWxmLnByZV9pbnN0YWxsID0gTm9uZQorICAgICAgICBzZWxmLnBvc3RfaW5zdGFsbCA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmVfdW5pbnN0YWxsID0gTm9uZQorICAgICAgICBzZWxmLnBvc3RfdW5pbnN0YWxsID0gTm9uZQorICAgICAgICBzZWxmLnByZXAgPSBOb25lCisgICAgICAgIHNlbGYucHJvdmlkZXMgPSBOb25lCisgICAgICAgIHNlbGYucmVxdWlyZXMgPSBOb25lCisgICAgICAgIHNlbGYuY29uZmxpY3RzID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3JlcXVpcmVzID0gTm9uZQorICAgICAgICBzZWxmLm9ic29sZXRlcyA9IE5vbmUKKworICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDAKKyAgICAgICAgc2VsZi51c2VfcnBtX29wdF9mbGFncyA9IDEKKyAgICAgICAgc2VsZi5ycG0zX21vZGUgPSAxCisgICAgICAgIHNlbGYubm9fYXV0b3JlcSA9IDAKKworICAgICAgICBzZWxmLmZvcmNlX2FyY2ggPSBOb25lCisgICAgICAgIHNlbGYucXVpZXQgPSAwCisKKyAgICAjIGluaXRpYWxpemVfb3B0aW9ucygpCisKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywgKCdiZGlzdF9iYXNlJywgJ2JkaXN0X2Jhc2UnKSkKKyAgICAgICAgaWYgc2VsZi5ycG1fYmFzZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgbm90IHNlbGYucnBtM19tb2RlOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInlvdSBtdXN0IHNwZWNpZnkgLS1ycG0tYmFzZSBpbiBSUE0gMiBtb2RlIgorICAgICAgICAgICAgc2VsZi5ycG1fYmFzZSA9IG9zLnBhdGguam9pbihzZWxmLmJkaXN0X2Jhc2UsICJycG0iKQorCisgICAgICAgIGlmIHNlbGYucHl0aG9uIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmZpeF9weXRob246CisgICAgICAgICAgICAgICAgc2VsZi5weXRob24gPSBzeXMuZXhlY3V0YWJsZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnB5dGhvbiA9ICJweXRob24iCisgICAgICAgIGVsaWYgc2VsZi5maXhfcHl0aG9uOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICItLXB5dGhvbiBhbmQgLS1maXgtcHl0aG9uIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgb3B0aW9ucyIKKworICAgICAgICBpZiBvcy5uYW1lICE9ICdwb3NpeCc6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAoImRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBSUE0gIgorICAgICAgICAgICAgICAgICAgICJkaXN0cmlidXRpb25zIG9uIHBsYXRmb3JtICVzIiAlIG9zLm5hbWUpCisgICAgICAgIGlmIHNlbGYuYmluYXJ5X29ubHkgYW5kIHNlbGYuc291cmNlX29ubHk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgImNhbm5vdCBzdXBwbHkgYm90aCAnLS1zb3VyY2Utb25seScgYW5kICctLWJpbmFyeS1vbmx5JyIKKworICAgICAgICAjIGRvbid0IHBhc3MgQ0ZMQUdTIHRvIHB1cmUgcHl0aG9uIGRpc3RyaWJ1dGlvbnMKKyAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgc2VsZi51c2VfcnBtX29wdF9mbGFncyA9IDAKKworICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCisgICAgICAgIHNlbGYuZmluYWxpemVfcGFja2FnZV9kYXRhKCkKKworICAgICMgZmluYWxpemVfb3B0aW9ucygpCisKKyAgICBkZWYgZmluYWxpemVfcGFja2FnZV9kYXRhIChzZWxmKToKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nKCdncm91cCcsICJEZXZlbG9wbWVudC9MaWJyYXJpZXMiKQorICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmcoJ3ZlbmRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgPCVzPiIgJSAoc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbnRhY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfY29udGFjdF9lbWFpbCgpKSkKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nKCdwYWNrYWdlcicpCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZ19saXN0KCdkb2NfZmlsZXMnKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZG9jX2ZpbGVzLCBsaXN0KToKKyAgICAgICAgICAgIGZvciByZWFkbWUgaW4gKCdSRUFETUUnLCAnUkVBRE1FLnR4dCcpOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJlYWRtZSkgYW5kIHJlYWRtZSBub3QgaW4gc2VsZi5kb2NfZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9jX2ZpbGVzLmFwcGVuZChyZWFkbWUpCisKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nKCdyZWxlYXNlJywgIjEiKQorICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmcoJ3NlcmlhbCcpICAgIyBzaG91bGQgaXQgYmUgYW4gaW50PworCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZygnZGlzdHJpYnV0aW9uX25hbWUnKQorCisgICAgICAgIHNlbGYuZW5zdXJlX3N0cmluZygnY2hhbmdlbG9nJykKKyAgICAgICAgICAjIEZvcm1hdCBjaGFuZ2Vsb2cgY29ycmVjdGx5CisgICAgICAgIHNlbGYuY2hhbmdlbG9nID0gc2VsZi5fZm9ybWF0X2NoYW5nZWxvZyhzZWxmLmNoYW5nZWxvZykKKworICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgnaWNvbicpCisKKyAgICAgICAgc2VsZi5lbnN1cmVfZmlsZW5hbWUoJ3ByZXBfc2NyaXB0JykKKyAgICAgICAgc2VsZi5lbnN1cmVfZmlsZW5hbWUoJ2J1aWxkX3NjcmlwdCcpCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbGVuYW1lKCdpbnN0YWxsX3NjcmlwdCcpCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbGVuYW1lKCdjbGVhbl9zY3JpcHQnKQorICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgndmVyaWZ5X3NjcmlwdCcpCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbGVuYW1lKCdwcmVfaW5zdGFsbCcpCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbGVuYW1lKCdwb3N0X2luc3RhbGwnKQorICAgICAgICBzZWxmLmVuc3VyZV9maWxlbmFtZSgncHJlX3VuaW5zdGFsbCcpCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbGVuYW1lKCdwb3N0X3VuaW5zdGFsbCcpCisKKyAgICAgICAgIyBYWFggZG9uJ3QgZm9yZ2V0IHdlIHB1bnRlZCBvbiBzdW1tYXJpZXMgYW5kIGRlc2NyaXB0aW9ucyAtLSB0aGV5CisgICAgICAgICMgc2hvdWxkIGJlIGhhbmRsZWQgaGVyZSBldmVudHVhbGx5IQorCisgICAgICAgICMgTm93ICp0aGlzKiBpcyBzb21lIG1ldGEtZGF0YSB0aGF0IGJlbG9uZ3MgaW4gdGhlIHNldHVwIHNjcmlwdC4uLgorICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmdfbGlzdCgncHJvdmlkZXMnKQorICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmdfbGlzdCgncmVxdWlyZXMnKQorICAgICAgICBzZWxmLmVuc3VyZV9zdHJpbmdfbGlzdCgnY29uZmxpY3RzJykKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ2J1aWxkX3JlcXVpcmVzJykKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ29ic29sZXRlcycpCisKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nKCdmb3JjZV9hcmNoJykKKyAgICAjIGZpbmFsaXplX3BhY2thZ2VfZGF0YSAoKQorCisKKyAgICBkZWYgcnVuIChzZWxmKToKKworICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIHByaW50ICJiZWZvcmUgX2dldF9wYWNrYWdlX2RhdGEoKToiCisgICAgICAgICAgICBwcmludCAidmVuZG9yID0iLCBzZWxmLnZlbmRvcgorICAgICAgICAgICAgcHJpbnQgInBhY2thZ2VyID0iLCBzZWxmLnBhY2thZ2VyCisgICAgICAgICAgICBwcmludCAiZG9jX2ZpbGVzID0iLCBzZWxmLmRvY19maWxlcworICAgICAgICAgICAgcHJpbnQgImNoYW5nZWxvZyA9Iiwgc2VsZi5jaGFuZ2Vsb2cKKworICAgICAgICAjIG1ha2UgZGlyZWN0b3JpZXMKKyAgICAgICAgaWYgc2VsZi5zcGVjX29ubHk6CisgICAgICAgICAgICBzcGVjX2RpciA9IHNlbGYuZGlzdF9kaXIKKyAgICAgICAgICAgIHNlbGYubWtwYXRoKHNwZWNfZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcnBtX2RpciA9IHt9CisgICAgICAgICAgICBmb3IgZCBpbiAoJ1NPVVJDRVMnLCAnU1BFQ1MnLCAnQlVJTEQnLCAnUlBNUycsICdTUlBNUycpOgorICAgICAgICAgICAgICAgIHJwbV9kaXJbZF0gPSBvcy5wYXRoLmpvaW4oc2VsZi5ycG1fYmFzZSwgZCkKKyAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChycG1fZGlyW2RdKQorICAgICAgICAgICAgc3BlY19kaXIgPSBycG1fZGlyWydTUEVDUyddCisKKyAgICAgICAgIyBTcGVjIGZpbGUgZ29lcyBpbnRvICdkaXN0X2RpcicgaWYgJy0tc3BlYy1vbmx5IHNwZWNpZmllZCcsCisgICAgICAgICMgYnVpbGQvcnBtLjxwbGF0PiBvdGhlcndpc2UuCisgICAgICAgIHNwZWNfcGF0aCA9IG9zLnBhdGguam9pbihzcGVjX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcy5zcGVjIiAlIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpCisgICAgICAgIHNlbGYuZXhlY3V0ZSh3cml0ZV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgKHNwZWNfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYWtlX3NwZWNfZmlsZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nICclcyciICUgc3BlY19wYXRoKQorCisgICAgICAgIGlmIHNlbGYuc3BlY19vbmx5OiAjIHN0b3AgaWYgcmVxdWVzdGVkCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIE1ha2UgYSBzb3VyY2UgZGlzdHJpYnV0aW9uIGFuZCBjb3B5IHRvIFNPVVJDRVMgZGlyZWN0b3J5IHdpdGgKKyAgICAgICAgIyBvcHRpb25hbCBpY29uLgorICAgICAgICBzYXZlZF9kaXN0X2ZpbGVzID0gc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlc1s6XQorICAgICAgICBzZGlzdCA9IHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ3NkaXN0JykKKyAgICAgICAgaWYgc2VsZi51c2VfYnppcDI6CisgICAgICAgICAgICBzZGlzdC5mb3JtYXRzID0gWydienRhciddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZGlzdC5mb3JtYXRzID0gWydnenRhciddCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ3NkaXN0JykKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlcyA9IHNhdmVkX2Rpc3RfZmlsZXMKKworICAgICAgICBzb3VyY2UgPSBzZGlzdC5nZXRfYXJjaGl2ZV9maWxlcygpWzBdCisgICAgICAgIHNvdXJjZV9kaXIgPSBycG1fZGlyWydTT1VSQ0VTJ10KKyAgICAgICAgc2VsZi5jb3B5X2ZpbGUoc291cmNlLCBzb3VyY2VfZGlyKQorCisgICAgICAgIGlmIHNlbGYuaWNvbjoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuaWNvbik6CisgICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUoc2VsZi5pY29uLCBzb3VyY2VfZGlyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiaWNvbiBmaWxlICclcycgZG9lcyBub3QgZXhpc3QiICUgc2VsZi5pY29uCisKKworICAgICAgICAjIGJ1aWxkIHBhY2thZ2UKKyAgICAgICAgbG9nLmluZm8oImJ1aWxkaW5nIFJQTXMiKQorICAgICAgICBycG1fY21kID0gWydycG0nXQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygnL3Vzci9iaW4vcnBtYnVpbGQnKSBvciBcCisgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKCcvYmluL3JwbWJ1aWxkJyk6CisgICAgICAgICAgICBycG1fY21kID0gWydycG1idWlsZCddCisKKyAgICAgICAgaWYgc2VsZi5zb3VyY2Vfb25seTogIyB3aGF0IGtpbmQgb2YgUlBNcz8KKyAgICAgICAgICAgIHJwbV9jbWQuYXBwZW5kKCctYnMnKQorICAgICAgICBlbGlmIHNlbGYuYmluYXJ5X29ubHk6CisgICAgICAgICAgICBycG1fY21kLmFwcGVuZCgnLWJiJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJwbV9jbWQuYXBwZW5kKCctYmEnKQorICAgICAgICBpZiBzZWxmLnJwbTNfbW9kZToKKyAgICAgICAgICAgIHJwbV9jbWQuZXh0ZW5kKFsnLS1kZWZpbmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX3RvcGRpciAlcycgJSBvcy5wYXRoLmFic3BhdGgoc2VsZi5ycG1fYmFzZSldKQorICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CisgICAgICAgICAgICBycG1fY21kLmFwcGVuZCgnLS1jbGVhbicpCisKKyAgICAgICAgaWYgc2VsZi5xdWlldDoKKyAgICAgICAgICAgIHJwbV9jbWQuYXBwZW5kKCctLXF1aWV0JykKKworICAgICAgICBycG1fY21kLmFwcGVuZChzcGVjX3BhdGgpCisgICAgICAgICMgRGV0ZXJtaW5lIHRoZSBiaW5hcnkgcnBtIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGJ1aWx0IG91dCBvZiB0aGlzIHNwZWMKKyAgICAgICAgIyBmaWxlCisgICAgICAgICMgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2UgbWF5IG5vdCBiZSByZWFsbHkgYnVpbHQgKGlmIHRoZSBmaWxlCisgICAgICAgICMgbGlzdCBpcyBlbXB0eSkKKyAgICAgICAgbnZyX3N0cmluZyA9ICIle25hbWV9LSV7dmVyc2lvbn0tJXtyZWxlYXNlfSIKKyAgICAgICAgc3JjX3JwbSA9IG52cl9zdHJpbmcgKyAiLnNyYy5ycG0iCisgICAgICAgIG5vbl9zcmNfcnBtID0gIiV7YXJjaH0vIiArIG52cl9zdHJpbmcgKyAiLiV7YXJjaH0ucnBtIgorICAgICAgICBxX2NtZCA9IHIicnBtIC1xIC0tcWYgJyVzICVzXG4nIC0tc3BlY2ZpbGUgJyVzJyIgJSAoCisgICAgICAgICAgICBzcmNfcnBtLCBub25fc3JjX3JwbSwgc3BlY19wYXRoKQorCisgICAgICAgIG91dCA9IG9zLnBvcGVuKHFfY21kKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiaW5hcnlfcnBtcyA9IFtdCisgICAgICAgICAgICBzb3VyY2VfcnBtID0gTm9uZQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gb3V0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsID0gc3RyaW5nLnNwbGl0KHN0cmluZy5zdHJpcChsaW5lKSkKKyAgICAgICAgICAgICAgICBhc3NlcnQobGVuKGwpID09IDIpCisgICAgICAgICAgICAgICAgYmluYXJ5X3JwbXMuYXBwZW5kKGxbMV0pCisgICAgICAgICAgICAgICAgIyBUaGUgc291cmNlIHJwbSBpcyBuYW1lZCBhZnRlciB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIHNwZWMgZmlsZQorICAgICAgICAgICAgICAgIGlmIHNvdXJjZV9ycG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc291cmNlX3JwbSA9IGxbMF0KKworICAgICAgICAgICAgc3RhdHVzID0gb3V0LmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHN0YXR1czoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IoIkZhaWxlZCB0byBleGVjdXRlOiAlcyIgJSByZXByKHFfY21kKSkKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3V0LmNsb3NlKCkKKworICAgICAgICBzZWxmLnNwYXduKHJwbV9jbWQpCisKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgICAgIHB5dmVyc2lvbiA9IGdldF9weXRob25fdmVyc2lvbigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHB5dmVyc2lvbiA9ICdhbnknCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmJpbmFyeV9vbmx5OgorICAgICAgICAgICAgICAgIHNycG0gPSBvcy5wYXRoLmpvaW4ocnBtX2RpclsnU1JQTVMnXSwgc291cmNlX3JwbSkKKyAgICAgICAgICAgICAgICBhc3NlcnQob3MucGF0aC5leGlzdHMoc3JwbSkpCisgICAgICAgICAgICAgICAgc2VsZi5tb3ZlX2ZpbGUoc3JwbSwgc2VsZi5kaXN0X2RpcikKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBzb3VyY2VfcnBtKQorICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAoJ2JkaXN0X3JwbScsIHB5dmVyc2lvbiwgZmlsZW5hbWUpKQorCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5zb3VyY2Vfb25seToKKyAgICAgICAgICAgICAgICBmb3IgcnBtIGluIGJpbmFyeV9ycG1zOgorICAgICAgICAgICAgICAgICAgICBycG0gPSBvcy5wYXRoLmpvaW4ocnBtX2RpclsnUlBNUyddLCBycG0pCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJwbSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmVfZmlsZShycG0sIHNlbGYuZGlzdF9kaXIpCisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShycG0pKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlcy5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdiZGlzdF9ycG0nLCBweXZlcnNpb24sIGZpbGVuYW1lKSkKKyAgICAjIHJ1bigpCisKKyAgICBkZWYgX2Rpc3RfcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpKQorCisgICAgZGVmIF9tYWtlX3NwZWNfZmlsZShzZWxmKToKKyAgICAgICAgIiIiR2VuZXJhdGUgdGhlIHRleHQgb2YgYW4gUlBNIHNwZWMgZmlsZSBhbmQgcmV0dXJuIGl0IGFzIGEKKyAgICAgICAgbGlzdCBvZiBzdHJpbmdzIChvbmUgcGVyIGxpbmUpLgorICAgICAgICAiIiIKKyAgICAgICAgIyBkZWZpbml0aW9ucyBhbmQgaGVhZGVycworICAgICAgICBzcGVjX2ZpbGUgPSBbCisgICAgICAgICAgICAnJWRlZmluZSBuYW1lICcgKyBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpLAorICAgICAgICAgICAgJyVkZWZpbmUgdmVyc2lvbiAnICsgc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKS5yZXBsYWNlKCctJywnXycpLAorICAgICAgICAgICAgJyVkZWZpbmUgdW5tYW5nbGVkX3ZlcnNpb24gJyArIHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCisgICAgICAgICAgICAnJWRlZmluZSByZWxlYXNlICcgKyBzZWxmLnJlbGVhc2UucmVwbGFjZSgnLScsJ18nKSwKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJ1N1bW1hcnk6ICcgKyBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgIF0KKworICAgICAgICAjIHB1dCBsb2NhbGUgc3VtbWFyaWVzIGludG8gc3BlYyBmaWxlCisgICAgICAgICMgWFhYIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdyAoaGFyZCB0byBwdXQgYSBkaWN0aW9uYXJ5CisgICAgICAgICMgaW4gYSBjb25maWcgZmlsZSAtLSBhcmchKQorICAgICAgICAjZm9yIGxvY2FsZSBpbiBzZWxmLnN1bW1hcmllcy5rZXlzKCk6CisgICAgICAgICMgICAgc3BlY19maWxlLmFwcGVuZCgnU3VtbWFyeSglcyk6ICVzJyAlIChsb2NhbGUsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN1bW1hcmllc1tsb2NhbGVdKSkKKworICAgICAgICBzcGVjX2ZpbGUuZXh0ZW5kKFsKKyAgICAgICAgICAgICdOYW1lOiAle25hbWV9JywKKyAgICAgICAgICAgICdWZXJzaW9uOiAle3ZlcnNpb259JywKKyAgICAgICAgICAgICdSZWxlYXNlOiAle3JlbGVhc2V9JyxdKQorCisgICAgICAgICMgWFhYIHl1Y2shIHRoaXMgZmlsZW5hbWUgaXMgYXZhaWxhYmxlIGZyb20gdGhlICJzZGlzdCIgY29tbWFuZCwKKyAgICAgICAgIyBidXQgb25seSBhZnRlciBpdCBoYXMgcnVuOiBhbmQgd2UgY3JlYXRlIHRoZSBzcGVjIGZpbGUgYmVmb3JlCisgICAgICAgICMgcnVubmluZyAic2Rpc3QiLCBpbiBjYXNlIG9mIC0tc3BlYy1vbmx5LgorICAgICAgICBpZiBzZWxmLnVzZV9iemlwMjoKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ1NvdXJjZTA6ICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0udGFyLmJ6MicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdTb3VyY2UwOiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259LnRhci5neicpCisKKyAgICAgICAgc3BlY19maWxlLmV4dGVuZChbCisgICAgICAgICAgICAnTGljZW5zZTogJyArIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9saWNlbnNlKCksCisgICAgICAgICAgICAnR3JvdXA6ICcgKyBzZWxmLmdyb3VwLAorICAgICAgICAgICAgJ0J1aWxkUm9vdDogJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LSV7cmVsZWFzZX0tYnVpbGRyb290JywKKyAgICAgICAgICAgICdQcmVmaXg6ICV7X3ByZWZpeH0nLCBdKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmZvcmNlX2FyY2g6CisgICAgICAgICAgICAjIG5vYXJjaCBpZiBubyBleHRlbnNpb24gbW9kdWxlcworICAgICAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ0J1aWxkQXJjaDogbm9hcmNoJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoICdCdWlsZEFyY2g6ICVzJyAlIHNlbGYuZm9yY2VfYXJjaCApCisKKyAgICAgICAgZm9yIGZpZWxkIGluICgnVmVuZG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAnUGFja2FnZXInLAorICAgICAgICAgICAgICAgICAgICAgICdQcm92aWRlcycsCisgICAgICAgICAgICAgICAgICAgICAgJ1JlcXVpcmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAnQ29uZmxpY3RzJywKKyAgICAgICAgICAgICAgICAgICAgICAnT2Jzb2xldGVzJywKKyAgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBzdHJpbmcubG93ZXIoZmllbGQpKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGxpc3QpOgorICAgICAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJyVzOiAlcycgJSAoZmllbGQsIHN0cmluZy5qb2luKHZhbCkpKQorICAgICAgICAgICAgZWxpZiB2YWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc3BlY19maWxlLmFwcGVuZCgnJXM6ICVzJyAlIChmaWVsZCwgdmFsKSkKKworCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmdldF91cmwoKSAhPSAnVU5LTk9XTic6CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdVcmw6ICcgKyBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdXJsKCkpCisKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb25fbmFtZToKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ0Rpc3RyaWJ1dGlvbjogJyArIHNlbGYuZGlzdHJpYnV0aW9uX25hbWUpCisKKyAgICAgICAgaWYgc2VsZi5idWlsZF9yZXF1aXJlczoKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ0J1aWxkUmVxdWlyZXM6ICcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcuam9pbihzZWxmLmJ1aWxkX3JlcXVpcmVzKSkKKworICAgICAgICBpZiBzZWxmLmljb246CisgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKCdJY29uOiAnICsgb3MucGF0aC5iYXNlbmFtZShzZWxmLmljb24pKQorCisgICAgICAgIGlmIHNlbGYubm9fYXV0b3JlcToKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJ0F1dG9SZXE6IDAnKQorCisgICAgICAgIHNwZWNfZmlsZS5leHRlbmQoWworICAgICAgICAgICAgJycsCisgICAgICAgICAgICAnJWRlc2NyaXB0aW9uJywKKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9sb25nX2Rlc2NyaXB0aW9uKCkKKyAgICAgICAgICAgIF0pCisKKyAgICAgICAgIyBwdXQgbG9jYWxlIGRlc2NyaXB0aW9ucyBpbnRvIHNwZWMgZmlsZQorICAgICAgICAjIFhYWCBhZ2Fpbiwgc3VwcHJlc3NlZCBiZWNhdXNlIGNvbmZpZyBmaWxlIHN5bnRheCBkb2Vzbid0CisgICAgICAgICMgZWFzaWx5IHN1cHBvcnQgdGhpcyA7LSgKKyAgICAgICAgI2ZvciBsb2NhbGUgaW4gc2VsZi5kZXNjcmlwdGlvbnMua2V5cygpOgorICAgICAgICAjICAgIHNwZWNfZmlsZS5leHRlbmQoWworICAgICAgICAjICAgICAgICAnJywKKyAgICAgICAgIyAgICAgICAgJyVkZXNjcmlwdGlvbiAtbCAnICsgbG9jYWxlLAorICAgICAgICAjICAgICAgICBzZWxmLmRlc2NyaXB0aW9uc1tsb2NhbGVdLAorICAgICAgICAjICAgICAgICBdKQorCisgICAgICAgICMgcnBtIHNjcmlwdHMKKyAgICAgICAgIyBmaWd1cmUgb3V0IGRlZmF1bHQgYnVpbGQgc2NyaXB0CisgICAgICAgIGRlZl9zZXR1cF9jYWxsID0gIiVzICVzIiAlIChzZWxmLnB5dGhvbixvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSkKKyAgICAgICAgZGVmX2J1aWxkID0gIiVzIGJ1aWxkIiAlIGRlZl9zZXR1cF9jYWxsCisgICAgICAgIGlmIHNlbGYudXNlX3JwbV9vcHRfZmxhZ3M6CisgICAgICAgICAgICBkZWZfYnVpbGQgPSAnZW52IENGTEFHUz0iJFJQTV9PUFRfRkxBR1MiICcgKyBkZWZfYnVpbGQKKworICAgICAgICAjIGluc2VydCBjb250ZW50cyBvZiBmaWxlcworCisgICAgICAgICMgWFhYIHRoaXMgaXMga2luZCBvZiBtaXNsZWFkaW5nOiB1c2VyLXN1cHBsaWVkIG9wdGlvbnMgYXJlIGZpbGVzCisgICAgICAgICMgdGhhdCB3ZSBvcGVuIGFuZCBpbnRlcnBvbGF0ZSBpbnRvIHRoZSBzcGVjIGZpbGUsIGJ1dCB0aGUgZGVmYXVsdHMKKyAgICAgICAgIyBhcmUganVzdCB0ZXh0IHRoYXQgd2UgZHJvcCBpbiBhcy1pcy4gIEhtbW0uCisKKyAgICAgICAgaW5zdGFsbF9jbWQgPSAoJyVzIGluc3RhbGwgLU8xIC0tcm9vdD0kUlBNX0JVSUxEX1JPT1QgJworICAgICAgICAgICAgICAgICAgICAgICAnLS1yZWNvcmQ9SU5TVEFMTEVEX0ZJTEVTJykgJSBkZWZfc2V0dXBfY2FsbAorCisgICAgICAgIHNjcmlwdF9vcHRpb25zID0gWworICAgICAgICAgICAgKCdwcmVwJywgJ3ByZXBfc2NyaXB0JywgIiVzZXR1cCAtbiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259IiksCisgICAgICAgICAgICAoJ2J1aWxkJywgJ2J1aWxkX3NjcmlwdCcsIGRlZl9idWlsZCksCisgICAgICAgICAgICAoJ2luc3RhbGwnLCAnaW5zdGFsbF9zY3JpcHQnLCBpbnN0YWxsX2NtZCksCisgICAgICAgICAgICAoJ2NsZWFuJywgJ2NsZWFuX3NjcmlwdCcsICJybSAtcmYgJFJQTV9CVUlMRF9ST09UIiksCisgICAgICAgICAgICAoJ3ZlcmlmeXNjcmlwdCcsICd2ZXJpZnlfc2NyaXB0JywgTm9uZSksCisgICAgICAgICAgICAoJ3ByZScsICdwcmVfaW5zdGFsbCcsIE5vbmUpLAorICAgICAgICAgICAgKCdwb3N0JywgJ3Bvc3RfaW5zdGFsbCcsIE5vbmUpLAorICAgICAgICAgICAgKCdwcmV1bicsICdwcmVfdW5pbnN0YWxsJywgTm9uZSksCisgICAgICAgICAgICAoJ3Bvc3R1bicsICdwb3N0X3VuaW5zdGFsbCcsIE5vbmUpLAorICAgICAgICBdCisKKyAgICAgICAgZm9yIChycG1fb3B0LCBhdHRyLCBkZWZhdWx0KSBpbiBzY3JpcHRfb3B0aW9uczoKKyAgICAgICAgICAgICMgSW5zZXJ0IGNvbnRlbnRzIG9mIGZpbGUgcmVmZXJyZWQgdG8sIGlmIG5vIGZpbGUgaXMgcmVmZXJyZWQgdG8KKyAgICAgICAgICAgICMgdXNlICdkZWZhdWx0JyBhcyBjb250ZW50cyBvZiBzY3JpcHQKKyAgICAgICAgICAgIHZhbCA9IGdldGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgICAgIGlmIHZhbCBvciBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHNwZWNfZmlsZS5leHRlbmQoWworICAgICAgICAgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICAgICAgICAgJyUnICsgcnBtX29wdCxdKQorICAgICAgICAgICAgICAgIGlmIHZhbDoKKyAgICAgICAgICAgICAgICAgICAgc3BlY19maWxlLmV4dGVuZChzdHJpbmcuc3BsaXQob3Blbih2YWwsICdyJykucmVhZCgpLCAnXG4nKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzcGVjX2ZpbGUuYXBwZW5kKGRlZmF1bHQpCisKKworICAgICAgICAjIGZpbGVzIHNlY3Rpb24KKyAgICAgICAgc3BlY19maWxlLmV4dGVuZChbCisgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICclZmlsZXMgLWYgSU5TVEFMTEVEX0ZJTEVTJywKKyAgICAgICAgICAgICclZGVmYXR0cigtLHJvb3Qscm9vdCknLAorICAgICAgICAgICAgXSkKKworICAgICAgICBpZiBzZWxmLmRvY19maWxlczoKKyAgICAgICAgICAgIHNwZWNfZmlsZS5hcHBlbmQoJyVkb2MgJyArIHN0cmluZy5qb2luKHNlbGYuZG9jX2ZpbGVzKSkKKworICAgICAgICBpZiBzZWxmLmNoYW5nZWxvZzoKKyAgICAgICAgICAgIHNwZWNfZmlsZS5leHRlbmQoWworICAgICAgICAgICAgICAgICcnLAorICAgICAgICAgICAgICAgICclY2hhbmdlbG9nJyxdKQorICAgICAgICAgICAgc3BlY19maWxlLmV4dGVuZChzZWxmLmNoYW5nZWxvZykKKworICAgICAgICByZXR1cm4gc3BlY19maWxlCisKKyAgICAjIF9tYWtlX3NwZWNfZmlsZSAoKQorCisgICAgZGVmIF9mb3JtYXRfY2hhbmdlbG9nKHNlbGYsIGNoYW5nZWxvZyk6CisgICAgICAgICIiIkZvcm1hdCB0aGUgY2hhbmdlbG9nIGNvcnJlY3RseSBhbmQgY29udmVydCBpdCB0byBhIGxpc3Qgb2Ygc3RyaW5ncworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGNoYW5nZWxvZzoKKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2Vsb2cKKyAgICAgICAgbmV3X2NoYW5nZWxvZyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIHN0cmluZy5zcGxpdChzdHJpbmcuc3RyaXAoY2hhbmdlbG9nKSwgJ1xuJyk6CisgICAgICAgICAgICBsaW5lID0gc3RyaW5nLnN0cmlwKGxpbmUpCisgICAgICAgICAgICBpZiBsaW5lWzBdID09ICcqJzoKKyAgICAgICAgICAgICAgICBuZXdfY2hhbmdlbG9nLmV4dGVuZChbJycsIGxpbmVdKQorICAgICAgICAgICAgZWxpZiBsaW5lWzBdID09ICctJzoKKyAgICAgICAgICAgICAgICBuZXdfY2hhbmdlbG9nLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfY2hhbmdlbG9nLmFwcGVuZCgnICAnICsgbGluZSkKKworICAgICAgICAjIHN0cmlwIHRyYWlsaW5nIG5ld2xpbmUgaW5zZXJ0ZWQgYnkgZmlyc3QgY2hhbmdlbG9nIGVudHJ5CisgICAgICAgIGlmIG5vdCBuZXdfY2hhbmdlbG9nWzBdOgorICAgICAgICAgICAgZGVsIG5ld19jaGFuZ2Vsb2dbMF0KKworICAgICAgICByZXR1cm4gbmV3X2NoYW5nZWxvZworCisgICAgIyBfZm9ybWF0X2NoYW5nZWxvZygpCisKKyMgY2xhc3MgYmRpc3RfcnBtCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJmOTgxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIzNzZjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5MzgzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3Rfd2luaW5zdC5weQpAQCAtMCwwICsxLDM2OCBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2JkaXN0X3dpbmluc3QnIGNvbW1hbmQ6IGNyZWF0ZSBhIHdpbmRvd3MgaW5zdGFsbGVyCitleGUtcHJvZ3JhbS4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworCitmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl92ZXJzaW9uCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCisKK2NsYXNzIGJkaXN0X3dpbmluc3QgKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiY3JlYXRlIGFuIGV4ZWN1dGFibGUgaW5zdGFsbGVyIGZvciBNUyBXaW5kb3dzIgorCisgICAgdXNlcl9vcHRpb25zID0gWygnYmRpc3QtZGlyPScsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAidGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsCisgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm0gbmFtZSB0byBlbWJlZCBpbiBnZW5lcmF0ZWQgZmlsZW5hbWVzICIKKyAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9wbGF0Zm9ybSgpKSwKKyAgICAgICAgICAgICAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCisgICAgICAgICAgICAgICAgICAgICAia2VlcCB0aGUgcHNldWRvLWluc3RhbGxhdGlvbiB0cmVlIGFyb3VuZCBhZnRlciAiICsKKyAgICAgICAgICAgICAgICAgICAgICJjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUiKSwKKyAgICAgICAgICAgICAgICAgICAgKCd0YXJnZXQtdmVyc2lvbj0nLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmUgYSBzcGVjaWZpYyBweXRob24gdmVyc2lvbiIgKworICAgICAgICAgICAgICAgICAgICAgIiBvbiB0aGUgdGFyZ2V0IHN5c3RlbSIpLAorICAgICAgICAgICAgICAgICAgICAoJ25vLXRhcmdldC1jb21waWxlJywgJ2MnLAorICAgICAgICAgICAgICAgICAgICAgImRvIG5vdCBjb21waWxlIC5weSB0byAucHljIG9uIHRoZSB0YXJnZXQgc3lzdGVtIiksCisgICAgICAgICAgICAgICAgICAgICgnbm8tdGFyZ2V0LW9wdGltaXplJywgJ28nLAorICAgICAgICAgICAgICAgICAgICAgImRvIG5vdCBjb21waWxlIC5weSB0byAucHlvIChvcHRpbWl6ZWQpIgorICAgICAgICAgICAgICAgICAgICAgIm9uIHRoZSB0YXJnZXQgc3lzdGVtIiksCisgICAgICAgICAgICAgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAorICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiIpLAorICAgICAgICAgICAgICAgICAgICAoJ2JpdG1hcD0nLCAnYicsCisgICAgICAgICAgICAgICAgICAgICAiYml0bWFwIHRvIHVzZSBmb3IgdGhlIGluc3RhbGxlciBpbnN0ZWFkIG9mIHB5dGhvbi1wb3dlcmVkIGxvZ28iKSwKKyAgICAgICAgICAgICAgICAgICAgKCd0aXRsZT0nLCAndCcsCisgICAgICAgICAgICAgICAgICAgICAidGl0bGUgdG8gZGlzcGxheSBvbiB0aGUgaW5zdGFsbGVyIGJhY2tncm91bmQgaW5zdGVhZCBvZiBkZWZhdWx0IiksCisgICAgICAgICAgICAgICAgICAgICgnc2tpcC1idWlsZCcsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAic2tpcCByZWJ1aWxkaW5nIGV2ZXJ5dGhpbmcgKGZvciB0ZXN0aW5nL2RlYnVnZ2luZykiKSwKKyAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsLXNjcmlwdD0nLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgImJhc2VuYW1lIG9mIGluc3RhbGxhdGlvbiBzY3JpcHQgdG8gYmUgcnVuIGFmdGVyIgorICAgICAgICAgICAgICAgICAgICAgImluc3RhbGxhdGlvbiBvciBiZWZvcmUgZGVpbnN0YWxsYXRpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgKCdwcmUtaW5zdGFsbC1zY3JpcHQ9JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJGdWxseSBxdWFsaWZpZWQgZmlsZW5hbWUgb2YgYSBzY3JpcHQgdG8gYmUgcnVuIGJlZm9yZSAiCisgICAgICAgICAgICAgICAgICAgICAiYW55IGZpbGVzIGFyZSBpbnN0YWxsZWQuICBUaGlzIHNjcmlwdCBuZWVkIG5vdCBiZSBpbiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgImRpc3RyaWJ1dGlvbiIpLAorICAgICAgICAgICAgICAgICAgICAoJ3VzZXItYWNjZXNzLWNvbnRyb2w9JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJzcGVjaWZ5IFZpc3RhJ3MgVUFDIGhhbmRsaW5nIC0gJ25vbmUnL2RlZmF1bHQ9bm8gIgorICAgICAgICAgICAgICAgICAgICAgImhhbmRsaW5nLCAnYXV0byc9dXNlIFVBQyBpZiB0YXJnZXQgUHl0aG9uIGluc3RhbGxlZCBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgImFsbCB1c2VycywgJ2ZvcmNlJz1hbHdheXMgdXNlIFVBQyIpLAorICAgICAgICAgICAgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsna2VlcC10ZW1wJywgJ25vLXRhcmdldC1jb21waWxlJywgJ25vLXRhcmdldC1vcHRpbWl6ZScsCisgICAgICAgICAgICAgICAgICAgICAgICdza2lwLWJ1aWxkJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLmJkaXN0X2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBOb25lCisgICAgICAgIHNlbGYua2VlcF90ZW1wID0gMAorICAgICAgICBzZWxmLm5vX3RhcmdldF9jb21waWxlID0gMAorICAgICAgICBzZWxmLm5vX3RhcmdldF9vcHRpbWl6ZSA9IDAKKyAgICAgICAgc2VsZi50YXJnZXRfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5iaXRtYXAgPSBOb25lCisgICAgICAgIHNlbGYudGl0bGUgPSBOb25lCisgICAgICAgIHNlbGYuc2tpcF9idWlsZCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdCA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmVfaW5zdGFsbF9zY3JpcHQgPSBOb25lCisgICAgICAgIHNlbGYudXNlcl9hY2Nlc3NfY29udHJvbCA9IE5vbmUKKworICAgICMgaW5pdGlhbGl6ZV9vcHRpb25zKCkKKworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLCAoJ3NraXBfYnVpbGQnLCAnc2tpcF9idWlsZCcpKQorCisgICAgICAgIGlmIHNlbGYuYmRpc3RfZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnNraXBfYnVpbGQgYW5kIHNlbGYucGxhdF9uYW1lOgorICAgICAgICAgICAgICAgICMgSWYgYnVpbGQgaXMgc2tpcHBlZCBhbmQgcGxhdF9uYW1lIGlzIG92ZXJyaWRkZW4sIGJkaXN0IHdpbGwKKyAgICAgICAgICAgICAgICAjIG5vdCBzZWUgdGhlIGNvcnJlY3QgJ3BsYXRfbmFtZScgLSBzbyBzZXQgdGhhdCB1cCBtYW51YWxseS4KKyAgICAgICAgICAgICAgICBiZGlzdCA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignYmRpc3QnKQorICAgICAgICAgICAgICAgIGJkaXN0LnBsYXRfbmFtZSA9IHNlbGYucGxhdF9uYW1lCisgICAgICAgICAgICAgICAgIyBuZXh0IHRoZSBjb21tYW5kIHdpbGwgYmUgaW5pdGlhbGl6ZWQgdXNpbmcgdGhhdCBuYW1lCisgICAgICAgICAgICBiZGlzdF9iYXNlID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2JkaXN0JykuYmRpc3RfYmFzZQorICAgICAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBvcy5wYXRoLmpvaW4oYmRpc3RfYmFzZSwgJ3dpbmluc3QnKQorCisgICAgICAgIGlmIG5vdCBzZWxmLnRhcmdldF92ZXJzaW9uOgorICAgICAgICAgICAgc2VsZi50YXJnZXRfdmVyc2lvbiA9ICIiCisKKyAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZCBhbmQgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CisgICAgICAgICAgICBzaG9ydF92ZXJzaW9uID0gZ2V0X3B5dGhvbl92ZXJzaW9uKCkKKyAgICAgICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb24gYW5kIHNlbGYudGFyZ2V0X3ZlcnNpb24gIT0gc2hvcnRfdmVyc2lvbjoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJ0YXJnZXQgdmVyc2lvbiBjYW4gb25seSBiZSAlcywgb3IgdGhlICctLXNraXAtYnVpbGQnIiBcCisgICAgICAgICAgICAgICAgICAgICAgIiBvcHRpb24gbXVzdCBiZSBzcGVjaWZpZWQiICUgKHNob3J0X3ZlcnNpb24sKQorICAgICAgICAgICAgc2VsZi50YXJnZXRfdmVyc2lvbiA9IHNob3J0X3ZlcnNpb24KKworICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncGxhdF9uYW1lJywgJ3BsYXRfbmFtZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLmluc3RhbGxfc2NyaXB0OgorICAgICAgICAgICAgZm9yIHNjcmlwdCBpbiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9zY3JpcHQgPT0gb3MucGF0aC5iYXNlbmFtZShzY3JpcHQpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsX3NjcmlwdCAnJXMnIG5vdCBmb3VuZCBpbiBzY3JpcHRzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0CisgICAgIyBmaW5hbGl6ZV9vcHRpb25zKCkKKworCisgICAgZGVmIHJ1biAoc2VsZik6CisgICAgICAgIGlmIChzeXMucGxhdGZvcm0gIT0gIndpbjMyIiBhbmQKKyAgICAgICAgICAgIChzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKSBvcgorICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpKSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yIFwKKyAgICAgICAgICAgICAgICAgICgiZGlzdHJpYnV0aW9uIGNvbnRhaW5zIGV4dGVuc2lvbnMgYW5kL29yIEMgbGlicmFyaWVzOyAiCisgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgY29tcGlsZWQgb24gYSBXaW5kb3dzIDMyIHBsYXRmb3JtIikKKworICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGQnKQorCisgICAgICAgIGluc3RhbGwgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdpbnN0YWxsJywgcmVpbml0X3N1YmNvbW1hbmRzPTEpCisgICAgICAgIGluc3RhbGwucm9vdCA9IHNlbGYuYmRpc3RfZGlyCisgICAgICAgIGluc3RhbGwuc2tpcF9idWlsZCA9IHNlbGYuc2tpcF9idWlsZAorICAgICAgICBpbnN0YWxsLndhcm5fZGlyID0gMAorICAgICAgICBpbnN0YWxsLnBsYXRfbmFtZSA9IHNlbGYucGxhdF9uYW1lCisKKyAgICAgICAgaW5zdGFsbF9saWIgPSBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdpbnN0YWxsX2xpYicpCisgICAgICAgICMgd2UgZG8gbm90IHdhbnQgdG8gaW5jbHVkZSBweWMgb3IgcHlvIGZpbGVzCisgICAgICAgIGluc3RhbGxfbGliLmNvbXBpbGUgPSAwCisgICAgICAgIGluc3RhbGxfbGliLm9wdGltaXplID0gMAorCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgIyBJZiB3ZSBhcmUgYnVpbGRpbmcgYW4gaW5zdGFsbGVyIGZvciBhIFB5dGhvbiB2ZXJzaW9uIG90aGVyCisgICAgICAgICAgICAjIHRoYW4gdGhlIG9uZSB3ZSBhcmUgY3VycmVudGx5IHJ1bm5pbmcsIHRoZW4gd2UgbmVlZCB0byBlbnN1cmUKKyAgICAgICAgICAgICMgb3VyIGJ1aWxkX2xpYiByZWZsZWN0cyB0aGUgb3RoZXIgUHl0aG9uIHZlcnNpb24gcmF0aGVyIHRoYW4gb3Vycy4KKyAgICAgICAgICAgICMgTm90ZSB0aGF0IGZvciB0YXJnZXRfdmVyc2lvbiE9c3lzLnZlcnNpb24sIHdlIG11c3QgaGF2ZSBza2lwcGVkIHRoZQorICAgICAgICAgICAgIyBidWlsZCBzdGVwLCBzbyB0aGVyZSBpcyBubyBpc3N1ZSB3aXRoIGVuZm9yY2luZyB0aGUgYnVpbGQgb2YgdGhpcworICAgICAgICAgICAgIyB2ZXJzaW9uLgorICAgICAgICAgICAgdGFyZ2V0X3ZlcnNpb24gPSBzZWxmLnRhcmdldF92ZXJzaW9uCisgICAgICAgICAgICBpZiBub3QgdGFyZ2V0X3ZlcnNpb246CisgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc2tpcF9idWlsZCwgIlNob3VsZCBoYXZlIGFscmVhZHkgY2hlY2tlZCB0aGlzIgorICAgICAgICAgICAgICAgIHRhcmdldF92ZXJzaW9uID0gc3lzLnZlcnNpb25bMDozXQorICAgICAgICAgICAgcGxhdF9zcGVjaWZpZXIgPSAiLiVzLSVzIiAlIChzZWxmLnBsYXRfbmFtZSwgdGFyZ2V0X3ZlcnNpb24pCisgICAgICAgICAgICBidWlsZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCisgICAgICAgICAgICBidWlsZC5idWlsZF9saWIgPSBvcy5wYXRoLmpvaW4oYnVpbGQuYnVpbGRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGliJyArIHBsYXRfc3BlY2lmaWVyKQorCisgICAgICAgICMgVXNlIGEgY3VzdG9tIHNjaGVtZSBmb3IgdGhlIHppcC1maWxlLCBiZWNhdXNlIHdlIGhhdmUgdG8gZGVjaWRlCisgICAgICAgICMgYXQgaW5zdGFsbGF0aW9uIHRpbWUgd2hpY2ggc2NoZW1lIHRvIHVzZS4KKyAgICAgICAgZm9yIGtleSBpbiAoJ3B1cmVsaWInLCAncGxhdGxpYicsICdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScpOgorICAgICAgICAgICAgdmFsdWUgPSBzdHJpbmcudXBwZXIoa2V5KQorICAgICAgICAgICAgaWYga2V5ID09ICdoZWFkZXJzJzoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJy9JbmNsdWRlLyRkaXN0X25hbWUnCisgICAgICAgICAgICBzZXRhdHRyKGluc3RhbGwsCisgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsXycgKyBrZXksCisgICAgICAgICAgICAgICAgICAgIHZhbHVlKQorCisgICAgICAgIGxvZy5pbmZvKCJpbnN0YWxsaW5nIHRvICVzIiwgc2VsZi5iZGlzdF9kaXIpCisgICAgICAgIGluc3RhbGwuZW5zdXJlX2ZpbmFsaXplZCgpCisKKyAgICAgICAgIyBhdm9pZCB3YXJuaW5nIG9mICdpbnN0YWxsX2xpYicgYWJvdXQgaW5zdGFsbGluZworICAgICAgICAjIGludG8gYSBkaXJlY3Rvcnkgbm90IGluIHN5cy5wYXRoCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsICdQVVJFTElCJykpCisKKyAgICAgICAgaW5zdGFsbC5ydW4oKQorCisgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgICAgICMgQW5kIG1ha2UgYW4gYXJjaGl2ZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUKKyAgICAgICAgIyBwc2V1ZG8taW5zdGFsbGF0aW9uIHRyZWUuCisgICAgICAgIGZyb20gdGVtcGZpbGUgaW1wb3J0IG1rdGVtcAorICAgICAgICBhcmNoaXZlX2Jhc2VuYW1lID0gbWt0ZW1wKCkKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQorICAgICAgICBhcmNuYW1lID0gc2VsZi5tYWtlX2FyY2hpdmUoYXJjaGl2ZV9iYXNlbmFtZSwgInppcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290X2Rpcj1zZWxmLmJkaXN0X2RpcikKKyAgICAgICAgIyBjcmVhdGUgYW4gZXhlIGNvbnRhaW5pbmcgdGhlIHppcC1maWxlCisgICAgICAgIHNlbGYuY3JlYXRlX2V4ZShhcmNuYW1lLCBmdWxsbmFtZSwgc2VsZi5iaXRtYXApCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgcHl2ZXJzaW9uID0gZ2V0X3B5dGhvbl92ZXJzaW9uKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHB5dmVyc2lvbiA9ICdhbnknCisgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXMuYXBwZW5kKCgnYmRpc3Rfd2luaW5zdCcsIHB5dmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X2luc3RhbGxlcl9maWxlbmFtZShmdWxsbmFtZSkpKQorICAgICAgICAjIHJlbW92ZSB0aGUgemlwLWZpbGUgYWdhaW4KKyAgICAgICAgbG9nLmRlYnVnKCJyZW1vdmluZyB0ZW1wb3JhcnkgZmlsZSAnJXMnIiwgYXJjbmFtZSkKKyAgICAgICAgb3MucmVtb3ZlKGFyY25hbWUpCisKKyAgICAgICAgaWYgbm90IHNlbGYua2VlcF90ZW1wOgorICAgICAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5iZGlzdF9kaXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorCisgICAgIyBydW4oKQorCisgICAgZGVmIGdldF9pbmlkYXRhIChzZWxmKToKKyAgICAgICAgIyBSZXR1cm4gZGF0YSBkZXNjcmliaW5nIHRoZSBpbnN0YWxsYXRpb24uCisKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBtZXRhZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCisKKyAgICAgICAgIyBXcml0ZSB0aGUgW21ldGFkYXRhXSBzZWN0aW9uLgorICAgICAgICBsaW5lcy5hcHBlbmQoIlttZXRhZGF0YV0iKQorCisgICAgICAgICMgJ2luZm8nIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBpbnN0YWxsZXIncyBkaWFsb2cgYm94LAorICAgICAgICAjIGRlc2NyaWJpbmcgdGhlIGl0ZW1zIHRvIGJlIGluc3RhbGxlZC4KKyAgICAgICAgaW5mbyA9IChtZXRhZGF0YS5sb25nX2Rlc2NyaXB0aW9uIG9yICcnKSArICdcbicKKworICAgICAgICAjIEVzY2FwZSBuZXdsaW5lIGNoYXJhY3RlcnMKKyAgICAgICAgZGVmIGVzY2FwZShzKToKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShzLCAiXG4iLCAiXFxuIikKKworICAgICAgICBmb3IgbmFtZSBpbiBbImF1dGhvciIsICJhdXRob3JfZW1haWwiLCAiZGVzY3JpcHRpb24iLCAibWFpbnRhaW5lciIsCisgICAgICAgICAgICAgICAgICAgICAibWFpbnRhaW5lcl9lbWFpbCIsICJuYW1lIiwgInVybCIsICJ2ZXJzaW9uIl06CisgICAgICAgICAgICBkYXRhID0gZ2V0YXR0cihtZXRhZGF0YSwgbmFtZSwgIiIpCisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgIGluZm8gPSBpbmZvICsgKCJcbiAgICAlczogJXMiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcuY2FwaXRhbGl6ZShuYW1lKSwgZXNjYXBlKGRhdGEpKSkKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiVzPSVzIiAlIChuYW1lLCBlc2NhcGUoZGF0YSkpKQorCisgICAgICAgICMgVGhlIFtzZXR1cF0gc2VjdGlvbiBjb250YWlucyBlbnRyaWVzIGNvbnRyb2xsaW5nCisgICAgICAgICMgdGhlIGluc3RhbGxlciBydW50aW1lLgorICAgICAgICBsaW5lcy5hcHBlbmQoIlxuW1NldHVwXSIpCisgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9zY3JpcHQ6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoImluc3RhbGxfc2NyaXB0PSVzIiAlIHNlbGYuaW5zdGFsbF9zY3JpcHQpCisgICAgICAgIGxpbmVzLmFwcGVuZCgiaW5mbz0lcyIgJSBlc2NhcGUoaW5mbykpCisgICAgICAgIGxpbmVzLmFwcGVuZCgidGFyZ2V0X2NvbXBpbGU9JWQiICUgKG5vdCBzZWxmLm5vX3RhcmdldF9jb21waWxlKSkKKyAgICAgICAgbGluZXMuYXBwZW5kKCJ0YXJnZXRfb3B0aW1pemU9JWQiICUgKG5vdCBzZWxmLm5vX3RhcmdldF9vcHRpbWl6ZSkpCisgICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb246CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoInRhcmdldF92ZXJzaW9uPSVzIiAlIHNlbGYudGFyZ2V0X3ZlcnNpb24pCisgICAgICAgIGlmIHNlbGYudXNlcl9hY2Nlc3NfY29udHJvbDoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgidXNlcl9hY2Nlc3NfY29udHJvbD0lcyIgJSBzZWxmLnVzZXJfYWNjZXNzX2NvbnRyb2wpCisKKyAgICAgICAgdGl0bGUgPSBzZWxmLnRpdGxlIG9yIHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpCisgICAgICAgIGxpbmVzLmFwcGVuZCgidGl0bGU9JXMiICUgZXNjYXBlKHRpdGxlKSkKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgaW1wb3J0IGRpc3R1dGlscworICAgICAgICBidWlsZF9pbmZvID0gIkJ1aWx0ICVzIHdpdGggZGlzdHV0aWxzLSVzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICh0aW1lLmN0aW1lKHRpbWUudGltZSgpKSwgZGlzdHV0aWxzLl9fdmVyc2lvbl9fKQorICAgICAgICBsaW5lcy5hcHBlbmQoImJ1aWxkX2luZm89JXMiICUgYnVpbGRfaW5mbykKKyAgICAgICAgcmV0dXJuIHN0cmluZy5qb2luKGxpbmVzLCAiXG4iKQorCisgICAgIyBnZXRfaW5pZGF0YSgpCisKKyAgICBkZWYgY3JlYXRlX2V4ZSAoc2VsZiwgYXJjbmFtZSwgZnVsbG5hbWUsIGJpdG1hcD1Ob25lKToKKyAgICAgICAgaW1wb3J0IHN0cnVjdAorCisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuZGlzdF9kaXIpCisKKyAgICAgICAgY2ZnZGF0YSA9IHNlbGYuZ2V0X2luaWRhdGEoKQorCisgICAgICAgIGluc3RhbGxlcl9uYW1lID0gc2VsZi5nZXRfaW5zdGFsbGVyX2ZpbGVuYW1lKGZ1bGxuYW1lKQorICAgICAgICBzZWxmLmFubm91bmNlKCJjcmVhdGluZyAlcyIgJSBpbnN0YWxsZXJfbmFtZSkKKworICAgICAgICBpZiBiaXRtYXA6CisgICAgICAgICAgICBiaXRtYXBkYXRhID0gb3BlbihiaXRtYXAsICJyYiIpLnJlYWQoKQorICAgICAgICAgICAgYml0bWFwbGVuID0gbGVuKGJpdG1hcGRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiaXRtYXBsZW4gPSAwCisKKyAgICAgICAgZmlsZSA9IG9wZW4oaW5zdGFsbGVyX25hbWUsICJ3YiIpCisgICAgICAgIGZpbGUud3JpdGUoc2VsZi5nZXRfZXhlX2J5dGVzKCkpCisgICAgICAgIGlmIGJpdG1hcDoKKyAgICAgICAgICAgIGZpbGUud3JpdGUoYml0bWFwZGF0YSkKKworICAgICAgICAjIENvbnZlcnQgY2ZnZGF0YSBmcm9tIHVuaWNvZGUgdG8gYXNjaWksIG1iY3MgZW5jb2RlZAorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNmZ2RhdGEsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGNmZ2RhdGEgPSBjZmdkYXRhLmVuY29kZSgibWJjcyIpCisKKyAgICAgICAgIyBBcHBlbmQgdGhlIHByZS1pbnN0YWxsIHNjcmlwdAorICAgICAgICBjZmdkYXRhID0gY2ZnZGF0YSArICJcMCIKKyAgICAgICAgaWYgc2VsZi5wcmVfaW5zdGFsbF9zY3JpcHQ6CisgICAgICAgICAgICBzY3JpcHRfZGF0YSA9IG9wZW4oc2VsZi5wcmVfaW5zdGFsbF9zY3JpcHQsICJyIikucmVhZCgpCisgICAgICAgICAgICBjZmdkYXRhID0gY2ZnZGF0YSArIHNjcmlwdF9kYXRhICsgIlxuXDAiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGVtcHR5IHByZS1pbnN0YWxsIHNjcmlwdAorICAgICAgICAgICAgY2ZnZGF0YSA9IGNmZ2RhdGEgKyAiXDAiCisgICAgICAgIGZpbGUud3JpdGUoY2ZnZGF0YSkKKworICAgICAgICAjIFRoZSAnbWFnaWMgbnVtYmVyJyAweDEyMzQ1NjdCIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhlCisgICAgICAgICMgYmluYXJ5IGxheW91dCBvZiAnY2ZnZGF0YScgaXMgd2hhdCB0aGUgd2luaW5zdC5leGUgYmluYXJ5CisgICAgICAgICMgZXhwZWN0cy4gIElmIHRoZSBsYXlvdXQgY2hhbmdlcywgaW5jcmVtZW50IHRoYXQgbnVtYmVyLCBtYWtlCisgICAgICAgICMgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0byB0aGUgd2luaW5zdC5leGUgc291cmNlcywgYW5kCisgICAgICAgICMgcmVjb21waWxlIHRoZW0uCisgICAgICAgIGhlYWRlciA9IHN0cnVjdC5wYWNrKCI8aWlpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0NTY3QiwgICAgICAgIyB0YWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGNmZ2RhdGEpLCAgICAgIyBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0bWFwbGVuLCAgICAgICAgIyBudW1iZXIgb2YgYnl0ZXMgaW4gYml0bWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgZmlsZS53cml0ZShoZWFkZXIpCisgICAgICAgIGZpbGUud3JpdGUob3BlbihhcmNuYW1lLCAicmIiKS5yZWFkKCkpCisKKyAgICAjIGNyZWF0ZV9leGUoKQorCisgICAgZGVmIGdldF9pbnN0YWxsZXJfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICAjIEZhY3RvcmVkIG91dCB0byBhbGxvdyBvdmVycmlkaW5nIGluIHN1YmNsYXNzZXMKKyAgICAgICAgaWYgc2VsZi50YXJnZXRfdmVyc2lvbjoKKyAgICAgICAgICAgICMgaWYgd2UgY3JlYXRlIGFuIGluc3RhbGxlciBmb3IgYSBzcGVjaWZpYyBweXRob24gdmVyc2lvbiwKKyAgICAgICAgICAgICMgaXQncyBiZXR0ZXIgdG8gaW5jbHVkZSB0aGlzIGluIHRoZSBuYW1lCisgICAgICAgICAgICBpbnN0YWxsZXJfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLiVzLXB5JXMuZXhlIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZ1bGxuYW1lLCBzZWxmLnBsYXRfbmFtZSwgc2VsZi50YXJnZXRfdmVyc2lvbikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbnN0YWxsZXJfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzLiVzLmV4ZSIgJSAoZnVsbG5hbWUsIHNlbGYucGxhdF9uYW1lKSkKKyAgICAgICAgcmV0dXJuIGluc3RhbGxlcl9uYW1lCisgICAgIyBnZXRfaW5zdGFsbGVyX2ZpbGVuYW1lKCkKKworICAgIGRlZiBnZXRfZXhlX2J5dGVzIChzZWxmKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMubXN2Y2NvbXBpbGVyIGltcG9ydCBnZXRfYnVpbGRfdmVyc2lvbgorICAgICAgICAjIElmIGEgdGFyZ2V0LXZlcnNpb24gb3RoZXIgdGhhbiB0aGUgY3VycmVudCB2ZXJzaW9uIGhhcyBiZWVuCisgICAgICAgICMgc3BlY2lmaWVkLCB0aGVuIHVzaW5nIHRoZSBNU1ZDIHZlcnNpb24gZnJvbSAqdGhpcyogYnVpbGQgaXMgbm8gZ29vZC4KKyAgICAgICAgIyBXaXRob3V0IGFjdHVhbGx5IGZpbmRpbmcgYW5kIGV4ZWN1dGluZyB0aGUgdGFyZ2V0IHZlcnNpb24gYW5kIHBhcnNpbmcKKyAgICAgICAgIyBpdHMgc3lzLnZlcnNpb24sIHdlIGp1c3QgaGFyZC1jb2RlIG91ciBrbm93bGVkZ2Ugb2Ygb2xkIHZlcnNpb25zLgorICAgICAgICAjIE5PVEU6IFBvc3NpYmxlIGFsdGVybmF0aXZlIGlzIHRvIGFsbG93ICItLXRhcmdldC12ZXJzaW9uIiB0bworICAgICAgICAjIHNwZWNpZnkgYSBQeXRob24gZXhlY3V0YWJsZSByYXRoZXIgdGhhbiBhIHNpbXBsZSB2ZXJzaW9uIHN0cmluZy4KKyAgICAgICAgIyBXZSBjYW4gdGhlbiBleGVjdXRlIHRoaXMgcHJvZ3JhbSB0byBvYnRhaW4gYW55IGluZm8gd2UgbmVlZCwgc3VjaAorICAgICAgICAjIGFzIHRoZSByZWFsIHN5cy52ZXJzaW9uIHN0cmluZyBmb3IgdGhlIGJ1aWxkLgorICAgICAgICBjdXJfdmVyc2lvbiA9IGdldF9weXRob25fdmVyc2lvbigpCisgICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb24gYW5kIHNlbGYudGFyZ2V0X3ZlcnNpb24gIT0gY3VyX3ZlcnNpb246CisgICAgICAgICAgICAjIElmIHRoZSB0YXJnZXQgdmVyc2lvbiBpcyAqbGF0ZXIqIHRoYW4gdXMsIHRoZW4gd2UgYXNzdW1lIHRoZXkKKyAgICAgICAgICAgICMgdXNlIHdoYXQgd2UgdXNlCisgICAgICAgICAgICAjIHN0cmluZyBjb21wYXJlcyBzZWVtIHdyb25nLCBidXQgYXJlIHdoYXQgc3lzY29uZmlnLnB5IGl0c2VsZiB1c2VzCisgICAgICAgICAgICBpZiBzZWxmLnRhcmdldF92ZXJzaW9uID4gY3VyX3ZlcnNpb246CisgICAgICAgICAgICAgICAgYnYgPSBnZXRfYnVpbGRfdmVyc2lvbigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudGFyZ2V0X3ZlcnNpb24gPCAiMi40IjoKKyAgICAgICAgICAgICAgICAgICAgYnYgPSA2LjAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBidiA9IDcuMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBmb3IgY3VycmVudCB2ZXJzaW9uIC0gdXNlIGF1dGhvcml0YXRpdmUgY2hlY2suCisgICAgICAgICAgICBidiA9IGdldF9idWlsZF92ZXJzaW9uKCkKKworICAgICAgICAjIHdpbmluc3QteC55LmV4ZSBpcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhpcyBmaWxlCisgICAgICAgIGRpcmVjdG9yeSA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKyAgICAgICAgIyB3ZSBtdXN0IHVzZSBhIHdpbmluc3QteC55LmV4ZSBidWlsdCB3aXRoIHRoZSBzYW1lIEMgY29tcGlsZXIKKyAgICAgICAgIyB1c2VkIGZvciBweXRob24uICBYWFggV2hhdCBhYm91dCBtaW5ndywgYm9ybGFuZCwgYW5kIHNvIG9uPworCisgICAgICAgICMgaWYgcGxhdF9uYW1lIHN0YXJ0cyB3aXRoICJ3aW4iIGJ1dCBpcyBub3QgIndpbjMyIgorICAgICAgICAjIHdlIHdhbnQgdG8gc3RyaXAgIndpbiIgYW5kIGxlYXZlIHRoZSByZXN0IChlLmcuIC1hbWQ2NCkKKyAgICAgICAgIyBmb3IgYWxsIG90aGVyIGNhc2VzLCB3ZSBkb24ndCB3YW50IGFueSBzdWZmaXgKKyAgICAgICAgaWYgc2VsZi5wbGF0X25hbWUgIT0gJ3dpbjMyJyBhbmQgc2VsZi5wbGF0X25hbWVbOjNdID09ICd3aW4nOgorICAgICAgICAgICAgc2ZpeCA9IHNlbGYucGxhdF9uYW1lWzM6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2ZpeCA9ICcnCisKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCAid2luaW5zdC0lLjFmJXMuZXhlIiAlIChidiwgc2ZpeCkpCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAicmIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorIyBjbGFzcyBiZGlzdF93aW5pbnN0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTVkY2IxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3dpbmluc3QucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQ1NDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF93aW5pbnN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODRiZjM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weQpAQCAtMCwwICsxLDE0NyBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGQKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdidWlsZCcgY29tbWFuZC4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMsIG9zCisKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdldF9wbGF0Zm9ybQorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgorCitkZWYgc2hvd19jb21waWxlcnMoKToKKyAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IHNob3dfY29tcGlsZXJzCisgICAgc2hvd19jb21waWxlcnMoKQorCitjbGFzcyBidWlsZChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImJ1aWxkIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGluc3RhbGwiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnYnVpbGQtYmFzZT0nLCAnYicsCisgICAgICAgICAiYmFzZSBkaXJlY3RvcnkgZm9yIGJ1aWxkIGxpYnJhcnkiKSwKKyAgICAgICAgKCdidWlsZC1wdXJlbGliPScsIE5vbmUsCisgICAgICAgICAiYnVpbGQgZGlyZWN0b3J5IGZvciBwbGF0Zm9ybS1uZXV0cmFsIGRpc3RyaWJ1dGlvbnMiKSwKKyAgICAgICAgKCdidWlsZC1wbGF0bGliPScsIE5vbmUsCisgICAgICAgICAiYnVpbGQgZGlyZWN0b3J5IGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIiksCisgICAgICAgICgnYnVpbGQtbGliPScsIE5vbmUsCisgICAgICAgICAiYnVpbGQgZGlyZWN0b3J5IGZvciBhbGwgZGlzdHJpYnV0aW9uIChkZWZhdWx0cyB0byBlaXRoZXIgIiArCisgICAgICAgICAiYnVpbGQtcHVyZWxpYiBvciBidWlsZC1wbGF0bGliIiksCisgICAgICAgICgnYnVpbGQtc2NyaXB0cz0nLCBOb25lLAorICAgICAgICAgImJ1aWxkIGRpcmVjdG9yeSBmb3Igc2NyaXB0cyIpLAorICAgICAgICAoJ2J1aWxkLXRlbXA9JywgJ3QnLAorICAgICAgICAgInRlbXBvcmFyeSBidWlsZCBkaXJlY3RvcnkiKSwKKyAgICAgICAgKCdwbGF0LW5hbWU9JywgJ3AnLAorICAgICAgICAgInBsYXRmb3JtIG5hbWUgdG8gYnVpbGQgZm9yLCBpZiBzdXBwb3J0ZWQgIgorICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X3BsYXRmb3JtKCkpLAorICAgICAgICAoJ2NvbXBpbGVyPScsICdjJywKKyAgICAgICAgICJzcGVjaWZ5IHRoZSBjb21waWxlciB0eXBlIiksCisgICAgICAgICgnZGVidWcnLCAnZycsCisgICAgICAgICAiY29tcGlsZSBleHRlbnNpb25zIGFuZCBsaWJyYXJpZXMgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSwKKyAgICAgICAgKCdmb3JjZScsICdmJywKKyAgICAgICAgICJmb3JjaWJseSBidWlsZCBldmVyeXRoaW5nIChpZ25vcmUgZmlsZSB0aW1lc3RhbXBzKSIpLAorICAgICAgICAoJ2V4ZWN1dGFibGU9JywgJ2UnLAorICAgICAgICAgInNwZWNpZnkgZmluYWwgZGVzdGluYXRpb24gaW50ZXJwcmV0ZXIgcGF0aCAoYnVpbGQucHkpIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnZGVidWcnLCAnZm9yY2UnXQorCisgICAgaGVscF9vcHRpb25zID0gWworICAgICAgICAoJ2hlbHAtY29tcGlsZXInLCBOb25lLAorICAgICAgICAgImxpc3QgYXZhaWxhYmxlIGNvbXBpbGVycyIsIHNob3dfY29tcGlsZXJzKSwKKyAgICAgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZF9iYXNlID0gJ2J1aWxkJworICAgICAgICAjIHRoZXNlIGFyZSBkZWNpZGVkIG9ubHkgYWZ0ZXIgJ2J1aWxkX2Jhc2UnIGhhcyBpdHMgZmluYWwgdmFsdWUKKyAgICAgICAgIyAodW5sZXNzIG92ZXJyaWRkZW4gYnkgdGhlIHVzZXIgb3IgY2xpZW50KQorICAgICAgICBzZWxmLmJ1aWxkX3B1cmVsaWIgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfcGxhdGxpYiA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9saWIgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfdGVtcCA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9zY3JpcHRzID0gTm9uZQorICAgICAgICBzZWxmLmNvbXBpbGVyID0gTm9uZQorICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWJ1ZyA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JjZSA9IDAKKyAgICAgICAgc2VsZi5leGVjdXRhYmxlID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGxhdF9uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IGdldF9wbGF0Zm9ybSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHBsYXQtbmFtZSBvbmx5IHN1cHBvcnRlZCBmb3Igd2luZG93cyAob3RoZXIgcGxhdGZvcm1zIGFyZQorICAgICAgICAgICAgIyBzdXBwb3J0ZWQgdmlhIC4vY29uZmlndXJlIGZsYWdzLCBpZiBhdCBhbGwpLiAgQXZvaWQgbWlzbGVhZGluZworICAgICAgICAgICAgIyBvdGhlciBwbGF0Zm9ybXMuCisgICAgICAgICAgICBpZiBvcy5uYW1lICE9ICdudCc6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tcGxhdC1uYW1lIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3MgKHRyeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nICcuL2NvbmZpZ3VyZSAtLWhlbHAnIG9uIHlvdXIgcGxhdGZvcm0pIikKKworICAgICAgICBwbGF0X3NwZWNpZmllciA9ICIuJXMtJXMiICUgKHNlbGYucGxhdF9uYW1lLCBzeXMudmVyc2lvblswOjNdKQorCisgICAgICAgICMgTWFrZSBpdCBzbyBQeXRob24gMi54IGFuZCBQeXRob24gMi54IHdpdGggLS13aXRoLXB5ZGVidWcgZG9uJ3QKKyAgICAgICAgIyBzaGFyZSB0aGUgc2FtZSBidWlsZCBkaXJlY3Rvcmllcy4gRG9pbmcgc28gY29uZnVzZXMgdGhlIGJ1aWxkCisgICAgICAgICMgcHJvY2VzcyBmb3IgQyBtb2R1bGVzCisgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgorICAgICAgICAgICAgcGxhdF9zcGVjaWZpZXIgKz0gJy1weWRlYnVnJworCisgICAgICAgICMgJ2J1aWxkX3B1cmVsaWInIGFuZCAnYnVpbGRfcGxhdGxpYicganVzdCBkZWZhdWx0IHRvICdsaWInIGFuZAorICAgICAgICAjICdsaWIuPHBsYXQ+JyB1bmRlciB0aGUgYmFzZSBidWlsZCBkaXJlY3RvcnkuICBXZSBvbmx5IHVzZSBvbmUgb2YKKyAgICAgICAgIyB0aGVtIGZvciBhIGdpdmVuIGRpc3RyaWJ1dGlvbiwgdGhvdWdoIC0tCisgICAgICAgIGlmIHNlbGYuYnVpbGRfcHVyZWxpYiBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5idWlsZF9wdXJlbGliID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfYmFzZSwgJ2xpYicpCisgICAgICAgIGlmIHNlbGYuYnVpbGRfcGxhdGxpYiBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5idWlsZF9wbGF0bGliID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGliJyArIHBsYXRfc3BlY2lmaWVyKQorCisgICAgICAgICMgJ2J1aWxkX2xpYicgaXMgdGhlIGFjdHVhbCBkaXJlY3RvcnkgdGhhdCB3ZSB3aWxsIHVzZSBmb3IgdGhpcworICAgICAgICAjIHBhcnRpY3VsYXIgbW9kdWxlIGRpc3RyaWJ1dGlvbiAtLSBpZiB1c2VyIGRpZG4ndCBzdXBwbHkgaXQsIHBpY2sKKyAgICAgICAgIyBvbmUgb2YgJ2J1aWxkX3B1cmVsaWInIG9yICdidWlsZF9wbGF0bGliJy4KKyAgICAgICAgaWYgc2VsZi5idWlsZF9saWIgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmV4dF9tb2R1bGVzOgorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfbGliID0gc2VsZi5idWlsZF9wbGF0bGliCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfbGliID0gc2VsZi5idWlsZF9wdXJlbGliCisKKyAgICAgICAgIyAnYnVpbGRfdGVtcCcgLS0gdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3IgY29tcGlsZXIgdHVyZHMsCisgICAgICAgICMgImJ1aWxkL3RlbXAuPHBsYXQ+IgorICAgICAgICBpZiBzZWxmLmJ1aWxkX3RlbXAgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfdGVtcCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RlbXAnICsgcGxhdF9zcGVjaWZpZXIpCisgICAgICAgIGlmIHNlbGYuYnVpbGRfc2NyaXB0cyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5idWlsZF9zY3JpcHRzID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cy0nICsgc3lzLnZlcnNpb25bMDozXSkKKworICAgICAgICBpZiBzZWxmLmV4ZWN1dGFibGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0YWJsZSA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjIFJ1biBhbGwgcmVsZXZhbnQgc3ViLWNvbW1hbmRzLiAgVGhpcyB3aWxsIGJlIHNvbWUgc3Vic2V0IG9mOgorICAgICAgICAjICAtIGJ1aWxkX3B5ICAgICAgLSBwdXJlIFB5dGhvbiBtb2R1bGVzCisgICAgICAgICMgIC0gYnVpbGRfY2xpYiAgICAtIHN0YW5kYWxvbmUgQyBsaWJyYXJpZXMKKyAgICAgICAgIyAgLSBidWlsZF9leHQgICAgIC0gUHl0aG9uIGV4dGVuc2lvbnMKKyAgICAgICAgIyAgLSBidWlsZF9zY3JpcHRzIC0gKFB5dGhvbikgc2NyaXB0cworICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CisgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQorCisgICAgIyAtLSBQcmVkaWNhdGVzIGZvciB0aGUgc3ViLWNvbW1hbmQgbGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBoYXNfcHVyZV9tb2R1bGVzIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKQorCisgICAgZGVmIGhhc19jX2xpYnJhcmllcyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY19saWJyYXJpZXMoKQorCisgICAgZGVmIGhhc19leHRfbW9kdWxlcyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKQorCisgICAgZGVmIGhhc19zY3JpcHRzIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19zY3JpcHRzKCkKKworICAgIHN1Yl9jb21tYW5kcyA9IFsoJ2J1aWxkX3B5JywgICAgICBoYXNfcHVyZV9tb2R1bGVzKSwKKyAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9jbGliJywgICAgaGFzX2NfbGlicmFyaWVzKSwKKyAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9leHQnLCAgICAgaGFzX2V4dF9tb2R1bGVzKSwKKyAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9zY3JpcHRzJywgaGFzX3NjcmlwdHMpLAorICAgICAgICAgICAgICAgICAgIF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhMTNkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhMTNkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfY2xpYi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfY2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDU1ODdlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5CkBAIC0wLDAgKzEsMjA5IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGliCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYnVpbGRfY2xpYicgY29tbWFuZCwgdG8gYnVpbGQgYSBDL0MrKyBsaWJyYXJ5Cit0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBtb2R1bGUgZGlzdHJpYnV0aW9uIGFuZCBuZWVkZWQgYnkgYW4gZXh0ZW5zaW9uCittb2R1bGUuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCisKKyMgWFhYIHRoaXMgbW9kdWxlIGhhcyAqbG90cyogb2YgY29kZSByaXBwZWQtb2ZmIHF1aXRlIHRyYW5zcGFyZW50bHkgZnJvbQorIyBidWlsZF9leHQucHkgLS0gbm90IHN1cnByaXNpbmdseSByZWFsbHksIGFzIHRoZSB3b3JrIHJlcXVpcmVkIHRvIGJ1aWxkCisjIGEgc3RhdGljIGxpYnJhcnkgZnJvbSBhIGNvbGxlY3Rpb24gb2YgQyBzb3VyY2UgZmlsZXMgaXMgbm90IHJlYWxseSBhbGwKKyMgdGhhdCBkaWZmZXJlbnQgZnJvbSB3aGF0J3MgcmVxdWlyZWQgdG8gYnVpbGQgYSBzaGFyZWQgb2JqZWN0IGZpbGUgZnJvbQorIyBhIGNvbGxlY3Rpb24gb2YgQyBzb3VyY2UgZmlsZXMuICBOZXZlcnRoZWxlc3MsIEkgaGF2ZW4ndCBkb25lIHRoZQorIyBuZWNlc3NhcnkgcmVmYWN0b3JpbmcgdG8gYWNjb3VudCBmb3IgdGhlIG92ZXJsYXAgaW4gY29kZSBiZXR3ZWVuIHRoZQorIyB0d28gbW9kdWxlcywgbWFpbmx5IGJlY2F1c2UgYSBudW1iZXIgb2Ygc3VidGxlIGRldGFpbHMgY2hhbmdlZCBpbiB0aGUKKyMgY3V0ICduIHBhc3RlLiAgU2lnaC4KKworaW1wb3J0IG9zCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2RlZiBzaG93X2NvbXBpbGVycygpOgorICAgIGZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgc2hvd19jb21waWxlcnMKKyAgICBzaG93X2NvbXBpbGVycygpCisKKworY2xhc3MgYnVpbGRfY2xpYihDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImJ1aWxkIEMvQysrIGxpYnJhcmllcyB1c2VkIGJ5IFB5dGhvbiBleHRlbnNpb25zIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2J1aWxkLWNsaWI9JywgJ2InLAorICAgICAgICAgImRpcmVjdG9yeSB0byBidWlsZCBDL0MrKyBsaWJyYXJpZXMgdG8iKSwKKyAgICAgICAgKCdidWlsZC10ZW1wPScsICd0JywKKyAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IHRlbXBvcmFyeSBidWlsZCBieS1wcm9kdWN0cyIpLAorICAgICAgICAoJ2RlYnVnJywgJ2cnLAorICAgICAgICAgImNvbXBpbGUgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24iKSwKKyAgICAgICAgKCdmb3JjZScsICdmJywKKyAgICAgICAgICJmb3JjaWJseSBidWlsZCBldmVyeXRoaW5nIChpZ25vcmUgZmlsZSB0aW1lc3RhbXBzKSIpLAorICAgICAgICAoJ2NvbXBpbGVyPScsICdjJywKKyAgICAgICAgICJzcGVjaWZ5IHRoZSBjb21waWxlciB0eXBlIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnZGVidWcnLCAnZm9yY2UnXQorCisgICAgaGVscF9vcHRpb25zID0gWworICAgICAgICAoJ2hlbHAtY29tcGlsZXInLCBOb25lLAorICAgICAgICAgImxpc3QgYXZhaWxhYmxlIGNvbXBpbGVycyIsIHNob3dfY29tcGlsZXJzKSwKKyAgICAgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZF9jbGliID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3RlbXAgPSBOb25lCisKKyAgICAgICAgIyBMaXN0IG9mIGxpYnJhcmllcyB0byBidWlsZAorICAgICAgICBzZWxmLmxpYnJhcmllcyA9IE5vbmUKKworICAgICAgICAjIENvbXBpbGF0aW9uIG9wdGlvbnMgZm9yIGFsbCBsaWJyYXJpZXMKKyAgICAgICAgc2VsZi5pbmNsdWRlX2RpcnMgPSBOb25lCisgICAgICAgIHNlbGYuZGVmaW5lID0gTm9uZQorICAgICAgICBzZWxmLnVuZGVmID0gTm9uZQorICAgICAgICBzZWxmLmRlYnVnID0gTm9uZQorICAgICAgICBzZWxmLmZvcmNlID0gMAorICAgICAgICBzZWxmLmNvbXBpbGVyID0gTm9uZQorCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIyBUaGlzIG1pZ2h0IGJlIGNvbmZ1c2luZzogYm90aCBidWlsZC1jbGliIGFuZCBidWlsZC10ZW1wIGRlZmF1bHQKKyAgICAgICAgIyB0byBidWlsZC10ZW1wIGFzIGRlZmluZWQgYnkgdGhlICJidWlsZCIgY29tbWFuZC4gIFRoaXMgaXMgYmVjYXVzZQorICAgICAgICAjIEkgdGhpbmsgdGhhdCBDIGxpYnJhcmllcyBhcmUgcmVhbGx5IGp1c3QgdGVtcG9yYXJ5IGJ1aWxkCisgICAgICAgICMgYnktcHJvZHVjdHMsIGF0IGxlYXN0IGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YgYnVpbGRpbmcgUHl0aG9uCisgICAgICAgICMgZXh0ZW5zaW9ucyAtLSBidXQgSSB3YW50IHRvIGtlZXAgbXkgb3B0aW9ucyBvcGVuLgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYnVpbGQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX3RlbXAnLCAnYnVpbGRfY2xpYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX3RlbXAnLCAnYnVpbGRfdGVtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NvbXBpbGVyJywgJ2NvbXBpbGVyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZGVidWcnLCAnZGVidWcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdmb3JjZScsICdmb3JjZScpKQorCisgICAgICAgIHNlbGYubGlicmFyaWVzID0gc2VsZi5kaXN0cmlidXRpb24ubGlicmFyaWVzCisgICAgICAgIGlmIHNlbGYubGlicmFyaWVzOgorICAgICAgICAgICAgc2VsZi5jaGVja19saWJyYXJ5X2xpc3Qoc2VsZi5saWJyYXJpZXMpCisKKyAgICAgICAgaWYgc2VsZi5pbmNsdWRlX2RpcnMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gc2VsZi5kaXN0cmlidXRpb24uaW5jbHVkZV9kaXJzIG9yIFtdCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbmNsdWRlX2RpcnMsIHN0cik6CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IHNlbGYuaW5jbHVkZV9kaXJzLnNwbGl0KG9zLnBhdGhzZXApCisKKyAgICAgICAgIyBYWFggc2FtZSBhcyBmb3IgYnVpbGRfZXh0IC0tIHdoYXQgYWJvdXQgJ3NlbGYuZGVmaW5lJyBhbmQKKyAgICAgICAgIyAnc2VsZi51bmRlZicgPworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYubGlicmFyaWVzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBZZWNoIC0tIHRoaXMgaXMgY3V0ICduIHBhc3RlZCBmcm9tIGJ1aWxkX2V4dC5weSEKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKKyAgICAgICAgc2VsZi5jb21waWxlciA9IG5ld19jb21waWxlcihjb21waWxlcj1zZWxmLmNvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPXNlbGYuZm9yY2UpCisgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihzZWxmLmNvbXBpbGVyKQorCisgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5zZXRfaW5jbHVkZV9kaXJzKHNlbGYuaW5jbHVkZV9kaXJzKQorICAgICAgICBpZiBzZWxmLmRlZmluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgJ2RlZmluZScgb3B0aW9uIGlzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgdHVwbGVzCisgICAgICAgICAgICBmb3IgKG5hbWUsdmFsdWUpIGluIHNlbGYuZGVmaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuZGVmaW5lX21hY3JvKG5hbWUsIHZhbHVlKQorICAgICAgICBpZiBzZWxmLnVuZGVmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIG1hY3JvIGluIHNlbGYudW5kZWY6CisgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlci51bmRlZmluZV9tYWNybyhtYWNybykKKworICAgICAgICBzZWxmLmJ1aWxkX2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKKworCisgICAgZGVmIGNoZWNrX2xpYnJhcnlfbGlzdChzZWxmLCBsaWJyYXJpZXMpOgorICAgICAgICAiIiJFbnN1cmUgdGhhdCB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgaXMgdmFsaWQuCisKKyAgICAgICAgYGxpYnJhcnlgIGlzIHByZXN1bWFibHkgcHJvdmlkZWQgYXMgYSBjb21tYW5kIG9wdGlvbiAnbGlicmFyaWVzJy4KKyAgICAgICAgVGhpcyBtZXRob2QgY2hlY2tzIHRoYXQgaXQgaXMgYSBsaXN0IG9mIDItdHVwbGVzLCB3aGVyZSB0aGUgdHVwbGVzCisgICAgICAgIGFyZSAobGlicmFyeV9uYW1lLCBidWlsZF9pbmZvX2RpY3QpLgorCisgICAgICAgIFJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IgaWYgdGhlIHN0cnVjdHVyZSBpcyBpbnZhbGlkIGFueXdoZXJlOworICAgICAgICBqdXN0IHJldHVybnMgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobGlicmFyaWVzLCBsaXN0KToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICInbGlicmFyaWVzJyBvcHRpb24gbXVzdCBiZSBhIGxpc3Qgb2YgdHVwbGVzIgorCisgICAgICAgIGZvciBsaWIgaW4gbGlicmFyaWVzOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobGliLCB0dXBsZSkgYW5kIGxlbihsaWIpICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJlYWNoIGVsZW1lbnQgb2YgJ2xpYnJhcmllcycgbXVzdCBhIDItdHVwbGUiCisKKyAgICAgICAgICAgIG5hbWUsIGJ1aWxkX2luZm8gPSBsaWIKKworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobmFtZSwgc3RyKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBpbiAnbGlicmFyaWVzJyAiICsgXAorICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgc3RyaW5nICh0aGUgbGlicmFyeSBuYW1lKSIKKyAgICAgICAgICAgIGlmICcvJyBpbiBuYW1lIG9yIChvcy5zZXAgIT0gJy8nIGFuZCBvcy5zZXAgaW4gbmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiYmFkIGxpYnJhcnkgbmFtZSAnJXMnOiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgIm1heSBub3QgY29udGFpbiBkaXJlY3Rvcnkgc2VwYXJhdG9ycyIpICUgXAorICAgICAgICAgICAgICAgICAgICAgIGxpYlswXQorCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShidWlsZF9pbmZvLCBkaWN0KToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInNlY29uZCBlbGVtZW50IG9mIGVhY2ggdHVwbGUgaW4gJ2xpYnJhcmllcycgIiArIFwKKyAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhIGRpY3Rpb25hcnkgKGJ1aWxkIGluZm8pIgorCisgICAgZGVmIGdldF9saWJyYXJ5X25hbWVzKHNlbGYpOgorICAgICAgICAjIEFzc3VtZSB0aGUgbGlicmFyeSBsaXN0IGlzIHZhbGlkIC0tICdjaGVja19saWJyYXJ5X2xpc3QoKScgaXMKKyAgICAgICAgIyBjYWxsZWQgZnJvbSAnZmluYWxpemVfb3B0aW9ucygpJywgc28gaXQgc2hvdWxkIGJlIQorICAgICAgICBpZiBub3Qgc2VsZi5saWJyYXJpZXM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGxpYl9uYW1lcyA9IFtdCisgICAgICAgIGZvciAobGliX25hbWUsIGJ1aWxkX2luZm8pIGluIHNlbGYubGlicmFyaWVzOgorICAgICAgICAgICAgbGliX25hbWVzLmFwcGVuZChsaWJfbmFtZSkKKyAgICAgICAgcmV0dXJuIGxpYl9uYW1lcworCisKKyAgICBkZWYgZ2V0X3NvdXJjZV9maWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19saWJyYXJ5X2xpc3Qoc2VsZi5saWJyYXJpZXMpCisgICAgICAgIGZpbGVuYW1lcyA9IFtdCisgICAgICAgIGZvciAobGliX25hbWUsIGJ1aWxkX2luZm8pIGluIHNlbGYubGlicmFyaWVzOgorICAgICAgICAgICAgc291cmNlcyA9IGJ1aWxkX2luZm8uZ2V0KCdzb3VyY2VzJykKKyAgICAgICAgICAgIGlmIHNvdXJjZXMgaXMgTm9uZSBvciBub3QgaXNpbnN0YW5jZShzb3VyY2VzLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbiAnbGlicmFyaWVzJyBvcHRpb24gKGxpYnJhcnkgJyVzJyksICIKKyAgICAgICAgICAgICAgICAgICAgICAgIidzb3VyY2VzJyBtdXN0IGJlIHByZXNlbnQgYW5kIG11c3QgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAiYSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMiKSAlIGxpYl9uYW1lCisKKyAgICAgICAgICAgIGZpbGVuYW1lcy5leHRlbmQoc291cmNlcykKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lcworCisgICAgZGVmIGJ1aWxkX2xpYnJhcmllcyhzZWxmLCBsaWJyYXJpZXMpOgorICAgICAgICBmb3IgKGxpYl9uYW1lLCBidWlsZF9pbmZvKSBpbiBsaWJyYXJpZXM6CisgICAgICAgICAgICBzb3VyY2VzID0gYnVpbGRfaW5mby5nZXQoJ3NvdXJjZXMnKQorICAgICAgICAgICAgaWYgc291cmNlcyBpcyBOb25lIG9yIG5vdCBpc2luc3RhbmNlKHNvdXJjZXMsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImluICdsaWJyYXJpZXMnIG9wdGlvbiAobGlicmFyeSAnJXMnKSwgIiArCisgICAgICAgICAgICAgICAgICAgICAgICInc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlICIgKworICAgICAgICAgICAgICAgICAgICAgICAiYSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMiKSAlIGxpYl9uYW1lCisgICAgICAgICAgICBzb3VyY2VzID0gbGlzdChzb3VyY2VzKQorCisgICAgICAgICAgICBsb2cuaW5mbygiYnVpbGRpbmcgJyVzJyBsaWJyYXJ5IiwgbGliX25hbWUpCisKKyAgICAgICAgICAgICMgRmlyc3QsIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlIHRvIG9iamVjdCBmaWxlcyBpbiB0aGUgbGlicmFyeQorICAgICAgICAgICAgIyBkaXJlY3RvcnkuICAoVGhpcyBzaG91bGQgcHJvYmFibHkgY2hhbmdlIHRvIHB1dHRpbmcgb2JqZWN0CisgICAgICAgICAgICAjIGZpbGVzIGluIGEgdGVtcG9yYXJ5IGJ1aWxkIGRpcmVjdG9yeS4pCisgICAgICAgICAgICBtYWNyb3MgPSBidWlsZF9pbmZvLmdldCgnbWFjcm9zJykKKyAgICAgICAgICAgIGluY2x1ZGVfZGlycyA9IGJ1aWxkX2luZm8uZ2V0KCdpbmNsdWRlX2RpcnMnKQorICAgICAgICAgICAgb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIuY29tcGlsZShzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9zPW1hY3JvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPWluY2x1ZGVfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9c2VsZi5kZWJ1ZykKKworICAgICAgICAgICAgIyBOb3cgImxpbmsiIHRoZSBvYmplY3QgZmlsZXMgdG9nZXRoZXIgaW50byBhIHN0YXRpYyBsaWJyYXJ5LgorICAgICAgICAgICAgIyAoT24gVW5peCBhdCBsZWFzdCwgdGhpcyBpc24ndCByZWFsbHkgbGlua2luZyAtLSBpdCBqdXN0CisgICAgICAgICAgICAjIGJ1aWxkcyBhbiBhcmNoaXZlLiAgV2hhdGV2ZXIuKQorICAgICAgICAgICAgc2VsZi5jb21waWxlci5jcmVhdGVfc3RhdGljX2xpYihvYmplY3RzLCBsaWJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1zZWxmLmJ1aWxkX2NsaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjAxMzdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2NsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjAxMzdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9jbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzIxOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQpAQCAtMCwwICsxLDc5OSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0CisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnYnVpbGRfZXh0JyBjb21tYW5kLCBmb3IgYnVpbGRpbmcgZXh0ZW5zaW9uCittb2R1bGVzIChjdXJyZW50bHkgbGltaXRlZCB0byBDIGV4dGVuc2lvbnMsIHNob3VsZCBhY2NvbW1vZGF0ZSBDKysKK2V4dGVuc2lvbnMgQVNBUCkuIiIiCisKKyMgVGhpcyBtb2R1bGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjEuCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzLCBvcywgc3RyaW5nLCByZQorZnJvbSB0eXBlcyBpbXBvcnQgKgorZnJvbSBzaXRlIGltcG9ydCBVU0VSX0JBU0UsIFVTRVJfU0lURQorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlciwgZ2V0X3B5dGhvbl92ZXJzaW9uCitmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXJfZ3JvdXAKK2Zyb20gZGlzdHV0aWxzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworIyBHQ0MobWluZ3cpOiBvcy5uYW1lIGlzICJudCIgYnV0IGJ1aWxkIHN5c3RlbSBpcyBwb3NpeAoraWYgb3MubmFtZSA9PSAnbnQnIGFuZCBzeXMudmVyc2lvbi5maW5kKCdHQ0MnKSA8IDA6CisgICAgZnJvbSBkaXN0dXRpbHMubXN2Y2NvbXBpbGVyIGltcG9ydCBnZXRfYnVpbGRfdmVyc2lvbgorICAgIE1TVkNfVkVSU0lPTiA9IGludChnZXRfYnVpbGRfdmVyc2lvbigpKQorCisjIEFuIGV4dGVuc2lvbiBuYW1lIGlzIGp1c3QgYSBkb3Qtc2VwYXJhdGVkIGxpc3Qgb2YgUHl0aG9uIE5BTUVzIChpZS4KKyMgdGhlIHNhbWUgYXMgYSBmdWxseS1xdWFsaWZpZWQgbW9kdWxlIG5hbWUpLgorZXh0ZW5zaW9uX25hbWVfcmUgPSByZS5jb21waWxlIFwKKyAgICAocideW2EtekEtWl9dW2EtekEtWl8wLTldKihcLlthLXpBLVpfXVthLXpBLVpfMC05XSopKiQnKQorCisKK2RlZiBzaG93X2NvbXBpbGVycyAoKToKKyAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IHNob3dfY29tcGlsZXJzCisgICAgc2hvd19jb21waWxlcnMoKQorCisKK2NsYXNzIGJ1aWxkX2V4dCAoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJidWlsZCBDL0MrKyBleHRlbnNpb25zIChjb21waWxlL2xpbmsgdG8gYnVpbGQgZGlyZWN0b3J5KSIKKworICAgICMgWFhYIHRob3VnaHRzIG9uIGhvdyB0byBkZWFsIHdpdGggY29tcGxleCBjb21tYW5kLWxpbmUgb3B0aW9ucyBsaWtlCisgICAgIyB0aGVzZSwgaS5lLiBob3cgdG8gbWFrZSBpdCBzbyBmYW5jeV9nZXRvcHQgY2FuIHN1Y2sgdGhlbSBvZmYgdGhlCisgICAgIyBjb21tYW5kIGxpbmUgYW5kIG1ha2UgaXQgbG9vayBsaWtlIHNldHVwLnB5IGRlZmluZWQgdGhlIGFwcHJvcHJpYXRlCisgICAgIyBsaXN0cyBvZiB0dXBsZXMgb2Ygd2hhdC1oYXZlLXlvdS4KKyAgICAjICAgLSBlYWNoIGNvbW1hbmQgbmVlZHMgYSBjYWxsYmFjayB0byBwcm9jZXNzIGl0cyBjb21tYW5kLWxpbmUgb3B0aW9ucworICAgICMgICAtIENvbW1hbmQuX19pbml0X18oKSBuZWVkcyBhY2Nlc3MgdG8gaXRzIHNoYXJlIG9mIHRoZSB3aG9sZQorICAgICMgICAgIGNvbW1hbmQgbGluZSAobXVzdCB1bHRpbWF0ZWx5IGNvbWUgZnJvbQorICAgICMgICAgIERpc3RyaWJ1dGlvbi5wYXJzZV9jb21tYW5kX2xpbmUoKSkKKyAgICAjICAgLSBpdCB0aGVuIGNhbGxzIHRoZSBjdXJyZW50IGNvbW1hbmQgY2xhc3MnIG9wdGlvbi1wYXJzaW5nCisgICAgIyAgICAgY2FsbGJhY2sgdG8gZGVhbCB3aXRoIHdlaXJkIG9wdGlvbnMgbGlrZSAtRCwgd2hpY2ggaGF2ZSB0bworICAgICMgICAgIHBhcnNlIHRoZSBvcHRpb24gdGV4dCBhbmQgY2h1cm4gb3V0IHNvbWUgY3VzdG9tIGRhdGEKKyAgICAjICAgICBzdHJ1Y3R1cmUKKyAgICAjICAgLSB0aGF0IGRhdGEgc3RydWN0dXJlIChpbiB0aGlzIGNhc2UsIGEgbGlzdCBvZiAyLXR1cGxlcykKKyAgICAjICAgICB3aWxsIHRoZW4gYmUgcHJlc2VudCBpbiB0aGUgY29tbWFuZCBvYmplY3QgYnkgdGhlIHRpbWUKKyAgICAjICAgICB3ZSBnZXQgdG8gZmluYWxpemVfb3B0aW9ucygpIChpLmUuIHRoZSBjb25zdHJ1Y3RvcgorICAgICMgICAgIHRha2VzIGNhcmUgb2YgYm90aCBjb21tYW5kLWxpbmUgYW5kIGNsaWVudCBvcHRpb25zCisgICAgIyAgICAgaW4gYmV0d2VlbiBpbml0aWFsaXplX29wdGlvbnMoKSBhbmQgZmluYWxpemVfb3B0aW9ucygpKQorCisgICAgc2VwX2J5ID0gIiAoc2VwYXJhdGVkIGJ5ICclcycpIiAlIG9zLnBhdGhzZXAKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnYnVpbGQtbGliPScsICdiJywKKyAgICAgICAgICJkaXJlY3RvcnkgZm9yIGNvbXBpbGVkIGV4dGVuc2lvbiBtb2R1bGVzIiksCisgICAgICAgICgnYnVpbGQtdGVtcD0nLCAndCcsCisgICAgICAgICAiZGlyZWN0b3J5IGZvciB0ZW1wb3JhcnkgZmlsZXMgKGJ1aWxkIGJ5LXByb2R1Y3RzKSIpLAorICAgICAgICAoJ3BsYXQtbmFtZT0nLCAncCcsCisgICAgICAgICAicGxhdGZvcm0gbmFtZSB0byBjcm9zcy1jb21waWxlIGZvciwgaWYgc3VwcG9ydGVkICIKKyAgICAgICAgICIoZGVmYXVsdDogJXMpIiAlIGdldF9wbGF0Zm9ybSgpKSwKKyAgICAgICAgKCdpbnBsYWNlJywgJ2knLAorICAgICAgICAgImlnbm9yZSBidWlsZC1saWIgYW5kIHB1dCBjb21waWxlZCBleHRlbnNpb25zIGludG8gdGhlIHNvdXJjZSAiICsKKyAgICAgICAgICJkaXJlY3RvcnkgYWxvbmdzaWRlIHlvdXIgcHVyZSBQeXRob24gbW9kdWxlcyIpLAorICAgICAgICAoJ2luY2x1ZGUtZGlycz0nLCAnSScsCisgICAgICAgICAibGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGhlYWRlciBmaWxlcyIgKyBzZXBfYnkpLAorICAgICAgICAoJ2RlZmluZT0nLCAnRCcsCisgICAgICAgICAiQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHRvIGRlZmluZSIpLAorICAgICAgICAoJ3VuZGVmPScsICdVJywKKyAgICAgICAgICJDIHByZXByb2Nlc3NvciBtYWNyb3MgdG8gdW5kZWZpbmUiKSwKKyAgICAgICAgKCdsaWJyYXJpZXM9JywgJ2wnLAorICAgICAgICAgImV4dGVybmFsIEMgbGlicmFyaWVzIHRvIGxpbmsgd2l0aCIpLAorICAgICAgICAoJ2xpYnJhcnktZGlycz0nLCAnTCcsCisgICAgICAgICAiZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBleHRlcm5hbCBDIGxpYnJhcmllcyIgKyBzZXBfYnkpLAorICAgICAgICAoJ3JwYXRoPScsICdSJywKKyAgICAgICAgICJkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIHNoYXJlZCBDIGxpYnJhcmllcyBhdCBydW50aW1lIiksCisgICAgICAgICgnbGluay1vYmplY3RzPScsICdPJywKKyAgICAgICAgICJleHRyYSBleHBsaWNpdCBsaW5rIG9iamVjdHMgdG8gaW5jbHVkZSBpbiB0aGUgbGluayIpLAorICAgICAgICAoJ2RlYnVnJywgJ2cnLAorICAgICAgICAgImNvbXBpbGUvbGluayB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiIpLAorICAgICAgICAoJ2ZvcmNlJywgJ2YnLAorICAgICAgICAgImZvcmNpYmx5IGJ1aWxkIGV2ZXJ5dGhpbmcgKGlnbm9yZSBmaWxlIHRpbWVzdGFtcHMpIiksCisgICAgICAgICgnY29tcGlsZXI9JywgJ2MnLAorICAgICAgICAgInNwZWNpZnkgdGhlIGNvbXBpbGVyIHR5cGUiKSwKKyAgICAgICAgKCdzd2lnLWNwcCcsIE5vbmUsCisgICAgICAgICAibWFrZSBTV0lHIGNyZWF0ZSBDKysgZmlsZXMgKGRlZmF1bHQgaXMgQykiKSwKKyAgICAgICAgKCdzd2lnLW9wdHM9JywgTm9uZSwKKyAgICAgICAgICJsaXN0IG9mIFNXSUcgY29tbWFuZCBsaW5lIG9wdGlvbnMiKSwKKyAgICAgICAgKCdzd2lnPScsIE5vbmUsCisgICAgICAgICAicGF0aCB0byB0aGUgU1dJRyBleGVjdXRhYmxlIiksCisgICAgICAgICgndXNlcicsIE5vbmUsCisgICAgICAgICAiYWRkIHVzZXIgaW5jbHVkZSwgbGlicmFyeSBhbmQgcnBhdGgiKSwKKyAgICAgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydpbnBsYWNlJywgJ2RlYnVnJywgJ2ZvcmNlJywgJ3N3aWctY3BwJywgJ3VzZXInXQorCisgICAgaGVscF9vcHRpb25zID0gWworICAgICAgICAoJ2hlbHAtY29tcGlsZXInLCBOb25lLAorICAgICAgICAgImxpc3QgYXZhaWxhYmxlIGNvbXBpbGVycyIsIHNob3dfY29tcGlsZXJzKSwKKyAgICAgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9saWIgPSBOb25lCisgICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX3RlbXAgPSBOb25lCisgICAgICAgIHNlbGYuaW5wbGFjZSA9IDAKKyAgICAgICAgc2VsZi5wYWNrYWdlID0gTm9uZQorCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gTm9uZQorICAgICAgICBzZWxmLmRlZmluZSA9IE5vbmUKKyAgICAgICAgc2VsZi51bmRlZiA9IE5vbmUKKyAgICAgICAgc2VsZi5saWJyYXJpZXMgPSBOb25lCisgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gTm9uZQorICAgICAgICBzZWxmLnJwYXRoID0gTm9uZQorICAgICAgICBzZWxmLmxpbmtfb2JqZWN0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5kZWJ1ZyA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JjZSA9IE5vbmUKKyAgICAgICAgc2VsZi5jb21waWxlciA9IE5vbmUKKyAgICAgICAgc2VsZi5zd2lnID0gTm9uZQorICAgICAgICBzZWxmLnN3aWdfY3BwID0gTm9uZQorICAgICAgICBzZWxmLnN3aWdfb3B0cyA9IE5vbmUKKyAgICAgICAgc2VsZi51c2VyID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKworICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYnVpbGQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX2xpYicsICdidWlsZF9saWInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF90ZW1wJywgJ2J1aWxkX3RlbXAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjb21waWxlcicsICdjb21waWxlcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2RlYnVnJywgJ2RlYnVnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZm9yY2UnLCAnZm9yY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdwbGF0X25hbWUnLCAncGxhdF9uYW1lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLnBhY2thZ2UgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZSA9IHNlbGYuZGlzdHJpYnV0aW9uLmV4dF9wYWNrYWdlCisKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5kaXN0cmlidXRpb24uZXh0X21vZHVsZXMKKworICAgICAgICAjIE1ha2Ugc3VyZSBQeXRob24ncyBpbmNsdWRlIGRpcmVjdG9yaWVzIChmb3IgUHl0aG9uLmgsIHB5Y29uZmlnLmgsCisgICAgICAgICMgZXRjLikgYXJlIGluIHRoZSBpbmNsdWRlIHNlYXJjaCBwYXRoLgorICAgICAgICBweV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKCkKKyAgICAgICAgcGxhdF9weV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9MSkKKyAgICAgICAgaWYgc2VsZi5pbmNsdWRlX2RpcnMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gc2VsZi5kaXN0cmlidXRpb24uaW5jbHVkZV9kaXJzIG9yIFtdCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbmNsdWRlX2RpcnMsIHN0cik6CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IHNlbGYuaW5jbHVkZV9kaXJzLnNwbGl0KG9zLnBhdGhzZXApCisKKyAgICAgICAgIyBQdXQgdGhlIFB5dGhvbiAic3lzdGVtIiBpbmNsdWRlIGRpciBhdCB0aGUgZW5kLCBzbyB0aGF0CisgICAgICAgICMgYW55IGxvY2FsIGluY2x1ZGUgZGlycyB0YWtlIHByZWNlZGVuY2UuCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzLmFwcGVuZChweV9pbmNsdWRlKQorICAgICAgICBpZiBwbGF0X3B5X2luY2x1ZGUgIT0gcHlfaW5jbHVkZToKKyAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzLmFwcGVuZChwbGF0X3B5X2luY2x1ZGUpCisKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ2xpYnJhcmllcycpCisKKyAgICAgICAgIyBMaWZlIGlzIGVhc2llciBpZiB3ZSdyZSBub3QgZm9yZXZlciBjaGVja2luZyBmb3IgTm9uZSwgc28KKyAgICAgICAgIyBzaW1wbGlmeSB0aGVzZSBvcHRpb25zIHRvIGVtcHR5IGxpc3RzIGlmIHVuc2V0CisgICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmxpYnJhcmllcyA9IFtdCisgICAgICAgIGlmIHNlbGYubGlicmFyeV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycyA9IFtdCisgICAgICAgIGVsaWYgdHlwZShzZWxmLmxpYnJhcnlfZGlycykgaXMgU3RyaW5nVHlwZToKKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gc3RyaW5nLnNwbGl0KHNlbGYubGlicmFyeV9kaXJzLCBvcy5wYXRoc2VwKQorCisgICAgICAgIGlmIHNlbGYucnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYucnBhdGggPSBbXQorICAgICAgICBlbGlmIHR5cGUoc2VsZi5ycGF0aCkgaXMgU3RyaW5nVHlwZToKKyAgICAgICAgICAgIHNlbGYucnBhdGggPSBzdHJpbmcuc3BsaXQoc2VsZi5ycGF0aCwgb3MucGF0aHNlcCkKKworICAgICAgICAjIGZvciBleHRlbnNpb25zIHVuZGVyIHdpbmRvd3MgdXNlIGRpZmZlcmVudCBkaXJlY3RvcmllcworICAgICAgICAjIGZvciBSZWxlYXNlIGFuZCBEZWJ1ZyBidWlsZHMuCisgICAgICAgICMgYWxzbyBQeXRob24ncyBsaWJyYXJ5IGRpcmVjdG9yeSBtdXN0IGJlIGFwcGVuZGVkIHRvIGxpYnJhcnlfZGlycworICAgICAgICAjIEdDQyhtaW5ndyk6IG9zLm5hbWUgaXMgIm50IiBidXQgYnVpbGQgc3lzdGVtIGlzIHBvc2l4CisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPCAwOgorICAgICAgICAgICAgIyB0aGUgJ2xpYnMnIGRpcmVjdG9yeSBpcyBmb3IgYmluYXJ5IGluc3RhbGxzIC0gd2UgYXNzdW1lIHRoYXQKKyAgICAgICAgICAgICMgbXVzdCBiZSB0aGUgKm5hdGl2ZSogcGxhdGZvcm0uICBCdXQgd2UgZG9uJ3QgcmVhbGx5IHN1cHBvcnQKKyAgICAgICAgICAgICMgY3Jvc3MtY29tcGlsaW5nIHZpYSBhIGJpbmFyeSBpbnN0YWxsIGFueXdheSwgc28gd2UgbGV0IGl0IGdvLgorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICdsaWJzJykpCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfdGVtcCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX3RlbXAsICJEZWJ1ZyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGRfdGVtcCA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX3RlbXAsICJSZWxlYXNlIikKKworICAgICAgICAgICAgIyBBcHBlbmQgdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gaW5jbHVkZSBhbmQgbGlicmFyeSBkaXJlY3RvcmllcywKKyAgICAgICAgICAgICMgdGhpcyBhbGxvd3MgZGlzdHV0aWxzIG9uIHdpbmRvd3MgdG8gd29yayBpbiB0aGUgc291cmNlIHRyZWUKKyAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAnUEMnKSkKKyAgICAgICAgICAgIGlmIE1TVkNfVkVSU0lPTiA9PSA5OgorICAgICAgICAgICAgICAgICMgVXNlIHRoZSAubGliIGZpbGVzIGZvciB0aGUgY29ycmVjdCBhcmNoaXRlY3R1cmUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBsYXRfbmFtZSA9PSAnd2luMzInOgorICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSAnJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgd2luLWFtZDY0IG9yIHdpbi1pYTY0CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYucGxhdF9uYW1lWzQ6XQorICAgICAgICAgICAgICAgIG5ld19saWIgPSBvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAnUENidWlsZCcpCisgICAgICAgICAgICAgICAgaWYgc3VmZml4OgorICAgICAgICAgICAgICAgICAgICBuZXdfbGliID0gb3MucGF0aC5qb2luKG5ld19saWIsIHN1ZmZpeCkKKyAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQobmV3X2xpYikKKworICAgICAgICAgICAgZWxpZiBNU1ZDX1ZFUlNJT04gPT0gODoKKyAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BDJywgJ1ZTOC4wJykpCisgICAgICAgICAgICBlbGlmIE1TVkNfVkVSU0lPTiA9PSA3OgorICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUEMnLCAnVlM3LjEnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQQycsICdWQzYnKSkKKworICAgICAgICAjIE9TLzIgKEVNWCkgZG9lc24ndCBzdXBwb3J0IERlYnVnIHZzIFJlbGVhc2UgYnVpbGRzLCBidXQgaGFzIHRoZQorICAgICAgICAjIGltcG9ydCBsaWJyYXJpZXMgaW4gaXRzICJDb25maWciIHN1YmRpcmVjdG9yeQorICAgICAgICBpZiBvcy5uYW1lID09ICdvczInOgorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICdDb25maWcnKSkKKworICAgICAgICAjIGZvciBleHRlbnNpb25zIHVuZGVyIEN5Z3dpbiBhbmQgQXRoZU9TIFB5dGhvbidzIGxpYnJhcnkgZGlyZWN0b3J5IG11c3QgYmUKKyAgICAgICAgIyBhcHBlbmRlZCB0byBsaWJyYXJ5X2RpcnMKKyAgICAgICAgaWYgKHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2N5Z3dpbicgb3Igc3lzLnBsYXRmb3JtWzo2XSA9PSAnYXRoZW9zJworICAgICAgICAgICAgb3IgKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIGFuZCBzeXMudmVyc2lvbi5maW5kKCdHQ0MnKSA+PSAwKSk6CisgICAgICAgICAgICBpZiBzeXMuZXhlY3V0YWJsZS5zdGFydHN3aXRoKG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICJiaW4iKSk6CisgICAgICAgICAgICAgICAgIyBidWlsZGluZyB0aGlyZCBwYXJ0eSBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihzeXMucHJlZml4LCAibGliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgZ2V0X3B5dGhvbl92ZXJzaW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlnIikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgYnVpbGRpbmcgcHl0aG9uIHN0YW5kYXJkIGV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQoJy4nKQorCisgICAgICAgICMgZm9yIGV4dGVuc2lvbnMgdW5kZXIgTGludXggb3IgU29sYXJpcyB3aXRoIGEgc2hhcmVkIFB5dGhvbiBsaWJyYXJ5LAorICAgICAgICAjIFB5dGhvbidzIGxpYnJhcnkgZGlyZWN0b3J5IG11c3QgYmUgYXBwZW5kZWQgdG8gbGlicmFyeV9kaXJzCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfRU5BQkxFX1NIQVJFRCcpCisgICAgICAgIGlmICgoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2xpbnV4Jykgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2dudScpCisgICAgICAgICAgICAgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3N1bm9zJykpCisgICAgICAgICAgICBhbmQgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9FTkFCTEVfU0hBUkVEJykpOgorICAgICAgICAgICAgaWYgc3lzLmV4ZWN1dGFibGUuc3RhcnRzd2l0aChvcy5wYXRoLmpvaW4oc3lzLmV4ZWNfcHJlZml4LCAiYmluIikpOgorICAgICAgICAgICAgICAgICMgYnVpbGRpbmcgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzLmFwcGVuZChzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xJQkRJUicpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGJ1aWxkaW5nIHB5dGhvbiBzdGFuZGFyZCBleHRlbnNpb25zCisgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKCcuJykKKworICAgICAgICAjIFRoZSBhcmd1bWVudCBwYXJzaW5nIHdpbGwgcmVzdWx0IGluIHNlbGYuZGVmaW5lIGJlaW5nIGEgc3RyaW5nLCBidXQKKyAgICAgICAgIyBpdCBoYXMgdG8gYmUgYSBsaXN0IG9mIDItdHVwbGVzLiAgQWxsIHRoZSBwcmVwcm9jZXNzb3Igc3ltYm9scworICAgICAgICAjIHNwZWNpZmllZCBieSB0aGUgJ2RlZmluZScgb3B0aW9uIHdpbGwgYmUgc2V0IHRvICcxJy4gIE11bHRpcGxlCisgICAgICAgICMgc3ltYm9scyBjYW4gYmUgc2VwYXJhdGVkIHdpdGggY29tbWFzLgorCisgICAgICAgIGlmIHNlbGYuZGVmaW5lOgorICAgICAgICAgICAgZGVmaW5lcyA9IHNlbGYuZGVmaW5lLnNwbGl0KCcsJykKKyAgICAgICAgICAgIHNlbGYuZGVmaW5lID0gbWFwKGxhbWJkYSBzeW1ib2w6IChzeW1ib2wsICcxJyksIGRlZmluZXMpCisKKyAgICAgICAgIyBUaGUgb3B0aW9uIGZvciBtYWNyb3MgdG8gdW5kZWZpbmUgaXMgYWxzbyBhIHN0cmluZyBmcm9tIHRoZQorICAgICAgICAjIG9wdGlvbiBwYXJzaW5nLCBidXQgaGFzIHRvIGJlIGEgbGlzdC4gIE11bHRpcGxlIHN5bWJvbHMgY2FuIGFsc28KKyAgICAgICAgIyBiZSBzZXBhcmF0ZWQgd2l0aCBjb21tYXMgaGVyZS4KKyAgICAgICAgaWYgc2VsZi51bmRlZjoKKyAgICAgICAgICAgIHNlbGYudW5kZWYgPSBzZWxmLnVuZGVmLnNwbGl0KCcsJykKKworICAgICAgICBpZiBzZWxmLnN3aWdfb3B0cyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5zd2lnX29wdHMgPSBbXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zd2lnX29wdHMgPSBzZWxmLnN3aWdfb3B0cy5zcGxpdCgnICcpCisKKyAgICAgICAgIyBGaW5hbGx5IGFkZCB0aGUgdXNlciBpbmNsdWRlIGFuZCBsaWJyYXJ5IGRpcmVjdG9yaWVzIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiBzZWxmLnVzZXI6CisgICAgICAgICAgICB1c2VyX2luY2x1ZGUgPSBvcy5wYXRoLmpvaW4oVVNFUl9CQVNFLCAiaW5jbHVkZSIpCisgICAgICAgICAgICB1c2VyX2xpYiA9IG9zLnBhdGguam9pbihVU0VSX0JBU0UsICJsaWIiKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih1c2VyX2luY2x1ZGUpOgorICAgICAgICAgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzLmFwcGVuZCh1c2VyX2luY2x1ZGUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHVzZXJfbGliKToKKyAgICAgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQodXNlcl9saWIpCisgICAgICAgICAgICAgICAgc2VsZi5ycGF0aC5hcHBlbmQodXNlcl9saWIpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IG5ld19jb21waWxlcgorCisgICAgICAgICMgJ3NlbGYuZXh0ZW5zaW9ucycsIGFzIHN1cHBsaWVkIGJ5IHNldHVwLnB5LCBpcyBhIGxpc3Qgb2YKKyAgICAgICAgIyBFeHRlbnNpb24gaW5zdGFuY2VzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBFeHRlbnNpb24gKGluCisgICAgICAgICMgZGlzdHV0aWxzLmV4dGVuc2lvbikgZm9yIGRldGFpbHMuCisgICAgICAgICMKKyAgICAgICAgIyBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBEaXN0dXRpbHMgMC44LjIgYW5kIGVhcmxpZXIsIHdlCisgICAgICAgICMgYWxzbyBhbGxvdyB0aGUgJ2V4dGVuc2lvbnMnIGxpc3QgdG8gYmUgYSBsaXN0IG9mIHR1cGxlczoKKyAgICAgICAgIyAgICAoZXh0X25hbWUsIGJ1aWxkX2luZm8pCisgICAgICAgICMgd2hlcmUgYnVpbGRfaW5mbyBpcyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBldmVyeXRoaW5nIHRoYXQKKyAgICAgICAgIyBFeHRlbnNpb24gaW5zdGFuY2VzIGRvIGV4Y2VwdCB0aGUgbmFtZSwgd2l0aCBhIGZldyB0aGluZ3MgYmVpbmcKKyAgICAgICAgIyBkaWZmZXJlbnRseSBuYW1lZC4gIFdlIGNvbnZlcnQgdGhlc2UgMi10dXBsZXMgdG8gRXh0ZW5zaW9uCisgICAgICAgICMgaW5zdGFuY2VzIGFzIG5lZWRlZC4KKworICAgICAgICBpZiBub3Qgc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBJZiB3ZSB3ZXJlIGFza2VkIHRvIGJ1aWxkIGFueSBDL0MrKyBsaWJyYXJpZXMsIG1ha2Ugc3VyZSB0aGF0IHRoZQorICAgICAgICAjIGRpcmVjdG9yeSB3aGVyZSB3ZSBwdXQgdGhlbSBpcyBpbiB0aGUgbGlicmFyeSBzZWFyY2ggcGF0aCBmb3IKKyAgICAgICAgIyBsaW5raW5nIGV4dGVuc2lvbnMuCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpOgorICAgICAgICAgICAgYnVpbGRfY2xpYiA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9jbGliJykKKyAgICAgICAgICAgIHNlbGYubGlicmFyaWVzLmV4dGVuZChidWlsZF9jbGliLmdldF9saWJyYXJ5X25hbWVzKCkgb3IgW10pCisgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZGlycy5hcHBlbmQoYnVpbGRfY2xpYi5idWlsZF9jbGliKQorCisgICAgICAgICMgU2V0dXAgdGhlIENDb21waWxlciBvYmplY3QgdGhhdCB3ZSdsbCB1c2UgdG8gZG8gYWxsIHRoZQorICAgICAgICAjIGNvbXBpbGluZyBhbmQgbGlua2luZworICAgICAgICBzZWxmLmNvbXBpbGVyID0gbmV3X2NvbXBpbGVyKGNvbXBpbGVyPXNlbGYuY29tcGlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9c2VsZi5mb3JjZSkKKyAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKHNlbGYuY29tcGlsZXIpCisgICAgICAgICMgSWYgd2UgYXJlIGNyb3NzLWNvbXBpbGluZywgaW5pdCB0aGUgY29tcGlsZXIgbm93IChpZiB3ZSBhcmUgbm90CisgICAgICAgICMgY3Jvc3MtY29tcGlsaW5nLCBpbml0IHdvdWxkIG5vdCBodXJ0LCBidXQgcGVvcGxlIG1heSByZWx5IG9uCisgICAgICAgICMgbGF0ZSBpbml0aWFsaXphdGlvbiBvZiBjb21waWxlciBldmVuIGlmIHRoZXkgc2hvdWxkbid0Li4uKQorICAgICAgICBpZiBvcy5uYW1lID09ICdudCcgYW5kIHNlbGYucGxhdF9uYW1lICE9IGdldF9wbGF0Zm9ybSgpOgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5pbml0aWFsaXplKHNlbGYucGxhdF9uYW1lKQorCisgICAgICAgICMgQW5kIG1ha2Ugc3VyZSB0aGF0IGFueSBjb21waWxlL2xpbmstcmVsYXRlZCBvcHRpb25zICh3aGljaCBtaWdodAorICAgICAgICAjIGNvbWUgZnJvbSB0aGUgY29tbWFuZC1saW5lIG9yIGZyb20gdGhlIHNldHVwIHNjcmlwdCkgYXJlIHNldCBpbgorICAgICAgICAjIHRoYXQgQ0NvbXBpbGVyIG9iamVjdCAtLSB0aGF0IHdheSwgdGhleSBhdXRvbWF0aWNhbGx5IGFwcGx5IHRvCisgICAgICAgICMgYWxsIGNvbXBpbGluZyBhbmQgbGlua2luZyBkb25lIGhlcmUuCisgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5zZXRfaW5jbHVkZV9kaXJzKHNlbGYuaW5jbHVkZV9kaXJzKQorICAgICAgICBpZiBzZWxmLmRlZmluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgJ2RlZmluZScgb3B0aW9uIGlzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgdHVwbGVzCisgICAgICAgICAgICBmb3IgKG5hbWUsIHZhbHVlKSBpbiBzZWxmLmRlZmluZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmRlZmluZV9tYWNybyhuYW1lLCB2YWx1ZSkKKyAgICAgICAgaWYgc2VsZi51bmRlZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBtYWNybyBpbiBzZWxmLnVuZGVmOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIudW5kZWZpbmVfbWFjcm8obWFjcm8pCisgICAgICAgIGlmIHNlbGYubGlicmFyaWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5zZXRfbGlicmFyaWVzKHNlbGYubGlicmFyaWVzKQorICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2xpYnJhcnlfZGlycyhzZWxmLmxpYnJhcnlfZGlycykKKyAgICAgICAgaWYgc2VsZi5ycGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X3J1bnRpbWVfbGlicmFyeV9kaXJzKHNlbGYucnBhdGgpCisgICAgICAgIGlmIHNlbGYubGlua19vYmplY3RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jb21waWxlci5zZXRfbGlua19vYmplY3RzKHNlbGYubGlua19vYmplY3RzKQorCisgICAgICAgICMgTm93IGFjdHVhbGx5IGNvbXBpbGUgYW5kIGxpbmsgZXZlcnl0aGluZy4KKyAgICAgICAgc2VsZi5idWlsZF9leHRlbnNpb25zKCkKKworICAgIGRlZiBjaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZiwgZXh0ZW5zaW9ucyk6CisgICAgICAgICIiIkVuc3VyZSB0aGF0IHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgKHByZXN1bWFibHkgcHJvdmlkZWQgYXMgYQorICAgICAgICBjb21tYW5kIG9wdGlvbiAnZXh0ZW5zaW9ucycpIGlzIHZhbGlkLCBpLmUuIGl0IGlzIGEgbGlzdCBvZgorICAgICAgICBFeHRlbnNpb24gb2JqZWN0cy4gIFdlIGFsc28gc3VwcG9ydCB0aGUgb2xkLXN0eWxlIGxpc3Qgb2YgMi10dXBsZXMsCisgICAgICAgIHdoZXJlIHRoZSB0dXBsZXMgYXJlIChleHRfbmFtZSwgYnVpbGRfaW5mbyksIHdoaWNoIGFyZSBjb252ZXJ0ZWQgdG8KKyAgICAgICAgRXh0ZW5zaW9uIGluc3RhbmNlcyBoZXJlLgorCisgICAgICAgIFJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IgaWYgdGhlIHN0cnVjdHVyZSBpcyBpbnZhbGlkIGFueXdoZXJlOworICAgICAgICBqdXN0IHJldHVybnMgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXh0ZW5zaW9ucywgbGlzdCk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiJ2V4dF9tb2R1bGVzJyBvcHRpb24gbXVzdCBiZSBhIGxpc3Qgb2YgRXh0ZW5zaW9uIGluc3RhbmNlcyIKKworICAgICAgICBmb3IgaSwgZXh0IGluIGVudW1lcmF0ZShleHRlbnNpb25zKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LCBFeHRlbnNpb24pOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICAgICAgICAgICAgICMgT0shIChhc3N1bWUgdHlwZS1jaGVja2luZyBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBieSBFeHRlbnNpb24gY29uc3RydWN0b3IpCisKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dCwgdHVwbGUpIG9yIGxlbihleHQpICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiZWFjaCBlbGVtZW50IG9mICdleHRfbW9kdWxlcycgb3B0aW9uIG11c3QgYmUgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiRXh0ZW5zaW9uIGluc3RhbmNlIG9yIDItdHVwbGUiKQorCisgICAgICAgICAgICBleHRfbmFtZSwgYnVpbGRfaW5mbyA9IGV4dAorCisgICAgICAgICAgICBsb2cud2FybigoIm9sZC1zdHlsZSAoZXh0X25hbWUsIGJ1aWxkX2luZm8pIHR1cGxlIGZvdW5kIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAiZXh0X21vZHVsZXMgZm9yIGV4dGVuc2lvbiAnJXMnIgorICAgICAgICAgICAgICAgICAgICAgICItLSBwbGVhc2UgY29udmVydCB0byBFeHRlbnNpb24gaW5zdGFuY2UiICUgZXh0X25hbWUpKQorCisgICAgICAgICAgICBpZiBub3QgKGlzaW5zdGFuY2UoZXh0X25hbWUsIHN0cikgYW5kCisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9uYW1lX3JlLm1hdGNoKGV4dF9uYW1lKSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiZmlyc3QgZWxlbWVudCBvZiBlYWNoIHR1cGxlIGluICdleHRfbW9kdWxlcycgIgorICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSB0aGUgZXh0ZW5zaW9uIG5hbWUgKGEgc3RyaW5nKSIpCisKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGJ1aWxkX2luZm8sIGRpY3QpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoInNlY29uZCBlbGVtZW50IG9mIGVhY2ggdHVwbGUgaW4gJ2V4dF9tb2R1bGVzJyAiCisgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIGEgZGljdGlvbmFyeSAoYnVpbGQgaW5mbykiKQorCisgICAgICAgICAgICAjIE9LLCB0aGUgKGV4dF9uYW1lLCBidWlsZF9pbmZvKSBkaWN0IGlzIHR5cGUtc2FmZTogY29udmVydCBpdAorICAgICAgICAgICAgIyB0byBhbiBFeHRlbnNpb24gaW5zdGFuY2UuCisgICAgICAgICAgICBleHQgPSBFeHRlbnNpb24oZXh0X25hbWUsIGJ1aWxkX2luZm9bJ3NvdXJjZXMnXSkKKworICAgICAgICAgICAgIyBFYXN5IHN0dWZmOiBvbmUtdG8tb25lIG1hcHBpbmcgZnJvbSBkaWN0IGVsZW1lbnRzIHRvCisgICAgICAgICAgICAjIGluc3RhbmNlIGF0dHJpYnV0ZXMuCisgICAgICAgICAgICBmb3Iga2V5IGluICgnaW5jbHVkZV9kaXJzJywgJ2xpYnJhcnlfZGlycycsICdsaWJyYXJpZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2V4dHJhX29iamVjdHMnLCAnZXh0cmFfY29tcGlsZV9hcmdzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdleHRyYV9saW5rX2FyZ3MnKToKKyAgICAgICAgICAgICAgICB2YWwgPSBidWlsZF9pbmZvLmdldChrZXkpCisgICAgICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGV4dCwga2V5LCB2YWwpCisKKyAgICAgICAgICAgICMgTWVkaXVtLWVhc3kgc3R1ZmY6IHNhbWUgc3ludGF4L3NlbWFudGljcywgZGlmZmVyZW50IG5hbWVzLgorICAgICAgICAgICAgZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzID0gYnVpbGRfaW5mby5nZXQoJ3JwYXRoJykKKyAgICAgICAgICAgIGlmICdkZWZfZmlsZScgaW4gYnVpbGRfaW5mbzoKKyAgICAgICAgICAgICAgICBsb2cud2FybigiJ2RlZl9maWxlJyBlbGVtZW50IG9mIGJ1aWxkIGluZm8gZGljdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIGxvbmdlciBzdXBwb3J0ZWQiKQorCisgICAgICAgICAgICAjIE5vbi10cml2aWFsIHN0dWZmOiAnbWFjcm9zJyBzcGxpdCBpbnRvICdkZWZpbmVfbWFjcm9zJworICAgICAgICAgICAgIyBhbmQgJ3VuZGVmX21hY3JvcycuCisgICAgICAgICAgICBtYWNyb3MgPSBidWlsZF9pbmZvLmdldCgnbWFjcm9zJykKKyAgICAgICAgICAgIGlmIG1hY3JvczoKKyAgICAgICAgICAgICAgICBleHQuZGVmaW5lX21hY3JvcyA9IFtdCisgICAgICAgICAgICAgICAgZXh0LnVuZGVmX21hY3JvcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIG1hY3JvIGluIG1hY3JvczoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IChpc2luc3RhbmNlKG1hY3JvLCB0dXBsZSkgYW5kIGxlbihtYWNybykgaW4gKDEsIDIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiJ21hY3JvcycgZWxlbWVudCBvZiBidWlsZCBpbmZvIGRpY3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIDEtIG9yIDItdHVwbGUiKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4obWFjcm8pID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBleHQudW5kZWZfbWFjcm9zLmFwcGVuZChtYWNyb1swXSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBsZW4obWFjcm8pID09IDI6CisgICAgICAgICAgICAgICAgICAgICAgICBleHQuZGVmaW5lX21hY3Jvcy5hcHBlbmQobWFjcm8pCisKKyAgICAgICAgICAgIGV4dGVuc2lvbnNbaV0gPSBleHQKKworICAgIGRlZiBnZXRfc291cmNlX2ZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V4dGVuc2lvbnNfbGlzdChzZWxmLmV4dGVuc2lvbnMpCisgICAgICAgIGZpbGVuYW1lcyA9IFtdCisKKyAgICAgICAgIyBXb3VsZG4ndCBpdCBiZSBuZWF0IGlmIHdlIGtuZXcgdGhlIG5hbWVzIG9mIGhlYWRlciBmaWxlcyB0b28uLi4KKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBmaWxlbmFtZXMuZXh0ZW5kKGV4dC5zb3VyY2VzKQorCisgICAgICAgIHJldHVybiBmaWxlbmFtZXMKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgIyBTYW5pdHkgY2hlY2sgdGhlICdleHRlbnNpb25zJyBsaXN0IC0tIGNhbid0IGFzc3VtZSB0aGlzIGlzIGJlaW5nCisgICAgICAgICMgZG9uZSBpbiB0aGUgc2FtZSBydW4gYXMgYSAnYnVpbGRfZXh0ZW5zaW9ucygpJyBjYWxsIChpbiBmYWN0LCB3ZQorICAgICAgICAjIGNhbiBwcm9iYWJseSBhc3N1bWUgdGhhdCBpdCAqaXNuJ3QqISkuCisgICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKKworICAgICAgICAjIEFuZCBidWlsZCB0aGUgbGlzdCBvZiBvdXRwdXQgKGJ1aWx0KSBmaWxlbmFtZXMuICBOb3RlIHRoYXQgdGhpcworICAgICAgICAjIGlnbm9yZXMgdGhlICdpbnBsYWNlJyBmbGFnLCBhbmQgYXNzdW1lcyBldmVyeXRoaW5nIGdvZXMgaW4gdGhlCisgICAgICAgICMgImJ1aWxkIiB0cmVlLgorICAgICAgICBvdXRwdXRzID0gW10KKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChzZWxmLmdldF9leHRfZnVsbHBhdGgoZXh0Lm5hbWUpKQorICAgICAgICByZXR1cm4gb3V0cHV0cworCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbnMoc2VsZik6CisgICAgICAgICMgRmlyc3QsIHNhbml0eS1jaGVjayB0aGUgJ2V4dGVuc2lvbnMnIGxpc3QKKyAgICAgICAgc2VsZi5jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZi5leHRlbnNpb25zKQorCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgc2VsZi5idWlsZF9leHRlbnNpb24oZXh0KQorCisgICAgZGVmIGJ1aWxkX2V4dGVuc2lvbihzZWxmLCBleHQpOgorICAgICAgICBzb3VyY2VzID0gZXh0LnNvdXJjZXMKKyAgICAgICAgaWYgc291cmNlcyBpcyBOb25lIG9yIHR5cGUoc291cmNlcykgbm90IGluIChMaXN0VHlwZSwgVHVwbGVUeXBlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICgiaW4gJ2V4dF9tb2R1bGVzJyBvcHRpb24gKGV4dGVuc2lvbiAnJXMnKSwgIiArCisgICAgICAgICAgICAgICAgICAgIidzb3VyY2VzJyBtdXN0IGJlIHByZXNlbnQgYW5kIG11c3QgYmUgIiArCisgICAgICAgICAgICAgICAgICAgImEgbGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzIikgJSBleHQubmFtZQorICAgICAgICBzb3VyY2VzID0gbGlzdChzb3VyY2VzKQorCisgICAgICAgIGV4dF9wYXRoID0gc2VsZi5nZXRfZXh0X2Z1bGxwYXRoKGV4dC5uYW1lKQorICAgICAgICBkZXBlbmRzID0gc291cmNlcyArIGV4dC5kZXBlbmRzCisgICAgICAgIGlmIG5vdCAoc2VsZi5mb3JjZSBvciBuZXdlcl9ncm91cChkZXBlbmRzLCBleHRfcGF0aCwgJ25ld2VyJykpOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyAnJXMnIGV4dGVuc2lvbiAodXAtdG8tZGF0ZSkiLCBleHQubmFtZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmluZm8oImJ1aWxkaW5nICclcycgZXh0ZW5zaW9uIiwgZXh0Lm5hbWUpCisKKyAgICAgICAgIyBGaXJzdCwgc2NhbiB0aGUgc291cmNlcyBmb3IgU1dJRyBkZWZpbml0aW9uIGZpbGVzICguaSksIHJ1bgorICAgICAgICAjIFNXSUcgb24gJ2VtIHRvIGNyZWF0ZSAuYyBmaWxlcywgYW5kIG1vZGlmeSB0aGUgc291cmNlcyBsaXN0CisgICAgICAgICMgYWNjb3JkaW5nbHkuCisgICAgICAgIHNvdXJjZXMgPSBzZWxmLnN3aWdfc291cmNlcyhzb3VyY2VzLCBleHQpCisKKyAgICAgICAgIyBOZXh0LCBjb21waWxlIHRoZSBzb3VyY2UgY29kZSB0byBvYmplY3QgZmlsZXMuCisKKyAgICAgICAgIyBYWFggbm90IGhvbm91cmluZyAnZGVmaW5lX21hY3Jvcycgb3IgJ3VuZGVmX21hY3JvcycgLS0gdGhlCisgICAgICAgICMgQ0NvbXBpbGVyIEFQSSBuZWVkcyB0byBjaGFuZ2UgdG8gYWNjb21tb2RhdGUgdGhpcywgYW5kIEkKKyAgICAgICAgIyB3YW50IHRvIGRvIG9uZSB0aGluZyBhdCBhIHRpbWUhCisKKyAgICAgICAgIyBUd28gcG9zc2libGUgc291cmNlcyBmb3IgZXh0cmEgY29tcGlsZXIgYXJndW1lbnRzOgorICAgICAgICAjICAgLSAnZXh0cmFfY29tcGlsZV9hcmdzJyBpbiBFeHRlbnNpb24gb2JqZWN0CisgICAgICAgICMgICAtIENGTEFHUyBlbnZpcm9ubWVudCB2YXJpYWJsZSAobm90IHBhcnRpY3VsYXJseQorICAgICAgICAjICAgICBlbGVnYW50LCBidXQgcGVvcGxlIHNlZW0gdG8gZXhwZWN0IGl0IGFuZCBJCisgICAgICAgICMgICAgIGd1ZXNzIGl0J3MgdXNlZnVsKQorICAgICAgICAjIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBzaG91bGQgdGFrZSBwcmVjZWRlbmNlLCBhbmQKKyAgICAgICAgIyBhbnkgc2Vuc2libGUgY29tcGlsZXIgd2lsbCBnaXZlIHByZWNlZGVuY2UgdG8gbGF0ZXIKKyAgICAgICAgIyBjb21tYW5kIGxpbmUgYXJncy4gIEhlbmNlIHdlIGNvbWJpbmUgdGhlbSBpbiBvcmRlcjoKKyAgICAgICAgZXh0cmFfYXJncyA9IGV4dC5leHRyYV9jb21waWxlX2FyZ3Mgb3IgW10KKworICAgICAgICBtYWNyb3MgPSBleHQuZGVmaW5lX21hY3Jvc1s6XQorICAgICAgICBmb3IgdW5kZWYgaW4gZXh0LnVuZGVmX21hY3JvczoKKyAgICAgICAgICAgIG1hY3Jvcy5hcHBlbmQoKHVuZGVmLCkpCisKKyAgICAgICAgb2JqZWN0cyA9IHNlbGYuY29tcGlsZXIuY29tcGlsZShzb3VyY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPXNlbGYuYnVpbGRfdGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9zPW1hY3JvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9kaXJzPWV4dC5pbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPWV4dHJhX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHM9ZXh0LmRlcGVuZHMpCisKKyAgICAgICAgIyBYWFggLS0gdGhpcyBpcyBhIFZpbGUgSEFDSyEKKyAgICAgICAgIworICAgICAgICAjIFRoZSBzZXR1cC5weSBzY3JpcHQgZm9yIFB5dGhvbiBvbiBVbml4IG5lZWRzIHRvIGJlIGFibGUgdG8KKyAgICAgICAgIyBnZXQgdGhpcyBsaXN0IHNvIGl0IGNhbiBwZXJmb3JtIGFsbCB0aGUgY2xlYW4gdXAgbmVlZGVkIHRvCisgICAgICAgICMgYXZvaWQga2VlcGluZyBvYmplY3QgZmlsZXMgYXJvdW5kIHdoZW4gY2xlYW5pbmcgb3V0IGEgZmFpbGVkCisgICAgICAgICMgYnVpbGQgb2YgYW4gZXh0ZW5zaW9uIG1vZHVsZS4gIFNpbmNlIERpc3R1dGlscyBkb2VzIG5vdAorICAgICAgICAjIHRyYWNrIGRlcGVuZGVuY2llcywgd2UgaGF2ZSB0byBnZXQgcmlkIG9mIGludGVybWVkaWF0ZXMgdG8KKyAgICAgICAgIyBlbnN1cmUgYWxsIHRoZSBpbnRlcm1lZGlhdGVzIHdpbGwgYmUgcHJvcGVybHkgcmUtYnVpbHQuCisgICAgICAgICMKKyAgICAgICAgc2VsZi5fYnVpbHRfb2JqZWN0cyA9IG9iamVjdHNbOl0KKworICAgICAgICAjIE5vdyBsaW5rIHRoZSBvYmplY3QgZmlsZXMgdG9nZXRoZXIgaW50byBhICJzaGFyZWQgb2JqZWN0IiAtLQorICAgICAgICAjIG9mIGNvdXJzZSwgZmlyc3Qgd2UgaGF2ZSB0byBmaWd1cmUgb3V0IGFsbCB0aGUgb3RoZXIgdGhpbmdzCisgICAgICAgICMgdGhhdCBnbyBpbnRvIHRoZSBtaXguCisgICAgICAgIGlmIGV4dC5leHRyYV9vYmplY3RzOgorICAgICAgICAgICAgb2JqZWN0cy5leHRlbmQoZXh0LmV4dHJhX29iamVjdHMpCisgICAgICAgIGV4dHJhX2FyZ3MgPSBleHQuZXh0cmFfbGlua19hcmdzIG9yIFtdCisKKyAgICAgICAgIyBEZXRlY3QgdGFyZ2V0IGxhbmd1YWdlLCBpZiBub3QgcHJvdmlkZWQKKyAgICAgICAgbGFuZ3VhZ2UgPSBleHQubGFuZ3VhZ2Ugb3Igc2VsZi5jb21waWxlci5kZXRlY3RfbGFuZ3VhZ2Uoc291cmNlcykKKworICAgICAgICBzZWxmLmNvbXBpbGVyLmxpbmtfc2hhcmVkX29iamVjdCgKKyAgICAgICAgICAgIG9iamVjdHMsIGV4dF9wYXRoLAorICAgICAgICAgICAgbGlicmFyaWVzPXNlbGYuZ2V0X2xpYnJhcmllcyhleHQpLAorICAgICAgICAgICAgbGlicmFyeV9kaXJzPWV4dC5saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycz1leHQucnVudGltZV9saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1leHRyYV9hcmdzLAorICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHM9c2VsZi5nZXRfZXhwb3J0X3N5bWJvbHMoZXh0KSwKKyAgICAgICAgICAgIGRlYnVnPXNlbGYuZGVidWcsCisgICAgICAgICAgICBidWlsZF90ZW1wPXNlbGYuYnVpbGRfdGVtcCwKKyAgICAgICAgICAgIHRhcmdldF9sYW5nPWxhbmd1YWdlKQorCisKKyAgICBkZWYgc3dpZ19zb3VyY2VzIChzZWxmLCBzb3VyY2VzLCBleHRlbnNpb24pOgorCisgICAgICAgICIiIldhbGsgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzIGluICdzb3VyY2VzJywgbG9va2luZyBmb3IgU1dJRworICAgICAgICBpbnRlcmZhY2UgKC5pKSBmaWxlcy4gIFJ1biBTV0lHIG9uIGFsbCB0aGF0IGFyZSBmb3VuZCwgYW5kCisgICAgICAgIHJldHVybiBhIG1vZGlmaWVkICdzb3VyY2VzJyBsaXN0IHdpdGggU1dJRyBzb3VyY2UgZmlsZXMgcmVwbGFjZWQKKyAgICAgICAgYnkgdGhlIGdlbmVyYXRlZCBDIChvciBDKyspIGZpbGVzLgorICAgICAgICAiIiIKKworICAgICAgICBuZXdfc291cmNlcyA9IFtdCisgICAgICAgIHN3aWdfc291cmNlcyA9IFtdCisgICAgICAgIHN3aWdfdGFyZ2V0cyA9IHt9CisKKyAgICAgICAgIyBYWFggdGhpcyBkcm9wcyBnZW5lcmF0ZWQgQy9DKysgZmlsZXMgaW50byB0aGUgc291cmNlIHRyZWUsIHdoaWNoCisgICAgICAgICMgaXMgZmluZSBmb3IgZGV2ZWxvcGVycyB3aG8gd2FudCB0byBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQKKyAgICAgICAgIyBzb3VyY2UgLS0gYnV0IHRoZXJlIHNob3VsZCBiZSBhbiBvcHRpb24gdG8gcHV0IFNXSUcgb3V0cHV0IGluCisgICAgICAgICMgdGhlIHRlbXAgZGlyLgorCisgICAgICAgIGlmIHNlbGYuc3dpZ19jcHA6CisgICAgICAgICAgICBsb2cud2FybigiLS1zd2lnLWNwcCBpcyBkZXByZWNhdGVkIC0gdXNlIC0tc3dpZy1vcHRzPS1jKysiKQorCisgICAgICAgIGlmIHNlbGYuc3dpZ19jcHAgb3IgKCctYysrJyBpbiBzZWxmLnN3aWdfb3B0cykgb3IgXAorICAgICAgICAgICAoJy1jKysnIGluIGV4dGVuc2lvbi5zd2lnX29wdHMpOgorICAgICAgICAgICAgdGFyZ2V0X2V4dCA9ICcuY3BwJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyZ2V0X2V4dCA9ICcuYycKKworICAgICAgICBmb3Igc291cmNlIGluIHNvdXJjZXM6CisgICAgICAgICAgICAoYmFzZSwgZXh0KSA9IG9zLnBhdGguc3BsaXRleHQoc291cmNlKQorICAgICAgICAgICAgaWYgZXh0ID09ICIuaSI6ICAgICAgICAgICAgICMgU1dJRyBpbnRlcmZhY2UgZmlsZQorICAgICAgICAgICAgICAgIG5ld19zb3VyY2VzLmFwcGVuZChiYXNlICsgJ193cmFwJyArIHRhcmdldF9leHQpCisgICAgICAgICAgICAgICAgc3dpZ19zb3VyY2VzLmFwcGVuZChzb3VyY2UpCisgICAgICAgICAgICAgICAgc3dpZ190YXJnZXRzW3NvdXJjZV0gPSBuZXdfc291cmNlc1stMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3X3NvdXJjZXMuYXBwZW5kKHNvdXJjZSkKKworICAgICAgICBpZiBub3Qgc3dpZ19zb3VyY2VzOgorICAgICAgICAgICAgcmV0dXJuIG5ld19zb3VyY2VzCisKKyAgICAgICAgc3dpZyA9IHNlbGYuc3dpZyBvciBzZWxmLmZpbmRfc3dpZygpCisgICAgICAgIHN3aWdfY21kID0gW3N3aWcsICItcHl0aG9uIl0KKyAgICAgICAgc3dpZ19jbWQuZXh0ZW5kKHNlbGYuc3dpZ19vcHRzKQorICAgICAgICBpZiBzZWxmLnN3aWdfY3BwOgorICAgICAgICAgICAgc3dpZ19jbWQuYXBwZW5kKCItYysrIikKKworICAgICAgICAjIERvIG5vdCBvdmVycmlkZSBjb21tYW5kbGluZSBhcmd1bWVudHMKKyAgICAgICAgaWYgbm90IHNlbGYuc3dpZ19vcHRzOgorICAgICAgICAgICAgZm9yIG8gaW4gZXh0ZW5zaW9uLnN3aWdfb3B0czoKKyAgICAgICAgICAgICAgICBzd2lnX2NtZC5hcHBlbmQobykKKworICAgICAgICBmb3Igc291cmNlIGluIHN3aWdfc291cmNlczoKKyAgICAgICAgICAgIHRhcmdldCA9IHN3aWdfdGFyZ2V0c1tzb3VyY2VdCisgICAgICAgICAgICBsb2cuaW5mbygic3dpZ2dpbmcgJXMgdG8gJXMiLCBzb3VyY2UsIHRhcmdldCkKKyAgICAgICAgICAgIHNlbGYuc3Bhd24oc3dpZ19jbWQgKyBbIi1vIiwgdGFyZ2V0LCBzb3VyY2VdKQorCisgICAgICAgIHJldHVybiBuZXdfc291cmNlcworCisgICAgIyBzd2lnX3NvdXJjZXMgKCkKKworICAgIGRlZiBmaW5kX3N3aWcgKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIFNXSUcgZXhlY3V0YWJsZS4gIE9uIFVuaXgsIHRoaXMgaXMKKyAgICAgICAganVzdCAic3dpZyIgLS0gaXQgc2hvdWxkIGJlIGluIHRoZSBQQVRILiAgVHJpZXMgYSBiaXQgaGFyZGVyIG9uCisgICAgICAgIFdpbmRvd3MuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG9zLm5hbWUgPT0gInBvc2l4IjoKKyAgICAgICAgICAgIHJldHVybiAic3dpZyIKKyAgICAgICAgZWxpZiBvcy5uYW1lID09ICJudCI6CisKKyAgICAgICAgICAgICMgTG9vayBmb3IgU1dJRyBpbiBpdHMgc3RhbmRhcmQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvbgorICAgICAgICAgICAgIyBXaW5kb3dzIChvciBzbyBJIHByZXN1bWUhKS4gIElmIHdlIGZpbmQgaXQgdGhlcmUsIGdyZWF0OworICAgICAgICAgICAgIyBpZiBub3QsIGFjdCBsaWtlIFVuaXggYW5kIGFzc3VtZSBpdCdzIGluIHRoZSBQQVRILgorICAgICAgICAgICAgZm9yIHZlcnMgaW4gKCIxLjMiLCAiMS4yIiwgIjEuMSIpOgorICAgICAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKCJjOlxcc3dpZyVzIiAlIHZlcnMsICJzd2lnLmV4ZSIpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzd2lnLmV4ZSIKKworICAgICAgICBlbGlmIG9zLm5hbWUgPT0gIm9zMiI6CisgICAgICAgICAgICAjIGFzc3VtZSBzd2lnIGF2YWlsYWJsZSBpbiB0aGUgUEFUSC4KKyAgICAgICAgICAgIHJldHVybiAic3dpZy5leGUiCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICgiSSBkb24ndCBrbm93IGhvdyB0byBmaW5kIChtdWNoIGxlc3MgcnVuKSBTV0lHICIKKyAgICAgICAgICAgICAgICAgICAib24gcGxhdGZvcm0gJyVzJyIpICUgb3MubmFtZQorCisgICAgIyBmaW5kX3N3aWcgKCkKKworICAgICMgLS0gTmFtZSBnZW5lcmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAoZXh0ZW5zaW9uIG5hbWVzLCBmaWxlbmFtZXMsIHdoYXRldmVyKQorICAgIGRlZiBnZXRfZXh0X2Z1bGxwYXRoKHNlbGYsIGV4dF9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgcGF0aCBvZiB0aGUgZmlsZW5hbWUgZm9yIGEgZ2l2ZW4gZXh0ZW5zaW9uLgorCisgICAgICAgIFRoZSBmaWxlIGlzIGxvY2F0ZWQgaW4gYGJ1aWxkX2xpYmAgb3IgZGlyZWN0bHkgaW4gdGhlIHBhY2thZ2UKKyAgICAgICAgKGlucGxhY2Ugb3B0aW9uKS4KKyAgICAgICAgIiIiCisgICAgICAgICMgbWFrZXMgc3VyZSB0aGUgZXh0ZW5zaW9uIG5hbWUgaXMgb25seSB1c2luZyBkb3RzCisgICAgICAgIGFsbF9kb3RzID0gc3RyaW5nLm1ha2V0cmFucygnLycrb3Muc2VwLCAnLi4nKQorICAgICAgICBleHRfbmFtZSA9IGV4dF9uYW1lLnRyYW5zbGF0ZShhbGxfZG90cykKKworICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHRfbmFtZSkKKyAgICAgICAgbW9kcGF0aCA9IGZ1bGxuYW1lLnNwbGl0KCcuJykKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZXh0X25hbWUpCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbLTFdCisKKyAgICAgICAgaWYgbm90IHNlbGYuaW5wbGFjZToKKyAgICAgICAgICAgICMgbm8gZnVydGhlciB3b3JrIG5lZWRlZAorICAgICAgICAgICAgIyByZXR1cm5pbmcgOgorICAgICAgICAgICAgIyAgIGJ1aWxkX2Rpci9wYWNrYWdlL3BhdGgvZmlsZW5hbWUKKyAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKCptb2RwYXRoWzotMV0rW2ZpbGVuYW1lXSkKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsIGZpbGVuYW1lKQorCisgICAgICAgICMgdGhlIGlucGxhY2Ugb3B0aW9uIHJlcXVpcmVzIHRvIGZpbmQgdGhlIHBhY2thZ2UgZGlyZWN0b3J5CisgICAgICAgICMgdXNpbmcgdGhlIGJ1aWxkX3B5IGNvbW1hbmQgZm9yIHRoYXQKKyAgICAgICAgcGFja2FnZSA9ICcuJy5qb2luKG1vZHBhdGhbMDotMV0pCisgICAgICAgIGJ1aWxkX3B5ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykKKyAgICAgICAgcGFja2FnZV9kaXIgPSBvcy5wYXRoLmFic3BhdGgoYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpKQorCisgICAgICAgICMgcmV0dXJuaW5nCisgICAgICAgICMgICBwYWNrYWdlX2Rpci9maWxlbmFtZQorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLCBmaWxlbmFtZSkKKworICAgIGRlZiBnZXRfZXh0X2Z1bGxuYW1lKHNlbGYsIGV4dF9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgZnVsbG5hbWUgb2YgYSBnaXZlbiBleHRlbnNpb24gbmFtZS4KKworICAgICAgICBBZGRzIHRoZSBgcGFja2FnZS5gIHByZWZpeCIiIgorICAgICAgICBpZiBzZWxmLnBhY2thZ2UgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBleHRfbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFja2FnZSArICcuJyArIGV4dF9uYW1lCisKKyAgICBkZWYgZ2V0X2V4dF9maWxlbmFtZShzZWxmLCBleHRfbmFtZSk6CisgICAgICAgIHIiIiJDb252ZXJ0IHRoZSBuYW1lIG9mIGFuIGV4dGVuc2lvbiAoZWcuICJmb28uYmFyIikgaW50byB0aGUgbmFtZQorICAgICAgICBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIGl0IHdpbGwgYmUgbG9hZGVkIChlZy4gImZvby9iYXIuc28iLCBvcgorICAgICAgICAiZm9vXGJhci5weWQiKS4KKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X2NvbmZpZ192YXIKKyAgICAgICAgZXh0X3BhdGggPSBzdHJpbmcuc3BsaXQoZXh0X25hbWUsICcuJykKKyAgICAgICAgIyBPUy8yIGhhcyBhbiA4IGNoYXJhY3RlciBtb2R1bGUgKGV4dGVuc2lvbikgbGltaXQgOi0oCisgICAgICAgIGlmIG9zLm5hbWUgPT0gIm9zMiI6CisgICAgICAgICAgICBleHRfcGF0aFtsZW4oZXh0X3BhdGgpIC0gMV0gPSBleHRfcGF0aFtsZW4oZXh0X3BhdGgpIC0gMV1bOjhdCisgICAgICAgICMgZXh0ZW5zaW9ucyBpbiBkZWJ1Z19tb2RlIGFyZSBuYW1lZCAnbW9kdWxlX2QucHlkJyB1bmRlciB3aW5kb3dzCisgICAgICAgIHNvX2V4dCA9IGdldF9jb25maWdfdmFyKCdTTycpCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKmV4dF9wYXRoKSArICdfZCcgKyBzb19leHQKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqZXh0X3BhdGgpICsgc29fZXh0CisKKyAgICBkZWYgZ2V0X2V4cG9ydF9zeW1ib2xzIChzZWxmLCBleHQpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxpc3Qgb2Ygc3ltYm9scyB0aGF0IGEgc2hhcmVkIGV4dGVuc2lvbiBoYXMgdG8KKyAgICAgICAgZXhwb3J0LiAgVGhpcyBlaXRoZXIgdXNlcyAnZXh0LmV4cG9ydF9zeW1ib2xzJyBvciwgaWYgaXQncyBub3QKKyAgICAgICAgcHJvdmlkZWQsICJpbml0IiArIG1vZHVsZV9uYW1lLiAgT25seSByZWxldmFudCBvbiBXaW5kb3dzLCB3aGVyZQorICAgICAgICB0aGUgLnB5ZCBmaWxlIChETEwpIG11c3QgZXhwb3J0IHRoZSBtb2R1bGUgImluaXQiIGZ1bmN0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgaW5pdGZ1bmNfbmFtZSA9ICJpbml0IiArIGV4dC5uYW1lLnNwbGl0KCcuJylbLTFdCisgICAgICAgIGlmIGluaXRmdW5jX25hbWUgbm90IGluIGV4dC5leHBvcnRfc3ltYm9sczoKKyAgICAgICAgICAgIGV4dC5leHBvcnRfc3ltYm9scy5hcHBlbmQoaW5pdGZ1bmNfbmFtZSkKKyAgICAgICAgcmV0dXJuIGV4dC5leHBvcnRfc3ltYm9scworCisgICAgZGVmIGdldF9saWJyYXJpZXMgKHNlbGYsIGV4dCk6CisgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBsaWJyYXJpZXMgdG8gbGluayBhZ2FpbnN0IHdoZW4gYnVpbGRpbmcgYQorICAgICAgICBzaGFyZWQgZXh0ZW5zaW9uLiAgT24gbW9zdCBwbGF0Zm9ybXMsIHRoaXMgaXMganVzdCAnZXh0LmxpYnJhcmllcyc7CisgICAgICAgIG9uIFdpbmRvd3MgYW5kIE9TLzIsIHdlIGFkZCB0aGUgUHl0aG9uIGxpYnJhcnkgKGVnLiBweXRob24yMC5kbGwpLgorICAgICAgICAiIiIKKyAgICAgICAgIyBUaGUgcHl0aG9uIGxpYnJhcnkgaXMgYWx3YXlzIG5lZWRlZCBvbiBXaW5kb3dzLiAgRm9yIE1TVkMsIHRoaXMKKyAgICAgICAgIyBpcyByZWR1bmRhbnQsIHNpbmNlIHRoZSBsaWJyYXJ5IGlzIG1lbnRpb25lZCBpbiBhIHByYWdtYSBpbgorICAgICAgICAjIHB5Y29uZmlnLmggdGhhdCBNU1ZDIGdyb2tzLiAgVGhlIG90aGVyIFdpbmRvd3MgY29tcGlsZXJzIGFsbCBzZWVtCisgICAgICAgICMgdG8gbmVlZCBpdCBtZW50aW9uZWQgZXhwbGljaXRseSwgdGhvdWdoLCBzbyB0aGF0J3Mgd2hhdCB3ZSBkby4KKyAgICAgICAgIyBBcHBlbmQgJ19kJyB0byB0aGUgcHl0aG9uIGltcG9ydCBsaWJyYXJ5IG9uIGRlYnVnIGJ1aWxkcy4KKworICAgICAgICAjIEZJWE1FOiBXaGF0IGlzIHB1cnBvc2Ugb2YgY29kZSBiZWxvdyA/CisgICAgICAgICMgVGhlIHBvc2l4IGJ1aWxkIHN5c3RlbSBraG93IHJlcXVyZWQgbGlicmFyaWVzIHRvIGJ1aWxkIGEgbW9kdWxlLgorICAgICAgICAjIFRoZSBsaWJyYXJpZXMgYXJlIHN0b3JlZCBpbiBjb25maWcoTWFrZWZpbGUpIHZhcmlhYmxlcyBCTERMSUJSQVJZLAorICAgICAgICAjIE1PRExJQlMgYW5kIFNITElCUy4gTm90ZSB0aGF0IHNvbWUgdmFyaWFibGVzIG1heSBjb250YWluIGxpbmtlcgorICAgICAgICAjIGZsYWdzLgorICAgICAgICAjIE5PVEU6IEZvciBub3cgd2Ugd2lsbCBjaGVjayBvbmx5IEdDQyhtaW5ndykgY29tcGlsZXIgYXMgaXMgY2xlYXIKKyAgICAgICAgIyB0aGF0IHdlIGJ1aWxkIGZvciB3aW5kb3dzIHBsYXRmcm9tLgorICAgICAgICAjIFRoZSBjb2RlIGZvciBHQ0MobWluZ3cpIGlzIG5vdCBjb3JyZWN0IGJ1dCB0aGlzIGlzIGRpc3R1dGlscworICAgICAgICAjIGxpbWl0YXRpb24gLSB3ZSBoYXMgdG8gcGFzcyB2YXJpYWJsZXMgdG8gdGhlIGxpbmtlciBhcyBpcworICAgICAgICAjIGluc3RlYWQgb25seSBsaWJyYXJ5IG5hbWVzLgorICAgICAgICBpZiBzZWxmLmNvbXBpbGVyLmNvbXBpbGVyX3R5cGUgPT0gJ21pbmd3MzInOgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworICAgICAgICAgICAgdGVtcGxhdGUgPSAicHl0aG9uJXMiCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgICAgIHRlbXBsYXRlID0gdGVtcGxhdGUgKyAnX2QnCisgICAgICAgICAgICBleHRyYSA9IFsodGVtcGxhdGUgJSAoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdWRVJTSU9OJykpKV0KKyAgICAgICAgICAgIGZvciBsaWIgaW4gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdCTERMSUJSQVJZJykuc3BsaXQoKToKKyAgICAgICAgICAgICAgICBpZiBsaWIuc3RhcnRzd2l0aCgnLWwnKToKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEuYXBwZW5kKGxpYlsyOl0pCisgICAgICAgICAgICBmb3IgbGliIGluIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTU9ETElCUycpLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgaWYgbGliLnN0YXJ0c3dpdGgoJy1sJyk6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZChsaWJbMjpdKQorICAgICAgICAgICAgZm9yIGxpYiBpbiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NITElCUycpLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgaWYgbGliLnN0YXJ0c3dpdGgoJy1sJyk6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZChsaWJbMjpdKQorICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBleHRyYQorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMubXN2Y2NvbXBpbGVyIGltcG9ydCBNU1ZDQ29tcGlsZXIKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYuY29tcGlsZXIsIE1TVkNDb21waWxlcik6CisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAicHl0aG9uJWQlZCIKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlICsgJ19kJworICAgICAgICAgICAgICAgIHB5dGhvbmxpYiA9ICh0ZW1wbGF0ZSAlCisgICAgICAgICAgICAgICAgICAgICAgIChzeXMuaGV4dmVyc2lvbiA+PiAyNCwgKHN5cy5oZXh2ZXJzaW9uID4+IDE2KSAmIDB4ZmYpKQorICAgICAgICAgICAgICAgICMgZG9uJ3QgZXh0ZW5kIGV4dC5saWJyYXJpZXMsIGl0IG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlcgorICAgICAgICAgICAgICAgICMgZXh0ZW5zaW9ucywgaXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGxpc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcyArIFtweXRob25saWJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICJvczJlbXgiOgorICAgICAgICAgICAgIyBFTVgvR0NDIHJlcXVpcmVzIHRoZSBweXRob24gbGlicmFyeSBleHBsaWNpdGx5LCBhbmQgSQorICAgICAgICAgICAgIyBiZWxpZXZlIFZBQ1BQIGRvZXMgYXMgd2VsbCAodGhvdWdoIG5vdCBjb25maXJtZWQpIC0gQUlNIEFwcjAxCisgICAgICAgICAgICB0ZW1wbGF0ZSA9ICJweXRob24lZCVkIgorICAgICAgICAgICAgIyBkZWJ1ZyB2ZXJzaW9ucyBvZiB0aGUgbWFpbiBETEwgYXJlbid0IHN1cHBvcnRlZCwgYXQgbGVhc3QKKyAgICAgICAgICAgICMgbm90IGF0IHRoaXMgdGltZSAtIEFJTSBBcHIwMQorICAgICAgICAgICAgI2lmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAjICAgIHRlbXBsYXRlID0gdGVtcGxhdGUgKyAnX2QnCisgICAgICAgICAgICBweXRob25saWIgPSAodGVtcGxhdGUgJQorICAgICAgICAgICAgICAgICAgIChzeXMuaGV4dmVyc2lvbiA+PiAyNCwgKHN5cy5oZXh2ZXJzaW9uID4+IDE2KSAmIDB4ZmYpKQorICAgICAgICAgICAgIyBkb24ndCBleHRlbmQgZXh0LmxpYnJhcmllcywgaXQgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyCisgICAgICAgICAgICAjIGV4dGVuc2lvbnMsIGl0IGlzIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBsaXN0CisgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcyArIFtweXRob25saWJdCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtWzo2XSA9PSAiY3lnd2luIjoKKyAgICAgICAgICAgIHRlbXBsYXRlID0gInB5dGhvbiVkLiVkIgorICAgICAgICAgICAgcHl0aG9ubGliID0gKHRlbXBsYXRlICUKKyAgICAgICAgICAgICAgICAgICAoc3lzLmhleHZlcnNpb24gPj4gMjQsIChzeXMuaGV4dmVyc2lvbiA+PiAxNikgJiAweGZmKSkKKyAgICAgICAgICAgICMgZG9uJ3QgZXh0ZW5kIGV4dC5saWJyYXJpZXMsIGl0IG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlcgorICAgICAgICAgICAgIyBleHRlbnNpb25zLCBpdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbGlzdAorICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBbcHl0aG9ubGliXQorICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gImF0aGVvcyI6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisKKyAgICAgICAgICAgIHRlbXBsYXRlID0gInB5dGhvbiVkLiVkIgorICAgICAgICAgICAgcHl0aG9ubGliID0gKHRlbXBsYXRlICUKKyAgICAgICAgICAgICAgICAgICAoc3lzLmhleHZlcnNpb24gPj4gMjQsIChzeXMuaGV4dmVyc2lvbiA+PiAxNikgJiAweGZmKSkKKyAgICAgICAgICAgICMgR2V0IFNITElCUyBmcm9tIE1ha2VmaWxlCisgICAgICAgICAgICBleHRyYSA9IFtdCisgICAgICAgICAgICBmb3IgbGliIGluIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignU0hMSUJTJykuc3BsaXQoKToKKyAgICAgICAgICAgICAgICBpZiBsaWIuc3RhcnRzd2l0aCgnLWwnKToKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEuYXBwZW5kKGxpYlsyOl0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEuYXBwZW5kKGxpYikKKyAgICAgICAgICAgICMgZG9uJ3QgZXh0ZW5kIGV4dC5saWJyYXJpZXMsIGl0IG1heSBiZSBzaGFyZWQgd2l0aCBvdGhlcgorICAgICAgICAgICAgIyBleHRlbnNpb25zLCBpdCBpcyBhIHJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgbGlzdAorICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBbcHl0aG9ubGliLCAibSJdICsgZXh0cmEKKworICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICMgRG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGNvZGUgYmVsb3cKKyAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnYWl4JzoKKyAgICAgICAgICAgICMgRG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGNvZGUgYmVsb3cKKyAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgICAgICAgICBpZiBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1B5X0VOQUJMRV9TSEFSRUQnKToKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9ICJweXRob24lZC4lZCIKKyAgICAgICAgICAgICAgICBweXRob25saWIgPSAodGVtcGxhdGUgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3lzLmhleHZlcnNpb24gPj4gMjQsIChzeXMuaGV4dmVyc2lvbiA+PiAxNikgJiAweGZmKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcyArIFtweXRob25saWJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzCisKKyMgY2xhc3MgYnVpbGRfZXh0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMTM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzMTM4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3B5LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGM0NTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weQpAQCAtMCwwICsxLDM5MyBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdidWlsZF9weScgY29tbWFuZC4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSBnbG9iIGltcG9ydCBnbG9iCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc0ZpbGVFcnJvcgorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2NsYXNzIGJ1aWxkX3B5KENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiXCJidWlsZFwiIHB1cmUgUHl0aG9uIG1vZHVsZXMgKGNvcHkgdG8gYnVpbGQgZGlyZWN0b3J5KSIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdidWlsZC1saWI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIFwiYnVpbGRcIiAoY29weSkgdG8iKSwKKyAgICAgICAgKCdjb21waWxlJywgJ2MnLCAiY29tcGlsZSAucHkgdG8gLnB5YyIpLAorICAgICAgICAoJ25vLWNvbXBpbGUnLCBOb25lLCAiZG9uJ3QgY29tcGlsZSAucHkgZmlsZXMgW2RlZmF1bHRdIiksCisgICAgICAgICgnb3B0aW1pemU9JywgJ08nLAorICAgICAgICAgImFsc28gY29tcGlsZSB3aXRoIG9wdGltaXphdGlvbjogLU8xIGZvciBcInB5dGhvbiAtT1wiLCAiCisgICAgICAgICAiLU8yIGZvciBcInB5dGhvbiAtT09cIiwgYW5kIC1PMCB0byBkaXNhYmxlIFtkZWZhdWx0OiAtTzBdIiksCisgICAgICAgICgnZm9yY2UnLCAnZicsICJmb3JjaWJseSBidWlsZCBldmVyeXRoaW5nIChpZ25vcmUgZmlsZSB0aW1lc3RhbXBzKSIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2NvbXBpbGUnLCAnZm9yY2UnXQorICAgIG5lZ2F0aXZlX29wdCA9IHsnbm8tY29tcGlsZScgOiAnY29tcGlsZSd9CisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmJ1aWxkX2xpYiA9IE5vbmUKKyAgICAgICAgc2VsZi5weV9tb2R1bGVzID0gTm9uZQorICAgICAgICBzZWxmLnBhY2thZ2UgPSBOb25lCisgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0gTm9uZQorICAgICAgICBzZWxmLnBhY2thZ2VfZGlyID0gTm9uZQorICAgICAgICBzZWxmLmNvbXBpbGUgPSAwCisgICAgICAgIHNlbGYub3B0aW1pemUgPSAwCisgICAgICAgIHNlbGYuZm9yY2UgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2J1aWxkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9saWInLCAnYnVpbGRfbGliJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZm9yY2UnLCAnZm9yY2UnKSkKKworICAgICAgICAjIEdldCB0aGUgZGlzdHJpYnV0aW9uIG9wdGlvbnMgdGhhdCBhcmUgYWxpYXNlcyBmb3IgYnVpbGRfcHkKKyAgICAgICAgIyBvcHRpb25zIC0tIGxpc3Qgb2YgcGFja2FnZXMgYW5kIGxpc3Qgb2YgbW9kdWxlcy4KKyAgICAgICAgc2VsZi5wYWNrYWdlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VzCisgICAgICAgIHNlbGYucHlfbW9kdWxlcyA9IHNlbGYuZGlzdHJpYnV0aW9uLnB5X21vZHVsZXMKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RhdGEKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RpciA9IHt9CisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLnBhY2thZ2VfZGlyOgorICAgICAgICAgICAgZm9yIG5hbWUsIHBhdGggaW4gc2VsZi5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGlyW25hbWVdID0gY29udmVydF9wYXRoKHBhdGgpCisgICAgICAgIHNlbGYuZGF0YV9maWxlcyA9IHNlbGYuZ2V0X2RhdGFfZmlsZXMoKQorCisgICAgICAgICMgSWNrLCBjb3BpZWQgc3RyYWlnaHQgZnJvbSBpbnN0YWxsX2xpYi5weSAoZmFuY3lfZ2V0b3B0IG5lZWRzIGEKKyAgICAgICAgIyB0eXBlIHN5c3RlbSEgIEhlbGwsICpldmVyeXRoaW5nKiBuZWVkcyBhIHR5cGUgc3lzdGVtISEhKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLm9wdGltaXplLCBpbnQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemUgPSBpbnQoc2VsZi5vcHRpbWl6ZSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgMCA8PSBzZWxmLm9wdGltaXplIDw9IDIKKyAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJvcHRpbWl6ZSBtdXN0IGJlIDAsIDEsIG9yIDIiKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBYWFggY29weV9maWxlIGJ5IGRlZmF1bHQgcHJlc2VydmVzIGF0aW1lIGFuZCBtdGltZS4gIElNSE8gdGhpcyBpcworICAgICAgICAjIHRoZSByaWdodCB0aGluZyB0byBkbywgYnV0IHBlcmhhcHMgaXQgc2hvdWxkIGJlIGFuIG9wdGlvbiAtLSBpbgorICAgICAgICAjIHBhcnRpY3VsYXIsIGEgc2l0ZSBhZG1pbmlzdHJhdG9yIG1pZ2h0IHdhbnQgaW5zdGFsbGVkIGZpbGVzIHRvCisgICAgICAgICMgcmVmbGVjdCB0aGUgdGltZSBvZiBpbnN0YWxsYXRpb24gcmF0aGVyIHRoYW4gdGhlIGxhc3QKKyAgICAgICAgIyBtb2RpZmljYXRpb24gdGltZSBiZWZvcmUgdGhlIGluc3RhbGxlZCByZWxlYXNlLgorCisgICAgICAgICMgWFhYIGNvcHlfZmlsZSBieSBkZWZhdWx0IHByZXNlcnZlcyBtb2RlLCB3aGljaCBhcHBlYXJzIHRvIGJlIHRoZQorICAgICAgICAjIHdyb25nIHRoaW5nIHRvIGRvOiBpZiBhIGZpbGUgaXMgcmVhZC1vbmx5IGluIHRoZSB3b3JraW5nCisgICAgICAgICMgZGlyZWN0b3J5LCB3ZSB3YW50IGl0IHRvIGJlIGluc3RhbGxlZCByZWFkL3dyaXRlIHNvIHRoYXQgdGhlIG5leHQKKyAgICAgICAgIyBpbnN0YWxsYXRpb24gb2YgdGhlIHNhbWUgbW9kdWxlIGRpc3RyaWJ1dGlvbiBjYW4gb3ZlcndyaXRlIGl0CisgICAgICAgICMgd2l0aG91dCBwcm9ibGVtcy4gIChUaGlzIG1pZ2h0IGJlIGEgVW5peC1zcGVjaWZpYyBpc3N1ZS4pICBUaHVzCisgICAgICAgICMgd2UgdHVybiBvZmYgJ3ByZXNlcnZlX21vZGUnIHdoZW4gY29weWluZyB0byB0aGUgYnVpbGQgZGlyZWN0b3J5LAorICAgICAgICAjIHNpbmNlIHRoZSBidWlsZCBkaXJlY3RvcnkgaXMgc3VwcG9zZWQgdG8gYmUgZXhhY3RseSB3aGF0IHRoZQorICAgICAgICAjIGluc3RhbGxhdGlvbiB3aWxsIGxvb2sgbGlrZSAoaWUuIHdlIHByZXNlcnZlIG1vZGUgd2hlbgorICAgICAgICAjIGluc3RhbGxpbmcpLgorCisgICAgICAgICMgVHdvIG9wdGlvbnMgY29udHJvbCB3aGljaCBtb2R1bGVzIHdpbGwgYmUgaW5zdGFsbGVkOiAncGFja2FnZXMnCisgICAgICAgICMgYW5kICdweV9tb2R1bGVzJy4gIFRoZSBmb3JtZXIgbGV0cyB1cyB3b3JrIHdpdGggd2hvbGUgcGFja2FnZXMsIG5vdAorICAgICAgICAjIHNwZWNpZnlpbmcgaW5kaXZpZHVhbCBtb2R1bGVzIGF0IGFsbDsgdGhlIGxhdHRlciBpcyBmb3IKKyAgICAgICAgIyBzcGVjaWZ5aW5nIG1vZHVsZXMgb25lLWF0LWEtdGltZS4KKworICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX21vZHVsZXMoKQorICAgICAgICBpZiBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgc2VsZi5idWlsZF9wYWNrYWdlcygpCisgICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VfZGF0YSgpCisKKyAgICAgICAgc2VsZi5ieXRlX2NvbXBpbGUoc2VsZi5nZXRfb3V0cHV0cyhpbmNsdWRlX2J5dGVjb2RlPTApKQorCisgICAgZGVmIGdldF9kYXRhX2ZpbGVzKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBsaXN0IG9mICcocGFja2FnZSxzcmNfZGlyLGJ1aWxkX2RpcixmaWxlbmFtZXMpJyB0dXBsZXMiIiIKKyAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIGlmIG5vdCBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gc2VsZi5wYWNrYWdlczoKKyAgICAgICAgICAgICMgTG9jYXRlIHBhY2thZ2Ugc291cmNlIGRpcmVjdG9yeQorICAgICAgICAgICAgc3JjX2RpciA9IHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCisKKyAgICAgICAgICAgICMgQ29tcHV0ZSBwYWNrYWdlIGJ1aWxkIGRpcmVjdG9yeQorICAgICAgICAgICAgYnVpbGRfZGlyID0gb3MucGF0aC5qb2luKCooW3NlbGYuYnVpbGRfbGliXSArIHBhY2thZ2Uuc3BsaXQoJy4nKSkpCisKKyAgICAgICAgICAgICMgTGVuZ3RoIG9mIHBhdGggdG8gc3RyaXAgZnJvbSBmb3VuZCBmaWxlcworICAgICAgICAgICAgcGxlbiA9IDAKKyAgICAgICAgICAgIGlmIHNyY19kaXI6CisgICAgICAgICAgICAgICAgcGxlbiA9IGxlbihzcmNfZGlyKSsxCisKKyAgICAgICAgICAgICMgU3RyaXAgZGlyZWN0b3J5IGZyb20gZ2xvYmJlZCBmaWxlbmFtZXMKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IFsKKyAgICAgICAgICAgICAgICBmaWxlW3BsZW46XSBmb3IgZmlsZSBpbiBzZWxmLmZpbmRfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyKQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKChwYWNrYWdlLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcykpCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgZmluZF9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIpOgorICAgICAgICAiIiJSZXR1cm4gZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKKyAgICAgICAgZ2xvYnMgPSAoc2VsZi5wYWNrYWdlX2RhdGEuZ2V0KCcnLCBbXSkKKyAgICAgICAgICAgICAgICAgKyBzZWxmLnBhY2thZ2VfZGF0YS5nZXQocGFja2FnZSwgW10pKQorICAgICAgICBmaWxlcyA9IFtdCisgICAgICAgIGZvciBwYXR0ZXJuIGluIGdsb2JzOgorICAgICAgICAgICAgIyBFYWNoIHBhdHRlcm4gaGFzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBsYXRmb3JtLXNwZWNpZmljIHBhdGgKKyAgICAgICAgICAgIGZpbGVsaXN0ID0gZ2xvYihvcy5wYXRoLmpvaW4oc3JjX2RpciwgY29udmVydF9wYXRoKHBhdHRlcm4pKSkKKyAgICAgICAgICAgICMgRmlsZXMgdGhhdCBtYXRjaCBtb3JlIHRoYW4gb25lIHBhdHRlcm4gYXJlIG9ubHkgYWRkZWQgb25jZQorICAgICAgICAgICAgZmlsZXMuZXh0ZW5kKFtmbiBmb3IgZm4gaW4gZmlsZWxpc3QgaWYgZm4gbm90IGluIGZpbGVzXSkKKyAgICAgICAgcmV0dXJuIGZpbGVzCisKKyAgICBkZWYgYnVpbGRfcGFja2FnZV9kYXRhKHNlbGYpOgorICAgICAgICAiIiJDb3B5IGRhdGEgZmlsZXMgaW50byBidWlsZCBkaXJlY3RvcnkiIiIKKyAgICAgICAgZm9yIHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzIGluIHNlbGYuZGF0YV9maWxlczoKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5ta3BhdGgob3MucGF0aC5kaXJuYW1lKHRhcmdldCkpCisgICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUob3MucGF0aC5qb2luKHNyY19kaXIsIGZpbGVuYW1lKSwgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlX21vZGU9RmFsc2UpCisKKyAgICBkZWYgZ2V0X3BhY2thZ2VfZGlyKHNlbGYsIHBhY2thZ2UpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGRpcmVjdG9yeSwgcmVsYXRpdmUgdG8gdGhlIHRvcCBvZiB0aGUgc291cmNlCisgICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgd2hlcmUgcGFja2FnZSAncGFja2FnZScgc2hvdWxkIGJlIGZvdW5kCisgICAgICAgICAgIChhdCBsZWFzdCBhY2NvcmRpbmcgdG8gdGhlICdwYWNrYWdlX2Rpcicgb3B0aW9uLCBpZiBhbnkpLiIiIgorCisgICAgICAgIHBhdGggPSBwYWNrYWdlLnNwbGl0KCcuJykKKworICAgICAgICBpZiBub3Qgc2VsZi5wYWNrYWdlX2RpcjoKKyAgICAgICAgICAgIGlmIHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YWlsID0gW10KKyAgICAgICAgICAgIHdoaWxlIHBhdGg6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwZGlyID0gc2VsZi5wYWNrYWdlX2RpclsnLicuam9pbihwYXRoKV0KKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHRhaWwuaW5zZXJ0KDAsIHBhdGhbLTFdKQorICAgICAgICAgICAgICAgICAgICBkZWwgcGF0aFstMV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0YWlsLmluc2VydCgwLCBwZGlyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKCp0YWlsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE9vcHMsIGdvdCBhbGwgdGhlIHdheSB0aHJvdWdoICdwYXRoJyB3aXRob3V0IGZpbmRpbmcgYQorICAgICAgICAgICAgICAgICMgbWF0Y2ggaW4gcGFja2FnZV9kaXIuICBJZiBwYWNrYWdlX2RpciBkZWZpbmVzIGEgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgIyBmb3IgdGhlIHJvb3QgKG5hbWVsZXNzKSBwYWNrYWdlLCB0aGVuIGZhbGxiYWNrIG9uIGl0OworICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCB3ZSBtaWdodCBhcyB3ZWxsIGhhdmUgbm90IGNvbnN1bHRlZAorICAgICAgICAgICAgICAgICMgcGFja2FnZV9kaXIgYXQgYWxsLCBhcyB3ZSBqdXN0IHVzZSB0aGUgZGlyZWN0b3J5IGltcGxpZWQKKyAgICAgICAgICAgICAgICAjIGJ5ICd0YWlsJyAod2hpY2ggc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBvcmlnaW5hbCB2YWx1ZQorICAgICAgICAgICAgICAgICMgb2YgJ3BhdGgnIGF0IHRoaXMgcG9pbnQpLgorICAgICAgICAgICAgICAgIHBkaXIgPSBzZWxmLnBhY2thZ2VfZGlyLmdldCgnJykKKyAgICAgICAgICAgICAgICBpZiBwZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB0YWlsLmluc2VydCgwLCBwZGlyKQorCisgICAgICAgICAgICAgICAgaWYgdGFpbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqdGFpbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJycKKworICAgIGRlZiBjaGVja19wYWNrYWdlKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKToKKyAgICAgICAgIyBFbXB0eSBkaXIgbmFtZSBtZWFucyBjdXJyZW50IGRpcmVjdG9yeSwgd2hpY2ggd2UgY2FuIHByb2JhYmx5CisgICAgICAgICMgYXNzdW1lIGV4aXN0cy4gIEFsc28sIG9zLnBhdGguZXhpc3RzIGFuZCBpc2RpciBkb24ndCBrbm93IGFib3V0CisgICAgICAgICMgbXkgImVtcHR5IHN0cmluZyBtZWFucyBjdXJyZW50IGRpciIgY29udmVudGlvbiwgc28gd2UgaGF2ZSB0bworICAgICAgICAjIGNpcmN1bXZlbnQgdGhlbS4KKyAgICAgICAgaWYgcGFja2FnZV9kaXIgIT0gIiI6CisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGFja2FnZV9kaXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBkaXJlY3RvcnkgJyVzJyBkb2VzIG5vdCBleGlzdCIgJSBwYWNrYWdlX2RpcikKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhY2thZ2VfZGlyKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3NlZCBwYWNrYWdlIGRpcmVjdG9yeSAnJXMnIGV4aXN0cywgIgorICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGlzIG5vdCBhIGRpcmVjdG9yeSIgJSBwYWNrYWdlX2RpcikKKworICAgICAgICAjIFJlcXVpcmUgX19pbml0X18ucHkgZm9yIGFsbCBidXQgdGhlICJyb290IHBhY2thZ2UiCisgICAgICAgIGlmIHBhY2thZ2U6CisgICAgICAgICAgICBpbml0X3B5ID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLCAiX19pbml0X18ucHkiKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaW5pdF9weSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJwYWNrYWdlIGluaXQgZmlsZSAnJXMnIG5vdCBmb3VuZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIihvciBub3QgYSByZWd1bGFyIGZpbGUpIiksIGluaXRfcHkpCisKKyAgICAgICAgIyBFaXRoZXIgbm90IGluIGEgcGFja2FnZSBhdCBhbGwgKF9faW5pdF9fLnB5IG5vdCBleHBlY3RlZCksIG9yCisgICAgICAgICMgX19pbml0X18ucHkgZG9lc24ndCBleGlzdCAtLSBzbyBkb24ndCByZXR1cm4gdGhlIGZpbGVuYW1lLgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGNoZWNrX21vZHVsZShzZWxmLCBtb2R1bGUsIG1vZHVsZV9maWxlKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKG1vZHVsZV9maWxlKToKKyAgICAgICAgICAgIGxvZy53YXJuKCJmaWxlICVzIChmb3IgbW9kdWxlICVzKSBub3QgZm91bmQiLCBtb2R1bGVfZmlsZSwgbW9kdWxlKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGZpbmRfcGFja2FnZV9tb2R1bGVzKHNlbGYsIHBhY2thZ2UsIHBhY2thZ2VfZGlyKToKKyAgICAgICAgc2VsZi5jaGVja19wYWNrYWdlKHBhY2thZ2UsIHBhY2thZ2VfZGlyKQorICAgICAgICBtb2R1bGVfZmlsZXMgPSBnbG9iKG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgIioucHkiKSkKKyAgICAgICAgbW9kdWxlcyA9IFtdCisgICAgICAgIHNldHVwX3NjcmlwdCA9IG9zLnBhdGguYWJzcGF0aChzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRfbmFtZSkKKworICAgICAgICBmb3IgZiBpbiBtb2R1bGVfZmlsZXM6CisgICAgICAgICAgICBhYnNfZiA9IG9zLnBhdGguYWJzcGF0aChmKQorICAgICAgICAgICAgaWYgYWJzX2YgIT0gc2V0dXBfc2NyaXB0OgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShmKSlbMF0KKyAgICAgICAgICAgICAgICBtb2R1bGVzLmFwcGVuZCgocGFja2FnZSwgbW9kdWxlLCBmKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZXhjbHVkaW5nICVzIiAlIHNldHVwX3NjcmlwdCkKKyAgICAgICAgcmV0dXJuIG1vZHVsZXMKKworICAgIGRlZiBmaW5kX21vZHVsZXMoc2VsZik6CisgICAgICAgICIiIkZpbmRzIGluZGl2aWR1YWxseS1zcGVjaWZpZWQgUHl0aG9uIG1vZHVsZXMsIGllLiB0aG9zZSBsaXN0ZWQgYnkKKyAgICAgICAgbW9kdWxlIG5hbWUgaW4gJ3NlbGYucHlfbW9kdWxlcycuICBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgKHBhY2thZ2UsCisgICAgICAgIG1vZHVsZV9iYXNlLCBmaWxlbmFtZSk6ICdwYWNrYWdlJyBpcyBhIHR1cGxlIG9mIHRoZSBwYXRoIHRocm91Z2gKKyAgICAgICAgcGFja2FnZS1zcGFjZSB0byB0aGUgbW9kdWxlOyAnbW9kdWxlX2Jhc2UnIGlzIHRoZSBiYXJlIChubworICAgICAgICBwYWNrYWdlcywgbm8gZG90cykgbW9kdWxlIG5hbWUsIGFuZCAnZmlsZW5hbWUnIGlzIHRoZSBwYXRoIHRvIHRoZQorICAgICAgICAiLnB5IiBmaWxlIChyZWxhdGl2ZSB0byB0aGUgZGlzdHJpYnV0aW9uIHJvb3QpIHRoYXQgaW1wbGVtZW50cyB0aGUKKyAgICAgICAgbW9kdWxlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBNYXAgcGFja2FnZSBuYW1lcyB0byB0dXBsZXMgb2YgdXNlZnVsIGluZm8gYWJvdXQgdGhlIHBhY2thZ2U6CisgICAgICAgICMgICAgKHBhY2thZ2VfZGlyLCBjaGVja2VkKQorICAgICAgICAjIHBhY2thZ2VfZGlyIC0gdGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSdsbCBmaW5kIHNvdXJjZSBmaWxlcyBmb3IKKyAgICAgICAgIyAgIHRoaXMgcGFja2FnZQorICAgICAgICAjIGNoZWNrZWQgLSB0cnVlIGlmIHdlIGhhdmUgY2hlY2tlZCB0aGF0IHRoZSBwYWNrYWdlIGRpcmVjdG9yeQorICAgICAgICAjICAgaXMgdmFsaWQgKGV4aXN0cywgY29udGFpbnMgX19pbml0X18ucHksIC4uLiA/KQorICAgICAgICBwYWNrYWdlcyA9IHt9CisKKyAgICAgICAgIyBMaXN0IG9mIChwYWNrYWdlLCBtb2R1bGUsIGZpbGVuYW1lKSB0dXBsZXMgdG8gcmV0dXJuCisgICAgICAgIG1vZHVsZXMgPSBbXQorCisgICAgICAgICMgV2UgdHJlYXQgbW9kdWxlcy1pbi1wYWNrYWdlcyBhbG1vc3QgdGhlIHNhbWUgYXMgdG9wbGV2ZWwgbW9kdWxlcywKKyAgICAgICAgIyBqdXN0IHRoZSAicGFja2FnZSIgZm9yIGEgdG9wbGV2ZWwgaXMgZW1wdHkgKGVpdGhlciBhbiBlbXB0eQorICAgICAgICAjIHN0cmluZyBvciBlbXB0eSBsaXN0LCBkZXBlbmRpbmcgb24gY29udGV4dCkuICBEaWZmZXJlbmNlczoKKyAgICAgICAgIyAgIC0gZG9uJ3QgY2hlY2sgZm9yIF9faW5pdF9fLnB5IGluIGRpcmVjdG9yeSBmb3IgZW1wdHkgcGFja2FnZQorICAgICAgICBmb3IgbW9kdWxlIGluIHNlbGYucHlfbW9kdWxlczoKKyAgICAgICAgICAgIHBhdGggPSBtb2R1bGUuc3BsaXQoJy4nKQorICAgICAgICAgICAgcGFja2FnZSA9ICcuJy5qb2luKHBhdGhbMDotMV0pCisgICAgICAgICAgICBtb2R1bGVfYmFzZSA9IHBhdGhbLTFdCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAocGFja2FnZV9kaXIsIGNoZWNrZWQpID0gcGFja2FnZXNbcGFja2FnZV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2RpciA9IHNlbGYuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCisgICAgICAgICAgICAgICAgY2hlY2tlZCA9IDAKKworICAgICAgICAgICAgaWYgbm90IGNoZWNrZWQ6CisgICAgICAgICAgICAgICAgaW5pdF9weSA9IHNlbGYuY2hlY2tfcGFja2FnZShwYWNrYWdlLCBwYWNrYWdlX2RpcikKKyAgICAgICAgICAgICAgICBwYWNrYWdlc1twYWNrYWdlXSA9IChwYWNrYWdlX2RpciwgMSkKKyAgICAgICAgICAgICAgICBpZiBpbml0X3B5OgorICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFwcGVuZCgocGFja2FnZSwgIl9faW5pdF9fIiwgaW5pdF9weSkpCisKKyAgICAgICAgICAgICMgWFhYIHBlcmhhcHMgd2Ugc2hvdWxkIGFsc28gY2hlY2sgZm9yIGp1c3QgLnB5YyBmaWxlcworICAgICAgICAgICAgIyAoc28gZ3JlZWR5IGNsb3NlZC1zb3VyY2UgYmFzdGFyZHMgY2FuIGRpc3RyaWJ1dGUgUHl0aG9uCisgICAgICAgICAgICAjIG1vZHVsZXMgdG9vKQorICAgICAgICAgICAgbW9kdWxlX2ZpbGUgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsIG1vZHVsZV9iYXNlICsgIi5weSIpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jaGVja19tb2R1bGUobW9kdWxlLCBtb2R1bGVfZmlsZSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQoKHBhY2thZ2UsIG1vZHVsZV9iYXNlLCBtb2R1bGVfZmlsZSkpCisKKyAgICAgICAgcmV0dXJuIG1vZHVsZXMKKworICAgIGRlZiBmaW5kX2FsbF9tb2R1bGVzKHNlbGYpOgorICAgICAgICAiIiJDb21wdXRlIHRoZSBsaXN0IG9mIGFsbCBtb2R1bGVzIHRoYXQgd2lsbCBiZSBidWlsdCwgd2hldGhlcgorICAgICAgICB0aGV5IGFyZSBzcGVjaWZpZWQgb25lLW1vZHVsZS1hdC1hLXRpbWUgKCdzZWxmLnB5X21vZHVsZXMnKSBvcgorICAgICAgICBieSB3aG9sZSBwYWNrYWdlcyAoJ3NlbGYucGFja2FnZXMnKS4gIFJldHVybiBhIGxpc3Qgb2YgdHVwbGVzCisgICAgICAgIChwYWNrYWdlLCBtb2R1bGUsIG1vZHVsZV9maWxlKSwganVzdCBsaWtlICdmaW5kX21vZHVsZXMoKScgYW5kCisgICAgICAgICdmaW5kX3BhY2thZ2VfbW9kdWxlcygpJyBkby4iIiIKKyAgICAgICAgbW9kdWxlcyA9IFtdCisgICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKKyAgICAgICAgICAgIG1vZHVsZXMuZXh0ZW5kKHNlbGYuZmluZF9tb2R1bGVzKCkpCisgICAgICAgIGlmIHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzOgorICAgICAgICAgICAgICAgIHBhY2thZ2VfZGlyID0gc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKKyAgICAgICAgICAgICAgICBtID0gc2VsZi5maW5kX3BhY2thZ2VfbW9kdWxlcyhwYWNrYWdlLCBwYWNrYWdlX2RpcikKKyAgICAgICAgICAgICAgICBtb2R1bGVzLmV4dGVuZChtKQorICAgICAgICByZXR1cm4gbW9kdWxlcworCisgICAgZGVmIGdldF9zb3VyY2VfZmlsZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbbW9kdWxlWy0xXSBmb3IgbW9kdWxlIGluIHNlbGYuZmluZF9hbGxfbW9kdWxlcygpXQorCisgICAgZGVmIGdldF9tb2R1bGVfb3V0ZmlsZShzZWxmLCBidWlsZF9kaXIsIHBhY2thZ2UsIG1vZHVsZSk6CisgICAgICAgIG91dGZpbGVfcGF0aCA9IFtidWlsZF9kaXJdICsgbGlzdChwYWNrYWdlKSArIFttb2R1bGUgKyAiLnB5Il0KKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbigqb3V0ZmlsZV9wYXRoKQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYsIGluY2x1ZGVfYnl0ZWNvZGU9MSk6CisgICAgICAgIG1vZHVsZXMgPSBzZWxmLmZpbmRfYWxsX21vZHVsZXMoKQorICAgICAgICBvdXRwdXRzID0gW10KKyAgICAgICAgZm9yIChwYWNrYWdlLCBtb2R1bGUsIG1vZHVsZV9maWxlKSBpbiBtb2R1bGVzOgorICAgICAgICAgICAgcGFja2FnZSA9IHBhY2thZ2Uuc3BsaXQoJy4nKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9tb2R1bGVfb3V0ZmlsZShzZWxmLmJ1aWxkX2xpYiwgcGFja2FnZSwgbW9kdWxlKQorICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBpbmNsdWRlX2J5dGVjb2RlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29tcGlsZToKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUgKyAiYyIpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGZpbGVuYW1lICsgIm8iKQorCisgICAgICAgIG91dHB1dHMgKz0gWworICAgICAgICAgICAgb3MucGF0aC5qb2luKGJ1aWxkX2RpciwgZmlsZW5hbWUpCisgICAgICAgICAgICBmb3IgcGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMgaW4gc2VsZi5kYXRhX2ZpbGVzCisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzCisgICAgICAgICAgICBdCisKKyAgICAgICAgcmV0dXJuIG91dHB1dHMKKworICAgIGRlZiBidWlsZF9tb2R1bGUoc2VsZiwgbW9kdWxlLCBtb2R1bGVfZmlsZSwgcGFja2FnZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocGFja2FnZSwgc3RyKToKKyAgICAgICAgICAgIHBhY2thZ2UgPSBwYWNrYWdlLnNwbGl0KCcuJykKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShwYWNrYWdlLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICIncGFja2FnZScgbXVzdCBiZSBhIHN0cmluZyAoZG90LXNlcGFyYXRlZCksIGxpc3QsIG9yIHR1cGxlIikKKworICAgICAgICAjIE5vdyBwdXQgdGhlIG1vZHVsZSBzb3VyY2UgZmlsZSBpbnRvIHRoZSAiYnVpbGQiIGFyZWEgLS0gdGhpcyBpcworICAgICAgICAjIGVhc3ksIHdlIGp1c3QgY29weSBpdCBzb21ld2hlcmUgdW5kZXIgc2VsZi5idWlsZF9saWIgKHRoZSBidWlsZAorICAgICAgICAjIGRpcmVjdG9yeSBmb3IgUHl0aG9uIHNvdXJjZSkuCisgICAgICAgIG91dGZpbGUgPSBzZWxmLmdldF9tb2R1bGVfb3V0ZmlsZShzZWxmLmJ1aWxkX2xpYiwgcGFja2FnZSwgbW9kdWxlKQorICAgICAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3V0ZmlsZSkKKyAgICAgICAgc2VsZi5ta3BhdGgoZGlyKQorICAgICAgICByZXR1cm4gc2VsZi5jb3B5X2ZpbGUobW9kdWxlX2ZpbGUsIG91dGZpbGUsIHByZXNlcnZlX21vZGU9MCkKKworICAgIGRlZiBidWlsZF9tb2R1bGVzKHNlbGYpOgorICAgICAgICBtb2R1bGVzID0gc2VsZi5maW5kX21vZHVsZXMoKQorICAgICAgICBmb3IgKHBhY2thZ2UsIG1vZHVsZSwgbW9kdWxlX2ZpbGUpIGluIG1vZHVsZXM6CisKKyAgICAgICAgICAgICMgTm93ICJidWlsZCIgdGhlIG1vZHVsZSAtLSBpZS4gY29weSB0aGUgc291cmNlIGZpbGUgdG8KKyAgICAgICAgICAgICMgc2VsZi5idWlsZF9saWIgKHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIFB5dGhvbiBzb3VyY2UpLgorICAgICAgICAgICAgIyAoQWN0dWFsbHksIGl0IGdldHMgY29waWVkIHRvIHRoZSBkaXJlY3RvcnkgZm9yIHRoaXMgcGFja2FnZQorICAgICAgICAgICAgIyB1bmRlciBzZWxmLmJ1aWxkX2xpYi4pCisgICAgICAgICAgICBzZWxmLmJ1aWxkX21vZHVsZShtb2R1bGUsIG1vZHVsZV9maWxlLCBwYWNrYWdlKQorCisgICAgZGVmIGJ1aWxkX3BhY2thZ2VzKHNlbGYpOgorICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzOgorCisgICAgICAgICAgICAjIEdldCBsaXN0IG9mIChwYWNrYWdlLCBtb2R1bGUsIG1vZHVsZV9maWxlKSB0dXBsZXMgYmFzZWQgb24KKyAgICAgICAgICAgICMgc2Nhbm5pbmcgdGhlIHBhY2thZ2UgZGlyZWN0b3J5LiAgJ3BhY2thZ2UnIGlzIG9ubHkgaW5jbHVkZWQKKyAgICAgICAgICAgICMgaW4gdGhlIHR1cGxlIHNvIHRoYXQgJ2ZpbmRfbW9kdWxlcygpJyBhbmQKKyAgICAgICAgICAgICMgJ2ZpbmRfcGFja2FnZV90dXBsZXMoKScgaGF2ZSBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlOyBpdCdzCisgICAgICAgICAgICAjIGlnbm9yZWQgaGVyZSAoYXBhcnQgZnJvbSBhIHNhbml0eSBjaGVjaykuICBBbHNvLCAnbW9kdWxlJyBpcworICAgICAgICAgICAgIyB0aGUgKnVucXVhbGlmaWVkKiBtb2R1bGUgbmFtZSAoaWUuIG5vIGRvdHMsIG5vIHBhY2thZ2UgLS0gd2UKKyAgICAgICAgICAgICMgYWxyZWFkeSBrbm93IGl0cyBwYWNrYWdlISksIGFuZCAnbW9kdWxlX2ZpbGUnIGlzIHRoZSBwYXRoIHRvCisgICAgICAgICAgICAjIHRoZSAucHkgZmlsZSwgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisgICAgICAgICAgICAjIChpZS4gaW5jbHVkaW5nICdwYWNrYWdlX2RpcicpLgorICAgICAgICAgICAgcGFja2FnZV9kaXIgPSBzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQorICAgICAgICAgICAgbW9kdWxlcyA9IHNlbGYuZmluZF9wYWNrYWdlX21vZHVsZXMocGFja2FnZSwgcGFja2FnZV9kaXIpCisKKyAgICAgICAgICAgICMgTm93IGxvb3Agb3ZlciB0aGUgbW9kdWxlcyB3ZSBmb3VuZCwgImJ1aWxkaW5nIiBlYWNoIG9uZSAoanVzdAorICAgICAgICAgICAgIyBjb3B5IGl0IHRvIHNlbGYuYnVpbGRfbGliKS4KKyAgICAgICAgICAgIGZvciAocGFja2FnZV8sIG1vZHVsZSwgbW9kdWxlX2ZpbGUpIGluIG1vZHVsZXM6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHBhY2thZ2UgPT0gcGFja2FnZV8KKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX21vZHVsZShtb2R1bGUsIG1vZHVsZV9maWxlLCBwYWNrYWdlKQorCisgICAgZGVmIGJ5dGVfY29tcGlsZShzZWxmLCBmaWxlcyk6CisgICAgICAgIGlmIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgc2VsZi53YXJuKCdieXRlLWNvbXBpbGluZyBpcyBkaXNhYmxlZCwgc2tpcHBpbmcuJykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQorICAgICAgICBwcmVmaXggPSBzZWxmLmJ1aWxkX2xpYgorICAgICAgICBpZiBwcmVmaXhbLTFdICE9IG9zLnNlcDoKKyAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeCArIG9zLnNlcAorCisgICAgICAgICMgWFhYIHRoaXMgY29kZSBpcyBlc3NlbnRpYWxseSB0aGUgc2FtZSBhcyB0aGUgJ2J5dGVfY29tcGlsZSgpCisgICAgICAgICMgbWV0aG9kIG9mIHRoZSAiaW5zdGFsbF9saWIiIGNvbW1hbmQsIGV4Y2VwdCBmb3IgdGhlIGRldGVybWluYXRpb24KKyAgICAgICAgIyBvZiB0aGUgJ3ByZWZpeCcgc3RyaW5nLiAgSG1tbS4KKworICAgICAgICBpZiBzZWxmLmNvbXBpbGU6CisgICAgICAgICAgICBieXRlX2NvbXBpbGUoZmlsZXMsIG9wdGltaXplPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9c2VsZi5mb3JjZSwgcHJlZml4PXByZWZpeCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgIGlmIHNlbGYub3B0aW1pemUgPiAwOgorICAgICAgICAgICAgYnl0ZV9jb21waWxlKGZpbGVzLCBvcHRpbWl6ZT1zZWxmLm9wdGltaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPXNlbGYuZm9yY2UsIHByZWZpeD1wcmVmaXgsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3B5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjY0MmVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3B5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzY4YjM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9weS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2N2RmNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHkKQEAgLTAsMCArMSwxMzEgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3NjcmlwdHMKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdidWlsZF9zY3JpcHRzJyBjb21tYW5kLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zLCByZQorZnJvbSBzdGF0IGltcG9ydCBTVF9NT0RFCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCisjIGNoZWNrIGlmIFB5dGhvbiBpcyBjYWxsZWQgb24gdGhlIGZpcnN0IGxpbmUgd2l0aCB0aGlzIGV4cHJlc3Npb24KK2ZpcnN0X2xpbmVfcmUgPSByZS5jb21waWxlKCdeIyEuKnB5dGhvblswLTkuXSooWyBcdF0uKik/JCcpCisKK2NsYXNzIGJ1aWxkX3NjcmlwdHMgKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiXCJidWlsZFwiIHNjcmlwdHMgKGNvcHkgYW5kIGZpeHVwICMhIGxpbmUpIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2J1aWxkLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gXCJidWlsZFwiIChjb3B5KSB0byIpLAorICAgICAgICAoJ2ZvcmNlJywgJ2YnLCAiZm9yY2libHkgYnVpbGQgZXZlcnl0aGluZyAoaWdub3JlIGZpbGUgdGltZXN0YW1wcyIpLAorICAgICAgICAoJ2V4ZWN1dGFibGU9JywgJ2UnLCAic3BlY2lmeSBmaW5hbCBkZXN0aW5hdGlvbiBpbnRlcnByZXRlciBwYXRoIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnZm9yY2UnXQorCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5idWlsZF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuc2NyaXB0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JjZSA9IE5vbmUKKyAgICAgICAgc2VsZi5leGVjdXRhYmxlID0gTm9uZQorICAgICAgICBzZWxmLm91dGZpbGVzID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYnVpbGQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX3NjcmlwdHMnLCAnYnVpbGRfZGlyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZm9yY2UnLCAnZm9yY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdleGVjdXRhYmxlJywgJ2V4ZWN1dGFibGUnKSkKKyAgICAgICAgc2VsZi5zY3JpcHRzID0gc2VsZi5kaXN0cmlidXRpb24uc2NyaXB0cworCisgICAgZGVmIGdldF9zb3VyY2VfZmlsZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNjcmlwdHMKKworICAgIGRlZiBydW4gKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5zY3JpcHRzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuY29weV9zY3JpcHRzKCkKKworCisgICAgZGVmIGNvcHlfc2NyaXB0cyAoc2VsZik6CisgICAgICAgICIiIkNvcHkgZWFjaCBzY3JpcHQgbGlzdGVkIGluICdzZWxmLnNjcmlwdHMnOyBpZiBpdCdzIG1hcmtlZCBhcyBhCisgICAgICAgIFB5dGhvbiBzY3JpcHQgaW4gdGhlIFVuaXggd2F5IChmaXJzdCBsaW5lIG1hdGNoZXMgJ2ZpcnN0X2xpbmVfcmUnLAorICAgICAgICBpZS4gc3RhcnRzIHdpdGggIlwjISIgYW5kIGNvbnRhaW5zICJweXRob24iKSwgdGhlbiBhZGp1c3QgdGhlIGZpcnN0CisgICAgICAgIGxpbmUgdG8gcmVmZXIgdG8gdGhlIGN1cnJlbnQgUHl0aG9uIGludGVycHJldGVyIGFzIHdlIGNvcHkuCisgICAgICAgICIiIgorICAgICAgICBfc3lzY29uZmlnID0gX19pbXBvcnRfXygnc3lzY29uZmlnJykKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9kaXIpCisgICAgICAgIG91dGZpbGVzID0gW10KKyAgICAgICAgZm9yIHNjcmlwdCBpbiBzZWxmLnNjcmlwdHM6CisgICAgICAgICAgICBhZGp1c3QgPSAwCisgICAgICAgICAgICBzY3JpcHQgPSBjb252ZXJ0X3BhdGgoc2NyaXB0KQorICAgICAgICAgICAgb3V0ZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Rpciwgb3MucGF0aC5iYXNlbmFtZShzY3JpcHQpKQorICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKG91dGZpbGUpCisKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZvcmNlIGFuZCBub3QgbmV3ZXIoc2NyaXB0LCBvdXRmaWxlKToKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIm5vdCBjb3B5aW5nICVzICh1cC10by1kYXRlKSIsIHNjcmlwdCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIEFsd2F5cyBvcGVuIHRoZSBmaWxlLCBidXQgaWdub3JlIGZhaWx1cmVzIGluIGRyeS1ydW4gbW9kZSAtLQorICAgICAgICAgICAgIyB0aGF0IHdheSwgd2UnbGwgZ2V0IGFjY3VyYXRlIGZlZWRiYWNrIGlmIHdlIGNhbiByZWFkIHRoZQorICAgICAgICAgICAgIyBzY3JpcHQuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oc2NyaXB0LCAiciIpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGYgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZpcnN0X2xpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgZmlyc3RfbGluZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCIlcyBpcyBhbiBlbXB0eSBmaWxlIChza2lwcGluZykiICUgc2NyaXB0KQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgbWF0Y2ggPSBmaXJzdF9saW5lX3JlLm1hdGNoKGZpcnN0X2xpbmUpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIGFkanVzdCA9IDEKKyAgICAgICAgICAgICAgICAgICAgcG9zdF9pbnRlcnAgPSBtYXRjaC5ncm91cCgxKSBvciAnJworCisgICAgICAgICAgICBpZiBhZGp1c3Q6CisgICAgICAgICAgICAgICAgbG9nLmluZm8oImNvcHlpbmcgYW5kIGFkanVzdGluZyAlcyAtPiAlcyIsIHNjcmlwdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX2RpcikKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICBvdXRmID0gb3BlbihvdXRmaWxlLCAidyIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBfc3lzY29uZmlnLmlzX3B5dGhvbl9idWlsZCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0Zi53cml0ZSgiIyElcyVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RfaW50ZXJwKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGYud3JpdGUoIiMhJXMlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiQklORElSIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicHl0aG9uJXMlcyIgJSAoX3N5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiVkVSU0lPTiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIkVYRSIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0X2ludGVycCkpCisgICAgICAgICAgICAgICAgICAgIG91dGYud3JpdGVsaW5lcyhmLnJlYWRsaW5lcygpKQorICAgICAgICAgICAgICAgICAgICBvdXRmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBpZiBmOgorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZjoKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5jb3B5X2ZpbGUoc2NyaXB0LCBvdXRmaWxlKQorCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIGZvciBmaWxlIGluIG91dGZpbGVzOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImNoYW5naW5nIG1vZGUgb2YgJXMiLCBmaWxlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9sZG1vZGUgPSBvcy5zdGF0KGZpbGUpW1NUX01PREVdICYgMDc3NzcKKyAgICAgICAgICAgICAgICAgICAgbmV3bW9kZSA9IChvbGRtb2RlIHwgMDU1NSkgJiAwNzc3NworICAgICAgICAgICAgICAgICAgICBpZiBuZXdtb2RlICE9IG9sZG1vZGU6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiY2hhbmdpbmcgbW9kZSBvZiAlcyBmcm9tICVvIHRvICVvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIG9sZG1vZGUsIG5ld21vZGUpCisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChmaWxlLCBuZXdtb2RlKQorCisgICAgIyBjb3B5X3NjcmlwdHMgKCkKKworIyBjbGFzcyBidWlsZF9zY3JpcHRzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNkNTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX3NjcmlwdHMucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNkNTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9zY3JpcHRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NoZWNrLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTJiZjBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weQpAQCAtMCwwICsxLDE0OSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuY2hlY2sKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdjaGVjaycgY29tbWFuZC4KKyIiIgorX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpc3QgaW1wb3J0IFBLR19JTkZPX0VOQ09ESU5HCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKKwordHJ5OgorICAgICMgZG9jdXRpbHMgaXMgaW5zdGFsbGVkCisgICAgZnJvbSBkb2N1dGlscy51dGlscyBpbXBvcnQgUmVwb3J0ZXIKKyAgICBmcm9tIGRvY3V0aWxzLnBhcnNlcnMucnN0IGltcG9ydCBQYXJzZXIKKyAgICBmcm9tIGRvY3V0aWxzIGltcG9ydCBmcm9udGVuZAorICAgIGZyb20gZG9jdXRpbHMgaW1wb3J0IG5vZGVzCisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworICAgIGNsYXNzIFNpbGVudFJlcG9ydGVyKFJlcG9ydGVyKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCByZXBvcnRfbGV2ZWwsIGhhbHRfbGV2ZWwsIHN0cmVhbT1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgZGVidWc9MCwgZW5jb2Rpbmc9J2FzY2lpJywgZXJyb3JfaGFuZGxlcj0ncmVwbGFjZScpOgorICAgICAgICAgICAgc2VsZi5tZXNzYWdlcyA9IFtdCisgICAgICAgICAgICBSZXBvcnRlci5fX2luaXRfXyhzZWxmLCBzb3VyY2UsIHJlcG9ydF9sZXZlbCwgaGFsdF9sZXZlbCwgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcsIGVuY29kaW5nLCBlcnJvcl9oYW5kbGVyKQorCisgICAgICAgIGRlZiBzeXN0ZW1fbWVzc2FnZShzZWxmLCBsZXZlbCwgbWVzc2FnZSwgKmNoaWxkcmVuLCAqKmt3YXJncyk6CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2VzLmFwcGVuZCgobGV2ZWwsIG1lc3NhZ2UsIGNoaWxkcmVuLCBrd2FyZ3MpKQorICAgICAgICAgICAgcmV0dXJuIG5vZGVzLnN5c3RlbV9tZXNzYWdlKG1lc3NhZ2UsIGxldmVsPWxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9c2VsZi5sZXZlbHNbbGV2ZWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpjaGlsZHJlbiwgKiprd2FyZ3MpCisKKyAgICBIQVNfRE9DVVRJTFMgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBkb2N1dGlscyBpcyBub3QgaW5zdGFsbGVkCisgICAgSEFTX0RPQ1VUSUxTID0gRmFsc2UKKworY2xhc3MgY2hlY2soQ29tbWFuZCk6CisgICAgIiIiVGhpcyBjb21tYW5kIGNoZWNrcyB0aGUgbWV0YS1kYXRhIG9mIHRoZSBwYWNrYWdlLgorICAgICIiIgorICAgIGRlc2NyaXB0aW9uID0gKCJwZXJmb3JtIHNvbWUgY2hlY2tzIG9uIHRoZSBwYWNrYWdlIikKKyAgICB1c2VyX29wdGlvbnMgPSBbKCdtZXRhZGF0YScsICdtJywgJ1ZlcmlmeSBtZXRhLWRhdGEnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdyZXN0cnVjdHVyZWR0ZXh0JywgJ3InLAorICAgICAgICAgICAgICAgICAgICAgKCdDaGVja3MgaWYgbG9uZyBzdHJpbmcgbWV0YS1kYXRhIHN5bnRheCAnCisgICAgICAgICAgICAgICAgICAgICAgJ2FyZSByZVN0cnVjdHVyZWRUZXh0LWNvbXBsaWFudCcpKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzdHJpY3QnLCAncycsCisgICAgICAgICAgICAgICAgICAgICAnV2lsbCBleGl0IHdpdGggYW4gZXJyb3IgaWYgYSBjaGVjayBmYWlscycpXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydtZXRhZGF0YScsICdyZXN0cnVjdHVyZWR0ZXh0JywgJ3N0cmljdCddCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAiIiJTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBvcHRpb25zLiIiIgorICAgICAgICBzZWxmLnJlc3RydWN0dXJlZHRleHQgPSAwCisgICAgICAgIHNlbGYubWV0YWRhdGEgPSAxCisgICAgICAgIHNlbGYuc3RyaWN0ID0gMAorICAgICAgICBzZWxmLl93YXJuaW5ncyA9IDAKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgd2FybihzZWxmLCBtc2cpOgorICAgICAgICAiIiJDb3VudHMgdGhlIG51bWJlciBvZiB3YXJuaW5ncyB0aGF0IG9jY3Vycy4iIiIKKyAgICAgICAgc2VsZi5fd2FybmluZ3MgKz0gMQorICAgICAgICByZXR1cm4gQ29tbWFuZC53YXJuKHNlbGYsIG1zZykKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICIiIlJ1bnMgdGhlIGNvbW1hbmQuIiIiCisgICAgICAgICMgcGVyZm9ybSB0aGUgdmFyaW91cyB0ZXN0cworICAgICAgICBpZiBzZWxmLm1ldGFkYXRhOgorICAgICAgICAgICAgc2VsZi5jaGVja19tZXRhZGF0YSgpCisgICAgICAgIGlmIHNlbGYucmVzdHJ1Y3R1cmVkdGV4dDoKKyAgICAgICAgICAgIGlmIEhBU19ET0NVVElMUzoKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3Jlc3RydWN0dXJlZHRleHQoKQorICAgICAgICAgICAgZWxpZiBzZWxmLnN0cmljdDoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKCdUaGUgZG9jdXRpbHMgcGFja2FnZSBpcyBuZWVkZWQuJykKKworICAgICAgICAjIGxldCdzIHJhaXNlIGFuIGVycm9yIGluIHN0cmljdCBtb2RlLCBpZiB3ZSBoYXZlIGF0IGxlYXN0CisgICAgICAgICMgb25lIHdhcm5pbmcKKyAgICAgICAgaWYgc2VsZi5zdHJpY3QgYW5kIHNlbGYuX3dhcm5pbmdzID4gMDoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoJ1BsZWFzZSBjb3JyZWN0IHlvdXIgcGFja2FnZS4nKQorCisgICAgZGVmIGNoZWNrX21ldGFkYXRhKHNlbGYpOgorICAgICAgICAiIiJFbnN1cmVzIHRoYXQgYWxsIHJlcXVpcmVkIGVsZW1lbnRzIG9mIG1ldGEtZGF0YSBhcmUgc3VwcGxpZWQuCisKKyAgICAgICAgbmFtZSwgdmVyc2lvbiwgVVJMLCAoYXV0aG9yIGFuZCBhdXRob3JfZW1haWwpIG9yCisgICAgICAgIChtYWludGFpbmVyIGFuZCBtYWludGFpbmVyX2VtYWlsKSkuCisKKyAgICAgICAgV2FybnMgaWYgYW55IGFyZSBtaXNzaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbWV0YWRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQorCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBmb3IgYXR0ciBpbiAoJ25hbWUnLCAndmVyc2lvbicsICd1cmwnKToKKyAgICAgICAgICAgIGlmIG5vdCAoaGFzYXR0cihtZXRhZGF0YSwgYXR0cikgYW5kIGdldGF0dHIobWV0YWRhdGEsIGF0dHIpKToKKyAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChhdHRyKQorCisgICAgICAgIGlmIG1pc3Npbmc6CisgICAgICAgICAgICBzZWxmLndhcm4oIm1pc3NpbmcgcmVxdWlyZWQgbWV0YS1kYXRhOiAlcyIgICUgJywgJy5qb2luKG1pc3NpbmcpKQorICAgICAgICBpZiBtZXRhZGF0YS5hdXRob3I6CisgICAgICAgICAgICBpZiBub3QgbWV0YWRhdGEuYXV0aG9yX2VtYWlsOgorICAgICAgICAgICAgICAgIHNlbGYud2FybigibWlzc2luZyBtZXRhLWRhdGE6IGlmICdhdXRob3InIHN1cHBsaWVkLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIidhdXRob3JfZW1haWwnIG11c3QgYmUgc3VwcGxpZWQgdG9vIikKKyAgICAgICAgZWxpZiBtZXRhZGF0YS5tYWludGFpbmVyOgorICAgICAgICAgICAgaWYgbm90IG1ldGFkYXRhLm1haW50YWluZXJfZW1haWw6CisgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJtaXNzaW5nIG1ldGEtZGF0YTogaWYgJ21haW50YWluZXInIHN1cHBsaWVkLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIidtYWludGFpbmVyX2VtYWlsJyBtdXN0IGJlIHN1cHBsaWVkIHRvbyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndhcm4oIm1pc3NpbmcgbWV0YS1kYXRhOiBlaXRoZXIgKGF1dGhvciBhbmQgYXV0aG9yX2VtYWlsKSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAib3IgKG1haW50YWluZXIgYW5kIG1haW50YWluZXJfZW1haWwpICIgKworICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHN1cHBsaWVkIikKKworICAgIGRlZiBjaGVja19yZXN0cnVjdHVyZWR0ZXh0KHNlbGYpOgorICAgICAgICAiIiJDaGVja3MgaWYgdGhlIGxvbmcgc3RyaW5nIGZpZWxkcyBhcmUgcmVTVC1jb21wbGlhbnQuIiIiCisgICAgICAgIGRhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbG9uZ19kZXNjcmlwdGlvbigpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRhdGEsIHVuaWNvZGUpOgorICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKFBLR19JTkZPX0VOQ09ESU5HKQorICAgICAgICBmb3Igd2FybmluZyBpbiBzZWxmLl9jaGVja19yc3RfZGF0YShkYXRhKToKKyAgICAgICAgICAgIGxpbmUgPSB3YXJuaW5nWy0xXS5nZXQoJ2xpbmUnKQorICAgICAgICAgICAgaWYgbGluZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHdhcm5pbmcgPSB3YXJuaW5nWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdhcm5pbmcgPSAnJXMgKGxpbmUgJXMpJyAlICh3YXJuaW5nWzFdLCBsaW5lKQorICAgICAgICAgICAgc2VsZi53YXJuKHdhcm5pbmcpCisKKyAgICBkZWYgX2NoZWNrX3JzdF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJSZXR1cm5zIHdhcm5pbmdzIHdoZW4gdGhlIHByb3ZpZGVkIGRhdGEgZG9lc24ndCBjb21waWxlLiIiIgorICAgICAgICBzb3VyY2VfcGF0aCA9IFN0cmluZ0lPKCkKKyAgICAgICAgcGFyc2VyID0gUGFyc2VyKCkKKyAgICAgICAgc2V0dGluZ3MgPSBmcm9udGVuZC5PcHRpb25QYXJzZXIoKS5nZXRfZGVmYXVsdF92YWx1ZXMoKQorICAgICAgICBzZXR0aW5ncy50YWJfd2lkdGggPSA0CisgICAgICAgIHNldHRpbmdzLnBlcF9yZWZlcmVuY2VzID0gTm9uZQorICAgICAgICBzZXR0aW5ncy5yZmNfcmVmZXJlbmNlcyA9IE5vbmUKKyAgICAgICAgcmVwb3J0ZXIgPSBTaWxlbnRSZXBvcnRlcihzb3VyY2VfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MucmVwb3J0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5oYWx0X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW09c2V0dGluZ3Mud2FybmluZ19zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPXNldHRpbmdzLmRlYnVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz1zZXR0aW5ncy5lcnJvcl9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlcj1zZXR0aW5ncy5lcnJvcl9lbmNvZGluZ19lcnJvcl9oYW5kbGVyKQorCisgICAgICAgIGRvY3VtZW50ID0gbm9kZXMuZG9jdW1lbnQoc2V0dGluZ3MsIHJlcG9ydGVyLCBzb3VyY2U9c291cmNlX3BhdGgpCisgICAgICAgIGRvY3VtZW50Lm5vdGVfc291cmNlKHNvdXJjZV9wYXRoLCAtMSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGRhdGEsIGRvY3VtZW50KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXBvcnRlci5tZXNzYWdlcy5hcHBlbmQoKC0xLCAnQ291bGQgbm90IGZpbmlzaCB0aGUgcGFyc2luZy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywge30pKQorCisgICAgICAgIHJldHVybiByZXBvcnRlci5tZXNzYWdlcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NoZWNrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzJiNjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NoZWNrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzJiNjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jaGVjay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jbGVhbi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2xlYW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlZjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2xlYW4ucHkKQEAgLTAsMCArMSw4MCBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuY2xlYW4KKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdjbGVhbicgY29tbWFuZC4iIiIKKworIyBjb250cmlidXRlZCBieSBCYXN0aWFuIEtsZWluZWlkYW0gPGNhbHZpbkBjcy51bmktc2IuZGU+LCBhZGRlZCAyMDAwLTAzLTE4CisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCByZW1vdmVfdHJlZQorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyBjbGVhbihDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImNsZWFuIHVwIHRlbXBvcmFyeSBmaWxlcyBmcm9tICdidWlsZCcgY29tbWFuZCIKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnYnVpbGQtYmFzZT0nLCAnYicsCisgICAgICAgICAiYmFzZSBidWlsZCBkaXJlY3RvcnkgKGRlZmF1bHQ6ICdidWlsZC5idWlsZC1iYXNlJykiKSwKKyAgICAgICAgKCdidWlsZC1saWI9JywgTm9uZSwKKyAgICAgICAgICJidWlsZCBkaXJlY3RvcnkgZm9yIGFsbCBtb2R1bGVzIChkZWZhdWx0OiAnYnVpbGQuYnVpbGQtbGliJykiKSwKKyAgICAgICAgKCdidWlsZC10ZW1wPScsICd0JywKKyAgICAgICAgICJ0ZW1wb3JhcnkgYnVpbGQgZGlyZWN0b3J5IChkZWZhdWx0OiAnYnVpbGQuYnVpbGQtdGVtcCcpIiksCisgICAgICAgICgnYnVpbGQtc2NyaXB0cz0nLCBOb25lLAorICAgICAgICAgImJ1aWxkIGRpcmVjdG9yeSBmb3Igc2NyaXB0cyAoZGVmYXVsdDogJ2J1aWxkLmJ1aWxkLXNjcmlwdHMnKSIpLAorICAgICAgICAoJ2JkaXN0LWJhc2U9JywgTm9uZSwKKyAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBidWlsdCBkaXN0cmlidXRpb25zIiksCisgICAgICAgICgnYWxsJywgJ2EnLAorICAgICAgICAgInJlbW92ZSBhbGwgYnVpbGQgb3V0cHV0LCBub3QganVzdCB0ZW1wb3JhcnkgYnktcHJvZHVjdHMiKQorICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnYWxsJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRfYmFzZSA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9saWIgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfdGVtcCA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9zY3JpcHRzID0gTm9uZQorICAgICAgICBzZWxmLmJkaXN0X2Jhc2UgPSBOb25lCisgICAgICAgIHNlbGYuYWxsID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdidWlsZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfYmFzZScsICdidWlsZF9iYXNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYnVpbGRfbGliJywgJ2J1aWxkX2xpYicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX3NjcmlwdHMnLCAnYnVpbGRfc2NyaXB0cycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2J1aWxkX3RlbXAnLCAnYnVpbGRfdGVtcCcpKQorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnYmRpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2JkaXN0X2Jhc2UnLCAnYmRpc3RfYmFzZScpKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyByZW1vdmUgdGhlIGJ1aWxkL3RlbXAuPHBsYXQ+IGRpcmVjdG9yeSAodW5sZXNzIGl0J3MgYWxyZWFkeQorICAgICAgICAjIGdvbmUpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuYnVpbGRfdGVtcCk6CisgICAgICAgICAgICByZW1vdmVfdHJlZShzZWxmLmJ1aWxkX3RlbXAsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKCInJXMnIGRvZXMgbm90IGV4aXN0IC0tIGNhbid0IGNsZWFuIGl0IiwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3RlbXApCisKKyAgICAgICAgaWYgc2VsZi5hbGw6CisgICAgICAgICAgICAjIHJlbW92ZSBidWlsZCBkaXJlY3RvcmllcworICAgICAgICAgICAgZm9yIGRpcmVjdG9yeSBpbiAoc2VsZi5idWlsZF9saWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJkaXN0X2Jhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkX3NjcmlwdHMpOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpcmVjdG9yeSk6CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZV90cmVlKGRpcmVjdG9yeSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIiclcycgZG9lcyBub3QgZXhpc3QgLS0gY2FuJ3QgY2xlYW4gaXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkpCisKKyAgICAgICAgIyBqdXN0IGZvciB0aGUgaGVjayBvZiBpdCwgdHJ5IHRvIHJlbW92ZSB0aGUgYmFzZSBidWlsZCBkaXJlY3Rvcnk6CisgICAgICAgICMgd2UgbWlnaHQgaGF2ZSBlbXB0aWVkIGl0IHJpZ2h0IG5vdywgYnV0IGlmIG5vdCB3ZSBkb24ndCBjYXJlCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5idWlsZF9iYXNlKQorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJyZW1vdmluZyAnJXMnIiwgc2VsZi5idWlsZF9iYXNlKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisjIGNsYXNzIGNsZWFuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2xlYW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODY0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY2xlYW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwODY0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NsZWFuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbW1hbmRfdGVtcGxhdGUgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2NvbW1hbmRfdGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBiYmFiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29tbWFuZF90ZW1wbGF0ZQpAQCAtMCwwICsxLDQ1IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC54CisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAneCcgY29tbWFuZC4KKyIiIgorCisjIGNyZWF0ZWQgMjAwMC9tbS9kZCwgSm9obiBEb2UKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKKworCitjbGFzcyB4IChDb21tYW5kKToKKworICAgICMgQnJpZWYgKDQwLTUwIGNoYXJhY3RlcnMpIGRlc2NyaXB0aW9uIG9mIHRoZSBjb21tYW5kCisgICAgZGVzY3JpcHRpb24gPSAiIgorCisgICAgIyBMaXN0IG9mIG9wdGlvbiB0dXBsZXM6IGxvbmcgbmFtZSwgc2hvcnQgbmFtZSAoTm9uZSBpZiBubyBzaG9ydAorICAgICMgbmFtZSksIGFuZCBoZWxwIHN0cmluZy4KKyAgICB1c2VyX29wdGlvbnMgPSBbKCcnLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICIiKSwKKyAgICAgICAgICAgICAgICAgICBdCisKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMgKHNlbGYpOgorICAgICAgICBzZWxmLiA9IE5vbmUKKyAgICAgICAgc2VsZi4gPSBOb25lCisgICAgICAgIHNlbGYuID0gTm9uZQorCisgICAgIyBpbml0aWFsaXplX29wdGlvbnMoKQorCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIGlmIHNlbGYueCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi54ID0gCisKKyAgICAjIGZpbmFsaXplX29wdGlvbnMoKQorCisKKyAgICBkZWYgcnVuIChzZWxmKToKKworCisgICAgIyBydW4oKQorCisjIGNsYXNzIHgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA4NDkxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5CkBAIC0wLDAgKzEsMzU3IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5jb25maWcKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdjb25maWcnIGNvbW1hbmQsIGEgKG1vc3RseSkgZW1wdHkgY29tbWFuZCBjbGFzcwordGhhdCBleGlzdHMgbWFpbmx5IHRvIGJlIHN1Yi1jbGFzc2VkIGJ5IHNwZWNpZmljIG1vZHVsZSBkaXN0cmlidXRpb25zIGFuZAorYXBwbGljYXRpb25zLiAgVGhlIGlkZWEgaXMgdGhhdCB3aGlsZSBldmVyeSAiY29uZmlnIiBjb21tYW5kIGlzIGRpZmZlcmVudCwKK2F0IGxlYXN0IHRoZXkncmUgYWxsIG5hbWVkIHRoZSBzYW1lLCBhbmQgdXNlcnMgYWx3YXlzIHNlZSAiY29uZmlnIiBpbiB0aGUKK2xpc3Qgb2Ygc3RhbmRhcmQgY29tbWFuZHMuICBBbHNvLCB0aGlzIGlzIGEgZ29vZCBwbGFjZSB0byBwdXQgY29tbW9uCitjb25maWd1cmUtbGlrZSB0YXNrczogInRyeSB0byBjb21waWxlIHRoaXMgQyBjb2RlIiwgb3IgImZpZ3VyZSBvdXQgd2hlcmUKK3RoaXMgaGVhZGVyIGZpbGUgbGl2ZXMiLgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2ltcG9ydCByZQorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBjdXN0b21pemVfY29tcGlsZXIKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworTEFOR19FWFQgPSB7J2MnOiAnLmMnLCAnYysrJzogJy5jeHgnfQorCitjbGFzcyBjb25maWcoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJwcmVwYXJlIHRvIGJ1aWxkIgorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ2NvbXBpbGVyPScsIE5vbmUsCisgICAgICAgICAic3BlY2lmeSB0aGUgY29tcGlsZXIgdHlwZSIpLAorICAgICAgICAoJ2NjPScsIE5vbmUsCisgICAgICAgICAic3BlY2lmeSB0aGUgY29tcGlsZXIgZXhlY3V0YWJsZSIpLAorICAgICAgICAoJ2luY2x1ZGUtZGlycz0nLCAnSScsCisgICAgICAgICAibGlzdCBvZiBkaXJlY3RvcmllcyB0byBzZWFyY2ggZm9yIGhlYWRlciBmaWxlcyIpLAorICAgICAgICAoJ2RlZmluZT0nLCAnRCcsCisgICAgICAgICAiQyBwcmVwcm9jZXNzb3IgbWFjcm9zIHRvIGRlZmluZSIpLAorICAgICAgICAoJ3VuZGVmPScsICdVJywKKyAgICAgICAgICJDIHByZXByb2Nlc3NvciBtYWNyb3MgdG8gdW5kZWZpbmUiKSwKKyAgICAgICAgKCdsaWJyYXJpZXM9JywgJ2wnLAorICAgICAgICAgImV4dGVybmFsIEMgbGlicmFyaWVzIHRvIGxpbmsgd2l0aCIpLAorICAgICAgICAoJ2xpYnJhcnktZGlycz0nLCAnTCcsCisgICAgICAgICAiZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBleHRlcm5hbCBDIGxpYnJhcmllcyIpLAorCisgICAgICAgICgnbm9pc3knLCBOb25lLAorICAgICAgICAgInNob3cgZXZlcnkgYWN0aW9uIChjb21waWxlLCBsaW5rLCBydW4sIC4uLikgdGFrZW4iKSwKKyAgICAgICAgKCdkdW1wLXNvdXJjZScsIE5vbmUsCisgICAgICAgICAiZHVtcCBnZW5lcmF0ZWQgc291cmNlIGZpbGVzIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNvbXBpbGUgdGhlbSIpLAorICAgICAgICBdCisKKworICAgICMgVGhlIHRocmVlIHN0YW5kYXJkIGNvbW1hbmQgbWV0aG9kczogc2luY2UgdGhlICJjb25maWciIGNvbW1hbmQKKyAgICAjIGRvZXMgbm90aGluZyBieSBkZWZhdWx0LCB0aGVzZSBhcmUgZW1wdHkuCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmNvbXBpbGVyID0gTm9uZQorICAgICAgICBzZWxmLmNjID0gTm9uZQorICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IE5vbmUKKyAgICAgICAgc2VsZi5saWJyYXJpZXMgPSBOb25lCisgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gTm9uZQorCisgICAgICAgICMgbWF4aW1hbCBvdXRwdXQgZm9yIG5vdworICAgICAgICBzZWxmLm5vaXN5ID0gMQorICAgICAgICBzZWxmLmR1bXBfc291cmNlID0gMQorCisgICAgICAgICMgbGlzdCBvZiB0ZW1wb3JhcnkgZmlsZXMgZ2VuZXJhdGVkIGFsb25nLXRoZS13YXkgdGhhdCB3ZSBoYXZlCisgICAgICAgICMgdG8gY2xlYW4gYXQgc29tZSBwb2ludAorICAgICAgICBzZWxmLnRlbXBfZmlsZXMgPSBbXQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IHNlbGYuZGlzdHJpYnV0aW9uLmluY2x1ZGVfZGlycyBvciBbXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc2VsZi5pbmNsdWRlX2RpcnMsIHN0cik6CisgICAgICAgICAgICBzZWxmLmluY2x1ZGVfZGlycyA9IHNlbGYuaW5jbHVkZV9kaXJzLnNwbGl0KG9zLnBhdGhzZXApCisKKyAgICAgICAgaWYgc2VsZi5saWJyYXJpZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYubGlicmFyaWVzID0gW10KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYubGlicmFyaWVzLCBzdHIpOgorICAgICAgICAgICAgc2VsZi5saWJyYXJpZXMgPSBbc2VsZi5saWJyYXJpZXNdCisKKyAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2RpcnMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYubGlicmFyeV9kaXJzID0gW10KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNlbGYubGlicmFyeV9kaXJzLCBzdHIpOgorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMgPSBzZWxmLmxpYnJhcnlfZGlycy5zcGxpdChvcy5wYXRoc2VwKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgcGFzcworCisKKyAgICAjIFV0aWxpdHkgbWV0aG9kcyBmb3IgYWN0dWFsICJjb25maWciIGNvbW1hbmRzLiAgVGhlIGludGVyZmFjZXMgYXJlCisgICAgIyBsb29zZWx5IGJhc2VkIG9uIEF1dG9jb25mIG1hY3JvcyBvZiBzaW1pbGFyIG5hbWVzLiAgU3ViLWNsYXNzZXMKKyAgICAjIG1heSB1c2UgdGhlc2UgZnJlZWx5LgorCisgICAgZGVmIF9jaGVja19jb21waWxlcihzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCAnc2VsZi5jb21waWxlcicgcmVhbGx5IGlzIGEgQ0NvbXBpbGVyIG9iamVjdDsKKyAgICAgICAgaWYgbm90LCBtYWtlIGl0IG9uZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgV2UgZG8gdGhpcyBsYXRlLCBhbmQgb25seSBvbi1kZW1hbmQsIGJlY2F1c2UgdGhpcyBpcyBhbiBleHBlbnNpdmUKKyAgICAgICAgIyBpbXBvcnQuCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgQ0NvbXBpbGVyLCBuZXdfY29tcGlsZXIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5jb21waWxlciwgQ0NvbXBpbGVyKToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBuZXdfY29tcGlsZXIoY29tcGlsZXI9c2VsZi5jb21waWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4sIGZvcmNlPTEpCisgICAgICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoc2VsZi5jb21waWxlcikKKyAgICAgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKKyAgICAgICAgICAgIGlmIHNlbGYubGlicmFyaWVzOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2xpYnJhcmllcyhzZWxmLmxpYnJhcmllcykKKyAgICAgICAgICAgIGlmIHNlbGYubGlicmFyeV9kaXJzOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGlsZXIuc2V0X2xpYnJhcnlfZGlycyhzZWxmLmxpYnJhcnlfZGlycykKKworCisgICAgZGVmIF9nZW5fdGVtcF9zb3VyY2VmaWxlKHNlbGYsIGJvZHksIGhlYWRlcnMsIGxhbmcpOgorICAgICAgICBmaWxlbmFtZSA9ICJfY29uZmlndGVzdCIgKyBMQU5HX0VYVFtsYW5nXQorICAgICAgICBmaWxlID0gb3BlbihmaWxlbmFtZSwgInciKQorICAgICAgICBpZiBoZWFkZXJzOgorICAgICAgICAgICAgZm9yIGhlYWRlciBpbiBoZWFkZXJzOgorICAgICAgICAgICAgICAgIGZpbGUud3JpdGUoIiNpbmNsdWRlIDwlcz5cbiIgJSBoZWFkZXIpCisgICAgICAgICAgICBmaWxlLndyaXRlKCJcbiIpCisgICAgICAgIGZpbGUud3JpdGUoYm9keSkKKyAgICAgICAgaWYgYm9keVstMV0gIT0gIlxuIjoKKyAgICAgICAgICAgIGZpbGUud3JpdGUoIlxuIikKKyAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIF9wcmVwcm9jZXNzKHNlbGYsIGJvZHksIGhlYWRlcnMsIGluY2x1ZGVfZGlycywgbGFuZyk6CisgICAgICAgIHNyYyA9IHNlbGYuX2dlbl90ZW1wX3NvdXJjZWZpbGUoYm9keSwgaGVhZGVycywgbGFuZykKKyAgICAgICAgb3V0ID0gIl9jb25maWd0ZXN0LmkiCisgICAgICAgIHNlbGYudGVtcF9maWxlcy5leHRlbmQoW3NyYywgb3V0XSkKKyAgICAgICAgc2VsZi5jb21waWxlci5wcmVwcm9jZXNzKHNyYywgb3V0LCBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzKQorICAgICAgICByZXR1cm4gKHNyYywgb3V0KQorCisgICAgZGVmIF9jb21waWxlKHNlbGYsIGJvZHksIGhlYWRlcnMsIGluY2x1ZGVfZGlycywgbGFuZyk6CisgICAgICAgIHNyYyA9IHNlbGYuX2dlbl90ZW1wX3NvdXJjZWZpbGUoYm9keSwgaGVhZGVycywgbGFuZykKKyAgICAgICAgaWYgc2VsZi5kdW1wX3NvdXJjZToKKyAgICAgICAgICAgIGR1bXBfZmlsZShzcmMsICJjb21waWxpbmcgJyVzJzoiICUgc3JjKQorICAgICAgICAob2JqLCkgPSBzZWxmLmNvbXBpbGVyLm9iamVjdF9maWxlbmFtZXMoW3NyY10pCisgICAgICAgIHNlbGYudGVtcF9maWxlcy5leHRlbmQoW3NyYywgb2JqXSkKKyAgICAgICAgc2VsZi5jb21waWxlci5jb21waWxlKFtzcmNdLCBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzKQorICAgICAgICByZXR1cm4gKHNyYywgb2JqKQorCisgICAgZGVmIF9saW5rKHNlbGYsIGJvZHksIGhlYWRlcnMsIGluY2x1ZGVfZGlycywgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgIGxhbmcpOgorICAgICAgICAoc3JjLCBvYmopID0gc2VsZi5fY29tcGlsZShib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsIGxhbmcpCisgICAgICAgIHByb2cgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoc3JjKSlbMF0KKyAgICAgICAgc2VsZi5jb21waWxlci5saW5rX2V4ZWN1dGFibGUoW29ial0sIHByb2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1saWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9sYW5nPWxhbmcpCisKKyAgICAgICAgaWYgc2VsZi5jb21waWxlci5leGVfZXh0ZW5zaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJvZyA9IHByb2cgKyBzZWxmLmNvbXBpbGVyLmV4ZV9leHRlbnNpb24KKyAgICAgICAgc2VsZi50ZW1wX2ZpbGVzLmFwcGVuZChwcm9nKQorCisgICAgICAgIHJldHVybiAoc3JjLCBvYmosIHByb2cpCisKKyAgICBkZWYgX2NsZWFuKHNlbGYsICpmaWxlbmFtZXMpOgorICAgICAgICBpZiBub3QgZmlsZW5hbWVzOgorICAgICAgICAgICAgZmlsZW5hbWVzID0gc2VsZi50ZW1wX2ZpbGVzCisgICAgICAgICAgICBzZWxmLnRlbXBfZmlsZXMgPSBbXQorICAgICAgICBsb2cuaW5mbygicmVtb3Zpbmc6ICVzIiwgJyAnLmpvaW4oZmlsZW5hbWVzKSkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICMgWFhYIHRoZXNlIGlnbm9yZSB0aGUgZHJ5LXJ1biBmbGFnOiB3aGF0IHRvIGRvLCB3aGF0IHRvIGRvPyBldmVuIGlmCisgICAgIyB5b3Ugd2FudCBhIGRyeS1ydW4gYnVpbGQsIHlvdSBzdGlsbCBuZWVkIHNvbWUgc29ydCBvZiBjb25maWd1cmF0aW9uCisgICAgIyBpbmZvLiAgTXkgaW5jbGluYXRpb24gaXMgdG8gbWFrZSBpdCB1cCB0byB0aGUgcmVhbCBjb25maWcgY29tbWFuZCB0bworICAgICMgY29uc3VsdCAnZHJ5X3J1bicsIGFuZCBhc3N1bWUgYSBkZWZhdWx0IChtaW5pbWFsKSBjb25maWd1cmF0aW9uIGlmCisgICAgIyB0cnVlLiAgVGhlIHByb2JsZW0gd2l0aCB0cnlpbmcgdG8gZG8gaXQgaGVyZSBpcyB0aGF0IHlvdSdkIGhhdmUgdG8KKyAgICAjIHJldHVybiBlaXRoZXIgdHJ1ZSBvciBmYWxzZSBmcm9tIGFsbCB0aGUgJ3RyeScgbWV0aG9kcywgbmVpdGhlciBvZgorICAgICMgd2hpY2ggaXMgY29ycmVjdC4KKworICAgICMgWFhYIG5lZWQgYWNjZXNzIHRvIHRoZSBoZWFkZXIgc2VhcmNoIHBhdGggYW5kIG1heWJlIGRlZmF1bHQgbWFjcm9zLgorCisgICAgZGVmIHRyeV9jcHAoc2VsZiwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLCBsYW5nPSJjIik6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHNvdXJjZSBmaWxlIGZyb20gJ2JvZHknIChhIHN0cmluZyBjb250YWluaW5nIGxpbmVzCisgICAgICAgIG9mIEMvQysrIGNvZGUpIGFuZCAnaGVhZGVycycgKGEgbGlzdCBvZiBoZWFkZXIgZmlsZXMgdG8gaW5jbHVkZSkKKyAgICAgICAgYW5kIHJ1biBpdCB0aHJvdWdoIHRoZSBwcmVwcm9jZXNzb3IuICBSZXR1cm4gdHJ1ZSBpZiB0aGUKKyAgICAgICAgcHJlcHJvY2Vzc29yIHN1Y2NlZWRlZCwgZmFsc2UgaWYgdGhlcmUgd2VyZSBhbnkgZXJyb3JzLgorICAgICAgICAoJ2JvZHknIHByb2JhYmx5IGlzbid0IG9mIG11Y2ggdXNlLCBidXQgd2hhdCB0aGUgaGVjay4pCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IENvbXBpbGVFcnJvcgorICAgICAgICBzZWxmLl9jaGVja19jb21waWxlcigpCisgICAgICAgIG9rID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9wcmVwcm9jZXNzKGJvZHksIGhlYWRlcnMsIGluY2x1ZGVfZGlycywgbGFuZykKKyAgICAgICAgZXhjZXB0IENvbXBpbGVFcnJvcjoKKyAgICAgICAgICAgIG9rID0gMAorCisgICAgICAgIHNlbGYuX2NsZWFuKCkKKyAgICAgICAgcmV0dXJuIG9rCisKKyAgICBkZWYgc2VhcmNoX2NwcChzZWxmLCBwYXR0ZXJuLCBib2R5PU5vbmUsIGhlYWRlcnM9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgbGFuZz0iYyIpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBzb3VyY2UgZmlsZSAoanVzdCBsaWtlICd0cnlfY3BwKCknKSwgcnVuIGl0IHRocm91Z2gKKyAgICAgICAgdGhlIHByZXByb2Nlc3NvciwgYW5kIHJldHVybiB0cnVlIGlmIGFueSBsaW5lIG9mIHRoZSBvdXRwdXQgbWF0Y2hlcworICAgICAgICAncGF0dGVybicuICAncGF0dGVybicgc2hvdWxkIGVpdGhlciBiZSBhIGNvbXBpbGVkIHJlZ2V4IG9iamVjdCBvciBhCisgICAgICAgIHN0cmluZyBjb250YWluaW5nIGEgcmVnZXguICBJZiBib3RoICdib2R5JyBhbmQgJ2hlYWRlcnMnIGFyZSBOb25lLAorICAgICAgICBwcmVwcm9jZXNzZXMgYW4gZW1wdHkgZmlsZSAtLSB3aGljaCBjYW4gYmUgdXNlZnVsIHRvIGRldGVybWluZSB0aGUKKyAgICAgICAgc3ltYm9scyB0aGUgcHJlcHJvY2Vzc29yIGFuZCBjb21waWxlciBzZXQgYnkgZGVmYXVsdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbXBpbGVyKCkKKyAgICAgICAgc3JjLCBvdXQgPSBzZWxmLl9wcmVwcm9jZXNzKGJvZHksIGhlYWRlcnMsIGluY2x1ZGVfZGlycywgbGFuZykKKworICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIHN0cik6CisgICAgICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShwYXR0ZXJuKQorCisgICAgICAgIGZpbGUgPSBvcGVuKG91dCkKKyAgICAgICAgbWF0Y2ggPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBwYXR0ZXJuLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgICAgICBtYXRjaCA9IDEKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLl9jbGVhbigpCisgICAgICAgIHJldHVybiBtYXRjaAorCisgICAgZGVmIHRyeV9jb21waWxlKHNlbGYsIGJvZHksIGhlYWRlcnM9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsIGxhbmc9ImMiKToKKyAgICAgICAgIiIiVHJ5IHRvIGNvbXBpbGUgYSBzb3VyY2UgZmlsZSBidWlsdCBmcm9tICdib2R5JyBhbmQgJ2hlYWRlcnMnLgorICAgICAgICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IENvbXBpbGVFcnJvcgorICAgICAgICBzZWxmLl9jaGVja19jb21waWxlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NvbXBpbGUoYm9keSwgaGVhZGVycywgaW5jbHVkZV9kaXJzLCBsYW5nKQorICAgICAgICAgICAgb2sgPSAxCisgICAgICAgIGV4Y2VwdCBDb21waWxlRXJyb3I6CisgICAgICAgICAgICBvayA9IDAKKworICAgICAgICBsb2cuaW5mbyhvayBhbmQgInN1Y2Nlc3MhIiBvciAiZmFpbHVyZS4iKQorICAgICAgICBzZWxmLl9jbGVhbigpCisgICAgICAgIHJldHVybiBvaworCisgICAgZGVmIHRyeV9saW5rKHNlbGYsIGJvZHksIGhlYWRlcnM9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsIGxpYnJhcmllcz1Ob25lLAorICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgbGFuZz0iYyIpOgorICAgICAgICAiIiJUcnkgdG8gY29tcGlsZSBhbmQgbGluayBhIHNvdXJjZSBmaWxlLCBidWlsdCBmcm9tICdib2R5JyBhbmQKKyAgICAgICAgJ2hlYWRlcnMnLCB0byBleGVjdXRhYmxlIGZvcm0uICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZQorICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IENvbXBpbGVFcnJvciwgTGlua0Vycm9yCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbXBpbGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fbGluayhib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcywgbGlicmFyeV9kaXJzLCBsYW5nKQorICAgICAgICAgICAgb2sgPSAxCisgICAgICAgIGV4Y2VwdCAoQ29tcGlsZUVycm9yLCBMaW5rRXJyb3IpOgorICAgICAgICAgICAgb2sgPSAwCisKKyAgICAgICAgbG9nLmluZm8ob2sgYW5kICJzdWNjZXNzISIgb3IgImZhaWx1cmUuIikKKyAgICAgICAgc2VsZi5fY2xlYW4oKQorICAgICAgICByZXR1cm4gb2sKKworICAgIGRlZiB0cnlfcnVuKHNlbGYsIGJvZHksIGhlYWRlcnM9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsIGxpYnJhcmllcz1Ob25lLAorICAgICAgICAgICAgICAgIGxpYnJhcnlfZGlycz1Ob25lLCBsYW5nPSJjIik6CisgICAgICAgICIiIlRyeSB0byBjb21waWxlLCBsaW5rIHRvIGFuIGV4ZWN1dGFibGUsIGFuZCBydW4gYSBwcm9ncmFtCisgICAgICAgIGJ1aWx0IGZyb20gJ2JvZHknIGFuZCAnaGVhZGVycycuICBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZQorICAgICAgICBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IENvbXBpbGVFcnJvciwgTGlua0Vycm9yCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbXBpbGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3JjLCBvYmosIGV4ZSA9IHNlbGYuX2xpbmsoYm9keSwgaGVhZGVycywgaW5jbHVkZV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIGxhbmcpCisgICAgICAgICAgICBzZWxmLnNwYXduKFtleGVdKQorICAgICAgICAgICAgb2sgPSAxCisgICAgICAgIGV4Y2VwdCAoQ29tcGlsZUVycm9yLCBMaW5rRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvcik6CisgICAgICAgICAgICBvayA9IDAKKworICAgICAgICBsb2cuaW5mbyhvayBhbmQgInN1Y2Nlc3MhIiBvciAiZmFpbHVyZS4iKQorICAgICAgICBzZWxmLl9jbGVhbigpCisgICAgICAgIHJldHVybiBvaworCisKKyAgICAjIC0tIEhpZ2gtbGV2ZWwgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKHRoZXNlIGFyZSB0aGUgb25lcyB0aGF0IGFyZSBhY3R1YWxseSBsaWtlbHkgdG8gYmUgdXNlZnVsCisgICAgIyB3aGVuIGltcGxlbWVudGluZyBhIHJlYWwtd29ybGQgY29uZmlnIGNvbW1hbmQhKQorCisgICAgZGVmIGNoZWNrX2Z1bmMoc2VsZiwgZnVuYywgaGVhZGVycz1Ob25lLCBpbmNsdWRlX2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIGRlY2w9MCwgY2FsbD0wKToKKworICAgICAgICAiIiJEZXRlcm1pbmUgaWYgZnVuY3Rpb24gJ2Z1bmMnIGlzIGF2YWlsYWJsZSBieSBjb25zdHJ1Y3RpbmcgYQorICAgICAgICBzb3VyY2UgZmlsZSB0aGF0IHJlZmVycyB0byAnZnVuYycsIGFuZCBjb21waWxlcyBhbmQgbGlua3MgaXQuCisgICAgICAgIElmIGV2ZXJ5dGhpbmcgc3VjY2VlZHMsIHJldHVybnMgdHJ1ZTsgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisKKyAgICAgICAgVGhlIGNvbnN0cnVjdGVkIHNvdXJjZSBmaWxlIHN0YXJ0cyBvdXQgYnkgaW5jbHVkaW5nIHRoZSBoZWFkZXIKKyAgICAgICAgZmlsZXMgbGlzdGVkIGluICdoZWFkZXJzJy4gIElmICdkZWNsJyBpcyB0cnVlLCBpdCB0aGVuIGRlY2xhcmVzCisgICAgICAgICdmdW5jJyAoYXMgImludCBmdW5jKCkiKTsgeW91IHByb2JhYmx5IHNob3VsZG4ndCBzdXBwbHkgJ2hlYWRlcnMnCisgICAgICAgIGFuZCBzZXQgJ2RlY2wnIHRydWUgaW4gdGhlIHNhbWUgY2FsbCwgb3IgeW91IG1pZ2h0IGdldCBlcnJvcnMgYWJvdXQKKyAgICAgICAgYSBjb25mbGljdGluZyBkZWNsYXJhdGlvbnMgZm9yICdmdW5jJy4gIEZpbmFsbHksIHRoZSBjb25zdHJ1Y3RlZAorICAgICAgICAnbWFpbigpJyBmdW5jdGlvbiBlaXRoZXIgcmVmZXJlbmNlcyAnZnVuYycgb3IgKGlmICdjYWxsJyBpcyB0cnVlKQorICAgICAgICBjYWxscyBpdC4gICdsaWJyYXJpZXMnIGFuZCAnbGlicmFyeV9kaXJzJyBhcmUgdXNlZCB3aGVuCisgICAgICAgIGxpbmtpbmcuCisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbXBpbGVyKCkKKyAgICAgICAgYm9keSA9IFtdCisgICAgICAgIGlmIGRlY2w6CisgICAgICAgICAgICBib2R5LmFwcGVuZCgiaW50ICVzICgpOyIgJSBmdW5jKQorICAgICAgICBib2R5LmFwcGVuZCgiaW50IG1haW4gKCkgeyIpCisgICAgICAgIGlmIGNhbGw6CisgICAgICAgICAgICBib2R5LmFwcGVuZCgiICAlcygpOyIgJSBmdW5jKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYm9keS5hcHBlbmQoIiAgJXM7IiAlIGZ1bmMpCisgICAgICAgIGJvZHkuYXBwZW5kKCJ9IikKKyAgICAgICAgYm9keSA9ICJcbiIuam9pbihib2R5KSArICJcbiIKKworICAgICAgICByZXR1cm4gc2VsZi50cnlfbGluayhib2R5LCBoZWFkZXJzLCBpbmNsdWRlX2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcywgbGlicmFyeV9kaXJzKQorCisgICAgIyBjaGVja19mdW5jICgpCisKKyAgICBkZWYgY2hlY2tfbGliKHNlbGYsIGxpYnJhcnksIGxpYnJhcnlfZGlycz1Ob25lLCBoZWFkZXJzPU5vbmUsCisgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9Tm9uZSwgb3RoZXJfbGlicmFyaWVzPVtdKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIGlmICdsaWJyYXJ5JyBpcyBhdmFpbGFibGUgdG8gYmUgbGlua2VkIGFnYWluc3QsCisgICAgICAgIHdpdGhvdXQgYWN0dWFsbHkgY2hlY2tpbmcgdGhhdCBhbnkgcGFydGljdWxhciBzeW1ib2xzIGFyZSBwcm92aWRlZAorICAgICAgICBieSBpdC4gICdoZWFkZXJzJyB3aWxsIGJlIHVzZWQgaW4gY29uc3RydWN0aW5nIHRoZSBzb3VyY2UgZmlsZSB0bworICAgICAgICBiZSBjb21waWxlZCwgYnV0IHRoZSBvbmx5IGVmZmVjdCBvZiB0aGlzIGlzIHRvIGNoZWNrIGlmIGFsbCB0aGUKKyAgICAgICAgaGVhZGVyIGZpbGVzIGxpc3RlZCBhcmUgYXZhaWxhYmxlLiAgQW55IGxpYnJhcmllcyBsaXN0ZWQgaW4KKyAgICAgICAgJ290aGVyX2xpYnJhcmllcycgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbGluaywgaW4gY2FzZSAnbGlicmFyeScKKyAgICAgICAgaGFzIHN5bWJvbHMgdGhhdCBkZXBlbmQgb24gb3RoZXIgbGlicmFyaWVzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2tfY29tcGlsZXIoKQorICAgICAgICByZXR1cm4gc2VsZi50cnlfbGluaygiaW50IG1haW4gKHZvaWQpIHsgfSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIGluY2x1ZGVfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpYnJhcnldK290aGVyX2xpYnJhcmllcywgbGlicmFyeV9kaXJzKQorCisgICAgZGVmIGNoZWNrX2hlYWRlcihzZWxmLCBoZWFkZXIsIGluY2x1ZGVfZGlycz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIGxhbmc9ImMiKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIGlmIHRoZSBzeXN0ZW0gaGVhZGVyIGZpbGUgbmFtZWQgYnkgJ2hlYWRlcl9maWxlJworICAgICAgICBleGlzdHMgYW5kIGNhbiBiZSBmb3VuZCBieSB0aGUgcHJlcHJvY2Vzc29yOyByZXR1cm4gdHJ1ZSBpZiBzbywKKyAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudHJ5X2NwcChib2R5PSIvKiBObyBib2R5ICovIiwgaGVhZGVycz1baGVhZGVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX2RpcnM9aW5jbHVkZV9kaXJzKQorCisKK2RlZiBkdW1wX2ZpbGUoZmlsZW5hbWUsIGhlYWQ9Tm9uZSk6CisgICAgIiIiRHVtcHMgYSBmaWxlIGNvbnRlbnQgaW50byBsb2cuaW5mby4KKworICAgIElmIGhlYWQgaXMgbm90IE5vbmUsIHdpbGwgYmUgZHVtcGVkIGJlZm9yZSB0aGUgZmlsZSBjb250ZW50LgorICAgICIiIgorICAgIGlmIGhlYWQgaXMgTm9uZToKKyAgICAgICAgbG9nLmluZm8oJyVzJyAlIGZpbGVuYW1lKQorICAgIGVsc2U6CisgICAgICAgIGxvZy5pbmZvKGhlYWQpCisgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUpCisgICAgdHJ5OgorICAgICAgICBsb2cuaW5mbyhmaWxlLnJlYWQoKSkKKyAgICBmaW5hbGx5OgorICAgICAgICBmaWxlLmNsb3NlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAzNjExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvY29uZmlnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzAzNjExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9jb25maWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODk2NGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5CkBAIC0wLDAgKzEsNzA5IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnaW5zdGFsbCcgY29tbWFuZC4iIiIKKworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCisjIFRoaXMgbW9kdWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4xLgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cywgb3MsIHN0cmluZywgcmUKK2Zyb20gdHlwZXMgaW1wb3J0ICoKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRworZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcnMKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCB3cml0ZV9maWxlCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgsIHN1YnN0X3ZhcnMsIGNoYW5nZV9yb290Citmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBnZXRfcGxhdGZvcm0KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2Zyb20gc2l0ZSBpbXBvcnQgVVNFUl9CQVNFCitmcm9tIHNpdGUgaW1wb3J0IFVTRVJfU0lURQorZnJvbSBzdHJpbmcgaW1wb3J0IG1ha2V0cmFucworCitkZWYgaXNfbXN5c19taW5ndygpOgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGFuZCAiTVNZU1RFTSIgaW4gb3MuZW52aXJvbiBhbmQgc3lzLnZlcnNpb24uZmluZCgiR0NDIikgPj0gMDoKKyAgICAgICAgaWYgb3MuZW52aXJvblsiTVNZU1RFTSJdID09ICJNSU5HVzMyIjoKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgcmV0dXJuIDAKKworZGVmIGhhc19tc3lzKCk6CisgICAgX21zeXNkbGwgPSAibXN5cy0xLjAuZGxsIgorICAgIGZvciBfcGF0aCBpbiBvcy5lbnZpcm9uWyJQQVRIIl0uc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgIGN1cnJwYXRoID0gb3MucGF0aC5qb2luKF9wYXRoLCBfbXN5c2RsbCkKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY3VycnBhdGgpIGFuZCBvcy5hY2Nlc3MoY3VycnBhdGgsIG9zLkZfT0spOgorICAgICAgICAgICAgcmV0dXJuIF9wYXRoCisgICAgcmV0dXJuIE5vbmUKKworZGVmIG1zeXNfcm9vdCgpOgorICAgIGlmIGlzX21zeXNfbWluZ3coKSBhbmQgaGFzX21zeXMoKSBpcyBub3QgTm9uZToKKyAgICAgICAgYXJnID0gaGFzX21zeXMoKQorICAgICAgICBhcmcgPSBhcmcucnN0cmlwKCJcXCIpCisgICAgICAgIGlmIGFyZy5lbmRzd2l0aCgiXFxiaW4iKToKKyAgICAgICAgICAgICMgZHJvcCB0aGUgXFxiaW4KKyAgICAgICAgICAgIGFyZyA9IGFyZ1s6LTRdCisgICAgICAgIHRhYmxlID0gbWFrZXRyYW5zKCdcXCcsICcvJykKKyAgICAgICAgYXJnID0gYXJnLnRyYW5zbGF0ZSh0YWJsZSkKKyAgICAgICAgaWYgYXJnLmVuZHN3aXRoKCIvIik6CisgICAgICAgICAgICBhcmcgPSBhcmdbOi0xXQorICAgICAgICByZXR1cm4gYXJnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworaWYgc3lzLnZlcnNpb24gPCAiMi4yIjoKKyAgICBXSU5ET1dTX1NDSEVNRSA9IHsKKyAgICAgICAgJ3B1cmVsaWInOiAnJGJhc2UnLAorICAgICAgICAncGxhdGxpYic6ICckYmFzZScsCisgICAgICAgICdoZWFkZXJzJzogJyRiYXNlL0luY2x1ZGUvJGRpc3RfbmFtZScsCisgICAgICAgICdzY3JpcHRzJzogJyRiYXNlL1NjcmlwdHMnLAorICAgICAgICAnZGF0YScgICA6ICckYmFzZScsCisgICAgfQorZWxzZToKKyAgICBXSU5ET1dTX1NDSEVNRSA9IHsKKyAgICAgICAgJ3B1cmVsaWInOiAnJGJhc2UvTGliL3NpdGUtcGFja2FnZXMnLAorICAgICAgICAncGxhdGxpYic6ICckYmFzZS9MaWIvc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdoZWFkZXJzJzogJyRiYXNlL0luY2x1ZGUvJGRpc3RfbmFtZScsCisgICAgICAgICdzY3JpcHRzJzogJyRiYXNlL1NjcmlwdHMnLAorICAgICAgICAnZGF0YScgICA6ICckYmFzZScsCisgICAgfQorCitJTlNUQUxMX1NDSEVNRVMgPSB7CisgICAgJ3VuaXhfcHJlZml4JzogeworICAgICAgICAncHVyZWxpYic6ICckYmFzZS9saWIvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdwbGF0bGliJzogJyRwbGF0YmFzZS9saWIvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdoZWFkZXJzJzogJyRiYXNlL2luY2x1ZGUvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvJGRpc3RfbmFtZScsCisgICAgICAgICdzY3JpcHRzJzogJyRiYXNlL2JpbicsCisgICAgICAgICdkYXRhJyAgIDogJyRiYXNlJywKKyAgICAgICAgfSwKKyAgICAndW5peF9ob21lJzogeworICAgICAgICAncHVyZWxpYic6ICckYmFzZS9saWIvcHl0aG9uJywKKyAgICAgICAgJ3BsYXRsaWInOiAnJGJhc2UvbGliL3B5dGhvbicsCisgICAgICAgICdoZWFkZXJzJzogJyRiYXNlL2luY2x1ZGUvcHl0aG9uLyRkaXN0X25hbWUnLAorICAgICAgICAnc2NyaXB0cyc6ICckYmFzZS9iaW4nLAorICAgICAgICAnZGF0YScgICA6ICckYmFzZScsCisgICAgICAgIH0sCisgICAgJ3VuaXhfdXNlcic6IHsKKyAgICAgICAgJ3B1cmVsaWInOiAnJHVzZXJzaXRlJywKKyAgICAgICAgJ3BsYXRsaWInOiAnJHVzZXJzaXRlJywKKyAgICAgICAgJ2hlYWRlcnMnOiAnJHVzZXJiYXNlL2luY2x1ZGUvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvJGRpc3RfbmFtZScsCisgICAgICAgICdzY3JpcHRzJzogJyR1c2VyYmFzZS9iaW4nLAorICAgICAgICAnZGF0YScgICA6ICckdXNlcmJhc2UnLAorICAgICAgICB9LAorICAgICdudCc6IFdJTkRPV1NfU0NIRU1FLAorICAgICdudF91c2VyJzogeworICAgICAgICAncHVyZWxpYic6ICckdXNlcnNpdGUnLAorICAgICAgICAncGxhdGxpYic6ICckdXNlcnNpdGUnLAorICAgICAgICAnaGVhZGVycyc6ICckdXNlcmJhc2UvUHl0aG9uJHB5X3ZlcnNpb25fbm9kb3QvSW5jbHVkZS8kZGlzdF9uYW1lJywKKyAgICAgICAgJ3NjcmlwdHMnOiAnJHVzZXJiYXNlL1NjcmlwdHMnLAorICAgICAgICAnZGF0YScgICA6ICckdXNlcmJhc2UnLAorICAgICAgICB9LAorICAgICdvczInOiB7CisgICAgICAgICdwdXJlbGliJzogJyRiYXNlL0xpYi9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgJ3BsYXRsaWInOiAnJGJhc2UvTGliL3NpdGUtcGFja2FnZXMnLAorICAgICAgICAnaGVhZGVycyc6ICckYmFzZS9JbmNsdWRlLyRkaXN0X25hbWUnLAorICAgICAgICAnc2NyaXB0cyc6ICckYmFzZS9TY3JpcHRzJywKKyAgICAgICAgJ2RhdGEnICAgOiAnJGJhc2UnLAorICAgICAgICB9LAorICAgICdvczJfaG9tZSc6IHsKKyAgICAgICAgJ3B1cmVsaWInOiAnJHVzZXJzaXRlJywKKyAgICAgICAgJ3BsYXRsaWInOiAnJHVzZXJzaXRlJywKKyAgICAgICAgJ2hlYWRlcnMnOiAnJHVzZXJiYXNlL2luY2x1ZGUvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvJGRpc3RfbmFtZScsCisgICAgICAgICdzY3JpcHRzJzogJyR1c2VyYmFzZS9iaW4nLAorICAgICAgICAnZGF0YScgICA6ICckdXNlcmJhc2UnLAorICAgICAgICB9LAorICAgIH0KKworIyBUaGUga2V5cyB0byBhbiBpbnN0YWxsYXRpb24gc2NoZW1lOyBpZiBhbnkgbmV3IHR5cGVzIG9mIGZpbGVzIGFyZSB0byBiZQorIyBpbnN0YWxsZWQsIGJlIHN1cmUgdG8gYWRkIGFuIGVudHJ5IHRvIGV2ZXJ5IGluc3RhbGxhdGlvbiBzY2hlbWUgYWJvdmUsCisjIGFuZCB0byBTQ0hFTUVfS0VZUyBoZXJlLgorU0NIRU1FX0tFWVMgPSAoJ3B1cmVsaWInLCAncGxhdGxpYicsICdoZWFkZXJzJywgJ3NjcmlwdHMnLCAnZGF0YScpCisKKworY2xhc3MgaW5zdGFsbCAoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIGV2ZXJ5dGhpbmcgZnJvbSBidWlsZCBkaXJlY3RvcnkiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICMgU2VsZWN0IGluc3RhbGxhdGlvbiBzY2hlbWUgYW5kIHNldCBiYXNlIGRpcmVjdG9yKHl8aWVzKQorICAgICAgICAoJ3ByZWZpeD0nLCBOb25lLAorICAgICAgICAgImluc3RhbGxhdGlvbiBwcmVmaXgiKSwKKyAgICAgICAgKCdleGVjLXByZWZpeD0nLCBOb25lLAorICAgICAgICAgIihVbml4IG9ubHkpIHByZWZpeCBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZmlsZXMiKSwKKyAgICAgICAgKCdob21lPScsIE5vbmUsCisgICAgICAgICAiKFVuaXggb25seSkgaG9tZSBkaXJlY3RvcnkgdG8gaW5zdGFsbCB1bmRlciIpLAorICAgICAgICAoJ3VzZXInLCBOb25lLAorICAgICAgICAgImluc3RhbGwgaW4gdXNlciBzaXRlLXBhY2thZ2UgJyVzJyIgJSBVU0VSX1NJVEUpLAorCisgICAgICAgICMgT3IsIGp1c3Qgc2V0IHRoZSBiYXNlIGRpcmVjdG9yKHl8aWVzKQorICAgICAgICAoJ2luc3RhbGwtYmFzZT0nLCBOb25lLAorICAgICAgICAgImJhc2UgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAoaW5zdGVhZCBvZiAtLXByZWZpeCBvciAtLWhvbWUpIiksCisgICAgICAgICgnaW5zdGFsbC1wbGF0YmFzZT0nLCBOb25lLAorICAgICAgICAgImJhc2UgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgcGxhdGZvcm0tc3BlY2lmaWMgZmlsZXMgIiArCisgICAgICAgICAiKGluc3RlYWQgb2YgLS1leGVjLXByZWZpeCBvciAtLWhvbWUpIiksCisgICAgICAgICgncm9vdD0nLCBOb25lLAorICAgICAgICAgImluc3RhbGwgZXZlcnl0aGluZyByZWxhdGl2ZSB0byB0aGlzIGFsdGVybmF0ZSByb290IGRpcmVjdG9yeSIpLAorCisgICAgICAgICMgT3IsIGV4cGxpY2l0bHkgc2V0IHRoZSBpbnN0YWxsYXRpb24gc2NoZW1lCisgICAgICAgICgnaW5zdGFsbC1wdXJlbGliPScsIE5vbmUsCisgICAgICAgICAiaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgcHVyZSBQeXRob24gbW9kdWxlIGRpc3RyaWJ1dGlvbnMiKSwKKyAgICAgICAgKCdpbnN0YWxsLXBsYXRsaWI9JywgTm9uZSwKKyAgICAgICAgICJpbnN0YWxsYXRpb24gZGlyZWN0b3J5IGZvciBub24tcHVyZSBtb2R1bGUgZGlzdHJpYnV0aW9ucyIpLAorICAgICAgICAoJ2luc3RhbGwtbGliPScsIE5vbmUsCisgICAgICAgICAiaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgYWxsIG1vZHVsZSBkaXN0cmlidXRpb25zICIgKworICAgICAgICAgIihvdmVycmlkZXMgLS1pbnN0YWxsLXB1cmVsaWIgYW5kIC0taW5zdGFsbC1wbGF0bGliKSIpLAorCisgICAgICAgICgnaW5zdGFsbC1oZWFkZXJzPScsIE5vbmUsCisgICAgICAgICAiaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgQy9DKysgaGVhZGVycyIpLAorICAgICAgICAoJ2luc3RhbGwtc2NyaXB0cz0nLCBOb25lLAorICAgICAgICAgImluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZm9yIFB5dGhvbiBzY3JpcHRzIiksCisgICAgICAgICgnaW5zdGFsbC1kYXRhPScsIE5vbmUsCisgICAgICAgICAiaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBmb3IgZGF0YSBmaWxlcyIpLAorCisgICAgICAgICMgQnl0ZS1jb21waWxhdGlvbiBvcHRpb25zIC0tIHNlZSBpbnN0YWxsX2xpYi5weSBmb3IgZGV0YWlscywgYXMKKyAgICAgICAgIyB0aGVzZSBhcmUgZHVwbGljYXRlZCBmcm9tIHRoZXJlIChidXQgb25seSBpbnN0YWxsX2xpYiBkb2VzCisgICAgICAgICMgYW55dGhpbmcgd2l0aCB0aGVtKS4KKyAgICAgICAgKCdjb21waWxlJywgJ2MnLCAiY29tcGlsZSAucHkgdG8gLnB5YyBbZGVmYXVsdF0iKSwKKyAgICAgICAgKCduby1jb21waWxlJywgTm9uZSwgImRvbid0IGNvbXBpbGUgLnB5IGZpbGVzIiksCisgICAgICAgICgnb3B0aW1pemU9JywgJ08nLAorICAgICAgICAgImFsc28gY29tcGlsZSB3aXRoIG9wdGltaXphdGlvbjogLU8xIGZvciBcInB5dGhvbiAtT1wiLCAiCisgICAgICAgICAiLU8yIGZvciBcInB5dGhvbiAtT09cIiwgYW5kIC1PMCB0byBkaXNhYmxlIFtkZWZhdWx0OiAtTzBdIiksCisKKyAgICAgICAgIyBNaXNjZWxsYW5lb3VzIGNvbnRyb2wgb3B0aW9ucworICAgICAgICAoJ2ZvcmNlJywgJ2YnLAorICAgICAgICAgImZvcmNlIGluc3RhbGxhdGlvbiAob3ZlcndyaXRlIGFueSBleGlzdGluZyBmaWxlcykiKSwKKyAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwKKyAgICAgICAgICJza2lwIHJlYnVpbGRpbmcgZXZlcnl0aGluZyAoZm9yIHRlc3RpbmcvZGVidWdnaW5nKSIpLAorCisgICAgICAgICMgV2hlcmUgdG8gaW5zdGFsbCBkb2N1bWVudGF0aW9uIChldmVudHVhbGx5ISkKKyAgICAgICAgIygnZG9jLWZvcm1hdD0nLCBOb25lLCAiZm9ybWF0IG9mIGRvY3VtZW50YXRpb24gdG8gZ2VuZXJhdGUiKSwKKyAgICAgICAgIygnaW5zdGFsbC1tYW49JywgTm9uZSwgImRpcmVjdG9yeSBmb3IgVW5peCBtYW4gcGFnZXMiKSwKKyAgICAgICAgIygnaW5zdGFsbC1odG1sPScsIE5vbmUsICJkaXJlY3RvcnkgZm9yIEhUTUwgZG9jdW1lbnRhdGlvbiIpLAorICAgICAgICAjKCdpbnN0YWxsLWluZm89JywgTm9uZSwgImRpcmVjdG9yeSBmb3IgR05VIGluZm8gZmlsZXMiKSwKKworICAgICAgICAoJ3JlY29yZD0nLCBOb25lLAorICAgICAgICAgImZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyIpLAorICAgICAgICBdCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBbJ2NvbXBpbGUnLCAnZm9yY2UnLCAnc2tpcC1idWlsZCcsICd1c2VyJ10KKyAgICBuZWdhdGl2ZV9vcHQgPSB7J25vLWNvbXBpbGUnIDogJ2NvbXBpbGUnfQorCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKworICAgICAgICAjIEhpZ2gtbGV2ZWwgb3B0aW9uczogdGhlc2Ugc2VsZWN0IGJvdGggYW4gaW5zdGFsbGF0aW9uIGJhc2UKKyAgICAgICAgIyBhbmQgc2NoZW1lLgorICAgICAgICBzZWxmLnByZWZpeCA9IE5vbmUKKyAgICAgICAgc2VsZi5leGVjX3ByZWZpeCA9IE5vbmUKKyAgICAgICAgc2VsZi5ob21lID0gTm9uZQorICAgICAgICBzZWxmLnVzZXIgPSAwCisKKyAgICAgICAgIyBUaGVzZSBzZWxlY3Qgb25seSB0aGUgaW5zdGFsbGF0aW9uIGJhc2U7IGl0J3MgdXAgdG8gdGhlIHVzZXIgdG8KKyAgICAgICAgIyBzcGVjaWZ5IHRoZSBpbnN0YWxsYXRpb24gc2NoZW1lIChjdXJyZW50bHksIHRoYXQgbWVhbnMgc3VwcGx5aW5nCisgICAgICAgICMgdGhlIC0taW5zdGFsbC17cGxhdGxpYixwdXJlbGliLHNjcmlwdHMsZGF0YX0gb3B0aW9ucykuCisgICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBOb25lCisgICAgICAgIHNlbGYucm9vdCA9IE5vbmUKKworICAgICAgICAjIFRoZXNlIG9wdGlvbnMgYXJlIHRoZSBhY3R1YWwgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzOyBpZiBub3QKKyAgICAgICAgIyBzdXBwbGllZCBieSB0aGUgdXNlciwgdGhleSBhcmUgZmlsbGVkIGluIHVzaW5nIHRoZSBpbnN0YWxsYXRpb24KKyAgICAgICAgIyBzY2hlbWUgaW1wbGllZCBieSBwcmVmaXgvZXhlYy1wcmVmaXgvaG9tZSBhbmQgdGhlIGNvbnRlbnRzIG9mCisgICAgICAgICMgdGhhdCBpbnN0YWxsYXRpb24gc2NoZW1lLgorICAgICAgICBzZWxmLmluc3RhbGxfcHVyZWxpYiA9IE5vbmUgICAgICMgZm9yIHB1cmUgbW9kdWxlIGRpc3RyaWJ1dGlvbnMKKyAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRsaWIgPSBOb25lICAgICAjIG5vbi1wdXJlIChkaXN0cyB3LyBleHRlbnNpb25zKQorICAgICAgICBzZWxmLmluc3RhbGxfaGVhZGVycyA9IE5vbmUgICAgICMgZm9yIEMvQysrIGhlYWRlcnMKKyAgICAgICAgc2VsZi5pbnN0YWxsX2xpYiA9IE5vbmUgICAgICAgICAjIHNldCB0byBlaXRoZXIgcHVyZWxpYiBvciBwbGF0bGliCisgICAgICAgIHNlbGYuaW5zdGFsbF9zY3JpcHRzID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxfZGF0YSA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX3VzZXJiYXNlID0gVVNFUl9CQVNFCisgICAgICAgIHNlbGYuaW5zdGFsbF91c2Vyc2l0ZSA9IFVTRVJfU0lURQorCisgICAgICAgIHNlbGYuY29tcGlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IE5vbmUKKworICAgICAgICAjIFRoZXNlIHR3byBhcmUgZm9yIHB1dHRpbmcgbm9uLXBhY2thZ2l6ZWQgZGlzdHJpYnV0aW9ucyBpbnRvIHRoZWlyCisgICAgICAgICMgb3duIGRpcmVjdG9yeSBhbmQgY3JlYXRpbmcgYSAucHRoIGZpbGUgaWYgaXQgbWFrZXMgc2Vuc2UuCisgICAgICAgICMgJ2V4dHJhX3BhdGgnIGNvbWVzIGZyb20gdGhlIHNldHVwIGZpbGU7ICdpbnN0YWxsX3BhdGhfZmlsZScgY2FuCisgICAgICAgICMgYmUgdHVybmVkIG9mZiBpZiBpdCBtYWtlcyBubyBzZW5zZSB0byBpbnN0YWxsIGEgLnB0aCBmaWxlLiAgKEJ1dAorICAgICAgICAjIGJldHRlciB0byBpbnN0YWxsIGl0IHVzZWxlc3NseSB0aGFuIHRvIGd1ZXNzIHdyb25nIGFuZCBub3QKKyAgICAgICAgIyBpbnN0YWxsIGl0IHdoZW4gaXQncyBuZWNlc3NhcnkgYW5kIHdvdWxkIGJlIHVzZWQhKSAgQ3VycmVudGx5LAorICAgICAgICAjICdpbnN0YWxsX3BhdGhfZmlsZScgaXMgYWx3YXlzIHRydWUgdW5sZXNzIHNvbWUgb3V0c2lkZXIgbWVkZGxlcworICAgICAgICAjIHdpdGggaXQuCisgICAgICAgIHNlbGYuZXh0cmFfcGF0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX3BhdGhfZmlsZSA9IDEKKworICAgICAgICAjICdmb3JjZScgZm9yY2VzIGluc3RhbGxhdGlvbiwgZXZlbiBpZiB0YXJnZXQgZmlsZXMgYXJlIG5vdAorICAgICAgICAjIG91dC1vZi1kYXRlLiAgJ3NraXBfYnVpbGQnIHNraXBzIHJ1bm5pbmcgdGhlICJidWlsZCIgY29tbWFuZCwKKyAgICAgICAgIyBoYW5keSBpZiB5b3Uga25vdyBpdCdzIG5vdCBuZWNlc3NhcnkuICAnd2Fybl9kaXInICh3aGljaCBpcyAqbm90KgorICAgICAgICAjIGEgdXNlciBvcHRpb24sIGl0J3MganVzdCB0aGVyZSBzbyB0aGUgYmRpc3RfKiBjb21tYW5kcyBjYW4gdHVybgorICAgICAgICAjIGl0IG9mZikgZGV0ZXJtaW5lcyB3aGV0aGVyIHdlIHdhcm4gYWJvdXQgaW5zdGFsbGluZyB0byBhCisgICAgICAgICMgZGlyZWN0b3J5IG5vdCBpbiBzeXMucGF0aC4KKyAgICAgICAgc2VsZi5mb3JjZSA9IDAKKyAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gMAorICAgICAgICBzZWxmLndhcm5fZGlyID0gMQorCisgICAgICAgICMgVGhlc2UgYXJlIG9ubHkgaGVyZSBhcyBhIGNvbmR1aXQgZnJvbSB0aGUgJ2J1aWxkJyBjb21tYW5kIHRvIHRoZQorICAgICAgICAjICdpbnN0YWxsXyonIGNvbW1hbmRzIHRoYXQgZG8gdGhlIHJlYWwgd29yay4gICgnYnVpbGRfYmFzZScgaXNuJ3QKKyAgICAgICAgIyBhY3R1YWxseSB1c2VkIGFueXdoZXJlLCBidXQgaXQgbWlnaHQgYmUgdXNlZnVsIGluIGZ1dHVyZS4pICBUaGV5CisgICAgICAgICMgYXJlIG5vdCB1c2VyIG9wdGlvbnMsIGJlY2F1c2UgaWYgdGhlIHVzZXIgdG9sZCB0aGUgaW5zdGFsbAorICAgICAgICAjIGNvbW1hbmQgd2hlcmUgdGhlIGJ1aWxkIGRpcmVjdG9yeSBpcywgdGhhdCB3b3VsZG4ndCBhZmZlY3QgdGhlCisgICAgICAgICMgYnVpbGQgY29tbWFuZC4KKyAgICAgICAgc2VsZi5idWlsZF9iYXNlID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX2xpYiA9IE5vbmUKKworICAgICAgICAjIE5vdCBkZWZpbmVkIHlldCBiZWNhdXNlIHdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQKKyAgICAgICAgIyBkb2N1bWVudGF0aW9uIHlldC4KKyAgICAgICAgI3NlbGYuaW5zdGFsbF9tYW4gPSBOb25lCisgICAgICAgICNzZWxmLmluc3RhbGxfaHRtbCA9IE5vbmUKKyAgICAgICAgI3NlbGYuaW5zdGFsbF9pbmZvID0gTm9uZQorCisgICAgICAgIHNlbGYucmVjb3JkID0gTm9uZQorCisKKyAgICAjIC0tIE9wdGlvbiBmaW5hbGl6aW5nIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKFRoaXMgaXMgcmF0aGVyIG1vcmUgaW52b2x2ZWQgdGhhbiBmb3IgbW9zdCBjb21tYW5kcywKKyAgICAjIGJlY2F1c2UgdGhpcyBpcyB3aGVyZSB0aGUgcG9saWN5IGZvciBpbnN0YWxsaW5nIHRoaXJkLQorICAgICMgcGFydHkgUHl0aG9uIG1vZHVsZXMgb24gdmFyaW91cyBwbGF0Zm9ybXMgZ2l2ZW4gYSB3aWRlCisgICAgIyBhcnJheSBvZiB1c2VyIGlucHV0IGlzIGRlY2lkZWQuICBZZXMsIGl0J3MgcXVpdGUgY29tcGxleCEpCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6CisKKyAgICAgICAgIyBUaGlzIG1ldGhvZCAoYW5kIGl0cyBwbGlhbnQgc2xhdmVzLCBsaWtlICdmaW5hbGl6ZV91bml4KCknLAorICAgICAgICAjICdmaW5hbGl6ZV9vdGhlcigpJywgYW5kICdzZWxlY3Rfc2NoZW1lKCknKSBpcyB3aGVyZSB0aGUgZGVmYXVsdAorICAgICAgICAjIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBmb3IgbW9kdWxlcywgZXh0ZW5zaW9uIG1vZHVsZXMsIGFuZAorICAgICAgICAjIGFueXRoaW5nIGVsc2Ugd2UgY2FyZSB0byBpbnN0YWxsIGZyb20gYSBQeXRob24gbW9kdWxlCisgICAgICAgICMgZGlzdHJpYnV0aW9uLiAgVGh1cywgdGhpcyBjb2RlIG1ha2VzIGEgcHJldHR5IGltcG9ydGFudCBwb2xpY3kKKyAgICAgICAgIyBzdGF0ZW1lbnQgYWJvdXQgaG93IHRoaXJkLXBhcnR5IHN0dWZmIGlzIGFkZGVkIHRvIGEgUHl0aG9uCisgICAgICAgICMgaW5zdGFsbGF0aW9uISAgTm90ZSB0aGF0IHRoZSBhY3R1YWwgd29yayBvZiBpbnN0YWxsYXRpb24gaXMgZG9uZQorICAgICAgICAjIGJ5IHRoZSByZWxhdGl2ZWx5IHNpbXBsZSAnaW5zdGFsbF8qJyBjb21tYW5kczsgdGhleSBqdXN0IHRha2UKKyAgICAgICAgIyB0aGVpciBvcmRlcnMgZnJvbSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSBvcHRpb25zIGRldGVybWluZWQKKyAgICAgICAgIyBoZXJlLgorCisgICAgICAgICMgQ2hlY2sgZm9yIGVycm9ycy9pbmNvbnNpc3RlbmNpZXMgaW4gdGhlIG9wdGlvbnM7IGZpcnN0LCBzdHVmZgorICAgICAgICAjIHRoYXQncyB3cm9uZyBvbiBhbnkgcGxhdGZvcm0uCisKKyAgICAgICAgaWYgKChzZWxmLnByZWZpeCBvciBzZWxmLmV4ZWNfcHJlZml4IG9yIHNlbGYuaG9tZSkgYW5kCisgICAgICAgICAgICAoc2VsZi5pbnN0YWxsX2Jhc2Ugb3Igc2VsZi5pbnN0YWxsX3BsYXRiYXNlKSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgXAorICAgICAgICAgICAgICAgICAgKCJtdXN0IHN1cHBseSBlaXRoZXIgcHJlZml4L2V4ZWMtcHJlZml4L2hvbWUgb3IgIiArCisgICAgICAgICAgICAgICAgICAgImluc3RhbGwtYmFzZS9pbnN0YWxsLXBsYXRiYXNlIC0tIG5vdCBib3RoIikKKworICAgICAgICBpZiBzZWxmLmhvbWUgYW5kIChzZWxmLnByZWZpeCBvciBzZWxmLmV4ZWNfcHJlZml4KToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAibXVzdCBzdXBwbHkgZWl0aGVyIGhvbWUgb3IgcHJlZml4L2V4ZWMtcHJlZml4IC0tIG5vdCBib3RoIgorCisgICAgICAgIGlmIHNlbGYudXNlciBhbmQgKHNlbGYucHJlZml4IG9yIHNlbGYuZXhlY19wcmVmaXggb3Igc2VsZi5ob21lIG9yCisgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2Ugb3Igc2VsZi5pbnN0YWxsX3BsYXRiYXNlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJjYW4ndCBjb21iaW5lIHVzZXIgd2l0aCBwcmVmaXgsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGVjX3ByZWZpeC9ob21lLCBvciBpbnN0YWxsXyhwbGF0KWJhc2UiKQorCisgICAgICAgICMgTmV4dCwgc3R1ZmYgdGhhdCdzIHdyb25nIChvciBkdWJpb3VzKSBvbmx5IG9uIGNlcnRhaW4gcGxhdGZvcm1zLgorICAgICAgICBpZiBvcy5uYW1lICE9ICJwb3NpeCI6CisgICAgICAgICAgICBpZiBzZWxmLmV4ZWNfcHJlZml4OgorICAgICAgICAgICAgICAgIHNlbGYud2FybigiZXhlYy1wcmVmaXggb3B0aW9uIGlnbm9yZWQgb24gdGhpcyBwbGF0Zm9ybSIpCisgICAgICAgICAgICAgICAgc2VsZi5leGVjX3ByZWZpeCA9IE5vbmUKKworICAgICAgICAjIE5vdyB0aGUgaW50ZXJlc3RpbmcgbG9naWMgLS0gc28gaW50ZXJlc3RpbmcgdGhhdCB3ZSBmYXJtIGl0IG91dAorICAgICAgICAjIHRvIG90aGVyIG1ldGhvZHMuICBUaGUgZ29hbCBvZiB0aGVzZSBtZXRob2RzIGlzIHRvIHNldCB0aGUgZmluYWwKKyAgICAgICAgIyB2YWx1ZXMgZm9yIHRoZSBpbnN0YWxsX3tsaWIsc2NyaXB0cyxkYXRhLC4uLn0gIG9wdGlvbnMsIHVzaW5nIGFzCisgICAgICAgICMgaW5wdXQgYSBoZWFkeSBicmV3IG9mIHByZWZpeCwgZXhlY19wcmVmaXgsIGhvbWUsIGluc3RhbGxfYmFzZSwKKyAgICAgICAgIyBpbnN0YWxsX3BsYXRiYXNlLCB1c2VyLXN1cHBsaWVkIHZlcnNpb25zIG9mCisgICAgICAgICMgaW5zdGFsbF97cHVyZWxpYixwbGF0bGliLGxpYixzY3JpcHRzLGRhdGEsLi4ufSwgYW5kIHRoZQorICAgICAgICAjIElOU1RBTExfU0NIRU1FIGRpY3Rpb25hcnkgYWJvdmUuICBQaGV3IQorCisgICAgICAgIHNlbGYuZHVtcF9kaXJzKCJwcmUtZmluYWxpemVfe3VuaXgsb3RoZXJ9IikKKworICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBzZWxmLmZpbmFsaXplX3VuaXgoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maW5hbGl6ZV9vdGhlcigpCisKKyAgICAgICAgc2VsZi5kdW1wX2RpcnMoInBvc3QtZmluYWxpemVfe3VuaXgsb3RoZXJ9KCkiKQorCisgICAgICAgICMgRXhwYW5kIGNvbmZpZ3VyYXRpb24gdmFyaWFibGVzLCB0aWxkZSwgZXRjLiBpbiBzZWxmLmluc3RhbGxfYmFzZQorICAgICAgICAjIGFuZCBzZWxmLmluc3RhbGxfcGxhdGJhc2UgLS0gdGhhdCB3YXksIHdlIGNhbiB1c2UgJGJhc2Ugb3IKKyAgICAgICAgIyAkcGxhdGJhc2UgaW4gdGhlIG90aGVyIGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyBhbmQgbm90IHdvcnJ5CisgICAgICAgICMgYWJvdXQgbmVlZGluZyByZWN1cnNpdmUgdmFyaWFibGUgZXhwYW5zaW9uIChzaHVkZGVyKS4KKworICAgICAgICBweV92ZXJzaW9uID0gKHN0cmluZy5zcGxpdChzeXMudmVyc2lvbikpWzBdCisgICAgICAgIChwcmVmaXgsIGV4ZWNfcHJlZml4KSA9IGdldF9jb25maWdfdmFycygncHJlZml4JywgJ2V4ZWNfcHJlZml4JykKKyAgICAgICAgc2VsZi5jb25maWdfdmFycyA9IHsnZGlzdF9uYW1lJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzdF92ZXJzaW9uJzogc2VsZi5kaXN0cmlidXRpb24uZ2V0X3ZlcnNpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGlzdF9mdWxsbmFtZSc6IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV92ZXJzaW9uJzogcHlfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9zaG9ydCc6IHB5X3ZlcnNpb25bMDozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHlfdmVyc2lvbl9ub2RvdCc6IHB5X3ZlcnNpb25bMF0gKyBweV92ZXJzaW9uWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXNfcHJlZml4JzogcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcmVmaXgnOiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5c19leGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjX3ByZWZpeCc6IGV4ZWNfcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyYmFzZSc6IHNlbGYuaW5zdGFsbF91c2VyYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcnNpdGUnOiBzZWxmLmluc3RhbGxfdXNlcnNpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIHNlbGYuZXhwYW5kX2Jhc2VkaXJzKCkKKworICAgICAgICBzZWxmLmR1bXBfZGlycygicG9zdC1leHBhbmRfYmFzZWRpcnMoKSIpCisKKyAgICAgICAgIyBNU1lTIChwcm9iYWJseSkgd2lsbCBoYXZlIHRyYW5zZm9ybWVkIC0tcm9vdD0vIHRvIHRoZQorICAgICAgICAjIHdpbmRvd3MgcGF0aCB3aGVyZSB0aGUgbXN5cyBpcyBpbnN0YWxsZWQsIHNvIHdlIGNoZWNrIGlmIHJvb3QgYmVnaW5zCisgICAgICAgICMgd2l0aCBtc3lzcm9vdCBhbmQgaWYgaXQgZG9lcyB0aGVuIHJlbW92ZSB0aGlzIHBhcnQuCisgICAgICAgIGlmIHNlbGYucm9vdCBpcyBub3QgTm9uZSBhbmQgaXNfbXN5c19taW5ndygpOgorICAgICAgICAgICAgbXN5c3Jvb3QgPSBtc3lzX3Jvb3QoKQorICAgICAgICAgICAgaWYgbXN5c3Jvb3QgIT0gTm9uZSBhbmQgc2VsZi5yb290LmZpbmQobXN5c3Jvb3QpPT0wOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdCA9IHNlbGYucm9vdC5yZXBsYWNlKG1zeXNyb290LCAiLyIpCisKKyAgICAgICAgIyBOb3cgZGVmaW5lIGNvbmZpZyB2YXJzIGZvciB0aGUgYmFzZSBkaXJlY3RvcmllcyBzbyB3ZSBjYW4gZXhwYW5kCisgICAgICAgICMgZXZlcnl0aGluZyBlbHNlLgorICAgICAgICBzZWxmLmNvbmZpZ192YXJzWydiYXNlJ10gPSBzZWxmLmluc3RhbGxfYmFzZQorICAgICAgICBzZWxmLmNvbmZpZ192YXJzWydwbGF0YmFzZSddID0gc2VsZi5pbnN0YWxsX3BsYXRiYXNlCisKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CisgICAgICAgICAgICBwcmludCAiY29uZmlnIHZhcnM6IgorICAgICAgICAgICAgcHByaW50KHNlbGYuY29uZmlnX3ZhcnMpCisKKyAgICAgICAgIyBFeHBhbmQgIn4iIGFuZCBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyBpbiB0aGUgaW5zdGFsbGF0aW9uCisgICAgICAgICMgZGlyZWN0b3JpZXMuCisgICAgICAgIHNlbGYuZXhwYW5kX2RpcnMoKQorCisgICAgICAgIHNlbGYuZHVtcF9kaXJzKCJwb3N0LWV4cGFuZF9kaXJzKCkiKQorCisgICAgICAgICMgQ3JlYXRlIGRpcmVjdG9yaWVzIGluIHRoZSBob21lIGRpcjoKKyAgICAgICAgaWYgc2VsZi51c2VyOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVfaG9tZV9wYXRoKCkKKworICAgICAgICAjIFBpY2sgdGhlIGFjdHVhbCBkaXJlY3RvcnkgdG8gaW5zdGFsbCBhbGwgbW9kdWxlcyB0bzogZWl0aGVyCisgICAgICAgICMgaW5zdGFsbF9wdXJlbGliIG9yIGluc3RhbGxfcGxhdGxpYiwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcworICAgICAgICAjIG1vZHVsZSBkaXN0cmlidXRpb24gaXMgcHVyZSBvciBub3QuICBPZiBjb3Vyc2UsIGlmIHRoZSB1c2VyCisgICAgICAgICMgYWxyZWFkeSBzcGVjaWZpZWQgaW5zdGFsbF9saWIsIHVzZSB0aGVpciBzZWxlY3Rpb24uCisgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9saWIgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmV4dF9tb2R1bGVzOiAjIGhhcyBleHRlbnNpb25zOiBub24tcHVyZQorICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9saWIgPSBzZWxmLmluc3RhbGxfcGxhdGxpYgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfbGliID0gc2VsZi5pbnN0YWxsX3B1cmVsaWIKKworCisgICAgICAgICMgQ29udmVydCBkaXJlY3RvcmllcyBmcm9tIFVuaXggLy1zZXBhcmF0ZWQgc3ludGF4IHRvIHRoZSBsb2NhbAorICAgICAgICAjIGNvbnZlbnRpb24uCisgICAgICAgIHNlbGYuY29udmVydF9wYXRocygnbGliJywgJ3B1cmVsaWInLCAncGxhdGxpYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0cycsICdkYXRhJywgJ2hlYWRlcnMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJiYXNlJywgJ3VzZXJzaXRlJykKKworICAgICAgICAjIFdlbGwsIHdlJ3JlIG5vdCBhY3R1YWxseSBmdWxseSBjb21wbGV0ZWx5IGZpbmFsaXplZCB5ZXQ6IHdlIHN0aWxsCisgICAgICAgICMgaGF2ZSB0byBkZWFsIHdpdGggJ2V4dHJhX3BhdGgnLCB3aGljaCBpcyB0aGUgaGFjayBmb3IgYWxsb3dpbmcKKyAgICAgICAgIyBub24tcGFja2FnaXplZCBtb2R1bGUgZGlzdHJpYnV0aW9ucyAoaGVsbG8sIE51bWVyaWNhbCBQeXRob24hKSB0bworICAgICAgICAjIGdldCB0aGVpciBvd24gZGlyZWN0b3JpZXMuCisgICAgICAgIHNlbGYuaGFuZGxlX2V4dHJhX3BhdGgoKQorICAgICAgICBzZWxmLmluc3RhbGxfbGliYmFzZSA9IHNlbGYuaW5zdGFsbF9saWIgIyBuZWVkZWQgZm9yIC5wdGggZmlsZQorICAgICAgICBzZWxmLmluc3RhbGxfbGliID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9saWIsIHNlbGYuZXh0cmFfZGlycykKKworICAgICAgICAjIElmIGEgbmV3IHJvb3QgZGlyZWN0b3J5IHdhcyBzdXBwbGllZCwgbWFrZSBhbGwgdGhlIGluc3RhbGxhdGlvbgorICAgICAgICAjIGRpcnMgcmVsYXRpdmUgdG8gaXQuCisgICAgICAgIGlmIHNlbGYucm9vdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2hhbmdlX3Jvb3RzKCdsaWJiYXNlJywgJ2xpYicsICdwdXJlbGliJywgJ3BsYXRsaWInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NjcmlwdHMnLCAnZGF0YScsICdoZWFkZXJzJykKKworICAgICAgICBzZWxmLmR1bXBfZGlycygiYWZ0ZXIgcHJlcGVuZGluZyByb290IikKKworICAgICAgICAjIEZpbmQgb3V0IHRoZSBidWlsZCBkaXJlY3RvcmllcywgaWUuIHdoZXJlIHRvIGluc3RhbGwgZnJvbS4KKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2J1aWxkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9iYXNlJywgJ2J1aWxkX2Jhc2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9saWInLCAnYnVpbGRfbGliJykpCisKKyAgICAgICAgIyBQdW50IG9uIGRvYyBkaXJlY3RvcmllcyBmb3Igbm93IC0tIGFmdGVyIGFsbCwgd2UncmUgcHVudGluZyBvbgorICAgICAgICAjIGRvY3VtZW50YXRpb24gY29tcGxldGVseSEKKworICAgICMgZmluYWxpemVfb3B0aW9ucyAoKQorCisKKyAgICBkZWYgZHVtcF9kaXJzIChzZWxmLCBtc2cpOgorICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLmZhbmN5X2dldG9wdCBpbXBvcnQgbG9uZ29wdF94bGF0ZQorICAgICAgICAgICAgcHJpbnQgbXNnICsgIjoiCisgICAgICAgICAgICBmb3Igb3B0IGluIHNlbGYudXNlcl9vcHRpb25zOgorICAgICAgICAgICAgICAgIG9wdF9uYW1lID0gb3B0WzBdCisgICAgICAgICAgICAgICAgaWYgb3B0X25hbWVbLTFdID09ICI9IjoKKyAgICAgICAgICAgICAgICAgICAgb3B0X25hbWUgPSBvcHRfbmFtZVswOi0xXQorICAgICAgICAgICAgICAgIGlmIG9wdF9uYW1lIGluIHNlbGYubmVnYXRpdmVfb3B0OgorICAgICAgICAgICAgICAgICAgICBvcHRfbmFtZSA9IHN0cmluZy50cmFuc2xhdGUoc2VsZi5uZWdhdGl2ZV9vcHRbb3B0X25hbWVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ29wdF94bGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gbm90IGdldGF0dHIoc2VsZiwgb3B0X25hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3B0X25hbWUgPSBzdHJpbmcudHJhbnNsYXRlKG9wdF9uYW1lLCBsb25nb3B0X3hsYXRlKQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIG9wdF9uYW1lKQorICAgICAgICAgICAgICAgIHByaW50ICIgICVzOiAlcyIgJSAob3B0X25hbWUsIHZhbCkKKworCisgICAgZGVmIGZpbmFsaXplX3VuaXggKHNlbGYpOgorCisgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9iYXNlIGlzIG5vdCBOb25lIG9yIHNlbGYuaW5zdGFsbF9wbGF0YmFzZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmICgoc2VsZi5pbnN0YWxsX2xpYiBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfcHVyZWxpYiBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfcGxhdGxpYiBpcyBOb25lKSBvcgorICAgICAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9oZWFkZXJzIGlzIE5vbmUgb3IKKyAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0cyBpcyBOb25lIG9yCisgICAgICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2RhdGEgaXMgTm9uZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImluc3RhbGwtYmFzZSBvciBpbnN0YWxsLXBsYXRiYXNlIHN1cHBsaWVkLCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICJpbnN0YWxsYXRpb24gc2NoZW1lIGlzIGluY29tcGxldGUiKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgc2VsZi51c2VyOgorICAgICAgICAgICAgaWYgc2VsZi5pbnN0YWxsX3VzZXJiYXNlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIlVzZXIgYmFzZSBkaXJlY3RvcnkgaXMgbm90IHNwZWNpZmllZCIpCisgICAgICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IHNlbGYuaW5zdGFsbF91c2VyYmFzZQorICAgICAgICAgICAgc2VsZi5zZWxlY3Rfc2NoZW1lKCJ1bml4X3VzZXIiKQorICAgICAgICBlbGlmIHNlbGYuaG9tZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9iYXNlID0gc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gc2VsZi5ob21lCisgICAgICAgICAgICBzZWxmLnNlbGVjdF9zY2hlbWUoInVuaXhfaG9tZSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLnByZWZpeCBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZXhlY19wcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IG5vdCBzdXBwbHkgZXhlYy1wcmVmaXggd2l0aG91dCBwcmVmaXgiCisKKyAgICAgICAgICAgICAgICBzZWxmLnByZWZpeCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLnByZWZpeCkKKyAgICAgICAgICAgICAgICBzZWxmLmV4ZWNfcHJlZml4ID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY19wcmVmaXgpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5leGVjX3ByZWZpeCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmV4ZWNfcHJlZml4ID0gc2VsZi5wcmVmaXgKKworICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLnByZWZpeAorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3BsYXRiYXNlID0gc2VsZi5leGVjX3ByZWZpeAorICAgICAgICAgICAgc2VsZi5zZWxlY3Rfc2NoZW1lKCJ1bml4X3ByZWZpeCIpCisKKyAgICAjIGZpbmFsaXplX3VuaXggKCkKKworCisgICAgZGVmIGZpbmFsaXplX290aGVyIChzZWxmKTogICAgICAgICAgIyBXaW5kb3dzIGFuZCBNYWMgT1MgZm9yIG5vdworCisgICAgICAgIGlmIHNlbGYudXNlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuaW5zdGFsbF91c2VyYmFzZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJVc2VyIGJhc2UgZGlyZWN0b3J5IGlzIG5vdCBzcGVjaWZpZWQiKQorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBzZWxmLmluc3RhbGxfdXNlcmJhc2UKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZShvcy5uYW1lICsgIl91c2VyIikKKyAgICAgICAgZWxpZiBzZWxmLmhvbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxfYmFzZSA9IHNlbGYuaW5zdGFsbF9wbGF0YmFzZSA9IHNlbGYuaG9tZQorICAgICAgICAgICAgc2VsZi5zZWxlY3Rfc2NoZW1lKCJ1bml4X2hvbWUiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5wcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnByZWZpeCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLnByZWZpeCkKKworICAgICAgICAgICAgc2VsZi5pbnN0YWxsX2Jhc2UgPSBzZWxmLmluc3RhbGxfcGxhdGJhc2UgPSBzZWxmLnByZWZpeAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0X3NjaGVtZShvcy5uYW1lKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiSSBkb24ndCBrbm93IGhvdyB0byBpbnN0YWxsIHN0dWZmIG9uICclcyciICUgb3MubmFtZQorCisgICAgIyBmaW5hbGl6ZV9vdGhlciAoKQorCisKKyAgICBkZWYgc2VsZWN0X3NjaGVtZSAoc2VsZiwgbmFtZSk6CisgICAgICAgICMgaXQncyB0aGUgY2FsbGVyJ3MgcHJvYmxlbSBpZiB0aGV5IHN1cHBseSBhIGJhZCBuYW1lIQorICAgICAgICBzY2hlbWUgPSBJTlNUQUxMX1NDSEVNRVNbbmFtZV0KKyAgICAgICAgZm9yIGtleSBpbiBTQ0hFTUVfS0VZUzoKKyAgICAgICAgICAgIGF0dHJuYW1lID0gJ2luc3RhbGxfJyArIGtleQorICAgICAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCBhdHRybmFtZSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHJuYW1lLCBzY2hlbWVba2V5XSkKKworCisgICAgZGVmIF9leHBhbmRfYXR0cnMgKHNlbGYsIGF0dHJzKToKKyAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CisgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHNlbGYsIGF0dHIpCisgICAgICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnIG9yIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gb3MucGF0aC5leHBhbmR1c2VyKHZhbCkKKyAgICAgICAgICAgICAgICB2YWwgPSBzdWJzdF92YXJzKHZhbCwgc2VsZi5jb25maWdfdmFycykKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbCkKKworCisgICAgZGVmIGV4cGFuZF9iYXNlZGlycyAoc2VsZik6CisgICAgICAgIHNlbGYuX2V4cGFuZF9hdHRycyhbJ2luc3RhbGxfYmFzZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxfcGxhdGJhc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyb290J10pCisKKyAgICBkZWYgZXhwYW5kX2RpcnMgKHNlbGYpOgorICAgICAgICBzZWxmLl9leHBhbmRfYXR0cnMoWydpbnN0YWxsX3B1cmVsaWInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsX3BsYXRsaWInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbnN0YWxsX2xpYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxfaGVhZGVycycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxfc2NyaXB0cycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luc3RhbGxfZGF0YScsXSkKKworCisgICAgZGVmIGNvbnZlcnRfcGF0aHMgKHNlbGYsICpuYW1lcyk6CisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgYXR0ciA9ICJpbnN0YWxsXyIgKyBuYW1lCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIGNvbnZlcnRfcGF0aChnZXRhdHRyKHNlbGYsIGF0dHIpKSkKKworCisgICAgZGVmIGhhbmRsZV9leHRyYV9wYXRoIChzZWxmKToKKworICAgICAgICBpZiBzZWxmLmV4dHJhX3BhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXh0cmFfcGF0aCA9IHNlbGYuZGlzdHJpYnV0aW9uLmV4dHJhX3BhdGgKKworICAgICAgICBpZiBzZWxmLmV4dHJhX3BhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiB0eXBlKHNlbGYuZXh0cmFfcGF0aCkgaXMgU3RyaW5nVHlwZToKKyAgICAgICAgICAgICAgICBzZWxmLmV4dHJhX3BhdGggPSBzdHJpbmcuc3BsaXQoc2VsZi5leHRyYV9wYXRoLCAnLCcpCisKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLmV4dHJhX3BhdGgpID09IDE6CisgICAgICAgICAgICAgICAgcGF0aF9maWxlID0gZXh0cmFfZGlycyA9IHNlbGYuZXh0cmFfcGF0aFswXQorICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5leHRyYV9wYXRoKSA9PSAyOgorICAgICAgICAgICAgICAgIChwYXRoX2ZpbGUsIGV4dHJhX2RpcnMpID0gc2VsZi5leHRyYV9wYXRoCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCInZXh0cmFfcGF0aCcgb3B0aW9uIG11c3QgYmUgYSBsaXN0LCB0dXBsZSwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICJjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIHdpdGggMSBvciAyIGVsZW1lbnRzIikKKworICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGxvY2FsIGZvcm0gaW4gY2FzZSBVbml4IG5vdGF0aW9uIHVzZWQgKGFzIGl0CisgICAgICAgICAgICAjIHNob3VsZCBiZSBpbiBzZXR1cCBzY3JpcHRzKQorICAgICAgICAgICAgZXh0cmFfZGlycyA9IGNvbnZlcnRfcGF0aChleHRyYV9kaXJzKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoX2ZpbGUgPSBOb25lCisgICAgICAgICAgICBleHRyYV9kaXJzID0gJycKKworICAgICAgICAjIFhYWCBzaG91bGQgd2Ugd2FybiBpZiBwYXRoX2ZpbGUgYW5kIG5vdCBleHRyYV9kaXJzPyAoaW4gd2hpY2gKKyAgICAgICAgIyBjYXNlIHRoZSBwYXRoIGZpbGUgd291bGQgYmUgaGFybWxlc3MgYnV0IHBvaW50bGVzcykKKyAgICAgICAgc2VsZi5wYXRoX2ZpbGUgPSBwYXRoX2ZpbGUKKyAgICAgICAgc2VsZi5leHRyYV9kaXJzID0gZXh0cmFfZGlycworCisgICAgIyBoYW5kbGVfZXh0cmFfcGF0aCAoKQorCisKKyAgICBkZWYgY2hhbmdlX3Jvb3RzIChzZWxmLCAqbmFtZXMpOgorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGF0dHIgPSAiaW5zdGFsbF8iICsgbmFtZQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBjaGFuZ2Vfcm9vdChzZWxmLnJvb3QsIGdldGF0dHIoc2VsZiwgYXR0cikpKQorCisgICAgZGVmIGNyZWF0ZV9ob21lX3BhdGgoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBkaXJlY3RvcmllcyB1bmRlciB+CisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi51c2VyOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGhvbWUgPSBjb252ZXJ0X3BhdGgob3MucGF0aC5leHBhbmR1c2VyKCJ+IikpCisgICAgICAgIGZvciBuYW1lLCBwYXRoIGluIHNlbGYuY29uZmlnX3ZhcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoaG9tZSkgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIm9zLm1ha2VkaXJzKCclcycsIDA3MDApIiAlIHBhdGgpCisgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMocGF0aCwgMDcwMCkKKworICAgICMgLS0gQ29tbWFuZCBleGVjdXRpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcnVuIChzZWxmKToKKworICAgICAgICAjIE9idmlvdXNseSBoYXZlIHRvIGJ1aWxkIGJlZm9yZSB3ZSBjYW4gaW5zdGFsbAorICAgICAgICBpZiBub3Qgc2VsZi5za2lwX2J1aWxkOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGQnKQorICAgICAgICAgICAgIyBJZiB3ZSBidWlsdCBmb3IgYW55IG90aGVyIHBsYXRmb3JtLCB3ZSBjYW4ndCBpbnN0YWxsLgorICAgICAgICAgICAgYnVpbGRfcGxhdCA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignYnVpbGQnKS5wbGF0X25hbWUKKyAgICAgICAgICAgICMgY2hlY2sgd2Fybl9kaXIgLSBpdCBpcyBhIGNsdWUgdGhhdCB0aGUgJ2luc3RhbGwnIGlzIGhhcHBlbmluZworICAgICAgICAgICAgIyBpbnRlcm5hbGx5LCBhbmQgbm90IHRvIHN5cy5wYXRoLCBzbyB3ZSBkb24ndCBjaGVjayB0aGUgcGxhdGZvcm0KKyAgICAgICAgICAgICMgbWF0Y2hlcyB3aGF0IHdlIGFyZSBydW5uaW5nLgorICAgICAgICAgICAgaWYgc2VsZi53YXJuX2RpciBhbmQgYnVpbGRfcGxhdCAhPSBnZXRfcGxhdGZvcm0oKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKCJDYW4ndCBpbnN0YWxsIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3NzLWNvbXBpbGluZyIpCisKKyAgICAgICAgIyBSdW4gYWxsIHN1Yi1jb21tYW5kcyAoYXQgbGVhc3QgdGhvc2UgdGhhdCBuZWVkIHRvIGJlIHJ1bikKKyAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKKworICAgICAgICBpZiBzZWxmLnBhdGhfZmlsZToKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX3BhdGhfZmlsZSgpCisKKyAgICAgICAgIyB3cml0ZSBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcywgaWYgcmVxdWVzdGVkLgorICAgICAgICBpZiBzZWxmLnJlY29yZDoKKyAgICAgICAgICAgIG91dHB1dHMgPSBzZWxmLmdldF9vdXRwdXRzKCkKKyAgICAgICAgICAgIGlmIHNlbGYucm9vdDogICAgICAgICAgICAgICAjIHN0cmlwIGFueSBwYWNrYWdlIHByZWZpeAorICAgICAgICAgICAgICAgIHJvb3RfbGVuID0gbGVuKHNlbGYucm9vdCkKKyAgICAgICAgICAgICAgICBmb3IgY291bnRlciBpbiB4cmFuZ2UobGVuKG91dHB1dHMpKToKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0c1tjb3VudGVyXSA9IG91dHB1dHNbY291bnRlcl1bcm9vdF9sZW46XQorICAgICAgICAgICAgc2VsZi5leGVjdXRlKHdyaXRlX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYucmVjb3JkLCBvdXRwdXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGluZyBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyB0byAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWNvcmQpCisKKyAgICAgICAgc3lzX3BhdGggPSBtYXAob3MucGF0aC5ub3JtcGF0aCwgc3lzLnBhdGgpCisgICAgICAgIHN5c19wYXRoID0gbWFwKG9zLnBhdGgubm9ybWNhc2UsIHN5c19wYXRoKQorICAgICAgICBpbnN0YWxsX2xpYiA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5ub3JtcGF0aChzZWxmLmluc3RhbGxfbGliKSkKKyAgICAgICAgaWYgKHNlbGYud2Fybl9kaXIgYW5kCisgICAgICAgICAgICBub3QgKHNlbGYucGF0aF9maWxlIGFuZCBzZWxmLmluc3RhbGxfcGF0aF9maWxlKSBhbmQKKyAgICAgICAgICAgIGluc3RhbGxfbGliIG5vdCBpbiBzeXNfcGF0aCk6CisgICAgICAgICAgICBsb2cuZGVidWcoKCJtb2R1bGVzIGluc3RhbGxlZCB0byAnJXMnLCB3aGljaCBpcyBub3QgaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uJ3MgbW9kdWxlIHNlYXJjaCBwYXRoIChzeXMucGF0aCkgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAieW91J2xsIGhhdmUgdG8gY2hhbmdlIHRoZSBzZWFyY2ggcGF0aCB5b3Vyc2VsZiIpLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfbGliKQorCisgICAgIyBydW4gKCkKKworICAgIGRlZiBjcmVhdGVfcGF0aF9maWxlIChzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2xpYmJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aF9maWxlICsgIi5wdGgiKQorICAgICAgICBpZiBzZWxmLmluc3RhbGxfcGF0aF9maWxlOgorICAgICAgICAgICAgc2VsZi5leGVjdXRlKHdyaXRlX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lLCBbc2VsZi5leHRyYV9kaXJzXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgImNyZWF0aW5nICVzIiAlIGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53YXJuKCJwYXRoIGZpbGUgJyVzJyBub3QgY3JlYXRlZCIgJSBmaWxlbmFtZSkKKworCisgICAgIyAtLSBSZXBvcnRpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBnZXRfb3V0cHV0cyAoc2VsZik6CisgICAgICAgICMgQXNzZW1ibGUgdGhlIG91dHB1dHMgb2YgYWxsIHRoZSBzdWItY29tbWFuZHMuCisgICAgICAgIG91dHB1dHMgPSBbXQorICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CisgICAgICAgICAgICBjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZChjbWRfbmFtZSkKKyAgICAgICAgICAgICMgQWRkIHRoZSBjb250ZW50cyBvZiBjbWQuZ2V0X291dHB1dHMoKSwgZW5zdXJpbmcKKyAgICAgICAgICAgICMgdGhhdCBvdXRwdXRzIGRvZXNuJ3QgY29udGFpbiBkdXBsaWNhdGUgZW50cmllcworICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGNtZC5nZXRfb3V0cHV0cygpOgorICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lIG5vdCBpbiBvdXRwdXRzOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChmaWxlbmFtZSkKKworICAgICAgICBpZiBzZWxmLnBhdGhfZmlsZSBhbmQgc2VsZi5pbnN0YWxsX3BhdGhfZmlsZToKKyAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfbGliYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGhfZmlsZSArICIucHRoIikpCisKKyAgICAgICAgcmV0dXJuIG91dHB1dHMKKworICAgIGRlZiBnZXRfaW5wdXRzIChzZWxmKToKKyAgICAgICAgIyBYWFggZ2VlLCB0aGlzIGxvb2tzIGZhbWlsaWFyIDstKAorICAgICAgICBpbnB1dHMgPSBbXQorICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CisgICAgICAgICAgICBjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZChjbWRfbmFtZSkKKyAgICAgICAgICAgIGlucHV0cy5leHRlbmQoY21kLmdldF9pbnB1dHMoKSkKKworICAgICAgICByZXR1cm4gaW5wdXRzCisKKworICAgICMgLS0gUHJlZGljYXRlcyBmb3Igc3ViLWNvbW1hbmQgbGlzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgaGFzX2xpYiAoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBoYXMgYW55IFB5dGhvbgorICAgICAgICBtb2R1bGVzIHRvIGluc3RhbGwuIiIiCisgICAgICAgIHJldHVybiAoc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpIG9yCisgICAgICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCkpCisKKyAgICBkZWYgaGFzX2hlYWRlcnMgKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kaXN0cmlidXRpb24uaGFzX2hlYWRlcnMoKQorCisgICAgZGVmIGhhc19zY3JpcHRzIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19zY3JpcHRzKCkKKworICAgIGRlZiBoYXNfZGF0YSAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZGF0YV9maWxlcygpCisKKworICAgICMgJ3N1Yl9jb21tYW5kcyc6IGEgbGlzdCBvZiBjb21tYW5kcyB0aGlzIGNvbW1hbmQgbWlnaHQgaGF2ZSB0byBydW4gdG8KKyAgICAjIGdldCBpdHMgd29yayBkb25lLiAgU2VlIGNtZC5weSBmb3IgbW9yZSBpbmZvLgorICAgIHN1Yl9jb21tYW5kcyA9IFsoJ2luc3RhbGxfbGliJywgICAgIGhhc19saWIpLAorICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfaGVhZGVycycsIGhhc19oZWFkZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCBoYXNfc2NyaXB0cyksCisgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9kYXRhJywgICAgaGFzX2RhdGEpLAorICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfZWdnX2luZm8nLCBsYW1iZGEgc2VsZjpUcnVlKSwKKyAgICAgICAgICAgICAgICAgICBdCisKKyMgY2xhc3MgaW5zdGFsbApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkY2I5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkY2I5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2RhdGEucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZGF0YS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQwNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2RhdGEucHkKQEAgLTAsMCArMSw4MSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnaW5zdGFsbF9kYXRhJyBjb21tYW5kLCBmb3IgaW5zdGFsbGluZworcGxhdGZvcm0taW5kZXBlbmRlbnQgZGF0YSBmaWxlcy4iIiIKKworIyBjb250cmlidXRlZCBieSBCYXN0aWFuIEtsZWluZWlkYW0KKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY2hhbmdlX3Jvb3QsIGNvbnZlcnRfcGF0aAorCitjbGFzcyBpbnN0YWxsX2RhdGEoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIGRhdGEgZmlsZXMiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLAorICAgICAgICAgImJhc2UgZGlyZWN0b3J5IGZvciBpbnN0YWxsaW5nIGRhdGEgZmlsZXMgIgorICAgICAgICAgIihkZWZhdWx0OiBpbnN0YWxsYXRpb24gYmFzZSBkaXIpIiksCisgICAgICAgICgncm9vdD0nLCBOb25lLAorICAgICAgICAgImluc3RhbGwgZXZlcnl0aGluZyByZWxhdGl2ZSB0byB0aGlzIGFsdGVybmF0ZSByb290IGRpcmVjdG9yeSIpLAorICAgICAgICAoJ2ZvcmNlJywgJ2YnLCAiZm9yY2UgaW5zdGFsbGF0aW9uIChvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMpIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnZm9yY2UnXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5vdXRmaWxlcyA9IFtdCisgICAgICAgIHNlbGYucm9vdCA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JjZSA9IDAKKyAgICAgICAgc2VsZi5kYXRhX2ZpbGVzID0gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcworICAgICAgICBzZWxmLndhcm5fZGlyID0gMQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2RhdGEnLCAnaW5zdGFsbF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdyb290JywgJ3Jvb3QnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdmb3JjZScsICdmb3JjZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgIGZvciBmIGluIHNlbGYuZGF0YV9maWxlczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgc3RyKToKKyAgICAgICAgICAgICAgICAjIGl0J3MgYSBzaW1wbGUgZmlsZSwgc28gY29weSBpdAorICAgICAgICAgICAgICAgIGYgPSBjb252ZXJ0X3BhdGgoZikKKyAgICAgICAgICAgICAgICBpZiBzZWxmLndhcm5fZGlyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oInNldHVwIHNjcmlwdCBkaWQgbm90IHByb3ZpZGUgYSBkaXJlY3RvcnkgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIC0tIGluc3RhbGxpbmcgcmlnaHQgaW4gJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGYsIHNlbGYuaW5zdGFsbF9kaXIpKQorICAgICAgICAgICAgICAgIChvdXQsIF8pID0gc2VsZi5jb3B5X2ZpbGUoZiwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZChvdXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgaXQncyBhIHR1cGxlIHdpdGggcGF0aCB0byBpbnN0YWxsIHRvIGFuZCBhIGxpc3Qgb2YgZmlsZXMKKyAgICAgICAgICAgICAgICBkaXIgPSBjb252ZXJ0X3BhdGgoZlswXSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhkaXIpOgorICAgICAgICAgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgZGlyKQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5yb290OgorICAgICAgICAgICAgICAgICAgICBkaXIgPSBjaGFuZ2Vfcm9vdChzZWxmLnJvb3QsIGRpcikKKyAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChkaXIpCisKKyAgICAgICAgICAgICAgICBpZiBmWzFdID09IFtdOgorICAgICAgICAgICAgICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBmaWxlcyBsaXN0ZWQsIHRoZSB1c2VyIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgIyB0cnlpbmcgdG8gY3JlYXRlIGFuIGVtcHR5IGRpcmVjdG9yeSwgc28gYWRkIHRoZQorICAgICAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBvdXRwdXQgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0ZmlsZXMuYXBwZW5kKGRpcikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIENvcHkgZmlsZXMsIGFkZGluZyB0aGVtIHRvIHRoZSBsaXN0IG9mIG91dHB1dCBmaWxlcy4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGRhdGEgaW4gZlsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBjb252ZXJ0X3BhdGgoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIChvdXQsIF8pID0gc2VsZi5jb3B5X2ZpbGUoZGF0YSwgZGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRmaWxlcy5hcHBlbmQob3V0KQorCisgICAgZGVmIGdldF9pbnB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGFfZmlsZXMgb3IgW10KKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3V0ZmlsZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDIyY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2RhdGEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9kYXRhLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDIyY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2RhdGEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg4MDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CkBAIC0wLDAgKzEsNzggQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm8KKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdpbnN0YWxsX2VnZ19pbmZvJyBjb21tYW5kLCBmb3IgaW5zdGFsbGluZworYSBwYWNrYWdlJ3MgUEtHLUlORk8gbWV0YWRhdGEuIiIiCisKKworZnJvbSBkaXN0dXRpbHMuY21kIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nLCBkaXJfdXRpbAoraW1wb3J0IG9zLCBzeXMsIHJlCisKK2NsYXNzIGluc3RhbGxfZWdnX2luZm8oQ29tbWFuZCk6CisgICAgIiIiSW5zdGFsbCBhbiAuZWdnLWluZm8gZmlsZSBmb3IgdGhlIHBhY2thZ2UiIiIKKworICAgIGRlc2NyaXB0aW9uID0gIkluc3RhbGwgcGFja2FnZSdzIFBLRy1JTkZPIG1ldGFkYXRhIGFzIGFuIC5lZ2ctaW5mbyBmaWxlIgorICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdpbnN0YWxsLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gaW5zdGFsbCB0byIpLAorICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGxfbGliJywoJ2luc3RhbGxfZGlyJywnaW5zdGFsbF9kaXInKSkKKyAgICAgICAgYmFzZW5hbWUgPSAiJXMtJXMtcHklcy5lZ2ctaW5mbyIgJSAoCisgICAgICAgICAgICB0b19maWxlbmFtZShzYWZlX25hbWUoc2VsZi5kaXN0cmlidXRpb24uZ2V0X25hbWUoKSkpLAorICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2FmZV92ZXJzaW9uKHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkpKSwKKyAgICAgICAgICAgIHN5cy52ZXJzaW9uWzozXQorICAgICAgICApCisgICAgICAgIHNlbGYudGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsIGJhc2VuYW1lKQorICAgICAgICBzZWxmLm91dHB1dHMgPSBbc2VsZi50YXJnZXRdCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICB0YXJnZXQgPSBzZWxmLnRhcmdldAorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHRhcmdldCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayh0YXJnZXQpOgorICAgICAgICAgICAgZGlyX3V0aWwucmVtb3ZlX3RyZWUodGFyZ2V0LCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgorICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywoc2VsZi50YXJnZXQsKSwiUmVtb3ZpbmcgIit0YXJnZXQpCisgICAgICAgIGVsaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5pbnN0YWxsX2Rpcik6CisgICAgICAgICAgICBzZWxmLmV4ZWN1dGUob3MubWFrZWRpcnMsIChzZWxmLmluc3RhbGxfZGlyLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nICIrc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgbG9nLmluZm8oIldyaXRpbmcgJXMiLCB0YXJnZXQpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsICd3JykKKyAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhLndyaXRlX3BrZ19maWxlKGYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3V0cHV0cworCisKKyMgVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgdGFrZW4gZnJvbSBzZXR1cHRvb2xzJyBwa2dfcmVzb3VyY2VzIG1vZHVsZSBhbmQKKyMgY2FuIGJlIHJlcGxhY2VkIGJ5IGltcG9ydGluZyB0aGVtIGZyb20gcGtnX3Jlc291cmNlcyBvbmNlIGl0IGlzIGluY2x1ZGVkCisjIGluIHRoZSBzdGRsaWIuCisKK2RlZiBzYWZlX25hbWUobmFtZSk6CisgICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIG5hbWUKKworICAgIEFueSBydW5zIG9mIG5vbi1hbHBoYW51bWVyaWMvLiBjaGFyYWN0ZXJzIGFyZSByZXBsYWNlZCB3aXRoIGEgc2luZ2xlICctJy4KKyAgICAiIiIKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgbmFtZSkKKworCitkZWYgc2FmZV92ZXJzaW9uKHZlcnNpb24pOgorICAgICIiIkNvbnZlcnQgYW4gYXJiaXRyYXJ5IHN0cmluZyB0byBhIHN0YW5kYXJkIHZlcnNpb24gc3RyaW5nCisKKyAgICBTcGFjZXMgYmVjb21lIGRvdHMsIGFuZCBhbGwgb3RoZXIgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGJlY29tZQorICAgIGRhc2hlcywgd2l0aCBydW5zIG9mIG11bHRpcGxlIGRhc2hlcyBjb25kZW5zZWQgdG8gYSBzaW5nbGUgZGFzaC4KKyAgICAiIiIKKyAgICB2ZXJzaW9uID0gdmVyc2lvbi5yZXBsYWNlKCcgJywnLicpCisgICAgcmV0dXJuIHJlLnN1YignW15BLVphLXowLTkuXSsnLCAnLScsIHZlcnNpb24pCisKKworZGVmIHRvX2ZpbGVuYW1lKG5hbWUpOgorICAgICIiIkNvbnZlcnQgYSBwcm9qZWN0IG9yIHZlcnNpb24gbmFtZSB0byBpdHMgZmlsZW5hbWUtZXNjYXBlZCBmb3JtCisKKyAgICBBbnkgJy0nIGNoYXJhY3RlcnMgYXJlIGN1cnJlbnRseSByZXBsYWNlZCB3aXRoICdfJy4KKyAgICAiIiIKKyAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCctJywnXycpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQ5YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfZWdnX2luZm8ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTQ5YTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9oZWFkZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTI0MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfaGVhZGVycy5weQpAQCAtMCwwICsxLDUxIEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2hlYWRlcnMKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdpbnN0YWxsX2hlYWRlcnMnIGNvbW1hbmQsIHRvIGluc3RhbGwgQy9DKysgaGVhZGVyCitmaWxlcyB0byB0aGUgUHl0aG9uIGluY2x1ZGUgZGlyZWN0b3J5LiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorCisKKyMgWFhYIGZvcmNlIGlzIG5ldmVyIHVzZWQKK2NsYXNzIGluc3RhbGxfaGVhZGVycyhDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgQy9DKysgaGVhZGVyIGZpbGVzIgorCisgICAgdXNlcl9vcHRpb25zID0gWygnaW5zdGFsbC1kaXI9JywgJ2QnLAorICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSB0byBpbnN0YWxsIGhlYWRlciBmaWxlcyB0byIpLAorICAgICAgICAgICAgICAgICAgICAoJ2ZvcmNlJywgJ2YnLAorICAgICAgICAgICAgICAgICAgICAgImZvcmNlIGluc3RhbGxhdGlvbiAob3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzKSIpLAorICAgICAgICAgICAgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnZm9yY2UnXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JjZSA9IDAKKyAgICAgICAgc2VsZi5vdXRmaWxlcyA9IFtdCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfaGVhZGVycycsICdpbnN0YWxsX2RpcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ZvcmNlJywgJ2ZvcmNlJykpCisKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIGhlYWRlcnMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5oZWFkZXJzCisgICAgICAgIGlmIG5vdCBoZWFkZXJzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgZm9yIGhlYWRlciBpbiBoZWFkZXJzOgorICAgICAgICAgICAgKG91dCwgXykgPSBzZWxmLmNvcHlfZmlsZShoZWFkZXIsIHNlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgICAgICBzZWxmLm91dGZpbGVzLmFwcGVuZChvdXQpCisKKyAgICBkZWYgZ2V0X2lucHV0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGlzdHJpYnV0aW9uLmhlYWRlcnMgb3IgW10KKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3V0ZmlsZXMKKworIyBjbGFzcyBpbnN0YWxsX2hlYWRlcnMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9oZWFkZXJzLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9oZWFkZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTMzZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2hlYWRlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9oZWFkZXJzLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9oZWFkZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTMzZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2hlYWRlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9saWIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2U4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfbGliLnB5CkBAIC0wLDAgKzEsMjE5IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2xpYgorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ2luc3RhbGxfbGliJyBjb21tYW5kCisoaW5zdGFsbCBhbGwgUHl0aG9uIG1vZHVsZXMpLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKKworCisjIEV4dGVuc2lvbiBmb3IgUHl0aG9uIHNvdXJjZSBmaWxlcy4KK2lmIGhhc2F0dHIob3MsICdleHRzZXAnKToKKyAgICBQWVRIT05fU09VUkNFX0VYVEVOU0lPTiA9IG9zLmV4dHNlcCArICJweSIKK2Vsc2U6CisgICAgUFlUSE9OX1NPVVJDRV9FWFRFTlNJT04gPSAiLnB5IgorCitjbGFzcyBpbnN0YWxsX2xpYihDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgYWxsIFB5dGhvbiBtb2R1bGVzIChleHRlbnNpb25zIGFuZCBwdXJlIFB5dGhvbikiCisKKyAgICAjIFRoZSBieXRlLWNvbXBpbGF0aW9uIG9wdGlvbnMgYXJlIGEgdGFkIGNvbmZ1c2luZy4gIEhlcmUgYXJlIHRoZQorICAgICMgcG9zc2libGUgc2NlbmFyaW9zOgorICAgICMgICAxKSBubyBjb21waWxhdGlvbiBhdCBhbGwgKC0tbm8tY29tcGlsZSAtLW5vLW9wdGltaXplKQorICAgICMgICAyKSBjb21waWxlIC5weWMgb25seSAoLS1jb21waWxlIC0tbm8tb3B0aW1pemU7IGRlZmF1bHQpCisgICAgIyAgIDMpIGNvbXBpbGUgLnB5YyBhbmQgImxldmVsIDEiIC5weW8gKC0tY29tcGlsZSAtLW9wdGltaXplKQorICAgICMgICA0KSBjb21waWxlICJsZXZlbCAxIiAucHlvIG9ubHkgKC0tbm8tY29tcGlsZSAtLW9wdGltaXplKQorICAgICMgICA1KSBjb21waWxlIC5weWMgYW5kICJsZXZlbCAyIiAucHlvICgtLWNvbXBpbGUgLS1vcHRpbWl6ZS1tb3JlKQorICAgICMgICA2KSBjb21waWxlICJsZXZlbCAyIiAucHlvIG9ubHkgKC0tbm8tY29tcGlsZSAtLW9wdGltaXplLW1vcmUpCisgICAgIworICAgICMgVGhlIFVJIGZvciB0aGlzIGlzIHR3byBvcHRpb24sICdjb21waWxlJyBhbmQgJ29wdGltaXplJy4KKyAgICAjICdjb21waWxlJyBpcyBzdHJpY3RseSBib29sZWFuLCBhbmQgb25seSBkZWNpZGVzIHdoZXRoZXIgdG8KKyAgICAjIGdlbmVyYXRlIC5weWMgZmlsZXMuICAnb3B0aW1pemUnIGlzIHRocmVlLXdheSAoMCwgMSwgb3IgMiksIGFuZAorICAgICMgZGVjaWRlcyBib3RoIHdoZXRoZXIgdG8gZ2VuZXJhdGUgLnB5byBmaWxlcyBhbmQgd2hhdCBsZXZlbCBvZgorICAgICMgb3B0aW1pemF0aW9uIHRvIHVzZS4KKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdpbnN0YWxsLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gaW5zdGFsbCB0byIpLAorICAgICAgICAoJ2J1aWxkLWRpcj0nLCdiJywgImJ1aWxkIGRpcmVjdG9yeSAod2hlcmUgdG8gaW5zdGFsbCBmcm9tKSIpLAorICAgICAgICAoJ2ZvcmNlJywgJ2YnLCAiZm9yY2UgaW5zdGFsbGF0aW9uIChvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMpIiksCisgICAgICAgICgnY29tcGlsZScsICdjJywgImNvbXBpbGUgLnB5IHRvIC5weWMgW2RlZmF1bHRdIiksCisgICAgICAgICgnbm8tY29tcGlsZScsIE5vbmUsICJkb24ndCBjb21waWxlIC5weSBmaWxlcyIpLAorICAgICAgICAoJ29wdGltaXplPScsICdPJywKKyAgICAgICAgICJhbHNvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb246IC1PMSBmb3IgXCJweXRob24gLU9cIiwgIgorICAgICAgICAgIi1PMiBmb3IgXCJweXRob24gLU9PXCIsIGFuZCAtTzAgdG8gZGlzYWJsZSBbZGVmYXVsdDogLU8wXSIpLAorICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLCAic2tpcCB0aGUgYnVpbGQgc3RlcHMiKSwKKyAgICAgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydmb3JjZScsICdjb21waWxlJywgJ3NraXAtYnVpbGQnXQorICAgIG5lZ2F0aXZlX29wdCA9IHsnbm8tY29tcGlsZScgOiAnY29tcGlsZSd9CisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAjIGxldCB0aGUgJ2luc3RhbGwnIGNvbW1hbmQgZGljdGF0ZSBvdXIgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeQorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQorICAgICAgICBzZWxmLmJ1aWxkX2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5mb3JjZSA9IDAKKyAgICAgICAgc2VsZi5jb21waWxlID0gTm9uZQorICAgICAgICBzZWxmLm9wdGltaXplID0gTm9uZQorICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIyBHZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiB3ZSBuZWVkIHRvIGluc3RhbGwgcHVyZSBQeXRob24gbW9kdWxlcworICAgICAgICAjIGZyb20gdGhlIHVtYnJlbGxhICdpbnN0YWxsJyBjb21tYW5kIC0tIGJ1aWxkIChzb3VyY2UpIGRpcmVjdG9yeSwKKyAgICAgICAgIyBpbnN0YWxsICh0YXJnZXQpIGRpcmVjdG9yeSwgYW5kIHdoZXRoZXIgdG8gY29tcGlsZSAucHkgZmlsZXMuCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdidWlsZF9saWInLCAnYnVpbGRfZGlyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9saWInLCAnaW5zdGFsbF9kaXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdmb3JjZScsICdmb3JjZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NvbXBpbGUnLCAnY29tcGlsZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ29wdGltaXplJywgJ29wdGltaXplJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnc2tpcF9idWlsZCcsICdza2lwX2J1aWxkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGlmIHNlbGYuY29tcGlsZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jb21waWxlID0gMQorICAgICAgICBpZiBzZWxmLm9wdGltaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLm9wdGltaXplID0gMAorCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYub3B0aW1pemUsIGludCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IGludChzZWxmLm9wdGltaXplKQorICAgICAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemUgbm90IGluICgwLCAxLCAyKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCAib3B0aW1pemUgbXVzdCBiZSAwLCAxLCBvciAyIgorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBidWlsdCBldmVyeXRoaW5nIHdlIG5lZWQgZmlyc3QKKyAgICAgICAgc2VsZi5idWlsZCgpCisKKyAgICAgICAgIyBJbnN0YWxsIGV2ZXJ5dGhpbmc6IHNpbXBseSBkdW1wIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGJ1aWxkCisgICAgICAgICMgZGlyZWN0b3J5IHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICh0aGF0J3MgdGhlIGJlYXV0eSBvZgorICAgICAgICAjIGhhdmluZyBhIGJ1aWxkIGRpcmVjdG9yeSEpCisgICAgICAgIG91dGZpbGVzID0gc2VsZi5pbnN0YWxsKCkKKworICAgICAgICAjIChPcHRpb25hbGx5KSBjb21waWxlIC5weSB0byAucHljCisgICAgICAgIGlmIG91dGZpbGVzIGlzIG5vdCBOb25lIGFuZCBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CisgICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShvdXRmaWxlcykKKworICAgICMgLS0gVG9wLWxldmVsIHdvcmtlciBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAoY2FsbGVkIGZyb20gJ3J1bigpJykKKworICAgIGRlZiBidWlsZChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2tpcF9idWlsZDoKKyAgICAgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19wdXJlX21vZHVsZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9weScpCisgICAgICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZXh0X21vZHVsZXMoKToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9leHQnKQorCisgICAgZGVmIGluc3RhbGwoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi5idWlsZF9kaXIpOgorICAgICAgICAgICAgb3V0ZmlsZXMgPSBzZWxmLmNvcHlfdHJlZShzZWxmLmJ1aWxkX2Rpciwgc2VsZi5pbnN0YWxsX2RpcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2FybigiJyVzJyBkb2VzIG5vdCBleGlzdCAtLSBubyBQeXRob24gbW9kdWxlcyB0byBpbnN0YWxsIiAlCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWlsZF9kaXIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmV0dXJuIG91dGZpbGVzCisKKyAgICBkZWYgYnl0ZV9jb21waWxlKHNlbGYsIGZpbGVzKToKKyAgICAgICAgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgICAgICBzZWxmLndhcm4oJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkLCBza2lwcGluZy4nKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgYnl0ZV9jb21waWxlCisKKyAgICAgICAgIyBHZXQgdGhlICItLXJvb3QiIGRpcmVjdG9yeSBzdXBwbGllZCB0byB0aGUgImluc3RhbGwiIGNvbW1hbmQsCisgICAgICAgICMgYW5kIHVzZSBpdCBhcyBhIHByZWZpeCB0byBzdHJpcCBvZmYgdGhlIHB1cnBvcnRlZCBmaWxlbmFtZQorICAgICAgICAjIGVuY29kZWQgaW4gYnl0ZWNvZGUgZmlsZXMuICBUaGlzIGlzIGZhciBmcm9tIGNvbXBsZXRlLCBidXQgaXQKKyAgICAgICAgIyBzaG91bGQgYXQgbGVhc3QgZ2VuZXJhdGUgdXNhYmxlIGJ5dGVjb2RlIGluIFJQTSBkaXN0cmlidXRpb25zLgorICAgICAgICBpbnN0YWxsX3Jvb3QgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpLnJvb3QKKworICAgICAgICBpZiBzZWxmLmNvbXBpbGU6CisgICAgICAgICAgICBieXRlX2NvbXBpbGUoZmlsZXMsIG9wdGltaXplPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9c2VsZi5mb3JjZSwgcHJlZml4PWluc3RhbGxfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgaWYgc2VsZi5vcHRpbWl6ZSA+IDA6CisgICAgICAgICAgICBieXRlX2NvbXBpbGUoZmlsZXMsIG9wdGltaXplPXNlbGYub3B0aW1pemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2U9c2VsZi5mb3JjZSwgcHJlZml4PWluc3RhbGxfcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPXNlbGYudmVyYm9zZSwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKworICAgICMgLS0gVXRpbGl0eSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX211dGF0ZV9vdXRwdXRzKHNlbGYsIGhhc19hbnksIGJ1aWxkX2NtZCwgY21kX29wdGlvbiwgb3V0cHV0X2Rpcik6CisgICAgICAgIGlmIG5vdCBoYXNfYW55OgorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoYnVpbGRfY21kKQorICAgICAgICBidWlsZF9maWxlcyA9IGJ1aWxkX2NtZC5nZXRfb3V0cHV0cygpCisgICAgICAgIGJ1aWxkX2RpciA9IGdldGF0dHIoYnVpbGRfY21kLCBjbWRfb3B0aW9uKQorCisgICAgICAgIHByZWZpeF9sZW4gPSBsZW4oYnVpbGRfZGlyKSArIGxlbihvcy5zZXApCisgICAgICAgIG91dHB1dHMgPSBbXQorICAgICAgICBmb3IgZmlsZSBpbiBidWlsZF9maWxlczoKKyAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCBmaWxlW3ByZWZpeF9sZW46XSkpCisKKyAgICAgICAgcmV0dXJuIG91dHB1dHMKKworICAgIGRlZiBfYnl0ZWNvZGVfZmlsZW5hbWVzKHNlbGYsIHB5X2ZpbGVuYW1lcyk6CisgICAgICAgIGJ5dGVjb2RlX2ZpbGVzID0gW10KKyAgICAgICAgZm9yIHB5X2ZpbGUgaW4gcHlfZmlsZW5hbWVzOgorICAgICAgICAgICAgIyBTaW5jZSBidWlsZF9weSBoYW5kbGVzIHBhY2thZ2UgZGF0YSBpbnN0YWxsYXRpb24sIHRoZQorICAgICAgICAgICAgIyBsaXN0IG9mIG91dHB1dHMgY2FuIGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgLnB5IGZpbGVzLgorICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2Ugb25seSByZXBvcnQgYnl0ZWNvZGUgZm9yIHRoZSAucHkgZmlsZXMuCisgICAgICAgICAgICBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGgubm9ybWNhc2UocHlfZmlsZSkpWzFdCisgICAgICAgICAgICBpZiBleHQgIT0gUFlUSE9OX1NPVVJDRV9FWFRFTlNJT046CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHNlbGYuY29tcGlsZToKKyAgICAgICAgICAgICAgICBieXRlY29kZV9maWxlcy5hcHBlbmQocHlfZmlsZSArICJjIikKKyAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemUgPiAwOgorICAgICAgICAgICAgICAgIGJ5dGVjb2RlX2ZpbGVzLmFwcGVuZChweV9maWxlICsgIm8iKQorCisgICAgICAgIHJldHVybiBieXRlY29kZV9maWxlcworCisKKyAgICAjIC0tIEV4dGVybmFsIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKGNhbGxlZCBieSBvdXRzaWRlcnMpCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBmaWxlcyB0aGF0IHdvdWxkIGJlIGluc3RhbGxlZCBpZiB0aGlzIGNvbW1hbmQKKyAgICAgICAgd2VyZSBhY3R1YWxseSBydW4uICBOb3QgYWZmZWN0ZWQgYnkgdGhlICJkcnktcnVuIiBmbGFnIG9yIHdoZXRoZXIKKyAgICAgICAgbW9kdWxlcyBoYXZlIGFjdHVhbGx5IGJlZW4gYnVpbHQgeWV0LgorICAgICAgICAiIiIKKyAgICAgICAgcHVyZV9vdXRwdXRzID0gXAorICAgICAgICAgICAgc2VsZi5fbXV0YXRlX291dHB1dHMoc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkX3B5JywgJ2J1aWxkX2xpYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICBpZiBzZWxmLmNvbXBpbGU6CisgICAgICAgICAgICBieXRlY29kZV9vdXRwdXRzID0gc2VsZi5fYnl0ZWNvZGVfZmlsZW5hbWVzKHB1cmVfb3V0cHV0cykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ5dGVjb2RlX291dHB1dHMgPSBbXQorCisgICAgICAgIGV4dF9vdXRwdXRzID0gXAorICAgICAgICAgICAgc2VsZi5fbXV0YXRlX291dHB1dHMoc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVpbGRfZXh0JywgJ2J1aWxkX2xpYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RhbGxfZGlyKQorCisgICAgICAgIHJldHVybiBwdXJlX291dHB1dHMgKyBieXRlY29kZV9vdXRwdXRzICsgZXh0X291dHB1dHMKKworICAgIGRlZiBnZXRfaW5wdXRzKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIGxpc3Qgb2YgZmlsZXMgdGhhdCBhcmUgaW5wdXQgdG8gdGhpcyBjb21tYW5kLCBpZS4gdGhlCisgICAgICAgIGZpbGVzIHRoYXQgZ2V0IGluc3RhbGxlZCBhcyB0aGV5IGFyZSBuYW1lZCBpbiB0aGUgYnVpbGQgdHJlZS4KKyAgICAgICAgVGhlIGZpbGVzIGluIHRoaXMgbGlzdCBjb3JyZXNwb25kIG9uZS10by1vbmUgdG8gdGhlIG91dHB1dAorICAgICAgICBmaWxlbmFtZXMgcmV0dXJuZWQgYnkgJ2dldF9vdXRwdXRzKCknLgorICAgICAgICAiIiIKKyAgICAgICAgaW5wdXRzID0gW10KKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfcHVyZV9tb2R1bGVzKCk6CisgICAgICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCisgICAgICAgICAgICBpbnB1dHMuZXh0ZW5kKGJ1aWxkX3B5LmdldF9vdXRwdXRzKCkpCisKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CisgICAgICAgICAgICBidWlsZF9leHQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfZXh0JykKKyAgICAgICAgICAgIGlucHV0cy5leHRlbmQoYnVpbGRfZXh0LmdldF9vdXRwdXRzKCkpCisKKyAgICAgICAgcmV0dXJuIGlucHV0cwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjk0MmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjk0MmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWNkOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX3NjcmlwdHMucHkKQEAgLTAsMCArMSw2NCBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnaW5zdGFsbF9zY3JpcHRzJyBjb21tYW5kLCBmb3IgaW5zdGFsbGluZworUHl0aG9uIHNjcmlwdHMuIiIiCisKKyMgY29udHJpYnV0ZWQgYnkgQmFzdGlhbiBLbGVpbmVpZGFtCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gc3RhdCBpbXBvcnQgU1RfTU9ERQorCitjbGFzcyBpbnN0YWxsX3NjcmlwdHMgKENvbW1hbmQpOgorCisgICAgZGVzY3JpcHRpb24gPSAiaW5zdGFsbCBzY3JpcHRzIChQeXRob24gb3Igb3RoZXJ3aXNlKSIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdpbnN0YWxsLWRpcj0nLCAnZCcsICJkaXJlY3RvcnkgdG8gaW5zdGFsbCBzY3JpcHRzIHRvIiksCisgICAgICAgICgnYnVpbGQtZGlyPScsJ2InLCAiYnVpbGQgZGlyZWN0b3J5ICh3aGVyZSB0byBpbnN0YWxsIGZyb20pIiksCisgICAgICAgICgnZm9yY2UnLCAnZicsICJmb3JjZSBpbnN0YWxsYXRpb24gKG92ZXJ3cml0ZSBleGlzdGluZyBmaWxlcykiKSwKKyAgICAgICAgKCdza2lwLWJ1aWxkJywgTm9uZSwgInNraXAgdGhlIGJ1aWxkIHN0ZXBzIiksCisgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydmb3JjZScsICdza2lwLWJ1aWxkJ10KKworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYuZm9yY2UgPSAwCisgICAgICAgIHNlbGYuYnVpbGRfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnNraXBfYnVpbGQgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdidWlsZCcsICgnYnVpbGRfc2NyaXB0cycsICdidWlsZF9kaXInKSkKKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2luc3RhbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfc2NyaXB0cycsICdpbnN0YWxsX2RpcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ZvcmNlJywgJ2ZvcmNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnc2tpcF9idWlsZCcsICdza2lwX2J1aWxkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHJ1biAoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnNraXBfYnVpbGQ6CisgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKKyAgICAgICAgc2VsZi5vdXRmaWxlcyA9IHNlbGYuY29weV90cmVlKHNlbGYuYnVpbGRfZGlyLCBzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICAjIFNldCB0aGUgZXhlY3V0YWJsZSBiaXRzIChvd25lciwgZ3JvdXAsIGFuZCB3b3JsZCkgb24KKyAgICAgICAgICAgICMgYWxsIHRoZSBzY3JpcHRzIHdlIGp1c3QgaW5zdGFsbGVkLgorICAgICAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5nZXRfb3V0cHV0cygpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oImNoYW5naW5nIG1vZGUgb2YgJXMiLCBmaWxlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSAoKG9zLnN0YXQoZmlsZSlbU1RfTU9ERV0pIHwgMDU1NSkgJiAwNzc3NworICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiY2hhbmdpbmcgbW9kZSBvZiAlcyB0byAlbyIsIGZpbGUsIG1vZGUpCisgICAgICAgICAgICAgICAgICAgIG9zLmNobW9kKGZpbGUsIG1vZGUpCisKKyAgICBkZWYgZ2V0X2lucHV0cyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzIG9yIFtdCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm91dGZpbGVzIG9yIFtdCisKKyMgY2xhc3MgaW5zdGFsbF9zY3JpcHRzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzYjhmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzYjhmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3JlZ2lzdGVyLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGI0MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weQpAQCAtMCwwICsxLDMxNSBAQAorIiIiZGlzdHV0aWxzLmNvbW1hbmQucmVnaXN0ZXIKKworSW1wbGVtZW50cyB0aGUgRGlzdHV0aWxzICdyZWdpc3RlcicgY29tbWFuZCAocmVnaXN0ZXIgd2l0aCB0aGUgcmVwb3NpdG9yeSkuCisiIiIKKworIyBjcmVhdGVkIDIwMDIvMTAvMjEsIFJpY2hhcmQgSm9uZXMKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IHVybHBhcnNlCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IFB5UElSQ0NvbW1hbmQKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgcmVnaXN0ZXIoUHlQSVJDQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICgicmVnaXN0ZXIgdGhlIGRpc3RyaWJ1dGlvbiB3aXRoIHRoZSBQeXRob24gcGFja2FnZSBpbmRleCIpCisgICAgdXNlcl9vcHRpb25zID0gUHlQSVJDQ29tbWFuZC51c2VyX29wdGlvbnMgKyBbCisgICAgICAgICgnbGlzdC1jbGFzc2lmaWVycycsIE5vbmUsCisgICAgICAgICAnbGlzdCB0aGUgdmFsaWQgVHJvdmUgY2xhc3NpZmllcnMnKSwKKyAgICAgICAgKCdzdHJpY3QnLCBOb25lICwKKyAgICAgICAgICdXaWxsIHN0b3AgdGhlIHJlZ2lzdGVyaW5nIGlmIHRoZSBtZXRhLWRhdGEgYXJlIG5vdCBmdWxseSBjb21wbGlhbnQnKQorICAgICAgICBdCisgICAgYm9vbGVhbl9vcHRpb25zID0gUHlQSVJDQ29tbWFuZC5ib29sZWFuX29wdGlvbnMgKyBbCisgICAgICAgICd2ZXJpZnknLCAnbGlzdC1jbGFzc2lmaWVycycsICdzdHJpY3QnXQorCisgICAgc3ViX2NvbW1hbmRzID0gWygnY2hlY2snLCBsYW1iZGEgc2VsZjogVHJ1ZSldCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBQeVBJUkNDb21tYW5kLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLmxpc3RfY2xhc3NpZmllcnMgPSAwCisgICAgICAgIHNlbGYuc3RyaWN0ID0gMAorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIFB5UElSQ0NvbW1hbmQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICAjIHNldHRpbmcgb3B0aW9ucyBmb3IgdGhlIGBjaGVja2Agc3ViY29tbWFuZAorICAgICAgICBjaGVja19vcHRpb25zID0geydzdHJpY3QnOiAoJ3JlZ2lzdGVyJywgc2VsZi5zdHJpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN0cnVjdHVyZWR0ZXh0JzogKCdyZWdpc3RlcicsIDEpfQorICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5jb21tYW5kX29wdGlvbnNbJ2NoZWNrJ10gPSBjaGVja19vcHRpb25zCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLl9zZXRfY29uZmlnKCkKKworICAgICAgICAjIFJ1biBzdWIgY29tbWFuZHMKKyAgICAgICAgZm9yIGNtZF9uYW1lIGluIHNlbGYuZ2V0X3N1Yl9jb21tYW5kcygpOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWRfbmFtZSkKKworICAgICAgICBpZiBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBzZWxmLnZlcmlmeV9tZXRhZGF0YSgpCisgICAgICAgIGVsaWYgc2VsZi5saXN0X2NsYXNzaWZpZXJzOgorICAgICAgICAgICAgc2VsZi5jbGFzc2lmaWVycygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbmRfbWV0YWRhdGEoKQorCisgICAgZGVmIGNoZWNrX21ldGFkYXRhKHNlbGYpOgorICAgICAgICAiIiJEZXByZWNhdGVkIEFQSS4iIiIKKyAgICAgICAgd2FybigiZGlzdHV0aWxzLmNvbW1hbmQucmVnaXN0ZXIuY2hlY2tfbWV0YWRhdGEgaXMgZGVwcmVjYXRlZCwgXAorICAgICAgICAgICAgICB1c2UgdGhlIGNoZWNrIGNvbW1hbmQgaW5zdGVhZCIsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIGNoZWNrID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCdjaGVjaycpCisgICAgICAgIGNoZWNrLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjaGVjay5zdHJpY3QgPSBzZWxmLnN0cmljdAorICAgICAgICBjaGVjay5yZXN0cnVjdHVyZWR0ZXh0ID0gMQorICAgICAgICBjaGVjay5ydW4oKQorCisgICAgZGVmIF9zZXRfY29uZmlnKHNlbGYpOgorICAgICAgICAnJycgUmVhZHMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgc2V0IGF0dHJpYnV0ZXMuCisgICAgICAgICcnJworICAgICAgICBjb25maWcgPSBzZWxmLl9yZWFkX3B5cGlyYygpCisgICAgICAgIGlmIGNvbmZpZyAhPSB7fToKKyAgICAgICAgICAgIHNlbGYudXNlcm5hbWUgPSBjb25maWdbJ3VzZXJuYW1lJ10KKyAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPSBjb25maWdbJ3Bhc3N3b3JkJ10KKyAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9IGNvbmZpZ1sncmVwb3NpdG9yeSddCisgICAgICAgICAgICBzZWxmLnJlYWxtID0gY29uZmlnWydyZWFsbSddCisgICAgICAgICAgICBzZWxmLmhhc19jb25maWcgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLnJlcG9zaXRvcnkgbm90IGluICgncHlwaScsIHNlbGYuREVGQVVMVF9SRVBPU0lUT1JZKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclcyBub3QgZm91bmQgaW4gLnB5cGlyYycgJSBzZWxmLnJlcG9zaXRvcnkpCisgICAgICAgICAgICBpZiBzZWxmLnJlcG9zaXRvcnkgPT0gJ3B5cGknOgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9IHNlbGYuREVGQVVMVF9SRVBPU0lUT1JZCisgICAgICAgICAgICBzZWxmLmhhc19jb25maWcgPSBGYWxzZQorCisgICAgZGVmIGNsYXNzaWZpZXJzKHNlbGYpOgorICAgICAgICAnJycgRmV0Y2ggdGhlIGxpc3Qgb2YgY2xhc3NpZmllcnMgZnJvbSB0aGUgc2VydmVyLgorICAgICAgICAnJycKKyAgICAgICAgcmVzcG9uc2UgPSB1cmxsaWIyLnVybG9wZW4oc2VsZi5yZXBvc2l0b3J5Kyc/OmFjdGlvbj1saXN0X2NsYXNzaWZpZXJzJykKKyAgICAgICAgbG9nLmluZm8ocmVzcG9uc2UucmVhZCgpKQorCisgICAgZGVmIHZlcmlmeV9tZXRhZGF0YShzZWxmKToKKyAgICAgICAgJycnIFNlbmQgdGhlIG1ldGFkYXRhIHRvIHRoZSBwYWNrYWdlIGluZGV4IHNlcnZlciB0byBiZSBjaGVja2VkLgorICAgICAgICAnJycKKyAgICAgICAgIyBzZW5kIHRoZSBpbmZvIHRvIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydCB0aGUgcmVzdWx0CisgICAgICAgIChjb2RlLCByZXN1bHQpID0gc2VsZi5wb3N0X3RvX3NlcnZlcihzZWxmLmJ1aWxkX3Bvc3RfZGF0YSgndmVyaWZ5JykpCisgICAgICAgIGxvZy5pbmZvKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKGNvZGUsIHJlc3VsdCkpCisKKworICAgIGRlZiBzZW5kX21ldGFkYXRhKHNlbGYpOgorICAgICAgICAnJycgU2VuZCB0aGUgbWV0YWRhdGEgdG8gdGhlIHBhY2thZ2UgaW5kZXggc2VydmVyLgorCisgICAgICAgICAgICBXZWxsLCBkbyB0aGUgZm9sbG93aW5nOgorICAgICAgICAgICAgMS4gZmlndXJlIHdobyB0aGUgdXNlciBpcywgYW5kIHRoZW4KKyAgICAgICAgICAgIDIuIHNlbmQgdGhlIGRhdGEgYXMgYSBCYXNpYyBhdXRoJ2VkIFBPU1QuCisKKyAgICAgICAgICAgIEZpcnN0IHdlIHRyeSB0byByZWFkIHRoZSB1c2VybmFtZS9wYXNzd29yZCBmcm9tICRIT01FLy5weXBpcmMsCisgICAgICAgICAgICB3aGljaCBpcyBhIENvbmZpZ1BhcnNlci1mb3JtYXR0ZWQgZmlsZSB3aXRoIGEgc2VjdGlvbgorICAgICAgICAgICAgW2Rpc3R1dGlsc10gY29udGFpbmluZyB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZW50cmllcyAoYm90aAorICAgICAgICAgICAgaW4gY2xlYXIgdGV4dCkuIEVnOgorCisgICAgICAgICAgICAgICAgW2Rpc3R1dGlsc10KKyAgICAgICAgICAgICAgICBpbmRleC1zZXJ2ZXJzID0KKyAgICAgICAgICAgICAgICAgICAgcHlwaQorCisgICAgICAgICAgICAgICAgW3B5cGldCisgICAgICAgICAgICAgICAgdXNlcm5hbWU6IGZyZWQKKyAgICAgICAgICAgICAgICBwYXNzd29yZDogc2Vrcml0CisKKyAgICAgICAgICAgIE90aGVyd2lzZSwgdG8gZmlndXJlIHdobyB0aGUgdXNlciBpcywgd2Ugb2ZmZXIgdGhlIHVzZXIgdGhyZWUKKyAgICAgICAgICAgIGNob2ljZXM6CisKKyAgICAgICAgICAgICAxLiB1c2UgZXhpc3RpbmcgbG9naW4sCisgICAgICAgICAgICAgMi4gcmVnaXN0ZXIgYXMgYSBuZXcgdXNlciwgb3IKKyAgICAgICAgICAgICAzLiBzZXQgdGhlIHBhc3N3b3JkIHRvIGEgcmFuZG9tIHN0cmluZyBhbmQgZW1haWwgdGhlIHVzZXIuCisKKyAgICAgICAgJycnCisgICAgICAgICMgc2VlIGlmIHdlIGNhbiBzaG9ydC1jdXQgYW5kIGdldCB0aGUgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSB0aGUKKyAgICAgICAgIyBjb25maWcKKyAgICAgICAgaWYgc2VsZi5oYXNfY29uZmlnOgorICAgICAgICAgICAgY2hvaWNlID0gJzEnCisgICAgICAgICAgICB1c2VybmFtZSA9IHNlbGYudXNlcm5hbWUKKyAgICAgICAgICAgIHBhc3N3b3JkID0gc2VsZi5wYXNzd29yZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hvaWNlID0gJ3gnCisgICAgICAgICAgICB1c2VybmFtZSA9IHBhc3N3b3JkID0gJycKKworICAgICAgICAjIGdldCB0aGUgdXNlcidzIGxvZ2luIGluZm8KKyAgICAgICAgY2hvaWNlcyA9ICcxIDIgMyA0Jy5zcGxpdCgpCisgICAgICAgIHdoaWxlIGNob2ljZSBub3QgaW4gY2hvaWNlczoKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJycnXAorV2UgbmVlZCB0byBrbm93IHdobyB5b3UgYXJlLCBzbyBwbGVhc2UgY2hvb3NlIGVpdGhlcjoKKyAxLiB1c2UgeW91ciBleGlzdGluZyBsb2dpbiwKKyAyLiByZWdpc3RlciBhcyBhIG5ldyB1c2VyLAorIDMuIGhhdmUgdGhlIHNlcnZlciBnZW5lcmF0ZSBhIG5ldyBwYXNzd29yZCBmb3IgeW91IChhbmQgZW1haWwgaXQgdG8geW91KSwgb3IKKyA0LiBxdWl0CitZb3VyIHNlbGVjdGlvbiBbZGVmYXVsdCAxXTogJycnLCBsb2cuSU5GTykKKworICAgICAgICAgICAgY2hvaWNlID0gcmF3X2lucHV0KCkKKyAgICAgICAgICAgIGlmIG5vdCBjaG9pY2U6CisgICAgICAgICAgICAgICAgY2hvaWNlID0gJzEnCisgICAgICAgICAgICBlbGlmIGNob2ljZSBub3QgaW4gY2hvaWNlczoKKyAgICAgICAgICAgICAgICBwcmludCAnUGxlYXNlIGNob29zZSBvbmUgb2YgdGhlIGZvdXIgb3B0aW9ucyEnCisKKyAgICAgICAgaWYgY2hvaWNlID09ICcxJzoKKyAgICAgICAgICAgICMgZ2V0IHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKyAgICAgICAgICAgIHdoaWxlIG5vdCB1c2VybmFtZToKKyAgICAgICAgICAgICAgICB1c2VybmFtZSA9IHJhd19pbnB1dCgnVXNlcm5hbWU6ICcpCisgICAgICAgICAgICB3aGlsZSBub3QgcGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRwYXNzLmdldHBhc3MoJ1Bhc3N3b3JkOiAnKQorCisgICAgICAgICAgICAjIHNldCB1cCB0aGUgYXV0aGVudGljYXRpb24KKyAgICAgICAgICAgIGF1dGggPSB1cmxsaWIyLkhUVFBQYXNzd29yZE1ncigpCisgICAgICAgICAgICBob3N0ID0gdXJscGFyc2UudXJscGFyc2Uoc2VsZi5yZXBvc2l0b3J5KVsxXQorICAgICAgICAgICAgYXV0aC5hZGRfcGFzc3dvcmQoc2VsZi5yZWFsbSwgaG9zdCwgdXNlcm5hbWUsIHBhc3N3b3JkKQorICAgICAgICAgICAgIyBzZW5kIHRoZSBpbmZvIHRvIHRoZSBzZXJ2ZXIgYW5kIHJlcG9ydCB0aGUgcmVzdWx0CisgICAgICAgICAgICBjb2RlLCByZXN1bHQgPSBzZWxmLnBvc3RfdG9fc2VydmVyKHNlbGYuYnVpbGRfcG9zdF9kYXRhKCdzdWJtaXQnKSwKKyAgICAgICAgICAgICAgICBhdXRoKQorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuSU5GTykKKworICAgICAgICAgICAgIyBwb3NzaWJseSBzYXZlIHRoZSBsb2dpbgorICAgICAgICAgICAgaWYgY29kZSA9PSAyMDA6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5oYXNfY29uZmlnOgorICAgICAgICAgICAgICAgICAgICAjIHNoYXJpbmcgdGhlIHBhc3N3b3JkIGluIHRoZSBkaXN0cmlidXRpb24gaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgIyBzbyB0aGUgdXBsb2FkIGNvbW1hbmQgY2FuIHJldXNlIGl0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLnBhc3N3b3JkID0gcGFzc3dvcmQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCgnSSBjYW4gc3RvcmUgeW91ciBQeVBJIGxvZ2luIHNvIGZ1dHVyZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJtaXNzaW9ucyB3aWxsIGJlIGZhc3Rlci4nKSwgbG9nLklORk8pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJyh0aGUgbG9naW4gd2lsbCBiZSBzdG9yZWQgaW4gJXMpJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9nZXRfcmNfZmlsZSgpLCBsb2cuSU5GTykKKyAgICAgICAgICAgICAgICAgICAgY2hvaWNlID0gJ1gnCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGNob2ljZS5sb3dlcigpIG5vdCBpbiAneW4nOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlID0gcmF3X2lucHV0KCdTYXZlIHlvdXIgbG9naW4gKHkvTik/JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjaG9pY2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlID0gJ24nCisgICAgICAgICAgICAgICAgICAgIGlmIGNob2ljZS5sb3dlcigpID09ICd5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3N0b3JlX3B5cGlyYyh1c2VybmFtZSwgcGFzc3dvcmQpCisKKyAgICAgICAgZWxpZiBjaG9pY2UgPT0gJzInOgorICAgICAgICAgICAgZGF0YSA9IHsnOmFjdGlvbic6ICd1c2VyJ30KKyAgICAgICAgICAgIGRhdGFbJ25hbWUnXSA9IGRhdGFbJ3Bhc3N3b3JkJ10gPSBkYXRhWydlbWFpbCddID0gJycKKyAgICAgICAgICAgIGRhdGFbJ2NvbmZpcm0nXSA9IE5vbmUKKyAgICAgICAgICAgIHdoaWxlIG5vdCBkYXRhWyduYW1lJ106CisgICAgICAgICAgICAgICAgZGF0YVsnbmFtZSddID0gcmF3X2lucHV0KCdVc2VybmFtZTogJykKKyAgICAgICAgICAgIHdoaWxlIGRhdGFbJ3Bhc3N3b3JkJ10gIT0gZGF0YVsnY29uZmlybSddOgorICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBkYXRhWydwYXNzd29yZCddOgorICAgICAgICAgICAgICAgICAgICBkYXRhWydwYXNzd29yZCddID0gZ2V0cGFzcy5nZXRwYXNzKCdQYXNzd29yZDogJykKKyAgICAgICAgICAgICAgICB3aGlsZSBub3QgZGF0YVsnY29uZmlybSddOgorICAgICAgICAgICAgICAgICAgICBkYXRhWydjb25maXJtJ10gPSBnZXRwYXNzLmdldHBhc3MoJyBDb25maXJtOiAnKQorICAgICAgICAgICAgICAgIGlmIGRhdGFbJ3Bhc3N3b3JkJ10gIT0gZGF0YVsnY29uZmlybSddOgorICAgICAgICAgICAgICAgICAgICBkYXRhWydwYXNzd29yZCddID0gJycKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsnY29uZmlybSddID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBwcmludCAiUGFzc3dvcmQgYW5kIGNvbmZpcm0gZG9uJ3QgbWF0Y2ghIgorICAgICAgICAgICAgd2hpbGUgbm90IGRhdGFbJ2VtYWlsJ106CisgICAgICAgICAgICAgICAgZGF0YVsnZW1haWwnXSA9IHJhd19pbnB1dCgnICAgRU1haWw6ICcpCisgICAgICAgICAgICBjb2RlLCByZXN1bHQgPSBzZWxmLnBvc3RfdG9fc2VydmVyKGRhdGEpCisgICAgICAgICAgICBpZiBjb2RlICE9IDIwMDoKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygnWW91IHdpbGwgcmVjZWl2ZSBhbiBlbWFpbCBzaG9ydGx5LicpCisgICAgICAgICAgICAgICAgbG9nLmluZm8oKCdGb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiBpdCB0byAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wbGV0ZSByZWdpc3RyYXRpb24uJykpCisgICAgICAgIGVsaWYgY2hvaWNlID09ICczJzoKKyAgICAgICAgICAgIGRhdGEgPSB7JzphY3Rpb24nOiAncGFzc3dvcmRfcmVzZXQnfQorICAgICAgICAgICAgZGF0YVsnZW1haWwnXSA9ICcnCisgICAgICAgICAgICB3aGlsZSBub3QgZGF0YVsnZW1haWwnXToKKyAgICAgICAgICAgICAgICBkYXRhWydlbWFpbCddID0gcmF3X2lucHV0KCdZb3VyIGVtYWlsIGFkZHJlc3M6ICcpCisgICAgICAgICAgICBjb2RlLCByZXN1bHQgPSBzZWxmLnBvc3RfdG9fc2VydmVyKGRhdGEpCisgICAgICAgICAgICBsb2cuaW5mbygnU2VydmVyIHJlc3BvbnNlICglcyk6ICVzJyAlIChjb2RlLCByZXN1bHQpKQorCisgICAgZGVmIGJ1aWxkX3Bvc3RfZGF0YShzZWxmLCBhY3Rpb24pOgorICAgICAgICAjIGZpZ3VyZSB0aGUgZGF0YSB0byBzZW5kIC0gdGhlIG1ldGFkYXRhIHBsdXMgc29tZSBhZGRpdGlvbmFsCisgICAgICAgICMgaW5mb3JtYXRpb24gdXNlZCBieSB0aGUgcGFja2FnZSBzZXJ2ZXIKKyAgICAgICAgbWV0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLm1ldGFkYXRhCisgICAgICAgIGRhdGEgPSB7CisgICAgICAgICAgICAnOmFjdGlvbic6IGFjdGlvbiwKKyAgICAgICAgICAgICdtZXRhZGF0YV92ZXJzaW9uJyA6ICcxLjAnLAorICAgICAgICAgICAgJ25hbWUnOiBtZXRhLmdldF9uYW1lKCksCisgICAgICAgICAgICAndmVyc2lvbic6IG1ldGEuZ2V0X3ZlcnNpb24oKSwKKyAgICAgICAgICAgICdzdW1tYXJ5JzogbWV0YS5nZXRfZGVzY3JpcHRpb24oKSwKKyAgICAgICAgICAgICdob21lX3BhZ2UnOiBtZXRhLmdldF91cmwoKSwKKyAgICAgICAgICAgICdhdXRob3InOiBtZXRhLmdldF9jb250YWN0KCksCisgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogbWV0YS5nZXRfY29udGFjdF9lbWFpbCgpLAorICAgICAgICAgICAgJ2xpY2Vuc2UnOiBtZXRhLmdldF9saWNlbmNlKCksCisgICAgICAgICAgICAnZGVzY3JpcHRpb24nOiBtZXRhLmdldF9sb25nX2Rlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAna2V5d29yZHMnOiBtZXRhLmdldF9rZXl3b3JkcygpLAorICAgICAgICAgICAgJ3BsYXRmb3JtJzogbWV0YS5nZXRfcGxhdGZvcm1zKCksCisgICAgICAgICAgICAnY2xhc3NpZmllcnMnOiBtZXRhLmdldF9jbGFzc2lmaWVycygpLAorICAgICAgICAgICAgJ2Rvd25sb2FkX3VybCc6IG1ldGEuZ2V0X2Rvd25sb2FkX3VybCgpLAorICAgICAgICAgICAgIyBQRVAgMzE0CisgICAgICAgICAgICAncHJvdmlkZXMnOiBtZXRhLmdldF9wcm92aWRlcygpLAorICAgICAgICAgICAgJ3JlcXVpcmVzJzogbWV0YS5nZXRfcmVxdWlyZXMoKSwKKyAgICAgICAgICAgICdvYnNvbGV0ZXMnOiBtZXRhLmdldF9vYnNvbGV0ZXMoKSwKKyAgICAgICAgfQorICAgICAgICBpZiBkYXRhWydwcm92aWRlcyddIG9yIGRhdGFbJ3JlcXVpcmVzJ10gb3IgZGF0YVsnb2Jzb2xldGVzJ106CisgICAgICAgICAgICBkYXRhWydtZXRhZGF0YV92ZXJzaW9uJ10gPSAnMS4xJworICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHBvc3RfdG9fc2VydmVyKHNlbGYsIGRhdGEsIGF1dGg9Tm9uZSk6CisgICAgICAgICcnJyBQb3N0IGEgcXVlcnkgdG8gdGhlIHNlcnZlciwgYW5kIHJldHVybiBhIHN0cmluZyByZXNwb25zZS4KKyAgICAgICAgJycnCisgICAgICAgIGlmICduYW1lJyBpbiBkYXRhOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnUmVnaXN0ZXJpbmcgJXMgdG8gJXMnICUgKGRhdGFbJ25hbWUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3NpdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuSU5GTykKKyAgICAgICAgIyBCdWlsZCB1cCB0aGUgTUlNRSBwYXlsb2FkIGZvciB0aGUgdXJsbGliMiBQT1NUIGRhdGEKKyAgICAgICAgYm91bmRhcnkgPSAnLS0tLS0tLS0tLS0tLS1HSFNLRkpETEdEUzc1NDNGSktMRkhSRTc1NjQyNzU2NzQzMjU0JworICAgICAgICBzZXBfYm91bmRhcnkgPSAnXG4tLScgKyBib3VuZGFyeQorICAgICAgICBlbmRfYm91bmRhcnkgPSBzZXBfYm91bmRhcnkgKyAnLS0nCisgICAgICAgIGNodW5rcyA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgICMgaGFuZGxlIG11bHRpcGxlIGVudHJpZXMgZm9yIHRoZSBzYW1lIG5hbWUKKyAgICAgICAgICAgIGlmIHR5cGUodmFsdWUpIG5vdCBpbiAodHlwZShbXSksIHR5cGUoICgpICkpOgorICAgICAgICAgICAgICAgIHZhbHVlID0gW3ZhbHVlXQorICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlOgorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoc2VwX2JvdW5kYXJ5KQorICAgICAgICAgICAgICAgIGNodW5rcy5hcHBlbmQoJ1xuQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSIlcyInJWtleSkKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKCJcblxuIikKKyAgICAgICAgICAgICAgICBjaHVua3MuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVstMV0gPT0gJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzLmFwcGVuZCgnXG4nKSAgIyB3cml0ZSBhbiBleHRyYSBuZXdsaW5lIChsdXJ2ZSBNYWNzKQorICAgICAgICBjaHVua3MuYXBwZW5kKGVuZF9ib3VuZGFyeSkKKyAgICAgICAgY2h1bmtzLmFwcGVuZCgiXG4iKQorCisgICAgICAgICMgY2h1bmtzIG1heSBiZSBieXRlcyAoc3RyKSBvciB1bmljb2RlIG9iamVjdHMgdGhhdCB3ZSBuZWVkIHRvIGVuY29kZQorICAgICAgICBib2R5ID0gW10KKyAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2h1bmssIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGJvZHkuYXBwZW5kKGNodW5rLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYm9keS5hcHBlbmQoY2h1bmspCisKKyAgICAgICAgYm9keSA9ICcnLmpvaW4oYm9keSkKKworICAgICAgICAjIGJ1aWxkIHRoZSBSZXF1ZXN0CisgICAgICAgIGhlYWRlcnMgPSB7CisgICAgICAgICAgICAnQ29udGVudC10eXBlJzogJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzOyBjaGFyc2V0PXV0Zi04JyVib3VuZGFyeSwKKyAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCc6IHN0cihsZW4oYm9keSkpCisgICAgICAgIH0KKyAgICAgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KHNlbGYucmVwb3NpdG9yeSwgYm9keSwgaGVhZGVycykKKworICAgICAgICAjIGhhbmRsZSBIVFRQIGFuZCBpbmNsdWRlIHRoZSBCYXNpYyBBdXRoIGhhbmRsZXIKKyAgICAgICAgb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIoCisgICAgICAgICAgICB1cmxsaWIyLkhUVFBCYXNpY0F1dGhIYW5kbGVyKHBhc3N3b3JkX21ncj1hdXRoKQorICAgICAgICApCisgICAgICAgIGRhdGEgPSAnJworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBvcGVuZXIub3BlbihyZXEpCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvciwgZToKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvd19yZXNwb25zZToKKyAgICAgICAgICAgICAgICBkYXRhID0gZS5mcC5yZWFkKCkKKyAgICAgICAgICAgIHJlc3VsdCA9IGUuY29kZSwgZS5tc2cKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuVVJMRXJyb3IsIGU6CisgICAgICAgICAgICByZXN1bHQgPSA1MDAsIHN0cihlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSByZXN1bHQucmVhZCgpCisgICAgICAgICAgICByZXN1bHQgPSAyMDAsICdPSycKKyAgICAgICAgaWYgc2VsZi5zaG93X3Jlc3BvbnNlOgorICAgICAgICAgICAgZGFzaGVzID0gJy0nICogNzUKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJyVzJXMlcycgJSAoZGFzaGVzLCBkYXRhLCBkYXNoZXMpKQorCisgICAgICAgIHJldHVybiByZXN1bHQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiODAzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9yZWdpc3Rlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiODAzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvcmVnaXN0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvbW1hbmQvc2Rpc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGRlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5CkBAIC0wLDAgKzEsNDc3IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5zZGlzdAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ3NkaXN0JyBjb21tYW5kIChjcmVhdGUgYSBzb3VyY2UgZGlzdHJpYnV0aW9uKS4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworaW1wb3J0IHN5cworZnJvbSBnbG9iIGltcG9ydCBnbG9iCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBkaXJfdXRpbCwgZGVwX3V0aWwsIGZpbGVfdXRpbCwgYXJjaGl2ZV91dGlsCitmcm9tIGRpc3R1dGlscy50ZXh0X2ZpbGUgaW1wb3J0IFRleHRGaWxlCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IChEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBEaXN0dXRpbHNPcHRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3R1dGlsc1RlbXBsYXRlRXJyb3IpCitmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorCitkZWYgc2hvd19mb3JtYXRzKCk6CisgICAgIiIiUHJpbnQgYWxsIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlICdmb3JtYXRzJyBvcHRpb24gKHVzZWQgYnkKKyAgICB0aGUgIi0taGVscC1mb3JtYXRzIiBjb21tYW5kLWxpbmUgb3B0aW9uKS4KKyAgICAiIiIKKyAgICBmcm9tIGRpc3R1dGlscy5mYW5jeV9nZXRvcHQgaW1wb3J0IEZhbmN5R2V0b3B0CisgICAgZnJvbSBkaXN0dXRpbHMuYXJjaGl2ZV91dGlsIGltcG9ydCBBUkNISVZFX0ZPUk1BVFMKKyAgICBmb3JtYXRzID0gW10KKyAgICBmb3IgZm9ybWF0IGluIEFSQ0hJVkVfRk9STUFUUy5rZXlzKCk6CisgICAgICAgIGZvcm1hdHMuYXBwZW5kKCgiZm9ybWF0cz0iICsgZm9ybWF0LCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgQVJDSElWRV9GT1JNQVRTW2Zvcm1hdF1bMl0pKQorICAgIGZvcm1hdHMuc29ydCgpCisgICAgRmFuY3lHZXRvcHQoZm9ybWF0cykucHJpbnRfaGVscCgKKyAgICAgICAgIkxpc3Qgb2YgYXZhaWxhYmxlIHNvdXJjZSBkaXN0cmlidXRpb24gZm9ybWF0czoiKQorCitjbGFzcyBzZGlzdChDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhIHNvdXJjZSBkaXN0cmlidXRpb24gKHRhcmJhbGwsIHppcCBmaWxlLCBldGMuKSIKKworICAgIGRlZiBjaGVja2luZ19tZXRhZGF0YShzZWxmKToKKyAgICAgICAgIiIiQ2FsbGFibGUgdXNlZCBmb3IgdGhlIGNoZWNrIHN1Yi1jb21tYW5kLgorCisgICAgICAgIFBsYWNlZCBoZXJlIHNvIHVzZXJfb3B0aW9ucyBjYW4gdmlldyBpdCIiIgorICAgICAgICByZXR1cm4gc2VsZi5tZXRhZGF0YV9jaGVjaworCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ3RlbXBsYXRlPScsICd0JywKKyAgICAgICAgICJuYW1lIG9mIG1hbmlmZXN0IHRlbXBsYXRlIGZpbGUgW2RlZmF1bHQ6IE1BTklGRVNULmluXSIpLAorICAgICAgICAoJ21hbmlmZXN0PScsICdtJywKKyAgICAgICAgICJuYW1lIG9mIG1hbmlmZXN0IGZpbGUgW2RlZmF1bHQ6IE1BTklGRVNUXSIpLAorICAgICAgICAoJ3VzZS1kZWZhdWx0cycsIE5vbmUsCisgICAgICAgICAiaW5jbHVkZSB0aGUgZGVmYXVsdCBmaWxlIHNldCBpbiB0aGUgbWFuaWZlc3QgIgorICAgICAgICAgIltkZWZhdWx0OyBkaXNhYmxlIHdpdGggLS1uby1kZWZhdWx0c10iKSwKKyAgICAgICAgKCduby1kZWZhdWx0cycsIE5vbmUsCisgICAgICAgICAiZG9uJ3QgaW5jbHVkZSB0aGUgZGVmYXVsdCBmaWxlIHNldCIpLAorICAgICAgICAoJ3BydW5lJywgTm9uZSwKKyAgICAgICAgICJzcGVjaWZpY2FsbHkgZXhjbHVkZSBmaWxlcy9kaXJlY3RvcmllcyB0aGF0IHNob3VsZCBub3QgYmUgIgorICAgICAgICAgImRpc3RyaWJ1dGVkIChidWlsZCB0cmVlLCBSQ1MvQ1ZTIGRpcnMsIGV0Yy4pICIKKyAgICAgICAgICJbZGVmYXVsdDsgZGlzYWJsZSB3aXRoIC0tbm8tcHJ1bmVdIiksCisgICAgICAgICgnbm8tcHJ1bmUnLCBOb25lLAorICAgICAgICAgImRvbid0IGF1dG9tYXRpY2FsbHkgZXhjbHVkZSBhbnl0aGluZyIpLAorICAgICAgICAoJ21hbmlmZXN0LW9ubHknLCAnbycsCisgICAgICAgICAianVzdCByZWdlbmVyYXRlIHRoZSBtYW5pZmVzdCBhbmQgdGhlbiBzdG9wICIKKyAgICAgICAgICIoaW1wbGllcyAtLWZvcmNlLW1hbmlmZXN0KSIpLAorICAgICAgICAoJ2ZvcmNlLW1hbmlmZXN0JywgJ2YnLAorICAgICAgICAgImZvcmNpYmx5IHJlZ2VuZXJhdGUgdGhlIG1hbmlmZXN0IGFuZCBjYXJyeSBvbiBhcyB1c3VhbC4gIgorICAgICAgICAgIkRlcHJlY2F0ZWQ6IG5vdyB0aGUgbWFuaWZlc3QgaXMgYWx3YXlzIHJlZ2VuZXJhdGVkLiIpLAorICAgICAgICAoJ2Zvcm1hdHM9JywgTm9uZSwKKyAgICAgICAgICJmb3JtYXRzIGZvciBzb3VyY2UgZGlzdHJpYnV0aW9uIChjb21tYS1zZXBhcmF0ZWQgbGlzdCkiKSwKKyAgICAgICAgKCdrZWVwLXRlbXAnLCAnaycsCisgICAgICAgICAia2VlcCB0aGUgZGlzdHJpYnV0aW9uIHRyZWUgYXJvdW5kIGFmdGVyIGNyZWF0aW5nICIgKworICAgICAgICAgImFyY2hpdmUgZmlsZShzKSIpLAorICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywKKyAgICAgICAgICJkaXJlY3RvcnkgdG8gcHV0IHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIGFyY2hpdmUocykgaW4gIgorICAgICAgICAgIltkZWZhdWx0OiBkaXN0XSIpLAorICAgICAgICAoJ21ldGFkYXRhLWNoZWNrJywgTm9uZSwKKyAgICAgICAgICJFbnN1cmUgdGhhdCBhbGwgcmVxdWlyZWQgZWxlbWVudHMgb2YgbWV0YS1kYXRhICIKKyAgICAgICAgICJhcmUgc3VwcGxpZWQuIFdhcm4gaWYgYW55IG1pc3NpbmcuIFtkZWZhdWx0XSIpLAorICAgICAgICAoJ293bmVyPScsICd1JywKKyAgICAgICAgICJPd25lciBuYW1lIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRhciBmaWxlIFtkZWZhdWx0OiBjdXJyZW50IHVzZXJdIiksCisgICAgICAgICgnZ3JvdXA9JywgJ2cnLAorICAgICAgICAgIkdyb3VwIG5hbWUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGZpbGUgW2RlZmF1bHQ6IGN1cnJlbnQgZ3JvdXBdIiksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsndXNlLWRlZmF1bHRzJywgJ3BydW5lJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ21hbmlmZXN0LW9ubHknLCAnZm9yY2UtbWFuaWZlc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAna2VlcC10ZW1wJywgJ21ldGFkYXRhLWNoZWNrJ10KKworICAgIGhlbHBfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdoZWxwLWZvcm1hdHMnLCBOb25lLAorICAgICAgICAgImxpc3QgYXZhaWxhYmxlIGRpc3RyaWJ1dGlvbiBmb3JtYXRzIiwgc2hvd19mb3JtYXRzKSwKKyAgICAgICAgXQorCisgICAgbmVnYXRpdmVfb3B0ID0geyduby1kZWZhdWx0cyc6ICd1c2UtZGVmYXVsdHMnLAorICAgICAgICAgICAgICAgICAgICAnbm8tcHJ1bmUnOiAncHJ1bmUnIH0KKworICAgIGRlZmF1bHRfZm9ybWF0ID0geydwb3NpeCc6ICdnenRhcicsCisgICAgICAgICAgICAgICAgICAgICAgJ250JzogJ3ppcCcgfQorCisgICAgc3ViX2NvbW1hbmRzID0gWygnY2hlY2snLCBjaGVja2luZ19tZXRhZGF0YSldCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAjICd0ZW1wbGF0ZScgYW5kICdtYW5pZmVzdCcgYXJlLCByZXNwZWN0aXZlbHksIHRoZSBuYW1lcyBvZgorICAgICAgICAjIHRoZSBtYW5pZmVzdCB0ZW1wbGF0ZSBhbmQgbWFuaWZlc3QgZmlsZS4KKyAgICAgICAgc2VsZi50ZW1wbGF0ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5tYW5pZmVzdCA9IE5vbmUKKworICAgICAgICAjICd1c2VfZGVmYXVsdHMnOiBpZiB0cnVlLCB3ZSB3aWxsIGluY2x1ZGUgdGhlIGRlZmF1bHQgZmlsZSBzZXQKKyAgICAgICAgIyBpbiB0aGUgbWFuaWZlc3QKKyAgICAgICAgc2VsZi51c2VfZGVmYXVsdHMgPSAxCisgICAgICAgIHNlbGYucHJ1bmUgPSAxCisKKyAgICAgICAgc2VsZi5tYW5pZmVzdF9vbmx5ID0gMAorICAgICAgICBzZWxmLmZvcmNlX21hbmlmZXN0ID0gMAorCisgICAgICAgIHNlbGYuZm9ybWF0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5rZWVwX3RlbXAgPSAwCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisKKyAgICAgICAgc2VsZi5hcmNoaXZlX2ZpbGVzID0gTm9uZQorICAgICAgICBzZWxmLm1ldGFkYXRhX2NoZWNrID0gMQorICAgICAgICBzZWxmLm93bmVyID0gTm9uZQorICAgICAgICBzZWxmLmdyb3VwID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYubWFuaWZlc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYubWFuaWZlc3QgPSAiTUFOSUZFU1QiCisgICAgICAgIGlmIHNlbGYudGVtcGxhdGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGVtcGxhdGUgPSAiTUFOSUZFU1QuaW4iCisKKyAgICAgICAgc2VsZi5lbnN1cmVfc3RyaW5nX2xpc3QoJ2Zvcm1hdHMnKQorICAgICAgICBpZiBzZWxmLmZvcm1hdHMgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHMgPSBbc2VsZi5kZWZhdWx0X2Zvcm1hdFtvcy5uYW1lXV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBzb3VyY2UgZGlzdHJpYnV0aW9ucyAiICsgXAorICAgICAgICAgICAgICAgICAgICAgICJvbiBwbGF0Zm9ybSAlcyIgJSBvcy5uYW1lCisKKyAgICAgICAgYmFkX2Zvcm1hdCA9IGFyY2hpdmVfdXRpbC5jaGVja19hcmNoaXZlX2Zvcm1hdHMoc2VsZi5mb3JtYXRzKQorICAgICAgICBpZiBiYWRfZm9ybWF0OgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJ1bmtub3duIGFyY2hpdmUgZm9ybWF0ICclcyciICUgYmFkX2Zvcm1hdAorCisgICAgICAgIGlmIHNlbGYuZGlzdF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGlzdF9kaXIgPSAiZGlzdCIKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICMgJ2ZpbGVsaXN0JyBjb250YWlucyB0aGUgbGlzdCBvZiBmaWxlcyB0aGF0IHdpbGwgbWFrZSB1cCB0aGUKKyAgICAgICAgIyBtYW5pZmVzdAorICAgICAgICBzZWxmLmZpbGVsaXN0ID0gRmlsZUxpc3QoKQorCisgICAgICAgICMgUnVuIHN1YiBjb21tYW5kcworICAgICAgICBmb3IgY21kX25hbWUgaW4gc2VsZi5nZXRfc3ViX2NvbW1hbmRzKCk6CisgICAgICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZF9uYW1lKQorCisgICAgICAgICMgRG8gd2hhdGV2ZXIgaXQgdGFrZXMgdG8gZ2V0IHRoZSBsaXN0IG9mIGZpbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgIyAocHJvY2VzcyB0aGUgbWFuaWZlc3QgdGVtcGxhdGUsIHJlYWQgYW4gZXhpc3RpbmcgbWFuaWZlc3QsCisgICAgICAgICMgd2hhdGV2ZXIpLiAgRmlsZSBsaXN0IGlzIGFjY3VtdWxhdGVkIGluICdzZWxmLmZpbGVsaXN0Jy4KKyAgICAgICAgc2VsZi5nZXRfZmlsZV9saXN0KCkKKworICAgICAgICAjIElmIHVzZXIganVzdCB3YW50ZWQgdXMgdG8gcmVnZW5lcmF0ZSB0aGUgbWFuaWZlc3QsIHN0b3Agbm93LgorICAgICAgICBpZiBzZWxmLm1hbmlmZXN0X29ubHk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIE90aGVyd2lzZSwgZ28gYWhlYWQgYW5kIGNyZWF0ZSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiB0YXJiYWxsLAorICAgICAgICAjIG9yIHppcGZpbGUsIG9yIHdoYXRldmVyLgorICAgICAgICBzZWxmLm1ha2VfZGlzdHJpYnV0aW9uKCkKKworICAgIGRlZiBjaGVja19tZXRhZGF0YShzZWxmKToKKyAgICAgICAgIiIiRGVwcmVjYXRlZCBBUEkuIiIiCisgICAgICAgIHdhcm4oImRpc3R1dGlscy5jb21tYW5kLnNkaXN0LmNoZWNrX21ldGFkYXRhIGlzIGRlcHJlY2F0ZWQsIFwKKyAgICAgICAgICAgICAgdXNlIHRoZSBjaGVjayBjb21tYW5kIGluc3RlYWQiLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICBjaGVjayA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9jb21tYW5kX29iaignY2hlY2snKQorICAgICAgICBjaGVjay5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY2hlY2sucnVuKCkKKworICAgIGRlZiBnZXRfZmlsZV9saXN0KHNlbGYpOgorICAgICAgICAiIiJGaWd1cmUgb3V0IHRoZSBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIHNvdXJjZQorICAgICAgICBkaXN0cmlidXRpb24sIGFuZCBwdXQgaXQgaW4gJ3NlbGYuZmlsZWxpc3QnLiAgVGhpcyBtaWdodCBpbnZvbHZlCisgICAgICAgIHJlYWRpbmcgdGhlIG1hbmlmZXN0IHRlbXBsYXRlIChhbmQgd3JpdGluZyB0aGUgbWFuaWZlc3QpLCBvciBqdXN0CisgICAgICAgIHJlYWRpbmcgdGhlIG1hbmlmZXN0LCBvciBqdXN0IHVzaW5nIHRoZSBkZWZhdWx0IGZpbGUgc2V0IC0tIGl0IGFsbAorICAgICAgICBkZXBlbmRzIG9uIHRoZSB1c2VyJ3Mgb3B0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgICMgbmV3IGJlaGF2aW9yIHdoZW4gdXNpbmcgYSB0ZW1wbGF0ZToKKyAgICAgICAgIyB0aGUgZmlsZSBsaXN0IGlzIHJlY2FsY3VsYXRlZCBldmVyeXRpbWUgYmVjYXVzZQorICAgICAgICAjIGV2ZW4gaWYgTUFOSUZFU1QuaW4gb3Igc2V0dXAucHkgYXJlIG5vdCBjaGFuZ2VkCisgICAgICAgICMgdGhlIHVzZXIgbWlnaHQgaGF2ZSBhZGRlZCBzb21lIGZpbGVzIGluIHRoZSB0cmVlIHRoYXQKKyAgICAgICAgIyBuZWVkIHRvIGJlIGluY2x1ZGVkLgorICAgICAgICAjCisgICAgICAgICMgIFRoaXMgbWFrZXMgLS1mb3JjZSB0aGUgZGVmYXVsdCBhbmQgb25seSBiZWhhdmlvciB3aXRoIHRlbXBsYXRlcy4KKyAgICAgICAgdGVtcGxhdGVfZXhpc3RzID0gb3MucGF0aC5pc2ZpbGUoc2VsZi50ZW1wbGF0ZSkKKyAgICAgICAgaWYgbm90IHRlbXBsYXRlX2V4aXN0cyBhbmQgc2VsZi5fbWFuaWZlc3RfaXNfbm90X2dlbmVyYXRlZCgpOgorICAgICAgICAgICAgc2VsZi5yZWFkX21hbmlmZXN0KCkKKyAgICAgICAgICAgIHNlbGYuZmlsZWxpc3Quc29ydCgpCisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LnJlbW92ZV9kdXBsaWNhdGVzKCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG5vdCB0ZW1wbGF0ZV9leGlzdHM6CisgICAgICAgICAgICBzZWxmLndhcm4oKCJtYW5pZmVzdCB0ZW1wbGF0ZSAnJXMnIGRvZXMgbm90IGV4aXN0ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIih1c2luZyBkZWZhdWx0IGZpbGUgbGlzdCkiKSAlCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlbXBsYXRlKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmZpbmRhbGwoKQorCisgICAgICAgIGlmIHNlbGYudXNlX2RlZmF1bHRzOgorICAgICAgICAgICAgc2VsZi5hZGRfZGVmYXVsdHMoKQorCisgICAgICAgIGlmIHRlbXBsYXRlX2V4aXN0czoKKyAgICAgICAgICAgIHNlbGYucmVhZF90ZW1wbGF0ZSgpCisKKyAgICAgICAgaWYgc2VsZi5wcnVuZToKKyAgICAgICAgICAgIHNlbGYucHJ1bmVfZmlsZV9saXN0KCkKKworICAgICAgICBzZWxmLmZpbGVsaXN0LnNvcnQoKQorICAgICAgICBzZWxmLmZpbGVsaXN0LnJlbW92ZV9kdXBsaWNhdGVzKCkKKyAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpCisKKyAgICBkZWYgYWRkX2RlZmF1bHRzKHNlbGYpOgorICAgICAgICAiIiJBZGQgYWxsIHRoZSBkZWZhdWx0IGZpbGVzIHRvIHNlbGYuZmlsZWxpc3Q6CisgICAgICAgICAgLSBSRUFETUUgb3IgUkVBRE1FLnR4dAorICAgICAgICAgIC0gc2V0dXAucHkKKyAgICAgICAgICAtIHRlc3QvdGVzdCoucHkKKyAgICAgICAgICAtIGFsbCBwdXJlIFB5dGhvbiBtb2R1bGVzIG1lbnRpb25lZCBpbiBzZXR1cCBzY3JpcHQKKyAgICAgICAgICAtIGFsbCBmaWxlcyBwb2ludGVkIGJ5IHBhY2thZ2VfZGF0YSAoYnVpbGRfcHkpCisgICAgICAgICAgLSBhbGwgZmlsZXMgZGVmaW5lZCBpbiBkYXRhX2ZpbGVzLgorICAgICAgICAgIC0gYWxsIGZpbGVzIGRlZmluZWQgYXMgc2NyaXB0cy4KKyAgICAgICAgICAtIGFsbCBDIHNvdXJjZXMgbGlzdGVkIGFzIHBhcnQgb2YgZXh0ZW5zaW9ucyBvciBDIGxpYnJhcmllcworICAgICAgICAgICAgaW4gdGhlIHNldHVwIHNjcmlwdCAoZG9lc24ndCBjYXRjaCBDIGhlYWRlcnMhKQorICAgICAgICBXYXJucyBpZiAoUkVBRE1FIG9yIFJFQURNRS50eHQpIG9yIHNldHVwLnB5IGFyZSBtaXNzaW5nOyBldmVyeXRoaW5nCisgICAgICAgIGVsc2UgaXMgb3B0aW9uYWwuCisgICAgICAgICIiIgorCisgICAgICAgIHN0YW5kYXJkcyA9IFsoJ1JFQURNRScsICdSRUFETUUudHh0JyksIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdF9uYW1lXQorICAgICAgICBmb3IgZm4gaW4gc3RhbmRhcmRzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmbiwgdHVwbGUpOgorICAgICAgICAgICAgICAgIGFsdHMgPSBmbgorICAgICAgICAgICAgICAgIGdvdF9pdCA9IDAKKyAgICAgICAgICAgICAgICBmb3IgZm4gaW4gYWx0czoKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZm4pOgorICAgICAgICAgICAgICAgICAgICAgICAgZ290X2l0ID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAgICAgaWYgbm90IGdvdF9pdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlIG5vdCBmb3VuZDogc2hvdWxkIGhhdmUgb25lIG9mICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmpvaW4oYWx0cywgJywgJykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoZm4pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuKCJzdGFuZGFyZCBmaWxlICclcycgbm90IGZvdW5kIiAlIGZuKQorCisgICAgICAgIG9wdGlvbmFsID0gWyd0ZXN0L3Rlc3QqLnB5JywgJ3NldHVwLmNmZyddCisgICAgICAgIGZvciBwYXR0ZXJuIGluIG9wdGlvbmFsOgorICAgICAgICAgICAgZmlsZXMgPSBmaWx0ZXIob3MucGF0aC5pc2ZpbGUsIGdsb2IocGF0dGVybikpCisgICAgICAgICAgICBpZiBmaWxlczoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChmaWxlcykKKworICAgICAgICAjIGJ1aWxkX3B5IGlzIHVzZWQgdG8gZ2V0OgorICAgICAgICAjICAtIHB5dGhvbiBtb2R1bGVzCisgICAgICAgICMgIC0gZmlsZXMgZGVmaW5lZCBpbiBwYWNrYWdlX2RhdGEKKyAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQorCisgICAgICAgICMgZ2V0dGluZyBweXRob24gZmlsZXMKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX3B1cmVfbW9kdWxlcygpOgorICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfcHkuZ2V0X3NvdXJjZV9maWxlcygpKQorCisgICAgICAgICMgZ2V0dGluZyBwYWNrYWdlX2RhdGEgZmlsZXMKKyAgICAgICAgIyAoY29tcHV0ZWQgaW4gYnVpbGRfcHkuZGF0YV9maWxlcyBieSBidWlsZF9weS5maW5hbGl6ZV9vcHRpb25zKQorICAgICAgICBmb3IgcGtnLCBzcmNfZGlyLCBidWlsZF9kaXIsIGZpbGVuYW1lcyBpbiBidWlsZF9weS5kYXRhX2ZpbGVzOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpKQorCisgICAgICAgICMgZ2V0dGluZyBkaXN0cmlidXRpb24uZGF0YV9maWxlcworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfZGF0YV9maWxlcygpOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlczoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIHN0cik6ICMgcGxhaW4gZmlsZQorICAgICAgICAgICAgICAgICAgICBpdGVtID0gY29udmVydF9wYXRoKGl0ZW0pCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGl0ZW0pOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgICAgICBlbHNlOiAgICAjIGEgKGRpcm5hbWUsIGZpbGVuYW1lcykgdHVwbGUKKyAgICAgICAgICAgICAgICAgICAgZGlybmFtZSwgZmlsZW5hbWVzID0gaXRlbQorICAgICAgICAgICAgICAgICAgICBmb3IgZiBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gY29udmVydF9wYXRoKGYpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChmKQorCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpOgorICAgICAgICAgICAgYnVpbGRfZXh0ID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmV4dGVuZChidWlsZF9leHQuZ2V0X3NvdXJjZV9maWxlcygpKQorCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19jX2xpYnJhcmllcygpOgorICAgICAgICAgICAgYnVpbGRfY2xpYiA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9jbGliJykKKyAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKGJ1aWxkX2NsaWIuZ2V0X3NvdXJjZV9maWxlcygpKQorCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19zY3JpcHRzKCk6CisgICAgICAgICAgICBidWlsZF9zY3JpcHRzID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3NjcmlwdHMnKQorICAgICAgICAgICAgc2VsZi5maWxlbGlzdC5leHRlbmQoYnVpbGRfc2NyaXB0cy5nZXRfc291cmNlX2ZpbGVzKCkpCisKKyAgICBkZWYgcmVhZF90ZW1wbGF0ZShzZWxmKToKKyAgICAgICAgIiIiUmVhZCBhbmQgcGFyc2UgbWFuaWZlc3QgdGVtcGxhdGUgZmlsZSBuYW1lZCBieSBzZWxmLnRlbXBsYXRlLgorCisgICAgICAgICh1c3VhbGx5ICJNQU5JRkVTVC5pbiIpIFRoZSBwYXJzaW5nIGFuZCBwcm9jZXNzaW5nIGlzIGRvbmUgYnkKKyAgICAgICAgJ3NlbGYuZmlsZWxpc3QnLCB3aGljaCB1cGRhdGVzIGl0c2VsZiBhY2NvcmRpbmdseS4KKyAgICAgICAgIiIiCisgICAgICAgIGxvZy5pbmZvKCJyZWFkaW5nIG1hbmlmZXN0IHRlbXBsYXRlICclcyciLCBzZWxmLnRlbXBsYXRlKQorICAgICAgICB0ZW1wbGF0ZSA9IFRleHRGaWxlKHNlbGYudGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBfY29tbWVudHM9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwX2JsYW5rcz0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5fbGluZXM9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RyaXBfd3M9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByc3RyaXBfd3M9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsYXBzZV9qb2luPTEpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gdGVtcGxhdGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTm9uZTogICAgICAgICAgICAjIGVuZCBvZiBmaWxlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKGxpbmUpCisgICAgICAgICAgICAgICAgIyB0aGUgY2FsbCBhYm92ZSBjYW4gcmFpc2UgYSBEaXN0dXRpbHNUZW1wbGF0ZUVycm9yIGZvcgorICAgICAgICAgICAgICAgICMgbWFsZm9ybWVkIGxpbmVzLCBvciBhIFZhbHVlRXJyb3IgZnJvbSB0aGUgbG93ZXItbGV2ZWwKKyAgICAgICAgICAgICAgICAjIGNvbnZlcnRfcGF0aCBmdW5jdGlvbgorICAgICAgICAgICAgICAgIGV4Y2VwdCAoRGlzdHV0aWxzVGVtcGxhdGVFcnJvciwgVmFsdWVFcnJvcikgYXMgbXNnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oIiVzLCBsaW5lICVkOiAlcyIgJSAodGVtcGxhdGUuZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5jdXJyZW50X2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGVtcGxhdGUuY2xvc2UoKQorCisgICAgZGVmIHBydW5lX2ZpbGVfbGlzdChzZWxmKToKKyAgICAgICAgIiIiUHJ1bmUgb2ZmIGJyYW5jaGVzIHRoYXQgbWlnaHQgc2xpcCBpbnRvIHRoZSBmaWxlIGxpc3QgYXMgY3JlYXRlZAorICAgICAgICBieSAncmVhZF90ZW1wbGF0ZSgpJywgYnV0IHJlYWxseSBkb24ndCBiZWxvbmcgdGhlcmU6CisgICAgICAgICAgKiB0aGUgYnVpbGQgdHJlZSAodHlwaWNhbGx5ICJidWlsZCIpCisgICAgICAgICAgKiB0aGUgcmVsZWFzZSB0cmVlIGl0c2VsZiAob25seSBhbiBpc3N1ZSBpZiB3ZSByYW4gInNkaXN0IgorICAgICAgICAgICAgcHJldmlvdXNseSB3aXRoIC0ta2VlcC10ZW1wLCBvciBpdCBhYm9ydGVkKQorICAgICAgICAgICogYW55IFJDUywgQ1ZTLCAuc3ZuLCAuaGcsIC5naXQsIC5ienIsIF9kYXJjcyBkaXJlY3RvcmllcworICAgICAgICAiIiIKKyAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQorICAgICAgICBiYXNlX2RpciA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpCisKKyAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWJ1aWxkLmJ1aWxkX2Jhc2UpCisgICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1iYXNlX2RpcikKKworICAgICAgICAjIHBydW5pbmcgb3V0IHZjcyBkaXJlY3RvcmllcworICAgICAgICAjIGJvdGggc2VwYXJhdG9ycyBhcmUgdXNlZCB1bmRlciB3aW4zMgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHNlcHMgPSByJy98XFwnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXBzID0gJy8nCisKKyAgICAgICAgdmNzX2RpcnMgPSBbJ1JDUycsICdDVlMnLCByJ1wuc3ZuJywgcidcLmhnJywgcidcLmdpdCcsIHInXC5ienInLAorICAgICAgICAgICAgICAgICAgICAnX2RhcmNzJ10KKyAgICAgICAgdmNzX3B0cm4gPSByJyhefCVzKSglcykoJXMpLionICUgKHNlcHMsICd8Jy5qb2luKHZjc19kaXJzKSwgc2VwcykKKyAgICAgICAgc2VsZi5maWxlbGlzdC5leGNsdWRlX3BhdHRlcm4odmNzX3B0cm4sIGlzX3JlZ2V4PTEpCisKKyAgICBkZWYgd3JpdGVfbWFuaWZlc3Qoc2VsZik6CisgICAgICAgICIiIldyaXRlIHRoZSBmaWxlIGxpc3QgaW4gJ3NlbGYuZmlsZWxpc3QnIChwcmVzdW1hYmx5IGFzIGZpbGxlZCBpbgorICAgICAgICBieSAnYWRkX2RlZmF1bHRzKCknIGFuZCAncmVhZF90ZW1wbGF0ZSgpJykgdG8gdGhlIG1hbmlmZXN0IGZpbGUKKyAgICAgICAgbmFtZWQgYnkgJ3NlbGYubWFuaWZlc3QnLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fbWFuaWZlc3RfaXNfbm90X2dlbmVyYXRlZCgpOgorICAgICAgICAgICAgbG9nLmluZm8oIm5vdCB3cml0aW5nIHRvIG1hbnVhbGx5IG1haW50YWluZWQgIgorICAgICAgICAgICAgICAgICAgICAgIm1hbmlmZXN0IGZpbGUgJyVzJyIgJSBzZWxmLm1hbmlmZXN0KQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgY29udGVudCA9IHNlbGYuZmlsZWxpc3QuZmlsZXNbOl0KKyAgICAgICAgY29udGVudC5pbnNlcnQoMCwgJyMgZmlsZSBHRU5FUkFURUQgYnkgZGlzdHV0aWxzLCBkbyBOT1QgZWRpdCcpCisgICAgICAgIHNlbGYuZXhlY3V0ZShmaWxlX3V0aWwud3JpdGVfZmlsZSwgKHNlbGYubWFuaWZlc3QsIGNvbnRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiAlIHNlbGYubWFuaWZlc3QpCisKKyAgICBkZWYgX21hbmlmZXN0X2lzX25vdF9nZW5lcmF0ZWQoc2VsZik6CisgICAgICAgICMgY2hlY2sgZm9yIHNwZWNpYWwgY29tbWVudCB1c2VkIGluIDIuNy4xIGFuZCBoaWdoZXIKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNlbGYubWFuaWZlc3QpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgZnAgPSBvcGVuKHNlbGYubWFuaWZlc3QsICdyVScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpcnN0X2xpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHJldHVybiBmaXJzdF9saW5lICE9ICcjIGZpbGUgR0VORVJBVEVEIGJ5IGRpc3R1dGlscywgZG8gTk9UIGVkaXRcbicKKworICAgIGRlZiByZWFkX21hbmlmZXN0KHNlbGYpOgorICAgICAgICAiIiJSZWFkIHRoZSBtYW5pZmVzdCBmaWxlIChuYW1lZCBieSAnc2VsZi5tYW5pZmVzdCcpIGFuZCB1c2UgaXQgdG8KKyAgICAgICAgZmlsbCBpbiAnc2VsZi5maWxlbGlzdCcsIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIHNvdXJjZQorICAgICAgICBkaXN0cmlidXRpb24uCisgICAgICAgICIiIgorICAgICAgICBsb2cuaW5mbygicmVhZGluZyBtYW5pZmVzdCBmaWxlICclcyciLCBzZWxmLm1hbmlmZXN0KQorICAgICAgICBtYW5pZmVzdCA9IG9wZW4oc2VsZi5tYW5pZmVzdCkKKyAgICAgICAgZm9yIGxpbmUgaW4gbWFuaWZlc3Q6CisgICAgICAgICAgICAjIGlnbm9yZSBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnIycpIG9yIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChsaW5lKQorICAgICAgICBtYW5pZmVzdC5jbG9zZSgpCisKKyAgICBkZWYgbWFrZV9yZWxlYXNlX3RyZWUoc2VsZiwgYmFzZV9kaXIsIGZpbGVzKToKKyAgICAgICAgIiIiQ3JlYXRlIHRoZSBkaXJlY3RvcnkgdHJlZSB0aGF0IHdpbGwgYmVjb21lIHRoZSBzb3VyY2UKKyAgICAgICAgZGlzdHJpYnV0aW9uIGFyY2hpdmUuICBBbGwgZGlyZWN0b3JpZXMgaW1wbGllZCBieSB0aGUgZmlsZW5hbWVzIGluCisgICAgICAgICdmaWxlcycgYXJlIGNyZWF0ZWQgdW5kZXIgJ2Jhc2VfZGlyJywgYW5kIHRoZW4gd2UgaGFyZCBsaW5rIG9yIGNvcHkKKyAgICAgICAgKGlmIGhhcmQgbGlua2luZyBpcyB1bmF2YWlsYWJsZSkgdGhvc2UgZmlsZXMgaW50byBwbGFjZS4KKyAgICAgICAgRXNzZW50aWFsbHksIHRoaXMgZHVwbGljYXRlcyB0aGUgZGV2ZWxvcGVyJ3Mgc291cmNlIHRyZWUsIGJ1dCBpbiBhCisgICAgICAgIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgZGlzdHJpYnV0aW9uLCBjb250YWluaW5nIG9ubHkgdGhlIGZpbGVzCisgICAgICAgIHRvIGJlIGRpc3RyaWJ1dGVkLgorICAgICAgICAiIiIKKyAgICAgICAgIyBDcmVhdGUgYWxsIHRoZSBkaXJlY3RvcmllcyB1bmRlciAnYmFzZV9kaXInIG5lY2Vzc2FyeSB0bworICAgICAgICAjIHB1dCAnZmlsZXMnIHRoZXJlOyB0aGUgJ21rcGF0aCgpJyBpcyBqdXN0IHNvIHdlIGRvbid0IGRpZQorICAgICAgICAjIGlmIHRoZSBtYW5pZmVzdCBoYXBwZW5zIHRvIGJlIGVtcHR5LgorICAgICAgICBzZWxmLm1rcGF0aChiYXNlX2RpcikKKyAgICAgICAgZGlyX3V0aWwuY3JlYXRlX3RyZWUoYmFzZV9kaXIsIGZpbGVzLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKworICAgICAgICAjIEFuZCB3YWxrIG92ZXIgdGhlIGxpc3Qgb2YgZmlsZXMsIGVpdGhlciBtYWtpbmcgYSBoYXJkIGxpbmsgKGlmCisgICAgICAgICMgb3MubGluayBleGlzdHMpIHRvIGVhY2ggb25lIHRoYXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0IGluIGl0cworICAgICAgICAjIGNvcnJlc3BvbmRpbmcgbG9jYXRpb24gdW5kZXIgJ2Jhc2VfZGlyJywgb3IgY29weWluZyBlYWNoIGZpbGUKKyAgICAgICAgIyB0aGF0J3Mgb3V0LW9mLWRhdGUgaW4gJ2Jhc2VfZGlyJy4gIChVc3VhbGx5LCBhbGwgZmlsZXMgd2lsbCBiZQorICAgICAgICAjIG91dC1vZi1kYXRlLCBiZWNhdXNlIGJ5IGRlZmF1bHQgd2UgYmxvdyBhd2F5ICdiYXNlX2Rpcicgd2hlbgorICAgICAgICAjIHdlJ3JlIGRvbmUgbWFraW5nIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZXMuKQorCisgICAgICAgIGlmIGhhc2F0dHIob3MsICdsaW5rJyk6ICAgICAgICAjIGNhbiBtYWtlIGhhcmQgbGlua3Mgb24gdGhpcyBzeXN0ZW0KKyAgICAgICAgICAgIGxpbmsgPSAnaGFyZCcKKyAgICAgICAgICAgIG1zZyA9ICJtYWtpbmcgaGFyZCBsaW5rcyBpbiAlcy4uLiIgJSBiYXNlX2RpcgorICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm9wZSwgaGF2ZSB0byBjb3B5CisgICAgICAgICAgICBsaW5rID0gTm9uZQorICAgICAgICAgICAgbXNnID0gImNvcHlpbmcgZmlsZXMgdG8gJXMuLi4iICUgYmFzZV9kaXIKKworICAgICAgICBpZiBub3QgZmlsZXM6CisgICAgICAgICAgICBsb2cud2Fybigibm8gZmlsZXMgdG8gZGlzdHJpYnV0ZSAtLSBlbXB0eSBtYW5pZmVzdD8iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmluZm8obXNnKQorICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlKToKKyAgICAgICAgICAgICAgICBsb2cud2FybigiJyVzJyBub3QgYSByZWd1bGFyIGZpbGUgLS0gc2tpcHBpbmciICUgZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVzdCA9IG9zLnBhdGguam9pbihiYXNlX2RpciwgZmlsZSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShmaWxlLCBkZXN0LCBsaW5rPWxpbmspCisKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEud3JpdGVfcGtnX2luZm8oYmFzZV9kaXIpCisKKyAgICBkZWYgbWFrZV9kaXN0cmlidXRpb24oc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbihzKS4gIEZpcnN0LCB3ZSBjcmVhdGUgdGhlIHJlbGVhc2UKKyAgICAgICAgdHJlZSB3aXRoICdtYWtlX3JlbGVhc2VfdHJlZSgpJzsgdGhlbiwgd2UgY3JlYXRlIGFsbCByZXF1aXJlZAorICAgICAgICBhcmNoaXZlIGZpbGVzIChhY2NvcmRpbmcgdG8gJ3NlbGYuZm9ybWF0cycpIGZyb20gdGhlIHJlbGVhc2UgdHJlZS4KKyAgICAgICAgRmluYWxseSwgd2UgY2xlYW4gdXAgYnkgYmxvd2luZyBhd2F5IHRoZSByZWxlYXNlIHRyZWUgKHVubGVzcworICAgICAgICAnc2VsZi5rZWVwX3RlbXAnIGlzIHRydWUpLiAgVGhlIGxpc3Qgb2YgYXJjaGl2ZSBmaWxlcyBjcmVhdGVkIGlzCisgICAgICAgIHN0b3JlZCBzbyBpdCBjYW4gYmUgcmV0cmlldmVkIGxhdGVyIGJ5ICdnZXRfYXJjaGl2ZV9maWxlcygpJy4KKyAgICAgICAgIiIiCisgICAgICAgICMgRG9uJ3Qgd2FybiBhYm91dCBtaXNzaW5nIG1ldGEtZGF0YSBoZXJlIC0tIHNob3VsZCBiZSAoYW5kIGlzISkKKyAgICAgICAgIyBkb25lIGVsc2V3aGVyZS4KKyAgICAgICAgYmFzZV9kaXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfZnVsbG5hbWUoKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpciwgYmFzZV9kaXIpCisKKyAgICAgICAgc2VsZi5tYWtlX3JlbGVhc2VfdHJlZShiYXNlX2Rpciwgc2VsZi5maWxlbGlzdC5maWxlcykKKyAgICAgICAgYXJjaGl2ZV9maWxlcyA9IFtdICAgICAgICAgICAgICAjIHJlbWVtYmVyIG5hbWVzIG9mIGZpbGVzIHdlIGNyZWF0ZQorICAgICAgICAjIHRhciBhcmNoaXZlIG11c3QgYmUgY3JlYXRlZCBsYXN0IHRvIGF2b2lkIG92ZXJ3cml0ZSBhbmQgcmVtb3ZlCisgICAgICAgIGlmICd0YXInIGluIHNlbGYuZm9ybWF0czoKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0cy5hcHBlbmQoc2VsZi5mb3JtYXRzLnBvcChzZWxmLmZvcm1hdHMuaW5kZXgoJ3RhcicpKSkKKworICAgICAgICBmb3IgZm10IGluIHNlbGYuZm9ybWF0czoKKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLm1ha2VfYXJjaGl2ZShiYXNlX25hbWUsIGZtdCwgYmFzZV9kaXI9YmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXI9c2VsZi5vd25lciwgZ3JvdXA9c2VsZi5ncm91cCkKKyAgICAgICAgICAgIGFyY2hpdmVfZmlsZXMuYXBwZW5kKGZpbGUpCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzLmFwcGVuZCgoJ3NkaXN0JywgJycsIGZpbGUpKQorCisgICAgICAgIHNlbGYuYXJjaGl2ZV9maWxlcyA9IGFyY2hpdmVfZmlsZXMKKworICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CisgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShiYXNlX2RpciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICBkZWYgZ2V0X2FyY2hpdmVfZmlsZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiBhcmNoaXZlIGZpbGVzIGNyZWF0ZWQgd2hlbiB0aGUgY29tbWFuZAorICAgICAgICB3YXMgcnVuLCBvciBOb25lIGlmIHRoZSBjb21tYW5kIGhhc24ndCBydW4geWV0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJjaGl2ZV9maWxlcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzI2ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3NkaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzI2ZjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC9zZGlzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDEzMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKQEAgLTAsMCArMSwxOTQgQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLnVwbG9hZAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ3VwbG9hZCcgc3ViY29tbWFuZCAodXBsb2FkIHBhY2thZ2UgdG8gUHlQSSkuIiIiCitpbXBvcnQgb3MKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBwbGF0Zm9ybQorZnJvbSB1cmxsaWIyIGltcG9ydCB1cmxvcGVuLCBSZXF1ZXN0LCBIVFRQRXJyb3IKK2Zyb20gYmFzZTY0IGltcG9ydCBzdGFuZGFyZF9iNjRlbmNvZGUKK2ltcG9ydCB1cmxwYXJzZQoraW1wb3J0IGNTdHJpbmdJTyBhcyBTdHJpbmdJTworZnJvbSBoYXNobGliIGltcG9ydCBtZDUKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgUHlQSVJDQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2NsYXNzIHVwbG9hZChQeVBJUkNDb21tYW5kKToKKworICAgIGRlc2NyaXB0aW9uID0gInVwbG9hZCBiaW5hcnkgcGFja2FnZSB0byBQeVBJIgorCisgICAgdXNlcl9vcHRpb25zID0gUHlQSVJDQ29tbWFuZC51c2VyX29wdGlvbnMgKyBbCisgICAgICAgICgnc2lnbicsICdzJywKKyAgICAgICAgICdzaWduIGZpbGVzIHRvIHVwbG9hZCB1c2luZyBncGcnKSwKKyAgICAgICAgKCdpZGVudGl0eT0nLCAnaScsICdHUEcgaWRlbnRpdHkgdXNlZCB0byBzaWduIGZpbGVzJyksCisgICAgICAgIF0KKworICAgIGJvb2xlYW5fb3B0aW9ucyA9IFB5UElSQ0NvbW1hbmQuYm9vbGVhbl9vcHRpb25zICsgWydzaWduJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIFB5UElSQ0NvbW1hbmQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYudXNlcm5hbWUgPSAnJworICAgICAgICBzZWxmLnBhc3N3b3JkID0gJycKKyAgICAgICAgc2VsZi5zaG93X3Jlc3BvbnNlID0gMAorICAgICAgICBzZWxmLnNpZ24gPSBGYWxzZQorICAgICAgICBzZWxmLmlkZW50aXR5ID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIFB5UElSQ0NvbW1hbmQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBpZiBzZWxmLmlkZW50aXR5IGFuZCBub3Qgc2VsZi5zaWduOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3QgdXNlIC0tc2lnbiBmb3IgLS1pZGVudGl0eSB0byBoYXZlIG1lYW5pbmciCisgICAgICAgICAgICApCisgICAgICAgIGNvbmZpZyA9IHNlbGYuX3JlYWRfcHlwaXJjKCkKKyAgICAgICAgaWYgY29uZmlnICE9IHt9OgorICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9IGNvbmZpZ1sndXNlcm5hbWUnXQorICAgICAgICAgICAgc2VsZi5wYXNzd29yZCA9IGNvbmZpZ1sncGFzc3dvcmQnXQorICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gY29uZmlnWydyZXBvc2l0b3J5J10KKyAgICAgICAgICAgIHNlbGYucmVhbG0gPSBjb25maWdbJ3JlYWxtJ10KKworICAgICAgICAjIGdldHRpbmcgdGhlIHBhc3N3b3JkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbgorICAgICAgICAjIGlmIHByZXZpb3VzbHkgc2V0IGJ5IHRoZSByZWdpc3RlciBjb21tYW5kCisgICAgICAgIGlmIG5vdCBzZWxmLnBhc3N3b3JkIGFuZCBzZWxmLmRpc3RyaWJ1dGlvbi5wYXNzd29yZDoKKyAgICAgICAgICAgIHNlbGYucGFzc3dvcmQgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYXNzd29yZAorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXM6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTm8gZGlzdCBmaWxlIGNyZWF0ZWQgaW4gZWFybGllciBjb21tYW5kIikKKyAgICAgICAgZm9yIGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUgaW4gc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlczoKKyAgICAgICAgICAgIHNlbGYudXBsb2FkX2ZpbGUoY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSkKKworICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lKToKKyAgICAgICAgIyBNYWtlcyBzdXJlIHRoZSByZXBvc2l0b3J5IFVSTCBpcyBjb21wbGlhbnQKKyAgICAgICAgc2NoZW1hLCBuZXRsb2MsIHVybCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnRzID0gXAorICAgICAgICAgICAgdXJscGFyc2UudXJscGFyc2Uoc2VsZi5yZXBvc2l0b3J5KQorICAgICAgICBpZiBwYXJhbXMgb3IgcXVlcnkgb3IgZnJhZ21lbnRzOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkluY29tcGF0aWJsZSB1cmwgJXMiICUgc2VsZi5yZXBvc2l0b3J5KQorCisgICAgICAgIGlmIHNjaGVtYSBub3QgaW4gKCdodHRwJywgJ2h0dHBzJyk6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigidW5zdXBwb3J0ZWQgc2NoZW1hICIgKyBzY2hlbWEpCisKKyAgICAgICAgIyBTaWduIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiBzZWxmLnNpZ246CisgICAgICAgICAgICBncGdfYXJncyA9IFsiZ3BnIiwgIi0tZGV0YWNoLXNpZ24iLCAiLWEiLCBmaWxlbmFtZV0KKyAgICAgICAgICAgIGlmIHNlbGYuaWRlbnRpdHk6CisgICAgICAgICAgICAgICAgZ3BnX2FyZ3NbMjoyXSA9IFsiLS1sb2NhbC11c2VyIiwgc2VsZi5pZGVudGl0eV0KKyAgICAgICAgICAgIHNwYXduKGdwZ19hcmdzLAorICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICAgICAgIyBGaWxsIGluIHRoZSBkYXRhIC0gc2VuZCBhbGwgdGhlIG1ldGEtZGF0YSBpbiBjYXNlIHdlIG5lZWQgdG8KKyAgICAgICAgIyByZWdpc3RlciBhIG5ldyByZWxlYXNlCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIG1ldGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5tZXRhZGF0YQorICAgICAgICBkYXRhID0geworICAgICAgICAgICAgIyBhY3Rpb24KKyAgICAgICAgICAgICc6YWN0aW9uJzogJ2ZpbGVfdXBsb2FkJywKKyAgICAgICAgICAgICdwcm90Y29sX3ZlcnNpb24nOiAnMScsCisKKyAgICAgICAgICAgICMgaWRlbnRpZnkgcmVsZWFzZQorICAgICAgICAgICAgJ25hbWUnOiBtZXRhLmdldF9uYW1lKCksCisgICAgICAgICAgICAndmVyc2lvbic6IG1ldGEuZ2V0X3ZlcnNpb24oKSwKKworICAgICAgICAgICAgIyBmaWxlIGNvbnRlbnQKKyAgICAgICAgICAgICdjb250ZW50JzogKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLGNvbnRlbnQpLAorICAgICAgICAgICAgJ2ZpbGV0eXBlJzogY29tbWFuZCwKKyAgICAgICAgICAgICdweXZlcnNpb24nOiBweXZlcnNpb24sCisgICAgICAgICAgICAnbWQ1X2RpZ2VzdCc6IG1kNShjb250ZW50KS5oZXhkaWdlc3QoKSwKKworICAgICAgICAgICAgIyBhZGRpdGlvbmFsIG1ldGEtZGF0YQorICAgICAgICAgICAgJ21ldGFkYXRhX3ZlcnNpb24nIDogJzEuMCcsCisgICAgICAgICAgICAnc3VtbWFyeSc6IG1ldGEuZ2V0X2Rlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAnaG9tZV9wYWdlJzogbWV0YS5nZXRfdXJsKCksCisgICAgICAgICAgICAnYXV0aG9yJzogbWV0YS5nZXRfY29udGFjdCgpLAorICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCc6IG1ldGEuZ2V0X2NvbnRhY3RfZW1haWwoKSwKKyAgICAgICAgICAgICdsaWNlbnNlJzogbWV0YS5nZXRfbGljZW5jZSgpLAorICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogbWV0YS5nZXRfbG9uZ19kZXNjcmlwdGlvbigpLAorICAgICAgICAgICAgJ2tleXdvcmRzJzogbWV0YS5nZXRfa2V5d29yZHMoKSwKKyAgICAgICAgICAgICdwbGF0Zm9ybSc6IG1ldGEuZ2V0X3BsYXRmb3JtcygpLAorICAgICAgICAgICAgJ2NsYXNzaWZpZXJzJzogbWV0YS5nZXRfY2xhc3NpZmllcnMoKSwKKyAgICAgICAgICAgICdkb3dubG9hZF91cmwnOiBtZXRhLmdldF9kb3dubG9hZF91cmwoKSwKKyAgICAgICAgICAgICMgUEVQIDMxNAorICAgICAgICAgICAgJ3Byb3ZpZGVzJzogbWV0YS5nZXRfcHJvdmlkZXMoKSwKKyAgICAgICAgICAgICdyZXF1aXJlcyc6IG1ldGEuZ2V0X3JlcXVpcmVzKCksCisgICAgICAgICAgICAnb2Jzb2xldGVzJzogbWV0YS5nZXRfb2Jzb2xldGVzKCksCisgICAgICAgICAgICB9CisgICAgICAgIGNvbW1lbnQgPSAnJworICAgICAgICBpZiBjb21tYW5kID09ICdiZGlzdF9ycG0nOgorICAgICAgICAgICAgZGlzdCwgdmVyc2lvbiwgaWQgPSBwbGF0Zm9ybS5kaXN0KCkKKyAgICAgICAgICAgIGlmIGRpc3Q6CisgICAgICAgICAgICAgICAgY29tbWVudCA9ICdidWlsdCBmb3IgJXMgJXMnICUgKGRpc3QsIHZlcnNpb24pCisgICAgICAgIGVsaWYgY29tbWFuZCA9PSAnYmRpc3RfZHVtYic6CisgICAgICAgICAgICBjb21tZW50ID0gJ2J1aWx0IGZvciAlcycgJSBwbGF0Zm9ybS5wbGF0Zm9ybSh0ZXJzZT0xKQorICAgICAgICBkYXRhWydjb21tZW50J10gPSBjb21tZW50CisKKyAgICAgICAgaWYgc2VsZi5zaWduOgorICAgICAgICAgICAgZGF0YVsnZ3BnX3NpZ25hdHVyZSddID0gKG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpICsgIi5hc2MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oZmlsZW5hbWUrIi5hc2MiKS5yZWFkKCkpCisKKyAgICAgICAgIyBzZXQgdXAgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICAgIGF1dGggPSAiQmFzaWMgIiArIHN0YW5kYXJkX2I2NGVuY29kZShzZWxmLnVzZXJuYW1lICsgIjoiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFzc3dvcmQpCisKKyAgICAgICAgIyBCdWlsZCB1cCB0aGUgTUlNRSBwYXlsb2FkIGZvciB0aGUgUE9TVCBkYXRhCisgICAgICAgIGJvdW5kYXJ5ID0gJy0tLS0tLS0tLS0tLS0tR0hTS0ZKRExHRFM3NTQzRkpLTEZIUkU3NTY0Mjc1Njc0MzI1NCcKKyAgICAgICAgc2VwX2JvdW5kYXJ5ID0gJ1xuLS0nICsgYm91bmRhcnkKKyAgICAgICAgZW5kX2JvdW5kYXJ5ID0gc2VwX2JvdW5kYXJ5ICsgJy0tJworICAgICAgICBib2R5ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdCisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICAgICAgICAgICAgICBmbiA9ICc7ZmlsZW5hbWU9IiVzIicgJSB2YWx1ZVswXQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlWzFdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZm4gPSAiIgorCisgICAgICAgICAgICAgICAgYm9keS53cml0ZShzZXBfYm91bmRhcnkpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSgnXG5Db250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9IiVzIicla2V5KQorICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoZm4pCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSgiXG5cbiIpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBhbmQgdmFsdWVbLTFdID09ICdccic6CisgICAgICAgICAgICAgICAgICAgIGJvZHkud3JpdGUoJ1xuJykgICMgd3JpdGUgYW4gZXh0cmEgbmV3bGluZSAobHVydmUgTWFjcykKKyAgICAgICAgYm9keS53cml0ZShlbmRfYm91bmRhcnkpCisgICAgICAgIGJvZHkud3JpdGUoIlxuIikKKyAgICAgICAgYm9keSA9IGJvZHkuZ2V0dmFsdWUoKQorCisgICAgICAgIHNlbGYuYW5ub3VuY2UoIlN1Ym1pdHRpbmcgJXMgdG8gJXMiICUgKGZpbGVuYW1lLCBzZWxmLnJlcG9zaXRvcnkpLCBsb2cuSU5GTykKKworICAgICAgICAjIGJ1aWxkIHRoZSBSZXF1ZXN0CisgICAgICAgIGhlYWRlcnMgPSB7J0NvbnRlbnQtdHlwZSc6CisgICAgICAgICAgICAgICAgICAgICAgICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9JXMnICUgYm91bmRhcnksCisgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtbGVuZ3RoJzogc3RyKGxlbihib2R5KSksCisgICAgICAgICAgICAgICAgICAgJ0F1dGhvcml6YXRpb24nOiBhdXRofQorCisgICAgICAgIHJlcXVlc3QgPSBSZXF1ZXN0KHNlbGYucmVwb3NpdG9yeSwgZGF0YT1ib2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPWhlYWRlcnMpCisgICAgICAgICMgc2VuZCB0aGUgZGF0YQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSB1cmxvcGVuKHJlcXVlc3QpCisgICAgICAgICAgICBzdGF0dXMgPSByZXN1bHQuZ2V0Y29kZSgpCisgICAgICAgICAgICByZWFzb24gPSByZXN1bHQubXNnCisgICAgICAgICAgICBpZiBzZWxmLnNob3dfcmVzcG9uc2U6CisgICAgICAgICAgICAgICAgbXNnID0gJ1xuJy5qb2luKCgnLScgKiA3NSwgci5yZWFkKCksICctJyAqIDc1KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKG1zZywgbG9nLklORk8pCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKHN0cihlKSwgbG9nLkVSUk9SKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBIVFRQRXJyb3IsIGU6CisgICAgICAgICAgICBzdGF0dXMgPSBlLmNvZGUKKyAgICAgICAgICAgIHJlYXNvbiA9IGUubXNnCisKKyAgICAgICAgaWYgc3RhdHVzID09IDIwMDoKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1NlcnZlciByZXNwb25zZSAoJXMpOiAlcycgJSAoc3RhdHVzLCByZWFzb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuSU5GTykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ1VwbG9hZCBmYWlsZWQgKCVzKTogJXMnICUgKHN0YXR1cywgcmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLkVSUk9SKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjI4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjI4MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTYuMC5leGUgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3dpbmluc3QtNi4wLmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTdjODU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTYuMC5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTcuMS5leGUgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3dpbmluc3QtNy4xLmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDMzYmMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTcuMS5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTguMC5leGUgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3dpbmluc3QtOC4wLmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDAzYmZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTguMC5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTkuMC1hbWQ2NC5leGUgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3dpbmluc3QtOS4wLWFtZDY0LmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ4MDExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTkuMC1hbWQ2NC5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTkuMC5leGUgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb21tYW5kL3dpbmluc3QtOS4wLmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWRiMzFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29tbWFuZC93aW5pbnN0LTkuMC5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzI3MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb25maWcucHkKQEAgLTAsMCArMSwxMTYgQEAKKyIiImRpc3R1dGlscy5weXBpcmMKKworUHJvdmlkZXMgdGhlIFB5UElSQ0NvbW1hbmQgY2xhc3MsIHRoZSBiYXNlIGNsYXNzIGZvciB0aGUgY29tbWFuZCBjbGFzc2VzCit0aGF0IHVzZXMgLnB5cGlyYyBpbiB0aGUgZGlzdHV0aWxzLmNvbW1hbmQgcGFja2FnZS4KKyIiIgoraW1wb3J0IG9zCitmcm9tIENvbmZpZ1BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyCisKK2Zyb20gZGlzdHV0aWxzLmNtZCBpbXBvcnQgQ29tbWFuZAorCitERUZBVUxUX1BZUElSQyA9ICIiIlwKK1tkaXN0dXRpbHNdCitpbmRleC1zZXJ2ZXJzID0KKyAgICBweXBpCisKK1tweXBpXQordXNlcm5hbWU6JXMKK3Bhc3N3b3JkOiVzCisiIiIKKworY2xhc3MgUHlQSVJDQ29tbWFuZChDb21tYW5kKToKKyAgICAiIiJCYXNlIGNvbW1hbmQgdGhhdCBrbm93cyBob3cgdG8gaGFuZGxlIHRoZSAucHlwaXJjIGZpbGUKKyAgICAiIiIKKyAgICBERUZBVUxUX1JFUE9TSVRPUlkgPSAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpJworICAgIERFRkFVTFRfUkVBTE0gPSAncHlwaScKKyAgICByZXBvc2l0b3J5ID0gTm9uZQorICAgIHJlYWxtID0gTm9uZQorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ3JlcG9zaXRvcnk9JywgJ3InLAorICAgICAgICAgInVybCBvZiByZXBvc2l0b3J5IFtkZWZhdWx0OiAlc10iICUgXAorICAgICAgICAgICAgREVGQVVMVF9SRVBPU0lUT1JZKSwKKyAgICAgICAgKCdzaG93LXJlc3BvbnNlJywgTm9uZSwKKyAgICAgICAgICdkaXNwbGF5IGZ1bGwgcmVzcG9uc2UgdGV4dCBmcm9tIHNlcnZlcicpXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWydzaG93LXJlc3BvbnNlJ10KKworICAgIGRlZiBfZ2V0X3JjX2ZpbGUoc2VsZik6CisgICAgICAgICIiIlJldHVybnMgcmMgZmlsZSBwYXRoLiIiIgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKG9zLnBhdGguZXhwYW5kdXNlcignficpLCAnLnB5cGlyYycpCisKKyAgICBkZWYgX3N0b3JlX3B5cGlyYyhzZWxmLCB1c2VybmFtZSwgcGFzc3dvcmQpOgorICAgICAgICAiIiJDcmVhdGVzIGEgZGVmYXVsdCAucHlwaXJjIGZpbGUuIiIiCisgICAgICAgIHJjID0gc2VsZi5fZ2V0X3JjX2ZpbGUoKQorICAgICAgICBmID0gb3MuZmRvcGVuKG9zLm9wZW4ocmMsIG9zLk9fQ1JFQVQgfCBvcy5PX1dST05MWSwgMDYwMCksICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShERUZBVUxUX1BZUElSQyAlICh1c2VybmFtZSwgcGFzc3dvcmQpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgX3JlYWRfcHlwaXJjKHNlbGYpOgorICAgICAgICAiIiJSZWFkcyB0aGUgLnB5cGlyYyBmaWxlLiIiIgorICAgICAgICByYyA9IHNlbGYuX2dldF9yY19maWxlKCkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocmMpOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXNpbmcgUHlQSSBsb2dpbiBmcm9tICVzJyAlIHJjKQorICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHNlbGYucmVwb3NpdG9yeSBvciBzZWxmLkRFRkFVTFRfUkVQT1NJVE9SWQorICAgICAgICAgICAgY29uZmlnID0gQ29uZmlnUGFyc2VyKCkKKyAgICAgICAgICAgIGNvbmZpZy5yZWFkKHJjKQorICAgICAgICAgICAgc2VjdGlvbnMgPSBjb25maWcuc2VjdGlvbnMoKQorICAgICAgICAgICAgaWYgJ2Rpc3R1dGlscycgaW4gc2VjdGlvbnM6CisgICAgICAgICAgICAgICAgIyBsZXQncyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmVycworICAgICAgICAgICAgICAgIGluZGV4X3NlcnZlcnMgPSBjb25maWcuZ2V0KCdkaXN0dXRpbHMnLCAnaW5kZXgtc2VydmVycycpCisgICAgICAgICAgICAgICAgX3NlcnZlcnMgPSBbc2VydmVyLnN0cmlwKCkgZm9yIHNlcnZlciBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X3NlcnZlcnMuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZXJ2ZXIuc3RyaXAoKSAhPSAnJ10KKyAgICAgICAgICAgICAgICBpZiBfc2VydmVycyA9PSBbXToKKyAgICAgICAgICAgICAgICAgICAgIyBub3RoaW5nIHNldCwgbGV0J3MgdHJ5IHRvIGdldCB0aGUgZGVmYXVsdCBweXBpCisgICAgICAgICAgICAgICAgICAgIGlmICdweXBpJyBpbiBzZWN0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgICAgIF9zZXJ2ZXJzID0gWydweXBpJ10KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgaXMgbm90IHByb3Blcmx5IGRlZmluZWQsIHJldHVybmluZworICAgICAgICAgICAgICAgICAgICAgICAgIyBhbiBlbXB0eSBkaWN0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge30KKyAgICAgICAgICAgICAgICBmb3Igc2VydmVyIGluIF9zZXJ2ZXJzOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0geydzZXJ2ZXInOiBzZXJ2ZXJ9CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRbJ3VzZXJuYW1lJ10gPSBjb25maWcuZ2V0KHNlcnZlciwgJ3VzZXJuYW1lJykKKworICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHBhcmFtcworICAgICAgICAgICAgICAgICAgICBmb3Iga2V5LCBkZWZhdWx0IGluICgoJ3JlcG9zaXRvcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ERUZBVUxUX1JFUE9TSVRPUlkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3JlYWxtJywgc2VsZi5ERUZBVUxUX1JFQUxNKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdwYXNzd29yZCcsIE5vbmUpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvbmZpZy5oYXNfb3B0aW9uKHNlcnZlciwga2V5KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50W2tleV0gPSBjb25maWcuZ2V0KHNlcnZlciwga2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50W2tleV0gPSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50WydzZXJ2ZXInXSA9PSByZXBvc2l0b3J5IG9yCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50WydyZXBvc2l0b3J5J10gPT0gcmVwb3NpdG9yeSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudAorICAgICAgICAgICAgZWxpZiAnc2VydmVyLWxvZ2luJyBpbiBzZWN0aW9uczoKKyAgICAgICAgICAgICAgICAjIG9sZCBmb3JtYXQKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSAnc2VydmVyLWxvZ2luJworICAgICAgICAgICAgICAgIGlmIGNvbmZpZy5oYXNfb3B0aW9uKHNlcnZlciwgJ3JlcG9zaXRvcnknKToKKyAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IGNvbmZpZy5nZXQoc2VydmVyLCAncmVwb3NpdG9yeScpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVwb3NpdG9yeSA9IHNlbGYuREVGQVVMVF9SRVBPU0lUT1JZCisgICAgICAgICAgICAgICAgcmV0dXJuIHsndXNlcm5hbWUnOiBjb25maWcuZ2V0KHNlcnZlciwgJ3VzZXJuYW1lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAncGFzc3dvcmQnOiBjb25maWcuZ2V0KHNlcnZlciwgJ3Bhc3N3b3JkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAncmVwb3NpdG9yeSc6IHJlcG9zaXRvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAnc2VydmVyJzogc2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3JlYWxtJzogc2VsZi5ERUZBVUxUX1JFQUxNfQorCisgICAgICAgIHJldHVybiB7fQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBvcHRpb25zLiIiIgorICAgICAgICBzZWxmLnJlcG9zaXRvcnkgPSBOb25lCisgICAgICAgIHNlbGYucmVhbG0gPSBOb25lCisgICAgICAgIHNlbGYuc2hvd19yZXNwb25zZSA9IDAKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAiIiJGaW5hbGl6ZXMgb3B0aW9ucy4iIiIKKyAgICAgICAgaWYgc2VsZi5yZXBvc2l0b3J5IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlcG9zaXRvcnkgPSBzZWxmLkRFRkFVTFRfUkVQT1NJVE9SWQorICAgICAgICBpZiBzZWxmLnJlYWxtIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlYWxtID0gc2VsZi5ERUZBVUxUX1JFQUxNCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb25maWcucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JlZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb25maWcucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2JlZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29uZmlnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb3JlLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk1NTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY29yZS5weQpAQCAtMCwwICsxLDI0MiBAQAorIiIiZGlzdHV0aWxzLmNvcmUKKworVGhlIG9ubHkgbW9kdWxlIHRoYXQgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgdG8gdXNlIHRoZSBEaXN0dXRpbHM7IHByb3ZpZGVzCit0aGUgJ3NldHVwJyBmdW5jdGlvbiAod2hpY2ggaXMgdG8gYmUgY2FsbGVkIGZyb20gdGhlIHNldHVwIHNjcmlwdCkuICBBbHNvCitpbmRpcmVjdGx5IHByb3ZpZGVzIHRoZSBEaXN0cmlidXRpb24gYW5kIENvbW1hbmQgY2xhc3NlcywgYWx0aG91Z2ggdGhleSBhcmUKK3JlYWxseSBkZWZpbmVkIGluIGRpc3R1dGlscy5kaXN0IGFuZCBkaXN0dXRpbHMuY21kLgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKKworZnJvbSBkaXN0dXRpbHMuZGVidWcgaW1wb3J0IERFQlVHCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IChEaXN0dXRpbHNTZXR1cEVycm9yLCBEaXN0dXRpbHNBcmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3R1dGlsc0Vycm9yLCBDQ29tcGlsZXJFcnJvcikKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdyb2tfZW52aXJvbm1lbnRfZXJyb3IKKworIyBNYWlubHkgaW1wb3J0IHRoZXNlIHNvIHNldHVwIHNjcmlwdHMgY2FuICJmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCIgdGhlbS4KK2Zyb20gZGlzdHV0aWxzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbgorZnJvbSBkaXN0dXRpbHMuY21kIGltcG9ydCBDb21tYW5kCitmcm9tIGRpc3R1dGlscy5jb25maWcgaW1wb3J0IFB5UElSQ0NvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCisKKyMgVGhpcyBpcyBhIGJhcmVib25lcyBoZWxwIG1lc3NhZ2UgZ2VuZXJhdGVkIGRpc3BsYXllZCB3aGVuIHRoZSB1c2VyCisjIHJ1bnMgdGhlIHNldHVwIHNjcmlwdCB3aXRoIG5vIGFyZ3VtZW50cyBhdCBhbGwuICBNb3JlIHVzZWZ1bCBoZWxwCisjIGlzIGdlbmVyYXRlZCB3aXRoIHZhcmlvdXMgLS1oZWxwIG9wdGlvbnM6IGdsb2JhbCBoZWxwLCBsaXN0IGNvbW1hbmRzLAorIyBhbmQgcGVyLWNvbW1hbmQgaGVscC4KK1VTQUdFID0gIiIiXAordXNhZ2U6ICUoc2NyaXB0KXMgW2dsb2JhbF9vcHRzXSBjbWQxIFtjbWQxX29wdHNdIFtjbWQyIFtjbWQyX29wdHNdIC4uLl0KKyAgIG9yOiAlKHNjcmlwdClzIC0taGVscCBbY21kMSBjbWQyIC4uLl0KKyAgIG9yOiAlKHNjcmlwdClzIC0taGVscC1jb21tYW5kcworICAgb3I6ICUoc2NyaXB0KXMgY21kIC0taGVscAorIiIiCisKK2RlZiBnZW5fdXNhZ2Uoc2NyaXB0X25hbWUpOgorICAgIHNjcmlwdCA9IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X25hbWUpCisgICAgcmV0dXJuIFVTQUdFICUgeydzY3JpcHQnOiBzY3JpcHR9CisKKworIyBTb21lIG1pbGQgbWFnaWMgdG8gY29udHJvbCB0aGUgYmVoYXZpb3VyIG9mICdzZXR1cCgpJyBmcm9tICdydW5fc2V0dXAoKScuCitfc2V0dXBfc3RvcF9hZnRlciA9IE5vbmUKK19zZXR1cF9kaXN0cmlidXRpb24gPSBOb25lCisKKyMgTGVnYWwga2V5d29yZCBhcmd1bWVudHMgZm9yIHRoZSBzZXR1cCgpIGZ1bmN0aW9uCitzZXR1cF9rZXl3b3JkcyA9ICgnZGlzdGNsYXNzJywgJ3NjcmlwdF9uYW1lJywgJ3NjcmlwdF9hcmdzJywgJ29wdGlvbnMnLAorICAgICAgICAgICAgICAgICAgJ25hbWUnLCAndmVyc2lvbicsICdhdXRob3InLCAnYXV0aG9yX2VtYWlsJywKKyAgICAgICAgICAgICAgICAgICdtYWludGFpbmVyJywgJ21haW50YWluZXJfZW1haWwnLCAndXJsJywgJ2xpY2Vuc2UnLAorICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJywgJ2xvbmdfZGVzY3JpcHRpb24nLCAna2V5d29yZHMnLAorICAgICAgICAgICAgICAgICAgJ3BsYXRmb3JtcycsICdjbGFzc2lmaWVycycsICdkb3dubG9hZF91cmwnLAorICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVzJywgJ3Byb3ZpZGVzJywgJ29ic29sZXRlcycsCisgICAgICAgICAgICAgICAgICApCisKKyMgTGVnYWwga2V5d29yZCBhcmd1bWVudHMgZm9yIHRoZSBFeHRlbnNpb24gY29uc3RydWN0b3IKK2V4dGVuc2lvbl9rZXl3b3JkcyA9ICgnbmFtZScsICdzb3VyY2VzJywgJ2luY2x1ZGVfZGlycycsCisgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZV9tYWNyb3MnLCAndW5kZWZfbWFjcm9zJywKKyAgICAgICAgICAgICAgICAgICAgICAnbGlicmFyeV9kaXJzJywgJ2xpYnJhcmllcycsICdydW50aW1lX2xpYnJhcnlfZGlycycsCisgICAgICAgICAgICAgICAgICAgICAgJ2V4dHJhX29iamVjdHMnLCAnZXh0cmFfY29tcGlsZV9hcmdzJywgJ2V4dHJhX2xpbmtfYXJncycsCisgICAgICAgICAgICAgICAgICAgICAgJ3N3aWdfb3B0cycsICdleHBvcnRfc3ltYm9scycsICdkZXBlbmRzJywgJ2xhbmd1YWdlJykKKworZGVmIHNldHVwKCoqYXR0cnMpOgorICAgICIiIlRoZSBnYXRld2F5IHRvIHRoZSBEaXN0dXRpbHM6IGRvIGV2ZXJ5dGhpbmcgeW91ciBzZXR1cCBzY3JpcHQgbmVlZHMKKyAgICB0byBkbywgaW4gYSBoaWdobHkgZmxleGlibGUgYW5kIHVzZXItZHJpdmVuIHdheS4gIEJyaWVmbHk6IGNyZWF0ZSBhCisgICAgRGlzdHJpYnV0aW9uIGluc3RhbmNlOyBmaW5kIGFuZCBwYXJzZSBjb25maWcgZmlsZXM7IHBhcnNlIHRoZSBjb21tYW5kCisgICAgbGluZTsgcnVuIGVhY2ggRGlzdHV0aWxzIGNvbW1hbmQgZm91bmQgdGhlcmUsIGN1c3RvbWl6ZWQgYnkgdGhlIG9wdGlvbnMKKyAgICBzdXBwbGllZCB0byAnc2V0dXAoKScgKGFzIGtleXdvcmQgYXJndW1lbnRzKSwgaW4gY29uZmlnIGZpbGVzLCBhbmQgb24KKyAgICB0aGUgY29tbWFuZCBsaW5lLgorCisgICAgVGhlIERpc3RyaWJ1dGlvbiBpbnN0YW5jZSBtaWdodCBiZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHN1cHBsaWVkIHZpYQorICAgIHRoZSAnZGlzdGNsYXNzJyBrZXl3b3JkIGFyZ3VtZW50IHRvICdzZXR1cCc7IGlmIG5vIHN1Y2ggY2xhc3MgaXMKKyAgICBzdXBwbGllZCwgdGhlbiB0aGUgRGlzdHJpYnV0aW9uIGNsYXNzIChpbiBkaXN0LnB5KSBpcyBpbnN0YW50aWF0ZWQuCisgICAgQWxsIG90aGVyIGFyZ3VtZW50cyB0byAnc2V0dXAnIChleGNlcHQgZm9yICdjbWRjbGFzcycpIGFyZSB1c2VkIHRvIHNldAorICAgIGF0dHJpYnV0ZXMgb2YgdGhlIERpc3RyaWJ1dGlvbiBpbnN0YW5jZS4KKworICAgIFRoZSAnY21kY2xhc3MnIGFyZ3VtZW50LCBpZiBzdXBwbGllZCwgaXMgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgY29tbWFuZAorICAgIG5hbWVzIHRvIGNvbW1hbmQgY2xhc3Nlcy4gIEVhY2ggY29tbWFuZCBlbmNvdW50ZXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lCisgICAgd2lsbCBiZSB0dXJuZWQgaW50byBhIGNvbW1hbmQgY2xhc3MsIHdoaWNoIGlzIGluIHR1cm4gaW5zdGFudGlhdGVkOyBhbnkKKyAgICBjbGFzcyBmb3VuZCBpbiAnY21kY2xhc3MnIGlzIHVzZWQgaW4gcGxhY2Ugb2YgdGhlIGRlZmF1bHQsIHdoaWNoIGlzCisgICAgKGZvciBjb21tYW5kICdmb29fYmFyJykgY2xhc3MgJ2Zvb19iYXInIGluIG1vZHVsZQorICAgICdkaXN0dXRpbHMuY29tbWFuZC5mb29fYmFyJy4gIFRoZSBjb21tYW5kIGNsYXNzIG11c3QgcHJvdmlkZSBhCisgICAgJ3VzZXJfb3B0aW9ucycgYXR0cmlidXRlIHdoaWNoIGlzIGEgbGlzdCBvZiBvcHRpb24gc3BlY2lmaWVycyBmb3IKKyAgICAnZGlzdHV0aWxzLmZhbmN5X2dldG9wdCcuICBBbnkgY29tbWFuZC1saW5lIG9wdGlvbnMgYmV0d2VlbiB0aGUgY3VycmVudAorICAgIGFuZCB0aGUgbmV4dCBjb21tYW5kIGFyZSB1c2VkIHRvIHNldCBhdHRyaWJ1dGVzIG9mIHRoZSBjdXJyZW50IGNvbW1hbmQKKyAgICBvYmplY3QuCisKKyAgICBXaGVuIHRoZSBlbnRpcmUgY29tbWFuZC1saW5lIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwYXJzZWQsIGNhbGxzIHRoZQorICAgICdydW4oKScgbWV0aG9kIG9uIGVhY2ggY29tbWFuZCBvYmplY3QgaW4gdHVybi4gIFRoaXMgbWV0aG9kIHdpbGwgYmUKKyAgICBkcml2ZW4gZW50aXJlbHkgYnkgdGhlIERpc3RyaWJ1dGlvbiBvYmplY3QgKHdoaWNoIGVhY2ggY29tbWFuZCBvYmplY3QKKyAgICBoYXMgYSByZWZlcmVuY2UgdG8sIHRoYW5rcyB0byBpdHMgY29uc3RydWN0b3IpLCBhbmQgdGhlCisgICAgY29tbWFuZC1zcGVjaWZpYyBvcHRpb25zIHRoYXQgYmVjYW1lIGF0dHJpYnV0ZXMgb2YgZWFjaCBjb21tYW5kCisgICAgb2JqZWN0LgorICAgICIiIgorCisgICAgZ2xvYmFsIF9zZXR1cF9zdG9wX2FmdGVyLCBfc2V0dXBfZGlzdHJpYnV0aW9uCisKKyAgICAjIERldGVybWluZSB0aGUgZGlzdHJpYnV0aW9uIGNsYXNzIC0tIGVpdGhlciBjYWxsZXItc3VwcGxpZWQgb3IKKyAgICAjIG91ciBEaXN0cmlidXRpb24gKHNlZSBiZWxvdykuCisgICAga2xhc3MgPSBhdHRycy5nZXQoJ2Rpc3RjbGFzcycpCisgICAgaWYga2xhc3M6CisgICAgICAgIGRlbCBhdHRyc1snZGlzdGNsYXNzJ10KKyAgICBlbHNlOgorICAgICAgICBrbGFzcyA9IERpc3RyaWJ1dGlvbgorCisgICAgaWYgJ3NjcmlwdF9uYW1lJyBub3QgaW4gYXR0cnM6CisgICAgICAgIGF0dHJzWydzY3JpcHRfbmFtZSddID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICBpZiAnc2NyaXB0X2FyZ3MnIG5vdCBpbiBhdHRyczoKKyAgICAgICAgYXR0cnNbJ3NjcmlwdF9hcmdzJ10gPSBzeXMuYXJndlsxOl0KKworICAgICMgQ3JlYXRlIHRoZSBEaXN0cmlidXRpb24gaW5zdGFuY2UsIHVzaW5nIHRoZSByZW1haW5pbmcgYXJndW1lbnRzCisgICAgIyAoaWUuIGV2ZXJ5dGhpbmcgZXhjZXB0IGRpc3RjbGFzcykgdG8gaW5pdGlhbGl6ZSBpdAorICAgIHRyeToKKyAgICAgICAgX3NldHVwX2Rpc3RyaWJ1dGlvbiA9IGRpc3QgPSBrbGFzcyhhdHRycykKKyAgICBleGNlcHQgRGlzdHV0aWxzU2V0dXBFcnJvciwgbXNnOgorICAgICAgICBpZiAnbmFtZScgaW4gYXR0cnM6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCAiZXJyb3IgaW4gJXMgc2V0dXAgY29tbWFuZDogJXMiICUgXAorICAgICAgICAgICAgICAgICAgKGF0dHJzWyduYW1lJ10sIG1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQsICJlcnJvciBpbiBzZXR1cCBjb21tYW5kOiAlcyIgJSBtc2cKKworICAgIGlmIF9zZXR1cF9zdG9wX2FmdGVyID09ICJpbml0IjoKKyAgICAgICAgcmV0dXJuIGRpc3QKKworICAgICMgRmluZCBhbmQgcGFyc2UgdGhlIGNvbmZpZyBmaWxlKHMpOiB0aGV5IHdpbGwgb3ZlcnJpZGUgb3B0aW9ucyBmcm9tCisgICAgIyB0aGUgc2V0dXAgc2NyaXB0LCBidXQgYmUgb3ZlcnJpZGRlbiBieSB0aGUgY29tbWFuZCBsaW5lLgorICAgIGRpc3QucGFyc2VfY29uZmlnX2ZpbGVzKCkKKworICAgIGlmIERFQlVHOgorICAgICAgICBwcmludCAib3B0aW9ucyAoYWZ0ZXIgcGFyc2luZyBjb25maWcgZmlsZXMpOiIKKyAgICAgICAgZGlzdC5kdW1wX29wdGlvbl9kaWN0cygpCisKKyAgICBpZiBfc2V0dXBfc3RvcF9hZnRlciA9PSAiY29uZmlnIjoKKyAgICAgICAgcmV0dXJuIGRpc3QKKworICAgICMgUGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhbmQgb3ZlcnJpZGUgY29uZmlnIGZpbGVzOyBhbnkKKyAgICAjIGNvbW1hbmQtbGluZSBlcnJvcnMgYXJlIHRoZSBlbmQgdXNlcidzIGZhdWx0LCBzbyB0dXJuIHRoZW0gaW50bworICAgICMgU3lzdGVtRXhpdCB0byBzdXBwcmVzcyB0cmFjZWJhY2tzLgorICAgIHRyeToKKyAgICAgICAgb2sgPSBkaXN0LnBhcnNlX2NvbW1hbmRfbGluZSgpCisgICAgZXhjZXB0IERpc3R1dGlsc0FyZ0Vycm9yLCBtc2c6CisgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQsIGdlbl91c2FnZShkaXN0LnNjcmlwdF9uYW1lKSArICJcbmVycm9yOiAlcyIgJSBtc2cKKworICAgIGlmIERFQlVHOgorICAgICAgICBwcmludCAib3B0aW9ucyAoYWZ0ZXIgcGFyc2luZyBjb21tYW5kIGxpbmUpOiIKKyAgICAgICAgZGlzdC5kdW1wX29wdGlvbl9kaWN0cygpCisKKyAgICBpZiBfc2V0dXBfc3RvcF9hZnRlciA9PSAiY29tbWFuZGxpbmUiOgorICAgICAgICByZXR1cm4gZGlzdAorCisgICAgIyBBbmQgZmluYWxseSwgcnVuIGFsbCB0aGUgY29tbWFuZHMgZm91bmQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICBpZiBvazoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGlzdC5ydW5fY29tbWFuZHMoKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCAiaW50ZXJydXB0ZWQiCisgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgb3MuZXJyb3IpLCBleGM6CisgICAgICAgICAgICBlcnJvciA9IGdyb2tfZW52aXJvbm1lbnRfZXJyb3IoZXhjKQorCisgICAgICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGVycm9yICsgIlxuIikKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCBlcnJvcgorCisgICAgICAgIGV4Y2VwdCAoRGlzdHV0aWxzRXJyb3IsCisgICAgICAgICAgICAgICAgQ0NvbXBpbGVyRXJyb3IpLCBtc2c6CisgICAgICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0LCAiZXJyb3I6ICIgKyBzdHIobXNnKQorCisgICAgcmV0dXJuIGRpc3QKKworCitkZWYgcnVuX3NldHVwKHNjcmlwdF9uYW1lLCBzY3JpcHRfYXJncz1Ob25lLCBzdG9wX2FmdGVyPSJydW4iKToKKyAgICAiIiJSdW4gYSBzZXR1cCBzY3JpcHQgaW4gYSBzb21ld2hhdCBjb250cm9sbGVkIGVudmlyb25tZW50LCBhbmQKKyAgICByZXR1cm4gdGhlIERpc3RyaWJ1dGlvbiBpbnN0YW5jZSB0aGF0IGRyaXZlcyB0aGluZ3MuICBUaGlzIGlzIHVzZWZ1bAorICAgIGlmIHlvdSBuZWVkIHRvIGZpbmQgb3V0IHRoZSBkaXN0cmlidXRpb24gbWV0YS1kYXRhIChwYXNzZWQgYXMKKyAgICBrZXl3b3JkIGFyZ3MgZnJvbSAnc2NyaXB0JyB0byAnc2V0dXAoKScsIG9yIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICBjb25maWcgZmlsZXMgb3IgY29tbWFuZC1saW5lLgorCisgICAgJ3NjcmlwdF9uYW1lJyBpcyBhIGZpbGUgdGhhdCB3aWxsIGJlIHJ1biB3aXRoICdleGVjZmlsZSgpJzsKKyAgICAnc3lzLmFyZ3ZbMF0nIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCAnc2NyaXB0JyBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZQorICAgIGNhbGwuICAnc2NyaXB0X2FyZ3MnIGlzIGEgbGlzdCBvZiBzdHJpbmdzOyBpZiBzdXBwbGllZCwKKyAgICAnc3lzLmFyZ3ZbMTpdJyB3aWxsIGJlIHJlcGxhY2VkIGJ5ICdzY3JpcHRfYXJncycgZm9yIHRoZSBkdXJhdGlvbiBvZgorICAgIHRoZSBjYWxsLgorCisgICAgJ3N0b3BfYWZ0ZXInIHRlbGxzICdzZXR1cCgpJyB3aGVuIHRvIHN0b3AgcHJvY2Vzc2luZzsgcG9zc2libGUKKyAgICB2YWx1ZXM6CisgICAgICBpbml0CisgICAgICAgIHN0b3AgYWZ0ZXIgdGhlIERpc3RyaWJ1dGlvbiBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIGFuZAorICAgICAgICBwb3B1bGF0ZWQgd2l0aCB0aGUga2V5d29yZCBhcmd1bWVudHMgdG8gJ3NldHVwKCknCisgICAgICBjb25maWcKKyAgICAgICAgc3RvcCBhZnRlciBjb25maWcgZmlsZXMgaGF2ZSBiZWVuIHBhcnNlZCAoYW5kIHRoZWlyIGRhdGEKKyAgICAgICAgc3RvcmVkIGluIHRoZSBEaXN0cmlidXRpb24gaW5zdGFuY2UpCisgICAgICBjb21tYW5kbGluZQorICAgICAgICBzdG9wIGFmdGVyIHRoZSBjb21tYW5kLWxpbmUgKCdzeXMuYXJndlsxOl0nIG9yICdzY3JpcHRfYXJncycpCisgICAgICAgIGhhdmUgYmVlbiBwYXJzZWQgKGFuZCB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIERpc3RyaWJ1dGlvbikKKyAgICAgIHJ1biBbZGVmYXVsdF0KKyAgICAgICAgc3RvcCBhZnRlciBhbGwgY29tbWFuZHMgaGF2ZSBiZWVuIHJ1biAodGhlIHNhbWUgYXMgaWYgJ3NldHVwKCknCisgICAgICAgIGhhZCBiZWVuIGNhbGxlZCBpbiB0aGUgdXN1YWwgd2F5CisKKyAgICBSZXR1cm5zIHRoZSBEaXN0cmlidXRpb24gaW5zdGFuY2UsIHdoaWNoIHByb3ZpZGVzIGFsbCBpbmZvcm1hdGlvbgorICAgIHVzZWQgdG8gZHJpdmUgdGhlIERpc3R1dGlscy4KKyAgICAiIiIKKyAgICBpZiBzdG9wX2FmdGVyIG5vdCBpbiAoJ2luaXQnLCAnY29uZmlnJywgJ2NvbW1hbmRsaW5lJywgJ3J1bicpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW52YWxpZCB2YWx1ZSBmb3IgJ3N0b3BfYWZ0ZXInOiAlciIgJSAoc3RvcF9hZnRlciwpCisKKyAgICBnbG9iYWwgX3NldHVwX3N0b3BfYWZ0ZXIsIF9zZXR1cF9kaXN0cmlidXRpb24KKyAgICBfc2V0dXBfc3RvcF9hZnRlciA9IHN0b3BfYWZ0ZXIKKworICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2CisgICAgZyA9IHsnX19maWxlX18nOiBzY3JpcHRfbmFtZX0KKyAgICBsID0ge30KKyAgICB0cnk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gc2NyaXB0X25hbWUKKyAgICAgICAgICAgIGlmIHNjcmlwdF9hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN5cy5hcmd2WzE6XSA9IHNjcmlwdF9hcmdzCisgICAgICAgICAgICBmID0gb3BlbihzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleGVjIGYucmVhZCgpIGluIGcsIGwKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuYXJndiA9IHNhdmVfYXJndgorICAgICAgICAgICAgX3NldHVwX3N0b3BfYWZ0ZXIgPSBOb25lCisgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICMgSG1tLCBzaG91bGQgd2UgZG8gc29tZXRoaW5nIGlmIGV4aXRpbmcgd2l0aCBhIG5vbi16ZXJvIGNvZGUKKyAgICAgICAgIyAoaWUuIGVycm9yKT8KKyAgICAgICAgcGFzcworICAgIGV4Y2VwdDoKKyAgICAgICAgcmFpc2UKKworICAgIGlmIF9zZXR1cF9kaXN0cmlidXRpb24gaXMgTm9uZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAgICgiJ2Rpc3R1dGlscy5jb3JlLnNldHVwKCknIHdhcyBuZXZlciBjYWxsZWQgLS0gIgorICAgICAgICAgICAgICAgInBlcmhhcHMgJyVzJyBpcyBub3QgYSBEaXN0dXRpbHMgc2V0dXAgc2NyaXB0PyIpICUgXAorICAgICAgICAgICAgICBzY3JpcHRfbmFtZQorCisgICAgIyBJIHdvbmRlciBpZiB0aGUgc2V0dXAgc2NyaXB0J3MgbmFtZXNwYWNlIC0tIGcgYW5kIGwgLS0gd291bGQgYmUgb2YKKyAgICAjIGFueSBpbnRlcmVzdCB0byBjYWxsZXJzPworICAgIHJldHVybiBfc2V0dXBfZGlzdHJpYnV0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb3JlLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGVhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb3JlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb3JlLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2NvcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGVhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jb3JlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkN2Y0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2N5Z3dpbmNjb21waWxlci5weQpAQCAtMCwwICsxLDQ4NCBAQAorIiIiZGlzdHV0aWxzLmN5Z3dpbmNjb21waWxlcgorCitQcm92aWRlcyB0aGUgQ3lnd2luQ0NvbXBpbGVyIGNsYXNzLCBhIHN1YmNsYXNzIG9mIFVuaXhDQ29tcGlsZXIgdGhhdAoraGFuZGxlcyB0aGUgQ3lnd2luIHBvcnQgb2YgdGhlIEdOVSBDIGNvbXBpbGVyIHRvIFdpbmRvd3MuICBJdCBhbHNvIGNvbnRhaW5zCit0aGUgTWluZ3czMkNDb21waWxlciBjbGFzcyB3aGljaCBoYW5kbGVzIHRoZSBtaW5ndzMyIHBvcnQgb2YgR0NDIChzYW1lIGFzCitjeWd3aW4gaW4gbm8tY3lnd2luIG1vZGUpLgorIiIiCisKKyMgcHJvYmxlbXM6CisjCisjICogaWYgeW91IHVzZSBhIG1zdmMgY29tcGlsZWQgcHl0aG9uIHZlcnNpb24gKDEuNS4yKQorIyAgIDEuIHlvdSBoYXZlIHRvIGluc2VydCBhIF9fR05VQ19fIHNlY3Rpb24gaW4gaXRzIGNvbmZpZy5oCisjICAgMi4geW91IGhhdmUgdG8gZ2VuZXJhdGUgYSBpbXBvcnQgbGlicmFyeSBmb3IgaXRzIGRsbAorIyAgICAgIC0gY3JlYXRlIGEgZGVmLWZpbGUgZm9yIHB5dGhvbj8/LmRsbAorIyAgICAgIC0gY3JlYXRlIGEgaW1wb3J0IGxpYnJhcnkgdXNpbmcKKyMgICAgICAgICAgICAgZGxsdG9vbCAtLWRsbG5hbWUgcHl0aG9uMTUuZGxsIC0tZGVmIHB5dGhvbjE1LmRlZiBcCisjICAgICAgICAgICAgICAgICAgICAgICAtLW91dHB1dC1saWIgbGlicHl0aG9uMTUuYQorIworIyAgIHNlZSBhbHNvIGh0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L2NyZXcva2VybnIvbWluZ3czMi9Ob3Rlcy5odG1sCisjCisjICogV2UgcHV0IGV4cG9ydF9zeW1ib2xzIGluIGEgZGVmLWZpbGUsIGFuZCBkb24ndCB1c2UKKyMgICAtLWV4cG9ydC1hbGwtc3ltYm9scyBiZWNhdXNlIGl0IGRvZXNuJ3Qgd29ya2VkIHJlbGlhYmxlIGluIHNvbWUKKyMgICB0ZXN0ZWQgY29uZmlndXJhdGlvbnMuIEFuZCBiZWNhdXNlIG90aGVyIHdpbmRvd3MgY29tcGlsZXJzIGFsc28KKyMgICBuZWVkIHRoZWlyIHN5bWJvbHMgc3BlY2lmaWVkIHRoaXMgbm8gc2VyaW91cyBwcm9ibGVtLgorIworIyB0ZXN0ZWQgY29uZmlndXJhdGlvbnM6CisjCisjICogY3lnd2luIGdjYyAyLjkxLjU3L2xkIDIuOS40L2RsbHdyYXAgMC4yLjQgd29ya3MKKyMgICAoYWZ0ZXIgcGF0Y2hpbmcgcHl0aG9uJ3MgY29uZmlnLmggYW5kIGZvciBDKysgc29tZSBvdGhlciBpbmNsdWRlIGZpbGVzKQorIyAgIHNlZSBhbHNvIGh0dHA6Ly9zdGFyc2hpcC5weXRob24ubmV0L2NyZXcva2VybnIvbWluZ3czMi9Ob3Rlcy5odG1sCisjICogbWluZ3czMiBnY2MgMi45NS4yL2xkIDIuOS40L2RsbHdyYXAgMC4yLjQgd29ya3MKKyMgICAobGQgZG9lc24ndCBzdXBwb3J0IC1zaGFyZWQsIHNvIHdlIHVzZSBkbGx3cmFwKQorIyAqIGN5Z3dpbiBnY2MgMi45NS4yL2xkIDIuMTAuOTAvZGxsd3JhcCAyLjEwLjkwIHdvcmtzIG5vdworIyAgIC0gaXRzIGRsbHdyYXAgZG9lc24ndCB3b3JrLCB0aGVyZSBpcyBhIGJ1ZyBpbiBiaW51dGlscyAyLjEwLjkwCisjICAgICBzZWUgYWxzbyBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL21sL2N5Z3dpbi8yMDAwLTA2L21zZzAxMjc0Lmh0bWwKKyMgICAtIHVzaW5nIGdjYyAtbWRsbCBpbnN0ZWFkIGRsbHdyYXAgZG9lc24ndCB3b3JrIHdpdGhvdXQgLXN0YXRpYyBiZWNhdXNlCisjICAgICBpdCB0cmllcyB0byBsaW5rIGFnYWluc3QgZGxscyBpbnN0ZWFkIHRoZWlyIGltcG9ydCBsaWJyYXJpZXMuIChJZgorIyAgICAgaXQgZmluZHMgdGhlIGRsbCBmaXJzdC4pCisjICAgICBCeSBzcGVjaWZ5aW5nIC1zdGF0aWMgd2UgZm9yY2UgbGQgdG8gbGluayBhZ2FpbnN0IHRoZSBpbXBvcnQgbGlicmFyaWVzLAorIyAgICAgdGhpcyBpcyB3aW5kb3dzIHN0YW5kYXJkIGFuZCB0aGVyZSBhcmUgbm9ybWFsbHkgbm90IHRoZSBuZWNlc3Nhcnkgc3ltYm9scworIyAgICAgaW4gdGhlIGRsbHMuCisjICAgKioqIG9ubHkgdGhlIHZlcnNpb24gb2YgSnVuZSAyMDAwIHNob3dzIHRoZXNlIHByb2JsZW1zCisjICogY3lnd2luIGdjYyAzLjIvbGQgMi4xMy45MCB3b3JrcworIyAgIChsZCBzdXBwb3J0cyAtc2hhcmVkKQorIyAqIG1pbmd3IGdjYyAzLjIvbGQgMi4xMyB3b3JrcworIyAgIChsZCBzdXBwb3J0cyAtc2hhcmVkKQorCisjIFRoaXMgbW9kdWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4xLgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zLHN5cyxjb3B5Citmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IGdlbl9wcmVwcm9jZXNzX29wdGlvbnMsIGdlbl9saWJfb3B0aW9ucworZnJvbSBkaXN0dXRpbHMudW5peGNjb21waWxlciBpbXBvcnQgVW5peENDb21waWxlcgorZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCB3cml0ZV9maWxlCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvciwgQ29tcGlsZUVycm9yLCBVbmtub3duRmlsZUVycm9yCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKK2RlZiBnZXRfbXN2Y3IoKToKKyAgICAiIiJJbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBNU1ZDIHJ1bnRpbWUgbGlicmFyeSBpZiBQeXRob24gd2FzIGJ1aWx0CisgICAgd2l0aCBNU1ZDIDcuMCBvciBsYXRlci4KKyAgICAiIiIKKyAgICAjIEZJWE1FOiBuZXh0IGNvZGUgaXMgZnJvbSBpc3N1ZTg3MDM4MgorICAgICMgTVMgQy1ydW50aW1lIGxpYnJhcmllcyBuZXZlciBzdXBwb3J0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgIyBMaW5raW5nIHRvIGEgZGlmZmVyZW50IGxpYnJhcnkgd2l0aG91dCB0byBzcGVjaWZ5IGNvcnJlY3QgcnVudGltZQorICAgICMgdmVyc2lvbiBmb3IgdGhlIGhlYWRlcnMgd2lsbCBsaW5rIHJlbmFtZWQgZnVuY3Rpb25zIHRvIG1zdmNydC4KKyAgICAjIFNlZSBpc3N1ZTMzMDg6IHRoaXMgcGllY2Ugb2YgY29kZSBpcyBweXRob24gcHJvYmxlbSBldmVuCisgICAgIyB3aXRoIGNvcnJlY3QgdzMyYXBpIGhlYWRlcnMuCisgICAgIyBJc3N1ZTogZm9yIE1TVkMgY29tcGlsZXIgd2UgY2FuIGdldCB0aGUgdmVyc2lvbiBhbmQgZnJvbSB2ZXJzaW9uCisgICAgIyB0byBkZXRlcm1pbmUgbWN2Y3J0IGFzIGNvZGUgYmVsb3cuIEJ1dCB3aGF0IGFib3V0IGlmIHB5dGhvbiBpcworICAgICMgYnVpbGQgd2l0aCBHQ0MgY29tcGlsZXI/CisgICAgIyBPdXRwdXQgb2Ygc3lzLnZlcnNpb24gaXMgaW5mb3JtYXRpb24gZm9yIHB5dGhvbiBidWlsZCBvbiBmaXJzdAorICAgICMgbGluZSwgb24gdGhlIG5leHQgbGluZSBpcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXBpbGVyIGFuZCB0aGUKKyAgICAjIG91dHB1dCBsYWNrIGluZm9ybWF0aW9uIGZvciB0aGUgQy1ydW50aW1lLgorICAgIG1zY19wb3MgPSBzeXMudmVyc2lvbi5maW5kKCdNU0Mgdi4nKQorICAgIGlmIG1zY19wb3MgIT0gLTE6CisgICAgICAgIG1zY192ZXIgPSBzeXMudmVyc2lvblttc2NfcG9zKzY6bXNjX3BvcysxMF0KKyAgICAgICAgaWYgbXNjX3ZlciA9PSAnMTMwMCc6CisgICAgICAgICAgICAjIE1TVkMgNy4wCisgICAgICAgICAgICByZXR1cm4gWydtc3ZjcjcwJ10KKyAgICAgICAgZWxpZiBtc2NfdmVyID09ICcxMzEwJzoKKyAgICAgICAgICAgICMgTVNWQyA3LjEKKyAgICAgICAgICAgIHJldHVybiBbJ21zdmNyNzEnXQorICAgICAgICBlbGlmIG1zY192ZXIgPT0gJzE0MDAnOgorICAgICAgICAgICAgIyBWUzIwMDUgLyBNU1ZDIDguMAorICAgICAgICAgICAgcmV0dXJuIFsnbXN2Y3I4MCddCisgICAgICAgIGVsaWYgbXNjX3ZlciA9PSAnMTUwMCc6CisgICAgICAgICAgICAjIFZTMjAwOCAvIE1TVkMgOS4wCisgICAgICAgICAgICByZXR1cm4gWydtc3ZjcjkwJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVua25vd24gTVMgQ29tcGlsZXIgdmVyc2lvbiAlcyAiICUgbXNjX3ZlcikKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gW10KKworCitjbGFzcyBDeWd3aW5DQ29tcGlsZXIgKFVuaXhDQ29tcGlsZXIpOgorCisgICAgY29tcGlsZXJfdHlwZSA9ICdjeWd3aW4nCisgICAgb2JqX2V4dGVuc2lvbiA9ICIubyIKKyAgICBzdGF0aWNfbGliX2V4dGVuc2lvbiA9ICIuYSIKKyAgICBzaGFyZWRfbGliX2V4dGVuc2lvbiA9ICIuZGxsIgorICAgICMgRklYTUU6IGR5bGliXy4uLiA9ICIuZGxsLmEiIGlzIG5vdCBlbm91Z2h0IGZvciBiaW51dGlscworICAgICMgbG9hZGVyIG9uIHdpbjMyIHBsYXRmb3JtICEhIQorICAgIGR5bGliX2xpYl9leHRlbnNpb24gPSAiLmRsbC5hIgorICAgIHN0YXRpY19saWJfZm9ybWF0ID0gImxpYiVzJXMiCisgICAgc2hhcmVkX2xpYl9mb3JtYXQgPSAiJXMlcyIKKyAgICBleGVfZXh0ZW5zaW9uID0gIi5leGUiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLCBmb3JjZT0wKToKKworICAgICAgICBVbml4Q0NvbXBpbGVyLl9faW5pdF9fIChzZWxmLCB2ZXJib3NlLCBkcnlfcnVuLCBmb3JjZSkKKworICAgICAgICAoc3RhdHVzLCBkZXRhaWxzKSA9IGNoZWNrX2NvbmZpZ19oKCkKKyAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiUHl0aG9uJ3MgR0NDIHN0YXR1czogJXMgKGRldGFpbHM6ICVzKSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0dXMsIGRldGFpbHMpKQorICAgICAgICBpZiBzdGF0dXMgaXMgbm90IENPTkZJR19IX09LOgorICAgICAgICAgICAgc2VsZi53YXJuKAorICAgICAgICAgICAgICAgICJQeXRob24ncyBweWNvbmZpZy5oIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHlvdXIgY29tcGlsZXIuICIKKyAgICAgICAgICAgICAgICAiUmVhc29uOiAlcy4gIgorICAgICAgICAgICAgICAgICJDb21waWxpbmcgbWF5IGZhaWwgYmVjYXVzZSBvZiB1bmRlZmluZWQgcHJlcHJvY2Vzc29yIG1hY3Jvcy4iCisgICAgICAgICAgICAgICAgJSBkZXRhaWxzKQorCisgICAgICAgICMgTmV4dCBsaW5lIG9mIGNvZGUgaXMgcHJvYmxlbSBmb3IgY3Jvc3MtY29tcGlsZWQgZW52aXJvbWVudDoKKyAgICAgICAgIyBOT1RFOiBHQ0MgY3Jvc3MtY29tcGlsZXIgaXMgcHJlZml4ZWQgYnkgdGhlIDxob3N0YXJjaD4tPGhvc3Rvcz4tCisgICAgICAgICMgYW5kIGJ5IGRlZmF1bHQgYmluYXJpZXMgYXJlIGluc3RhbGxlZCBpbiBzYW1lIGRpcmVjdG9yeQorICAgICAgICAjIGFzIG5hdGl2ZSBjb21waWxlci4KKyAgICAgICAgc2VsZi5nY2NfdmVyc2lvbiwgc2VsZi5sZF92ZXJzaW9uLCBzZWxmLmRsbHdyYXBfdmVyc2lvbiA9IFwKKyAgICAgICAgICAgIGdldF92ZXJzaW9ucygpCisgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoc2VsZi5jb21waWxlcl90eXBlICsgIjogZ2NjICVzLCBsZCAlcywgZGxsd3JhcCAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZ2NjX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGRfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kbGx3cmFwX3ZlcnNpb24pICkKKworICAgICAgICAjIGxkX3ZlcnNpb24gPj0gIjIuMTAuOTAiIGFuZCA8ICIyLjEzIiBzaG91bGQgYWxzbyBiZSBhYmxlIHRvIHVzZQorICAgICAgICAjIGdjYyAtbWRsbCBpbnN0ZWFkIG9mIGRsbHdyYXAKKyAgICAgICAgIyBPbGRlciBkbGx3cmFwcyBoYWQgb3duIHZlcnNpb24gbnVtYmVycywgbmV3ZXIgb25lcyB1c2UgdGhlCisgICAgICAgICMgc2FtZSBhcyB0aGUgcmVzdCBvZiBiaW51dGlscyAoIGFsc28gbGQgKQorICAgICAgICAjIGRsbHdyYXAgMi4xMC45MCBpcyBidWdneQorICAgICAgICBpZiBzZWxmLmxkX3ZlcnNpb24gPj0gIjIuMTAuOTAiOgorICAgICAgICAgICAgc2VsZi5saW5rZXJfZGxsID0gImdjYyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGlua2VyX2RsbCA9ICJkbGx3cmFwIgorCisgICAgICAgICMgbGRfdmVyc2lvbiA+PSAiMi4xMyIgc3VwcG9ydCAtc2hhcmVkIHNvIHVzZSBpdCBpbnN0ZWFkIG9mCisgICAgICAgICMgLW1kbGwgLXN0YXRpYworICAgICAgICBpZiBzZWxmLmxkX3ZlcnNpb24gPj0gIjIuMTMiOgorICAgICAgICAgICAgc2hhcmVkX29wdGlvbiA9ICItc2hhcmVkIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2hhcmVkX29wdGlvbiA9ICItbWRsbCAtc3RhdGljIgorCisgICAgICAgICMgRklYTUU6CisgICAgICAgICMgSGFyZC1jb2RlIG1heSBvdmVycmlkZSB1bml4LWNvbXBpbGVyIHNldHRpbmdzIGFuZCBpc24ndAorICAgICAgICAjIHBvc3NpYmxlIHRvIHVzZSBNYWtlZmlsZSB2YXJpYWJsZXMgdG8gcGFzcyBjb3JyZWN0IGZsYWdzICEKKyAgICAgICAgIyBIYXJkLWNvZGUgR0NDIGJlY2F1c2UgdGhhdCdzIHdoYXQgdGhpcyBpcyBhbGwgYWJvdXQuCisgICAgICAgICMgWFhYIG9wdGltaXphdGlvbiwgd2FybmluZ3MgZXRjLiBzaG91bGQgYmUgY3VzdG9taXphYmxlLgorICAgICAgICBzZWxmLnNldF9leGVjdXRhYmxlcyhjb21waWxlcj0nZ2NjIC1tY3lnd2luIC1PIC1XYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJfc289J2djYyAtbWN5Z3dpbiAtbWRsbCAtTyAtV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX2N4eD0nZysrIC1tY3lnd2luIC1PIC1XYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyX2V4ZT0nZ2NjIC1tY3lnd2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyX3NvPSgnJXMgLW1jeWd3aW4gJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5saW5rZXJfZGxsLCBzaGFyZWRfb3B0aW9uKSkpCisKKyAgICAgICAgIyBjeWd3aW4gYW5kIG1pbmd3MzIgbmVlZCBkaWZmZXJlbnQgc2V0cyBvZiBsaWJyYXJpZXMKKyAgICAgICAgaWYgc2VsZi5nY2NfdmVyc2lvbiA9PSAiMi45MS41NyI6CisgICAgICAgICAgICAjIGN5Z3dpbiBzaG91bGRuJ3QgbmVlZCBtc3ZjcnQsIGJ1dCB3aXRob3V0IHRoZSBkbGxzIHdpbGwgY3Jhc2gKKyAgICAgICAgICAgICMgKGdjYyB2ZXJzaW9uIDIuOTEuNTcpIC0tIHBlcmhhcHMgc29tZXRoaW5nIGFib3V0IGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICBzZWxmLmRsbF9saWJyYXJpZXM9WyJtc3ZjcnQiXQorICAgICAgICAgICAgc2VsZi53YXJuKAorICAgICAgICAgICAgICAgICJDb25zaWRlciB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGdjYyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIE1TVkMgcnVudGltZSBsaWJyYXJ5IGlmIFB5dGhvbiB3YXMgYnVpbHQKKyAgICAgICAgICAgICMgd2l0aCBNU1ZDIDcuMCBvciBsYXRlci4KKyAgICAgICAgICAgIHNlbGYuZGxsX2xpYnJhcmllcyA9IGdldF9tc3ZjcigpCisKKyAgICAjIF9faW5pdF9fICgpCisKKworICAgIGRlZiBfY29tcGlsZShzZWxmLCBvYmosIHNyYywgZXh0LCBjY19hcmdzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cyk6CisgICAgICAgIGlmIGV4dCA9PSAnLnJjJyBvciBleHQgPT0gJy5yZXMnOgorICAgICAgICAgICAgIyBnY2MgbmVlZHMgJy5yZXMnIGFuZCAnLnJjJyBjb21waWxlZCB0byBvYmplY3QgZmlsZXMgISEhCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihbIndpbmRyZXMiLCAiLWkiLCBzcmMsICItbyIsIG9ial0pCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yLCBtc2cKKyAgICAgICAgZWxzZTogIyBmb3Igb3RoZXIgZmlsZXMgdXNlIHRoZSBDLWNvbXBpbGVyCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihzZWxmLmNvbXBpbGVyX3NvICsgY2NfYXJncyArIFtzcmMsICctbycsIG9ial0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yLCBtc2cKKworICAgIGRlZiBsaW5rIChzZWxmLAorICAgICAgICAgICAgICB0YXJnZXRfZGVzYywKKyAgICAgICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgIGxpYnJhcmllcz1Ob25lLAorICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwKKyAgICAgICAgICAgICAgZGVidWc9MCwKKyAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lLAorICAgICAgICAgICAgICBidWlsZF90ZW1wPU5vbmUsCisgICAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgorCisgICAgICAgICMgdXNlIHNlcGFyYXRlIGNvcGllcywgc28gd2UgY2FuIG1vZGlmeSB0aGUgbGlzdHMKKyAgICAgICAgZXh0cmFfcHJlYXJncyA9IGNvcHkuY29weShleHRyYV9wcmVhcmdzIG9yIFtdKQorICAgICAgICBsaWJyYXJpZXMgPSBjb3B5LmNvcHkobGlicmFyaWVzIG9yIFtdKQorICAgICAgICBvYmplY3RzID0gY29weS5jb3B5KG9iamVjdHMgb3IgW10pCisKKyAgICAgICAgIyBBZGRpdGlvbmFsIGxpYnJhcmllcworICAgICAgICBsaWJyYXJpZXMuZXh0ZW5kKHNlbGYuZGxsX2xpYnJhcmllcykKKworICAgICAgICAjIGhhbmRsZSBleHBvcnQgc3ltYm9scyBieSBjcmVhdGluZyBhIGRlZi1maWxlCisgICAgICAgICMgd2l0aCBleGVjdXRhYmxlcyB0aGlzIG9ubHkgd29ya3Mgd2l0aCBnY2MvbGQgYXMgbGlua2VyCisgICAgICAgIGlmICgoZXhwb3J0X3N5bWJvbHMgaXMgbm90IE5vbmUpIGFuZAorICAgICAgICAgICAgKHRhcmdldF9kZXNjICE9IHNlbGYuRVhFQ1VUQUJMRSBvciBzZWxmLmxpbmtlcl9kbGwgPT0gImdjYyIpKToKKyAgICAgICAgICAgICMgKFRoZSBsaW5rZXIgZG9lc24ndCBkbyBhbnl0aGluZyBpZiBvdXRwdXQgaXMgdXAtdG8tZGF0ZS4KKyAgICAgICAgICAgICMgU28gaXQgd291bGQgcHJvYmFibHkgYmV0dGVyIHRvIGNoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRoaXMsCisgICAgICAgICAgICAjIGJ1dCBmb3IgdGhpcyB3ZSBoYWQgdG8gaW5zZXJ0IHNvbWUgdW5jaGFuZ2VkIHBhcnRzIG9mCisgICAgICAgICAgICAjIFVuaXhDQ29tcGlsZXIsIGFuZCB0aGlzIGlzIG5vdCB3aGF0IHdlIHdhbnQuKQorCisgICAgICAgICAgICAjIHdlIHdhbnQgdG8gcHV0IHNvbWUgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQorICAgICAgICAgICAgIyBvYmplY3QgZmlsZXMgYXJlLCBidWlsZF90ZW1wIGRvZXNuJ3QgaGVscCBtdWNoCisgICAgICAgICAgICAjIHdoZXJlIGFyZSB0aGUgb2JqZWN0IGZpbGVzCisgICAgICAgICAgICB0ZW1wX2RpciA9IG9zLnBhdGguZGlybmFtZShvYmplY3RzWzBdKQorICAgICAgICAgICAgIyBuYW1lIG9mIGRsbCB0byBnaXZlIHRoZSBoZWxwZXIgZmlsZXMgdGhlIHNhbWUgYmFzZSBuYW1lCisgICAgICAgICAgICAoZGxsX25hbWUsIGRsbF9leHRlbnNpb24pID0gb3MucGF0aC5zcGxpdGV4dCgKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKG91dHB1dF9maWxlbmFtZSkpCisKKyAgICAgICAgICAgICMgZ2VuZXJhdGUgdGhlIGZpbGVuYW1lcyBmb3IgdGhlc2UgZmlsZXMKKyAgICAgICAgICAgIGRlZl9maWxlID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBkbGxfbmFtZSArICIuZGVmIikKKyAgICAgICAgICAgIGxpYl9maWxlID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCAnbGliJyArIGRsbF9uYW1lICsgIi5hIikKKworICAgICAgICAgICAgIyBHZW5lcmF0ZSAuZGVmIGZpbGUKKyAgICAgICAgICAgIGNvbnRlbnRzID0gWworICAgICAgICAgICAgICAgICJMSUJSQVJZICVzIiAlIG9zLnBhdGguYmFzZW5hbWUob3V0cHV0X2ZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAiRVhQT1JUUyJdCisgICAgICAgICAgICBmb3Igc3ltIGluIGV4cG9ydF9zeW1ib2xzOgorICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChzeW0pCisgICAgICAgICAgICBzZWxmLmV4ZWN1dGUod3JpdGVfZmlsZSwgKGRlZl9maWxlLCBjb250ZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgJXMiICUgZGVmX2ZpbGUpCisKKyAgICAgICAgICAgICMgbmV4dCBhZGQgb3B0aW9ucyBmb3IgZGVmLWZpbGUgYW5kIHRvIGNyZWF0aW5nIGltcG9ydCBsaWJyYXJpZXMKKworICAgICAgICAgICAgIyBkbGx3cmFwIHVzZXMgZGlmZmVyZW50IG9wdGlvbnMgdGhhbiBnY2MvbGQKKyAgICAgICAgICAgIGlmIHNlbGYubGlua2VyX2RsbCA9PSAiZGxsd3JhcCI6CisgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncy5leHRlbmQoWyItLW91dHB1dC1saWIiLCBsaWJfZmlsZV0pCisgICAgICAgICAgICAgICAgIyBmb3IgZGxsd3JhcCB3ZSBoYXZlIHRvIHVzZSBhIHNwZWNpYWwgb3B0aW9uCisgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncy5leHRlbmQoWyItLWRlZiIsIGRlZl9maWxlXSkKKyAgICAgICAgICAgICMgd2UgdXNlIGdjYy9sZCBoZXJlIGFuZCBjYW4gYmUgc3VyZSBsZCBpcyA+PSAyLjkuMTAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBkb2Vzbid0IHdvcms6IGJmZF9jbG9zZSBidWlsZFwuLi5cbGliZm9vLmE6IEludmFsaWQgb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgI2V4dHJhX3ByZWFyZ3MuZXh0ZW5kKFsiLVdsLC0tb3V0LWltcGxpYiwlcyIgJSBsaWJfZmlsZV0pCisgICAgICAgICAgICAgICAgIyBmb3IgZ2NjL2xkIHRoZSBkZWYtZmlsZSBpcyBzcGVjaWZpZWQgYXMgYW55IG9iamVjdCBmaWxlcworICAgICAgICAgICAgICAgIG9iamVjdHMuYXBwZW5kKGRlZl9maWxlKQorCisgICAgICAgICNlbmQ6IGlmICgoZXhwb3J0X3N5bWJvbHMgaXMgbm90IE5vbmUpIGFuZAorICAgICAgICAjICAgICAgICAodGFyZ2V0X2Rlc2MgIT0gc2VsZi5FWEVDVVRBQkxFIG9yIHNlbGYubGlua2VyX2RsbCA9PSAiZ2NjIikpOgorCisgICAgICAgICMgd2hvIHdhbnRzIHN5bWJvbHMgYW5kIGEgbWFueSB0aW1lcyBsYXJnZXIgb3V0cHV0IGZpbGUKKyAgICAgICAgIyBzaG91bGQgZXhwbGljaXRseSBzd2l0Y2ggdGhlIGRlYnVnIG1vZGUgb24KKyAgICAgICAgIyBvdGhlcndpc2Ugd2UgbGV0IGRsbHdyYXAvbGQgc3RyaXAgdGhlIG91dHB1dCBmaWxlCisgICAgICAgICMgKE9uIG15IG1hY2hpbmU6IDEwS0IgPCBzdHJpcHBlZF9maWxlIDwgPz8xMDBLQgorICAgICAgICAjICAgdW5zdHJpcHBlZF9maWxlID0gc3RyaXBwZWRfZmlsZSArIFhYWCBLQgorICAgICAgICAjICAoIFhYWD0yNTQgZm9yIGEgdHlwaWNhbCBweXRob24gZXh0ZW5zaW9uKSkKKyAgICAgICAgaWYgbm90IGRlYnVnOgorICAgICAgICAgICAgZXh0cmFfcHJlYXJncy5hcHBlbmQoIi1zIikKKworICAgICAgICBVbml4Q0NvbXBpbGVyLmxpbmsoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9kZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lX2xpYnJhcnlfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsICMgZXhwb3J0X3N5bWJvbHMsIHdlIGRvIHRoaXMgaW4gb3VyIGRlZi1maWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1ZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wb3N0YXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkX3RlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbGFuZykKKworICAgICMgbGluayAoKQorCisgICAgIyAtLSBNaXNjZWxsYW5lb3VzIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICMgb3ZlcndyaXRlIHRoZSBvbmUgZnJvbSBDQ29tcGlsZXIgdG8gc3VwcG9ydCByYyBhbmQgcmVzLWZpbGVzCisgICAgZGVmIG9iamVjdF9maWxlbmFtZXMgKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9maWxlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX2Rpcj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPScnKToKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBOb25lOiBvdXRwdXRfZGlyID0gJycKKyAgICAgICAgb2JqX25hbWVzID0gW10KKyAgICAgICAgZm9yIHNyY19uYW1lIGluIHNvdXJjZV9maWxlbmFtZXM6CisgICAgICAgICAgICAjIEZJWE1FOiAiYm9ndXMgY2hlY2tzIGZvciBzdWZmaXgiIC0gYXMgZXhhbXBsZSB0aGUgY29tbWVudGVkCisgICAgICAgICAgICAjIGJ5ICNCT0dVUyMgY29kZSBicmVhayB2YWxpZCBhc3NlbWJsZXIgc3VmZml4ICIuUyIgIQorICAgICAgICAgICAgI0JPR1VTIyMgdXNlIG5vcm1jYXNlIHRvIG1ha2Ugc3VyZSAnLnJjJyBpcyByZWFsbHkgJy5yYycgYW5kIG5vdCAnLlJDJworICAgICAgICAgICAgI0JPR1VTI2Jhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5ub3JtY2FzZShzcmNfbmFtZSkpCisgICAgICAgICAgICBiYXNlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0IChzcmNfbmFtZSkKKyAgICAgICAgICAgIGV4dF9ub3JtY2FzZSA9IG9zLnBhdGgubm9ybWNhc2UoZXh0KQorICAgICAgICAgICAgaWYgZXh0X25vcm1jYXNlIGluIFsnLnJjJywnLnJlcyddOgorICAgICAgICAgICAgICAgIGV4dCA9IGV4dF9ub3JtY2FzZQorICAgICAgICAgICAgaWYgZXh0IG5vdCBpbiAoc2VsZi5zcmNfZXh0ZW5zaW9ucyArIFsnLnJjJywnLnJlcyddKToKKyAgICAgICAgICAgICAgICByYWlzZSBVbmtub3duRmlsZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInVua25vd24gZmlsZSB0eXBlICclcycgKGZyb20gJyVzJykiICUgXAorICAgICAgICAgICAgICAgICAgICAgIChleHQsIHNyY19uYW1lKQorICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguc3BsaXRkcml2ZShiYXNlKVsxXSAjIENob3Agb2ZmIHRoZSBkcml2ZQorICAgICAgICAgICAgYmFzZSA9IGJhc2Vbb3MucGF0aC5pc2FicyhiYXNlKTpdICAjIElmIGFicywgY2hvcCBvZmYgbGVhZGluZyAvCisgICAgICAgICAgICBpZiBzdHJpcF9kaXI6CisgICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUgKGJhc2UpCisgICAgICAgICAgICBpZiBleHQgPT0gJy5yZXMnIG9yIGV4dCA9PSAnLnJjJzoKKyAgICAgICAgICAgICAgICAjIHRoZXNlIG5lZWQgdG8gYmUgY29tcGlsZWQgdG8gb2JqZWN0IGZpbGVzCisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgZXh0ICsgc2VsZi5vYmpfZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5vYmpfZXh0ZW5zaW9uKSkKKyAgICAgICAgcmV0dXJuIG9ial9uYW1lcworCisgICAgIyBvYmplY3RfZmlsZW5hbWVzICgpCisKKyMgY2xhc3MgQ3lnd2luQ0NvbXBpbGVyCisKKworIyB0aGUgc2FtZSBhcyBjeWd3aW4gcGx1cyBzb21lIGFkZGl0aW9uYWwgcGFyYW1ldGVycworY2xhc3MgTWluZ3czMkNDb21waWxlciAoQ3lnd2luQ0NvbXBpbGVyKToKKworICAgIGNvbXBpbGVyX3R5cGUgPSAnbWluZ3czMicKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwKKyAgICAgICAgICAgICAgICAgIHZlcmJvc2U9MCwKKyAgICAgICAgICAgICAgICAgIGRyeV9ydW49MCwKKyAgICAgICAgICAgICAgICAgIGZvcmNlPTApOgorCisgICAgICAgIEN5Z3dpbkNDb21waWxlci5fX2luaXRfXyAoc2VsZiwgdmVyYm9zZSwgZHJ5X3J1biwgZm9yY2UpCisKKyAgICAgICAgIyBsZF92ZXJzaW9uID49ICIyLjEzIiBzdXBwb3J0IC1zaGFyZWQgc28gdXNlIGl0IGluc3RlYWQgb2YKKyAgICAgICAgIyAtbWRsbCAtc3RhdGljCisgICAgICAgIGlmIHNlbGYubGRfdmVyc2lvbiA+PSAiMi4xMyI6CisgICAgICAgICAgICBzaGFyZWRfb3B0aW9uID0gIi1zaGFyZWQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaGFyZWRfb3B0aW9uID0gIi1tZGxsIC1zdGF0aWMiCisKKyAgICAgICAgIyBBIHJlYWwgbWluZ3czMiBkb2Vzbid0IG5lZWQgdG8gc3BlY2lmeSBhIGRpZmZlcmVudCBlbnRyeSBwb2ludCwKKyAgICAgICAgIyBidXQgY3lnd2luIDIuOTEuNTcgaW4gbm8tY3lnd2luLW1vZGUgbmVlZHMgaXQuCisgICAgICAgIGlmIHNlbGYuZ2NjX3ZlcnNpb24gPD0gIjIuOTEuNTciOgorICAgICAgICAgICAgZW50cnlfcG9pbnQgPSAnLS1lbnRyeSBfRGxsTWFpbkAxMicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVudHJ5X3BvaW50ID0gJycKKworICAgICAgICBzZWxmLnNldF9leGVjdXRhYmxlcyhjb21waWxlcj0nZ2NjIC1tbm8tY3lnd2luIC1PIC1XYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXJfc289J2djYyAtbW5vLWN5Z3dpbiAtbWRsbCAtTyAtV2FsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVyX2N4eD0nZysrIC1tbm8tY3lnd2luIC1PIC1XYWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyX2V4ZT0nZ2NjIC1tbm8tY3lnd2luJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua2VyX3NvPSclcyAtbW5vLWN5Z3dpbiAlcyAlcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmxpbmtlcl9kbGwsIHNoYXJlZF9vcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlfcG9pbnQpKQorICAgICAgICAjIE1heWJlIHdlIHNob3VsZCBhbHNvIGFwcGVuZCAtbXRocmVhZHMsIGJ1dCB0aGVuIHRoZSBmaW5pc2hlZAorICAgICAgICAjIGRsbHMgbmVlZCBhbm90aGVyIGRsbCAobWluZ3dtMTAuZGxsIHNlZSBNaW5ndzMyIGRvY3MpCisgICAgICAgICMgKC1tdGhyZWFkczogU3VwcG9ydCB0aHJlYWQtc2FmZSBleGNlcHRpb24gaGFuZGxpbmcgb24gYE1pbmd3MzInKQorCisgICAgICAgICMgbm8gYWRkaXRpb25hbCBsaWJyYXJpZXMgbmVlZGVkCisgICAgICAgIHNlbGYuZGxsX2xpYnJhcmllcz1bXQorCisgICAgICAgICMgSW5jbHVkZSB0aGUgYXBwcm9wcmlhdGUgTVNWQyBydW50aW1lIGxpYnJhcnkgaWYgUHl0aG9uIHdhcyBidWlsdAorICAgICAgICAjIHdpdGggTVNWQyA3LjAgb3IgbGF0ZXIuCisgICAgICAgIHNlbGYuZGxsX2xpYnJhcmllcyA9IGdldF9tc3ZjcigpCisKKyAgICAjIF9faW5pdF9fICgpCisKKyMgY2xhc3MgTWluZ3czMkNDb21waWxlcgorCisjIEJlY2F1c2UgdGhlc2UgY29tcGlsZXJzIGFyZW4ndCBjb25maWd1cmVkIGluIFB5dGhvbidzIHB5Y29uZmlnLmggZmlsZSBieQorIyBkZWZhdWx0LCB3ZSBzaG91bGQgYXQgbGVhc3Qgd2FybiB0aGUgdXNlciBpZiBoZSBpcyB1c2luZyBhIHVubW9kaWZpZWQKKyMgdmVyc2lvbi4KKworQ09ORklHX0hfT0sgPSAib2siCitDT05GSUdfSF9OT1RPSyA9ICJub3Qgb2siCitDT05GSUdfSF9VTkNFUlRBSU4gPSAidW5jZXJ0YWluIgorCitkZWYgY2hlY2tfY29uZmlnX2goKToKKworICAgICIiIkNoZWNrIGlmIHRoZSBjdXJyZW50IFB5dGhvbiBpbnN0YWxsYXRpb24gKHNwZWNpZmljYWxseSwgcHljb25maWcuaCkKKyAgICBhcHBlYXJzIGFtZW5hYmxlIHRvIGJ1aWxkaW5nIGV4dGVuc2lvbnMgd2l0aCBHQ0MuICBSZXR1cm5zIGEgdHVwbGUKKyAgICAoc3RhdHVzLCBkZXRhaWxzKSwgd2hlcmUgJ3N0YXR1cycgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzOgorICAgICAgQ09ORklHX0hfT0sKKyAgICAgICAgYWxsIGlzIHdlbGwsIGdvIGFoZWFkIGFuZCBjb21waWxlCisgICAgICBDT05GSUdfSF9OT1RPSworICAgICAgICBkb2Vzbid0IGxvb2sgZ29vZAorICAgICAgQ09ORklHX0hfVU5DRVJUQUlOCisgICAgICAgIG5vdCBzdXJlIC0tIHVuYWJsZSB0byByZWFkIHB5Y29uZmlnLmgKKyAgICAnZGV0YWlscycgaXMgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcgZXhwbGFpbmluZyB0aGUgc2l0dWF0aW9uLgorCisgICAgTm90ZSB0aGVyZSBhcmUgdHdvIHdheXMgdG8gY29uY2x1ZGUgIk9LIjogZWl0aGVyICdzeXMudmVyc2lvbicgY29udGFpbnMKKyAgICB0aGUgc3RyaW5nICJHQ0MiIChpbXBseWluZyB0aGF0IHRoaXMgUHl0aG9uIHdhcyBidWlsdCB3aXRoIEdDQyksIG9yIHRoZQorICAgIGluc3RhbGxlZCAicHljb25maWcuaCIgY29udGFpbnMgdGhlIHN0cmluZyAiX19HTlVDX18iLgorICAgICIiIgorCisgICAgIyBYWFggc2luY2UgdGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBzeXMudmVyc2lvbiwgaXQncyBub3Qgc3RyaWN0bHkgYQorICAgICMgInB5Y29uZmlnLmgiIGNoZWNrIC0tIHNob3VsZCBwcm9iYWJseSBiZSByZW5hbWVkLi4uCisKKyAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCisgICAgaW1wb3J0IHN0cmluZworICAgICMgaWYgc3lzLnZlcnNpb24gY29udGFpbnMgR0NDIHRoZW4gcHl0aG9uIHdhcyBjb21waWxlZCB3aXRoCisgICAgIyBHQ0MsIGFuZCB0aGUgcHljb25maWcuaCBmaWxlIHNob3VsZCBiZSBPSworICAgIGlmIHN0cmluZy5maW5kKHN5cy52ZXJzaW9uLCJHQ0MiKSA+PSAwOgorICAgICAgICByZXR1cm4gKENPTkZJR19IX09LLCAic3lzLnZlcnNpb24gbWVudGlvbnMgJ0dDQyciKQorCisgICAgZm4gPSBzeXNjb25maWcuZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCkKKyAgICB0cnk6CisgICAgICAgICMgSXQgd291bGQgcHJvYmFibHkgYmV0dGVyIHRvIHJlYWQgc2luZ2xlIGxpbmVzIHRvIHNlYXJjaC4KKyAgICAgICAgIyBCdXQgd2UgZG8gdGhpcyBvbmx5IG9uY2UsIGFuZCBpdCBpcyBmYXN0IGVub3VnaAorICAgICAgICBmID0gb3BlbihmbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IGYucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGV4Y2VwdCBJT0Vycm9yLCBleGM6CisgICAgICAgICMgaWYgd2UgY2FuJ3QgcmVhZCB0aGlzIGZpbGUsIHdlIGNhbm5vdCBzYXkgaXQgaXMgd3JvbmcKKyAgICAgICAgIyB0aGUgY29tcGlsZXIgd2lsbCBjb21wbGFpbiBsYXRlciBhYm91dCB0aGlzIGZpbGUgYXMgbWlzc2luZworICAgICAgICByZXR1cm4gKENPTkZJR19IX1VOQ0VSVEFJTiwKKyAgICAgICAgICAgICAgICAiY291bGRuJ3QgcmVhZCAnJXMnOiAlcyIgJSAoZm4sIGV4Yy5zdHJlcnJvcikpCisKKyAgICBlbHNlOgorICAgICAgICAjICJweWNvbmZpZy5oIiBjb250YWlucyBhbiAiI2lmZGVmIF9fR05VQ19fIiBvciBzb21ldGhpbmcgc2ltaWxhcgorICAgICAgICBpZiBzdHJpbmcuZmluZChzLCJfX0dOVUNfXyIpID49IDA6CisgICAgICAgICAgICByZXR1cm4gKENPTkZJR19IX09LLCAiJyVzJyBtZW50aW9ucyAnX19HTlVDX18nIiAlIGZuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChDT05GSUdfSF9OT1RPSywgIiclcycgZG9lcyBub3QgbWVudGlvbiAnX19HTlVDX18nIiAlIGZuKQorCisKKworZGVmIGdldF92ZXJzaW9ucygpOgorICAgICIiIiBUcnkgdG8gZmluZCBvdXQgdGhlIHZlcnNpb25zIG9mIGdjYywgbGQgYW5kIGRsbHdyYXAuCisgICAgICAgIElmIG5vdCBwb3NzaWJsZSBpdCByZXR1cm5zIE5vbmUgZm9yIGl0LgorICAgICIiIgorICAgIGZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IExvb3NlVmVyc2lvbgorICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKKyAgICBpbXBvcnQgcmUKKworICAgIGdjY19leGUgPSBvcy5lbnZpcm9uLmdldCgnQ0MnKSBvciBmaW5kX2V4ZWN1dGFibGUoJ2djYycpCisgICAgbGRfZXhlID0gb3MuZW52aXJvbi5nZXQoJ0xEJykgb3IgZmluZF9leGVjdXRhYmxlKCdsZCcpCisgICAgaWYgZ2NjX2V4ZToKKyAgICAgICAgb3V0ID0gb3MucG9wZW4oZ2NjX2V4ZSArICcgLWR1bXB2ZXJzaW9uJywncicpCisgICAgICAgIG91dF9zdHJpbmcgPSBvdXQucmVhZCgpCisgICAgICAgIG91dC5jbG9zZSgpCisgICAgICAgIHJlc3VsdCA9IHJlLnNlYXJjaCgnKFxkK1wuXGQrKFwuXGQrKSopJyxvdXRfc3RyaW5nKQorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICBnY2NfdmVyc2lvbiA9IExvb3NlVmVyc2lvbihyZXN1bHQuZ3JvdXAoMSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnY2NfdmVyc2lvbiA9IE5vbmUKKyAgICAgICAgb3V0ID0gb3MucG9wZW4oZ2NjX2V4ZSArICcgLS1wcmludC1wcm9nLW5hbWUgbGQnLCdyJykKKyAgICAgICAgbGRfZXhlID0gb3V0LnJlYWQoKS5kZWNvZGUoJ2FzY2lpJykuc3BsaXQoKVswXQorICAgICAgICBvdXQuY2xvc2UoKQorICAgIGVsc2U6CisgICAgICAgIGdjY192ZXJzaW9uID0gTm9uZQorICAgIGlmIGxkX2V4ZToKKyAgICAgICAgb3V0ID0gb3MucG9wZW4obGRfZXhlICsgJyAtdicsJ3InKQorICAgICAgICBvdXRfc3RyaW5nID0gb3V0LnJlYWQoKQorICAgICAgICBvdXQuY2xvc2UoKQorICAgICAgICByZXN1bHQgPSByZS5zZWFyY2goJyhcZCtcLlxkKyhcLlxkKykqKScsb3V0X3N0cmluZykKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgbGRfdmVyc2lvbiA9IExvb3NlVmVyc2lvbihyZXN1bHQuZ3JvdXAoMSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsZF92ZXJzaW9uID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGxkX3ZlcnNpb24gPSBOb25lCisgICAgZGxsd3JhcF9leGUgPSBvcy5lbnZpcm9uLmdldCgnRExMV1JBUCcpIG9yIGZpbmRfZXhlY3V0YWJsZSgnZGxsd3JhcCcpCisgICAgaWYgZGxsd3JhcF9leGU6CisgICAgICAgIG91dCA9IG9zLnBvcGVuKGRsbHdyYXBfZXhlICsgJyAtLXZlcnNpb24nLCdyJykKKyAgICAgICAgb3V0X3N0cmluZyA9IG91dC5yZWFkKCkKKyAgICAgICAgb3V0LmNsb3NlKCkKKyAgICAgICAgcmVzdWx0ID0gcmUuc2VhcmNoKCcgKFxkK1wuXGQrKFwuXGQrKSopJyxvdXRfc3RyaW5nKQorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICBkbGx3cmFwX3ZlcnNpb24gPSBMb29zZVZlcnNpb24ocmVzdWx0Lmdyb3VwKDEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGxsd3JhcF92ZXJzaW9uID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGRsbHdyYXBfdmVyc2lvbiA9IE5vbmUKKyAgICByZXR1cm4gKGdjY192ZXJzaW9uLCBsZF92ZXJzaW9uLCBkbGx3cmFwX3ZlcnNpb24pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIwM2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9jeWd3aW5jY29tcGlsZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGIwM2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvY3lnd2luY2NvbXBpbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlYnVnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODY3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weQpAQCAtMCwwICsxLDcgQEAKK2ltcG9ydCBvcworCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworIyBJZiBESVNUVVRJTFNfREVCVUcgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiB0aGUgZW1wdHkgc3RyaW5nLCB3ZSBydW4gaW4KKyMgZGVidWcgbW9kZS4KK0RFQlVHID0gb3MuZW52aXJvbi5nZXQoJ0RJU1RVVElMU19ERUJVRycpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViNTYzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlYnVnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZWJ1Zy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViNTYzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlYnVnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZXBfdXRpbC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2RlcF91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNzU5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZXBfdXRpbC5weQpAQCAtMCwwICsxLDg5IEBACisiIiJkaXN0dXRpbHMuZGVwX3V0aWwKKworVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHNpbXBsZSwgdGltZXN0YW1wLWJhc2VkIGRlcGVuZGVuY3kgb2YgZmlsZXMKK2FuZCBncm91cHMgb2YgZmlsZXM7IGFsc28sIGZ1bmN0aW9uIGJhc2VkIGVudGlyZWx5IG9uIHN1Y2gKK3RpbWVzdGFtcCBkZXBlbmRlbmN5IGFuYWx5c2lzLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IG9zCitmcm9tIHN0YXQgaW1wb3J0IFNUX01USU1FCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0ZpbGVFcnJvcgorCitkZWYgbmV3ZXIoc291cmNlLCB0YXJnZXQpOgorICAgICIiIlRlbGxzIGlmIHRoZSB0YXJnZXQgaXMgbmV3ZXIgdGhhbiB0aGUgc291cmNlLgorCisgICAgUmV0dXJuIHRydWUgaWYgJ3NvdXJjZScgZXhpc3RzIGFuZCBpcyBtb3JlIHJlY2VudGx5IG1vZGlmaWVkIHRoYW4KKyAgICAndGFyZ2V0Jywgb3IgaWYgJ3NvdXJjZScgZXhpc3RzIGFuZCAndGFyZ2V0JyBkb2Vzbid0LgorCisgICAgUmV0dXJuIGZhbHNlIGlmIGJvdGggZXhpc3QgYW5kICd0YXJnZXQnIGlzIHRoZSBzYW1lIGFnZSBvciB5b3VuZ2VyCisgICAgdGhhbiAnc291cmNlJy4gUmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yIGlmICdzb3VyY2UnIGRvZXMgbm90IGV4aXN0LgorCisgICAgTm90ZSB0aGF0IHRoaXMgdGVzdCBpcyBub3QgdmVyeSBhY2N1cmF0ZTogZmlsZXMgY3JlYXRlZCBpbiB0aGUgc2FtZSBzZWNvbmQKKyAgICB3aWxsIGhhdmUgdGhlIHNhbWUgImFnZSIuCisgICAgIiIiCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvdXJjZSk6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigiZmlsZSAnJXMnIGRvZXMgbm90IGV4aXN0IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoc291cmNlKSkKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModGFyZ2V0KToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHJldHVybiBvcy5zdGF0KHNvdXJjZSlbU1RfTVRJTUVdID4gb3Muc3RhdCh0YXJnZXQpW1NUX01USU1FXQorCitkZWYgbmV3ZXJfcGFpcndpc2Uoc291cmNlcywgdGFyZ2V0cyk6CisgICAgIiIiV2FsayB0d28gZmlsZW5hbWUgbGlzdHMgaW4gcGFyYWxsZWwsIHRlc3RpbmcgaWYgZWFjaCBzb3VyY2UgaXMgbmV3ZXIKKyAgICB0aGFuIGl0cyBjb3JyZXNwb25kaW5nIHRhcmdldC4gIFJldHVybiBhIHBhaXIgb2YgbGlzdHMgKHNvdXJjZXMsCisgICAgdGFyZ2V0cykgd2hlcmUgc291cmNlIGlzIG5ld2VyIHRoYW4gdGFyZ2V0LCBhY2NvcmRpbmcgdG8gdGhlIHNlbWFudGljcworICAgIG9mICduZXdlcigpJy4KKyAgICAiIiIKKyAgICBpZiBsZW4oc291cmNlcykgIT0gbGVuKHRhcmdldHMpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiJ3NvdXJjZXMnIGFuZCAndGFyZ2V0cycgbXVzdCBiZSBzYW1lIGxlbmd0aCIKKworICAgICMgYnVpbGQgYSBwYWlyIG9mIGxpc3RzIChzb3VyY2VzLCB0YXJnZXRzKSB3aGVyZSAgc291cmNlIGlzIG5ld2VyCisgICAgbl9zb3VyY2VzID0gW10KKyAgICBuX3RhcmdldHMgPSBbXQorICAgIGZvciBzb3VyY2UsIHRhcmdldCBpbiB6aXAoc291cmNlcywgdGFyZ2V0cyk6CisgICAgICAgIGlmIG5ld2VyKHNvdXJjZSwgdGFyZ2V0KToKKyAgICAgICAgICAgIG5fc291cmNlcy5hcHBlbmQoc291cmNlKQorICAgICAgICAgICAgbl90YXJnZXRzLmFwcGVuZCh0YXJnZXQpCisKKyAgICByZXR1cm4gbl9zb3VyY2VzLCBuX3RhcmdldHMKKworZGVmIG5ld2VyX2dyb3VwKHNvdXJjZXMsIHRhcmdldCwgbWlzc2luZz0nZXJyb3InKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAndGFyZ2V0JyBpcyBvdXQtb2YtZGF0ZSB3aXRoIHJlc3BlY3QgdG8gYW55IGZpbGUKKyAgICBsaXN0ZWQgaW4gJ3NvdXJjZXMnLgorCisgICAgSW4gb3RoZXIgd29yZHMsIGlmICd0YXJnZXQnIGV4aXN0cyBhbmQgaXMgbmV3ZXIKKyAgICB0aGFuIGV2ZXJ5IGZpbGUgaW4gJ3NvdXJjZXMnLCByZXR1cm4gZmFsc2U7IG90aGVyd2lzZSByZXR1cm4gdHJ1ZS4KKyAgICAnbWlzc2luZycgY29udHJvbHMgd2hhdCB3ZSBkbyB3aGVuIGEgc291cmNlIGZpbGUgaXMgbWlzc2luZzsgdGhlCisgICAgZGVmYXVsdCAoImVycm9yIikgaXMgdG8gYmxvdyB1cCB3aXRoIGFuIE9TRXJyb3IgZnJvbSBpbnNpZGUgJ3N0YXQoKSc7CisgICAgaWYgaXQgaXMgImlnbm9yZSIsIHdlIHNpbGVudGx5IGRyb3AgYW55IG1pc3Npbmcgc291cmNlIGZpbGVzOyBpZiBpdCBpcworICAgICJuZXdlciIsIGFueSBtaXNzaW5nIHNvdXJjZSBmaWxlcyBtYWtlIHVzIGFzc3VtZSB0aGF0ICd0YXJnZXQnIGlzCisgICAgb3V0LW9mLWRhdGUgKHRoaXMgaXMgaGFuZHkgaW4gImRyeS1ydW4iIG1vZGU6IGl0J2xsIG1ha2UgeW91IHByZXRlbmQgdG8KKyAgICBjYXJyeSBvdXQgY29tbWFuZHMgdGhhdCB3b3VsZG4ndCB3b3JrIGJlY2F1c2UgaW5wdXRzIGFyZSBtaXNzaW5nLCBidXQKKyAgICB0aGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgeW91J3JlIG5vdCBhY3R1YWxseSBnb2luZyB0byBydW4gdGhlCisgICAgY29tbWFuZHMpLgorICAgICIiIgorICAgICMgSWYgdGhlIHRhcmdldCBkb2Vzbid0IGV2ZW4gZXhpc3QsIHRoZW4gaXQncyBkZWZpbml0ZWx5IG91dC1vZi1kYXRlLgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0YXJnZXQpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBPdGhlcndpc2Ugd2UgaGF2ZSB0byBmaW5kIG91dCB0aGUgaGFyZCB3YXk6IGlmICphbnkqIHNvdXJjZSBmaWxlCisgICAgIyBpcyBtb3JlIHJlY2VudCB0aGFuICd0YXJnZXQnLCB0aGVuICd0YXJnZXQnIGlzIG91dC1vZi1kYXRlIGFuZAorICAgICMgd2UgY2FuIGltbWVkaWF0ZWx5IHJldHVybiB0cnVlLiAgSWYgd2UgZmFsbCB0aHJvdWdoIHRvIHRoZSBlbmQKKyAgICAjIG9mIHRoZSBsb29wLCB0aGVuICd0YXJnZXQnIGlzIHVwLXRvLWRhdGUgYW5kIHdlIHJldHVybiBmYWxzZS4KKyAgICB0YXJnZXRfbXRpbWUgPSBvcy5zdGF0KHRhcmdldClbU1RfTVRJTUVdCisKKyAgICBmb3Igc291cmNlIGluIHNvdXJjZXM6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2UpOgorICAgICAgICAgICAgaWYgbWlzc2luZyA9PSAnZXJyb3InOiAgICAgICMgYmxvdyB1cCB3aGVuIHdlIHN0YXQoKSB0aGUgZmlsZQorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgbWlzc2luZyA9PSAnaWdub3JlJzogICAjIG1pc3Npbmcgc291cmNlIGRyb3BwZWQgZnJvbQorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICAgICAgICAgICAgICMgIHRhcmdldCdzIGRlcGVuZGVuY3kgbGlzdAorICAgICAgICAgICAgZWxpZiBtaXNzaW5nID09ICduZXdlcic6ICAgICMgbWlzc2luZyBzb3VyY2UgbWVhbnMgdGFyZ2V0IGlzCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUgICAgICAgICAgICAgIyAgb3V0LW9mLWRhdGUKKworICAgICAgICBpZiBvcy5zdGF0KHNvdXJjZSlbU1RfTVRJTUVdID4gdGFyZ2V0X210aW1lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODVlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZXBfdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGVwX3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwODVlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kZXBfdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlyX3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXJfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDI2ZTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlyX3V0aWwucHkKQEAgLTAsMCArMSwyMTYgQEAKKyIiImRpc3R1dGlscy5kaXJfdXRpbAorCitVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIGRpcmVjdG9yaWVzIGFuZCBkaXJlY3RvcnkgdHJlZXMuIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNGaWxlRXJyb3IsIERpc3R1dGlsc0ludGVybmFsRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworIyBjYWNoZSBmb3IgYnkgbWtwYXRoKCkgLS0gaW4gYWRkaXRpb24gdG8gY2hlYXBlbmluZyByZWR1bmRhbnQgY2FsbHMsCisjIGVsaW1pbmF0ZXMgcmVkdW5kYW50ICJjcmVhdGluZyAvZm9vL2Jhci9iYXoiIG1lc3NhZ2VzIGluIGRyeS1ydW4gbW9kZQorX3BhdGhfY3JlYXRlZCA9IHt9CisKKyMgSSBkb24ndCB1c2Ugb3MubWFrZWRpcnMgYmVjYXVzZSBhKSBpdCdzIG5ldyB0byBQeXRob24gMS41LjIsIGFuZAorIyBiKSBpdCBibG93cyB1cCBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIChJIHdhbnQgdG8gc2lsZW50bHkKKyMgc3VjY2VlZCBpbiB0aGF0IGNhc2UpLgorZGVmIG1rcGF0aChuYW1lLCBtb2RlPTA3NzcsIHZlcmJvc2U9MSwgZHJ5X3J1bj0wKToKKyAgICAiIiJDcmVhdGUgYSBkaXJlY3RvcnkgYW5kIGFueSBtaXNzaW5nIGFuY2VzdG9yIGRpcmVjdG9yaWVzLgorCisgICAgSWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cyAob3IgaWYgJ25hbWUnIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoCisgICAgbWVhbnMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB3aGljaCBvZiBjb3Vyc2UgZXhpc3RzKSwgdGhlbiBkbyBub3RoaW5nLgorICAgIFJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvciBpZiB1bmFibGUgdG8gY3JlYXRlIHNvbWUgZGlyZWN0b3J5IGFsb25nIHRoZSB3YXkKKyAgICAoZWcuIHNvbWUgc3ViLXBhdGggZXhpc3RzLCBidXQgaXMgYSBmaWxlIHJhdGhlciB0aGFuIGEgZGlyZWN0b3J5KS4KKyAgICBJZiAndmVyYm9zZScgaXMgdHJ1ZSwgcHJpbnQgYSBvbmUtbGluZSBzdW1tYXJ5IG9mIGVhY2ggbWtkaXIgdG8gc3Rkb3V0LgorICAgIFJldHVybiB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcyBhY3R1YWxseSBjcmVhdGVkLgorICAgICIiIgorCisgICAgZ2xvYmFsIF9wYXRoX2NyZWF0ZWQKKworICAgICMgRGV0ZWN0IGEgY29tbW9uIGJ1ZyAtLSBuYW1lIGlzIE5vbmUKKyAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lLCBiYXNlc3RyaW5nKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzSW50ZXJuYWxFcnJvciwgXAorICAgICAgICAgICAgICAibWtwYXRoOiAnbmFtZScgbXVzdCBiZSBhIHN0cmluZyAoZ290ICVyKSIgJSAobmFtZSwpCisKKyAgICAjIFhYWCB3aGF0J3MgdGhlIGJldHRlciB3YXkgdG8gaGFuZGxlIHZlcmJvc2l0eT8gcHJpbnQgYXMgd2UgY3JlYXRlCisgICAgIyBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgcGF0aCAodGhlIGN1cnJlbnQgYmVoYXZpb3VyKSwgb3Igb25seSBhbm5vdW5jZQorICAgICMgdGhlIGNyZWF0aW9uIG9mIHRoZSB3aG9sZSBwYXRoPyAocXVpdGUgZWFzeSB0byBkbyB0aGUgbGF0dGVyIHNpbmNlCisgICAgIyB3ZSdyZSBub3QgdXNpbmcgYSByZWN1cnNpdmUgYWxnb3JpdGhtKQorCisgICAgbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgobmFtZSkKKyAgICBjcmVhdGVkX2RpcnMgPSBbXQorICAgIGlmIG9zLnBhdGguaXNkaXIobmFtZSkgb3IgbmFtZSA9PSAnJzoKKyAgICAgICAgcmV0dXJuIGNyZWF0ZWRfZGlycworICAgIGlmIF9wYXRoX2NyZWF0ZWQuZ2V0KG9zLnBhdGguYWJzcGF0aChuYW1lKSk6CisgICAgICAgIHJldHVybiBjcmVhdGVkX2RpcnMKKworICAgIChoZWFkLCB0YWlsKSA9IG9zLnBhdGguc3BsaXQobmFtZSkKKyAgICB0YWlscyA9IFt0YWlsXSAgICAgICAgICAgICAgICAgICAgICAjIHN0YWNrIG9mIGxvbmUgZGlycyB0byBjcmVhdGUKKworICAgIHdoaWxlIGhlYWQgYW5kIHRhaWwgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKGhlYWQpOgorICAgICAgICAoaGVhZCwgdGFpbCkgPSBvcy5wYXRoLnNwbGl0KGhlYWQpCisgICAgICAgIHRhaWxzLmluc2VydCgwLCB0YWlsKSAgICAgICAgICAjIHB1c2ggbmV4dCBoaWdoZXIgZGlyIG9udG8gc3RhY2sKKworICAgICMgbm93ICdoZWFkJyBjb250YWlucyB0aGUgZGVlcGVzdCBkaXJlY3RvcnkgdGhhdCBhbHJlYWR5IGV4aXN0cworICAgICMgKHRoYXQgaXMsIHRoZSBjaGlsZCBvZiAnaGVhZCcgaW4gJ25hbWUnIGlzIHRoZSBoaWdoZXN0IGRpcmVjdG9yeQorICAgICMgdGhhdCBkb2VzICpub3QqIGV4aXN0KQorICAgIGZvciBkIGluIHRhaWxzOgorICAgICAgICAjcHJpbnQgImhlYWQgPSAlcywgZCA9ICVzOiAiICUgKGhlYWQsIGQpLAorICAgICAgICBoZWFkID0gb3MucGF0aC5qb2luKGhlYWQsIGQpCisgICAgICAgIGFic19oZWFkID0gb3MucGF0aC5hYnNwYXRoKGhlYWQpCisKKyAgICAgICAgaWYgX3BhdGhfY3JlYXRlZC5nZXQoYWJzX2hlYWQpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiB2ZXJib3NlID49IDE6CisgICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgJXMiLCBoZWFkKQorCisgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKGhlYWQsIG1vZGUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZXhjOgorICAgICAgICAgICAgICAgIGlmIG5vdCAoZXhjLmVycm5vID09IGVycm5vLkVFWElTVCBhbmQgb3MucGF0aC5pc2RpcihoZWFkKSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjcmVhdGUgJyVzJzogJXMiICUgKGhlYWQsIGV4Yy5hcmdzWy0xXSkpCisgICAgICAgICAgICBjcmVhdGVkX2RpcnMuYXBwZW5kKGhlYWQpCisKKyAgICAgICAgX3BhdGhfY3JlYXRlZFthYnNfaGVhZF0gPSAxCisgICAgcmV0dXJuIGNyZWF0ZWRfZGlycworCitkZWYgY3JlYXRlX3RyZWUoYmFzZV9kaXIsIGZpbGVzLCBtb2RlPTA3NzcsIHZlcmJvc2U9MSwgZHJ5X3J1bj0wKToKKyAgICAiIiJDcmVhdGUgYWxsIHRoZSBlbXB0eSBkaXJlY3RvcmllcyB1bmRlciAnYmFzZV9kaXInIG5lZWRlZCB0byBwdXQgJ2ZpbGVzJworICAgIHRoZXJlLgorCisgICAgJ2Jhc2VfZGlyJyBpcyBqdXN0IHRoZSBhIG5hbWUgb2YgYSBkaXJlY3Rvcnkgd2hpY2ggZG9lc24ndCBuZWNlc3NhcmlseQorICAgIGV4aXN0IHlldDsgJ2ZpbGVzJyBpcyBhIGxpc3Qgb2YgZmlsZW5hbWVzIHRvIGJlIGludGVycHJldGVkIHJlbGF0aXZlIHRvCisgICAgJ2Jhc2VfZGlyJy4gICdiYXNlX2RpcicgKyB0aGUgZGlyZWN0b3J5IHBvcnRpb24gb2YgZXZlcnkgZmlsZSBpbiAnZmlsZXMnCisgICAgd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gICdtb2RlJywgJ3ZlcmJvc2UnIGFuZAorICAgICdkcnlfcnVuJyBmbGFncyBhcmUgYXMgZm9yICdta3BhdGgoKScuCisgICAgIiIiCisgICAgIyBGaXJzdCBnZXQgdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gY3JlYXRlCisgICAgbmVlZF9kaXIgPSB7fQorICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICBuZWVkX2Rpcltvcy5wYXRoLmpvaW4oYmFzZV9kaXIsIG9zLnBhdGguZGlybmFtZShmaWxlKSldID0gMQorICAgIG5lZWRfZGlycyA9IG5lZWRfZGlyLmtleXMoKQorICAgIG5lZWRfZGlycy5zb3J0KCkKKworICAgICMgTm93IGNyZWF0ZSB0aGVtCisgICAgZm9yIGRpciBpbiBuZWVkX2RpcnM6CisgICAgICAgIG1rcGF0aChkaXIsIG1vZGUsIHZlcmJvc2U9dmVyYm9zZSwgZHJ5X3J1bj1kcnlfcnVuKQorCitkZWYgY29weV90cmVlKHNyYywgZHN0LCBwcmVzZXJ2ZV9tb2RlPTEsIHByZXNlcnZlX3RpbWVzPTEsCisgICAgICAgICAgICAgIHByZXNlcnZlX3N5bWxpbmtzPTAsIHVwZGF0ZT0wLCB2ZXJib3NlPTEsIGRyeV9ydW49MCk6CisgICAgIiIiQ29weSBhbiBlbnRpcmUgZGlyZWN0b3J5IHRyZWUgJ3NyYycgdG8gYSBuZXcgbG9jYXRpb24gJ2RzdCcuCisKKyAgICBCb3RoICdzcmMnIGFuZCAnZHN0JyBtdXN0IGJlIGRpcmVjdG9yeSBuYW1lcy4gIElmICdzcmMnIGlzIG5vdCBhCisgICAgZGlyZWN0b3J5LCByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IuICBJZiAnZHN0JyBkb2VzIG5vdCBleGlzdCwgaXQgaXMKKyAgICBjcmVhdGVkIHdpdGggJ21rcGF0aCgpJy4gIFRoZSBlbmQgcmVzdWx0IG9mIHRoZSBjb3B5IGlzIHRoYXQgZXZlcnkKKyAgICBmaWxlIGluICdzcmMnIGlzIGNvcGllZCB0byAnZHN0JywgYW5kIGRpcmVjdG9yaWVzIHVuZGVyICdzcmMnIGFyZQorICAgIHJlY3Vyc2l2ZWx5IGNvcGllZCB0byAnZHN0Jy4gIFJldHVybiB0aGUgbGlzdCBvZiBmaWxlcyB0aGF0IHdlcmUKKyAgICBjb3BpZWQgb3IgbWlnaHQgaGF2ZSBiZWVuIGNvcGllZCwgdXNpbmcgdGhlaXIgb3V0cHV0IG5hbWUuICBUaGUKKyAgICByZXR1cm4gdmFsdWUgaXMgdW5hZmZlY3RlZCBieSAndXBkYXRlJyBvciAnZHJ5X3J1bic6IGl0IGlzIHNpbXBseQorICAgIHRoZSBsaXN0IG9mIGFsbCBmaWxlcyB1bmRlciAnc3JjJywgd2l0aCB0aGUgbmFtZXMgY2hhbmdlZCB0byBiZQorICAgIHVuZGVyICdkc3QnLgorCisgICAgJ3ByZXNlcnZlX21vZGUnIGFuZCAncHJlc2VydmVfdGltZXMnIGFyZSB0aGUgc2FtZSBhcyBmb3IKKyAgICAnY29weV9maWxlJzsgbm90ZSB0aGF0IHRoZXkgb25seSBhcHBseSB0byByZWd1bGFyIGZpbGVzLCBub3QgdG8KKyAgICBkaXJlY3Rvcmllcy4gIElmICdwcmVzZXJ2ZV9zeW1saW5rcycgaXMgdHJ1ZSwgc3ltbGlua3Mgd2lsbCBiZQorICAgIGNvcGllZCBhcyBzeW1saW5rcyAob24gcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCB0aGVtISk7IG90aGVyd2lzZQorICAgICh0aGUgZGVmYXVsdCksIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgc3ltbGluayB3aWxsIGJlIGNvcGllZC4KKyAgICAndXBkYXRlJyBhbmQgJ3ZlcmJvc2UnIGFyZSB0aGUgc2FtZSBhcyBmb3IgJ2NvcHlfZmlsZScuCisgICAgIiIiCisgICAgZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBjb3B5X2ZpbGUKKworICAgIGlmIG5vdCBkcnlfcnVuIGFuZCBub3Qgb3MucGF0aC5pc2RpcihzcmMpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IsIFwKKyAgICAgICAgICAgICAgImNhbm5vdCBjb3B5IHRyZWUgJyVzJzogbm90IGEgZGlyZWN0b3J5IiAlIHNyYworICAgIHRyeToKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHNyYykKKyAgICBleGNlcHQgb3MuZXJyb3IsIChlcnJubywgZXJyc3RyKToKKyAgICAgICAgaWYgZHJ5X3J1bjoKKyAgICAgICAgICAgIG5hbWVzID0gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgImVycm9yIGxpc3RpbmcgZmlsZXMgaW4gJyVzJzogJXMiICUgKHNyYywgZXJyc3RyKQorCisgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgIG1rcGF0aChkc3QsIHZlcmJvc2U9dmVyYm9zZSkKKworICAgIG91dHB1dHMgPSBbXQorCisgICAgZm9yIG4gaW4gbmFtZXM6CisgICAgICAgIHNyY19uYW1lID0gb3MucGF0aC5qb2luKHNyYywgbikKKyAgICAgICAgZHN0X25hbWUgPSBvcy5wYXRoLmpvaW4oZHN0LCBuKQorCisgICAgICAgIGlmIG4uc3RhcnRzd2l0aCgnLm5mcycpOgorICAgICAgICAgICAgIyBza2lwIE5GUyByZW5hbWUgZmlsZXMKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgcHJlc2VydmVfc3ltbGlua3MgYW5kIG9zLnBhdGguaXNsaW5rKHNyY19uYW1lKToKKyAgICAgICAgICAgIGxpbmtfZGVzdCA9IG9zLnJlYWRsaW5rKHNyY19uYW1lKQorICAgICAgICAgICAgaWYgdmVyYm9zZSA+PSAxOgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJsaW5raW5nICVzIC0+ICVzIiwgZHN0X25hbWUsIGxpbmtfZGVzdCkKKyAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsobGlua19kZXN0LCBkc3RfbmFtZSkKKyAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGRzdF9uYW1lKQorCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihzcmNfbmFtZSk6CisgICAgICAgICAgICBvdXRwdXRzLmV4dGVuZCgKKyAgICAgICAgICAgICAgICBjb3B5X3RyZWUoc3JjX25hbWUsIGRzdF9uYW1lLCBwcmVzZXJ2ZV9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV90aW1lcywgcHJlc2VydmVfc3ltbGlua3MsIHVwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT12ZXJib3NlLCBkcnlfcnVuPWRyeV9ydW4pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29weV9maWxlKHNyY19uYW1lLCBkc3RfbmFtZSwgcHJlc2VydmVfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZV90aW1lcywgdXBkYXRlLCB2ZXJib3NlPXZlcmJvc2UsCisgICAgICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1kcnlfcnVuKQorICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoZHN0X25hbWUpCisKKyAgICByZXR1cm4gb3V0cHV0cworCitkZWYgX2J1aWxkX2NtZHR1cGxlKHBhdGgsIGNtZHR1cGxlcyk6CisgICAgIiIiSGVscGVyIGZvciByZW1vdmVfdHJlZSgpLiIiIgorICAgIGZvciBmIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgIHJlYWxfZiA9IG9zLnBhdGguam9pbihwYXRoLGYpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocmVhbF9mKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHJlYWxfZik6CisgICAgICAgICAgICBfYnVpbGRfY21kdHVwbGUocmVhbF9mLCBjbWR0dXBsZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWR0dXBsZXMuYXBwZW5kKChvcy5yZW1vdmUsIHJlYWxfZikpCisgICAgY21kdHVwbGVzLmFwcGVuZCgob3Mucm1kaXIsIHBhdGgpKQorCitkZWYgcmVtb3ZlX3RyZWUoZGlyZWN0b3J5LCB2ZXJib3NlPTEsIGRyeV9ydW49MCk6CisgICAgIiIiUmVjdXJzaXZlbHkgcmVtb3ZlIGFuIGVudGlyZSBkaXJlY3RvcnkgdHJlZS4KKworICAgIEFueSBlcnJvcnMgYXJlIGlnbm9yZWQgKGFwYXJ0IGZyb20gYmVpbmcgcmVwb3J0ZWQgdG8gc3Rkb3V0IGlmICd2ZXJib3NlJworICAgIGlzIHRydWUpLgorICAgICIiIgorICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGdyb2tfZW52aXJvbm1lbnRfZXJyb3IKKyAgICBnbG9iYWwgX3BhdGhfY3JlYXRlZAorCisgICAgaWYgdmVyYm9zZSA+PSAxOgorICAgICAgICBsb2cuaW5mbygicmVtb3ZpbmcgJyVzJyAoYW5kIGV2ZXJ5dGhpbmcgdW5kZXIgaXQpIiwgZGlyZWN0b3J5KQorICAgIGlmIGRyeV9ydW46CisgICAgICAgIHJldHVybgorICAgIGNtZHR1cGxlcyA9IFtdCisgICAgX2J1aWxkX2NtZHR1cGxlKGRpcmVjdG9yeSwgY21kdHVwbGVzKQorICAgIGZvciBjbWQgaW4gY21kdHVwbGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWRbMF0oY21kWzFdKQorICAgICAgICAgICAgIyByZW1vdmUgZGlyIGZyb20gY2FjaGUgaWYgaXQncyBhbHJlYWR5IHRoZXJlCisgICAgICAgICAgICBhYnNwYXRoID0gb3MucGF0aC5hYnNwYXRoKGNtZFsxXSkKKyAgICAgICAgICAgIGlmIGFic3BhdGggaW4gX3BhdGhfY3JlYXRlZDoKKyAgICAgICAgICAgICAgICBkZWwgX3BhdGhfY3JlYXRlZFthYnNwYXRoXQorICAgICAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpLCBleGM6CisgICAgICAgICAgICBsb2cud2Fybihncm9rX2Vudmlyb25tZW50X2Vycm9yKAorICAgICAgICAgICAgICAgICAgICBleGMsICJlcnJvciByZW1vdmluZyAlczogIiAlIGRpcmVjdG9yeSkpCisKK2RlZiBlbnN1cmVfcmVsYXRpdmUocGF0aCk6CisgICAgIiIiVGFrZSB0aGUgZnVsbCBwYXRoICdwYXRoJywgYW5kIG1ha2UgaXQgYSByZWxhdGl2ZSBwYXRoLgorCisgICAgVGhpcyBpcyB1c2VmdWwgdG8gbWFrZSAncGF0aCcgdGhlIHNlY29uZCBhcmd1bWVudCB0byBvcy5wYXRoLmpvaW4oKS4KKyAgICAiIiIKKyAgICBkcml2ZSwgcGF0aCA9IG9zLnBhdGguc3BsaXRkcml2ZShwYXRoKQorICAgIGlmIHBhdGhbMDoxXSA9PSBvcy5zZXA6CisgICAgICAgIHBhdGggPSBkcml2ZSArIHBhdGhbMTpdCisgICAgcmV0dXJuIHBhdGgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDlmOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlyX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpcl91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDlmOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlyX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMjUzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9kaXN0LnB5CkBAIC0wLDAgKzEsMTI0OSBAQAorIiIiZGlzdHV0aWxzLmRpc3QKKworUHJvdmlkZXMgdGhlIERpc3RyaWJ1dGlvbiBjbGFzcywgd2hpY2ggcmVwcmVzZW50cyB0aGUgbW9kdWxlIGRpc3RyaWJ1dGlvbgorYmVpbmcgYnVpbHQvaW5zdGFsbGVkL2Rpc3RyaWJ1dGVkLgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3lzLCBvcywgcmUKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2VfZnJvbV9maWxlCisKK3RyeToKKyAgICBpbXBvcnQgd2FybmluZ3MKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB3YXJuaW5ncyA9IE5vbmUKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIERpc3R1dGlsc0FyZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHV0aWxzTW9kdWxlRXJyb3IsIERpc3R1dGlsc0NsYXNzRXJyb3IpCitmcm9tIGRpc3R1dGlscy5mYW5jeV9nZXRvcHQgaW1wb3J0IEZhbmN5R2V0b3B0LCB0cmFuc2xhdGVfbG9uZ29wdAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY2hlY2tfZW52aXJvbiwgc3RydG9ib29sLCByZmM4MjJfZXNjYXBlCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5kZWJ1ZyBpbXBvcnQgREVCVUcKKworIyBFbmNvZGluZyB1c2VkIGZvciB0aGUgUEtHLUlORk8gZmlsZXMKK1BLR19JTkZPX0VOQ09ESU5HID0gJ3V0Zi04JworCisjIFJlZ2V4IHRvIGRlZmluZSBhY2NlcHRhYmxlIERpc3R1dGlscyBjb21tYW5kIG5hbWVzLiAgVGhpcyBpcyBub3QgKnF1aXRlKgorIyB0aGUgc2FtZSBhcyBhIFB5dGhvbiBOQU1FIC0tIEkgZG9uJ3QgYWxsb3cgbGVhZGluZyB1bmRlcnNjb3Jlcy4gIFRoZSBmYWN0CisjIHRoYXQgdGhleSdyZSB2ZXJ5IHNpbWlsYXIgaXMgbm8gY29pbmNpZGVuY2U7IHRoZSBkZWZhdWx0IG5hbWluZyBzY2hlbWUgaXMKKyMgdG8gbG9vayBmb3IgYSBQeXRob24gbW9kdWxlIG5hbWVkIGFmdGVyIHRoZSBjb21tYW5kLgorY29tbWFuZF9yZSA9IHJlLmNvbXBpbGUgKHInXlthLXpBLVpdKFthLXpBLVowLTlfXSopJCcpCisKKworY2xhc3MgRGlzdHJpYnV0aW9uOgorICAgICIiIlRoZSBjb3JlIG9mIHRoZSBEaXN0dXRpbHMuICBNb3N0IG9mIHRoZSB3b3JrIGhpZGluZyBiZWhpbmQgJ3NldHVwJworICAgIGlzIHJlYWxseSBkb25lIHdpdGhpbiBhIERpc3RyaWJ1dGlvbiBpbnN0YW5jZSwgd2hpY2ggZmFybXMgdGhlIHdvcmsgb3V0CisgICAgdG8gdGhlIERpc3R1dGlscyBjb21tYW5kcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKworICAgIFNldHVwIHNjcmlwdHMgd2lsbCBhbG1vc3QgbmV2ZXIgaW5zdGFudGlhdGUgRGlzdHJpYnV0aW9uIGRpcmVjdGx5LAorICAgIHVubGVzcyB0aGUgJ3NldHVwKCknIGZ1bmN0aW9uIGlzIHRvdGFsbHkgaW5hZGVxdWF0ZSB0byB0aGVpciBuZWVkcy4KKyAgICBIb3dldmVyLCBpdCBpcyBjb25jZWl2YWJsZSB0aGF0IGEgc2V0dXAgc2NyaXB0IG1pZ2h0IHdpc2ggdG8gc3ViY2xhc3MKKyAgICBEaXN0cmlidXRpb24gZm9yIHNvbWUgc3BlY2lhbGl6ZWQgcHVycG9zZSwgYW5kIHRoZW4gcGFzcyB0aGUgc3ViY2xhc3MKKyAgICB0byAnc2V0dXAoKScgYXMgdGhlICdkaXN0Y2xhc3MnIGtleXdvcmQgYXJndW1lbnQuICBJZiBzbywgaXQgaXMKKyAgICBuZWNlc3NhcnkgdG8gcmVzcGVjdCB0aGUgZXhwZWN0YXRpb25zIHRoYXQgJ3NldHVwJyBoYXMgb2YgRGlzdHJpYnV0aW9uLgorICAgIFNlZSB0aGUgY29kZSBmb3IgJ3NldHVwKCknLCBpbiBjb3JlLnB5LCBmb3IgZGV0YWlscy4KKyAgICAiIiIKKworCisgICAgIyAnZ2xvYmFsX29wdGlvbnMnIGRlc2NyaWJlcyB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMgdGhhdCBtYXkgYmUKKyAgICAjIHN1cHBsaWVkIHRvIHRoZSBzZXR1cCBzY3JpcHQgcHJpb3IgdG8gYW55IGFjdHVhbCBjb21tYW5kcy4KKyAgICAjIEVnLiAiLi9zZXR1cC5weSAtbiIgb3IgIi4vc2V0dXAucHkgLS1xdWlldCIgYm90aCB0YWtlIGFkdmFudGFnZSBvZgorICAgICMgdGhlc2UgZ2xvYmFsIG9wdGlvbnMuICBUaGlzIGxpc3Qgc2hvdWxkIGJlIGtlcHQgdG8gYSBiYXJlIG1pbmltdW0sCisgICAgIyBzaW5jZSBldmVyeSBnbG9iYWwgb3B0aW9uIGlzIGFsc28gdmFsaWQgYXMgYSBjb21tYW5kIG9wdGlvbiAtLSBhbmQgd2UKKyAgICAjIGRvbid0IHdhbnQgdG8gcG9sbHV0ZSB0aGUgY29tbWFuZHMgd2l0aCB0b28gbWFueSBvcHRpb25zIHRoYXQgdGhleQorICAgICMgaGF2ZSBtaW5pbWFsIGNvbnRyb2wgb3Zlci4KKyAgICAjIFRoZSBmb3VydGggZW50cnkgZm9yIHZlcmJvc2UgbWVhbnMgdGhhdCBpdCBjYW4gYmUgcmVwZWF0ZWQuCisgICAgZ2xvYmFsX29wdGlvbnMgPSBbKCd2ZXJib3NlJywgJ3YnLCAicnVuIHZlcmJvc2VseSAoZGVmYXVsdCkiLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ3F1aWV0JywgJ3EnLCAicnVuIHF1aWV0bHkgKHR1cm5zIHZlcmJvc2l0eSBvZmYpIiksCisgICAgICAgICAgICAgICAgICAgICAgKCdkcnktcnVuJywgJ24nLCAiZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAoJ2hlbHAnLCAnaCcsICJzaG93IGRldGFpbGVkIGhlbHAgbWVzc2FnZSIpLAorICAgICAgICAgICAgICAgICAgICAgICgnbm8tdXNlci1jZmcnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAnaWdub3JlIHB5ZGlzdHV0aWxzLmNmZyBpbiB5b3VyIGhvbWUgZGlyZWN0b3J5JyksCisgICAgXQorCisgICAgIyAnY29tbW9uX3VzYWdlJyBpcyBhIHNob3J0ICgyLTMgbGluZSkgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbW1vbgorICAgICMgdXNhZ2Ugb2YgdGhlIHNldHVwIHNjcmlwdC4KKyAgICBjb21tb25fdXNhZ2UgPSAiIiJcCitDb21tb24gY29tbWFuZHM6IChzZWUgJy0taGVscC1jb21tYW5kcycgZm9yIG1vcmUpCisKKyAgc2V0dXAucHkgYnVpbGQgICAgICB3aWxsIGJ1aWxkIHRoZSBwYWNrYWdlIHVuZGVybmVhdGggJ2J1aWxkLycKKyAgc2V0dXAucHkgaW5zdGFsbCAgICB3aWxsIGluc3RhbGwgdGhlIHBhY2thZ2UKKyIiIgorCisgICAgIyBvcHRpb25zIHRoYXQgYXJlIG5vdCBwcm9wYWdhdGVkIHRvIHRoZSBjb21tYW5kcworICAgIGRpc3BsYXlfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdoZWxwLWNvbW1hbmRzJywgTm9uZSwKKyAgICAgICAgICJsaXN0IGFsbCBhdmFpbGFibGUgY29tbWFuZHMiKSwKKyAgICAgICAgKCduYW1lJywgTm9uZSwKKyAgICAgICAgICJwcmludCBwYWNrYWdlIG5hbWUiKSwKKyAgICAgICAgKCd2ZXJzaW9uJywgJ1YnLAorICAgICAgICAgInByaW50IHBhY2thZ2UgdmVyc2lvbiIpLAorICAgICAgICAoJ2Z1bGxuYW1lJywgTm9uZSwKKyAgICAgICAgICJwcmludCA8cGFja2FnZSBuYW1lPi08dmVyc2lvbj4iKSwKKyAgICAgICAgKCdhdXRob3InLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBhdXRob3IncyBuYW1lIiksCisgICAgICAgICgnYXV0aG9yLWVtYWlsJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgYXV0aG9yJ3MgZW1haWwgYWRkcmVzcyIpLAorICAgICAgICAoJ21haW50YWluZXInLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBtYWludGFpbmVyJ3MgbmFtZSIpLAorICAgICAgICAoJ21haW50YWluZXItZW1haWwnLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBtYWludGFpbmVyJ3MgZW1haWwgYWRkcmVzcyIpLAorICAgICAgICAoJ2NvbnRhY3QnLCBOb25lLAorICAgICAgICAgInByaW50IHRoZSBtYWludGFpbmVyJ3MgbmFtZSBpZiBrbm93biwgZWxzZSB0aGUgYXV0aG9yJ3MiKSwKKyAgICAgICAgKCdjb250YWN0LWVtYWlsJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbWFpbnRhaW5lcidzIGVtYWlsIGFkZHJlc3MgaWYga25vd24sIGVsc2UgdGhlIGF1dGhvcidzIiksCisgICAgICAgICgndXJsJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgVVJMIGZvciB0aGlzIHBhY2thZ2UiKSwKKyAgICAgICAgKCdsaWNlbnNlJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbGljZW5zZSBvZiB0aGUgcGFja2FnZSIpLAorICAgICAgICAoJ2xpY2VuY2UnLCBOb25lLAorICAgICAgICAgImFsaWFzIGZvciAtLWxpY2Vuc2UiKSwKKyAgICAgICAgKCdkZXNjcmlwdGlvbicsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIHBhY2thZ2UgZGVzY3JpcHRpb24iKSwKKyAgICAgICAgKCdsb25nLWRlc2NyaXB0aW9uJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbG9uZyBwYWNrYWdlIGRlc2NyaXB0aW9uIiksCisgICAgICAgICgncGxhdGZvcm1zJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbGlzdCBvZiBwbGF0Zm9ybXMiKSwKKyAgICAgICAgKCdjbGFzc2lmaWVycycsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxpc3Qgb2YgY2xhc3NpZmllcnMiKSwKKyAgICAgICAgKCdrZXl3b3JkcycsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxpc3Qgb2Yga2V5d29yZHMiKSwKKyAgICAgICAgKCdwcm92aWRlcycsIE5vbmUsCisgICAgICAgICAicHJpbnQgdGhlIGxpc3Qgb2YgcGFja2FnZXMvbW9kdWxlcyBwcm92aWRlZCIpLAorICAgICAgICAoJ3JlcXVpcmVzJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbGlzdCBvZiBwYWNrYWdlcy9tb2R1bGVzIHJlcXVpcmVkIiksCisgICAgICAgICgnb2Jzb2xldGVzJywgTm9uZSwKKyAgICAgICAgICJwcmludCB0aGUgbGlzdCBvZiBwYWNrYWdlcy9tb2R1bGVzIG1hZGUgb2Jzb2xldGUiKQorICAgICAgICBdCisgICAgZGlzcGxheV9vcHRpb25fbmFtZXMgPSBtYXAobGFtYmRhIHg6IHRyYW5zbGF0ZV9sb25nb3B0KHhbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlfb3B0aW9ucykKKworICAgICMgbmVnYXRpdmUgb3B0aW9ucyBhcmUgb3B0aW9ucyB0aGF0IGV4Y2x1ZGUgb3RoZXIgb3B0aW9ucworICAgIG5lZ2F0aXZlX29wdCA9IHsncXVpZXQnOiAndmVyYm9zZSd9CisKKworICAgICMgLS0gQ3JlYXRpb24vaW5pdGlhbGl6YXRpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIGF0dHJzPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBuZXcgRGlzdHJpYnV0aW9uIGluc3RhbmNlOiBpbml0aWFsaXplIGFsbCB0aGUKKyAgICAgICAgYXR0cmlidXRlcyBvZiBhIERpc3RyaWJ1dGlvbiwgYW5kIHRoZW4gdXNlICdhdHRycycgKGEgZGljdGlvbmFyeQorICAgICAgICBtYXBwaW5nIGF0dHJpYnV0ZSBuYW1lcyB0byB2YWx1ZXMpIHRvIGFzc2lnbiBzb21lIG9mIHRob3NlCisgICAgICAgIGF0dHJpYnV0ZXMgdGhlaXIgInJlYWwiIHZhbHVlcy4gIChBbnkgYXR0cmlidXRlcyBub3QgbWVudGlvbmVkIGluCisgICAgICAgICdhdHRycycgd2lsbCBiZSBhc3NpZ25lZCB0byBzb21lIG51bGwgdmFsdWU6IDAsIE5vbmUsIGFuIGVtcHR5IGxpc3QKKyAgICAgICAgb3IgZGljdGlvbmFyeSwgZXRjLikgIE1vc3QgaW1wb3J0YW50bHksIGluaXRpYWxpemUgdGhlCisgICAgICAgICdjb21tYW5kX29iaicgYXR0cmlidXRlIHRvIHRoZSBlbXB0eSBkaWN0aW9uYXJ5OyB0aGlzIHdpbGwgYmUKKyAgICAgICAgZmlsbGVkIGluIHdpdGggcmVhbCBjb21tYW5kIG9iamVjdHMgYnkgJ3BhcnNlX2NvbW1hbmRfbGluZSgpJy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBEZWZhdWx0IHZhbHVlcyBmb3Igb3VyIGNvbW1hbmQtbGluZSBvcHRpb25zCisgICAgICAgIHNlbGYudmVyYm9zZSA9IDEKKyAgICAgICAgc2VsZi5kcnlfcnVuID0gMAorICAgICAgICBzZWxmLmhlbHAgPSAwCisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuZGlzcGxheV9vcHRpb25fbmFtZXM6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIDApCisKKyAgICAgICAgIyBTdG9yZSB0aGUgZGlzdHJpYnV0aW9uIG1ldGEtZGF0YSAobmFtZSwgdmVyc2lvbiwgYXV0aG9yLCBhbmQgc28KKyAgICAgICAgIyBmb3J0aCkgaW4gYSBzZXBhcmF0ZSBvYmplY3QgLS0gd2UncmUgZ2V0dGluZyB0byBoYXZlIGVub3VnaAorICAgICAgICAjIGluZm9ybWF0aW9uIGhlcmUgKGFuZCBlbm91Z2ggY29tbWFuZC1saW5lIG9wdGlvbnMpIHRoYXQgaXQncworICAgICAgICAjIHdvcnRoIGl0LiAgQWxzbyBkZWxlZ2F0ZSAnZ2V0X1hYWCgpJyBtZXRob2RzIHRvIHRoZSAnbWV0YWRhdGEnCisgICAgICAgICMgb2JqZWN0IGluIGEgc25lYWt5IGFuZCB1bmRlcmhhbmRlZCAoYnV0IGVmZmljaWVudCEpIHdheS4KKyAgICAgICAgc2VsZi5tZXRhZGF0YSA9IERpc3RyaWJ1dGlvbk1ldGFkYXRhKCkKKyAgICAgICAgZm9yIGJhc2VuYW1lIGluIHNlbGYubWV0YWRhdGEuX01FVEhPRF9CQVNFTkFNRVM6CisgICAgICAgICAgICBtZXRob2RfbmFtZSA9ICJnZXRfIiArIGJhc2VuYW1lCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG1ldGhvZF9uYW1lLCBnZXRhdHRyKHNlbGYubWV0YWRhdGEsIG1ldGhvZF9uYW1lKSkKKworICAgICAgICAjICdjbWRjbGFzcycgbWFwcyBjb21tYW5kIG5hbWVzIHRvIGNsYXNzIG9iamVjdHMsIHNvIHdlCisgICAgICAgICMgY2FuIDEpIHF1aWNrbHkgZmlndXJlIG91dCB3aGljaCBjbGFzcyB0byBpbnN0YW50aWF0ZSB3aGVuCisgICAgICAgICMgd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgY29tbWFuZCBvYmplY3QsIGFuZCAyKSBoYXZlIGEgd2F5CisgICAgICAgICMgZm9yIHRoZSBzZXR1cCBzY3JpcHQgdG8gb3ZlcnJpZGUgY29tbWFuZCBjbGFzc2VzCisgICAgICAgIHNlbGYuY21kY2xhc3MgPSB7fQorCisgICAgICAgICMgJ2NvbW1hbmRfcGFja2FnZXMnIGlzIGEgbGlzdCBvZiBwYWNrYWdlcyBpbiB3aGljaCBjb21tYW5kcworICAgICAgICAjIGFyZSBzZWFyY2hlZCBmb3IuICBUaGUgZmFjdG9yeSBmb3IgY29tbWFuZCAnZm9vJyBpcyBleHBlY3RlZAorICAgICAgICAjIHRvIGJlIG5hbWVkICdmb28nIGluIHRoZSBtb2R1bGUgJ2ZvbycgaW4gb25lIG9mIHRoZSBwYWNrYWdlcworICAgICAgICAjIG5hbWVkIGhlcmUuICBUaGlzIGxpc3QgaXMgc2VhcmNoZWQgZnJvbSB0aGUgbGVmdDsgYW4gZXJyb3IKKyAgICAgICAgIyBpcyByYWlzZWQgaWYgbm8gbmFtZWQgcGFja2FnZSBwcm92aWRlcyB0aGUgY29tbWFuZCBiZWluZworICAgICAgICAjIHNlYXJjaGVkIGZvci4gIChBbHdheXMgYWNjZXNzIHVzaW5nIGdldF9jb21tYW5kX3BhY2thZ2VzKCkuKQorICAgICAgICBzZWxmLmNvbW1hbmRfcGFja2FnZXMgPSBOb25lCisKKyAgICAgICAgIyAnc2NyaXB0X25hbWUnIGFuZCAnc2NyaXB0X2FyZ3MnIGFyZSB1c3VhbGx5IHNldCB0byBzeXMuYXJndlswXQorICAgICAgICAjIGFuZCBzeXMuYXJndlsxOl0sIGJ1dCB0aGV5IGNhbiBiZSBvdmVycmlkZGVuIHdoZW4gdGhlIGNhbGxlciBpcworICAgICAgICAjIG5vdCBuZWNlc3NhcmlseSBhIHNldHVwIHNjcmlwdCBydW4gZnJvbSB0aGUgY29tbWFuZC1saW5lLgorICAgICAgICBzZWxmLnNjcmlwdF9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLnNjcmlwdF9hcmdzID0gTm9uZQorCisgICAgICAgICMgJ2NvbW1hbmRfb3B0aW9ucycgaXMgd2hlcmUgd2Ugc3RvcmUgY29tbWFuZCBvcHRpb25zIGJldHdlZW4KKyAgICAgICAgIyBwYXJzaW5nIHRoZW0gKGZyb20gY29uZmlnIGZpbGVzLCB0aGUgY29tbWFuZC1saW5lLCBldGMuKSBhbmQgd2hlbgorICAgICAgICAjIHRoZXkgYXJlIGFjdHVhbGx5IG5lZWRlZCAtLSBpZS4gd2hlbiB0aGUgY29tbWFuZCBpbiBxdWVzdGlvbiBpcworICAgICAgICAjIGluc3RhbnRpYXRlZC4gIEl0IGlzIGEgZGljdGlvbmFyeSBvZiBkaWN0aW9uYXJpZXMgb2YgMi10dXBsZXM6CisgICAgICAgICMgICBjb21tYW5kX29wdGlvbnMgPSB7IGNvbW1hbmRfbmFtZSA6IHsgb3B0aW9uIDogKHNvdXJjZSwgdmFsdWUpIH0gfQorICAgICAgICBzZWxmLmNvbW1hbmRfb3B0aW9ucyA9IHt9CisKKyAgICAgICAgIyAnZGlzdF9maWxlcycgaXMgdGhlIGxpc3Qgb2YgKGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZSkgdGhhdAorICAgICAgICAjIGhhdmUgYmVlbiBjcmVhdGVkIGJ5IGFueSBkaXN0IGNvbW1hbmRzIHJ1biBzbyBmYXIuIFRoaXMgaXMKKyAgICAgICAgIyBmaWxsZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBydW4gaXMgZHJ5IG9yIG5vdC4gcHl2ZXJzaW9uCisgICAgICAgICMgZ2l2ZXMgc3lzY29uZmlnLmdldF9weXRob25fdmVyc2lvbigpIGlmIHRoZSBkaXN0IGZpbGUgaXMKKyAgICAgICAgIyBzcGVjaWZpYyB0byBhIFB5dGhvbiB2ZXJzaW9uLCAnYW55JyBpZiBpdCBpcyBnb29kIGZvciBhbGwKKyAgICAgICAgIyBQeXRob24gdmVyc2lvbnMgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgYW5kICcnIGZvciBhIHNvdXJjZQorICAgICAgICAjIGZpbGUuIHB5dmVyc2lvbiBzaG91bGQgbm90IGJlIHVzZWQgdG8gc3BlY2lmeSBtaW5pbXVtIG9yCisgICAgICAgICMgbWF4aW11bSByZXF1aXJlZCBQeXRob24gdmVyc2lvbnM7IHVzZSB0aGUgbWV0YWluZm8gZm9yIHRoYXQKKyAgICAgICAgIyBpbnN0ZWFkLgorICAgICAgICBzZWxmLmRpc3RfZmlsZXMgPSBbXQorCisgICAgICAgICMgVGhlc2Ugb3B0aW9ucyBhcmUgcmVhbGx5IHRoZSBidXNpbmVzcyBvZiB2YXJpb3VzIGNvbW1hbmRzLCByYXRoZXIKKyAgICAgICAgIyB0aGFuIG9mIHRoZSBEaXN0cmlidXRpb24gaXRzZWxmLiAgV2UgcHJvdmlkZSBhbGlhc2VzIGZvciB0aGVtIGluCisgICAgICAgICMgRGlzdHJpYnV0aW9uIGFzIGEgY29udmVuaWVuY2UgdG8gdGhlIGRldmVsb3Blci4KKyAgICAgICAgc2VsZi5wYWNrYWdlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSB7fQorICAgICAgICBzZWxmLnBhY2thZ2VfZGlyID0gTm9uZQorICAgICAgICBzZWxmLnB5X21vZHVsZXMgPSBOb25lCisgICAgICAgIHNlbGYubGlicmFyaWVzID0gTm9uZQorICAgICAgICBzZWxmLmhlYWRlcnMgPSBOb25lCisgICAgICAgIHNlbGYuZXh0X21vZHVsZXMgPSBOb25lCisgICAgICAgIHNlbGYuZXh0X3BhY2thZ2UgPSBOb25lCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gTm9uZQorICAgICAgICBzZWxmLmV4dHJhX3BhdGggPSBOb25lCisgICAgICAgIHNlbGYuc2NyaXB0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5kYXRhX2ZpbGVzID0gTm9uZQorICAgICAgICBzZWxmLnBhc3N3b3JkID0gJycKKworICAgICAgICAjIEFuZCBub3cgaW5pdGlhbGl6ZSBib29ra2VlcGluZyBzdHVmZiB0aGF0IGNhbid0IGJlIHN1cHBsaWVkIGJ5CisgICAgICAgICMgdGhlIGNhbGxlciBhdCBhbGwuICAnY29tbWFuZF9vYmonIG1hcHMgY29tbWFuZCBuYW1lcyB0bworICAgICAgICAjIENvbW1hbmQgaW5zdGFuY2VzIC0tIHRoYXQncyBob3cgd2UgZW5mb3JjZSB0aGF0IGV2ZXJ5IGNvbW1hbmQKKyAgICAgICAgIyBjbGFzcyBpcyBhIHNpbmdsZXRvbi4KKyAgICAgICAgc2VsZi5jb21tYW5kX29iaiA9IHt9CisKKyAgICAgICAgIyAnaGF2ZV9ydW4nIG1hcHMgY29tbWFuZCBuYW1lcyB0byBib29sZWFuIHZhbHVlczsgaXQga2VlcHMgdHJhY2sKKyAgICAgICAgIyBvZiB3aGV0aGVyIHdlIGhhdmUgYWN0dWFsbHkgcnVuIGEgcGFydGljdWxhciBjb21tYW5kLCB0byBtYWtlIGl0CisgICAgICAgICMgY2hlYXAgdG8gInJ1biIgYSBjb21tYW5kIHdoZW5ldmVyIHdlIHRoaW5rIHdlIG1pZ2h0IG5lZWQgdG8gLS0gaWYKKyAgICAgICAgIyBpdCdzIGFscmVhZHkgYmVlbiBkb25lLCBubyBuZWVkIGZvciBleHBlbnNpdmUgZmlsZXN5c3RlbQorICAgICAgICAjIG9wZXJhdGlvbnMsIHdlIGp1c3QgY2hlY2sgdGhlICdoYXZlX3J1bicgZGljdGlvbmFyeSBhbmQgY2Fycnkgb24uCisgICAgICAgICMgSXQncyBvbmx5IHNhZmUgdG8gcXVlcnkgJ2hhdmVfcnVuJyBmb3IgYSBjb21tYW5kIGNsYXNzIHRoYXQgaGFzCisgICAgICAgICMgYmVlbiBpbnN0YW50aWF0ZWQgLS0gYSBmYWxzZSB2YWx1ZSB3aWxsIGJlIGluc2VydGVkIHdoZW4gdGhlCisgICAgICAgICMgY29tbWFuZCBvYmplY3QgaXMgY3JlYXRlZCwgYW5kIHJlcGxhY2VkIHdpdGggYSB0cnVlIHZhbHVlIHdoZW4KKyAgICAgICAgIyB0aGUgY29tbWFuZCBpcyBzdWNjZXNzZnVsbHkgcnVuLiAgVGh1cyBpdCdzIHByb2JhYmx5IGJlc3QgdG8gdXNlCisgICAgICAgICMgJy5nZXQoKScgcmF0aGVyIHRoYW4gYSBzdHJhaWdodCBsb29rdXAuCisgICAgICAgIHNlbGYuaGF2ZV9ydW4gPSB7fQorCisgICAgICAgICMgTm93IHdlJ2xsIHVzZSB0aGUgYXR0cnMgZGljdGlvbmFyeSAodWx0aW1hdGVseSwga2V5d29yZCBhcmdzIGZyb20KKyAgICAgICAgIyB0aGUgc2V0dXAgc2NyaXB0KSB0byBwb3NzaWJseSBvdmVycmlkZSBhbnkgb3IgYWxsIG9mIHRoZXNlCisgICAgICAgICMgZGlzdHJpYnV0aW9uIG9wdGlvbnMuCisKKyAgICAgICAgaWYgYXR0cnM6CisgICAgICAgICAgICAjIFB1bGwgb3V0IHRoZSBzZXQgb2YgY29tbWFuZCBvcHRpb25zIGFuZCB3b3JrIG9uIHRoZW0KKyAgICAgICAgICAgICMgc3BlY2lmaWNhbGx5LiAgTm90ZSB0aGF0IHRoaXMgb3JkZXIgZ3VhcmFudGVlcyB0aGF0IGFsaWFzZWQKKyAgICAgICAgICAgICMgY29tbWFuZCBvcHRpb25zIHdpbGwgb3ZlcnJpZGUgYW55IHN1cHBsaWVkIHJlZHVuZGFudGx5CisgICAgICAgICAgICAjIHRocm91Z2ggdGhlIGdlbmVyYWwgb3B0aW9ucyBkaWN0aW9uYXJ5LgorICAgICAgICAgICAgb3B0aW9ucyA9IGF0dHJzLmdldCgnb3B0aW9ucycpCisgICAgICAgICAgICBpZiBvcHRpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGRlbCBhdHRyc1snb3B0aW9ucyddCisgICAgICAgICAgICAgICAgZm9yIChjb21tYW5kLCBjbWRfb3B0aW9ucykgaW4gb3B0aW9ucy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBvcHRfZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmQpCisgICAgICAgICAgICAgICAgICAgIGZvciAob3B0LCB2YWwpIGluIGNtZF9vcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZGljdFtvcHRdID0gKCJzZXR1cCBzY3JpcHQiLCB2YWwpCisKKyAgICAgICAgICAgIGlmICdsaWNlbmNlJyBpbiBhdHRyczoKKyAgICAgICAgICAgICAgICBhdHRyc1snbGljZW5zZSddID0gYXR0cnNbJ2xpY2VuY2UnXQorICAgICAgICAgICAgICAgIGRlbCBhdHRyc1snbGljZW5jZSddCisgICAgICAgICAgICAgICAgbXNnID0gIidsaWNlbmNlJyBkaXN0cmlidXRpb24gb3B0aW9uIGlzIGRlcHJlY2F0ZWQ7IHVzZSAnbGljZW5zZSciCisgICAgICAgICAgICAgICAgaWYgd2FybmluZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUobXNnICsgIlxuIikKKworICAgICAgICAgICAgIyBOb3cgd29yayBvbiB0aGUgcmVzdCBvZiB0aGUgYXR0cmlidXRlcy4gIEFueSBhdHRyaWJ1dGUgdGhhdCdzCisgICAgICAgICAgICAjIG5vdCBhbHJlYWR5IGRlZmluZWQgaXMgaW52YWxpZCEKKyAgICAgICAgICAgIGZvciAoa2V5LCB2YWwpIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLm1ldGFkYXRhLCAic2V0XyIgKyBrZXkpOgorICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHNlbGYubWV0YWRhdGEsICJzZXRfIiArIGtleSkodmFsKQorICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLm1ldGFkYXRhLCBrZXkpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYubWV0YWRhdGEsIGtleSwgdmFsKQorICAgICAgICAgICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleSwgdmFsKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJVbmtub3duIGRpc3RyaWJ1dGlvbiBvcHRpb246ICVzIiAlIHJlcHIoa2V5KQorICAgICAgICAgICAgICAgICAgICBpZiB3YXJuaW5ncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cgKyAiXG4iKQorCisgICAgICAgICMgbm8tdXNlci1jZmcgaXMgaGFuZGxlZCBiZWZvcmUgb3RoZXIgY29tbWFuZCBsaW5lIGFyZ3MKKyAgICAgICAgIyBiZWNhdXNlIG90aGVyIGFyZ3Mgb3ZlcnJpZGUgdGhlIGNvbmZpZyBmaWxlcywgYW5kIHRoaXMKKyAgICAgICAgIyBvbmUgaXMgbmVlZGVkIGJlZm9yZSB3ZSBjYW4gbG9hZCB0aGUgY29uZmlnIGZpbGVzLgorICAgICAgICAjIElmIGF0dHJzWydzY3JpcHRfYXJncyddIHdhc24ndCBwYXNzZWQsIGFzc3VtZSBmYWxzZS4KKyAgICAgICAgIworICAgICAgICAjIFRoaXMgYWxzbyBtYWtlIHN1cmUgd2UganVzdCBsb29rIGF0IHRoZSBnbG9iYWwgb3B0aW9ucworICAgICAgICBzZWxmLndhbnRfdXNlcl9jZmcgPSBUcnVlCisKKyAgICAgICAgaWYgc2VsZi5zY3JpcHRfYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBhcmcgaW4gc2VsZi5zY3JpcHRfYXJnczoKKyAgICAgICAgICAgICAgICBpZiBub3QgYXJnLnN0YXJ0c3dpdGgoJy0nKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBhcmcgPT0gJy0tbm8tdXNlci1jZmcnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndhbnRfdXNlcl9jZmcgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIHNlbGYuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICBkZWYgZ2V0X29wdGlvbl9kaWN0KHNlbGYsIGNvbW1hbmQpOgorICAgICAgICAiIiJHZXQgdGhlIG9wdGlvbiBkaWN0aW9uYXJ5IGZvciBhIGdpdmVuIGNvbW1hbmQuICBJZiB0aGF0CisgICAgICAgIGNvbW1hbmQncyBvcHRpb24gZGljdGlvbmFyeSBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgdGhlbiBjcmVhdGUgaXQKKyAgICAgICAgYW5kIHJldHVybiB0aGUgbmV3IGRpY3Rpb25hcnk7IG90aGVyd2lzZSwgcmV0dXJuIHRoZSBleGlzdGluZworICAgICAgICBvcHRpb24gZGljdGlvbmFyeS4KKyAgICAgICAgIiIiCisgICAgICAgIGRpY3QgPSBzZWxmLmNvbW1hbmRfb3B0aW9ucy5nZXQoY29tbWFuZCkKKyAgICAgICAgaWYgZGljdCBpcyBOb25lOgorICAgICAgICAgICAgZGljdCA9IHNlbGYuY29tbWFuZF9vcHRpb25zW2NvbW1hbmRdID0ge30KKyAgICAgICAgcmV0dXJuIGRpY3QKKworICAgIGRlZiBkdW1wX29wdGlvbl9kaWN0cyhzZWxmLCBoZWFkZXI9Tm9uZSwgY29tbWFuZHM9Tm9uZSwgaW5kZW50PSIiKToKKyAgICAgICAgZnJvbSBwcHJpbnQgaW1wb3J0IHBmb3JtYXQKKworICAgICAgICBpZiBjb21tYW5kcyBpcyBOb25lOiAgICAgICAgICAgICAjIGR1bXAgYWxsIGNvbW1hbmQgb3B0aW9uIGRpY3RzCisgICAgICAgICAgICBjb21tYW5kcyA9IHNlbGYuY29tbWFuZF9vcHRpb25zLmtleXMoKQorICAgICAgICAgICAgY29tbWFuZHMuc29ydCgpCisKKyAgICAgICAgaWYgaGVhZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKyBoZWFkZXIpCisgICAgICAgICAgICBpbmRlbnQgPSBpbmRlbnQgKyAiICAiCisKKyAgICAgICAgaWYgbm90IGNvbW1hbmRzOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKyAibm8gY29tbWFuZHMga25vd24geWV0IikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBjbWRfbmFtZSBpbiBjb21tYW5kczoKKyAgICAgICAgICAgIG9wdF9kaWN0ID0gc2VsZi5jb21tYW5kX29wdGlvbnMuZ2V0KGNtZF9uYW1lKQorICAgICAgICAgICAgaWYgb3B0X2RpY3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKGluZGVudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gb3B0aW9uIGRpY3QgZm9yICclcycgY29tbWFuZCIgJSBjbWRfbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShpbmRlbnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiBkaWN0IGZvciAnJXMnIGNvbW1hbmQ6IiAlIGNtZF9uYW1lKQorICAgICAgICAgICAgICAgIG91dCA9IHBmb3JtYXQob3B0X2RpY3QpCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gb3V0LnNwbGl0KCdcbicpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKGluZGVudCArICIgICIgKyBsaW5lKQorCisgICAgIyAtLSBDb25maWcgZmlsZSBmaW5kaW5nL3BhcnNpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBmaW5kX2NvbmZpZ19maWxlcyhzZWxmKToKKyAgICAgICAgIiIiRmluZCBhcyBtYW55IGNvbmZpZ3VyYXRpb24gZmlsZXMgYXMgc2hvdWxkIGJlIHByb2Nlc3NlZCBmb3IgdGhpcworICAgICAgICBwbGF0Zm9ybSwgYW5kIHJldHVybiBhIGxpc3Qgb2YgZmlsZW5hbWVzIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5CisgICAgICAgIHNob3VsZCBiZSBwYXJzZWQuICBUaGUgZmlsZW5hbWVzIHJldHVybmVkIGFyZSBndWFyYW50ZWVkIHRvIGV4aXN0CisgICAgICAgIChtb2R1bG8gbmFzdHkgcmFjZSBjb25kaXRpb25zKS4KKworICAgICAgICBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgY29uZmlnIGZpbGVzOiBkaXN0dXRpbHMuY2ZnIGluIHRoZQorICAgICAgICBEaXN0dXRpbHMgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSAoaWUuIHdoZXJlIHRoZSB0b3AtbGV2ZWwKKyAgICAgICAgRGlzdHV0aWxzIF9faW5zdF9fLnB5IGZpbGUgbGl2ZXMpLCBhIGZpbGUgaW4gdGhlIHVzZXIncyBob21lCisgICAgICAgIGRpcmVjdG9yeSBuYW1lZCAucHlkaXN0dXRpbHMuY2ZnIG9uIFVuaXggYW5kIHB5ZGlzdHV0aWxzLmNmZworICAgICAgICBvbiBXaW5kb3dzL01hYzsgYW5kIHNldHVwLmNmZyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisKKyAgICAgICAgVGhlIGZpbGUgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUKKyAgICAgICAgLS1uby11c2VyLWNmZyBvcHRpb24uCisgICAgICAgICIiIgorICAgICAgICBmaWxlcyA9IFtdCisgICAgICAgIGNoZWNrX2Vudmlyb24oKQorCisgICAgICAgICMgV2hlcmUgdG8gbG9vayBmb3IgdGhlIHN5c3RlbS13aWRlIERpc3R1dGlscyBjb25maWcgZmlsZQorICAgICAgICBzeXNfZGlyID0gb3MucGF0aC5kaXJuYW1lKHN5cy5tb2R1bGVzWydkaXN0dXRpbHMnXS5fX2ZpbGVfXykKKworICAgICAgICAjIExvb2sgZm9yIHRoZSBzeXN0ZW0gY29uZmlnIGZpbGUKKyAgICAgICAgc3lzX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc3lzX2RpciwgImRpc3R1dGlscy5jZmciKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzeXNfZmlsZSk6CisgICAgICAgICAgICBmaWxlcy5hcHBlbmQoc3lzX2ZpbGUpCisKKyAgICAgICAgIyBXaGF0IHRvIGNhbGwgdGhlIHBlci11c2VyIGNvbmZpZyBmaWxlCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHVzZXJfZmlsZW5hbWUgPSAiLnB5ZGlzdHV0aWxzLmNmZyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVzZXJfZmlsZW5hbWUgPSAicHlkaXN0dXRpbHMuY2ZnIgorCisgICAgICAgICMgQW5kIGxvb2sgZm9yIHRoZSB1c2VyIGNvbmZpZyBmaWxlCisgICAgICAgIGlmIHNlbGYud2FudF91c2VyX2NmZzoKKyAgICAgICAgICAgIHVzZXJfZmlsZSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmV4cGFuZHVzZXIoJ34nKSwgdXNlcl9maWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHVzZXJfZmlsZSk6CisgICAgICAgICAgICAgICAgZmlsZXMuYXBwZW5kKHVzZXJfZmlsZSkKKworICAgICAgICAjIEFsbCBwbGF0Zm9ybXMgc3VwcG9ydCBsb2NhbCBzZXR1cC5jZmcKKyAgICAgICAgbG9jYWxfZmlsZSA9ICJzZXR1cC5jZmciCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGxvY2FsX2ZpbGUpOgorICAgICAgICAgICAgZmlsZXMuYXBwZW5kKGxvY2FsX2ZpbGUpCisKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCJ1c2luZyBjb25maWcgZmlsZXM6ICVzIiAlICcsICcuam9pbihmaWxlcykpCisKKyAgICAgICAgcmV0dXJuIGZpbGVzCisKKyAgICBkZWYgcGFyc2VfY29uZmlnX2ZpbGVzKHNlbGYsIGZpbGVuYW1lcz1Ob25lKToKKyAgICAgICAgZnJvbSBDb25maWdQYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlcgorCisgICAgICAgIGlmIGZpbGVuYW1lcyBpcyBOb25lOgorICAgICAgICAgICAgZmlsZW5hbWVzID0gc2VsZi5maW5kX2NvbmZpZ19maWxlcygpCisKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCJEaXN0cmlidXRpb24ucGFyc2VfY29uZmlnX2ZpbGVzKCk6IikKKworICAgICAgICBwYXJzZXIgPSBDb25maWdQYXJzZXIoKQorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICByZWFkaW5nICVzIiAlIGZpbGVuYW1lKQorICAgICAgICAgICAgcGFyc2VyLnJlYWQoZmlsZW5hbWUpCisgICAgICAgICAgICBmb3Igc2VjdGlvbiBpbiBwYXJzZXIuc2VjdGlvbnMoKToKKyAgICAgICAgICAgICAgICBvcHRpb25zID0gcGFyc2VyLm9wdGlvbnMoc2VjdGlvbikKKyAgICAgICAgICAgICAgICBvcHRfZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KHNlY3Rpb24pCisKKyAgICAgICAgICAgICAgICBmb3Igb3B0IGluIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgICAgIGlmIG9wdCAhPSAnX19uYW1lX18nOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gcGFyc2VyLmdldChzZWN0aW9uLG9wdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCctJywgJ18nKQorICAgICAgICAgICAgICAgICAgICAgICAgb3B0X2RpY3Rbb3B0XSA9IChmaWxlbmFtZSwgdmFsKQorCisgICAgICAgICAgICAjIE1ha2UgdGhlIENvbmZpZ1BhcnNlciBmb3JnZXQgZXZlcnl0aGluZyAoc28gd2UgcmV0YWluCisgICAgICAgICAgICAjIHRoZSBvcmlnaW5hbCBmaWxlbmFtZXMgdGhhdCBvcHRpb25zIGNvbWUgZnJvbSkKKyAgICAgICAgICAgIHBhcnNlci5fX2luaXRfXygpCisKKyAgICAgICAgIyBJZiB0aGVyZSB3YXMgYSAiZ2xvYmFsIiBzZWN0aW9uIGluIHRoZSBjb25maWcgZmlsZSwgdXNlIGl0CisgICAgICAgICMgdG8gc2V0IERpc3RyaWJ1dGlvbiBvcHRpb25zLgorCisgICAgICAgIGlmICdnbG9iYWwnIGluIHNlbGYuY29tbWFuZF9vcHRpb25zOgorICAgICAgICAgICAgZm9yIChvcHQsIChzcmMsIHZhbCkpIGluIHNlbGYuY29tbWFuZF9vcHRpb25zWydnbG9iYWwnXS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGFsaWFzID0gc2VsZi5uZWdhdGl2ZV9vcHQuZ2V0KG9wdCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFsaWFzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhbGlhcywgbm90IHN0cnRvYm9vbCh2YWwpKQorICAgICAgICAgICAgICAgICAgICBlbGlmIG9wdCBpbiAoJ3ZlcmJvc2UnLCAnZHJ5X3J1bicpOiAjIHVnaCEKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0LCBzdHJ0b2Jvb2wodmFsKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgb3B0LCB2YWwpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IsIG1zZworCisgICAgIyAtLSBDb21tYW5kLWxpbmUgcGFyc2luZyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBwYXJzZV9jb21tYW5kX2xpbmUoc2VsZik6CisgICAgICAgICIiIlBhcnNlIHRoZSBzZXR1cCBzY3JpcHQncyBjb21tYW5kIGxpbmUsIHRha2VuIGZyb20gdGhlCisgICAgICAgICdzY3JpcHRfYXJncycgaW5zdGFuY2UgYXR0cmlidXRlICh3aGljaCBkZWZhdWx0cyB0byAnc3lzLmFyZ3ZbMTpdJworICAgICAgICAtLSBzZWUgJ3NldHVwKCknIGluIGNvcmUucHkpLiAgVGhpcyBsaXN0IGlzIGZpcnN0IHByb2Nlc3NlZCBmb3IKKyAgICAgICAgImdsb2JhbCBvcHRpb25zIiAtLSBvcHRpb25zIHRoYXQgc2V0IGF0dHJpYnV0ZXMgb2YgdGhlIERpc3RyaWJ1dGlvbgorICAgICAgICBpbnN0YW5jZS4gIFRoZW4sIGl0IGlzIGFsdGVybmF0ZWx5IHNjYW5uZWQgZm9yIERpc3R1dGlscyBjb21tYW5kcworICAgICAgICBhbmQgb3B0aW9ucyBmb3IgdGhhdCBjb21tYW5kLiAgRWFjaCBuZXcgY29tbWFuZCB0ZXJtaW5hdGVzIHRoZQorICAgICAgICBvcHRpb25zIGZvciB0aGUgcHJldmlvdXMgY29tbWFuZC4gIFRoZSBhbGxvd2VkIG9wdGlvbnMgZm9yIGEKKyAgICAgICAgY29tbWFuZCBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgJ3VzZXJfb3B0aW9ucycgYXR0cmlidXRlIG9mIHRoZQorICAgICAgICBjb21tYW5kIGNsYXNzIC0tIHRodXMsIHdlIGhhdmUgdG8gYmUgYWJsZSB0byBsb2FkIGNvbW1hbmQgY2xhc3NlcworICAgICAgICBpbiBvcmRlciB0byBwYXJzZSB0aGUgY29tbWFuZCBsaW5lLiAgQW55IGVycm9yIGluIHRoYXQgJ29wdGlvbnMnCisgICAgICAgIGF0dHJpYnV0ZSByYWlzZXMgRGlzdHV0aWxzR2V0b3B0RXJyb3I7IGFueSBlcnJvciBvbiB0aGUKKyAgICAgICAgY29tbWFuZC1saW5lIHJhaXNlcyBEaXN0dXRpbHNBcmdFcnJvci4gIElmIG5vIERpc3R1dGlscyBjb21tYW5kcworICAgICAgICB3ZXJlIGZvdW5kIG9uIHRoZSBjb21tYW5kIGxpbmUsIHJhaXNlcyBEaXN0dXRpbHNBcmdFcnJvci4gIFJldHVybgorICAgICAgICB0cnVlIGlmIGNvbW1hbmQtbGluZSB3YXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBhbmQgd2Ugc2hvdWxkIGNhcnJ5CisgICAgICAgIG9uIHdpdGggZXhlY3V0aW5nIGNvbW1hbmRzOyBmYWxzZSBpZiBubyBlcnJvcnMgYnV0IHdlIHNob3VsZG4ndAorICAgICAgICBleGVjdXRlIGNvbW1hbmRzIChjdXJyZW50bHksIHRoaXMgb25seSBoYXBwZW5zIGlmIHVzZXIgYXNrcyBmb3IKKyAgICAgICAgaGVscCkuCisgICAgICAgICIiIgorICAgICAgICAjCisgICAgICAgICMgV2Ugbm93IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHNob3cgdGhlIE1hY2ludG9zaCBkaWFsb2cKKyAgICAgICAgIyB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBpbnRlcmFjdGl2ZWx5IHNwZWNpZnkgdGhlICJjb21tYW5kIGxpbmUiLgorICAgICAgICAjCisgICAgICAgIHRvcGxldmVsX29wdGlvbnMgPSBzZWxmLl9nZXRfdG9wbGV2ZWxfb3B0aW9ucygpCisKKyAgICAgICAgIyBXZSBoYXZlIHRvIHBhcnNlIHRoZSBjb21tYW5kIGxpbmUgYSBiaXQgYXQgYSB0aW1lIC0tIGdsb2JhbAorICAgICAgICAjIG9wdGlvbnMsIHRoZW4gdGhlIGZpcnN0IGNvbW1hbmQsIHRoZW4gaXRzIG9wdGlvbnMsIGFuZCBzbyBvbiAtLQorICAgICAgICAjIGJlY2F1c2UgZWFjaCBjb21tYW5kIHdpbGwgYmUgaGFuZGxlZCBieSBhIGRpZmZlcmVudCBjbGFzcywgYW5kCisgICAgICAgICMgdGhlIG9wdGlvbnMgdGhhdCBhcmUgdmFsaWQgZm9yIGEgcGFydGljdWxhciBjbGFzcyBhcmVuJ3Qga25vd24KKyAgICAgICAgIyB1bnRpbCB3ZSBoYXZlIGxvYWRlZCB0aGUgY29tbWFuZCBjbGFzcywgd2hpY2ggZG9lc24ndCBoYXBwZW4KKyAgICAgICAgIyB1bnRpbCB3ZSBrbm93IHdoYXQgdGhlIGNvbW1hbmQgaXMuCisKKyAgICAgICAgc2VsZi5jb21tYW5kcyA9IFtdCisgICAgICAgIHBhcnNlciA9IEZhbmN5R2V0b3B0KHRvcGxldmVsX29wdGlvbnMgKyBzZWxmLmRpc3BsYXlfb3B0aW9ucykKKyAgICAgICAgcGFyc2VyLnNldF9uZWdhdGl2ZV9hbGlhc2VzKHNlbGYubmVnYXRpdmVfb3B0KQorICAgICAgICBwYXJzZXIuc2V0X2FsaWFzZXMoeydsaWNlbmNlJzogJ2xpY2Vuc2UnfSkKKyAgICAgICAgYXJncyA9IHBhcnNlci5nZXRvcHQoYXJncz1zZWxmLnNjcmlwdF9hcmdzLCBvYmplY3Q9c2VsZikKKyAgICAgICAgb3B0aW9uX29yZGVyID0gcGFyc2VyLmdldF9vcHRpb25fb3JkZXIoKQorICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpCisKKyAgICAgICAgIyBmb3IgZGlzcGxheSBvcHRpb25zIHdlIHJldHVybiBpbW1lZGlhdGVseQorICAgICAgICBpZiBzZWxmLmhhbmRsZV9kaXNwbGF5X29wdGlvbnMob3B0aW9uX29yZGVyKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aGlsZSBhcmdzOgorICAgICAgICAgICAgYXJncyA9IHNlbGYuX3BhcnNlX2NvbW1hbmRfb3B0cyhwYXJzZXIsIGFyZ3MpCisgICAgICAgICAgICBpZiBhcmdzIGlzIE5vbmU6ICAgICAgICAgICAgIyB1c2VyIGFza2VkIGZvciBoZWxwIChhbmQgZ290IGl0KQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgSGFuZGxlIHRoZSBjYXNlcyBvZiAtLWhlbHAgYXMgYSAiZ2xvYmFsIiBvcHRpb24sIGllLgorICAgICAgICAjICJzZXR1cC5weSAtLWhlbHAiIGFuZCAic2V0dXAucHkgLS1oZWxwIGNvbW1hbmQgLi4uIi4gIEZvciB0aGUKKyAgICAgICAgIyBmb3JtZXIsIHdlIHNob3cgZ2xvYmFsIG9wdGlvbnMgKC0tdmVyYm9zZSwgLS1kcnktcnVuLCBldGMuKQorICAgICAgICAjIGFuZCBkaXNwbGF5LW9ubHkgb3B0aW9ucyAoLS1uYW1lLCAtLXZlcnNpb24sIGV0Yy4pOyBmb3IgdGhlCisgICAgICAgICMgbGF0dGVyLCB3ZSBvbWl0IHRoZSBkaXNwbGF5LW9ubHkgb3B0aW9ucyBhbmQgc2hvdyBoZWxwIGZvcgorICAgICAgICAjIGVhY2ggY29tbWFuZCBsaXN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgaWYgc2VsZi5oZWxwOgorICAgICAgICAgICAgc2VsZi5fc2hvd19oZWxwKHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5X29wdGlvbnM9bGVuKHNlbGYuY29tbWFuZHMpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHM9c2VsZi5jb21tYW5kcykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgT29wcywgbm8gY29tbWFuZHMgZm91bmQgLS0gYW4gZW5kLXVzZXIgZXJyb3IKKyAgICAgICAgaWYgbm90IHNlbGYuY29tbWFuZHM6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvciwgIm5vIGNvbW1hbmRzIHN1cHBsaWVkIgorCisgICAgICAgICMgQWxsIGlzIHdlbGw6IHJldHVybiB0cnVlCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgX2dldF90b3BsZXZlbF9vcHRpb25zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5vbi1kaXNwbGF5IG9wdGlvbnMgcmVjb2duaXplZCBhdCB0aGUgdG9wIGxldmVsLgorCisgICAgICAgIFRoaXMgaW5jbHVkZXMgb3B0aW9ucyB0aGF0IGFyZSByZWNvZ25pemVkICpvbmx5KiBhdCB0aGUgdG9wCisgICAgICAgIGxldmVsIGFzIHdlbGwgYXMgb3B0aW9ucyByZWNvZ25pemVkIGZvciBjb21tYW5kcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdsb2JhbF9vcHRpb25zICsgWworICAgICAgICAgICAgKCJjb21tYW5kLXBhY2thZ2VzPSIsIE5vbmUsCisgICAgICAgICAgICAgImxpc3Qgb2YgcGFja2FnZXMgdGhhdCBwcm92aWRlIGRpc3R1dGlscyBjb21tYW5kcyIpLAorICAgICAgICAgICAgXQorCisgICAgZGVmIF9wYXJzZV9jb21tYW5kX29wdHMoc2VsZiwgcGFyc2VyLCBhcmdzKToKKyAgICAgICAgIiIiUGFyc2UgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvciBhIHNpbmdsZSBjb21tYW5kLgorICAgICAgICAncGFyc2VyJyBtdXN0IGJlIGEgRmFuY3lHZXRvcHQgaW5zdGFuY2U7ICdhcmdzJyBtdXN0IGJlIHRoZSBsaXN0CisgICAgICAgIG9mIGFyZ3VtZW50cywgc3RhcnRpbmcgd2l0aCB0aGUgY3VycmVudCBjb21tYW5kICh3aG9zZSBvcHRpb25zCisgICAgICAgIHdlIGFyZSBhYm91dCB0byBwYXJzZSkuICBSZXR1cm5zIGEgbmV3IHZlcnNpb24gb2YgJ2FyZ3MnIHdpdGgKKyAgICAgICAgdGhlIG5leHQgY29tbWFuZCBhdCB0aGUgZnJvbnQgb2YgdGhlIGxpc3Q7IHdpbGwgYmUgdGhlIGVtcHR5CisgICAgICAgIGxpc3QgaWYgdGhlcmUgYXJlIG5vIG1vcmUgY29tbWFuZHMgb24gdGhlIGNvbW1hbmQgbGluZS4gIFJldHVybnMKKyAgICAgICAgTm9uZSBpZiB0aGUgdXNlciBhc2tlZCBmb3IgaGVscCBvbiB0aGlzIGNvbW1hbmQuCisgICAgICAgICIiIgorICAgICAgICAjIGxhdGUgaW1wb3J0IGJlY2F1c2Ugb2YgbXV0dWFsIGRlcGVuZGVuY2UgYmV0d2VlbiB0aGVzZSBtb2R1bGVzCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmNtZCBpbXBvcnQgQ29tbWFuZAorCisgICAgICAgICMgUHVsbCB0aGUgY3VycmVudCBjb21tYW5kIGZyb20gdGhlIGhlYWQgb2YgdGhlIGNvbW1hbmQgbGluZQorICAgICAgICBjb21tYW5kID0gYXJnc1swXQorICAgICAgICBpZiBub3QgY29tbWFuZF9yZS5tYXRjaChjb21tYW5kKToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQsICJpbnZhbGlkIGNvbW1hbmQgbmFtZSAnJXMnIiAlIGNvbW1hbmQKKyAgICAgICAgc2VsZi5jb21tYW5kcy5hcHBlbmQoY29tbWFuZCkKKworICAgICAgICAjIERpZyB1cCB0aGUgY29tbWFuZCBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhpcyBjb21tYW5kLCBzbyB3ZQorICAgICAgICAjIDEpIGtub3cgdGhhdCBpdCdzIGEgdmFsaWQgY29tbWFuZCwgYW5kIDIpIGtub3cgd2hpY2ggb3B0aW9ucworICAgICAgICAjIGl0IHRha2VzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWRfY2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCisgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNNb2R1bGVFcnJvciwgbXNnOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IsIG1zZworCisgICAgICAgICMgUmVxdWlyZSB0aGF0IHRoZSBjb21tYW5kIGNsYXNzIGJlIGRlcml2ZWQgZnJvbSBDb21tYW5kIC0tIHdhbnQKKyAgICAgICAgIyB0byBiZSBzdXJlIHRoYXQgdGhlIGJhc2ljICJjb21tYW5kIiBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQuCisgICAgICAgIGlmIG5vdCBpc3N1YmNsYXNzKGNtZF9jbGFzcywgQ29tbWFuZCk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNDbGFzc0Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAiY29tbWFuZCBjbGFzcyAlcyBtdXN0IHN1YmNsYXNzIENvbW1hbmQiICUgY21kX2NsYXNzCisKKyAgICAgICAgIyBBbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb21tYW5kIG9iamVjdCBwcm92aWRlcyBhIGxpc3Qgb2YgaXRzCisgICAgICAgICMga25vd24gb3B0aW9ucy4KKyAgICAgICAgaWYgbm90IChoYXNhdHRyKGNtZF9jbGFzcywgJ3VzZXJfb3B0aW9ucycpIGFuZAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UoY21kX2NsYXNzLnVzZXJfb3B0aW9ucywgbGlzdCkpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQ2xhc3NFcnJvciwgXAorICAgICAgICAgICAgICAgICAgKCJjb21tYW5kIGNsYXNzICVzIG11c3QgcHJvdmlkZSAiICsKKyAgICAgICAgICAgICAgICAgICAiJ3VzZXJfb3B0aW9ucycgYXR0cmlidXRlIChhIGxpc3Qgb2YgdHVwbGVzKSIpICUgXAorICAgICAgICAgICAgICAgICAgY21kX2NsYXNzCisKKyAgICAgICAgIyBJZiB0aGUgY29tbWFuZCBjbGFzcyBoYXMgYSBsaXN0IG9mIG5lZ2F0aXZlIGFsaWFzIG9wdGlvbnMsCisgICAgICAgICMgbWVyZ2UgaXQgaW4gd2l0aCB0aGUgZ2xvYmFsIG5lZ2F0aXZlIGFsaWFzZXMuCisgICAgICAgIG5lZ2F0aXZlX29wdCA9IHNlbGYubmVnYXRpdmVfb3B0CisgICAgICAgIGlmIGhhc2F0dHIoY21kX2NsYXNzLCAnbmVnYXRpdmVfb3B0Jyk6CisgICAgICAgICAgICBuZWdhdGl2ZV9vcHQgPSBuZWdhdGl2ZV9vcHQuY29weSgpCisgICAgICAgICAgICBuZWdhdGl2ZV9vcHQudXBkYXRlKGNtZF9jbGFzcy5uZWdhdGl2ZV9vcHQpCisKKyAgICAgICAgIyBDaGVjayBmb3IgaGVscF9vcHRpb25zIGluIGNvbW1hbmQgY2xhc3MuICBUaGV5IGhhdmUgYSBkaWZmZXJlbnQKKyAgICAgICAgIyBmb3JtYXQgKHR1cGxlIG9mIGZvdXIpIHNvIHdlIG5lZWQgdG8gcHJlcHJvY2VzcyB0aGVtIGhlcmUuCisgICAgICAgIGlmIChoYXNhdHRyKGNtZF9jbGFzcywgJ2hlbHBfb3B0aW9ucycpIGFuZAorICAgICAgICAgICAgaXNpbnN0YW5jZShjbWRfY2xhc3MuaGVscF9vcHRpb25zLCBsaXN0KSk6CisgICAgICAgICAgICBoZWxwX29wdGlvbnMgPSBmaXhfaGVscF9vcHRpb25zKGNtZF9jbGFzcy5oZWxwX29wdGlvbnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWxwX29wdGlvbnMgPSBbXQorCisKKyAgICAgICAgIyBBbGwgY29tbWFuZHMgc3VwcG9ydCB0aGUgZ2xvYmFsIG9wdGlvbnMgdG9vLCBqdXN0IGJ5IGFkZGluZworICAgICAgICAjIGluICdnbG9iYWxfb3B0aW9ucycuCisgICAgICAgIHBhcnNlci5zZXRfb3B0aW9uX3RhYmxlKHNlbGYuZ2xvYmFsX29wdGlvbnMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRfY2xhc3MudXNlcl9vcHRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscF9vcHRpb25zKQorICAgICAgICBwYXJzZXIuc2V0X25lZ2F0aXZlX2FsaWFzZXMobmVnYXRpdmVfb3B0KQorICAgICAgICAoYXJncywgb3B0cykgPSBwYXJzZXIuZ2V0b3B0KGFyZ3NbMTpdKQorICAgICAgICBpZiBoYXNhdHRyKG9wdHMsICdoZWxwJykgYW5kIG9wdHMuaGVscDoKKyAgICAgICAgICAgIHNlbGYuX3Nob3dfaGVscChwYXJzZXIsIGRpc3BsYXlfb3B0aW9ucz0wLCBjb21tYW5kcz1bY21kX2NsYXNzXSkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIChoYXNhdHRyKGNtZF9jbGFzcywgJ2hlbHBfb3B0aW9ucycpIGFuZAorICAgICAgICAgICAgaXNpbnN0YW5jZShjbWRfY2xhc3MuaGVscF9vcHRpb25zLCBsaXN0KSk6CisgICAgICAgICAgICBoZWxwX29wdGlvbl9mb3VuZD0wCisgICAgICAgICAgICBmb3IgKGhlbHBfb3B0aW9uLCBzaG9ydCwgZGVzYywgZnVuYykgaW4gY21kX2NsYXNzLmhlbHBfb3B0aW9uczoKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9wdHMsIHBhcnNlci5nZXRfYXR0cl9uYW1lKGhlbHBfb3B0aW9uKSk6CisgICAgICAgICAgICAgICAgICAgIGhlbHBfb3B0aW9uX2ZvdW5kPTEKKyAgICAgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihmdW5jLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQ2xhc3NFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBoZWxwIGZ1bmN0aW9uICVyIGZvciBoZWxwIG9wdGlvbiAnJXMnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSBjYWxsYWJsZSBvYmplY3QgKGZ1bmN0aW9uLCBldGMuKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChmdW5jLCBoZWxwX29wdGlvbikpCisKKyAgICAgICAgICAgIGlmIGhlbHBfb3B0aW9uX2ZvdW5kOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgUHV0IHRoZSBvcHRpb25zIGZyb20gdGhlIGNvbW1hbmQtbGluZSBpbnRvIHRoZWlyIG9mZmljaWFsCisgICAgICAgICMgaG9sZGluZyBwZW4sIHRoZSAnY29tbWFuZF9vcHRpb25zJyBkaWN0aW9uYXJ5LgorICAgICAgICBvcHRfZGljdCA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KGNvbW1hbmQpCisgICAgICAgIGZvciAobmFtZSwgdmFsdWUpIGluIHZhcnMob3B0cykuaXRlbXMoKToKKyAgICAgICAgICAgIG9wdF9kaWN0W25hbWVdID0gKCJjb21tYW5kIGxpbmUiLCB2YWx1ZSkKKworICAgICAgICByZXR1cm4gYXJncworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICIiIlNldCBmaW5hbCB2YWx1ZXMgZm9yIGFsbCB0aGUgb3B0aW9ucyBvbiB0aGUgRGlzdHJpYnV0aW9uCisgICAgICAgIGluc3RhbmNlLCBhbmFsb2dvdXMgdG8gdGhlIC5maW5hbGl6ZV9vcHRpb25zKCkgbWV0aG9kIG9mIENvbW1hbmQKKyAgICAgICAgb2JqZWN0cy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBhdHRyIGluICgna2V5d29yZHMnLCAncGxhdGZvcm1zJyk6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc2VsZi5tZXRhZGF0YSwgYXR0cikKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHN0cik6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBbZWxtLnN0cmlwKCkgZm9yIGVsbSBpbiB2YWx1ZS5zcGxpdCgnLCcpXQorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZi5tZXRhZGF0YSwgYXR0ciwgdmFsdWUpCisKKyAgICBkZWYgX3Nob3dfaGVscChzZWxmLCBwYXJzZXIsIGdsb2JhbF9vcHRpb25zPTEsIGRpc3BsYXlfb3B0aW9ucz0xLAorICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzPVtdKToKKyAgICAgICAgIiIiU2hvdyBoZWxwIGZvciB0aGUgc2V0dXAgc2NyaXB0IGNvbW1hbmQtbGluZSBpbiB0aGUgZm9ybSBvZgorICAgICAgICBzZXZlcmFsIGxpc3RzIG9mIGNvbW1hbmQtbGluZSBvcHRpb25zLiAgJ3BhcnNlcicgc2hvdWxkIGJlIGEKKyAgICAgICAgRmFuY3lHZXRvcHQgaW5zdGFuY2U7IGRvIG5vdCBleHBlY3QgaXQgdG8gYmUgcmV0dXJuZWQgaW4gdGhlCisgICAgICAgIHNhbWUgc3RhdGUsIGFzIGl0cyBvcHRpb24gdGFibGUgd2lsbCBiZSByZXNldCB0byBtYWtlIGl0CisgICAgICAgIGdlbmVyYXRlIHRoZSBjb3JyZWN0IGhlbHAgdGV4dC4KKworICAgICAgICBJZiAnZ2xvYmFsX29wdGlvbnMnIGlzIHRydWUsIGxpc3RzIHRoZSBnbG9iYWwgb3B0aW9uczoKKyAgICAgICAgLS12ZXJib3NlLCAtLWRyeS1ydW4sIGV0Yy4gIElmICdkaXNwbGF5X29wdGlvbnMnIGlzIHRydWUsIGxpc3RzCisgICAgICAgIHRoZSAiZGlzcGxheS1vbmx5IiBvcHRpb25zOiAtLW5hbWUsIC0tdmVyc2lvbiwgZXRjLiAgRmluYWxseSwKKyAgICAgICAgbGlzdHMgcGVyLWNvbW1hbmQgaGVscCBmb3IgZXZlcnkgY29tbWFuZCBuYW1lIG9yIGNvbW1hbmQgY2xhc3MKKyAgICAgICAgaW4gJ2NvbW1hbmRzJy4KKyAgICAgICAgIiIiCisgICAgICAgICMgbGF0ZSBpbXBvcnQgYmVjYXVzZSBvZiBtdXR1YWwgZGVwZW5kZW5jZSBiZXR3ZWVuIHRoZXNlIG1vZHVsZXMKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgZ2VuX3VzYWdlCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmNtZCBpbXBvcnQgQ29tbWFuZAorCisgICAgICAgIGlmIGdsb2JhbF9vcHRpb25zOgorICAgICAgICAgICAgaWYgZGlzcGxheV9vcHRpb25zOgorICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLl9nZXRfdG9wbGV2ZWxfb3B0aW9ucygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLmdsb2JhbF9vcHRpb25zCisgICAgICAgICAgICBwYXJzZXIuc2V0X29wdGlvbl90YWJsZShvcHRpb25zKQorICAgICAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoc2VsZi5jb21tb25fdXNhZ2UgKyAiXG5HbG9iYWwgb3B0aW9uczoiKQorICAgICAgICAgICAgcHJpbnQoJycpCisKKyAgICAgICAgaWYgZGlzcGxheV9vcHRpb25zOgorICAgICAgICAgICAgcGFyc2VyLnNldF9vcHRpb25fdGFibGUoc2VsZi5kaXNwbGF5X29wdGlvbnMpCisgICAgICAgICAgICBwYXJzZXIucHJpbnRfaGVscCgKKyAgICAgICAgICAgICAgICAiSW5mb3JtYXRpb24gZGlzcGxheSBvcHRpb25zIChqdXN0IGRpc3BsYXkgIiArCisgICAgICAgICAgICAgICAgImluZm9ybWF0aW9uLCBpZ25vcmUgYW55IGNvbW1hbmRzKSIpCisgICAgICAgICAgICBwcmludCgnJykKKworICAgICAgICBmb3IgY29tbWFuZCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb21tYW5kLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhjb21tYW5kLCBDb21tYW5kKToKKyAgICAgICAgICAgICAgICBrbGFzcyA9IGNvbW1hbmQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAga2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNvbW1hbmQpCisgICAgICAgICAgICBpZiAoaGFzYXR0cihrbGFzcywgJ2hlbHBfb3B0aW9ucycpIGFuZAorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uoa2xhc3MuaGVscF9vcHRpb25zLCBsaXN0KSk6CisgICAgICAgICAgICAgICAgcGFyc2VyLnNldF9vcHRpb25fdGFibGUoa2xhc3MudXNlcl9vcHRpb25zICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhfaGVscF9vcHRpb25zKGtsYXNzLmhlbHBfb3B0aW9ucykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcnNlci5zZXRfb3B0aW9uX3RhYmxlKGtsYXNzLnVzZXJfb3B0aW9ucykKKyAgICAgICAgICAgIHBhcnNlci5wcmludF9oZWxwKCJPcHRpb25zIGZvciAnJXMnIGNvbW1hbmQ6IiAlIGtsYXNzLl9fbmFtZV9fKQorICAgICAgICAgICAgcHJpbnQoJycpCisKKyAgICAgICAgcHJpbnQoZ2VuX3VzYWdlKHNlbGYuc2NyaXB0X25hbWUpKQorCisgICAgZGVmIGhhbmRsZV9kaXNwbGF5X29wdGlvbnMoc2VsZiwgb3B0aW9uX29yZGVyKToKKyAgICAgICAgIiIiSWYgdGhlcmUgd2VyZSBhbnkgbm9uLWdsb2JhbCAiZGlzcGxheS1vbmx5IiBvcHRpb25zCisgICAgICAgICgtLWhlbHAtY29tbWFuZHMgb3IgdGhlIG1ldGFkYXRhIGRpc3BsYXkgb3B0aW9ucykgb24gdGhlIGNvbW1hbmQKKyAgICAgICAgbGluZSwgZGlzcGxheSB0aGUgcmVxdWVzdGVkIGluZm8gYW5kIHJldHVybiB0cnVlOyBlbHNlIHJldHVybgorICAgICAgICBmYWxzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IGdlbl91c2FnZQorCisgICAgICAgICMgVXNlciBqdXN0IHdhbnRzIGEgbGlzdCBvZiBjb21tYW5kcyAtLSB3ZSdsbCBwcmludCBpdCBvdXQgYW5kIHN0b3AKKyAgICAgICAgIyBwcm9jZXNzaW5nIG5vdyAoaWUuIGlmIHRoZXkgcmFuICJzZXR1cCAtLWhlbHAtY29tbWFuZHMgZm9vIGJhciIsCisgICAgICAgICMgd2UgaWdub3JlICJmb28gYmFyIikuCisgICAgICAgIGlmIHNlbGYuaGVscF9jb21tYW5kczoKKyAgICAgICAgICAgIHNlbGYucHJpbnRfY29tbWFuZHMoKQorICAgICAgICAgICAgcHJpbnQoJycpCisgICAgICAgICAgICBwcmludChnZW5fdXNhZ2Uoc2VsZi5zY3JpcHRfbmFtZSkpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgICMgSWYgdXNlciBzdXBwbGllZCBhbnkgb2YgdGhlICJkaXNwbGF5IG1ldGFkYXRhIiBvcHRpb25zLCB0aGVuCisgICAgICAgICMgZGlzcGxheSB0aGF0IG1ldGFkYXRhIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgdXNlciBzdXBwbGllZCB0aGUKKyAgICAgICAgIyBtZXRhZGF0YSBvcHRpb25zLgorICAgICAgICBhbnlfZGlzcGxheV9vcHRpb25zID0gMAorICAgICAgICBpc19kaXNwbGF5X29wdGlvbiA9IHt9CisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5kaXNwbGF5X29wdGlvbnM6CisgICAgICAgICAgICBpc19kaXNwbGF5X29wdGlvbltvcHRpb25bMF1dID0gMQorCisgICAgICAgIGZvciAob3B0LCB2YWwpIGluIG9wdGlvbl9vcmRlcjoKKyAgICAgICAgICAgIGlmIHZhbCBhbmQgaXNfZGlzcGxheV9vcHRpb24uZ2V0KG9wdCk6CisgICAgICAgICAgICAgICAgb3B0ID0gdHJhbnNsYXRlX2xvbmdvcHQob3B0KQorICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLm1ldGFkYXRhLCAiZ2V0XyIrb3B0KSgpCisgICAgICAgICAgICAgICAgaWYgb3B0IGluIFsna2V5d29yZHMnLCAncGxhdGZvcm1zJ106CisgICAgICAgICAgICAgICAgICAgIHByaW50KCcsJy5qb2luKHZhbHVlKSkKKyAgICAgICAgICAgICAgICBlbGlmIG9wdCBpbiAoJ2NsYXNzaWZpZXJzJywgJ3Byb3ZpZGVzJywgJ3JlcXVpcmVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29ic29sZXRlcycpOgorICAgICAgICAgICAgICAgICAgICBwcmludCgnXG4nLmpvaW4odmFsdWUpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50KHZhbHVlKQorICAgICAgICAgICAgICAgIGFueV9kaXNwbGF5X29wdGlvbnMgPSAxCisKKyAgICAgICAgcmV0dXJuIGFueV9kaXNwbGF5X29wdGlvbnMKKworICAgIGRlZiBwcmludF9jb21tYW5kX2xpc3Qoc2VsZiwgY29tbWFuZHMsIGhlYWRlciwgbWF4X2xlbmd0aCk6CisgICAgICAgICIiIlByaW50IGEgc3Vic2V0IG9mIHRoZSBsaXN0IG9mIGFsbCBjb21tYW5kcyAtLSB1c2VkIGJ5CisgICAgICAgICdwcmludF9jb21tYW5kcygpJy4KKyAgICAgICAgIiIiCisgICAgICAgIHByaW50KGhlYWRlciArICI6IikKKworICAgICAgICBmb3IgY21kIGluIGNvbW1hbmRzOgorICAgICAgICAgICAga2xhc3MgPSBzZWxmLmNtZGNsYXNzLmdldChjbWQpCisgICAgICAgICAgICBpZiBub3Qga2xhc3M6CisgICAgICAgICAgICAgICAga2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNtZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGtsYXNzLmRlc2NyaXB0aW9uCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkiCisKKyAgICAgICAgICAgIHByaW50KCIgICUtKnMgICVzIiAlIChtYXhfbGVuZ3RoLCBjbWQsIGRlc2NyaXB0aW9uKSkKKworICAgIGRlZiBwcmludF9jb21tYW5kcyhzZWxmKToKKyAgICAgICAgIiIiUHJpbnQgb3V0IGEgaGVscCBtZXNzYWdlIGxpc3RpbmcgYWxsIGF2YWlsYWJsZSBjb21tYW5kcyB3aXRoIGEKKyAgICAgICAgZGVzY3JpcHRpb24gb2YgZWFjaC4gIFRoZSBsaXN0IGlzIGRpdmlkZWQgaW50byAic3RhbmRhcmQgY29tbWFuZHMiCisgICAgICAgIChsaXN0ZWQgaW4gZGlzdHV0aWxzLmNvbW1hbmQuX19hbGxfXykgYW5kICJleHRyYSBjb21tYW5kcyIKKyAgICAgICAgKG1lbnRpb25lZCBpbiBzZWxmLmNtZGNsYXNzLCBidXQgbm90IGEgc3RhbmRhcmQgY29tbWFuZCkuICBUaGUKKyAgICAgICAgZGVzY3JpcHRpb25zIGNvbWUgZnJvbSB0aGUgY29tbWFuZCBjbGFzcyBhdHRyaWJ1dGUKKyAgICAgICAgJ2Rlc2NyaXB0aW9uJy4KKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZAorICAgICAgICBzdGRfY29tbWFuZHMgPSBkaXN0dXRpbHMuY29tbWFuZC5fX2FsbF9fCisgICAgICAgIGlzX3N0ZCA9IHt9CisgICAgICAgIGZvciBjbWQgaW4gc3RkX2NvbW1hbmRzOgorICAgICAgICAgICAgaXNfc3RkW2NtZF0gPSAxCisKKyAgICAgICAgZXh0cmFfY29tbWFuZHMgPSBbXQorICAgICAgICBmb3IgY21kIGluIHNlbGYuY21kY2xhc3Mua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IGlzX3N0ZC5nZXQoY21kKToKKyAgICAgICAgICAgICAgICBleHRyYV9jb21tYW5kcy5hcHBlbmQoY21kKQorCisgICAgICAgIG1heF9sZW5ndGggPSAwCisgICAgICAgIGZvciBjbWQgaW4gKHN0ZF9jb21tYW5kcyArIGV4dHJhX2NvbW1hbmRzKToKKyAgICAgICAgICAgIGlmIGxlbihjbWQpID4gbWF4X2xlbmd0aDoKKyAgICAgICAgICAgICAgICBtYXhfbGVuZ3RoID0gbGVuKGNtZCkKKworICAgICAgICBzZWxmLnByaW50X2NvbW1hbmRfbGlzdChzdGRfY29tbWFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFuZGFyZCBjb21tYW5kcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpCisgICAgICAgIGlmIGV4dHJhX2NvbW1hbmRzOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHNlbGYucHJpbnRfY29tbWFuZF9saXN0KGV4dHJhX2NvbW1hbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dHJhIGNvbW1hbmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9sZW5ndGgpCisKKyAgICBkZWYgZ2V0X2NvbW1hbmRfbGlzdChzZWxmKToKKyAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiAoY29tbWFuZCwgZGVzY3JpcHRpb24pIHR1cGxlcy4KKyAgICAgICAgVGhlIGxpc3QgaXMgZGl2aWRlZCBpbnRvICJzdGFuZGFyZCBjb21tYW5kcyIgKGxpc3RlZCBpbgorICAgICAgICBkaXN0dXRpbHMuY29tbWFuZC5fX2FsbF9fKSBhbmQgImV4dHJhIGNvbW1hbmRzIiAobWVudGlvbmVkIGluCisgICAgICAgIHNlbGYuY21kY2xhc3MsIGJ1dCBub3QgYSBzdGFuZGFyZCBjb21tYW5kKS4gIFRoZSBkZXNjcmlwdGlvbnMgY29tZQorICAgICAgICBmcm9tIHRoZSBjb21tYW5kIGNsYXNzIGF0dHJpYnV0ZSAnZGVzY3JpcHRpb24nLgorICAgICAgICAiIiIKKyAgICAgICAgIyBDdXJyZW50bHkgdGhpcyBpcyBvbmx5IHVzZWQgb24gTWFjIE9TLCBmb3IgdGhlIE1hYy1vbmx5IEdVSQorICAgICAgICAjIERpc3R1dGlscyBpbnRlcmZhY2UgKGJ5IEphY2sgSmFuc2VuKQorCisgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZAorICAgICAgICBzdGRfY29tbWFuZHMgPSBkaXN0dXRpbHMuY29tbWFuZC5fX2FsbF9fCisgICAgICAgIGlzX3N0ZCA9IHt9CisgICAgICAgIGZvciBjbWQgaW4gc3RkX2NvbW1hbmRzOgorICAgICAgICAgICAgaXNfc3RkW2NtZF0gPSAxCisKKyAgICAgICAgZXh0cmFfY29tbWFuZHMgPSBbXQorICAgICAgICBmb3IgY21kIGluIHNlbGYuY21kY2xhc3Mua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IGlzX3N0ZC5nZXQoY21kKToKKyAgICAgICAgICAgICAgICBleHRyYV9jb21tYW5kcy5hcHBlbmQoY21kKQorCisgICAgICAgIHJ2ID0gW10KKyAgICAgICAgZm9yIGNtZCBpbiAoc3RkX2NvbW1hbmRzICsgZXh0cmFfY29tbWFuZHMpOgorICAgICAgICAgICAga2xhc3MgPSBzZWxmLmNtZGNsYXNzLmdldChjbWQpCisgICAgICAgICAgICBpZiBub3Qga2xhc3M6CisgICAgICAgICAgICAgICAga2xhc3MgPSBzZWxmLmdldF9jb21tYW5kX2NsYXNzKGNtZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGtsYXNzLmRlc2NyaXB0aW9uCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAiKG5vIGRlc2NyaXB0aW9uIGF2YWlsYWJsZSkiCisgICAgICAgICAgICBydi5hcHBlbmQoKGNtZCwgZGVzY3JpcHRpb24pKQorICAgICAgICByZXR1cm4gcnYKKworICAgICMgLS0gQ29tbWFuZCBjbGFzcy9vYmplY3QgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZ2V0X2NvbW1hbmRfcGFja2FnZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcGFja2FnZXMgZnJvbSB3aGljaCBjb21tYW5kcyBhcmUgbG9hZGVkLiIiIgorICAgICAgICBwa2dzID0gc2VsZi5jb21tYW5kX3BhY2thZ2VzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBrZ3MsIGxpc3QpOgorICAgICAgICAgICAgaWYgcGtncyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBrZ3MgPSAnJworICAgICAgICAgICAgcGtncyA9IFtwa2cuc3RyaXAoKSBmb3IgcGtnIGluIHBrZ3Muc3BsaXQoJywnKSBpZiBwa2cgIT0gJyddCisgICAgICAgICAgICBpZiAiZGlzdHV0aWxzLmNvbW1hbmQiIG5vdCBpbiBwa2dzOgorICAgICAgICAgICAgICAgIHBrZ3MuaW5zZXJ0KDAsICJkaXN0dXRpbHMuY29tbWFuZCIpCisgICAgICAgICAgICBzZWxmLmNvbW1hbmRfcGFja2FnZXMgPSBwa2dzCisgICAgICAgIHJldHVybiBwa2dzCisKKyAgICBkZWYgZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCk6CisgICAgICAgICIiIlJldHVybiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgY29tbWFuZCBuYW1lZCBieQorICAgICAgICAnY29tbWFuZCcuICBGaXJzdCB3ZSBjaGVjayB0aGUgJ2NtZGNsYXNzJyBkaWN0aW9uYXJ5OyBpZiB0aGUKKyAgICAgICAgY29tbWFuZCBpcyBtZW50aW9uZWQgdGhlcmUsIHdlIGZldGNoIHRoZSBjbGFzcyBvYmplY3QgZnJvbSB0aGUKKyAgICAgICAgZGljdGlvbmFyeSBhbmQgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlIHdlIGxvYWQgdGhlIGNvbW1hbmQgbW9kdWxlCisgICAgICAgICgiZGlzdHV0aWxzLmNvbW1hbmQuIiArIGNvbW1hbmQpIGFuZCBmZXRjaCB0aGUgY29tbWFuZCBjbGFzcyBmcm9tCisgICAgICAgIHRoZSBtb2R1bGUuICBUaGUgbG9hZGVkIGNsYXNzIGlzIGFsc28gc3RvcmVkIGluICdjbWRjbGFzcycKKyAgICAgICAgdG8gc3BlZWQgZnV0dXJlIGNhbGxzIHRvICdnZXRfY29tbWFuZF9jbGFzcygpJy4KKworICAgICAgICBSYWlzZXMgRGlzdHV0aWxzTW9kdWxlRXJyb3IgaWYgdGhlIGV4cGVjdGVkIG1vZHVsZSBjb3VsZCBub3QgYmUKKyAgICAgICAgZm91bmQsIG9yIGlmIHRoYXQgbW9kdWxlIGRvZXMgbm90IGRlZmluZSB0aGUgZXhwZWN0ZWQgY2xhc3MuCisgICAgICAgICIiIgorICAgICAgICBrbGFzcyA9IHNlbGYuY21kY2xhc3MuZ2V0KGNvbW1hbmQpCisgICAgICAgIGlmIGtsYXNzOgorICAgICAgICAgICAgcmV0dXJuIGtsYXNzCisKKyAgICAgICAgZm9yIHBrZ25hbWUgaW4gc2VsZi5nZXRfY29tbWFuZF9wYWNrYWdlcygpOgorICAgICAgICAgICAgbW9kdWxlX25hbWUgPSAiJXMuJXMiICUgKHBrZ25hbWUsIGNvbW1hbmQpCisgICAgICAgICAgICBrbGFzc19uYW1lID0gY29tbWFuZAorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX19pbXBvcnRfXyAobW9kdWxlX25hbWUpCisgICAgICAgICAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGtsYXNzID0gZ2V0YXR0cihtb2R1bGUsIGtsYXNzX25hbWUpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzTW9kdWxlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBjb21tYW5kICclcycgKG5vIGNsYXNzICclcycgaW4gbW9kdWxlICclcycpIiBcCisgICAgICAgICAgICAgICAgICAgICAgJSAoY29tbWFuZCwga2xhc3NfbmFtZSwgbW9kdWxlX25hbWUpCisKKyAgICAgICAgICAgIHNlbGYuY21kY2xhc3NbY29tbWFuZF0gPSBrbGFzcworICAgICAgICAgICAgcmV0dXJuIGtsYXNzCisKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzTW9kdWxlRXJyb3IoImludmFsaWQgY29tbWFuZCAnJXMnIiAlIGNvbW1hbmQpCisKKworICAgIGRlZiBnZXRfY29tbWFuZF9vYmooc2VsZiwgY29tbWFuZCwgY3JlYXRlPTEpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbW1hbmQgb2JqZWN0IGZvciAnY29tbWFuZCcuICBOb3JtYWxseSB0aGlzIG9iamVjdAorICAgICAgICBpcyBjYWNoZWQgb24gYSBwcmV2aW91cyBjYWxsIHRvICdnZXRfY29tbWFuZF9vYmooKSc7IGlmIG5vIGNvbW1hbmQKKyAgICAgICAgb2JqZWN0IGZvciAnY29tbWFuZCcgaXMgaW4gdGhlIGNhY2hlLCB0aGVuIHdlIGVpdGhlciBjcmVhdGUgYW5kCisgICAgICAgIHJldHVybiBpdCAoaWYgJ2NyZWF0ZScgaXMgdHJ1ZSkgb3IgcmV0dXJuIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBjbWRfb2JqID0gc2VsZi5jb21tYW5kX29iai5nZXQoY29tbWFuZCkKKyAgICAgICAgaWYgbm90IGNtZF9vYmogYW5kIGNyZWF0ZToKKyAgICAgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoIkRpc3RyaWJ1dGlvbi5nZXRfY29tbWFuZF9vYmooKTogIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgJyVzJyBjb21tYW5kIG9iamVjdCIgJSBjb21tYW5kKQorCisgICAgICAgICAgICBrbGFzcyA9IHNlbGYuZ2V0X2NvbW1hbmRfY2xhc3MoY29tbWFuZCkKKyAgICAgICAgICAgIGNtZF9vYmogPSBzZWxmLmNvbW1hbmRfb2JqW2NvbW1hbmRdID0ga2xhc3Moc2VsZikKKyAgICAgICAgICAgIHNlbGYuaGF2ZV9ydW5bY29tbWFuZF0gPSAwCisKKyAgICAgICAgICAgICMgU2V0IGFueSBvcHRpb25zIHRoYXQgd2VyZSBzdXBwbGllZCBpbiBjb25maWcgZmlsZXMKKyAgICAgICAgICAgICMgb3Igb24gdGhlIGNvbW1hbmQgbGluZS4gIChOQi4gc3VwcG9ydCBmb3IgZXJyb3IKKyAgICAgICAgICAgICMgcmVwb3J0aW5nIGlzIGxhbWUgaGVyZTogYW55IGVycm9ycyBhcmVuJ3QgcmVwb3J0ZWQKKyAgICAgICAgICAgICMgdW50aWwgJ2ZpbmFsaXplX29wdGlvbnMoKScgaXMgY2FsbGVkLCB3aGljaCBtZWFucworICAgICAgICAgICAgIyB3ZSB3b24ndCByZXBvcnQgdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IuKQorICAgICAgICAgICAgb3B0aW9ucyA9IHNlbGYuY29tbWFuZF9vcHRpb25zLmdldChjb21tYW5kKQorICAgICAgICAgICAgaWYgb3B0aW9uczoKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXRfY29tbWFuZF9vcHRpb25zKGNtZF9vYmosIG9wdGlvbnMpCisKKyAgICAgICAgcmV0dXJuIGNtZF9vYmoKKworICAgIGRlZiBfc2V0X2NvbW1hbmRfb3B0aW9ucyhzZWxmLCBjb21tYW5kX29iaiwgb3B0aW9uX2RpY3Q9Tm9uZSk6CisgICAgICAgICIiIlNldCB0aGUgb3B0aW9ucyBmb3IgJ2NvbW1hbmRfb2JqJyBmcm9tICdvcHRpb25fZGljdCcuICBCYXNpY2FsbHkKKyAgICAgICAgdGhpcyBtZWFucyBjb3B5aW5nIGVsZW1lbnRzIG9mIGEgZGljdGlvbmFyeSAoJ29wdGlvbl9kaWN0JykgdG8KKyAgICAgICAgYXR0cmlidXRlcyBvZiBhbiBpbnN0YW5jZSAoJ2NvbW1hbmQnKS4KKworICAgICAgICAnY29tbWFuZF9vYmonIG11c3QgYmUgYSBDb21tYW5kIGluc3RhbmNlLiAgSWYgJ29wdGlvbl9kaWN0JyBpcyBub3QKKyAgICAgICAgc3VwcGxpZWQsIHVzZXMgdGhlIHN0YW5kYXJkIG9wdGlvbiBkaWN0aW9uYXJ5IGZvciB0aGlzIGNvbW1hbmQKKyAgICAgICAgKGZyb20gJ3NlbGYuY29tbWFuZF9vcHRpb25zJykuCisgICAgICAgICIiIgorICAgICAgICBjb21tYW5kX25hbWUgPSBjb21tYW5kX29iai5nZXRfY29tbWFuZF9uYW1lKCkKKyAgICAgICAgaWYgb3B0aW9uX2RpY3QgaXMgTm9uZToKKyAgICAgICAgICAgIG9wdGlvbl9kaWN0ID0gc2VsZi5nZXRfb3B0aW9uX2RpY3QoY29tbWFuZF9uYW1lKQorCisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICBzZXR0aW5nIG9wdGlvbnMgZm9yICclcycgY29tbWFuZDoiICUgY29tbWFuZF9uYW1lKQorICAgICAgICBmb3IgKG9wdGlvbiwgKHNvdXJjZSwgdmFsdWUpKSBpbiBvcHRpb25fZGljdC5pdGVtcygpOgorICAgICAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgiICAgICVzID0gJXMgKGZyb20gJXMpIiAlIChvcHRpb24sIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBib29sX29wdHMgPSBtYXAodHJhbnNsYXRlX2xvbmdvcHQsIGNvbW1hbmRfb2JqLmJvb2xlYW5fb3B0aW9ucykKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBib29sX29wdHMgPSBbXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5lZ19vcHQgPSBjb21tYW5kX29iai5uZWdhdGl2ZV9vcHQKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBuZWdfb3B0ID0ge30KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlzX3N0cmluZyA9IGlzaW5zdGFuY2UodmFsdWUsIHN0cikKKyAgICAgICAgICAgICAgICBpZiBvcHRpb24gaW4gbmVnX29wdCBhbmQgaXNfc3RyaW5nOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNvbW1hbmRfb2JqLCBuZWdfb3B0W29wdGlvbl0sIG5vdCBzdHJ0b2Jvb2wodmFsdWUpKQorICAgICAgICAgICAgICAgIGVsaWYgb3B0aW9uIGluIGJvb2xfb3B0cyBhbmQgaXNfc3RyaW5nOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNvbW1hbmRfb2JqLCBvcHRpb24sIHN0cnRvYm9vbCh2YWx1ZSkpCisgICAgICAgICAgICAgICAgZWxpZiBoYXNhdHRyKGNvbW1hbmRfb2JqLCBvcHRpb24pOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGNvbW1hbmRfb2JqLCBvcHRpb24sIHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiZXJyb3IgaW4gJXM6IGNvbW1hbmQgJyVzJyBoYXMgbm8gc3VjaCBvcHRpb24gJyVzJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNvdXJjZSwgY29tbWFuZF9uYW1lLCBvcHRpb24pKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvciwgbXNnCisKKyAgICBkZWYgcmVpbml0aWFsaXplX2NvbW1hbmQoc2VsZiwgY29tbWFuZCwgcmVpbml0X3N1YmNvbW1hbmRzPTApOgorICAgICAgICAiIiJSZWluaXRpYWxpemVzIGEgY29tbWFuZCB0byB0aGUgc3RhdGUgaXQgd2FzIGluIHdoZW4gZmlyc3QKKyAgICAgICAgcmV0dXJuZWQgYnkgJ2dldF9jb21tYW5kX29iaigpJzogaWUuLCBpbml0aWFsaXplZCBidXQgbm90IHlldAorICAgICAgICBmaW5hbGl6ZWQuICBUaGlzIHByb3ZpZGVzIHRoZSBvcHBvcnR1bml0eSB0byBzbmVhayBvcHRpb24KKyAgICAgICAgdmFsdWVzIGluIHByb2dyYW1tYXRpY2FsbHksIG92ZXJyaWRpbmcgb3Igc3VwcGxlbWVudGluZworICAgICAgICB1c2VyLXN1cHBsaWVkIHZhbHVlcyBmcm9tIHRoZSBjb25maWcgZmlsZXMgYW5kIGNvbW1hbmQgbGluZS4KKyAgICAgICAgWW91J2xsIGhhdmUgdG8gcmUtZmluYWxpemUgdGhlIGNvbW1hbmQgb2JqZWN0IChieSBjYWxsaW5nCisgICAgICAgICdmaW5hbGl6ZV9vcHRpb25zKCknIG9yICdlbnN1cmVfZmluYWxpemVkKCknKSBiZWZvcmUgdXNpbmcgaXQgZm9yCisgICAgICAgIHJlYWwuCisKKyAgICAgICAgJ2NvbW1hbmQnIHNob3VsZCBiZSBhIGNvbW1hbmQgbmFtZSAoc3RyaW5nKSBvciBjb21tYW5kIG9iamVjdC4gIElmCisgICAgICAgICdyZWluaXRfc3ViY29tbWFuZHMnIGlzIHRydWUsIGFsc28gcmVpbml0aWFsaXplcyB0aGUgY29tbWFuZCdzCisgICAgICAgIHN1Yi1jb21tYW5kcywgYXMgZGVjbGFyZWQgYnkgdGhlICdzdWJfY29tbWFuZHMnIGNsYXNzIGF0dHJpYnV0ZSAoaWYKKyAgICAgICAgaXQgaGFzIG9uZSkuICBTZWUgdGhlICJpbnN0YWxsIiBjb21tYW5kIGZvciBhbiBleGFtcGxlLiAgT25seQorICAgICAgICByZWluaXRpYWxpemVzIHRoZSBzdWItY29tbWFuZHMgdGhhdCBhY3R1YWxseSBtYXR0ZXIsIGllLiB0aG9zZQorICAgICAgICB3aG9zZSB0ZXN0IHByZWRpY2F0ZXMgcmV0dXJuIHRydWUuCisKKyAgICAgICAgUmV0dXJucyB0aGUgcmVpbml0aWFsaXplZCBjb21tYW5kIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmNtZCBpbXBvcnQgQ29tbWFuZAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb21tYW5kLCBDb21tYW5kKToKKyAgICAgICAgICAgIGNvbW1hbmRfbmFtZSA9IGNvbW1hbmQKKyAgICAgICAgICAgIGNvbW1hbmQgPSBzZWxmLmdldF9jb21tYW5kX29iaihjb21tYW5kX25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21tYW5kX25hbWUgPSBjb21tYW5kLmdldF9jb21tYW5kX25hbWUoKQorCisgICAgICAgIGlmIG5vdCBjb21tYW5kLmZpbmFsaXplZDoKKyAgICAgICAgICAgIHJldHVybiBjb21tYW5kCisgICAgICAgIGNvbW1hbmQuaW5pdGlhbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgY29tbWFuZC5maW5hbGl6ZWQgPSAwCisgICAgICAgIHNlbGYuaGF2ZV9ydW5bY29tbWFuZF9uYW1lXSA9IDAKKyAgICAgICAgc2VsZi5fc2V0X2NvbW1hbmRfb3B0aW9ucyhjb21tYW5kKQorCisgICAgICAgIGlmIHJlaW5pdF9zdWJjb21tYW5kczoKKyAgICAgICAgICAgIGZvciBzdWIgaW4gY29tbWFuZC5nZXRfc3ViX2NvbW1hbmRzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZChzdWIsIHJlaW5pdF9zdWJjb21tYW5kcykKKworICAgICAgICByZXR1cm4gY29tbWFuZAorCisgICAgIyAtLSBNZXRob2RzIHRoYXQgb3BlcmF0ZSBvbiB0aGUgRGlzdHJpYnV0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhbm5vdW5jZShzZWxmLCBtc2csIGxldmVsPWxvZy5JTkZPKToKKyAgICAgICAgbG9nLmxvZyhsZXZlbCwgbXNnKQorCisgICAgZGVmIHJ1bl9jb21tYW5kcyhzZWxmKToKKyAgICAgICAgIiIiUnVuIGVhY2ggY29tbWFuZCB0aGF0IHdhcyBzZWVuIG9uIHRoZSBzZXR1cCBzY3JpcHQgY29tbWFuZCBsaW5lLgorICAgICAgICBVc2VzIHRoZSBsaXN0IG9mIGNvbW1hbmRzIGZvdW5kIGFuZCBjYWNoZSBvZiBjb21tYW5kIG9iamVjdHMKKyAgICAgICAgY3JlYXRlZCBieSAnZ2V0X2NvbW1hbmRfb2JqKCknLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGNtZCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgc2VsZi5ydW5fY29tbWFuZChjbWQpCisKKyAgICAjIC0tIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGl0cyBDb21tYW5kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHJ1bl9jb21tYW5kKHNlbGYsIGNvbW1hbmQpOgorICAgICAgICAiIiJEbyB3aGF0ZXZlciBpdCB0YWtlcyB0byBydW4gYSBjb21tYW5kIChpbmNsdWRpbmcgbm90aGluZyBhdCBhbGwsCisgICAgICAgIGlmIHRoZSBjb21tYW5kIGhhcyBhbHJlYWR5IGJlZW4gcnVuKS4gIFNwZWNpZmljYWxseTogaWYgd2UgaGF2ZQorICAgICAgICBhbHJlYWR5IGNyZWF0ZWQgYW5kIHJ1biB0aGUgY29tbWFuZCBuYW1lZCBieSAnY29tbWFuZCcsIHJldHVybgorICAgICAgICBzaWxlbnRseSB3aXRob3V0IGRvaW5nIGFueXRoaW5nLiAgSWYgdGhlIGNvbW1hbmQgbmFtZWQgYnkgJ2NvbW1hbmQnCisgICAgICAgIGRvZXNuJ3QgZXZlbiBoYXZlIGEgY29tbWFuZCBvYmplY3QgeWV0LCBjcmVhdGUgb25lLiAgVGhlbiBpbnZva2UKKyAgICAgICAgJ3J1bigpJyBvbiB0aGF0IGNvbW1hbmQgb2JqZWN0IChvciBhbiBleGlzdGluZyBvbmUpLgorICAgICAgICAiIiIKKyAgICAgICAgIyBBbHJlYWR5IGJlZW4gaGVyZSwgZG9uZSB0aGF0PyB0aGVuIHJldHVybiBzaWxlbnRseS4KKyAgICAgICAgaWYgc2VsZi5oYXZlX3J1bi5nZXQoY29tbWFuZCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBsb2cuaW5mbygicnVubmluZyAlcyIsIGNvbW1hbmQpCisgICAgICAgIGNtZF9vYmogPSBzZWxmLmdldF9jb21tYW5kX29iaihjb21tYW5kKQorICAgICAgICBjbWRfb2JqLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWRfb2JqLnJ1bigpCisgICAgICAgIHNlbGYuaGF2ZV9ydW5bY29tbWFuZF0gPSAxCisKKworICAgICMgLS0gRGlzdHJpYnV0aW9uIHF1ZXJ5IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgaGFzX3B1cmVfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLnBhY2thZ2VzIG9yIHNlbGYucHlfbW9kdWxlcyBvciBbXSkgPiAwCisKKyAgICBkZWYgaGFzX2V4dF9tb2R1bGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5leHRfbW9kdWxlcyBhbmQgbGVuKHNlbGYuZXh0X21vZHVsZXMpID4gMAorCisgICAgZGVmIGhhc19jX2xpYnJhcmllcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGlicmFyaWVzIGFuZCBsZW4oc2VsZi5saWJyYXJpZXMpID4gMAorCisgICAgZGVmIGhhc19tb2R1bGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oYXNfcHVyZV9tb2R1bGVzKCkgb3Igc2VsZi5oYXNfZXh0X21vZHVsZXMoKQorCisgICAgZGVmIGhhc19oZWFkZXJzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzIGFuZCBsZW4oc2VsZi5oZWFkZXJzKSA+IDAKKworICAgIGRlZiBoYXNfc2NyaXB0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2NyaXB0cyBhbmQgbGVuKHNlbGYuc2NyaXB0cykgPiAwCisKKyAgICBkZWYgaGFzX2RhdGFfZmlsZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGFfZmlsZXMgYW5kIGxlbihzZWxmLmRhdGFfZmlsZXMpID4gMAorCisgICAgZGVmIGlzX3B1cmUoc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5oYXNfcHVyZV9tb2R1bGVzKCkgYW5kCisgICAgICAgICAgICAgICAgbm90IHNlbGYuaGFzX2V4dF9tb2R1bGVzKCkgYW5kCisgICAgICAgICAgICAgICAgbm90IHNlbGYuaGFzX2NfbGlicmFyaWVzKCkpCisKKyAgICAjIC0tIE1ldGFkYXRhIHF1ZXJ5IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgIyBJZiB5b3UncmUgbG9va2luZyBmb3IgJ2dldF9uYW1lKCknLCAnZ2V0X3ZlcnNpb24oKScsIGFuZCBzbyBmb3J0aCwKKyAgICAjIHRoZXkgYXJlIGRlZmluZWQgaW4gYSBzbmVha3kgd2F5OiB0aGUgY29uc3RydWN0b3IgYmluZHMgc2VsZi5nZXRfWFhYCisgICAgIyB0byBzZWxmLm1ldGFkYXRhLmdldF9YWFguICBUaGUgYWN0dWFsIGNvZGUgaXMgaW4gdGhlCisgICAgIyBEaXN0cmlidXRpb25NZXRhZGF0YSBjbGFzcywgYmVsb3cuCisKK2NsYXNzIERpc3RyaWJ1dGlvbk1ldGFkYXRhOgorICAgICIiIkR1bW15IGNsYXNzIHRvIGhvbGQgdGhlIGRpc3RyaWJ1dGlvbiBtZXRhLWRhdGE6IG5hbWUsIHZlcnNpb24sCisgICAgYXV0aG9yLCBhbmQgc28gZm9ydGguCisgICAgIiIiCisKKyAgICBfTUVUSE9EX0JBU0VOQU1FUyA9ICgibmFtZSIsICJ2ZXJzaW9uIiwgImF1dGhvciIsICJhdXRob3JfZW1haWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJtYWludGFpbmVyIiwgIm1haW50YWluZXJfZW1haWwiLCAidXJsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibGljZW5zZSIsICJkZXNjcmlwdGlvbiIsICJsb25nX2Rlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAia2V5d29yZHMiLCAicGxhdGZvcm1zIiwgImZ1bGxuYW1lIiwgImNvbnRhY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWN0X2VtYWlsIiwgImxpY2Vuc2UiLCAiY2xhc3NpZmllcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkb3dubG9hZF91cmwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICMgUEVQIDMxNAorICAgICAgICAgICAgICAgICAgICAgICAgICJwcm92aWRlcyIsICJyZXF1aXJlcyIsICJvYnNvbGV0ZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoPU5vbmUpOgorICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5yZWFkX3BrZ19maWxlKG9wZW4ocGF0aCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBOb25lCisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBOb25lCisgICAgICAgICAgICBzZWxmLmF1dGhvciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuYXV0aG9yX2VtYWlsID0gTm9uZQorICAgICAgICAgICAgc2VsZi5tYWludGFpbmVyID0gTm9uZQorICAgICAgICAgICAgc2VsZi5tYWludGFpbmVyX2VtYWlsID0gTm9uZQorICAgICAgICAgICAgc2VsZi51cmwgPSBOb25lCisgICAgICAgICAgICBzZWxmLmxpY2Vuc2UgPSBOb25lCisgICAgICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gTm9uZQorICAgICAgICAgICAgc2VsZi5sb25nX2Rlc2NyaXB0aW9uID0gTm9uZQorICAgICAgICAgICAgc2VsZi5rZXl3b3JkcyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYucGxhdGZvcm1zID0gTm9uZQorICAgICAgICAgICAgc2VsZi5jbGFzc2lmaWVycyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZG93bmxvYWRfdXJsID0gTm9uZQorICAgICAgICAgICAgIyBQRVAgMzE0CisgICAgICAgICAgICBzZWxmLnByb3ZpZGVzID0gTm9uZQorICAgICAgICAgICAgc2VsZi5yZXF1aXJlcyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYub2Jzb2xldGVzID0gTm9uZQorCisgICAgZGVmIHJlYWRfcGtnX2ZpbGUoc2VsZiwgZmlsZSk6CisgICAgICAgICIiIlJlYWRzIHRoZSBtZXRhZGF0YSB2YWx1ZXMgZnJvbSBhIGZpbGUgb2JqZWN0LiIiIgorICAgICAgICBtc2cgPSBtZXNzYWdlX2Zyb21fZmlsZShmaWxlKQorCisgICAgICAgIGRlZiBfcmVhZF9maWVsZChuYW1lKToKKyAgICAgICAgICAgIHZhbHVlID0gbXNnW25hbWVdCisgICAgICAgICAgICBpZiB2YWx1ZSA9PSAnVU5LTk9XTic6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIGRlZiBfcmVhZF9saXN0KG5hbWUpOgorICAgICAgICAgICAgdmFsdWVzID0gbXNnLmdldF9hbGwobmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGlmIHZhbHVlcyA9PSBbXToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgICAgIG1ldGFkYXRhX3ZlcnNpb24gPSBtc2dbJ21ldGFkYXRhLXZlcnNpb24nXQorICAgICAgICBzZWxmLm5hbWUgPSBfcmVhZF9maWVsZCgnbmFtZScpCisgICAgICAgIHNlbGYudmVyc2lvbiA9IF9yZWFkX2ZpZWxkKCd2ZXJzaW9uJykKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IF9yZWFkX2ZpZWxkKCdzdW1tYXJ5JykKKyAgICAgICAgIyB3ZSBhcmUgZmlsbGluZyBhdXRob3Igb25seS4KKyAgICAgICAgc2VsZi5hdXRob3IgPSBfcmVhZF9maWVsZCgnYXV0aG9yJykKKyAgICAgICAgc2VsZi5tYWludGFpbmVyID0gTm9uZQorICAgICAgICBzZWxmLmF1dGhvcl9lbWFpbCA9IF9yZWFkX2ZpZWxkKCdhdXRob3ItZW1haWwnKQorICAgICAgICBzZWxmLm1haW50YWluZXJfZW1haWwgPSBOb25lCisgICAgICAgIHNlbGYudXJsID0gX3JlYWRfZmllbGQoJ2hvbWUtcGFnZScpCisgICAgICAgIHNlbGYubGljZW5zZSA9IF9yZWFkX2ZpZWxkKCdsaWNlbnNlJykKKworICAgICAgICBpZiAnZG93bmxvYWQtdXJsJyBpbiBtc2c6CisgICAgICAgICAgICBzZWxmLmRvd25sb2FkX3VybCA9IF9yZWFkX2ZpZWxkKCdkb3dubG9hZC11cmwnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kb3dubG9hZF91cmwgPSBOb25lCisKKyAgICAgICAgc2VsZi5sb25nX2Rlc2NyaXB0aW9uID0gX3JlYWRfZmllbGQoJ2Rlc2NyaXB0aW9uJykKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IF9yZWFkX2ZpZWxkKCdzdW1tYXJ5JykKKworICAgICAgICBpZiAna2V5d29yZHMnIGluIG1zZzoKKyAgICAgICAgICAgIHNlbGYua2V5d29yZHMgPSBfcmVhZF9maWVsZCgna2V5d29yZHMnKS5zcGxpdCgnLCcpCisKKyAgICAgICAgc2VsZi5wbGF0Zm9ybXMgPSBfcmVhZF9saXN0KCdwbGF0Zm9ybScpCisgICAgICAgIHNlbGYuY2xhc3NpZmllcnMgPSBfcmVhZF9saXN0KCdjbGFzc2lmaWVyJykKKworICAgICAgICAjIFBFUCAzMTQgLSB0aGVzZSBmaWVsZHMgb25seSBleGlzdCBpbiAxLjEKKyAgICAgICAgaWYgbWV0YWRhdGFfdmVyc2lvbiA9PSAnMS4xJzoKKyAgICAgICAgICAgIHNlbGYucmVxdWlyZXMgPSBfcmVhZF9saXN0KCdyZXF1aXJlcycpCisgICAgICAgICAgICBzZWxmLnByb3ZpZGVzID0gX3JlYWRfbGlzdCgncHJvdmlkZXMnKQorICAgICAgICAgICAgc2VsZi5vYnNvbGV0ZXMgPSBfcmVhZF9saXN0KCdvYnNvbGV0ZXMnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZXF1aXJlcyA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYucHJvdmlkZXMgPSBOb25lCisgICAgICAgICAgICBzZWxmLm9ic29sZXRlcyA9IE5vbmUKKworICAgIGRlZiB3cml0ZV9wa2dfaW5mbyhzZWxmLCBiYXNlX2Rpcik6CisgICAgICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmaWxlIGludG8gdGhlIHJlbGVhc2UgdHJlZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBrZ19pbmZvID0gb3Blbihvcy5wYXRoLmpvaW4oYmFzZV9kaXIsICdQS0ctSU5GTycpLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYud3JpdGVfcGtnX2ZpbGUocGtnX2luZm8pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBwa2dfaW5mby5jbG9zZSgpCisKKyAgICBkZWYgd3JpdGVfcGtnX2ZpbGUoc2VsZiwgZmlsZSk6CisgICAgICAgICIiIldyaXRlIHRoZSBQS0ctSU5GTyBmb3JtYXQgZGF0YSB0byBhIGZpbGUgb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgdmVyc2lvbiA9ICcxLjAnCisgICAgICAgIGlmIChzZWxmLnByb3ZpZGVzIG9yIHNlbGYucmVxdWlyZXMgb3Igc2VsZi5vYnNvbGV0ZXMgb3IKKyAgICAgICAgICAgIHNlbGYuY2xhc3NpZmllcnMgb3Igc2VsZi5kb3dubG9hZF91cmwpOgorICAgICAgICAgICAgdmVyc2lvbiA9ICcxLjEnCisKKyAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ01ldGFkYXRhLVZlcnNpb24nLCB2ZXJzaW9uKQorICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnTmFtZScsIHNlbGYuZ2V0X25hbWUoKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ1ZlcnNpb24nLCBzZWxmLmdldF92ZXJzaW9uKCkpCisgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGUsICdTdW1tYXJ5Jywgc2VsZi5nZXRfZGVzY3JpcHRpb24oKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ0hvbWUtcGFnZScsIHNlbGYuZ2V0X3VybCgpKQorICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnQXV0aG9yJywgc2VsZi5nZXRfY29udGFjdCgpKQorICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnQXV0aG9yLWVtYWlsJywgc2VsZi5nZXRfY29udGFjdF9lbWFpbCgpKQorICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnTGljZW5zZScsIHNlbGYuZ2V0X2xpY2Vuc2UoKSkKKyAgICAgICAgaWYgc2VsZi5kb3dubG9hZF91cmw6CisgICAgICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCAnRG93bmxvYWQtVVJMJywgc2VsZi5kb3dubG9hZF91cmwpCisKKyAgICAgICAgbG9uZ19kZXNjID0gcmZjODIyX2VzY2FwZShzZWxmLmdldF9sb25nX2Rlc2NyaXB0aW9uKCkpCisgICAgICAgIHNlbGYuX3dyaXRlX2ZpZWxkKGZpbGUsICdEZXNjcmlwdGlvbicsIGxvbmdfZGVzYykKKworICAgICAgICBrZXl3b3JkcyA9ICcsJy5qb2luKHNlbGYuZ2V0X2tleXdvcmRzKCkpCisgICAgICAgIGlmIGtleXdvcmRzOgorICAgICAgICAgICAgc2VsZi5fd3JpdGVfZmllbGQoZmlsZSwgJ0tleXdvcmRzJywga2V5d29yZHMpCisKKyAgICAgICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUGxhdGZvcm0nLCBzZWxmLmdldF9wbGF0Zm9ybXMoKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnQ2xhc3NpZmllcicsIHNlbGYuZ2V0X2NsYXNzaWZpZXJzKCkpCisKKyAgICAgICAgIyBQRVAgMzE0CisgICAgICAgIHNlbGYuX3dyaXRlX2xpc3QoZmlsZSwgJ1JlcXVpcmVzJywgc2VsZi5nZXRfcmVxdWlyZXMoKSkKKyAgICAgICAgc2VsZi5fd3JpdGVfbGlzdChmaWxlLCAnUHJvdmlkZXMnLCBzZWxmLmdldF9wcm92aWRlcygpKQorICAgICAgICBzZWxmLl93cml0ZV9saXN0KGZpbGUsICdPYnNvbGV0ZXMnLCBzZWxmLmdldF9vYnNvbGV0ZXMoKSkKKworICAgIGRlZiBfd3JpdGVfZmllbGQoc2VsZiwgZmlsZSwgbmFtZSwgdmFsdWUpOgorICAgICAgICBmaWxlLndyaXRlKCclczogJXNcbicgJSAobmFtZSwgc2VsZi5fZW5jb2RlX2ZpZWxkKHZhbHVlKSkpCisKKyAgICBkZWYgX3dyaXRlX2xpc3QgKHNlbGYsIGZpbGUsIG5hbWUsIHZhbHVlcyk6CisgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6CisgICAgICAgICAgICBzZWxmLl93cml0ZV9maWVsZChmaWxlLCBuYW1lLCB2YWx1ZSkKKworICAgIGRlZiBfZW5jb2RlX2ZpZWxkKHNlbGYsIHZhbHVlKToKKyAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmVuY29kZShQS0dfSU5GT19FTkNPRElORykKKyAgICAgICAgcmV0dXJuIHN0cih2YWx1ZSkKKworICAgICMgLS0gTWV0YWRhdGEgcXVlcnkgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZ2V0X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUgb3IgIlVOS05PV04iCisKKyAgICBkZWYgZ2V0X3ZlcnNpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZlcnNpb24gb3IgIjAuMC4wIgorCisgICAgZGVmIGdldF9mdWxsbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcy0lcyIgJSAoc2VsZi5nZXRfbmFtZSgpLCBzZWxmLmdldF92ZXJzaW9uKCkpCisKKyAgICBkZWYgZ2V0X2F1dGhvcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kZV9maWVsZChzZWxmLmF1dGhvcikgb3IgIlVOS05PV04iCisKKyAgICBkZWYgZ2V0X2F1dGhvcl9lbWFpbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXV0aG9yX2VtYWlsIG9yICJVTktOT1dOIgorCisgICAgZGVmIGdldF9tYWludGFpbmVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZW5jb2RlX2ZpZWxkKHNlbGYubWFpbnRhaW5lcikgb3IgIlVOS05PV04iCisKKyAgICBkZWYgZ2V0X21haW50YWluZXJfZW1haWwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1haW50YWluZXJfZW1haWwgb3IgIlVOS05PV04iCisKKyAgICBkZWYgZ2V0X2NvbnRhY3Qoc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5fZW5jb2RlX2ZpZWxkKHNlbGYubWFpbnRhaW5lcikgb3IKKyAgICAgICAgICAgICAgICBzZWxmLl9lbmNvZGVfZmllbGQoc2VsZi5hdXRob3IpIG9yICJVTktOT1dOIikKKworICAgIGRlZiBnZXRfY29udGFjdF9lbWFpbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWFpbnRhaW5lcl9lbWFpbCBvciBzZWxmLmF1dGhvcl9lbWFpbCBvciAiVU5LTk9XTiIKKworICAgIGRlZiBnZXRfdXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi51cmwgb3IgIlVOS05PV04iCisKKyAgICBkZWYgZ2V0X2xpY2Vuc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxpY2Vuc2Ugb3IgIlVOS05PV04iCisgICAgZ2V0X2xpY2VuY2UgPSBnZXRfbGljZW5zZQorCisgICAgZGVmIGdldF9kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kZV9maWVsZChzZWxmLmRlc2NyaXB0aW9uKSBvciAiVU5LTk9XTiIKKworICAgIGRlZiBnZXRfbG9uZ19kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VuY29kZV9maWVsZChzZWxmLmxvbmdfZGVzY3JpcHRpb24pIG9yICJVTktOT1dOIgorCisgICAgZGVmIGdldF9rZXl3b3JkcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYua2V5d29yZHMgb3IgW10KKworICAgIGRlZiBnZXRfcGxhdGZvcm1zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wbGF0Zm9ybXMgb3IgWyJVTktOT1dOIl0KKworICAgIGRlZiBnZXRfY2xhc3NpZmllcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNsYXNzaWZpZXJzIG9yIFtdCisKKyAgICBkZWYgZ2V0X2Rvd25sb2FkX3VybChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZG93bmxvYWRfdXJsIG9yICJVTktOT1dOIgorCisgICAgIyBQRVAgMzE0CisgICAgZGVmIGdldF9yZXF1aXJlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVxdWlyZXMgb3IgW10KKworICAgIGRlZiBzZXRfcmVxdWlyZXMoc2VsZiwgdmFsdWUpOgorICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLnZlcnNpb25wcmVkaWNhdGUKKyAgICAgICAgZm9yIHYgaW4gdmFsdWU6CisgICAgICAgICAgICBkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZS5WZXJzaW9uUHJlZGljYXRlKHYpCisgICAgICAgIHNlbGYucmVxdWlyZXMgPSB2YWx1ZQorCisgICAgZGVmIGdldF9wcm92aWRlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHJvdmlkZXMgb3IgW10KKworICAgIGRlZiBzZXRfcHJvdmlkZXMoc2VsZiwgdmFsdWUpOgorICAgICAgICB2YWx1ZSA9IFt2LnN0cmlwKCkgZm9yIHYgaW4gdmFsdWVdCisgICAgICAgIGZvciB2IGluIHZhbHVlOgorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy52ZXJzaW9ucHJlZGljYXRlCisgICAgICAgICAgICBkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZS5zcGxpdF9wcm92aXNpb24odikKKyAgICAgICAgc2VsZi5wcm92aWRlcyA9IHZhbHVlCisKKyAgICBkZWYgZ2V0X29ic29sZXRlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub2Jzb2xldGVzIG9yIFtdCisKKyAgICBkZWYgc2V0X29ic29sZXRlcyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIGltcG9ydCBkaXN0dXRpbHMudmVyc2lvbnByZWRpY2F0ZQorICAgICAgICBmb3IgdiBpbiB2YWx1ZToKKyAgICAgICAgICAgIGRpc3R1dGlscy52ZXJzaW9ucHJlZGljYXRlLlZlcnNpb25QcmVkaWNhdGUodikKKyAgICAgICAgc2VsZi5vYnNvbGV0ZXMgPSB2YWx1ZQorCitkZWYgZml4X2hlbHBfb3B0aW9ucyhvcHRpb25zKToKKyAgICAiIiJDb252ZXJ0IGEgNC10dXBsZSAnaGVscF9vcHRpb25zJyBsaXN0IGFzIGZvdW5kIGluIHZhcmlvdXMgY29tbWFuZAorICAgIGNsYXNzZXMgdG8gdGhlIDMtdHVwbGUgZm9ybSByZXF1aXJlZCBieSBGYW5jeUdldG9wdC4KKyAgICAiIiIKKyAgICBuZXdfb3B0aW9ucyA9IFtdCisgICAgZm9yIGhlbHBfdHVwbGUgaW4gb3B0aW9uczoKKyAgICAgICAgbmV3X29wdGlvbnMuYXBwZW5kKGhlbHBfdHVwbGVbMDozXSkKKyAgICByZXR1cm4gbmV3X29wdGlvbnMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpc3QucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwZjNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwZjNjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Rpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE3MjA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZW14Y2NvbXBpbGVyLnB5CkBAIC0wLDAgKzEsMzE5IEBACisiIiJkaXN0dXRpbHMuZW14Y2NvbXBpbGVyCisKK1Byb3ZpZGVzIHRoZSBFTVhDQ29tcGlsZXIgY2xhc3MsIGEgc3ViY2xhc3Mgb2YgVW5peENDb21waWxlciB0aGF0CitoYW5kbGVzIHRoZSBFTVggcG9ydCBvZiB0aGUgR05VIEMgY29tcGlsZXIgdG8gT1MvMi4KKyIiIgorCisjIGlzc3VlczoKKyMKKyMgKiBPUy8yIGluc2lzdHMgdGhhdCBETExzIGNhbiBoYXZlIG5hbWVzIG5vIGxvbmdlciB0aGFuIDggY2hhcmFjdGVycworIyAgIFdlIHB1dCBleHBvcnRfc3ltYm9scyBpbiBhIGRlZi1maWxlLCBhcyB0aG91Z2ggdGhlIERMTCBjYW4gaGF2ZQorIyAgIGFuIGFyYml0cmFyeSBsZW5ndGggbmFtZSwgYnV0IHRydW5jYXRlIHRoZSBvdXRwdXQgZmlsZW5hbWUuCisjCisjICogb25seSB1c2UgT01GIG9iamVjdHMgYW5kIHVzZSBMSU5LMzg2IGFzIHRoZSBsaW5rZXIgKC1ab21mKQorIworIyAqIGFsd2F5cyBidWlsZCBmb3IgbXVsdGl0aHJlYWRpbmcgKC1abXQpIGFzIHRoZSBhY2NvbXBhbnlpbmcgT1MvMiBwb3J0CisjICAgb2YgUHl0aG9uIGlzIG9ubHkgZGlzdHJpYnV0ZWQgd2l0aCB0aHJlYWRzIGVuYWJsZWQuCisjCisjIHRlc3RlZCBjb25maWd1cmF0aW9uczoKKyMKKyMgKiBFTVggZ2NjIDIuODEvRU1YIDAuOWQgZml4MDMKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcyxzeXMsY29weQorZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBnZW5fcHJlcHJvY2Vzc19vcHRpb25zLCBnZW5fbGliX29wdGlvbnMKK2Zyb20gZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIgaW1wb3J0IFVuaXhDQ29tcGlsZXIKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgd3JpdGVfZmlsZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNFeGVjRXJyb3IsIENvbXBpbGVFcnJvciwgVW5rbm93bkZpbGVFcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyBFTVhDQ29tcGlsZXIgKFVuaXhDQ29tcGlsZXIpOgorCisgICAgY29tcGlsZXJfdHlwZSA9ICdlbXgnCisgICAgb2JqX2V4dGVuc2lvbiA9ICIub2JqIgorICAgIHN0YXRpY19saWJfZXh0ZW5zaW9uID0gIi5saWIiCisgICAgc2hhcmVkX2xpYl9leHRlbnNpb24gPSAiLmRsbCIKKyAgICBzdGF0aWNfbGliX2Zvcm1hdCA9ICIlcyVzIgorICAgIHNoYXJlZF9saWJfZm9ybWF0ID0gIiVzJXMiCisgICAgcmVzX2V4dGVuc2lvbiA9ICIucmVzIiAgICAgICMgY29tcGlsZWQgcmVzb3VyY2UgZmlsZQorICAgIGV4ZV9leHRlbnNpb24gPSAiLmV4ZSIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwKKyAgICAgICAgICAgICAgICAgIHZlcmJvc2U9MCwKKyAgICAgICAgICAgICAgICAgIGRyeV9ydW49MCwKKyAgICAgICAgICAgICAgICAgIGZvcmNlPTApOgorCisgICAgICAgIFVuaXhDQ29tcGlsZXIuX19pbml0X18gKHNlbGYsIHZlcmJvc2UsIGRyeV9ydW4sIGZvcmNlKQorCisgICAgICAgIChzdGF0dXMsIGRldGFpbHMpID0gY2hlY2tfY29uZmlnX2goKQorICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJQeXRob24ncyBHQ0Mgc3RhdHVzOiAlcyAoZGV0YWlsczogJXMpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1cywgZGV0YWlscykpCisgICAgICAgIGlmIHN0YXR1cyBpcyBub3QgQ09ORklHX0hfT0s6CisgICAgICAgICAgICBzZWxmLndhcm4oCisgICAgICAgICAgICAgICAgIlB5dGhvbidzIHB5Y29uZmlnLmggZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgeW91ciBjb21waWxlci4gICIgKworICAgICAgICAgICAgICAgICgiUmVhc29uOiAlcy4iICUgZGV0YWlscykgKworICAgICAgICAgICAgICAgICJDb21waWxpbmcgbWF5IGZhaWwgYmVjYXVzZSBvZiB1bmRlZmluZWQgcHJlcHJvY2Vzc29yIG1hY3Jvcy4iKQorCisgICAgICAgIChzZWxmLmdjY192ZXJzaW9uLCBzZWxmLmxkX3ZlcnNpb24pID0gXAorICAgICAgICAgICAgZ2V0X3ZlcnNpb25zKCkKKyAgICAgICAgc2VsZi5kZWJ1Z19wcmludChzZWxmLmNvbXBpbGVyX3R5cGUgKyAiOiBnY2MgJXMsIGxkICVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5nY2NfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sZF92ZXJzaW9uKSApCisKKyAgICAgICAgIyBIYXJkLWNvZGUgR0NDIGJlY2F1c2UgdGhhdCdzIHdoYXQgdGhpcyBpcyBhbGwgYWJvdXQuCisgICAgICAgICMgWFhYIG9wdGltaXphdGlvbiwgd2FybmluZ3MgZXRjLiBzaG91bGQgYmUgY3VzdG9taXphYmxlLgorICAgICAgICBzZWxmLnNldF9leGVjdXRhYmxlcyhjb21waWxlcj0nZ2NjIC1ab21mIC1abXQgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tcHJvYmUgLVdhbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlcl9zbz0nZ2NjIC1ab21mIC1abXQgLU8zIC1mb21pdC1mcmFtZS1wb2ludGVyIC1tcHJvYmUgLVdhbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rZXJfZXhlPSdnY2MgLVpvbWYgLVptdCAtWmNydGRsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlcl9zbz0nZ2NjIC1ab21mIC1abXQgLVpjcnRkbGwgLVpkbGwnKQorCisgICAgICAgICMgd2FudCB0aGUgZ2NjIGxpYnJhcnkgc3RhdGljYWxseSBsaW5rZWQgKHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZQorICAgICAgICAjIHRvIGRpc3RyaWJ1dGUgYSB2ZXJzaW9uIGRlcGVuZGVudCBvbiB0aGUgY29tcGlsZXIgd2UgaGF2ZSkKKyAgICAgICAgc2VsZi5kbGxfbGlicmFyaWVzPVsiZ2NjIl0KKworICAgICMgX19pbml0X18gKCkKKworICAgIGRlZiBfY29tcGlsZShzZWxmLCBvYmosIHNyYywgZXh0LCBjY19hcmdzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cyk6CisgICAgICAgIGlmIGV4dCA9PSAnLnJjJzoKKyAgICAgICAgICAgICMgZ2NjIHJlcXVpcmVzICcucmMnIGNvbXBpbGVkIHRvIGJpbmFyeSAoJy5yZXMnKSBmaWxlcyAhISEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduKFsicmMiLCAiLXIiLCBzcmNdKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisgICAgICAgIGVsc2U6ICMgZm9yIG90aGVyIGZpbGVzIHVzZSB0aGUgQy1jb21waWxlcgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oc2VsZi5jb21waWxlcl9zbyArIGNjX2FyZ3MgKyBbc3JjLCAnLW8nLCBvYmpdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisKKyAgICBkZWYgbGluayAoc2VsZiwKKyAgICAgICAgICAgICAgdGFyZ2V0X2Rlc2MsCisgICAgICAgICAgICAgIG9iamVjdHMsCisgICAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwKKyAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsCisgICAgICAgICAgICAgIGRlYnVnPTAsCisgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgYnVpbGRfdGVtcD1Ob25lLAorICAgICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKKworICAgICAgICAjIHVzZSBzZXBhcmF0ZSBjb3BpZXMsIHNvIHdlIGNhbiBtb2RpZnkgdGhlIGxpc3RzCisgICAgICAgIGV4dHJhX3ByZWFyZ3MgPSBjb3B5LmNvcHkoZXh0cmFfcHJlYXJncyBvciBbXSkKKyAgICAgICAgbGlicmFyaWVzID0gY29weS5jb3B5KGxpYnJhcmllcyBvciBbXSkKKyAgICAgICAgb2JqZWN0cyA9IGNvcHkuY29weShvYmplY3RzIG9yIFtdKQorCisgICAgICAgICMgQWRkaXRpb25hbCBsaWJyYXJpZXMKKyAgICAgICAgbGlicmFyaWVzLmV4dGVuZChzZWxmLmRsbF9saWJyYXJpZXMpCisKKyAgICAgICAgIyBoYW5kbGUgZXhwb3J0IHN5bWJvbHMgYnkgY3JlYXRpbmcgYSBkZWYtZmlsZQorICAgICAgICAjIHdpdGggZXhlY3V0YWJsZXMgdGhpcyBvbmx5IHdvcmtzIHdpdGggZ2NjL2xkIGFzIGxpbmtlcgorICAgICAgICBpZiAoKGV4cG9ydF9zeW1ib2xzIGlzIG5vdCBOb25lKSBhbmQKKyAgICAgICAgICAgICh0YXJnZXRfZGVzYyAhPSBzZWxmLkVYRUNVVEFCTEUpKToKKyAgICAgICAgICAgICMgKFRoZSBsaW5rZXIgZG9lc24ndCBkbyBhbnl0aGluZyBpZiBvdXRwdXQgaXMgdXAtdG8tZGF0ZS4KKyAgICAgICAgICAgICMgU28gaXQgd291bGQgcHJvYmFibHkgYmV0dGVyIHRvIGNoZWNrIGlmIHdlIHJlYWxseSBuZWVkIHRoaXMsCisgICAgICAgICAgICAjIGJ1dCBmb3IgdGhpcyB3ZSBoYWQgdG8gaW5zZXJ0IHNvbWUgdW5jaGFuZ2VkIHBhcnRzIG9mCisgICAgICAgICAgICAjIFVuaXhDQ29tcGlsZXIsIGFuZCB0aGlzIGlzIG5vdCB3aGF0IHdlIHdhbnQuKQorCisgICAgICAgICAgICAjIHdlIHdhbnQgdG8gcHV0IHNvbWUgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZQorICAgICAgICAgICAgIyBvYmplY3QgZmlsZXMgYXJlLCBidWlsZF90ZW1wIGRvZXNuJ3QgaGVscCBtdWNoCisgICAgICAgICAgICAjIHdoZXJlIGFyZSB0aGUgb2JqZWN0IGZpbGVzCisgICAgICAgICAgICB0ZW1wX2RpciA9IG9zLnBhdGguZGlybmFtZShvYmplY3RzWzBdKQorICAgICAgICAgICAgIyBuYW1lIG9mIGRsbCB0byBnaXZlIHRoZSBoZWxwZXIgZmlsZXMgdGhlIHNhbWUgYmFzZSBuYW1lCisgICAgICAgICAgICAoZGxsX25hbWUsIGRsbF9leHRlbnNpb24pID0gb3MucGF0aC5zcGxpdGV4dCgKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKG91dHB1dF9maWxlbmFtZSkpCisKKyAgICAgICAgICAgICMgZ2VuZXJhdGUgdGhlIGZpbGVuYW1lcyBmb3IgdGhlc2UgZmlsZXMKKyAgICAgICAgICAgIGRlZl9maWxlID0gb3MucGF0aC5qb2luKHRlbXBfZGlyLCBkbGxfbmFtZSArICIuZGVmIikKKworICAgICAgICAgICAgIyBHZW5lcmF0ZSAuZGVmIGZpbGUKKyAgICAgICAgICAgIGNvbnRlbnRzID0gWworICAgICAgICAgICAgICAgICJMSUJSQVJZICVzIElOSVRJTlNUQU5DRSBURVJNSU5TVEFOQ0UiICUgXAorICAgICAgICAgICAgICAgIG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShvdXRwdXRfZmlsZW5hbWUpKVswXSwKKyAgICAgICAgICAgICAgICAiREFUQSBNVUxUSVBMRSBOT05TSEFSRUQiLAorICAgICAgICAgICAgICAgICJFWFBPUlRTIl0KKyAgICAgICAgICAgIGZvciBzeW0gaW4gZXhwb3J0X3N5bWJvbHM6CisgICAgICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKCcgICIlcyInICUgc3ltKQorICAgICAgICAgICAgc2VsZi5leGVjdXRlKHdyaXRlX2ZpbGUsIChkZWZfZmlsZSwgY29udGVudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ3cml0aW5nICVzIiAlIGRlZl9maWxlKQorCisgICAgICAgICAgICAjIG5leHQgYWRkIG9wdGlvbnMgZm9yIGRlZi1maWxlIGFuZCB0byBjcmVhdGluZyBpbXBvcnQgbGlicmFyaWVzCisgICAgICAgICAgICAjIGZvciBnY2MvbGQgdGhlIGRlZi1maWxlIGlzIHNwZWNpZmllZCBhcyBhbnkgb3RoZXIgb2JqZWN0IGZpbGVzCisgICAgICAgICAgICBvYmplY3RzLmFwcGVuZChkZWZfZmlsZSkKKworICAgICAgICAjZW5kOiBpZiAoKGV4cG9ydF9zeW1ib2xzIGlzIG5vdCBOb25lKSBhbmQKKyAgICAgICAgIyAgICAgICAgKHRhcmdldF9kZXNjICE9IHNlbGYuRVhFQ1VUQUJMRSBvciBzZWxmLmxpbmtlcl9kbGwgPT0gImdjYyIpKToKKworICAgICAgICAjIHdobyB3YW50cyBzeW1ib2xzIGFuZCBhIG1hbnkgdGltZXMgbGFyZ2VyIG91dHB1dCBmaWxlCisgICAgICAgICMgc2hvdWxkIGV4cGxpY2l0bHkgc3dpdGNoIHRoZSBkZWJ1ZyBtb2RlIG9uCisgICAgICAgICMgb3RoZXJ3aXNlIHdlIGxldCBkbGx3cmFwL2xkIHN0cmlwIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICAjIChPbiBteSBtYWNoaW5lOiAxMEtCIDwgc3RyaXBwZWRfZmlsZSA8ID8/MTAwS0IKKyAgICAgICAgIyAgIHVuc3RyaXBwZWRfZmlsZSA9IHN0cmlwcGVkX2ZpbGUgKyBYWFggS0IKKyAgICAgICAgIyAgKCBYWFg9MjU0IGZvciBhIHR5cGljYWwgcHl0aG9uIGV4dGVuc2lvbikpCisgICAgICAgIGlmIG5vdCBkZWJ1ZzoKKyAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3MuYXBwZW5kKCItcyIpCisKKyAgICAgICAgVW5peENDb21waWxlci5saW5rKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCAjIGV4cG9ydF9zeW1ib2xzLCB3ZSBkbyB0aGlzIGluIG91ciBkZWYtZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF90ZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2xhbmcpCisKKyAgICAjIGxpbmsgKCkKKworICAgICMgLS0gTWlzY2VsbGFuZW91cyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAjIG92ZXJyaWRlIHRoZSBvYmplY3RfZmlsZW5hbWVzIG1ldGhvZCBmcm9tIENDb21waWxlciB0bworICAgICMgc3VwcG9ydCByYyBhbmQgcmVzLWZpbGVzCisgICAgZGVmIG9iamVjdF9maWxlbmFtZXMgKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9maWxlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwX2Rpcj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPScnKToKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBOb25lOiBvdXRwdXRfZGlyID0gJycKKyAgICAgICAgb2JqX25hbWVzID0gW10KKyAgICAgICAgZm9yIHNyY19uYW1lIGluIHNvdXJjZV9maWxlbmFtZXM6CisgICAgICAgICAgICAjIHVzZSBub3JtY2FzZSB0byBtYWtlIHN1cmUgJy5yYycgaXMgcmVhbGx5ICcucmMnIGFuZCBub3QgJy5SQycKKyAgICAgICAgICAgIChiYXNlLCBleHQpID0gb3MucGF0aC5zcGxpdGV4dCAob3MucGF0aC5ub3JtY2FzZShzcmNfbmFtZSkpCisgICAgICAgICAgICBpZiBleHQgbm90IGluIChzZWxmLnNyY19leHRlbnNpb25zICsgWycucmMnXSk6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5rbm93bkZpbGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGZpbGUgdHlwZSAnJXMnIChmcm9tICclcycpIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAoZXh0LCBzcmNfbmFtZSkKKyAgICAgICAgICAgIGlmIHN0cmlwX2RpcjoKKyAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZSAoYmFzZSkKKyAgICAgICAgICAgIGlmIGV4dCA9PSAnLnJjJzoKKyAgICAgICAgICAgICAgICAjIHRoZXNlIG5lZWQgdG8gYmUgY29tcGlsZWQgdG8gb2JqZWN0IGZpbGVzCisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5yZXNfZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5vYmpfZXh0ZW5zaW9uKSkKKyAgICAgICAgcmV0dXJuIG9ial9uYW1lcworCisgICAgIyBvYmplY3RfZmlsZW5hbWVzICgpCisKKyAgICAjIG92ZXJyaWRlIHRoZSBmaW5kX2xpYnJhcnlfZmlsZSBtZXRob2QgZnJvbSBVbml4Q0NvbXBpbGVyCisgICAgIyB0byBkZWFsIHdpdGggZmlsZSBuYW1pbmcvc2VhcmNoaW5nIGRpZmZlcmVuY2VzCisgICAgZGVmIGZpbmRfbGlicmFyeV9maWxlKHNlbGYsIGRpcnMsIGxpYiwgZGVidWc9MCk6CisgICAgICAgIHNob3J0bGliID0gJyVzLmxpYicgJSBsaWIKKyAgICAgICAgbG9uZ2xpYiA9ICdsaWIlcy5saWInICUgbGliICAgICMgdGhpcyBmb3JtIHZlcnkgcmFyZQorCisgICAgICAgICMgZ2V0IEVNWCdzIGRlZmF1bHQgbGlicmFyeSBkaXJlY3Rvcnkgc2VhcmNoIHBhdGgKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW14X2RpcnMgPSBvcy5lbnZpcm9uWydMSUJSQVJZX1BBVEgnXS5zcGxpdCgnOycpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGVteF9kaXJzID0gW10KKworICAgICAgICBmb3IgZGlyIGluIGRpcnMgKyBlbXhfZGlyczoKKyAgICAgICAgICAgIHNob3J0bGlicCA9IG9zLnBhdGguam9pbihkaXIsIHNob3J0bGliKQorICAgICAgICAgICAgbG9uZ2xpYnAgPSBvcy5wYXRoLmpvaW4oZGlyLCBsb25nbGliKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2hvcnRsaWJwKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2hvcnRsaWJwCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGxvbmdsaWJwKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9uZ2xpYnAKKworICAgICAgICAjIE9vcHMsIGRpZG4ndCBmaW5kIGl0IGluICphbnkqIG9mICdkaXJzJworICAgICAgICByZXR1cm4gTm9uZQorCisjIGNsYXNzIEVNWENDb21waWxlcgorCisKKyMgQmVjYXVzZSB0aGVzZSBjb21waWxlcnMgYXJlbid0IGNvbmZpZ3VyZWQgaW4gUHl0aG9uJ3MgcHljb25maWcuaCBmaWxlIGJ5CisjIGRlZmF1bHQsIHdlIHNob3VsZCBhdCBsZWFzdCB3YXJuIHRoZSB1c2VyIGlmIGhlIGlzIHVzaW5nIGEgdW5tb2RpZmllZAorIyB2ZXJzaW9uLgorCitDT05GSUdfSF9PSyA9ICJvayIKK0NPTkZJR19IX05PVE9LID0gIm5vdCBvayIKK0NPTkZJR19IX1VOQ0VSVEFJTiA9ICJ1bmNlcnRhaW4iCisKK2RlZiBjaGVja19jb25maWdfaCgpOgorCisgICAgIiIiQ2hlY2sgaWYgdGhlIGN1cnJlbnQgUHl0aG9uIGluc3RhbGxhdGlvbiAoc3BlY2lmaWNhbGx5LCBweWNvbmZpZy5oKQorICAgIGFwcGVhcnMgYW1lbmFibGUgdG8gYnVpbGRpbmcgZXh0ZW5zaW9ucyB3aXRoIEdDQy4gIFJldHVybnMgYSB0dXBsZQorICAgIChzdGF0dXMsIGRldGFpbHMpLCB3aGVyZSAnc3RhdHVzJyBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisgICAgICBDT05GSUdfSF9PSworICAgICAgICBhbGwgaXMgd2VsbCwgZ28gYWhlYWQgYW5kIGNvbXBpbGUKKyAgICAgIENPTkZJR19IX05PVE9LCisgICAgICAgIGRvZXNuJ3QgbG9vayBnb29kCisgICAgICBDT05GSUdfSF9VTkNFUlRBSU4KKyAgICAgICAgbm90IHN1cmUgLS0gdW5hYmxlIHRvIHJlYWQgcHljb25maWcuaAorICAgICdkZXRhaWxzJyBpcyBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBleHBsYWluaW5nIHRoZSBzaXR1YXRpb24uCisKKyAgICBOb3RlIHRoZXJlIGFyZSB0d28gd2F5cyB0byBjb25jbHVkZSAiT0siOiBlaXRoZXIgJ3N5cy52ZXJzaW9uJyBjb250YWlucworICAgIHRoZSBzdHJpbmcgIkdDQyIgKGltcGx5aW5nIHRoYXQgdGhpcyBQeXRob24gd2FzIGJ1aWx0IHdpdGggR0NDKSwgb3IgdGhlCisgICAgaW5zdGFsbGVkICJweWNvbmZpZy5oIiBjb250YWlucyB0aGUgc3RyaW5nICJfX0dOVUNfXyIuCisgICAgIiIiCisKKyAgICAjIFhYWCBzaW5jZSB0aGlzIGZ1bmN0aW9uIGFsc28gY2hlY2tzIHN5cy52ZXJzaW9uLCBpdCdzIG5vdCBzdHJpY3RseSBhCisgICAgIyAicHljb25maWcuaCIgY2hlY2sgLS0gc2hvdWxkIHByb2JhYmx5IGJlIHJlbmFtZWQuLi4KKworICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKyAgICBpbXBvcnQgc3RyaW5nCisgICAgIyBpZiBzeXMudmVyc2lvbiBjb250YWlucyBHQ0MgdGhlbiBweXRob24gd2FzIGNvbXBpbGVkIHdpdGgKKyAgICAjIEdDQywgYW5kIHRoZSBweWNvbmZpZy5oIGZpbGUgc2hvdWxkIGJlIE9LCisgICAgaWYgc3RyaW5nLmZpbmQoc3lzLnZlcnNpb24sIkdDQyIpID49IDA6CisgICAgICAgIHJldHVybiAoQ09ORklHX0hfT0ssICJzeXMudmVyc2lvbiBtZW50aW9ucyAnR0NDJyIpCisKKyAgICBmbiA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX2hfZmlsZW5hbWUoKQorICAgIHRyeToKKyAgICAgICAgIyBJdCB3b3VsZCBwcm9iYWJseSBiZXR0ZXIgdG8gcmVhZCBzaW5nbGUgbGluZXMgdG8gc2VhcmNoLgorICAgICAgICAjIEJ1dCB3ZSBkbyB0aGlzIG9ubHkgb25jZSwgYW5kIGl0IGlzIGZhc3QgZW5vdWdoCisgICAgICAgIGYgPSBvcGVuKGZuKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gZi5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZXhjZXB0IElPRXJyb3IsIGV4YzoKKyAgICAgICAgIyBpZiB3ZSBjYW4ndCByZWFkIHRoaXMgZmlsZSwgd2UgY2Fubm90IHNheSBpdCBpcyB3cm9uZworICAgICAgICAjIHRoZSBjb21waWxlciB3aWxsIGNvbXBsYWluIGxhdGVyIGFib3V0IHRoaXMgZmlsZSBhcyBtaXNzaW5nCisgICAgICAgIHJldHVybiAoQ09ORklHX0hfVU5DRVJUQUlOLAorICAgICAgICAgICAgICAgICJjb3VsZG4ndCByZWFkICclcyc6ICVzIiAlIChmbiwgZXhjLnN0cmVycm9yKSkKKworICAgIGVsc2U6CisgICAgICAgICMgInB5Y29uZmlnLmgiIGNvbnRhaW5zIGFuICIjaWZkZWYgX19HTlVDX18iIG9yIHNvbWV0aGluZyBzaW1pbGFyCisgICAgICAgIGlmIHN0cmluZy5maW5kKHMsIl9fR05VQ19fIikgPj0gMDoKKyAgICAgICAgICAgIHJldHVybiAoQ09ORklHX0hfT0ssICInJXMnIG1lbnRpb25zICdfX0dOVUNfXyciICUgZm4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKENPTkZJR19IX05PVE9LLCAiJyVzJyBkb2VzIG5vdCBtZW50aW9uICdfX0dOVUNfXyciICUgZm4pCisKKworZGVmIGdldF92ZXJzaW9ucygpOgorICAgICIiIiBUcnkgdG8gZmluZCBvdXQgdGhlIHZlcnNpb25zIG9mIGdjYyBhbmQgbGQuCisgICAgICAgIElmIG5vdCBwb3NzaWJsZSBpdCByZXR1cm5zIE5vbmUgZm9yIGl0LgorICAgICIiIgorICAgIGZyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IFN0cmljdFZlcnNpb24KKyAgICBmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCisgICAgaW1wb3J0IHJlCisKKyAgICBnY2NfZXhlID0gZmluZF9leGVjdXRhYmxlKCdnY2MnKQorICAgIGlmIGdjY19leGU6CisgICAgICAgIG91dCA9IG9zLnBvcGVuKGdjY19leGUgKyAnIC1kdW1wdmVyc2lvbicsJ3InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXRfc3RyaW5nID0gb3V0LnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3V0LmNsb3NlKCkKKyAgICAgICAgcmVzdWx0ID0gcmUuc2VhcmNoKCcoXGQrXC5cZCtcLlxkKyknLG91dF9zdHJpbmcpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIGdjY192ZXJzaW9uID0gU3RyaWN0VmVyc2lvbihyZXN1bHQuZ3JvdXAoMSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnY2NfdmVyc2lvbiA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBnY2NfdmVyc2lvbiA9IE5vbmUKKyAgICAjIEVNWCBsZCBoYXMgbm8gd2F5IG9mIHJlcG9ydGluZyB2ZXJzaW9uIG51bWJlciwgYW5kIHdlIHVzZSBHQ0MKKyAgICAjIGFueXdheSAtIHNvIHdlIGNhbiBsaW5rIE9NRiBETExzCisgICAgbGRfdmVyc2lvbiA9IE5vbmUKKyAgICByZXR1cm4gKGdjY192ZXJzaW9uLCBsZF92ZXJzaW9uKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZW14Y2NvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3OTA1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZW14Y2NvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3OTA1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2VteGNjb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXJyb3JzLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXJyb3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzQ3YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9lcnJvcnMucHkKQEAgLTAsMCArMSw4OCBAQAorIiIiZGlzdHV0aWxzLmVycm9ycworCitQcm92aWRlcyBleGNlcHRpb25zIHVzZWQgYnkgdGhlIERpc3R1dGlscyBtb2R1bGVzLiAgTm90ZSB0aGF0IERpc3R1dGlscworbW9kdWxlcyBtYXkgcmFpc2Ugc3RhbmRhcmQgZXhjZXB0aW9uczsgaW4gcGFydGljdWxhciwgU3lzdGVtRXhpdCBpcwordXN1YWxseSByYWlzZWQgZm9yIGVycm9ycyB0aGF0IGFyZSBvYnZpb3VzbHkgdGhlIGVuZC11c2VyJ3MgZmF1bHQKKyhlZy4gYmFkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMpLgorCitUaGlzIG1vZHVsZSBpcyBzYWZlIHRvIHVzZSBpbiAiZnJvbSAuLi4gaW1wb3J0ICoiIG1vZGU7IGl0IG9ubHkgZXhwb3J0cworc3ltYm9scyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoICJEaXN0dXRpbHMiIGFuZCBlbmQgd2l0aCAiRXJyb3IiLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworY2xhc3MgRGlzdHV0aWxzRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJUaGUgcm9vdCBvZiBhbGwgRGlzdHV0aWxzIGV2aWwuIiIiCisKK2NsYXNzIERpc3R1dGlsc01vZHVsZUVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJVbmFibGUgdG8gbG9hZCBhbiBleHBlY3RlZCBtb2R1bGUsIG9yIHRvIGZpbmQgYW4gZXhwZWN0ZWQgY2xhc3MKKyAgICB3aXRoaW4gc29tZSBtb2R1bGUgKGluIHBhcnRpY3VsYXIsIGNvbW1hbmQgbW9kdWxlcyBhbmQgY2xhc3NlcykuIiIiCisKK2NsYXNzIERpc3R1dGlsc0NsYXNzRXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIlNvbWUgY29tbWFuZCBjbGFzcyAob3IgcG9zc2libHkgZGlzdHJpYnV0aW9uIGNsYXNzLCBpZiBhbnlvbmUKKyAgICBmZWVscyBhIG5lZWQgdG8gc3ViY2xhc3MgRGlzdHJpYnV0aW9uKSBpcyBmb3VuZCBub3QgdG8gYmUgaG9sZGluZworICAgIHVwIGl0cyBlbmQgb2YgdGhlIGJhcmdhaW4sIGllLiBpbXBsZW1lbnRpbmcgc29tZSBwYXJ0IG9mIHRoZQorICAgICJjb21tYW5kICJpbnRlcmZhY2UuIiIiCisKK2NsYXNzIERpc3R1dGlsc0dldG9wdEVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJUaGUgb3B0aW9uIHRhYmxlIHByb3ZpZGVkIHRvICdmYW5jeV9nZXRvcHQoKScgaXMgYm9ndXMuIiIiCisKK2NsYXNzIERpc3R1dGlsc0FyZ0Vycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJSYWlzZWQgYnkgZmFuY3lfZ2V0b3B0IGluIHJlc3BvbnNlIHRvIGdldG9wdC5lcnJvciAtLSBpZS4gYW4KKyAgICBlcnJvciBpbiB0aGUgY29tbWFuZCBsaW5lIHVzYWdlLiIiIgorCitjbGFzcyBEaXN0dXRpbHNGaWxlRXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkFueSBwcm9ibGVtcyBpbiB0aGUgZmlsZXN5c3RlbTogZXhwZWN0ZWQgZmlsZSBub3QgZm91bmQsIGV0Yy4KKyAgICBUeXBpY2FsbHkgdGhpcyBpcyBmb3IgcHJvYmxlbXMgdGhhdCB3ZSBkZXRlY3QgYmVmb3JlIElPRXJyb3Igb3IKKyAgICBPU0Vycm9yIGNvdWxkIGJlIHJhaXNlZC4iIiIKKworY2xhc3MgRGlzdHV0aWxzT3B0aW9uRXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIlN5bnRhY3RpYy9zZW1hbnRpYyBlcnJvcnMgaW4gY29tbWFuZCBvcHRpb25zLCBzdWNoIGFzIHVzZSBvZgorICAgIG11dHVhbGx5IGNvbmZsaWN0aW5nIG9wdGlvbnMsIG9yIGluY29uc2lzdGVudCBvcHRpb25zLAorICAgIGJhZGx5LXNwZWxsZWQgdmFsdWVzLCBldGMuICBObyBkaXN0aW5jdGlvbiBpcyBtYWRlIGJldHdlZW4gb3B0aW9uCisgICAgdmFsdWVzIG9yaWdpbmF0aW5nIGluIHRoZSBzZXR1cCBzY3JpcHQsIHRoZSBjb21tYW5kIGxpbmUsIGNvbmZpZworICAgIGZpbGVzLCBvciB3aGF0LWhhdmUteW91IC0tIGJ1dCBpZiB3ZSAqa25vdyogc29tZXRoaW5nIG9yaWdpbmF0ZWQgaW4KKyAgICB0aGUgc2V0dXAgc2NyaXB0LCB3ZSdsbCByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yIGluc3RlYWQuIiIiCisKK2NsYXNzIERpc3R1dGlsc1NldHVwRXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkZvciBlcnJvcnMgdGhhdCBjYW4gYmUgZGVmaW5pdGVseSBibGFtZWQgb24gdGhlIHNldHVwIHNjcmlwdCwKKyAgICBzdWNoIGFzIGludmFsaWQga2V5d29yZCBhcmd1bWVudHMgdG8gJ3NldHVwKCknLiIiIgorCitjbGFzcyBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJXZSBkb24ndCBrbm93IGhvdyB0byBkbyBzb21ldGhpbmcgb24gdGhlIGN1cnJlbnQgcGxhdGZvcm0gKGJ1dAorICAgIHdlIGRvIGtub3cgaG93IHRvIGRvIGl0IG9uIHNvbWUgcGxhdGZvcm0pIC0tIGVnLiB0cnlpbmcgdG8gY29tcGlsZQorICAgIEMgZmlsZXMgb24gYSBwbGF0Zm9ybSBub3Qgc3VwcG9ydGVkIGJ5IGEgQ0NvbXBpbGVyIHN1YmNsYXNzLiIiIgorCitjbGFzcyBEaXN0dXRpbHNFeGVjRXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkFueSBwcm9ibGVtcyBleGVjdXRpbmcgYW4gZXh0ZXJuYWwgcHJvZ3JhbSAoc3VjaCBhcyB0aGUgQworICAgIGNvbXBpbGVyLCB3aGVuIGNvbXBpbGluZyBDIGZpbGVzKS4iIiIKKworY2xhc3MgRGlzdHV0aWxzSW50ZXJuYWxFcnJvcihEaXN0dXRpbHNFcnJvcik6CisgICAgIiIiSW50ZXJuYWwgaW5jb25zaXN0ZW5jaWVzIG9yIGltcG9zc2liaWxpdGllcyAob2J2aW91c2x5LCB0aGlzCisgICAgc2hvdWxkIG5ldmVyIGJlIHNlZW4gaWYgdGhlIGNvZGUgaXMgd29ya2luZyEpLiIiIgorCitjbGFzcyBEaXN0dXRpbHNUZW1wbGF0ZUVycm9yKERpc3R1dGlsc0Vycm9yKToKKyAgICAiIiJTeW50YXggZXJyb3IgaW4gYSBmaWxlIGxpc3QgdGVtcGxhdGUuIiIiCisKK2NsYXNzIERpc3R1dGlsc0J5dGVDb21waWxlRXJyb3IoRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkJ5dGUgY29tcGlsZSBlcnJvci4iIiIKKworIyBFeGNlcHRpb24gY2xhc3NlcyB1c2VkIGJ5IHRoZSBDQ29tcGlsZXIgaW1wbGVtZW50YXRpb24gY2xhc3NlcworY2xhc3MgQ0NvbXBpbGVyRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJTb21lIGNvbXBpbGUvbGluayBvcGVyYXRpb24gZmFpbGVkLiIiIgorCitjbGFzcyBQcmVwcm9jZXNzRXJyb3IoQ0NvbXBpbGVyRXJyb3IpOgorICAgICIiIkZhaWx1cmUgdG8gcHJlcHJvY2VzcyBvbmUgb3IgbW9yZSBDL0MrKyBmaWxlcy4iIiIKKworY2xhc3MgQ29tcGlsZUVycm9yKENDb21waWxlckVycm9yKToKKyAgICAiIiJGYWlsdXJlIHRvIGNvbXBpbGUgb25lIG9yIG1vcmUgQy9DKysgc291cmNlIGZpbGVzLiIiIgorCitjbGFzcyBMaWJFcnJvcihDQ29tcGlsZXJFcnJvcik6CisgICAgIiIiRmFpbHVyZSB0byBjcmVhdGUgYSBzdGF0aWMgbGlicmFyeSBmcm9tIG9uZSBvciBtb3JlIEMvQysrIG9iamVjdAorICAgIGZpbGVzLiIiIgorCitjbGFzcyBMaW5rRXJyb3IoQ0NvbXBpbGVyRXJyb3IpOgorICAgICIiIkZhaWx1cmUgdG8gbGluayBvbmUgb3IgbW9yZSBDL0MrKyBvYmplY3QgZmlsZXMgaW50byBhbiBleGVjdXRhYmxlCisgICAgb3Igc2hhcmVkIGxpYnJhcnkgZmlsZS4iIiIKKworY2xhc3MgVW5rbm93bkZpbGVFcnJvcihDQ29tcGlsZXJFcnJvcik6CisgICAgIiIiQXR0ZW1wdCB0byBwcm9jZXNzIGFuIHVua25vd24gZmlsZSB0eXBlLiIiIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXJyb3JzLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NTBmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXJyb3JzLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NTBmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2Vycm9ycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXh0ZW5zaW9uLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXh0ZW5zaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjdjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9leHRlbnNpb24ucHkKQEAgLTAsMCArMSwyNTUgQEAKKyIiImRpc3R1dGlscy5leHRlbnNpb24KKworUHJvdmlkZXMgdGhlIEV4dGVuc2lvbiBjbGFzcywgdXNlZCB0byBkZXNjcmliZSBDL0MrKyBleHRlbnNpb24KK21vZHVsZXMgaW4gc2V0dXAgc2NyaXB0cy4iIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcywgc3RyaW5nLCBzeXMKK2Zyb20gdHlwZXMgaW1wb3J0ICoKKwordHJ5OgorICAgIGltcG9ydCB3YXJuaW5ncworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHdhcm5pbmdzID0gTm9uZQorCisjIFRoaXMgY2xhc3MgaXMgcmVhbGx5IG9ubHkgdXNlZCBieSB0aGUgImJ1aWxkX2V4dCIgY29tbWFuZCwgc28gaXQgbWlnaHQKKyMgbWFrZSBzZW5zZSB0byBwdXQgaXQgaW4gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0LiAgSG93ZXZlciwgdGhhdAorIyBtb2R1bGUgaXMgYWxyZWFkeSBiaWcgZW5vdWdoLCBhbmQgSSB3YW50IHRvIG1ha2UgdGhpcyBjbGFzcyBhIGJpdCBtb3JlCisjIGNvbXBsZXggdG8gc2ltcGxpZnkgc29tZSBjb21tb24gY2FzZXMgKCJmb28iIG1vZHVsZSBpbiAiZm9vLmMiKSBhbmQgZG8KKyMgYmV0dGVyIGVycm9yLWNoZWNraW5nICgiZm9vLmMiIGFjdHVhbGx5IGV4aXN0cykuCisjCisjIEFsc28sIHB1dHRpbmcgdGhpcyBpbiBidWlsZF9leHQucHkgbWVhbnMgZXZlcnkgc2V0dXAgc2NyaXB0IHdvdWxkIGhhdmUgdG8KKyMgaW1wb3J0IHRoYXQgbGFyZ2UtaXNoIG1vZHVsZSAoaW5kaXJlY3RseSwgdGhyb3VnaCBkaXN0dXRpbHMuY29yZSkgaW4KKyMgb3JkZXIgdG8gZG8gYW55dGhpbmcuCisKK2NsYXNzIEV4dGVuc2lvbjoKKyAgICAiIiJKdXN0IGEgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGVzIHRoYXQgZGVzY3JpYmVzIGFuIGV4dGVuc2lvbgorICAgIG1vZHVsZSBhbmQgZXZlcnl0aGluZyBuZWVkZWQgdG8gYnVpbGQgaXQgKGhvcGVmdWxseSBpbiBhIHBvcnRhYmxlCisgICAgd2F5LCBidXQgdGhlcmUgYXJlIGhvb2tzIHRoYXQgbGV0IHlvdSBiZSBhcyB1bnBvcnRhYmxlIGFzIHlvdSBuZWVkKS4KKworICAgIEluc3RhbmNlIGF0dHJpYnV0ZXM6CisgICAgICBuYW1lIDogc3RyaW5nCisgICAgICAgIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiwgaW5jbHVkaW5nIGFueSBwYWNrYWdlcyAtLSBpZS4KKyAgICAgICAgKm5vdCogYSBmaWxlbmFtZSBvciBwYXRobmFtZSwgYnV0IFB5dGhvbiBkb3R0ZWQgbmFtZQorICAgICAgc291cmNlcyA6IFtzdHJpbmddCisgICAgICAgIGxpc3Qgb2Ygc291cmNlIGZpbGVuYW1lcywgcmVsYXRpdmUgdG8gdGhlIGRpc3RyaWJ1dGlvbiByb290CisgICAgICAgICh3aGVyZSB0aGUgc2V0dXAgc2NyaXB0IGxpdmVzKSwgaW4gVW5peCBmb3JtIChzbGFzaC1zZXBhcmF0ZWQpCisgICAgICAgIGZvciBwb3J0YWJpbGl0eS4gIFNvdXJjZSBmaWxlcyBtYXkgYmUgQywgQysrLCBTV0lHICguaSksCisgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIHJlc291cmNlIGZpbGVzLCBvciB3aGF0ZXZlciBlbHNlIGlzIHJlY29nbml6ZWQKKyAgICAgICAgYnkgdGhlICJidWlsZF9leHQiIGNvbW1hbmQgYXMgc291cmNlIGZvciBhIFB5dGhvbiBleHRlbnNpb24uCisgICAgICBpbmNsdWRlX2RpcnMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgQy9DKysgaGVhZGVyIGZpbGVzIChpbiBVbml4CisgICAgICAgIGZvcm0gZm9yIHBvcnRhYmlsaXR5KQorICAgICAgZGVmaW5lX21hY3JvcyA6IFsobmFtZSA6IHN0cmluZywgdmFsdWUgOiBzdHJpbmd8Tm9uZSldCisgICAgICAgIGxpc3Qgb2YgbWFjcm9zIHRvIGRlZmluZTsgZWFjaCBtYWNybyBpcyBkZWZpbmVkIHVzaW5nIGEgMi10dXBsZSwKKyAgICAgICAgd2hlcmUgJ3ZhbHVlJyBpcyBlaXRoZXIgdGhlIHN0cmluZyB0byBkZWZpbmUgaXQgdG8gb3IgTm9uZSB0bworICAgICAgICBkZWZpbmUgaXQgd2l0aG91dCBhIHBhcnRpY3VsYXIgdmFsdWUgKGVxdWl2YWxlbnQgb2YgIiNkZWZpbmUKKyAgICAgICAgRk9PIiBpbiBzb3VyY2Ugb3IgLURGT08gb24gVW5peCBDIGNvbXBpbGVyIGNvbW1hbmQgbGluZSkKKyAgICAgIHVuZGVmX21hY3JvcyA6IFtzdHJpbmddCisgICAgICAgIGxpc3Qgb2YgbWFjcm9zIHRvIHVuZGVmaW5lIGV4cGxpY2l0bHkKKyAgICAgIGxpYnJhcnlfZGlycyA6IFtzdHJpbmddCisgICAgICAgIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdG8gc2VhcmNoIGZvciBDL0MrKyBsaWJyYXJpZXMgYXQgbGluayB0aW1lCisgICAgICBsaWJyYXJpZXMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIGxpYnJhcnkgbmFtZXMgKG5vdCBmaWxlbmFtZXMgb3IgcGF0aHMpIHRvIGxpbmsgYWdhaW5zdAorICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgQy9DKysgbGlicmFyaWVzIGF0IHJ1biB0aW1lCisgICAgICAgIChmb3Igc2hhcmVkIGV4dGVuc2lvbnMsIHRoaXMgaXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGxvYWRlZCkKKyAgICAgIGV4dHJhX29iamVjdHMgOiBbc3RyaW5nXQorICAgICAgICBsaXN0IG9mIGV4dHJhIGZpbGVzIHRvIGxpbmsgd2l0aCAoZWcuIG9iamVjdCBmaWxlcyBub3QgaW1wbGllZAorICAgICAgICBieSAnc291cmNlcycsIHN0YXRpYyBsaWJyYXJ5IHRoYXQgbXVzdCBiZSBleHBsaWNpdGx5IHNwZWNpZmllZCwKKyAgICAgICAgYmluYXJ5IHJlc291cmNlIGZpbGVzLCBldGMuKQorICAgICAgZXh0cmFfY29tcGlsZV9hcmdzIDogW3N0cmluZ10KKyAgICAgICAgYW55IGV4dHJhIHBsYXRmb3JtLSBhbmQgY29tcGlsZXItc3BlY2lmaWMgaW5mb3JtYXRpb24gdG8gdXNlCisgICAgICAgIHdoZW4gY29tcGlsaW5nIHRoZSBzb3VyY2UgZmlsZXMgaW4gJ3NvdXJjZXMnLiAgRm9yIHBsYXRmb3JtcyBhbmQKKyAgICAgICAgY29tcGlsZXJzIHdoZXJlICJjb21tYW5kIGxpbmUiIG1ha2VzIHNlbnNlLCB0aGlzIGlzIHR5cGljYWxseSBhCisgICAgICAgIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgYnV0IGZvciBvdGhlciBwbGF0Zm9ybXMgaXQgY291bGQKKyAgICAgICAgYmUgYW55dGhpbmcuCisgICAgICBleHRyYV9saW5rX2FyZ3MgOiBbc3RyaW5nXQorICAgICAgICBhbnkgZXh0cmEgcGxhdGZvcm0tIGFuZCBjb21waWxlci1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byB1c2UKKyAgICAgICAgd2hlbiBsaW5raW5nIG9iamVjdCBmaWxlcyB0b2dldGhlciB0byBjcmVhdGUgdGhlIGV4dGVuc2lvbiAob3IKKyAgICAgICAgdG8gY3JlYXRlIGEgbmV3IHN0YXRpYyBQeXRob24gaW50ZXJwcmV0ZXIpLiAgU2ltaWxhcgorICAgICAgICBpbnRlcnByZXRhdGlvbiBhcyBmb3IgJ2V4dHJhX2NvbXBpbGVfYXJncycuCisgICAgICBleHBvcnRfc3ltYm9scyA6IFtzdHJpbmddCisgICAgICAgIGxpc3Qgb2Ygc3ltYm9scyB0byBiZSBleHBvcnRlZCBmcm9tIGEgc2hhcmVkIGV4dGVuc2lvbi4gIE5vdAorICAgICAgICB1c2VkIG9uIGFsbCBwbGF0Zm9ybXMsIGFuZCBub3QgZ2VuZXJhbGx5IG5lY2Vzc2FyeSBmb3IgUHl0aG9uCisgICAgICAgIGV4dGVuc2lvbnMsIHdoaWNoIHR5cGljYWxseSBleHBvcnQgZXhhY3RseSBvbmUgc3ltYm9sOiAiaW5pdCIgKworICAgICAgICBleHRlbnNpb25fbmFtZS4KKyAgICAgIHN3aWdfb3B0cyA6IFtzdHJpbmddCisgICAgICAgIGFueSBleHRyYSBvcHRpb25zIHRvIHBhc3MgdG8gU1dJRyBpZiBhIHNvdXJjZSBmaWxlIGhhcyB0aGUgLmkKKyAgICAgICAgZXh0ZW5zaW9uLgorICAgICAgZGVwZW5kcyA6IFtzdHJpbmddCisgICAgICAgIGxpc3Qgb2YgZmlsZXMgdGhhdCB0aGUgZXh0ZW5zaW9uIGRlcGVuZHMgb24KKyAgICAgIGxhbmd1YWdlIDogc3RyaW5nCisgICAgICAgIGV4dGVuc2lvbiBsYW5ndWFnZSAoaS5lLiAiYyIsICJjKysiLCAib2JqYyIpLiBXaWxsIGJlIGRldGVjdGVkCisgICAgICAgIGZyb20gdGhlIHNvdXJjZSBleHRlbnNpb25zIGlmIG5vdCBwcm92aWRlZC4KKyAgICAiIiIKKworICAgICMgV2hlbiBhZGRpbmcgYXJndW1lbnRzIHRvIHRoaXMgY29uc3RydWN0b3IsIGJlIHN1cmUgdG8gdXBkYXRlCisgICAgIyBzZXR1cF9rZXl3b3JkcyBpbiBjb3JlLnB5LgorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgbmFtZSwgc291cmNlcywKKyAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1Ob25lLAorICAgICAgICAgICAgICAgICAgZGVmaW5lX21hY3Jvcz1Ob25lLAorICAgICAgICAgICAgICAgICAgdW5kZWZfbWFjcm9zPU5vbmUsCisgICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1Ob25lLAorICAgICAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGV4dHJhX29iamVjdHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncz1Ob25lLAorICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPU5vbmUsCisgICAgICAgICAgICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLAorICAgICAgICAgICAgICAgICAgc3dpZ19vcHRzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgIGRlcGVuZHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGxhbmd1YWdlPU5vbmUsCisgICAgICAgICAgICAgICAgICAqKmt3ICAgICAgICAgICAgICAgICAgICAgICMgVG8gY2F0Y2ggdW5rbm93biBrZXl3b3JkcworICAgICAgICAgICAgICAgICApOgorICAgICAgICBhc3NlcnQgdHlwZShuYW1lKSBpcyBTdHJpbmdUeXBlLCAiJ25hbWUnIG11c3QgYmUgYSBzdHJpbmciCisgICAgICAgIGFzc2VydCAodHlwZShzb3VyY2VzKSBpcyBMaXN0VHlwZSBhbmQKKyAgICAgICAgICAgICAgICBtYXAodHlwZSwgc291cmNlcykgPT0gW1N0cmluZ1R5cGVdKmxlbihzb3VyY2VzKSksIFwKKyAgICAgICAgICAgICAgICAiJ3NvdXJjZXMnIG11c3QgYmUgYSBsaXN0IG9mIHN0cmluZ3MiCisKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnNvdXJjZXMgPSBzb3VyY2VzCisgICAgICAgIHNlbGYuaW5jbHVkZV9kaXJzID0gaW5jbHVkZV9kaXJzIG9yIFtdCisgICAgICAgIHNlbGYuZGVmaW5lX21hY3JvcyA9IGRlZmluZV9tYWNyb3Mgb3IgW10KKyAgICAgICAgc2VsZi51bmRlZl9tYWNyb3MgPSB1bmRlZl9tYWNyb3Mgb3IgW10KKyAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMgPSBsaWJyYXJ5X2RpcnMgb3IgW10KKyAgICAgICAgc2VsZi5saWJyYXJpZXMgPSBsaWJyYXJpZXMgb3IgW10KKyAgICAgICAgc2VsZi5ydW50aW1lX2xpYnJhcnlfZGlycyA9IHJ1bnRpbWVfbGlicmFyeV9kaXJzIG9yIFtdCisgICAgICAgIHNlbGYuZXh0cmFfb2JqZWN0cyA9IGV4dHJhX29iamVjdHMgb3IgW10KKyAgICAgICAgc2VsZi5leHRyYV9jb21waWxlX2FyZ3MgPSBleHRyYV9jb21waWxlX2FyZ3Mgb3IgW10KKyAgICAgICAgc2VsZi5leHRyYV9saW5rX2FyZ3MgPSBleHRyYV9saW5rX2FyZ3Mgb3IgW10KKyAgICAgICAgc2VsZi5leHBvcnRfc3ltYm9scyA9IGV4cG9ydF9zeW1ib2xzIG9yIFtdCisgICAgICAgIHNlbGYuc3dpZ19vcHRzID0gc3dpZ19vcHRzIG9yIFtdCisgICAgICAgIHNlbGYuZGVwZW5kcyA9IGRlcGVuZHMgb3IgW10KKyAgICAgICAgc2VsZi5sYW5ndWFnZSA9IGxhbmd1YWdlCisKKyAgICAgICAgIyBJZiB0aGVyZSBhcmUgdW5rbm93biBrZXl3b3JkIG9wdGlvbnMsIHdhcm4gYWJvdXQgdGhlbQorICAgICAgICBpZiBsZW4oa3cpOgorICAgICAgICAgICAgTCA9IGt3LmtleXMoKSA7IEwuc29ydCgpCisgICAgICAgICAgICBMID0gbWFwKHJlcHIsIEwpCisgICAgICAgICAgICBtc2cgPSAiVW5rbm93biBFeHRlbnNpb24gb3B0aW9uczogIiArIHN0cmluZy5qb2luKEwsICcsICcpCisgICAgICAgICAgICBpZiB3YXJuaW5ncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cgKyAnXG4nKQorIyBjbGFzcyBFeHRlbnNpb24KKworCitkZWYgcmVhZF9zZXR1cF9maWxlIChmaWxlbmFtZSk6CisgICAgZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBcCisgICAgICAgICBwYXJzZV9tYWtlZmlsZSwgZXhwYW5kX21ha2VmaWxlX3ZhcnMsIF92YXJpYWJsZV9yeAorICAgIGZyb20gZGlzdHV0aWxzLnRleHRfZmlsZSBpbXBvcnQgVGV4dEZpbGUKKyAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzcGxpdF9xdW90ZWQKKworICAgICMgRmlyc3QgcGFzcyBvdmVyIHRoZSBmaWxlIHRvIGdhdGhlciAiVkFSID0gVkFMVUUiIGFzc2lnbm1lbnRzLgorICAgIHZhcnMgPSBwYXJzZV9tYWtlZmlsZShmaWxlbmFtZSkKKworICAgICMgU2Vjb25kIHBhc3MgdG8gZ29iYmxlIHVwIHRoZSByZWFsIGNvbnRlbnQ6IGxpbmVzIG9mIHRoZSBmb3JtCisgICAgIyAgIDxtb2R1bGU+IC4uLiBbPHNvdXJjZWZpbGU+IC4uLl0gWzxjcHBhcmc+IC4uLl0gWzxsaWJyYXJ5PiAuLi5dCisgICAgZmlsZSA9IFRleHRGaWxlKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBzdHJpcF9jb21tZW50cz0xLCBza2lwX2JsYW5rcz0xLCBqb2luX2xpbmVzPTEsCisgICAgICAgICAgICAgICAgICAgIGxzdHJpcF93cz0xLCByc3RyaXBfd3M9MSkKKyAgICB0cnk6CisgICAgICAgIGV4dGVuc2lvbnMgPSBbXQorCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lIGlzIE5vbmU6ICAgICAgICAgICAgICAgICMgZW9mCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIF92YXJpYWJsZV9yeC5tYXRjaChsaW5lKTogICAgIyBWQVI9VkFMVUUsIGhhbmRsZWQgaW4gZmlyc3QgcGFzcworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBsaW5lWzBdID09IGxpbmVbLTFdID09ICIqIjoKKyAgICAgICAgICAgICAgICAgICAgZmlsZS53YXJuKCInJXMnIGxpbmVzIG5vdCBoYW5kbGVkIHlldCIgJSBsaW5lKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjcHJpbnQgIm9yaWdpbmFsIGxpbmU6ICIgKyBsaW5lCisgICAgICAgICAgICBsaW5lID0gZXhwYW5kX21ha2VmaWxlX3ZhcnMobGluZSwgdmFycykKKyAgICAgICAgICAgIHdvcmRzID0gc3BsaXRfcXVvdGVkKGxpbmUpCisgICAgICAgICAgICAjcHJpbnQgImV4cGFuZGVkIGxpbmU6ICIgKyBsaW5lCisKKyAgICAgICAgICAgICMgTkIuIHRoaXMgcGFyc2VzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHN5bnRheCB0aGFuIHRoZSBvbGQKKyAgICAgICAgICAgICMgbWFrZXNldHVwIHNjcmlwdDogaGVyZSwgdGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSBleHRlbnNpb24gcGVyCisgICAgICAgICAgICAjIGxpbmUsIGFuZCBpdCBtdXN0IGJlIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBsaW5lLiAgSSBoYXZlIG5vIGlkZWEKKyAgICAgICAgICAgICMgd2h5IHRoZSBvbGQgc3ludGF4IHN1cHBvcnRlZCBtdWx0aXBsZSBleHRlbnNpb25zIHBlciBsaW5lLCBhcworICAgICAgICAgICAgIyB0aGV5IGFsbCB3aW5kIHVwIGJlaW5nIHRoZSBzYW1lLgorCisgICAgICAgICAgICBtb2R1bGUgPSB3b3Jkc1swXQorICAgICAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKG1vZHVsZSwgW10pCisgICAgICAgICAgICBhcHBlbmRfbmV4dF93b3JkID0gTm9uZQorCisgICAgICAgICAgICBmb3Igd29yZCBpbiB3b3Jkc1sxOl06CisgICAgICAgICAgICAgICAgaWYgYXBwZW5kX25leHRfd29yZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX25leHRfd29yZC5hcHBlbmQod29yZCkKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX25leHRfd29yZCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIHN1ZmZpeCA9IG9zLnBhdGguc3BsaXRleHQod29yZClbMV0KKyAgICAgICAgICAgICAgICBzd2l0Y2ggPSB3b3JkWzA6Ml0gOyB2YWx1ZSA9IHdvcmRbMjpdCisKKyAgICAgICAgICAgICAgICBpZiBzdWZmaXggaW4gKCIuYyIsICIuY2MiLCAiLmNwcCIsICIuY3h4IiwgIi5jKysiLCAiLm0iLCAiLm1tIik6CisgICAgICAgICAgICAgICAgICAgICMgaG1tLCBzaG91bGQgd2UgZG8gc29tZXRoaW5nIGFib3V0IEMgdnMuIEMrKyBzb3VyY2VzPworICAgICAgICAgICAgICAgICAgICAjIG9yIGxlYXZlIGl0IHVwIHRvIHRoZSBDQ29tcGlsZXIgaW1wbGVtZW50YXRpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgIyB3b3JyeSBhYm91dD8KKyAgICAgICAgICAgICAgICAgICAgZXh0LnNvdXJjZXMuYXBwZW5kKHdvcmQpCisgICAgICAgICAgICAgICAgZWxpZiBzd2l0Y2ggPT0gIi1JIjoKKyAgICAgICAgICAgICAgICAgICAgZXh0LmluY2x1ZGVfZGlycy5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICAgICAgZWxpZiBzd2l0Y2ggPT0gIi1EIjoKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxzID0gc3RyaW5nLmZpbmQodmFsdWUsICI9IikKKyAgICAgICAgICAgICAgICAgICAgaWYgZXF1YWxzID09IC0xOiAgICAgICAgIyBiYXJlICItREZPTyIgLS0gbm8gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dC5kZWZpbmVfbWFjcm9zLmFwcGVuZCgodmFsdWUsIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAjICItREZPTz1ibGFoIgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0LmRlZmluZV9tYWNyb3MuYXBwZW5kKCh2YWx1ZVswOmVxdWFsc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW2VxdWFscysyOl0pKQorICAgICAgICAgICAgICAgIGVsaWYgc3dpdGNoID09ICItVSI6CisgICAgICAgICAgICAgICAgICAgIGV4dC51bmRlZl9tYWNyb3MuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsaWYgc3dpdGNoID09ICItQyI6ICAgICAgICAjIG9ubHkgaGVyZSAnY2F1c2UgbWFrZXNldHVwIGhhcyBpdCEKKyAgICAgICAgICAgICAgICAgICAgZXh0LmV4dHJhX2NvbXBpbGVfYXJncy5hcHBlbmQod29yZCkKKyAgICAgICAgICAgICAgICBlbGlmIHN3aXRjaCA9PSAiLWwiOgorICAgICAgICAgICAgICAgICAgICBleHQubGlicmFyaWVzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbGlmIHN3aXRjaCA9PSAiLUwiOgorICAgICAgICAgICAgICAgICAgICBleHQubGlicmFyeV9kaXJzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbGlmIHN3aXRjaCA9PSAiLVIiOgorICAgICAgICAgICAgICAgICAgICBleHQucnVudGltZV9saWJyYXJ5X2RpcnMuYXBwZW5kKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsaWYgd29yZCA9PSAiLXJwYXRoIjoKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kX25leHRfd29yZCA9IGV4dC5ydW50aW1lX2xpYnJhcnlfZGlycworICAgICAgICAgICAgICAgIGVsaWYgd29yZCA9PSAiLVhsaW5rZXIiOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRfbmV4dF93b3JkID0gZXh0LmV4dHJhX2xpbmtfYXJncworICAgICAgICAgICAgICAgIGVsaWYgd29yZCA9PSAiLVhjb21waWxlciI6CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9uZXh0X3dvcmQgPSBleHQuZXh0cmFfY29tcGlsZV9hcmdzCisgICAgICAgICAgICAgICAgZWxpZiBzd2l0Y2ggPT0gIi11IjoKKyAgICAgICAgICAgICAgICAgICAgZXh0LmV4dHJhX2xpbmtfYXJncy5hcHBlbmQod29yZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kX25leHRfd29yZCA9IGV4dC5leHRyYV9saW5rX2FyZ3MKKyAgICAgICAgICAgICAgICBlbGlmIHdvcmQgPT0gIi1YY29tcGlsZXIiOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRfbmV4dF93b3JkID0gZXh0LmV4dHJhX2NvbXBpbGVfYXJncworICAgICAgICAgICAgICAgIGVsaWYgc3dpdGNoID09ICItdSI6CisgICAgICAgICAgICAgICAgICAgIGV4dC5leHRyYV9saW5rX2FyZ3MuYXBwZW5kKHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9uZXh0X3dvcmQgPSBleHQuZXh0cmFfbGlua19hcmdzCisgICAgICAgICAgICAgICAgZWxpZiBzdWZmaXggaW4gKCIuYSIsICIuc28iLCAiLnNsIiwgIi5vIiwgIi5keWxpYiIpOgorICAgICAgICAgICAgICAgICAgICAjIE5CLiBhIHJlYWxseSBmYWl0aGZ1bCBlbXVsYXRpb24gb2YgbWFrZXNldHVwIHdvdWxkCisgICAgICAgICAgICAgICAgICAgICMgYXBwZW5kIGEgLm8gZmlsZSB0byBleHRyYV9vYmplY3RzIG9ubHkgaWYgaXQKKyAgICAgICAgICAgICAgICAgICAgIyBoYWQgYSBzbGFzaCBpbiBpdDsgb3RoZXJ3aXNlLCBpdCB3b3VsZCBzLy5vLy5jLworICAgICAgICAgICAgICAgICAgICAjIGFuZCBhcHBlbmQgaXQgdG8gc291cmNlcy4gIEhtbW1tLgorICAgICAgICAgICAgICAgICAgICBleHQuZXh0cmFfb2JqZWN0cy5hcHBlbmQod29yZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmaWxlLndhcm4oInVucmVjb2duaXplZCBhcmd1bWVudCAnJXMnIiAlIHdvcmQpCisKKyAgICAgICAgICAgIGV4dGVuc2lvbnMuYXBwZW5kKGV4dCkKKyAgICBmaW5hbGx5OgorICAgICAgICBmaWxlLmNsb3NlKCkKKworICAgICAgICAjcHJpbnQgIm1vZHVsZToiLCBtb2R1bGUKKyAgICAgICAgI3ByaW50ICJzb3VyY2UgZmlsZXM6Iiwgc291cmNlX2ZpbGVzCisgICAgICAgICNwcmludCAiY3BwIGFyZ3M6IiwgY3BwX2FyZ3MKKyAgICAgICAgI3ByaW50ICJsaWIgYXJnczoiLCBsaWJyYXJ5X2FyZ3MKKworICAgICAgICAjZXh0ZW5zaW9uc1ttb2R1bGVdID0geyAnc291cmNlcyc6IHNvdXJjZV9maWxlcywKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgJ2NwcF9hcmdzJzogY3BwX2FyZ3MsCisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICdsaWJfYXJncyc6IGxpYnJhcnlfYXJncyB9CisKKyAgICByZXR1cm4gZXh0ZW5zaW9ucworCisjIHJlYWRfc2V0dXBfZmlsZSAoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXh0ZW5zaW9uLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmOGJhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZXh0ZW5zaW9uLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjMTdjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2V4dGVuc2lvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmFuY3lfZ2V0b3B0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmFuY3lfZ2V0b3B0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZWE5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9mYW5jeV9nZXRvcHQucHkKQEAgLTAsMCArMSw0ODQgQEAKKyIiImRpc3R1dGlscy5mYW5jeV9nZXRvcHQKKworV3JhcHBlciBhcm91bmQgdGhlIHN0YW5kYXJkIGdldG9wdCBtb2R1bGUgdGhhdCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCithZGRpdGlvbmFsIGZlYXR1cmVzOgorICAqIHNob3J0IGFuZCBsb25nIG9wdGlvbnMgYXJlIHRpZWQgdG9nZXRoZXIKKyAgKiBvcHRpb25zIGhhdmUgaGVscCBzdHJpbmdzLCBzbyBmYW5jeV9nZXRvcHQgY291bGQgcG90ZW50aWFsbHkKKyAgICBjcmVhdGUgYSBjb21wbGV0ZSB1c2FnZSBzdW1tYXJ5CisgICogb3B0aW9ucyBzZXQgYXR0cmlidXRlcyBvZiBhIHBhc3NlZC1pbiBvYmplY3QKKyIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cworaW1wb3J0IHN0cmluZworaW1wb3J0IHJlCitpbXBvcnQgZ2V0b3B0Citmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0dldG9wdEVycm9yLCBEaXN0dXRpbHNBcmdFcnJvcgorCisjIE11Y2ggbGlrZSBjb21tYW5kX3JlIGluIGRpc3R1dGlscy5jb3JlLCB0aGlzIGlzIGNsb3NlIHRvIGJ1dCBub3QgcXVpdGUKKyMgdGhlIHNhbWUgYXMgYSBQeXRob24gTkFNRSAtLSBleGNlcHQsIGluIHRoZSBzcGlyaXQgb2YgbW9zdCBHTlUKKyMgdXRpbGl0aWVzLCB3ZSB1c2UgJy0nIGluIHBsYWNlIG9mICdfJy4gIChUaGUgc3Bpcml0IG9mIExJU1AgbGl2ZXMgb24hKQorIyBUaGUgc2ltaWxhcml0aWVzIHRvIE5BTUUgYXJlIGFnYWluIG5vdCBhIGNvaW5jaWRlbmNlLi4uCitsb25nb3B0X3BhdCA9IHInW2EtekEtWl0oPzpbYS16QS1aMC05LV0qKScKK2xvbmdvcHRfcmUgPSByZS5jb21waWxlKHInXiVzJCcgJSBsb25nb3B0X3BhdCkKKworIyBGb3IgcmVjb2duaXppbmcgIm5lZ2F0aXZlIGFsaWFzIiBvcHRpb25zLCBlZy4gInF1aWV0PSF2ZXJib3NlIgorbmVnX2FsaWFzX3JlID0gcmUuY29tcGlsZSgiXiglcyk9ISglcykkIiAlIChsb25nb3B0X3BhdCwgbG9uZ29wdF9wYXQpKQorCisjIFRoaXMgaXMgdXNlZCB0byB0cmFuc2xhdGUgbG9uZyBvcHRpb25zIHRvIGxlZ2l0aW1hdGUgUHl0aG9uIGlkZW50aWZpZXJzCisjIChmb3IgdXNlIGFzIGF0dHJpYnV0ZXMgb2Ygc29tZSBvYmplY3QpLgorbG9uZ29wdF94bGF0ZSA9IHN0cmluZy5tYWtldHJhbnMoJy0nLCAnXycpCisKK2NsYXNzIEZhbmN5R2V0b3B0OgorICAgICIiIldyYXBwZXIgYXJvdW5kIHRoZSBzdGFuZGFyZCAnZ2V0b3B0KCknIG1vZHVsZSB0aGF0IHByb3ZpZGVzIHNvbWUKKyAgICBoYW5keSBleHRyYSBmdW5jdGlvbmFsaXR5OgorICAgICAgKiBzaG9ydCBhbmQgbG9uZyBvcHRpb25zIGFyZSB0aWVkIHRvZ2V0aGVyCisgICAgICAqIG9wdGlvbnMgaGF2ZSBoZWxwIHN0cmluZ3MsIGFuZCBoZWxwIHRleHQgY2FuIGJlIGFzc2VtYmxlZAorICAgICAgICBmcm9tIHRoZW0KKyAgICAgICogb3B0aW9ucyBzZXQgYXR0cmlidXRlcyBvZiBhIHBhc3NlZC1pbiBvYmplY3QKKyAgICAgICogYm9vbGVhbiBvcHRpb25zIGNhbiBoYXZlICJuZWdhdGl2ZSBhbGlhc2VzIiAtLSBlZy4gaWYKKyAgICAgICAgLS1xdWlldCBpcyB0aGUgIm5lZ2F0aXZlIGFsaWFzIiBvZiAtLXZlcmJvc2UsIHRoZW4gIi0tcXVpZXQiCisgICAgICAgIG9uIHRoZSBjb21tYW5kIGxpbmUgc2V0cyAndmVyYm9zZScgdG8gZmFsc2UKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgb3B0aW9uX3RhYmxlPU5vbmUpOgorCisgICAgICAgICMgVGhlIG9wdGlvbiB0YWJsZSBpcyAoY3VycmVudGx5KSBhIGxpc3Qgb2YgdHVwbGVzLiAgVGhlCisgICAgICAgICMgdHVwbGVzIG1heSBoYXZlIDMgb3IgZm91ciB2YWx1ZXM6CisgICAgICAgICMgICAobG9uZ19vcHRpb24sIHNob3J0X29wdGlvbiwgaGVscF9zdHJpbmcgWywgcmVwZWF0YWJsZV0pCisgICAgICAgICMgaWYgYW4gb3B0aW9uIHRha2VzIGFuIGFyZ3VtZW50LCBpdHMgbG9uZ19vcHRpb24gc2hvdWxkIGhhdmUgJz0nCisgICAgICAgICMgYXBwZW5kZWQ7IHNob3J0X29wdGlvbiBzaG91bGQganVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIsIG5vICc6JworICAgICAgICAjIGluIGFueSBjYXNlLiAgSWYgYSBsb25nX29wdGlvbiBkb2Vzbid0IGhhdmUgYSBjb3JyZXNwb25kaW5nCisgICAgICAgICMgc2hvcnRfb3B0aW9uLCBzaG9ydF9vcHRpb24gc2hvdWxkIGJlIE5vbmUuICBBbGwgb3B0aW9uIHR1cGxlcworICAgICAgICAjIG11c3QgaGF2ZSBsb25nIG9wdGlvbnMuCisgICAgICAgIHNlbGYub3B0aW9uX3RhYmxlID0gb3B0aW9uX3RhYmxlCisKKyAgICAgICAgIyAnb3B0aW9uX2luZGV4JyBtYXBzIGxvbmcgb3B0aW9uIG5hbWVzIHRvIGVudHJpZXMgaW4gdGhlIG9wdGlvbgorICAgICAgICAjIHRhYmxlIChpZS4gdGhvc2UgMy10dXBsZXMpLgorICAgICAgICBzZWxmLm9wdGlvbl9pbmRleCA9IHt9CisgICAgICAgIGlmIHNlbGYub3B0aW9uX3RhYmxlOgorICAgICAgICAgICAgc2VsZi5fYnVpbGRfaW5kZXgoKQorCisgICAgICAgICMgJ2FsaWFzJyByZWNvcmRzIChkdWgpIGFsaWFzIG9wdGlvbnM7IHsnZm9vJzogJ2Jhcid9IG1lYW5zCisgICAgICAgICMgLS1mb28gaXMgYW4gYWxpYXMgZm9yIC0tYmFyCisgICAgICAgIHNlbGYuYWxpYXMgPSB7fQorCisgICAgICAgICMgJ25lZ2F0aXZlX2FsaWFzJyBrZWVwcyB0cmFjayBvZiBvcHRpb25zIHRoYXQgYXJlIHRoZSBib29sZWFuCisgICAgICAgICMgb3Bwb3NpdGUgb2Ygc29tZSBvdGhlciBvcHRpb24KKyAgICAgICAgc2VsZi5uZWdhdGl2ZV9hbGlhcyA9IHt9CisKKyAgICAgICAgIyBUaGVzZSBrZWVwIHRyYWNrIG9mIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgb3B0aW9uIHRhYmxlLiAgV2UKKyAgICAgICAgIyBkb24ndCBhY3R1YWxseSBwb3B1bGF0ZSB0aGVzZSBzdHJ1Y3R1cmVzIHVudGlsIHdlJ3JlIHJlYWR5IHRvCisgICAgICAgICMgcGFyc2UgdGhlIGNvbW1hbmQtbGluZSwgc2luY2UgdGhlICdvcHRpb25fdGFibGUnIHBhc3NlZCBpbiBoZXJlCisgICAgICAgICMgaXNuJ3QgbmVjZXNzYXJpbHkgdGhlIGZpbmFsIHdvcmQuCisgICAgICAgIHNlbGYuc2hvcnRfb3B0cyA9IFtdCisgICAgICAgIHNlbGYubG9uZ19vcHRzID0gW10KKyAgICAgICAgc2VsZi5zaG9ydDJsb25nID0ge30KKyAgICAgICAgc2VsZi5hdHRyX25hbWUgPSB7fQorICAgICAgICBzZWxmLnRha2VzX2FyZyA9IHt9CisKKyAgICAgICAgIyBBbmQgJ29wdGlvbl9vcmRlcicgaXMgZmlsbGVkIHVwIGluICdnZXRvcHQoKSc7IGl0IHJlY29yZHMgdGhlCisgICAgICAgICMgb3JpZ2luYWwgb3JkZXIgb2Ygb3B0aW9ucyAoYW5kIHRoZWlyIHZhbHVlcykgb24gdGhlIGNvbW1hbmQtbGluZSwKKyAgICAgICAgIyBidXQgZXhwYW5kcyBzaG9ydCBvcHRpb25zLCBjb252ZXJ0cyBhbGlhc2VzLCBldGMuCisgICAgICAgIHNlbGYub3B0aW9uX29yZGVyID0gW10KKworICAgICMgX19pbml0X18gKCkKKworCisgICAgZGVmIF9idWlsZF9pbmRleCAoc2VsZik6CisgICAgICAgIHNlbGYub3B0aW9uX2luZGV4LmNsZWFyKCkKKyAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLm9wdGlvbl90YWJsZToKKyAgICAgICAgICAgIHNlbGYub3B0aW9uX2luZGV4W29wdGlvblswXV0gPSBvcHRpb24KKworICAgIGRlZiBzZXRfb3B0aW9uX3RhYmxlIChzZWxmLCBvcHRpb25fdGFibGUpOgorICAgICAgICBzZWxmLm9wdGlvbl90YWJsZSA9IG9wdGlvbl90YWJsZQorICAgICAgICBzZWxmLl9idWlsZF9pbmRleCgpCisKKyAgICBkZWYgYWRkX29wdGlvbiAoc2VsZiwgbG9uZ19vcHRpb24sIHNob3J0X29wdGlvbj1Ob25lLCBoZWxwX3N0cmluZz1Ob25lKToKKyAgICAgICAgaWYgbG9uZ19vcHRpb24gaW4gc2VsZi5vcHRpb25faW5kZXg6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNHZXRvcHRFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIm9wdGlvbiBjb25mbGljdDogYWxyZWFkeSBhbiBvcHRpb24gJyVzJyIgJSBsb25nX29wdGlvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3B0aW9uID0gKGxvbmdfb3B0aW9uLCBzaG9ydF9vcHRpb24sIGhlbHBfc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5vcHRpb25fdGFibGUuYXBwZW5kKG9wdGlvbikKKyAgICAgICAgICAgIHNlbGYub3B0aW9uX2luZGV4W2xvbmdfb3B0aW9uXSA9IG9wdGlvbgorCisKKyAgICBkZWYgaGFzX29wdGlvbiAoc2VsZiwgbG9uZ19vcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb3B0aW9uIHRhYmxlIGZvciB0aGlzIHBhcnNlciBoYXMgYW4KKyAgICAgICAgb3B0aW9uIHdpdGggbG9uZyBuYW1lICdsb25nX29wdGlvbicuIiIiCisgICAgICAgIHJldHVybiBsb25nX29wdGlvbiBpbiBzZWxmLm9wdGlvbl9pbmRleAorCisgICAgZGVmIGdldF9hdHRyX25hbWUgKHNlbGYsIGxvbmdfb3B0aW9uKToKKyAgICAgICAgIiIiVHJhbnNsYXRlIGxvbmcgb3B0aW9uIG5hbWUgJ2xvbmdfb3B0aW9uJyB0byB0aGUgZm9ybSBpdAorICAgICAgICBoYXMgYXMgYW4gYXR0cmlidXRlIG9mIHNvbWUgb2JqZWN0OiBpZS4sIHRyYW5zbGF0ZSBoeXBoZW5zCisgICAgICAgIHRvIHVuZGVyc2NvcmVzLiIiIgorICAgICAgICByZXR1cm4gc3RyaW5nLnRyYW5zbGF0ZShsb25nX29wdGlvbiwgbG9uZ29wdF94bGF0ZSkKKworCisgICAgZGVmIF9jaGVja19hbGlhc19kaWN0IChzZWxmLCBhbGlhc2VzLCB3aGF0KToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoYWxpYXNlcywgZGljdCkKKyAgICAgICAgZm9yIChhbGlhcywgb3B0KSBpbiBhbGlhc2VzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBhbGlhcyBub3QgaW4gc2VsZi5vcHRpb25faW5kZXg6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzR2V0b3B0RXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImludmFsaWQgJXMgJyVzJzogIgorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uICclcycgbm90IGRlZmluZWQiKSAlICh3aGF0LCBhbGlhcywgYWxpYXMpCisgICAgICAgICAgICBpZiBvcHQgbm90IGluIHNlbGYub3B0aW9uX2luZGV4OgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0dldG9wdEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkICVzICclcyc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgImFsaWFzZWQgb3B0aW9uICclcycgbm90IGRlZmluZWQiKSAlICh3aGF0LCBhbGlhcywgb3B0KQorCisgICAgZGVmIHNldF9hbGlhc2VzIChzZWxmLCBhbGlhcyk6CisgICAgICAgICIiIlNldCB0aGUgYWxpYXNlcyBmb3IgdGhpcyBvcHRpb24gcGFyc2VyLiIiIgorICAgICAgICBzZWxmLl9jaGVja19hbGlhc19kaWN0KGFsaWFzLCAiYWxpYXMiKQorICAgICAgICBzZWxmLmFsaWFzID0gYWxpYXMKKworICAgIGRlZiBzZXRfbmVnYXRpdmVfYWxpYXNlcyAoc2VsZiwgbmVnYXRpdmVfYWxpYXMpOgorICAgICAgICAiIiJTZXQgdGhlIG5lZ2F0aXZlIGFsaWFzZXMgZm9yIHRoaXMgb3B0aW9uIHBhcnNlci4KKyAgICAgICAgJ25lZ2F0aXZlX2FsaWFzJyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3B0aW9uIG5hbWVzIHRvCisgICAgICAgIG9wdGlvbiBuYW1lcywgYm90aCB0aGUga2V5IGFuZCB2YWx1ZSBtdXN0IGFscmVhZHkgYmUgZGVmaW5lZAorICAgICAgICBpbiB0aGUgb3B0aW9uIHRhYmxlLiIiIgorICAgICAgICBzZWxmLl9jaGVja19hbGlhc19kaWN0KG5lZ2F0aXZlX2FsaWFzLCAibmVnYXRpdmUgYWxpYXMiKQorICAgICAgICBzZWxmLm5lZ2F0aXZlX2FsaWFzID0gbmVnYXRpdmVfYWxpYXMKKworCisgICAgZGVmIF9ncm9rX29wdGlvbl90YWJsZSAoc2VsZik6CisgICAgICAgICIiIlBvcHVsYXRlIHRoZSB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcyB0aGF0IGtlZXAgdGFicyBvbiB0aGUKKyAgICAgICAgb3B0aW9uIHRhYmxlLiAgQ2FsbGVkIGJ5ICdnZXRvcHQoKScgYmVmb3JlIGl0IGNhbiBkbyBhbnl0aGluZworICAgICAgICB3b3J0aHdoaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5sb25nX29wdHMgPSBbXQorICAgICAgICBzZWxmLnNob3J0X29wdHMgPSBbXQorICAgICAgICBzZWxmLnNob3J0MmxvbmcuY2xlYXIoKQorICAgICAgICBzZWxmLnJlcGVhdCA9IHt9CisKKyAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLm9wdGlvbl90YWJsZToKKyAgICAgICAgICAgIGlmIGxlbihvcHRpb24pID09IDM6CisgICAgICAgICAgICAgICAgbG9uZywgc2hvcnQsIGhlbHAgPSBvcHRpb24KKyAgICAgICAgICAgICAgICByZXBlYXQgPSAwCisgICAgICAgICAgICBlbGlmIGxlbihvcHRpb24pID09IDQ6CisgICAgICAgICAgICAgICAgbG9uZywgc2hvcnQsIGhlbHAsIHJlcGVhdCA9IG9wdGlvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHRoZSBvcHRpb24gdGFibGUgaXMgcGFydCBvZiB0aGUgY29kZSwgc28gc2ltcGx5CisgICAgICAgICAgICAgICAgIyBhc3NlcnQgdGhhdCBpdCBpcyBjb3JyZWN0CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImludmFsaWQgb3B0aW9uIHR1cGxlOiAlciIgJSAob3B0aW9uLCkKKworICAgICAgICAgICAgIyBUeXBlLSBhbmQgdmFsdWUtY2hlY2sgdGhlIG9wdGlvbiBuYW1lcworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobG9uZywgc3RyKSBvciBsZW4obG9uZykgPCAyOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0dldG9wdEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkIGxvbmcgb3B0aW9uICclcyc6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoID49IDIiKSAlIGxvbmcKKworICAgICAgICAgICAgaWYgKG5vdCAoKHNob3J0IGlzIE5vbmUpIG9yCisgICAgICAgICAgICAgICAgICAgICAoaXNpbnN0YW5jZShzaG9ydCwgc3RyKSBhbmQgbGVuKHNob3J0KSA9PSAxKSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0dldG9wdEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgKCJpbnZhbGlkIHNob3J0IG9wdGlvbiAnJXMnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGEgc2luZ2xlIGNoYXJhY3RlciBvciBOb25lIikgJSBzaG9ydAorCisgICAgICAgICAgICBzZWxmLnJlcGVhdFtsb25nXSA9IHJlcGVhdAorICAgICAgICAgICAgc2VsZi5sb25nX29wdHMuYXBwZW5kKGxvbmcpCisKKyAgICAgICAgICAgIGlmIGxvbmdbLTFdID09ICc9JzogICAgICAgICAgICAgIyBvcHRpb24gdGFrZXMgYW4gYXJndW1lbnQ/CisgICAgICAgICAgICAgICAgaWYgc2hvcnQ6IHNob3J0ID0gc2hvcnQgKyAnOicKKyAgICAgICAgICAgICAgICBsb25nID0gbG9uZ1swOi0xXQorICAgICAgICAgICAgICAgIHNlbGYudGFrZXNfYXJnW2xvbmddID0gMQorICAgICAgICAgICAgZWxzZToKKworICAgICAgICAgICAgICAgICMgSXMgb3B0aW9uIGlzIGEgIm5lZ2F0aXZlIGFsaWFzIiBmb3Igc29tZSBvdGhlciBvcHRpb24gKGVnLgorICAgICAgICAgICAgICAgICMgInF1aWV0IiA9PSAiIXZlcmJvc2UiKT8KKyAgICAgICAgICAgICAgICBhbGlhc190byA9IHNlbGYubmVnYXRpdmVfYWxpYXMuZ2V0KGxvbmcpCisgICAgICAgICAgICAgICAgaWYgYWxpYXNfdG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudGFrZXNfYXJnW2FsaWFzX3RvXToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0dldG9wdEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImludmFsaWQgbmVnYXRpdmUgYWxpYXMgJyVzJzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGlhc2VkIG9wdGlvbiAnJXMnIHRha2VzIGEgdmFsdWUiKSAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZywgYWxpYXNfdG8pCisKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb25nX29wdHNbLTFdID0gbG9uZyAjIFhYWCByZWR1bmRhbnQ/IQorICAgICAgICAgICAgICAgICAgICBzZWxmLnRha2VzX2FyZ1tsb25nXSA9IDAKKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFrZXNfYXJnW2xvbmddID0gMAorCisgICAgICAgICAgICAjIElmIHRoaXMgaXMgYW4gYWxpYXMgb3B0aW9uLCBtYWtlIHN1cmUgaXRzICJ0YWtlcyBhcmciIGZsYWcgaXMKKyAgICAgICAgICAgICMgdGhlIHNhbWUgYXMgdGhlIG9wdGlvbiBpdCdzIGFsaWFzZWQgdG8uCisgICAgICAgICAgICBhbGlhc190byA9IHNlbGYuYWxpYXMuZ2V0KGxvbmcpCisgICAgICAgICAgICBpZiBhbGlhc190byBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRha2VzX2FyZ1tsb25nXSAhPSBzZWxmLnRha2VzX2FyZ1thbGlhc190b106CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0dldG9wdEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiaW52YWxpZCBhbGlhcyAnJXMnOiBpbmNvbnNpc3RlbnQgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxpYXNlZCBvcHRpb24gJyVzJyAob25lIG9mIHRoZW0gdGFrZXMgYSB2YWx1ZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvdGhlciBkb2Vzbid0IikgJSAobG9uZywgYWxpYXNfdG8pCisKKworICAgICAgICAgICAgIyBOb3cgZW5mb3JjZSBzb21lIGJvbmRhZ2Ugb24gdGhlIGxvbmcgb3B0aW9uIG5hbWUsIHNvIHdlIGNhbgorICAgICAgICAgICAgIyBsYXRlciB0cmFuc2xhdGUgaXQgdG8gYW4gYXR0cmlidXRlIG5hbWUgb24gc29tZSBvYmplY3QuICBIYXZlCisgICAgICAgICAgICAjIHRvIGRvIHRoaXMgYSBiaXQgbGF0ZSB0byBtYWtlIHN1cmUgd2UndmUgcmVtb3ZlZCBhbnkgdHJhaWxpbmcKKyAgICAgICAgICAgICMgJz0nLgorICAgICAgICAgICAgaWYgbm90IGxvbmdvcHRfcmUubWF0Y2gobG9uZyk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzR2V0b3B0RXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAoImludmFsaWQgbG9uZyBvcHRpb24gbmFtZSAnJXMnICIgKworICAgICAgICAgICAgICAgICAgICAgICAiKG11c3QgYmUgbGV0dGVycywgbnVtYmVycywgaHlwaGVucyBvbmx5IikgJSBsb25nCisKKyAgICAgICAgICAgIHNlbGYuYXR0cl9uYW1lW2xvbmddID0gc2VsZi5nZXRfYXR0cl9uYW1lKGxvbmcpCisgICAgICAgICAgICBpZiBzaG9ydDoKKyAgICAgICAgICAgICAgICBzZWxmLnNob3J0X29wdHMuYXBwZW5kKHNob3J0KQorICAgICAgICAgICAgICAgIHNlbGYuc2hvcnQybG9uZ1tzaG9ydFswXV0gPSBsb25nCisKKyAgICAgICAgIyBmb3Igb3B0aW9uX3RhYmxlCisKKyAgICAjIF9ncm9rX29wdGlvbl90YWJsZSgpCisKKworICAgIGRlZiBnZXRvcHQgKHNlbGYsIGFyZ3M9Tm9uZSwgb2JqZWN0PU5vbmUpOgorICAgICAgICAiIiJQYXJzZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBpbiBhcmdzLiBTdG9yZSBhcyBhdHRyaWJ1dGVzIG9uIG9iamVjdC4KKworICAgICAgICBJZiAnYXJncycgaXMgTm9uZSBvciBub3Qgc3VwcGxpZWQsIHVzZXMgJ3N5cy5hcmd2WzE6XScuICBJZgorICAgICAgICAnb2JqZWN0JyBpcyBOb25lIG9yIG5vdCBzdXBwbGllZCwgY3JlYXRlcyBhIG5ldyBPcHRpb25EdW1teQorICAgICAgICBvYmplY3QsIHN0b3JlcyBvcHRpb24gdmFsdWVzIHRoZXJlLCBhbmQgcmV0dXJucyBhIHR1cGxlIChhcmdzLAorICAgICAgICBvYmplY3QpLiAgSWYgJ29iamVjdCcgaXMgc3VwcGxpZWQsIGl0IGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZAorICAgICAgICAnZ2V0b3B0KCknIGp1c3QgcmV0dXJucyAnYXJncyc7IGluIGJvdGggY2FzZXMsIHRoZSByZXR1cm5lZAorICAgICAgICAnYXJncycgaXMgYSBtb2RpZmllZCBjb3B5IG9mIHRoZSBwYXNzZWQtaW4gJ2FyZ3MnIGxpc3QsIHdoaWNoCisgICAgICAgIGlzIGxlZnQgdW50b3VjaGVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgICAgICBpZiBvYmplY3QgaXMgTm9uZToKKyAgICAgICAgICAgIG9iamVjdCA9IE9wdGlvbkR1bW15KCkKKyAgICAgICAgICAgIGNyZWF0ZWRfb2JqZWN0ID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3JlYXRlZF9vYmplY3QgPSAwCisKKyAgICAgICAgc2VsZi5fZ3Jva19vcHRpb25fdGFibGUoKQorCisgICAgICAgIHNob3J0X29wdHMgPSBzdHJpbmcuam9pbihzZWxmLnNob3J0X29wdHMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3MsIHNob3J0X29wdHMsIHNlbGYubG9uZ19vcHRzKQorICAgICAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvciwgbXNnCisKKyAgICAgICAgZm9yIG9wdCwgdmFsIGluIG9wdHM6CisgICAgICAgICAgICBpZiBsZW4ob3B0KSA9PSAyIGFuZCBvcHRbMF0gPT0gJy0nOiAjIGl0J3MgYSBzaG9ydCBvcHRpb24KKyAgICAgICAgICAgICAgICBvcHQgPSBzZWxmLnNob3J0Mmxvbmdbb3B0WzFdXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGVuKG9wdCkgPiAyIGFuZCBvcHRbOjJdID09ICctLScKKyAgICAgICAgICAgICAgICBvcHQgPSBvcHRbMjpdCisKKyAgICAgICAgICAgIGFsaWFzID0gc2VsZi5hbGlhcy5nZXQob3B0KQorICAgICAgICAgICAgaWYgYWxpYXM6CisgICAgICAgICAgICAgICAgb3B0ID0gYWxpYXMKKworICAgICAgICAgICAgaWYgbm90IHNlbGYudGFrZXNfYXJnW29wdF06ICAgICAjIGJvb2xlYW4gb3B0aW9uPworICAgICAgICAgICAgICAgIGFzc2VydCB2YWwgPT0gJycsICJib29sZWFuIG9wdGlvbiBjYW4ndCBoYXZlIHZhbHVlIgorICAgICAgICAgICAgICAgIGFsaWFzID0gc2VsZi5uZWdhdGl2ZV9hbGlhcy5nZXQob3B0KQorICAgICAgICAgICAgICAgIGlmIGFsaWFzOgorICAgICAgICAgICAgICAgICAgICBvcHQgPSBhbGlhcworICAgICAgICAgICAgICAgICAgICB2YWwgPSAwCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gMQorCisgICAgICAgICAgICBhdHRyID0gc2VsZi5hdHRyX25hbWVbb3B0XQorICAgICAgICAgICAgIyBUaGUgb25seSByZXBlYXRpbmcgb3B0aW9uIGF0IHRoZSBtb21lbnQgaXMgJ3ZlcmJvc2UnLgorICAgICAgICAgICAgIyBJdCBoYXMgYSBuZWdhdGl2ZSBvcHRpb24gLXEgcXVpZXQsIHdoaWNoIHNob3VsZCBzZXQgdmVyYm9zZSA9IDAuCisgICAgICAgICAgICBpZiB2YWwgYW5kIHNlbGYucmVwZWF0LmdldChhdHRyKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKG9iamVjdCwgYXR0ciwgMCkgKyAxCisgICAgICAgICAgICBzZXRhdHRyKG9iamVjdCwgYXR0ciwgdmFsKQorICAgICAgICAgICAgc2VsZi5vcHRpb25fb3JkZXIuYXBwZW5kKChvcHQsIHZhbCkpCisKKyAgICAgICAgIyBmb3Igb3B0cworICAgICAgICBpZiBjcmVhdGVkX29iamVjdDoKKyAgICAgICAgICAgIHJldHVybiBhcmdzLCBvYmplY3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBhcmdzCisKKyAgICAjIGdldG9wdCgpCisKKworICAgIGRlZiBnZXRfb3B0aW9uX29yZGVyIChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbGlzdCBvZiAob3B0aW9uLCB2YWx1ZSkgdHVwbGVzIHByb2Nlc3NlZCBieSB0aGUKKyAgICAgICAgcHJldmlvdXMgcnVuIG9mICdnZXRvcHQoKScuICBSYWlzZXMgUnVudGltZUVycm9yIGlmCisgICAgICAgICdnZXRvcHQoKScgaGFzbid0IGJlZW4gY2FsbGVkIHlldC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYub3B0aW9uX29yZGVyIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICInZ2V0b3B0KCknIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcHRpb25fb3JkZXIKKworCisgICAgZGVmIGdlbmVyYXRlX2hlbHAgKHNlbGYsIGhlYWRlcj1Ob25lKToKKyAgICAgICAgIiIiR2VuZXJhdGUgaGVscCB0ZXh0IChhIGxpc3Qgb2Ygc3RyaW5ncywgb25lIHBlciBzdWdnZXN0ZWQgbGluZSBvZgorICAgICAgICBvdXRwdXQpIGZyb20gdGhlIG9wdGlvbiB0YWJsZSBmb3IgdGhpcyBGYW5jeUdldG9wdCBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICAjIEJsaXRoZWx5IGFzc3VtZSB0aGUgb3B0aW9uIHRhYmxlIGlzIGdvb2Q6IHByb2JhYmx5IHdvdWxkbid0IGNhbGwKKyAgICAgICAgIyAnZ2VuZXJhdGVfaGVscCgpJyB1bmxlc3MgeW91J3ZlIGFscmVhZHkgY2FsbGVkICdnZXRvcHQoKScuCisKKyAgICAgICAgIyBGaXJzdCBwYXNzOiBkZXRlcm1pbmUgbWF4aW11bSBsZW5ndGggb2YgbG9uZyBvcHRpb24gbmFtZXMKKyAgICAgICAgbWF4X29wdCA9IDAKKyAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLm9wdGlvbl90YWJsZToKKyAgICAgICAgICAgIGxvbmcgPSBvcHRpb25bMF0KKyAgICAgICAgICAgIHNob3J0ID0gb3B0aW9uWzFdCisgICAgICAgICAgICBsID0gbGVuKGxvbmcpCisgICAgICAgICAgICBpZiBsb25nWy0xXSA9PSAnPSc6CisgICAgICAgICAgICAgICAgbCA9IGwgLSAxCisgICAgICAgICAgICBpZiBzaG9ydCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBsID0gbCArIDUgICAgICAgICAgICAgICAgICAgIyAiICgteCkiIHdoZXJlIHNob3J0ID09ICd4JworICAgICAgICAgICAgaWYgbCA+IG1heF9vcHQ6CisgICAgICAgICAgICAgICAgbWF4X29wdCA9IGwKKworICAgICAgICBvcHRfd2lkdGggPSBtYXhfb3B0ICsgMiArIDIgKyAyICAgICAjIHJvb20gZm9yIGluZGVudCArIGRhc2hlcyArIGd1dHRlcgorCisgICAgICAgICMgVHlwaWNhbCBoZWxwIGJsb2NrIGxvb2tzIGxpa2UgdGhpczoKKyAgICAgICAgIyAgIC0tZm9vICAgICAgIGNvbnRyb2xzIGZvb25hYnVsYXRpb24KKyAgICAgICAgIyBIZWxwIGJsb2NrIGZvciBsb25nZXN0IG9wdGlvbiBsb29rcyBsaWtlIHRoaXM6CisgICAgICAgICMgICAtLWZsaW1mbGFtICBzZXQgdGhlIGZsaW0tZmxhbSBsZXZlbAorICAgICAgICAjIGFuZCB3aXRoIHdyYXBwZWQgdGV4dDoKKyAgICAgICAgIyAgIC0tZmxpbWZsYW0gIHNldCB0aGUgZmxpbS1mbGFtIGxldmVsIChtdXN0IGJlIGJldHdlZW4KKyAgICAgICAgIyAgICAgICAgICAgICAgIDAgYW5kIDEwMCwgZXhjZXB0IG9uIFR1ZXNkYXlzKQorICAgICAgICAjIE9wdGlvbnMgd2l0aCBzaG9ydCBuYW1lcyB3aWxsIGhhdmUgdGhlIHNob3J0IG5hbWUgc2hvd24gKGJ1dAorICAgICAgICAjIGl0IGRvZXNuJ3QgY29udHJpYnV0ZSB0byBtYXhfb3B0KToKKyAgICAgICAgIyAgIC0tZm9vICgtZikgIGNvbnRyb2xzIGZvb25hYnVsYXRpb24KKyAgICAgICAgIyBJZiBhZGRpbmcgdGhlIHNob3J0IG9wdGlvbiB3b3VsZCBtYWtlIHRoZSBsZWZ0IGNvbHVtbiB0b28gd2lkZSwKKyAgICAgICAgIyB3ZSBwdXNoIHRoZSBleHBsYW5hdGlvbiBvZmYgdG8gdGhlIG5leHQgbGluZQorICAgICAgICAjICAgLS1mbGltZmxhbSAoLWwpCisgICAgICAgICMgICAgICAgICAgICAgICBzZXQgdGhlIGZsaW0tZmxhbSBsZXZlbAorICAgICAgICAjIEltcG9ydGFudCBwYXJhbWV0ZXJzOgorICAgICAgICAjICAgLSAyIHNwYWNlcyBiZWZvcmUgb3B0aW9uIGJsb2NrIHN0YXJ0IGxpbmVzCisgICAgICAgICMgICAtIDIgZGFzaGVzIGZvciBlYWNoIGxvbmcgb3B0aW9uIG5hbWUKKyAgICAgICAgIyAgIC0gbWluLiAyIHNwYWNlcyBiZXR3ZWVuIG9wdGlvbiBhbmQgZXhwbGFuYXRpb24gKGd1dHRlcikKKyAgICAgICAgIyAgIC0gNSBjaGFyYWN0ZXJzIChpbmNsLiBzcGFjZSkgZm9yIHNob3J0IG9wdGlvbiBuYW1lCisKKyAgICAgICAgIyBOb3cgZ2VuZXJhdGUgbGluZXMgb2YgaGVscCB0ZXh0LiAgKElmIDgwIGNvbHVtbnMgd2VyZSBnb29kIGVub3VnaAorICAgICAgICAjIGZvciBKZXN1cywgdGhlbiA3OCBjb2x1bW5zIGFyZSBnb29kIGVub3VnaCBmb3IgbWUhKQorICAgICAgICBsaW5lX3dpZHRoID0gNzgKKyAgICAgICAgdGV4dF93aWR0aCA9IGxpbmVfd2lkdGggLSBvcHRfd2lkdGgKKyAgICAgICAgYmlnX2luZGVudCA9ICcgJyAqIG9wdF93aWR0aAorICAgICAgICBpZiBoZWFkZXI6CisgICAgICAgICAgICBsaW5lcyA9IFtoZWFkZXJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaW5lcyA9IFsnT3B0aW9uIHN1bW1hcnk6J10KKworICAgICAgICBmb3Igb3B0aW9uIGluIHNlbGYub3B0aW9uX3RhYmxlOgorICAgICAgICAgICAgbG9uZywgc2hvcnQsIGhlbHAgPSBvcHRpb25bOjNdCisgICAgICAgICAgICB0ZXh0ID0gd3JhcF90ZXh0KGhlbHAsIHRleHRfd2lkdGgpCisgICAgICAgICAgICBpZiBsb25nWy0xXSA9PSAnPSc6CisgICAgICAgICAgICAgICAgbG9uZyA9IGxvbmdbMDotMV0KKworICAgICAgICAgICAgIyBDYXNlIDE6IG5vIHNob3J0IG9wdGlvbiBhdCBhbGwgKG1ha2VzIGxpZmUgZWFzeSkKKyAgICAgICAgICAgIGlmIHNob3J0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIgIC0tJS0qcyAgJXMiICUgKG1heF9vcHQsIGxvbmcsIHRleHRbMF0pKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgiICAtLSUtKnMgICIgJSAobWF4X29wdCwgbG9uZykpCisKKyAgICAgICAgICAgICMgQ2FzZSAyOiB3ZSBoYXZlIGEgc2hvcnQgb3B0aW9uLCBzbyB3ZSBoYXZlIHRvIGluY2x1ZGUgaXQKKyAgICAgICAgICAgICMganVzdCBhZnRlciB0aGUgbG9uZyBvcHRpb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3B0X25hbWVzID0gIiVzICgtJXMpIiAlIChsb25nLCBzaG9ydCkKKyAgICAgICAgICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiAgLS0lLSpzICAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heF9vcHQsIG9wdF9uYW1lcywgdGV4dFswXSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCIgIC0tJS0qcyIgJSBvcHRfbmFtZXMpCisKKyAgICAgICAgICAgIGZvciBsIGluIHRleHRbMTpdOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChiaWdfaW5kZW50ICsgbCkKKworICAgICAgICAjIGZvciBzZWxmLm9wdGlvbl90YWJsZQorCisgICAgICAgIHJldHVybiBsaW5lcworCisgICAgIyBnZW5lcmF0ZV9oZWxwICgpCisKKyAgICBkZWYgcHJpbnRfaGVscCAoc2VsZiwgaGVhZGVyPU5vbmUsIGZpbGU9Tm9uZSk6CisgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGUgPSBzeXMuc3Rkb3V0CisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2VuZXJhdGVfaGVscChoZWFkZXIpOgorICAgICAgICAgICAgZmlsZS53cml0ZShsaW5lICsgIlxuIikKKworIyBjbGFzcyBGYW5jeUdldG9wdAorCisKK2RlZiBmYW5jeV9nZXRvcHQgKG9wdGlvbnMsIG5lZ2F0aXZlX29wdCwgb2JqZWN0LCBhcmdzKToKKyAgICBwYXJzZXIgPSBGYW5jeUdldG9wdChvcHRpb25zKQorICAgIHBhcnNlci5zZXRfbmVnYXRpdmVfYWxpYXNlcyhuZWdhdGl2ZV9vcHQpCisgICAgcmV0dXJuIHBhcnNlci5nZXRvcHQoYXJncywgb2JqZWN0KQorCisKK1dTX1RSQU5TID0gc3RyaW5nLm1ha2V0cmFucyhzdHJpbmcud2hpdGVzcGFjZSwgJyAnICogbGVuKHN0cmluZy53aGl0ZXNwYWNlKSkKKworZGVmIHdyYXBfdGV4dCAodGV4dCwgd2lkdGgpOgorICAgICIiIndyYXBfdGV4dCh0ZXh0IDogc3RyaW5nLCB3aWR0aCA6IGludCkgLT4gW3N0cmluZ10KKworICAgIFNwbGl0ICd0ZXh0JyBpbnRvIG11bHRpcGxlIGxpbmVzIG9mIG5vIG1vcmUgdGhhbiAnd2lkdGgnIGNoYXJhY3RlcnMKKyAgICBlYWNoLCBhbmQgcmV0dXJuIHRoZSBsaXN0IG9mIHN0cmluZ3MgdGhhdCByZXN1bHRzLgorICAgICIiIgorCisgICAgaWYgdGV4dCBpcyBOb25lOgorICAgICAgICByZXR1cm4gW10KKyAgICBpZiBsZW4odGV4dCkgPD0gd2lkdGg6CisgICAgICAgIHJldHVybiBbdGV4dF0KKworICAgIHRleHQgPSBzdHJpbmcuZXhwYW5kdGFicyh0ZXh0KQorICAgIHRleHQgPSBzdHJpbmcudHJhbnNsYXRlKHRleHQsIFdTX1RSQU5TKQorICAgIGNodW5rcyA9IHJlLnNwbGl0KHInKCArfC0rKScsIHRleHQpCisgICAgY2h1bmtzID0gZmlsdGVyKE5vbmUsIGNodW5rcykgICAgICAjICcgLSAnIHJlc3VsdHMgaW4gZW1wdHkgc3RyaW5ncworICAgIGxpbmVzID0gW10KKworICAgIHdoaWxlIGNodW5rczoKKworICAgICAgICBjdXJfbGluZSA9IFtdICAgICAgICAgICAgICAgICAgICMgbGlzdCBvZiBjaHVua3MgKHRvLWJlLWpvaW5lZCkKKyAgICAgICAgY3VyX2xlbiA9IDAgICAgICAgICAgICAgICAgICAgICAjIGxlbmd0aCBvZiBjdXJyZW50IGxpbmUKKworICAgICAgICB3aGlsZSBjaHVua3M6CisgICAgICAgICAgICBsID0gbGVuKGNodW5rc1swXSkKKyAgICAgICAgICAgIGlmIGN1cl9sZW4gKyBsIDw9IHdpZHRoOiAgICAjIGNhbiBzcXVlZXplIChhdCBsZWFzdCkgdGhpcyBjaHVuayBpbgorICAgICAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChjaHVua3NbMF0pCisgICAgICAgICAgICAgICAgZGVsIGNodW5rc1swXQorICAgICAgICAgICAgICAgIGN1cl9sZW4gPSBjdXJfbGVuICsgbAorICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyBsaW5lIGlzIGZ1bGwKKyAgICAgICAgICAgICAgICAjIGRyb3AgbGFzdCBjaHVuayBpZiBhbGwgc3BhY2UKKyAgICAgICAgICAgICAgICBpZiBjdXJfbGluZSBhbmQgY3VyX2xpbmVbLTFdWzBdID09ICcgJzoKKyAgICAgICAgICAgICAgICAgICAgZGVsIGN1cl9saW5lWy0xXQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgY2h1bmtzOiAgICAgICAgICAgICAgICAgICAgICAjIGFueSBjaHVua3MgbGVmdCB0byBwcm9jZXNzPworCisgICAgICAgICAgICAjIGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgc3RpbGwgZW1wdHksIHRoZW4gd2UgaGFkIGEgc2luZ2xlCisgICAgICAgICAgICAjIGNodW5rIHRoYXQncyB0b28gYmlnIHRvbyBmaXQgb24gYSBsaW5lIC0tIHNvIHdlIGJyZWFrCisgICAgICAgICAgICAjIGRvd24gYW5kIGJyZWFrIGl0IHVwIGF0IHRoZSBsaW5lIHdpZHRoCisgICAgICAgICAgICBpZiBjdXJfbGVuID09IDA6CisgICAgICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKGNodW5rc1swXVswOndpZHRoXSkKKyAgICAgICAgICAgICAgICBjaHVua3NbMF0gPSBjaHVua3NbMF1bd2lkdGg6XQorCisgICAgICAgICAgICAjIGFsbC13aGl0ZXNwYWNlIGNodW5rcyBhdCB0aGUgZW5kIG9mIGEgbGluZSBjYW4gYmUgZGlzY2FyZGVkCisgICAgICAgICAgICAjIChhbmQgd2Uga25vdyBmcm9tIHRoZSByZS5zcGxpdCBhYm92ZSB0aGF0IGlmIGEgY2h1bmsgaGFzCisgICAgICAgICAgICAjICphbnkqIHdoaXRlc3BhY2UsIGl0IGlzICphbGwqIHdoaXRlc3BhY2UpCisgICAgICAgICAgICBpZiBjaHVua3NbMF1bMF0gPT0gJyAnOgorICAgICAgICAgICAgICAgIGRlbCBjaHVua3NbMF0KKworICAgICAgICAjIGFuZCBzdG9yZSB0aGlzIGxpbmUgaW4gdGhlIGxpc3Qtb2YtYWxsLWxpbmVzIC0tIGFzIGEgc2luZ2xlCisgICAgICAgICMgc3RyaW5nLCBvZiBjb3Vyc2UhCisgICAgICAgIGxpbmVzLmFwcGVuZChzdHJpbmcuam9pbihjdXJfbGluZSwgJycpKQorCisgICAgIyB3aGlsZSBjaHVua3MKKworICAgIHJldHVybiBsaW5lcworCisKK2RlZiB0cmFuc2xhdGVfbG9uZ29wdChvcHQpOgorICAgICIiIkNvbnZlcnQgYSBsb25nIG9wdGlvbiBuYW1lIHRvIGEgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXIgYnkKKyAgICBjaGFuZ2luZyAiLSIgdG8gIl8iLgorICAgICIiIgorICAgIHJldHVybiBzdHJpbmcudHJhbnNsYXRlKG9wdCwgbG9uZ29wdF94bGF0ZSkKKworCitjbGFzcyBPcHRpb25EdW1teToKKyAgICAiIiJEdW1teSBjbGFzcyBqdXN0IHVzZWQgYXMgYSBwbGFjZSB0byBob2xkIGNvbW1hbmQtbGluZSBvcHRpb24KKyAgICB2YWx1ZXMgYXMgaW5zdGFuY2UgYXR0cmlidXRlcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgb3B0aW9ucz1bXSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBPcHRpb25EdW1teSBpbnN0YW5jZS4gIFRoZSBhdHRyaWJ1dGVzIGxpc3RlZCBpbgorICAgICAgICAnb3B0aW9ucycgd2lsbCBiZSBpbml0aWFsaXplZCB0byBOb25lLiIiIgorICAgICAgICBmb3Igb3B0IGluIG9wdGlvbnM6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG9wdCwgTm9uZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZhbmN5X2dldG9wdC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9mYW5jeV9nZXRvcHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGU3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9mYW5jeV9nZXRvcHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZhbmN5X2dldG9wdC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9mYW5jeV9nZXRvcHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmIzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9mYW5jeV9nZXRvcHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWYwNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZV91dGlsLnB5CkBAIC0wLDAgKzEsMjMxIEBACisiIiJkaXN0dXRpbHMuZmlsZV91dGlsCisKK1V0aWxpdHkgZnVuY3Rpb25zIGZvciBvcGVyYXRpbmcgb24gc2luZ2xlIGZpbGVzLgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRmlsZUVycm9yCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKKyMgZm9yIGdlbmVyYXRpbmcgdmVyYm9zZSBvdXRwdXQgaW4gJ2NvcHlfZmlsZSgpJworX2NvcHlfYWN0aW9uID0ge05vbmU6ICdjb3B5aW5nJywKKyAgICAgICAgICAgICAgICAnaGFyZCc6ICdoYXJkIGxpbmtpbmcnLAorICAgICAgICAgICAgICAgICdzeW0nOiAnc3ltYm9saWNhbGx5IGxpbmtpbmcnfQorCisKK2RlZiBfY29weV9maWxlX2NvbnRlbnRzKHNyYywgZHN0LCBidWZmZXJfc2l6ZT0xNioxMDI0KToKKyAgICAiIiJDb3B5IHRoZSBmaWxlICdzcmMnIHRvICdkc3QnLgorCisgICAgQm90aCBtdXN0IGJlIGZpbGVuYW1lcy4gQW55IGVycm9yIG9wZW5pbmcgZWl0aGVyIGZpbGUsIHJlYWRpbmcgZnJvbQorICAgICdzcmMnLCBvciB3cml0aW5nIHRvICdkc3QnLCByYWlzZXMgRGlzdHV0aWxzRmlsZUVycm9yLiAgRGF0YSBpcworICAgIHJlYWQvd3JpdHRlbiBpbiBjaHVua3Mgb2YgJ2J1ZmZlcl9zaXplJyBieXRlcyAoZGVmYXVsdCAxNmspLiAgTm8gYXR0ZW1wdAorICAgIGlzIG1hZGUgdG8gaGFuZGxlIGFueXRoaW5nIGFwYXJ0IGZyb20gcmVndWxhciBmaWxlcy4KKyAgICAiIiIKKyAgICAjIFN0b2xlbiBmcm9tIHNodXRpbCBtb2R1bGUgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnksIGJ1dCB3aXRoCisgICAgIyBjdXN0b20gZXJyb3ItaGFuZGxpbmcgYWRkZWQuCisgICAgZnNyYyA9IE5vbmUKKyAgICBmZHN0ID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnNyYyA9IG9wZW4oc3JjLCAncmInKQorICAgICAgICBleGNlcHQgb3MuZXJyb3IsIChlcnJubywgZXJyc3RyKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigiY291bGQgbm90IG9wZW4gJyVzJzogJXMiICUgKHNyYywgZXJyc3RyKSkKKworICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3QpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhkc3QpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIChlcnJubywgZXJyc3RyKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBkZWxldGUgJyVzJzogJXMiICUgKGRzdCwgZXJyc3RyKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmZHN0ID0gb3Blbihkc3QsICd3YicpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgKGVycm5vLCBlcnJzdHIpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKAorICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBjcmVhdGUgJyVzJzogJXMiICUgKGRzdCwgZXJyc3RyKSkKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJ1ZiA9IGZzcmMucmVhZChidWZmZXJfc2l6ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgKGVycm5vLCBlcnJzdHIpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IHJlYWQgZnJvbSAnJXMnOiAlcyIgJSAoc3JjLCBlcnJzdHIpKQorCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmZHN0LndyaXRlKGJ1ZikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgKGVycm5vLCBlcnJzdHIpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAiY291bGQgbm90IHdyaXRlIHRvICclcyc6ICVzIiAlIChkc3QsIGVycnN0cikpCisKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBmZHN0OgorICAgICAgICAgICAgZmRzdC5jbG9zZSgpCisgICAgICAgIGlmIGZzcmM6CisgICAgICAgICAgICBmc3JjLmNsb3NlKCkKKworZGVmIGNvcHlfZmlsZShzcmMsIGRzdCwgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCB1cGRhdGU9MCwKKyAgICAgICAgICAgICAgbGluaz1Ob25lLCB2ZXJib3NlPTEsIGRyeV9ydW49MCk6CisgICAgIiIiQ29weSBhIGZpbGUgJ3NyYycgdG8gJ2RzdCcuCisKKyAgICBJZiAnZHN0JyBpcyBhIGRpcmVjdG9yeSwgdGhlbiAnc3JjJyBpcyBjb3BpZWQgdGhlcmUgd2l0aCB0aGUgc2FtZSBuYW1lOworICAgIG90aGVyd2lzZSwgaXQgbXVzdCBiZSBhIGZpbGVuYW1lLiAgKElmIHRoZSBmaWxlIGV4aXN0cywgaXQgd2lsbCBiZQorICAgIHJ1dGhsZXNzbHkgY2xvYmJlcmVkLikgIElmICdwcmVzZXJ2ZV9tb2RlJyBpcyB0cnVlICh0aGUgZGVmYXVsdCksCisgICAgdGhlIGZpbGUncyBtb2RlICh0eXBlIGFuZCBwZXJtaXNzaW9uIGJpdHMsIG9yIHdoYXRldmVyIGlzIGFuYWxvZ291cyBvbgorICAgIHRoZSBjdXJyZW50IHBsYXRmb3JtKSBpcyBjb3BpZWQuICBJZiAncHJlc2VydmVfdGltZXMnIGlzIHRydWUgKHRoZQorICAgIGRlZmF1bHQpLCB0aGUgbGFzdC1tb2RpZmllZCBhbmQgbGFzdC1hY2Nlc3MgdGltZXMgYXJlIGNvcGllZCBhcyB3ZWxsLgorICAgIElmICd1cGRhdGUnIGlzIHRydWUsICdzcmMnIHdpbGwgb25seSBiZSBjb3BpZWQgaWYgJ2RzdCcgZG9lcyBub3QgZXhpc3QsCisgICAgb3IgaWYgJ2RzdCcgZG9lcyBleGlzdCBidXQgaXMgb2xkZXIgdGhhbiAnc3JjJy4KKworICAgICdsaW5rJyBhbGxvd3MgeW91IHRvIG1ha2UgaGFyZCBsaW5rcyAob3MubGluaykgb3Igc3ltYm9saWMgbGlua3MKKyAgICAob3Muc3ltbGluaykgaW5zdGVhZCBvZiBjb3B5aW5nOiBzZXQgaXQgdG8gImhhcmQiIG9yICJzeW0iOyBpZiBpdCBpcworICAgIE5vbmUgKHRoZSBkZWZhdWx0KSwgZmlsZXMgYXJlIGNvcGllZC4gIERvbid0IHNldCAnbGluaycgb24gc3lzdGVtcyB0aGF0CisgICAgZG9uJ3Qgc3VwcG9ydCBpdDogJ2NvcHlfZmlsZSgpJyBkb2Vzbid0IGNoZWNrIGlmIGhhcmQgb3Igc3ltYm9saWMKKyAgICBsaW5raW5nIGlzIGF2YWlsYWJsZS4KKworICAgIFVuZGVyIE1hYyBPUywgdXNlcyB0aGUgbmF0aXZlIGZpbGUgY29weSBmdW5jdGlvbiBpbiBtYWNvc3Rvb2xzOyBvbgorICAgIG90aGVyIHN5c3RlbXMsIHVzZXMgJ19jb3B5X2ZpbGVfY29udGVudHMoKScgdG8gY29weSBmaWxlIGNvbnRlbnRzLgorCisgICAgUmV0dXJuIGEgdHVwbGUgKGRlc3RfbmFtZSwgY29waWVkKTogJ2Rlc3RfbmFtZScgaXMgdGhlIGFjdHVhbCBuYW1lIG9mCisgICAgdGhlIG91dHB1dCBmaWxlLCBhbmQgJ2NvcGllZCcgaXMgdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgY29waWVkIChvciB3b3VsZAorICAgIGhhdmUgYmVlbiBjb3BpZWQsIGlmICdkcnlfcnVuJyB0cnVlKS4KKyAgICAiIiIKKyAgICAjIFhYWCBpZiB0aGUgZGVzdGluYXRpb24gZmlsZSBhbHJlYWR5IGV4aXN0cywgd2UgY2xvYmJlciBpdCBpZgorICAgICMgY29weWluZywgYnV0IGJsb3cgdXAgaWYgbGlua2luZy4gIEhtbW0uICBBbmQgSSBkb24ndCBrbm93IHdoYXQKKyAgICAjIG1hY29zdG9vbHMuY29weWZpbGUoKSBkb2VzLiAgU2hvdWxkIGRlZmluaXRlbHkgYmUgY29uc2lzdGVudCwgYW5kCisgICAgIyBzaG91bGQgcHJvYmFibHkgYmxvdyB1cCBpZiBkZXN0aW5hdGlvbiBleGlzdHMgYW5kIHdlIHdvdWxkIGJlCisgICAgIyBjaGFuZ2luZyBpdCAoaWUuIGl0J3Mgbm90IGFscmVhZHkgYSBoYXJkL3NvZnQgbGluayB0byBzcmMgT1IKKyAgICAjIChub3QgdXBkYXRlKSBhbmQgKHNyYyBuZXdlciB0aGFuIGRzdCkuCisKKyAgICBmcm9tIGRpc3R1dGlscy5kZXBfdXRpbCBpbXBvcnQgbmV3ZXIKKyAgICBmcm9tIHN0YXQgaW1wb3J0IFNUX0FUSU1FLCBTVF9NVElNRSwgU1RfTU9ERSwgU19JTU9ERQorCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKHNyYyk6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgImNhbid0IGNvcHkgJyVzJzogZG9lc24ndCBleGlzdCBvciBub3QgYSByZWd1bGFyIGZpbGUiICUgc3JjKQorCisgICAgaWYgb3MucGF0aC5pc2Rpcihkc3QpOgorICAgICAgICBkaXIgPSBkc3QKKyAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQorICAgIGVsc2U6CisgICAgICAgIGRpciA9IG9zLnBhdGguZGlybmFtZShkc3QpCisKKyAgICBpZiB1cGRhdGUgYW5kIG5vdCBuZXdlcihzcmMsIGRzdCk6CisgICAgICAgIGlmIHZlcmJvc2UgPj0gMToKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygibm90IGNvcHlpbmcgJXMgKG91dHB1dCB1cC10by1kYXRlKSIsIHNyYykKKyAgICAgICAgcmV0dXJuIGRzdCwgMAorCisgICAgdHJ5OgorICAgICAgICBhY3Rpb24gPSBfY29weV9hY3Rpb25bbGlua10KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgdmFsdWUgJyVzJyBmb3IgJ2xpbmsnIGFyZ3VtZW50IiAlIGxpbmspCisKKyAgICBpZiB2ZXJib3NlID49IDE6CisgICAgICAgIGlmIG9zLnBhdGguYmFzZW5hbWUoZHN0KSA9PSBvcy5wYXRoLmJhc2VuYW1lKHNyYyk6CisgICAgICAgICAgICBsb2cuaW5mbygiJXMgJXMgLT4gJXMiLCBhY3Rpb24sIHNyYywgZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmluZm8oIiVzICVzIC0+ICVzIiwgYWN0aW9uLCBzcmMsIGRzdCkKKworICAgIGlmIGRyeV9ydW46CisgICAgICAgIHJldHVybiAoZHN0LCAxKQorCisgICAgIyBJZiBsaW5raW5nIChoYXJkIG9yIHN5bWJvbGljKSwgdXNlIHRoZSBhcHByb3ByaWF0ZSBzeXN0ZW0gY2FsbAorICAgICMgKFVuaXggb25seSwgb2YgY291cnNlLCBidXQgdGhhdCdzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSkKKyAgICBpZiBsaW5rID09ICdoYXJkJzoKKyAgICAgICAgaWYgbm90IChvcy5wYXRoLmV4aXN0cyhkc3QpIGFuZCBvcy5wYXRoLnNhbWVmaWxlKHNyYywgZHN0KSk6CisgICAgICAgICAgICBvcy5saW5rKHNyYywgZHN0KQorICAgIGVsaWYgbGluayA9PSAnc3ltJzoKKyAgICAgICAgaWYgbm90IChvcy5wYXRoLmV4aXN0cyhkc3QpIGFuZCBvcy5wYXRoLnNhbWVmaWxlKHNyYywgZHN0KSk6CisgICAgICAgICAgICBvcy5zeW1saW5rKHNyYywgZHN0KQorCisgICAgIyBPdGhlcndpc2UgKG5vbi1NYWMsIG5vdCBsaW5raW5nKSwgY29weSB0aGUgZmlsZSBjb250ZW50cyBhbmQKKyAgICAjIChvcHRpb25hbGx5KSBjb3B5IHRoZSB0aW1lcyBhbmQgbW9kZS4KKyAgICBlbHNlOgorICAgICAgICBfY29weV9maWxlX2NvbnRlbnRzKHNyYywgZHN0KQorICAgICAgICBpZiBwcmVzZXJ2ZV9tb2RlIG9yIHByZXNlcnZlX3RpbWVzOgorICAgICAgICAgICAgc3QgPSBvcy5zdGF0KHNyYykKKworICAgICAgICAgICAgIyBBY2NvcmRpbmcgdG8gRGF2aWQgQXNjaGVyIDxkYUBza2kub3JnPiwgdXRpbWUoKSBzaG91bGQgYmUgZG9uZQorICAgICAgICAgICAgIyBiZWZvcmUgY2htb2QoKSAoYXQgbGVhc3QgdW5kZXIgTlQpLgorICAgICAgICAgICAgaWYgcHJlc2VydmVfdGltZXM6CisgICAgICAgICAgICAgICAgb3MudXRpbWUoZHN0LCAoc3RbU1RfQVRJTUVdLCBzdFtTVF9NVElNRV0pKQorICAgICAgICAgICAgaWYgcHJlc2VydmVfbW9kZToKKyAgICAgICAgICAgICAgICBvcy5jaG1vZChkc3QsIFNfSU1PREUoc3RbU1RfTU9ERV0pKQorCisgICAgcmV0dXJuIChkc3QsIDEpCisKKyMgWFhYIEkgc3VzcGVjdCB0aGlzIGlzIFVuaXgtc3BlY2lmaWMgLS0gbmVlZCBwb3J0aW5nIGhlbHAhCitkZWYgbW92ZV9maWxlIChzcmMsIGRzdCwgdmVyYm9zZT0xLCBkcnlfcnVuPTApOgorICAgICIiIk1vdmUgYSBmaWxlICdzcmMnIHRvICdkc3QnLgorCisgICAgSWYgJ2RzdCcgaXMgYSBkaXJlY3RvcnksIHRoZSBmaWxlIHdpbGwgYmUgbW92ZWQgaW50byBpdCB3aXRoIHRoZSBzYW1lCisgICAgbmFtZTsgb3RoZXJ3aXNlLCAnc3JjJyBpcyBqdXN0IHJlbmFtZWQgdG8gJ2RzdCcuICBSZXR1cm4gdGhlIG5ldworICAgIGZ1bGwgbmFtZSBvZiB0aGUgZmlsZS4KKworICAgIEhhbmRsZXMgY3Jvc3MtZGV2aWNlIG1vdmVzIG9uIFVuaXggdXNpbmcgJ2NvcHlfZmlsZSgpJy4gIFdoYXQgYWJvdXQKKyAgICBvdGhlciBzeXN0ZW1zPz8/CisgICAgIiIiCisgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBleGlzdHMsIGlzZmlsZSwgaXNkaXIsIGJhc2VuYW1lLCBkaXJuYW1lCisgICAgaW1wb3J0IGVycm5vCisKKyAgICBpZiB2ZXJib3NlID49IDE6CisgICAgICAgIGxvZy5pbmZvKCJtb3ZpbmcgJXMgLT4gJXMiLCBzcmMsIGRzdCkKKworICAgIGlmIGRyeV9ydW46CisgICAgICAgIHJldHVybiBkc3QKKworICAgIGlmIG5vdCBpc2ZpbGUoc3JjKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKCJjYW4ndCBtb3ZlICclcyc6IG5vdCBhIHJlZ3VsYXIgZmlsZSIgJSBzcmMpCisKKyAgICBpZiBpc2Rpcihkc3QpOgorICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oZHN0LCBiYXNlbmFtZShzcmMpKQorICAgIGVsaWYgZXhpc3RzKGRzdCk6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgImNhbid0IG1vdmUgJyVzJzogZGVzdGluYXRpb24gJyVzJyBhbHJlYWR5IGV4aXN0cyIgJQorICAgICAgICAgICAgICAoc3JjLCBkc3QpKQorCisgICAgaWYgbm90IGlzZGlyKGRpcm5hbWUoZHN0KSk6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0ZpbGVFcnJvcigKKyAgICAgICAgICAgICAgImNhbid0IG1vdmUgJyVzJzogZGVzdGluYXRpb24gJyVzJyBub3QgYSB2YWxpZCBwYXRoIiAlIFwKKyAgICAgICAgICAgICAgKHNyYywgZHN0KSkKKworICAgIGNvcHlfaXQgPSAwCisgICAgdHJ5OgorICAgICAgICBvcy5yZW5hbWUoc3JjLCBkc3QpCisgICAgZXhjZXB0IG9zLmVycm9yLCAobnVtLCBtc2cpOgorICAgICAgICBpZiBudW0gPT0gZXJybm8uRVhERVY6CisgICAgICAgICAgICBjb3B5X2l0ID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKAorICAgICAgICAgICAgICAgICAgImNvdWxkbid0IG1vdmUgJyVzJyB0byAnJXMnOiAlcyIgJSAoc3JjLCBkc3QsIG1zZykpCisKKyAgICBpZiBjb3B5X2l0OgorICAgICAgICBjb3B5X2ZpbGUoc3JjLCBkc3QsIHZlcmJvc2U9dmVyYm9zZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKHNyYykKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yLCAobnVtLCBtc2cpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhkc3QpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRmlsZUVycm9yKAorICAgICAgICAgICAgICAgICAgKCJjb3VsZG4ndCBtb3ZlICclcycgdG8gJyVzJyBieSBjb3B5L2RlbGV0ZTogIiArCisgICAgICAgICAgICAgICAgICAgImRlbGV0ZSAnJXMnIGZhaWxlZDogJXMiKSAlCisgICAgICAgICAgICAgICAgICAoc3JjLCBkc3QsIHNyYywgbXNnKSkKKyAgICByZXR1cm4gZHN0CisKKworZGVmIHdyaXRlX2ZpbGUgKGZpbGVuYW1lLCBjb250ZW50cyk6CisgICAgIiIiQ3JlYXRlIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBhbmQgd3JpdGUgJ2NvbnRlbnRzJyAoYQorICAgIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2l0aG91dCBsaW5lIHRlcm1pbmF0b3JzKSB0byBpdC4KKyAgICAiIiIKKyAgICBmID0gb3BlbihmaWxlbmFtZSwgInciKQorICAgIHRyeToKKyAgICAgICAgZm9yIGxpbmUgaW4gY29udGVudHM6CisgICAgICAgICAgICBmLndyaXRlKGxpbmUgKyAiXG4iKQorICAgIGZpbmFsbHk6CisgICAgICAgIGYuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZV91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyNGY0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZV91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyNGY0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVfdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZWxpc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9maWxlbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjFjNDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZWxpc3QucHkKQEAgLTAsMCArMSwzNDMgQEAKKyIiImRpc3R1dGlscy5maWxlbGlzdAorCitQcm92aWRlcyB0aGUgRmlsZUxpc3QgY2xhc3MsIHVzZWQgZm9yIHBva2luZyBhYm91dCB0aGUgZmlsZXN5c3RlbQorYW5kIGJ1aWxkaW5nIGxpc3RzIG9mIGZpbGVzLgorIiIiCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MsIHJlCitpbXBvcnQgZm5tYXRjaAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1RlbXBsYXRlRXJyb3IsIERpc3R1dGlsc0ludGVybmFsRXJyb3IKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworY2xhc3MgRmlsZUxpc3Q6CisgICAgIiIiQSBsaXN0IG9mIGZpbGVzIGJ1aWx0IGJ5IG9uIGV4cGxvcmluZyB0aGUgZmlsZXN5c3RlbSBhbmQgZmlsdGVyZWQgYnkKKyAgICBhcHBseWluZyB2YXJpb3VzIHBhdHRlcm5zIHRvIHdoYXQgd2UgZmluZCB0aGVyZS4KKworICAgIEluc3RhbmNlIGF0dHJpYnV0ZXM6CisgICAgICBkaXIKKyAgICAgICAgZGlyZWN0b3J5IGZyb20gd2hpY2ggZmlsZXMgd2lsbCBiZSB0YWtlbiAtLSBvbmx5IHVzZWQgaWYKKyAgICAgICAgJ2FsbGZpbGVzJyBub3Qgc3VwcGxpZWQgdG8gY29uc3RydWN0b3IKKyAgICAgIGZpbGVzCisgICAgICAgIGxpc3Qgb2YgZmlsZW5hbWVzIGN1cnJlbnRseSBiZWluZyBidWlsdC9maWx0ZXJlZC9tYW5pcHVsYXRlZAorICAgICAgYWxsZmlsZXMKKyAgICAgICAgY29tcGxldGUgbGlzdCBvZiBmaWxlcyB1bmRlciBjb25zaWRlcmF0aW9uIChpZS4gd2l0aG91dCBhbnkKKyAgICAgICAgZmlsdGVyaW5nIGFwcGxpZWQpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2Fybj1Ob25lLCBkZWJ1Z19wcmludD1Ob25lKToKKyAgICAgICAgIyBpZ25vcmUgYXJndW1lbnQgdG8gRmlsZUxpc3QsIGJ1dCBrZWVwIHRoZW0gZm9yIGJhY2t3YXJkcworICAgICAgICAjIGNvbXBhdGliaWxpdHkKKyAgICAgICAgc2VsZi5hbGxmaWxlcyA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlcyA9IFtdCisKKyAgICBkZWYgc2V0X2FsbGZpbGVzKHNlbGYsIGFsbGZpbGVzKToKKyAgICAgICAgc2VsZi5hbGxmaWxlcyA9IGFsbGZpbGVzCisKKyAgICBkZWYgZmluZGFsbChzZWxmLCBkaXI9b3MuY3VyZGlyKToKKyAgICAgICAgc2VsZi5hbGxmaWxlcyA9IGZpbmRhbGwoZGlyKQorCisgICAgZGVmIGRlYnVnX3ByaW50KHNlbGYsIG1zZyk6CisgICAgICAgICIiIlByaW50ICdtc2cnIHRvIHN0ZG91dCBpZiB0aGUgZ2xvYmFsIERFQlVHICh0YWtlbiBmcm9tIHRoZQorICAgICAgICBESVNUVVRJTFNfREVCVUcgZW52aXJvbm1lbnQgdmFyaWFibGUpIGZsYWcgaXMgdHJ1ZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gZGlzdHV0aWxzLmRlYnVnIGltcG9ydCBERUJVRworICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIHByaW50IG1zZworCisgICAgIyAtLSBMaXN0LWxpa2UgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CisgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKGl0ZW0pCisKKyAgICBkZWYgZXh0ZW5kKHNlbGYsIGl0ZW1zKToKKyAgICAgICAgc2VsZi5maWxlcy5leHRlbmQoaXRlbXMpCisKKyAgICBkZWYgc29ydChzZWxmKToKKyAgICAgICAgIyBOb3QgYSBzdHJpY3QgbGV4aWNhbCBzb3J0IQorICAgICAgICBzb3J0YWJsZV9maWxlcyA9IG1hcChvcy5wYXRoLnNwbGl0LCBzZWxmLmZpbGVzKQorICAgICAgICBzb3J0YWJsZV9maWxlcy5zb3J0KCkKKyAgICAgICAgc2VsZi5maWxlcyA9IFtdCisgICAgICAgIGZvciBzb3J0X3R1cGxlIGluIHNvcnRhYmxlX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQob3MucGF0aC5qb2luKCpzb3J0X3R1cGxlKSkKKworCisgICAgIyAtLSBPdGhlciBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiByZW1vdmVfZHVwbGljYXRlcyhzZWxmKToKKyAgICAgICAgIyBBc3N1bWVzIGxpc3QgaGFzIGJlZW4gc29ydGVkIQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5maWxlcykgLSAxLCAwLCAtMSk6CisgICAgICAgICAgICBpZiBzZWxmLmZpbGVzW2ldID09IHNlbGYuZmlsZXNbaSAtIDFdOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmZpbGVzW2ldCisKKworICAgICMgLS0gIkZpbGUgdGVtcGxhdGUiIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX3BhcnNlX3RlbXBsYXRlX2xpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICAgIGFjdGlvbiA9IHdvcmRzWzBdCisKKyAgICAgICAgcGF0dGVybnMgPSBkaXIgPSBkaXJfcGF0dGVybiA9IE5vbmUKKworICAgICAgICBpZiBhY3Rpb24gaW4gKCdpbmNsdWRlJywgJ2V4Y2x1ZGUnLAorICAgICAgICAgICAgICAgICAgICAgICdnbG9iYWwtaW5jbHVkZScsICdnbG9iYWwtZXhjbHVkZScpOgorICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzVGVtcGxhdGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICInJXMnIGV4cGVjdHMgPHBhdHRlcm4xPiA8cGF0dGVybjI+IC4uLiIgJSBhY3Rpb24KKworICAgICAgICAgICAgcGF0dGVybnMgPSBtYXAoY29udmVydF9wYXRoLCB3b3Jkc1sxOl0pCisKKyAgICAgICAgZWxpZiBhY3Rpb24gaW4gKCdyZWN1cnNpdmUtaW5jbHVkZScsICdyZWN1cnNpdmUtZXhjbHVkZScpOgorICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSA8IDM6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzVGVtcGxhdGVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICInJXMnIGV4cGVjdHMgPGRpcj4gPHBhdHRlcm4xPiA8cGF0dGVybjI+IC4uLiIgJSBhY3Rpb24KKworICAgICAgICAgICAgZGlyID0gY29udmVydF9wYXRoKHdvcmRzWzFdKQorICAgICAgICAgICAgcGF0dGVybnMgPSBtYXAoY29udmVydF9wYXRoLCB3b3Jkc1syOl0pCisKKyAgICAgICAgZWxpZiBhY3Rpb24gaW4gKCdncmFmdCcsICdwcnVuZScpOgorICAgICAgICAgICAgaWYgbGVuKHdvcmRzKSAhPSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1RlbXBsYXRlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICInJXMnIGV4cGVjdHMgYSBzaW5nbGUgPGRpcl9wYXR0ZXJuPiIgJSBhY3Rpb24KKworICAgICAgICAgICAgZGlyX3BhdHRlcm4gPSBjb252ZXJ0X3BhdGgod29yZHNbMV0pCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1RlbXBsYXRlRXJyb3IsICJ1bmtub3duIGFjdGlvbiAnJXMnIiAlIGFjdGlvbgorCisgICAgICAgIHJldHVybiAoYWN0aW9uLCBwYXR0ZXJucywgZGlyLCBkaXJfcGF0dGVybikKKworICAgIGRlZiBwcm9jZXNzX3RlbXBsYXRlX2xpbmUoc2VsZiwgbGluZSk6CisgICAgICAgICMgUGFyc2UgdGhlIGxpbmU6IHNwbGl0IGl0IHVwLCBtYWtlIHN1cmUgdGhlIHJpZ2h0IG51bWJlciBvZiB3b3JkcworICAgICAgICAjIGlzIHRoZXJlLCBhbmQgcmV0dXJuIHRoZSByZWxldmFudCB3b3Jkcy4gICdhY3Rpb24nIGlzIGFsd2F5cworICAgICAgICAjIGRlZmluZWQ6IGl0J3MgdGhlIGZpcnN0IHdvcmQgb2YgdGhlIGxpbmUuICBXaGljaCBvZiB0aGUgb3RoZXIKKyAgICAgICAgIyB0aHJlZSBhcmUgZGVmaW5lZCBkZXBlbmRzIG9uIHRoZSBhY3Rpb247IGl0J2xsIGJlIGVpdGhlcgorICAgICAgICAjIHBhdHRlcm5zLCAoZGlyIGFuZCBwYXR0ZXJucyksIG9yIChkaXJfcGF0dGVybikuCisgICAgICAgIGFjdGlvbiwgcGF0dGVybnMsIGRpciwgZGlyX3BhdHRlcm4gPSBzZWxmLl9wYXJzZV90ZW1wbGF0ZV9saW5lKGxpbmUpCisKKyAgICAgICAgIyBPSywgbm93IHdlIGtub3cgdGhhdCB0aGUgYWN0aW9uIGlzIHZhbGlkIGFuZCB3ZSBoYXZlIHRoZQorICAgICAgICAjIHJpZ2h0IG51bWJlciBvZiB3b3JkcyBvbiB0aGUgbGluZSBmb3IgdGhhdCBhY3Rpb24gLS0gc28gd2UKKyAgICAgICAgIyBjYW4gcHJvY2VlZCB3aXRoIG1pbmltYWwgZXJyb3ItY2hlY2tpbmcuCisgICAgICAgIGlmIGFjdGlvbiA9PSAnaW5jbHVkZSc6CisgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJpbmNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCisgICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPTEpOgorICAgICAgICAgICAgICAgICAgICBsb2cud2Fybigid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4pCisKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2V4Y2x1ZGUnOgorICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZXhjbHVkZSAiICsgJyAnLmpvaW4ocGF0dGVybnMpKQorICAgICAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZXhjbHVkZV9wYXR0ZXJuKHBhdHRlcm4sIGFuY2hvcj0xKToKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3VuZCBtYXRjaGluZyAnJXMnIiksIHBhdHRlcm4pCisKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1pbmNsdWRlJzoKKyAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdsb2JhbC1pbmNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCisgICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPTApOgorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIGZpbGVzIGZvdW5kIG1hdGNoaW5nICclcycgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uIiksIHBhdHRlcm4pCisKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ2dsb2JhbC1leGNsdWRlJzoKKyAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImdsb2JhbC1leGNsdWRlICIgKyAnICcuam9pbihwYXR0ZXJucykpCisgICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPTApOgorICAgICAgICAgICAgICAgICAgICBsb2cud2FybigoIndhcm5pbmc6IG5vIHByZXZpb3VzbHktaW5jbHVkZWQgZmlsZXMgbWF0Y2hpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiclcycgZm91bmQgYW55d2hlcmUgaW4gZGlzdHJpYnV0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4pCisKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gJ3JlY3Vyc2l2ZS1pbmNsdWRlJzoKKyAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoInJlY3Vyc2l2ZS1pbmNsdWRlICVzICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIsICcgJy5qb2luKHBhdHRlcm5zKSkpCisgICAgICAgICAgICBmb3IgcGF0dGVybiBpbiBwYXR0ZXJuczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5pbmNsdWRlX3BhdHRlcm4ocGF0dGVybiwgcHJlZml4PWRpcik6CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCgid2FybmluZzogbm8gZmlsZXMgZm91bmQgbWF0Y2hpbmcgJyVzJyAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIGRpcikKKworICAgICAgICBlbGlmIGFjdGlvbiA9PSAncmVjdXJzaXZlLWV4Y2x1ZGUnOgorICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgicmVjdXJzaXZlLWV4Y2x1ZGUgJXMgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciwgJyAnLmpvaW4ocGF0dGVybnMpKSkKKyAgICAgICAgICAgIGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmV4Y2x1ZGVfcGF0dGVybihwYXR0ZXJuLCBwcmVmaXg9ZGlyKToKKyAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oKCJ3YXJuaW5nOiBubyBwcmV2aW91c2x5LWluY2x1ZGVkIGZpbGVzIG1hdGNoaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnIGZvdW5kIHVuZGVyIGRpcmVjdG9yeSAnJXMnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4sIGRpcikKKworICAgICAgICBlbGlmIGFjdGlvbiA9PSAnZ3JhZnQnOgorICAgICAgICAgICAgc2VsZi5kZWJ1Z19wcmludCgiZ3JhZnQgIiArIGRpcl9wYXR0ZXJuKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuaW5jbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1kaXJfcGF0dGVybik6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIndhcm5pbmc6IG5vIGRpcmVjdG9yaWVzIGZvdW5kIG1hdGNoaW5nICclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRpcl9wYXR0ZXJuKQorCisgICAgICAgIGVsaWYgYWN0aW9uID09ICdwcnVuZSc6CisgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJwcnVuZSAiICsgZGlyX3BhdHRlcm4pCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlX3BhdHRlcm4oTm9uZSwgcHJlZml4PWRpcl9wYXR0ZXJuKToKKyAgICAgICAgICAgICAgICBsb2cud2FybigoIm5vIHByZXZpb3VzbHktaW5jbHVkZWQgZGlyZWN0b3JpZXMgZm91bmQgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaGluZyAnJXMnIiksIGRpcl9wYXR0ZXJuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzSW50ZXJuYWxFcnJvciwgXAorICAgICAgICAgICAgICAgICAgInRoaXMgY2Fubm90IGhhcHBlbjogaW52YWxpZCBhY3Rpb24gJyVzJyIgJSBhY3Rpb24KKworICAgICMgLS0gRmlsdGVyaW5nL3NlbGVjdGlvbiBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgaW5jbHVkZV9wYXR0ZXJuKHNlbGYsIHBhdHRlcm4sIGFuY2hvcj0xLCBwcmVmaXg9Tm9uZSwgaXNfcmVnZXg9MCk6CisgICAgICAgICIiIlNlbGVjdCBzdHJpbmdzIChwcmVzdW1hYmx5IGZpbGVuYW1lcykgZnJvbSAnc2VsZi5maWxlcycgdGhhdAorICAgICAgICBtYXRjaCAncGF0dGVybicsIGEgVW5peC1zdHlsZSB3aWxkY2FyZCAoZ2xvYikgcGF0dGVybi4KKworICAgICAgICBQYXR0ZXJucyBhcmUgbm90IHF1aXRlIHRoZSBzYW1lIGFzIGltcGxlbWVudGVkIGJ5IHRoZSAnZm5tYXRjaCcKKyAgICAgICAgbW9kdWxlOiAnKicgYW5kICc/JyAgbWF0Y2ggbm9uLXNwZWNpYWwgY2hhcmFjdGVycywgd2hlcmUgInNwZWNpYWwiCisgICAgICAgIGlzIHBsYXRmb3JtLWRlcGVuZGVudDogc2xhc2ggb24gVW5peDsgY29sb24sIHNsYXNoLCBhbmQgYmFja3NsYXNoIG9uCisgICAgICAgIERPUy9XaW5kb3dzOyBhbmQgY29sb24gb24gTWFjIE9TLgorCisgICAgICAgIElmICdhbmNob3InIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgdGhlbiB0aGUgcGF0dGVybiBtYXRjaCBpcyBtb3JlCisgICAgICAgIHN0cmluZ2VudDogIioucHkiIHdpbGwgbWF0Y2ggImZvby5weSIgYnV0IG5vdCAiZm9vL2Jhci5weSIuICBJZgorICAgICAgICAnYW5jaG9yJyBpcyBmYWxzZSwgYm90aCBvZiB0aGVzZSB3aWxsIG1hdGNoLgorCisgICAgICAgIElmICdwcmVmaXgnIGlzIHN1cHBsaWVkLCB0aGVuIG9ubHkgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggJ3ByZWZpeCcKKyAgICAgICAgKGl0c2VsZiBhIHBhdHRlcm4pIGFuZCBlbmRpbmcgd2l0aCAncGF0dGVybicsIHdpdGggYW55dGhpbmcgaW4gYmV0d2VlbgorICAgICAgICB0aGVtLCB3aWxsIG1hdGNoLiAgJ2FuY2hvcicgaXMgaWdub3JlZCBpbiB0aGlzIGNhc2UuCisKKyAgICAgICAgSWYgJ2lzX3JlZ2V4JyBpcyB0cnVlLCAnYW5jaG9yJyBhbmQgJ3ByZWZpeCcgYXJlIGlnbm9yZWQsIGFuZAorICAgICAgICAncGF0dGVybicgaXMgYXNzdW1lZCB0byBiZSBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHJlZ2V4IG9yIGEKKyAgICAgICAgcmVnZXggb2JqZWN0IC0tIG5vIHRyYW5zbGF0aW9uIGlzIGRvbmUsIHRoZSByZWdleCBpcyBqdXN0IGNvbXBpbGVkCisgICAgICAgIGFuZCB1c2VkIGFzLWlzLgorCisgICAgICAgIFNlbGVjdGVkIHN0cmluZ3Mgd2lsbCBiZSBhZGRlZCB0byBzZWxmLmZpbGVzLgorCisgICAgICAgIFJldHVybiAxIGlmIGZpbGVzIGFyZSBmb3VuZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYIGRvY3N0cmluZyBseWluZyBhYm91dCB3aGF0IHRoZSBzcGVjaWFsIGNoYXJzIGFyZT8KKyAgICAgICAgZmlsZXNfZm91bmQgPSAwCisgICAgICAgIHBhdHRlcm5fcmUgPSB0cmFuc2xhdGVfcGF0dGVybihwYXR0ZXJuLCBhbmNob3IsIHByZWZpeCwgaXNfcmVnZXgpCisgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoImluY2x1ZGVfcGF0dGVybjogYXBwbHlpbmcgcmVnZXggciclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3JlLnBhdHRlcm4pCisKKyAgICAgICAgIyBkZWxheWVkIGxvYWRpbmcgb2YgYWxsZmlsZXMgbGlzdAorICAgICAgICBpZiBzZWxmLmFsbGZpbGVzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmZpbmRhbGwoKQorCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuYWxsZmlsZXM6CisgICAgICAgICAgICBpZiBwYXR0ZXJuX3JlLnNlYXJjaChuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCIgYWRkaW5nICIgKyBuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgZmlsZXNfZm91bmQgPSAxCisKKyAgICAgICAgcmV0dXJuIGZpbGVzX2ZvdW5kCisKKworICAgIGRlZiBleGNsdWRlX3BhdHRlcm4oc2VsZiwgcGF0dGVybiwgYW5jaG9yPTEsIHByZWZpeD1Ob25lLCBpc19yZWdleD0wKToKKyAgICAgICAgIiIiUmVtb3ZlIHN0cmluZ3MgKHByZXN1bWFibHkgZmlsZW5hbWVzKSBmcm9tICdmaWxlcycgdGhhdCBtYXRjaAorICAgICAgICAncGF0dGVybicuCisKKyAgICAgICAgT3RoZXIgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgYXMgZm9yICdpbmNsdWRlX3BhdHRlcm4oKScsIGFib3ZlLgorICAgICAgICBUaGUgbGlzdCAnc2VsZi5maWxlcycgaXMgbW9kaWZpZWQgaW4gcGxhY2UuIFJldHVybiAxIGlmIGZpbGVzIGFyZQorICAgICAgICBmb3VuZC4KKyAgICAgICAgIiIiCisgICAgICAgIGZpbGVzX2ZvdW5kID0gMAorICAgICAgICBwYXR0ZXJuX3JlID0gdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yLCBwcmVmaXgsIGlzX3JlZ2V4KQorICAgICAgICBzZWxmLmRlYnVnX3ByaW50KCJleGNsdWRlX3BhdHRlcm46IGFwcGx5aW5nIHJlZ2V4IHInJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9yZS5wYXR0ZXJuKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5maWxlcyktMSwgLTEsIC0xKToKKyAgICAgICAgICAgIGlmIHBhdHRlcm5fcmUuc2VhcmNoKHNlbGYuZmlsZXNbaV0pOgorICAgICAgICAgICAgICAgIHNlbGYuZGVidWdfcHJpbnQoIiByZW1vdmluZyAiICsgc2VsZi5maWxlc1tpXSkKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5maWxlc1tpXQorICAgICAgICAgICAgICAgIGZpbGVzX2ZvdW5kID0gMQorCisgICAgICAgIHJldHVybiBmaWxlc19mb3VuZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBVdGlsaXR5IGZ1bmN0aW9ucworCitkZWYgZmluZGFsbChkaXIgPSBvcy5jdXJkaXIpOgorICAgICIiIkZpbmQgYWxsIGZpbGVzIHVuZGVyICdkaXInIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2YgZnVsbCBmaWxlbmFtZXMKKyAgICAocmVsYXRpdmUgdG8gJ2RpcicpLgorICAgICIiIgorICAgIGZyb20gc3RhdCBpbXBvcnQgU1RfTU9ERSwgU19JU1JFRywgU19JU0RJUiwgU19JU0xOSworCisgICAgbGlzdCA9IFtdCisgICAgc3RhY2sgPSBbZGlyXQorICAgIHBvcCA9IHN0YWNrLnBvcAorICAgIHB1c2ggPSBzdGFjay5hcHBlbmQKKworICAgIHdoaWxlIHN0YWNrOgorICAgICAgICBkaXIgPSBwb3AoKQorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlyKQorCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgaWYgZGlyICE9IG9zLmN1cmRpcjogICAgICAgICMgYXZvaWQgdGhlIGRyZWFkZWQgIi4vIiBzeW5kcm9tZQorICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpciwgbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBuYW1lCisKKyAgICAgICAgICAgICMgQXZvaWQgZXhjZXNzIHN0YXQgY2FsbHMgLS0ganVzdCBvbmUgd2lsbCBkbywgdGhhbmsgeW91IQorICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCisgICAgICAgICAgICBtb2RlID0gc3RhdFtTVF9NT0RFXQorICAgICAgICAgICAgaWYgU19JU1JFRyhtb2RlKToKKyAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZChmdWxsbmFtZSkKKyAgICAgICAgICAgIGVsaWYgU19JU0RJUihtb2RlKSBhbmQgbm90IFNfSVNMTksobW9kZSk6CisgICAgICAgICAgICAgICAgcHVzaChmdWxsbmFtZSkKKworICAgIHJldHVybiBsaXN0CisKKworZGVmIGdsb2JfdG9fcmUocGF0dGVybik6CisgICAgIiIiVHJhbnNsYXRlIGEgc2hlbGwtbGlrZSBnbG9iIHBhdHRlcm4gdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCisKKyAgICBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyB0aGUgcmVnZXguICBEaWZmZXJzIGZyb20KKyAgICAnZm5tYXRjaC50cmFuc2xhdGUoKScgaW4gdGhhdCAnKicgZG9lcyBub3QgbWF0Y2ggInNwZWNpYWwgY2hhcmFjdGVycyIKKyAgICAod2hpY2ggYXJlIHBsYXRmb3JtLXNwZWNpZmljKS4KKyAgICAiIiIKKyAgICBwYXR0ZXJuX3JlID0gZm5tYXRjaC50cmFuc2xhdGUocGF0dGVybikKKworICAgICMgJz8nIGFuZCAnKicgaW4gdGhlIGdsb2IgcGF0dGVybiBiZWNvbWUgJy4nIGFuZCAnLionIGluIHRoZSBSRSwgd2hpY2gKKyAgICAjIElNSE8gaXMgd3JvbmcgLS0gJz8nIGFuZCAnKicgYXJlbid0IHN1cHBvc2VkIHRvIG1hdGNoIHNsYXNoIGluIFVuaXgsCisgICAgIyBhbmQgYnkgZXh0ZW5zaW9uIHRoZXkgc2hvdWxkbid0IG1hdGNoIHN1Y2ggInNwZWNpYWwgY2hhcmFjdGVycyIgdW5kZXIKKyAgICAjIGFueSBPUy4gIFNvIGNoYW5nZSBhbGwgbm9uLWVzY2FwZWQgZG90cyBpbiB0aGUgUkUgdG8gbWF0Y2ggYW55CisgICAgIyBjaGFyYWN0ZXIgZXhjZXB0IHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgKGN1cnJlbnRseToganVzdCBvcy5zZXApLgorICAgIHNlcCA9IG9zLnNlcAorICAgIGlmIG9zLnNlcCA9PSAnXFwnOgorICAgICAgICAjIHdlJ3JlIHVzaW5nIGEgcmVnZXggdG8gbWFuaXB1bGF0ZSBhIHJlZ2V4LCBzbyB3ZSBuZWVkCisgICAgICAgICMgdG8gZXNjYXBlIHRoZSBiYWNrc2xhc2ggdHdpY2UKKyAgICAgICAgc2VwID0gcidcXFxcJworICAgIGVzY2FwZWQgPSByJ1wxW14lc10nICUgc2VwCisgICAgcGF0dGVybl9yZSA9IHJlLnN1YihyJygoPzwhXFwpKFxcXFwpKilcLicsIGVzY2FwZWQsIHBhdHRlcm5fcmUpCisgICAgcmV0dXJuIHBhdHRlcm5fcmUKKworCitkZWYgdHJhbnNsYXRlX3BhdHRlcm4ocGF0dGVybiwgYW5jaG9yPTEsIHByZWZpeD1Ob25lLCBpc19yZWdleD0wKToKKyAgICAiIiJUcmFuc2xhdGUgYSBzaGVsbC1saWtlIHdpbGRjYXJkIHBhdHRlcm4gdG8gYSBjb21waWxlZCByZWd1bGFyCisgICAgZXhwcmVzc2lvbi4KKworICAgIFJldHVybiB0aGUgY29tcGlsZWQgcmVnZXguICBJZiAnaXNfcmVnZXgnIHRydWUsCisgICAgdGhlbiAncGF0dGVybicgaXMgZGlyZWN0bHkgY29tcGlsZWQgdG8gYSByZWdleCAoaWYgaXQncyBhIHN0cmluZykKKyAgICBvciBqdXN0IHJldHVybmVkIGFzLWlzIChhc3N1bWVzIGl0J3MgYSByZWdleCBvYmplY3QpLgorICAgICIiIgorICAgIGlmIGlzX3JlZ2V4OgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIHN0cik6CisgICAgICAgICAgICByZXR1cm4gcmUuY29tcGlsZShwYXR0ZXJuKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHBhdHRlcm4KKworICAgIGlmIHBhdHRlcm46CisgICAgICAgIHBhdHRlcm5fcmUgPSBnbG9iX3RvX3JlKHBhdHRlcm4pCisgICAgZWxzZToKKyAgICAgICAgcGF0dGVybl9yZSA9ICcnCisKKyAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICMgZGl0Y2ggZW5kIG9mIHBhdHRlcm4gY2hhcmFjdGVyCisgICAgICAgIGVtcHR5X3BhdHRlcm4gPSBnbG9iX3RvX3JlKCcnKQorICAgICAgICBwcmVmaXhfcmUgPSBnbG9iX3RvX3JlKHByZWZpeClbOi1sZW4oZW1wdHlfcGF0dGVybildCisgICAgICAgIHNlcCA9IG9zLnNlcAorICAgICAgICBpZiBvcy5zZXAgPT0gJ1xcJzoKKyAgICAgICAgICAgIHNlcCA9IHInXFwnCisgICAgICAgIHBhdHRlcm5fcmUgPSAiXiIgKyBzZXAuam9pbigocHJlZml4X3JlLCAiLioiICsgcGF0dGVybl9yZSkpCisgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBwcmVmaXggLS0gcmVzcGVjdCBhbmNob3IgZmxhZworICAgICAgICBpZiBhbmNob3I6CisgICAgICAgICAgICBwYXR0ZXJuX3JlID0gIl4iICsgcGF0dGVybl9yZQorCisgICAgcmV0dXJuIHJlLmNvbXBpbGUocGF0dGVybl9yZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJkNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZWxpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2ZpbGVsaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDJkNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvZmlsZWxpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTg4NTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbG9nLnB5CkBAIC0wLDAgKzEsNzEgQEAKKyIiIkEgc2ltcGxlIGxvZyBtZWNoYW5pc20gc3R5bGVkIGFmdGVyIFBFUCAyODIuIiIiCisKKyMgVGhlIGNsYXNzIGhlcmUgaXMgc3R5bGVkIGFmdGVyIFBFUCAyODIgc28gdGhhdCBpdCBjb3VsZCBsYXRlciBiZQorIyByZXBsYWNlZCB3aXRoIGEgc3RhbmRhcmQgUHl0aG9uIGxvZ2dpbmcgaW1wbGVtZW50YXRpb24uCisKK0RFQlVHID0gMQorSU5GTyA9IDIKK1dBUk4gPSAzCitFUlJPUiA9IDQKK0ZBVEFMID0gNQorCitpbXBvcnQgc3lzCisKK2NsYXNzIExvZzoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aHJlc2hvbGQ9V0FSTik6CisgICAgICAgIHNlbGYudGhyZXNob2xkID0gdGhyZXNob2xkCisKKyAgICBkZWYgX2xvZyhzZWxmLCBsZXZlbCwgbXNnLCBhcmdzKToKKyAgICAgICAgaWYgbGV2ZWwgbm90IGluIChERUJVRywgSU5GTywgV0FSTiwgRVJST1IsIEZBVEFMKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJyVzIHdyb25nIGxvZyBsZXZlbCcgJSBzdHIobGV2ZWwpKQorCisgICAgICAgIGlmIGxldmVsID49IHNlbGYudGhyZXNob2xkOgorICAgICAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgICAgICBtc2cgPSBtc2cgJSBhcmdzCisgICAgICAgICAgICBpZiBsZXZlbCBpbiAoV0FSTiwgRVJST1IsIEZBVEFMKToKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSBzeXMuc3RkZXJyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZSgnJXNcbicgJSBtc2cpCisgICAgICAgICAgICBzdHJlYW0uZmx1c2goKQorCisgICAgZGVmIGxvZyhzZWxmLCBsZXZlbCwgbXNnLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2xvZyhsZXZlbCwgbXNnLCBhcmdzKQorCisgICAgZGVmIGRlYnVnKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBzZWxmLl9sb2coREVCVUcsIG1zZywgYXJncykKKworICAgIGRlZiBpbmZvKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBzZWxmLl9sb2coSU5GTywgbXNnLCBhcmdzKQorCisgICAgZGVmIHdhcm4oc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2xvZyhXQVJOLCBtc2csIGFyZ3MpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2xvZyhFUlJPUiwgbXNnLCBhcmdzKQorCisgICAgZGVmIGZhdGFsKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBzZWxmLl9sb2coRkFUQUwsIG1zZywgYXJncykKKworX2dsb2JhbF9sb2cgPSBMb2coKQorbG9nID0gX2dsb2JhbF9sb2cubG9nCitkZWJ1ZyA9IF9nbG9iYWxfbG9nLmRlYnVnCitpbmZvID0gX2dsb2JhbF9sb2cuaW5mbword2FybiA9IF9nbG9iYWxfbG9nLndhcm4KK2Vycm9yID0gX2dsb2JhbF9sb2cuZXJyb3IKK2ZhdGFsID0gX2dsb2JhbF9sb2cuZmF0YWwKKworZGVmIHNldF90aHJlc2hvbGQobGV2ZWwpOgorICAgICMgcmV0dXJuIHRoZSBvbGQgdGhyZXNob2xkIGZvciB1c2UgZnJvbSB0ZXN0cworICAgIG9sZCA9IF9nbG9iYWxfbG9nLnRocmVzaG9sZAorICAgIF9nbG9iYWxfbG9nLnRocmVzaG9sZCA9IGxldmVsCisgICAgcmV0dXJuIG9sZAorCitkZWYgc2V0X3ZlcmJvc2l0eSh2KToKKyAgICBpZiB2IDw9IDA6CisgICAgICAgIHNldF90aHJlc2hvbGQoV0FSTikKKyAgICBlbGlmIHYgPT0gMToKKyAgICAgICAgc2V0X3RocmVzaG9sZChJTkZPKQorICAgIGVsaWYgdiA+PSAyOgorICAgICAgICBzZXRfdGhyZXNob2xkKERFQlVHKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbG9nLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2Y2ExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbG9nLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE2Y2ExMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL2xvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Yzljb21waWxlci5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmM5Y29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjOWI5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmM5Y29tcGlsZXIucHkKQEAgLTAsMCArMSw4MDEgQEAKKyIiImRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyCisKK0NvbnRhaW5zIE1TVkNDb21waWxlciwgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGFic3RyYWN0IENDb21waWxlciBjbGFzcworZm9yIHRoZSBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDA4LgorCitUaGUgbW9kdWxlIGlzIGNvbXBhdGlibGUgd2l0aCBWUyAyMDA1IGFuZCBWUyAyMDA4LiBZb3UgY2FuIGZpbmQgbGVnYWN5IHN1cHBvcnQKK2ZvciBvbGRlciB2ZXJzaW9ucyBvZiBWUyBpbiBkaXN0dXRpbHMubXN2Y2NvbXBpbGVyLgorIiIiCisKKyMgV3JpdHRlbiBieSBQZXJyeSBTdG9sbAorIyBoYWNrZWQgYnkgUm9iaW4gQmVja2VyIGFuZCBUaG9tYXMgSGVsbGVyIHRvIGRvIGEgYmV0dGVyIGpvYiBvZgorIyAgIGZpbmRpbmcgRGV2U3R1ZGlvICh0aHJvdWdoIHRoZSByZWdpc3RyeSkKKyMgcG9ydGVkIHRvIFZTMjAwNSBhbmQgVlMgMjAwOCBieSBDaHJpc3RpYW4gSGVpbWVzCisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoRGlzdHV0aWxzRXhlY0Vycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGlsZUVycm9yLCBMaWJFcnJvciwgTGlua0Vycm9yKQorZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBDQ29tcGlsZXIsIGdlbl9saWJfb3B0aW9ucworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCisKK2ltcG9ydCBfd2lucmVnCisKK1JlZ09wZW5LZXlFeCA9IF93aW5yZWcuT3BlbktleUV4CitSZWdFbnVtS2V5ID0gX3dpbnJlZy5FbnVtS2V5CitSZWdFbnVtVmFsdWUgPSBfd2lucmVnLkVudW1WYWx1ZQorUmVnRXJyb3IgPSBfd2lucmVnLmVycm9yCisKK0hLRVlTID0gKF93aW5yZWcuSEtFWV9VU0VSUywKKyAgICAgICAgIF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCisgICAgICAgICBfd2lucmVnLkhLRVlfTE9DQUxfTUFDSElORSwKKyAgICAgICAgIF93aW5yZWcuSEtFWV9DTEFTU0VTX1JPT1QpCisKK05BVElWRV9XSU42NCA9IChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgc3lzLm1heHNpemUgPiAyKiozMikKK2lmIE5BVElWRV9XSU42NDoKKyAgICAjIFZpc3VhbCBDKysgaXMgYSAzMi1iaXQgYXBwbGljYXRpb24sIHNvIHdlIG5lZWQgdG8gbG9vayBpbgorICAgICMgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0cnkgYnJhbmNoLCBpZiB3ZSdyZSBydW5uaW5nIGEKKyAgICAjIDY0LWJpdCBQeXRob24gb24gV2luNjQKKyAgICBWU19CQVNFID0gciJTb2Z0d2FyZVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcVmlzdWFsU3R1ZGlvXCUwLjFmIgorICAgIFZTRVhQUkVTU19CQVNFID0gciJTb2Z0d2FyZVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcVkNFeHByZXNzXCUwLjFmIgorICAgIFdJTlNES19CQVNFID0gciJTb2Z0d2FyZVxXb3c2NDMyTm9kZVxNaWNyb3NvZnRcTWljcm9zb2Z0IFNES3NcV2luZG93cyIKKyAgICBORVRfQkFTRSA9IHIiU29mdHdhcmVcV293NjQzMk5vZGVcTWljcm9zb2Z0XC5ORVRGcmFtZXdvcmsiCitlbHNlOgorICAgIFZTX0JBU0UgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cJTAuMWYiCisgICAgVlNFWFBSRVNTX0JBU0UgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxWQ0V4cHJlc3NcJTAuMWYiCisgICAgV0lOU0RLX0JBU0UgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxNaWNyb3NvZnQgU0RLc1xXaW5kb3dzIgorICAgIE5FVF9CQVNFID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcLk5FVEZyYW1ld29yayIKKworIyBBIG1hcCBrZXllZCBieSBnZXRfcGxhdGZvcm0oKSByZXR1cm4gdmFsdWVzIHRvIHZhbHVlcyBhY2NlcHRlZCBieQorIyAndmN2YXJzYWxsLmJhdCcuICBOb3RlIGEgY3Jvc3MtY29tcGlsZSBtYXkgY29tYmluZSB0aGVzZSAoZWcsICd4ODZfYW1kNjQnIGlzCisjIHRoZSBwYXJhbSB0byBjcm9zcy1jb21waWxlIG9uIHg4NiB0YXJnZXR0aW5nIGFtZDY0LikKK1BMQVRfVE9fVkNWQVJTID0geworICAgICd3aW4zMicgOiAneDg2JywKKyAgICAnd2luLWFtZDY0JyA6ICdhbWQ2NCcsCisgICAgJ3dpbi1pYTY0JyA6ICdpYTY0JywKK30KKworY2xhc3MgUmVnOgorICAgICIiIkhlbHBlciBjbGFzcyB0byByZWFkIHZhbHVlcyBmcm9tIHRoZSByZWdpc3RyeQorICAgICIiIgorCisgICAgZGVmIGdldF92YWx1ZShjbHMsIHBhdGgsIGtleSk6CisgICAgICAgIGZvciBiYXNlIGluIEhLRVlTOgorICAgICAgICAgICAgZCA9IGNscy5yZWFkX3ZhbHVlcyhiYXNlLCBwYXRoKQorICAgICAgICAgICAgaWYgZCBhbmQga2V5IGluIGQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRba2V5XQorICAgICAgICByYWlzZSBLZXlFcnJvcihrZXkpCisgICAgZ2V0X3ZhbHVlID0gY2xhc3NtZXRob2QoZ2V0X3ZhbHVlKQorCisgICAgZGVmIHJlYWRfa2V5cyhjbHMsIGJhc2UsIGtleSk6CisgICAgICAgICIiIlJldHVybiBsaXN0IG9mIHJlZ2lzdHJ5IGtleXMuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhhbmRsZSA9IFJlZ09wZW5LZXlFeChiYXNlLCBrZXkpCisgICAgICAgIGV4Y2VwdCBSZWdFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIEwgPSBbXQorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGsgPSBSZWdFbnVtS2V5KGhhbmRsZSwgaSkKKyAgICAgICAgICAgIGV4Y2VwdCBSZWdFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgTC5hcHBlbmQoaykKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICByZXR1cm4gTAorICAgIHJlYWRfa2V5cyA9IGNsYXNzbWV0aG9kKHJlYWRfa2V5cykKKworICAgIGRlZiByZWFkX3ZhbHVlcyhjbHMsIGJhc2UsIGtleSk6CisgICAgICAgICIiIlJldHVybiBkaWN0IG9mIHJlZ2lzdHJ5IGtleXMgYW5kIHZhbHVlcy4KKworICAgICAgICBBbGwgbmFtZXMgYXJlIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYW5kbGUgPSBSZWdPcGVuS2V5RXgoYmFzZSwga2V5KQorICAgICAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBkID0ge30KKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuYW1lLCB2YWx1ZSwgdHlwZSA9IFJlZ0VudW1WYWx1ZShoYW5kbGUsIGkpCisgICAgICAgICAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgICAgIGRbY2xzLmNvbnZlcnRfbWJjcyhuYW1lKV0gPSBjbHMuY29udmVydF9tYmNzKHZhbHVlKQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgIHJldHVybiBkCisgICAgcmVhZF92YWx1ZXMgPSBjbGFzc21ldGhvZChyZWFkX3ZhbHVlcykKKworICAgIGRlZiBjb252ZXJ0X21iY3Mocyk6CisgICAgICAgIGRlYyA9IGdldGF0dHIocywgImRlY29kZSIsIE5vbmUpCisgICAgICAgIGlmIGRlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzID0gZGVjKCJtYmNzIikKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gcworICAgIGNvbnZlcnRfbWJjcyA9IHN0YXRpY21ldGhvZChjb252ZXJ0X21iY3MpCisKK2NsYXNzIE1hY3JvRXhwYW5kZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CisgICAgICAgIHNlbGYubWFjcm9zID0ge30KKyAgICAgICAgc2VsZi52c2Jhc2UgPSBWU19CQVNFICUgdmVyc2lvbgorICAgICAgICBzZWxmLmxvYWRfbWFjcm9zKHZlcnNpb24pCisKKyAgICBkZWYgc2V0X21hY3JvKHNlbGYsIG1hY3JvLCBwYXRoLCBrZXkpOgorICAgICAgICBzZWxmLm1hY3Jvc1siJCglcykiICUgbWFjcm9dID0gUmVnLmdldF92YWx1ZShwYXRoLCBrZXkpCisKKyAgICBkZWYgbG9hZF9tYWNyb3Moc2VsZiwgdmVyc2lvbik6CisgICAgICAgIHNlbGYuc2V0X21hY3JvKCJWQ0luc3RhbGxEaXIiLCBzZWxmLnZzYmFzZSArIHIiXFNldHVwXFZDIiwgInByb2R1Y3RkaXIiKQorICAgICAgICBzZWxmLnNldF9tYWNybygiVlNJbnN0YWxsRGlyIiwgc2VsZi52c2Jhc2UgKyByIlxTZXR1cFxWUyIsICJwcm9kdWN0ZGlyIikKKyAgICAgICAgc2VsZi5zZXRfbWFjcm8oIkZyYW1ld29ya0RpciIsIE5FVF9CQVNFLCAiaW5zdGFsbHJvb3QiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB2ZXJzaW9uID49IDguMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9tYWNybygiRnJhbWV3b3JrU0RLRGlyIiwgTkVUX0JBU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNka2luc3RhbGxyb290djIuMCIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJzZGtpbnN0YWxscm9vdHYyLjAiKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAorICAgICAgICAgICAgIiIiUHl0aG9uIHdhcyBidWlsdCB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwODsKK2V4dGVuc2lvbnMgbXVzdCBiZSBidWlsdCB3aXRoIGEgY29tcGlsZXIgdGhhbiBjYW4gZ2VuZXJhdGUgY29tcGF0aWJsZSBiaW5hcmllcy4KK1Zpc3VhbCBTdHVkaW8gMjAwOCB3YXMgbm90IGZvdW5kIG9uIHRoaXMgc3lzdGVtLiBJZiB5b3UgaGF2ZSBDeWd3aW4gaW5zdGFsbGVkLAoreW91IGNhbiB0cnkgY29tcGlsaW5nIHdpdGggTWluZ1czMiwgYnkgcGFzc2luZyAiLWMgbWluZ3czMiIgdG8gc2V0dXAucHkuIiIiKQorCisgICAgICAgIGlmIHZlcnNpb24gPj0gOS4wOgorICAgICAgICAgICAgc2VsZi5zZXRfbWFjcm8oIkZyYW1ld29ya1ZlcnNpb24iLCBzZWxmLnZzYmFzZSwgImNsciB2ZXJzaW9uIikKKyAgICAgICAgICAgIHNlbGYuc2V0X21hY3JvKCJXaW5kb3dzU2RrRGlyIiwgV0lOU0RLX0JBU0UsICJjdXJyZW50aW5zdGFsbGZvbGRlciIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcTkVUIEZyYW1ld29yayBTZXR1cFxQcm9kdWN0IgorICAgICAgICAgICAgZm9yIGJhc2UgaW4gSEtFWVM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBoID0gUmVnT3BlbktleUV4KGJhc2UsIHApCisgICAgICAgICAgICAgICAgZXhjZXB0IFJlZ0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGtleSA9IFJlZ0VudW1LZXkoaCwgMCkKKyAgICAgICAgICAgICAgICBkID0gUmVnLmdldF92YWx1ZShiYXNlLCByIiVzXCVzIiAlIChwLCBrZXkpKQorICAgICAgICAgICAgICAgIHNlbGYubWFjcm9zWyIkKEZyYW1ld29ya1ZlcnNpb24pIl0gPSBkWyJ2ZXJzaW9uIl0KKworICAgIGRlZiBzdWIoc2VsZiwgcyk6CisgICAgICAgIGZvciBrLCB2IGluIHNlbGYubWFjcm9zLml0ZW1zKCk6CisgICAgICAgICAgICBzID0gcy5yZXBsYWNlKGssIHYpCisgICAgICAgIHJldHVybiBzCisKK2RlZiBnZXRfYnVpbGRfdmVyc2lvbigpOgorICAgICIiIlJldHVybiB0aGUgdmVyc2lvbiBvZiBNU1ZDIHRoYXQgd2FzIHVzZWQgdG8gYnVpbGQgUHl0aG9uLgorCisgICAgRm9yIFB5dGhvbiAyLjMgYW5kIHVwLCB0aGUgdmVyc2lvbiBudW1iZXIgaXMgaW5jbHVkZWQgaW4KKyAgICBzeXMudmVyc2lvbi4gIEZvciBlYXJsaWVyIHZlcnNpb25zLCBhc3N1bWUgdGhlIGNvbXBpbGVyIGlzIE1TVkMgNi4KKyAgICAiIiIKKyAgICBwcmVmaXggPSAiTVNDIHYuIgorICAgIGkgPSBzeXMudmVyc2lvbi5maW5kKHByZWZpeCkKKyAgICBpZiBpID09IC0xOgorICAgICAgICByZXR1cm4gNgorICAgIGkgPSBpICsgbGVuKHByZWZpeCkKKyAgICBzLCByZXN0ID0gc3lzLnZlcnNpb25baTpdLnNwbGl0KCIgIiwgMSkKKyAgICBtYWpvclZlcnNpb24gPSBpbnQoc1s6LTJdKSAtIDYKKyAgICBtaW5vclZlcnNpb24gPSBpbnQoc1syOjNdKSAvIDEwLjAKKyAgICAjIEkgZG9uJ3QgdGhpbmsgcGF0aHMgYXJlIGFmZmVjdGVkIGJ5IG1pbm9yIHZlcnNpb24gaW4gdmVyc2lvbiA2CisgICAgaWYgbWFqb3JWZXJzaW9uID09IDY6CisgICAgICAgIG1pbm9yVmVyc2lvbiA9IDAKKyAgICBpZiBtYWpvclZlcnNpb24gPj0gNjoKKyAgICAgICAgcmV0dXJuIG1ham9yVmVyc2lvbiArIG1pbm9yVmVyc2lvbgorICAgICMgZWxzZSB3ZSBkb24ndCBrbm93IHdoYXQgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgdGhpcyBpcworICAgIHJldHVybiBOb25lCisKK2RlZiBub3JtYWxpemVfYW5kX3JlZHVjZV9wYXRocyhwYXRocyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBub3JtYWxpemVkIHBhdGhzIHdpdGggZHVwbGljYXRlcyByZW1vdmVkLgorCisgICAgVGhlIGN1cnJlbnQgb3JkZXIgb2YgcGF0aHMgaXMgbWFpbnRhaW5lZC4KKyAgICAiIiIKKyAgICAjIFBhdGhzIGFyZSBub3JtYWxpemVkIHNvIHRoaW5ncyBsaWtlOiAgL2EgYW5kIC9hLyBhcmVuJ3QgYm90aCBwcmVzZXJ2ZWQuCisgICAgcmVkdWNlZF9wYXRocyA9IFtdCisgICAgZm9yIHAgaW4gcGF0aHM6CisgICAgICAgIG5wID0gb3MucGF0aC5ub3JtcGF0aChwKQorICAgICAgICAjIFhYWChubm9yd2l0eik6IE8obioqMiksIGlmIHJlZHVjZWRfcGF0aHMgZ2V0cyBsb25nIHBlcmhhcHMgdXNlIGEgc2V0LgorICAgICAgICBpZiBucCBub3QgaW4gcmVkdWNlZF9wYXRoczoKKyAgICAgICAgICAgIHJlZHVjZWRfcGF0aHMuYXBwZW5kKG5wKQorICAgIHJldHVybiByZWR1Y2VkX3BhdGhzCisKK2RlZiByZW1vdmVEdXBsaWNhdGVzKHZhcmlhYmxlKToKKyAgICAiIiJSZW1vdmUgZHVwbGljYXRlIHZhbHVlcyBvZiBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgICAiIiIKKyAgICBvbGRMaXN0ID0gdmFyaWFibGUuc3BsaXQob3MucGF0aHNlcCkKKyAgICBuZXdMaXN0ID0gW10KKyAgICBmb3IgaSBpbiBvbGRMaXN0OgorICAgICAgICBpZiBpIG5vdCBpbiBuZXdMaXN0OgorICAgICAgICAgICAgbmV3TGlzdC5hcHBlbmQoaSkKKyAgICBuZXdWYXJpYWJsZSA9IG9zLnBhdGhzZXAuam9pbihuZXdMaXN0KQorICAgIHJldHVybiBuZXdWYXJpYWJsZQorCitkZWYgZmluZF92Y3ZhcnNhbGwodmVyc2lvbik6CisgICAgIiIiRmluZCB0aGUgdmN2YXJzYWxsLmJhdCBmaWxlCisKKyAgICBBdCBmaXJzdCBpdCB0cmllcyB0byBmaW5kIHRoZSBwcm9kdWN0ZGlyIG9mIFZTIDIwMDggaW4gdGhlIHJlZ2lzdHJ5LiBJZgorICAgIHRoYXQgZmFpbHMgaXQgZmFsbHMgYmFjayB0byB0aGUgVlM5MENPTU5UT09MUyBlbnYgdmFyLgorICAgICIiIgorICAgIHZzYmFzZSA9IFZTX0JBU0UgJSB2ZXJzaW9uCisgICAgdHJ5OgorICAgICAgICBwcm9kdWN0ZGlyID0gUmVnLmdldF92YWx1ZShyIiVzXFNldHVwXFZDIiAlIHZzYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y3RkaXIiKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcHJvZHVjdGRpciA9IE5vbmUKKworICAgICMgdHJ5aW5nIEV4cHJlc3MgZWRpdGlvbgorICAgIGlmIHByb2R1Y3RkaXIgaXMgTm9uZToKKyAgICAgICAgdnNiYXNlID0gVlNFWFBSRVNTX0JBU0UgJSB2ZXJzaW9uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb2R1Y3RkaXIgPSBSZWcuZ2V0X3ZhbHVlKHIiJXNcU2V0dXBcVkMiICUgdnNiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb2R1Y3RkaXIiKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcm9kdWN0ZGlyID0gTm9uZQorICAgICAgICAgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZmluZCBwcm9kdWN0ZGlyIGluIHJlZ2lzdHJ5IikKKworICAgIGlmIG5vdCBwcm9kdWN0ZGlyIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHByb2R1Y3RkaXIpOgorICAgICAgICB0b29sc2tleSA9ICJWUyUwLmYwQ09NTlRPT0xTIiAlIHZlcnNpb24KKyAgICAgICAgdG9vbHNkaXIgPSBvcy5lbnZpcm9uLmdldCh0b29sc2tleSwgTm9uZSkKKworICAgICAgICBpZiB0b29sc2RpciBhbmQgb3MucGF0aC5pc2Rpcih0b29sc2Rpcik6CisgICAgICAgICAgICBwcm9kdWN0ZGlyID0gb3MucGF0aC5qb2luKHRvb2xzZGlyLCBvcy5wYXJkaXIsIG9zLnBhcmRpciwgIlZDIikKKyAgICAgICAgICAgIHByb2R1Y3RkaXIgPSBvcy5wYXRoLmFic3BhdGgocHJvZHVjdGRpcikKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHByb2R1Y3RkaXIpOgorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiJXMgaXMgbm90IGEgdmFsaWQgZGlyZWN0b3J5IiAlIHByb2R1Y3RkaXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW52IHZhciAlcyBpcyBub3Qgc2V0IG9yIGludmFsaWQiICUgdG9vbHNrZXkpCisgICAgaWYgbm90IHByb2R1Y3RkaXI6CisgICAgICAgIGxvZy5kZWJ1ZygiTm8gcHJvZHVjdGRpciBmb3VuZCIpCisgICAgICAgIHJldHVybiBOb25lCisgICAgdmN2YXJzYWxsID0gb3MucGF0aC5qb2luKHByb2R1Y3RkaXIsICJ2Y3ZhcnNhbGwuYmF0IikKKyAgICBpZiBvcy5wYXRoLmlzZmlsZSh2Y3ZhcnNhbGwpOgorICAgICAgICByZXR1cm4gdmN2YXJzYWxsCisgICAgbG9nLmRlYnVnKCJVbmFibGUgdG8gZmluZCB2Y3ZhcnNhbGwuYmF0IikKKyAgICByZXR1cm4gTm9uZQorCitkZWYgcXVlcnlfdmN2YXJzYWxsKHZlcnNpb24sIGFyY2g9Ing4NiIpOgorICAgICIiIkxhdW5jaCB2Y3ZhcnNhbGwuYmF0IGFuZCByZWFkIHRoZSBzZXR0aW5ncyBmcm9tIGl0cyBlbnZpcm9ubWVudAorICAgICIiIgorICAgIHZjdmFyc2FsbCA9IGZpbmRfdmN2YXJzYWxsKHZlcnNpb24pCisgICAgaW50ZXJlc3RpbmcgPSBzZXQoKCJpbmNsdWRlIiwgImxpYiIsICJsaWJwYXRoIiwgInBhdGgiKSkKKyAgICByZXN1bHQgPSB7fQorCisgICAgaWYgdmN2YXJzYWxsIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoIlVuYWJsZSB0byBmaW5kIHZjdmFyc2FsbC5iYXQiKQorICAgIGxvZy5kZWJ1ZygiQ2FsbGluZyAndmN2YXJzYWxsLmJhdCAlcycgKHZlcnNpb249JXMpIiwgYXJjaCwgdmVyc2lvbikKKyAgICBwb3BlbiA9IHN1YnByb2Nlc3MuUG9wZW4oJyIlcyIgJXMgJiBzZXQnICUgKHZjdmFyc2FsbCwgYXJjaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgdHJ5OgorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHBvcGVuLmNvbW11bmljYXRlKCkKKyAgICAgICAgaWYgcG9wZW4ud2FpdCgpICE9IDA6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKHN0ZGVyci5kZWNvZGUoIm1iY3MiKSkKKworICAgICAgICBzdGRvdXQgPSBzdGRvdXQuZGVjb2RlKCJtYmNzIikKKyAgICAgICAgZm9yIGxpbmUgaW4gc3Rkb3V0LnNwbGl0KCJcbiIpOgorICAgICAgICAgICAgbGluZSA9IFJlZy5jb252ZXJ0X21iY3MobGluZSkKKyAgICAgICAgICAgIGlmICc9JyBub3QgaW4gbGluZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoJz0nLCAxKQorICAgICAgICAgICAga2V5ID0ga2V5Lmxvd2VyKCkKKyAgICAgICAgICAgIGlmIGtleSBpbiBpbnRlcmVzdGluZzoKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZS5lbmRzd2l0aChvcy5wYXRoc2VwKToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVs6LTFdCisgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSByZW1vdmVEdXBsaWNhdGVzKHZhbHVlKQorCisgICAgZmluYWxseToKKyAgICAgICAgcG9wZW4uc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgcG9wZW4uc3RkZXJyLmNsb3NlKCkKKworICAgIGlmIGxlbihyZXN1bHQpICE9IGxlbihpbnRlcmVzdGluZyk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3Ioc3RyKGxpc3QocmVzdWx0LmtleXMoKSkpKQorCisgICAgcmV0dXJuIHJlc3VsdAorCisjIE1vcmUgZ2xvYmFscworVkVSU0lPTiA9IGdldF9idWlsZF92ZXJzaW9uKCkKK2lmIFZFUlNJT04gPCA4LjA6CisgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigiVkMgJTAuMWYgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG1vZHVsZSIgJSBWRVJTSU9OKQorIyBNQUNST1MgPSBNYWNyb0V4cGFuZGVyKFZFUlNJT04pCisKK2NsYXNzIE1TVkNDb21waWxlcihDQ29tcGlsZXIpIDoKKyAgICAiIiJDb25jcmV0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgYW4gaW50ZXJmYWNlIHRvIE1pY3Jvc29mdCBWaXN1YWwgQysrLAorICAgICAgIGFzIGRlZmluZWQgYnkgdGhlIENDb21waWxlciBhYnN0cmFjdCBjbGFzcy4iIiIKKworICAgIGNvbXBpbGVyX3R5cGUgPSAnbXN2YycKKworICAgICMgSnVzdCBzZXQgdGhpcyBzbyBDQ29tcGlsZXIncyBjb25zdHJ1Y3RvciBkb2Vzbid0IGJhcmYuICBXZSBjdXJyZW50bHkKKyAgICAjIGRvbid0IHVzZSB0aGUgJ3NldF9leGVjdXRhYmxlcygpJyBidXJlYXVjcmFjeSBwcm92aWRlZCBieSBDQ29tcGlsZXIsCisgICAgIyBhcyBpdCByZWFsbHkgaXNuJ3QgbmVjZXNzYXJ5IGZvciB0aGlzIHNvcnQgb2Ygc2luZ2xlLWNvbXBpbGVyIGNsYXNzLgorICAgICMgV291bGQgYmUgbmljZSB0byBoYXZlIGEgY29uc2lzdGVudCBpbnRlcmZhY2Ugd2l0aCBVbml4Q0NvbXBpbGVyLAorICAgICMgdGhvdWdoLCBzbyBpdCdzIHdvcnRoIHRoaW5raW5nIGFib3V0LgorICAgIGV4ZWN1dGFibGVzID0ge30KKworICAgICMgUHJpdmF0ZSBjbGFzcyBkYXRhIChuZWVkIHRvIGRpc3Rpbmd1aXNoIEMgZnJvbSBDKysgc291cmNlIGZvciBjb21waWxlcikKKyAgICBfY19leHRlbnNpb25zID0gWycuYyddCisgICAgX2NwcF9leHRlbnNpb25zID0gWycuY2MnLCAnLmNwcCcsICcuY3h4J10KKyAgICBfcmNfZXh0ZW5zaW9ucyA9IFsnLnJjJ10KKyAgICBfbWNfZXh0ZW5zaW9ucyA9IFsnLm1jJ10KKworICAgICMgTmVlZGVkIGZvciB0aGUgZmlsZW5hbWUgZ2VuZXJhdGlvbiBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZQorICAgICMgYmFzZSBjbGFzcywgQ0NvbXBpbGVyLgorICAgIHNyY19leHRlbnNpb25zID0gKF9jX2V4dGVuc2lvbnMgKyBfY3BwX2V4dGVuc2lvbnMgKworICAgICAgICAgICAgICAgICAgICAgIF9yY19leHRlbnNpb25zICsgX21jX2V4dGVuc2lvbnMpCisgICAgcmVzX2V4dGVuc2lvbiA9ICcucmVzJworICAgIG9ial9leHRlbnNpb24gPSAnLm9iaicKKyAgICBzdGF0aWNfbGliX2V4dGVuc2lvbiA9ICcubGliJworICAgIHNoYXJlZF9saWJfZXh0ZW5zaW9uID0gJy5kbGwnCisgICAgc3RhdGljX2xpYl9mb3JtYXQgPSBzaGFyZWRfbGliX2Zvcm1hdCA9ICclcyVzJworICAgIGV4ZV9leHRlbnNpb24gPSAnLmV4ZScKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgZm9yY2U9MCk6CisgICAgICAgIENDb21waWxlci5fX2luaXRfXyAoc2VsZiwgdmVyYm9zZSwgZHJ5X3J1biwgZm9yY2UpCisgICAgICAgIHNlbGYuX192ZXJzaW9uID0gVkVSU0lPTgorICAgICAgICBzZWxmLl9fcm9vdCA9IHIiU29mdHdhcmVcTWljcm9zb2Z0XFZpc3VhbFN0dWRpbyIKKyAgICAgICAgIyBzZWxmLl9fbWFjcm9zID0gTUFDUk9TCisgICAgICAgIHNlbGYuX19wYXRocyA9IFtdCisgICAgICAgICMgdGFyZ2V0IHBsYXRmb3JtICgucGxhdF9uYW1lIGlzIGNvbnNpc3RlbnQgd2l0aCAnYmRpc3QnKQorICAgICAgICBzZWxmLnBsYXRfbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX2FyY2ggPSBOb25lICMgZGVwcmVjYXRlZCBuYW1lCisgICAgICAgIHNlbGYuaW5pdGlhbGl6ZWQgPSBGYWxzZQorCisgICAgZGVmIGluaXRpYWxpemUoc2VsZiwgcGxhdF9uYW1lPU5vbmUpOgorICAgICAgICAjIG11bHRpLWluaXQgbWVhbnMgd2Ugd291bGQgbmVlZCB0byBjaGVjayBwbGF0Zm9ybSBzYW1lIGVhY2ggdGltZS4uLgorICAgICAgICBhc3NlcnQgbm90IHNlbGYuaW5pdGlhbGl6ZWQsICJkb24ndCBpbml0IG11bHRpcGxlIHRpbWVzIgorICAgICAgICBpZiBwbGF0X25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIHBsYXRfbmFtZSA9IGdldF9wbGF0Zm9ybSgpCisgICAgICAgICMgc2FuaXR5IGNoZWNrIGZvciBwbGF0Zm9ybXMgdG8gcHJldmVudCBvYnNjdXJlIGVycm9ycyBsYXRlci4KKyAgICAgICAgb2tfcGxhdHMgPSAnd2luMzInLCAnd2luLWFtZDY0JywgJ3dpbi1pYTY0JworICAgICAgICBpZiBwbGF0X25hbWUgbm90IGluIG9rX3BsYXRzOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigiLS1wbGF0LW5hbWUgbXVzdCBiZSBvbmUgb2YgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9rX3BsYXRzLCkpCisKKyAgICAgICAgaWYgIkRJU1RVVElMU19VU0VfU0RLIiBpbiBvcy5lbnZpcm9uIGFuZCAiTVNTZGsiIGluIG9zLmVudmlyb24gYW5kIHNlbGYuZmluZF9leGUoImNsLmV4ZSIpOgorICAgICAgICAgICAgIyBBc3N1bWUgdGhhdCB0aGUgU0RLIHNldCB1cCBldmVyeXRoaW5nIGFscmlnaHQ7IGRvbid0IHRyeSB0byBiZQorICAgICAgICAgICAgIyBzbWFydGVyCisgICAgICAgICAgICBzZWxmLmNjID0gImNsLmV4ZSIKKyAgICAgICAgICAgIHNlbGYubGlua2VyID0gImxpbmsuZXhlIgorICAgICAgICAgICAgc2VsZi5saWIgPSAibGliLmV4ZSIKKyAgICAgICAgICAgIHNlbGYucmMgPSAicmMuZXhlIgorICAgICAgICAgICAgc2VsZi5tYyA9ICJtYy5leGUiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE9uIHg4NiwgJ3ZjdmFyczMyLmJhdCBhbWQ2NCcgY3JlYXRlcyBhbiBlbnYgdGhhdCBkb2Vzbid0IHdvcms7CisgICAgICAgICAgICAjIHRvIGNyb3NzIGNvbXBpbGUsIHlvdSB1c2UgJ3g4Nl9hbWQ2NCcuCisgICAgICAgICAgICAjIE9uIEFNRDY0LCAndmN2YXJzMzIuYmF0IGFtZDY0JyBpcyBhIG5hdGl2ZSBidWlsZCBlbnY7IHRvIGNyb3NzCisgICAgICAgICAgICAjIGNvbXBpbGUgdXNlICd4ODYnIChpZSwgaXQgcnVucyB0aGUgeDg2IGNvbXBpbGVyIGRpcmVjdGx5KQorICAgICAgICAgICAgIyBObyBpZGVhIGhvdyBpdGFuaXVtIGhhbmRsZXMgdGhpcywgaWYgYXQgYWxsLgorICAgICAgICAgICAgaWYgcGxhdF9uYW1lID09IGdldF9wbGF0Zm9ybSgpIG9yIHBsYXRfbmFtZSA9PSAnd2luMzInOgorICAgICAgICAgICAgICAgICMgbmF0aXZlIGJ1aWxkIG9yIGNyb3NzLWNvbXBpbGUgdG8gd2luMzIKKyAgICAgICAgICAgICAgICBwbGF0X3NwZWMgPSBQTEFUX1RPX1ZDVkFSU1twbGF0X25hbWVdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgY3Jvc3MgY29tcGlsZSBmcm9tIHdpbjMyIC0+IHNvbWUgNjRiaXQKKyAgICAgICAgICAgICAgICBwbGF0X3NwZWMgPSBQTEFUX1RPX1ZDVkFSU1tnZXRfcGxhdGZvcm0oKV0gKyAnXycgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExBVF9UT19WQ1ZBUlNbcGxhdF9uYW1lXQorCisgICAgICAgICAgICB2Y19lbnYgPSBxdWVyeV92Y3ZhcnNhbGwoVkVSU0lPTiwgcGxhdF9zcGVjKQorCisgICAgICAgICAgICAjIHRha2UgY2FyZSB0byBvbmx5IHVzZSBzdHJpbmdzIGluIHRoZSBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgIHNlbGYuX19wYXRocyA9IHZjX2VudlsncGF0aCddLmVuY29kZSgnbWJjcycpLnNwbGl0KG9zLnBhdGhzZXApCisgICAgICAgICAgICBvcy5lbnZpcm9uWydsaWInXSA9IHZjX2VudlsnbGliJ10uZW5jb2RlKCdtYmNzJykKKyAgICAgICAgICAgIG9zLmVudmlyb25bJ2luY2x1ZGUnXSA9IHZjX2VudlsnaW5jbHVkZSddLmVuY29kZSgnbWJjcycpCisKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl9fcGF0aHMpID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigiUHl0aG9uIHdhcyBidWlsdCB3aXRoICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbmQgZXh0ZW5zaW9ucyBuZWVkIHRvIGJlIGJ1aWx0IHdpdGggdGhlIHNhbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBvZiB0aGUgY29tcGlsZXIsIGJ1dCBpdCBpc24ndCBpbnN0YWxsZWQuIgorICAgICAgICAgICAgICAgICAgICAgICAlIHNlbGYuX19wcm9kdWN0KQorCisgICAgICAgICAgICBzZWxmLmNjID0gc2VsZi5maW5kX2V4ZSgiY2wuZXhlIikKKyAgICAgICAgICAgIHNlbGYubGlua2VyID0gc2VsZi5maW5kX2V4ZSgibGluay5leGUiKQorICAgICAgICAgICAgc2VsZi5saWIgPSBzZWxmLmZpbmRfZXhlKCJsaWIuZXhlIikKKyAgICAgICAgICAgIHNlbGYucmMgPSBzZWxmLmZpbmRfZXhlKCJyYy5leGUiKSAgICMgcmVzb3VyY2UgY29tcGlsZXIKKyAgICAgICAgICAgIHNlbGYubWMgPSBzZWxmLmZpbmRfZXhlKCJtYy5leGUiKSAgICMgbWVzc2FnZSBjb21waWxlcgorICAgICAgICAgICAgI3NlbGYuc2V0X3BhdGhfZW52X3ZhcignbGliJykKKyAgICAgICAgICAgICNzZWxmLnNldF9wYXRoX2Vudl92YXIoJ2luY2x1ZGUnKQorCisgICAgICAgICMgZXh0ZW5kIHRoZSBNU1ZDIHBhdGggd2l0aCB0aGUgY3VycmVudCBwYXRoCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBwIGluIG9zLmVudmlyb25bJ3BhdGgnXS5zcGxpdCgnOycpOgorICAgICAgICAgICAgICAgIHNlbGYuX19wYXRocy5hcHBlbmQocCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9fcGF0aHMgPSBub3JtYWxpemVfYW5kX3JlZHVjZV9wYXRocyhzZWxmLl9fcGF0aHMpCisgICAgICAgIG9zLmVudmlyb25bJ3BhdGgnXSA9ICI7Ii5qb2luKHNlbGYuX19wYXRocykKKworICAgICAgICBzZWxmLnByZXByb2Nlc3Nfb3B0aW9ucyA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5fX2FyY2ggPT0gIng4NiI6CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVfb3B0aW9ucyA9IFsgJy9ub2xvZ28nLCAnL094JywgJy9NRCcsICcvVzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRE5ERUJVRyddCisgICAgICAgICAgICBzZWxmLmNvbXBpbGVfb3B0aW9uc19kZWJ1ZyA9IFsnL25vbG9nbycsICcvT2QnLCAnL01EZCcsICcvVzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9aNycsICcvRF9ERUJVRyddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdpbjY0CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVfb3B0aW9ucyA9IFsgJy9ub2xvZ28nLCAnL094JywgJy9NRCcsICcvVzMnLCAnL0dTLScgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRE5ERUJVRyddCisgICAgICAgICAgICBzZWxmLmNvbXBpbGVfb3B0aW9uc19kZWJ1ZyA9IFsnL25vbG9nbycsICcvT2QnLCAnL01EZCcsICcvVzMnLCAnL0dTLScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL1o3JywgJy9EX0RFQlVHJ10KKworICAgICAgICBzZWxmLmxkZmxhZ3Nfc2hhcmVkID0gWycvRExMJywgJy9ub2xvZ28nLCAnL0lOQ1JFTUVOVEFMOk5PJ10KKyAgICAgICAgaWYgc2VsZi5fX3ZlcnNpb24gPj0gNzoKKyAgICAgICAgICAgIHNlbGYubGRmbGFnc19zaGFyZWRfZGVidWcgPSBbCisgICAgICAgICAgICAgICAgJy9ETEwnLCAnL25vbG9nbycsICcvSU5DUkVNRU5UQUw6bm8nLCAnL0RFQlVHJywgJy9wZGI6Tm9uZScKKyAgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYubGRmbGFnc19zdGF0aWMgPSBbICcvbm9sb2dvJ10KKworICAgICAgICBzZWxmLmluaXRpYWxpemVkID0gVHJ1ZQorCisgICAgIyAtLSBXb3JrZXIgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBvYmplY3RfZmlsZW5hbWVzKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2ZpbGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcF9kaXI9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPScnKToKKyAgICAgICAgIyBDb3BpZWQgZnJvbSBjY29tcGlsZXIucHksIGV4dGVuZGVkIHRvIHJldHVybiAucmVzIGFzICdvYmplY3QnLWZpbGUKKyAgICAgICAgIyBmb3IgLnJjIGlucHV0IGZpbGUKKyAgICAgICAgaWYgb3V0cHV0X2RpciBpcyBOb25lOiBvdXRwdXRfZGlyID0gJycKKyAgICAgICAgb2JqX25hbWVzID0gW10KKyAgICAgICAgZm9yIHNyY19uYW1lIGluIHNvdXJjZV9maWxlbmFtZXM6CisgICAgICAgICAgICAoYmFzZSwgZXh0KSA9IG9zLnBhdGguc3BsaXRleHQgKHNyY19uYW1lKQorICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguc3BsaXRkcml2ZShiYXNlKVsxXSAjIENob3Agb2ZmIHRoZSBkcml2ZQorICAgICAgICAgICAgYmFzZSA9IGJhc2Vbb3MucGF0aC5pc2FicyhiYXNlKTpdICAjIElmIGFicywgY2hvcCBvZmYgbGVhZGluZyAvCisgICAgICAgICAgICBpZiBleHQgbm90IGluIHNlbGYuc3JjX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgIyBCZXR0ZXIgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGluc3RlYWQgb2Ygc2lsZW50bHkgY29udGludWluZworICAgICAgICAgICAgICAgICMgYW5kIGxhdGVyIGNvbXBsYWluIGFib3V0IHNvdXJjZXMgYW5kIHRhcmdldHMgaGF2aW5nCisgICAgICAgICAgICAgICAgIyBkaWZmZXJlbnQgbGVuZ3RocworICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciAoIkRvbid0IGtub3cgaG93IHRvIGNvbXBpbGUgJXMiICUgc3JjX25hbWUpCisgICAgICAgICAgICBpZiBzdHJpcF9kaXI6CisgICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUgKGJhc2UpCisgICAgICAgICAgICBpZiBleHQgaW4gc2VsZi5fcmNfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBvYmpfbmFtZXMuYXBwZW5kIChvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5yZXNfZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIGVsaWYgZXh0IGluIHNlbGYuX21jX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHNlbGYucmVzX2V4dGVuc2lvbikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBzZWxmLm9ial9leHRlbnNpb24pKQorICAgICAgICByZXR1cm4gb2JqX25hbWVzCisKKworICAgIGRlZiBjb21waWxlKHNlbGYsIHNvdXJjZXMsCisgICAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLCBtYWNyb3M9Tm9uZSwgaW5jbHVkZV9kaXJzPU5vbmUsIGRlYnVnPTAsCisgICAgICAgICAgICAgICAgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLCBkZXBlbmRzPU5vbmUpOgorCisgICAgICAgIGlmIG5vdCBzZWxmLmluaXRpYWxpemVkOgorICAgICAgICAgICAgc2VsZi5pbml0aWFsaXplKCkKKyAgICAgICAgY29tcGlsZV9pbmZvID0gc2VsZi5fc2V0dXBfY29tcGlsZShvdXRwdXRfZGlyLCBtYWNyb3MsIGluY2x1ZGVfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLCBkZXBlbmRzLCBleHRyYV9wb3N0YXJncykKKyAgICAgICAgbWFjcm9zLCBvYmplY3RzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cywgYnVpbGQgPSBjb21waWxlX2luZm8KKworICAgICAgICBjb21waWxlX29wdHMgPSBleHRyYV9wcmVhcmdzIG9yIFtdCisgICAgICAgIGNvbXBpbGVfb3B0cy5hcHBlbmQgKCcvYycpCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgY29tcGlsZV9vcHRzLmV4dGVuZChzZWxmLmNvbXBpbGVfb3B0aW9uc19kZWJ1ZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbXBpbGVfb3B0cy5leHRlbmQoc2VsZi5jb21waWxlX29wdGlvbnMpCisKKyAgICAgICAgZm9yIG9iaiBpbiBvYmplY3RzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNyYywgZXh0ID0gYnVpbGRbb2JqXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAjIHBhc3MgdGhlIGZ1bGwgcGF0aG5hbWUgdG8gTVNWQyBpbiBkZWJ1ZyBtb2RlLAorICAgICAgICAgICAgICAgICMgdGhpcyBhbGxvd3MgdGhlIGRlYnVnZ2VyIHRvIGZpbmQgdGhlIHNvdXJjZSBmaWxlCisgICAgICAgICAgICAgICAgIyB3aXRob3V0IGFza2luZyB0aGUgdXNlciB0byBicm93c2UgZm9yIGl0CisgICAgICAgICAgICAgICAgc3JjID0gb3MucGF0aC5hYnNwYXRoKHNyYykKKworICAgICAgICAgICAgaWYgZXh0IGluIHNlbGYuX2NfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSAiL1RjIiArIHNyYworICAgICAgICAgICAgZWxpZiBleHQgaW4gc2VsZi5fY3BwX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgaW5wdXRfb3B0ID0gIi9UcCIgKyBzcmMKKyAgICAgICAgICAgIGVsaWYgZXh0IGluIHNlbGYuX3JjX2V4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgIyBjb21waWxlIC5SQyB0byAuUkVTIGZpbGUKKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSBzcmMKKyAgICAgICAgICAgICAgICBvdXRwdXRfb3B0ID0gIi9mbyIgKyBvYmoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oW3NlbGYucmNdICsgcHBfb3B0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW291dHB1dF9vcHRdICsgW2lucHV0X29wdF0pCisgICAgICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IobXNnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIGV4dCBpbiBzZWxmLl9tY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgICMgQ29tcGlsZSAuTUMgdG8gLlJDIGZpbGUgdG8gLlJFUyBmaWxlLgorICAgICAgICAgICAgICAgICMgICAqICctaCBkaXInIHNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IGZvciB0aGUKKyAgICAgICAgICAgICAgICAjICAgICBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlCisgICAgICAgICAgICAgICAgIyAgICogJy1yIGRpcicgc3BlY2lmaWVzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG9mIHRoZQorICAgICAgICAgICAgICAgICMgICAgIGdlbmVyYXRlZCBSQyBmaWxlIGFuZCB0aGUgYmluYXJ5IG1lc3NhZ2UgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAjICAgICBpdCBpbmNsdWRlcworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIEZvciBub3cgKHNpbmNlIHRoZXJlIGFyZSBubyBvcHRpb25zIHRvIGNoYW5nZSB0aGlzKSwKKyAgICAgICAgICAgICAgICAjIHdlIHVzZSB0aGUgc291cmNlLWRpcmVjdG9yeSBmb3IgdGhlIGluY2x1ZGUgZmlsZSBhbmQKKyAgICAgICAgICAgICAgICAjIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIHRoZSBSQyBmaWxlIGFuZCBtZXNzYWdlCisgICAgICAgICAgICAgICAgIyByZXNvdXJjZXMuIFRoaXMgd29ya3MgYXQgbGVhc3QgZm9yIHdpbjMyYWxsLgorICAgICAgICAgICAgICAgIGhfZGlyID0gb3MucGF0aC5kaXJuYW1lKHNyYykKKyAgICAgICAgICAgICAgICByY19kaXIgPSBvcy5wYXRoLmRpcm5hbWUob2JqKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyBmaXJzdCBjb21waWxlIC5NQyB0byAuUkMgYW5kIC5IIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihbc2VsZi5tY10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLWgnLCBoX2RpciwgJy1yJywgcmNfZGlyXSArIFtzcmNdKQorICAgICAgICAgICAgICAgICAgICBiYXNlLCBfID0gb3MucGF0aC5zcGxpdGV4dCAob3MucGF0aC5iYXNlbmFtZSAoc3JjKSkKKyAgICAgICAgICAgICAgICAgICAgcmNfZmlsZSA9IG9zLnBhdGguam9pbiAocmNfZGlyLCBiYXNlICsgJy5yYycpCisgICAgICAgICAgICAgICAgICAgICMgdGhlbiBjb21waWxlIC5SQyB0byAuUkVTIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihbc2VsZi5yY10gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiL2ZvIiArIG9ial0gKyBbcmNfZmlsZV0pCisKKyAgICAgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvcihtc2cpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBob3cgdG8gaGFuZGxlIHRoaXMgZmlsZT8KKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IoIkRvbid0IGtub3cgaG93IHRvIGNvbXBpbGUgJXMgdG8gJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNyYywgb2JqKSkKKworICAgICAgICAgICAgb3V0cHV0X29wdCA9ICIvRm8iICsgb2JqCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihbc2VsZi5jY10gKyBjb21waWxlX29wdHMgKyBwcF9vcHRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dF9vcHQsIG91dHB1dF9vcHRdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvcihtc2cpCisKKyAgICAgICAgcmV0dXJuIG9iamVjdHMKKworCisgICAgZGVmIGNyZWF0ZV9zdGF0aWNfbGliKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9saWJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgorCisgICAgICAgIGlmIG5vdCBzZWxmLmluaXRpYWxpemVkOgorICAgICAgICAgICAgc2VsZi5pbml0aWFsaXplKCkKKyAgICAgICAgKG9iamVjdHMsIG91dHB1dF9kaXIpID0gc2VsZi5fZml4X29iamVjdF9hcmdzKG9iamVjdHMsIG91dHB1dF9kaXIpCisgICAgICAgIG91dHB1dF9maWxlbmFtZSA9IHNlbGYubGlicmFyeV9maWxlbmFtZShvdXRwdXRfbGlibmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9b3V0cHV0X2RpcikKKworICAgICAgICBpZiBzZWxmLl9uZWVkX2xpbmsob2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIGxpYl9hcmdzID0gb2JqZWN0cyArIFsnL09VVDonICsgb3V0cHV0X2ZpbGVuYW1lXQorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgcGFzcyAjIFhYWCB3aGF0IGdvZXMgaGVyZT8KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNwYXduKFtzZWxmLmxpYl0gKyBsaWJfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBMaWJFcnJvcihtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2cuZGVidWcoInNraXBwaW5nICVzICh1cC10by1kYXRlKSIsIG91dHB1dF9maWxlbmFtZSkKKworCisgICAgZGVmIGxpbmsoc2VsZiwKKyAgICAgICAgICAgICB0YXJnZXRfZGVzYywKKyAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSwKKyAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgbGlicmFyaWVzPU5vbmUsCisgICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLAorICAgICAgICAgICAgIGRlYnVnPTAsCisgICAgICAgICAgICAgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCisgICAgICAgICAgICAgYnVpbGRfdGVtcD1Ob25lLAorICAgICAgICAgICAgIHRhcmdldF9sYW5nPU5vbmUpOgorCisgICAgICAgIGlmIG5vdCBzZWxmLmluaXRpYWxpemVkOgorICAgICAgICAgICAgc2VsZi5pbml0aWFsaXplKCkKKyAgICAgICAgKG9iamVjdHMsIG91dHB1dF9kaXIpID0gc2VsZi5fZml4X29iamVjdF9hcmdzKG9iamVjdHMsIG91dHB1dF9kaXIpCisgICAgICAgIGZpeGVkX2FyZ3MgPSBzZWxmLl9maXhfbGliX2FyZ3MobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZV9saWJyYXJ5X2RpcnMpCisgICAgICAgIChsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMpID0gZml4ZWRfYXJncworCisgICAgICAgIGlmIHJ1bnRpbWVfbGlicmFyeV9kaXJzOgorICAgICAgICAgICAgc2VsZi53YXJuICgiSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCAncnVudGltZV9saWJyYXJ5X2RpcnMnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICsgc3RyIChydW50aW1lX2xpYnJhcnlfZGlycykpCisKKyAgICAgICAgbGliX29wdHMgPSBnZW5fbGliX29wdGlvbnMoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9kaXJzLCBydW50aW1lX2xpYnJhcnlfZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzKQorICAgICAgICBpZiBvdXRwdXRfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKG91dHB1dF9kaXIsIG91dHB1dF9maWxlbmFtZSkKKworICAgICAgICBpZiBzZWxmLl9uZWVkX2xpbmsob2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIGlmIHRhcmdldF9kZXNjID09IENDb21waWxlci5FWEVDVVRBQkxFOgorICAgICAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBsZGZsYWdzID0gc2VsZi5sZGZsYWdzX3NoYXJlZF9kZWJ1Z1sxOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsZGZsYWdzID0gc2VsZi5sZGZsYWdzX3NoYXJlZFsxOl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgICAgIGxkZmxhZ3MgPSBzZWxmLmxkZmxhZ3Nfc2hhcmVkX2RlYnVnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGRmbGFncyA9IHNlbGYubGRmbGFnc19zaGFyZWQKKworICAgICAgICAgICAgZXhwb3J0X29wdHMgPSBbXQorICAgICAgICAgICAgZm9yIHN5bSBpbiAoZXhwb3J0X3N5bWJvbHMgb3IgW10pOgorICAgICAgICAgICAgICAgIGV4cG9ydF9vcHRzLmFwcGVuZCgiL0VYUE9SVDoiICsgc3ltKQorCisgICAgICAgICAgICBsZF9hcmdzID0gKGxkZmxhZ3MgKyBsaWJfb3B0cyArIGV4cG9ydF9vcHRzICsKKyAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0cyArIFsnL09VVDonICsgb3V0cHV0X2ZpbGVuYW1lXSkKKworICAgICAgICAgICAgIyBUaGUgTVNWQyBsaW5rZXIgZ2VuZXJhdGVzIC5saWIgYW5kIC5leHAgZmlsZXMsIHdoaWNoIGNhbm5vdCBiZQorICAgICAgICAgICAgIyBzdXBwcmVzc2VkIGJ5IGFueSBsaW5rZXIgc3dpdGNoZXMuIFRoZSAubGliIGZpbGVzIG1heSBldmVuIGJlCisgICAgICAgICAgICAjIG5lZWRlZCEgTWFrZSBzdXJlIHRoZXkgYXJlIGdlbmVyYXRlZCBpbiB0aGUgdGVtcG9yYXJ5IGJ1aWxkCisgICAgICAgICAgICAjIGRpcmVjdG9yeS4gU2luY2UgdGhleSBoYXZlIGRpZmZlcmVudCBuYW1lcyBmb3IgZGVidWcgYW5kIHJlbGVhc2UKKyAgICAgICAgICAgICMgYnVpbGRzLCB0aGV5IGNhbiBnbyBpbnRvIHRoZSBzYW1lIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIGJ1aWxkX3RlbXAgPSBvcy5wYXRoLmRpcm5hbWUob2JqZWN0c1swXSkKKyAgICAgICAgICAgIGlmIGV4cG9ydF9zeW1ib2xzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIChkbGxfbmFtZSwgZGxsX2V4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0KAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKG91dHB1dF9maWxlbmFtZSkpCisgICAgICAgICAgICAgICAgaW1wbGliX2ZpbGUgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgICAgIGJ1aWxkX3RlbXAsCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9maWxlbmFtZShkbGxfbmFtZSkpCisgICAgICAgICAgICAgICAgbGRfYXJncy5hcHBlbmQgKCcvSU1QTElCOicgKyBpbXBsaWJfZmlsZSkKKworICAgICAgICAgICAgc2VsZi5tYW5pZmVzdF9zZXR1cF9sZGFyZ3Mob3V0cHV0X2ZpbGVuYW1lLCBidWlsZF90ZW1wLCBsZF9hcmdzKQorCisgICAgICAgICAgICBpZiBleHRyYV9wcmVhcmdzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3NbOjBdID0gZXh0cmFfcHJlYXJncworICAgICAgICAgICAgaWYgZXh0cmFfcG9zdGFyZ3M6CisgICAgICAgICAgICAgICAgbGRfYXJncy5leHRlbmQoZXh0cmFfcG9zdGFyZ3MpCisKKyAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZShvdXRwdXRfZmlsZW5hbWUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24oW3NlbGYubGlua2VyXSArIGxkX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRXhlY0Vycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcmFpc2UgTGlua0Vycm9yKG1zZykKKworICAgICAgICAgICAgIyBlbWJlZCB0aGUgbWFuaWZlc3QKKyAgICAgICAgICAgICMgWFhYIC0gdGhpcyBpcyBzb21ld2hhdCBmcmFnaWxlIC0gaWYgbXQuZXhlIGZhaWxzLCBkaXN0dXRpbHMKKyAgICAgICAgICAgICMgd2lsbCBzdGlsbCBjb25zaWRlciB0aGUgRExMIHVwLXRvLWRhdGUsIGJ1dCBpdCB3aWxsIG5vdCBoYXZlIGEKKyAgICAgICAgICAgICMgbWFuaWZlc3QuICBNYXliZSB3ZSBzaG91bGQgbGluayB0byBhIHRlbXAgZmlsZT8gIE9UT0gsIHRoYXQKKyAgICAgICAgICAgICMgaW1wbGllcyBhIGJ1aWxkIGVudmlyb25tZW50IGVycm9yIHRoYXQgc2hvdWxkbid0IGdvIHVuZGV0ZWN0ZWQuCisgICAgICAgICAgICBtZmluZm8gPSBzZWxmLm1hbmlmZXN0X2dldF9lbWJlZF9pbmZvKHRhcmdldF9kZXNjLCBsZF9hcmdzKQorICAgICAgICAgICAgaWYgbWZpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG1mZmlsZW5hbWUsIG1maWQgPSBtZmluZm8KKyAgICAgICAgICAgICAgICBvdXRfYXJnID0gJy1vdXRwdXRyZXNvdXJjZTolczslcycgJSAob3V0cHV0X2ZpbGVuYW1lLCBtZmlkKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zcGF3bihbJ210LmV4ZScsICctbm9sb2dvJywgJy1tYW5pZmVzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1mZmlsZW5hbWUsIG91dF9hcmddKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTGlua0Vycm9yKG1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2tpcHBpbmcgJXMgKHVwLXRvLWRhdGUpIiwgb3V0cHV0X2ZpbGVuYW1lKQorCisgICAgZGVmIG1hbmlmZXN0X3NldHVwX2xkYXJncyhzZWxmLCBvdXRwdXRfZmlsZW5hbWUsIGJ1aWxkX3RlbXAsIGxkX2FyZ3MpOgorICAgICAgICAjIElmIHdlIG5lZWQgYSBtYW5pZmVzdCBhdCBhbGwsIGFuIGVtYmVkZGVkIG1hbmlmZXN0IGlzIHJlY29tbWVuZGVkLgorICAgICAgICAjIFNlZSBNU0ROIGFydGljbGUgdGl0bGVkCisgICAgICAgICMgIkhvdyB0bzogRW1iZWQgYSBNYW5pZmVzdCBJbnNpZGUgYSBDL0MrKyBBcHBsaWNhdGlvbiIKKyAgICAgICAgIyAoY3VycmVudGx5IGF0IGh0dHA6Ly9tc2RuMi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXMyMzU1OTEoVlMuODApLmFzcHgpCisgICAgICAgICMgQXNrIHRoZSBsaW5rZXIgdG8gZ2VuZXJhdGUgdGhlIG1hbmlmZXN0IGluIHRoZSB0ZW1wIGRpciwgc28KKyAgICAgICAgIyB3ZSBjYW4gY2hlY2sgaXQsIGFuZCBwb3NzaWJseSBlbWJlZCBpdCwgbGF0ZXIuCisgICAgICAgIHRlbXBfbWFuaWZlc3QgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICAgICAgYnVpbGRfdGVtcCwKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmJhc2VuYW1lKG91dHB1dF9maWxlbmFtZSkgKyAiLm1hbmlmZXN0IikKKyAgICAgICAgbGRfYXJncy5hcHBlbmQoJy9NQU5JRkVTVEZJTEU6JyArIHRlbXBfbWFuaWZlc3QpCisKKyAgICBkZWYgbWFuaWZlc3RfZ2V0X2VtYmVkX2luZm8oc2VsZiwgdGFyZ2V0X2Rlc2MsIGxkX2FyZ3MpOgorICAgICAgICAjIElmIGEgbWFuaWZlc3Qgc2hvdWxkIGJlIGVtYmVkZGVkLCByZXR1cm4gYSB0dXBsZSBvZgorICAgICAgICAjIChtYW5pZmVzdF9maWxlbmFtZSwgcmVzb3VyY2VfaWQpLiAgUmV0dXJucyBOb25lIGlmIG5vIG1hbmlmZXN0CisgICAgICAgICMgc2hvdWxkIGJlIGVtYmVkZGVkLiAgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3ODMzIGZvciB3aHkKKyAgICAgICAgIyB3ZSB3YW50IHRvIGF2b2lkIGFueSBtYW5pZmVzdCBmb3IgZXh0ZW5zaW9uIG1vZHVsZXMgaWYgd2UgY2FuKQorICAgICAgICBmb3IgYXJnIGluIGxkX2FyZ3M6CisgICAgICAgICAgICBpZiBhcmcuc3RhcnRzd2l0aCgiL01BTklGRVNURklMRToiKToKKyAgICAgICAgICAgICAgICB0ZW1wX21hbmlmZXN0ID0gYXJnLnNwbGl0KCI6IiwgMSlbMV0KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBubyAvTUFOSUZFU1RGSUxFIHNvIG5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiB0YXJnZXRfZGVzYyA9PSBDQ29tcGlsZXIuRVhFQ1VUQUJMRToKKyAgICAgICAgICAgICMgYnkgZGVmYXVsdCwgZXhlY3V0YWJsZXMgYWx3YXlzIGdldCB0aGUgbWFuaWZlc3Qgd2l0aCB0aGUKKyAgICAgICAgICAgICMgQ1JUIHJlZmVyZW5jZWQuCisgICAgICAgICAgICBtZmlkID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBFeHRlbnNpb24gbW9kdWxlcyB0cnkgYW5kIGF2b2lkIGFueSBtYW5pZmVzdCBpZiBwb3NzaWJsZS4KKyAgICAgICAgICAgIG1maWQgPSAyCisgICAgICAgICAgICB0ZW1wX21hbmlmZXN0ID0gc2VsZi5fcmVtb3ZlX3Zpc3VhbF9jX3JlZih0ZW1wX21hbmlmZXN0KQorICAgICAgICBpZiB0ZW1wX21hbmlmZXN0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gdGVtcF9tYW5pZmVzdCwgbWZpZAorCisgICAgZGVmIF9yZW1vdmVfdmlzdWFsX2NfcmVmKHNlbGYsIG1hbmlmZXN0X2ZpbGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFJlbW92ZSByZWZlcmVuY2VzIHRvIHRoZSBWaXN1YWwgQyBydW50aW1lLCBzbyB0aGV5IHdpbGwKKyAgICAgICAgICAgICMgZmFsbCB0aHJvdWdoIHRvIHRoZSBWaXN1YWwgQyBkZXBlbmRlbmN5IG9mIFB5dGhvbi5leGUuCisgICAgICAgICAgICAjIFRoaXMgd2F5LCB3aGVuIGluc3RhbGxlZCBmb3IgYSByZXN0cmljdGVkIHVzZXIgKGUuZy4KKyAgICAgICAgICAgICMgcnVudGltZXMgYXJlIG5vdCBpbiBXaW5TeFMgZm9sZGVyLCBidXQgaW4gUHl0aG9uJ3Mgb3duCisgICAgICAgICAgICAjIGZvbGRlciksIHRoZSBydW50aW1lcyBkbyBub3QgbmVlZCB0byBiZSBpbiBldmVyeSBmb2xkZXIKKyAgICAgICAgICAgICMgd2l0aCAucHlkJ3MuCisgICAgICAgICAgICAjIFJldHVybnMgZWl0aGVyIHRoZSBmaWxlbmFtZSBvZiB0aGUgbW9kaWZpZWQgbWFuaWZlc3Qgb3IKKyAgICAgICAgICAgICMgTm9uZSBpZiBubyBtYW5pZmVzdCBzaG91bGQgYmUgZW1iZWRkZWQuCisgICAgICAgICAgICBtYW5pZmVzdF9mID0gb3BlbihtYW5pZmVzdF9maWxlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1hbmlmZXN0X2J1ZiA9IG1hbmlmZXN0X2YucmVhZCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG1hbmlmZXN0X2YuY2xvc2UoKQorICAgICAgICAgICAgcGF0dGVybiA9IHJlLmNvbXBpbGUoCisgICAgICAgICAgICAgICAgciIiIjxhc3NlbWJseUlkZW50aXR5Lio/bmFtZT0oInwnKU1pY3Jvc29mdFwuIiIiXAorICAgICAgICAgICAgICAgIHIiIiJWQ1xkezJ9XC5DUlQoInwnKS4qPygvPnw8L2Fzc2VtYmx5SWRlbnRpdHk+KSIiIiwKKyAgICAgICAgICAgICAgICByZS5ET1RBTEwpCisgICAgICAgICAgICBtYW5pZmVzdF9idWYgPSByZS5zdWIocGF0dGVybiwgIiIsIG1hbmlmZXN0X2J1ZikKKyAgICAgICAgICAgIHBhdHRlcm4gPSAiPGRlcGVuZGVudEFzc2VtYmx5PlxzKjwvZGVwZW5kZW50QXNzZW1ibHk+IgorICAgICAgICAgICAgbWFuaWZlc3RfYnVmID0gcmUuc3ViKHBhdHRlcm4sICIiLCBtYW5pZmVzdF9idWYpCisgICAgICAgICAgICAjIE5vdyBzZWUgaWYgYW55IG90aGVyIGFzc2VtYmxpZXMgYXJlIHJlZmVyZW5jZWQgLSBpZiBub3QsIHdlCisgICAgICAgICAgICAjIGRvbid0IHdhbnQgYSBtYW5pZmVzdCBlbWJlZGRlZC4KKyAgICAgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKAorICAgICAgICAgICAgICAgIHIiIiI8YXNzZW1ibHlJZGVudGl0eS4qP25hbWU9KD86InwnKSguKz8pKD86InwnKSIiIgorICAgICAgICAgICAgICAgIHIiIiIuKj8oPzovPnw8L2Fzc2VtYmx5SWRlbnRpdHk+KSIiIiwgcmUuRE9UQUxMKQorICAgICAgICAgICAgaWYgcmUuc2VhcmNoKHBhdHRlcm4sIG1hbmlmZXN0X2J1ZikgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICAgICBtYW5pZmVzdF9mID0gb3BlbihtYW5pZmVzdF9maWxlLCAndycpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWFuaWZlc3RfZi53cml0ZShtYW5pZmVzdF9idWYpCisgICAgICAgICAgICAgICAgcmV0dXJuIG1hbmlmZXN0X2ZpbGUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbWFuaWZlc3RfZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgIyAtLSBNaXNjZWxsYW5lb3VzIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIFRoZXNlIGFyZSBhbGwgdXNlZCBieSB0aGUgJ2dlbl9saWJfb3B0aW9ucygpIGZ1bmN0aW9uLCBpbgorICAgICMgY2NvbXBpbGVyLnB5LgorCisgICAgZGVmIGxpYnJhcnlfZGlyX29wdGlvbihzZWxmLCBkaXIpOgorICAgICAgICByZXR1cm4gIi9MSUJQQVRIOiIgKyBkaXIKKworICAgIGRlZiBydW50aW1lX2xpYnJhcnlfZGlyX29wdGlvbihzZWxmLCBkaXIpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKAorICAgICAgICAgICAgICAiZG9uJ3Qga25vdyBob3cgdG8gc2V0IHJ1bnRpbWUgbGlicmFyeSBzZWFyY2ggcGF0aCBmb3IgTVNWQysrIikKKworICAgIGRlZiBsaWJyYXJ5X29wdGlvbihzZWxmLCBsaWIpOgorICAgICAgICByZXR1cm4gc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKGxpYikKKworCisgICAgZGVmIGZpbmRfbGlicmFyeV9maWxlKHNlbGYsIGRpcnMsIGxpYiwgZGVidWc9MCk6CisgICAgICAgICMgUHJlZmVyIGEgZGVidWdnaW5nIGxpYnJhcnkgaWYgZm91bmQgKGFuZCByZXF1ZXN0ZWQpLCBidXQgZGVhbAorICAgICAgICAjIHdpdGggaXQgaWYgd2UgZG9uJ3QgaGF2ZSBvbmUuCisgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgdHJ5X25hbWVzID0gW2xpYiArICJfZCIsIGxpYl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeV9uYW1lcyA9IFtsaWJdCisgICAgICAgIGZvciBkaXIgaW4gZGlyczoKKyAgICAgICAgICAgIGZvciBuYW1lIGluIHRyeV9uYW1lczoKKyAgICAgICAgICAgICAgICBsaWJmaWxlID0gb3MucGF0aC5qb2luKGRpciwgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lIChuYW1lKSkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhsaWJmaWxlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpYmZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgT29wcywgZGlkbid0IGZpbmQgaXQgaW4gKmFueSogb2YgJ2RpcnMnCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBIZWxwZXIgbWV0aG9kcyBmb3IgdXNpbmcgdGhlIE1TVkMgcmVnaXN0cnkgc2V0dGluZ3MKKworICAgIGRlZiBmaW5kX2V4ZShzZWxmLCBleGUpOgorICAgICAgICAiIiJSZXR1cm4gcGF0aCB0byBhbiBNU1ZDIGV4ZWN1dGFibGUgcHJvZ3JhbS4KKworICAgICAgICBUcmllcyB0byBmaW5kIHRoZSBwcm9ncmFtIGluIHNldmVyYWwgcGxhY2VzOiBmaXJzdCwgb25lIG9mIHRoZQorICAgICAgICBNU1ZDIHByb2dyYW0gc2VhcmNoIHBhdGhzIGZyb20gdGhlIHJlZ2lzdHJ5OyBuZXh0LCB0aGUgZGlyZWN0b3JpZXMKKyAgICAgICAgaW4gdGhlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuICBJZiBhbnkgb2YgdGhvc2Ugd29yaywgcmV0dXJuIGFuCisgICAgICAgIGFic29sdXRlIHBhdGggdGhhdCBpcyBrbm93biB0byBleGlzdC4gIElmIG5vbmUgb2YgdGhlbSB3b3JrLCBqdXN0CisgICAgICAgIHJldHVybiB0aGUgb3JpZ2luYWwgcHJvZ3JhbSBuYW1lLCAnZXhlJy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBwIGluIHNlbGYuX19wYXRoczoKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChwKSwgZXhlKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgIHJldHVybiBmbgorCisgICAgICAgICMgZGlkbid0IGZpbmQgaXQ7IHRyeSBleGlzdGluZyBwYXRoCisgICAgICAgIGZvciBwIGluIG9zLmVudmlyb25bJ1BhdGgnXS5zcGxpdCgnOycpOgorICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5hYnNwYXRoKHApLGV4ZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZuKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm4KKworICAgICAgICByZXR1cm4gZXhlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmM5Y29tcGlsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjIzMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmM5Y29tcGlsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjN2YzNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjOWNvbXBpbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2OWZkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL21zdmNjb21waWxlci5weQpAQCAtMCwwICsxLDY1OSBAQAorIiIiZGlzdHV0aWxzLm1zdmNjb21waWxlcgorCitDb250YWlucyBNU1ZDQ29tcGlsZXIsIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYnN0cmFjdCBDQ29tcGlsZXIgY2xhc3MKK2ZvciB0aGUgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8uCisiIiIKKworIyBXcml0dGVuIGJ5IFBlcnJ5IFN0b2xsCisjIGhhY2tlZCBieSBSb2JpbiBCZWNrZXIgYW5kIFRob21hcyBIZWxsZXIgdG8gZG8gYSBiZXR0ZXIgam9iIG9mCisjICAgZmluZGluZyBEZXZTdHVkaW8gKHRocm91Z2ggdGhlIHJlZ2lzdHJ5KQorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc3RyaW5nCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKERpc3R1dGlsc0V4ZWNFcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGVFcnJvciwgTGliRXJyb3IsIExpbmtFcnJvcikKK2Zyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgQ0NvbXBpbGVyLCBnZW5fbGliX29wdGlvbnMKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKKworX2Nhbl9yZWFkX3JlZyA9IDAKK3RyeToKKyAgICBpbXBvcnQgX3dpbnJlZworCisgICAgX2Nhbl9yZWFkX3JlZyA9IDEKKyAgICBoa2V5X21vZCA9IF93aW5yZWcKKworICAgIFJlZ09wZW5LZXlFeCA9IF93aW5yZWcuT3BlbktleUV4CisgICAgUmVnRW51bUtleSA9IF93aW5yZWcuRW51bUtleQorICAgIFJlZ0VudW1WYWx1ZSA9IF93aW5yZWcuRW51bVZhbHVlCisgICAgUmVnRXJyb3IgPSBfd2lucmVnLmVycm9yCisKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB3aW4zMmFwaQorICAgICAgICBpbXBvcnQgd2luMzJjb24KKyAgICAgICAgX2Nhbl9yZWFkX3JlZyA9IDEKKyAgICAgICAgaGtleV9tb2QgPSB3aW4zMmNvbgorCisgICAgICAgIFJlZ09wZW5LZXlFeCA9IHdpbjMyYXBpLlJlZ09wZW5LZXlFeAorICAgICAgICBSZWdFbnVtS2V5ID0gd2luMzJhcGkuUmVnRW51bUtleQorICAgICAgICBSZWdFbnVtVmFsdWUgPSB3aW4zMmFwaS5SZWdFbnVtVmFsdWUKKyAgICAgICAgUmVnRXJyb3IgPSB3aW4zMmFwaS5lcnJvcgorCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBsb2cuaW5mbygiV2FybmluZzogQ2FuJ3QgcmVhZCByZWdpc3RyeSB0byBmaW5kIHRoZSAiCisgICAgICAgICAgICAgICAgICJuZWNlc3NhcnkgY29tcGlsZXIgc2V0dGluZ1xuIgorICAgICAgICAgICAgICAgICAiTWFrZSBzdXJlIHRoYXQgUHl0aG9uIG1vZHVsZXMgX3dpbnJlZywgIgorICAgICAgICAgICAgICAgICAid2luMzJhcGkgb3Igd2luMzJjb24gYXJlIGluc3RhbGxlZC4iKQorICAgICAgICBwYXNzCisKK2lmIF9jYW5fcmVhZF9yZWc6CisgICAgSEtFWVMgPSAoaGtleV9tb2QuSEtFWV9VU0VSUywKKyAgICAgICAgICAgICBoa2V5X21vZC5IS0VZX0NVUlJFTlRfVVNFUiwKKyAgICAgICAgICAgICBoa2V5X21vZC5IS0VZX0xPQ0FMX01BQ0hJTkUsCisgICAgICAgICAgICAgaGtleV9tb2QuSEtFWV9DTEFTU0VTX1JPT1QpCisKK2RlZiByZWFkX2tleXMoYmFzZSwga2V5KToKKyAgICAiIiJSZXR1cm4gbGlzdCBvZiByZWdpc3RyeSBrZXlzLiIiIgorCisgICAgdHJ5OgorICAgICAgICBoYW5kbGUgPSBSZWdPcGVuS2V5RXgoYmFzZSwga2V5KQorICAgIGV4Y2VwdCBSZWdFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBMID0gW10KKyAgICBpID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGsgPSBSZWdFbnVtS2V5KGhhbmRsZSwgaSkKKyAgICAgICAgZXhjZXB0IFJlZ0Vycm9yOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgTC5hcHBlbmQoaykKKyAgICAgICAgaSA9IGkgKyAxCisgICAgcmV0dXJuIEwKKworZGVmIHJlYWRfdmFsdWVzKGJhc2UsIGtleSk6CisgICAgIiIiUmV0dXJuIGRpY3Qgb2YgcmVnaXN0cnkga2V5cyBhbmQgdmFsdWVzLgorCisgICAgQWxsIG5hbWVzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgaGFuZGxlID0gUmVnT3BlbktleUV4KGJhc2UsIGtleSkKKyAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZCA9IHt9CisgICAgaSA9IDAKKyAgICB3aGlsZSAxOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lLCB2YWx1ZSwgdHlwZSA9IFJlZ0VudW1WYWx1ZShoYW5kbGUsIGkpCisgICAgICAgIGV4Y2VwdCBSZWdFcnJvcjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgZFtjb252ZXJ0X21iY3MobmFtZSldID0gY29udmVydF9tYmNzKHZhbHVlKQorICAgICAgICBpID0gaSArIDEKKyAgICByZXR1cm4gZAorCitkZWYgY29udmVydF9tYmNzKHMpOgorICAgIGVuYyA9IGdldGF0dHIocywgImVuY29kZSIsIE5vbmUpCisgICAgaWYgZW5jIGlzIG5vdCBOb25lOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gZW5jKCJtYmNzIikKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcworCitjbGFzcyBNYWNyb0V4cGFuZGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb24pOgorICAgICAgICBzZWxmLm1hY3JvcyA9IHt9CisgICAgICAgIHNlbGYubG9hZF9tYWNyb3ModmVyc2lvbikKKworICAgIGRlZiBzZXRfbWFjcm8oc2VsZiwgbWFjcm8sIHBhdGgsIGtleSk6CisgICAgICAgIGZvciBiYXNlIGluIEhLRVlTOgorICAgICAgICAgICAgZCA9IHJlYWRfdmFsdWVzKGJhc2UsIHBhdGgpCisgICAgICAgICAgICBpZiBkOgorICAgICAgICAgICAgICAgIHNlbGYubWFjcm9zWyIkKCVzKSIgJSBtYWNyb10gPSBkW2tleV0KKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgZGVmIGxvYWRfbWFjcm9zKHNlbGYsIHZlcnNpb24pOgorICAgICAgICB2c2Jhc2UgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW9cJTAuMWYiICUgdmVyc2lvbgorICAgICAgICBzZWxmLnNldF9tYWNybygiVkNJbnN0YWxsRGlyIiwgdnNiYXNlICsgciJcU2V0dXBcVkMiLCAicHJvZHVjdGRpciIpCisgICAgICAgIHNlbGYuc2V0X21hY3JvKCJWU0luc3RhbGxEaXIiLCB2c2Jhc2UgKyByIlxTZXR1cFxWUyIsICJwcm9kdWN0ZGlyIikKKyAgICAgICAgbmV0ID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcLk5FVEZyYW1ld29yayIKKyAgICAgICAgc2VsZi5zZXRfbWFjcm8oIkZyYW1ld29ya0RpciIsIG5ldCwgImluc3RhbGxyb290IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgdmVyc2lvbiA+IDcuMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9tYWNybygiRnJhbWV3b3JrU0RLRGlyIiwgbmV0LCAic2RraW5zdGFsbHJvb3R2MS4xIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfbWFjcm8oIkZyYW1ld29ya1NES0RpciIsIG5ldCwgInNka2luc3RhbGxyb290IikKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAgICAgKCIiIlB5dGhvbiB3YXMgYnVpbHQgd2l0aCBWaXN1YWwgU3R1ZGlvIDIwMDM7CitleHRlbnNpb25zIG11c3QgYmUgYnVpbHQgd2l0aCBhIGNvbXBpbGVyIHRoYW4gY2FuIGdlbmVyYXRlIGNvbXBhdGlibGUgYmluYXJpZXMuCitWaXN1YWwgU3R1ZGlvIDIwMDMgd2FzIG5vdCBmb3VuZCBvbiB0aGlzIHN5c3RlbS4gSWYgeW91IGhhdmUgQ3lnd2luIGluc3RhbGxlZCwKK3lvdSBjYW4gdHJ5IGNvbXBpbGluZyB3aXRoIE1pbmdXMzIsIGJ5IHBhc3NpbmcgIi1jIG1pbmd3MzIiIHRvIHNldHVwLnB5LiIiIikKKworICAgICAgICBwID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcTkVUIEZyYW1ld29yayBTZXR1cFxQcm9kdWN0IgorICAgICAgICBmb3IgYmFzZSBpbiBIS0VZUzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBoID0gUmVnT3BlbktleUV4KGJhc2UsIHApCisgICAgICAgICAgICBleGNlcHQgUmVnRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGtleSA9IFJlZ0VudW1LZXkoaCwgMCkKKyAgICAgICAgICAgIGQgPSByZWFkX3ZhbHVlcyhiYXNlLCByIiVzXCVzIiAlIChwLCBrZXkpKQorICAgICAgICAgICAgc2VsZi5tYWNyb3NbIiQoRnJhbWV3b3JrVmVyc2lvbikiXSA9IGRbInZlcnNpb24iXQorCisgICAgZGVmIHN1YihzZWxmLCBzKToKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5tYWNyb3MuaXRlbXMoKToKKyAgICAgICAgICAgIHMgPSBzdHJpbmcucmVwbGFjZShzLCBrLCB2KQorICAgICAgICByZXR1cm4gcworCitkZWYgZ2V0X2J1aWxkX3ZlcnNpb24oKToKKyAgICAiIiJSZXR1cm4gdGhlIHZlcnNpb24gb2YgTVNWQyB0aGF0IHdhcyB1c2VkIHRvIGJ1aWxkIFB5dGhvbi4KKworICAgIEZvciBQeXRob24gMi4zIGFuZCB1cCwgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGluY2x1ZGVkIGluCisgICAgc3lzLnZlcnNpb24uICBGb3IgZWFybGllciB2ZXJzaW9ucywgYXNzdW1lIHRoZSBjb21waWxlciBpcyBNU1ZDIDYuCisgICAgIiIiCisKKyAgICBwcmVmaXggPSAiTVNDIHYuIgorICAgIGkgPSBzdHJpbmcuZmluZChzeXMudmVyc2lvbiwgcHJlZml4KQorICAgIGlmIGkgPT0gLTE6CisgICAgICAgIHJldHVybiA2CisgICAgaSA9IGkgKyBsZW4ocHJlZml4KQorICAgIHMsIHJlc3QgPSBzeXMudmVyc2lvbltpOl0uc3BsaXQoIiAiLCAxKQorICAgIG1ham9yVmVyc2lvbiA9IGludChzWzotMl0pIC0gNgorICAgIG1pbm9yVmVyc2lvbiA9IGludChzWzI6M10pIC8gMTAuMAorICAgICMgSSBkb24ndCB0aGluayBwYXRocyBhcmUgYWZmZWN0ZWQgYnkgbWlub3IgdmVyc2lvbiBpbiB2ZXJzaW9uIDYKKyAgICBpZiBtYWpvclZlcnNpb24gPT0gNjoKKyAgICAgICAgbWlub3JWZXJzaW9uID0gMAorICAgIGlmIG1ham9yVmVyc2lvbiA+PSA2OgorICAgICAgICByZXR1cm4gbWFqb3JWZXJzaW9uICsgbWlub3JWZXJzaW9uCisgICAgIyBlbHNlIHdlIGRvbid0IGtub3cgd2hhdCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciB0aGlzIGlzCisgICAgcmV0dXJuIE5vbmUKKworZGVmIGdldF9idWlsZF9hcmNoaXRlY3R1cmUoKToKKyAgICAiIiJSZXR1cm4gdGhlIHByb2Nlc3NvciBhcmNoaXRlY3R1cmUuCisKKyAgICBQb3NzaWJsZSByZXN1bHRzIGFyZSAiSW50ZWwiLCAiSXRhbml1bSIsIG9yICJBTUQ2NCIuCisgICAgIiIiCisKKyAgICBwcmVmaXggPSAiIGJpdCAoIgorICAgIGkgPSBzdHJpbmcuZmluZChzeXMudmVyc2lvbiwgcHJlZml4KQorICAgIGlmIGkgPT0gLTE6CisgICAgICAgIHJldHVybiAiSW50ZWwiCisgICAgaiA9IHN0cmluZy5maW5kKHN5cy52ZXJzaW9uLCAiKSIsIGkpCisgICAgcmV0dXJuIHN5cy52ZXJzaW9uW2krbGVuKHByZWZpeCk6al0KKworZGVmIG5vcm1hbGl6ZV9hbmRfcmVkdWNlX3BhdGhzKHBhdGhzKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIG5vcm1hbGl6ZWQgcGF0aHMgd2l0aCBkdXBsaWNhdGVzIHJlbW92ZWQuCisKKyAgICBUaGUgY3VycmVudCBvcmRlciBvZiBwYXRocyBpcyBtYWludGFpbmVkLgorICAgICIiIgorICAgICMgUGF0aHMgYXJlIG5vcm1hbGl6ZWQgc28gdGhpbmdzIGxpa2U6ICAvYSBhbmQgL2EvIGFyZW4ndCBib3RoIHByZXNlcnZlZC4KKyAgICByZWR1Y2VkX3BhdGhzID0gW10KKyAgICBmb3IgcCBpbiBwYXRoczoKKyAgICAgICAgbnAgPSBvcy5wYXRoLm5vcm1wYXRoKHApCisgICAgICAgICMgWFhYKG5ub3J3aXR6KTogTyhuKioyKSwgaWYgcmVkdWNlZF9wYXRocyBnZXRzIGxvbmcgcGVyaGFwcyB1c2UgYSBzZXQuCisgICAgICAgIGlmIG5wIG5vdCBpbiByZWR1Y2VkX3BhdGhzOgorICAgICAgICAgICAgcmVkdWNlZF9wYXRocy5hcHBlbmQobnApCisgICAgcmV0dXJuIHJlZHVjZWRfcGF0aHMKKworCitjbGFzcyBNU1ZDQ29tcGlsZXIgKENDb21waWxlcikgOgorICAgICIiIkNvbmNyZXRlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgdG8gTWljcm9zb2Z0IFZpc3VhbCBDKyssCisgICAgICAgYXMgZGVmaW5lZCBieSB0aGUgQ0NvbXBpbGVyIGFic3RyYWN0IGNsYXNzLiIiIgorCisgICAgY29tcGlsZXJfdHlwZSA9ICdtc3ZjJworCisgICAgIyBKdXN0IHNldCB0aGlzIHNvIENDb21waWxlcidzIGNvbnN0cnVjdG9yIGRvZXNuJ3QgYmFyZi4gIFdlIGN1cnJlbnRseQorICAgICMgZG9uJ3QgdXNlIHRoZSAnc2V0X2V4ZWN1dGFibGVzKCknIGJ1cmVhdWNyYWN5IHByb3ZpZGVkIGJ5IENDb21waWxlciwKKyAgICAjIGFzIGl0IHJlYWxseSBpc24ndCBuZWNlc3NhcnkgZm9yIHRoaXMgc29ydCBvZiBzaW5nbGUtY29tcGlsZXIgY2xhc3MuCisgICAgIyBXb3VsZCBiZSBuaWNlIHRvIGhhdmUgYSBjb25zaXN0ZW50IGludGVyZmFjZSB3aXRoIFVuaXhDQ29tcGlsZXIsCisgICAgIyB0aG91Z2gsIHNvIGl0J3Mgd29ydGggdGhpbmtpbmcgYWJvdXQuCisgICAgZXhlY3V0YWJsZXMgPSB7fQorCisgICAgIyBQcml2YXRlIGNsYXNzIGRhdGEgKG5lZWQgdG8gZGlzdGluZ3Vpc2ggQyBmcm9tIEMrKyBzb3VyY2UgZm9yIGNvbXBpbGVyKQorICAgIF9jX2V4dGVuc2lvbnMgPSBbJy5jJ10KKyAgICBfY3BwX2V4dGVuc2lvbnMgPSBbJy5jYycsICcuY3BwJywgJy5jeHgnXQorICAgIF9yY19leHRlbnNpb25zID0gWycucmMnXQorICAgIF9tY19leHRlbnNpb25zID0gWycubWMnXQorCisgICAgIyBOZWVkZWQgZm9yIHRoZSBmaWxlbmFtZSBnZW5lcmF0aW9uIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlCisgICAgIyBiYXNlIGNsYXNzLCBDQ29tcGlsZXIuCisgICAgc3JjX2V4dGVuc2lvbnMgPSAoX2NfZXh0ZW5zaW9ucyArIF9jcHBfZXh0ZW5zaW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgX3JjX2V4dGVuc2lvbnMgKyBfbWNfZXh0ZW5zaW9ucykKKyAgICByZXNfZXh0ZW5zaW9uID0gJy5yZXMnCisgICAgb2JqX2V4dGVuc2lvbiA9ICcub2JqJworICAgIHN0YXRpY19saWJfZXh0ZW5zaW9uID0gJy5saWInCisgICAgc2hhcmVkX2xpYl9leHRlbnNpb24gPSAnLmRsbCcKKyAgICBzdGF0aWNfbGliX2Zvcm1hdCA9IHNoYXJlZF9saWJfZm9ybWF0ID0gJyVzJXMnCisgICAgZXhlX2V4dGVuc2lvbiA9ICcuZXhlJworCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2ZXJib3NlPTAsIGRyeV9ydW49MCwgZm9yY2U9MCk6CisgICAgICAgIENDb21waWxlci5fX2luaXRfXyAoc2VsZiwgdmVyYm9zZSwgZHJ5X3J1biwgZm9yY2UpCisgICAgICAgIHNlbGYuX192ZXJzaW9uID0gZ2V0X2J1aWxkX3ZlcnNpb24oKQorICAgICAgICBzZWxmLl9fYXJjaCA9IGdldF9idWlsZF9hcmNoaXRlY3R1cmUoKQorICAgICAgICBpZiBzZWxmLl9fYXJjaCA9PSAiSW50ZWwiOgorICAgICAgICAgICAgIyB4ODYKKyAgICAgICAgICAgIGlmIHNlbGYuX192ZXJzaW9uID49IDc6CisgICAgICAgICAgICAgICAgc2VsZi5fX3Jvb3QgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxWaXN1YWxTdHVkaW8iCisgICAgICAgICAgICAgICAgc2VsZi5fX21hY3JvcyA9IE1hY3JvRXhwYW5kZXIoc2VsZi5fX3ZlcnNpb24pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX19yb290ID0gciJTb2Z0d2FyZVxNaWNyb3NvZnRcRGV2c3R1ZGlvIgorICAgICAgICAgICAgc2VsZi5fX3Byb2R1Y3QgPSAiVmlzdWFsIFN0dWRpbyB2ZXJzaW9uICVzIiAlIHNlbGYuX192ZXJzaW9uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdpbjY0LiBBc3N1bWUgdGhpcyB3YXMgYnVpbHQgd2l0aCB0aGUgcGxhdGZvcm0gU0RLCisgICAgICAgICAgICBzZWxmLl9fcHJvZHVjdCA9ICJNaWNyb3NvZnQgU0RLIGNvbXBpbGVyICVzIiAlIChzZWxmLl9fdmVyc2lvbiArIDYpCisKKyAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IEZhbHNlCisKKyAgICBkZWYgaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgc2VsZi5fX3BhdGhzID0gW10KKyAgICAgICAgaWYgIkRJU1RVVElMU19VU0VfU0RLIiBpbiBvcy5lbnZpcm9uIGFuZCAiTVNTZGsiIGluIG9zLmVudmlyb24gYW5kIHNlbGYuZmluZF9leGUoImNsLmV4ZSIpOgorICAgICAgICAgICAgIyBBc3N1bWUgdGhhdCB0aGUgU0RLIHNldCB1cCBldmVyeXRoaW5nIGFscmlnaHQ7IGRvbid0IHRyeSB0byBiZQorICAgICAgICAgICAgIyBzbWFydGVyCisgICAgICAgICAgICBzZWxmLmNjID0gImNsLmV4ZSIKKyAgICAgICAgICAgIHNlbGYubGlua2VyID0gImxpbmsuZXhlIgorICAgICAgICAgICAgc2VsZi5saWIgPSAibGliLmV4ZSIKKyAgICAgICAgICAgIHNlbGYucmMgPSAicmMuZXhlIgorICAgICAgICAgICAgc2VsZi5tYyA9ICJtYy5leGUiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fcGF0aHMgPSBzZWxmLmdldF9tc3ZjX3BhdGhzKCJwYXRoIikKKworICAgICAgICAgICAgaWYgbGVuIChzZWxmLl9fcGF0aHMpID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICgiUHl0aG9uIHdhcyBidWlsdCB3aXRoICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICJhbmQgZXh0ZW5zaW9ucyBuZWVkIHRvIGJlIGJ1aWx0IHdpdGggdGhlIHNhbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBvZiB0aGUgY29tcGlsZXIsIGJ1dCBpdCBpc24ndCBpbnN0YWxsZWQuIiAlIHNlbGYuX19wcm9kdWN0KQorCisgICAgICAgICAgICBzZWxmLmNjID0gc2VsZi5maW5kX2V4ZSgiY2wuZXhlIikKKyAgICAgICAgICAgIHNlbGYubGlua2VyID0gc2VsZi5maW5kX2V4ZSgibGluay5leGUiKQorICAgICAgICAgICAgc2VsZi5saWIgPSBzZWxmLmZpbmRfZXhlKCJsaWIuZXhlIikKKyAgICAgICAgICAgIHNlbGYucmMgPSBzZWxmLmZpbmRfZXhlKCJyYy5leGUiKSAgICMgcmVzb3VyY2UgY29tcGlsZXIKKyAgICAgICAgICAgIHNlbGYubWMgPSBzZWxmLmZpbmRfZXhlKCJtYy5leGUiKSAgICMgbWVzc2FnZSBjb21waWxlcgorICAgICAgICAgICAgc2VsZi5zZXRfcGF0aF9lbnZfdmFyKCdsaWInKQorICAgICAgICAgICAgc2VsZi5zZXRfcGF0aF9lbnZfdmFyKCdpbmNsdWRlJykKKworICAgICAgICAjIGV4dGVuZCB0aGUgTVNWQyBwYXRoIHdpdGggdGhlIGN1cnJlbnQgcGF0aAorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgcCBpbiBzdHJpbmcuc3BsaXQob3MuZW52aXJvblsncGF0aCddLCAnOycpOgorICAgICAgICAgICAgICAgIHNlbGYuX19wYXRocy5hcHBlbmQocCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl9fcGF0aHMgPSBub3JtYWxpemVfYW5kX3JlZHVjZV9wYXRocyhzZWxmLl9fcGF0aHMpCisgICAgICAgIG9zLmVudmlyb25bJ3BhdGgnXSA9IHN0cmluZy5qb2luKHNlbGYuX19wYXRocywgJzsnKQorCisgICAgICAgIHNlbGYucHJlcHJvY2Vzc19vcHRpb25zID0gTm9uZQorICAgICAgICBpZiBzZWxmLl9fYXJjaCA9PSAiSW50ZWwiOgorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnMgPSBbICcvbm9sb2dvJywgJy9PeCcsICcvTUQnLCAnL1czJywgJy9HWCcgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRE5ERUJVRyddCisgICAgICAgICAgICBzZWxmLmNvbXBpbGVfb3B0aW9uc19kZWJ1ZyA9IFsnL25vbG9nbycsICcvT2QnLCAnL01EZCcsICcvVzMnLCAnL0dYJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvWjcnLCAnL0RfREVCVUcnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBXaW42NAorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnMgPSBbICcvbm9sb2dvJywgJy9PeCcsICcvTUQnLCAnL1czJywgJy9HUy0nICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0ROREVCVUcnXQorICAgICAgICAgICAgc2VsZi5jb21waWxlX29wdGlvbnNfZGVidWcgPSBbJy9ub2xvZ28nLCAnL09kJywgJy9NRGQnLCAnL1czJywgJy9HUy0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9aNycsICcvRF9ERUJVRyddCisKKyAgICAgICAgc2VsZi5sZGZsYWdzX3NoYXJlZCA9IFsnL0RMTCcsICcvbm9sb2dvJywgJy9JTkNSRU1FTlRBTDpOTyddCisgICAgICAgIGlmIHNlbGYuX192ZXJzaW9uID49IDc6CisgICAgICAgICAgICBzZWxmLmxkZmxhZ3Nfc2hhcmVkX2RlYnVnID0gWworICAgICAgICAgICAgICAgICcvRExMJywgJy9ub2xvZ28nLCAnL0lOQ1JFTUVOVEFMOm5vJywgJy9ERUJVRycKKyAgICAgICAgICAgICAgICBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxkZmxhZ3Nfc2hhcmVkX2RlYnVnID0gWworICAgICAgICAgICAgICAgICcvRExMJywgJy9ub2xvZ28nLCAnL0lOQ1JFTUVOVEFMOm5vJywgJy9wZGI6Tm9uZScsICcvREVCVUcnCisgICAgICAgICAgICAgICAgXQorICAgICAgICBzZWxmLmxkZmxhZ3Nfc3RhdGljID0gWyAnL25vbG9nbyddCisKKyAgICAgICAgc2VsZi5pbml0aWFsaXplZCA9IFRydWUKKworICAgICMgLS0gV29ya2VyIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgb2JqZWN0X2ZpbGVuYW1lcyAoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2ZpbGVuYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaXBfZGlyPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9JycpOgorICAgICAgICAjIENvcGllZCBmcm9tIGNjb21waWxlci5weSwgZXh0ZW5kZWQgdG8gcmV0dXJuIC5yZXMgYXMgJ29iamVjdCctZmlsZQorICAgICAgICAjIGZvciAucmMgaW5wdXQgZmlsZQorICAgICAgICBpZiBvdXRwdXRfZGlyIGlzIE5vbmU6IG91dHB1dF9kaXIgPSAnJworICAgICAgICBvYmpfbmFtZXMgPSBbXQorICAgICAgICBmb3Igc3JjX25hbWUgaW4gc291cmNlX2ZpbGVuYW1lczoKKyAgICAgICAgICAgIChiYXNlLCBleHQpID0gb3MucGF0aC5zcGxpdGV4dCAoc3JjX25hbWUpCisgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5zcGxpdGRyaXZlKGJhc2UpWzFdICMgQ2hvcCBvZmYgdGhlIGRyaXZlCisgICAgICAgICAgICBiYXNlID0gYmFzZVtvcy5wYXRoLmlzYWJzKGJhc2UpOl0gICMgSWYgYWJzLCBjaG9wIG9mZiBsZWFkaW5nIC8KKyAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gc2VsZi5zcmNfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICAjIEJldHRlciB0byByYWlzZSBhbiBleGNlcHRpb24gaW5zdGVhZCBvZiBzaWxlbnRseSBjb250aW51aW5nCisgICAgICAgICAgICAgICAgIyBhbmQgbGF0ZXIgY29tcGxhaW4gYWJvdXQgc291cmNlcyBhbmQgdGFyZ2V0cyBoYXZpbmcKKyAgICAgICAgICAgICAgICAjIGRpZmZlcmVudCBsZW5ndGhzCisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yICgiRG9uJ3Qga25vdyBob3cgdG8gY29tcGlsZSAlcyIgJSBzcmNfbmFtZSkKKyAgICAgICAgICAgIGlmIHN0cmlwX2RpcjoKKyAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZSAoYmFzZSkKKyAgICAgICAgICAgIGlmIGV4dCBpbiBzZWxmLl9yY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIG9ial9uYW1lcy5hcHBlbmQgKG9zLnBhdGguam9pbiAob3V0cHV0X2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBzZWxmLnJlc19leHRlbnNpb24pKQorICAgICAgICAgICAgZWxpZiBleHQgaW4gc2VsZi5fbWNfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBvYmpfbmFtZXMuYXBwZW5kIChvcy5wYXRoLmpvaW4gKG91dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlICsgc2VsZi5yZXNfZXh0ZW5zaW9uKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb2JqX25hbWVzLmFwcGVuZCAob3MucGF0aC5qb2luIChvdXRwdXRfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIHNlbGYub2JqX2V4dGVuc2lvbikpCisgICAgICAgIHJldHVybiBvYmpfbmFtZXMKKworICAgICMgb2JqZWN0X2ZpbGVuYW1lcyAoKQorCisKKyAgICBkZWYgY29tcGlsZShzZWxmLCBzb3VyY2VzLAorICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9Tm9uZSwgbWFjcm9zPU5vbmUsIGluY2x1ZGVfZGlycz1Ob25lLCBkZWJ1Zz0wLAorICAgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgZGVwZW5kcz1Ob25lKToKKworICAgICAgICBpZiBub3Qgc2VsZi5pbml0aWFsaXplZDogc2VsZi5pbml0aWFsaXplKCkKKyAgICAgICAgbWFjcm9zLCBvYmplY3RzLCBleHRyYV9wb3N0YXJncywgcHBfb3B0cywgYnVpbGQgPSBcCisgICAgICAgICAgICAgICAgc2VsZi5fc2V0dXBfY29tcGlsZShvdXRwdXRfZGlyLCBtYWNyb3MsIGluY2x1ZGVfZGlycywgc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHMsIGV4dHJhX3Bvc3RhcmdzKQorCisgICAgICAgIGNvbXBpbGVfb3B0cyA9IGV4dHJhX3ByZWFyZ3Mgb3IgW10KKyAgICAgICAgY29tcGlsZV9vcHRzLmFwcGVuZCAoJy9jJykKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICBjb21waWxlX29wdHMuZXh0ZW5kKHNlbGYuY29tcGlsZV9vcHRpb25zX2RlYnVnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tcGlsZV9vcHRzLmV4dGVuZChzZWxmLmNvbXBpbGVfb3B0aW9ucykKKworICAgICAgICBmb3Igb2JqIGluIG9iamVjdHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3JjLCBleHQgPSBidWlsZFtvYmpdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICMgcGFzcyB0aGUgZnVsbCBwYXRobmFtZSB0byBNU1ZDIGluIGRlYnVnIG1vZGUsCisgICAgICAgICAgICAgICAgIyB0aGlzIGFsbG93cyB0aGUgZGVidWdnZXIgdG8gZmluZCB0aGUgc291cmNlIGZpbGUKKyAgICAgICAgICAgICAgICAjIHdpdGhvdXQgYXNraW5nIHRoZSB1c2VyIHRvIGJyb3dzZSBmb3IgaXQKKyAgICAgICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmFic3BhdGgoc3JjKQorCisgICAgICAgICAgICBpZiBleHQgaW4gc2VsZi5fY19leHRlbnNpb25zOgorICAgICAgICAgICAgICAgIGlucHV0X29wdCA9ICIvVGMiICsgc3JjCisgICAgICAgICAgICBlbGlmIGV4dCBpbiBzZWxmLl9jcHBfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICBpbnB1dF9vcHQgPSAiL1RwIiArIHNyYworICAgICAgICAgICAgZWxpZiBleHQgaW4gc2VsZi5fcmNfZXh0ZW5zaW9uczoKKyAgICAgICAgICAgICAgICAjIGNvbXBpbGUgLlJDIHRvIC5SRVMgZmlsZQorICAgICAgICAgICAgICAgIGlucHV0X29wdCA9IHNyYworICAgICAgICAgICAgICAgIG91dHB1dF9vcHQgPSAiL2ZvIiArIG9iagorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zcGF3biAoW3NlbGYucmNdICsgcHBfb3B0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvdXRwdXRfb3B0XSArIFtpbnB1dF9vcHRdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yLCBtc2cKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBleHQgaW4gc2VsZi5fbWNfZXh0ZW5zaW9uczoKKworICAgICAgICAgICAgICAgICMgQ29tcGlsZSAuTUMgdG8gLlJDIGZpbGUgdG8gLlJFUyBmaWxlLgorICAgICAgICAgICAgICAgICMgICAqICctaCBkaXInIHNwZWNpZmllcyB0aGUgZGlyZWN0b3J5IGZvciB0aGUKKyAgICAgICAgICAgICAgICAjICAgICBnZW5lcmF0ZWQgaW5jbHVkZSBmaWxlCisgICAgICAgICAgICAgICAgIyAgICogJy1yIGRpcicgc3BlY2lmaWVzIHRoZSB0YXJnZXQgZGlyZWN0b3J5IG9mIHRoZQorICAgICAgICAgICAgICAgICMgICAgIGdlbmVyYXRlZCBSQyBmaWxlIGFuZCB0aGUgYmluYXJ5IG1lc3NhZ2UgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAjICAgICBpdCBpbmNsdWRlcworICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIEZvciBub3cgKHNpbmNlIHRoZXJlIGFyZSBubyBvcHRpb25zIHRvIGNoYW5nZSB0aGlzKSwKKyAgICAgICAgICAgICAgICAjIHdlIHVzZSB0aGUgc291cmNlLWRpcmVjdG9yeSBmb3IgdGhlIGluY2x1ZGUgZmlsZSBhbmQKKyAgICAgICAgICAgICAgICAjIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIHRoZSBSQyBmaWxlIGFuZCBtZXNzYWdlCisgICAgICAgICAgICAgICAgIyByZXNvdXJjZXMuIFRoaXMgd29ya3MgYXQgbGVhc3QgZm9yIHdpbjMyYWxsLgorCisgICAgICAgICAgICAgICAgaF9kaXIgPSBvcy5wYXRoLmRpcm5hbWUgKHNyYykKKyAgICAgICAgICAgICAgICByY19kaXIgPSBvcy5wYXRoLmRpcm5hbWUgKG9iaikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgZmlyc3QgY29tcGlsZSAuTUMgdG8gLlJDIGFuZCAuSCBmaWxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLm1jXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnLWgnLCBoX2RpciwgJy1yJywgcmNfZGlyXSArIFtzcmNdKQorICAgICAgICAgICAgICAgICAgICBiYXNlLCBfID0gb3MucGF0aC5zcGxpdGV4dCAob3MucGF0aC5iYXNlbmFtZSAoc3JjKSkKKyAgICAgICAgICAgICAgICAgICAgcmNfZmlsZSA9IG9zLnBhdGguam9pbiAocmNfZGlyLCBiYXNlICsgJy5yYycpCisgICAgICAgICAgICAgICAgICAgICMgdGhlbiBjb21waWxlIC5SQyB0byAuUkVTIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zcGF3biAoW3NlbGYucmNdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIvZm8iICsgb2JqXSArIFtyY19maWxlXSkKKworICAgICAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQ29tcGlsZUVycm9yLCBtc2cKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGhvdyB0byBoYW5kbGUgdGhpcyBmaWxlPworICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciAoCisgICAgICAgICAgICAgICAgICAgICJEb24ndCBrbm93IGhvdyB0byBjb21waWxlICVzIHRvICVzIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgKHNyYywgb2JqKSkKKworICAgICAgICAgICAgb3V0cHV0X29wdCA9ICIvRm8iICsgb2JqCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3biAoW3NlbGYuY2NdICsgY29tcGlsZV9vcHRzICsgcHBfb3B0cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lucHV0X29wdCwgb3V0cHV0X29wdF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX3Bvc3RhcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisKKyAgICAgICAgcmV0dXJuIG9iamVjdHMKKworICAgICMgY29tcGlsZSAoKQorCisKKyAgICBkZWYgY3JlYXRlX3N0YXRpY19saWIgKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2xpYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Zz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X2xhbmc9Tm9uZSk6CisKKyAgICAgICAgaWYgbm90IHNlbGYuaW5pdGlhbGl6ZWQ6IHNlbGYuaW5pdGlhbGl6ZSgpCisgICAgICAgIChvYmplY3RzLCBvdXRwdXRfZGlyKSA9IHNlbGYuX2ZpeF9vYmplY3RfYXJncyAob2JqZWN0cywgb3V0cHV0X2RpcikKKyAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gXAorICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lIChvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1vdXRwdXRfZGlyKQorCisgICAgICAgIGlmIHNlbGYuX25lZWRfbGluayAob2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIGxpYl9hcmdzID0gb2JqZWN0cyArIFsnL09VVDonICsgb3V0cHV0X2ZpbGVuYW1lXQorICAgICAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAgICAgcGFzcyAgICAgICAgICAgICAgICAgICAgIyBYWFggd2hhdCBnb2VzIGhlcmU/CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zcGF3biAoW3NlbGYubGliXSArIGxpYl9hcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIExpYkVycm9yLCBtc2cKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyAlcyAodXAtdG8tZGF0ZSkiLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICAjIGNyZWF0ZV9zdGF0aWNfbGliICgpCisKKyAgICBkZWYgbGluayAoc2VsZiwKKyAgICAgICAgICAgICAgdGFyZ2V0X2Rlc2MsCisgICAgICAgICAgICAgIG9iamVjdHMsCisgICAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSwKKyAgICAgICAgICAgICAgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICAgICAgICBsaWJyYXJpZXM9Tm9uZSwKKyAgICAgICAgICAgICAgbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsCisgICAgICAgICAgICAgIGRlYnVnPTAsCisgICAgICAgICAgICAgIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgYnVpbGRfdGVtcD1Ob25lLAorICAgICAgICAgICAgICB0YXJnZXRfbGFuZz1Ob25lKToKKworICAgICAgICBpZiBub3Qgc2VsZi5pbml0aWFsaXplZDogc2VsZi5pbml0aWFsaXplKCkKKyAgICAgICAgKG9iamVjdHMsIG91dHB1dF9kaXIpID0gc2VsZi5fZml4X29iamVjdF9hcmdzIChvYmplY3RzLCBvdXRwdXRfZGlyKQorICAgICAgICAobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzKSA9IFwKKyAgICAgICAgICAgIHNlbGYuX2ZpeF9saWJfYXJncyAobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzKQorCisgICAgICAgIGlmIHJ1bnRpbWVfbGlicmFyeV9kaXJzOgorICAgICAgICAgICAgc2VsZi53YXJuICgiSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCAncnVudGltZV9saWJyYXJ5X2RpcnMnOiAiCisgICAgICAgICAgICAgICAgICAgICAgICsgc3RyIChydW50aW1lX2xpYnJhcnlfZGlycykpCisKKyAgICAgICAgbGliX29wdHMgPSBnZW5fbGliX29wdGlvbnMgKHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzKQorICAgICAgICBpZiBvdXRwdXRfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0cHV0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luIChvdXRwdXRfZGlyLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICAgICAgaWYgc2VsZi5fbmVlZF9saW5rIChvYmplY3RzLCBvdXRwdXRfZmlsZW5hbWUpOgorCisgICAgICAgICAgICBpZiB0YXJnZXRfZGVzYyA9PSBDQ29tcGlsZXIuRVhFQ1VUQUJMRToKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgbGRmbGFncyA9IHNlbGYubGRmbGFnc19zaGFyZWRfZGVidWdbMTpdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGRmbGFncyA9IHNlbGYubGRmbGFnc19zaGFyZWRbMTpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgICAgICBsZGZsYWdzID0gc2VsZi5sZGZsYWdzX3NoYXJlZF9kZWJ1ZworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxkZmxhZ3MgPSBzZWxmLmxkZmxhZ3Nfc2hhcmVkCisKKyAgICAgICAgICAgIGV4cG9ydF9vcHRzID0gW10KKyAgICAgICAgICAgIGZvciBzeW0gaW4gKGV4cG9ydF9zeW1ib2xzIG9yIFtdKToKKyAgICAgICAgICAgICAgICBleHBvcnRfb3B0cy5hcHBlbmQoIi9FWFBPUlQ6IiArIHN5bSkKKworICAgICAgICAgICAgbGRfYXJncyA9IChsZGZsYWdzICsgbGliX29wdHMgKyBleHBvcnRfb3B0cyArCisgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdHMgKyBbJy9PVVQ6JyArIG91dHB1dF9maWxlbmFtZV0pCisKKyAgICAgICAgICAgICMgVGhlIE1TVkMgbGlua2VyIGdlbmVyYXRlcyAubGliIGFuZCAuZXhwIGZpbGVzLCB3aGljaCBjYW5ub3QgYmUKKyAgICAgICAgICAgICMgc3VwcHJlc3NlZCBieSBhbnkgbGlua2VyIHN3aXRjaGVzLiBUaGUgLmxpYiBmaWxlcyBtYXkgZXZlbiBiZQorICAgICAgICAgICAgIyBuZWVkZWQhIE1ha2Ugc3VyZSB0aGV5IGFyZSBnZW5lcmF0ZWQgaW4gdGhlIHRlbXBvcmFyeSBidWlsZAorICAgICAgICAgICAgIyBkaXJlY3RvcnkuIFNpbmNlIHRoZXkgaGF2ZSBkaWZmZXJlbnQgbmFtZXMgZm9yIGRlYnVnIGFuZCByZWxlYXNlCisgICAgICAgICAgICAjIGJ1aWxkcywgdGhleSBjYW4gZ28gaW50byB0aGUgc2FtZSBkaXJlY3RvcnkuCisgICAgICAgICAgICBpZiBleHBvcnRfc3ltYm9scyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAoZGxsX25hbWUsIGRsbF9leHQpID0gb3MucGF0aC5zcGxpdGV4dCgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfZmlsZW5hbWUpKQorICAgICAgICAgICAgICAgIGltcGxpYl9maWxlID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUob2JqZWN0c1swXSksCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlicmFyeV9maWxlbmFtZShkbGxfbmFtZSkpCisgICAgICAgICAgICAgICAgbGRfYXJncy5hcHBlbmQgKCcvSU1QTElCOicgKyBpbXBsaWJfZmlsZSkKKworICAgICAgICAgICAgaWYgZXh0cmFfcHJlYXJnczoKKyAgICAgICAgICAgICAgICBsZF9hcmdzWzowXSA9IGV4dHJhX3ByZWFyZ3MKKyAgICAgICAgICAgIGlmIGV4dHJhX3Bvc3RhcmdzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3MuZXh0ZW5kKGV4dHJhX3Bvc3RhcmdzKQorCisgICAgICAgICAgICBzZWxmLm1rcGF0aCAob3MucGF0aC5kaXJuYW1lIChvdXRwdXRfZmlsZW5hbWUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24gKFtzZWxmLmxpbmtlcl0gKyBsZF9hcmdzKQorICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHJhaXNlIExpbmtFcnJvciwgbXNnCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZy5kZWJ1Zygic2tpcHBpbmcgJXMgKHVwLXRvLWRhdGUpIiwgb3V0cHV0X2ZpbGVuYW1lKQorCisgICAgIyBsaW5rICgpCisKKworICAgICMgLS0gTWlzY2VsbGFuZW91cyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUaGVzZSBhcmUgYWxsIHVzZWQgYnkgdGhlICdnZW5fbGliX29wdGlvbnMoKSBmdW5jdGlvbiwgaW4KKyAgICAjIGNjb21waWxlci5weS4KKworICAgIGRlZiBsaWJyYXJ5X2Rpcl9vcHRpb24gKHNlbGYsIGRpcik6CisgICAgICAgIHJldHVybiAiL0xJQlBBVEg6IiArIGRpcgorCisgICAgZGVmIHJ1bnRpbWVfbGlicmFyeV9kaXJfb3B0aW9uIChzZWxmLCBkaXIpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICJkb24ndCBrbm93IGhvdyB0byBzZXQgcnVudGltZSBsaWJyYXJ5IHNlYXJjaCBwYXRoIGZvciBNU1ZDKysiCisKKyAgICBkZWYgbGlicmFyeV9vcHRpb24gKHNlbGYsIGxpYik6CisgICAgICAgIHJldHVybiBzZWxmLmxpYnJhcnlfZmlsZW5hbWUgKGxpYikKKworCisgICAgZGVmIGZpbmRfbGlicmFyeV9maWxlIChzZWxmLCBkaXJzLCBsaWIsIGRlYnVnPTApOgorICAgICAgICAjIFByZWZlciBhIGRlYnVnZ2luZyBsaWJyYXJ5IGlmIGZvdW5kIChhbmQgcmVxdWVzdGVkKSwgYnV0IGRlYWwKKyAgICAgICAgIyB3aXRoIGl0IGlmIHdlIGRvbid0IGhhdmUgb25lLgorICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgIHRyeV9uYW1lcyA9IFtsaWIgKyAiX2QiLCBsaWJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnlfbmFtZXMgPSBbbGliXQorICAgICAgICBmb3IgZGlyIGluIGRpcnM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiB0cnlfbmFtZXM6CisgICAgICAgICAgICAgICAgbGliZmlsZSA9IG9zLnBhdGguam9pbihkaXIsIHNlbGYubGlicmFyeV9maWxlbmFtZSAobmFtZSkpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobGliZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaWJmaWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE9vcHMsIGRpZG4ndCBmaW5kIGl0IGluICphbnkqIG9mICdkaXJzJworICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgZmluZF9saWJyYXJ5X2ZpbGUgKCkKKworICAgICMgSGVscGVyIG1ldGhvZHMgZm9yIHVzaW5nIHRoZSBNU1ZDIHJlZ2lzdHJ5IHNldHRpbmdzCisKKyAgICBkZWYgZmluZF9leGUoc2VsZiwgZXhlKToKKyAgICAgICAgIiIiUmV0dXJuIHBhdGggdG8gYW4gTVNWQyBleGVjdXRhYmxlIHByb2dyYW0uCisKKyAgICAgICAgVHJpZXMgdG8gZmluZCB0aGUgcHJvZ3JhbSBpbiBzZXZlcmFsIHBsYWNlczogZmlyc3QsIG9uZSBvZiB0aGUKKyAgICAgICAgTVNWQyBwcm9ncmFtIHNlYXJjaCBwYXRocyBmcm9tIHRoZSByZWdpc3RyeTsgbmV4dCwgdGhlIGRpcmVjdG9yaWVzCisgICAgICAgIGluIHRoZSBQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgSWYgYW55IG9mIHRob3NlIHdvcmssIHJldHVybiBhbgorICAgICAgICBhYnNvbHV0ZSBwYXRoIHRoYXQgaXMga25vd24gdG8gZXhpc3QuICBJZiBub25lIG9mIHRoZW0gd29yaywganVzdAorICAgICAgICByZXR1cm4gdGhlIG9yaWdpbmFsIHByb2dyYW0gbmFtZSwgJ2V4ZScuCisgICAgICAgICIiIgorCisgICAgICAgIGZvciBwIGluIHNlbGYuX19wYXRoczoKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChwKSwgZXhlKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZm4pOgorICAgICAgICAgICAgICAgIHJldHVybiBmbgorCisgICAgICAgICMgZGlkbid0IGZpbmQgaXQ7IHRyeSBleGlzdGluZyBwYXRoCisgICAgICAgIGZvciBwIGluIHN0cmluZy5zcGxpdChvcy5lbnZpcm9uWydQYXRoJ10sJzsnKToKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChwKSxleGUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZuCisKKyAgICAgICAgcmV0dXJuIGV4ZQorCisgICAgZGVmIGdldF9tc3ZjX3BhdGhzKHNlbGYsIHBhdGgsIHBsYXRmb3JtPSd4ODYnKToKKyAgICAgICAgIiIiR2V0IGEgbGlzdCBvZiBkZXZzdHVkaW8gZGlyZWN0b3JpZXMgKGluY2x1ZGUsIGxpYiBvciBwYXRoKS4KKworICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIHN0cmluZ3MuICBUaGUgbGlzdCB3aWxsIGJlIGVtcHR5IGlmIHVuYWJsZSB0bworICAgICAgICBhY2Nlc3MgdGhlIHJlZ2lzdHJ5IG9yIGFwcHJvcHJpYXRlIHJlZ2lzdHJ5IGtleXMgbm90IGZvdW5kLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBub3QgX2Nhbl9yZWFkX3JlZzoKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIHBhdGggPSBwYXRoICsgIiBkaXJzIgorICAgICAgICBpZiBzZWxmLl9fdmVyc2lvbiA+PSA3OgorICAgICAgICAgICAga2V5ID0gKHIiJXNcJTAuMWZcVkNcVkNfT0JKRUNUU19QTEFURk9STV9JTkZPXFdpbjMyXERpcmVjdG9yaWVzIgorICAgICAgICAgICAgICAgICAgICUgKHNlbGYuX19yb290LCBzZWxmLl9fdmVyc2lvbikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrZXkgPSAociIlc1w2LjBcQnVpbGQgU3lzdGVtXENvbXBvbmVudHNcUGxhdGZvcm1zIgorICAgICAgICAgICAgICAgICAgIHIiXFdpbjMyICglcylcRGlyZWN0b3JpZXMiICUgKHNlbGYuX19yb290LCBwbGF0Zm9ybSkpCisKKyAgICAgICAgZm9yIGJhc2UgaW4gSEtFWVM6CisgICAgICAgICAgICBkID0gcmVhZF92YWx1ZXMoYmFzZSwga2V5KQorICAgICAgICAgICAgaWYgZDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9fdmVyc2lvbiA+PSA3OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nLnNwbGl0KHNlbGYuX19tYWNyb3Muc3ViKGRbcGF0aF0pLCAiOyIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdChkW3BhdGhdLCAiOyIpCisgICAgICAgICMgTVNWQyA2IHNlZW1zIHRvIGNyZWF0ZSB0aGUgcmVnaXN0cnkgZW50cmllcyB3ZSBuZWVkIG9ubHkgd2hlbgorICAgICAgICAjIHRoZSBHVUkgaXMgcnVuLgorICAgICAgICBpZiBzZWxmLl9fdmVyc2lvbiA9PSA2OgorICAgICAgICAgICAgZm9yIGJhc2UgaW4gSEtFWVM6CisgICAgICAgICAgICAgICAgaWYgcmVhZF92YWx1ZXMoYmFzZSwgciIlc1w2LjAiICUgc2VsZi5fX3Jvb3QpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndhcm4oIkl0IHNlZW1zIHlvdSBoYXZlIFZpc3VhbCBTdHVkaW8gNiBpbnN0YWxsZWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJidXQgdGhlIGV4cGVjdGVkIHJlZ2lzdHJ5IHNldHRpbmdzIGFyZSBub3QgcHJlc2VudC5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBhdCBsZWFzdCBydW4gdGhlIFZpc3VhbCBTdHVkaW8gR1VJIG9uY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNvIHRoYXQgdGhlc2UgZW50cmllcyBhcmUgY3JlYXRlZC4iKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gW10KKworICAgIGRlZiBzZXRfcGF0aF9lbnZfdmFyKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUgJ25hbWUnIHRvIGFuIE1TVkMgcGF0aCB0eXBlIHZhbHVlLgorCisgICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhIFNFVCBjb21tYW5kIHByaW9yIHRvIGV4ZWN1dGlvbiBvZiBzcGF3bmVkCisgICAgICAgIGNvbW1hbmRzLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBuYW1lID09ICJsaWIiOgorICAgICAgICAgICAgcCA9IHNlbGYuZ2V0X21zdmNfcGF0aHMoImxpYnJhcnkiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcCA9IHNlbGYuZ2V0X21zdmNfcGF0aHMobmFtZSkKKyAgICAgICAgaWYgcDoKKyAgICAgICAgICAgIG9zLmVudmlyb25bbmFtZV0gPSBzdHJpbmcuam9pbihwLCAnOycpCisKKworaWYgZ2V0X2J1aWxkX3ZlcnNpb24oKSA+PSA4LjA6CisgICAgbG9nLmRlYnVnKCJJbXBvcnRpbmcgbmV3IGNvbXBpbGVyIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIiKQorICAgIE9sZE1TVkNDb21waWxlciA9IE1TVkNDb21waWxlcgorICAgIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIgaW1wb3J0IE1TVkNDb21waWxlcgorICAgICMgZ2V0X2J1aWxkX2FyY2hpdGVjdHVyZSBub3QgcmVhbGx5IHJlbGV2YW50IG5vdyB3ZSBzdXBwb3J0IGNyb3NzLWNvbXBpbGUKKyAgICBmcm9tIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyIGltcG9ydCBNYWNyb0V4cGFuZGVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWM3MGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9tc3ZjY29tcGlsZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWM3MGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zcGF3bi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3NwYXduLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDYwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zcGF3bi5weQpAQCAtMCwwICsxLDE5OSBAQAorIiIiZGlzdHV0aWxzLnNwYXduCisKK1Byb3ZpZGVzIHRoZSAnc3Bhd24oKScgZnVuY3Rpb24sIGEgZnJvbnQtZW5kIHRvIHZhcmlvdXMgcGxhdGZvcm0tCitzcGVjaWZpYyBmdW5jdGlvbnMgZm9yIGxhdW5jaGluZyBhbm90aGVyIHByb2dyYW0gaW4gYSBzdWItcHJvY2Vzcy4KK0Fsc28gcHJvdmlkZXMgdGhlICdmaW5kX2V4ZWN1dGFibGUoKScgdG8gc2VhcmNoIHRoZSBwYXRoIGZvciBhIGdpdmVuCitleGVjdXRhYmxlIG5hbWUuCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIERpc3R1dGlsc0V4ZWNFcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitkZWYgc3Bhd24oY21kLCBzZWFyY2hfcGF0aD0xLCB2ZXJib3NlPTAsIGRyeV9ydW49MCk6CisgICAgIiIiUnVuIGFub3RoZXIgcHJvZ3JhbSwgc3BlY2lmaWVkIGFzIGEgY29tbWFuZCBsaXN0ICdjbWQnLCBpbiBhIG5ldyBwcm9jZXNzLgorCisgICAgJ2NtZCcgaXMganVzdCB0aGUgYXJndW1lbnQgbGlzdCBmb3IgdGhlIG5ldyBwcm9jZXNzLCBpZS4KKyAgICBjbWRbMF0gaXMgdGhlIHByb2dyYW0gdG8gcnVuIGFuZCBjbWRbMTpdIGFyZSB0aGUgcmVzdCBvZiBpdHMgYXJndW1lbnRzLgorICAgIFRoZXJlIGlzIG5vIHdheSB0byBydW4gYSBwcm9ncmFtIHdpdGggYSBuYW1lIGRpZmZlcmVudCBmcm9tIHRoYXQgb2YgaXRzCisgICAgZXhlY3V0YWJsZS4KKworICAgIElmICdzZWFyY2hfcGF0aCcgaXMgdHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgc3lzdGVtJ3MgZXhlY3V0YWJsZQorICAgIHNlYXJjaCBwYXRoIHdpbGwgYmUgdXNlZCB0byBmaW5kIHRoZSBwcm9ncmFtOyBvdGhlcndpc2UsIGNtZFswXQorICAgIG11c3QgYmUgdGhlIGV4YWN0IHBhdGggdG8gdGhlIGV4ZWN1dGFibGUuICBJZiAnZHJ5X3J1bicgaXMgdHJ1ZSwKKyAgICB0aGUgY29tbWFuZCB3aWxsIG5vdCBhY3R1YWxseSBiZSBydW4uCisKKyAgICBSYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IgaWYgcnVubmluZyB0aGUgcHJvZ3JhbSBmYWlscyBpbiBhbnkgd2F5OyBqdXN0CisgICAgcmV0dXJuIG9uIHN1Y2Nlc3MuCisgICAgIiIiCisgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICBfc3Bhd25fcG9zaXgoY21kLCBzZWFyY2hfcGF0aCwgZHJ5X3J1bj1kcnlfcnVuKQorICAgIGVsaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICBfc3Bhd25fbnQoY21kLCBzZWFyY2hfcGF0aCwgZHJ5X3J1bj1kcnlfcnVuKQorICAgIGVsaWYgb3MubmFtZSA9PSAnb3MyJzoKKyAgICAgICAgX3NwYXduX29zMihjbWQsIHNlYXJjaF9wYXRoLCBkcnlfcnVuPWRyeV9ydW4pCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgXAorICAgICAgICAgICAgICAiZG9uJ3Qga25vdyBob3cgdG8gc3Bhd24gcHJvZ3JhbXMgb24gcGxhdGZvcm0gJyVzJyIgJSBvcy5uYW1lCisKK2RlZiBfbnRfcXVvdGVfYXJncyhhcmdzKToKKyAgICAiIiJRdW90ZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciBET1MvV2luZG93cyBjb252ZW50aW9ucy4KKworICAgIEp1c3Qgd3JhcHMgZXZlcnkgYXJndW1lbnQgd2hpY2ggY29udGFpbnMgYmxhbmtzIGluIGRvdWJsZSBxdW90ZXMsIGFuZAorICAgIHJldHVybnMgYSBuZXcgYXJndW1lbnQgbGlzdC4KKyAgICAiIiIKKyAgICAjIFhYWCB0aGlzIGRvZXNuJ3Qgc2VlbSB2ZXJ5IHJvYnVzdCB0byBtZSAtLSBidXQgaWYgdGhlIFdpbmRvd3MgZ3V5cworICAgICMgc2F5IGl0J2xsIHdvcmssIEkgZ3Vlc3MgSSdsbCBoYXZlIHRvIGFjY2VwdCBpdC4gIChXaGF0IGlmIGFuIGFyZworICAgICMgY29udGFpbnMgcXVvdGVzPyAgV2hhdCBvdGhlciBtYWdpYyBjaGFyYWN0ZXJzLCBvdGhlciB0aGFuIHNwYWNlcywKKyAgICAjIGhhdmUgdG8gYmUgZXNjYXBlZD8gIElzIHRoZXJlIGFuIGVzY2FwaW5nIG1lY2hhbmlzbSBvdGhlciB0aGFuCisgICAgIyBxdW90aW5nPykKKyAgICBmb3IgaSwgYXJnIGluIGVudW1lcmF0ZShhcmdzKToKKyAgICAgICAgaWYgJyAnIGluIGFyZzoKKyAgICAgICAgICAgIGFyZ3NbaV0gPSAnIiVzIicgJSBhcmcKKyAgICByZXR1cm4gYXJncworCitkZWYgX3NwYXduX250KGNtZCwgc2VhcmNoX3BhdGg9MSwgdmVyYm9zZT0wLCBkcnlfcnVuPTApOgorICAgIGV4ZWN1dGFibGUgPSBjbWRbMF0KKyAgICBjbWQgPSBfbnRfcXVvdGVfYXJncyhjbWQpCisgICAgaWYgc2VhcmNoX3BhdGg6CisgICAgICAgICMgZWl0aGVyIHdlIGZpbmQgb25lIG9yIGl0IHN0YXlzIHRoZSBzYW1lCisgICAgICAgIGV4ZWN1dGFibGUgPSBmaW5kX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSkgb3IgZXhlY3V0YWJsZQorICAgIGxvZy5pbmZvKCcgJy5qb2luKFtleGVjdXRhYmxlXSArIGNtZFsxOl0pKQorICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAjIHNwYXduIGZvciBOVCByZXF1aXJlcyBhIGZ1bGwgcGF0aCB0byB0aGUgLmV4ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICByYyA9IG9zLnNwYXdudihvcy5QX1dBSVQsIGV4ZWN1dGFibGUsIGNtZCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICMgdGhpcyBzZWVtcyB0byBoYXBwZW4gd2hlbiB0aGUgY29tbWFuZCBpc24ndCBmb3VuZAorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAiY29tbWFuZCAnJXMnIGZhaWxlZDogJXMiICUgKGNtZFswXSwgZXhjWy0xXSkKKyAgICAgICAgaWYgcmMgIT0gMDoKKyAgICAgICAgICAgICMgYW5kIHRoaXMgcmVmbGVjdHMgdGhlIGNvbW1hbmQgcnVubmluZyBidXQgZmFpbGluZworICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAiY29tbWFuZCAnJXMnIGZhaWxlZCB3aXRoIGV4aXQgc3RhdHVzICVkIiAlIChjbWRbMF0sIHJjKQorCitkZWYgX3NwYXduX29zMihjbWQsIHNlYXJjaF9wYXRoPTEsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wKToKKyAgICBleGVjdXRhYmxlID0gY21kWzBdCisgICAgaWYgc2VhcmNoX3BhdGg6CisgICAgICAgICMgZWl0aGVyIHdlIGZpbmQgb25lIG9yIGl0IHN0YXlzIHRoZSBzYW1lCisgICAgICAgIGV4ZWN1dGFibGUgPSBmaW5kX2V4ZWN1dGFibGUoZXhlY3V0YWJsZSkgb3IgZXhlY3V0YWJsZQorICAgIGxvZy5pbmZvKCcgJy5qb2luKFtleGVjdXRhYmxlXSArIGNtZFsxOl0pKQorICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAjIHNwYXdudiBmb3IgT1MvMiBFTVggcmVxdWlyZXMgYSBmdWxsIHBhdGggdG8gdGhlIC5leGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmMgPSBvcy5zcGF3bnYob3MuUF9XQUlULCBleGVjdXRhYmxlLCBjbWQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBleGM6CisgICAgICAgICAgICAjIHRoaXMgc2VlbXMgdG8gaGFwcGVuIHdoZW4gdGhlIGNvbW1hbmQgaXNuJ3QgZm91bmQKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQ6ICVzIiAlIChjbWRbMF0sIGV4Y1stMV0pCisgICAgICAgIGlmIHJjICE9IDA6CisgICAgICAgICAgICAjIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSBjb21tYW5kIHJ1bm5pbmcgYnV0IGZhaWxpbmcKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiY29tbWFuZCAnJXMnIGZhaWxlZCB3aXRoIGV4aXQgc3RhdHVzICVkIiAlIChjbWRbMF0sIHJjKSkKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQgd2l0aCBleGl0IHN0YXR1cyAlZCIgJSAoY21kWzBdLCByYykKKworaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgIGZyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKKyAgICBfY2ZnX3RhcmdldCA9IE5vbmUKKyAgICBfY2ZnX3RhcmdldF9zcGxpdCA9IE5vbmUKKworZGVmIF9zcGF3bl9wb3NpeChjbWQsIHNlYXJjaF9wYXRoPTEsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wKToKKyAgICBsb2cuaW5mbygnICcuam9pbihjbWQpKQorICAgIGlmIGRyeV9ydW46CisgICAgICAgIHJldHVybgorICAgIGV4ZWNfZm4gPSBzZWFyY2hfcGF0aCBhbmQgb3MuZXhlY3ZwIG9yIG9zLmV4ZWN2CisgICAgZXhlY19hcmdzID0gW2NtZFswXSwgY21kXQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgZ2xvYmFsIF9jZmdfdGFyZ2V0LCBfY2ZnX3RhcmdldF9zcGxpdAorICAgICAgICBpZiBfY2ZnX3RhcmdldCBpcyBOb25lOgorICAgICAgICAgICAgX2NmZ190YXJnZXQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpIG9yICcnCisgICAgICAgICAgICBpZiBfY2ZnX3RhcmdldDoKKyAgICAgICAgICAgICAgICBfY2ZnX3RhcmdldF9zcGxpdCA9IFtpbnQoeCkgZm9yIHggaW4gX2NmZ190YXJnZXQuc3BsaXQoJy4nKV0KKyAgICAgICAgaWYgX2NmZ190YXJnZXQ6CisgICAgICAgICAgICAjIGVuc3VyZSB0aGF0IHRoZSBkZXBsb3ltZW50IHRhcmdldCBvZiBidWlsZCBwcm9jZXNzIGlzIG5vdCBsZXNzCisgICAgICAgICAgICAjIHRoYW4gdGhhdCB1c2VkIHdoZW4gdGhlIGludGVycHJldGVyIHdhcyBidWlsdC4gVGhpcyBlbnN1cmVzCisgICAgICAgICAgICAjIGV4dGVuc2lvbiBtb2R1bGVzIGFyZSBidWlsdCB3aXRoIGNvcnJlY3QgY29tcGF0aWJpbGl0eSB2YWx1ZXMKKyAgICAgICAgICAgIGN1cl90YXJnZXQgPSBvcy5lbnZpcm9uLmdldCgnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJywgX2NmZ190YXJnZXQpCisgICAgICAgICAgICBpZiBfY2ZnX3RhcmdldF9zcGxpdCA+IFtpbnQoeCkgZm9yIHggaW4gY3VyX3RhcmdldC5zcGxpdCgnLicpXToKKyAgICAgICAgICAgICAgICBteV9tc2cgPSAoJyRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgbWlzbWF0Y2g6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdyAiJXMiIGJ1dCAiJXMiIGR1cmluZyBjb25maWd1cmUnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGN1cl90YXJnZXQsIF9jZmdfdGFyZ2V0KSkKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKKyAgICAgICAgICAgIGVudiA9IGRpY3Qob3MuZW52aXJvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUPWN1cl90YXJnZXQpCisgICAgICAgICAgICBleGVjX2ZuID0gc2VhcmNoX3BhdGggYW5kIG9zLmV4ZWN2cGUgb3Igb3MuZXhlY3ZlCisgICAgICAgICAgICBleGVjX2FyZ3MuYXBwZW5kKGVudikKKyAgICBwaWQgPSBvcy5mb3JrKCkKKworICAgIGlmIHBpZCA9PSAwOiAgIyBpbiB0aGUgY2hpbGQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlY19mbigqZXhlY19hcmdzKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInVuYWJsZSB0byBleGVjdXRlICVzOiAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbWRbMF0sIGUuc3RyZXJyb3IpKQorICAgICAgICAgICAgb3MuX2V4aXQoMSkKKworICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJ1bmFibGUgdG8gZXhlY3V0ZSAlcyBmb3IgdW5rbm93biByZWFzb25zIiAlIGNtZFswXSkKKyAgICAgICAgb3MuX2V4aXQoMSkKKyAgICBlbHNlOiAgICMgaW4gdGhlIHBhcmVudAorICAgICAgICAjIExvb3AgdW50aWwgdGhlIGNoaWxkIGVpdGhlciBleGl0cyBvciBpcyB0ZXJtaW5hdGVkIGJ5IGEgc2lnbmFsCisgICAgICAgICMgKGllLiBrZWVwIHdhaXRpbmcgaWYgaXQncyBtZXJlbHkgc3RvcHBlZCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICBpbXBvcnQgZXJybm8KKyAgICAgICAgICAgICAgICBpZiBleGMuZXJybm8gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXhlY0Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQ6ICVzIiAlIChjbWRbMF0sIGV4Y1stMV0pCisgICAgICAgICAgICBpZiBvcy5XSUZTSUdOQUxFRChzdGF0dXMpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJjb21tYW5kICclcycgdGVybWluYXRlZCBieSBzaWduYWwgJWQiICUgXAorICAgICAgICAgICAgICAgICAgICAgIChjbWRbMF0sIG9zLldURVJNU0lHKHN0YXR1cykpCisKKyAgICAgICAgICAgIGVsaWYgb3MuV0lGRVhJVEVEKHN0YXR1cyk6CisgICAgICAgICAgICAgICAgZXhpdF9zdGF0dXMgPSBvcy5XRVhJVFNUQVRVUyhzdGF0dXMpCisgICAgICAgICAgICAgICAgaWYgZXhpdF9zdGF0dXMgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAgIyBoZXksIGl0IHN1Y2NlZWRlZCEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFeGVjRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmQgJyVzJyBmYWlsZWQgd2l0aCBleGl0IHN0YXR1cyAlZCIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjbWRbMF0sIGV4aXRfc3RhdHVzKQorCisgICAgICAgICAgICBlbGlmIG9zLldJRlNUT1BQRUQoc3RhdHVzKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0V4ZWNFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIGVycm9yIGV4ZWN1dGluZyAnJXMnOiB0ZXJtaW5hdGlvbiBzdGF0dXMgJWQiICUgXAorICAgICAgICAgICAgICAgICAgICAgIChjbWRbMF0sIHN0YXR1cykKKworZGVmIGZpbmRfZXhlY3V0YWJsZShleGVjdXRhYmxlLCBwYXRoPU5vbmUpOgorICAgICIiIlRyaWVzIHRvIGZpbmQgJ2V4ZWN1dGFibGUnIGluIHRoZSBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gJ3BhdGgnLgorCisgICAgQSBzdHJpbmcgbGlzdGluZyBkaXJlY3RvcmllcyBzZXBhcmF0ZWQgYnkgJ29zLnBhdGhzZXAnOyBkZWZhdWx0cyB0bworICAgIG9zLmVudmlyb25bJ1BBVEgnXS4gIFJldHVybnMgdGhlIGNvbXBsZXRlIGZpbGVuYW1lIG9yIE5vbmUgaWYgbm90IGZvdW5kLgorICAgICIiIgorICAgIGlmIHBhdGggaXMgTm9uZToKKyAgICAgICAgcGF0aCA9IG9zLmVudmlyb25bJ1BBVEgnXQorICAgIHBhdGhzID0gcGF0aC5zcGxpdChvcy5wYXRoc2VwKQorICAgIGJhc2UsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZXhlY3V0YWJsZSkKKworICAgIGlmIChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciBvcy5uYW1lID09ICdvczInKSBhbmQgKGV4dCAhPSAnLmV4ZScpOgorICAgICAgICBleGVjdXRhYmxlID0gZXhlY3V0YWJsZSArICcuZXhlJworCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKGV4ZWN1dGFibGUpOgorICAgICAgICBmb3IgcCBpbiBwYXRoczoKKyAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4ocCwgZXhlY3V0YWJsZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGYpOgorICAgICAgICAgICAgICAgICMgdGhlIGZpbGUgZXhpc3RzLCB3ZSBoYXZlIGEgc2hvdCBhdCBzcGF3biB3b3JraW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZXhlY3V0YWJsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWJkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zcGF3bi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3Bhd24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YWJkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zcGF3bi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3lzY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3lzY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxODBjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy9zeXNjb25maWcucHkKQEAgLTAsMCArMSw0OTQgQEAKKyIiIlByb3ZpZGUgYWNjZXNzIHRvIFB5dGhvbidzIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICBUaGUgc3BlY2lmaWMKK2NvbmZpZ3VyYXRpb24gdmFyaWFibGVzIGF2YWlsYWJsZSBkZXBlbmQgaGVhdmlseSBvbiB0aGUgcGxhdGZvcm0gYW5kCitjb25maWd1cmF0aW9uLiAgVGhlIHZhbHVlcyBtYXkgYmUgcmV0cmlldmVkIHVzaW5nCitnZXRfY29uZmlnX3ZhcihuYW1lKSwgYW5kIHRoZSBsaXN0IG9mIHZhcmlhYmxlcyBpcyBhdmFpbGFibGUgdmlhCitnZXRfY29uZmlnX3ZhcnMoKS5rZXlzKCkuICBBZGRpdGlvbmFsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyBhcmUgYWxzbworYXZhaWxhYmxlLgorCitXcml0dGVuIGJ5OiAgIEZyZWQgTC4gRHJha2UsIEpyLgorRW1haWw6ICAgICAgICA8ZmRyYWtlQGFjbS5vcmc+CisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgc3lzCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorCisjIFRoZXNlIGFyZSBuZWVkZWQgaW4gYSBjb3VwbGUgb2Ygc3BvdHMsIHNvIGp1c3QgY29tcHV0ZSB0aGVtIG9uY2UuCitQUkVGSVggPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5wcmVmaXgpCitFWEVDX1BSRUZJWCA9IG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWNfcHJlZml4KQorCisjIFBhdGggdG8gdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBwcm9qZWN0LiBPbiBXaW5kb3dzIHRoZSBiaW5hcnkgbWF5CisjIGxpdmUgaW4gcHJvamVjdC9QQ0J1aWxkOS4gIElmIHdlJ3JlIGRlYWxpbmcgd2l0aCBhbiB4NjQgV2luZG93cyBidWlsZCwKKyMgaXQnbGwgbGl2ZSBpbiBwcm9qZWN0L1BDYnVpbGQvYW1kNjQuCitwcm9qZWN0X2Jhc2UgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKSkKK2lmIG9zLm5hbWUgPT0gIm50IiBhbmQgInBjYnVpbGQiIGluIHByb2plY3RfYmFzZVstODpdLmxvd2VyKCk6CisgICAgcHJvamVjdF9iYXNlID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihwcm9qZWN0X2Jhc2UsIG9zLnBhdGgucGFyZGlyKSkKKyMgUEMvVlM3LjEKK2lmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNcXHYiIGluIHByb2plY3RfYmFzZVstMTA6XS5sb3dlcigpOgorICAgIHByb2plY3RfYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ocHJvamVjdF9iYXNlLCBvcy5wYXRoLnBhcmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgucGFyZGlyKSkKKyMgUEMvQU1ENjQKK2lmIG9zLm5hbWUgPT0gIm50IiBhbmQgIlxccGNidWlsZFxcYW1kNjQiIGluIHByb2plY3RfYmFzZVstMTQ6XS5sb3dlcigpOgorICAgIHByb2plY3RfYmFzZSA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ocHJvamVjdF9iYXNlLCBvcy5wYXRoLnBhcmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgucGFyZGlyKSkKKworIyBzZXQgZm9yIGNyb3NzIGJ1aWxkcworaWYgIl9QWVRIT05fUFJPSkVDVF9CQVNFIiBpbiBvcy5lbnZpcm9uOgorICAgICMgdGhpcyBpcyB0aGUgYnVpbGQgZGlyZWN0b3J5LCBhdCBsZWFzdCBmb3IgcG9zaXgKKyAgICBwcm9qZWN0X2Jhc2UgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLmVudmlyb25bIl9QWVRIT05fUFJPSkVDVF9CQVNFIl0pCisKKyMgcHl0aG9uX2J1aWxkOiAoQm9vbGVhbikgaWYgdHJ1ZSwgd2UncmUgZWl0aGVyIGJ1aWxkaW5nIFB5dGhvbiBvcgorIyBidWlsZGluZyBhbiBleHRlbnNpb24gd2l0aCBhbiB1bi1pbnN0YWxsZWQgUHl0aG9uLCBzbyB3ZSB1c2UKKyMgZGlmZmVyZW50IChoYXJkLXdpcmVkKSBkaXJlY3Rvcmllcy4KKyMgU2V0dXAubG9jYWwgaXMgYXZhaWxhYmxlIGZvciBNYWtlZmlsZSBidWlsZHMgaW5jbHVkaW5nIFZQQVRIIGJ1aWxkcywKKyMgU2V0dXAuZGlzdCBpcyBhdmFpbGFibGUgb24gV2luZG93cworZGVmIF9weXRob25fYnVpbGQoKToKKyAgICBmb3IgZm4gaW4gKCJTZXR1cC5kaXN0IiwgIlNldHVwLmxvY2FsIik6CisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwcm9qZWN0X2Jhc2UsICJNb2R1bGVzIiwgZm4pKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCitweXRob25fYnVpbGQgPSBfcHl0aG9uX2J1aWxkKCkKKworCitkZWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCk6CisgICAgIiIiUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG1ham9yIGFuZCBtaW5vciBQeXRob24gdmVyc2lvbiwKKyAgICBsZWF2aW5nIG9mZiB0aGUgcGF0Y2hsZXZlbC4gIFNhbXBsZSByZXR1cm4gdmFsdWVzIGNvdWxkIGJlICcxLjUnCisgICAgb3IgJzIuMicuCisgICAgIiIiCisgICAgcmV0dXJuIHN5cy52ZXJzaW9uWzozXQorCisKK2RlZiBnZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTAsIHByZWZpeD1Ob25lKToKKyAgICAiIiJSZXR1cm4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGluc3RhbGxlZCBQeXRob24gaGVhZGVyIGZpbGVzLgorCisgICAgSWYgJ3BsYXRfc3BlY2lmaWMnIGlzIGZhbHNlICh0aGUgZGVmYXVsdCksIHRoaXMgaXMgdGhlIHBhdGggdG8gdGhlCisgICAgbm9uLXBsYXRmb3JtLXNwZWNpZmljIGhlYWRlciBmaWxlcywgaS5lLiBQeXRob24uaCBhbmQgc28gb247CisgICAgb3RoZXJ3aXNlLCB0aGlzIGlzIHRoZSBwYXRoIHRvIHBsYXRmb3JtLXNwZWNpZmljIGhlYWRlciBmaWxlcworICAgIChuYW1lbHkgcHljb25maWcuaCkuCisKKyAgICBJZiAncHJlZml4JyBpcyBzdXBwbGllZCwgdXNlIGl0IGluc3RlYWQgb2Ygc3lzLnByZWZpeCBvcgorICAgIHN5cy5leGVjX3ByZWZpeCAtLSBpLmUuLCBpZ25vcmUgJ3BsYXRfc3BlY2lmaWMnLgorICAgICIiIgorICAgIGlmIHByZWZpeCBpcyBOb25lOgorICAgICAgICBwcmVmaXggPSBwbGF0X3NwZWNpZmljIGFuZCBFWEVDX1BSRUZJWCBvciBQUkVGSVgKKworICAgICMgR0NDKG1pbmd3KTogb3MubmFtZSBpcyAibnQiIGJ1dCBidWlsZCBzeXN0ZW0gaXMgcG9zaXgKKyAgICBpZiBvcy5uYW1lID09ICJwb3NpeCIgb3Igc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPj0gMDoKKyAgICAgICAgaWYgcHl0aG9uX2J1aWxkOgorICAgICAgICAgICAgIyBOT1RFOiBzeXNjb25maWcucHktMjAwOTEyMTAKKyAgICAgICAgICAgICMgQXNzdW1lIHRoZSBleGVjdXRhYmxlIGlzIGluIHRoZSBidWlsZCBkaXJlY3RvcnkuICBUaGUKKyAgICAgICAgICAgICMgcHljb25maWcuaCBmaWxlIHNob3VsZCBiZSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuICBTaW5jZQorICAgICAgICAgICAgIyB0aGUgYnVpbGQgZGlyZWN0b3J5IG1heSBub3QgYmUgdGhlIHNvdXJjZSBkaXJlY3RvcnksIHdlCisgICAgICAgICAgICAjIG11c3QgdXNlICJzcmNkaXIiIGZyb20gdGhlIG1ha2VmaWxlIHRvIGZpbmQgdGhlICJJbmNsdWRlIgorICAgICAgICAgICAgIyBkaXJlY3RvcnkuCisgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChzeXMuZXhlY3V0YWJsZSkpCisgICAgICAgICAgICBpZiBwbGF0X3NwZWNpZmljOgorICAgICAgICAgICAgICAgIHJldHVybiBiYXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGluY2RpciA9IG9zLnBhdGguam9pbihnZXRfY29uZmlnX3Zhcignc3JjZGlyJyksICdJbmNsdWRlJykKKyAgICAgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5ub3JtcGF0aChpbmNkaXIpCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocHJlZml4LCAiaW5jbHVkZSIsICJweXRob24iICsgZ2V0X3B5dGhvbl92ZXJzaW9uKCkpCisgICAgZWxpZiBvcy5uYW1lID09ICJudCI6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocHJlZml4LCAiaW5jbHVkZSIpCisgICAgZWxpZiBvcy5uYW1lID09ICJvczIiOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCwgIkluY2x1ZGUiKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCisgICAgICAgICAgICAiSSBkb24ndCBrbm93IHdoZXJlIFB5dGhvbiBpbnN0YWxscyBpdHMgQyBoZWFkZXIgZmlsZXMgIgorICAgICAgICAgICAgIm9uIHBsYXRmb3JtICclcyciICUgb3MubmFtZSkKKworCitkZWYgZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0wLCBzdGFuZGFyZF9saWI9MCwgcHJlZml4PU5vbmUpOgorICAgICIiIlJldHVybiB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIFB5dGhvbiBsaWJyYXJ5IChzdGFuZGFyZCBvcgorICAgIHNpdGUgYWRkaXRpb25zKS4KKworICAgIElmICdwbGF0X3NwZWNpZmljJyBpcyB0cnVlLCByZXR1cm4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nCisgICAgcGxhdGZvcm0tc3BlY2lmaWMgbW9kdWxlcywgaS5lLiBhbnkgbW9kdWxlIGZyb20gYSBub24tcHVyZS1QeXRob24KKyAgICBtb2R1bGUgZGlzdHJpYnV0aW9uOyBvdGhlcndpc2UsIHJldHVybiB0aGUgcGxhdGZvcm0tc2hhcmVkIGxpYnJhcnkKKyAgICBkaXJlY3RvcnkuICBJZiAnc3RhbmRhcmRfbGliJyBpcyB0cnVlLCByZXR1cm4gdGhlIGRpcmVjdG9yeQorICAgIGNvbnRhaW5pbmcgc3RhbmRhcmQgUHl0aG9uIGxpYnJhcnkgbW9kdWxlczsgb3RoZXJ3aXNlLCByZXR1cm4gdGhlCisgICAgZGlyZWN0b3J5IGZvciBzaXRlLXNwZWNpZmljIG1vZHVsZXMuCisKKyAgICBJZiAncHJlZml4JyBpcyBzdXBwbGllZCwgdXNlIGl0IGluc3RlYWQgb2Ygc3lzLnByZWZpeCBvcgorICAgIHN5cy5leGVjX3ByZWZpeCAtLSBpLmUuLCBpZ25vcmUgJ3BsYXRfc3BlY2lmaWMnLgorICAgICIiIgorICAgIGlmIHByZWZpeCBpcyBOb25lOgorICAgICAgICBwcmVmaXggPSBwbGF0X3NwZWNpZmljIGFuZCBFWEVDX1BSRUZJWCBvciBQUkVGSVgKKworICAgIGlmIG9zLm5hbWUgPT0gInBvc2l4IiBvciBzeXMudmVyc2lvbi5maW5kKCdHQ0MnKSA+PSAwOgorICAgICAgICBsaWJweXRob24gPSBvcy5wYXRoLmpvaW4ocHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpYiIsICJweXRob24iICsgZ2V0X3B5dGhvbl92ZXJzaW9uKCkpCisgICAgICAgIGlmIHN0YW5kYXJkX2xpYjoKKyAgICAgICAgICAgIHJldHVybiBsaWJweXRob24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4obGlicHl0aG9uLCAic2l0ZS1wYWNrYWdlcyIpCisKKyAgICBlbGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgaWYgc3RhbmRhcmRfbGliOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihwcmVmaXgsICJMaWIiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCkgPCAiMi4yIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJlZml4CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocHJlZml4LCAiTGliIiwgInNpdGUtcGFja2FnZXMiKQorCisgICAgZWxpZiBvcy5uYW1lID09ICJvczIiOgorICAgICAgICBpZiBzdGFuZGFyZF9saWI6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIsICJzaXRlLXBhY2thZ2VzIikKKworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IoCisgICAgICAgICAgICAiSSBkb24ndCBrbm93IHdoZXJlIFB5dGhvbiBpbnN0YWxscyBpdHMgbGlicmFyeSAiCisgICAgICAgICAgICAib24gcGxhdGZvcm0gJyVzJyIgJSBvcy5uYW1lKQorCisKKworZGVmIGN1c3RvbWl6ZV9jb21waWxlcihjb21waWxlcik6CisgICAgIiIiRG8gYW55IHBsYXRmb3JtLXNwZWNpZmljIGN1c3RvbWl6YXRpb24gb2YgYSBDQ29tcGlsZXIgaW5zdGFuY2UuCisKKyAgICBNYWlubHkgbmVlZGVkIG9uIFVuaXgsIHNvIHdlIGNhbiBwbHVnIGluIHRoZSBpbmZvcm1hdGlvbiB0aGF0CisgICAgdmFyaWVzIGFjcm9zcyBVbmljZXMgYW5kIGlzIHN0b3JlZCBpbiBQeXRob24ncyBNYWtlZmlsZS4KKworICAgIE5PVEU6IChrbm93biBsaW1pdGF0aW9uIG9mIHB5dGhvbiBidWlsZC9pbnN0YWxsIHN5c3RlbSkKKyAgICBJbiBjcm9zcy1idWlsZCBlbnZpcm9ubWVudCBtYWtlIG1hY3JvcyBsaWtlIENDIGFuZCBMRFNIQVJFRAorICAgIGNvbnRhaW4gY3Jvc3MtY29tcGlsZXIvbGlua2VyIGluc3RlYWQgb2YgaG9zdCBjb21waWxlci9saW5rZXIuCisgICAgIiIiCisgICAgcG9zaXhfYnVpbGQgPSBOb25lCisgICAgaWYgY29tcGlsZXIuY29tcGlsZXJfdHlwZSA9PSAidW5peCI6CisgICAgICAgcG9zaXhfYnVpbGQgPSBUcnVlCisgICAgZWxpZiBjb21waWxlci5jb21waWxlcl90eXBlID09ICJtaW5ndzMyIjoKKyAgICAgICAgaWYgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPj0gMDoKKyAgICAgICAgICAgIHBvc2l4X2J1aWxkID0gVHJ1ZQorICAgIGlmIHBvc2l4X2J1aWxkID09IFRydWU6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICMgUGVyZm9ybSBmaXJzdC10aW1lIGN1c3RvbWl6YXRpb24gb2YgY29tcGlsZXItcmVsYXRlZAorICAgICAgICAgICAgIyBjb25maWcgdmFycyBvbiBPUyBYIG5vdyB0aGF0IHdlIGtub3cgd2UgbmVlZCBhIGNvbXBpbGVyLgorICAgICAgICAgICAgIyBUaGlzIGlzIHByaW1hcmlseSB0byBzdXBwb3J0IFB5dGhvbnMgZnJvbSBiaW5hcnkKKyAgICAgICAgICAgICMgaW5zdGFsbGVycy4gIFRoZSBraW5kIGFuZCBwYXRocyB0byBidWlsZCB0b29scyBvbgorICAgICAgICAgICAgIyB0aGUgdXNlciBzeXN0ZW0gbWF5IHZhcnkgc2lnbmlmaWNhbnRseSBmcm9tIHRoZSBzeXN0ZW0KKyAgICAgICAgICAgICMgdGhhdCBQeXRob24gaXRzZWxmIHdhcyBidWlsdCBvbi4gIEFsc28gdGhlIHVzZXIgT1MKKyAgICAgICAgICAgICMgdmVyc2lvbiBhbmQgYnVpbGQgdG9vbHMgbWF5IG5vdCBzdXBwb3J0IHRoZSBzYW1lIHNldAorICAgICAgICAgICAgIyBvZiBDUFUgYXJjaGl0ZWN0dXJlcyBmb3IgdW5pdmVyc2FsIGJ1aWxkcy4KKyAgICAgICAgICAgIGdsb2JhbCBfY29uZmlnX3ZhcnMKKyAgICAgICAgICAgIGlmIG5vdCBfY29uZmlnX3ZhcnMuZ2V0KCdDVVNUT01JWkVEX09TWF9DT01QSUxFUicsICcnKToKKyAgICAgICAgICAgICAgICBpbXBvcnQgX29zeF9zdXBwb3J0CisgICAgICAgICAgICAgICAgX29zeF9zdXBwb3J0LmN1c3RvbWl6ZV9jb21waWxlcihfY29uZmlnX3ZhcnMpCisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydDVVNUT01JWkVEX09TWF9DT01QSUxFUiddID0gJ1RydWUnCisKKyAgICAgICAgKGNjLCBjeHgsIG9wdCwgY2ZsYWdzLCBjY3NoYXJlZCwgbGRzaGFyZWQsIHNvX2V4dCwgYXIsIGFyX2ZsYWdzKSA9IFwKKyAgICAgICAgICAgIGdldF9jb25maWdfdmFycygnQ0MnLCAnQ1hYJywgJ09QVCcsICdDRkxBR1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDQ1NIQVJFRCcsICdMRFNIQVJFRCcsICdTTycsICdBUicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FSRkxBR1MnKQorCisgICAgICAgIG5ld2NjID0gTm9uZQorICAgICAgICBpZiAnQ0MnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBjYyA9IG9zLmVudmlyb25bJ0NDJ10KKyAgICAgICAgaWYgJ0NYWCcgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGN4eCA9IG9zLmVudmlyb25bJ0NYWCddCisgICAgICAgIGlmICdMRFNIQVJFRCcgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGxkc2hhcmVkID0gb3MuZW52aXJvblsnTERTSEFSRUQnXQorICAgICAgICBpZiAnQ1BQJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgY3BwID0gb3MuZW52aXJvblsnQ1BQJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNwcCA9IGNjICsgIiAtRSIgICAgICAgICAgICMgbm90IGFsd2F5cworICAgICAgICBpZiAnTERGTEFHUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGxkc2hhcmVkID0gbGRzaGFyZWQgKyAnICcgKyBvcy5lbnZpcm9uWydMREZMQUdTJ10KKyAgICAgICAgaWYgJ0NGTEFHUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGNmbGFncyA9IG9wdCArICcgJyArIG9zLmVudmlyb25bJ0NGTEFHUyddCisgICAgICAgICAgICBsZHNoYXJlZCA9IGxkc2hhcmVkICsgJyAnICsgb3MuZW52aXJvblsnQ0ZMQUdTJ10KKyAgICAgICAgaWYgJ0NQUEZMQUdTJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgY3BwID0gY3BwICsgJyAnICsgb3MuZW52aXJvblsnQ1BQRkxBR1MnXQorICAgICAgICAgICAgY2ZsYWdzID0gY2ZsYWdzICsgJyAnICsgb3MuZW52aXJvblsnQ1BQRkxBR1MnXQorICAgICAgICAgICAgbGRzaGFyZWQgPSBsZHNoYXJlZCArICcgJyArIG9zLmVudmlyb25bJ0NQUEZMQUdTJ10KKyAgICAgICAgaWYgJ0FSJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgYXIgPSBvcy5lbnZpcm9uWydBUiddCisgICAgICAgIGlmICdBUkZMQUdTJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgYXJjaGl2ZXIgPSBhciArICcgJyArIG9zLmVudmlyb25bJ0FSRkxBR1MnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJjaGl2ZXIgPSBhciArICcgJyArIGFyX2ZsYWdzCisKKyAgICAgICAgY2NfY21kID0gY2MgKyAnICcgKyBjZmxhZ3MKKyAgICAgICAgY29tcGlsZXIuc2V0X2V4ZWN1dGFibGVzKAorICAgICAgICAgICAgcHJlcHJvY2Vzc29yPWNwcCwKKyAgICAgICAgICAgIGNvbXBpbGVyPWNjX2NtZCwKKyAgICAgICAgICAgIGNvbXBpbGVyX3NvPWNjX2NtZCArICcgJyArIGNjc2hhcmVkLAorICAgICAgICAgICAgY29tcGlsZXJfY3h4PWN4eCwKKyAgICAgICAgICAgIGxpbmtlcl9zbz1sZHNoYXJlZCwKKyAgICAgICAgICAgIGxpbmtlcl9leGU9Y2MsCisgICAgICAgICAgICBhcmNoaXZlcj1hcmNoaXZlcikKKworICAgICAgICBjb21waWxlci5zaGFyZWRfbGliX2V4dGVuc2lvbiA9IHNvX2V4dAorCisKK2RlZiBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKToKKyAgICAiIiJSZXR1cm4gZnVsbCBwYXRobmFtZSBvZiBpbnN0YWxsZWQgcHljb25maWcuaCBmaWxlLiIiIgorICAgIGlmIHB5dGhvbl9idWlsZDoKKyAgICAgICAgIyBHQ0MobWluZ3cpOiBvcy5uYW1lIGlzICJudCIgYnV0IGJ1aWxkIHN5c3RlbSBpcyBwb3NpeAorICAgICAgICBpZiBvcy5uYW1lID09ICJudCIgYW5kIHN5cy52ZXJzaW9uLmZpbmQoJ0dDQycpIDwgMDoKKyAgICAgICAgICAgIGluY19kaXIgPSBvcy5wYXRoLmpvaW4ocHJvamVjdF9iYXNlLCAiUEMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5jX2RpciA9IHByb2plY3RfYmFzZQorICAgIGVsc2U6CisgICAgICAgIGluY19kaXIgPSBnZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTEpCisgICAgaWYgZ2V0X3B5dGhvbl92ZXJzaW9uKCkgPCAnMi4yJzoKKyAgICAgICAgY29uZmlnX2ggPSAnY29uZmlnLmgnCisgICAgZWxzZToKKyAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgY29uZmlnLmggZmlsZSBjaGFuZ2VkIGluIDIuMgorICAgICAgICBjb25maWdfaCA9ICdweWNvbmZpZy5oJworICAgIHJldHVybiBvcy5wYXRoLmpvaW4oaW5jX2RpciwgY29uZmlnX2gpCisKKworZGVmIGdldF9tYWtlZmlsZV9maWxlbmFtZSgpOgorICAgICIiIlJldHVybiBmdWxsIHBhdGhuYW1lIG9mIGluc3RhbGxlZCBNYWtlZmlsZSBmcm9tIHRoZSBQeXRob24gYnVpbGQuIiIiCisgICAgaWYgcHl0aG9uX2J1aWxkOgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHByb2plY3RfYmFzZSwgIk1ha2VmaWxlIikKKyAgICBsaWJfZGlyID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0xLCBzdGFuZGFyZF9saWI9MSkKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKGxpYl9kaXIsICJjb25maWciLCAiTWFrZWZpbGUiKQorCisKK2RlZiBwYXJzZV9jb25maWdfaChmcCwgZz1Ob25lKToKKyAgICAiIiJQYXJzZSBhIGNvbmZpZy5oLXN0eWxlIGZpbGUuCisKKyAgICBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBuYW1lL3ZhbHVlIHBhaXJzIGlzIHJldHVybmVkLiAgSWYgYW4KKyAgICBvcHRpb25hbCBkaWN0aW9uYXJ5IGlzIHBhc3NlZCBpbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LCBpdCBpcworICAgIHVzZWQgaW5zdGVhZCBvZiBhIG5ldyBkaWN0aW9uYXJ5LgorICAgICIiIgorICAgIGlmIGcgaXMgTm9uZToKKyAgICAgICAgZyA9IHt9CisgICAgZGVmaW5lX3J4ID0gcmUuY29tcGlsZSgiI2RlZmluZSAoW0EtWl1bQS1aYS16MC05X10rKSAoLiopXG4iKQorICAgIHVuZGVmX3J4ID0gcmUuY29tcGlsZSgiL1sqXSAjdW5kZWYgKFtBLVpdW0EtWmEtejAtOV9dKykgWypdL1xuIikKKyAgICAjCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBtID0gZGVmaW5lX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBuLCB2ID0gbS5ncm91cCgxLCAyKQorICAgICAgICAgICAgdHJ5OiB2ID0gaW50KHYpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICAgICAgZ1tuXSA9IHYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG0gPSB1bmRlZl9yeC5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBnW20uZ3JvdXAoMSldID0gMAorICAgIHJldHVybiBnCisKKworIyBSZWdleGVzIG5lZWRlZCBmb3IgcGFyc2luZyBNYWtlZmlsZSAoYW5kIHNpbWlsYXIgc3ludGF4ZXMsCisjIGxpa2Ugb2xkLXN0eWxlIFNldHVwIGZpbGVzKS4KK192YXJpYWJsZV9yeCA9IHJlLmNvbXBpbGUoIihbYS16QS1aXVthLXpBLVowLTlfXSspXHMqPVxzKiguKikiKQorX2ZpbmR2YXIxX3J4ID0gcmUuY29tcGlsZShyIlwkXCgoW0EtWmEtel1bQS1aYS16MC05X10qKVwpIikKK19maW5kdmFyMl9yeCA9IHJlLmNvbXBpbGUociJcJHsoW0EtWmEtel1bQS1aYS16MC05X10qKX0iKQorCitkZWYgcGFyc2VfbWFrZWZpbGUoZm4sIGc9Tm9uZSk6CisgICAgIiIiUGFyc2UgYSBNYWtlZmlsZS1zdHlsZSBmaWxlLgorCisgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpcyByZXR1cm5lZC4gIElmIGFuCisgICAgb3B0aW9uYWwgZGljdGlvbmFyeSBpcyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgaXQgaXMKKyAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KKyAgICAiIiIKKyAgICBmcm9tIGRpc3R1dGlscy50ZXh0X2ZpbGUgaW1wb3J0IFRleHRGaWxlCisgICAgZnAgPSBUZXh0RmlsZShmbiwgc3RyaXBfY29tbWVudHM9MSwgc2tpcF9ibGFua3M9MSwgam9pbl9saW5lcz0xKQorCisgICAgaWYgZyBpcyBOb25lOgorICAgICAgICBnID0ge30KKyAgICBkb25lID0ge30KKyAgICBub3Rkb25lID0ge30KKworICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgIGlmIGxpbmUgaXMgTm9uZTogICMgZW9mCisgICAgICAgICAgICBicmVhaworICAgICAgICBtID0gX3ZhcmlhYmxlX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBuLCB2ID0gbS5ncm91cCgxLCAyKQorICAgICAgICAgICAgdiA9IHYuc3RyaXAoKQorICAgICAgICAgICAgIyBgJCQnIGlzIGEgbGl0ZXJhbCBgJCcgaW4gbWFrZQorICAgICAgICAgICAgdG1wdiA9IHYucmVwbGFjZSgnJCQnLCAnJykKKworICAgICAgICAgICAgaWYgIiQiIGluIHRtcHY6CisgICAgICAgICAgICAgICAgbm90ZG9uZVtuXSA9IHYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB2ID0gaW50KHYpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgaW5zZXJ0IGxpdGVyYWwgYCQnCisgICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSB2LnJlcGxhY2UoJyQkJywgJyQnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSB2CisKKyAgICAjIGRvIHZhcmlhYmxlIGludGVycG9sYXRpb24gaGVyZQorICAgIHdoaWxlIG5vdGRvbmU6CisgICAgICAgIGZvciBuYW1lIGluIG5vdGRvbmUua2V5cygpOgorICAgICAgICAgICAgdmFsdWUgPSBub3Rkb25lW25hbWVdCisgICAgICAgICAgICBtID0gX2ZpbmR2YXIxX3J4LnNlYXJjaCh2YWx1ZSkgb3IgX2ZpbmR2YXIyX3J4LnNlYXJjaCh2YWx1ZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgbiA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICBmb3VuZCA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBuIGluIGRvbmU6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBzdHIoZG9uZVtuXSkKKyAgICAgICAgICAgICAgICBlbGlmIG4gaW4gbm90ZG9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBnZXQgaXQgb24gYSBzdWJzZXF1ZW50IHJvdW5kCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gRmFsc2UKKyAgICAgICAgICAgICAgICBlbGlmIG4gaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgIyBkbyBpdCBsaWtlIG1ha2U6IGZhbGwgYmFjayB0byBlbnZpcm9ubWVudAorICAgICAgICAgICAgICAgICAgICBpdGVtID0gb3MuZW52aXJvbltuXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRvbmVbbl0gPSBpdGVtID0gIiIKKyAgICAgICAgICAgICAgICBpZiBmb3VuZDoKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgPSB2YWx1ZVttLmVuZCgpOl0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVs6bS5zdGFydCgpXSArIGl0ZW0gKyBhZnRlcgorICAgICAgICAgICAgICAgICAgICBpZiAiJCIgaW4gYWZ0ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICBub3Rkb25lW25hbWVdID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeTogdmFsdWUgPSBpbnQodmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUuc3RyaXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb25lW25hbWVdID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBub3Rkb25lW25hbWVdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgYm9ndXMgdmFyaWFibGUgcmVmZXJlbmNlOyBqdXN0IGRyb3AgaXQgc2luY2Ugd2UgY2FuJ3QgZGVhbAorICAgICAgICAgICAgICAgIGRlbCBub3Rkb25lW25hbWVdCisKKyAgICBmcC5jbG9zZSgpCisKKyAgICAjIHN0cmlwIHNwdXJpb3VzIHNwYWNlcworICAgIGZvciBrLCB2IGluIGRvbmUuaXRlbXMoKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgorICAgICAgICAgICAgZG9uZVtrXSA9IHYuc3RyaXAoKQorCisgICAgIyBzYXZlIHRoZSByZXN1bHRzIGluIHRoZSBnbG9iYWwgZGljdGlvbmFyeQorICAgIGcudXBkYXRlKGRvbmUpCisgICAgcmV0dXJuIGcKKworCitkZWYgZXhwYW5kX21ha2VmaWxlX3ZhcnMocywgdmFycyk6CisgICAgIiIiRXhwYW5kIE1ha2VmaWxlLXN0eWxlIHZhcmlhYmxlcyAtLSAiJHtmb299IiBvciAiJChmb28pIiAtLSBpbgorICAgICdzdHJpbmcnIGFjY29yZGluZyB0byAndmFycycgKGEgZGljdGlvbmFyeSBtYXBwaW5nIHZhcmlhYmxlIG5hbWVzIHRvCisgICAgdmFsdWVzKS4gIFZhcmlhYmxlcyBub3QgcHJlc2VudCBpbiAndmFycycgYXJlIHNpbGVudGx5IGV4cGFuZGVkIHRvIHRoZQorICAgIGVtcHR5IHN0cmluZy4gIFRoZSB2YXJpYWJsZSB2YWx1ZXMgaW4gJ3ZhcnMnIHNob3VsZCBub3QgY29udGFpbiBmdXJ0aGVyCisgICAgdmFyaWFibGUgZXhwYW5zaW9uczsgaWYgJ3ZhcnMnIGlzIHRoZSBvdXRwdXQgb2YgJ3BhcnNlX21ha2VmaWxlKCknLAorICAgIHlvdSdyZSBmaW5lLiAgUmV0dXJucyBhIHZhcmlhYmxlLWV4cGFuZGVkIHZlcnNpb24gb2YgJ3MnLgorICAgICIiIgorCisgICAgIyBUaGlzIGFsZ29yaXRobSBkb2VzIG11bHRpcGxlIGV4cGFuc2lvbiwgc28gaWYgdmFyc1snZm9vJ10gY29udGFpbnMKKyAgICAjICIke2Jhcn0iLCBpdCB3aWxsIGV4cGFuZCAke2Zvb30gdG8gJHtiYXJ9LCBhbmQgdGhlbiBleHBhbmQKKyAgICAjICR7YmFyfS4uLiBhbmQgc28gZm9ydGguICBUaGlzIGlzIGZpbmUgYXMgbG9uZyBhcyAndmFycycgY29tZXMgZnJvbQorICAgICMgJ3BhcnNlX21ha2VmaWxlKCknLCB3aGljaCB0YWtlcyBjYXJlIG9mIHN1Y2ggZXhwYW5zaW9ucyBlYWdlcmx5LAorICAgICMgYWNjb3JkaW5nIHRvIG1ha2UncyB2YXJpYWJsZSBleHBhbnNpb24gc2VtYW50aWNzLgorCisgICAgd2hpbGUgMToKKyAgICAgICAgbSA9IF9maW5kdmFyMV9yeC5zZWFyY2gocykgb3IgX2ZpbmR2YXIyX3J4LnNlYXJjaChzKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgKGJlZywgZW5kKSA9IG0uc3BhbigpCisgICAgICAgICAgICBzID0gc1swOmJlZ10gKyB2YXJzLmdldChtLmdyb3VwKDEpKSArIHNbZW5kOl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIHMKKworCitfY29uZmlnX3ZhcnMgPSBOb25lCisKK2RlZiBfaW5pdF9wb3NpeCgpOgorICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKKyAgICAjIF9zeXNjb25maWdkYXRhIGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLCBzZWUgdGhlIHN5c2NvbmZpZyBtb2R1bGUKKyAgICBmcm9tIF9zeXNjb25maWdkYXRhIGltcG9ydCBidWlsZF90aW1lX3ZhcnMKKyAgICBnbG9iYWwgX2NvbmZpZ192YXJzCisgICAgX2NvbmZpZ192YXJzID0ge30KKyAgICBfY29uZmlnX3ZhcnMudXBkYXRlKGJ1aWxkX3RpbWVfdmFycykKKworCitkZWYgX2luaXRfbnQoKToKKyAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIE5UIiIiCisgICAgaWYgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPj0gMDoKKyAgICAgICAgIyBHQ0MobWluZ3cpIHVzZSBwb3NpeCBidWlsZCBzeXN0ZW0KKyAgICAgICAgIyBGSVhNRTogbWF5IGJlIG1vZGlmaWNhdGlvbiBoYXMgdG8gYmUgaW4gZ2V0X2NvbmZpZ192YXJzID8KKyAgICAgICAgX2luaXRfcG9zaXgoKQorICAgICAgICByZXR1cm4KKyAgICBnID0ge30KKyAgICAjIHNldCBiYXNpYyBpbnN0YWxsIGRpcmVjdG9yaWVzCisgICAgZ1snTElCREVTVCddID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0wLCBzdGFuZGFyZF9saWI9MSkKKyAgICBnWydCSU5MSUJERVNUJ10gPSBnZXRfcHl0aG9uX2xpYihwbGF0X3NwZWNpZmljPTEsIHN0YW5kYXJkX2xpYj0xKQorCisgICAgIyBYWFggaG1tbS4uIGEgbm9ybWFsIGluc3RhbGwgcHV0cyBpbmNsdWRlIGZpbGVzIGhlcmUKKyAgICBnWydJTkNMVURFUFknXSA9IGdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9MCkKKworICAgIGdbJ1NPJ10gPSAnLnB5ZCcKKyAgICBnWydFWEUnXSA9ICIuZXhlIgorICAgIGdbJ1ZFUlNJT04nXSA9IGdldF9weXRob25fdmVyc2lvbigpLnJlcGxhY2UoIi4iLCAiIikKKyAgICBnWydCSU5ESVInXSA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoc3lzLmV4ZWN1dGFibGUpKQorCisgICAgZ2xvYmFsIF9jb25maWdfdmFycworICAgIF9jb25maWdfdmFycyA9IGcKKworCitkZWYgX2luaXRfb3MyKCk6CisgICAgIiIiSW5pdGlhbGl6ZSB0aGUgbW9kdWxlIGFzIGFwcHJvcHJpYXRlIGZvciBPUy8yIiIiCisgICAgZyA9IHt9CisgICAgIyBzZXQgYmFzaWMgaW5zdGFsbCBkaXJlY3RvcmllcworICAgIGdbJ0xJQkRFU1QnXSA9IGdldF9weXRob25fbGliKHBsYXRfc3BlY2lmaWM9MCwgc3RhbmRhcmRfbGliPTEpCisgICAgZ1snQklOTElCREVTVCddID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYz0xLCBzdGFuZGFyZF9saWI9MSkKKworICAgICMgWFhYIGhtbW0uLiBhIG5vcm1hbCBpbnN0YWxsIHB1dHMgaW5jbHVkZSBmaWxlcyBoZXJlCisgICAgZ1snSU5DTFVERVBZJ10gPSBnZXRfcHl0aG9uX2luYyhwbGF0X3NwZWNpZmljPTApCisKKyAgICBnWydTTyddID0gJy5weWQnCisgICAgZ1snRVhFJ10gPSAiLmV4ZSIKKworICAgIGdsb2JhbCBfY29uZmlnX3ZhcnMKKyAgICBfY29uZmlnX3ZhcnMgPSBnCisKKworZGVmIGdldF9jb25maWdfdmFycygqYXJncyk6CisgICAgIiIiV2l0aCBubyBhcmd1bWVudHMsIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgYWxsIGNvbmZpZ3VyYXRpb24KKyAgICB2YXJpYWJsZXMgcmVsZXZhbnQgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgR2VuZXJhbGx5IHRoaXMgaW5jbHVkZXMKKyAgICBldmVyeXRoaW5nIG5lZWRlZCB0byBidWlsZCBleHRlbnNpb25zIGFuZCBpbnN0YWxsIGJvdGggcHVyZSBtb2R1bGVzIGFuZAorICAgIGV4dGVuc2lvbnMuICBPbiBVbml4LCB0aGlzIG1lYW5zIGV2ZXJ5IHZhcmlhYmxlIGRlZmluZWQgaW4gUHl0aG9uJ3MKKyAgICBpbnN0YWxsZWQgTWFrZWZpbGU7IG9uIFdpbmRvd3MgYW5kIE1hYyBPUyBpdCdzIGEgbXVjaCBzbWFsbGVyIHNldC4KKworICAgIFdpdGggYXJndW1lbnRzLCByZXR1cm4gYSBsaXN0IG9mIHZhbHVlcyB0aGF0IHJlc3VsdCBmcm9tIGxvb2tpbmcgdXAKKyAgICBlYWNoIGFyZ3VtZW50IGluIHRoZSBjb25maWd1cmF0aW9uIHZhcmlhYmxlIGRpY3Rpb25hcnkuCisgICAgIiIiCisgICAgZ2xvYmFsIF9jb25maWdfdmFycworICAgIGlmIF9jb25maWdfdmFycyBpcyBOb25lOgorICAgICAgICBmdW5jID0gZ2xvYmFscygpLmdldCgiX2luaXRfIiArIG9zLm5hbWUpCisgICAgICAgIGlmIGZ1bmM6CisgICAgICAgICAgICBmdW5jKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF9jb25maWdfdmFycyA9IHt9CisKKyAgICAgICAgIyBOb3JtYWxpemVkIHZlcnNpb25zIG9mIHByZWZpeCBhbmQgZXhlY19wcmVmaXggYXJlIGhhbmR5IHRvIGhhdmU7CisgICAgICAgICMgaW4gZmFjdCwgdGhlc2UgYXJlIHRoZSBzdGFuZGFyZCB2ZXJzaW9ucyB1c2VkIG1vc3QgcGxhY2VzIGluIHRoZQorICAgICAgICAjIERpc3R1dGlscy4KKyAgICAgICAgX2NvbmZpZ192YXJzWydwcmVmaXgnXSA9IFBSRUZJWAorICAgICAgICBfY29uZmlnX3ZhcnNbJ2V4ZWNfcHJlZml4J10gPSBFWEVDX1BSRUZJWAorCisgICAgICAgICMgT1MgWCBwbGF0Zm9ybXMgcmVxdWlyZSBzcGVjaWFsIGN1c3RvbWl6YXRpb24gdG8gaGFuZGxlCisgICAgICAgICMgbXVsdGktYXJjaGl0ZWN0dXJlLCBtdWx0aS1vcy12ZXJzaW9uIGluc3RhbGxlcnMKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgaW1wb3J0IF9vc3hfc3VwcG9ydAorICAgICAgICAgICAgX29zeF9zdXBwb3J0LmN1c3RvbWl6ZV9jb25maWdfdmFycyhfY29uZmlnX3ZhcnMpCisKKyAgICBpZiBhcmdzOgorICAgICAgICB2YWxzID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gYXJnczoKKyAgICAgICAgICAgIHZhbHMuYXBwZW5kKF9jb25maWdfdmFycy5nZXQobmFtZSkpCisgICAgICAgIHJldHVybiB2YWxzCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9jb25maWdfdmFycworCitkZWYgZ2V0X2NvbmZpZ192YXIobmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSB2YXJpYWJsZSB1c2luZyB0aGUgZGljdGlvbmFyeQorICAgIHJldHVybmVkIGJ5ICdnZXRfY29uZmlnX3ZhcnMoKScuICBFcXVpdmFsZW50IHRvCisgICAgZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KG5hbWUpCisgICAgIiIiCisgICAgcmV0dXJuIGdldF9jb25maWdfdmFycygpLmdldChuYW1lKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3lzY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNmJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvc3lzY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFiNmJjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3N5c2NvbmZpZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvU2V0dXAuc2FtcGxlIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvU2V0dXAuc2FtcGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YzQyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9TZXR1cC5zYW1wbGUKQEAgLTAsMCArMSw2NyBAQAorIyBTZXR1cCBmaWxlIGZyb20gdGhlIHB5Z2FtZSBwcm9qZWN0CisKKyMtLVN0YXJ0Q29uZmlnCitTREwgPSAtSS91c3IvaW5jbHVkZS9TREwgLURfUkVFTlRSQU5UIC1sU0RMCitGT05UID0gLWxTRExfdHRmCitJTUFHRSA9IC1sU0RMX2ltYWdlCitNSVhFUiA9IC1sU0RMX21peGVyCitTTVBFRyA9IC1sc21wZWcKK1BORyA9IC1scG5nCitKUEVHID0gLWxqcGVnCitTQ1JBUCA9IC1sWDExCitQT1JUTUlESSA9IC1scG9ydG1pZGkKK1BPUlRUSU1FID0gLWxwb3J0dGltZQorIy0tRW5kQ29uZmlnCisKKyNERUJVRyA9IC1DLVcgLUMtV2FsbAorREVCVUcgPSAKKworI3RoZSBmb2xsb3dpbmcgbW9kdWxlcyBhcmUgb3B0aW9uYWwuIHlvdSB3aWxsIHdhbnQgdG8gY29tcGlsZQorI2V2ZXJ5dGhpbmcgeW91IGNhbiwgYnV0IHlvdSBjYW4gaWdub3JlIG9uZXMgeW91IGRvbid0IGhhdmUKKyNkZXBlbmRlbmNpZXMgZm9yLCBqdXN0IGNvbW1lbnQgdGhlbSBvdXQKKworaW1hZ2VleHQgc3JjL2ltYWdlZXh0LmMgJChTREwpICQoSU1BR0UpICQoUE5HKSAkKEpQRUcpICQoREVCVUcpCitmb250IHNyYy9mb250LmMgJChTREwpICQoRk9OVCkgJChERUJVRykKK21peGVyIHNyYy9taXhlci5jICQoU0RMKSAkKE1JWEVSKSAkKERFQlVHKQorbWl4ZXJfbXVzaWMgc3JjL211c2ljLmMgJChTREwpICQoTUlYRVIpICQoREVCVUcpCitfbnVtZXJpY3N1cmZhcnJheSBzcmMvX251bWVyaWNzdXJmYXJyYXkuYyAkKFNETCkgJChERUJVRykKK19udW1lcmljc25kYXJyYXkgc3JjL19udW1lcmljc25kYXJyYXkuYyAkKFNETCkgJChNSVhFUikgJChERUJVRykKK21vdmllIHNyYy9tb3ZpZS5jICQoU0RMKSAkKFNNUEVHKSAkKERFQlVHKQorc2NyYXAgc3JjL3NjcmFwLmMgJChTREwpICQoU0NSQVApICQoREVCVUcpCitfY2FtZXJhIHNyYy9fY2FtZXJhLmMgc3JjL2NhbWVyYV92NGwyLmMgc3JjL2NhbWVyYV92NGwuYyAkKFNETCkgJChERUJVRykKK3B5cG0gc3JjL3B5cG0uYyAkKFNETCkgJChQT1JUTUlESSkgJChQT1JUVElNRSkgJChERUJVRykKKworR0ZYID0gc3JjL1NETF9nZngvU0RMX2dmeFByaW1pdGl2ZXMuYyAKKyNHRlggPSBzcmMvU0RMX2dmeC9TRExfZ2Z4QmxpdEZ1bmMuYyBzcmMvU0RMX2dmeC9TRExfZ2Z4UHJpbWl0aXZlcy5jIAorZ2Z4ZHJhdyBzcmMvZ2Z4ZHJhdy5jICQoU0RMKSAkKEdGWCkgJChERUJVRykKKworCisKKyN0aGVzZSBtb2R1bGVzIGFyZSByZXF1aXJlZCBmb3IgcHlnYW1lIHRvIHJ1bi4gdGhleSBvbmx5IHJlcXVpcmUKKyNTREwgYXMgYSBkZXBlbmRlbmN5LiB0aGVzZSBzaG91bGQgbm90IGJlIGFsdGVyZWQKKworYmFzZSBzcmMvYmFzZS5jICQoU0RMKSAkKERFQlVHKQorY2Ryb20gc3JjL2Nkcm9tLmMgJChTREwpICQoREVCVUcpCitjb2xvciBzcmMvY29sb3IuYyAkKFNETCkgJChERUJVRykKK2NvbnN0YW50cyBzcmMvY29uc3RhbnRzLmMgJChTREwpICQoREVCVUcpCitkaXNwbGF5IHNyYy9kaXNwbGF5LmMgJChTREwpICQoREVCVUcpCitldmVudCBzcmMvZXZlbnQuYyAkKFNETCkgJChERUJVRykKK2Zhc3RldmVudCBzcmMvZmFzdGV2ZW50LmMgc3JjL2Zhc3RldmVudHMuYyAkKFNETCkgJChERUJVRykKK2tleSBzcmMva2V5LmMgJChTREwpICQoREVCVUcpCittb3VzZSBzcmMvbW91c2UuYyAkKFNETCkgJChERUJVRykKK3JlY3Qgc3JjL3JlY3QuYyAkKFNETCkgJChERUJVRykKK3J3b2JqZWN0IHNyYy9yd29iamVjdC5jICQoU0RMKSAkKERFQlVHKQorc3VyZmFjZSBzcmMvc3VyZmFjZS5jIHNyYy9hbHBoYWJsaXQuYyBzcmMvc3VyZmFjZV9maWxsLmMgJChTREwpICQoREVCVUcpCitzdXJmbG9jayBzcmMvc3VyZmxvY2suYyAkKFNETCkgJChERUJVRykKK3RpbWUgc3JjL3RpbWUuYyAkKFNETCkgJChERUJVRykKK2pveXN0aWNrIHNyYy9qb3lzdGljay5jICQoU0RMKSAkKERFQlVHKQorZHJhdyBzcmMvZHJhdy5jICQoU0RMKSAkKERFQlVHKQoraW1hZ2Ugc3JjL2ltYWdlLmMgJChTREwpICQoREVCVUcpCitvdmVybGF5IHNyYy9vdmVybGF5LmMgJChTREwpICQoREVCVUcpCit0cmFuc2Zvcm0gc3JjL3RyYW5zZm9ybS5jIHNyYy9yb3Rvem9vbS5jIHNyYy9zY2FsZTJ4LmMgc3JjL3NjYWxlX21teC5jICQoU0RMKSAkKERFQlVHKQorbWFzayBzcmMvbWFzay5jIHNyYy9iaXRtYXNrLmMgJChTREwpICQoREVCVUcpCitidWZmZXJwcm94eSBzcmMvYnVmZmVycHJveHkuYyAkKFNETCkgJChERUJVRykKK3BpeGVsYXJyYXkgc3JjL3BpeGVsYXJyYXkuYyAkKFNETCkgJChERUJVRykKK19hcnJheXN1cmZhcnJheSBzcmMvX2FycmF5c3VyZmFycmF5LmMgJChTREwpICQoREVCVUcpCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTdmZjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHkKQEAgLTAsMCArMSwzNiBAQAorIiIiVGVzdCBzdWl0ZSBmb3IgZGlzdHV0aWxzLgorCitUaGlzIHRlc3Qgc3VpdGUgY29uc2lzdHMgb2YgYSBjb2xsZWN0aW9uIG9mIHRlc3QgbW9kdWxlcyBpbiB0aGUKK2Rpc3R1dGlscy50ZXN0cyBwYWNrYWdlLiAgRWFjaCB0ZXN0IG1vZHVsZSBoYXMgYSBuYW1lIHN0YXJ0aW5nIHdpdGgKKyd0ZXN0JyBhbmQgY29udGFpbnMgYSBmdW5jdGlvbiB0ZXN0X3N1aXRlKCkuICBUaGUgZnVuY3Rpb24gaXMgZXhwZWN0ZWQKK3RvIHJldHVybiBhbiBpbml0aWFsaXplZCB1bml0dGVzdC5UZXN0U3VpdGUgaW5zdGFuY2UuCisKK1Rlc3RzIGZvciB0aGUgY29tbWFuZCBjbGFzc2VzIGluIHRoZSBkaXN0dXRpbHMuY29tbWFuZCBwYWNrYWdlIGFyZQoraW5jbHVkZWQgaW4gZGlzdHV0aWxzLnRlc3RzIGFzIHdlbGwsIGluc3RlYWQgb2YgdXNpbmcgYSBzZXBhcmF0ZQorZGlzdHV0aWxzLmNvbW1hbmQudGVzdHMgcGFja2FnZSwgc2luY2UgY29tbWFuZCBpZGVudGlmaWNhdGlvbiBpcyBkb25lCitieSBpbXBvcnQgcmF0aGVyIHRoYW4gbWF0Y2hpbmcgcHJlLWRlZmluZWQgbmFtZXMuCisKKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKKworaGVyZSA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgZm9yIGZuIGluIG9zLmxpc3RkaXIoaGVyZSk6CisgICAgICAgIGlmIGZuLnN0YXJ0c3dpdGgoInRlc3QiKSBhbmQgZm4uZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgbW9kbmFtZSA9ICJkaXN0dXRpbHMudGVzdHMuIiArIGZuWzotM10KKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kbmFtZSkKKyAgICAgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KG1vZHVsZS50ZXN0X3N1aXRlKCkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjEyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjEyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19idWlsZF9leHQucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2J1aWxkX2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZhOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19idWlsZF9leHQucHkKQEAgLTAsMCArMSwyODcgQEAKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQgYXMgX2R1X2J1aWxkX2V4dAordHJ5OgorICAgICMgQXR0ZW1wdCB0byB1c2UgUHlyZXggZm9yIGJ1aWxkaW5nIGV4dGVuc2lvbnMsIGlmIGF2YWlsYWJsZQorICAgIGZyb20gUHlyZXguRGlzdHV0aWxzLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9idWlsZF9leHQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfYnVpbGRfZXh0ID0gX2R1X2J1aWxkX2V4dAorCitpbXBvcnQgb3MsIHN5cworZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBjb3B5X2ZpbGUKKworZnJvbSBkaXN0dXRpbHMudGVzdHMuc2V0dXB0b29sc19leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKKworZnJvbSBkaXN0dXRpbHMuY2NvbXBpbGVyIGltcG9ydCBuZXdfY29tcGlsZXIKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgY3VzdG9taXplX2NvbXBpbGVyLCBnZXRfY29uZmlnX3ZhcgorZ2V0X2NvbmZpZ192YXIoIkxEU0hBUkVEIikgICMgbWFrZSBzdXJlIF9jb25maWdfdmFycyBpcyBpbml0aWFsaXplZAorZnJvbSBkaXN0dXRpbHMuc3lzY29uZmlnIGltcG9ydCBfY29uZmlnX3ZhcnMKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgorCitoYXZlX3J0bGQgPSBGYWxzZQordXNlX3N0dWJzID0gRmFsc2UKK2xpYnR5cGUgPSAnc2hhcmVkJworCitpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgdXNlX3N0dWJzID0gVHJ1ZQorZWxpZiBvcy5uYW1lICE9ICdudCc6CisgICAgdHJ5OgorICAgICAgICBmcm9tIGRsIGltcG9ydCBSVExEX05PVworICAgICAgICBoYXZlX3J0bGQgPSBUcnVlCisgICAgICAgIHVzZV9zdHVicyA9IFRydWUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKworZGVmIGlmX2RsKHMpOgorICAgIGlmIGhhdmVfcnRsZDoKKyAgICAgICAgcmV0dXJuIHMKKyAgICByZXR1cm4gJycKKworCisKKworCisKK2NsYXNzIGJ1aWxkX2V4dChfYnVpbGRfZXh0KToKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiJCdWlsZCBleHRlbnNpb25zIGluIGJ1aWxkIGRpcmVjdG9yeSwgdGhlbiBjb3B5IGlmIC0taW5wbGFjZSIiIgorICAgICAgICBvbGRfaW5wbGFjZSwgc2VsZi5pbnBsYWNlID0gc2VsZi5pbnBsYWNlLCAwCisgICAgICAgIF9idWlsZF9leHQucnVuKHNlbGYpCisgICAgICAgIHNlbGYuaW5wbGFjZSA9IG9sZF9pbnBsYWNlCisgICAgICAgIGlmIG9sZF9pbnBsYWNlOgorICAgICAgICAgICAgc2VsZi5jb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKCkKKworICAgIGRlZiBjb3B5X2V4dGVuc2lvbnNfdG9fc291cmNlKHNlbGYpOgorICAgICAgICBidWlsZF9weSA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCisgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0X2V4dF9maWxlbmFtZShmdWxsbmFtZSkKKyAgICAgICAgICAgIG1vZHBhdGggPSBmdWxsbmFtZS5zcGxpdCgnLicpCisgICAgICAgICAgICBwYWNrYWdlID0gJy4nLmpvaW4obW9kcGF0aFs6LTFdKQorICAgICAgICAgICAgcGFja2FnZV9kaXIgPSBidWlsZF9weS5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkKKyAgICAgICAgICAgIGRlc3RfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkpCisgICAgICAgICAgICBzcmNfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9saWIsZmlsZW5hbWUpCisKKyAgICAgICAgICAgICMgQWx3YXlzIGNvcHksIGV2ZW4gaWYgc291cmNlIGlzIG9sZGVyIHRoYW4gZGVzdGluYXRpb24sIHRvIGVuc3VyZQorICAgICAgICAgICAgIyB0aGF0IHRoZSByaWdodCBleHRlbnNpb25zIGZvciB0aGUgY3VycmVudCBQeXRob24vcGxhdGZvcm0gYXJlCisgICAgICAgICAgICAjIHVzZWQuCisgICAgICAgICAgICBjb3B5X2ZpbGUoCisgICAgICAgICAgICAgICAgc3JjX2ZpbGVuYW1lLCBkZXN0X2ZpbGVuYW1lLCB2ZXJib3NlPXNlbGYudmVyYm9zZSwKKyAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bgorICAgICAgICAgICAgKQorICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YihwYWNrYWdlX2RpciBvciBvcy5jdXJkaXIsIGV4dCwgVHJ1ZSkKKworCisgICAgaWYgX2J1aWxkX2V4dCBpcyBub3QgX2R1X2J1aWxkX2V4dCBhbmQgbm90IGhhc2F0dHIoX2J1aWxkX2V4dCwncHlyZXhfc291cmNlcycpOgorICAgICAgICAjIFdvcmthcm91bmQgZm9yIHByb2JsZW1zIHVzaW5nIHNvbWUgUHlyZXggdmVyc2lvbnMgdy9TV0lHIGFuZC9vciAyLjQKKyAgICAgICAgZGVmIHN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKToKKyAgICAgICAgICAgICMgZmlyc3QgZG8gYW55IFB5cmV4IHByb2Nlc3NpbmcKKyAgICAgICAgICAgIHNvdXJjZXMgPSBfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzKSBvciBzb3VyY2VzCisgICAgICAgICAgICAjIFRoZW4gZG8gYW55IGFjdHVhbCBTV0lHIHN0dWZmIG9uIHRoZSByZW1haW5kZXIKKyAgICAgICAgICAgIHJldHVybiBfZHVfYnVpbGRfZXh0LnN3aWdfc291cmNlcyhzZWxmLCBzb3VyY2VzLCAqb3RoZXJhcmdzKQorCisKKworICAgIGRlZiBnZXRfZXh0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgZmlsZW5hbWUgPSBfYnVpbGRfZXh0LmdldF9leHRfZmlsZW5hbWUoc2VsZixmdWxsbmFtZSkKKyAgICAgICAgZXh0ID0gc2VsZi5leHRfbWFwW2Z1bGxuYW1lXQorICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKKyAgICAgICAgICAgIGZuLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2hsaWJfY29tcGlsZXIubGlicmFyeV9maWxlbmFtZShmbixsaWJ0eXBlKQorICAgICAgICBlbGlmIHVzZV9zdHVicyBhbmQgZXh0Ll9saW5rc190b19keW5hbWljOgorICAgICAgICAgICAgZCxmbiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKGQsJ2RsLScrZm4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9idWlsZF9leHQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuc2hsaWJfY29tcGlsZXIgPSBOb25lCisgICAgICAgIHNlbGYuc2hsaWJzID0gW10KKyAgICAgICAgc2VsZi5leHRfbWFwID0ge30KKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfYnVpbGRfZXh0LmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5leHRlbnNpb25zID0gc2VsZi5leHRlbnNpb25zIG9yIFtdCisgICAgICAgIHNlbGYuY2hlY2tfZXh0ZW5zaW9uc19saXN0KHNlbGYuZXh0ZW5zaW9ucykKKyAgICAgICAgc2VsZi5zaGxpYnMgPSBbZXh0IGZvciBleHQgaW4gc2VsZi5leHRlbnNpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KV0KKyAgICAgICAgaWYgc2VsZi5zaGxpYnM6CisgICAgICAgICAgICBzZWxmLnNldHVwX3NobGliX2NvbXBpbGVyKCkKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBleHQuX2Z1bGxfbmFtZSA9IHNlbGYuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBmdWxsbmFtZSA9IGV4dC5fZnVsbF9uYW1lCisgICAgICAgICAgICBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdID0gZXh0CisgICAgICAgICAgICBsdGQgPSBleHQuX2xpbmtzX3RvX2R5bmFtaWMgPSBcCisgICAgICAgICAgICAgICAgc2VsZi5zaGxpYnMgYW5kIHNlbGYubGlua3NfdG9fZHluYW1pYyhleHQpIG9yIEZhbHNlCisgICAgICAgICAgICBleHQuX25lZWRzX3N0dWIgPSBsdGQgYW5kIHVzZV9zdHVicyBhbmQgbm90IGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpCisgICAgICAgICAgICBmaWxlbmFtZSA9IGV4dC5fZmlsZV9uYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQorICAgICAgICAgICAgbGliZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYixmaWxlbmFtZSkpCisgICAgICAgICAgICBpZiBsdGQgYW5kIGxpYmRpciBub3QgaW4gZXh0LmxpYnJhcnlfZGlyczoKKyAgICAgICAgICAgICAgICBleHQubGlicmFyeV9kaXJzLmFwcGVuZChsaWJkaXIpCisgICAgICAgICAgICBpZiBsdGQgYW5kIHVzZV9zdHVicyBhbmQgb3MuY3VyZGlyIG5vdCBpbiBleHQucnVudGltZV9saWJyYXJ5X2RpcnM6CisgICAgICAgICAgICAgICAgZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzLmFwcGVuZChvcy5jdXJkaXIpCisKKyAgICBkZWYgc2V0dXBfc2hsaWJfY29tcGlsZXIoc2VsZik6CisgICAgICAgIGNvbXBpbGVyID0gc2VsZi5zaGxpYl9jb21waWxlciA9IG5ld19jb21waWxlcigKKyAgICAgICAgICAgIGNvbXBpbGVyPXNlbGYuY29tcGlsZXIsIGRyeV9ydW49c2VsZi5kcnlfcnVuLCBmb3JjZT1zZWxmLmZvcmNlCisgICAgICAgICkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgdG1wID0gX2NvbmZpZ192YXJzLmNvcHkoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgWFhYIEhlbHAhICBJIGRvbid0IGhhdmUgYW55IGlkZWEgd2hldGhlciB0aGVzZSBhcmUgcmlnaHQuLi4KKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ0xEU0hBUkVEJ10gPSAiZ2NjIC1XbCwteCAtZHluYW1pY2xpYiAtdW5kZWZpbmVkIGR5bmFtaWNfbG9va3VwIgorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snQ0NTSEFSRUQnXSA9ICIgLWR5bmFtaWNsaWIiCisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydTTyddID0gIi5keWxpYiIKKyAgICAgICAgICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIF9jb25maWdfdmFycy5jbGVhcigpCisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzLnVwZGF0ZSh0bXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdXN0b21pemVfY29tcGlsZXIoY29tcGlsZXIpCisKKyAgICAgICAgaWYgc2VsZi5pbmNsdWRlX2RpcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfaW5jbHVkZV9kaXJzKHNlbGYuaW5jbHVkZV9kaXJzKQorICAgICAgICBpZiBzZWxmLmRlZmluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgJ2RlZmluZScgb3B0aW9uIGlzIGEgbGlzdCBvZiAobmFtZSx2YWx1ZSkgdHVwbGVzCisgICAgICAgICAgICBmb3IgKG5hbWUsdmFsdWUpIGluIHNlbGYuZGVmaW5lOgorICAgICAgICAgICAgICAgIGNvbXBpbGVyLmRlZmluZV9tYWNybyhuYW1lLCB2YWx1ZSkKKyAgICAgICAgaWYgc2VsZi51bmRlZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBtYWNybyBpbiBzZWxmLnVuZGVmOgorICAgICAgICAgICAgICAgIGNvbXBpbGVyLnVuZGVmaW5lX21hY3JvKG1hY3JvKQorICAgICAgICBpZiBzZWxmLmxpYnJhcmllcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJpZXMoc2VsZi5saWJyYXJpZXMpCisgICAgICAgIGlmIHNlbGYubGlicmFyeV9kaXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X2xpYnJhcnlfZGlycyhzZWxmLmxpYnJhcnlfZGlycykKKyAgICAgICAgaWYgc2VsZi5ycGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyLnNldF9ydW50aW1lX2xpYnJhcnlfZGlycyhzZWxmLnJwYXRoKQorICAgICAgICBpZiBzZWxmLmxpbmtfb2JqZWN0cyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saW5rX29iamVjdHMoc2VsZi5saW5rX29iamVjdHMpCisKKyAgICAgICAgIyBoYWNrIHNvIGRpc3R1dGlscycgYnVpbGRfZXh0ZW5zaW9uKCkgYnVpbGRzIGEgbGlicmFyeSBpbnN0ZWFkCisgICAgICAgIGNvbXBpbGVyLmxpbmtfc2hhcmVkX29iamVjdCA9IGxpbmtfc2hhcmVkX29iamVjdC5fX2dldF9fKGNvbXBpbGVyKQorCisKKworICAgIGRlZiBnZXRfZXhwb3J0X3N5bWJvbHMoc2VsZiwgZXh0KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsTGlicmFyeSk6CisgICAgICAgICAgICByZXR1cm4gZXh0LmV4cG9ydF9zeW1ib2xzCisgICAgICAgIHJldHVybiBfYnVpbGRfZXh0LmdldF9leHBvcnRfc3ltYm9scyhzZWxmLGV4dCkKKworICAgIGRlZiBidWlsZF9leHRlbnNpb24oc2VsZiwgZXh0KToKKyAgICAgICAgX2NvbXBpbGVyID0gc2VsZi5jb21waWxlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dCxMaWJyYXJ5KToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gc2VsZi5zaGxpYl9jb21waWxlcgorICAgICAgICAgICAgX2J1aWxkX2V4dC5idWlsZF9leHRlbnNpb24oc2VsZixleHQpCisgICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zdHViKAorICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5idWlsZF9saWIsIGV4dAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY29tcGlsZXIgPSBfY29tcGlsZXIKKworICAgIGRlZiBsaW5rc190b19keW5hbWljKHNlbGYsIGV4dCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmICdleHQnIGxpbmtzIHRvIGEgZHluYW1pYyBsaWIgaW4gdGhlIHNhbWUgcGFja2FnZSIiIgorICAgICAgICAjIFhYWCB0aGlzIHNob3VsZCBjaGVjayB0byBlbnN1cmUgdGhlIGxpYiBpcyBhY3R1YWxseSBiZWluZyBidWlsdAorICAgICAgICAjIFhYWCBhcyBkeW5hbWljLCBhbmQgbm90IGp1c3QgdXNpbmcgYSBsb2NhbGx5LWZvdW5kIHZlcnNpb24gb3IgYQorICAgICAgICAjIFhYWCBzdGF0aWMtY29tcGlsZWQgdmVyc2lvbgorICAgICAgICBsaWJuYW1lcyA9IGRpY3QuZnJvbWtleXMoW2xpYi5fZnVsbF9uYW1lIGZvciBsaWIgaW4gc2VsZi5zaGxpYnNdKQorICAgICAgICBwa2cgPSAnLicuam9pbihleHQuX2Z1bGxfbmFtZS5zcGxpdCgnLicpWzotMV0rWycnXSkKKyAgICAgICAgZm9yIGxpYm5hbWUgaW4gZXh0LmxpYnJhcmllczoKKyAgICAgICAgICAgIGlmIHBrZytsaWJuYW1lIGluIGxpYm5hbWVzOiByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBnZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0cyA9IF9idWlsZF9leHQuZ2V0X291dHB1dHMoc2VsZikKKyAgICAgICAgb3B0aW1pemUgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKS5vcHRpbWl6ZQorICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKKyAgICAgICAgICAgICAgICBiYXNlID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLCAqZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKSkKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChiYXNlKycucHknKQorICAgICAgICAgICAgICAgIG91dHB1dHMuYXBwZW5kKGJhc2UrJy5weWMnKQorICAgICAgICAgICAgICAgIGlmIG9wdGltaXplOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChiYXNlKycucHlvJykKKyAgICAgICAgcmV0dXJuIG91dHB1dHMKKworICAgIGRlZiB3cml0ZV9zdHViKHNlbGYsIG91dHB1dF9kaXIsIGV4dCwgY29tcGlsZT1GYWxzZSk6CisgICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nIHN0dWIgbG9hZGVyIGZvciAlcyB0byAlcyIsZXh0Ll9mdWxsX25hbWUsIG91dHB1dF9kaXIpCisgICAgICAgIHN0dWJfZmlsZSA9IG9zLnBhdGguam9pbihvdXRwdXRfZGlyLCAqZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKSkrJy5weScKKyAgICAgICAgaWYgY29tcGlsZSBhbmQgb3MucGF0aC5leGlzdHMoc3R1Yl9maWxlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKHN0dWJfZmlsZSsiIGFscmVhZHkgZXhpc3RzISBQbGVhc2UgZGVsZXRlLiIpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBmID0gb3BlbihzdHViX2ZpbGUsJ3cnKQorICAgICAgICAgICAgZi53cml0ZSgnXG4nLmpvaW4oWworICAgICAgICAgICAgICAgICJkZWYgX19ib290c3RyYXBfXygpOiIsCisgICAgICAgICAgICAgICAgIiAgIGdsb2JhbCBfX2Jvb3RzdHJhcF9fLCBfX2ZpbGVfXywgX19sb2FkZXJfXyIsCisgICAgICAgICAgICAgICAgIiAgIGltcG9ydCBzeXMsIG9zLCBwa2dfcmVzb3VyY2VzLCBpbXAiK2lmX2RsKCIsIGRsIiksCisgICAgICAgICAgICAgICAgIiAgIF9fZmlsZV9fID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZShfX25hbWVfXywlcikiCisgICAgICAgICAgICAgICAgICAgJSBvcy5wYXRoLmJhc2VuYW1lKGV4dC5fZmlsZV9uYW1lKSwKKyAgICAgICAgICAgICAgICAiICAgZGVsIF9fYm9vdHN0cmFwX18iLAorICAgICAgICAgICAgICAgICIgICBpZiAnX19sb2FkZXJfXycgaW4gZ2xvYmFscygpOiIsCisgICAgICAgICAgICAgICAgIiAgICAgICBkZWwgX19sb2FkZXJfXyIsCisgICAgICAgICAgICAgICAgaWZfZGwoIiAgIG9sZF9mbGFncyA9IHN5cy5nZXRkbG9wZW5mbGFncygpIiksCisgICAgICAgICAgICAgICAgIiAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKSIsCisgICAgICAgICAgICAgICAgIiAgIHRyeToiLAorICAgICAgICAgICAgICAgICIgICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpIiwKKyAgICAgICAgICAgICAgICBpZl9kbCgiICAgICBzeXMuc2V0ZGxvcGVuZmxhZ3MoZGwuUlRMRF9OT1cpIiksCisgICAgICAgICAgICAgICAgIiAgICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykiLAorICAgICAgICAgICAgICAgICIgICBmaW5hbGx5OiIsCisgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZF9mbGFncykiKSwKKyAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvbGRfZGlyKSIsCisgICAgICAgICAgICAgICAgIl9fYm9vdHN0cmFwX18oKSIsCisgICAgICAgICAgICAgICAgIiIgIyB0ZXJtaW5hbCBcbgorICAgICAgICAgICAgXSkpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgaWYgY29tcGlsZToKKyAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQorICAgICAgICAgICAgYnl0ZV9jb21waWxlKFtzdHViX2ZpbGVdLCBvcHRpbWl6ZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICAgICAgb3B0aW1pemUgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbF9saWInKS5vcHRpbWl6ZQorICAgICAgICAgICAgaWYgb3B0aW1pemUgPiAwOgorICAgICAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9b3B0aW1pemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlPVRydWUsIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc3R1Yl9maWxlKSBhbmQgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoc3R1Yl9maWxlKQorCisKK2lmIHVzZV9zdHVicyBvciBvcy5uYW1lPT0nbnQnOgorICAgICMgQnVpbGQgc2hhcmVkIGxpYnJhcmllcworICAgICMKKyAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsIHRhcmdldF9sYW5nPU5vbmUKKyAgICApOiAgc2VsZi5saW5rKAorICAgICAgICAgICAgc2VsZi5TSEFSRURfTElCUkFSWSwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsCisgICAgICAgICAgICBvdXRwdXRfZGlyLCBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICBleHBvcnRfc3ltYm9scywgZGVidWcsIGV4dHJhX3ByZWFyZ3MsIGV4dHJhX3Bvc3RhcmdzLAorICAgICAgICAgICAgYnVpbGRfdGVtcCwgdGFyZ2V0X2xhbmcKKyAgICAgICAgKQorZWxzZToKKyAgICAjIEJ1aWxkIHN0YXRpYyBsaWJyYXJpZXMgZXZlcnl3aGVyZSBlbHNlCisgICAgbGlidHlwZSA9ICdzdGF0aWMnCisKKyAgICBkZWYgbGlua19zaGFyZWRfb2JqZWN0KHNlbGYsIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLCBvdXRwdXRfZGlyPU5vbmUsCisgICAgICAgIGxpYnJhcmllcz1Ob25lLCBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZGVidWc9MCwgZXh0cmFfcHJlYXJncz1Ob25lLAorICAgICAgICBleHRyYV9wb3N0YXJncz1Ob25lLCBidWlsZF90ZW1wPU5vbmUsIHRhcmdldF9sYW5nPU5vbmUKKyAgICApOgorICAgICAgICAjIFhYWCB3ZSBuZWVkIHRvIGVpdGhlciBkaXNhbGxvdyB0aGVzZSBhdHRycyBvbiBMaWJyYXJ5IGluc3RhbmNlcywKKyAgICAgICAgIyAgICAgb3Igd2Fybi9hYm9ydCBoZXJlIGlmIHNldCwgb3Igc29tZXRoaW5nLi4uCisgICAgICAgICNsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgICNleHBvcnRfc3ltYm9scz1Ob25lLCBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUsCisgICAgICAgICNidWlsZF90ZW1wPU5vbmUKKworICAgICAgICBhc3NlcnQgb3V0cHV0X2RpciBpcyBOb25lICAgIyBkaXN0dXRpbHMgYnVpbGRfZXh0IGRvZXNuJ3QgcGFzcyB0aGlzCisgICAgICAgIG91dHB1dF9kaXIsZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KG91dHB1dF9saWJuYW1lKQorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgaWYgc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKCJ4Iikuc3RhcnRzd2l0aCgnbGliJyk6CisgICAgICAgICAgICAjIHN0cmlwICdsaWInIHByZWZpeDsgdGhpcyBpcyBrbHVkZ3kgaWYgc29tZSBwbGF0Zm9ybSB1c2VzCisgICAgICAgICAgICAjIGEgZGlmZmVyZW50IHByZWZpeAorICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVszOl0KKworICAgICAgICBzZWxmLmNyZWF0ZV9zdGF0aWNfbGliKAorICAgICAgICAgICAgb2JqZWN0cywgYmFzZW5hbWUsIG91dHB1dF9kaXIsIGRlYnVnLCB0YXJnZXRfbGFuZworICAgICAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2J1aWxkX2V4dC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2J1aWxkX2V4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5YWU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfYnVpbGRfZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2J1aWxkX2V4dC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2J1aWxkX2V4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdmZjA1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfYnVpbGRfZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2V4dGVuc2lvbi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfZXh0ZW5zaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNmI2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zZXR1cHRvb2xzX2V4dGVuc2lvbi5weQpAQCAtMCwwICsxLDUxIEBACitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBFeHRlbnNpb24gYXMgX0V4dGVuc2lvbgorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uIGFzIF9EaXN0cmlidXRpb24KKworZGVmIF9nZXRfdW5wYXRjaGVkKGNscyk6CisgICAgIiIiUHJvdGVjdCBhZ2FpbnN0IHJlLXBhdGNoaW5nIHRoZSBkaXN0dXRpbHMgaWYgcmVsb2FkZWQKKworICAgIEFsc28gZW5zdXJlcyB0aGF0IG5vIG90aGVyIGRpc3R1dGlscyBleHRlbnNpb24gbW9ua2V5cGF0Y2hlZCB0aGUgZGlzdHV0aWxzCisgICAgZmlyc3QuCisgICAgIiIiCisgICAgd2hpbGUgY2xzLl9fbW9kdWxlX18uc3RhcnRzd2l0aCgnc2V0dXB0b29scycpOgorICAgICAgICBjbHMsID0gY2xzLl9fYmFzZXNfXworICAgIGlmIG5vdCBjbHMuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdkaXN0dXRpbHMnKToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAiZGlzdHV0aWxzIGhhcyBhbHJlYWR5IGJlZW4gcGF0Y2hlZCBieSAlciIgJSBjbHMKKyAgICAgICAgKQorICAgIHJldHVybiBjbHMKKworX0Rpc3RyaWJ1dGlvbiA9IF9nZXRfdW5wYXRjaGVkKF9EaXN0cmlidXRpb24pCitfRXh0ZW5zaW9uID0gX2dldF91bnBhdGNoZWQoX0V4dGVuc2lvbikKKwordHJ5OgorICAgIGZyb20gUHlyZXguRGlzdHV0aWxzLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaGF2ZV9weXJleCA9IEZhbHNlCitlbHNlOgorICAgIGhhdmVfcHlyZXggPSBUcnVlCisKKworY2xhc3MgRXh0ZW5zaW9uKF9FeHRlbnNpb24pOgorICAgICIiIkV4dGVuc2lvbiB0aGF0IHVzZXMgJy5jJyBmaWxlcyBpbiBwbGFjZSBvZiAnLnB5eCcgZmlsZXMiIiIKKworICAgIGlmIG5vdCBoYXZlX3B5cmV4OgorICAgICAgICAjIGNvbnZlcnQgLnB5eCBleHRlbnNpb25zIHRvIC5jCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgX0V4dGVuc2lvbi5fX2luaXRfXyhzZWxmLCphcmdzLCoqa3cpCisgICAgICAgICAgICBzb3VyY2VzID0gW10KKyAgICAgICAgICAgIGZvciBzIGluIHNlbGYuc291cmNlczoKKyAgICAgICAgICAgICAgICBpZiBzLmVuZHN3aXRoKCcucHl4Jyk6CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMuYXBwZW5kKHNbOi0zXSsnYycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc291cmNlcy5hcHBlbmQocykKKyAgICAgICAgICAgIHNlbGYuc291cmNlcyA9IHNvdXJjZXMKKworY2xhc3MgTGlicmFyeShFeHRlbnNpb24pOgorICAgICIiIkp1c3QgbGlrZSBhIHJlZ3VsYXIgRXh0ZW5zaW9uLCBidXQgYnVpbHQgYXMgYSBsaWJyYXJ5IGluc3RlYWQiIiIKKworaW1wb3J0IHN5cywgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5leHRlbnNpb24KK2Rpc3R1dGlscy5jb3JlLkV4dGVuc2lvbiA9IEV4dGVuc2lvbgorZGlzdHV0aWxzLmV4dGVuc2lvbi5FeHRlbnNpb24gPSBFeHRlbnNpb24KK2lmICdkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnIGluIHN5cy5tb2R1bGVzOgorICAgIHN5cy5tb2R1bGVzWydkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQnXS5FeHRlbnNpb24gPSBFeHRlbnNpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfZXh0ZW5zaW9uLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfZXh0ZW5zaW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmI4YmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19leHRlbnNpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfZXh0ZW5zaW9uLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3NldHVwdG9vbHNfZXh0ZW5zaW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmI4YmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc2V0dXB0b29sc19leHRlbnNpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjA1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMjIxIEBACisiIiJTdXBwb3J0IGNvZGUgZm9yIGRpc3R1dGlscyB0ZXN0IGNhc2VzLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5c2NvbmZpZworZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLmxvZyBpbXBvcnQgREVCVUcsIElORk8sIFdBUk4sIEVSUk9SLCBGQVRBTAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCisKKworZGVmIGNhcHR1cmVfd2FybmluZ3MoZnVuYyk6CisgICAgZGVmIF9jYXB0dXJlX3dhcm5pbmdzKCphcmdzLCAqKmt3KToKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJpZ25vcmUiKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgcmV0dXJuIF9jYXB0dXJlX3dhcm5pbmdzCisKKworY2xhc3MgTG9nZ2luZ1NpbGVuY2VyKG9iamVjdCk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKExvZ2dpbmdTaWxlbmNlciwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnRocmVzaG9sZCA9IGxvZy5zZXRfdGhyZXNob2xkKGxvZy5GQVRBTCkKKyAgICAgICAgIyBjYXRjaGluZyB3YXJuaW5ncworICAgICAgICAjIHdoZW4gbG9nIHdpbGwgYmUgcmVwbGFjZWQgYnkgbG9nZ2luZworICAgICAgICAjIHdlIHdvbid0IG5lZWQgc3VjaCBtb25rZXktcGF0Y2ggYW55bW9yZQorICAgICAgICBzZWxmLl9vbGRfbG9nID0gbG9nLkxvZy5fbG9nCisgICAgICAgIGxvZy5Mb2cuX2xvZyA9IHNlbGYuX2xvZworICAgICAgICBzZWxmLmxvZ3MgPSBbXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBsb2cuc2V0X3RocmVzaG9sZChzZWxmLnRocmVzaG9sZCkKKyAgICAgICAgbG9nLkxvZy5fbG9nID0gc2VsZi5fb2xkX2xvZworICAgICAgICBzdXBlcihMb2dnaW5nU2lsZW5jZXIsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiBfbG9nKHNlbGYsIGxldmVsLCBtc2csIGFyZ3MpOgorICAgICAgICBpZiBsZXZlbCBub3QgaW4gKERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUiwgRkFUQUwpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJXMgd3JvbmcgbG9nIGxldmVsJyAlIHN0cihsZXZlbCkpCisgICAgICAgIHNlbGYubG9ncy5hcHBlbmQoKGxldmVsLCBtc2csIGFyZ3MpKQorCisgICAgZGVmIGdldF9sb2dzKHNlbGYsICpsZXZlbHMpOgorICAgICAgICBkZWYgX2Zvcm1hdChtc2csIGFyZ3MpOgorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZworICAgICAgICAgICAgcmV0dXJuIG1zZyAlIGFyZ3MKKyAgICAgICAgcmV0dXJuIFtfZm9ybWF0KG1zZywgYXJncykgZm9yIGxldmVsLCBtc2csIGFyZ3MKKyAgICAgICAgICAgICAgICBpbiBzZWxmLmxvZ3MgaWYgbGV2ZWwgaW4gbGV2ZWxzXQorCisgICAgZGVmIGNsZWFyX2xvZ3Moc2VsZik6CisgICAgICAgIHNlbGYubG9ncyA9IFtdCisKKworY2xhc3MgVGVtcGRpck1hbmFnZXIob2JqZWN0KToKKyAgICAiIiJNaXgtaW4gY2xhc3MgdGhhdCBoYW5kbGVzIHRlbXBvcmFyeSBkaXJlY3RvcmllcyBmb3IgdGVzdCBjYXNlcy4KKworICAgIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIHVuaXR0ZXN0LlRlc3RDYXNlLgorICAgICIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZW1wZGlyTWFuYWdlciwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLm9sZF9jd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBzZWxmLnRlbXBkaXJzID0gW10KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyBSZXN0b3JlIHdvcmtpbmcgZGlyLCBmb3IgU29sYXJpcyBhbmQgZGVyaXZhdGl2ZXMsIHdoZXJlIHJtZGlyKCkKKyAgICAgICAgIyBvbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgZmFpbHMuCisgICAgICAgIG9zLmNoZGlyKHNlbGYub2xkX2N3ZCkKKyAgICAgICAgc3VwZXIoVGVtcGRpck1hbmFnZXIsIHNlbGYpLnRlYXJEb3duKCkKKyAgICAgICAgd2hpbGUgc2VsZi50ZW1wZGlyczoKKyAgICAgICAgICAgIGQgPSBzZWxmLnRlbXBkaXJzLnBvcCgpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKGQsIG9zLm5hbWUgaW4gKCdudCcsICdjeWd3aW4nKSkKKworICAgIGRlZiBta2R0ZW1wKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSBjbGVhbmVkIHVwLgorCisgICAgICAgIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGRpcmVjdG9yeS4KKyAgICAgICAgIiIiCisgICAgICAgIGQgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi50ZW1wZGlycy5hcHBlbmQoZCkKKyAgICAgICAgcmV0dXJuIGQKKworICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIHBhdGgsIGNvbnRlbnQ9J3h4eCcpOgorICAgICAgICAiIiJXcml0ZXMgYSBmaWxlIGluIHRoZSBnaXZlbiBwYXRoLgorCisKKyAgICAgICAgcGF0aCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBzZXF1ZW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKCpwYXRoKQorICAgICAgICBmID0gb3BlbihwYXRoLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoY29udGVudCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGNyZWF0ZV9kaXN0KHNlbGYsIHBrZ19uYW1lPSdmb28nLCAqKmt3KToKKyAgICAgICAgIiIiV2lsbCBnZW5lcmF0ZSBhIHRlc3QgZW52aXJvbm1lbnQuCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzOgorICAgICAgICAgLSBhIERpc3RyaWJ1dGlvbiBpbnN0YW5jZSB1c2luZyBrZXl3b3JkcworICAgICAgICAgLSBhIHRlbXBvcmFyeSBkaXJlY3Rvcnkgd2l0aCBhIHBhY2thZ2Ugc3RydWN0dXJlCisKKyAgICAgICAgSXQgcmV0dXJucyB0aGUgcGFja2FnZSBkaXJlY3RvcnkgYW5kIHRoZSBkaXN0cmlidXRpb24KKyAgICAgICAgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICB0bXBfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbih0bXBfZGlyLCBwa2dfbmFtZSkKKyAgICAgICAgb3MubWtkaXIocGtnX2RpcikKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycz1rdykKKworICAgICAgICByZXR1cm4gcGtnX2RpciwgZGlzdAorCisKK2NsYXNzIER1bW15Q29tbWFuZDoKKyAgICAiIiJDbGFzcyB0byBzdG9yZSBvcHRpb25zIGZvciByZXRyaWV2YWwgdmlhIHNldF91bmRlZmluZWRfb3B0aW9ucygpLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgZm9yIGt3LCB2YWwgaW4ga3dhcmdzLml0ZW1zKCk6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGt3LCB2YWwpCisKKyAgICBkZWYgZW5zdXJlX2ZpbmFsaXplZChzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEVudmlyb25HdWFyZChvYmplY3QpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihFbnZpcm9uR3VhcmQsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5vbGRfZW52aXJvbiA9IGRlZXBjb3B5KG9zLmVudmlyb24pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYub2xkX2Vudmlyb24uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG9zLmVudmlyb24uZ2V0KGtleSkgIT0gdmFsdWU6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvbltrZXldID0gdmFsdWUKKworICAgICAgICBmb3Iga2V5IGluIG9zLmVudmlyb24ua2V5cygpOgorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmLm9sZF9lbnZpcm9uOgorICAgICAgICAgICAgICAgIGRlbCBvcy5lbnZpcm9uW2tleV0KKworICAgICAgICBzdXBlcihFbnZpcm9uR3VhcmQsIHNlbGYpLnRlYXJEb3duKCkKKworCitkZWYgY29weV94eG1vZHVsZV9jKGRpcmVjdG9yeSk6CisgICAgIiIiSGVscGVyIGZvciB0ZXN0cyB0aGF0IG5lZWQgdGhlIHh4bW9kdWxlLmMgc291cmNlIGZpbGUuCisKKyAgICBFeGFtcGxlIHVzZToKKworICAgICAgICBkZWYgdGVzdF9jb21waWxlKHNlbGYpOgorICAgICAgICAgICAgY29weV94eG1vZHVsZV9jKHNlbGYudG1wZGlyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigneHhtb2R1bGUuYycsIG9zLmxpc3RkaXIoc2VsZi50bXBkaXIpKQorCisgICAgSWYgdGhlIHNvdXJjZSBmaWxlIGNhbiBiZSBmb3VuZCwgaXQgd2lsbCBiZSBjb3BpZWQgdG8gKmRpcmVjdG9yeSouICBJZiBub3QsCisgICAgdGhlIHRlc3Qgd2lsbCBiZSBza2lwcGVkLiAgRXJyb3JzIGR1cmluZyBjb3B5IGFyZSBub3QgY2F1Z2h0LgorICAgICIiIgorICAgIGZpbGVuYW1lID0gX2dldF94eG1vZHVsZV9wYXRoKCkKKyAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnY2Fubm90IGZpbmQgeHhtb2R1bGUuYyAodGVzdCBtdXN0IHJ1biBpbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgcHl0aG9uIGJ1aWxkIGRpciknKQorICAgIHNodXRpbC5jb3B5KGZpbGVuYW1lLCBkaXJlY3RvcnkpCisKKworZGVmIF9nZXRfeHhtb2R1bGVfcGF0aCgpOgorICAgICMgRklYTUUgd2hlbiBydW4gZnJvbSByZWdydGVzdCwgc3JjZGlyIHNlZW1zIHRvIGJlICcuJywgd2hpY2ggZG9lcyBub3QgaGVscAorICAgICMgdXMgZmluZCB0aGUgeHhtb2R1bGUuYyBmaWxlCisgICAgc3JjZGlyID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdzcmNkaXInKQorICAgIGNhbmRpZGF0ZXMgPSBbCisgICAgICAgICMgdXNlIGluc3RhbGxlZCBjb3B5IGlmIGF2YWlsYWJsZQorICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ3h4bW9kdWxlLmMnKSwKKyAgICAgICAgIyBvdGhlcndpc2UgdHJ5IHVzaW5nIGNvcHkgZnJvbSBidWlsZCBkaXJlY3RvcnkKKyAgICAgICAgb3MucGF0aC5qb2luKHNyY2RpciwgJ01vZHVsZXMnLCAneHhtb2R1bGUuYycpLAorICAgICAgICAjIHNyY2RpciBteXN0ZXJpb3VzbHkgY2FuIGJlICRzcmNkaXIvTGliL2Rpc3R1dGlscy90ZXN0cyB3aGVuCisgICAgICAgICMgdGhpcyBmaWxlIGlzIHJ1biBmcm9tIGl0cyBwYXJlbnQgZGlyZWN0b3J5LCBzbyB3YWxrIHVwIHRoZQorICAgICAgICAjIHRyZWUgdG8gZmluZCB0aGUgcmVhbCBzcmNkaXIKKyAgICAgICAgb3MucGF0aC5qb2luKHNyY2RpciwgJy4uJywgJy4uJywgJy4uJywgJ01vZHVsZXMnLCAneHhtb2R1bGUuYycpLAorICAgIF0KKyAgICBmb3IgcGF0aCBpbiBjYW5kaWRhdGVzOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBwYXRoCisKKworZGVmIGZpeHVwX2J1aWxkX2V4dChjbWQpOgorICAgICIiIkZ1bmN0aW9uIG5lZWRlZCB0byBtYWtlIGJ1aWxkX2V4dCB0ZXN0cyBwYXNzLgorCisgICAgV2hlbiBQeXRob24gd2FzIGJ1aWxkIHdpdGggLS1lbmFibGUtc2hhcmVkIG9uIFVuaXgsIC1MLiBpcyBub3QgZ29vZAorICAgIGVub3VnaCB0byBmaW5kIHRoZSBsaWJweXRob248YmxhaD4uc28uICBUaGlzIGlzIGJlY2F1c2UgcmVncnRlc3QgcnVucworICAgIGl0IHVuZGVyIGEgdGVtcGRpciwgbm90IGluIHRoZSB0b3AgbGV2ZWwgd2hlcmUgdGhlIC5zbyBsaXZlcy4gIEJ5IHRoZQorICAgIHRpbWUgd2UndmUgZ290dGVuIGhlcmUsIFB5dGhvbidzIGFscmVhZHkgYmVlbiBjaGRpcidkIHRvIHRoZSB0ZW1wZGlyLgorCisgICAgV2hlbiBQeXRob24gd2FzIGJ1aWx0IHdpdGggaW4gZGVidWcgbW9kZSBvbiBXaW5kb3dzLCBidWlsZF9leHQgY29tbWFuZHMKKyAgICBuZWVkIHRoZWlyIGRlYnVnIGF0dHJpYnV0ZSBzZXQsIGFuZCBpdCBpcyBub3QgZG9uZSBhdXRvbWF0aWNhbGx5IGZvcgorICAgIHNvbWUgcmVhc29uLgorCisgICAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIGJvdGggb2YgdGhlc2UgdGhpbmdzLiAgRXhhbXBsZSB1c2U6CisKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIHN1cHBvcnQuZml4dXBfYnVpbGRfZXh0KGNtZCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgVW5saWtlIG1vc3Qgb3RoZXIgVW5peCBwbGF0Zm9ybXMsIE1hYyBPUyBYIGVtYmVkcyBhYnNvbHV0ZSBwYXRocworICAgIHRvIHNoYXJlZCBsaWJyYXJpZXMgaW50byBleGVjdXRhYmxlcywgc28gdGhlIGZpeHVwIGlzIG5vdCBuZWVkZWQgdGhlcmUuCisgICAgIiIiCisgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICBjbWQuZGVidWcgPSBzeXMuZXhlY3V0YWJsZS5lbmRzd2l0aCgnX2QuZXhlJykKKyAgICBlbGlmIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignUHlfRU5BQkxFX1NIQVJFRCcpOgorICAgICAgICAjIFRvIGZ1cnRoZXIgYWRkIHRvIHRoZSBzaGFyZWQgYnVpbGRzIGZ1biBvbiBVbml4LCB3ZSBjYW4ndCBqdXN0IGFkZAorICAgICAgICAjIGxpYnJhcnlfZGlycyB0byB0aGUgRXh0ZW5zaW9uKCkgaW5zdGFuY2UgYmVjYXVzZSB0aGF0IGRvZXNuJ3QgZ2V0CisgICAgICAgICMgcGx1bWJlZCB0aHJvdWdoIHRvIHRoZSBmaW5hbCBjb21waWxlciBjb21tYW5kLgorICAgICAgICBydW5zaGFyZWQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1JVTlNIQVJFRCcpCisgICAgICAgIGlmIHJ1bnNoYXJlZCBpcyBOb25lOgorICAgICAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9IFsnLiddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWUsIGVxdWFscywgdmFsdWUgPSBydW5zaGFyZWQucGFydGl0aW9uKCc9JykKKyAgICAgICAgICAgICAgICBjbWQubGlicmFyeV9kaXJzID0gdmFsdWUuc3BsaXQob3MucGF0aHNlcCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxMDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUxMDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3N1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9hcmNoaXZlX3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAxY2VjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5CkBAIC0wLDAgKzEsMzI4IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5hcmNoaXZlX3V0aWwuIiIiCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0YXJmaWxlCitmcm9tIG9zLnBhdGggaW1wb3J0IHNwbGl0ZHJpdmUKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGRpc3R1dGlscy5hcmNoaXZlX3V0aWwgaW1wb3J0IChjaGVja19hcmNoaXZlX2Zvcm1hdHMsIG1ha2VfdGFyYmFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfemlwZmlsZSwgbWFrZV9hcmNoaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJDSElWRV9GT1JNQVRTKQorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZSwgc3Bhd24KK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjaGVja193YXJuaW5ncywgcnVuX3VuaXR0ZXN0CisKK3RyeToKKyAgICBpbXBvcnQgZ3JwCisgICAgaW1wb3J0IHB3ZAorICAgIFVJRF9HSURfU1VQUE9SVCA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBVSURfR0lEX1NVUFBPUlQgPSBGYWxzZQorCit0cnk6CisgICAgaW1wb3J0IHppcGZpbGUKKyAgICBaSVBfU1VQUE9SVCA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBaSVBfU1VQUE9SVCA9IGZpbmRfZXhlY3V0YWJsZSgnemlwJykKKworIyBzb21lIHRlc3RzIHdpbGwgZmFpbCBpZiB6bGliIGlzIG5vdCBhdmFpbGFibGUKK3RyeToKKyAgICBpbXBvcnQgemxpYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHpsaWIgPSBOb25lCisKK2RlZiBjYW5fZnNfZW5jb2RlKGZpbGVuYW1lKToKKyAgICAiIiIKKyAgICBSZXR1cm4gVHJ1ZSBpZiB0aGUgZmlsZW5hbWUgY2FuIGJlIHNhdmVkIGluIHRoZSBmaWxlIHN5c3RlbS4KKyAgICAiIiIKKyAgICBpZiBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHRyeToKKyAgICAgICAgZmlsZW5hbWUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKKyAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIEFyY2hpdmVVdGlsVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9tYWtlX3RhcmJhbGwoc2VsZik6CisgICAgICAgIHNlbGYuX21ha2VfdGFyYmFsbCgnYXJjaGl2ZScpCisKKyAgICBkZWYgX21ha2VfdGFyYmFsbChzZWxmLCB0YXJnZXRfbmFtZSk6CisgICAgICAgICMgY3JlYXRpbmcgc29tZXRoaW5nIHRvIHRhcgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ2ZpbGUxJ10sICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW3RtcGRpciwgJ2ZpbGUyJ10sICd4eHgnKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4odG1wZGlyLCAnc3ViJykpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbdG1wZGlyLCAnc3ViJywgJ2ZpbGUzJ10sICd4eHgnKQorCisgICAgICAgIHRtcGRpcjIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICB1bml0dGVzdC5za2lwVW5sZXNzKHNwbGl0ZHJpdmUodG1wZGlyKVswXSA9PSBzcGxpdGRyaXZlKHRtcGRpcjIpWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzb3VyY2UgYW5kIHRhcmdldCBzaG91bGQgYmUgb24gc2FtZSBkcml2ZSIpCisKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcjIsIHRhcmdldF9uYW1lKQorCisgICAgICAgICMgd29ya2luZyB3aXRoIHJlbGF0aXZlIHBhdGhzIHRvIGF2b2lkIHRhciB3YXJuaW5ncworICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYWtlX3RhcmJhbGwoc3BsaXRkcml2ZShiYXNlX25hbWUpWzFdLCAnLicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbXByZXNzZWQgdGFyYmFsbCB3YXMgY3JlYXRlZAorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXIuZ3onCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworICAgICAgICAjIHRyeWluZyBhbiB1bmNvbXByZXNzZWQgb25lCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCB0YXJnZXRfbmFtZSkKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFrZV90YXJiYWxsKHNwbGl0ZHJpdmUoYmFzZV9uYW1lKVsxXSwgJy4nLCBjb21wcmVzcz1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyJworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICBkZWYgX3RhcmluZm8oc2VsZiwgcGF0aCk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IHRhci5nZXRuYW1lcygpCisgICAgICAgICAgICBuYW1lcy5zb3J0KCkKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShuYW1lcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICBkZWYgX2NyZWF0ZV9maWxlcyhzZWxmKToKKyAgICAgICAgIyBjcmVhdGluZyBzb21ldGhpbmcgdG8gdGFyCisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGRpc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZGlzdCcpCisgICAgICAgIG9zLm1rZGlyKGRpc3QpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbZGlzdCwgJ2ZpbGUxJ10sICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW2Rpc3QsICdmaWxlMiddLCAneHh4JykKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKGRpc3QsICdzdWInKSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFtkaXN0LCAnc3ViJywgJ2ZpbGUzJ10sICd4eHgnKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oZGlzdCwgJ3N1YjInKSkKKyAgICAgICAgdG1wZGlyMiA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCAnYXJjaGl2ZScpCisgICAgICAgIHJldHVybiB0bXBkaXIsIHRtcGRpcjIsIGJhc2VfbmFtZQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgIlJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZpbmRfZXhlY3V0YWJsZSgndGFyJykgYW5kIGZpbmRfZXhlY3V0YWJsZSgnZ3ppcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdOZWVkIHRoZSB0YXIgY29tbWFuZCB0byBydW4nKQorICAgIGRlZiB0ZXN0X3RhcmZpbGVfdnNfdGFyKHNlbGYpOgorICAgICAgICB0bXBkaXIsIHRtcGRpcjIsIGJhc2VfbmFtZSA9ICBzZWxmLl9jcmVhdGVfZmlsZXMoKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCAnZGlzdCcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorCisgICAgICAgICMgY2hlY2sgaWYgdGhlIGNvbXByZXNzZWQgdGFyYmFsbCB3YXMgY3JlYXRlZAorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXIuZ3onCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKworICAgICAgICAjIG5vdyBjcmVhdGUgYW5vdGhlciB0YXJiYWxsIHVzaW5nIGB0YXJgCisgICAgICAgIHRhcmJhbGwyID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2FyY2hpdmUyLnRhci5neicpCisgICAgICAgIHRhcl9jbWQgPSBbJ3RhcicsICctY2YnLCAnYXJjaGl2ZTIudGFyJywgJ2Rpc3QnXQorICAgICAgICBnemlwX2NtZCA9IFsnZ3ppcCcsICctZjknLCAnYXJjaGl2ZTIudGFyJ10KKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3Bhd24odGFyX2NtZCkKKyAgICAgICAgICAgIHNwYXduKGd6aXBfY21kKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbDIpKQorICAgICAgICAjIGxldCdzIGNvbXBhcmUgYm90aCB0YXJiYWxscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3RhcmluZm8odGFyYmFsbCksIHNlbGYuX3RhcmluZm8odGFyYmFsbDIpKQorCisgICAgICAgICMgdHJ5aW5nIGFuIHVuY29tcHJlc3NlZCBvbmUKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcjIsICdhcmNoaXZlJykKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnLCBjb21wcmVzcz1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyJworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICAgICAgIyBub3cgZm9yIGEgZHJ5X3J1bgorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCAnZGlzdCcsIGNvbXByZXNzPU5vbmUsIGRyeV9ydW49VHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhcicKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmluZF9leGVjdXRhYmxlKCdjb21wcmVzcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgY29tcHJlc3MgcHJvZ3JhbSBpcyByZXF1aXJlZCcpCisgICAgZGVmIHRlc3RfY29tcHJlc3NfZGVwcmVjYXRlZChzZWxmKToKKyAgICAgICAgdG1wZGlyLCB0bXBkaXIyLCBiYXNlX25hbWUgPSAgc2VsZi5fY3JlYXRlX2ZpbGVzKCkKKworICAgICAgICAjIHVzaW5nIGNvbXByZXNzIGFuZCB0ZXN0aW5nIHRoZSBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgICAgICBtYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCAnZGlzdCcsIGNvbXByZXNzPSdjb21wcmVzcycpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQorICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXIuWicKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKworICAgICAgICAjIHNhbWUgdGVzdCB3aXRoIGRyeV9ydW4KKyAgICAgICAgb3MucmVtb3ZlKHRhcmJhbGwpCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgICAgICBtYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCAnZGlzdCcsIGNvbXByZXNzPSdjb21wcmVzcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49VHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHModGFyYmFsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcud2FybmluZ3MpLCAxKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgIlJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFpJUF9TVVBQT1JULCAnTmVlZCB6aXAgc3VwcG9ydCB0byBydW4nKQorICAgIGRlZiB0ZXN0X21ha2VfemlwZmlsZShzZWxmKToKKyAgICAgICAgIyBjcmVhdGluZyBzb21ldGhpbmcgdG8gdGFyCisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbdG1wZGlyLCAnZmlsZTEnXSwgJ3h4eCcpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbdG1wZGlyLCAnZmlsZTInXSwgJ3h4eCcpCisKKyAgICAgICAgdG1wZGlyMiA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCAnYXJjaGl2ZScpCisgICAgICAgIG1ha2VfemlwZmlsZShiYXNlX25hbWUsIHRtcGRpcikKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb21wcmVzc2VkIHRhcmJhbGwgd2FzIGNyZWF0ZWQKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcuemlwJworCisgICAgZGVmIHRlc3RfY2hlY2tfYXJjaGl2ZV9mb3JtYXRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoZWNrX2FyY2hpdmVfZm9ybWF0cyhbJ2d6dGFyJywgJ3h4eCcsICd6aXAnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3h4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hlY2tfYXJjaGl2ZV9mb3JtYXRzKFsnZ3p0YXInLCAnemlwJ10pLCBOb25lKQorCisgICAgZGVmIHRlc3RfbWFrZV9hcmNoaXZlKHNlbGYpOgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnYXJjaGl2ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ha2VfYXJjaGl2ZSwgYmFzZV9uYW1lLCAneHh4JykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9tYWtlX2FyY2hpdmVfb3duZXJfZ3JvdXAoc2VsZik6CisgICAgICAgICMgdGVzdGluZyBtYWtlX2FyY2hpdmUgd2l0aCBvd25lciBhbmQgZ3JvdXAsIHdpdGggdmFyaW91cyBjb21iaW5hdGlvbnMKKyAgICAgICAgIyB0aGlzIHdvcmtzIGV2ZW4gaWYgdGhlcmUncyBub3QgZ2lkL3VpZCBzdXBwb3J0CisgICAgICAgIGlmIFVJRF9HSURfU1VQUE9SVDoKKyAgICAgICAgICAgIGdyb3VwID0gZ3JwLmdldGdyZ2lkKDApWzBdCisgICAgICAgICAgICBvd25lciA9IHB3ZC5nZXRwd3VpZCgwKVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3JvdXAgPSBvd25lciA9ICdyb290JworCisgICAgICAgIGJhc2VfZGlyLCByb290X2RpciwgYmFzZV9uYW1lID0gIHNlbGYuX2NyZWF0ZV9maWxlcygpCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLm1rZHRlbXAoKSAsICdhcmNoaXZlJykKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3ppcCcsIHJvb3RfZGlyLCBiYXNlX2Rpciwgb3duZXI9b3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cD1ncm91cCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHJlcykpCisKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3ppcCcsIHJvb3RfZGlyLCBiYXNlX2RpcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHJlcykpCisKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3RhcicsIHJvb3RfZGlyLCBiYXNlX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPW93bmVyLCBncm91cD1ncm91cCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHJlcykpCisKKyAgICAgICAgcmVzID0gbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgJ3RhcicsIHJvb3RfZGlyLCBiYXNlX2RpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPSdramhramhramcnLCBncm91cD0nb2lob2hvaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgIlJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFVJRF9HSURfU1VQUE9SVCwgIlJlcXVpcmVzIGdycCBhbmQgcHdkIHN1cHBvcnQiKQorICAgIGRlZiB0ZXN0X3RhcmZpbGVfcm9vdF9vd25lcihzZWxmKToKKyAgICAgICAgdG1wZGlyLCB0bXBkaXIyLCBiYXNlX25hbWUgPSAgc2VsZi5fY3JlYXRlX2ZpbGVzKCkKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgZ3JvdXAgPSBncnAuZ2V0Z3JnaWQoMClbMF0KKyAgICAgICAgb3duZXIgPSBwd2QuZ2V0cHd1aWQoMClbMF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXJjaGl2ZV9uYW1lID0gbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnLCBjb21wcmVzcz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPW93bmVyLCBncm91cD1ncm91cCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisKKyAgICAgICAgIyBjaGVjayBpZiB0aGUgY29tcHJlc3NlZCB0YXJiYWxsIHdhcyBjcmVhdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX25hbWUpKQorCisgICAgICAgICMgbm93IGNoZWNrcyB0aGUgcmlnaHRzCisgICAgICAgIGFyY2hpdmUgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbWVtYmVyIGluIGFyY2hpdmUuZ2V0bWVtYmVycygpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtYmVyLnVpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWJlci5naWQsIDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X21ha2VfYXJjaGl2ZV9jd2Qoc2VsZik6CisgICAgICAgIGN1cnJlbnRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZGVmIF9icmVha3MoKmFyZ3MsICoqa3cpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgQVJDSElWRV9GT1JNQVRTWyd4eHgnXSA9IChfYnJlYWtzLCBbXSwgJ3h4eCBmaWxlJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1ha2VfYXJjaGl2ZSgneHh4JywgJ3h4eCcsIHJvb3RfZGlyPXNlbGYubWtkdGVtcCgpKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuZ2V0Y3dkKCksIGN1cnJlbnRfZGlyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIEFSQ0hJVkVfRk9STUFUU1sneHh4J10KKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9tYWtlX3RhcmJhbGxfdW5pY29kZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIE1pcnJvciB0ZXN0X21ha2VfdGFyYmFsbCwgZXhjZXB0IGZpbGVuYW1lIGlzIHVuaWNvZGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9tYWtlX3RhcmJhbGwodSdhcmNoaXZlJykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhjYW5fZnNfZW5jb2RlKHUnw6VyY2hpdicpLAorICAgICAgICAnRmlsZSBzeXN0ZW0gY2Fubm90IGhhbmRsZSB0aGlzIGZpbGVuYW1lJykKKyAgICBkZWYgdGVzdF9tYWtlX3RhcmJhbGxfdW5pY29kZV9sYXRpbjEoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBNaXJyb3IgdGVzdF9tYWtlX3RhcmJhbGwsIGV4Y2VwdCBmaWxlbmFtZSBpcyB1bmljb2RlIGFuZCBjb250YWlucworICAgICAgICBsYXRpbiBjaGFyYWN0ZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fbWFrZV90YXJiYWxsKHUnw6VyY2hpdicpICMgbm90ZSB0aGlzIGlzbid0IGEgcmVhbCB3b3JkCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoY2FuX2ZzX2VuY29kZSh1J+OBruOCouODvOOCq+OCpOODlicpLAorICAgICAgICAnRmlsZSBzeXN0ZW0gY2Fubm90IGhhbmRsZSB0aGlzIGZpbGVuYW1lJykKKyAgICBkZWYgdGVzdF9tYWtlX3RhcmJhbGxfdW5pY29kZV9leHRlbmRlZChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIE1pcnJvciB0ZXN0X21ha2VfdGFyYmFsbCwgZXhjZXB0IGZpbGVuYW1lIGlzIHVuaWNvZGUgYW5kIGNvbnRhaW5zCisgICAgICAgIGNoYXJhY3RlcnMgb3V0c2lkZSB0aGUgbGF0aW4gY2hhcnNldC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX21ha2VfdGFyYmFsbCh1J+OBruOCouODvOOCq+OCpOODlicpICMgamFwYW5lc2UgZm9yIGFyY2hpdmUKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEFyY2hpdmVVdGlsVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ0OTEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9hcmNoaXZlX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ0OTEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9hcmNoaXZlX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMWQwOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0LnB5CkBAIC0wLDAgKzEsNTIgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdC4iIiIKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0IGltcG9ydCBiZGlzdAorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworCitjbGFzcyBCdWlsZFRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHMoc2VsZik6CisgICAgICAgICMgbGV0J3MgY3JlYXRlIGEgY29tbWFuZCBhbmQgbWFrZSBzdXJlCisgICAgICAgICMgd2UgY2FuIHNldCB0aGUgZm9ybWF0CisgICAgICAgIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KClbMV0KKyAgICAgICAgY21kID0gYmRpc3QoZGlzdCkKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ21zaSddCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZm9ybWF0cywgWydtc2knXSkKKworICAgICAgICAjIHdoYXQgZm9ybWF0cyBkb2VzIGJkaXN0IG9mZmVyPworICAgICAgICBmb3JtYXRzID0gWydienRhcicsICdnenRhcicsICdtc2knLCAncnBtJywgJ3RhcicsCisgICAgICAgICAgICAgICAgICAgJ3dpbmluc3QnLCAnemlwJywgJ3p0YXInXQorICAgICAgICBmb3VuZCA9IHNvcnRlZChjbWQuZm9ybWF0X2NvbW1hbmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91bmQsIGZvcm1hdHMpCisKKyAgICBkZWYgdGVzdF9za2lwX2J1aWxkKHNlbGYpOgorICAgICAgICAjIGJ1ZyAjMTA5NDY6IGJkaXN0IC0tc2tpcC1idWlsZCBzaG91bGQgdHJpY2tsZSBkb3duIHRvIHN1YmNvbW1hbmRzCisgICAgICAgIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KClbMV0KKyAgICAgICAgY21kID0gYmRpc3QoZGlzdCkKKyAgICAgICAgY21kLnNraXBfYnVpbGQgPSAxCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgZGlzdC5jb21tYW5kX29ialsnYmRpc3QnXSA9IGNtZAorCisgICAgICAgIG5hbWVzID0gWydiZGlzdF9kdW1iJywgJ2JkaXN0X3dpbmluc3QnXQorICAgICAgICAjIGJkaXN0X3JwbSBkb2VzIG5vdCBzdXBwb3J0IC0tc2tpcC1idWlsZAorICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICBuYW1lcy5hcHBlbmQoJ2JkaXN0X21zaScpCisKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBzdWJjbWQgPSBjbWQuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3ViY21kLnNraXBfYnVpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzIHNob3VsZCB0YWtlIC0tc2tpcC1idWlsZCBmcm9tIGJkaXN0JyAlIG5hbWUpCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3QucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyMzQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgyMzQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGIzYTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9kdW1iLnB5CkBAIC0wLDAgKzEsMTE0IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfZHVtYi4iIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgemlwZmlsZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworIyB6bGliIGlzIG5vdCB1c2VkIGhlcmUsIGJ1dCBpZiBpdCdzIG5vdCBhdmFpbGFibGUKKyMgdGVzdF9zaW1wbGVfYnVpbHQgd2lsbCBmYWlsCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfZHVtYiBpbXBvcnQgYmRpc3RfZHVtYgorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworU0VUVVBfUFkgPSAiIiJcCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAoraW1wb3J0IGZvbworCitzZXR1cChuYW1lPSdmb28nLCB2ZXJzaW9uPScwLjEnLCBweV9tb2R1bGVzPVsnZm9vJ10sCisgICAgICB1cmw9J3h4eCcsIGF1dGhvcj0neHh4JywgYXV0aG9yX2VtYWlsPSd4eHgnKQorCisiIiIKKworY2xhc3MgQnVpbGREdW1iVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5FbnZpcm9uR3VhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKEJ1aWxkRHVtYlRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYub2xkX2xvY2F0aW9uID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgc2VsZi5vbGRfc3lzX2FyZ3YgPSBzeXMuYXJndiwgc3lzLmFyZ3ZbOl0KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MuY2hkaXIoc2VsZi5vbGRfbG9jYXRpb24pCisgICAgICAgIHN5cy5hcmd2ID0gc2VsZi5vbGRfc3lzX2FyZ3ZbMF0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzZWxmLm9sZF9zeXNfYXJndlsxXQorICAgICAgICBzdXBlcihCdWlsZER1bWJUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3NpbXBsZV9idWlsdChzZWxmKToKKworICAgICAgICAjIGxldCdzIGNyZWF0ZSBhIHNpbXBsZSBwYWNrYWdlCisgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdmb28nKQorICAgICAgICBvcy5ta2Rpcihwa2dfZGlyKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHBrZ19kaXIsICdzZXR1cC5weScpLCBTRVRVUF9QWSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnZm9vLnB5JyksICcjJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnTUFOSUZFU1QuaW4nKSwgJ2luY2x1ZGUgZm9vLnB5JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnUkVBRE1FJyksICcnKQorCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ2ZvbycsICd2ZXJzaW9uJzogJzAuMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV9tb2R1bGVzJzogWydmb28nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6ICd4eHgnLCAnYXV0aG9yJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiAneHh4J30pCisgICAgICAgIGRpc3Quc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCisgICAgICAgIG9zLmNoZGlyKHBrZ19kaXIpCisKKyAgICAgICAgc3lzLmFyZ3YgPSBbJ3NldHVwLnB5J10KKyAgICAgICAgY21kID0gYmRpc3RfZHVtYihkaXN0KQorCisgICAgICAgICMgc28gdGhlIG91dHB1dCBpcyB0aGUgc2FtZSBubyBtYXR0ZXIKKyAgICAgICAgIyB3aGF0IGlzIHRoZSBwbGF0Zm9ybQorICAgICAgICBjbWQuZm9ybWF0ID0gJ3ppcCcKKworICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgc2VlIHdoYXQgd2UgaGF2ZQorICAgICAgICBkaXN0X2NyZWF0ZWQgPSBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZGlzdCcpKQorICAgICAgICBiYXNlID0gIiVzLiVzLnppcCIgJSAoZGlzdC5nZXRfZnVsbG5hbWUoKSwgY21kLnBsYXRfbmFtZSkKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnb3MyJzoKKyAgICAgICAgICAgIGJhc2UgPSBiYXNlLnJlcGxhY2UoJzonLCAnLScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0X2NyZWF0ZWQsIFtiYXNlXSkKKworICAgICAgICAjIG5vdyBsZXQncyBjaGVjayB3aGF0IHdlIGhhdmUgaW4gdGhlIHppcCBmaWxlCisgICAgICAgIGZwID0gemlwZmlsZS5aaXBGaWxlKG9zLnBhdGguam9pbignZGlzdCcsIGJhc2UpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50cyA9IGZwLm5hbWVsaXN0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICBjb250ZW50cyA9IHNvcnRlZChvcy5wYXRoLmJhc2VuYW1lKGZuKSBmb3IgZm4gaW4gY29udGVudHMpCisgICAgICAgIHdhbnRlZCA9IFsnZm9vLTAuMS1weSVzLiVzLmVnZy1pbmZvJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLCAnZm9vLnB5J10KKyAgICAgICAgaWYgbm90IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlOgorICAgICAgICAgICAgd2FudGVkLmFwcGVuZCgnZm9vLnB5YycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29udGVudHMsIHNvcnRlZCh3YW50ZWQpKQorCisgICAgZGVmIHRlc3RfZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBvcy5jaGRpcihwa2dfZGlyKQorICAgICAgICBjbWQgPSBiZGlzdF9kdW1iKGRpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJkaXN0X2RpciwgTm9uZSkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgICAgICMgYmRpc3RfZGlyIGlzIGluaXRpYWxpemVkIHRvIGJkaXN0X2Jhc2UvZHVtYiBpZiBub3Qgc2V0CisgICAgICAgIGJhc2UgPSBjbWQuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdiZGlzdCcpLmJkaXN0X2Jhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYmRpc3RfZGlyLCBvcy5wYXRoLmpvaW4oYmFzZSwgJ2R1bWInKSkKKworICAgICAgICAjIHRoZSBmb3JtYXQgaXMgc2V0IHRvIGEgZGVmYXVsdCB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIG9zLm5hbWUKKyAgICAgICAgZGVmYXVsdCA9IGNtZC5kZWZhdWx0X2Zvcm1hdFtvcy5uYW1lXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5mb3JtYXQsIGRlZmF1bHQpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZER1bWJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9kdW1iLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1NmE3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9kdW1iLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1NmE3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfZHVtYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9tc2kucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X21zaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGY3YzMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9tc2kucHkKQEAgLTAsMCArMSwyNiBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X21zaS4iIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0Citmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInLCAndGhlc2UgdGVzdHMgcmVxdWlyZSBXaW5kb3dzJykKK2NsYXNzIEJEaXN0TVNJVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEB1bml0dGVzdC5za2lwKCJSZXF1aXJlIGJkaXN0X21zaSIpCisgICAgZGVmIHRlc3RfbWluaW1hbChzZWxmKToKKyAgICAgICAgIyBtaW5pbWFsIHRlc3QgWFhYIG5lZWQgbW9yZSB0ZXN0cworICAgICAgICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X21zaSBpbXBvcnQgYmRpc3RfbXNpCisgICAgICAgIHByb2plY3RfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGJkaXN0X21zaShkaXN0KQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJEaXN0TVNJVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGNkOWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9tc2kucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfbXNpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGNkOWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9tc2kucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkODkxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CkBAIC0wLDAgKzEsMTM2IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtLiIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1dGlsCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtIGltcG9ydCBiZGlzdF9ycG0KK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgZmluZF9leGVjdXRhYmxlCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3Bhd24KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXhlY0Vycm9yCisKK1NFVFVQX1BZID0gIiIiXAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgc2V0dXAKK2ltcG9ydCBmb28KKworc2V0dXAobmFtZT0nZm9vJywgdmVyc2lvbj0nMC4xJywgcHlfbW9kdWxlcz1bJ2ZvbyddLAorICAgICAgdXJsPSd4eHgnLCBhdXRob3I9J3h4eCcsIGF1dGhvcl9lbWFpbD0neHh4JykKKworIiIiCisKK2NsYXNzIEJ1aWxkUnBtVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoQnVpbGRScG1UZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLm9sZF9sb2NhdGlvbiA9IG9zLmdldGN3ZCgpCisgICAgICAgIHNlbGYub2xkX3N5c19hcmd2ID0gc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLmNoZGlyKHNlbGYub2xkX2xvY2F0aW9uKQorICAgICAgICBzeXMuYXJndiA9IHNlbGYub2xkX3N5c19hcmd2WzBdCisgICAgICAgIHN5cy5hcmd2WzpdID0gc2VsZi5vbGRfc3lzX2FyZ3ZbMV0KKyAgICAgICAgc3VwZXIoQnVpbGRScG1UZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIHRlc3RfcXVpZXQoc2VsZik6CisKKyAgICAgICAgIyBYWFggSSBhbSB1bmFibGUgeWV0IHRvIG1ha2UgdGhpcyB0ZXN0IHdvcmsgd2l0aG91dAorICAgICAgICAjIHNwdXJpb3VzIHNkdG91dC9zdGRlcnIgb3V0cHV0IHVuZGVyIE1hYyBPUyBYCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnbGludXgyJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgdGhpcyB0ZXN0IHdpbGwgcnVuIG9ubHkgaWYgdGhlIHJwbSBjb21tYW5kcyBhcmUgZm91bmQKKyAgICAgICAgaWYgKGZpbmRfZXhlY3V0YWJsZSgncnBtJykgaXMgTm9uZSBvcgorICAgICAgICAgICAgZmluZF9leGVjdXRhYmxlKCdycG1idWlsZCcpIGlzIE5vbmUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBsZXQncyBjcmVhdGUgYSBwYWNrYWdlCisgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdmb28nKQorICAgICAgICBvcy5ta2Rpcihwa2dfZGlyKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHBrZ19kaXIsICdzZXR1cC5weScpLCBTRVRVUF9QWSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnZm9vLnB5JyksICcjJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnTUFOSUZFU1QuaW4nKSwgJ2luY2x1ZGUgZm9vLnB5JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChwa2dfZGlyLCAnUkVBRE1FJyksICcnKQorCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ2ZvbycsICd2ZXJzaW9uJzogJzAuMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweV9tb2R1bGVzJzogWydmb28nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6ICd4eHgnLCAnYXV0aG9yJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiAneHh4J30pCisgICAgICAgIGRpc3Quc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCisgICAgICAgIG9zLmNoZGlyKHBrZ19kaXIpCisKKyAgICAgICAgc3lzLmFyZ3YgPSBbJ3NldHVwLnB5J10KKyAgICAgICAgY21kID0gYmRpc3RfcnBtKGRpc3QpCisgICAgICAgIGNtZC5maXhfcHl0aG9uID0gVHJ1ZQorCisgICAgICAgICMgcnVubmluZyBpbiBxdWlldCBtb2RlCisgICAgICAgIGNtZC5xdWlldCA9IDEKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICBkaXN0X2NyZWF0ZWQgPSBvcy5saXN0ZGlyKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZGlzdCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zvby0wLjEtMS5ub2FyY2gucnBtJyBpbiBkaXN0X2NyZWF0ZWQpCisKKyAgICAgICAgIyBidWcgIzI5NDU6IHVwbG9hZCBpZ25vcmVzIGJkaXN0X3JwbSBmaWxlcworICAgICAgICBzZWxmLmFzc2VydEluKCgnYmRpc3RfcnBtJywgJ2FueScsICdkaXN0L2Zvby0wLjEtMS5zcmMucnBtJyksIGRpc3QuZGlzdF9maWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2JkaXN0X3JwbScsICdhbnknLCAnZGlzdC9mb28tMC4xLTEubm9hcmNoLnJwbScpLCBkaXN0LmRpc3RfZmlsZXMpCisKKyAgICBkZWYgdGVzdF9ub19vcHRpbWl6ZV9mbGFnKHNlbGYpOgorCisgICAgICAgICMgWFhYIEkgYW0gdW5hYmxlIHlldCB0byBtYWtlIHRoaXMgdGVzdCB3b3JrIHdpdGhvdXQKKyAgICAgICAgIyBzcHVyaW91cyBzZHRvdXQvc3RkZXJyIG91dHB1dCB1bmRlciBNYWMgT1MgWAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ2xpbnV4Mic6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNTMzMTY0CisgICAgICAgICMgdGhpcyB0ZXN0IHdpbGwgcnVuIG9ubHkgaWYgdGhlIHJwbSBjb21tYW5kIGlzIGZvdW5kCisgICAgICAgIGlmIChmaW5kX2V4ZWN1dGFibGUoJ3JwbScpIGlzIE5vbmUgb3IKKyAgICAgICAgICAgIGZpbmRfZXhlY3V0YWJsZSgncnBtYnVpbGQnKSBpcyBOb25lKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgbGV0J3MgY3JlYXRlIGEgcGFja2FnZSB0aGF0IGJyYWtlcyBiZGlzdF9ycG0KKyAgICAgICAgdG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHBrZ19kaXIgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2ZvbycpCisgICAgICAgIG9zLm1rZGlyKHBrZ19kaXIpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgocGtnX2RpciwgJ3NldHVwLnB5JyksIFNFVFVQX1BZKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHBrZ19kaXIsICdmb28ucHknKSwgJyMnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHBrZ19kaXIsICdNQU5JRkVTVC5pbicpLCAnaW5jbHVkZSBmb28ucHknKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHBrZ19kaXIsICdSRUFETUUnKSwgJycpCisKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAnZm9vJywgJ3ZlcnNpb24nOiAnMC4xJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B5X21vZHVsZXMnOiBbJ2ZvbyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJsJzogJ3h4eCcsICdhdXRob3InOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCc6ICd4eHgnfSkKKyAgICAgICAgZGlzdC5zY3JpcHRfbmFtZSA9ICdzZXR1cC5weScKKyAgICAgICAgb3MuY2hkaXIocGtnX2RpcikKKworICAgICAgICBzeXMuYXJndiA9IFsnc2V0dXAucHknXQorICAgICAgICBjbWQgPSBiZGlzdF9ycG0oZGlzdCkKKyAgICAgICAgY21kLmZpeF9weXRob24gPSBUcnVlCisKKyAgICAgICAgY21kLnF1aWV0ID0gMQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIGRpc3RfY3JlYXRlZCA9IG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZm9vLTAuMS0xLm5vYXJjaC5ycG0nIGluIGRpc3RfY3JlYXRlZCkKKworICAgICAgICAjIGJ1ZyAjMjk0NTogdXBsb2FkIGlnbm9yZXMgYmRpc3RfcnBtIGZpbGVzCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdiZGlzdF9ycG0nLCAnYW55JywgJ2Rpc3QvZm9vLTAuMS0xLnNyYy5ycG0nKSwgZGlzdC5kaXN0X2ZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnYmRpc3RfcnBtJywgJ2FueScsICdkaXN0L2Zvby0wLjEtMS5ub2FyY2gucnBtJyksIGRpc3QuZGlzdF9maWxlcykKKworICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JywgJ2Zvby0wLjEtMS5ub2FyY2gucnBtJykpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZFJwbVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMDBhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJlMDBhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiMTNiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3Rfd2luaW5zdC5weQpAQCAtMCwwICsxLDMyIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3Rfd2luaW5zdC4iIiIKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF93aW5pbnN0IGltcG9ydCBiZGlzdF93aW5pbnN0Citmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorCitjbGFzcyBCdWlsZFdpbkluc3RUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9nZXRfZXhlX2J5dGVzKHNlbGYpOgorCisgICAgICAgICMgaXNzdWU1NzMxOiBjb21tYW5kIHdhcyBicm9rZW4gb24gbm9uLXdpbmRvd3MgcGxhdGZvcm1zCisgICAgICAgICMgdGhpcyB0ZXN0IG1ha2VzIHN1cmUgaXQgd29ya3Mgbm93IGZvciBldmVyeSBwbGF0Zm9ybQorICAgICAgICAjIGxldCdzIGNyZWF0ZSBhIGNvbW1hbmQKKyAgICAgICAgcGtnX3B0aCwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBiZGlzdF93aW5pbnN0KGRpc3QpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKworICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29kZSB0aGF0IGZpbmRzIHRoZSByaWdodCB3aW5pbnN0Ki5leGUgZmlsZQorICAgICAgICAjIGFuZCBtYWtlIHN1cmUgaXQgZmluZHMgaXQgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQKKyAgICAgICAgIyBubyBtYXR0ZXIgd2hhdCBwbGF0Zm9ybSB3ZSBoYXZlCisgICAgICAgIGV4ZV9maWxlID0gY21kLmdldF9leGVfYnl0ZXMoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGV4ZV9maWxlKSA+IDEwKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRXaW5JbnN0VGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3Rfd2luaW5zdC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWZhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3Rfd2luaW5zdC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOWZhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3dpbmluc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGQucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjhkNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5CkBAIC0wLDAgKzEsNTUgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5idWlsZC4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZCBpbXBvcnQgYnVpbGQKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHN5c2NvbmZpZyBpbXBvcnQgZ2V0X3BsYXRmb3JtCisKK2NsYXNzIEJ1aWxkVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gYnVpbGQoZGlzdCkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgICAgICMgaWYgbm90IHNwZWNpZmllZCwgcGxhdF9uYW1lIGdldHMgdGhlIGN1cnJlbnQgcGxhdGZvcm0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQucGxhdF9uYW1lLCBnZXRfcGxhdGZvcm0oKSkKKworICAgICAgICAjIGJ1aWxkX3B1cmVsaWIgaXMgYnVpbGQgKyBsaWIKKyAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGNtZC5idWlsZF9iYXNlLCAnbGliJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfcHVyZWxpYiwgd2FudGVkKQorCisgICAgICAgICMgYnVpbGRfcGxhdGxpYiBpcyAnYnVpbGQvbGliLnBsYXRmb3JtLXgueFstcHlkZWJ1Z10nCisgICAgICAgICMgZXhhbXBsZXM6CisgICAgICAgICMgICBidWlsZC9saWIubWFjb3N4LTEwLjMtaTM4Ni0yLjcKKyAgICAgICAgcGxhdF9zcGVjID0gJy4lcy0lcycgJSAoY21kLnBsYXRfbmFtZSwgc3lzLnZlcnNpb25bMDozXSkKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50Jyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmJ1aWxkX3BsYXRsaWIuZW5kc3dpdGgoJy1weWRlYnVnJykpCisgICAgICAgICAgICBwbGF0X3NwZWMgKz0gJy1weWRlYnVnJworICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY21kLmJ1aWxkX2Jhc2UsICdsaWInICsgcGxhdF9zcGVjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9wbGF0bGliLCB3YW50ZWQpCisKKyAgICAgICAgIyBieSBkZWZhdWx0LCBidWlsZF9saWIgPSBidWlsZF9wdXJlbGliCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX2xpYiwgY21kLmJ1aWxkX3B1cmVsaWIpCisKKyAgICAgICAgIyBidWlsZF90ZW1wIGlzIGJ1aWxkL3RlbXAuPHBsYXQ+CisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwgJ3RlbXAnICsgcGxhdF9zcGVjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF90ZW1wLCB3YW50ZWQpCisKKyAgICAgICAgIyBidWlsZF9zY3JpcHRzIGlzIGJ1aWxkL3NjcmlwdHMteC54CisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjbWQuYnVpbGRfYmFzZSwgJ3NjcmlwdHMtJyArICBzeXMudmVyc2lvblswOjNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9zY3JpcHRzLCB3YW50ZWQpCisKKyAgICAgICAgIyBleGVjdXRhYmxlIGlzIG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmV4ZWN1dGFibGUsIG9zLnBhdGgubm9ybXBhdGgoc3lzLmV4ZWN1dGFibGUpKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM4OGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjM4OGFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZjFiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHkKQEAgLTAsMCArMSwxNDYgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGliLiIiIgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfY2xpYiBpbXBvcnQgYnVpbGRfY2xpYgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQorCitjbGFzcyBCdWlsZENMaWJUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5Mb2dnaW5nU2lsZW5jZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jaGVja19saWJyYXJ5X2Rpc3Qoc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gYnVpbGRfY2xpYihkaXN0KQorCisgICAgICAgICMgJ2xpYnJhcmllcycgb3B0aW9uIG11c3QgYmUgYSBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5jaGVja19saWJyYXJ5X2xpc3QsICdmb28nKQorCisgICAgICAgICMgZWFjaCBlbGVtZW50IG9mICdsaWJyYXJpZXMnIG11c3QgYSAyLXR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5jaGVja19saWJyYXJ5X2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZm9vMScsICdmb28yJ10pCisKKyAgICAgICAgIyBmaXJzdCBlbGVtZW50IG9mIGVhY2ggdHVwbGUgaW4gJ2xpYnJhcmllcycKKyAgICAgICAgIyBtdXN0IGJlIGEgc3RyaW5nICh0aGUgbGlicmFyeSBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuY2hlY2tfbGlicmFyeV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdmb28xJyksICgnbmFtZScsICdmb28yJyldKQorCisgICAgICAgICMgbGlicmFyeSBuYW1lIG1heSBub3QgY29udGFpbiBkaXJlY3Rvcnkgc2VwYXJhdG9ycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuY2hlY2tfbGlicmFyeV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKCduYW1lJywgJ2ZvbzEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYW5vdGhlci9uYW1lJywgJ2ZvbzInKV0pCisKKyAgICAgICAgIyBzZWNvbmQgZWxlbWVudCBvZiBlYWNoIHR1cGxlIG11c3QgYmUgYSBkaWN0aW9uYXJ5IChidWlsZCBpbmZvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuY2hlY2tfbGlicmFyeV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKCduYW1lJywge30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdhbm90aGVyJywgJ2ZvbzInKV0pCisKKyAgICAgICAgIyB0aG9zZSB3b3JrCisgICAgICAgIGxpYnMgPSBbKCduYW1lJywge30pLCAoJ25hbWUnLCB7J29rJzogJ2dvb2QnfSldCisgICAgICAgIGNtZC5jaGVja19saWJyYXJ5X2xpc3QobGlicykKKworICAgIGRlZiB0ZXN0X2dldF9zb3VyY2VfZmlsZXMoc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gYnVpbGRfY2xpYihkaXN0KQorCisgICAgICAgICMgImluICdsaWJyYXJpZXMnIG9wdGlvbiAnc291cmNlcycgbXVzdCBiZSBwcmVzZW50IGFuZCBtdXN0IGJlCisgICAgICAgICMgYSBsaXN0IG9mIHNvdXJjZSBmaWxlbmFtZXMKKyAgICAgICAgY21kLmxpYnJhcmllcyA9IFsoJ25hbWUnLCB7fSldCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5nZXRfc291cmNlX2ZpbGVzKQorCisgICAgICAgIGNtZC5saWJyYXJpZXMgPSBbKCduYW1lJywgeydzb3VyY2VzJzogMX0pXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuZ2V0X3NvdXJjZV9maWxlcykKKworICAgICAgICBjbWQubGlicmFyaWVzID0gWygnbmFtZScsIHsnc291cmNlcyc6IFsnYScsICdiJ119KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZ2V0X3NvdXJjZV9maWxlcygpLCBbJ2EnLCAnYiddKQorCisgICAgICAgIGNtZC5saWJyYXJpZXMgPSBbKCduYW1lJywgeydzb3VyY2VzJzogKCdhJywgJ2InKX0pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5nZXRfc291cmNlX2ZpbGVzKCksIFsnYScsICdiJ10pCisKKyAgICAgICAgY21kLmxpYnJhcmllcyA9IFsoJ25hbWUnLCB7J3NvdXJjZXMnOiAoJ2EnLCAnYicpfSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCduYW1lMicsIHsnc291cmNlcyc6IFsnYycsICdkJ119KV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZ2V0X3NvdXJjZV9maWxlcygpLCBbJ2EnLCAnYicsICdjJywgJ2QnXSkKKworICAgIGRlZiB0ZXN0X2J1aWxkX2xpYnJhcmllcyhzZWxmKToKKworICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGJ1aWxkX2NsaWIoZGlzdCkKKyAgICAgICAgY2xhc3MgRmFrZUNvbXBpbGVyOgorICAgICAgICAgICAgZGVmIGNvbXBpbGUoKmFyZ3MsICoqa3cpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGNyZWF0ZV9zdGF0aWNfbGliID0gY29tcGlsZQorCisgICAgICAgIGNtZC5jb21waWxlciA9IEZha2VDb21waWxlcigpCisKKyAgICAgICAgIyBidWlsZF9saWJyYXJpZXMgaXMgYWxzbyBkb2luZyBhIGJpdCBvZiB0eXBvZSBjaGVja2luZworICAgICAgICBsaWIgPSBbKCduYW1lJywgeydzb3VyY2VzJzogJ25vdHZhbGlkJ30pXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuYnVpbGRfbGlicmFyaWVzLCBsaWIpCisKKyAgICAgICAgbGliID0gWygnbmFtZScsIHsnc291cmNlcyc6IGxpc3QoKX0pXQorICAgICAgICBjbWQuYnVpbGRfbGlicmFyaWVzKGxpYikKKworICAgICAgICBsaWIgPSBbKCduYW1lJywgeydzb3VyY2VzJzogdHVwbGUoKX0pXQorICAgICAgICBjbWQuYnVpbGRfbGlicmFyaWVzKGxpYikKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gYnVpbGRfY2xpYihkaXN0KQorCisgICAgICAgIGNtZC5pbmNsdWRlX2RpcnMgPSAnb25lLWRpcicKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5pbmNsdWRlX2RpcnMsIFsnb25lLWRpciddKQorCisgICAgICAgIGNtZC5pbmNsdWRlX2RpcnMgPSBOb25lCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuaW5jbHVkZV9kaXJzLCBbXSkKKworICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLmxpYnJhcmllcyA9ICdXT05UV09SSycKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmZpbmFsaXplX29wdGlvbnMpCisKKyAgICBkZWYgdGVzdF9ydW4oc2VsZik6CisgICAgICAgICMgY2FuJ3QgdGVzdCBvbiB3aW5kb3dzCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBidWlsZF9jbGliKGRpc3QpCisKKyAgICAgICAgZm9vX2MgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2Zvby5jJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGZvb19jLCAnaW50IG1haW4odm9pZCkgeyByZXR1cm4gMTt9XG4nKQorICAgICAgICBjbWQubGlicmFyaWVzID0gWygnZm9vJywgeydzb3VyY2VzJzogW2Zvb19jXX0pXQorCisgICAgICAgIGJ1aWxkX3RlbXAgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2J1aWxkJykKKyAgICAgICAgb3MubWtkaXIoYnVpbGRfdGVtcCkKKyAgICAgICAgY21kLmJ1aWxkX3RlbXAgPSBidWlsZF90ZW1wCisgICAgICAgIGNtZC5idWlsZF9jbGliID0gYnVpbGRfdGVtcAorCisgICAgICAgICMgYmVmb3JlIHdlIHJ1biB0aGUgY29tbWFuZCwgd2Ugd2FudCB0byBtYWtlIHN1cmUKKyAgICAgICAgIyBhbGwgY29tbWFuZHMgYXJlIHByZXNlbnQgb24gdGhlIHN5c3RlbQorICAgICAgICAjIGJ5IGNyZWF0aW5nIGEgY29tcGlsZXIgYW5kIGNoZWNraW5nIGl0cyBleGVjdXRhYmxlcworICAgICAgICBmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IG5ld19jb21waWxlcgorICAgICAgICBmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlcgorCisgICAgICAgIGNvbXBpbGVyID0gbmV3X2NvbXBpbGVyKCkKKyAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQorICAgICAgICBmb3IgY2NtZCBpbiBjb21waWxlci5leGVjdXRhYmxlcy52YWx1ZXMoKToKKyAgICAgICAgICAgIGlmIGNjbWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgZmluZF9leGVjdXRhYmxlKGNjbWRbMF0pIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuICMgY2FuJ3QgdGVzdAorCisgICAgICAgICMgdGhpcyBzaG91bGQgd29yaworICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdsaWJmb28uYScgaW4gb3MubGlzdGRpcihidWlsZF90ZW1wKSkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkQ0xpYlRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIzY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGIzY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzZlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQpAQCAtMCwwICsxLDUyMiBAQAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHRleHR3cmFwCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IEV4dGVuc2lvbiwgRGlzdHJpYnV0aW9uCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0Citmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAoRGlzdHV0aWxzU2V0dXBFcnJvciwgQ29tcGlsZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcikKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0MzczCisjIERvbid0IGxvYWQgdGhlIHh4IG1vZHVsZSBtb3JlIHRoYW4gb25jZS4KK0FMUkVBRFlfVEVTVEVEID0gRmFsc2UKKworCitjbGFzcyBCdWlsZEV4dFRlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihCdWlsZEV4dFRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYudG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHNlbGYueHhfY3JlYXRlZCA9IEZhbHNlCisgICAgICAgIHN5cy5wYXRoLmFwcGVuZChzZWxmLnRtcF9kaXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzeXMucGF0aC5yZW1vdmUsIHNlbGYudG1wX2RpcikKKyAgICAgICAgaWYgc3lzLnZlcnNpb24gPiAiMi42IjoKKyAgICAgICAgICAgIGltcG9ydCBzaXRlCisgICAgICAgICAgICBzZWxmLm9sZF91c2VyX2Jhc2UgPSBzaXRlLlVTRVJfQkFTRQorICAgICAgICAgICAgc2l0ZS5VU0VSX0JBU0UgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgYnVpbGRfZXh0CisgICAgICAgICAgICBidWlsZF9leHQuVVNFUl9CQVNFID0gc2l0ZS5VU0VSX0JBU0UKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi54eF9jcmVhdGVkOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubG9hZCgneHgnKQorICAgICAgICAgICAgIyBYWFggb24gV2luZG93cyB0aGUgdGVzdCBsZWF2ZXMgYSBkaXJlY3RvcnkKKyAgICAgICAgICAgICMgd2l0aCB4eCBtb2R1bGUgaW4gVEVNUAorICAgICAgICBzdXBlcihCdWlsZEV4dFRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgdGVzdF9idWlsZF9leHQoc2VsZik6CisgICAgICAgIGdsb2JhbCBBTFJFQURZX1RFU1RFRAorICAgICAgICBzdXBwb3J0LmNvcHlfeHhtb2R1bGVfYyhzZWxmLnRtcF9kaXIpCisgICAgICAgIHNlbGYueHhfY3JlYXRlZCA9IFRydWUKKyAgICAgICAgeHhfYyA9IG9zLnBhdGguam9pbihzZWxmLnRtcF9kaXIsICd4eG1vZHVsZS5jJykKKyAgICAgICAgeHhfZXh0ID0gRXh0ZW5zaW9uKCd4eCcsIFt4eF9jXSkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAneHgnLCAnZXh0X21vZHVsZXMnOiBbeHhfZXh0XX0pCisgICAgICAgIGRpc3QucGFja2FnZV9kaXIgPSBzZWxmLnRtcF9kaXIKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIHN1cHBvcnQuZml4dXBfYnVpbGRfZXh0KGNtZCkKKyAgICAgICAgY21kLmJ1aWxkX2xpYiA9IHNlbGYudG1wX2RpcgorICAgICAgICBjbWQuYnVpbGRfdGVtcCA9IHNlbGYudG1wX2RpcgorCisgICAgICAgIG9sZF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGlmIG5vdCB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICMgc2lsZW5jZSBjb21waWxlciBvdXRwdXQKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgICAgICNCcm9rZW4gYWZ0ZXIgaXNzdWUgNzcxMihyNzgxMzYpIDogYWRkIGEgdGVtcF9jd2QgY29udGV4dCBtYW5hZ2VyIHRvIHRlc3Rfc3VwcG9ydCAuLi4KKyAgICAgICAgICAgICNXaXRob3V0IGN1cnJlbnQgd29ya2luZyBkaXI6ICIuLi5jYW5ub3QgZmluZCAtbHB5dGhvbjI3IgorICAgICAgICAgICAgI05PVEU6IFtweTNrIHN2biByODU1NTldIEZpcnN0ICh1bmNvbnRyb3ZlcnNpYWwpIHBhcnQgb2YgaXNzdWUgOTgwNywgYmFycnkud2Fyc2F3LCAyMDEwLTEwLTE2IDoKKyAgICAgICAgICAgICMgIG5ldyBfZml4dXBfY29tbWFuZCBpcyBib2d1cywgc28gd2Ugd2lsbCB1c2Ugb3duIHdvcmstYXJvdW5kCisgICAgICAgICAgICBjbWQubGlicmFyeV9kaXJzLmluc2VydCgwLCB0ZXN0X3N1cHBvcnQuU0FWRURDV0QpCisgICAgICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvbGRfc3Rkb3V0CisKKyAgICAgICAgaWYgQUxSRUFEWV9URVNURUQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEFMUkVBRFlfVEVTVEVEID0gVHJ1ZQorCisgICAgICAgIGltcG9ydCB4eAorCisgICAgICAgIGZvciBhdHRyIGluICgnZXJyb3InLCAnZm9vJywgJ25ldycsICdyb2onKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHh4LCBhdHRyKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHh4LmZvbygyLCA1KSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5mb28oMTMsMTUpLCAyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4eC5uZXcoKS5kZW1vKCksIE5vbmUpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5IQVZFX0RPQ1NUUklOR1M6CisgICAgICAgICAgICBkb2MgPSAnVGhpcyBpcyBhIHRlbXBsYXRlIG1vZHVsZSBqdXN0IGZvciBpbnN0cnVjdGlvbi4nCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHh4Ll9fZG9jX18sIGRvYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeHguTnVsbCgpLCB4eC5OdWxsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeHguU3RyKCksIHh4LlN0cikpCisKKyAgICBkZWYgdGVzdF9zb2xhcmlzX2VuYWJsZV9zaGFyZWQoc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4J30pCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBvbGQgPSBzeXMucGxhdGZvcm0KKworICAgICAgICBzeXMucGxhdGZvcm0gPSAnc3Vub3MnICMgZm9vbGluZyBmaW5hbGl6ZV9vcHRpb25zCisgICAgICAgIGZyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgIF9jb25maWdfdmFycworICAgICAgICBvbGRfdmFyID0gX2NvbmZpZ192YXJzLmdldCgnUHlfRU5BQkxFX1NIQVJFRCcpCisgICAgICAgIF9jb25maWdfdmFyc1snUHlfRU5BQkxFX1NIQVJFRCddID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGxhdGZvcm0gPSBvbGQKKyAgICAgICAgICAgIGlmIG9sZF92YXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgX2NvbmZpZ192YXJzWydQeV9FTkFCTEVfU0hBUkVEJ10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydQeV9FTkFCTEVfU0hBUkVEJ10gPSBvbGRfdmFyCisKKyAgICAgICAgIyBtYWtlIHN1cmUgd2UgZ2V0IHNvbWUgbGlicmFyeSBkaXJzIHVuZGVyIHNvbGFyaXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihjbWQubGlicmFyeV9kaXJzKSA+IDApCisKKyAgICBkZWYgdGVzdF91c2VyX3NpdGUoc2VsZik6CisgICAgICAgICMgc2l0ZS5VU0VSX1NJVEUgd2FzIGludHJvZHVjZWQgaW4gMi42CisgICAgICAgIGlmIHN5cy52ZXJzaW9uIDwgJzIuNic6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpbXBvcnQgc2l0ZQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCd9KQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKworICAgICAgICAjIG1ha2luZyBzdXJlIHRoZSB1c2VyIG9wdGlvbiBpcyB0aGVyZQorICAgICAgICBvcHRpb25zID0gW25hbWUgZm9yIG5hbWUsIHNob3J0LCBsYWJlbCBpbgorICAgICAgICAgICAgICAgICAgIGNtZC51c2VyX29wdGlvbnNdCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZXInLCBvcHRpb25zKQorCisgICAgICAgICMgc2V0dGluZyBhIHZhbHVlCisgICAgICAgIGNtZC51c2VyID0gMQorCisgICAgICAgICMgc2V0dGluZyB1c2VyIGJhc2VkIGxpYiBhbmQgaW5jbHVkZQorICAgICAgICBsaWIgPSBvcy5wYXRoLmpvaW4oc2l0ZS5VU0VSX0JBU0UsICdsaWInKQorICAgICAgICBpbmNsID0gb3MucGF0aC5qb2luKHNpdGUuVVNFUl9CQVNFLCAnaW5jbHVkZScpCisgICAgICAgIG9zLm1rZGlyKGxpYikKKyAgICAgICAgb3MubWtkaXIoaW5jbCkKKworICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisKKyAgICAgICAgIyBzZWUgaWYgaW5jbHVkZV9kaXJzIGFuZCBsaWJyYXJ5X2RpcnMgd2VyZSBzZXQKKyAgICAgICAgc2VsZi5hc3NlcnRJbihsaWIsIGNtZC5saWJyYXJ5X2RpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obGliLCBjbWQucnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaW5jbCwgY21kLmluY2x1ZGVfZGlycykKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIFB5dGhvbidzIGluY2x1ZGUgZGlyZWN0b3JpZXMgKGZvciBQeXRob24uaCwgcHljb25maWcuaCwKKyAgICAgICAgIyBldGMuKSBhcmUgaW4gdGhlIGluY2x1ZGUgc2VhcmNoIHBhdGguCisgICAgICAgIG1vZHVsZXMgPSBbRXh0ZW5zaW9uKCdmb28nLCBbJ3h4eCddKV0KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAneHgnLCAnZXh0X21vZHVsZXMnOiBtb2R1bGVzfSkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKworICAgICAgICBweV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB5X2luY2x1ZGUgaW4gY21kLmluY2x1ZGVfZGlycykKKworICAgICAgICBwbGF0X3B5X2luY2x1ZGUgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0xKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhdF9weV9pbmNsdWRlIGluIGNtZC5pbmNsdWRlX2RpcnMpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgY21kLmxpYnJhcmllcyBpcyB0dXJuZWQgaW50byBhIGxpc3QKKyAgICAgICAgIyBpZiBpdCdzIGEgc3RyaW5nCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBjbWQubGlicmFyaWVzID0gJ215X2xpYiwgb3RoZXJfbGliIGxhc3RsaWInCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQubGlicmFyaWVzLCBbJ215X2xpYicsICdvdGhlcl9saWInLCAnbGFzdGxpYiddKQorCisgICAgICAgICMgbWFrZSBzdXJlIGNtZC5saWJyYXJ5X2RpcnMgaXMgdHVybmVkIGludG8gYSBsaXN0CisgICAgICAgICMgaWYgaXQncyBhIHN0cmluZworICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9ICdteV9saWJfZGlyJXNvdGhlcl9saWJfZGlyJyAlIG9zLnBhdGhzZXAKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEluKCdteV9saWJfZGlyJywgY21kLmxpYnJhcnlfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignb3RoZXJfbGliX2RpcicsIGNtZC5saWJyYXJ5X2RpcnMpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgcnBhdGggaXMgdHVybmVkIGludG8gYSBsaXN0CisgICAgICAgICMgaWYgaXQncyBhIHN0cmluZworICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLnJwYXRoID0gJ29uZSVzdHdvJyAlIG9zLnBhdGhzZXAKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5ycGF0aCwgWydvbmUnLCAndHdvJ10pCisKKyAgICAgICAgIyBYWFggbW9yZSB0ZXN0cyB0byBwZXJmb3JtIGZvciB3aW4zMgorCisgICAgICAgICMgbWFrZSBzdXJlIGRlZmluZSBpcyB0dXJuZWQgaW50byAyLXR1cGxlcworICAgICAgICAjIHN0cmluZ3MgaWYgdGhleSBhcmUgJywnLXNlcGFyYXRlZCBzdHJpbmdzCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBjbWQuZGVmaW5lID0gJ29uZSx0d28nCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZGVmaW5lLCBbKCdvbmUnLCAnMScpLCAoJ3R3bycsICcxJyldKQorCisgICAgICAgICMgbWFrZSBzdXJlIHVuZGVmIGlzIHR1cm5lZCBpbnRvIGEgbGlzdCBvZgorICAgICAgICAjIHN0cmluZ3MgaWYgdGhleSBhcmUgJywnLXNlcGFyYXRlZCBzdHJpbmdzCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBjbWQudW5kZWYgPSAnb25lLHR3bycKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC51bmRlZiwgWydvbmUnLCAndHdvJ10pCisKKyAgICAgICAgIyBtYWtlIHN1cmUgc3dpZ19vcHRzIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLnN3aWdfb3B0cyA9IE5vbmUKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5zd2lnX29wdHMsIFtdKQorCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBjbWQuc3dpZ19vcHRzID0gJzEgMicKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5zd2lnX29wdHMsIFsnMScsICcyJ10pCisKKyAgICBkZWYgdGVzdF9jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorCisgICAgICAgICMnZXh0ZW5zaW9ucycgb3B0aW9uIG11c3QgYmUgYSBsaXN0IG9mIEV4dGVuc2lvbiBpbnN0YW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmNoZWNrX2V4dGVuc2lvbnNfbGlzdCwgJ2ZvbycpCisKKyAgICAgICAgIyBlYWNoIGVsZW1lbnQgb2YgJ2V4dF9tb2R1bGVzJyBvcHRpb24gbXVzdCBiZSBhbgorICAgICAgICAjIEV4dGVuc2lvbiBpbnN0YW5jZSBvciAyLXR1cGxlCisgICAgICAgIGV4dHMgPSBbKCdiYXInLCAnZm9vJywgJ2JhcicpLCAnZm9vJ10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmNoZWNrX2V4dGVuc2lvbnNfbGlzdCwgZXh0cykKKworICAgICAgICAjIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBpbiAnZXh0X21vZHVsZXMnCisgICAgICAgICMgbXVzdCBiZSB0aGUgZXh0ZW5zaW9uIG5hbWUgKGEgc3RyaW5nKSBhbmQgbWF0Y2gKKyAgICAgICAgIyBhIHB5dGhvbiBkb3R0ZWQtc2VwYXJhdGVkIG5hbWUKKyAgICAgICAgZXh0cyA9IFsoJ2Zvby1iYXInLCAnJyldCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5jaGVja19leHRlbnNpb25zX2xpc3QsIGV4dHMpCisKKyAgICAgICAgIyBzZWNvbmQgZWxlbWVudCBvZiBlYWNoIHR1cGxlIGluICdleHRfbW9kdWxlcycKKyAgICAgICAgIyBtdXN0IGJlIGEgYXJ5IChidWlsZCBpbmZvKQorICAgICAgICBleHRzID0gWygnZm9vLmJhcicsICcnKV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLmNoZWNrX2V4dGVuc2lvbnNfbGlzdCwgZXh0cykKKworICAgICAgICAjIG9rIHRoaXMgb25lIHNob3VsZCBwYXNzCisgICAgICAgIGV4dHMgPSBbKCdmb28uYmFyJywgeydzb3VyY2VzJzogWycnXSwgJ2xpYnJhcmllcyc6ICdmb28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZSc6ICdiYXInfSldCisgICAgICAgIGNtZC5jaGVja19leHRlbnNpb25zX2xpc3QoZXh0cykKKyAgICAgICAgZXh0ID0gZXh0c1swXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShleHQsIEV4dGVuc2lvbikpCisKKyAgICAgICAgIyBjaGVja19leHRlbnNpb25zX2xpc3QgYWRkcyBpbiBleHQgdGhlIHZhbHVlcyBwYXNzZWQKKyAgICAgICAgIyB3aGVuIHRoZXkgYXJlIGluICgnaW5jbHVkZV9kaXJzJywgJ2xpYnJhcnlfZGlycycsICdsaWJyYXJpZXMnCisgICAgICAgICMgJ2V4dHJhX29iamVjdHMnLCAnZXh0cmFfY29tcGlsZV9hcmdzJywgJ2V4dHJhX2xpbmtfYXJncycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0LmxpYnJhcmllcywgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihleHQsICdzb21lJykpCisKKyAgICAgICAgIyAnbWFjcm9zJyBlbGVtZW50IG9mIGJ1aWxkIGluZm8gZGljdCBtdXN0IGJlIDEtIG9yIDItdHVwbGUKKyAgICAgICAgZXh0cyA9IFsoJ2Zvby5iYXInLCB7J3NvdXJjZXMnOiBbJyddLCAnbGlicmFyaWVzJzogJ2ZvbycsCisgICAgICAgICAgICAgICAgJ3NvbWUnOiAnYmFyJywgJ21hY3Jvcyc6IFsoJzEnLCAnMicsICczJyksICdmb28nXX0pXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBjbWQuY2hlY2tfZXh0ZW5zaW9uc19saXN0LCBleHRzKQorCisgICAgICAgIGV4dHNbMF1bMV1bJ21hY3JvcyddID0gWygnMScsICcyJyksICgnMycsKV0KKyAgICAgICAgY21kLmNoZWNrX2V4dGVuc2lvbnNfbGlzdChleHRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHNbMF0udW5kZWZfbWFjcm9zLCBbJzMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRzWzBdLmRlZmluZV9tYWNyb3MsIFsoJzEnLCAnMicpXSkKKworICAgIGRlZiB0ZXN0X2dldF9zb3VyY2VfZmlsZXMoc2VsZik6CisgICAgICAgIG1vZHVsZXMgPSBbRXh0ZW5zaW9uKCdmb28nLCBbJ3h4eCddKV0KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAneHgnLCAnZXh0X21vZHVsZXMnOiBtb2R1bGVzfSkKKyAgICAgICAgY21kID0gYnVpbGRfZXh0KGRpc3QpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZ2V0X3NvdXJjZV9maWxlcygpLCBbJ3h4eCddKQorCisgICAgZGVmIHRlc3RfY29tcGlsZXJfb3B0aW9uKHNlbGYpOgorICAgICAgICAjIGNtZC5jb21waWxlciBpcyBhbiBvcHRpb24gYW5kCisgICAgICAgICMgc2hvdWxkIG5vdCBiZSBvdmVycmlkZW4gYnkgYSBjb21waWxlciBpbnN0YW5jZQorICAgICAgICAjIHdoZW4gdGhlIGNvbW1hbmQgaXMgcnVuCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmNvbXBpbGVyID0gJ3VuaXgnCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmNvbXBpbGVyLCAndW5peCcpCisKKyAgICBkZWYgdGVzdF9nZXRfb3V0cHV0cyhzZWxmKToKKyAgICAgICAgdG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGNfZmlsZSA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZm9vLmMnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoY19maWxlLCAndm9pZCBpbml0Zm9vKHZvaWQpIHt9O1xuJykKKyAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKCdmb28nLCBbY19maWxlXSkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAneHgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0X21vZHVsZXMnOiBbZXh0XX0pCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBzdXBwb3J0LmZpeHVwX2J1aWxkX2V4dChjbWQpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY21kLmdldF9vdXRwdXRzKCkpLCAxKQorCisgICAgICAgIGNtZC5idWlsZF9saWIgPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBfZGlyLCAnYnVpbGQnKQorICAgICAgICBjbWQuYnVpbGRfdGVtcCA9IG9zLnBhdGguam9pbihzZWxmLnRtcF9kaXIsICd0ZW1wdCcpCisKKyAgICAgICAgIyBpc3N1ZSAjNTk3NyA6IGRpc3R1dGlscyBidWlsZF9leHQuZ2V0X291dHB1dHMKKyAgICAgICAgIyByZXR1cm5zIHdyb25nIHJlc3VsdCB3aXRoIC0taW5wbGFjZQorICAgICAgICBvdGhlcl90bXBfZGlyID0gb3MucGF0aC5yZWFscGF0aChzZWxmLm1rZHRlbXAoKSkKKyAgICAgICAgb2xkX3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgI1dpdGhvdXQgY3VycmVudCB3b3JraW5nIGRpcjogIi4uLmNhbm5vdCBmaW5kIC1scHl0aG9uMjciCisgICAgICAgICNOT1RFOiBBZnRlciBpc3N1ZSAjNzcxMihyNzgxMzYpIHRlc3QgY2Fubm90IHVzZSBvbGRfd2QgIQorICAgICAgICAjY21kLmxpYnJhcnlfZGlycy5pbnNlcnQoMCwgb2xkX3dkKQorICAgICAgICAjTk9URTogW3B5M2sgc3ZuIHI4NTU1OV0gRmlyc3QgKHVuY29udHJvdmVyc2lhbCkgcGFydCBvZiBpc3N1ZSA5ODA3LCBiYXJyeS53YXJzYXcsIDIwMTAtMTAtMTYgOgorICAgICAgICAjICBuZXcgX2ZpeHVwX2NvbW1hbmQgaXMgYm9ndXMsIHNvIHdlIHdpbGwgdXNlIG93biB3b3JrLWFyb3VuZAorICAgICAgICBjbWQubGlicmFyeV9kaXJzLmluc2VydCgwLCB0ZXN0X3N1cHBvcnQuU0FWRURDV0QpCisgICAgICAgIG9zLmNoZGlyKG90aGVyX3RtcF9kaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5pbnBsYWNlID0gMQorICAgICAgICAgICAgY21kLnJ1bigpCisgICAgICAgICAgICBzb19maWxlID0gY21kLmdldF9vdXRwdXRzKClbMF0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF93ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNvX2ZpbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguc3BsaXRleHQoc29fZmlsZSlbLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignU08nKSkKKyAgICAgICAgc29fZGlyID0gb3MucGF0aC5kaXJuYW1lKHNvX2ZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29fZGlyLCBvdGhlcl90bXBfZGlyKQorICAgICAgICBjbWQuY29tcGlsZXIgPSBOb25lCisgICAgICAgIGNtZC5pbnBsYWNlID0gMAorICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgc29fZmlsZSA9IGNtZC5nZXRfb3V0cHV0cygpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzb19maWxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLnNwbGl0ZXh0KHNvX2ZpbGUpWy0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NPJykpCisgICAgICAgIHNvX2RpciA9IG9zLnBhdGguZGlybmFtZShzb19maWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvX2RpciwgY21kLmJ1aWxkX2xpYikKKworICAgICAgICAjIGlucGxhY2UgPSAwLCBjbWQucGFja2FnZSA9ICdiYXInCisgICAgICAgIGJ1aWxkX3B5ID0gY21kLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQorICAgICAgICBidWlsZF9weS5wYWNrYWdlX2RpciA9IHsnJzogJ2Jhcid9CisgICAgICAgIHBhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aCgnZm9vJykKKyAgICAgICAgIyBjaGVja2luZyB0aGF0IHRoZSBsYXN0IGRpcmVjdG9yeSBpcyB0aGUgYnVpbGRfZGlyCisgICAgICAgIHBhdGggPSBvcy5wYXRoLnNwbGl0KHBhdGgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0aCwgY21kLmJ1aWxkX2xpYikKKworICAgICAgICAjIGlucGxhY2UgPSAxLCBjbWQucGFja2FnZSA9ICdiYXInCisgICAgICAgIGNtZC5pbnBsYWNlID0gMQorICAgICAgICBvdGhlcl90bXBfZGlyID0gb3MucGF0aC5yZWFscGF0aChzZWxmLm1rZHRlbXAoKSkKKyAgICAgICAgb2xkX3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIob3RoZXJfdG1wX2RpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0aCA9IGNtZC5nZXRfZXh0X2Z1bGxwYXRoKCdmb28nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX3dkKQorICAgICAgICAjIGNoZWNraW5nIHRoYXQgdGhlIGxhc3QgZGlyZWN0b3J5IGlzIGJhcgorICAgICAgICBwYXRoID0gb3MucGF0aC5zcGxpdChwYXRoKVswXQorICAgICAgICBsYXN0ZGlyID0gb3MucGF0aC5zcGxpdChwYXRoKVstMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYXN0ZGlyLCAnYmFyJykKKworICAgIGRlZiB0ZXN0X2V4dF9mdWxscGF0aChzZWxmKToKKyAgICAgICAgZXh0ID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFycygpWydTTyddCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmlucGxhY2UgPSAxCisgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIgPSB7Jyc6ICdzcmMnfQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnBhY2thZ2VzID0gWydseG1sJywgJ2x4bWwuaHRtbCddCisgICAgICAgIGN1cmRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjdXJkaXIsICdzcmMnLCAnbHhtbCcsICdldHJlZScgKyBleHQpCisgICAgICAgIHBhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aCgnbHhtbC5ldHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FudGVkLCBwYXRoKQorCisgICAgICAgICMgYnVpbGRpbmcgbHhtbC5ldHJlZSBub3QgaW5wbGFjZQorICAgICAgICBjbWQuaW5wbGFjZSA9IDAKKyAgICAgICAgY21kLmJ1aWxkX2xpYiA9IG9zLnBhdGguam9pbihjdXJkaXIsICd0bXBkaXInKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY3VyZGlyLCAndG1wZGlyJywgJ2x4bWwnLCAnZXRyZWUnICsgZXh0KQorICAgICAgICBwYXRoID0gY21kLmdldF9leHRfZnVsbHBhdGgoJ2x4bWwuZXRyZWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhbnRlZCwgcGF0aCkKKworICAgICAgICAjIGJ1aWxkaW5nIHR3aXN0ZWQucnVubmVyLnBvcnRtYXAgbm90IGlucGxhY2UKKyAgICAgICAgYnVpbGRfcHkgPSBjbWQuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9weScpCisgICAgICAgIGJ1aWxkX3B5LnBhY2thZ2VfZGlyID0ge30KKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5wYWNrYWdlcyA9IFsndHdpc3RlZCcsICd0d2lzdGVkLnJ1bm5lci5wb3J0bWFwJ10KKyAgICAgICAgcGF0aCA9IGNtZC5nZXRfZXh0X2Z1bGxwYXRoKCd0d2lzdGVkLnJ1bm5lci5wb3J0bWFwJykKKyAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGN1cmRpciwgJ3RtcGRpcicsICd0d2lzdGVkJywgJ3J1bm5lcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncG9ydG1hcCcgKyBleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FudGVkLCBwYXRoKQorCisgICAgICAgICMgYnVpbGRpbmcgdHdpc3RlZC5ydW5uZXIucG9ydG1hcCBpbnBsYWNlCisgICAgICAgIGNtZC5pbnBsYWNlID0gMQorICAgICAgICBwYXRoID0gY21kLmdldF9leHRfZnVsbHBhdGgoJ3R3aXN0ZWQucnVubmVyLnBvcnRtYXAnKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY3VyZGlyLCAndHdpc3RlZCcsICdydW5uZXInLCAncG9ydG1hcCcgKyBleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FudGVkLCBwYXRoKQorCisgICAgZGVmIHRlc3RfYnVpbGRfZXh0X2lucGxhY2Uoc2VsZik6CisgICAgICAgIGV0cmVlX2MgPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBfZGlyLCAnbHhtbC5ldHJlZS5jJykKKyAgICAgICAgZXRyZWVfZXh0ID0gRXh0ZW5zaW9uKCdseG1sLmV0cmVlJywgW2V0cmVlX2NdKQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICdseG1sJywgJ2V4dF9tb2R1bGVzJzogW2V0cmVlX2V4dF19KQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQuaW5wbGFjZSA9IDEKKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RpciA9IHsnJzogJ3NyYyd9CisgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucGFja2FnZXMgPSBbJ2x4bWwnLCAnbHhtbC5odG1sJ10KKyAgICAgICAgY3VyZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZXh0ID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJTTyIpCisgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbihjdXJkaXIsICdzcmMnLCAnbHhtbCcsICdldHJlZScgKyBleHQpCisgICAgICAgIHBhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aCgnbHhtbC5ldHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FudGVkLCBwYXRoKQorCisgICAgZGVmIHRlc3Rfc2V0dXB0b29sc19jb21wYXQoc2VsZik6CisgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmV4dGVuc2lvbiwgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0CisgICAgICAgIHNhdmVkX2V4dCA9IGRpc3R1dGlscy5leHRlbnNpb24uRXh0ZW5zaW9uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgb24gc29tZSBwbGF0Zm9ybXMsIGl0IGxvYWRzIHRoZSBkZXByZWNhdGVkICJkbCIgbW9kdWxlCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnc2V0dXB0b29sc19idWlsZF9leHQnLCBkZXByZWNhdGVkPVRydWUpCisKKyAgICAgICAgICAgICMgdGhlc2VzIGltcG9ydCBwYXRjaCBEaXN0dXRpbHMnIEV4dGVuc2lvbiBjbGFzcworICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzX2J1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIHNldHVwdG9vbHNfYnVpbGRfZXh0CisgICAgICAgICAgICBmcm9tIHNldHVwdG9vbHNfZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24KKworICAgICAgICAgICAgZXRyZWVfYyA9IG9zLnBhdGguam9pbihzZWxmLnRtcF9kaXIsICdseG1sLmV0cmVlLmMnKQorICAgICAgICAgICAgZXRyZWVfZXh0ID0gRXh0ZW5zaW9uKCdseG1sLmV0cmVlJywgW2V0cmVlX2NdKQorICAgICAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAnbHhtbCcsICdleHRfbW9kdWxlcyc6IFtldHJlZV9leHRdfSkKKyAgICAgICAgICAgIGNtZCA9IHNldHVwdG9vbHNfYnVpbGRfZXh0KGRpc3QpCisgICAgICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgICAgICBjbWQuaW5wbGFjZSA9IDEKKyAgICAgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucGFja2FnZV9kaXIgPSB7Jyc6ICdzcmMnfQorICAgICAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5wYWNrYWdlcyA9IFsnbHhtbCcsICdseG1sLmh0bWwnXQorICAgICAgICAgICAgY3VyZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIGV4dCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiU08iKQorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGN1cmRpciwgJ3NyYycsICdseG1sJywgJ2V0cmVlJyArIGV4dCkKKyAgICAgICAgICAgIHBhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aCgnbHhtbC5ldHJlZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhbnRlZCwgcGF0aCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgcmVzdG9yaW5nIERpc3R1dGlscycgRXh0ZW5zaW9uIGNsYXNzIG90aGVyd2lzZSBpdHMgYnJva2VuCisgICAgICAgICAgICBkaXN0dXRpbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbiA9IHNhdmVkX2V4dAorICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uID0gc2F2ZWRfZXh0CisgICAgICAgICAgICBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9leHQuRXh0ZW5zaW9uID0gc2F2ZWRfZXh0CisKKyAgICBkZWYgdGVzdF9idWlsZF9leHRfcGF0aF93aXRoX29zX3NlcChzZWxmKToKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7J25hbWUnOiAnVXBkYXRlTWFuYWdlcid9KQorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBleHQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlNPIikKKyAgICAgICAgZXh0X25hbWUgPSBvcy5wYXRoLmpvaW4oJ1VwZGF0ZU1hbmFnZXInLCAnZmRzZW5kJykKKyAgICAgICAgZXh0X3BhdGggPSBjbWQuZ2V0X2V4dF9mdWxscGF0aChleHRfbmFtZSkKKyAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKGNtZC5idWlsZF9saWIsICdVcGRhdGVNYW5hZ2VyJywgJ2Zkc2VuZCcgKyBleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0X3BhdGgsIHdhbnRlZCkKKworICAgIGRlZiB0ZXN0X2J1aWxkX2V4dF9wYXRoX2Nyb3NzX3BsYXRmb3JtKHNlbGYpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICdVcGRhdGVNYW5hZ2VyJ30pCisgICAgICAgIGNtZCA9IGJ1aWxkX2V4dChkaXN0KQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGV4dCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiU08iKQorICAgICAgICAjIHRoaXMgbmVlZHMgdG8gd29yayBldmVuIHVuZGVyIHdpbjMyCisgICAgICAgIGV4dF9uYW1lID0gJ1VwZGF0ZU1hbmFnZXIvZmRzZW5kJworICAgICAgICBleHRfcGF0aCA9IGNtZC5nZXRfZXh0X2Z1bGxwYXRoKGV4dF9uYW1lKQorICAgICAgICB3YW50ZWQgPSBvcy5wYXRoLmpvaW4oY21kLmJ1aWxkX2xpYiwgJ1VwZGF0ZU1hbmFnZXInLCAnZmRzZW5kJyArIGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRfcGF0aCwgd2FudGVkKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLCAndGVzdCBvbmx5IHJlbGV2YW50IGZvciBNYWNPU1gnKQorICAgIGRlZiB0ZXN0X2RlcGxveW1lbnRfdGFyZ2V0X2RlZmF1bHQoc2VsZik6CisgICAgICAgICMgSXNzdWUgOTUxNjogVGVzdCB0aGF0LCBpbiB0aGUgYWJzZW5jZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUsCisgICAgICAgICMgYW4gZXh0ZW5zaW9uIG1vZHVsZSBpcyBjb21waWxlZCB3aXRoIHRoZSBzYW1lIGRlcGxveW1lbnQgdGFyZ2V0IGFzCisgICAgICAgICMgIHRoZSBpbnRlcnByZXRlci4KKyAgICAgICAgc2VsZi5fdHJ5X2NvbXBpbGVfZGVwbG95bWVudF90YXJnZXQoJz09JywgTm9uZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJywgJ3Rlc3Qgb25seSByZWxldmFudCBmb3IgTWFjT1NYJykKKyAgICBkZWYgdGVzdF9kZXBsb3ltZW50X3RhcmdldF90b29fbG93KHNlbGYpOgorICAgICAgICAjIElzc3VlIDk1MTY6IFRlc3QgdGhhdCBhbiBleHRlbnNpb24gbW9kdWxlIGlzIG5vdCBhbGxvd2VkIHRvIGJlCisgICAgICAgICMgY29tcGlsZWQgd2l0aCBhIGRlcGxveW1lbnQgdGFyZ2V0IGxlc3MgdGhhbiB0aGF0IG9mIHRoZSBpbnRlcnByZXRlci4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwKKyAgICAgICAgICAgIHNlbGYuX3RyeV9jb21waWxlX2RlcGxveW1lbnRfdGFyZ2V0LCAnPicsICcxMC4xJykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJywgJ3Rlc3Qgb25seSByZWxldmFudCBmb3IgTWFjT1NYJykKKyAgICBkZWYgdGVzdF9kZXBsb3ltZW50X3RhcmdldF9oaWdoZXJfb2soc2VsZik6CisgICAgICAgICMgSXNzdWUgOTUxNjogVGVzdCB0aGF0IGFuIGV4dGVuc2lvbiBtb2R1bGUgY2FuIGJlIGNvbXBpbGVkIHdpdGggYQorICAgICAgICAjIGRlcGxveW1lbnQgdGFyZ2V0IGhpZ2hlciB0aGFuIHRoYXQgb2YgdGhlIGludGVycHJldGVyOiB0aGUgZXh0CisgICAgICAgICMgbW9kdWxlIG1heSBkZXBlbmQgb24gc29tZSBuZXdlciBPUyBmZWF0dXJlLgorICAgICAgICBkZXB0YXJnZXQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpCisgICAgICAgIGlmIGRlcHRhcmdldDoKKyAgICAgICAgICAgICMgaW5jcmVtZW50IHRoZSBtaW5vciB2ZXJzaW9uIG51bWJlciAoaS5lLiAxMC42IC0+IDEwLjcpCisgICAgICAgICAgICBkZXB0YXJnZXQgPSBbaW50KHgpIGZvciB4IGluIGRlcHRhcmdldC5zcGxpdCgnLicpXQorICAgICAgICAgICAgZGVwdGFyZ2V0Wy0xXSArPSAxCisgICAgICAgICAgICBkZXB0YXJnZXQgPSAnLicuam9pbihzdHIoaSkgZm9yIGkgaW4gZGVwdGFyZ2V0KQorICAgICAgICAgICAgc2VsZi5fdHJ5X2NvbXBpbGVfZGVwbG95bWVudF90YXJnZXQoJzwnLCBkZXB0YXJnZXQpCisKKyAgICBkZWYgX3RyeV9jb21waWxlX2RlcGxveW1lbnRfdGFyZ2V0KHNlbGYsIG9wZXJhdG9yLCB0YXJnZXQpOgorICAgICAgICBvcmlnX2Vudmlyb24gPSBvcy5lbnZpcm9uCisgICAgICAgIG9zLmVudmlyb24gPSBvcmlnX2Vudmlyb24uY29weSgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXRhdHRyLCBvcywgJ2Vudmlyb24nLCBvcmlnX2Vudmlyb24pCisKKyAgICAgICAgaWYgdGFyZ2V0IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBvcy5lbnZpcm9uLmdldCgnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJyk6CisgICAgICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy5lbnZpcm9uWydNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnXSA9IHRhcmdldAorCisgICAgICAgIGRlcHRhcmdldF9jID0gb3MucGF0aC5qb2luKHNlbGYudG1wX2RpciwgJ2RlcHRhcmdldG1vZHVsZS5jJykKKworICAgICAgICB3aXRoIG9wZW4oZGVwdGFyZ2V0X2MsICd3JykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZSh0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgICAgICNpbmNsdWRlIDxBdmFpbGFiaWxpdHlNYWNyb3MuaD4KKworICAgICAgICAgICAgICAgIGludCBkdW1teTsKKworICAgICAgICAgICAgICAgICNpZiBUQVJHRVQgJXMgTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICNlcnJvciAiVW5leHBlY3RlZCB0YXJnZXQiCisgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICcnJyAlIG9wZXJhdG9yKSkKKworICAgICAgICAjIGdldCB0aGUgZGVwbG95bWVudCB0YXJnZXQgdGhhdCB0aGUgaW50ZXJwcmV0ZXIgd2FzIGJ1aWx0IHdpdGgKKyAgICAgICAgdGFyZ2V0ID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnKQorICAgICAgICB0YXJnZXQgPSB0dXBsZShtYXAoaW50LCB0YXJnZXQuc3BsaXQoJy4nKSkpCisgICAgICAgIHRhcmdldCA9ICclMDJkJTAxZDAnICUgdGFyZ2V0CisgICAgICAgIGRlcHRhcmdldF9leHQgPSBFeHRlbnNpb24oCisgICAgICAgICAgICAnZGVwdGFyZ2V0JywKKyAgICAgICAgICAgIFtkZXB0YXJnZXRfY10sCisgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9WyctRFRBUkdFVD0lcyclKHRhcmdldCwpXSwKKyAgICAgICAgKQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsKKyAgICAgICAgICAgICduYW1lJzogJ2RlcHRhcmdldCcsCisgICAgICAgICAgICAnZXh0X21vZHVsZXMnOiBbZGVwdGFyZ2V0X2V4dF0KKyAgICAgICAgfSkKKyAgICAgICAgZGlzdC5wYWNrYWdlX2RpciA9IHNlbGYudG1wX2RpcgorICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgY21kLmJ1aWxkX2xpYiA9IHNlbGYudG1wX2RpcgorICAgICAgICBjbWQuYnVpbGRfdGVtcCA9IHNlbGYudG1wX2RpcgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBleGNlcHQgQ29tcGlsZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJXcm9uZyBkZXBsb3ltZW50IHRhcmdldCBkdXJpbmcgY29tcGlsYXRpb24iKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRFeHRUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTliZDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTliZDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmVjMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5CkBAIC0wLDAgKzEsMTIyIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9weSBpbXBvcnQgYnVpbGRfcHkKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNGaWxlRXJyb3IKKworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisKK2NsYXNzIEJ1aWxkUHlUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3BhY2thZ2VfZGF0YShzZWxmKToKKyAgICAgICAgc291cmNlcyA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzb3VyY2VzLCAiX19pbml0X18ucHkiKSwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCIjIFByZXRlbmQgdGhpcyBpcyBhIHBhY2thZ2UuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc291cmNlcywgIlJFQURNRS50eHQiKSwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJJbmZvIGFib3V0IHRoaXMgcGFja2FnZSIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBkZXN0aW5hdGlvbiA9IHNlbGYubWtkdGVtcCgpCisKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbih7InBhY2thZ2VzIjogWyJwa2ciXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2VfZGlyIjogeyJwa2ciOiBzb3VyY2VzfX0pCisgICAgICAgICMgc2NyaXB0X25hbWUgbmVlZCBub3QgZXhpc3QsIGl0IGp1c3QgbmVlZCB0byBiZSBpbml0aWFsaXplZAorICAgICAgICBkaXN0LnNjcmlwdF9uYW1lID0gb3MucGF0aC5qb2luKHNvdXJjZXMsICJzZXR1cC5weSIpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbImJ1aWxkIl0gPSBzdXBwb3J0LkR1bW15Q29tbWFuZCgKKyAgICAgICAgICAgIGZvcmNlPTAsCisgICAgICAgICAgICBidWlsZF9saWI9ZGVzdGluYXRpb24pCisgICAgICAgIGRpc3QucGFja2FnZXMgPSBbInBrZyJdCisgICAgICAgIGRpc3QucGFja2FnZV9kYXRhID0geyJwa2ciOiBbIlJFQURNRS50eHQiXX0KKyAgICAgICAgZGlzdC5wYWNrYWdlX2RpciA9IHsicGtnIjogc291cmNlc30KKworICAgICAgICBjbWQgPSBidWlsZF9weShkaXN0KQorICAgICAgICBjbWQuY29tcGlsZSA9IDEKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5wYWNrYWdlX2RhdGEsIGRpc3QucGFja2FnZV9kYXRhKQorCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgVGhpcyBtYWtlcyBzdXJlIHRoZSBsaXN0IG9mIG91dHB1dHMgaW5jbHVkZXMgYnl0ZS1jb21waWxlZAorICAgICAgICAjIGZpbGVzIGZvciBQeXRob24gbW9kdWxlcyBidXQgbm90IGZvciBwYWNrYWdlIGRhdGEgZmlsZXMKKyAgICAgICAgIyAodGhlcmUgc2hvdWxkbid0ICpiZSogYnl0ZS1jb2RlIGZpbGVzIGZvciB0aG9zZSEpLgorICAgICAgICAjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMykKKyAgICAgICAgcGtnZGVzdCA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbiwgInBrZyIpCisgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihwa2dkZXN0KQorICAgICAgICBzZWxmLmFzc2VydEluKCJfX2luaXRfXy5weSIsIGZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydEluKCJSRUFETUUudHh0IiwgZmlsZXMpCisgICAgICAgICMgWFhYIGV2ZW4gd2l0aCAtTywgZGlzdHV0aWxzIHdyaXRlcyBweWMsIG5vdCBweW87IGJ1Zz8KKyAgICAgICAgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJfX2luaXRfXy5weWMiLCBmaWxlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9faW5pdF9fLnB5YyIsIGZpbGVzKQorCisgICAgZGVmIHRlc3RfZW1wdHlfcGFja2FnZV9kaXIoc2VsZik6CisgICAgICAgICMgU2VlIFNGIDE2Njg1OTYvMTcyMDg5Ny4KKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKworICAgICAgICAjIGNyZWF0ZSB0aGUgZGlzdHJpYnV0aW9uIGZpbGVzLgorICAgICAgICBzb3VyY2VzID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgb3Blbihvcy5wYXRoLmpvaW4oc291cmNlcywgIl9faW5pdF9fLnB5IiksICJ3IikuY2xvc2UoKQorCisgICAgICAgIHRlc3RkaXIgPSBvcy5wYXRoLmpvaW4oc291cmNlcywgImRvYyIpCisgICAgICAgIG9zLm1rZGlyKHRlc3RkaXIpCisgICAgICAgIG9wZW4ob3MucGF0aC5qb2luKHRlc3RkaXIsICJ0ZXN0ZmlsZSIpLCAidyIpLmNsb3NlKCkKKworICAgICAgICBvcy5jaGRpcihzb3VyY2VzKQorICAgICAgICBvbGRfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyJwYWNrYWdlcyI6IFsicGtnIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZV9kaXIiOiB7InBrZyI6ICIifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlX2RhdGEiOiB7InBrZyI6IFsiZG9jLyoiXX19KQorICAgICAgICAgICAgIyBzY3JpcHRfbmFtZSBuZWVkIG5vdCBleGlzdCwgaXQganVzdCBuZWVkIHRvIGJlIGluaXRpYWxpemVkCisgICAgICAgICAgICBkaXN0LnNjcmlwdF9uYW1lID0gb3MucGF0aC5qb2luKHNvdXJjZXMsICJzZXR1cC5weSIpCisgICAgICAgICAgICBkaXN0LnNjcmlwdF9hcmdzID0gWyJidWlsZCJdCisgICAgICAgICAgICBkaXN0LnBhcnNlX2NvbW1hbmRfbGluZSgpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkaXN0LnJ1bl9jb21tYW5kcygpCisgICAgICAgICAgICBleGNlcHQgRGlzdHV0aWxzRmlsZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbGVkIHBhY2thZ2VfZGF0YSB0ZXN0IHdoZW4gcGFja2FnZV9kaXIgaXMgJyciKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBSZXN0b3JlIHN0YXRlLgorICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IG9sZF9zdGRvdXQKKworICAgIGRlZiB0ZXN0X2RvbnRfd3JpdGVfYnl0ZWNvZGUoc2VsZik6CisgICAgICAgICMgbWFrZXMgc3VyZSBieXRlX2NvbXBpbGUgaXMgbm90IHVzZWQKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBidWlsZF9weShkaXN0KQorICAgICAgICBjbWQuY29tcGlsZSA9IDEKKyAgICAgICAgY21kLm9wdGltaXplID0gMQorCisgICAgICAgIG9sZF9kb250X3dyaXRlX2J5dGVjb2RlID0gc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUKKyAgICAgICAgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5ieXRlX2NvbXBpbGUoW10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuZG9udF93cml0ZV9ieXRlY29kZSA9IG9sZF9kb250X3dyaXRlX2J5dGVjb2RlCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYnl0ZS1jb21waWxpbmcgaXMgZGlzYWJsZWQnLCBzZWxmLmxvZ3NbMF1bMV0pCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZFB5VGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlN2NkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlN2NkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE5M2NjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CkBAIC0wLDAgKzEsMTEyIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfc2NyaXB0cy4iIiIKKworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9zY3JpcHRzIGltcG9ydCBidWlsZF9zY3JpcHRzCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KK2ltcG9ydCBzeXNjb25maWcKKworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisKK2NsYXNzIEJ1aWxkU2NyaXB0c1Rlc3RDYXNlKHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfc2V0dGluZ3Moc2VsZik6CisgICAgICAgIGNtZCA9IHNlbGYuZ2V0X2J1aWxkX3NjcmlwdHNfY21kKCIvZm9vL2JhciIsIFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNtZC5mb3JjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5idWlsZF9kaXIgaXMgTm9uZSkKKworICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5mb3JjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuYnVpbGRfZGlyLCAiL2Zvby9iYXIiKQorCisgICAgZGVmIHRlc3RfYnVpbGQoc2VsZik6CisgICAgICAgIHNvdXJjZSA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHRhcmdldCA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGV4cGVjdGVkID0gc2VsZi53cml0ZV9zYW1wbGVfc2NyaXB0cyhzb3VyY2UpCisKKyAgICAgICAgY21kID0gc2VsZi5nZXRfYnVpbGRfc2NyaXB0c19jbWQodGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3MucGF0aC5qb2luKHNvdXJjZSwgZm4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZm4gaW4gZXhwZWN0ZWRdKQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIGJ1aWx0ID0gb3MubGlzdGRpcih0YXJnZXQpCisgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gYnVpbHQpCisKKyAgICBkZWYgZ2V0X2J1aWxkX3NjcmlwdHNfY21kKHNlbGYsIHRhcmdldCwgc2NyaXB0cyk6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIGRpc3Quc2NyaXB0cyA9IHNjcmlwdHMKKyAgICAgICAgZGlzdC5jb21tYW5kX29ialsiYnVpbGQiXSA9IHN1cHBvcnQuRHVtbXlDb21tYW5kKAorICAgICAgICAgICAgYnVpbGRfc2NyaXB0cz10YXJnZXQsCisgICAgICAgICAgICBmb3JjZT0xLAorICAgICAgICAgICAgZXhlY3V0YWJsZT1zeXMuZXhlY3V0YWJsZQorICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gYnVpbGRfc2NyaXB0cyhkaXN0KQorCisgICAgZGVmIHdyaXRlX3NhbXBsZV9zY3JpcHRzKHNlbGYsIGRpcik6CisgICAgICAgIGV4cGVjdGVkID0gW10KKyAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKCJzY3JpcHQxLnB5IikKKyAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoZGlyLCAic2NyaXB0MS5weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgiIyEgL3Vzci9iaW4vZW52IHB5dGhvbjIuM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMgYm9ndXMgc2NyaXB0IHcvIFB5dGhvbiBzaC1iYW5nXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc1xuIikpCisgICAgICAgIGV4cGVjdGVkLmFwcGVuZCgic2NyaXB0Mi5weSIpCisgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KGRpciwgInNjcmlwdDIucHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoIiMhL3Vzci9iaW4vcHl0aG9uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyBib2d1cyBzY3JpcHQgdy8gUHl0aG9uIHNoLWJhbmdcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzXG4iKSkKKyAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKCJzaGVsbC5zaCIpCisgICAgICAgIHNlbGYud3JpdGVfc2NyaXB0KGRpciwgInNoZWxsLnNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCIjIS9iaW4vc2hcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIGJvZ3VzIHNoZWxsIHNjcmlwdCB3LyBzaC1iYW5nXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhpdCAwXG4iKSkKKyAgICAgICAgcmV0dXJuIGV4cGVjdGVkCisKKyAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIGRpciwgbmFtZSwgdGV4dCk6CisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihkaXIsIG5hbWUpLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUodGV4dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9pbnQoc2VsZik6CisgICAgICAgIHNvdXJjZSA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHRhcmdldCA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGV4cGVjdGVkID0gc2VsZi53cml0ZV9zYW1wbGVfc2NyaXB0cyhzb3VyY2UpCisKKworICAgICAgICBjbWQgPSBzZWxmLmdldF9idWlsZF9zY3JpcHRzX2NtZCh0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcy5wYXRoLmpvaW4oc291cmNlLCBmbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmbiBpbiBleHBlY3RlZF0pCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKworICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0NTI0CisgICAgICAgICMKKyAgICAgICAgIyBPbiBsaW51eC1nKystMzIgd2l0aCBjb21tYW5kIGxpbmUgYC4vY29uZmlndXJlIC0tZW5hYmxlLWlwdjYKKyAgICAgICAgIyAtLXdpdGgtc3VmZml4PTNgLCBweXRob24gaXMgY29tcGlsZWQgb2theSBidXQgdGhlIGJ1aWxkIHNjcmlwdHMKKyAgICAgICAgIyBmYWlsZWQgd2hlbiB3cml0aW5nIHRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlCisgICAgICAgIG9sZCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcnMoKS5nZXQoJ1ZFUlNJT04nKQorICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTWydWRVJTSU9OJ10gPSA0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgb2xkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlNbJ1ZFUlNJT04nXSA9IG9sZAorCisgICAgICAgIGJ1aWx0ID0gb3MubGlzdGRpcih0YXJnZXQpCisgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gYnVpbHQpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZFNjcmlwdHNUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlY2ExMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNlY2ExMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Njb21waWxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU0NzdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHkKQEAgLTAsMCArMSw4MiBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jY29tcGlsZXIuIiIiCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0CisKK2Zyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgKGdlbl9saWJfb3B0aW9ucywgQ0NvbXBpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2RlZmF1bHRfY29tcGlsZXIpCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGRlYnVnCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorCitjbGFzcyBGYWtlQ29tcGlsZXIob2JqZWN0KToKKyAgICBkZWYgbGlicmFyeV9kaXJfb3B0aW9uKHNlbGYsIGRpcik6CisgICAgICAgIHJldHVybiAiLUwiICsgZGlyCisKKyAgICBkZWYgcnVudGltZV9saWJyYXJ5X2Rpcl9vcHRpb24oc2VsZiwgZGlyKToKKyAgICAgICAgcmV0dXJuIFsiLWNvb2wiLCAiLVIiICsgZGlyXQorCisgICAgZGVmIGZpbmRfbGlicmFyeV9maWxlKHNlbGYsIGRpcnMsIGxpYiwgZGVidWc9MCk6CisgICAgICAgIHJldHVybiAnZm91bmQnCisKKyAgICBkZWYgbGlicmFyeV9vcHRpb24oc2VsZiwgbGliKToKKyAgICAgICAgcmV0dXJuICItbCIgKyBsaWIKKworY2xhc3MgQ0NvbXBpbGVyVGVzdENhc2Uoc3VwcG9ydC5FbnZpcm9uR3VhcmQsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2dlbl9saWJfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgY29tcGlsZXIgPSBGYWtlQ29tcGlsZXIoKQorICAgICAgICBsaWJkaXJzID0gWydsaWIxJywgJ2xpYjInXQorICAgICAgICBydW5saWJkaXJzID0gWydydW5saWIxJ10KKyAgICAgICAgbGlicyA9IFtvcy5wYXRoLmpvaW4oJ2RpcicsICduYW1lJyksICduYW1lMiddCisKKyAgICAgICAgb3B0cyA9IGdlbl9saWJfb3B0aW9ucyhjb21waWxlciwgbGliZGlycywgcnVubGliZGlycywgbGlicykKKyAgICAgICAgd2FudGVkID0gWyctTGxpYjEnLCAnLUxsaWIyJywgJy1jb29sJywgJy1ScnVubGliMScsICdmb3VuZCcsCisgICAgICAgICAgICAgICAgICAnLWxuYW1lMiddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgd2FudGVkKQorCisgICAgZGVmIHRlc3RfZGVidWdfcHJpbnQoc2VsZik6CisKKyAgICAgICAgY2xhc3MgTXlDQ29tcGlsZXIoQ0NvbXBpbGVyKToKKyAgICAgICAgICAgIGV4ZWN1dGFibGVzID0ge30KKworICAgICAgICBjb21waWxlciA9IE15Q0NvbXBpbGVyKCkKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICBjb21waWxlci5kZWJ1Z19wcmludCgneHh4JykKKyAgICAgICAgc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQucmVhZCgpLCAnJykKKworICAgICAgICBkZWJ1Zy5ERUJVRyA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICAgICAgY29tcGlsZXIuZGVidWdfcHJpbnQoJ3h4eCcpCisgICAgICAgICAgICBzdGRvdXQuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQucmVhZCgpLCAneHh4XG4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVidWcuREVCVUcgPSBGYWxzZQorCisgICAgZGVmIHRlc3RfY3VzdG9taXplX2NvbXBpbGVyKHNlbGYpOgorCisgICAgICAgICMgbm90IHRlc3RpbmcgaWYgZGVmYXVsdCBjb21waWxlciBpcyBub3QgdW5peAorICAgICAgICBpZiBnZXRfZGVmYXVsdF9jb21waWxlcigpICE9ICd1bml4JzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG9zLmVudmlyb25bJ0FSJ10gPSAnbXlfYXInCisgICAgICAgIG9zLmVudmlyb25bJ0FSRkxBR1MnXSA9ICctYXJmbGFncycKKworICAgICAgICAjIG1ha2Ugc3VyZSBBUiBnZXRzIGNhdWdodAorICAgICAgICBjbGFzcyBjb21waWxlcjoKKyAgICAgICAgICAgIGNvbXBpbGVyX3R5cGUgPSAndW5peCcKKworICAgICAgICAgICAgZGVmIHNldF9leGVjdXRhYmxlcyhzZWxmLCAqKmt3KToKKyAgICAgICAgICAgICAgICBzZWxmLmV4ZXMgPSBrdworCisgICAgICAgIGNvbXAgPSBjb21waWxlcigpCisgICAgICAgIGN1c3RvbWl6ZV9jb21waWxlcihjb21wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXAuZXhlc1snYXJjaGl2ZXInXSwgJ215X2FyIC1hcmZsYWdzJykKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKENDb21waWxlclRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9InRlc3Rfc3VpdGUiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMmFhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Njb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jY29tcGlsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMmFhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Njb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jaGVjay5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2hlY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczMzQyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2hlY2sucHkKQEAgLTAsMCArMSwxMDkgQEAKKyMgLSotIGVuY29kaW5nOiB1dGY4IC0qLQorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmNoZWNrLiIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5jaGVjayBpbXBvcnQgY2hlY2ssIEhBU19ET0NVVElMUworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzU2V0dXBFcnJvcgorCitjbGFzcyBDaGVja1Rlc3RDYXNlKHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX3J1bihzZWxmLCBtZXRhZGF0YT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICAgICBpZiBtZXRhZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgbWV0YWRhdGEgPSB7fQorICAgICAgICBwa2dfaW5mbywgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKiptZXRhZGF0YSkKKyAgICAgICAgY21kID0gY2hlY2soZGlzdCkKKyAgICAgICAgY21kLmluaXRpYWxpemVfb3B0aW9ucygpCisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBvcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICBzZXRhdHRyKGNtZCwgbmFtZSwgdmFsdWUpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHJldHVybiBjbWQKKworICAgIGRlZiB0ZXN0X2NoZWNrX21ldGFkYXRhKHNlbGYpOgorICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZCB3aXRoIG5vIG1ldGFkYXRhIGF0IGFsbAorICAgICAgICAjIGJ5IGRlZmF1bHQsIGNoZWNrIGlzIGNoZWNraW5nIHRoZSBtZXRhZGF0YQorICAgICAgICAjIHNob3VsZCBoYXZlIHNvbWUgd2FybmluZ3MKKyAgICAgICAgY21kID0gc2VsZi5fcnVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuX3dhcm5pbmdzLCAyKQorCisgICAgICAgICMgbm93IGxldCdzIGFkZCB0aGUgcmVxdWlyZWQgZmllbGRzCisgICAgICAgICMgYW5kIHJ1biBpdCBhZ2FpbiwgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldAorICAgICAgICAjIGFueSB3YXJuaW5nIGFueW1vcmUKKyAgICAgICAgbWV0YWRhdGEgPSB7J3VybCc6ICd4eHgnLCAnYXV0aG9yJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAneHh4JywgJ3ZlcnNpb24nOiAneHh4J30KKyAgICAgICAgY21kID0gc2VsZi5fcnVuKG1ldGFkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5fd2FybmluZ3MsIDApCisKKyAgICAgICAgIyBub3cgd2l0aCB0aGUgc3RyaWN0IG1vZGUsIHdlIHNob3VsZAorICAgICAgICAjIGdldCBhbiBlcnJvciBpZiB0aGVyZSBhcmUgbWlzc2luZyBtZXRhZGF0YQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBzZWxmLl9ydW4sIHt9LCAqKnsnc3RyaWN0JzogMX0pCisKKyAgICAgICAgIyBhbmQgb2YgY291cnNlLCBubyBlcnJvciB3aGVuIGFsbCBtZXRhZGF0YSBhcmUgcHJlc2VudAorICAgICAgICBjbWQgPSBzZWxmLl9ydW4obWV0YWRhdGEsIHN0cmljdD0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5fd2FybmluZ3MsIDApCisKKyAgICAgICAgIyBub3cgYSB0ZXN0IHdpdGggVW5pY29kZSBlbnRyaWVzCisgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiB1J3h4eCcsICdhdXRob3InOiB1J1x1MDBjOXJpYycsCisgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiB1J3h4eCcsIHUnbmFtZSc6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6IHUneHh4JywKKyAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogdSdTb21ldGhpbmcgYWJvdXQgZXNzemV0IFx1MDBkZicsCisgICAgICAgICAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogdSdNb3JlIHRoaW5ncyBhYm91dCBlc3N6ZXQgXHUwMGRmJ30KKyAgICAgICAgY21kID0gc2VsZi5fcnVuKG1ldGFkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5fd2FybmluZ3MsIDApCisKKyAgICBkZWYgdGVzdF9jaGVja19kb2N1bWVudChzZWxmKToKKyAgICAgICAgaWYgbm90IEhBU19ET0NVVElMUzogIyB3b24ndCB0ZXN0IHdpdGhvdXQgZG9jdXRpbHMKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwa2dfaW5mbywgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBjaGVjayhkaXN0KQorCisgICAgICAgICMgbGV0J3Mgc2VlIGlmIGl0IGRldGVjdHMgYnJva2VuIHJlc3QKKyAgICAgICAgYnJva2VuX3Jlc3QgPSAndGl0bGVcbj09PVxuXG50ZXN0JworICAgICAgICBtc2dzID0gY21kLl9jaGVja19yc3RfZGF0YShicm9rZW5fcmVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNncyksIDEpCisKKyAgICAgICAgIyBhbmQgbm9uLWJyb2tlbiByZXN0CisgICAgICAgIHJlc3QgPSAndGl0bGVcbj09PT09XG5cbnRlc3QnCisgICAgICAgIG1zZ3MgPSBjbWQuX2NoZWNrX3JzdF9kYXRhKHJlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZ3MpLCAwKQorCisgICAgZGVmIHRlc3RfY2hlY2tfcmVzdHJ1Y3R1cmVkdGV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IEhBU19ET0NVVElMUzogIyB3b24ndCB0ZXN0IHdpdGhvdXQgZG9jdXRpbHMKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIGxldCdzIHNlZSBpZiBpdCBkZXRlY3RzIGJyb2tlbiByZXN0IGluIGxvbmdfZGVzY3JpcHRpb24KKyAgICAgICAgYnJva2VuX3Jlc3QgPSAndGl0bGVcbj09PVxuXG50ZXN0JworICAgICAgICBwa2dfaW5mbywgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QobG9uZ19kZXNjcmlwdGlvbj1icm9rZW5fcmVzdCkKKyAgICAgICAgY21kID0gY2hlY2soZGlzdCkKKyAgICAgICAgY21kLmNoZWNrX3Jlc3RydWN0dXJlZHRleHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5fd2FybmluZ3MsIDEpCisKKyAgICAgICAgIyBsZXQncyBzZWUgaWYgd2UgaGF2ZSBhbiBlcnJvciB3aXRoIHN0cmljdD0xCisgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3h4eCcsICd2ZXJzaW9uJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogYnJva2VuX3Jlc3R9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIHNlbGYuX3J1biwgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICoqeydzdHJpY3QnOiAxLCAncmVzdHJ1Y3R1cmVkdGV4dCc6IDF9KQorCisgICAgICAgICMgYW5kIG5vbi1icm9rZW4gcmVzdCwgaW5jbHVkaW5nIGEgbm9uLUFTQ0lJIGNoYXJhY3RlciB0byB0ZXN0ICMxMjExNAorICAgICAgICBtZXRhZGF0YVsnbG9uZ19kZXNjcmlwdGlvbiddID0gdSd0aXRsZVxuPT09PT1cblxudGVzdCBcdTAwZGYnCisgICAgICAgIGNtZCA9IHNlbGYuX3J1bihtZXRhZGF0YSwgc3RyaWN0PTEsIHJlc3RydWN0dXJlZHRleHQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuX3dhcm5pbmdzLCAwKQorCisgICAgZGVmIHRlc3RfY2hlY2tfYWxsKHNlbGYpOgorCisgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBzZWxmLl9ydW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAqKnsnc3RyaWN0JzogMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN0cnVjdHVyZWR0ZXh0JzogMX0pCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShDaGVja1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2hlY2sucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTFlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2hlY2sucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTFlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NoZWNrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk4OGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQpAQCAtMCwwICsxLDUxIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuY2xlYW4uIiIiCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGdldHBhc3MKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbiBpbXBvcnQgY2xlYW4KK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworY2xhc3MgY2xlYW5UZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3J1bihzZWxmKToKKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBjbGVhbihkaXN0KQorCisgICAgICAgICMgbGV0J3MgYWRkIHNvbWUgZWxlbWVudHMgY2xlYW4gc2hvdWxkIHJlbW92ZQorICAgICAgICBkaXJzID0gWyhkLCBvcy5wYXRoLmpvaW4ocGtnX2RpciwgZCkpCisgICAgICAgICAgICAgICAgZm9yIGQgaW4gKCdidWlsZF90ZW1wJywgJ2J1aWxkX2xpYicsICdiZGlzdF9iYXNlJywKKyAgICAgICAgICAgICAgICAnYnVpbGRfc2NyaXB0cycsICdidWlsZF9iYXNlJyldCisKKyAgICAgICAgZm9yIG5hbWUsIHBhdGggaW4gZGlyczoKKyAgICAgICAgICAgIG9zLm1rZGlyKHBhdGgpCisgICAgICAgICAgICBzZXRhdHRyKGNtZCwgbmFtZSwgcGF0aCkKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gJ2J1aWxkX2Jhc2UnOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgZiBpbiAoJ29uZScsICd0d28nLCAndGhyZWUnKToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUob3MucGF0aC5qb2luKHBhdGgsIGYpKQorCisgICAgICAgICMgbGV0J3MgcnVuIHRoZSBjb21tYW5kCisgICAgICAgIGNtZC5hbGwgPSAxCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGZpbGVzIHdoZXJlIHJlbW92ZWQKKyAgICAgICAgZm9yIG5hbWUsIHBhdGggaW4gZGlyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMocGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyVzIHdhcyBub3QgcmVtb3ZlZCcgJSBwYXRoKQorCisgICAgICAgICMgbGV0J3MgcnVuIHRoZSBjb21tYW5kIGFnYWluIChzaG91bGQgc3BpdCB3YXJuaW5ncyBidXQgc3VjY2VlZCkKKyAgICAgICAgY21kLmFsbCA9IDEKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKGNsZWFuVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3NTQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3NTQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3NDA5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5CkBAIC0wLDAgKzEsMTI3IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNtZC4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGRlYnVnCisKK2NsYXNzIE15Q21kKENvbW1hbmQpOgorICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgQ29tbWFuZFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIHNlbGYuY21kID0gTXlDbWQoZGlzdCkKKworICAgIGRlZiB0ZXN0X2Vuc3VyZV9zdHJpbmdfbGlzdChzZWxmKToKKworICAgICAgICBjbWQgPSBzZWxmLmNtZAorICAgICAgICBjbWQubm90X3N0cmluZ19saXN0ID0gWydvbmUnLCAyLCAndGhyZWUnXQorICAgICAgICBjbWQueWVzX3N0cmluZ19saXN0ID0gWydvbmUnLCAndHdvJywgJ3RocmVlJ10KKyAgICAgICAgY21kLm5vdF9zdHJpbmdfbGlzdDIgPSBvYmplY3QoKQorICAgICAgICBjbWQueWVzX3N0cmluZ19saXN0MiA9ICdvaycKKyAgICAgICAgY21kLmVuc3VyZV9zdHJpbmdfbGlzdCgneWVzX3N0cmluZ19saXN0JykKKyAgICAgICAgY21kLmVuc3VyZV9zdHJpbmdfbGlzdCgneWVzX3N0cmluZ19saXN0MicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QsICdub3Rfc3RyaW5nX2xpc3QnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQuZW5zdXJlX3N0cmluZ19saXN0LCAnbm90X3N0cmluZ19saXN0MicpCisKKyAgICBkZWYgdGVzdF9tYWtlX2ZpbGUoc2VsZik6CisKKyAgICAgICAgY21kID0gc2VsZi5jbWQKKworICAgICAgICAjIG1ha2luZyBzdXJlIGl0IHJhaXNlcyB3aGVuIGluZmlsZXMgaXMgbm90IGEgc3RyaW5nIG9yIGEgbGlzdC90dXBsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtZC5tYWtlX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluZmlsZXM9MSwgb3V0ZmlsZT0nJywgZnVuYz0nZnVuYycsIGFyZ3M9KCkpCisKKyAgICAgICAgIyBtYWtpbmcgc3VyZSBleGVjdXRlIGdldHMgY2FsbGVkIHByb3Blcmx5CisgICAgICAgIGRlZiBfZXhlY3V0ZShmdW5jLCBhcmdzLCBleGVjX21zZywgbGV2ZWwpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGVjX21zZywgJ2dlbmVyYXRpbmcgb3V0IGZyb20gaW4nKQorICAgICAgICBjbWQuZm9yY2UgPSBUcnVlCisgICAgICAgIGNtZC5leGVjdXRlID0gX2V4ZWN1dGUKKyAgICAgICAgY21kLm1ha2VfZmlsZShpbmZpbGVzPSdpbicsIG91dGZpbGU9J291dCcsIGZ1bmM9J2Z1bmMnLCBhcmdzPSgpKQorCisgICAgZGVmIHRlc3RfZHVtcF9vcHRpb25zKHNlbGYpOgorCisgICAgICAgIG1zZ3MgPSBbXQorICAgICAgICBkZWYgX2Fubm91bmNlKG1zZywgbGV2ZWwpOgorICAgICAgICAgICAgbXNncy5hcHBlbmQobXNnKQorICAgICAgICBjbWQgPSBzZWxmLmNtZAorICAgICAgICBjbWQuYW5ub3VuY2UgPSBfYW5ub3VuY2UKKyAgICAgICAgY21kLm9wdGlvbjEgPSAxCisgICAgICAgIGNtZC5vcHRpb24yID0gMQorICAgICAgICBjbWQudXNlcl9vcHRpb25zID0gWygnb3B0aW9uMScsICcnLCAnJyksICgnb3B0aW9uMicsICcnLCAnJyldCisgICAgICAgIGNtZC5kdW1wX29wdGlvbnMoKQorCisgICAgICAgIHdhbnRlZCA9IFsiY29tbWFuZCBvcHRpb25zIGZvciAnTXlDbWQnOiIsICcgIG9wdGlvbjEgPSAxJywKKyAgICAgICAgICAgICAgICAgICcgIG9wdGlvbjIgPSAxJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dzLCB3YW50ZWQpCisKKyAgICBkZWYgdGVzdF9lbnN1cmVfc3RyaW5nKHNlbGYpOgorICAgICAgICBjbWQgPSBzZWxmLmNtZAorICAgICAgICBjbWQub3B0aW9uMSA9ICdvaycKKyAgICAgICAgY21kLmVuc3VyZV9zdHJpbmcoJ29wdGlvbjEnKQorCisgICAgICAgIGNtZC5vcHRpb24yID0gTm9uZQorICAgICAgICBjbWQuZW5zdXJlX3N0cmluZygnb3B0aW9uMicsICd4eHgnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihjbWQsICdvcHRpb24yJykpCisKKyAgICAgICAgY21kLm9wdGlvbjMgPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZW5zdXJlX3N0cmluZywgJ29wdGlvbjMnKQorCisgICAgZGVmIHRlc3RfZW5zdXJlX3N0cmluZ19saXN0KHNlbGYpOgorICAgICAgICBjbWQgPSBzZWxmLmNtZAorICAgICAgICBjbWQub3B0aW9uMSA9ICdvayxkb2snCisgICAgICAgIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QoJ29wdGlvbjEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5vcHRpb24xLCBbJ29rJywgJ2RvayddKQorCisgICAgICAgIGNtZC5vcHRpb24yID0gWyd4eHgnLCAnd3d3J10KKyAgICAgICAgY21kLmVuc3VyZV9zdHJpbmdfbGlzdCgnb3B0aW9uMicpCisKKyAgICAgICAgY21kLm9wdGlvbjMgPSBbJ29rJywgMl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5lbnN1cmVfc3RyaW5nX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdvcHRpb24zJykKKworICAgIGRlZiB0ZXN0X2Vuc3VyZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgY21kID0gc2VsZi5jbWQKKyAgICAgICAgY21kLm9wdGlvbjEgPSBfX2ZpbGVfXworICAgICAgICBjbWQuZW5zdXJlX2ZpbGVuYW1lKCdvcHRpb24xJykKKyAgICAgICAgY21kLm9wdGlvbjIgPSAneHh4JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmVuc3VyZV9maWxlbmFtZSwgJ29wdGlvbjInKQorCisgICAgZGVmIHRlc3RfZW5zdXJlX2Rpcm5hbWUoc2VsZik6CisgICAgICAgIGNtZCA9IHNlbGYuY21kCisgICAgICAgIGNtZC5vcHRpb24xID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIKKyAgICAgICAgY21kLmVuc3VyZV9kaXJuYW1lKCdvcHRpb24xJykKKyAgICAgICAgY21kLm9wdGlvbjIgPSAneHh4JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmVuc3VyZV9kaXJuYW1lLCAnb3B0aW9uMicpCisKKyAgICBkZWYgdGVzdF9kZWJ1Z19wcmludChzZWxmKToKKyAgICAgICAgY21kID0gc2VsZi5jbWQKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICBjbWQuZGVidWdfcHJpbnQoJ3h4eCcpCisgICAgICAgIHN0ZG91dC5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LnJlYWQoKSwgJycpCisKKyAgICAgICAgZGVidWcuREVCVUcgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgICAgIGNtZC5kZWJ1Z19wcmludCgneHh4JykKKyAgICAgICAgICAgIHN0ZG91dC5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dC5yZWFkKCksICd4eHhcbicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWJ1Zy5ERUJVRyA9IEZhbHNlCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb21tYW5kVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNlMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODNlMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZkMDk2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CkBAIC0wLDAgKzEsMTIzIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnB5cGlyYy5weXBpcmMuIiIiCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1dGlsCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IFB5UElSQ0NvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgorZnJvbSBkaXN0dXRpbHMubG9nIGltcG9ydCBzZXRfdGhyZXNob2xkCitmcm9tIGRpc3R1dGlscy5sb2cgaW1wb3J0IFdBUk4KKworZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitQWVBJUkMgPSAiIiJcCitbZGlzdHV0aWxzXQorCitpbmRleC1zZXJ2ZXJzID0KKyAgICBzZXJ2ZXIxCisgICAgc2VydmVyMgorCitbc2VydmVyMV0KK3VzZXJuYW1lOm1lCitwYXNzd29yZDpzZWNyZXQKKworW3NlcnZlcjJdCit1c2VybmFtZTptZWFnYWluCitwYXNzd29yZDogc2VjcmV0CityZWFsbTphY21lCityZXBvc2l0b3J5Omh0dHA6Ly9hbm90aGVyLnB5cGkvCisiIiIKKworUFlQSVJDX09MRCA9ICIiIlwKK1tzZXJ2ZXItbG9naW5dCit1c2VybmFtZTp0YXJlaworcGFzc3dvcmQ6c2VjcmV0CisiIiIKKworV0FOVEVEID0gIiIiXAorW2Rpc3R1dGlsc10KK2luZGV4LXNlcnZlcnMgPQorICAgIHB5cGkKKworW3B5cGldCit1c2VybmFtZTp0YXJlaworcGFzc3dvcmQ6eHh4CisiIiIKKworCitjbGFzcyBQeVBJUkNDb21tYW5kVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkVudmlyb25HdWFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIlBhdGNoZXMgdGhlIGVudmlyb25tZW50LiIiIgorICAgICAgICBzdXBlcihQeVBJUkNDb21tYW5kVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi50bXBfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgb3MuZW52aXJvblsnSE9NRSddID0gc2VsZi50bXBfZGlyCisgICAgICAgIHNlbGYucmMgPSBvcy5wYXRoLmpvaW4oc2VsZi50bXBfZGlyLCAnLnB5cGlyYycpCisgICAgICAgIHNlbGYuZGlzdCA9IERpc3RyaWJ1dGlvbigpCisKKyAgICAgICAgY2xhc3MgY29tbWFuZChQeVBJUkNDb21tYW5kKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXN0KToKKyAgICAgICAgICAgICAgICBQeVBJUkNDb21tYW5kLl9faW5pdF9fKHNlbGYsIGRpc3QpCisgICAgICAgICAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsaXplX29wdGlvbnMgPSBpbml0aWFsaXplX29wdGlvbnMKKworICAgICAgICBzZWxmLl9jbWQgPSBjb21tYW5kCisgICAgICAgIHNlbGYub2xkX3RocmVzaG9sZCA9IHNldF90aHJlc2hvbGQoV0FSTikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIiIiUmVtb3ZlcyB0aGUgcGF0Y2guIiIiCisgICAgICAgIHNldF90aHJlc2hvbGQoc2VsZi5vbGRfdGhyZXNob2xkKQorICAgICAgICBzdXBlcihQeVBJUkNDb21tYW5kVGVzdENhc2UsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiB0ZXN0X3NlcnZlcl9yZWdpc3RyYXRpb24oc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IG1ha2VzIHN1cmUgUHlQSVJDQ29tbWFuZCBrbm93cyBob3cgdG86CisgICAgICAgICMgMS4gaGFuZGxlIHNldmVyYWwgc2VjdGlvbnMgaW4gLnB5cGlyYworICAgICAgICAjIDIuIGhhbmRsZSB0aGUgb2xkIGZvcm1hdAorCisgICAgICAgICMgbmV3IGZvcm1hdAorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoc2VsZi5yYywgUFlQSVJDKQorICAgICAgICBjbWQgPSBzZWxmLl9jbWQoc2VsZi5kaXN0KQorICAgICAgICBjb25maWcgPSBjbWQuX3JlYWRfcHlwaXJjKCkKKworICAgICAgICBjb25maWcgPSBjb25maWcuaXRlbXMoKQorICAgICAgICBjb25maWcuc29ydCgpCisgICAgICAgIHdhaXRlZCA9IFsoJ3Bhc3N3b3JkJywgJ3NlY3JldCcpLCAoJ3JlYWxtJywgJ3B5cGknKSwKKyAgICAgICAgICAgICAgICAgICgncmVwb3NpdG9yeScsICdodHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGknKSwKKyAgICAgICAgICAgICAgICAgICgnc2VydmVyJywgJ3NlcnZlcjEnKSwgKCd1c2VybmFtZScsICdtZScpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbmZpZywgd2FpdGVkKQorCisgICAgICAgICMgb2xkIGZvcm1hdAorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoc2VsZi5yYywgUFlQSVJDX09MRCkKKyAgICAgICAgY29uZmlnID0gY21kLl9yZWFkX3B5cGlyYygpCisgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5pdGVtcygpCisgICAgICAgIGNvbmZpZy5zb3J0KCkKKyAgICAgICAgd2FpdGVkID0gWygncGFzc3dvcmQnLCAnc2VjcmV0JyksICgncmVhbG0nLCAncHlwaScpLAorICAgICAgICAgICAgICAgICAgKCdyZXBvc2l0b3J5JywgJ2h0dHA6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaScpLAorICAgICAgICAgICAgICAgICAgKCdzZXJ2ZXInLCAnc2VydmVyLWxvZ2luJyksICgndXNlcm5hbWUnLCAndGFyZWsnKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25maWcsIHdhaXRlZCkKKworICAgIGRlZiB0ZXN0X3NlcnZlcl9lbXB0eV9yZWdpc3RyYXRpb24oc2VsZik6CisgICAgICAgIGNtZCA9IHNlbGYuX2NtZChzZWxmLmRpc3QpCisgICAgICAgIHJjID0gY21kLl9nZXRfcmNfZmlsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMocmMpKQorICAgICAgICBjbWQuX3N0b3JlX3B5cGlyYygndGFyZWsnLCAneHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHJjKSkKKyAgICAgICAgZiA9IG9wZW4ocmMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50LCBXQU5URUQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKFB5UElSQ0NvbW1hbmRUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWJkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZWJkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmM4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZ19jbWQucHkKQEAgLTAsMCArMSw5MSBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmNvbmZpZy4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5jb25maWcgaW1wb3J0IGR1bXBfZmlsZSwgY29uZmlnCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyBDb25maWdUZXN0Q2FzZShzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuVGVtcGRpck1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2luZm8oc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIGZvciBsaW5lIGluIG1zZy5zcGxpdGxpbmVzKCk6CisgICAgICAgICAgICBzZWxmLl9sb2dzLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihDb25maWdUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLl9sb2dzID0gW10KKyAgICAgICAgc2VsZi5vbGRfbG9nID0gbG9nLmluZm8KKyAgICAgICAgbG9nLmluZm8gPSBzZWxmLl9pbmZvCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGxvZy5pbmZvID0gc2VsZi5vbGRfbG9nCisgICAgICAgIHN1cGVyKENvbmZpZ1Rlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgdGVzdF9kdW1wX2ZpbGUoc2VsZik6CisgICAgICAgIHRoaXNfZmlsZSA9IG9zLnBhdGguc3BsaXRleHQoX19maWxlX18pWzBdICsgJy5weScKKyAgICAgICAgZiA9IG9wZW4odGhpc19maWxlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBudW1saW5lcyA9IGxlbihmLnJlYWRsaW5lcygpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZHVtcF9maWxlKHRoaXNfZmlsZSwgJ0kgYW0gdGhlIGhlYWRlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2xvZ3MpLCBudW1saW5lcysxKQorCisgICAgZGVmIHRlc3Rfc2VhcmNoX2NwcChzZWxmKToKKyAgICAgICAgIyBUT0RPOiBtaW5ndyBob3N0ID8KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQorICAgICAgICBjbWQgPSBjb25maWcoZGlzdCkKKworICAgICAgICAjIHNpbXBsZSBwYXR0ZXJuIHNlYXJjaGVzCisgICAgICAgIG1hdGNoID0gY21kLnNlYXJjaF9jcHAocGF0dGVybj0neHh4JywgYm9keT0nLyogeHh4ICovJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRjaCwgMCkKKworICAgICAgICBtYXRjaCA9IGNtZC5zZWFyY2hfY3BwKHBhdHRlcm49J19jb25maWd0ZXN0JywgYm9keT0nLyogeHh4ICovJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRjaCwgMSkKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgICMgZmluYWxpemVfb3B0aW9ucyBkb2VzIGEgYml0IG9mIHRyYW5zZm9ybWF0aW9uCisgICAgICAgICMgb24gb3B0aW9ucworICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGNvbmZpZyhkaXN0KQorICAgICAgICBjbWQuaW5jbHVkZV9kaXJzID0gJ29uZSVzdHdvJyAlIG9zLnBhdGhzZXAKKyAgICAgICAgY21kLmxpYnJhcmllcyA9ICdvbmUnCisgICAgICAgIGNtZC5saWJyYXJ5X2RpcnMgPSAndGhyZWUlc2ZvdXInICUgb3MucGF0aHNlcAorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuaW5jbHVkZV9kaXJzLCBbJ29uZScsICd0d28nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQubGlicmFyaWVzLCBbJ29uZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5saWJyYXJ5X2RpcnMsIFsndGhyZWUnLCAnZm91ciddKQorCisgICAgZGVmIHRlc3RfY2xlYW4oc2VsZik6CisgICAgICAgICMgX2NsZWFuIHJlbW92ZXMgZmlsZXMKKyAgICAgICAgdG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGYxID0gb3MucGF0aC5qb2luKHRtcF9kaXIsICdvbmUnKQorICAgICAgICBmMiA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAndHdvJykKKworICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZjEsICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZjIsICd4eHgnKQorCisgICAgICAgIGZvciBmIGluIChmMSwgZjIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGYpKQorCisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gY29uZmlnKGRpc3QpCisgICAgICAgIGNtZC5fY2xlYW4oZjEsIGYyKQorCisgICAgICAgIGZvciBmIGluIChmMSwgZjIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmKSkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKENvbmZpZ1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZ19jbWQucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk0NWNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZ19jbWQucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk0NWNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWdfY21kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ5NzliYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29yZS5weQpAQCAtMCwwICsxLDEwOCBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb3JlLiIiIgorCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBkaXN0dXRpbHMuY29yZQoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNhcHR1cmVkX3N0ZG91dCwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKKyMgc2V0dXAgc2NyaXB0IHRoYXQgdXNlcyBfX2ZpbGVfXworc2V0dXBfdXNpbmdfX19maWxlX18gPSAiIiJcCisKK19fZmlsZV9fCisKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IHNldHVwCitzZXR1cCgpCisiIiIKKworc2V0dXBfcHJpbnRzX2N3ZCA9ICIiIlwKKworaW1wb3J0IG9zCitwcmludCBvcy5nZXRjd2QoKQorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorc2V0dXAoKQorIiIiCisKKworY2xhc3MgQ29yZVRlc3RDYXNlKHN1cHBvcnQuRW52aXJvbkd1YXJkLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKENvcmVUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLm9sZF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuY2xlYW51cF90ZXN0Zm4oKQorICAgICAgICBzZWxmLm9sZF9hcmd2ID0gc3lzLmFyZ3YsIHN5cy5hcmd2WzpdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLm9sZF9zdGRvdXQKKyAgICAgICAgc2VsZi5jbGVhbnVwX3Rlc3RmbigpCisgICAgICAgIHN5cy5hcmd2ID0gc2VsZi5vbGRfYXJndlswXQorICAgICAgICBzeXMuYXJndls6XSA9IHNlbGYub2xkX2FyZ3ZbMV0KKyAgICAgICAgc3VwZXIoQ29yZVRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgY2xlYW51cF90ZXN0Zm4oc2VsZik6CisgICAgICAgIHBhdGggPSB0ZXN0LnRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CisgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShwYXRoKQorCisgICAgZGVmIHdyaXRlX3NldHVwKHNlbGYsIHRleHQsIHBhdGg9dGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOKToKKyAgICAgICAgZiA9IG9wZW4ocGF0aCwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKHRleHQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHBhdGgKKworICAgIGRlZiB0ZXN0X3J1bl9zZXR1cF9wcm92aWRlc19maWxlKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgc2NyaXB0IGNhbiB1c2UgX19maWxlX187IGlmIHRoYXQncyBtaXNzaW5nLCB0aGUgdGVzdAorICAgICAgICAjIHNldHVwLnB5IHNjcmlwdCB3aWxsIHJhaXNlIE5hbWVFcnJvci4KKyAgICAgICAgZGlzdHV0aWxzLmNvcmUucnVuX3NldHVwKAorICAgICAgICAgICAgc2VsZi53cml0ZV9zZXR1cChzZXR1cF91c2luZ19fX2ZpbGVfXykpCisKKyAgICBkZWYgdGVzdF9ydW5fc2V0dXBfdXNlc19jdXJyZW50X2RpcihzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3RzIHRoYXQgdGhlIHNldHVwIHNjcmlwdCBpcyBydW4gd2l0aCB0aGUgY3VycmVudCBkaXJlY3RvcnkKKyAgICAgICAgIyBhcyBpdHMgb3duIGN1cnJlbnQgZGlyZWN0b3J5OyB0aGlzIHdhcyB0ZW1wb3JhcmlseSBicm9rZW4gYnkgYQorICAgICAgICAjIHByZXZpb3VzIHBhdGNoIHdoZW4gVEVTVEZOIGRpZCBub3QgdXNlIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICAgICAgc3lzLnN0ZG91dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKworICAgICAgICAjIENyZWF0ZSBhIGRpcmVjdG9yeSBhbmQgd3JpdGUgdGhlIHNldHVwLnB5IGZpbGUgdGhlcmU6CisgICAgICAgIG9zLm1rZGlyKHRlc3QudGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2V0dXBfcHkgPSBvcy5wYXRoLmpvaW4odGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOLCAic2V0dXAucHkiKQorICAgICAgICBkaXN0dXRpbHMuY29yZS5ydW5fc2V0dXAoCisgICAgICAgICAgICBzZWxmLndyaXRlX3NldHVwKHNldHVwX3ByaW50c19jd2QsIHBhdGg9c2V0dXBfcHkpKQorCisgICAgICAgIG91dHB1dCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBpZiBvdXRwdXQuZW5kc3dpdGgoIlxuIik6CisgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRbOi0xXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN3ZCwgb3V0cHV0KQorCisgICAgZGVmIHRlc3RfZGVidWdfbW9kZShzZWxmKToKKyAgICAgICAgIyB0aGlzIGNvdmVycyB0aGUgY29kZSBjYWxsZWQgd2hlbiBERUJVRyBpcyBzZXQKKyAgICAgICAgc3lzLmFyZ3YgPSBbJ3NldHVwLnB5JywgJy0tbmFtZSddCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuc2V0dXAobmFtZT0nYmFyJykKKyAgICAgICAgc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQucmVhZCgpLCAnYmFyXG4nKQorCisgICAgICAgIGRpc3R1dGlscy5jb3JlLkRFQlVHID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgICAgICBkaXN0dXRpbHMuY29yZS5zZXR1cChuYW1lPSdiYXInKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuREVCVUcgPSBGYWxzZQorICAgICAgICBzdGRvdXQuc2VlaygwKQorICAgICAgICB3YW50ZWQgPSAib3B0aW9ucyAoYWZ0ZXIgcGFyc2luZyBjb25maWcgZmlsZXMpOlxuIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dC5yZWFkbGluZXMoKVswXSwgd2FudGVkKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQ29yZVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU1MmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvcmUucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGU1MmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb3JlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2RlcF91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTEwNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weQpAQCAtMCwwICsxLDgxIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmRlcF91dGlsLiIiIgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCisKK2Zyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlciwgbmV3ZXJfcGFpcndpc2UsIG5ld2VyX2dyb3VwCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0ZpbGVFcnJvcgorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitjbGFzcyBEZXBVdGlsVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbmV3ZXIoc2VsZik6CisKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgbmV3X2ZpbGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnbmV3JykKKyAgICAgICAgb2xkX2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgoX19maWxlX18pCisKKyAgICAgICAgIyBSYWlzZSBEaXN0dXRpbHNGaWxlRXJyb3IgaWYgJ25ld19maWxlJyBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzRmlsZUVycm9yLCBuZXdlciwgbmV3X2ZpbGUsIG9sZF9maWxlKQorCisgICAgICAgICMgUmV0dXJuIHRydWUgaWYgJ25ld19maWxlJyBleGlzdHMgYW5kIGlzIG1vcmUgcmVjZW50bHkgbW9kaWZpZWQgdGhhbgorICAgICAgICAjICdvbGRfZmlsZScsIG9yIGlmICduZXdfZmlsZScgZXhpc3RzIGFuZCAnb2xkX2ZpbGUnIGRvZXNuJ3QuCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShuZXdfZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5ld2VyKG5ld19maWxlLCAnSV9kb250X2V4aXN0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXdlcihuZXdfZmlsZSwgb2xkX2ZpbGUpKQorCisgICAgICAgICMgUmV0dXJuIGZhbHNlIGlmIGJvdGggZXhpc3QgYW5kICdvbGRfZmlsZScgaXMgdGhlIHNhbWUgYWdlIG9yIHlvdW5nZXIKKyAgICAgICAgIyB0aGFuICduZXdfZmlsZScuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3ZXIob2xkX2ZpbGUsIG5ld19maWxlKSkKKworICAgIGRlZiB0ZXN0X25ld2VyX3BhaXJ3aXNlKHNlbGYpOgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzb3VyY2VzID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ3NvdXJjZXMnKQorICAgICAgICB0YXJnZXRzID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ3RhcmdldHMnKQorICAgICAgICBvcy5ta2Rpcihzb3VyY2VzKQorICAgICAgICBvcy5ta2Rpcih0YXJnZXRzKQorICAgICAgICBvbmUgPSBvcy5wYXRoLmpvaW4oc291cmNlcywgJ29uZScpCisgICAgICAgIHR3byA9IG9zLnBhdGguam9pbihzb3VyY2VzLCAndHdvJykKKyAgICAgICAgdGhyZWUgPSBvcy5wYXRoLmFic3BhdGgoX19maWxlX18pICAgICMgSSBhbSB0aGUgb2xkIGZpbGUKKyAgICAgICAgZm91ciA9IG9zLnBhdGguam9pbih0YXJnZXRzLCAnZm91cicpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShvbmUpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSh0d28pCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShmb3VyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3ZXJfcGFpcndpc2UoW29uZSwgdHdvXSwgW3RocmVlLCBmb3VyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKFtvbmVdLFt0aHJlZV0pKQorCisgICAgZGVmIHRlc3RfbmV3ZXJfZ3JvdXAoc2VsZik6CisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHNvdXJjZXMgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnc291cmNlcycpCisgICAgICAgIG9zLm1rZGlyKHNvdXJjZXMpCisgICAgICAgIG9uZSA9IG9zLnBhdGguam9pbihzb3VyY2VzLCAnb25lJykKKyAgICAgICAgdHdvID0gb3MucGF0aC5qb2luKHNvdXJjZXMsICd0d28nKQorICAgICAgICB0aHJlZSA9IG9zLnBhdGguam9pbihzb3VyY2VzLCAndGhyZWUnKQorICAgICAgICBvbGRfZmlsZSA9IG9zLnBhdGguYWJzcGF0aChfX2ZpbGVfXykKKworICAgICAgICAjIHJldHVybiB0cnVlIGlmICdvbGRfZmlsZScgaXMgb3V0LW9mLWRhdGUgd2l0aCByZXNwZWN0IHRvIGFueSBmaWxlCisgICAgICAgICMgbGlzdGVkIGluICdzb3VyY2VzJy4KKyAgICAgICAgc2VsZi53cml0ZV9maWxlKG9uZSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHR3bykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHRocmVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmV3ZXJfZ3JvdXAoW29uZSwgdHdvLCB0aHJlZV0sIG9sZF9maWxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdlcl9ncm91cChbb25lLCB0d28sIG9sZF9maWxlXSwgdGhyZWUpKQorCisgICAgICAgICMgbWlzc2luZyBoYW5kbGluZworICAgICAgICBvcy5yZW1vdmUob25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBuZXdlcl9ncm91cCwgW29uZSwgdHdvLCBvbGRfZmlsZV0sIHRocmVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobmV3ZXJfZ3JvdXAoW29uZSwgdHdvLCBvbGRfZmlsZV0sIHRocmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npbmc9J2lnbm9yZScpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXdlcl9ncm91cChbb25lLCB0d28sIG9sZF9maWxlXSwgdGhyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nPSduZXdlcicpKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShEZXBVdGlsVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhNmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kZXBfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhNmYxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGVwX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlyX3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpcl91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MmQ5MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpcl91dGlsLnB5CkBAIC0wLDAgKzEsMTM0IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmRpcl91dGlsLiIiIgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzdGF0CitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3lzCisKK2Zyb20gZGlzdHV0aWxzLmRpcl91dGlsIGltcG9ydCAobWtwYXRoLCByZW1vdmVfdHJlZSwgY3JlYXRlX3RyZWUsIGNvcHlfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlX3JlbGF0aXZlKQorCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIERpclV0aWxUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2xvZyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID4gMDoKKyAgICAgICAgICAgIHNlbGYuX2xvZ3MuYXBwZW5kKG1zZyAlIGFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2dzLmFwcGVuZChtc2cpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKERpclV0aWxUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLl9sb2dzID0gW10KKyAgICAgICAgdG1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHNlbGYucm9vdF90YXJnZXQgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2RlZXAnKQorICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLnJvb3RfdGFyZ2V0LCAnaGVyZScpCisgICAgICAgIHNlbGYudGFyZ2V0MiA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZGVlcDInKQorICAgICAgICBzZWxmLm9sZF9sb2cgPSBsb2cuaW5mbworICAgICAgICBsb2cuaW5mbyA9IHNlbGYuX2xvZworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBsb2cuaW5mbyA9IHNlbGYub2xkX2xvZworICAgICAgICBzdXBlcihEaXJVdGlsVGVzdENhc2UsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiB0ZXN0X21rcGF0aF9yZW1vdmVfdHJlZV92ZXJib3NpdHkoc2VsZik6CisKKyAgICAgICAgbWtwYXRoKHNlbGYudGFyZ2V0LCB2ZXJib3NlPTApCisgICAgICAgIHdhbnRlZCA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbG9ncywgd2FudGVkKQorICAgICAgICByZW1vdmVfdHJlZShzZWxmLnJvb3RfdGFyZ2V0LCB2ZXJib3NlPTApCisKKyAgICAgICAgbWtwYXRoKHNlbGYudGFyZ2V0LCB2ZXJib3NlPTEpCisgICAgICAgIHdhbnRlZCA9IFsnY3JlYXRpbmcgJXMnICUgc2VsZi5yb290X3RhcmdldCwKKyAgICAgICAgICAgICAgICAgICdjcmVhdGluZyAlcycgJSBzZWxmLnRhcmdldF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCB3YW50ZWQpCisgICAgICAgIHNlbGYuX2xvZ3MgPSBbXQorCisgICAgICAgIHJlbW92ZV90cmVlKHNlbGYucm9vdF90YXJnZXQsIHZlcmJvc2U9MSkKKyAgICAgICAgd2FudGVkID0gWyJyZW1vdmluZyAnJXMnIChhbmQgZXZlcnl0aGluZyB1bmRlciBpdCkiICUgc2VsZi5yb290X3RhcmdldF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCB3YW50ZWQpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHRlc3QgaXMgb25seSBhcHByb3ByaWF0ZSBmb3IgUE9TSVgtbGlrZSBzeXN0ZW1zLiIpCisgICAgZGVmIHRlc3RfbWtwYXRoX3dpdGhfY3VzdG9tX21vZGUoc2VsZik6CisgICAgICAgICMgR2V0IGFuZCBzZXQgdGhlIGN1cnJlbnQgdW1hc2sgdmFsdWUgZm9yIHRlc3RpbmcgbW9kZSBiaXRzLgorICAgICAgICB1bWFzayA9IG9zLnVtYXNrKDBvMDAyKQorICAgICAgICBvcy51bWFzayh1bWFzaykKKyAgICAgICAgbWtwYXRoKHNlbGYudGFyZ2V0LCAwbzcwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHN0YXQuU19JTU9ERShvcy5zdGF0KHNlbGYudGFyZ2V0KS5zdF9tb2RlKSwgMG83MDAgJiB+dW1hc2spCisgICAgICAgIG1rcGF0aChzZWxmLnRhcmdldDIsIDBvNTU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc3RhdC5TX0lNT0RFKG9zLnN0YXQoc2VsZi50YXJnZXQyKS5zdF9tb2RlKSwgMG81NTUgJiB+dW1hc2spCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfdHJlZV92ZXJib3NpdHkoc2VsZik6CisKKyAgICAgICAgY3JlYXRlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgWydvbmUnLCAndHdvJywgJ3RocmVlJ10sIHZlcmJvc2U9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCBbXSkKKyAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgdmVyYm9zZT0wKQorCisgICAgICAgIHdhbnRlZCA9IFsnY3JlYXRpbmcgJXMnICUgc2VsZi5yb290X3RhcmdldF0KKyAgICAgICAgY3JlYXRlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgWydvbmUnLCAndHdvJywgJ3RocmVlJ10sIHZlcmJvc2U9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCB3YW50ZWQpCisKKyAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgdmVyYm9zZT0wKQorCisKKyAgICBkZWYgdGVzdF9jb3B5X3RyZWVfdmVyYm9zaXR5KHNlbGYpOgorCisgICAgICAgIG1rcGF0aChzZWxmLnRhcmdldCwgdmVyYm9zZT0wKQorCisgICAgICAgIGNvcHlfdHJlZShzZWxmLnRhcmdldCwgc2VsZi50YXJnZXQyLCB2ZXJib3NlPTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbG9ncywgW10pCisKKyAgICAgICAgcmVtb3ZlX3RyZWUoc2VsZi5yb290X3RhcmdldCwgdmVyYm9zZT0wKQorCisgICAgICAgIG1rcGF0aChzZWxmLnRhcmdldCwgdmVyYm9zZT0wKQorICAgICAgICBhX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YXJnZXQsICdvay50eHQnKQorICAgICAgICBmID0gb3BlbihhX2ZpbGUsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgnc29tZSBjb250ZW50JykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHdhbnRlZCA9IFsnY29weWluZyAlcyAtPiAlcycgJSAoYV9maWxlLCBzZWxmLnRhcmdldDIpXQorICAgICAgICBjb3B5X3RyZWUoc2VsZi50YXJnZXQsIHNlbGYudGFyZ2V0MiwgdmVyYm9zZT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2xvZ3MsIHdhbnRlZCkKKworICAgICAgICByZW1vdmVfdHJlZShzZWxmLnJvb3RfdGFyZ2V0LCB2ZXJib3NlPTApCisgICAgICAgIHJlbW92ZV90cmVlKHNlbGYudGFyZ2V0MiwgdmVyYm9zZT0wKQorCisgICAgZGVmIHRlc3RfY29weV90cmVlX3NraXBzX25mc190ZW1wX2ZpbGVzKHNlbGYpOgorICAgICAgICBta3BhdGgoc2VsZi50YXJnZXQsIHZlcmJvc2U9MCkKKworICAgICAgICBhX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi50YXJnZXQsICdvay50eHQnKQorICAgICAgICBuZnNfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRhcmdldCwgJy5uZnMxMjNhYmMnKQorICAgICAgICBmb3IgZiBpbiBhX2ZpbGUsIG5mc19maWxlOgorICAgICAgICAgICAgZmggPSBvcGVuKGYsICd3JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaC53cml0ZSgnc29tZSBjb250ZW50JykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZmguY2xvc2UoKQorCisgICAgICAgIGNvcHlfdHJlZShzZWxmLnRhcmdldCwgc2VsZi50YXJnZXQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxpc3RkaXIoc2VsZi50YXJnZXQyKSwgWydvay50eHQnXSkKKworICAgICAgICByZW1vdmVfdHJlZShzZWxmLnJvb3RfdGFyZ2V0LCB2ZXJib3NlPTApCisgICAgICAgIHJlbW92ZV90cmVlKHNlbGYudGFyZ2V0MiwgdmVyYm9zZT0wKQorCisgICAgZGVmIHRlc3RfZW5zdXJlX3JlbGF0aXZlKHNlbGYpOgorICAgICAgICBpZiBvcy5zZXAgPT0gJy8nOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnN1cmVfcmVsYXRpdmUoJy9ob21lL2ZvbycpLCAnaG9tZS9mb28nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnN1cmVfcmVsYXRpdmUoJ3NvbWUvcGF0aCcpLCAnc29tZS9wYXRoJykKKyAgICAgICAgZWxzZTogICAjIFxcCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuc3VyZV9yZWxhdGl2ZSgnYzpcXGhvbWVcXGZvbycpLCAnYzpob21lXFxmb28nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnN1cmVfcmVsYXRpdmUoJ2hvbWVcXGZvbycpLCAnaG9tZVxcZm9vJykKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKERpclV0aWxUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpcl91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE4YWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpcl91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE4YWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXJfdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiN2JiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpc3QucHkKQEAgLTAsMCArMSw0NDUgQEAKKyMgLSotIGNvZGluZzogdXRmOCAtKi0KKworIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5kaXN0LiIiIgoraW1wb3J0IG9zCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgdGV4dHdyYXAKKworZnJvbSBkaXN0dXRpbHMuZGlzdCBpbXBvcnQgRGlzdHJpYnV0aW9uLCBmaXhfaGVscF9vcHRpb25zCitmcm9tIGRpc3R1dGlscy5jbWQgaW1wb3J0IENvbW1hbmQKK2ltcG9ydCBkaXN0dXRpbHMuZGlzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworCitjbGFzcyB0ZXN0X2Rpc3QoQ29tbWFuZCk6CisgICAgIiIiU2FtcGxlIGRpc3R1dGlscyBleHRlbnNpb24gY29tbWFuZC4iIiIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCJzYW1wbGUtb3B0aW9uPSIsICJTIiwgImhlbHAgdGV4dCIpLAorICAgICAgICBdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnNhbXBsZV9vcHRpb24gPSBOb25lCisKKworY2xhc3MgVGVzdERpc3RyaWJ1dGlvbihEaXN0cmlidXRpb24pOgorICAgICIiIkRpc3RyaWJ1dGlvbiBzdWJjbGFzc2VzIHRoYXQgYXZvaWRzIHRoZSBkZWZhdWx0IHNlYXJjaCBmb3IKKyAgICBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgVGhlIC5fY29uZmlnX2ZpbGVzIGF0dHJpYnV0ZSBtdXN0IGJlIHNldCBiZWZvcmUKKyAgICAucGFyc2VfY29uZmlnX2ZpbGVzKCkgaXMgY2FsbGVkLgorICAgICIiIgorCisgICAgZGVmIGZpbmRfY29uZmlnX2ZpbGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29uZmlnX2ZpbGVzCisKKworY2xhc3MgRGlzdHJpYnV0aW9uVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5FbnZpcm9uR3VhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKERpc3RyaWJ1dGlvblRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuYXJndiA9IHN5cy5hcmd2LCBzeXMuYXJndls6XQorICAgICAgICBkZWwgc3lzLmFyZ3ZbMTpdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5hcmd2ID0gc2VsZi5hcmd2WzBdCisgICAgICAgIHN5cy5hcmd2WzpdID0gc2VsZi5hcmd2WzFdCisgICAgICAgIHN1cGVyKERpc3RyaWJ1dGlvblRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgY3JlYXRlX2Rpc3RyaWJ1dGlvbihzZWxmLCBjb25maWdmaWxlcz0oKSk6CisgICAgICAgIGQgPSBUZXN0RGlzdHJpYnV0aW9uKCkKKyAgICAgICAgZC5fY29uZmlnX2ZpbGVzID0gY29uZmlnZmlsZXMKKyAgICAgICAgZC5wYXJzZV9jb25maWdfZmlsZXMoKQorICAgICAgICBkLnBhcnNlX2NvbW1hbmRfbGluZSgpCisgICAgICAgIHJldHVybiBkCisKKyAgICBkZWYgdGVzdF9kZWJ1Z19tb2RlKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAidyIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJbZ2xvYmFsXVxuIikKKyAgICAgICAgICAgIGYud3JpdGUoImNvbW1hbmRfcGFja2FnZXMgPSBmb28uYmFyLCBzcGxhdCIpCisKKyAgICAgICAgZmlsZXMgPSBbVEVTVEZOXQorICAgICAgICBzeXMuYXJndi5hcHBlbmQoImJ1aWxkIikKKworICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX2Rpc3RyaWJ1dGlvbihmaWxlcykKKyAgICAgICAgc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQucmVhZCgpLCAnJykKKyAgICAgICAgZGlzdHV0aWxzLmRpc3QuREVCVUcgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgICAgIHNlbGYuY3JlYXRlX2Rpc3RyaWJ1dGlvbihmaWxlcykKKyAgICAgICAgICAgIHN0ZG91dC5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dC5yZWFkKCksICcnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGlzdHV0aWxzLmRpc3QuREVCVUcgPSBGYWxzZQorCisgICAgZGVmIHRlc3RfY29tbWFuZF9wYWNrYWdlc191bnNwZWNpZmllZChzZWxmKToKKyAgICAgICAgc3lzLmFyZ3YuYXBwZW5kKCJidWlsZCIpCisgICAgICAgIGQgPSBzZWxmLmNyZWF0ZV9kaXN0cmlidXRpb24oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKSwgWyJkaXN0dXRpbHMuY29tbWFuZCJdKQorCisgICAgZGVmIHRlc3RfY29tbWFuZF9wYWNrYWdlc19jbWRsaW5lKHNlbGYpOgorICAgICAgICBmcm9tIGRpc3R1dGlscy50ZXN0cy50ZXN0X2Rpc3QgaW1wb3J0IHRlc3RfZGlzdAorICAgICAgICBzeXMuYXJndi5leHRlbmQoWyItLWNvbW1hbmQtcGFja2FnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJmb28uYmFyLGRpc3R1dGlscy50ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfZGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIi1Tc29tZXRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisgICAgICAgIGQgPSBzZWxmLmNyZWF0ZV9kaXN0cmlidXRpb24oKQorICAgICAgICAjIGxldCdzIGFjdHVhbGx5IHRyeSB0byBsb2FkIG91ciB0ZXN0IGNvbW1hbmQ6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRfY29tbWFuZF9wYWNrYWdlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsiZGlzdHV0aWxzLmNvbW1hbmQiLCAiZm9vLmJhciIsICJkaXN0dXRpbHMudGVzdHMiXSkKKyAgICAgICAgY21kID0gZC5nZXRfY29tbWFuZF9vYmooInRlc3RfZGlzdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjbWQsIHRlc3RfZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuc2FtcGxlX29wdGlvbiwgInNvbWV0ZXh0IikKKworICAgIGRlZiB0ZXN0X2NvbW1hbmRfcGFja2FnZXNfY29uZmlnZmlsZShzZWxmKToKKyAgICAgICAgc3lzLmFyZ3YuYXBwZW5kKCJidWlsZCIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy51bmxpbmssIFRFU1RGTikKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJbZ2xvYmFsXSIKKyAgICAgICAgICAgIHByaW50ID4+IGYsICJjb21tYW5kX3BhY2thZ2VzID0gZm9vLmJhciwgc3BsYXQiCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBkID0gc2VsZi5jcmVhdGVfZGlzdHJpYnV0aW9uKFtURVNURk5dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImRpc3R1dGlscy5jb21tYW5kIiwgImZvby5iYXIiLCAic3BsYXQiXSkKKworICAgICAgICAjIGVuc3VyZSBjb21tYW5kIGxpbmUgb3ZlcnJpZGVzIGNvbmZpZzoKKyAgICAgICAgc3lzLmFyZ3ZbMTpdID0gWyItLWNvbW1hbmQtcGFja2FnZXMiLCAic3BvcmsiLCAiYnVpbGQiXQorICAgICAgICBkID0gc2VsZi5jcmVhdGVfZGlzdHJpYnV0aW9uKFtURVNURk5dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImRpc3R1dGlscy5jb21tYW5kIiwgInNwb3JrIl0pCisKKyAgICAgICAgIyBTZXR0aW5nIC0tY29tbWFuZC1wYWNrYWdlcyB0byAnJyBzaG91bGQgY2F1c2UgdGhlIGRlZmF1bHQgdG8KKyAgICAgICAgIyBiZSB1c2VkIGV2ZW4gaWYgYSBjb25maWcgZmlsZSBzcGVjaWZpZWQgc29tZXRoaW5nIGVsc2U6CisgICAgICAgIHN5cy5hcmd2WzE6XSA9IFsiLS1jb21tYW5kLXBhY2thZ2VzIiwgIiIsICJidWlsZCJdCisgICAgICAgIGQgPSBzZWxmLmNyZWF0ZV9kaXN0cmlidXRpb24oW1RFU1RGTl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRfY29tbWFuZF9wYWNrYWdlcygpLCBbImRpc3R1dGlscy5jb21tYW5kIl0pCisKKyAgICBkZWYgdGVzdF93cml0ZV9wa2dfZmlsZShzZWxmKToKKyAgICAgICAgIyBDaGVjayBEaXN0cmlidXRpb25NZXRhZGF0YSBoYW5kbGluZyBvZiBVbmljb2RlIGZpZWxkcworICAgICAgICB0bXBfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgbXlfZmlsZSA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZicpCisgICAgICAgIGtsYXNzID0gRGlzdHJpYnV0aW9uCisKKyAgICAgICAgZGlzdCA9IGtsYXNzKGF0dHJzPXsnYXV0aG9yJzogdSdNaXN0ZXIgQ2Fmw6knLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ215LnBhY2thZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWludGFpbmVyJzogdSdDYWbDqSBKdW5pb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHUnQ2Fmw6kgdG9ycsOpZmnDqScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb24nOiB1J0jDqWjDqWjDqSd9KQorCisgICAgICAgICMgbGV0J3MgbWFrZSBzdXJlIHRoZSBmaWxlIGNhbiBiZSB3cml0dGVuCisgICAgICAgICMgd2l0aCBVbmljb2RlIGZpZWxkcy4gdGhleSBhcmUgZW5jb2RlZCB3aXRoCisgICAgICAgICMgUEtHX0lORk9fRU5DT0RJTkcKKyAgICAgICAgZGlzdC5tZXRhZGF0YS53cml0ZV9wa2dfZmlsZShvcGVuKG15X2ZpbGUsICd3JykpCisKKyAgICAgICAgIyByZWd1bGFyIGFzY2lpIGlzIG9mIGNvdXJzZSBhbHdheXMgdXNhYmxlCisgICAgICAgIGRpc3QgPSBrbGFzcyhhdHRycz17J2F1dGhvcic6ICdNaXN0ZXIgQ2FmZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAnbXkucGFja2FnZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21haW50YWluZXInOiAnQ2FmZSBKdW5pb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbic6ICdDYWZlIHRvcnJlZmllJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6ICdIZWhlaGUnfSkKKworICAgICAgICBteV9maWxlMiA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZjInKQorICAgICAgICBkaXN0Lm1ldGFkYXRhLndyaXRlX3BrZ19maWxlKG9wZW4obXlfZmlsZTIsICd3JykpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9vcHRpb25zKHNlbGYpOgorICAgICAgICAjIGFuIGVtcHR5IG9wdGlvbnMgZGljdGlvbmFyeSBzaG91bGQgbm90IHN0YXkgaW4gdGhlCisgICAgICAgICMgbGlzdCBvZiBhdHRyaWJ1dGVzCisKKyAgICAgICAgIyBjYXRjaGluZyB3YXJuaW5ncworICAgICAgICB3YXJucyA9IFtdCisKKyAgICAgICAgZGVmIF93YXJuKG1zZyk6CisgICAgICAgICAgICB3YXJucy5hcHBlbmQobXNnKQorCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZXRhdHRyLCB3YXJuaW5ncywgJ3dhcm4nLCB3YXJuaW5ncy53YXJuKQorICAgICAgICB3YXJuaW5ncy53YXJuID0gX3dhcm4KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycz17J2F1dGhvcic6ICd4eHgnLCAnbmFtZSc6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbic6ICd4eHgnLCAndXJsJzogJ3h4eHgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucyc6IHt9fSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3YXJucyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ29wdGlvbnMnLCBkaXIoZGlzdCkpCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBhdHRycyA9IHsna2V5d29yZHMnOiAnb25lLHR3bycsCisgICAgICAgICAgICAgICAgICdwbGF0Zm9ybXMnOiAnb25lLHR3byd9CisKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycz1hdHRycykKKyAgICAgICAgZGlzdC5maW5hbGl6ZV9vcHRpb25zKCkKKworICAgICAgICAjIGZpbmFsaXplX29wdGlvbiBzcGxpdHMgcGxhdGZvcm1zIGFuZCBrZXl3b3JkcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QubWV0YWRhdGEucGxhdGZvcm1zLCBbJ29uZScsICd0d28nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0Lm1ldGFkYXRhLmtleXdvcmRzLCBbJ29uZScsICd0d28nXSkKKworICAgIGRlZiB0ZXN0X2dldF9jb21tYW5kX3BhY2thZ2VzKHNlbGYpOgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LmNvbW1hbmRfcGFja2FnZXMsIE5vbmUpCisgICAgICAgIGNtZHMgPSBkaXN0LmdldF9jb21tYW5kX3BhY2thZ2VzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWRzLCBbJ2Rpc3R1dGlscy5jb21tYW5kJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5jb21tYW5kX3BhY2thZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnZGlzdHV0aWxzLmNvbW1hbmQnXSkKKworICAgICAgICBkaXN0LmNvbW1hbmRfcGFja2FnZXMgPSAnb25lLHR3bycKKyAgICAgICAgY21kcyA9IGRpc3QuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZHMsIFsnZGlzdHV0aWxzLmNvbW1hbmQnLCAnb25lJywgJ3R3byddKQorCisgICAgZGVmIHRlc3RfYW5ub3VuY2Uoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoZSBsZXZlbCBpcyBrbm93bgorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKKyAgICAgICAgYXJncyA9ICgnb2snLCkKKyAgICAgICAga3dhcmdzID0geydsZXZlbCc6ICdvazInfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkaXN0LmFubm91bmNlLCBhcmdzLCBrd2FyZ3MpCisKKyAgICBkZWYgdGVzdF9maW5kX2NvbmZpZ19maWxlc19kaXNhYmxlKHNlbGYpOgorICAgICAgICAjIFRpY2tldCAjMTE4MDogQWxsb3cgdXNlciB0byBkaXNhYmxlIHRoZWlyIGhvbWUgY29uZmlnIGZpbGUuCisgICAgICAgIHRlbXBfaG9tZSA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHVzZXJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcF9ob21lLCAiLnB5ZGlzdHV0aWxzLmNmZyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1c2VyX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRlbXBfaG9tZSwgInB5ZGlzdHV0aWxzLmNmZyIpCisKKyAgICAgICAgd2l0aCBvcGVuKHVzZXJfZmlsZW5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoJ1tkaXN0dXRpbHNdXG4nKQorCisgICAgICAgIGRlZiBfZXhwYW5kZXIocGF0aCk6CisgICAgICAgICAgICByZXR1cm4gdGVtcF9ob21lCisKKyAgICAgICAgb2xkX2V4cGFuZGVyID0gb3MucGF0aC5leHBhbmR1c2VyCisgICAgICAgIG9zLnBhdGguZXhwYW5kdXNlciA9IF9leHBhbmRlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkID0gZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKCkKKyAgICAgICAgICAgIGFsbF9maWxlcyA9IGQuZmluZF9jb25maWdfZmlsZXMoKQorCisgICAgICAgICAgICBkID0gZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uKGF0dHJzPXsnc2NyaXB0X2FyZ3MnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJy0tbm8tdXNlci1jZmcnXX0pCisgICAgICAgICAgICBmaWxlcyA9IGQuZmluZF9jb25maWdfZmlsZXMoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyID0gb2xkX2V4cGFuZGVyCisKKyAgICAgICAgIyBtYWtlIHN1cmUgLS1uby11c2VyLWNmZyBkaXNhYmxlcyB0aGUgdXNlciBjZmcgZmlsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhbGxfZmlsZXMpLTEsIGxlbihmaWxlcykpCisKKworY2xhc3MgTWV0YWRhdGFUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLCBzdXBwb3J0LkVudmlyb25HdWFyZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihNZXRhZGF0YVRlc3RDYXNlLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuYXJndiA9IHN5cy5hcmd2LCBzeXMuYXJndls6XQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuYXJndiA9IHNlbGYuYXJndlswXQorICAgICAgICBzeXMuYXJndls6XSA9IHNlbGYuYXJndlsxXQorICAgICAgICBzdXBlcihNZXRhZGF0YVRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgdGVzdF9jbGFzc2lmaWVyKHNlbGYpOgorICAgICAgICBhdHRycyA9IHsnbmFtZSc6ICdCb2EnLCAndmVyc2lvbic6ICczLjAnLAorICAgICAgICAgICAgICAgICAnY2xhc3NpZmllcnMnOiBbJ1Byb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzJ119CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnMpCisgICAgICAgIG1ldGEgPSBzZWxmLmZvcm1hdF9tZXRhZGF0YShkaXN0KQorICAgICAgICBzZWxmLmFzc2VydEluKCdNZXRhZGF0YS1WZXJzaW9uOiAxLjEnLCBtZXRhKQorCisgICAgZGVmIHRlc3RfZG93bmxvYWRfdXJsKHNlbGYpOgorICAgICAgICBhdHRycyA9IHsnbmFtZSc6ICdCb2EnLCAndmVyc2lvbic6ICczLjAnLAorICAgICAgICAgICAgICAgICAnZG93bmxvYWRfdXJsJzogJ2h0dHA6Ly9leGFtcGxlLm9yZy9ib2EnfQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzKQorICAgICAgICBtZXRhID0gc2VsZi5mb3JtYXRfbWV0YWRhdGEoZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignTWV0YWRhdGEtVmVyc2lvbjogMS4xJywgbWV0YSkKKworICAgIGRlZiB0ZXN0X2xvbmdfZGVzY3JpcHRpb24oc2VsZik6CisgICAgICAgIGxvbmdfZGVzYyA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgIGV4YW1wbGU6OgorICAgICAgICAgICAgICBXZSBzdGFydCBoZXJlCisgICAgICAgICAgICBhbmQgY29udGludWUgaGVyZQorICAgICAgICAgIGFuZCBlbmQgaGVyZS4iIiIpCisgICAgICAgIGF0dHJzID0geyJuYW1lIjogInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAiLAorICAgICAgICAgICAgICAgICAibG9uZ19kZXNjcmlwdGlvbiI6IGxvbmdfZGVzY30KKworICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzKQorICAgICAgICBtZXRhID0gc2VsZi5mb3JtYXRfbWV0YWRhdGEoZGlzdCkKKyAgICAgICAgbWV0YSA9IG1ldGEucmVwbGFjZSgnXG4nICsgOCAqICcgJywgJ1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihsb25nX2Rlc2MsIG1ldGEpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfbWV0YWRhdGEoc2VsZik6CisgICAgICAgIGF0dHJzID0geyJuYW1lIjogInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAidmVyc2lvbiI6ICIxLjAifQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzKQorICAgICAgICBtZXRhID0gc2VsZi5mb3JtYXRfbWV0YWRhdGEoZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiTWV0YWRhdGEtVmVyc2lvbjogMS4wIiwgbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigicHJvdmlkZXM6IiwgbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJyZXF1aXJlczoiLCBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIm9ic29sZXRlczoiLCBtZXRhLmxvd2VyKCkpCisKKyAgICBkZWYgdGVzdF9wcm92aWRlcyhzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7Im5hbWUiOiAicGFja2FnZSIsCisgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAgICAgICJwcm92aWRlcyI6IFsicGFja2FnZSIsICJwYWNrYWdlLnN1YiJdfQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QubWV0YWRhdGEuZ2V0X3Byb3ZpZGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJwYWNrYWdlIiwgInBhY2thZ2Uuc3ViIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5nZXRfcHJvdmlkZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbInBhY2thZ2UiLCAicGFja2FnZS5zdWIiXSkKKyAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIk1ldGFkYXRhLVZlcnNpb246IDEuMSIsIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oInJlcXVpcmVzOiIsIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigib2Jzb2xldGVzOiIsIG1ldGEubG93ZXIoKSkKKworICAgIGRlZiB0ZXN0X3Byb3ZpZGVzX2lsbGVnYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERpc3RyaWJ1dGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyJuYW1lIjogInBhY2thZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMS4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm92aWRlcyI6IFsibXkucGtnIChzcGxhdCkiXX0pCisKKyAgICBkZWYgdGVzdF9yZXF1aXJlcyhzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7Im5hbWUiOiAicGFja2FnZSIsCisgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAgICAgICJyZXF1aXJlcyI6IFsib3RoZXIiLCAiYW5vdGhlciAoPT0xLjApIl19CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5tZXRhZGF0YS5nZXRfcmVxdWlyZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIm90aGVyIiwgImFub3RoZXIgKD09MS4wKSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZ2V0X3JlcXVpcmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg9PTEuMCkiXSkKKyAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIk1ldGFkYXRhLVZlcnNpb246IDEuMSIsIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oInByb3ZpZGVzOiIsIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiUmVxdWlyZXM6IG90aGVyIiwgbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiUmVxdWlyZXM6IGFub3RoZXIgKD09MS4wKSIsIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIm9ic29sZXRlczoiLCBtZXRhLmxvd2VyKCkpCisKKyAgICBkZWYgdGVzdF9yZXF1aXJlc19pbGxlZ2FsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEaXN0cmlidXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZXMiOiBbIm15LnBrZyAoc3BsYXQpIl19KQorCisgICAgZGVmIHRlc3Rfb2Jzb2xldGVzKHNlbGYpOgorICAgICAgICBhdHRycyA9IHsibmFtZSI6ICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgInZlcnNpb24iOiAiMS4wIiwKKyAgICAgICAgICAgICAgICAgIm9ic29sZXRlcyI6IFsib3RoZXIiLCAiYW5vdGhlciAoPDEuMCkiXX0KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihhdHRycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0Lm1ldGFkYXRhLmdldF9vYnNvbGV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIm90aGVyIiwgImFub3RoZXIgKDwxLjApIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5nZXRfb2Jzb2xldGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg8MS4wKSJdKQorICAgICAgICBtZXRhID0gc2VsZi5mb3JtYXRfbWV0YWRhdGEoZGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiTWV0YWRhdGEtVmVyc2lvbjogMS4xIiwgbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigicHJvdmlkZXM6IiwgbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJyZXF1aXJlczoiLCBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIk9ic29sZXRlczogb3RoZXIiLCBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydEluKCJPYnNvbGV0ZXM6IGFub3RoZXIgKDwxLjApIiwgbWV0YSkKKworICAgIGRlZiB0ZXN0X29ic29sZXRlc19pbGxlZ2FsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEaXN0cmlidXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsibmFtZSI6ICJwYWNrYWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Jzb2xldGVzIjogWyJteS5wa2cgKHNwbGF0KSJdfSkKKworICAgIGRlZiBmb3JtYXRfbWV0YWRhdGEoc2VsZiwgZGlzdCk6CisgICAgICAgIHNpbyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgZGlzdC5tZXRhZGF0YS53cml0ZV9wa2dfZmlsZShzaW8pCisgICAgICAgIHJldHVybiBzaW8uZ2V0dmFsdWUoKQorCisgICAgZGVmIHRlc3RfY3VzdG9tX3B5ZGlzdHV0aWxzKHNlbGYpOgorICAgICAgICAjIGZpeGVzICMyMTY2CisgICAgICAgICMgbWFrZSBzdXJlIHB5ZGlzdHV0aWxzLmNmZyBpcyBmb3VuZAorICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICB1c2VyX2ZpbGVuYW1lID0gIi5weWRpc3R1dGlscy5jZmciCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1c2VyX2ZpbGVuYW1lID0gInB5ZGlzdHV0aWxzLmNmZyIKKworICAgICAgICB0ZW1wX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHVzZXJfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcF9kaXIsIHVzZXJfZmlsZW5hbWUpCisgICAgICAgIGYgPSBvcGVuKHVzZXJfZmlsZW5hbWUsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgnLicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKCkKKworICAgICAgICAgICAgIyBsaW51eC1zdHlsZQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnbGludXgnLCAnZGFyd2luJyk6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvblsnSE9NRSddID0gdGVtcF9kaXIKKyAgICAgICAgICAgICAgICBmaWxlcyA9IGRpc3QuZmluZF9jb25maWdfZmlsZXMoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odXNlcl9maWxlbmFtZSwgZmlsZXMpCisKKyAgICAgICAgICAgICMgd2luMzItc3R5bGUKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgICAgICAgICAgICAgICMgaG9tZSBkcml2ZSBzaG91bGQgYmUgZm91bmQKKyAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydIT01FJ10gPSB0ZW1wX2RpcgorICAgICAgICAgICAgICAgIGZpbGVzID0gZGlzdC5maW5kX2NvbmZpZ19maWxlcygpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih1c2VyX2ZpbGVuYW1lLCBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyIG5vdCBmb3VuZCBpbiAlcicgJSAodXNlcl9maWxlbmFtZSwgZmlsZXMpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHVzZXJfZmlsZW5hbWUpCisKKyAgICBkZWYgdGVzdF9maXhfaGVscF9vcHRpb25zKHNlbGYpOgorICAgICAgICBoZWxwX3R1cGxlcyA9IFsoJ2EnLCAnYicsICdjJywgJ2QnKSwgKDEsIDIsIDMsIDQpXQorICAgICAgICBmYW5jeV9vcHRpb25zID0gZml4X2hlbHBfb3B0aW9ucyhoZWxwX3R1cGxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmYW5jeV9vcHRpb25zWzBdLCAoJ2EnLCAnYicsICdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmFuY3lfb3B0aW9uc1sxXSwgKDEsIDIsIDMpKQorCisgICAgZGVmIHRlc3Rfc2hvd19oZWxwKHNlbGYpOgorICAgICAgICAjIHNtb2tlIHRlc3QsIGp1c3QgbWFrZXMgc3VyZSBzb21lIGhlbHAgaXMgZGlzcGxheWVkCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oKQorICAgICAgICBzeXMuYXJndiA9IFtdCisgICAgICAgIGRpc3QuaGVscCA9IDEKKyAgICAgICAgZGlzdC5zY3JpcHRfbmFtZSA9ICdzZXR1cC5weScKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzOgorICAgICAgICAgICAgZGlzdC5wYXJzZV9jb21tYW5kX2xpbmUoKQorCisgICAgICAgIG91dHB1dCA9IFtsaW5lIGZvciBsaW5lIGluIHMuZ2V0dmFsdWUoKS5zcGxpdCgnXG4nKQorICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpICE9ICcnXQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3V0cHV0KQorCisgICAgZGVmIHRlc3RfcmVhZF9tZXRhZGF0YShzZWxmKToKKyAgICAgICAgYXR0cnMgPSB7Im5hbWUiOiAicGFja2FnZSIsCisgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCIsCisgICAgICAgICAgICAgICAgICJsb25nX2Rlc2NyaXB0aW9uIjogImRlc2MiLAorICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAieHh4IiwKKyAgICAgICAgICAgICAgICAgImRvd25sb2FkX3VybCI6ICJodHRwOi8vZXhhbXBsZS5jb20iLAorICAgICAgICAgICAgICAgICAia2V5d29yZHMiOiBbJ29uZScsICd0d28nXSwKKyAgICAgICAgICAgICAgICAgInJlcXVpcmVzIjogWydmb28nXX0KKworICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKGF0dHJzKQorICAgICAgICBtZXRhZGF0YSA9IGRpc3QubWV0YWRhdGEKKworICAgICAgICAjIHdyaXRlIGl0IHRoZW4gcmVsb2FkcyBpdAorICAgICAgICBQS0dfSU5GTyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgbWV0YWRhdGEud3JpdGVfcGtnX2ZpbGUoUEtHX0lORk8pCisgICAgICAgIFBLR19JTkZPLnNlZWsoMCkKKyAgICAgICAgbWV0YWRhdGEucmVhZF9wa2dfZmlsZShQS0dfSU5GTykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1ldGFkYXRhLm5hbWUsICJwYWNrYWdlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXRhZGF0YS52ZXJzaW9uLCAiMS4wIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXRhZGF0YS5kZXNjcmlwdGlvbiwgInh4eCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWV0YWRhdGEuZG93bmxvYWRfdXJsLCAnaHR0cDovL2V4YW1wbGUuY29tJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXRhZGF0YS5rZXl3b3JkcywgWydvbmUnLCAndHdvJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWV0YWRhdGEucGxhdGZvcm1zLCBbJ1VOS05PV04nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXRhZGF0YS5vYnNvbGV0ZXMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWV0YWRhdGEucmVxdWlyZXMsIFsnZm9vJ10pCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoRGlzdHJpYnV0aW9uVGVzdENhc2UpKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKE1ldGFkYXRhVGVzdENhc2UpKQorICAgIHJldHVybiBzdWl0ZQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpc3QucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzVhZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpc3QucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzVhZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9kaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYmNmNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVfdXRpbC5weQpAQCAtMCwwICsxLDgxIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmZpbGVfdXRpbC4iIiIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCisKK2Zyb20gZGlzdHV0aWxzLmZpbGVfdXRpbCBpbXBvcnQgbW92ZV9maWxlLCB3cml0ZV9maWxlLCBjb3B5X2ZpbGUKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2cKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworY2xhc3MgRmlsZVV0aWxUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2xvZyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID4gMDoKKyAgICAgICAgICAgIHNlbGYuX2xvZ3MuYXBwZW5kKG1zZyAlIGFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9sb2dzLmFwcGVuZChtc2cpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKEZpbGVVdGlsVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5fbG9ncyA9IFtdCisgICAgICAgIHNlbGYub2xkX2xvZyA9IGxvZy5pbmZvCisgICAgICAgIGxvZy5pbmZvID0gc2VsZi5fbG9nCisgICAgICAgIHRtcF9kaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBzZWxmLnNvdXJjZSA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZjEnKQorICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbih0bXBfZGlyLCAnZjInKQorICAgICAgICBzZWxmLnRhcmdldF9kaXIgPSBvcy5wYXRoLmpvaW4odG1wX2RpciwgJ2QxJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgbG9nLmluZm8gPSBzZWxmLm9sZF9sb2cKKyAgICAgICAgc3VwZXIoRmlsZVV0aWxUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIHRlc3RfbW92ZV9maWxlX3ZlcmJvc2l0eShzZWxmKToKKyAgICAgICAgZiA9IG9wZW4oc2VsZi5zb3VyY2UsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgnc29tZSBjb250ZW50JykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIG1vdmVfZmlsZShzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQsIHZlcmJvc2U9MCkKKyAgICAgICAgd2FudGVkID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9sb2dzLCB3YW50ZWQpCisKKyAgICAgICAgIyBiYWNrIHRvIG9yaWdpbmFsIHN0YXRlCisgICAgICAgIG1vdmVfZmlsZShzZWxmLnRhcmdldCwgc2VsZi5zb3VyY2UsIHZlcmJvc2U9MCkKKworICAgICAgICBtb3ZlX2ZpbGUoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0LCB2ZXJib3NlPTEpCisgICAgICAgIHdhbnRlZCA9IFsnbW92aW5nICVzIC0+ICVzJyAlIChzZWxmLnNvdXJjZSwgc2VsZi50YXJnZXQpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2xvZ3MsIHdhbnRlZCkKKworICAgICAgICAjIGJhY2sgdG8gb3JpZ2luYWwgc3RhdGUKKyAgICAgICAgbW92ZV9maWxlKHNlbGYudGFyZ2V0LCBzZWxmLnNvdXJjZSwgdmVyYm9zZT0wKQorCisgICAgICAgIHNlbGYuX2xvZ3MgPSBbXQorICAgICAgICAjIG5vdyB0aGUgdGFyZ2V0IGlzIGEgZGlyCisgICAgICAgIG9zLm1rZGlyKHNlbGYudGFyZ2V0X2RpcikKKyAgICAgICAgbW92ZV9maWxlKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldF9kaXIsIHZlcmJvc2U9MSkKKyAgICAgICAgd2FudGVkID0gWydtb3ZpbmcgJXMgLT4gJXMnICUgKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldF9kaXIpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2xvZ3MsIHdhbnRlZCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX2ZpbGUoc2VsZik6CisgICAgICAgIGxpbmVzID0gWydhJywgJ2InLCAnYyddCisgICAgICAgIGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGZvbyA9IG9zLnBhdGguam9pbihkaXIsICdmb28nKQorICAgICAgICB3cml0ZV9maWxlKGZvbywgbGluZXMpCisgICAgICAgIGNvbnRlbnQgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIG9wZW4oZm9vKS5yZWFkbGluZXMoKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50LCBsaW5lcykKKworICAgIGRlZiB0ZXN0X2NvcHlfZmlsZShzZWxmKToKKyAgICAgICAgc3JjX2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGZvbyA9IG9zLnBhdGguam9pbihzcmNfZGlyLCAnZm9vJykKKyAgICAgICAgd3JpdGVfZmlsZShmb28sICdjb250ZW50JykKKyAgICAgICAgZHN0X2RpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGNvcHlfZmlsZShmb28sIGRzdF9kaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ2ZvbycpKSkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEZpbGVVdGlsVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZV91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q4NjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9maWxlX3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZWxpc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Yjg4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5CkBAIC0wLDAgKzEsMjk5IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmZpbGVsaXN0LiIiIgoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGRlYnVnCitmcm9tIGRpc3R1dGlscy5sb2cgaW1wb3J0IFdBUk4KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzVGVtcGxhdGVFcnJvcgorZnJvbSBkaXN0dXRpbHMuZmlsZWxpc3QgaW1wb3J0IGdsb2JfdG9fcmUsIHRyYW5zbGF0ZV9wYXR0ZXJuLCBGaWxlTGlzdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworTUFOSUZFU1RfSU4gPSAiIiJcCitpbmNsdWRlIG9rCitpbmNsdWRlIHhvCitleGNsdWRlIHhvCitpbmNsdWRlIGZvby50bXAKK2luY2x1ZGUgYnVpbGRvdXQuY2ZnCitnbG9iYWwtaW5jbHVkZSAqLngKK2dsb2JhbC1pbmNsdWRlICoudHh0CitnbG9iYWwtZXhjbHVkZSAqLnRtcAorcmVjdXJzaXZlLWluY2x1ZGUgZiAqLm9vCityZWN1cnNpdmUtZXhjbHVkZSBnbG9iYWwgKi54CitncmFmdCBkaXIKK3BydW5lIGRpcjMKKyIiIgorCisKK2RlZiBtYWtlX2xvY2FsX3BhdGgocyk6CisgICAgIiIiQ29udmVydHMgJy8nIGluIGEgc3RyaW5nIHRvIG9zLnNlcCIiIgorICAgIHJldHVybiBzLnJlcGxhY2UoJy8nLCBvcy5zZXApCisKKworY2xhc3MgRmlsZUxpc3RUZXN0Q2FzZShzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydE5vV2FybmluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZXRfbG9ncyhXQVJOKSwgW10pCisgICAgICAgIHNlbGYuY2xlYXJfbG9ncygpCisKKyAgICBkZWYgYXNzZXJ0V2FybmluZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihsZW4oc2VsZi5nZXRfbG9ncyhXQVJOKSksIDApCisgICAgICAgIHNlbGYuY2xlYXJfbG9ncygpCisKKyAgICBkZWYgdGVzdF9nbG9iX3RvX3JlKHNlbGYpOgorICAgICAgICBzZXAgPSBvcy5zZXAKKyAgICAgICAgaWYgb3Muc2VwID09ICdcXCc6CisgICAgICAgICAgICBzZXAgPSByZS5lc2NhcGUob3Muc2VwKQorCisgICAgICAgIGZvciBnbG9iLCByZWdleCBpbiAoCisgICAgICAgICAgICAjIHNpbXBsZSBjYXNlcworICAgICAgICAgICAgKCdmb28qJywgcidmb29bXiUoc2VwKXNdKlxaKD9tcyknKSwKKyAgICAgICAgICAgICgnZm9vPycsIHInZm9vW14lKHNlcClzXVxaKD9tcyknKSwKKyAgICAgICAgICAgICgnZm9vPz8nLCByJ2Zvb1teJShzZXApc11bXiUoc2VwKXNdXFooP21zKScpLAorICAgICAgICAgICAgIyBzcGVjaWFsIGNhc2VzCisgICAgICAgICAgICAocidmb29cXConLCByJ2Zvb1xcXFxbXiUoc2VwKXNdKlxaKD9tcyknKSwKKyAgICAgICAgICAgIChyJ2Zvb1xcXConLCByJ2Zvb1xcXFxcXFteJShzZXApc10qXFooP21zKScpLAorICAgICAgICAgICAgKCdmb28/Pz8/Jywgcidmb29bXiUoc2VwKXNdW14lKHNlcClzXVteJShzZXApc11bXiUoc2VwKXNdXFooP21zKScpLAorICAgICAgICAgICAgKHInZm9vXFw/PycsIHInZm9vXFxcXFteJShzZXApc11bXiUoc2VwKXNdXFooP21zKScpKToKKyAgICAgICAgICAgIHJlZ2V4ID0gcmVnZXggJSB7J3NlcCc6IHNlcH0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2xvYl90b19yZShnbG9iKSwgcmVnZXgpCisKKyAgICBkZWYgdGVzdF9wcm9jZXNzX3RlbXBsYXRlX2xpbmUoc2VsZik6CisgICAgICAgICMgdGVzdGluZyAgYWxsIE1BTklGRVNULmluIHRlbXBsYXRlIHBhdHRlcm5zCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgbCA9IG1ha2VfbG9jYWxfcGF0aAorCisgICAgICAgICMgc2ltdWxhdGVkIGZpbGUgbGlzdAorICAgICAgICBmaWxlX2xpc3QuYWxsZmlsZXMgPSBbJ2Zvby50bXAnLCAnb2snLCAneG8nLCAnZm91ci50eHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkb3V0LmNmZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpbGVsaXN0IGRvZXMgbm90IGZpbHRlciBvdXQgVkNTIGRpcmVjdG9yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCdzIHNkaXN0IHRoYXQgZG9lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnLmhnL2xhc3QtbWVzc2FnZS50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2dsb2JhbC9vbmUudHh0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsKCdnbG9iYWwvdHdvLnR4dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZ2xvYmFsL2ZpbGVzLngnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2dsb2JhbC9oZXJlLnRtcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZi9vL2Yub28nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2Rpci9ncmFmdC1vbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwoJ2Rpci9kaXIyL2dyYWZ0MicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZGlyMy9vaycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZGlyMy9zdWIvb2sudHh0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgbGluZSBpbiBNQU5JRkVTVF9JTi5zcGxpdCgnXG4nKToKKyAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSA9PSAnJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZShsaW5lKQorCisgICAgICAgIHdhbnRlZCA9IFsnb2snLAorICAgICAgICAgICAgICAgICAgJ2J1aWxkb3V0LmNmZycsCisgICAgICAgICAgICAgICAgICAnZm91ci50eHQnLAorICAgICAgICAgICAgICAgICAgbCgnLmhnL2xhc3QtbWVzc2FnZS50eHQnKSwKKyAgICAgICAgICAgICAgICAgIGwoJ2dsb2JhbC9vbmUudHh0JyksCisgICAgICAgICAgICAgICAgICBsKCdnbG9iYWwvdHdvLnR4dCcpLAorICAgICAgICAgICAgICAgICAgbCgnZi9vL2Yub28nKSwKKyAgICAgICAgICAgICAgICAgIGwoJ2Rpci9ncmFmdC1vbmUnKSwKKyAgICAgICAgICAgICAgICAgIGwoJ2Rpci9kaXIyL2dyYWZ0MicpLAorICAgICAgICAgICAgICAgICBdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIHdhbnRlZCkKKworICAgIGRlZiB0ZXN0X2RlYnVnX3ByaW50KHNlbGYpOgorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgZmlsZV9saXN0LmRlYnVnX3ByaW50KCd4eHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dC5nZXR2YWx1ZSgpLCAnJykKKworICAgICAgICBkZWJ1Zy5ERUJVRyA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICAgICAgZmlsZV9saXN0LmRlYnVnX3ByaW50KCd4eHgnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuZ2V0dmFsdWUoKSwgJ3h4eFxuJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlYnVnLkRFQlVHID0gRmFsc2UKKworICAgIGRlZiB0ZXN0X3NldF9hbGxmaWxlcyhzZWxmKToKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlcyA9IFsnYScsICdiJywgJ2MnXQorICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKGZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5hbGxmaWxlcywgZmlsZXMpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfZHVwbGljYXRlcyhzZWxmKToKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EnLCAnYicsICdhJywgJ2cnLCAnYycsICdnJ10KKyAgICAgICAgIyBmaWxlcyBtdXN0IGJlIHNvcnRlZCBiZWZvcmVoYW5kIChzZGlzdCBkb2VzIGl0KQorICAgICAgICBmaWxlX2xpc3Quc29ydCgpCisgICAgICAgIGZpbGVfbGlzdC5yZW1vdmVfZHVwbGljYXRlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EnLCAnYicsICdjJywgJ2cnXSkKKworICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZV9wYXR0ZXJuKHNlbGYpOgorICAgICAgICAjIG5vdCByZWdleAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cigKKyAgICAgICAgICAgIHRyYW5zbGF0ZV9wYXR0ZXJuKCdhJywgYW5jaG9yPVRydWUsIGlzX3JlZ2V4PUZhbHNlKSwKKyAgICAgICAgICAgICdzZWFyY2gnKSkKKworICAgICAgICAjIGlzIGEgcmVnZXgKKyAgICAgICAgcmVnZXggPSByZS5jb21waWxlKCdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHRyYW5zbGF0ZV9wYXR0ZXJuKHJlZ2V4LCBhbmNob3I9VHJ1ZSwgaXNfcmVnZXg9VHJ1ZSksCisgICAgICAgICAgICByZWdleCkKKworICAgICAgICAjIHBsYWluIHN0cmluZyBmbGFnZ2VkIGFzIHJlZ2V4CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKAorICAgICAgICAgICAgdHJhbnNsYXRlX3BhdHRlcm4oJ2EnLCBhbmNob3I9VHJ1ZSwgaXNfcmVnZXg9VHJ1ZSksCisgICAgICAgICAgICAnc2VhcmNoJykpCisKKyAgICAgICAgIyBnbG9iIHN1cHBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYW5zbGF0ZV9wYXR0ZXJuKAorICAgICAgICAgICAgJyoucHknLCBhbmNob3I9VHJ1ZSwgaXNfcmVnZXg9RmFsc2UpLnNlYXJjaCgnZmlsZWxpc3QucHknKSkKKworICAgIGRlZiB0ZXN0X2V4Y2x1ZGVfcGF0dGVybihzZWxmKToKKyAgICAgICAgIyByZXR1cm4gRmFsc2UgaWYgbm8gbWF0Y2gKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbGVfbGlzdC5leGNsdWRlX3BhdHRlcm4oJyoucHknKSkKKworICAgICAgICAjIHJldHVybiBUcnVlIGlmIGZpbGVzIG1hdGNoCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LmZpbGVzID0gWydhLnB5JywgJ2IucHknXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZV9saXN0LmV4Y2x1ZGVfcGF0dGVybignKi5weScpKQorCisgICAgICAgICMgdGVzdCBleGNsdWRlcworICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5maWxlcyA9IFsnYS5weScsICdhLnR4dCddCisgICAgICAgIGZpbGVfbGlzdC5leGNsdWRlX3BhdHRlcm4oJyoucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnR4dCddKQorCisgICAgZGVmIHRlc3RfaW5jbHVkZV9wYXR0ZXJuKHNlbGYpOgorICAgICAgICAjIHJldHVybiBGYWxzZSBpZiBubyBtYXRjaAorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmlsZV9saXN0LmluY2x1ZGVfcGF0dGVybignKi5weScpKQorCisgICAgICAgICMgcmV0dXJuIFRydWUgaWYgZmlsZXMgbWF0Y2gKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKFsnYS5weScsICdiLnR4dCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZV9saXN0LmluY2x1ZGVfcGF0dGVybignKi5weScpKQorCisgICAgICAgICMgdGVzdCAqIG1hdGNoZXMgYWxsIGZpbGVzCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZmlsZV9saXN0LmFsbGZpbGVzKQorICAgICAgICBmaWxlX2xpc3Quc2V0X2FsbGZpbGVzKFsnYS5weScsICdiLnR4dCddKQorICAgICAgICBmaWxlX2xpc3QuaW5jbHVkZV9wYXR0ZXJuKCcqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuYWxsZmlsZXMsIFsnYS5weScsICdiLnR4dCddKQorCisgICAgZGVmIHRlc3RfcHJvY2Vzc190ZW1wbGF0ZShzZWxmKToKKyAgICAgICAgbCA9IG1ha2VfbG9jYWxfcGF0aAorICAgICAgICAjIGludmFsaWQgbGluZXMKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmb3IgYWN0aW9uIGluICgnaW5jbHVkZScsICdleGNsdWRlJywgJ2dsb2JhbC1pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2dsb2JhbC1leGNsdWRlJywgJ3JlY3Vyc2l2ZS1pbmNsdWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ3JlY3Vyc2l2ZS1leGNsdWRlJywgJ2dyYWZ0JywgJ3BydW5lJywgJ2JsYXJnJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNUZW1wbGF0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSwgYWN0aW9uKQorCisgICAgICAgICMgaW5jbHVkZQorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgJ2IudHh0JywgbCgnZC9jLnB5JyldKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2luY2x1ZGUgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb1dhcm5pbmdzKCkKKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdpbmNsdWRlICoucmInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgWydhLnB5J10pCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZ3MoKQorCisgICAgICAgICMgZXhjbHVkZQorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5maWxlcyA9IFsnYS5weScsICdiLnR4dCcsIGwoJ2QvYy5weScpXQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2V4Y2x1ZGUgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2IudHh0JywgbCgnZC9jLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2V4Y2x1ZGUgKi5yYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2IudHh0JywgbCgnZC9jLnB5JyldKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKKworICAgICAgICAjIGdsb2JhbC1pbmNsdWRlCisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LnNldF9hbGxmaWxlcyhbJ2EucHknLCAnYi50eHQnLCBsKCdkL2MucHknKV0pCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnZ2xvYmFsLWluY2x1ZGUgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCBsKCdkL2MucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5ncygpCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgnZ2xvYmFsLWluY2x1ZGUgKi5yYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCBsKCdkL2MucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZ3MoKQorCisgICAgICAgICMgZ2xvYmFsLWV4Y2x1ZGUKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EucHknLCAnYi50eHQnLCBsKCdkL2MucHknKV0KKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdnbG9iYWwtZXhjbHVkZSAqLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYi50eHQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb1dhcm5pbmdzKCkKKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdnbG9iYWwtZXhjbHVkZSAqLnJiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFsnYi50eHQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5ncygpCisKKyAgICAgICAgIyByZWN1cnNpdmUtaW5jbHVkZQorICAgICAgICBmaWxlX2xpc3QgPSBGaWxlTGlzdCgpCisgICAgICAgIGZpbGVfbGlzdC5zZXRfYWxsZmlsZXMoWydhLnB5JywgbCgnZC9iLnB5JyksIGwoJ2QvYy50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZC9kL2UucHknKV0pCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgncmVjdXJzaXZlLWluY2x1ZGUgZCAqLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFtsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5ncygpCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgncmVjdXJzaXZlLWluY2x1ZGUgZSAqLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFtsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZ3MoKQorCisgICAgICAgICMgcmVjdXJzaXZlLWV4Y2x1ZGUKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EucHknLCBsKCdkL2IucHknKSwgbCgnZC9jLnR4dCcpLCBsKCdkL2QvZS5weScpXQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3JlY3Vyc2l2ZS1leGNsdWRlIGQgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCBsKCdkL2MudHh0JyldKQorICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZ3MoKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ3JlY3Vyc2l2ZS1leGNsdWRlIGUgKi5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCBsKCdkL2MudHh0JyldKQorICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmdzKCkKKworICAgICAgICAjIGdyYWZ0CisgICAgICAgIGZpbGVfbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgZmlsZV9saXN0LnNldF9hbGxmaWxlcyhbJ2EucHknLCBsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCgnZi9mLnB5JyldKQorCisgICAgICAgIGZpbGVfbGlzdC5wcm9jZXNzX3RlbXBsYXRlX2xpbmUoJ2dyYWZ0IGQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbGlzdC5maWxlcywgW2woJ2QvYi5weScpLCBsKCdkL2QvZS5weScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb1dhcm5pbmdzKCkKKworICAgICAgICBmaWxlX2xpc3QucHJvY2Vzc190ZW1wbGF0ZV9saW5lKCdncmFmdCBlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2xpc3QuZmlsZXMsIFtsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZ3MoKQorCisgICAgICAgICMgcHJ1bmUKKyAgICAgICAgZmlsZV9saXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBmaWxlX2xpc3QuZmlsZXMgPSBbJ2EucHknLCBsKCdkL2IucHknKSwgbCgnZC9kL2UucHknKSwgbCgnZi9mLnB5JyldCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgncHJ1bmUgZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCBsKCdmL2YucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm9XYXJuaW5ncygpCisKKyAgICAgICAgZmlsZV9saXN0LnByb2Nlc3NfdGVtcGxhdGVfbGluZSgncHJ1bmUgZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9saXN0LmZpbGVzLCBbJ2EucHknLCBsKCdmL2YucHknKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZ3MoKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShGaWxlTGlzdFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZWxpc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGZhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZmlsZWxpc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZGZhMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2ZpbGVsaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NjE2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbC5weQpAQCAtMCwwICsxLDI0NyBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2l0ZQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgc3lzY29uZmlnCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQgaW1wb3J0IGluc3RhbGwgYXMgaW5zdGFsbF9tb2R1bGUKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbCBpbXBvcnQgSU5TVEFMTF9TQ0hFTUVTCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzT3B0aW9uRXJyb3IKK2Zyb20gZGlzdHV0aWxzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCisKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0CisKKworZGVmIF9tYWtlX2V4dF9uYW1lKG1vZG5hbWUpOgorICAgIGlmIG9zLm5hbWUgPT0gJ250JyBhbmQgc3lzLmV4ZWN1dGFibGUuZW5kc3dpdGgoJ19kLmV4ZScpOgorICAgICAgICBtb2RuYW1lICs9ICdfZCcKKyAgICByZXR1cm4gbW9kbmFtZSArIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignU08nKQorCisKK2NsYXNzIEluc3RhbGxUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2hvbWVfaW5zdGFsbGF0aW9uX3NjaGVtZShzZWxmKToKKyAgICAgICAgIyBUaGlzIGVuc3VyZSB0d28gdGhpbmdzOgorICAgICAgICAjIC0gdGhhdCAtLWhvbWUgZ2VuZXJhdGVzIHRoZSBkZXNpcmVkIHNldCBvZiBkaXJlY3RvcnkgbmFtZXMKKyAgICAgICAgIyAtIHRlc3QgLS1ob21lIGlzIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zCisgICAgICAgIGJ1aWxkZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgZGVzdGluYXRpb24gPSBvcy5wYXRoLmpvaW4oYnVpbGRkaXIsICJpbnN0YWxsYXRpb24iKQorCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyJuYW1lIjogImZvb3BrZyJ9KQorICAgICAgICAjIHNjcmlwdF9uYW1lIG5lZWQgbm90IGV4aXN0LCBpdCBqdXN0IG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgZGlzdC5zY3JpcHRfbmFtZSA9IG9zLnBhdGguam9pbihidWlsZGRpciwgInNldHVwLnB5IikKKyAgICAgICAgZGlzdC5jb21tYW5kX29ialsiYnVpbGQiXSA9IHN1cHBvcnQuRHVtbXlDb21tYW5kKAorICAgICAgICAgICAgYnVpbGRfYmFzZT1idWlsZGRpciwKKyAgICAgICAgICAgIGJ1aWxkX2xpYj1vcy5wYXRoLmpvaW4oYnVpbGRkaXIsICJsaWIiKSwKKyAgICAgICAgICAgICkKKworICAgICAgICBjbWQgPSBpbnN0YWxsKGRpc3QpCisgICAgICAgIGNtZC5ob21lID0gZGVzdGluYXRpb24KKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmluc3RhbGxfYmFzZSwgZGVzdGluYXRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmluc3RhbGxfcGxhdGJhc2UsIGRlc3RpbmF0aW9uKQorCisgICAgICAgIGRlZiBjaGVja19wYXRoKGdvdCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgZ290ID0gb3MucGF0aC5ub3JtcGF0aChnb3QpCisgICAgICAgICAgICBleHBlY3RlZCA9IG9zLnBhdGgubm9ybXBhdGgoZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgbGliZGlyID0gb3MucGF0aC5qb2luKGRlc3RpbmF0aW9uLCAibGliIiwgInB5dGhvbiIpCisgICAgICAgIGNoZWNrX3BhdGgoY21kLmluc3RhbGxfbGliLCBsaWJkaXIpCisgICAgICAgIGNoZWNrX3BhdGgoY21kLmluc3RhbGxfcGxhdGxpYiwgbGliZGlyKQorICAgICAgICBjaGVja19wYXRoKGNtZC5pbnN0YWxsX3B1cmVsaWIsIGxpYmRpcikKKyAgICAgICAgY2hlY2tfcGF0aChjbWQuaW5zdGFsbF9oZWFkZXJzLAorICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkZXN0aW5hdGlvbiwgImluY2x1ZGUiLCAicHl0aG9uIiwgImZvb3BrZyIpKQorICAgICAgICBjaGVja19wYXRoKGNtZC5pbnN0YWxsX3NjcmlwdHMsIG9zLnBhdGguam9pbihkZXN0aW5hdGlvbiwgImJpbiIpKQorICAgICAgICBjaGVja19wYXRoKGNtZC5pbnN0YWxsX2RhdGEsIGRlc3RpbmF0aW9uKQorCisgICAgZGVmIHRlc3RfdXNlcl9zaXRlKHNlbGYpOgorICAgICAgICAjIHNpdGUuVVNFUl9TSVRFIHdhcyBpbnRyb2R1Y2VkIGluIDIuNgorICAgICAgICBpZiBzeXMudmVyc2lvbiA8ICcyLjYnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBwcmVwYXJpbmcgdGhlIGVudmlyb25tZW50IGZvciB0aGUgdGVzdAorICAgICAgICBzZWxmLm9sZF91c2VyX2Jhc2UgPSBzaXRlLlVTRVJfQkFTRQorICAgICAgICBzZWxmLm9sZF91c2VyX3NpdGUgPSBzaXRlLlVTRVJfU0lURQorICAgICAgICBzZWxmLnRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHNlbGYudXNlcl9iYXNlID0gb3MucGF0aC5qb2luKHNlbGYudG1wZGlyLCAnQicpCisgICAgICAgIHNlbGYudXNlcl9zaXRlID0gb3MucGF0aC5qb2luKHNlbGYudG1wZGlyLCAnUycpCisgICAgICAgIHNpdGUuVVNFUl9CQVNFID0gc2VsZi51c2VyX2Jhc2UKKyAgICAgICAgc2l0ZS5VU0VSX1NJVEUgPSBzZWxmLnVzZXJfc2l0ZQorICAgICAgICBpbnN0YWxsX21vZHVsZS5VU0VSX0JBU0UgPSBzZWxmLnVzZXJfYmFzZQorICAgICAgICBpbnN0YWxsX21vZHVsZS5VU0VSX1NJVEUgPSBzZWxmLnVzZXJfc2l0ZQorCisgICAgICAgIGRlZiBfZXhwYW5kdXNlcihwYXRoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRtcGRpcgorICAgICAgICBzZWxmLm9sZF9leHBhbmQgPSBvcy5wYXRoLmV4cGFuZHVzZXIKKyAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyID0gX2V4cGFuZHVzZXIKKworICAgICAgICBkZWYgY2xlYW51cCgpOgorICAgICAgICAgICAgc2l0ZS5VU0VSX0JBU0UgPSBzZWxmLm9sZF91c2VyX2Jhc2UKKyAgICAgICAgICAgIHNpdGUuVVNFUl9TSVRFID0gc2VsZi5vbGRfdXNlcl9zaXRlCisgICAgICAgICAgICBpbnN0YWxsX21vZHVsZS5VU0VSX0JBU0UgPSBzZWxmLm9sZF91c2VyX2Jhc2UKKyAgICAgICAgICAgIGluc3RhbGxfbW9kdWxlLlVTRVJfU0lURSA9IHNlbGYub2xkX3VzZXJfc2l0ZQorICAgICAgICAgICAgb3MucGF0aC5leHBhbmR1c2VyID0gc2VsZi5vbGRfZXhwYW5kCisKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNsZWFudXApCisKKyAgICAgICAgZm9yIGtleSBpbiAoJ250X3VzZXInLCAndW5peF91c2VyJywgJ29zMl9ob21lJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGtleSwgSU5TVEFMTF9TQ0hFTUVTKQorCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4J30pCisgICAgICAgIGNtZCA9IGluc3RhbGwoZGlzdCkKKworICAgICAgICAjIG1ha2luZyBzdXJlIHRoZSB1c2VyIG9wdGlvbiBpcyB0aGVyZQorICAgICAgICBvcHRpb25zID0gW25hbWUgZm9yIG5hbWUsIHNob3J0LCBsYWJsZSBpbgorICAgICAgICAgICAgICAgICAgIGNtZC51c2VyX29wdGlvbnNdCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZXInLCBvcHRpb25zKQorCisgICAgICAgICMgc2V0dGluZyBhIHZhbHVlCisgICAgICAgIGNtZC51c2VyID0gMQorCisgICAgICAgICMgdXNlciBiYXNlIGFuZCBzaXRlIHNob3VsZG4ndCBiZSBjcmVhdGVkIHlldAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHNlbGYudXNlcl9iYXNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCisKKyAgICAgICAgIyBsZXQncyBydW4gZmluYWxpemUKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgICMgbm93IHRoZXkgc2hvdWxkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXNlcmJhc2UnLCBjbWQuY29uZmlnX3ZhcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3VzZXJzaXRlJywgY21kLmNvbmZpZ192YXJzKQorCisgICAgZGVmIHRlc3RfaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywgJ2V4dHJhX3BhdGgnOiAncGF0aCxkaXJzJ30pCisgICAgICAgIGNtZCA9IGluc3RhbGwoZGlzdCkKKworICAgICAgICAjIHR3byBlbGVtZW50cworICAgICAgICBjbWQuaGFuZGxlX2V4dHJhX3BhdGgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5leHRyYV9wYXRoLCBbJ3BhdGgnLCAnZGlycyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5leHRyYV9kaXJzLCAnZGlycycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLnBhdGhfZmlsZSwgJ3BhdGgnKQorCisgICAgICAgICMgb25lIGVsZW1lbnQKKyAgICAgICAgY21kLmV4dHJhX3BhdGggPSBbJ3BhdGgnXQorICAgICAgICBjbWQuaGFuZGxlX2V4dHJhX3BhdGgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5leHRyYV9wYXRoLCBbJ3BhdGgnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZXh0cmFfZGlycywgJ3BhdGgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5wYXRoX2ZpbGUsICdwYXRoJykKKworICAgICAgICAjIG5vbmUKKyAgICAgICAgZGlzdC5leHRyYV9wYXRoID0gY21kLmV4dHJhX3BhdGggPSBOb25lCisgICAgICAgIGNtZC5oYW5kbGVfZXh0cmFfcGF0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmV4dHJhX3BhdGgsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmV4dHJhX2RpcnMsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5wYXRoX2ZpbGUsIE5vbmUpCisKKyAgICAgICAgIyB0aHJlZSBlbGVtZW50cyAobm8gd2F5ICEpCisgICAgICAgIGNtZC5leHRyYV9wYXRoID0gJ3BhdGgsZGlycyxhZ2FpbicKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5oYW5kbGVfZXh0cmFfcGF0aCkKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4J30pCisgICAgICAgIGNtZCA9IGluc3RhbGwoZGlzdCkKKworICAgICAgICAjIG11c3Qgc3VwcGx5IGVpdGhlciBwcmVmaXgvZXhlYy1wcmVmaXgvaG9tZSBvcgorICAgICAgICAjIGluc3RhbGwtYmFzZS9pbnN0YWxsLXBsYXRiYXNlIC0tIG5vdCBib3RoCisgICAgICAgIGNtZC5wcmVmaXggPSAncHJlZml4JworICAgICAgICBjbWQuaW5zdGFsbF9iYXNlID0gJ2Jhc2UnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZmluYWxpemVfb3B0aW9ucykKKworICAgICAgICAjIG11c3Qgc3VwcGx5IGVpdGhlciBob21lIG9yIHByZWZpeC9leGVjLXByZWZpeCAtLSBub3QgYm90aAorICAgICAgICBjbWQuaW5zdGFsbF9iYXNlID0gTm9uZQorICAgICAgICBjbWQuaG9tZSA9ICdob21lJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmZpbmFsaXplX29wdGlvbnMpCisKKyAgICAgICAgIyBjYW4ndCBjb21iaW5lIHVzZXIgd2l0aCBwcmVmaXgvZXhlY19wcmVmaXgvaG9tZSBvcgorICAgICAgICAjIGluc3RhbGxfKHBsYXQpYmFzZQorICAgICAgICBjbWQucHJlZml4ID0gTm9uZQorICAgICAgICBjbWQudXNlciA9ICd1c2VyJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmZpbmFsaXplX29wdGlvbnMpCisKKyAgICBkZWYgdGVzdF9yZWNvcmQoc2VsZik6CisgICAgICAgIGluc3RhbGxfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgcHJvamVjdF9kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KHB5X21vZHVsZXM9WydoZWxsbyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cz1bJ3NheWhpJ10pCisgICAgICAgIG9zLmNoZGlyKHByb2plY3RfZGlyKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoJ2hlbGxvLnB5JywgImRlZiBtYWluKCk6IHByaW50ICdvIGhhaSciKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoJ3NheWhpJywgJ2Zyb20gaGVsbG8gaW1wb3J0IG1haW47IG1haW4oKScpCisKKyAgICAgICAgY21kID0gaW5zdGFsbChkaXN0KQorICAgICAgICBkaXN0LmNvbW1hbmRfb2JqWydpbnN0YWxsJ10gPSBjbWQKKyAgICAgICAgY21kLnJvb3QgPSBpbnN0YWxsX2RpcgorICAgICAgICBjbWQucmVjb3JkID0gb3MucGF0aC5qb2luKHByb2plY3RfZGlyLCAnZmlsZWxpc3QnKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIGYgPSBvcGVuKGNtZC5yZWNvcmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZm91bmQgPSBbb3MucGF0aC5iYXNlbmFtZShsaW5lKSBmb3IgbGluZSBpbiBjb250ZW50LnNwbGl0bGluZXMoKV0KKyAgICAgICAgZXhwZWN0ZWQgPSBbJ2hlbGxvLnB5JywgJ2hlbGxvLnB5YycsICdzYXloaScsCisgICAgICAgICAgICAgICAgICAgICdVTktOT1dOLTAuMC4wLXB5JXMuJXMuZWdnLWluZm8nICUgc3lzLnZlcnNpb25faW5mb1s6Ml1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91bmQsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfcmVjb3JkX2V4dGVuc2lvbnMoc2VsZik6CisgICAgICAgIGluc3RhbGxfZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgcHJvamVjdF9kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KGV4dF9tb2R1bGVzPVsKKyAgICAgICAgICAgIEV4dGVuc2lvbigneHgnLCBbJ3h4bW9kdWxlLmMnXSldKQorICAgICAgICBvcy5jaGRpcihwcm9qZWN0X2RpcikKKyAgICAgICAgc3VwcG9ydC5jb3B5X3h4bW9kdWxlX2MocHJvamVjdF9kaXIpCisKKyAgICAgICAgYnVpbGRleHRjbWQgPSBidWlsZF9leHQoZGlzdCkKKyAgICAgICAgc3VwcG9ydC5maXh1cF9idWlsZF9leHQoYnVpbGRleHRjbWQpCisgICAgICAgIGJ1aWxkZXh0Y21kLmVuc3VyZV9maW5hbGl6ZWQoKQorCisgICAgICAgIGNtZCA9IGluc3RhbGwoZGlzdCkKKyAgICAgICAgZGlzdC5jb21tYW5kX29ialsnaW5zdGFsbCddID0gY21kCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbJ2J1aWxkX2V4dCddID0gYnVpbGRleHRjbWQKKyAgICAgICAgY21kLnJvb3QgPSBpbnN0YWxsX2RpcgorICAgICAgICBjbWQucmVjb3JkID0gb3MucGF0aC5qb2luKHByb2plY3RfZGlyLCAnZmlsZWxpc3QnKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgIGYgPSBvcGVuKGNtZC5yZWNvcmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRlbnQgPSBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZm91bmQgPSBbb3MucGF0aC5iYXNlbmFtZShsaW5lKSBmb3IgbGluZSBpbiBjb250ZW50LnNwbGl0bGluZXMoKV0KKyAgICAgICAgZXhwZWN0ZWQgPSBbX21ha2VfZXh0X25hbWUoJ3h4JyksCisgICAgICAgICAgICAgICAgICAgICdVTktOT1dOLTAuMC4wLXB5JXMuJXMuZWdnLWluZm8nICUgc3lzLnZlcnNpb25faW5mb1s6Ml1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm91bmQsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZGVidWdfbW9kZShzZWxmKToKKyAgICAgICAgIyB0aGlzIGNvdmVycyB0aGUgY29kZSBjYWxsZWQgd2hlbiBERUJVRyBpcyBzZXQKKyAgICAgICAgb2xkX2xvZ3NfbGVuID0gbGVuKHNlbGYubG9ncykKKyAgICAgICAgaW5zdGFsbF9tb2R1bGUuREVCVUcgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCk6CisgICAgICAgICAgICAgICAgc2VsZi50ZXN0X3JlY29yZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbnN0YWxsX21vZHVsZS5ERUJVRyA9IEZhbHNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5sb2dzKSA+IG9sZF9sb2dzX2xlbikKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoSW5zdGFsbFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM4YjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGM4YjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzU2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQpAQCAtMCwwICsxLDc3IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhLiIiIgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBnZXRwYXNzCisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhIGltcG9ydCBpbnN0YWxsX2RhdGEKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworY2xhc3MgSW5zdGFsbERhdGFUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5FbnZpcm9uR3VhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9ydW4oc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gaW5zdGFsbF9kYXRhKGRpc3QpCisgICAgICAgIGNtZC5pbnN0YWxsX2RpciA9IGluc3QgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2luc3QnKQorCisgICAgICAgICMgZGF0YV9maWxlcyBjYW4gY29udGFpbgorICAgICAgICAjICAtIHNpbXBsZSBmaWxlcworICAgICAgICAjICAtIGEgdHVwbGUgd2l0aCBhIHBhdGgsIGFuZCBhIGxpc3Qgb2YgZmlsZQorICAgICAgICBvbmUgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ29uZScpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShvbmUsICd4eHgnKQorICAgICAgICBpbnN0MiA9IG9zLnBhdGguam9pbihwa2dfZGlyLCAnaW5zdDInKQorICAgICAgICB0d28gPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ3R3bycpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSh0d28sICd4eHgnKQorCisgICAgICAgIGNtZC5kYXRhX2ZpbGVzID0gW29uZSwgKGluc3QyLCBbdHdvXSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmdldF9pbnB1dHMoKSwgW29uZSwgKGluc3QyLCBbdHdvXSldKQorCisgICAgICAgICMgbGV0J3MgcnVuIHRoZSBjb21tYW5kCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBsZXQncyBjaGVjayB0aGUgcmVzdWx0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMikKKyAgICAgICAgcnR3byA9IG9zLnBhdGguc3BsaXQodHdvKVstMV0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQorICAgICAgICByb25lID0gb3MucGF0aC5zcGxpdChvbmUpWy0xXQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgY21kLm91dGZpbGVzID0gW10KKworICAgICAgICAjIGxldCdzIHRyeSB3aXRoIHdhcm5fZGlyIG9uZQorICAgICAgICBjbWQud2Fybl9kaXIgPSAxCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBsZXQncyBjaGVjayB0aGUgcmVzdWx0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgY21kLm91dGZpbGVzID0gW10KKworICAgICAgICAjIG5vdyB1c2luZyByb290IGFuZCBlbXB0eSBkaXIKKyAgICAgICAgY21kLnJvb3QgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ3Jvb3QnKQorICAgICAgICBpbnN0MyA9IG9zLnBhdGguam9pbihjbWQuaW5zdGFsbF9kaXIsICdpbnN0MycpCisgICAgICAgIGluc3Q0ID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdpbnN0NCcpCisgICAgICAgIHRocmVlID0gb3MucGF0aC5qb2luKGNtZC5pbnN0YWxsX2RpciwgJ3RocmVlJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHRocmVlLCAneHgnKQorICAgICAgICBjbWQuZGF0YV9maWxlcyA9IFtvbmUsIChpbnN0MiwgW3R3b10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2luc3QzJywgW3RocmVlXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0NCwgW10pXQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbGV0J3MgY2hlY2sgdGhlIHJlc3VsdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjbWQuZ2V0X291dHB1dHMoKSksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW5zdDIsIHJ0d28pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0LCByb25lKSkpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShJbnN0YWxsRGF0YVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1YmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ1YmI1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzIyNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfaGVhZGVycy5weQpAQCAtMCwwICsxLDQxIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9oZWFkZXJzLiIiIgoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBnZXRwYXNzCisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9oZWFkZXJzIGltcG9ydCBpbnN0YWxsX2hlYWRlcnMKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworY2xhc3MgSW5zdGFsbEhlYWRlcnNUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5FbnZpcm9uR3VhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9ydW4oc2VsZik6CisgICAgICAgICMgd2UgaGF2ZSB0d28gaGVhZGVycworICAgICAgICBoZWFkZXJfbGlzdCA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGhlYWRlcjEgPSBvcy5wYXRoLmpvaW4oaGVhZGVyX2xpc3QsICdoZWFkZXIxJykKKyAgICAgICAgaGVhZGVyMiA9IG9zLnBhdGguam9pbihoZWFkZXJfbGlzdCwgJ2hlYWRlcjInKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoaGVhZGVyMSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGhlYWRlcjIpCisgICAgICAgIGhlYWRlcnMgPSBbaGVhZGVyMSwgaGVhZGVyMl0KKworICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdChoZWFkZXJzPWhlYWRlcnMpCisgICAgICAgIGNtZCA9IGluc3RhbGxfaGVhZGVycyhkaXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5nZXRfaW5wdXRzKCksIGhlYWRlcnMpCisKKyAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQKKyAgICAgICAgY21kLmluc3RhbGxfZGlyID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdpbnN0JykKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMikKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEluc3RhbGxIZWFkZXJzVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWY1ZjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9oZWFkZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWY1ZjBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2hlYWRlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkODYzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5CkBAIC0wLDAgKzEsMTA3IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9kYXRhLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2xpYiBpbXBvcnQgaW5zdGFsbF9saWIKK2Zyb20gZGlzdHV0aWxzLmV4dGVuc2lvbiBpbXBvcnQgRXh0ZW5zaW9uCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIEluc3RhbGxMaWJUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuTG9nZ2luZ1NpbGVuY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQuRW52aXJvbkd1YXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gaW5zdGFsbF9saWIoZGlzdCkKKworICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmNvbXBpbGUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLm9wdGltaXplLCAwKQorCisgICAgICAgICMgb3B0aW1pemUgbXVzdCBiZSAwLCAxLCBvciAyCisgICAgICAgIGNtZC5vcHRpbWl6ZSA9ICdmb28nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZmluYWxpemVfb3B0aW9ucykKKyAgICAgICAgY21kLm9wdGltaXplID0gJzQnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZmluYWxpemVfb3B0aW9ucykKKworICAgICAgICBjbWQub3B0aW1pemUgPSAnMicKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5vcHRpbWl6ZSwgMikKKworICAgIGRlZiBfc2V0dXBfYnl0ZV9jb21waWxlKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGluc3RhbGxfbGliKGRpc3QpCisgICAgICAgIGNtZC5jb21waWxlID0gY21kLm9wdGltaXplID0gMQorCisgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2Zvby5weScpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShmLCAnIyBweXRob24gZmlsZScpCisgICAgICAgIGNtZC5ieXRlX2NvbXBpbGUoW2ZdKQorICAgICAgICByZXR1cm4gcGtnX2RpcgorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZG9udF93cml0ZV9ieXRlY29kZSwgJ2J5dGUtY29tcGlsZSBub3QgZW5hYmxlZCcpCisgICAgZGVmIHRlc3RfYnl0ZV9jb21waWxlKHNlbGYpOgorICAgICAgICBwa2dfZGlyID0gc2VsZi5fc2V0dXBfYnl0ZV9jb21waWxlKCkKKyAgICAgICAgaWYgc3lzLmZsYWdzLm9wdGltaXplIDwgMToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2Zvby5weWMnKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28ucHlvJykpKQorCisgICAgZGVmIHRlc3RfZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHBrZ19kaXIsIGRpc3QgPSBzZWxmLmNyZWF0ZV9kaXN0KCkKKyAgICAgICAgY21kID0gaW5zdGFsbF9saWIoZGlzdCkKKworICAgICAgICAjIHNldHRpbmcgdXAgYSBkaXN0IGVudmlyb25tZW50CisgICAgICAgIGNtZC5jb21waWxlID0gY21kLm9wdGltaXplID0gMQorICAgICAgICBjbWQuaW5zdGFsbF9kaXIgPSBwa2dfZGlyCisgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4ocGtnX2RpciwgJ2Zvby5weScpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShmLCAnIyBweXRob24gZmlsZScpCisgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucHlfbW9kdWxlcyA9IFtwa2dfZGlyXQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLmV4dF9tb2R1bGVzID0gW0V4dGVuc2lvbignZm9vJywgWyd4eHgnXSldCisgICAgICAgIGNtZC5kaXN0cmlidXRpb24ucGFja2FnZXMgPSBbcGtnX2Rpcl0KKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5zY3JpcHRfbmFtZSA9ICdzZXR1cC5weScKKworICAgICAgICAjIGdldF9vdXRwdXQgc2hvdWxkIHJldHVybiA0IGVsZW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oY21kLmdldF9vdXRwdXRzKCkpID49IDIpCisKKyAgICBkZWYgdGVzdF9nZXRfaW5wdXRzKHNlbGYpOgorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGluc3RhbGxfbGliKGRpc3QpCisKKyAgICAgICAgIyBzZXR0aW5nIHVwIGEgZGlzdCBlbnZpcm9ubWVudAorICAgICAgICBjbWQuY29tcGlsZSA9IGNtZC5vcHRpbWl6ZSA9IDEKKyAgICAgICAgY21kLmluc3RhbGxfZGlyID0gcGtnX2RpcgorICAgICAgICBmID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28ucHknKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZiwgJyMgcHl0aG9uIGZpbGUnKQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnB5X21vZHVsZXMgPSBbcGtnX2Rpcl0KKyAgICAgICAgY21kLmRpc3RyaWJ1dGlvbi5leHRfbW9kdWxlcyA9IFtFeHRlbnNpb24oJ2ZvbycsIFsneHh4J10pXQorICAgICAgICBjbWQuZGlzdHJpYnV0aW9uLnBhY2thZ2VzID0gW3BrZ19kaXJdCisgICAgICAgIGNtZC5kaXN0cmlidXRpb24uc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCisKKyAgICAgICAgIyBnZXRfaW5wdXQgc2hvdWxkIHJldHVybiAyIGVsZW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfaW5wdXRzKCkpLCAyKQorCisgICAgZGVmIHRlc3RfZG9udF93cml0ZV9ieXRlY29kZShzZWxmKToKKyAgICAgICAgIyBtYWtlcyBzdXJlIGJ5dGVfY29tcGlsZSBpcyBub3QgdXNlZAorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCisgICAgICAgIGNtZCA9IGluc3RhbGxfbGliKGRpc3QpCisgICAgICAgIGNtZC5jb21waWxlID0gMQorICAgICAgICBjbWQub3B0aW1pemUgPSAxCisKKyAgICAgICAgb2xkX2RvbnRfd3JpdGVfYnl0ZWNvZGUgPSBzeXMuZG9udF93cml0ZV9ieXRlY29kZQorICAgICAgICBzeXMuZG9udF93cml0ZV9ieXRlY29kZSA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kLmJ5dGVfY29tcGlsZShbXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gb2xkX2RvbnRfd3JpdGVfYnl0ZWNvZGUKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkJyBpbiBzZWxmLmxvZ3NbMF1bMV0pCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShJbnN0YWxsTGliVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzZDgzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzZDgzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDYwODU0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5CkBAIC0wLDAgKzEsODIgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX3NjcmlwdHMuIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzIGltcG9ydCBpbnN0YWxsX3NjcmlwdHMKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgorCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKKworY2xhc3MgSW5zdGFsbFNjcmlwdHNUZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9zZXR0aW5ncyhzZWxmKToKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbImJ1aWxkIl0gPSBzdXBwb3J0LkR1bW15Q29tbWFuZCgKKyAgICAgICAgICAgIGJ1aWxkX3NjcmlwdHM9Ii9mb28vYmFyIikKKyAgICAgICAgZGlzdC5jb21tYW5kX29ialsiaW5zdGFsbCJdID0gc3VwcG9ydC5EdW1teUNvbW1hbmQoCisgICAgICAgICAgICBpbnN0YWxsX3NjcmlwdHM9Ii9zcGxhdC9mdW5rIiwKKyAgICAgICAgICAgIGZvcmNlPTEsCisgICAgICAgICAgICBza2lwX2J1aWxkPTEsCisgICAgICAgICAgICApCisgICAgICAgIGNtZCA9IGluc3RhbGxfc2NyaXB0cyhkaXN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNtZC5mb3JjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbWQuc2tpcF9idWlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5idWlsZF9kaXIgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5pbnN0YWxsX2RpciBpcyBOb25lKQorCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmZvcmNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLnNraXBfYnVpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX2RpciwgIi9mb28vYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuaW5zdGFsbF9kaXIsICIvc3BsYXQvZnVuayIpCisKKyAgICBkZWYgdGVzdF9pbnN0YWxsYXRpb24oc2VsZik6CisgICAgICAgIHNvdXJjZSA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGV4cGVjdGVkID0gW10KKworICAgICAgICBkZWYgd3JpdGVfc2NyaXB0KG5hbWUsIHRleHQpOgorICAgICAgICAgICAgZXhwZWN0ZWQuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc291cmNlLCBuYW1lKSwgInciKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYud3JpdGUodGV4dCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgd3JpdGVfc2NyaXB0KCJzY3JpcHQxLnB5IiwgKCIjISAvdXNyL2Jpbi9lbnYgcHl0aG9uMi4zXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIyBib2d1cyBzY3JpcHQgdy8gUHl0aG9uIHNoLWJhbmdcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXNzXG4iKSkKKyAgICAgICAgd3JpdGVfc2NyaXB0KCJzY3JpcHQyLnB5IiwgKCIjIS91c3IvYmluL3B5dGhvblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiMgYm9ndXMgc2NyaXB0IHcvIFB5dGhvbiBzaC1iYW5nXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc1xuIikpCisgICAgICAgIHdyaXRlX3NjcmlwdCgic2hlbGwuc2giLCAoIiMhL2Jpbi9zaFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjIGJvZ3VzIHNoZWxsIHNjcmlwdCB3LyBzaC1iYW5nXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4aXQgMFxuIikpCisKKyAgICAgICAgdGFyZ2V0ID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIGRpc3QuY29tbWFuZF9vYmpbImJ1aWxkIl0gPSBzdXBwb3J0LkR1bW15Q29tbWFuZChidWlsZF9zY3JpcHRzPXNvdXJjZSkKKyAgICAgICAgZGlzdC5jb21tYW5kX29ialsiaW5zdGFsbCJdID0gc3VwcG9ydC5EdW1teUNvbW1hbmQoCisgICAgICAgICAgICBpbnN0YWxsX3NjcmlwdHM9dGFyZ2V0LAorICAgICAgICAgICAgZm9yY2U9MSwKKyAgICAgICAgICAgIHNraXBfYnVpbGQ9MSwKKyAgICAgICAgICAgICkKKyAgICAgICAgY21kID0gaW5zdGFsbF9zY3JpcHRzKGRpc3QpCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgaW5zdGFsbGVkID0gb3MubGlzdGRpcih0YXJnZXQpCisgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gaW5zdGFsbGVkKQorCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShJbnN0YWxsU2NyaXB0c1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRiNWQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X21zdmM5Y29tcGlsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5NGExMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weQpAQCAtMCwwICsxLDE4NCBAQAorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5tc3ZjOWNvbXBpbGVyLiIiIgoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKKworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCitmcm9tIGRpc3R1dGlscy50ZXN0cyBpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKKyMgQSBtYW5pZmVzdCB3aXRoIHRoZSBvbmx5IGFzc2VtYmx5IHJlZmVyZW5jZSBiZWluZyB0aGUgbXN2Y3J0IGFzc2VtYmx5LCBzbworIyBzaG91bGQgaGF2ZSB0aGUgYXNzZW1ibHkgY29tcGxldGVseSBzdHJpcHBlZC4gIE5vdGUgdGhhdCBhbHRob3VnaCB0aGUKKyMgYXNzZW1ibHkgaGFzIGEgPHNlY3VyaXR5PiByZWZlcmVuY2UgdGhlIGFzc2VtYmx5IGlzIHJlbW92ZWQgLSB0aGF0IGlzCisjIGN1cnJlbnRseSBhICJmZWF0dXJlIiwgbm90IGEgYnVnIDopCitfTUFOSUZFU1RfV0lUSF9PTkxZX01TVkNfUkVGRVJFTkNFID0gIiIiXAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPGFzc2VtYmx5IHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MSIKKyAgICAgICAgICBtYW5pZmVzdFZlcnNpb249IjEuMCI+CisgIDx0cnVzdEluZm8geG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYzIj4KKyAgICA8c2VjdXJpdHk+CisgICAgICA8cmVxdWVzdGVkUHJpdmlsZWdlcz4KKyAgICAgICAgPHJlcXVlc3RlZEV4ZWN1dGlvbkxldmVsIGxldmVsPSJhc0ludm9rZXIiIHVpQWNjZXNzPSJmYWxzZSI+CisgICAgICAgIDwvcmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWw+CisgICAgICA8L3JlcXVlc3RlZFByaXZpbGVnZXM+CisgICAgPC9zZWN1cml0eT4KKyAgPC90cnVzdEluZm8+CisgIDxkZXBlbmRlbmN5PgorICAgIDxkZXBlbmRlbnRBc3NlbWJseT4KKyAgICAgIDxhc3NlbWJseUlkZW50aXR5IHR5cGU9IndpbjMyIiBuYW1lPSJNaWNyb3NvZnQuVkM5MC5DUlQiCisgICAgICAgICB2ZXJzaW9uPSI5LjAuMjEwMjIuOCIgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPSJ4ODYiCisgICAgICAgICBwdWJsaWNLZXlUb2tlbj0iWFhYWCI+CisgICAgICA8L2Fzc2VtYmx5SWRlbnRpdHk+CisgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgPC9kZXBlbmRlbmN5PgorPC9hc3NlbWJseT4KKyIiIgorCisjIEEgbWFuaWZlc3Qgd2l0aCByZWZlcmVuY2VzIHRvIGFzc2VtYmxpZXMgb3RoZXIgdGhhbiBtc3ZjcnQuICBXaGVuIHByb2Nlc3NlZCwKKyMgdGhpcyBhc3NlbWJseSBzaG91bGQgYmUgcmV0dXJuZWQgd2l0aCBqdXN0IHRoZSBtc3ZjcnQgcGFydCByZW1vdmVkLgorX01BTklGRVNUX1dJVEhfTVVMVElQTEVfUkVGRVJFTkNFUyA9ICIiIlwKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzxhc3NlbWJseSB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjEiCisgICAgICAgICAgbWFuaWZlc3RWZXJzaW9uPSIxLjAiPgorICA8dHJ1c3RJbmZvIHhtbG5zPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOmFzbS52MyI+CisgICAgPHNlY3VyaXR5PgorICAgICAgPHJlcXVlc3RlZFByaXZpbGVnZXM+CisgICAgICAgIDxyZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbCBsZXZlbD0iYXNJbnZva2VyIiB1aUFjY2Vzcz0iZmFsc2UiPgorICAgICAgICA8L3JlcXVlc3RlZEV4ZWN1dGlvbkxldmVsPgorICAgICAgPC9yZXF1ZXN0ZWRQcml2aWxlZ2VzPgorICAgIDwvc2VjdXJpdHk+CisgIDwvdHJ1c3RJbmZvPgorICA8ZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8YXNzZW1ibHlJZGVudGl0eSB0eXBlPSJ3aW4zMiIgbmFtZT0iTWljcm9zb2Z0LlZDOTAuQ1JUIgorICAgICAgICAgdmVyc2lvbj0iOS4wLjIxMDIyLjgiIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0ieDg2IgorICAgICAgICAgcHVibGljS2V5VG9rZW49IlhYWFgiPgorICAgICAgPC9hc3NlbWJseUlkZW50aXR5PgorICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgIDwvZGVwZW5kZW5jeT4KKyAgPGRlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVudEFzc2VtYmx5PgorICAgICAgPGFzc2VtYmx5SWRlbnRpdHkgdHlwZT0id2luMzIiIG5hbWU9Ik1pY3Jvc29mdC5WQzkwLk1GQyIKKyAgICAgICAgdmVyc2lvbj0iOS4wLjIxMDIyLjgiIHByb2Nlc3NvckFyY2hpdGVjdHVyZT0ieDg2IgorICAgICAgICBwdWJsaWNLZXlUb2tlbj0iWFhYWCI+PC9hc3NlbWJseUlkZW50aXR5PgorICAgIDwvZGVwZW5kZW50QXNzZW1ibHk+CisgIDwvZGVwZW5kZW5jeT4KKzwvYXNzZW1ibHk+CisiIiIKKworX0NMRUFORURfTUFOSUZFU1QgPSAiIiJcCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8YXNzZW1ibHkgeG1sbnM9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206YXNtLnYxIgorICAgICAgICAgIG1hbmlmZXN0VmVyc2lvbj0iMS4wIj4KKyAgPHRydXN0SW5mbyB4bWxucz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMiPgorICAgIDxzZWN1cml0eT4KKyAgICAgIDxyZXF1ZXN0ZWRQcml2aWxlZ2VzPgorICAgICAgICA8cmVxdWVzdGVkRXhlY3V0aW9uTGV2ZWwgbGV2ZWw9ImFzSW52b2tlciIgdWlBY2Nlc3M9ImZhbHNlIj4KKyAgICAgICAgPC9yZXF1ZXN0ZWRFeGVjdXRpb25MZXZlbD4KKyAgICAgIDwvcmVxdWVzdGVkUHJpdmlsZWdlcz4KKyAgICA8L3NlY3VyaXR5PgorICA8L3RydXN0SW5mbz4KKyAgPGRlcGVuZGVuY3k+CisKKyAgPC9kZXBlbmRlbmN5PgorICA8ZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW50QXNzZW1ibHk+CisgICAgICA8YXNzZW1ibHlJZGVudGl0eSB0eXBlPSJ3aW4zMiIgbmFtZT0iTWljcm9zb2Z0LlZDOTAuTUZDIgorICAgICAgICB2ZXJzaW9uPSI5LjAuMjEwMjIuOCIgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPSJ4ODYiCisgICAgICAgIHB1YmxpY0tleVRva2VuPSJYWFhYIj48L2Fzc2VtYmx5SWRlbnRpdHk+CisgICAgPC9kZXBlbmRlbnRBc3NlbWJseT4KKyAgPC9kZXBlbmRlbmN5PgorPC9hc3NlbWJseT4iIiIKKworaWYgc3lzLnBsYXRmb3JtPT0id2luMzIiOgorICAgIGZyb20gZGlzdHV0aWxzLm1zdmNjb21waWxlciBpbXBvcnQgZ2V0X2J1aWxkX3ZlcnNpb24KKyAgICBpZiBnZXRfYnVpbGRfdmVyc2lvbigpPj04LjA6CisgICAgICAgIFNLSVBfTUVTU0FHRSA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBTS0lQX01FU1NBR0UgPSAiVGhlc2UgdGVzdHMgYXJlIG9ubHkgZm9yIE1TVkM4LjAgb3IgYWJvdmUiCitlbHNlOgorICAgIFNLSVBfTUVTU0FHRSA9ICJUaGVzZSB0ZXN0cyBhcmUgb25seSBmb3Igd2luMzIiCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKFNLSVBfTUVTU0FHRSBpcyBOb25lLCBTS0lQX01FU1NBR0UpCitjbGFzcyBtc3ZjOWNvbXBpbGVyVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9ub19jb21waWxlcihzZWxmKToKKyAgICAgICAgIyBtYWtlcyBzdXJlIHF1ZXJ5X3ZjdmFyc2FsbCByYWlzZXMKKyAgICAgICAgIyBhIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IgaWYgdGhlIGNvbXBpbGVyCisgICAgICAgICMgaXMgbm90IGZvdW5kCisgICAgICAgIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIgaW1wb3J0IHF1ZXJ5X3ZjdmFyc2FsbAorICAgICAgICBkZWYgX2ZpbmRfdmN2YXJzYWxsKHZlcnNpb24pOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbXN2Yzljb21waWxlcgorICAgICAgICBvbGRfZmluZF92Y3ZhcnNhbGwgPSBtc3ZjOWNvbXBpbGVyLmZpbmRfdmN2YXJzYWxsCisgICAgICAgIG1zdmM5Y29tcGlsZXIuZmluZF92Y3ZhcnNhbGwgPSBfZmluZF92Y3ZhcnNhbGwKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzUGxhdGZvcm1FcnJvciwgcXVlcnlfdmN2YXJzYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd29udCBmaW5kIHRoaXMgdmVyc2lvbicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBtc3ZjOWNvbXBpbGVyLmZpbmRfdmN2YXJzYWxsID0gb2xkX2ZpbmRfdmN2YXJzYWxsCisKKyAgICBkZWYgdGVzdF9yZWdfY2xhc3Moc2VsZik6CisgICAgICAgIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIgaW1wb3J0IFJlZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgUmVnLmdldF92YWx1ZSwgJ3h4eCcsICd4eHgnKQorCisgICAgICAgICMgbG9va2luZyBmb3IgdmFsdWVzIHRoYXQgc2hvdWxkIGV4aXN0IG9uIGFsbAorICAgICAgICAjIHdpbmRvd3MgcmVnaXN0ZXJpZXMgdmVyc2lvbnMuCisgICAgICAgIHBhdGggPSByJ0NvbnRyb2wgUGFuZWxcRGVza3RvcCcKKyAgICAgICAgdiA9IFJlZy5nZXRfdmFsdWUocGF0aCwgdSdkcmFnZnVsbHdpbmRvd3MnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpbiAodScwJywgdScxJywgdScyJykpCisKKyAgICAgICAgaW1wb3J0IF93aW5yZWcKKyAgICAgICAgSEtDVSA9IF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIKKyAgICAgICAga2V5cyA9IFJlZy5yZWFkX2tleXMoSEtDVSwgJ3h4eHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIE5vbmUpCisKKyAgICAgICAga2V5cyA9IFJlZy5yZWFkX2tleXMoSEtDVSwgcidDb250cm9sIFBhbmVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdEZXNrdG9wJyBpbiBrZXlzKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX3Zpc3VhbF9jX3JlZihzZWxmKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMubXN2Yzljb21waWxlciBpbXBvcnQgTVNWQ0NvbXBpbGVyCisgICAgICAgIHRlbXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBtYW5pZmVzdCA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCAnbWFuaWZlc3QnKQorICAgICAgICBmID0gb3BlbihtYW5pZmVzdCwgJ3cnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKF9NQU5JRkVTVF9XSVRIX01VTFRJUExFX1JFRkVSRU5DRVMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBjb21waWxlciA9IE1TVkNDb21waWxlcigpCisgICAgICAgIGNvbXBpbGVyLl9yZW1vdmVfdmlzdWFsX2NfcmVmKG1hbmlmZXN0KQorCisgICAgICAgICMgc2VlIHdoYXQgd2UgZ290CisgICAgICAgIGYgPSBvcGVuKG1hbmlmZXN0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHJlbW92aW5nIHRyYWlsaW5nIHNwYWNlcworICAgICAgICAgICAgY29udGVudCA9ICdcbicuam9pbihbbGluZS5yc3RyaXAoKSBmb3IgbGluZSBpbiBmLnJlYWRsaW5lcygpXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgbWFrZXMgc3VyZSB0aGUgbWFuaWZlc3Qgd2FzIHByb3Blcmx5IGNsZWFuZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50LCBfQ0xFQU5FRF9NQU5JRkVTVCkKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9lbnRpcmVfbWFuaWZlc3Qoc2VsZik6CisgICAgICAgIGZyb20gZGlzdHV0aWxzLm1zdmM5Y29tcGlsZXIgaW1wb3J0IE1TVkNDb21waWxlcgorICAgICAgICB0ZW1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgbWFuaWZlc3QgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgJ21hbmlmZXN0JykKKyAgICAgICAgZiA9IG9wZW4obWFuaWZlc3QsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShfTUFOSUZFU1RfV0lUSF9PTkxZX01TVkNfUkVGRVJFTkNFKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgY29tcGlsZXIgPSBNU1ZDQ29tcGlsZXIoKQorICAgICAgICBnb3QgPSBjb21waWxlci5fcmVtb3ZlX3Zpc3VhbF9jX3JlZihtYW5pZmVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhnb3QsIE5vbmUpCisKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKG1zdmM5Y29tcGlsZXJUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3YTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE3YTY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9yZWdpc3Rlci5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzNGIxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkKQEAgLTAsMCArMSwyOTAgQEAKKyMgLSotIGVuY29kaW5nOiB1dGY4IC0qLQorIiIiVGVzdHMgZm9yIGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQgdXJsbGliMgoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGNoZWNrX3dhcm5pbmdzLCBydW5fdW5pdHRlc3QKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZCBpbXBvcnQgcmVnaXN0ZXIgYXMgcmVnaXN0ZXJfbW9kdWxlCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyIGltcG9ydCByZWdpc3RlcgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCisKK2Zyb20gZGlzdHV0aWxzLnRlc3RzLnRlc3RfY29uZmlnIGltcG9ydCBQeVBJUkNDb21tYW5kVGVzdENhc2UKKwordHJ5OgorICAgIGltcG9ydCBkb2N1dGlscworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRvY3V0aWxzID0gTm9uZQorCitQWVBJUkNfTk9QQVNTV09SRCA9ICIiIlwKK1tkaXN0dXRpbHNdCisKK2luZGV4LXNlcnZlcnMgPQorICAgIHNlcnZlcjEKKworW3NlcnZlcjFdCit1c2VybmFtZTptZQorIiIiCisKK1dBTlRFRF9QWVBJUkMgPSAiIiJcCitbZGlzdHV0aWxzXQoraW5kZXgtc2VydmVycyA9CisgICAgcHlwaQorCitbcHlwaV0KK3VzZXJuYW1lOnRhcmVrCitwYXNzd29yZDpwYXNzd29yZAorIiIiCisKK2NsYXNzIFJhd0lucHV0cyhvYmplY3QpOgorICAgICIiIkZha2VzIHVzZXIgaW5wdXRzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYW5zd2Vycyk6CisgICAgICAgIHNlbGYuYW5zd2VycyA9IGFuc3dlcnMKKyAgICAgICAgc2VsZi5pbmRleCA9IDAKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwcm9tcHQ9JycpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hbnN3ZXJzW3NlbGYuaW5kZXhdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmluZGV4ICs9IDEKKworY2xhc3MgRmFrZU9wZW5lcihvYmplY3QpOgorICAgICIiIkZha2VzIGEgUHlQSSBzZXJ2ZXIiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucmVxcyA9IFtdCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG9wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgc2VsZi5yZXFzLmFwcGVuZChyZXEpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgcmV0dXJuICd4eHgnCisKK2NsYXNzIFJlZ2lzdGVyVGVzdENhc2UoUHlQSVJDQ29tbWFuZFRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoUmVnaXN0ZXJUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICAjIHBhdGNoaW5nIHRoZSBwYXNzd29yZCBwcm9tcHQKKyAgICAgICAgc2VsZi5fb2xkX2dldHBhc3MgPSBnZXRwYXNzLmdldHBhc3MKKyAgICAgICAgZGVmIF9nZXRwYXNzKHByb21wdCk6CisgICAgICAgICAgICByZXR1cm4gJ3Bhc3N3b3JkJworICAgICAgICBnZXRwYXNzLmdldHBhc3MgPSBfZ2V0cGFzcworICAgICAgICBzZWxmLm9sZF9vcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcgorICAgICAgICBzZWxmLmNvbm4gPSB1cmxsaWIyLmJ1aWxkX29wZW5lciA9IEZha2VPcGVuZXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBnZXRwYXNzLmdldHBhc3MgPSBzZWxmLl9vbGRfZ2V0cGFzcworICAgICAgICB1cmxsaWIyLmJ1aWxkX29wZW5lciA9IHNlbGYub2xkX29wZW5lcgorICAgICAgICBzdXBlcihSZWdpc3RlclRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgX2dldF9jbWQoc2VsZiwgbWV0YWRhdGE9Tm9uZSk6CisgICAgICAgIGlmIG1ldGFkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICBtZXRhZGF0YSA9IHsndXJsJzogJ3h4eCcsICdhdXRob3InOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3h4eCcsICd2ZXJzaW9uJzogJ3h4eCd9CisgICAgICAgIHBrZ19pbmZvLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgqKm1ldGFkYXRhKQorICAgICAgICByZXR1cm4gcmVnaXN0ZXIoZGlzdCkKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9weXBpcmMoc2VsZik6CisgICAgICAgICMgdGhpcyB0ZXN0IG1ha2VzIHN1cmUgYSAucHlwaXJjIGZpbGUKKyAgICAgICAgIyBpcyBjcmVhdGVkIHdoZW4gcmVxdWVzdGVkLgorCisgICAgICAgICMgbGV0J3MgY3JlYXRlIGEgcmVnaXN0ZXIgaW5zdGFuY2UKKyAgICAgICAgY21kID0gc2VsZi5fZ2V0X2NtZCgpCisKKyAgICAgICAgIyB3ZSBzaG91bGRuJ3QgaGF2ZSBhIC5weXBpcmMgZmlsZSB5ZXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnJjKSkKKworICAgICAgICAjIHBhdGNoaW5nIHJhd19pbnB1dCBhbmQgZ2V0cGFzcy5nZXRwYXNzCisgICAgICAgICMgc28gcmVnaXN0ZXIgZ2V0cyBoYXBweQorICAgICAgICAjCisgICAgICAgICMgSGVyZSdzIHdoYXQgd2UgYXJlIGZha2luZyA6CisgICAgICAgICMgdXNlIHlvdXIgZXhpc3RpbmcgbG9naW4gKGNob2ljZSAxLikKKyAgICAgICAgIyBVc2VybmFtZSA6ICd0YXJlaycKKyAgICAgICAgIyBQYXNzd29yZCA6ICdwYXNzd29yZCcKKyAgICAgICAgIyBTYXZlIHlvdXIgbG9naW4gKHkvTik/IDogJ3knCisgICAgICAgIGlucHV0cyA9IFJhd0lucHV0cygnMScsICd0YXJlaycsICd5JykKKyAgICAgICAgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dCA9IGlucHV0cy5fX2NhbGxfXworICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0CisKKyAgICAgICAgIyB3ZSBzaG91bGQgaGF2ZSBhIGJyYW5kIG5ldyAucHlwaXJjIGZpbGUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYucmMpKQorCisgICAgICAgICMgd2l0aCB0aGUgY29udGVudCBzaW1pbGFyIHRvIFdBTlRFRF9QWVBJUkMKKyAgICAgICAgZiA9IG9wZW4oc2VsZi5yYykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnQsIFdBTlRFRF9QWVBJUkMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIG5vdyBsZXQncyBtYWtlIHN1cmUgdGhlIC5weXBpcmMgZmlsZSBnZW5lcmF0ZWQKKyAgICAgICAgIyByZWFsbHkgd29ya3MgOiB3ZSBzaG91bGRuJ3QgYmUgYXNrZWQgYW55dGhpbmcKKyAgICAgICAgIyBpZiB3ZSBydW4gdGhlIGNvbW1hbmQgYWdhaW4KKyAgICAgICAgZGVmIF9ub193YXkocHJvbXB0PScnKToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKHByb21wdCkKKyAgICAgICAgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dCA9IF9ub193YXkKKworICAgICAgICBjbWQuc2hvd19yZXNwb25zZSA9IDEKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBsZXQncyBzZWUgd2hhdCB0aGUgc2VydmVyIHJlY2VpdmVkIDogd2Ugc2hvdWxkCisgICAgICAgICMgaGF2ZSAyIHNpbWlsYXIgcmVxdWVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5jb25uLnJlcXMpLCAyKQorICAgICAgICByZXExID0gZGljdChzZWxmLmNvbm4ucmVxc1swXS5oZWFkZXJzKQorICAgICAgICByZXEyID0gZGljdChzZWxmLmNvbm4ucmVxc1sxXS5oZWFkZXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcTJbJ0NvbnRlbnQtbGVuZ3RoJ10sIHJlcTFbJ0NvbnRlbnQtbGVuZ3RoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgneHh4JyBpbiBzZWxmLmNvbm4ucmVxc1sxXS5kYXRhKQorCisgICAgZGVmIHRlc3RfcGFzc3dvcmRfbm90X2luX2ZpbGUoc2VsZik6CisKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHNlbGYucmMsIFBZUElSQ19OT1BBU1NXT1JEKQorICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKCkKKyAgICAgICAgY21kLl9zZXRfY29uZmlnKCkKKyAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQorICAgICAgICBjbWQuc2VuZF9tZXRhZGF0YSgpCisKKyAgICAgICAgIyBkaXN0LnBhc3N3b3JkIHNob3VsZCBiZSBzZXQKKyAgICAgICAgIyB0aGVyZWZvcmUgdXNlZCBhZnRlcndhcmRzIGJ5IG90aGVyIGNvbW1hbmRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmRpc3RyaWJ1dGlvbi5wYXNzd29yZCwgJ3Bhc3N3b3JkJykKKworICAgIGRlZiB0ZXN0X3JlZ2lzdGVyaW5nKHNlbGYpOgorICAgICAgICAjIHRoaXMgdGVzdCBydW5zIGNob2ljZSAyCisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQoKQorICAgICAgICBpbnB1dHMgPSBSYXdJbnB1dHMoJzInLCAndGFyZWsnLCAndGFyZWtAemlhZGUub3JnJykKKyAgICAgICAgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dCA9IGlucHV0cy5fX2NhbGxfXworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZAorICAgICAgICAgICAgY21kLnJ1bigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dAorCisgICAgICAgICMgd2Ugc2hvdWxkIGhhdmUgc2VuZCBhIHJlcXVlc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5jb25uLnJlcXMpLCAxKQorICAgICAgICByZXEgPSBzZWxmLmNvbm4ucmVxc1swXQorICAgICAgICBoZWFkZXJzID0gZGljdChyZXEuaGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWydDb250ZW50LWxlbmd0aCddLCAnNjA4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd0YXJlaycgaW4gcmVxLmRhdGEpCisKKyAgICBkZWYgdGVzdF9wYXNzd29yZF9yZXNldChzZWxmKToKKyAgICAgICAgIyB0aGlzIHRlc3QgcnVucyBjaG9pY2UgMworICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKCkKKyAgICAgICAgaW5wdXRzID0gUmF3SW5wdXRzKCczJywgJ3RhcmVrQHppYWRlLm9yZycpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBpbnB1dHMuX19jYWxsX18KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQKKyAgICAgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKKworICAgICAgICAjIHdlIHNob3VsZCBoYXZlIHNlbmQgYSByZXF1ZXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuY29ubi5yZXFzKSwgMSkKKyAgICAgICAgcmVxID0gc2VsZi5jb25uLnJlcXNbMF0KKyAgICAgICAgaGVhZGVycyA9IGRpY3QocmVxLmhlYWRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzI5MCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndGFyZWsnIGluIHJlcS5kYXRhKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZG9jdXRpbHMgaXMgbm90IE5vbmUsICduZWVkcyBkb2N1dGlscycpCisgICAgZGVmIHRlc3Rfc3RyaWN0KHNlbGYpOgorICAgICAgICAjIHRlc3RpbmcgdGhlIHNjcmlwdCBvcHRpb24KKyAgICAgICAgIyB3aGVuIG9uLCB0aGUgcmVnaXN0ZXIgY29tbWFuZCBzdG9wcyBpZgorICAgICAgICAjIHRoZSBtZXRhZGF0YSBpcyBpbmNvbXBsZXRlIG9yIGlmCisgICAgICAgICMgbG9uZ19kZXNjcmlwdGlvbiBpcyBub3QgcmVTdCBjb21wbGlhbnQKKworICAgICAgICAjIGVtcHR5IG1ldGFkYXRhCisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQoe30pCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnN0cmljdCA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLnJ1bikKKworICAgICAgICAjIG1ldGFkYXRhIGFyZSBPSyBidXQgbG9uZ19kZXNjcmlwdGlvbiBpcyBicm9rZW4KKyAgICAgICAgbWV0YWRhdGEgPSB7J3VybCc6ICd4eHgnLCAnYXV0aG9yJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdhdXRob3JfZW1haWwnOiB1J8OpeMOpeMOpJywKKyAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiAneHh4JywgJ3ZlcnNpb24nOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgJ2xvbmdfZGVzY3JpcHRpb24nOiAndGl0bGVcbj09XG5cbnRleHQnfQorCisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQobWV0YWRhdGEpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnN0cmljdCA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwgY21kLnJ1bikKKworICAgICAgICAjIG5vdyBzb21ldGhpbmcgdGhhdCB3b3JrcworICAgICAgICBtZXRhZGF0YVsnbG9uZ19kZXNjcmlwdGlvbiddID0gJ3RpdGxlXG49PT09PVxuXG50ZXh0JworICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKG1ldGFkYXRhKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5zdHJpY3QgPSAxCisgICAgICAgIGlucHV0cyA9IFJhd0lucHV0cygnMScsICd0YXJlaycsICd5JykKKyAgICAgICAgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dCA9IGlucHV0cy5fX2NhbGxfXworICAgICAgICAjIGxldCdzIHJ1biB0aGUgY29tbWFuZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0CisKKyAgICAgICAgIyBzdHJpY3QgaXMgbm90IGJ5IGRlZmF1bHQKKyAgICAgICAgY21kID0gc2VsZi5fZ2V0X2NtZCgpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgaW5wdXRzID0gUmF3SW5wdXRzKCcxJywgJ3RhcmVrJywgJ3knKQorICAgICAgICByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0ID0gaW5wdXRzLl9fY2FsbF9fCisgICAgICAgICMgbGV0J3MgcnVuIHRoZSBjb21tYW5kCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNtZC5ydW4oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKKworICAgICAgICAjIGFuZCBmaW5hbGx5IGEgVW5pY29kZSB0ZXN0IChidWcgIzEyMTE0KQorICAgICAgICBtZXRhZGF0YSA9IHsndXJsJzogdSd4eHgnLCAnYXV0aG9yJzogdSdcdTAwYzlyaWMnLAorICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogdSd4eHgnLCB1J25hbWUnOiAneHh4JywKKyAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb24nOiB1J3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHUnU29tZXRoaW5nIGFib3V0IGVzc3pldCBcdTAwZGYnLAorICAgICAgICAgICAgICAgICAgICAnbG9uZ19kZXNjcmlwdGlvbic6IHUnTW9yZSB0aGluZ3MgYWJvdXQgZXNzemV0IFx1MDBkZid9CisKKyAgICAgICAgY21kID0gc2VsZi5fZ2V0X2NtZChtZXRhZGF0YSkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQuc3RyaWN0ID0gMQorICAgICAgICBpbnB1dHMgPSBSYXdJbnB1dHMoJzEnLCAndGFyZWsnLCAneScpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBpbnB1dHMuX19jYWxsX18KKyAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kLnJ1bigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgcmVnaXN0ZXJfbW9kdWxlLnJhd19pbnB1dAorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZG9jdXRpbHMgaXMgbm90IE5vbmUsICduZWVkcyBkb2N1dGlscycpCisgICAgZGVmIHRlc3RfcmVnaXN0ZXJfaW52YWxpZF9sb25nX2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICBkZXNjcmlwdGlvbiA9ICc6ZnVua2llOmBzdHJgJyAgIyBtaW1pYyBTcGhpbngtc3BlY2lmaWMgbWFya3VwCisgICAgICAgIG1ldGFkYXRhID0geyd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAnYXV0aG9yX2VtYWlsJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICduYW1lJzogJ3h4eCcsICd2ZXJzaW9uJzogJ3h4eCcsCisgICAgICAgICAgICAgICAgICAgICdsb25nX2Rlc2NyaXB0aW9uJzogZGVzY3JpcHRpb259CisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQobWV0YWRhdGEpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnN0cmljdCA9IFRydWUKKyAgICAgICAgaW5wdXRzID0gUmF3SW5wdXRzKCcyJywgJ3RhcmVrJywgJ3RhcmVrQHppYWRlLm9yZycpCisgICAgICAgIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQgPSBpbnB1dHMKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGRlbGF0dHIsIHJlZ2lzdGVyX21vZHVsZSwgJ3Jhd19pbnB1dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsIGNtZC5ydW4pCisKKyAgICBkZWYgdGVzdF9jaGVja19tZXRhZGF0YV9kZXByZWNhdGVkKHNlbGYpOgorICAgICAgICAjIG1ha2VzIHN1cmUgbWFrZV9tZXRhZGF0YSBpcyBkZXByZWNhdGVkCisgICAgICAgIGNtZCA9IHNlbGYuX2dldF9jbWQoKQorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgIGNtZC5jaGVja19tZXRhZGF0YSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3Lndhcm5pbmdzKSwgMSkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKFJlZ2lzdGVyVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9yZWdpc3Rlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMmMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9yZWdpc3Rlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwMmMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc2Rpc3QucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2Q5OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5CkBAIC0wLDAgKzEsNTEyIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QuIiIiCitpbXBvcnQgb3MKK2ltcG9ydCB0YXJmaWxlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IHppcGZpbGUKK2Zyb20gb3MucGF0aCBpbXBvcnQgam9pbgorZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZGVkZW50Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIGNoZWNrX3dhcm5pbmdzLCBydW5fdW5pdHRlc3QKKworIyB6bGliIGlzIG5vdCB1c2VkIGhlcmUsIGJ1dCBpZiBpdCdzIG5vdCBhdmFpbGFibGUKKyMgdGhlIHRlc3RzIHRoYXQgdXNlIHppcGZpbGUgbWF5IGZhaWwKK3RyeToKKyAgICBpbXBvcnQgemxpYgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHpsaWIgPSBOb25lCisKK3RyeToKKyAgICBpbXBvcnQgZ3JwCisgICAgaW1wb3J0IHB3ZAorICAgIFVJRF9HSURfU1VQUE9SVCA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBVSURfR0lEX1NVUFBPUlQgPSBGYWxzZQorCisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHNkaXN0LCBzaG93X2Zvcm1hdHMKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IERpc3RyaWJ1dGlvbgorZnJvbSBkaXN0dXRpbHMudGVzdHMudGVzdF9jb25maWcgaW1wb3J0IFB5UElSQ0NvbW1hbmRUZXN0Q2FzZQorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IGZpbmRfZXhlY3V0YWJsZQorZnJvbSBkaXN0dXRpbHMubG9nIGltcG9ydCBXQVJOCitmcm9tIGRpc3R1dGlscy5maWxlbGlzdCBpbXBvcnQgRmlsZUxpc3QKK2Zyb20gZGlzdHV0aWxzLmFyY2hpdmVfdXRpbCBpbXBvcnQgQVJDSElWRV9GT1JNQVRTCisKK1NFVFVQX1BZID0gIiIiCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAoraW1wb3J0IHNvbWVjb2RlCisKK3NldHVwKG5hbWU9J2Zha2UnKQorIiIiCisKK01BTklGRVNUID0gIiIiXAorIyBmaWxlIEdFTkVSQVRFRCBieSBkaXN0dXRpbHMsIGRvIE5PVCBlZGl0CitSRUFETUUKK2J1aWxkb3V0LmNmZworaW5yb290LnR4dAorc2V0dXAucHkKK2RhdGElKHNlcClzZGF0YS5kdAorc2NyaXB0cyUoc2VwKXNzY3JpcHQucHkKK3NvbWUlKHNlcClzZmlsZS50eHQKK3NvbWUlKHNlcClzb3RoZXJfZmlsZS50eHQKK3NvbWVjb2RlJShzZXApc19faW5pdF9fLnB5Citzb21lY29kZSUoc2VwKXNkb2MuZGF0Citzb21lY29kZSUoc2VwKXNkb2MudHh0CisiIiIKKworY2xhc3MgU0Rpc3RUZXN0Q2FzZShQeVBJUkNDb21tYW5kVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIFB5UElSQ0NvbW1hbmRUZXN0Q2FzZSBjcmVhdGVzIGEgdGVtcCBkaXIgYWxyZWFkeQorICAgICAgICAjIGFuZCBwdXQgaXQgaW4gc2VsZi50bXBfZGlyCisgICAgICAgIHN1cGVyKFNEaXN0VGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgIyBzZXR0aW5nIHVwIGFuIGVudmlyb25tZW50CisgICAgICAgIHNlbGYub2xkX3BhdGggPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5ta2Rpcihqb2luKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJykpCisgICAgICAgIG9zLm1rZGlyKGpvaW4oc2VsZi50bXBfZGlyLCAnZGlzdCcpKQorICAgICAgICAjIGEgcGFja2FnZSwgYW5kIGEgUkVBRE1FCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnUkVBRE1FJyksICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJ19faW5pdF9fLnB5JyksICcjJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzZXR1cC5weScpLCBTRVRVUF9QWSkKKyAgICAgICAgb3MuY2hkaXIoc2VsZi50bXBfZGlyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIGJhY2sgdG8gbm9ybWFsCisgICAgICAgIG9zLmNoZGlyKHNlbGYub2xkX3BhdGgpCisgICAgICAgIHN1cGVyKFNEaXN0VGVzdENhc2UsIHNlbGYpLnRlYXJEb3duKCkKKworICAgIGRlZiBnZXRfY21kKHNlbGYsIG1ldGFkYXRhPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIGEgY21kIiIiCisgICAgICAgIGlmIG1ldGFkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICBtZXRhZGF0YSA9IHsnbmFtZSc6ICdmYWtlJywgJ3ZlcnNpb24nOiAnMS4wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICd1cmwnOiAneHh4JywgJ2F1dGhvcic6ICd4eHgnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dGhvcl9lbWFpbCc6ICd4eHgnfQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKG1ldGFkYXRhKQorICAgICAgICBkaXN0LnNjcmlwdF9uYW1lID0gJ3NldHVwLnB5JworICAgICAgICBkaXN0LnBhY2thZ2VzID0gWydzb21lY29kZSddCisgICAgICAgIGRpc3QuaW5jbHVkZV9wYWNrYWdlX2RhdGEgPSBUcnVlCisgICAgICAgIGNtZCA9IHNkaXN0KGRpc3QpCisgICAgICAgIGNtZC5kaXN0X2RpciA9ICdkaXN0JworICAgICAgICByZXR1cm4gZGlzdCwgY21kCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfcHJ1bmVfZmlsZV9saXN0KHNlbGYpOgorICAgICAgICAjIHRoaXMgdGVzdCBjcmVhdGVzIGEgcHJvamVjdCB3aXRoIHNvbWUgVkNTIGRpcnMgYW5kIGFuIE5GUyByZW5hbWUKKyAgICAgICAgIyBmaWxlLCB0aGVuIGxhdW5jaGVzIHNkaXN0IHRvIGNoZWNrIHRoZXkgZ2V0IHBydW5lZCBvbiBhbGwgc3lzdGVtcworCisgICAgICAgICMgY3JlYXRpbmcgVkNTIGRpcmVjdG9yaWVzIHdpdGggc29tZSBmaWxlcyBpbiB0aGVtCisgICAgICAgIG9zLm1rZGlyKGpvaW4oc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnLnN2bicpKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJy5zdm4nLCAnb2sucHknKSwgJ3h4eCcpCisKKyAgICAgICAgb3MubWtkaXIoam9pbihzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICcuaGcnKSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICcuaGcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICdvaycpLCAneHh4JykKKworICAgICAgICBvcy5ta2Rpcihqb2luKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJy5naXQnKSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICcuZ2l0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnb2snKSwgJ3h4eCcpCisKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICcubmZzMDAwMScpLCAneHh4JykKKworICAgICAgICAjIG5vdyBidWlsZGluZyBhIHNkaXN0CisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisKKyAgICAgICAgIyB6aXAgaXMgYXZhaWxhYmxlIHVuaXZlcnNhbGx5CisgICAgICAgICMgKHRhciBtaWdodCBub3QgYmUgaW5zdGFsbGVkIHVuZGVyIHdpbjMyKQorICAgICAgICBjbWQuZm9ybWF0cyA9IFsnemlwJ10KKworICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbm93IGxldCdzIGNoZWNrIHdoYXQgd2UgaGF2ZQorICAgICAgICBkaXN0X2ZvbGRlciA9IGpvaW4oc2VsZi50bXBfZGlyLCAnZGlzdCcpCisgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihkaXN0X2ZvbGRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlcywgWydmYWtlLTEuMC56aXAnXSkKKworICAgICAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZShqb2luKGRpc3RfZm9sZGVyLCAnZmFrZS0xLjAuemlwJykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRlbnQgPSB6aXBfZmlsZS5uYW1lbGlzdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB6aXBfZmlsZS5jbG9zZSgpCisKKyAgICAgICAgIyBtYWtpbmcgc3VyZSBldmVyeXRoaW5nIGhhcyBiZWVuIHBydW5lZCBjb3JyZWN0bHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29udGVudCksIDQpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFrZV9kaXN0cmlidXRpb24oc2VsZik6CisKKyAgICAgICAgIyBjaGVjayBpZiB0YXIgYW5kIGd6aXAgYXJlIGluc3RhbGxlZAorICAgICAgICBpZiAoZmluZF9leGVjdXRhYmxlKCd0YXInKSBpcyBOb25lIG9yCisgICAgICAgICAgICBmaW5kX2V4ZWN1dGFibGUoJ2d6aXAnKSBpcyBOb25lKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgbm93IGJ1aWxkaW5nIGEgc2Rpc3QKKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKKworICAgICAgICAjIGNyZWF0aW5nIGEgZ3p0YXIgdGhlbiBhIHRhcgorICAgICAgICBjbWQuZm9ybWF0cyA9IFsnZ3p0YXInLCAndGFyJ10KKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIG1ha2luZyBzdXJlIHdlIGhhdmUgdHdvIGZpbGVzCisgICAgICAgIGRpc3RfZm9sZGVyID0gam9pbihzZWxmLnRtcF9kaXIsICdkaXN0JykKKyAgICAgICAgcmVzdWx0ID0gb3MubGlzdGRpcihkaXN0X2ZvbGRlcikKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWydmYWtlLTEuMC50YXInLCAnZmFrZS0xLjAudGFyLmd6J10pCisKKyAgICAgICAgb3MucmVtb3ZlKGpvaW4oZGlzdF9mb2xkZXIsICdmYWtlLTEuMC50YXInKSkKKyAgICAgICAgb3MucmVtb3ZlKGpvaW4oZGlzdF9mb2xkZXIsICdmYWtlLTEuMC50YXIuZ3onKSkKKworICAgICAgICAjIG5vdyB0cnlpbmcgYSB0YXIgdGhlbiBhIGd6dGFyCisgICAgICAgIGNtZC5mb3JtYXRzID0gWyd0YXInLCAnZ3p0YXInXQorCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgcmVzdWx0ID0gb3MubGlzdGRpcihkaXN0X2ZvbGRlcikKKyAgICAgICAgcmVzdWx0LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWydmYWtlLTEuMC50YXInLCAnZmFrZS0xLjAudGFyLmd6J10pCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfdW5pY29kZV9tZXRhZGF0YV90Z3ooc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBVbmljb2RlIG5hbWUgb3IgdmVyc2lvbiBzaG91bGQgbm90IGJyZWFrIGJ1aWxkaW5nIHRvIHRhci5neiBmb3JtYXQuCisgICAgICAgIFJlZmVyZW5jZSBpc3N1ZSAjMTE2MzguCisgICAgICAgICIiIgorCisgICAgICAgICMgY3JlYXRlIHRoZSBzZGlzdCBjb21tYW5kIHdpdGggdW5pY29kZSBwYXJhbWV0ZXJzCisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCh7J25hbWUnOiB1J2Zha2UnLCAndmVyc2lvbic6IHUnMS4wJ30pCisKKyAgICAgICAgIyBjcmVhdGUgdGhlIHNkaXN0IGFzIGd6dGFyIGFuZCBydW4gdGhlIGNvbW1hbmQKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ2d6dGFyJ10KKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIFRoZSBjb21tYW5kIHNob3VsZCBoYXZlIGNyZWF0ZWQgdGhlIC50YXIuZ3ogZmlsZQorICAgICAgICBkaXN0X2ZvbGRlciA9IGpvaW4oc2VsZi50bXBfZGlyLCAnZGlzdCcpCisgICAgICAgIHJlc3VsdCA9IG9zLmxpc3RkaXIoZGlzdF9mb2xkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbJ2Zha2UtMS4wLnRhci5neiddKQorCisgICAgICAgIG9zLnJlbW92ZShqb2luKGRpc3RfZm9sZGVyLCAnZmFrZS0xLjAudGFyLmd6JykpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfYWRkX2RlZmF1bHRzKHNlbGYpOgorCisgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIyNzkKKworICAgICAgICAjIGFkZF9kZWZhdWx0IHNob3VsZCBhbHNvIGluY2x1ZGUKKyAgICAgICAgIyBkYXRhX2ZpbGVzIGFuZCBwYWNrYWdlX2RhdGEKKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKKworICAgICAgICAjIGZpbGxpbmcgZGF0YV9maWxlcyBieSBwb2ludGluZyBmaWxlcworICAgICAgICAjIGluIHBhY2thZ2VfZGF0YQorICAgICAgICBkaXN0LnBhY2thZ2VfZGF0YSA9IHsnJzogWycqLmNmZycsICcqLmRhdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZWNvZGUnOiBbJyoudHh0J119CisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnZG9jLnR4dCcpLCAnIycpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnc29tZWNvZGUnLCAnZG9jLmRhdCcpLCAnIycpCisKKyAgICAgICAgIyBhZGRpbmcgc29tZSBkYXRhIGluIGRhdGFfZmlsZXMKKyAgICAgICAgZGF0YV9kaXIgPSBqb2luKHNlbGYudG1wX2RpciwgJ2RhdGEnKQorICAgICAgICBvcy5ta2RpcihkYXRhX2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChkYXRhX2RpciwgJ2RhdGEuZHQnKSwgJyMnKQorICAgICAgICBzb21lX2RpciA9IGpvaW4oc2VsZi50bXBfZGlyLCAnc29tZScpCisgICAgICAgIG9zLm1rZGlyKHNvbWVfZGlyKQorICAgICAgICAjIG1ha2Ugc3VyZSBWQ1MgZGlyZWN0b3JpZXMgYXJlIHBydW5lZCAoIzE0MDA0KQorICAgICAgICBoZ19kaXIgPSBqb2luKHNlbGYudG1wX2RpciwgJy5oZycpCisgICAgICAgIG9zLm1rZGlyKGhnX2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChoZ19kaXIsICdsYXN0LW1lc3NhZ2UudHh0JyksICcjJykKKyAgICAgICAgIyBhIGJ1Z2d5IHJlZ2V4IHVzZWQgdG8gcHJldmVudCB0aGlzIGZyb20gd29ya2luZyBvbiB3aW5kb3dzICgjNjg4NCkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdidWlsZG91dC5jZmcnKSwgJyMnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ2lucm9vdC50eHQnKSwgJyMnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNvbWVfZGlyLCAnZmlsZS50eHQnKSwgJyMnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNvbWVfZGlyLCAnb3RoZXJfZmlsZS50eHQnKSwgJyMnKQorCisgICAgICAgIGRpc3QuZGF0YV9maWxlcyA9IFsoJ2RhdGEnLCBbJ2RhdGEvZGF0YS5kdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J1aWxkb3V0LmNmZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lucm9vdC50eHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3RleGlzdGluZyddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb21lL2ZpbGUudHh0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdzb21lL290aGVyX2ZpbGUudHh0J10KKworICAgICAgICAjIGFkZGluZyBhIHNjcmlwdAorICAgICAgICBzY3JpcHRfZGlyID0gam9pbihzZWxmLnRtcF9kaXIsICdzY3JpcHRzJykKKyAgICAgICAgb3MubWtkaXIoc2NyaXB0X2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzY3JpcHRfZGlyLCAnc2NyaXB0LnB5JyksICcjJykKKyAgICAgICAgZGlzdC5zY3JpcHRzID0gW2pvaW4oJ3NjcmlwdHMnLCAnc2NyaXB0LnB5JyldCisKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ3ppcCddCisgICAgICAgIGNtZC51c2VfZGVmYXVsdHMgPSBUcnVlCisKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICAjIG5vdyBsZXQncyBjaGVjayB3aGF0IHdlIGhhdmUKKyAgICAgICAgZGlzdF9mb2xkZXIgPSBqb2luKHNlbGYudG1wX2RpciwgJ2Rpc3QnKQorICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlzdF9mb2xkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZXMsIFsnZmFrZS0xLjAuemlwJ10pCisKKyAgICAgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoam9pbihkaXN0X2ZvbGRlciwgJ2Zha2UtMS4wLnppcCcpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb250ZW50ID0gemlwX2ZpbGUubmFtZWxpc3QoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgemlwX2ZpbGUuY2xvc2UoKQorCisgICAgICAgICMgbWFraW5nIHN1cmUgZXZlcnl0aGluZyB3YXMgYWRkZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY29udGVudCksIDEyKQorCisgICAgICAgICMgY2hlY2tpbmcgdGhlIE1BTklGRVNUCisgICAgICAgIGYgPSBvcGVuKGpvaW4oc2VsZi50bXBfZGlyLCAnTUFOSUZFU1QnKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFuaWZlc3QgPSBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFuaWZlc3QsIE1BTklGRVNUICUgeydzZXAnOiBvcy5zZXB9KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X21ldGFkYXRhX2NoZWNrX29wdGlvbihzZWxmKToKKyAgICAgICAgIyB0ZXN0aW5nIHRoZSBgbWVkYXRhLWNoZWNrYCBvcHRpb24KKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKG1ldGFkYXRhPXt9KQorCisgICAgICAgICMgdGhpcyBzaG91bGQgcmFpc2Ugc29tZSB3YXJuaW5ncyAhCisgICAgICAgICMgd2l0aCB0aGUgYGNoZWNrYCBzdWJjb21tYW5kCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHdhcm5pbmdzID0gW21zZyBmb3IgbXNnIGluIHNlbGYuZ2V0X2xvZ3MoV0FSTikgaWYKKyAgICAgICAgICAgICAgICAgICAgbXNnLnN0YXJ0c3dpdGgoJ3dhcm5pbmc6IGNoZWNrOicpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3YXJuaW5ncyksIDIpCisKKyAgICAgICAgIyB0cnlpbmcgd2l0aCBhIGNvbXBsZXRlIHNldCBvZiBtZXRhZGF0YQorICAgICAgICBzZWxmLmNsZWFyX2xvZ3MoKQorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5tZXRhZGF0YV9jaGVjayA9IDAKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHdhcm5pbmdzID0gW21zZyBmb3IgbXNnIGluIHNlbGYuZ2V0X2xvZ3MoV0FSTikgaWYKKyAgICAgICAgICAgICAgICAgICAgbXNnLnN0YXJ0c3dpdGgoJ3dhcm5pbmc6IGNoZWNrOicpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3YXJuaW5ncyksIDApCisKKyAgICBkZWYgdGVzdF9jaGVja19tZXRhZGF0YV9kZXByZWNhdGVkKHNlbGYpOgorICAgICAgICAjIG1ha2VzIHN1cmUgbWFrZV9tZXRhZGF0YSBpcyBkZXByZWNhdGVkCisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCJhbHdheXMiKQorICAgICAgICAgICAgY21kLmNoZWNrX21ldGFkYXRhKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcud2FybmluZ3MpLCAxKQorCisgICAgZGVmIHRlc3Rfc2hvd19mb3JtYXRzKHNlbGYpOgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIHN0ZG91dDoKKyAgICAgICAgICAgIHNob3dfZm9ybWF0cygpCisKKyAgICAgICAgIyB0aGUgb3V0cHV0IHNob3VsZCBiZSBhIGhlYWRlciBsaW5lICsgb25lIGxpbmUgcGVyIGZvcm1hdAorICAgICAgICBudW1fZm9ybWF0cyA9IGxlbihBUkNISVZFX0ZPUk1BVFMua2V5cygpKQorICAgICAgICBvdXRwdXQgPSBbbGluZSBmb3IgbGluZSBpbiBzdGRvdXQuZ2V0dmFsdWUoKS5zcGxpdCgnXG4nKQorICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoJy0tZm9ybWF0cz0nKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3V0cHV0KSwgbnVtX2Zvcm1hdHMpCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICAgICAgIyBkZWZhdWx0IG9wdGlvbnMgc2V0IGJ5IGZpbmFsaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLm1hbmlmZXN0LCAnTUFOSUZFU1QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC50ZW1wbGF0ZSwgJ01BTklGRVNULmluJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZGlzdF9kaXIsICdkaXN0JykKKworICAgICAgICAjIGZvcm1hdHMgaGFzIHRvIGJlIGEgc3RyaW5nIHNwbGl0YWJsZSBvbiAoJyAnLCAnLCcpIG9yCisgICAgICAgICMgYSBzdHJpbmdsaXN0CisgICAgICAgIGNtZC5mb3JtYXRzID0gMQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgY21kLmZpbmFsaXplX29wdGlvbnMpCisgICAgICAgIGNtZC5mb3JtYXRzID0gWyd6aXAnXQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisKKyAgICAgICAgIyBmb3JtYXRzIGhhcyB0byBiZSBrbm93bgorICAgICAgICBjbWQuZm9ybWF0cyA9ICdzdXBhemlwYScKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzT3B0aW9uRXJyb3IsIGNtZC5maW5hbGl6ZV9vcHRpb25zKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFVJRF9HSURfU1VQUE9SVCwgIlJlcXVpcmVzIGdycCBhbmQgcHdkIHN1cHBvcnQiKQorICAgIGRlZiB0ZXN0X21ha2VfZGlzdHJpYnV0aW9uX293bmVyX2dyb3VwKHNlbGYpOgorCisgICAgICAgICMgY2hlY2sgaWYgdGFyIGFuZCBnemlwIGFyZSBpbnN0YWxsZWQKKyAgICAgICAgaWYgKGZpbmRfZXhlY3V0YWJsZSgndGFyJykgaXMgTm9uZSBvcgorICAgICAgICAgICAgZmluZF9leGVjdXRhYmxlKCdnemlwJykgaXMgTm9uZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIG5vdyBidWlsZGluZyBhIHNkaXN0CisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisKKyAgICAgICAgIyBjcmVhdGluZyBhIGd6dGFyIGFuZCBzcGVjaWZ5aW5nIHRoZSBvd25lcitncm91cAorICAgICAgICBjbWQuZm9ybWF0cyA9IFsnZ3p0YXInXQorICAgICAgICBjbWQub3duZXIgPSBwd2QuZ2V0cHd1aWQoMClbMF0KKyAgICAgICAgY21kLmdyb3VwID0gZ3JwLmdldGdyZ2lkKDApWzBdCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgIyBtYWtpbmcgc3VyZSB3ZSBoYXZlIHRoZSBnb29kIHJpZ2h0cworICAgICAgICBhcmNoaXZlX25hbWUgPSBqb2luKHNlbGYudG1wX2RpciwgJ2Rpc3QnLCAnZmFrZS0xLjAudGFyLmd6JykKKyAgICAgICAgYXJjaGl2ZSA9IHRhcmZpbGUub3BlbihhcmNoaXZlX25hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gYXJjaGl2ZS5nZXRtZW1iZXJzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1iZXIudWlkLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtYmVyLmdpZCwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFyY2hpdmUuY2xvc2UoKQorCisgICAgICAgICMgYnVpbGRpbmcgYSBzZGlzdCBhZ2FpbgorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorCisgICAgICAgICMgY3JlYXRpbmcgYSBnenRhcgorICAgICAgICBjbWQuZm9ybWF0cyA9IFsnZ3p0YXInXQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgbWFraW5nIHN1cmUgd2UgaGF2ZSB0aGUgZ29vZCByaWdodHMKKyAgICAgICAgYXJjaGl2ZV9uYW1lID0gam9pbihzZWxmLnRtcF9kaXIsICdkaXN0JywgJ2Zha2UtMS4wLnRhci5neicpCisgICAgICAgIGFyY2hpdmUgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lKQorCisgICAgICAgICMgbm90ZSB0aGF0IHdlIGFyZSBub3QgdGVzdGluZyB0aGUgZ3JvdXAgb3duZXJzaGlwIGhlcmUKKyAgICAgICAgIyBiZWNhdXNlLCBkZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtcyBhbmQgdGhlIGNvbnRhaW5lcgorICAgICAgICAjIHJpZ2h0cyAoc2VlICM3NDA4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbWVtYmVyIGluIGFyY2hpdmUuZ2V0bWVtYmVycygpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtYmVyLnVpZCwgb3MuZ2V0dWlkKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCkKKworICAgICMgdGhlIGZvbGxvd2luZyB0ZXN0cyBtYWtlIHN1cmUgdGhlcmUgaXMgYSBuaWNlIGVycm9yIG1lc3NhZ2UgaW5zdGVhZAorICAgICMgb2YgYSB0cmFjZWJhY2sgd2hlbiBwYXJzaW5nIGFuIGludmFsaWQgbWFuaWZlc3QgdGVtcGxhdGUKKworICAgIGRlZiBfY2hlY2tfdGVtcGxhdGUoc2VsZiwgY29udGVudCk6CisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisgICAgICAgIG9zLmNoZGlyKHNlbGYudG1wX2RpcikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKCdNQU5JRkVTVC5pbicsIGNvbnRlbnQpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLmZpbGVsaXN0ID0gRmlsZUxpc3QoKQorICAgICAgICBjbWQucmVhZF90ZW1wbGF0ZSgpCisgICAgICAgIHdhcm5pbmdzID0gc2VsZi5nZXRfbG9ncyhXQVJOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3YXJuaW5ncyksIDEpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3RlbXBsYXRlX3Vua25vd25fY29tbWFuZChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfdGVtcGxhdGUoJ3RhdW50IGtuaWdodHMgKicpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3RlbXBsYXRlX3dyb25nX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgIyB0aGlzIG1hbmlmZXN0IGNvbW1hbmQgdGFrZXMgb25lIGFyZ3VtZW50CisgICAgICAgIHNlbGYuX2NoZWNrX3RlbXBsYXRlKCdwcnVuZScpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgIT0gJ250JywgJ3Rlc3QgcmVsZXZhbnQgZm9yIFdpbmRvd3Mgb25seScpCisgICAgZGVmIHRlc3RfaW52YWxpZF90ZW1wbGF0ZV93cm9uZ19wYXRoKHNlbGYpOgorICAgICAgICAjIG9uIFdpbmRvd3MsIHRyYWlsaW5nIHNsYXNoZXMgYXJlIG5vdCBhbGxvd2VkCisgICAgICAgICMgdGhpcyB1c2VkIHRvIGNyYXNoIGluc3RlYWQgb2YgcmFpc2luZyBhIHdhcm5pbmc6ICM4Mjg2CisgICAgICAgIHNlbGYuX2NoZWNrX3RlbXBsYXRlKCdpbmNsdWRlIGV4YW1wbGVzLycpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVfbGlzdChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgTUFOSUZFU1QgaXMgcmVjYWxjdWxhdGVkCisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisKKyAgICAgICAgIyBmaWxsaW5nIGRhdGFfZmlsZXMgYnkgcG9pbnRpbmcgZmlsZXMgaW4gcGFja2FnZV9kYXRhCisgICAgICAgIGRpc3QucGFja2FnZV9kYXRhID0geydzb21lY29kZSc6IFsnKi50eHQnXX0KKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICdzb21lY29kZScsICdkb2MudHh0JyksICcjJykKKyAgICAgICAgY21kLmZvcm1hdHMgPSBbJ2d6dGFyJ10KKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBjbWQucnVuKCkKKworICAgICAgICBmID0gb3BlbihjbWQubWFuaWZlc3QpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hbmlmZXN0ID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBmLnJlYWQoKS5zcGxpdCgnXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpICE9ICcnXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obWFuaWZlc3QpLCA1KQorCisgICAgICAgICMgYWRkaW5nIGEgZmlsZQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgJ3NvbWVjb2RlJywgJ2RvYzIudHh0JyksICcjJykKKworICAgICAgICAjIG1ha2Ugc3VyZSBidWlsZF9weSBpcyByZWluaXRpYWxpemVkLCBsaWtlIGEgZnJlc2ggcnVuCisgICAgICAgIGJ1aWxkX3B5ID0gZGlzdC5nZXRfY29tbWFuZF9vYmooJ2J1aWxkX3B5JykKKyAgICAgICAgYnVpbGRfcHkuZmluYWxpemVkID0gRmFsc2UKKyAgICAgICAgYnVpbGRfcHkuZW5zdXJlX2ZpbmFsaXplZCgpCisKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgZiA9IG9wZW4oY21kLm1hbmlmZXN0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYW5pZmVzdDIgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGYucmVhZCgpLnNwbGl0KCdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpICE9ICcnXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBkbyB3ZSBoYXZlIHRoZSBuZXcgZmlsZSBpbiBNQU5JRkVTVCA/CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1hbmlmZXN0MiksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2RvYzIudHh0JywgbWFuaWZlc3QyWy0xXSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9tYW5pZmVzdF9tYXJrZXIoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBhdXRvZ2VuZXJhdGVkIE1BTklGRVNUcyBoYXZlIGEgbWFya2VyCisgICAgICAgIGRpc3QsIGNtZCA9IHNlbGYuZ2V0X2NtZCgpCisgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgY21kLnJ1bigpCisKKyAgICAgICAgZiA9IG9wZW4oY21kLm1hbmlmZXN0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYW5pZmVzdCA9IFtsaW5lLnN0cmlwKCkgZm9yIGxpbmUgaW4gZi5yZWFkKCkuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSAhPSAnJ10KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFuaWZlc3RbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgJyMgZmlsZSBHRU5FUkFURUQgYnkgZGlzdHV0aWxzLCBkbyBOT1QgZWRpdCcpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAncmVxdWlyZXMgemxpYicpCisgICAgZGVmIHRlc3RfbWFuaWZlc3RfY29tbWVudHMoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIGNvbW1lbnRzIGRvbid0IGNhdXNlIGV4Y2VwdGlvbnMgb3Igd3JvbmcgaW5jbHVkZXMKKyAgICAgICAgY29udGVudHMgPSBkZWRlbnQoIiIiXAorICAgICAgICAgICAgIyBiYWQucHkKKyAgICAgICAgICAgICNiYWQucHkKKyAgICAgICAgICAgIGdvb2QucHkKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgZGlzdCwgY21kID0gc2VsZi5nZXRfY21kKCkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoKHNlbGYudG1wX2RpciwgY21kLm1hbmlmZXN0KSwgY29udGVudHMpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnZ29vZC5weScpLCAnIyBwaWNrIG1lIScpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnYmFkLnB5JyksICIjIGRvbid0IHBpY2sgbWUhIikKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKChzZWxmLnRtcF9kaXIsICcjYmFkLnB5JyksICIjIGRvbid0IHBpY2sgbWUhIikKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmZpbGVsaXN0LmZpbGVzLCBbJ2dvb2QucHknXSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9tYW51YWxfbWFuaWZlc3Qoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBhIE1BTklGRVNUIHdpdGhvdXQgYSBtYXJrZXIgaXMgbGVmdCBhbG9uZQorICAgICAgICBkaXN0LCBjbWQgPSBzZWxmLmdldF9jbWQoKQorICAgICAgICBjbWQuZm9ybWF0cyA9IFsnZ3p0YXInXQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCBjbWQubWFuaWZlc3QpLCAnUkVBRE1FLm1hbnVhbCcpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZSgoc2VsZi50bXBfZGlyLCAnUkVBRE1FLm1hbnVhbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIHByb2plY3QgbWFpbnRhaW5zIGl0cyBNQU5JRkVTVCBmaWxlIGl0c2VsZi4nKQorICAgICAgICBjbWQucnVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuZmlsZWxpc3QuZmlsZXMsIFsnUkVBRE1FLm1hbnVhbCddKQorCisgICAgICAgIGYgPSBvcGVuKGNtZC5tYW5pZmVzdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFuaWZlc3QgPSBbbGluZS5zdHJpcCgpIGZvciBsaW5lIGluIGYucmVhZCgpLnNwbGl0KCdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCkgIT0gJyddCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hbmlmZXN0LCBbJ1JFQURNRS5tYW51YWwnXSkKKworICAgICAgICBhcmNoaXZlX25hbWUgPSBqb2luKHNlbGYudG1wX2RpciwgJ2Rpc3QnLCAnZmFrZS0xLjAudGFyLmd6JykKKyAgICAgICAgYXJjaGl2ZSA9IHRhcmZpbGUub3BlbihhcmNoaXZlX25hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVuYW1lcyA9IFt0YXJpbmZvLm5hbWUgZm9yIHRhcmluZm8gaW4gYXJjaGl2ZV0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFyY2hpdmUuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChmaWxlbmFtZXMpLCBbJ2Zha2UtMS4wJywgJ2Zha2UtMS4wL1BLRy1JTkZPJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWtlLTEuMC9SRUFETUUubWFudWFsJ10pCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShTRGlzdFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc2Rpc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmUxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc2Rpc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYmUxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NkaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWZhNTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weQpAQCAtMCwwICsxLDYwIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnNwYXduLiIiIgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5zcGF3biBpbXBvcnQgX250X3F1b3RlX2FyZ3MKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3biwgZmluZF9leGVjdXRhYmxlCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgorZnJvbSBkaXN0dXRpbHMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworY2xhc3MgU3Bhd25UZXN0Q2FzZShzdXBwb3J0LlRlbXBkaXJNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0LkxvZ2dpbmdTaWxlbmNlciwKKyAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbnRfcXVvdGVfYXJncyhzZWxmKToKKworICAgICAgICBmb3IgKGFyZ3MsIHdhbnRlZCkgaW4gKChbJ3dpdGggc3BhY2UnLCAnbm9zcGFjZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJyJ3aXRoIHNwYWNlIicsICdub3NwYWNlJ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChbJ25vY2hhbmdlJywgJ25vc3BhY2UnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydub2NoYW5nZScsICdub3NwYWNlJ10pKToKKyAgICAgICAgICAgIHJlcyA9IF9udF9xdW90ZV9hcmdzKGFyZ3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgd2FudGVkKQorCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lIGluICgnbnQnLCAncG9zaXgnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnUnVucyBvbmx5IHVuZGVyIHBvc2l4IG9yIG50JykKKyAgICBkZWYgdGVzdF9zcGF3bihzZWxmKToKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKworICAgICAgICAjIGNyZWF0aW5nIHNvbWV0aGluZyBleGVjdXRhYmxlCisgICAgICAgICMgdGhyb3VnaCB0aGUgc2hlbGwgdGhhdCByZXR1cm5zIDEKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5zaCcpCisgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnIyEvYmluL3NoXG5leGl0IDEnKQorICAgICAgICAgICAgb3MuY2htb2QoZXhlLCAwNzc3KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhlID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Zvby5iYXQnKQorICAgICAgICAgICAgc2VsZi53cml0ZV9maWxlKGV4ZSwgJ2V4aXQgMScpCisKKyAgICAgICAgb3MuY2htb2QoZXhlLCAwNzc3KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNFeGVjRXJyb3IsIHNwYXduLCBbZXhlXSkKKworICAgICAgICAjIG5vdyBzb21ldGhpbmcgdGhhdCB3b3JrcworICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICBleGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZm9vLnNoJykKKyAgICAgICAgICAgIHNlbGYud3JpdGVfZmlsZShleGUsICcjIS9iaW4vc2hcbmV4aXQgMCcpCisgICAgICAgICAgICBvcy5jaG1vZChleGUsIDA3NzcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZm9vLmJhdCcpCisgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZXhlLCAnZXhpdCAwJykKKworICAgICAgICBvcy5jaG1vZChleGUsIDA3NzcpCisgICAgICAgIHNwYXduKFtleGVdKSAgIyBzaG91bGQgd29yayB3aXRob3V0IGFueSBlcnJvcgorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoU3Bhd25UZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmE2NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3NwYXduLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmE2NGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zcGF3bi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3N5c2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGI0MGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHkKQEAgLTAsMCArMSwxMTcgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMuc3lzY29uZmlnLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdGVzdAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2h1dGlsCisKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4KKworY2xhc3MgU3lzY29uZmlnVGVzdENhc2Uoc3VwcG9ydC5FbnZpcm9uR3VhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihTeXNjb25maWdUZXN0Q2FzZSwgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLm1ha2VmaWxlID0gTm9uZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1ha2VmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubWFrZWZpbGUpCisgICAgICAgIHNlbGYuY2xlYW51cF90ZXN0Zm4oKQorICAgICAgICBzdXBlcihTeXNjb25maWdUZXN0Q2FzZSwgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIGNsZWFudXBfdGVzdGZuKHNlbGYpOgorICAgICAgICBwYXRoID0gdGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKworICAgIGRlZiB0ZXN0X2dldF9weXRob25fbGliKHNlbGYpOgorICAgICAgICBsaWJfZGlyID0gc3lzY29uZmlnLmdldF9weXRob25fbGliKCkKKyAgICAgICAgIyBYWFggZG9lc24ndCB3b3JrIG9uIExpbnV4IHdoZW4gUHl0aG9uIHdhcyBuZXZlciBpbnN0YWxsZWQgYmVmb3JlCisgICAgICAgICNzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2RpcihsaWJfZGlyKSwgbGliX2RpcikKKyAgICAgICAgIyB0ZXN0IGZvciBweXRob254eC5saWI/CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3lzY29uZmlnLmdldF9weXRob25fbGliKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9weXRob25fbGliKHByZWZpeD1URVNURk4pKQorICAgICAgICBfc3lzY29uZmlnID0gX19pbXBvcnRfXygnc3lzY29uZmlnJykKKyAgICAgICAgcmVzID0gc3lzY29uZmlnLmdldF9weXRob25fbGliKFRydWUsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3N5c2NvbmZpZy5nZXRfcGF0aCgncGxhdHN0ZGxpYicpLCByZXMpCisKKyAgICBkZWYgdGVzdF9nZXRfcHl0aG9uX2luYyhzZWxmKToKKyAgICAgICAgaW5jX2RpciA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYygpCisgICAgICAgICMgVGhpcyBpcyBub3QgbXVjaCBvZiBhIHRlc3QuICBXZSBtYWtlIHN1cmUgUHl0aG9uLmggZXhpc3RzCisgICAgICAgICMgaW4gdGhlIGRpcmVjdG9yeSByZXR1cm5lZCBieSBnZXRfcHl0aG9uX2luYygpIGJ1dCB3ZSBkb24ndCBrbm93CisgICAgICAgICMgaXQgaXMgdGhlIGNvcnJlY3QgZmlsZS4KKyAgICAgICAgI0Jyb2tlbiBhZnRlciBpc3N1ZSA3NzEyKHI3ODEzNikgOiBhZGQgYSB0ZW1wX2N3ZCBjb250ZXh0IG1hbmFnZXIgdG8gdGVzdF9zdXBwb3J0IC4uLgorICAgICAgICAjTk9URTogSXRzIGZhaWwgb24gcGxhdGZvcm1zIHdpdGhvdXQgcm9vdCBkaXJlY3Rvcnkgc3VwcG9ydChsaWtlIHdpbmRvd3MpCisgICAgICAgICN3aGVyZSB0ZW1wIGFuZCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3JpZXMgbWF5IHN0YXkgb24gZGlmZmVyZW50IGRyaXZlcnMuCisgICAgICAgIG9sZF93ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKFNBVkVEQ1dEKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2RpcihpbmNfZGlyKSwgaW5jX2RpcikKKyAgICAgICAgcHl0aG9uX2ggPSBvcy5wYXRoLmpvaW4oaW5jX2RpciwgIlB5dGhvbi5oIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKHB5dGhvbl9oKSwgcHl0aG9uX2gpCisgICAgICAgIG9zLmNoZGlyKG9sZF93ZCkKKworICAgIGRlZiB0ZXN0X3BhcnNlX21ha2VmaWxlX2Jhc2Uoc2VsZik6CisgICAgICAgIHNlbGYubWFrZWZpbGUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgZmQgPSBvcGVuKHNlbGYubWFrZWZpbGUsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmQud3JpdGUociJDT05GSUdfQVJHUz0gICctLWFyZzE9b3B0YXJnMScgJ0VOVj1MSUInIiAnXG4nKQorICAgICAgICAgICAgZmQud3JpdGUoJ1ZBUj0kT1RIRVJcbk9USEVSPWZvbycpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmZC5jbG9zZSgpCisgICAgICAgIGQgPSBzeXNjb25maWcucGFyc2VfbWFrZWZpbGUoc2VsZi5tYWtlZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7J0NPTkZJR19BUkdTJzogIictLWFyZzE9b3B0YXJnMScgJ0VOVj1MSUInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09USEVSJzogJ2Zvbyd9KQorCisgICAgZGVmIHRlc3RfcGFyc2VfbWFrZWZpbGVfbGl0ZXJhbF9kb2xsYXIoc2VsZik6CisgICAgICAgIHNlbGYubWFrZWZpbGUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgZmQgPSBvcGVuKHNlbGYubWFrZWZpbGUsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmQud3JpdGUociJDT05GSUdfQVJHUz0gICctLWFyZzE9b3B0YXJnMScgJ0VOVj1cJCRMSUInIiAnXG4nKQorICAgICAgICAgICAgZmQud3JpdGUoJ1ZBUj0kT1RIRVJcbk9USEVSPWZvbycpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmZC5jbG9zZSgpCisgICAgICAgIGQgPSBzeXNjb25maWcucGFyc2VfbWFrZWZpbGUoc2VsZi5tYWtlZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7J0NPTkZJR19BUkdTJzogciInLS1hcmcxPW9wdGFyZzEnICdFTlY9XCRMSUInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ09USEVSJzogJ2Zvbyd9KQorCisKKyAgICBkZWYgdGVzdF9zeXNjb25maWdfbW9kdWxlKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzY29uZmlnIGFzIGdsb2JhbF9zeXNjb25maWcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iYWxfc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDRkxBR1MnKSwgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDRkxBR1MnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iYWxfc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdMREZMQUdTJyksIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTERGTEFHUycpKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0NVU1RPTUlaRURfT1NYX0NPTVBJTEVSJyksJ2NvbXBpbGVyIGZsYWdzIGN1c3RvbWl6ZWQnKQorICAgIGRlZiB0ZXN0X3N5c2NvbmZpZ19jb21waWxlcl92YXJzKHNlbGYpOgorICAgICAgICAjIE9uIE9TIFgsIGJpbmFyeSBpbnN0YWxsZXJzIHN1cHBvcnQgZXh0ZW5zaW9uIG1vZHVsZSBidWlsZGluZyBvbgorICAgICAgICAjIHZhcmlvdXMgbGV2ZWxzIG9mIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHdpdGggZGlmZmVyaW5nIFhjb2RlCisgICAgICAgICMgY29uZmlndXJhdGlvbnMuICBUaGlzIHJlcXVpcmVzIGN1c3RvbWl6YXRpb24gb2Ygc29tZSBvZiB0aGUKKyAgICAgICAgIyBjb21waWxlciBjb25maWd1cmF0aW9uIGRpcmVjdGl2ZXMgdG8gc3VpdCB0aGUgZW52aXJvbm1lbnQgb24KKyAgICAgICAgIyB0aGUgaW5zdGFsbGVkIG1hY2hpbmUuICBTb21lIG9mIHRoZXNlIGN1c3RvbWl6YXRpb25zIG1heSByZXF1aXJlCisgICAgICAgICMgcnVubmluZyBleHRlcm5hbCBwcm9ncmFtcyBhbmQsIHNvLCBhcmUgZGVmZXJyZWQgdW50aWwgbmVlZGVkIGJ5CisgICAgICAgICMgdGhlIGZpcnN0IGV4dGVuc2lvbiBtb2R1bGUgYnVpbGQuICBXaXRoIFB5dGhvbiAzLjMsIG9ubHkKKyAgICAgICAgIyB0aGUgRGlzdHV0aWxzIHZlcnNpb24gb2Ygc3lzY29uZmlnIGlzIHVzZWQgZm9yIGV4dGVuc2lvbiBtb2R1bGUKKyAgICAgICAgIyBidWlsZHMsIHdoaWNoIGhhcHBlbnMgZWFybGllciBpbiB0aGUgRGlzdHV0aWxzIHRlc3RzLiAgVGhpcyBtYXkKKyAgICAgICAgIyBjYXVzZSB0aGUgZm9sbG93aW5nIHRlc3RzIHRvIGZhaWwgc2luY2Ugbm8gdGVzdHMgaGF2ZSBjYXVzZWQKKyAgICAgICAgIyB0aGUgZ2xvYmFsIHZlcnNpb24gb2Ygc3lzY29uZmlnIHRvIGNhbGwgdGhlIGN1c3RvbWl6YXRpb24geWV0LgorICAgICAgICAjIFRoZSBzb2x1dGlvbiBmb3Igbm93IGlzIHRvIHNpbXBseSBza2lwIHRoaXMgdGVzdCBpbiB0aGlzIGNhc2UuCisgICAgICAgICMgVGhlIGxvbmdlci10ZXJtIHNvbHV0aW9uIGlzIHRvIG9ubHkgaGF2ZSBvbmUgdmVyc2lvbiBvZiBzeXNjb25maWcuCisKKyAgICAgICAgaW1wb3J0IHN5c2NvbmZpZyBhcyBnbG9iYWxfc3lzY29uZmlnCisgICAgICAgIGlmIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignQ1VTVE9NSVpFRF9PU1hfQ09NUElMRVInKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2JhbF9zeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0xEU0hBUkVEJyksIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTERTSEFSRUQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9iYWxfc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDQycpLCBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ0NDJykpCisKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShTeXNjb25maWdUZXN0Q2FzZSkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTM0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3N5c2NvbmZpZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTM0MzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3N5c2NvbmZpZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3RleHRfZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE5Y2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHkKQEAgLTAsMCArMSwxMDcgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMudGV4dF9maWxlLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZGlzdHV0aWxzLnRleHRfZmlsZSBpbXBvcnQgVGV4dEZpbGUKK2Zyb20gZGlzdHV0aWxzLnRlc3RzIGltcG9ydCBzdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworVEVTVF9EQVRBID0gIiIiIyB0ZXN0IGZpbGUKKworbGluZSAzIFxcCisjIGludGVydmVuaW5nIGNvbW1lbnQKKyAgY29udGludWVzIG9uIG5leHQgbGluZQorIiIiCisKK2NsYXNzIFRleHRGaWxlVGVzdENhc2Uoc3VwcG9ydC5UZW1wZGlyTWFuYWdlciwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY2xhc3Moc2VsZik6CisgICAgICAgICMgb2xkIHRlc3RzIG1vdmVkIGZyb20gdGV4dF9maWxlLl9fbWFpbl9fCisgICAgICAgICMgc28gdGhleSBhcmUgcmVhbGx5IGNhbGxlZCBieSB0aGUgYnVpbGRib3RzCisKKyAgICAgICAgIyByZXN1bHQgMTogbm8gZmFuY3kgb3B0aW9ucworICAgICAgICByZXN1bHQxID0gWycjIHRlc3QgZmlsZVxuJywgJ1xuJywgJ2xpbmUgMyBcXFxuJywKKyAgICAgICAgICAgICAgICAgICAnIyBpbnRlcnZlbmluZyBjb21tZW50XG4nLAorICAgICAgICAgICAgICAgICAgICcgIGNvbnRpbnVlcyBvbiBuZXh0IGxpbmVcbiddCisKKyAgICAgICAgIyByZXN1bHQgMjoganVzdCBzdHJpcCBjb21tZW50cworICAgICAgICByZXN1bHQyID0gWyJcbiIsCisgICAgICAgICAgICAgICAgICAgImxpbmUgMyBcXFxuIiwKKyAgICAgICAgICAgICAgICAgICAiICBjb250aW51ZXMgb24gbmV4dCBsaW5lXG4iXQorCisgICAgICAgICMgcmVzdWx0IDM6IGp1c3Qgc3RyaXAgYmxhbmsgbGluZXMKKyAgICAgICAgcmVzdWx0MyA9IFsiIyB0ZXN0IGZpbGVcbiIsCisgICAgICAgICAgICAgICAgICAgImxpbmUgMyBcXFxuIiwKKyAgICAgICAgICAgICAgICAgICAiIyBpbnRlcnZlbmluZyBjb21tZW50XG4iLAorICAgICAgICAgICAgICAgICAgICIgIGNvbnRpbnVlcyBvbiBuZXh0IGxpbmVcbiJdCisKKyAgICAgICAgIyByZXN1bHQgNDogZGVmYXVsdCwgc3RyaXAgY29tbWVudHMsIGJsYW5rIGxpbmVzLAorICAgICAgICAjIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICAgIHJlc3VsdDQgPSBbImxpbmUgMyBcXCIsCisgICAgICAgICAgICAgICAgICAgIiAgY29udGludWVzIG9uIG5leHQgbGluZSJdCisKKyAgICAgICAgIyByZXN1bHQgNTogc3RyaXAgY29tbWVudHMgYW5kIGJsYW5rcywgcGx1cyBqb2luIGxpbmVzIChidXQgZG9uJ3QKKyAgICAgICAgIyAiY29sbGFwc2UiIGpvaW5lZCBsaW5lcworICAgICAgICByZXN1bHQ1ID0gWyJsaW5lIDMgICBjb250aW51ZXMgb24gbmV4dCBsaW5lIl0KKworICAgICAgICAjIHJlc3VsdCA2OiBzdHJpcCBjb21tZW50cyBhbmQgYmxhbmtzLCBwbHVzIGpvaW4gbGluZXMgKGFuZAorICAgICAgICAjICJjb2xsYXBzZSIgam9pbmVkIGxpbmVzCisgICAgICAgIHJlc3VsdDYgPSBbImxpbmUgMyBjb250aW51ZXMgb24gbmV4dCBsaW5lIl0KKworICAgICAgICBkZWYgdGVzdF9pbnB1dChjb3VudCwgZGVzY3JpcHRpb24sIGZpbGUsIGV4cGVjdGVkX3Jlc3VsdCk6CisgICAgICAgICAgICByZXN1bHQgPSBmaWxlLnJlYWRsaW5lcygpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWRfcmVzdWx0KQorCisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRtcGRpciwgInRlc3QudHh0IikKKyAgICAgICAgb3V0X2ZpbGUgPSBvcGVuKGZpbGVuYW1lLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG91dF9maWxlLndyaXRlKFRFU1RfREFUQSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG91dF9maWxlLmNsb3NlKCkKKworICAgICAgICBpbl9maWxlID0gVGV4dEZpbGUoZmlsZW5hbWUsIHN0cmlwX2NvbW1lbnRzPTAsIHNraXBfYmxhbmtzPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RyaXBfd3M9MCwgcnN0cmlwX3dzPTApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RfaW5wdXQoMSwgIm5vIHByb2Nlc3NpbmciLCBpbl9maWxlLCByZXN1bHQxKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5fZmlsZS5jbG9zZSgpCisKKyAgICAgICAgaW5fZmlsZSA9IFRleHRGaWxlKGZpbGVuYW1lLCBzdHJpcF9jb21tZW50cz0xLCBza2lwX2JsYW5rcz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbHN0cmlwX3dzPTAsIHJzdHJpcF93cz0wKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2lucHV0KDIsICJzdHJpcCBjb21tZW50cyIsIGluX2ZpbGUsIHJlc3VsdDIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbl9maWxlLmNsb3NlKCkKKworICAgICAgICBpbl9maWxlID0gVGV4dEZpbGUoZmlsZW5hbWUsIHN0cmlwX2NvbW1lbnRzPTAsIHNraXBfYmxhbmtzPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsc3RyaXBfd3M9MCwgcnN0cmlwX3dzPTApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RfaW5wdXQoMywgInN0cmlwIGJsYW5rcyIsIGluX2ZpbGUsIHJlc3VsdDMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbl9maWxlLmNsb3NlKCkKKworICAgICAgICBpbl9maWxlID0gVGV4dEZpbGUoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RfaW5wdXQoNCwgImRlZmF1bHQgcHJvY2Vzc2luZyIsIGluX2ZpbGUsIHJlc3VsdDQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbl9maWxlLmNsb3NlKCkKKworICAgICAgICBpbl9maWxlID0gVGV4dEZpbGUoZmlsZW5hbWUsIHN0cmlwX2NvbW1lbnRzPTEsIHNraXBfYmxhbmtzPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luX2xpbmVzPTEsIHJzdHJpcF93cz0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2lucHV0KDUsICJqb2luIGxpbmVzIHdpdGhvdXQgY29sbGFwc2luZyIsIGluX2ZpbGUsIHJlc3VsdDUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbl9maWxlLmNsb3NlKCkKKworICAgICAgICBpbl9maWxlID0gVGV4dEZpbGUoZmlsZW5hbWUsIHN0cmlwX2NvbW1lbnRzPTEsIHNraXBfYmxhbmtzPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luX2xpbmVzPTEsIHJzdHJpcF93cz0xLCBjb2xsYXBzZV9qb2luPTEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3RfaW5wdXQoNiwgImpvaW4gbGluZXMgd2l0aCBjb2xsYXBzaW5nIiwgaW5fZmlsZSwgcmVzdWx0NikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGluX2ZpbGUuY2xvc2UoKQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoVGV4dEZpbGVUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QodGVzdF9zdWl0ZSgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZmQ1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3RleHRfZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF90ZXh0X2ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZmQ1NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3RleHRfZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZjkyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHkKQEAgLTAsMCArMSwxMzAgQEAKKyIiIlRlc3RzIGZvciBkaXN0dXRpbHMudW5peGNjb21waWxlci4iIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBzeXNjb25maWcKK2Zyb20gZGlzdHV0aWxzLnVuaXhjY29tcGlsZXIgaW1wb3J0IFVuaXhDQ29tcGlsZXIKKworY2xhc3MgVW5peENDb21waWxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fYmFja3VwX3BsYXRmb3JtID0gc3lzLnBsYXRmb3JtCisgICAgICAgIHNlbGYuX2JhY2t1cF9nZXRfY29uZmlnX3ZhciA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcgorICAgICAgICBjbGFzcyBDb21waWxlcldyYXBwZXIoVW5peENDb21waWxlcik6CisgICAgICAgICAgICBkZWYgcnBhdGhfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJ1bnRpbWVfbGlicmFyeV9kaXJfb3B0aW9uKCcvZm9vJykKKyAgICAgICAgc2VsZi5jYyA9IENvbXBpbGVyV3JhcHBlcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wbGF0Zm9ybSA9IHNlbGYuX2JhY2t1cF9wbGF0Zm9ybQorICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIgPSBzZWxmLl9iYWNrdXBfZ2V0X2NvbmZpZ192YXIKKworICAgIGRlZiB0ZXN0X3J1bnRpbWVfbGliZGlyX29wdGlvbihzZWxmKToKKworICAgICAgICAjIG5vdCB0ZXN0ZWQgdW5kZXIgd2luZG93cworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgSXNzdWUjNTkwMAorICAgICAgICAjCisgICAgICAgICMgRW5zdXJlIFJVTlBBVEggaXMgYWRkZWQgdG8gZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBSUEFUSCBpZgorICAgICAgICAjIEdOVSBsZCBpcyB1c2VkCisKKyAgICAgICAgIyBkYXJ3aW4KKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2RhcndpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLnJwYXRoX2ZvbygpLCAnLUwvZm9vJykKKworICAgICAgICAjIGhwLXV4CisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdocC11eCcKKyAgICAgICAgb2xkX2djdiA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcgorICAgICAgICBkZWYgZ2N2KHYpOgorICAgICAgICAgICAgcmV0dXJuICd4eHgnCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksIFsnK3MnLCAnLUwvZm9vJ10pCisKKyAgICAgICAgZGVmIGdjdih2KToKKyAgICAgICAgICAgIHJldHVybiAnZ2NjJworICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIgPSBnY3YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLnJwYXRoX2ZvbygpLCBbJy1XbCwrcycsICctTC9mb28nXSkKKworICAgICAgICBkZWYgZ2N2KHYpOgorICAgICAgICAgICAgcmV0dXJuICdnKysnCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksIFsnLVdsLCtzJywgJy1ML2ZvbyddKQorCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IG9sZF9nY3YKKworICAgICAgICAjIGlyaXg2NDYKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2lyaXg2NDYnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgWyctcnBhdGgnLCAnL2ZvbyddKQorCisgICAgICAgICMgb3NmMVY1CisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdvc2YxVjUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgWyctcnBhdGgnLCAnL2ZvbyddKQorCisgICAgICAgICMgR0NDIEdOVUxECisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdiYXInCisgICAgICAgIGRlZiBnY3Yodik6CisgICAgICAgICAgICBpZiB2ID09ICdDQyc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdnY2MnCisgICAgICAgICAgICBlbGlmIHYgPT0gJ0dOVUxEJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ3llcycKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gZ2N2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgJy1XbCwtUi9mb28nKQorCisgICAgICAgICMgR0NDIG5vbi1HTlVMRAorICAgICAgICBzeXMucGxhdGZvcm0gPSAnYmFyJworICAgICAgICBkZWYgZ2N2KHYpOgorICAgICAgICAgICAgaWYgdiA9PSAnQ0MnOgorICAgICAgICAgICAgICAgIHJldHVybiAnZ2NjJworICAgICAgICAgICAgZWxpZiB2ID09ICdHTlVMRCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdubycKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gZ2N2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgJy1XbCwtUi9mb28nKQorCisgICAgICAgICMgR0NDIEdOVUxEIHdpdGggZnVsbHkgcXVhbGlmaWVkIGNvbmZpZ3VyYXRpb24gcHJlZml4CisgICAgICAgICMgc2VlICM3NjE3CisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdiYXInCisgICAgICAgIGRlZiBnY3Yodik6CisgICAgICAgICAgICBpZiB2ID09ICdDQyc6CisgICAgICAgICAgICAgICAgcmV0dXJuICd4ODZfNjQtcGMtbGludXgtZ251LWdjYy00LjQuMicKKyAgICAgICAgICAgIGVsaWYgdiA9PSAnR05VTEQnOgorICAgICAgICAgICAgICAgIHJldHVybiAneWVzJworICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIgPSBnY3YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNjLnJwYXRoX2ZvbygpLCAnLVdsLC1SL2ZvbycpCisKKworICAgICAgICAjIG5vbi1HQ0MgR05VTEQKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2JhcicKKyAgICAgICAgZGVmIGdjdih2KToKKyAgICAgICAgICAgIGlmIHYgPT0gJ0NDJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2NjJworICAgICAgICAgICAgZWxpZiB2ID09ICdHTlVMRCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICd5ZXMnCisgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhciA9IGdjdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2MucnBhdGhfZm9vKCksICctUi9mb28nKQorCisgICAgICAgICMgbm9uLUdDQyBub24tR05VTEQKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ2JhcicKKyAgICAgICAgZGVmIGdjdih2KToKKyAgICAgICAgICAgIGlmIHYgPT0gJ0NDJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2NjJworICAgICAgICAgICAgZWxpZiB2ID09ICdHTlVMRCc6CisgICAgICAgICAgICAgICAgcmV0dXJuICdubycKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gZ2N2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgJy1SL2ZvbycpCisKKyAgICAgICAgIyBBSVggQy9DKysgbGlua2VyCisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdhaXgnCisgICAgICAgIGRlZiBnY3Yodik6CisgICAgICAgICAgICByZXR1cm4gJ3h4eCcKKyAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyID0gZ2N2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYy5ycGF0aF9mb28oKSwgJy1ibGlicGF0aDovZm9vJykKKworCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoVW5peENDb21waWxlclRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRmZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VuaXhjY29tcGlsZXIucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGRmZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91bml4Y2NvbXBpbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXBsb2FkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTExOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weQpAQCAtMCwwICsxLDEzMSBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0ZjggLSotCisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLmNvbW1hbmQudXBsb2FkLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5jb21tYW5kIGltcG9ydCB1cGxvYWQgYXMgdXBsb2FkX21vZAorZnJvbSBkaXN0dXRpbHMuY29tbWFuZC51cGxvYWQgaW1wb3J0IHVwbG9hZAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRGlzdHJpYnV0aW9uCisKK2Zyb20gZGlzdHV0aWxzLnRlc3RzLnRlc3RfY29uZmlnIGltcG9ydCBQWVBJUkMsIFB5UElSQ0NvbW1hbmRUZXN0Q2FzZQorCitQWVBJUkNfTE9OR19QQVNTV09SRCA9ICIiIlwKK1tkaXN0dXRpbHNdCisKK2luZGV4LXNlcnZlcnMgPQorICAgIHNlcnZlcjEKKyAgICBzZXJ2ZXIyCisKK1tzZXJ2ZXIxXQordXNlcm5hbWU6bWUKK3Bhc3N3b3JkOmFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEKKworW3NlcnZlcjJdCit1c2VybmFtZTptZWFnYWluCitwYXNzd29yZDogc2VjcmV0CityZWFsbTphY21lCityZXBvc2l0b3J5Omh0dHA6Ly9hbm90aGVyLnB5cGkvCisiIiIKKworCitQWVBJUkNfTk9QQVNTV09SRCA9ICIiIlwKK1tkaXN0dXRpbHNdCisKK2luZGV4LXNlcnZlcnMgPQorICAgIHNlcnZlcjEKKworW3NlcnZlcjFdCit1c2VybmFtZTptZQorIiIiCisKK2NsYXNzIEZha2VPcGVuKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdXJsKToKKyAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXJsLCBzdHIpOgorICAgICAgICAgICAgc2VsZi5yZXEgPSB1cmwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVxID0gTm9uZQorICAgICAgICBzZWxmLm1zZyA9ICdPSycKKworICAgIGRlZiBnZXRjb2RlKHNlbGYpOgorICAgICAgICByZXR1cm4gMjAwCisKKworY2xhc3MgdXBsb2FkVGVzdENhc2UoUHlQSVJDQ29tbWFuZFRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIodXBsb2FkVGVzdENhc2UsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5vbGRfb3BlbiA9IHVwbG9hZF9tb2QudXJsb3BlbgorICAgICAgICB1cGxvYWRfbW9kLnVybG9wZW4gPSBzZWxmLl91cmxvcGVuCisgICAgICAgIHNlbGYubGFzdF9vcGVuID0gTm9uZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB1cGxvYWRfbW9kLnVybG9wZW4gPSBzZWxmLm9sZF9vcGVuCisgICAgICAgIHN1cGVyKHVwbG9hZFRlc3RDYXNlLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgX3VybG9wZW4oc2VsZiwgdXJsKToKKyAgICAgICAgc2VsZi5sYXN0X29wZW4gPSBGYWtlT3Blbih1cmwpCisgICAgICAgIHJldHVybiBzZWxmLmxhc3Rfb3BlbgorCisgICAgZGVmIHRlc3RfZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKworICAgICAgICAjIG5ldyBmb3JtYXQKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKHNlbGYucmMsIFBZUElSQykKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIGNtZCA9IHVwbG9hZChkaXN0KQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIGZvciBhdHRyLCB3YWl0ZWQgaW4gKCgndXNlcm5hbWUnLCAnbWUnKSwgKCdwYXNzd29yZCcsICdzZWNyZXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdyZWFsbScsICdweXBpJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncmVwb3NpdG9yeScsICdodHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGknKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIoY21kLCBhdHRyKSwgd2FpdGVkKQorCisgICAgZGVmIHRlc3Rfc2F2ZWRfcGFzc3dvcmQoc2VsZik6CisgICAgICAgICMgZmlsZSB3aXRoIG5vIHBhc3N3b3JkCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShzZWxmLnJjLCBQWVBJUkNfTk9QQVNTV09SRCkKKworICAgICAgICAjIG1ha2Ugc3VyZSBpdCBwYXNzZXMKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigpCisgICAgICAgIGNtZCA9IHVwbG9hZChkaXN0KQorICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLnBhc3N3b3JkLCBOb25lKQorCisgICAgICAgICMgbWFrZSBzdXJlIHdlIGdldCBpdCBhcyB3ZWxsLCBpZiBhbm90aGVyIGNvbW1hbmQKKyAgICAgICAgIyBpbml0aWFsaXplZCBpdCBhdCB0aGUgZGlzdCBsZXZlbAorICAgICAgICBkaXN0LnBhc3N3b3JkID0gJ3h4eCcKKyAgICAgICAgY21kID0gdXBsb2FkKGRpc3QpCisgICAgICAgIGNtZC5maW5hbGl6ZV9vcHRpb25zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQucGFzc3dvcmQsICd4eHgnKQorCisgICAgZGVmIHRlc3RfdXBsb2FkKHNlbGYpOgorICAgICAgICB0bXAgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHRtcCwgJ3h4eCcpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShwYXRoKQorICAgICAgICBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lID0gJ3h4eCcsICcyLjYnLCBwYXRoCisgICAgICAgIGRpc3RfZmlsZXMgPSBbKGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUpXQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoc2VsZi5yYywgUFlQSVJDX0xPTkdfUEFTU1dPUkQpCisKKyAgICAgICAgIyBsZXRzIHJ1biBpdAorICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdChkaXN0X2ZpbGVzPWRpc3RfZmlsZXMsIGF1dGhvcj11J2TDqWTDqScpCisgICAgICAgIGNtZCA9IHVwbG9hZChkaXN0KQorICAgICAgICBjbWQuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIGNtZC5ydW4oKQorCisgICAgICAgICMgd2hhdCBkaWQgd2Ugc2VuZCA/CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2TDqWTDqScsIHNlbGYubGFzdF9vcGVuLnJlcS5kYXRhKQorICAgICAgICBoZWFkZXJzID0gZGljdChzZWxmLmxhc3Rfb3Blbi5yZXEuaGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWydDb250ZW50LWxlbmd0aCddLCAnMjA4NScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoZWFkZXJzWydDb250ZW50LXR5cGUnXS5zdGFydHN3aXRoKCdtdWx0aXBhcnQvZm9ybS1kYXRhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sYXN0X29wZW4ucmVxLmdldF9tZXRob2QoKSwgJ1BPU1QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubGFzdF9vcGVuLnJlcS5nZXRfZnVsbF91cmwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnaHR0cDovL3B5cGkucHl0aG9uLm9yZy9weXBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd4eHgnIGluIHNlbGYubGFzdF9vcGVuLnJlcS5kYXRhKQorICAgICAgICBhdXRoID0gc2VsZi5sYXN0X29wZW4ucmVxLmhlYWRlcnNbJ0F1dGhvcml6YXRpb24nXQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCdcbicgaW4gYXV0aCkKKworZGVmIHRlc3Rfc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKHVwbG9hZFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NjA5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXBsb2FkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NjA5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXBsb2FkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjZDRjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQpAQCAtMCwwICsxLDI1IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnV0aWwuIiIiCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIERpc3R1dGlsc0J5dGVDb21waWxlRXJyb3IKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGJ5dGVfY29tcGlsZQorCitjbGFzcyBVdGlsVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZG9udF93cml0ZV9ieXRlY29kZShzZWxmKToKKyAgICAgICAgIyBtYWtlcyBzdXJlIGJ5dGVfY29tcGlsZSByYWlzZSBhIERpc3R1dGlsc0Vycm9yCisgICAgICAgICMgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgaXMgVHJ1ZQorICAgICAgICBvbGRfZG9udF93cml0ZV9ieXRlY29kZSA9IHN5cy5kb250X3dyaXRlX2J5dGVjb2RlCisgICAgICAgIHN5cy5kb250X3dyaXRlX2J5dGVjb2RlID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNCeXRlQ29tcGlsZUVycm9yLCBieXRlX2NvbXBpbGUsIFtdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGUgPSBvbGRfZG9udF93cml0ZV9ieXRlY29kZQorCitkZWYgdGVzdF9zdWl0ZSgpOgorICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoVXRpbFRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM2Y2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTM2Y2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE4OTk1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbi5weQpAQCAtMCwwICsxLDcxIEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLnZlcnNpb24uIiIiCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZGlzdHV0aWxzLnZlcnNpb24gaW1wb3J0IExvb3NlVmVyc2lvbgorZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIFZlcnNpb25UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9wcmVyZWxlYXNlKHNlbGYpOgorICAgICAgICB2ZXJzaW9uID0gU3RyaWN0VmVyc2lvbignMS4yLjNhMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyc2lvbi52ZXJzaW9uLCAoMSwgMiwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyc2lvbi5wcmVyZWxlYXNlLCAoJ2EnLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodmVyc2lvbiksICcxLjIuM2ExJykKKworICAgICAgICB2ZXJzaW9uID0gU3RyaWN0VmVyc2lvbignMS4yLjAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih2ZXJzaW9uKSwgJzEuMicpCisKKyAgICBkZWYgdGVzdF9jbXBfc3RyaWN0KHNlbGYpOgorICAgICAgICB2ZXJzaW9ucyA9ICgoJzEuNS4xJywgJzEuNS4yYjInLCAtMSksCisgICAgICAgICAgICAgICAgICAgICgnMTYxJywgJzMuMTBhJywgVmFsdWVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICgnOC4wMicsICc4LjAyJywgMCksCisgICAgICAgICAgICAgICAgICAgICgnMy40aicsICcxOTk2LjA3LjEyJywgVmFsdWVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICgnMy4yLnBsMCcsICczLjEuMS42JywgVmFsdWVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICgnMmc2JywgJzExZycsIFZhbHVlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAoJzAuOScsICcyLjInLCAtMSksCisgICAgICAgICAgICAgICAgICAgICgnMS4yLjEnLCAnMS4yJywgMSksCisgICAgICAgICAgICAgICAgICAgICgnMS4xJywgJzEuMi4yJywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzEuMicsICcxLjEnLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgKCcxLjIuMScsICcxLjIuMicsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgKCcxLjIuMicsICcxLjInLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgKCcxLjInLCAnMS4yLjInLCAtMSksCisgICAgICAgICAgICAgICAgICAgICgnMC40LjAnLCAnMC40JywgMCksCisgICAgICAgICAgICAgICAgICAgICgnMS4xMysrJywgJzUuNS5rdycsIFZhbHVlRXJyb3IpKQorCisgICAgICAgIGZvciB2MSwgdjIsIHdhbnRlZCBpbiB2ZXJzaW9uczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXMgPSBTdHJpY3RWZXJzaW9uKHYxKS5fX2NtcF9fKFN0cmljdFZlcnNpb24odjIpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgaWYgd2FudGVkIGlzIFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoKCJjbXAoJXMsICVzKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh2MSwgdjIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHdhbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NtcCglcywgJXMpIHNob3VsZCBiZSAlcywgZ290ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2MSwgdjIsIHdhbnRlZCwgcmVzKSkKKworCisgICAgZGVmIHRlc3RfY21wKHNlbGYpOgorICAgICAgICB2ZXJzaW9ucyA9ICgoJzEuNS4xJywgJzEuNS4yYjInLCAtMSksCisgICAgICAgICAgICAgICAgICAgICgnMTYxJywgJzMuMTBhJywgMSksCisgICAgICAgICAgICAgICAgICAgICgnOC4wMicsICc4LjAyJywgMCksCisgICAgICAgICAgICAgICAgICAgICgnMy40aicsICcxOTk2LjA3LjEyJywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzMuMi5wbDAnLCAnMy4xLjEuNicsIDEpLAorICAgICAgICAgICAgICAgICAgICAoJzJnNicsICcxMWcnLCAtMSksCisgICAgICAgICAgICAgICAgICAgICgnMC45NjA5MjMnLCAnMi4yYmV0YTI5JywgLTEpLAorICAgICAgICAgICAgICAgICAgICAoJzEuMTMrKycsICc1LjUua3cnLCAtMSkpCisKKworICAgICAgICBmb3IgdjEsIHYyLCB3YW50ZWQgaW4gdmVyc2lvbnM6CisgICAgICAgICAgICByZXMgPSBMb29zZVZlcnNpb24odjEpLl9fY21wX18oTG9vc2VWZXJzaW9uKHYyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCB3YW50ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjbXAoJXMsICVzKSBzaG91bGQgYmUgJXMsIGdvdCAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodjEsIHYyLCB3YW50ZWQsIHJlcykpCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShWZXJzaW9uVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KHRlc3Rfc3VpdGUoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbi5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmQxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbi5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNmQxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdmVyc2lvbnByZWRpY2F0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDZjOGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9ucHJlZGljYXRlLnB5CkBAIC0wLDAgKzEsMTMgQEAKKyIiIlRlc3RzIGhhcm5lc3MgZm9yIGRpc3R1dGlscy52ZXJzaW9ucHJlZGljYXRlLgorCisiIiIKKworaW1wb3J0IGRpc3R1dGlscy52ZXJzaW9ucHJlZGljYXRlCitpbXBvcnQgZG9jdGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIGRvY3Rlc3QuRG9jVGVzdFN1aXRlKGRpc3R1dGlscy52ZXJzaW9ucHJlZGljYXRlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHJ1bl91bml0dGVzdCh0ZXN0X3N1aXRlKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb25wcmVkaWNhdGUucHljIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9ucHJlZGljYXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU3OTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9ucHJlZGljYXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy90ZXN0X3ZlcnNpb25wcmVkaWNhdGUucHlvIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9ucHJlZGljYXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWU3OTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMvdGVzdF92ZXJzaW9ucHJlZGljYXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXN0cy94eG1vZHVsZS5jIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMveHhtb2R1bGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDliMDhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGVzdHMveHhtb2R1bGUuYwpAQCAtMCwwICsxLDM3OSBAQAorCisvKiBVc2UgdGhpcyBmaWxlIGFzIGEgdGVtcGxhdGUgdG8gc3RhcnQgaW1wbGVtZW50aW5nIGEgbW9kdWxlIHRoYXQKKyAgIGFsc28gZGVjbGFyZXMgb2JqZWN0IHR5cGVzLiBBbGwgb2NjdXJyZW5jZXMgb2YgJ1h4bycgc2hvdWxkIGJlIGNoYW5nZWQKKyAgIHRvIHNvbWV0aGluZyByZWFzb25hYmxlIGZvciB5b3VyIG9iamVjdHMuIEFmdGVyIHRoYXQsIGFsbCBvdGhlcgorICAgb2NjdXJyZW5jZXMgb2YgJ3h4JyBzaG91bGQgYmUgY2hhbmdlZCB0byBzb21ldGhpbmcgcmVhc29uYWJsZSBmb3IgeW91cgorICAgbW9kdWxlLiBJZiB5b3VyIG1vZHVsZSBpcyBuYW1lZCBmb28geW91ciBzb3VyY2VmaWxlIHNob3VsZCBiZSBuYW1lZAorICAgZm9vbW9kdWxlLmMuCisKKyAgIFlvdSB3aWxsIHByb2JhYmx5IHdhbnQgdG8gZGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvICd4X2F0dHInIGFuZCBhZGQKKyAgIHlvdXIgb3duIHR5cGVzIG9mIGF0dHJpYnV0ZXMgaW5zdGVhZC4gIE1heWJlIHlvdSB3YW50IHRvIG5hbWUgeW91cgorICAgbG9jYWwgdmFyaWFibGVzIG90aGVyIHRoYW4gJ3NlbGYnLiAgSWYgeW91ciBvYmplY3QgdHlwZSBpcyBuZWVkZWQgaW4KKyAgIG90aGVyIGZpbGVzLCB5b3UnbGwgaGF2ZSB0byBjcmVhdGUgYSBmaWxlICJmb29iYXJvYmplY3QuaCI7IHNlZQorICAgaW50b2JqZWN0LmggZm9yIGFuIGV4YW1wbGUuICovCisKKy8qIFh4byBvYmplY3RzICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKworc3RhdGljIFB5T2JqZWN0ICpFcnJvck9iamVjdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIFB5T2JqZWN0X0hFQUQKKyAgICBQeU9iamVjdCAgICAgICAgICAgICp4X2F0dHI7ICAgICAgICAvKiBBdHRyaWJ1dGVzIGRpY3Rpb25hcnkgKi8KK30gWHhvT2JqZWN0OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IFh4b19UeXBlOworCisjZGVmaW5lIFh4b09iamVjdF9DaGVjayh2KSAgICAgIChQeV9UWVBFKHYpID09ICZYeG9fVHlwZSkKKworc3RhdGljIFh4b09iamVjdCAqCituZXdYeG9PYmplY3QoUHlPYmplY3QgKmFyZykKK3sKKyAgICBYeG9PYmplY3QgKnNlbGY7CisgICAgc2VsZiA9IFB5T2JqZWN0X05ldyhYeG9PYmplY3QsICZYeG9fVHlwZSk7CisgICAgaWYgKHNlbGYgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgc2VsZi0+eF9hdHRyID0gTlVMTDsKKyAgICByZXR1cm4gc2VsZjsKK30KKworLyogWHhvIG1ldGhvZHMgKi8KKworc3RhdGljIHZvaWQKK1h4b19kZWFsbG9jKFh4b09iamVjdCAqc2VsZikKK3sKKyAgICBQeV9YREVDUkVGKHNlbGYtPnhfYXR0cik7CisgICAgUHlPYmplY3RfRGVsKHNlbGYpOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorWHhvX2RlbW8oWHhvT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpkZW1vIikpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworc3RhdGljIFB5TWV0aG9kRGVmIFh4b19tZXRob2RzW10gPSB7CisgICAgeyJkZW1vIiwgICAgICAgICAgICAoUHlDRnVuY3Rpb24pWHhvX2RlbW8sICBNRVRIX1ZBUkFSR1MsCisgICAgICAgIFB5RG9jX1NUUigiZGVtbygpIC0+IE5vbmUiKX0sCisgICAge05VTEwsICAgICAgICAgICAgICBOVUxMfSAgICAgICAgICAgLyogc2VudGluZWwgKi8KK307CisKK3N0YXRpYyBQeU9iamVjdCAqCitYeG9fZ2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUpCit7CisgICAgaWYgKHNlbGYtPnhfYXR0ciAhPSBOVUxMKSB7CisgICAgICAgIFB5T2JqZWN0ICp2ID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+eF9hdHRyLCBuYW1lKTsKKyAgICAgICAgaWYgKHYgIT0gTlVMTCkgeworICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIHY7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFB5X0ZpbmRNZXRob2QoWHhvX21ldGhvZHMsIChQeU9iamVjdCAqKXNlbGYsIG5hbWUpOworfQorCitzdGF0aWMgaW50CitYeG9fc2V0YXR0cihYeG9PYmplY3QgKnNlbGYsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICp2KQoreworICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkgeworICAgICAgICBzZWxmLT54X2F0dHIgPSBQeURpY3RfTmV3KCk7CisgICAgICAgIGlmIChzZWxmLT54X2F0dHIgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKHYgPT0gTlVMTCkgeworICAgICAgICBpbnQgcnYgPSBQeURpY3RfRGVsSXRlbVN0cmluZyhzZWxmLT54X2F0dHIsIG5hbWUpOworICAgICAgICBpZiAocnYgPCAwKQorICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICJkZWxldGUgbm9uLWV4aXN0aW5nIFh4byBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIHJ2OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIHJldHVybiBQeURpY3RfU2V0SXRlbVN0cmluZyhzZWxmLT54X2F0dHIsIG5hbWUsIHYpOworfQorCitzdGF0aWMgUHlUeXBlT2JqZWN0IFh4b19UeXBlID0geworICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAieHhtb2R1bGUuWHhvIiwgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICBzaXplb2YoWHhvT2JqZWN0KSwgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgKGRlc3RydWN0b3IpWHhvX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIChnZXRhdHRyZnVuYylYeG9fZ2V0YXR0ciwgLyp0cF9nZXRhdHRyKi8KKyAgICAoc2V0YXR0cmZ1bmMpWHhvX3NldGF0dHIsIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9jYWxsKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9zZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgIC8qdHBfZmxhZ3MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3RyYXZlcnNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX3dlYWtsaXN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbWV0aG9kcyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX3NldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYWxsb2MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXNfZ2MqLworfTsKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBGdW5jdGlvbiBvZiB0d28gaW50ZWdlcnMgcmV0dXJuaW5nIGludGVnZXIgKi8KKworUHlEb2NfU1RSVkFSKHh4X2Zvb19kb2MsCisiZm9vKGksailcblwKK1xuXAorUmV0dXJuIHRoZSBzdW0gb2YgaSBhbmQgai4iKTsKKworc3RhdGljIFB5T2JqZWN0ICoKK3h4X2ZvbyhQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisgICAgbG9uZyBpLCBqOworICAgIGxvbmcgcmVzOworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAibGw6Zm9vIiwgJmksICZqKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzID0gaStqOyAvKiBYWFggRG8gc29tZXRoaW5nIGhlcmUgKi8KKyAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocmVzKTsKK30KKworCisvKiBGdW5jdGlvbiBvZiBubyBhcmd1bWVudHMgcmV0dXJuaW5nIG5ldyBYeG8gb2JqZWN0ICovCisKK3N0YXRpYyBQeU9iamVjdCAqCit4eF9uZXcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFh4b09iamVjdCAqcnY7CisKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIjpuZXciKSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcnYgPSBuZXdYeG9PYmplY3QoYXJncyk7CisgICAgaWYgKHJ2ID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHJldHVybiAoUHlPYmplY3QgKilydjsKK30KKworLyogRXhhbXBsZSB3aXRoIHN1YnRsZSBidWcgZnJvbSBleHRlbnNpb25zIG1hbnVhbCAoIlRoaW4gSWNlIikuICovCisKK3N0YXRpYyBQeU9iamVjdCAqCit4eF9idWcoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICAgIFB5T2JqZWN0ICpsaXN0LCAqaXRlbTsKKworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiTzpidWciLCAmbGlzdCkpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaXRlbSA9IFB5TGlzdF9HZXRJdGVtKGxpc3QsIDApOworICAgIC8qIFB5X0lOQ1JFRihpdGVtKTsgKi8KKyAgICBQeUxpc3RfU2V0SXRlbShsaXN0LCAxLCBQeUludF9Gcm9tTG9uZygwTCkpOworICAgIFB5T2JqZWN0X1ByaW50KGl0ZW0sIHN0ZG91dCwgMCk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIC8qIFB5X0RFQ1JFRihpdGVtKTsgKi8KKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR1cm4gUHlfTm9uZTsKK30KKworLyogVGVzdCBiYWQgZm9ybWF0IGNoYXJhY3RlciAqLworCitzdGF0aWMgUHlPYmplY3QgKgoreHhfcm9qKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgICBQeU9iamVjdCAqYTsKKyAgICBsb25nIGI7CisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPIzpyb2oiLCAmYSwgJmIpKQorICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dXJuIFB5X05vbmU7Cit9CisKKworLyogLS0tLS0tLS0tLSAqLworCitzdGF0aWMgUHlUeXBlT2JqZWN0IFN0cl9UeXBlID0geworICAgIC8qIFRoZSBvYl90eXBlIGZpZWxkIG11c3QgYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIG1vZHVsZSBpbml0IGZ1bmN0aW9uCisgICAgICogdG8gYmUgcG9ydGFibGUgdG8gV2luZG93cyB3aXRob3V0IHVzaW5nIEMrKy4gKi8KKyAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyAgICAieHhtb2R1bGUuU3RyIiwgICAgICAgICAgICAgLyp0cF9uYW1lKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9iYXNpY3NpemUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZW1zaXplKi8KKyAgICAvKiBtZXRob2RzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcHJpbnQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NvbXBhcmUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3JlcHIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfc2VxdWVuY2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX21hcHBpbmcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2gqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3N0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19idWZmZXIqLworICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsIC8qdHBfZmxhZ3MqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfdHJhdmVyc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NsZWFyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yaWNoY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfd2Vha2xpc3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXIqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2l0ZXJuZXh0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZXRob2RzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9tZW1iZXJzKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRzZXQqLworICAgIDAsIC8qIHNlZSBpbml0eHggKi8gICAgICAgICAvKnRwX2Jhc2UqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3QqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Rlc2NyX2dldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3Jfc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kaWN0b2Zmc2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pbml0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hbGxvYyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfbmV3Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9mcmVlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9pc19nYyovCit9OworCisvKiAtLS0tLS0tLS0tICovCisKK3N0YXRpYyBQeU9iamVjdCAqCitudWxsX3JpY2hjb21wYXJlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqb3RoZXIsIGludCBvcCkKK3sKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKK30KKworc3RhdGljIFB5VHlwZU9iamVjdCBOdWxsX1R5cGUgPSB7CisgICAgLyogVGhlIG9iX3R5cGUgZmllbGQgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgbW9kdWxlIGluaXQgZnVuY3Rpb24KKyAgICAgKiB0byBiZSBwb3J0YWJsZSB0byBXaW5kb3dzIHdpdGhvdXQgdXNpbmcgQysrLiAqLworICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorICAgICJ4eG1vZHVsZS5OdWxsIiwgICAgICAgICAgICAvKnRwX25hbWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2Jhc2ljc2l6ZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworICAgIC8qIG1ldGhvZHMgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZWFsbG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZ2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0ciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfcmVwciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbnVtYmVyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfYXNfbWFwcGluZyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaGFzaCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2FsbCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRybyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc2V0YXR0cm8qLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19CQVNFVFlQRSwgLyp0cF9mbGFncyovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZG9jKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF90cmF2ZXJzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY2xlYXIqLworICAgIG51bGxfcmljaGNvbXBhcmUsICAgICAgICAgICAvKnRwX3JpY2hjb21wYXJlKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF93ZWFrbGlzdG9mZnNldCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlciovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlcm5leHQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21ldGhvZHMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX21lbWJlcnMqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldHNldCovCisgICAgMCwgLyogc2VlIGluaXR4eCAqLyAgICAgICAgIC8qdHBfYmFzZSovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGljdCovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVzY3JfZ2V0Ki8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9kZXNjcl9zZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2RpY3RvZmZzZXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2luaXQqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FsbG9jKi8KKyAgICAwLCAvKiBzZWUgaW5pdHh4ICovICAgICAgICAgLyp0cF9uZXcqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2ZyZWUqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2lzX2djKi8KK307CisKKworLyogLS0tLS0tLS0tLSAqLworCisKKy8qIExpc3Qgb2YgZnVuY3Rpb25zIGRlZmluZWQgaW4gdGhlIG1vZHVsZSAqLworCitzdGF0aWMgUHlNZXRob2REZWYgeHhfbWV0aG9kc1tdID0geworICAgIHsicm9qIiwgICAgICAgICAgICAgeHhfcm9qLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgUHlEb2NfU1RSKCJyb2ooYSxiKSAtPiBOb25lIil9LAorICAgIHsiZm9vIiwgICAgICAgICAgICAgeHhfZm9vLCAgICAgICAgIE1FVEhfVkFSQVJHUywKKyAgICAgICAgeHhfZm9vX2RvY30sCisgICAgeyJuZXciLCAgICAgICAgICAgICB4eF9uZXcsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoIm5ldygpIC0+IG5ldyBYeCBvYmplY3QiKX0sCisgICAgeyJidWciLCAgICAgICAgICAgICB4eF9idWcsICAgICAgICAgTUVUSF9WQVJBUkdTLAorICAgICAgICBQeURvY19TVFIoImJ1ZyhvKSAtPiBOb25lIil9LAorICAgIHtOVUxMLCAgICAgICAgICAgICAgTlVMTH0gICAgICAgICAgIC8qIHNlbnRpbmVsICovCit9OworCitQeURvY19TVFJWQVIobW9kdWxlX2RvYywKKyJUaGlzIGlzIGEgdGVtcGxhdGUgbW9kdWxlIGp1c3QgZm9yIGluc3RydWN0aW9uLiIpOworCisvKiBJbml0aWFsaXphdGlvbiBmdW5jdGlvbiBmb3IgdGhlIG1vZHVsZSAoKm11c3QqIGJlIGNhbGxlZCBpbml0eHgpICovCisKK1B5TU9ESU5JVF9GVU5DCitpbml0eHgodm9pZCkKK3sKKyAgICBQeU9iamVjdCAqbTsKKworICAgIC8qIER1ZSB0byBjcm9zcyBwbGF0Zm9ybSBjb21waWxlciBpc3N1ZXMgdGhlIHNsb3RzIG11c3QgYmUgZmlsbGVkCisgICAgICogaGVyZS4gSXQncyByZXF1aXJlZCBmb3IgcG9ydGFiaWxpdHkgdG8gV2luZG93cyB3aXRob3V0IHJlcXVpcmluZworICAgICAqIEMrKy4gKi8KKyAgICBOdWxsX1R5cGUudHBfYmFzZSA9ICZQeUJhc2VPYmplY3RfVHlwZTsKKyAgICBOdWxsX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7CisgICAgU3RyX1R5cGUudHBfYmFzZSA9ICZQeVVuaWNvZGVfVHlwZTsKKworICAgIC8qIEZpbmFsaXplIHRoZSB0eXBlIG9iamVjdCBpbmNsdWRpbmcgc2V0dGluZyB0eXBlIG9mIHRoZSBuZXcgdHlwZQorICAgICAqIG9iamVjdDsgZG9pbmcgaXQgaGVyZSBpcyByZXF1aXJlZCBmb3IgcG9ydGFiaWxpdHksIHRvby4gKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZYeG9fVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisKKyAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBhbmQgYWRkIHRoZSBmdW5jdGlvbnMgKi8KKyAgICBtID0gUHlfSW5pdE1vZHVsZTMoInh4IiwgeHhfbWV0aG9kcywgbW9kdWxlX2RvYyk7CisgICAgaWYgKG0gPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLyogQWRkIHNvbWUgc3ltYm9saWMgY29uc3RhbnRzIHRvIHRoZSBtb2R1bGUgKi8KKyAgICBpZiAoRXJyb3JPYmplY3QgPT0gTlVMTCkgeworICAgICAgICBFcnJvck9iamVjdCA9IFB5RXJyX05ld0V4Y2VwdGlvbigieHguZXJyb3IiLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgaWYgKEVycm9yT2JqZWN0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIFB5X0lOQ1JFRihFcnJvck9iamVjdCk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJlcnJvciIsIEVycm9yT2JqZWN0KTsKKworICAgIC8qIEFkZCBTdHIgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZTdHJfVHlwZSkgPCAwKQorICAgICAgICByZXR1cm47CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJTdHIiLCAoUHlPYmplY3QgKikmU3RyX1R5cGUpOworCisgICAgLyogQWRkIE51bGwgKi8KKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZOdWxsX1R5cGUpIDwgMCkKKyAgICAgICAgcmV0dXJuOworICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTnVsbCIsIChQeU9iamVjdCAqKSZOdWxsX1R5cGUpOworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGV4dF9maWxlLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdGV4dF9maWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YTc5OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXh0X2ZpbGUucHkKQEAgLTAsMCArMSwzMDQgQEAKKyIiInRleHRfZmlsZQorCitwcm92aWRlcyB0aGUgVGV4dEZpbGUgY2xhc3MsIHdoaWNoIGdpdmVzIGFuIGludGVyZmFjZSB0byB0ZXh0IGZpbGVzCit0aGF0IChvcHRpb25hbGx5KSB0YWtlcyBjYXJlIG9mIHN0cmlwcGluZyBjb21tZW50cywgaWdub3JpbmcgYmxhbmsKK2xpbmVzLCBhbmQgam9pbmluZyBsaW5lcyB3aXRoIGJhY2tzbGFzaGVzLiIiIgorCitfX3JldmlzaW9uX18gPSAiJElkJCIKKworaW1wb3J0IHN5cworCisKK2NsYXNzIFRleHRGaWxlOgorCisgICAgIiIiUHJvdmlkZXMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRoYXQgdGFrZXMgY2FyZSBvZiBhbGwgdGhlIHRoaW5ncyB5b3UKKyAgICAgICBjb21tb25seSB3YW50IHRvIGRvIHdoZW4gcHJvY2Vzc2luZyBhIHRleHQgZmlsZSB0aGF0IGhhcyBzb21lCisgICAgICAgbGluZS1ieS1saW5lIHN5bnRheDogc3RyaXAgY29tbWVudHMgKGFzIGxvbmcgYXMgIiMiIGlzIHlvdXIKKyAgICAgICBjb21tZW50IGNoYXJhY3RlciksIHNraXAgYmxhbmsgbGluZXMsIGpvaW4gYWRqYWNlbnQgbGluZXMgYnkKKyAgICAgICBlc2NhcGluZyB0aGUgbmV3bGluZSAoaWUuIGJhY2tzbGFzaCBhdCBlbmQgb2YgbGluZSksIHN0cmlwCisgICAgICAgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgd2hpdGVzcGFjZS4gIEFsbCBvZiB0aGVzZSBhcmUgb3B0aW9uYWwKKyAgICAgICBhbmQgaW5kZXBlbmRlbnRseSBjb250cm9sbGFibGUuCisKKyAgICAgICBQcm92aWRlcyBhICd3YXJuKCknIG1ldGhvZCBzbyB5b3UgY2FuIGdlbmVyYXRlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdAorICAgICAgIHJlcG9ydCBwaHlzaWNhbCBsaW5lIG51bWJlciwgZXZlbiBpZiB0aGUgbG9naWNhbCBsaW5lIGluIHF1ZXN0aW9uCisgICAgICAgc3BhbnMgbXVsdGlwbGUgcGh5c2ljYWwgbGluZXMuICBBbHNvIHByb3ZpZGVzICd1bnJlYWRsaW5lKCknIGZvcgorICAgICAgIGltcGxlbWVudGluZyBsaW5lLWF0LWEtdGltZSBsb29rYWhlYWQuCisKKyAgICAgICBDb25zdHJ1Y3RvciBpcyBjYWxsZWQgYXM6CisKKyAgICAgICAgICAgVGV4dEZpbGUgKGZpbGVuYW1lPU5vbmUsIGZpbGU9Tm9uZSwgKipvcHRpb25zKQorCisgICAgICAgSXQgYm9tYnMgKFJ1bnRpbWVFcnJvcikgaWYgYm90aCAnZmlsZW5hbWUnIGFuZCAnZmlsZScgYXJlIE5vbmU7CisgICAgICAgJ2ZpbGVuYW1lJyBzaG91bGQgYmUgYSBzdHJpbmcsIGFuZCAnZmlsZScgYSBmaWxlIG9iamVjdCAob3IKKyAgICAgICBzb21ldGhpbmcgdGhhdCBwcm92aWRlcyAncmVhZGxpbmUoKScgYW5kICdjbG9zZSgpJyBtZXRob2RzKS4gIEl0IGlzCisgICAgICAgcmVjb21tZW5kZWQgdGhhdCB5b3Ugc3VwcGx5IGF0IGxlYXN0ICdmaWxlbmFtZScsIHNvIHRoYXQgVGV4dEZpbGUKKyAgICAgICBjYW4gaW5jbHVkZSBpdCBpbiB3YXJuaW5nIG1lc3NhZ2VzLiAgSWYgJ2ZpbGUnIGlzIG5vdCBzdXBwbGllZCwKKyAgICAgICBUZXh0RmlsZSBjcmVhdGVzIGl0cyBvd24gdXNpbmcgdGhlICdvcGVuKCknIGJ1aWx0aW4uCisKKyAgICAgICBUaGUgb3B0aW9ucyBhcmUgYWxsIGJvb2xlYW4sIGFuZCBhZmZlY3QgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgICAgICAgJ3JlYWRsaW5lKCknOgorICAgICAgICAgc3RyaXBfY29tbWVudHMgW2RlZmF1bHQ6IHRydWVdCisgICAgICAgICAgIHN0cmlwIGZyb20gIiMiIHRvIGVuZC1vZi1saW5lLCBhcyB3ZWxsIGFzIGFueSB3aGl0ZXNwYWNlCisgICAgICAgICAgIGxlYWRpbmcgdXAgdG8gdGhlICIjIiAtLSB1bmxlc3MgaXQgaXMgZXNjYXBlZCBieSBhIGJhY2tzbGFzaAorICAgICAgICAgbHN0cmlwX3dzIFtkZWZhdWx0OiBmYWxzZV0KKyAgICAgICAgICAgc3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZWFjaCBsaW5lIGJlZm9yZSByZXR1cm5pbmcgaXQKKyAgICAgICAgIHJzdHJpcF93cyBbZGVmYXVsdDogdHJ1ZV0KKyAgICAgICAgICAgc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZSAoaW5jbHVkaW5nIGxpbmUgdGVybWluYXRvciEpIGZyb20KKyAgICAgICAgICAgZWFjaCBsaW5lIGJlZm9yZSByZXR1cm5pbmcgaXQKKyAgICAgICAgIHNraXBfYmxhbmtzIFtkZWZhdWx0OiB0cnVlfQorICAgICAgICAgICBza2lwIGxpbmVzIHRoYXQgYXJlIGVtcHR5ICphZnRlciogc3RyaXBwaW5nIGNvbW1lbnRzIGFuZAorICAgICAgICAgICB3aGl0ZXNwYWNlLiAgKElmIGJvdGggbHN0cmlwX3dzIGFuZCByc3RyaXBfd3MgYXJlIGZhbHNlLAorICAgICAgICAgICB0aGVuIHNvbWUgbGluZXMgbWF5IGNvbnNpc3Qgb2Ygc29sZWx5IHdoaXRlc3BhY2U6IHRoZXNlIHdpbGwKKyAgICAgICAgICAgKm5vdCogYmUgc2tpcHBlZCwgZXZlbiBpZiAnc2tpcF9ibGFua3MnIGlzIHRydWUuKQorICAgICAgICAgam9pbl9saW5lcyBbZGVmYXVsdDogZmFsc2VdCisgICAgICAgICAgIGlmIGEgYmFja3NsYXNoIGlzIHRoZSBsYXN0IG5vbi1uZXdsaW5lIGNoYXJhY3RlciBvbiBhIGxpbmUKKyAgICAgICAgICAgYWZ0ZXIgc3RyaXBwaW5nIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlLCBqb2luIHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAgICB0byBpdCB0byBmb3JtIG9uZSAibG9naWNhbCBsaW5lIjsgaWYgTiBjb25zZWN1dGl2ZSBsaW5lcyBlbmQKKyAgICAgICAgICAgd2l0aCBhIGJhY2tzbGFzaCwgdGhlbiBOKzEgcGh5c2ljYWwgbGluZXMgd2lsbCBiZSBqb2luZWQgdG8KKyAgICAgICAgICAgZm9ybSBvbmUgbG9naWNhbCBsaW5lLgorICAgICAgICAgY29sbGFwc2Vfam9pbiBbZGVmYXVsdDogZmFsc2VdCisgICAgICAgICAgIHN0cmlwIGxlYWRpbmcgd2hpdGVzcGFjZSBmcm9tIGxpbmVzIHRoYXQgYXJlIGpvaW5lZCB0byB0aGVpcgorICAgICAgICAgICBwcmVkZWNlc3Nvcjsgb25seSBtYXR0ZXJzIGlmIChqb2luX2xpbmVzIGFuZCBub3QgbHN0cmlwX3dzKQorCisgICAgICAgTm90ZSB0aGF0IHNpbmNlICdyc3RyaXBfd3MnIGNhbiBzdHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZSwgdGhlCisgICAgICAgc2VtYW50aWNzIG9mICdyZWFkbGluZSgpJyBtdXN0IGRpZmZlciBmcm9tIHRob3NlIG9mIHRoZSBidWlsdGluIGZpbGUKKyAgICAgICBvYmplY3QncyAncmVhZGxpbmUoKScgbWV0aG9kISAgSW4gcGFydGljdWxhciwgJ3JlYWRsaW5lKCknIHJldHVybnMKKyAgICAgICBOb25lIGZvciBlbmQtb2YtZmlsZTogYW4gZW1wdHkgc3RyaW5nIG1pZ2h0IGp1c3QgYmUgYSBibGFuayBsaW5lIChvcgorICAgICAgIGFuIGFsbC13aGl0ZXNwYWNlIGxpbmUpLCBpZiAncnN0cmlwX3dzJyBpcyB0cnVlIGJ1dCAnc2tpcF9ibGFua3MnIGlzCisgICAgICAgbm90LiIiIgorCisgICAgZGVmYXVsdF9vcHRpb25zID0geyAnc3RyaXBfY29tbWVudHMnOiAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NraXBfYmxhbmtzJzogICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdsc3RyaXBfd3MnOiAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAncnN0cmlwX3dzJzogICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2pvaW5fbGluZXMnOiAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICdjb2xsYXBzZV9qb2luJzogIDAsCisgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBmaWxlbmFtZT1Ob25lLCBmaWxlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIG5ldyBUZXh0RmlsZSBvYmplY3QuICBBdCBsZWFzdCBvbmUgb2YgJ2ZpbGVuYW1lJworICAgICAgICAgICAoYSBzdHJpbmcpIGFuZCAnZmlsZScgKGEgZmlsZS1saWtlIG9iamVjdCkgbXVzdCBiZSBzdXBwbGllZC4KKyAgICAgICAgICAgVGhleSBrZXl3b3JkIGFyZ3VtZW50IG9wdGlvbnMgYXJlIGRlc2NyaWJlZCBhYm92ZSBhbmQgYWZmZWN0CisgICAgICAgICAgIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgJ3JlYWRsaW5lKCknLiIiIgorCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmUgYW5kIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgInlvdSBtdXN0IHN1cHBseSBlaXRoZXIgb3IgYm90aCBvZiAnZmlsZW5hbWUnIGFuZCAnZmlsZSciCisKKyAgICAgICAgIyBzZXQgdmFsdWVzIGZvciBhbGwgb3B0aW9ucyAtLSBlaXRoZXIgZnJvbSBjbGllbnQgb3B0aW9uIGhhc2gKKyAgICAgICAgIyBvciBmYWxsYmFjayB0byBkZWZhdWx0X29wdGlvbnMKKyAgICAgICAgZm9yIG9wdCBpbiBzZWxmLmRlZmF1bHRfb3B0aW9ucy5rZXlzKCk6CisgICAgICAgICAgICBpZiBvcHQgaW4gb3B0aW9uczoKKyAgICAgICAgICAgICAgICBzZXRhdHRyIChzZWxmLCBvcHQsIG9wdGlvbnNbb3B0XSkKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZXRhdHRyIChzZWxmLCBvcHQsIHNlbGYuZGVmYXVsdF9vcHRpb25zW29wdF0pCisKKyAgICAgICAgIyBzYW5pdHkgY2hlY2sgY2xpZW50IG9wdGlvbiBoYXNoCisgICAgICAgIGZvciBvcHQgaW4gb3B0aW9ucy5rZXlzKCk6CisgICAgICAgICAgICBpZiBvcHQgbm90IGluIHNlbGYuZGVmYXVsdF9vcHRpb25zOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCAiaW52YWxpZCBUZXh0RmlsZSBvcHRpb24gJyVzJyIgJSBvcHQKKworICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLm9wZW4gKGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfbGluZSA9IDAgICAgICAgIyBhc3N1bWluZyB0aGF0IGZpbGUgaXMgYXQgQk9GIQorCisgICAgICAgICMgJ2xpbmVidWYnIGlzIGEgc3RhY2sgb2YgbGluZXMgdGhhdCB3aWxsIGJlIGVtcHRpZWQgYmVmb3JlIHdlCisgICAgICAgICMgYWN0dWFsbHkgcmVhZCBmcm9tIHRoZSBmaWxlOyBpdCdzIG9ubHkgcG9wdWxhdGVkIGJ5IGFuCisgICAgICAgICMgJ3VucmVhZGxpbmUoKScgb3BlcmF0aW9uCisgICAgICAgIHNlbGYubGluZWJ1ZiA9IFtdCisKKworICAgIGRlZiBvcGVuIChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIk9wZW4gYSBuZXcgZmlsZSBuYW1lZCAnZmlsZW5hbWUnLiAgVGhpcyBvdmVycmlkZXMgYm90aCB0aGUKKyAgICAgICAgICAgJ2ZpbGVuYW1lJyBhbmQgJ2ZpbGUnIGFyZ3VtZW50cyB0byB0aGUgY29uc3RydWN0b3IuIiIiCisKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4gKHNlbGYuZmlsZW5hbWUsICdyJykKKyAgICAgICAgc2VsZi5jdXJyZW50X2xpbmUgPSAwCisKKworICAgIGRlZiBjbG9zZSAoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBjdXJyZW50IGZpbGUgYW5kIGZvcmdldCBldmVyeXRoaW5nIHdlIGtub3cgYWJvdXQgaXQKKyAgICAgICAgICAgKGZpbGVuYW1lLCBjdXJyZW50IGxpbmUgbnVtYmVyKS4iIiIKKworICAgICAgICBzZWxmLmZpbGUuY2xvc2UgKCkKKyAgICAgICAgc2VsZi5maWxlID0gTm9uZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gTm9uZQorICAgICAgICBzZWxmLmN1cnJlbnRfbGluZSA9IE5vbmUKKworCisgICAgZGVmIGdlbl9lcnJvciAoc2VsZiwgbXNnLCBsaW5lPU5vbmUpOgorICAgICAgICBvdXRtc2cgPSBbXQorICAgICAgICBpZiBsaW5lIGlzIE5vbmU6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5jdXJyZW50X2xpbmUKKyAgICAgICAgb3V0bXNnLmFwcGVuZChzZWxmLmZpbGVuYW1lICsgIiwgIikKKyAgICAgICAgaWYgaXNpbnN0YW5jZShsaW5lLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIG91dG1zZy5hcHBlbmQoImxpbmVzICVkLSVkOiAiICUgdHVwbGUgKGxpbmUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0bXNnLmFwcGVuZCgibGluZSAlZDogIiAlIGxpbmUpCisgICAgICAgIG91dG1zZy5hcHBlbmQoc3RyKG1zZykpCisgICAgICAgIHJldHVybiAnJy5qb2luKG91dG1zZykKKworCisgICAgZGVmIGVycm9yIChzZWxmLCBtc2csIGxpbmU9Tm9uZSk6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJlcnJvcjogIiArIHNlbGYuZ2VuX2Vycm9yKG1zZywgbGluZSkKKworICAgIGRlZiB3YXJuIChzZWxmLCBtc2csIGxpbmU9Tm9uZSk6CisgICAgICAgICIiIlByaW50ICh0byBzdGRlcnIpIGEgd2FybmluZyBtZXNzYWdlIHRpZWQgdG8gdGhlIGN1cnJlbnQgbG9naWNhbAorICAgICAgICAgICBsaW5lIGluIHRoZSBjdXJyZW50IGZpbGUuICBJZiB0aGUgY3VycmVudCBsb2dpY2FsIGxpbmUgaW4gdGhlCisgICAgICAgICAgIGZpbGUgc3BhbnMgbXVsdGlwbGUgcGh5c2ljYWwgbGluZXMsIHRoZSB3YXJuaW5nIHJlZmVycyB0byB0aGUKKyAgICAgICAgICAgd2hvbGUgcmFuZ2UsIGVnLiAibGluZXMgMy01Ii4gIElmICdsaW5lJyBzdXBwbGllZCwgaXQgb3ZlcnJpZGVzCisgICAgICAgICAgIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyOyBpdCBtYXkgYmUgYSBsaXN0IG9yIHR1cGxlIHRvIGluZGljYXRlIGEKKyAgICAgICAgICAgcmFuZ2Ugb2YgcGh5c2ljYWwgbGluZXMsIG9yIGFuIGludGVnZXIgZm9yIGEgc2luZ2xlIHBoeXNpY2FsCisgICAgICAgICAgIGxpbmUuIiIiCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIndhcm5pbmc6ICIgKyBzZWxmLmdlbl9lcnJvcihtc2csIGxpbmUpICsgIlxuIikKKworCisgICAgZGVmIHJlYWRsaW5lIChzZWxmKToKKyAgICAgICAgIiIiUmVhZCBhbmQgcmV0dXJuIGEgc2luZ2xlIGxvZ2ljYWwgbGluZSBmcm9tIHRoZSBjdXJyZW50IGZpbGUgKG9yCisgICAgICAgICAgIGZyb20gYW4gaW50ZXJuYWwgYnVmZmVyIGlmIGxpbmVzIGhhdmUgcHJldmlvdXNseSBiZWVuICJ1bnJlYWQiCisgICAgICAgICAgIHdpdGggJ3VucmVhZGxpbmUoKScpLiAgSWYgdGhlICdqb2luX2xpbmVzJyBvcHRpb24gaXMgdHJ1ZSwgdGhpcworICAgICAgICAgICBtYXkgaW52b2x2ZSByZWFkaW5nIG11bHRpcGxlIHBoeXNpY2FsIGxpbmVzIGNvbmNhdGVuYXRlZCBpbnRvIGEKKyAgICAgICAgICAgc2luZ2xlIHN0cmluZy4gIFVwZGF0ZXMgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIsIHNvIGNhbGxpbmcKKyAgICAgICAgICAgJ3dhcm4oKScgYWZ0ZXIgJ3JlYWRsaW5lKCknIGVtaXRzIGEgd2FybmluZyBhYm91dCB0aGUgcGh5c2ljYWwKKyAgICAgICAgICAgbGluZShzKSBqdXN0IHJlYWQuICBSZXR1cm5zIE5vbmUgb24gZW5kLW9mLWZpbGUsIHNpbmNlIHRoZSBlbXB0eQorICAgICAgICAgICBzdHJpbmcgY2FuIG9jY3VyIGlmICdyc3RyaXBfd3MnIGlzIHRydWUgYnV0ICdzdHJpcF9ibGFua3MnIGlzCisgICAgICAgICAgIG5vdC4iIiIKKworICAgICAgICAjIElmIGFueSAidW5yZWFkIiBsaW5lcyB3YWl0aW5nIGluICdsaW5lYnVmJywgcmV0dXJuIHRoZSB0b3AKKyAgICAgICAgIyBvbmUuICAoV2UgZG9uJ3QgYWN0dWFsbHkgYnVmZmVyIHJlYWQtYWhlYWQgZGF0YSAtLSBsaW5lcyBvbmx5CisgICAgICAgICMgZ2V0IHB1dCBpbiAnbGluZWJ1ZicgaWYgdGhlIGNsaWVudCBleHBsaWNpdGx5IGRvZXMgYW4KKyAgICAgICAgIyAndW5yZWFkbGluZSgpJy4KKyAgICAgICAgaWYgc2VsZi5saW5lYnVmOgorICAgICAgICAgICAgbGluZSA9IHNlbGYubGluZWJ1ZlstMV0KKyAgICAgICAgICAgIGRlbCBzZWxmLmxpbmVidWZbLTFdCisgICAgICAgICAgICByZXR1cm4gbGluZQorCisgICAgICAgIGJ1aWxkdXBfbGluZSA9ICcnCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgcmVhZCB0aGUgbGluZSwgbWFrZSBpdCBOb25lIGlmIEVPRgorICAgICAgICAgICAgbGluZSA9IHNlbGYuZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsaW5lID09ICcnOiBsaW5lID0gTm9uZQorCisgICAgICAgICAgICBpZiBzZWxmLnN0cmlwX2NvbW1lbnRzIGFuZCBsaW5lOgorCisgICAgICAgICAgICAgICAgIyBMb29rIGZvciB0aGUgZmlyc3QgIiMiIGluIHRoZSBsaW5lLiAgSWYgbm9uZSwgbmV2ZXIKKyAgICAgICAgICAgICAgICAjIG1pbmQuICBJZiB3ZSBmaW5kIG9uZSBhbmQgaXQncyB0aGUgZmlyc3QgY2hhcmFjdGVyLCBvcgorICAgICAgICAgICAgICAgICMgaXMgbm90IHByZWNlZGVkIGJ5ICJcIiwgdGhlbiBpdCBzdGFydHMgYSBjb21tZW50IC0tCisgICAgICAgICAgICAgICAgIyBzdHJpcCB0aGUgY29tbWVudCwgc3RyaXAgd2hpdGVzcGFjZSBiZWZvcmUgaXQsIGFuZAorICAgICAgICAgICAgICAgICMgY2Fycnkgb24uICBPdGhlcndpc2UsIGl0J3MganVzdCBhbiBlc2NhcGVkICIjIiwgc28KKyAgICAgICAgICAgICAgICAjIHVuZXNjYXBlIGl0IChhbmQgYW55IG90aGVyIGVzY2FwZWQgIiMiJ3MgdGhhdCBtaWdodCBiZQorICAgICAgICAgICAgICAgICMgbHVya2luZyBpbiB0aGVyZSkgYW5kIG90aGVyd2lzZSBsZWF2ZSB0aGUgbGluZSBhbG9uZS4KKworICAgICAgICAgICAgICAgIHBvcyA9IGxpbmUuZmluZCgiIyIpCisgICAgICAgICAgICAgICAgaWYgcG9zID09IC0xOiAgICAgICAgICAgIyBubyAiIyIgLS0gbm8gY29tbWVudHMKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAgIyBJdCdzIGRlZmluaXRlbHkgYSBjb21tZW50IC0tIGVpdGhlciAiIyIgaXMgdGhlIGZpcnN0CisgICAgICAgICAgICAgICAgIyBjaGFyYWN0ZXIsIG9yIGl0J3MgZWxzZXdoZXJlIGFuZCB1bmVzY2FwZWQuCisgICAgICAgICAgICAgICAgZWxpZiBwb3MgPT0gMCBvciBsaW5lW3Bvcy0xXSAhPSAiXFwiOgorICAgICAgICAgICAgICAgICAgICAjIEhhdmUgdG8gcHJlc2VydmUgdGhlIHRyYWlsaW5nIG5ld2xpbmUsIGJlY2F1c2UgaXQncworICAgICAgICAgICAgICAgICAgICAjIHRoZSBqb2Igb2YgYSBsYXRlciBzdGVwIChyc3RyaXBfd3MpIHRvIHJlbW92ZSBpdCAtLQorICAgICAgICAgICAgICAgICAgICAjIGFuZCBpZiByc3RyaXBfd3MgaXMgZmFsc2UsIHdlJ2QgYmV0dGVyIHByZXNlcnZlIGl0IQorICAgICAgICAgICAgICAgICAgICAjIChOQi4gdGhpcyBtZWFucyB0aGF0IGlmIHRoZSBmaW5hbCBsaW5lIGlzIGFsbCBjb21tZW50CisgICAgICAgICAgICAgICAgICAgICMgYW5kIGhhcyBubyB0cmFpbGluZyBuZXdsaW5lLCB3ZSB3aWxsIHRoaW5rIHRoYXQgaXQncworICAgICAgICAgICAgICAgICAgICAjIEVPRjsgSSB0aGluayB0aGF0J3MgT0suKQorICAgICAgICAgICAgICAgICAgICBlb2wgPSAobGluZVstMV0gPT0gJ1xuJykgYW5kICdcbicgb3IgJycKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMDpwb3NdICsgZW9sCisKKyAgICAgICAgICAgICAgICAgICAgIyBJZiBhbGwgdGhhdCdzIGxlZnQgaXMgd2hpdGVzcGFjZSwgdGhlbiBza2lwIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgIyAqbm93KiwgYmVmb3JlIHdlIHRyeSB0byBqb2luIGl0IHRvICdidWlsZHVwX2xpbmUnIC0tCisgICAgICAgICAgICAgICAgICAgICMgdGhhdCB3YXkgY29uc3RydWN0cyBsaWtlCisgICAgICAgICAgICAgICAgICAgICMgICBoZWxsbyBcXAorICAgICAgICAgICAgICAgICAgICAjICAgIyBjb21tZW50IHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgIyAgIHRoZXJlCisgICAgICAgICAgICAgICAgICAgICMgcmVzdWx0IGluICJoZWxsbyB0aGVyZSIuCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RyaXAoKSA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAjIGl0J3MgYW4gZXNjYXBlZCAiIyIKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgiXFwjIiwgIiMiKQorCisKKyAgICAgICAgICAgICMgZGlkIHByZXZpb3VzIGxpbmUgZW5kIHdpdGggYSBiYWNrc2xhc2g/IHRoZW4gYWNjdW11bGF0ZQorICAgICAgICAgICAgaWYgc2VsZi5qb2luX2xpbmVzIGFuZCBidWlsZHVwX2xpbmU6CisgICAgICAgICAgICAgICAgIyBvb3BzOiBlbmQgb2YgZmlsZQorICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuICgiY29udGludWF0aW9uIGxpbmUgaW1tZWRpYXRlbHkgcHJlY2VkZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmQtb2YtZmlsZSIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZHVwX2xpbmUKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuY29sbGFwc2Vfam9pbjoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUubHN0cmlwKCkKKyAgICAgICAgICAgICAgICBsaW5lID0gYnVpbGR1cF9saW5lICsgbGluZQorCisgICAgICAgICAgICAgICAgIyBjYXJlZnVsOiBwYXkgYXR0ZW50aW9uIHRvIGxpbmUgbnVtYmVyIHdoZW4gaW5jcmVtZW50aW5nIGl0CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmN1cnJlbnRfbGluZSwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9saW5lWzFdID0gc2VsZi5jdXJyZW50X2xpbmVbMV0gKyAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xpbmUgPSBbc2VsZi5jdXJyZW50X2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudF9saW5lKzFdCisgICAgICAgICAgICAjIGp1c3QgYW4gb3JkaW5hcnkgbGluZSwgcmVhZCBpdCBhcyB1c3VhbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5vbmU6ICAgICAgICAjIGVvZgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICAgICAgICAgIyBzdGlsbCBoYXZlIHRvIGJlIGNhcmVmdWwgYWJvdXQgaW5jcmVtZW50aW5nIHRoZSBsaW5lIG51bWJlciEKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuY3VycmVudF9saW5lLCBsaXN0KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50X2xpbmUgPSBzZWxmLmN1cnJlbnRfbGluZVsxXSArIDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRfbGluZSA9IHNlbGYuY3VycmVudF9saW5lICsgMQorCisKKyAgICAgICAgICAgICMgc3RyaXAgd2hpdGVzcGFjZSBob3dldmVyIHRoZSBjbGllbnQgd2FudHMgKGxlYWRpbmcgYW5kCisgICAgICAgICAgICAjIHRyYWlsaW5nLCBvciBvbmUgb3IgdGhlIG90aGVyLCBvciBuZWl0aGVyKQorICAgICAgICAgICAgaWYgc2VsZi5sc3RyaXBfd3MgYW5kIHNlbGYucnN0cmlwX3dzOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5sc3RyaXBfd3M6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUubHN0cmlwKCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5yc3RyaXBfd3M6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCkKKworICAgICAgICAgICAgIyBibGFuayBsaW5lICh3aGV0aGVyIHdlIHJzdHJpcCdlZCBvciBub3QpPyBza2lwIHRvIG5leHQgbGluZQorICAgICAgICAgICAgIyBpZiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgaWYgKGxpbmUgPT0gJycgb3IgbGluZSA9PSAnXG4nKSBhbmQgc2VsZi5za2lwX2JsYW5rczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBzZWxmLmpvaW5fbGluZXM6CisgICAgICAgICAgICAgICAgaWYgbGluZVstMV0gPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgYnVpbGR1cF9saW5lID0gbGluZVs6LTFdCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBpZiBsaW5lWy0yOl0gPT0gJ1xcXG4nOgorICAgICAgICAgICAgICAgICAgICBidWlsZHVwX2xpbmUgPSBsaW5lWzA6LTJdICsgJ1xuJworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIHdlbGwsIEkgZ3Vlc3MgdGhlcmUncyBzb21lIGFjdHVhbCBjb250ZW50IHRoZXJlOiByZXR1cm4gaXQKKyAgICAgICAgICAgIHJldHVybiBsaW5lCisKKyAgICAjIHJlYWRsaW5lICgpCisKKworICAgIGRlZiByZWFkbGluZXMgKHNlbGYpOgorICAgICAgICAiIiJSZWFkIGFuZCByZXR1cm4gdGhlIGxpc3Qgb2YgYWxsIGxvZ2ljYWwgbGluZXMgcmVtYWluaW5nIGluIHRoZQorICAgICAgICAgICBjdXJyZW50IGZpbGUuIiIiCisKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lcworICAgICAgICAgICAgbGluZXMuYXBwZW5kIChsaW5lKQorCisKKyAgICBkZWYgdW5yZWFkbGluZSAoc2VsZiwgbGluZSk6CisgICAgICAgICIiIlB1c2ggJ2xpbmUnIChhIHN0cmluZykgb250byBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCB3aWxsIGJlCisgICAgICAgICAgIGNoZWNrZWQgYnkgZnV0dXJlICdyZWFkbGluZSgpJyBjYWxscy4gIEhhbmR5IGZvciBpbXBsZW1lbnRpbmcKKyAgICAgICAgICAgYSBwYXJzZXIgd2l0aCBsaW5lLWF0LWEtdGltZSBsb29rYWhlYWQuIiIiCisKKyAgICAgICAgc2VsZi5saW5lYnVmLmFwcGVuZCAobGluZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3RleHRfZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXh0X2ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjc3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXh0X2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3RleHRfZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXh0X2ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNjc3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy90ZXh0X2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMGFiNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CkBAIC0wLDAgKzEsMjkwIEBACisiIiJkaXN0dXRpbHMudW5peGNjb21waWxlcgorCitDb250YWlucyB0aGUgVW5peENDb21waWxlciBjbGFzcywgYSBzdWJjbGFzcyBvZiBDQ29tcGlsZXIgdGhhdCBoYW5kbGVzCit0aGUgInR5cGljYWwiIFVuaXgtc3R5bGUgY29tbWFuZC1saW5lIEMgY29tcGlsZXI6CisgICogbWFjcm9zIGRlZmluZWQgd2l0aCAtRG5hbWVbPXZhbHVlXQorICAqIG1hY3JvcyB1bmRlZmluZWQgd2l0aCAtVW5hbWUKKyAgKiBpbmNsdWRlIHNlYXJjaCBkaXJlY3RvcmllcyBzcGVjaWZpZWQgd2l0aCAtSWRpcgorICAqIGxpYnJhcmllcyBzcGVjaWZpZWQgd2l0aCAtbGxsaWIKKyAgKiBsaWJyYXJ5IHNlYXJjaCBkaXJlY3RvcmllcyBzcGVjaWZpZWQgd2l0aCAtTGRpcgorICAqIGNvbXBpbGUgaGFuZGxlZCBieSAnY2MnIChvciBzaW1pbGFyKSBleGVjdXRhYmxlIHdpdGggLWMgb3B0aW9uOgorICAgIGNvbXBpbGVzIC5jIHRvIC5vCisgICogbGluayBzdGF0aWMgbGlicmFyeSBoYW5kbGVkIGJ5ICdhcicgY29tbWFuZCAocG9zc2libHkgd2l0aCAncmFubGliJykKKyAgKiBsaW5rIHNoYXJlZCBsaWJyYXJ5IGhhbmRsZWQgYnkgJ2NjIC1zaGFyZWQnCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBvcywgc3lzLCByZQorZnJvbSB0eXBlcyBpbXBvcnQgU3RyaW5nVHlwZSwgTm9uZVR5cGUKKworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworZnJvbSBkaXN0dXRpbHMuZGVwX3V0aWwgaW1wb3J0IG5ld2VyCitmcm9tIGRpc3R1dGlscy5jY29tcGlsZXIgaW1wb3J0IFwKKyAgICAgQ0NvbXBpbGVyLCBnZW5fcHJlcHJvY2Vzc19vcHRpb25zLCBnZW5fbGliX29wdGlvbnMKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgXAorICAgICBEaXN0dXRpbHNFeGVjRXJyb3IsIENvbXBpbGVFcnJvciwgTGliRXJyb3IsIExpbmtFcnJvcgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgaW1wb3J0IF9vc3hfc3VwcG9ydAorCisjIFhYWCBUaGluZ3Mgbm90IGN1cnJlbnRseSBoYW5kbGVkOgorIyAgICogb3B0aW1pemF0aW9uL2RlYnVnL3dhcm5pbmcgZmxhZ3M7IHdlIGp1c3QgdXNlIHdoYXRldmVyJ3MgaW4gUHl0aG9uJ3MKKyMgICAgIE1ha2VmaWxlIGFuZCBsaXZlIHdpdGggaXQuICBJcyB0aGlzIGFkZXF1YXRlPyAgSWYgbm90LCB3ZSBtaWdodAorIyAgICAgaGF2ZSB0byBoYXZlIGEgYnVuY2ggb2Ygc3ViY2xhc3NlcyBHTlVDQ29tcGlsZXIsIFNHSUNDb21waWxlciwKKyMgICAgIFN1bkNDb21waWxlciwgYW5kIEkgc3VzcGVjdCBkb3duIHRoYXQgcm9hZCBsaWVzIG1hZG5lc3MuCisjICAgKiBldmVuIGlmIHdlIGRvbid0IGtub3cgYSB3YXJuaW5nIGZsYWcgZnJvbSBhbiBvcHRpbWl6YXRpb24gZmxhZywKKyMgICAgIHdlIG5lZWQgc29tZSB3YXkgZm9yIG91dHNpZGVycyB0byBmZWVkIHByZXByb2Nlc3Nvci9jb21waWxlci9saW5rZXIKKyMgICAgIGZsYWdzIGluIHRvIHVzIC0tIGVnLiBhIHN5c2FkbWluIG1pZ2h0IHdhbnQgdG8gbWFuZGF0ZSBjZXJ0YWluIGZsYWdzCisjICAgICB2aWEgYSBzaXRlIGNvbmZpZyBmaWxlLCBvciBhIHVzZXIgbWlnaHQgd2FudCB0byBzZXQgc29tZXRoaW5nIGZvcgorIyAgICAgY29tcGlsaW5nIHRoaXMgbW9kdWxlIGRpc3RyaWJ1dGlvbiBvbmx5IHZpYSB0aGUgc2V0dXAucHkgY29tbWFuZAorIyAgICAgbGluZSwgd2hhdGV2ZXIuICBBcyBsb25nIGFzIHRoZXNlIG9wdGlvbnMgY29tZSBmcm9tIHNvbWV0aGluZyBvbiB0aGUKKyMgICAgIGN1cnJlbnQgc3lzdGVtLCB0aGV5IGNhbiBiZSBhcyBzeXN0ZW0tZGVwZW5kZW50IGFzIHRoZXkgbGlrZSwgYW5kIHdlCisjICAgICBzaG91bGQganVzdCBoYXBwaWx5IHN0dWZmIHRoZW0gaW50byB0aGUgcHJlcHJvY2Vzc29yL2NvbXBpbGVyL2xpbmtlcgorIyAgICAgb3B0aW9ucyBhbmQgY2Fycnkgb24uCisKKworY2xhc3MgVW5peENDb21waWxlcihDQ29tcGlsZXIpOgorCisgICAgY29tcGlsZXJfdHlwZSA9ICd1bml4JworCisgICAgIyBUaGVzZSBhcmUgdXNlZCBieSBDQ29tcGlsZXIgaW4gdHdvIHBsYWNlczogdGhlIGNvbnN0cnVjdG9yIHNldHMKKyAgICAjIGluc3RhbmNlIGF0dHJpYnV0ZXMgJ3ByZXByb2Nlc3NvcicsICdjb21waWxlcicsIGV0Yy4gZnJvbSB0aGVtLCBhbmQKKyAgICAjICdzZXRfZXhlY3V0YWJsZSgpJyBhbGxvd3MgYW55IG9mIHRoZXNlIHRvIGJlIHNldC4gIFRoZSBkZWZhdWx0cyBoZXJlCisgICAgIyBhcmUgcHJldHR5IGdlbmVyaWM7IHRoZXkgd2lsbCBwcm9iYWJseSBoYXZlIHRvIGJlIHNldCBieSBhbiBvdXRzaWRlcgorICAgICMgKGVnLiB1c2luZyBpbmZvcm1hdGlvbiBkaXNjb3ZlcmVkIGJ5IHRoZSBzeXNjb25maWcgYWJvdXQgYnVpbGRpbmcKKyAgICAjIFB5dGhvbiBleHRlbnNpb25zKS4KKyAgICBleGVjdXRhYmxlcyA9IHsncHJlcHJvY2Vzc29yJyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgJ2NvbXBpbGVyJyAgICAgOiBbImNjIl0sCisgICAgICAgICAgICAgICAgICAgJ2NvbXBpbGVyX3NvJyAgOiBbImNjIl0sCisgICAgICAgICAgICAgICAgICAgJ2NvbXBpbGVyX2N4eCcgOiBbImNjIl0sCisgICAgICAgICAgICAgICAgICAgJ2xpbmtlcl9zbycgICAgOiBbImNjIiwgIi1zaGFyZWQiXSwKKyAgICAgICAgICAgICAgICAgICAnbGlua2VyX2V4ZScgICA6IFsiY2MiXSwKKyAgICAgICAgICAgICAgICAgICAnYXJjaGl2ZXInICAgICA6IFsiYXIiLCAiLWNyIl0sCisgICAgICAgICAgICAgICAgICAgJ3JhbmxpYicgICAgICAgOiBOb25lLAorICAgICAgICAgICAgICAgICAgfQorCisgICAgaWYgc3lzLnBsYXRmb3JtWzo2XSA9PSAiZGFyd2luIjoKKyAgICAgICAgZXhlY3V0YWJsZXNbJ3JhbmxpYiddID0gWyJyYW5saWIiXQorCisgICAgIyBOZWVkZWQgZm9yIHRoZSBmaWxlbmFtZSBnZW5lcmF0aW9uIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIGJhc2UKKyAgICAjIGNsYXNzLCBDQ29tcGlsZXIuICBOQi4gd2hvZXZlciBpbnN0YW50aWF0ZXMvdXNlcyBhIHBhcnRpY3VsYXIKKyAgICAjIFVuaXhDQ29tcGlsZXIgaW5zdGFuY2Ugc2hvdWxkIHNldCAnc2hhcmVkX2xpYl9leHQnIC0tIHdlIHNldCBhCisgICAgIyByZWFzb25hYmxlIGNvbW1vbiBkZWZhdWx0IGhlcmUsIGJ1dCBpdCdzIG5vdCBuZWNlc3NhcmlseSB1c2VkIG9uIGFsbAorICAgICMgVW5pY2VzIQorCisgICAgc3JjX2V4dGVuc2lvbnMgPSBbIi5jIiwiLkMiLCIuY2MiLCIuY3h4IiwiLmNwcCIsIi5tIl0KKyAgICBvYmpfZXh0ZW5zaW9uID0gIi5vIgorICAgIHN0YXRpY19saWJfZXh0ZW5zaW9uID0gIi5hIgorICAgIHNoYXJlZF9saWJfZXh0ZW5zaW9uID0gIi5zbyIKKyAgICBkeWxpYl9saWJfZXh0ZW5zaW9uID0gIi5keWxpYiIKKyAgICBzdGF0aWNfbGliX2Zvcm1hdCA9IHNoYXJlZF9saWJfZm9ybWF0ID0gZHlsaWJfbGliX2Zvcm1hdCA9ICJsaWIlcyVzIgorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiY3lnd2luIjoKKyAgICAgICAgZXhlX2V4dGVuc2lvbiA9ICIuZXhlIgorCisgICAgZGVmIHByZXByb2Nlc3Moc2VsZiwgc291cmNlLAorICAgICAgICAgICAgICAgICAgIG91dHB1dF9maWxlPU5vbmUsIG1hY3Jvcz1Ob25lLCBpbmNsdWRlX2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICBleHRyYV9wcmVhcmdzPU5vbmUsIGV4dHJhX3Bvc3RhcmdzPU5vbmUpOgorICAgICAgICBpZ25vcmUsIG1hY3JvcywgaW5jbHVkZV9kaXJzID0gXAorICAgICAgICAgICAgc2VsZi5fZml4X2NvbXBpbGVfYXJncyhOb25lLCBtYWNyb3MsIGluY2x1ZGVfZGlycykKKyAgICAgICAgcHBfb3B0cyA9IGdlbl9wcmVwcm9jZXNzX29wdGlvbnMobWFjcm9zLCBpbmNsdWRlX2RpcnMpCisgICAgICAgIHBwX2FyZ3MgPSBzZWxmLnByZXByb2Nlc3NvciArIHBwX29wdHMKKyAgICAgICAgaWYgb3V0cHV0X2ZpbGU6CisgICAgICAgICAgICBwcF9hcmdzLmV4dGVuZChbJy1vJywgb3V0cHV0X2ZpbGVdKQorICAgICAgICBpZiBleHRyYV9wcmVhcmdzOgorICAgICAgICAgICAgcHBfYXJnc1s6MF0gPSBleHRyYV9wcmVhcmdzCisgICAgICAgIGlmIGV4dHJhX3Bvc3RhcmdzOgorICAgICAgICAgICAgcHBfYXJncy5leHRlbmQoZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgIHBwX2FyZ3MuYXBwZW5kKHNvdXJjZSkKKworICAgICAgICAjIFdlIG5lZWQgdG8gcHJlcHJvY2VzczogZWl0aGVyIHdlJ3JlIGJlaW5nIGZvcmNlZCB0bywgb3Igd2UncmUKKyAgICAgICAgIyBnZW5lcmF0aW5nIG91dHB1dCB0byBzdGRvdXQsIG9yIHRoZXJlJ3MgYSB0YXJnZXQgb3V0cHV0IGZpbGUgYW5kCisgICAgICAgICMgdGhlIHNvdXJjZSBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIHRhcmdldCAob3IgdGhlIHRhcmdldCBkb2Vzbid0CisgICAgICAgICMgZXhpc3QpLgorICAgICAgICBpZiBzZWxmLmZvcmNlIG9yIG91dHB1dF9maWxlIGlzIE5vbmUgb3IgbmV3ZXIoc291cmNlLCBvdXRwdXRfZmlsZSk6CisgICAgICAgICAgICBpZiBvdXRwdXRfZmlsZToKKyAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24ocHBfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBDb21waWxlRXJyb3IsIG1zZworCisgICAgZGVmIF9jb21waWxlKHNlbGYsIG9iaiwgc3JjLCBleHQsIGNjX2FyZ3MsIGV4dHJhX3Bvc3RhcmdzLCBwcF9vcHRzKToKKyAgICAgICAgY29tcGlsZXJfc28gPSBzZWxmLmNvbXBpbGVyX3NvCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGNvbXBpbGVyX3NvID0gX29zeF9zdXBwb3J0LmNvbXBpbGVyX2ZpeHVwKGNvbXBpbGVyX3NvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNjX2FyZ3MgKyBleHRyYV9wb3N0YXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zcGF3bihjb21waWxlcl9zbyArIGNjX2FyZ3MgKyBbc3JjLCAnLW8nLCBvYmpdICsKKyAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIENvbXBpbGVFcnJvciwgbXNnCisKKyAgICBkZWYgY3JlYXRlX3N0YXRpY19saWIoc2VsZiwgb2JqZWN0cywgb3V0cHV0X2xpYm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXI9Tm9uZSwgZGVidWc9MCwgdGFyZ2V0X2xhbmc9Tm9uZSk6CisgICAgICAgIG9iamVjdHMsIG91dHB1dF9kaXIgPSBzZWxmLl9maXhfb2JqZWN0X2FyZ3Mob2JqZWN0cywgb3V0cHV0X2RpcikKKworICAgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBcCisgICAgICAgICAgICBzZWxmLmxpYnJhcnlfZmlsZW5hbWUob3V0cHV0X2xpYm5hbWUsIG91dHB1dF9kaXI9b3V0cHV0X2RpcikKKworICAgICAgICBpZiBzZWxmLl9uZWVkX2xpbmsob2JqZWN0cywgb3V0cHV0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIHNlbGYubWtwYXRoKG9zLnBhdGguZGlybmFtZShvdXRwdXRfZmlsZW5hbWUpKQorICAgICAgICAgICAgc2VsZi5zcGF3bihzZWxmLmFyY2hpdmVyICsKKyAgICAgICAgICAgICAgICAgICAgICAgW291dHB1dF9maWxlbmFtZV0gKworICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RzICsgc2VsZi5vYmplY3RzKQorCisgICAgICAgICAgICAjIE5vdCBtYW55IFVuaWNlcyByZXF1aXJlZCByYW5saWIgYW55bW9yZSAtLSBTdW5PUyA0LnggaXMsIEkKKyAgICAgICAgICAgICMgdGhpbmsgdGhlIG9ubHkgbWFqb3IgVW5peCB0aGF0IGRvZXMuICBNYXliZSB3ZSBuZWVkIHNvbWUKKyAgICAgICAgICAgICMgcGxhdGZvcm0gaW50ZWxsaWdlbmNlIGhlcmUgdG8gc2tpcCByYW5saWIgaWYgaXQncyBub3QKKyAgICAgICAgICAgICMgbmVlZGVkIC0tIG9yIG1heWJlIFB5dGhvbidzIGNvbmZpZ3VyZSBzY3JpcHQgdG9vayBjYXJlIG9mCisgICAgICAgICAgICAjIGl0IGZvciB1cywgaGVuY2UgdGhlIGNoZWNrIGZvciBsZWFkaW5nIGNvbG9uLgorICAgICAgICAgICAgaWYgc2VsZi5yYW5saWI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNwYXduKHNlbGYucmFubGliICsgW291dHB1dF9maWxlbmFtZV0pCisgICAgICAgICAgICAgICAgZXhjZXB0IERpc3R1dGlsc0V4ZWNFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBMaWJFcnJvciwgbXNnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2cuZGVidWcoInNraXBwaW5nICVzICh1cC10by1kYXRlKSIsIG91dHB1dF9maWxlbmFtZSkKKworICAgIGRlZiBsaW5rKHNlbGYsIHRhcmdldF9kZXNjLCBvYmplY3RzLAorICAgICAgICAgICAgIG91dHB1dF9maWxlbmFtZSwgb3V0cHV0X2Rpcj1Ob25lLCBsaWJyYXJpZXM9Tm9uZSwKKyAgICAgICAgICAgICBsaWJyYXJ5X2RpcnM9Tm9uZSwgcnVudGltZV9saWJyYXJ5X2RpcnM9Tm9uZSwKKyAgICAgICAgICAgICBleHBvcnRfc3ltYm9scz1Ob25lLCBkZWJ1Zz0wLCBleHRyYV9wcmVhcmdzPU5vbmUsCisgICAgICAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLCB0YXJnZXRfbGFuZz1Ob25lKToKKyAgICAgICAgb2JqZWN0cywgb3V0cHV0X2RpciA9IHNlbGYuX2ZpeF9vYmplY3RfYXJncyhvYmplY3RzLCBvdXRwdXRfZGlyKQorICAgICAgICBsaWJyYXJpZXMsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMgPSBcCisgICAgICAgICAgICBzZWxmLl9maXhfbGliX2FyZ3MobGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzKQorCisgICAgICAgIGxpYl9vcHRzID0gZ2VuX2xpYl9vcHRpb25zKHNlbGYsIGxpYnJhcnlfZGlycywgcnVudGltZV9saWJyYXJ5X2RpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcykKKyAgICAgICAgaWYgdHlwZShvdXRwdXRfZGlyKSBub3QgaW4gKFN0cmluZ1R5cGUsIE5vbmVUeXBlKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIidvdXRwdXRfZGlyJyBtdXN0IGJlIGEgc3RyaW5nIG9yIE5vbmUiCisgICAgICAgIGlmIG91dHB1dF9kaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2Rpciwgb3V0cHV0X2ZpbGVuYW1lKQorCisgICAgICAgIGlmIHNlbGYuX25lZWRfbGluayhvYmplY3RzLCBvdXRwdXRfZmlsZW5hbWUpOgorICAgICAgICAgICAgbGRfYXJncyA9IChvYmplY3RzICsgc2VsZi5vYmplY3RzICsKKyAgICAgICAgICAgICAgICAgICAgICAgbGliX29wdHMgKyBbJy1vJywgb3V0cHV0X2ZpbGVuYW1lXSkKKyAgICAgICAgICAgIGlmIGRlYnVnOgorICAgICAgICAgICAgICAgIGxkX2FyZ3NbOjBdID0gWyctZyddCisgICAgICAgICAgICBpZiBleHRyYV9wcmVhcmdzOgorICAgICAgICAgICAgICAgIGxkX2FyZ3NbOjBdID0gZXh0cmFfcHJlYXJncworICAgICAgICAgICAgaWYgZXh0cmFfcG9zdGFyZ3M6CisgICAgICAgICAgICAgICAgbGRfYXJncy5leHRlbmQoZXh0cmFfcG9zdGFyZ3MpCisgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUob3V0cHV0X2ZpbGVuYW1lKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiB0YXJnZXRfZGVzYyA9PSBDQ29tcGlsZXIuRVhFQ1VUQUJMRToKKyAgICAgICAgICAgICAgICAgICAgbGlua2VyID0gc2VsZi5saW5rZXJfZXhlWzpdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGlua2VyID0gc2VsZi5saW5rZXJfc29bOl0KKyAgICAgICAgICAgICAgICBpZiB0YXJnZXRfbGFuZyA9PSAiYysrIiBhbmQgc2VsZi5jb21waWxlcl9jeHg6CisgICAgICAgICAgICAgICAgICAgICMgc2tpcCBvdmVyIGVudmlyb25tZW50IHZhcmlhYmxlIHNldHRpbmdzIGlmIC91c3IvYmluL2VudgorICAgICAgICAgICAgICAgICAgICAjIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBsaW5rZXIncyBlbnZpcm9ubWVudC4KKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIG5lZWRlZCBvbiBPU1guIE5vdGU6IHRoaXMgYXNzdW1lcyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAjIG5vcm1hbCBhbmQgQysrIGNvbXBpbGVyIGhhdmUgdGhlIHNhbWUgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgIyBzZXR0aW5ncy4KKyAgICAgICAgICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShsaW5rZXJbMF0pID09ICJlbnYiOgorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICc9JyBpbiBsaW5rZXJbaV06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICAgICAgICAgICAgICAgICAgbGlua2VyW2ldID0gc2VsZi5jb21waWxlcl9jeHhbaV0KKworICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICAgICAgICAgbGlua2VyID0gX29zeF9zdXBwb3J0LmNvbXBpbGVyX2ZpeHVwKGxpbmtlciwgbGRfYXJncykKKworICAgICAgICAgICAgICAgIHNlbGYuc3Bhd24obGlua2VyICsgbGRfYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICByYWlzZSBMaW5rRXJyb3IsIG1zZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyAlcyAodXAtdG8tZGF0ZSkiLCBvdXRwdXRfZmlsZW5hbWUpCisKKyAgICAjIC0tIE1pc2NlbGxhbmVvdXMgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgVGhlc2UgYXJlIGFsbCB1c2VkIGJ5IHRoZSAnZ2VuX2xpYl9vcHRpb25zKCkgZnVuY3Rpb24sIGluCisgICAgIyBjY29tcGlsZXIucHkuCisKKyAgICBkZWYgbGlicmFyeV9kaXJfb3B0aW9uKHNlbGYsIGRpcik6CisgICAgICAgIHJldHVybiAiLUwiICsgZGlyCisKKyAgICBkZWYgX2lzX2djYyhzZWxmLCBjb21waWxlcl9uYW1lKToKKyAgICAgICAgcmV0dXJuICJnY2MiIGluIGNvbXBpbGVyX25hbWUgb3IgImcrKyIgaW4gY29tcGlsZXJfbmFtZQorCisgICAgZGVmIHJ1bnRpbWVfbGlicmFyeV9kaXJfb3B0aW9uKHNlbGYsIGRpcik6CisgICAgICAgICMgWFhYIEhhY2tpc2gsIGF0IHRoZSB2ZXJ5IGxlYXN0LiAgU2VlIFB5dGhvbiBidWcgIzQ0NTkwMjoKKyAgICAgICAgIyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvaW5kZXgucGhwCisgICAgICAgICMgICA/ZnVuYz1kZXRhaWwmYWlkPTQ0NTkwMiZncm91cF9pZD01NDcwJmF0aWQ9MTA1NDcwCisgICAgICAgICMgTGlua2VycyBvbiBkaWZmZXJlbnQgcGxhdGZvcm1zIG5lZWQgZGlmZmVyZW50IG9wdGlvbnMgdG8KKyAgICAgICAgIyBzcGVjaWZ5IHRoYXQgZGlyZWN0b3JpZXMgbmVlZCB0byBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZgorICAgICAgICAjIGRpcmVjdG9yaWVzIHNlYXJjaGVkIGZvciBkZXBlbmRlbmNpZXMgd2hlbiBhIGR5bmFtaWMgbGlicmFyeQorICAgICAgICAjIGlzIHNvdWdodC4gIEdDQyBoYXMgdG8gYmUgdG9sZCB0byBwYXNzIHRoZSAtUiBvcHRpb24gdGhyb3VnaAorICAgICAgICAjIHRvIHRoZSBsaW5rZXIsIHdoZXJlYXMgb3RoZXIgY29tcGlsZXJzIGp1c3Qga25vdyB0aGlzLgorICAgICAgICAjIE90aGVyIGNvbXBpbGVycyBtYXkgbmVlZCBzb21ldGhpbmcgc2xpZ2h0bHkgZGlmZmVyZW50LiAgQXQKKyAgICAgICAgIyB0aGlzIHRpbWUsIHRoZXJlJ3Mgbm8gd2F5IHRvIGRldGVybWluZSB0aGlzIGluZm9ybWF0aW9uIGZyb20KKyAgICAgICAgIyB0aGUgY29uZmlndXJhdGlvbiBkYXRhIHN0b3JlZCBpbiB0aGUgUHl0aG9uIGluc3RhbGxhdGlvbiwgc28KKyAgICAgICAgIyB3ZSB1c2UgdGhpcyBoYWNrLgorICAgICAgICBjb21waWxlciA9IG9zLnBhdGguYmFzZW5hbWUoc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCJDQyIpKQorICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjZdID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgIyBNYWNPU1gncyBsaW5rZXIgZG9lc24ndCB1bmRlcnN0YW5kIHRoZSAtUiBmbGFnIGF0IGFsbAorICAgICAgICAgICAgcmV0dXJuICItTCIgKyBkaXIKKyAgICAgICAgZWxpZiBzeXMucGxhdGZvcm1bOjVdID09ICJocC11eCI6CisgICAgICAgICAgICBpZiBzZWxmLl9pc19nY2MoY29tcGlsZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBbIi1XbCwrcyIsICItTCIgKyBkaXJdCisgICAgICAgICAgICByZXR1cm4gWyIrcyIsICItTCIgKyBkaXJdCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtWzo3XSA9PSAiaXJpeDY0NiIgb3Igc3lzLnBsYXRmb3JtWzo2XSA9PSAib3NmMVY1IjoKKyAgICAgICAgICAgIHJldHVybiBbIi1ycGF0aCIsIGRpcl0KKyAgICAgICAgZWxpZiBzeXMucGxhdGZvcm1bOjNdID09ICJhaXgiOgorICAgICAgICAgICAgcmV0dXJuICItYmxpYnBhdGg6IiArIGRpcgorICAgICAgICBlbGlmIHNlbGYuX2lzX2djYyhjb21waWxlcik6CisgICAgICAgICAgICByZXR1cm4gIi1XbCwtUiIgKyBkaXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiLVIiICsgZGlyCisKKyAgICBkZWYgbGlicmFyeV9vcHRpb24oc2VsZiwgbGliKToKKyAgICAgICAgcmV0dXJuICItbCIgKyBsaWIKKworICAgIGRlZiBmaW5kX2xpYnJhcnlfZmlsZShzZWxmLCBkaXJzLCBsaWIsIGRlYnVnPTApOgorICAgICAgICBzaGFyZWRfZiA9IHNlbGYubGlicmFyeV9maWxlbmFtZShsaWIsIGxpYl90eXBlPSdzaGFyZWQnKQorICAgICAgICBkeWxpYl9mID0gc2VsZi5saWJyYXJ5X2ZpbGVuYW1lKGxpYiwgbGliX3R5cGU9J2R5bGliJykKKyAgICAgICAgc3RhdGljX2YgPSBzZWxmLmxpYnJhcnlfZmlsZW5hbWUobGliLCBsaWJfdHlwZT0nc3RhdGljJykKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAjIE9uIE9TWCB1c2VycyBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGUgU0RLIHVzaW5nCisgICAgICAgICAgICAjICctaXN5c3Jvb3QnLCBjYWxjdWxhdGUgdGhlIFNESyByb290IGlmIGl0IGlzIHNwZWNpZmllZAorICAgICAgICAgICAgIyAoYW5kIHVzZSBpdCBmdXJ0aGVyIG9uKQorICAgICAgICAgICAgY2ZsYWdzID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdDRkxBR1MnKQorICAgICAgICAgICAgbSA9IHJlLnNlYXJjaChyJy1pc3lzcm9vdFxzKyhcUyspJywgY2ZsYWdzKQorICAgICAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN5c3Jvb3QgPSAnLycKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3lzcm9vdCA9IG0uZ3JvdXAoMSkKKworCisKKyAgICAgICAgZm9yIGRpciBpbiBkaXJzOgorICAgICAgICAgICAgc2hhcmVkID0gb3MucGF0aC5qb2luKGRpciwgc2hhcmVkX2YpCisgICAgICAgICAgICBkeWxpYiA9IG9zLnBhdGguam9pbihkaXIsIGR5bGliX2YpCisgICAgICAgICAgICBzdGF0aWMgPSBvcy5wYXRoLmpvaW4oZGlyLCBzdGF0aWNfZikKKworICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCAoCisgICAgICAgICAgICAgICAgZGlyLnN0YXJ0c3dpdGgoJy9TeXN0ZW0vJykgb3IgKAorICAgICAgICAgICAgICAgIGRpci5zdGFydHN3aXRoKCcvdXNyLycpIGFuZCBub3QgZGlyLnN0YXJ0c3dpdGgoJy91c3IvbG9jYWwvJykpKToKKworICAgICAgICAgICAgICAgIHNoYXJlZCA9IG9zLnBhdGguam9pbihzeXNyb290LCBkaXJbMTpdLCBzaGFyZWRfZikKKyAgICAgICAgICAgICAgICBkeWxpYiA9IG9zLnBhdGguam9pbihzeXNyb290LCBkaXJbMTpdLCBkeWxpYl9mKQorICAgICAgICAgICAgICAgIHN0YXRpYyA9IG9zLnBhdGguam9pbihzeXNyb290LCBkaXJbMTpdLCBzdGF0aWNfZikKKworICAgICAgICAgICAgIyBXZSdyZSBzZWNvbmQtZ3Vlc3NpbmcgdGhlIGxpbmtlciBoZXJlLCB3aXRoIG5vdCBtdWNoIGhhcmQKKyAgICAgICAgICAgICMgZGF0YSB0byBnbyBvbjogR0NDIHNlZW1zIHRvIHByZWZlciB0aGUgc2hhcmVkIGxpYnJhcnksIHNvIEknbQorICAgICAgICAgICAgIyBhc3N1bWluZyB0aGF0ICphbGwqIFVuaXggQyBjb21waWxlcnMgZG8uICBBbmQgb2YgY291cnNlIEknbQorICAgICAgICAgICAgIyBpZ25vcmluZyBldmVuIEdDQydzICItc3RhdGljIiBvcHRpb24uICBTbyBzdWUgbWUuCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkeWxpYik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGR5bGliCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHNoYXJlZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNoYXJlZAorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzdGF0aWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdGF0aWMKKworICAgICAgICAjIE9vcHMsIGRpZG4ndCBmaW5kIGl0IGluICphbnkqIG9mICdkaXJzJworICAgICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU0ZGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU0ZGQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdXRpbC5weSBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmZmE4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3V0aWwucHkKQEAgLTAsMCArMSw0OTkgQEAKKyIiImRpc3R1dGlscy51dGlsCisKK01pc2NlbGxhbmVvdXMgdXRpbGl0eSBmdW5jdGlvbnMgLS0gYW55dGhpbmcgdGhhdCBkb2Vzbid0IGZpdCBpbnRvCitvbmUgb2YgdGhlIG90aGVyICp1dGlsLnB5IG1vZHVsZXMuCisiIiIKKworX19yZXZpc2lvbl9fID0gIiRJZCQiCisKK2ltcG9ydCBzeXMsIG9zLCBzdHJpbmcsIHJlCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1BsYXRmb3JtRXJyb3IKK2Zyb20gZGlzdHV0aWxzLmRlcF91dGlsIGltcG9ydCBuZXdlcgorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0J5dGVDb21waWxlRXJyb3IKKworZGVmIGdldF9wbGF0Zm9ybSAoKToKKyAgICAiIiJSZXR1cm4gYSBzdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgVGhpcyBpcyB1c2VkCisgICAgbWFpbmx5IHRvIGRpc3Rpbmd1aXNoIHBsYXRmb3JtLXNwZWNpZmljIGJ1aWxkIGRpcmVjdG9yaWVzIGFuZAorICAgIHBsYXRmb3JtLXNwZWNpZmljIGJ1aWx0IGRpc3RyaWJ1dGlvbnMuICBUeXBpY2FsbHkgaW5jbHVkZXMgdGhlIE9TIG5hbWUKKyAgICBhbmQgdmVyc2lvbiBhbmQgdGhlIGFyY2hpdGVjdHVyZSAoYXMgc3VwcGxpZWQgYnkgJ29zLnVuYW1lKCknKSwKKyAgICBhbHRob3VnaCB0aGUgZXhhY3QgaW5mb3JtYXRpb24gaW5jbHVkZWQgZGVwZW5kcyBvbiB0aGUgT1M7IGVnLiBmb3IgSVJJWAorICAgIHRoZSBhcmNoaXRlY3R1cmUgaXNuJ3QgcGFydGljdWxhcmx5IGltcG9ydGFudCAoSVJJWCBvbmx5IHJ1bnMgb24gU0dJCisgICAgaGFyZHdhcmUpLCBidXQgZm9yIExpbnV4IHRoZSBrZXJuZWwgdmVyc2lvbiBpc24ndCBwYXJ0aWN1bGFybHkKKyAgICBpbXBvcnRhbnQuCisKKyAgICBFeGFtcGxlcyBvZiByZXR1cm5lZCB2YWx1ZXM6CisgICAgICAgbGludXgtaTU4NgorICAgICAgIGxpbnV4LWFscGhhICg/KQorICAgICAgIHNvbGFyaXMtMi42LXN1bjR1CisgICAgICAgaXJpeC01LjMKKyAgICAgICBpcml4NjQtNi4yCisKKyAgICBXaW5kb3dzIHdpbGwgcmV0dXJuIG9uZSBvZjoKKyAgICAgICB3aW4tYW1kNjQgKDY0Yml0IFdpbmRvd3Mgb24gQU1ENjQgKGFrYSB4ODZfNjQsIEludGVsNjQsIEVNNjRULCBldGMpCisgICAgICAgd2luLWlhNjQgKDY0Yml0IFdpbmRvd3Mgb24gSXRhbml1bSkKKyAgICAgICB3aW4zMiAoYWxsIG90aGVycyAtIHNwZWNpZmljYWxseSwgc3lzLnBsYXRmb3JtIGlzIHJldHVybmVkKQorCisgICAgRm9yIG90aGVyIG5vbi1QT1NJWCBwbGF0Zm9ybXMsIGN1cnJlbnRseSBqdXN0IHJldHVybnMgJ3N5cy5wbGF0Zm9ybScuCisgICAgIiIiCisgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAjIHNuaWZmIHN5cy52ZXJzaW9uIGZvciBhcmNoaXRlY3R1cmUuCisgICAgICAgIHByZWZpeCA9ICIgYml0ICgiCisgICAgICAgIGkgPSBzdHJpbmcuZmluZChzeXMudmVyc2lvbiwgcHJlZml4KQorICAgICAgICBpZiBpID09IC0xOgorICAgICAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQorICAgICAgICBqID0gc3RyaW5nLmZpbmQoc3lzLnZlcnNpb24sICIpIiwgaSkKKyAgICAgICAgbG9vayA9IHN5cy52ZXJzaW9uW2krbGVuKHByZWZpeCk6al0ubG93ZXIoKQorICAgICAgICBpZiBsb29rPT0nYW1kNjQnOgorICAgICAgICAgICAgcmV0dXJuICd3aW4tYW1kNjQnCisgICAgICAgIGlmIGxvb2s9PSdpdGFuaXVtJzoKKyAgICAgICAgICAgIHJldHVybiAnd2luLWlhNjQnCisgICAgICAgIHJldHVybiBzeXMucGxhdGZvcm0KKworICAgICMgU2V0IGZvciBjcm9zcyBidWlsZHMgZXhwbGljaXRseQorICAgIGlmICJfUFlUSE9OX0hPU1RfUExBVEZPUk0iIGluIG9zLmVudmlyb246CisgICAgICAgIHJldHVybiBvcy5lbnZpcm9uWyJfUFlUSE9OX0hPU1RfUExBVEZPUk0iXQorCisgICAgaWYgb3MubmFtZSAhPSAicG9zaXgiIG9yIG5vdCBoYXNhdHRyKG9zLCAndW5hbWUnKToKKyAgICAgICAgIyBYWFggd2hhdCBhYm91dCB0aGUgYXJjaGl0ZWN0dXJlPyBOVCBpcyBJbnRlbCBvciBBbHBoYSwKKyAgICAgICAgIyBNYWMgT1MgaXMgTTY4ayBvciBQUEMsIGV0Yy4KKyAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQorCisgICAgIyBUcnkgdG8gZGlzdGluZ3Vpc2ggdmFyaW91cyBmbGF2b3VycyBvZiBVbml4CisKKyAgICAob3NuYW1lLCBob3N0LCByZWxlYXNlLCB2ZXJzaW9uLCBtYWNoaW5lKSA9IG9zLnVuYW1lKCkKKworICAgICMgQ29udmVydCB0aGUgT1MgbmFtZSB0byBsb3dlcmNhc2UsIHJlbW92ZSAnLycgY2hhcmFjdGVycworICAgICMgKHRvIGFjY29tbW9kYXRlIEJTRC9PUyksIGFuZCB0cmFuc2xhdGUgc3BhY2VzIChmb3IgIlBvd2VyIE1hY2ludG9zaCIpCisgICAgb3NuYW1lID0gc3RyaW5nLmxvd2VyKG9zbmFtZSkKKyAgICBvc25hbWUgPSBzdHJpbmcucmVwbGFjZShvc25hbWUsICcvJywgJycpCisgICAgbWFjaGluZSA9IHN0cmluZy5yZXBsYWNlKG1hY2hpbmUsICcgJywgJ18nKQorICAgIG1hY2hpbmUgPSBzdHJpbmcucmVwbGFjZShtYWNoaW5lLCAnLycsICctJykKKworICAgIGlmIG9zbmFtZVs6NV0gPT0gImxpbnV4IjoKKyAgICAgICAgIyBBdCBsZWFzdCBvbiBMaW51eC9JbnRlbCwgJ21hY2hpbmUnIGlzIHRoZSBwcm9jZXNzb3IgLS0KKyAgICAgICAgIyBpMzg2LCBldGMuCisgICAgICAgICMgWFhYIHdoYXQgYWJvdXQgQWxwaGEsIFNQQVJDLCBldGM/CisgICAgICAgIHJldHVybiAgIiVzLSVzIiAlIChvc25hbWUsIG1hY2hpbmUpCisgICAgZWxpZiBvc25hbWVbOjVdID09ICJzdW5vcyI6CisgICAgICAgIGlmIHJlbGVhc2VbMF0gPj0gIjUiOiAgICAgICAgICAgIyBTdW5PUyA1ID09IFNvbGFyaXMgMgorICAgICAgICAgICAgb3NuYW1lID0gInNvbGFyaXMiCisgICAgICAgICAgICByZWxlYXNlID0gIiVkLiVzIiAlIChpbnQocmVsZWFzZVswXSkgLSAzLCByZWxlYXNlWzI6XSkKKyAgICAgICAgICAgICMgV2UgY2FuJ3QgdXNlICJwbGF0Zm9ybS5hcmNoaXRlY3R1cmUoKVswXSIgYmVjYXVzZSBhCisgICAgICAgICAgICAjIGJvb3RzdHJhcCBwcm9ibGVtLiBXZSB1c2UgYSBkaWN0IHRvIGdldCBhbiBlcnJvcgorICAgICAgICAgICAgIyBpZiBzb21lIHN1c3BpY2lvdXMgaGFwcGVucy4KKyAgICAgICAgICAgIGJpdG5lc3MgPSB7MjE0NzQ4MzY0NzoiMzJiaXQiLCA5MjIzMzcyMDM2ODU0Nzc1ODA3OiI2NGJpdCJ9CisgICAgICAgICAgICBtYWNoaW5lICs9ICIuJXMiICUgYml0bmVzc1tzeXMubWF4aW50XQorICAgICAgICAjIGZhbGwgdGhyb3VnaCB0byBzdGFuZGFyZCBvc25hbWUtcmVsZWFzZS1tYWNoaW5lIHJlcHJlc2VudGF0aW9uCisgICAgZWxpZiBvc25hbWVbOjRdID09ICJpcml4IjogICAgICAgICAgICAgICMgY291bGQgYmUgImlyaXg2NCIhCisgICAgICAgIHJldHVybiAiJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSkKKyAgICBlbGlmIG9zbmFtZVs6M10gPT0gImFpeCI6CisgICAgICAgIHJldHVybiAiJXMtJXMuJXMiICUgKG9zbmFtZSwgdmVyc2lvbiwgcmVsZWFzZSkKKyAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImN5Z3dpbiI6CisgICAgICAgIG9zbmFtZSA9ICJjeWd3aW4iCisgICAgICAgIHJlbF9yZSA9IHJlLmNvbXBpbGUgKHInW1xkLl0rJykKKyAgICAgICAgbSA9IHJlbF9yZS5tYXRjaChyZWxlYXNlKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgcmVsZWFzZSA9IG0uZ3JvdXAoKQorICAgIGVsaWYgb3NuYW1lWzo2XSA9PSAiZGFyd2luIjoKKyAgICAgICAgaW1wb3J0IF9vc3hfc3VwcG9ydCwgZGlzdHV0aWxzLnN5c2NvbmZpZworICAgICAgICBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUgPSBfb3N4X3N1cHBvcnQuZ2V0X3BsYXRmb3JtX29zeCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0dXRpbHMuc3lzY29uZmlnLmdldF9jb25maWdfdmFycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zbmFtZSwgcmVsZWFzZSwgbWFjaGluZSkKKworICAgIHJldHVybiAiJXMtJXMtJXMiICUgKG9zbmFtZSwgcmVsZWFzZSwgbWFjaGluZSkKKworIyBnZXRfcGxhdGZvcm0gKCkKKworCitkZWYgY29udmVydF9wYXRoIChwYXRobmFtZSk6CisgICAgIiIiUmV0dXJuICdwYXRobmFtZScgYXMgYSBuYW1lIHRoYXQgd2lsbCB3b3JrIG9uIHRoZSBuYXRpdmUgZmlsZXN5c3RlbSwKKyAgICBpLmUuIHNwbGl0IGl0IG9uICcvJyBhbmQgcHV0IGl0IGJhY2sgdG9nZXRoZXIgYWdhaW4gdXNpbmcgdGhlIGN1cnJlbnQKKyAgICBkaXJlY3Rvcnkgc2VwYXJhdG9yLiAgTmVlZGVkIGJlY2F1c2UgZmlsZW5hbWVzIGluIHRoZSBzZXR1cCBzY3JpcHQgYXJlCisgICAgYWx3YXlzIHN1cHBsaWVkIGluIFVuaXggc3R5bGUsIGFuZCBoYXZlIHRvIGJlIGNvbnZlcnRlZCB0byB0aGUgbG9jYWwKKyAgICBjb252ZW50aW9uIGJlZm9yZSB3ZSBjYW4gYWN0dWFsbHkgdXNlIHRoZW0gaW4gdGhlIGZpbGVzeXN0ZW0uICBSYWlzZXMKKyAgICBWYWx1ZUVycm9yIG9uIG5vbi1Vbml4LWlzaCBzeXN0ZW1zIGlmICdwYXRobmFtZScgZWl0aGVyIHN0YXJ0cyBvcgorICAgIGVuZHMgd2l0aCBhIHNsYXNoLgorICAgICIiIgorICAgIGlmIG9zLnNlcCA9PSAnLyc6CisgICAgICAgIHJldHVybiBwYXRobmFtZQorICAgIGlmIG5vdCBwYXRobmFtZToKKyAgICAgICAgcmV0dXJuIHBhdGhuYW1lCisgICAgaWYgcGF0aG5hbWVbMF0gPT0gJy8nOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAicGF0aCAnJXMnIGNhbm5vdCBiZSBhYnNvbHV0ZSIgJSBwYXRobmFtZQorICAgIGlmIHBhdGhuYW1lWy0xXSA9PSAnLyc6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJwYXRoICclcycgY2Fubm90IGVuZCB3aXRoICcvJyIgJSBwYXRobmFtZQorCisgICAgcGF0aHMgPSBzdHJpbmcuc3BsaXQocGF0aG5hbWUsICcvJykKKyAgICB3aGlsZSAnLicgaW4gcGF0aHM6CisgICAgICAgIHBhdGhzLnJlbW92ZSgnLicpCisgICAgaWYgbm90IHBhdGhzOgorICAgICAgICByZXR1cm4gb3MuY3VyZGlyCisgICAgIyBPbiBXaW5kb3dzLCBpZiBwYXRocyBpcyBbJ0M6JywnZm9sZGVyJywnc3ViZm9sZGVyJ10gdGhlbgorICAgICMgb3MucGF0aC5qb2luKCpwYXRocykgd2lsbCByZXR1cm4gJ0M6Zm9sZGVyXHN1YmZvbGRlcicgd2hpY2gKKyAgICAjIGlzIHRodXMgcmVsYXRpdmUgdG8gdGhlIENXRCBvbiB0aGF0IGRyaXZlLiBTbyB3ZSB3b3JrIGFyb3VuZAorICAgICMgdGhpcyBieSBhZGRpbmcgYSBcIHRvIHBhdGhbMF0KKyAgICBpZiAobGVuKHBhdGhzKSA+IDAgYW5kIHBhdGhzWzBdLmVuZHN3aXRoKCc6JykgYW5kCisgICAgICAgIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGFuZCBzeXMudmVyc2lvbi5maW5kKCJHQ0MiKSA+PSAwKToKKyAgICAgICAgcGF0aHNbMF0gKz0gJ1xcJworICAgIHJldHVybiBvcy5wYXRoLmpvaW4oKnBhdGhzKQorCisjIGNvbnZlcnRfcGF0aCAoKQorCisKK2RlZiBjaGFuZ2Vfcm9vdCAobmV3X3Jvb3QsIHBhdGhuYW1lKToKKyAgICAiIiJSZXR1cm4gJ3BhdGhuYW1lJyB3aXRoICduZXdfcm9vdCcgcHJlcGVuZGVkLiAgSWYgJ3BhdGhuYW1lJyBpcworICAgIHJlbGF0aXZlLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gIm9zLnBhdGguam9pbihuZXdfcm9vdCxwYXRobmFtZSkiLgorICAgIE90aGVyd2lzZSwgaXQgcmVxdWlyZXMgbWFraW5nICdwYXRobmFtZScgcmVsYXRpdmUgYW5kIHRoZW4gam9pbmluZyB0aGUKKyAgICB0d28sIHdoaWNoIGlzIHRyaWNreSBvbiBET1MvV2luZG93cyBhbmQgTWFjIE9TLgorICAgICIiIgorICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMocGF0aG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihuZXdfcm9vdCwgcGF0aG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKG5ld19yb290LCBwYXRobmFtZVsxOl0pCisKKyAgICBlbGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgKGRyaXZlLCBwYXRoKSA9IG9zLnBhdGguc3BsaXRkcml2ZShwYXRobmFtZSkKKyAgICAgICAgaWYgcGF0aFswXSA9PSAnXFwnOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMTpdCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4obmV3X3Jvb3QsIHBhdGgpCisKKyAgICBlbGlmIG9zLm5hbWUgPT0gJ29zMic6CisgICAgICAgIChkcml2ZSwgcGF0aCkgPSBvcy5wYXRoLnNwbGl0ZHJpdmUocGF0aG5hbWUpCisgICAgICAgIGlmIHBhdGhbMF0gPT0gb3Muc2VwOgorICAgICAgICAgICAgcGF0aCA9IHBhdGhbMTpdCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4obmV3X3Jvb3QsIHBhdGgpCisKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLCBcCisgICAgICAgICAgICAgICJub3RoaW5nIGtub3duIGFib3V0IHBsYXRmb3JtICclcyciICUgb3MubmFtZQorCisKK19lbnZpcm9uX2NoZWNrZWQgPSAwCitkZWYgY2hlY2tfZW52aXJvbiAoKToKKyAgICAiIiJFbnN1cmUgdGhhdCAnb3MuZW52aXJvbicgaGFzIGFsbCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdlCisgICAgZ3VhcmFudGVlIHRoYXQgdXNlcnMgY2FuIHVzZSBpbiBjb25maWcgZmlsZXMsIGNvbW1hbmQtbGluZSBvcHRpb25zLAorICAgIGV0Yy4gIEN1cnJlbnRseSB0aGlzIGluY2x1ZGVzOgorICAgICAgSE9NRSAtIHVzZXIncyBob21lIGRpcmVjdG9yeSAoVW5peCBvbmx5KQorICAgICAgUExBVCAtIGRlc2NyaXB0aW9uIG9mIHRoZSBjdXJyZW50IHBsYXRmb3JtLCBpbmNsdWRpbmcgaGFyZHdhcmUKKyAgICAgICAgICAgICBhbmQgT1MgKHNlZSAnZ2V0X3BsYXRmb3JtKCknKQorICAgICIiIgorICAgIGdsb2JhbCBfZW52aXJvbl9jaGVja2VkCisgICAgaWYgX2Vudmlyb25fY2hlY2tlZDoKKyAgICAgICAgcmV0dXJuCisKKyAgICBpZiBvcy5uYW1lID09ICdwb3NpeCcgYW5kICdIT01FJyBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgaW1wb3J0IHB3ZAorICAgICAgICBvcy5lbnZpcm9uWydIT01FJ10gPSBwd2QuZ2V0cHd1aWQob3MuZ2V0dWlkKCkpWzVdCisKKyAgICBpZiAnUExBVCcgbm90IGluIG9zLmVudmlyb246CisgICAgICAgIG9zLmVudmlyb25bJ1BMQVQnXSA9IGdldF9wbGF0Zm9ybSgpCisKKyAgICBfZW52aXJvbl9jaGVja2VkID0gMQorCisKK2RlZiBzdWJzdF92YXJzIChzLCBsb2NhbF92YXJzKToKKyAgICAiIiJQZXJmb3JtIHNoZWxsL1Blcmwtc3R5bGUgdmFyaWFibGUgc3Vic3RpdHV0aW9uIG9uICdzdHJpbmcnLiAgRXZlcnkKKyAgICBvY2N1cnJlbmNlIG9mICckJyBmb2xsb3dlZCBieSBhIG5hbWUgaXMgY29uc2lkZXJlZCBhIHZhcmlhYmxlLCBhbmQKKyAgICB2YXJpYWJsZSBpcyBzdWJzdGl0dXRlZCBieSB0aGUgdmFsdWUgZm91bmQgaW4gdGhlICdsb2NhbF92YXJzJworICAgIGRpY3Rpb25hcnksIG9yIGluICdvcy5lbnZpcm9uJyBpZiBpdCdzIG5vdCBpbiAnbG9jYWxfdmFycycuCisgICAgJ29zLmVudmlyb24nIGlzIGZpcnN0IGNoZWNrZWQvYXVnbWVudGVkIHRvIGd1YXJhbnRlZSB0aGF0IGl0IGNvbnRhaW5zCisgICAgY2VydGFpbiB2YWx1ZXM6IHNlZSAnY2hlY2tfZW52aXJvbigpJy4gIFJhaXNlIFZhbHVlRXJyb3IgZm9yIGFueQorICAgIHZhcmlhYmxlcyBub3QgZm91bmQgaW4gZWl0aGVyICdsb2NhbF92YXJzJyBvciAnb3MuZW52aXJvbicuCisgICAgIiIiCisgICAgY2hlY2tfZW52aXJvbigpCisgICAgZGVmIF9zdWJzdCAobWF0Y2gsIGxvY2FsX3ZhcnM9bG9jYWxfdmFycyk6CisgICAgICAgIHZhcl9uYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgaWYgdmFyX25hbWUgaW4gbG9jYWxfdmFyczoKKyAgICAgICAgICAgIHJldHVybiBzdHIobG9jYWxfdmFyc1t2YXJfbmFtZV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gb3MuZW52aXJvblt2YXJfbmFtZV0KKworICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHJlLnN1YihyJ1wkKFthLXpBLVpfXVthLXpBLVpfMC05XSopJywgX3N1YnN0LCBzKQorICAgIGV4Y2VwdCBLZXlFcnJvciwgdmFyOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW52YWxpZCB2YXJpYWJsZSAnJCVzJyIgJSB2YXIKKworIyBzdWJzdF92YXJzICgpCisKKworZGVmIGdyb2tfZW52aXJvbm1lbnRfZXJyb3IgKGV4YywgcHJlZml4PSJlcnJvcjogIik6CisgICAgIiIiR2VuZXJhdGUgYSB1c2VmdWwgZXJyb3IgbWVzc2FnZSBmcm9tIGFuIEVudmlyb25tZW50RXJyb3IgKElPRXJyb3Igb3IKKyAgICBPU0Vycm9yKSBleGNlcHRpb24gb2JqZWN0LiAgSGFuZGxlcyBQeXRob24gMS41LjEgYW5kIDEuNS4yIHN0eWxlcywgYW5kCisgICAgZG9lcyB3aGF0IGl0IGNhbiB0byBkZWFsIHdpdGggZXhjZXB0aW9uIG9iamVjdHMgdGhhdCBkb24ndCBoYXZlIGEKKyAgICBmaWxlbmFtZSAod2hpY2ggaGFwcGVucyB3aGVuIHRoZSBlcnJvciBpcyBkdWUgdG8gYSB0d28tZmlsZSBvcGVyYXRpb24sCisgICAgc3VjaCBhcyAncmVuYW1lKCknIG9yICdsaW5rKCknLiAgUmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhIHN0cmluZworICAgIHByZWZpeGVkIHdpdGggJ3ByZWZpeCcuCisgICAgIiIiCisgICAgIyBjaGVjayBmb3IgUHl0aG9uIDEuNS4yLXN0eWxlIHtJTyxPU31FcnJvciBleGNlcHRpb24gb2JqZWN0cworICAgIGlmIGhhc2F0dHIoZXhjLCAnZmlsZW5hbWUnKSBhbmQgaGFzYXR0cihleGMsICdzdHJlcnJvcicpOgorICAgICAgICBpZiBleGMuZmlsZW5hbWU6CisgICAgICAgICAgICBlcnJvciA9IHByZWZpeCArICIlczogJXMiICUgKGV4Yy5maWxlbmFtZSwgZXhjLnN0cmVycm9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB0d28tYXJndW1lbnQgZnVuY3Rpb25zIGluIHBvc2l4IG1vZHVsZSBkb24ndAorICAgICAgICAgICAgIyBpbmNsdWRlIHRoZSBmaWxlbmFtZSBpbiB0aGUgZXhjZXB0aW9uIG9iamVjdCEKKyAgICAgICAgICAgIGVycm9yID0gcHJlZml4ICsgIiVzIiAlIGV4Yy5zdHJlcnJvcgorICAgIGVsc2U6CisgICAgICAgIGVycm9yID0gcHJlZml4ICsgc3RyKGV4Y1stMV0pCisKKyAgICByZXR1cm4gZXJyb3IKKworCisjIE5lZWRlZCBieSAnc3BsaXRfcXVvdGVkKCknCitfd29yZGNoYXJzX3JlID0gX3NxdW90ZV9yZSA9IF9kcXVvdGVfcmUgPSBOb25lCitkZWYgX2luaXRfcmVnZXgoKToKKyAgICBnbG9iYWwgX3dvcmRjaGFyc19yZSwgX3NxdW90ZV9yZSwgX2RxdW90ZV9yZQorICAgIF93b3JkY2hhcnNfcmUgPSByZS5jb21waWxlKHInW15cXFwnXCIlcyBdKicgJSBzdHJpbmcud2hpdGVzcGFjZSkKKyAgICBfc3F1b3RlX3JlID0gcmUuY29tcGlsZShyIicoPzpbXidcXF18XFwuKSonIikKKyAgICBfZHF1b3RlX3JlID0gcmUuY29tcGlsZShyJyIoPzpbXiJcXF18XFwuKSoiJykKKworZGVmIHNwbGl0X3F1b3RlZCAocyk6CisgICAgIiIiU3BsaXQgYSBzdHJpbmcgdXAgYWNjb3JkaW5nIHRvIFVuaXggc2hlbGwtbGlrZSBydWxlcyBmb3IgcXVvdGVzIGFuZAorICAgIGJhY2tzbGFzaGVzLiAgSW4gc2hvcnQ6IHdvcmRzIGFyZSBkZWxpbWl0ZWQgYnkgc3BhY2VzLCBhcyBsb25nIGFzIHRob3NlCisgICAgc3BhY2VzIGFyZSBub3QgZXNjYXBlZCBieSBhIGJhY2tzbGFzaCwgb3IgaW5zaWRlIGEgcXVvdGVkIHN0cmluZy4KKyAgICBTaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMgYXJlIGVxdWl2YWxlbnQsIGFuZCB0aGUgcXVvdGUgY2hhcmFjdGVycyBjYW4KKyAgICBiZSBiYWNrc2xhc2gtZXNjYXBlZC4gIFRoZSBiYWNrc2xhc2ggaXMgc3RyaXBwZWQgZnJvbSBhbnkgdHdvLWNoYXJhY3RlcgorICAgIGVzY2FwZSBzZXF1ZW5jZSwgbGVhdmluZyBvbmx5IHRoZSBlc2NhcGVkIGNoYXJhY3Rlci4gIFRoZSBxdW90ZQorICAgIGNoYXJhY3RlcnMgYXJlIHN0cmlwcGVkIGZyb20gYW55IHF1b3RlZCBzdHJpbmcuICBSZXR1cm5zIGEgbGlzdCBvZgorICAgIHdvcmRzLgorICAgICIiIgorCisgICAgIyBUaGlzIGlzIGEgbmljZSBhbGdvcml0aG0gZm9yIHNwbGl0dGluZyB1cCBhIHNpbmdsZSBzdHJpbmcsIHNpbmNlIGl0CisgICAgIyBkb2Vzbid0IHJlcXVpcmUgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciBleGFtaW5hdGlvbi4gIEl0IHdhcyBhIGxpdHRsZQorICAgICMgYml0IG9mIGEgYnJhaW4tYmVuZGVyIHRvIGdldCBpdCB3b3JraW5nIHJpZ2h0LCB0aG91Z2guLi4KKyAgICBpZiBfd29yZGNoYXJzX3JlIGlzIE5vbmU6IF9pbml0X3JlZ2V4KCkKKworICAgIHMgPSBzdHJpbmcuc3RyaXAocykKKyAgICB3b3JkcyA9IFtdCisgICAgcG9zID0gMAorCisgICAgd2hpbGUgczoKKyAgICAgICAgbSA9IF93b3JkY2hhcnNfcmUubWF0Y2gocywgcG9zKQorICAgICAgICBlbmQgPSBtLmVuZCgpCisgICAgICAgIGlmIGVuZCA9PSBsZW4ocyk6CisgICAgICAgICAgICB3b3Jkcy5hcHBlbmQoc1s6ZW5kXSkKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgc1tlbmRdIGluIHN0cmluZy53aGl0ZXNwYWNlOiAjIHVuZXNjYXBlZCwgdW5xdW90ZWQgd2hpdGVzcGFjZTogbm93CisgICAgICAgICAgICB3b3Jkcy5hcHBlbmQoc1s6ZW5kXSkgICAgICAgIyB3ZSBkZWZpbml0ZWx5IGhhdmUgYSB3b3JkIGRlbGltaXRlcgorICAgICAgICAgICAgcyA9IHN0cmluZy5sc3RyaXAoc1tlbmQ6XSkKKyAgICAgICAgICAgIHBvcyA9IDAKKworICAgICAgICBlbGlmIHNbZW5kXSA9PSAnXFwnOiAgICAgICAgICAgICMgcHJlc2VydmUgd2hhdGV2ZXIgaXMgYmVpbmcgZXNjYXBlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdpbGwgYmVjb21lIHBhcnQgb2YgdGhlIGN1cnJlbnQgd29yZAorICAgICAgICAgICAgcyA9IHNbOmVuZF0gKyBzW2VuZCsxOl0KKyAgICAgICAgICAgIHBvcyA9IGVuZCsxCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNbZW5kXSA9PSAiJyI6ICAgICAgICAgICAjIHNsdXJwIHNpbmdseS1xdW90ZWQgc3RyaW5nCisgICAgICAgICAgICAgICAgbSA9IF9zcXVvdGVfcmUubWF0Y2gocywgZW5kKQorICAgICAgICAgICAgZWxpZiBzW2VuZF0gPT0gJyInOiAgICAgICAgICMgc2x1cnAgZG91Ymx5LXF1b3RlZCBzdHJpbmcKKyAgICAgICAgICAgICAgICBtID0gX2RxdW90ZV9yZS5tYXRjaChzLCBlbmQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGNhbid0IGhhcHBlbiAoYmFkIGNoYXIgJyVjJykiICUgc1tlbmRdCisKKyAgICAgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImJhZCBzdHJpbmcgKG1pc21hdGNoZWQgJXMgcXVvdGVzPykiICUgc1tlbmRdCisKKyAgICAgICAgICAgIChiZWcsIGVuZCkgPSBtLnNwYW4oKQorICAgICAgICAgICAgcyA9IHNbOmJlZ10gKyBzW2JlZysxOmVuZC0xXSArIHNbZW5kOl0KKyAgICAgICAgICAgIHBvcyA9IG0uZW5kKCkgLSAyCisKKyAgICAgICAgaWYgcG9zID49IGxlbihzKToKKyAgICAgICAgICAgIHdvcmRzLmFwcGVuZChzKQorICAgICAgICAgICAgYnJlYWsKKworICAgIHJldHVybiB3b3JkcworCisjIHNwbGl0X3F1b3RlZCAoKQorCisKK2RlZiBleGVjdXRlIChmdW5jLCBhcmdzLCBtc2c9Tm9uZSwgdmVyYm9zZT0wLCBkcnlfcnVuPTApOgorICAgICIiIlBlcmZvcm0gc29tZSBhY3Rpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRzaWRlIHdvcmxkIChlZy4gIGJ5CisgICAgd3JpdGluZyB0byB0aGUgZmlsZXN5c3RlbSkuICBTdWNoIGFjdGlvbnMgYXJlIHNwZWNpYWwgYmVjYXVzZSB0aGV5CisgICAgYXJlIGRpc2FibGVkIGJ5IHRoZSAnZHJ5X3J1bicgZmxhZy4gIFRoaXMgbWV0aG9kIHRha2VzIGNhcmUgb2YgYWxsCisgICAgdGhhdCBidXJlYXVjcmFjeSBmb3IgeW91OyBhbGwgeW91IGhhdmUgdG8gZG8gaXMgc3VwcGx5IHRoZQorICAgIGZ1bmN0aW9uIHRvIGNhbGwgYW5kIGFuIGFyZ3VtZW50IHR1cGxlIGZvciBpdCAodG8gZW1ib2R5IHRoZQorICAgICJleHRlcm5hbCBhY3Rpb24iIGJlaW5nIHBlcmZvcm1lZCksIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlIHRvCisgICAgcHJpbnQuCisgICAgIiIiCisgICAgaWYgbXNnIGlzIE5vbmU6CisgICAgICAgIG1zZyA9ICIlcyVyIiAlIChmdW5jLl9fbmFtZV9fLCBhcmdzKQorICAgICAgICBpZiBtc2dbLTI6XSA9PSAnLCknOiAgICAgICAgIyBjb3JyZWN0IGZvciBzaW5nbGV0b24gdHVwbGUKKyAgICAgICAgICAgIG1zZyA9IG1zZ1swOi0yXSArICcpJworCisgICAgbG9nLmluZm8obXNnKQorICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICBmdW5jKCphcmdzKQorCisKK2RlZiBzdHJ0b2Jvb2wgKHZhbCk6CisgICAgIiIiQ29udmVydCBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0cnV0aCB0byB0cnVlICgxKSBvciBmYWxzZSAoMCkuCisKKyAgICBUcnVlIHZhbHVlcyBhcmUgJ3knLCAneWVzJywgJ3QnLCAndHJ1ZScsICdvbicsIGFuZCAnMSc7IGZhbHNlIHZhbHVlcworICAgIGFyZSAnbicsICdubycsICdmJywgJ2ZhbHNlJywgJ29mZicsIGFuZCAnMCcuICBSYWlzZXMgVmFsdWVFcnJvciBpZgorICAgICd2YWwnIGlzIGFueXRoaW5nIGVsc2UuCisgICAgIiIiCisgICAgdmFsID0gc3RyaW5nLmxvd2VyKHZhbCkKKyAgICBpZiB2YWwgaW4gKCd5JywgJ3llcycsICd0JywgJ3RydWUnLCAnb24nLCAnMScpOgorICAgICAgICByZXR1cm4gMQorICAgIGVsaWYgdmFsIGluICgnbicsICdubycsICdmJywgJ2ZhbHNlJywgJ29mZicsICcwJyk6CisgICAgICAgIHJldHVybiAwCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImludmFsaWQgdHJ1dGggdmFsdWUgJXIiICUgKHZhbCwpCisKKworZGVmIGJ5dGVfY29tcGlsZSAocHlfZmlsZXMsCisgICAgICAgICAgICAgICAgICBvcHRpbWl6ZT0wLCBmb3JjZT0wLAorICAgICAgICAgICAgICAgICAgcHJlZml4PU5vbmUsIGJhc2VfZGlyPU5vbmUsCisgICAgICAgICAgICAgICAgICB2ZXJib3NlPTEsIGRyeV9ydW49MCwKKyAgICAgICAgICAgICAgICAgIGRpcmVjdD1Ob25lKToKKyAgICAiIiJCeXRlLWNvbXBpbGUgYSBjb2xsZWN0aW9uIG9mIFB5dGhvbiBzb3VyY2UgZmlsZXMgdG8gZWl0aGVyIC5weWMKKyAgICBvciAucHlvIGZpbGVzIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4gICdweV9maWxlcycgaXMgYSBsaXN0IG9mIGZpbGVzCisgICAgdG8gY29tcGlsZTsgYW55IGZpbGVzIHRoYXQgZG9uJ3QgZW5kIGluICIucHkiIGFyZSBzaWxlbnRseSBza2lwcGVkLgorICAgICdvcHRpbWl6ZScgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAgICAgIDAgLSBkb24ndCBvcHRpbWl6ZSAoZ2VuZXJhdGUgLnB5YykKKyAgICAgIDEgLSBub3JtYWwgb3B0aW1pemF0aW9uIChsaWtlICJweXRob24gLU8iKQorICAgICAgMiAtIGV4dHJhIG9wdGltaXphdGlvbiAobGlrZSAicHl0aG9uIC1PTyIpCisgICAgSWYgJ2ZvcmNlJyBpcyB0cnVlLCBhbGwgZmlsZXMgYXJlIHJlY29tcGlsZWQgcmVnYXJkbGVzcyBvZgorICAgIHRpbWVzdGFtcHMuCisKKyAgICBUaGUgc291cmNlIGZpbGVuYW1lIGVuY29kZWQgaW4gZWFjaCBieXRlY29kZSBmaWxlIGRlZmF1bHRzIHRvIHRoZQorICAgIGZpbGVuYW1lcyBsaXN0ZWQgaW4gJ3B5X2ZpbGVzJzsgeW91IGNhbiBtb2RpZnkgdGhlc2Ugd2l0aCAncHJlZml4JyBhbmQKKyAgICAnYmFzZWRpcicuICAncHJlZml4JyBpcyBhIHN0cmluZyB0aGF0IHdpbGwgYmUgc3RyaXBwZWQgb2ZmIG9mIGVhY2gKKyAgICBzb3VyY2UgZmlsZW5hbWUsIGFuZCAnYmFzZV9kaXInIGlzIGEgZGlyZWN0b3J5IG5hbWUgdGhhdCB3aWxsIGJlCisgICAgcHJlcGVuZGVkIChhZnRlciAncHJlZml4JyBpcyBzdHJpcHBlZCkuICBZb3UgY2FuIHN1cHBseSBlaXRoZXIgb3IgYm90aAorICAgIChvciBuZWl0aGVyKSBvZiAncHJlZml4JyBhbmQgJ2Jhc2VfZGlyJywgYXMgeW91IHdpc2guCisKKyAgICBJZiAnZHJ5X3J1bicgaXMgdHJ1ZSwgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB0aGF0IHdvdWxkCisgICAgYWZmZWN0IHRoZSBmaWxlc3lzdGVtLgorCisgICAgQnl0ZS1jb21waWxhdGlvbiBpcyBlaXRoZXIgZG9uZSBkaXJlY3RseSBpbiB0aGlzIGludGVycHJldGVyIHByb2Nlc3MKKyAgICB3aXRoIHRoZSBzdGFuZGFyZCBweV9jb21waWxlIG1vZHVsZSwgb3IgaW5kaXJlY3RseSBieSB3cml0aW5nIGEKKyAgICB0ZW1wb3Jhcnkgc2NyaXB0IGFuZCBleGVjdXRpbmcgaXQuICBOb3JtYWxseSwgeW91IHNob3VsZCBsZXQKKyAgICAnYnl0ZV9jb21waWxlKCknIGZpZ3VyZSBvdXQgdG8gdXNlIGRpcmVjdCBjb21waWxhdGlvbiBvciBub3QgKHNlZQorICAgIHRoZSBzb3VyY2UgZm9yIGRldGFpbHMpLiAgVGhlICdkaXJlY3QnIGZsYWcgaXMgdXNlZCBieSB0aGUgc2NyaXB0CisgICAgZ2VuZXJhdGVkIGluIGluZGlyZWN0IG1vZGU7IHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSdyZSBkb2luZywgbGVhdmUKKyAgICBpdCBzZXQgdG8gTm9uZS4KKyAgICAiIiIKKyAgICAjIG5vdGhpbmcgaXMgZG9uZSBpZiBzeXMuZG9udF93cml0ZV9ieXRlY29kZSBpcyBUcnVlCisgICAgaWYgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0J5dGVDb21waWxlRXJyb3IoJ2J5dGUtY29tcGlsaW5nIGlzIGRpc2FibGVkLicpCisKKyAgICAjIEZpcnN0LCBpZiB0aGUgY2FsbGVyIGRpZG4ndCBmb3JjZSB1cyBpbnRvIGRpcmVjdCBvciBpbmRpcmVjdCBtb2RlLAorICAgICMgZmlndXJlIG91dCB3aGljaCBtb2RlIHdlIHNob3VsZCBiZSBpbi4gIFdlIHRha2UgYSBjb25zZXJ2YXRpdmUKKyAgICAjIGFwcHJvYWNoOiBjaG9vc2UgZGlyZWN0IG1vZGUgKm9ubHkqIGlmIHRoZSBjdXJyZW50IGludGVycHJldGVyIGlzCisgICAgIyBpbiBkZWJ1ZyBtb2RlIGFuZCBvcHRpbWl6ZSBpcyAwLiAgSWYgd2UncmUgbm90IGluIGRlYnVnIG1vZGUgKC1PCisgICAgIyBvciAtT08pLCB3ZSBkb24ndCBrbm93IHdoaWNoIGxldmVsIG9mIG9wdGltaXphdGlvbiB0aGlzCisgICAgIyBpbnRlcnByZXRlciBpcyBydW5uaW5nIHdpdGgsIHNvIHdlIGNhbid0IGRvIGRpcmVjdAorICAgICMgYnl0ZS1jb21waWxhdGlvbiBhbmQgYmUgY2VydGFpbiB0aGF0IGl0J3MgdGhlIHJpZ2h0IHRoaW5nLiAgVGh1cywKKyAgICAjIGFsd2F5cyBjb21waWxlIGluZGlyZWN0bHkgaWYgdGhlIGN1cnJlbnQgaW50ZXJwcmV0ZXIgaXMgaW4gZWl0aGVyCisgICAgIyBvcHRpbWl6ZSBtb2RlLCBvciBpZiBlaXRoZXIgb3B0aW1pemF0aW9uIGxldmVsIHdhcyByZXF1ZXN0ZWQgYnkKKyAgICAjIHRoZSBjYWxsZXIuCisgICAgaWYgZGlyZWN0IGlzIE5vbmU6CisgICAgICAgIGRpcmVjdCA9IChfX2RlYnVnX18gYW5kIG9wdGltaXplID09IDApCisKKyAgICAjICJJbmRpcmVjdCIgYnl0ZS1jb21waWxhdGlvbjogd3JpdGUgYSB0ZW1wb3Jhcnkgc2NyaXB0IGFuZCB0aGVuCisgICAgIyBydW4gaXQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgZmxhZ3MuCisgICAgaWYgbm90IGRpcmVjdDoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0ZW1wZmlsZSBpbXBvcnQgbWtzdGVtcAorICAgICAgICAgICAgKHNjcmlwdF9mZCwgc2NyaXB0X25hbWUpID0gbWtzdGVtcCgiLnB5IikKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSB0ZW1wZmlsZSBpbXBvcnQgbWt0ZW1wCisgICAgICAgICAgICAoc2NyaXB0X2ZkLCBzY3JpcHRfbmFtZSkgPSBOb25lLCBta3RlbXAoIi5weSIpCisgICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nIGJ5dGUtY29tcGlsYXRpb24gc2NyaXB0ICclcyciLCBzY3JpcHRfbmFtZSkKKyAgICAgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgICAgICBpZiBzY3JpcHRfZmQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2NyaXB0ID0gb3MuZmRvcGVuKHNjcmlwdF9mZCwgInciKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzY3JpcHQgPSBvcGVuKHNjcmlwdF9uYW1lLCAidyIpCisKKyAgICAgICAgICAgIHNjcmlwdC53cml0ZSgiIiJcCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKK2ZpbGVzID0gWworIiIiKQorCisgICAgICAgICAgICAjIFhYWCB3b3VsZCBiZSBuaWNlIHRvIHdyaXRlIGFic29sdXRlIGZpbGVuYW1lcywganVzdCBmb3IKKyAgICAgICAgICAgICMgc2FmZXR5J3Mgc2FrZSAoc2NyaXB0IHNob3VsZCBiZSBtb3JlIHJvYnVzdCBpbiB0aGUgZmFjZSBvZgorICAgICAgICAgICAgIyBjaGRpcidpbmcgYmVmb3JlIHJ1bm5pbmcgaXQpLiAgQnV0IHRoaXMgcmVxdWlyZXMgYWJzcGF0aCdpbmcKKyAgICAgICAgICAgICMgJ3ByZWZpeCcgYXMgd2VsbCwgYW5kIHRoYXQgYnJlYWtzIHRoZSBoYWNrIGluIGJ1aWxkX2xpYidzCisgICAgICAgICAgICAjICdieXRlX2NvbXBpbGUoKScgbWV0aG9kIHRoYXQgY2FyZWZ1bGx5IHRhY2tzIG9uIGEgdHJhaWxpbmcKKyAgICAgICAgICAgICMgc2xhc2ggKG9zLnNlcCByZWFsbHkpIHRvIG1ha2Ugc3VyZSB0aGUgcHJlZml4IGhlcmUgaXMgImp1c3QKKyAgICAgICAgICAgICMgcmlnaHQiLiAgVGhpcyB3aG9sZSBwcmVmaXggYnVzaW5lc3MgaXMgcmF0aGVyIGRlbGljYXRlIC0tIHRoZQorICAgICAgICAgICAgIyBwcm9ibGVtIGlzIHRoYXQgaXQncyByZWFsbHkgYSBkaXJlY3RvcnksIGJ1dCBJJ20gdHJlYXRpbmcgaXQKKyAgICAgICAgICAgICMgYXMgYSBkdW1iIHN0cmluZywgc28gdHJhaWxpbmcgc2xhc2hlcyBhbmQgc28gZm9ydGggbWF0dGVyLgorCisgICAgICAgICAgICAjcHlfZmlsZXMgPSBtYXAob3MucGF0aC5hYnNwYXRoLCBweV9maWxlcykKKyAgICAgICAgICAgICNpZiBwcmVmaXg6CisgICAgICAgICAgICAjICAgIHByZWZpeCA9IG9zLnBhdGguYWJzcGF0aChwcmVmaXgpCisKKyAgICAgICAgICAgIHNjcmlwdC53cml0ZShzdHJpbmcuam9pbihtYXAocmVwciwgcHlfZmlsZXMpLCAiLFxuIikgKyAiXVxuIikKKyAgICAgICAgICAgIHNjcmlwdC53cml0ZSgiIiIKK2J5dGVfY29tcGlsZShmaWxlcywgb3B0aW1pemU9JXIsIGZvcmNlPSVyLAorICAgICAgICAgICAgIHByZWZpeD0lciwgYmFzZV9kaXI9JXIsCisgICAgICAgICAgICAgdmVyYm9zZT0lciwgZHJ5X3J1bj0wLAorICAgICAgICAgICAgIGRpcmVjdD0xKQorIiIiICUgKG9wdGltaXplLCBmb3JjZSwgcHJlZml4LCBiYXNlX2RpciwgdmVyYm9zZSkpCisKKyAgICAgICAgICAgIHNjcmlwdC5jbG9zZSgpCisKKyAgICAgICAgY21kID0gW3N5cy5leGVjdXRhYmxlLCBzY3JpcHRfbmFtZV0KKyAgICAgICAgaWYgb3B0aW1pemUgPT0gMToKKyAgICAgICAgICAgIGNtZC5pbnNlcnQoMSwgIi1PIikKKyAgICAgICAgZWxpZiBvcHRpbWl6ZSA9PSAyOgorICAgICAgICAgICAgY21kLmluc2VydCgxLCAiLU9PIikKKyAgICAgICAgc3Bhd24oY21kLCBkcnlfcnVuPWRyeV9ydW4pCisgICAgICAgIGV4ZWN1dGUob3MucmVtb3ZlLCAoc2NyaXB0X25hbWUsKSwgInJlbW92aW5nICVzIiAlIHNjcmlwdF9uYW1lLAorICAgICAgICAgICAgICAgIGRyeV9ydW49ZHJ5X3J1bikKKworICAgICMgIkRpcmVjdCIgYnl0ZS1jb21waWxhdGlvbjogdXNlIHRoZSBweV9jb21waWxlIG1vZHVsZSB0byBjb21waWxlCisgICAgIyByaWdodCBoZXJlLCByaWdodCBub3cuICBOb3RlIHRoYXQgdGhlIHNjcmlwdCBnZW5lcmF0ZWQgaW4gaW5kaXJlY3QKKyAgICAjIG1vZGUgc2ltcGx5IGNhbGxzICdieXRlX2NvbXBpbGUoKScgaW4gZGlyZWN0IG1vZGUsIGEgd2VpcmQgc29ydCBvZgorICAgICMgY3Jvc3MtcHJvY2VzcyByZWN1cnNpb24uICBIZXksIGl0IHdvcmtzIQorICAgIGVsc2U6CisgICAgICAgIGZyb20gcHlfY29tcGlsZSBpbXBvcnQgY29tcGlsZQorCisgICAgICAgIGZvciBmaWxlIGluIHB5X2ZpbGVzOgorICAgICAgICAgICAgaWYgZmlsZVstMzpdICE9ICIucHkiOgorICAgICAgICAgICAgICAgICMgVGhpcyBsZXRzIHVzIGJlIGxhenkgYW5kIG5vdCBmaWx0ZXIgZmlsZW5hbWVzIGluCisgICAgICAgICAgICAgICAgIyB0aGUgImluc3RhbGxfbGliIiBjb21tYW5kLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgVGVybWlub2xvZ3kgZnJvbSB0aGUgcHlfY29tcGlsZSBtb2R1bGU6CisgICAgICAgICAgICAjICAgY2ZpbGUgLSBieXRlLWNvbXBpbGVkIGZpbGUKKyAgICAgICAgICAgICMgICBkZmlsZSAtIHB1cnBvcnRlZCBzb3VyY2UgZmlsZW5hbWUgKHNhbWUgYXMgJ2ZpbGUnIGJ5IGRlZmF1bHQpCisgICAgICAgICAgICBjZmlsZSA9IGZpbGUgKyAoX19kZWJ1Z19fIGFuZCAiYyIgb3IgIm8iKQorICAgICAgICAgICAgZGZpbGUgPSBmaWxlCisgICAgICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICAgICAgaWYgZmlsZVs6bGVuKHByZWZpeCldICE9IHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoImludmFsaWQgcHJlZml4OiBmaWxlbmFtZSAlciBkb2Vzbid0IHN0YXJ0IHdpdGggJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChmaWxlLCBwcmVmaXgpKQorICAgICAgICAgICAgICAgIGRmaWxlID0gZGZpbGVbbGVuKHByZWZpeCk6XQorICAgICAgICAgICAgaWYgYmFzZV9kaXI6CisgICAgICAgICAgICAgICAgZGZpbGUgPSBvcy5wYXRoLmpvaW4oYmFzZV9kaXIsIGRmaWxlKQorCisgICAgICAgICAgICBjZmlsZV9iYXNlID0gb3MucGF0aC5iYXNlbmFtZShjZmlsZSkKKyAgICAgICAgICAgIGlmIGRpcmVjdDoKKyAgICAgICAgICAgICAgICBpZiBmb3JjZSBvciBuZXdlcihmaWxlLCBjZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJieXRlLWNvbXBpbGluZyAlcyB0byAlcyIsIGZpbGUsIGNmaWxlX2Jhc2UpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZShmaWxlLCBjZmlsZSwgZGZpbGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJza2lwcGluZyBieXRlLWNvbXBpbGF0aW9uIG9mICVzIHRvICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGNmaWxlX2Jhc2UpCisKKyMgYnl0ZV9jb21waWxlICgpCisKK2RlZiByZmM4MjJfZXNjYXBlIChoZWFkZXIpOgorICAgICIiIlJldHVybiBhIHZlcnNpb24gb2YgdGhlIHN0cmluZyBlc2NhcGVkIGZvciBpbmNsdXNpb24gaW4gYW4KKyAgICBSRkMtODIyIGhlYWRlciwgYnkgZW5zdXJpbmcgdGhlcmUgYXJlIDggc3BhY2VzIHNwYWNlIGFmdGVyIGVhY2ggbmV3bGluZS4KKyAgICAiIiIKKyAgICBsaW5lcyA9IHN0cmluZy5zcGxpdChoZWFkZXIsICdcbicpCisgICAgaGVhZGVyID0gc3RyaW5nLmpvaW4obGluZXMsICdcbicgKyA4KicgJykKKyAgICByZXR1cm4gaGVhZGVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTU1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9uLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmI1YjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbi5weQpAQCAtMCwwICsxLDI5OSBAQAorIworIyBkaXN0dXRpbHMvdmVyc2lvbi5weQorIworIyBJbXBsZW1lbnRzIG11bHRpcGxlIHZlcnNpb24gbnVtYmVyaW5nIGNvbnZlbnRpb25zIGZvciB0aGUKKyMgUHl0aG9uIE1vZHVsZSBEaXN0cmlidXRpb24gVXRpbGl0aWVzLgorIworIyAkSWQkCisjCisKKyIiIlByb3ZpZGVzIGNsYXNzZXMgdG8gcmVwcmVzZW50IG1vZHVsZSB2ZXJzaW9uIG51bWJlcnMgKG9uZSBjbGFzcyBmb3IKK2VhY2ggc3R5bGUgb2YgdmVyc2lvbiBudW1iZXJpbmcpLiAgVGhlcmUgYXJlIGN1cnJlbnRseSB0d28gc3VjaCBjbGFzc2VzCitpbXBsZW1lbnRlZDogU3RyaWN0VmVyc2lvbiBhbmQgTG9vc2VWZXJzaW9uLgorCitFdmVyeSB2ZXJzaW9uIG51bWJlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgaW50ZXJmYWNlOgorICAqIHRoZSAncGFyc2UnIG1ldGhvZCB0YWtlcyBhIHN0cmluZyBhbmQgcGFyc2VzIGl0IHRvIHNvbWUgaW50ZXJuYWwKKyAgICByZXByZXNlbnRhdGlvbjsgaWYgdGhlIHN0cmluZyBpcyBhbiBpbnZhbGlkIHZlcnNpb24gbnVtYmVyLAorICAgICdwYXJzZScgcmFpc2VzIGEgVmFsdWVFcnJvciBleGNlcHRpb24KKyAgKiB0aGUgY2xhc3MgY29uc3RydWN0b3IgdGFrZXMgYW4gb3B0aW9uYWwgc3RyaW5nIGFyZ3VtZW50IHdoaWNoLAorICAgIGlmIHN1cHBsaWVkLCBpcyBwYXNzZWQgdG8gJ3BhcnNlJworICAqIF9fc3RyX18gcmVjb25zdHJ1Y3RzIHRoZSBzdHJpbmcgdGhhdCB3YXMgcGFzc2VkIHRvICdwYXJzZScgKG9yCisgICAgYW4gZXF1aXZhbGVudCBzdHJpbmcgLS0gaWUuIG9uZSB0aGF0IHdpbGwgZ2VuZXJhdGUgYW4gZXF1aXZhbGVudAorICAgIHZlcnNpb24gbnVtYmVyIGluc3RhbmNlKQorICAqIF9fcmVwcl9fIGdlbmVyYXRlcyBQeXRob24gY29kZSB0byByZWNyZWF0ZSB0aGUgdmVyc2lvbiBudW1iZXIgaW5zdGFuY2UKKyAgKiBfX2NtcF9fIGNvbXBhcmVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHdpdGggZWl0aGVyIGFub3RoZXIgaW5zdGFuY2UKKyAgICBvZiB0aGUgc2FtZSBjbGFzcyBvciBhIHN0cmluZyAod2hpY2ggd2lsbCBiZSBwYXJzZWQgdG8gYW4gaW5zdGFuY2UKKyAgICBvZiB0aGUgc2FtZSBjbGFzcywgdGh1cyBtdXN0IGZvbGxvdyB0aGUgc2FtZSBydWxlcykKKyIiIgorCitpbXBvcnQgc3RyaW5nLCByZQorZnJvbSB0eXBlcyBpbXBvcnQgU3RyaW5nVHlwZQorCitjbGFzcyBWZXJzaW9uOgorICAgICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHZlcnNpb24gbnVtYmVyaW5nIGNsYXNzZXMuICBKdXN0IHByb3ZpZGVzCisgICAgY29uc3RydWN0b3IgKF9faW5pdF9fKSBhbmQgcmVwcm9kdWNlciAoX19yZXByX18pLCBiZWNhdXNlIHRob3NlCisgICAgc2VlbSB0byBiZSB0aGUgc2FtZSBmb3IgYWxsIHZlcnNpb24gbnVtYmVyaW5nIGNsYXNzZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHZzdHJpbmc9Tm9uZSk6CisgICAgICAgIGlmIHZzdHJpbmc6CisgICAgICAgICAgICBzZWxmLnBhcnNlKHZzdHJpbmcpCisKKyAgICBkZWYgX19yZXByX18gKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzICgnJXMnKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHN0cihzZWxmKSkKKworCisjIEludGVyZmFjZSBmb3IgdmVyc2lvbi1udW1iZXIgY2xhc3NlcyAtLSBtdXN0IGJlIGltcGxlbWVudGVkCisjIGJ5IHRoZSBmb2xsb3dpbmcgY2xhc3NlcyAodGhlIGNvbmNyZXRlIG9uZXMgLS0gVmVyc2lvbiBzaG91bGQKKyMgYmUgdHJlYXRlZCBhcyBhbiBhYnN0cmFjdCBjbGFzcykuCisjICAgIF9faW5pdF9fIChzdHJpbmcpIC0gY3JlYXRlIGFuZCB0YWtlIHNhbWUgYWN0aW9uIGFzICdwYXJzZScKKyMgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nIHBhcmFtZXRlciBpcyBvcHRpb25hbCkKKyMgICAgcGFyc2UgKHN0cmluZykgICAgLSBjb252ZXJ0IGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHRvIHdoYXRldmVyCisjICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gaXMgYXBwcm9wcmlhdGUgZm9yCisjICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdHlsZSBvZiB2ZXJzaW9uIG51bWJlcmluZworIyAgICBfX3N0cl9fIChzZWxmKSAgICAtIGNvbnZlcnQgYmFjayB0byBhIHN0cmluZzsgc2hvdWxkIGJlIHZlcnkgc2ltaWxhcgorIyAgICAgICAgICAgICAgICAgICAgICAgIChpZiBub3QgaWRlbnRpY2FsIHRvKSB0aGUgc3RyaW5nIHN1cHBsaWVkIHRvIHBhcnNlCisjICAgIF9fcmVwcl9fIChzZWxmKSAgIC0gZ2VuZXJhdGUgUHl0aG9uIGNvZGUgdG8gcmVjcmVhdGUKKyMgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5zdGFuY2UKKyMgICAgX19jbXBfXyAoc2VsZiwgb3RoZXIpIC0gY29tcGFyZSB0d28gdmVyc2lvbiBudW1iZXJzICgnb3RoZXInIG1heQorIyAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFuIHVucGFyc2VkIHZlcnNpb24gc3RyaW5nLCBvciBhbm90aGVyCisjICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Ugb2YgeW91ciB2ZXJzaW9uIGNsYXNzKQorCisKK2NsYXNzIFN0cmljdFZlcnNpb24gKFZlcnNpb24pOgorCisgICAgIiIiVmVyc2lvbiBudW1iZXJpbmcgZm9yIGFuYWwgcmV0ZW50aXZlcyBhbmQgc29mdHdhcmUgaWRlYWxpc3RzLgorICAgIEltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGludGVyZmFjZSBmb3IgdmVyc2lvbiBudW1iZXIgY2xhc3NlcyBhcworICAgIGRlc2NyaWJlZCBhYm92ZS4gIEEgdmVyc2lvbiBudW1iZXIgY29uc2lzdHMgb2YgdHdvIG9yIHRocmVlCisgICAgZG90LXNlcGFyYXRlZCBudW1lcmljIGNvbXBvbmVudHMsIHdpdGggYW4gb3B0aW9uYWwgInByZS1yZWxlYXNlIiB0YWcKKyAgICBvbiB0aGUgZW5kLiAgVGhlIHByZS1yZWxlYXNlIHRhZyBjb25zaXN0cyBvZiB0aGUgbGV0dGVyICdhJyBvciAnYicKKyAgICBmb2xsb3dlZCBieSBhIG51bWJlci4gIElmIHRoZSBudW1lcmljIGNvbXBvbmVudHMgb2YgdHdvIHZlcnNpb24KKyAgICBudW1iZXJzIGFyZSBlcXVhbCwgdGhlbiBvbmUgd2l0aCBhIHByZS1yZWxlYXNlIHRhZyB3aWxsIGFsd2F5cworICAgIGJlIGRlZW1lZCBlYXJsaWVyIChsZXNzZXIpIHRoYW4gb25lIHdpdGhvdXQuCisKKyAgICBUaGUgZm9sbG93aW5nIGFyZSB2YWxpZCB2ZXJzaW9uIG51bWJlcnMgKHNob3duIGluIHRoZSBvcmRlciB0aGF0CisgICAgd291bGQgYmUgb2J0YWluZWQgYnkgc29ydGluZyBhY2NvcmRpbmcgdG8gdGhlIHN1cHBsaWVkIGNtcCBmdW5jdGlvbik6CisKKyAgICAgICAgMC40ICAgICAgIDAuNC4wICAodGhlc2UgdHdvIGFyZSBlcXVpdmFsZW50KQorICAgICAgICAwLjQuMQorICAgICAgICAwLjVhMQorICAgICAgICAwLjViMworICAgICAgICAwLjUKKyAgICAgICAgMC45LjYKKyAgICAgICAgMS4wCisgICAgICAgIDEuMC40YTMKKyAgICAgICAgMS4wLjRiMQorICAgICAgICAxLjAuNAorCisgICAgVGhlIGZvbGxvd2luZyBhcmUgZXhhbXBsZXMgb2YgaW52YWxpZCB2ZXJzaW9uIG51bWJlcnM6CisKKyAgICAgICAgMQorICAgICAgICAyLjcuMi4yCisgICAgICAgIDEuMy5hNAorICAgICAgICAxLjNwbDEKKyAgICAgICAgMS4zYzQKKworICAgIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgdmVyc2lvbiBudW1iZXJpbmcgc3lzdGVtIHdpbGwgYmUgZXhwbGFpbmVkCisgICAgaW4gdGhlIGRpc3R1dGlscyBkb2N1bWVudGF0aW9uLgorICAgICIiIgorCisgICAgdmVyc2lvbl9yZSA9IHJlLmNvbXBpbGUocideKFxkKykgXC4gKFxkKykgKFwuIChcZCspKT8gKFthYl0oXGQrKSk/JCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuVkVSQk9TRSkKKworCisgICAgZGVmIHBhcnNlIChzZWxmLCB2c3RyaW5nKToKKyAgICAgICAgbWF0Y2ggPSBzZWxmLnZlcnNpb25fcmUubWF0Y2godnN0cmluZykKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImludmFsaWQgdmVyc2lvbiBudW1iZXIgJyVzJyIgJSB2c3RyaW5nCisKKyAgICAgICAgKG1ham9yLCBtaW5vciwgcGF0Y2gsIHByZXJlbGVhc2UsIHByZXJlbGVhc2VfbnVtKSA9IFwKKyAgICAgICAgICAgIG1hdGNoLmdyb3VwKDEsIDIsIDQsIDUsIDYpCisKKyAgICAgICAgaWYgcGF0Y2g6CisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSB0dXBsZShtYXAoc3RyaW5nLmF0b2ksIFttYWpvciwgbWlub3IsIHBhdGNoXSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSB0dXBsZShtYXAoc3RyaW5nLmF0b2ksIFttYWpvciwgbWlub3JdKSArIFswXSkKKworICAgICAgICBpZiBwcmVyZWxlYXNlOgorICAgICAgICAgICAgc2VsZi5wcmVyZWxlYXNlID0gKHByZXJlbGVhc2VbMF0sIHN0cmluZy5hdG9pKHByZXJlbGVhc2VfbnVtKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHJlcmVsZWFzZSA9IE5vbmUKKworCisgICAgZGVmIF9fc3RyX18gKHNlbGYpOgorCisgICAgICAgIGlmIHNlbGYudmVyc2lvblsyXSA9PSAwOgorICAgICAgICAgICAgdnN0cmluZyA9IHN0cmluZy5qb2luKG1hcChzdHIsIHNlbGYudmVyc2lvblswOjJdKSwgJy4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdnN0cmluZyA9IHN0cmluZy5qb2luKG1hcChzdHIsIHNlbGYudmVyc2lvbiksICcuJykKKworICAgICAgICBpZiBzZWxmLnByZXJlbGVhc2U6CisgICAgICAgICAgICB2c3RyaW5nID0gdnN0cmluZyArIHNlbGYucHJlcmVsZWFzZVswXSArIHN0cihzZWxmLnByZXJlbGVhc2VbMV0pCisKKyAgICAgICAgcmV0dXJuIHZzdHJpbmcKKworCisgICAgZGVmIF9fY21wX18gKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgU3RyaW5nVHlwZSk6CisgICAgICAgICAgICBvdGhlciA9IFN0cmljdFZlcnNpb24ob3RoZXIpCisKKyAgICAgICAgY29tcGFyZSA9IGNtcChzZWxmLnZlcnNpb24sIG90aGVyLnZlcnNpb24pCisgICAgICAgIGlmIChjb21wYXJlID09IDApOiAgICAgICAgICAgICAgIyBoYXZlIHRvIGNvbXBhcmUgcHJlcmVsZWFzZQorCisgICAgICAgICAgICAjIGNhc2UgMTogbmVpdGhlciBoYXMgcHJlcmVsZWFzZTsgdGhleSdyZSBlcXVhbAorICAgICAgICAgICAgIyBjYXNlIDI6IHNlbGYgaGFzIHByZXJlbGVhc2UsIG90aGVyIGRvZXNuJ3Q7IG90aGVyIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgICMgY2FzZSAzOiBzZWxmIGRvZXNuJ3QgaGF2ZSBwcmVyZWxlYXNlLCBvdGhlciBkb2VzOiBzZWxmIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgICMgY2FzZSA0OiBib3RoIGhhdmUgcHJlcmVsZWFzZTogbXVzdCBjb21wYXJlIHRoZW0hCisKKyAgICAgICAgICAgIGlmIChub3Qgc2VsZi5wcmVyZWxlYXNlIGFuZCBub3Qgb3RoZXIucHJlcmVsZWFzZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsaWYgKHNlbGYucHJlcmVsZWFzZSBhbmQgbm90IG90aGVyLnByZXJlbGVhc2UpOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgZWxpZiAobm90IHNlbGYucHJlcmVsZWFzZSBhbmQgb3RoZXIucHJlcmVsZWFzZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIGVsaWYgKHNlbGYucHJlcmVsZWFzZSBhbmQgb3RoZXIucHJlcmVsZWFzZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLnByZXJlbGVhc2UsIG90aGVyLnByZXJlbGVhc2UpCisKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAjIG51bWVyaWMgdmVyc2lvbnMgZG9uJ3QgbWF0Y2ggLS0KKyAgICAgICAgICAgIHJldHVybiBjb21wYXJlICAgICAgICAgICAgICAjIHByZXJlbGVhc2Ugc3R1ZmYgZG9lc24ndCBtYXR0ZXIKKworCisjIGVuZCBjbGFzcyBTdHJpY3RWZXJzaW9uCisKKworIyBUaGUgcnVsZXMgYWNjb3JkaW5nIHRvIEdyZWcgU3RlaW46CisjIDEpIGEgdmVyc2lvbiBudW1iZXIgaGFzIDEgb3IgbW9yZSBudW1iZXJzIHNlcGFyYXRlZCBieSBhIHBlcmlvZCBvciBieQorIyAgICBzZXF1ZW5jZXMgb2YgbGV0dGVycy4gSWYgb25seSBwZXJpb2RzLCB0aGVuIHRoZXNlIGFyZSBjb21wYXJlZAorIyAgICBsZWZ0LXRvLXJpZ2h0IHRvIGRldGVybWluZSBhbiBvcmRlcmluZy4KKyMgMikgc2VxdWVuY2VzIG9mIGxldHRlcnMgYXJlIHBhcnQgb2YgdGhlIHR1cGxlIGZvciBjb21wYXJpc29uIGFuZCBhcmUKKyMgICAgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkKKyMgMykgcmVjb2duaXplIHRoZSBudW1lcmljIGNvbXBvbmVudHMgbWF5IGhhdmUgbGVhZGluZyB6ZXJvZXMKKyMKKyMgVGhlIExvb3NlVmVyc2lvbiBjbGFzcyBiZWxvdyBpbXBsZW1lbnRzIHRoZXNlIHJ1bGVzOiBhIHZlcnNpb24gbnVtYmVyCisjIHN0cmluZyBpcyBzcGxpdCB1cCBpbnRvIGEgdHVwbGUgb2YgaW50ZWdlciBhbmQgc3RyaW5nIGNvbXBvbmVudHMsIGFuZAorIyBjb21wYXJpc29uIGlzIGEgc2ltcGxlIHR1cGxlIGNvbXBhcmlzb24uICBUaGlzIG1lYW5zIHRoYXQgdmVyc2lvbgorIyBudW1iZXJzIGJlaGF2ZSBpbiBhIHByZWRpY3RhYmxlIGFuZCBvYnZpb3VzIHdheSwgYnV0IGEgd2F5IHRoYXQgbWlnaHQKKyMgbm90IG5lY2Vzc2FyaWx5IGJlIGhvdyBwZW9wbGUgKndhbnQqIHZlcnNpb24gbnVtYmVycyB0byBiZWhhdmUuICBUaGVyZQorIyB3b3VsZG4ndCBiZSBhIHByb2JsZW0gaWYgcGVvcGxlIGNvdWxkIHN0aWNrIHRvIHB1cmVseSBudW1lcmljIHZlcnNpb24KKyMgbnVtYmVyczoganVzdCBzcGxpdCBvbiBwZXJpb2QgYW5kIGNvbXBhcmUgdGhlIG51bWJlcnMgYXMgdHVwbGVzLgorIyBIb3dldmVyLCBwZW9wbGUgaW5zaXN0IG9uIHB1dHRpbmcgbGV0dGVycyBpbnRvIHRoZWlyIHZlcnNpb24gbnVtYmVyczsKKyMgdGhlIG1vc3QgY29tbW9uIHB1cnBvc2Ugc2VlbXMgdG8gYmU6CisjICAgLSBpbmRpY2F0aW5nIGEgInByZS1yZWxlYXNlIiB2ZXJzaW9uCisjICAgICAoJ2FscGhhJywgJ2JldGEnLCAnYScsICdiJywgJ3ByZScsICdwJykKKyMgICAtIGluZGljYXRpbmcgYSBwb3N0LXJlbGVhc2UgcGF0Y2ggKCdwJywgJ3BsJywgJ3BhdGNoJykKKyMgYnV0IG9mIGNvdXJzZSB0aGlzIGNhbid0IGNvdmVyIGFsbCB2ZXJzaW9uIG51bWJlciBzY2hlbWVzLCBhbmQgdGhlcmUncworIyBubyB3YXkgdG8ga25vdyB3aGF0IGEgcHJvZ3JhbW1lciBtZWFucyB3aXRob3V0IGFza2luZyBoaW0uCisjCisjIFRoZSBwcm9ibGVtIGlzIHdoYXQgdG8gZG8gd2l0aCBsZXR0ZXJzIChhbmQgb3RoZXIgbm9uLW51bWVyaWMKKyMgY2hhcmFjdGVycykgaW4gYSB2ZXJzaW9uIG51bWJlci4gIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgdGhlCisjIG9idmlvdXMgYW5kIHByZWRpY3RhYmxlIHRoaW5nOiBrZWVwIHRoZW0gYXMgc3RyaW5ncyBhbmQgY29tcGFyZQorIyBsZXhpY2FsbHkgd2l0aGluIGEgdHVwbGUgY29tcGFyaXNvbi4gIFRoaXMgaGFzIHRoZSBkZXNpcmVkIGVmZmVjdCBpZgorIyBhbiBhcHBlbmRlZCBsZXR0ZXIgc2VxdWVuY2UgaW1wbGllcyBzb21ldGhpbmcgInBvc3QtcmVsZWFzZSI6CisjIGVnLiAiMC45OSIgPCAiMC45OXBsMTQiIDwgIjEuMCIsIGFuZCAiNS4wMDEiIDwgIjUuMDAxbSIgPCAiNS4wMDIiLgorIworIyBIb3dldmVyLCBpZiBsZXR0ZXJzIGluIGEgdmVyc2lvbiBudW1iZXIgaW1wbHkgYSBwcmUtcmVsZWFzZSB2ZXJzaW9uLAorIyB0aGUgIm9idmlvdXMiIHRoaW5nIGlzbid0IGNvcnJlY3QuICBFZy4geW91IHdvdWxkIGV4cGVjdCB0aGF0CisjICIxLjUuMSIgPCAiMS41LjJhMiIgPCAiMS41LjIiLCBidXQgdW5kZXIgdGhlIHR1cGxlL2xleGljYWwgY29tcGFyaXNvbgorIyBpbXBsZW1lbnRlZCBoZXJlLCB0aGlzIGp1c3QgaXNuJ3Qgc28uCisjCisjIFR3byBwb3NzaWJsZSBzb2x1dGlvbnMgY29tZSB0byBtaW5kLiAgVGhlIGZpcnN0IGlzIHRvIHRpZSB0aGUKKyMgY29tcGFyaXNvbiBhbGdvcml0aG0gdG8gYSBwYXJ0aWN1bGFyIHNldCBvZiBzZW1hbnRpYyBydWxlcywgYXMgaGFzCisjIGJlZW4gZG9uZSBpbiB0aGUgU3RyaWN0VmVyc2lvbiBjbGFzcyBhYm92ZS4gIFRoaXMgd29ya3MgZ3JlYXQgYXMgbG9uZworIyBhcyBldmVyeW9uZSBjYW4gZ28gYWxvbmcgd2l0aCBib25kYWdlIGFuZCBkaXNjaXBsaW5lLiAgSG9wZWZ1bGx5IGEKKyMgKGxhcmdlKSBzdWJzZXQgb2YgUHl0aG9uIG1vZHVsZSBwcm9ncmFtbWVycyB3aWxsIGFncmVlIHRoYXQgdGhlCisjIHBhcnRpY3VsYXIgZmxhdm91ciBvZiBib25kYWdlIGFuZCBkaXNjaXBsaW5lIHByb3ZpZGVkIGJ5IFN0cmljdFZlcnNpb24KKyMgcHJvdmlkZXMgZW5vdWdoIGJlbmVmaXQgdG8gYmUgd29ydGggdXNpbmcsIGFuZCB3aWxsIHN1Ym1pdCB0aGVpcgorIyB2ZXJzaW9uIG51bWJlcmluZyBzY2hlbWUgdG8gaXRzIGRvbWluYXRpb24uICBUaGUgZnJlZS10aGlua2luZworIyBhbmFyY2hpc3RzIGluIHRoZSBsb3Qgd2lsbCBuZXZlciBnaXZlIGluLCB0aG91Z2gsIGFuZCBzb21ldGhpbmcgbmVlZHMKKyMgdG8gYmUgZG9uZSB0byBhY2NvbW1vZGF0ZSB0aGVtLgorIworIyBQZXJoYXBzIGEgIm1vZGVyYXRlbHkgc3RyaWN0IiB2ZXJzaW9uIGNsYXNzIGNvdWxkIGJlIGltcGxlbWVudGVkIHRoYXQKKyMgbGV0cyBhbG1vc3QgYW55dGhpbmcgc2xpZGUgKHN5bnRhY3RpY2FsbHkpLCBhbmQgbWFrZXMgc29tZSBoZXVyaXN0aWMKKyMgYXNzdW1wdGlvbnMgYWJvdXQgbm9uLWRpZ2l0cyBpbiB2ZXJzaW9uIG51bWJlciBzdHJpbmdzLiAgVGhpcyBjb3VsZAorIyBzaW5rIGludG8gc3BlY2lhbC1jYXNlLWhlbGwsIHRob3VnaDsgaWYgSSB3YXMgYXMgdGFsZW50ZWQgYW5kCisjIGlkaW9zeW5jcmF0aWMgYXMgTGFycnkgV2FsbCwgSSdkIGdvIGFoZWFkIGFuZCBpbXBsZW1lbnQgYSBjbGFzcyB0aGF0CisjIHNvbWVob3cga25vd3MgdGhhdCAiMS4yLjEiIDwgIjEuMi4yYTIiIDwgIjEuMi4yIiA8ICIxLjIuMnBsMyIsIGFuZCBpcworIyBqdXN0IGFzIGhhcHB5IGRlYWxpbmcgd2l0aCB0aGluZ3MgbGlrZSAiMmc2IiBhbmQgIjEuMTMrKyIuICBJIGRvbid0CisjIHRoaW5rIEknbSBzbWFydCBlbm91Z2ggdG8gZG8gaXQgcmlnaHQgdGhvdWdoLgorIworIyBJbiBhbnkgY2FzZSwgSSd2ZSBjb2RlZCB0aGUgdGVzdCBzdWl0ZSBmb3IgdGhpcyBtb2R1bGUgKHNlZQorIyAuLi90ZXN0L3Rlc3RfdmVyc2lvbi5weSkgc3BlY2lmaWNhbGx5IHRvIGZhaWwgb24gdGhpbmdzIGxpa2UgY29tcGFyaW5nCisjICIxLjJhMiIgYW5kICIxLjIiLiAgVGhhdCdzIG5vdCBiZWNhdXNlIHRoZSAqY29kZSogaXMgZG9pbmcgYW55dGhpbmcKKyMgd3JvbmcsIGl0J3MgYmVjYXVzZSB0aGUgc2ltcGxlLCBvYnZpb3VzIGRlc2lnbiBkb2Vzbid0IG1hdGNoIG15CisjIGNvbXBsaWNhdGVkLCBoYWlyeSBleHBlY3RhdGlvbnMgZm9yIHJlYWwtd29ybGQgdmVyc2lvbiBudW1iZXJzLiAgSXQKKyMgd291bGQgYmUgYSBzbmFwIHRvIGZpeCB0aGUgdGVzdCBzdWl0ZSB0byBzYXksICJZZXAsIExvb3NlVmVyc2lvbiBkb2VzCisjIHRoZSBSaWdodCBUaGluZyIgKGllLiB0aGUgY29kZSBtYXRjaGVzIHRoZSBjb25jZXB0aW9uKS4gIEJ1dCBJJ2QgcmF0aGVyCisjIGhhdmUgYSBjb25jZXB0aW9uIHRoYXQgbWF0Y2hlcyBjb21tb24gbm90aW9ucyBhYm91dCB2ZXJzaW9uIG51bWJlcnMuCisKK2NsYXNzIExvb3NlVmVyc2lvbiAoVmVyc2lvbik6CisKKyAgICAiIiJWZXJzaW9uIG51bWJlcmluZyBmb3IgYW5hcmNoaXN0cyBhbmQgc29mdHdhcmUgcmVhbGlzdHMuCisgICAgSW1wbGVtZW50cyB0aGUgc3RhbmRhcmQgaW50ZXJmYWNlIGZvciB2ZXJzaW9uIG51bWJlciBjbGFzc2VzIGFzCisgICAgZGVzY3JpYmVkIGFib3ZlLiAgQSB2ZXJzaW9uIG51bWJlciBjb25zaXN0cyBvZiBhIHNlcmllcyBvZiBudW1iZXJzLAorICAgIHNlcGFyYXRlZCBieSBlaXRoZXIgcGVyaW9kcyBvciBzdHJpbmdzIG9mIGxldHRlcnMuICBXaGVuIGNvbXBhcmluZworICAgIHZlcnNpb24gbnVtYmVycywgdGhlIG51bWVyaWMgY29tcG9uZW50cyB3aWxsIGJlIGNvbXBhcmVkCisgICAgbnVtZXJpY2FsbHksIGFuZCB0aGUgYWxwaGFiZXRpYyBjb21wb25lbnRzIGxleGljYWxseS4gIFRoZSBmb2xsb3dpbmcKKyAgICBhcmUgYWxsIHZhbGlkIHZlcnNpb24gbnVtYmVycywgaW4gbm8gcGFydGljdWxhciBvcmRlcjoKKworICAgICAgICAxLjUuMQorICAgICAgICAxLjUuMmIyCisgICAgICAgIDE2MQorICAgICAgICAzLjEwYQorICAgICAgICA4LjAyCisgICAgICAgIDMuNGoKKyAgICAgICAgMTk5Ni4wNy4xMgorICAgICAgICAzLjIucGwwCisgICAgICAgIDMuMS4xLjYKKyAgICAgICAgMmc2CisgICAgICAgIDExZworICAgICAgICAwLjk2MDkyMworICAgICAgICAyLjJiZXRhMjkKKyAgICAgICAgMS4xMysrCisgICAgICAgIDUuNS5rdworICAgICAgICAyLjBiMXBsMAorCisgICAgSW4gZmFjdCwgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBhbiBpbnZhbGlkIHZlcnNpb24gbnVtYmVyIHVuZGVyCisgICAgdGhpcyBzY2hlbWU7IHRoZSBydWxlcyBmb3IgY29tcGFyaXNvbiBhcmUgc2ltcGxlIGFuZCBwcmVkaWN0YWJsZSwKKyAgICBidXQgbWF5IG5vdCBhbHdheXMgZ2l2ZSB0aGUgcmVzdWx0cyB5b3Ugd2FudCAoZm9yIHNvbWUgZGVmaW5pdGlvbgorICAgIG9mICJ3YW50IikuCisgICAgIiIiCisKKyAgICBjb21wb25lbnRfcmUgPSByZS5jb21waWxlKHInKFxkKyB8IFthLXpdKyB8IFwuKScsIHJlLlZFUkJPU0UpCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHZzdHJpbmc9Tm9uZSk6CisgICAgICAgIGlmIHZzdHJpbmc6CisgICAgICAgICAgICBzZWxmLnBhcnNlKHZzdHJpbmcpCisKKworICAgIGRlZiBwYXJzZSAoc2VsZiwgdnN0cmluZyk6CisgICAgICAgICMgSSd2ZSBnaXZlbiB1cCBvbiB0aGlua2luZyBJIGNhbiByZWNvbnN0cnVjdCB0aGUgdmVyc2lvbiBzdHJpbmcKKyAgICAgICAgIyBmcm9tIHRoZSBwYXJzZWQgdHVwbGUgLS0gc28gSSBqdXN0IHN0b3JlIHRoZSBzdHJpbmcgaGVyZSBmb3IKKyAgICAgICAgIyB1c2UgYnkgX19zdHJfXworICAgICAgICBzZWxmLnZzdHJpbmcgPSB2c3RyaW5nCisgICAgICAgIGNvbXBvbmVudHMgPSBmaWx0ZXIobGFtYmRhIHg6IHggYW5kIHggIT0gJy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcG9uZW50X3JlLnNwbGl0KHZzdHJpbmcpKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oY29tcG9uZW50cykpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSBpbnQoY29tcG9uZW50c1tpXSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLnZlcnNpb24gPSBjb21wb25lbnRzCisKKworICAgIGRlZiBfX3N0cl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudnN0cmluZworCisKKyAgICBkZWYgX19yZXByX18gKHNlbGYpOgorICAgICAgICByZXR1cm4gIkxvb3NlVmVyc2lvbiAoJyVzJykiICUgc3RyKHNlbGYpCisKKworICAgIGRlZiBfX2NtcF9fIChzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgb3RoZXIgPSBMb29zZVZlcnNpb24ob3RoZXIpCisKKyAgICAgICAgcmV0dXJuIGNtcChzZWxmLnZlcnNpb24sIG90aGVyLnZlcnNpb24pCisKKworIyBlbmQgY2xhc3MgTG9vc2VWZXJzaW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9uLnB5YyBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTgyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9uLnB5byBiL2xpYi9weXRob24yLjcvZGlzdHV0aWxzL3ZlcnNpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTgyODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9ucHJlZGljYXRlLnB5IGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYThiNmMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weQpAQCAtMCwwICsxLDE2NCBAQAorIiIiTW9kdWxlIGZvciBwYXJzaW5nIGFuZCB0ZXN0aW5nIHBhY2thZ2UgdmVyc2lvbiBwcmVkaWNhdGUgc3RyaW5ncy4KKyIiIgoraW1wb3J0IHJlCitpbXBvcnQgZGlzdHV0aWxzLnZlcnNpb24KK2ltcG9ydCBvcGVyYXRvcgorCisKK3JlX3ZhbGlkUGFja2FnZSA9IHJlLmNvbXBpbGUociIoP2kpXlxzKihbYS16X11cdyooPzpcLlthLXpfXVx3KikqKSguKikiKQorIyAocGFja2FnZSkgKHJlc3QpCisKK3JlX3BhcmVuID0gcmUuY29tcGlsZShyIl5ccypcKCguKilcKVxzKiQiKSAjIChsaXN0KSBpbnNpZGUgb2YgcGFyZW50aGVzZXMKK3JlX3NwbGl0Q29tcGFyaXNvbiA9IHJlLmNvbXBpbGUociJeXHMqKDw9fD49fDx8PnwhPXw9PSlccyooW15ccyxdKylccyokIikKKyMgKGNvbXApICh2ZXJzaW9uKQorCisKK2RlZiBzcGxpdFVwKHByZWQpOgorICAgICIiIlBhcnNlIGEgc2luZ2xlIHZlcnNpb24gY29tcGFyaXNvbi4KKworICAgIFJldHVybiAoY29tcGFyaXNvbiBzdHJpbmcsIFN0cmljdFZlcnNpb24pCisgICAgIiIiCisgICAgcmVzID0gcmVfc3BsaXRDb21wYXJpc29uLm1hdGNoKHByZWQpCisgICAgaWYgbm90IHJlczoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYmFkIHBhY2thZ2UgcmVzdHJpY3Rpb24gc3ludGF4OiAlciIgJSBwcmVkKQorICAgIGNvbXAsIHZlclN0ciA9IHJlcy5ncm91cHMoKQorICAgIHJldHVybiAoY29tcCwgZGlzdHV0aWxzLnZlcnNpb24uU3RyaWN0VmVyc2lvbih2ZXJTdHIpKQorCitjb21wbWFwID0geyI8Ijogb3BlcmF0b3IubHQsICI8PSI6IG9wZXJhdG9yLmxlLCAiPT0iOiBvcGVyYXRvci5lcSwKKyAgICAgICAgICAgIj4iOiBvcGVyYXRvci5ndCwgIj49Ijogb3BlcmF0b3IuZ2UsICIhPSI6IG9wZXJhdG9yLm5lfQorCitjbGFzcyBWZXJzaW9uUHJlZGljYXRlOgorICAgICIiIlBhcnNlIGFuZCB0ZXN0IHBhY2thZ2UgdmVyc2lvbiBwcmVkaWNhdGVzLgorCisgICAgPj4+IHYgPSBWZXJzaW9uUHJlZGljYXRlKCdweWVwYXQuYWJjICg+MS4wLCA8MzMzMy4zYTEsICE9MTU1NS4xYjMpJykKKworICAgIFRoZSBgbmFtZWAgYXR0cmlidXRlIHByb3ZpZGVzIHRoZSBmdWxsIGRvdHRlZCBuYW1lIHRoYXQgaXMgZ2l2ZW46OgorCisgICAgPj4+IHYubmFtZQorICAgICdweWVwYXQuYWJjJworCisgICAgVGhlIHN0cigpIG9mIGEgYFZlcnNpb25QcmVkaWNhdGVgIHByb3ZpZGVzIGEgbm9ybWFsaXplZAorICAgIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIGV4cHJlc3Npb246OgorCisgICAgPj4+IHByaW50IHYKKyAgICBweWVwYXQuYWJjICg+IDEuMCwgPCAzMzMzLjNhMSwgIT0gMTU1NS4xYjMpCisKKyAgICBUaGUgYHNhdGlzZmllZF9ieSgpYCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdpdGggYSBnaXZlbgorICAgIHZlcnNpb24gbnVtYmVyIGlzIGluY2x1ZGVkIGluIHRoZSBzZXQgZGVzY3JpYmVkIGJ5IHRoZSB2ZXJzaW9uCisgICAgcmVzdHJpY3Rpb25zOjoKKworICAgID4+PiB2LnNhdGlzZmllZF9ieSgnMS4xJykKKyAgICBUcnVlCisgICAgPj4+IHYuc2F0aXNmaWVkX2J5KCcxLjQnKQorICAgIFRydWUKKyAgICA+Pj4gdi5zYXRpc2ZpZWRfYnkoJzEuMCcpCisgICAgRmFsc2UKKyAgICA+Pj4gdi5zYXRpc2ZpZWRfYnkoJzQ0NDQuNCcpCisgICAgRmFsc2UKKyAgICA+Pj4gdi5zYXRpc2ZpZWRfYnkoJzE1NTUuMWIzJykKKyAgICBGYWxzZQorCisgICAgYFZlcnNpb25QcmVkaWNhdGVgIGlzIGZsZXhpYmxlIGluIGFjY2VwdGluZyBleHRyYSB3aGl0ZXNwYWNlOjoKKworICAgID4+PiB2ID0gVmVyc2lvblByZWRpY2F0ZSgnIHBhdCggPT0gIDAuMSAgKSAgJykKKyAgICA+Pj4gdi5uYW1lCisgICAgJ3BhdCcKKyAgICA+Pj4gdi5zYXRpc2ZpZWRfYnkoJzAuMScpCisgICAgVHJ1ZQorICAgID4+PiB2LnNhdGlzZmllZF9ieSgnMC4yJykKKyAgICBGYWxzZQorCisgICAgSWYgYW55IHZlcnNpb24gbnVtYmVycyBwYXNzZWQgaW4gZG8gbm90IGNvbmZvcm0gdG8gdGhlCisgICAgcmVzdHJpY3Rpb25zIG9mIGBTdHJpY3RWZXJzaW9uYCwgYSBgVmFsdWVFcnJvcmAgaXMgcmFpc2VkOjoKKworICAgID4+PiB2ID0gVmVyc2lvblByZWRpY2F0ZSgncDEucDIucDMucDQoPj0xLjAsIDw9MS4zYTEsICE9MS4yemIzKScpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogaW52YWxpZCB2ZXJzaW9uIG51bWJlciAnMS4yemIzJworCisgICAgSXQgdGhlIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUgZ2l2ZW4gZG9lcyBub3QgY29uZm9ybSB0byB3aGF0J3MKKyAgICBhbGxvd2VkIGFzIGEgbGVnYWwgbW9kdWxlIG9yIHBhY2thZ2UgbmFtZSwgYFZhbHVlRXJyb3JgIGlzCisgICAgcmFpc2VkOjoKKworICAgID4+PiB2ID0gVmVyc2lvblByZWRpY2F0ZSgnZm9vLWJhcicpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogZXhwZWN0ZWQgcGFyZW50aGVzaXplZCBsaXN0OiAnLWJhcicKKworICAgID4+PiB2ID0gVmVyc2lvblByZWRpY2F0ZSgnZm9vIGJhciAoMTIuMjEpJykKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiBleHBlY3RlZCBwYXJlbnRoZXNpemVkIGxpc3Q6ICdiYXIgKDEyLjIxKScKKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcnNpb25QcmVkaWNhdGVTdHIpOgorICAgICAgICAiIiJQYXJzZSBhIHZlcnNpb24gcHJlZGljYXRlIHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgICMgRmllbGRzOgorICAgICAgICAjICAgIG5hbWU6ICBwYWNrYWdlIG5hbWUKKyAgICAgICAgIyAgICBwcmVkOiAgbGlzdCBvZiAoY29tcGFyaXNvbiBzdHJpbmcsIFN0cmljdFZlcnNpb24pCisKKyAgICAgICAgdmVyc2lvblByZWRpY2F0ZVN0ciA9IHZlcnNpb25QcmVkaWNhdGVTdHIuc3RyaXAoKQorICAgICAgICBpZiBub3QgdmVyc2lvblByZWRpY2F0ZVN0cjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImVtcHR5IHBhY2thZ2UgcmVzdHJpY3Rpb24iKQorICAgICAgICBtYXRjaCA9IHJlX3ZhbGlkUGFja2FnZS5tYXRjaCh2ZXJzaW9uUHJlZGljYXRlU3RyKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJiYWQgcGFja2FnZSBuYW1lIGluICVyIiAlIHZlcnNpb25QcmVkaWNhdGVTdHIpCisgICAgICAgIHNlbGYubmFtZSwgcGFyZW4gPSBtYXRjaC5ncm91cHMoKQorICAgICAgICBwYXJlbiA9IHBhcmVuLnN0cmlwKCkKKyAgICAgICAgaWYgcGFyZW46CisgICAgICAgICAgICBtYXRjaCA9IHJlX3BhcmVuLm1hdGNoKHBhcmVuKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImV4cGVjdGVkIHBhcmVudGhlc2l6ZWQgbGlzdDogJXIiICUgcGFyZW4pCisgICAgICAgICAgICBzdHIgPSBtYXRjaC5ncm91cHMoKVswXQorICAgICAgICAgICAgc2VsZi5wcmVkID0gW3NwbGl0VXAoYVByZWQpIGZvciBhUHJlZCBpbiBzdHIuc3BsaXQoIiwiKV0KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnByZWQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZW1wdHkgcGFyZW50aGVzaXplZCBsaXN0IGluICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSB2ZXJzaW9uUHJlZGljYXRlU3RyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcmVkID0gW10KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnByZWQ6CisgICAgICAgICAgICBzZXEgPSBbY29uZCArICIgIiArIHN0cih2ZXIpIGZvciBjb25kLCB2ZXIgaW4gc2VsZi5wcmVkXQorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZSArICIgKCIgKyAiLCAiLmpvaW4oc2VxKSArICIpIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorCisgICAgZGVmIHNhdGlzZmllZF9ieShzZWxmLCB2ZXJzaW9uKToKKyAgICAgICAgIiIiVHJ1ZSBpZiB2ZXJzaW9uIGlzIGNvbXBhdGlibGUgd2l0aCBhbGwgdGhlIHByZWRpY2F0ZXMgaW4gc2VsZi4KKyAgICAgICAgVGhlIHBhcmFtZXRlciB2ZXJzaW9uIG11c3QgYmUgYWNjZXB0YWJsZSB0byB0aGUgU3RyaWN0VmVyc2lvbgorICAgICAgICBjb25zdHJ1Y3Rvci4gIEl0IG1heSBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgU3RyaWN0VmVyc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBjb25kLCB2ZXIgaW4gc2VsZi5wcmVkOgorICAgICAgICAgICAgaWYgbm90IGNvbXBtYXBbY29uZF0odmVyc2lvbiwgdmVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitfcHJvdmlzaW9uX3J4ID0gTm9uZQorCitkZWYgc3BsaXRfcHJvdmlzaW9uKHZhbHVlKToKKyAgICAiIiJSZXR1cm4gdGhlIG5hbWUgYW5kIG9wdGlvbmFsIHZlcnNpb24gbnVtYmVyIG9mIGEgcHJvdmlzaW9uLgorCisgICAgVGhlIHZlcnNpb24gbnVtYmVyLCBpZiBnaXZlbiwgd2lsbCBiZSByZXR1cm5lZCBhcyBhIGBTdHJpY3RWZXJzaW9uYAorICAgIGluc3RhbmNlLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBgTm9uZWAuCisKKyAgICA+Pj4gc3BsaXRfcHJvdmlzaW9uKCdteXBrZycpCisgICAgKCdteXBrZycsIE5vbmUpCisgICAgPj4+IHNwbGl0X3Byb3Zpc2lvbignIG15cGtnKCAxLjIgKSAnKQorICAgICgnbXlwa2cnLCBTdHJpY3RWZXJzaW9uICgnMS4yJykpCisgICAgIiIiCisgICAgZ2xvYmFsIF9wcm92aXNpb25fcngKKyAgICBpZiBfcHJvdmlzaW9uX3J4IGlzIE5vbmU6CisgICAgICAgIF9wcm92aXNpb25fcnggPSByZS5jb21waWxlKAorICAgICAgICAgICAgIihbYS16QS1aX11cdyooPzpcLlthLXpBLVpfXVx3KikqKSg/OlxzKlwoXHMqKFteKVxzXSspXHMqXCkpPyQiKQorICAgIHZhbHVlID0gdmFsdWUuc3RyaXAoKQorICAgIG0gPSBfcHJvdmlzaW9uX3J4Lm1hdGNoKHZhbHVlKQorICAgIGlmIG5vdCBtOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbGxlZ2FsIHByb3ZpZGVzIHNwZWNpZmljYXRpb246ICVyIiAlIHZhbHVlKQorICAgIHZlciA9IG0uZ3JvdXAoMikgb3IgTm9uZQorICAgIGlmIHZlcjoKKyAgICAgICAgdmVyID0gZGlzdHV0aWxzLnZlcnNpb24uU3RyaWN0VmVyc2lvbih2ZXIpCisgICAgcmV0dXJuIG0uZ3JvdXAoMSksIHZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weWMgYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9ucHJlZGljYXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZjZGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weW8gYi9saWIvcHl0aG9uMi43L2Rpc3R1dGlscy92ZXJzaW9ucHJlZGljYXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjZjZGYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kaXN0dXRpbHMvdmVyc2lvbnByZWRpY2F0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kb2N0ZXN0LnB5IGIvbGliL3B5dGhvbjIuNy9kb2N0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmNjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2RvY3Rlc3QucHkKQEAgLTAsMCArMSwyNzkyIEBACisjIE1vZHVsZSBkb2N0ZXN0LgorIyBSZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiAxNi1KYW4tMjAwMSwgYnkgVGltIFBldGVycyAodGltQHB5dGhvbi5vcmcpLgorIyBNYWpvciBlbmhhbmNlbWVudHMgYW5kIHJlZmFjdG9yaW5nIGJ5OgorIyAgICAgSmltIEZ1bHRvbgorIyAgICAgRWR3YXJkIExvcGVyCisKKyMgUHJvdmlkZWQgYXMtaXM7IHVzZSBhdCB5b3VyIG93biByaXNrOyBubyB3YXJyYW50eTsgbm8gcHJvbWlzZXM7IGVuam95IQorCityIiIiTW9kdWxlIGRvY3Rlc3QgLS0gYSBmcmFtZXdvcmsgZm9yIHJ1bm5pbmcgZXhhbXBsZXMgaW4gZG9jc3RyaW5ncy4KKworSW4gc2ltcGxlc3QgdXNlLCBlbmQgZWFjaCBtb2R1bGUgTSB0byBiZSB0ZXN0ZWQgd2l0aDoKKworZGVmIF90ZXN0KCk6CisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICBkb2N0ZXN0LnRlc3Rtb2QoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIF90ZXN0KCkKKworVGhlbiBydW5uaW5nIHRoZSBtb2R1bGUgYXMgYSBzY3JpcHQgd2lsbCBjYXVzZSB0aGUgZXhhbXBsZXMgaW4gdGhlCitkb2NzdHJpbmdzIHRvIGdldCBleGVjdXRlZCBhbmQgdmVyaWZpZWQ6CisKK3B5dGhvbiBNLnB5CisKK1RoaXMgd29uJ3QgZGlzcGxheSBhbnl0aGluZyB1bmxlc3MgYW4gZXhhbXBsZSBmYWlscywgaW4gd2hpY2ggY2FzZSB0aGUKK2ZhaWxpbmcgZXhhbXBsZShzKSBhbmQgdGhlIGNhdXNlKHMpIG9mIHRoZSBmYWlsdXJlKHMpIGFyZSBwcmludGVkIHRvIHN0ZG91dAorKHdoeSBub3Qgc3RkZXJyPyBiZWNhdXNlIHN0ZGVyciBpcyBhIGxhbWUgaGFjayA8MC4yIHdpbms+KSwgYW5kIHRoZSBmaW5hbAorbGluZSBvZiBvdXRwdXQgaXMgIlRlc3QgZmFpbGVkLiIuCisKK1J1biBpdCB3aXRoIHRoZSAtdiBzd2l0Y2ggaW5zdGVhZDoKKworcHl0aG9uIE0ucHkgLXYKKworYW5kIGEgZGV0YWlsZWQgcmVwb3J0IG9mIGFsbCBleGFtcGxlcyB0cmllZCBpcyBwcmludGVkIHRvIHN0ZG91dCwgYWxvbmcKK3dpdGggYXNzb3J0ZWQgc3VtbWFyaWVzIGF0IHRoZSBlbmQuCisKK1lvdSBjYW4gZm9yY2UgdmVyYm9zZSBtb2RlIGJ5IHBhc3NpbmcgInZlcmJvc2U9VHJ1ZSIgdG8gdGVzdG1vZCwgb3IgcHJvaGliaXQKK2l0IGJ5IHBhc3NpbmcgInZlcmJvc2U9RmFsc2UiLiAgSW4gZWl0aGVyIG9mIHRob3NlIGNhc2VzLCBzeXMuYXJndiBpcyBub3QKK2V4YW1pbmVkIGJ5IHRlc3Rtb2QuCisKK1RoZXJlIGFyZSBhIHZhcmlldHkgb2Ygb3RoZXIgd2F5cyB0byBydW4gZG9jdGVzdHMsIGluY2x1ZGluZyBpbnRlZ3JhdGlvbgord2l0aCB0aGUgdW5pdHRlc3QgZnJhbWV3b3JrLCBhbmQgc3VwcG9ydCBmb3IgcnVubmluZyBub24tUHl0aG9uIHRleHQKK2ZpbGVzIGNvbnRhaW5pbmcgZG9jdGVzdHMuICBUaGVyZSBhcmUgYWxzbyBtYW55IHdheXMgdG8gb3ZlcnJpZGUgcGFydHMKK29mIGRvY3Rlc3QncyBkZWZhdWx0IGJlaGF2aW9ycy4gIFNlZSB0aGUgTGlicmFyeSBSZWZlcmVuY2UgTWFudWFsIGZvcgorZGV0YWlscy4KKyIiIgorCitfX2RvY2Zvcm1hdF9fID0gJ3JlU3RydWN0dXJlZFRleHQgZW4nCisKK19fYWxsX18gPSBbCisgICAgIyAwLCBPcHRpb24gRmxhZ3MKKyAgICAncmVnaXN0ZXJfb3B0aW9uZmxhZycsCisgICAgJ0RPTlRfQUNDRVBUX1RSVUVfRk9SXzEnLAorICAgICdET05UX0FDQ0VQVF9CTEFOS0xJTkUnLAorICAgICdOT1JNQUxJWkVfV0hJVEVTUEFDRScsCisgICAgJ0VMTElQU0lTJywKKyAgICAnU0tJUCcsCisgICAgJ0lHTk9SRV9FWENFUFRJT05fREVUQUlMJywKKyAgICAnQ09NUEFSSVNPTl9GTEFHUycsCisgICAgJ1JFUE9SVF9VRElGRicsCisgICAgJ1JFUE9SVF9DRElGRicsCisgICAgJ1JFUE9SVF9ORElGRicsCisgICAgJ1JFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUnLAorICAgICdSRVBPUlRJTkdfRkxBR1MnLAorICAgICMgMS4gVXRpbGl0eSBGdW5jdGlvbnMKKyAgICAjIDIuIEV4YW1wbGUgJiBEb2NUZXN0CisgICAgJ0V4YW1wbGUnLAorICAgICdEb2NUZXN0JywKKyAgICAjIDMuIERvY3Rlc3QgUGFyc2VyCisgICAgJ0RvY1Rlc3RQYXJzZXInLAorICAgICMgNC4gRG9jdGVzdCBGaW5kZXIKKyAgICAnRG9jVGVzdEZpbmRlcicsCisgICAgIyA1LiBEb2N0ZXN0IFJ1bm5lcgorICAgICdEb2NUZXN0UnVubmVyJywKKyAgICAnT3V0cHV0Q2hlY2tlcicsCisgICAgJ0RvY1Rlc3RGYWlsdXJlJywKKyAgICAnVW5leHBlY3RlZEV4Y2VwdGlvbicsCisgICAgJ0RlYnVnUnVubmVyJywKKyAgICAjIDYuIFRlc3QgRnVuY3Rpb25zCisgICAgJ3Rlc3Rtb2QnLAorICAgICd0ZXN0ZmlsZScsCisgICAgJ3J1bl9kb2NzdHJpbmdfZXhhbXBsZXMnLAorICAgICMgNy4gVGVzdGVyCisgICAgJ1Rlc3RlcicsCisgICAgIyA4LiBVbml0dGVzdCBTdXBwb3J0CisgICAgJ0RvY1Rlc3RTdWl0ZScsCisgICAgJ0RvY0ZpbGVTdWl0ZScsCisgICAgJ3NldF91bml0dGVzdF9yZXBvcnRmbGFncycsCisgICAgIyA5LiBEZWJ1Z2dpbmcgU3VwcG9ydAorICAgICdzY3JpcHRfZnJvbV9leGFtcGxlcycsCisgICAgJ3Rlc3Rzb3VyY2UnLAorICAgICdkZWJ1Z19zcmMnLAorICAgICdkZWJ1ZycsCitdCisKK2ltcG9ydCBfX2Z1dHVyZV9fCisKK2ltcG9ydCBzeXMsIHRyYWNlYmFjaywgaW5zcGVjdCwgbGluZWNhY2hlLCBvcywgcmUKK2ltcG9ydCB1bml0dGVzdCwgZGlmZmxpYiwgcGRiLCB0ZW1wZmlsZQoraW1wb3J0IHdhcm5pbmdzCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorCitUZXN0UmVzdWx0cyA9IG5hbWVkdHVwbGUoJ1Rlc3RSZXN1bHRzJywgJ2ZhaWxlZCBhdHRlbXB0ZWQnKQorCisjIFRoZXJlIGFyZSA0IGJhc2ljIGNsYXNzZXM6CisjICAtIEV4YW1wbGU6IGEgPHNvdXJjZSwgd2FudD4gcGFpciwgcGx1cyBhbiBpbnRyYS1kb2NzdHJpbmcgbGluZSBudW1iZXIuCisjICAtIERvY1Rlc3Q6IGEgY29sbGVjdGlvbiBvZiBleGFtcGxlcywgcGFyc2VkIGZyb20gYSBkb2NzdHJpbmcsIHBsdXMKKyMgICAgaW5mbyBhYm91dCB3aGVyZSB0aGUgZG9jc3RyaW5nIGNhbWUgZnJvbSAobmFtZSwgZmlsZW5hbWUsIGxpbmVubykuCisjICAtIERvY1Rlc3RGaW5kZXI6IGV4dHJhY3RzIERvY1Rlc3RzIGZyb20gYSBnaXZlbiBvYmplY3QncyBkb2NzdHJpbmcgYW5kCisjICAgIGl0cyBjb250YWluZWQgb2JqZWN0cycgZG9jc3RyaW5ncy4KKyMgIC0gRG9jVGVzdFJ1bm5lcjogcnVucyBEb2NUZXN0IGNhc2VzLCBhbmQgYWNjdW11bGF0ZXMgc3RhdGlzdGljcy4KKyMKKyMgU28gdGhlIGJhc2ljIHBpY3R1cmUgaXM6CisjCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0IG9mOgorIyArLS0tLS0tKyAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICAgICAgICArLS0tLS0tLSsKKyMgfG9iamVjdHwgLS1Eb2NUZXN0RmluZGVyLT4gfCBEb2NUZXN0IHwgLS1Eb2NUZXN0UnVubmVyLT4gfHJlc3VsdHN8CisjICstLS0tLS0rICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0rICAgICAgICAgICAgICAgICAgICstLS0tLS0tKworIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEV4YW1wbGUgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgLi4uICAgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEV4YW1wbGUgfAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0tKworCisjIE9wdGlvbiBjb25zdGFudHMuCisKK09QVElPTkZMQUdTX0JZX05BTUUgPSB7fQorZGVmIHJlZ2lzdGVyX29wdGlvbmZsYWcobmFtZSk6CisgICAgIyBDcmVhdGUgYSBuZXcgZmxhZyB1bmxlc3MgYG5hbWVgIGlzIGFscmVhZHkga25vd24uCisgICAgcmV0dXJuIE9QVElPTkZMQUdTX0JZX05BTUUuc2V0ZGVmYXVsdChuYW1lLCAxIDw8IGxlbihPUFRJT05GTEFHU19CWV9OQU1FKSkKKworRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMSA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ0RPTlRfQUNDRVBUX1RSVUVfRk9SXzEnKQorRE9OVF9BQ0NFUFRfQkxBTktMSU5FID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnRE9OVF9BQ0NFUFRfQkxBTktMSU5FJykKK05PUk1BTElaRV9XSElURVNQQUNFID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnTk9STUFMSVpFX1dISVRFU1BBQ0UnKQorRUxMSVBTSVMgPSByZWdpc3Rlcl9vcHRpb25mbGFnKCdFTExJUFNJUycpCitTS0lQID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnU0tJUCcpCitJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ0lHTk9SRV9FWENFUFRJT05fREVUQUlMJykKKworQ09NUEFSSVNPTl9GTEFHUyA9IChET05UX0FDQ0VQVF9UUlVFX0ZPUl8xIHwKKyAgICAgICAgICAgICAgICAgICAgRE9OVF9BQ0NFUFRfQkxBTktMSU5FIHwKKyAgICAgICAgICAgICAgICAgICAgTk9STUFMSVpFX1dISVRFU1BBQ0UgfAorICAgICAgICAgICAgICAgICAgICBFTExJUFNJUyB8CisgICAgICAgICAgICAgICAgICAgIFNLSVAgfAorICAgICAgICAgICAgICAgICAgICBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCkKKworUkVQT1JUX1VESUZGID0gcmVnaXN0ZXJfb3B0aW9uZmxhZygnUkVQT1JUX1VESUZGJykKK1JFUE9SVF9DRElGRiA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ1JFUE9SVF9DRElGRicpCitSRVBPUlRfTkRJRkYgPSByZWdpc3Rlcl9vcHRpb25mbGFnKCdSRVBPUlRfTkRJRkYnKQorUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSA9IHJlZ2lzdGVyX29wdGlvbmZsYWcoJ1JFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUnKQorCitSRVBPUlRJTkdfRkxBR1MgPSAoUkVQT1JUX1VESUZGIHwKKyAgICAgICAgICAgICAgICAgICBSRVBPUlRfQ0RJRkYgfAorICAgICAgICAgICAgICAgICAgIFJFUE9SVF9ORElGRiB8CisgICAgICAgICAgICAgICAgICAgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSkKKworIyBTcGVjaWFsIHN0cmluZyBtYXJrZXJzIGZvciB1c2UgaW4gYHdhbnRgIHN0cmluZ3M6CitCTEFOS0xJTkVfTUFSS0VSID0gJzxCTEFOS0xJTkU+JworRUxMSVBTSVNfTUFSS0VSID0gJy4uLicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgVGFibGUgb2YgQ29udGVudHMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIDEuIFV0aWxpdHkgRnVuY3Rpb25zCisjICAyLiBFeGFtcGxlICYgRG9jVGVzdCAtLSBzdG9yZSB0ZXN0IGNhc2VzCisjICAzLiBEb2NUZXN0IFBhcnNlciAtLSBleHRyYWN0cyBleGFtcGxlcyBmcm9tIHN0cmluZ3MKKyMgIDQuIERvY1Rlc3QgRmluZGVyIC0tIGV4dHJhY3RzIHRlc3QgY2FzZXMgZnJvbSBvYmplY3RzCisjICA1LiBEb2NUZXN0IFJ1bm5lciAtLSBydW5zIHRlc3QgY2FzZXMKKyMgIDYuIFRlc3QgRnVuY3Rpb25zIC0tIGNvbnZlbmllbnQgd3JhcHBlcnMgZm9yIHRlc3RpbmcKKyMgIDcuIFRlc3RlciBDbGFzcyAtLSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKyMgIDguIFVuaXR0ZXN0IFN1cHBvcnQKKyMgIDkuIERlYnVnZ2luZyBTdXBwb3J0CisjIDEwLiBFeGFtcGxlIFVzYWdlCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDEuIFV0aWxpdHkgRnVuY3Rpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBfZXh0cmFjdF9mdXR1cmVfZmxhZ3MoZ2xvYnMpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgY29tcGlsZXItZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBmdXR1cmUgZmVhdHVyZXMgdGhhdAorICAgIGhhdmUgYmVlbiBpbXBvcnRlZCBpbnRvIHRoZSBnaXZlbiBuYW1lc3BhY2UgKGdsb2JzKS4KKyAgICAiIiIKKyAgICBmbGFncyA9IDAKKyAgICBmb3IgZm5hbWUgaW4gX19mdXR1cmVfXy5hbGxfZmVhdHVyZV9uYW1lczoKKyAgICAgICAgZmVhdHVyZSA9IGdsb2JzLmdldChmbmFtZSwgTm9uZSkKKyAgICAgICAgaWYgZmVhdHVyZSBpcyBnZXRhdHRyKF9fZnV0dXJlX18sIGZuYW1lKToKKyAgICAgICAgICAgIGZsYWdzIHw9IGZlYXR1cmUuY29tcGlsZXJfZmxhZworICAgIHJldHVybiBmbGFncworCitkZWYgX25vcm1hbGl6ZV9tb2R1bGUobW9kdWxlLCBkZXB0aD0yKToKKyAgICAiIiIKKyAgICBSZXR1cm4gdGhlIG1vZHVsZSBzcGVjaWZpZWQgYnkgYG1vZHVsZWAuICBJbiBwYXJ0aWN1bGFyOgorICAgICAgLSBJZiBgbW9kdWxlYCBpcyBhIG1vZHVsZSwgdGhlbiByZXR1cm4gbW9kdWxlLgorICAgICAgLSBJZiBgbW9kdWxlYCBpcyBhIHN0cmluZywgdGhlbiBpbXBvcnQgYW5kIHJldHVybiB0aGUKKyAgICAgICAgbW9kdWxlIHdpdGggdGhhdCBuYW1lLgorICAgICAgLSBJZiBgbW9kdWxlYCBpcyBOb25lLCB0aGVuIHJldHVybiB0aGUgY2FsbGluZyBtb2R1bGUuCisgICAgICAgIFRoZSBjYWxsaW5nIG1vZHVsZSBpcyBhc3N1bWVkIHRvIGJlIHRoZSBtb2R1bGUgb2YKKyAgICAgICAgdGhlIHN0YWNrIGZyYW1lIGF0IHRoZSBnaXZlbiBkZXB0aCBpbiB0aGUgY2FsbCBzdGFjay4KKyAgICAiIiIKKyAgICBpZiBpbnNwZWN0LmlzbW9kdWxlKG1vZHVsZSk6CisgICAgICAgIHJldHVybiBtb2R1bGUKKyAgICBlbGlmIGlzaW5zdGFuY2UobW9kdWxlLCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgIHJldHVybiBfX2ltcG9ydF9fKG1vZHVsZSwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWyIqIl0pCisgICAgZWxpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW3N5cy5fZ2V0ZnJhbWUoZGVwdGgpLmZfZ2xvYmFsc1snX19uYW1lX18nXV0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgbW9kdWxlLCBzdHJpbmcsIG9yIE5vbmUiKQorCitkZWYgX2xvYWRfdGVzdGZpbGUoZmlsZW5hbWUsIHBhY2thZ2UsIG1vZHVsZV9yZWxhdGl2ZSk6CisgICAgaWYgbW9kdWxlX3JlbGF0aXZlOgorICAgICAgICBwYWNrYWdlID0gX25vcm1hbGl6ZV9tb2R1bGUocGFja2FnZSwgMykKKyAgICAgICAgZmlsZW5hbWUgPSBfbW9kdWxlX3JlbGF0aXZlX3BhdGgocGFja2FnZSwgZmlsZW5hbWUpCisgICAgICAgIGlmIGhhc2F0dHIocGFja2FnZSwgJ19fbG9hZGVyX18nKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIocGFja2FnZS5fX2xvYWRlcl9fLCAnZ2V0X2RhdGEnKToKKyAgICAgICAgICAgICAgICBmaWxlX2NvbnRlbnRzID0gcGFja2FnZS5fX2xvYWRlcl9fLmdldF9kYXRhKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICMgZ2V0X2RhdGEoKSBvcGVucyBmaWxlcyBhcyAncmInLCBzbyBvbmUgbXVzdCBkbyB0aGUgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICMgY29udmVyc2lvbiBhcyB1bml2ZXJzYWwgbmV3bGluZXMgd291bGQgZG8uCisgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVfY29udGVudHMucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSwgZmlsZW5hbWUKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGY6CisgICAgICAgIHJldHVybiBmLnJlYWQoKSwgZmlsZW5hbWUKKworIyBVc2Ugc3lzLnN0ZG91dCBlbmNvZGluZyBmb3Igb3VwdXQuCitfZW5jb2RpbmcgPSBnZXRhdHRyKHN5cy5fX3N0ZG91dF9fLCAnZW5jb2RpbmcnLCBOb25lKSBvciAndXRmLTgnCisKK2RlZiBfaW5kZW50KHMsIGluZGVudD00KToKKyAgICAiIiIKKyAgICBBZGQgdGhlIGdpdmVuIG51bWJlciBvZiBzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgICBldmVyeSBub24tYmxhbmsgbGluZSBpbiBgc2AsIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICBJZiB0aGUgc3RyaW5nIGBzYCBpcyBVbmljb2RlLCBpdCBpcyBlbmNvZGVkIHVzaW5nIHRoZSBzdGRvdXQKKyAgICBlbmNvZGluZyBhbmQgdGhlIGBiYWNrc2xhc2hyZXBsYWNlYCBlcnJvciBoYW5kbGVyLgorICAgICIiIgorICAgIGlmIGlzaW5zdGFuY2UocywgdW5pY29kZSk6CisgICAgICAgIHMgPSBzLmVuY29kZShfZW5jb2RpbmcsICdiYWNrc2xhc2hyZXBsYWNlJykKKyAgICAjIFRoaXMgcmVnZXhwIG1hdGNoZXMgdGhlIHN0YXJ0IG9mIG5vbi1ibGFuayBsaW5lczoKKyAgICByZXR1cm4gcmUuc3ViKCcoP20pXig/ISQpJywgaW5kZW50KicgJywgcykKKworZGVmIF9leGNlcHRpb25fdHJhY2ViYWNrKGV4Y19pbmZvKToKKyAgICAiIiIKKyAgICBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBhIHRyYWNlYmFjayBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4KKyAgICBleGNfaW5mbyB0dXBsZSAoYXMgcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCkpLgorICAgICIiIgorICAgICMgR2V0IGEgdHJhY2ViYWNrIG1lc3NhZ2UuCisgICAgZXhjb3V0ID0gU3RyaW5nSU8oKQorICAgIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIgPSBleGNfaW5mbworICAgIHRyYWNlYmFjay5wcmludF9leGNlcHRpb24oZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190YiwgZmlsZT1leGNvdXQpCisgICAgcmV0dXJuIGV4Y291dC5nZXR2YWx1ZSgpCisKKyMgT3ZlcnJpZGUgc29tZSBTdHJpbmdJTyBtZXRob2RzLgorY2xhc3MgX1Nwb29mT3V0KFN0cmluZ0lPKToKKyAgICBkZWYgZ2V0dmFsdWUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPLmdldHZhbHVlKHNlbGYpCisgICAgICAgICMgSWYgYW55dGhpbmcgYXQgYWxsIHdhcyB3cml0dGVuLCBtYWtlIHN1cmUgdGhlcmUncyBhIHRyYWlsaW5nCisgICAgICAgICMgbmV3bGluZS4gIFRoZXJlJ3Mgbm8gd2F5IGZvciB0aGUgZXhwZWN0ZWQgb3V0cHV0IHRvIGluZGljYXRlCisgICAgICAgICMgdGhhdCBhIHRyYWlsaW5nIG5ld2xpbmUgaXMgbWlzc2luZy4KKyAgICAgICAgaWYgcmVzdWx0IGFuZCBub3QgcmVzdWx0LmVuZHN3aXRoKCJcbiIpOgorICAgICAgICAgICAgcmVzdWx0ICs9ICJcbiIKKyAgICAgICAgIyBQcmV2ZW50IHNvZnRzcGFjZSBmcm9tIHNjcmV3aW5nIHVwIHRoZSBuZXh0IHRlc3QgY2FzZSwgaW4KKyAgICAgICAgIyBjYXNlIHRoZXkgdXNlZCBwcmludCB3aXRoIGEgdHJhaWxpbmcgY29tbWEgaW4gYW4gZXhhbXBsZS4KKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAic29mdHNwYWNlIik6CisgICAgICAgICAgICBkZWwgc2VsZi5zb2Z0c3BhY2UKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHRydW5jYXRlKHNlbGYsICAgc2l6ZT1Ob25lKToKKyAgICAgICAgU3RyaW5nSU8udHJ1bmNhdGUoc2VsZiwgc2l6ZSkKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAic29mdHNwYWNlIik6CisgICAgICAgICAgICBkZWwgc2VsZi5zb2Z0c3BhY2UKKyAgICAgICAgaWYgbm90IHNlbGYuYnVmOgorICAgICAgICAgICAgIyBSZXNldCBpdCB0byBhbiBlbXB0eSBzdHJpbmcsIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdCB1bmljb2RlLgorICAgICAgICAgICAgc2VsZi5idWYgPSAnJworCisjIFdvcnN0LWNhc2UgbGluZWFyLXRpbWUgZWxsaXBzaXMgbWF0Y2hpbmcuCitkZWYgX2VsbGlwc2lzX21hdGNoKHdhbnQsIGdvdCk6CisgICAgIiIiCisgICAgRXNzZW50aWFsbHkgdGhlIG9ubHkgc3VidGxlIGNhc2U6CisgICAgPj4+IF9lbGxpcHNpc19tYXRjaCgnYWEuLi5hYScsICdhYWEnKQorICAgIEZhbHNlCisgICAgIiIiCisgICAgaWYgRUxMSVBTSVNfTUFSS0VSIG5vdCBpbiB3YW50OgorICAgICAgICByZXR1cm4gd2FudCA9PSBnb3QKKworICAgICMgRmluZCAidGhlIHJlYWwiIHN0cmluZ3MuCisgICAgd3MgPSB3YW50LnNwbGl0KEVMTElQU0lTX01BUktFUikKKyAgICBhc3NlcnQgbGVuKHdzKSA+PSAyCisKKyAgICAjIERlYWwgd2l0aCBleGFjdCBtYXRjaGVzIHBvc3NpYmx5IG5lZWRlZCBhdCBvbmUgb3IgYm90aCBlbmRzLgorICAgIHN0YXJ0cG9zLCBlbmRwb3MgPSAwLCBsZW4oZ290KQorICAgIHcgPSB3c1swXQorICAgIGlmIHc6ICAgIyBzdGFydHMgd2l0aCBleGFjdCBtYXRjaAorICAgICAgICBpZiBnb3Quc3RhcnRzd2l0aCh3KToKKyAgICAgICAgICAgIHN0YXJ0cG9zID0gbGVuKHcpCisgICAgICAgICAgICBkZWwgd3NbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIHcgPSB3c1stMV0KKyAgICBpZiB3OiAgICMgZW5kcyB3aXRoIGV4YWN0IG1hdGNoCisgICAgICAgIGlmIGdvdC5lbmRzd2l0aCh3KToKKyAgICAgICAgICAgIGVuZHBvcyAtPSBsZW4odykKKyAgICAgICAgICAgIGRlbCB3c1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgc3RhcnRwb3MgPiBlbmRwb3M6CisgICAgICAgICMgRXhhY3QgZW5kIG1hdGNoZXMgcmVxdWlyZWQgbW9yZSBjaGFyYWN0ZXJzIHRoYW4gd2UgaGF2ZSwgYXMgaW4KKyAgICAgICAgIyBfZWxsaXBzaXNfbWF0Y2goJ2FhLi4uYWEnLCAnYWFhJykKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIEZvciB0aGUgcmVzdCwgd2Ugb25seSBuZWVkIHRvIGZpbmQgdGhlIGxlZnRtb3N0IG5vbi1vdmVybGFwcGluZworICAgICMgbWF0Y2ggZm9yIGVhY2ggcGllY2UuICBJZiB0aGVyZSdzIG5vIG92ZXJhbGwgbWF0Y2ggdGhhdCB3YXkgYWxvbmUsCisgICAgIyB0aGVyZSdzIG5vIG92ZXJhbGwgbWF0Y2ggcGVyaW9kLgorICAgIGZvciB3IGluIHdzOgorICAgICAgICAjIHcgbWF5IGJlICcnIGF0IHRpbWVzLCBpZiB0aGVyZSBhcmUgY29uc2VjdXRpdmUgZWxsaXBzZXMsIG9yCisgICAgICAgICMgZHVlIHRvIGFuIGVsbGlwc2lzIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgYHdhbnRgLiAgVGhhdCdzIE9LLgorICAgICAgICAjIFNlYXJjaCBmb3IgYW4gZW1wdHkgc3RyaW5nIHN1Y2NlZWRzLCBhbmQgZG9lc24ndCBjaGFuZ2Ugc3RhcnRwb3MuCisgICAgICAgIHN0YXJ0cG9zID0gZ290LmZpbmQodywgc3RhcnRwb3MsIGVuZHBvcykKKyAgICAgICAgaWYgc3RhcnRwb3MgPCAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHN0YXJ0cG9zICs9IGxlbih3KQorCisgICAgcmV0dXJuIFRydWUKKworZGVmIF9jb21tZW50X2xpbmUobGluZSk6CisgICAgIlJldHVybiBhIGNvbW1lbnRlZCBmb3JtIG9mIHRoZSBnaXZlbiBsaW5lIgorICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgICAgaWYgbGluZToKKyAgICAgICAgcmV0dXJuICcjICcrbGluZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnIycKKworY2xhc3MgX091dHB1dFJlZGlyZWN0aW5nUGRiKHBkYi5QZGIpOgorICAgICIiIgorICAgIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiB0aGUgcHl0aG9uIGRlYnVnZ2VyIHRoYXQgcmVkaXJlY3RzIHN0ZG91dAorICAgIHRvIGEgZ2l2ZW4gc3RyZWFtIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdXNlci4gIFN0ZG91dCBpcyAqbm90KgorICAgIHJlZGlyZWN0ZWQgd2hlbiB0cmFjZWQgY29kZSBpcyBleGVjdXRlZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3V0KToKKyAgICAgICAgc2VsZi5fX291dCA9IG91dAorICAgICAgICBzZWxmLl9fZGVidWdnZXJfdXNlZCA9IEZhbHNlCisgICAgICAgIHBkYi5QZGIuX19pbml0X18oc2VsZiwgc3Rkb3V0PW91dCkKKyAgICAgICAgIyBzdGlsbCB1c2UgaW5wdXQoKSB0byBnZXQgdXNlciBpbnB1dAorICAgICAgICBzZWxmLnVzZV9yYXdpbnB1dCA9IDEKKworICAgIGRlZiBzZXRfdHJhY2Uoc2VsZiwgZnJhbWU9Tm9uZSk6CisgICAgICAgIHNlbGYuX19kZWJ1Z2dlcl91c2VkID0gVHJ1ZQorICAgICAgICBpZiBmcmFtZSBpcyBOb25lOgorICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKCkuZl9iYWNrCisgICAgICAgIHBkYi5QZGIuc2V0X3RyYWNlKHNlbGYsIGZyYW1lKQorCisgICAgZGVmIHNldF9jb250aW51ZShzZWxmKToKKyAgICAgICAgIyBDYWxsaW5nIHNldF9jb250aW51ZSB1bmNvbmRpdGlvbmFsbHkgd291bGQgYnJlYWsgdW5pdCB0ZXN0CisgICAgICAgICMgY292ZXJhZ2UgcmVwb3J0aW5nLCBhcyBCZGIuc2V0X2NvbnRpbnVlIGNhbGxzIHN5cy5zZXR0cmFjZShOb25lKS4KKyAgICAgICAgaWYgc2VsZi5fX2RlYnVnZ2VyX3VzZWQ6CisgICAgICAgICAgICBwZGIuUGRiLnNldF9jb250aW51ZShzZWxmKQorCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoKHNlbGYsICphcmdzKToKKyAgICAgICAgIyBSZWRpcmVjdCBzdGRvdXQgdG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLl9fb3V0CisgICAgICAgICMgQ2FsbCBQZGIncyB0cmFjZSBkaXNwYXRjaCBtZXRob2QuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBwZGIuUGRiLnRyYWNlX2Rpc3BhdGNoKHNlbGYsICphcmdzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisKKyMgW1hYXSBOb3JtYWxpemUgd2l0aCByZXNwZWN0IHRvIG9zLnBhdGgucGFyZGlyPworZGVmIF9tb2R1bGVfcmVsYXRpdmVfcGF0aChtb2R1bGUsIHBhdGgpOgorICAgIGlmIG5vdCBpbnNwZWN0LmlzbW9kdWxlKG1vZHVsZSk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ0V4cGVjdGVkIGEgbW9kdWxlOiAlcicgJSBtb2R1bGUKKyAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoJy8nKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ01vZHVsZS1yZWxhdGl2ZSBmaWxlcyBtYXkgbm90IGhhdmUgYWJzb2x1dGUgcGF0aHMnCisKKyAgICAjIEZpbmQgdGhlIGJhc2UgZGlyZWN0b3J5IGZvciB0aGUgcGF0aC4KKyAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6CisgICAgICAgICMgQSBub3JtYWwgbW9kdWxlL3BhY2thZ2UKKyAgICAgICAgYmFzZWRpciA9IG9zLnBhdGguc3BsaXQobW9kdWxlLl9fZmlsZV9fKVswXQorICAgIGVsaWYgbW9kdWxlLl9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgICAgICMgQW4gaW50ZXJhY3RpdmUgc2Vzc2lvbi4KKyAgICAgICAgaWYgbGVuKHN5cy5hcmd2KT4wIGFuZCBzeXMuYXJndlswXSAhPSAnJzoKKyAgICAgICAgICAgIGJhc2VkaXIgPSBvcy5wYXRoLnNwbGl0KHN5cy5hcmd2WzBdKVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZWRpciA9IG9zLmN1cmRpcgorICAgIGVsc2U6CisgICAgICAgICMgQSBtb2R1bGUgdy9vIF9fZmlsZV9fICh0aGlzIGluY2x1ZGVzIGJ1aWx0aW5zKQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW4ndCByZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvIHRoZSBtb2R1bGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlICsgIiAoaXQgaGFzIG5vIF9fZmlsZV9fKSIpCisKKyAgICAjIENvbWJpbmUgdGhlIGJhc2UgZGlyZWN0b3J5IGFuZCB0aGUgcGF0aC4KKyAgICByZXR1cm4gb3MucGF0aC5qb2luKGJhc2VkaXIsICoocGF0aC5zcGxpdCgnLycpKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgMi4gRXhhbXBsZSAmIERvY1Rlc3QKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIC0gQW4gImV4YW1wbGUiIGlzIGEgPHNvdXJjZSwgd2FudD4gcGFpciwgd2hlcmUgInNvdXJjZSIgaXMgYQorIyMgICBmcmFnbWVudCBvZiBzb3VyY2UgY29kZSwgYW5kICJ3YW50IiBpcyB0aGUgZXhwZWN0ZWQgb3V0cHV0IGZvcgorIyMgICAic291cmNlLiIgIFRoZSBFeGFtcGxlIGNsYXNzIGFsc28gaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQKKyMjICAgd2hlcmUgdGhlIGV4YW1wbGUgd2FzIGV4dHJhY3RlZCBmcm9tLgorIyMKKyMjIC0gQSAiZG9jdGVzdCIgaXMgYSBjb2xsZWN0aW9uIG9mIGV4YW1wbGVzLCB0eXBpY2FsbHkgZXh0cmFjdGVkIGZyb20KKyMjICAgYSBzdHJpbmcgKHN1Y2ggYXMgYW4gb2JqZWN0J3MgZG9jc3RyaW5nKS4gIFRoZSBEb2NUZXN0IGNsYXNzIGFsc28KKyMjICAgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdGhlIHN0cmluZyB3YXMgZXh0cmFjdGVkIGZyb20uCisKK2NsYXNzIEV4YW1wbGU6CisgICAgIiIiCisgICAgQSBzaW5nbGUgZG9jdGVzdCBleGFtcGxlLCBjb25zaXN0aW5nIG9mIHNvdXJjZSBjb2RlIGFuZCBleHBlY3RlZAorICAgIG91dHB1dC4gIGBFeGFtcGxlYCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKworICAgICAgLSBzb3VyY2U6IEEgc2luZ2xlIFB5dGhvbiBzdGF0ZW1lbnQsIGFsd2F5cyBlbmRpbmcgd2l0aCBhIG5ld2xpbmUuCisgICAgICAgIFRoZSBjb25zdHJ1Y3RvciBhZGRzIGEgbmV3bGluZSBpZiBuZWVkZWQuCisKKyAgICAgIC0gd2FudDogVGhlIGV4cGVjdGVkIG91dHB1dCBmcm9tIHJ1bm5pbmcgdGhlIHNvdXJjZSBjb2RlIChlaXRoZXIKKyAgICAgICAgZnJvbSBzdGRvdXQsIG9yIGEgdHJhY2ViYWNrIGluIGNhc2Ugb2YgZXhjZXB0aW9uKS4gIGB3YW50YCBlbmRzCisgICAgICAgIHdpdGggYSBuZXdsaW5lIHVubGVzcyBpdCdzIGVtcHR5LCBpbiB3aGljaCBjYXNlIGl0J3MgYW4gZW1wdHkKKyAgICAgICAgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFkZHMgYSBuZXdsaW5lIGlmIG5lZWRlZC4KKworICAgICAgLSBleGNfbXNnOiBUaGUgZXhjZXB0aW9uIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBleGFtcGxlLCBpZgorICAgICAgICB0aGUgZXhhbXBsZSBpcyBleHBlY3RlZCB0byBnZW5lcmF0ZSBhbiBleGNlcHRpb247IG9yIGBOb25lYCBpZgorICAgICAgICBpdCBpcyBub3QgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgYW4gZXhjZXB0aW9uLiAgVGhpcyBleGNlcHRpb24KKyAgICAgICAgbWVzc2FnZSBpcyBjb21wYXJlZCBhZ2FpbnN0IHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgICAgICAgYHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoKWAuICBgZXhjX21zZ2AgZW5kcyB3aXRoIGEKKyAgICAgICAgbmV3bGluZSB1bmxlc3MgaXQncyBgTm9uZWAuICBUaGUgY29uc3RydWN0b3IgYWRkcyBhIG5ld2xpbmUKKyAgICAgICAgaWYgbmVlZGVkLgorCisgICAgICAtIGxpbmVubzogVGhlIGxpbmUgbnVtYmVyIHdpdGhpbiB0aGUgRG9jVGVzdCBzdHJpbmcgY29udGFpbmluZworICAgICAgICB0aGlzIEV4YW1wbGUgd2hlcmUgdGhlIEV4YW1wbGUgYmVnaW5zLiAgVGhpcyBsaW5lIG51bWJlciBpcworICAgICAgICB6ZXJvLWJhc2VkLCB3aXRoIHJlc3BlY3QgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgRG9jVGVzdC4KKworICAgICAgLSBpbmRlbnQ6IFRoZSBleGFtcGxlJ3MgaW5kZW50YXRpb24gaW4gdGhlIERvY1Rlc3Qgc3RyaW5nLgorICAgICAgICBJLmUuLCB0aGUgbnVtYmVyIG9mIHNwYWNlIGNoYXJhY3RlcnMgdGhhdCBwcmVjZWVkIHRoZQorICAgICAgICBleGFtcGxlJ3MgZmlyc3QgcHJvbXB0LgorCisgICAgICAtIG9wdGlvbnM6IEEgZGljdGlvbmFyeSBtYXBwaW5nIGZyb20gb3B0aW9uIGZsYWdzIHRvIFRydWUgb3IKKyAgICAgICAgRmFsc2UsIHdoaWNoIGlzIHVzZWQgdG8gb3ZlcnJpZGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGlzCisgICAgICAgIGV4YW1wbGUuICBBbnkgb3B0aW9uIGZsYWdzIG5vdCBjb250YWluZWQgaW4gdGhpcyBkaWN0aW9uYXJ5CisgICAgICAgIGFyZSBsZWZ0IGF0IHRoZWlyIGRlZmF1bHQgdmFsdWUgKGFzIHNwZWNpZmllZCBieSB0aGUKKyAgICAgICAgRG9jVGVzdFJ1bm5lcidzIG9wdGlvbmZsYWdzKS4gIEJ5IGRlZmF1bHQsIG5vIG9wdGlvbnMgYXJlIHNldC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCB3YW50LCBleGNfbXNnPU5vbmUsIGxpbmVubz0wLCBpbmRlbnQ9MCwKKyAgICAgICAgICAgICAgICAgb3B0aW9ucz1Ob25lKToKKyAgICAgICAgIyBOb3JtYWxpemUgaW5wdXRzLgorICAgICAgICBpZiBub3Qgc291cmNlLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgc291cmNlICs9ICdcbicKKyAgICAgICAgaWYgd2FudCBhbmQgbm90IHdhbnQuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICB3YW50ICs9ICdcbicKKyAgICAgICAgaWYgZXhjX21zZyBpcyBub3QgTm9uZSBhbmQgbm90IGV4Y19tc2cuZW5kc3dpdGgoJ1xuJyk6CisgICAgICAgICAgICBleGNfbXNnICs9ICdcbicKKyAgICAgICAgIyBTdG9yZSBwcm9wZXJ0aWVzLgorICAgICAgICBzZWxmLnNvdXJjZSA9IHNvdXJjZQorICAgICAgICBzZWxmLndhbnQgPSB3YW50CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIHNlbGYuaW5kZW50ID0gaW5kZW50CisgICAgICAgIGlmIG9wdGlvbnMgaXMgTm9uZTogb3B0aW9ucyA9IHt9CisgICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc2VsZi5leGNfbXNnID0gZXhjX21zZworCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHR5cGUoc2VsZikgaXMgbm90IHR5cGUob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlID09IG90aGVyLnNvdXJjZSBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi53YW50ID09IG90aGVyLndhbnQgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYubGluZW5vID09IG90aGVyLmxpbmVubyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5pbmRlbnQgPT0gb3RoZXIuaW5kZW50IGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnMgPT0gb3RoZXIub3B0aW9ucyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5leGNfbXNnID09IG90aGVyLmV4Y19tc2cKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goKHNlbGYuc291cmNlLCBzZWxmLndhbnQsIHNlbGYubGluZW5vLCBzZWxmLmluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhjX21zZykpCisKKworY2xhc3MgRG9jVGVzdDoKKyAgICAiIiIKKyAgICBBIGNvbGxlY3Rpb24gb2YgZG9jdGVzdCBleGFtcGxlcyB0aGF0IHNob3VsZCBiZSBydW4gaW4gYSBzaW5nbGUKKyAgICBuYW1lc3BhY2UuICBFYWNoIGBEb2NUZXN0YCBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKworICAgICAgLSBleGFtcGxlczogdGhlIGxpc3Qgb2YgZXhhbXBsZXMuCisKKyAgICAgIC0gZ2xvYnM6IFRoZSBuYW1lc3BhY2UgKGFrYSBnbG9iYWxzKSB0aGF0IHRoZSBleGFtcGxlcyBzaG91bGQKKyAgICAgICAgYmUgcnVuIGluLgorCisgICAgICAtIG5hbWU6IEEgbmFtZSBpZGVudGlmeWluZyB0aGUgRG9jVGVzdCAodHlwaWNhbGx5LCB0aGUgbmFtZSBvZgorICAgICAgICB0aGUgb2JqZWN0IHdob3NlIGRvY3N0cmluZyB0aGlzIERvY1Rlc3Qgd2FzIGV4dHJhY3RlZCBmcm9tKS4KKworICAgICAgLSBmaWxlbmFtZTogVGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB0aGlzIERvY1Rlc3Qgd2FzIGV4dHJhY3RlZAorICAgICAgICBmcm9tLCBvciBgTm9uZWAgaWYgdGhlIGZpbGVuYW1lIGlzIHVua25vd24uCisKKyAgICAgIC0gbGluZW5vOiBUaGUgbGluZSBudW1iZXIgd2l0aGluIGZpbGVuYW1lIHdoZXJlIHRoaXMgRG9jVGVzdAorICAgICAgICBiZWdpbnMsIG9yIGBOb25lYCBpZiB0aGUgbGluZSBudW1iZXIgaXMgdW5hdmFpbGFibGUuICBUaGlzCisgICAgICAgIGxpbmUgbnVtYmVyIGlzIHplcm8tYmFzZWQsIHdpdGggcmVzcGVjdCB0byB0aGUgYmVnaW5uaW5nIG9mCisgICAgICAgIHRoZSBmaWxlLgorCisgICAgICAtIGRvY3N0cmluZzogVGhlIHN0cmluZyB0aGF0IHRoZSBleGFtcGxlcyB3ZXJlIGV4dHJhY3RlZCBmcm9tLAorICAgICAgICBvciBgTm9uZWAgaWYgdGhlIHN0cmluZyBpcyB1bmF2YWlsYWJsZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhhbXBsZXMsIGdsb2JzLCBuYW1lLCBmaWxlbmFtZSwgbGluZW5vLCBkb2NzdHJpbmcpOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgbmV3IERvY1Rlc3QgY29udGFpbmluZyB0aGUgZ2l2ZW4gZXhhbXBsZXMuICBUaGUKKyAgICAgICAgRG9jVGVzdCdzIGdsb2JhbHMgYXJlIGluaXRpYWxpemVkIHdpdGggYSBjb3B5IG9mIGBnbG9ic2AuCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgbm90IGlzaW5zdGFuY2UoZXhhbXBsZXMsIGJhc2VzdHJpbmcpLCBcCisgICAgICAgICAgICAgICAiRG9jVGVzdCBubyBsb25nZXIgYWNjZXB0cyBzdHI7IHVzZSBEb2NUZXN0UGFyc2VyIGluc3RlYWQiCisgICAgICAgIHNlbGYuZXhhbXBsZXMgPSBleGFtcGxlcworICAgICAgICBzZWxmLmRvY3N0cmluZyA9IGRvY3N0cmluZworICAgICAgICBzZWxmLmdsb2JzID0gZ2xvYnMuY29weSgpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIGxlbihzZWxmLmV4YW1wbGVzKSA9PSAwOgorICAgICAgICAgICAgZXhhbXBsZXMgPSAnbm8gZXhhbXBsZXMnCisgICAgICAgIGVsaWYgbGVuKHNlbGYuZXhhbXBsZXMpID09IDE6CisgICAgICAgICAgICBleGFtcGxlcyA9ICcxIGV4YW1wbGUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleGFtcGxlcyA9ICclZCBleGFtcGxlcycgJSBsZW4oc2VsZi5leGFtcGxlcykKKyAgICAgICAgcmV0dXJuICgnPERvY1Rlc3QgJXMgZnJvbSAlczolcyAoJXMpPicgJQorICAgICAgICAgICAgICAgIChzZWxmLm5hbWUsIHNlbGYuZmlsZW5hbWUsIHNlbGYubGluZW5vLCBleGFtcGxlcykpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgdHlwZShzZWxmKSBpcyBub3QgdHlwZShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgICAgICByZXR1cm4gc2VsZi5leGFtcGxlcyA9PSBvdGhlci5leGFtcGxlcyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5kb2NzdHJpbmcgPT0gb3RoZXIuZG9jc3RyaW5nIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLmdsb2JzID09IG90aGVyLmdsb2JzIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLm5hbWUgPT0gb3RoZXIubmFtZSBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9PSBvdGhlci5maWxlbmFtZSBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPT0gb3RoZXIubGluZW5vCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKChzZWxmLmRvY3N0cmluZywgc2VsZi5uYW1lLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubykpCisKKyAgICAjIFRoaXMgbGV0cyB1cyBzb3J0IHRlc3RzIGJ5IG5hbWU6CisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgRG9jVGVzdCk6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgcmV0dXJuIGNtcCgoc2VsZi5uYW1lLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmxpbmVubywgaWQoc2VsZikpLAorICAgICAgICAgICAgICAgICAgIChvdGhlci5uYW1lLCBvdGhlci5maWxlbmFtZSwgb3RoZXIubGluZW5vLCBpZChvdGhlcikpKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyAzLiBEb2NUZXN0UGFyc2VyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIERvY1Rlc3RQYXJzZXI6CisgICAgIiIiCisgICAgQSBjbGFzcyB1c2VkIHRvIHBhcnNlIHN0cmluZ3MgY29udGFpbmluZyBkb2N0ZXN0IGV4YW1wbGVzLgorICAgICIiIgorICAgICMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gaXMgdXNlZCB0byBmaW5kIGRvY3Rlc3QgZXhhbXBsZXMgaW4gYQorICAgICMgc3RyaW5nLiAgSXQgZGVmaW5lcyB0aHJlZSBncm91cHM6IGBzb3VyY2VgIGlzIHRoZSBzb3VyY2UgY29kZQorICAgICMgKGluY2x1ZGluZyBsZWFkaW5nIGluZGVudGF0aW9uIGFuZCBwcm9tcHRzKTsgYGluZGVudGAgaXMgdGhlCisgICAgIyBpbmRlbnRhdGlvbiBvZiB0aGUgZmlyc3QgKFBTMSkgbGluZSBvZiB0aGUgc291cmNlIGNvZGU7IGFuZAorICAgICMgYHdhbnRgIGlzIHRoZSBleHBlY3RlZCBvdXRwdXQgKGluY2x1ZGluZyBsZWFkaW5nIGluZGVudGF0aW9uKS4KKyAgICBfRVhBTVBMRV9SRSA9IHJlLmNvbXBpbGUocicnJworICAgICAgICAjIFNvdXJjZSBjb25zaXN0cyBvZiBhIFBTMSBsaW5lIGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBQUzIgbGluZXMuCisgICAgICAgICg/UDxzb3VyY2U+CisgICAgICAgICAgICAoPzpeKD9QPGluZGVudD4gWyBdKikgPj4+ICAgIC4qKSAgICAjIFBTMSBsaW5lCisgICAgICAgICAgICAoPzpcbiAgICAgICAgICAgWyBdKiAgXC5cLlwuIC4qKSopICAjIFBTMiBsaW5lcworICAgICAgICBcbj8KKyAgICAgICAgIyBXYW50IGNvbnNpc3RzIG9mIGFueSBub24tYmxhbmsgbGluZXMgdGhhdCBkbyBub3Qgc3RhcnQgd2l0aCBQUzEuCisgICAgICAgICg/UDx3YW50PiAoPzooPyFbIF0qJCkgICAgIyBOb3QgYSBibGFuayBsaW5lCisgICAgICAgICAgICAgICAgICAgICAoPyFbIF0qPj4+KSAgIyBOb3QgYSBsaW5lIHN0YXJ0aW5nIHdpdGggUFMxCisgICAgICAgICAgICAgICAgICAgICAuKiRcbj8gICAgICAgIyBCdXQgYW55IG90aGVyIGxpbmUKKyAgICAgICAgICAgICAgICAgICkqKQorICAgICAgICAnJycsIHJlLk1VTFRJTElORSB8IHJlLlZFUkJPU0UpCisKKyAgICAjIEEgcmVndWxhciBleHByZXNzaW9uIGZvciBoYW5kbGluZyBgd2FudGAgc3RyaW5ncyB0aGF0IGNvbnRhaW4KKyAgICAjIGV4cGVjdGVkIGV4Y2VwdGlvbnMuICBJdCBkaXZpZGVzIGB3YW50YCBpbnRvIHRocmVlIHBpZWNlczoKKyAgICAjICAgIC0gdGhlIHRyYWNlYmFjayBoZWFkZXIgbGluZSAoYGhkcmApCisgICAgIyAgICAtIHRoZSB0cmFjZWJhY2sgc3RhY2sgKGBzdGFja2ApCisgICAgIyAgICAtIHRoZSBleGNlcHRpb24gbWVzc2FnZSAoYG1zZ2ApLCBhcyBnZW5lcmF0ZWQgYnkKKyAgICAjICAgICAgdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSgpCisgICAgIyBgbXNnYCBtYXkgaGF2ZSBtdWx0aXBsZSBsaW5lcy4gIFdlIGFzc3VtZS9yZXF1aXJlIHRoYXQgdGhlCisgICAgIyBleGNlcHRpb24gbWVzc2FnZSBpcyB0aGUgZmlyc3Qgbm9uLWluZGVudGVkIGxpbmUgc3RhcnRpbmcgd2l0aCBhIHdvcmQKKyAgICAjIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIHRyYWNlYmFjayBoZWFkZXIgbGluZS4KKyAgICBfRVhDRVBUSU9OX1JFID0gcmUuY29tcGlsZShyIiIiCisgICAgICAgICMgR3JhYiB0aGUgdHJhY2ViYWNrIGhlYWRlci4gIERpZmZlcmVudCB2ZXJzaW9ucyBvZiBQeXRob24gaGF2ZQorICAgICAgICAjIHNhaWQgZGlmZmVyZW50IHRoaW5ncyBvbiB0aGUgZmlyc3QgdHJhY2ViYWNrIGxpbmUuCisgICAgICAgIF4oP1A8aGRyPiBUcmFjZWJhY2tcIFwoCisgICAgICAgICAgICAoPzogbW9zdFwgcmVjZW50XCBjYWxsXCBsYXN0CisgICAgICAgICAgICB8ICAgaW5uZXJtb3N0XCBsYXN0CisgICAgICAgICAgICApIFwpIDoKKyAgICAgICAgKQorICAgICAgICBccyogJCAgICAgICAgICAgICAgICAjIHRvc3MgdHJhaWxpbmcgd2hpdGVzcGFjZSBvbiB0aGUgaGVhZGVyLgorICAgICAgICAoP1A8c3RhY2s+IC4qPykgICAgICAjIGRvbid0IGJsaW5rOiBhYnNvcmIgc3R1ZmYgdW50aWwuLi4KKyAgICAgICAgXiAoP1A8bXNnPiBcdysgLiopICAgIyAgICAgYSBsaW5lICpzdGFydHMqIHdpdGggYWxwaGFudW0uCisgICAgICAgICIiIiwgcmUuVkVSQk9TRSB8IHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTCkKKworICAgICMgQSBjYWxsYWJsZSByZXR1cm5pbmcgYSB0cnVlIHZhbHVlIGlmZiBpdHMgYXJndW1lbnQgaXMgYSBibGFuayBsaW5lCisgICAgIyBvciBjb250YWlucyBhIHNpbmdsZSBjb21tZW50LgorICAgIF9JU19CTEFOS19PUl9DT01NRU5UID0gcmUuY29tcGlsZShyJ15bIF0qKCMuKik/JCcpLm1hdGNoCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgc3RyaW5nLCBuYW1lPSc8c3RyaW5nPicpOgorICAgICAgICAiIiIKKyAgICAgICAgRGl2aWRlIHRoZSBnaXZlbiBzdHJpbmcgaW50byBleGFtcGxlcyBhbmQgaW50ZXJ2ZW5pbmcgdGV4dCwKKyAgICAgICAgYW5kIHJldHVybiB0aGVtIGFzIGEgbGlzdCBvZiBhbHRlcm5hdGluZyBFeGFtcGxlcyBhbmQgc3RyaW5ncy4KKyAgICAgICAgTGluZSBudW1iZXJzIGZvciB0aGUgRXhhbXBsZXMgYXJlIDAtYmFzZWQuICBUaGUgb3B0aW9uYWwKKyAgICAgICAgYXJndW1lbnQgYG5hbWVgIGlzIGEgbmFtZSBpZGVudGlmeWluZyB0aGlzIHN0cmluZywgYW5kIGlzIG9ubHkKKyAgICAgICAgdXNlZCBmb3IgZXJyb3IgbWVzc2FnZXMuCisgICAgICAgICIiIgorICAgICAgICBzdHJpbmcgPSBzdHJpbmcuZXhwYW5kdGFicygpCisgICAgICAgICMgSWYgYWxsIGxpbmVzIGJlZ2luIHdpdGggdGhlIHNhbWUgaW5kZW50YXRpb24sIHRoZW4gc3RyaXAgaXQuCisgICAgICAgIG1pbl9pbmRlbnQgPSBzZWxmLl9taW5faW5kZW50KHN0cmluZykKKyAgICAgICAgaWYgbWluX2luZGVudCA+IDA6CisgICAgICAgICAgICBzdHJpbmcgPSAnXG4nLmpvaW4oW2xbbWluX2luZGVudDpdIGZvciBsIGluIHN0cmluZy5zcGxpdCgnXG4nKV0pCisKKyAgICAgICAgb3V0cHV0ID0gW10KKyAgICAgICAgY2hhcm5vLCBsaW5lbm8gPSAwLCAwCisgICAgICAgICMgRmluZCBhbGwgZG9jdGVzdCBleGFtcGxlcyBpbiB0aGUgc3RyaW5nOgorICAgICAgICBmb3IgbSBpbiBzZWxmLl9FWEFNUExFX1JFLmZpbmRpdGVyKHN0cmluZyk6CisgICAgICAgICAgICAjIEFkZCB0aGUgcHJlLWV4YW1wbGUgdGV4dCB0byBgb3V0cHV0YC4KKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoc3RyaW5nW2NoYXJubzptLnN0YXJ0KCldKQorICAgICAgICAgICAgIyBVcGRhdGUgbGluZW5vIChsaW5lcyBiZWZvcmUgdGhpcyBleGFtcGxlKQorICAgICAgICAgICAgbGluZW5vICs9IHN0cmluZy5jb3VudCgnXG4nLCBjaGFybm8sIG0uc3RhcnQoKSkKKyAgICAgICAgICAgICMgRXh0cmFjdCBpbmZvIGZyb20gdGhlIHJlZ2V4cCBtYXRjaC4KKyAgICAgICAgICAgIChzb3VyY2UsIG9wdGlvbnMsIHdhbnQsIGV4Y19tc2cpID0gXAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VfZXhhbXBsZShtLCBuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICAjIENyZWF0ZSBhbiBFeGFtcGxlLCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0LgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX0lTX0JMQU5LX09SX0NPTU1FTlQoc291cmNlKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCBFeGFtcGxlKHNvdXJjZSwgd2FudCwgZXhjX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubz1saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQ9bWluX2luZGVudCtsZW4obS5ncm91cCgnaW5kZW50JykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1vcHRpb25zKSApCisgICAgICAgICAgICAjIFVwZGF0ZSBsaW5lbm8gKGxpbmVzIGluc2lkZSB0aGlzIGV4YW1wbGUpCisgICAgICAgICAgICBsaW5lbm8gKz0gc3RyaW5nLmNvdW50KCdcbicsIG0uc3RhcnQoKSwgbS5lbmQoKSkKKyAgICAgICAgICAgICMgVXBkYXRlIGNoYXJuby4KKyAgICAgICAgICAgIGNoYXJubyA9IG0uZW5kKCkKKyAgICAgICAgIyBBZGQgYW55IHJlbWFpbmluZyBwb3N0LWV4YW1wbGUgdGV4dCB0byBgb3V0cHV0YC4KKyAgICAgICAgb3V0cHV0LmFwcGVuZChzdHJpbmdbY2hhcm5vOl0pCisgICAgICAgIHJldHVybiBvdXRwdXQKKworICAgIGRlZiBnZXRfZG9jdGVzdChzZWxmLCBzdHJpbmcsIGdsb2JzLCBuYW1lLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgIiIiCisgICAgICAgIEV4dHJhY3QgYWxsIGRvY3Rlc3QgZXhhbXBsZXMgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLCBhbmQKKyAgICAgICAgY29sbGVjdCB0aGVtIGludG8gYSBgRG9jVGVzdGAgb2JqZWN0LgorCisgICAgICAgIGBnbG9ic2AsIGBuYW1lYCwgYGZpbGVuYW1lYCwgYW5kIGBsaW5lbm9gIGFyZSBhdHRyaWJ1dGVzIGZvcgorICAgICAgICB0aGUgbmV3IGBEb2NUZXN0YCBvYmplY3QuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGBEb2NUZXN0YAorICAgICAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBEb2NUZXN0KHNlbGYuZ2V0X2V4YW1wbGVzKHN0cmluZywgbmFtZSksIGdsb2JzLAorICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBmaWxlbmFtZSwgbGluZW5vLCBzdHJpbmcpCisKKyAgICBkZWYgZ2V0X2V4YW1wbGVzKHNlbGYsIHN0cmluZywgbmFtZT0nPHN0cmluZz4nKToKKyAgICAgICAgIiIiCisgICAgICAgIEV4dHJhY3QgYWxsIGRvY3Rlc3QgZXhhbXBsZXMgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLCBhbmQgcmV0dXJuCisgICAgICAgIHRoZW0gYXMgYSBsaXN0IG9mIGBFeGFtcGxlYCBvYmplY3RzLiAgTGluZSBudW1iZXJzIGFyZQorICAgICAgICAwLWJhc2VkLCBiZWNhdXNlIGl0J3MgbW9zdCBjb21tb24gaW4gZG9jdGVzdHMgdGhhdCBub3RoaW5nCisgICAgICAgIGludGVyZXN0aW5nIGFwcGVhcnMgb24gdGhlIHNhbWUgbGluZSBhcyBvcGVuaW5nIHRyaXBsZS1xdW90ZSwKKyAgICAgICAgYW5kIHNvIHRoZSBmaXJzdCBpbnRlcmVzdGluZyBsaW5lIGlzIGNhbGxlZCBcImxpbmUgMVwiIHRoZW4uCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBuYW1lYCBpcyBhIG5hbWUgaWRlbnRpZnlpbmcgdGhpcworICAgICAgICBzdHJpbmcsIGFuZCBpcyBvbmx5IHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFt4IGZvciB4IGluIHNlbGYucGFyc2Uoc3RyaW5nLCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgRXhhbXBsZSldCisKKyAgICBkZWYgX3BhcnNlX2V4YW1wbGUoc2VsZiwgbSwgbmFtZSwgbGluZW5vKToKKyAgICAgICAgIiIiCisgICAgICAgIEdpdmVuIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGZyb20gYF9FWEFNUExFX1JFYCAoYG1gKSwKKyAgICAgICAgcmV0dXJuIGEgcGFpciBgKHNvdXJjZSwgd2FudClgLCB3aGVyZSBgc291cmNlYCBpcyB0aGUgbWF0Y2hlZAorICAgICAgICBleGFtcGxlJ3Mgc291cmNlIGNvZGUgKHdpdGggcHJvbXB0cyBhbmQgaW5kZW50YXRpb24gc3RyaXBwZWQpOworICAgICAgICBhbmQgYHdhbnRgIGlzIHRoZSBleGFtcGxlJ3MgZXhwZWN0ZWQgb3V0cHV0ICh3aXRoIGluZGVudGF0aW9uCisgICAgICAgIHN0cmlwcGVkKS4KKworICAgICAgICBgbmFtZWAgaXMgdGhlIHN0cmluZydzIG5hbWUsIGFuZCBgbGluZW5vYCBpcyB0aGUgbGluZSBudW1iZXIKKyAgICAgICAgd2hlcmUgdGhlIGV4YW1wbGUgc3RhcnRzOyBib3RoIGFyZSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgIiIiCisgICAgICAgICMgR2V0IHRoZSBleGFtcGxlJ3MgaW5kZW50YXRpb24gbGV2ZWwuCisgICAgICAgIGluZGVudCA9IGxlbihtLmdyb3VwKCdpbmRlbnQnKSkKKworICAgICAgICAjIERpdmlkZSBzb3VyY2UgaW50byBsaW5lczsgY2hlY2sgdGhhdCB0aGV5J3JlIHByb3Blcmx5CisgICAgICAgICMgaW5kZW50ZWQ7IGFuZCB0aGVuIHN0cmlwIHRoZWlyIGluZGVudGF0aW9uICYgcHJvbXB0cy4KKyAgICAgICAgc291cmNlX2xpbmVzID0gbS5ncm91cCgnc291cmNlJykuc3BsaXQoJ1xuJykKKyAgICAgICAgc2VsZi5fY2hlY2tfcHJvbXB0X2JsYW5rKHNvdXJjZV9saW5lcywgaW5kZW50LCBuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYuX2NoZWNrX3ByZWZpeChzb3VyY2VfbGluZXNbMTpdLCAnICcqaW5kZW50ICsgJy4nLCBuYW1lLCBsaW5lbm8pCisgICAgICAgIHNvdXJjZSA9ICdcbicuam9pbihbc2xbaW5kZW50KzQ6XSBmb3Igc2wgaW4gc291cmNlX2xpbmVzXSkKKworICAgICAgICAjIERpdmlkZSB3YW50IGludG8gbGluZXM7IGNoZWNrIHRoYXQgaXQncyBwcm9wZXJseSBpbmRlbnRlZDsgYW5kCisgICAgICAgICMgdGhlbiBzdHJpcCB0aGUgaW5kZW50YXRpb24uICBTcGFjZXMgYmVmb3JlIHRoZSBsYXN0IG5ld2xpbmUgc2hvdWxkCisgICAgICAgICMgYmUgcHJlc2VydmVkLCBzbyBwbGFpbiByc3RyaXAoKSBpc24ndCBnb29kIGVub3VnaC4KKyAgICAgICAgd2FudCA9IG0uZ3JvdXAoJ3dhbnQnKQorICAgICAgICB3YW50X2xpbmVzID0gd2FudC5zcGxpdCgnXG4nKQorICAgICAgICBpZiBsZW4od2FudF9saW5lcykgPiAxIGFuZCByZS5tYXRjaChyJyAqJCcsIHdhbnRfbGluZXNbLTFdKToKKyAgICAgICAgICAgIGRlbCB3YW50X2xpbmVzWy0xXSAgIyBmb3JnZXQgZmluYWwgbmV3bGluZSAmIHNwYWNlcyBhZnRlciBpdAorICAgICAgICBzZWxmLl9jaGVja19wcmVmaXgod2FudF9saW5lcywgJyAnKmluZGVudCwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubyArIGxlbihzb3VyY2VfbGluZXMpKQorICAgICAgICB3YW50ID0gJ1xuJy5qb2luKFt3bFtpbmRlbnQ6XSBmb3Igd2wgaW4gd2FudF9saW5lc10pCisKKyAgICAgICAgIyBJZiBgd2FudGAgY29udGFpbnMgYSB0cmFjZWJhY2sgbWVzc2FnZSwgdGhlbiBleHRyYWN0IGl0LgorICAgICAgICBtID0gc2VsZi5fRVhDRVBUSU9OX1JFLm1hdGNoKHdhbnQpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBleGNfbXNnID0gbS5ncm91cCgnbXNnJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4Y19tc2cgPSBOb25lCisKKyAgICAgICAgIyBFeHRyYWN0IG9wdGlvbnMgZnJvbSB0aGUgc291cmNlLgorICAgICAgICBvcHRpb25zID0gc2VsZi5fZmluZF9vcHRpb25zKHNvdXJjZSwgbmFtZSwgbGluZW5vKQorCisgICAgICAgIHJldHVybiBzb3VyY2UsIG9wdGlvbnMsIHdhbnQsIGV4Y19tc2cKKworICAgICMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gbG9va3MgZm9yIG9wdGlvbiBkaXJlY3RpdmVzIGluIHRoZQorICAgICMgc291cmNlIGNvZGUgb2YgYW4gZXhhbXBsZS4gIE9wdGlvbiBkaXJlY3RpdmVzIGFyZSBjb21tZW50cworICAgICMgc3RhcnRpbmcgd2l0aCAiZG9jdGVzdDoiLiAgV2FybmluZzogdGhpcyBtYXkgZ2l2ZSBmYWxzZQorICAgICMgcG9zaXRpdmVzIGZvciBzdHJpbmctbGl0ZXJhbHMgdGhhdCBjb250YWluIHRoZSBzdHJpbmcKKyAgICAjICIjZG9jdGVzdDoiLiAgRWxpbWluYXRpbmcgdGhlc2UgZmFsc2UgcG9zaXRpdmVzIHdvdWxkIHJlcXVpcmUKKyAgICAjIGFjdHVhbGx5IHBhcnNpbmcgdGhlIHN0cmluZzsgYnV0IHdlIGxpbWl0IHRoZW0gYnkgaWdub3JpbmcgYW55CisgICAgIyBsaW5lIGNvbnRhaW5pbmcgIiNkb2N0ZXN0OiIgdGhhdCBpcyAqZm9sbG93ZWQqIGJ5IGEgcXVvdGUgbWFyay4KKyAgICBfT1BUSU9OX0RJUkVDVElWRV9SRSA9IHJlLmNvbXBpbGUocicjXHMqZG9jdGVzdDpccyooW15cblwnIl0qKSQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5NVUxUSUxJTkUpCisKKyAgICBkZWYgX2ZpbmRfb3B0aW9ucyhzZWxmLCBzb3VyY2UsIG5hbWUsIGxpbmVubyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgb3B0aW9uIG92ZXJyaWRlcyBleHRyYWN0ZWQgZnJvbQorICAgICAgICBvcHRpb24gZGlyZWN0aXZlcyBpbiB0aGUgZ2l2ZW4gc291cmNlIHN0cmluZy4KKworICAgICAgICBgbmFtZWAgaXMgdGhlIHN0cmluZydzIG5hbWUsIGFuZCBgbGluZW5vYCBpcyB0aGUgbGluZSBudW1iZXIKKyAgICAgICAgd2hlcmUgdGhlIGV4YW1wbGUgc3RhcnRzOyBib3RoIGFyZSB1c2VkIGZvciBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgIiIiCisgICAgICAgIG9wdGlvbnMgPSB7fQorICAgICAgICAjIChub3RlOiB3aXRoIHRoZSBjdXJyZW50IHJlZ2V4cCwgdGhpcyB3aWxsIG1hdGNoIGF0IG1vc3Qgb25jZTopCisgICAgICAgIGZvciBtIGluIHNlbGYuX09QVElPTl9ESVJFQ1RJVkVfUkUuZmluZGl0ZXIoc291cmNlKToKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzID0gbS5ncm91cCgxKS5yZXBsYWNlKCcsJywgJyAnKS5zcGxpdCgpCisgICAgICAgICAgICBmb3Igb3B0aW9uIGluIG9wdGlvbl9zdHJpbmdzOgorICAgICAgICAgICAgICAgIGlmIChvcHRpb25bMF0gbm90IGluICcrLScgb3IKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uWzE6XSBub3QgaW4gT1BUSU9ORkxBR1NfQllfTkFNRSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xpbmUgJXIgb2YgdGhlIGRvY3Rlc3QgZm9yICVzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGFzIGFuIGludmFsaWQgb3B0aW9uOiAlcicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lbm8rMSwgbmFtZSwgb3B0aW9uKSkKKyAgICAgICAgICAgICAgICBmbGFnID0gT1BUSU9ORkxBR1NfQllfTkFNRVtvcHRpb25bMTpdXQorICAgICAgICAgICAgICAgIG9wdGlvbnNbZmxhZ10gPSAob3B0aW9uWzBdID09ICcrJykKKyAgICAgICAgaWYgb3B0aW9ucyBhbmQgc2VsZi5fSVNfQkxBTktfT1JfQ09NTUVOVChzb3VyY2UpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbGluZSAlciBvZiB0aGUgZG9jdGVzdCBmb3IgJXMgaGFzIGFuIG9wdGlvbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXJlY3RpdmUgb24gYSBsaW5lIHdpdGggbm8gZXhhbXBsZTogJXInICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmVubywgbmFtZSwgc291cmNlKSkKKyAgICAgICAgcmV0dXJuIG9wdGlvbnMKKworICAgICMgVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gZmluZHMgdGhlIGluZGVudGF0aW9uIG9mIGV2ZXJ5IG5vbi1ibGFuaworICAgICMgbGluZSBpbiBhIHN0cmluZy4KKyAgICBfSU5ERU5UX1JFID0gcmUuY29tcGlsZSgnXihbIF0qKSg/PVxTKScsIHJlLk1VTFRJTElORSkKKworICAgIGRlZiBfbWluX2luZGVudChzZWxmLCBzKToKKyAgICAgICAgIlJldHVybiB0aGUgbWluaW11bSBpbmRlbnRhdGlvbiBvZiBhbnkgbm9uLWJsYW5rIGxpbmUgaW4gYHNgIgorICAgICAgICBpbmRlbnRzID0gW2xlbihpbmRlbnQpIGZvciBpbmRlbnQgaW4gc2VsZi5fSU5ERU5UX1JFLmZpbmRhbGwocyldCisgICAgICAgIGlmIGxlbihpbmRlbnRzKSA+IDA6CisgICAgICAgICAgICByZXR1cm4gbWluKGluZGVudHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIF9jaGVja19wcm9tcHRfYmxhbmsoc2VsZiwgbGluZXMsIGluZGVudCwgbmFtZSwgbGluZW5vKToKKyAgICAgICAgIiIiCisgICAgICAgIEdpdmVuIHRoZSBsaW5lcyBvZiBhIHNvdXJjZSBzdHJpbmcgKGluY2x1ZGluZyBwcm9tcHRzIGFuZAorICAgICAgICBsZWFkaW5nIGluZGVudGF0aW9uKSwgY2hlY2sgdG8gbWFrZSBzdXJlIHRoYXQgZXZlcnkgcHJvbXB0IGlzCisgICAgICAgIGZvbGxvd2VkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyLiAgSWYgYW55IGxpbmUgaXMgbm90IGZvbGxvd2VkIGJ5CisgICAgICAgIGEgc3BhY2UgY2hhcmFjdGVyLCB0aGVuIHJhaXNlIFZhbHVlRXJyb3IuCisgICAgICAgICIiIgorICAgICAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgaWYgbGVuKGxpbmUpID49IGluZGVudCs0IGFuZCBsaW5lW2luZGVudCszXSAhPSAnICc6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbGluZSAlciBvZiB0aGUgZG9jc3RyaW5nIGZvciAlcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGFja3MgYmxhbmsgYWZ0ZXIgJXM6ICVyJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZW5vK2krMSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lW2luZGVudDppbmRlbnQrM10sIGxpbmUpKQorCisgICAgZGVmIF9jaGVja19wcmVmaXgoc2VsZiwgbGluZXMsIHByZWZpeCwgbmFtZSwgbGluZW5vKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIHRoYXQgZXZlcnkgbGluZSBpbiB0aGUgZ2l2ZW4gbGlzdCBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgICAgcHJlZml4OyBpZiBhbnkgbGluZSBkb2VzIG5vdCwgdGhlbiByYWlzZSBhIFZhbHVlRXJyb3IuCisgICAgICAgICIiIgorICAgICAgICBmb3IgaSwgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgaWYgbGluZSBhbmQgbm90IGxpbmUuc3RhcnRzd2l0aChwcmVmaXgpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2xpbmUgJXIgb2YgdGhlIGRvY3N0cmluZyBmb3IgJXMgaGFzICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbmNvbnNpc3RlbnQgbGVhZGluZyB3aGl0ZXNwYWNlOiAlcicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpbmVubytpKzEsIG5hbWUsIGxpbmUpKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDQuIERvY1Rlc3QgRmluZGVyCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIERvY1Rlc3RGaW5kZXI6CisgICAgIiIiCisgICAgQSBjbGFzcyB1c2VkIHRvIGV4dHJhY3QgdGhlIERvY1Rlc3RzIHRoYXQgYXJlIHJlbGV2YW50IHRvIGEgZ2l2ZW4KKyAgICBvYmplY3QsIGZyb20gaXRzIGRvY3N0cmluZyBhbmQgdGhlIGRvY3N0cmluZ3Mgb2YgaXRzIGNvbnRhaW5lZAorICAgIG9iamVjdHMuICBEb2N0ZXN0cyBjYW4gY3VycmVudGx5IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBmb2xsb3dpbmcKKyAgICBvYmplY3QgdHlwZXM6IG1vZHVsZXMsIGZ1bmN0aW9ucywgY2xhc3NlcywgbWV0aG9kcywgc3RhdGljbWV0aG9kcywKKyAgICBjbGFzc21ldGhvZHMsIGFuZCBwcm9wZXJ0aWVzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2U9RmFsc2UsIHBhcnNlcj1Eb2NUZXN0UGFyc2VyKCksCisgICAgICAgICAgICAgICAgIHJlY3Vyc2U9VHJ1ZSwgZXhjbHVkZV9lbXB0eT1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZSBhIG5ldyBkb2N0ZXN0IGZpbmRlci4KKworICAgICAgICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgYHBhcnNlcmAgc3BlY2lmaWVzIGEgY2xhc3Mgb3IKKyAgICAgICAgZnVuY3Rpb24gdGhhdCBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgbmV3IERvY1Rlc3Qgb2JqZWN0cyAob3IKKyAgICAgICAgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgRG9jVGVzdCkuICBUaGUKKyAgICAgICAgc2lnbmF0dXJlIGZvciB0aGlzIGZhY3RvcnkgZnVuY3Rpb24gc2hvdWxkIG1hdGNoIHRoZSBzaWduYXR1cmUKKyAgICAgICAgb2YgdGhlIERvY1Rlc3QgY29uc3RydWN0b3IuCisKKyAgICAgICAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGByZWN1cnNlYCBpcyBmYWxzZSwgdGhlbiBgZmluZGAgd2lsbAorICAgICAgICBvbmx5IGV4YW1pbmUgdGhlIGdpdmVuIG9iamVjdCwgYW5kIG5vdCBhbnkgY29udGFpbmVkIG9iamVjdHMuCisKKyAgICAgICAgSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBleGNsdWRlX2VtcHR5YCBpcyBmYWxzZSwgdGhlbiBgZmluZGAKKyAgICAgICAgd2lsbCBpbmNsdWRlIHRlc3RzIGZvciBvYmplY3RzIHdpdGggZW1wdHkgZG9jc3RyaW5ncy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3BhcnNlciA9IHBhcnNlcgorICAgICAgICBzZWxmLl92ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLl9yZWN1cnNlID0gcmVjdXJzZQorICAgICAgICBzZWxmLl9leGNsdWRlX2VtcHR5ID0gZXhjbHVkZV9lbXB0eQorCisgICAgZGVmIGZpbmQoc2VsZiwgb2JqLCBuYW1lPU5vbmUsIG1vZHVsZT1Ob25lLCBnbG9icz1Ob25lLCBleHRyYWdsb2JzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgRG9jVGVzdHMgdGhhdCBhcmUgZGVmaW5lZCBieSB0aGUgZ2l2ZW4KKyAgICAgICAgb2JqZWN0J3MgZG9jc3RyaW5nLCBvciBieSBhbnkgb2YgaXRzIGNvbnRhaW5lZCBvYmplY3RzJworICAgICAgICBkb2NzdHJpbmdzLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBwYXJhbWV0ZXIgYG1vZHVsZWAgaXMgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zCisgICAgICAgIHRoZSBnaXZlbiBvYmplY3QuICBJZiB0aGUgbW9kdWxlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgTm9uZSwgdGhlbgorICAgICAgICB0aGUgdGVzdCBmaW5kZXIgd2lsbCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lIHRoZQorICAgICAgICBjb3JyZWN0IG1vZHVsZS4gIFRoZSBvYmplY3QncyBtb2R1bGUgaXMgdXNlZDoKKworICAgICAgICAgICAgLSBBcyBhIGRlZmF1bHQgbmFtZXNwYWNlLCBpZiBgZ2xvYnNgIGlzIG5vdCBzcGVjaWZpZWQuCisgICAgICAgICAgICAtIFRvIHByZXZlbnQgdGhlIERvY1Rlc3RGaW5kZXIgZnJvbSBleHRyYWN0aW5nIERvY1Rlc3RzCisgICAgICAgICAgICAgIGZyb20gb2JqZWN0cyB0aGF0IGFyZSBpbXBvcnRlZCBmcm9tIG90aGVyIG1vZHVsZXMuCisgICAgICAgICAgICAtIFRvIGZpbmQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgb2JqZWN0LgorICAgICAgICAgICAgLSBUbyBoZWxwIGZpbmQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBvYmplY3Qgd2l0aGluIGl0cworICAgICAgICAgICAgICBmaWxlLgorCisgICAgICAgIENvbnRhaW5lZCBvYmplY3RzIHdob3NlIG1vZHVsZSBkb2VzIG5vdCBtYXRjaCBgbW9kdWxlYCBhcmUgaWdub3JlZC4KKworICAgICAgICBJZiBgbW9kdWxlYCBpcyBGYWxzZSwgbm8gYXR0ZW1wdCB0byBmaW5kIHRoZSBtb2R1bGUgd2lsbCBiZSBtYWRlLgorICAgICAgICBUaGlzIGlzIG9ic2N1cmUsIG9mIHVzZSBtb3N0bHkgaW4gdGVzdHM6ICBpZiBgbW9kdWxlYCBpcyBGYWxzZSwgb3IKKyAgICAgICAgaXMgTm9uZSBidXQgY2Fubm90IGJlIGZvdW5kIGF1dG9tYXRpY2FsbHksIHRoZW4gYWxsIG9iamVjdHMgYXJlCisgICAgICAgIGNvbnNpZGVyZWQgdG8gYmVsb25nIHRvIHRoZSAobm9uLWV4aXN0ZW50KSBtb2R1bGUsIHNvIGFsbCBjb250YWluZWQKKyAgICAgICAgb2JqZWN0cyB3aWxsIChyZWN1cnNpdmVseSkgYmUgc2VhcmNoZWQgZm9yIGRvY3Rlc3RzLgorCisgICAgICAgIFRoZSBnbG9iYWxzIGZvciBlYWNoIERvY1Rlc3QgaXMgZm9ybWVkIGJ5IGNvbWJpbmluZyBgZ2xvYnNgCisgICAgICAgIGFuZCBgZXh0cmFnbG9ic2AgKGJpbmRpbmdzIGluIGBleHRyYWdsb2JzYCBvdmVycmlkZSBiaW5kaW5ncworICAgICAgICBpbiBgZ2xvYnNgKS4gIEEgbmV3IGNvcHkgb2YgdGhlIGdsb2JhbHMgZGljdGlvbmFyeSBpcyBjcmVhdGVkCisgICAgICAgIGZvciBlYWNoIERvY1Rlc3QuICBJZiBgZ2xvYnNgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQKKyAgICAgICAgZGVmYXVsdHMgdG8gdGhlIG1vZHVsZSdzIGBfX2RpY3RfX2AsIGlmIHNwZWNpZmllZCwgb3Ige30KKyAgICAgICAgb3RoZXJ3aXNlLiAgSWYgYGV4dHJhZ2xvYnNgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gaXQgZGVmYXVsdHMKKyAgICAgICAgdG8ge30uCisKKyAgICAgICAgIiIiCisgICAgICAgICMgSWYgbmFtZSB3YXMgbm90IHNwZWNpZmllZCwgdGhlbiBleHRyYWN0IGl0IGZyb20gdGhlIG9iamVjdC4KKyAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgbmFtZSA9IGdldGF0dHIob2JqLCAnX19uYW1lX18nLCBOb25lKQorICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkRvY1Rlc3RGaW5kZXIuZmluZDogbmFtZSBtdXN0IGJlIGdpdmVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJ3aGVuIG9iai5fX25hbWVfXyBkb2Vzbid0IGV4aXN0OiAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUob2JqKSwpKQorCisgICAgICAgICMgRmluZCB0aGUgbW9kdWxlIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIG9iamVjdCAoaWYgb2JqIGlzCisgICAgICAgICMgYSBtb2R1bGUsIHRoZW4gbW9kdWxlPW9iai4pLiAgTm90ZTogdGhpcyBtYXkgZmFpbCwgaW4gd2hpY2gKKyAgICAgICAgIyBjYXNlIG1vZHVsZSB3aWxsIGJlIE5vbmUuCisgICAgICAgIGlmIG1vZHVsZSBpcyBGYWxzZToKKyAgICAgICAgICAgIG1vZHVsZSA9IE5vbmUKKyAgICAgICAgZWxpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZHVsZSA9IGluc3BlY3QuZ2V0bW9kdWxlKG9iaikKKworICAgICAgICAjIFJlYWQgdGhlIG1vZHVsZSdzIHNvdXJjZSBjb2RlLiAgVGhpcyBpcyB1c2VkIGJ5CisgICAgICAgICMgRG9jVGVzdEZpbmRlci5fZmluZF9saW5lbm8gdG8gZmluZCB0aGUgbGluZSBudW1iZXIgZm9yIGEKKyAgICAgICAgIyBnaXZlbiBvYmplY3QncyBkb2NzdHJpbmcuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSBpbnNwZWN0LmdldHNvdXJjZWZpbGUob2JqKSBvciBpbnNwZWN0LmdldGZpbGUob2JqKQorICAgICAgICAgICAgaWYgbW9kdWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgU3VwcGx5IHRoZSBtb2R1bGUgZ2xvYmFscyBpbiBjYXNlIHRoZSBtb2R1bGUgd2FzCisgICAgICAgICAgICAgICAgIyBvcmlnaW5hbGx5IGxvYWRlZCB2aWEgYSBQRVAgMzAyIGxvYWRlciBhbmQKKyAgICAgICAgICAgICAgICAjIGZpbGUgaXMgbm90IGEgdmFsaWQgZmlsZXN5c3RlbSBwYXRoCisgICAgICAgICAgICAgICAgc291cmNlX2xpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzKGZpbGUsIG1vZHVsZS5fX2RpY3RfXykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBObyBhY2Nlc3MgdG8gYSBsb2FkZXIsIHNvIGFzc3VtZSBpdCdzIGEgbm9ybWFsCisgICAgICAgICAgICAgICAgIyBmaWxlc3lzdGVtIHBhdGgKKyAgICAgICAgICAgICAgICBzb3VyY2VfbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZSkKKyAgICAgICAgICAgIGlmIG5vdCBzb3VyY2VfbGluZXM6CisgICAgICAgICAgICAgICAgc291cmNlX2xpbmVzID0gTm9uZQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgc291cmNlX2xpbmVzID0gTm9uZQorCisgICAgICAgICMgSW5pdGlhbGl6ZSBnbG9iYWxzLCBhbmQgbWVyZ2UgaW4gZXh0cmFnbG9icy4KKyAgICAgICAgaWYgZ2xvYnMgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGdsb2JzID0ge30KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZ2xvYnMgPSBtb2R1bGUuX19kaWN0X18uY29weSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnbG9icyA9IGdsb2JzLmNvcHkoKQorICAgICAgICBpZiBleHRyYWdsb2JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZ2xvYnMudXBkYXRlKGV4dHJhZ2xvYnMpCisgICAgICAgIGlmICdfX25hbWVfXycgbm90IGluIGdsb2JzOgorICAgICAgICAgICAgZ2xvYnNbJ19fbmFtZV9fJ10gPSAnX19tYWluX18nICAjIHByb3ZpZGUgYSBkZWZhdWx0IG1vZHVsZSBuYW1lCisKKyAgICAgICAgIyBSZWN1cnNpdmVseSBleHBvcmUgYG9iamAsIGV4dHJhY3RpbmcgRG9jVGVzdHMuCisgICAgICAgIHRlc3RzID0gW10KKyAgICAgICAgc2VsZi5fZmluZCh0ZXN0cywgb2JqLCBuYW1lLCBtb2R1bGUsIHNvdXJjZV9saW5lcywgZ2xvYnMsIHt9KQorICAgICAgICAjIFNvcnQgdGhlIHRlc3RzIGJ5IGFscGhhIG9yZGVyIG9mIG5hbWVzLCBmb3IgY29uc2lzdGVuY3kgaW4KKyAgICAgICAgIyB2ZXJib3NlLW1vZGUgb3V0cHV0LiAgVGhpcyB3YXMgYSBmZWF0dXJlIG9mIGRvY3Rlc3QgaW4gUHl0aG9ucworICAgICAgICAjIDw9IDIuMyB0aGF0IGdvdCBsb3N0IGJ5IGFjY2lkZW50IGluIDIuNC4gIEl0IHdhcyByZXBhaXJlZCBpbgorICAgICAgICAjIDIuNC40IGFuZCAyLjUuCisgICAgICAgIHRlc3RzLnNvcnQoKQorICAgICAgICByZXR1cm4gdGVzdHMKKworICAgIGRlZiBfZnJvbV9tb2R1bGUoc2VsZiwgbW9kdWxlLCBvYmplY3QpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBkZWZpbmVkIGluIHRoZSBnaXZlbgorICAgICAgICBtb2R1bGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsaWYgaW5zcGVjdC5nZXRtb2R1bGUob2JqZWN0KSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBtb2R1bGUgaXMgaW5zcGVjdC5nZXRtb2R1bGUob2JqZWN0KQorICAgICAgICBlbGlmIGluc3BlY3QuaXNmdW5jdGlvbihvYmplY3QpOgorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5fX2RpY3RfXyBpcyBvYmplY3QuZnVuY19nbG9iYWxzCisgICAgICAgIGVsaWYgaW5zcGVjdC5pc2NsYXNzKG9iamVjdCk6CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlLl9fbmFtZV9fID09IG9iamVjdC5fX21vZHVsZV9fCisgICAgICAgIGVsaWYgaGFzYXR0cihvYmplY3QsICdfX21vZHVsZV9fJyk6CisgICAgICAgICAgICByZXR1cm4gbW9kdWxlLl9fbmFtZV9fID09IG9iamVjdC5fX21vZHVsZV9fCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmplY3QsIHByb3BlcnR5KToKKyAgICAgICAgICAgIHJldHVybiBUcnVlICMgW1hYXSBubyB3YXkgbm90IGJlIHN1cmUuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvYmplY3QgbXVzdCBiZSBhIGNsYXNzIG9yIGZ1bmN0aW9uIikKKworICAgIGRlZiBfZmluZChzZWxmLCB0ZXN0cywgb2JqLCBuYW1lLCBtb2R1bGUsIHNvdXJjZV9saW5lcywgZ2xvYnMsIHNlZW4pOgorICAgICAgICAiIiIKKyAgICAgICAgRmluZCB0ZXN0cyBmb3IgdGhlIGdpdmVuIG9iamVjdCBhbmQgYW55IGNvbnRhaW5lZCBvYmplY3RzLCBhbmQKKyAgICAgICAgYWRkIHRoZW0gdG8gYHRlc3RzYC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3ZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnRmluZGluZyB0ZXN0cyBpbiAlcycgJSBuYW1lCisKKyAgICAgICAgIyBJZiB3ZSd2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGlzIG9iamVjdCwgdGhlbiBpZ25vcmUgaXQuCisgICAgICAgIGlmIGlkKG9iaikgaW4gc2VlbjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWVuW2lkKG9iaildID0gMQorCisgICAgICAgICMgRmluZCBhIHRlc3QgZm9yIHRoaXMgb2JqZWN0LCBhbmQgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHRlc3RzLgorICAgICAgICB0ZXN0ID0gc2VsZi5fZ2V0X3Rlc3Qob2JqLCBuYW1lLCBtb2R1bGUsIGdsb2JzLCBzb3VyY2VfbGluZXMpCisgICAgICAgIGlmIHRlc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0ZXN0cy5hcHBlbmQodGVzdCkKKworICAgICAgICAjIExvb2sgZm9yIHRlc3RzIGluIGEgbW9kdWxlJ3MgY29udGFpbmVkIG9iamVjdHMuCisgICAgICAgIGlmIGluc3BlY3QuaXNtb2R1bGUob2JqKSBhbmQgc2VsZi5fcmVjdXJzZToKKyAgICAgICAgICAgIGZvciB2YWxuYW1lLCB2YWwgaW4gb2JqLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdmFsbmFtZSA9ICclcy4lcycgJSAobmFtZSwgdmFsbmFtZSkKKyAgICAgICAgICAgICAgICAjIFJlY3Vyc2UgdG8gZnVuY3Rpb25zICYgY2xhc3Nlcy4KKyAgICAgICAgICAgICAgICBpZiAoKGluc3BlY3QuaXNmdW5jdGlvbih2YWwpIG9yIGluc3BlY3QuaXNjbGFzcyh2YWwpKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZnJvbV9tb2R1bGUobW9kdWxlLCB2YWwpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmluZCh0ZXN0cywgdmFsLCB2YWxuYW1lLCBtb2R1bGUsIHNvdXJjZV9saW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9icywgc2VlbikKKworICAgICAgICAjIExvb2sgZm9yIHRlc3RzIGluIGEgbW9kdWxlJ3MgX190ZXN0X18gZGljdGlvbmFyeS4KKyAgICAgICAgaWYgaW5zcGVjdC5pc21vZHVsZShvYmopIGFuZCBzZWxmLl9yZWN1cnNlOgorICAgICAgICAgICAgZm9yIHZhbG5hbWUsIHZhbCBpbiBnZXRhdHRyKG9iaiwgJ19fdGVzdF9fJywge30pLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsbmFtZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkRvY1Rlc3RGaW5kZXIuZmluZDogX190ZXN0X18ga2V5cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11c3QgYmUgc3RyaW5nczogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSh2YWxuYW1lKSwpKQorICAgICAgICAgICAgICAgIGlmIG5vdCAoaW5zcGVjdC5pc2Z1bmN0aW9uKHZhbCkgb3IgaW5zcGVjdC5pc2NsYXNzKHZhbCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3BlY3QuaXNtZXRob2QodmFsKSBvciBpbnNwZWN0LmlzbW9kdWxlKHZhbCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsLCBiYXNlc3RyaW5nKSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkRvY1Rlc3RGaW5kZXIuZmluZDogX190ZXN0X18gdmFsdWVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBzdHJpbmdzLCBmdW5jdGlvbnMsIG1ldGhvZHMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3Nlcywgb3IgbW9kdWxlczogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSh2YWwpLCkpCisgICAgICAgICAgICAgICAgdmFsbmFtZSA9ICclcy5fX3Rlc3RfXy4lcycgJSAobmFtZSwgdmFsbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9maW5kKHRlc3RzLCB2YWwsIHZhbG5hbWUsIG1vZHVsZSwgc291cmNlX2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYnMsIHNlZW4pCisKKyAgICAgICAgIyBMb29rIGZvciB0ZXN0cyBpbiBhIGNsYXNzJ3MgY29udGFpbmVkIG9iamVjdHMuCisgICAgICAgIGlmIGluc3BlY3QuaXNjbGFzcyhvYmopIGFuZCBzZWxmLl9yZWN1cnNlOgorICAgICAgICAgICAgZm9yIHZhbG5hbWUsIHZhbCBpbiBvYmouX19kaWN0X18uaXRlbXMoKToKKyAgICAgICAgICAgICAgICAjIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHN0YXRpY21ldGhvZC9jbGFzc21ldGhvZC4KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbCwgc3RhdGljbWV0aG9kKToKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihvYmosIHZhbG5hbWUpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGNsYXNzbWV0aG9kKToKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihvYmosIHZhbG5hbWUpLmltX2Z1bmMKKworICAgICAgICAgICAgICAgICMgUmVjdXJzZSB0byBtZXRob2RzLCBwcm9wZXJ0aWVzLCBhbmQgbmVzdGVkIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgaWYgKChpbnNwZWN0LmlzZnVuY3Rpb24odmFsKSBvciBpbnNwZWN0LmlzY2xhc3ModmFsKSBvcgorICAgICAgICAgICAgICAgICAgICAgIGlzaW5zdGFuY2UodmFsLCBwcm9wZXJ0eSkpIGFuZAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zyb21fbW9kdWxlKG1vZHVsZSwgdmFsKSk6CisgICAgICAgICAgICAgICAgICAgIHZhbG5hbWUgPSAnJXMuJXMnICUgKG5hbWUsIHZhbG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbmQodGVzdHMsIHZhbCwgdmFsbmFtZSwgbW9kdWxlLCBzb3VyY2VfbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYnMsIHNlZW4pCisKKyAgICBkZWYgX2dldF90ZXN0KHNlbGYsIG9iaiwgbmFtZSwgbW9kdWxlLCBnbG9icywgc291cmNlX2xpbmVzKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIERvY1Rlc3QgZm9yIHRoZSBnaXZlbiBvYmplY3QsIGlmIGl0IGRlZmluZXMgYSBkb2NzdHJpbmc7CisgICAgICAgIG90aGVyd2lzZSwgcmV0dXJuIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICAjIEV4dHJhY3QgdGhlIG9iamVjdCdzIGRvY3N0cmluZy4gIElmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUsCisgICAgICAgICMgdGhlbiByZXR1cm4gTm9uZSAobm8gdGVzdCBmb3IgdGhpcyBvYmplY3QpLgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBkb2NzdHJpbmcgPSBvYmoKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBvYmouX19kb2NfXyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBkb2NzdHJpbmcgPSAnJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRvY3N0cmluZyA9IG9iai5fX2RvY19fCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRvY3N0cmluZywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgICAgICAgICBkb2NzdHJpbmcgPSBzdHIoZG9jc3RyaW5nKQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgICAgICBkb2NzdHJpbmcgPSAnJworCisgICAgICAgICMgRmluZCB0aGUgZG9jc3RyaW5nJ3MgbG9jYXRpb24gaW4gdGhlIGZpbGUuCisgICAgICAgIGxpbmVubyA9IHNlbGYuX2ZpbmRfbGluZW5vKG9iaiwgc291cmNlX2xpbmVzKQorCisgICAgICAgICMgRG9uJ3QgYm90aGVyIGlmIHRoZSBkb2NzdHJpbmcgaXMgZW1wdHkuCisgICAgICAgIGlmIHNlbGYuX2V4Y2x1ZGVfZW1wdHkgYW5kIG5vdCBkb2NzdHJpbmc6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgUmV0dXJuIGEgRG9jVGVzdCBmb3IgdGhpcyBvYmplY3QuCisgICAgICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGdldGF0dHIobW9kdWxlLCAnX19maWxlX18nLCBtb2R1bGUuX19uYW1lX18pCisgICAgICAgICAgICBpZiBmaWxlbmFtZVstNDpdIGluICgiLnB5YyIsICIucHlvIik6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LTFdCisgICAgICAgIHJldHVybiBzZWxmLl9wYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIF9maW5kX2xpbmVubyhzZWxmLCBvYmosIHNvdXJjZV9saW5lcyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBsaW5lIG51bWJlciBvZiB0aGUgZ2l2ZW4gb2JqZWN0J3MgZG9jc3RyaW5nLiAgTm90ZToKKyAgICAgICAgdGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0IHRoZSBvYmplY3QgaGFzIGEgZG9jc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgbGluZW5vID0gTm9uZQorCisgICAgICAgICMgRmluZCB0aGUgbGluZSBudW1iZXIgZm9yIG1vZHVsZXMuCisgICAgICAgIGlmIGluc3BlY3QuaXNtb2R1bGUob2JqKToKKyAgICAgICAgICAgIGxpbmVubyA9IDAKKworICAgICAgICAjIEZpbmQgdGhlIGxpbmUgbnVtYmVyIGZvciBjbGFzc2VzLgorICAgICAgICAjIE5vdGU6IHRoaXMgY291bGQgYmUgZm9vbGVkIGlmIGEgY2xhc3MgaXMgZGVmaW5lZCBtdWx0aXBsZQorICAgICAgICAjIHRpbWVzIGluIGEgc2luZ2xlIGZpbGUuCisgICAgICAgIGlmIGluc3BlY3QuaXNjbGFzcyhvYmopOgorICAgICAgICAgICAgaWYgc291cmNlX2xpbmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocideXHMqY2xhc3Nccyolc1xiJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIob2JqLCAnX19uYW1lX18nLCAnLScpKQorICAgICAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKHNvdXJjZV9saW5lcyk6CisgICAgICAgICAgICAgICAgaWYgcGF0Lm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyBGaW5kIHRoZSBsaW5lIG51bWJlciBmb3IgZnVuY3Rpb25zICYgbWV0aG9kcy4KKyAgICAgICAgaWYgaW5zcGVjdC5pc21ldGhvZChvYmopOiBvYmogPSBvYmouaW1fZnVuYworICAgICAgICBpZiBpbnNwZWN0LmlzZnVuY3Rpb24ob2JqKTogb2JqID0gb2JqLmZ1bmNfY29kZQorICAgICAgICBpZiBpbnNwZWN0LmlzdHJhY2ViYWNrKG9iaik6IG9iaiA9IG9iai50Yl9mcmFtZQorICAgICAgICBpZiBpbnNwZWN0LmlzZnJhbWUob2JqKTogb2JqID0gb2JqLmZfY29kZQorICAgICAgICBpZiBpbnNwZWN0LmlzY29kZShvYmopOgorICAgICAgICAgICAgbGluZW5vID0gZ2V0YXR0cihvYmosICdjb19maXJzdGxpbmVubycsIE5vbmUpLTEKKworICAgICAgICAjIEZpbmQgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBkb2NzdHJpbmcgc3RhcnRzLiAgQXNzdW1lCisgICAgICAgICMgdGhhdCBpdCdzIHRoZSBmaXJzdCBsaW5lIHRoYXQgYmVnaW5zIHdpdGggYSBxdW90ZSBtYXJrLgorICAgICAgICAjIE5vdGU6IHRoaXMgY291bGQgYmUgZm9vbGVkIGJ5IGEgbXVsdGlsaW5lIGZ1bmN0aW9uCisgICAgICAgICMgc2lnbmF0dXJlLCB3aGVyZSBhIGNvbnRpbnVhdGlvbiBsaW5lIGJlZ2lucyB3aXRoIGEgcXVvdGUKKyAgICAgICAgIyBtYXJrLgorICAgICAgICBpZiBsaW5lbm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzb3VyY2VfbGluZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZW5vKzEKKyAgICAgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJyhefC4qOilccypcdyooInxcJyknKQorICAgICAgICAgICAgZm9yIGxpbmVubyBpbiByYW5nZShsaW5lbm8sIGxlbihzb3VyY2VfbGluZXMpKToKKyAgICAgICAgICAgICAgICBpZiBwYXQubWF0Y2goc291cmNlX2xpbmVzW2xpbmVub10pOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZW5vCisKKyAgICAgICAgIyBXZSBjb3VsZG4ndCBmaW5kIHRoZSBsaW5lIG51bWJlci4KKyAgICAgICAgcmV0dXJuIE5vbmUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgNS4gRG9jVGVzdCBSdW5uZXIKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgRG9jVGVzdFJ1bm5lcjoKKyAgICAiIiIKKyAgICBBIGNsYXNzIHVzZWQgdG8gcnVuIERvY1Rlc3QgdGVzdCBjYXNlcywgYW5kIGFjY3VtdWxhdGUgc3RhdGlzdGljcy4KKyAgICBUaGUgYHJ1bmAgbWV0aG9kIGlzIHVzZWQgdG8gcHJvY2VzcyBhIHNpbmdsZSBEb2NUZXN0IGNhc2UuICBJdAorICAgIHJldHVybnMgYSB0dXBsZSBgKGYsIHQpYCwgd2hlcmUgYHRgIGlzIHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcworICAgIHRyaWVkLCBhbmQgYGZgIGlzIHRoZSBudW1iZXIgb2YgdGVzdCBjYXNlcyB0aGF0IGZhaWxlZC4KKworICAgICAgICA+Pj4gdGVzdHMgPSBEb2NUZXN0RmluZGVyKCkuZmluZChfVGVzdENsYXNzKQorICAgICAgICA+Pj4gcnVubmVyID0gRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKQorICAgICAgICA+Pj4gdGVzdHMuc29ydChrZXkgPSBsYW1iZGEgdGVzdDogdGVzdC5uYW1lKQorICAgICAgICA+Pj4gZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgIC4uLiAgICAgcHJpbnQgdGVzdC5uYW1lLCAnLT4nLCBydW5uZXIucnVuKHRlc3QpCisgICAgICAgIF9UZXN0Q2xhc3MgLT4gVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorICAgICAgICBfVGVzdENsYXNzLl9faW5pdF9fIC0+IFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKyAgICAgICAgX1Rlc3RDbGFzcy5nZXQgLT4gVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorICAgICAgICBfVGVzdENsYXNzLnNxdWFyZSAtPiBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCisKKyAgICBUaGUgYHN1bW1hcml6ZWAgbWV0aG9kIHByaW50cyBhIHN1bW1hcnkgb2YgYWxsIHRoZSB0ZXN0IGNhc2VzIHRoYXQKKyAgICBoYXZlIGJlZW4gcnVuIGJ5IHRoZSBydW5uZXIsIGFuZCByZXR1cm5zIGFuIGFnZ3JlZ2F0ZWQgYChmLCB0KWAKKyAgICB0dXBsZToKKworICAgICAgICA+Pj4gcnVubmVyLnN1bW1hcml6ZSh2ZXJib3NlPTEpCisgICAgICAgIDQgaXRlbXMgcGFzc2VkIGFsbCB0ZXN0czoKKyAgICAgICAgICAgMiB0ZXN0cyBpbiBfVGVzdENsYXNzCisgICAgICAgICAgIDIgdGVzdHMgaW4gX1Rlc3RDbGFzcy5fX2luaXRfXworICAgICAgICAgICAyIHRlc3RzIGluIF9UZXN0Q2xhc3MuZ2V0CisgICAgICAgICAgIDEgdGVzdHMgaW4gX1Rlc3RDbGFzcy5zcXVhcmUKKyAgICAgICAgNyB0ZXN0cyBpbiA0IGl0ZW1zLgorICAgICAgICA3IHBhc3NlZCBhbmQgMCBmYWlsZWQuCisgICAgICAgIFRlc3QgcGFzc2VkLgorICAgICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTcpCisKKyAgICBUaGUgYWdncmVnYXRlZCBudW1iZXIgb2YgdHJpZWQgZXhhbXBsZXMgYW5kIGZhaWxlZCBleGFtcGxlcyBpcworICAgIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgYHRyaWVzYCBhbmQgYGZhaWx1cmVzYCBhdHRyaWJ1dGVzOgorCisgICAgICAgID4+PiBydW5uZXIudHJpZXMKKyAgICAgICAgNworICAgICAgICA+Pj4gcnVubmVyLmZhaWx1cmVzCisgICAgICAgIDAKKworICAgIFRoZSBjb21wYXJpc29uIGJldHdlZW4gZXhwZWN0ZWQgb3V0cHV0cyBhbmQgYWN0dWFsIG91dHB1dHMgaXMgZG9uZQorICAgIGJ5IGFuIGBPdXRwdXRDaGVja2VyYC4gIFRoaXMgY29tcGFyaXNvbiBtYXkgYmUgY3VzdG9taXplZCB3aXRoIGEKKyAgICBudW1iZXIgb2Ygb3B0aW9uIGZsYWdzOyBzZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIGB0ZXN0bW9kYCBmb3IKKyAgICBtb3JlIGluZm9ybWF0aW9uLiAgSWYgdGhlIG9wdGlvbiBmbGFncyBhcmUgaW5zdWZmaWNpZW50LCB0aGVuIHRoZQorICAgIGNvbXBhcmlzb24gbWF5IGFsc28gYmUgY3VzdG9taXplZCBieSBwYXNzaW5nIGEgc3ViY2xhc3Mgb2YKKyAgICBgT3V0cHV0Q2hlY2tlcmAgdG8gdGhlIGNvbnN0cnVjdG9yLgorCisgICAgVGhlIHRlc3QgcnVubmVyJ3MgZGlzcGxheSBvdXRwdXQgY2FuIGJlIGNvbnRyb2xsZWQgaW4gdHdvIHdheXMuCisgICAgRmlyc3QsIGFuIG91dHB1dCBmdW5jdGlvbiAoYG91dCkgY2FuIGJlIHBhc3NlZCB0bworICAgIGBUZXN0UnVubmVyLnJ1bmA7IHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCBzdHJpbmdzIHRoYXQKKyAgICBzaG91bGQgYmUgZGlzcGxheWVkLiAgSXQgZGVmYXVsdHMgdG8gYHN5cy5zdGRvdXQud3JpdGVgLiAgSWYKKyAgICBjYXB0dXJpbmcgdGhlIG91dHB1dCBpcyBub3Qgc3VmZmljaWVudCwgdGhlbiB0aGUgZGlzcGxheSBvdXRwdXQKKyAgICBjYW4gYmUgYWxzbyBjdXN0b21pemVkIGJ5IHN1YmNsYXNzaW5nIERvY1Rlc3RSdW5uZXIsIGFuZAorICAgIG92ZXJyaWRpbmcgdGhlIG1ldGhvZHMgYHJlcG9ydF9zdGFydGAsIGByZXBvcnRfc3VjY2Vzc2AsCisgICAgYHJlcG9ydF91bmV4cGVjdGVkX2V4Y2VwdGlvbmAsIGFuZCBgcmVwb3J0X2ZhaWx1cmVgLgorICAgICIiIgorICAgICMgVGhpcyBkaXZpZGVyIHN0cmluZyBpcyB1c2VkIHRvIHNlcGFyYXRlIGZhaWx1cmUgbWVzc2FnZXMsIGFuZCB0bworICAgICMgc2VwYXJhdGUgc2VjdGlvbnMgb2YgdGhlIHN1bW1hcnkuCisgICAgRElWSURFUiA9ICIqIiAqIDcwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2hlY2tlcj1Ob25lLCB2ZXJib3NlPU5vbmUsIG9wdGlvbmZsYWdzPTApOgorICAgICAgICAiIiIKKyAgICAgICAgQ3JlYXRlIGEgbmV3IHRlc3QgcnVubmVyLgorCisgICAgICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnIGBjaGVja2VyYCBpcyB0aGUgYE91dHB1dENoZWNrZXJgIHRoYXQKKyAgICAgICAgc2hvdWxkIGJlIHVzZWQgdG8gY29tcGFyZSB0aGUgZXhwZWN0ZWQgb3V0cHV0cyBhbmQgYWN0dWFsCisgICAgICAgIG91dHB1dHMgb2YgZG9jdGVzdCBleGFtcGxlcy4KKworICAgICAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAndmVyYm9zZScgcHJpbnRzIGxvdHMgb2Ygc3R1ZmYgaWYgdHJ1ZSwKKyAgICAgICAgb25seSBmYWlsdXJlcyBpZiBmYWxzZTsgYnkgZGVmYXVsdCwgaXQncyB0cnVlIGlmZiAnLXYnIGlzIGluCisgICAgICAgIHN5cy5hcmd2LgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50IGBvcHRpb25mbGFnc2AgY2FuIGJlIHVzZWQgdG8gY29udHJvbCBob3cgdGhlCisgICAgICAgIHRlc3QgcnVubmVyIGNvbXBhcmVzIGV4cGVjdGVkIG91dHB1dCB0byBhY3R1YWwgb3V0cHV0LCBhbmQgaG93CisgICAgICAgIGl0IGRpc3BsYXlzIGZhaWx1cmVzLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBgdGVzdG1vZGAgZm9yCisgICAgICAgIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVja2VyID0gY2hlY2tlciBvciBPdXRwdXRDaGVja2VyKCkKKyAgICAgICAgaWYgdmVyYm9zZSBpcyBOb25lOgorICAgICAgICAgICAgdmVyYm9zZSA9ICctdicgaW4gc3lzLmFyZ3YKKyAgICAgICAgc2VsZi5fdmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5vcHRpb25mbGFncyA9IG9wdGlvbmZsYWdzCisgICAgICAgIHNlbGYub3JpZ2luYWxfb3B0aW9uZmxhZ3MgPSBvcHRpb25mbGFncworCisgICAgICAgICMgS2VlcCB0cmFjayBvZiB0aGUgZXhhbXBsZXMgd2UndmUgcnVuLgorICAgICAgICBzZWxmLnRyaWVzID0gMAorICAgICAgICBzZWxmLmZhaWx1cmVzID0gMAorICAgICAgICBzZWxmLl9uYW1lMmZ0ID0ge30KKworICAgICAgICAjIENyZWF0ZSBhIGZha2Ugb3V0cHV0IHRhcmdldCBmb3IgY2FwdHVyaW5nIGRvY3Rlc3Qgb3V0cHV0LgorICAgICAgICBzZWxmLl9mYWtlb3V0ID0gX1Nwb29mT3V0KCkKKworICAgICMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICMgUmVwb3J0aW5nIG1ldGhvZHMKKyAgICAjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGRlZiByZXBvcnRfc3RhcnQoc2VsZiwgb3V0LCB0ZXN0LCBleGFtcGxlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlcG9ydCB0aGF0IHRoZSB0ZXN0IHJ1bm5lciBpcyBhYm91dCB0byBwcm9jZXNzIHRoZSBnaXZlbgorICAgICAgICBleGFtcGxlLiAgKE9ubHkgZGlzcGxheXMgYSBtZXNzYWdlIGlmIHZlcmJvc2U9VHJ1ZSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3ZlcmJvc2U6CisgICAgICAgICAgICBpZiBleGFtcGxlLndhbnQ6CisgICAgICAgICAgICAgICAgb3V0KCdUcnlpbmc6XG4nICsgX2luZGVudChleGFtcGxlLnNvdXJjZSkgKworICAgICAgICAgICAgICAgICAgICAnRXhwZWN0aW5nOlxuJyArIF9pbmRlbnQoZXhhbXBsZS53YW50KSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3V0KCdUcnlpbmc6XG4nICsgX2luZGVudChleGFtcGxlLnNvdXJjZSkgKworICAgICAgICAgICAgICAgICAgICAnRXhwZWN0aW5nIG5vdGhpbmdcbicpCisKKyAgICBkZWYgcmVwb3J0X3N1Y2Nlc3Moc2VsZiwgb3V0LCB0ZXN0LCBleGFtcGxlLCBnb3QpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVwb3J0IHRoYXQgdGhlIGdpdmVuIGV4YW1wbGUgcmFuIHN1Y2Nlc3NmdWxseS4gIChPbmx5CisgICAgICAgIGRpc3BsYXlzIGEgbWVzc2FnZSBpZiB2ZXJib3NlPVRydWUpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl92ZXJib3NlOgorICAgICAgICAgICAgb3V0KCJva1xuIikKKworICAgIGRlZiByZXBvcnRfZmFpbHVyZShzZWxmLCBvdXQsIHRlc3QsIGV4YW1wbGUsIGdvdCk6CisgICAgICAgICIiIgorICAgICAgICBSZXBvcnQgdGhhdCB0aGUgZ2l2ZW4gZXhhbXBsZSBmYWlsZWQuCisgICAgICAgICIiIgorICAgICAgICBvdXQoc2VsZi5fZmFpbHVyZV9oZWFkZXIodGVzdCwgZXhhbXBsZSkgKworICAgICAgICAgICAgc2VsZi5fY2hlY2tlci5vdXRwdXRfZGlmZmVyZW5jZShleGFtcGxlLCBnb3QsIHNlbGYub3B0aW9uZmxhZ3MpKQorCisgICAgZGVmIHJlcG9ydF91bmV4cGVjdGVkX2V4Y2VwdGlvbihzZWxmLCBvdXQsIHRlc3QsIGV4YW1wbGUsIGV4Y19pbmZvKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlcG9ydCB0aGF0IHRoZSBnaXZlbiBleGFtcGxlIHJhaXNlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIG91dChzZWxmLl9mYWlsdXJlX2hlYWRlcih0ZXN0LCBleGFtcGxlKSArCisgICAgICAgICAgICAnRXhjZXB0aW9uIHJhaXNlZDpcbicgKyBfaW5kZW50KF9leGNlcHRpb25fdHJhY2ViYWNrKGV4Y19pbmZvKSkpCisKKyAgICBkZWYgX2ZhaWx1cmVfaGVhZGVyKHNlbGYsIHRlc3QsIGV4YW1wbGUpOgorICAgICAgICBvdXQgPSBbc2VsZi5ESVZJREVSXQorICAgICAgICBpZiB0ZXN0LmZpbGVuYW1lOgorICAgICAgICAgICAgaWYgdGVzdC5saW5lbm8gaXMgbm90IE5vbmUgYW5kIGV4YW1wbGUubGluZW5vIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGxpbmVubyA9IHRlc3QubGluZW5vICsgZXhhbXBsZS5saW5lbm8gKyAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmVubyA9ICc/JworICAgICAgICAgICAgb3V0LmFwcGVuZCgnRmlsZSAiJXMiLCBsaW5lICVzLCBpbiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAodGVzdC5maWxlbmFtZSwgbGluZW5vLCB0ZXN0Lm5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3V0LmFwcGVuZCgnTGluZSAlcywgaW4gJXMnICUgKGV4YW1wbGUubGluZW5vKzEsIHRlc3QubmFtZSkpCisgICAgICAgIG91dC5hcHBlbmQoJ0ZhaWxlZCBleGFtcGxlOicpCisgICAgICAgIHNvdXJjZSA9IGV4YW1wbGUuc291cmNlCisgICAgICAgIG91dC5hcHBlbmQoX2luZGVudChzb3VyY2UpKQorICAgICAgICByZXR1cm4gJ1xuJy5qb2luKG91dCkKKworICAgICMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICMgRG9jVGVzdCBSdW5uaW5nCisgICAgIy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBkZWYgX19ydW4oc2VsZiwgdGVzdCwgY29tcGlsZWZsYWdzLCBvdXQpOgorICAgICAgICAiIiIKKyAgICAgICAgUnVuIHRoZSBleGFtcGxlcyBpbiBgdGVzdGAuICBXcml0ZSB0aGUgb3V0Y29tZSBvZiBlYWNoIGV4YW1wbGUKKyAgICAgICAgd2l0aCBvbmUgb2YgdGhlIGBEb2NUZXN0UnVubmVyLnJlcG9ydF8qYCBtZXRob2RzLCB1c2luZyB0aGUKKyAgICAgICAgd3JpdGVyIGZ1bmN0aW9uIGBvdXRgLiAgYGNvbXBpbGVmbGFnc2AgaXMgdGhlIHNldCBvZiBjb21waWxlcgorICAgICAgICBmbGFncyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGV4ZWN1dGUgZXhhbXBsZXMuICBSZXR1cm4gYSB0dXBsZQorICAgICAgICBgKGYsIHQpYCwgd2hlcmUgYHRgIGlzIHRoZSBudW1iZXIgb2YgZXhhbXBsZXMgdHJpZWQsIGFuZCBgZmAKKyAgICAgICAgaXMgdGhlIG51bWJlciBvZiBleGFtcGxlcyB0aGF0IGZhaWxlZC4gIFRoZSBleGFtcGxlcyBhcmUgcnVuCisgICAgICAgIGluIHRoZSBuYW1lc3BhY2UgYHRlc3QuZ2xvYnNgLgorICAgICAgICAiIiIKKyAgICAgICAgIyBLZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgZmFpbHVyZXMgYW5kIHRyaWVzLgorICAgICAgICBmYWlsdXJlcyA9IHRyaWVzID0gMAorCisgICAgICAgICMgU2F2ZSB0aGUgb3B0aW9uIGZsYWdzIChzaW5jZSBvcHRpb24gZGlyZWN0aXZlcyBjYW4gYmUgdXNlZAorICAgICAgICAjIHRvIG1vZGlmeSB0aGVtKS4KKyAgICAgICAgb3JpZ2luYWxfb3B0aW9uZmxhZ3MgPSBzZWxmLm9wdGlvbmZsYWdzCisKKyAgICAgICAgU1VDQ0VTUywgRkFJTFVSRSwgQk9PTSA9IHJhbmdlKDMpICMgYG91dGNvbWVgIHN0YXRlCisKKyAgICAgICAgY2hlY2sgPSBzZWxmLl9jaGVja2VyLmNoZWNrX291dHB1dAorCisgICAgICAgICMgUHJvY2VzcyBlYWNoIGV4YW1wbGUuCisgICAgICAgIGZvciBleGFtcGxlbnVtLCBleGFtcGxlIGluIGVudW1lcmF0ZSh0ZXN0LmV4YW1wbGVzKToKKworICAgICAgICAgICAgIyBJZiBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFIGlzIHNldCwgdGhlbiBzdXBwcmVzcworICAgICAgICAgICAgIyByZXBvcnRpbmcgYWZ0ZXIgdGhlIGZpcnN0IGZhaWx1cmUuCisgICAgICAgICAgICBxdWlldCA9IChzZWxmLm9wdGlvbmZsYWdzICYgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzID4gMCkKKworICAgICAgICAgICAgIyBNZXJnZSBpbiB0aGUgZXhhbXBsZSdzIG9wdGlvbnMuCisgICAgICAgICAgICBzZWxmLm9wdGlvbmZsYWdzID0gb3JpZ2luYWxfb3B0aW9uZmxhZ3MKKyAgICAgICAgICAgIGlmIGV4YW1wbGUub3B0aW9uczoKKyAgICAgICAgICAgICAgICBmb3IgKG9wdGlvbmZsYWcsIHZhbCkgaW4gZXhhbXBsZS5vcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIHZhbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uZmxhZ3MgfD0gb3B0aW9uZmxhZworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vcHRpb25mbGFncyAmPSB+b3B0aW9uZmxhZworCisgICAgICAgICAgICAjIElmICdTS0lQJyBpcyBzZXQsIHRoZW4gc2tpcCB0aGlzIGV4YW1wbGUuCisgICAgICAgICAgICBpZiBzZWxmLm9wdGlvbmZsYWdzICYgU0tJUDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAjIFJlY29yZCB0aGF0IHdlIHN0YXJ0ZWQgdGhpcyBleGFtcGxlLgorICAgICAgICAgICAgdHJpZXMgKz0gMQorICAgICAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0X3N0YXJ0KG91dCwgdGVzdCwgZXhhbXBsZSkKKworICAgICAgICAgICAgIyBVc2UgYSBzcGVjaWFsIGZpbGVuYW1lIGZvciBjb21waWxlKCksIHNvIHdlIGNhbiByZXRyaWV2ZQorICAgICAgICAgICAgIyB0aGUgc291cmNlIGNvZGUgZHVyaW5nIGludGVyYWN0aXZlIGRlYnVnZ2luZyAoc2VlCisgICAgICAgICAgICAjIF9fcGF0Y2hlZF9saW5lY2FjaGVfZ2V0bGluZXMpLgorICAgICAgICAgICAgZmlsZW5hbWUgPSAnPGRvY3Rlc3QgJXNbJWRdPicgJSAodGVzdC5uYW1lLCBleGFtcGxlbnVtKQorCisgICAgICAgICAgICAjIFJ1biB0aGUgZXhhbXBsZSBpbiB0aGUgZ2l2ZW4gY29udGV4dCAoZ2xvYnMpLCBhbmQgcmVjb3JkCisgICAgICAgICAgICAjIGFueSBleGNlcHRpb24gdGhhdCBnZXRzIHJhaXNlZC4gIChCdXQgZG9uJ3QgaW50ZXJjZXB0CisgICAgICAgICAgICAjIGtleWJvYXJkIGludGVycnVwdHMuKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgRG9uJ3QgYmxpbmshICBUaGlzIGlzIHdoZXJlIHRoZSB1c2VyJ3MgY29kZSBnZXRzIHJ1bi4KKyAgICAgICAgICAgICAgICBleGVjIGNvbXBpbGUoZXhhbXBsZS5zb3VyY2UsIGZpbGVuYW1lLCAic2luZ2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWZsYWdzLCAxKSBpbiB0ZXN0Lmdsb2JzCisgICAgICAgICAgICAgICAgc2VsZi5kZWJ1Z2dlci5zZXRfY29udGludWUoKSAjID09PT0gRXhhbXBsZSBGaW5pc2hlZCA9PT09CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gTm9uZQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRlYnVnZ2VyLnNldF9jb250aW51ZSgpICMgPT09PSBFeGFtcGxlIEZpbmlzaGVkID09PT0KKworICAgICAgICAgICAgZ290ID0gc2VsZi5fZmFrZW91dC5nZXR2YWx1ZSgpICAjIHRoZSBhY3R1YWwgb3V0cHV0CisgICAgICAgICAgICBzZWxmLl9mYWtlb3V0LnRydW5jYXRlKDApCisgICAgICAgICAgICBvdXRjb21lID0gRkFJTFVSRSAgICMgZ3VpbHR5IHVudGlsIHByb3ZlZCBpbm5vY2VudCBvciBpbnNhbmUKKworICAgICAgICAgICAgIyBJZiB0aGUgZXhhbXBsZSBleGVjdXRlZCB3aXRob3V0IHJhaXNpbmcgYW55IGV4Y2VwdGlvbnMsCisgICAgICAgICAgICAjIHZlcmlmeSBpdHMgb3V0cHV0LgorICAgICAgICAgICAgaWYgZXhjZXB0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgY2hlY2soZXhhbXBsZS53YW50LCBnb3QsIHNlbGYub3B0aW9uZmxhZ3MpOgorICAgICAgICAgICAgICAgICAgICBvdXRjb21lID0gU1VDQ0VTUworCisgICAgICAgICAgICAjIFRoZSBleGFtcGxlIHJhaXNlZCBhbiBleGNlcHRpb246ICBjaGVjayBpZiBpdCB3YXMgZXhwZWN0ZWQuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICBleGNfbXNnID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seSgqZXhjX2luZm9bOjJdKVstMV0KKyAgICAgICAgICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICAgICAgICAgIGdvdCArPSBfZXhjZXB0aW9uX3RyYWNlYmFjayhleGNfaW5mbykKKworICAgICAgICAgICAgICAgICMgSWYgYGV4YW1wbGUuZXhjX21zZ2AgaXMgTm9uZSwgdGhlbiB3ZSB3ZXJlbid0IGV4cGVjdGluZworICAgICAgICAgICAgICAgICMgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgIGlmIGV4YW1wbGUuZXhjX21zZyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBvdXRjb21lID0gQk9PTQorCisgICAgICAgICAgICAgICAgIyBXZSBleHBlY3RlZCBhbiBleGNlcHRpb246ICBzZWUgd2hldGhlciBpdCBtYXRjaGVzLgorICAgICAgICAgICAgICAgIGVsaWYgY2hlY2soZXhhbXBsZS5leGNfbXNnLCBleGNfbXNnLCBzZWxmLm9wdGlvbmZsYWdzKToKKyAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9IFNVQ0NFU1MKKworICAgICAgICAgICAgICAgICMgQW5vdGhlciBjaGFuY2UgaWYgdGhleSBkaWRuJ3QgY2FyZSBhYm91dCB0aGUgZGV0YWlsLgorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5vcHRpb25mbGFncyAmIElHTk9SRV9FWENFUFRJT05fREVUQUlMOgorICAgICAgICAgICAgICAgICAgICBtMSA9IHJlLm1hdGNoKHInKD86W146XSpcLik/KFteOl0qOiknLCBleGFtcGxlLmV4Y19tc2cpCisgICAgICAgICAgICAgICAgICAgIG0yID0gcmUubWF0Y2gocicoPzpbXjpdKlwuKT8oW146XSo6KScsIGV4Y19tc2cpCisgICAgICAgICAgICAgICAgICAgIGlmIG0xIGFuZCBtMiBhbmQgY2hlY2sobTEuZ3JvdXAoMSksIG0yLmdyb3VwKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uZmxhZ3MpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29tZSA9IFNVQ0NFU1MKKworICAgICAgICAgICAgIyBSZXBvcnQgdGhlIG91dGNvbWUuCisgICAgICAgICAgICBpZiBvdXRjb21lIGlzIFNVQ0NFU1M6CisgICAgICAgICAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydF9zdWNjZXNzKG91dCwgdGVzdCwgZXhhbXBsZSwgZ290KQorICAgICAgICAgICAgZWxpZiBvdXRjb21lIGlzIEZBSUxVUkU6CisgICAgICAgICAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydF9mYWlsdXJlKG91dCwgdGVzdCwgZXhhbXBsZSwgZ290KQorICAgICAgICAgICAgICAgIGZhaWx1cmVzICs9IDEKKyAgICAgICAgICAgIGVsaWYgb3V0Y29tZSBpcyBCT09NOgorICAgICAgICAgICAgICAgIGlmIG5vdCBxdWlldDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvcnRfdW5leHBlY3RlZF9leGNlcHRpb24ob3V0LCB0ZXN0LCBleGFtcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfaW5mbykKKyAgICAgICAgICAgICAgICBmYWlsdXJlcyArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgKCJ1bmtub3duIG91dGNvbWUiLCBvdXRjb21lKQorCisgICAgICAgICMgUmVzdG9yZSB0aGUgb3B0aW9uIGZsYWdzIChpbiBjYXNlIHRoZXkgd2VyZSBtb2RpZmllZCkKKyAgICAgICAgc2VsZi5vcHRpb25mbGFncyA9IG9yaWdpbmFsX29wdGlvbmZsYWdzCisKKyAgICAgICAgIyBSZWNvcmQgYW5kIHJldHVybiB0aGUgbnVtYmVyIG9mIGZhaWx1cmVzIGFuZCB0cmllcy4KKyAgICAgICAgc2VsZi5fX3JlY29yZF9vdXRjb21lKHRlc3QsIGZhaWx1cmVzLCB0cmllcykKKyAgICAgICAgcmV0dXJuIFRlc3RSZXN1bHRzKGZhaWx1cmVzLCB0cmllcykKKworICAgIGRlZiBfX3JlY29yZF9vdXRjb21lKHNlbGYsIHRlc3QsIGYsIHQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVjb3JkIHRoZSBmYWN0IHRoYXQgdGhlIGdpdmVuIERvY1Rlc3QgKGB0ZXN0YCkgZ2VuZXJhdGVkIGBmYAorICAgICAgICBmYWlsdXJlcyBvdXQgb2YgYHRgIHRyaWVkIGV4YW1wbGVzLgorICAgICAgICAiIiIKKyAgICAgICAgZjIsIHQyID0gc2VsZi5fbmFtZTJmdC5nZXQodGVzdC5uYW1lLCAoMCwwKSkKKyAgICAgICAgc2VsZi5fbmFtZTJmdFt0ZXN0Lm5hbWVdID0gKGYrZjIsIHQrdDIpCisgICAgICAgIHNlbGYuZmFpbHVyZXMgKz0gZgorICAgICAgICBzZWxmLnRyaWVzICs9IHQKKworICAgIF9fTElORUNBQ0hFX0ZJTEVOQU1FX1JFID0gcmUuY29tcGlsZShyJzxkb2N0ZXN0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoP1A8bmFtZT4uKyknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXFsoP1A8ZXhhbXBsZW51bT5cZCspXF0+JCcpCisgICAgZGVmIF9fcGF0Y2hlZF9saW5lY2FjaGVfZ2V0bGluZXMoc2VsZiwgZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgICAgICBtID0gc2VsZi5fX0xJTkVDQUNIRV9GSUxFTkFNRV9SRS5tYXRjaChmaWxlbmFtZSkKKyAgICAgICAgaWYgbSBhbmQgbS5ncm91cCgnbmFtZScpID09IHNlbGYudGVzdC5uYW1lOgorICAgICAgICAgICAgZXhhbXBsZSA9IHNlbGYudGVzdC5leGFtcGxlc1tpbnQobS5ncm91cCgnZXhhbXBsZW51bScpKV0KKyAgICAgICAgICAgIHNvdXJjZSA9IGV4YW1wbGUuc291cmNlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNvdXJjZSwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgc291cmNlID0gc291cmNlLmVuY29kZSgnYXNjaWknLCAnYmFja3NsYXNocmVwbGFjZScpCisgICAgICAgICAgICByZXR1cm4gc291cmNlLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNhdmVfbGluZWNhY2hlX2dldGxpbmVzKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKKworICAgIGRlZiBydW4oc2VsZiwgdGVzdCwgY29tcGlsZWZsYWdzPU5vbmUsIG91dD1Ob25lLCBjbGVhcl9nbG9icz1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJ1biB0aGUgZXhhbXBsZXMgaW4gYHRlc3RgLCBhbmQgZGlzcGxheSB0aGUgcmVzdWx0cyB1c2luZyB0aGUKKyAgICAgICAgd3JpdGVyIGZ1bmN0aW9uIGBvdXRgLgorCisgICAgICAgIFRoZSBleGFtcGxlcyBhcmUgcnVuIGluIHRoZSBuYW1lc3BhY2UgYHRlc3QuZ2xvYnNgLiAgSWYKKyAgICAgICAgYGNsZWFyX2dsb2JzYCBpcyB0cnVlICh0aGUgZGVmYXVsdCksIHRoZW4gdGhpcyBuYW1lc3BhY2Ugd2lsbAorICAgICAgICBiZSBjbGVhcmVkIGFmdGVyIHRoZSB0ZXN0IHJ1bnMsIHRvIGhlbHAgd2l0aCBnYXJiYWdlCisgICAgICAgIGNvbGxlY3Rpb24uICBJZiB5b3Ugd291bGQgbGlrZSB0byBleGFtaW5lIHRoZSBuYW1lc3BhY2UgYWZ0ZXIKKyAgICAgICAgdGhlIHRlc3QgY29tcGxldGVzLCB0aGVuIHVzZSBgY2xlYXJfZ2xvYnM9RmFsc2VgLgorCisgICAgICAgIGBjb21waWxlZmxhZ3NgIGdpdmVzIHRoZSBzZXQgb2YgZmxhZ3MgdGhhdCBzaG91bGQgYmUgdXNlZCBieQorICAgICAgICB0aGUgUHl0aG9uIGNvbXBpbGVyIHdoZW4gcnVubmluZyB0aGUgZXhhbXBsZXMuICBJZiBub3QKKyAgICAgICAgc3BlY2lmaWVkLCB0aGVuIGl0IHdpbGwgZGVmYXVsdCB0byB0aGUgc2V0IG9mIGZ1dHVyZS1pbXBvcnQKKyAgICAgICAgZmxhZ3MgdGhhdCBhcHBseSB0byBgZ2xvYnNgLgorCisgICAgICAgIFRoZSBvdXRwdXQgb2YgZWFjaCBleGFtcGxlIGlzIGNoZWNrZWQgdXNpbmcKKyAgICAgICAgYERvY1Rlc3RSdW5uZXIuY2hlY2tfb3V0cHV0YCwgYW5kIHRoZSByZXN1bHRzIGFyZSBmb3JtYXR0ZWQgYnkKKyAgICAgICAgdGhlIGBEb2NUZXN0UnVubmVyLnJlcG9ydF8qYCBtZXRob2RzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50ZXN0ID0gdGVzdAorCisgICAgICAgIGlmIGNvbXBpbGVmbGFncyBpcyBOb25lOgorICAgICAgICAgICAgY29tcGlsZWZsYWdzID0gX2V4dHJhY3RfZnV0dXJlX2ZsYWdzKHRlc3QuZ2xvYnMpCisKKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGlmIG91dCBpcyBOb25lOgorICAgICAgICAgICAgb3V0ID0gc2F2ZV9zdGRvdXQud3JpdGUKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuX2Zha2VvdXQKKworICAgICAgICAjIFBhdGNoIHBkYi5zZXRfdHJhY2UgdG8gcmVzdG9yZSBzeXMuc3Rkb3V0IGR1cmluZyBpbnRlcmFjdGl2ZQorICAgICAgICAjIGRlYnVnZ2luZyAoc28gaXQncyBub3Qgc3RpbGwgcmVkaXJlY3RlZCB0byBzZWxmLl9mYWtlb3V0KS4KKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlIGludGVyYWN0aXZlIG91dHB1dCB3aWxsIGdvIHRvICpvdXIqCisgICAgICAgICMgc2F2ZV9zdGRvdXQsIGV2ZW4gaWYgdGhhdCdzIG5vdCB0aGUgcmVhbCBzeXMuc3Rkb3V0OyB0aGlzCisgICAgICAgICMgYWxsb3dzIHVzIHRvIHdyaXRlIHRlc3QgY2FzZXMgZm9yIHRoZSBzZXRfdHJhY2UgYmVoYXZpb3IuCisgICAgICAgIHNhdmVfc2V0X3RyYWNlID0gcGRiLnNldF90cmFjZQorICAgICAgICBzZWxmLmRlYnVnZ2VyID0gX091dHB1dFJlZGlyZWN0aW5nUGRiKHNhdmVfc3Rkb3V0KQorICAgICAgICBzZWxmLmRlYnVnZ2VyLnJlc2V0KCkKKyAgICAgICAgcGRiLnNldF90cmFjZSA9IHNlbGYuZGVidWdnZXIuc2V0X3RyYWNlCisKKyAgICAgICAgIyBQYXRjaCBsaW5lY2FjaGUuZ2V0bGluZXMsIHNvIHdlIGNhbiBzZWUgdGhlIGV4YW1wbGUncyBzb3VyY2UKKyAgICAgICAgIyB3aGVuIHdlJ3JlIGluc2lkZSB0aGUgZGVidWdnZXIuCisgICAgICAgIHNlbGYuc2F2ZV9saW5lY2FjaGVfZ2V0bGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMKKyAgICAgICAgbGluZWNhY2hlLmdldGxpbmVzID0gc2VsZi5fX3BhdGNoZWRfbGluZWNhY2hlX2dldGxpbmVzCisKKyAgICAgICAgIyBNYWtlIHN1cmUgc3lzLmRpc3BsYXlob29rIGp1c3QgcHJpbnRzIHRoZSB2YWx1ZSB0byBzdGRvdXQKKyAgICAgICAgc2F2ZV9kaXNwbGF5aG9vayA9IHN5cy5kaXNwbGF5aG9vaworICAgICAgICBzeXMuZGlzcGxheWhvb2sgPSBzeXMuX19kaXNwbGF5aG9va19fCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19ydW4odGVzdCwgY29tcGlsZWZsYWdzLCBvdXQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKKyAgICAgICAgICAgIHBkYi5zZXRfdHJhY2UgPSBzYXZlX3NldF90cmFjZQorICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmVzID0gc2VsZi5zYXZlX2xpbmVjYWNoZV9nZXRsaW5lcworICAgICAgICAgICAgc3lzLmRpc3BsYXlob29rID0gc2F2ZV9kaXNwbGF5aG9vaworICAgICAgICAgICAgaWYgY2xlYXJfZ2xvYnM6CisgICAgICAgICAgICAgICAgdGVzdC5nbG9icy5jbGVhcigpCisKKyAgICAjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAjIFN1bW1hcml6YXRpb24KKyAgICAjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBkZWYgc3VtbWFyaXplKHNlbGYsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBQcmludCBhIHN1bW1hcnkgb2YgYWxsIHRoZSB0ZXN0IGNhc2VzIHRoYXQgaGF2ZSBiZWVuIHJ1biBieQorICAgICAgICB0aGlzIERvY1Rlc3RSdW5uZXIsIGFuZCByZXR1cm4gYSB0dXBsZSBgKGYsIHQpYCwgd2hlcmUgYGZgIGlzCisgICAgICAgIHRoZSB0b3RhbCBudW1iZXIgb2YgZmFpbGVkIGV4YW1wbGVzLCBhbmQgYHRgIGlzIHRoZSB0b3RhbAorICAgICAgICBudW1iZXIgb2YgdHJpZWQgZXhhbXBsZXMuCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIGB2ZXJib3NlYCBhcmd1bWVudCBjb250cm9scyBob3cgZGV0YWlsZWQgdGhlCisgICAgICAgIHN1bW1hcnkgaXMuICBJZiB0aGUgdmVyYm9zaXR5IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlCisgICAgICAgIERvY1Rlc3RSdW5uZXIncyB2ZXJib3NpdHkgaXMgdXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHZlcmJvc2UgaXMgTm9uZToKKyAgICAgICAgICAgIHZlcmJvc2UgPSBzZWxmLl92ZXJib3NlCisgICAgICAgIG5vdGVzdHMgPSBbXQorICAgICAgICBwYXNzZWQgPSBbXQorICAgICAgICBmYWlsZWQgPSBbXQorICAgICAgICB0b3RhbHQgPSB0b3RhbGYgPSAwCisgICAgICAgIGZvciB4IGluIHNlbGYuX25hbWUyZnQuaXRlbXMoKToKKyAgICAgICAgICAgIG5hbWUsIChmLCB0KSA9IHgKKyAgICAgICAgICAgIGFzc2VydCBmIDw9IHQKKyAgICAgICAgICAgIHRvdGFsdCArPSB0CisgICAgICAgICAgICB0b3RhbGYgKz0gZgorICAgICAgICAgICAgaWYgdCA9PSAwOgorICAgICAgICAgICAgICAgIG5vdGVzdHMuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICBlbGlmIGYgPT0gMDoKKyAgICAgICAgICAgICAgICBwYXNzZWQuYXBwZW5kKCAobmFtZSwgdCkgKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmYWlsZWQuYXBwZW5kKHgpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBpZiBub3Rlc3RzOgorICAgICAgICAgICAgICAgIHByaW50IGxlbihub3Rlc3RzKSwgIml0ZW1zIGhhZCBubyB0ZXN0czoiCisgICAgICAgICAgICAgICAgbm90ZXN0cy5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb3IgdGhpbmcgaW4gbm90ZXN0czoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiAgICIsIHRoaW5nCisgICAgICAgICAgICBpZiBwYXNzZWQ6CisgICAgICAgICAgICAgICAgcHJpbnQgbGVuKHBhc3NlZCksICJpdGVtcyBwYXNzZWQgYWxsIHRlc3RzOiIKKyAgICAgICAgICAgICAgICBwYXNzZWQuc29ydCgpCisgICAgICAgICAgICAgICAgZm9yIHRoaW5nLCBjb3VudCBpbiBwYXNzZWQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgJTNkIHRlc3RzIGluICVzIiAlIChjb3VudCwgdGhpbmcpCisgICAgICAgIGlmIGZhaWxlZDoKKyAgICAgICAgICAgIHByaW50IHNlbGYuRElWSURFUgorICAgICAgICAgICAgcHJpbnQgbGVuKGZhaWxlZCksICJpdGVtcyBoYWQgZmFpbHVyZXM6IgorICAgICAgICAgICAgZmFpbGVkLnNvcnQoKQorICAgICAgICAgICAgZm9yIHRoaW5nLCAoZiwgdCkgaW4gZmFpbGVkOgorICAgICAgICAgICAgICAgIHByaW50ICIgJTNkIG9mICUzZCBpbiAlcyIgJSAoZiwgdCwgdGhpbmcpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCB0b3RhbHQsICJ0ZXN0cyBpbiIsIGxlbihzZWxmLl9uYW1lMmZ0KSwgIml0ZW1zLiIKKyAgICAgICAgICAgIHByaW50IHRvdGFsdCAtIHRvdGFsZiwgInBhc3NlZCBhbmQiLCB0b3RhbGYsICJmYWlsZWQuIgorICAgICAgICBpZiB0b3RhbGY6CisgICAgICAgICAgICBwcmludCAiKioqVGVzdCBGYWlsZWQqKioiLCB0b3RhbGYsICJmYWlsdXJlcy4iCisgICAgICAgIGVsaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJUZXN0IHBhc3NlZC4iCisgICAgICAgIHJldHVybiBUZXN0UmVzdWx0cyh0b3RhbGYsIHRvdGFsdCkKKworICAgICMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBjcnVmdCB0byBtYWludGFpbiBkb2N0ZXN0Lm1hc3Rlci4KKyAgICAjLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBkZWYgbWVyZ2Uoc2VsZiwgb3RoZXIpOgorICAgICAgICBkID0gc2VsZi5fbmFtZTJmdAorICAgICAgICBmb3IgbmFtZSwgKGYsIHQpIGluIG90aGVyLl9uYW1lMmZ0Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lIGluIGQ6CisgICAgICAgICAgICAgICAgIyBEb24ndCBwcmludCBoZXJlIGJ5IGRlZmF1bHQsIHNpbmNlIGRvaW5nCisgICAgICAgICAgICAgICAgIyAgICAgc28gYnJlYWtzIHNvbWUgb2YgdGhlIGJ1aWxkYm90cworICAgICAgICAgICAgICAgICNwcmludCAiKioqIERvY1Rlc3RSdW5uZXIubWVyZ2U6ICciICsgbmFtZSArICInIGluIGJvdGgiIFwKKyAgICAgICAgICAgICAgICAjICAgICIgdGVzdGVyczsgc3VtbWluZyBvdXRjb21lcy4iCisgICAgICAgICAgICAgICAgZjIsIHQyID0gZFtuYW1lXQorICAgICAgICAgICAgICAgIGYgPSBmICsgZjIKKyAgICAgICAgICAgICAgICB0ID0gdCArIHQyCisgICAgICAgICAgICBkW25hbWVdID0gZiwgdAorCitjbGFzcyBPdXRwdXRDaGVja2VyOgorICAgICIiIgorICAgIEEgY2xhc3MgdXNlZCB0byBjaGVjayB0aGUgd2hldGhlciB0aGUgYWN0dWFsIG91dHB1dCBmcm9tIGEgZG9jdGVzdAorICAgIGV4YW1wbGUgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgb3V0cHV0LiAgYE91dHB1dENoZWNrZXJgIGRlZmluZXMgdHdvCisgICAgbWV0aG9kczogYGNoZWNrX291dHB1dGAsIHdoaWNoIGNvbXBhcmVzIGEgZ2l2ZW4gcGFpciBvZiBvdXRwdXRzLAorICAgIGFuZCByZXR1cm5zIHRydWUgaWYgdGhleSBtYXRjaDsgYW5kIGBvdXRwdXRfZGlmZmVyZW5jZWAsIHdoaWNoCisgICAgcmV0dXJucyBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBvdXRwdXRzLgorICAgICIiIgorICAgIGRlZiBjaGVja19vdXRwdXQoc2VsZiwgd2FudCwgZ290LCBvcHRpb25mbGFncyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gVHJ1ZSBpZmYgdGhlIGFjdHVhbCBvdXRwdXQgZnJvbSBhbiBleGFtcGxlIChgZ290YCkKKyAgICAgICAgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgb3V0cHV0IChgd2FudGApLiAgVGhlc2Ugc3RyaW5ncyBhcmUKKyAgICAgICAgYWx3YXlzIGNvbnNpZGVyZWQgdG8gbWF0Y2ggaWYgdGhleSBhcmUgaWRlbnRpY2FsOyBidXQKKyAgICAgICAgZGVwZW5kaW5nIG9uIHdoYXQgb3B0aW9uIGZsYWdzIHRoZSB0ZXN0IHJ1bm5lciBpcyB1c2luZywKKyAgICAgICAgc2V2ZXJhbCBub24tZXhhY3QgbWF0Y2ggdHlwZXMgYXJlIGFsc28gcG9zc2libGUuICBTZWUgdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIGBUZXN0UnVubmVyYCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAgICBvcHRpb24gZmxhZ3MuCisgICAgICAgICIiIgorICAgICAgICAjIEhhbmRsZSB0aGUgY29tbW9uIGNhc2UgZmlyc3QsIGZvciBlZmZpY2llbmN5OgorICAgICAgICAjIGlmIHRoZXkncmUgc3RyaW5nLWlkZW50aWNhbCwgYWx3YXlzIHJldHVybiB0cnVlLgorICAgICAgICBpZiBnb3QgPT0gd2FudDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBUaGUgdmFsdWVzIFRydWUgYW5kIEZhbHNlIHJlcGxhY2VkIDEgYW5kIDAgYXMgdGhlIHJldHVybgorICAgICAgICAjIHZhbHVlIGZvciBib29sZWFuIGNvbXBhcmlzb25zIGluIFB5dGhvbiAyLjMuCisgICAgICAgIGlmIG5vdCAob3B0aW9uZmxhZ3MgJiBET05UX0FDQ0VQVF9UUlVFX0ZPUl8xKToKKyAgICAgICAgICAgIGlmIChnb3Qsd2FudCkgPT0gKCJUcnVlXG4iLCAiMVxuIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGlmIChnb3Qsd2FudCkgPT0gKCJGYWxzZVxuIiwgIjBcbiIpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyA8QkxBTktMSU5FPiBjYW4gYmUgdXNlZCBhcyBhIHNwZWNpYWwgc2VxdWVuY2UgdG8gc2lnbmlmeSBhCisgICAgICAgICMgYmxhbmsgbGluZSwgdW5sZXNzIHRoZSBET05UX0FDQ0VQVF9CTEFOS0xJTkUgZmxhZyBpcyB1c2VkLgorICAgICAgICBpZiBub3QgKG9wdGlvbmZsYWdzICYgRE9OVF9BQ0NFUFRfQkxBTktMSU5FKToKKyAgICAgICAgICAgICMgUmVwbGFjZSA8QkxBTktMSU5FPiBpbiB3YW50IHdpdGggYSBibGFuayBsaW5lLgorICAgICAgICAgICAgd2FudCA9IHJlLnN1YignKD9tKV4lc1xzKj8kJyAlIHJlLmVzY2FwZShCTEFOS0xJTkVfTUFSS0VSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJycsIHdhbnQpCisgICAgICAgICAgICAjIElmIGEgbGluZSBpbiBnb3QgY29udGFpbnMgb25seSBzcGFjZXMsIHRoZW4gcmVtb3ZlIHRoZQorICAgICAgICAgICAgIyBzcGFjZXMuCisgICAgICAgICAgICBnb3QgPSByZS5zdWIoJyg/bSleXHMqPyQnLCAnJywgZ290KQorICAgICAgICAgICAgaWYgZ290ID09IHdhbnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAjIFRoaXMgZmxhZyBjYXVzZXMgZG9jdGVzdCB0byBpZ25vcmUgYW55IGRpZmZlcmVuY2VzIGluIHRoZQorICAgICAgICAjIGNvbnRlbnRzIG9mIHdoaXRlc3BhY2Ugc3RyaW5ncy4gIE5vdGUgdGhhdCB0aGlzIGNhbiBiZSB1c2VkCisgICAgICAgICMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgRUxMSVBTSVMgZmxhZy4KKyAgICAgICAgaWYgb3B0aW9uZmxhZ3MgJiBOT1JNQUxJWkVfV0hJVEVTUEFDRToKKyAgICAgICAgICAgIGdvdCA9ICcgJy5qb2luKGdvdC5zcGxpdCgpKQorICAgICAgICAgICAgd2FudCA9ICcgJy5qb2luKHdhbnQuc3BsaXQoKSkKKyAgICAgICAgICAgIGlmIGdvdCA9PSB3YW50OgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBUaGUgRUxMSVBTSVMgZmxhZyBzYXlzIHRvIGxldCB0aGUgc2VxdWVuY2UgIi4uLiIgaW4gYHdhbnRgCisgICAgICAgICMgbWF0Y2ggYW55IHN1YnN0cmluZyBpbiBgZ290YC4KKyAgICAgICAgaWYgb3B0aW9uZmxhZ3MgJiBFTExJUFNJUzoKKyAgICAgICAgICAgIGlmIF9lbGxpcHNpc19tYXRjaCh3YW50LCBnb3QpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgIyBXZSBkaWRuJ3QgZmluZCBhbnkgbWF0Y2g7IHJldHVybiBmYWxzZS4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIFNob3VsZCB3ZSBkbyBhIGZhbmN5IGRpZmY/CisgICAgZGVmIF9kb19hX2ZhbmN5X2RpZmYoc2VsZiwgd2FudCwgZ290LCBvcHRpb25mbGFncyk6CisgICAgICAgICMgTm90IHVubGVzcyB0aGV5IGFza2VkIGZvciBhIGZhbmN5IGRpZmYuCisgICAgICAgIGlmIG5vdCBvcHRpb25mbGFncyAmIChSRVBPUlRfVURJRkYgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQT1JUX0NESUZGIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFUE9SVF9ORElGRik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIElmIGV4cGVjdGVkIG91dHB1dCB1c2VzIGVsbGlwc2lzLCBhIG1lYW5pbmdmdWwgZmFuY3kgZGlmZiBpcworICAgICAgICAjIHRvbyBoYXJkIC4uLiBvciBtYXliZSBub3QuICBJbiB0d28gcmVhbC1saWZlIGZhaWx1cmVzIFRpbSBzYXcsCisgICAgICAgICMgYSBkaWZmIHdhcyBhIG1ham9yIGhlbHAgYW55d2F5LCBzbyB0aGlzIGlzIGNvbW1lbnRlZCBvdXQuCisgICAgICAgICMgW3RvZG9dIF9lbGxpcHNpc19tYXRjaCgpIGtub3dzIHdoaWNoIHBpZWNlcyBkbyBhbmQgZG9uJ3QgbWF0Y2gsCisgICAgICAgICMgYW5kIGNvdWxkIGJlIHRoZSBiYXNpcyBmb3IgYSBraWNrLWFzcyBkaWZmIGluIHRoaXMgY2FzZS4KKyAgICAgICAgIyNpZiBvcHRpb25mbGFncyAmIEVMTElQU0lTIGFuZCBFTExJUFNJU19NQVJLRVIgaW4gd2FudDoKKyAgICAgICAgIyMgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBuZGlmZiBkb2VzIGludHJhbGluZSBkaWZmZXJlbmNlIG1hcmtpbmcsIHNvIGNhbiBiZSB1c2VmdWwgZXZlbgorICAgICAgICAjIGZvciAxLWxpbmUgZGlmZmVyZW5jZXMuCisgICAgICAgIGlmIG9wdGlvbmZsYWdzICYgUkVQT1JUX05ESUZGOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICAjIFRoZSBvdGhlciBkaWZmIHR5cGVzIG5lZWQgYXQgbGVhc3QgYSBmZXcgbGluZXMgdG8gYmUgaGVscGZ1bC4KKyAgICAgICAgcmV0dXJuIHdhbnQuY291bnQoJ1xuJykgPiAyIGFuZCBnb3QuY291bnQoJ1xuJykgPiAyCisKKyAgICBkZWYgb3V0cHV0X2RpZmZlcmVuY2Uoc2VsZiwgZXhhbXBsZSwgZ290LCBvcHRpb25mbGFncyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUKKyAgICAgICAgZXhwZWN0ZWQgb3V0cHV0IGZvciBhIGdpdmVuIGV4YW1wbGUgKGBleGFtcGxlYCkgYW5kIHRoZSBhY3R1YWwKKyAgICAgICAgb3V0cHV0IChgZ290YCkuICBgb3B0aW9uZmxhZ3NgIGlzIHRoZSBzZXQgb2Ygb3B0aW9uIGZsYWdzIHVzZWQKKyAgICAgICAgdG8gY29tcGFyZSBgd2FudGAgYW5kIGBnb3RgLgorICAgICAgICAiIiIKKyAgICAgICAgd2FudCA9IGV4YW1wbGUud2FudAorICAgICAgICAjIElmIDxCTEFOS0xJTkU+cyBhcmUgYmVpbmcgdXNlZCwgdGhlbiByZXBsYWNlIGJsYW5rIGxpbmVzCisgICAgICAgICMgd2l0aCA8QkxBTktMSU5FPiBpbiB0aGUgYWN0dWFsIG91dHB1dCBzdHJpbmcuCisgICAgICAgIGlmIG5vdCAob3B0aW9uZmxhZ3MgJiBET05UX0FDQ0VQVF9CTEFOS0xJTkUpOgorICAgICAgICAgICAgZ290ID0gcmUuc3ViKCcoP20pXlsgXSooPz1cbiknLCBCTEFOS0xJTkVfTUFSS0VSLCBnb3QpCisKKyAgICAgICAgIyBDaGVjayBpZiB3ZSBzaG91bGQgdXNlIGRpZmYuCisgICAgICAgIGlmIHNlbGYuX2RvX2FfZmFuY3lfZGlmZih3YW50LCBnb3QsIG9wdGlvbmZsYWdzKToKKyAgICAgICAgICAgICMgU3BsaXQgd2FudCAmIGdvdCBpbnRvIGxpbmVzLgorICAgICAgICAgICAgd2FudF9saW5lcyA9IHdhbnQuc3BsaXRsaW5lcyhUcnVlKSAgIyBUcnVlID09IGtlZXAgbGluZSBlbmRzCisgICAgICAgICAgICBnb3RfbGluZXMgPSBnb3Quc3BsaXRsaW5lcyhUcnVlKQorICAgICAgICAgICAgIyBVc2UgZGlmZmxpYiB0byBmaW5kIHRoZWlyIGRpZmZlcmVuY2VzLgorICAgICAgICAgICAgaWYgb3B0aW9uZmxhZ3MgJiBSRVBPUlRfVURJRkY6CisgICAgICAgICAgICAgICAgZGlmZiA9IGRpZmZsaWIudW5pZmllZF9kaWZmKHdhbnRfbGluZXMsIGdvdF9saW5lcywgbj0yKQorICAgICAgICAgICAgICAgIGRpZmYgPSBsaXN0KGRpZmYpWzI6XSAjIHN0cmlwIHRoZSBkaWZmIGhlYWRlcgorICAgICAgICAgICAgICAgIGtpbmQgPSAndW5pZmllZCBkaWZmIHdpdGggLWV4cGVjdGVkICthY3R1YWwnCisgICAgICAgICAgICBlbGlmIG9wdGlvbmZsYWdzICYgUkVQT1JUX0NESUZGOgorICAgICAgICAgICAgICAgIGRpZmYgPSBkaWZmbGliLmNvbnRleHRfZGlmZih3YW50X2xpbmVzLCBnb3RfbGluZXMsIG49MikKKyAgICAgICAgICAgICAgICBkaWZmID0gbGlzdChkaWZmKVsyOl0gIyBzdHJpcCB0aGUgZGlmZiBoZWFkZXIKKyAgICAgICAgICAgICAgICBraW5kID0gJ2NvbnRleHQgZGlmZiB3aXRoIGV4cGVjdGVkIGZvbGxvd2VkIGJ5IGFjdHVhbCcKKyAgICAgICAgICAgIGVsaWYgb3B0aW9uZmxhZ3MgJiBSRVBPUlRfTkRJRkY6CisgICAgICAgICAgICAgICAgZW5naW5lID0gZGlmZmxpYi5EaWZmZXIoY2hhcmp1bms9ZGlmZmxpYi5JU19DSEFSQUNURVJfSlVOSykKKyAgICAgICAgICAgICAgICBkaWZmID0gbGlzdChlbmdpbmUuY29tcGFyZSh3YW50X2xpbmVzLCBnb3RfbGluZXMpKQorICAgICAgICAgICAgICAgIGtpbmQgPSAnbmRpZmYgd2l0aCAtZXhwZWN0ZWQgK2FjdHVhbCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IDAsICdCYWQgZGlmZiBvcHRpb24nCisgICAgICAgICAgICAjIFJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlIG9uIGRpZmYgb3V0cHV0LgorICAgICAgICAgICAgZGlmZiA9IFtsaW5lLnJzdHJpcCgpICsgJ1xuJyBmb3IgbGluZSBpbiBkaWZmXQorICAgICAgICAgICAgcmV0dXJuICdEaWZmZXJlbmNlcyAoJXMpOlxuJyAlIGtpbmQgKyBfaW5kZW50KCcnLmpvaW4oZGlmZikpCisKKyAgICAgICAgIyBJZiB3ZSdyZSBub3QgdXNpbmcgZGlmZiwgdGhlbiBzaW1wbHkgbGlzdCB0aGUgZXhwZWN0ZWQKKyAgICAgICAgIyBvdXRwdXQgZm9sbG93ZWQgYnkgdGhlIGFjdHVhbCBvdXRwdXQuCisgICAgICAgIGlmIHdhbnQgYW5kIGdvdDoKKyAgICAgICAgICAgIHJldHVybiAnRXhwZWN0ZWQ6XG4lc0dvdDpcbiVzJyAlIChfaW5kZW50KHdhbnQpLCBfaW5kZW50KGdvdCkpCisgICAgICAgIGVsaWYgd2FudDoKKyAgICAgICAgICAgIHJldHVybiAnRXhwZWN0ZWQ6XG4lc0dvdCBub3RoaW5nXG4nICUgX2luZGVudCh3YW50KQorICAgICAgICBlbGlmIGdvdDoKKyAgICAgICAgICAgIHJldHVybiAnRXhwZWN0ZWQgbm90aGluZ1xuR290OlxuJXMnICUgX2luZGVudChnb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ0V4cGVjdGVkIG5vdGhpbmdcbkdvdCBub3RoaW5nXG4nCisKK2NsYXNzIERvY1Rlc3RGYWlsdXJlKEV4Y2VwdGlvbik6CisgICAgIiIiQSBEb2NUZXN0IGV4YW1wbGUgaGFzIGZhaWxlZCBpbiBkZWJ1Z2dpbmcgbW9kZS4KKworICAgIFRoZSBleGNlcHRpb24gaW5zdGFuY2UgaGFzIHZhcmlhYmxlczoKKworICAgIC0gdGVzdDogdGhlIERvY1Rlc3Qgb2JqZWN0IGJlaW5nIHJ1bgorCisgICAgLSBleGFtcGxlOiB0aGUgRXhhbXBsZSBvYmplY3QgdGhhdCBmYWlsZWQKKworICAgIC0gZ290OiB0aGUgYWN0dWFsIG91dHB1dAorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0LCBleGFtcGxlLCBnb3QpOgorICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYuZXhhbXBsZSA9IGV4YW1wbGUKKyAgICAgICAgc2VsZi5nb3QgPSBnb3QKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYudGVzdCkKKworY2xhc3MgVW5leHBlY3RlZEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICIiIkEgRG9jVGVzdCBleGFtcGxlIGhhcyBlbmNvdW50ZXJlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbgorCisgICAgVGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSBoYXMgdmFyaWFibGVzOgorCisgICAgLSB0ZXN0OiB0aGUgRG9jVGVzdCBvYmplY3QgYmVpbmcgcnVuCisKKyAgICAtIGV4YW1wbGU6IHRoZSBFeGFtcGxlIG9iamVjdCB0aGF0IGZhaWxlZAorCisgICAgLSBleGNfaW5mbzogdGhlIGV4Y2VwdGlvbiBpbmZvCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3QsIGV4YW1wbGUsIGV4Y19pbmZvKToKKyAgICAgICAgc2VsZi50ZXN0ID0gdGVzdAorICAgICAgICBzZWxmLmV4YW1wbGUgPSBleGFtcGxlCisgICAgICAgIHNlbGYuZXhjX2luZm8gPSBleGNfaW5mbworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi50ZXN0KQorCitjbGFzcyBEZWJ1Z1J1bm5lcihEb2NUZXN0UnVubmVyKToKKyAgICByIiIiUnVuIGRvYyB0ZXN0cyBidXQgcmFpc2UgYW4gZXhjZXB0aW9uIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBmYWlsdXJlLgorCisgICAgICAgSWYgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gb2NjdXJzLCBhbiBVbmV4cGVjdGVkRXhjZXB0aW9uIGlzIHJhaXNlZC4KKyAgICAgICBJdCBjb250YWlucyB0aGUgdGVzdCwgdGhlIGV4YW1wbGUsIGFuZCB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uOgorCisgICAgICAgICA+Pj4gcnVubmVyID0gRGVidWdSdW5uZXIodmVyYm9zZT1GYWxzZSkKKyAgICAgICAgID4+PiB0ZXN0ID0gRG9jVGVzdFBhcnNlcigpLmdldF9kb2N0ZXN0KCc+Pj4gcmFpc2UgS2V5RXJyb3JcbjQyJywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAnZm9vJywgJ2Zvby5weScsIDApCisgICAgICAgICA+Pj4gdHJ5OgorICAgICAgICAgLi4uICAgICBydW5uZXIucnVuKHRlc3QpCisgICAgICAgICAuLi4gZXhjZXB0IFVuZXhwZWN0ZWRFeGNlcHRpb24sIGZhaWx1cmU6CisgICAgICAgICAuLi4gICAgIHBhc3MKKworICAgICAgICAgPj4+IGZhaWx1cmUudGVzdCBpcyB0ZXN0CisgICAgICAgICBUcnVlCisKKyAgICAgICAgID4+PiBmYWlsdXJlLmV4YW1wbGUud2FudAorICAgICAgICAgJzQyXG4nCisKKyAgICAgICAgID4+PiBleGNfaW5mbyA9IGZhaWx1cmUuZXhjX2luZm8KKyAgICAgICAgID4+PiByYWlzZSBleGNfaW5mb1swXSwgZXhjX2luZm9bMV0sIGV4Y19pbmZvWzJdCisgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgICAuLi4KKyAgICAgICAgIEtleUVycm9yCisKKyAgICAgICBXZSB3cmFwIHRoZSBvcmlnaW5hbCBleGNlcHRpb24gdG8gZ2l2ZSB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbgorICAgICAgIGFjY2VzcyB0byB0aGUgdGVzdCBhbmQgZXhhbXBsZSBpbmZvcm1hdGlvbi4KKworICAgICAgIElmIHRoZSBvdXRwdXQgZG9lc24ndCBtYXRjaCwgdGhlbiBhIERvY1Rlc3RGYWlsdXJlIGlzIHJhaXNlZDoKKworICAgICAgICAgPj4+IHRlc3QgPSBEb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3QoJycnCisgICAgICAgICAuLi4gICAgICA+Pj4geCA9IDEKKyAgICAgICAgIC4uLiAgICAgID4+PiB4CisgICAgICAgICAuLi4gICAgICAyCisgICAgICAgICAuLi4gICAgICAnJycsIHt9LCAnZm9vJywgJ2Zvby5weScsIDApCisKKyAgICAgICAgID4+PiB0cnk6CisgICAgICAgICAuLi4gICAgcnVubmVyLnJ1bih0ZXN0KQorICAgICAgICAgLi4uIGV4Y2VwdCBEb2NUZXN0RmFpbHVyZSwgZmFpbHVyZToKKyAgICAgICAgIC4uLiAgICBwYXNzCisKKyAgICAgICBEb2NUZXN0RmFpbHVyZSBvYmplY3RzIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSB0ZXN0OgorCisgICAgICAgICA+Pj4gZmFpbHVyZS50ZXN0IGlzIHRlc3QKKyAgICAgICAgIFRydWUKKworICAgICAgIEFzIHdlbGwgYXMgdG8gdGhlIGV4YW1wbGU6CisKKyAgICAgICAgID4+PiBmYWlsdXJlLmV4YW1wbGUud2FudAorICAgICAgICAgJzJcbicKKworICAgICAgIGFuZCB0aGUgYWN0dWFsIG91dHB1dDoKKworICAgICAgICAgPj4+IGZhaWx1cmUuZ290CisgICAgICAgICAnMVxuJworCisgICAgICAgSWYgYSBmYWlsdXJlIG9yIGVycm9yIG9jY3VycywgdGhlIGdsb2JhbHMgYXJlIGxlZnQgaW50YWN0OgorCisgICAgICAgICA+Pj4gZGVsIHRlc3QuZ2xvYnNbJ19fYnVpbHRpbnNfXyddCisgICAgICAgICA+Pj4gdGVzdC5nbG9icworICAgICAgICAgeyd4JzogMX0KKworICAgICAgICAgPj4+IHRlc3QgPSBEb2NUZXN0UGFyc2VyKCkuZ2V0X2RvY3Rlc3QoJycnCisgICAgICAgICAuLi4gICAgICA+Pj4geCA9IDIKKyAgICAgICAgIC4uLiAgICAgID4+PiByYWlzZSBLZXlFcnJvcgorICAgICAgICAgLi4uICAgICAgJycnLCB7fSwgJ2ZvbycsICdmb28ucHknLCAwKQorCisgICAgICAgICA+Pj4gcnVubmVyLnJ1bih0ZXN0KQorICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAgLi4uCisgICAgICAgICBVbmV4cGVjdGVkRXhjZXB0aW9uOiA8RG9jVGVzdCBmb28gZnJvbSBmb28ucHk6MCAoMiBleGFtcGxlcyk+CisKKyAgICAgICAgID4+PiBkZWwgdGVzdC5nbG9ic1snX19idWlsdGluc19fJ10KKyAgICAgICAgID4+PiB0ZXN0Lmdsb2JzCisgICAgICAgICB7J3gnOiAyfQorCisgICAgICAgQnV0IHRoZSBnbG9iYWxzIGFyZSBjbGVhcmVkIGlmIHRoZXJlIGlzIG5vIGVycm9yOgorCisgICAgICAgICA+Pj4gdGVzdCA9IERvY1Rlc3RQYXJzZXIoKS5nZXRfZG9jdGVzdCgnJycKKyAgICAgICAgIC4uLiAgICAgID4+PiB4ID0gMgorICAgICAgICAgLi4uICAgICAgJycnLCB7fSwgJ2ZvbycsICdmb28ucHknLCAwKQorCisgICAgICAgICA+Pj4gcnVubmVyLnJ1bih0ZXN0KQorICAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorCisgICAgICAgICA+Pj4gdGVzdC5nbG9icworICAgICAgICAge30KKworICAgICAgICIiIgorCisgICAgZGVmIHJ1bihzZWxmLCB0ZXN0LCBjb21waWxlZmxhZ3M9Tm9uZSwgb3V0PU5vbmUsIGNsZWFyX2dsb2JzPVRydWUpOgorICAgICAgICByID0gRG9jVGVzdFJ1bm5lci5ydW4oc2VsZiwgdGVzdCwgY29tcGlsZWZsYWdzLCBvdXQsIEZhbHNlKQorICAgICAgICBpZiBjbGVhcl9nbG9iczoKKyAgICAgICAgICAgIHRlc3QuZ2xvYnMuY2xlYXIoKQorICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIHJlcG9ydF91bmV4cGVjdGVkX2V4Y2VwdGlvbihzZWxmLCBvdXQsIHRlc3QsIGV4YW1wbGUsIGV4Y19pbmZvKToKKyAgICAgICAgcmFpc2UgVW5leHBlY3RlZEV4Y2VwdGlvbih0ZXN0LCBleGFtcGxlLCBleGNfaW5mbykKKworICAgIGRlZiByZXBvcnRfZmFpbHVyZShzZWxmLCBvdXQsIHRlc3QsIGV4YW1wbGUsIGdvdCk6CisgICAgICAgIHJhaXNlIERvY1Rlc3RGYWlsdXJlKHRlc3QsIGV4YW1wbGUsIGdvdCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgNi4gVGVzdCBGdW5jdGlvbnMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGhlc2Ugc2hvdWxkIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlLgorCisjIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCBhIGdsb2JhbCBpbnN0YW5jZSBvZiBhIERvY1Rlc3RSdW5uZXIKKyMgY2xhc3MsIHVwZGF0ZWQgYnkgdGVzdG1vZC4KK21hc3RlciA9IE5vbmUKKworZGVmIHRlc3Rtb2QobT1Ob25lLCBuYW1lPU5vbmUsIGdsb2JzPU5vbmUsIHZlcmJvc2U9Tm9uZSwKKyAgICAgICAgICAgIHJlcG9ydD1UcnVlLCBvcHRpb25mbGFncz0wLCBleHRyYWdsb2JzPU5vbmUsCisgICAgICAgICAgICByYWlzZV9vbl9lcnJvcj1GYWxzZSwgZXhjbHVkZV9lbXB0eT1GYWxzZSk6CisgICAgIiIibT1Ob25lLCBuYW1lPU5vbmUsIGdsb2JzPU5vbmUsIHZlcmJvc2U9Tm9uZSwgcmVwb3J0PVRydWUsCisgICAgICAgb3B0aW9uZmxhZ3M9MCwgZXh0cmFnbG9icz1Ob25lLCByYWlzZV9vbl9lcnJvcj1GYWxzZSwKKyAgICAgICBleGNsdWRlX2VtcHR5PUZhbHNlCisKKyAgICBUZXN0IGV4YW1wbGVzIGluIGRvY3N0cmluZ3MgaW4gZnVuY3Rpb25zIGFuZCBjbGFzc2VzIHJlYWNoYWJsZQorICAgIGZyb20gbW9kdWxlIG0gKG9yIHRoZSBjdXJyZW50IG1vZHVsZSBpZiBtIGlzIG5vdCBzdXBwbGllZCksIHN0YXJ0aW5nCisgICAgd2l0aCBtLl9fZG9jX18uCisKKyAgICBBbHNvIHRlc3QgZXhhbXBsZXMgcmVhY2hhYmxlIGZyb20gZGljdCBtLl9fdGVzdF9fIGlmIGl0IGV4aXN0cyBhbmQgaXMKKyAgICBub3QgTm9uZS4gIG0uX190ZXN0X18gbWFwcyBuYW1lcyB0byBmdW5jdGlvbnMsIGNsYXNzZXMgYW5kIHN0cmluZ3M7CisgICAgZnVuY3Rpb24gYW5kIGNsYXNzIGRvY3N0cmluZ3MgYXJlIHRlc3RlZCBldmVuIGlmIHRoZSBuYW1lIGlzIHByaXZhdGU7CisgICAgc3RyaW5ncyBhcmUgdGVzdGVkIGRpcmVjdGx5LCBhcyBpZiB0aGV5IHdlcmUgZG9jc3RyaW5ncy4KKworICAgIFJldHVybiAoI2ZhaWx1cmVzLCAjdGVzdHMpLgorCisgICAgU2VlIGhlbHAoZG9jdGVzdCkgZm9yIGFuIG92ZXJ2aWV3LgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgIm5hbWUiIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGU7IGJ5IGRlZmF1bHQKKyAgICB1c2UgbS5fX25hbWVfXy4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJnbG9icyIgZ2l2ZXMgYSBkaWN0IHRvIGJlIHVzZWQgYXMgdGhlIGdsb2JhbHMKKyAgICB3aGVuIGV4ZWN1dGluZyBleGFtcGxlczsgYnkgZGVmYXVsdCwgdXNlIG0uX19kaWN0X18uICBBIGNvcHkgb2YgdGhpcworICAgIGRpY3QgaXMgYWN0dWFsbHkgdXNlZCBmb3IgZWFjaCBkb2NzdHJpbmcsIHNvIHRoYXQgZWFjaCBkb2NzdHJpbmcncworICAgIGV4YW1wbGVzIHN0YXJ0IHdpdGggYSBjbGVhbiBzbGF0ZS4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJleHRyYWdsb2JzIiBnaXZlcyBhIGRpY3Rpb25hcnkgdGhhdCBzaG91bGQgYmUKKyAgICBtZXJnZWQgaW50byB0aGUgZ2xvYmFscyB0aGF0IGFyZSB1c2VkIHRvIGV4ZWN1dGUgZXhhbXBsZXMuICBCeQorICAgIGRlZmF1bHQsIG5vIGV4dHJhIGdsb2JhbHMgYXJlIHVzZWQuICBUaGlzIGlzIG5ldyBpbiAyLjQuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAidmVyYm9zZSIgcHJpbnRzIGxvdHMgb2Ygc3R1ZmYgaWYgdHJ1ZSwgcHJpbnRzCisgICAgb25seSBmYWlsdXJlcyBpZiBmYWxzZTsgYnkgZGVmYXVsdCwgaXQncyB0cnVlIGlmZiAiLXYiIGlzIGluIHN5cy5hcmd2LgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgInJlcG9ydCIgcHJpbnRzIGEgc3VtbWFyeSBhdCB0aGUgZW5kIHdoZW4gdHJ1ZSwKKyAgICBlbHNlIHByaW50cyBub3RoaW5nIGF0IHRoZSBlbmQuICBJbiB2ZXJib3NlIG1vZGUsIHRoZSBzdW1tYXJ5IGlzCisgICAgZGV0YWlsZWQsIGVsc2UgdmVyeSBicmllZiAoaW4gZmFjdCwgZW1wdHkgaWYgYWxsIHRlc3RzIHBhc3NlZCkuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAib3B0aW9uZmxhZ3MiIG9yJ3MgdG9nZXRoZXIgbW9kdWxlIGNvbnN0YW50cywKKyAgICBhbmQgZGVmYXVsdHMgdG8gMC4gIFRoaXMgaXMgbmV3IGluIDIuMy4gIFBvc3NpYmxlIHZhbHVlcyAoc2VlIHRoZQorICAgIGRvY3MgZm9yIGRldGFpbHMpOgorCisgICAgICAgIERPTlRfQUNDRVBUX1RSVUVfRk9SXzEKKyAgICAgICAgRE9OVF9BQ0NFUFRfQkxBTktMSU5FCisgICAgICAgIE5PUk1BTElaRV9XSElURVNQQUNFCisgICAgICAgIEVMTElQU0lTCisgICAgICAgIFNLSVAKKyAgICAgICAgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKyAgICAgICAgUkVQT1JUX1VESUZGCisgICAgICAgIFJFUE9SVF9DRElGRgorICAgICAgICBSRVBPUlRfTkRJRkYKKyAgICAgICAgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRQorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgInJhaXNlX29uX2Vycm9yIiByYWlzZXMgYW4gZXhjZXB0aW9uIG9uIHRoZQorICAgIGZpcnN0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIG9yIGZhaWx1cmUuIFRoaXMgYWxsb3dzIGZhaWx1cmVzIHRvIGJlCisgICAgcG9zdC1tb3J0ZW0gZGVidWdnZWQuCisKKyAgICBBZHZhbmNlZCB0b21mb29sZXJ5OiAgdGVzdG1vZCBydW5zIG1ldGhvZHMgb2YgYSBsb2NhbCBpbnN0YW5jZSBvZgorICAgIGNsYXNzIGRvY3Rlc3QuVGVzdGVyLCB0aGVuIG1lcmdlcyB0aGUgcmVzdWx0cyBpbnRvIChvciBjcmVhdGVzKQorICAgIGdsb2JhbCBUZXN0ZXIgaW5zdGFuY2UgZG9jdGVzdC5tYXN0ZXIuICBNZXRob2RzIG9mIGRvY3Rlc3QubWFzdGVyCisgICAgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSB0b28sIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyB1bnVzdWFsLgorICAgIFBhc3NpbmcgcmVwb3J0PTAgdG8gdGVzdG1vZCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB0aGVuLCB0byBkZWxheQorICAgIGRpc3BsYXlpbmcgYSBzdW1tYXJ5LiAgSW52b2tlIGRvY3Rlc3QubWFzdGVyLnN1bW1hcml6ZSh2ZXJib3NlKQorICAgIHdoZW4geW91J3JlIGRvbmUgZmlkZGxpbmcuCisgICAgIiIiCisgICAgZ2xvYmFsIG1hc3RlcgorCisgICAgIyBJZiBubyBtb2R1bGUgd2FzIGdpdmVuLCB0aGVuIHVzZSBfX21haW5fXy4KKyAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgICMgRFdBIC0gbSB3aWxsIHN0aWxsIGJlIE5vbmUgaWYgdGhpcyB3YXNuJ3QgaW52b2tlZCBmcm9tIHRoZSBjb21tYW5kCisgICAgICAgICMgbGluZSwgaW4gd2hpY2ggY2FzZSB0aGUgZm9sbG93aW5nIFR5cGVFcnJvciBpcyBhYm91dCBhcyBnb29kIGFuIGVycm9yCisgICAgICAgICMgYXMgd2Ugc2hvdWxkIGV4cGVjdAorICAgICAgICBtID0gc3lzLm1vZHVsZXMuZ2V0KCdfX21haW5fXycpCisKKyAgICAjIENoZWNrIHRoYXQgd2Ugd2VyZSBhY3R1YWxseSBnaXZlbiBhIG1vZHVsZS4KKyAgICBpZiBub3QgaW5zcGVjdC5pc21vZHVsZShtKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ0ZXN0bW9kOiBtb2R1bGUgcmVxdWlyZWQ7ICVyIiAlIChtLCkpCisKKyAgICAjIElmIG5vIG5hbWUgd2FzIGdpdmVuLCB0aGVuIHVzZSB0aGUgbW9kdWxlJ3MgbmFtZS4KKyAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgIG5hbWUgPSBtLl9fbmFtZV9fCisKKyAgICAjIEZpbmQsIHBhcnNlLCBhbmQgcnVuIGFsbCB0ZXN0cyBpbiB0aGUgZ2l2ZW4gbW9kdWxlLgorICAgIGZpbmRlciA9IERvY1Rlc3RGaW5kZXIoZXhjbHVkZV9lbXB0eT1leGNsdWRlX2VtcHR5KQorCisgICAgaWYgcmFpc2Vfb25fZXJyb3I6CisgICAgICAgIHJ1bm5lciA9IERlYnVnUnVubmVyKHZlcmJvc2U9dmVyYm9zZSwgb3B0aW9uZmxhZ3M9b3B0aW9uZmxhZ3MpCisgICAgZWxzZToKKyAgICAgICAgcnVubmVyID0gRG9jVGVzdFJ1bm5lcih2ZXJib3NlPXZlcmJvc2UsIG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzKQorCisgICAgZm9yIHRlc3QgaW4gZmluZGVyLmZpbmQobSwgbmFtZSwgZ2xvYnM9Z2xvYnMsIGV4dHJhZ2xvYnM9ZXh0cmFnbG9icyk6CisgICAgICAgIHJ1bm5lci5ydW4odGVzdCkKKworICAgIGlmIHJlcG9ydDoKKyAgICAgICAgcnVubmVyLnN1bW1hcml6ZSgpCisKKyAgICBpZiBtYXN0ZXIgaXMgTm9uZToKKyAgICAgICAgbWFzdGVyID0gcnVubmVyCisgICAgZWxzZToKKyAgICAgICAgbWFzdGVyLm1lcmdlKHJ1bm5lcikKKworICAgIHJldHVybiBUZXN0UmVzdWx0cyhydW5uZXIuZmFpbHVyZXMsIHJ1bm5lci50cmllcykKKworZGVmIHRlc3RmaWxlKGZpbGVuYW1lLCBtb2R1bGVfcmVsYXRpdmU9VHJ1ZSwgbmFtZT1Ob25lLCBwYWNrYWdlPU5vbmUsCisgICAgICAgICAgICAgZ2xvYnM9Tm9uZSwgdmVyYm9zZT1Ob25lLCByZXBvcnQ9VHJ1ZSwgb3B0aW9uZmxhZ3M9MCwKKyAgICAgICAgICAgICBleHRyYWdsb2JzPU5vbmUsIHJhaXNlX29uX2Vycm9yPUZhbHNlLCBwYXJzZXI9RG9jVGVzdFBhcnNlcigpLAorICAgICAgICAgICAgIGVuY29kaW5nPU5vbmUpOgorICAgICIiIgorICAgIFRlc3QgZXhhbXBsZXMgaW4gdGhlIGdpdmVuIGZpbGUuICBSZXR1cm4gKCNmYWlsdXJlcywgI3Rlc3RzKS4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJtb2R1bGVfcmVsYXRpdmUiIHNwZWNpZmllcyBob3cgZmlsZW5hbWVzCisgICAgc2hvdWxkIGJlIGludGVycHJldGVkOgorCisgICAgICAtIElmICJtb2R1bGVfcmVsYXRpdmUiIGlzIFRydWUgKHRoZSBkZWZhdWx0KSwgdGhlbiAiZmlsZW5hbWUiCisgICAgICAgICBzcGVjaWZpZXMgYSBtb2R1bGUtcmVsYXRpdmUgcGF0aC4gIEJ5IGRlZmF1bHQsIHRoaXMgcGF0aCBpcworICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGNhbGxpbmcgbW9kdWxlJ3MgZGlyZWN0b3J5OyBidXQgaWYgdGhlCisgICAgICAgICAicGFja2FnZSIgYXJndW1lbnQgaXMgc3BlY2lmaWVkLCB0aGVuIGl0IGlzIHJlbGF0aXZlIHRvIHRoYXQKKyAgICAgICAgIHBhY2thZ2UuICBUbyBlbnN1cmUgb3MtaW5kZXBlbmRlbmNlLCAiZmlsZW5hbWUiIHNob3VsZCB1c2UKKyAgICAgICAgICIvIiBjaGFyYWN0ZXJzIHRvIHNlcGFyYXRlIHBhdGggc2VnbWVudHMsIGFuZCBzaG91bGQgbm90CisgICAgICAgICBiZSBhbiBhYnNvbHV0ZSBwYXRoIChpLmUuLCBpdCBtYXkgbm90IGJlZ2luIHdpdGggIi8iKS4KKworICAgICAgLSBJZiAibW9kdWxlX3JlbGF0aXZlIiBpcyBGYWxzZSwgdGhlbiAiZmlsZW5hbWUiIHNwZWNpZmllcyBhbgorICAgICAgICBvcy1zcGVjaWZpYyBwYXRoLiAgVGhlIHBhdGggbWF5IGJlIGFic29sdXRlIG9yIHJlbGF0aXZlICh0bworICAgICAgICB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSkuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAibmFtZSIgZ2l2ZXMgdGhlIG5hbWUgb2YgdGhlIHRlc3Q7IGJ5IGRlZmF1bHQKKyAgICB1c2UgdGhlIGZpbGUncyBiYXNlbmFtZS4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJndW1lbnQgInBhY2thZ2UiIGlzIGEgUHl0aG9uIHBhY2thZ2Ugb3IgdGhlCisgICAgbmFtZSBvZiBhIFB5dGhvbiBwYWNrYWdlIHdob3NlIGRpcmVjdG9yeSBzaG91bGQgYmUgdXNlZCBhcyB0aGUKKyAgICBiYXNlIGRpcmVjdG9yeSBmb3IgYSBtb2R1bGUgcmVsYXRpdmUgZmlsZW5hbWUuICBJZiBubyBwYWNrYWdlIGlzCisgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSBjYWxsaW5nIG1vZHVsZSdzIGRpcmVjdG9yeSBpcyB1c2VkIGFzIHRoZSBiYXNlCisgICAgZGlyZWN0b3J5IGZvciBtb2R1bGUgcmVsYXRpdmUgZmlsZW5hbWVzLiAgSXQgaXMgYW4gZXJyb3IgdG8KKyAgICBzcGVjaWZ5ICJwYWNrYWdlIiBpZiAibW9kdWxlX3JlbGF0aXZlIiBpcyBGYWxzZS4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJnbG9icyIgZ2l2ZXMgYSBkaWN0IHRvIGJlIHVzZWQgYXMgdGhlIGdsb2JhbHMKKyAgICB3aGVuIGV4ZWN1dGluZyBleGFtcGxlczsgYnkgZGVmYXVsdCwgdXNlIHt9LiAgQSBjb3B5IG9mIHRoaXMgZGljdAorICAgIGlzIGFjdHVhbGx5IHVzZWQgZm9yIGVhY2ggZG9jc3RyaW5nLCBzbyB0aGF0IGVhY2ggZG9jc3RyaW5nJ3MKKyAgICBleGFtcGxlcyBzdGFydCB3aXRoIGEgY2xlYW4gc2xhdGUuCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAiZXh0cmFnbG9icyIgZ2l2ZXMgYSBkaWN0aW9uYXJ5IHRoYXQgc2hvdWxkIGJlCisgICAgbWVyZ2VkIGludG8gdGhlIGdsb2JhbHMgdGhhdCBhcmUgdXNlZCB0byBleGVjdXRlIGV4YW1wbGVzLiAgQnkKKyAgICBkZWZhdWx0LCBubyBleHRyYSBnbG9iYWxzIGFyZSB1c2VkLgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgInZlcmJvc2UiIHByaW50cyBsb3RzIG9mIHN0dWZmIGlmIHRydWUsIHByaW50cworICAgIG9ubHkgZmFpbHVyZXMgaWYgZmFsc2U7IGJ5IGRlZmF1bHQsIGl0J3MgdHJ1ZSBpZmYgIi12IiBpcyBpbiBzeXMuYXJndi4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJyZXBvcnQiIHByaW50cyBhIHN1bW1hcnkgYXQgdGhlIGVuZCB3aGVuIHRydWUsCisgICAgZWxzZSBwcmludHMgbm90aGluZyBhdCB0aGUgZW5kLiAgSW4gdmVyYm9zZSBtb2RlLCB0aGUgc3VtbWFyeSBpcworICAgIGRldGFpbGVkLCBlbHNlIHZlcnkgYnJpZWYgKGluIGZhY3QsIGVtcHR5IGlmIGFsbCB0ZXN0cyBwYXNzZWQpLgorCisgICAgT3B0aW9uYWwga2V5d29yZCBhcmcgIm9wdGlvbmZsYWdzIiBvcidzIHRvZ2V0aGVyIG1vZHVsZSBjb25zdGFudHMsCisgICAgYW5kIGRlZmF1bHRzIHRvIDAuICBQb3NzaWJsZSB2YWx1ZXMgKHNlZSB0aGUgZG9jcyBmb3IgZGV0YWlscyk6CisKKyAgICAgICAgRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMQorICAgICAgICBET05UX0FDQ0VQVF9CTEFOS0xJTkUKKyAgICAgICAgTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICAgICAgRUxMSVBTSVMKKyAgICAgICAgU0tJUAorICAgICAgICBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAorICAgICAgICBSRVBPUlRfVURJRkYKKyAgICAgICAgUkVQT1JUX0NESUZGCisgICAgICAgIFJFUE9SVF9ORElGRgorICAgICAgICBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFCisKKyAgICBPcHRpb25hbCBrZXl3b3JkIGFyZyAicmFpc2Vfb25fZXJyb3IiIHJhaXNlcyBhbiBleGNlcHRpb24gb24gdGhlCisgICAgZmlyc3QgdW5leHBlY3RlZCBleGNlcHRpb24gb3IgZmFpbHVyZS4gVGhpcyBhbGxvd3MgZmFpbHVyZXMgdG8gYmUKKyAgICBwb3N0LW1vcnRlbSBkZWJ1Z2dlZC4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJwYXJzZXIiIHNwZWNpZmllcyBhIERvY1Rlc3RQYXJzZXIgKG9yCisgICAgc3ViY2xhc3MpIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZXh0cmFjdCB0ZXN0cyBmcm9tIHRoZSBmaWxlcy4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnICJlbmNvZGluZyIgc3BlY2lmaWVzIGFuIGVuY29kaW5nIHRoYXQgc2hvdWxkCisgICAgYmUgdXNlZCB0byBjb252ZXJ0IHRoZSBmaWxlIHRvIHVuaWNvZGUuCisKKyAgICBBZHZhbmNlZCB0b21mb29sZXJ5OiAgdGVzdG1vZCBydW5zIG1ldGhvZHMgb2YgYSBsb2NhbCBpbnN0YW5jZSBvZgorICAgIGNsYXNzIGRvY3Rlc3QuVGVzdGVyLCB0aGVuIG1lcmdlcyB0aGUgcmVzdWx0cyBpbnRvIChvciBjcmVhdGVzKQorICAgIGdsb2JhbCBUZXN0ZXIgaW5zdGFuY2UgZG9jdGVzdC5tYXN0ZXIuICBNZXRob2RzIG9mIGRvY3Rlc3QubWFzdGVyCisgICAgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSB0b28sIGlmIHlvdSB3YW50IHRvIGRvIHNvbWV0aGluZyB1bnVzdWFsLgorICAgIFBhc3NpbmcgcmVwb3J0PTAgdG8gdGVzdG1vZCBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB0aGVuLCB0byBkZWxheQorICAgIGRpc3BsYXlpbmcgYSBzdW1tYXJ5LiAgSW52b2tlIGRvY3Rlc3QubWFzdGVyLnN1bW1hcml6ZSh2ZXJib3NlKQorICAgIHdoZW4geW91J3JlIGRvbmUgZmlkZGxpbmcuCisgICAgIiIiCisgICAgZ2xvYmFsIG1hc3RlcgorCisgICAgaWYgcGFja2FnZSBhbmQgbm90IG1vZHVsZV9yZWxhdGl2ZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiUGFja2FnZSBtYXkgb25seSBiZSBzcGVjaWZpZWQgZm9yIG1vZHVsZS0iCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIHBhdGhzLiIpCisKKyAgICAjIFJlbGF0aXZpemUgdGhlIHBhdGgKKyAgICB0ZXh0LCBmaWxlbmFtZSA9IF9sb2FkX3Rlc3RmaWxlKGZpbGVuYW1lLCBwYWNrYWdlLCBtb2R1bGVfcmVsYXRpdmUpCisKKyAgICAjIElmIG5vIG5hbWUgd2FzIGdpdmVuLCB0aGVuIHVzZSB0aGUgZmlsZSdzIG5hbWUuCisgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKworICAgICMgQXNzZW1ibGUgdGhlIGdsb2JhbHMuCisgICAgaWYgZ2xvYnMgaXMgTm9uZToKKyAgICAgICAgZ2xvYnMgPSB7fQorICAgIGVsc2U6CisgICAgICAgIGdsb2JzID0gZ2xvYnMuY29weSgpCisgICAgaWYgZXh0cmFnbG9icyBpcyBub3QgTm9uZToKKyAgICAgICAgZ2xvYnMudXBkYXRlKGV4dHJhZ2xvYnMpCisgICAgaWYgJ19fbmFtZV9fJyBub3QgaW4gZ2xvYnM6CisgICAgICAgIGdsb2JzWydfX25hbWVfXyddID0gJ19fbWFpbl9fJworCisgICAgaWYgcmFpc2Vfb25fZXJyb3I6CisgICAgICAgIHJ1bm5lciA9IERlYnVnUnVubmVyKHZlcmJvc2U9dmVyYm9zZSwgb3B0aW9uZmxhZ3M9b3B0aW9uZmxhZ3MpCisgICAgZWxzZToKKyAgICAgICAgcnVubmVyID0gRG9jVGVzdFJ1bm5lcih2ZXJib3NlPXZlcmJvc2UsIG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzKQorCisgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgIHRleHQgPSB0ZXh0LmRlY29kZShlbmNvZGluZykKKworICAgICMgUmVhZCB0aGUgZmlsZSwgY29udmVydCBpdCB0byBhIHRlc3QsIGFuZCBydW4gaXQuCisgICAgdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdCh0ZXh0LCBnbG9icywgbmFtZSwgZmlsZW5hbWUsIDApCisgICAgcnVubmVyLnJ1bih0ZXN0KQorCisgICAgaWYgcmVwb3J0OgorICAgICAgICBydW5uZXIuc3VtbWFyaXplKCkKKworICAgIGlmIG1hc3RlciBpcyBOb25lOgorICAgICAgICBtYXN0ZXIgPSBydW5uZXIKKyAgICBlbHNlOgorICAgICAgICBtYXN0ZXIubWVyZ2UocnVubmVyKQorCisgICAgcmV0dXJuIFRlc3RSZXN1bHRzKHJ1bm5lci5mYWlsdXJlcywgcnVubmVyLnRyaWVzKQorCitkZWYgcnVuX2RvY3N0cmluZ19leGFtcGxlcyhmLCBnbG9icywgdmVyYm9zZT1GYWxzZSwgbmFtZT0iTm9OYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVmbGFncz1Ob25lLCBvcHRpb25mbGFncz0wKToKKyAgICAiIiIKKyAgICBUZXN0IGV4YW1wbGVzIGluIHRoZSBnaXZlbiBvYmplY3QncyBkb2NzdHJpbmcgKGBmYCksIHVzaW5nIGBnbG9ic2AKKyAgICBhcyBnbG9iYWxzLiAgT3B0aW9uYWwgYXJndW1lbnQgYG5hbWVgIGlzIHVzZWQgaW4gZmFpbHVyZSBtZXNzYWdlcy4KKyAgICBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYHZlcmJvc2VgIGlzIHRydWUsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0CisgICAgZXZlbiBpZiB0aGVyZSBhcmUgbm8gZmFpbHVyZXMuCisKKyAgICBgY29tcGlsZWZsYWdzYCBnaXZlcyB0aGUgc2V0IG9mIGZsYWdzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlCisgICAgUHl0aG9uIGNvbXBpbGVyIHdoZW4gcnVubmluZyB0aGUgZXhhbXBsZXMuICBJZiBub3Qgc3BlY2lmaWVkLCB0aGVuCisgICAgaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBzZXQgb2YgZnV0dXJlLWltcG9ydCBmbGFncyB0aGF0IGFwcGx5IHRvCisgICAgYGdsb2JzYC4KKworICAgIE9wdGlvbmFsIGtleXdvcmQgYXJnIGBvcHRpb25mbGFnc2Agc3BlY2lmaWVzIG9wdGlvbnMgZm9yIHRoZQorICAgIHRlc3RpbmcgYW5kIG91dHB1dC4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYHRlc3Rtb2RgIGZvciBtb3JlCisgICAgaW5mb3JtYXRpb24uCisgICAgIiIiCisgICAgIyBGaW5kLCBwYXJzZSwgYW5kIHJ1biBhbGwgdGVzdHMgaW4gdGhlIGdpdmVuIG1vZHVsZS4KKyAgICBmaW5kZXIgPSBEb2NUZXN0RmluZGVyKHZlcmJvc2U9dmVyYm9zZSwgcmVjdXJzZT1GYWxzZSkKKyAgICBydW5uZXIgPSBEb2NUZXN0UnVubmVyKHZlcmJvc2U9dmVyYm9zZSwgb3B0aW9uZmxhZ3M9b3B0aW9uZmxhZ3MpCisgICAgZm9yIHRlc3QgaW4gZmluZGVyLmZpbmQoZiwgbmFtZSwgZ2xvYnM9Z2xvYnMpOgorICAgICAgICBydW5uZXIucnVuKHRlc3QsIGNvbXBpbGVmbGFncz1jb21waWxlZmxhZ3MpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDcuIFRlc3RlcgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUaGlzIGlzIHByb3ZpZGVkIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAgSXQncyBub3QKKyMgYWN0dWFsbHkgdXNlZCBpbiBhbnkgd2F5LgorCitjbGFzcyBUZXN0ZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZD1Ob25lLCBnbG9icz1Ob25lLCB2ZXJib3NlPU5vbmUsIG9wdGlvbmZsYWdzPTApOgorCisgICAgICAgIHdhcm5pbmdzLndhcm4oImNsYXNzIFRlc3RlciBpcyBkZXByZWNhdGVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgInVzZSBjbGFzcyBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIGlmIG1vZCBpcyBOb25lIGFuZCBnbG9icyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJUZXN0ZXIuX19pbml0X186IG11c3Qgc3BlY2lmeSBtb2Qgb3IgZ2xvYnMiKQorICAgICAgICBpZiBtb2QgaXMgbm90IE5vbmUgYW5kIG5vdCBpbnNwZWN0LmlzbW9kdWxlKG1vZCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlRlc3Rlci5fX2luaXRfXzogbW9kIG11c3QgYmUgYSBtb2R1bGU7ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZCwpKQorICAgICAgICBpZiBnbG9icyBpcyBOb25lOgorICAgICAgICAgICAgZ2xvYnMgPSBtb2QuX19kaWN0X18KKyAgICAgICAgc2VsZi5nbG9icyA9IGdsb2JzCisKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBzZWxmLm9wdGlvbmZsYWdzID0gb3B0aW9uZmxhZ3MKKyAgICAgICAgc2VsZi50ZXN0ZmluZGVyID0gRG9jVGVzdEZpbmRlcigpCisgICAgICAgIHNlbGYudGVzdHJ1bm5lciA9IERvY1Rlc3RSdW5uZXIodmVyYm9zZT12ZXJib3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzKQorCisgICAgZGVmIHJ1bnN0cmluZyhzZWxmLCBzLCBuYW1lKToKKyAgICAgICAgdGVzdCA9IERvY1Rlc3RQYXJzZXIoKS5nZXRfZG9jdGVzdChzLCBzZWxmLmdsb2JzLCBuYW1lLCBOb25lLCBOb25lKQorICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiUnVubmluZyBzdHJpbmciLCBuYW1lCisgICAgICAgIChmLHQpID0gc2VsZi50ZXN0cnVubmVyLnJ1bih0ZXN0KQorICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCBmLCAib2YiLCB0LCAiZXhhbXBsZXMgZmFpbGVkIGluIHN0cmluZyIsIG5hbWUKKyAgICAgICAgcmV0dXJuIFRlc3RSZXN1bHRzKGYsdCkKKworICAgIGRlZiBydW5kb2Moc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZHVsZT1Ob25lKToKKyAgICAgICAgZiA9IHQgPSAwCisgICAgICAgIHRlc3RzID0gc2VsZi50ZXN0ZmluZGVyLmZpbmQob2JqZWN0LCBuYW1lLCBtb2R1bGU9bW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JzPXNlbGYuZ2xvYnMpCisgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgKGYyLCB0MikgPSBzZWxmLnRlc3RydW5uZXIucnVuKHRlc3QpCisgICAgICAgICAgICAoZix0KSA9IChmK2YyLCB0K3QyKQorICAgICAgICByZXR1cm4gVGVzdFJlc3VsdHMoZix0KQorCisgICAgZGVmIHJ1bmRpY3Qoc2VsZiwgZCwgbmFtZSwgbW9kdWxlPU5vbmUpOgorICAgICAgICBpbXBvcnQgdHlwZXMKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUobmFtZSkKKyAgICAgICAgbS5fX2RpY3RfXy51cGRhdGUoZCkKKyAgICAgICAgaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2R1bGUgPSBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi5ydW5kb2MobSwgbmFtZSwgbW9kdWxlKQorCisgICAgZGVmIHJ1bl9fdGVzdF9fKHNlbGYsIGQsIG5hbWUpOgorICAgICAgICBpbXBvcnQgdHlwZXMKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUobmFtZSkKKyAgICAgICAgbS5fX3Rlc3RfXyA9IGQKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuZG9jKG0sIG5hbWUpCisKKyAgICBkZWYgc3VtbWFyaXplKHNlbGYsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLnRlc3RydW5uZXIuc3VtbWFyaXplKHZlcmJvc2UpCisKKyAgICBkZWYgbWVyZ2Uoc2VsZiwgb3RoZXIpOgorICAgICAgICBzZWxmLnRlc3RydW5uZXIubWVyZ2Uob3RoZXIudGVzdHJ1bm5lcikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgOC4gVW5pdHRlc3QgU3VwcG9ydAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MgPSAwCisKK2RlZiBzZXRfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MoZmxhZ3MpOgorICAgICIiIlNldHMgdGhlIHVuaXR0ZXN0IG9wdGlvbiBmbGFncy4KKworICAgIFRoZSBvbGQgZmxhZyBpcyByZXR1cm5lZCBzbyB0aGF0IGEgcnVubmVyIGNvdWxkIHJlc3RvcmUgdGhlIG9sZAorICAgIHZhbHVlIGlmIGl0IHdpc2hlZCB0bzoKKworICAgICAgPj4+IGltcG9ydCBkb2N0ZXN0CisgICAgICA+Pj4gb2xkID0gZG9jdGVzdC5fdW5pdHRlc3RfcmVwb3J0ZmxhZ3MKKyAgICAgID4+PiBkb2N0ZXN0LnNldF91bml0dGVzdF9yZXBvcnRmbGFncyhSRVBPUlRfTkRJRkYgfAorICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFKSA9PSBvbGQKKyAgICAgIFRydWUKKworICAgICAgPj4+IGRvY3Rlc3QuX3VuaXR0ZXN0X3JlcG9ydGZsYWdzID09IChSRVBPUlRfTkRJRkYgfAorICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFKQorICAgICAgVHJ1ZQorCisgICAgT25seSByZXBvcnRpbmcgZmxhZ3MgY2FuIGJlIHNldDoKKworICAgICAgPj4+IGRvY3Rlc3Quc2V0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzKEVMTElQU0lTKQorICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgICBWYWx1ZUVycm9yOiAoJ09ubHkgcmVwb3J0aW5nIGZsYWdzIGFsbG93ZWQnLCA4KQorCisgICAgICA+Pj4gZG9jdGVzdC5zZXRfdW5pdHRlc3RfcmVwb3J0ZmxhZ3Mob2xkKSA9PSAoUkVQT1JUX05ESUZGIHwKKyAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSkKKyAgICAgIFRydWUKKyAgICAiIiIKKyAgICBnbG9iYWwgX3VuaXR0ZXN0X3JlcG9ydGZsYWdzCisKKyAgICBpZiAoZmxhZ3MgJiBSRVBPUlRJTkdfRkxBR1MpICE9IGZsYWdzOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJPbmx5IHJlcG9ydGluZyBmbGFncyBhbGxvd2VkIiwgZmxhZ3MpCisgICAgb2xkID0gX3VuaXR0ZXN0X3JlcG9ydGZsYWdzCisgICAgX3VuaXR0ZXN0X3JlcG9ydGZsYWdzID0gZmxhZ3MKKyAgICByZXR1cm4gb2xkCisKKworY2xhc3MgRG9jVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3QsIG9wdGlvbmZsYWdzPTAsIHNldFVwPU5vbmUsIHRlYXJEb3duPU5vbmUsCisgICAgICAgICAgICAgICAgIGNoZWNrZXI9Tm9uZSk6CisKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fZHRfb3B0aW9uZmxhZ3MgPSBvcHRpb25mbGFncworICAgICAgICBzZWxmLl9kdF9jaGVja2VyID0gY2hlY2tlcgorICAgICAgICBzZWxmLl9kdF90ZXN0ID0gdGVzdAorICAgICAgICBzZWxmLl9kdF9zZXRVcCA9IHNldFVwCisgICAgICAgIHNlbGYuX2R0X3RlYXJEb3duID0gdGVhckRvd24KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdGVzdCA9IHNlbGYuX2R0X3Rlc3QKKworICAgICAgICBpZiBzZWxmLl9kdF9zZXRVcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2R0X3NldFVwKHRlc3QpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRlc3QgPSBzZWxmLl9kdF90ZXN0CisKKyAgICAgICAgaWYgc2VsZi5fZHRfdGVhckRvd24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9kdF90ZWFyRG93bih0ZXN0KQorCisgICAgICAgIHRlc3QuZ2xvYnMuY2xlYXIoKQorCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgIHRlc3QgPSBzZWxmLl9kdF90ZXN0CisgICAgICAgIG9sZCA9IHN5cy5zdGRvdXQKKyAgICAgICAgbmV3ID0gU3RyaW5nSU8oKQorICAgICAgICBvcHRpb25mbGFncyA9IHNlbGYuX2R0X29wdGlvbmZsYWdzCisKKyAgICAgICAgaWYgbm90IChvcHRpb25mbGFncyAmIFJFUE9SVElOR19GTEFHUyk6CisgICAgICAgICAgICAjIFRoZSBvcHRpb24gZmxhZ3MgZG9uJ3QgaW5jbHVkZSBhbnkgcmVwb3J0aW5nIGZsYWdzLAorICAgICAgICAgICAgIyBzbyBhZGQgdGhlIGRlZmF1bHQgcmVwb3J0aW5nIGZsYWdzCisgICAgICAgICAgICBvcHRpb25mbGFncyB8PSBfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MKKworICAgICAgICBydW5uZXIgPSBEb2NUZXN0UnVubmVyKG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXI9c2VsZi5fZHRfY2hlY2tlciwgdmVyYm9zZT1GYWxzZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBydW5uZXIuRElWSURFUiA9ICItIio3MAorICAgICAgICAgICAgZmFpbHVyZXMsIHRyaWVzID0gcnVubmVyLnJ1bigKKyAgICAgICAgICAgICAgICB0ZXN0LCBvdXQ9bmV3LndyaXRlLCBjbGVhcl9nbG9icz1GYWxzZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBvbGQKKworICAgICAgICBpZiBmYWlsdXJlczoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbihzZWxmLmZvcm1hdF9mYWlsdXJlKG5ldy5nZXR2YWx1ZSgpKSkKKworICAgIGRlZiBmb3JtYXRfZmFpbHVyZShzZWxmLCBlcnIpOgorICAgICAgICB0ZXN0ID0gc2VsZi5fZHRfdGVzdAorICAgICAgICBpZiB0ZXN0LmxpbmVubyBpcyBOb25lOgorICAgICAgICAgICAgbGluZW5vID0gJ3Vua25vd24gbGluZSBudW1iZXInCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaW5lbm8gPSAnJXMnICUgdGVzdC5saW5lbm8KKyAgICAgICAgbG5hbWUgPSAnLicuam9pbih0ZXN0Lm5hbWUuc3BsaXQoJy4nKVstMTpdKQorICAgICAgICByZXR1cm4gKCdGYWlsZWQgZG9jdGVzdCB0ZXN0IGZvciAlc1xuJworICAgICAgICAgICAgICAgICcgIEZpbGUgIiVzIiwgbGluZSAlcywgaW4gJXNcblxuJXMnCisgICAgICAgICAgICAgICAgJSAodGVzdC5uYW1lLCB0ZXN0LmZpbGVuYW1lLCBsaW5lbm8sIGxuYW1lLCBlcnIpCisgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIGRlYnVnKHNlbGYpOgorICAgICAgICByIiIiUnVuIHRoZSB0ZXN0IGNhc2Ugd2l0aG91dCByZXN1bHRzIGFuZCB3aXRob3V0IGNhdGNoaW5nIGV4Y2VwdGlvbnMKKworICAgICAgICAgICBUaGUgdW5pdCB0ZXN0IGZyYW1ld29yayBpbmNsdWRlcyBhIGRlYnVnIG1ldGhvZCBvbiB0ZXN0IGNhc2VzCisgICAgICAgICAgIGFuZCB0ZXN0IHN1aXRlcyB0byBzdXBwb3J0IHBvc3QtbW9ydGVtIGRlYnVnZ2luZy4gIFRoZSB0ZXN0IGNvZGUKKyAgICAgICAgICAgaXMgcnVuIGluIHN1Y2ggYSB3YXkgdGhhdCBlcnJvcnMgYXJlIG5vdCBjYXVnaHQuICBUaGlzIHdheSBhCisgICAgICAgICAgIGNhbGxlciBjYW4gY2F0Y2ggdGhlIGVycm9ycyBhbmQgaW5pdGlhdGUgcG9zdC1tb3J0ZW0gZGVidWdnaW5nLgorCisgICAgICAgICAgIFRoZSBEb2NUZXN0Q2FzZSBwcm92aWRlcyBhIGRlYnVnIG1ldGhvZCB0aGF0IHJhaXNlcworICAgICAgICAgICBVbmV4cGVjdGVkRXhjZXB0aW9uIGVycm9ycyBpZiB0aGVyZSBpcyBhbiB1bmV4cGVjdGVkCisgICAgICAgICAgIGV4Y2VwdGlvbjoKKworICAgICAgICAgICAgID4+PiB0ZXN0ID0gRG9jVGVzdFBhcnNlcigpLmdldF9kb2N0ZXN0KCc+Pj4gcmFpc2UgS2V5RXJyb3JcbjQyJywKKyAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAge30sICdmb28nLCAnZm9vLnB5JywgMCkKKyAgICAgICAgICAgICA+Pj4gY2FzZSA9IERvY1Rlc3RDYXNlKHRlc3QpCisgICAgICAgICAgICAgPj4+IHRyeToKKyAgICAgICAgICAgICAuLi4gICAgIGNhc2UuZGVidWcoKQorICAgICAgICAgICAgIC4uLiBleGNlcHQgVW5leHBlY3RlZEV4Y2VwdGlvbiwgZmFpbHVyZToKKyAgICAgICAgICAgICAuLi4gICAgIHBhc3MKKworICAgICAgICAgICBUaGUgVW5leHBlY3RlZEV4Y2VwdGlvbiBjb250YWlucyB0aGUgdGVzdCwgdGhlIGV4YW1wbGUsIGFuZAorICAgICAgICAgICB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uOgorCisgICAgICAgICAgICAgPj4+IGZhaWx1cmUudGVzdCBpcyB0ZXN0CisgICAgICAgICAgICAgVHJ1ZQorCisgICAgICAgICAgICAgPj4+IGZhaWx1cmUuZXhhbXBsZS53YW50CisgICAgICAgICAgICAgJzQyXG4nCisKKyAgICAgICAgICAgICA+Pj4gZXhjX2luZm8gPSBmYWlsdXJlLmV4Y19pbmZvCisgICAgICAgICAgICAgPj4+IHJhaXNlIGV4Y19pbmZvWzBdLCBleGNfaW5mb1sxXSwgZXhjX2luZm9bMl0KKyAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgS2V5RXJyb3IKKworICAgICAgICAgICBJZiB0aGUgb3V0cHV0IGRvZXNuJ3QgbWF0Y2gsIHRoZW4gYSBEb2NUZXN0RmFpbHVyZSBpcyByYWlzZWQ6CisKKyAgICAgICAgICAgICA+Pj4gdGVzdCA9IERvY1Rlc3RQYXJzZXIoKS5nZXRfZG9jdGVzdCgnJycKKyAgICAgICAgICAgICAuLi4gICAgICA+Pj4geCA9IDEKKyAgICAgICAgICAgICAuLi4gICAgICA+Pj4geAorICAgICAgICAgICAgIC4uLiAgICAgIDIKKyAgICAgICAgICAgICAuLi4gICAgICAnJycsIHt9LCAnZm9vJywgJ2Zvby5weScsIDApCisgICAgICAgICAgICAgPj4+IGNhc2UgPSBEb2NUZXN0Q2FzZSh0ZXN0KQorCisgICAgICAgICAgICAgPj4+IHRyeToKKyAgICAgICAgICAgICAuLi4gICAgY2FzZS5kZWJ1ZygpCisgICAgICAgICAgICAgLi4uIGV4Y2VwdCBEb2NUZXN0RmFpbHVyZSwgZmFpbHVyZToKKyAgICAgICAgICAgICAuLi4gICAgcGFzcworCisgICAgICAgICAgIERvY1Rlc3RGYWlsdXJlIG9iamVjdHMgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHRlc3Q6CisKKyAgICAgICAgICAgICA+Pj4gZmFpbHVyZS50ZXN0IGlzIHRlc3QKKyAgICAgICAgICAgICBUcnVlCisKKyAgICAgICAgICAgQXMgd2VsbCBhcyB0byB0aGUgZXhhbXBsZToKKworICAgICAgICAgICAgID4+PiBmYWlsdXJlLmV4YW1wbGUud2FudAorICAgICAgICAgICAgICcyXG4nCisKKyAgICAgICAgICAgYW5kIHRoZSBhY3R1YWwgb3V0cHV0OgorCisgICAgICAgICAgICAgPj4+IGZhaWx1cmUuZ290CisgICAgICAgICAgICAgJzFcbicKKworICAgICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnNldFVwKCkKKyAgICAgICAgcnVubmVyID0gRGVidWdSdW5uZXIob3B0aW9uZmxhZ3M9c2VsZi5fZHRfb3B0aW9uZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZXI9c2VsZi5fZHRfY2hlY2tlciwgdmVyYm9zZT1GYWxzZSkKKyAgICAgICAgcnVubmVyLnJ1bihzZWxmLl9kdF90ZXN0LCBjbGVhcl9nbG9icz1GYWxzZSkKKyAgICAgICAgc2VsZi50ZWFyRG93bigpCisKKyAgICBkZWYgaWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kdF90ZXN0Lm5hbWUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiB0eXBlKHNlbGYpIGlzIG5vdCB0eXBlKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgICAgIHJldHVybiBzZWxmLl9kdF90ZXN0ID09IG90aGVyLl9kdF90ZXN0IGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLl9kdF9vcHRpb25mbGFncyA9PSBvdGhlci5fZHRfb3B0aW9uZmxhZ3MgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuX2R0X3NldFVwID09IG90aGVyLl9kdF9zZXRVcCBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fZHRfdGVhckRvd24gPT0gb3RoZXIuX2R0X3RlYXJEb3duIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLl9kdF9jaGVja2VyID09IG90aGVyLl9kdF9jaGVja2VyCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKChzZWxmLl9kdF9vcHRpb25mbGFncywgc2VsZi5fZHRfc2V0VXAsIHNlbGYuX2R0X3RlYXJEb3duLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHRfY2hlY2tlcikpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIG5hbWUgPSBzZWxmLl9kdF90ZXN0Lm5hbWUuc3BsaXQoJy4nKQorICAgICAgICByZXR1cm4gIiVzICglcykiICUgKG5hbWVbLTFdLCAnLicuam9pbihuYW1lWzotMV0pKQorCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKyAgICBkZWYgc2hvcnREZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuICJEb2N0ZXN0OiAiICsgc2VsZi5fZHRfdGVzdC5uYW1lCisKK2NsYXNzIFNraXBEb2NUZXN0Q2FzZShEb2NUZXN0Q2FzZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIHNlbGYubW9kdWxlID0gbW9kdWxlCisgICAgICAgIERvY1Rlc3RDYXNlLl9faW5pdF9fKHNlbGYsIE5vbmUpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2tpcFRlc3QoIkRvY1Rlc3RTdWl0ZSB3aWxsIG5vdCB3b3JrIHdpdGggLU8yIGFuZCBhYm92ZSIpCisKKyAgICBkZWYgdGVzdF9za2lwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc2hvcnREZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuICJTa2lwcGluZyB0ZXN0cyBmcm9tICVzIiAlIHNlbGYubW9kdWxlLl9fbmFtZV9fCisKKyAgICBfX3N0cl9fID0gc2hvcnREZXNjcmlwdGlvbgorCisKK2RlZiBEb2NUZXN0U3VpdGUobW9kdWxlPU5vbmUsIGdsb2JzPU5vbmUsIGV4dHJhZ2xvYnM9Tm9uZSwgdGVzdF9maW5kZXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgKipvcHRpb25zKToKKyAgICAiIiIKKyAgICBDb252ZXJ0IGRvY3Rlc3QgdGVzdHMgZm9yIGEgbW9kdWxlIHRvIGEgdW5pdHRlc3QgdGVzdCBzdWl0ZS4KKworICAgIFRoaXMgY29udmVydHMgZWFjaCBkb2N1bWVudGF0aW9uIHN0cmluZyBpbiBhIG1vZHVsZSB0aGF0CisgICAgY29udGFpbnMgZG9jdGVzdCB0ZXN0cyB0byBhIHVuaXR0ZXN0IHRlc3QgY2FzZS4gIElmIGFueSBvZiB0aGUKKyAgICB0ZXN0cyBpbiBhIGRvYyBzdHJpbmcgZmFpbCwgdGhlbiB0aGUgdGVzdCBjYXNlIGZhaWxzLiAgQW4gZXhjZXB0aW9uCisgICAgaXMgcmFpc2VkIHNob3dpbmcgdGhlIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgdGVzdCBhbmQgYQorICAgIChzb21ldGltZXMgYXBwcm94aW1hdGUpIGxpbmUgbnVtYmVyLgorCisgICAgVGhlIGBtb2R1bGVgIGFyZ3VtZW50IHByb3ZpZGVzIHRoZSBtb2R1bGUgdG8gYmUgdGVzdGVkLiAgVGhlIGFyZ3VtZW50CisgICAgY2FuIGJlIGVpdGhlciBhIG1vZHVsZSBvciBhIG1vZHVsZSBuYW1lLgorCisgICAgSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBjYWxsaW5nIG1vZHVsZSBpcyB1c2VkLgorCisgICAgQSBudW1iZXIgb2Ygb3B0aW9ucyBtYXkgYmUgcHJvdmlkZWQgYXMga2V5d29yZCBhcmd1bWVudHM6CisKKyAgICBzZXRVcAorICAgICAgQSBzZXQtdXAgZnVuY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgcnVubmluZyB0aGUKKyAgICAgIHRlc3RzIGluIGVhY2ggZmlsZS4gVGhlIHNldFVwIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGEgRG9jVGVzdAorICAgICAgb2JqZWN0LiAgVGhlIHNldFVwIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIHRlc3QgZ2xvYmFscyBhcyB0aGUKKyAgICAgIGdsb2JzIGF0dHJpYnV0ZSBvZiB0aGUgdGVzdCBwYXNzZWQuCisKKyAgICB0ZWFyRG93bgorICAgICAgQSB0ZWFyLWRvd24gZnVuY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBhZnRlciBydW5uaW5nIHRoZQorICAgICAgdGVzdHMgaW4gZWFjaCBmaWxlLiAgVGhlIHRlYXJEb3duIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGEgRG9jVGVzdAorICAgICAgb2JqZWN0LiAgVGhlIHRlYXJEb3duIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIHRlc3QgZ2xvYmFscyBhcyB0aGUKKyAgICAgIGdsb2JzIGF0dHJpYnV0ZSBvZiB0aGUgdGVzdCBwYXNzZWQuCisKKyAgICBnbG9icworICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgaW5pdGlhbCBnbG9iYWwgdmFyaWFibGVzIGZvciB0aGUgdGVzdHMuCisKKyAgICBvcHRpb25mbGFncworICAgICAgIEEgc2V0IG9mIGRvY3Rlc3Qgb3B0aW9uIGZsYWdzIGV4cHJlc3NlZCBhcyBhbiBpbnRlZ2VyLgorICAgICIiIgorCisgICAgaWYgdGVzdF9maW5kZXIgaXMgTm9uZToKKyAgICAgICAgdGVzdF9maW5kZXIgPSBEb2NUZXN0RmluZGVyKCkKKworICAgIG1vZHVsZSA9IF9ub3JtYWxpemVfbW9kdWxlKG1vZHVsZSkKKyAgICB0ZXN0cyA9IHRlc3RfZmluZGVyLmZpbmQobW9kdWxlLCBnbG9icz1nbG9icywgZXh0cmFnbG9icz1leHRyYWdsb2JzKQorCisgICAgaWYgbm90IHRlc3RzIGFuZCBzeXMuZmxhZ3Mub3B0aW1pemUgPj0yOgorICAgICAgICAjIFNraXAgZG9jdGVzdHMgd2hlbiBydW5uaW5nIHdpdGggLU8yCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgc3VpdGUuYWRkVGVzdChTa2lwRG9jVGVzdENhc2UobW9kdWxlKSkKKyAgICAgICAgcmV0dXJuIHN1aXRlCisgICAgZWxpZiBub3QgdGVzdHM6CisgICAgICAgICMgV2h5IGRvIHdlIHdhbnQgdG8gZG8gdGhpcz8gQmVjYXVzZSBpdCByZXZlYWxzIGEgYnVnIHRoYXQgbWlnaHQKKyAgICAgICAgIyBvdGhlcndpc2UgYmUgaGlkZGVuLgorICAgICAgICAjIEl0IGlzIHByb2JhYmx5IGEgYnVnIHRoYXQgdGhpcyBleGNlcHRpb24gaXMgbm90IGFsc28gcmFpc2VkIGlmIHRoZQorICAgICAgICAjIG51bWJlciBvZiBkb2N0ZXN0IGV4YW1wbGVzIGluIHRlc3RzIGlzIHplcm8gKGkuZS4gaWYgbm8gZG9jdGVzdAorICAgICAgICAjIGV4YW1wbGVzIHdlcmUgZm91bmQpLiAgSG93ZXZlciwgd2Ugc2hvdWxkIHByb2JhYmx5IG5vdCBiZSByYWlzaW5nCisgICAgICAgICMgYW4gZXhjZXB0aW9uIGF0IGFsbCBoZXJlLCB0aG91Z2ggaXQgaXMgdG9vIGxhdGUgdG8gbWFrZSB0aGlzIGNoYW5nZQorICAgICAgICAjIGZvciBhIG1haW50ZW5hbmNlIHJlbGVhc2UuICBTZWUgYWxzbyBpc3N1ZSAjMTQ2NDkuCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobW9kdWxlLCAiaGFzIG5vIGRvY3N0cmluZ3MiKQorCisgICAgdGVzdHMuc29ydCgpCisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgIGlmIGxlbih0ZXN0LmV4YW1wbGVzKSA9PSAwOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgbm90IHRlc3QuZmlsZW5hbWU6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG1vZHVsZS5fX2ZpbGVfXworICAgICAgICAgICAgaWYgZmlsZW5hbWVbLTQ6XSBpbiAoIi5weWMiLCAiLnB5byIpOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi0xXQorICAgICAgICAgICAgdGVzdC5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHN1aXRlLmFkZFRlc3QoRG9jVGVzdENhc2UodGVzdCwgKipvcHRpb25zKSkKKworICAgIHJldHVybiBzdWl0ZQorCitjbGFzcyBEb2NGaWxlQ2FzZShEb2NUZXN0Q2FzZSk6CisKKyAgICBkZWYgaWQoc2VsZik6CisgICAgICAgIHJldHVybiAnXycuam9pbihzZWxmLl9kdF90ZXN0Lm5hbWUuc3BsaXQoJy4nKSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2R0X3Rlc3QuZmlsZW5hbWUKKyAgICBfX3N0cl9fID0gX19yZXByX18KKworICAgIGRlZiBmb3JtYXRfZmFpbHVyZShzZWxmLCBlcnIpOgorICAgICAgICByZXR1cm4gKCdGYWlsZWQgZG9jdGVzdCB0ZXN0IGZvciAlc1xuICBGaWxlICIlcyIsIGxpbmUgMFxuXG4lcycKKyAgICAgICAgICAgICAgICAlIChzZWxmLl9kdF90ZXN0Lm5hbWUsIHNlbGYuX2R0X3Rlc3QuZmlsZW5hbWUsIGVycikKKyAgICAgICAgICAgICAgICApCisKK2RlZiBEb2NGaWxlVGVzdChwYXRoLCBtb2R1bGVfcmVsYXRpdmU9VHJ1ZSwgcGFja2FnZT1Ob25lLAorICAgICAgICAgICAgICAgIGdsb2JzPU5vbmUsIHBhcnNlcj1Eb2NUZXN0UGFyc2VyKCksCisgICAgICAgICAgICAgICAgZW5jb2Rpbmc9Tm9uZSwgKipvcHRpb25zKToKKyAgICBpZiBnbG9icyBpcyBOb25lOgorICAgICAgICBnbG9icyA9IHt9CisgICAgZWxzZToKKyAgICAgICAgZ2xvYnMgPSBnbG9icy5jb3B5KCkKKworICAgIGlmIHBhY2thZ2UgYW5kIG5vdCBtb2R1bGVfcmVsYXRpdmU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlBhY2thZ2UgbWF5IG9ubHkgYmUgc3BlY2lmaWVkIGZvciBtb2R1bGUtIgorICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBwYXRocy4iKQorCisgICAgIyBSZWxhdGl2aXplIHRoZSBwYXRoLgorICAgIGRvYywgcGF0aCA9IF9sb2FkX3Rlc3RmaWxlKHBhdGgsIHBhY2thZ2UsIG1vZHVsZV9yZWxhdGl2ZSkKKworICAgIGlmICJfX2ZpbGVfXyIgbm90IGluIGdsb2JzOgorICAgICAgICBnbG9ic1siX19maWxlX18iXSA9IHBhdGgKKworICAgICMgRmluZCB0aGUgZmlsZSBhbmQgcmVhZCBpdC4KKyAgICBuYW1lID0gb3MucGF0aC5iYXNlbmFtZShwYXRoKQorCisgICAgIyBJZiBhbiBlbmNvZGluZyBpcyBzcGVjaWZpZWQsIHVzZSBpdCB0byBjb252ZXJ0IHRoZSBmaWxlIHRvIHVuaWNvZGUKKyAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgZG9jID0gZG9jLmRlY29kZShlbmNvZGluZykKKworICAgICMgQ29udmVydCBpdCB0byBhIHRlc3QsIGFuZCB3cmFwIGl0IGluIGEgRG9jRmlsZUNhc2UuCisgICAgdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChkb2MsIGdsb2JzLCBuYW1lLCBwYXRoLCAwKQorICAgIHJldHVybiBEb2NGaWxlQ2FzZSh0ZXN0LCAqKm9wdGlvbnMpCisKK2RlZiBEb2NGaWxlU3VpdGUoKnBhdGhzLCAqKmt3KToKKyAgICAiIiJBIHVuaXR0ZXN0IHN1aXRlIGZvciBvbmUgb3IgbW9yZSBkb2N0ZXN0IGZpbGVzLgorCisgICAgVGhlIHBhdGggdG8gZWFjaCBkb2N0ZXN0IGZpbGUgaXMgZ2l2ZW4gYXMgYSBzdHJpbmc7IHRoZQorICAgIGludGVycHJldGF0aW9uIG9mIHRoYXQgc3RyaW5nIGRlcGVuZHMgb24gdGhlIGtleXdvcmQgYXJndW1lbnQKKyAgICAibW9kdWxlX3JlbGF0aXZlIi4KKworICAgIEEgbnVtYmVyIG9mIG9wdGlvbnMgbWF5IGJlIHByb3ZpZGVkIGFzIGtleXdvcmQgYXJndW1lbnRzOgorCisgICAgbW9kdWxlX3JlbGF0aXZlCisgICAgICBJZiAibW9kdWxlX3JlbGF0aXZlIiBpcyBUcnVlLCB0aGVuIHRoZSBnaXZlbiBmaWxlIHBhdGhzIGFyZQorICAgICAgaW50ZXJwcmV0ZWQgYXMgb3MtaW5kZXBlbmRlbnQgbW9kdWxlLXJlbGF0aXZlIHBhdGhzLiAgQnkKKyAgICAgIGRlZmF1bHQsIHRoZXNlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgY2FsbGluZyBtb2R1bGUncworICAgICAgZGlyZWN0b3J5OyBidXQgaWYgdGhlICJwYWNrYWdlIiBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHRoZW4KKyAgICAgIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoYXQgcGFja2FnZS4gIFRvIGVuc3VyZSBvcy1pbmRlcGVuZGVuY2UsCisgICAgICAiZmlsZW5hbWUiIHNob3VsZCB1c2UgIi8iIGNoYXJhY3RlcnMgdG8gc2VwYXJhdGUgcGF0aAorICAgICAgc2VnbWVudHMsIGFuZCBtYXkgbm90IGJlIGFuIGFic29sdXRlIHBhdGggKGkuZS4sIGl0IG1heSBub3QKKyAgICAgIGJlZ2luIHdpdGggIi8iKS4KKworICAgICAgSWYgIm1vZHVsZV9yZWxhdGl2ZSIgaXMgRmFsc2UsIHRoZW4gdGhlIGdpdmVuIGZpbGUgcGF0aHMgYXJlCisgICAgICBpbnRlcnByZXRlZCBhcyBvcy1zcGVjaWZpYyBwYXRocy4gIFRoZXNlIHBhdGhzIG1heSBiZSBhYnNvbHV0ZQorICAgICAgb3IgcmVsYXRpdmUgKHRvIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5KS4KKworICAgIHBhY2thZ2UKKyAgICAgIEEgUHl0aG9uIHBhY2thZ2Ugb3IgdGhlIG5hbWUgb2YgYSBQeXRob24gcGFja2FnZSB3aG9zZSBkaXJlY3RvcnkKKyAgICAgIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbW9kdWxlIHJlbGF0aXZlIHBhdGhzLgorICAgICAgSWYgInBhY2thZ2UiIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGNhbGxpbmcgbW9kdWxlJ3MKKyAgICAgIGRpcmVjdG9yeSBpcyB1c2VkIGFzIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgbW9kdWxlIHJlbGF0aXZlCisgICAgICBmaWxlbmFtZXMuICBJdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5ICJwYWNrYWdlIiBpZgorICAgICAgIm1vZHVsZV9yZWxhdGl2ZSIgaXMgRmFsc2UuCisKKyAgICBzZXRVcAorICAgICAgQSBzZXQtdXAgZnVuY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgcnVubmluZyB0aGUKKyAgICAgIHRlc3RzIGluIGVhY2ggZmlsZS4gVGhlIHNldFVwIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGEgRG9jVGVzdAorICAgICAgb2JqZWN0LiAgVGhlIHNldFVwIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIHRlc3QgZ2xvYmFscyBhcyB0aGUKKyAgICAgIGdsb2JzIGF0dHJpYnV0ZSBvZiB0aGUgdGVzdCBwYXNzZWQuCisKKyAgICB0ZWFyRG93bgorICAgICAgQSB0ZWFyLWRvd24gZnVuY3Rpb24uICBUaGlzIGlzIGNhbGxlZCBhZnRlciBydW5uaW5nIHRoZQorICAgICAgdGVzdHMgaW4gZWFjaCBmaWxlLiAgVGhlIHRlYXJEb3duIGZ1bmN0aW9uIHdpbGwgYmUgcGFzc2VkIGEgRG9jVGVzdAorICAgICAgb2JqZWN0LiAgVGhlIHRlYXJEb3duIGZ1bmN0aW9uIGNhbiBhY2Nlc3MgdGhlIHRlc3QgZ2xvYmFscyBhcyB0aGUKKyAgICAgIGdsb2JzIGF0dHJpYnV0ZSBvZiB0aGUgdGVzdCBwYXNzZWQuCisKKyAgICBnbG9icworICAgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgaW5pdGlhbCBnbG9iYWwgdmFyaWFibGVzIGZvciB0aGUgdGVzdHMuCisKKyAgICBvcHRpb25mbGFncworICAgICAgQSBzZXQgb2YgZG9jdGVzdCBvcHRpb24gZmxhZ3MgZXhwcmVzc2VkIGFzIGFuIGludGVnZXIuCisKKyAgICBwYXJzZXIKKyAgICAgIEEgRG9jVGVzdFBhcnNlciAob3Igc3ViY2xhc3MpIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZXh0cmFjdAorICAgICAgdGVzdHMgZnJvbSB0aGUgZmlsZXMuCisKKyAgICBlbmNvZGluZworICAgICAgQW4gZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgdG8gY29udmVydCB0aGUgZmlsZXMgdG8gdW5pY29kZS4KKyAgICAiIiIKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICAjIFdlIGRvIHRoaXMgaGVyZSBzbyB0aGF0IF9ub3JtYWxpemVfbW9kdWxlIGlzIGNhbGxlZCBhdCB0aGUgcmlnaHQKKyAgICAjIGxldmVsLiAgSWYgaXQgd2VyZSBjYWxsZWQgaW4gRG9jRmlsZVRlc3QsIHRoZW4gdGhpcyBmdW5jdGlvbgorICAgICMgd291bGQgYmUgdGhlIGNhbGxlciBhbmQgd2UgbWlnaHQgZ3Vlc3MgdGhlIHBhY2thZ2UgaW5jb3JyZWN0bHkuCisgICAgaWYga3cuZ2V0KCdtb2R1bGVfcmVsYXRpdmUnLCBUcnVlKToKKyAgICAgICAga3dbJ3BhY2thZ2UnXSA9IF9ub3JtYWxpemVfbW9kdWxlKGt3LmdldCgncGFja2FnZScpKQorCisgICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAgIHN1aXRlLmFkZFRlc3QoRG9jRmlsZVRlc3QocGF0aCwgKiprdykpCisKKyAgICByZXR1cm4gc3VpdGUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgOS4gRGVidWdnaW5nIFN1cHBvcnQKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIHNjcmlwdF9mcm9tX2V4YW1wbGVzKHMpOgorICAgIHIiIiJFeHRyYWN0IHNjcmlwdCBmcm9tIHRleHQgd2l0aCBleGFtcGxlcy4KKworICAgICAgIENvbnZlcnRzIHRleHQgd2l0aCBleGFtcGxlcyB0byBhIFB5dGhvbiBzY3JpcHQuICBFeGFtcGxlIGlucHV0IGlzCisgICAgICAgY29udmVydGVkIHRvIHJlZ3VsYXIgY29kZS4gIEV4YW1wbGUgb3V0cHV0IGFuZCBhbGwgb3RoZXIgd29yZHMKKyAgICAgICBhcmUgY29udmVydGVkIHRvIGNvbW1lbnRzOgorCisgICAgICAgPj4+IHRleHQgPSAnJycKKyAgICAgICAuLi4gICAgICAgSGVyZSBhcmUgZXhhbXBsZXMgb2Ygc2ltcGxlIG1hdGguCisgICAgICAgLi4uCisgICAgICAgLi4uICAgICAgICAgICBQeXRob24gaGFzIHN1cGVyIGFjY3VyYXRlIGludGVnZXIgYWRkaXRpb24KKyAgICAgICAuLi4KKyAgICAgICAuLi4gICAgICAgICAgID4+PiAyICsgMgorICAgICAgIC4uLiAgICAgICAgICAgNQorICAgICAgIC4uLgorICAgICAgIC4uLiAgICAgICAgICAgQW5kIHZlcnkgZnJpZW5kbHkgZXJyb3IgbWVzc2FnZXM6CisgICAgICAgLi4uCisgICAgICAgLi4uICAgICAgICAgICA+Pj4gMS8wCisgICAgICAgLi4uICAgICAgICAgICBUbyBJbmZpbml0eQorICAgICAgIC4uLiAgICAgICAgICAgQW5kCisgICAgICAgLi4uICAgICAgICAgICBCZXlvbmQKKyAgICAgICAuLi4KKyAgICAgICAuLi4gICAgICAgICAgIFlvdSBjYW4gdXNlIGxvZ2ljIGlmIHlvdSB3YW50OgorICAgICAgIC4uLgorICAgICAgIC4uLiAgICAgICAgICAgPj4+IGlmIDA6CisgICAgICAgLi4uICAgICAgICAgICAuLi4gICAgYmxhaAorICAgICAgIC4uLiAgICAgICAgICAgLi4uICAgIGJsYWgKKyAgICAgICAuLi4gICAgICAgICAgIC4uLgorICAgICAgIC4uLgorICAgICAgIC4uLiAgICAgICAgICAgSG8gaHVtCisgICAgICAgLi4uICAgICAgICAgICAnJycKKworICAgICAgID4+PiBwcmludCBzY3JpcHRfZnJvbV9leGFtcGxlcyh0ZXh0KQorICAgICAgICMgSGVyZSBhcmUgZXhhbXBsZXMgb2Ygc2ltcGxlIG1hdGguCisgICAgICAgIworICAgICAgICMgICAgIFB5dGhvbiBoYXMgc3VwZXIgYWNjdXJhdGUgaW50ZWdlciBhZGRpdGlvbgorICAgICAgICMKKyAgICAgICAyICsgMgorICAgICAgICMgRXhwZWN0ZWQ6CisgICAgICAgIyMgNQorICAgICAgICMKKyAgICAgICAjICAgICBBbmQgdmVyeSBmcmllbmRseSBlcnJvciBtZXNzYWdlczoKKyAgICAgICAjCisgICAgICAgMS8wCisgICAgICAgIyBFeHBlY3RlZDoKKyAgICAgICAjIyBUbyBJbmZpbml0eQorICAgICAgICMjIEFuZAorICAgICAgICMjIEJleW9uZAorICAgICAgICMKKyAgICAgICAjICAgICBZb3UgY2FuIHVzZSBsb2dpYyBpZiB5b3Ugd2FudDoKKyAgICAgICAjCisgICAgICAgaWYgMDoKKyAgICAgICAgICBibGFoCisgICAgICAgICAgYmxhaAorICAgICAgICMKKyAgICAgICAjICAgICBIbyBodW0KKyAgICAgICA8QkxBTktMSU5FPgorICAgICAgICIiIgorICAgIG91dHB1dCA9IFtdCisgICAgZm9yIHBpZWNlIGluIERvY1Rlc3RQYXJzZXIoKS5wYXJzZShzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwaWVjZSwgRXhhbXBsZSk6CisgICAgICAgICAgICAjIEFkZCB0aGUgZXhhbXBsZSdzIHNvdXJjZSBjb2RlIChzdHJpcCB0cmFpbGluZyBOTCkKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQocGllY2Uuc291cmNlWzotMV0pCisgICAgICAgICAgICAjIEFkZCB0aGUgZXhwZWN0ZWQgb3V0cHV0OgorICAgICAgICAgICAgd2FudCA9IHBpZWNlLndhbnQKKyAgICAgICAgICAgIGlmIHdhbnQ6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgnIyBFeHBlY3RlZDonKQorICAgICAgICAgICAgICAgIG91dHB1dCArPSBbJyMjICcrbCBmb3IgbCBpbiB3YW50LnNwbGl0KCdcbicpWzotMV1dCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEFkZCBub24tZXhhbXBsZSB0ZXh0LgorICAgICAgICAgICAgb3V0cHV0ICs9IFtfY29tbWVudF9saW5lKGwpCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBsIGluIHBpZWNlLnNwbGl0KCdcbicpWzotMV1dCisKKyAgICAjIFRyaW0ganVuayBvbiBib3RoIGVuZHMuCisgICAgd2hpbGUgb3V0cHV0IGFuZCBvdXRwdXRbLTFdID09ICcjJzoKKyAgICAgICAgb3V0cHV0LnBvcCgpCisgICAgd2hpbGUgb3V0cHV0IGFuZCBvdXRwdXRbMF0gPT0gJyMnOgorICAgICAgICBvdXRwdXQucG9wKDApCisgICAgIyBDb21iaW5lIHRoZSBvdXRwdXQsIGFuZCByZXR1cm4gaXQuCisgICAgIyBBZGQgYSBjb3VydGVzeSBuZXdsaW5lIHRvIHByZXZlbnQgZXhlYyBmcm9tIGNob2tpbmcgKHNlZSBidWcgIzExNzI3ODUpCisgICAgcmV0dXJuICdcbicuam9pbihvdXRwdXQpICsgJ1xuJworCitkZWYgdGVzdHNvdXJjZShtb2R1bGUsIG5hbWUpOgorICAgICIiIkV4dHJhY3QgdGhlIHRlc3Qgc291cmNlcyBmcm9tIGEgZG9jdGVzdCBkb2NzdHJpbmcgYXMgYSBzY3JpcHQuCisKKyAgICBQcm92aWRlIHRoZSBtb2R1bGUgKG9yIGRvdHRlZCBuYW1lIG9mIHRoZSBtb2R1bGUpIGNvbnRhaW5pbmcgdGhlCisgICAgdGVzdCB0byBiZSBkZWJ1Z2dlZCBhbmQgdGhlIG5hbWUgKHdpdGhpbiB0aGUgbW9kdWxlKSBvZiB0aGUgb2JqZWN0CisgICAgd2l0aCB0aGUgZG9jIHN0cmluZyB3aXRoIHRlc3RzIHRvIGJlIGRlYnVnZ2VkLgorICAgICIiIgorICAgIG1vZHVsZSA9IF9ub3JtYWxpemVfbW9kdWxlKG1vZHVsZSkKKyAgICB0ZXN0cyA9IERvY1Rlc3RGaW5kZXIoKS5maW5kKG1vZHVsZSkKKyAgICB0ZXN0ID0gW3QgZm9yIHQgaW4gdGVzdHMgaWYgdC5uYW1lID09IG5hbWVdCisgICAgaWYgbm90IHRlc3Q6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IobmFtZSwgIm5vdCBmb3VuZCBpbiB0ZXN0cyIpCisgICAgdGVzdCA9IHRlc3RbMF0KKyAgICB0ZXN0c3JjID0gc2NyaXB0X2Zyb21fZXhhbXBsZXModGVzdC5kb2NzdHJpbmcpCisgICAgcmV0dXJuIHRlc3RzcmMKKworZGVmIGRlYnVnX3NyYyhzcmMsIHBtPUZhbHNlLCBnbG9icz1Ob25lKToKKyAgICAiIiJEZWJ1ZyBhIHNpbmdsZSBkb2N0ZXN0IGRvY3N0cmluZywgaW4gYXJndW1lbnQgYHNyY2AnIiIiCisgICAgdGVzdHNyYyA9IHNjcmlwdF9mcm9tX2V4YW1wbGVzKHNyYykKKyAgICBkZWJ1Z19zY3JpcHQodGVzdHNyYywgcG0sIGdsb2JzKQorCitkZWYgZGVidWdfc2NyaXB0KHNyYywgcG09RmFsc2UsIGdsb2JzPU5vbmUpOgorICAgICJEZWJ1ZyBhIHRlc3Qgc2NyaXB0LiAgYHNyY2AgaXMgdGhlIHNjcmlwdCwgYXMgYSBzdHJpbmcuIgorICAgIGltcG9ydCBwZGIKKworICAgICMgTm90ZSB0aGF0IHRlbXBmaWxlLk5hbWVUZW1wb3JhcnlGaWxlKCkgY2Fubm90IGJlIHVzZWQuICBBcyB0aGUKKyAgICAjIGRvY3Mgc2F5LCBhIGZpbGUgc28gY3JlYXRlZCBjYW5ub3QgYmUgb3BlbmVkIGJ5IG5hbWUgYSBzZWNvbmQgdGltZQorICAgICMgb24gbW9kZXJuIFdpbmRvd3MgYm94ZXMsIGFuZCBleGVjZmlsZSgpIG5lZWRzIHRvIG9wZW4gaXQuCisgICAgc3JjZmlsZW5hbWUgPSB0ZW1wZmlsZS5ta3RlbXAoIi5weSIsICJkb2N0ZXN0ZGVidWciKQorICAgIGYgPSBvcGVuKHNyY2ZpbGVuYW1lLCAndycpCisgICAgZi53cml0ZShzcmMpCisgICAgZi5jbG9zZSgpCisKKyAgICB0cnk6CisgICAgICAgIGlmIGdsb2JzOgorICAgICAgICAgICAgZ2xvYnMgPSBnbG9icy5jb3B5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdsb2JzID0ge30KKworICAgICAgICBpZiBwbToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleGVjZmlsZShzcmNmaWxlbmFtZSwgZ2xvYnMsIGdsb2JzKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHByaW50IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICAgICAgcGRiLnBvc3RfbW9ydGVtKHN5cy5leGNfaW5mbygpWzJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgJXIgaXMgdml0YWwgaGVyZS4gICclcycgaW5zdGVhZCBjYW4sIGUuZy4sIGNhdXNlCisgICAgICAgICAgICAjIGJhY2tzbGFzaGVzIHRvIGdldCB0cmVhdGVkIGFzIG1ldGFjaGFyYWN0ZXJzIG9uIFdpbmRvd3MuCisgICAgICAgICAgICBwZGIucnVuKCJleGVjZmlsZSglcikiICUgc3JjZmlsZW5hbWUsIGdsb2JzLCBnbG9icykKKworICAgIGZpbmFsbHk6CisgICAgICAgIG9zLnJlbW92ZShzcmNmaWxlbmFtZSkKKworZGVmIGRlYnVnKG1vZHVsZSwgbmFtZSwgcG09RmFsc2UpOgorICAgICIiIkRlYnVnIGEgc2luZ2xlIGRvY3Rlc3QgZG9jc3RyaW5nLgorCisgICAgUHJvdmlkZSB0aGUgbW9kdWxlIChvciBkb3R0ZWQgbmFtZSBvZiB0aGUgbW9kdWxlKSBjb250YWluaW5nIHRoZQorICAgIHRlc3QgdG8gYmUgZGVidWdnZWQgYW5kIHRoZSBuYW1lICh3aXRoaW4gdGhlIG1vZHVsZSkgb2YgdGhlIG9iamVjdAorICAgIHdpdGggdGhlIGRvY3N0cmluZyB3aXRoIHRlc3RzIHRvIGJlIGRlYnVnZ2VkLgorICAgICIiIgorICAgIG1vZHVsZSA9IF9ub3JtYWxpemVfbW9kdWxlKG1vZHVsZSkKKyAgICB0ZXN0c3JjID0gdGVzdHNvdXJjZShtb2R1bGUsIG5hbWUpCisgICAgZGVidWdfc2NyaXB0KHRlc3RzcmMsIHBtLCBtb2R1bGUuX19kaWN0X18pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIDEwLiBFeGFtcGxlIFVzYWdlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitjbGFzcyBfVGVzdENsYXNzOgorICAgICIiIgorICAgIEEgcG9pbnRsZXNzIGNsYXNzLCBmb3Igc2FuaXR5LWNoZWNraW5nIG9mIGRvY3N0cmluZyB0ZXN0aW5nLgorCisgICAgTWV0aG9kczoKKyAgICAgICAgc3F1YXJlKCkKKyAgICAgICAgZ2V0KCkKKworICAgID4+PiBfVGVzdENsYXNzKDEzKS5nZXQoKSArIF9UZXN0Q2xhc3MoLTEyKS5nZXQoKQorICAgIDEKKyAgICA+Pj4gaGV4KF9UZXN0Q2xhc3MoMTMpLnNxdWFyZSgpLmdldCgpKQorICAgICcweGE5JworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICIiInZhbCAtPiBfVGVzdENsYXNzIG9iamVjdCB3aXRoIGFzc29jaWF0ZWQgdmFsdWUgdmFsLgorCisgICAgICAgID4+PiB0ID0gX1Rlc3RDbGFzcygxMjMpCisgICAgICAgID4+PiBwcmludCB0LmdldCgpCisgICAgICAgIDEyMworICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHNxdWFyZShzZWxmKToKKyAgICAgICAgIiIic3F1YXJlKCkgLT4gc3F1YXJlIFRlc3RDbGFzcydzIGFzc29jaWF0ZWQgdmFsdWUKKworICAgICAgICA+Pj4gX1Rlc3RDbGFzcygxMykuc3F1YXJlKCkuZ2V0KCkKKyAgICAgICAgMTY5CisgICAgICAgICIiIgorCisgICAgICAgIHNlbGYudmFsID0gc2VsZi52YWwgKiogMgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgIiIiZ2V0KCkgLT4gcmV0dXJuIFRlc3RDbGFzcydzIGFzc29jaWF0ZWQgdmFsdWUuCisKKyAgICAgICAgPj4+IHggPSBfVGVzdENsYXNzKC00MikKKyAgICAgICAgPj4+IHByaW50IHguZ2V0KCkKKyAgICAgICAgLTQyCisgICAgICAgICIiIgorCisgICAgICAgIHJldHVybiBzZWxmLnZhbAorCitfX3Rlc3RfXyA9IHsiX1Rlc3RDbGFzcyI6IF9UZXN0Q2xhc3MsCisgICAgICAgICAgICAic3RyaW5nIjogciIiIgorICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgb2YgYSBzdHJpbmcgb2JqZWN0LCBzZWFyY2hlZCBhcy1pcy4KKyAgICAgICAgICAgICAgICAgICAgICA+Pj4geCA9IDE7IHkgPSAyCisgICAgICAgICAgICAgICAgICAgICAgPj4+IHggKyB5LCB4ICogeQorICAgICAgICAgICAgICAgICAgICAgICgzLCAyKQorICAgICAgICAgICAgICAgICAgICAgICIiIiwKKworICAgICAgICAgICAgImJvb2wtaW50IGVxdWl2YWxlbmNlIjogciIiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gMi4yLCBib29sZWFuIGV4cHJlc3Npb25zIGRpc3BsYXllZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBvciAxLiAgQnkgZGVmYXVsdCwgd2Ugc3RpbGwgYWNjZXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtLiAgVGhpcyBjYW4gYmUgZGlzYWJsZWQgYnkgcGFzc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMSB0byB0aGUgbmV3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25mbGFncyBhcmd1bWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+PiA0ID09IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+PiA0ID09IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4+PiA0ID4gNAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPj4+IDQgPiA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiYmxhbmsgbGluZXMiOiByIiIiCisgICAgICAgICAgICAgICAgQmxhbmsgbGluZXMgY2FuIGJlIG1hcmtlZCB3aXRoIDxCTEFOS0xJTkU+OgorICAgICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgJ2Zvb1xuXG5iYXJcbicKKyAgICAgICAgICAgICAgICAgICAgZm9vCisgICAgICAgICAgICAgICAgICAgIDxCTEFOS0xJTkU+CisgICAgICAgICAgICAgICAgICAgIGJhcgorICAgICAgICAgICAgICAgICAgICA8QkxBTktMSU5FPgorICAgICAgICAgICAgIiIiLAorCisgICAgICAgICAgICAiZWxsaXBzaXMiOiByIiIiCisgICAgICAgICAgICAgICAgSWYgdGhlIGVsbGlwc2lzIGZsYWcgaXMgdXNlZCwgdGhlbiAnLi4uJyBjYW4gYmUgdXNlZCB0bworICAgICAgICAgICAgICAgIGVsaWRlIHN1YnN0cmluZ3MgaW4gdGhlIGRlc2lyZWQgb3V0cHV0OgorICAgICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTAwMCkgI2RvY3Rlc3Q6ICtFTExJUFNJUworICAgICAgICAgICAgICAgICAgICBbMCwgMSwgMiwgLi4uLCA5OTldCisgICAgICAgICAgICAiIiIsCisKKyAgICAgICAgICAgICJ3aGl0ZXNwYWNlIG5vcm1hbGl6YXRpb24iOiByIiIiCisgICAgICAgICAgICAgICAgSWYgdGhlIHdoaXRlc3BhY2Ugbm9ybWFsaXphdGlvbiBmbGFnIGlzIHVzZWQsIHRoZW4KKyAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcyBpbiB3aGl0ZXNwYWNlIGFyZSBpZ25vcmVkLgorICAgICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgcmFuZ2UoMzApICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICAgICAgICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwKKyAgICAgICAgICAgICAgICAgICAgIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsCisgICAgICAgICAgICAgICAgICAgICAyNywgMjgsIDI5XQorICAgICAgICAgICAgIiIiLAorICAgICAgICAgICB9CisKKworZGVmIF90ZXN0KCk6CisgICAgdGVzdGZpbGVzID0gW2FyZyBmb3IgYXJnIGluIHN5cy5hcmd2WzE6XSBpZiBhcmcgYW5kIGFyZ1swXSAhPSAnLSddCisgICAgaWYgbm90IHRlc3RmaWxlczoKKyAgICAgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgIGlmICdfX2xvYWRlcl9fJyBpbiBnbG9iYWxzKCk6ICAgICAgICAgICMgcHl0aG9uIC1tCisgICAgICAgICAgICBuYW1lLCBfID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBwcmludCgidXNhZ2U6IHswfSBbLXZdIGZpbGUgLi4uIi5mb3JtYXQobmFtZSkpCisgICAgICAgIHJldHVybiAyCisgICAgZm9yIGZpbGVuYW1lIGluIHRlc3RmaWxlczoKKyAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgIyBJdCBpcyBhIG1vZHVsZSAtLSBpbnNlcnQgaXRzIGRpciBpbnRvIHN5cy5wYXRoIGFuZCB0cnkgdG8KKyAgICAgICAgICAgICMgaW1wb3J0IGl0LiBJZiBpdCBpcyBwYXJ0IG9mIGEgcGFja2FnZSwgdGhhdCBwb3NzaWJseQorICAgICAgICAgICAgIyB3b24ndCB3b3JrIGJlY2F1c2Ugb2YgcGFja2FnZSBpbXBvcnRzLgorICAgICAgICAgICAgZGlybmFtZSwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQorICAgICAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGRpcm5hbWUpCisgICAgICAgICAgICBtID0gX19pbXBvcnRfXyhmaWxlbmFtZVs6LTNdKQorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisgICAgICAgICAgICBmYWlsdXJlcywgXyA9IHRlc3Rtb2QobSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZhaWx1cmVzLCBfID0gdGVzdGZpbGUoZmlsZW5hbWUsIG1vZHVsZV9yZWxhdGl2ZT1GYWxzZSkKKyAgICAgICAgaWYgZmFpbHVyZXM6CisgICAgICAgICAgICByZXR1cm4gMQorICAgIHJldHVybiAwCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChfdGVzdCgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kb2N0ZXN0LnB5YyBiL2xpYi9weXRob24yLjcvZG9jdGVzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwNGFlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZG9jdGVzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kb2N0ZXN0LnB5byBiL2xpYi9weXRob24yLjcvZG9jdGVzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwZGRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZG9jdGVzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5IGIvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNTRhOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2R1bWJkYm0ucHkKQEAgLTAsMCArMSwyNTAgQEAKKyIiIkEgZHVtYiBhbmQgc2xvdyBidXQgc2ltcGxlIGRibSBjbG9uZS4KKworRm9yIGRhdGFiYXNlIHNwYW0sIHNwYW0uZGlyIGNvbnRhaW5zIHRoZSBpbmRleCAoYSB0ZXh0IGZpbGUpLAorc3BhbS5iYWsgKm1heSogY29udGFpbiBhIGJhY2t1cCBvZiB0aGUgaW5kZXggKGFsc28gYSB0ZXh0IGZpbGUpLAord2hpbGUgc3BhbS5kYXQgY29udGFpbnMgdGhlIGRhdGEgKGEgYmluYXJ5IGZpbGUpLgorCitYWFggVE8gRE86CisKKy0gc2VlbXMgdG8gY29udGFpbiBhIGJ1ZyB3aGVuIHVwZGF0aW5nLi4uCisKKy0gcmVjbGFpbSBmcmVlIHNwYWNlIChjdXJyZW50bHksIHNwYWNlIG9uY2Ugb2NjdXBpZWQgYnkgZGVsZXRlZCBvciBleHBhbmRlZAoraXRlbXMgaXMgbmV2ZXIgcmV1c2VkKQorCistIHN1cHBvcnQgY29uY3VycmVudCBhY2Nlc3MgKGN1cnJlbnRseSwgaWYgdHdvIHByb2Nlc3NlcyB0YWtlIHR1cm5zIG1ha2luZwordXBkYXRlcywgdGhleSBjYW4gbWVzcyB1cCB0aGUgaW5kZXgpCisKKy0gc3VwcG9ydCBlZmZpY2llbnQgYWNjZXNzIHRvIGxhcmdlIGRhdGFiYXNlcyAoY3VycmVudGx5LCB0aGUgd2hvbGUgaW5kZXgKK2lzIHJlYWQgd2hlbiB0aGUgZGF0YWJhc2UgaXMgb3BlbmVkLCBhbmQgc29tZSB1cGRhdGVzIHJld3JpdGUgdGhlIHdob2xlIGluZGV4KQorCistIHN1cHBvcnQgb3BlbmluZyBmb3IgcmVhZC1vbmx5IChmbGFnID0gJ20nKQorCisiIiIKKworaW1wb3J0IG9zIGFzIF9vcworaW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgVXNlckRpY3QKKworX29wZW4gPSBfX2J1aWx0aW5fXy5vcGVuCisKK19CTE9DS1NJWkUgPSA1MTIKKworZXJyb3IgPSBJT0Vycm9yICAgICAgICAgICAgICAgICAgICAgICAgICMgRm9yIGFueWRibQorCitjbGFzcyBfRGF0YWJhc2UoVXNlckRpY3QuRGljdE1peGluKToKKworICAgICMgVGhlIG9uLWRpc2sgZGlyZWN0b3J5IGFuZCBkYXRhIGZpbGVzIGNhbiByZW1haW4gaW4gbXV0dWFsbHkKKyAgICAjIGluY29uc2lzdGVudCBzdGF0ZXMgZm9yIGFuIGFyYml0cmFyaWx5IGxvbmcgdGltZSAoc2VlIGNvbW1lbnRzCisgICAgIyBhdCB0aGUgZW5kIG9mIF9fc2V0aXRlbV9fKS4gIFRoaXMgaXMgb25seSByZXBhaXJlZCB3aGVuIF9jb21taXQoKQorICAgICMgZ2V0cyBjYWxsZWQuICBPbmUgcGxhY2UgX2NvbW1pdCgpIGdldHMgY2FsbGVkIGlzIGZyb20gX19kZWxfXygpLAorICAgICMgYW5kIGlmIHRoYXQgb2NjdXJzIGF0IHByb2dyYW0gc2h1dGRvd24gdGltZSwgbW9kdWxlIGdsb2JhbHMgbWF5CisgICAgIyBhbHJlYWR5IGhhdmUgZ290dGVuIHJlYm91bmQgdG8gTm9uZS4gIFNpbmNlIGl0J3MgY3J1Y2lhbCB0aGF0CisgICAgIyBfY29tbWl0KCkgZmluaXNoIHN1Y2Nlc3NmdWxseSwgd2UgY2FuJ3QgaWdub3JlIHNodXRkb3duIHJhY2VzCisgICAgIyBoZXJlLCBhbmQgX2NvbW1pdCgpIG11c3Qgbm90IHJlZmVyZW5jZSBhbnkgZ2xvYmFscy4KKyAgICBfb3MgPSBfb3MgICAgICAgIyBmb3IgX2NvbW1pdCgpCisgICAgX29wZW4gPSBfb3BlbiAgICMgZm9yIF9jb21taXQoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGViYXNlbmFtZSwgbW9kZSk6CisgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisKKyAgICAgICAgIyBUaGUgZGlyZWN0b3J5IGZpbGUgaXMgYSB0ZXh0IGZpbGUuICBFYWNoIGxpbmUgbG9va3MgbGlrZQorICAgICAgICAjICAgICIlciwgKCVkLCAlZClcbiIgJSAoa2V5LCBwb3MsIHNpeikKKyAgICAgICAgIyB3aGVyZSBrZXkgaXMgdGhlIHN0cmluZyBrZXksIHBvcyBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIGRhdAorICAgICAgICAjIGZpbGUgb2YgdGhlIGFzc29jaWF0ZWQgdmFsdWUncyBmaXJzdCBieXRlLCBhbmQgc2l6IGlzIHRoZSBudW1iZXIKKyAgICAgICAgIyBvZiBieXRlcyBpbiB0aGUgYXNzb2NpYXRlZCB2YWx1ZS4KKyAgICAgICAgc2VsZi5fZGlyZmlsZSA9IGZpbGViYXNlbmFtZSArIF9vcy5leHRzZXAgKyAnZGlyJworCisgICAgICAgICMgVGhlIGRhdGEgZmlsZSBpcyBhIGJpbmFyeSBmaWxlIHBvaW50ZWQgaW50byBieSB0aGUgZGlyZWN0b3J5CisgICAgICAgICMgZmlsZSwgYW5kIGhvbGRzIHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGtleXMuICBFYWNoIHZhbHVlCisgICAgICAgICMgYmVnaW5zIGF0IGEgX0JMT0NLU0laRS1hbGlnbmVkIGJ5dGUgb2Zmc2V0LCBhbmQgaXMgYSByYXcKKyAgICAgICAgIyBiaW5hcnkgOC1iaXQgc3RyaW5nIHZhbHVlLgorICAgICAgICBzZWxmLl9kYXRmaWxlID0gZmlsZWJhc2VuYW1lICsgX29zLmV4dHNlcCArICdkYXQnCisgICAgICAgIHNlbGYuX2Jha2ZpbGUgPSBmaWxlYmFzZW5hbWUgKyBfb3MuZXh0c2VwICsgJ2JhaycKKworICAgICAgICAjIFRoZSBpbmRleCBpcyBhbiBpbi1tZW1vcnkgZGljdCwgbWlycm9yaW5nIHRoZSBkaXJlY3RvcnkgZmlsZS4KKyAgICAgICAgc2VsZi5faW5kZXggPSBOb25lICAjIG1hcHMga2V5cyB0byAocG9zLCBzaXopIHBhaXJzCisKKyAgICAgICAgIyBNb2QgYnkgSmFjazogY3JlYXRlIGRhdGEgZmlsZSBpZiBuZWVkZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RhdGZpbGUsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBmID0gX29wZW4oc2VsZi5fZGF0ZmlsZSwgJ3cnKQorICAgICAgICAgICAgc2VsZi5fY2htb2Qoc2VsZi5fZGF0ZmlsZSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisKKyAgICAjIFJlYWQgZGlyZWN0b3J5IGZpbGUgaW50byB0aGUgaW4tbWVtb3J5IGluZGV4IGRpY3QuCisgICAgZGVmIF91cGRhdGUoc2VsZik6CisgICAgICAgIHNlbGYuX2luZGV4ID0ge30KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RpcmZpbGUpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQorICAgICAgICAgICAgICAgIGtleSwgcG9zX2FuZF9zaXpfcGFpciA9IGV2YWwobGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9pbmRleFtrZXldID0gcG9zX2FuZF9zaXpfcGFpcgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAjIFdyaXRlIHRoZSBpbmRleCBkaWN0IHRvIHRoZSBkaXJlY3RvcnkgZmlsZS4gIFRoZSBvcmlnaW5hbCBkaXJlY3RvcnkKKyAgICAjIGZpbGUgKGlmIGFueSkgaXMgcmVuYW1lZCB3aXRoIGEgLmJhayBleHRlbnNpb24gZmlyc3QuICBJZiBhIC5iYWsKKyAgICAjIGZpbGUgY3VycmVudGx5IGV4aXN0cywgaXQncyBkZWxldGVkLgorICAgIGRlZiBfY29tbWl0KHNlbGYpOgorICAgICAgICAjIENBVVRJT046ICBJdCdzIHZpdGFsIHRoYXQgX2NvbW1pdCgpIHN1Y2NlZWQsIGFuZCBfY29tbWl0KCkgY2FuCisgICAgICAgICMgYmUgY2FsbGVkIGZyb20gX19kZWxfXygpLiAgVGhlcmVmb3JlIHdlIG11c3QgbmV2ZXIgcmVmZXJlbmNlIGEKKyAgICAgICAgIyBnbG9iYWwgaW4gdGhpcyByb3V0aW5lLgorICAgICAgICBpZiBzZWxmLl9pbmRleCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICAjIG5vdGhpbmcgdG8gZG8KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9vcy51bmxpbmsoc2VsZi5fYmFrZmlsZSkKKyAgICAgICAgZXhjZXB0IHNlbGYuX29zLmVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX29zLnJlbmFtZShzZWxmLl9kaXJmaWxlLCBzZWxmLl9iYWtmaWxlKQorICAgICAgICBleGNlcHQgc2VsZi5fb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZiA9IHNlbGYuX29wZW4oc2VsZi5fZGlyZmlsZSwgJ3cnKQorICAgICAgICBzZWxmLl9jaG1vZChzZWxmLl9kaXJmaWxlKQorICAgICAgICBmb3Iga2V5LCBwb3NfYW5kX3Npel9wYWlyIGluIHNlbGYuX2luZGV4Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgZi53cml0ZSgiJXIsICVyXG4iICUgKGtleSwgcG9zX2FuZF9zaXpfcGFpcikpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgc3luYyA9IF9jb21taXQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBwb3MsIHNpeiA9IHNlbGYuX2luZGV4W2tleV0gICAgICMgbWF5IHJhaXNlIEtleUVycm9yCisgICAgICAgIGYgPSBfb3BlbihzZWxmLl9kYXRmaWxlLCAncmInKQorICAgICAgICBmLnNlZWsocG9zKQorICAgICAgICBkYXQgPSBmLnJlYWQoc2l6KQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIGRhdAorCisgICAgIyBBcHBlbmQgdmFsIHRvIHRoZSBkYXRhIGZpbGUsIHN0YXJ0aW5nIGF0IGEgX0JMT0NLU0laRS1hbGlnbmVkCisgICAgIyBvZmZzZXQuICBUaGUgZGF0YSBmaWxlIGlzIGZpcnN0IHBhZGRlZCB3aXRoIE5VTCBieXRlcyAoaWYgbmVlZGVkKQorICAgICMgdG8gZ2V0IHRvIGFuIGFsaWduZWQgb2Zmc2V0LiAgUmV0dXJuIHBhaXIKKyAgICAjICAgICAoc3RhcnRpbmcgb2Zmc2V0IG9mIHZhbCwgbGVuKHZhbCkpCisgICAgZGVmIF9hZGR2YWwoc2VsZiwgdmFsKToKKyAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RhdGZpbGUsICdyYisnKQorICAgICAgICBmLnNlZWsoMCwgMikKKyAgICAgICAgcG9zID0gaW50KGYudGVsbCgpKQorICAgICAgICBucG9zID0gKChwb3MgKyBfQkxPQ0tTSVpFIC0gMSkgLy8gX0JMT0NLU0laRSkgKiBfQkxPQ0tTSVpFCisgICAgICAgIGYud3JpdGUoJ1wwJyoobnBvcy1wb3MpKQorICAgICAgICBwb3MgPSBucG9zCisgICAgICAgIGYud3JpdGUodmFsKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIChwb3MsIGxlbih2YWwpKQorCisgICAgIyBXcml0ZSB2YWwgdG8gdGhlIGRhdGEgZmlsZSwgc3RhcnRpbmcgYXQgb2Zmc2V0IHBvcy4gIFRoZSBjYWxsZXIKKyAgICAjIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZXJlJ3MgZW5vdWdoIHJvb20gc3RhcnRpbmcgYXQKKyAgICAjIHBvcyB0byBob2xkIHZhbCwgd2l0aG91dCBvdmVyd3JpdGluZyBzb21lIG90aGVyIHZhbHVlLiAgUmV0dXJuCisgICAgIyBwYWlyIChwb3MsIGxlbih2YWwpKS4KKyAgICBkZWYgX3NldHZhbChzZWxmLCBwb3MsIHZhbCk6CisgICAgICAgIGYgPSBfb3BlbihzZWxmLl9kYXRmaWxlLCAncmIrJykKKyAgICAgICAgZi5zZWVrKHBvcykKKyAgICAgICAgZi53cml0ZSh2YWwpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gKHBvcywgbGVuKHZhbCkpCisKKyAgICAjIGtleSBpcyBhIG5ldyBrZXkgd2hvc2UgYXNzb2NpYXRlZCB2YWx1ZSBzdGFydHMgaW4gdGhlIGRhdGEgZmlsZQorICAgICMgYXQgb2Zmc2V0IHBvcyBhbmQgd2l0aCBsZW5ndGggc2l6LiAgQWRkIGFuIGluZGV4IHJlY29yZCB0bworICAgICMgdGhlIGluLW1lbW9yeSBpbmRleCBkaWN0LCBhbmQgYXBwZW5kIG9uZSB0byB0aGUgZGlyZWN0b3J5IGZpbGUuCisgICAgZGVmIF9hZGRrZXkoc2VsZiwga2V5LCBwb3NfYW5kX3Npel9wYWlyKToKKyAgICAgICAgc2VsZi5faW5kZXhba2V5XSA9IHBvc19hbmRfc2l6X3BhaXIKKyAgICAgICAgZiA9IF9vcGVuKHNlbGYuX2RpcmZpbGUsICdhJykKKyAgICAgICAgc2VsZi5fY2htb2Qoc2VsZi5fZGlyZmlsZSkKKyAgICAgICAgZi53cml0ZSgiJXIsICVyXG4iICUgKGtleSwgcG9zX2FuZF9zaXpfcGFpcikpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsKToKKyAgICAgICAgaWYgbm90IHR5cGUoa2V5KSA9PSB0eXBlKCcnKSA9PSB0eXBlKHZhbCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJrZXlzIGFuZCB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzIgorICAgICAgICBpZiBrZXkgbm90IGluIHNlbGYuX2luZGV4OgorICAgICAgICAgICAgc2VsZi5fYWRka2V5KGtleSwgc2VsZi5fYWRkdmFsKHZhbCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFNlZSB3aGV0aGVyIHRoZSBuZXcgdmFsdWUgaXMgc21hbGwgZW5vdWdoIHRvIGZpdCBpbiB0aGUKKyAgICAgICAgICAgICMgKHBhZGRlZCkgc3BhY2UgY3VycmVudGx5IG9jY3VwaWVkIGJ5IHRoZSBvbGQgdmFsdWUuCisgICAgICAgICAgICBwb3MsIHNpeiA9IHNlbGYuX2luZGV4W2tleV0KKyAgICAgICAgICAgIG9sZGJsb2NrcyA9IChzaXogKyBfQkxPQ0tTSVpFIC0gMSkgLy8gX0JMT0NLU0laRQorICAgICAgICAgICAgbmV3YmxvY2tzID0gKGxlbih2YWwpICsgX0JMT0NLU0laRSAtIDEpIC8vIF9CTE9DS1NJWkUKKyAgICAgICAgICAgIGlmIG5ld2Jsb2NrcyA8PSBvbGRibG9ja3M6CisgICAgICAgICAgICAgICAgc2VsZi5faW5kZXhba2V5XSA9IHNlbGYuX3NldHZhbChwb3MsIHZhbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBUaGUgbmV3IHZhbHVlIGRvZXNuJ3QgZml0IGluIHRoZSAocGFkZGVkKSBzcGFjZSB1c2VkCisgICAgICAgICAgICAgICAgIyBieSB0aGUgb2xkIHZhbHVlLiAgVGhlIGJsb2NrcyB1c2VkIGJ5IHRoZSBvbGQgdmFsdWUgYXJlCisgICAgICAgICAgICAgICAgIyBmb3JldmVyIGxvc3QuCisgICAgICAgICAgICAgICAgc2VsZi5faW5kZXhba2V5XSA9IHNlbGYuX2FkZHZhbCh2YWwpCisKKyAgICAgICAgICAgICMgTm90ZSB0aGF0IF9pbmRleCBtYXkgYmUgb3V0IG9mIHN5bmNoIHdpdGggdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgIyBmaWxlIG5vdzogIF9zZXR2YWwoKSBhbmQgX2FkZHZhbCgpIGRvbid0IHVwZGF0ZSB0aGUgZGlyZWN0b3J5CisgICAgICAgICAgICAjIGZpbGUuICBUaGlzIGFsc28gbWVhbnMgdGhhdCB0aGUgb24tZGlzayBkaXJlY3RvcnkgYW5kIGRhdGEKKyAgICAgICAgICAgICMgZmlsZXMgYXJlIGluIGEgbXV0dWFsbHkgaW5jb25zaXN0ZW50IHN0YXRlLCBhbmQgdGhleSdsbAorICAgICAgICAgICAgIyByZW1haW4gdGhhdCB3YXkgdW50aWwgX2NvbW1pdCgpIGlzIGNhbGxlZC4gIE5vdGUgdGhhdCB0aGlzCisgICAgICAgICAgICAjIGlzIGEgZGlzYXN0ZXIgKGZvciB0aGUgZGF0YWJhc2UpIGlmIHRoZSBwcm9ncmFtIGNyYXNoZXMKKyAgICAgICAgICAgICMgKHNvIHRoYXQgX2NvbW1pdCgpIG5ldmVyIGdldHMgY2FsbGVkKS4KKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAjIFRoZSBibG9ja3MgdXNlZCBieSB0aGUgYXNzb2NpYXRlZCB2YWx1ZSBhcmUgbG9zdC4KKyAgICAgICAgZGVsIHNlbGYuX2luZGV4W2tleV0KKyAgICAgICAgIyBYWFggSXQncyB1bmNsZWFyIHdoeSB3ZSBkbyBhIF9jb21taXQoKSBoZXJlICh0aGUgY29kZSBhbHdheXMKKyAgICAgICAgIyBYWFggaGFzLCBzbyBJJ20gbm90IGNoYW5naW5nIGl0KS4gIF9zZXRpdGVtX18gZG9lc24ndCB0cnkgdG8KKyAgICAgICAgIyBYWFgga2VlcCB0aGUgZGlyZWN0b3J5IGZpbGUgaW4gc3luY2guICBXaHkgc2hvdWxkIHdlPyAgT3IKKyAgICAgICAgIyBYWFggd2h5IHNob3VsZG4ndCBfX3NldGl0ZW1fXz8KKyAgICAgICAgc2VsZi5fY29tbWl0KCkKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faW5kZXgua2V5cygpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2luZGV4CisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBrZXkgaW4gc2VsZi5faW5kZXgKKworICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2luZGV4Lml0ZXJrZXlzKCkKKyAgICBfX2l0ZXJfXyA9IGl0ZXJrZXlzCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9pbmRleCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fY29tbWl0KCkKKyAgICAgICAgc2VsZi5faW5kZXggPSBzZWxmLl9kYXRmaWxlID0gc2VsZi5fZGlyZmlsZSA9IHNlbGYuX2Jha2ZpbGUgPSBOb25lCisKKyAgICBfX2RlbF9fID0gY2xvc2UKKworICAgIGRlZiBfY2htb2QgKHNlbGYsIGZpbGUpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX29zLCAnY2htb2QnKToKKyAgICAgICAgICAgIHNlbGYuX29zLmNobW9kKGZpbGUsIHNlbGYuX21vZGUpCisKKworZGVmIG9wZW4oZmlsZSwgZmxhZz1Ob25lLCBtb2RlPTA2NjYpOgorICAgICIiIk9wZW4gdGhlIGRhdGFiYXNlIGZpbGUsIGZpbGVuYW1lLCBhbmQgcmV0dXJuIGNvcnJlc3BvbmRpbmcgb2JqZWN0LgorCisgICAgVGhlIGZsYWcgYXJndW1lbnQsIHVzZWQgdG8gY29udHJvbCBob3cgdGhlIGRhdGFiYXNlIGlzIG9wZW5lZCBpbiB0aGUKKyAgICBvdGhlciBEQk0gaW1wbGVtZW50YXRpb25zLCBpcyBpZ25vcmVkIGluIHRoZSBkdW1iZGJtIG1vZHVsZTsgdGhlCisgICAgZGF0YWJhc2UgaXMgYWx3YXlzIG9wZW5lZCBmb3IgdXBkYXRlLCBhbmQgd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKKyAgICBub3QgZXhpc3QuCisKKyAgICBUaGUgb3B0aW9uYWwgbW9kZSBhcmd1bWVudCBpcyB0aGUgVU5JWCBtb2RlIG9mIHRoZSBmaWxlLCB1c2VkIG9ubHkgd2hlbgorICAgIHRoZSBkYXRhYmFzZSBoYXMgdG8gYmUgY3JlYXRlZC4gIEl0IGRlZmF1bHRzIHRvIG9jdGFsIGNvZGUgMDY2NiAoYW5kCisgICAgd2lsbCBiZSBtb2RpZmllZCBieSB0aGUgcHJldmFpbGluZyB1bWFzaykuCisKKyAgICAiIiIKKyAgICAjIGZsYWcgYXJndW1lbnQgaXMgY3VycmVudGx5IGlnbm9yZWQKKworICAgICMgTW9kaWZ5IG1vZGUgZGVwZW5kaW5nIG9uIHRoZSB1bWFzaworICAgIHRyeToKKyAgICAgICAgdW0gPSBfb3MudW1hc2soMCkKKyAgICAgICAgX29zLnVtYXNrKHVtKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgICMgVHVybiBvZmYgYW55IGJpdHMgdGhhdCBhcmUgc2V0IGluIHRoZSB1bWFzaworICAgICAgICBtb2RlID0gbW9kZSAmICh+dW0pCisKKyAgICByZXR1cm4gX0RhdGFiYXNlKGZpbGUsIG1vZGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2R1bWJkYm0ucHljIGIvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjkxY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2R1bWJkYm0ucHlvIGIvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjkxY2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kdW1iZGJtLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZC5weSBiL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGRjNDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZC5weQpAQCAtMCwwICsxLDE0NSBAQAorIiIiRHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIHRocmVhZCBtb2R1bGUuCisKK01lYW50IHRvIGJlIHVzZWQgYXMgYSBicmFpbi1kZWFkIHN1YnN0aXR1dGUgc28gdGhhdCB0aHJlYWRlZCBjb2RlIGRvZXMKK25vdCBuZWVkIHRvIGJlIHJld3JpdHRlbiBmb3Igd2hlbiB0aGUgdGhyZWFkIG1vZHVsZSBpcyBub3QgcHJlc2VudC4KKworU3VnZ2VzdGVkIHVzYWdlIGlzOjoKKworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHRocmVhZAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgaW1wb3J0IGR1bW15X3RocmVhZCBhcyB0aHJlYWQKKworIiIiCisjIEV4cG9ydHMgb25seSB0aGluZ3Mgc3BlY2lmaWVkIGJ5IHRocmVhZCBkb2N1bWVudGF0aW9uOworIyBza2lwcGluZyBvYnNvbGV0ZSBzeW5vbnltcyBhbGxvY2F0ZSgpLCBzdGFydF9uZXcoKSwgZXhpdF90aHJlYWQoKS4KK19fYWxsX18gPSBbJ2Vycm9yJywgJ3N0YXJ0X25ld190aHJlYWQnLCAnZXhpdCcsICdnZXRfaWRlbnQnLCAnYWxsb2NhdGVfbG9jaycsCisgICAgICAgICAgICdpbnRlcnJ1cHRfbWFpbicsICdMb2NrVHlwZSddCisKK2ltcG9ydCB0cmFjZWJhY2sgYXMgX3RyYWNlYmFjaworCitjbGFzcyBlcnJvcihFeGNlcHRpb24pOgorICAgICIiIkR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5lcnJvci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKworZGVmIHN0YXJ0X25ld190aHJlYWQoZnVuY3Rpb24sIGFyZ3MsIGt3YXJncz17fSk6CisgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoKS4KKworICAgIENvbXBhdGliaWxpdHkgaXMgbWFpbnRhaW5lZCBieSBtYWtpbmcgc3VyZSB0aGF0IGBgYXJnc2BgIGlzIGEKKyAgICB0dXBsZSBhbmQgYGBrd2FyZ3NgYCBpcyBhIGRpY3Rpb25hcnkuICBJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkCisgICAgYW5kIGl0IGlzIFN5c3RlbUV4aXQgKHdoaWNoIGNhbiBiZSBkb25lIGJ5IHRocmVhZC5leGl0KCkpIGl0IGlzCisgICAgY2F1Z2h0IGFuZCBub3RoaW5nIGlzIGRvbmU7IGFsbCBvdGhlciBleGNlcHRpb25zIGFyZSBwcmludGVkIG91dAorICAgIGJ5IHVzaW5nIHRyYWNlYmFjay5wcmludF9leGMoKS4KKworICAgIElmIHRoZSBleGVjdXRlZCBmdW5jdGlvbiBjYWxscyBpbnRlcnJ1cHRfbWFpbiB0aGUgS2V5Ym9hcmRJbnRlcnJ1cHQgd2lsbCBiZQorICAgIHJhaXNlZCB3aGVuIHRoZSBmdW5jdGlvbiByZXR1cm5zLgorCisgICAgIiIiCisgICAgaWYgdHlwZShhcmdzKSAhPSB0eXBlKHR1cGxlKCkpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIjJuZCBhcmcgbXVzdCBiZSBhIHR1cGxlIikKKyAgICBpZiB0eXBlKGt3YXJncykgIT0gdHlwZShkaWN0KCkpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIjNyZCBhcmcgbXVzdCBiZSBhIGRpY3QiKQorICAgIGdsb2JhbCBfbWFpbgorICAgIF9tYWluID0gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIGZ1bmN0aW9uKCphcmdzLCAqKmt3YXJncykKKyAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgcGFzcworICAgIGV4Y2VwdDoKKyAgICAgICAgX3RyYWNlYmFjay5wcmludF9leGMoKQorICAgIF9tYWluID0gVHJ1ZQorICAgIGdsb2JhbCBfaW50ZXJydXB0CisgICAgaWYgX2ludGVycnVwdDoKKyAgICAgICAgX2ludGVycnVwdCA9IEZhbHNlCisgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisKK2RlZiBleGl0KCk6CisgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLmV4aXQoKS4iIiIKKyAgICByYWlzZSBTeXN0ZW1FeGl0CisKK2RlZiBnZXRfaWRlbnQoKToKKyAgICAiIiJEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuZ2V0X2lkZW50KCkuCisKKyAgICBTaW5jZSB0aGlzIG1vZHVsZSBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhyZWFkbW9kdWxlIGlzIG5vdAorICAgIGF2YWlsYWJsZSwgaXQgaXMgc2FmZSB0byBhc3N1bWUgdGhhdCB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHRoZQorICAgIG9ubHkgdGhyZWFkLiAgVGh1cyBhIGNvbnN0YW50IGNhbiBiZSBzYWZlbHkgcmV0dXJuZWQuCisgICAgIiIiCisgICAgcmV0dXJuIC0xCisKK2RlZiBhbGxvY2F0ZV9sb2NrKCk6CisgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLmFsbG9jYXRlX2xvY2soKS4iIiIKKyAgICByZXR1cm4gTG9ja1R5cGUoKQorCitkZWYgc3RhY2tfc2l6ZShzaXplPU5vbmUpOgorICAgICIiIkR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5zdGFja19zaXplKCkuIiIiCisgICAgaWYgc2l6ZSBpcyBub3QgTm9uZToKKyAgICAgICAgcmFpc2UgZXJyb3IoInNldHRpbmcgdGhyZWFkIHN0YWNrIHNpemUgbm90IHN1cHBvcnRlZCIpCisgICAgcmV0dXJuIDAKKworY2xhc3MgTG9ja1R5cGUob2JqZWN0KToKKyAgICAiIiJDbGFzcyBpbXBsZW1lbnRpbmcgZHVtbXkgaW1wbGVtZW50YXRpb24gb2YgdGhyZWFkLkxvY2tUeXBlLgorCisgICAgQ29tcGF0aWJpbGl0eSBpcyBtYWludGFpbmVkIGJ5IG1haW50YWluaW5nIHNlbGYubG9ja2VkX3N0YXR1cworICAgIHdoaWNoIGlzIGEgYm9vbGVhbiB0aGF0IHN0b3JlcyB0aGUgc3RhdGUgb2YgdGhlIGxvY2suICBQaWNrbGluZyBvZgorICAgIHRoZSBsb2NrLCB0aG91Z2gsIHNob3VsZCBub3QgYmUgZG9uZSBzaW5jZSBpZiB0aGUgdGhyZWFkIG1vZHVsZSBpcworICAgIHRoZW4gdXNlZCB3aXRoIGFuIHVucGlja2xlZCBgYGxvY2soKWBgIGZyb20gaGVyZSBwcm9ibGVtcyBjb3VsZAorICAgIG9jY3VyIGZyb20gdGhpcyBjbGFzcyBub3QgaGF2aW5nIGF0b21pYyBtZXRob2RzLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubG9ja2VkX3N0YXR1cyA9IEZhbHNlCisKKyAgICBkZWYgYWNxdWlyZShzZWxmLCB3YWl0ZmxhZz1Ob25lKToKKyAgICAgICAgIiIiRHVtbXkgaW1wbGVtZW50YXRpb24gb2YgYWNxdWlyZSgpLgorCisgICAgICAgIEZvciBibG9ja2luZyBjYWxscywgc2VsZi5sb2NrZWRfc3RhdHVzIGlzIGF1dG9tYXRpY2FsbHkgc2V0IHRvCisgICAgICAgIFRydWUgYW5kIHJldHVybmVkIGFwcHJvcHJpYXRlbHkgYmFzZWQgb24gdmFsdWUgb2YKKyAgICAgICAgYGB3YWl0ZmxhZ2BgLiAgSWYgaXQgaXMgbm9uLWJsb2NraW5nLCB0aGVuIHRoZSB2YWx1ZSBpcworICAgICAgICBhY3R1YWxseSBjaGVja2VkIGFuZCBub3Qgc2V0IGlmIGl0IGlzIGFscmVhZHkgYWNxdWlyZWQuICBUaGlzCisgICAgICAgIGlzIGFsbCBkb25lIHNvIHRoYXQgdGhyZWFkaW5nLkNvbmRpdGlvbidzIGFzc2VydCBzdGF0ZW1lbnRzCisgICAgICAgIGFyZW4ndCB0cmlnZ2VyZWQgYW5kIHRocm93IGEgbGl0dGxlIGZpdC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgd2FpdGZsYWcgaXMgTm9uZSBvciB3YWl0ZmxhZzoKKyAgICAgICAgICAgIHNlbGYubG9ja2VkX3N0YXR1cyA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5sb2NrZWRfc3RhdHVzOgorICAgICAgICAgICAgICAgIHNlbGYubG9ja2VkX3N0YXR1cyA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIF9fZW50ZXJfXyA9IGFjcXVpcmUKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXAsIHZhbCwgdGIpOgorICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgICIiIlJlbGVhc2UgdGhlIGR1bW15IGxvY2suIiIiCisgICAgICAgICMgWFhYIFBlcmhhcHMgc2hvdWxkbid0IGFjdHVhbGx5IGJvdGhlciB0byB0ZXN0PyAgQ291bGQgbGVhZAorICAgICAgICAjICAgICB0byBwcm9ibGVtcyBmb3IgY29tcGxleCwgdGhyZWFkZWQgY29kZS4KKyAgICAgICAgaWYgbm90IHNlbGYubG9ja2VkX3N0YXR1czoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yCisgICAgICAgIHNlbGYubG9ja2VkX3N0YXR1cyA9IEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgbG9ja2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sb2NrZWRfc3RhdHVzCisKKyMgVXNlZCB0byBzaWduYWwgdGhhdCBpbnRlcnJ1cHRfbWFpbiB3YXMgY2FsbGVkIGluIGEgInRocmVhZCIKK19pbnRlcnJ1cHQgPSBGYWxzZQorIyBUcnVlIHdoZW4gbm90IGV4ZWN1dGluZyBpbiBhICJ0aHJlYWQiCitfbWFpbiA9IFRydWUKKworZGVmIGludGVycnVwdF9tYWluKCk6CisgICAgIiIiU2V0IF9pbnRlcnJ1cHQgZmxhZyB0byBUcnVlIHRvIGhhdmUgc3RhcnRfbmV3X3RocmVhZCByYWlzZQorICAgIEtleWJvYXJkSW50ZXJydXB0IHVwb24gZXhpdGluZy4iIiIKKyAgICBpZiBfbWFpbjoKKyAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICBlbHNlOgorICAgICAgICBnbG9iYWwgX2ludGVycnVwdAorICAgICAgICBfaW50ZXJydXB0ID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHljIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTBhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHlvIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTBhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWRpbmcucHkgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTAyOGEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9kdW1teV90aHJlYWRpbmcucHkKQEAgLTAsMCArMSw3OCBAQAorIiIiRmF1eCBgYHRocmVhZGluZ2BgIHZlcnNpb24gdXNpbmcgYGBkdW1teV90aHJlYWRgYCBpbnN0ZWFkIG9mIGBgdGhyZWFkYGAuCisKK1RoZSBtb2R1bGUgYGBfZHVtbXlfdGhyZWFkaW5nYGAgaXMgYWRkZWQgdG8gYGBzeXMubW9kdWxlc2BgIGluIG9yZGVyCit0byBub3QgaGF2ZSBgYHRocmVhZGluZ2BgIGNvbnNpZGVyZWQgaW1wb3J0ZWQuICBIYWQgYGB0aHJlYWRpbmdgYCBiZWVuCitkaXJlY3RseSBpbXBvcnRlZCBpdCB3b3VsZCBoYXZlIG1hZGUgYWxsIHN1YnNlcXVlbnQgaW1wb3J0cyBzdWNjZWVkCityZWdhcmRsZXNzIG9mIHdoZXRoZXIgYGB0aHJlYWRgYCB3YXMgYXZhaWxhYmxlIHdoaWNoIGlzIG5vdCBkZXNpcmVkLgorCisiIiIKK2Zyb20gc3lzIGltcG9ydCBtb2R1bGVzIGFzIHN5c19tb2R1bGVzCisKK2ltcG9ydCBkdW1teV90aHJlYWQKKworIyBEZWNsYXJpbmcgbm93IHNvIGFzIHRvIG5vdCBoYXZlIHRvIG5lc3QgYGB0cnlgYHMgdG8gZ2V0IHByb3BlciBjbGVhbi11cC4KK2hvbGRpbmdfdGhyZWFkID0gRmFsc2UKK2hvbGRpbmdfdGhyZWFkaW5nID0gRmFsc2UKK2hvbGRpbmdfX3RocmVhZGluZ19sb2NhbCA9IEZhbHNlCisKK3RyeToKKyAgICAjIENvdWxkIGhhdmUgY2hlY2tlZCBpZiBgYHRocmVhZGBgIHdhcyBub3QgaW4gc3lzLm1vZHVsZXMgYW5kIGdvbmUKKyAgICAjIGEgZGlmZmVyZW50IHJvdXRlLCBidXQgZGVjaWRlZCB0byBtaXJyb3IgdGVjaG5pcXVlIHVzZWQgd2l0aAorICAgICMgYGB0aHJlYWRpbmdgYCBiZWxvdy4KKyAgICBpZiAndGhyZWFkJyBpbiBzeXNfbW9kdWxlczoKKyAgICAgICAgaGVsZF90aHJlYWQgPSBzeXNfbW9kdWxlc1sndGhyZWFkJ10KKyAgICAgICAgaG9sZGluZ190aHJlYWQgPSBUcnVlCisgICAgIyBNdXN0IGhhdmUgc29tZSBtb2R1bGUgbmFtZWQgYGB0aHJlYWRgYCB0aGF0IGltcGxlbWVudHMgaXRzIEFQSQorICAgICMgaW4gb3JkZXIgdG8gaW5pdGlhbGx5IGltcG9ydCBgYHRocmVhZGluZ2BgLgorICAgIHN5c19tb2R1bGVzWyd0aHJlYWQnXSA9IHN5c19tb2R1bGVzWydkdW1teV90aHJlYWQnXQorCisgICAgaWYgJ3RocmVhZGluZycgaW4gc3lzX21vZHVsZXM6CisgICAgICAgICMgSWYgYGB0aHJlYWRpbmdgYCBpcyBhbHJlYWR5IGltcG9ydGVkLCBtaWdodCBhcyB3ZWxsIHByZXZlbnQKKyAgICAgICAgIyB0cnlpbmcgdG8gaW1wb3J0IGl0IG1vcmUgdGhhbiBuZWVkZWQgYnkgc2F2aW5nIGl0IGlmIGl0IGlzCisgICAgICAgICMgYWxyZWFkeSBpbXBvcnRlZCBiZWZvcmUgZGVsZXRpbmcgaXQuCisgICAgICAgIGhlbGRfdGhyZWFkaW5nID0gc3lzX21vZHVsZXNbJ3RocmVhZGluZyddCisgICAgICAgIGhvbGRpbmdfdGhyZWFkaW5nID0gVHJ1ZQorICAgICAgICBkZWwgc3lzX21vZHVsZXNbJ3RocmVhZGluZyddCisKKyAgICBpZiAnX3RocmVhZGluZ19sb2NhbCcgaW4gc3lzX21vZHVsZXM6CisgICAgICAgICMgSWYgYGBfdGhyZWFkaW5nX2xvY2FsYGAgaXMgYWxyZWFkeSBpbXBvcnRlZCwgbWlnaHQgYXMgd2VsbCBwcmV2ZW50CisgICAgICAgICMgdHJ5aW5nIHRvIGltcG9ydCBpdCBtb3JlIHRoYW4gbmVlZGVkIGJ5IHNhdmluZyBpdCBpZiBpdCBpcworICAgICAgICAjIGFscmVhZHkgaW1wb3J0ZWQgYmVmb3JlIGRlbGV0aW5nIGl0LgorICAgICAgICBoZWxkX190aHJlYWRpbmdfbG9jYWwgPSBzeXNfbW9kdWxlc1snX3RocmVhZGluZ19sb2NhbCddCisgICAgICAgIGhvbGRpbmdfX3RocmVhZGluZ19sb2NhbCA9IFRydWUKKyAgICAgICAgZGVsIHN5c19tb2R1bGVzWydfdGhyZWFkaW5nX2xvY2FsJ10KKworICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICAjIE5lZWQgYSBjb3B5IG9mIHRoZSBjb2RlIGtlcHQgc29tZXdoZXJlLi4uCisgICAgc3lzX21vZHVsZXNbJ19kdW1teV90aHJlYWRpbmcnXSA9IHN5c19tb2R1bGVzWyd0aHJlYWRpbmcnXQorICAgIGRlbCBzeXNfbW9kdWxlc1sndGhyZWFkaW5nJ10KKyAgICBzeXNfbW9kdWxlc1snX2R1bW15X190aHJlYWRpbmdfbG9jYWwnXSA9IHN5c19tb2R1bGVzWydfdGhyZWFkaW5nX2xvY2FsJ10KKyAgICBkZWwgc3lzX21vZHVsZXNbJ190aHJlYWRpbmdfbG9jYWwnXQorICAgIGZyb20gX2R1bW15X3RocmVhZGluZyBpbXBvcnQgKgorICAgIGZyb20gX2R1bW15X3RocmVhZGluZyBpbXBvcnQgX19hbGxfXworCitmaW5hbGx5OgorICAgICMgUHV0IGJhY2sgYGB0aHJlYWRpbmdgYCBpZiB3ZSBvdmVyd3JvdGUgZWFybGllcgorCisgICAgaWYgaG9sZGluZ190aHJlYWRpbmc6CisgICAgICAgIHN5c19tb2R1bGVzWyd0aHJlYWRpbmcnXSA9IGhlbGRfdGhyZWFkaW5nCisgICAgICAgIGRlbCBoZWxkX3RocmVhZGluZworICAgIGRlbCBob2xkaW5nX3RocmVhZGluZworCisgICAgIyBQdXQgYmFjayBgYF90aHJlYWRpbmdfbG9jYWxgYCBpZiB3ZSBvdmVyd3JvdGUgZWFybGllcgorCisgICAgaWYgaG9sZGluZ19fdGhyZWFkaW5nX2xvY2FsOgorICAgICAgICBzeXNfbW9kdWxlc1snX3RocmVhZGluZ19sb2NhbCddID0gaGVsZF9fdGhyZWFkaW5nX2xvY2FsCisgICAgICAgIGRlbCBoZWxkX190aHJlYWRpbmdfbG9jYWwKKyAgICBkZWwgaG9sZGluZ19fdGhyZWFkaW5nX2xvY2FsCisKKyAgICAjIFB1dCBiYWNrIGBgdGhyZWFkYGAgaWYgd2Ugb3Zlcndyb3RlLCBlbHNlIGRlbCB0aGUgZW50cnkgd2UgbWFkZQorICAgIGlmIGhvbGRpbmdfdGhyZWFkOgorICAgICAgICBzeXNfbW9kdWxlc1sndGhyZWFkJ10gPSBoZWxkX3RocmVhZAorICAgICAgICBkZWwgaGVsZF90aHJlYWQKKyAgICBlbHNlOgorICAgICAgICBkZWwgc3lzX21vZHVsZXNbJ3RocmVhZCddCisgICAgZGVsIGhvbGRpbmdfdGhyZWFkCisKKyAgICBkZWwgZHVtbXlfdGhyZWFkCisgICAgZGVsIHN5c19tb2R1bGVzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZGluZy5weWMgYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZGluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0ZjFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZGluZy5weW8gYi9saWIvcHl0aG9uMi43L2R1bW15X3RocmVhZGluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0ZjFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZHVtbXlfdGhyZWFkaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzgwZWJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDEyMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJBIHBhY2thZ2UgZm9yIHBhcnNpbmcsIGhhbmRsaW5nLCBhbmQgZ2VuZXJhdGluZyBlbWFpbCBtZXNzYWdlcy4iIiIKKworX192ZXJzaW9uX18gPSAnNC4wLjMnCisKK19fYWxsX18gPSBbCisgICAgIyBPbGQgbmFtZXMKKyAgICAnYmFzZTY0TUlNRScsCisgICAgJ0NoYXJzZXQnLAorICAgICdFbmNvZGVycycsCisgICAgJ0Vycm9ycycsCisgICAgJ0dlbmVyYXRvcicsCisgICAgJ0hlYWRlcicsCisgICAgJ0l0ZXJhdG9ycycsCisgICAgJ01lc3NhZ2UnLAorICAgICdNSU1FQXVkaW8nLAorICAgICdNSU1FQmFzZScsCisgICAgJ01JTUVJbWFnZScsCisgICAgJ01JTUVNZXNzYWdlJywKKyAgICAnTUlNRU11bHRpcGFydCcsCisgICAgJ01JTUVOb25NdWx0aXBhcnQnLAorICAgICdNSU1FVGV4dCcsCisgICAgJ1BhcnNlcicsCisgICAgJ3F1b3ByaU1JTUUnLAorICAgICdVdGlscycsCisgICAgJ21lc3NhZ2VfZnJvbV9zdHJpbmcnLAorICAgICdtZXNzYWdlX2Zyb21fZmlsZScsCisgICAgIyBuZXcgbmFtZXMKKyAgICAnYmFzZTY0bWltZScsCisgICAgJ2NoYXJzZXQnLAorICAgICdlbmNvZGVycycsCisgICAgJ2Vycm9ycycsCisgICAgJ2dlbmVyYXRvcicsCisgICAgJ2hlYWRlcicsCisgICAgJ2l0ZXJhdG9ycycsCisgICAgJ21lc3NhZ2UnLAorICAgICdtaW1lJywKKyAgICAncGFyc2VyJywKKyAgICAncXVvcHJpbWltZScsCisgICAgJ3V0aWxzJywKKyAgICBdCisKKworDAorIyBTb21lIGNvbnZlbmllbmNlIHJvdXRpbmVzLiAgRG9uJ3QgaW1wb3J0IFBhcnNlciBhbmQgTWVzc2FnZSBhcyBzaWRlLWVmZmVjdHMKKyMgb2YgaW1wb3J0aW5nIGVtYWlsIHNpbmNlIHRob3NlIGNhc2NhZGluZ2x5IGltcG9ydCBtb3N0IG9mIHRoZSByZXN0IG9mIHRoZQorIyBlbWFpbCBwYWNrYWdlLgorZGVmIG1lc3NhZ2VfZnJvbV9zdHJpbmcocywgKmFyZ3MsICoqa3dzKToKKyAgICAiIiJQYXJzZSBhIHN0cmluZyBpbnRvIGEgTWVzc2FnZSBvYmplY3QgbW9kZWwuCisKKyAgICBPcHRpb25hbCBfY2xhc3MgYW5kIHN0cmljdCBhcmUgcGFzc2VkIHRvIHRoZSBQYXJzZXIgY29uc3RydWN0b3IuCisgICAgIiIiCisgICAgZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlcgorICAgIHJldHVybiBQYXJzZXIoKmFyZ3MsICoqa3dzKS5wYXJzZXN0cihzKQorCisKK2RlZiBtZXNzYWdlX2Zyb21fZmlsZShmcCwgKmFyZ3MsICoqa3dzKToKKyAgICAiIiJSZWFkIGEgZmlsZSBhbmQgcGFyc2UgaXRzIGNvbnRlbnRzIGludG8gYSBNZXNzYWdlIG9iamVjdCBtb2RlbC4KKworICAgIE9wdGlvbmFsIF9jbGFzcyBhbmQgc3RyaWN0IGFyZSBwYXNzZWQgdG8gdGhlIFBhcnNlciBjb25zdHJ1Y3Rvci4KKyAgICAiIiIKKyAgICBmcm9tIGVtYWlsLnBhcnNlciBpbXBvcnQgUGFyc2VyCisgICAgcmV0dXJuIFBhcnNlcigqYXJncywgKiprd3MpLnBhcnNlKGZwKQorCisKKwwKKyMgTGF6eSBsb2FkaW5nIHRvIHByb3ZpZGUgbmFtZSBtYXBwaW5nIGZyb20gbmV3LXN0eWxlIG5hbWVzIChQRVAgOCBjb21wYXRpYmxlCisjIGVtYWlsIDQuMCBtb2R1bGUgbmFtZXMpLCB0byBvbGQtc3R5bGUgbmFtZXMgKGVtYWlsIDMuMCBtb2R1bGUgbmFtZXMpLgoraW1wb3J0IHN5cworCitjbGFzcyBMYXp5SW1wb3J0ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kdWxlX25hbWUpOgorICAgICAgICBzZWxmLl9fbmFtZV9fID0gJ2VtYWlsLicgKyBtb2R1bGVfbmFtZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBfX2ltcG9ydF9fKHNlbGYuX19uYW1lX18pCisgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW3NlbGYuX19uYW1lX19dCisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKG1vZC5fX2RpY3RfXykKKyAgICAgICAgcmV0dXJuIGdldGF0dHIobW9kLCBuYW1lKQorCisKK19MT1dFUk5BTUVTID0gWworICAgICMgZW1haWwuPG9sZCBuYW1lPiAtPiBlbWFpbC48bmV3IG5hbWUgaXMgbG93ZXJjYXNlZCBvbGQgbmFtZT4KKyAgICAnQ2hhcnNldCcsCisgICAgJ0VuY29kZXJzJywKKyAgICAnRXJyb3JzJywKKyAgICAnRmVlZFBhcnNlcicsCisgICAgJ0dlbmVyYXRvcicsCisgICAgJ0hlYWRlcicsCisgICAgJ0l0ZXJhdG9ycycsCisgICAgJ01lc3NhZ2UnLAorICAgICdQYXJzZXInLAorICAgICdVdGlscycsCisgICAgJ2Jhc2U2NE1JTUUnLAorICAgICdxdW9wcmlNSU1FJywKKyAgICBdCisKK19NSU1FTkFNRVMgPSBbCisgICAgIyBlbWFpbC5NSU1FPG9sZCBuYW1lPiAtPiBlbWFpbC5taW1lLjxuZXcgbmFtZSBpcyBsb3dlcmNhc2VkIG9sZCBuYW1lPgorICAgICdBdWRpbycsCisgICAgJ0Jhc2UnLAorICAgICdJbWFnZScsCisgICAgJ01lc3NhZ2UnLAorICAgICdNdWx0aXBhcnQnLAorICAgICdOb25NdWx0aXBhcnQnLAorICAgICdUZXh0JywKKyAgICBdCisKK2ZvciBfbmFtZSBpbiBfTE9XRVJOQU1FUzoKKyAgICBpbXBvcnRlciA9IExhenlJbXBvcnRlcihfbmFtZS5sb3dlcigpKQorICAgIHN5cy5tb2R1bGVzWydlbWFpbC4nICsgX25hbWVdID0gaW1wb3J0ZXIKKyAgICBzZXRhdHRyKHN5cy5tb2R1bGVzWydlbWFpbCddLCBfbmFtZSwgaW1wb3J0ZXIpCisKKworaW1wb3J0IGVtYWlsLm1pbWUKK2ZvciBfbmFtZSBpbiBfTUlNRU5BTUVTOgorICAgIGltcG9ydGVyID0gTGF6eUltcG9ydGVyKCdtaW1lLicgKyBfbmFtZS5sb3dlcigpKQorICAgIHN5cy5tb2R1bGVzWydlbWFpbC5NSU1FJyArIF9uYW1lXSA9IGltcG9ydGVyCisgICAgc2V0YXR0cihzeXMubW9kdWxlc1snZW1haWwnXSwgJ01JTUUnICsgX25hbWUsIGltcG9ydGVyKQorICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbJ2VtYWlsLm1pbWUnXSwgX25hbWUsIGltcG9ydGVyKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWExMWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWExMWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9fcGFyc2VhZGRyLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9fcGFyc2VhZGRyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGRiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL19wYXJzZWFkZHIucHkKQEAgLTAsMCArMSw0OTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDcgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiRW1haWwgYWRkcmVzcyBwYXJzaW5nIGNvZGUuCisKK0xpZnRlZCBkaXJlY3RseSBmcm9tIHJmYzgyMi5weS4gIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmV3cml0dGVuLgorIiIiCisKK19fYWxsX18gPSBbCisgICAgJ21rdGltZV90eicsCisgICAgJ3BhcnNlZGF0ZScsCisgICAgJ3BhcnNlZGF0ZV90eicsCisgICAgJ3F1b3RlJywKKyAgICBdCisKK2ltcG9ydCB0aW1lLCBjYWxlbmRhcgorCitTUEFDRSA9ICcgJworRU1QVFlTVFJJTkcgPSAnJworQ09NTUFTUEFDRSA9ICcsICcKKworIyBQYXJzZSBhIGRhdGUgZmllbGQKK19tb250aG5hbWVzID0gWydqYW4nLCAnZmViJywgJ21hcicsICdhcHInLCAnbWF5JywgJ2p1bicsICdqdWwnLAorICAgICAgICAgICAgICAgJ2F1ZycsICdzZXAnLCAnb2N0JywgJ25vdicsICdkZWMnLAorICAgICAgICAgICAgICAgJ2phbnVhcnknLCAnZmVicnVhcnknLCAnbWFyY2gnLCAnYXByaWwnLCAnbWF5JywgJ2p1bmUnLCAnanVseScsCisgICAgICAgICAgICAgICAnYXVndXN0JywgJ3NlcHRlbWJlcicsICdvY3RvYmVyJywgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJ10KKworX2RheW5hbWVzID0gWydtb24nLCAndHVlJywgJ3dlZCcsICd0aHUnLCAnZnJpJywgJ3NhdCcsICdzdW4nXQorCisjIFRoZSB0aW1lem9uZSB0YWJsZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBtaWxpdGFyeSB0aW1lIHpvbmVzIGRlZmluZWQKKyMgaW4gUkZDODIyLCBvdGhlciB0aGFuIFouICBBY2NvcmRpbmcgdG8gUkZDMTEyMywgdGhlIGRlc2NyaXB0aW9uIGluCisjIFJGQzgyMiBnZXRzIHRoZSBzaWducyB3cm9uZywgc28gd2UgY2FuJ3QgcmVseSBvbiBhbnkgc3VjaCB0aW1lCisjIHpvbmVzLiAgUkZDMTEyMyByZWNvbW1lbmRzIHRoYXQgbnVtZXJpYyB0aW1lem9uZSBpbmRpY2F0b3JzIGJlIHVzZWQKKyMgaW5zdGVhZCBvZiB0aW1lem9uZSBuYW1lcy4KKworX3RpbWV6b25lcyA9IHsnVVQnOjAsICdVVEMnOjAsICdHTVQnOjAsICdaJzowLAorICAgICAgICAgICAgICAnQVNUJzogLTQwMCwgJ0FEVCc6IC0zMDAsICAjIEF0bGFudGljICh1c2VkIGluIENhbmFkYSkKKyAgICAgICAgICAgICAgJ0VTVCc6IC01MDAsICdFRFQnOiAtNDAwLCAgIyBFYXN0ZXJuCisgICAgICAgICAgICAgICdDU1QnOiAtNjAwLCAnQ0RUJzogLTUwMCwgICMgQ2VudHJhbAorICAgICAgICAgICAgICAnTVNUJzogLTcwMCwgJ01EVCc6IC02MDAsICAjIE1vdW50YWluCisgICAgICAgICAgICAgICdQU1QnOiAtODAwLCAnUERUJzogLTcwMCAgICMgUGFjaWZpYworICAgICAgICAgICAgICB9CisKKworZGVmIHBhcnNlZGF0ZV90eihkYXRhKToKKyAgICAiIiJDb252ZXJ0IGEgZGF0ZSBzdHJpbmcgdG8gYSB0aW1lIHR1cGxlLgorCisgICAgQWNjb3VudHMgZm9yIG1pbGl0YXJ5IHRpbWV6b25lcy4KKyAgICAiIiIKKyAgICBkYXRhID0gZGF0YS5zcGxpdCgpCisgICAgIyBUaGUgRldTIGFmdGVyIHRoZSBjb21tYSBhZnRlciB0aGUgZGF5LW9mLXdlZWsgaXMgb3B0aW9uYWwsIHNvIHNlYXJjaCBhbmQKKyAgICAjIGFkanVzdCBmb3IgdGhpcy4KKyAgICBpZiBkYXRhWzBdLmVuZHN3aXRoKCcsJykgb3IgZGF0YVswXS5sb3dlcigpIGluIF9kYXluYW1lczoKKyAgICAgICAgIyBUaGVyZSdzIGEgZGF5bmFtZSBoZXJlLiBTa2lwIGl0CisgICAgICAgIGRlbCBkYXRhWzBdCisgICAgZWxzZToKKyAgICAgICAgaSA9IGRhdGFbMF0ucmZpbmQoJywnKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICBkYXRhWzBdID0gZGF0YVswXVtpKzE6XQorICAgIGlmIGxlbihkYXRhKSA9PSAzOiAjIFJGQyA4NTAgZGF0ZSwgZGVwcmVjYXRlZAorICAgICAgICBzdHVmZiA9IGRhdGFbMF0uc3BsaXQoJy0nKQorICAgICAgICBpZiBsZW4oc3R1ZmYpID09IDM6CisgICAgICAgICAgICBkYXRhID0gc3R1ZmYgKyBkYXRhWzE6XQorICAgIGlmIGxlbihkYXRhKSA9PSA0OgorICAgICAgICBzID0gZGF0YVszXQorICAgICAgICBpID0gcy5maW5kKCcrJykKKyAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICBkYXRhWzM6XSA9IFtzWzppXSwgc1tpKzE6XV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKCcnKSAjIER1bW15IHR6CisgICAgaWYgbGVuKGRhdGEpIDwgNToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkYXRhID0gZGF0YVs6NV0KKyAgICBbZGQsIG1tLCB5eSwgdG0sIHR6XSA9IGRhdGEKKyAgICBtbSA9IG1tLmxvd2VyKCkKKyAgICBpZiBtbSBub3QgaW4gX21vbnRobmFtZXM6CisgICAgICAgIGRkLCBtbSA9IG1tLCBkZC5sb3dlcigpCisgICAgICAgIGlmIG1tIG5vdCBpbiBfbW9udGhuYW1lczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgbW0gPSBfbW9udGhuYW1lcy5pbmRleChtbSkgKyAxCisgICAgaWYgbW0gPiAxMjoKKyAgICAgICAgbW0gLT0gMTIKKyAgICBpZiBkZFstMV0gPT0gJywnOgorICAgICAgICBkZCA9IGRkWzotMV0KKyAgICBpID0geXkuZmluZCgnOicpCisgICAgaWYgaSA+IDA6CisgICAgICAgIHl5LCB0bSA9IHRtLCB5eQorICAgIGlmIHl5Wy0xXSA9PSAnLCc6CisgICAgICAgIHl5ID0geXlbOi0xXQorICAgIGlmIG5vdCB5eVswXS5pc2RpZ2l0KCk6CisgICAgICAgIHl5LCB0eiA9IHR6LCB5eQorICAgIGlmIHRtWy0xXSA9PSAnLCc6CisgICAgICAgIHRtID0gdG1bOi0xXQorICAgIHRtID0gdG0uc3BsaXQoJzonKQorICAgIGlmIGxlbih0bSkgPT0gMjoKKyAgICAgICAgW3RoaCwgdG1tXSA9IHRtCisgICAgICAgIHRzcyA9ICcwJworICAgIGVsaWYgbGVuKHRtKSA9PSAzOgorICAgICAgICBbdGhoLCB0bW0sIHRzc10gPSB0bQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisgICAgdHJ5OgorICAgICAgICB5eSA9IGludCh5eSkKKyAgICAgICAgZGQgPSBpbnQoZGQpCisgICAgICAgIHRoaCA9IGludCh0aGgpCisgICAgICAgIHRtbSA9IGludCh0bW0pCisgICAgICAgIHRzcyA9IGludCh0c3MpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgIyBDaGVjayBmb3IgYSB5eSBzcGVjaWZpZWQgaW4gdHdvLWRpZ2l0IGZvcm1hdCwgdGhlbiBjb252ZXJ0IGl0IHRvIHRoZQorICAgICMgYXBwcm9wcmlhdGUgZm91ci1kaWdpdCBmb3JtYXQsIGFjY29yZGluZyB0byB0aGUgUE9TSVggc3RhbmRhcmQuIFJGQyA4MjIKKyAgICAjIGNhbGxzIGZvciBhIHR3by1kaWdpdCB5eSwgYnV0IFJGQyAyODIyICh3aGljaCBvYnNvbGV0ZXMgUkZDIDgyMikKKyAgICAjIG1hbmRhdGVzIGEgNC1kaWdpdCB5eS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IKKyAgICAjIHRoZSB0aW1lIG1vZHVsZS4KKyAgICBpZiB5eSA8IDEwMDoKKyAgICAgICAgIyBUaGUgeWVhciBpcyBiZXR3ZWVuIDE5NjkgYW5kIDE5OTkgKGluY2x1c2l2ZSkuCisgICAgICAgIGlmIHl5ID4gNjg6CisgICAgICAgICAgICB5eSArPSAxOTAwCisgICAgICAgICMgVGhlIHllYXIgaXMgYmV0d2VlbiAyMDAwIGFuZCAyMDY4IChpbmNsdXNpdmUpLgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeXkgKz0gMjAwMAorICAgIHR6b2Zmc2V0ID0gTm9uZQorICAgIHR6ID0gdHoudXBwZXIoKQorICAgIGlmIHR6IGluIF90aW1lem9uZXM6CisgICAgICAgIHR6b2Zmc2V0ID0gX3RpbWV6b25lc1t0el0KKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0em9mZnNldCA9IGludCh0eikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgIyBDb252ZXJ0IGEgdGltZXpvbmUgb2Zmc2V0IGludG8gc2Vjb25kcyA7IC0wNTAwIC0+IC0xODAwMAorICAgIGlmIHR6b2Zmc2V0OgorICAgICAgICBpZiB0em9mZnNldCA8IDA6CisgICAgICAgICAgICB0enNpZ24gPSAtMQorICAgICAgICAgICAgdHpvZmZzZXQgPSAtdHpvZmZzZXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHR6c2lnbiA9IDEKKyAgICAgICAgdHpvZmZzZXQgPSB0enNpZ24gKiAoICh0em9mZnNldC8vMTAwKSozNjAwICsgKHR6b2Zmc2V0ICUgMTAwKSo2MCkKKyAgICAjIERheWxpZ2h0IFNhdmluZyBUaW1lIGZsYWcgaXMgc2V0IHRvIC0xLCBzaW5jZSBEU1QgaXMgdW5rbm93bi4KKyAgICByZXR1cm4geXksIG1tLCBkZCwgdGhoLCB0bW0sIHRzcywgMCwgMSwgLTEsIHR6b2Zmc2V0CisKKworZGVmIHBhcnNlZGF0ZShkYXRhKToKKyAgICAiIiJDb252ZXJ0IGEgdGltZSBzdHJpbmcgdG8gYSB0aW1lIHR1cGxlLiIiIgorICAgIHQgPSBwYXJzZWRhdGVfdHooZGF0YSkKKyAgICBpZiBpc2luc3RhbmNlKHQsIHR1cGxlKToKKyAgICAgICAgcmV0dXJuIHRbOjldCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHQKKworCitkZWYgbWt0aW1lX3R6KGRhdGEpOgorICAgICIiIlR1cm4gYSAxMC10dXBsZSBhcyByZXR1cm5lZCBieSBwYXJzZWRhdGVfdHooKSBpbnRvIGEgUE9TSVggdGltZXN0YW1wLiIiIgorICAgIGlmIGRhdGFbOV0gaXMgTm9uZToKKyAgICAgICAgIyBObyB6b25lIGluZm8sIHNvIGxvY2FsdGltZSBpcyBiZXR0ZXIgYXNzdW1wdGlvbiB0aGFuIEdNVAorICAgICAgICByZXR1cm4gdGltZS5ta3RpbWUoZGF0YVs6OF0gKyAoLTEsKSkKKyAgICBlbHNlOgorICAgICAgICB0ID0gY2FsZW5kYXIudGltZWdtKGRhdGEpCisgICAgICAgIHJldHVybiB0IC0gZGF0YVs5XQorCisKK2RlZiBxdW90ZShzdHIpOgorICAgICIiIlByZXBhcmUgc3RyaW5nIHRvIGJlIHVzZWQgaW4gYSBxdW90ZWQgc3RyaW5nLgorCisgICAgVHVybnMgYmFja3NsYXNoIGFuZCBkb3VibGUgcXVvdGUgY2hhcmFjdGVycyBpbnRvIHF1b3RlZCBwYWlycy4gIFRoZXNlCisgICAgYXJlIHRoZSBvbmx5IGNoYXJhY3RlcnMgdGhhdCBuZWVkIHRvIGJlIHF1b3RlZCBpbnNpZGUgYSBxdW90ZWQgc3RyaW5nLgorICAgIERvZXMgbm90IGFkZCB0aGUgc3Vycm91bmRpbmcgZG91YmxlIHF1b3Rlcy4KKyAgICAiIiIKKyAgICByZXR1cm4gc3RyLnJlcGxhY2UoJ1xcJywgJ1xcXFwnKS5yZXBsYWNlKCciJywgJ1xcIicpCisKKworY2xhc3MgQWRkcmxpc3RDbGFzczoKKyAgICAiIiJBZGRyZXNzIHBhcnNlciBjbGFzcyBieSBCZW4gRXNjb3RvLgorCisgICAgVG8gdW5kZXJzdGFuZCB3aGF0IHRoaXMgY2xhc3MgZG9lcywgaXQgaGVscHMgdG8gaGF2ZSBhIGNvcHkgb2YgUkZDIDI4MjIgaW4KKyAgICBmcm9udCBvZiB5b3UuCisKKyAgICBOb3RlOiB0aGlzIGNsYXNzIGludGVyZmFjZSBpcyBkZXByZWNhdGVkIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICAgIFVzZSByZmM4MjIuQWRkcmVzc0xpc3QgaW5zdGVhZC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWVsZCk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBuZXcgaW5zdGFuY2UuCisKKyAgICAgICAgYGZpZWxkJyBpcyBhbiB1bnBhcnNlZCBhZGRyZXNzIGhlYWRlciBmaWVsZCwgY29udGFpbmluZworICAgICAgICBvbmUgb3IgbW9yZSBhZGRyZXNzZXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNwZWNpYWxzID0gJygpPD5ALDo7LlwiW10nCisgICAgICAgIHNlbGYucG9zID0gMAorICAgICAgICBzZWxmLkxXUyA9ICcgXHQnCisgICAgICAgIHNlbGYuQ1IgPSAnXHJcbicKKyAgICAgICAgc2VsZi5GV1MgPSBzZWxmLkxXUyArIHNlbGYuQ1IKKyAgICAgICAgc2VsZi5hdG9tZW5kcyA9IHNlbGYuc3BlY2lhbHMgKyBzZWxmLkxXUyArIHNlbGYuQ1IKKyAgICAgICAgIyBOb3RlIHRoYXQgUkZDIDI4MjIgbm93IHNwZWNpZmllcyBgLicgYXMgb2JzLXBocmFzZSwgbWVhbmluZyB0aGF0IGl0CisgICAgICAgICMgaXMgb2Jzb2xldGUgc3ludGF4LiAgUkZDIDI4MjIgcmVxdWlyZXMgdGhhdCB3ZSByZWNvZ25pemUgb2Jzb2xldGUKKyAgICAgICAgIyBzeW50YXgsIHNvIGFsbG93IGRvdHMgaW4gcGhyYXNlcy4KKyAgICAgICAgc2VsZi5waHJhc2VlbmRzID0gc2VsZi5hdG9tZW5kcy5yZXBsYWNlKCcuJywgJycpCisgICAgICAgIHNlbGYuZmllbGQgPSBmaWVsZAorICAgICAgICBzZWxmLmNvbW1lbnRsaXN0ID0gW10KKworICAgIGRlZiBnb3RvbmV4dChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGFkZHJlc3MuIiIiCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5MV1MgKyAnXG5ccic6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnKCc6CisgICAgICAgICAgICAgICAgc2VsZi5jb21tZW50bGlzdC5hcHBlbmQoc2VsZi5nZXRjb21tZW50KCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgZ2V0YWRkcmxpc3Qoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFsbCBhZGRyZXNzZXMuCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIGFkZHJlc3Nlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgYWQgPSBzZWxmLmdldGFkZHJlc3MoKQorICAgICAgICAgICAgaWYgYWQ6CisgICAgICAgICAgICAgICAgcmVzdWx0ICs9IGFkCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKCcnLCAnJykpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBnZXRhZGRyZXNzKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSB0aGUgbmV4dCBhZGRyZXNzLiIiIgorICAgICAgICBzZWxmLmNvbW1lbnRsaXN0ID0gW10KKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisKKyAgICAgICAgb2xkcG9zID0gc2VsZi5wb3MKKyAgICAgICAgb2xkY2wgPSBzZWxmLmNvbW1lbnRsaXN0CisgICAgICAgIHBsaXN0ID0gc2VsZi5nZXRwaHJhc2VsaXN0KCkKKworICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgcmV0dXJubGlzdCA9IFtdCisKKyAgICAgICAgaWYgc2VsZi5wb3MgPj0gbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgIyBCYWQgZW1haWwgYWRkcmVzcyB0ZWNobmljYWxseSwgbm8gZG9tYWluLgorICAgICAgICAgICAgaWYgcGxpc3Q6CisgICAgICAgICAgICAgICAgcmV0dXJubGlzdCA9IFsoU1BBQ0Uuam9pbihzZWxmLmNvbW1lbnRsaXN0KSwgcGxpc3RbMF0pXQorCisgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gJy5AJzoKKyAgICAgICAgICAgICMgZW1haWwgYWRkcmVzcyBpcyBqdXN0IGFuIGFkZHJzcGVjCisgICAgICAgICAgICAjIHRoaXMgaXNuJ3QgdmVyeSBlZmZpY2llbnQgc2luY2Ugd2Ugc3RhcnQgb3ZlcgorICAgICAgICAgICAgc2VsZi5wb3MgPSBvbGRwb3MKKyAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QgPSBvbGRjbAorICAgICAgICAgICAgYWRkcnNwZWMgPSBzZWxmLmdldGFkZHJzcGVjKCkKKyAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKFNQQUNFLmpvaW4oc2VsZi5jb21tZW50bGlzdCksIGFkZHJzcGVjKV0KKworICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc6JzoKKyAgICAgICAgICAgICMgYWRkcmVzcyBpcyBhIGdyb3VwCisgICAgICAgICAgICByZXR1cm5saXN0ID0gW10KKworICAgICAgICAgICAgZmllbGRsZW4gPSBsZW4oc2VsZi5maWVsZCkKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICAgICAgICAgIGlmIHNlbGYucG9zIDwgZmllbGRsZW4gYW5kIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc7JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSByZXR1cm5saXN0ICsgc2VsZi5nZXRhZGRyZXNzKCkKKworICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc8JzoKKyAgICAgICAgICAgICMgQWRkcmVzcyBpcyBhIHBocmFzZSB0aGVuIGEgcm91dGUgYWRkcgorICAgICAgICAgICAgcm91dGVhZGRyID0gc2VsZi5nZXRyb3V0ZWFkZHIoKQorCisgICAgICAgICAgICBpZiBzZWxmLmNvbW1lbnRsaXN0OgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKFNQQUNFLmpvaW4ocGxpc3QpICsgJyAoJyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnLmpvaW4oc2VsZi5jb21tZW50bGlzdCkgKyAnKScsIHJvdXRlYWRkcildCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKFNQQUNFLmpvaW4ocGxpc3QpLCByb3V0ZWFkZHIpXQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWyhTUEFDRS5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBwbGlzdFswXSldCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuc3BlY2lhbHM6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICBpZiBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKSBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJywnOgorICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICByZXR1cm4gcmV0dXJubGlzdAorCisgICAgZGVmIGdldHJvdXRlYWRkcihzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYSByb3V0ZSBhZGRyZXNzIChSZXR1cm4tcGF0aCB2YWx1ZSkuCisKKyAgICAgICAgVGhpcyBtZXRob2QganVzdCBza2lwcyBhbGwgdGhlIHJvdXRlIHN0dWZmIGFuZCByZXR1cm5zIHRoZSBhZGRyc3BlYy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdICE9ICc8JzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGV4cGVjdHJvdXRlID0gRmFsc2UKKyAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgYWRsaXN0ID0gJycKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBleHBlY3Ryb3V0ZToKKyAgICAgICAgICAgICAgICBzZWxmLmdldGRvbWFpbigpCisgICAgICAgICAgICAgICAgZXhwZWN0cm91dGUgPSBGYWxzZQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnPic6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICdAJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgZXhwZWN0cm91dGUgPSBUcnVlCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc6JzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFkbGlzdCA9IHNlbGYuZ2V0YWRkcnNwZWMoKQorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisKKyAgICAgICAgcmV0dXJuIGFkbGlzdAorCisgICAgZGVmIGdldGFkZHJzcGVjKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhbiBSRkMgMjgyMiBhZGRyLXNwZWMuIiIiCisgICAgICAgIGFzbGlzdCA9IFtdCisKKyAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJy4nOgorICAgICAgICAgICAgICAgIGFzbGlzdC5hcHBlbmQoJy4nKQorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJyInOgorICAgICAgICAgICAgICAgIGFzbGlzdC5hcHBlbmQoJyIlcyInICUgcXVvdGUoc2VsZi5nZXRxdW90ZSgpKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5hdG9tZW5kczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc2xpc3QuYXBwZW5kKHNlbGYuZ2V0YXRvbSgpKQorICAgICAgICAgICAgc2VsZi5nb3RvbmV4dCgpCisKKyAgICAgICAgaWYgc2VsZi5wb3MgPj0gbGVuKHNlbGYuZmllbGQpIG9yIHNlbGYuZmllbGRbc2VsZi5wb3NdICE9ICdAJzoKKyAgICAgICAgICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKGFzbGlzdCkKKworICAgICAgICBhc2xpc3QuYXBwZW5kKCdAJykKKyAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgcmV0dXJuIEVNUFRZU1RSSU5HLmpvaW4oYXNsaXN0KSArIHNlbGYuZ2V0ZG9tYWluKCkKKworICAgIGRlZiBnZXRkb21haW4oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgY29tcGxldGUgZG9tYWluIG5hbWUgZnJvbSBhbiBhZGRyZXNzLiIiIgorICAgICAgICBzZGxpc3QgPSBbXQorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuTFdTOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QuYXBwZW5kKHNlbGYuZ2V0Y29tbWVudCgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnWyc6CisgICAgICAgICAgICAgICAgc2RsaXN0LmFwcGVuZChzZWxmLmdldGRvbWFpbmxpdGVyYWwoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJy4nOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICBzZGxpc3QuYXBwZW5kKCcuJykKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5hdG9tZW5kczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZGxpc3QuYXBwZW5kKHNlbGYuZ2V0YXRvbSgpKQorICAgICAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihzZGxpc3QpCisKKyAgICBkZWYgZ2V0ZGVsaW1pdGVkKHNlbGYsIGJlZ2luY2hhciwgZW5kY2hhcnMsIGFsbG93Y29tbWVudHM9VHJ1ZSk6CisgICAgICAgICIiIlBhcnNlIGEgaGVhZGVyIGZyYWdtZW50IGRlbGltaXRlZCBieSBzcGVjaWFsIGNoYXJhY3RlcnMuCisKKyAgICAgICAgYGJlZ2luY2hhcicgaXMgdGhlIHN0YXJ0IGNoYXJhY3RlciBmb3IgdGhlIGZyYWdtZW50LgorICAgICAgICBJZiBzZWxmIGlzIG5vdCBsb29raW5nIGF0IGFuIGluc3RhbmNlIG9mIGBiZWdpbmNoYXInIHRoZW4KKyAgICAgICAgZ2V0ZGVsaW1pdGVkIHJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KKworICAgICAgICBgZW5kY2hhcnMnIGlzIGEgc2VxdWVuY2Ugb2YgYWxsb3dhYmxlIGVuZC1kZWxpbWl0aW5nIGNoYXJhY3RlcnMuCisgICAgICAgIFBhcnNpbmcgc3RvcHMgd2hlbiBvbmUgb2YgdGhlc2UgaXMgZW5jb3VudGVyZWQuCisKKyAgICAgICAgSWYgYGFsbG93Y29tbWVudHMnIGlzIG5vbi16ZXJvLCBlbWJlZGRlZCBSRkMgMjgyMiBjb21tZW50cyBhcmUgYWxsb3dlZAorICAgICAgICB3aXRoaW4gdGhlIHBhcnNlZCBmcmFnbWVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdICE9IGJlZ2luY2hhcjoKKyAgICAgICAgICAgIHJldHVybiAnJworCisgICAgICAgIHNsaXN0ID0gWycnXQorICAgICAgICBxdW90ZSA9IEZhbHNlCisgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBxdW90ZToKKyAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoc2VsZi5maWVsZFtzZWxmLnBvc10pCisgICAgICAgICAgICAgICAgcXVvdGUgPSBGYWxzZQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBlbmRjaGFyczoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgYWxsb3djb21tZW50cyBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgIyBoYXZlIGFscmVhZHkgYWR2YW5jZWQgcG9zIGZyb20gZ2V0Y29tbWVudAorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnXFwnOgorICAgICAgICAgICAgICAgIHF1b3RlID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoc2VsZi5maWVsZFtzZWxmLnBvc10pCisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisKKyAgICAgICAgcmV0dXJuIEVNUFRZU1RSSU5HLmpvaW4oc2xpc3QpCisKKyAgICBkZWYgZ2V0cXVvdGUoc2VsZik6CisgICAgICAgICIiIkdldCBhIHF1b3RlLWRlbGltaXRlZCBmcmFnbWVudCBmcm9tIHNlbGYncyBmaWVsZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0ZGVsaW1pdGVkKCciJywgJyJccicsIEZhbHNlKQorCisgICAgZGVmIGdldGNvbW1lbnQoc2VsZik6CisgICAgICAgICIiIkdldCBhIHBhcmVudGhlc2lzLWRlbGltaXRlZCBmcmFnbWVudCBmcm9tIHNlbGYncyBmaWVsZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0ZGVsaW1pdGVkKCcoJywgJylccicsIFRydWUpCisKKyAgICBkZWYgZ2V0ZG9tYWlubGl0ZXJhbChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYW4gUkZDIDI4MjIgZG9tYWluLWxpdGVyYWwuIiIiCisgICAgICAgIHJldHVybiAnWyVzXScgJSBzZWxmLmdldGRlbGltaXRlZCgnWycsICddXHInLCBGYWxzZSkKKworICAgIGRlZiBnZXRhdG9tKHNlbGYsIGF0b21lbmRzPU5vbmUpOgorICAgICAgICAiIiJQYXJzZSBhbiBSRkMgMjgyMiBhdG9tLgorCisgICAgICAgIE9wdGlvbmFsIGF0b21lbmRzIHNwZWNpZmllcyBhIGRpZmZlcmVudCBzZXQgb2YgZW5kIHRva2VuIGRlbGltaXRlcnMKKyAgICAgICAgKHRoZSBkZWZhdWx0IGlzIHRvIHVzZSBzZWxmLmF0b21lbmRzKS4gIFRoaXMgaXMgdXNlZCBlLmcuIGluCisgICAgICAgIGdldHBocmFzZWxpc3QoKSBzaW5jZSBwaHJhc2UgZW5kaW5ncyBtdXN0IG5vdCBpbmNsdWRlIHRoZSBgLicgKHdoaWNoCisgICAgICAgIGlzIGxlZ2FsIGluIHBocmFzZXMpLiIiIgorICAgICAgICBhdG9tbGlzdCA9IFsnJ10KKyAgICAgICAgaWYgYXRvbWVuZHMgaXMgTm9uZToKKyAgICAgICAgICAgIGF0b21lbmRzID0gc2VsZi5hdG9tZW5kcworCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXRvbWxpc3QuYXBwZW5kKHNlbGYuZmllbGRbc2VsZi5wb3NdKQorICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorCisgICAgICAgIHJldHVybiBFTVBUWVNUUklORy5qb2luKGF0b21saXN0KQorCisgICAgZGVmIGdldHBocmFzZWxpc3Qoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGEgc2VxdWVuY2Ugb2YgUkZDIDI4MjIgcGhyYXNlcy4KKworICAgICAgICBBIHBocmFzZSBpcyBhIHNlcXVlbmNlIG9mIHdvcmRzLCB3aGljaCBhcmUgaW4gdHVybiBlaXRoZXIgUkZDIDI4MjIKKyAgICAgICAgYXRvbXMgb3IgcXVvdGVkLXN0cmluZ3MuICBQaHJhc2VzIGFyZSBjYW5vbmljYWxpemVkIGJ5IHNxdWVlemluZyBhbGwKKyAgICAgICAgcnVucyBvZiBjb250aW51b3VzIHdoaXRlc3BhY2UgaW50byBvbmUgc3BhY2UuCisgICAgICAgICIiIgorICAgICAgICBwbGlzdCA9IFtdCisKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLkZXUzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICciJzoKKyAgICAgICAgICAgICAgICBwbGlzdC5hcHBlbmQoc2VsZi5nZXRxdW90ZSgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnKCc6CisgICAgICAgICAgICAgICAgc2VsZi5jb21tZW50bGlzdC5hcHBlbmQoc2VsZi5nZXRjb21tZW50KCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYucGhyYXNlZW5kczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwbGlzdC5hcHBlbmQoc2VsZi5nZXRhdG9tKHNlbGYucGhyYXNlZW5kcykpCisKKyAgICAgICAgcmV0dXJuIHBsaXN0CisKK2NsYXNzIEFkZHJlc3NMaXN0KEFkZHJsaXN0Q2xhc3MpOgorICAgICIiIkFuIEFkZHJlc3NMaXN0IGVuY2Fwc3VsYXRlcyBhIGxpc3Qgb2YgcGFyc2VkIFJGQyAyODIyIGFkZHJlc3Nlcy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmllbGQpOgorICAgICAgICBBZGRybGlzdENsYXNzLl9faW5pdF9fKHNlbGYsIGZpZWxkKQorICAgICAgICBpZiBmaWVsZDoKKyAgICAgICAgICAgIHNlbGYuYWRkcmVzc2xpc3QgPSBzZWxmLmdldGFkZHJsaXN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWRkcmVzc2xpc3QgPSBbXQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5hZGRyZXNzbGlzdCkKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBTZXQgdW5pb24KKyAgICAgICAgbmV3YWRkciA9IEFkZHJlc3NMaXN0KE5vbmUpCisgICAgICAgIG5ld2FkZHIuYWRkcmVzc2xpc3QgPSBzZWxmLmFkZHJlc3NsaXN0WzpdCisgICAgICAgIGZvciB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgbm90IHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBuZXdhZGRyLmFkZHJlc3NsaXN0LmFwcGVuZCh4KQorICAgICAgICByZXR1cm4gbmV3YWRkcgorCisgICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBTZXQgdW5pb24sIGluLXBsYWNlCisgICAgICAgIGZvciB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgbm90IHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0LmFwcGVuZCh4KQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIFNldCBkaWZmZXJlbmNlCisgICAgICAgIG5ld2FkZHIgPSBBZGRyZXNzTGlzdChOb25lKQorICAgICAgICBmb3IgeCBpbiBzZWxmLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgbm90IHggaW4gb3RoZXIuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICAgICAgbmV3YWRkci5hZGRyZXNzbGlzdC5hcHBlbmQoeCkKKyAgICAgICAgcmV0dXJuIG5ld2FkZHIKKworICAgIGRlZiBfX2lzdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IGRpZmZlcmVuY2UsIGluLXBsYWNlCisgICAgICAgIGZvciB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgeCBpbiBzZWxmLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgICAgIHNlbGYuYWRkcmVzc2xpc3QucmVtb3ZlKHgpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAjIE1ha2UgaW5kZXhpbmcsIHNsaWNlcywgYW5kICdpbicgd29yaworICAgICAgICByZXR1cm4gc2VsZi5hZGRyZXNzbGlzdFtpbmRleF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvX3BhcnNlYWRkci5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL19wYXJzZWFkZHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzYzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL19wYXJzZWFkZHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvX3BhcnNlYWRkci5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL19wYXJzZWFkZHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNzYzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL19wYXJzZWFkZHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weSBiL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE4MDAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9iYXNlNjRtaW1lLnB5CkBAIC0wLDAgKzEsMTgzIEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQmFzZTY0IGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgcGVyIFJGQ3MgMjA0NS0yMDQ3LgorCitUaGlzIG1vZHVsZSBoYW5kbGVzIHRoZSBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIG1ldGhvZCBkZWZpbmVkIGluIFJGQyAyMDQ1Cit0byBlbmNvZGUgYXJiaXRyYXJ5IDgtYml0IGRhdGEgdXNpbmcgdGhlIHRocmVlIDgtYml0IGJ5dGVzIGluIGZvdXIgNy1iaXQKK2NoYXJhY3RlcnMgZW5jb2Rpbmcga25vd24gYXMgQmFzZTY0LgorCitJdCBpcyB1c2VkIGluIHRoZSBNSU1FIHN0YW5kYXJkcyBmb3IgZW1haWwgdG8gYXR0YWNoIGltYWdlcywgYXVkaW8sIGFuZCB0ZXh0Cit1c2luZyBzb21lIDgtYml0IGNoYXJhY3RlciBzZXRzIHRvIG1lc3NhZ2VzLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gZW5jb2RlIGFuZCBkZWNvZGUgYm90aCBoZWFkZXJzIGFuZCBib2RpZXMKK3dpdGggQmFzZTY0IGVuY29kaW5nLgorCitSRkMgMjA0NSBkZWZpbmVzIGEgbWV0aG9kIGZvciBpbmNsdWRpbmcgY2hhcmFjdGVyIHNldCBpbmZvcm1hdGlvbiBpbiBhbgorYGVuY29kZWQtd29yZCcgaW4gYSBoZWFkZXIuICBUaGlzIG1ldGhvZCBpcyBjb21tb25seSB1c2VkIGZvciA4LWJpdCByZWFsIG5hbWVzCitpbiBUbzosIEZyb206LCBDYzosIGV0Yy4gZmllbGRzLCBhcyB3ZWxsIGFzIFN1YmplY3Q6IGxpbmVzLgorCitUaGlzIG1vZHVsZSBkb2VzIG5vdCBkbyB0aGUgbGluZSB3cmFwcGluZyBvciBlbmQtb2YtbGluZSBjaGFyYWN0ZXIgY29udmVyc2lvbgorbmVjZXNzYXJ5IGZvciBwcm9wZXIgaW50ZXJuYXRpb25hbGl6ZWQgaGVhZGVyczsgaXQgb25seSBkb2VzIGR1bWIgZW5jb2RpbmcgYW5kCitkZWNvZGluZy4gIFRvIGRlYWwgd2l0aCB0aGUgdmFyaW91cyBsaW5lIHdyYXBwaW5nIGlzc3VlcywgdXNlIHRoZSBlbWFpbC5oZWFkZXIKK21vZHVsZS4KKyIiIgorCitfX2FsbF9fID0gWworICAgICdiYXNlNjRfbGVuJywKKyAgICAnYm9keV9kZWNvZGUnLAorICAgICdib2R5X2VuY29kZScsCisgICAgJ2RlY29kZScsCisgICAgJ2RlY29kZXN0cmluZycsCisgICAgJ2VuY29kZScsCisgICAgJ2VuY29kZXN0cmluZycsCisgICAgJ2hlYWRlcl9lbmNvZGUnLAorICAgIF0KKworCitmcm9tIGJpbmFzY2lpIGltcG9ydCBiMmFfYmFzZTY0LCBhMmJfYmFzZTY0Citmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBmaXhfZW9scworCitDUkxGID0gJ1xyXG4nCitOTCA9ICdcbicKK0VNUFRZU1RSSU5HID0gJycKKworIyBTZWUgYWxzbyBDaGFyc2V0LnB5CitNSVNDX0xFTiA9IDcKKworCisMCisjIEhlbHBlcnMKK2RlZiBiYXNlNjRfbGVuKHMpOgorICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIG9mIHMgd2hlbiBpdCBpcyBlbmNvZGVkIHdpdGggYmFzZTY0LiIiIgorICAgIGdyb3Vwc19vZl8zLCBsZWZ0b3ZlciA9IGRpdm1vZChsZW4ocyksIDMpCisgICAgIyA0IGJ5dGVzIG91dCBmb3IgZWFjaCAzIGJ5dGVzIChvciBub256ZXJvIGZyYWN0aW9uIHRoZXJlb2YpIGluLgorICAgICMgVGhhbmtzLCBUaW0hCisgICAgbiA9IGdyb3Vwc19vZl8zICogNAorICAgIGlmIGxlZnRvdmVyOgorICAgICAgICBuICs9IDQKKyAgICByZXR1cm4gbgorCisKKwwKK2RlZiBoZWFkZXJfZW5jb2RlKGhlYWRlciwgY2hhcnNldD0naXNvLTg4NTktMScsIGtlZXBfZW9scz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYsIGVvbD1OTCk6CisgICAgIiIiRW5jb2RlIGEgc2luZ2xlIGhlYWRlciBsaW5lIHdpdGggQmFzZTY0IGVuY29kaW5nIGluIGEgZ2l2ZW4gY2hhcnNldC4KKworICAgIERlZmluZWQgaW4gUkZDIDIwNDUsIHRoaXMgQmFzZTY0IGVuY29kaW5nIGlzIGlkZW50aWNhbCB0byBub3JtYWwgQmFzZTY0CisgICAgZW5jb2RpbmcsIGV4Y2VwdCB0aGF0IGVhY2ggbGluZSBtdXN0IGJlIGludGVsbGlnZW50bHkgd3JhcHBlZCAocmVzcGVjdGluZworICAgIHRoZSBCYXNlNjQgZW5jb2RpbmcpLCBhbmQgc3Vic2VxdWVudCBsaW5lcyBtdXN0IHN0YXJ0IHdpdGggYSBzcGFjZS4KKworICAgIGNoYXJzZXQgbmFtZXMgdGhlIGNoYXJhY3RlciBzZXQgdG8gdXNlIHRvIGVuY29kZSB0aGUgaGVhZGVyLiAgSXQgZGVmYXVsdHMKKyAgICB0byBpc28tODg1OS0xLgorCisgICAgRW5kLW9mLWxpbmUgY2hhcmFjdGVycyAoXFxyLCBcXG4sIFxcclxcbikgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZAorICAgIHRvIHRoZSBjYW5vbmljYWwgZW1haWwgbGluZSBzZXBhcmF0b3IgXFxyXFxuIHVubGVzcyB0aGUga2VlcF9lb2xzCisgICAgcGFyYW1ldGVyIGlzIFRydWUgKHRoZSBkZWZhdWx0IGlzIEZhbHNlKS4KKworICAgIEVhY2ggbGluZSBvZiB0aGUgaGVhZGVyIHdpbGwgYmUgdGVybWluYXRlZCBpbiB0aGUgdmFsdWUgb2YgZW9sLCB3aGljaAorICAgIGRlZmF1bHRzIHRvICJcXG4iLiAgU2V0IHRoaXMgdG8gIlxcclxcbiIgaWYgeW91IGFyZSB1c2luZyB0aGUgcmVzdWx0IG9mCisgICAgdGhpcyBmdW5jdGlvbiBkaXJlY3RseSBpbiBlbWFpbC4KKworICAgIFRoZSByZXN1bHRpbmcgc3RyaW5nIHdpbGwgYmUgaW4gdGhlIGZvcm06CisKKyAgICAiPT9jaGFyc2V0P2I/V1cvNWNpQnRZWHA2NlhMcklIZjhlaUJoSUdoaGJYQnpkR0h1Y2lCQklGbHYrWElnYldGNmV1bHk/PVxcbgorICAgICAgPT9jaGFyc2V0P2I/NnlCMy9Ib2dZU0JvWVcxd2MzUmg3bklnUWtNZ1dXLzVjaUJ0WVhwNjZYTHJJSGY4ZWlCaElHaGg/PSIKKworICAgIHdpdGggZWFjaCBsaW5lIHdyYXBwZWQgYXQsIGF0IG1vc3QsIG1heGxpbmVsZW4gY2hhcmFjdGVycyAoZGVmYXVsdHMgdG8gNzYKKyAgICBjaGFyYWN0ZXJzKS4KKyAgICAiIiIKKyAgICAjIFJldHVybiBlbXB0eSBoZWFkZXJzIHVuY2hhbmdlZAorICAgIGlmIG5vdCBoZWFkZXI6CisgICAgICAgIHJldHVybiBoZWFkZXIKKworICAgIGlmIG5vdCBrZWVwX2VvbHM6CisgICAgICAgIGhlYWRlciA9IGZpeF9lb2xzKGhlYWRlcikKKworICAgICMgQmFzZTY0IGVuY29kZSBlYWNoIGxpbmUsIGluIGVuY29kZWQgY2h1bmtzIG5vIGdyZWF0ZXIgdGhhbiBtYXhsaW5lbGVuIGluCisgICAgIyBsZW5ndGgsIGFmdGVyIHRoZSBSRkMgY2hyb21lIGlzIGFkZGVkIGluLgorICAgIGJhc2U2NGVkID0gW10KKyAgICBtYXhfZW5jb2RlZCA9IG1heGxpbmVsZW4gLSBsZW4oY2hhcnNldCkgLSBNSVNDX0xFTgorICAgIG1heF91bmVuY29kZWQgPSBtYXhfZW5jb2RlZCAqIDMgLy8gNAorCisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGhlYWRlciksIG1heF91bmVuY29kZWQpOgorICAgICAgICBiYXNlNjRlZC5hcHBlbmQoYjJhX2Jhc2U2NChoZWFkZXJbaTppK21heF91bmVuY29kZWRdKSkKKworICAgICMgTm93IGFkZCB0aGUgUkZDIGNocm9tZSB0byBlYWNoIGVuY29kZWQgY2h1bmsKKyAgICBsaW5lcyA9IFtdCisgICAgZm9yIGxpbmUgaW4gYmFzZTY0ZWQ6CisgICAgICAgICMgSWdub3JlIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBlYWNoIGxpbmUgaWYgaXQgaXMgYSBuZXdsaW5lCisgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoTkwpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAjIEFkZCB0aGUgY2hyb21lCisgICAgICAgIGxpbmVzLmFwcGVuZCgnPT8lcz9iPyVzPz0nICUgKGNoYXJzZXQsIGxpbmUpKQorICAgICMgR2x1ZSB0aGUgbGluZXMgdG9nZXRoZXIgYW5kIHJldHVybiBpdC4gIEJBVzogc2hvdWxkIHdlIGJlIGFibGUgdG8KKyAgICAjIHNwZWNpZnkgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBpbiB0aGUgam9pbmVyPworICAgIGpvaW5lciA9IGVvbCArICcgJworICAgIHJldHVybiBqb2luZXIuam9pbihsaW5lcykKKworCisMCitkZWYgZW5jb2RlKHMsIGJpbmFyeT1UcnVlLCBtYXhsaW5lbGVuPTc2LCBlb2w9TkwpOgorICAgICIiIkVuY29kZSBhIHN0cmluZyB3aXRoIGJhc2U2NC4KKworICAgIEVhY2ggbGluZSB3aWxsIGJlIHdyYXBwZWQgYXQsIGF0IG1vc3QsIG1heGxpbmVsZW4gY2hhcmFjdGVycyAoZGVmYXVsdHMgdG8KKyAgICA3NiBjaGFyYWN0ZXJzKS4KKworICAgIElmIGJpbmFyeSBpcyBGYWxzZSwgZW5kLW9mLWxpbmUgY2hhcmFjdGVycyB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUKKyAgICBjYW5vbmljYWwgZW1haWwgZW5kLW9mLWxpbmUgc2VxdWVuY2UgXFxyXFxuLiAgT3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBsZWZ0CisgICAgdmVyYmF0aW0gKHRoaXMgaXMgdGhlIGRlZmF1bHQpLgorCisgICAgRWFjaCBsaW5lIG9mIGVuY29kZWQgdGV4dCB3aWxsIGVuZCB3aXRoIGVvbCwgd2hpY2ggZGVmYXVsdHMgdG8gIlxcbiIuICBTZXQKKyAgICB0aGlzIHRvICJcXHJcXG4iIGlmIHlvdSB3aWxsIGJlIHVzaW5nIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBkaXJlY3RseQorICAgIGluIGFuIGVtYWlsLgorICAgICIiIgorICAgIGlmIG5vdCBzOgorICAgICAgICByZXR1cm4gcworCisgICAgaWYgbm90IGJpbmFyeToKKyAgICAgICAgcyA9IGZpeF9lb2xzKHMpCisKKyAgICBlbmN2ZWMgPSBbXQorICAgIG1heF91bmVuY29kZWQgPSBtYXhsaW5lbGVuICogMyAvLyA0CisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHMpLCBtYXhfdW5lbmNvZGVkKToKKyAgICAgICAgIyBCQVc6IHNob3VsZCBlbmNvZGUoKSBpbmhlcml0IGIyYV9iYXNlNjQoKSdzIGR1YmlvdXMgYmVoYXZpb3IgaW4KKyAgICAgICAgIyBhZGRpbmcgYSBuZXdsaW5lIHRvIHRoZSBlbmNvZGVkIHN0cmluZz8KKyAgICAgICAgZW5jID0gYjJhX2Jhc2U2NChzW2k6aSArIG1heF91bmVuY29kZWRdKQorICAgICAgICBpZiBlbmMuZW5kc3dpdGgoTkwpIGFuZCBlb2wgIT0gTkw6CisgICAgICAgICAgICBlbmMgPSBlbmNbOi0xXSArIGVvbAorICAgICAgICBlbmN2ZWMuYXBwZW5kKGVuYykKKyAgICByZXR1cm4gRU1QVFlTVFJJTkcuam9pbihlbmN2ZWMpCisKKworIyBGb3IgY29udmVuaWVuY2UgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHcvIHN0YW5kYXJkIGJhc2U2NCBtb2R1bGUKK2JvZHlfZW5jb2RlID0gZW5jb2RlCitlbmNvZGVzdHJpbmcgPSBlbmNvZGUKKworCisMCitkZWYgZGVjb2RlKHMsIGNvbnZlcnRfZW9scz1Ob25lKToKKyAgICAiIiJEZWNvZGUgYSByYXcgYmFzZTY0IHN0cmluZy4KKworICAgIElmIGNvbnZlcnRfZW9scyBpcyBzZXQgdG8gYSBzdHJpbmcgdmFsdWUsIGFsbCBjYW5vbmljYWwgZW1haWwgbGluZWZlZWRzLAorICAgIGUuZy4gIlxcclxcbiIsIGluIHRoZSBkZWNvZGVkIHRleHQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIHZhbHVlIG9mCisgICAgY29udmVydF9lb2xzLiAgb3MubGluZXNlcCBpcyBhIGdvb2QgY2hvaWNlIGZvciBjb252ZXJ0X2VvbHMgaWYgeW91IGFyZQorICAgIGRlY29kaW5nIGEgdGV4dCBhdHRhY2htZW50LgorCisgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwYXJzZSBhIGZ1bGwgTUlNRSBoZWFkZXIgdmFsdWUgZW5jb2RlZCB3aXRoCisgICAgYmFzZTY0IChsaWtlID0/aXNvLTg4OTUtMT9iP2JtbG9JU0J1YVdnaD89KSAtLSBwbGVhc2UgdXNlIHRoZSBoaWdoCisgICAgbGV2ZWwgZW1haWwuaGVhZGVyIGNsYXNzIGZvciB0aGF0IGZ1bmN0aW9uYWxpdHkuCisgICAgIiIiCisgICAgaWYgbm90IHM6CisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWMgPSBhMmJfYmFzZTY0KHMpCisgICAgaWYgY29udmVydF9lb2xzOgorICAgICAgICByZXR1cm4gZGVjLnJlcGxhY2UoQ1JMRiwgY29udmVydF9lb2xzKQorICAgIHJldHVybiBkZWMKKworCisjIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdy8gc3RhbmRhcmQgYmFzZTY0IG1vZHVsZQorYm9keV9kZWNvZGUgPSBkZWNvZGUKK2RlY29kZXN0cmluZyA9IGRlY29kZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9iYXNlNjRtaW1lLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3MzVhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9iYXNlNjRtaW1lLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3MzVhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvYmFzZTY0bWltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9jaGFyc2V0LnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9jaGFyc2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZGFhNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2NoYXJzZXQucHkKQEAgLTAsMCArMSwzOTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCZW4gR2VydHpmaWVsZCwgQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKK19fYWxsX18gPSBbCisgICAgJ0NoYXJzZXQnLAorICAgICdhZGRfYWxpYXMnLAorICAgICdhZGRfY2hhcnNldCcsCisgICAgJ2FkZF9jb2RlYycsCisgICAgXQorCitpbXBvcnQgY29kZWNzCitpbXBvcnQgZW1haWwuYmFzZTY0bWltZQoraW1wb3J0IGVtYWlsLnF1b3ByaW1pbWUKKworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCitmcm9tIGVtYWlsLmVuY29kZXJzIGltcG9ydCBlbmNvZGVfN29yOGJpdAorCisKKwwKKyMgRmxhZ3MgZm9yIHR5cGVzIG9mIGhlYWRlciBlbmNvZGluZ3MKK1FQICAgICAgICAgID0gMSAjIFF1b3RlZC1QcmludGFibGUKK0JBU0U2NCAgICAgID0gMiAjIEJhc2U2NAorU0hPUlRFU1QgICAgPSAzICMgdGhlIHNob3J0ZXIgb2YgUVAgYW5kIGJhc2U2NCwgYnV0IG9ubHkgZm9yIGhlYWRlcnMKKworIyBJbiAiPT9jaGFyc2V0P3E/aGVsbG9fd29ybGQ/PSIsIHRoZSA9PywgP3E/LCBhbmQgPz0gYWRkIHVwIHRvIDcKK01JU0NfTEVOID0gNworCitERUZBVUxUX0NIQVJTRVQgPSAndXMtYXNjaWknCisKKworDAorIyBEZWZhdWx0cworQ0hBUlNFVFMgPSB7CisgICAgIyBpbnB1dCAgICAgICAgaGVhZGVyIGVuYyAgYm9keSBlbmMgb3V0cHV0IGNvbnYKKyAgICAnaXNvLTg4NTktMSc6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAnaXNvLTg4NTktMic6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAnaXNvLTg4NTktMyc6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAnaXNvLTg4NTktNCc6ICAoUVAsICAgICAgICBRUCwgICAgICBOb25lKSwKKyAgICAjIGlzby04ODU5LTUgaXMgQ3lyaWxsaWMsIGFuZCBub3QgZXNwZWNpYWxseSB1c2VkCisgICAgIyBpc28tODg1OS02IGlzIEFyYWJpYywgYWxzbyBub3QgcGFydGljdWxhcmx5IHVzZWQKKyAgICAjIGlzby04ODU5LTcgaXMgR3JlZWssIFFQIHdpbGwgbm90IG1ha2UgaXQgcmVhZGFibGUKKyAgICAjIGlzby04ODU5LTggaXMgSGVicmV3LCBRUCB3aWxsIG5vdCBtYWtlIGl0IHJlYWRhYmxlCisgICAgJ2lzby04ODU5LTknOiAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTEwJzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgIyBpc28tODg1OS0xMSBpcyBUaGFpLCBRUCB3aWxsIG5vdCBtYWtlIGl0IHJlYWRhYmxlCisgICAgJ2lzby04ODU5LTEzJzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTE0JzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTE1JzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ2lzby04ODU5LTE2JzogKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ3dpbmRvd3MtMTI1Mic6KFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ3Zpc2NpaSc6ICAgICAgKFFQLCAgICAgICAgUVAsICAgICAgTm9uZSksCisgICAgJ3VzLWFzY2lpJzogICAgKE5vbmUsICAgICAgTm9uZSwgICAgTm9uZSksCisgICAgJ2JpZzUnOiAgICAgICAgKEJBU0U2NCwgICAgQkFTRTY0LCAgTm9uZSksCisgICAgJ2diMjMxMic6ICAgICAgKEJBU0U2NCwgICAgQkFTRTY0LCAgTm9uZSksCisgICAgJ2V1Yy1qcCc6ICAgICAgKEJBU0U2NCwgICAgTm9uZSwgICAgJ2lzby0yMDIyLWpwJyksCisgICAgJ3NoaWZ0X2ppcyc6ICAgKEJBU0U2NCwgICAgTm9uZSwgICAgJ2lzby0yMDIyLWpwJyksCisgICAgJ2lzby0yMDIyLWpwJzogKEJBU0U2NCwgICAgTm9uZSwgICAgTm9uZSksCisgICAgJ2tvaTgtcic6ICAgICAgKEJBU0U2NCwgICAgQkFTRTY0LCAgTm9uZSksCisgICAgJ3V0Zi04JzogICAgICAgKFNIT1JURVNULCAgQkFTRTY0LCAndXRmLTgnKSwKKyAgICAjIFdlJ3JlIG1ha2luZyB0aGlzIG9uZSB1cCB0byByZXByZXNlbnQgcmF3IHVuZW5jb2RlZCA4LWJpdAorICAgICc4Yml0JzogICAgICAgIChOb25lLCAgICAgIEJBU0U2NCwgJ3V0Zi04JyksCisgICAgfQorCisjIEFsaWFzZXMgZm9yIG90aGVyIGNvbW1vbmx5LXVzZWQgbmFtZXMgZm9yIGNoYXJhY3RlciBzZXRzLiAgTWFwCisjIHRoZW0gdG8gdGhlIHJlYWwgb25lcyB1c2VkIGluIGVtYWlsLgorQUxJQVNFUyA9IHsKKyAgICAnbGF0aW5fMSc6ICdpc28tODg1OS0xJywKKyAgICAnbGF0aW4tMSc6ICdpc28tODg1OS0xJywKKyAgICAnbGF0aW5fMic6ICdpc28tODg1OS0yJywKKyAgICAnbGF0aW4tMic6ICdpc28tODg1OS0yJywKKyAgICAnbGF0aW5fMyc6ICdpc28tODg1OS0zJywKKyAgICAnbGF0aW4tMyc6ICdpc28tODg1OS0zJywKKyAgICAnbGF0aW5fNCc6ICdpc28tODg1OS00JywKKyAgICAnbGF0aW4tNCc6ICdpc28tODg1OS00JywKKyAgICAnbGF0aW5fNSc6ICdpc28tODg1OS05JywKKyAgICAnbGF0aW4tNSc6ICdpc28tODg1OS05JywKKyAgICAnbGF0aW5fNic6ICdpc28tODg1OS0xMCcsCisgICAgJ2xhdGluLTYnOiAnaXNvLTg4NTktMTAnLAorICAgICdsYXRpbl83JzogJ2lzby04ODU5LTEzJywKKyAgICAnbGF0aW4tNyc6ICdpc28tODg1OS0xMycsCisgICAgJ2xhdGluXzgnOiAnaXNvLTg4NTktMTQnLAorICAgICdsYXRpbi04JzogJ2lzby04ODU5LTE0JywKKyAgICAnbGF0aW5fOSc6ICdpc28tODg1OS0xNScsCisgICAgJ2xhdGluLTknOiAnaXNvLTg4NTktMTUnLAorICAgICdsYXRpbl8xMCc6J2lzby04ODU5LTE2JywKKyAgICAnbGF0aW4tMTAnOidpc28tODg1OS0xNicsCisgICAgJ2NwOTQ5JzogICAna3NfY181NjAxLTE5ODcnLAorICAgICdldWNfanAnOiAgJ2V1Yy1qcCcsCisgICAgJ2V1Y19rcic6ICAnZXVjLWtyJywKKyAgICAnYXNjaWknOiAgICd1cy1hc2NpaScsCisgICAgfQorCisKKyMgTWFwIGNoYXJzZXRzIHRvIHRoZWlyIFVuaWNvZGUgY29kZWMgc3RyaW5ncy4KK0NPREVDX01BUCA9IHsKKyAgICAnZ2IyMzEyJzogICAgICAnZXVjZ2IyMzEyX2NuJywKKyAgICAnYmlnNSc6ICAgICAgICAnYmlnNV90dycsCisgICAgIyBIYWNrOiBXZSBkb24ndCB3YW50ICphbnkqIGNvbnZlcnNpb24gZm9yIHN0dWZmIG1hcmtlZCB1cy1hc2NpaSwgYXMgYWxsCisgICAgIyBzb3J0cyBvZiBnYXJiYWdlIG1pZ2h0IGJlIHNlbnQgdG8gdXMgaW4gdGhlIGd1aXNlIG9mIDctYml0IHVzLWFzY2lpLgorICAgICMgTGV0IHRoYXQgc3R1ZmYgcGFzcyB0aHJvdWdoIHdpdGhvdXQgY29udmVyc2lvbiB0by9mcm9tIFVuaWNvZGUuCisgICAgJ3VzLWFzY2lpJzogICAgTm9uZSwKKyAgICB9CisKKworDAorIyBDb252ZW5pZW5jZSBmdW5jdGlvbnMgZm9yIGV4dGVuZGluZyB0aGUgYWJvdmUgbWFwcGluZ3MKK2RlZiBhZGRfY2hhcnNldChjaGFyc2V0LCBoZWFkZXJfZW5jPU5vbmUsIGJvZHlfZW5jPU5vbmUsIG91dHB1dF9jaGFyc2V0PU5vbmUpOgorICAgICIiIkFkZCBjaGFyYWN0ZXIgc2V0IHByb3BlcnRpZXMgdG8gdGhlIGdsb2JhbCByZWdpc3RyeS4KKworICAgIGNoYXJzZXQgaXMgdGhlIGlucHV0IGNoYXJhY3RlciBzZXQsIGFuZCBtdXN0IGJlIHRoZSBjYW5vbmljYWwgbmFtZSBvZiBhCisgICAgY2hhcmFjdGVyIHNldC4KKworICAgIE9wdGlvbmFsIGhlYWRlcl9lbmMgYW5kIGJvZHlfZW5jIGlzIGVpdGhlciBDaGFyc2V0LlFQIGZvcgorICAgIHF1b3RlZC1wcmludGFibGUsIENoYXJzZXQuQkFTRTY0IGZvciBiYXNlNjQgZW5jb2RpbmcsIENoYXJzZXQuU0hPUlRFU1QgZm9yCisgICAgdGhlIHNob3J0ZXN0IG9mIHFwIG9yIGJhc2U2NCBlbmNvZGluZywgb3IgTm9uZSBmb3Igbm8gZW5jb2RpbmcuICBTSE9SVEVTVAorICAgIGlzIG9ubHkgdmFsaWQgZm9yIGhlYWRlcl9lbmMuICBJdCBkZXNjcmliZXMgaG93IG1lc3NhZ2UgaGVhZGVycyBhbmQKKyAgICBtZXNzYWdlIGJvZGllcyBpbiB0aGUgaW5wdXQgY2hhcnNldCBhcmUgdG8gYmUgZW5jb2RlZC4gIERlZmF1bHQgaXMgbm8KKyAgICBlbmNvZGluZy4KKworICAgIE9wdGlvbmFsIG91dHB1dF9jaGFyc2V0IGlzIHRoZSBjaGFyYWN0ZXIgc2V0IHRoYXQgdGhlIG91dHB1dCBzaG91bGQgYmUKKyAgICBpbi4gIENvbnZlcnNpb25zIHdpbGwgcHJvY2VlZCBmcm9tIGlucHV0IGNoYXJzZXQsIHRvIFVuaWNvZGUsIHRvIHRoZQorICAgIG91dHB1dCBjaGFyc2V0IHdoZW4gdGhlIG1ldGhvZCBDaGFyc2V0LmNvbnZlcnQoKSBpcyBjYWxsZWQuICBUaGUgZGVmYXVsdAorICAgIGlzIHRvIG91dHB1dCBpbiB0aGUgc2FtZSBjaGFyYWN0ZXIgc2V0IGFzIHRoZSBpbnB1dC4KKworICAgIEJvdGggaW5wdXRfY2hhcnNldCBhbmQgb3V0cHV0X2NoYXJzZXQgbXVzdCBoYXZlIFVuaWNvZGUgY29kZWMgZW50cmllcyBpbgorICAgIHRoZSBtb2R1bGUncyBjaGFyc2V0LXRvLWNvZGVjIG1hcHBpbmc7IHVzZSBhZGRfY29kZWMoY2hhcnNldCwgY29kZWNuYW1lKQorICAgIHRvIGFkZCBjb2RlY3MgdGhlIG1vZHVsZSBkb2VzIG5vdCBrbm93IGFib3V0LiAgU2VlIHRoZSBjb2RlY3MgbW9kdWxlJ3MKKyAgICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICIiIgorICAgIGlmIGJvZHlfZW5jID09IFNIT1JURVNUOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdTSE9SVEVTVCBub3QgYWxsb3dlZCBmb3IgYm9keV9lbmMnKQorICAgIENIQVJTRVRTW2NoYXJzZXRdID0gKGhlYWRlcl9lbmMsIGJvZHlfZW5jLCBvdXRwdXRfY2hhcnNldCkKKworCitkZWYgYWRkX2FsaWFzKGFsaWFzLCBjYW5vbmljYWwpOgorICAgICIiIkFkZCBhIGNoYXJhY3RlciBzZXQgYWxpYXMuCisKKyAgICBhbGlhcyBpcyB0aGUgYWxpYXMgbmFtZSwgZS5nLiBsYXRpbi0xCisgICAgY2Fub25pY2FsIGlzIHRoZSBjaGFyYWN0ZXIgc2V0J3MgY2Fub25pY2FsIG5hbWUsIGUuZy4gaXNvLTg4NTktMQorICAgICIiIgorICAgIEFMSUFTRVNbYWxpYXNdID0gY2Fub25pY2FsCisKKworZGVmIGFkZF9jb2RlYyhjaGFyc2V0LCBjb2RlY25hbWUpOgorICAgICIiIkFkZCBhIGNvZGVjIHRoYXQgbWFwIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIGNoYXJzZXQgdG8vZnJvbSBVbmljb2RlLgorCisgICAgY2hhcnNldCBpcyB0aGUgY2Fub25pY2FsIG5hbWUgb2YgYSBjaGFyYWN0ZXIgc2V0LiAgY29kZWNuYW1lIGlzIHRoZSBuYW1lCisgICAgb2YgYSBQeXRob24gY29kZWMsIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSB1bmljb2RlKCkKKyAgICBidWlsdC1pbiwgb3IgdG8gdGhlIGVuY29kZSgpIG1ldGhvZCBvZiBhIFVuaWNvZGUgc3RyaW5nLgorICAgICIiIgorICAgIENPREVDX01BUFtjaGFyc2V0XSA9IGNvZGVjbmFtZQorCisKKwwKK2NsYXNzIENoYXJzZXQ6CisgICAgIiIiTWFwIGNoYXJhY3RlciBzZXRzIHRvIHRoZWlyIGVtYWlsIHByb3BlcnRpZXMuCisKKyAgICBUaGlzIGNsYXNzIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXF1aXJlbWVudHMgaW1wb3NlZCBvbiBlbWFpbAorICAgIGZvciBhIHNwZWNpZmljIGNoYXJhY3RlciBzZXQuICBJdCBhbHNvIHByb3ZpZGVzIGNvbnZlbmllbmNlIHJvdXRpbmVzIGZvcgorICAgIGNvbnZlcnRpbmcgYmV0d2VlbiBjaGFyYWN0ZXIgc2V0cywgZ2l2ZW4gdGhlIGF2YWlsYWJpbGl0eSBvZiB0aGUKKyAgICBhcHBsaWNhYmxlIGNvZGVjcy4gIEdpdmVuIGEgY2hhcmFjdGVyIHNldCwgaXQgd2lsbCBkbyBpdHMgYmVzdCB0byBwcm92aWRlCisgICAgaW5mb3JtYXRpb24gb24gaG93IHRvIHVzZSB0aGF0IGNoYXJhY3RlciBzZXQgaW4gYW4gZW1haWwgaW4gYW4KKyAgICBSRkMtY29tcGxpYW50IHdheS4KKworICAgIENlcnRhaW4gY2hhcmFjdGVyIHNldHMgbXVzdCBiZSBlbmNvZGVkIHdpdGggcXVvdGVkLXByaW50YWJsZSBvciBiYXNlNjQKKyAgICB3aGVuIHVzZWQgaW4gZW1haWwgaGVhZGVycyBvciBib2RpZXMuICBDZXJ0YWluIGNoYXJhY3RlciBzZXRzIG11c3QgYmUKKyAgICBjb252ZXJ0ZWQgb3V0cmlnaHQsIGFuZCBhcmUgbm90IGFsbG93ZWQgaW4gZW1haWwuICBJbnN0YW5jZXMgb2YgdGhpcworICAgIG1vZHVsZSBleHBvc2UgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBhYm91dCBhIGNoYXJhY3RlciBzZXQ6CisKKyAgICBpbnB1dF9jaGFyc2V0OiBUaGUgaW5pdGlhbCBjaGFyYWN0ZXIgc2V0IHNwZWNpZmllZC4gIENvbW1vbiBhbGlhc2VzCisgICAgICAgICAgICAgICAgICAgYXJlIGNvbnZlcnRlZCB0byB0aGVpciBgb2ZmaWNpYWwnIGVtYWlsIG5hbWVzIChlLmcuIGxhdGluXzEKKyAgICAgICAgICAgICAgICAgICBpcyBjb252ZXJ0ZWQgdG8gaXNvLTg4NTktMSkuICBEZWZhdWx0cyB0byA3LWJpdCB1cy1hc2NpaS4KKworICAgIGhlYWRlcl9lbmNvZGluZzogSWYgdGhlIGNoYXJhY3RlciBzZXQgbXVzdCBiZSBlbmNvZGVkIGJlZm9yZSBpdCBjYW4gYmUKKyAgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gYW4gZW1haWwgaGVhZGVyLCB0aGlzIGF0dHJpYnV0ZSB3aWxsIGJlIHNldCB0bworICAgICAgICAgICAgICAgICAgICAgQ2hhcnNldC5RUCAoZm9yIHF1b3RlZC1wcmludGFibGUpLCBDaGFyc2V0LkJBU0U2NCAoZm9yCisgICAgICAgICAgICAgICAgICAgICBiYXNlNjQgZW5jb2RpbmcpLCBvciBDaGFyc2V0LlNIT1JURVNUIGZvciB0aGUgc2hvcnRlc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgIFFQIG9yIEJBU0U2NCBlbmNvZGluZy4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBOb25lLgorCisgICAgYm9keV9lbmNvZGluZzogU2FtZSBhcyBoZWFkZXJfZW5jb2RpbmcsIGJ1dCBkZXNjcmliZXMgdGhlIGVuY29kaW5nIGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICBtYWlsIG1lc3NhZ2UncyBib2R5LCB3aGljaCBpbmRlZWQgbWF5IGJlIGRpZmZlcmVudCB0aGFuIHRoZQorICAgICAgICAgICAgICAgICAgIGhlYWRlciBlbmNvZGluZy4gIENoYXJzZXQuU0hPUlRFU1QgaXMgbm90IGFsbG93ZWQgZm9yCisgICAgICAgICAgICAgICAgICAgYm9keV9lbmNvZGluZy4KKworICAgIG91dHB1dF9jaGFyc2V0OiBTb21lIGNoYXJhY3RlciBzZXRzIG11c3QgYmUgY29udmVydGVkIGJlZm9yZSB0aGUgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgIHVzZWQgaW4gZW1haWwgaGVhZGVycyBvciBib2RpZXMuICBJZiB0aGUgaW5wdXRfY2hhcnNldCBpcworICAgICAgICAgICAgICAgICAgICBvbmUgb2YgdGhlbSwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBjb250YWluIHRoZSBuYW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICBjaGFyc2V0IG91dHB1dCB3aWxsIGJlIGNvbnZlcnRlZCB0by4gIE90aGVyd2lzZSwgaXQgd2lsbAorICAgICAgICAgICAgICAgICAgICBiZSBOb25lLgorCisgICAgaW5wdXRfY29kZWM6IFRoZSBuYW1lIG9mIHRoZSBQeXRob24gY29kZWMgdXNlZCB0byBjb252ZXJ0IHRoZQorICAgICAgICAgICAgICAgICBpbnB1dF9jaGFyc2V0IHRvIFVuaWNvZGUuICBJZiBubyBjb252ZXJzaW9uIGNvZGVjIGlzCisgICAgICAgICAgICAgICAgIG5lY2Vzc2FyeSwgdGhpcyBhdHRyaWJ1dGUgd2lsbCBiZSBOb25lLgorCisgICAgb3V0cHV0X2NvZGVjOiBUaGUgbmFtZSBvZiB0aGUgUHl0aG9uIGNvZGVjIHVzZWQgdG8gY29udmVydCBVbmljb2RlCisgICAgICAgICAgICAgICAgICB0byB0aGUgb3V0cHV0X2NoYXJzZXQuICBJZiBubyBjb252ZXJzaW9uIGNvZGVjIGlzIG5lY2Vzc2FyeSwKKyAgICAgICAgICAgICAgICAgIHRoaXMgYXR0cmlidXRlIHdpbGwgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgaW5wdXRfY29kZWMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0X2NoYXJzZXQ9REVGQVVMVF9DSEFSU0VUKToKKyAgICAgICAgIyBSRkMgMjA0NiwgJDQuMS4yIHNheXMgY2hhcnNldHMgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4gIFdlIGNvZXJjZSB0bworICAgICAgICAjIHVuaWNvZGUgYmVjYXVzZSBpdHMgLmxvd2VyKCkgaXMgbG9jYWxlIGluc2Vuc2l0aXZlLiAgSWYgdGhlIGFyZ3VtZW50CisgICAgICAgICMgaXMgYWxyZWFkeSBhIHVuaWNvZGUsIHdlIGxlYXZlIGl0IGF0IHRoYXQsIGJ1dCBlbnN1cmUgdGhhdCB0aGUKKyAgICAgICAgIyBjaGFyc2V0IGlzIEFTQ0lJLCBhcyB0aGUgc3RhbmRhcmQgKFJGQyBYWFgpIHJlcXVpcmVzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlucHV0X2NoYXJzZXQsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGlucHV0X2NoYXJzZXQuZW5jb2RlKCdhc2NpaScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlucHV0X2NoYXJzZXQgPSB1bmljb2RlKGlucHV0X2NoYXJzZXQsICdhc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBlcnJvcnMuQ2hhcnNldEVycm9yKGlucHV0X2NoYXJzZXQpCisgICAgICAgIGlucHV0X2NoYXJzZXQgPSBpbnB1dF9jaGFyc2V0Lmxvd2VyKCkuZW5jb2RlKCdhc2NpaScpCisgICAgICAgICMgU2V0IHRoZSBpbnB1dCBjaGFyc2V0IGFmdGVyIGZpbHRlcmluZyB0aHJvdWdoIHRoZSBhbGlhc2VzIGFuZC9vciBjb2RlY3MKKyAgICAgICAgaWYgbm90IChpbnB1dF9jaGFyc2V0IGluIEFMSUFTRVMgb3IgaW5wdXRfY2hhcnNldCBpbiBDSEFSU0VUUyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW5wdXRfY2hhcnNldCA9IGNvZGVjcy5sb29rdXAoaW5wdXRfY2hhcnNldCkubmFtZQorICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5pbnB1dF9jaGFyc2V0ID0gQUxJQVNFUy5nZXQoaW5wdXRfY2hhcnNldCwgaW5wdXRfY2hhcnNldCkKKyAgICAgICAgIyBXZSBjYW4gdHJ5IHRvIGd1ZXNzIHdoaWNoIGVuY29kaW5nIGFuZCBjb252ZXJzaW9uIHRvIHVzZSBieSB0aGUKKyAgICAgICAgIyBjaGFyc2V0X21hcCBkaWN0aW9uYXJ5LiAgVHJ5IHRoYXQgZmlyc3QsIGJ1dCBsZXQgdGhlIHVzZXIgb3ZlcnJpZGUKKyAgICAgICAgIyBpdC4KKyAgICAgICAgaGVuYywgYmVuYywgY29udiA9IENIQVJTRVRTLmdldChzZWxmLmlucHV0X2NoYXJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNIT1JURVNULCBCQVNFNjQsIE5vbmUpKQorICAgICAgICBpZiBub3QgY29udjoKKyAgICAgICAgICAgIGNvbnYgPSBzZWxmLmlucHV0X2NoYXJzZXQKKyAgICAgICAgIyBTZXQgdGhlIGF0dHJpYnV0ZXMsIGFsbG93aW5nIHRoZSBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQuCisgICAgICAgIHNlbGYuaGVhZGVyX2VuY29kaW5nID0gaGVuYworICAgICAgICBzZWxmLmJvZHlfZW5jb2RpbmcgPSBiZW5jCisgICAgICAgIHNlbGYub3V0cHV0X2NoYXJzZXQgPSBBTElBU0VTLmdldChjb252LCBjb252KQorICAgICAgICAjIE5vdyBzZXQgdGhlIGNvZGVjcy4gIElmIG9uZSBpc24ndCBkZWZpbmVkIGZvciBpbnB1dF9jaGFyc2V0LAorICAgICAgICAjIGd1ZXNzIGFuZCB0cnkgYSBVbmljb2RlIGNvZGVjIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBpbnB1dF9jb2RlYy4KKyAgICAgICAgc2VsZi5pbnB1dF9jb2RlYyA9IENPREVDX01BUC5nZXQoc2VsZi5pbnB1dF9jaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlucHV0X2NoYXJzZXQpCisgICAgICAgIHNlbGYub3V0cHV0X2NvZGVjID0gQ09ERUNfTUFQLmdldChzZWxmLm91dHB1dF9jaGFyc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRfY2hhcnNldCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbnB1dF9jaGFyc2V0Lmxvd2VyKCkKKworICAgIF9fcmVwcl9fID0gX19zdHJfXworCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZikgPT0gc3RyKG90aGVyKS5sb3dlcigpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKKworICAgIGRlZiBnZXRfYm9keV9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nIHVzZWQgZm9yIGJvZHkgZW5jb2RpbmcuCisKKyAgICAgICAgVGhpcyBpcyBlaXRoZXIgdGhlIHN0cmluZyBgcXVvdGVkLXByaW50YWJsZScgb3IgYGJhc2U2NCcgZGVwZW5kaW5nIG9uCisgICAgICAgIHRoZSBlbmNvZGluZyB1c2VkLCBvciBpdCBpcyBhIGZ1bmN0aW9uIGluIHdoaWNoIGNhc2UgeW91IHNob3VsZCBjYWxsCisgICAgICAgIHRoZSBmdW5jdGlvbiB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LCB0aGUgTWVzc2FnZSBvYmplY3QgYmVpbmcKKyAgICAgICAgZW5jb2RlZC4gIFRoZSBmdW5jdGlvbiBzaG91bGQgdGhlbiBzZXQgdGhlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcKKyAgICAgICAgaGVhZGVyIGl0c2VsZiB0byB3aGF0ZXZlciBpcyBhcHByb3ByaWF0ZS4KKworICAgICAgICBSZXR1cm5zICJxdW90ZWQtcHJpbnRhYmxlIiBpZiBzZWxmLmJvZHlfZW5jb2RpbmcgaXMgUVAuCisgICAgICAgIFJldHVybnMgImJhc2U2NCIgaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIEJBU0U2NC4KKyAgICAgICAgUmV0dXJucyAiN2JpdCIgb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYuYm9keV9lbmNvZGluZyAhPSBTSE9SVEVTVAorICAgICAgICBpZiBzZWxmLmJvZHlfZW5jb2RpbmcgPT0gUVA6CisgICAgICAgICAgICByZXR1cm4gJ3F1b3RlZC1wcmludGFibGUnCisgICAgICAgIGVsaWYgc2VsZi5ib2R5X2VuY29kaW5nID09IEJBU0U2NDoKKyAgICAgICAgICAgIHJldHVybiAnYmFzZTY0JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGVuY29kZV83b3I4Yml0CisKKyAgICBkZWYgY29udmVydChzZWxmLCBzKToKKyAgICAgICAgIiIiQ29udmVydCBhIHN0cmluZyBmcm9tIHRoZSBpbnB1dF9jb2RlYyB0byB0aGUgb3V0cHV0X2NvZGVjLiIiIgorICAgICAgICBpZiBzZWxmLmlucHV0X2NvZGVjICE9IHNlbGYub3V0cHV0X2NvZGVjOgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUocywgc2VsZi5pbnB1dF9jb2RlYykuZW5jb2RlKHNlbGYub3V0cHV0X2NvZGVjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiB0b19zcGxpdHRhYmxlKHNlbGYsIHMpOgorICAgICAgICAiIiJDb252ZXJ0IGEgcG9zc2libHkgbXVsdGlieXRlIHN0cmluZyB0byBhIHNhZmVseSBzcGxpdHRhYmxlIGZvcm1hdC4KKworICAgICAgICBVc2VzIHRoZSBpbnB1dF9jb2RlYyB0byB0cnkgYW5kIGNvbnZlcnQgdGhlIHN0cmluZyB0byBVbmljb2RlLCBzbyBpdAorICAgICAgICBjYW4gYmUgc2FmZWx5IHNwbGl0IG9uIGNoYXJhY3RlciBib3VuZGFyaWVzIChldmVuIGZvciBtdWx0aWJ5dGUKKyAgICAgICAgY2hhcmFjdGVycykuCisKKyAgICAgICAgUmV0dXJucyB0aGUgc3RyaW5nIGFzLWlzIGlmIGl0IGlzbid0IGtub3duIGhvdyB0byBjb252ZXJ0IGl0IHRvCisgICAgICAgIFVuaWNvZGUgd2l0aCB0aGUgaW5wdXRfY2hhcnNldC4KKworICAgICAgICBDaGFyYWN0ZXJzIHRoYXQgY291bGQgbm90IGJlIGNvbnZlcnRlZCB0byBVbmljb2RlIHdpbGwgYmUgcmVwbGFjZWQKKyAgICAgICAgd2l0aCB0aGUgVW5pY29kZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIgVStGRkZELgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKSBvciBzZWxmLmlucHV0X2NvZGVjIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShzLCBzZWxmLmlucHV0X2NvZGVjLCAncmVwbGFjZScpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICMgSW5wdXQgY29kZWMgbm90IGluc3RhbGxlZCBvbiBzeXN0ZW0sIHNvIHJldHVybiB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICMgc3RyaW5nIHVuY2hhbmdlZC4KKyAgICAgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgZnJvbV9zcGxpdHRhYmxlKHNlbGYsIHVzdHIsIHRvX291dHB1dD1UcnVlKToKKyAgICAgICAgIiIiQ29udmVydCBhIHNwbGl0dGFibGUgc3RyaW5nIGJhY2sgaW50byBhbiBlbmNvZGVkIHN0cmluZy4KKworICAgICAgICBVc2VzIHRoZSBwcm9wZXIgY29kZWMgdG8gdHJ5IGFuZCBjb252ZXJ0IHRoZSBzdHJpbmcgZnJvbSBVbmljb2RlIGJhY2sKKyAgICAgICAgaW50byBhbiBlbmNvZGVkIGZvcm1hdC4gIFJldHVybiB0aGUgc3RyaW5nIGFzLWlzIGlmIGl0IGlzIG5vdCBVbmljb2RlLAorICAgICAgICBvciBpZiBpdCBjb3VsZCBub3QgYmUgY29udmVydGVkIGZyb20gVW5pY29kZS4KKworICAgICAgICBDaGFyYWN0ZXJzIHRoYXQgY291bGQgbm90IGJlIGNvbnZlcnRlZCBmcm9tIFVuaWNvZGUgd2lsbCBiZSByZXBsYWNlZAorICAgICAgICB3aXRoIGFuIGFwcHJvcHJpYXRlIGNoYXJhY3RlciAodXN1YWxseSAnPycpLgorCisgICAgICAgIElmIHRvX291dHB1dCBpcyBUcnVlICh0aGUgZGVmYXVsdCksIHVzZXMgb3V0cHV0X2NvZGVjIHRvIGNvbnZlcnQgdG8gYW4KKyAgICAgICAgZW5jb2RlZCBmb3JtYXQuICBJZiB0b19vdXRwdXQgaXMgRmFsc2UsIHVzZXMgaW5wdXRfY29kZWMuCisgICAgICAgICIiIgorICAgICAgICBpZiB0b19vdXRwdXQ6CisgICAgICAgICAgICBjb2RlYyA9IHNlbGYub3V0cHV0X2NvZGVjCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb2RlYyA9IHNlbGYuaW5wdXRfY29kZWMKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXN0ciwgdW5pY29kZSkgb3IgY29kZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB1c3RyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiB1c3RyLmVuY29kZShjb2RlYywgJ3JlcGxhY2UnKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIE91dHB1dCBjb2RlYyBub3QgaW5zdGFsbGVkCisgICAgICAgICAgICByZXR1cm4gdXN0cgorCisgICAgZGVmIGdldF9vdXRwdXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBvdXRwdXQgY2hhcmFjdGVyIHNldC4KKworICAgICAgICBUaGlzIGlzIHNlbGYub3V0cHV0X2NoYXJzZXQgaWYgdGhhdCBpcyBub3QgTm9uZSwgb3RoZXJ3aXNlIGl0IGlzCisgICAgICAgIHNlbGYuaW5wdXRfY2hhcnNldC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLm91dHB1dF9jaGFyc2V0IG9yIHNlbGYuaW5wdXRfY2hhcnNldAorCisgICAgZGVmIGVuY29kZWRfaGVhZGVyX2xlbihzZWxmLCBzKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGVuY29kZWQgaGVhZGVyIHN0cmluZy4iIiIKKyAgICAgICAgY3NldCA9IHNlbGYuZ2V0X291dHB1dF9jaGFyc2V0KCkKKyAgICAgICAgIyBUaGUgbGVuKHMpIG9mIGEgN2JpdCBlbmNvZGluZyBpcyBsZW4ocykKKyAgICAgICAgaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gQkFTRTY0OgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NG1pbWUuYmFzZTY0X2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gUVA6CisgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gU0hPUlRFU1Q6CisgICAgICAgICAgICBsZW5iNjQgPSBlbWFpbC5iYXNlNjRtaW1lLmJhc2U2NF9sZW4ocykKKyAgICAgICAgICAgIGxlbnFwID0gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihzKQorICAgICAgICAgICAgcmV0dXJuIG1pbihsZW5iNjQsIGxlbnFwKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbGVuKHMpCisKKyAgICBkZWYgaGVhZGVyX2VuY29kZShzZWxmLCBzLCBjb252ZXJ0PUZhbHNlKToKKyAgICAgICAgIiIiSGVhZGVyLWVuY29kZSBhIHN0cmluZywgb3B0aW9uYWxseSBjb252ZXJ0aW5nIGl0IHRvIG91dHB1dF9jaGFyc2V0LgorCisgICAgICAgIElmIGNvbnZlcnQgaXMgVHJ1ZSwgdGhlIHN0cmluZyB3aWxsIGJlIGNvbnZlcnRlZCBmcm9tIHRoZSBpbnB1dAorICAgICAgICBjaGFyc2V0IHRvIHRoZSBvdXRwdXQgY2hhcnNldCBhdXRvbWF0aWNhbGx5LiAgVGhpcyBpcyBub3QgdXNlZnVsIGZvcgorICAgICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVyIHNldHMsIHdoaWNoIGhhdmUgbGluZSBsZW5ndGggaXNzdWVzIChtdWx0aWJ5dGUKKyAgICAgICAgY2hhcmFjdGVycyBtdXN0IGJlIHNwbGl0IG9uIGEgY2hhcmFjdGVyLCBub3QgYSBieXRlIGJvdW5kYXJ5KTsgdXNlIHRoZQorICAgICAgICBoaWdoLWxldmVsIEhlYWRlciBjbGFzcyB0byBkZWFsIHdpdGggdGhlc2UgaXNzdWVzLiAgY29udmVydCBkZWZhdWx0cworICAgICAgICB0byBGYWxzZS4KKworICAgICAgICBUaGUgdHlwZSBvZiBlbmNvZGluZyAoYmFzZTY0IG9yIHF1b3RlZC1wcmludGFibGUpIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgICAgc2VsZi5oZWFkZXJfZW5jb2RpbmcuCisgICAgICAgICIiIgorICAgICAgICBjc2V0ID0gc2VsZi5nZXRfb3V0cHV0X2NoYXJzZXQoKQorICAgICAgICBpZiBjb252ZXJ0OgorICAgICAgICAgICAgcyA9IHNlbGYuY29udmVydChzKQorICAgICAgICAjIDdiaXQvOGJpdCBlbmNvZGluZ3MgcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkIChtb2R1bG8gY29udmVyc2lvbnMpCisgICAgICAgIGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IEJBU0U2NDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCkKKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBRUDoKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCwgbWF4bGluZWxlbj1Ob25lKQorICAgICAgICBlbGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IFNIT1JURVNUOgorICAgICAgICAgICAgbGVuYjY0ID0gZW1haWwuYmFzZTY0bWltZS5iYXNlNjRfbGVuKHMpCisgICAgICAgICAgICBsZW5xcCA9IGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4ocykKKyAgICAgICAgICAgIGlmIGxlbmI2NCA8IGxlbnFwOgorICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX2VuY29kZShzLCBjc2V0LCBtYXhsaW5lbGVuPU5vbmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcworCisgICAgZGVmIGJvZHlfZW5jb2RlKHNlbGYsIHMsIGNvbnZlcnQ9VHJ1ZSk6CisgICAgICAgICIiIkJvZHktZW5jb2RlIGEgc3RyaW5nIGFuZCBjb252ZXJ0IGl0IHRvIG91dHB1dF9jaGFyc2V0LgorCisgICAgICAgIElmIGNvbnZlcnQgaXMgVHJ1ZSAodGhlIGRlZmF1bHQpLCB0aGUgc3RyaW5nIHdpbGwgYmUgY29udmVydGVkIGZyb20KKyAgICAgICAgdGhlIGlucHV0IGNoYXJzZXQgdG8gb3V0cHV0IGNoYXJzZXQgYXV0b21hdGljYWxseS4gIFVubGlrZQorICAgICAgICBoZWFkZXJfZW5jb2RlKCksIHRoZXJlIGFyZSBubyBpc3N1ZXMgd2l0aCBieXRlIGJvdW5kYXJpZXMgYW5kCisgICAgICAgIG11bHRpYnl0ZSBjaGFyc2V0cyBpbiBlbWFpbCBib2RpZXMsIHNvIHRoaXMgaXMgdXN1YWxseSBwcmV0dHkgc2FmZS4KKworICAgICAgICBUaGUgdHlwZSBvZiBlbmNvZGluZyAoYmFzZTY0IG9yIHF1b3RlZC1wcmludGFibGUpIHdpbGwgYmUgYmFzZWQgb24KKyAgICAgICAgc2VsZi5ib2R5X2VuY29kaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgY29udmVydDoKKyAgICAgICAgICAgIHMgPSBzZWxmLmNvbnZlcnQocykKKyAgICAgICAgIyA3Yml0LzhiaXQgZW5jb2RpbmdzIHJldHVybiB0aGUgc3RyaW5nIHVuY2hhbmdlZCAobW9kdWxlIGNvbnZlcnNpb25zKQorICAgICAgICBpZiBzZWxmLmJvZHlfZW5jb2RpbmcgaXMgQkFTRTY0OgorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NG1pbWUuYm9keV9lbmNvZGUocykKKyAgICAgICAgZWxpZiBzZWxmLmJvZHlfZW5jb2RpbmcgaXMgUVA6CisgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5ib2R5X2VuY29kZShzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvY2hhcnNldC5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL2NoYXJzZXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGU1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2NoYXJzZXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvY2hhcnNldC5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL2NoYXJzZXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjE2NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2NoYXJzZXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZW5jb2RlcnMucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL2VuY29kZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDVlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2VuY29kZXJzLnB5CkBAIC0wLDAgKzEsODIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiRW5jb2RpbmdzIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4iIiIKKworX19hbGxfXyA9IFsKKyAgICAnZW5jb2RlXzdvcjhiaXQnLAorICAgICdlbmNvZGVfYmFzZTY0JywKKyAgICAnZW5jb2RlX25vb3AnLAorICAgICdlbmNvZGVfcXVvcHJpJywKKyAgICBdCisKK2ltcG9ydCBiYXNlNjQKKworZnJvbSBxdW9wcmkgaW1wb3J0IGVuY29kZXN0cmluZyBhcyBfZW5jb2Rlc3RyaW5nCisKKworDAorZGVmIF9xZW5jb2RlKHMpOgorICAgIGVuYyA9IF9lbmNvZGVzdHJpbmcocywgcXVvdGV0YWJzPVRydWUpCisgICAgIyBNdXN0IGVuY29kZSBzcGFjZXMsIHdoaWNoIHF1b3ByaS5lbmNvZGVzdHJpbmcoKSBkb2Vzbid0IGRvCisgICAgcmV0dXJuIGVuYy5yZXBsYWNlKCcgJywgJz0yMCcpCisKKworZGVmIF9iZW5jb2RlKHMpOgorICAgICMgV2UgY2FuJ3QgcXVpdGUgdXNlIGJhc2U2NC5lbmNvZGVzdHJpbmcoKSBzaW5jZSBpdCB0YWNrcyBvbiBhICJjb3VydGVzeQorICAgICMgbmV3bGluZSIuICBCbGVjaCEKKyAgICBpZiBub3QgczoKKyAgICAgICAgcmV0dXJuIHMKKyAgICBoYXNuZXdsaW5lID0gKHNbLTFdID09ICdcbicpCisgICAgdmFsdWUgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHMpCisgICAgaWYgbm90IGhhc25ld2xpbmUgYW5kIHZhbHVlWy0xXSA9PSAnXG4nOgorICAgICAgICByZXR1cm4gdmFsdWVbOi0xXQorICAgIHJldHVybiB2YWx1ZQorCisKKwwKK2RlZiBlbmNvZGVfYmFzZTY0KG1zZyk6CisgICAgIiIiRW5jb2RlIHRoZSBtZXNzYWdlJ3MgcGF5bG9hZCBpbiBCYXNlNjQuCisKKyAgICBBbHNvLCBhZGQgYW4gYXBwcm9wcmlhdGUgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyBoZWFkZXIuCisgICAgIiIiCisgICAgb3JpZyA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgZW5jZGF0YSA9IF9iZW5jb2RlKG9yaWcpCisgICAgbXNnLnNldF9wYXlsb2FkKGVuY2RhdGEpCisgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAnYmFzZTY0JworCisKKwwKK2RlZiBlbmNvZGVfcXVvcHJpKG1zZyk6CisgICAgIiIiRW5jb2RlIHRoZSBtZXNzYWdlJ3MgcGF5bG9hZCBpbiBxdW90ZWQtcHJpbnRhYmxlLgorCisgICAgQWxzbywgYWRkIGFuIGFwcHJvcHJpYXRlIENvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcgaGVhZGVyLgorICAgICIiIgorICAgIG9yaWcgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgIGVuY2RhdGEgPSBfcWVuY29kZShvcmlnKQorICAgIG1zZy5zZXRfcGF5bG9hZChlbmNkYXRhKQorICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJ3F1b3RlZC1wcmludGFibGUnCisKKworDAorZGVmIGVuY29kZV83b3I4Yml0KG1zZyk6CisgICAgIiIiU2V0IHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlciB0byA3Yml0IG9yIDhiaXQuIiIiCisgICAgb3JpZyA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgaWYgb3JpZyBpcyBOb25lOgorICAgICAgICAjIFRoZXJlJ3Mgbm8gcGF5bG9hZC4gIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3ZSB1c2UgN2JpdAorICAgICAgICBtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSA9ICc3Yml0JworICAgICAgICByZXR1cm4KKyAgICAjIFdlIHBsYXkgYSB0cmljayB0byBtYWtlIHRoaXMgZ28gZmFzdC4gIElmIGVuY29kaW5nIHRvIEFTQ0lJIHN1Y2NlZWRzLCB3ZQorICAgICMga25vdyB0aGUgZGF0YSBtdXN0IGJlIDdiaXQsIG90aGVyd2lzZSB0cmVhdCBpdCBhcyA4Yml0LgorICAgIHRyeToKKyAgICAgICAgb3JpZy5lbmNvZGUoJ2FzY2lpJykKKyAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICBtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSA9ICc4Yml0JworICAgIGVsc2U6CisgICAgICAgIG1zZ1snQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZyddID0gJzdiaXQnCisKKworDAorZGVmIGVuY29kZV9ub29wKG1zZyk6CisgICAgIiIiRG8gbm90aGluZy4iIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZW5jb2RlcnMucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lbmNvZGVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczM2FiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvZW5jb2RlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZW5jb2RlcnMucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lbmNvZGVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczM2FiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvZW5jb2RlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZXJyb3JzLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lcnJvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUyYTYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvZXJyb3JzLnB5CkBAIC0wLDAgKzEsNTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiZW1haWwgcGFja2FnZSBleGNlcHRpb24gY2xhc3Nlcy4iIiIKKworCisMCitjbGFzcyBNZXNzYWdlRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBlcnJvcnMgaW4gdGhlIGVtYWlsIHBhY2thZ2UuIiIiCisKKworY2xhc3MgTWVzc2FnZVBhcnNlRXJyb3IoTWVzc2FnZUVycm9yKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBtZXNzYWdlIHBhcnNpbmcgZXJyb3JzLiIiIgorCisKK2NsYXNzIEhlYWRlclBhcnNlRXJyb3IoTWVzc2FnZVBhcnNlRXJyb3IpOgorICAgICIiIkVycm9yIHdoaWxlIHBhcnNpbmcgaGVhZGVycy4iIiIKKworCitjbGFzcyBCb3VuZGFyeUVycm9yKE1lc3NhZ2VQYXJzZUVycm9yKToKKyAgICAiIiJDb3VsZG4ndCBmaW5kIHRlcm1pbmF0aW5nIGJvdW5kYXJ5LiIiIgorCisKK2NsYXNzIE11bHRpcGFydENvbnZlcnNpb25FcnJvcihNZXNzYWdlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgIiIiQ29udmVyc2lvbiB0byBhIG11bHRpcGFydCBpcyBwcm9oaWJpdGVkLiIiIgorCisKK2NsYXNzIENoYXJzZXRFcnJvcihNZXNzYWdlRXJyb3IpOgorICAgICIiIkFuIGlsbGVnYWwgY2hhcnNldCB3YXMgZ2l2ZW4uIiIiCisKKworDAorIyBUaGVzZSBhcmUgcGFyc2luZyBkZWZlY3RzIHdoaWNoIHRoZSBwYXJzZXIgd2FzIGFibGUgdG8gd29yayBhcm91bmQuCitjbGFzcyBNZXNzYWdlRGVmZWN0OgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGEgbWVzc2FnZSBkZWZlY3QuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZT1Ob25lKToKKyAgICAgICAgc2VsZi5saW5lID0gbGluZQorCitjbGFzcyBOb0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QoTWVzc2FnZURlZmVjdCk6CisgICAgIiIiQSBtZXNzYWdlIGNsYWltZWQgdG8gYmUgYSBtdWx0aXBhcnQgYnV0IGhhZCBubyBib3VuZGFyeSBwYXJhbWV0ZXIuIiIiCisKK2NsYXNzIFN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdChNZXNzYWdlRGVmZWN0KToKKyAgICAiIiJUaGUgY2xhaW1lZCBzdGFydCBib3VuZGFyeSB3YXMgbmV2ZXIgZm91bmQuIiIiCisKK2NsYXNzIEZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KE1lc3NhZ2VEZWZlY3QpOgorICAgICIiIkEgbWVzc2FnZSBoYWQgYSBjb250aW51YXRpb24gbGluZSBhcyBpdHMgZmlyc3QgaGVhZGVyIGxpbmUuIiIiCisKK2NsYXNzIE1pc3BsYWNlZEVudmVsb3BlSGVhZGVyRGVmZWN0KE1lc3NhZ2VEZWZlY3QpOgorICAgICIiIkEgJ1VuaXgtZnJvbScgaGVhZGVyIHdhcyBmb3VuZCBpbiB0aGUgbWlkZGxlIG9mIGEgaGVhZGVyIGJsb2NrLiIiIgorCitjbGFzcyBNYWxmb3JtZWRIZWFkZXJEZWZlY3QoTWVzc2FnZURlZmVjdCk6CisgICAgIiIiRm91bmQgYSBoZWFkZXIgdGhhdCB3YXMgbWlzc2luZyBhIGNvbG9uLCBvciB3YXMgb3RoZXJ3aXNlIG1hbGZvcm1lZC4iIiIKKworY2xhc3MgTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KE1lc3NhZ2VEZWZlY3QpOgorICAgICIiIkEgbWVzc2FnZSBjbGFpbWVkIHRvIGJlIGEgbXVsdGlwYXJ0IGJ1dCBubyBzdWJwYXJ0cyB3ZXJlIGZvdW5kLiIiIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9lcnJvcnMucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lcnJvcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmYxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2Vycm9ycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9lcnJvcnMucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9lcnJvcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNmYxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2Vycm9ycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9mZWVkcGFyc2VyLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9mZWVkcGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZGIyNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2ZlZWRwYXJzZXIucHkKQEAgLTAsMCArMSw0ODQgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yczogQmF4dGVyLCBXb3V0ZXJzIGFuZCBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiRmVlZFBhcnNlciAtIEFuIGVtYWlsIGZlZWQgcGFyc2VyLgorCitUaGUgZmVlZCBwYXJzZXIgaW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgZm9yIGluY3JlbWVudGFsbHkgcGFyc2luZyBhbiBlbWFpbAorbWVzc2FnZSwgbGluZSBieSBsaW5lLiAgVGhpcyBoYXMgYWR2YW50YWdlcyBmb3IgY2VydGFpbiBhcHBsaWNhdGlvbnMsIHN1Y2ggYXMKK3Rob3NlIHJlYWRpbmcgZW1haWwgbWVzc2FnZXMgb2ZmIGEgc29ja2V0LgorCitGZWVkUGFyc2VyLmZlZWQoKSBpcyB0aGUgcHJpbWFyeSBpbnRlcmZhY2UgZm9yIHB1c2hpbmcgbmV3IGRhdGEgaW50byB0aGUKK3BhcnNlci4gIEl0IHJldHVybnMgd2hlbiB0aGVyZSdzIG5vdGhpbmcgbW9yZSBpdCBjYW4gZG8gd2l0aCB0aGUgYXZhaWxhYmxlCitkYXRhLiAgV2hlbiB5b3UgaGF2ZSBubyBtb3JlIGRhdGEgdG8gcHVzaCBpbnRvIHRoZSBwYXJzZXIsIGNhbGwgLmNsb3NlKCkuCitUaGlzIGNvbXBsZXRlcyB0aGUgcGFyc2luZyBhbmQgcmV0dXJucyB0aGUgcm9vdCBtZXNzYWdlIG9iamVjdC4KKworVGhlIG90aGVyIGFkdmFudGFnZSBvZiB0aGlzIHBhcnNlciBpcyB0aGF0IGl0IHdpbGwgbmV2ZXIgcmFpc2UgYSBwYXJzaW5nCitleGNlcHRpb24uICBJbnN0ZWFkLCB3aGVuIGl0IGZpbmRzIHNvbWV0aGluZyB1bmV4cGVjdGVkLCBpdCBhZGRzIGEgJ2RlZmVjdCcgdG8KK3RoZSBjdXJyZW50IG1lc3NhZ2UuICBEZWZlY3RzIGFyZSBqdXN0IGluc3RhbmNlcyB0aGF0IGxpdmUgb24gdGhlIG1lc3NhZ2UKK29iamVjdCdzIC5kZWZlY3RzIGF0dHJpYnV0ZS4KKyIiIgorCitfX2FsbF9fID0gWydGZWVkUGFyc2VyJ10KKworaW1wb3J0IHJlCisKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycworZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZQorCitOTENSRSA9IHJlLmNvbXBpbGUoJ1xyXG58XHJ8XG4nKQorTkxDUkVfYm9sID0gcmUuY29tcGlsZSgnKFxyXG58XHJ8XG4pJykKK05MQ1JFX2VvbCA9IHJlLmNvbXBpbGUoJyhcclxufFxyfFxuKVxaJykKK05MQ1JFX2NyYWNrID0gcmUuY29tcGlsZSgnKFxyXG58XHJ8XG4pJykKKyMgUkZDIDI4MjIgJDMuNi44IE9wdGlvbmFsIGZpZWxkcy4gIGZ0ZXh0IGlzICVkMzMtNTcgLyAlZDU5LTEyNiwgQW55IGNoYXJhY3RlcgorIyBleGNlcHQgY29udHJvbHMsIFNQLCBhbmQgIjoiLgoraGVhZGVyUkUgPSByZS5jb21waWxlKHInXihGcm9tIHxbXDA0MS1cMDcxXDA3My1cMTc2XXsxLH06fFtcdCBdKScpCitFTVBUWVNUUklORyA9ICcnCitOTCA9ICdcbicKKworTmVlZE1vcmVEYXRhID0gb2JqZWN0KCkKKworCisMCitjbGFzcyBCdWZmZXJlZFN1YkZpbGUob2JqZWN0KToKKyAgICAiIiJBIGZpbGUtaXNoIG9iamVjdCB0aGF0IGNhbiBoYXZlIG5ldyBkYXRhIGxvYWRlZCBpbnRvIGl0LgorCisgICAgWW91IGNhbiBhbHNvIHB1c2ggYW5kIHBvcCBsaW5lLW1hdGNoaW5nIHByZWRpY2F0ZXMgb250byBhIHN0YWNrLiAgV2hlbiB0aGUKKyAgICBjdXJyZW50IHByZWRpY2F0ZSBtYXRjaGVzIHRoZSBjdXJyZW50IGxpbmUsIGEgZmFsc2UgRU9GIHJlc3BvbnNlCisgICAgKGkuZS4gZW1wdHkgc3RyaW5nKSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBsZXRzIHRoZSBwYXJzZXIgYWRoZXJlIHRvIGEKKyAgICBzaW1wbGUgYWJzdHJhY3Rpb24gLS0gaXQgcGFyc2VzIHVudGlsIEVPRiBjbG9zZXMgdGhlIGN1cnJlbnQgbWVzc2FnZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgVGhlIGxhc3QgcGFydGlhbCBsaW5lIHB1c2hlZCBpbnRvIHRoaXMgb2JqZWN0LgorICAgICAgICBzZWxmLl9wYXJ0aWFsID0gJycKKyAgICAgICAgIyBUaGUgbGlzdCBvZiBmdWxsLCBwdXNoZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXIKKyAgICAgICAgc2VsZi5fbGluZXMgPSBbXQorICAgICAgICAjIFRoZSBzdGFjayBvZiBmYWxzZS1FT0YgY2hlY2tpbmcgcHJlZGljYXRlcy4KKyAgICAgICAgc2VsZi5fZW9mc3RhY2sgPSBbXQorICAgICAgICAjIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZpbGUgaGFzIGJlZW4gY2xvc2VkIG9yIG5vdC4KKyAgICAgICAgc2VsZi5fY2xvc2VkID0gRmFsc2UKKworICAgIGRlZiBwdXNoX2VvZl9tYXRjaGVyKHNlbGYsIHByZWQpOgorICAgICAgICBzZWxmLl9lb2ZzdGFjay5hcHBlbmQocHJlZCkKKworICAgIGRlZiBwb3BfZW9mX21hdGNoZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9lb2ZzdGFjay5wb3AoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAjIERvbid0IGZvcmdldCBhbnkgdHJhaWxpbmcgcGFydGlhbCBsaW5lLgorICAgICAgICBzZWxmLl9saW5lcy5hcHBlbmQoc2VsZi5fcGFydGlhbCkKKyAgICAgICAgc2VsZi5fcGFydGlhbCA9ICcnCisgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2xpbmVzOgorICAgICAgICAgICAgaWYgc2VsZi5fY2xvc2VkOgorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAgICAgcmV0dXJuIE5lZWRNb3JlRGF0YQorICAgICAgICAjIFBvcCB0aGUgbGluZSBvZmYgdGhlIHN0YWNrIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcyB0aGUgY3VycmVudAorICAgICAgICAjIGZhbHNlLUVPRiBwcmVkaWNhdGUuCisgICAgICAgIGxpbmUgPSBzZWxmLl9saW5lcy5wb3AoKQorICAgICAgICAjIFJGQyAyMDQ2LCBzZWN0aW9uIDUuMS4yIHJlcXVpcmVzIHVzIHRvIHJlY29nbml6ZSBvdXRlciBsZXZlbAorICAgICAgICAjIGJvdW5kYXJpZXMgYXQgYW55IGxldmVsIG9mIGlubmVyIG5lc3RpbmcuICBEbyB0aGlzLCBidXQgYmUgc3VyZSBpdCdzCisgICAgICAgICMgaW4gdGhlIG9yZGVyIG9mIG1vc3QgdG8gbGVhc3QgbmVzdGVkLgorICAgICAgICBmb3IgYXRlb2YgaW4gc2VsZi5fZW9mc3RhY2tbOjotMV06CisgICAgICAgICAgICBpZiBhdGVvZihsaW5lKToKKyAgICAgICAgICAgICAgICAjIFdlJ3JlIGF0IHRoZSBmYWxzZSBFT0YuICBCdXQgcHVzaCB0aGUgbGFzdCBsaW5lIGJhY2sgZmlyc3QuCisgICAgICAgICAgICAgICAgc2VsZi5fbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgdW5yZWFkbGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgIyBMZXQgdGhlIGNvbnN1bWVyIHB1c2ggYSBsaW5lIGJhY2sgaW50byB0aGUgYnVmZmVyLgorICAgICAgICBhc3NlcnQgbGluZSBpcyBub3QgTmVlZE1vcmVEYXRhCisgICAgICAgIHNlbGYuX2xpbmVzLmFwcGVuZChsaW5lKQorCisgICAgZGVmIHB1c2goc2VsZiwgZGF0YSk6CisgICAgICAgICIiIlB1c2ggc29tZSBuZXcgZGF0YSBpbnRvIHRoaXMgb2JqZWN0LiIiIgorICAgICAgICAjIEhhbmRsZSBhbnkgcHJldmlvdXMgbGVmdG92ZXJzCisgICAgICAgIGRhdGEsIHNlbGYuX3BhcnRpYWwgPSBzZWxmLl9wYXJ0aWFsICsgZGF0YSwgJycKKyAgICAgICAgIyBDcmFjayBpbnRvIGxpbmVzLCBidXQgcHJlc2VydmUgdGhlIG5ld2xpbmVzIG9uIHRoZSBlbmQgb2YgZWFjaAorICAgICAgICBwYXJ0cyA9IE5MQ1JFX2NyYWNrLnNwbGl0KGRhdGEpCisgICAgICAgICMgVGhlICphaGVtKiBpbnRlcmVzdGluZyBiZWhhdmlvdXIgb2YgcmUuc3BsaXQgd2hlbiBzdXBwbGllZCBncm91cGluZworICAgICAgICAjIHBhcmVudGhlc2VzIGlzIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIGxpc3QgaXMgdGhlCisgICAgICAgICMgZGF0YSBhZnRlciB0aGUgZmluYWwgUkUuICBJbiB0aGUgY2FzZSBvZiBhIE5ML0NSIHRlcm1pbmF0ZWQgc3RyaW5nLAorICAgICAgICAjIHRoaXMgaXMgdGhlIGVtcHR5IHN0cmluZy4KKyAgICAgICAgc2VsZi5fcGFydGlhbCA9IHBhcnRzLnBvcCgpCisgICAgICAgICNHQU4gMjlNYXIwOSAgYnVncyAxNTU1NTcwLCAxNzIxODYyICBDb25mdXNpb24gYXQgOEsgYm91bmRhcnkgZW5kaW5nIHdpdGggXHI6CisgICAgICAgICMgaXMgdGhlcmUgYSBcbiB0byBmb2xsb3cgbGF0ZXI/CisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXJ0aWFsIGFuZCBwYXJ0cyBhbmQgcGFydHNbLTFdLmVuZHN3aXRoKCdccicpOgorICAgICAgICAgICAgc2VsZi5fcGFydGlhbCA9IHBhcnRzLnBvcCgtMikrcGFydHMucG9wKCkKKyAgICAgICAgIyBwYXJ0cyBpcyBhIGxpc3Qgb2Ygc3RyaW5ncywgYWx0ZXJuYXRpbmcgYmV0d2VlbiB0aGUgbGluZSBjb250ZW50cworICAgICAgICAjIGFuZCB0aGUgZW9sIGNoYXJhY3RlcihzKS4gIEdhdGhlciB1cCBhIGxpc3Qgb2YgbGluZXMgYWZ0ZXIKKyAgICAgICAgIyByZS1hdHRhY2hpbmcgdGhlIG5ld2xpbmVzLgorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihwYXJ0cykgLy8gMik6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQocGFydHNbaSoyXSArIHBhcnRzW2kqMisxXSkKKyAgICAgICAgc2VsZi5wdXNobGluZXMobGluZXMpCisKKyAgICBkZWYgcHVzaGxpbmVzKHNlbGYsIGxpbmVzKToKKyAgICAgICAgIyBSZXZlcnNlIGFuZCBpbnNlcnQgYXQgdGhlIGZyb250IG9mIHRoZSBsaW5lcy4KKyAgICAgICAgc2VsZi5fbGluZXNbOjBdID0gbGluZXNbOjotMV0KKworICAgIGRlZiBpc19jbG9zZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jbG9zZWQKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBsaW5lID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIGlmIGxpbmUgPT0gJyc6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJldHVybiBsaW5lCisKKworDAorY2xhc3MgRmVlZFBhcnNlcjoKKyAgICAiIiJBIGZlZWQtc3R5bGUgcGFyc2VyIG9mIGVtYWlsLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9mYWN0b3J5PW1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICAgICIiIl9mYWN0b3J5IGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyB0byBjcmVhdGUgYSBuZXcgbWVzc2FnZSBvYmoiIiIKKyAgICAgICAgc2VsZi5fZmFjdG9yeSA9IF9mYWN0b3J5CisgICAgICAgIHNlbGYuX2lucHV0ID0gQnVmZmVyZWRTdWJGaWxlKCkKKyAgICAgICAgc2VsZi5fbXNnc3RhY2sgPSBbXQorICAgICAgICBzZWxmLl9wYXJzZSA9IHNlbGYuX3BhcnNlZ2VuKCkubmV4dAorICAgICAgICBzZWxmLl9jdXIgPSBOb25lCisgICAgICAgIHNlbGYuX2xhc3QgPSBOb25lCisgICAgICAgIHNlbGYuX2hlYWRlcnNvbmx5ID0gRmFsc2UKKworICAgICMgTm9uLXB1YmxpYyBpbnRlcmZhY2UgZm9yIHN1cHBvcnRpbmcgUGFyc2VyJ3MgaGVhZGVyc29ubHkgZmxhZworICAgIGRlZiBfc2V0X2hlYWRlcnNvbmx5KHNlbGYpOgorICAgICAgICBzZWxmLl9oZWFkZXJzb25seSA9IFRydWUKKworICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJQdXNoIG1vcmUgZGF0YSBpbnRvIHRoZSBwYXJzZXIuIiIiCisgICAgICAgIHNlbGYuX2lucHV0LnB1c2goZGF0YSkKKyAgICAgICAgc2VsZi5fY2FsbF9wYXJzZSgpCisKKyAgICBkZWYgX2NhbGxfcGFyc2Uoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlKCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFsbCByZW1haW5pbmcgZGF0YSBhbmQgcmV0dXJuIHRoZSByb290IG1lc3NhZ2Ugb2JqZWN0LiIiIgorICAgICAgICBzZWxmLl9pbnB1dC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2NhbGxfcGFyc2UoKQorICAgICAgICByb290ID0gc2VsZi5fcG9wX21lc3NhZ2UoKQorICAgICAgICBhc3NlcnQgbm90IHNlbGYuX21zZ3N0YWNrCisgICAgICAgICMgTG9vayBmb3IgZmluYWwgc2V0IG9mIGRlZmVjdHMKKyAgICAgICAgaWYgcm9vdC5nZXRfY29udGVudF9tYWludHlwZSgpID09ICdtdWx0aXBhcnQnIFwKKyAgICAgICAgICAgICAgIGFuZCBub3Qgcm9vdC5pc19tdWx0aXBhcnQoKToKKyAgICAgICAgICAgIHJvb3QuZGVmZWN0cy5hcHBlbmQoZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCgpKQorICAgICAgICByZXR1cm4gcm9vdAorCisgICAgZGVmIF9uZXdfbWVzc2FnZShzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeSgpCisgICAgICAgIGlmIHNlbGYuX2N1ciBhbmQgc2VsZi5fY3VyLmdldF9jb250ZW50X3R5cGUoKSA9PSAnbXVsdGlwYXJ0L2RpZ2VzdCc6CisgICAgICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBpZiBzZWxmLl9tc2dzdGFjazoKKyAgICAgICAgICAgIHNlbGYuX21zZ3N0YWNrWy0xXS5hdHRhY2gobXNnKQorICAgICAgICBzZWxmLl9tc2dzdGFjay5hcHBlbmQobXNnKQorICAgICAgICBzZWxmLl9jdXIgPSBtc2cKKyAgICAgICAgc2VsZi5fbGFzdCA9IG1zZworCisgICAgZGVmIF9wb3BfbWVzc2FnZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5fbXNnc3RhY2sucG9wKCkKKyAgICAgICAgaWYgc2VsZi5fbXNnc3RhY2s6CisgICAgICAgICAgICBzZWxmLl9jdXIgPSBzZWxmLl9tc2dzdGFja1stMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2N1ciA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHJldHZhbAorCisgICAgZGVmIF9wYXJzZWdlbihzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBuZXcgbWVzc2FnZSBhbmQgc3RhcnQgYnkgcGFyc2luZyBoZWFkZXJzLgorICAgICAgICBzZWxmLl9uZXdfbWVzc2FnZSgpCisgICAgICAgIGhlYWRlcnMgPSBbXQorICAgICAgICAjIENvbGxlY3QgdGhlIGhlYWRlcnMsIHNlYXJjaGluZyBmb3IgYSBsaW5lIHRoYXQgZG9lc24ndCBtYXRjaCB0aGUgUkZDCisgICAgICAgICMgMjgyMiBoZWFkZXIgb3IgY29udGludWF0aW9uIHBhdHRlcm4gKGluY2x1ZGluZyBhbiBlbXB0eSBsaW5lKS4KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5faW5wdXQ6CisgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbm90IGhlYWRlclJFLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgICMgSWYgd2Ugc2F3IHRoZSBSRkMgZGVmaW5lZCBoZWFkZXIvYm9keSBzZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAjIChpLmUuIG5ld2xpbmUpLCBqdXN0IHRocm93IGl0IGF3YXkuIE90aGVyd2lzZSB0aGUgbGluZSBpcworICAgICAgICAgICAgICAgICMgcGFydCBvZiB0aGUgYm9keSBzbyBwdXNoIGl0IGJhY2suCisgICAgICAgICAgICAgICAgaWYgbm90IE5MQ1JFLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGhlYWRlcnMuYXBwZW5kKGxpbmUpCisgICAgICAgICMgRG9uZSB3aXRoIHRoZSBoZWFkZXJzLCBzbyBwYXJzZSB0aGVtIGFuZCBmaWd1cmUgb3V0IHdoYXQgd2UncmUKKyAgICAgICAgIyBzdXBwb3NlZCB0byBzZWUgaW4gdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCisgICAgICAgIHNlbGYuX3BhcnNlX2hlYWRlcnMoaGVhZGVycykKKyAgICAgICAgIyBIZWFkZXJzLW9ubHkgcGFyc2luZyBpcyBhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGhhY2ssIHdoaWNoIHdhcworICAgICAgICAjIG5lY2Vzc2FyeSBpbiB0aGUgb2xkZXIgcGFyc2VyLCB3aGljaCBjb3VsZCByYWlzZSBlcnJvcnMuICBBbGwKKyAgICAgICAgIyByZW1haW5pbmcgbGluZXMgaW4gdGhlIGlucHV0IGFyZSB0aHJvd24gaW50byB0aGUgbWVzc2FnZSBib2R5LgorICAgICAgICBpZiBzZWxmLl9oZWFkZXJzb25seToKKyAgICAgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2lucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIHNlbGYuX2N1ci5zZXRfcGF5bG9hZChFTVBUWVNUUklORy5qb2luKGxpbmVzKSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9jdXIuZ2V0X2NvbnRlbnRfdHlwZSgpID09ICdtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cyc6CisgICAgICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIGNvbnRhaW5zIGJsb2NrcyBvZiBoZWFkZXJzIHNlcGFyYXRlZCBieQorICAgICAgICAgICAgIyBhIGJsYW5rIGxpbmUuICBXZSdsbCByZXByZXNlbnQgZWFjaCBoZWFkZXIgYmxvY2sgYXMgYSBzZXBhcmF0ZQorICAgICAgICAgICAgIyBuZXN0ZWQgbWVzc2FnZSBvYmplY3QsIGJ1dCB0aGUgcHJvY2Vzc2luZyBpcyBhIGJpdCBkaWZmZXJlbnQKKyAgICAgICAgICAgICMgdGhhbiBzdGFuZGFyZCBtZXNzYWdlLyogdHlwZXMgYmVjYXVzZSB0aGVyZSBpcyBubyBib2R5IGZvciB0aGUKKyAgICAgICAgICAgICMgbmVzdGVkIG1lc3NhZ2VzLiAgQSBibGFuayBsaW5lIHNlcGFyYXRlcyB0aGUgc3VicGFydHMuCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnB1c2hfZW9mX21hdGNoZXIoTkxDUkUubWF0Y2gpCisgICAgICAgICAgICAgICAgZm9yIHJldHZhbCBpbiBzZWxmLl9wYXJzZWdlbigpOgorICAgICAgICAgICAgICAgICAgICBpZiByZXR2YWwgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG1zZyA9IHNlbGYuX3BvcF9tZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gcG9wIHRoZSBFT0YgbWF0Y2hlciBpbiBvcmRlciB0byB0ZWxsIGlmIHdlJ3JlIGF0CisgICAgICAgICAgICAgICAgIyB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGZpbGUsIG5vdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGJsb2NrCisgICAgICAgICAgICAgICAgIyBvZiBtZXNzYWdlIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgc2VsZi5faW5wdXQucG9wX2VvZl9tYXRjaGVyKCkKKyAgICAgICAgICAgICAgICAjIFRoZSBpbnB1dCBzdHJlYW0gbXVzdCBiZSBzaXR0aW5nIGF0IHRoZSBuZXdsaW5lIG9yIGF0IHRoZQorICAgICAgICAgICAgICAgICMgRU9GLiAgV2Ugd2FudCB0byBzZWUgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzIHN1YnBhcnQsIHNvCisgICAgICAgICAgICAgICAgIyBmaXJzdCBjb25zdW1lIHRoZSBibGFuayBsaW5lLCB0aGVuIHRlc3QgdGhlIG5leHQgbGluZSB0byBzZWUKKyAgICAgICAgICAgICAgICAjIGlmIHdlJ3JlIGF0IHRoaXMgc3VicGFydCdzIEVPRi4KKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5faW5wdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5faW5wdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICMgTm90IGF0IEVPRiBzbyB0aGlzIGlzIGEgbGluZSB3ZSdyZSBnb2luZyB0byBuZWVkLgorICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnVucmVhZGxpbmUobGluZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9jdXIuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbWVzc2FnZSc6CisgICAgICAgICAgICAjIFRoZSBtZXNzYWdlIGNsYWltcyB0byBiZSBhIG1lc3NhZ2UvKiB0eXBlLCB0aGVuIHdoYXQgZm9sbG93cyBpcworICAgICAgICAgICAgIyBhbm90aGVyIFJGQyAyODIyIG1lc3NhZ2UuCisgICAgICAgICAgICBmb3IgcmV0dmFsIGluIHNlbGYuX3BhcnNlZ2VuKCk6CisgICAgICAgICAgICAgICAgaWYgcmV0dmFsIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgTmVlZE1vcmVEYXRhCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuX3BvcF9tZXNzYWdlKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9jdXIuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgICAgIGJvdW5kYXJ5ID0gc2VsZi5fY3VyLmdldF9ib3VuZGFyeSgpCisgICAgICAgICAgICBpZiBib3VuZGFyeSBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgVGhlIG1lc3NhZ2UgL2NsYWltcy8gdG8gYmUgYSBtdWx0aXBhcnQgYnV0IGl0IGhhcyBub3QKKyAgICAgICAgICAgICAgICAjIGRlZmluZWQgYSBib3VuZGFyeS4gIFRoYXQncyBhIHByb2JsZW0gd2hpY2ggd2UnbGwgaGFuZGxlIGJ5CisgICAgICAgICAgICAgICAgIyByZWFkaW5nIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIEVPRiBhbmQgbWFya2luZyB0aGUgbWVzc2FnZSBhcworICAgICAgICAgICAgICAgICMgZGVmZWN0aXZlLgorICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChlcnJvcnMuTm9Cb3VuZGFyeUluTXVsdGlwYXJ0RGVmZWN0KCkpCisgICAgICAgICAgICAgICAgbGluZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLnNldF9wYXlsb2FkKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBDcmVhdGUgYSBsaW5lIG1hdGNoIHByZWRpY2F0ZSB3aGljaCBtYXRjaGVzIHRoZSBpbnRlci1wYXJ0CisgICAgICAgICAgICAjIGJvdW5kYXJ5IGFzIHdlbGwgYXMgdGhlIGVuZC1vZi1tdWx0aXBhcnQgYm91bmRhcnkuICBEb24ndCBwdXNoCisgICAgICAgICAgICAjIHRoaXMgb250byB0aGUgaW5wdXQgc3RyZWFtIHVudGlsIHdlJ3ZlIHNjYW5uZWQgcGFzdCB0aGUKKyAgICAgICAgICAgICMgcHJlYW1ibGUuCisgICAgICAgICAgICBzZXBhcmF0b3IgPSAnLS0nICsgYm91bmRhcnkKKyAgICAgICAgICAgIGJvdW5kYXJ5cmUgPSByZS5jb21waWxlKAorICAgICAgICAgICAgICAgICcoP1A8c2VwPicgKyByZS5lc2NhcGUoc2VwYXJhdG9yKSArCisgICAgICAgICAgICAgICAgcicpKD9QPGVuZD4tLSk/KD9QPHdzPlsgXHRdKikoP1A8bGluZXNlcD5cclxufFxyfFxuKT8kJykKKyAgICAgICAgICAgIGNhcHR1cmluZ19wcmVhbWJsZSA9IFRydWUKKyAgICAgICAgICAgIHByZWFtYmxlID0gW10KKyAgICAgICAgICAgIGxpbmVzZXAgPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5faW5wdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG1vID0gYm91bmRhcnlyZS5tYXRjaChsaW5lKQorICAgICAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgICAgICAjIElmIHdlJ3JlIGxvb2tpbmcgYXQgdGhlIGVuZCBib3VuZGFyeSwgd2UncmUgZG9uZSB3aXRoCisgICAgICAgICAgICAgICAgICAgICMgdGhpcyBtdWx0aXBhcnQuICBJZiB0aGVyZSB3YXMgYSBuZXdsaW5lIGF0IHRoZSBlbmQgb2YKKyAgICAgICAgICAgICAgICAgICAgIyB0aGUgY2xvc2luZyBib3VuZGFyeSwgdGhlbiB3ZSBuZWVkIHRvIGluaXRpYWxpemUgdGhlCisgICAgICAgICAgICAgICAgICAgICMgZXBpbG9ndWUgd2l0aCB0aGUgZW1wdHkgc3RyaW5nIChzZWUgYmVsb3cpLgorICAgICAgICAgICAgICAgICAgICBpZiBtby5ncm91cCgnZW5kJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc2VwID0gbW8uZ3JvdXAoJ2xpbmVzZXAnKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBzYXcgYW4gaW50ZXItcGFydCBib3VuZGFyeS4gIFdlcmUgd2UgaW4gdGhlIHByZWFtYmxlPworICAgICAgICAgICAgICAgICAgICBpZiBjYXB0dXJpbmdfcHJlYW1ibGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwcmVhbWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEFjY29yZGluZyB0byBSRkMgMjA0NiwgdGhlIGxhc3QgbmV3bGluZSBiZWxvbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0byB0aGUgYm91bmRhcnkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdGxpbmUgPSBwcmVhbWJsZVstMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb2xtbyA9IE5MQ1JFX2VvbC5zZWFyY2gobGFzdGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZW9sbW86CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWFtYmxlWy0xXSA9IGxhc3RsaW5lWzotbGVuKGVvbG1vLmdyb3VwKDApKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jdXIucHJlYW1ibGUgPSBFTVBUWVNUUklORy5qb2luKHByZWFtYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyaW5nX3ByZWFtYmxlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnVucmVhZGxpbmUobGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICMgV2Ugc2F3IGEgYm91bmRhcnkgc2VwYXJhdGluZyB0d28gcGFydHMuICBDb25zdW1lIGFueQorICAgICAgICAgICAgICAgICAgICAjIG11bHRpcGxlIGJvdW5kYXJ5IGxpbmVzIHRoYXQgbWF5IGJlIGZvbGxvd2luZy4gIE91cgorICAgICAgICAgICAgICAgICAgICAjIGludGVycHJldGF0aW9uIG9mIFJGQyAyMDQ2IEJORiBncmFtbWFyIGRvZXMgbm90IHByb2R1Y2UKKyAgICAgICAgICAgICAgICAgICAgIyBib2R5IHBhcnRzIHdpdGhpbiBzdWNoIGRvdWJsZSBib3VuZGFyaWVzLgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2lucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBtbyA9IGJvdW5kYXJ5cmUubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBtbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBSZWN1cnNlIHRvIHBhcnNlIHRoaXMgc3VicGFydDsgdGhlIGlucHV0IHN0cmVhbSBwb2ludHMKKyAgICAgICAgICAgICAgICAgICAgIyBhdCB0aGUgc3VicGFydCdzIGZpcnN0IGxpbmUuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0LnB1c2hfZW9mX21hdGNoZXIoYm91bmRhcnlyZS5tYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHJldHZhbCBpbiBzZWxmLl9wYXJzZWdlbigpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmV0dmFsIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgIyBCZWNhdXNlIG9mIFJGQyAyMDQ2LCB0aGUgbmV3bGluZSBwcmVjZWRpbmcgdGhlIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgICAgICMgc2VwYXJhdG9yIGFjdHVhbGx5IGJlbG9uZ3MgdG8gdGhlIGJvdW5kYXJ5LCBub3QgdGhlCisgICAgICAgICAgICAgICAgICAgICMgcHJldmlvdXMgc3VicGFydCdzIHBheWxvYWQgKG9yIGVwaWxvZ3VlIGlmIHRoZSBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICAjIHBhcnQgaXMgYSBtdWx0aXBhcnQpLgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9sYXN0LmdldF9jb250ZW50X21haW50eXBlKCkgPT0gJ211bHRpcGFydCc6CisgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2d1ZSA9IHNlbGYuX2xhc3QuZXBpbG9ndWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVwaWxvZ3VlID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3QuZXBpbG9ndWUgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIGVwaWxvZ3VlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vID0gTkxDUkVfZW9sLnNlYXJjaChlcGlsb2d1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gbGVuKG1vLmdyb3VwKDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0LmVwaWxvZ3VlID0gZXBpbG9ndWVbOi1lbmRdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2VsZi5fbGFzdC5nZXRfcGF5bG9hZCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBheWxvYWQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vID0gTkxDUkVfZW9sLnNlYXJjaChwYXlsb2FkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gcGF5bG9hZFs6LWxlbihtby5ncm91cCgwKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3Quc2V0X3BheWxvYWQocGF5bG9hZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5wdXQucG9wX2VvZl9tYXRjaGVyKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcG9wX21lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgbXVsdGlwYXJ0IHVwIGZvciBuZXdsaW5lIGNsZWFuc2luZywgd2hpY2ggd2lsbAorICAgICAgICAgICAgICAgICAgICAjIGhhcHBlbiBpZiB3ZSdyZSBpbiBhIG5lc3RlZCBtdWx0aXBhcnQuCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xhc3QgPSBzZWxmLl9jdXIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEkgdGhpbmsgd2UgbXVzdCBiZSBpbiB0aGUgcHJlYW1ibGUKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGNhcHR1cmluZ19wcmVhbWJsZQorICAgICAgICAgICAgICAgICAgICBwcmVhbWJsZS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICMgV2UndmUgc2VlbiBlaXRoZXIgdGhlIEVPRiBvciB0aGUgZW5kIGJvdW5kYXJ5LiAgSWYgd2UncmUgc3RpbGwKKyAgICAgICAgICAgICMgY2FwdHVyaW5nIHRoZSBwcmVhbWJsZSwgd2UgbmV2ZXIgc2F3IHRoZSBzdGFydCBib3VuZGFyeS4gIE5vdGUKKyAgICAgICAgICAgICMgdGhhdCBhcyBhIGRlZmVjdCBhbmQgc3RvcmUgdGhlIGNhcHR1cmVkIHRleHQgYXMgdGhlIHBheWxvYWQuCisgICAgICAgICAgICAjIEV2ZXJ5dGhpbmcgZnJvbSBoZXJlIHRvIHRoZSBFT0YgaXMgZXBpbG9ndWUuCisgICAgICAgICAgICBpZiBjYXB0dXJpbmdfcHJlYW1ibGU6CisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QoKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9jdXIuc2V0X3BheWxvYWQoRU1QVFlTVFJJTkcuam9pbihwcmVhbWJsZSkpCisgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBbXQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIE5lZWRNb3JlRGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZXBpbG9ndWUgPSBFTVBUWVNUUklORy5qb2luKGVwaWxvZ3VlKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBJZiB0aGUgZW5kIGJvdW5kYXJ5IGVuZGVkIGluIGEgbmV3bGluZSwgd2UnbGwgbmVlZCB0byBtYWtlIHN1cmUKKyAgICAgICAgICAgICMgdGhlIGVwaWxvZ3VlIGlzbid0IE5vbmUKKyAgICAgICAgICAgIGlmIGxpbmVzZXA6CisgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBbJyddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVwaWxvZ3VlID0gW10KKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2lucHV0OgorICAgICAgICAgICAgICAgIGlmIGxpbmUgaXMgTmVlZE1vcmVEYXRhOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlcGlsb2d1ZS5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICMgQW55IENSTEYgYXQgdGhlIGZyb250IG9mIHRoZSBlcGlsb2d1ZSBpcyBub3QgdGVjaG5pY2FsbHkgcGFydCBvZgorICAgICAgICAgICAgIyB0aGUgZXBpbG9ndWUuICBBbHNvLCB3YXRjaCBvdXQgZm9yIGFuIGVtcHR5IHN0cmluZyBlcGlsb2d1ZSwKKyAgICAgICAgICAgICMgd2hpY2ggbWVhbnMgYSBzaW5nbGUgbmV3bGluZS4KKyAgICAgICAgICAgIGlmIGVwaWxvZ3VlOgorICAgICAgICAgICAgICAgIGZpcnN0bGluZSA9IGVwaWxvZ3VlWzBdCisgICAgICAgICAgICAgICAgYm9sbW8gPSBOTENSRV9ib2wubWF0Y2goZmlyc3RsaW5lKQorICAgICAgICAgICAgICAgIGlmIGJvbG1vOgorICAgICAgICAgICAgICAgICAgICBlcGlsb2d1ZVswXSA9IGZpcnN0bGluZVtsZW4oYm9sbW8uZ3JvdXAoMCkpOl0KKyAgICAgICAgICAgIHNlbGYuX2N1ci5lcGlsb2d1ZSA9IEVNUFRZU1RSSU5HLmpvaW4oZXBpbG9ndWUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBPdGhlcndpc2UsIGl0J3Mgc29tZSBub24tbXVsdGlwYXJ0IHR5cGUsIHNvIHRoZSBlbnRpcmUgcmVzdCBvZiB0aGUKKyAgICAgICAgIyBmaWxlIGNvbnRlbnRzIGJlY29tZXMgdGhlIHBheWxvYWQuCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5faW5wdXQ6CisgICAgICAgICAgICBpZiBsaW5lIGlzIE5lZWRNb3JlRGF0YToKKyAgICAgICAgICAgICAgICB5aWVsZCBOZWVkTW9yZURhdGEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgIHNlbGYuX2N1ci5zZXRfcGF5bG9hZChFTVBUWVNUUklORy5qb2luKGxpbmVzKSkKKworICAgIGRlZiBfcGFyc2VfaGVhZGVycyhzZWxmLCBsaW5lcyk6CisgICAgICAgICMgUGFzc2VkIGEgbGlzdCBvZiBsaW5lcyB0aGF0IG1ha2UgdXAgdGhlIGhlYWRlcnMgZm9yIHRoZSBjdXJyZW50IG1zZworICAgICAgICBsYXN0aGVhZGVyID0gJycKKyAgICAgICAgbGFzdHZhbHVlID0gW10KKyAgICAgICAgZm9yIGxpbmVubywgbGluZSBpbiBlbnVtZXJhdGUobGluZXMpOgorICAgICAgICAgICAgIyBDaGVjayBmb3IgY29udGludWF0aW9uCisgICAgICAgICAgICBpZiBsaW5lWzBdIGluICcgXHQnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsYXN0aGVhZGVyOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBoZWFkZXJzIHdhcyBhIGNvbnRpbnVhdGlvbi4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgIyBpcyBpbGxlZ2FsLCBzbyBsZXQncyBub3RlIHRoZSBkZWZlY3QsIHN0b3JlIHRoZSBpbGxlZ2FsCisgICAgICAgICAgICAgICAgICAgICMgbGluZSwgYW5kIGlnbm9yZSBpdCBmb3IgcHVycG9zZXMgb2YgaGVhZGVycy4KKyAgICAgICAgICAgICAgICAgICAgZGVmZWN0ID0gZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChkZWZlY3QpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbGFzdHZhbHVlLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBsYXN0aGVhZGVyOgorICAgICAgICAgICAgICAgICMgWFhYIHJlY29uc2lkZXIgdGhlIGpvaW5pbmcgb2YgZm9sZGVkIGxpbmVzCisgICAgICAgICAgICAgICAgbGhkciA9IEVNUFRZU1RSSU5HLmpvaW4obGFzdHZhbHVlKVs6LTFdLnJzdHJpcCgnXHJcbicpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyW2xhc3RoZWFkZXJdID0gbGhkcgorICAgICAgICAgICAgICAgIGxhc3RoZWFkZXIsIGxhc3R2YWx1ZSA9ICcnLCBbXQorICAgICAgICAgICAgIyBDaGVjayBmb3IgZW52ZWxvcGUgaGVhZGVyLCBpLmUuIHVuaXgtZnJvbQorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgIGlmIGxpbmVubyA9PSAwOgorICAgICAgICAgICAgICAgICAgICAjIFN0cmlwIG9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZQorICAgICAgICAgICAgICAgICAgICBtbyA9IE5MQ1JFX2VvbC5zZWFyY2gobGluZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbW86CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LWxlbihtby5ncm91cCgwKSldCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5zZXRfdW5peGZyb20obGluZSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVubyA9PSBsZW4obGluZXMpIC0gMToKKyAgICAgICAgICAgICAgICAgICAgIyBTb21ldGhpbmcgbG9va2luZyBsaWtlIGEgdW5peC1mcm9tIGF0IHRoZSBlbmQgLSBpdCdzCisgICAgICAgICAgICAgICAgICAgICMgcHJvYmFibHkgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGJvZHksIHNvIHB1c2ggYmFjayB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBsaW5lIGFuZCBzdG9wLgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbnB1dC51bnJlYWRsaW5lKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgV2VpcmRseSBwbGFjZWQgdW5peC1mcm9tIGxpbmUuICBOb3RlIHRoaXMgYXMgYSBkZWZlY3QKKyAgICAgICAgICAgICAgICAgICAgIyBhbmQgaWdub3JlIGl0LgorICAgICAgICAgICAgICAgICAgICBkZWZlY3QgPSBlcnJvcnMuTWlzcGxhY2VkRW52ZWxvcGVIZWFkZXJEZWZlY3QobGluZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGRlZmVjdCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgU3BsaXQgdGhlIGxpbmUgb24gdGhlIGNvbG9uIHNlcGFyYXRpbmcgZmllbGQgbmFtZSBmcm9tIHZhbHVlLgorICAgICAgICAgICAgaSA9IGxpbmUuZmluZCgnOicpCisgICAgICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgICAgICBkZWZlY3QgPSBlcnJvcnMuTWFsZm9ybWVkSGVhZGVyRGVmZWN0KGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGRlZmVjdCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGFzdGhlYWRlciA9IGxpbmVbOmldCisgICAgICAgICAgICBsYXN0dmFsdWUgPSBbbGluZVtpKzE6XS5sc3RyaXAoKV0KKyAgICAgICAgIyBEb25lIHdpdGggYWxsIHRoZSBsaW5lcywgc28gaGFuZGxlIHRoZSBsYXN0IGhlYWRlci4KKyAgICAgICAgaWYgbGFzdGhlYWRlcjoKKyAgICAgICAgICAgICMgWFhYIHJlY29uc2lkZXIgdGhlIGpvaW5pbmcgb2YgZm9sZGVkIGxpbmVzCisgICAgICAgICAgICBzZWxmLl9jdXJbbGFzdGhlYWRlcl0gPSBFTVBUWVNUUklORy5qb2luKGxhc3R2YWx1ZSkucnN0cmlwKCdcclxuJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZmVlZHBhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL2ZlZWRwYXJzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDU2YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2ZlZWRwYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZmVlZHBhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL2ZlZWRwYXJzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMTEyNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL2ZlZWRwYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9nZW5lcmF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYyNmFiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsMzcyIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzZXMgdG8gZ2VuZXJhdGUgcGxhaW4gdGV4dCBmcm9tIGEgbWVzc2FnZSBvYmplY3QgdHJlZS4iIiIKKworX19hbGxfXyA9IFsnR2VuZXJhdG9yJywgJ0RlY29kZWRHZW5lcmF0b3InXQorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyCisKK1VOREVSU0NPUkUgPSAnXycKK05MID0gJ1xuJworCitmY3JlID0gcmUuY29tcGlsZShyJ15Gcm9tICcsIHJlLk1VTFRJTElORSkKKworZGVmIF9pczhiaXRzdHJpbmcocyk6CisgICAgaWYgaXNpbnN0YW5jZShzLCBzdHIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmljb2RlKHMsICd1cy1hc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCisKKwwKK2NsYXNzIEdlbmVyYXRvcjoKKyAgICAiIiJHZW5lcmF0ZXMgb3V0cHV0IGZyb20gYSBNZXNzYWdlIG9iamVjdCB0cmVlLgorCisgICAgVGhpcyBiYXNpYyBnZW5lcmF0b3Igd3JpdGVzIHRoZSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBmaWxlIG9iamVjdCBhcyBwbGFpbgorICAgIHRleHQuCisgICAgIiIiCisgICAgIworICAgICMgUHVibGljIGludGVyZmFjZQorICAgICMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRmcCwgbWFuZ2xlX2Zyb21fPVRydWUsIG1heGhlYWRlcmxlbj03OCk6CisgICAgICAgICIiIkNyZWF0ZSB0aGUgZ2VuZXJhdG9yIGZvciBtZXNzYWdlIGZsYXR0ZW5pbmcuCisKKyAgICAgICAgb3V0ZnAgaXMgdGhlIG91dHB1dCBmaWxlLWxpa2Ugb2JqZWN0IGZvciB3cml0aW5nIHRoZSBtZXNzYWdlIHRvLiAgSXQKKyAgICAgICAgbXVzdCBoYXZlIGEgd3JpdGUoKSBtZXRob2QuCisKKyAgICAgICAgT3B0aW9uYWwgbWFuZ2xlX2Zyb21fIGlzIGEgZmxhZyB0aGF0LCB3aGVuIFRydWUgKHRoZSBkZWZhdWx0KSwgZXNjYXBlcworICAgICAgICBGcm9tXyBsaW5lcyBpbiB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZSBieSBwdXR0aW5nIGEgYD4nIGluIGZyb250IG9mCisgICAgICAgIHRoZW0uCisKKyAgICAgICAgT3B0aW9uYWwgbWF4aGVhZGVybGVuIHNwZWNpZmllcyB0aGUgbG9uZ2VzdCBsZW5ndGggZm9yIGEgbm9uLWNvbnRpbnVlZAorICAgICAgICBoZWFkZXIuICBXaGVuIGEgaGVhZGVyIGxpbmUgaXMgbG9uZ2VyIChpbiBjaGFyYWN0ZXJzLCB3aXRoIHRhYnMKKyAgICAgICAgZXhwYW5kZWQgdG8gOCBzcGFjZXMpIHRoYW4gbWF4aGVhZGVybGVuLCB0aGUgaGVhZGVyIHdpbGwgc3BsaXQgYXMKKyAgICAgICAgZGVmaW5lZCBpbiB0aGUgSGVhZGVyIGNsYXNzLiAgU2V0IG1heGhlYWRlcmxlbiB0byB6ZXJvIHRvIGRpc2FibGUKKyAgICAgICAgaGVhZGVyIHdyYXBwaW5nLiAgVGhlIGRlZmF1bHQgaXMgNzgsIGFzIHJlY29tbWVuZGVkIChidXQgbm90IHJlcXVpcmVkKQorICAgICAgICBieSBSRkMgMjgyMi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2ZwID0gb3V0ZnAKKyAgICAgICAgc2VsZi5fbWFuZ2xlX2Zyb21fID0gbWFuZ2xlX2Zyb21fCisgICAgICAgIHNlbGYuX21heGhlYWRlcmxlbiA9IG1heGhlYWRlcmxlbgorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICAjIEp1c3QgZGVsZWdhdGUgdG8gdGhlIGZpbGUgb2JqZWN0CisgICAgICAgIHNlbGYuX2ZwLndyaXRlKHMpCisKKyAgICBkZWYgZmxhdHRlbihzZWxmLCBtc2csIHVuaXhmcm9tPUZhbHNlKToKKyAgICAgICAgIiIiUHJpbnQgdGhlIG1lc3NhZ2Ugb2JqZWN0IHRyZWUgcm9vdGVkIGF0IG1zZyB0byB0aGUgb3V0cHV0IGZpbGUKKyAgICAgICAgc3BlY2lmaWVkIHdoZW4gdGhlIEdlbmVyYXRvciBpbnN0YW5jZSB3YXMgY3JlYXRlZC4KKworICAgICAgICB1bml4ZnJvbSBpcyBhIGZsYWcgdGhhdCBmb3JjZXMgdGhlIHByaW50aW5nIG9mIGEgVW5peCBGcm9tXyBkZWxpbWl0ZXIKKyAgICAgICAgYmVmb3JlIHRoZSBmaXJzdCBvYmplY3QgaW4gdGhlIG1lc3NhZ2UgdHJlZS4gIElmIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgICAgICAgIGhhcyBubyBGcm9tXyBkZWxpbWl0ZXIsIGEgYHN0YW5kYXJkJyBvbmUgaXMgY3JhZnRlZC4gIEJ5IGRlZmF1bHQsIHRoaXMKKyAgICAgICAgaXMgRmFsc2UgdG8gaW5oaWJpdCB0aGUgcHJpbnRpbmcgb2YgYW55IEZyb21fIGRlbGltaXRlci4KKworICAgICAgICBOb3RlIHRoYXQgZm9yIHN1Ym9iamVjdHMsIG5vIEZyb21fIGxpbmUgaXMgcHJpbnRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHVuaXhmcm9tOgorICAgICAgICAgICAgdWZyb20gPSBtc2cuZ2V0X3VuaXhmcm9tKCkKKyAgICAgICAgICAgIGlmIG5vdCB1ZnJvbToKKyAgICAgICAgICAgICAgICB1ZnJvbSA9ICdGcm9tIG5vYm9keSAnICsgdGltZS5jdGltZSh0aW1lLnRpbWUoKSkKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCB1ZnJvbQorICAgICAgICBzZWxmLl93cml0ZShtc2cpCisKKyAgICBkZWYgY2xvbmUoc2VsZiwgZnApOgorICAgICAgICAiIiJDbG9uZSB0aGlzIGdlbmVyYXRvciB3aXRoIHRoZSBleGFjdCBzYW1lIG9wdGlvbnMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhmcCwgc2VsZi5fbWFuZ2xlX2Zyb21fLCBzZWxmLl9tYXhoZWFkZXJsZW4pCisKKyAgICAjCisgICAgIyBQcm90ZWN0ZWQgaW50ZXJmYWNlIC0gdW5kb2N1bWVudGVkIDsvCisgICAgIworCisgICAgZGVmIF93cml0ZShzZWxmLCBtc2cpOgorICAgICAgICAjIFdlIGNhbid0IHdyaXRlIHRoZSBoZWFkZXJzIHlldCBiZWNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgc2NlbmFyaW86CisgICAgICAgICMgc2F5IGEgbXVsdGlwYXJ0IG1lc3NhZ2UgaW5jbHVkZXMgdGhlIGJvdW5kYXJ5IHN0cmluZyBzb21ld2hlcmUgaW4KKyAgICAgICAgIyBpdHMgYm9keS4gIFdlJ2QgaGF2ZSB0byBjYWxjdWxhdGUgdGhlIG5ldyBib3VuZGFyeSAvYmVmb3JlLyB3ZSB3cml0ZQorICAgICAgICAjIHRoZSBoZWFkZXJzIHNvIHRoYXQgd2UgY2FuIHdyaXRlIHRoZSBjb3JyZWN0IENvbnRlbnQtVHlwZToKKyAgICAgICAgIyBwYXJhbWV0ZXIuCisgICAgICAgICMKKyAgICAgICAgIyBUaGUgd2F5IHdlIGRvIHRoaXMsIHNvIGFzIHRvIG1ha2UgdGhlIF9oYW5kbGVfKigpIG1ldGhvZHMgc2ltcGxlciwKKyAgICAgICAgIyBpcyB0byBjYWNoZSBhbnkgc3VicGFydCB3cml0ZXMgaW50byBhIFN0cmluZ0lPLiAgVGhlIHdlIHdyaXRlIHRoZQorICAgICAgICAjIGhlYWRlcnMgYW5kIHRoZSBTdHJpbmdJTyBjb250ZW50cy4gIFRoYXQgd2F5LCBzdWJwYXJ0IGhhbmRsZXJzIGNhbgorICAgICAgICAjIERvIFRoZSBSaWdodCBUaGluZywgYW5kIGNhbiBzdGlsbCBtb2RpZnkgdGhlIENvbnRlbnQtVHlwZTogaGVhZGVyIGlmCisgICAgICAgICMgbmVjZXNzYXJ5LgorICAgICAgICBvbGRmcCA9IHNlbGYuX2ZwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2ZwID0gc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgc2VsZi5fZGlzcGF0Y2gobXNnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fZnAgPSBvbGRmcAorICAgICAgICAjIFdyaXRlIHRoZSBoZWFkZXJzLiAgRmlyc3Qgd2Ugc2VlIGlmIHRoZSBtZXNzYWdlIG9iamVjdCB3YW50cyB0bworICAgICAgICAjIGhhbmRsZSB0aGF0IGl0c2VsZi4gIElmIG5vdCwgd2UnbGwgZG8gaXQgZ2VuZXJpY2FsbHkuCisgICAgICAgIG1ldGggPSBnZXRhdHRyKG1zZywgJ193cml0ZV9oZWFkZXJzJywgTm9uZSkKKyAgICAgICAgaWYgbWV0aCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fd3JpdGVfaGVhZGVycyhtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZXRoKHNlbGYpCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKHNmcC5nZXR2YWx1ZSgpKQorCisgICAgZGVmIF9kaXNwYXRjaChzZWxmLCBtc2cpOgorICAgICAgICAjIEdldCB0aGUgQ29udGVudC1UeXBlOiBmb3IgdGhlIG1lc3NhZ2UsIHRoZW4gdHJ5IHRvIGRpc3BhdGNoIHRvCisgICAgICAgICMgc2VsZi5faGFuZGxlXzxtYWludHlwZT5fPHN1YnR5cGU+KCkuICBJZiB0aGVyZSdzIG5vIGhhbmRsZXIgZm9yIHRoZQorICAgICAgICAjIGZ1bGwgTUlNRSB0eXBlLCB0aGVuIGRpc3BhdGNoIHRvIHNlbGYuX2hhbmRsZV88bWFpbnR5cGU+KCkuICBJZgorICAgICAgICAjIHRoYXQncyBtaXNzaW5nIHRvbywgdGhlbiBkaXNwYXRjaCB0byBzZWxmLl93cml0ZUJvZHkoKS4KKyAgICAgICAgbWFpbiA9IG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpCisgICAgICAgIHN1YiA9IG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCkKKyAgICAgICAgc3BlY2lmaWMgPSBVTkRFUlNDT1JFLmpvaW4oKG1haW4sIHN1YikpLnJlcGxhY2UoJy0nLCAnXycpCisgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICdfaGFuZGxlXycgKyBzcGVjaWZpYywgTm9uZSkKKyAgICAgICAgaWYgbWV0aCBpcyBOb25lOgorICAgICAgICAgICAgZ2VuZXJpYyA9IG1haW4ucmVwbGFjZSgnLScsICdfJykKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICdfaGFuZGxlXycgKyBnZW5lcmljLCBOb25lKQorICAgICAgICAgICAgaWYgbWV0aCBpcyBOb25lOgorICAgICAgICAgICAgICAgIG1ldGggPSBzZWxmLl93cml0ZUJvZHkKKyAgICAgICAgbWV0aChtc2cpCisKKyAgICAjCisgICAgIyBEZWZhdWx0IGhhbmRsZXJzCisgICAgIworCisgICAgZGVmIF93cml0ZV9oZWFkZXJzKHNlbGYsIG1zZyk6CisgICAgICAgIGZvciBoLCB2IGluIG1zZy5pdGVtcygpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsICclczonICUgaCwKKyAgICAgICAgICAgIGlmIHNlbGYuX21heGhlYWRlcmxlbiA9PSAwOgorICAgICAgICAgICAgICAgICMgRXhwbGljaXQgbm8td3JhcHBpbmcKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgdgorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHYsIEhlYWRlcik6CisgICAgICAgICAgICAgICAgIyBIZWFkZXIgaW5zdGFuY2VzIGtub3cgd2hhdCB0byBkbworICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCB2LmVuY29kZSgpCisgICAgICAgICAgICBlbGlmIF9pczhiaXRzdHJpbmcodik6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSBoYXZlIHJhdyA4Yml0IGRhdGEgaW4gYSBieXRlIHN0cmluZywgd2UgaGF2ZSBubyBpZGVhCisgICAgICAgICAgICAgICAgIyB3aGF0IHRoZSBlbmNvZGluZyBpcy4gIFRoZXJlIGlzIG5vIHNhZmUgd2F5IHRvIHNwbGl0IHRoaXMKKyAgICAgICAgICAgICAgICAjIHN0cmluZy4gIElmIGl0J3MgYXNjaWktc3Vic2V0LCB0aGVuIHdlIGNvdWxkIGRvIGEgbm9ybWFsCisgICAgICAgICAgICAgICAgIyBhc2NpaSBzcGxpdCwgYnV0IGlmIGl0J3MgbXVsdGlieXRlIHRoZW4gd2UgY291bGQgYnJlYWsgdGhlCisgICAgICAgICAgICAgICAgIyBzdHJpbmcuICBUaGVyZSdzIG5vIHdheSB0byBrbm93IHNvIHRoZSBsZWFzdCBoYXJtIHNlZW1zIHRvCisgICAgICAgICAgICAgICAgIyBiZSB0byBub3Qgc3BsaXQgdGhlIHN0cmluZyBhbmQgcmlzayBpdCBiZWluZyB0b28gbG9uZy4KKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgdgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEhlYWRlcidzIGdvdCBsb3RzIG9mIHNtYXJ0cywgc28gdXNlIGl0LiAgTm90ZSB0aGF0IHRoaXMgaXMKKyAgICAgICAgICAgICAgICAjIGZ1bmRhbWVudGFsbHkgYnJva2VuIHRob3VnaCBiZWNhdXNlIHdlIGxvc2UgaWRlbXBvdGVuY3kgd2hlbgorICAgICAgICAgICAgICAgICMgdGhlIGhlYWRlciBzdHJpbmcgaXMgY29udGludWVkIHdpdGggdGFicy4gIEl0IHdpbGwgbm93IGJlCisgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgd2l0aCBzcGFjZXMuICBUaGlzIHdhcyByZXZlcnNlZGx5IGJyb2tlbiBiZWZvcmUgd2UKKyAgICAgICAgICAgICAgICAjIGZpeGVkIGJ1ZyAxOTc0LiAgRWl0aGVyIHdheSwgd2UgbG9zZS4KKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgSGVhZGVyKAorICAgICAgICAgICAgICAgICAgICB2LCBtYXhsaW5lbGVuPXNlbGYuX21heGhlYWRlcmxlbiwgaGVhZGVyX25hbWU9aCkuZW5jb2RlKCkKKyAgICAgICAgIyBBIGJsYW5rIGxpbmUgYWx3YXlzIHNlcGFyYXRlcyBoZWFkZXJzIGZyb20gYm9keQorICAgICAgICBwcmludCA+PiBzZWxmLl9mcAorCisgICAgIworICAgICMgSGFuZGxlcnMgZm9yIHdyaXRpbmcgdHlwZXMgYW5kIHN1YnR5cGVzCisgICAgIworCisgICAgZGVmIF9oYW5kbGVfdGV4dChzZWxmLCBtc2cpOgorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgaWYgcGF5bG9hZCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBheWxvYWQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdzdHJpbmcgcGF5bG9hZCBleHBlY3RlZDogJXMnICUgdHlwZShwYXlsb2FkKSkKKyAgICAgICAgaWYgc2VsZi5fbWFuZ2xlX2Zyb21fOgorICAgICAgICAgICAgcGF5bG9hZCA9IGZjcmUuc3ViKCc+RnJvbSAnLCBwYXlsb2FkKQorICAgICAgICBzZWxmLl9mcC53cml0ZShwYXlsb2FkKQorCisgICAgIyBEZWZhdWx0IGJvZHkgaGFuZGxlcgorICAgIF93cml0ZUJvZHkgPSBfaGFuZGxlX3RleHQKKworICAgIGRlZiBfaGFuZGxlX211bHRpcGFydChzZWxmLCBtc2cpOgorICAgICAgICAjIFRoZSB0cmljayBoZXJlIGlzIHRvIHdyaXRlIG91dCBlYWNoIHBhcnQgc2VwYXJhdGVseSwgbWVyZ2UgdGhlbSBhbGwKKyAgICAgICAgIyB0b2dldGhlciwgYW5kIHRoZW4gbWFrZSBzdXJlIHRoYXQgdGhlIGJvdW5kYXJ5IHdlJ3ZlIGNob3NlbiBpc24ndAorICAgICAgICAjIHByZXNlbnQgaW4gdGhlIHBheWxvYWQuCisgICAgICAgIG1zZ3RleHRzID0gW10KKyAgICAgICAgc3VicGFydHMgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgICAgICBpZiBzdWJwYXJ0cyBpcyBOb25lOgorICAgICAgICAgICAgc3VicGFydHMgPSBbXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3VicGFydHMsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgIyBlLmcuIGEgbm9uLXN0cmljdCBwYXJzZSBvZiBhIG1lc3NhZ2Ugd2l0aCBubyBzdGFydGluZyBib3VuZGFyeS4KKyAgICAgICAgICAgIHNlbGYuX2ZwLndyaXRlKHN1YnBhcnRzKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc3VicGFydHMsIGxpc3QpOgorICAgICAgICAgICAgIyBTY2FsYXIgcGF5bG9hZAorICAgICAgICAgICAgc3VicGFydHMgPSBbc3VicGFydHNdCisgICAgICAgIGZvciBwYXJ0IGluIHN1YnBhcnRzOgorICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIGcgPSBzZWxmLmNsb25lKHMpCisgICAgICAgICAgICBnLmZsYXR0ZW4ocGFydCwgdW5peGZyb209RmFsc2UpCisgICAgICAgICAgICBtc2d0ZXh0cy5hcHBlbmQocy5nZXR2YWx1ZSgpKQorICAgICAgICAjIEJBVzogV2hhdCBhYm91dCBib3VuZGFyaWVzIHRoYXQgYXJlIHdyYXBwZWQgaW4gZG91YmxlLXF1b3Rlcz8KKyAgICAgICAgYm91bmRhcnkgPSBtc2cuZ2V0X2JvdW5kYXJ5KCkKKyAgICAgICAgaWYgbm90IGJvdW5kYXJ5OgorICAgICAgICAgICAgIyBDcmVhdGUgYSBib3VuZGFyeSB0aGF0IGRvZXNuJ3QgYXBwZWFyIGluIGFueSBvZiB0aGUKKyAgICAgICAgICAgICMgbWVzc2FnZSB0ZXh0cy4KKyAgICAgICAgICAgIGFsbHRleHQgPSBOTC5qb2luKG1zZ3RleHRzKQorICAgICAgICAgICAgYm91bmRhcnkgPSBfbWFrZV9ib3VuZGFyeShhbGx0ZXh0KQorICAgICAgICAgICAgbXNnLnNldF9ib3VuZGFyeShib3VuZGFyeSkKKyAgICAgICAgIyBJZiB0aGVyZSdzIGEgcHJlYW1ibGUsIHdyaXRlIGl0IG91dCwgd2l0aCBhIHRyYWlsaW5nIENSTEYKKyAgICAgICAgaWYgbXNnLnByZWFtYmxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5fbWFuZ2xlX2Zyb21fOgorICAgICAgICAgICAgICAgIHByZWFtYmxlID0gZmNyZS5zdWIoJz5Gcm9tICcsIG1zZy5wcmVhbWJsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJlYW1ibGUgPSBtc2cucHJlYW1ibGUKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwLCBwcmVhbWJsZQorICAgICAgICAjIGRhc2gtYm91bmRhcnkgdHJhbnNwb3J0LXBhZGRpbmcgQ1JMRgorICAgICAgICBwcmludCA+PiBzZWxmLl9mcCwgJy0tJyArIGJvdW5kYXJ5CisgICAgICAgICMgYm9keS1wYXJ0CisgICAgICAgIGlmIG1zZ3RleHRzOgorICAgICAgICAgICAgc2VsZi5fZnAud3JpdGUobXNndGV4dHMucG9wKDApKQorICAgICAgICAjICplbmNhcHN1bGF0aW9uCisgICAgICAgICMgLS0+IGRlbGltaXRlciB0cmFuc3BvcnQtcGFkZGluZworICAgICAgICAjIC0tPiBDUkxGIGJvZHktcGFydAorICAgICAgICBmb3IgYm9keV9wYXJ0IGluIG1zZ3RleHRzOgorICAgICAgICAgICAgIyBkZWxpbWl0ZXIgdHJhbnNwb3J0LXBhZGRpbmcgQ1JMRgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsICdcbi0tJyArIGJvdW5kYXJ5CisgICAgICAgICAgICAjIGJvZHktcGFydAorICAgICAgICAgICAgc2VsZi5fZnAud3JpdGUoYm9keV9wYXJ0KQorICAgICAgICAjIGNsb3NlLWRlbGltaXRlciB0cmFuc3BvcnQtcGFkZGluZworICAgICAgICBzZWxmLl9mcC53cml0ZSgnXG4tLScgKyBib3VuZGFyeSArICctLScpCisgICAgICAgIGlmIG1zZy5lcGlsb2d1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuX2ZwCisgICAgICAgICAgICBpZiBzZWxmLl9tYW5nbGVfZnJvbV86CisgICAgICAgICAgICAgICAgZXBpbG9ndWUgPSBmY3JlLnN1YignPkZyb20gJywgbXNnLmVwaWxvZ3VlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcGlsb2d1ZSA9IG1zZy5lcGlsb2d1ZQorICAgICAgICAgICAgc2VsZi5fZnAud3JpdGUoZXBpbG9ndWUpCisKKyAgICBkZWYgX2hhbmRsZV9tdWx0aXBhcnRfc2lnbmVkKHNlbGYsIG1zZyk6CisgICAgICAgICMgVGhlIGNvbnRlbnRzIG9mIHNpZ25lZCBwYXJ0cyBoYXMgdG8gc3RheSB1bm1vZGlmaWVkIGluIG9yZGVyIHRvIGtlZXAKKyAgICAgICAgIyB0aGUgc2lnbmF0dXJlIGludGFjdCBwZXIgUkZDMTg0NyAyLjEsIHNvIHdlIGRpc2FibGUgaGVhZGVyIHdyYXBwaW5nLgorICAgICAgICAjIFJETTogVGhpcyBpc24ndCBlbm91Z2ggdG8gY29tcGxldGVseSBwcmVzZXJ2ZSB0aGUgcGFydCwgYnV0IGl0IGhlbHBzLgorICAgICAgICBvbGRfbWF4aGVhZGVybGVuID0gc2VsZi5fbWF4aGVhZGVybGVuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX21heGhlYWRlcmxlbiA9IDAKKyAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9tdWx0aXBhcnQobXNnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbWF4aGVhZGVybGVuID0gb2xkX21heGhlYWRlcmxlbgorCisgICAgZGVmIF9oYW5kbGVfbWVzc2FnZV9kZWxpdmVyeV9zdGF0dXMoc2VsZiwgbXNnKToKKyAgICAgICAgIyBXZSBjYW4ndCBqdXN0IHdyaXRlIHRoZSBoZWFkZXJzIGRpcmVjdGx5IHRvIHNlbGYncyBmaWxlIG9iamVjdAorICAgICAgICAjIGJlY2F1c2UgdGhpcyB3aWxsIGxlYXZlIGFuIGV4dHJhIG5ld2xpbmUgYmV0d2VlbiB0aGUgbGFzdCBoZWFkZXIKKyAgICAgICAgIyBibG9jayBhbmQgdGhlIGJvdW5kYXJ5LiAgU2lnaC4KKyAgICAgICAgYmxvY2tzID0gW10KKyAgICAgICAgZm9yIHBhcnQgaW4gbXNnLmdldF9wYXlsb2FkKCk6CisgICAgICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgZyA9IHNlbGYuY2xvbmUocykKKyAgICAgICAgICAgIGcuZmxhdHRlbihwYXJ0LCB1bml4ZnJvbT1GYWxzZSkKKyAgICAgICAgICAgIHRleHQgPSBzLmdldHZhbHVlKCkKKyAgICAgICAgICAgIGxpbmVzID0gdGV4dC5zcGxpdCgnXG4nKQorICAgICAgICAgICAgIyBTdHJpcCBvZmYgdGhlIHVubmVjZXNzYXJ5IHRyYWlsaW5nIGVtcHR5IGxpbmUKKyAgICAgICAgICAgIGlmIGxpbmVzIGFuZCBsaW5lc1stMV0gPT0gJyc6CisgICAgICAgICAgICAgICAgYmxvY2tzLmFwcGVuZChOTC5qb2luKGxpbmVzWzotMV0pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBibG9ja3MuYXBwZW5kKHRleHQpCisgICAgICAgICMgTm93IGpvaW4gYWxsIHRoZSBibG9ja3Mgd2l0aCBhbiBlbXB0eSBsaW5lLiAgVGhpcyBoYXMgdGhlIGxvdmVseQorICAgICAgICAjIGVmZmVjdCBvZiBzZXBhcmF0aW5nIGVhY2ggYmxvY2sgd2l0aCBhbiBlbXB0eSBsaW5lLCBidXQgbm90IGFkZGluZworICAgICAgICAjIGFuIGV4dHJhIG9uZSBhZnRlciB0aGUgbGFzdCBvbmUuCisgICAgICAgIHNlbGYuX2ZwLndyaXRlKE5MLmpvaW4oYmxvY2tzKSkKKworICAgIGRlZiBfaGFuZGxlX21lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IHNlbGYuY2xvbmUocykKKyAgICAgICAgIyBUaGUgcGF5bG9hZCBvZiBhIG1lc3NhZ2UvcmZjODIyIHBhcnQgc2hvdWxkIGJlIGEgbXVsdGlwYXJ0IHNlcXVlbmNlCisgICAgICAgICMgb2YgbGVuZ3RoIDEuICBUaGUgemVyb3RoIGVsZW1lbnQgb2YgdGhlIGxpc3Qgc2hvdWxkIGJlIHRoZSBNZXNzYWdlCisgICAgICAgICMgb2JqZWN0IGZvciB0aGUgc3VicGFydC4gIEV4dHJhY3QgdGhhdCBvYmplY3QsIHN0cmluZ2lmeSBpdCwgYW5kCisgICAgICAgICMgd3JpdGUgaXQgb3V0LgorICAgICAgICAjIEV4Y2VwdCwgaXQgdHVybnMgb3V0LCB3aGVuIGl0J3MgYSBzdHJpbmcgaW5zdGVhZCwgd2hpY2ggaGFwcGVucyB3aGVuCisgICAgICAgICMgYW5kIG9ubHkgd2hlbiBIZWFkZXJQYXJzZXIgaXMgdXNlZCBvbiBhIG1lc3NhZ2Ugb2YgbWltZSB0eXBlCisgICAgICAgICMgbWVzc2FnZS9yZmM4MjIuICBTdWNoIG1lc3NhZ2VzIGFyZSBnZW5lcmF0ZWQgYnksIGZvciBleGFtcGxlLAorICAgICAgICAjIEdyb3Vwd2lzZSB3aGVuIGZvcndhcmRpbmcgdW5hZG9ybmVkIG1lc3NhZ2VzLiAgKElzc3VlIDc5NzAuKSAgU28KKyAgICAgICAgIyBpbiB0aGF0IGNhc2Ugd2UganVzdCBlbWl0IHRoZSBzdHJpbmcgYm9keS4KKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIGlmIGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCk6CisgICAgICAgICAgICBnLmZsYXR0ZW4obXNnLmdldF9wYXlsb2FkKDApLCB1bml4ZnJvbT1GYWxzZSkKKyAgICAgICAgICAgIHBheWxvYWQgPSBzLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fZnAud3JpdGUocGF5bG9hZCkKKworCisMCitfRk1UID0gJ1tOb24tdGV4dCAoJSh0eXBlKXMpIHBhcnQgb2YgbWVzc2FnZSBvbWl0dGVkLCBmaWxlbmFtZSAlKGZpbGVuYW1lKXNdJworCitjbGFzcyBEZWNvZGVkR2VuZXJhdG9yKEdlbmVyYXRvcik6CisgICAgIiIiR2VuZXJhdGVzIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIG1lc3NhZ2UuCisKKyAgICBMaWtlIHRoZSBHZW5lcmF0b3IgYmFzZSBjbGFzcywgZXhjZXB0IHRoYXQgbm9uLXRleHQgcGFydHMgYXJlIHN1YnN0aXR1dGVkCisgICAgd2l0aCBhIGZvcm1hdCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXJ0LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXRmcCwgbWFuZ2xlX2Zyb21fPVRydWUsIG1heGhlYWRlcmxlbj03OCwgZm10PU5vbmUpOgorICAgICAgICAiIiJMaWtlIEdlbmVyYXRvci5fX2luaXRfXygpIGV4Y2VwdCB0aGF0IGFuIGFkZGl0aW9uYWwgb3B0aW9uYWwKKyAgICAgICAgYXJndW1lbnQgaXMgYWxsb3dlZC4KKworICAgICAgICBXYWxrcyB0aHJvdWdoIGFsbCBzdWJwYXJ0cyBvZiBhIG1lc3NhZ2UuICBJZiB0aGUgc3VicGFydCBpcyBvZiBtYWluCisgICAgICAgIHR5cGUgYHRleHQnLCB0aGVuIGl0IHByaW50cyB0aGUgZGVjb2RlZCBwYXlsb2FkIG9mIHRoZSBzdWJwYXJ0LgorCisgICAgICAgIE90aGVyd2lzZSwgZm10IGlzIGEgZm9ybWF0IHN0cmluZyB0aGF0IGlzIHVzZWQgaW5zdGVhZCBvZiB0aGUgbWVzc2FnZQorICAgICAgICBwYXlsb2FkLiAgZm10IGlzIGV4cGFuZGVkIHdpdGggdGhlIGZvbGxvd2luZyBrZXl3b3JkcyAoaW4KKyAgICAgICAgJShrZXl3b3JkKXMgZm9ybWF0KToKKworICAgICAgICB0eXBlICAgICAgIDogRnVsbCBNSU1FIHR5cGUgb2YgdGhlIG5vbi10ZXh0IHBhcnQKKyAgICAgICAgbWFpbnR5cGUgICA6IE1haW4gTUlNRSB0eXBlIG9mIHRoZSBub24tdGV4dCBwYXJ0CisgICAgICAgIHN1YnR5cGUgICAgOiBTdWItTUlNRSB0eXBlIG9mIHRoZSBub24tdGV4dCBwYXJ0CisgICAgICAgIGZpbGVuYW1lICAgOiBGaWxlbmFtZSBvZiB0aGUgbm9uLXRleHQgcGFydAorICAgICAgICBkZXNjcmlwdGlvbjogRGVzY3JpcHRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBub24tdGV4dCBwYXJ0CisgICAgICAgIGVuY29kaW5nICAgOiBDb250ZW50IHRyYW5zZmVyIGVuY29kaW5nIG9mIHRoZSBub24tdGV4dCBwYXJ0CisKKyAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGZtdCBpcyBOb25lLCBtZWFuaW5nCisKKyAgICAgICAgW05vbi10ZXh0ICglKHR5cGUpcykgcGFydCBvZiBtZXNzYWdlIG9taXR0ZWQsIGZpbGVuYW1lICUoZmlsZW5hbWUpc10KKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRvci5fX2luaXRfXyhzZWxmLCBvdXRmcCwgbWFuZ2xlX2Zyb21fLCBtYXhoZWFkZXJsZW4pCisgICAgICAgIGlmIGZtdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fZm10ID0gX0ZNVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZm10ID0gZm10CisKKyAgICBkZWYgX2Rpc3BhdGNoKHNlbGYsIG1zZyk6CisgICAgICAgIGZvciBwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgICAgICBtYWludHlwZSA9IHBhcnQuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKQorICAgICAgICAgICAgaWYgbWFpbnR5cGUgPT0gJ3RleHQnOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYsIHBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpCisgICAgICAgICAgICBlbGlmIG1haW50eXBlID09ICdtdWx0aXBhcnQnOgorICAgICAgICAgICAgICAgICMgSnVzdCBza2lwIHRoaXMKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYsIHNlbGYuX2ZtdCAlIHsKKyAgICAgICAgICAgICAgICAgICAgJ3R5cGUnICAgICAgIDogcGFydC5nZXRfY29udGVudF90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICdtYWludHlwZScgICA6IHBhcnQuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgJ3N1YnR5cGUnICAgIDogcGFydC5nZXRfY29udGVudF9zdWJ0eXBlKCksCisgICAgICAgICAgICAgICAgICAgICdmaWxlbmFtZScgICA6IHBhcnQuZ2V0X2ZpbGVuYW1lKCdbbm8gZmlsZW5hbWVdJyksCisgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbic6IHBhcnQuZ2V0KCdDb250ZW50LURlc2NyaXB0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tubyBkZXNjcmlwdGlvbl0nKSwKKyAgICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyAgIDogcGFydC5nZXQoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW25vIGVuY29kaW5nXScpLAorICAgICAgICAgICAgICAgICAgICB9CisKKworDAorIyBIZWxwZXIKK193aWR0aCA9IGxlbihyZXByKHN5cy5tYXhpbnQtMSkpCitfZm10ID0gJyUlMCVkZCcgJSBfd2lkdGgKKworZGVmIF9tYWtlX2JvdW5kYXJ5KHRleHQ9Tm9uZSk6CisgICAgIyBDcmFmdCBhIHJhbmRvbSBib3VuZGFyeS4gIElmIHRleHQgaXMgZ2l2ZW4sIGVuc3VyZSB0aGF0IHRoZSBjaG9zZW4KKyAgICAjIGJvdW5kYXJ5IGRvZXNuJ3QgYXBwZWFyIGluIHRoZSB0ZXh0LgorICAgIHRva2VuID0gcmFuZG9tLnJhbmRyYW5nZShzeXMubWF4aW50KQorICAgIGJvdW5kYXJ5ID0gKCc9JyAqIDE1KSArIChfZm10ICUgdG9rZW4pICsgJz09JworICAgIGlmIHRleHQgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIGJvdW5kYXJ5CisgICAgYiA9IGJvdW5kYXJ5CisgICAgY291bnRlciA9IDAKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBjcmUgPSByZS5jb21waWxlKCdeLS0nICsgcmUuZXNjYXBlKGIpICsgJygtLSk/JCcsIHJlLk1VTFRJTElORSkKKyAgICAgICAgaWYgbm90IGNyZS5zZWFyY2godGV4dCk6CisgICAgICAgICAgICBicmVhaworICAgICAgICBiID0gYm91bmRhcnkgKyAnLicgKyBzdHIoY291bnRlcikKKyAgICAgICAgY291bnRlciArPSAxCisgICAgcmV0dXJuIGIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRhMDRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9nZW5lcmF0b3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvZ2VuZXJhdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRhMDRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9nZW5lcmF0b3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9oZWFkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmODcwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5CkBAIC0wLDAgKzEsNTE0IEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQsIEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJIZWFkZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZ1bmN0aW9uYWxpdHkuIiIiCisKK19fYWxsX18gPSBbCisgICAgJ0hlYWRlcicsCisgICAgJ2RlY29kZV9oZWFkZXInLAorICAgICdtYWtlX2hlYWRlcicsCisgICAgXQorCitpbXBvcnQgcmUKK2ltcG9ydCBiaW5hc2NpaQorCitpbXBvcnQgZW1haWwucXVvcHJpbWltZQoraW1wb3J0IGVtYWlsLmJhc2U2NG1pbWUKKworZnJvbSBlbWFpbC5lcnJvcnMgaW1wb3J0IEhlYWRlclBhcnNlRXJyb3IKK2Zyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldAorCitOTCA9ICdcbicKK1NQQUNFID0gJyAnCitVU1BBQ0UgPSB1JyAnCitTUEFDRTggPSAnICcgKiA4CitVRU1QVFlTVFJJTkcgPSB1JycKKworTUFYTElORUxFTiA9IDc2CisKK1VTQVNDSUkgPSBDaGFyc2V0KCd1cy1hc2NpaScpCitVVEY4ID0gQ2hhcnNldCgndXRmLTgnKQorCisjIE1hdGNoIGVuY29kZWQtd29yZCBzdHJpbmdzIGluIHRoZSBmb3JtID0/Y2hhcnNldD9xP0hlbGxvX1dvcmxkPz0KK2VjcmUgPSByZS5jb21waWxlKHInJycKKyAgPVw/ICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA9PworICAoP1A8Y2hhcnNldD5bXj9dKj8pICAgIyBub24tZ3JlZWR5IHVwIHRvIHRoZSBuZXh0ID8gaXMgdGhlIGNoYXJzZXQKKyAgXD8gICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/CisgICg/UDxlbmNvZGluZz5bcWJdKSAgICAjIGVpdGhlciBhICJxIiBvciBhICJiIiwgY2FzZSBpbnNlbnNpdGl2ZQorICBcPyAgICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID8KKyAgKD9QPGVuY29kZWQ+Lio/KSAgICAgICMgbm9uLWdyZWVkeSB1cCB0byB0aGUgbmV4dCA/PSBpcyB0aGUgZW5jb2RlZCBzdHJpbmcKKyAgXD89ICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/PQorICAoPz1bIFx0XXwkKSAgICAgICAgICAgIyB3aGl0ZXNwYWNlIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAnJycsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFIHwgcmUuTVVMVElMSU5FKQorCisjIEZpZWxkIG5hbWUgcmVnZXhwLCBpbmNsdWRpbmcgdHJhaWxpbmcgY29sb24sIGJ1dCBub3Qgc2VwYXJhdGluZyB3aGl0ZXNwYWNlLAorIyBhY2NvcmRpbmcgdG8gUkZDIDI4MjIuICBDaGFyYWN0ZXIgcmFuZ2UgaXMgZnJvbSB0aWxkZSB0byBleGNsYW1hdGlvbiBtYXJrLgorIyBGb3IgdXNlIHdpdGggLm1hdGNoKCkKK2ZjcmUgPSByZS5jb21waWxlKHInW1wwNDEtXDE3Nl0rOiQnKQorCisjIEZpbmQgYSBoZWFkZXIgZW1iZWRkZWQgaW4gYSBwdXRhdGl2ZSBoZWFkZXIgdmFsdWUuICBVc2VkIHRvIGNoZWNrIGZvcgorIyBoZWFkZXIgaW5qZWN0aW9uIGF0dGFjay4KK19lbWJlZGVkX2hlYWRlciA9IHJlLmNvbXBpbGUocidcblteIFx0XSs6JykKKworCisMCisjIEhlbHBlcnMKK19tYXhfYXBwZW5kID0gZW1haWwucXVvcHJpbWltZS5fbWF4X2FwcGVuZAorCisKKwwKK2RlZiBkZWNvZGVfaGVhZGVyKGhlYWRlcik6CisgICAgIiIiRGVjb2RlIGEgbWVzc2FnZSBoZWFkZXIgdmFsdWUgd2l0aG91dCBjb252ZXJ0aW5nIGNoYXJzZXQuCisKKyAgICBSZXR1cm5zIGEgbGlzdCBvZiAoZGVjb2RlZF9zdHJpbmcsIGNoYXJzZXQpIHBhaXJzIGNvbnRhaW5pbmcgZWFjaCBvZiB0aGUKKyAgICBkZWNvZGVkIHBhcnRzIG9mIHRoZSBoZWFkZXIuICBDaGFyc2V0IGlzIE5vbmUgZm9yIG5vbi1lbmNvZGVkIHBhcnRzIG9mIHRoZQorICAgIGhlYWRlciwgb3RoZXJ3aXNlIGEgbG93ZXItY2FzZSBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgY2hhcmFjdGVyCisgICAgc2V0IHNwZWNpZmllZCBpbiB0aGUgZW5jb2RlZCBzdHJpbmcuCisKKyAgICBBbiBlbWFpbC5lcnJvcnMuSGVhZGVyUGFyc2VFcnJvciBtYXkgYmUgcmFpc2VkIHdoZW4gY2VydGFpbiBkZWNvZGluZyBlcnJvcgorICAgIG9jY3VycyAoZS5nLiBhIGJhc2U2NCBkZWNvZGluZyBleGNlcHRpb24pLgorICAgICIiIgorICAgICMgSWYgbm8gZW5jb2RpbmcsIGp1c3QgcmV0dXJuIHRoZSBoZWFkZXIKKyAgICBoZWFkZXIgPSBzdHIoaGVhZGVyKQorICAgIGlmIG5vdCBlY3JlLnNlYXJjaChoZWFkZXIpOgorICAgICAgICByZXR1cm4gWyhoZWFkZXIsIE5vbmUpXQorICAgIGRlY29kZWQgPSBbXQorICAgIGRlYyA9ICcnCisgICAgZm9yIGxpbmUgaW4gaGVhZGVyLnNwbGl0bGluZXMoKToKKyAgICAgICAgIyBUaGlzIGxpbmUgbWlnaHQgbm90IGhhdmUgYW4gZW5jb2RpbmcgaW4gaXQKKyAgICAgICAgaWYgbm90IGVjcmUuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgZGVjb2RlZC5hcHBlbmQoKGxpbmUsIE5vbmUpKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcGFydHMgPSBlY3JlLnNwbGl0KGxpbmUpCisgICAgICAgIHdoaWxlIHBhcnRzOgorICAgICAgICAgICAgdW5lbmMgPSBwYXJ0cy5wb3AoMCkuc3RyaXAoKQorICAgICAgICAgICAgaWYgdW5lbmM6CisgICAgICAgICAgICAgICAgIyBTaG91bGQgd2UgY29udGludWUgYSBsb25nIGxpbmU/CisgICAgICAgICAgICAgICAgaWYgZGVjb2RlZCBhbmQgZGVjb2RlZFstMV1bMV0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFstMV0gPSAoZGVjb2RlZFstMV1bMF0gKyBTUEFDRSArIHVuZW5jLCBOb25lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRlY29kZWQuYXBwZW5kKCh1bmVuYywgTm9uZSkpCisgICAgICAgICAgICBpZiBwYXJ0czoKKyAgICAgICAgICAgICAgICBjaGFyc2V0LCBlbmNvZGluZyA9IFtzLmxvd2VyKCkgZm9yIHMgaW4gcGFydHNbMDoyXV0KKyAgICAgICAgICAgICAgICBlbmNvZGVkID0gcGFydHNbMl0KKyAgICAgICAgICAgICAgICBkZWMgPSBOb25lCisgICAgICAgICAgICAgICAgaWYgZW5jb2RpbmcgPT0gJ3EnOgorICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9kZWNvZGUoZW5jb2RlZCkKKyAgICAgICAgICAgICAgICBlbGlmIGVuY29kaW5nID09ICdiJzoKKyAgICAgICAgICAgICAgICAgICAgcGFkZXJyID0gbGVuKGVuY29kZWQpICUgNCAgICMgUG9zdGVsJ3MgbGF3OiBhZGQgbWlzc2luZyBwYWRkaW5nCisgICAgICAgICAgICAgICAgICAgIGlmIHBhZGVycjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWQgKz0gJz09PSdbOjQgLSBwYWRlcnJdCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYyA9IGVtYWlsLmJhc2U2NG1pbWUuZGVjb2RlKGVuY29kZWQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVHVybiB0aGlzIGludG8gYSBoaWdoZXIgbGV2ZWwgZXhjZXB0aW9uLiAgQkFXOiBSaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgd2UgdGhyb3cgdGhlIGxvd2VyIGxldmVsIGV4Y2VwdGlvbiBhd2F5IGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVuL2lmIHdlIGdldCBleGNlcHRpb24gY2hhaW5pbmcsIHdlJ2xsIHByZXNlcnZlIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSGVhZGVyUGFyc2VFcnJvcgorICAgICAgICAgICAgICAgIGlmIGRlYyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbmNvZGVkCisKKyAgICAgICAgICAgICAgICBpZiBkZWNvZGVkIGFuZCBkZWNvZGVkWy0xXVsxXSA9PSBjaGFyc2V0OgorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkWy0xXSA9IChkZWNvZGVkWy0xXVswXSArIGRlYywgZGVjb2RlZFstMV1bMV0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZC5hcHBlbmQoKGRlYywgY2hhcnNldCkpCisgICAgICAgICAgICBkZWwgcGFydHNbMDozXQorICAgIHJldHVybiBkZWNvZGVkCisKKworDAorZGVmIG1ha2VfaGVhZGVyKGRlY29kZWRfc2VxLCBtYXhsaW5lbGVuPU5vbmUsIGhlYWRlcl9uYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPScgJyk6CisgICAgIiIiQ3JlYXRlIGEgSGVhZGVyIGZyb20gYSBzZXF1ZW5jZSBvZiBwYWlycyBhcyByZXR1cm5lZCBieSBkZWNvZGVfaGVhZGVyKCkKKworICAgIGRlY29kZV9oZWFkZXIoKSB0YWtlcyBhIGhlYWRlciB2YWx1ZSBzdHJpbmcgYW5kIHJldHVybnMgYSBzZXF1ZW5jZSBvZgorICAgIHBhaXJzIG9mIHRoZSBmb3JtYXQgKGRlY29kZWRfc3RyaW5nLCBjaGFyc2V0KSB3aGVyZSBjaGFyc2V0IGlzIHRoZSBzdHJpbmcKKyAgICBuYW1lIG9mIHRoZSBjaGFyYWN0ZXIgc2V0LgorCisgICAgVGhpcyBmdW5jdGlvbiB0YWtlcyBvbmUgb2YgdGhvc2Ugc2VxdWVuY2Ugb2YgcGFpcnMgYW5kIHJldHVybnMgYSBIZWFkZXIKKyAgICBpbnN0YW5jZS4gIE9wdGlvbmFsIG1heGxpbmVsZW4sIGhlYWRlcl9uYW1lLCBhbmQgY29udGludWF0aW9uX3dzIGFyZSBhcyBpbgorICAgIHRoZSBIZWFkZXIgY29uc3RydWN0b3IuCisgICAgIiIiCisgICAgaCA9IEhlYWRlcihtYXhsaW5lbGVuPW1heGxpbmVsZW4sIGhlYWRlcl9uYW1lPWhlYWRlcl9uYW1lLAorICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPWNvbnRpbnVhdGlvbl93cykKKyAgICBmb3IgcywgY2hhcnNldCBpbiBkZWNvZGVkX3NlcToKKyAgICAgICAgIyBOb25lIG1lYW5zIHVzLWFzY2lpIGJ1dCB3ZSBjYW4gc2ltcGx5IHBhc3MgaXQgb24gdG8gaC5hcHBlbmQoKQorICAgICAgICBpZiBjaGFyc2V0IGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShjaGFyc2V0LCBDaGFyc2V0KToKKyAgICAgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGguYXBwZW5kKHMsIGNoYXJzZXQpCisgICAgcmV0dXJuIGgKKworCisMCitjbGFzcyBIZWFkZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHM9Tm9uZSwgY2hhcnNldD1Ob25lLAorICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPU5vbmUsIGhlYWRlcl9uYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nICcsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgICIiIkNyZWF0ZSBhIE1JTUUtY29tcGxpYW50IGhlYWRlciB0aGF0IGNhbiBjb250YWluIG1hbnkgY2hhcmFjdGVyIHNldHMuCisKKyAgICAgICAgT3B0aW9uYWwgcyBpcyB0aGUgaW5pdGlhbCBoZWFkZXIgdmFsdWUuICBJZiBOb25lLCB0aGUgaW5pdGlhbCBoZWFkZXIKKyAgICAgICAgdmFsdWUgaXMgbm90IHNldC4gIFlvdSBjYW4gbGF0ZXIgYXBwZW5kIHRvIHRoZSBoZWFkZXIgd2l0aCAuYXBwZW5kKCkKKyAgICAgICAgbWV0aG9kIGNhbGxzLiAgcyBtYXkgYmUgYSBieXRlIHN0cmluZyBvciBhIFVuaWNvZGUgc3RyaW5nLCBidXQgc2VlIHRoZQorICAgICAgICAuYXBwZW5kKCkgZG9jdW1lbnRhdGlvbiBmb3Igc2VtYW50aWNzLgorCisgICAgICAgIE9wdGlvbmFsIGNoYXJzZXQgc2VydmVzIHR3byBwdXJwb3NlczogaXQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgdGhlCisgICAgICAgIGNoYXJzZXQgYXJndW1lbnQgdG8gdGhlIC5hcHBlbmQoKSBtZXRob2QuICBJdCBhbHNvIHNldHMgdGhlIGRlZmF1bHQKKyAgICAgICAgY2hhcmFjdGVyIHNldCBmb3IgYWxsIHN1YnNlcXVlbnQgLmFwcGVuZCgpIGNhbGxzIHRoYXQgb21pdCB0aGUgY2hhcnNldAorICAgICAgICBhcmd1bWVudC4gIElmIGNoYXJzZXQgaXMgbm90IHByb3ZpZGVkIGluIHRoZSBjb25zdHJ1Y3RvciwgdGhlIHVzLWFzY2lpCisgICAgICAgIGNoYXJzZXQgaXMgdXNlZCBib3RoIGFzIHMncyBpbml0aWFsIGNoYXJzZXQgYW5kIGFzIHRoZSBkZWZhdWx0IGZvcgorICAgICAgICBzdWJzZXF1ZW50IC5hcHBlbmQoKSBjYWxscy4KKworICAgICAgICBUaGUgbWF4aW11bSBsaW5lIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGV4cGxpY2l0IHZpYSBtYXhsaW5lbGVuLiAgRm9yCisgICAgICAgIHNwbGl0dGluZyB0aGUgZmlyc3QgbGluZSB0byBhIHNob3J0ZXIgdmFsdWUgKHRvIGFjY291bnQgZm9yIHRoZSBmaWVsZAorICAgICAgICBoZWFkZXIgd2hpY2ggaXNuJ3QgaW5jbHVkZWQgaW4gcywgZS5nLiBgU3ViamVjdCcpIHBhc3MgaW4gdGhlIG5hbWUgb2YKKyAgICAgICAgdGhlIGZpZWxkIGluIGhlYWRlcl9uYW1lLiAgVGhlIGRlZmF1bHQgbWF4bGluZWxlbiBpcyA3Ni4KKworICAgICAgICBjb250aW51YXRpb25fd3MgbXVzdCBiZSBSRkMgMjgyMiBjb21wbGlhbnQgZm9sZGluZyB3aGl0ZXNwYWNlICh1c3VhbGx5CisgICAgICAgIGVpdGhlciBhIHNwYWNlIG9yIGEgaGFyZCB0YWIpIHdoaWNoIHdpbGwgYmUgcHJlcGVuZGVkIHRvIGNvbnRpbnVhdGlvbgorICAgICAgICBsaW5lcy4KKworICAgICAgICBlcnJvcnMgaXMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIC5hcHBlbmQoKSBjYWxsLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgY2hhcnNldCBpcyBOb25lOgorICAgICAgICAgICAgY2hhcnNldCA9IFVTQVNDSUkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2hhcnNldCwgQ2hhcnNldCk6CisgICAgICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0KQorICAgICAgICBzZWxmLl9jaGFyc2V0ID0gY2hhcnNldAorICAgICAgICBzZWxmLl9jb250aW51YXRpb25fd3MgPSBjb250aW51YXRpb25fd3MKKyAgICAgICAgY3dzX2V4cGFuZGVkX2xlbiA9IGxlbihjb250aW51YXRpb25fd3MucmVwbGFjZSgnXHQnLCBTUEFDRTgpKQorICAgICAgICAjIEJBVzogSSBiZWxpZXZlIGBjaHVua3MnIGFuZCBgbWF4bGluZWxlbicgc2hvdWxkIGJlIG5vbi1wdWJsaWMuCisgICAgICAgIHNlbGYuX2NodW5rcyA9IFtdCisgICAgICAgIGlmIHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFwcGVuZChzLCBjaGFyc2V0LCBlcnJvcnMpCisgICAgICAgIGlmIG1heGxpbmVsZW4gaXMgTm9uZToKKyAgICAgICAgICAgIG1heGxpbmVsZW4gPSBNQVhMSU5FTEVOCisgICAgICAgIGlmIGhlYWRlcl9uYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAjIFdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIGZpZWxkIGhlYWRlciBzbyB0aGUgZmlyc3QgbGluZQorICAgICAgICAgICAgIyBpcyB0aGUgc2FtZSBsZW5ndGggYXMgc3Vic2VxdWVudCBsaW5lcy4KKyAgICAgICAgICAgIHNlbGYuX2ZpcnN0bGluZWxlbiA9IG1heGxpbmVsZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlIGZpcnN0IGxpbmUgc2hvdWxkIGJlIHNob3J0ZXIgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIGZpZWxkCisgICAgICAgICAgICAjIGhlYWRlci4gIEFsc28gc3VidHJhY3Qgb2ZmIDIgZXh0cmEgZm9yIHRoZSBjb2xvbiBhbmQgc3BhY2UuCisgICAgICAgICAgICBzZWxmLl9maXJzdGxpbmVsZW4gPSBtYXhsaW5lbGVuIC0gbGVuKGhlYWRlcl9uYW1lKSAtIDIKKyAgICAgICAgIyBTZWNvbmQgYW5kIHN1YnNlcXVlbnQgbGluZXMgc2hvdWxkIHN1YnRyYWN0IG9mZiB0aGUgbGVuZ3RoIGluCisgICAgICAgICMgY29sdW1ucyBvZiB0aGUgY29udGludWF0aW9uIHdoaXRlc3BhY2UgcHJlZml4LgorICAgICAgICBzZWxmLl9tYXhsaW5lbGVuID0gbWF4bGluZWxlbiAtIGN3c19leHBhbmRlZF9sZW4KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJBIHN5bm9ueW0gZm9yIHNlbGYuZW5jb2RlKCkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVuY29kZSgpCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICIiIkhlbHBlciBmb3IgdGhlIGJ1aWx0LWluIHVuaWNvZGUgZnVuY3Rpb24uIiIiCisgICAgICAgIHVjaHVua3MgPSBbXQorICAgICAgICBsYXN0Y3MgPSBOb25lCisgICAgICAgIGZvciBzLCBjaGFyc2V0IGluIHNlbGYuX2NodW5rczoKKyAgICAgICAgICAgICMgV2UgbXVzdCBwcmVzZXJ2ZSBzcGFjZXMgYmV0d2VlbiBlbmNvZGVkIGFuZCBub24tZW5jb2RlZCB3b3JkCisgICAgICAgICAgICAjIGJvdW5kYXJpZXMsIHdoaWNoIG1lYW5zIGZvciB1cyB3ZSBuZWVkIHRvIGFkZCBhIHNwYWNlIHdoZW4gd2UgZ28KKyAgICAgICAgICAgICMgZnJvbSBhIGNoYXJzZXQgdG8gTm9uZS91cy1hc2NpaSwgb3IgZnJvbSBOb25lL3VzLWFzY2lpIHRvIGEKKyAgICAgICAgICAgICMgY2hhcnNldC4gIE9ubHkgZG8gdGhpcyBmb3IgdGhlIHNlY29uZCBhbmQgc3Vic2VxdWVudCBjaHVua3MuCisgICAgICAgICAgICBuZXh0Y3MgPSBjaGFyc2V0CisgICAgICAgICAgICBpZiB1Y2h1bmtzOgorICAgICAgICAgICAgICAgIGlmIGxhc3RjcyBub3QgaW4gKE5vbmUsICd1cy1hc2NpaScpOgorICAgICAgICAgICAgICAgICAgICBpZiBuZXh0Y3MgaW4gKE5vbmUsICd1cy1hc2NpaScpOgorICAgICAgICAgICAgICAgICAgICAgICAgdWNodW5rcy5hcHBlbmQoVVNQQUNFKQorICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGNzID0gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNzIG5vdCBpbiAoTm9uZSwgJ3VzLWFzY2lpJyk6CisgICAgICAgICAgICAgICAgICAgIHVjaHVua3MuYXBwZW5kKFVTUEFDRSkKKyAgICAgICAgICAgIGxhc3RjcyA9IG5leHRjcworICAgICAgICAgICAgdWNodW5rcy5hcHBlbmQodW5pY29kZShzLCBzdHIoY2hhcnNldCkpKQorICAgICAgICByZXR1cm4gVUVNUFRZU1RSSU5HLmpvaW4odWNodW5rcykKKworICAgICMgUmljaCBjb21wYXJpc29uIG9wZXJhdG9ycyBmb3IgZXF1YWxpdHkgb25seS4gIEJBVzogZG9lcyBpdCBtYWtlIHNlbnNlIHRvCisgICAgIyBoYXZlIG9yIGV4cGxpY2l0bHkgZGlzYWJsZSA8LCA8PSwgPiwgPj0gb3BlcmF0b3JzPworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIG90aGVyIG1heSBiZSBhIEhlYWRlciBvciBhIHN0cmluZy4gIEJvdGggYXJlIGZpbmUgc28gY29lcmNlCisgICAgICAgICMgb3Vyc2VsdmVzIHRvIGEgc3RyaW5nLCBzd2FwIHRoZSBhcmdzIGFuZCBkbyBhbm90aGVyIGNvbXBhcmlzb24uCisgICAgICAgIHJldHVybiBvdGhlciA9PSBzZWxmLmVuY29kZSgpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIHMsIGNoYXJzZXQ9Tm9uZSwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgIiIiQXBwZW5kIGEgc3RyaW5nIHRvIHRoZSBNSU1FIGhlYWRlci4KKworICAgICAgICBPcHRpb25hbCBjaGFyc2V0LCBpZiBnaXZlbiwgc2hvdWxkIGJlIGEgQ2hhcnNldCBpbnN0YW5jZSBvciB0aGUgbmFtZQorICAgICAgICBvZiBhIGNoYXJhY3RlciBzZXQgKHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIGEgQ2hhcnNldCBpbnN0YW5jZSkuICBBCisgICAgICAgIHZhbHVlIG9mIE5vbmUgKHRoZSBkZWZhdWx0KSBtZWFucyB0aGF0IHRoZSBjaGFyc2V0IGdpdmVuIGluIHRoZQorICAgICAgICBjb25zdHJ1Y3RvciBpcyB1c2VkLgorCisgICAgICAgIHMgbWF5IGJlIGEgYnl0ZSBzdHJpbmcgb3IgYSBVbmljb2RlIHN0cmluZy4gIElmIGl0IGlzIGEgYnl0ZSBzdHJpbmcKKyAgICAgICAgKGkuZS4gaXNpbnN0YW5jZShzLCBzdHIpIGlzIHRydWUpLCB0aGVuIGNoYXJzZXQgaXMgdGhlIGVuY29kaW5nIG9mCisgICAgICAgIHRoYXQgYnl0ZSBzdHJpbmcsIGFuZCBhIFVuaWNvZGVFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgc3RyaW5nCisgICAgICAgIGNhbm5vdCBiZSBkZWNvZGVkIHdpdGggdGhhdCBjaGFyc2V0LiAgSWYgcyBpcyBhIFVuaWNvZGUgc3RyaW5nLCB0aGVuCisgICAgICAgIGNoYXJzZXQgaXMgYSBoaW50IHNwZWNpZnlpbmcgdGhlIGNoYXJhY3RlciBzZXQgb2YgdGhlIGNoYXJhY3RlcnMgaW4KKyAgICAgICAgdGhlIHN0cmluZy4gIEluIHRoaXMgY2FzZSwgd2hlbiBwcm9kdWNpbmcgYW4gUkZDIDI4MjIgY29tcGxpYW50IGhlYWRlcgorICAgICAgICB1c2luZyBSRkMgMjA0NyBydWxlcywgdGhlIFVuaWNvZGUgc3RyaW5nIHdpbGwgYmUgZW5jb2RlZCB1c2luZyB0aGUKKyAgICAgICAgZm9sbG93aW5nIGNoYXJzZXRzIGluIG9yZGVyOiB1cy1hc2NpaSwgdGhlIGNoYXJzZXQgaGludCwgdXRmLTguICBUaGUKKyAgICAgICAgZmlyc3QgY2hhcmFjdGVyIHNldCBub3QgdG8gcHJvdm9rZSBhIFVuaWNvZGVFcnJvciBpcyB1c2VkLgorCisgICAgICAgIE9wdGlvbmFsIGBlcnJvcnMnIGlzIHBhc3NlZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gYW55IHVuaWNvZGUoKSBvcgorICAgICAgICB1c3RyLmVuY29kZSgpIGNhbGwuCisgICAgICAgICIiIgorICAgICAgICBpZiBjaGFyc2V0IGlzIE5vbmU6CisgICAgICAgICAgICBjaGFyc2V0ID0gc2VsZi5fY2hhcnNldAorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKGNoYXJzZXQsIENoYXJzZXQpOgorICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgIyBJZiB0aGUgY2hhcnNldCBpcyBvdXIgZmF1eCA4Yml0IGNoYXJzZXQsIGxlYXZlIHRoZSBzdHJpbmcgdW5jaGFuZ2VkCisgICAgICAgIGlmIGNoYXJzZXQgIT0gJzhiaXQnOgorICAgICAgICAgICAgIyBXZSBuZWVkIHRvIHRlc3QgdGhhdCB0aGUgc3RyaW5nIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdW5pY29kZSBhbmQKKyAgICAgICAgICAgICMgYmFjayB0byBhIGJ5dGUgc3RyaW5nLCBnaXZlbiB0aGUgaW5wdXQgYW5kIG91dHB1dCBjb2RlY3Mgb2YgdGhlCisgICAgICAgICAgICAjIGNoYXJzZXQuCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHMsIHN0cik6CisgICAgICAgICAgICAgICAgIyBQb3NzaWJseSByYWlzZSBVbmljb2RlRXJyb3IgaWYgdGhlIGJ5dGUgc3RyaW5nIGNhbid0IGJlCisgICAgICAgICAgICAgICAgIyBjb252ZXJ0ZWQgdG8gYSB1bmljb2RlIHdpdGggdGhlIGlucHV0IGNvZGVjIG9mIHRoZSBjaGFyc2V0LgorICAgICAgICAgICAgICAgIGluY29kZWMgPSBjaGFyc2V0LmlucHV0X2NvZGVjIG9yICd1cy1hc2NpaScKKyAgICAgICAgICAgICAgICB1c3RyID0gdW5pY29kZShzLCBpbmNvZGVjLCBlcnJvcnMpCisgICAgICAgICAgICAgICAgIyBOb3cgbWFrZSBzdXJlIHRoYXQgdGhlIHVuaWNvZGUgY291bGQgYmUgY29udmVydGVkIGJhY2sgdG8gYQorICAgICAgICAgICAgICAgICMgYnl0ZSBzdHJpbmcgd2l0aCB0aGUgb3V0cHV0IGNvZGVjLCB3aGljaCBtYXkgYmUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgIyB0aGFuIHRoZSBpcHV0IGNvZGVkLiAgU3RpbGwsIHVzZSB0aGUgb3JpZ2luYWwgYnl0ZSBzdHJpbmcuCisgICAgICAgICAgICAgICAgb3V0Y29kZWMgPSBjaGFyc2V0Lm91dHB1dF9jb2RlYyBvciAndXMtYXNjaWknCisgICAgICAgICAgICAgICAgdXN0ci5lbmNvZGUob3V0Y29kZWMsIGVycm9ycykKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICAjIE5vdyB3ZSBoYXZlIHRvIGJlIHN1cmUgdGhlIHVuaWNvZGUgc3RyaW5nIGNhbiBiZSBjb252ZXJ0ZWQKKyAgICAgICAgICAgICAgICAjIHRvIGEgYnl0ZSBzdHJpbmcgd2l0aCBhIHJlYXNvbmFibGUgb3V0cHV0IGNvZGVjLiAgV2Ugd2FudCB0bworICAgICAgICAgICAgICAgICMgdXNlIHRoZSBieXRlIHN0cmluZyBpbiB0aGUgY2h1bmsuCisgICAgICAgICAgICAgICAgZm9yIGNoYXJzZXQgaW4gVVNBU0NJSSwgY2hhcnNldCwgVVRGODoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0Y29kZWMgPSBjaGFyc2V0Lm91dHB1dF9jb2RlYyBvciAndXMtYXNjaWknCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gcy5lbmNvZGUob3V0Y29kZWMsIGVycm9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAndXRmLTggY29udmVyc2lvbiBmYWlsZWQnCisgICAgICAgIHNlbGYuX2NodW5rcy5hcHBlbmQoKHMsIGNoYXJzZXQpKQorCisgICAgZGVmIF9zcGxpdChzZWxmLCBzLCBjaGFyc2V0LCBtYXhsaW5lbGVuLCBzcGxpdGNoYXJzKToKKyAgICAgICAgIyBTcGxpdCB1cCBhIGhlYWRlciBzYWZlbHkgZm9yIHVzZSB3aXRoIGVuY29kZV9jaHVua3MuCisgICAgICAgIHNwbGl0dGFibGUgPSBjaGFyc2V0LnRvX3NwbGl0dGFibGUocykKKyAgICAgICAgZW5jb2RlZCA9IGNoYXJzZXQuZnJvbV9zcGxpdHRhYmxlKHNwbGl0dGFibGUsIFRydWUpCisgICAgICAgIGVsZW4gPSBjaGFyc2V0LmVuY29kZWRfaGVhZGVyX2xlbihlbmNvZGVkKQorICAgICAgICAjIElmIHRoZSBsaW5lJ3MgZW5jb2RlZCBsZW5ndGggZmlyc3QsIGp1c3QgcmV0dXJuIGl0CisgICAgICAgIGlmIGVsZW4gPD0gbWF4bGluZWxlbjoKKyAgICAgICAgICAgIHJldHVybiBbKGVuY29kZWQsIGNoYXJzZXQpXQorICAgICAgICAjIElmIHdlIGhhdmUgdW5kZXRlcm1pbmVkIHJhdyA4Yml0IGNoYXJhY3RlcnMgc2l0dGluZyBpbiBhIGJ5dGUKKyAgICAgICAgIyBzdHJpbmcsIHdlIHJlYWxseSBkb24ndCBrbm93IHdoYXQgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvIGlzLiAgV2UKKyAgICAgICAgIyBjYW4ndCByZWFsbHkgc3BsaXQgaXQgYmVjYXVzZSBpdCBtaWdodCBiZSBtdWx0aWJ5dGUgZGF0YSB3aGljaCB3ZQorICAgICAgICAjIGNvdWxkIGJyZWFrIGlmIHdlIHNwbGl0IGl0IGJldHdlZW4gcGFpcnMuICBUaGUgbGVhc3QgaGFybSBzZWVtcyB0bworICAgICAgICAjIGJlIHRvIG5vdCBzcGxpdCB0aGUgaGVhZGVyIGF0IGFsbCwgYnV0IHRoYXQgbWVhbnMgdGhleSBjb3VsZCBnbyBvdXQKKyAgICAgICAgIyBsb25nZXIgdGhhbiBtYXhsaW5lbGVuLgorICAgICAgICBpZiBjaGFyc2V0ID09ICc4Yml0JzoKKyAgICAgICAgICAgIHJldHVybiBbKHMsIGNoYXJzZXQpXQorICAgICAgICAjIEJBVzogSSdtIG5vdCBzdXJlIHdoYXQgdGhlIHJpZ2h0IHRlc3QgaGVyZSBpcy4gIFdoYXQgd2UncmUgdHJ5aW5nIHRvCisgICAgICAgICMgZG8gaXMgYmUgZmFpdGhmdWwgdG8gUkZDIDI4MjIncyByZWNvbW1lbmRhdGlvbiB0aGF0ICgkMi4yLjMpOgorICAgICAgICAjCisgICAgICAgICMgIk5vdGU6IFRob3VnaCBzdHJ1Y3R1cmVkIGZpZWxkIGJvZGllcyBhcmUgZGVmaW5lZCBpbiBzdWNoIGEgd2F5IHRoYXQKKyAgICAgICAgIyAgZm9sZGluZyBjYW4gdGFrZSBwbGFjZSBiZXR3ZWVuIG1hbnkgb2YgdGhlIGxleGljYWwgdG9rZW5zIChhbmQgZXZlbgorICAgICAgICAjICB3aXRoaW4gc29tZSBvZiB0aGUgbGV4aWNhbCB0b2tlbnMpLCBmb2xkaW5nIFNIT1VMRCBiZSBsaW1pdGVkIHRvCisgICAgICAgICMgIHBsYWNpbmcgdGhlIENSTEYgYXQgaGlnaGVyLWxldmVsIHN5bnRhY3RpYyBicmVha3MuIgorICAgICAgICAjCisgICAgICAgICMgRm9yIG5vdywgSSBjYW4gb25seSBpbWFnaW5lIGRvaW5nIHRoaXMgd2hlbiB0aGUgY2hhcnNldCBpcyB1cy1hc2NpaSwKKyAgICAgICAgIyBhbHRob3VnaCBpdCdzIHBvc3NpYmxlIHRoYXQgb3RoZXIgY2hhcnNldHMgbWF5IGFsc28gYmVuZWZpdCBmcm9tIHRoZQorICAgICAgICAjIGhpZ2hlci1sZXZlbCBzeW50YWN0aWMgYnJlYWtzLgorICAgICAgICBlbGlmIGNoYXJzZXQgPT0gJ3VzLWFzY2lpJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zcGxpdF9hc2NpaShzLCBjaGFyc2V0LCBtYXhsaW5lbGVuLCBzcGxpdGNoYXJzKQorICAgICAgICAjIEJBVzogc2hvdWxkIHdlIHVzZSBlbmNvZGVkPworICAgICAgICBlbGlmIGVsZW4gPT0gbGVuKHMpOgorICAgICAgICAgICAgIyBXZSBjYW4gc3BsaXQgb24gX21heGxpbmVsZW4gYm91bmRhcmllcyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGUKKyAgICAgICAgICAgICMgZW5jb2Rpbmcgd29uJ3QgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBzdHJpbmcKKyAgICAgICAgICAgIHNwbGl0cG50ID0gbWF4bGluZWxlbgorICAgICAgICAgICAgZmlyc3QgPSBjaGFyc2V0LmZyb21fc3BsaXR0YWJsZShzcGxpdHRhYmxlWzpzcGxpdHBudF0sIEZhbHNlKQorICAgICAgICAgICAgbGFzdCA9IGNoYXJzZXQuZnJvbV9zcGxpdHRhYmxlKHNwbGl0dGFibGVbc3BsaXRwbnQ6XSwgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEJpbmFyeSBzZWFyY2ggZm9yIHNwbGl0IHBvaW50CisgICAgICAgICAgICBmaXJzdCwgbGFzdCA9IF9iaW5zcGxpdChzcGxpdHRhYmxlLCBjaGFyc2V0LCBtYXhsaW5lbGVuKQorICAgICAgICAjIGZpcnN0IGlzIG9mIHRoZSBwcm9wZXIgbGVuZ3RoIHNvIGp1c3Qgd3JhcCBpdCBpbiB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgIyBjaHJvbWUuICBsYXN0IG11c3QgYmUgcmVjdXJzaXZlbHkgc3BsaXQuCisgICAgICAgIGZzcGxpdHRhYmxlID0gY2hhcnNldC50b19zcGxpdHRhYmxlKGZpcnN0KQorICAgICAgICBmZW5jb2RlZCA9IGNoYXJzZXQuZnJvbV9zcGxpdHRhYmxlKGZzcGxpdHRhYmxlLCBUcnVlKQorICAgICAgICBjaHVuayA9IFsoZmVuY29kZWQsIGNoYXJzZXQpXQorICAgICAgICByZXR1cm4gY2h1bmsgKyBzZWxmLl9zcGxpdChsYXN0LCBjaGFyc2V0LCBzZWxmLl9tYXhsaW5lbGVuLCBzcGxpdGNoYXJzKQorCisgICAgZGVmIF9zcGxpdF9hc2NpaShzZWxmLCBzLCBjaGFyc2V0LCBmaXJzdGxlbiwgc3BsaXRjaGFycyk6CisgICAgICAgIGNodW5rcyA9IF9zcGxpdF9hc2NpaShzLCBmaXJzdGxlbiwgc2VsZi5fbWF4bGluZWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRpbnVhdGlvbl93cywgc3BsaXRjaGFycykKKyAgICAgICAgcmV0dXJuIHppcChjaHVua3MsIFtjaGFyc2V0XSpsZW4oY2h1bmtzKSkKKworICAgIGRlZiBfZW5jb2RlX2NodW5rcyhzZWxmLCBuZXdjaHVua3MsIG1heGxpbmVsZW4pOgorICAgICAgICAjIE1JTUUtZW5jb2RlIGEgaGVhZGVyIHdpdGggbWFueSBkaWZmZXJlbnQgY2hhcnNldHMgYW5kL29yIGVuY29kaW5ncy4KKyAgICAgICAgIworICAgICAgICAjIEdpdmVuIGEgbGlzdCBvZiBwYWlycyAoc3RyaW5nLCBjaGFyc2V0KSwgcmV0dXJuIGEgTUlNRS1lbmNvZGVkCisgICAgICAgICMgc3RyaW5nIHN1aXRhYmxlIGZvciB1c2UgaW4gYSBoZWFkZXIgZmllbGQuICBFYWNoIHBhaXIgbWF5IGhhdmUKKyAgICAgICAgIyBkaWZmZXJlbnQgY2hhcnNldHMgYW5kL29yIGVuY29kaW5ncywgYW5kIHRoZSByZXN1bHRpbmcgaGVhZGVyIHdpbGwKKyAgICAgICAgIyBhY2N1cmF0ZWx5IHJlZmxlY3QgZWFjaCBzZXR0aW5nLgorICAgICAgICAjCisgICAgICAgICMgRWFjaCBlbmNvZGluZyBjYW4gYmUgZW1haWwudXRpbHMuUVAgKHF1b3RlZC1wcmludGFibGUsIGZvcgorICAgICAgICAjIEFTQ0lJLWxpa2UgY2hhcmFjdGVyIHNldHMgbGlrZSBpc28tODg1OS0xKSwgZW1haWwudXRpbHMuQkFTRTY0CisgICAgICAgICMgKEJhc2U2NCwgZm9yIG5vbi1BU0NJSSBsaWtlIGNoYXJhY3RlciBzZXRzIGxpa2UgS09JOC1SIGFuZAorICAgICAgICAjIGlzby0yMDIyLWpwKSwgb3IgTm9uZSAobm8gZW5jb2RpbmcpLgorICAgICAgICAjCisgICAgICAgICMgRWFjaCBwYWlyIHdpbGwgYmUgcmVwcmVzZW50ZWQgb24gYSBzZXBhcmF0ZSBsaW5lOyB0aGUgcmVzdWx0aW5nCisgICAgICAgICMgc3RyaW5nIHdpbGwgYmUgaW4gdGhlIGZvcm1hdDoKKyAgICAgICAgIworICAgICAgICAjID0/Y2hhcnNldDE/cT9NYXI9RURhX0dvbno9RTFsZXpfQWxvbnNvPz1cbgorICAgICAgICAjICA9P2NoYXJzZXQyP2I/U3Z4eVoyVnVJRUwyYVc1bj89IgorICAgICAgICBjaHVua3MgPSBbXQorICAgICAgICBmb3IgaGVhZGVyLCBjaGFyc2V0IGluIG5ld2NodW5rczoKKyAgICAgICAgICAgIGlmIG5vdCBoZWFkZXI6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGNoYXJzZXQgaXMgTm9uZSBvciBjaGFyc2V0LmhlYWRlcl9lbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHMgPSBoZWFkZXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcyA9IGNoYXJzZXQuaGVhZGVyX2VuY29kZShoZWFkZXIpCisgICAgICAgICAgICAjIERvbid0IGFkZCBtb3JlIGZvbGRpbmcgd2hpdGVzcGFjZSB0aGFuIG5lY2Vzc2FyeQorICAgICAgICAgICAgaWYgY2h1bmtzIGFuZCBjaHVua3NbLTFdLmVuZHN3aXRoKCcgJyk6CisgICAgICAgICAgICAgICAgZXh0cmEgPSAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBleHRyYSA9ICcgJworICAgICAgICAgICAgX21heF9hcHBlbmQoY2h1bmtzLCBzLCBtYXhsaW5lbGVuLCBleHRyYSkKKyAgICAgICAgam9pbmVyID0gTkwgKyBzZWxmLl9jb250aW51YXRpb25fd3MKKyAgICAgICAgcmV0dXJuIGpvaW5lci5qb2luKGNodW5rcykKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgc3BsaXRjaGFycz0nOywgJyk6CisgICAgICAgICIiIkVuY29kZSBhIG1lc3NhZ2UgaGVhZGVyIGludG8gYW4gUkZDLWNvbXBsaWFudCBmb3JtYXQuCisKKyAgICAgICAgVGhlcmUgYXJlIG1hbnkgaXNzdWVzIGludm9sdmVkIGluIGNvbnZlcnRpbmcgYSBnaXZlbiBzdHJpbmcgZm9yIHVzZSBpbgorICAgICAgICBhbiBlbWFpbCBoZWFkZXIuICBPbmx5IGNlcnRhaW4gY2hhcmFjdGVyIHNldHMgYXJlIHJlYWRhYmxlIGluIG1vc3QKKyAgICAgICAgZW1haWwgY2xpZW50cywgYW5kIGFzIGhlYWRlciBzdHJpbmdzIGNhbiBvbmx5IGNvbnRhaW4gYSBzdWJzZXQgb2YKKyAgICAgICAgNy1iaXQgQVNDSUksIGNhcmUgbXVzdCBiZSB0YWtlbiB0byBwcm9wZXJseSBjb252ZXJ0IGFuZCBlbmNvZGUgKHdpdGgKKyAgICAgICAgQmFzZTY0IG9yIHF1b3RlZC1wcmludGFibGUpIGhlYWRlciBzdHJpbmdzLiAgSW4gYWRkaXRpb24sIHRoZXJlIGlzIGEKKyAgICAgICAgNzUtY2hhcmFjdGVyIGxlbmd0aCBsaW1pdCBvbiBhbnkgZ2l2ZW4gZW5jb2RlZCBoZWFkZXIgZmllbGQsIHNvCisgICAgICAgIGxpbmUtd3JhcHBpbmcgbXVzdCBiZSBwZXJmb3JtZWQsIGV2ZW4gd2l0aCBkb3VibGUtYnl0ZSBjaGFyYWN0ZXIgc2V0cy4KKworICAgICAgICBUaGlzIG1ldGhvZCB3aWxsIGRvIGl0cyBiZXN0IHRvIGNvbnZlcnQgdGhlIHN0cmluZyB0byB0aGUgY29ycmVjdAorICAgICAgICBjaGFyYWN0ZXIgc2V0IHVzZWQgaW4gZW1haWwsIGFuZCBlbmNvZGUgYW5kIGxpbmUgd3JhcCBpdCBzYWZlbHkgd2l0aAorICAgICAgICB0aGUgYXBwcm9wcmlhdGUgc2NoZW1lIGZvciB0aGF0IGNoYXJhY3RlciBzZXQuCisKKyAgICAgICAgSWYgdGhlIGdpdmVuIGNoYXJzZXQgaXMgbm90IGtub3duIG9yIGFuIGVycm9yIG9jY3VycyBkdXJpbmcKKyAgICAgICAgY29udmVyc2lvbiwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUgaGVhZGVyIHVudG91Y2hlZC4KKworICAgICAgICBPcHRpb25hbCBzcGxpdGNoYXJzIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgY2hhcmFjdGVycyB0byBzcGxpdCBsb25nCisgICAgICAgIEFTQ0lJIGxpbmVzIG9uLCBpbiByb3VnaCBzdXBwb3J0IG9mIFJGQyAyODIyJ3MgYGhpZ2hlc3QgbGV2ZWwKKyAgICAgICAgc3ludGFjdGljIGJyZWFrcycuICBUaGlzIGRvZXNuJ3QgYWZmZWN0IFJGQyAyMDQ3IGVuY29kZWQgbGluZXMuCisgICAgICAgICIiIgorICAgICAgICBuZXdjaHVua3MgPSBbXQorICAgICAgICBtYXhsaW5lbGVuID0gc2VsZi5fZmlyc3RsaW5lbGVuCisgICAgICAgIGxhc3RsZW4gPSAwCisgICAgICAgIGZvciBzLCBjaGFyc2V0IGluIHNlbGYuX2NodW5rczoKKyAgICAgICAgICAgICMgVGhlIGZpcnN0IGJpdCBvZiB0aGUgbmV4dCBjaHVuayBzaG91bGQgYmUganVzdCBsb25nIGVub3VnaCB0bworICAgICAgICAgICAgIyBmaWxsIHRoZSBuZXh0IGxpbmUuICBEb24ndCBmb3JnZXQgdGhlIHNwYWNlIHNlcGFyYXRpbmcgdGhlCisgICAgICAgICAgICAjIGVuY29kZWQgd29yZHMuCisgICAgICAgICAgICB0YXJnZXRsZW4gPSBtYXhsaW5lbGVuIC0gbGFzdGxlbiAtIDEKKyAgICAgICAgICAgIGlmIHRhcmdldGxlbiA8IGNoYXJzZXQuZW5jb2RlZF9oZWFkZXJfbGVuKCcnKToKKyAgICAgICAgICAgICAgICAjIFN0aWNrIGl0IG9uIHRoZSBuZXh0IGxpbmUKKyAgICAgICAgICAgICAgICB0YXJnZXRsZW4gPSBtYXhsaW5lbGVuCisgICAgICAgICAgICBuZXdjaHVua3MgKz0gc2VsZi5fc3BsaXQocywgY2hhcnNldCwgdGFyZ2V0bGVuLCBzcGxpdGNoYXJzKQorICAgICAgICAgICAgbGFzdGNodW5rLCBsYXN0Y2hhcnNldCA9IG5ld2NodW5rc1stMV0KKyAgICAgICAgICAgIGxhc3RsZW4gPSBsYXN0Y2hhcnNldC5lbmNvZGVkX2hlYWRlcl9sZW4obGFzdGNodW5rKQorICAgICAgICB2YWx1ZSA9IHNlbGYuX2VuY29kZV9jaHVua3MobmV3Y2h1bmtzLCBtYXhsaW5lbGVuKQorICAgICAgICBpZiBfZW1iZWRlZF9oZWFkZXIuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgIHJhaXNlIEhlYWRlclBhcnNlRXJyb3IoImhlYWRlciB2YWx1ZSBhcHBlYXJzIHRvIGNvbnRhaW4gIgorICAgICAgICAgICAgICAgICJhbiBlbWJlZGRlZCBoZWFkZXI6IHshcn0iLmZvcm1hdCh2YWx1ZSkpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisKKwwKK2RlZiBfc3BsaXRfYXNjaWkocywgZmlyc3RsZW4sIHJlc3RsZW4sIGNvbnRpbnVhdGlvbl93cywgc3BsaXRjaGFycyk6CisgICAgbGluZXMgPSBbXQorICAgIG1heGxlbiA9IGZpcnN0bGVuCisgICAgZm9yIGxpbmUgaW4gcy5zcGxpdGxpbmVzKCk6CisgICAgICAgICMgSWdub3JlIGFueSBsZWFkaW5nIHdoaXRlc3BhY2UgKGkuZS4gY29udGludWF0aW9uIHdoaXRlc3BhY2UpIGFscmVhZHkKKyAgICAgICAgIyBvbiB0aGUgbGluZSwgc2luY2Ugd2UnbGwgYmUgYWRkaW5nIG91ciBvd24uCisgICAgICAgIGxpbmUgPSBsaW5lLmxzdHJpcCgpCisgICAgICAgIGlmIGxlbihsaW5lKSA8IG1heGxlbjoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgbWF4bGVuID0gcmVzdGxlbgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgIyBBdHRlbXB0IHRvIHNwbGl0IHRoZSBsaW5lIGF0IHRoZSBoaWdoZXN0LWxldmVsIHN5bnRhY3RpYyBicmVhaworICAgICAgICAjIHBvc3NpYmxlLiAgTm90ZSB0aGF0IHdlIGRvbid0IGhhdmUgYSBsb3Qgb2Ygc21hcnRzIGFib3V0IGZpZWxkCisgICAgICAgICMgc3ludGF4OyB3ZSBqdXN0IHRyeSB0byBicmVhayBvbiBzZW1pLWNvbG9ucywgdGhlbiBjb21tYXMsIHRoZW4KKyAgICAgICAgIyB3aGl0ZXNwYWNlLgorICAgICAgICBmb3IgY2ggaW4gc3BsaXRjaGFyczoKKyAgICAgICAgICAgIGlmIGNoIGluIGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlcmUncyBub3RoaW5nIHVzZWZ1bCB0byBzcGxpdCB0aGUgbGluZSBvbiwgbm90IGV2ZW4gc3BhY2VzLCBzbworICAgICAgICAgICAgIyBqdXN0IGFwcGVuZCB0aGlzIGxpbmUgdW5jaGFuZ2VkCisgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIG1heGxlbiA9IHJlc3RsZW4KKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgTm93IHNwbGl0IHRoZSBsaW5lIG9uIHRoZSBjaGFyYWN0ZXIgcGx1cyB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICAgIGNyZSA9IHJlLmNvbXBpbGUociclc1xzKicgJSBjaCkKKyAgICAgICAgaWYgY2ggaW4gJzssJzoKKyAgICAgICAgICAgIGVvbCA9IGNoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlb2wgPSAnJworICAgICAgICBqb2luZXIgPSBlb2wgKyAnICcKKyAgICAgICAgam9pbmxlbiA9IGxlbihqb2luZXIpCisgICAgICAgIHdzbGVuID0gbGVuKGNvbnRpbnVhdGlvbl93cy5yZXBsYWNlKCdcdCcsIFNQQUNFOCkpCisgICAgICAgIHRoaXMgPSBbXQorICAgICAgICBsaW5lbGVuID0gMAorICAgICAgICBmb3IgcGFydCBpbiBjcmUuc3BsaXQobGluZSk6CisgICAgICAgICAgICBjdXJsZW4gPSBsaW5lbGVuICsgbWF4KDAsIGxlbih0aGlzKS0xKSAqIGpvaW5sZW4KKyAgICAgICAgICAgIHBhcnRsZW4gPSBsZW4ocGFydCkKKyAgICAgICAgICAgIG9uZmlyc3RsaW5lID0gbm90IGxpbmVzCisgICAgICAgICAgICAjIFdlIGRvbid0IHdhbnQgdG8gc3BsaXQgYWZ0ZXIgdGhlIGZpZWxkIG5hbWUsIGlmIHdlJ3JlIG9uIHRoZQorICAgICAgICAgICAgIyBmaXJzdCBsaW5lIGFuZCB0aGUgZmllbGQgbmFtZSBpcyBwcmVzZW50IGluIHRoZSBoZWFkZXIgc3RyaW5nLgorICAgICAgICAgICAgaWYgY2ggPT0gJyAnIGFuZCBvbmZpcnN0bGluZSBhbmQgXAorICAgICAgICAgICAgICAgICAgIGxlbih0aGlzKSA9PSAxIGFuZCBmY3JlLm1hdGNoKHRoaXNbMF0pOgorICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKHBhcnQpCisgICAgICAgICAgICAgICAgbGluZWxlbiArPSBwYXJ0bGVuCisgICAgICAgICAgICBlbGlmIGN1cmxlbiArIHBhcnRsZW4gPiBtYXhsZW46CisgICAgICAgICAgICAgICAgaWYgdGhpczoKKyAgICAgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKGpvaW5lci5qb2luKHRoaXMpICsgZW9sKQorICAgICAgICAgICAgICAgICMgSWYgdGhpcyBwYXJ0IGlzIGxvbmdlciB0aGFuIG1heGxlbiBhbmQgd2UgYXJlbid0IGFscmVhZHkKKyAgICAgICAgICAgICAgICAjIHNwbGl0dGluZyBvbiB3aGl0ZXNwYWNlLCB0cnkgdG8gcmVjdXJzaXZlbHkgc3BsaXQgdGhpcyBsaW5lCisgICAgICAgICAgICAgICAgIyBvbiB3aGl0ZXNwYWNlLgorICAgICAgICAgICAgICAgIGlmIHBhcnRsZW4gPiBtYXhsZW4gYW5kIGNoICE9ICcgJzoKKyAgICAgICAgICAgICAgICAgICAgc3VibCA9IF9zcGxpdF9hc2NpaShwYXJ0LCBtYXhsZW4sIHJlc3RsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzLCAnICcpCisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmV4dGVuZChzdWJsWzotMV0pCisgICAgICAgICAgICAgICAgICAgIHRoaXMgPSBbc3VibFstMV1dCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IFtwYXJ0XQorICAgICAgICAgICAgICAgIGxpbmVsZW4gPSB3c2xlbiArIGxlbih0aGlzWy0xXSkKKyAgICAgICAgICAgICAgICBtYXhsZW4gPSByZXN0bGVuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kKHBhcnQpCisgICAgICAgICAgICAgICAgbGluZWxlbiArPSBwYXJ0bGVuCisgICAgICAgICMgUHV0IGFueSBsZWZ0IG92ZXIgcGFydHMgb24gYSBsaW5lIGJ5IHRoZW1zZWx2ZXMKKyAgICAgICAgaWYgdGhpczoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChqb2luZXIuam9pbih0aGlzKSkKKyAgICByZXR1cm4gbGluZXMKKworCisMCitkZWYgX2JpbnNwbGl0KHNwbGl0dGFibGUsIGNoYXJzZXQsIG1heGxpbmVsZW4pOgorICAgIGkgPSAwCisgICAgaiA9IGxlbihzcGxpdHRhYmxlKQorICAgIHdoaWxlIGkgPCBqOgorICAgICAgICAjIEludmFyaWFudHM6CisgICAgICAgICMgMS4gc3BsaXR0YWJsZVs6a10gZml0cyBmb3IgYWxsIGsgPD0gaSAobm90ZSB0aGF0IHdlICphc3N1bWUqLAorICAgICAgICAjICAgIGF0IHRoZSBzdGFydCwgdGhhdCBzcGxpdHRhYmxlWzowXSBmaXRzKS4KKyAgICAgICAgIyAyLiBzcGxpdHRhYmxlWzprXSBkb2VzIG5vdCBmaXQgZm9yIGFueSBrID4gaiAoYXQgdGhlIHN0YXJ0LAorICAgICAgICAjICAgIHRoaXMgbWVhbnMgd2Ugc2hvdWxkbid0IGxvb2sgYXQgYW55IGsgPiBsZW4oc3BsaXR0YWJsZSkpLgorICAgICAgICAjIDMuIFdlIGRvbid0IGtub3cgYWJvdXQgc3BsaXR0YWJsZVs6a10gZm9yIGsgaW4gaSsxLi5qLgorICAgICAgICAjIDQuIFdlIHdhbnQgdG8gc2V0IGkgdG8gdGhlIGxhcmdlc3QgayB0aGF0IGZpdHMsIHdpdGggaSA8PSBrIDw9IGouCisgICAgICAgICMKKyAgICAgICAgbSA9IChpK2orMSkgPj4gMSAgIyBjZWlsaW5nKChpK2opLzIpOyBpIDwgbSA8PSBqCisgICAgICAgIGNodW5rID0gY2hhcnNldC5mcm9tX3NwbGl0dGFibGUoc3BsaXR0YWJsZVs6bV0sIFRydWUpCisgICAgICAgIGNodW5rbGVuID0gY2hhcnNldC5lbmNvZGVkX2hlYWRlcl9sZW4oY2h1bmspCisgICAgICAgIGlmIGNodW5rbGVuIDw9IG1heGxpbmVsZW46CisgICAgICAgICAgICAjIG0gaXMgYWNjZXB0YWJsZSwgc28gaXMgYSBuZXcgbG93ZXIgYm91bmQuCisgICAgICAgICAgICBpID0gbQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBtIGlzIG5vdCBhY2NlcHRhYmxlLCBzbyBmaW5hbCBpIG11c3QgYmUgPCBtLgorICAgICAgICAgICAgaiA9IG0gLSAxCisgICAgIyBpID09IGouICBJbnZhcmlhbnQgIzEgaW1wbGllcyB0aGF0IHNwbGl0dGFibGVbOmldIGZpdHMsIGFuZAorICAgICMgaW52YXJpYW50ICMyIGltcGxpZXMgdGhhdCBzcGxpdHRhYmxlWzppKzFdIGRvZXMgbm90IGZpdCwgc28gaQorICAgICMgaXMgd2hhdCB3ZSdyZSBsb29raW5nIGZvci4KKyAgICBmaXJzdCA9IGNoYXJzZXQuZnJvbV9zcGxpdHRhYmxlKHNwbGl0dGFibGVbOmldLCBGYWxzZSkKKyAgICBsYXN0ICA9IGNoYXJzZXQuZnJvbV9zcGxpdHRhYmxlKHNwbGl0dGFibGVbaTpdLCBGYWxzZSkKKyAgICByZXR1cm4gZmlyc3QsIGxhc3QKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDkxNjYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9oZWFkZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvaGVhZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2Q1NDAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9oZWFkZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvaXRlcmF0b3JzLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9pdGVyYXRvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk5ZjIyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvaXRlcmF0b3JzLnB5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiVmFyaW91cyB0eXBlcyBvZiB1c2VmdWwgaXRlcmF0b3JzIGFuZCBnZW5lcmF0b3JzLiIiIgorCitfX2FsbF9fID0gWworICAgICdib2R5X2xpbmVfaXRlcmF0b3InLAorICAgICd0eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yJywKKyAgICAnd2FsaycsCisgICAgIyBEbyBub3QgaW5jbHVkZSBfc3RydWN0dXJlKCkgc2luY2UgaXQncyBwYXJ0IG9mIHRoZSBkZWJ1Z2dpbmcgQVBJLgorICAgIF0KKworaW1wb3J0IHN5cworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKworDAorIyBUaGlzIGZ1bmN0aW9uIHdpbGwgYmVjb21lIGEgbWV0aG9kIG9mIHRoZSBNZXNzYWdlIGNsYXNzCitkZWYgd2FsayhzZWxmKToKKyAgICAiIiJXYWxrIG92ZXIgdGhlIG1lc3NhZ2UgdHJlZSwgeWllbGRpbmcgZWFjaCBzdWJwYXJ0LgorCisgICAgVGhlIHdhbGsgaXMgcGVyZm9ybWVkIGluIGRlcHRoLWZpcnN0IG9yZGVyLiAgVGhpcyBtZXRob2QgaXMgYQorICAgIGdlbmVyYXRvci4KKyAgICAiIiIKKyAgICB5aWVsZCBzZWxmCisgICAgaWYgc2VsZi5pc19tdWx0aXBhcnQoKToKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gc2VsZi5nZXRfcGF5bG9hZCgpOgorICAgICAgICAgICAgZm9yIHN1YnN1YnBhcnQgaW4gc3VicGFydC53YWxrKCk6CisgICAgICAgICAgICAgICAgeWllbGQgc3Vic3VicGFydAorCisKKwwKKyMgVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgaW1wb3J0ZWQgaW50byB0aGUgSXRlcmF0b3JzLnB5IGludGVyZmFjZSBtb2R1bGUuCitkZWYgYm9keV9saW5lX2l0ZXJhdG9yKG1zZywgZGVjb2RlPUZhbHNlKToKKyAgICAiIiJJdGVyYXRlIG92ZXIgdGhlIHBhcnRzLCByZXR1cm5pbmcgc3RyaW5nIHBheWxvYWRzIGxpbmUtYnktbGluZS4KKworICAgIE9wdGlvbmFsIGRlY29kZSAoZGVmYXVsdCBGYWxzZSkgaXMgcGFzc2VkIHRocm91Z2ggdG8gLmdldF9wYXlsb2FkKCkuCisgICAgIiIiCisgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgcGF5bG9hZCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoZGVjb2RlPWRlY29kZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwYXlsb2FkLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIFN0cmluZ0lPKHBheWxvYWQpOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKKworCitkZWYgdHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2csIG1haW50eXBlPSd0ZXh0Jywgc3VidHlwZT1Ob25lKToKKyAgICAiIiJJdGVyYXRlIG92ZXIgdGhlIHN1YnBhcnRzIHdpdGggYSBnaXZlbiBNSU1FIHR5cGUuCisKKyAgICBVc2UgYG1haW50eXBlJyBhcyB0aGUgbWFpbiBNSU1FIHR5cGUgdG8gbWF0Y2ggYWdhaW5zdDsgdGhpcyBkZWZhdWx0cyB0bworICAgICJ0ZXh0Ii4gIE9wdGlvbmFsIGBzdWJ0eXBlJyBpcyB0aGUgTUlNRSBzdWJ0eXBlIHRvIG1hdGNoIGFnYWluc3Q7IGlmCisgICAgb21pdHRlZCwgb25seSB0aGUgbWFpbiB0eXBlIGlzIG1hdGNoZWQuCisgICAgIiIiCisgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgaWYgc3VicGFydC5nZXRfY29udGVudF9tYWludHlwZSgpID09IG1haW50eXBlOgorICAgICAgICAgICAgaWYgc3VidHlwZSBpcyBOb25lIG9yIHN1YnBhcnQuZ2V0X2NvbnRlbnRfc3VidHlwZSgpID09IHN1YnR5cGU6CisgICAgICAgICAgICAgICAgeWllbGQgc3VicGFydAorCisKKwwKK2RlZiBfc3RydWN0dXJlKG1zZywgZnA9Tm9uZSwgbGV2ZWw9MCwgaW5jbHVkZV9kZWZhdWx0PUZhbHNlKToKKyAgICAiIiJBIGhhbmR5IGRlYnVnZ2luZyBhaWQiIiIKKyAgICBpZiBmcCBpcyBOb25lOgorICAgICAgICBmcCA9IHN5cy5zdGRvdXQKKyAgICB0YWIgPSAnICcgKiAobGV2ZWwgKiA0KQorICAgIHByaW50ID4+IGZwLCB0YWIgKyBtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLAorICAgIGlmIGluY2x1ZGVfZGVmYXVsdDoKKyAgICAgICAgcHJpbnQgPj4gZnAsICdbJXNdJyAlIG1zZy5nZXRfZGVmYXVsdF90eXBlKCkKKyAgICBlbHNlOgorICAgICAgICBwcmludCA+PiBmcAorICAgIGlmIG1zZy5pc19tdWx0aXBhcnQoKToKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLmdldF9wYXlsb2FkKCk6CisgICAgICAgICAgICBfc3RydWN0dXJlKHN1YnBhcnQsIGZwLCBsZXZlbCsxLCBpbmNsdWRlX2RlZmF1bHQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiZGJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvaXRlcmF0b3JzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL2l0ZXJhdG9ycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RiZGJkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvaXRlcmF0b3JzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21lc3NhZ2UucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21lc3NhZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5MzM3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWVzc2FnZS5weQpAQCAtMCwwICsxLDc5NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJCYXNpYyBtZXNzYWdlIG9iamVjdCBmb3IgdGhlIGVtYWlsIHBhY2thZ2Ugb2JqZWN0IG1vZGVsLiIiIgorCitfX2FsbF9fID0gWydNZXNzYWdlJ10KKworaW1wb3J0IHJlCitpbXBvcnQgdXUKK2ltcG9ydCBiaW5hc2NpaQoraW1wb3J0IHdhcm5pbmdzCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworIyBJbnRyYXBhY2thZ2UgaW1wb3J0cworaW1wb3J0IGVtYWlsLmNoYXJzZXQKK2Zyb20gZW1haWwgaW1wb3J0IHV0aWxzCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKKworU0VNSVNQQUNFID0gJzsgJworCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgYHNwZWNpYWwnIGNoYXJhY3RlcnMgaW4gcGFyYW1ldGVycywgdGhlCisjIGV4aXN0ZW5jZSBvZiB3aGljaCBmb3JjZSBxdW90aW5nIG9mIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCit0c3BlY2lhbHMgPSByZS5jb21waWxlKHInWyBcKFwpPD5ALDs6XFwiL1xbXF1cPz1dJykKKworCisjIEhlbHBlciBmdW5jdGlvbnMKK2RlZiBfc3BsaXRwYXJhbShwYXJhbSk6CisgICAgIyBTcGxpdCBoZWFkZXIgcGFyYW1ldGVycy4gIEJBVzogdGhpcyBtYXkgYmUgdG9vIHNpbXBsZS4gIEl0IGlzbid0CisgICAgIyBzdHJpY3RseSBSRkMgMjA0NSAoc2VjdGlvbiA1LjEpIGNvbXBsaWFudCwgYnV0IGl0IGNhdGNoZXMgbW9zdCBoZWFkZXJzCisgICAgIyBmb3VuZCBpbiB0aGUgd2lsZC4gIFdlIG1heSBldmVudHVhbGx5IG5lZWQgYSBmdWxsIGZsZWRnZWQgcGFyc2VyCisgICAgIyBldmVudHVhbGx5LgorICAgIGEsIHNlcCwgYiA9IHBhcmFtLnBhcnRpdGlvbignOycpCisgICAgaWYgbm90IHNlcDoKKyAgICAgICAgcmV0dXJuIGEuc3RyaXAoKSwgTm9uZQorICAgIHJldHVybiBhLnN0cmlwKCksIGIuc3RyaXAoKQorDAorZGVmIF9mb3JtYXRwYXJhbShwYXJhbSwgdmFsdWU9Tm9uZSwgcXVvdGU9VHJ1ZSk6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gZm9ybWF0IGFuZCByZXR1cm4gYSBrZXk9dmFsdWUgcGFpci4KKworICAgIFRoaXMgd2lsbCBxdW90ZSB0aGUgdmFsdWUgaWYgbmVlZGVkIG9yIGlmIHF1b3RlIGlzIHRydWUuICBJZiB2YWx1ZSBpcyBhCisgICAgdGhyZWUgdHVwbGUgKGNoYXJzZXQsIGxhbmd1YWdlLCB2YWx1ZSksIGl0IHdpbGwgYmUgZW5jb2RlZCBhY2NvcmRpbmcKKyAgICB0byBSRkMyMjMxIHJ1bGVzLgorICAgICIiIgorICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIGFuZCBsZW4odmFsdWUpID4gMDoKKyAgICAgICAgIyBBIHR1cGxlIGlzIHVzZWQgZm9yIFJGQyAyMjMxIGVuY29kZWQgcGFyYW1ldGVyIHZhbHVlcyB3aGVyZSBpdGVtcworICAgICAgICAjIGFyZSAoY2hhcnNldCwgbGFuZ3VhZ2UsIHZhbHVlKS4gIGNoYXJzZXQgaXMgYSBzdHJpbmcsIG5vdCBhIENoYXJzZXQKKyAgICAgICAgIyBpbnN0YW5jZS4KKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICAgICAgIyBFbmNvZGUgYXMgcGVyIFJGQyAyMjMxCisgICAgICAgICAgICBwYXJhbSArPSAnKicKKyAgICAgICAgICAgIHZhbHVlID0gdXRpbHMuZW5jb2RlX3JmYzIyMzEodmFsdWVbMl0sIHZhbHVlWzBdLCB2YWx1ZVsxXSkKKyAgICAgICAgIyBCQVc6IFBsZWFzZSBjaGVjayB0aGlzLiAgSSB0aGluayB0aGF0IGlmIHF1b3RlIGlzIHNldCBpdCBzaG91bGQKKyAgICAgICAgIyBmb3JjZSBxdW90aW5nIGV2ZW4gaWYgbm90IG5lY2Vzc2FyeS4KKyAgICAgICAgaWYgcXVvdGUgb3IgdHNwZWNpYWxzLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gJyVzPSIlcyInICUgKHBhcmFtLCB1dGlscy5xdW90ZSh2YWx1ZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJyVzPSVzJyAlIChwYXJhbSwgdmFsdWUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHBhcmFtCisKK2RlZiBfcGFyc2VwYXJhbShzKToKKyAgICBwbGlzdCA9IFtdCisgICAgd2hpbGUgc1s6MV0gPT0gJzsnOgorICAgICAgICBzID0gc1sxOl0KKyAgICAgICAgZW5kID0gcy5maW5kKCc7JykKKyAgICAgICAgd2hpbGUgZW5kID4gMCBhbmQgKHMuY291bnQoJyInLCAwLCBlbmQpIC0gcy5jb3VudCgnXFwiJywgMCwgZW5kKSkgJSAyOgorICAgICAgICAgICAgZW5kID0gcy5maW5kKCc7JywgZW5kICsgMSkKKyAgICAgICAgaWYgZW5kIDwgMDoKKyAgICAgICAgICAgIGVuZCA9IGxlbihzKQorICAgICAgICBmID0gc1s6ZW5kXQorICAgICAgICBpZiAnPScgaW4gZjoKKyAgICAgICAgICAgIGkgPSBmLmluZGV4KCc9JykKKyAgICAgICAgICAgIGYgPSBmWzppXS5zdHJpcCgpLmxvd2VyKCkgKyAnPScgKyBmW2krMTpdLnN0cmlwKCkKKyAgICAgICAgcGxpc3QuYXBwZW5kKGYuc3RyaXAoKSkKKyAgICAgICAgcyA9IHNbZW5kOl0KKyAgICByZXR1cm4gcGxpc3QKKworCitkZWYgX3VucXVvdGV2YWx1ZSh2YWx1ZSk6CisgICAgIyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoKSBiZWNhdXNlIGl0IGRvZXNuJ3QKKyAgICAjIHRyeSB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0byBhIHVuaWNvZGUuICBNZXNzYWdlLmdldF9wYXJhbSgpIGFuZAorICAgICMgTWVzc2FnZS5nZXRfcGFyYW1zKCkgYXJlIGJvdGggY3VycmVudGx5IGRlZmluZWQgdG8gcmV0dXJuIHRoZSB0dXBsZSBpbgorICAgICMgdGhlIGZhY2Ugb2YgUkZDIDIyMzEgcGFyYW1ldGVycy4KKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CisgICAgICAgIHJldHVybiB2YWx1ZVswXSwgdmFsdWVbMV0sIHV0aWxzLnVucXVvdGUodmFsdWVbMl0pCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHV0aWxzLnVucXVvdGUodmFsdWUpCisKKworDAorY2xhc3MgTWVzc2FnZToKKyAgICAiIiJCYXNpYyBtZXNzYWdlIG9iamVjdC4KKworICAgIEEgbWVzc2FnZSBvYmplY3QgaXMgZGVmaW5lZCBhcyBzb21ldGhpbmcgdGhhdCBoYXMgYSBidW5jaCBvZiBSRkMgMjgyMgorICAgIGhlYWRlcnMgYW5kIGEgcGF5bG9hZC4gIEl0IG1heSBvcHRpb25hbGx5IGhhdmUgYW4gZW52ZWxvcGUgaGVhZGVyCisgICAgKGEuay5hLiBVbml4LUZyb20gb3IgRnJvbV8gaGVhZGVyKS4gIElmIHRoZSBtZXNzYWdlIGlzIGEgY29udGFpbmVyIChpLmUuIGEKKyAgICBtdWx0aXBhcnQgb3IgYSBtZXNzYWdlL3JmYzgyMiksIHRoZW4gdGhlIHBheWxvYWQgaXMgYSBsaXN0IG9mIE1lc3NhZ2UKKyAgICBvYmplY3RzLCBvdGhlcndpc2UgaXQgaXMgYSBzdHJpbmcuCisKKyAgICBNZXNzYWdlIG9iamVjdHMgaW1wbGVtZW50IHBhcnQgb2YgdGhlIGBtYXBwaW5nJyBpbnRlcmZhY2UsIHdoaWNoIGFzc3VtZXMKKyAgICB0aGVyZSBpcyBleGFjdGx5IG9uZSBvY2N1cnJlbmNlIG9mIHRoZSBoZWFkZXIgcGVyIG1lc3NhZ2UuICBTb21lIGhlYWRlcnMKKyAgICBkbyBpbiBmYWN0IGFwcGVhciBtdWx0aXBsZSB0aW1lcyAoZS5nLiBSZWNlaXZlZCkgYW5kIGZvciB0aG9zZSBoZWFkZXJzLAorICAgIHlvdSBtdXN0IHVzZSB0aGUgZXhwbGljaXQgQVBJIHRvIHNldCBvciBnZXQgYWxsIHRoZSBoZWFkZXJzLiAgTm90IGFsbCBvZgorICAgIHRoZSBtYXBwaW5nIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5faGVhZGVycyA9IFtdCisgICAgICAgIHNlbGYuX3VuaXhmcm9tID0gTm9uZQorICAgICAgICBzZWxmLl9wYXlsb2FkID0gTm9uZQorICAgICAgICBzZWxmLl9jaGFyc2V0ID0gTm9uZQorICAgICAgICAjIERlZmF1bHRzIGZvciBtdWx0aXBhcnQgbWVzc2FnZXMKKyAgICAgICAgc2VsZi5wcmVhbWJsZSA9IHNlbGYuZXBpbG9ndWUgPSBOb25lCisgICAgICAgIHNlbGYuZGVmZWN0cyA9IFtdCisgICAgICAgICMgRGVmYXVsdCBjb250ZW50IHR5cGUKKyAgICAgICAgc2VsZi5fZGVmYXVsdF90eXBlID0gJ3RleHQvcGxhaW4nCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBlbnRpcmUgZm9ybWF0dGVkIG1lc3NhZ2UgYXMgYSBzdHJpbmcuCisgICAgICAgIFRoaXMgaW5jbHVkZXMgdGhlIGhlYWRlcnMsIGJvZHksIGFuZCBlbnZlbG9wZSBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5hc19zdHJpbmcodW5peGZyb209VHJ1ZSkKKworICAgIGRlZiBhc19zdHJpbmcoc2VsZiwgdW5peGZyb209RmFsc2UpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGVudGlyZSBmb3JtYXR0ZWQgbWVzc2FnZSBhcyBhIHN0cmluZy4KKyAgICAgICAgT3B0aW9uYWwgYHVuaXhmcm9tJyB3aGVuIFRydWUsIG1lYW5zIGluY2x1ZGUgdGhlIFVuaXggRnJvbV8gZW52ZWxvcGUKKyAgICAgICAgaGVhZGVyLgorCisgICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgYW5kIG1heSBub3QgZ2VuZXJhdGUgdGhlIG1lc3NhZ2UgZXhhY3RseQorICAgICAgICBhcyB5b3UgaW50ZW5kIGJlY2F1c2UgYnkgZGVmYXVsdCBpdCBtYW5nbGVzIGxpbmVzIHRoYXQgYmVnaW4gd2l0aAorICAgICAgICAiRnJvbSAiLiAgRm9yIG1vcmUgZmxleGliaWxpdHksIHVzZSB0aGUgZmxhdHRlbigpIG1ldGhvZCBvZiBhCisgICAgICAgIEdlbmVyYXRvciBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZyb20gZW1haWwuZ2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IoZnApCisgICAgICAgIGcuZmxhdHRlbihzZWxmLCB1bml4ZnJvbT11bml4ZnJvbSkKKyAgICAgICAgcmV0dXJuIGZwLmdldHZhbHVlKCkKKworICAgIGRlZiBpc19tdWx0aXBhcnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBtZXNzYWdlIGNvbnNpc3RzIG9mIG11bHRpcGxlIHBhcnRzLiIiIgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShzZWxmLl9wYXlsb2FkLCBsaXN0KQorCisgICAgIworICAgICMgVW5peCBGcm9tXyBsaW5lCisgICAgIworICAgIGRlZiBzZXRfdW5peGZyb20oc2VsZiwgdW5peGZyb20pOgorICAgICAgICBzZWxmLl91bml4ZnJvbSA9IHVuaXhmcm9tCisKKyAgICBkZWYgZ2V0X3VuaXhmcm9tKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdW5peGZyb20KKworICAgICMKKyAgICAjIFBheWxvYWQgbWFuaXB1bGF0aW9uLgorICAgICMKKyAgICBkZWYgYXR0YWNoKHNlbGYsIHBheWxvYWQpOgorICAgICAgICAiIiJBZGQgdGhlIGdpdmVuIHBheWxvYWQgdG8gdGhlIGN1cnJlbnQgcGF5bG9hZC4KKworICAgICAgICBUaGUgY3VycmVudCBwYXlsb2FkIHdpbGwgYWx3YXlzIGJlIGEgbGlzdCBvZiBvYmplY3RzIGFmdGVyIHRoaXMgbWV0aG9kCisgICAgICAgIGlzIGNhbGxlZC4gIElmIHlvdSB3YW50IHRvIHNldCB0aGUgcGF5bG9hZCB0byBhIHNjYWxhciBvYmplY3QsIHVzZQorICAgICAgICBzZXRfcGF5bG9hZCgpIGluc3RlYWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9wYXlsb2FkIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9wYXlsb2FkID0gW3BheWxvYWRdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9wYXlsb2FkLmFwcGVuZChwYXlsb2FkKQorCisgICAgZGVmIGdldF9wYXlsb2FkKHNlbGYsIGk9Tm9uZSwgZGVjb2RlPUZhbHNlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBwYXlsb2FkLgorCisgICAgICAgIFRoZSBwYXlsb2FkIHdpbGwgZWl0aGVyIGJlIGEgbGlzdCBvYmplY3Qgb3IgYSBzdHJpbmcuICBJZiB5b3UgbXV0YXRlCisgICAgICAgIHRoZSBsaXN0IG9iamVjdCwgeW91IG1vZGlmeSB0aGUgbWVzc2FnZSdzIHBheWxvYWQgaW4gcGxhY2UuICBPcHRpb25hbAorICAgICAgICBpIHJldHVybnMgdGhhdCBpbmRleCBpbnRvIHRoZSBwYXlsb2FkLgorCisgICAgICAgIE9wdGlvbmFsIGRlY29kZSBpcyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBwYXlsb2FkIHNob3VsZCBiZQorICAgICAgICBkZWNvZGVkIG9yIG5vdCwgYWNjb3JkaW5nIHRvIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlcgorICAgICAgICAoZGVmYXVsdCBpcyBGYWxzZSkuCisKKyAgICAgICAgV2hlbiBUcnVlIGFuZCB0aGUgbWVzc2FnZSBpcyBub3QgYSBtdWx0aXBhcnQsIHRoZSBwYXlsb2FkIHdpbGwgYmUKKyAgICAgICAgZGVjb2RlZCBpZiB0aGlzIGhlYWRlcidzIHZhbHVlIGlzIGBxdW90ZWQtcHJpbnRhYmxlJyBvciBgYmFzZTY0Jy4gIElmCisgICAgICAgIHNvbWUgb3RoZXIgZW5jb2RpbmcgaXMgdXNlZCwgb3IgdGhlIGhlYWRlciBpcyBtaXNzaW5nLCBvciBpZiB0aGUKKyAgICAgICAgcGF5bG9hZCBoYXMgYm9ndXMgZGF0YSAoaS5lLiBib2d1cyBiYXNlNjQgb3IgdXVlbmNvZGVkIGRhdGEpLCB0aGUKKyAgICAgICAgcGF5bG9hZCBpcyByZXR1cm5lZCBhcy1pcy4KKworICAgICAgICBJZiB0aGUgbWVzc2FnZSBpcyBhIG11bHRpcGFydCBhbmQgdGhlIGRlY29kZSBmbGFnIGlzIFRydWUsIHRoZW4gTm9uZQorICAgICAgICBpcyByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGkgaXMgTm9uZToKKyAgICAgICAgICAgIHBheWxvYWQgPSBzZWxmLl9wYXlsb2FkCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5fcGF5bG9hZCwgbGlzdCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0V4cGVjdGVkIGxpc3QsIGdvdCAlcycgJSB0eXBlKHNlbGYuX3BheWxvYWQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF5bG9hZCA9IHNlbGYuX3BheWxvYWRbaV0KKyAgICAgICAgaWYgZGVjb2RlOgorICAgICAgICAgICAgaWYgc2VsZi5pc19tdWx0aXBhcnQoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgY3RlID0gc2VsZi5nZXQoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnLCAnJykubG93ZXIoKQorICAgICAgICAgICAgaWYgY3RlID09ICdxdW90ZWQtcHJpbnRhYmxlJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuX3FkZWNvZGUocGF5bG9hZCkKKyAgICAgICAgICAgIGVsaWYgY3RlID09ICdiYXNlNjQnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLl9iZGVjb2RlKHBheWxvYWQpCisgICAgICAgICAgICAgICAgZXhjZXB0IGJpbmFzY2lpLkVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIEluY29ycmVjdCBwYWRkaW5nCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkCisgICAgICAgICAgICBlbGlmIGN0ZSBpbiAoJ3gtdXVlbmNvZGUnLCAndXVlbmNvZGUnLCAndXVlJywgJ3gtdXVlJyk6CisgICAgICAgICAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdXUuZGVjb2RlKFN0cmluZ0lPKHBheWxvYWQrJ1xuJyksIHNmcCwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHNmcC5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IHV1LkVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIFNvbWUgZGVjb2RpbmcgcHJvYmxlbQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF5bG9hZAorICAgICAgICAjIEV2ZXJ5dGhpbmcgZWxzZSwgaW5jbHVkaW5nIGVuY29kaW5ncyB3aXRoIDhiaXQgb3IgN2JpdCBhcmUgcmV0dXJuZWQKKyAgICAgICAgIyB1bmNoYW5nZWQuCisgICAgICAgIHJldHVybiBwYXlsb2FkCisKKyAgICBkZWYgc2V0X3BheWxvYWQoc2VsZiwgcGF5bG9hZCwgY2hhcnNldD1Ob25lKToKKyAgICAgICAgIiIiU2V0IHRoZSBwYXlsb2FkIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKworICAgICAgICBPcHRpb25hbCBjaGFyc2V0IHNldHMgdGhlIG1lc3NhZ2UncyBkZWZhdWx0IGNoYXJhY3RlciBzZXQuICBTZWUKKyAgICAgICAgc2V0X2NoYXJzZXQoKSBmb3IgZGV0YWlscy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3BheWxvYWQgPSBwYXlsb2FkCisgICAgICAgIGlmIGNoYXJzZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNldF9jaGFyc2V0KGNoYXJzZXQpCisKKyAgICBkZWYgc2V0X2NoYXJzZXQoc2VsZiwgY2hhcnNldCk6CisgICAgICAgICIiIlNldCB0aGUgY2hhcnNldCBvZiB0aGUgcGF5bG9hZCB0byBhIGdpdmVuIGNoYXJhY3RlciBzZXQuCisKKyAgICAgICAgY2hhcnNldCBjYW4gYmUgYSBDaGFyc2V0IGluc3RhbmNlLCBhIHN0cmluZyBuYW1pbmcgYSBjaGFyYWN0ZXIgc2V0LCBvcgorICAgICAgICBOb25lLiAgSWYgaXQgaXMgYSBzdHJpbmcgaXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBDaGFyc2V0IGluc3RhbmNlLgorICAgICAgICBJZiBjaGFyc2V0IGlzIE5vbmUsIHRoZSBjaGFyc2V0IHBhcmFtZXRlciB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUKKyAgICAgICAgQ29udGVudC1UeXBlIGZpZWxkLiAgQW55dGhpbmcgZWxzZSB3aWxsIGdlbmVyYXRlIGEgVHlwZUVycm9yLgorCisgICAgICAgIFRoZSBtZXNzYWdlIHdpbGwgYmUgYXNzdW1lZCB0byBiZSBvZiB0eXBlIHRleHQvKiBlbmNvZGVkIHdpdGgKKyAgICAgICAgY2hhcnNldC5pbnB1dF9jaGFyc2V0LiAgSXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2hhcnNldC5vdXRwdXRfY2hhcnNldAorICAgICAgICBhbmQgZW5jb2RlZCBwcm9wZXJseSwgaWYgbmVlZGVkLCB3aGVuIGdlbmVyYXRpbmcgdGhlIHBsYWluIHRleHQKKyAgICAgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UuICBNSU1FIGhlYWRlcnMgKE1JTUUtVmVyc2lvbiwKKyAgICAgICAgQ29udGVudC1UeXBlLCBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nKSB3aWxsIGJlIGFkZGVkIGFzIG5lZWRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgY2hhcnNldCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWxfcGFyYW0oJ2NoYXJzZXQnKQorICAgICAgICAgICAgc2VsZi5fY2hhcnNldCA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBpc2luc3RhbmNlKGNoYXJzZXQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgY2hhcnNldCA9IGVtYWlsLmNoYXJzZXQuQ2hhcnNldChjaGFyc2V0KQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaGFyc2V0LCBlbWFpbC5jaGFyc2V0LkNoYXJzZXQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKGNoYXJzZXQpCisgICAgICAgICMgQkFXOiBzaG91bGQgd2UgYWNjZXB0IHN0cmluZ3MgdGhhdCBjYW4gc2VydmUgYXMgYXJndW1lbnRzIHRvIHRoZQorICAgICAgICAjIENoYXJzZXQgY29uc3RydWN0b3I/CisgICAgICAgIHNlbGYuX2NoYXJzZXQgPSBjaGFyc2V0CisgICAgICAgIGlmICdNSU1FLVZlcnNpb24nIG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdNSU1FLVZlcnNpb24nLCAnMS4wJykKKyAgICAgICAgaWYgJ0NvbnRlbnQtVHlwZScgbm90IGluIHNlbGY6CisgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3BsYWluJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PWNoYXJzZXQuZ2V0X291dHB1dF9jaGFyc2V0KCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNldF9wYXJhbSgnY2hhcnNldCcsIGNoYXJzZXQuZ2V0X291dHB1dF9jaGFyc2V0KCkpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5fcGF5bG9hZCwgdW5pY29kZSk6CisgICAgICAgICAgICBzZWxmLl9wYXlsb2FkID0gc2VsZi5fcGF5bG9hZC5lbmNvZGUoY2hhcnNldC5vdXRwdXRfY2hhcnNldCkKKyAgICAgICAgaWYgc3RyKGNoYXJzZXQpICE9IGNoYXJzZXQuZ2V0X291dHB1dF9jaGFyc2V0KCk6CisgICAgICAgICAgICBzZWxmLl9wYXlsb2FkID0gY2hhcnNldC5ib2R5X2VuY29kZShzZWxmLl9wYXlsb2FkKQorICAgICAgICBpZiAnQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZycgbm90IGluIHNlbGY6CisgICAgICAgICAgICBjdGUgPSBjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdGUoc2VsZikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5fcGF5bG9hZCA9IGNoYXJzZXQuYm9keV9lbmNvZGUoc2VsZi5fcGF5bG9hZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnLCBjdGUpCisKKyAgICBkZWYgZ2V0X2NoYXJzZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgQ2hhcnNldCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lc3NhZ2UncyBwYXlsb2FkLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoYXJzZXQKKworICAgICMKKyAgICAjIE1BUFBJTkcgSU5URVJGQUNFIChwYXJ0aWFsKQorICAgICMKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgaGVhZGVycywgaW5jbHVkaW5nIGR1cGxpY2F0ZXMuIiIiCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5faGVhZGVycykKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiR2V0IGEgaGVhZGVyIHZhbHVlLgorCisgICAgICAgIFJldHVybiBOb25lIGlmIHRoZSBoZWFkZXIgaXMgbWlzc2luZyBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXhjZXB0aW9uLgorCisgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgaGVhZGVyIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzLCBleGFjdGx5IHdoaWNoCisgICAgICAgIG9jY3VycmVuY2UgZ2V0cyByZXR1cm5lZCBpcyB1bmRlZmluZWQuICBVc2UgZ2V0X2FsbCgpIHRvIGdldCBhbGwKKyAgICAgICAgdGhlIHZhbHVlcyBtYXRjaGluZyBhIGhlYWRlciBmaWVsZCBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KG5hbWUpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsKToKKyAgICAgICAgIiIiU2V0IHRoZSB2YWx1ZSBvZiBhIGhlYWRlci4KKworICAgICAgICBOb3RlOiB0aGlzIGRvZXMgbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyBoZWFkZXIgd2l0aCB0aGUgc2FtZSBmaWVsZAorICAgICAgICBuYW1lLiAgVXNlIF9fZGVsaXRlbV9fKCkgZmlyc3QgdG8gZGVsZXRlIGFueSBleGlzdGluZyBoZWFkZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5faGVhZGVycy5hcHBlbmQoKG5hbWUsIHZhbCkpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgb2NjdXJyZW5jZXMgb2YgYSBoZWFkZXIsIGlmIHByZXNlbnQuCisKKyAgICAgICAgRG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBoZWFkZXIgaXMgbWlzc2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgbmV3aGVhZGVycyA9IFtdCisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnM6CisgICAgICAgICAgICBpZiBrLmxvd2VyKCkgIT0gbmFtZToKKyAgICAgICAgICAgICAgICBuZXdoZWFkZXJzLmFwcGVuZCgoaywgdikpCisgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBuZXdoZWFkZXJzCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZS5sb3dlcigpIGluIFtrLmxvd2VyKCkgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyc10KKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVzc2FnZSBjb250YWlucyB0aGUgaGVhZGVyLiIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KG5hbWUsIG1pc3NpbmcpIGlzIG5vdCBtaXNzaW5nCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIG1lc3NhZ2UncyBoZWFkZXIgZmllbGQgbmFtZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgIG1lc3NhZ2UsIG9yIHdlcmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFtrIGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnNdCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgbWVzc2FnZSdzIGhlYWRlciB2YWx1ZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgIG1lc3NhZ2UsIG9yIHdlcmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFt2IGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnNdCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICIiIkdldCBhbGwgdGhlIG1lc3NhZ2UncyBoZWFkZXIgZmllbGRzIGFuZCB2YWx1ZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgIG1lc3NhZ2UsIG9yIHdlcmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWRlcnNbOl0KKworICAgIGRlZiBnZXQoc2VsZiwgbmFtZSwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgIiIiR2V0IGEgaGVhZGVyIHZhbHVlLgorCisgICAgICAgIExpa2UgX19nZXRpdGVtX18oKSBidXQgcmV0dXJuIGZhaWxvYmogaW5zdGVhZCBvZiBOb25lIHdoZW4gdGhlIGZpZWxkCisgICAgICAgIGlzIG1pc3NpbmcuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnM6CisgICAgICAgICAgICBpZiBrLmxvd2VyKCkgPT0gbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICByZXR1cm4gZmFpbG9iagorCisgICAgIworICAgICMgQWRkaXRpb25hbCB1c2VmdWwgc3R1ZmYKKyAgICAjCisKKyAgICBkZWYgZ2V0X2FsbChzZWxmLCBuYW1lLCBmYWlsb2JqPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgdmFsdWVzIGZvciB0aGUgbmFtZWQgZmllbGQuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgIG1lc3NhZ2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLiAgQW55IGZpZWxkcyBkZWxldGVkIGFuZAorICAgICAgICByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIgbGlzdC4KKworICAgICAgICBJZiBubyBzdWNoIGZpZWxkcyBleGlzdCwgZmFpbG9iaiBpcyByZXR1cm5lZCAoZGVmYXVsdHMgdG8gTm9uZSkuCisgICAgICAgICIiIgorICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnM6CisgICAgICAgICAgICBpZiBrLmxvd2VyKCkgPT0gbmFtZToKKyAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHYpCisgICAgICAgIGlmIG5vdCB2YWx1ZXM6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICByZXR1cm4gdmFsdWVzCisKKyAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBfbmFtZSwgX3ZhbHVlLCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJFeHRlbmRlZCBoZWFkZXIgc2V0dGluZy4KKworICAgICAgICBuYW1lIGlzIHRoZSBoZWFkZXIgZmllbGQgdG8gYWRkLiAga2V5d29yZCBhcmd1bWVudHMgY2FuIGJlIHVzZWQgdG8gc2V0CisgICAgICAgIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIGhlYWRlciBmaWVsZCwgd2l0aCB1bmRlcnNjb3JlcyBjb252ZXJ0ZWQKKyAgICAgICAgdG8gZGFzaGVzLiAgTm9ybWFsbHkgdGhlIHBhcmFtZXRlciB3aWxsIGJlIGFkZGVkIGFzIGtleT0idmFsdWUiIHVubGVzcworICAgICAgICB2YWx1ZSBpcyBOb25lLCBpbiB3aGljaCBjYXNlIG9ubHkgdGhlIGtleSB3aWxsIGJlIGFkZGVkLiAgSWYgYQorICAgICAgICBwYXJhbWV0ZXIgdmFsdWUgY29udGFpbnMgbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaXQgbXVzdCBiZSBzcGVjaWZpZWQgYXMgYQorICAgICAgICB0aHJlZS10dXBsZSBvZiAoY2hhcnNldCwgbGFuZ3VhZ2UsIHZhbHVlKSwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlCisgICAgICAgIGVuY29kZWQgYWNjb3JkaW5nIHRvIFJGQzIyMzEgcnVsZXMuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICBtc2cuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorICAgICAgICAiIiIKKyAgICAgICAgcGFydHMgPSBbXQorICAgICAgICBmb3IgaywgdiBpbiBfcGFyYW1zLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB2IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKGsucmVwbGFjZSgnXycsICctJykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChfZm9ybWF0cGFyYW0oay5yZXBsYWNlKCdfJywgJy0nKSwgdikpCisgICAgICAgIGlmIF92YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhcnRzLmluc2VydCgwLCBfdmFsdWUpCisgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChfbmFtZSwgU0VNSVNQQUNFLmpvaW4ocGFydHMpKSkKKworICAgIGRlZiByZXBsYWNlX2hlYWRlcihzZWxmLCBfbmFtZSwgX3ZhbHVlKToKKyAgICAgICAgIiIiUmVwbGFjZSBhIGhlYWRlci4KKworICAgICAgICBSZXBsYWNlIHRoZSBmaXJzdCBtYXRjaGluZyBoZWFkZXIgZm91bmQgaW4gdGhlIG1lc3NhZ2UsIHJldGFpbmluZworICAgICAgICBoZWFkZXIgb3JkZXIgYW5kIGNhc2UuICBJZiBubyBtYXRjaGluZyBoZWFkZXIgd2FzIGZvdW5kLCBhIEtleUVycm9yIGlzCisgICAgICAgIHJhaXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIF9uYW1lID0gX25hbWUubG93ZXIoKQorICAgICAgICBmb3IgaSwgKGssIHYpIGluIHppcChyYW5nZShsZW4oc2VsZi5faGVhZGVycykpLCBzZWxmLl9oZWFkZXJzKToKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKSA9PSBfbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLl9oZWFkZXJzW2ldID0gKGssIF92YWx1ZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoX25hbWUpCisKKyAgICAjCisgICAgIyBVc2UgdGhlc2UgdGhyZWUgbWV0aG9kcyBpbnN0ZWFkIG9mIHRoZSB0aHJlZSBhYm92ZS4KKyAgICAjCisKKyAgICBkZWYgZ2V0X2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgY29udGVudCB0eXBlLgorCisgICAgICAgIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgY29lcmNlZCB0byBsb3dlciBjYXNlIG9mIHRoZSBmb3JtCisgICAgICAgIGBtYWludHlwZS9zdWJ0eXBlJy4gIElmIHRoZXJlIHdhcyBubyBDb250ZW50LVR5cGUgaGVhZGVyIGluIHRoZQorICAgICAgICBtZXNzYWdlLCB0aGUgZGVmYXVsdCB0eXBlIGFzIGdpdmVuIGJ5IGdldF9kZWZhdWx0X3R5cGUoKSB3aWxsIGJlCisgICAgICAgIHJldHVybmVkLiAgU2luY2UgYWNjb3JkaW5nIHRvIFJGQyAyMDQ1LCBtZXNzYWdlcyBhbHdheXMgaGF2ZSBhIGRlZmF1bHQKKyAgICAgICAgdHlwZSB0aGlzIHdpbGwgYWx3YXlzIHJldHVybiBhIHZhbHVlLgorCisgICAgICAgIFJGQyAyMDQ1IGRlZmluZXMgYSBtZXNzYWdlJ3MgZGVmYXVsdCB0eXBlIHRvIGJlIHRleHQvcGxhaW4gdW5sZXNzIGl0CisgICAgICAgIGFwcGVhcnMgaW5zaWRlIGEgbXVsdGlwYXJ0L2RpZ2VzdCBjb250YWluZXIsIGluIHdoaWNoIGNhc2UgaXQgd291bGQgYmUKKyAgICAgICAgbWVzc2FnZS9yZmM4MjIuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgdmFsdWUgPSBzZWxmLmdldCgnY29udGVudC10eXBlJywgbWlzc2luZykKKyAgICAgICAgaWYgdmFsdWUgaXMgbWlzc2luZzoKKyAgICAgICAgICAgICMgVGhpcyBzaG91bGQgaGF2ZSBubyBwYXJhbWV0ZXJzCisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRfZGVmYXVsdF90eXBlKCkKKyAgICAgICAgY3R5cGUgPSBfc3BsaXRwYXJhbSh2YWx1ZSlbMF0ubG93ZXIoKQorICAgICAgICAjIFJGQyAyMDQ1LCBzZWN0aW9uIDUuMiBzYXlzIGlmIGl0cyBpbnZhbGlkLCB1c2UgdGV4dC9wbGFpbgorICAgICAgICBpZiBjdHlwZS5jb3VudCgnLycpICE9IDE6CisgICAgICAgICAgICByZXR1cm4gJ3RleHQvcGxhaW4nCisgICAgICAgIHJldHVybiBjdHlwZQorCisgICAgZGVmIGdldF9jb250ZW50X21haW50eXBlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG1lc3NhZ2UncyBtYWluIGNvbnRlbnQgdHlwZS4KKworICAgICAgICBUaGlzIGlzIHRoZSBgbWFpbnR5cGUnIHBhcnQgb2YgdGhlIHN0cmluZyByZXR1cm5lZCBieQorICAgICAgICBnZXRfY29udGVudF90eXBlKCkuCisgICAgICAgICIiIgorICAgICAgICBjdHlwZSA9IHNlbGYuZ2V0X2NvbnRlbnRfdHlwZSgpCisgICAgICAgIHJldHVybiBjdHlwZS5zcGxpdCgnLycpWzBdCisKKyAgICBkZWYgZ2V0X2NvbnRlbnRfc3VidHlwZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbWVzc2FnZSdzIHN1Yi1jb250ZW50IHR5cGUuCisKKyAgICAgICAgVGhpcyBpcyB0aGUgYHN1YnR5cGUnIHBhcnQgb2YgdGhlIHN0cmluZyByZXR1cm5lZCBieQorICAgICAgICBnZXRfY29udGVudF90eXBlKCkuCisgICAgICAgICIiIgorICAgICAgICBjdHlwZSA9IHNlbGYuZ2V0X2NvbnRlbnRfdHlwZSgpCisgICAgICAgIHJldHVybiBjdHlwZS5zcGxpdCgnLycpWzFdCisKKyAgICBkZWYgZ2V0X2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBgZGVmYXVsdCcgY29udGVudCB0eXBlLgorCisgICAgICAgIE1vc3QgbWVzc2FnZXMgaGF2ZSBhIGRlZmF1bHQgY29udGVudCB0eXBlIG9mIHRleHQvcGxhaW4sIGV4Y2VwdCBmb3IKKyAgICAgICAgbWVzc2FnZXMgdGhhdCBhcmUgc3VicGFydHMgb2YgbXVsdGlwYXJ0L2RpZ2VzdCBjb250YWluZXJzLiAgU3VjaAorICAgICAgICBzdWJwYXJ0cyBoYXZlIGEgZGVmYXVsdCBjb250ZW50IHR5cGUgb2YgbWVzc2FnZS9yZmM4MjIuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZGVmYXVsdF90eXBlCisKKyAgICBkZWYgc2V0X2RlZmF1bHRfdHlwZShzZWxmLCBjdHlwZSk6CisgICAgICAgICIiIlNldCB0aGUgYGRlZmF1bHQnIGNvbnRlbnQgdHlwZS4KKworICAgICAgICBjdHlwZSBzaG91bGQgYmUgZWl0aGVyICJ0ZXh0L3BsYWluIiBvciAibWVzc2FnZS9yZmM4MjIiLCBhbHRob3VnaCB0aGlzCisgICAgICAgIGlzIG5vdCBlbmZvcmNlZC4gIFRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBpcyBub3Qgc3RvcmVkIGluIHRoZQorICAgICAgICBDb250ZW50LVR5cGUgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZGVmYXVsdF90eXBlID0gY3R5cGUKKworICAgIGRlZiBfZ2V0X3BhcmFtc19wcmVzZXJ2ZShzZWxmLCBmYWlsb2JqLCBoZWFkZXIpOgorICAgICAgICAjIExpa2UgZ2V0X3BhcmFtcygpIGJ1dCBwcmVzZXJ2ZXMgdGhlIHF1b3Rpbmcgb2YgdmFsdWVzLiAgQkFXOgorICAgICAgICAjIHNob3VsZCB0aGlzIGJlIHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2U/CisgICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQorICAgICAgICB2YWx1ZSA9IHNlbGYuZ2V0KGhlYWRlciwgbWlzc2luZykKKyAgICAgICAgaWYgdmFsdWUgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIHBhcmFtcyA9IFtdCisgICAgICAgIGZvciBwIGluIF9wYXJzZXBhcmFtKCc7JyArIHZhbHVlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuYW1lLCB2YWwgPSBwLnNwbGl0KCc9JywgMSkKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCisgICAgICAgICAgICAgICAgdmFsID0gdmFsLnN0cmlwKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICMgTXVzdCBoYXZlIGJlZW4gYSBiYXJlIGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWUgPSBwLnN0cmlwKCkKKyAgICAgICAgICAgICAgICB2YWwgPSAnJworICAgICAgICAgICAgcGFyYW1zLmFwcGVuZCgobmFtZSwgdmFsKSkKKyAgICAgICAgcGFyYW1zID0gdXRpbHMuZGVjb2RlX3BhcmFtcyhwYXJhbXMpCisgICAgICAgIHJldHVybiBwYXJhbXMKKworICAgIGRlZiBnZXRfcGFyYW1zKHNlbGYsIGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCB1bnF1b3RlPVRydWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG1lc3NhZ2UncyBDb250ZW50LVR5cGUgcGFyYW1ldGVycywgYXMgYSBsaXN0LgorCisgICAgICAgIFRoZSBlbGVtZW50cyBvZiB0aGUgcmV0dXJuZWQgbGlzdCBhcmUgMi10dXBsZXMgb2Yga2V5L3ZhbHVlIHBhaXJzLCBhcworICAgICAgICBzcGxpdCBvbiB0aGUgYD0nIHNpZ24uICBUaGUgbGVmdCBoYW5kIHNpZGUgb2YgdGhlIGA9JyBpcyB0aGUga2V5LAorICAgICAgICB3aGlsZSB0aGUgcmlnaHQgaGFuZCBzaWRlIGlzIHRoZSB2YWx1ZS4gIElmIHRoZXJlIGlzIG5vIGA9JyBzaWduIGluCisgICAgICAgIHRoZSBwYXJhbWV0ZXIgdGhlIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcuICBUaGUgdmFsdWUgaXMgYXMKKyAgICAgICAgZGVzY3JpYmVkIGluIHRoZSBnZXRfcGFyYW0oKSBtZXRob2QuCisKKyAgICAgICAgT3B0aW9uYWwgZmFpbG9iaiBpcyB0aGUgb2JqZWN0IHRvIHJldHVybiBpZiB0aGVyZSBpcyBubyBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLiAgT3B0aW9uYWwgaGVhZGVyIGlzIHRoZSBoZWFkZXIgdG8gc2VhcmNoIGluc3RlYWQgb2YKKyAgICAgICAgQ29udGVudC1UeXBlLiAgSWYgdW5xdW90ZSBpcyBUcnVlLCB0aGUgdmFsdWUgaXMgdW5xdW90ZWQuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgcGFyYW1zID0gc2VsZi5fZ2V0X3BhcmFtc19wcmVzZXJ2ZShtaXNzaW5nLCBoZWFkZXIpCisgICAgICAgIGlmIHBhcmFtcyBpcyBtaXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKKyAgICAgICAgaWYgdW5xdW90ZToKKyAgICAgICAgICAgIHJldHVybiBbKGssIF91bnF1b3RldmFsdWUodikpIGZvciBrLCB2IGluIHBhcmFtc10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBwYXJhbXMKKworICAgIGRlZiBnZXRfcGFyYW0oc2VsZiwgcGFyYW0sIGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLAorICAgICAgICAgICAgICAgICAgdW5xdW90ZT1UcnVlKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaWYgZm91bmQgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIuCisKKyAgICAgICAgT3B0aW9uYWwgZmFpbG9iaiBpcyB0aGUgb2JqZWN0IHRvIHJldHVybiBpZiB0aGVyZSBpcyBubyBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLCBvciB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBoYXMgbm8gc3VjaCBwYXJhbWV0ZXIuICBPcHRpb25hbAorICAgICAgICBoZWFkZXIgaXMgdGhlIGhlYWRlciB0byBzZWFyY2ggaW5zdGVhZCBvZiBDb250ZW50LVR5cGUuCisKKyAgICAgICAgUGFyYW1ldGVyIGtleXMgYXJlIGFsd2F5cyBjb21wYXJlZCBjYXNlIGluc2Vuc2l0aXZlbHkuICBUaGUgcmV0dXJuCisgICAgICAgIHZhbHVlIGNhbiBlaXRoZXIgYmUgYSBzdHJpbmcsIG9yIGEgMy10dXBsZSBpZiB0aGUgcGFyYW1ldGVyIHdhcyBSRkMKKyAgICAgICAgMjIzMSBlbmNvZGVkLiAgV2hlbiBpdCdzIGEgMy10dXBsZSwgdGhlIGVsZW1lbnRzIG9mIHRoZSB2YWx1ZSBhcmUgb2YKKyAgICAgICAgdGhlIGZvcm0gKENIQVJTRVQsIExBTkdVQUdFLCBWQUxVRSkuICBOb3RlIHRoYXQgYm90aCBDSEFSU0VUIGFuZAorICAgICAgICBMQU5HVUFHRSBjYW4gYmUgTm9uZSwgaW4gd2hpY2ggY2FzZSB5b3Ugc2hvdWxkIGNvbnNpZGVyIFZBTFVFIHRvIGJlCisgICAgICAgIGVuY29kZWQgaW4gdGhlIHVzLWFzY2lpIGNoYXJzZXQuICBZb3UgY2FuIHVzdWFsbHkgaWdub3JlIExBTkdVQUdFLgorCisgICAgICAgIFlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGJlIHByZXBhcmVkIHRvIGRlYWwgd2l0aCAzLXR1cGxlIHJldHVybgorICAgICAgICB2YWx1ZXMsIGFuZCBjYW4gY29udmVydCB0aGUgcGFyYW1ldGVyIHRvIGEgVW5pY29kZSBzdHJpbmcgbGlrZSBzbzoKKworICAgICAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCdmb28nKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpOgorICAgICAgICAgICAgICAgIHBhcmFtID0gdW5pY29kZShwYXJhbVsyXSwgcGFyYW1bMF0gb3IgJ3VzLWFzY2lpJykKKworICAgICAgICBJbiBhbnkgY2FzZSwgdGhlIHBhcmFtZXRlciB2YWx1ZSAoZWl0aGVyIHRoZSByZXR1cm5lZCBzdHJpbmcsIG9yIHRoZQorICAgICAgICBWQUxVRSBpdGVtIGluIHRoZSAzLXR1cGxlKSBpcyBhbHdheXMgdW5xdW90ZWQsIHVubGVzcyB1bnF1b3RlIGlzIHNldAorICAgICAgICB0byBGYWxzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGhlYWRlciBub3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuX2dldF9wYXJhbXNfcHJlc2VydmUoZmFpbG9iaiwgaGVhZGVyKToKKyAgICAgICAgICAgIGlmIGsubG93ZXIoKSA9PSBwYXJhbS5sb3dlcigpOgorICAgICAgICAgICAgICAgIGlmIHVucXVvdGU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdW5xdW90ZXZhbHVlKHYpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgcmV0dXJuIGZhaWxvYmoKKworICAgIGRlZiBzZXRfcGFyYW0oc2VsZiwgcGFyYW0sIHZhbHVlLCBoZWFkZXI9J0NvbnRlbnQtVHlwZScsIHJlcXVvdGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9Tm9uZSwgbGFuZ3VhZ2U9JycpOgorICAgICAgICAiIiJTZXQgYSBwYXJhbWV0ZXIgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIuCisKKyAgICAgICAgSWYgdGhlIHBhcmFtZXRlciBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgaGVhZGVyLCBpdHMgdmFsdWUgd2lsbCBiZQorICAgICAgICByZXBsYWNlZCB3aXRoIHRoZSBuZXcgdmFsdWUuCisKKyAgICAgICAgSWYgaGVhZGVyIGlzIENvbnRlbnQtVHlwZSBhbmQgaGFzIG5vdCB5ZXQgYmVlbiBkZWZpbmVkIGZvciB0aGlzCisgICAgICAgIG1lc3NhZ2UsIGl0IHdpbGwgYmUgc2V0IHRvICJ0ZXh0L3BsYWluIiBhbmQgdGhlIG5ldyBwYXJhbWV0ZXIgYW5kCisgICAgICAgIHZhbHVlIHdpbGwgYmUgYXBwZW5kZWQgYXMgcGVyIFJGQyAyMDQ1LgorCisgICAgICAgIEFuIGFsdGVybmF0ZSBoZWFkZXIgY2FuIHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyIGFyZ3VtZW50LCBhbmQgYWxsCisgICAgICAgIHBhcmFtZXRlcnMgd2lsbCBiZSBxdW90ZWQgYXMgbmVjZXNzYXJ5IHVubGVzcyByZXF1b3RlIGlzIEZhbHNlLgorCisgICAgICAgIElmIGNoYXJzZXQgaXMgc3BlY2lmaWVkLCB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgZW5jb2RlZCBhY2NvcmRpbmcgdG8gUkZDCisgICAgICAgIDIyMzEuICBPcHRpb25hbCBsYW5ndWFnZSBzcGVjaWZpZXMgdGhlIFJGQyAyMjMxIGxhbmd1YWdlLCBkZWZhdWx0aW5nCisgICAgICAgIHRvIHRoZSBlbXB0eSBzdHJpbmcuICBCb3RoIGNoYXJzZXQgYW5kIGxhbmd1YWdlIHNob3VsZCBiZSBzdHJpbmdzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKSBhbmQgY2hhcnNldDoKKyAgICAgICAgICAgIHZhbHVlID0gKGNoYXJzZXQsIGxhbmd1YWdlLCB2YWx1ZSkKKworICAgICAgICBpZiBoZWFkZXIgbm90IGluIHNlbGYgYW5kIGhlYWRlci5sb3dlcigpID09ICdjb250ZW50LXR5cGUnOgorICAgICAgICAgICAgY3R5cGUgPSAndGV4dC9wbGFpbicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGN0eXBlID0gc2VsZi5nZXQoaGVhZGVyKQorICAgICAgICBpZiBub3Qgc2VsZi5nZXRfcGFyYW0ocGFyYW0sIGhlYWRlcj1oZWFkZXIpOgorICAgICAgICAgICAgaWYgbm90IGN0eXBlOgorICAgICAgICAgICAgICAgIGN0eXBlID0gX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZSwgcmVxdW90ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY3R5cGUgPSBTRU1JU1BBQ0Uuam9pbigKKyAgICAgICAgICAgICAgICAgICAgW2N0eXBlLCBfZm9ybWF0cGFyYW0ocGFyYW0sIHZhbHVlLCByZXF1b3RlKV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjdHlwZSA9ICcnCisgICAgICAgICAgICBmb3Igb2xkX3BhcmFtLCBvbGRfdmFsdWUgaW4gc2VsZi5nZXRfcGFyYW1zKGhlYWRlcj1oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucXVvdGU9cmVxdW90ZSk6CisgICAgICAgICAgICAgICAgYXBwZW5kX3BhcmFtID0gJycKKyAgICAgICAgICAgICAgICBpZiBvbGRfcGFyYW0ubG93ZXIoKSA9PSBwYXJhbS5sb3dlcigpOgorICAgICAgICAgICAgICAgICAgICBhcHBlbmRfcGFyYW0gPSBfZm9ybWF0cGFyYW0ocGFyYW0sIHZhbHVlLCByZXF1b3RlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZF9wYXJhbSA9IF9mb3JtYXRwYXJhbShvbGRfcGFyYW0sIG9sZF92YWx1ZSwgcmVxdW90ZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgY3R5cGU6CisgICAgICAgICAgICAgICAgICAgIGN0eXBlID0gYXBwZW5kX3BhcmFtCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY3R5cGUgPSBTRU1JU1BBQ0Uuam9pbihbY3R5cGUsIGFwcGVuZF9wYXJhbV0pCisgICAgICAgIGlmIGN0eXBlICE9IHNlbGYuZ2V0KGhlYWRlcik6CisgICAgICAgICAgICBkZWwgc2VsZltoZWFkZXJdCisgICAgICAgICAgICBzZWxmW2hlYWRlcl0gPSBjdHlwZQorCisgICAgZGVmIGRlbF9wYXJhbShzZWxmLCBwYXJhbSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCByZXF1b3RlPVRydWUpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIGdpdmVuIHBhcmFtZXRlciBjb21wbGV0ZWx5IGZyb20gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIuCisKKyAgICAgICAgVGhlIGhlYWRlciB3aWxsIGJlIHJlLXdyaXR0ZW4gaW4gcGxhY2Ugd2l0aG91dCB0aGUgcGFyYW1ldGVyIG9yIGl0cworICAgICAgICB2YWx1ZS4gQWxsIHZhbHVlcyB3aWxsIGJlIHF1b3RlZCBhcyBuZWNlc3NhcnkgdW5sZXNzIHJlcXVvdGUgaXMKKyAgICAgICAgRmFsc2UuICBPcHRpb25hbCBoZWFkZXIgc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaGVhZGVyIG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG5ld19jdHlwZSA9ICcnCisgICAgICAgIGZvciBwLCB2IGluIHNlbGYuZ2V0X3BhcmFtcyhoZWFkZXI9aGVhZGVyLCB1bnF1b3RlPXJlcXVvdGUpOgorICAgICAgICAgICAgaWYgcC5sb3dlcigpICE9IHBhcmFtLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IG5ld19jdHlwZToKKyAgICAgICAgICAgICAgICAgICAgbmV3X2N0eXBlID0gX2Zvcm1hdHBhcmFtKHAsIHYsIHJlcXVvdGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbmV3X2N0eXBlID0gU0VNSVNQQUNFLmpvaW4oW25ld19jdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9mb3JtYXRwYXJhbShwLCB2LCByZXF1b3RlKV0pCisgICAgICAgIGlmIG5ld19jdHlwZSAhPSBzZWxmLmdldChoZWFkZXIpOgorICAgICAgICAgICAgZGVsIHNlbGZbaGVhZGVyXQorICAgICAgICAgICAgc2VsZltoZWFkZXJdID0gbmV3X2N0eXBlCisKKyAgICBkZWYgc2V0X3R5cGUoc2VsZiwgdHlwZSwgaGVhZGVyPSdDb250ZW50LVR5cGUnLCByZXF1b3RlPVRydWUpOgorICAgICAgICAiIiJTZXQgdGhlIG1haW4gdHlwZSBhbmQgc3VidHlwZSBmb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIuCisKKyAgICAgICAgdHlwZSBtdXN0IGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtICJtYWludHlwZS9zdWJ0eXBlIiwgb3RoZXJ3aXNlIGEKKyAgICAgICAgVmFsdWVFcnJvciBpcyByYWlzZWQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgcmVwbGFjZXMgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIsIGtlZXBpbmcgYWxsIHRoZQorICAgICAgICBwYXJhbWV0ZXJzIGluIHBsYWNlLiAgSWYgcmVxdW90ZSBpcyBGYWxzZSwgdGhpcyBsZWF2ZXMgdGhlIGV4aXN0aW5nCisgICAgICAgIGhlYWRlcidzIHF1b3RpbmcgYXMgaXMuICBPdGhlcndpc2UsIHRoZSBwYXJhbWV0ZXJzIHdpbGwgYmUgcXVvdGVkICh0aGUKKyAgICAgICAgZGVmYXVsdCkuCisKKyAgICAgICAgQW4gYWx0ZXJuYXRpdmUgaGVhZGVyIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciBhcmd1bWVudC4gIFdoZW4KKyAgICAgICAgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgaXMgc2V0LCB3ZSdsbCBhbHdheXMgYWxzbyBhZGQgYSBNSU1FLVZlcnNpb24KKyAgICAgICAgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgIyBCQVc6IHNob3VsZCB3ZSBiZSBzdHJpY3Q/CisgICAgICAgIGlmIG5vdCB0eXBlLmNvdW50KCcvJykgPT0gMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgIyBTZXQgdGhlIENvbnRlbnQtVHlwZSwgeW91IGdldCBhIE1JTUUtVmVyc2lvbgorICAgICAgICBpZiBoZWFkZXIubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgIGRlbCBzZWxmWydtaW1lLXZlcnNpb24nXQorICAgICAgICAgICAgc2VsZlsnTUlNRS1WZXJzaW9uJ10gPSAnMS4wJworICAgICAgICBpZiBoZWFkZXIgbm90IGluIHNlbGY6CisgICAgICAgICAgICBzZWxmW2hlYWRlcl0gPSB0eXBlCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGFyYW1zID0gc2VsZi5nZXRfcGFyYW1zKGhlYWRlcj1oZWFkZXIsIHVucXVvdGU9cmVxdW90ZSkKKyAgICAgICAgZGVsIHNlbGZbaGVhZGVyXQorICAgICAgICBzZWxmW2hlYWRlcl0gPSB0eXBlCisgICAgICAgICMgU2tpcCB0aGUgZmlyc3QgcGFyYW07IGl0J3MgdGhlIG9sZCB0eXBlLgorICAgICAgICBmb3IgcCwgdiBpbiBwYXJhbXNbMTpdOgorICAgICAgICAgICAgc2VsZi5zZXRfcGFyYW0ocCwgdiwgaGVhZGVyLCByZXF1b3RlKQorCisgICAgZGVmIGdldF9maWxlbmFtZShzZWxmLCBmYWlsb2JqPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGVuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bG9hZCBpZiBwcmVzZW50LgorCisgICAgICAgIFRoZSBmaWxlbmFtZSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXIncworICAgICAgICBgZmlsZW5hbWUnIHBhcmFtZXRlciwgYW5kIGl0IGlzIHVucXVvdGVkLiAgSWYgdGhhdCBoZWFkZXIgaXMgbWlzc2luZworICAgICAgICB0aGUgYGZpbGVuYW1lJyBwYXJhbWV0ZXIsIHRoaXMgbWV0aG9kIGZhbGxzIGJhY2sgdG8gbG9va2luZyBmb3IgdGhlCisgICAgICAgIGBuYW1lJyBwYXJhbWV0ZXIuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9wYXJhbSgnZmlsZW5hbWUnLCBtaXNzaW5nLCAnY29udGVudC1kaXNwb3NpdGlvbicpCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIG1pc3Npbmc6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0X3BhcmFtKCduYW1lJywgbWlzc2luZywgJ2NvbnRlbnQtdHlwZScpCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIG1pc3Npbmc6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICByZXR1cm4gdXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShmaWxlbmFtZSkuc3RyaXAoKQorCisgICAgZGVmIGdldF9ib3VuZGFyeShzZWxmLCBmYWlsb2JqPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGJvdW5kYXJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bG9hZCBpZiBwcmVzZW50LgorCisgICAgICAgIFRoZSBib3VuZGFyeSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgQ29udGVudC1UeXBlIGhlYWRlcidzIGBib3VuZGFyeScKKyAgICAgICAgcGFyYW1ldGVyLCBhbmQgaXQgaXMgdW5xdW90ZWQuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgYm91bmRhcnkgPSBzZWxmLmdldF9wYXJhbSgnYm91bmRhcnknLCBtaXNzaW5nKQorICAgICAgICBpZiBib3VuZGFyeSBpcyBtaXNzaW5nOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKKyAgICAgICAgIyBSRkMgMjA0NiBzYXlzIHRoYXQgYm91bmRhcmllcyBtYXkgYmVnaW4gYnV0IG5vdCBlbmQgaW4gdy9zCisgICAgICAgIHJldHVybiB1dGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKGJvdW5kYXJ5KS5yc3RyaXAoKQorCisgICAgZGVmIHNldF9ib3VuZGFyeShzZWxmLCBib3VuZGFyeSk6CisgICAgICAgICIiIlNldCB0aGUgYm91bmRhcnkgcGFyYW1ldGVyIGluIENvbnRlbnQtVHlwZSB0byAnYm91bmRhcnknLgorCisgICAgICAgIFRoaXMgaXMgc3VidGx5IGRpZmZlcmVudCB0aGFuIGRlbGV0aW5nIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGFuZAorICAgICAgICBhZGRpbmcgYSBuZXcgb25lIHdpdGggYSBuZXcgYm91bmRhcnkgcGFyYW1ldGVyIHZpYSBhZGRfaGVhZGVyKCkuICBUaGUKKyAgICAgICAgbWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQgdXNpbmcgdGhlIHNldF9ib3VuZGFyeSgpIG1ldGhvZCBwcmVzZXJ2ZXMgdGhlCisgICAgICAgIG9yZGVyIG9mIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGluIHRoZSBvcmlnaW5hbCBtZXNzYWdlLgorCisgICAgICAgIEhlYWRlclBhcnNlRXJyb3IgaXMgcmFpc2VkIGlmIHRoZSBtZXNzYWdlIGhhcyBubyBDb250ZW50LVR5cGUgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIHBhcmFtcyA9IHNlbGYuX2dldF9wYXJhbXNfcHJlc2VydmUobWlzc2luZywgJ2NvbnRlbnQtdHlwZScpCisgICAgICAgIGlmIHBhcmFtcyBpcyBtaXNzaW5nOgorICAgICAgICAgICAgIyBUaGVyZSB3YXMgbm8gQ29udGVudC1UeXBlIGhlYWRlciwgYW5kIHdlIGRvbid0IGtub3cgd2hhdCB0eXBlCisgICAgICAgICAgICAjIHRvIHNldCBpdCB0bywgc28gcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgcmFpc2UgZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IoJ05vIENvbnRlbnQtVHlwZSBoZWFkZXIgZm91bmQnKQorICAgICAgICBuZXdwYXJhbXMgPSBbXQorICAgICAgICBmb3VuZHAgPSBGYWxzZQorICAgICAgICBmb3IgcGssIHB2IGluIHBhcmFtczoKKyAgICAgICAgICAgIGlmIHBrLmxvd2VyKCkgPT0gJ2JvdW5kYXJ5JzoKKyAgICAgICAgICAgICAgICBuZXdwYXJhbXMuYXBwZW5kKCgnYm91bmRhcnknLCAnIiVzIicgJSBib3VuZGFyeSkpCisgICAgICAgICAgICAgICAgZm91bmRwID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdwYXJhbXMuYXBwZW5kKChwaywgcHYpKQorICAgICAgICBpZiBub3QgZm91bmRwOgorICAgICAgICAgICAgIyBUaGUgb3JpZ2luYWwgQ29udGVudC1UeXBlIGhlYWRlciBoYWQgbm8gYm91bmRhcnkgYXR0cmlidXRlLgorICAgICAgICAgICAgIyBUYWNrIG9uZSBvbiB0aGUgZW5kLiAgQkFXOiBzaG91bGQgd2UgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAjIGluc3RlYWQ/Pz8KKyAgICAgICAgICAgIG5ld3BhcmFtcy5hcHBlbmQoKCdib3VuZGFyeScsICciJXMiJyAlIGJvdW5kYXJ5KSkKKyAgICAgICAgIyBSZXBsYWNlIHRoZSBleGlzdGluZyBDb250ZW50LVR5cGUgaGVhZGVyIHdpdGggdGhlIG5ldyB2YWx1ZQorICAgICAgICBuZXdoZWFkZXJzID0gW10KKyAgICAgICAgZm9yIGgsIHYgaW4gc2VsZi5faGVhZGVyczoKKyAgICAgICAgICAgIGlmIGgubG93ZXIoKSA9PSAnY29udGVudC10eXBlJzoKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gbmV3cGFyYW1zOgorICAgICAgICAgICAgICAgICAgICBpZiB2ID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKGspCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoJyVzPSVzJyAlIChrLCB2KSkKKyAgICAgICAgICAgICAgICBuZXdoZWFkZXJzLmFwcGVuZCgoaCwgU0VNSVNQQUNFLmpvaW4ocGFydHMpKSkKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdoZWFkZXJzLmFwcGVuZCgoaCwgdikpCisgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBuZXdoZWFkZXJzCisKKyAgICBkZWYgZ2V0X2NvbnRlbnRfY2hhcnNldChzZWxmLCBmYWlsb2JqPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNoYXJzZXQgcGFyYW1ldGVyIG9mIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLgorCisgICAgICAgIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgYWx3YXlzIGNvZXJjZWQgdG8gbG93ZXIgY2FzZS4gIElmIHRoZXJlIGlzIG5vCisgICAgICAgIENvbnRlbnQtVHlwZSBoZWFkZXIsIG9yIGlmIHRoYXQgaGVhZGVyIGhhcyBubyBjaGFyc2V0IHBhcmFtZXRlciwKKyAgICAgICAgZmFpbG9iaiBpcyByZXR1cm5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQorICAgICAgICBjaGFyc2V0ID0gc2VsZi5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBtaXNzaW5nKQorICAgICAgICBpZiBjaGFyc2V0IGlzIG1pc3Npbmc6CisgICAgICAgICAgICByZXR1cm4gZmFpbG9iagorICAgICAgICBpZiBpc2luc3RhbmNlKGNoYXJzZXQsIHR1cGxlKToKKyAgICAgICAgICAgICMgUkZDIDIyMzEgZW5jb2RlZCwgc28gZGVjb2RlIGl0LCBhbmQgaXQgYmV0dGVyIGVuZCB1cCBhcyBhc2NpaS4KKyAgICAgICAgICAgIHBjaGFyc2V0ID0gY2hhcnNldFswXSBvciAndXMtYXNjaWknCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBMb29rdXBFcnJvciB3aWxsIGJlIHJhaXNlZCBpZiB0aGUgY2hhcnNldCBpc24ndCBrbm93biB0bworICAgICAgICAgICAgICAgICMgUHl0aG9uLiAgVW5pY29kZUVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSBlbmNvZGVkIHRleHQKKyAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgY2hhcmFjdGVyIG5vdCBpbiB0aGUgY2hhcnNldC4KKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gdW5pY29kZShjaGFyc2V0WzJdLCBwY2hhcnNldCkuZW5jb2RlKCd1cy1hc2NpaScpCisgICAgICAgICAgICBleGNlcHQgKExvb2t1cEVycm9yLCBVbmljb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0WzJdCisgICAgICAgICMgY2hhcnNldCBjaGFyYWN0ZXIgbXVzdCBiZSBpbiB1cy1hc2NpaSByYW5nZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNoYXJzZXQsIHN0cik6CisgICAgICAgICAgICAgICAgY2hhcnNldCA9IHVuaWNvZGUoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0LmVuY29kZSgndXMtYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKKyAgICAgICAgIyBSRkMgMjA0NiwgJDQuMS4yIHNheXMgY2hhcnNldHMgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZQorICAgICAgICByZXR1cm4gY2hhcnNldC5sb3dlcigpCisKKyAgICBkZWYgZ2V0X2NoYXJzZXRzKHNlbGYsIGZhaWxvYmo9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3QgY29udGFpbmluZyB0aGUgY2hhcnNldChzKSB1c2VkIGluIHRoaXMgbWVzc2FnZS4KKworICAgICAgICBUaGUgcmV0dXJuZWQgbGlzdCBvZiBpdGVtcyBkZXNjcmliZXMgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJzJworICAgICAgICBjaGFyc2V0IHBhcmFtZXRlciBmb3IgdGhpcyBtZXNzYWdlIGFuZCBhbGwgdGhlIHN1YnBhcnRzIGluIGl0cworICAgICAgICBwYXlsb2FkLgorCisgICAgICAgIEVhY2ggaXRlbSB3aWxsIGVpdGhlciBiZSBhIHN0cmluZyAodGhlIHZhbHVlIG9mIHRoZSBjaGFyc2V0IHBhcmFtZXRlcgorICAgICAgICBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlciBvZiB0aGF0IHBhcnQpIG9yIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAgJ2ZhaWxvYmonIHBhcmFtZXRlciAoZGVmYXVsdHMgdG8gTm9uZSksIGlmIHRoZSBwYXJ0IGRvZXMgbm90IGhhdmUgYQorICAgICAgICBtYWluIE1JTUUgdHlwZSBvZiAidGV4dCIsIG9yIHRoZSBjaGFyc2V0IGlzIG5vdCBkZWZpbmVkLgorCisgICAgICAgIFRoZSBsaXN0IHdpbGwgY29udGFpbiBvbmUgc3RyaW5nIGZvciBlYWNoIHBhcnQgb2YgdGhlIG1lc3NhZ2UsIHBsdXMKKyAgICAgICAgb25lIGZvciB0aGUgY29udGFpbmVyIG1lc3NhZ2UgKGkuZS4gc2VsZiksIHNvIHRoYXQgYSBub24tbXVsdGlwYXJ0CisgICAgICAgIG1lc3NhZ2Ugd2lsbCBzdGlsbCByZXR1cm4gYSBsaXN0IG9mIGxlbmd0aCAxLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFtwYXJ0LmdldF9jb250ZW50X2NoYXJzZXQoZmFpbG9iaikgZm9yIHBhcnQgaW4gc2VsZi53YWxrKCldCisKKyAgICAjIEkuZS4gZGVmIHdhbGsoc2VsZik6IC4uLgorICAgIGZyb20gZW1haWwuaXRlcmF0b3JzIGltcG9ydCB3YWxrCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21lc3NhZ2UucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU3ODFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21lc3NhZ2UucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmU3ODFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9tZXNzYWdlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3MjRjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI3MjRjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YzU5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXBwbGljYXRpb24ucHkKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEtlaXRoIERhcnQKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGFwcGxpY2F0aW9uLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKKworX19hbGxfXyA9IFsiTUlNRUFwcGxpY2F0aW9uIl0KKworZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKKworCitjbGFzcyBNSU1FQXBwbGljYXRpb24oTUlNRU5vbk11bHRpcGFydCk6CisgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgYXBwbGljYXRpb24vKiBNSU1FIGRvY3VtZW50cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfZGF0YSwgX3N1YnR5cGU9J29jdGV0LXN0cmVhbScsCisgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CisgICAgICAgICIiIkNyZWF0ZSBhbiBhcHBsaWNhdGlvbi8qIHR5cGUgTUlNRSBkb2N1bWVudC4KKworICAgICAgICBfZGF0YSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgYXBwbGljYXRpb24gZGF0YS4KKworICAgICAgICBfc3VidHlwZSBpcyB0aGUgTUlNRSBjb250ZW50IHR5cGUgc3VidHlwZSwgZGVmYXVsdGluZyB0bworICAgICAgICAnb2N0ZXQtc3RyZWFtJy4KKworICAgICAgICBfZW5jb2RlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIGVuY29kaW5nIGZvcgorICAgICAgICB0cmFuc3BvcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGRhdGEsIGRlZmF1bHRpbmcgdG8gYmFzZTY0IGVuY29kaW5nLgorCisgICAgICAgIEFueSBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgY29uc3RydWN0b3IsIHdoaWNoIHR1cm5zIHRoZW0gaW50byBwYXJhbWV0ZXJzIG9uIHRoZSBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignSW52YWxpZCBhcHBsaWNhdGlvbiBNSU1FIHN1YnR5cGUnKQorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdhcHBsaWNhdGlvbicsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCisgICAgICAgIHNlbGYuc2V0X3BheWxvYWQoX2RhdGEpCisgICAgICAgIF9lbmNvZGVyKHNlbGYpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXBwbGljYXRpb24ucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBhYjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXBwbGljYXRpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDBhYjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2FwcGxpY2F0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyOTBjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hdWRpby5weQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQW50aG9ueSBCYXh0ZXIKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGF1ZGlvLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKKworX19hbGxfXyA9IFsnTUlNRUF1ZGlvJ10KKworaW1wb3J0IHNuZGhkcgorCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CisKKworDAorX3NuZGhkcl9NSU1FbWFwID0geydhdScgIDogJ2Jhc2ljJywKKyAgICAgICAgICAgICAgICAgICAnd2F2JyA6J3gtd2F2JywKKyAgICAgICAgICAgICAgICAgICAnYWlmZic6J3gtYWlmZicsCisgICAgICAgICAgICAgICAgICAgJ2FpZmMnOid4LWFpZmYnLAorICAgICAgICAgICAgICAgICAgIH0KKworIyBUaGVyZSBhcmUgb3RoZXJzIGluIHNuZGhkciB0aGF0IGRvbid0IGhhdmUgTUlNRSB0eXBlcy4gOigKKyMgQWRkaXRpb25hbCBvbmVzIHRvIGJlIGFkZGVkIHRvIHNuZGhkcj8gbWlkaSwgbXAzLCByZWFsYXVkaW8sIHdtYT8/CitkZWYgX3doYXRzbmQoZGF0YSk6CisgICAgIiIiVHJ5IHRvIGlkZW50aWZ5IGEgc291bmQgZmlsZSB0eXBlLgorCisgICAgc25kaGRyLndoYXQoKSBoYXMgYSBwcmV0dHkgY3J1ZGR5IGludGVyZmFjZSwgdW5mb3J0dW5hdGVseS4gIFRoaXMgaXMgd2h5CisgICAgd2UgcmUtZG8gaXQgaGVyZS4gIEl0IHdvdWxkIGJlIGVhc2llciB0byByZXZlcnNlIGVuZ2luZWVyIHRoZSBVbml4ICdmaWxlJworICAgIGNvbW1hbmQgYW5kIHVzZSB0aGUgc3RhbmRhcmQgJ21hZ2ljJyBmaWxlLCBhcyBzaGlwcGVkIHdpdGggYSBtb2Rlcm4gVW5peC4KKyAgICAiIiIKKyAgICBoZHIgPSBkYXRhWzo1MTJdCisgICAgZmFrZWZpbGUgPSBTdHJpbmdJTyhoZHIpCisgICAgZm9yIHRlc3RmbiBpbiBzbmRoZHIudGVzdHM6CisgICAgICAgIHJlcyA9IHRlc3RmbihoZHIsIGZha2VmaWxlKQorICAgICAgICBpZiByZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX3NuZGhkcl9NSU1FbWFwLmdldChyZXNbMF0pCisgICAgcmV0dXJuIE5vbmUKKworCisMCitjbGFzcyBNSU1FQXVkaW8oTUlNRU5vbk11bHRpcGFydCk6CisgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgYXVkaW8vKiBNSU1FIGRvY3VtZW50cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfYXVkaW9kYXRhLCBfc3VidHlwZT1Ob25lLAorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJDcmVhdGUgYW4gYXVkaW8vKiB0eXBlIE1JTUUgZG9jdW1lbnQuCisKKyAgICAgICAgX2F1ZGlvZGF0YSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgYXVkaW8gZGF0YS4gIElmIHRoaXMgZGF0YQorICAgICAgICBjYW4gYmUgZGVjb2RlZCBieSB0aGUgc3RhbmRhcmQgUHl0aG9uIGBzbmRoZHInIG1vZHVsZSwgdGhlbiB0aGUKKyAgICAgICAgc3VidHlwZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgaW4gdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIuCisgICAgICAgIE90aGVyd2lzZSwgeW91IGNhbiBzcGVjaWZ5ICB0aGUgc3BlY2lmaWMgYXVkaW8gc3VidHlwZSB2aWEgdGhlCisgICAgICAgIF9zdWJ0eXBlIHBhcmFtZXRlci4gIElmIF9zdWJ0eXBlIGlzIG5vdCBnaXZlbiwgYW5kIG5vIHN1YnR5cGUgY2FuIGJlCisgICAgICAgIGd1ZXNzZWQsIGEgVHlwZUVycm9yIGlzIHJhaXNlZC4KKworICAgICAgICBfZW5jb2RlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIGVuY29kaW5nIGZvcgorICAgICAgICB0cmFuc3BvcnQgb2YgdGhlIGltYWdlIGRhdGEuICBJdCB0YWtlcyBvbmUgYXJndW1lbnQsIHdoaWNoIGlzIHRoaXMKKyAgICAgICAgSW1hZ2UgaW5zdGFuY2UuICBJdCBzaG91bGQgdXNlIGdldF9wYXlsb2FkKCkgYW5kIHNldF9wYXlsb2FkKCkgdG8KKyAgICAgICAgY2hhbmdlIHRoZSBwYXlsb2FkIHRvIHRoZSBlbmNvZGVkIGZvcm0uICBJdCBzaG91bGQgYWxzbyBhZGQgYW55CisgICAgICAgIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmcgb3Igb3RoZXIgaGVhZGVycyB0byB0aGUgbWVzc2FnZSBhcworICAgICAgICBuZWNlc3NhcnkuICBUaGUgZGVmYXVsdCBlbmNvZGluZyBpcyBCYXNlNjQuCisKKyAgICAgICAgQW55IGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGUgYmFzZSBjbGFzcworICAgICAgICBjb25zdHJ1Y3Rvciwgd2hpY2ggdHVybnMgdGhlbSBpbnRvIHBhcmFtZXRlcnMgb24gdGhlIENvbnRlbnQtVHlwZQorICAgICAgICBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICBpZiBfc3VidHlwZSBpcyBOb25lOgorICAgICAgICAgICAgX3N1YnR5cGUgPSBfd2hhdHNuZChfYXVkaW9kYXRhKQorICAgICAgICBpZiBfc3VidHlwZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDb3VsZCBub3QgZmluZCBhdWRpbyBNSU1FIHN1YnR5cGUnKQorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdhdWRpbycsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCisgICAgICAgIHNlbGYuc2V0X3BheWxvYWQoX2F1ZGlvZGF0YSkKKyAgICAgICAgX2VuY29kZXIoc2VsZikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hdWRpby5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9hdWRpby5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzZhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYXVkaW8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9iYXNlLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2Jhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5MTkyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9iYXNlLnB5CkBAIC0wLDAgKzEsMjYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBzcGVjaWFsaXphdGlvbnMuIiIiCisKK19fYWxsX18gPSBbJ01JTUVCYXNlJ10KKworZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZQorCisKKwwKK2NsYXNzIE1JTUVCYXNlKG1lc3NhZ2UuTWVzc2FnZSk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBzcGVjaWFsaXphdGlvbnMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX21haW50eXBlLCBfc3VidHlwZSwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiVGhpcyBjb25zdHJ1Y3RvciBhZGRzIGEgQ29udGVudC1UeXBlOiBhbmQgYSBNSU1FLVZlcnNpb246IGhlYWRlci4KKworICAgICAgICBUaGUgQ29udGVudC1UeXBlOiBoZWFkZXIgaXMgdGFrZW4gZnJvbSB0aGUgX21haW50eXBlIGFuZCBfc3VidHlwZQorICAgICAgICBhcmd1bWVudHMuICBBZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoaXMgaGVhZGVyIGFyZSB0YWtlbiBmcm9tIHRoZQorICAgICAgICBrZXl3b3JkIGFyZ3VtZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIG1lc3NhZ2UuTWVzc2FnZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBjdHlwZSA9ICclcy8lcycgJSAoX21haW50eXBlLCBfc3VidHlwZSkKKyAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCBjdHlwZSwgKipfcGFyYW1zKQorICAgICAgICBzZWxmWydNSU1FLVZlcnNpb24nXSA9ICcxLjAnCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YzA1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9iYXNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvYmFzZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY3YzA1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9iYXNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvaW1hZ2UucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvaW1hZ2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2MzgyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9pbWFnZS5weQpAQCAtMCwwICsxLDQ2IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogQmFycnkgV2Fyc2F3CisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIkNsYXNzIHJlcHJlc2VudGluZyBpbWFnZS8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCisKK19fYWxsX18gPSBbJ01JTUVJbWFnZSddCisKK2ltcG9ydCBpbWdoZHIKKworZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKKworCisMCitjbGFzcyBNSU1FSW1hZ2UoTUlNRU5vbk11bHRpcGFydCk6CisgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgaW1hZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9pbWFnZWRhdGEsIF9zdWJ0eXBlPU5vbmUsCisgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CisgICAgICAgICIiIkNyZWF0ZSBhbiBpbWFnZS8qIHR5cGUgTUlNRSBkb2N1bWVudC4KKworICAgICAgICBfaW1hZ2VkYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJhdyBpbWFnZSBkYXRhLiAgSWYgdGhpcyBkYXRhCisgICAgICAgIGNhbiBiZSBkZWNvZGVkIGJ5IHRoZSBzdGFuZGFyZCBQeXRob24gYGltZ2hkcicgbW9kdWxlLCB0aGVuIHRoZQorICAgICAgICBzdWJ0eXBlIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCBpbiB0aGUgQ29udGVudC1UeXBlIGhlYWRlci4KKyAgICAgICAgT3RoZXJ3aXNlLCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNwZWNpZmljIGltYWdlIHN1YnR5cGUgdmlhIHRoZSBfc3VidHlwZQorICAgICAgICBwYXJhbWV0ZXIuCisKKyAgICAgICAgX2VuY29kZXIgaXMgYSBmdW5jdGlvbiB3aGljaCB3aWxsIHBlcmZvcm0gdGhlIGFjdHVhbCBlbmNvZGluZyBmb3IKKyAgICAgICAgdHJhbnNwb3J0IG9mIHRoZSBpbWFnZSBkYXRhLiAgSXQgdGFrZXMgb25lIGFyZ3VtZW50LCB3aGljaCBpcyB0aGlzCisgICAgICAgIEltYWdlIGluc3RhbmNlLiAgSXQgc2hvdWxkIHVzZSBnZXRfcGF5bG9hZCgpIGFuZCBzZXRfcGF5bG9hZCgpIHRvCisgICAgICAgIGNoYW5nZSB0aGUgcGF5bG9hZCB0byB0aGUgZW5jb2RlZCBmb3JtLiAgSXQgc2hvdWxkIGFsc28gYWRkIGFueQorICAgICAgICBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIG9yIG90aGVyIGhlYWRlcnMgdG8gdGhlIG1lc3NhZ2UgYXMKKyAgICAgICAgbmVjZXNzYXJ5LiAgVGhlIGRlZmF1bHQgZW5jb2RpbmcgaXMgQmFzZTY0LgorCisgICAgICAgIEFueSBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgY29uc3RydWN0b3IsIHdoaWNoIHR1cm5zIHRoZW0gaW50byBwYXJhbWV0ZXJzIG9uIHRoZSBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIF9zdWJ0eXBlID0gaW1naGRyLndoYXQoTm9uZSwgX2ltYWdlZGF0YSkKKyAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ291bGQgbm90IGd1ZXNzIGltYWdlIE1JTUUgc3VidHlwZScpCisgICAgICAgIE1JTUVOb25NdWx0aXBhcnQuX19pbml0X18oc2VsZiwgJ2ltYWdlJywgX3N1YnR5cGUsICoqX3BhcmFtcykKKyAgICAgICAgc2VsZi5zZXRfcGF5bG9hZChfaW1hZ2VkYXRhKQorICAgICAgICBfZW5jb2RlcihzZWxmKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2ltYWdlLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9pbWFnZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3YTUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9pbWFnZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL2ltYWdlLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9pbWFnZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3YTUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9pbWFnZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbWVzc2FnZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzVkYmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHkKQEAgLTAsMCArMSwzNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJDbGFzcyByZXByZXNlbnRpbmcgbWVzc2FnZS8qIE1JTUUgZG9jdW1lbnRzLiIiIgorCitfX2FsbF9fID0gWydNSU1FTWVzc2FnZSddCisKK2Zyb20gZW1haWwgaW1wb3J0IG1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKKworCisMCitjbGFzcyBNSU1FTWVzc2FnZShNSU1FTm9uTXVsdGlwYXJ0KToKKyAgICAiIiJDbGFzcyByZXByZXNlbnRpbmcgbWVzc2FnZS8qIE1JTUUgZG9jdW1lbnRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9tc2csIF9zdWJ0eXBlPSdyZmM4MjInKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbWVzc2FnZS8qIHR5cGUgTUlNRSBkb2N1bWVudC4KKworICAgICAgICBfbXNnIGlzIGEgbWVzc2FnZSBvYmplY3QgYW5kIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZSwgb3IgYQorICAgICAgICBkZXJpdmVkIGNsYXNzIG9mIE1lc3NhZ2UsIG90aGVyd2lzZSBhIFR5cGVFcnJvciBpcyByYWlzZWQuCisKKyAgICAgICAgT3B0aW9uYWwgX3N1YnR5cGUgZGVmaW5lcyB0aGUgc3VidHlwZSBvZiB0aGUgY29udGFpbmVkIG1lc3NhZ2UuICBUaGUKKyAgICAgICAgZGVmYXVsdCBpcyAicmZjODIyIiAodGhpcyBpcyBkZWZpbmVkIGJ5IHRoZSBNSU1FIHN0YW5kYXJkLCBldmVuIHRob3VnaAorICAgICAgICB0aGUgdGVybSAicmZjODIyIiBpcyB0ZWNobmljYWxseSBvdXRkYXRlZCBieSBSRkMgMjgyMikuCisgICAgICAgICIiIgorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdtZXNzYWdlJywgX3N1YnR5cGUpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKF9tc2csIG1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlJykKKyAgICAgICAgIyBJdCdzIGNvbnZlbmllbnQgdG8gdXNlIHRoaXMgYmFzZSBjbGFzcyBtZXRob2QuICBXZSBuZWVkIHRvIGRvIGl0CisgICAgICAgICMgdGhpcyB3YXkgb3Igd2UnbGwgZ2V0IGFuIGV4Y2VwdGlvbgorICAgICAgICBtZXNzYWdlLk1lc3NhZ2UuYXR0YWNoKHNlbGYsIF9tc2cpCisgICAgICAgICMgQW5kIGJlIHN1cmUgb3VyIGRlZmF1bHQgdHlwZSBpcyBzZXQgY29ycmVjdGx5CisgICAgICAgIHNlbGYuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHljIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWM2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbWVzc2FnZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHlvIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL21lc3NhZ2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZWM2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbWVzc2FnZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL211bHRpcGFydC5weSBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tdWx0aXBhcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2MTg2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9tdWx0aXBhcnQucHkKQEAgLTAsMCArMSw0NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJCYXNlIGNsYXNzIGZvciBNSU1FIG11bHRpcGFydC8qIHR5cGUgbWVzc2FnZXMuIiIiCisKK19fYWxsX18gPSBbJ01JTUVNdWx0aXBhcnQnXQorCitmcm9tIGVtYWlsLm1pbWUuYmFzZSBpbXBvcnQgTUlNRUJhc2UKKworCisMCitjbGFzcyBNSU1FTXVsdGlwYXJ0KE1JTUVCYXNlKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIG11bHRpcGFydC8qIHR5cGUgbWVzc2FnZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgX3N1YnR5cGU9J21peGVkJywgYm91bmRhcnk9Tm9uZSwgX3N1YnBhcnRzPU5vbmUsCisgICAgICAgICAgICAgICAgICoqX3BhcmFtcyk6CisgICAgICAgICIiIkNyZWF0ZXMgYSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2UuCisKKyAgICAgICAgQnkgZGVmYXVsdCwgY3JlYXRlcyBhIG11bHRpcGFydC9taXhlZCBtZXNzYWdlLCB3aXRoIHByb3BlcgorICAgICAgICBDb250ZW50LVR5cGUgYW5kIE1JTUUtVmVyc2lvbiBoZWFkZXJzLgorCisgICAgICAgIF9zdWJ0eXBlIGlzIHRoZSBzdWJ0eXBlIG9mIHRoZSBtdWx0aXBhcnQgY29udGVudCB0eXBlLCBkZWZhdWx0aW5nIHRvCisgICAgICAgIGBtaXhlZCcuCisKKyAgICAgICAgYm91bmRhcnkgaXMgdGhlIG11bHRpcGFydCBib3VuZGFyeSBzdHJpbmcuICBCeSBkZWZhdWx0IGl0IGlzCisgICAgICAgIGNhbGN1bGF0ZWQgYXMgbmVlZGVkLgorCisgICAgICAgIF9zdWJwYXJ0cyBpcyBhIHNlcXVlbmNlIG9mIGluaXRpYWwgc3VicGFydHMgZm9yIHRoZSBwYXlsb2FkLiAgSXQKKyAgICAgICAgbXVzdCBiZSBhbiBpdGVyYWJsZSBvYmplY3QsIHN1Y2ggYXMgYSBsaXN0LiAgWW91IGNhbiBhbHdheXMKKyAgICAgICAgYXR0YWNoIG5ldyBzdWJwYXJ0cyB0byB0aGUgbWVzc2FnZSBieSB1c2luZyB0aGUgYXR0YWNoKCkgbWV0aG9kLgorCisgICAgICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgYXJlIHRha2VuIGZyb20gdGhlCisgICAgICAgIGtleXdvcmQgYXJndW1lbnRzIChvciBwYXNzZWQgaW50byB0aGUgX3BhcmFtcyBhcmd1bWVudCkuCisgICAgICAgICIiIgorICAgICAgICBNSU1FQmFzZS5fX2luaXRfXyhzZWxmLCAnbXVsdGlwYXJ0JywgX3N1YnR5cGUsICoqX3BhcmFtcykKKworICAgICAgICAjIEluaXRpYWxpc2UgX3BheWxvYWQgdG8gYW4gZW1wdHkgbGlzdCBhcyB0aGUgTWVzc2FnZSBzdXBlcmNsYXNzJ3MKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBvZiBpc19tdWx0aXBhcnQgYXNzdW1lcyB0aGF0IF9wYXlsb2FkIGlzIGEgbGlzdCBmb3IKKyAgICAgICAgIyBtdWx0aXBhcnQgbWVzc2FnZXMuCisgICAgICAgIHNlbGYuX3BheWxvYWQgPSBbXQorCisgICAgICAgIGlmIF9zdWJwYXJ0czoKKyAgICAgICAgICAgIGZvciBwIGluIF9zdWJwYXJ0czoKKyAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaChwKQorICAgICAgICBpZiBib3VuZGFyeToKKyAgICAgICAgICAgIHNlbGYuc2V0X2JvdW5kYXJ5KGJvdW5kYXJ5KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL211bHRpcGFydC5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJjZTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL211bHRpcGFydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL211bHRpcGFydC5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjJjZTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL211bHRpcGFydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weSBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMzYjllYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJCYXNlIGNsYXNzIGZvciBNSU1FIHR5cGUgbWVzc2FnZXMgdGhhdCBhcmUgbm90IG11bHRpcGFydC4iIiIKKworX19hbGxfXyA9IFsnTUlNRU5vbk11bHRpcGFydCddCisKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycworZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCisKKworDAorY2xhc3MgTUlNRU5vbk11bHRpcGFydChNSU1FQmFzZSk6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2VzLiIiIgorCisgICAgZGVmIGF0dGFjaChzZWxmLCBwYXlsb2FkKToKKyAgICAgICAgIyBUaGUgcHVibGljIEFQSSBwcm9oaWJpdHMgYXR0YWNoaW5nIG11bHRpcGxlIHN1YnBhcnRzIHRvIE1JTUVCYXNlCisgICAgICAgICMgZGVyaXZlZCBzdWJ0eXBlcyBzaW5jZSBub25lIG9mIHRoZW0gYXJlLCBieSBkZWZpbml0aW9uLCBvZiBjb250ZW50CisgICAgICAgICMgdHlwZSBtdWx0aXBhcnQvKgorICAgICAgICByYWlzZSBlcnJvcnMuTXVsdGlwYXJ0Q29udmVyc2lvbkVycm9yKAorICAgICAgICAgICAgJ0Nhbm5vdCBhdHRhY2ggYWRkaXRpb25hbCBzdWJwYXJ0cyB0byBub24tbXVsdGlwYXJ0LyonKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzZiODk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvbm9ubXVsdGlwYXJ0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzZiODk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL3RleHQucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL21pbWUvdGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ3ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL3RleHQucHkKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJDbGFzcyByZXByZXNlbnRpbmcgdGV4dC8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCisKK19fYWxsX18gPSBbJ01JTUVUZXh0J10KKworZnJvbSBlbWFpbC5lbmNvZGVycyBpbXBvcnQgZW5jb2RlXzdvcjhiaXQKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKKworCisMCitjbGFzcyBNSU1FVGV4dChNSU1FTm9uTXVsdGlwYXJ0KToKKyAgICAiIiJDbGFzcyBmb3IgZ2VuZXJhdGluZyB0ZXh0LyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfdGV4dCwgX3N1YnR5cGU9J3BsYWluJywgX2NoYXJzZXQ9J3VzLWFzY2lpJyk6CisgICAgICAgICIiIkNyZWF0ZSBhIHRleHQvKiB0eXBlIE1JTUUgZG9jdW1lbnQuCisKKyAgICAgICAgX3RleHQgaXMgdGhlIHN0cmluZyBmb3IgdGhpcyBtZXNzYWdlIG9iamVjdC4KKworICAgICAgICBfc3VidHlwZSBpcyB0aGUgTUlNRSBzdWIgY29udGVudCB0eXBlLCBkZWZhdWx0aW5nIHRvICJwbGFpbiIuCisKKyAgICAgICAgX2NoYXJzZXQgaXMgdGhlIGNoYXJhY3RlciBzZXQgcGFyYW1ldGVyIGFkZGVkIHRvIHRoZSBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLiAgVGhpcyBkZWZhdWx0cyB0byAidXMtYXNjaWkiLiAgTm90ZSB0aGF0IGFzIGEgc2lkZS1lZmZlY3QsIHRoZQorICAgICAgICBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlciB3aWxsIGFsc28gYmUgc2V0LgorICAgICAgICAiIiIKKyAgICAgICAgTUlNRU5vbk11bHRpcGFydC5fX2luaXRfXyhzZWxmLCAndGV4dCcsIF9zdWJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqeydjaGFyc2V0JzogX2NoYXJzZXR9KQorICAgICAgICBzZWxmLnNldF9wYXlsb2FkKF90ZXh0LCBfY2hhcnNldCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTcyMzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL3RleHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvbWltZS90ZXh0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTcyMzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC9taW1lL3RleHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvcGFyc2VyLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC9wYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjYWYyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvcGFyc2VyLnB5CkBAIC0wLDAgKzEsOTEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQXV0aG9yOiBCYXJyeSBXYXJzYXcsIFRob21hcyBXb3V0ZXJzLCBBbnRob255IEJheHRlcgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJBIHBhcnNlciBvZiBSRkMgMjgyMiBhbmQgTUlNRSBlbWFpbCBtZXNzYWdlcy4iIiIKKworX19hbGxfXyA9IFsnUGFyc2VyJywgJ0hlYWRlclBhcnNlciddCisKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gZW1haWwuZmVlZHBhcnNlciBpbXBvcnQgRmVlZFBhcnNlcgorZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCisKKworDAorY2xhc3MgUGFyc2VyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd3MpOgorICAgICAgICAiIiJQYXJzZXIgb2YgUkZDIDI4MjIgYW5kIE1JTUUgZW1haWwgbWVzc2FnZXMuCisKKyAgICAgICAgQ3JlYXRlcyBhbiBpbi1tZW1vcnkgb2JqZWN0IHRyZWUgcmVwcmVzZW50aW5nIHRoZSBlbWFpbCBtZXNzYWdlLCB3aGljaAorICAgICAgICBjYW4gdGhlbiBiZSBtYW5pcHVsYXRlZCBhbmQgdHVybmVkIG92ZXIgdG8gYSBHZW5lcmF0b3IgdG8gcmV0dXJuIHRoZQorICAgICAgICB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLgorCisgICAgICAgIFRoZSBzdHJpbmcgbXVzdCBiZSBmb3JtYXR0ZWQgYXMgYSBibG9jayBvZiBSRkMgMjgyMiBoZWFkZXJzIGFuZCBoZWFkZXIKKyAgICAgICAgY29udGludWF0aW9uIGxpbmVzLCBvcHRpb25hbGx5IHByZWNlZWRlZCBieSBhIGBVbml4LWZyb20nIGhlYWRlci4gIFRoZQorICAgICAgICBoZWFkZXIgYmxvY2sgaXMgdGVybWluYXRlZCBlaXRoZXIgYnkgdGhlIGVuZCBvZiB0aGUgc3RyaW5nIG9yIGJ5IGEKKyAgICAgICAgYmxhbmsgbGluZS4KKworICAgICAgICBfY2xhc3MgaXMgdGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlIGZvciBuZXcgbWVzc2FnZSBvYmplY3RzIHdoZW4gdGhleQorICAgICAgICBtdXN0IGJlIGNyZWF0ZWQuICBUaGlzIGNsYXNzIG11c3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHRoYXQgY2FuIHRha2UKKyAgICAgICAgemVybyBhcmd1bWVudHMuICBEZWZhdWx0IGlzIE1lc3NhZ2UuTWVzc2FnZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihhcmdzKSA+PSAxOgorICAgICAgICAgICAgaWYgJ19jbGFzcycgaW4ga3dzOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTXVsdGlwbGUgdmFsdWVzIGZvciBrZXl3b3JkIGFyZyAnX2NsYXNzJyIpCisgICAgICAgICAgICBrd3NbJ19jbGFzcyddID0gYXJnc1swXQorICAgICAgICBpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIGlmICdzdHJpY3QnIGluIGt3czoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmcgJ3N0cmljdCciKQorICAgICAgICAgICAga3dzWydzdHJpY3QnXSA9IGFyZ3NbMV0KKyAgICAgICAgaWYgbGVuKGFyZ3MpID4gMjoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVG9vIG1hbnkgYXJndW1lbnRzJykKKyAgICAgICAgaWYgJ19jbGFzcycgaW4ga3dzOgorICAgICAgICAgICAgc2VsZi5fY2xhc3MgPSBrd3NbJ19jbGFzcyddCisgICAgICAgICAgICBkZWwga3dzWydfY2xhc3MnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY2xhc3MgPSBNZXNzYWdlCisgICAgICAgIGlmICdzdHJpY3QnIGluIGt3czoKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIidzdHJpY3QnIGFyZ3VtZW50IGlzIGRlcHJlY2F0ZWQgKGFuZCBpZ25vcmVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICAgICAgICAgIGRlbCBrd3NbJ3N0cmljdCddCisgICAgICAgIGlmIGt3czoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignVW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50cycpCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgZnAsIGhlYWRlcnNvbmx5PUZhbHNlKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbWVzc2FnZSBzdHJ1Y3R1cmUgZnJvbSB0aGUgZGF0YSBpbiBhIGZpbGUuCisKKyAgICAgICAgUmVhZHMgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUgYW5kIHJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIG1lc3NhZ2UKKyAgICAgICAgc3RydWN0dXJlLiAgT3B0aW9uYWwgaGVhZGVyc29ubHkgaXMgYSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0byBzdG9wCisgICAgICAgIHBhcnNpbmcgYWZ0ZXIgcmVhZGluZyB0aGUgaGVhZGVycyBvciBub3QuICBUaGUgZGVmYXVsdCBpcyBGYWxzZSwKKyAgICAgICAgbWVhbmluZyBpdCBwYXJzZXMgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGZlZWRwYXJzZXIgPSBGZWVkUGFyc2VyKHNlbGYuX2NsYXNzKQorICAgICAgICBpZiBoZWFkZXJzb25seToKKyAgICAgICAgICAgIGZlZWRwYXJzZXIuX3NldF9oZWFkZXJzb25seSgpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCg4MTkyKQorICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGZlZWRwYXJzZXIuZmVlZChkYXRhKQorICAgICAgICByZXR1cm4gZmVlZHBhcnNlci5jbG9zZSgpCisKKyAgICBkZWYgcGFyc2VzdHIoc2VsZiwgdGV4dCwgaGVhZGVyc29ubHk9RmFsc2UpOgorICAgICAgICAiIiJDcmVhdGUgYSBtZXNzYWdlIHN0cnVjdHVyZSBmcm9tIGEgc3RyaW5nLgorCisgICAgICAgIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIG1lc3NhZ2Ugc3RydWN0dXJlLiAgT3B0aW9uYWwgaGVhZGVyc29ubHkgaXMgYQorICAgICAgICBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB0byBzdG9wIHBhcnNpbmcgYWZ0ZXIgcmVhZGluZyB0aGUgaGVhZGVycyBvcgorICAgICAgICBub3QuICBUaGUgZGVmYXVsdCBpcyBGYWxzZSwgbWVhbmluZyBpdCBwYXJzZXMgdGhlIGVudGlyZSBjb250ZW50cyBvZgorICAgICAgICB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlKFN0cmluZ0lPKHRleHQpLCBoZWFkZXJzb25seT1oZWFkZXJzb25seSkKKworCisMCitjbGFzcyBIZWFkZXJQYXJzZXIoUGFyc2VyKToKKyAgICBkZWYgcGFyc2Uoc2VsZiwgZnAsIGhlYWRlcnNvbmx5PVRydWUpOgorICAgICAgICByZXR1cm4gUGFyc2VyLnBhcnNlKHNlbGYsIGZwLCBUcnVlKQorCisgICAgZGVmIHBhcnNlc3RyKHNlbGYsIHRleHQsIGhlYWRlcnNvbmx5PVRydWUpOgorICAgICAgICByZXR1cm4gUGFyc2VyLnBhcnNlc3RyKHNlbGYsIHRleHQsIFRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiMDYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvcGFyc2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3BhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiMDYwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvcGFyc2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3F1b3ByaW1pbWUucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL3F1b3ByaW1pbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxOGE5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvcXVvcHJpbWltZS5weQpAQCAtMCwwICsxLDMzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisKKyIiIlF1b3RlZC1wcmludGFibGUgY29udGVudCB0cmFuc2ZlciBlbmNvZGluZyBwZXIgUkZDcyAyMDQ1LTIwNDcuCisKK1RoaXMgbW9kdWxlIGhhbmRsZXMgdGhlIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcgbWV0aG9kIGRlZmluZWQgaW4gUkZDIDIwNDUKK3RvIGVuY29kZSBVUyBBU0NJSS1saWtlIDgtYml0IGRhdGEgY2FsbGVkIGBxdW90ZWQtcHJpbnRhYmxlJy4gIEl0IGlzIHVzZWQgdG8KK3NhZmVseSBlbmNvZGUgdGV4dCB0aGF0IGlzIGluIGEgY2hhcmFjdGVyIHNldCBzaW1pbGFyIHRvIHRoZSA3LWJpdCBVUyBBU0NJSQorY2hhcmFjdGVyIHNldCwgYnV0IHRoYXQgaW5jbHVkZXMgc29tZSA4LWJpdCBjaGFyYWN0ZXJzIHRoYXQgYXJlIG5vcm1hbGx5IG5vdAorYWxsb3dlZCBpbiBlbWFpbCBib2RpZXMgb3IgaGVhZGVycy4KKworUXVvdGVkLXByaW50YWJsZSBpcyB2ZXJ5IHNwYWNlLWluZWZmaWNpZW50IGZvciBlbmNvZGluZyBiaW5hcnkgZmlsZXM7IHVzZSB0aGUKK2VtYWlsLmJhc2U2NG1pbWUgbW9kdWxlIGZvciB0aGF0IGluc3RlYWQuCisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBlbmNvZGUgYW5kIGRlY29kZSBib3RoIGhlYWRlcnMgYW5kIGJvZGllcword2l0aCBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nLgorCitSRkMgMjA0NSBkZWZpbmVzIGEgbWV0aG9kIGZvciBpbmNsdWRpbmcgY2hhcmFjdGVyIHNldCBpbmZvcm1hdGlvbiBpbiBhbgorYGVuY29kZWQtd29yZCcgaW4gYSBoZWFkZXIuICBUaGlzIG1ldGhvZCBpcyBjb21tb25seSB1c2VkIGZvciA4LWJpdCByZWFsIG5hbWVzCitpbiBUbzovRnJvbTovQ2M6IGV0Yy4gZmllbGRzLCBhcyB3ZWxsIGFzIFN1YmplY3Q6IGxpbmVzLgorCitUaGlzIG1vZHVsZSBkb2VzIG5vdCBkbyB0aGUgbGluZSB3cmFwcGluZyBvciBlbmQtb2YtbGluZSBjaGFyYWN0ZXIKK2NvbnZlcnNpb24gbmVjZXNzYXJ5IGZvciBwcm9wZXIgaW50ZXJuYXRpb25hbGl6ZWQgaGVhZGVyczsgaXQgb25seQorZG9lcyBkdW1iIGVuY29kaW5nIGFuZCBkZWNvZGluZy4gIFRvIGRlYWwgd2l0aCB0aGUgdmFyaW91cyBsaW5lCit3cmFwcGluZyBpc3N1ZXMsIHVzZSB0aGUgZW1haWwuaGVhZGVyIG1vZHVsZS4KKyIiIgorCitfX2FsbF9fID0gWworICAgICdib2R5X2RlY29kZScsCisgICAgJ2JvZHlfZW5jb2RlJywKKyAgICAnYm9keV9xdW9wcmlfY2hlY2snLAorICAgICdib2R5X3F1b3ByaV9sZW4nLAorICAgICdkZWNvZGUnLAorICAgICdkZWNvZGVzdHJpbmcnLAorICAgICdlbmNvZGUnLAorICAgICdlbmNvZGVzdHJpbmcnLAorICAgICdoZWFkZXJfZGVjb2RlJywKKyAgICAnaGVhZGVyX2VuY29kZScsCisgICAgJ2hlYWRlcl9xdW9wcmlfY2hlY2snLAorICAgICdoZWFkZXJfcXVvcHJpX2xlbicsCisgICAgJ3F1b3RlJywKKyAgICAndW5xdW90ZScsCisgICAgXQorCitpbXBvcnQgcmUKKworZnJvbSBzdHJpbmcgaW1wb3J0IGhleGRpZ2l0cworZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgZml4X2VvbHMKKworQ1JMRiA9ICdcclxuJworTkwgPSAnXG4nCisKKyMgU2VlIGFsc28gQ2hhcnNldC5weQorTUlTQ19MRU4gPSA3CisKK2hxcmUgPSByZS5jb21waWxlKHInW14tYS16QS1aMC05ISorLyBdJykKK2JxcmUgPSByZS5jb21waWxlKHInW14gIS08Pi1+XHRdJykKKworCisMCisjIEhlbHBlcnMKK2RlZiBoZWFkZXJfcXVvcHJpX2NoZWNrKGMpOgorICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIGVzY2FwZWQgd2l0aCBoZWFkZXIgcXVvcHJpLiIiIgorICAgIHJldHVybiBib29sKGhxcmUubWF0Y2goYykpCisKKworZGVmIGJvZHlfcXVvcHJpX2NoZWNrKGMpOgorICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIGVzY2FwZWQgd2l0aCBib2R5IHF1b3ByaS4iIiIKKyAgICByZXR1cm4gYm9vbChicXJlLm1hdGNoKGMpKQorCisKK2RlZiBoZWFkZXJfcXVvcHJpX2xlbihzKToKKyAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiBzdHIgd2hlbiBpdCBpcyBlbmNvZGVkIHdpdGggaGVhZGVyIHF1b3ByaS4iIiIKKyAgICBjb3VudCA9IDAKKyAgICBmb3IgYyBpbiBzOgorICAgICAgICBpZiBocXJlLm1hdGNoKGMpOgorICAgICAgICAgICAgY291bnQgKz0gMworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY291bnQgKz0gMQorICAgIHJldHVybiBjb3VudAorCisKK2RlZiBib2R5X3F1b3ByaV9sZW4oc3RyKToKKyAgICAiIiJSZXR1cm4gdGhlIGxlbmd0aCBvZiBzdHIgd2hlbiBpdCBpcyBlbmNvZGVkIHdpdGggYm9keSBxdW9wcmkuIiIiCisgICAgY291bnQgPSAwCisgICAgZm9yIGMgaW4gc3RyOgorICAgICAgICBpZiBicXJlLm1hdGNoKGMpOgorICAgICAgICAgICAgY291bnQgKz0gMworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY291bnQgKz0gMQorICAgIHJldHVybiBjb3VudAorCisKK2RlZiBfbWF4X2FwcGVuZChMLCBzLCBtYXhsZW4sIGV4dHJhPScnKToKKyAgICBpZiBub3QgTDoKKyAgICAgICAgTC5hcHBlbmQocy5sc3RyaXAoKSkKKyAgICBlbGlmIGxlbihMWy0xXSkgKyBsZW4ocykgPD0gbWF4bGVuOgorICAgICAgICBMWy0xXSArPSBleHRyYSArIHMKKyAgICBlbHNlOgorICAgICAgICBMLmFwcGVuZChzLmxzdHJpcCgpKQorCisKK2RlZiB1bnF1b3RlKHMpOgorICAgICIiIlR1cm4gYSBzdHJpbmcgaW4gdGhlIGZvcm0gPUFCIHRvIHRoZSBBU0NJSSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSAweGFiIiIiCisgICAgcmV0dXJuIGNocihpbnQoc1sxOjNdLCAxNikpCisKKworZGVmIHF1b3RlKGMpOgorICAgIHJldHVybiAiPSUwMlgiICUgb3JkKGMpCisKKworDAorZGVmIGhlYWRlcl9lbmNvZGUoaGVhZGVyLCBjaGFyc2V0PSJpc28tODg1OS0xIiwga2VlcF9lb2xzPUZhbHNlLAorICAgICAgICAgICAgICAgICAgbWF4bGluZWxlbj03NiwgZW9sPU5MKToKKyAgICAiIiJFbmNvZGUgYSBzaW5nbGUgaGVhZGVyIGxpbmUgd2l0aCBxdW90ZWQtcHJpbnRhYmxlIChsaWtlKSBlbmNvZGluZy4KKworICAgIERlZmluZWQgaW4gUkZDIDIwNDUsIHRoaXMgYFEnIGVuY29kaW5nIGlzIHNpbWlsYXIgdG8gcXVvdGVkLXByaW50YWJsZSwgYnV0CisgICAgdXNlZCBzcGVjaWZpY2FsbHkgZm9yIGVtYWlsIGhlYWRlciBmaWVsZHMgdG8gYWxsb3cgY2hhcnNldHMgd2l0aCBtb3N0bHkgNworICAgIGJpdCBjaGFyYWN0ZXJzIChhbmQgc29tZSA4IGJpdCkgdG8gcmVtYWluIG1vcmUgb3IgbGVzcyByZWFkYWJsZSBpbiBub24tUkZDCisgICAgMjA0NSBhd2FyZSBtYWlsIGNsaWVudHMuCisKKyAgICBjaGFyc2V0IG5hbWVzIHRoZSBjaGFyYWN0ZXIgc2V0IHRvIHVzZSB0byBlbmNvZGUgdGhlIGhlYWRlci4gIEl0IGRlZmF1bHRzCisgICAgdG8gaXNvLTg4NTktMS4KKworICAgIFRoZSByZXN1bHRpbmcgc3RyaW5nIHdpbGwgYmUgaW4gdGhlIGZvcm06CisKKyAgICAiPT9jaGFyc2V0P3E/SV9mPUUycnRfaW5feW91cl9nPUU4bj1FOHJhbF9kaXJlPUU3dGlvbj9cXG4KKyAgICAgID0/Y2hhcnNldD9xP1NpbGx5Xz1DOG5nbGlzaF9Lbj1FRWdodHM/PSIKKworICAgIHdpdGggZWFjaCBsaW5lIHdyYXBwZWQgc2FmZWx5IGF0LCBhdCBtb3N0LCBtYXhsaW5lbGVuIGNoYXJhY3RlcnMgKGRlZmF1bHRzCisgICAgdG8gNzYgY2hhcmFjdGVycykuICBJZiBtYXhsaW5lbGVuIGlzIE5vbmUsIHRoZSBlbnRpcmUgc3RyaW5nIGlzIGVuY29kZWQgaW4KKyAgICBvbmUgY2h1bmsgd2l0aCBubyBzcGxpdHRpbmcuCisKKyAgICBFbmQtb2YtbGluZSBjaGFyYWN0ZXJzIChcXHIsIFxcbiwgXFxyXFxuKSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY29udmVydGVkCisgICAgdG8gdGhlIGNhbm9uaWNhbCBlbWFpbCBsaW5lIHNlcGFyYXRvciBcXHJcXG4gdW5sZXNzIHRoZSBrZWVwX2VvbHMKKyAgICBwYXJhbWV0ZXIgaXMgVHJ1ZSAodGhlIGRlZmF1bHQgaXMgRmFsc2UpLgorCisgICAgRWFjaCBsaW5lIG9mIHRoZSBoZWFkZXIgd2lsbCBiZSB0ZXJtaW5hdGVkIGluIHRoZSB2YWx1ZSBvZiBlb2wsIHdoaWNoCisgICAgZGVmYXVsdHMgdG8gIlxcbiIuICBTZXQgdGhpcyB0byAiXFxyXFxuIiBpZiB5b3UgYXJlIHVzaW5nIHRoZSByZXN1bHQgb2YKKyAgICB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5IGluIGVtYWlsLgorICAgICIiIgorICAgICMgUmV0dXJuIGVtcHR5IGhlYWRlcnMgdW5jaGFuZ2VkCisgICAgaWYgbm90IGhlYWRlcjoKKyAgICAgICAgcmV0dXJuIGhlYWRlcgorCisgICAgaWYgbm90IGtlZXBfZW9sczoKKyAgICAgICAgaGVhZGVyID0gZml4X2VvbHMoaGVhZGVyKQorCisgICAgIyBRdW9wcmkgZW5jb2RlIGVhY2ggbGluZSwgaW4gZW5jb2RlZCBjaHVua3Mgbm8gZ3JlYXRlciB0aGFuIG1heGxpbmVsZW4gaW4KKyAgICAjIGxlbmd0aCwgYWZ0ZXIgdGhlIFJGQyBjaHJvbWUgaXMgYWRkZWQgaW4uCisgICAgcXVvdGVkID0gW10KKyAgICBpZiBtYXhsaW5lbGVuIGlzIE5vbmU6CisgICAgICAgICMgQW4gb2Jub3hpb3VzbHkgbGFyZ2UgbnVtYmVyIHRoYXQncyBnb29kIGVub3VnaAorICAgICAgICBtYXhfZW5jb2RlZCA9IDEwMDAwMAorICAgIGVsc2U6CisgICAgICAgIG1heF9lbmNvZGVkID0gbWF4bGluZWxlbiAtIGxlbihjaGFyc2V0KSAtIE1JU0NfTEVOIC0gMQorCisgICAgZm9yIGMgaW4gaGVhZGVyOgorICAgICAgICAjIFNwYWNlIG1heSBiZSByZXByZXNlbnRlZCBhcyBfIGluc3RlYWQgb2YgPTIwIGZvciByZWFkYWJpbGl0eQorICAgICAgICBpZiBjID09ICcgJzoKKyAgICAgICAgICAgIF9tYXhfYXBwZW5kKHF1b3RlZCwgJ18nLCBtYXhfZW5jb2RlZCkKKyAgICAgICAgIyBUaGVzZSBjaGFyYWN0ZXJzIGNhbiBiZSBpbmNsdWRlZCB2ZXJiYXRpbQorICAgICAgICBlbGlmIG5vdCBocXJlLm1hdGNoKGMpOgorICAgICAgICAgICAgX21heF9hcHBlbmQocXVvdGVkLCBjLCBtYXhfZW5jb2RlZCkKKyAgICAgICAgIyBPdGhlcndpc2UsIHJlcGxhY2Ugd2l0aCBoZXggdmFsdWUgbGlrZSA9RTIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIF9tYXhfYXBwZW5kKHF1b3RlZCwgIj0lMDJYIiAlIG9yZChjKSwgbWF4X2VuY29kZWQpCisKKyAgICAjIE5vdyBhZGQgdGhlIFJGQyBjaHJvbWUgdG8gZWFjaCBlbmNvZGVkIGNodW5rIGFuZCBnbHVlIHRoZSBjaHVua3MKKyAgICAjIHRvZ2V0aGVyLiAgQkFXOiBzaG91bGQgd2UgYmUgYWJsZSB0byBzcGVjaWZ5IHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UgaW4KKyAgICAjIHRoZSBqb2luZXI/CisgICAgam9pbmVyID0gZW9sICsgJyAnCisgICAgcmV0dXJuIGpvaW5lci5qb2luKFsnPT8lcz9xPyVzPz0nICUgKGNoYXJzZXQsIGxpbmUpIGZvciBsaW5lIGluIHF1b3RlZF0pCisKKworDAorZGVmIGVuY29kZShib2R5LCBiaW5hcnk9RmFsc2UsIG1heGxpbmVsZW49NzYsIGVvbD1OTCk6CisgICAgIiIiRW5jb2RlIHdpdGggcXVvdGVkLXByaW50YWJsZSwgd3JhcHBpbmcgYXQgbWF4bGluZWxlbiBjaGFyYWN0ZXJzLgorCisgICAgSWYgYmluYXJ5IGlzIEZhbHNlICh0aGUgZGVmYXVsdCksIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMgd2lsbCBiZSBjb252ZXJ0ZWQKKyAgICB0byB0aGUgY2Fub25pY2FsIGVtYWlsIGVuZC1vZi1saW5lIHNlcXVlbmNlIFxcclxcbi4gIE90aGVyd2lzZSB0aGV5IHdpbGwKKyAgICBiZSBsZWZ0IHZlcmJhdGltLgorCisgICAgRWFjaCBsaW5lIG9mIGVuY29kZWQgdGV4dCB3aWxsIGVuZCB3aXRoIGVvbCwgd2hpY2ggZGVmYXVsdHMgdG8gIlxcbiIuICBTZXQKKyAgICB0aGlzIHRvICJcXHJcXG4iIGlmIHlvdSB3aWxsIGJlIHVzaW5nIHRoZSByZXN1bHQgb2YgdGhpcyBmdW5jdGlvbiBkaXJlY3RseQorICAgIGluIGFuIGVtYWlsLgorCisgICAgRWFjaCBsaW5lIHdpbGwgYmUgd3JhcHBlZCBhdCwgYXQgbW9zdCwgbWF4bGluZWxlbiBjaGFyYWN0ZXJzIChkZWZhdWx0cyB0bworICAgIDc2IGNoYXJhY3RlcnMpLiAgTG9uZyBsaW5lcyB3aWxsIGhhdmUgdGhlIGBzb2Z0IGxpbmVmZWVkJyBxdW90ZWQtcHJpbnRhYmxlCisgICAgY2hhcmFjdGVyICI9IiBhcHBlbmRlZCB0byB0aGVtLCBzbyB0aGUgZGVjb2RlZCB0ZXh0IHdpbGwgYmUgaWRlbnRpY2FsIHRvCisgICAgdGhlIG9yaWdpbmFsIHRleHQuCisgICAgIiIiCisgICAgaWYgbm90IGJvZHk6CisgICAgICAgIHJldHVybiBib2R5CisKKyAgICBpZiBub3QgYmluYXJ5OgorICAgICAgICBib2R5ID0gZml4X2VvbHMoYm9keSkKKworICAgICMgQkFXOiBXZSdyZSBhY2N1bXVsYXRpbmcgdGhlIGJvZHkgdGV4dCBieSBzdHJpbmcgY29uY2F0ZW5hdGlvbi4gIFRoYXQKKyAgICAjIGNhbid0IGJlIHZlcnkgZWZmaWNpZW50LCBidXQgSSBkb24ndCBoYXZlIHRpbWUgbm93IHRvIHJld3JpdGUgaXQuICBJdAorICAgICMganVzdCBmZWVscyBsaWtlIHRoaXMgYWxnb3JpdGhtIGNvdWxkIGJlIG1vcmUgZWZmaWNpZW50LgorICAgIGVuY29kZWRfYm9keSA9ICcnCisgICAgbGluZW5vID0gLTEKKyAgICAjIFByZXNlcnZlIGxpbmUgZW5kaW5ncyBoZXJlIHNvIHdlIGNhbiBjaGVjayBsYXRlciB0byBzZWUgYW4gZW9sIG5lZWRzIHRvCisgICAgIyBiZSBhZGRlZCB0byB0aGUgb3V0cHV0IGxhdGVyLgorICAgIGxpbmVzID0gYm9keS5zcGxpdGxpbmVzKDEpCisgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICMgQnV0IHN0cmlwIG9mZiBsaW5lLWVuZGluZ3MgZm9yIHByb2Nlc3NpbmcgdGhpcyBsaW5lLgorICAgICAgICBpZiBsaW5lLmVuZHN3aXRoKENSTEYpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXQorICAgICAgICBlbGlmIGxpbmVbLTFdIGluIENSTEY6CisgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisKKyAgICAgICAgbGluZW5vICs9IDEKKyAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICAgICAgcHJldiA9IE5vbmUKKyAgICAgICAgbGluZWxlbiA9IGxlbihsaW5lKQorICAgICAgICAjIE5vdyB3ZSBuZWVkIHRvIGV4YW1pbmUgZXZlcnkgY2hhcmFjdGVyIHRvIHNlZSBpZiBpdCBuZWVkcyB0byBiZQorICAgICAgICAjIHF1b3ByaSBlbmNvZGVkLiAgQkFXOiBhZ2Fpbiwgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgaW5lZmZpY2llbnQuCisgICAgICAgIGZvciBqIGluIHJhbmdlKGxpbmVsZW4pOgorICAgICAgICAgICAgYyA9IGxpbmVbal0KKyAgICAgICAgICAgIHByZXYgPSBjCisgICAgICAgICAgICBpZiBicXJlLm1hdGNoKGMpOgorICAgICAgICAgICAgICAgIGMgPSBxdW90ZShjKQorICAgICAgICAgICAgZWxpZiBqKzEgPT0gbGluZWxlbjoKKyAgICAgICAgICAgICAgICAjIENoZWNrIGZvciB3aGl0ZXNwYWNlIGF0IGVuZCBvZiBsaW5lOyBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgICAgICBpZiBjIG5vdCBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZF9saW5lICs9IGMKKyAgICAgICAgICAgICAgICBwcmV2ID0gYworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSB0byBzZWUgaWYgdGhlIGxpbmUgaGFzIHJlYWNoZWQgaXRzIG1heGltdW0gbGVuZ3RoCisgICAgICAgICAgICBpZiBsZW4oZW5jb2RlZF9saW5lKSArIGxlbihjKSA+PSBtYXhsaW5lbGVuOgorICAgICAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUgKyAnPScgKyBlb2wKKyAgICAgICAgICAgICAgICBlbmNvZGVkX2xpbmUgPSAnJworICAgICAgICAgICAgZW5jb2RlZF9saW5lICs9IGMKKyAgICAgICAgIyBOb3cgYXQgZW5kIG9mIGxpbmUuLgorICAgICAgICBpZiBwcmV2IGFuZCBwcmV2IGluICcgXHQnOgorICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIHdoaXRlc3BhY2UgYXQgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgIGlmIGxpbmVubyArIDEgPT0gbGVuKGxpbmVzKToKKyAgICAgICAgICAgICAgICBwcmV2ID0gcXVvdGUocHJldikKKyAgICAgICAgICAgICAgICBpZiBsZW4oZW5jb2RlZF9saW5lKSArIGxlbihwcmV2KSA+IG1heGxpbmVsZW46CisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfYm9keSArPSBlbmNvZGVkX2xpbmUgKyAnPScgKyBlb2wgKyBwcmV2CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZF9ib2R5ICs9IGVuY29kZWRfbGluZSArIHByZXYKKyAgICAgICAgICAgICMgSnVzdCBub3JtYWwgd2hpdGVzcGFjZSBhdCBlbmQgb2YgbGluZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbmNvZGVkX2JvZHkgKz0gZW5jb2RlZF9saW5lICsgcHJldiArICc9JyArIGVvbAorICAgICAgICAgICAgZW5jb2RlZF9saW5lID0gJycKKyAgICAgICAgIyBOb3cgbG9vayBhdCB0aGUgbGluZSB3ZSBqdXN0IGZpbmlzaGVkIGFuZCBpdCBoYXMgYSBsaW5lIGVuZGluZywgd2UKKyAgICAgICAgIyBuZWVkIHRvIGFkZCBlb2wgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKyAgICAgICAgaWYgbGluZXNbbGluZW5vXS5lbmRzd2l0aChDUkxGKSBvciBsaW5lc1tsaW5lbm9dWy0xXSBpbiBDUkxGOgorICAgICAgICAgICAgZW5jb2RlZF9ib2R5ICs9IGVuY29kZWRfbGluZSArIGVvbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5jb2RlZF9ib2R5ICs9IGVuY29kZWRfbGluZQorICAgICAgICBlbmNvZGVkX2xpbmUgPSAnJworICAgIHJldHVybiBlbmNvZGVkX2JvZHkKKworCisjIEZvciBjb252ZW5pZW5jZSBhbmQgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgdy8gc3RhbmRhcmQgYmFzZTY0IG1vZHVsZQorYm9keV9lbmNvZGUgPSBlbmNvZGUKK2VuY29kZXN0cmluZyA9IGVuY29kZQorCisKKwwKKyMgQkFXOiBJJ20gbm90IHN1cmUgaWYgdGhlIGludGVudCB3YXMgZm9yIHRoZSBzaWduYXR1cmUgb2YgdGhpcyBmdW5jdGlvbiB0byBiZQorIyB0aGUgc2FtZSBhcyBiYXNlNjRNSU1FLmRlY29kZSgpIG9yIG5vdC4uLgorZGVmIGRlY29kZShlbmNvZGVkLCBlb2w9TkwpOgorICAgICIiIkRlY29kZSBhIHF1b3RlZC1wcmludGFibGUgc3RyaW5nLgorCisgICAgTGluZXMgYXJlIHNlcGFyYXRlZCB3aXRoIGVvbCwgd2hpY2ggZGVmYXVsdHMgdG8gXFxuLgorICAgICIiIgorICAgIGlmIG5vdCBlbmNvZGVkOgorICAgICAgICByZXR1cm4gZW5jb2RlZAorICAgICMgQkFXOiBzZWUgY29tbWVudCBpbiBlbmNvZGUoKSBhYm92ZS4gIEFnYWluLCB3ZSdyZSBidWlsZGluZyB1cCB0aGUKKyAgICAjIGRlY29kZWQgc3RyaW5nIHdpdGggc3RyaW5nIGNvbmNhdGVuYXRpb24sIHdoaWNoIGNvdWxkIGJlIGRvbmUgbXVjaCBtb3JlCisgICAgIyBlZmZpY2llbnRseS4KKyAgICBkZWNvZGVkID0gJycKKworICAgIGZvciBsaW5lIGluIGVuY29kZWQuc3BsaXRsaW5lcygpOgorICAgICAgICBsaW5lID0gbGluZS5yc3RyaXAoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGRlY29kZWQgKz0gZW9sCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGkgPSAwCisgICAgICAgIG4gPSBsZW4obGluZSkKKyAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICBjID0gbGluZVtpXQorICAgICAgICAgICAgaWYgYyAhPSAnPSc6CisgICAgICAgICAgICAgICAgZGVjb2RlZCArPSBjCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAjIE90aGVyd2lzZSwgYyA9PSAiPSIuICBBcmUgd2UgYXQgdGhlIGVuZCBvZiB0aGUgbGluZT8gIElmIHNvLCBhZGQKKyAgICAgICAgICAgICMgYSBzb2Z0IGxpbmUgYnJlYWsuCisgICAgICAgICAgICBlbGlmIGkrMSA9PSBuOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIERlY29kZSBpZiBpbiBmb3JtID1BQgorICAgICAgICAgICAgZWxpZiBpKzIgPCBuIGFuZCBsaW5lW2krMV0gaW4gaGV4ZGlnaXRzIGFuZCBsaW5lW2krMl0gaW4gaGV4ZGlnaXRzOgorICAgICAgICAgICAgICAgIGRlY29kZWQgKz0gdW5xdW90ZShsaW5lW2k6aSszXSkKKyAgICAgICAgICAgICAgICBpICs9IDMKKyAgICAgICAgICAgICMgT3RoZXJ3aXNlLCBub3QgaW4gZm9ybSA9QUIsIHBhc3MgbGl0ZXJhbGx5CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlY29kZWQgKz0gYworICAgICAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgICAgICBpZiBpID09IG46CisgICAgICAgICAgICAgICAgZGVjb2RlZCArPSBlb2wKKyAgICAjIFNwZWNpYWwgY2FzZSBpZiBvcmlnaW5hbCBzdHJpbmcgZGlkIG5vdCBlbmQgd2l0aCBlb2wKKyAgICBpZiBub3QgZW5jb2RlZC5lbmRzd2l0aChlb2wpIGFuZCBkZWNvZGVkLmVuZHN3aXRoKGVvbCk6CisgICAgICAgIGRlY29kZWQgPSBkZWNvZGVkWzotMV0KKyAgICByZXR1cm4gZGVjb2RlZAorCisKKyMgRm9yIGNvbnZlbmllbmNlIGFuZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3LyBzdGFuZGFyZCBiYXNlNjQgbW9kdWxlCitib2R5X2RlY29kZSA9IGRlY29kZQorZGVjb2Rlc3RyaW5nID0gZGVjb2RlCisKKworDAorZGVmIF91bnF1b3RlX21hdGNoKG1hdGNoKToKKyAgICAiIiJUdXJuIGEgbWF0Y2ggaW4gdGhlIGZvcm0gPUFCIHRvIHRoZSBBU0NJSSBjaGFyYWN0ZXIgd2l0aCB2YWx1ZSAweGFiIiIiCisgICAgcyA9IG1hdGNoLmdyb3VwKDApCisgICAgcmV0dXJuIHVucXVvdGUocykKKworCisjIEhlYWRlciBkZWNvZGluZyBpcyBkb25lIGEgYml0IGRpZmZlcmVudGx5CitkZWYgaGVhZGVyX2RlY29kZShzKToKKyAgICAiIiJEZWNvZGUgYSBzdHJpbmcgZW5jb2RlZCB3aXRoIFJGQyAyMDQ1IE1JTUUgaGVhZGVyIGBRJyBlbmNvZGluZy4KKworICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGFyc2UgYSBmdWxsIE1JTUUgaGVhZGVyIHZhbHVlIGVuY29kZWQgd2l0aAorICAgIHF1b3RlZC1wcmludGFibGUgKGxpa2UgPT9pc28tODg5NS0xP3E/SGVsbG9fV29ybGQ/PSkgLS0gcGxlYXNlIHVzZQorICAgIHRoZSBoaWdoIGxldmVsIGVtYWlsLmhlYWRlciBjbGFzcyBmb3IgdGhhdCBmdW5jdGlvbmFsaXR5LgorICAgICIiIgorICAgIHMgPSBzLnJlcGxhY2UoJ18nLCAnICcpCisgICAgcmV0dXJuIHJlLnN1YihyJz1bYS1mQS1GMC05XXsyfScsIF91bnF1b3RlX21hdGNoLCBzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9xdW9wcmltaW1lLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvcXVvcHJpbWltZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5MDNiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvcXVvcHJpbWltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC9xdW9wcmltaW1lLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvcXVvcHJpbWltZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5MDNiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvcXVvcHJpbWltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjE4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNjE4ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL1B5QmFubmVyMDQ4LmdpZiBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL1B5QmFubmVyMDQ4LmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTVjODdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvUHlCYW5uZXIwNDguZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL2F1ZGlvdGVzdC5hdSBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL2F1ZGlvdGVzdC5hdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZiMDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvYXVkaW90ZXN0LmF1CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wMS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzNiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDEudHh0CkBAIC0wLDAgKzEsMTkgQEAKK1JldHVybi1QYXRoOiA8YmJiQHp6ei5vcmc+CitEZWxpdmVyZWQtVG86IGJiYkB6enoub3JnCitSZWNlaXZlZDogYnkgbWFpbC56enoub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCisJaWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDIudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzAyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2YyNDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzAyLnR4dApAQCAtMCwwICsxLDEzNSBAQAorTUlNRS12ZXJzaW9uOiAxLjAKK0Zyb206IHBwcC1yZXF1ZXN0QHp6ei5vcmcKK1NlbmRlcjogcHBwLWFkbWluQHp6ei5vcmcKK1RvOiBwcHBAenp6Lm9yZworU3ViamVjdDogUHBwIGRpZ2VzdCwgVm9sIDEgIzIgLSA1IG1zZ3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMjA6MTg6MDAgLTA0MDAgKEVEVCkKK1gtTWFpbGVyOiBNYWlsbWFuIHYyLjAuNAorWC1NYWlsbWFuLVZlcnNpb246IDIuMC40CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IjE5Mi4xNjguMS4yLjg4OS4zMjYxNC45ODc4MTIyNTUuNTAwLjIxODE0IgorCistLTE5Mi4xNjguMS4yLjg4OS4zMjYxNC45ODc4MTIyNTUuNTAwLjIxODE0CitDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtZGVzY3JpcHRpb246IE1hc3RoZWFkIChQcHAgZGlnZXN0LCBWb2wgMSAjMikKKworU2VuZCBQcHAgbWFpbGluZyBsaXN0IHN1Ym1pc3Npb25zIHRvCisJcHBwQHp6ei5vcmcKKworVG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHZpYSB0aGUgV29ybGQgV2lkZSBXZWIsIHZpc2l0CisJaHR0cDovL3d3dy56enoub3JnL21haWxtYW4vbGlzdGluZm8vcHBwCitvciwgdmlhIGVtYWlsLCBzZW5kIGEgbWVzc2FnZSB3aXRoIHN1YmplY3Qgb3IgYm9keSAnaGVscCcgdG8KKwlwcHAtcmVxdWVzdEB6enoub3JnCisKK1lvdSBjYW4gcmVhY2ggdGhlIHBlcnNvbiBtYW5hZ2luZyB0aGUgbGlzdCBhdAorCXBwcC1hZG1pbkB6enoub3JnCisKK1doZW4gcmVwbHlpbmcsIHBsZWFzZSBlZGl0IHlvdXIgU3ViamVjdCBsaW5lIHNvIGl0IGlzIG1vcmUgc3BlY2lmaWMKK3RoYW4gIlJlOiBDb250ZW50cyBvZiBQcHAgZGlnZXN0Li4uIgorCisKKy0tMTkyLjE2OC4xLjIuODg5LjMyNjE0Ljk4NzgxMjI1NS41MDAuMjE4MTQKK0NvbnRlbnQtdHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1kZXNjcmlwdGlvbjogVG9kYXkncyBUb3BpY3MgKDUgbXNncykKKworVG9kYXkncyBUb3BpY3M6CisKKyAgIDEuIHRlc3RpbmcgIzEgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDIuIHRlc3RpbmcgIzIgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDMuIHRlc3RpbmcgIzMgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDQuIHRlc3RpbmcgIzQgKEJhcnJ5IEEuIFdhcnNhdykKKyAgIDUuIHRlc3RpbmcgIzUgKEJhcnJ5IEEuIFdhcnNhdykKKworLS0xOTIuMTY4LjEuMi44ODkuMzI2MTQuOTg3ODEyMjU1LjUwMC4yMTgxNAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iX18tLV9fLS0iCisKKy0tX18tLV9fLS0KKworTWVzc2FnZTogMQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDIwOjE2OjEzIC0wNDAwCitUbzogcHBwQHp6ei5vcmcKK0Zyb206IGJhcnJ5QGRpZ2ljb29sLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorU3ViamVjdDogW1BwcF0gdGVzdGluZyAjMQorUHJlY2VkZW5jZTogYnVsaworCisKK2hlbGxvCisKKworLS1fXy0tX18tLQorCitNZXNzYWdlOiAyCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDIwOjE2OjIxIC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1RvOiBwcHBAenp6Lm9yZworRnJvbTogYmFycnlAZGlnaWNvb2wuY29tIChCYXJyeSBBLiBXYXJzYXcpCitQcmVjZWRlbmNlOiBidWxrCisKKworaGVsbG8KKworCistLV9fLS1fXy0tCisKK01lc3NhZ2U6IDMKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMjA6MTY6MjUgLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorVG86IHBwcEB6enoub3JnCitGcm9tOiBiYXJyeUBkaWdpY29vbC5jb20gKEJhcnJ5IEEuIFdhcnNhdykKK1N1YmplY3Q6IFtQcHBdIHRlc3RpbmcgIzMKK1ByZWNlZGVuY2U6IGJ1bGsKKworCitoZWxsbworCisKKy0tX18tLV9fLS0KKworTWVzc2FnZTogNAorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAyMDoxNjoyOCAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitUbzogcHBwQHp6ei5vcmcKK0Zyb206IGJhcnJ5QGRpZ2ljb29sLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorU3ViamVjdDogW1BwcF0gdGVzdGluZyAjNAorUHJlY2VkZW5jZTogYnVsaworCisKK2hlbGxvCisKKworLS1fXy0tX18tLQorCitNZXNzYWdlOiA1CitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDIwOjE2OjMyIC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1RvOiBwcHBAenp6Lm9yZworRnJvbTogYmFycnlAZGlnaWNvb2wuY29tIChCYXJyeSBBLiBXYXJzYXcpCitTdWJqZWN0OiBbUHBwXSB0ZXN0aW5nICM1CitQcmVjZWRlbmNlOiBidWxrCisKKworaGVsbG8KKworCisKKworLS1fXy0tX18tLS0tCistLTE5Mi4xNjguMS4yLjg4OS4zMjYxNC45ODc4MTIyNTUuNTAwLjIxODE0CitDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtZGVzY3JpcHRpb246IERpZ2VzdCBGb290ZXIKKworX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KK1BwcCBtYWlsaW5nIGxpc3QKK1BwcEB6enoub3JnCitodHRwOi8vd3d3Lnp6ei5vcmcvbWFpbG1hbi9saXN0aW5mby9wcHAKKworCistLTE5Mi4xNjguMS4yLjg4OS4zMjYxNC45ODc4MTIyNTUuNTAwLjIxODE0LS0KKworRW5kIG9mIFBwcCBEaWdlc3QKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzAzLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0OGViZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wMy50eHQKQEAgLTAsMCArMSwxNiBAQAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNjMzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDQudHh0CkBAIC0wLDAgKzEsMzcgQEAKK1JldHVybi1QYXRoOiA8YmFycnlAcHl0aG9uLm9yZz4KK0RlbGl2ZXJlZC1UbzogYmFycnlAcHl0aG9uLm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwucHl0aG9uLm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIEMyQkYwRDM3QzY7IFR1ZSwgMTEgU2VwIDIwMDEgMDA6MDU6MDUgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Img5MFZJSUlLbXgiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUyNjEuMzYyMDkuMzU4ODQ2LjExODY3NEBhbnRoZW0ucHl0aG9uLm9yZz4KK0Zyb206IGJhcnJ5QHB5dGhvbi5vcmcgKEJhcnJ5IEEuIFdhcnNhdykKK1RvOiBiYXJyeUBweXRob24ub3JnCitTdWJqZWN0OiBhIHNpbXBsZSBtdWx0aXBhcnQKK0RhdGU6IFR1ZSwgMTEgU2VwIDIwMDEgMDA6MDU6MDUgLTA0MDAKK1gtTWFpbGVyOiBWTSA2Ljk1IHVuZGVyIDIxLjQgKHBhdGNoIDQpICJBcnRpZmljaWFsIEludGVsbGlnZW5jZSIgWEVtYWNzIEx1Y2lkCitYLUF0dHJpYnV0aW9uOiBCQVcKK1gtT2JsaXF1ZS1TdHJhdGVneTogTWFrZSBhIGRvb3IgaW50byBhIHdpbmRvdworCisKKy0taDkwVklJSUtteAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CisJZmlsZW5hbWU9Im1zZy50eHQiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorCistLWg5MFZJSUlLbXgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworCWZpbGVuYW1lPSJtc2cudHh0IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKworLS1oOTBWSUlJS214LS0KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA1LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkNWU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNS50eHQKQEAgLTAsMCArMSwyOCBAQAorRnJvbTogZm9vCitTdWJqZWN0OiBiYXIKK1RvOiBiYXoKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9yZXBvcnQ7IHJlcG9ydC10eXBlPWRlbGl2ZXJ5LXN0YXR1czsKKwlib3VuZGFyeT0iRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbSIKK01lc3NhZ2UtSWQ6IDwyMDAxMDgwMzE2MjgxMC4wQ0E4QUE3QUNDQG1haWwuZXhhbXBsZS5jb20+CisKK1RoaXMgaXMgYSBNSU1FLWVuY2Fwc3VsYXRlZCBtZXNzYWdlLgorCistLUQxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCitZYWRkYSB5YWRkYSB5YWRkYQorCistLUQxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20KKworWWFkZGEgeWFkZGEgeWFkZGEKKworLS1EMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCisKK0Zyb206IG5vYm9keUBweXRob24ub3JnCisKK1lhZGRhIHlhZGRhIHlhZGRhCisKKy0tRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbS0tCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNi50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjNhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDYudHh0CkBAIC0wLDAgKzEsMzMgQEAKK1JldHVybi1QYXRoOiA8YmFycnlAcHl0aG9uLm9yZz4KK0RlbGl2ZXJlZC1UbzogYmFycnlAcHl0aG9uLm9yZworTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK0NvbnRlbnQtRGVzY3JpcHRpb246IGZvcndhcmRlZCBtZXNzYWdlCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUyNjUuOTQ4Mi42NDEzMzguNTU1MzUyQHB5dGhvbi5vcmc+CitGcm9tOiBiYXJyeUB6b3BlLmNvbSAoQmFycnkgQS4gV2Fyc2F3KQorU2VuZGVyOiBiYXJyeUBweXRob24ub3JnCitUbzogYmFycnlAcHl0aG9uLm9yZworU3ViamVjdDogZm9yd2FyZGVkIG1lc3NhZ2UgZnJvbSBCYXJyeSBBLiBXYXJzYXcKK0RhdGU6IFRodSwgMTMgU2VwIDIwMDEgMTc6Mjg6NDIgLTA0MDAKK1gtTWFpbGVyOiBWTSA2Ljk1IHVuZGVyIDIxLjQgKHBhdGNoIDQpICJBcnRpZmljaWFsIEludGVsbGlnZW5jZSIgWEVtYWNzIEx1Y2lkCitYLUF0dHJpYnV0aW9uOiBCQVcKK1gtT2JsaXF1ZS1TdHJhdGVneTogQmUgZGlydHkKK1gtVXJsOiBodHRwOi8vYmFycnkud29vei5vcmcKKworTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorUmV0dXJuLVBhdGg6IDxiYXJyeUBweXRob24ub3JnPgorRGVsaXZlcmVkLVRvOiBiYXJyeUBweXRob24ub3JnCitNZXNzYWdlLUlEOiA8MTUyNjUuOTQ2OC43MTM1MzAuOTg0NDFAcHl0aG9uLm9yZz4KK0Zyb206IGJhcnJ5QHpvcGUuY29tIChCYXJyeSBBLiBXYXJzYXcpCitTZW5kZXI6IGJhcnJ5QHB5dGhvbi5vcmcKK1RvOiBiYXJyeUBweXRob24ub3JnCitTdWJqZWN0OiB0ZXN0aW5nCitEYXRlOiBUaHUsIDEzIFNlcCAyMDAxIDE3OjI4OjI4IC0wNDAwCitYLU1haWxlcjogVk0gNi45NSB1bmRlciAyMS40IChwYXRjaCA0KSAiQXJ0aWZpY2lhbCBJbnRlbGxpZ2VuY2UiIFhFbWFjcyBMdWNpZAorWC1BdHRyaWJ1dGlvbjogQkFXCitYLU9ibGlxdWUtU3RyYXRlZ3k6IFNwZWN0cnVtIGFuYWx5c2lzCitYLVVybDogaHR0cDovL2JhcnJ5Lndvb3oub3JnCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA3LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIxZjNhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wNy50eHQKQEAgLTAsMCArMSw4MyBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0Zyb206IEJhcnJ5IDxiYXJyeUBkaWdpY29vbC5jb20+CitUbzogRGluZ3VzIExvdmVycyA8Y3JhdmluZG9nc0BjcmF2aW5kb2dzLmNvbT4KK1N1YmplY3Q6IEhlcmUgaXMgeW91ciBkaW5ndXMgZmlzaAorRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAxOTozNTowMiAtMDQwMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworSGkgdGhlcmUsCisKK1RoaXMgaXMgdGhlIGRpbmd1cyBmaXNoLgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IGltYWdlL2dpZjsgbmFtZT0iZGluZ3VzZmlzaC5naWYiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKK2NvbnRlbnQtZGlzcG9zaXRpb246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPSJkaW5ndXNmaXNoLmdpZiIKKworUjBsR09EZGhBQUVBQWZBQUFQLy8vd0FBQUN3QUFBQUFBQUVBQVFBQy9vU1BxY3Z0RDZPY3ROcUxzOTY4K3crRzRraVc1b21tNnNxMgorN2d2SDhrelg5bzNuK3M3My9nOE1Db2ZFb3ZHSVRHSUNUS2J5Q1YwRkROT285U3FwUXFwT3JKZlh6VFFqMnZEM1RHdHFMK050R1EyZgorcVRYbXh6dU9kN1dYZGNjOUR5alU1M2V3Rm5pNHMwZkdoZGlZYUVoR0JlbElDVE5vVjFqNU5VbkZjcm1VcWVtak5pZkpWV3BhT3FhSQorb0ZxM1NzcFpzU3JhRTdzSHEzanIxTVpxV3ZpNjYydnhWNHREK3B2S1c2YUxET0NMeXVyOFBEd2JhbnlEZXEwTjNEY3RiUVllTER2UgorUlk2dDk1bTZVQjBkM213SXJWN2UyVkdOdmpqZmZ1a2VKcDR3N0Y2NUtlY0dGc1RIUUdBeWdPcmdyV3MxanQyOFJjODhLRVNZY0dMQQorL29idlRrSDZwK0NpbldKaUptSU1xWEdRd0gveTRxazBTWWpnUVRjelQzYWpLWkdmdUkwdUo0a2tWSS9EVDVzMy9lamt4STBhVDRZKworWVRZZ1diSW1VYVhrOW5sTG1uU2gxcUppSkZsME9wVXFSSzRvT3k3TnlSUXRIV29maG9ZVnhrd1dYS1VTbjBZc1MrZlVWNmxocWZZYgorNmF5ZDNaNXFRZEcxQjdidlF6YUpqd1VWMmxpeE1VWjdKVnNPbGZqV1ZyLzNOQi91RnZueVNCTjZEY2I2ckd3YVJNM3dzb3JtdzVjQworTTlOeFd5L2JXZHVmdWRDdnk4Yk9BalhqVlZ3dGEvdU8yMXNFNVJIQkN6TkZYdGdxOU9SdEg0ZVlqVlA0WXJ5bzAyNm52a0ZtQ2V5QQorQjI5ZWZWNnJhdkNNSzVKd1dkNTg5N1FyeDdsbDM4bzZpSERaL3JYUFIvL2ZlZXZoRjRsN3dqVUdYM3hxMWVlUmZNNFJTSkdCSVYxRAorejFnS1BrZldhZzNtVkJWdnZhMVJsWDViQUpUUFIvMllxTnR3L0ZrSVlZRWkvcElaaUFkcGN4cG9IdG1uWVlvWnR2aFVmdHpkeDVaWAorSlNLRFc0MDV6a0djWnp6R1o2S0V2NEZJMjI0b0RtaWpsRWYreHA2TUpLNW9qWS9BU2VWVVIrd3NLUnVKK1hGWjVvN1plRWltZTh0MQorb3VVc1U2WWpGNVp0VWloaGtHZkNkRlFMV1FGSjNVWHhtRWxmaFFuUitlQ2RjRGJrRlpwNnZUUm1qNTZBcENpaG41UUdwYVRvTlptUgorbjNOVlNwWmNRcFoyS0VPTnVzYWlDc0tBdWcwd2tRYkpTRk8rUFRTam5lR3hPdUZqUGxVazNvdld2ZEllcmpVZzlaR0lPdEdxL3FlWAorZUNZcnJDWCsxVVBzZ1RLR0dSU2J6ZDVxMTU2ZC9ncGZiSnhlNjZlRDVpUUtyWGo3UkdncnVHeHM2MnFlYkJIVUtTMzJDS2x1Q2lxWgorcWgrcG1laG1FYjcxbm9BVW9lNWU5Wm0xN1M3NzczVjEwcGpydEc0Q211dXJDVi9uNnpMSzV0dXJXTmhxT3ZGWGJqaFpyTUQwWWhLZQord1Iwek95dXZzaDZNV3JHb0l1enZ5V3U1eTFXSUZBcW1Kc2VseXB4WGg2ZEtMTk9LRUI5OEw4OGJTMnJrTnFxbEt6Q05KcDljMEcwagorR3poMGlSckNiSFNYbVBSNjQzUVMrNHJXaGdGbW5TYlN1WENqUzB4QU9Xa1UyVWRMcXl1VU5mSFNGZFVvdXkzYm01aTVHbkRNM3RHOAorZG9KNHI1dHF1M3BQYlJTVmZ2czh1SnplTlhocDNuNGovdFo0MlN3SDdlYVdVVU9qYzNxRlY5NDUzVUhUWFpmY0xIK09lTnM1ZzM2eAorbEJuSHZUbTdFYk1iTGV1YUxuY2FvOHZXQ1hpbWZvMW8rODQzQWs2eTRDaE5lR250dkFZdmZMSzRlem1veU5JYk5DTFRDWE85WlYzQQorRTgvczg4UmN6UHpEd0k0T2I3WFp5bDcrOU1pYmFuMjloK3RKWlByRTIxd2d2QnBoRGZycmZQZENUUEtKRC95OThMMXJad0hjVjZKcQorWmFiMG1ldHB1TklYL3FBRlBvejE3MVdVYVViNEhBaEJTekh1SGZqekhiM2toYS8yQ2N0aXMvT1JBclZITllmRnlZUkgycFlJUnppYworaXNWT2ZQV0QxYjZtUlRxcENSQm96em9mNlVaVnZGWFJ4V0lyM0dHckV2aUdZZ3lQTWZhaGhlaVNhTHMvOVFlRnU3b1ovbmRTWThERAoreWE5eCt1UGVkKzdteE4ySXpJSVNCT01MRllXVnFDM1BldzFUMm5GdXVDaXdaUzUvdjZJSTEwaTR0MU9KY1VIMlU5enhLb2RIc0dHdgorT2Eremt2TlVZVU9hL1RDQ1J1dEY5TXpEd2RsVU1KQURUQ0dTYkRRNU9WNFBUYW1Eb1BFaTZFY2MvUkY1Uld3a2NkU1h2U09hRFdTbgorSTlMbHZ1YkZUUXB1YzZKS1hMY0tlYit4ZGJLUkJud1JFZW1YeWpnNk1FNjVhSmlPdUJncmt0enlrZlBMSkJLUjlDbE1hdko2Mi9GZgorQmxOSXlvZDl5WDl3Y1NYZXhuWEZwdmtyYlhrNjR4c3g1RGI3d1hLUDVmU2dzdndJTU0vOTYzMVZMQmZrbXRiSFJYcHFtdGVpNTJoRworcFV3U2xvK0JBU1FvZUlMRE9CZ1JFRUN4QkJoNS9pWW1Oc1E5ZEl2NStPSSsrUWtxZHNKUGMzdXlrejVma00rT3JhZWVrY1FGN1g0bgorQjVTNjd6YTVVOTY3UG1vb0dRaFVYZkY3YWZYeUNEN09OZFJlMTdRb2dZalZ4Mzh1THd0clM2bmhUbm0xNUxRVW51OUUydUs2Q05JLworMUhPQUJqMEVTd09qdXQ0RkVwRlFwZE5BbTRLMkxIbkRXSE5jbUtCMmlvS0JvZ3lzVlp0TU8yblN4VWRaOFlrMmtKYzdVUmlvTFZJMAorWWdtdEl3Wmo0TG9lS2VtZ25PbmJVZEduelo0T2E2c2NxaW9sQkdxUzZSZ1dOTHUwUk1oY2FFNnJoaFU0aGl1cUZYUEFHOGZHd1RQVworRktlTE10ZFZtWExTczVZSkdGL1llVm03clJFTWxZM1VZRSt5Q3hiYU1YWDh5MTVtNXpWSHE2R09LRE15bnpJSS9qZFVIZHlWcUl5MAoraWZYMityL0VndFpjdlJ6U2I3MmdVOXVpODdNMlZlY2pLaWxkVy9hRnFhWWhLb3J5VWpmQi9nNHF0eVZ1YzYweEZER21DeHdqVytxdQoremp1d2wyR2tPV242NiszUWlpRWN0dmQwNE9WdmNDVnpqZ1Q3bHJrdmpWR0tLSG1tbERVS293U2Vpa2I1a0svbUpSZXVXT3hPTngrcworVUxzbCtMcWIwQ1ZuMFNyVnlKNnd0NHQ2eVRlU0NhZmhQaEFmME9YbjZMNjBVTXhpTG9sRkF0bU4zNVMyT2IxbFpwUTFyL24wUWI1RAorb1ExekppUlZEZ0Y4TjNROFRZZmJpM0R5V0N5M2xUMW54eUJzNkZUM1MyR096V1JseHdLdmxSUDBSUEpBOVNqeEV5MFVvRW5rQStNNAorY256TE1KckJHV0xGRWFhVWI1bHZwcWJxL2xvT2FVNStERnVIUHhvODIvT1p1TThGWEczb1ZOWmh0V3BNcGIvMFh1NW0vTGZMaEhaUQorN3l1VkkwTXFaN05FNDNpbUM4akgzSXdHWmxiUG0weGtKWXM3KzJVNDhoWFRzRlNNcWdHRHZhaTBrTHh5eW5LTlQvd2FqK3ExYzF0egorR2pPcFBCZ2RDU3EzVUtaeENTc3FGSVkrTzZKYkFXR1djVjFwd3FMeWo1c0dxQ0YxeGIxRjN2YXJVV3FySnY2Y04zUHJVWHppanRmWgorRnNocEJMM1h3cjRHSVB2VTJOOEVqckpnUzF6bDIxcmJYUU1YZVhjNWpqRnlyaHBDemlqU3YvUlF0eVBTekhDRk1obE1FOTVmSGdsdAorcFJzWCtkZlNRalVlSEFscFd6SjVpT283OUxkbmF4YWk2YlhUY0dPM2ZwMDdyaTdITEVtWFhQbFlpOGJ2L3FWeHZOY2RyYTZtN1JsYgorNkpCVGI1ZmQ2NlZoRlJqR0FyaDJuN1IxckRXNFA1Tk9UOUswSTE4M1Qyc2NZa2VaM3EvVkZ5TGIwOVU5YWp6WEJTOEtna2hjNG1CUwora1lZOWN5M1Z5OWxVbnVOSkg4SEdJY2xVaWx3bkJ0alVPSDBndGVHT1o0Yy9YTnJoWExTWUR5eGZuRDh6MXBEeTdyWVJ2RG9saG5iZQorVU16eENaVXM0MHM2czdVSXZCbkxnYzArdkt1T2tJWGVPckR5bWxwK1p4cmE0TVpMQmJWcnFEL2pUSjU5N3BEbW53NWM0K0RieUI4OAorOUNnOURvZFljU3VNWlQvMTE0cHB0cWMvRXVUalJQdkgvejVzbHpJM3RsdU9FQkJMcU9YTE9YKzBJNTkyOXRPOTd3a3ZsL2F0Q3oreQoreEpyZHd0ZVcyRk5XL05TbUJQK2YvbWFZdFZzL2JZeUJDN094M2pzWVpITDA1Q0lyQmEvblMrYjNiSGZpWW00VWVpbDFZWlpTZ0FVSQorZkZaMWR4VW1lQTJvUVJRM1J1R1hOR0xGVjkvWGJHRkdQVjZrZnprMVRCQkNkK2l6YzdxMUgrT0hNSndtYUJYMklRTllWQUtIWWVwVgorU1NHQ2U2Q25iWUhIRVRLR05lNDNFRHZGZ1pyMGdCL25WSFBIWjgwVlYxb2pPaUkzWER2WUlrbDRheW80YnhRSWdyRlhXVHZCSTBuSAorVkVsV011dzJhTFVXQ1JISGY4eW1WQ0hqRmxKbk9Tb2pmZXZDWXl5eVpESDBJY3ZIaHJzblE1TzFPc1d6T051VlZLSXhTeGlGWi90UgorZktEQWY2eEZUbnc0TzlRaWcyVkNmVzJoSlFybU1PdUhXMFczZExRbUNNTzJjY2RVZC94eWZmbEgvb2xUaUhaVmRHd2I4bkl3UnpTRQorSjE1akZsT0p1QlpCWjRDaXlIeWQySUZ5bEZsQitIZ0hoWWFiaFdPR3dZTzFaSC9PZzFkdFFsRk1rMzUyQ0dSU0lGVGFwbldRRVV0TgorbDR6djhTMGFhQ0ZEeUdDQnFEVXhaWXB4R0hYMDF5L0p1SDF4aG43VE9Dbk5DSTRlS0RzNVdHWDRSNDI1RjR2RjFvM0JKNHZPMG90cQorSTNyaW1JN2pKWTFqSVNxbkJ4a25DSXZydUY4M21GNXdONFg3cUdMSWhSOEEyVmcweUZFUlNJWG45VnYzR0h5M1ZqL1dJa0tkZGxZaQoreUlNdjJJL1ZNalRMcFc3cHQwNVNXSVpSMFJQeXhwQjRTSVVNOWxCUEdCbDBHQzdvU0VFd1JZTGU0cEpwWlkyUDB6YkkxbitPYzQ0dworcVkzUFVubUYwaXhqVnBERC9tSjl3cE9CR1RWZ1hsYUNhWmlQY0lXSzVOaUtCSWlQZEdhUTBUV0d2QWlHN25NY2hkWmI3VmdmOHpOaQorTXVNeXpSZHkvbGVQZTlpQzRUUng3V2hoT1FJL1FpU1ZOQW1BYTJsVC9waUZidWg3b2ZKb1lTWnpyU1oxYnZtV3czZU4ybktVUFZreQordVBONS9WUmZvaFJkMFZZWm9xaEtJbFU2VFhZaEp4bVBVSWxvQXdjMWJQbUhFcGFaWVpPUkhObFhVSk0wN2hBVHdIUjhNSllxa3dXUgorV2FJZXpGaHhTRmxjOC9GcTgyaEVucGVSb3pnM1VMaGhyOWxBR3RWRWtDZzVaTlJ1dVZsZUJQYVphZGhHMFpna3lQbURPVE9LelZpTQorWWdPY3B1a0txUWNiakFXUzBJbGVRMlJPamRoNkErbWQxcVdkQlJTWDdpU1lnRlJUdFJtQnBKaW9pZVhKaUhmSmlNR0lSOWZKT244SQorTVNmWFloc3BuNG9vU2EybVNBajRuKzhCbWcwM2ZCSlpvUE9KZ3NWWlJ4dTFvT01SUFhZWWpkcWppaEZhRW9acFhCUkVhbnVKb1JJNgorY2liRmlucTRuZ1VLaC93UWQvSDVvZllDWjBISlhSNjJvcFpGYUFUMGlGSVpvNERJaVVvamtqZXFLaXVvWmlyS281WTFhN0FXY2tHYQorQmt1WW9ENWxwREs2ZVVzNkNrRHFwRVR3bDFFcXBmaEpwVmVLcFZsNkVnVUFBRHM9CisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA4LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2MzA4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18wOC50eHQKQEAgLTAsMCArMSwyNCBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0Zyb206IEJhcnJ5IFdhcnNhdyA8YmFycnlAem9wZS5jb20+CitUbzogRGluZ3VzIExvdmVycyA8Y3JhdmluZG9nc0BjcmF2aW5kb2dzLmNvbT4KK1N1YmplY3Q6IEx5cmljcworRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAxOTozNTowMiAtMDQwMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTIiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJrb2k4LXIiCisKKworLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMDkudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzVjNGMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzA5LnR4dApAQCAtMCwwICsxLDI0IEBACitNSU1FLVZlcnNpb246IDEuMAorRnJvbTogQmFycnkgV2Fyc2F3IDxiYXJyeUB6b3BlLmNvbT4KK1RvOiBEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPgorU3ViamVjdDogTHlyaWNzCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDE5OjM1OjAyIC0wNDAwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PSJpc28tODg1OS0xIgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0ia29pOC1yIgorCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzEwLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc5MDM5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMC50eHQKQEAgLTAsMCArMSwzOSBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0Zyb206IEJhcnJ5IFdhcnNhdyA8YmFycnlAem9wZS5jb20+CitUbzogRGluZ3VzIExvdmVycyA8Y3JhdmluZG9nc0BjcmF2aW5kb2dzLmNvbT4KK1N1YmplY3Q6IEx5cmljcworRGF0ZTogRnJpLCAyMCBBcHIgMjAwMSAxOTozNTowMiAtMDQwMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworVGhpcyBpcyBhIDdiaXQgZW5jb2RlZCBtZXNzYWdlLgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD0iaXNvLTg4NTktMSIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IFF1b3RlZC1QcmludGFibGUKKworPUExVGhpcyBpcyBhIFF1b3RlZCBQcmludGFibGUgZW5jb2RlZCBtZXNzYWdlIQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBCYXNlNjQKKworVkdocGN5QnBjeUJoSUVKaGMyVTJOQ0JsYm1OdlpHVmtJRzFsYzNOaFoyVXUKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBCYXNlNjQKKworVkdocGN5QnBjeUJoSUVKaGMyVTJOQ0JsYm1OdlpHVmtJRzFsYzNOaFoyVXVDZz09CisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJpc28tODg1OS0xIgorCitUaGlzIGhhcyBubyBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBoZWFkZXIuCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzExLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3ZjE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMS50eHQKQEAgLTAsMCArMSw3IEBACitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogVGhlIGVuY2xvc2luZyBtZXNzYWdlCisKK1N1YmplY3Q6IEFuIGVuY2xvc2VkIG1lc3NhZ2UKKworSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMi50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZWM4ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTIudHh0CkBAIC0wLDAgKzEsMzYgQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJBTk9USEVSIgorCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMiIKKworCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMyIKKworLS1BTk9USEVSLS0KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9ImtvaTgtciIKKworCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMmEudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzEyYS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0MjI0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xMmEudHh0CkBAIC0wLDAgKzEsMzggQEAKK01JTUUtVmVyc2lvbjogMS4wCitGcm9tOiBCYXJyeSBXYXJzYXcgPGJhcnJ5QHpvcGUuY29tPgorVG86IERpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+CitTdWJqZWN0OiBMeXJpY3MKK0RhdGU6IEZyaSwgMjAgQXByIDIwMDEgMTk6MzU6MDIgLTA0MDAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJBTk9USEVSIgorCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMiIKKworCistLUFOT1RIRVIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMyIKKworCistLUFOT1RIRVItLQorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCisKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJrb2k4LXIiCisKKworLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTMudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzEzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTZkNTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzEzLnR4dApAQCAtMCwwICsxLDk0IEBACitNSU1FLVZlcnNpb246IDEuMAorRnJvbTogQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4KK1RvOiBEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPgorU3ViamVjdDogSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDE5OjM1OjAyIC0wNDAwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ik9VVEVSIgorCistLU9VVEVSCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCitBIHRleHQvcGxhaW4gcGFydAorCistLU9VVEVSCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Qk9VTkRBUlkKKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorCitIaSB0aGVyZSwKKworVGhpcyBpcyB0aGUgZGluZ3VzIGZpc2guCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogaW1hZ2UvZ2lmOyBuYW1lPSJkaW5ndXNmaXNoLmdpZiIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorY29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImRpbmd1c2Zpc2guZ2lmIgorCitSMGxHT0RkaEFBRUFBZkFBQVAvLy93QUFBQ3dBQUFBQUFBRUFBUUFDL29TUHFjdnRENk9jdE5xTHM5NjgrdytHNGtpVzVvbW02c3EyCis3Z3ZIOGt6WDlvM24rczczL2c4TUNvZkVvdkdJVEdJQ1RLYnlDVjBGRE5PbzlTcXBRcXBPckpmWHpUUWoydkQzVEd0cUwrTnRHUTJmCitxVFhteHp1T2Q3V1hkY2M5RHlqVTUzZXdGbmk0czBmR2hkaVlhRWhHQmVsSUNUTm9WMWo1TlVuRmNybVVxZW1qTmlmSlZXcGFPcWFJCitvRnEzU3NwWnNTcmFFN3NIcTNqcjFNWnFXdmk2NjJ2eFY0dEQrcHZLVzZhTERPQ0x5dXI4UER3YmFueURlcTBOM0RjdGJRWWVMRHZSCitSWTZ0OTVtNlVCMGQzbXdJclY3ZTJWR052ampmZnVrZUpwNHc3RjY1S2VjR0ZzVEhRR0F5Z09yZ3JXczFqdDI4UmM4OEtFU1ljR0xBCisvb2J2VGtINnArQ2luV0ppSm1JTXFYR1F3SC95NHFrMFNZamdRVGN6VDNhaktaR2Z1STB1SjRra1ZJL0RUNXMzL2Vqa3hJMGFUNFkrCitZVFlnV2JJbVVhWGs5bmxMbW5TaDFxSmlKRmwwT3BVcVJLNG9PeTdOeVJRdEhXb2Zob1lWeGt3V1hLVVNuMFlzUytmVVY2bGhxZlliCis2YXlkM1o1cVFkRzFCN2J2UXphSmp3VVYybGl4TVVaN0pWc09sZmpXVnIvM05CL3VGdm55U0JONkRjYjZyR3dhUk0zd3Nvcm13NWNDCitNOU54V3kvYldkdWZ1ZEN2eThiT0FqWGpWVnd0YS91TzIxc0U1UkhCQ3pORlh0Z3E5T1J0SDRlWWpWUDRZcnlvMDI2bnZrRm1DZXlBCitCMjllZlY2cmF2Q01LNUp3V2Q1ODk3UXJ4N2xsMzhvNmlIRFovclhQUi8vZmVldmhGNGw3d2pVR1gzeHExZWVSZk00UlNKR0JJVjFECit6MWdLUGtmV2FnM21WQlZ2dmExUmxYNWJBSlRQUi8yWXFOdHcvRmtJWVlFaS9wSVppQWRwY3hwb0h0bW5ZWW9adHZoVWZ0emR4NVpYCitKU0tEVzQwNXprR2NaenpHWjZLRXY0RkkyMjRvRG1pamxFZit4cDZNSks1b2pZL0FTZVZVUit3c0tSdUorWEZaNW83WmVFaW1lOHQxCitvdVVzVTZZakY1WnRVaWhoa0dmQ2RGUUxXUUZKM1VYeG1FbGZoUW5SK2VDZGNEYmtGWnA2dlRSbWo1NkFwQ2lobjVRR3BhVG9OWm1SCituM05WU3BaY1FwWjJLRU9OdXNhaUNzS0F1ZzB3a1FiSlNGTytQVFNqbmVHeE91RmpQbFVrM292V3ZkSWVyalVnOVpHSU90R3EvcWVYCitlQ1lyckNYKzFVUHNnVEtHR1JTYnpkNXExNTZkL2dwZmJKeGU2NmVENWlRS3JYajdSR2dydUd4czYycWViQkhVS1MzMkNLbHVDaXFaCitxaCtwbWVobUViNzFub0FVb2U1ZTlabTE3Uzc3NzNWMTBwanJ0RzRDbXV1ckNWL242ekxLNXR1cldOaHFPdkZYYmpoWnJNRDBZaEtlCit3UjB6T3l1dnNoNk1XckdvSXV6dnlXdTV5MVdJRkFxbUpzZWx5cHhYaDZkS0xOT0tFQjk4TDg4YlMycmtOcXFsS3pDTkpwOWMwRzBqCitHemgwaVJyQ2JIU1htUFI2NDNRUys0cldoZ0ZtblNiU3VYQ2pTMHhBT1drVTJVZExxeXVVTmZIU0ZkVW91eTNibTVpNUduRE0zdEc4Citkb0o0cjV0cXUzcFBiUlNWZnZzOHVKemVOWGhwM240ai90WjQyU3dIN2VhV1VVT2pjM3FGVjk0NTNVSFRYWmZjTEgrT2VOczVnMzZ4CitsQm5IdlRtN0ViTWJMZXVhTG5jYW84dldDWGltZm8xbys4NDNBazZ5NENoTmVHbnR2QVl2ZkxLNGV6bW95TkliTkNMVENYTzlaVjNBCitFOC9zODhSY3pQekR3STRPYjdYWnlsNys5TWliYW4yOWgrdEpaUHJFMjF3Z3ZCcGhEZnJyZlBkQ1RQS0pEL3k5OEwxclp3SGNWNkpxCitaYWIwbWV0cHVOSVgvcUFGUG96MTcxV1VhVWI0SEFoQlN6SHVIZmp6SGIza2hhLzJDY3Rpcy9PUkFyVkhOWWZGeVlSSDJwWUlSemljCitpc1ZPZlBXRDFiNm1SVHFwQ1JCb3p6b2Y2VVpWdkZYUnhXSXIzR0dyRXZpR1lneVBNZmFoaGVpU2FMcy85UWVGdTdvWi9uZFNZOERECit5YTl4K3VQZWQrN214TjJJeklJU0JPTUxGWVdWcUMzUGV3MVQybkZ1dUNpd1pTNS92NklJMTBpNHQxT0pjVUgyVTl6eEtvZEhzR0d2CitPYSt6a3ZOVVlVT2EvVENDUnV0RjlNekR3ZGxVTUpBRFRDR1NiRFE1T1Y0UFRhbURvUEVpNkVjYy9SRjVSV3drY2RTWHZTT2FEV1NuCitJOUxsdnViRlRRcHVjNkpLWExjS2ViK3hkYktSQm53UkVlbVh5amc2TUU2NWFKaU91Qmdya3R6eWtmUExKQktSOUNsTWF2SjYyL0ZmCitCbE5JeW9kOXlYOXdjU1hleG5YRnB2a3JiWGs2NHhzeDVEYjd3WEtQNWZTZ3N2d0lNTS85NjMxVkxCZmttdGJIUlhwcW10ZWk1MmhHCitwVXdTbG8rQkFTUW9lSUxET0JnUkVFQ3hCQmg1L2lZbU5zUTlkSXY1K09JKytRa3Fkc0pQYzN1eWt6NWZrTStPcmFlZWtjUUY3WDRuCitCNVM2N3phNVU5NjdQbW9vR1FoVVhmRjdhZlh5Q0Q3T05kUmUxN1FvZ1lqVngzOHVMd3RyUzZuaFRubTE1TFFVbnU5RTJ1SzZDTkkvCisxSE9BQmowRVN3T2p1dDRGRXBGUXBkTkFtNEsyTEhuRFdITmNtS0IyaW9LQm9neXNWWnRNTzJuU3hVZFo4WWsya0pjN1VSaW9MVkkwCitZZ210SXdaajRMb2VLZW1nbk9uYlVkR256WjRPYTZzY3Fpb2xCR3FTNlJnV05MdTBSTWhjYUU2cmhoVTRoaXVxRlhQQUc4Zkd3VFBXCitGS2VMTXRkVm1YTFNzNVlKR0YvWWVWbTdyUkVNbFkzVVlFK3lDeGJhTVhYOHkxNW01elZIcTZHT0tETXlueklJL2pkVUhkeVZxSXkwCitpZlgyK3IvRWd0WmN2UnpTYjcyZ1U5dWk4N00yVmVjaktpbGRXL2FGcWFZaEtvcnlVamZCL2c0cXR5VnVjNjB4RkRHbUN4d2pXK3F1Cit6anV3bDJHa09XbjY2KzNRaWlFY3R2ZDA0T1Z2Y0NWempnVDdscmt2alZHS0tIbW1sRFVLb3dTZWlrYjVrSy9tSlJldVdPeE9OeCtzCitVTHNsK0xxYjBDVm4wU3JWeUo2d3Q0dDZ5VGVTQ2FmaFBoQWYwT1huNkw2MFVNeGlMb2xGQXRtTjM1UzJPYjFsWnBRMXIvbjBRYjVECitvUTF6SmlSVkRnRjhOM1E4VFlmYmkzRHlXQ3kzbFQxbnh5QnM2RlQzUzJHT3pXUmx4d0t2bFJQMFJQSkE5U2p4RXkwVW9FbmtBK000CitjbnpMTUpyQkdXTEZFYWFVYjVsdnBxYnEvbG9PYVU1K0RGdUhQeG84Mi9PWnVNOEZYRzNvVk5aaHRXcE1wYi8wWHU1bS9MZkxoSFpRCis3eXVWSTBNcVo3TkU0M2ltQzhqSDNJd0dabGJQbTB4a0pZczcrMlU0OGhYVHNGU01xZ0dEdmFpMGtMeHl5bktOVC93YWorcTFjMXR6CitHak9wUEJnZENTcTNVS1p4Q1NzcUZJWStPNkpiQVdHV2NWMXB3cUx5ajVzR3FDRjF4YjFGM3ZhclVXcXJKdjZjTjNQclVYemlqdGZaCitGc2hwQkwzWHdyNEdJUHZVMk44RWpySmdTMXpsMjFyYlhRTVhlWGM1ampGeXJocEN6aWpTdi9SUXR5UFN6SENGTWhsTUU5NWZIZ2x0CitwUnNYK2RmU1FqVWVIQWxwV3pKNWlPbzc5TGRuYXhhaTZiWFRjR08zZnAwN3JpN0hMRW1YWFBsWWk4YnYvcVZ4dk5jZHJhNm03UmxiCis2SkJUYjVmZDY2VmhGUmpHQXJoMm43UjFyRFc0UDVOT1Q5SzBJMTgzVDJzY1lrZVozcS9WRnlMYjA5VTlhanpYQlM4S2draGM0bUJTCitrWVk5Y3kzVnk5bFVudU5KSDhIR0ljbFVpbHduQnRqVU9IMGd0ZUdPWjRjL1hOcmhYTFNZRHl4Zm5EOHoxcER5N3JZUnZEb2xobmJlCitVTXp4Q1pVczQwczZzN1VJdkJuTGdjMCt2S3VPa0lYZU9yRHltbHArWnhyYTRNWkxCYlZycUQvalRKNTk3cERtbnc1YzQrRGJ5Qjg4Cis5Q2c5RG9kWWNTdU1aVC8xMTRwcHRxYy9FdVRqUlB2SC96NXNsekkzdGx1T0VCQkxxT1hMT1grMEk1OTI5dE85N3drdmwvYXRDeit5Cit4SnJkd3RlVzJGTlcvTlNtQlArZi9tYVl0VnMvYll5QkM3T3gzanNZWkhMMDVDSXJCYS9uUytiM2JIZmlZbTRVZWlsMVlaWlNnQVVJCitmRloxZHhVbWVBMm9RUlEzUnVHWE5HTEZWOS9YYkdGR1BWNmtmemsxVEJCQ2QraXpjN3ExSCtPSE1Kd21hQlgySVFOWVZBS0hZZXBWCitTU0dDZTZDbmJZSEhFVEtHTmU0M0VEdkZnWnIwZ0IvblZIUEhaODBWVjFvak9pSTNYRHZZSWtsNGF5bzRieFFJZ3JGWFdUdkJJMG5ICitWRWxXTXV3MmFMVVdDUkhIZjh5bVZDSGpGbEpuT1NvamZldkNZeXl5WkRIMEljdkhocnNuUTVPMU9zV3pPTnVWVktJeFN4aUZaL3RSCitmS0RBZjZ4RlRudzRPOVFpZzJWQ2ZXMmhKUXJtTU91SFcwVzNkTFFtQ01PMmNjZFVkL3h5ZmZsSC9vbFRpSFpWZEd3YjhuSXdSelNFCitKMTVqRmxPSnVCWkJaNENpeUh5ZDJJRnlsRmxCK0hnSGhZYWJoV09Hd1lPMVpIL09nMWR0UWxGTWszNTJDR1JTSUZUYXBuV1FFVXROCitsNHp2OFMwYWFDRkR5R0NCcURVeFpZcHhHSFgwMXkvSnVIMXhobjdUT0NuTkNJNGVLRHM1V0dYNFI0MjVGNHZGMW8zQko0dk8wb3RxCitJM3JpbUk3akpZMWpJU3FuQnhrbkNJdnJ1RjgzbUY1d040WDdxR0xJaFI4QTJWZzB5RkVSU0lYbjlWdjNHSHkzVmovV0lrS2RkbFlpCit5SU12MkkvVk1qVExwVzdwdDA1U1dJWlIwUlB5eHBCNFNJVU05bEJQR0JsMEdDN29TRUV3UllMZTRwSnBaWTJQMHpiSTFuK09jNDR3CitxWTNQVW5tRjBpeGpWcEREL21KOXdwT0JHVFZnWGxhQ2FaaVBjSVdLNU5pS0JJaVBkR2FRMFRXR3ZBaUc3bk1jaGRaYjdWZ2Y4ek5pCitNdU15elJkeS9sZVBlOWlDNFRSeDdXaGhPUUkvUWlTVk5BbUFhMmxUL3BpRmJ1aDdvZkpvWVNaenJTWjFidm1XdzNlTjJuS1VQVmt5Cit1UE41L1ZSZm9oUmQwVllab3FoS0lsVTZUWFloSnhtUFVJbG9Bd2MxYlBtSEVwYVpZWk9SSE5sWFVKTTA3aEFUd0hSOE1KWXFrd1dSCitXYUllekZoeFNGbGM4L0ZxODJoRW5wZVJvemczVUxoaHI5bEFHdFZFa0NnNVpOUnV1VmxlQlBhWmFkaEcwWmdreVBtRE9UT0t6VmlNCitZZ09jcHVrS3FRY2JqQVdTMElsZVEyUk9qZGg2QSttZDFxV2RCUlNYN2lTWWdGUlR0Um1CcEppb2llWEppSGZKaU1HSVI5ZkpPbjhJCitNU2ZYWWhzcG40b29TYTJtU0FqNG4rOEJtZzAzZkJKWm9QT0pnc1ZaUnh1MW9PTVJQWFlZamRxamloRmFFb1pwWEJSRWFudUpvUkk2CitjaWJGaW5xNG5nVUtoL3dRZC9INW9mWUNaMEhKWFI2Mm9wWkZhQVQwaUZJWm80RElpVW9qa2plcUtpdW9aaXJLbzVZMWE3QVdja0dhCitCa3VZb0Q1bHBESzZlVXM2Q2tEcXBFVHdsMUVxcGZoSnBWZUtwVmw2RWdVQUFEcz0KKworLS1CT1VOREFSWS0tCisKKy0tT1VURVItLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE0LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5OGQyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNC50eHQKQEAgLTAsMCArMSwyMyBAQAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKKwlpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0OyBjaGFyc2V0PXVzLWFzY2lpCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKKworCitIaSwKKworSSdtIHNvcnJ5IGJ1dCBJJ20gdXNpbmcgYSBkcmFpbmJyZWFkIElTUCwgd2hpY2ggYWx0aG91Z2ggYmlnIGFuZAord2VhbHRoeSBjYW4ndCBzZWVtIHRvIGdlbmVyYXRlIHN0YW5kYXJkIGNvbXBsaWFudCBlbWFpbC4gOigKKworVGhpcyBtZXNzYWdlIGhhcyBhIENvbnRlbnQtVHlwZTogaGVhZGVyIHdpdGggbm8gc3VidHlwZS4gIEkgaG9wZSB5b3UKK2NhbiBzdGlsbCByZWFkIGl0LgorCistTWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYjg0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTUudHh0CkBAIC0wLDAgKzEsNTIgQEAKK1JldHVybi1QYXRoOiA8eHhAeHguZGs+CitSZWNlaXZlZDogZnJvbSBmZXBELnBvc3QudGVsZS5kayAoMTk1LjQxLjQ2LjE0OSkgYnkgbWFpbC5ncm91cGNhcmUuZGsgKExTTVRQIGZvciBXaW5kb3dzIE5UIHYxLjFiKSB3aXRoIFNNVFAgaWQgPDAuMDAxNEY4QTJAbWFpbC5ncm91cGNhcmUuZGs+OyBNb24sIDMwIEFwciAyMDAxIDEyOjE3OjUwICswMjAwCitVc2VyLUFnZW50OiBNaWNyb3NvZnQtT3V0bG9vay1FeHByZXNzLU1hY2ludG9zaC1FZGl0aW9uLzUuMDIuMjEwNgorU3ViamVjdDogWFgKK0Zyb206IHh4QHh4LmRrCitUbzogWFgKK01lc3NhZ2UtSUQ6IDx4eHh4PgorTWltZS12ZXJzaW9uOiAxLjAKK0NvbnRlbnQtdHlwZTogbXVsdGlwYXJ0L21peGVkOworICAgYm91bmRhcnk9Ik1TX01hY19PRV8zMDcxNDc3ODQ3XzcyMDI1Ml9NSU1FX1BhcnQiCisKKz4gRGVubmUgbWVkZGVsZWxzZSBlciBpIE1JTUUtZm9ybWF0LiBEYSBkaXQgcG9zdGy+c25pbmdzcHJvZ3JhbSBpa2tlIGZvcnN0jHIgZGV0dGUgZm9ybWF0LCBrYW4gZGVsIGFmIGVsbGVyIGhlbGUgbWVkZGVsZWxzZW4gdr5yZSB1bL5zZWxpZy4KKworLS1NU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0CitDb250ZW50LXR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKKyAgIGJvdW5kYXJ5PSJNU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0IgorCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJJU08tODg1OS0xIgorQ29udGVudC10cmFuc2Zlci1lbmNvZGluZzogcXVvdGVkLXByaW50YWJsZQorCitTb21lIHJlbW92ZWQgdGVzdC4gCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydAorQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9IklTTy04ODU5LTEiCitDb250ZW50LXRyYW5zZmVyLWVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlCisKKzxIVE1MPgorPEhFQUQ+Cis8VElUTEU+U29tZSByZW1vdmVkIEhUTUw8L1RJVExFPgorPC9IRUFEPgorPEJPRFk+CitTb21lIHJlbW92ZWQgdGV4dC4KKzwvQk9EWT4KKzwvSFRNTD4KKworCistLU1TX01hY19PRV8zMDcxNDc3ODQ3XzcyMDI1Ml9NSU1FX1BhcnQtLQorCisKKy0tTVNfTWFjX09FXzMwNzE0Nzc4NDdfNzIwMjUyX01JTUVfUGFydAorQ29udGVudC10eXBlOiBpbWFnZS9naWY7IG5hbWU9Inh4LmdpZiI7CisgeC1tYWMtY3JlYXRvcj0iNkY2NzZDNjUiOworIHgtbWFjLXR5cGU9IjQ3NDk0NjY2IgorQ29udGVudC1kaXNwb3NpdGlvbjogYXR0YWNobWVudAorQ29udGVudC10cmFuc2Zlci1lbmNvZGluZzogYmFzZTY0CisKK1NvbWUgcmVtb3ZlZCBiYXNlNjQgZW5jb2RlZCBjaGFycy4KKworLS1NU19NYWNfT0VfMzA3MTQ3Nzg0N183MjAyNTJfTUlNRV9QYXJ0LS0KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE2LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYxNjdlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xNi50eHQKQEAgLTAsMCArMSwxMjMgQEAKK1JldHVybi1QYXRoOiA8PgorRGVsaXZlcmVkLVRvOiBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnCitSZWNlaXZlZDogZnJvbSBjb3VnYXIubm9jLnVjbGEuZWR1IChjb3VnYXIubm9jLnVjbGEuZWR1IFsxNjkuMjMyLjEwLjE4XSkKKwlieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBDQ0MyQzUxQjg0CisJZm9yIDxzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnPjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxMzo1NCAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gc2ltcy1tcy1kYWVtb24gYnkgY291Z2FyLm5vYy51Y2xhLmVkdQorIChTdW4gSW50ZXJuZXQgTWFpbCBTZXJ2ZXIgc2ltcy4zLjUuMjAwMC4wMy4yMy4xOC4wMy5wMTApCisgaWQgPDBHSzUwMEIwMUQwQjhZQGNvdWdhci5ub2MudWNsYS5lZHU+IGZvciBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnOyBTdW4sCisgMjMgU2VwIDIwMDEgMjA6MTQ6MzUgLTA3MDAgKFBEVCkKK1JlY2VpdmVkOiBmcm9tIGNvdWdhci5ub2MudWNsYS5lZHUKKyAoU3VuIEludGVybmV0IE1haWwgU2VydmVyIHNpbXMuMy41LjIwMDAuMDMuMjMuMTguMDMucDEwKQorIGlkIDwwR0s1MDBCMDFEMEI4WEBjb3VnYXIubm9jLnVjbGEuZWR1PjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozNSAtMDcwMCAoUERUKQorRGF0ZTogU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozNSAtMDcwMCAoUERUKQorRnJvbTogSW50ZXJuZXQgTWFpbCBEZWxpdmVyeSA8cG9zdG1hc3RlckB1Y2xhLmVkdT4KK1N1YmplY3Q6IERlbGl2ZXJ5IE5vdGlmaWNhdGlvbjogRGVsaXZlcnkgaGFzIGZhaWxlZAorVG86IHNjci1hZG1pbkBzb2NhbC1yYXZlcy5vcmcKK01lc3NhZ2UtaWQ6IDwwR0s1MDBCMDREMEI4WEBjb3VnYXIubm9jLnVjbGEuZWR1PgorTUlNRS12ZXJzaW9uOiAxLjAKK1NlbmRlcjogc2NyLW93bmVyQHNvY2FsLXJhdmVzLm9yZworRXJyb3JzLVRvOiBzY3Itb3duZXJAc29jYWwtcmF2ZXMub3JnCitYLUJlZW5UaGVyZTogc2NyQHNvY2FsLXJhdmVzLm9yZworWC1NYWlsbWFuLVZlcnNpb246IDIuMWEzCitQcmVjZWRlbmNlOiBidWxrCitMaXN0LUhlbHA6IDxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9aGVscD4KK0xpc3QtUG9zdDogPG1haWx0bzpzY3JAc29jYWwtcmF2ZXMub3JnPgorTGlzdC1TdWJzY3JpYmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vbGlzdGluZm8vc2NyPiwKKwk8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PXN1YnNjcmliZT4KK0xpc3QtSWQ6IFNvQ2FsLVJhdmVzIDxzY3Iuc29jYWwtcmF2ZXMub3JnPgorTGlzdC1VbnN1YnNjcmliZTogPGh0dHA6Ly9zb2NhbC1yYXZlcy5vcmcvbWFpbG1hbi9saXN0aW5mby9zY3I+LAorCTxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9dW5zdWJzY3JpYmU+CitMaXN0LUFyY2hpdmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vcHJpdmF0ZS9zY3IvPgorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvcmVwb3J0OyBib3VuZGFyeT0iQm91bmRhcnlfKElEX1BHUzJGMmEreisvakw3aHVwS2dSaEEpIgorCisKKy0tQm91bmRhcnlfKElEX1BHUzJGMmEreisvakw3aHVwS2dSaEEpCitDb250ZW50LXR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMQorCitUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKKworICBNZXNzYWdlLWlkOiA8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+CisgIERhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKKyAgRnJvbTogIklhbiBULiBIZW5yeSIgPGhlbnJ5aUBveHkuZWR1PgorICBUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CisgIFN1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorCitZb3VyIG1lc3NhZ2UgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgZm9sbG93aW5nIHJlY2lwaWVudHM6CisKKyAgUmVjaXBpZW50IGFkZHJlc3M6IGphbmdlbDFAY291Z2FyLm5vYy51Y2xhLmVkdQorICBSZWFzb246IHJlY2lwaWVudCByZWFjaGVkIGRpc2sgcXVvdGEKKworCistLUJvdW5kYXJ5XyhJRF9QR1MyRjJhK3orL2pMN2h1cEtnUmhBKQorQ29udGVudC10eXBlOiBtZXNzYWdlL0RFTElWRVJZLVNUQVRVUworCitPcmlnaW5hbC1lbnZlbG9wZS1pZDogMEdLNTAwQjRIRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdQorUmVwb3J0aW5nLU1UQTogZG5zOyBjb3VnYXIubm9jLnVjbGEuZWR1CisKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuMC4wIChyZWNpcGllbnQgcmVhY2hlZCBkaXNrIHF1b3RhKQorT3JpZ2luYWwtcmVjaXBpZW50OiByZmM4MjI7amFuZ2VsMUBjb3VnYXIubm9jLnVjbGEuZWR1CitGaW5hbC1yZWNpcGllbnQ6IHJmYzgyMjtqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUKKworLS1Cb3VuZGFyeV8oSURfUEdTMkYyYSt6Ky9qTDdodXBLZ1JoQSkKK0NvbnRlbnQtdHlwZTogTUVTU0FHRS9SRkM4MjIKKworUmV0dXJuLXBhdGg6IHNjci1hZG1pbkBzb2NhbC1yYXZlcy5vcmcKK1JlY2VpdmVkOiBmcm9tIHNpbXMtbXMtZGFlbW9uIGJ5IGNvdWdhci5ub2MudWNsYS5lZHUKKyAoU3VuIEludGVybmV0IE1haWwgU2VydmVyIHNpbXMuMy41LjIwMDAuMDMuMjMuMTguMDMucDEwKQorIGlkIDwwR0s1MDBCMDFEMEI4WEBjb3VnYXIubm9jLnVjbGEuZWR1PjsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozNSAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gcGFudGhlci5ub2MudWNsYS5lZHUgYnkgY291Z2FyLm5vYy51Y2xhLmVkdQorIChTdW4gSW50ZXJuZXQgTWFpbCBTZXJ2ZXIgc2ltcy4zLjUuMjAwMC4wMy4yMy4xOC4wMy5wMTApCisgd2l0aCBFU01UUCBpZCA8MEdLNTAwQjRHRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdT4gZm9yIGphbmdlbDFAc2ltcy1tcy1kYWVtb247CisgU3VuLCAyMyBTZXAgMjAwMSAyMDoxNDozMyAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcKKyAoaXAtMjA5LTg1LTIyMi0xMTcuZHJlYW1ob3N0LmNvbSBbMjA5Ljg1LjIyMi4xMTddKQorIGJ5IHBhbnRoZXIubm9jLnVjbGEuZWR1ICg4LjkuMWEvOC45LjEpIHdpdGggRVNNVFAgaWQgVUFBMDk3OTMgZm9yCisgPGphbmdlbDFAdWNsYS5lZHU+OyBTdW4sIDIzIFNlcCAyMDAxIDIwOjE0OjMyIC0wNzAwIChQRFQpCitSZWNlaXZlZDogZnJvbSBiYWJ5bG9uIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pIGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnCisgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgRDNCMjk1MUI3MDsgU3VuLCAyMyBTZXAgMjAwMSAyMDoxMzo0NyAtMDcwMCAoUERUKQorUmVjZWl2ZWQ6IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA2MDAwMSkKKyBpZCBBNjExRjUxQjgyOyBTdW4sIDIzIFNlcCAyMDAxIDIwOjEzOjQ2IC0wNzAwIChQRFQpCitSZWNlaXZlZDogZnJvbSB0aWdlci5jYy5veHkuZWR1ICh0aWdlci5jYy5veHkuZWR1IFsxMzQuNjkuMy4xMTJdKQorIGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEFEQTczNTFCNzAgZm9yCisgPHNjckBzb2NhbC1yYXZlcy5vcmc+OyBTdW4sIDIzIFNlcCAyMDAxIDIwOjEzOjQ0IC0wNzAwIChQRFQpCitSZWNlaXZlZDogZnJvbSBlbnQgKG4xNmg4Ni5kaGNwLm94eS5lZHUgWzEzNC42OS4xNi44Nl0pCisgYnkgdGlnZXIuY2Mub3h5LmVkdSAoOC44LjgvOC44LjgpIHdpdGggU01UUCBpZCBVQUEwODEwMCBmb3IKKyA8c2NyQHNvY2FsLXJhdmVzLm9yZz47IFN1biwgMjMgU2VwIDIwMDEgMjA6MTQ6MjQgLTA3MDAgKFBEVCkKK0RhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKK0Zyb206ICJJYW4gVC4gSGVucnkiIDxoZW5yeWlAb3h5LmVkdT4KK1N1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorU2VuZGVyOiBzY3ItYWRtaW5Ac29jYWwtcmF2ZXMub3JnCitUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CitFcnJvcnMtdG86IHNjci1hZG1pbkBzb2NhbC1yYXZlcy5vcmcKK01lc3NhZ2UtaWQ6IDwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4KK01JTUUtdmVyc2lvbjogMS4wCitYLU1haWxlcjogTWljcm9zb2Z0IE91dGxvb2sgRXhwcmVzcyA1LjUwLjQ1MjIuMTIwMAorQ29udGVudC10eXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitQcmVjZWRlbmNlOiBidWxrCitEZWxpdmVyZWQtdG86IHNjci1wb3N0QGJhYnlsb24uc29jYWwtcmF2ZXMub3JnCitEZWxpdmVyZWQtdG86IHNjckBzb2NhbC1yYXZlcy5vcmcKK1gtQ29udmVydGVkLVRvLVBsYWluLVRleHQ6IGZyb20gbXVsdGlwYXJ0L2FsdGVybmF0aXZlIGJ5IGRlbWltZSAwLjk4ZQorWC1Db252ZXJ0ZWQtVG8tUGxhaW4tVGV4dDogQWx0ZXJuYXRpdmUgc2VjdGlvbiB1c2VkIHdhcyB0ZXh0L3BsYWluCitYLUJlZW5UaGVyZTogc2NyQHNvY2FsLXJhdmVzLm9yZworWC1NYWlsbWFuLVZlcnNpb246IDIuMWEzCitMaXN0LUhlbHA6IDxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9aGVscD4KK0xpc3QtUG9zdDogPG1haWx0bzpzY3JAc29jYWwtcmF2ZXMub3JnPgorTGlzdC1TdWJzY3JpYmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vbGlzdGluZm8vc2NyPiwKKyA8bWFpbHRvOnNjci1yZXF1ZXN0QHNvY2FsLXJhdmVzLm9yZz9zdWJqZWN0PXN1YnNjcmliZT4KK0xpc3QtSWQ6IFNvQ2FsLVJhdmVzIDxzY3Iuc29jYWwtcmF2ZXMub3JnPgorTGlzdC1VbnN1YnNjcmliZTogPGh0dHA6Ly9zb2NhbC1yYXZlcy5vcmcvbWFpbG1hbi9saXN0aW5mby9zY3I+LAorIDxtYWlsdG86c2NyLXJlcXVlc3RAc29jYWwtcmF2ZXMub3JnP3N1YmplY3Q9dW5zdWJzY3JpYmU+CitMaXN0LUFyY2hpdmU6IDxodHRwOi8vc29jYWwtcmF2ZXMub3JnL21haWxtYW4vcHJpdmF0ZS9zY3IvPgorCitJIGFsd2F5cyBsb3ZlIHRvIGZpbmQgbW9yZSBJYW4ncyB0aGF0IGFyZSBvdmVyIDMgeWVhcnMgb2xkISEKKworSWFuCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworRm9yIGV2ZW50IGluZm8sIGxpc3QgcXVlc3Rpb25zLCBvciB0byB1bnN1YnNjcmliZSwgc2VlIGh0dHA6Ly93d3cuc29jYWwtcmF2ZXMub3JnLworCisKKworLS1Cb3VuZGFyeV8oSURfUEdTMkYyYSt6Ky9qTDdodXBLZ1JoQSktLQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTcudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDg2ZTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE3LnR4dApAQCAtMCwwICsxLDEyIEBACitNSU1FLVZlcnNpb246IDEuMAorRnJvbTogQmFycnkgPGJhcnJ5QGRpZ2ljb29sLmNvbT4KK1RvOiBEaW5ndXMgTG92ZXJzIDxjcmF2aW5kb2dzQGNyYXZpbmRvZ3MuY29tPgorU3ViamVjdDogSGVyZSBpcyB5b3VyIGRpbmd1cyBmaXNoCitEYXRlOiBGcmksIDIwIEFwciAyMDAxIDE5OjM1OjAyIC0wNDAwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCitIaSB0aGVyZSwKKworVGhpcyBpcyB0aGUgZGluZ3VzIGZpc2guCisKK1tOb24tdGV4dCAoaW1hZ2UvZ2lmKSBwYXJ0IG9mIG1lc3NhZ2Ugb21pdHRlZCwgZmlsZW5hbWUgZGluZ3VzZmlzaC5naWZdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMTgudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWY0OTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE4LnR4dApAQCAtMCwwICsxLDYgQEAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdDogd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKKwlzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSIKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzE5LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliZjdmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18xOS50eHQKQEAgLTAsMCArMSw0MyBAQAorU2VuZCBQcHAgbWFpbGluZyBsaXN0IHN1Ym1pc3Npb25zIHRvCisJcHBwQHp6ei5vcmcKKworVG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIHZpYSB0aGUgV29ybGQgV2lkZSBXZWIsIHZpc2l0CisJaHR0cDovL3d3dy56enoub3JnL21haWxtYW4vbGlzdGluZm8vcHBwCitvciwgdmlhIGVtYWlsLCBzZW5kIGEgbWVzc2FnZSB3aXRoIHN1YmplY3Qgb3IgYm9keSAnaGVscCcgdG8KKwlwcHAtcmVxdWVzdEB6enoub3JnCisKK1lvdSBjYW4gcmVhY2ggdGhlIHBlcnNvbiBtYW5hZ2luZyB0aGUgbGlzdCBhdAorCXBwcC1hZG1pbkB6enoub3JnCisKK1doZW4gcmVwbHlpbmcsIHBsZWFzZSBlZGl0IHlvdXIgU3ViamVjdCBsaW5lIHNvIGl0IGlzIG1vcmUgc3BlY2lmaWMKK3RoYW4gIlJlOiBDb250ZW50cyBvZiBQcHAgZGlnZXN0Li4uIgorCitUb2RheSdzIFRvcGljczoKKworICAgMS4gdGVzdGluZyAjMSAoQmFycnkgQS4gV2Fyc2F3KQorICAgMi4gdGVzdGluZyAjMiAoQmFycnkgQS4gV2Fyc2F3KQorICAgMy4gdGVzdGluZyAjMyAoQmFycnkgQS4gV2Fyc2F3KQorICAgNC4gdGVzdGluZyAjNCAoQmFycnkgQS4gV2Fyc2F3KQorICAgNS4gdGVzdGluZyAjNSAoQmFycnkgQS4gV2Fyc2F3KQorCitoZWxsbworCisKK2hlbGxvCisKKworaGVsbG8KKworCitoZWxsbworCisKK2hlbGxvCisKKworCitfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworUHBwIG1haWxpbmcgbGlzdAorUHBwQHp6ei5vcmcKK2h0dHA6Ly93d3cuenp6Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3BwcAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjAudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZhODg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIwLnR4dApAQCAtMCwwICsxLDIyIEBACitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK0NjOiBjY2NAenp6Lm9yZworQ0M6IGRkZEB6enoub3JnCitjYzogZWVlQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIxLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1OTBiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMS50eHQKQEAgLTAsMCArMSwyMCBAQAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBUZXN0CitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorCitNSU1FIG1lc3NhZ2UKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitPbmUKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitUd28KKy0tQk9VTkRBUlktLQorRW5kIG9mIE1JTUUgbWVzc2FnZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIyLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY5ZGU1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yMi50eHQKQEAgLTAsMCArMSw0NiBAQAorTWltZS1WZXJzaW9uOiAxLjAKK01lc3NhZ2UtSWQ6IDxhMDUwMDE5MDJiN2YxYzMzNzczZTlAWzEzNC44NC4xODMuMTM4XT4KK0RhdGU6IFR1ZSwgMTYgT2N0IDIwMDEgMTM6NTk6MjUgKzAzMDAKK1RvOiBhQGV4YW1wbGUuY29tCitGcm9tOiBiQGV4YW1wbGUuY29tCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij09PT09PT09PT09PV8tMTIwODg5MjUyMz09Xz09PT09PT09PT09PSIKKworLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiIDsgZm9ybWF0PSJmbG93ZWQiCisKK1RleHQgdGV4dCB0ZXh0LgorLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0KK0NvbnRlbnQtSWQ6IDxhMDUwMDE5MDJiN2YxYzMzNzczZTlAWzEzNC44NC4xODMuMTM4XS4wLjA+CitDb250ZW50LVR5cGU6IGltYWdlL2pwZWc7IG5hbWU9IndpYmJsZS5KUEciCisgOyB4LW1hYy10eXBlPSI0QTUwNDU0NyIKKyA7IHgtbWFjLWNyZWF0b3I9IjQ3NEI0RjRFIgorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9IndpYmJsZS5KUEciCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIKK0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFMQ0FYQUJJRUJBUkVBCitnNmJDamp3L3BJWlNqTzZGV0ZwbGRqeVNPbUNOck83REJaaWJVWGhUd3RDaXh3K0d0QWlqVmRxeHhhUHAwYUt2bUdYYQorcXJiQlF2bXMwbUFNZVlTLzNpVFYxZEcwaEhhUk5LMDFYYmxuV3h0VmRqa0hMTUlnVHlxbms5VkI3Q3JQMkt6SUlOcGEKKzRPN0krenhZTzlXVjhqWmc3MVpsYis4ck1Ea0VpckFWUUZBVUFLQUZBQUFVQVlBVURnQURnWTZEanBSdFhqNVJ4akhBCis0d1FSajB3UUNNZENBZXdwYUtLSy85az0KKy0tPT09PT09PT09PT09Xy0xMjA4ODkyNTIzPT1fPT09PT09PT09PT09CitDb250ZW50LUlkOiA8YTA1MDAxOTAyYjdmMWMzMzc3M2U5QFsxMzQuODQuMTgzLjEzOF0uMC4xPgorQ29udGVudC1UeXBlOiBpbWFnZS9qcGVnOyBuYW1lPSJ3aWJibGUyLkpQRyIKKyA7IHgtbWFjLXR5cGU9IjRBNTA0NTQ3IgorIDsgeC1tYWMtY3JlYXRvcj0iNDc0QjRGNEUiCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0id2liYmxlMi5KUEciCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworLzlqLzRBQVFTa1pKUmdBQkFRQUFBUUFCQUFELzJ3QkRBQUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUIKK0FRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRRUJBUUVCQVFFQkFRSC93QUFMQ0FYQUJKMEJBUkVBCisvOFFBSHdBQUFRVUJBUUVCQVFFQUFBQUFBQUFBQUFFQ0F3UUZCZ2NJQ1FvTC84UUF0UkFBQWdFREF3SUVBd1VGQkFRQQorVzZORkpKQkVrVTEwa0tHVGNXTUR3eHVVKzBKSHZrOHFBdE9wTndxU1IwbjhjM0JsRHlYSGxxc1VsdEhFaVR2ZFhMeFIKKzd2TWlHRE5KQUpXa0FNazhaa0NGcDVHMm9vNVcrK0lOcmJRdE5mVFF4SkF1WGx1cHo5b1M0ZDVZMVcrRTJYbFdaSkpFCitZN0xXWVF4VExFMXp1TWJmQlB4dzhYMmZpYlZkSWJTYkk2bkxaeFg2MzV0OVRqdFlyZVdSN1dHS0pUTEpGRktTbG96TworMFNoeElYTTQzdUMzLzlrPQorLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiIDsgZm9ybWF0PSJmbG93ZWQiCisKK1RleHQgdGV4dCB0ZXh0LgorLS09PT09PT09PT09PT1fLTEyMDg4OTI1MjM9PV89PT09PT09PT09PT0tLQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjMudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjJlOGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzIzLnR4dApAQCAtMCwwICsxLDggQEAKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK0EgbWVzc2FnZSBwYXJ0CistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNTIzMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjQudHh0CkBAIC0wLDAgKzEsMTAgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI1LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUzNTI3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNS50eHQKQEAgLTAsMCArMSwxMTcgQEAKK0Zyb20gTUFJTEVSLURBRU1PTiBGcmkgQXByIDA2IDE2OjQ2OjA5IDIwMDEKK1JlY2VpdmVkOiBmcm9tIFsyMDQuMjQ1LjE5OS45OF0gKGhlbG89emluZmFuZGVsLmxhY2l0YS5jb20pCisJYnkgd3d3LmxpbnV4Lm9yZy51ayB3aXRoIGVzbXRwIChFeGltIDMuMTMgIzEpCisJaWQgMTRsWVI2LTAwMDhJdi0wMAorCWZvciBsaW51eHVzZXItYWRtaW5Ad3d3LmxpbnV4Lm9yZy51azsgRnJpLCAwNiBBcHIgMjAwMSAxNjo0NjowOSArMDEwMAorUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsb2NhbGhvc3QpIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIGludGVybmFsIGlkIEpBQjAzMjI1OyBGcmksIDYgQXByIDIwMDEgMDk6MjM6MDYgLTA4MDAgKEdNVC0wODAwKQorRGF0ZTogRnJpLCA2IEFwciAyMDAxIDA5OjIzOjA2IC0wODAwIChHTVQtMDgwMCkKK0Zyb206IE1haWwgRGVsaXZlcnkgU3Vic3lzdGVtIDxNQUlMRVItREFFTU9OQHppbmZhbmRlbC5sYWNpdGEuY29tPgorU3ViamVjdDogUmV0dXJuZWQgbWFpbDogVG9vIG1hbnkgaG9wcyAxOSAoMTcgbWF4KTogZnJvbSA8bGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWs+IHZpYSBbMTk5LjE2NC4yMzUuMjI2XSwgdG8gPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT4KK01lc3NhZ2UtSWQ6IDwyMDAxMDQwNjE3MjMuSkFCMDMyMjVAemluZmFuZGVsLmxhY2l0YS5jb20+CitUbzogPGxpbnV4dXNlci1hZG1pbkB3d3cubGludXgub3JnLnVrPgorVG86IHBvc3RtYXN0ZXJAemluZmFuZGVsLmxhY2l0YS5jb20KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9yZXBvcnQ7IHJlcG9ydC10eXBlPWRlbGl2ZXJ5LXN0YXR1czsKKwlibworQXV0by1TdWJtaXR0ZWQ6IGF1dG8tZ2VuZXJhdGVkIChmYWlsdXJlKQorCitUaGlzIGlzIGEgTUlNRS1lbmNhcHN1bGF0ZWQgbWVzc2FnZQorCistLUpBQjAzMjI1Ljk4NjU3Nzc4Ni96aW5mYW5kZWwubGFjaXRhLmNvbQorCitUaGUgb3JpZ2luYWwgbWVzc2FnZSB3YXMgcmVjZWl2ZWQgYXQgRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKK2Zyb20gWzE5OS4xNjQuMjM1LjIyNl0KKworICAgLS0tLS0gVGhlIGZvbGxvd2luZyBhZGRyZXNzZXMgaGF2ZSBkZWxpdmVyeSBub3RpZmljYXRpb25zIC0tLS0tCis8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPiAgKHVucmVjb3ZlcmFibGUgZXJyb3IpCisKKyAgIC0tLS0tIFRyYW5zY3JpcHQgb2Ygc2Vzc2lvbiBmb2xsb3dzIC0tLS0tCis1NTQgVG9vIG1hbnkgaG9wcyAxOSAoMTcgbWF4KTogZnJvbSA8bGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWs+IHZpYSBbMTk5LjE2NC4yMzUuMjI2XSwgdG8gPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT4KKworLS1KQUIwMzIyNS45ODY1Nzc3ODYvemluZmFuZGVsLmxhY2l0YS5jb20KK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKworUmVwb3J0aW5nLU1UQTogZG5zOyB6aW5mYW5kZWwubGFjaXRhLmNvbQorUmVjZWl2ZWQtRnJvbS1NVEE6IGRuczsgWzE5OS4xNjQuMjM1LjIyNl0KK0Fycml2YWwtRGF0ZTogRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbQorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS40LjYKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDYgQXByIDIwMDEgMDk6MjM6MDYgLTA4MDAgKEdNVC0wODAwKQorCistLUpBQjAzMjI1Ljk4NjU3Nzc4Ni96aW5mYW5kZWwubGFjaXRhLmNvbQorQ29udGVudC1UeXBlOiB0ZXh0L3JmYzgyMi1oZWFkZXJzCisKK1JldHVybi1QYXRoOiBsaW51eHVzZXItYWRtaW5Ad3d3LmxpbnV4Lm9yZy51aworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjI1IGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjIzOjAzIC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIyMSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMjoxOCAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMTcgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MjE6MzcgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjEzIGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjIwOjU2IC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzIwOSBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToyMDoxNSAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoWzIwNC4yNDUuMTk5Ljk4XSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBuczEud2VsbHBhcnRuZXIubmV0IChbMTk5LjE2NC4yMzUuMjI2XSkgYnkgemluZmFuZGVsLmxhY2l0YS5jb20gKDguNy4zLzguNi4xMC1NVDQuMDApIHdpdGggRVNNVFAgaWQgSkFBMDMyMDUgZm9yIDxzY29mZm1hbkB3ZWxscGFydG5lci5jb20+OyBGcmksIDYgQXByIDIwMDEgMDk6MTk6MzMgLTA4MDAgKEdNVC0wODAwKQorUmVjZWl2ZWQ6IGZyb20gemluZmFuZGVsLmxhY2l0YS5jb20gKFsyMDQuMjQ1LjE5OS45OF0pCisJYnkKKwlmbworUmVjZWl2ZWQ6IGZyb20gbnMxLndlbGxwYXJ0bmVyLm5ldCAoWzE5OS4xNjQuMjM1LjIyNl0pIGJ5IHppbmZhbmRlbC5sYWNpdGEuY29tICg4LjcuMy84LjYuMTAtTVQ0LjAwKSB3aXRoIEVTTVRQIGlkIEpBQTAzMjAxIGZvciA8c2NvZmZtYW5Ad2VsbHBhcnRuZXIuY29tPjsgRnJpLCA2IEFwciAyMDAxIDA5OjE4OjUyIC0wODAwIChHTVQtMDgwMCkKK1JlY2VpdmVkOiBmcm9tIHppbmZhbmRlbC5sYWNpdGEuY29tIChbMjA0LjI0NS4xOTkuOThdKQorCWJ5CisJZm8KK1JlY2VpdmVkOiBmcm9tIG5zMS53ZWxscGFydG5lci5uZXQgKFsxOTkuMTY0LjIzNS4yMjZdKSBieSB6aW5mYW5kZWwubGFjaXRhLmNvbSAoOC43LjMvOC42LjEwLU1UNC4wMCkgd2l0aCBFU01UUCBpZCBKQUEwMzE5NyBmb3IgPHNjb2ZmbWFuQHdlbGxwYXJ0bmVyLmNvbT47IEZyaSwgNiBBcHIgMjAwMSAwOToxNzo1NCAtMDgwMCAoR01ULTA4MDApCitSZWNlaXZlZDogZnJvbSB3d3cubGludXgub3JnLnVrIChwYXJjZWxmYXJjZS5saW51eC50aGVwbGFuZXQuY28udWsgWzE5NS45Mi4yNDkuMjUyXSkKKwlieQorCWZvCitSZWNlaXZlZDogZnJvbSBsb2NhbGhvc3QubG9jYWxkb21haW4KKwkoWworCWJ5CisJaWQKK1JlY2VpdmVkOiBmcm9tIFsyMTIuMS4xMzAuMTFdIChoZWxvPXMxLnVrbGludXgubmV0IGlkZW50PXJvb3QpCisJYnkKKwlpZAorCWZvCitSZWNlaXZlZDogZnJvbSBzZXJ2ZXIgKHBwcC0yLTIyLmN2eDQudGVsaW5jby5uZXQgWzIxMi4xLjE0OS4yMl0pCisJYnkKKwlmbworRnJvbTogRGFuaWVsIEphbWVzIDxkYW5pZWxAbGludXh1c2VyLmNvLnVrPgorT3JnYW5pemF0aW9uOiBMaW51eFVzZXIKK1RvOiBsaW51eHVzZXJAd3d3LmxpbnV4Lm9yZy51aworWC1NYWlsZXI6IEtNYWlsIFt2ZXJzaW9uIDEuMS45OV0KK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKKyAgYworTUlNRS1WZXJzaW9uOiAxLjAKK01lc3NhZ2UtSWQ6IDwwMTA0MDYxNjAzMzkwMy4wMDk2MkBzZXJ2ZXI+CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitTdWJqZWN0OiBbTGludXhVc2VyXSBidWxsZXRpbiBuby4gNDUKK1NlbmRlcjogbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWsKK0Vycm9ycy1UbzogbGludXh1c2VyLWFkbWluQHd3dy5saW51eC5vcmcudWsKK1gtQmVlblRoZXJlOiBsaW51eHVzZXJAd3d3LmxpbnV4Lm9yZy51aworWC1NYWlsbWFuLVZlcnNpb246IDIuMC4zCitQcmVjZWRlbmNlOiBidWxrCitMaXN0LUhlbHA6IDxtYWlsdG86bGludXh1c2VyLXJlcXVlc3RAd3d3LmxpbnV4Lm9yZy51az9zdWJqZWN0PWhlbHA+CitMaXN0LVBvc3Q6IDxtYWlsdG86bGludXh1c2VyQHd3dy5saW51eC5vcmcudWs+CitMaXN0LVN1YnNjcmliZTogPGh0dHA6Ly93d3cubGludXgub3JnLnVrL21haWxtYW4vbGlzdGluZm8vbGludXh1c2VyPiwKKwk8bQorTGlzdC1JZDogYnVsbGV0aW5zIGZyb20gTGludXhVc2VyIG1hZ2F6aW5lIDxsaW51eHVzZXIud3d3LmxpbnV4Lm9yZy51az4KK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwOi8vd3d3LmxpbnV4Lm9yZy51ay9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4dXNlcj4sCisJPG0KK0xpc3QtQXJjaGl2ZTogPGh0dHA6Ly93d3cubGludXgub3JnLnVrL3BpcGVybWFpbC9saW51eHVzZXIvPgorRGF0ZTogRnJpLCA2IEFwciAyMDAxIDE2OjAzOjM5ICswMTAwCisKKy0tSkFCMDMyMjUuOTg2NTc3Nzg2L3ppbmZhbmRlbC5sYWNpdGEuY29tLS0KKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjYudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI2LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTMyMDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI2LnR4dApAQCAtMCwwICsxLDQ1IEBACitSZWNlaXZlZDogZnJvbSB4Y2FyIFsxOTIuMTY4LjAuMl0gYnkgamVldmVzLndvb3N0ZXIubG9jYWwNCisgIChTTVRQRDMyLTcuMDcgRVZBTCkgaWQgQUZGOTJGMDIxNDsgU3VuLCAxMiBNYXkgMjAwMiAwODo1NTozNyArMDEwMA0KK0RhdGU6IFN1biwgMTIgTWF5IDIwMDIgMDg6NTY6MTUgKzAxMDANCitGcm9tOiBGYXRoZXIgVGltZSA8ZmF0aGVyLnRpbWVAeGNhci53b29zdGVyLmxvY2FsPg0KK1RvOiB0aW1ib0BqZWV2ZXMud29vc3Rlci5sb2NhbA0KK1N1YmplY3Q6IElNQVAgZmlsZSB0ZXN0DQorTWVzc2FnZS1JRDogPDZkZjY1ZDM1NGIuZmF0aGVyLnRpbWVAcnBjLndvb3N0ZXIubG9jYWw+DQorWC1Pcmdhbml6YXRpb246IEhvbWUNCitVc2VyLUFnZW50OiBNZXNzZW5nZXItUHJvLzIuNTBhIChNc2dTZXJ2ZS8xLjUwKSAoUklTQy1PUy80LjAyKSBQT1BzdGFyLzIuMDMNCitNSU1FLVZlcnNpb246IDEuMA0KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iMTYxODQ5Mjg2MC0tMjA1MTMwMTE5MC0tMTEzODUzNjgwIg0KK1N0YXR1czogUg0KK1gtVUlETDogMzE5OTk4MzAyDQorDQorVGhpcyBtZXNzYWdlIGlzIGluIE1JTUUgZm9ybWF0IHdoaWNoIHlvdXIgbWFpbGVyIGFwcGFyZW50bHkgZG9lcyBub3Qgc3VwcG9ydC4NCitZb3UgZWl0aGVyIHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIHlvdXIgc29mdHdhcmUgd2hpY2ggc3VwcG9ydHMgTUlNRSwgb3INCithIHNlcGFyYXRlIE1JTUUgZGVjb2RpbmcgdXRpbGl0eS4gIEFsdGVybmF0aXZlbHksIGFzayB0aGUgc2VuZGVyIG9mIHRoaXMNCittZXNzYWdlIHRvIHJlc2VuZCBpdCBpbiBhIGRpZmZlcmVudCBmb3JtYXQuDQorDQorLS0xNjE4NDkyODYwLS0yMDUxMzAxMTkwLS0xMTM4NTM2ODANCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkNCisNCitTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50Lg0KKw0KKw0KKy0tMTYxODQ5Mjg2MC0tMjA1MTMwMTE5MC0tMTEzODUzNjgwDQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9yaXNjb3M7IG5hbWU9ImNsb2NrLmJtcCw2OWMiOyB0eXBlPUJNUDsgbG9hZD0mZmZmNjljNGI7IGV4ZWM9JjM1NWRkNGQxOyBhY2Nlc3M9JjAzDQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImNsb2NrLmJtcCINCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQNCisNCitRazEyQWdBQUFBQUFBSFlBQUFBb0FBQUFJQUFBQUNBQUFBQUJBQVFBQUFBQUFBQUFBQURYRFFBQTF3MEFBQUFBQUFBQQ0KK0FBQUFBQUFBQUFBQWlBQUFpQUFBQUlpSUFJZ0FBQUNJQUlnQWlJZ0FBTHU3dXdDSWlJZ0FFUkhkQUNMdUlnQXovLzhBDQorekFBQUFOMFIzUUR1N2lJQS8vLy9BQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQWkzQUFBQUFBQUFBRGVBQUFBQUFBQUENCitDM0FETXpNek1BTndBQUFBQUFBQUFBQUhNQUFBQUFOd0FBQUFBQUFBQUFDQU1BZDN6UGZ3QXdnQUFBQUFBQUFJQXdkLw0KK2Y4eC9mM0F3Z0FBQUFBQUFnREIweC9mMy8velBBd2dBQUFBQUFBY0hmTTkvLy8vOHovQXdBQUFBQUFpd2QvZjMvLy8vDQorLy8vL0E0QUFBQUFBY0V4L2YvLy8vLy8vekFNQUFBQUFpd2ZNOS8vLy8zLy8vOHp3T0FBQUFBY0hmMy8vLy9CLy8vLy8NCis4REFBQUFBTEIvZjMvLy93ZDNkMy8vQXdBQUFBQndUUGYvL3dDUUFBRC96QU1BQUFBQXNFeC9mLy8vQi8vLy84d0RBQQ0KK0FBQUhCMzkvLy8vd2YvLy8vL0F3QUFBQUN3ZjM5Ly8vOEgvLy8vL3dNQUFBQUljSGZNOS8vL0IvLy8vTThEZ0FBQUFBDQorc0hUSC8vL3dmLy8veEFNQUFBQUFDSEIzZjMvLzhILy8vL2NEZ0FBQUFBQUxCM3pILy9ELy9NOXdNQUFBQUFBQWdMQjANCit6MzkvLy94SEF3Z0FBQUFBQUFnTEIzZDNSSGQzY0RDQUFBQUFBQUFBZ0xBSGQwUjNjQU1JQUFBQUFBQUFnQWdMY0FBQQ0KK0FBTXdnQWdBQUFBQUNEQUFBQXU3dDdjd0FBZ0RnQUFBQUFCemNJQUFBQUFBQUFnRE13QUFBQUFBTjd1d2dBQUFBQWdIDQorTXpNQUFBQUFDSDk3dHpBQUFBQUx1M2MzZ0FBQUFBQUwrN3R6REFCQXU3ZjdjQUFBQUFBQUNBKzNNQTdFUUF2L3NJQUENCitBQUFBQUFBSUFBQUFBQUFBQUlBQUFBQUENCisNCistLTE2MTg0OTI4NjAtLTIwNTEzMDExOTAtLTExMzg1MzY4MC0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI3LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxOTE3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18yNy50eHQKQEAgLTAsMCArMSwxNSBAQAorUmV0dXJuLVBhdGg6IDxhcGVyc29uQGRvbS5haW4+CitSZWNlaXZlZDogYnkgbWFpbC5kb20uYWluIChQb3N0Zml4LCBmcm9tIHVzZXJpZCA4ODkpCisJaWQgQjlEMEFEMzVEQjsgVHVlLCAgNCBKdW4gMjAwMiAyMTo0Njo1OSAtMDQwMCAoRURUKQorTWVzc2FnZS1JRDogPDE1NjEzLjI4MDUxLjcwNzEyNi41Njk2OTNAZG9tLmFpbj4KK0RhdGU6IFR1ZSwgNCBKdW4gMjAwMiAyMTo0Njo1OSAtMDQwMAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorU3ViamVjdDogYnVnIGRlbW9uc3RyYXRpb24KKwkxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorCW1vcmUgdGV4dAorRnJvbTogYXBlcnNvbkBkb20uYWluIChBbm5lIFAuIEVyc29uKQorVG86IGJwZXJzb25AZG9tLmFpbiAoQmFybmV5IFAuIEVyc29uKQorCit0ZXN0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjgudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTQ4MjRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI4LnR4dApAQCAtMCwwICsxLDI1IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PUJPVU5EQVJZCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitUbzogYWFAYmIub3JnCitGcm9tOiBjY0BkZC5vcmcKK1N1YmplY3Q6IGVlCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaQorVG86IGFhQGJiLm9yZworRnJvbTogY2NAZGQub3JnCitTdWJqZWN0OiBlZQorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMjkudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI5LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFiNTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzI5LnR4dApAQCAtMCwwICsxLDIyIEBACitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWk7CisgICAgIHRpdGxlKjAqPSJ1cy1hc2NpaSdlbidUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CisgICAgIHRpdGxlKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworICAgICB0aXRsZSoyPSJpc24ndCBpdCEiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMzRiYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzAudHh0CkBAIC0wLDAgKzEsMjMgQEAKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9Qk9VTkRBUlkKKworLS1CT1VOREFSWQorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK1RvOiBhYUBiYi5vcmcKK0Zyb206IGNjQGRkLm9yZworU3ViamVjdDogZWUKKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpCitUbzogYWFAYmIub3JnCitGcm9tOiBjY0BkZC5vcmcKK1N1YmplY3Q6IGVlCisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNThlNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzEudHh0CkBAIC0wLDAgKzEsMTUgQEAKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1CT1VOREFSWV8KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzMyLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlYzVhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMi50eHQKQEAgLTAsMCArMSwxNCBAQAorRGVsaXZlcmVkLVRvOiBmcmVlYnNkLWlzcEBmcmVlYnNkLm9yZworRGF0ZTogVHVlLCAyNiBTZXAgMjAwMCAxMjoyMzowMyAtMDUwMAorRnJvbTogQW5uZSBQZXJzb24gPGFwZXJzb25AZXhhbXBsZS5jb20+CitUbzogQmFybmV5IER1ZGUgPGJkdWRlQGV4YW1wbGUuY29tPgorU3ViamVjdDogUmU6IExpbWl0aW5nIFBlcmwgQ1BVIFV0aWxpemF0aW9uLi4uCitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1hbnNpLXgzLjQtMTk2OCcndXMtYXNjaWkKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQorVXNlci1BZ2VudDogTXV0dC8xLjMuOGkKK1NlbmRlcjogb3duZXItZnJlZWJzZC1pc3BARnJlZUJTRC5PUkcKK1ByZWNlZGVuY2U6IGJ1bGsKK1gtTG9vcDogRnJlZUJTRC5vcmcKKworU29tZSBtZXNzYWdlLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzMzLnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQyNzg3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zMy50eHQKQEAgLTAsMCArMSwyOSBAQAorRGVsaXZlcmVkLVRvOiBmcmVlYnNkLWlzcEBmcmVlYnNkLm9yZworRGF0ZTogV2VkLCAyNyBTZXAgMjAwMCAxMToxMTowOSAtMDUwMAorRnJvbTogQW5uZSBQZXJzb24gPGFwZXJzb25AZXhhbXBsZS5jb20+CitUbzogQmFybmV5IER1ZGUgPGJkdWRlQGV4YW1wbGUuY29tPgorU3ViamVjdDogUmU6IExpbWl0aW5nIFBlcmwgQ1BVIFV0aWxpemF0aW9uLi4uCitNaW1lLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvc2lnbmVkOyBtaWNhbGcqPWFuc2kteDMuNC0xOTY4JydwZ3AtbWQ1OworCXByb3RvY29sKj1hbnNpLXgzLjQtMTk2OCcnYXBwbGljYXRpb24lMkZwZ3Atc2lnbmF0dXJlOworCWJvdW5kYXJ5Kj0iYW5zaS14My40LTE5NjgnJ0VlUWZHd1BjUVNPSkJhUVUiCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK1NlbmRlcjogb3duZXItZnJlZWJzZC1pc3BARnJlZUJTRC5PUkcKK1ByZWNlZGVuY2U6IGJ1bGsKK1gtTG9vcDogRnJlZUJTRC5vcmcKKworCistLUVlUWZHd1BjUVNPSkJhUVUKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9YW5zaS14My40LTE5NjgnJ3VzLWFzY2lpCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFibGUKKworcGFydCAxCisKKy0tRWVRZkd3UGNRU09KQmFRVQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKKworcGFydCAyCisKKy0tRWVRZkd3UGNRU09KQmFRVS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzQudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTVkZmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM0LnR4dApAQCAtMCwwICsxLDE5IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9WFlaCisKKy0tWFlaCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworCitUaGlzIGlzIGEgdGV4dCBwbGFpbiBwYXJ0IHRoYXQgaXMgY291bnRlciB0byByZWNvbW1lbmRlZCBwcmFjdGljZSBpbgorUkZDIDIwNDYsICQ1LjEuNSwgYnV0IGlzIG5vdCBpbGxlZ2FsCisKKy0tWFlaCisKK0Zyb206IGNwZXJzb25AZG9tLmFpbgorVG86IGRwZXJzb25AZG9tLmFpbgorCitBIHN1Ym1lc3NhZ2UKKworLS1YWVotLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM1LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3ZDVhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNS50eHQKQEAgLTAsMCArMSw0IEBACitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IGhlcmUncyBzb21ldGhpbmcgaW50ZXJlc3RpbmcKK2NvdW50ZXIgdG8gUkZDIDI4MjIsIHRoZXJlJ3Mgbm8gc2VwYXJhdGluZyBuZXdsaW5lIGhlcmUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zNi50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzJjMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzYudHh0CkBAIC0wLDAgKzEsNDAgQEAKK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IE11bHRpcGFydC9NaXhlZDsgQm91bmRhcnk9Ik5leHRQYXJ0IgorVG86IElFVEYtQW5ub3VuY2U6OworRnJvbTogSW50ZXJuZXQtRHJhZnRzQGlldGYub3JnCitTdWJqZWN0OiBJLUQgQUNUSU9OOmRyYWZ0LWlldGYtbWJvbmVkLW1peC0wMC50eHQKK0RhdGU6IFR1ZSwgMjIgRGVjIDE5OTggMTY6NTU6MDYgLTA1MDAKKworLS1OZXh0UGFydAorCitCbGFoIGJsYWggYmxhaAorCistLU5leHRQYXJ0CitDb250ZW50LVR5cGU6IE11bHRpcGFydC9BbHRlcm5hdGl2ZTsgQm91bmRhcnk9Ik90aGVyQWNjZXNzIgorCistLU90aGVyQWNjZXNzCitDb250ZW50LVR5cGU6IE1lc3NhZ2UvRXh0ZXJuYWwtYm9keTsKKwlhY2Nlc3MtdHlwZT0ibWFpbC1zZXJ2ZXIiOworCXNlcnZlcj0ibWFpbHNlcnZAaWV0Zi5vcmciCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1JRDogPDE5OTgxMjIyMTUxNDA2LkktREBpZXRmLm9yZz4KKworRU5DT0RJTkcgbWltZQorRklMRSAvaW50ZXJuZXQtZHJhZnRzL2RyYWZ0LWlldGYtbWJvbmVkLW1peC0wMC50eHQKKworLS1PdGhlckFjY2VzcworQ29udGVudC1UeXBlOiBNZXNzYWdlL0V4dGVybmFsLWJvZHk7CisJbmFtZT0iZHJhZnQtaWV0Zi1tYm9uZWQtbWl4LTAwLnR4dCI7CisJc2l0ZT0iZnRwLmlldGYub3JnIjsKKwlhY2Nlc3MtdHlwZT0iYW5vbi1mdHAiOworCWRpcmVjdG9yeT0iaW50ZXJuZXQtZHJhZnRzIgorCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0NvbnRlbnQtSUQ6IDwxOTk4MTIyMjE1MTQwNi5JLURAaWV0Zi5vcmc+CisKKworLS1PdGhlckFjY2Vzcy0tCisKKy0tTmV4dFBhcnQtLQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzcudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM3LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzhkMzRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM3LnR4dApAQCAtMCwwICsxLDIyIEBACitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9QUJDREUKKworLS1BQkNERQorQ29udGVudC1UeXBlOiB0ZXh0L3gtb25lCisKK0JsYWgKKworLS1BQkNERQorLS1BQkNERQorQ29udGVudC1UeXBlOiB0ZXh0L3gtdHdvCisKK0JsYWgKKworLS1BQkNERQorLS1BQkNERQorLS1BQkNERQorLS1BQkNERQorQ29udGVudC1UeXBlOiB0ZXh0L3gtdHdvCisKK0JsYWgKKworLS1BQkNERS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfMzgudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkZjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM4LnR4dApAQCAtMCwwICsxLDEwMSBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMCIKKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTEiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMiIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjJAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4zQGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogdmVyeSB0cmlja3kKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworCitVbmxpa2UgdGhlIHRlc3QgdGVzdF9uZXN0ZWQtbXVsdGlwbGVzLXdpdGgtaW50ZXJuYWwtYm91bmRhcnksIHRoaXMKK3BpZWNlIG9mIHRleHQgbm90IG9ubHkgY29udGFpbnMgdGhlIG91dGVyIGJvdW5kYXJ5IHRhZ3MgCistLS0tLS0tID1fYWFhYWFhYWFhYTEgCithbmQgCistLS0tLS0tID1fYWFhYWFhYWFhYTAgCitidXQgcHV0cyB0aGVtIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUhIEFuZCwgdG8gYmUgZXZlbiBuYXN0aWVyLCBpdAorZXZlbiBpbmNsdWRlcyBhIGNvdXBsZSBvZiBlbmQgdGFncywgc3VjaCBhcyB0aGlzIG9uZToKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExLS0KKworYW5kIHRoaXMgb25lLCB3aGljaCBpcyBmcm9tIGEgbXVsdGlwYXJ0IHdlIGhhdmVuJ3QgZXZlbiBzZWVuIHlldCEKKworLS0tLS0tLSA9X2FhYWFhYWFhYWE0LS0KKworVGhpcyB3aWxsLCBJJ20gc3VyZSwgY2F1c2UgbXVjaCBicmVha2FnZSBvZiBNSU1FIHBhcnNlcnMuIEJ1dCwgYXMgCitmYXIgYXMgSSBjYW4gdGVsbCwgaXQncyBwZXJmZWN0bHkgbGVnYWwuIEkgaGF2ZSBub3QgeWV0IGV2ZXIgc2VlbgorYSBjYXNlIG9mIHRoaXMgaW4gdGhlIHdpbGQsIGJ1dCBJJ3ZlIHNlZW4gKnNpbWlsYXIqIHRoaW5ncy4KKworCistLS0tLS0tID1fYWFhYWFhYWFhYTIKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS40QGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2gyCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMi0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSItLS0tLSA9X2FhYWFhYWFhYWEzIgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuNkBleGFtcGxlLmNvbT4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWEzCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuN0BleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoMworQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTMKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS44QGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2g0CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMy0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSItLS0tLSA9X2FhYWFhYWFhYWE0IgorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuMTBAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhNAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjExQGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2g1CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhNAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjEyQGV4YW1wbGUuY29tPgorQ29udGVudC1EZXNjcmlwdGlvbjogcGF0Y2g2CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWFhYCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhNC0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMS0tCisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjE1QGV4YW1wbGUuY29tPgorCistLQorSXQncyBuZXZlciB0b28gbGF0ZSB0byBoYXZlIGEgaGFwcHkgY2hpbGRob29kLgorCistLS0tLS0tID1fYWFhYWFhYWFhYTAtLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzM5LnR4dCBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zOS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0YjI2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ18zOS50eHQKQEAgLTAsMCArMSw4MyBAQAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMCIKKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ii0tLS0tID1fYWFhYWFhYWFhYTEiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjJAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjNAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDEKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuNEBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoMgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjZAZXhhbXBsZS5jb20+CisKKy0tLS0tLS0gPV9hYWFhYWFhYWFhMQorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjdAZXhhbXBsZS5jb20+CitDb250ZW50LURlc2NyaXB0aW9uOiBwYXRjaDMKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitYWFgKKworLS0tLS0tLSA9X2FhYWFhYWFhYWExCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1JRDogPDIwNTkyLjEwMjI1ODY5MjkuOEBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOyBib3VuZGFyeT0iLS0tLS0gPV9hYWFhYWFhYWFhMSIKK0NvbnRlbnQtSUQ6IDwyMDU5Mi4xMDIyNTg2OTI5LjEwQGV4YW1wbGUuY29tPgorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xMUBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xMkBleGFtcGxlLmNvbT4KK0NvbnRlbnQtRGVzY3JpcHRpb246IHBhdGNoNgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CisKK1hYWAorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTEtLQorCistLS0tLS0tID1fYWFhYWFhYWFhYTAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitDb250ZW50LUlEOiA8MjA1OTIuMTAyMjU4NjkyOS4xNUBleGFtcGxlLmNvbT4KKworLS0KK0l0J3MgbmV2ZXIgdG9vIGxhdGUgdG8gaGF2ZSBhIGhhcHB5IGNoaWxkaG9vZC4KKworLS0tLS0tLSA9X2FhYWFhYWFhYWEwLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180MC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzVmYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDAudHh0CkBAIC0wLDAgKzEsMTAgQEAKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgYm91bmRhcnk9Ii0tOTYxMjg0MjM2NTUyNTIyMjY5IgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5CitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKKworPGh0bWw+PC9odG1sPgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5LS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180MS50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Y2RkMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDEudHh0CkBAIC0wLDAgKzEsOCBAQAorRnJvbTogIkFsbGlzb24gRHVubGFwIiA8eHh4QGV4YW1wbGUuY29tPgorVG86IHl5eUBleGFtcGxlLmNvbQorU3ViamVjdDogNjQ0MjMKK0RhdGU6IFN1biwgMTEgSnVsIDIwMDQgMTY6MDk6MjcgLTAzMDAKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKKworQmxhaCBibGFoIGJsYWgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180Mi50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NWY4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDIudHh0CkBAIC0wLDAgKzEsMjAgQEAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQUFBIgorRnJvbTogTWFpbCBEZWxpdmVyeSBTdWJzeXN0ZW0gPHh4eEBleGFtcGxlLmNvbT4KK1RvOiB5eXlAZXhhbXBsZS5jb20KKworVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UKKworLS1BQUEKKworU3R1ZmYKKworLS1BQUEKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKKworRnJvbTogd2VibWFzdGVyQHB5dGhvbi5vcmcKK1RvOiB6enpAZXhhbXBsZS5jb20KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQkJCIgorCistLUJCQi0tCisKKy0tQUFBLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180My50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5N2QxMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDMudHh0CkBAIC0wLDAgKzEsMjE3IEBACitGcm9tIFNSUzA9YU8vcD1PTj1iYWcucHl0aG9uLm9yZz1Ob25lQGJvdW5jZTIucG9ib3guY29tICBGcmkgTm92IDI2IDIxOjQwOjM2IDIwMDQKK1gtVk0tdjUtRGF0YTogKFtuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsIG5pbF0KKwlbbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsICJNQUlMRVIgREFFTU9OIDw+IiAiTUFJTEVSIERBRU1PTiA8PiIgbmlsIG5pbCAiQmFubmVkIGZpbGU6IGF1dG9fX21haWwucHl0aG9uLmJhdCBpbiBtYWlsIGZyb20geW91IiAiXkZyb206IiBuaWwgbmlsIG5pbCBuaWwgIkJhbm5lZCBmaWxlOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQgaW4gbWFpbCBmcm9tIHlvdSIgbmlsIG5pbCBuaWwgbmlsIG5pbCBuaWwgbmlsXQorCW5pbCkKK01JTUUtVmVyc2lvbjogMS4wCitNZXNzYWdlLUlkOiA8ZWRhYi43ODA0ZjVjYjgwNzBAcHl0aG9uLm9yZz4KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3JlcG9ydDsgcmVwb3J0LXR5cGU9ZGVsaXZlcnktc3RhdHVzOworICAgIGNoYXJzZXQ9dXRmLTg7CisgICAgYm91bmRhcnk9Ii0tLS0tLS0tLS09XzExMDE1MjY5MDQtMTk1Ni01IgorWC1WaXJ1cy1TY2FubmVkOiBieSBYUzRBTEwgVmlydXMgU2Nhbm5lcgorWC1VSURMOiA0XEchISE8YyIhVVZbIiFNN0MhIQorRnJvbTogTUFJTEVSIERBRU1PTiA8PgorVG86IDx3ZWJtYXN0ZXJAcHl0aG9uLm9yZz4KK1N1YmplY3Q6IEJhbm5lZCBmaWxlOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQgaW4gbWFpbCBmcm9tIHlvdQorRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0Li4uCisKKy0tLS0tLS0tLS0tLT1fMTEwMTUyNjkwNC0xOTU2LTUKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXRmLTgiCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworQkFOTkVEIEZJTEVOQU1FIEFMRVJUCisKK1lvdXIgbWVzc2FnZSB0bzogeHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHhAZG90LmNhLmdvdiwgeHh4QGRvdC5jYS5nb3YsIHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHhAZG90LmNhLmdvdiwgeHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eEBkb3QuY2EuZ292LCB4eHh4eHh4eHh4QGRvdC5jYS5nb3YsIHh4eHh4eHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292Cit3YXMgYmxvY2tlZCBieSBvdXIgU3BhbSBGaXJld2FsbC4gVGhlIGVtYWlsIHlvdSBzZW50IHdpdGggdGhlIGZvbGxvd2luZyBzdWJqZWN0IGhhcyBOT1QgQkVFTiBERUxJVkVSRUQ6CisKK1N1YmplY3Q6IERlbGl2ZXJ5X2ZhaWx1cmVfbm90aWNlCisKK0FuIGF0dGFjaG1lbnQgaW4gdGhhdCBtYWlsIHdhcyBvZiBhIGZpbGUgdHlwZSB0aGF0IHRoZSBTcGFtIEZpcmV3YWxsIGlzIHNldCB0byBibG9jay4KKworCisKKy0tLS0tLS0tLS0tLT1fMTEwMTUyNjkwNC0xOTU2LTUKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorQ29udGVudC1EZXNjcmlwdGlvbjogRGVsaXZlcnkgZXJyb3IgcmVwb3J0CisKK1JlcG9ydGluZy1NVEE6IGRuczsgc2Fjc3BhbTAxLmRvdC5jYS5nb3YKK1JlY2VpdmVkLUZyb20tTVRBOiBzbXRwOyBzYWNzcGFtMDEuZG90LmNhLmdvdiAoWzEyNy4wLjAuMV0pCitBcnJpdmFsLURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKK0ZpbmFsLVJlY2lwaWVudDogcmZjODIyOyB4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eHh4eHh4eHh4QGRvdC5jYS5nb3YKK0FjdGlvbjogZmFpbGVkCitTdGF0dXM6IDUuNy4xCitEaWFnbm9zdGljLUNvZGU6IHNtdHA7IDU1MCA1LjcuMSBNZXNzYWdlIGNvbnRlbnQgcmVqZWN0ZWQsIGlkPTAxOTU2LTAyLTIgLSBCQU5ORUQ6IGF1dG9fX21haWwucHl0aG9uLmJhdAorTGFzdC1BdHRlbXB0LURhdGU6IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6NDQgLTA4MDAgKFBTVCkKKworRmluYWwtUmVjaXBpZW50OiByZmM4MjI7IHh4eHh4eHh4eHhAZG90LmNhLmdvdgorQWN0aW9uOiBmYWlsZWQKK1N0YXR1czogNS43LjEKK0RpYWdub3N0aWMtQ29kZTogc210cDsgNTUwIDUuNy4xIE1lc3NhZ2UgY29udGVudCByZWplY3RlZCwgaWQ9MDE5NTYtMDItMiAtIEJBTk5FRDogYXV0b19fbWFpbC5weXRob24uYmF0CitMYXN0LUF0dGVtcHQtRGF0ZTogRnJpLCAyNiBOb3YgMjAwNCAxOTo0MTo0NCAtMDgwMCAoUFNUKQorCitGaW5hbC1SZWNpcGllbnQ6IHJmYzgyMjsgeHh4eHh4eEBkb3QuY2EuZ292CitBY3Rpb246IGZhaWxlZAorU3RhdHVzOiA1LjcuMQorRGlhZ25vc3RpYy1Db2RlOiBzbXRwOyA1NTAgNS43LjEgTWVzc2FnZSBjb250ZW50IHJlamVjdGVkLCBpZD0wMTk1Ni0wMi0yIC0gQkFOTkVEOiBhdXRvX19tYWlsLnB5dGhvbi5iYXQKK0xhc3QtQXR0ZW1wdC1EYXRlOiBGcmksIDI2IE5vdiAyMDA0IDE5OjQxOjQ0IC0wODAwIChQU1QpCisKKy0tLS0tLS0tLS0tLT1fMTEwMTUyNjkwNC0xOTU2LTUKK0NvbnRlbnQtVHlwZTogdGV4dC9yZmM4MjItaGVhZGVycworQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitDb250ZW50LURlc2NyaXB0aW9uOiBVbmRlbGl2ZXJlZC1tZXNzYWdlIGhlYWRlcnMKKworUmVjZWl2ZWQ6IGZyb20ga2dzYXYub3JnIChwcHAtNzAtMjQyLTE2Mi02My5kc2wuc3BmZG1vLnN3YmVsbC5uZXQgWzcwLjI0Mi4xNjIuNjNdKQorCWJ5IHNhY3NwYW0wMS5kb3QuY2EuZ292IChTcGFtIEZpcmV3YWxsKSB3aXRoIFNNVFAKKwlpZCBBMjMyQUQwM0RFM0E7IEZyaSwgMjYgTm92IDIwMDQgMTk6NDE6MzUgLTA4MDAgKFBTVCkKK0Zyb206IHdlYm1hc3RlckBweXRob24ub3JnCitUbzogeHh4eHhAZG90LmNhLmdvdgorRGF0ZTogU2F0LCAyNyBOb3YgMjAwNCAwMzozNTozMCBVVEMKK1N1YmplY3Q6IERlbGl2ZXJ5X2ZhaWx1cmVfbm90aWNlCitJbXBvcnRhbmNlOiBOb3JtYWwKK1gtUHJpb3JpdHk6IDMgKE5vcm1hbCkKK1gtTVNNYWlsLVByaW9yaXR5OiBOb3JtYWwKK01lc3NhZ2UtSUQ6IDxlZGFiLjc4MDRmNWNiODA3MEBweXRob24ub3JnPgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iPT09PTY3YmQyYjdhNS5mOTlmNyIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworLS0tLS0tLS0tLS0tPV8xMTAxNTI2OTA0LTE5NTYtNS0tCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180NC50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YTIyNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDQudHh0CkBAIC0wLDAgKzEsMzMgQEAKK1JldHVybi1QYXRoOiA8YmFycnlAcHl0aG9uLm9yZz4KK0RlbGl2ZXJlZC1UbzogYmFycnlAcHl0aG9uLm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwucHl0aG9uLm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorCWlkIEMyQkYwRDM3QzY7IFR1ZSwgMTEgU2VwIDIwMDEgMDA6MDU6MDUgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Img5MFZJSUlLbXgiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUyNjEuMzYyMDkuMzU4ODQ2LjExODY3NEBhbnRoZW0ucHl0aG9uLm9yZz4KK0Zyb206IGJhcnJ5QHB5dGhvbi5vcmcgKEJhcnJ5IEEuIFdhcnNhdykKK1RvOiBiYXJyeUBweXRob24ub3JnCitTdWJqZWN0OiBhIHNpbXBsZSBtdWx0aXBhcnQKK0RhdGU6IFR1ZSwgMTEgU2VwIDIwMDEgMDA6MDU6MDUgLTA0MDAKK1gtTWFpbGVyOiBWTSA2Ljk1IHVuZGVyIDIxLjQgKHBhdGNoIDQpICJBcnRpZmljaWFsIEludGVsbGlnZW5jZSIgWEVtYWNzIEx1Y2lkCitYLUF0dHJpYnV0aW9uOiBCQVcKK1gtT2JsaXF1ZS1TdHJhdGVneTogTWFrZSBhIGRvb3IgaW50byBhIHdpbmRvdworCisKKy0taDkwVklJSUtteAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBuYW1lPSJtc2cudHh0IgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKworLS1oOTBWSUlJS214CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IG5hbWU9Im1zZy50eHQiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorCistLWg5MFZJSUlLbXgtLQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDUudHh0IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ1LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGZkZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L2RhdGEvbXNnXzQ1LnR4dApAQCAtMCwwICsxLDMzIEBACitGcm9tOiA8Zm9vQGJhci5iYXo+CitUbzogPGJhekBiYXIuZm9vPgorU3ViamVjdDogdGVzdAorWC1Mb25nLUxpbmU6IFNvbWUgcmVhbGx5IGxvbmcgbGluZSBjb250YWlucyBhIGxvdCBvZiB0ZXh0IGFuZCB0aHVzIGhhcyB0byBiZSByZXdyYXBwZWQgYmVjYXVzZSBpdCBpcyBzb21lCisJcmVhbGx5IGxvbmcKKyAgICAgICAgbGluZQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L3NpZ25lZDsgYm91bmRhcnk9ImJvcmRlcmxpbmUiOworCXByb3RvY29sPSJhcHBsaWNhdGlvbi9wZ3Atc2lnbmF0dXJlIjsgbWljYWxnPXBncC1zaGExCisKK1RoaXMgaXMgYW4gT3BlblBHUC9NSU1FIHNpZ25lZCBtZXNzYWdlIChSRkMgMjQ0MCBhbmQgMzE1NikKKy0tYm9yZGVybGluZQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitYLUxvbmctTGluZTogQW5vdGhlciByZWFsbHkgbG9uZyBsaW5lIGNvbnRhaW5zIGEgbG90IG9mIHRleHQgYW5kIHRodXMgaGFzIHRvIGJlIHJld3JhcHBlZCBiZWNhdXNlIGl0IGlzIGFub3RoZXIKKwlyZWFsbHkgbG9uZworICAgICAgICBsaW5lCisKK1RoaXMgaXMgdGhlIHNpZ25lZCBjb250ZW50cy4KKworLS1ib3JkZXJsaW5lCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmU7IG5hbWU9InNpZ25hdHVyZS5hc2MiCitDb250ZW50LURlc2NyaXB0aW9uOiBPcGVuUEdQIGRpZ2l0YWwgc2lnbmF0dXJlCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0ic2lnbmF0dXJlLmFzYyIKKworLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0KK1ZlcnNpb246IEdudVBHIHYyLjAuNiAoR05VL0xpbnV4KQorCitpRDhEQlFGRzAzdm9SaHA2bzRtOWRGc1JBcFNaQUtDQ0FOM0lrSmxWUmc2TnZBaU1IbHZ2SXVNR1BRQ2VMWnRqCitGR3dmblJIRkJGTy9TNC9ES3lzbTBsST0KKz10NytzCistLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS0KKworLS1ib3JkZXJsaW5lLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC9kYXRhL21zZ180Ni50eHQgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjJjNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvZGF0YS9tc2dfNDYudHh0CkBAIC0wLDAgKzEsMjMgQEAKK1JldHVybi1QYXRoOiA8c2VuZGVyQGV4YW1wbGUubmV0PgorRGVsaXZlcnktRGF0ZTogTW9uLCAwOCBGZWIgMjAxMCAxNDowNToxNiArMDEwMAorUmVjZWl2ZWQ6IGZyb20gZXhhbXBsZS5vcmcgKGV4YW1wbGUub3JnIFs2NC41LjUzLjU4XSkKKyAgICBieSBleGFtcGxlLm5ldCAobm9kZT1teGJhcDIpIHdpdGggRVNNVFAgKE5lbWVzaXMpCisgICAgaWQgVU5JUVVFIGZvciBzb21lb25lQGV4YW1wbGUuY29tOyBNb24sIDA4IEZlYiAyMDEwIDE0OjA1OjE2ICswMTAwCitEYXRlOiBNb24sIDAxIEZlYiAyMDEwIDEyOjIxOjE2ICswMTAwCitGcm9tOiAiU2VuZGVyIiA8c2VuZGVyQGV4YW1wbGUubmV0PgorVG86IDxzb21lb25lQGV4YW1wbGUuY29tPgorU3ViamVjdDogR3JvdXB3aXNlRm9yd2FyZGluZ1Rlc3QKK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCisKK1JldHVybi1wYXRoOiA8c2VuZGVyQGV4YW1wbGUubmV0PgorTWVzc2FnZS1JRDogPDRCNjZCODkwLjQwNzA0MDhAdGVjb25jZXB0LmRlPgorRGF0ZTogTW9uLCAwMSBGZWIgMjAxMCAxMjoxODo0MCArMDEwMAorRnJvbTogIkRyLiBTZW5kZXIiIDxzZW5kZXJAZXhhbXBsZS5uZXQ+CitNSU1FLVZlcnNpb246IDEuMAorVG86ICJSZWNpcGllbnQiIDxyZWNpcGllbnRAZXhhbXBsZS5jb20+CitTdWJqZWN0OiBHcm91cHdpc2VGb3J3YXJkaW5nVGVzdAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTE1CitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1Rlc3RpbmcgZW1haWwgZm9yd2FyZGluZyB3aXRoIEdyb3Vwd2lzZSAxLjIuMjAxMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJkYTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKQEAgLTAsMCArMSwzNTU4IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCB0ZXh0d3JhcAorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2ltcG9ydCBlbWFpbAorCitmcm9tIGVtYWlsLkNoYXJzZXQgaW1wb3J0IENoYXJzZXQKK2Zyb20gZW1haWwuSGVhZGVyIGltcG9ydCBIZWFkZXIsIGRlY29kZV9oZWFkZXIsIG1ha2VfaGVhZGVyCitmcm9tIGVtYWlsLlBhcnNlciBpbXBvcnQgUGFyc2VyLCBIZWFkZXJQYXJzZXIKK2Zyb20gZW1haWwuR2VuZXJhdG9yIGltcG9ydCBHZW5lcmF0b3IsIERlY29kZWRHZW5lcmF0b3IKK2Zyb20gZW1haWwuTWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorZnJvbSBlbWFpbC5NSU1FQXVkaW8gaW1wb3J0IE1JTUVBdWRpbworZnJvbSBlbWFpbC5NSU1FVGV4dCBpbXBvcnQgTUlNRVRleHQKK2Zyb20gZW1haWwuTUlNRUltYWdlIGltcG9ydCBNSU1FSW1hZ2UKK2Zyb20gZW1haWwuTUlNRUJhc2UgaW1wb3J0IE1JTUVCYXNlCitmcm9tIGVtYWlsLk1JTUVNZXNzYWdlIGltcG9ydCBNSU1FTWVzc2FnZQorZnJvbSBlbWFpbC5NSU1FTXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0Citmcm9tIGVtYWlsIGltcG9ydCBVdGlscworZnJvbSBlbWFpbCBpbXBvcnQgRXJyb3JzCitmcm9tIGVtYWlsIGltcG9ydCBFbmNvZGVycworZnJvbSBlbWFpbCBpbXBvcnQgSXRlcmF0b3JzCitmcm9tIGVtYWlsIGltcG9ydCBiYXNlNjRNSU1FCitmcm9tIGVtYWlsIGltcG9ydCBxdW9wcmlNSU1FCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBydW5fdW5pdHRlc3QKK2Zyb20gZW1haWwudGVzdCBpbXBvcnQgX19maWxlX18gYXMgbGFuZG1hcmsKKworCitOTCA9ICdcbicKK0VNUFRZU1RSSU5HID0gJycKK1NQQUNFID0gJyAnCisKKworCitkZWYgb3BlbmZpbGUoZmlsZW5hbWUsIG1vZGU9J3InKToKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgZmlsZW5hbWUpCisgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSkKKworCisKKyMgQmFzZSB0ZXN0IGNsYXNzCitjbGFzcyBUZXN0RW1haWxCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbmRpZmZBc3NlcnRFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kKToKKyAgICAgICAgIiIiTGlrZSBhc3NlcnRFcXVhbCBleGNlcHQgdXNlIG5kaWZmIGZvciByZWFkYWJsZSBvdXRwdXQuIiIiCisgICAgICAgIGlmIGZpcnN0ICE9IHNlY29uZDoKKyAgICAgICAgICAgIHNmaXJzdCA9IHN0cihmaXJzdCkKKyAgICAgICAgICAgIHNzZWNvbmQgPSBzdHIoc2Vjb25kKQorICAgICAgICAgICAgZGlmZiA9IGRpZmZsaWIubmRpZmYoc2ZpcnN0LnNwbGl0bGluZXMoKSwgc3NlY29uZC5zcGxpdGxpbmVzKCkpCisgICAgICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHByaW50ID4+IGZwLCBOTCwgTkwuam9pbihkaWZmKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBmcC5nZXR2YWx1ZSgpCisKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmluZGZpbGUoZmlsZW5hbWUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIG1zZworCisKKworIyBUZXN0IHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgTWVzc2FnZSBjbGFzcydzIEFQSQorY2xhc3MgVGVzdE1lc3NhZ2VBUEkoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfZ2V0X2FsbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzIwLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCdjYycpLCBbJ2NjY0B6enoub3JnJywgJ2RkZEB6enoub3JnJywgJ2VlZUB6enoub3JnJ10pCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCd4eCcsICduL2EnKSwgJ24vYScpCisKKyAgICBkZWYgdGVzdF9nZXRzZXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgZXEobXNnWydtaW1lLXZlcnNpb24nXSwgJzEuMCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAnaXNvLTg4NTktMScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVvdGVkLXByaW50YWJsZScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICdpc28tODg1OS0xJykKKyAgICAgICAgIyBSZW1vdmUgdGhlIGNoYXJzZXQKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLCBOb25lKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgVHJ5IGFkZGluZyBhIGNoYXJzZXQgd2hlbiB0aGVyZSdzIGFscmVhZHkgTUlNRSBoZWFkZXJzIHByZXNlbnQKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snTUlNRS1WZXJzaW9uJ10gPSAnMi4wJworICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQveC13ZWlyZCcKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAncXVpbnRlZC1wdW50YWJsZScKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcyLjAnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC94LXdlaXJkOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVpbnRlZC1wdW50YWJsZScpCisKKyAgICBkZWYgdGVzdF9zZXRfY2hhcnNldF9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF9zZXRfcGF5bG9hZF93aXRoX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnVGhpcyBpcyBhIHN0cmluZyBwYXlsb2FkJywgY2hhcnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF9nZXRfY2hhcnNldHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA4LnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnaXNvLTg4NTktMicsICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOS50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoJ2RpbmdiYXQnKQorICAgICAgICBlcShjaGFyc2V0cywgWydkaW5nYmF0JywgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnZGluZ2JhdCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2tvaTgtciddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEyLnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCBOb25lLCAnaXNvLTg4NTktMicsCisgICAgICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLCAndXMtYXNjaWknLCAna29pOC1yJ10pCisKKyAgICBkZWYgdGVzdF9nZXRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9maWxlbmFtZSgpLCAnZGluZ3VzZmlzaC5naWYnKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lX3dpdGhfbmFtZV9wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQ0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICBkZWYgdGVzdF9nZXRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQorICAgICAgICAjIE5vIHF1b3RlcyEKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3Rfc2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG9uZSBoYXMgbm8gZXhpc3RpbmcgYm91bmRhcnkgcGFyYW1ldGVyLCBidXQgdGhlIENvbnRlbnQtVHlwZToKKyAgICAgICAgIyBoZWFkZXIgYXBwZWFycyBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgVGhpcyBvbmUgaGFzIGEgQ29udGVudC1UeXBlOiBoZWFkZXIsIHdpdGggYSBib3VuZGFyeSwgc3R1Y2sgaW4gdGhlCisgICAgICAgICMgbWlkZGxlIG9mIGl0cyBoZWFkZXJzLiAgTWFrZSBzdXJlIHRoZSBvcmRlciBpcyBwcmVzZXJ2ZWQ7IGl0IHNob3VsZAorICAgICAgICAjIGJlIGZpZnRoLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGhlYWRlciwgdmFsdWUgPSBtc2cuaXRlbXMoKVs0XQorICAgICAgICBlcShoZWFkZXIubG93ZXIoKSwgJ2NvbnRlbnQtdHlwZScpCisgICAgICAgIGVxKHZhbHVlLCAnbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiJykKKyAgICAgICAgIyBBbmQgdGhpcyBvbmUgaGFzIG5vIENvbnRlbnQtVHlwZTogaGVhZGVyIGF0IGFsbC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXJyb3JzLkhlYWRlclBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zZXRfYm91bmRhcnksICdCT1VOREFSWScpCisKKyAgICBkZWYgdGVzdF9tYWtlX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2cgPSBNSU1FTXVsdGlwYXJ0KCdmb3JtLWRhdGEnKQorICAgICAgICAjIE5vdGUgdGhhdCB3aGVuIHRoZSBib3VuZGFyeSBnZXRzIGNyZWF0ZWQgaXMgYW4gaW1wbGVtZW50YXRpb24KKyAgICAgICAgIyBkZXRhaWwgYW5kIG1pZ2h0IGNoYW5nZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuaXRlbXMoKVswXVsxXSwgJ211bHRpcGFydC9mb3JtLWRhdGEnKQorICAgICAgICAjIFRyaWdnZXIgY3JlYXRpb24gb2YgYm91bmRhcnkKKyAgICAgICAgbXNnLmFzX3N0cmluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLml0ZW1zKClbMF1bMV1bOjMzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0iPT0nKQorICAgICAgICAjIFhYWDogdGhlcmUgb3VnaHQgdG8gYmUgdGVzdHMgb2YgdGhlIHVuaXF1ZW5lc3Mgb2YgdGhlIGJvdW5kYXJ5LCB0b28uCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX3JmYzgyMl9vbmx5KHNlbGYpOgorICAgICAgICAjIElzc3VlIDc5NzA6IG1lc3NhZ2UvcmZjODIyIG5vdCBpbiBtdWx0aXBhcnQgcGFyc2VkIGJ5CisgICAgICAgICMgSGVhZGVyUGFyc2VyIGNhdXNlZCBhbiBleGNlcHRpb24gd2hlbiBmbGF0dGVuZWQuCisgICAgICAgIGZwID0gb3BlbmZpbGUoZmluZGZpbGUoJ21zZ180Ni50eHQnKSkKKyAgICAgICAgbXNnZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBwYXJzZXIgPSBlbWFpbC5QYXJzZXIuSGVhZGVyUGFyc2VyKCkKKyAgICAgICAgbXNnID0gcGFyc2VyLnBhcnNlc3RyKG1zZ2RhdGEpCisgICAgICAgIG91dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZ2VuID0gZW1haWwuR2VuZXJhdG9yLkdlbmVyYXRvcihvdXQsIFRydWUsIDApCisgICAgICAgIGdlbi5mbGF0dGVuKG1zZywgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksIG1zZ2RhdGEpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTAudHh0JykKKyAgICAgICAgIyBUaGUgb3V0ZXIgbWVzc2FnZSBpcyBhIG11bHRpcGFydAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBOb25lKQorICAgICAgICAjIFN1YnBhcnQgMSBpcyA3Yml0IGVuY29kZWQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDApLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSA3Yml0IGVuY29kZWQgbWVzc2FnZS5cbicpCisgICAgICAgICMgU3VicGFydCAyIGlzIHF1b3ByaQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnXHhhMVRoaXMgaXMgYSBRdW90ZWQgUHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSFcbicpCisgICAgICAgICMgU3VicGFydCAzIGlzIGJhc2U2NAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMikuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UuJykKKyAgICAgICAgIyBTdWJwYXJ0IDQgaXMgYmFzZTY0IHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLCB3aGljaAorICAgICAgICAjIHVzZWQgdG8gYmUgc3RyaXBwZWQgKGlzc3VlIDcxNDMpLgorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMykuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICAjIFN1YnBhcnQgNSBoYXMgbm8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogaGVhZGVyLgorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoNCkuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBoYXMgbm8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogaGVhZGVyLlxuJykKKworICAgIGRlZiB0ZXN0X2dldF9kZWNvZGVkX3V1X3BheWxvYWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdiZWdpbiA2NjYgLVxuKzomNUw7JlxcQD1WXVI7JjAgXG4gXG5lbmRcbicpCisgICAgICAgIGZvciBjdGUgaW4gKCd4LXV1ZW5jb2RlJywgJ3V1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZScpOgorICAgICAgICAgICAgbXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10gPSBjdGUKKyAgICAgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksICdoZWxsbyB3b3JsZCcpCisgICAgICAgICMgTm93IHRyeSBzb21lIGJvZ3VzIGRhdGEKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdmb28nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnZm9vJykKKworICAgIGRlZiB0ZXN0X2RlY29kZV9ib2d1c191dV9wYXlsb2FkX3F1aWV0bHkoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2JlZ2luIDY2NCBmb28udHh0XG4lPFcxRj0wMDAwSCBcbiBcbmVuZFxuJykKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAneC11dWVuY29kZScKKyAgICAgICAgb2xkX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICMgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcGF5bG9hZAorICAgICAgICAgICAgbXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9sZF9zdGRlcnIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZnAuZ2V0dmFsdWUoKSwgJycpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVkX2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xNy50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBEZWNvZGVkR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHMuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X19jb250YWluc19fKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCisgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCisgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRlJPTScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUTycgaW4gbXNnKQorCisgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgQkFXIDMwLU1hci0yMDA5IEV2aWwgYmUgaGVyZS4gIFNvLCB0aGUgZ2VuZXJhdG9yIGlzIGJyb2tlbiB3aXRoCisgICAgICAgICAgICAjIHJlc3BlY3QgdG8gbG9uZyBsaW5lIGJyZWFraW5nLiAgSXQncyBhbHNvIG5vdCBpZGVtcG90ZW50IHdoZW4gYQorICAgICAgICAgICAgIyBoZWFkZXIgZnJvbSBhIHBhcnNlZCBtZXNzYWdlIGlzIGNvbnRpbnVlZCB3aXRoIHRhYnMgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICMgc3BhY2VzLiAgQmVmb3JlIHdlIGZpeGVkIGJ1ZyAxOTc0IGl0IHdhcyByZXZlcnNlZGx5IGJyb2tlbiwKKyAgICAgICAgICAgICMgaS5lLiBoZWFkZXJzIHRoYXQgd2VyZSBjb250aW51ZWQgd2l0aCBzcGFjZXMgZ290IGNvbnRpbnVlZCB3aXRoCisgICAgICAgICAgICAjIHRhYnMuICBGb3IgUHl0aG9uIDIueCB0aGVyZSdzIHJlYWxseSBubyBnb29kIGZpeCBhbmQgaW4gUHl0aG9uCisgICAgICAgICAgICAjIDMueCBhbGwgdGhpcyBzdHVmZiBpcyByZS13cml0dGVuIHRvIGJlIHJpZ2h0KGVyKS4gIENocmlzIFdpdGhlcnMKKyAgICAgICAgICAgICMgY29udmluY2VkIG1lIHRoYXQgdXNpbmcgc3BhY2UgYXMgdGhlIGRlZmF1bHQgY29udGludWF0aW9uCisgICAgICAgICAgICAjIGNoYXJhY3RlciBpcyBsZXNzIGJhZCBmb3IgbW9yZSBhcHBsaWNhdGlvbnMuCisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpLnJlcGxhY2UoJ1x0JywgJyAnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBlcSh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCisgICAgICAgIGZ1bGxyZXByID0gc3RyKG1zZykKKyAgICAgICAgbGluZXMgPSBmdWxscmVwci5zcGxpdCgnXG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGluZXNbMF0uc3RhcnRzd2l0aCgnRnJvbSAnKSkKKyAgICAgICAgZXEodGV4dCwgTkwuam9pbihsaW5lc1sxOl0pKQorCisgICAgZGVmIHRlc3RfYmFkX3BhcmFtKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJDb250ZW50LVR5cGU6IGJsYXJnOyBiYXo7IGJvb1xuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdiYXonKSwgJycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJGcm9tOiBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfYm9ndXNfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBibGFyZzsgZmlsZW5hbWVcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCAnJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfYm91bmRhcnkoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIkZyb206IGZvb1xuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2JvdW5kYXJ5KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vPW9uZTsgYmFyPXR3bzsgYmF6PXRocmVlXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICdvbmUnKSwgKCdiYXInLCAndHdvJyksICgnYmF6JywgJ3RocmVlJyldKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb287IGJhcj1vbmU7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJycpLCAoJ2JhcicsICdvbmUnKSwgKCdiYXonLCAndHdvJyldKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBOb25lKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb287IGJhcj0ib25lIjsgYmF6PXR3b1xuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnJyksICgnYmFyJywgJ29uZScpLCAoJ2JheicsICd0d28nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fbGliZXJhbChzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnQ29udGVudC1UeXBlOiBNdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5ID0gIkNQSU1TU01UUEMwNnA1ZjN0RyInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYm91bmRhcnknKSwgJ0NQSU1TU01UUEMwNnA1ZjN0RycpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgIlgtSGVhZGVyOiBmb289b25lOyBiYXI9dHdvOyBiYXo9dGhyZWVcbiIpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JhcicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ3R3bycpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3F1dXonLCBoZWFkZXI9J3gtaGVhZGVyJyksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3F1dXonKSwgTm9uZSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9Im9uZSI7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ZvbycsIGhlYWRlcj0neC1oZWFkZXInKSwgJycpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JhcicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ29uZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JheicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ3R3bycpCisgICAgICAgICMgWFhYOiBXZSBhcmUgbm90IFJGQy0yMDQ1IGNvbXBsaWFudCEgIFdlIGNhbm5vdCBwYXJzZToKKyAgICAgICAgIyBtc2dbIkNvbnRlbnQtVHlwZSJdID0gJ3RleHQvcGxhaW47IHdlaXJkPSJoZXk7IGRvbGx5PyBbeW91XSBAIDxcXCJob21lXFwiPj8iJworICAgICAgICAjIG1zZy5nZXRfcGFyYW0oIndlaXJkIikKKyAgICAgICAgIyB5ZXQuCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fZnVua3lfY29udGludWF0aW9uX2xpbmVzKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMi50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgxKS5nZXRfcGFyYW0oJ25hbWUnKSwgJ3dpYmJsZS5KUEcnKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX3dpdGhfc2VtaXNfaW5fcXVvdGVzKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogaW1hZ2UvcGpwZWc7IG5hbWU9IkppbSZhbXA7JmFtcDtKaWxsIlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCduYW1lJyksICdKaW0mYW1wOyZhbXA7SmlsbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnbmFtZScsIHVucXVvdGU9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICciSmltJmFtcDsmYW1wO0ppbGwiJykKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbV93aXRoX3F1b3RlcyhzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGZvbzsgYmFyKjA9ImJhelxcImZvb2JhciI7IGJhcioxPSJcXCJiYXoiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdiYXInKSwgJ2JheiJmb29iYXIiYmF6JykKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IGZvbzsgYmFyKjA9XCJiYXpcXFwiZm9vYmFyXCI7IGJhcioxPVwiXFxcImJhelwiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdiYXInKSwgJ2JheiJmb29iYXIiYmF6JykKKworICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoJ0hlYWRlcjogZXhpc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5oYXNfa2V5KCdoZWFkZXInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5oYXNfa2V5KCdIZWFkZXInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5oYXNfa2V5KCdIRUFERVInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cuaGFzX2tleSgnaGVhZGVyaScpKQorCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICdpc28tMjAyMi1qcCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ltcG9ydGFuY2UnKSwgJ2hpZ2ggdmFsdWUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdpbXBvcnRhbmNlJywgdW5xdW90ZT1GYWxzZSksICciaGlnaCB2YWx1ZSInKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBbKCd0ZXh0L3BsYWluJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjaGFyc2V0JywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXModW5xdW90ZT1GYWxzZSksIFsoJ3RleHQvcGxhaW4nLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NoYXJzZXQnLCAnImlzby0yMDIyLWpwIicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbXBvcnRhbmNlJywgJyJoaWdoIHZhbHVlIicpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICdpc28tOTk5OS14eCcsIGhlYWRlcj0nWC1KaW1teScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBoZWFkZXI9J1gtSmltbXknKSwgJ2lzby05OTk5LXh4JykKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA1LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksICgncmVwb3J0LXR5cGUnLCAnZGVsaXZlcnktc3RhdHVzJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKV0pCisgICAgICAgIG9sZF92YWwgPSBtc2cuZ2V0X3BhcmFtKCJyZXBvcnQtdHlwZSIpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oInJlcG9ydC10eXBlIikKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgicmVwb3J0LXR5cGUiLCBvbGRfdmFsKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyksCisgICAgICAgICAgICAoJ3JlcG9ydC10eXBlJywgb2xkX3ZhbCldKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLCBmaWxlbmFtZT0nYnVkLmdpZicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZpbGVuYW1lJywgJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snY29udGVudC1kaXNwb3NpdGlvbiddLCAnYXR0YWNobWVudCcpCisKKyAgICBkZWYgdGVzdF9zZXRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtc2cuc2V0X3R5cGUsICd0ZXh0JykKKyAgICAgICAgbXNnLnNldF90eXBlKCd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisgICAgICAgIG1zZy5zZXRfdHlwZSgndGV4dC9odG1sJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvaHRtbDsgY2hhcnNldD0idXMtYXNjaWkiJykKKworICAgIGRlZiB0ZXN0X3NldF90eXBlX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snWC1Db250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluJworICAgICAgICBtc2cuc2V0X3R5cGUoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICdYLUNvbnRlbnQtVHlwZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWyd4LWNvbnRlbnQtdHlwZSddLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9lcnJvcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnbm8tc2xhc2gtaW4tdGhpcy1zdHJpbmcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ25vLXNsYXNoLWluLXRoaXMtc3RyaW5nJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnT25lJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ1NlY29uZCcsICdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignVGhpcmQnLCAnVGhyZWUnKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3bycsICdUaHJlZSddKQorICAgICAgICBtc2cucmVwbGFjZV9oZWFkZXIoJ1NlY29uZCcsICdUd2VudHknKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3ZW50eScsICdUaHJlZSddKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnRWxldmVuJykKKyAgICAgICAgbXNnLnJlcGxhY2VfaGVhZGVyKCdGaXJzdCcsICdPbmUgSHVuZHJlZCcpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJywgJ0ZpcnN0J10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUgSHVuZHJlZCcsICdUd2VudHknLCAnVGhyZWUnLCAnRWxldmVuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBtc2cucmVwbGFjZV9oZWFkZXIsICdGb3VydGgnLCAnTWlzc2luZycpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fYmFzZTY0X3BheWxvYWQoc2VsZik6CisgICAgICAgIHggPSAnQXdEcDBQNy8veTZMd0tFQWNQYS82UT05JworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydjb250ZW50LXR5cGUnXSA9ICdhdWRpby94LW1pZGknCisgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gJ2Jhc2U2NCcKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgeCkKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgndXMtYXNjaWknLCBtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQodSd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3VzLWFzY2lpJywgbXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSkKKworICAgICMgSXNzdWUgNTg3MTogcmVqZWN0IGFuIGF0dGVtcHQgdG8gZW1iZWQgYSBoZWFkZXIgaW5zaWRlIGEgaGVhZGVyIHZhbHVlCisgICAgIyAoaGVhZGVyIGluamVjdGlvbiBhdHRhY2spLgorICAgIGRlZiB0ZXN0X2VtYmVkZWRfaGVhZGVyX3ZpYV9IZWFkZXJfcmVqZWN0ZWQoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0R1bW15J10gPSBIZWFkZXIoJ2R1bW15XG5YLUluamVjdGVkLUhlYWRlcjogdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVycm9ycy5IZWFkZXJQYXJzZUVycm9yLCBtc2cuYXNfc3RyaW5nKQorCisgICAgZGVmIHRlc3RfZW1iZWRlZF9oZWFkZXJfdmlhX3N0cmluZ19yZWplY3RlZChzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRHVtbXknXSA9ICdkdW1teVxuWC1JbmplY3RlZC1IZWFkZXI6IHRlc3QnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVycm9ycy5IZWFkZXJQYXJzZUVycm9yLCBtc2cuYXNfc3RyaW5nKQorCisKKyMgVGVzdCB0aGUgZW1haWwuRW5jb2RlcnMgbW9kdWxlCitjbGFzcyBUZXN0RW5jb2RlcnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZV9lbXB0eV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfY2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9jdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIDdiaXQgZGF0YSBhbmQgdGhlIGRlZmF1bHQgdXMtYXNjaWkgX2NoYXJzZXQKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKyAgICAgICAgIyBTaW1pbGFyLCBidXQgd2l0aCA4Yml0IGRhdGEKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIFx4Zjggd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzhiaXQnKQorICAgICAgICAjIEFuZCBub3cgd2l0aCBhIGRpZmZlcmVudCBjaGFyc2V0CisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJywgX2NoYXJzZXQ9J2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorCisgICAgZGVmIHRlc3RfZW5jb2RlN29yOGJpdChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYSBjaGFyc2V0IHdob3NlIGlucHV0IGNoYXJhY3RlciBzZXQgaXMgOGJpdCBidXQKKyAgICAgICAgIyB3aG9zZSBvdXRwdXQgY2hhcmFjdGVyIHNldCBpcyA3Yml0IGdldHMgYSB0cmFuc2Zlci1lbmNvZGluZworICAgICAgICAjIG9mIDdiaXQuCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5NSU1FVGV4dC5NSU1FVGV4dCgnXHhjYVx4YjgnLCBfY2hhcnNldD0nZXVjLWpwJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworCisjIFRlc3QgbG9uZyBoZWFkZXIgd3JhcHBpbmcKK2NsYXNzIFRlc3RMb25nSGVhZGVycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9zcGxpdF9sb25nX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitTdWJqZWN0OiBidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQKKwordGVzdAorIiIiKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorU3ViamVjdDogYnVnIGRlbW9uc3RyYXRpb24KKyAxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorIG1vcmUgdGV4dAorCit0ZXN0CisiIiIpCisKKyAgICBkZWYgdGVzdF9hbm90aGVyX2xvbmdfYWxtb3N0X3Vuc3BsaXR0YWJsZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQiIiIKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0IiIiKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2J1ZyBkZW1vbnN0cmF0aW9uCisgMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKKyBtb3JlIHRleHQiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nX25vbnN0cmluZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBjeiA9IENoYXJzZXQoImlzby04ODU5LTIiKQorICAgICAgICB1dGY4ID0gQ2hhcnNldCgidXRmLTgiKQorICAgICAgICBnX2hlYWQgPSAiRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCBrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgYW4gc1x4ZmNkbFx4ZmNuZGlzY2hlbiBXYW5kZ2VtXHhlNGxkZW4gdm9yYmVpLCBnZWdlbiBkaWUgcm90aWVyZW5kZW4gS2xpbmdlbiBiZWZceGY2cmRlcnQuICIKKyAgICAgICAgY3pfaGVhZCA9ICJGaW5hblx4ZThuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kIHRsYWtlbSBqZWppY2ggZFx4Zjl2dGlwdS4uICIKKyAgICAgICAgdXRmOF9oZWFkID0gdSJcdTZiNjNcdTc4YmFcdTMwNmJcdThhMDBcdTMwNDZcdTMwNjhcdTdmZmJcdThhMzNcdTMwNmZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTRlMDBcdTkwZThcdTMwNmZcdTMwYzlcdTMwYTRcdTMwYzRcdThhOWVcdTMwNjdcdTMwNTlcdTMwNGNcdTMwMDFcdTMwNDJcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNWZcdTMwODlcdTMwODFcdTMwNjdcdTMwNTlcdTMwMDJcdTViOWZcdTk2OWJcdTMwNmJcdTMwNmZcdTMwMGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0IHVuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCBnZXJzcHV0Llx1MzAwZFx1MzA2OFx1OGEwMFx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIGggPSBIZWFkZXIoZ19oZWFkLCBnLCBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGguYXBwZW5kKGN6X2hlYWQsIGN6KQorICAgICAgICBoLmFwcGVuZCh1dGY4X2hlYWQsIHV0ZjgpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1N1YmplY3QnXSA9IGgKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK1N1YmplY3Q6ID0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmQ/PQorID0/aXNvLTg4NTktMT9xP2VyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGk/PQorID0/aXNvLTg4NTktMT9xP3NjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmc/PQorID0/aXNvLTg4NTktMT9xP2VuX2JlZj1GNnJkZXJ0PTJFXz89ID0/aXNvLTg4NTktMj9xP0ZpbmFuPUU4bmlfbWV0Pz0KKyA9P2lzby04ODU5LTI/cT9yb3BvbGVfc2VfaHJvdXRpbHlfcG9kX3RsYWtlbV9qZWppY2hfZD1GOXZ0aXB1PTJFPTJFXz89CisgPT91dGYtOD9iPzVxMmo1Nks2NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U/PQorID0/dXRmLTg/Yj80NEcrNDRHYjQ0S1Q0NENDNUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I/PQorID0/dXRmLTg/Yj80NEdDNDRHbzQ0R3Y0NEduNDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q00/PQorID0/dXRmLTg/cT9XZW5uX2lzdF9kYXNfTnVuc3R1Y2tfZ2l0X3VuZF9TbG90ZXJtZXllcj0zRl9KYSFfQmVpaGVyaHVuZF9kYXM/PQorID0/dXRmLTg/Yj9JRTlrWlhJZ1pHbGxJRVpzYVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm93PT0/PQorID0/dXRmLTg/Yj80NEdtNDRHRTQ0Rys0NEdaNDRDQz89CisKKyIiIikKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZD89CisgPT9pc28tODg1OS0xP3E/ZXJiYW5kX2tvbWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaT89CisgPT9pc28tODg1OS0xP3E/c2NoZW5fV2FuZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZz89CisgPT9pc28tODg1OS0xP3E/ZW5fYmVmPUY2cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXQ/PQorID0/aXNvLTg4NTktMj9xP3JvcG9sZV9zZV9ocm91dGlseV9wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0KKyA9P3V0Zi04P2I/NXEyajU2SzY0NEdyNktpQTQ0R0c0NEdvNTcrNzZLaXo0NEd2NDRHVjQ0S000NEdtNDRHRT89CisgPT91dGYtOD9iPzQ0Rys0NEdiNDRLVDQ0Q0M1TGlBNllPbzQ0R3Y0NE9KNDRLazQ0T0U2S3FlNDRHbjQ0R1o0NEdNNDRDQj89CisgPT91dGYtOD9iPzQ0R0M0NEdvNDRHdjQ0R240NEdmNDRLSjQ0S0I0NEduNDRHWjQ0Q0M1YTZmNlpxYjQ0R3I0NEd2NDRDTT89CisgPT91dGYtOD9xP1dlbm5faXN0X2Rhc19OdW5zdHVja19naXRfdW5kX1Nsb3Rlcm1leWVyPTNGX0phIV9CZWloZXJodW5kX2Rhcz89CisgPT91dGYtOD9iP0lFOWtaWElnWkdsbElFWnNhWEJ3WlhKM1lXeGtkQ0JuWlhKemNIVjBMdU9BamVPQnFPaW9nT09Cb3c9PT89CisgPT91dGYtOD9iPzQ0R200NEdFNDRHKzQ0R1o0NENDPz0iIiIpCisKKyAgICBkZWYgdGVzdF9sb25nX2hlYWRlcl9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJywKKyAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZT0nWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7Cisgc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJycnKQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXJfZW5jb2RlX3dpdGhfdGFiX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsgJworICAgICAgICAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInLAorICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPSdYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0JywKKyAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAord2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsKK1x0c3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJycnKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX3NwbGl0dGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgIyBJdCdkIGJlIGdyZWF0IGlmIHdlIGNvdWxkIHVzZSBhZGRfaGVhZGVyKCkgaGVyZSwgYnV0IHRoYXQgZG9lc24ndAorICAgICAgICAjIGd1YXJhbnRlZSBhbiBvcmRlciBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICAgICAgbXNnWydYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0J10gPSAoCisgICAgICAgICAgICAnd2Fzbmlwb29wOyBnaXJhZmZlcz0idmVyeS1sb25nLW5lY2tlZC1hbmltYWxzIjsgJworICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAnJydcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQ6IHdhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7Cisgc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiCisKKycnJykKKworICAgIGRlZiB0ZXN0X25vX3NlbWlzX2hlYWRlcl9zcGxpdHRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snRnJvbSddID0gJ3Rlc3RAZG9tLmFpbicKKyAgICAgICAgbXNnWydSZWZlcmVuY2VzJ10gPSBTUEFDRS5qb2luKFsnPCVkQGRvbS5haW4+JyAlIGkgZm9yIGkgaW4gcmFuZ2UoMTApXSkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdUZXN0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK0Zyb206IHRlc3RAZG9tLmFpbgorUmVmZXJlbmNlczogPDBAZG9tLmFpbj4gPDFAZG9tLmFpbj4gPDJAZG9tLmFpbj4gPDNAZG9tLmFpbj4gPDRAZG9tLmFpbj4KKyA8NUBkb20uYWluPiA8NkBkb20uYWluPiA8N0Bkb20uYWluPiA8OEBkb20uYWluPiA8OUBkb20uYWluPgorCitUZXN0IiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc3BsaXRfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAnUmVmZXJlbmNlczogJyArICd4JyAqIDgwCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK1JlZmVyZW5jZXM6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX211bHRpcGxlX2xvbmdfbGluZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAiIiJcCitmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2Zyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CitcdGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CitcdGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CitcdFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworXHRieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworXHRmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworXHRTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKK1x0YnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKK1x0Zm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKK1x0U2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpIiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX2ZpcnN0X2xpbmVfb25seV9pc19sb25nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdIGhlbG89Y3RodWxodS5nZXJnLmNhKQorXHRieSBrcm9ub3MubWVtcy1leGNoYW5nZS5vcmcgd2l0aCBlc210cCAoRXhpbSA0LjA1KQorXHRpZCAxN2s0aDUtMDAwMzRpLTAwCitcdGZvciB0ZXN0QG1lbXMtZXhjaGFuZ2Uub3JnOyBXZWQsIDI4IEF1ZyAyMDAyIDExOjI1OjIwIC0wNDAwIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgbWF4bGluZWxlbj03OCwgaGVhZGVyX25hbWU9J1JlY2VpdmVkJywKKyAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdCitcdGhlbG89Y3RodWxodS5nZXJnLmNhKQorXHRieSBrcm9ub3MubWVtcy1leGNoYW5nZS5vcmcgd2l0aCBlc210cCAoRXhpbSA0LjA1KQorXHRpZCAxN2s0aDUtMDAwMzRpLTAwCitcdGZvciB0ZXN0QG1lbXMtZXhjaGFuZ2Uub3JnOyBXZWQsIDI4IEF1ZyAyMDAyIDExOjI1OjIwIC0wNDAwIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ184Yml0X2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIGggPSBIZWFkZXIoJ0JyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCcsICdpc28tODg1OS0xJywKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBoLmFwcGVuZCgnZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZScpCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gaAorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK1N1YmplY3Q6ID0/aXNvLTg4NTktMT9xP0JyaXRpc2NoZV9SZWdpZXJ1bmdfZ2lidD89ID0/aXNvLTg4NTktMT9xP2dyPUZDbmVzPz0KKyA9P2lzby04ODU5LTE/cT9fTGljaHRfZj1GQ3JfT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGU/PQorCisiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nXzhiaXRfaGVhZGVyX25vX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlcGx5LVRvJ10gPSAnQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0IGdyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUgPGEtdmVyeS1sb25nLWFkZHJlc3NAZXhhbXBsZS5jb20+JworICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK1JlcGx5LVRvOiBCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQgZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZSA8YS12ZXJ5LWxvbmctYWRkcmVzc0BleGFtcGxlLmNvbT4KKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ190b19oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHRvID0gJyJTb21lb25lIFRlc3QgI0EiIDxzb21lb25lQGVlY3MudW1pY2guZWR1Piw8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sIlNvbWVvbmUgVGVzdCAjQiIgPHNvbWVvbmVAdW1pY2guZWR1PiwgIlNvbWVvbmUgVGVzdCAjQyIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCAiU29tZW9uZSBUZXN0ICNEIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4nCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1RvJ10gPSB0bworICAgICAgICBlcShtc2cuYXNfc3RyaW5nKDApLCAnJydcCitUbzogIlNvbWVvbmUgVGVzdCAjQSIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sCisgIlNvbWVvbmUgVGVzdCAjQiIgPHNvbWVvbmVAdW1pY2guZWR1PiwKKyAiU29tZW9uZSBUZXN0ICNDIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sCisgIlNvbWVvbmUgVGVzdCAjRCIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+CisKKycnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfbGluZV9hZnRlcl9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhbiBleGFtcGxlIG9mIHN0cmluZyB3aGljaCBoYXMgYWxtb3N0IHRoZSBsaW1pdCBvZiBoZWFkZXIgbGVuZ3RoLicKKyAgICAgICAgaCA9IEhlYWRlcihzKQorICAgICAgICBoLmFwcGVuZCgnQWRkIGFub3RoZXIgbGluZS4nKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitUaGlzIGlzIGFuIGV4YW1wbGUgb2Ygc3RyaW5nIHdoaWNoIGhhcyBhbG1vc3QgdGhlIGxpbWl0IG9mIGhlYWRlciBsZW5ndGguCisgQWRkIGFub3RoZXIgbGluZS4iIiIpCisKKyAgICBkZWYgdGVzdF9zaG9ydGVyX2xpbmVfd2l0aF9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhIHNob3J0ZXIgbGluZS4nCisgICAgICAgIGggPSBIZWFkZXIocykKKyAgICAgICAgaC5hcHBlbmQoJ0FkZCBhbm90aGVyIHNlbnRlbmNlLiAoU3VycHJpc2U/KScpCisgICAgICAgIGVxKGguZW5jb2RlKCksCisgICAgICAgICAgICdUaGlzIGlzIGEgc2hvcnRlciBsaW5lLiBBZGQgYW5vdGhlciBzZW50ZW5jZS4gKFN1cnByaXNlPyknKQorCisgICAgZGVmIHRlc3RfbG9uZ19maWVsZF9uYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmbiA9ICdYLVZlcnktVmVyeS1WZXJ5LUxvbmctSGVhZGVyLU5hbWUnCisgICAgICAgIGdzID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGggPSBIZWFkZXIoZ3MsICdpc28tODg1OS0xJywgaGVhZGVyX25hbWU9Zm4pCisgICAgICAgICMgQkFXOiB0aGlzIHNlZW1zIGJyb2tlbiBiZWNhdXNlIHRoZSBmaXJzdCBsaW5lIGlzIHRvbyBsb25nCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfPz0KKyA9P2lzby04ODU5LTE/cT9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfPz0KKyA9P2lzby04ODU5LTE/cT9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nPz0KKyA9P2lzby04ODU5LTE/cT9lZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNnJkZXJ0PTJFXz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19yZWNlaXZlZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGggPSAnZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5IGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7IFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAnCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlY2VpdmVkLTEnXSA9IEhlYWRlcihoLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgbXNnWydSZWNlaXZlZC0yJ10gPSBoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZWNlaXZlZC0xOiBmcm9tIEZPTy5UTEQgKHZpendvcmxkLmFjbC5mb28udGxkIFsxMjMuNDUyLjY3OC45XSkgYnkKK1x0aHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsKK1x0V2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMAorUmVjZWl2ZWQtMjogZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5CisgaHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsKKyBXZWQsIDA1IE1hciAyMDAzIDE4OjEwOjE4IC0wNzAwCisKKyIiIikKKworICAgIGRlZiB0ZXN0X3N0cmluZ19oZWFkZXJpbnN0X2VxKHNlbGYpOgorICAgICAgICBoID0gJzwxNTk3NS4xNzkwMS4yMDcyNDAuNDE0NjA0QHNnaWdyaXR6bWFubjEubWF0aGVtYXRpay50dS1tdWVuY2hlbi5kZT4gKERhdmlkIEJyZW1uZXJcJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIiknCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlY2VpdmVkJ10gPSBIZWFkZXIoaCwgaGVhZGVyX25hbWU9J1JlY2VpdmVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBtc2dbJ1JlY2VpdmVkJ10gPSBoCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKCksICIiIlwKK1JlY2VpdmVkOiA8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+CitcdChEYXZpZCBCcmVtbmVyJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIikKK1JlY2VpdmVkOiA8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+CisgKERhdmlkIEJyZW1uZXIncyBtZXNzYWdlIG9mICJUaHUsIDYgTWFyIDIwMDMgMTM6NTg6MjEgKzAxMDAiKQorCisiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nX3VuYnJlYWthYmxlX2xpbmVzX3dpdGhfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgdCA9ICIiIlwKKyBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKKyBsb2NRRFE0ekp5a0ZCQVhKZldEakFBQUNZVWxFUVZSNG5GMlRRWS9qSUF5RmM2bHlkbEc1eDhOeXAxWTY5d2oxUE4ySTVnenAiIiIKKyAgICAgICAgbXNnWydGYWNlLTEnXSA9IHQKKyAgICAgICAgbXNnWydGYWNlLTInXSA9IEhlYWRlcih0LCBoZWFkZXJfbmFtZT0nRmFjZS0yJykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGYWNlLTE6IGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3QkFNQUFBQ2xMT1MwQUFBQUdGQk1WRVVBQUFBa0hpSmVSVUljR0JpOQorIGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cAorRmFjZS0yOiBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKKyBsb2NRRFE0ekp5a0ZCQVhKZldEakFBQUNZVWxFUVZSNG5GMlRRWS9qSUF5RmM2bHlkbEc1eDhOeXAxWTY5d2oxUE4ySTVnenAKKworIiIiKQorCisgICAgZGVmIHRlc3RfYW5vdGhlcl9sb25nX211bHRpbGluZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnJydcCitSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAoWzE3Mi4yNS4xLjNdKSBieSB6aW1hLnNpbGljb25pbWFnZS5jb20gd2l0aCBNaWNyb3NvZnQgU01UUFNWQyg1LjAuMjE5NS40OTA1KTsKKyBXZWQsIDE2IE9jdCAyMDAyIDA3OjQxOjExIC0wNzAwJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAnJydcCitSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAoWzE3Mi4yNS4xLjNdKSBieSB6aW1hLnNpbGljb25pbWFnZS5jb20gd2l0aAorIE1pY3Jvc29mdCBTTVRQU1ZDKDUuMC4yMTk1LjQ5MDUpOyBXZWQsIDE2IE9jdCAyMDAyIDA3OjQxOjExIC0wNzAwCisKKycnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfbGluZXNfd2l0aF9kaWZmZXJlbnRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gIiIiXAorTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKKyAgICAgICAgPG1haWx0bzpzcGFtYXNzYXNzaW4tdGFsay1yZXF1ZXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD9zdWJqZWN0PXVuc3Vic2NyaWJlPiIiIgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydMaXN0J10gPSBoCisgICAgICAgIG1zZ1snTGlzdCddID0gSGVhZGVyKGgsIGhlYWRlcl9uYW1lPSdMaXN0JykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitMaXN0OiBMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vc3BhbWFzc2Fzc2luLXRhbGs+LAorIDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4KK0xpc3Q6IExpc3QtVW5zdWJzY3JpYmU6IDxodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCisgPG1haWx0bzpzcGFtYXNzYXNzaW4tdGFsay1yZXF1ZXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD9zdWJqZWN0PXVuc3Vic2NyaWJlPgorCisiIiIpCisKKworCisjIFRlc3QgbWFuZ2xpbmcgb2YgIkZyb20gIiBsaW5lcyBpbiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UKK2NsYXNzIFRlc3RGcm9tTWFuZ2xpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5tc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5tc2dbJ0Zyb20nXSA9ICdhYWFAYmJiLm9yZycKKyAgICAgICAgc2VsZi5tc2cuc2V0X3BheWxvYWQoIiIiXAorRnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfbWFuZ2xlZF9mcm9tKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1hbmdsZV9mcm9tXz1UcnVlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCis+RnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfZG9udF9tYW5nbGVfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89RmFsc2UpCisgICAgICAgIGcuZmxhdHRlbihzZWxmLm1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0Zyb206IGFhYUBiYmIub3JnCisKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworICAgIGRlZiB0ZXN0X21hbmdsZV9mcm9tX2luX3ByZWFtYmxlX2FuZF9lcGlsb2coc2VsZik6CisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWFuZ2xlX2Zyb21fPVRydWUpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIEZyb206IGZvb0BiYXIuY29tCisgICAgICAgICAgICBNaW1lLVZlcnNpb246IDEuMAorICAgICAgICAgICAgQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PVhYWAorCisgICAgICAgICAgICBGcm9tIHNvbWV3aGVyZSB1bmtub3duCisKKyAgICAgICAgICAgIC0tWFhYCisgICAgICAgICAgICBDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworICAgICAgICAgICAgZm9vCisKKyAgICAgICAgICAgIC0tWFhYLS0KKworICAgICAgICAgICAgRnJvbSBzb21ld2hlcmUgdW5rbm93YWJsZQorICAgICAgICAgICAgIiIiKSkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oWzEgZm9yIHggaW4gcy5nZXR2YWx1ZSgpLnNwbGl0KCdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgeC5zdGFydHN3aXRoKCc+RnJvbSAnKV0pLCAyKQorCisKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUF1ZGlvIGNsYXNzCitjbGFzcyBUZXN0TUlNRUF1ZGlvKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHdlIHBpY2sgdXAgdGhlIGF1ZGlvdGVzdC5hdSB0aGF0IGxpdmVzIGluIGVtYWlsL3Rlc3QvZGF0YS4KKyAgICAgICAgIyBJbiBQeXRob24sIHRoZXJlJ3MgYW4gYXVkaW90ZXN0LmF1IGxpdmluZyBpbiBMaWIvdGVzdCBidXQgdGhhdCBpc24ndAorICAgICAgICAjIGluY2x1ZGVkIGluIHNvbWUgYmluYXJ5IGRpc3Ryb3MgdGhhdCBkb24ndCBpbmNsdWRlIHRoZSB0ZXN0CisgICAgICAgICMgcGFja2FnZS4gIFRoZSB0cmFpbGluZyBlbXB0eSBzdHJpbmcgb24gdGhlIC5qb2luKCkgaXMgc2lnbmlmaWNhbnQKKyAgICAgICAgIyBzaW5jZSBmaW5kZmlsZSgpIHdpbGwgZG8gYSBkaXJuYW1lKCkuCisgICAgICAgIGRhdGFkaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGxhbmRtYXJrKSwgJ2RhdGEnLCAnJykKKyAgICAgICAgZnAgPSBvcGVuKGZpbmRmaWxlKCdhdWRpb3Rlc3QuYXUnLCBkYXRhZGlyKSwgJ3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fYXVkaW9kYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2F1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSkKKworICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vYmFzaWMnKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHBheWxvYWQgPSBzZWxmLl9hdS5nZXRfcGF5bG9hZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZTY0LmRlY29kZXN0cmluZyhwYXlsb2FkKSwgc2VsZi5fYXVkaW9kYXRhKQorCisgICAgZGVmIHRlc3RfY2hlY2tTZXRNaW5vcihzZWxmKToKKyAgICAgICAgYXUgPSBNSU1FQXVkaW8oc2VsZi5fYXVkaW9kYXRhLCAnZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vZmlzaCcpCisKKyAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCisgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCisgICAgICAgICAgICdhdHRhY2htZW50OyBmaWxlbmFtZT0iYXVkaW90ZXN0LmF1IicpCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbXMoaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgIFsoJ2F0dGFjaG1lbnQnLCAnJyksICgnZmlsZW5hbWUnLCAnYXVkaW90ZXN0LmF1JyldKQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICdhdWRpb3Rlc3QuYXUnKQorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksICcnKQorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdmb28nLCBmYWlsb2JqPW1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJykgaXMgbWlzc2luZykKKyAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCisgICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCisgICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKworCisKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUltYWdlIGNsYXNzCitjbGFzcyBUZXN0TUlNRUltYWdlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ1B5QmFubmVyMDQ4LmdpZicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2ltZ2RhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5faW0gPSBNSU1FSW1hZ2Uoc2VsZi5faW1nZGF0YSkKKworICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5faW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZ2lmJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5faW0uZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2ltZ2RhdGEpCisKKyAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgorICAgICAgICBpbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhLCAnZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCisKKyAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKKyAgICAgICAgICAgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJkaW5ndXNmaXNoLmdpZiInKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2Rpbmd1c2Zpc2guZ2lmJyldKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICAjIFRyeSBzb21lIG1pc3Npbmcgc3R1ZmYKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdmb29iYXInKSBpcyBtaXNzaW5nKQorCisKKworIyBUZXN0IHRoZSBiYXNpYyBNSU1FVGV4dCBjbGFzcworY2xhc3MgVGVzdE1JTUVUZXh0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX21zZyA9IE1JTUVUZXh0KCdoZWxsbyB0aGVyZScpCisKKyAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIG1pc3NpbmcsIGhlYWRlcj0nZm9vYmFyJykKKyAgICAgICAgICAgICAgIGlzIG1pc3NpbmcpCisKKyAgICBkZWYgdGVzdF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmUnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gdGhlcmUnLCBfY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKworICAgIGRlZiB0ZXN0XzdiaXRfdW5pY29kZV9pbnB1dChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KHUnaGVsbG8gdGhlcmUnLCBfY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKworICAgIGRlZiB0ZXN0XzdiaXRfdW5pY29kZV9pbnB1dF9ub19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQodSdoZWxsbyB0aGVyZScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdoZWxsbyB0aGVyZScgaW4gbXNnLmFzX3N0cmluZygpKQorCisgICAgZGVmIHRlc3RfOGJpdF91bmljb2RlX2lucHV0KHNlbGYpOgorICAgICAgICB0ZXN0c3RyID0gdSdcdTA0M2FcdTA0MzhcdTA0NDBcdTA0MzhcdTA0M2JcdTA0MzhcdTA0NDZcdTA0MzAnCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCh0ZXN0c3RyLCBfY2hhcnNldD0ndXRmLTgnKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5vdXRwdXRfY2hhcnNldCwgJ3V0Zi04JykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InV0Zi04IicpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIHRlc3RzdHIuZW5jb2RlKCd1dGYtOCcpKQorCisgICAgZGVmIHRlc3RfOGJpdF91bmljb2RlX2lucHV0X25vX2NoYXJzZXQoc2VsZik6CisgICAgICAgIHRlc3RzdHIgPSB1J1x1MDQzYVx1MDQzOFx1MDQ0MFx1MDQzOFx1MDQzYlx1MDQzOFx1MDQ0Nlx1MDQzMCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBNSU1FVGV4dCwgdGVzdHN0cikKKworCisKKyMgVGVzdCBjb21wbGljYXRlZCBtdWx0aXBhcnQvKiBtZXNzYWdlcworY2xhc3MgVGVzdE11bHRpcGFydChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ1B5QmFubmVyMDQ4LmdpZicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICBjb250YWluZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJywgYm91bmRhcnk9J0JPVU5EQVJZJykKKyAgICAgICAgaW1hZ2UgPSBNSU1FSW1hZ2UoZGF0YSwgbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbWFnZS5hZGRfaGVhZGVyKCdjb250ZW50LWRpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIGludHJvID0gTUlNRVRleHQoJycnXAorSGkgdGhlcmUsCisKK1RoaXMgaXMgdGhlIGRpbmd1cyBmaXNoLgorJycnKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGludHJvKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGltYWdlKQorICAgICAgICBjb250YWluZXJbJ0Zyb20nXSA9ICdCYXJyeSA8YmFycnlAZGlnaWNvb2wuY29tPicKKyAgICAgICAgY29udGFpbmVyWydUbyddID0gJ0Rpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+JworICAgICAgICBjb250YWluZXJbJ1N1YmplY3QnXSA9ICdIZXJlIGlzIHlvdXIgZGluZ3VzIGZpc2gnCisKKyAgICAgICAgbm93ID0gOTg3ODA5NzAyLjU0ODQ4NTk5CisgICAgICAgIHRpbWV0dXBsZSA9IHRpbWUubG9jYWx0aW1lKG5vdykKKyAgICAgICAgaWYgdGltZXR1cGxlWy0xXSA9PSAwOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS50aW1lem9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS5hbHR6b25lCisgICAgICAgIGlmIHR6c2VjcyA+IDA6CisgICAgICAgICAgICBzaWduID0gJy0nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaWduID0gJysnCisgICAgICAgIHR6b2Zmc2V0ID0gJyAlcyUwNGQnICUgKHNpZ24sIHR6c2VjcyAvLyAzNikKKyAgICAgICAgY29udGFpbmVyWydEYXRlJ10gPSB0aW1lLnN0cmZ0aW1lKAorICAgICAgICAgICAgJyVhLCAlZCAlYiAlWSAlSDolTTolUycsCisgICAgICAgICAgICB0aW1lLmxvY2FsdGltZShub3cpKSArIHR6b2Zmc2V0CisgICAgICAgIHNlbGYuX21zZyA9IGNvbnRhaW5lcgorICAgICAgICBzZWxmLl9pbSA9IGltYWdlCisgICAgICAgIHNlbGYuX3R4dCA9IGludHJvCisKKyAgICBkZWYgdGVzdF9oaWVyYXJjaHkoc2VsZik6CisgICAgICAgICMgY29udmVuaWVuY2UKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICAjIHRlc3RzCisgICAgICAgIG0gPSBzZWxmLl9tc2cKKyAgICAgICAgdW5sZXNzKG0uaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKG0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgZXEobGVuKG0uZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHJhaXNlcyhJbmRleEVycm9yLCBtLmdldF9wYXlsb2FkLCAyKQorICAgICAgICBtMCA9IG0uZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgbTEgPSBtLmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhtMCBpcyBzZWxmLl90eHQpCisgICAgICAgIHVubGVzcyhtMSBpcyBzZWxmLl9pbSkKKyAgICAgICAgZXEobS5nZXRfcGF5bG9hZCgpLCBbbTAsIG0xXSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMC5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMS5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X211bHRpcGFydF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICB0ZXh0ID0gIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworCistLUJPVU5EQVJZLS0KKyIiIgorICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZXN0cih0ZXh0KQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwodGV4dCwgbXNnLmFzX3N0cmluZygpKQorCisgICAgZGVmIHRlc3Rfbm9fcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCisKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X25vX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9ICcnCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9vbmVfcGFydF9pbl9hX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSAnJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gTm9uZQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9IE5vbmUKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tCisnJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25sX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnXG4nCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLQorCisnJycpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2V4dGVybmFsX2JvZHkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNi50eHQnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBtc2cxID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJykKKyAgICAgICAgZXEobGVuKG1zZzEuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZzEuZ2V0X3BheWxvYWQoKToKKyAgICAgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9leHRlcm5hbC1ib2R5JykKKyAgICAgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICAgICAgc3Vic3VicGFydCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kb3VibGVfYm91bmRhcnkoc2VsZik6CisgICAgICAgICMgbXNnXzM3LnR4dCBpcyBhIG11bHRpcGFydCB0aGF0IGNvbnRhaW5zIHR3byBkYXNoLWJvdW5kYXJ5J3MgaW4gYQorICAgICAgICAjIHJvdy4gIE91ciBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjA0NiBjYWxscyBmb3IgaWdub3JpbmcgdGhlIHNlY29uZAorICAgICAgICAjIGFuZCBzdWJzZXF1ZW50IGJvdW5kYXJpZXMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM3LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9pbm5lcl9jb250YWluc19vdXRlcl9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2dfMzgudHh0IGhhcyBhbiBpbm5lciBwYXJ0IHRoYXQgY29udGFpbnMgb3V0ZXIgYm91bmRhcmllcy4gIE15CisgICAgICAgICMgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDIwNDYgKGJhc2VkIG9uIHNlY3Rpb25zIDUuMSBhbmQgNS4xLjIpIHNheQorICAgICAgICAjIHRoZXNlIGFyZSBpbGxlZ2FsIGFuZCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdW50ZXJtaW5hdGVkIGlubmVyCisgICAgICAgICMgcGFydHMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM4LnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgSXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvbWl4ZWQKKyAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX3dpdGhfc2FtZV9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2cgMzkudHh0IGlzIHNpbWlsYXJseSBldmlsIGluIHRoYXQgaXQncyBnb3QgaW5uZXIgcGFydHMgdGhhdCB1c2UKKyAgICAgICAgIyB0aGUgc2FtZSBib3VuZGFyeSBhcyBvdXRlciBwYXJ0cy4gIEFnYWluLCBJIGJlbGlldmUgdGhlIHdheSB0aGlzIGlzCisgICAgICAgICMgcGFyc2VkIGlzIGNsb3Nlc3QgdG8gdGhlIHNwaXJpdCBvZiBSRkMgMjA0NgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zOS50eHQnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIEl0ZXJhdG9ycy5fc3RydWN0dXJlKG1zZywgc2ZwKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L21peGVkCisgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfaW5fbm9uX211bHRpcGFydChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKCksICcnJ1wKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgYm91bmRhcnk9Ii0tOTYxMjg0MjM2NTUyNTIyMjY5IgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5CitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKKworPGh0bWw+PC9odG1sPgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5LS0KKycnJykKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X3dpdGhfbGVhZGluZ19zcGFjZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoJycnXAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iICAgIFhYWFgiCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCistLSAgICBYWFhYLS0KKycnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnICAgIFhYWFgnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfd2l0aG91dF90cmFpbGluZ19uZXdsaW5lKHNlbGYpOgorICAgICAgICBtID0gUGFyc2VyKCkucGFyc2VzdHIoIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0iCitNSU1FLVZlcnNpb246IDEuMAorCistLT09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PQorQ29udGVudC1UeXBlOiBpbWFnZS9maWxlMS5qcGcKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWVhOa1pnPT0KKy0tPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09LS0iIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZCgpLCAnWVhOa1pnPT0nKQorCisKKworIyBUZXN0IHNvbWUgYmFkbHkgZm9ybWF0dGVkIG1lc3NhZ2VzCitjbGFzcyBUZXN0Tm9uQ29uZm9ybWFudChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9wYXJzZV9taXNzaW5nX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNC50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9zYW1lX2JvdW5kYXJ5X2lubmVyX291dGVyKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTUudHh0JykKKyAgICAgICAgIyBYWFggV2UgY2FuIHByb2JhYmx5IGV2ZW50dWFsbHkgZG8gYmV0dGVyCisgICAgICAgIGlubmVyID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIHVubGVzcyhoYXNhdHRyKGlubmVyLCAnZGVmZWN0cycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpbm5lci5kZWZlY3RzKSwgMSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoaW5uZXIuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfbm9fYm91bmRhcnkoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yNS50eHQnKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwgRXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCkpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfY29udGVudF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICAjIFJGQyAyMDQ1LCAkNS4yIHNheXMgaW52YWxpZCB5aWVsZHMgdGV4dC9wbGFpbgorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQnCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgIyBDbGVhciB0aGUgb2xkIHZhbHVlIGFuZCB0cnkgc29tZXRoaW5nIC9yZWFsbHkvIGludmFsaWQKKyAgICAgICAgZGVsIG1zZ1snY29udGVudC10eXBlJ10KKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICdmb28nCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgIyBTdGlsbCwgbWFrZSBzdXJlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaWRlbXBvdGVudGx5IGdlbmVyYXRlZAorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIG5lcShzLmdldHZhbHVlKCksICdDb250ZW50LVR5cGU6IGZvb1xuXG4nKQorCisgICAgZGVmIHRlc3Rfbm9fc3RhcnRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMxLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAiIiJcCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisiIiIpCisKKyAgICBkZWYgdGVzdF9ub19zZXBhcmF0aW5nX2JsYW5rX2xpbmUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM1LnR4dCcpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBoZXJlJ3Mgc29tZXRoaW5nIGludGVyZXN0aW5nCisKK2NvdW50ZXIgdG8gUkZDIDI4MjIsIHRoZXJlJ3Mgbm8gc2VwYXJhdGluZyBuZXdsaW5lIGhlcmUKKyIiIikKKworICAgIGRlZiB0ZXN0X2x5aW5nX211bHRpcGFydChzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQxLnR4dCcpCisgICAgICAgIHVubGVzcyhoYXNhdHRyKG1zZywgJ2RlZmVjdHMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwgRXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCkpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X21pc3Npbmdfc3RhcnRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIG91dGVyID0gc2VsZi5fbXNnb2JqKCdtc2dfNDIudHh0JykKKyAgICAgICAgIyBUaGUgbWVzc2FnZSBzdHJ1Y3R1cmUgaXM6CisgICAgICAgICMKKyAgICAgICAgIyBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgIyAgICB0ZXh0L3BsYWluCisgICAgICAgICMgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgIyAgICAgICAgbXVsdGlwYXJ0L21peGVkIFsqXQorICAgICAgICAjCisgICAgICAgICMgWypdIFRoaXMgbWVzc2FnZSBpcyBtaXNzaW5nIGl0cyBzdGFydCBib3VuZGFyeQorICAgICAgICBiYWQgPSBvdXRlci5nZXRfcGF5bG9hZCgxKS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiYWQuZGVmZWN0cyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X2ZpcnN0X2xpbmVfaXNfY29udGludWF0aW9uX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnIExpbmUgMVxuTGluZSAyXG5MaW5lIDMnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmtleXMoKSwgW10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnTGluZSAyXG5MaW5lIDMnKQorICAgICAgICBlcShsZW4obXNnLmRlZmVjdHMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KSkKKyAgICAgICAgZXEobXNnLmRlZmVjdHNbMF0ubGluZSwgJyBMaW5lIDFcbicpCisKKworCisKKyMgVGVzdCBSRkMgMjA0NyBoZWFkZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitjbGFzcyBUZXN0UkZDMjA0Nyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmZjMjA0N19tdWx0aWxpbmUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gIiIiUmU6ID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0gYmF6CisgZm9vIGJhciA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IiIiCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShkaCwgWworICAgICAgICAgICAgKCdSZTonLCBOb25lKSwKKyAgICAgICAgICAgICgnclx4OGFrc21ceDlhcmdceDhjcycsICdtYWMtaWNlbGFuZCcpLAorICAgICAgICAgICAgKCdiYXogZm9vIGJhcicsIE5vbmUpLAorICAgICAgICAgICAgKCdyXHg4YWtzbVx4OWFyZ1x4OGNzJywgJ21hYy1pY2VsYW5kJyldKQorICAgICAgICBlcShzdHIobWFrZV9oZWFkZXIoZGgpKSwKKyAgICAgICAgICAgIiIiUmU6ID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0gYmF6IGZvbyBiYXIKKyA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IiIiKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcl91bmljb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICc9P0lTTy04ODU5LTE/UT9BbmRyPUU5Pz0gUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShkaCwgWygnQW5kclx4ZTknLCAnaXNvLTg4NTktMScpLCAoJ1BpcmFyZCA8cGlyYXJkQGRvbS5haW4+JywgTm9uZSldKQorICAgICAgICBodSA9IHVuaWNvZGUobWFrZV9oZWFkZXIoZGgpKS5lbmNvZGUoJ2xhdGluLTEnKQorICAgICAgICBlcShodSwgJ0FuZHJceGU5IFBpcmFyZCA8cGlyYXJkQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXJfdW5pY29kZV8yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdUaGUgPT9pc28tODg1OS0xP2I/Y1hWcFkyc2dZbkp2ZDI0Z1ptOTQ/PSBqdW1wZWQgb3ZlciB0aGUgPT9pc28tODg1OS0xP2I/YkdGNmVTQmtiMmM9Pz0nCisgICAgICAgIGRoID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShkaCwgWygnVGhlJywgTm9uZSksICgncXVpY2sgYnJvd24gZm94JywgJ2lzby04ODU5LTEnKSwKKyAgICAgICAgICAgICAgICAoJ2p1bXBlZCBvdmVyIHRoZScsIE5vbmUpLCAoJ2xhenkgZG9nJywgJ2lzby04ODU5LTEnKV0pCisgICAgICAgIGh1ID0gbWFrZV9oZWFkZXIoZGgpLl9fdW5pY29kZV9fKCkKKyAgICAgICAgZXEoaHUsIHUnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cnKQorCisgICAgZGVmIHRlc3RfcmZjMjA0N193aXRob3V0X3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIHMgPSAnU209P0lTTy04ODU5LTE/Qj85Zz09Pz1yZz0/SVNPLTg4NTktMT9CPzVRPT0/PXNib3JkJworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaCwgWyhzLCBOb25lKV0pCisKKyAgICBkZWYgdGVzdF9yZmMyMDQ3X3dpdGhfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgcyA9ICdTbSA9P0lTTy04ODU5LTE/Qj85Zz09Pz0gcmcgPT9JU08tODg1OS0xP0I/NVE9PT89IHNib3JkJworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaCwgWygnU20nLCBOb25lKSwgKCdceGY2JywgJ2lzby04ODU5LTEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncmcnLCBOb25lKSwgKCdceGU1JywgJ2lzby04ODU5LTEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnc2JvcmQnLCBOb25lKV0pCisKKyAgICBkZWYgdGVzdF9yZmMyMDQ3X0JfYmFkX3BhZGRpbmcoc2VsZik6CisgICAgICAgIHMgPSAnPT9pc28tODg1OS0xP0I/JXM/PScKKyAgICAgICAgZGF0YSA9IFsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSB0ZXN0IGNvbXBsZXRlIGJ5dGVzCisgICAgICAgICAgICAoJ2RtPT0nLCAndicpLCAoJ2RtPScsICd2JyksICgnZG0nLCAndicpLAorICAgICAgICAgICAgKCdkbWs9JywgJ3ZpJyksICgnZG1rJywgJ3ZpJykKKyAgICAgICAgICBdCisgICAgICAgIGZvciBxLCBhIGluIGRhdGE6CisgICAgICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocyAlIHEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRoLCBbKGEsICdpc28tODg1OS0xJyldKQorCisgICAgZGVmIHRlc3RfcmZjMjA0N19RX2ludmFsaWRfZGlnaXRzKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDEwMDA0LgorICAgICAgICBzID0gJz0/aXNvLTg2NTktMT9RP2FuZHI9ZTk9eno/PScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVfaGVhZGVyKHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyhiJ2FuZHJceGU5PXp6JywgJ2lzby04NjU5LTEnKV0pCisKKworIyBUZXN0IHRoZSBNSU1FTWVzc2FnZSBjbGFzcworY2xhc3MgVGVzdE1JTUVNZXNzYWdlKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzExLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3RleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3R5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTUlNRU1lc3NhZ2UsICdhIHBsYWluIHN0cmluZycpCisKKyAgICBkZWYgdGVzdF92YWxpZF9hcmd1bWVudChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBzdWJqZWN0ID0gJ0Egc3ViLW1lc3NhZ2UnCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gc3ViamVjdAorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgZXEoci5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSByLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKHN1YnBhcnQgaXMgbSkKKyAgICAgICAgZXEoc3VicGFydFsnc3ViamVjdCddLCBzdWJqZWN0KQorCisgICAgZGVmIHRlc3RfYmFkX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZzEgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMVsnU3ViamVjdCddID0gJ3N1YnBhcnQgMScKKyAgICAgICAgbXNnMiA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cyWydTdWJqZWN0J10gPSAnc3VicGFydCAyJworICAgICAgICByID0gTUlNRU1lc3NhZ2UobXNnMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvciwgci5hdHRhY2gsIG1zZzIpCisKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZShzZWxmKToKKyAgICAgICAgIyBGaXJzdCBjcmFmdCB0aGUgbWVzc2FnZSB0byBiZSBlbmNhcHN1bGF0ZWQKKyAgICAgICAgbSA9IE1lc3NhZ2UoKQorICAgICAgICBtWydTdWJqZWN0J10gPSAnQW4gZW5jbG9zZWQgbWVzc2FnZScKKyAgICAgICAgbS5zZXRfcGF5bG9hZCgnSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS5cbicpCisgICAgICAgIHIgPSBNSU1FTWVzc2FnZShtKQorICAgICAgICByWydTdWJqZWN0J10gPSAnVGhlIGVuY2xvc2luZyBtZXNzYWdlJworICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgIiIiXAorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IFRoZSBlbmNsb3NpbmcgbWVzc2FnZQorCitTdWJqZWN0OiBBbiBlbmNsb3NlZCBtZXNzYWdlCisKK0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCisiIiIpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9tZXNzYWdlX3JmYzgyMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VibXNnID0gcGF5bG9hZFswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJtc2dbJ3N1YmplY3QnXSwgJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnKQorICAgICAgICBlcShzdWJtc2cuZ2V0X3BheWxvYWQoKSwgJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorCisgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgdW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgYSB0ZXh0L3BsYWluLCBodW1hbiByZWFkYWJsZSBzZWN0aW9uCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3VicGFydC5nZXRfcGF5bG9hZCgpLCAiIiJcCitUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKKworICBNZXNzYWdlLWlkOiA8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+CisgIERhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKKyAgRnJvbTogIklhbiBULiBIZW5yeSIgPGhlbnJ5aUBveHkuZWR1PgorICBUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CisgIFN1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorCitZb3VyIG1lc3NhZ2UgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgZm9sbG93aW5nIHJlY2lwaWVudHM6CisKKyAgUmVjaXBpZW50IGFkZHJlc3M6IGphbmdlbDFAY291Z2FyLm5vYy51Y2xhLmVkdQorICBSZWFzb246IHJlY2lwaWVudCByZWFjaGVkIGRpc2sgcXVvdGEKKworIiIiKQorICAgICAgICAjIFN1YnBhcnQgMiBjb250YWlucyB0aGUgbWFjaGluZSBwYXJzYWJsZSBEU04gaW5mb3JtYXRpb24uICBJdAorICAgICAgICAjIGNvbnNpc3RzIG9mIHR3byBibG9ja3Mgb2YgaGVhZGVycywgcmVwcmVzZW50ZWQgYnkgdHdvIG5lc3RlZCBNZXNzYWdlCisgICAgICAgICMgb2JqZWN0cy4KKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJykKKyAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgICMgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMgc2hvdWxkIHRyZWF0IGVhY2ggYmxvY2sgYXMgYSBidW5jaCBvZgorICAgICAgICAjIGhlYWRlcnMsIGkuZS4gYSBidW5jaCBvZiBNZXNzYWdlIG9iamVjdHMuCisgICAgICAgIGRzbjEgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDApCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjEsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24xWydvcmlnaW5hbC1lbnZlbG9wZS1pZCddLCAnMEdLNTAwQjRIRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdScpCisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCdkbnMnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgJycpCisgICAgICAgICMgVHJ5IGEgbWlzc2luZyBvbmUgPHdpbms+CisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCduc2QnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgTm9uZSkKKyAgICAgICAgZHNuMiA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoZHNuMiwgTWVzc2FnZSkpCisgICAgICAgIGVxKGRzbjJbJ2FjdGlvbiddLCAnZmFpbGVkJykKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW1zKGhlYWRlcj0nb3JpZ2luYWwtcmVjaXBpZW50JyksCisgICAgICAgICAgIFsoJ3JmYzgyMicsICcnKSwgKCdqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUnLCAnJyldKQorICAgICAgICBlcShkc24yLmdldF9wYXJhbSgncmZjODIyJywgaGVhZGVyPSdmaW5hbC1yZWNpcGllbnQnKSwgJycpCisgICAgICAgICMgU3VicGFydCAzIGlzIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMikKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3Vic3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3Vic3VicGFydCwgTWVzc2FnZSkpCisgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnN1YnBhcnRbJ21lc3NhZ2UtaWQnXSwKKyAgICAgICAgICAgJzwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4nKQorCisgICAgZGVmIHRlc3RfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snVG8nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gJ1Rlc3QnCisgICAgICAgIG1zZy5wcmVhbWJsZSA9ICdNSU1FIG1lc3NhZ2UnCisgICAgICAgIG1zZy5lcGlsb2d1ZSA9ICdFbmQgb2YgTUlNRSBtZXNzYWdlXG4nCisgICAgICAgIG1zZzEgPSBNSU1FVGV4dCgnT25lJykKKyAgICAgICAgbXNnMiA9IE1JTUVUZXh0KCdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9taXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMSkKKyAgICAgICAgbXNnLmF0dGFjaChtc2cyKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX25sX3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IFRlc3QKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKK01JTUUgbWVzc2FnZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK09uZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1R3bworLS1CT1VOREFSWS0tCisiIiIpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMzAudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGNvbnRhaW5lcjEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMWEgPSBjb250YWluZXIxLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgY29udGFpbmVyMmEgPSBjb250YWluZXIyLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfdHlwZV93aXRoX2V4cGxpY2l0X2NvbnRhaW5lcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfbm9uX3BhcnNlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIFNldCB1cCBjb250YWluZXIKKyAgICAgICAgY29udGFpbmVyID0gTUlNRU11bHRpcGFydCgnZGlnZXN0JywgJ0JPVU5EQVJZJykKKyAgICAgICAgY29udGFpbmVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgIyBTZXQgdXAgc3VicGFydHMKKyAgICAgICAgc3VicGFydDFhID0gTUlNRVRleHQoJ21lc3NhZ2UgMVxuJykKKyAgICAgICAgc3VicGFydDJhID0gTUlNRVRleHQoJ21lc3NhZ2UgMlxuJykKKyAgICAgICAgc3VicGFydDEgPSBNSU1FTWVzc2FnZShzdWJwYXJ0MWEpCisgICAgICAgIHN1YnBhcnQyID0gTUlNRU1lc3NhZ2Uoc3VicGFydDJhKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQxKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQyKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KKycnJykKKyAgICAgICAgZGVsIHN1YnBhcnQxWydjb250ZW50LXR5cGUnXQorICAgICAgICBkZWwgc3VicGFydDFbJ21pbWUtdmVyc2lvbiddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQyWydtaW1lLXZlcnNpb24nXQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9taW1lX2F0dGFjaG1lbnRzX2luX2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGV4dDEgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgdGV4dDIgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgbXNnID0gTUlNRU11bHRpcGFydChfc3VicGFydHM9KHRleHQxLCB0ZXh0MikpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKSwgdGV4dDEpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgxKSwgdGV4dDIpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X211bHRpcGFydF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgbXNnID0gTUlNRU11bHRpcGFydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisKKworIyBBIGdlbmVyYWwgdGVzdCBvZiBwYXJzZXItPm1vZGVsLT5nZW5lcmF0b3IgaWRlbXBvdGVuY3kuICBJT1csIHJlYWQgYSBtZXNzYWdlCisjIGluLCBwYXJzZSBpdCBpbnRvIGEgbWVzc2FnZSBvYmplY3QgdHJlZSwgdGhlbiB3aXRob3V0IHRvdWNoaW5nIHRoZSB0cmVlLAorIyByZWdlbmVyYXRlIHRoZSBwbGFpbiB0ZXh0LiAgVGhlIG9yaWdpbmFsIHRleHQgYW5kIHRoZSB0cmFuc2Zvcm1lZCB0ZXh0CisjIHNob3VsZCBiZSBpZGVudGljYWwuICBOb3RlOiB0aGF0IHdlIGlnbm9yZSB0aGUgVW5peC1Gcm9tIHNpbmNlIHRoYXQgbWF5CisjIGNvbnRhaW4gYSBjaGFuZ2VkIGRhdGUuCitjbGFzcyBUZXN0SWRlbXBvdGVudChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhkYXRhKQorICAgICAgICByZXR1cm4gbXNnLCBkYXRhCisKKyAgICBkZWYgX2lkZW1wb3RlbnQoc2VsZiwgbXNnLCB0ZXh0KToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfcGFyc2VfdGV4dF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpWzFdLCAoJ2NoYXJzZXQnLCAndXMtYXNjaWknKSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2cucHJlYW1ibGUsIE5vbmUpCisgICAgICAgIGVxKG1zZy5lcGlsb2d1ZSwgTm9uZSkKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9wYXJzZV91bnR5cGVkX21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X01JTUVfZGlnZXN0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNy50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X01JTUVfZGlnZXN0X3dpdGhfcGFydF9oZWFkZXJzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yOC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X21peGVkX3dpdGhfaW1hZ2Uoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X3JlcG9ydChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9kc24oc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcHJlYW1ibGVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIxLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X29uZV9wYXJ0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yMy50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9ub19wYXJ0cyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9ub19zdGFydF9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzMyLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbW9yZV9yZmMyMjMxX3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzMzLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfdGV4dF9wbGFpbl9pbl9hX211bHRpcGFydF9kaWdlc3Qoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzM0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbmVzdGVkX211bHRpcGFydF9taXhlZHMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzEyYS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZXh0ZXJuYWxfYm9keV9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zNi50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgICMgVGVzdCB0aGUgQ29udGVudC1UeXBlOiBwYXJhbWV0ZXJzCisgICAgICAgIHBhcmFtcyA9IHt9CisgICAgICAgIGZvciBwaywgcHYgaW4gbXNnLmdldF9wYXJhbXMoKToKKyAgICAgICAgICAgIHBhcmFtc1twa10gPSBwdgorICAgICAgICBlcShwYXJhbXNbJ3JlcG9ydC10eXBlJ10sICdkZWxpdmVyeS1zdGF0dXMnKQorICAgICAgICBlcShwYXJhbXNbJ2JvdW5kYXJ5J10sICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCAnVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsICdcbicpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdWJwYXJ0cyBhcmUgd2hhdCB3ZSBleHBlY3QKKyAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShtc2cyLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQorICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHBheWxvYWQgPSBtc2czLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgbXNnNCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnNCwgTWVzc2FnZSkpCisgICAgICAgIGVxKG1zZzQuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQorCisgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCisgICAgICAgICMgQ2hlY2sgc29tZSBvZiB0aGUgb3V0ZXIgaGVhZGVycworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcGF5bG9hZCBpcyBhIGxpc3Qgb2YgZXhhY3RseSBvbmUgc3ViLU1lc3NhZ2UsIGFuZCB0aGF0CisgICAgICAgICMgdGhhdCBzdWJtZXNzYWdlIGhhcyBhIHR5cGUgb2YgdGV4dC9wbGFpbgorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgbXNnMSA9IHBheWxvYWRbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMSwgTWVzc2FnZSkpCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnXG4nKQorCisKKworIyBUZXN0IHZhcmlvdXMgb3RoZXIgYml0cyBvZiB0aGUgcGFja2FnZSdzIGZ1bmN0aW9uYWxpdHkKK2NsYXNzIFRlc3RNaXNjZWxsYW5lb3VzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCkKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgIyBEb24ndCB3cmFwL2NvbnRpbnVlIGxvbmcgaGVhZGVycyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAjIGlkZW1wb3RlbmN5LgorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1heGhlYWRlcmxlbj0wKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHMuZ2V0dmFsdWUoKSkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9maWxlKHNlbGYpOgorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICAgICAgZnAuc2VlaygwKQorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgIyBEb24ndCB3cmFwL2NvbnRpbnVlIGxvbmcgaGVhZGVycyBzaW5jZSB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAgICAgIyBpZGVtcG90ZW5jeS4KKyAgICAgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzLmdldHZhbHVlKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nX3dpdGhfY2xhc3Moc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHRleHQsIE15TWVzc2FnZSkKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZV93aXRoX2NsYXNzKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgIyBDcmVhdGUgYSBzdWJjbGFzcworICAgICAgICBjbGFzcyBNeU1lc3NhZ2UoTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwLCBNeU1lc3NhZ2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZywgTXlNZXNzYWdlKSkKKyAgICAgICAgIyBUcnkgc29tZXRoaW5nIG1vcmUgY29tcGxpY2F0ZWQKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwLCBNeU1lc3NhZ2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZy53YWxrKCk6CisgICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQorCisgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKCdlbWFpbCcpCisgICAgICAgIGFsbCA9IG1vZHVsZS5fX2FsbF9fCisgICAgICAgIGFsbC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwsIFsKKyAgICAgICAgICAgICMgT2xkIG5hbWVzCisgICAgICAgICAgICAnQ2hhcnNldCcsICdFbmNvZGVycycsICdFcnJvcnMnLCAnR2VuZXJhdG9yJywKKyAgICAgICAgICAgICdIZWFkZXInLCAnSXRlcmF0b3JzJywgJ01JTUVBdWRpbycsICdNSU1FQmFzZScsCisgICAgICAgICAgICAnTUlNRUltYWdlJywgJ01JTUVNZXNzYWdlJywgJ01JTUVNdWx0aXBhcnQnLAorICAgICAgICAgICAgJ01JTUVOb25NdWx0aXBhcnQnLCAnTUlNRVRleHQnLCAnTWVzc2FnZScsCisgICAgICAgICAgICAnUGFyc2VyJywgJ1V0aWxzJywgJ2Jhc2U2NE1JTUUnLAorICAgICAgICAgICAgIyBuZXcgbmFtZXMKKyAgICAgICAgICAgICdiYXNlNjRtaW1lJywgJ2NoYXJzZXQnLCAnZW5jb2RlcnMnLCAnZXJyb3JzJywgJ2dlbmVyYXRvcicsCisgICAgICAgICAgICAnaGVhZGVyJywgJ2l0ZXJhdG9ycycsICdtZXNzYWdlJywgJ21lc3NhZ2VfZnJvbV9maWxlJywKKyAgICAgICAgICAgICdtZXNzYWdlX2Zyb21fc3RyaW5nJywgJ21pbWUnLCAncGFyc2VyJywKKyAgICAgICAgICAgICdxdW9wcmlNSU1FJywgJ3F1b3ByaW1pbWUnLCAndXRpbHMnLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VkYXRlKFV0aWxzLmZvcm1hdGRhdGUobm93KSlbOjZdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV9sb2NhbHRpbWUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBVdGlscy5wYXJzZWRhdGUoVXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1UcnVlKSlbOjZdLAorICAgICAgICAgICAgdGltZS5sb2NhbHRpbWUobm93KVs6Nl0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlX3VzZWdtdChzZWxmKToKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9RmFsc2UpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIC0wMDAwJywgdGltZS5nbXRpbWUobm93KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBVdGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlLCB1c2VnbXQ9VHJ1ZSksCisgICAgICAgICAgICB0aW1lLnN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UJywgdGltZS5nbXRpbWUobm93KSkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5wYXJzZWRhdGUoJycpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Qoc2VsZik6CisgICAgICAgICMgVGhlIEZXUyBhZnRlciB0aGUgY29tbWEgaXMgb3B0aW9uYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5wYXJzZWRhdGUoJ1dlZCwzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMucGFyc2VkYXRlKCdXZWQsIDMgQXByIDIwMDIgMTQ6NTg6MjYgKzA4MDAnKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShVdGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgLTEsIC0yODgwMCkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfY29tcGFjdF9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShVdGlscy5wYXJzZWRhdGVfdHooJzUgRmViIDIwMDMgMTM6NDc6MjYgLTA4MDAnKSwKKyAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2FjY2VwdGFibGVfdG9fdGltZV9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0aW1ldHVwID0gVXRpbHMucGFyc2VkYXRlKCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwKSkKKyAgICAgICAgZXEodGltZS5sb2NhbHRpbWUodClbOjZdLCB0aW1ldHVwWzo2XSkKKyAgICAgICAgZXEoaW50KHRpbWUuc3RyZnRpbWUoJyVZJywgdGltZXR1cCkpLCAyMDAzKQorICAgICAgICB0aW1ldHVwID0gVXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwWzo5XSkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXBbOjldKSksIDIwMDMpCisKKyAgICBkZWYgdGVzdF9ta3RpbWVfdHooc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMubWt0aW1lX3R6KCgxOTcwLCAxLCAxLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgMCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLm1rdGltZV90eigoMTk3MCwgMSwgMSwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIDEyMzQpKSwgLTEyMzQpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfeTJrKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGZvciBwYXJzaW5nIGEgZGF0ZSB3aXRoIGEgdHdvLWRpZ2l0IHllYXIuCisKKyAgICAgICAgUGFyc2luZyBhIGRhdGUgd2l0aCBhIHR3by1kaWdpdCB5ZWFyIHNob3VsZCByZXR1cm4gdGhlIGNvcnJlY3QKKyAgICAgICAgZm91ci1kaWdpdCB5ZWFyLiBSRkM4MjIgYWxsb3dzIHR3by1kaWdpdCB5ZWFycywgYnV0IFJGQzI4MjIgKHdoaWNoCisgICAgICAgIG9ic29sZXRlcyBSRkM4MjIpIHJlcXVpcmVzIGZvdXItZGlnaXQgeWVhcnMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgMDMgMTM6NDc6MjYgLTA4MDAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VkYXRlX3R6KCcyNSBGZWIgNzEgMTM6NDc6MjYgLTA4MDAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAxOTcxIDEzOjQ3OjI2IC0wODAwJykpCisKKyAgICBkZWYgdGVzdF9wYXJzZWFkZHJfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VhZGRyKCc8PicpLCAoJycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5mb3JtYXRhZGRyKFV0aWxzLnBhcnNlYWRkcignPD4nKSksICcnKQorCisgICAgZGVmIHRlc3Rfbm9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgVXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgJ0EgU2lsbHkgUGVyc29uIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBVdGlscy5mb3JtYXRhZGRyKCgnQSAoVmVyeSkgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBcKFZlcnlcKSBTaWxseSBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBIFwoU3BlY2lhbFwpIFBlcnNvbicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVdGlscy5wYXJzZWFkZHIoVXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2JhY2tzbGFzaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgVXRpbHMuZm9ybWF0YWRkcigoJ0FydGh1ciBcQmFja3NsYXNoXCBGb29iYXInLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBcnRodXIgXFxCYWNrc2xhc2hcXCBGb29iYXIiIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJworICAgICAgICBiID0gJ3BlcnNvbkBkb20uYWluJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFV0aWxzLnBhcnNlYWRkcihVdGlscy5mb3JtYXRhZGRyKChhLCBiKSkpLCAoYSwgYikpCisKKyAgICBkZWYgdGVzdF9uYW1lX3dpdGhfZG90KHNlbGYpOgorICAgICAgICB4ID0gJ0pvaG4gWC4gRG9lIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICB5ID0gJyJKb2huIFguIERvZSIgPGp4ZEBleGFtcGxlLmNvbT4nCisgICAgICAgIGEsIGIgPSAoJ0pvaG4gWC4gRG9lJywgJ2p4ZEBleGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VhZGRyKHgpLCAoYSwgYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VhZGRyKHkpLCAoYSwgYikpCisgICAgICAgICMgZm9ybWF0YWRkcigpIHF1b3RlcyB0aGUgbmFtZSBpZiB0aGVyZSdzIGEgZG90IGluIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMuZm9ybWF0YWRkcigoYSwgYikpLCB5KQorCisgICAgZGVmIHRlc3RfcGFyc2VhZGRyX3ByZXNlcnZlc19xdW90ZWRfcGFpcnNfaW5fYWRkcmVzc2VzKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDEwMDA1LiAgTm90ZSB0aGF0IGluIHRoZSB0aGlyZCB0ZXN0IHRoZSBzZWNvbmQgcGFpciBvZgorICAgICAgICAjIGJhY2tzbGFzaGVzIGlzIG5vdCBhY3R1YWxseSBhIHF1b3RlZCBwYWlyIGJlY2F1c2UgaXQgaXMgbm90IGluc2lkZSBhCisgICAgICAgICMgY29tbWVudCBvciBxdW90ZWQgc3RyaW5nOiB0aGUgYWRkcmVzcyBiZWluZyBwYXJzZWQgaGFzIGEgcXVvdGVkCisgICAgICAgICMgc3RyaW5nIGNvbnRhaW5pbmcgYSBxdW90ZWQgYmFja3NsYXNoLCBmb2xsb3dlZCBieSAnZXhhbXBsZScgYW5kIHR3bworICAgICAgICAjIGJhY2tzbGFzaGVzLCBmb2xsb3dlZCBieSBhbm90aGVyIHF1b3RlZCBzdHJpbmcgY29udGFpbmluZyBhIHNwYWNlIGFuZAorICAgICAgICAjIHRoZSB3b3JkICdleGFtcGxlJy4gIHBhcnNlYWRkciBjb3BpZXMgdGhvc2UgdHdvIGJhY2tzbGFzaGVzCisgICAgICAgICMgbGl0ZXJhbGx5LiAgUGVyIHJmYzUzMjIgdGhpcyBpcyBub3QgdGVjaG5pY2FsbHkgY29ycmVjdCBzaW5jZSBhIFwgbWF5CisgICAgICAgICMgbm90IGFwcGVhciBpbiBhbiBhZGRyZXNzIG91dHNpZGUgb2YgYSBxdW90ZWQgc3RyaW5nLiAgSXQgaXMgcHJvYmFibHkKKyAgICAgICAgIyBhIHNlbnNpYmxlIFBvc3RlbCBpbnRlcnByZXRhdGlvbiwgdGhvdWdoLgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoVXRpbHMucGFyc2VhZGRyKCciImV4YW1wbGUiIGV4YW1wbGUiQGV4YW1wbGUuY29tJyksCisgICAgICAgICAgKCcnLCAnIiJleGFtcGxlIiBleGFtcGxlIkBleGFtcGxlLmNvbScpKQorICAgICAgICBlcShVdGlscy5wYXJzZWFkZHIoJyJcXCJleGFtcGxlXFwiIGV4YW1wbGUiQGV4YW1wbGUuY29tJyksCisgICAgICAgICAgKCcnLCAnIlxcImV4YW1wbGVcXCIgZXhhbXBsZSJAZXhhbXBsZS5jb20nKSkKKyAgICAgICAgZXEoVXRpbHMucGFyc2VhZGRyKCciXFxcXCJleGFtcGxlXFxcXCIgZXhhbXBsZSJAZXhhbXBsZS5jb20nKSwKKyAgICAgICAgICAoJycsICciXFxcXCJleGFtcGxlXFxcXCIgZXhhbXBsZSJAZXhhbXBsZS5jb20nKSkKKworICAgIGRlZiB0ZXN0X211bHRpbGluZV9mcm9tX2NvbW1lbnQoc2VsZik6CisgICAgICAgIHggPSAiIiJcCitGb28KK1x0QmFyIDxmb29AZXhhbXBsZS5jb20+IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXRpbHMucGFyc2VhZGRyKHgpLCAoJ0ZvbyBCYXInLCAnZm9vQGV4YW1wbGUuY29tJykpCisKKyAgICBkZWYgdGVzdF9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgVXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHk7IFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpKSwKKyAgICAgICAgICAgIHInIkEgU2lsbHk7IFBlcnNvbiIgPHBlcnNvbkBkb20uYWluPicpCisKKyAgICBkZWYgdGVzdF9maXhfZW9scyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKFV0aWxzLmZpeF9lb2xzKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICBlcShVdGlscy5maXhfZW9scygnaGVsbG9cbicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEoVXRpbHMuZml4X2VvbHMoJ2hlbGxvXHInKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKFV0aWxzLmZpeF9lb2xzKCdoZWxsb1xyXG4nKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKFV0aWxzLmZpeF9lb2xzKCdoZWxsb1xuXHInKSwgJ2hlbGxvXHJcblxyXG4nKQorCisgICAgZGVmIHRlc3RfY2hhcnNldF9yaWNoY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZSA9IHNlbGYuYXNzZXJ0Tm90RXF1YWwKKyAgICAgICAgY3NldDEgPSBDaGFyc2V0KCkKKyAgICAgICAgY3NldDIgPSBDaGFyc2V0KCkKKyAgICAgICAgZXEoY3NldDEsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGNzZXQxLCAnVVMtQVNDSUknKQorICAgICAgICBlcShjc2V0MSwgJ1VzLUFzQ2lJJykKKyAgICAgICAgZXEoJ3VzLWFzY2lpJywgY3NldDEpCisgICAgICAgIGVxKCdVUy1BU0NJSScsIGNzZXQxKQorICAgICAgICBlcSgnVXMtQXNDaUknLCBjc2V0MSkKKyAgICAgICAgbmUoY3NldDEsICd1c2FzY2lpJykKKyAgICAgICAgbmUoY3NldDEsICdVU0FTQ0lJJykKKyAgICAgICAgbmUoY3NldDEsICdVc0FzQ2lJJykKKyAgICAgICAgbmUoJ3VzYXNjaWknLCBjc2V0MSkKKyAgICAgICAgbmUoJ1VTQVNDSUknLCBjc2V0MSkKKyAgICAgICAgbmUoJ1VzQXNDaUknLCBjc2V0MSkKKyAgICAgICAgZXEoY3NldDEsIGNzZXQyKQorICAgICAgICBlcShjc2V0MiwgY3NldDEpCisKKyAgICBkZWYgdGVzdF9nZXRhZGRyZXNzZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShVdGlscy5nZXRhZGRyZXNzZXMoWydhcGVyc29uQGRvbS5haW4gKEFsIFBlcnNvbiknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdCdWQgUGVyc29uIDxicGVyc29uQGRvbS5haW4+J10pLAorICAgICAgICAgICBbKCdBbCBQZXJzb24nLCAnYXBlcnNvbkBkb20uYWluJyksCisgICAgICAgICAgICAoJ0J1ZCBQZXJzb24nLCAnYnBlcnNvbkBkb20uYWluJyldKQorCisgICAgZGVmIHRlc3RfZ2V0YWRkcmVzc2VzX25hc3R5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoVXRpbHMuZ2V0YWRkcmVzc2VzKFsnZm9vOiA7J10pLCBbKCcnLCAnJyldKQorICAgICAgICBlcShVdGlscy5nZXRhZGRyZXNzZXMoCisgICAgICAgICAgIFsnW10qLS0gPX4kJ10pLAorICAgICAgICAgICBbKCcnLCAnJyksICgnJywgJycpLCAoJycsICcqLS0nKV0pCisgICAgICAgIGVxKFV0aWxzLmdldGFkZHJlc3NlcygKKyAgICAgICAgICAgWydmb286IDsnLCAnIkphc29uIFIuIE1hc3RhbGVyIiA8amFzb25AZG9tLmFpbj4nXSksCisgICAgICAgICAgIFsoJycsICcnKSwgKCdKYXNvbiBSLiBNYXN0YWxlcicsICdqYXNvbkBkb20uYWluJyldKQorCisgICAgZGVmIHRlc3RfZ2V0YWRkcmVzc2VzX2VtYmVkZGVkX2NvbW1lbnQoc2VsZik6CisgICAgICAgICIiIlRlc3QgcHJvcGVyIGhhbmRsaW5nIG9mIGEgbmVzdGVkIGNvbW1lbnQiIiIKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGFkZHJzID0gVXRpbHMuZ2V0YWRkcmVzc2VzKFsnVXNlciAoKG5lc3RlZCBjb21tZW50KSkgPGZvb0BiYXIuY29tPiddKQorICAgICAgICBlcShhZGRyc1swXVsxXSwgJ2Zvb0BiYXIuY29tJykKKworICAgIGRlZiB0ZXN0X3V0aWxzX3F1b3RlX3VucXVvdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdmb29cXHdhY2t5Im5hbWUnKQorICAgICAgICBlcShtc2cuZ2V0X2ZpbGVuYW1lKCksICdmb29cXHdhY2t5Im5hbWUnKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvZHlfZW5jb2Rpbmdfd2l0aF9ib2d1c19jaGFyc2V0KHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnbm90IGEgY2hhcnNldCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKworICAgIGRlZiB0ZXN0X2dldF9ib2R5X2VuY29kaW5nX3dpdGhfdXBwZXJjYXNlX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04JworICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGxlbihjaGFyc2V0cyksIDEpCisgICAgICAgIGVxKGNoYXJzZXRzWzBdLCAndXRmLTgnKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0c1swXSkKKyAgICAgICAgZXEoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdoZWxsbyB3b3JsZCcsIGNoYXJzZXQ9Y2hhcnNldCkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdhR1ZzYkc4Z2QyOXliR1E9XG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisgICAgICAgICMgVHJ5IGFub3RoZXIgb25lCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9IlVTLUFTQ0lJIicKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCkKKyAgICAgICAgZXEobGVuKGNoYXJzZXRzKSwgMSkKKyAgICAgICAgZXEoY2hhcnNldHNbMF0sICd1cy1hc2NpaScpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXRzWzBdKQorICAgICAgICBlcShjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksIEVuY29kZXJzLmVuY29kZV83b3I4Yml0KQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2hlbGxvIHdvcmxkJywgY2hhcnNldD1jaGFyc2V0KQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRzX2Nhc2VfaW5zZW5zaXRpdmUoc2VsZik6CisgICAgICAgIGxjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICB1YyA9IENoYXJzZXQoJ1VTLUFTQ0lJJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYy5nZXRfYm9keV9lbmNvZGluZygpLCB1Yy5nZXRfYm9keV9lbmNvZGluZygpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9mYWxsc19pbnNpZGVfbWVzc2FnZV9kZWxpdmVyeV9zdGF0dXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgVGhlIFBhcnNlciBpbnRlcmZhY2UgcHJvdmlkZXMgY2h1bmtzIG9mIGRhdGEgdG8gRmVlZFBhcnNlciBpbiA4MTkyCisgICAgICAgICMgYnl0ZSBndWxwcy4gIFNGIGJ1ZyAjMTA3NjQ4NSBmb3VuZCBvbmUgb2YgdGhvc2UgY2h1bmtzIGluc2lkZQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIGhlYWRlciBibG9jaywgd2hpY2ggdHJpZ2dlcmVkIGFuCisgICAgICAgICMgdW5yZWFkbGluZSgpIG9mIE5lZWRNb3JlRGF0YS4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDMudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBJdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9yZXBvcnQKKyAgICB0ZXh0L3BsYWluCisgICAgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9yZmM4MjItaGVhZGVycworIiIiKQorCisKKworIyBUZXN0IHRoZSBpdGVyYXRvci9nZW5lcmF0b3JzCitjbGFzcyBUZXN0SXRlcmF0b3JzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2JvZHlfbGluZV9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIEZpcnN0IGEgc2ltcGxlIG5vbi1tdWx0aXBhcnQgbWVzc2FnZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBpdCA9IEl0ZXJhdG9ycy5ib2R5X2xpbmVfaXRlcmF0b3IobXNnKQorICAgICAgICBsaW5lcyA9IGxpc3QoaXQpCisgICAgICAgIGVxKGxlbihsaW5lcyksIDYpCisgICAgICAgIG5lcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgbXNnLmdldF9wYXlsb2FkKCkpCisgICAgICAgICMgTm93IGEgbW9yZSBjb21wbGljYXRlZCBtdWx0aXBhcnQKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDIudHh0JykKKyAgICAgICAgaXQgPSBJdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yKG1zZykKKyAgICAgICAgbGluZXMgPSBsaXN0KGl0KQorICAgICAgICBlcShsZW4obGluZXMpLCA0MykKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzE5LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5lcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgZnAucmVhZCgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdHlwZWRfc3VicGFydF9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIGl0ID0gSXRlcmF0b3JzLnR5cGVkX3N1YnBhcnRfaXRlcmF0b3IobXNnLCAndGV4dCcpCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgc3VicGFydHMgPSAwCisgICAgICAgIGZvciBzdWJwYXJ0IGluIGl0OgorICAgICAgICAgICAgc3VicGFydHMgKz0gMQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgZXEoc3VicGFydHMsIDIpCisgICAgICAgIGVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCAiIiJcCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorIiIiKQorCisgICAgZGVmIHRlc3RfdHlwZWRfc3VicGFydF9pdGVyYXRvcl9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBpdCA9IEl0ZXJhdG9ycy50eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKG1zZywgJ3RleHQnLCAncGxhaW4nKQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHN1YnBhcnRzID0gMAorICAgICAgICBmb3Igc3VicGFydCBpbiBpdDoKKyAgICAgICAgICAgIHN1YnBhcnRzICs9IDEKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChzdWJwYXJ0LmdldF9wYXlsb2FkKCkpCisgICAgICAgIGVxKHN1YnBhcnRzLCAxKQorICAgICAgICBlcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgIiIiXAorCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworICAgIGRlZiB0ZXN0X3B1c2hDUl9MRihzZWxmKToKKyAgICAgICAgJycnRmVlZFBhcnNlciBCdWZmZXJlZFN1YkZpbGUucHVzaCgpIGFzc3VtZWQgaXQgcmVjZWl2ZWQgY29tcGxldGUKKyAgICAgICAgICAgbGluZSBlbmRpbmdzLiAgQSBDUiBlbmRpbmcgb25lIHB1c2goKSBmb2xsb3dlZCBieSBhIExGIHN0YXJ0aW5nCisgICAgICAgICAgIHRoZSBuZXh0IHB1c2goKSBhZGRlZCBhbiBlbXB0eSBsaW5lLgorICAgICAgICAnJycKKyAgICAgICAgaW10ID0gWworICAgICAgICAgICAgKCJhXHIgXG4iLCAgMiksCisgICAgICAgICAgICAoImIiLCAgICAgICAwKSwKKyAgICAgICAgICAgICgiY1xuIiwgICAgIDEpLAorICAgICAgICAgICAgKCIiLCAgICAgICAgMCksCisgICAgICAgICAgICAoImRcclxuIiwgICAxKSwKKyAgICAgICAgICAgICgiZVxyIiwgICAgIDApLAorICAgICAgICAgICAgKCJcbmYiLCAgICAgMSksCisgICAgICAgICAgICAoIlxyXG4iLCAgICAxKSwKKyAgICAgICAgICBdCisgICAgICAgIGZyb20gZW1haWwuZmVlZHBhcnNlciBpbXBvcnQgQnVmZmVyZWRTdWJGaWxlLCBOZWVkTW9yZURhdGEKKyAgICAgICAgYnNmID0gQnVmZmVyZWRTdWJGaWxlKCkKKyAgICAgICAgb20gPSBbXQorICAgICAgICBudCA9IDAKKyAgICAgICAgZm9yIGlsLCBuIGluIGltdDoKKyAgICAgICAgICAgIGJzZi5wdXNoKGlsKQorICAgICAgICAgICAgbnQgKz0gbgorICAgICAgICAgICAgbjEgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIG9sID0gYnNmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBvbCA9PSBOZWVkTW9yZURhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgb20uYXBwZW5kKG9sKQorICAgICAgICAgICAgICAgIG4xICs9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuID09IG4xKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG9tKSA9PSBudCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcnLmpvaW4oW2lsIGZvciBpbCwgbiBpbiBpbXRdKSA9PSAnJy5qb2luKG9tKSkKKworCisKK2NsYXNzIFRlc3RQYXJzZXJzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2hlYWRlcl9wYXJzZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFBhcnNlIG9ubHkgdGhlIGhlYWRlcnMgb2YgYSBjb21wbGV4IG11bHRpcGFydCBNSU1FIGRvY3VtZW50CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBIZWFkZXJQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEobXNnWydmcm9tJ10sICdwcHAtcmVxdWVzdEB6enoub3JnJykKKyAgICAgICAgZXEobXNnWyd0byddLCAncHBwQHp6ei5vcmcnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFRoaXMgbWVzc2FnZSBjb250YWlucyBhIGxpbmUgYWZ0ZXIgdGhlIFN1YmplY3Q6IGhlYWRlciB0aGF0IGhhcyBvbmx5CisgICAgICAgICMgd2hpdGVzcGFjZSwgYnV0IGl0IGlzIG5vdCBlbXB0eSEKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IHRoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXQKK1x4MjAKK0RhdGU6IE1vbiwgOCBBcHIgMjAwMiAxNTowOToxOSAtMDQwMAorTWVzc2FnZS1JRDogc3BhbQorCitIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keQorIiIiKQorICAgICAgICBlcShtc2dbJ3N1YmplY3QnXSwgJ3RoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXRcbiAnKQorICAgICAgICBlcShtc2dbJ21lc3NhZ2UtaWQnXSwgJ3NwYW0nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIkhlcmUncyB0aGUgbWVzc2FnZSBib2R5XG4iKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb25fbGFzdF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIExpa2UgdGhlIHByZXZpb3VzIHRlc3QsIGJ1dCB0aGUgc3ViamVjdCBsaW5lIGlzIHRoZSBsYXN0CisgICAgICAgICMgaGVhZGVyLgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorRGF0ZTogTW9uLCA4IEFwciAyMDAyIDE1OjA5OjE5IC0wNDAwCitNZXNzYWdlLUlEOiBzcGFtCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CitceDIwCisKK0hlcmUncyB0aGUgbWVzc2FnZSBib2R5CisiIiIpCisgICAgICAgIGVxKG1zZ1snc3ViamVjdCddLCAndGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdFxuICcpCisgICAgICAgIGVxKG1zZ1snbWVzc2FnZS1pZCddLCAnc3BhbScpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAiSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHlcbiIpCisKKyAgICBkZWYgdGVzdF9jcmxmX3NlcGFyYXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjYudHh0JywgbW9kZT0ncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQxLmdldF9wYXlsb2FkKCksICdTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50LlxyXG5cclxuJykKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vcmlzY29zJykKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9kaWdlc3Rfd2l0aF9leHRyYV9taW1lX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIFN0cnVjdHVyZSBpczoKKyAgICAgICAgIyBtdWx0aXBhcnQvZGlnZXN0CisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgIGVxKG1zZy5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0MS5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQxLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MWEgPSBwYXJ0MS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MWEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQxYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAxXG4nKQorICAgICAgICAjIG5leHQgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0Mi5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQyLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MmEgPSBwYXJ0Mi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MmEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQyYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAyXG4nKQorCisgICAgZGVmIHRlc3RfdGhyZWVfbGluZXMoc2VsZik6CisgICAgICAgICMgQSBidWcgcmVwb3J0IGJ5IEFuZHJldyBNY05hbWFyYQorICAgICAgICBsaW5lcyA9IFsnRnJvbTogQW5kcmV3IFBlcnNvbiA8YXBlcnNvbkBkb20uYWluJywKKyAgICAgICAgICAgICAgICAgJ1N1YmplY3Q6IFRlc3QnLAorICAgICAgICAgICAgICAgICAnRGF0ZTogVHVlLCAyMCBBdWcgMjAwMiAxNjo0Mzo0NSArMTAwMCddCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoTkwuam9pbihsaW5lcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydkYXRlJ10sICdUdWUsIDIwIEF1ZyAyMDAyIDE2OjQzOjQ1ICsxMDAwJykKKworICAgIGRlZiB0ZXN0X3N0cmlwX2xpbmVfZmVlZF9hbmRfY2FycmlhZ2VfcmV0dXJuX2luX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIEZvciBbIDEwMDI0NzUgXSBlbWFpbCBtZXNzYWdlIHBhcnNlciBkb2Vzbid0IGhhbmRsZSBcclxuIGNvcnJlY3RseQorICAgICAgICB2YWx1ZTEgPSAndGV4dCcKKyAgICAgICAgdmFsdWUyID0gJ21vcmUgdGV4dCcKKyAgICAgICAgbSA9ICdIZWFkZXI6ICVzXHJcbk5leHQtSGVhZGVyOiAlc1xyXG5cclxuQm9keVxyXG5cclxuJyAlICgKKyAgICAgICAgICAgIHZhbHVlMSwgdmFsdWUyKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5nZXQoJ0hlYWRlcicpLCB2YWx1ZTEpCisgICAgICAgIGVxKG1zZy5nZXQoJ05leHQtSGVhZGVyJyksIHZhbHVlMikKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfaGVhZGVyX3N5bnRheChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnPkZyb206IGZvb1xuRnJvbTogYmFyXG4hIiNRVVg7fjogem9vXG5cbmJvZHknCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobGVuKG1zZy5rZXlzKCkpLCAzKQorICAgICAgICBrZXlzID0gbXNnLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBlcShrZXlzLCBbJyEiI1FVWDt+JywgJz5Gcm9tJywgJ0Zyb20nXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdib2R5JykKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfc3BhY2Vfbm90X2FsbG93ZWRfaW5faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICc+RnJvbSBmb29AZXhhbXBsZS5jb20gMTE6MjU6NTNcbkZyb206IGJhclxuISIjUVVYO346IHpvb1xuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKGxlbihtc2cua2V5cygpKSwgMCkKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfb25lX2NoYXJhY3Rlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJ0E6IGZpcnN0IGhlYWRlclxuQjogc2Vjb25kIGhlYWRlclxuQ0M6IHRoaXJkIGhlYWRlclxuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGhlYWRlcnMgPSBtc2cua2V5cygpCisgICAgICAgIGhlYWRlcnMuc29ydCgpCisgICAgICAgIGVxKGhlYWRlcnMsIFsnQScsICdCJywgJ0NDJ10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYm9keScpCisKKyAgICBkZWYgdGVzdF9DUkxGTEZfYXRfZW5kX29mX3BhcnQoc2VsZik6CisgICAgICAgICMgaXNzdWUgNTYxMDogZmVlZHBhcnNlciBzaG91bGQgbm90IGVhdCB0d28gY2hhcnMgZnJvbSBib2R5IHBhcnQgZW5kaW5nCisgICAgICAgICMgd2l0aCAiXHJcblxuIi4KKyAgICAgICAgbSA9ICgKKyAgICAgICAgICAgICJGcm9tOiBmb29AYmFyLmNvbVxuIgorICAgICAgICAgICAgIlRvOiBiYXpcbiIKKyAgICAgICAgICAgICJNaW1lLVZlcnNpb246IDEuMFxuIgorICAgICAgICAgICAgIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1CT1VOREFSWVxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIi0tQk9VTkRBUllcbiIKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJib2R5IGVuZGluZyB3aXRoIENSTEYgbmV3bGluZVxyXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiLS1CT1VOREFSWS0tXG4iCisgICAgICAgICAgKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X3BheWxvYWQoKS5lbmRzd2l0aCgnXHJcbicpKQorCisKK2NsYXNzIFRlc3RCYXNlNjQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NE1JTUUuYmFzZTY0X2xlbignaGVsbG8nKSwKKyAgICAgICAgICAgbGVuKGJhc2U2NE1JTUUuZW5jb2RlKCdoZWxsbycsIGVvbD0nJykpKQorICAgICAgICBmb3Igc2l6ZSBpbiByYW5nZSgxNSk6CisgICAgICAgICAgICBpZiAgIHNpemUgPT0gMCA6IGJzaXplID0gMAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDMgOiBic2l6ZSA9IDQKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSA2IDogYnNpemUgPSA4CisgICAgICAgICAgICBlbGlmIHNpemUgPD0gOSA6IGJzaXplID0gMTIKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSAxMjogYnNpemUgPSAxNgorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgOiBic2l6ZSA9IDIwCisgICAgICAgICAgICBlcShiYXNlNjRNSU1FLmJhc2U2NF9sZW4oJ3gnKnNpemUpLCBic2l6ZSkKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NE1JTUUuZGVjb2RlKCcnKSwgJycpCisgICAgICAgIGVxKGJhc2U2NE1JTUUuZGVjb2RlKCdhR1ZzYkc4PScpLCAnaGVsbG8nKQorICAgICAgICBlcShiYXNlNjRNSU1FLmRlY29kZSgnYUdWc2JHOD0nLCAnWCcpLCAnaGVsbG8nKQorICAgICAgICBlcShiYXNlNjRNSU1FLmRlY29kZSgnYUdWc2JHOE5DbmR2Y214a1xuJywgJ1gnKSwgJ2hlbGxvWHdvcmxkJykKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NE1JTUUuZW5jb2RlKCcnKSwgJycpCisgICAgICAgIGVxKGJhc2U2NE1JTUUuZW5jb2RlKCdoZWxsbycpLCAnYUdWc2JHOD1cbicpCisgICAgICAgICMgVGVzdCB0aGUgYmluYXJ5IGZsYWcKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5lbmNvZGUoJ2hlbGxvXG4nKSwgJ2FHVnNiRzhLXG4nKQorICAgICAgICBlcShiYXNlNjRNSU1FLmVuY29kZSgnaGVsbG9cbicsIDApLCAnYUdWc2JHOE5DZz09XG4nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJnCisgICAgICAgIGVxKGJhc2U2NE1JTUUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElBPT0KKyIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEoYmFzZTY0TUlNRS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUE9PVxyCisiIiIpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaGUgPSBiYXNlNjRNSU1FLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZXEoaGUoJ2hlbGxvJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcpLCAnPT9pc28tODg1OS0xP2I/YUdWc2JHOE5DbmR2Y214az89JykKKyAgICAgICAgIyBUZXN0IHRoZSBjaGFyc2V0IG9wdGlvbgorICAgICAgICBlcShoZSgnaGVsbG8nLCBjaGFyc2V0PSdpc28tODg1OS0yJyksICc9P2lzby04ODU5LTI/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBrZWVwX2VvbHMgZmxhZworICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJywga2VlcF9lb2xzPVRydWUpLAorICAgICAgICAgICAnPT9pc28tODg1OS0xP2I/YUdWc2JHOEtkMjl5YkdRPT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKKz0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9JSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIZz0/PQorID0/aXNvLTg4NTktMT9iP2VIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZz89IiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCis9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP0lIaDRlSGdnZUhoNGVDQjRlSGg0SUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnPz0iIiIpCisKKworCitjbGFzcyBUZXN0UXVvcHJpKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaGxpdCA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdhJyksIG9yZCgneicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ0EnKSwgb3JkKCdaJykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnMCcpLCBvcmQoJzknKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFsnIScsICcqJywgJysnLCAnLScsICcvJywgJyAnXQorICAgICAgICBzZWxmLmhub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmhsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5obGl0KSArIGxlbihzZWxmLmhub24pID09IDI1NgorICAgICAgICBzZWxmLmJsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnICcpLCBvcmQoJ34nKSsxKV0gKyBbJ1x0J10KKyAgICAgICAgc2VsZi5ibGl0LnJlbW92ZSgnPScpCisgICAgICAgIHNlbGYuYm5vbiA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2UoMjU2KSBpZiBjaHIoeCkgbm90IGluIHNlbGYuYmxpdF0KKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLmJsaXQpICsgbGVuKHNlbGYuYm5vbikgPT0gMjU2CisKKyAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2NoZWNrKHNlbGYpOgorICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obm9uOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfcXVvcHJpX2NoZWNrKHNlbGYpOgorICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHF1b3ByaU1JTUUuYm9keV9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBocWwgPSBxdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfbGVuCisgICAgICAgIGVuYyA9IHF1b3ByaU1JTUUuaGVhZGVyX2VuY29kZQorICAgICAgICBmb3IgcyBpbiAoJ2hlbGxvJywgJ2hAZUBsQGxAb0AnKToKKyAgICAgICAgICAgICMgRW1wdHkgY2hhcnNldCBhbmQgbm8gbGluZS1lbmRpbmdzLiAgNyA9PSBSRkMgY2hyb21lCisgICAgICAgICAgICBlcShocWwocyksIGxlbihlbmMocywgY2hhcnNldD0nJywgZW9sPScnKSktNykKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgZXEoaHFsKGMpLCAxKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246CisgICAgICAgICAgICBlcShocWwoYyksIDMpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBicWwgPSBxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2xlbgorICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6CisgICAgICAgICAgICBlcShicWwoYyksIDEpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIGVxKGJxbChjKSwgMykKKworICAgIGRlZiB0ZXN0X3F1b3RlX3VucXVvdGVfaWRlbXBvdGVudChzZWxmKToKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGMgPSBjaHIoeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVvcHJpTUlNRS51bnF1b3RlKHF1b3ByaU1JTUUucXVvdGUoYykpLCBjKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhlID0gcXVvcHJpTUlNRS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGVxKGhlKCdoZWxsbycpLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBEPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCB0aGUgY2hhcnNldCBvcHRpb24KKyAgICAgICAgZXEoaGUoJ2hlbGxvJywgY2hhcnNldD0naXNvLTg4NTktMicpLCAnPT9pc28tODg1OS0yP3E/aGVsbG8/PScpCisgICAgICAgICMgVGVzdCB0aGUga2VlcF9lb2xzIGZsYWcKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcsIGtlZXBfZW9scz1UcnVlKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIKKyAgICAgICAgZXEoaGUoJ2hlbGxvXHhjN3RoZXJlJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz1DN3RoZXJlPz0nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorPT9pc28tODg1OS0xP3E/eHh4eF94eHh4X3h4eHhfeHh4eF94eD89CisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89CisgPT9pc28tODg1OS0xP3E/X3h4eHhfeHh4eF94eHh4X3h4eHhfeD89CisgPT9pc28tODg1OS0xP3E/eHh4X3h4eHhfeHh4eF94eHh4X3h4eD89CisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKKz0/aXNvLTg4NTktMT9xP3h4eHhfeHh4eF94eHh4X3h4eHhfeHg/PVxyCisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89XHIKKyA9P2lzby04ODU5LTE/cT9feHh4eF94eHh4X3h4eHhfeHh4eF94Pz1ccgorID0/aXNvLTg4NTktMT9xP3h4eF94eHh4X3h4eHhfeHh4eF94eHg/PVxyCisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmlNSU1FLmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmlNSU1FLmRlY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpTUlNRS5kZWNvZGUoJ2hlbGxvJywgJ1gnKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpTUlNRS5kZWNvZGUoJ2hlbGxvXG53b3JsZCcsICdYJyksICdoZWxsb1h3b3JsZCcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgZmxhZworICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgnaGVsbG9cclxud29ybGQnKSwgJ2hlbGxvXG53b3JsZCcpCisgICAgICAgIGVxKHF1b3ByaU1JTUUuZW5jb2RlKCdoZWxsb1xyXG53b3JsZCcsIDApLCAnaGVsbG9cbndvcmxkJykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZworICAgICAgICBlcShxdW9wcmlNSU1FLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCit4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHg9CisgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHg9Cit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKHF1b3ByaU1JTUUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKK3h4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eD1ccgorIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4PVxyCit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgIGVxKHF1b3ByaU1JTUUuZW5jb2RlKCIiIlwKK29uZSBsaW5lCisKK3R3byBsaW5lIiIiKSwgIiIiXAorb25lIGxpbmUKKwordHdvIGxpbmUiIiIpCisKKworCisjIFRlc3QgdGhlIENoYXJzZXQgY2xhc3MKK2NsYXNzIFRlc3RDaGFyc2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZyb20gZW1haWwgaW1wb3J0IENoYXJzZXQgYXMgQ2hhcnNldE1vZHVsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgQ2hhcnNldE1vZHVsZS5DSEFSU0VUU1snZmFrZSddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIE1ha2Ugc3VyZSB1cy1hc2NpaSA9IG5vIFVuaWNvZGUgY29udmVyc2lvbgorICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBzID0gJ0hlbGxvIFdvcmxkIScKKyAgICAgICAgc3AgPSBjLnRvX3NwbGl0dGFibGUocykKKyAgICAgICAgZXEocywgYy5mcm9tX3NwbGl0dGFibGUoc3ApKQorICAgICAgICAjIHRlc3QgOC1iaXQgaWRlbXBvdGVuY3kgd2l0aCB1cy1hc2NpaQorICAgICAgICBzID0gJ1x4YTRceGEyXHhhNFx4YTRceGE0XHhhNlx4YTRceGE4XHhhNFx4YWEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggUVAgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIGVxKCdoZWxsbyB3PUY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggQmFzZTY0IGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ3V0Zi04JykKKyAgICAgICAgZXEoJ2FHVnNiRzhnZDI5eWJHUT1cbicsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdvcmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIE5vbmUgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcSgnaGVsbG8gd29ybGQnLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSB0aGUgY29udmVydCBhcmd1bWVudCwgd2hlcmUgaW5wdXQgY29kZWMgIT0gb3V0cHV0IGNvZGVjCisgICAgICAgIGMgPSBDaGFyc2V0KCdldWMtanAnKQorICAgICAgICAjIFdpdGggYXBvbG9naWVzIHRvIFRva2lvIEtpa3VjaGkgOykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXEoJ1x4MWIkQjVGQ087fklXXHgxYihCJywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JykpCisgICAgICAgICAgICBlcSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLAorICAgICAgICAgICAgICAgYy5ib2R5X2VuY29kZSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLCBGYWxzZSkpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICMgV2UgcHJvYmFibHkgZG9uJ3QgaGF2ZSB0aGUgSmFwYW5lc2UgY29kZWNzIGluc3RhbGxlZAorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRlc3RpbmcgU0YgYnVnICM2MjU1MDksIHdoaWNoIHdlIGhhdmUgdG8gZmFrZSwgc2luY2UgdGhlcmUgYXJlIG5vCisgICAgICAgICMgYnVpbHQtaW4gZW5jb2RpbmdzIHdoZXJlIHRoZSBoZWFkZXIgZW5jb2RpbmcgaXMgUVAgYnV0IHRoZSBib2R5CisgICAgICAgICMgZW5jb2RpbmcgaXMgbm90LgorICAgICAgICBmcm9tIGVtYWlsIGltcG9ydCBDaGFyc2V0IGFzIENoYXJzZXRNb2R1bGUKKyAgICAgICAgQ2hhcnNldE1vZHVsZS5hZGRfY2hhcnNldCgnZmFrZScsIENoYXJzZXRNb2R1bGUuUVAsIE5vbmUpCisgICAgICAgIGMgPSBDaGFyc2V0KCdmYWtlJykKKyAgICAgICAgZXEoJ2hlbGxvIHdceGY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfY2hhcnNldF9uYW1lKHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCh1J3VzLWFzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY2hhcnNldCksICd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVycm9ycy5DaGFyc2V0RXJyb3IsIENoYXJzZXQsICdhc2NceGZmaWknKQorCisgICAgZGVmIHRlc3RfY29kZWNzX2FsaWFzZXNfYWNjZXB0ZWQoc2VsZik6CisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCd1dGY4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY2hhcnNldCksICd1dGYtOCcpCisKKworIyBUZXN0IG11bHRpbGluZ3VhbCBNSU1FIGhlYWRlcnMuCitjbGFzcyBUZXN0SGVhZGVyKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignSGVsbG8gV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGguYXBwZW5kKCcgR29vZGJ5ZSBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhICBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfc3VycHJpc2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEnKQorICAgICAgICBoLmFwcGVuZCgnR29vZGJ5ZSBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhIEdvb2RieWUgV29ybGQhJykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9uZWVkc19ub19kZWNvZGluZyhzZWxmKToKKyAgICAgICAgaCA9ICdubyBkZWNvZGluZyBuZWVkZWQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlX2hlYWRlcihoKSwgWyhoLCBOb25lKV0pCisKKyAgICBkZWYgdGVzdF9sb25nKHNlbGYpOgorICAgICAgICBoID0gSGVhZGVyKCJJIGFtIHRoZSB2ZXJ5IG1vZGVsIG9mIGEgbW9kZXJuIE1ham9yLUdlbmVyYWw7IEkndmUgaW5mb3JtYXRpb24gdmVnZXRhYmxlLCBhbmltYWwsIGFuZCBtaW5lcmFsOyBJIGtub3cgdGhlIGtpbmdzIG9mIEVuZ2xhbmQsIGFuZCBJIHF1b3RlIHRoZSBmaWdodHMgaGlzdG9yaWNhbCBmcm9tIE1hcmF0aG9uIHRvIFdhdGVybG9vLCBpbiBvcmRlciBjYXRlZ29yaWNhbDsgSSdtIHZlcnkgd2VsbCBhY3F1YWludGVkLCB0b28sIHdpdGggbWF0dGVycyBtYXRoZW1hdGljYWw7IEkgdW5kZXJzdGFuZCBlcXVhdGlvbnMsIGJvdGggdGhlIHNpbXBsZSBhbmQgcXVhZHJhdGljYWw7IGFib3V0IGJpbm9taWFsIHRoZW9yZW0gSSdtIHRlZW1pbmcgd2l0aCBhIGxvdCBvJyBuZXdzLCB3aXRoIG1hbnkgY2hlZXJmdWwgZmFjdHMgYWJvdXQgdGhlIHNxdWFyZSBvZiB0aGUgaHlwb3RlbnVzZS4iLAorICAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYpCisgICAgICAgIGZvciBsIGluIGguZW5jb2RlKHNwbGl0Y2hhcnM9JyAnKS5zcGxpdCgnXG4gJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGwpIDw9IDc2KQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5ndWFsKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGN6ID0gQ2hhcnNldCgiaXNvLTg4NTktMiIpCisgICAgICAgIHV0ZjggPSBDaGFyc2V0KCJ1dGYtOCIpCisgICAgICAgIGdfaGVhZCA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBjel9oZWFkID0gIkZpbmFuXHhlOG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgdGxha2VtIGplamljaCBkXHhmOXZ0aXB1Li4gIgorICAgICAgICB1dGY4X2hlYWQgPSB1Ilx1NmI2M1x1NzhiYVx1MzA2Ylx1OGEwMFx1MzA0Nlx1MzA2OFx1N2ZmYlx1OGEzM1x1MzA2Zlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMFx1OTBlOFx1MzA2Zlx1MzBjOVx1MzBhNFx1MzBjNFx1OGE5ZVx1MzA2N1x1MzA1OVx1MzA0Y1x1MzAwMVx1MzA0Mlx1MzA2OFx1MzA2Zlx1MzA2N1x1MzA1Zlx1MzA4OVx1MzA4MVx1MzA2N1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgdW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0IGdlcnNwdXQuXHUzMDBkXHUzMDY4XHU4YTAwXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIi5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgaCA9IEhlYWRlcihnX2hlYWQsIGcpCisgICAgICAgIGguYXBwZW5kKGN6X2hlYWQsIGN6KQorICAgICAgICBoLmFwcGVuZCh1dGY4X2hlYWQsIHV0ZjgpCisgICAgICAgIGVuYyA9IGguZW5jb2RlKCkKKyAgICAgICAgZXEoZW5jLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkZXJiYW5kX2tvPz0KKyA9P2lzby04ODU5LTE/cT9tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpc2NoZW5fV2FuPz0KKyA9P2lzby04ODU5LTE/cT9kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nZW5fYmVmPUY2Pz0KKyA9P2lzby04ODU5LTE/cT9yZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldHJvcG9sZV9zZV9ocm91dGlseT89CisgPT9pc28tODg1OS0yP3E/X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PSA9P3V0Zi04P2I/NXEyajU2SzY/PQorID0/dXRmLTg/Yj80NEdyNktpQTQ0R0c0NEdvNTcrNzZLaXo0NEd2NDRHVjQ0S000NEdtNDRHRTQ0Rys0NEdiNDRLVDQ0Q0M/PQorID0/dXRmLTg/Yj81TGlBNllPbzQ0R3Y0NE9KNDRLazQ0T0U2S3FlNDRHbjQ0R1o0NEdNNDRDQjQ0R0M0NEdvNDRHdjQ0R24/PQorID0/dXRmLTg/Yj80NEdmNDRLSjQ0S0I0NEduNDRHWjQ0Q0M1YTZmNlpxYjQ0R3I0NEd2NDRDTVYyVnViaUJwYzNRZ1pHRno/PQorID0/dXRmLTg/cT9fTnVuc3R1Y2tfZ2l0X3VuZF9TbG90ZXJtZXllcj0zRl9KYSFfQmVpaGVyaHVuZF9kYXNfT2Rlcl9kaWVfRmw/PQorID0/dXRmLTg/Yj9hWEJ3WlhKM1lXeGtkQ0JuWlhKemNIVjBMdU9BamVPQnFPaW9nT09CbytPQnB1T0JoT09CdnVPQm1RPT0/PQorID0/dXRmLTg/Yj80NENDPz0iIiIpCisgICAgICAgIGVxKGRlY29kZV9oZWFkZXIoZW5jKSwKKyAgICAgICAgICAgWyhnX2hlYWQsICJpc28tODg1OS0xIiksIChjel9oZWFkLCAiaXNvLTg4NTktMiIpLAorICAgICAgICAgICAgKHV0ZjhfaGVhZCwgInV0Zi04IildKQorICAgICAgICB1c3RyID0gdW5pY29kZShoKQorICAgICAgICBlcSh1c3RyLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgJ0RpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQgJworICAgICAgICAgICAna29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGMzXHhiY2RsXHhjM1x4YmNuZGlzY2hlbiAnCisgICAgICAgICAgICdXYW5kZ2VtXHhjM1x4YTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gJworICAgICAgICAgICAnYmVmXHhjM1x4YjZyZGVydC4gRmluYW5ceGM0XHg4ZG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgJworICAgICAgICAgICAndGxha2VtIGplamljaCBkXHhjNVx4YWZ2dGlwdS4uIFx4ZTZceGFkXHhhM1x4ZTdceGEyXHhiYVx4ZTNceDgxJworICAgICAgICAgICAnXHhhYlx4ZThceGE4XHg4MFx4ZTNceDgxXHg4Nlx4ZTNceDgxXHhhOFx4ZTdceGJmXHhiYlx4ZThceGE4XHhiMycKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhZlx4ZTNceDgxXHg5NVx4ZTNceDgyXHg4Y1x4ZTNceDgxXHhhNlx4ZTNceDgxXHg4NFx4ZTMnCisgICAgICAgICAgICdceDgxXHhiZVx4ZTNceDgxXHg5Ylx4ZTNceDgyXHg5M1x4ZTNceDgwXHg4Mlx4ZTRceGI4XHg4MFx4ZTlceDgzJworICAgICAgICAgICAnXHhhOFx4ZTNceDgxXHhhZlx4ZTNceDgzXHg4OVx4ZTNceDgyXHhhNFx4ZTNceDgzXHg4NFx4ZThceGFhXHg5ZScKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgxXHg4Y1x4ZTNceDgwXHg4MVx4ZTNceDgxXHg4Mlx4ZTMnCisgICAgICAgICAgICdceDgxXHhhOFx4ZTNceDgxXHhhZlx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5Zlx4ZTNceDgyXHg4OVx4ZTNceDgyJworICAgICAgICAgICAnXHg4MVx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgwXHg4Mlx4ZTVceGFlXHg5Zlx4ZTlceDlhXHg5YicKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhYlx4ZTNceDgxXHhhZlx4ZTNceDgwXHg4Y1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgJworICAgICAgICAgICAndW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0ICcKKyAgICAgICAgICAgJ2dlcnNwdXQuXHhlM1x4ODBceDhkXHhlM1x4ODFceGE4XHhlOFx4YThceDgwXHhlM1x4ODFceGEzXHhlM1x4ODEnCisgICAgICAgICAgICdceGE2XHhlM1x4ODFceDg0XHhlM1x4ODFceGJlXHhlM1x4ODFceDk5XHhlM1x4ODBceDgyJykKKyAgICAgICAgIyBUZXN0IG1ha2VfaGVhZGVyKCkKKyAgICAgICAgbmV3aCA9IG1ha2VfaGVhZGVyKGRlY29kZV9oZWFkZXIoZW5jKSkKKyAgICAgICAgZXEobmV3aCwgZW5jKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2N0b3JfZGVmYXVsdF9hcmdzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgZXEoaCwgJycpCisgICAgICAgIGguYXBwZW5kKCdmb28nLCBDaGFyc2V0KCdpc28tODg1OS0xJykpCisgICAgICAgIGVxKGgsICc9P2lzby04ODU5LTE/cT9mb28/PScpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9tYXhsaW5lbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gJ0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUgNzZ0aCBjaGFyYWN0ZXIgYm91bmRhcnkgdG8gdGVzdCB0aGUgbm9uLWRlZmF1bHQgYmVoYXZpb3InCisgICAgICAgIGggPSBIZWFkZXIoaHN0cikKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAorQSB2ZXJ5IGxvbmcgbGluZSB0aGF0IG11c3QgZ2V0IHNwbGl0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGF0IHRoZSA3NnRoCisgY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJycnKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAorQSB2ZXJ5IGxvbmcgbGluZSB0aGF0IG11c3QgZ2V0IHNwbGl0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGF0IHRoZQorIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJycnKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIG1heGxpbmVsZW49MTAyNCwgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBlcShoLmVuY29kZSgpLCBoc3RyKQorCisgICAgZGVmIHRlc3RfdXNfYXNjaWlfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdoZWxsbycKKyAgICAgICAgeCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoeCwgWygnaGVsbG8nLCBOb25lKV0pCisgICAgICAgIGggPSBtYWtlX2hlYWRlcih4KQorICAgICAgICBlcShzLCBoLmVuY29kZSgpKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgaC5hcHBlbmQoJ2hlbGxvJywgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisKKyMjICAgIGRlZiB0ZXN0X3VuaWNvZGVfZXJyb3Ioc2VsZik6CisjIyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsIHUnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgJ1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICBoID0gSGVhZGVyKCkKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBoLmFwcGVuZCwgdSdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsICdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB1J1x1ODNjYVx1NTczMFx1NjY0Mlx1NTkyYicsICdpc28tODg1OS0xJykKKworICAgIGRlZiB0ZXN0X3V0Zjhfc2hvcnRlc3Qoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKHUncFx4ZjZzdGFsJywgJ3V0Zi04JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJz0/dXRmLTg/cT9wPUMzPUI2c3RhbD89JykKKyAgICAgICAgaCA9IEhlYWRlcih1J1x1ODNjYVx1NTczMFx1NjY0Mlx1NTkyYicsICd1dGYtOCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICc9P3V0Zi04P2I/NkkrSzVaeXc1cG1DNWFTcj89JykKKworICAgIGRlZiB0ZXN0X2JhZF84Yml0X2hlYWRlcihzZWxmKToKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHggPSAnWW53cDRkVUViYXkgQXVjdGlvbiBTZW1pYXItIE5vIENoYXJnZSBceDk2IEVhcm4gQmlnJworICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsIHgpCisgICAgICAgIGggPSBIZWFkZXIoKQorICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBoLmFwcGVuZCwgeCkKKyAgICAgICAgZXEoc3RyKEhlYWRlcih4LCBlcnJvcnM9J3JlcGxhY2UnKSksIHgpCisgICAgICAgIGguYXBwZW5kKHgsIGVycm9ycz0ncmVwbGFjZScpCisgICAgICAgIGVxKHN0cihoKSwgeCkKKworICAgIGRlZiB0ZXN0X2VuY29kZWRfYWRqYWNlbnRfbm9uZW5jb2RlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoKQorICAgICAgICBoLmFwcGVuZCgnaGVsbG8nLCAnaXNvLTg4NTktMScpCisgICAgICAgIGguYXBwZW5kKCd3b3JsZCcpCisgICAgICAgIHMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKHMsICc9P2lzby04ODU5LTE/cT9oZWxsbz89IHdvcmxkJykKKyAgICAgICAgaCA9IG1ha2VfaGVhZGVyKGRlY29kZV9oZWFkZXIocykpCisgICAgICAgIGVxKGguZW5jb2RlKCksIHMpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2VhdGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdTdWJqZWN0OiA9P2tvaTgtcj9iPzhOTFAxOFhTeThFZ3pzRWd4c25Pd2N6WXp0az0/PSA9P2tvaTgtcj9xPz1DQT89IHp6LicKKyAgICAgICAgcGFydHMgPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKHBhcnRzLCBbKCdTdWJqZWN0OicsIE5vbmUpLCAoJ1x4ZjBceGQyXHhjZlx4ZDdceGM1XHhkMlx4Y2JceGMxIFx4Y2VceGMxIFx4YzZceGM5XHhjZVx4YzFceGNjXHhkOFx4Y2VceGQ5XHhjYScsICdrb2k4LXInKSwgKCd6ei4nLCBOb25lKV0pCisgICAgICAgIGhkciA9IG1ha2VfaGVhZGVyKHBhcnRzKQorICAgICAgICBlcShoZHIuZW5jb2RlKCksCisgICAgICAgICAgICdTdWJqZWN0OiA9P2tvaTgtcj9iPzhOTFAxOFhTeThFZ3pzRWd4c25Pd2N6WXp0bks/PSB6ei4nKQorCisgICAgZGVmIHRlc3RfYnJva2VuX2Jhc2U2NF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIHMgPSAnU3ViamVjdDogPT9FVUMtS1I/Qj9DU2l4cExEdEtTQy83TGl1dnNheDRpQzZ1TG13TWNpaklLSGFJTHpTd2QvSDBTQzgrTENqd0xzZ3Y3Vy8rTWozSSA/PScKKyAgICAgICAgcmFpc2VzKEVycm9ycy5IZWFkZXJQYXJzZUVycm9yLCBkZWNvZGVfaGVhZGVyLCBzKQorCisgICAgIyBJc3N1ZSAxMDc4OTE5CisgICAgZGVmIHRlc3RfYXNjaWlfYWRkX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nYnVkLmdpZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJidWQuZ2lmIicsCisgICAgICAgICAgICBtc2dbJ0NvbnRlbnQtRGlzcG9zaXRpb24nXSkKKworICAgIGRlZiB0ZXN0X25vbmFzY2lpX2FkZF9oZWFkZXJfdmlhX3RyaXBsZShzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgZmlsZW5hbWU9KCdpc28tODg1OS0xJywgJycsICdGdVx4ZGZiYWxsZXIucHB0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAnYXR0YWNobWVudDsgZmlsZW5hbWUqPSJpc28tODg1OS0xXCdcJ0Z1JURGYmFsbGVyLnBwdCInLAorICAgICAgICAgICAgbXNnWydDb250ZW50LURpc3Bvc2l0aW9uJ10pCisKKyAgICBkZWYgdGVzdF9lbmNvZGVfdW5hbGlhc2VkX2NoYXJzZXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTM3OTQxNjogd2hlbiB0aGUgY2hhcnNldCBoYXMgbm8gb3V0cHV0IGNvbnZlcnNpb24sCisgICAgICAgICMgb3V0cHV0IHdhcyBhY2NpZGVudGFsbHkgZ2V0dGluZyBjb2VyY2VkIHRvIHVuaWNvZGUuCisgICAgICAgIHJlcyA9IEhlYWRlcignYWJjJywnaXNvLTg4NTktMicpLmVuY29kZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCAnPT9pc28tODg1OS0yP3E/YWJjPz0nKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmVzLCBzdHIpCisKKworIyBUZXN0IFJGQyAyMjMxIGhlYWRlciBwYXJhbWV0ZXJzIChlbi9kZSljb2RpbmcKK2NsYXNzIFRlc3RSRkMyMjMxKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI5LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICciVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEiJykpCisKKyAgICBkZWYgdGVzdF9zZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICcnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorIGlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTsKKyB0aXRsZSo9InVzLWFzY2lpJ2VuJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXNuJTI3dCUyMGl0JTIxIgorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdmb28nLCAnYmFyJywgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZvbycsIGhlYWRlcj0nQ29udGVudC1UeXBlJykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorIGlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiOworIHRpdGxlKj0idXMtYXNjaWknZW4nVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpc24lMjd0JTIwaXQlMjEiCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2dldF9jb250ZW50X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCAndXMtYXNjaWknKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0iCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgTkFNRSowPWZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNOyBOQU1FKjE9UF9uc21haWwuaHRtCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnTkFNRScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcGFyYW0sCisgICAgICAgICAgICAnZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0nKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lX2VuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9ub25lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOworXHRib3VuZGFyeSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGJvdW5kYXJ5KjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRib3VuZGFyeSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfYm91bmRhcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIG5vbnNlbnNpY2FsIGNoYXJzZXQgdmFsdWUsIGJ1dCB0ZXN0cyB0aGUgY29kZSBhbnl3YXkKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKK1x0Y2hhcnNldCowKj0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRjaGFyc2V0KjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRjaGFyc2V0KjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJib2d1cyd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9Ym9ndXMnJ3V0Zi04JUUyJTgwJTlECisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgICMgVGhpcyBzaG91bGQgcmV0dXJuIE5vbmUgYmVjYXVzZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB0aGUgY2hhcnNldAorICAgICAgICAjIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfY2hhcmFjdGVyX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWFzY2lpJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9ImFzY2lpJ3h4J1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjIqPSJpcyBpdCBub3QucGRmJUUyIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmXHVmZmZkJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqPVgtVU5LTk9XTicnbXlmaWxlLnR4dAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ215ZmlsZS50eHQnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9zaW5nbGVfdGlja19pbl9maWxlbmFtZV9leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwiRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgTm9uZSkKKyAgICAgICAgZXEobGFuZ3VhZ2UsIE5vbmUpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lKjA9XCJGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3RpY2tfYXR0YWNrX2V4dGVuZGVkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMCo9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMSo9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFjayhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMD1cInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3NcIjsgbmFtZSoxPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJ1cy1hc2NpaSdlbi11cydGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fZXh0ZW5kZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287IG5hbWU9XCJGcmFuaydzIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnbmFtZScpLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2VuY29kZWRfdGhlbl91bmVuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMT1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV91bmVuY29kZWRfdGhlbl9lbmNvZGVkX3NlZ21lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMD1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMSo9XCIgRG9jdW1lbnRcIjsKK1x0bmFtZSoyKj1cIiBGb3IgWW91XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICdNeSBEb2N1bWVudCBGb3IgWW91JykKKworCisKKyMgVGVzdHMgdG8gZW5zdXJlIHRoYXQgc2lnbmVkIHBhcnRzIG9mIGFuIGVtYWlsIGFyZSBjb21wbGV0ZWx5IHByZXNlcnZlZCwgYXMKKyMgcmVxdWlyZWQgYnkgUkZDMTg0NyBzZWN0aW9uIDIuMS4gIE5vdGUgdGhhdCB0aGVzZSBhcmUgaW5jb21wbGV0ZSwgYmVjYXVzZSB0aGUKKyMgZW1haWwgcGFja2FnZSBkb2VzIG5vdCBjdXJyZW50bHkgYWx3YXlzIHByZXNlcnZlIHRoZSBib2R5LiAgU2VlIGlzc3VlIDE2NzA3NjUuCitjbGFzcyBUZXN0U2lnbmVkKFRlc3RFbWFpbEJhc2UpOgorCisgICAgZGVmIF9tc2dfYW5kX29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmluZGZpbGUoZmlsZW5hbWUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcmlnaW5hbCA9IGZwLnJlYWQoKQorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhvcmlnaW5hbCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIG9yaWdpbmFsLCBtc2cKKworICAgIGRlZiBfc2lnbmVkX3BhcnRzX2VxKHNlbGYsIG9yaWdpbmFsLCByZXN1bHQpOgorICAgICAgICAjIEV4dHJhY3QgdGhlIGZpcnN0IG1pbWUgcGFydCBvZiBlYWNoIG1lc3NhZ2UKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIHJlcGFydCA9IHJlLmNvbXBpbGUocideLS0oW15cbl0rKVxuKC4qPylcbi0tXDEkJywgcmUuUyB8IHJlLk0pCisgICAgICAgIGlucGFydCA9IHJlcGFydC5zZWFyY2gob3JpZ2luYWwpLmdyb3VwKDIpCisgICAgICAgIG91dHBhcnQgPSByZXBhcnQuc2VhcmNoKHJlc3VsdCkuZ3JvdXAoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwYXJ0LCBpbnBhcnQpCisKKyAgICBkZWYgdGVzdF9sb25nX2hlYWRlcnNfYXNfc3RyaW5nKHNlbGYpOgorICAgICAgICBvcmlnaW5hbCwgbXNnID0gc2VsZi5fbXNnX2FuZF9vYmooJ21zZ180NS50eHQnKQorICAgICAgICByZXN1bHQgPSBtc2cuYXNfc3RyaW5nKCkKKyAgICAgICAgc2VsZi5fc2lnbmVkX3BhcnRzX2VxKG9yaWdpbmFsLCByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9sb25nX2hlYWRlcnNfZmxhdHRlbihzZWxmKToKKyAgICAgICAgb3JpZ2luYWwsIG1zZyA9IHNlbGYuX21zZ19hbmRfb2JqKCdtc2dfNDUudHh0JykKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIEdlbmVyYXRvcihmcCkuZmxhdHRlbihtc2cpCisgICAgICAgIHJlc3VsdCA9IGZwLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5fc2lnbmVkX3BhcnRzX2VxKG9yaWdpbmFsLCByZXN1bHQpCisKKworCitkZWYgX3Rlc3RjbGFzc2VzKCk6CisgICAgbW9kID0gc3lzLm1vZHVsZXNbX19uYW1lX19dCisgICAgcmV0dXJuIFtnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKHRlc3RjbGFzcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHJ1bl91bml0dGVzdCh0ZXN0Y2xhc3MpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI3ZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmIxOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weSBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzI3NTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzIGZvciAob3B0aW9uYWwpIEFzaWFuIGNvZGVjcworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbCBpbXBvcnQgVGVzdEVtYWlsQmFzZQorZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKKworIyBXZSdyZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYnVpbHQtaW4gQXNpYW4KKyMgY29kZWNzLCBzbyB3ZSBoYXZlIHRvIHNraXAgYWxsIHRoZXNlIHRlc3RzLgordHJ5OgorICAgIHVuaWNvZGUoJ2ZvbycsICdldWMtanAnKQorZXhjZXB0IExvb2t1cEVycm9yOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0CisKKworDAorY2xhc3MgVGVzdEVtYWlsQXNpYW5Db2RlY3MoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfamFwYW5lc2VfY29kZWNzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBqID0gQ2hhcnNldCgiZXVjLWpwIikKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBoID0gSGVhZGVyKCJIZWxsbyBXb3JsZCEiKQorICAgICAgICBqaGVsbG8gPSAnXHhhNVx4Y2ZceGE1XHhlZFx4YTFceGJjXHhhNVx4ZWZceGExXHhiY1x4YTVceGViXHhhNVx4YzlceGExXHhhYScKKyAgICAgICAgZ2hlbGxvID0gJ0dyXHhmY1x4ZGYgR290dCEnCisgICAgICAgIGguYXBwZW5kKGpoZWxsbywgaikKKyAgICAgICAgaC5hcHBlbmQoZ2hlbGxvLCBnKQorICAgICAgICAjIEJBVzogVGhpcyB1c2VkIHRvIC0tIGFuZCBtYXliZSBzaG91bGQgLS0gZm9sZCB0aGUgdHdvIGlzby04ODU5LTEKKyAgICAgICAgIyBjaHVua3MgaW50byBhIHNpbmdsZSBlbmNvZGVkIHdvcmQuICBIb3dldmVyIGl0IGRvZXNuJ3QgdmlvbGF0ZSB0aGUKKyAgICAgICAgIyBzdGFuZGFyZCB0byBoYXZlIHRoZW0gYXMgdHdvIGVuY29kZWQgY2h1bmtzIGFuZCBtYXliZSBpdCdzCisgICAgICAgICMgcmVhc29uYWJsZSA8d2luaz4gZm9yIGVhY2ggLmFwcGVuZCgpIGNhbGwgdG8gcmVzdWx0IGluIGEgc2VwYXJhdGUKKyAgICAgICAgIyBlbmNvZGVkIHdvcmQuCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK0hlbGxvIFdvcmxkISA9P2lzby0yMDIyLWpwP2I/R3lSQ0pVOGxiU0U4Slc4aFBDVnJKVWtoS2hzb1FnPT0/PQorID0/aXNvLTg4NTktMT9xP0dyPUZDPURGPz0gPT9pc28tODg1OS0xP3E/X0dvdHQhPz0iIiIpCisgICAgICAgIGVxKGRlY29kZV9oZWFkZXIoaC5lbmNvZGUoKSksCisgICAgICAgICAgIFsoJ0hlbGxvIFdvcmxkIScsIE5vbmUpLAorICAgICAgICAgICAgKCdceDFiJEIlTyVtITwlbyE8JWslSSEqXHgxYihCJywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAoJ0dyXHhmY1x4ZGYgR290dCEnLCAnaXNvLTg4NTktMScpXSkKKyAgICAgICAgbG9uZyA9ICd0ZXN0LWphIFx4YTRceGQ4XHhjNVx4ZWFceGI5XHhjNlx4YTRceGI1XHhhNFx4ZWNceGE0XHhiZlx4YTVceGUxXHhhMVx4YmNceGE1XHhlYlx4YTRceGNmXHhiYlx4Y2FceGIyXHhmMVx4YmNceGQ0XHhhNFx4Y2VceGJlXHhiNVx4YzdceGE3XHhhNFx4ZjJceGMyXHhkNFx4YTRceGMzXHhhNFx4YzZceGE0XHhhNFx4YTRceGRlXHhhNFx4YjknCisgICAgICAgIGggPSBIZWFkZXIobG9uZywgaiwgaGVhZGVyX25hbWU9IlN1YmplY3QiKQorICAgICAgICAjIHRlc3QgYSB2ZXJ5IGxvbmcgaGVhZGVyCisgICAgICAgIGVuYyA9IGguZW5jb2RlKCkKKyAgICAgICAgIyBUSzogc3BsaXR0aW5nIHBvaW50IG1heSBkaWZmZXIgYnkgY29kZWMgZGVzaWduIGFuZC9vciBIZWFkZXIgZW5jb2RpbmcKKyAgICAgICAgZXEoZW5jICwgIiIiXAorPT9pc28tMjAyMi1qcD9iP2RHVnpkQzFxWVNBYkpFSWtXRVZxT1VZa05TUnNKRDhsWVNFOEpXc2tUenRLR3loQz89CisgPT9pc28tMjAyMi1qcD9iP0d5UkNNbkU4VkNST1BqVkhKeVJ5UWxRa1F5UkdKQ1FrWGlRNUd5aEM/PSIiIikKKyAgICAgICAgIyBUSzogZnVsbCBkZWNvZGUgY29tcGFyaXNvbgorICAgICAgICBlcShoLl9fdW5pY29kZV9fKCkuZW5jb2RlKCdldWMtanAnKSwgbG9uZykKKworICAgIGRlZiB0ZXN0X3BheWxvYWRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGpoZWxsbyA9ICdceGE1XHhjZlx4YTVceGVkXHhhMVx4YmNceGE1XHhlZlx4YTFceGJjXHhhNVx4ZWJceGE1XHhjOVx4YTFceGFhJworICAgICAgICBqY29kZSAgPSAnZXVjLWpwJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKGpoZWxsbywgamNvZGUpCisgICAgICAgIHVzdHIgPSB1bmljb2RlKG1zZy5nZXRfcGF5bG9hZCgpLCBtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpoZWxsbywgdXN0ci5lbmNvZGUoamNvZGUpKQorCisKKwwKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0RW1haWxBc2lhbkNvZGVjcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0RW1haWxBc2lhbkNvZGVjcykKKworCisMCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmE2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmE2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNzUwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5CkBAIC0wLDAgKzEsNzcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzIGZvciAob3B0aW9uYWwpIEFzaWFuIGNvZGVjcworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbCBpbXBvcnQgVGVzdEVtYWlsQmFzZQorZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKKworIyBXZSdyZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYnVpbHQtaW4gQXNpYW4KKyMgY29kZWNzLCBzbyB3ZSBoYXZlIHRvIHNraXAgYWxsIHRoZXNlIHRlc3RzLgordHJ5OgorICAgIHVuaWNvZGUoJ2ZvbycsICdldWMtanAnKQorZXhjZXB0IExvb2t1cEVycm9yOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0CisKKworDAorY2xhc3MgVGVzdEVtYWlsQXNpYW5Db2RlY3MoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfamFwYW5lc2VfY29kZWNzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBqID0gQ2hhcnNldCgiZXVjLWpwIikKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBoID0gSGVhZGVyKCJIZWxsbyBXb3JsZCEiKQorICAgICAgICBqaGVsbG8gPSAnXHhhNVx4Y2ZceGE1XHhlZFx4YTFceGJjXHhhNVx4ZWZceGExXHhiY1x4YTVceGViXHhhNVx4YzlceGExXHhhYScKKyAgICAgICAgZ2hlbGxvID0gJ0dyXHhmY1x4ZGYgR290dCEnCisgICAgICAgIGguYXBwZW5kKGpoZWxsbywgaikKKyAgICAgICAgaC5hcHBlbmQoZ2hlbGxvLCBnKQorICAgICAgICAjIEJBVzogVGhpcyB1c2VkIHRvIC0tIGFuZCBtYXliZSBzaG91bGQgLS0gZm9sZCB0aGUgdHdvIGlzby04ODU5LTEKKyAgICAgICAgIyBjaHVua3MgaW50byBhIHNpbmdsZSBlbmNvZGVkIHdvcmQuICBIb3dldmVyIGl0IGRvZXNuJ3QgdmlvbGF0ZSB0aGUKKyAgICAgICAgIyBzdGFuZGFyZCB0byBoYXZlIHRoZW0gYXMgdHdvIGVuY29kZWQgY2h1bmtzIGFuZCBtYXliZSBpdCdzCisgICAgICAgICMgcmVhc29uYWJsZSA8d2luaz4gZm9yIGVhY2ggLmFwcGVuZCgpIGNhbGwgdG8gcmVzdWx0IGluIGEgc2VwYXJhdGUKKyAgICAgICAgIyBlbmNvZGVkIHdvcmQuCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK0hlbGxvIFdvcmxkISA9P2lzby0yMDIyLWpwP2I/R3lSQ0pVOGxiU0U4Slc4aFBDVnJKVWtoS2hzb1FnPT0/PQorID0/aXNvLTg4NTktMT9xP0dyPUZDPURGPz0gPT9pc28tODg1OS0xP3E/X0dvdHQhPz0iIiIpCisgICAgICAgIGVxKGRlY29kZV9oZWFkZXIoaC5lbmNvZGUoKSksCisgICAgICAgICAgIFsoJ0hlbGxvIFdvcmxkIScsIE5vbmUpLAorICAgICAgICAgICAgKCdceDFiJEIlTyVtITwlbyE8JWslSSEqXHgxYihCJywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAoJ0dyXHhmY1x4ZGYgR290dCEnLCAnaXNvLTg4NTktMScpXSkKKyAgICAgICAgbG9uZyA9ICd0ZXN0LWphIFx4YTRceGQ4XHhjNVx4ZWFceGI5XHhjNlx4YTRceGI1XHhhNFx4ZWNceGE0XHhiZlx4YTVceGUxXHhhMVx4YmNceGE1XHhlYlx4YTRceGNmXHhiYlx4Y2FceGIyXHhmMVx4YmNceGQ0XHhhNFx4Y2VceGJlXHhiNVx4YzdceGE3XHhhNFx4ZjJceGMyXHhkNFx4YTRceGMzXHhhNFx4YzZceGE0XHhhNFx4YTRceGRlXHhhNFx4YjknCisgICAgICAgIGggPSBIZWFkZXIobG9uZywgaiwgaGVhZGVyX25hbWU9IlN1YmplY3QiKQorICAgICAgICAjIHRlc3QgYSB2ZXJ5IGxvbmcgaGVhZGVyCisgICAgICAgIGVuYyA9IGguZW5jb2RlKCkKKyAgICAgICAgIyBUSzogc3BsaXR0aW5nIHBvaW50IG1heSBkaWZmZXIgYnkgY29kZWMgZGVzaWduIGFuZC9vciBIZWFkZXIgZW5jb2RpbmcKKyAgICAgICAgZXEoZW5jICwgIiIiXAorPT9pc28tMjAyMi1qcD9iP2RHVnpkQzFxWVNBYkpFSWtXRVZxT1VZa05TUnNKRDhsWVNFOEpXc2tUenRLR3loQz89CisgPT9pc28tMjAyMi1qcD9iP0d5UkNNbkU4VkNST1BqVkhKeVJ5UWxRa1F5UkdKQ1FrWGlRNUd5aEM/PSIiIikKKyAgICAgICAgIyBUSzogZnVsbCBkZWNvZGUgY29tcGFyaXNvbgorICAgICAgICBlcShoLl9fdW5pY29kZV9fKCkuZW5jb2RlKCdldWMtanAnKSwgbG9uZykKKworICAgIGRlZiB0ZXN0X3BheWxvYWRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGpoZWxsbyA9ICdceGE1XHhjZlx4YTVceGVkXHhhMVx4YmNceGE1XHhlZlx4YTFceGJjXHhhNVx4ZWJceGE1XHhjOVx4YTFceGFhJworICAgICAgICBqY29kZSAgPSAnZXVjLWpwJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKGpoZWxsbywgamNvZGUpCisgICAgICAgIHVzdHIgPSB1bmljb2RlKG1zZy5nZXRfcGF5bG9hZCgpLCBtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpoZWxsbywgdXN0ci5lbmNvZGUoamNvZGUpKQorCisKKwwKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0RW1haWxBc2lhbkNvZGVjcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0RW1haWxBc2lhbkNvZGVjcykKKworCisMCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oZGVmYXVsdFRlc3Q9J3N1aXRlJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjc3ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjc3ZjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzX3JlbmFtZWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOTdlOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CkBAIC0wLDAgKzEsMzMyOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IGJhc2U2NAoraW1wb3J0IGRpZmZsaWIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworaW1wb3J0IGVtYWlsCisKK2Zyb20gZW1haWwuY2hhcnNldCBpbXBvcnQgQ2hhcnNldAorZnJvbSBlbWFpbC5oZWFkZXIgaW1wb3J0IEhlYWRlciwgZGVjb2RlX2hlYWRlciwgbWFrZV9oZWFkZXIKK2Zyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIsIEhlYWRlclBhcnNlcgorZnJvbSBlbWFpbC5nZW5lcmF0b3IgaW1wb3J0IEdlbmVyYXRvciwgRGVjb2RlZEdlbmVyYXRvcgorZnJvbSBlbWFpbC5tZXNzYWdlIGltcG9ydCBNZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUuYXBwbGljYXRpb24gaW1wb3J0IE1JTUVBcHBsaWNhdGlvbgorZnJvbSBlbWFpbC5taW1lLmF1ZGlvIGltcG9ydCBNSU1FQXVkaW8KK2Zyb20gZW1haWwubWltZS50ZXh0IGltcG9ydCBNSU1FVGV4dAorZnJvbSBlbWFpbC5taW1lLmltYWdlIGltcG9ydCBNSU1FSW1hZ2UKK2Zyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQorZnJvbSBlbWFpbC5taW1lLm1lc3NhZ2UgaW1wb3J0IE1JTUVNZXNzYWdlCitmcm9tIGVtYWlsLm1pbWUubXVsdGlwYXJ0IGltcG9ydCBNSU1FTXVsdGlwYXJ0Citmcm9tIGVtYWlsIGltcG9ydCB1dGlscworZnJvbSBlbWFpbCBpbXBvcnQgZXJyb3JzCitmcm9tIGVtYWlsIGltcG9ydCBlbmNvZGVycworZnJvbSBlbWFpbCBpbXBvcnQgaXRlcmF0b3JzCitmcm9tIGVtYWlsIGltcG9ydCBiYXNlNjRtaW1lCitmcm9tIGVtYWlsIGltcG9ydCBxdW9wcmltaW1lCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGZpbmRmaWxlLCBydW5fdW5pdHRlc3QKK2Zyb20gZW1haWwudGVzdCBpbXBvcnQgX19maWxlX18gYXMgbGFuZG1hcmsKKworCitOTCA9ICdcbicKK0VNUFRZU1RSSU5HID0gJycKK1NQQUNFID0gJyAnCisKKworCitkZWYgb3BlbmZpbGUoZmlsZW5hbWUsIG1vZGU9J3InKToKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgZmlsZW5hbWUpCisgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSkKKworCisKKyMgQmFzZSB0ZXN0IGNsYXNzCitjbGFzcyBUZXN0RW1haWxCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbmRpZmZBc3NlcnRFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kKToKKyAgICAgICAgIiIiTGlrZSBhc3NlcnRFcXVhbCBleGNlcHQgdXNlIG5kaWZmIGZvciByZWFkYWJsZSBvdXRwdXQuIiIiCisgICAgICAgIGlmIGZpcnN0ICE9IHNlY29uZDoKKyAgICAgICAgICAgIHNmaXJzdCA9IHN0cihmaXJzdCkKKyAgICAgICAgICAgIHNzZWNvbmQgPSBzdHIoc2Vjb25kKQorICAgICAgICAgICAgZGlmZiA9IGRpZmZsaWIubmRpZmYoc2ZpcnN0LnNwbGl0bGluZXMoKSwgc3NlY29uZC5zcGxpdGxpbmVzKCkpCisgICAgICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHByaW50ID4+IGZwLCBOTCwgTkwuam9pbihkaWZmKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBmcC5nZXR2YWx1ZSgpCisKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmluZGZpbGUoZmlsZW5hbWUpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIG1zZworCisKKworIyBUZXN0IHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgTWVzc2FnZSBjbGFzcydzIEFQSQorY2xhc3MgVGVzdE1lc3NhZ2VBUEkoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfZ2V0X2FsbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzIwLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCdjYycpLCBbJ2NjY0B6enoub3JnJywgJ2RkZEB6enoub3JnJywgJ2VlZUB6enoub3JnJ10pCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCd4eCcsICduL2EnKSwgJ24vYScpCisKKyAgICBkZWYgdGVzdF9nZXRzZXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgZXEobXNnWydtaW1lLXZlcnNpb24nXSwgJzEuMCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAnaXNvLTg4NTktMScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVvdGVkLXByaW50YWJsZScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICdpc28tODg1OS0xJykKKyAgICAgICAgIyBSZW1vdmUgdGhlIGNoYXJzZXQKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLCBOb25lKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgVHJ5IGFkZGluZyBhIGNoYXJzZXQgd2hlbiB0aGVyZSdzIGFscmVhZHkgTUlNRSBoZWFkZXJzIHByZXNlbnQKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snTUlNRS1WZXJzaW9uJ10gPSAnMi4wJworICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQveC13ZWlyZCcKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAncXVpbnRlZC1wdW50YWJsZScKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcyLjAnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC94LXdlaXJkOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVpbnRlZC1wdW50YWJsZScpCisKKyAgICBkZWYgdGVzdF9zZXRfY2hhcnNldF9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF9zZXRfcGF5bG9hZF93aXRoX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnVGhpcyBpcyBhIHN0cmluZyBwYXlsb2FkJywgY2hhcnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF9nZXRfY2hhcnNldHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA4LnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnaXNvLTg4NTktMicsICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOS50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoJ2RpbmdiYXQnKQorICAgICAgICBlcShjaGFyc2V0cywgWydkaW5nYmF0JywgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnZGluZ2JhdCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2tvaTgtciddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEyLnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCBOb25lLCAnaXNvLTg4NTktMicsCisgICAgICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLCAndXMtYXNjaWknLCAna29pOC1yJ10pCisKKyAgICBkZWYgdGVzdF9nZXRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9maWxlbmFtZSgpLCAnZGluZ3VzZmlzaC5naWYnKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lX3dpdGhfbmFtZV9wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQ0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICBkZWYgdGVzdF9nZXRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQorICAgICAgICAjIE5vIHF1b3RlcyEKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3Rfc2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG9uZSBoYXMgbm8gZXhpc3RpbmcgYm91bmRhcnkgcGFyYW1ldGVyLCBidXQgdGhlIENvbnRlbnQtVHlwZToKKyAgICAgICAgIyBoZWFkZXIgYXBwZWFycyBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgVGhpcyBvbmUgaGFzIGEgQ29udGVudC1UeXBlOiBoZWFkZXIsIHdpdGggYSBib3VuZGFyeSwgc3R1Y2sgaW4gdGhlCisgICAgICAgICMgbWlkZGxlIG9mIGl0cyBoZWFkZXJzLiAgTWFrZSBzdXJlIHRoZSBvcmRlciBpcyBwcmVzZXJ2ZWQ7IGl0IHNob3VsZAorICAgICAgICAjIGJlIGZpZnRoLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGhlYWRlciwgdmFsdWUgPSBtc2cuaXRlbXMoKVs0XQorICAgICAgICBlcShoZWFkZXIubG93ZXIoKSwgJ2NvbnRlbnQtdHlwZScpCisgICAgICAgIGVxKHZhbHVlLCAnbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiJykKKyAgICAgICAgIyBBbmQgdGhpcyBvbmUgaGFzIG5vIENvbnRlbnQtVHlwZTogaGVhZGVyIGF0IGFsbC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zZXRfYm91bmRhcnksICdCT1VOREFSWScpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTAudHh0JykKKyAgICAgICAgIyBUaGUgb3V0ZXIgbWVzc2FnZSBpcyBhIG11bHRpcGFydAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBOb25lKQorICAgICAgICAjIFN1YnBhcnQgMSBpcyA3Yml0IGVuY29kZWQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDApLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSA3Yml0IGVuY29kZWQgbWVzc2FnZS5cbicpCisgICAgICAgICMgU3VicGFydCAyIGlzIHF1b3ByaQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnXHhhMVRoaXMgaXMgYSBRdW90ZWQgUHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSFcbicpCisgICAgICAgICMgU3VicGFydCAzIGlzIGJhc2U2NAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMikuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UuJykKKyAgICAgICAgIyBTdWJwYXJ0IDQgaXMgYmFzZTY0IHdpdGggYSB0cmFpbGluZyBuZXdsaW5lLCB3aGljaAorICAgICAgICAjIHVzZWQgdG8gYmUgc3RyaXBwZWQgKGlzc3VlIDcxNDMpLgorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMykuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICAjIFN1YnBhcnQgNSBoYXMgbm8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogaGVhZGVyLgorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoNCkuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBoYXMgbm8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogaGVhZGVyLlxuJykKKworICAgIGRlZiB0ZXN0X2dldF9kZWNvZGVkX3V1X3BheWxvYWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdiZWdpbiA2NjYgLVxuKzomNUw7JlxcQD1WXVI7JjAgXG4gXG5lbmRcbicpCisgICAgICAgIGZvciBjdGUgaW4gKCd4LXV1ZW5jb2RlJywgJ3V1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZScpOgorICAgICAgICAgICAgbXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10gPSBjdGUKKyAgICAgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksICdoZWxsbyB3b3JsZCcpCisgICAgICAgICMgTm93IHRyeSBzb21lIGJvZ3VzIGRhdGEKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdmb28nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnZm9vJykKKworICAgIGRlZiB0ZXN0X2RlY29kZWRfZ2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzE3LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IERlY29kZWRHZW5lcmF0b3IocykKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEocy5nZXR2YWx1ZSgpLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfX2NvbnRhaW5zX18oc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICdNZScKKyAgICAgICAgbXNnWyd0byddID0gJ1lvdScKKyAgICAgICAgIyBDaGVjayBmb3IgY2FzZSBpbnNlbnNpdGl2aXR5CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZnJvbScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGUk9NJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUbycgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1RPJyBpbiBtc2cpCisKKyAgICBkZWYgdGVzdF9hc19zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBCQVcgMzAtTWFyLTIwMDkgRXZpbCBiZSBoZXJlLiAgU28sIHRoZSBnZW5lcmF0b3IgaXMgYnJva2VuIHdpdGgKKyAgICAgICAgICAgICMgcmVzcGVjdCB0byBsb25nIGxpbmUgYnJlYWtpbmcuICBJdCdzIGFsc28gbm90IGlkZW1wb3RlbnQgd2hlbiBhCisgICAgICAgICAgICAjIGhlYWRlciBmcm9tIGEgcGFyc2VkIG1lc3NhZ2UgaXMgY29udGludWVkIHdpdGggdGFicyByYXRoZXIgdGhhbgorICAgICAgICAgICAgIyBzcGFjZXMuICBCZWZvcmUgd2UgZml4ZWQgYnVnIDE5NzQgaXQgd2FzIHJldmVyc2VkbHkgYnJva2VuLAorICAgICAgICAgICAgIyBpLmUuIGhlYWRlcnMgdGhhdCB3ZXJlIGNvbnRpbnVlZCB3aXRoIHNwYWNlcyBnb3QgY29udGludWVkIHdpdGgKKyAgICAgICAgICAgICMgdGFicy4gIEZvciBQeXRob24gMi54IHRoZXJlJ3MgcmVhbGx5IG5vIGdvb2QgZml4IGFuZCBpbiBQeXRob24KKyAgICAgICAgICAgICMgMy54IGFsbCB0aGlzIHN0dWZmIGlzIHJlLXdyaXR0ZW4gdG8gYmUgcmlnaHQoZXIpLiAgQ2hyaXMgV2l0aGVycworICAgICAgICAgICAgIyBjb252aW5jZWQgbWUgdGhhdCB1c2luZyBzcGFjZSBhcyB0aGUgZGVmYXVsdCBjb250aW51YXRpb24KKyAgICAgICAgICAgICMgY2hhcmFjdGVyIGlzIGxlc3MgYmFkIGZvciBtb3JlIGFwcGxpY2F0aW9ucy4KKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkucmVwbGFjZSgnXHQnLCAnICcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbCh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCisgICAgICAgIGZ1bGxyZXByID0gc3RyKG1zZykKKyAgICAgICAgbGluZXMgPSBmdWxscmVwci5zcGxpdCgnXG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGluZXNbMF0uc3RhcnRzd2l0aCgnRnJvbSAnKSkKKyAgICAgICAgZXEodGV4dCwgTkwuam9pbihsaW5lc1sxOl0pKQorCisgICAgZGVmIHRlc3RfYmFkX3BhcmFtKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJDb250ZW50LVR5cGU6IGJsYXJnOyBiYXo7IGJvb1xuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdiYXonKSwgJycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJGcm9tOiBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfYm9ndXNfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICJDb250ZW50LURpc3Bvc2l0aW9uOiBibGFyZzsgZmlsZW5hbWVcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCAnJykKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfYm91bmRhcnkoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIkZyb206IGZvb1xuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2JvdW5kYXJ5KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vPW9uZTsgYmFyPXR3bzsgYmF6PXRocmVlXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICdvbmUnKSwgKCdiYXInLCAndHdvJyksICgnYmF6JywgJ3RocmVlJyldKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb287IGJhcj1vbmU7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJycpLCAoJ2JhcicsICdvbmUnKSwgKCdiYXonLCAndHdvJyldKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBOb25lKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ1gtSGVhZGVyOiBmb287IGJhcj0ib25lIjsgYmF6PXR3b1xuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnJyksICgnYmFyJywgJ29uZScpLCAoJ2JheicsICd0d28nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fbGliZXJhbChzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnQ29udGVudC1UeXBlOiBNdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5ID0gIkNQSU1TU01UUEMwNnA1ZjN0RyInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYm91bmRhcnknKSwgJ0NQSU1TU01UUEMwNnA1ZjN0RycpCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgIlgtSGVhZGVyOiBmb289b25lOyBiYXI9dHdvOyBiYXo9dGhyZWVcbiIpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JhcicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ3R3bycpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3F1dXonLCBoZWFkZXI9J3gtaGVhZGVyJyksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3F1dXonKSwgTm9uZSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9Im9uZSI7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ZvbycsIGhlYWRlcj0neC1oZWFkZXInKSwgJycpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JhcicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ29uZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2JheicsIGhlYWRlcj0neC1oZWFkZXInKSwgJ3R3bycpCisgICAgICAgICMgWFhYOiBXZSBhcmUgbm90IFJGQy0yMDQ1IGNvbXBsaWFudCEgIFdlIGNhbm5vdCBwYXJzZToKKyAgICAgICAgIyBtc2dbIkNvbnRlbnQtVHlwZSJdID0gJ3RleHQvcGxhaW47IHdlaXJkPSJoZXk7IGRvbGx5PyBbeW91XSBAIDxcXCJob21lXFwiPj8iJworICAgICAgICAjIG1zZy5nZXRfcGFyYW0oIndlaXJkIikKKyAgICAgICAgIyB5ZXQuCisKKyAgICBkZWYgdGVzdF9nZXRfcGFyYW1fZnVua3lfY29udGludWF0aW9uX2xpbmVzKHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yMi50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgxKS5nZXRfcGFyYW0oJ25hbWUnKSwgJ3dpYmJsZS5KUEcnKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX3dpdGhfc2VtaXNfaW5fcXVvdGVzKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZTogaW1hZ2UvcGpwZWc7IG5hbWU9IkppbSZhbXA7JmFtcDtKaWxsIlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCduYW1lJyksICdKaW0mYW1wOyZhbXA7SmlsbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnbmFtZScsIHVucXVvdGU9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICciSmltJmFtcDsmYW1wO0ppbGwiJykKKworICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoJ0hlYWRlcjogZXhpc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5oYXNfa2V5KCdoZWFkZXInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5oYXNfa2V5KCdIZWFkZXInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5oYXNfa2V5KCdIRUFERVInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cuaGFzX2tleSgnaGVhZGVyaScpKQorCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICdpc28tMjAyMi1qcCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ltcG9ydGFuY2UnKSwgJ2hpZ2ggdmFsdWUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdpbXBvcnRhbmNlJywgdW5xdW90ZT1GYWxzZSksICciaGlnaCB2YWx1ZSInKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLCBbKCd0ZXh0L3BsYWluJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjaGFyc2V0JywgJ2lzby0yMDIyLWpwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ltcG9ydGFuY2UnLCAnaGlnaCB2YWx1ZScpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXModW5xdW90ZT1GYWxzZSksIFsoJ3RleHQvcGxhaW4nLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NoYXJzZXQnLCAnImlzby0yMDIyLWpwIicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdpbXBvcnRhbmNlJywgJyJoaWdoIHZhbHVlIicpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICdpc28tOTk5OS14eCcsIGhlYWRlcj0nWC1KaW1teScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnLCBoZWFkZXI9J1gtSmltbXknKSwgJ2lzby05OTk5LXh4JykKKworICAgIGRlZiB0ZXN0X2RlbF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA1LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksICgncmVwb3J0LXR5cGUnLCAnZGVsaXZlcnktc3RhdHVzJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKV0pCisgICAgICAgIG9sZF92YWwgPSBtc2cuZ2V0X3BhcmFtKCJyZXBvcnQtdHlwZSIpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oInJlcG9ydC10eXBlIikKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpXSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgicmVwb3J0LXR5cGUiLCBvbGRfdmFsKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyksCisgICAgICAgICAgICAoJ3JlcG9ydC10eXBlJywgb2xkX3ZhbCldKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLCBmaWxlbmFtZT0nYnVkLmdpZicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZpbGVuYW1lJywgJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snY29udGVudC1kaXNwb3NpdGlvbiddLCAnYXR0YWNobWVudCcpCisKKyAgICBkZWYgdGVzdF9zZXRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtc2cuc2V0X3R5cGUsICd0ZXh0JykKKyAgICAgICAgbXNnLnNldF90eXBlKCd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisgICAgICAgIG1zZy5zZXRfdHlwZSgndGV4dC9odG1sJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvaHRtbDsgY2hhcnNldD0idXMtYXNjaWkiJykKKworICAgIGRlZiB0ZXN0X3NldF90eXBlX29uX290aGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snWC1Db250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluJworICAgICAgICBtc2cuc2V0X3R5cGUoJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICdYLUNvbnRlbnQtVHlwZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWyd4LWNvbnRlbnQtdHlwZSddLCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbWVzc2FnZS9yZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfdGV4dF9wbGFpbl9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9taXNzaW5nX3dpdGhfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9kZWZhdWx0X3R5cGUoJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgwKS5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9lcnJvcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnbm8tc2xhc2gtaW4tdGhpcy1zdHJpbmcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ25vLXNsYXNoLWluLXRoaXMtc3RyaW5nJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnT25lJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ1NlY29uZCcsICdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignVGhpcmQnLCAnVGhyZWUnKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3bycsICdUaHJlZSddKQorICAgICAgICBtc2cucmVwbGFjZV9oZWFkZXIoJ1NlY29uZCcsICdUd2VudHknKQorICAgICAgICBlcShtc2cua2V5cygpLCBbJ0ZpcnN0JywgJ1NlY29uZCcsICdUaGlyZCddKQorICAgICAgICBlcShtc2cudmFsdWVzKCksIFsnT25lJywgJ1R3ZW50eScsICdUaHJlZSddKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignRmlyc3QnLCAnRWxldmVuJykKKyAgICAgICAgbXNnLnJlcGxhY2VfaGVhZGVyKCdGaXJzdCcsICdPbmUgSHVuZHJlZCcpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJywgJ0ZpcnN0J10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUgSHVuZHJlZCcsICdUd2VudHknLCAnVGhyZWUnLCAnRWxldmVuJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBtc2cucmVwbGFjZV9oZWFkZXIsICdGb3VydGgnLCAnTWlzc2luZycpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fYmFzZTY0X3BheWxvYWQoc2VsZik6CisgICAgICAgIHggPSAnQXdEcDBQNy8veTZMd0tFQWNQYS82UT05JworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydjb250ZW50LXR5cGUnXSA9ICdhdWRpby94LW1pZGknCisgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gJ2Jhc2U2NCcKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgeCkKKworCisKKyMgVGVzdCB0aGUgZW1haWwuZW5jb2RlcnMgbW9kdWxlCitjbGFzcyBUZXN0RW5jb2RlcnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZV9lbXB0eV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfY2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9jdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9jdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFdpdGggbm8gZXhwbGljaXQgX2NoYXJzZXQgaXRzIHVzLWFzY2lpLCBhbmQgYWxsIGFyZSA3LWJpdAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorICAgICAgICAjIFNpbWlsYXIsIGJ1dCB3aXRoIDgtYml0IGRhdGEKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIFx4Zjggd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzhiaXQnKQorICAgICAgICAjIEFuZCBub3cgd2l0aCBhIGRpZmZlcmVudCBjaGFyc2V0CisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJywgX2NoYXJzZXQ9J2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorCisKKworIyBUZXN0IGxvbmcgaGVhZGVyIHdyYXBwaW5nCitjbGFzcyBUZXN0TG9uZ0hlYWRlcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3Rfc3BsaXRfbG9uZ19jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorU3ViamVjdDogYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0CisKK3Rlc3QKKyIiIikKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHNmcCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK1N1YmplY3Q6IGJ1ZyBkZW1vbnN0cmF0aW9uCisgMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKKyBtb3JlIHRleHQKKwordGVzdAorIiIiKQorCisgICAgZGVmIHRlc3RfYW5vdGhlcl9sb25nX2FsbW9zdF91bnNwbGl0dGFibGVfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0IiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2J1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dCIiIikKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorIDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CisgbW9yZSB0ZXh0IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19ub25zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgY3ogPSBDaGFyc2V0KCJpc28tODg1OS0yIikKKyAgICAgICAgdXRmOCA9IENoYXJzZXQoInV0Zi04IikKKyAgICAgICAgZ19oZWFkID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGN6X2hlYWQgPSAiRmluYW5ceGU4bmkgbWV0cm9wb2xlIHNlIGhyb3V0aWx5IHBvZCB0bGFrZW0gamVqaWNoIGRceGY5dnRpcHUuLiAiCisgICAgICAgIHV0ZjhfaGVhZCA9IHUiXHU2YjYzXHU3OGJhXHUzMDZiXHU4YTAwXHUzMDQ2XHUzMDY4XHU3ZmZiXHU4YTMzXHUzMDZmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHU0ZTAwXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjXHUzMDAxXHUzMDQyXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDVmXHUzMDg5XHUzMDgxXHUzMDY3XHUzMDU5XHUzMDAyXHU1YjlmXHU5NjliXHUzMDZiXHUzMDZmXHUzMDBjV2VubiBpc3QgZGFzIE51bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC5cdTMwMGRcdTMwNjhcdThhMDBcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIiLmVuY29kZSgidXRmLTgiKQorICAgICAgICBoID0gSGVhZGVyKGdfaGVhZCwgZywgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSBoCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitTdWJqZWN0OiA9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkPz0KKyA9P2lzby04ODU5LTE/cT9lcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpPz0KKyA9P2lzby04ODU5LTE/cT9zY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nPz0KKyA9P2lzby04ODU5LTE/cT9lbl9iZWY9RjZyZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldD89CisgPT9pc28tODg1OS0yP3E/cm9wb2xlX3NlX2hyb3V0aWx5X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PQorID0/dXRmLTg/Yj81cTJqNTZLNjQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFPz0KKyA9P3V0Zi04P2I/NDRHKzQ0R2I0NEtUNDRDQzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCPz0KKyA9P3V0Zi04P2I/NDRHQzQ0R280NEd2NDRHbjQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNPz0KKyA9P3V0Zi04P3E/V2Vubl9pc3RfZGFzX051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzPz0KKyA9P3V0Zi04P2I/SUU5a1pYSWdaR2xsSUVac2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0Jvdz09Pz0KKyA9P3V0Zi04P2I/NDRHbTQ0R0U0NEcrNDRHWjQ0Q0M/PQorCisiIiIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmQ/PQorID0/aXNvLTg4NTktMT9xP2VyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGk/PQorID0/aXNvLTg4NTktMT9xP3NjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmc/PQorID0/aXNvLTg4NTktMT9xP2VuX2JlZj1GNnJkZXJ0PTJFXz89ID0/aXNvLTg4NTktMj9xP0ZpbmFuPUU4bmlfbWV0Pz0KKyA9P2lzby04ODU5LTI/cT9yb3BvbGVfc2VfaHJvdXRpbHlfcG9kX3RsYWtlbV9qZWppY2hfZD1GOXZ0aXB1PTJFPTJFXz89CisgPT91dGYtOD9iPzVxMmo1Nks2NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U/PQorID0/dXRmLTg/Yj80NEcrNDRHYjQ0S1Q0NENDNUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I/PQorID0/dXRmLTg/Yj80NEdDNDRHbzQ0R3Y0NEduNDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q00/PQorID0/dXRmLTg/cT9XZW5uX2lzdF9kYXNfTnVuc3R1Y2tfZ2l0X3VuZF9TbG90ZXJtZXllcj0zRl9KYSFfQmVpaGVyaHVuZF9kYXM/PQorID0/dXRmLTg/Yj9JRTlrWlhJZ1pHbGxJRVpzYVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm93PT0/PQorID0/dXRmLTg/Yj80NEdtNDRHRTQ0Rys0NEdaNDRDQz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworIHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZV93aXRoX3RhYl9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJywKKyAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZT0nWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCcsCisgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7CitcdHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9zcGxpdHRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJycpCisgICAgICAgICMgSXQnZCBiZSBncmVhdCBpZiB3ZSBjb3VsZCB1c2UgYWRkX2hlYWRlcigpIGhlcmUsIGJ1dCB0aGF0IGRvZXNuJ3QKKyAgICAgICAgIyBndWFyYW50ZWUgYW4gb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICAgIG1zZ1snWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCddID0gKAorICAgICAgICAgICAgJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgJycnXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0OiB3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworIHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IgorCisnJycpCisKKyAgICBkZWYgdGVzdF9ub19zZW1pc19oZWFkZXJfc3BsaXR0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICd0ZXN0QGRvbS5haW4nCisgICAgICAgIG1zZ1snUmVmZXJlbmNlcyddID0gU1BBQ0Uuam9pbihbJzwlZEBkb20uYWluPicgJSBpIGZvciBpIGluIHJhbmdlKDEwKV0pCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnVGVzdCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiB0ZXN0QGRvbS5haW4KK1JlZmVyZW5jZXM6IDwwQGRvbS5haW4+IDwxQGRvbS5haW4+IDwyQGRvbS5haW4+IDwzQGRvbS5haW4+IDw0QGRvbS5haW4+CisgPDVAZG9tLmFpbj4gPDZAZG9tLmFpbj4gPDdAZG9tLmFpbj4gPDhAZG9tLmFpbj4gPDlAZG9tLmFpbj4KKworVGVzdCIiIikKKworICAgIGRlZiB0ZXN0X25vX3NwbGl0X2xvbmdfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gJ1JlZmVyZW5jZXM6ICcgKyAneCcgKiA4MAorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitSZWZlcmVuY2VzOiB4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCIiIikKKworICAgIGRlZiB0ZXN0X3NwbGl0dGluZ19tdWx0aXBsZV9sb25nX2xpbmVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKKyIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGNvbnRpbnVhdGlvbl93cz0nXHQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworXHRieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworXHRmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworXHRTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKK1x0YnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKK1x0Zm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKK1x0U2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CitcdGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CitcdGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CitcdFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKSIiIikKKworICAgIGRlZiB0ZXN0X3NwbGl0dGluZ19maXJzdF9saW5lX29ubHlfaXNfbG9uZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICIiIlwKK2Zyb20gbW9kZW1jYWJsZTA5My4xMzktMjAxLTI0LnF1ZS5tYy52aWRlb3Ryb24uY2EgKFsyNC4yMDEuMTM5LjkzXSBoZWxvPWN0aHVsaHUuZ2VyZy5jYSkKK1x0Ynkga3Jvbm9zLm1lbXMtZXhjaGFuZ2Uub3JnIHdpdGggZXNtdHAgKEV4aW0gNC4wNSkKK1x0aWQgMTdrNGg1LTAwMDM0aS0wMAorXHRmb3IgdGVzdEBtZW1zLWV4Y2hhbmdlLm9yZzsgV2VkLCAyOCBBdWcgMjAwMiAxMToyNToyMCAtMDQwMCIiIgorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIG1heGxpbmVsZW49NzgsIGhlYWRlcl9uYW1lPSdSZWNlaXZlZCcsCisgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2Zyb20gbW9kZW1jYWJsZTA5My4xMzktMjAxLTI0LnF1ZS5tYy52aWRlb3Ryb24uY2EgKFsyNC4yMDEuMTM5LjkzXQorXHRoZWxvPWN0aHVsaHUuZ2VyZy5jYSkKK1x0Ynkga3Jvbm9zLm1lbXMtZXhjaGFuZ2Uub3JnIHdpdGggZXNtdHAgKEV4aW0gNC4wNSkKK1x0aWQgMTdrNGg1LTAwMDM0aS0wMAorXHRmb3IgdGVzdEBtZW1zLWV4Y2hhbmdlLm9yZzsgV2VkLCAyOCBBdWcgMjAwMiAxMToyNToyMCAtMDQwMCIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBoID0gSGVhZGVyKCdCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQnLCAnaXNvLTg4NTktMScsCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgaC5hcHBlbmQoJ2dyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUnKQorICAgICAgICBtc2dbJ1N1YmplY3QnXSA9IGgKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitTdWJqZWN0OiA9P2lzby04ODU5LTE/cT9Ccml0aXNjaGVfUmVnaWVydW5nX2dpYnQ/PSA9P2lzby04ODU5LTE/cT9ncj1GQ25lcz89CisgPT9pc28tODg1OS0xP3E/X0xpY2h0X2Y9RkNyX09mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlPz0KKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ184Yml0X2hlYWRlcl9ub19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZXBseS1UbyddID0gJ0JyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCBnclx4ZmNuZXMgTGljaHQgZlx4ZmNyIE9mZnNob3JlLVdpbmRrcmFmdHByb2pla3RlIDxhLXZlcnktbG9uZy1hZGRyZXNzQGV4YW1wbGUuY29tPicKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXBseS1UbzogQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0IGdyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUgPGEtdmVyeS1sb25nLWFkZHJlc3NAZXhhbXBsZS5jb20+CisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfdG9faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICB0byA9ICciU29tZW9uZSBUZXN0ICNBIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sICJTb21lb25lIFRlc3QgI0MiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwgIlNvbWVvbmUgVGVzdCAjRCIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+JworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydUbyddID0gdG8KKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygwKSwgJycnXAorVG86ICJTb21lb25lIFRlc3QgI0EiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LAorICJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sCisgIlNvbWVvbmUgVGVzdCAjQyIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LAorICJTb21lb25lIFRlc3QgI0QiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PgorCisnJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2xpbmVfYWZ0ZXJfYXBwZW5kKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoaXMgaXMgYW4gZXhhbXBsZSBvZiBzdHJpbmcgd2hpY2ggaGFzIGFsbW9zdCB0aGUgbGltaXQgb2YgaGVhZGVyIGxlbmd0aC4nCisgICAgICAgIGggPSBIZWFkZXIocykKKyAgICAgICAgaC5hcHBlbmQoJ0FkZCBhbm90aGVyIGxpbmUuJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorVGhpcyBpcyBhbiBleGFtcGxlIG9mIHN0cmluZyB3aGljaCBoYXMgYWxtb3N0IHRoZSBsaW1pdCBvZiBoZWFkZXIgbGVuZ3RoLgorIEFkZCBhbm90aGVyIGxpbmUuIiIiKQorCisgICAgZGVmIHRlc3Rfc2hvcnRlcl9saW5lX3dpdGhfYXBwZW5kKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoaXMgaXMgYSBzaG9ydGVyIGxpbmUuJworICAgICAgICBoID0gSGVhZGVyKHMpCisgICAgICAgIGguYXBwZW5kKCdBZGQgYW5vdGhlciBzZW50ZW5jZS4gKFN1cnByaXNlPyknKQorICAgICAgICBlcShoLmVuY29kZSgpLAorICAgICAgICAgICAnVGhpcyBpcyBhIHNob3J0ZXIgbGluZS4gQWRkIGFub3RoZXIgc2VudGVuY2UuIChTdXJwcmlzZT8pJykKKworICAgIGRlZiB0ZXN0X2xvbmdfZmllbGRfbmFtZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZm4gPSAnWC1WZXJ5LVZlcnktVmVyeS1Mb25nLUhlYWRlci1OYW1lJworICAgICAgICBncyA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBoID0gSGVhZGVyKGdzLCAnaXNvLTg4NTktMScsIGhlYWRlcl9uYW1lPWZuKQorICAgICAgICAjIEJBVzogdGhpcyBzZWVtcyBicm9rZW4gYmVjYXVzZSB0aGUgZmlyc3QgbGluZSBpcyB0b28gbG9uZworICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyXz89CisgPT9pc28tODg1OS0xP3E/ZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmRlcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yXz89CisgPT9pc28tODg1OS0xP3E/ZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGlzY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZz89CisgPT9pc28tODg1OS0xP3E/ZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmdlbl9iZWY9RjZyZGVydD0yRV8/PSIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfcmVjZWl2ZWRfaGVhZGVyKHNlbGYpOgorICAgICAgICBoID0gJ2Zyb20gRk9PLlRMRCAodml6d29ybGQuYWNsLmZvby50bGQgWzEyMy40NTIuNjc4LjldKSBieSBocm90aGdhci5sYS5tYXN0YWxlci5jb20gKHRtZGEtb2ZtaXBkKSB3aXRoIEVTTVRQOyBXZWQsIDA1IE1hciAyMDAzIDE4OjEwOjE4IC0wNzAwJworICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydSZWNlaXZlZC0xJ10gPSBIZWFkZXIoaCwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMiddID0gaAorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZWNlaXZlZC0xOiBmcm9tIEZPTy5UTEQgKHZpendvcmxkLmFjbC5mb28udGxkIFsxMjMuNDUyLjY3OC45XSkgYnkKK1x0aHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsKK1x0V2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMAorUmVjZWl2ZWQtMjogZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5CisgaHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsKKyBXZWQsIDA1IE1hciAyMDAzIDE4OjEwOjE4IC0wNzAwCisKKyIiIikKKworICAgIGRlZiB0ZXN0X3N0cmluZ19oZWFkZXJpbnN0X2VxKHNlbGYpOgorICAgICAgICBoID0gJzwxNTk3NS4xNzkwMS4yMDcyNDAuNDE0NjA0QHNnaWdyaXR6bWFubjEubWF0aGVtYXRpay50dS1tdWVuY2hlbi5kZT4gKERhdmlkIEJyZW1uZXJcJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIiknCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlY2VpdmVkJ10gPSBIZWFkZXIoaCwgaGVhZGVyX25hbWU9J1JlY2VpdmVkLTEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQnXSA9IGgKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVjZWl2ZWQ6IDwxNTk3NS4xNzkwMS4yMDcyNDAuNDE0NjA0QHNnaWdyaXR6bWFubjEubWF0aGVtYXRpay50dS1tdWVuY2hlbi5kZT4KK1x0KERhdmlkIEJyZW1uZXIncyBtZXNzYWdlIG9mICJUaHUsIDYgTWFyIDIwMDMgMTM6NTg6MjEgKzAxMDAiKQorUmVjZWl2ZWQ6IDwxNTk3NS4xNzkwMS4yMDcyNDAuNDE0NjA0QHNnaWdyaXR6bWFubjEubWF0aGVtYXRpay50dS1tdWVuY2hlbi5kZT4KKyAoRGF2aWQgQnJlbW5lcidzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpCisKKyIiIikKKworICAgIGRlZiB0ZXN0X2xvbmdfdW5icmVha2FibGVfbGluZXNfd2l0aF9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICB0ID0gIiIiXAorIGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3QkFNQUFBQ2xMT1MwQUFBQUdGQk1WRVVBQUFBa0hpSmVSVUljR0JpOQorIGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cCIiIgorICAgICAgICBtc2dbJ0ZhY2UtMSddID0gdAorICAgICAgICBtc2dbJ0ZhY2UtMiddID0gSGVhZGVyKHQsIGhlYWRlcl9uYW1lPSdGYWNlLTInKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK0ZhY2UtMTogaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CisgbG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwCitGYWNlLTI6IGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3QkFNQUFBQ2xMT1MwQUFBQUdGQk1WRVVBQUFBa0hpSmVSVUljR0JpOQorIGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cAorCisiIiIpCisKKyAgICBkZWYgdGVzdF9hbm90aGVyX2xvbmdfbXVsdGlsaW5lX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICcnJ1wKK1JlY2VpdmVkOiBmcm9tIHNpaW1hZ2UuY29tIChbMTcyLjI1LjEuM10pIGJ5IHppbWEuc2lsaWNvbmltYWdlLmNvbSB3aXRoIE1pY3Jvc29mdCBTTVRQU1ZDKDUuMC4yMTk1LjQ5MDUpOworIFdlZCwgMTYgT2N0IDIwMDIgMDc6NDE6MTEgLTA3MDAnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICcnJ1wKK1JlY2VpdmVkOiBmcm9tIHNpaW1hZ2UuY29tIChbMTcyLjI1LjEuM10pIGJ5IHppbWEuc2lsaWNvbmltYWdlLmNvbSB3aXRoCisgTWljcm9zb2Z0IFNNVFBTVkMoNS4wLjIxOTUuNDkwNSk7IFdlZCwgMTYgT2N0IDIwMDIgMDc6NDE6MTEgLTA3MDAKKworJycnKQorCisgICAgZGVmIHRlc3RfbG9uZ19saW5lc193aXRoX2RpZmZlcmVudF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSAiIiJcCitMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vc3BhbWFzc2Fzc2luLXRhbGs+LAorICAgICAgICA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0P3N1YmplY3Q9dW5zdWJzY3JpYmU+IiIiCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0xpc3QnXSA9IGgKKyAgICAgICAgbXNnWydMaXN0J10gPSBIZWFkZXIoaCwgaGVhZGVyX25hbWU9J0xpc3QnKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitMaXN0OiBMaXN0LVVuc3Vic2NyaWJlOiA8aHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlzdHMvbGlzdGluZm8vc3BhbWFzc2Fzc2luLXRhbGs+LAorIDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4KK0xpc3Q6IExpc3QtVW5zdWJzY3JpYmU6IDxodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCisgPG1haWx0bzpzcGFtYXNzYXNzaW4tdGFsay1yZXF1ZXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD9zdWJqZWN0PXVuc3Vic2NyaWJlPgorCisiIiIpCisKKworCisjIFRlc3QgbWFuZ2xpbmcgb2YgIkZyb20gIiBsaW5lcyBpbiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UKK2NsYXNzIFRlc3RGcm9tTWFuZ2xpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5tc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5tc2dbJ0Zyb20nXSA9ICdhYWFAYmJiLm9yZycKKyAgICAgICAgc2VsZi5tc2cuc2V0X3BheWxvYWQoIiIiXAorRnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfbWFuZ2xlZF9mcm9tKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1hbmdsZV9mcm9tXz1UcnVlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCis+RnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfZG9udF9tYW5nbGVfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89RmFsc2UpCisgICAgICAgIGcuZmxhdHRlbihzZWxmLm1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0Zyb206IGFhYUBiYmIub3JnCisKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworCisKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUF1ZGlvIGNsYXNzCitjbGFzcyBUZXN0TUlNRUF1ZGlvKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHdlIHBpY2sgdXAgdGhlIGF1ZGlvdGVzdC5hdSB0aGF0IGxpdmVzIGluIGVtYWlsL3Rlc3QvZGF0YS4KKyAgICAgICAgIyBJbiBQeXRob24sIHRoZXJlJ3MgYW4gYXVkaW90ZXN0LmF1IGxpdmluZyBpbiBMaWIvdGVzdCBidXQgdGhhdCBpc24ndAorICAgICAgICAjIGluY2x1ZGVkIGluIHNvbWUgYmluYXJ5IGRpc3Ryb3MgdGhhdCBkb24ndCBpbmNsdWRlIHRoZSB0ZXN0CisgICAgICAgICMgcGFja2FnZS4gIFRoZSB0cmFpbGluZyBlbXB0eSBzdHJpbmcgb24gdGhlIC5qb2luKCkgaXMgc2lnbmlmaWNhbnQKKyAgICAgICAgIyBzaW5jZSBmaW5kZmlsZSgpIHdpbGwgZG8gYSBkaXJuYW1lKCkuCisgICAgICAgIGRhdGFkaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGxhbmRtYXJrKSwgJ2RhdGEnLCAnJykKKyAgICAgICAgZnAgPSBvcGVuKGZpbmRmaWxlKCdhdWRpb3Rlc3QuYXUnLCBkYXRhZGlyKSwgJ3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fYXVkaW9kYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuX2F1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSkKKworICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vYmFzaWMnKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHBheWxvYWQgPSBzZWxmLl9hdS5nZXRfcGF5bG9hZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZTY0LmRlY29kZXN0cmluZyhwYXlsb2FkKSwgc2VsZi5fYXVkaW9kYXRhKQorCisgICAgZGVmIHRlc3RfY2hlY2tTZXRNaW5vcihzZWxmKToKKyAgICAgICAgYXUgPSBNSU1FQXVkaW8oc2VsZi5fYXVkaW9kYXRhLCAnZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vZmlzaCcpCisKKyAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCisgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCisgICAgICAgICAgICdhdHRhY2htZW50OyBmaWxlbmFtZT0iYXVkaW90ZXN0LmF1IicpCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbXMoaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgIFsoJ2F0dGFjaG1lbnQnLCAnJyksICgnZmlsZW5hbWUnLCAnYXVkaW90ZXN0LmF1JyldKQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICdhdWRpb3Rlc3QuYXUnKQorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksICcnKQorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdmb28nLCBmYWlsb2JqPW1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJykgaXMgbWlzc2luZykKKyAgICAgICAgIyBUcnkgc29tZSBtaXNzaW5nIHN0dWZmCisgICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCisgICAgICAgIHVubGVzcyhzZWxmLl9hdS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBtaXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nZm9vYmFyJykgaXMgbWlzc2luZykKKworCisKKyMgVGVzdCB0aGUgYmFzaWMgTUlNRUltYWdlIGNsYXNzCitjbGFzcyBUZXN0TUlNRUltYWdlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ1B5QmFubmVyMDQ4LmdpZicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2ltZ2RhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5faW0gPSBNSU1FSW1hZ2Uoc2VsZi5faW1nZGF0YSkKKworICAgIGRlZiB0ZXN0X2d1ZXNzX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5faW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZ2lmJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5faW0uZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2ltZ2RhdGEpCisKKyAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgorICAgICAgICBpbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhLCAnZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCisKKyAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKKyAgICAgICAgICAgJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPSJkaW5ndXNmaXNoLmdpZiInKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2Rpbmd1c2Zpc2guZ2lmJyldKQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZpbGVuYW1lJywgaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgICdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBlcShzZWxmLl9pbS5nZXRfcGFyYW0oJ2F0dGFjaG1lbnQnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwgJycpCisgICAgICAgIHVubGVzcyhzZWxmLl9pbS5nZXRfcGFyYW0oJ2ZvbycsIGZhaWxvYmo9bWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSBpcyBtaXNzaW5nKQorICAgICAgICAjIFRyeSBzb21lIG1pc3Npbmcgc3R1ZmYKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnZm9vYmFyJywgbWlzc2luZykgaXMgbWlzc2luZykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyPSdmb29iYXInKSBpcyBtaXNzaW5nKQorCisKKworIyBUZXN0IHRoZSBiYXNpYyBNSU1FQXBwbGljYXRpb24gY2xhc3MKK2NsYXNzIFRlc3RNSU1FQXBwbGljYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisKKyAgICBkZWYgdGVzdF9ib2R5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYnl0ZXMgPSAnXHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmJworICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oYnl0ZXMpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnK3Z2OC9mNy8nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlcykKKworICAgIGRlZiB0ZXN0X2JpbmFyeV9ib2R5X3dpdGhfZW5jb2RlXzdvcjhiaXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTcxNzEuCisgICAgICAgIGJ5dGVzZGF0YSA9IGInXHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmJworICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oYnl0ZXNkYXRhLCBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfN29yOGJpdCkKKyAgICAgICAgIyBUcmVhdGVkIGFzIGEgc3RyaW5nLCB0aGlzIHdpbGwgYmUgaW52YWxpZCBjb2RlIHBvaW50cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgYnl0ZXNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGJ5dGVzZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2RpbmcnXSwgJzhiaXQnKQorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIHdpcmVmb3JtID0gcy5nZXR2YWx1ZSgpCisgICAgICAgIG1zZzIgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKHdpcmVmb3JtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZCgpLCBieXRlc2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMi5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGJ5dGVzZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10sICc4Yml0JykKKworICAgIGRlZiB0ZXN0X2JpbmFyeV9ib2R5X3dpdGhfZW5jb2RlX25vb3Aoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTY1NjQ6IFRoaXMgZG9lcyBub3QgcHJvZHVjZSBhbiBSRkMgdmFsaWQgbWVzc2FnZSwgc2luY2UgdG8gYmUKKyAgICAgICAgIyB2YWxpZCBpdCBzaG91bGQgaGF2ZSBhIENURSBvZiBiaW5hcnkuICBCdXQgdGhlIGJlbG93IHdvcmtzLCBhbmQgaXMKKyAgICAgICAgIyBkb2N1bWVudGVkIGFzIHdvcmtpbmcgdGhpcyB3YXkuCisgICAgICAgIGJ5dGVzZGF0YSA9IGInXHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmJworICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oYnl0ZXNkYXRhLCBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfbm9vcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgYnl0ZXNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksIGJ5dGVzZGF0YSkKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICB3aXJlZm9ybSA9IHMuZ2V0dmFsdWUoKQorICAgICAgICBtc2cyID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh3aXJlZm9ybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgYnl0ZXNkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzIuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlc2RhdGEpCisKKworIyBUZXN0IHRoZSBiYXNpYyBNSU1FVGV4dCBjbGFzcworY2xhc3MgVGVzdE1JTUVUZXh0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX21zZyA9IE1JTUVUZXh0KCdoZWxsbyB0aGVyZScpCisKKyAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIG1pc3NpbmcsIGhlYWRlcj0nZm9vYmFyJykKKyAgICAgICAgICAgICAgIGlzIG1pc3NpbmcpCisKKyAgICBkZWYgdGVzdF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmUnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gdGhlcmUnLCBfY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKworCisKKyMgVGVzdCBjb21wbGljYXRlZCBtdWx0aXBhcnQvKiBtZXNzYWdlcworY2xhc3MgVGVzdE11bHRpcGFydChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ1B5QmFubmVyMDQ4LmdpZicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICBjb250YWluZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJywgYm91bmRhcnk9J0JPVU5EQVJZJykKKyAgICAgICAgaW1hZ2UgPSBNSU1FSW1hZ2UoZGF0YSwgbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbWFnZS5hZGRfaGVhZGVyKCdjb250ZW50LWRpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIGludHJvID0gTUlNRVRleHQoJycnXAorSGkgdGhlcmUsCisKK1RoaXMgaXMgdGhlIGRpbmd1cyBmaXNoLgorJycnKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGludHJvKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGltYWdlKQorICAgICAgICBjb250YWluZXJbJ0Zyb20nXSA9ICdCYXJyeSA8YmFycnlAZGlnaWNvb2wuY29tPicKKyAgICAgICAgY29udGFpbmVyWydUbyddID0gJ0Rpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+JworICAgICAgICBjb250YWluZXJbJ1N1YmplY3QnXSA9ICdIZXJlIGlzIHlvdXIgZGluZ3VzIGZpc2gnCisKKyAgICAgICAgbm93ID0gOTg3ODA5NzAyLjU0ODQ4NTk5CisgICAgICAgIHRpbWV0dXBsZSA9IHRpbWUubG9jYWx0aW1lKG5vdykKKyAgICAgICAgaWYgdGltZXR1cGxlWy0xXSA9PSAwOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS50aW1lem9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS5hbHR6b25lCisgICAgICAgIGlmIHR6c2VjcyA+IDA6CisgICAgICAgICAgICBzaWduID0gJy0nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaWduID0gJysnCisgICAgICAgIHR6b2Zmc2V0ID0gJyAlcyUwNGQnICUgKHNpZ24sIHR6c2VjcyAvLyAzNikKKyAgICAgICAgY29udGFpbmVyWydEYXRlJ10gPSB0aW1lLnN0cmZ0aW1lKAorICAgICAgICAgICAgJyVhLCAlZCAlYiAlWSAlSDolTTolUycsCisgICAgICAgICAgICB0aW1lLmxvY2FsdGltZShub3cpKSArIHR6b2Zmc2V0CisgICAgICAgIHNlbGYuX21zZyA9IGNvbnRhaW5lcgorICAgICAgICBzZWxmLl9pbSA9IGltYWdlCisgICAgICAgIHNlbGYuX3R4dCA9IGludHJvCisKKyAgICBkZWYgdGVzdF9oaWVyYXJjaHkoc2VsZik6CisgICAgICAgICMgY29udmVuaWVuY2UKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICAjIHRlc3RzCisgICAgICAgIG0gPSBzZWxmLl9tc2cKKyAgICAgICAgdW5sZXNzKG0uaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIGVxKG0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKKyAgICAgICAgZXEobGVuKG0uZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIHJhaXNlcyhJbmRleEVycm9yLCBtLmdldF9wYXlsb2FkLCAyKQorICAgICAgICBtMCA9IG0uZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgbTEgPSBtLmdldF9wYXlsb2FkKDEpCisgICAgICAgIHVubGVzcyhtMCBpcyBzZWxmLl90eHQpCisgICAgICAgIHVubGVzcyhtMSBpcyBzZWxmLl9pbSkKKyAgICAgICAgZXEobS5nZXRfcGF5bG9hZCgpLCBbbTAsIG0xXSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMC5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgdW5sZXNzKG5vdCBtMS5pc19tdWx0aXBhcnQoKSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X211bHRpcGFydF9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICB0ZXh0ID0gIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworCistLUJPVU5EQVJZLS0KKyIiIgorICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZXN0cih0ZXh0KQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwodGV4dCwgbXNnLmFzX3N0cmluZygpKQorCisgICAgZGVmIHRlc3Rfbm9fcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCisKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X25vX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9ICcnCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbChvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9vbmVfcGFydF9pbl9hX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSAnJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gTm9uZQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9IE5vbmUKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tCisnJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25sX2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnXG4nCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLQorCisnJycpCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2V4dGVybmFsX2JvZHkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNi50eHQnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBtc2cxID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L2FsdGVybmF0aXZlJykKKyAgICAgICAgZXEobGVuKG1zZzEuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGZvciBzdWJwYXJ0IGluIG1zZzEuZ2V0X3BheWxvYWQoKToKKyAgICAgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9leHRlcm5hbC1ib2R5JykKKyAgICAgICAgICAgIGVxKGxlbihzdWJwYXJ0LmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICAgICAgc3Vic3VicGFydCA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kb3VibGVfYm91bmRhcnkoc2VsZik6CisgICAgICAgICMgbXNnXzM3LnR4dCBpcyBhIG11bHRpcGFydCB0aGF0IGNvbnRhaW5zIHR3byBkYXNoLWJvdW5kYXJ5J3MgaW4gYQorICAgICAgICAjIHJvdy4gIE91ciBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjA0NiBjYWxscyBmb3IgaWdub3JpbmcgdGhlIHNlY29uZAorICAgICAgICAjIGFuZCBzdWJzZXF1ZW50IGJvdW5kYXJpZXMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM3LnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9pbm5lcl9jb250YWluc19vdXRlcl9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2dfMzgudHh0IGhhcyBhbiBpbm5lciBwYXJ0IHRoYXQgY29udGFpbnMgb3V0ZXIgYm91bmRhcmllcy4gIE15CisgICAgICAgICMgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDIwNDYgKGJhc2VkIG9uIHNlY3Rpb25zIDUuMSBhbmQgNS4xLjIpIHNheQorICAgICAgICAjIHRoZXNlIGFyZSBpbGxlZ2FsIGFuZCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgdW50ZXJtaW5hdGVkIGlubmVyCisgICAgICAgICMgcGFydHMuCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM4LnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgaXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvbWl4ZWQKKyAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX3dpdGhfc2FtZV9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtc2cgMzkudHh0IGlzIHNpbWlsYXJseSBldmlsIGluIHRoYXQgaXQncyBnb3QgaW5uZXIgcGFydHMgdGhhdCB1c2UKKyAgICAgICAgIyB0aGUgc2FtZSBib3VuZGFyeSBhcyBvdXRlciBwYXJ0cy4gIEFnYWluLCBJIGJlbGlldmUgdGhlIHdheSB0aGlzIGlzCisgICAgICAgICMgcGFyc2VkIGlzIGNsb3Nlc3QgdG8gdGhlIHNwaXJpdCBvZiBSRkMgMjA0NgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zOS50eHQnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGl0ZXJhdG9ycy5fc3RydWN0dXJlKG1zZywgc2ZwKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L21peGVkCisgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgIG11bHRpcGFydC9hbHRlcm5hdGl2ZQorICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICAgICAgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtCisgICAgdGV4dC9wbGFpbgorIiIiKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfaW5fbm9uX211bHRpcGFydChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuYXNfc3RyaW5nKCksICcnJ1wKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgYm91bmRhcnk9Ii0tOTYxMjg0MjM2NTUyNTIyMjY5IgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5CitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdCaXQKKworPGh0bWw+PC9odG1sPgorCistLS0tOTYxMjg0MjM2NTUyNTIyMjY5LS0KKycnJykKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5X3dpdGhfbGVhZGluZ19zcGFjZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoJycnXAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iICAgIFhYWFgiCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCisKKy0tICAgIFhYWFgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCistLSAgICBYWFhYLS0KKycnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnICAgIFhYWFgnKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfd2l0aG91dF90cmFpbGluZ19uZXdsaW5lKHNlbGYpOgorICAgICAgICBtID0gUGFyc2VyKCkucGFyc2VzdHIoIiIiXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0iCitNSU1FLVZlcnNpb246IDEuMAorCistLT09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PQorQ29udGVudC1UeXBlOiBpbWFnZS9maWxlMS5qcGcKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworWVhOa1pnPT0KKy0tPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09LS0iIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZCgpLCAnWVhOa1pnPT0nKQorCisKKworIyBUZXN0IHNvbWUgYmFkbHkgZm9ybWF0dGVkIG1lc3NhZ2VzCitjbGFzcyBUZXN0Tm9uQ29uZm9ybWFudChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9wYXJzZV9taXNzaW5nX21pbm9yX3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNC50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9zYW1lX2JvdW5kYXJ5X2lubmVyX291dGVyKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTUudHh0JykKKyAgICAgICAgIyBYWFggV2UgY2FuIHByb2JhYmx5IGV2ZW50dWFsbHkgZG8gYmV0dGVyCisgICAgICAgIGlubmVyID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIHVubGVzcyhoYXNhdHRyKGlubmVyLCAnZGVmZWN0cycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpbm5lci5kZWZlY3RzKSwgMSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoaW5uZXIuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfbm9fYm91bmRhcnkoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yNS50eHQnKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwgZXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCkpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfY29udGVudF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICAjIFJGQyAyMDQ1LCAkNS4yIHNheXMgaW52YWxpZCB5aWVsZHMgdGV4dC9wbGFpbgorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQnCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgIyBDbGVhciB0aGUgb2xkIHZhbHVlIGFuZCB0cnkgc29tZXRoaW5nIC9yZWFsbHkvIGludmFsaWQKKyAgICAgICAgZGVsIG1zZ1snY29udGVudC10eXBlJ10KKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICdmb28nCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgIyBTdGlsbCwgbWFrZSBzdXJlIHRoYXQgdGhlIG1lc3NhZ2UgaXMgaWRlbXBvdGVudGx5IGdlbmVyYXRlZAorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIG5lcShzLmdldHZhbHVlKCksICdDb250ZW50LVR5cGU6IGZvb1xuXG4nKQorCisgICAgZGVmIHRlc3Rfbm9fc3RhcnRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMxLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAiIiJcCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAxCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisiIiIpCisKKyAgICBkZWYgdGVzdF9ub19zZXBhcmF0aW5nX2JsYW5rX2xpbmUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM1LnR4dCcpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitTdWJqZWN0OiBoZXJlJ3Mgc29tZXRoaW5nIGludGVyZXN0aW5nCisKK2NvdW50ZXIgdG8gUkZDIDI4MjIsIHRoZXJlJ3Mgbm8gc2VwYXJhdGluZyBuZXdsaW5lIGhlcmUKKyIiIikKKworICAgIGRlZiB0ZXN0X2x5aW5nX211bHRpcGFydChzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQxLnR4dCcpCisgICAgICAgIHVubGVzcyhoYXNhdHRyKG1zZywgJ2RlZmVjdHMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwgZXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCkpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuTXVsdGlwYXJ0SW52YXJpYW50VmlvbGF0aW9uRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X21pc3Npbmdfc3RhcnRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIG91dGVyID0gc2VsZi5fbXNnb2JqKCdtc2dfNDIudHh0JykKKyAgICAgICAgIyBUaGUgbWVzc2FnZSBzdHJ1Y3R1cmUgaXM6CisgICAgICAgICMKKyAgICAgICAgIyBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgIyAgICB0ZXh0L3BsYWluCisgICAgICAgICMgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgIyAgICAgICAgbXVsdGlwYXJ0L21peGVkIFsqXQorICAgICAgICAjCisgICAgICAgICMgWypdIFRoaXMgbWVzc2FnZSBpcyBtaXNzaW5nIGl0cyBzdGFydCBib3VuZGFyeQorICAgICAgICBiYWQgPSBvdXRlci5nZXRfcGF5bG9hZCgxKS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiYWQuZGVmZWN0cyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKKworICAgIGRlZiB0ZXN0X2ZpcnN0X2xpbmVfaXNfY29udGludWF0aW9uX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnIExpbmUgMVxuTGluZSAyXG5MaW5lIDMnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmtleXMoKSwgW10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnTGluZSAyXG5MaW5lIDMnKQorICAgICAgICBlcShsZW4obXNnLmRlZmVjdHMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KSkKKyAgICAgICAgZXEobXNnLmRlZmVjdHNbMF0ubGluZSwgJyBMaW5lIDFcbicpCisKKworCisjIFRlc3QgUkZDIDIwNDcgaGVhZGVyIGVuY29kaW5nIGFuZCBkZWNvZGluZworY2xhc3MgVGVzdFJGQzIwNDcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JmYzIwNDdfbXVsdGlsaW5lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICIiIlJlOiA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IGJhegorIGZvbyBiYXIgPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSIiIgorICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsKKyAgICAgICAgICAgICgnUmU6JywgTm9uZSksCisgICAgICAgICAgICAoJ3JceDhha3NtXHg5YXJnXHg4Y3MnLCAnbWFjLWljZWxhbmQnKSwKKyAgICAgICAgICAgICgnYmF6IGZvbyBiYXInLCBOb25lKSwKKyAgICAgICAgICAgICgnclx4OGFrc21ceDlhcmdceDhjcycsICdtYWMtaWNlbGFuZCcpXSkKKyAgICAgICAgZXEoc3RyKG1ha2VfaGVhZGVyKGRoKSksCisgICAgICAgICAgICIiIlJlOiA9P21hYy1pY2VsYW5kP3E/cj04QWtzbT05QXJnPThDcz89IGJheiBmb28gYmFyCisgPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSIiIikKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfZWF0ZXJfdW5pY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnPT9JU08tODg1OS0xP1E/QW5kcj1FOT89IFBpcmFyZCA8cGlyYXJkQGRvbS5haW4+JworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsoJ0FuZHJceGU5JywgJ2lzby04ODU5LTEnKSwgKCdQaXJhcmQgPHBpcmFyZEBkb20uYWluPicsIE5vbmUpXSkKKyAgICAgICAgaHUgPSB1bmljb2RlKG1ha2VfaGVhZGVyKGRoKSkuZW5jb2RlKCdsYXRpbi0xJykKKyAgICAgICAgZXEoaHUsICdBbmRyXHhlOSBQaXJhcmQgPHBpcmFyZEBkb20uYWluPicpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2VhdGVyX3VuaWNvZGVfMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhlID0/aXNvLTg4NTktMT9iP2NYVnBZMnNnWW5KdmQyNGdabTk0Pz0ganVtcGVkIG92ZXIgdGhlID0/aXNvLTg4NTktMT9iP2JHRjZlU0JrYjJjPT89JworICAgICAgICBkaCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoZGgsIFsoJ1RoZScsIE5vbmUpLCAoJ3F1aWNrIGJyb3duIGZveCcsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgKCdqdW1wZWQgb3ZlciB0aGUnLCBOb25lKSwgKCdsYXp5IGRvZycsICdpc28tODg1OS0xJyldKQorICAgICAgICBodSA9IG1ha2VfaGVhZGVyKGRoKS5fX3VuaWNvZGVfXygpCisgICAgICAgIGVxKGh1LCB1J1RoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nJykKKworICAgIGRlZiB0ZXN0X3JmYzIwNDdfbWlzc2luZ193aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBzID0gJ1NtPT9JU08tODg1OS0xP0I/OWc9PT89cmc9P0lTTy04ODU5LTE/Qj81UT09Pz1zYm9yZCcKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGgsIFsocywgTm9uZSldKQorCisgICAgZGVmIHRlc3RfcmZjMjA0N193aXRoX3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIHMgPSAnU20gPT9JU08tODg1OS0xP0I/OWc9PT89IHJnID0/SVNPLTg4NTktMT9CPzVRPT0/PSBzYm9yZCcKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGgsIFsoJ1NtJywgTm9uZSksICgnXHhmNicsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3JnJywgTm9uZSksICgnXHhlNScsICdpc28tODg1OS0xJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3Nib3JkJywgTm9uZSldKQorCisKKworIyBUZXN0IHRoZSBNSU1FTWVzc2FnZSBjbGFzcworY2xhc3MgVGVzdE1JTUVNZXNzYWdlKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzExLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3RleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3R5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTUlNRU1lc3NhZ2UsICdhIHBsYWluIHN0cmluZycpCisKKyAgICBkZWYgdGVzdF92YWxpZF9hcmd1bWVudChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBzdWJqZWN0ID0gJ0Egc3ViLW1lc3NhZ2UnCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gc3ViamVjdAorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgZXEoci5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSByLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKHN1YnBhcnQgaXMgbSkKKyAgICAgICAgZXEoc3VicGFydFsnc3ViamVjdCddLCBzdWJqZWN0KQorCisgICAgZGVmIHRlc3RfYmFkX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZzEgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMVsnU3ViamVjdCddID0gJ3N1YnBhcnQgMScKKyAgICAgICAgbXNnMiA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cyWydTdWJqZWN0J10gPSAnc3VicGFydCAyJworICAgICAgICByID0gTUlNRU1lc3NhZ2UobXNnMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvciwgci5hdHRhY2gsIG1zZzIpCisKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZShzZWxmKToKKyAgICAgICAgIyBGaXJzdCBjcmFmdCB0aGUgbWVzc2FnZSB0byBiZSBlbmNhcHN1bGF0ZWQKKyAgICAgICAgbSA9IE1lc3NhZ2UoKQorICAgICAgICBtWydTdWJqZWN0J10gPSAnQW4gZW5jbG9zZWQgbWVzc2FnZScKKyAgICAgICAgbS5zZXRfcGF5bG9hZCgnSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS5cbicpCisgICAgICAgIHIgPSBNSU1FTWVzc2FnZShtKQorICAgICAgICByWydTdWJqZWN0J10gPSAnVGhlIGVuY2xvc2luZyBtZXNzYWdlJworICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgIiIiXAorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IFRoZSBlbmNsb3NpbmcgbWVzc2FnZQorCitTdWJqZWN0OiBBbiBlbmNsb3NlZCBtZXNzYWdlCisKK0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCisiIiIpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9tZXNzYWdlX3JmYzgyMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VibXNnID0gcGF5bG9hZFswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJtc2dbJ3N1YmplY3QnXSwgJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnKQorICAgICAgICBlcShzdWJtc2cuZ2V0X3BheWxvYWQoKSwgJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorCisgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgdW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgYSB0ZXh0L3BsYWluLCBodW1hbiByZWFkYWJsZSBzZWN0aW9uCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3VicGFydC5nZXRfcGF5bG9hZCgpLCAiIiJcCitUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKKworICBNZXNzYWdlLWlkOiA8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+CisgIERhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKKyAgRnJvbTogIklhbiBULiBIZW5yeSIgPGhlbnJ5aUBveHkuZWR1PgorICBUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CisgIFN1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorCitZb3VyIG1lc3NhZ2UgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgZm9sbG93aW5nIHJlY2lwaWVudHM6CisKKyAgUmVjaXBpZW50IGFkZHJlc3M6IGphbmdlbDFAY291Z2FyLm5vYy51Y2xhLmVkdQorICBSZWFzb246IHJlY2lwaWVudCByZWFjaGVkIGRpc2sgcXVvdGEKKworIiIiKQorICAgICAgICAjIFN1YnBhcnQgMiBjb250YWlucyB0aGUgbWFjaGluZSBwYXJzYWJsZSBEU04gaW5mb3JtYXRpb24uICBJdAorICAgICAgICAjIGNvbnNpc3RzIG9mIHR3byBibG9ja3Mgb2YgaGVhZGVycywgcmVwcmVzZW50ZWQgYnkgdHdvIG5lc3RlZCBNZXNzYWdlCisgICAgICAgICMgb2JqZWN0cy4KKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJykKKyAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgICMgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMgc2hvdWxkIHRyZWF0IGVhY2ggYmxvY2sgYXMgYSBidW5jaCBvZgorICAgICAgICAjIGhlYWRlcnMsIGkuZS4gYSBidW5jaCBvZiBNZXNzYWdlIG9iamVjdHMuCisgICAgICAgIGRzbjEgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDApCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjEsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24xWydvcmlnaW5hbC1lbnZlbG9wZS1pZCddLCAnMEdLNTAwQjRIRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdScpCisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCdkbnMnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgJycpCisgICAgICAgICMgVHJ5IGEgbWlzc2luZyBvbmUgPHdpbms+CisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCduc2QnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgTm9uZSkKKyAgICAgICAgZHNuMiA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoZHNuMiwgTWVzc2FnZSkpCisgICAgICAgIGVxKGRzbjJbJ2FjdGlvbiddLCAnZmFpbGVkJykKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW1zKGhlYWRlcj0nb3JpZ2luYWwtcmVjaXBpZW50JyksCisgICAgICAgICAgIFsoJ3JmYzgyMicsICcnKSwgKCdqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUnLCAnJyldKQorICAgICAgICBlcShkc24yLmdldF9wYXJhbSgncmZjODIyJywgaGVhZGVyPSdmaW5hbC1yZWNpcGllbnQnKSwgJycpCisgICAgICAgICMgU3VicGFydCAzIGlzIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMikKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3Vic3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3Vic3VicGFydCwgTWVzc2FnZSkpCisgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnN1YnBhcnRbJ21lc3NhZ2UtaWQnXSwKKyAgICAgICAgICAgJzwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4nKQorCisgICAgZGVmIHRlc3RfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snVG8nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gJ1Rlc3QnCisgICAgICAgIG1zZy5wcmVhbWJsZSA9ICdNSU1FIG1lc3NhZ2UnCisgICAgICAgIG1zZy5lcGlsb2d1ZSA9ICdFbmQgb2YgTUlNRSBtZXNzYWdlXG4nCisgICAgICAgIG1zZzEgPSBNSU1FVGV4dCgnT25lJykKKyAgICAgICAgbXNnMiA9IE1JTUVUZXh0KCdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9taXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMSkKKyAgICAgICAgbXNnLmF0dGFjaChtc2cyKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX25sX3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IFRlc3QKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKK01JTUUgbWVzc2FnZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK09uZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1R3bworLS1CT1VOREFSWS0tCisiIiIpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMzAudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGNvbnRhaW5lcjEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMWEgPSBjb250YWluZXIxLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgY29udGFpbmVyMmEgPSBjb250YWluZXIyLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfdHlwZV93aXRoX2V4cGxpY2l0X2NvbnRhaW5lcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfbm9uX3BhcnNlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIFNldCB1cCBjb250YWluZXIKKyAgICAgICAgY29udGFpbmVyID0gTUlNRU11bHRpcGFydCgnZGlnZXN0JywgJ0JPVU5EQVJZJykKKyAgICAgICAgY29udGFpbmVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgIyBTZXQgdXAgc3VicGFydHMKKyAgICAgICAgc3VicGFydDFhID0gTUlNRVRleHQoJ21lc3NhZ2UgMVxuJykKKyAgICAgICAgc3VicGFydDJhID0gTUlNRVRleHQoJ21lc3NhZ2UgMlxuJykKKyAgICAgICAgc3VicGFydDEgPSBNSU1FTWVzc2FnZShzdWJwYXJ0MWEpCisgICAgICAgIHN1YnBhcnQyID0gTUlNRU1lc3NhZ2Uoc3VicGFydDJhKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQxKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQyKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KKycnJykKKyAgICAgICAgZGVsIHN1YnBhcnQxWydjb250ZW50LXR5cGUnXQorICAgICAgICBkZWwgc3VicGFydDFbJ21pbWUtdmVyc2lvbiddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQyWydtaW1lLXZlcnNpb24nXQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9taW1lX2F0dGFjaG1lbnRzX2luX2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGV4dDEgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgdGV4dDIgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgbXNnID0gTUlNRU11bHRpcGFydChfc3VicGFydHM9KHRleHQxLCB0ZXh0MikpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKSwgdGV4dDEpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgxKSwgdGV4dDIpCisKKworCisjIEEgZ2VuZXJhbCB0ZXN0IG9mIHBhcnNlci0+bW9kZWwtPmdlbmVyYXRvciBpZGVtcG90ZW5jeS4gIElPVywgcmVhZCBhIG1lc3NhZ2UKKyMgaW4sIHBhcnNlIGl0IGludG8gYSBtZXNzYWdlIG9iamVjdCB0cmVlLCB0aGVuIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHRyZWUsCisjIHJlZ2VuZXJhdGUgdGhlIHBsYWluIHRleHQuICBUaGUgb3JpZ2luYWwgdGV4dCBhbmQgdGhlIHRyYW5zZm9ybWVkIHRleHQKKyMgc2hvdWxkIGJlIGlkZW50aWNhbC4gIE5vdGU6IHRoYXQgd2UgaWdub3JlIHRoZSBVbml4LUZyb20gc2luY2UgdGhhdCBtYXkKKyMgY29udGFpbiBhIGNoYW5nZWQgZGF0ZS4KK2NsYXNzIFRlc3RJZGVtcG90ZW50KFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiBfbXNnb2JqKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZShmaWxlbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKGRhdGEpCisgICAgICAgIHJldHVybiBtc2csIGRhdGEKKworICAgIGRlZiBfaWRlbXBvdGVudChzZWxmLCBtc2csIHRleHQpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1heGhlYWRlcmxlbj0wKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcSh0ZXh0LCBzLmdldHZhbHVlKCkpCisKKyAgICBkZWYgdGVzdF9wYXJzZV90ZXh0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKClbMV0sICgnY2hhcnNldCcsICd1cy1hc2NpaScpKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5wcmVhbWJsZSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmVwaWxvZ3VlLCBOb25lKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3BhcnNlX3VudHlwZWRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCBOb25lKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Qoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI3LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Rfd2l0aF9wYXJ0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWl4ZWRfd2l0aF9pbWFnZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfcmVwb3J0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9wcmVhbWJsZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfb25lX3BhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIzLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX3BhcnRzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfY2hhcnNldChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzIudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tb3JlX3JmYzIyMzFfcGFyYW1ldGVycyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzMudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF90ZXh0X3BsYWluX2luX2FfbXVsdGlwYXJ0X2RpZ2VzdChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfbXVsdGlwYXJ0X21peGVkcyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTJhLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9leHRlcm5hbF9ib2R5X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzM2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfY29udGVudF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgICMgR2V0IGEgbWVzc2FnZSBvYmplY3QgYW5kIHJlc2V0IHRoZSBzZWVrIHBvaW50ZXIgZm9yIG90aGVyIHRlc3RzCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA1LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgIyBUZXN0IHRoZSBDb250ZW50LVR5cGU6IHBhcmFtZXRlcnMKKyAgICAgICAgcGFyYW1zID0ge30KKyAgICAgICAgZm9yIHBrLCBwdiBpbiBtc2cuZ2V0X3BhcmFtcygpOgorICAgICAgICAgICAgcGFyYW1zW3BrXSA9IHB2CisgICAgICAgIGVxKHBhcmFtc1sncmVwb3J0LXR5cGUnXSwgJ2RlbGl2ZXJ5LXN0YXR1cycpCisgICAgICAgIGVxKHBhcmFtc1snYm91bmRhcnknXSwgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKQorICAgICAgICBlcShtc2cucHJlYW1ibGUsICdUaGlzIGlzIGEgTUlNRS1lbmNhcHN1bGF0ZWQgbWVzc2FnZS5cbicpCisgICAgICAgIGVxKG1zZy5lcGlsb2d1ZSwgJ1xuJykKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN1YnBhcnRzIGFyZSB3aGF0IHdlIGV4cGVjdAorICAgICAgICBtc2cxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZzEuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQorICAgICAgICBtc2cyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKG1zZzIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKG1zZzIuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQorICAgICAgICBtc2czID0gbXNnLmdldF9wYXlsb2FkKDIpCisgICAgICAgIGVxKG1zZzMuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2czLCBNZXNzYWdlKSkKKyAgICAgICAgcGF5bG9hZCA9IG1zZzMuZ2V0X3BheWxvYWQoKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKKyAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQorICAgICAgICBtc2c0ID0gcGF5bG9hZFswXQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2c0LCBNZXNzYWdlKSkKKyAgICAgICAgZXEobXNnNC5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCisKKyAgICBkZWYgdGVzdF9wYXJzZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKKyAgICAgICAgIyBDaGVjayBzb21lIG9mIHRoZSBvdXRlciBoZWFkZXJzCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBwYXlsb2FkIGlzIGEgbGlzdCBvZiBleGFjdGx5IG9uZSBzdWItTWVzc2FnZSwgYW5kIHRoYXQKKyAgICAgICAgIyB0aGF0IHN1Ym1lc3NhZ2UgaGFzIGEgdHlwZSBvZiB0ZXh0L3BsYWluCisgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKKyAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQorICAgICAgICBtc2cxID0gcGF5bG9hZFswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cxLCBNZXNzYWdlKSkKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpKQorICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdcbicpCisKKworCisjIFRlc3QgdmFyaW91cyBvdGhlciBiaXRzIG9mIHRoZSBwYWNrYWdlJ3MgZnVuY3Rpb25hbGl0eQorY2xhc3MgVGVzdE1pc2NlbGxhbmVvdXMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0KQorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAjIERvbid0IHdyYXAvY29udGludWUgbG9uZyBoZWFkZXJzIHNpbmNlIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICMgaWRlbXBvdGVuY3kuCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX2ZpbGUoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgICAgICBmcC5zZWVrKDApCisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAjIERvbid0IHdyYXAvY29udGludWUgbG9uZyBoZWFkZXJzIHNpbmNlIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICAgICAjIGlkZW1wb3RlbmN5LgorICAgICAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHMuZ2V0dmFsdWUoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmdfd2l0aF9jbGFzcyhzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICMgQ3JlYXRlIGEgc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgTXlNZXNzYWdlKE1lc3NhZ2UpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCwgTXlNZXNzYWdlKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2csIE15TWVzc2FnZSkpCisgICAgICAgICMgVHJ5IHNvbWV0aGluZyBtb3JlIGNvbXBsaWNhdGVkCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCwgTXlNZXNzYWdlKQorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cud2FsaygpOgorICAgICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3VicGFydCwgTXlNZXNzYWdlKSkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9maWxlX3dpdGhfY2xhc3Moc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oJ2VtYWlsJykKKyAgICAgICAgIyBDYW4ndCB1c2Ugc29ydGVkKCkgaGVyZSBkdWUgdG8gUHl0aG9uIDIuMyBjb21wYXRpYmlsaXR5CisgICAgICAgIGFsbCA9IG1vZHVsZS5fX2FsbF9fWzpdCisgICAgICAgIGFsbC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwsIFsKKyAgICAgICAgICAgICMgT2xkIG5hbWVzCisgICAgICAgICAgICAnQ2hhcnNldCcsICdFbmNvZGVycycsICdFcnJvcnMnLCAnR2VuZXJhdG9yJywKKyAgICAgICAgICAgICdIZWFkZXInLCAnSXRlcmF0b3JzJywgJ01JTUVBdWRpbycsICdNSU1FQmFzZScsCisgICAgICAgICAgICAnTUlNRUltYWdlJywgJ01JTUVNZXNzYWdlJywgJ01JTUVNdWx0aXBhcnQnLAorICAgICAgICAgICAgJ01JTUVOb25NdWx0aXBhcnQnLCAnTUlNRVRleHQnLCAnTWVzc2FnZScsCisgICAgICAgICAgICAnUGFyc2VyJywgJ1V0aWxzJywgJ2Jhc2U2NE1JTUUnLAorICAgICAgICAgICAgIyBuZXcgbmFtZXMKKyAgICAgICAgICAgICdiYXNlNjRtaW1lJywgJ2NoYXJzZXQnLCAnZW5jb2RlcnMnLCAnZXJyb3JzJywgJ2dlbmVyYXRvcicsCisgICAgICAgICAgICAnaGVhZGVyJywgJ2l0ZXJhdG9ycycsICdtZXNzYWdlJywgJ21lc3NhZ2VfZnJvbV9maWxlJywKKyAgICAgICAgICAgICdtZXNzYWdlX2Zyb21fc3RyaW5nJywgJ21pbWUnLCAncGFyc2VyJywKKyAgICAgICAgICAgICdxdW9wcmlNSU1FJywgJ3F1b3ByaW1pbWUnLCAndXRpbHMnLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKHV0aWxzLmZvcm1hdGRhdGUobm93KSlbOjZdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV9sb2NhbHRpbWUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5wYXJzZWRhdGUodXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1UcnVlKSlbOjZdLAorICAgICAgICAgICAgdGltZS5sb2NhbHRpbWUobm93KVs6Nl0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlX3VzZWdtdChzZWxmKToKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9RmFsc2UpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIC0wMDAwJywgdGltZS5nbXRpbWUobm93KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlLCB1c2VnbXQ9VHJ1ZSksCisgICAgICAgICAgICB0aW1lLnN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UJywgdGltZS5nbXRpbWUobm93KSkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJycpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Qoc2VsZik6CisgICAgICAgICMgVGhlIEZXUyBhZnRlciB0aGUgY29tbWEgaXMgb3B0aW9uYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJ1dlZCwzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMucGFyc2VkYXRlKCdXZWQsIDMgQXByIDIwMDIgMTQ6NTg6MjYgKzA4MDAnKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgLTEsIC0yODgwMCkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfY29tcGFjdF9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzUgRmViIDIwMDMgMTM6NDc6MjYgLTA4MDAnKSwKKyAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2FjY2VwdGFibGVfdG9fdGltZV9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlKCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwKSkKKyAgICAgICAgZXEodGltZS5sb2NhbHRpbWUodClbOjZdLCB0aW1ldHVwWzo2XSkKKyAgICAgICAgZXEoaW50KHRpbWUuc3RyZnRpbWUoJyVZJywgdGltZXR1cCkpLCAyMDAzKQorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwWzo5XSkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXBbOjldKSksIDIwMDMpCisKKyAgICBkZWYgdGVzdF9wYXJzZWFkZHJfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKCc8PicpLCAoJycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5mb3JtYXRhZGRyKHV0aWxzLnBhcnNlYWRkcignPD4nKSksICcnKQorCisgICAgZGVmIHRlc3Rfbm9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgJ0EgU2lsbHkgUGVyc29uIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQSAoVmVyeSkgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBcKFZlcnlcKSBTaWxseSBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBIFwoU3BlY2lhbFwpIFBlcnNvbicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2JhY2tzbGFzaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0FydGh1ciBcQmFja3NsYXNoXCBGb29iYXInLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBcnRodXIgXFxCYWNrc2xhc2hcXCBGb29iYXIiIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJworICAgICAgICBiID0gJ3BlcnNvbkBkb20uYWluJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih1dGlscy5mb3JtYXRhZGRyKChhLCBiKSkpLCAoYSwgYikpCisKKyAgICBkZWYgdGVzdF9uYW1lX3dpdGhfZG90KHNlbGYpOgorICAgICAgICB4ID0gJ0pvaG4gWC4gRG9lIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICB5ID0gJyJKb2huIFguIERvZSIgPGp4ZEBleGFtcGxlLmNvbT4nCisgICAgICAgIGEsIGIgPSAoJ0pvaG4gWC4gRG9lJywgJ2p4ZEBleGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHgpLCAoYSwgYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHkpLCAoYSwgYikpCisgICAgICAgICMgZm9ybWF0YWRkcigpIHF1b3RlcyB0aGUgbmFtZSBpZiB0aGVyZSdzIGEgZG90IGluIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpLCB5KQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5lX2Zyb21fY29tbWVudChzZWxmKToKKyAgICAgICAgeCA9ICIiIlwKK0ZvbworXHRCYXIgPGZvb0BleGFtcGxlLmNvbT4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIoeCksICgnRm9vIEJhcicsICdmb29AZXhhbXBsZS5jb20nKSkKKworICAgIGRlZiB0ZXN0X3F1b3RlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQSBTaWxseTsgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBTaWxseTsgUGVyc29uIiA8cGVyc29uQGRvbS5haW4+JykKKworICAgIGRlZiB0ZXN0X2ZpeF9lb2xzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvJyksICdoZWxsbycpCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsb1xuJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9ccicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXHJcbicpLCAnaGVsbG9cclxuJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXG5ccicpLCAnaGVsbG9cclxuXHJcbicpCisKKyAgICBkZWYgdGVzdF9jaGFyc2V0X3JpY2hjb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lID0gc2VsZi5hc3NlcnROb3RFcXVhbAorICAgICAgICBjc2V0MSA9IENoYXJzZXQoKQorICAgICAgICBjc2V0MiA9IENoYXJzZXQoKQorICAgICAgICBlcShjc2V0MSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEoY3NldDEsICdVUy1BU0NJSScpCisgICAgICAgIGVxKGNzZXQxLCAnVXMtQXNDaUknKQorICAgICAgICBlcSgndXMtYXNjaWknLCBjc2V0MSkKKyAgICAgICAgZXEoJ1VTLUFTQ0lJJywgY3NldDEpCisgICAgICAgIGVxKCdVcy1Bc0NpSScsIGNzZXQxKQorICAgICAgICBuZShjc2V0MSwgJ3VzYXNjaWknKQorICAgICAgICBuZShjc2V0MSwgJ1VTQVNDSUknKQorICAgICAgICBuZShjc2V0MSwgJ1VzQXNDaUknKQorICAgICAgICBuZSgndXNhc2NpaScsIGNzZXQxKQorICAgICAgICBuZSgnVVNBU0NJSScsIGNzZXQxKQorICAgICAgICBuZSgnVXNBc0NpSScsIGNzZXQxKQorICAgICAgICBlcShjc2V0MSwgY3NldDIpCisgICAgICAgIGVxKGNzZXQyLCBjc2V0MSkKKworICAgIGRlZiB0ZXN0X2dldGFkZHJlc3NlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcyhbJ2FwZXJzb25AZG9tLmFpbiAoQWwgUGVyc29uKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0J1ZCBQZXJzb24gPGJwZXJzb25AZG9tLmFpbj4nXSksCisgICAgICAgICAgIFsoJ0FsIFBlcnNvbicsICdhcGVyc29uQGRvbS5haW4nKSwKKyAgICAgICAgICAgICgnQnVkIFBlcnNvbicsICdicGVyc29uQGRvbS5haW4nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRhZGRyZXNzZXNfbmFzdHkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5nZXRhZGRyZXNzZXMoWydmb286IDsnXSksIFsoJycsICcnKV0pCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcygKKyAgICAgICAgICAgWydbXSotLSA9fiQnXSksCisgICAgICAgICAgIFsoJycsICcnKSwgKCcnLCAnJyksICgnJywgJyotLScpXSkKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKAorICAgICAgICAgICBbJ2ZvbzogOycsICciSmFzb24gUi4gTWFzdGFsZXIiIDxqYXNvbkBkb20uYWluPiddKSwKKyAgICAgICAgICAgWygnJywgJycpLCAoJ0phc29uIFIuIE1hc3RhbGVyJywgJ2phc29uQGRvbS5haW4nKV0pCisKKyAgICBkZWYgdGVzdF9nZXRhZGRyZXNzZXNfZW1iZWRkZWRfY29tbWVudChzZWxmKToKKyAgICAgICAgIiIiVGVzdCBwcm9wZXIgaGFuZGxpbmcgb2YgYSBuZXN0ZWQgY29tbWVudCIiIgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYWRkcnMgPSB1dGlscy5nZXRhZGRyZXNzZXMoWydVc2VyICgobmVzdGVkIGNvbW1lbnQpKSA8Zm9vQGJhci5jb20+J10pCisgICAgICAgIGVxKGFkZHJzWzBdWzFdLCAnZm9vQGJhci5jb20nKQorCisgICAgZGVmIHRlc3RfdXRpbHNfcXVvdGVfdW5xdW90ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Zvb1xcd2Fja3kibmFtZScpCisgICAgICAgIGVxKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ2Zvb1xcd2Fja3kibmFtZScpCisKKyAgICBkZWYgdGVzdF9nZXRfYm9keV9lbmNvZGluZ193aXRoX2JvZ3VzX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KCdub3QgYSBjaGFyc2V0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksICdiYXNlNjQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvZHlfZW5jb2Rpbmdfd2l0aF91cHBlcmNhc2VfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9VVRGLTgnCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04JykKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCkKKyAgICAgICAgZXEobGVuKGNoYXJzZXRzKSwgMSkKKyAgICAgICAgZXEoY2hhcnNldHNbMF0sICd1dGYtOCcpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXRzWzBdKQorICAgICAgICBlcShjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksICdiYXNlNjQnKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2hlbGxvIHdvcmxkJywgY2hhcnNldD1jaGFyc2V0KQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2FHVnNiRzhnZDI5eWJHUT1cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZChkZWNvZGU9VHJ1ZSksICdoZWxsbyB3b3JsZCcpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAnYmFzZTY0JykKKyAgICAgICAgIyBUcnkgYW5vdGhlciBvbmUKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAndGV4dC9wbGFpbjsgY2hhcnNldD0iVVMtQVNDSUkiJworICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoKQorICAgICAgICBlcShsZW4oY2hhcnNldHMpLCAxKQorICAgICAgICBlcShjaGFyc2V0c1swXSwgJ3VzLWFzY2lpJykKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoY2hhcnNldHNbMF0pCisgICAgICAgIGVxKGNoYXJzZXQuZ2V0X2JvZHlfZW5jb2RpbmcoKSwgZW5jb2RlcnMuZW5jb2RlXzdvcjhiaXQpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnaGVsbG8gd29ybGQnLCBjaGFyc2V0PWNoYXJzZXQpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfY2hhcnNldHNfY2FzZV9pbnNlbnNpdGl2ZShzZWxmKToKKyAgICAgICAgbGMgPSBDaGFyc2V0KCd1cy1hc2NpaScpCisgICAgICAgIHVjID0gQ2hhcnNldCgnVVMtQVNDSUknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxjLmdldF9ib2R5X2VuY29kaW5nKCksIHVjLmdldF9ib2R5X2VuY29kaW5nKCkpCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsX2ZhbGxzX2luc2lkZV9tZXNzYWdlX2RlbGl2ZXJ5X3N0YXR1cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGUgUGFyc2VyIGludGVyZmFjZSBwcm92aWRlcyBjaHVua3Mgb2YgZGF0YSB0byBGZWVkUGFyc2VyIGluIDgxOTIKKyAgICAgICAgIyBieXRlIGd1bHBzLiAgU0YgYnVnICMxMDc2NDg1IGZvdW5kIG9uZSBvZiB0aG9zZSBjaHVua3MgaW5zaWRlCisgICAgICAgICMgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMgaGVhZGVyIGJsb2NrLCB3aGljaCB0cmlnZ2VyZWQgYW4KKyAgICAgICAgIyB1bnJlYWRsaW5lKCkgb2YgTmVlZE1vcmVEYXRhLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180My50eHQnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGl0ZXJhdG9ycy5fc3RydWN0dXJlKG1zZywgc2ZwKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorbXVsdGlwYXJ0L3JlcG9ydAorICAgIHRleHQvcGxhaW4KKyAgICBtZXNzYWdlL2RlbGl2ZXJ5LXN0YXR1cworICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICB0ZXh0L3JmYzgyMi1oZWFkZXJzCisiIiIpCisKKworCisjIFRlc3QgdGhlIGl0ZXJhdG9yL2dlbmVyYXRvcnMKK2NsYXNzIFRlc3RJdGVyYXRvcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfYm9keV9saW5lX2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgRmlyc3QgYSBzaW1wbGUgbm9uLW11bHRpcGFydCBtZXNzYWdlCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLmJvZHlfbGluZV9pdGVyYXRvcihtc2cpCisgICAgICAgIGxpbmVzID0gbGlzdChpdCkKKyAgICAgICAgZXEobGVuKGxpbmVzKSwgNikKKyAgICAgICAgbmVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCBtc2cuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgIyBOb3cgYSBtb3JlIGNvbXBsaWNhdGVkIG11bHRpcGFydAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMi50eHQnKQorICAgICAgICBpdCA9IGl0ZXJhdG9ycy5ib2R5X2xpbmVfaXRlcmF0b3IobXNnKQorICAgICAgICBsaW5lcyA9IGxpc3QoaXQpCisgICAgICAgIGVxKGxlbihsaW5lcyksIDQzKQorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMTkudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCBmcC5yZWFkKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDQudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMudHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2csICd0ZXh0JykKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBzdWJwYXJ0cyA9IDAKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gaXQ6CisgICAgICAgICAgICBzdWJwYXJ0cyArPSAxCisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3VicGFydC5nZXRfcGF5bG9hZCgpKQorICAgICAgICBlcShzdWJwYXJ0cywgMikKKyAgICAgICAgZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksICIiIlwKK2Egc2ltcGxlIGtpbmQgb2YgbWlycm9yCit0byByZWZsZWN0IHVwb24gb3VyIG93bgorYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCisiIiIpCisKKyAgICBkZWYgdGVzdF90eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yX2RlZmF1bHRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLnR5cGVkX3N1YnBhcnRfaXRlcmF0b3IobXNnLCAndGV4dCcsICdwbGFpbicpCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgc3VicGFydHMgPSAwCisgICAgICAgIGZvciBzdWJwYXJ0IGluIGl0OgorICAgICAgICAgICAgc3VicGFydHMgKz0gMQorICAgICAgICAgICAgbGluZXMuYXBwZW5kKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSkKKyAgICAgICAgZXEoc3VicGFydHMsIDEpCisgICAgICAgIGVxKEVNUFRZU1RSSU5HLmpvaW4obGluZXMpLCAiIiJcCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisKKworY2xhc3MgVGVzdFBhcnNlcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfaGVhZGVyX3BhcnNlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgUGFyc2Ugb25seSB0aGUgaGVhZGVycyBvZiBhIGNvbXBsZXggbXVsdGlwYXJ0IE1JTUUgZG9jdW1lbnQKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IEhlYWRlclBhcnNlcigpLnBhcnNlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBlcShtc2dbJ2Zyb20nXSwgJ3BwcC1yZXF1ZXN0QHp6ei5vcmcnKQorICAgICAgICBlcShtc2dbJ3RvJ10sICdwcHBAenp6Lm9yZycpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVGhpcyBtZXNzYWdlIGNvbnRhaW5zIGEgbGluZSBhZnRlciB0aGUgU3ViamVjdDogaGVhZGVyIHRoYXQgaGFzIG9ubHkKKyAgICAgICAgIyB3aGl0ZXNwYWNlLCBidXQgaXQgaXMgbm90IGVtcHR5IQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorU3ViamVjdDogdGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdAorXHgyMAorRGF0ZTogTW9uLCA4IEFwciAyMDAyIDE1OjA5OjE5IC0wNDAwCitNZXNzYWdlLUlEOiBzcGFtCisKK0hlcmUncyB0aGUgbWVzc2FnZSBib2R5CisiIiIpCisgICAgICAgIGVxKG1zZ1snc3ViamVjdCddLCAndGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdFxuICcpCisgICAgICAgIGVxKG1zZ1snbWVzc2FnZS1pZCddLCAnc3BhbScpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAiSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHlcbiIpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2NvbnRpbnVhdGlvbl9sYXN0X2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgTGlrZSB0aGUgcHJldmlvdXMgdGVzdCwgYnV0IHRoZSBzdWJqZWN0IGxpbmUgaXMgdGhlIGxhc3QKKyAgICAgICAgIyBoZWFkZXIuCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoIiIiXAorRnJvbTogYXBlcnNvbkBkb20uYWluCitUbzogYnBlcnNvbkBkb20uYWluCitEYXRlOiBNb24sIDggQXByIDIwMDIgMTU6MDk6MTkgLTA0MDAKK01lc3NhZ2UtSUQ6IHNwYW0KK1N1YmplY3Q6IHRoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXQKK1x4MjAKKworSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHkKKyIiIikKKyAgICAgICAgZXEobXNnWydzdWJqZWN0J10sICd0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0XG4gJykKKyAgICAgICAgZXEobXNnWydtZXNzYWdlLWlkJ10sICdzcGFtJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICJIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keVxuIikKKworICAgIGRlZiB0ZXN0X2NybGZfc2VwYXJhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yNi50eHQnLCBtb2RlPSdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IFBhcnNlcigpLnBhcnNlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBwYXJ0MSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEocGFydDEuZ2V0X3BheWxvYWQoKSwgJ1NpbXBsZSBlbWFpbCB3aXRoIGF0dGFjaG1lbnQuXHJcblxyXG4nKQorICAgICAgICBwYXJ0MiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdhcHBsaWNhdGlvbi9yaXNjb3MnKQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X2RpZ2VzdF93aXRoX2V4dHJhX21pbWVfaGVhZGVycyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjgudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICMgU3RydWN0dXJlIGlzOgorICAgICAgICAjIG11bHRpcGFydC9kaWdlc3QKKyAgICAgICAgIyAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgIHRleHQvcGxhaW4KKyAgICAgICAgIyAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgIHRleHQvcGxhaW4KKyAgICAgICAgZXEobXNnLmlzX211bHRpcGFydCgpLCAxKQorICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQorICAgICAgICBwYXJ0MSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHBhcnQxLmlzX211bHRpcGFydCgpLCAxKQorICAgICAgICBlcShsZW4ocGFydDEuZ2V0X3BheWxvYWQoKSksIDEpCisgICAgICAgIHBhcnQxYSA9IHBhcnQxLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQxYS5pc19tdWx0aXBhcnQoKSwgMCkKKyAgICAgICAgZXEocGFydDFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBuZXEocGFydDFhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDFcbicpCisgICAgICAgICMgbmV4dCBtZXNzYWdlL3JmYzgyMgorICAgICAgICBwYXJ0MiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHBhcnQyLmlzX211bHRpcGFydCgpLCAxKQorICAgICAgICBlcShsZW4ocGFydDIuZ2V0X3BheWxvYWQoKSksIDEpCisgICAgICAgIHBhcnQyYSA9IHBhcnQyLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKHBhcnQyYS5pc19tdWx0aXBhcnQoKSwgMCkKKyAgICAgICAgZXEocGFydDJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBuZXEocGFydDJhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDJcbicpCisKKyAgICBkZWYgdGVzdF90aHJlZV9saW5lcyhzZWxmKToKKyAgICAgICAgIyBBIGJ1ZyByZXBvcnQgYnkgQW5kcmV3IE1jTmFtYXJhCisgICAgICAgIGxpbmVzID0gWydGcm9tOiBBbmRyZXcgUGVyc29uIDxhcGVyc29uQGRvbS5haW4nLAorICAgICAgICAgICAgICAgICAnU3ViamVjdDogVGVzdCcsCisgICAgICAgICAgICAgICAgICdEYXRlOiBUdWUsIDIwIEF1ZyAyMDAyIDE2OjQzOjQ1ICsxMDAwJ10KKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhOTC5qb2luKGxpbmVzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ2RhdGUnXSwgJ1R1ZSwgMjAgQXVnIDIwMDIgMTY6NDM6NDUgKzEwMDAnKQorCisgICAgZGVmIHRlc3Rfc3RyaXBfbGluZV9mZWVkX2FuZF9jYXJyaWFnZV9yZXR1cm5faW5faGVhZGVycyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgRm9yIFsgMTAwMjQ3NSBdIGVtYWlsIG1lc3NhZ2UgcGFyc2VyIGRvZXNuJ3QgaGFuZGxlIFxyXG4gY29ycmVjdGx5CisgICAgICAgIHZhbHVlMSA9ICd0ZXh0JworICAgICAgICB2YWx1ZTIgPSAnbW9yZSB0ZXh0JworICAgICAgICBtID0gJ0hlYWRlcjogJXNcclxuTmV4dC1IZWFkZXI6ICVzXHJcblxyXG5Cb2R5XHJcblxyXG4nICUgKAorICAgICAgICAgICAgdmFsdWUxLCB2YWx1ZTIpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmdldCgnSGVhZGVyJyksIHZhbHVlMSkKKyAgICAgICAgZXEobXNnLmdldCgnTmV4dC1IZWFkZXInKSwgdmFsdWUyKQorCisgICAgZGVmIHRlc3RfcmZjMjgyMl9oZWFkZXJfc3ludGF4KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICc+RnJvbTogZm9vXG5Gcm9tOiBiYXJcbiEiI1FVWDt+OiB6b29cblxuYm9keScKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShsZW4obXNnLmtleXMoKSksIDMpCisgICAgICAgIGtleXMgPSBtc2cua2V5cygpCisgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIGVxKGtleXMsIFsnISIjUVVYO34nLCAnPkZyb20nLCAnRnJvbSddKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2JvZHknKQorCisgICAgZGVmIHRlc3RfcmZjMjgyMl9zcGFjZV9ub3RfYWxsb3dlZF9pbl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJz5Gcm9tIGZvb0BleGFtcGxlLmNvbSAxMToyNTo1M1xuRnJvbTogYmFyXG4hIiNRVVg7fjogem9vXG5cbmJvZHknCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobGVuKG1zZy5rZXlzKCkpLCAwKQorCisgICAgZGVmIHRlc3RfcmZjMjgyMl9vbmVfY2hhcmFjdGVyX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnQTogZmlyc3QgaGVhZGVyXG5COiBzZWNvbmQgaGVhZGVyXG5DQzogdGhpcmQgaGVhZGVyXG5cbmJvZHknCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgaGVhZGVycyA9IG1zZy5rZXlzKCkKKyAgICAgICAgaGVhZGVycy5zb3J0KCkKKyAgICAgICAgZXEoaGVhZGVycywgWydBJywgJ0InLCAnQ0MnXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdib2R5JykKKworCisKK2NsYXNzIFRlc3RCYXNlNjQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NG1pbWUuYmFzZTY0X2xlbignaGVsbG8nKSwKKyAgICAgICAgICAgbGVuKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsbycsIGVvbD0nJykpKQorICAgICAgICBmb3Igc2l6ZSBpbiByYW5nZSgxNSk6CisgICAgICAgICAgICBpZiAgIHNpemUgPT0gMCA6IGJzaXplID0gMAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDMgOiBic2l6ZSA9IDQKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSA2IDogYnNpemUgPSA4CisgICAgICAgICAgICBlbGlmIHNpemUgPD0gOSA6IGJzaXplID0gMTIKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSAxMjogYnNpemUgPSAxNgorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgOiBic2l6ZSA9IDIwCisgICAgICAgICAgICBlcShiYXNlNjRtaW1lLmJhc2U2NF9sZW4oJ3gnKnNpemUpLCBic2l6ZSkKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCcnKSwgJycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCdhR1ZzYkc4PScpLCAnaGVsbG8nKQorICAgICAgICBlcShiYXNlNjRtaW1lLmRlY29kZSgnYUdWc2JHOD0nLCAnWCcpLCAnaGVsbG8nKQorICAgICAgICBlcShiYXNlNjRtaW1lLmRlY29kZSgnYUdWc2JHOE5DbmR2Y214a1xuJywgJ1gnKSwgJ2hlbGxvWHdvcmxkJykKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCcnKSwgJycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsbycpLCAnYUdWc2JHOD1cbicpCisgICAgICAgICMgVGVzdCB0aGUgYmluYXJ5IGZsYWcKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvXG4nKSwgJ2FHVnNiRzhLXG4nKQorICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgnaGVsbG9cbicsIDApLCAnYUdWc2JHOE5DZz09XG4nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJnCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2cKK2VIaDRlQ0I0ZUhoNElBPT0KKyIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUE9PVxyCisiIiIpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaGUgPSBiYXNlNjRtaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZXEoaGUoJ2hlbGxvJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcpLCAnPT9pc28tODg1OS0xP2I/YUdWc2JHOE5DbmR2Y214az89JykKKyAgICAgICAgIyBUZXN0IHRoZSBjaGFyc2V0IG9wdGlvbgorICAgICAgICBlcShoZSgnaGVsbG8nLCBjaGFyc2V0PSdpc28tODg1OS0yJyksICc9P2lzby04ODU5LTI/Yj9hR1ZzYkc4PT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBrZWVwX2VvbHMgZmxhZworICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJywga2VlcF9lb2xzPVRydWUpLAorICAgICAgICAgICAnPT9pc28tODg1OS0xP2I/YUdWc2JHOEtkMjl5YkdRPT89JykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKKz0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9JSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIZz0/PQorID0/aXNvLTg4NTktMT9iP2VIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZz89IiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCis9P2lzby04ODU5LTE/Yj9lSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP0lIaDRlSGdnZUhoNGVDQjRlSGg0SUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0E9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnPz0iIiIpCisKKworCitjbGFzcyBUZXN0UXVvcHJpKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaGxpdCA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdhJyksIG9yZCgneicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ0EnKSwgb3JkKCdaJykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnMCcpLCBvcmQoJzknKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFsnIScsICcqJywgJysnLCAnLScsICcvJywgJyAnXQorICAgICAgICBzZWxmLmhub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmhsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5obGl0KSArIGxlbihzZWxmLmhub24pID09IDI1NgorICAgICAgICBzZWxmLmJsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnICcpLCBvcmQoJ34nKSsxKV0gKyBbJ1x0J10KKyAgICAgICAgc2VsZi5ibGl0LnJlbW92ZSgnPScpCisgICAgICAgIHNlbGYuYm5vbiA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2UoMjU2KSBpZiBjaHIoeCkgbm90IGluIHNlbGYuYmxpdF0KKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLmJsaXQpICsgbGVuKHNlbGYuYm5vbikgPT0gMjU2CisKKyAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2NoZWNrKHNlbGYpOgorICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obm9uOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfcXVvcHJpX2NoZWNrKHNlbGYpOgorICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmltaW1lLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBocWwgPSBxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuCisgICAgICAgIGVuYyA9IHF1b3ByaW1pbWUuaGVhZGVyX2VuY29kZQorICAgICAgICBmb3IgcyBpbiAoJ2hlbGxvJywgJ2hAZUBsQGxAb0AnKToKKyAgICAgICAgICAgICMgRW1wdHkgY2hhcnNldCBhbmQgbm8gbGluZS1lbmRpbmdzLiAgNyA9PSBSRkMgY2hyb21lCisgICAgICAgICAgICBlcShocWwocyksIGxlbihlbmMocywgY2hhcnNldD0nJywgZW9sPScnKSktNykKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5obGl0OgorICAgICAgICAgICAgZXEoaHFsKGMpLCAxKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246CisgICAgICAgICAgICBlcShocWwoYyksIDMpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9sZW4oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBicWwgPSBxdW9wcmltaW1lLmJvZHlfcXVvcHJpX2xlbgorICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6CisgICAgICAgICAgICBlcShicWwoYyksIDEpCisgICAgICAgIGZvciBjIGluIHNlbGYuYm5vbjoKKyAgICAgICAgICAgIGVxKGJxbChjKSwgMykKKworICAgIGRlZiB0ZXN0X3F1b3RlX3VucXVvdGVfaWRlbXBvdGVudChzZWxmKToKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGMgPSBjaHIoeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVvcHJpbWltZS51bnF1b3RlKHF1b3ByaW1pbWUucXVvdGUoYykpLCBjKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhlID0gcXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGVxKGhlKCdoZWxsbycpLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBEPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCB0aGUgY2hhcnNldCBvcHRpb24KKyAgICAgICAgZXEoaGUoJ2hlbGxvJywgY2hhcnNldD0naXNvLTg4NTktMicpLCAnPT9pc28tODg1OS0yP3E/aGVsbG8/PScpCisgICAgICAgICMgVGVzdCB0aGUga2VlcF9lb2xzIGZsYWcKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcsIGtlZXBfZW9scz1UcnVlKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPTBBd29ybGQ/PScpCisgICAgICAgICMgVGVzdCBhIG5vbi1BU0NJSSBjaGFyYWN0ZXIKKyAgICAgICAgZXEoaGUoJ2hlbGxvXHhjN3RoZXJlJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz1DN3RoZXJlPz0nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorPT9pc28tODg1OS0xP3E/eHh4eF94eHh4X3h4eHhfeHh4eF94eD89CisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89CisgPT9pc28tODg1OS0xP3E/X3h4eHhfeHh4eF94eHh4X3h4eHhfeD89CisgPT9pc28tODg1OS0xP3E/eHh4X3h4eHhfeHh4eF94eHh4X3h4eD89CisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKKz0/aXNvLTg4NTktMT9xP3h4eHhfeHh4eF94eHh4X3h4eHhfeHg/PVxyCisgPT9pc28tODg1OS0xP3E/eHhfeHh4eF94eHh4X3h4eHhfeHh4eD89XHIKKyA9P2lzby04ODU5LTE/cT9feHh4eF94eHh4X3h4eHhfeHh4eF94Pz1ccgorID0/aXNvLTg4NTktMT9xP3h4eF94eHh4X3h4eHhfeHh4eF94eHg/PVxyCisgPT9pc28tODg1OS0xP3E/eF94eHh4X3h4eHhfPz0iIiIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5kZWNvZGUoJ2hlbGxvJywgJ1gnKSwgJ2hlbGxvJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5kZWNvZGUoJ2hlbGxvXG53b3JsZCcsICdYJyksICdoZWxsb1h3b3JsZCcpCisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgnJyksICcnKQorICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgZmxhZworICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgnaGVsbG9cclxud29ybGQnKSwgJ2hlbGxvXG53b3JsZCcpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsb1xyXG53b3JsZCcsIDApLCAnaGVsbG9cbndvcmxkJykKKyAgICAgICAgIyBUZXN0IHRoZSBtYXhsaW5lbGVuIGFyZworICAgICAgICBlcShxdW9wcmltaW1lLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCit4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHg9CisgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHg9Cit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKK3h4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eD1ccgorIHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4PVxyCit4IHh4eHggeHh4eCB4eHh4IHh4eHg9MjAiIiIpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCIiIlwKK29uZSBsaW5lCisKK3R3byBsaW5lIiIiKSwgIiIiXAorb25lIGxpbmUKKwordHdvIGxpbmUiIiIpCisKKworCisjIFRlc3QgdGhlIENoYXJzZXQgY2xhc3MKK2NsYXNzIFRlc3RDaGFyc2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZyb20gZW1haWwgaW1wb3J0IGNoYXJzZXQgYXMgQ2hhcnNldE1vZHVsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgQ2hhcnNldE1vZHVsZS5DSEFSU0VUU1snZmFrZSddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIE1ha2Ugc3VyZSB1cy1hc2NpaSA9IG5vIFVuaWNvZGUgY29udmVyc2lvbgorICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBzID0gJ0hlbGxvIFdvcmxkIScKKyAgICAgICAgc3AgPSBjLnRvX3NwbGl0dGFibGUocykKKyAgICAgICAgZXEocywgYy5mcm9tX3NwbGl0dGFibGUoc3ApKQorICAgICAgICAjIHRlc3QgOC1iaXQgaWRlbXBvdGVuY3kgd2l0aCB1cy1hc2NpaQorICAgICAgICBzID0gJ1x4YTRceGEyXHhhNFx4YTRceGE0XHhhNlx4YTRceGE4XHhhNFx4YWEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggUVAgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIGVxKCdoZWxsbyB3PUY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggQmFzZTY0IGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ3V0Zi04JykKKyAgICAgICAgZXEoJ2FHVnNiRzhnZDI5eWJHUT1cbicsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdvcmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIE5vbmUgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcSgnaGVsbG8gd29ybGQnLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSB0aGUgY29udmVydCBhcmd1bWVudCwgd2hlcmUgaW5wdXQgY29kZWMgIT0gb3V0cHV0IGNvZGVjCisgICAgICAgIGMgPSBDaGFyc2V0KCdldWMtanAnKQorICAgICAgICAjIFdpdGggYXBvbG9naWVzIHRvIFRva2lvIEtpa3VjaGkgOykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXEoJ1x4MWIkQjVGQ087fklXXHgxYihCJywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JykpCisgICAgICAgICAgICBlcSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLAorICAgICAgICAgICAgICAgYy5ib2R5X2VuY29kZSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLCBGYWxzZSkpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICMgV2UgcHJvYmFibHkgZG9uJ3QgaGF2ZSB0aGUgSmFwYW5lc2UgY29kZWNzIGluc3RhbGxlZAorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRlc3RpbmcgU0YgYnVnICM2MjU1MDksIHdoaWNoIHdlIGhhdmUgdG8gZmFrZSwgc2luY2UgdGhlcmUgYXJlIG5vCisgICAgICAgICMgYnVpbHQtaW4gZW5jb2RpbmdzIHdoZXJlIHRoZSBoZWFkZXIgZW5jb2RpbmcgaXMgUVAgYnV0IHRoZSBib2R5CisgICAgICAgICMgZW5jb2RpbmcgaXMgbm90LgorICAgICAgICBmcm9tIGVtYWlsIGltcG9ydCBjaGFyc2V0IGFzIENoYXJzZXRNb2R1bGUKKyAgICAgICAgQ2hhcnNldE1vZHVsZS5hZGRfY2hhcnNldCgnZmFrZScsIENoYXJzZXRNb2R1bGUuUVAsIE5vbmUpCisgICAgICAgIGMgPSBDaGFyc2V0KCdmYWtlJykKKyAgICAgICAgZXEoJ2hlbGxvIHdceGY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfY2hhcnNldF9uYW1lKHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCh1J3VzLWFzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY2hhcnNldCksICd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5DaGFyc2V0RXJyb3IsIENoYXJzZXQsICdhc2NceGZmaWknKQorCisKKworIyBUZXN0IG11bHRpbGluZ3VhbCBNSU1FIGhlYWRlcnMuCitjbGFzcyBUZXN0SGVhZGVyKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcignSGVsbG8gV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGguYXBwZW5kKCcgR29vZGJ5ZSBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhICBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfc3VycHJpc2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEnKQorICAgICAgICBoLmFwcGVuZCgnR29vZGJ5ZSBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhIEdvb2RieWUgV29ybGQhJykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9uZWVkc19ub19kZWNvZGluZyhzZWxmKToKKyAgICAgICAgaCA9ICdubyBkZWNvZGluZyBuZWVkZWQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlX2hlYWRlcihoKSwgWyhoLCBOb25lKV0pCisKKyAgICBkZWYgdGVzdF9sb25nKHNlbGYpOgorICAgICAgICBoID0gSGVhZGVyKCJJIGFtIHRoZSB2ZXJ5IG1vZGVsIG9mIGEgbW9kZXJuIE1ham9yLUdlbmVyYWw7IEkndmUgaW5mb3JtYXRpb24gdmVnZXRhYmxlLCBhbmltYWwsIGFuZCBtaW5lcmFsOyBJIGtub3cgdGhlIGtpbmdzIG9mIEVuZ2xhbmQsIGFuZCBJIHF1b3RlIHRoZSBmaWdodHMgaGlzdG9yaWNhbCBmcm9tIE1hcmF0aG9uIHRvIFdhdGVybG9vLCBpbiBvcmRlciBjYXRlZ29yaWNhbDsgSSdtIHZlcnkgd2VsbCBhY3F1YWludGVkLCB0b28sIHdpdGggbWF0dGVycyBtYXRoZW1hdGljYWw7IEkgdW5kZXJzdGFuZCBlcXVhdGlvbnMsIGJvdGggdGhlIHNpbXBsZSBhbmQgcXVhZHJhdGljYWw7IGFib3V0IGJpbm9taWFsIHRoZW9yZW0gSSdtIHRlZW1pbmcgd2l0aCBhIGxvdCBvJyBuZXdzLCB3aXRoIG1hbnkgY2hlZXJmdWwgZmFjdHMgYWJvdXQgdGhlIHNxdWFyZSBvZiB0aGUgaHlwb3RlbnVzZS4iLAorICAgICAgICAgICAgICAgICAgIG1heGxpbmVsZW49NzYpCisgICAgICAgIGZvciBsIGluIGguZW5jb2RlKHNwbGl0Y2hhcnM9JyAnKS5zcGxpdCgnXG4gJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGwpIDw9IDc2KQorCisgICAgZGVmIHRlc3RfbXVsdGlsaW5ndWFsKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGN6ID0gQ2hhcnNldCgiaXNvLTg4NTktMiIpCisgICAgICAgIHV0ZjggPSBDaGFyc2V0KCJ1dGYtOCIpCisgICAgICAgIGdfaGVhZCA9ICJEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kIGtvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhmY2RsXHhmY25kaXNjaGVuIFdhbmRnZW1ceGU0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuIGJlZlx4ZjZyZGVydC4gIgorICAgICAgICBjel9oZWFkID0gIkZpbmFuXHhlOG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgdGxha2VtIGplamljaCBkXHhmOXZ0aXB1Li4gIgorICAgICAgICB1dGY4X2hlYWQgPSB1Ilx1NmI2M1x1NzhiYVx1MzA2Ylx1OGEwMFx1MzA0Nlx1MzA2OFx1N2ZmYlx1OGEzM1x1MzA2Zlx1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMFx1OTBlOFx1MzA2Zlx1MzBjOVx1MzBhNFx1MzBjNFx1OGE5ZVx1MzA2N1x1MzA1OVx1MzA0Y1x1MzAwMVx1MzA0Mlx1MzA2OFx1MzA2Zlx1MzA2N1x1MzA1Zlx1MzA4OVx1MzA4MVx1MzA2N1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgdW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0IGdlcnNwdXQuXHUzMDBkXHUzMDY4XHU4YTAwXHUzMDYzXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDU5XHUzMDAyIi5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgaCA9IEhlYWRlcihnX2hlYWQsIGcpCisgICAgICAgIGguYXBwZW5kKGN6X2hlYWQsIGN6KQorICAgICAgICBoLmFwcGVuZCh1dGY4X2hlYWQsIHV0ZjgpCisgICAgICAgIGVuYyA9IGguZW5jb2RlKCkKKyAgICAgICAgZXEoZW5jLCAiIiJcCis9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkZXJiYW5kX2tvPz0KKyA9P2lzby04ODU5LTE/cT9tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpc2NoZW5fV2FuPz0KKyA9P2lzby04ODU5LTE/cT9kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nZW5fYmVmPUY2Pz0KKyA9P2lzby04ODU5LTE/cT9yZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldHJvcG9sZV9zZV9ocm91dGlseT89CisgPT9pc28tODg1OS0yP3E/X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PSA9P3V0Zi04P2I/NXEyajU2SzY/PQorID0/dXRmLTg/Yj80NEdyNktpQTQ0R0c0NEdvNTcrNzZLaXo0NEd2NDRHVjQ0S000NEdtNDRHRTQ0Rys0NEdiNDRLVDQ0Q0M/PQorID0/dXRmLTg/Yj81TGlBNllPbzQ0R3Y0NE9KNDRLazQ0T0U2S3FlNDRHbjQ0R1o0NEdNNDRDQjQ0R0M0NEdvNDRHdjQ0R24/PQorID0/dXRmLTg/Yj80NEdmNDRLSjQ0S0I0NEduNDRHWjQ0Q0M1YTZmNlpxYjQ0R3I0NEd2NDRDTVYyVnViaUJwYzNRZ1pHRno/PQorID0/dXRmLTg/cT9fTnVuc3R1Y2tfZ2l0X3VuZF9TbG90ZXJtZXllcj0zRl9KYSFfQmVpaGVyaHVuZF9kYXNfT2Rlcl9kaWVfRmw/PQorID0/dXRmLTg/Yj9hWEJ3WlhKM1lXeGtkQ0JuWlhKemNIVjBMdU9BamVPQnFPaW9nT09CbytPQnB1T0JoT09CdnVPQm1RPT0/PQorID0/dXRmLTg/Yj80NENDPz0iIiIpCisgICAgICAgIGVxKGRlY29kZV9oZWFkZXIoZW5jKSwKKyAgICAgICAgICAgWyhnX2hlYWQsICJpc28tODg1OS0xIiksIChjel9oZWFkLCAiaXNvLTg4NTktMiIpLAorICAgICAgICAgICAgKHV0ZjhfaGVhZCwgInV0Zi04IildKQorICAgICAgICB1c3RyID0gdW5pY29kZShoKQorICAgICAgICBlcSh1c3RyLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgJ0RpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQgJworICAgICAgICAgICAna29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGMzXHhiY2RsXHhjM1x4YmNuZGlzY2hlbiAnCisgICAgICAgICAgICdXYW5kZ2VtXHhjM1x4YTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gJworICAgICAgICAgICAnYmVmXHhjM1x4YjZyZGVydC4gRmluYW5ceGM0XHg4ZG5pIG1ldHJvcG9sZSBzZSBocm91dGlseSBwb2QgJworICAgICAgICAgICAndGxha2VtIGplamljaCBkXHhjNVx4YWZ2dGlwdS4uIFx4ZTZceGFkXHhhM1x4ZTdceGEyXHhiYVx4ZTNceDgxJworICAgICAgICAgICAnXHhhYlx4ZThceGE4XHg4MFx4ZTNceDgxXHg4Nlx4ZTNceDgxXHhhOFx4ZTdceGJmXHhiYlx4ZThceGE4XHhiMycKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhZlx4ZTNceDgxXHg5NVx4ZTNceDgyXHg4Y1x4ZTNceDgxXHhhNlx4ZTNceDgxXHg4NFx4ZTMnCisgICAgICAgICAgICdceDgxXHhiZVx4ZTNceDgxXHg5Ylx4ZTNceDgyXHg5M1x4ZTNceDgwXHg4Mlx4ZTRceGI4XHg4MFx4ZTlceDgzJworICAgICAgICAgICAnXHhhOFx4ZTNceDgxXHhhZlx4ZTNceDgzXHg4OVx4ZTNceDgyXHhhNFx4ZTNceDgzXHg4NFx4ZThceGFhXHg5ZScKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgxXHg4Y1x4ZTNceDgwXHg4MVx4ZTNceDgxXHg4Mlx4ZTMnCisgICAgICAgICAgICdceDgxXHhhOFx4ZTNceDgxXHhhZlx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5Zlx4ZTNceDgyXHg4OVx4ZTNceDgyJworICAgICAgICAgICAnXHg4MVx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgwXHg4Mlx4ZTVceGFlXHg5Zlx4ZTlceDlhXHg5YicKKyAgICAgICAgICAgJ1x4ZTNceDgxXHhhYlx4ZTNceDgxXHhhZlx4ZTNceDgwXHg4Y1dlbm4gaXN0IGRhcyBOdW5zdHVjayBnaXQgJworICAgICAgICAgICAndW5kIFNsb3Rlcm1leWVyPyBKYSEgQmVpaGVyaHVuZCBkYXMgT2RlciBkaWUgRmxpcHBlcndhbGR0ICcKKyAgICAgICAgICAgJ2dlcnNwdXQuXHhlM1x4ODBceDhkXHhlM1x4ODFceGE4XHhlOFx4YThceDgwXHhlM1x4ODFceGEzXHhlM1x4ODEnCisgICAgICAgICAgICdceGE2XHhlM1x4ODFceDg0XHhlM1x4ODFceGJlXHhlM1x4ODFceDk5XHhlM1x4ODBceDgyJykKKyAgICAgICAgIyBUZXN0IG1ha2VfaGVhZGVyKCkKKyAgICAgICAgbmV3aCA9IG1ha2VfaGVhZGVyKGRlY29kZV9oZWFkZXIoZW5jKSkKKyAgICAgICAgZXEobmV3aCwgZW5jKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2N0b3JfZGVmYXVsdF9hcmdzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgZXEoaCwgJycpCisgICAgICAgIGguYXBwZW5kKCdmb28nLCBDaGFyc2V0KCdpc28tODg1OS0xJykpCisgICAgICAgIGVxKGgsICc9P2lzby04ODU5LTE/cT9mb28/PScpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9tYXhsaW5lbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gJ0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUgNzZ0aCBjaGFyYWN0ZXIgYm91bmRhcnkgdG8gdGVzdCB0aGUgbm9uLWRlZmF1bHQgYmVoYXZpb3InCisgICAgICAgIGggPSBIZWFkZXIoaHN0cikKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAorQSB2ZXJ5IGxvbmcgbGluZSB0aGF0IG11c3QgZ2V0IHNwbGl0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGF0IHRoZSA3NnRoCisgY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJycnKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJycnXAorQSB2ZXJ5IGxvbmcgbGluZSB0aGF0IG11c3QgZ2V0IHNwbGl0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIGF0IHRoZQorIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJycnKQorICAgICAgICBoID0gSGVhZGVyKGhzdHIsIG1heGxpbmVsZW49MTAyNCwgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBlcShoLmVuY29kZSgpLCBoc3RyKQorCisgICAgZGVmIHRlc3RfdXNfYXNjaWlfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdoZWxsbycKKyAgICAgICAgeCA9IGRlY29kZV9oZWFkZXIocykKKyAgICAgICAgZXEoeCwgWygnaGVsbG8nLCBOb25lKV0pCisgICAgICAgIGggPSBtYWtlX2hlYWRlcih4KQorICAgICAgICBlcShzLCBoLmVuY29kZSgpKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgaC5hcHBlbmQoJ2hlbGxvJywgJ2lzby04ODU5LTEnKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PScpCisKKyMjICAgIGRlZiB0ZXN0X3VuaWNvZGVfZXJyb3Ioc2VsZik6CisjIyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsIHUnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgJ1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICBoID0gSGVhZGVyKCkKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBoLmFwcGVuZCwgdSdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsICdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB1J1x1ODNjYVx1NTczMFx1NjY0Mlx1NTkyYicsICdpc28tODg1OS0xJykKKworICAgIGRlZiB0ZXN0X3V0Zjhfc2hvcnRlc3Qoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKHUncFx4ZjZzdGFsJywgJ3V0Zi04JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJz0/dXRmLTg/cT9wPUMzPUI2c3RhbD89JykKKyAgICAgICAgaCA9IEhlYWRlcih1J1x1ODNjYVx1NTczMFx1NjY0Mlx1NTkyYicsICd1dGYtOCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICc9P3V0Zi04P2I/NkkrSzVaeXc1cG1DNWFTcj89JykKKworICAgIGRlZiB0ZXN0X2JhZF84Yml0X2hlYWRlcihzZWxmKToKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHggPSAnWW53cDRkVUViYXkgQXVjdGlvbiBTZW1pYXItIE5vIENoYXJnZSBceDk2IEVhcm4gQmlnJworICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsIHgpCisgICAgICAgIGggPSBIZWFkZXIoKQorICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBoLmFwcGVuZCwgeCkKKyAgICAgICAgZXEoc3RyKEhlYWRlcih4LCBlcnJvcnM9J3JlcGxhY2UnKSksIHgpCisgICAgICAgIGguYXBwZW5kKHgsIGVycm9ycz0ncmVwbGFjZScpCisgICAgICAgIGVxKHN0cihoKSwgeCkKKworICAgIGRlZiB0ZXN0X2VuY29kZWRfYWRqYWNlbnRfbm9uZW5jb2RlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoKQorICAgICAgICBoLmFwcGVuZCgnaGVsbG8nLCAnaXNvLTg4NTktMScpCisgICAgICAgIGguYXBwZW5kKCd3b3JsZCcpCisgICAgICAgIHMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKHMsICc9P2lzby04ODU5LTE/cT9oZWxsbz89IHdvcmxkJykKKyAgICAgICAgaCA9IG1ha2VfaGVhZGVyKGRlY29kZV9oZWFkZXIocykpCisgICAgICAgIGVxKGguZW5jb2RlKCksIHMpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2VhdGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9ICdTdWJqZWN0OiA9P2tvaTgtcj9iPzhOTFAxOFhTeThFZ3pzRWd4c25Pd2N6WXp0az0/PSA9P2tvaTgtcj9xPz1DQT89IHp6LicKKyAgICAgICAgcGFydHMgPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKHBhcnRzLCBbKCdTdWJqZWN0OicsIE5vbmUpLCAoJ1x4ZjBceGQyXHhjZlx4ZDdceGM1XHhkMlx4Y2JceGMxIFx4Y2VceGMxIFx4YzZceGM5XHhjZVx4YzFceGNjXHhkOFx4Y2VceGQ5XHhjYScsICdrb2k4LXInKSwgKCd6ei4nLCBOb25lKV0pCisgICAgICAgIGhkciA9IG1ha2VfaGVhZGVyKHBhcnRzKQorICAgICAgICBlcShoZHIuZW5jb2RlKCksCisgICAgICAgICAgICdTdWJqZWN0OiA9P2tvaTgtcj9iPzhOTFAxOFhTeThFZ3pzRWd4c25Pd2N6WXp0bks/PSB6ei4nKQorCisgICAgZGVmIHRlc3RfYnJva2VuX2Jhc2U2NF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIHMgPSAnU3ViamVjdDogPT9FVUMtS1I/Qj9DU2l4cExEdEtTQy83TGl1dnNheDRpQzZ1TG13TWNpaklLSGFJTHpTd2QvSDBTQzgrTENqd0xzZ3Y3Vy8rTWozSSA/PScKKyAgICAgICAgcmFpc2VzKGVycm9ycy5IZWFkZXJQYXJzZUVycm9yLCBkZWNvZGVfaGVhZGVyLCBzKQorCisKKworIyBUZXN0IFJGQyAyMjMxIGhlYWRlciBwYXJhbWV0ZXJzIChlbi9kZSljb2RpbmcKK2NsYXNzIFRlc3RSRkMyMjMxKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X2dldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI5LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ3RpdGxlJyksCisgICAgICAgICAgICgndXMtYXNjaWknLCAnZW4nLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICciVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEiJykpCisKKyAgICBkZWYgdGVzdF9zZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICcnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnKSkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgndGl0bGUnLCAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzblwndCBpdCEnLAorICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQ9J3VzLWFzY2lpJywgbGFuZ3VhZ2U9J2VuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorIGlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11cy1hc2NpaTsKKyB0aXRsZSo9InVzLWFzY2lpJ2VuJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXNuJTI3dCUyMGl0JTIxIgorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdmb28nLCAnYmFyJywgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZvbycsIGhlYWRlcj0nQ29udGVudC1UeXBlJykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorIGlkIDI3Q0VBRDM4Q0M7IEZyaSwgIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAgKEVEVCkKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitNZXNzYWdlLUlEOiA8MTUwOTAuNjEzMDQuMTEwOTI5LjQ1Njg0QGFhYS56enoub3JnPgorRnJvbTogYmJiQGRkZC5jb20gKEpvaG4gWC4gRG9lKQorVG86IGJiYkB6enoub3JnCitTdWJqZWN0OiBUaGlzIGlzIGEgdGVzdCBtZXNzYWdlCitEYXRlOiBGcmksIDQgTWF5IDIwMDEgMTQ6MDU6NDQgLTA0MDAKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiOworIHRpdGxlKj0idXMtYXNjaWknZW4nVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpc24lMjd0JTIwaXQlMjEiCisKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2dldF9jb250ZW50X2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMi50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCAndXMtYXNjaWknKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0iCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgTkFNRSowPWZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNOyBOQU1FKjE9UF9uc21haWwuaHRtCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnTkFNRScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcGFyYW0sCisgICAgICAgICAgICAnZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU1QX25zbWFpbC5odG0nKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lX2VuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3BhcnRseV9ub25lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAlMkElMkElMkFmdW4lMkElMkElMkElMjBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOworXHRib3VuZGFyeSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGJvdW5kYXJ5KjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRib3VuZGFyeSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfYm91bmRhcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIG5vbnNlbnNpY2FsIGNoYXJzZXQgdmFsdWUsIGJ1dCB0ZXN0cyB0aGUgY29kZSBhbnl3YXkKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKK1x0Y2hhcnNldCowKj0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRjaGFyc2V0KjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRjaGFyc2V0KjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJib2d1cyd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9Ym9ndXMnJ3V0Zi04JUUyJTgwJTlECisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgICMgVGhpcyBzaG91bGQgcmV0dXJuIE5vbmUgYmVjYXVzZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB0aGUgY2hhcnNldAorICAgICAgICAjIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfY2hhcmFjdGVyX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWFzY2lpJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9ImFzY2lpJ3h4J1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjIqPSJpcyBpdCBub3QucGRmJUUyIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmXHVmZmZkJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqPVgtVU5LTk9XTicnbXlmaWxlLnR4dAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ215ZmlsZS50eHQnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9zaW5nbGVfdGlja19pbl9maWxlbmFtZV9leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwiRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgTm9uZSkKKyAgICAgICAgZXEobGFuZ3VhZ2UsIE5vbmUpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lKjA9XCJGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3RpY2tfYXR0YWNrX2V4dGVuZGVkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMCo9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMSo9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFjayhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMD1cInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3NcIjsgbmFtZSoxPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJ1cy1hc2NpaSdlbi11cydGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fZXh0ZW5kZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287IG5hbWU9XCJGcmFuaydzIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnbmFtZScpLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2VuY29kZWRfdGhlbl91bmVuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowKj1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMT1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV91bmVuY29kZWRfdGhlbl9lbmNvZGVkX3NlZ21lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMD1cInVzLWFzY2lpJ2VuLXVzJ015XCI7CitcdG5hbWUqMSo9XCIgRG9jdW1lbnRcIjsKK1x0bmFtZSoyKj1cIiBGb3IgWW91XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICdNeSBEb2N1bWVudCBGb3IgWW91JykKKworCisKK2RlZiBfdGVzdGNsYXNzZXMoKToKKyAgICBtb2QgPSBzeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICByZXR1cm4gW2dldGF0dHIobW9kLCBuYW1lKSBmb3IgbmFtZSBpbiBkaXIobW9kKSBpZiBuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QnKV0KKworCitkZWYgc3VpdGUoKToKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgZm9yIHRlc3RjbGFzcyBpbiBfdGVzdGNsYXNzZXMoKToKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUodGVzdGNsYXNzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZm9yIHRlc3RjbGFzcyBpbiBfdGVzdGNsYXNzZXMoKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KHRlc3RjbGFzcykKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weWMgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWMxNTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weW8gYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE2ZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfdG9ydHVyZS5weSBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3RvcnR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmYTYwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3RvcnR1cmUucHkKQEAgLTAsMCArMSwxMzYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMKKyMgQSB0b3J0dXJlIHRlc3Qgb2YgdGhlIGVtYWlsIHBhY2thZ2UuICBUaGlzIHNob3VsZCBub3QgYmUgcnVuIGFzIHBhcnQgb2YgdGhlCisjIHN0YW5kYXJkIFB5dGhvbiB0ZXN0IHN1aXRlIHNpbmNlIGl0IHJlcXVpcmVzIHNldmVyYWwgbWVnIG9mIGVtYWlsIG1lc3NhZ2VzCisjIGNvbGxlY3RlZCBpbiB0aGUgd2lsZC4gIFRoZXNlIHNvdXJjZSBtZXNzYWdlcyBhcmUgbm90IGNoZWNrZWQgaW50byB0aGUKKyMgUHl0aG9uIGRpc3RybywgYnV0IGFyZSBhdmFpbGFibGUgYXMgcGFydCBvZiB0aGUgc3RhbmRhbG9uZSBlbWFpbCBwYWNrYWdlIGF0CisjIGh0dHA6Ly9zZi5uZXQvcHJvamVjdHMvbWltZWxpYgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHR5cGVzIGltcG9ydCBMaXN0VHlwZQorCitmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbCBpbXBvcnQgVGVzdEVtYWlsQmFzZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAorCitpbXBvcnQgZW1haWwKK2Zyb20gZW1haWwgaW1wb3J0IF9fZmlsZV9fIGFzIHRlc3RmaWxlCitmcm9tIGVtYWlsLml0ZXJhdG9ycyBpbXBvcnQgX3N0cnVjdHVyZQorCitkZWYgb3BlbmZpbGUoZmlsZW5hbWUpOgorICAgIGZyb20gb3MucGF0aCBpbXBvcnQgam9pbiwgZGlybmFtZSwgYWJzcGF0aAorICAgIHBhdGggPSBhYnNwYXRoKGpvaW4oZGlybmFtZSh0ZXN0ZmlsZSksIG9zLnBhcmRpciwgJ21vcmVkYXRhJywgZmlsZW5hbWUpKQorICAgIHJldHVybiBvcGVuKHBhdGgsICdyJykKKworIyBQcmV2ZW50IHRoaXMgdGVzdCBmcm9tIHJ1bm5pbmcgaW4gdGhlIFB5dGhvbiBkaXN0cm8KK3RyeToKKyAgICBvcGVuZmlsZSgnY3Jpc3Bpbi10b3J0dXJlLnR4dCcpCitleGNlcHQgSU9FcnJvcjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZAorCisKKwwKK2NsYXNzIFRvcnR1cmVCYXNlKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiBfbXNnb2JqKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZShmaWxlbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHJldHVybiBtc2cKKworCisMCitjbGFzcyBUZXN0Q3Jpc3BpblRvcnR1cmUoVG9ydHVyZUJhc2UpOgorICAgICMgTWFyayBDcmlzcGluJ3MgdG9ydHVyZSB0ZXN0IGZyb20gdGhlIFNxdWlycmVsTWFpbCBwcm9qZWN0CisgICAgZGVmIHRlc3RfbW9uZG9fbWVzc2FnZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ2NyaXNwaW4tdG9ydHVyZS50eHQnKQorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgZXEodHlwZShwYXlsb2FkKSwgTGlzdFR5cGUpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMTIpCisgICAgICAgIGVxKG1zZy5wcmVhbWJsZSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmVwaWxvZ3VlLCAnXG4nKQorICAgICAgICAjIFByb2JhYmx5IHRoZSBiZXN0IHdheSB0byB2ZXJpZnkgdGhlIG1lc3NhZ2UgaXMgcGFyc2VkIGNvcnJlY3RseSBpcyB0bworICAgICAgICAjIGR1bXAgaXRzIHN0cnVjdHVyZSBhbmQgY29tcGFyZSBpdCBhZ2FpbnN0IHRoZSBrbm93biBzdHJ1Y3R1cmUuCisgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICBfc3RydWN0dXJlKG1zZywgZnA9ZnApCisgICAgICAgIG5lcShmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvbWl4ZWQKKyAgICB0ZXh0L3BsYWluCisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgICAgICB0ZXh0L3JpY2h0ZXh0CisgICAgICAgICAgICBhcHBsaWNhdGlvbi9hbmRyZXctaW5zZXQKKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBhdWRpby9iYXNpYworICAgIGF1ZGlvL2Jhc2ljCisgICAgaW1hZ2UvcGJtCisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICAgICAgICAgYXVkaW8veC1zdW4KKyAgICAgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgICAgIGltYWdlL2dpZgorICAgICAgICAgICAgICAgIGltYWdlL2dpZgorICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uL3gtYmUyCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb24vYXRvbWljbWFpbAorICAgICAgICAgICAgYXVkaW8veC1zdW4KKyAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgICAgIGltYWdlL3BnbQorICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICAgICAgaW1hZ2UvcGJtCisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgYXBwbGljYXRpb24vcG9zdHNjcmlwdAorICAgIGltYWdlL2dpZgorICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgYXVkaW8vYmFzaWMKKyAgICAgICAgICAgIGF1ZGlvL2Jhc2ljCisgICAgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICAgICBhcHBsaWNhdGlvbi9wb3N0c2NyaXB0CisgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICAgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAgICAgICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICAgICAgICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGFydC9wYXJhbGxlbAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UvZ2lmCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby9iYXNpYworICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi9hdG9taWNtYWlsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpby94LXN1bgorIiIiKQorCisMCitkZWYgX3Rlc3RjbGFzc2VzKCk6CisgICAgbW9kID0gc3lzLm1vZHVsZXNbX19uYW1lX19dCisgICAgcmV0dXJuIFtnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKHRlc3RjbGFzcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHJ1bl91bml0dGVzdCh0ZXN0Y2xhc3MpCisKKworDAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3RvcnR1cmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDVkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3RvcnR1cmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZDVkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF90b3J0dXJlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3V0aWxzLnB5IGIvbGliL3B5dGhvbjIuNy9lbWFpbC91dGlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTc2MDIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbWFpbC91dGlscy5weQpAQCAtMCwwICsxLDMyNCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEJhcnJ5IFdhcnNhdworIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZworCisiIiJNaXNjZWxsYW5lb3VzIHV0aWxpdGllcy4iIiIKKworX19hbGxfXyA9IFsKKyAgICAnY29sbGFwc2VfcmZjMjIzMV92YWx1ZScsCisgICAgJ2RlY29kZV9wYXJhbXMnLAorICAgICdkZWNvZGVfcmZjMjIzMScsCisgICAgJ2VuY29kZV9yZmMyMjMxJywKKyAgICAnZm9ybWF0YWRkcicsCisgICAgJ2Zvcm1hdGRhdGUnLAorICAgICdnZXRhZGRyZXNzZXMnLAorICAgICdtYWtlX21zZ2lkJywKKyAgICAnbWt0aW1lX3R6JywKKyAgICAncGFyc2VhZGRyJywKKyAgICAncGFyc2VkYXRlJywKKyAgICAncGFyc2VkYXRlX3R6JywKKyAgICAndW5xdW90ZScsCisgICAgXQorCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGVtYWlsLl9wYXJzZWFkZHIgaW1wb3J0IHF1b3RlCitmcm9tIGVtYWlsLl9wYXJzZWFkZHIgaW1wb3J0IEFkZHJlc3NMaXN0IGFzIF9BZGRyZXNzTGlzdAorZnJvbSBlbWFpbC5fcGFyc2VhZGRyIGltcG9ydCBta3RpbWVfdHoKKworIyBXZSBuZWVkIHdvcm1hcm91bmRzIGZvciBidWdzIGluIHRoZXNlIG1ldGhvZHMgaW4gb2xkZXIgUHl0aG9ucyAoc2VlIGJlbG93KQorZnJvbSBlbWFpbC5fcGFyc2VhZGRyIGltcG9ydCBwYXJzZWRhdGUgYXMgX3BhcnNlZGF0ZQorZnJvbSBlbWFpbC5fcGFyc2VhZGRyIGltcG9ydCBwYXJzZWRhdGVfdHogYXMgX3BhcnNlZGF0ZV90egorCitmcm9tIHF1b3ByaSBpbXBvcnQgZGVjb2Rlc3RyaW5nIGFzIF9xZGVjb2RlCisKKyMgSW50cmFwYWNrYWdlIGltcG9ydHMKK2Zyb20gZW1haWwuZW5jb2RlcnMgaW1wb3J0IF9iZW5jb2RlLCBfcWVuY29kZQorCitDT01NQVNQQUNFID0gJywgJworRU1QVFlTVFJJTkcgPSAnJworVUVNUFRZU1RSSU5HID0gdScnCitDUkxGID0gJ1xyXG4nCitUSUNLID0gIiciCisKK3NwZWNpYWxzcmUgPSByZS5jb21waWxlKHInW11bXFwoKTw+QCw6OyIuXScpCitlc2NhcGVzcmUgPSByZS5jb21waWxlKHInW11bXFwoKSJdJykKKworCisMCisjIEhlbHBlcnMKKworZGVmIF9pZGVudGl0eShzKToKKyAgICByZXR1cm4gcworCisKK2RlZiBfYmRlY29kZShzKToKKyAgICAiIiJEZWNvZGVzIGEgYmFzZTY0IHN0cmluZy4KKworICAgIFRoaXMgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBiYXNlNjQuZGVjb2Rlc3RyaW5nIGFuZCBpdCdzIHJldGFpbmVkIG9ubHkKKyAgICBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4gSXQgdXNlZCB0byByZW1vdmUgdGhlIGxhc3QgXFxuIG9mIHRoZSBkZWNvZGVkCisgICAgc3RyaW5nLCBpZiBpdCBoYWQgYW55IChzZWUgaXNzdWUgNzE0MykuCisgICAgIiIiCisgICAgaWYgbm90IHM6CisgICAgICAgIHJldHVybiBzCisgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVzdHJpbmcocykKKworCisMCitkZWYgZml4X2VvbHMocyk6CisgICAgIiIiUmVwbGFjZSBhbGwgbGluZS1lbmRpbmcgY2hhcmFjdGVycyB3aXRoIFxcclxcbi4iIiIKKyAgICAjIEZpeCBuZXdsaW5lcyB3aXRoIG5vIHByZWNlZGluZyBjYXJyaWFnZSByZXR1cm4KKyAgICBzID0gcmUuc3ViKHInKD88IVxyKVxuJywgQ1JMRiwgcykKKyAgICAjIEZpeCBjYXJyaWFnZSByZXR1cm5zIHdpdGggbm8gZm9sbG93aW5nIG5ld2xpbmUKKyAgICBzID0gcmUuc3ViKHInXHIoPyFcbiknLCBDUkxGLCBzKQorICAgIHJldHVybiBzCisKKworDAorZGVmIGZvcm1hdGFkZHIocGFpcik6CisgICAgIiIiVGhlIGludmVyc2Ugb2YgcGFyc2VhZGRyKCksIHRoaXMgdGFrZXMgYSAyLXR1cGxlIG9mIHRoZSBmb3JtCisgICAgKHJlYWxuYW1lLCBlbWFpbF9hZGRyZXNzKSBhbmQgcmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlIHN1aXRhYmxlCisgICAgZm9yIGFuIFJGQyAyODIyIEZyb20sIFRvIG9yIENjIGhlYWRlci4KKworICAgIElmIHRoZSBmaXJzdCBlbGVtZW50IG9mIHBhaXIgaXMgZmFsc2UsIHRoZW4gdGhlIHNlY29uZCBlbGVtZW50IGlzCisgICAgcmV0dXJuZWQgdW5tb2RpZmllZC4KKyAgICAiIiIKKyAgICBuYW1lLCBhZGRyZXNzID0gcGFpcgorICAgIGlmIG5hbWU6CisgICAgICAgIHF1b3RlcyA9ICcnCisgICAgICAgIGlmIHNwZWNpYWxzcmUuc2VhcmNoKG5hbWUpOgorICAgICAgICAgICAgcXVvdGVzID0gJyInCisgICAgICAgIG5hbWUgPSBlc2NhcGVzcmUuc3ViKHInXFxcZzwwPicsIG5hbWUpCisgICAgICAgIHJldHVybiAnJXMlcyVzIDwlcz4nICUgKHF1b3RlcywgbmFtZSwgcXVvdGVzLCBhZGRyZXNzKQorICAgIHJldHVybiBhZGRyZXNzCisKKworDAorZGVmIGdldGFkZHJlc3NlcyhmaWVsZHZhbHVlcyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiAoUkVBTE5BTUUsIEVNQUlMKSBmb3IgZWFjaCBmaWVsZHZhbHVlLiIiIgorICAgIGFsbCA9IENPTU1BU1BBQ0Uuam9pbihmaWVsZHZhbHVlcykKKyAgICBhID0gX0FkZHJlc3NMaXN0KGFsbCkKKyAgICByZXR1cm4gYS5hZGRyZXNzbGlzdAorCisKKwwKK2VjcmUgPSByZS5jb21waWxlKHInJycKKyAgPVw/ICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA9PworICAoP1A8Y2hhcnNldD5bXj9dKj8pICAgIyBub24tZ3JlZWR5IHVwIHRvIHRoZSBuZXh0ID8gaXMgdGhlIGNoYXJzZXQKKyAgXD8gICAgICAgICAgICAgICAgICAgICMgbGl0ZXJhbCA/CisgICg/UDxlbmNvZGluZz5bcWJdKSAgICAjIGVpdGhlciBhICJxIiBvciBhICJiIiwgY2FzZSBpbnNlbnNpdGl2ZQorICBcPyAgICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID8KKyAgKD9QPGF0b20+Lio/KSAgICAgICAgICMgbm9uLWdyZWVkeSB1cCB0byB0aGUgbmV4dCA/PSBpcyB0aGUgYXRvbQorICBcPz0gICAgICAgICAgICAgICAgICAgIyBsaXRlcmFsID89CisgICcnJywgcmUuVkVSQk9TRSB8IHJlLklHTk9SRUNBU0UpCisKKworDAorZGVmIGZvcm1hdGRhdGUodGltZXZhbD1Ob25lLCBsb2NhbHRpbWU9RmFsc2UsIHVzZWdtdD1GYWxzZSk6CisgICAgIiIiUmV0dXJucyBhIGRhdGUgc3RyaW5nIGFzIHNwZWNpZmllZCBieSBSRkMgMjgyMiwgZS5nLjoKKworICAgIEZyaSwgMDkgTm92IDIwMDEgMDE6MDg6NDcgLTAwMDAKKworICAgIE9wdGlvbmFsIHRpbWV2YWwgaWYgZ2l2ZW4gaXMgYSBmbG9hdGluZyBwb2ludCB0aW1lIHZhbHVlIGFzIGFjY2VwdGVkIGJ5CisgICAgZ210aW1lKCkgYW5kIGxvY2FsdGltZSgpLCBvdGhlcndpc2UgdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkLgorCisgICAgT3B0aW9uYWwgbG9jYWx0aW1lIGlzIGEgZmxhZyB0aGF0IHdoZW4gVHJ1ZSwgaW50ZXJwcmV0cyB0aW1ldmFsLCBhbmQKKyAgICByZXR1cm5zIGEgZGF0ZSByZWxhdGl2ZSB0byB0aGUgbG9jYWwgdGltZXpvbmUgaW5zdGVhZCBvZiBVVEMsIHByb3Blcmx5CisgICAgdGFraW5nIGRheWxpZ2h0IHNhdmluZ3MgdGltZSBpbnRvIGFjY291bnQuCisKKyAgICBPcHRpb25hbCBhcmd1bWVudCB1c2VnbXQgbWVhbnMgdGhhdCB0aGUgdGltZXpvbmUgaXMgd3JpdHRlbiBvdXQgYXMKKyAgICBhbiBhc2NpaSBzdHJpbmcsIG5vdCBudW1lcmljIG9uZSAoc28gIkdNVCIgaW5zdGVhZCBvZiAiKzAwMDAiKS4gVGhpcworICAgIGlzIG5lZWRlZCBmb3IgSFRUUCwgYW5kIGlzIG9ubHkgdXNlZCB3aGVuIGxvY2FsdGltZT09RmFsc2UuCisgICAgIiIiCisgICAgIyBOb3RlOiB3ZSBjYW5ub3QgdXNlIHN0cmZ0aW1lKCkgYmVjYXVzZSB0aGF0IGhvbm9ycyB0aGUgbG9jYWxlIGFuZCBSRkMKKyAgICAjIDI4MjIgcmVxdWlyZXMgdGhhdCBkYXkgYW5kIG1vbnRoIG5hbWVzIGJlIHRoZSBFbmdsaXNoIGFiYnJldmlhdGlvbnMuCisgICAgaWYgdGltZXZhbCBpcyBOb25lOgorICAgICAgICB0aW1ldmFsID0gdGltZS50aW1lKCkKKyAgICBpZiBsb2NhbHRpbWU6CisgICAgICAgIG5vdyA9IHRpbWUubG9jYWx0aW1lKHRpbWV2YWwpCisgICAgICAgICMgQ2FsY3VsYXRlIHRpbWV6b25lIG9mZnNldCwgYmFzZWQgb24gd2hldGhlciB0aGUgbG9jYWwgem9uZSBoYXMKKyAgICAgICAgIyBkYXlsaWdodCBzYXZpbmdzIHRpbWUsIGFuZCB3aGV0aGVyIERTVCBpcyBpbiBlZmZlY3QuCisgICAgICAgIGlmIHRpbWUuZGF5bGlnaHQgYW5kIG5vd1stMV06CisgICAgICAgICAgICBvZmZzZXQgPSB0aW1lLmFsdHpvbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9mZnNldCA9IHRpbWUudGltZXpvbmUKKyAgICAgICAgaG91cnMsIG1pbnV0ZXMgPSBkaXZtb2QoYWJzKG9mZnNldCksIDM2MDApCisgICAgICAgICMgUmVtZW1iZXIgb2Zmc2V0IGlzIGluIHNlY29uZHMgd2VzdCBvZiBVVEMsIGJ1dCB0aGUgdGltZXpvbmUgaXMgaW4KKyAgICAgICAgIyBtaW51dGVzIGVhc3Qgb2YgVVRDLCBzbyB0aGUgc2lnbnMgZGlmZmVyLgorICAgICAgICBpZiBvZmZzZXQgPiAwOgorICAgICAgICAgICAgc2lnbiA9ICctJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2lnbiA9ICcrJworICAgICAgICB6b25lID0gJyVzJTAyZCUwMmQnICUgKHNpZ24sIGhvdXJzLCBtaW51dGVzIC8vIDYwKQorICAgIGVsc2U6CisgICAgICAgIG5vdyA9IHRpbWUuZ210aW1lKHRpbWV2YWwpCisgICAgICAgICMgVGltZXpvbmUgb2Zmc2V0IGlzIGFsd2F5cyAtMDAwMAorICAgICAgICBpZiB1c2VnbXQ6CisgICAgICAgICAgICB6b25lID0gJ0dNVCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHpvbmUgPSAnLTAwMDAnCisgICAgcmV0dXJuICclcywgJTAyZCAlcyAlMDRkICUwMmQ6JTAyZDolMDJkICVzJyAlICgKKyAgICAgICAgWydNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCcsICdTdW4nXVtub3dbNl1dLAorICAgICAgICBub3dbMl0sCisgICAgICAgIFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLAorICAgICAgICAgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ11bbm93WzFdIC0gMV0sCisgICAgICAgIG5vd1swXSwgbm93WzNdLCBub3dbNF0sIG5vd1s1XSwKKyAgICAgICAgem9uZSkKKworCisMCitkZWYgbWFrZV9tc2dpZChpZHN0cmluZz1Ob25lKToKKyAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBSRkMgMjgyMiBjb21wbGlhbnQgTWVzc2FnZS1JRCwgZS5nOgorCisgICAgPDIwMDIwMjAxMTk1NjI3LjMzNTM5Ljk2NjcxQG5pZ2h0c2hhZGUubGEubWFzdGFsZXIuY29tPgorCisgICAgT3B0aW9uYWwgaWRzdHJpbmcgaWYgZ2l2ZW4gaXMgYSBzdHJpbmcgdXNlZCB0byBzdHJlbmd0aGVuIHRoZQorICAgIHVuaXF1ZW5lc3Mgb2YgdGhlIG1lc3NhZ2UgaWQuCisgICAgIiIiCisgICAgdGltZXZhbCA9IHRpbWUudGltZSgpCisgICAgdXRjZGF0ZSA9IHRpbWUuc3RyZnRpbWUoJyVZJW0lZCVIJU0lUycsIHRpbWUuZ210aW1lKHRpbWV2YWwpKQorICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgcmFuZGludCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwKQorICAgIGlmIGlkc3RyaW5nIGlzIE5vbmU6CisgICAgICAgIGlkc3RyaW5nID0gJycKKyAgICBlbHNlOgorICAgICAgICBpZHN0cmluZyA9ICcuJyArIGlkc3RyaW5nCisgICAgaWRob3N0ID0gc29ja2V0LmdldGZxZG4oKQorICAgIG1zZ2lkID0gJzwlcy4lcy4lcyVzQCVzPicgJSAodXRjZGF0ZSwgcGlkLCByYW5kaW50LCBpZHN0cmluZywgaWRob3N0KQorICAgIHJldHVybiBtc2dpZAorCisKKwwKKyMgVGhlc2UgZnVuY3Rpb25zIGFyZSBpbiB0aGUgc3RhbmRhbG9uZSBtaW1lbGliIHZlcnNpb24gb25seSBiZWNhdXNlIHRoZXkndmUKKyMgc3Vic2VxdWVudGx5IGJlZW4gZml4ZWQgaW4gdGhlIGxhdGVzdCBQeXRob24gdmVyc2lvbnMuICBXZSB1c2UgdGhpcyB0byB3b3JtCisjIGFyb3VuZCBicm9rZW4gb2xkZXIgUHl0aG9ucy4KK2RlZiBwYXJzZWRhdGUoZGF0YSk6CisgICAgaWYgbm90IGRhdGE6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIF9wYXJzZWRhdGUoZGF0YSkKKworCitkZWYgcGFyc2VkYXRlX3R6KGRhdGEpOgorICAgIGlmIG5vdCBkYXRhOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBfcGFyc2VkYXRlX3R6KGRhdGEpCisKKworZGVmIHBhcnNlYWRkcihhZGRyKToKKyAgICBhZGRycyA9IF9BZGRyZXNzTGlzdChhZGRyKS5hZGRyZXNzbGlzdAorICAgIGlmIG5vdCBhZGRyczoKKyAgICAgICAgcmV0dXJuICcnLCAnJworICAgIHJldHVybiBhZGRyc1swXQorCisKKyMgcmZjODIyLnVucXVvdGUoKSBkb2Vzbid0IHByb3Blcmx5IGRlLWJhY2tzbGFzaC1pZnkgaW4gUHl0aG9uIHByZS0yLjMuCitkZWYgdW5xdW90ZShzdHIpOgorICAgICIiIlJlbW92ZSBxdW90ZXMgZnJvbSBhIHN0cmluZy4iIiIKKyAgICBpZiBsZW4oc3RyKSA+IDE6CisgICAgICAgIGlmIHN0ci5zdGFydHN3aXRoKCciJykgYW5kIHN0ci5lbmRzd2l0aCgnIicpOgorICAgICAgICAgICAgcmV0dXJuIHN0clsxOi0xXS5yZXBsYWNlKCdcXFxcJywgJ1xcJykucmVwbGFjZSgnXFwiJywgJyInKQorICAgICAgICBpZiBzdHIuc3RhcnRzd2l0aCgnPCcpIGFuZCBzdHIuZW5kc3dpdGgoJz4nKToKKyAgICAgICAgICAgIHJldHVybiBzdHJbMTotMV0KKyAgICByZXR1cm4gc3RyCisKKworDAorIyBSRkMyMjMxLXJlbGF0ZWQgZnVuY3Rpb25zIC0gcGFyYW1ldGVyIGVuY29kaW5nIGFuZCBkZWNvZGluZworZGVmIGRlY29kZV9yZmMyMjMxKHMpOgorICAgICIiIkRlY29kZSBzdHJpbmcgYWNjb3JkaW5nIHRvIFJGQyAyMjMxIiIiCisgICAgcGFydHMgPSBzLnNwbGl0KFRJQ0ssIDIpCisgICAgaWYgbGVuKHBhcnRzKSA8PSAyOgorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSwgcworICAgIHJldHVybiBwYXJ0cworCisKK2RlZiBlbmNvZGVfcmZjMjIzMShzLCBjaGFyc2V0PU5vbmUsIGxhbmd1YWdlPU5vbmUpOgorICAgICIiIkVuY29kZSBzdHJpbmcgYWNjb3JkaW5nIHRvIFJGQyAyMjMxLgorCisgICAgSWYgbmVpdGhlciBjaGFyc2V0IG5vciBsYW5ndWFnZSBpcyBnaXZlbiwgdGhlbiBzIGlzIHJldHVybmVkIGFzLWlzLiAgSWYKKyAgICBjaGFyc2V0IGlzIGdpdmVuIGJ1dCBub3QgbGFuZ3VhZ2UsIHRoZSBzdHJpbmcgaXMgZW5jb2RlZCB1c2luZyB0aGUgZW1wdHkKKyAgICBzdHJpbmcgZm9yIGxhbmd1YWdlLgorICAgICIiIgorICAgIGltcG9ydCB1cmxsaWIKKyAgICBzID0gdXJsbGliLnF1b3RlKHMsIHNhZmU9JycpCisgICAgaWYgY2hhcnNldCBpcyBOb25lIGFuZCBsYW5ndWFnZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gcworICAgIGlmIGxhbmd1YWdlIGlzIE5vbmU6CisgICAgICAgIGxhbmd1YWdlID0gJycKKyAgICByZXR1cm4gIiVzJyVzJyVzIiAlIChjaGFyc2V0LCBsYW5ndWFnZSwgcykKKworCityZmMyMjMxX2NvbnRpbnVhdGlvbiA9IHJlLmNvbXBpbGUocideKD9QPG5hbWU+XHcrKVwqKCg/UDxudW0+WzAtOV0rKVwqPyk/JCcpCisKK2RlZiBkZWNvZGVfcGFyYW1zKHBhcmFtcyk6CisgICAgIiIiRGVjb2RlIHBhcmFtZXRlcnMgbGlzdCBhY2NvcmRpbmcgdG8gUkZDIDIyMzEuCisKKyAgICBwYXJhbXMgaXMgYSBzZXF1ZW5jZSBvZiAyLXR1cGxlcyBjb250YWluaW5nIChwYXJhbSBuYW1lLCBzdHJpbmcgdmFsdWUpLgorICAgICIiIgorICAgICMgQ29weSBwYXJhbXMgc28gd2UgZG9uJ3QgbWVzcyB3aXRoIHRoZSBvcmlnaW5hbAorICAgIHBhcmFtcyA9IHBhcmFtc1s6XQorICAgIG5ld19wYXJhbXMgPSBbXQorICAgICMgTWFwIHBhcmFtZXRlcidzIG5hbWUgdG8gYSBsaXN0IG9mIGNvbnRpbnVhdGlvbnMuICBUaGUgdmFsdWVzIGFyZSBhCisgICAgIyAzLXR1cGxlIG9mIHRoZSBjb250aW51YXRpb24gbnVtYmVyLCB0aGUgc3RyaW5nIHZhbHVlLCBhbmQgYSBmbGFnCisgICAgIyBzcGVjaWZ5aW5nIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHNlZ21lbnQgaXMgJS1lbmNvZGVkLgorICAgIHJmYzIyMzFfcGFyYW1zID0ge30KKyAgICBuYW1lLCB2YWx1ZSA9IHBhcmFtcy5wb3AoMCkKKyAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgdmFsdWUpKQorICAgIHdoaWxlIHBhcmFtczoKKyAgICAgICAgbmFtZSwgdmFsdWUgPSBwYXJhbXMucG9wKDApCisgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJyonKToKKyAgICAgICAgICAgIGVuY29kZWQgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGVkID0gRmFsc2UKKyAgICAgICAgdmFsdWUgPSB1bnF1b3RlKHZhbHVlKQorICAgICAgICBtbyA9IHJmYzIyMzFfY29udGludWF0aW9uLm1hdGNoKG5hbWUpCisgICAgICAgIGlmIG1vOgorICAgICAgICAgICAgbmFtZSwgbnVtID0gbW8uZ3JvdXAoJ25hbWUnLCAnbnVtJykKKyAgICAgICAgICAgIGlmIG51bSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBudW0gPSBpbnQobnVtKQorICAgICAgICAgICAgcmZjMjIzMV9wYXJhbXMuc2V0ZGVmYXVsdChuYW1lLCBbXSkuYXBwZW5kKChudW0sIHZhbHVlLCBlbmNvZGVkKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld19wYXJhbXMuYXBwZW5kKChuYW1lLCAnIiVzIicgJSBxdW90ZSh2YWx1ZSkpKQorICAgIGlmIHJmYzIyMzFfcGFyYW1zOgorICAgICAgICBmb3IgbmFtZSwgY29udGludWF0aW9ucyBpbiByZmMyMjMxX3BhcmFtcy5pdGVtcygpOgorICAgICAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICAgICAgZXh0ZW5kZWQgPSBGYWxzZQorICAgICAgICAgICAgIyBTb3J0IGJ5IG51bWJlcgorICAgICAgICAgICAgY29udGludWF0aW9ucy5zb3J0KCkKKyAgICAgICAgICAgICMgQW5kIG5vdyBhcHBlbmQgYWxsIHZhbHVlcyBpbiBudW1lcmljYWwgb3JkZXIsIGNvbnZlcnRpbmcKKyAgICAgICAgICAgICMgJS1lbmNvZGluZ3MgZm9yIHRoZSBlbmNvZGVkIHNlZ21lbnRzLiAgSWYgYW55IG9mIHRoZQorICAgICAgICAgICAgIyBjb250aW51YXRpb24gbmFtZXMgZW5kcyBpbiBhICosIHRoZW4gdGhlIGVudGlyZSBzdHJpbmcsIGFmdGVyCisgICAgICAgICAgICAjIGRlY29kaW5nIHNlZ21lbnRzIGFuZCBjb25jYXRlbmF0aW5nLCBtdXN0IGhhdmUgdGhlIGNoYXJzZXQgYW5kCisgICAgICAgICAgICAjIGxhbmd1YWdlIHNwZWNpZmllcnMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLgorICAgICAgICAgICAgZm9yIG51bSwgcywgZW5jb2RlZCBpbiBjb250aW51YXRpb25zOgorICAgICAgICAgICAgICAgIGlmIGVuY29kZWQ6CisgICAgICAgICAgICAgICAgICAgIHMgPSB1cmxsaWIudW5xdW90ZShzKQorICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCA9IFRydWUKKyAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQocykKKyAgICAgICAgICAgIHZhbHVlID0gcXVvdGUoRU1QVFlTVFJJTkcuam9pbih2YWx1ZSkpCisgICAgICAgICAgICBpZiBleHRlbmRlZDoKKyAgICAgICAgICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUgPSBkZWNvZGVfcmZjMjIzMSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgKGNoYXJzZXQsIGxhbmd1YWdlLCAnIiVzIicgJSB2YWx1ZSkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuZXdfcGFyYW1zLmFwcGVuZCgobmFtZSwgJyIlcyInICUgdmFsdWUpKQorICAgIHJldHVybiBuZXdfcGFyYW1zCisKK2RlZiBjb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKHZhbHVlLCBlcnJvcnM9J3JlcGxhY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tfY2hhcnNldD0ndXMtYXNjaWknKToKKyAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CisgICAgICAgIHJhd3ZhbCA9IHVucXVvdGUodmFsdWVbMl0pCisgICAgICAgIGNoYXJzZXQgPSB2YWx1ZVswXSBvciAndXMtYXNjaWknCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKHJhd3ZhbCwgY2hhcnNldCwgZXJyb3JzKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIFhYWCBjaGFyc2V0IGlzIHVua25vd24gdG8gUHl0aG9uLgorICAgICAgICAgICAgcmV0dXJuIHVuaWNvZGUocmF3dmFsLCBmYWxsYmFja19jaGFyc2V0LCBlcnJvcnMpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHVucXVvdGUodmFsdWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3V0aWxzLnB5YyBiL2xpYi9weXRob24yLjcvZW1haWwvdXRpbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTk5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3V0aWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VtYWlsL3V0aWxzLnB5byBiL2xpYi9weXRob24yLjcvZW1haWwvdXRpbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1OTk5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VtYWlsL3V0aWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NWNhODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE1NyBAQAorIiIiIFN0YW5kYXJkICJlbmNvZGluZ3MiIFBhY2thZ2UKKworICAgIFN0YW5kYXJkIFB5dGhvbiBlbmNvZGluZyBtb2R1bGVzIGFyZSBzdG9yZWQgaW4gdGhpcyBwYWNrYWdlCisgICAgZGlyZWN0b3J5LgorCisgICAgQ29kZWMgbW9kdWxlcyBtdXN0IGhhdmUgbmFtZXMgY29ycmVzcG9uZGluZyB0byBub3JtYWxpemVkIGVuY29kaW5nCisgICAgbmFtZXMgYXMgZGVmaW5lZCBpbiB0aGUgbm9ybWFsaXplX2VuY29kaW5nKCkgZnVuY3Rpb24gYmVsb3csIGUuZy4KKyAgICAndXRmLTgnIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIG1vZHVsZSAndXRmXzgucHknLgorCisgICAgRWFjaCBjb2RlYyBtb2R1bGUgbXVzdCBleHBvcnQgdGhlIGZvbGxvd2luZyBpbnRlcmZhY2U6CisKKyAgICAqIGdldHJlZ2VudHJ5KCkgLT4gY29kZWNzLkNvZGVjSW5mbyBvYmplY3QKKyAgICBUaGUgZ2V0cmVnZW50cnkoKSBBUEkgbXVzdCBhIENvZGVjSW5mbyBvYmplY3Qgd2l0aCBlbmNvZGVyLCBkZWNvZGVyLAorICAgIGluY3JlbWVudGFsZW5jb2RlciwgaW5jcmVtZW50YWxkZWNvZGVyLCBzdHJlYW13cml0ZXIgYW5kIHN0cmVhbXJlYWRlcgorICAgIGF0dHRyaWJ1dGVzIHdoaWNoIGFkaGVyZSB0byB0aGUgUHl0aG9uIENvZGVjIEludGVyZmFjZSBTdGFuZGFyZC4KKworICAgIEluIGFkZGl0aW9uLCBhIG1vZHVsZSBtYXkgb3B0aW9uYWxseSBhbHNvIGRlZmluZSB0aGUgZm9sbG93aW5nCisgICAgQVBJcyB3aGljaCBhcmUgdGhlbiB1c2VkIGJ5IHRoZSBwYWNrYWdlJ3MgY29kZWMgc2VhcmNoIGZ1bmN0aW9uOgorCisgICAgKiBnZXRhbGlhc2VzKCkgLT4gc2VxdWVuY2Ugb2YgZW5jb2RpbmcgbmFtZSBzdHJpbmdzIHRvIHVzZSBhcyBhbGlhc2VzCisKKyAgICBBbGlhcyBuYW1lcyByZXR1cm5lZCBieSBnZXRhbGlhc2VzKCkgbXVzdCBiZSBub3JtYWxpemVkIGVuY29kaW5nCisgICAgbmFtZXMgYXMgZGVmaW5lZCBieSBub3JtYWxpemVfZW5jb2RpbmcoKS4KKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKK2Zyb20gZW5jb2RpbmdzIGltcG9ydCBhbGlhc2VzCitpbXBvcnQgX19idWlsdGluX18KKworX2NhY2hlID0ge30KK191bmtub3duID0gJy0tdW5rbm93bi0tJworX2ltcG9ydF90YWlsID0gWycqJ10KK19ub3JtX2VuY29kaW5nX21hcCA9ICgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJworICAgICAgICAgICAgICAgICAgICAgICcwMTIzNDU2Nzg5ICAgICAgIEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgJyBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiAgICAgICAgICAgICAgICAgICAgICcKKyAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgICAnKQorX2FsaWFzZXMgPSBhbGlhc2VzLmFsaWFzZXMKKworY2xhc3MgQ29kZWNSZWdpc3RyeUVycm9yKExvb2t1cEVycm9yLCBTeXN0ZW1FcnJvcik6CisgICAgcGFzcworCitkZWYgbm9ybWFsaXplX2VuY29kaW5nKGVuY29kaW5nKToKKworICAgICIiIiBOb3JtYWxpemUgYW4gZW5jb2RpbmcgbmFtZS4KKworICAgICAgICBOb3JtYWxpemF0aW9uIHdvcmtzIGFzIGZvbGxvd3M6IGFsbCBub24tYWxwaGFudW1lcmljCisgICAgICAgIGNoYXJhY3RlcnMgZXhjZXB0IHRoZSBkb3QgdXNlZCBmb3IgUHl0aG9uIHBhY2thZ2UgbmFtZXMgYXJlCisgICAgICAgIGNvbGxhcHNlZCBhbmQgcmVwbGFjZWQgd2l0aCBhIHNpbmdsZSB1bmRlcnNjb3JlLCBlLmcuICcgIC07IycKKyAgICAgICAgYmVjb21lcyAnXycuIExlYWRpbmcgYW5kIHRyYWlsaW5nIHVuZGVyc2NvcmVzIGFyZSByZW1vdmVkLgorCisgICAgICAgIE5vdGUgdGhhdCBlbmNvZGluZyBuYW1lcyBzaG91bGQgYmUgQVNDSUkgb25seTsgaWYgdGhleSBkbyB1c2UKKyAgICAgICAgbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIHRoZXNlIG11c3QgYmUgTGF0aW4tMSBjb21wYXRpYmxlLgorCisgICAgIiIiCisgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbiA4LWJpdCBzdHJpbmcsIGJlY2F1c2UgLnRyYW5zbGF0ZSgpIHdvcmtzCisgICAgIyBkaWZmZXJlbnRseSBmb3IgVW5pY29kZSBzdHJpbmdzLgorICAgIGlmIGhhc2F0dHIoX19idWlsdGluX18sICJ1bmljb2RlIikgYW5kIGlzaW5zdGFuY2UoZW5jb2RpbmcsIHVuaWNvZGUpOgorICAgICAgICAjIE5vdGUgdGhhdCAuZW5jb2RlKCdsYXRpbi0xJykgZG9lcyAqbm90KiB1c2UgdGhlIGNvZGVjCisgICAgICAgICMgcmVnaXN0cnksIHNvIHRoaXMgY2FsbCBkb2Vzbid0IHJlY3Vyc2UuIChTZWUgdW5pY29kZW9iamVjdC5jCisgICAgICAgICMgUHlVbmljb2RlX0FzRW5jb2RlZFN0cmluZygpIGZvciBkZXRhaWxzKQorICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nLmVuY29kZSgnbGF0aW4tMScpCisgICAgcmV0dXJuICdfJy5qb2luKGVuY29kaW5nLnRyYW5zbGF0ZShfbm9ybV9lbmNvZGluZ19tYXApLnNwbGl0KCkpCisKK2RlZiBzZWFyY2hfZnVuY3Rpb24oZW5jb2RpbmcpOgorCisgICAgIyBDYWNoZSBsb29rdXAKKyAgICBlbnRyeSA9IF9jYWNoZS5nZXQoZW5jb2RpbmcsIF91bmtub3duKQorICAgIGlmIGVudHJ5IGlzIG5vdCBfdW5rbm93bjoKKyAgICAgICAgcmV0dXJuIGVudHJ5CisKKyAgICAjIEltcG9ydCB0aGUgbW9kdWxlOgorICAgICMKKyAgICAjIEZpcnN0IHRyeSB0byBmaW5kIGFuIGFsaWFzIGZvciB0aGUgbm9ybWFsaXplZCBlbmNvZGluZworICAgICMgbmFtZSBhbmQgbG9va3VwIHRoZSBtb2R1bGUgdXNpbmcgdGhlIGFsaWFzZWQgbmFtZSwgdGhlbiB0cnkgdG8KKyAgICAjIGxvb2t1cCB0aGUgbW9kdWxlIHVzaW5nIHRoZSBzdGFuZGFyZCBpbXBvcnQgc2NoZW1lLCBpLmUuIGZpcnN0CisgICAgIyB0cnkgaW4gdGhlIGVuY29kaW5ncyBwYWNrYWdlLCB0aGVuIGF0IHRvcC1sZXZlbC4KKyAgICAjCisgICAgbm9ybV9lbmNvZGluZyA9IG5vcm1hbGl6ZV9lbmNvZGluZyhlbmNvZGluZykKKyAgICBhbGlhc2VkX2VuY29kaW5nID0gX2FsaWFzZXMuZ2V0KG5vcm1fZW5jb2RpbmcpIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgX2FsaWFzZXMuZ2V0KG5vcm1fZW5jb2RpbmcucmVwbGFjZSgnLicsICdfJykpCisgICAgaWYgYWxpYXNlZF9lbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgbW9kbmFtZXMgPSBbYWxpYXNlZF9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgbm9ybV9lbmNvZGluZ10KKyAgICBlbHNlOgorICAgICAgICBtb2RuYW1lcyA9IFtub3JtX2VuY29kaW5nXQorICAgIGZvciBtb2RuYW1lIGluIG1vZG5hbWVzOgorICAgICAgICBpZiBub3QgbW9kbmFtZSBvciAnLicgaW4gbW9kbmFtZToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgSW1wb3J0IGlzIGFic29sdXRlIHRvIHByZXZlbnQgdGhlIHBvc3NpYmx5IG1hbGljaW91cyBpbXBvcnQgb2YgYQorICAgICAgICAgICAgIyBtb2R1bGUgd2l0aCBzaWRlLWVmZmVjdHMgdGhhdCBpcyBub3QgaW4gdGhlICdlbmNvZGluZ3MnIHBhY2thZ2UuCisgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKCdlbmNvZGluZ3MuJyArIG1vZG5hbWUsIGZyb21saXN0PV9pbXBvcnRfdGFpbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWw9MCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICBtb2QgPSBOb25lCisKKyAgICB0cnk6CisgICAgICAgIGdldHJlZ2VudHJ5ID0gbW9kLmdldHJlZ2VudHJ5CisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAjIE5vdCBhIGNvZGVjIG1vZHVsZQorICAgICAgICBtb2QgPSBOb25lCisKKyAgICBpZiBtb2QgaXMgTm9uZToKKyAgICAgICAgIyBDYWNoZSBtaXNzZXMKKyAgICAgICAgX2NhY2hlW2VuY29kaW5nXSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgTm93IGFzayB0aGUgbW9kdWxlIGZvciB0aGUgcmVnaXN0cnkgZW50cnkKKyAgICBlbnRyeSA9IGdldHJlZ2VudHJ5KCkKKyAgICBpZiBub3QgaXNpbnN0YW5jZShlbnRyeSwgY29kZWNzLkNvZGVjSW5mbyk6CisgICAgICAgIGlmIG5vdCA0IDw9IGxlbihlbnRyeSkgPD0gNzoKKyAgICAgICAgICAgIHJhaXNlIENvZGVjUmVnaXN0cnlFcnJvcixcCisgICAgICAgICAgICAgICAgICdtb2R1bGUgIiVzIiAoJXMpIGZhaWxlZCB0byByZWdpc3RlcicgJSBcCisgICAgICAgICAgICAgICAgICAobW9kLl9fbmFtZV9fLCBtb2QuX19maWxlX18pCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGVudHJ5WzBdLCAnX19jYWxsX18nKSBvciBcCisgICAgICAgICAgIG5vdCBoYXNhdHRyKGVudHJ5WzFdLCAnX19jYWxsX18nKSBvciBcCisgICAgICAgICAgIChlbnRyeVsyXSBpcyBub3QgTm9uZSBhbmQgbm90IGhhc2F0dHIoZW50cnlbMl0sICdfX2NhbGxfXycpKSBvciBcCisgICAgICAgICAgIChlbnRyeVszXSBpcyBub3QgTm9uZSBhbmQgbm90IGhhc2F0dHIoZW50cnlbM10sICdfX2NhbGxfXycpKSBvciBcCisgICAgICAgICAgIChsZW4oZW50cnkpID4gNCBhbmQgZW50cnlbNF0gaXMgbm90IE5vbmUgYW5kIG5vdCBoYXNhdHRyKGVudHJ5WzRdLCAnX19jYWxsX18nKSkgb3IgXAorICAgICAgICAgICAobGVuKGVudHJ5KSA+IDUgYW5kIGVudHJ5WzVdIGlzIG5vdCBOb25lIGFuZCBub3QgaGFzYXR0cihlbnRyeVs1XSwgJ19fY2FsbF9fJykpOgorICAgICAgICAgICAgcmFpc2UgQ29kZWNSZWdpc3RyeUVycm9yLFwKKyAgICAgICAgICAgICAgICAnaW5jb21wYXRpYmxlIGNvZGVjcyBpbiBtb2R1bGUgIiVzIiAoJXMpJyAlIFwKKyAgICAgICAgICAgICAgICAobW9kLl9fbmFtZV9fLCBtb2QuX19maWxlX18pCisgICAgICAgIGlmIGxlbihlbnRyeSk8NyBvciBlbnRyeVs2XSBpcyBOb25lOgorICAgICAgICAgICAgZW50cnkgKz0gKE5vbmUsKSooNi1sZW4oZW50cnkpKSArIChtb2QuX19uYW1lX18uc3BsaXQoIi4iLCAxKVsxXSwpCisgICAgICAgIGVudHJ5ID0gY29kZWNzLkNvZGVjSW5mbygqZW50cnkpCisKKyAgICAjIENhY2hlIHRoZSBjb2RlYyByZWdpc3RyeSBlbnRyeQorICAgIF9jYWNoZVtlbmNvZGluZ10gPSBlbnRyeQorCisgICAgIyBSZWdpc3RlciBpdHMgYWxpYXNlcyAod2l0aG91dCBvdmVyd3JpdGluZyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKKyAgICAjIGFsaWFzZXMpCisgICAgdHJ5OgorICAgICAgICBjb2RlY2FsaWFzZXMgPSBtb2QuZ2V0YWxpYXNlcygpCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgZm9yIGFsaWFzIGluIGNvZGVjYWxpYXNlczoKKyAgICAgICAgICAgIGlmIGFsaWFzIG5vdCBpbiBfYWxpYXNlczoKKyAgICAgICAgICAgICAgICBfYWxpYXNlc1thbGlhc10gPSBtb2RuYW1lCisKKyAgICAjIFJldHVybiB0aGUgcmVnaXN0cnkgZW50cnkKKyAgICByZXR1cm4gZW50cnkKKworIyBSZWdpc3RlciB0aGUgc2VhcmNoX2Z1bmN0aW9uIGluIHRoZSBQeXRob24gY29kZWMgcmVnaXN0cnkKK2NvZGVjcy5yZWdpc3RlcihzZWFyY2hfZnVuY3Rpb24pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkMjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkMjgwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hbGlhc2VzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRjZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weQpAQCAtMCwwICsxLDUyNyBAQAorIiIiIEVuY29kaW5nIEFsaWFzZXMgU3VwcG9ydAorCisgICAgVGhpcyBtb2R1bGUgaXMgdXNlZCBieSB0aGUgZW5jb2RpbmdzIHBhY2thZ2Ugc2VhcmNoIGZ1bmN0aW9uIHRvCisgICAgbWFwIGVuY29kaW5ncyBuYW1lcyB0byBtb2R1bGUgbmFtZXMuCisKKyAgICBOb3RlIHRoYXQgdGhlIHNlYXJjaCBmdW5jdGlvbiBub3JtYWxpemVzIHRoZSBlbmNvZGluZyBuYW1lcyBiZWZvcmUKKyAgICBkb2luZyB0aGUgbG9va3VwLCBzbyB0aGUgbWFwcGluZyB3aWxsIGhhdmUgdG8gbWFwIG5vcm1hbGl6ZWQKKyAgICBlbmNvZGluZyBuYW1lcyB0byBtb2R1bGUgbmFtZXMuCisKKyAgICBDb250ZW50czoKKworICAgICAgICBUaGUgZm9sbG93aW5nIGFsaWFzZXMgZGljdGlvbmFyeSBjb250YWlucyBtYXBwaW5ncyBvZiBhbGwgSUFOQQorICAgICAgICBjaGFyYWN0ZXIgc2V0IG5hbWVzIGZvciB3aGljaCB0aGUgUHl0aG9uIGNvcmUgbGlicmFyeSBwcm92aWRlcworICAgICAgICBjb2RlY3MuIEluIGFkZGl0aW9uIHRvIHRoZXNlLCBhIGZldyBQeXRob24gc3BlY2lmaWMgY29kZWMKKyAgICAgICAgYWxpYXNlcyBoYXZlIGFsc28gYmVlbiBhZGRlZC4KKworIiIiCithbGlhc2VzID0geworCisgICAgIyBQbGVhc2Uga2VlcCB0aGlzIGxpc3Qgc29ydGVkIGFscGhhYmV0aWNhbGx5IGJ5IHZhbHVlICEKKworICAgICMgYXNjaWkgY29kZWMKKyAgICAnNjQ2JyAgICAgICAgICAgICAgICA6ICdhc2NpaScsCisgICAgJ2Fuc2lfeDMuNF8xOTY4JyAgICAgOiAnYXNjaWknLAorICAgICdhbnNpX3gzXzRfMTk2OCcgICAgIDogJ2FzY2lpJywgIyBzb21lIGVtYWlsIGhlYWRlcnMgdXNlIHRoaXMgbm9uLXN0YW5kYXJkIG5hbWUKKyAgICAnYW5zaV94My40XzE5ODYnICAgICA6ICdhc2NpaScsCisgICAgJ2NwMzY3JyAgICAgICAgICAgICAgOiAnYXNjaWknLAorICAgICdjc2FzY2lpJyAgICAgICAgICAgIDogJ2FzY2lpJywKKyAgICAnaWJtMzY3JyAgICAgICAgICAgICA6ICdhc2NpaScsCisgICAgJ2lzbzY0Nl91cycgICAgICAgICAgOiAnYXNjaWknLAorICAgICdpc29fNjQ2Lmlydl8xOTkxJyAgIDogJ2FzY2lpJywKKyAgICAnaXNvX2lyXzYnICAgICAgICAgICA6ICdhc2NpaScsCisgICAgJ3VzJyAgICAgICAgICAgICAgICAgOiAnYXNjaWknLAorICAgICd1c19hc2NpaScgICAgICAgICAgIDogJ2FzY2lpJywKKworICAgICMgYmFzZTY0X2NvZGVjIGNvZGVjCisgICAgJ2Jhc2U2NCcgICAgICAgICAgICAgOiAnYmFzZTY0X2NvZGVjJywKKyAgICAnYmFzZV82NCcgICAgICAgICAgICA6ICdiYXNlNjRfY29kZWMnLAorCisgICAgIyBiaWc1IGNvZGVjCisgICAgJ2JpZzVfdHcnICAgICAgICAgICAgOiAnYmlnNScsCisgICAgJ2NzYmlnNScgICAgICAgICAgICAgOiAnYmlnNScsCisKKyAgICAjIGJpZzVoa3NjcyBjb2RlYworICAgICdiaWc1X2hrc2NzJyAgICAgICAgIDogJ2JpZzVoa3NjcycsCisgICAgJ2hrc2NzJyAgICAgICAgICAgICAgOiAnYmlnNWhrc2NzJywKKworICAgICMgYnoyX2NvZGVjIGNvZGVjCisgICAgJ2J6MicgICAgICAgICAgICAgICAgOiAnYnoyX2NvZGVjJywKKworICAgICMgY3AwMzcgY29kZWMKKyAgICAnMDM3JyAgICAgICAgICAgICAgICA6ICdjcDAzNycsCisgICAgJ2NzaWJtMDM3JyAgICAgICAgICAgOiAnY3AwMzcnLAorICAgICdlYmNkaWNfY3BfY2EnICAgICAgIDogJ2NwMDM3JywKKyAgICAnZWJjZGljX2NwX25sJyAgICAgICA6ICdjcDAzNycsCisgICAgJ2ViY2RpY19jcF91cycgICAgICAgOiAnY3AwMzcnLAorICAgICdlYmNkaWNfY3Bfd3QnICAgICAgIDogJ2NwMDM3JywKKyAgICAnaWJtMDM3JyAgICAgICAgICAgICA6ICdjcDAzNycsCisgICAgJ2libTAzOScgICAgICAgICAgICAgOiAnY3AwMzcnLAorCisgICAgIyBjcDEwMjYgY29kZWMKKyAgICAnMTAyNicgICAgICAgICAgICAgICA6ICdjcDEwMjYnLAorICAgICdjc2libTEwMjYnICAgICAgICAgIDogJ2NwMTAyNicsCisgICAgJ2libTEwMjYnICAgICAgICAgICAgOiAnY3AxMDI2JywKKworICAgICMgY3AxMTQwIGNvZGVjCisgICAgJzExNDAnICAgICAgICAgICAgICAgOiAnY3AxMTQwJywKKyAgICAnaWJtMTE0MCcgICAgICAgICAgICA6ICdjcDExNDAnLAorCisgICAgIyBjcDEyNTAgY29kZWMKKyAgICAnMTI1MCcgICAgICAgICAgICAgICA6ICdjcDEyNTAnLAorICAgICd3aW5kb3dzXzEyNTAnICAgICAgIDogJ2NwMTI1MCcsCisKKyAgICAjIGNwMTI1MSBjb2RlYworICAgICcxMjUxJyAgICAgICAgICAgICAgIDogJ2NwMTI1MScsCisgICAgJ3dpbmRvd3NfMTI1MScgICAgICAgOiAnY3AxMjUxJywKKworICAgICMgY3AxMjUyIGNvZGVjCisgICAgJzEyNTInICAgICAgICAgICAgICAgOiAnY3AxMjUyJywKKyAgICAnd2luZG93c18xMjUyJyAgICAgICA6ICdjcDEyNTInLAorCisgICAgIyBjcDEyNTMgY29kZWMKKyAgICAnMTI1MycgICAgICAgICAgICAgICA6ICdjcDEyNTMnLAorICAgICd3aW5kb3dzXzEyNTMnICAgICAgIDogJ2NwMTI1MycsCisKKyAgICAjIGNwMTI1NCBjb2RlYworICAgICcxMjU0JyAgICAgICAgICAgICAgIDogJ2NwMTI1NCcsCisgICAgJ3dpbmRvd3NfMTI1NCcgICAgICAgOiAnY3AxMjU0JywKKworICAgICMgY3AxMjU1IGNvZGVjCisgICAgJzEyNTUnICAgICAgICAgICAgICAgOiAnY3AxMjU1JywKKyAgICAnd2luZG93c18xMjU1JyAgICAgICA6ICdjcDEyNTUnLAorCisgICAgIyBjcDEyNTYgY29kZWMKKyAgICAnMTI1NicgICAgICAgICAgICAgICA6ICdjcDEyNTYnLAorICAgICd3aW5kb3dzXzEyNTYnICAgICAgIDogJ2NwMTI1NicsCisKKyAgICAjIGNwMTI1NyBjb2RlYworICAgICcxMjU3JyAgICAgICAgICAgICAgIDogJ2NwMTI1NycsCisgICAgJ3dpbmRvd3NfMTI1NycgICAgICAgOiAnY3AxMjU3JywKKworICAgICMgY3AxMjU4IGNvZGVjCisgICAgJzEyNTgnICAgICAgICAgICAgICAgOiAnY3AxMjU4JywKKyAgICAnd2luZG93c18xMjU4JyAgICAgICA6ICdjcDEyNTgnLAorCisgICAgIyBjcDQyNCBjb2RlYworICAgICc0MjQnICAgICAgICAgICAgICAgIDogJ2NwNDI0JywKKyAgICAnY3NpYm00MjQnICAgICAgICAgICA6ICdjcDQyNCcsCisgICAgJ2ViY2RpY19jcF9oZScgICAgICAgOiAnY3A0MjQnLAorICAgICdpYm00MjQnICAgICAgICAgICAgIDogJ2NwNDI0JywKKworICAgICMgY3A0MzcgY29kZWMKKyAgICAnNDM3JyAgICAgICAgICAgICAgICA6ICdjcDQzNycsCisgICAgJ2NzcGM4Y29kZXBhZ2U0MzcnICAgOiAnY3A0MzcnLAorICAgICdpYm00MzcnICAgICAgICAgICAgIDogJ2NwNDM3JywKKworICAgICMgY3A1MDAgY29kZWMKKyAgICAnNTAwJyAgICAgICAgICAgICAgICA6ICdjcDUwMCcsCisgICAgJ2NzaWJtNTAwJyAgICAgICAgICAgOiAnY3A1MDAnLAorICAgICdlYmNkaWNfY3BfYmUnICAgICAgIDogJ2NwNTAwJywKKyAgICAnZWJjZGljX2NwX2NoJyAgICAgICA6ICdjcDUwMCcsCisgICAgJ2libTUwMCcgICAgICAgICAgICAgOiAnY3A1MDAnLAorCisgICAgIyBjcDc3NSBjb2RlYworICAgICc3NzUnICAgICAgICAgICAgICAgIDogJ2NwNzc1JywKKyAgICAnY3NwYzc3NWJhbHRpYycgICAgICA6ICdjcDc3NScsCisgICAgJ2libTc3NScgICAgICAgICAgICAgOiAnY3A3NzUnLAorCisgICAgIyBjcDg1MCBjb2RlYworICAgICc4NTAnICAgICAgICAgICAgICAgIDogJ2NwODUwJywKKyAgICAnY3NwYzg1MG11bHRpbGluZ3VhbCcgOiAnY3A4NTAnLAorICAgICdpYm04NTAnICAgICAgICAgICAgIDogJ2NwODUwJywKKworICAgICMgY3A4NTIgY29kZWMKKyAgICAnODUyJyAgICAgICAgICAgICAgICA6ICdjcDg1MicsCisgICAgJ2NzcGNwODUyJyAgICAgICAgICAgOiAnY3A4NTInLAorICAgICdpYm04NTInICAgICAgICAgICAgIDogJ2NwODUyJywKKworICAgICMgY3A4NTUgY29kZWMKKyAgICAnODU1JyAgICAgICAgICAgICAgICA6ICdjcDg1NScsCisgICAgJ2NzaWJtODU1JyAgICAgICAgICAgOiAnY3A4NTUnLAorICAgICdpYm04NTUnICAgICAgICAgICAgIDogJ2NwODU1JywKKworICAgICMgY3A4NTcgY29kZWMKKyAgICAnODU3JyAgICAgICAgICAgICAgICA6ICdjcDg1NycsCisgICAgJ2NzaWJtODU3JyAgICAgICAgICAgOiAnY3A4NTcnLAorICAgICdpYm04NTcnICAgICAgICAgICAgIDogJ2NwODU3JywKKworICAgICMgY3A4NTggY29kZWMKKyAgICAnODU4JyAgICAgICAgICAgICAgICA6ICdjcDg1OCcsCisgICAgJ2NzaWJtODU4JyAgICAgICAgICAgOiAnY3A4NTgnLAorICAgICdpYm04NTgnICAgICAgICAgICAgIDogJ2NwODU4JywKKworICAgICMgY3A4NjAgY29kZWMKKyAgICAnODYwJyAgICAgICAgICAgICAgICA6ICdjcDg2MCcsCisgICAgJ2NzaWJtODYwJyAgICAgICAgICAgOiAnY3A4NjAnLAorICAgICdpYm04NjAnICAgICAgICAgICAgIDogJ2NwODYwJywKKworICAgICMgY3A4NjEgY29kZWMKKyAgICAnODYxJyAgICAgICAgICAgICAgICA6ICdjcDg2MScsCisgICAgJ2NwX2lzJyAgICAgICAgICAgICAgOiAnY3A4NjEnLAorICAgICdjc2libTg2MScgICAgICAgICAgIDogJ2NwODYxJywKKyAgICAnaWJtODYxJyAgICAgICAgICAgICA6ICdjcDg2MScsCisKKyAgICAjIGNwODYyIGNvZGVjCisgICAgJzg2MicgICAgICAgICAgICAgICAgOiAnY3A4NjInLAorICAgICdjc3BjODYybGF0aW5oZWJyZXcnIDogJ2NwODYyJywKKyAgICAnaWJtODYyJyAgICAgICAgICAgICA6ICdjcDg2MicsCisKKyAgICAjIGNwODYzIGNvZGVjCisgICAgJzg2MycgICAgICAgICAgICAgICAgOiAnY3A4NjMnLAorICAgICdjc2libTg2MycgICAgICAgICAgIDogJ2NwODYzJywKKyAgICAnaWJtODYzJyAgICAgICAgICAgICA6ICdjcDg2MycsCisKKyAgICAjIGNwODY0IGNvZGVjCisgICAgJzg2NCcgICAgICAgICAgICAgICAgOiAnY3A4NjQnLAorICAgICdjc2libTg2NCcgICAgICAgICAgIDogJ2NwODY0JywKKyAgICAnaWJtODY0JyAgICAgICAgICAgICA6ICdjcDg2NCcsCisKKyAgICAjIGNwODY1IGNvZGVjCisgICAgJzg2NScgICAgICAgICAgICAgICAgOiAnY3A4NjUnLAorICAgICdjc2libTg2NScgICAgICAgICAgIDogJ2NwODY1JywKKyAgICAnaWJtODY1JyAgICAgICAgICAgICA6ICdjcDg2NScsCisKKyAgICAjIGNwODY2IGNvZGVjCisgICAgJzg2NicgICAgICAgICAgICAgICAgOiAnY3A4NjYnLAorICAgICdjc2libTg2NicgICAgICAgICAgIDogJ2NwODY2JywKKyAgICAnaWJtODY2JyAgICAgICAgICAgICA6ICdjcDg2NicsCisKKyAgICAjIGNwODY5IGNvZGVjCisgICAgJzg2OScgICAgICAgICAgICAgICAgOiAnY3A4NjknLAorICAgICdjcF9ncicgICAgICAgICAgICAgIDogJ2NwODY5JywKKyAgICAnY3NpYm04NjknICAgICAgICAgICA6ICdjcDg2OScsCisgICAgJ2libTg2OScgICAgICAgICAgICAgOiAnY3A4NjknLAorCisgICAgIyBjcDkzMiBjb2RlYworICAgICc5MzInICAgICAgICAgICAgICAgIDogJ2NwOTMyJywKKyAgICAnbXM5MzInICAgICAgICAgICAgICA6ICdjcDkzMicsCisgICAgJ21za2FuamknICAgICAgICAgICAgOiAnY3A5MzInLAorICAgICdtc19rYW5qaScgICAgICAgICAgIDogJ2NwOTMyJywKKworICAgICMgY3A5NDkgY29kZWMKKyAgICAnOTQ5JyAgICAgICAgICAgICAgICA6ICdjcDk0OScsCisgICAgJ21zOTQ5JyAgICAgICAgICAgICAgOiAnY3A5NDknLAorICAgICd1aGMnICAgICAgICAgICAgICAgIDogJ2NwOTQ5JywKKworICAgICMgY3A5NTAgY29kZWMKKyAgICAnOTUwJyAgICAgICAgICAgICAgICA6ICdjcDk1MCcsCisgICAgJ21zOTUwJyAgICAgICAgICAgICAgOiAnY3A5NTAnLAorCisgICAgIyBldWNfamlzXzIwMDQgY29kZWMKKyAgICAnamlzeDAyMTMnICAgICAgICAgICA6ICdldWNfamlzXzIwMDQnLAorICAgICdldWNqaXMyMDA0JyAgICAgICAgIDogJ2V1Y19qaXNfMjAwNCcsCisgICAgJ2V1Y19qaXMyMDA0JyAgICAgICAgOiAnZXVjX2ppc18yMDA0JywKKworICAgICMgZXVjX2ppc3gwMjEzIGNvZGVjCisgICAgJ2V1Y2ppc3gwMjEzJyAgICAgICAgOiAnZXVjX2ppc3gwMjEzJywKKworICAgICMgZXVjX2pwIGNvZGVjCisgICAgJ2V1Y2pwJyAgICAgICAgICAgICAgOiAnZXVjX2pwJywKKyAgICAndWppcycgICAgICAgICAgICAgICA6ICdldWNfanAnLAorICAgICd1X2ppcycgICAgICAgICAgICAgIDogJ2V1Y19qcCcsCisKKyAgICAjIGV1Y19rciBjb2RlYworICAgICdldWNrcicgICAgICAgICAgICAgIDogJ2V1Y19rcicsCisgICAgJ2tvcmVhbicgICAgICAgICAgICAgOiAnZXVjX2tyJywKKyAgICAna3NjNTYwMScgICAgICAgICAgICA6ICdldWNfa3InLAorICAgICdrc19jXzU2MDEnICAgICAgICAgIDogJ2V1Y19rcicsCisgICAgJ2tzX2NfNTYwMV8xOTg3JyAgICAgOiAnZXVjX2tyJywKKyAgICAna3N4MTAwMScgICAgICAgICAgICA6ICdldWNfa3InLAorICAgICdrc194XzEwMDEnICAgICAgICAgIDogJ2V1Y19rcicsCisKKyAgICAjIGdiMTgwMzAgY29kZWMKKyAgICAnZ2IxODAzMF8yMDAwJyAgICAgICA6ICdnYjE4MDMwJywKKworICAgICMgZ2IyMzEyIGNvZGVjCisgICAgJ2NoaW5lc2UnICAgICAgICAgICAgOiAnZ2IyMzEyJywKKyAgICAnY3Npc281OGdiMjMxMjgwJyAgICA6ICdnYjIzMTInLAorICAgICdldWNfY24nICAgICAgICAgICAgIDogJ2diMjMxMicsCisgICAgJ2V1Y2NuJyAgICAgICAgICAgICAgOiAnZ2IyMzEyJywKKyAgICAnZXVjZ2IyMzEyX2NuJyAgICAgICA6ICdnYjIzMTInLAorICAgICdnYjIzMTJfMTk4MCcgICAgICAgIDogJ2diMjMxMicsCisgICAgJ2diMjMxMl84MCcgICAgICAgICAgOiAnZ2IyMzEyJywKKyAgICAnaXNvX2lyXzU4JyAgICAgICAgICA6ICdnYjIzMTInLAorCisgICAgIyBnYmsgY29kZWMKKyAgICAnOTM2JyAgICAgICAgICAgICAgICA6ICdnYmsnLAorICAgICdjcDkzNicgICAgICAgICAgICAgIDogJ2diaycsCisgICAgJ21zOTM2JyAgICAgICAgICAgICAgOiAnZ2JrJywKKworICAgICMgaGV4X2NvZGVjIGNvZGVjCisgICAgJ2hleCcgICAgICAgICAgICAgICAgOiAnaGV4X2NvZGVjJywKKworICAgICMgaHBfcm9tYW44IGNvZGVjCisgICAgJ3JvbWFuOCcgICAgICAgICAgICAgOiAnaHBfcm9tYW44JywKKyAgICAncjgnICAgICAgICAgICAgICAgICA6ICdocF9yb21hbjgnLAorICAgICdjc0hQUm9tYW44JyAgICAgICAgIDogJ2hwX3JvbWFuOCcsCisKKyAgICAjIGh6IGNvZGVjCisgICAgJ2h6Z2InICAgICAgICAgICAgICAgOiAnaHonLAorICAgICdoel9nYicgICAgICAgICAgICAgIDogJ2h6JywKKyAgICAnaHpfZ2JfMjMxMicgICAgICAgICA6ICdoeicsCisKKyAgICAjIGlzbzIwMjJfanAgY29kZWMKKyAgICAnY3Npc28yMDIyanAnICAgICAgICA6ICdpc28yMDIyX2pwJywKKyAgICAnaXNvMjAyMmpwJyAgICAgICAgICA6ICdpc28yMDIyX2pwJywKKyAgICAnaXNvXzIwMjJfanAnICAgICAgICA6ICdpc28yMDIyX2pwJywKKworICAgICMgaXNvMjAyMl9qcF8xIGNvZGVjCisgICAgJ2lzbzIwMjJqcF8xJyAgICAgICAgOiAnaXNvMjAyMl9qcF8xJywKKyAgICAnaXNvXzIwMjJfanBfMScgICAgICA6ICdpc28yMDIyX2pwXzEnLAorCisgICAgIyBpc28yMDIyX2pwXzIgY29kZWMKKyAgICAnaXNvMjAyMmpwXzInICAgICAgICA6ICdpc28yMDIyX2pwXzInLAorICAgICdpc29fMjAyMl9qcF8yJyAgICAgIDogJ2lzbzIwMjJfanBfMicsCisKKyAgICAjIGlzbzIwMjJfanBfMjAwNCBjb2RlYworICAgICdpc29fMjAyMl9qcF8yMDA0JyAgIDogJ2lzbzIwMjJfanBfMjAwNCcsCisgICAgJ2lzbzIwMjJqcF8yMDA0JyAgICAgOiAnaXNvMjAyMl9qcF8yMDA0JywKKworICAgICMgaXNvMjAyMl9qcF8zIGNvZGVjCisgICAgJ2lzbzIwMjJqcF8zJyAgICAgICAgOiAnaXNvMjAyMl9qcF8zJywKKyAgICAnaXNvXzIwMjJfanBfMycgICAgICA6ICdpc28yMDIyX2pwXzMnLAorCisgICAgIyBpc28yMDIyX2pwX2V4dCBjb2RlYworICAgICdpc28yMDIyanBfZXh0JyAgICAgIDogJ2lzbzIwMjJfanBfZXh0JywKKyAgICAnaXNvXzIwMjJfanBfZXh0JyAgICA6ICdpc28yMDIyX2pwX2V4dCcsCisKKyAgICAjIGlzbzIwMjJfa3IgY29kZWMKKyAgICAnY3Npc28yMDIya3InICAgICAgICA6ICdpc28yMDIyX2tyJywKKyAgICAnaXNvMjAyMmtyJyAgICAgICAgICA6ICdpc28yMDIyX2tyJywKKyAgICAnaXNvXzIwMjJfa3InICAgICAgICA6ICdpc28yMDIyX2tyJywKKworICAgICMgaXNvODg1OV8xMCBjb2RlYworICAgICdjc2lzb2xhdGluNicgICAgICAgIDogJ2lzbzg4NTlfMTAnLAorICAgICdpc29fODg1OV8xMCcgICAgICAgIDogJ2lzbzg4NTlfMTAnLAorICAgICdpc29fODg1OV8xMF8xOTkyJyAgIDogJ2lzbzg4NTlfMTAnLAorICAgICdpc29faXJfMTU3JyAgICAgICAgIDogJ2lzbzg4NTlfMTAnLAorICAgICdsNicgICAgICAgICAgICAgICAgIDogJ2lzbzg4NTlfMTAnLAorICAgICdsYXRpbjYnICAgICAgICAgICAgIDogJ2lzbzg4NTlfMTAnLAorCisgICAgIyBpc284ODU5XzExIGNvZGVjCisgICAgJ3RoYWknICAgICAgICAgICAgICAgOiAnaXNvODg1OV8xMScsCisgICAgJ2lzb184ODU5XzExJyAgICAgICAgOiAnaXNvODg1OV8xMScsCisgICAgJ2lzb184ODU5XzExXzIwMDEnICAgOiAnaXNvODg1OV8xMScsCisKKyAgICAjIGlzbzg4NTlfMTMgY29kZWMKKyAgICAnaXNvXzg4NTlfMTMnICAgICAgICA6ICdpc284ODU5XzEzJywKKyAgICAnbDcnICAgICAgICAgICAgICAgICA6ICdpc284ODU5XzEzJywKKyAgICAnbGF0aW43JyAgICAgICAgICAgICA6ICdpc284ODU5XzEzJywKKworICAgICMgaXNvODg1OV8xNCBjb2RlYworICAgICdpc29fODg1OV8xNCcgICAgICAgIDogJ2lzbzg4NTlfMTQnLAorICAgICdpc29fODg1OV8xNF8xOTk4JyAgIDogJ2lzbzg4NTlfMTQnLAorICAgICdpc29fY2VsdGljJyAgICAgICAgIDogJ2lzbzg4NTlfMTQnLAorICAgICdpc29faXJfMTk5JyAgICAgICAgIDogJ2lzbzg4NTlfMTQnLAorICAgICdsOCcgICAgICAgICAgICAgICAgIDogJ2lzbzg4NTlfMTQnLAorICAgICdsYXRpbjgnICAgICAgICAgICAgIDogJ2lzbzg4NTlfMTQnLAorCisgICAgIyBpc284ODU5XzE1IGNvZGVjCisgICAgJ2lzb184ODU5XzE1JyAgICAgICAgOiAnaXNvODg1OV8xNScsCisgICAgJ2w5JyAgICAgICAgICAgICAgICAgOiAnaXNvODg1OV8xNScsCisgICAgJ2xhdGluOScgICAgICAgICAgICAgOiAnaXNvODg1OV8xNScsCisKKyAgICAjIGlzbzg4NTlfMTYgY29kZWMKKyAgICAnaXNvXzg4NTlfMTYnICAgICAgICA6ICdpc284ODU5XzE2JywKKyAgICAnaXNvXzg4NTlfMTZfMjAwMScgICA6ICdpc284ODU5XzE2JywKKyAgICAnaXNvX2lyXzIyNicgICAgICAgICA6ICdpc284ODU5XzE2JywKKyAgICAnbDEwJyAgICAgICAgICAgICAgICA6ICdpc284ODU5XzE2JywKKyAgICAnbGF0aW4xMCcgICAgICAgICAgICA6ICdpc284ODU5XzE2JywKKworICAgICMgaXNvODg1OV8yIGNvZGVjCisgICAgJ2NzaXNvbGF0aW4yJyAgICAgICAgOiAnaXNvODg1OV8yJywKKyAgICAnaXNvXzg4NTlfMicgICAgICAgICA6ICdpc284ODU5XzInLAorICAgICdpc29fODg1OV8yXzE5ODcnICAgIDogJ2lzbzg4NTlfMicsCisgICAgJ2lzb19pcl8xMDEnICAgICAgICAgOiAnaXNvODg1OV8yJywKKyAgICAnbDInICAgICAgICAgICAgICAgICA6ICdpc284ODU5XzInLAorICAgICdsYXRpbjInICAgICAgICAgICAgIDogJ2lzbzg4NTlfMicsCisKKyAgICAjIGlzbzg4NTlfMyBjb2RlYworICAgICdjc2lzb2xhdGluMycgICAgICAgIDogJ2lzbzg4NTlfMycsCisgICAgJ2lzb184ODU5XzMnICAgICAgICAgOiAnaXNvODg1OV8zJywKKyAgICAnaXNvXzg4NTlfM18xOTg4JyAgICA6ICdpc284ODU5XzMnLAorICAgICdpc29faXJfMTA5JyAgICAgICAgIDogJ2lzbzg4NTlfMycsCisgICAgJ2wzJyAgICAgICAgICAgICAgICAgOiAnaXNvODg1OV8zJywKKyAgICAnbGF0aW4zJyAgICAgICAgICAgICA6ICdpc284ODU5XzMnLAorCisgICAgIyBpc284ODU5XzQgY29kZWMKKyAgICAnY3Npc29sYXRpbjQnICAgICAgICA6ICdpc284ODU5XzQnLAorICAgICdpc29fODg1OV80JyAgICAgICAgIDogJ2lzbzg4NTlfNCcsCisgICAgJ2lzb184ODU5XzRfMTk4OCcgICAgOiAnaXNvODg1OV80JywKKyAgICAnaXNvX2lyXzExMCcgICAgICAgICA6ICdpc284ODU5XzQnLAorICAgICdsNCcgICAgICAgICAgICAgICAgIDogJ2lzbzg4NTlfNCcsCisgICAgJ2xhdGluNCcgICAgICAgICAgICAgOiAnaXNvODg1OV80JywKKworICAgICMgaXNvODg1OV81IGNvZGVjCisgICAgJ2NzaXNvbGF0aW5jeXJpbGxpYycgOiAnaXNvODg1OV81JywKKyAgICAnY3lyaWxsaWMnICAgICAgICAgICA6ICdpc284ODU5XzUnLAorICAgICdpc29fODg1OV81JyAgICAgICAgIDogJ2lzbzg4NTlfNScsCisgICAgJ2lzb184ODU5XzVfMTk4OCcgICAgOiAnaXNvODg1OV81JywKKyAgICAnaXNvX2lyXzE0NCcgICAgICAgICA6ICdpc284ODU5XzUnLAorCisgICAgIyBpc284ODU5XzYgY29kZWMKKyAgICAnYXJhYmljJyAgICAgICAgICAgICA6ICdpc284ODU5XzYnLAorICAgICdhc21vXzcwOCcgICAgICAgICAgIDogJ2lzbzg4NTlfNicsCisgICAgJ2NzaXNvbGF0aW5hcmFiaWMnICAgOiAnaXNvODg1OV82JywKKyAgICAnZWNtYV8xMTQnICAgICAgICAgICA6ICdpc284ODU5XzYnLAorICAgICdpc29fODg1OV82JyAgICAgICAgIDogJ2lzbzg4NTlfNicsCisgICAgJ2lzb184ODU5XzZfMTk4NycgICAgOiAnaXNvODg1OV82JywKKyAgICAnaXNvX2lyXzEyNycgICAgICAgICA6ICdpc284ODU5XzYnLAorCisgICAgIyBpc284ODU5XzcgY29kZWMKKyAgICAnY3Npc29sYXRpbmdyZWVrJyAgICA6ICdpc284ODU5XzcnLAorICAgICdlY21hXzExOCcgICAgICAgICAgIDogJ2lzbzg4NTlfNycsCisgICAgJ2Vsb3RfOTI4JyAgICAgICAgICAgOiAnaXNvODg1OV83JywKKyAgICAnZ3JlZWsnICAgICAgICAgICAgICA6ICdpc284ODU5XzcnLAorICAgICdncmVlazgnICAgICAgICAgICAgIDogJ2lzbzg4NTlfNycsCisgICAgJ2lzb184ODU5XzcnICAgICAgICAgOiAnaXNvODg1OV83JywKKyAgICAnaXNvXzg4NTlfN18xOTg3JyAgICA6ICdpc284ODU5XzcnLAorICAgICdpc29faXJfMTI2JyAgICAgICAgIDogJ2lzbzg4NTlfNycsCisKKyAgICAjIGlzbzg4NTlfOCBjb2RlYworICAgICdjc2lzb2xhdGluaGVicmV3JyAgIDogJ2lzbzg4NTlfOCcsCisgICAgJ2hlYnJldycgICAgICAgICAgICAgOiAnaXNvODg1OV84JywKKyAgICAnaXNvXzg4NTlfOCcgICAgICAgICA6ICdpc284ODU5XzgnLAorICAgICdpc29fODg1OV84XzE5ODgnICAgIDogJ2lzbzg4NTlfOCcsCisgICAgJ2lzb19pcl8xMzgnICAgICAgICAgOiAnaXNvODg1OV84JywKKworICAgICMgaXNvODg1OV85IGNvZGVjCisgICAgJ2NzaXNvbGF0aW41JyAgICAgICAgOiAnaXNvODg1OV85JywKKyAgICAnaXNvXzg4NTlfOScgICAgICAgICA6ICdpc284ODU5XzknLAorICAgICdpc29fODg1OV85XzE5ODknICAgIDogJ2lzbzg4NTlfOScsCisgICAgJ2lzb19pcl8xNDgnICAgICAgICAgOiAnaXNvODg1OV85JywKKyAgICAnbDUnICAgICAgICAgICAgICAgICA6ICdpc284ODU5XzknLAorICAgICdsYXRpbjUnICAgICAgICAgICAgIDogJ2lzbzg4NTlfOScsCisKKyAgICAjIGpvaGFiIGNvZGVjCisgICAgJ2NwMTM2MScgICAgICAgICAgICAgOiAnam9oYWInLAorICAgICdtczEzNjEnICAgICAgICAgICAgIDogJ2pvaGFiJywKKworICAgICMga29pOF9yIGNvZGVjCisgICAgJ2Nza29pOHInICAgICAgICAgICAgOiAna29pOF9yJywKKworICAgICMgbGF0aW5fMSBjb2RlYworICAgICMKKyAgICAjIE5vdGUgdGhhdCB0aGUgbGF0aW5fMSBjb2RlYyBpcyBpbXBsZW1lbnRlZCBpbnRlcm5hbGx5IGluIEMgYW5kIGEKKyAgICAjIGxvdCBmYXN0ZXIgdGhhbiB0aGUgY2hhcm1hcCBjb2RlYyBpc284ODU5XzEgd2hpY2ggdXNlcyB0aGUgc2FtZQorICAgICMgZW5jb2RpbmcuIFRoaXMgaXMgd2h5IHdlIGRpc2NvdXJhZ2UgdGhlIHVzZSBvZiB0aGUgaXNvODg1OV8xCisgICAgIyBjb2RlYyBhbmQgYWxpYXMgaXQgdG8gbGF0aW5fMSBpbnN0ZWFkLgorICAgICMKKyAgICAnODg1OScgICAgICAgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnY3A4MTknICAgICAgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnY3Npc29sYXRpbjEnICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnaWJtODE5JyAgICAgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnaXNvODg1OScgICAgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnaXNvODg1OV8xJyAgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnaXNvXzg4NTlfMScgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnaXNvXzg4NTlfMV8xOTg3JyAgICA6ICdsYXRpbl8xJywKKyAgICAnaXNvX2lyXzEwMCcgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnbDEnICAgICAgICAgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnbGF0aW4nICAgICAgICAgICAgICA6ICdsYXRpbl8xJywKKyAgICAnbGF0aW4xJyAgICAgICAgICAgICA6ICdsYXRpbl8xJywKKworICAgICMgbWFjX2N5cmlsbGljIGNvZGVjCisgICAgJ21hY2N5cmlsbGljJyAgICAgICAgOiAnbWFjX2N5cmlsbGljJywKKworICAgICMgbWFjX2dyZWVrIGNvZGVjCisgICAgJ21hY2dyZWVrJyAgICAgICAgICAgOiAnbWFjX2dyZWVrJywKKworICAgICMgbWFjX2ljZWxhbmQgY29kZWMKKyAgICAnbWFjaWNlbGFuZCcgICAgICAgICA6ICdtYWNfaWNlbGFuZCcsCisKKyAgICAjIG1hY19sYXRpbjIgY29kZWMKKyAgICAnbWFjY2VudHJhbGV1cm9wZScgICA6ICdtYWNfbGF0aW4yJywKKyAgICAnbWFjbGF0aW4yJyAgICAgICAgICA6ICdtYWNfbGF0aW4yJywKKworICAgICMgbWFjX3JvbWFuIGNvZGVjCisgICAgJ21hY3JvbWFuJyAgICAgICAgICAgOiAnbWFjX3JvbWFuJywKKworICAgICMgbWFjX3R1cmtpc2ggY29kZWMKKyAgICAnbWFjdHVya2lzaCcgICAgICAgICA6ICdtYWNfdHVya2lzaCcsCisKKyAgICAjIG1iY3MgY29kZWMKKyAgICAnZGJjcycgICAgICAgICAgICAgICA6ICdtYmNzJywKKworICAgICMgcHRjcDE1NCBjb2RlYworICAgICdjc3B0Y3AxNTQnICAgICAgICAgIDogJ3B0Y3AxNTQnLAorICAgICdwdDE1NCcgICAgICAgICAgICAgIDogJ3B0Y3AxNTQnLAorICAgICdjcDE1NCcgICAgICAgICAgICAgIDogJ3B0Y3AxNTQnLAorICAgICdjeXJpbGxpY19hc2lhbicgICAgIDogJ3B0Y3AxNTQnLAorCisgICAgIyBxdW9wcmlfY29kZWMgY29kZWMKKyAgICAncXVvcHJpJyAgICAgICAgICAgICA6ICdxdW9wcmlfY29kZWMnLAorICAgICdxdW90ZWRfcHJpbnRhYmxlJyAgIDogJ3F1b3ByaV9jb2RlYycsCisgICAgJ3F1b3RlZHByaW50YWJsZScgICAgOiAncXVvcHJpX2NvZGVjJywKKworICAgICMgcm90XzEzIGNvZGVjCisgICAgJ3JvdDEzJyAgICAgICAgICAgICAgOiAncm90XzEzJywKKworICAgICMgc2hpZnRfamlzIGNvZGVjCisgICAgJ2Nzc2hpZnRqaXMnICAgICAgICAgOiAnc2hpZnRfamlzJywKKyAgICAnc2hpZnRqaXMnICAgICAgICAgICA6ICdzaGlmdF9qaXMnLAorICAgICdzamlzJyAgICAgICAgICAgICAgIDogJ3NoaWZ0X2ppcycsCisgICAgJ3NfamlzJyAgICAgICAgICAgICAgOiAnc2hpZnRfamlzJywKKworICAgICMgc2hpZnRfamlzXzIwMDQgY29kZWMKKyAgICAnc2hpZnRqaXMyMDA0JyAgICAgICA6ICdzaGlmdF9qaXNfMjAwNCcsCisgICAgJ3NqaXNfMjAwNCcgICAgICAgICAgOiAnc2hpZnRfamlzXzIwMDQnLAorICAgICdzX2ppc18yMDA0JyAgICAgICAgIDogJ3NoaWZ0X2ppc18yMDA0JywKKworICAgICMgc2hpZnRfamlzeDAyMTMgY29kZWMKKyAgICAnc2hpZnRqaXN4MDIxMycgICAgICA6ICdzaGlmdF9qaXN4MDIxMycsCisgICAgJ3NqaXN4MDIxMycgICAgICAgICAgOiAnc2hpZnRfamlzeDAyMTMnLAorICAgICdzX2ppc3gwMjEzJyAgICAgICAgIDogJ3NoaWZ0X2ppc3gwMjEzJywKKworICAgICMgdGFjdGlzIGNvZGVjCisgICAgJ3RpczI2MCcgICAgICAgICAgICAgOiAndGFjdGlzJywKKworICAgICMgdGlzXzYyMCBjb2RlYworICAgICd0aXM2MjAnICAgICAgICAgICAgIDogJ3Rpc182MjAnLAorICAgICd0aXNfNjIwXzAnICAgICAgICAgIDogJ3Rpc182MjAnLAorICAgICd0aXNfNjIwXzI1MjlfMCcgICAgIDogJ3Rpc182MjAnLAorICAgICd0aXNfNjIwXzI1MjlfMScgICAgIDogJ3Rpc182MjAnLAorICAgICdpc29faXJfMTY2JyAgICAgICAgIDogJ3Rpc182MjAnLAorCisgICAgIyB1dGZfMTYgY29kZWMKKyAgICAndTE2JyAgICAgICAgICAgICAgICA6ICd1dGZfMTYnLAorICAgICd1dGYxNicgICAgICAgICAgICAgIDogJ3V0Zl8xNicsCisKKyAgICAjIHV0Zl8xNl9iZSBjb2RlYworICAgICd1bmljb2RlYmlndW5tYXJrZWQnIDogJ3V0Zl8xNl9iZScsCisgICAgJ3V0Zl8xNmJlJyAgICAgICAgICAgOiAndXRmXzE2X2JlJywKKworICAgICMgdXRmXzE2X2xlIGNvZGVjCisgICAgJ3VuaWNvZGVsaXR0bGV1bm1hcmtlZCcgOiAndXRmXzE2X2xlJywKKyAgICAndXRmXzE2bGUnICAgICAgICAgICA6ICd1dGZfMTZfbGUnLAorCisgICAgIyB1dGZfMzIgY29kZWMKKyAgICAndTMyJyAgICAgICAgICAgICAgICA6ICd1dGZfMzInLAorICAgICd1dGYzMicgICAgICAgICAgICAgIDogJ3V0Zl8zMicsCisKKyAgICAjIHV0Zl8zMl9iZSBjb2RlYworICAgICd1dGZfMzJiZScgICAgICAgICAgIDogJ3V0Zl8zMl9iZScsCisKKyAgICAjIHV0Zl8zMl9sZSBjb2RlYworICAgICd1dGZfMzJsZScgICAgICAgICAgIDogJ3V0Zl8zMl9sZScsCisKKyAgICAjIHV0Zl83IGNvZGVjCisgICAgJ3U3JyAgICAgICAgICAgICAgICAgOiAndXRmXzcnLAorICAgICd1dGY3JyAgICAgICAgICAgICAgIDogJ3V0Zl83JywKKyAgICAndW5pY29kZV8xXzFfdXRmXzcnICA6ICd1dGZfNycsCisKKyAgICAjIHV0Zl84IGNvZGVjCisgICAgJ3U4JyAgICAgICAgICAgICAgICAgOiAndXRmXzgnLAorICAgICd1dGYnICAgICAgICAgICAgICAgIDogJ3V0Zl84JywKKyAgICAndXRmOCcgICAgICAgICAgICAgICA6ICd1dGZfOCcsCisgICAgJ3V0ZjhfdWNzMicgICAgICAgICAgOiAndXRmXzgnLAorICAgICd1dGY4X3VjczQnICAgICAgICAgIDogJ3V0Zl84JywKKworICAgICMgdXVfY29kZWMgY29kZWMKKyAgICAndXUnICAgICAgICAgICAgICAgICA6ICd1dV9jb2RlYycsCisKKyAgICAjIHpsaWJfY29kZWMgY29kZWMKKyAgICAnemlwJyAgICAgICAgICAgICAgICA6ICd6bGliX2NvZGVjJywKKyAgICAnemxpYicgICAgICAgICAgICAgICA6ICd6bGliX2NvZGVjJywKKworfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hbGlhc2VzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGEwZThmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hbGlhc2VzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGEwZThmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYWxpYXNlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYXNjaWkucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hc2NpaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDMzY2RlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYXNjaWkucHkKQEAgLTAsMCArMSw1MCBAQAorIiIiIFB5dGhvbiAnYXNjaWknIENvZGVjCisKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgIyBOb3RlOiBCaW5kaW5nIHRoZXNlIGFzIEMgZnVuY3Rpb25zIHdpbGwgcmVzdWx0IGluIHRoZSBjbGFzcyBub3QKKyAgICAjIGNvbnZlcnRpbmcgdGhlbSB0byBtZXRob2RzLiBUaGlzIGlzIGludGVuZGVkLgorICAgIGVuY29kZSA9IGNvZGVjcy5hc2NpaV9lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlY3MuYXNjaWlfZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuYXNjaWlfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5hc2NpaV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1Db252ZXJ0ZXIoU3RyZWFtV3JpdGVyLFN0cmVhbVJlYWRlcik6CisKKyAgICBlbmNvZGUgPSBjb2RlY3MuYXNjaWlfZGVjb2RlCisgICAgZGVjb2RlID0gY29kZWNzLmFzY2lpX2VuY29kZQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2FzY2lpJywKKyAgICAgICAgZW5jb2RlPUNvZGVjLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hc2NpaS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hc2NpaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwNjU5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FzY2lpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hc2NpaS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9hc2NpaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IwNjU5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2FzY2lpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0ZTc4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2Jhc2U2NF9jb2RlYy5weQpAQCAtMCwwICsxLDc5IEBACisiIiIgUHl0aG9uICdiYXNlNjRfY29kZWMnIENvZGVjIC0gYmFzZTY0IGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcKKworICAgIFVubGlrZSBtb3N0IG9mIHRoZSBvdGhlciBjb2RlY3Mgd2hpY2ggdGFyZ2V0IFVuaWNvZGUsIHRoaXMgY29kZWMKKyAgICB3aWxsIHJldHVybiBQeXRob24gc3RyaW5nIG9iamVjdHMgZm9yIGJvdGggZW5jb2RlIGFuZCBkZWNvZGUuCisKKyAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworIiIiCitpbXBvcnQgY29kZWNzLCBiYXNlNjQKKworIyMjIENvZGVjIEFQSXMKKworZGVmIGJhc2U2NF9lbmNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBFbmNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgb3V0cHV0ID0gYmFzZTY0LmVuY29kZXN0cmluZyhpbnB1dCkKKyAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKKworZGVmIGJhc2U2NF9kZWNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBEZWNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgYmZfZ2V0cmVhZGJ1ZgorICAgICAgICBidWZmZXIgc2xvdC4gUHl0aG9uIHN0cmluZ3MsIGJ1ZmZlciBvYmplY3RzIGFuZCBtZW1vcnkKKyAgICAgICAgbWFwcGVkIGZpbGVzIGFyZSBleGFtcGxlcyBvZiBvYmplY3RzIHByb3ZpZGluZyB0aGlzIHNsb3QuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIG91dHB1dCA9IGJhc2U2NC5kZWNvZGVzdHJpbmcoaW5wdXQpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBiYXNlNjRfZW5jb2RlKGlucHV0LGVycm9ycykKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBiYXNlNjRfZGVjb2RlKGlucHV0LGVycm9ycykKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuZXJyb3JzID09ICdzdHJpY3QnCisgICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2Rlc3RyaW5nKGlucHV0KQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBhc3NlcnQgc2VsZi5lcnJvcnMgPT0gJ3N0cmljdCcKKyAgICAgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVzdHJpbmcoaW5wdXQpCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nYmFzZTY0JywKKyAgICAgICAgZW5jb2RlPWJhc2U2NF9lbmNvZGUsCisgICAgICAgIGRlY29kZT1iYXNlNjRfZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2Jhc2U2NF9jb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZWNiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2Jhc2U2NF9jb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmM4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iYXNlNjRfY29kZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGViMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1LnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgYmlnNS5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEJJRzUKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX3R3LCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc190dy5nZXRjb2RlYygnYmlnNScpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdiaWc1JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNkOTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNkOTEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYmlnNWhrc2NzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MGRmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1aGtzY3MucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBiaWc1aGtzY3MucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBCSUc1SEtTQ1MKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2hrLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19oay5nZXRjb2RlYygnYmlnNWhrc2NzJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2JpZzVoa3NjcycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzVoa3Njcy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1aGtzY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzMxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1aGtzY3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2JpZzVoa3Njcy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1aGtzY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzMxMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iaWc1aGtzY3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2J6Ml9jb2RlYy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2J6Ml9jb2RlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRiMzZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvYnoyX2NvZGVjLnB5CkBAIC0wLDAgKzEsMTAyIEBACisiIiIgUHl0aG9uICdiejJfY29kZWMnIENvZGVjIC0gYnoyIGNvbXByZXNzaW9uIGVuY29kaW5nCisKKyAgICBVbmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIgY29kZWNzIHdoaWNoIHRhcmdldCBVbmljb2RlLCB0aGlzIGNvZGVjCisgICAgd2lsbCByZXR1cm4gUHl0aG9uIHN0cmluZyBvYmplY3RzIGZvciBib3RoIGVuY29kZSBhbmQgZGVjb2RlLgorCisgICAgQWRhcHRlZCBieSBSYXltb25kIEhldHRpbmdlciBmcm9tIHpsaWJfY29kZWMucHkgd2hpY2ggd2FzIHdyaXR0ZW4KKyAgICBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworaW1wb3J0IGJ6MiAjIHRoaXMgY29kZWMgbmVlZHMgdGhlIG9wdGlvbmFsIGJ6MiBtb2R1bGUgIQorCisjIyMgQ29kZWMgQVBJcworCitkZWYgYnoyX2VuY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorCisgICAgIiIiIEVuY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKKyAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KKyAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICBvdXRwdXQgPSBiejIuY29tcHJlc3MoaW5wdXQpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2RlZiBiejJfZGVjb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgRGVjb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgaW5wdXQgbXVzdCBiZSBhbiBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgdGhlIGJmX2dldHJlYWRidWYKKyAgICAgICAgYnVmZmVyIHNsb3QuIFB5dGhvbiBzdHJpbmdzLCBidWZmZXIgb2JqZWN0cyBhbmQgbWVtb3J5CisgICAgICAgIG1hcHBlZCBmaWxlcyBhcmUgZXhhbXBsZXMgb2Ygb2JqZWN0cyBwcm92aWRpbmcgdGhpcyBzbG90LgorCisgICAgICAgIGVycm9ycyBkZWZpbmVzIHRoZSBlcnJvciBoYW5kbGluZyB0byBhcHBseS4gSXQgZGVmYXVsdHMgdG8KKyAgICAgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAorICAgICAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICBvdXRwdXQgPSBiejIuZGVjb21wcmVzcyhpbnB1dCkKKyAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBiejJfZW5jb2RlKGlucHV0LCBlcnJvcnMpCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGJ6Ml9kZWNvZGUoaW5wdXQsIGVycm9ycykKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIHNlbGYuY29tcHJlc3NvYmogPSBiejIuQloyQ29tcHJlc3NvcigpCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIGlmIGZpbmFsOgorICAgICAgICAgICAgYyA9IHNlbGYuY29tcHJlc3NvYmouY29tcHJlc3MoaW5wdXQpCisgICAgICAgICAgICByZXR1cm4gYyArIHNlbGYuY29tcHJlc3NvYmouZmx1c2goKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tcHJlc3NvYmouY29tcHJlc3MoaW5wdXQpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuY29tcHJlc3NvYmogPSBiejIuQloyQ29tcHJlc3NvcigpCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBzZWxmLmRlY29tcHJlc3NvYmogPSBiejIuQloyRGVjb21wcmVzc29yKCkKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb21wcmVzc29iai5kZWNvbXByZXNzKGlucHV0KQorICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gJycKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5kZWNvbXByZXNzb2JqID0gYnoyLkJaMkRlY29tcHJlc3NvcigpCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0iYnoyIiwKKyAgICAgICAgZW5jb2RlPWJ6Ml9lbmNvZGUsCisgICAgICAgIGRlY29kZT1iejJfZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2J6Ml9jb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYTI4YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2J6Ml9jb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZjIyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9iejJfY29kZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NoYXJtYXAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jaGFybWFwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMTg5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jaGFybWFwLnB5CkBAIC0wLDAgKzEsNjkgQEAKKyIiIiBHZW5lcmljIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYy4KKworICAgIFVzZSB0aGlzIGNvZGVjIGRpcmVjdGx5IHJhdGhlciB0aGFuIHRocm91Z2ggdGhlIGF1dG9tYXRpYworICAgIGNvbnZlcnNpb24gbWVjaGFuaXNtcyBzdXBwbGllZCBieSB1bmljb2RlKCkgYW5kIC5lbmNvZGUoKS4KKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgIyBOb3RlOiBCaW5kaW5nIHRoZXNlIGFzIEMgZnVuY3Rpb25zIHdpbGwgcmVzdWx0IGluIHRoZSBjbGFzcyBub3QKKyAgICAjIGNvbnZlcnRpbmcgdGhlbSB0byBtZXRob2RzLiBUaGlzIGlzIGludGVuZGVkLgorICAgIGVuY29kZSA9IGNvZGVjcy5jaGFybWFwX2VuY29kZQorICAgIGRlY29kZSA9IGNvZGVjcy5jaGFybWFwX2RlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0JywgbWFwcGluZz1Ob25lKToKKyAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlci5fX2luaXRfXyhzZWxmLCBlcnJvcnMpCisgICAgICAgIHNlbGYubWFwcGluZyA9IG1hcHBpbmcKKworICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMsIHNlbGYubWFwcGluZylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcsIG1hcHBpbmc9Tm9uZSk6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLm1hcHBpbmcgPSBtYXBwaW5nCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzLCBzZWxmLm1hcHBpbmcpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnM9J3N0cmljdCcsbWFwcGluZz1Ob25lKToKKyAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnMpCisgICAgICAgIHNlbGYubWFwcGluZyA9IG1hcHBpbmcKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gQ29kZWMuZW5jb2RlKGlucHV0LGVycm9ycyxzZWxmLm1hcHBpbmcpCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnM9J3N0cmljdCcsbWFwcGluZz1Ob25lKToKKyAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLHN0cmVhbSxlcnJvcnMpCisgICAgICAgIHNlbGYubWFwcGluZyA9IG1hcHBpbmcKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gQ29kZWMuZGVjb2RlKGlucHV0LGVycm9ycyxzZWxmLm1hcHBpbmcpCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY2hhcm1hcCcsCisgICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jaGFybWFwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM0ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jaGFybWFwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM0ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY2hhcm1hcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AwMzcucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDAzNy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODAyYjg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AwMzcucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AwMzcgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL0VCQ0RJQy9DUDAzNy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDAzNycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHg5YycgICAgICMgIDB4MDQgLT4gQ09OVFJPTAorICAgIHUnXHQnICAgICAgICMgIDB4MDUgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdceDg2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MCisgICAgdSdceDdmJyAgICAgIyAgMHgwNyAtPiBERUxFVEUKKyAgICB1J1x4OTcnICAgICAjICAweDA4IC0+IENPTlRST0wKKyAgICB1J1x4OGQnICAgICAjICAweDA5IC0+IENPTlRST0wKKyAgICB1J1x4OGUnICAgICAjICAweDBBIC0+IENPTlRST0wKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4OWQnICAgICAjICAweDE0IC0+IENPTlRST0wKKyAgICB1J1x4ODUnICAgICAjICAweDE1IC0+IENPTlRST0wKKyAgICB1J1x4MDgnICAgICAjICAweDE2IC0+IEJBQ0tTUEFDRQorICAgIHUnXHg4NycgICAgICMgIDB4MTcgLT4gQ09OVFJPTAorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDkyJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MCisgICAgdSdceDhmJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnXHg4MCcgICAgICMgIDB4MjAgLT4gQ09OVFJPTAorICAgIHUnXHg4MScgICAgICMgIDB4MjEgLT4gQ09OVFJPTAorICAgIHUnXHg4MicgICAgICMgIDB4MjIgLT4gQ09OVFJPTAorICAgIHUnXHg4MycgICAgICMgIDB4MjMgLT4gQ09OVFJPTAorICAgIHUnXHg4NCcgICAgICMgIDB4MjQgLT4gQ09OVFJPTAorICAgIHUnXG4nICAgICAgICMgIDB4MjUgLT4gTElORSBGRUVECisgICAgdSdceDE3JyAgICAgIyAgMHgyNiAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDFiJyAgICAgIyAgMHgyNyAtPiBFU0NBUEUKKyAgICB1J1x4ODgnICAgICAjICAweDI4IC0+IENPTlRST0wKKyAgICB1J1x4ODknICAgICAjICAweDI5IC0+IENPTlRST0wKKyAgICB1J1x4OGEnICAgICAjICAweDJBIC0+IENPTlRST0wKKyAgICB1J1x4OGInICAgICAjICAweDJCIC0+IENPTlRST0wKKyAgICB1J1x4OGMnICAgICAjICAweDJDIC0+IENPTlRST0wKKyAgICB1J1x4MDUnICAgICAjICAweDJEIC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDJFIC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgyRiAtPiBCRUxMCisgICAgdSdceDkwJyAgICAgIyAgMHgzMCAtPiBDT05UUk9MCisgICAgdSdceDkxJyAgICAgIyAgMHgzMSAtPiBDT05UUk9MCisgICAgdSdceDE2JyAgICAgIyAgMHgzMiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDkzJyAgICAgIyAgMHgzMyAtPiBDT05UUk9MCisgICAgdSdceDk0JyAgICAgIyAgMHgzNCAtPiBDT05UUk9MCisgICAgdSdceDk1JyAgICAgIyAgMHgzNSAtPiBDT05UUk9MCisgICAgdSdceDk2JyAgICAgIyAgMHgzNiAtPiBDT05UUk9MCisgICAgdSdceDA0JyAgICAgIyAgMHgzNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDk4JyAgICAgIyAgMHgzOCAtPiBDT05UUk9MCisgICAgdSdceDk5JyAgICAgIyAgMHgzOSAtPiBDT05UUk9MCisgICAgdSdceDlhJyAgICAgIyAgMHgzQSAtPiBDT05UUk9MCisgICAgdSdceDliJyAgICAgIyAgMHgzQiAtPiBDT05UUk9MCisgICAgdSdceDE0JyAgICAgIyAgMHgzQyAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgzRCAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHg5ZScgICAgICMgIDB4M0UgLT4gQ09OVFJPTAorICAgIHUnXHgxYScgICAgICMgIDB4M0YgLT4gU1VCU1RJVFVURQorICAgIHUnICcgICAgICAgICMgIDB4NDAgLT4gU1BBQ0UKKyAgICB1J1x4YTAnICAgICAjICAweDQxIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGUyJyAgICAgIyAgMHg0MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDQzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUwJyAgICAgIyAgMHg0NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHg0NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUzJyAgICAgIyAgMHg0NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU1JyAgICAgIyAgMHg0NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDQ4IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmMScgICAgICMgIDB4NDkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhMicgICAgICMgIDB4NEEgLT4gQ0VOVCBTSUdOCisgICAgdScuJyAgICAgICAgIyAgMHg0QiAtPiBGVUxMIFNUT1AKKyAgICB1JzwnICAgICAgICAjICAweDRDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdScoJyAgICAgICAgIyAgMHg0RCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScrJyAgICAgICAgIyAgMHg0RSAtPiBQTFVTIFNJR04KKyAgICB1J3wnICAgICAgICAjICAweDRGIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1JyYnICAgICAgICAjICAweDUwIC0+IEFNUEVSU0FORAorICAgIHUnXHhlOScgICAgICMgIDB4NTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4NTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg1MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4NTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4NTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4NTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg1NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4NTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhkZicgICAgICMgIDB4NTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdFUk1BTikKKyAgICB1JyEnICAgICAgICAjICAweDVBIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyQnICAgICAgICAjICAweDVCIC0+IERPTExBUiBTSUdOCisgICAgdScqJyAgICAgICAgIyAgMHg1QyAtPiBBU1RFUklTSworICAgIHUnKScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JzsnICAgICAgICAjICAweDVFIC0+IFNFTUlDT0xPTgorICAgIHUnXHhhYycgICAgICMgIDB4NUYgLT4gTk9UIFNJR04KKyAgICB1Jy0nICAgICAgICAjICAweDYwIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLycgICAgICAgICMgIDB4NjEgLT4gU09MSURVUworICAgIHUnXHhjMicgICAgICMgIDB4NjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzQnICAgICAjICAweDYzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzAnICAgICAjICAweDY0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4NjUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMzJyAgICAgIyAgMHg2NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4YzUnICAgICAjICAweDY3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM3JyAgICAgIyAgMHg2OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhkMScgICAgICMgIDB4NjkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGE2JyAgICAgIyAgMHg2QSAtPiBCUk9LRU4gQkFSCisgICAgdScsJyAgICAgICAgIyAgMHg2QiAtPiBDT01NQQorICAgIHUnJScgICAgICAgICMgIDB4NkMgLT4gUEVSQ0VOVCBTSUdOCisgICAgdSdfJyAgICAgICAgIyAgMHg2RCAtPiBMT1cgTElORQorICAgIHUnPicgICAgICAgICMgIDB4NkUgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDZGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J1x4ZjgnICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGM5JyAgICAgIyAgMHg3MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4Y2EnICAgICAjICAweDcyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHg3MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM4JyAgICAgIyAgMHg3NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweDc1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4NzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweDc3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweDc4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnYCcgICAgICAgICMgIDB4NzkgLT4gR1JBVkUgQUNDRU5UCisgICAgdSc6JyAgICAgICAgIyAgMHg3QSAtPiBDT0xPTgorICAgIHUnIycgICAgICAgICMgIDB4N0IgLT4gTlVNQkVSIFNJR04KKyAgICB1J0AnICAgICAgICAjICAweDdDIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1IiciICAgICAgICAjICAweDdEIC0+IEFQT1NUUk9QSEUKKyAgICB1Jz0nICAgICAgICAjICAweDdFIC0+IEVRVUFMUyBTSUdOCisgICAgdSciJyAgICAgICAgIyAgMHg3RiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnXHhkOCcgICAgICMgIDB4ODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnYScgICAgICAgICMgIDB4ODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4ODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnXHhhYicgICAgICMgIDB4OEEgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDhCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhmMCcgICAgICMgIDB4OEMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEVUSCAoSUNFTEFORElDKQorICAgIHUnXHhmZCcgICAgICMgIDB4OEQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhmZScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOIChJQ0VMQU5ESUMpCisgICAgdSdceGIxJyAgICAgIyAgMHg4RiAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjAnICAgICAjICAweDkwIC0+IERFR1JFRSBTSUdOCisgICAgdSdqJyAgICAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdceGFhJyAgICAgIyAgMHg5QSAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4OUIgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGU2JyAgICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIHUnXHhiOCcgICAgICMgIDB4OUQgLT4gQ0VESUxMQQorICAgIHUnXHhjNicgICAgICMgIDB4OUUgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIHUnXHhhNCcgICAgICMgIDB4OUYgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHhiNScgICAgICMgIDB4QTAgLT4gTUlDUk8gU0lHTgorICAgIHUnficgICAgICAgICMgIDB4QTEgLT4gVElMREUKKyAgICB1J3MnICAgICAgICAjICAweEEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHhBMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4QTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweEE1IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHhBNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4QTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweEE4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHhBOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUnXHhhMScgICAgICMgIDB4QUEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhiZicgICAgICMgIDB4QUIgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhkMCcgICAgICMgIDB4QUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRIIChJQ0VMQU5ESUMpCisgICAgdSdceGRkJyAgICAgIyAgMHhBRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZGUnICAgICAjICAweEFFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOIChJQ0VMQU5ESUMpCisgICAgdSdceGFlJyAgICAgIyAgMHhBRiAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J14nICAgICAgICAjICAweEIwIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdceGEzJyAgICAgIyAgMHhCMSAtPiBQT1VORCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhCMiAtPiBZRU4gU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjMgLT4gTUlERExFIERPVAorICAgIHUnXHhhOScgICAgICMgIDB4QjQgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEI1IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGJjJyAgICAgIyAgMHhCNyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEI4IC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QjkgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdbJyAgICAgICAgIyAgMHhCQSAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSddJyAgICAgICAgIyAgMHhCQiAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXHhhZicgICAgICMgIDB4QkMgLT4gTUFDUk9OCisgICAgdSdceGE4JyAgICAgIyAgMHhCRCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjQnICAgICAjICAweEJFIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhkNycgICAgICMgIDB4QkYgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUneycgICAgICAgICMgIDB4QzAgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSdBJyAgICAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdceGFkJyAgICAgIyAgMHhDQSAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhmNCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHhDQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMicgICAgICMgIDB4Q0QgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4Q0UgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNScgICAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnfScgICAgICAgICMgIDB4RDAgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnSicgICAgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4RDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnXHhiOScgICAgICMgIDB4REEgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGZiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweERDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY5JyAgICAgIyAgMHhERCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZhJyAgICAgIyAgMHhERSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXFwnICAgICAgICMgIDB4RTAgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSdceGY3JyAgICAgIyAgMHhFMSAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdTJyAgICAgICAgIyAgMHhFMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHhFMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHhFNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHhFNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHhFOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdceGIyJyAgICAgIyAgMHhFQSAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4ZDQnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ2JyAgICAgIyAgMHhFQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQyJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNScgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdScwJyAgICAgICAgIyAgMHhGMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHhGMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweEYyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4RjMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweEY0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweEY1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweEY2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4RjcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweEY4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHhGOSAtPiBESUdJVCBOSU5FCisgICAgdSdceGIzJyAgICAgIyAgMHhGQSAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhkYicgICAgICMgIDB4RkIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweEZDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDknICAgICAjICAweEZEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RkUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceDlmJyAgICAgIyAgMHhGRiAtPiBDT05UUk9MCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDAzNy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDAzNy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMjkyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMDM3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDAzNy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDAzNy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JhMjkyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMDM3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxZTgwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAwNi5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEwMDYgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlTQy9DUDEwMDYuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMDA2JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x4ODAnICAgICAjICAweDgwIC0+IDxjb250cm9sPgorICAgIHUnXHg4MScgICAgICMgIDB4ODEgLT4gPGNvbnRyb2w+CisgICAgdSdceDgyJyAgICAgIyAgMHg4MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODMnICAgICAjICAweDgzIC0+IDxjb250cm9sPgorICAgIHUnXHg4NCcgICAgICMgIDB4ODQgLT4gPGNvbnRyb2w+CisgICAgdSdceDg1JyAgICAgIyAgMHg4NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODYnICAgICAjICAweDg2IC0+IDxjb250cm9sPgorICAgIHUnXHg4NycgICAgICMgIDB4ODcgLT4gPGNvbnRyb2w+CisgICAgdSdceDg4JyAgICAgIyAgMHg4OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODknICAgICAjICAweDg5IC0+IDxjb250cm9sPgorICAgIHUnXHg4YScgICAgICMgIDB4OEEgLT4gPGNvbnRyb2w+CisgICAgdSdceDhiJyAgICAgIyAgMHg4QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGMnICAgICAjICAweDhDIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZCcgICAgICMgIDB4OEQgLT4gPGNvbnRyb2w+CisgICAgdSdceDhlJyAgICAgIyAgMHg4RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGYnICAgICAjICAweDhGIC0+IDxjb250cm9sPgorICAgIHUnXHg5MCcgICAgICMgIDB4OTAgLT4gPGNvbnRyb2w+CisgICAgdSdceDkxJyAgICAgIyAgMHg5MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTInICAgICAjICAweDkyIC0+IDxjb250cm9sPgorICAgIHUnXHg5MycgICAgICMgIDB4OTMgLT4gPGNvbnRyb2w+CisgICAgdSdceDk0JyAgICAgIyAgMHg5NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTUnICAgICAjICAweDk1IC0+IDxjb250cm9sPgorICAgIHUnXHg5NicgICAgICMgIDB4OTYgLT4gPGNvbnRyb2w+CisgICAgdSdceDk3JyAgICAgIyAgMHg5NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTgnICAgICAjICAweDk4IC0+IDxjb250cm9sPgorICAgIHUnXHg5OScgICAgICMgIDB4OTkgLT4gPGNvbnRyb2w+CisgICAgdSdceDlhJyAgICAgIyAgMHg5QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWInICAgICAjICAweDlCIC0+IDxjb250cm9sPgorICAgIHUnXHg5YycgICAgICMgIDB4OUMgLT4gPGNvbnRyb2w+CisgICAgdSdceDlkJyAgICAgIyAgMHg5RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWUnICAgICAjICAweDlFIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZicgICAgICMgIDB4OUYgLT4gPGNvbnRyb2w+CisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwNmYwJyAgICMgIDB4QTEgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFpFUk8KKyAgICB1J1x1MDZmMScgICAjICAweEEyIC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUKKyAgICB1J1x1MDZmMicgICAjICAweEEzIC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBUV08KKyAgICB1J1x1MDZmMycgICAjICAweEE0IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRQorICAgIHUnXHUwNmY0JyAgICMgIDB4QTUgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEZPVVIKKyAgICB1J1x1MDZmNScgICAjICAweEE2IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFCisgICAgdSdcdTA2ZjYnICAgIyAgMHhBNyAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgU0lYCisgICAgdSdcdTA2ZjcnICAgIyAgMHhBOCAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4KKyAgICB1J1x1MDZmOCcgICAjICAweEE5IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVAorICAgIHUnXHUwNmY5JyAgICMgIDB4QUEgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIE5JTkUKKyAgICB1J1x1MDYwYycgICAjICAweEFCIC0+IEFSQUJJQyBDT01NQQorICAgIHUnXHUwNjFiJyAgICMgIDB4QUMgLT4gQVJBQklDIFNFTUlDT0xPTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1MDYxZicgICAjICAweEFFIC0+IEFSQUJJQyBRVUVTVElPTiBNQVJLCisgICAgdSdcdWZlODEnICAgIyAgMHhBRiAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOGQnICAgIyAgMHhCMCAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZThlJyAgICMgIDB4QjEgLT4gQVJBQklDIExFVFRFUiBBTEVGIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmU4ZScgICAjICAweEIyIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBGSU5BTCBGT1JNCisgICAgdSdcdWZlOGYnICAgIyAgMHhCMyAtPiBBUkFCSUMgTEVUVEVSIEJFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOTEnICAgIyAgMHhCNCAtPiBBUkFCSUMgTEVUVEVSIEJFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmI1NicgICAjICAweEI1IC0+IEFSQUJJQyBMRVRURVIgUEVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmI1OCcgICAjICAweEI2IC0+IEFSQUJJQyBMRVRURVIgUEVIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZTkzJyAgICMgIDB4QjcgLT4gQVJBQklDIExFVFRFUiBURUggTUFSQlVUQSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOTUnICAgIyAgMHhCOCAtPiBBUkFCSUMgTEVUVEVSIFRFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOTcnICAgIyAgMHhCOSAtPiBBUkFCSUMgTEVUVEVSIFRFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmI2NicgICAjICAweEJBIC0+IEFSQUJJQyBMRVRURVIgVFRFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiNjgnICAgIyAgMHhCQiAtPiBBUkFCSUMgTEVUVEVSIFRURUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlOTknICAgIyAgMHhCQyAtPiBBUkFCSUMgTEVUVEVSIFRIRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTliJyAgICMgIDB4QkQgLT4gQVJBQklDIExFVFRFUiBUSEVIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZTlkJyAgICMgIDB4QkUgLT4gQVJBQklDIExFVFRFUiBKRUVNIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU5ZicgICAjICAweEJGIC0+IEFSQUJJQyBMRVRURVIgSkVFTSBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmI3YScgICAjICAweEMwIC0+IEFSQUJJQyBMRVRURVIgVENIRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmYjdjJyAgICMgIDB4QzEgLT4gQVJBQklDIExFVFRFUiBUQ0hFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVhMScgICAjICAweEMyIC0+IEFSQUJJQyBMRVRURVIgSEFIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVhMycgICAjICAweEMzIC0+IEFSQUJJQyBMRVRURVIgSEFIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWE1JyAgICMgIDB4QzQgLT4gQVJBQklDIExFVFRFUiBLSEFIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVhNycgICAjICAweEM1IC0+IEFSQUJJQyBMRVRURVIgS0hBSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVhOScgICAjICAweEM2IC0+IEFSQUJJQyBMRVRURVIgREFMIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmI4NCcgICAjICAweEM3IC0+IEFSQUJJQyBMRVRURVIgREFIQUwgSVNPTEFURUQgRk9STU4KKyAgICB1J1x1ZmVhYicgICAjICAweEM4IC0+IEFSQUJJQyBMRVRURVIgVEhBTCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYWQnICAgIyAgMHhDOSAtPiBBUkFCSUMgTEVUVEVSIFJFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiOGMnICAgIyAgMHhDQSAtPiBBUkFCSUMgTEVUVEVSIFJSRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWFmJyAgICMgIDB4Q0IgLT4gQVJBQklDIExFVFRFUiBaQUlOIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmI4YScgICAjICAweENDIC0+IEFSQUJJQyBMRVRURVIgSkVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmViMScgICAjICAweENEIC0+IEFSQUJJQyBMRVRURVIgU0VFTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYjMnICAgIyAgMHhDRSAtPiBBUkFCSUMgTEVUVEVSIFNFRU4gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYjUnICAgIyAgMHhDRiAtPiBBUkFCSUMgTEVUVEVSIFNIRUVOIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmViNycgICAjICAweEQwIC0+IEFSQUJJQyBMRVRURVIgU0hFRU4gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYjknICAgIyAgMHhEMSAtPiBBUkFCSUMgTEVUVEVSIFNBRCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYmInICAgIyAgMHhEMiAtPiBBUkFCSUMgTEVUVEVSIFNBRCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmViZCcgICAjICAweEQzIC0+IEFSQUJJQyBMRVRURVIgREFEIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmViZicgICAjICAweEQ0IC0+IEFSQUJJQyBMRVRURVIgREFEIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWMxJyAgICMgIDB4RDUgLT4gQVJBQklDIExFVFRFUiBUQUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWM1JyAgICMgIDB4RDYgLT4gQVJBQklDIExFVFRFUiBaQUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWM5JyAgICMgIDB4RDcgLT4gQVJBQklDIExFVFRFUiBBSU4gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWNhJyAgICMgIDB4RDggLT4gQVJBQklDIExFVFRFUiBBSU4gRklOQUwgRk9STQorICAgIHUnXHVmZWNiJyAgICMgIDB4RDkgLT4gQVJBQklDIExFVFRFUiBBSU4gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlY2MnICAgIyAgMHhEQSAtPiBBUkFCSUMgTEVUVEVSIEFJTiBNRURJQUwgRk9STQorICAgIHUnXHVmZWNkJyAgICMgIDB4REIgLT4gQVJBQklDIExFVFRFUiBHSEFJTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlY2UnICAgIyAgMHhEQyAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmVjZicgICAjICAweEREIC0+IEFSQUJJQyBMRVRURVIgR0hBSU4gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZDAnICAgIyAgMHhERSAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOIE1FRElBTCBGT1JNCisgICAgdSdcdWZlZDEnICAgIyAgMHhERiAtPiBBUkFCSUMgTEVUVEVSIEZFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZDMnICAgIyAgMHhFMCAtPiBBUkFCSUMgTEVUVEVSIEZFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVkNScgICAjICAweEUxIC0+IEFSQUJJQyBMRVRURVIgUUFGIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVkNycgICAjICAweEUyIC0+IEFSQUJJQyBMRVRURVIgUUFGIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWQ5JyAgICMgIDB4RTMgLT4gQVJBQklDIExFVFRFUiBLQUYgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWRiJyAgICMgIDB4RTQgLT4gQVJBQklDIExFVFRFUiBLQUYgSU5JVElBTCBGT1JNCisgICAgdSdcdWZiOTInICAgIyAgMHhFNSAtPiBBUkFCSUMgTEVUVEVSIEdBRiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZiOTQnICAgIyAgMHhFNiAtPiBBUkFCSUMgTEVUVEVSIEdBRiBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVkZCcgICAjICAweEU3IC0+IEFSQUJJQyBMRVRURVIgTEFNIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVkZicgICAjICAweEU4IC0+IEFSQUJJQyBMRVRURVIgTEFNIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWUwJyAgICMgIDB4RTkgLT4gQVJBQklDIExFVFRFUiBMQU0gTUVESUFMIEZPUk0KKyAgICB1J1x1ZmVlMScgICAjICAweEVBIC0+IEFSQUJJQyBMRVRURVIgTUVFTSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZTMnICAgIyAgMHhFQiAtPiBBUkFCSUMgTEVUVEVSIE1FRU0gSU5JVElBTCBGT1JNCisgICAgdSdcdWZiOWUnICAgIyAgMHhFQyAtPiBBUkFCSUMgTEVUVEVSIE5PT04gR0hVTk5BIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVlNScgICAjICAweEVEIC0+IEFSQUJJQyBMRVRURVIgTk9PTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZTcnICAgIyAgMHhFRSAtPiBBUkFCSUMgTEVUVEVSIE5PT04gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlODUnICAgIyAgMHhFRiAtPiBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVlZCcgICAjICAweEYwIC0+IEFSQUJJQyBMRVRURVIgV0FXIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmJhNicgICAjICAweEYxIC0+IEFSQUJJQyBMRVRURVIgSEVIIEdPQUwgSVNPTEFURUQgRk9STQorICAgIHUnXHVmYmE4JyAgICMgIDB4RjIgLT4gQVJBQklDIExFVFRFUiBIRUggR09BTCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmJhOScgICAjICAweEYzIC0+IEFSQUJJQyBMRVRURVIgSEVIIEdPQUwgTUVESUFMIEZPUk0KKyAgICB1J1x1ZmJhYScgICAjICAweEY0IC0+IEFSQUJJQyBMRVRURVIgSEVIIERPQUNIQVNITUVFIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU4MCcgICAjICAweEY1IC0+IEFSQUJJQyBMRVRURVIgSEFNWkEgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTg5JyAgICMgIDB4RjYgLT4gQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOGEnICAgIyAgMHhGNyAtPiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmU4YicgICAjICAweEY4IC0+IEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUgSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZjEnICAgIyAgMHhGOSAtPiBBUkFCSUMgTEVUVEVSIFlFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZjInICAgIyAgMHhGQSAtPiBBUkFCSUMgTEVUVEVSIFlFSCBGSU5BTCBGT1JNCisgICAgdSdcdWZlZjMnICAgIyAgMHhGQiAtPiBBUkFCSUMgTEVUVEVSIFlFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmJiMCcgICAjICAweEZDIC0+IEFSQUJJQyBMRVRURVIgWUVIIEJBUlJFRSBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmJhZScgICAjICAweEZEIC0+IEFSQUJJQyBMRVRURVIgWUVIIEJBUlJFRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlN2MnICAgIyAgMHhGRSAtPiBBUkFCSUMgU0hBRERBIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU3ZCcgICAjICAweEZGIC0+IEFSQUJJQyBTSEFEREEgTUVESUFMIEZPUk0KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAwNi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2RlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAwNi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxY2RlMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMDYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAyNi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAyNi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJiZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMDI2LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMTAyNiBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvRUJDRElDL0NQMTAyNi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEwMjYnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4OWMnICAgICAjICAweDA0IC0+IENPTlRST0wKKyAgICB1J1x0JyAgICAgICAjICAweDA1IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXHg4NicgICAgICMgIDB4MDYgLT4gQ09OVFJPTAorICAgIHUnXHg3ZicgICAgICMgIDB4MDcgLT4gREVMRVRFCisgICAgdSdceDk3JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MCisgICAgdSdceDhkJyAgICAgIyAgMHgwOSAtPiBDT05UUk9MCisgICAgdSdceDhlJyAgICAgIyAgMHgwQSAtPiBDT05UUk9MCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDlkJyAgICAgIyAgMHgxNCAtPiBDT05UUk9MCisgICAgdSdceDg1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MCisgICAgdSdceDA4JyAgICAgIyAgMHgxNiAtPiBCQUNLU1BBQ0UKKyAgICB1J1x4ODcnICAgICAjICAweDE3IC0+IENPTlRST0wKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHg5MicgICAgICMgIDB4MUEgLT4gQ09OVFJPTAorICAgIHUnXHg4ZicgICAgICMgIDB4MUIgLT4gQ09OVFJPTAorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1J1x4ODAnICAgICAjICAweDIwIC0+IENPTlRST0wKKyAgICB1J1x4ODEnICAgICAjICAweDIxIC0+IENPTlRST0wKKyAgICB1J1x4ODInICAgICAjICAweDIyIC0+IENPTlRST0wKKyAgICB1J1x4ODMnICAgICAjICAweDIzIC0+IENPTlRST0wKKyAgICB1J1x4ODQnICAgICAjICAweDI0IC0+IENPTlRST0wKKyAgICB1J1xuJyAgICAgICAjICAweDI1IC0+IExJTkUgRkVFRAorICAgIHUnXHgxNycgICAgICMgIDB4MjYgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxYicgICAgICMgIDB4MjcgLT4gRVNDQVBFCisgICAgdSdceDg4JyAgICAgIyAgMHgyOCAtPiBDT05UUk9MCisgICAgdSdceDg5JyAgICAgIyAgMHgyOSAtPiBDT05UUk9MCisgICAgdSdceDhhJyAgICAgIyAgMHgyQSAtPiBDT05UUk9MCisgICAgdSdceDhiJyAgICAgIyAgMHgyQiAtPiBDT05UUk9MCisgICAgdSdceDhjJyAgICAgIyAgMHgyQyAtPiBDT05UUk9MCisgICAgdSdceDA1JyAgICAgIyAgMHgyRCAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgyRSAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MkYgLT4gQkVMTAorICAgIHUnXHg5MCcgICAgICMgIDB4MzAgLT4gQ09OVFJPTAorICAgIHUnXHg5MScgICAgICMgIDB4MzEgLT4gQ09OVFJPTAorICAgIHUnXHgxNicgICAgICMgIDB4MzIgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHg5MycgICAgICMgIDB4MzMgLT4gQ09OVFJPTAorICAgIHUnXHg5NCcgICAgICMgIDB4MzQgLT4gQ09OVFJPTAorICAgIHUnXHg5NScgICAgICMgIDB4MzUgLT4gQ09OVFJPTAorICAgIHUnXHg5NicgICAgICMgIDB4MzYgLT4gQ09OVFJPTAorICAgIHUnXHgwNCcgICAgICMgIDB4MzcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHg5OCcgICAgICMgIDB4MzggLT4gQ09OVFJPTAorICAgIHUnXHg5OScgICAgICMgIDB4MzkgLT4gQ09OVFJPTAorICAgIHUnXHg5YScgICAgICMgIDB4M0EgLT4gQ09OVFJPTAorICAgIHUnXHg5YicgICAgICMgIDB4M0IgLT4gQ09OVFJPTAorICAgIHUnXHgxNCcgICAgICMgIDB4M0MgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4M0QgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4OWUnICAgICAjICAweDNFIC0+IENPTlRST0wKKyAgICB1J1x4MWEnICAgICAjICAweDNGIC0+IFNVQlNUSVRVVEUKKyAgICB1JyAnICAgICAgICAjICAweDQwIC0+IFNQQUNFCisgICAgdSdceGEwJyAgICAgIyAgMHg0MSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhlMicgICAgICMgIDB4NDIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHg0MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMCcgICAgICMgIDB4NDQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4NDUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMycgICAgICMgIDB4NDYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNScgICAgICMgIDB4NDcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSd7JyAgICAgICAgIyAgMHg0OCAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J1x4ZjEnICAgICAjICAweDQ5IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YzcnICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdScuJyAgICAgICAgIyAgMHg0QiAtPiBGVUxMIFNUT1AKKyAgICB1JzwnICAgICAgICAjICAweDRDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdScoJyAgICAgICAgIyAgMHg0RCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScrJyAgICAgICAgIyAgMHg0RSAtPiBQTFVTIFNJR04KKyAgICB1JyEnICAgICAgICAjICAweDRGIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyYnICAgICAgICAjICAweDUwIC0+IEFNUEVSU0FORAorICAgIHUnXHhlOScgICAgICMgIDB4NTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4NTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg1MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4NTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4NTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4NTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg1NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4NTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhkZicgICAgICMgIDB4NTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdFUk1BTikKKyAgICB1J1x1MDExZScgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHUwMTMwJyAgICMgIDB4NUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRQorICAgIHUnKicgICAgICAgICMgIDB4NUMgLT4gQVNURVJJU0sKKyAgICB1JyknICAgICAgICAjICAweDVEIC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdSc7JyAgICAgICAgIyAgMHg1RSAtPiBTRU1JQ09MT04KKyAgICB1J14nICAgICAgICAjICAweDVGIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSctJyAgICAgICAgIyAgMHg2MCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy8nICAgICAgICAjICAweDYxIC0+IFNPTElEVVMKKyAgICB1J1x4YzInICAgICAjICAweDYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGM0JyAgICAgIyAgMHg2MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGMwJyAgICAgIyAgMHg2NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweDY1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMycgICAgICMgIDB4NjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM1JyAgICAgIyAgMHg2NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnWycgICAgICAgICMgIDB4NjggLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXHhkMScgICAgICMgIDB4NjkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdcdTAxNWYnICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1JywnICAgICAgICAjICAweDZCIC0+IENPTU1BCisgICAgdSclJyAgICAgICAgIyAgMHg2QyAtPiBQRVJDRU5UIFNJR04KKyAgICB1J18nICAgICAgICAjICAweDZEIC0+IExPVyBMSU5FCisgICAgdSc+JyAgICAgICAgIyAgMHg2RSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4NkYgLT4gUVVFU1RJT04gTUFSSworICAgIHUnXHhmOCcgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YzknICAgICAjICAweDcxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4NzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweDczIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweDc0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4NzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHg3NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4NzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4NzggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdcdTAxMzEnICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgdSc6JyAgICAgICAgIyAgMHg3QSAtPiBDT0xPTgorICAgIHUnXHhkNicgICAgICMgIDB4N0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTVlJyAgICMgIDB4N0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1IiciICAgICAgICAjICAweDdEIC0+IEFQT1NUUk9QSEUKKyAgICB1Jz0nICAgICAgICAjICAweDdFIC0+IEVRVUFMUyBTSUdOCisgICAgdSdceGRjJyAgICAgIyAgMHg3RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ4JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdhJyAgICAgICAgIyAgMHg4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4ODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4ODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdceGFiJyAgICAgIyAgMHg4QSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4OEIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSd9JyAgICAgICAgIyAgMHg4QyAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSdgJyAgICAgICAgIyAgMHg4RCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J1x4YTYnICAgICAjICAweDhFIC0+IEJST0tFTiBCQVIKKyAgICB1J1x4YjEnICAgICAjICAweDhGIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMCcgICAgICMgIDB4OTAgLT4gREVHUkVFIFNJR04KKyAgICB1J2onICAgICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J1x4YWEnICAgICAjICAweDlBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHg5QiAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4ZTYnICAgICAjICAweDlDIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGI4JyAgICAgIyAgMHg5RCAtPiBDRURJTExBCisgICAgdSdceGM2JyAgICAgIyAgMHg5RSAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdceGE0JyAgICAgIyAgMHg5RiAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGI1JyAgICAgIyAgMHhBMCAtPiBNSUNSTyBTSUdOCisgICAgdSdceGY2JyAgICAgIyAgMHhBMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUncycgICAgICAgICMgIDB4QTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweEEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHhBNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4QTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweEE2IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4QTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweEE5IC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSdceGExJyAgICAgIyAgMHhBQSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGJmJyAgICAgIyAgMHhBQiAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSddJyAgICAgICAgIyAgMHhBQyAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnJCcgICAgICAgICMgIDB4QUQgLT4gRE9MTEFSIFNJR04KKyAgICB1J0AnICAgICAgICAjICAweEFFIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J1x4YWUnICAgICAjICAweEFGIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhMicgICAgICMgIDB4QjAgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhCMSAtPiBQT1VORCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhCMiAtPiBZRU4gU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjMgLT4gTUlERExFIERPVAorICAgIHUnXHhhOScgICAgICMgIDB4QjQgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEI1IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGJjJyAgICAgIyAgMHhCNyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEI4IC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QjkgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGFjJyAgICAgIyAgMHhCQSAtPiBOT1QgU0lHTgorICAgIHUnfCcgICAgICAgICMgIDB4QkIgLT4gVkVSVElDQUwgTElORQorICAgIHUnXHhhZicgICAgICMgIDB4QkMgLT4gTUFDUk9OCisgICAgdSdceGE4JyAgICAgIyAgMHhCRCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjQnICAgICAjICAweEJFIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhkNycgICAgICMgIDB4QkYgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhlNycgICAgICMgIDB4QzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdBJyAgICAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdceGFkJyAgICAgIyAgMHhDQSAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhmNCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSd+JyAgICAgICAgIyAgMHhDQyAtPiBUSUxERQorICAgIHUnXHhmMicgICAgICMgIDB4Q0QgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4Q0UgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNScgICAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHUwMTFmJyAgICMgIDB4RDAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnSicgICAgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4RDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnXHhiOScgICAgICMgIDB4REEgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGZiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1xcJyAgICAgICAjICAweERDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXHhmOScgICAgICMgIDB4REQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4REUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZmMnICAgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhFMSAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdTJyAgICAgICAgIyAgMHhFMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHhFMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHhFNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHhFNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHhFOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdceGIyJyAgICAgIyAgMHhFQSAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4ZDQnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdScjJyAgICAgICAgIyAgMHhFQyAtPiBOVU1CRVIgU0lHTgorICAgIHUnXHhkMicgICAgICMgIDB4RUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDUnICAgICAjICAweEVGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnMCcgICAgICAgICMgIDB4RjAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4RjEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHhGMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweEYzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHhGNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHhGNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHhGNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweEY3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHhGOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4RjkgLT4gRElHSVQgTklORQorICAgIHUnXHhiMycgICAgICMgIDB4RkEgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4ZGInICAgICAjICAweEZCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSciJyAgICAgICAgIyAgMHhGQyAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnXHhkOScgICAgICMgIDB4RkQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhGRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4OWYnICAgICAjICAweEZGIC0+IENPTlRST0wKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAyNi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGMwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTAyNi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOGMwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEwMjYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTE0MC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTE0MC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTUwN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMTQwLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMTE0MCBnZW5lcmF0ZWQgZnJvbSAncHl0aG9uLW1hcHBpbmdzL0NQMTE0MC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDExNDAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4OWMnICAgICAjICAweDA0IC0+IENPTlRST0wKKyAgICB1J1x0JyAgICAgICAjICAweDA1IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXHg4NicgICAgICMgIDB4MDYgLT4gQ09OVFJPTAorICAgIHUnXHg3ZicgICAgICMgIDB4MDcgLT4gREVMRVRFCisgICAgdSdceDk3JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MCisgICAgdSdceDhkJyAgICAgIyAgMHgwOSAtPiBDT05UUk9MCisgICAgdSdceDhlJyAgICAgIyAgMHgwQSAtPiBDT05UUk9MCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDlkJyAgICAgIyAgMHgxNCAtPiBDT05UUk9MCisgICAgdSdceDg1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MCisgICAgdSdceDA4JyAgICAgIyAgMHgxNiAtPiBCQUNLU1BBQ0UKKyAgICB1J1x4ODcnICAgICAjICAweDE3IC0+IENPTlRST0wKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHg5MicgICAgICMgIDB4MUEgLT4gQ09OVFJPTAorICAgIHUnXHg4ZicgICAgICMgIDB4MUIgLT4gQ09OVFJPTAorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1J1x4ODAnICAgICAjICAweDIwIC0+IENPTlRST0wKKyAgICB1J1x4ODEnICAgICAjICAweDIxIC0+IENPTlRST0wKKyAgICB1J1x4ODInICAgICAjICAweDIyIC0+IENPTlRST0wKKyAgICB1J1x4ODMnICAgICAjICAweDIzIC0+IENPTlRST0wKKyAgICB1J1x4ODQnICAgICAjICAweDI0IC0+IENPTlRST0wKKyAgICB1J1xuJyAgICAgICAjICAweDI1IC0+IExJTkUgRkVFRAorICAgIHUnXHgxNycgICAgICMgIDB4MjYgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxYicgICAgICMgIDB4MjcgLT4gRVNDQVBFCisgICAgdSdceDg4JyAgICAgIyAgMHgyOCAtPiBDT05UUk9MCisgICAgdSdceDg5JyAgICAgIyAgMHgyOSAtPiBDT05UUk9MCisgICAgdSdceDhhJyAgICAgIyAgMHgyQSAtPiBDT05UUk9MCisgICAgdSdceDhiJyAgICAgIyAgMHgyQiAtPiBDT05UUk9MCisgICAgdSdceDhjJyAgICAgIyAgMHgyQyAtPiBDT05UUk9MCisgICAgdSdceDA1JyAgICAgIyAgMHgyRCAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgyRSAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MkYgLT4gQkVMTAorICAgIHUnXHg5MCcgICAgICMgIDB4MzAgLT4gQ09OVFJPTAorICAgIHUnXHg5MScgICAgICMgIDB4MzEgLT4gQ09OVFJPTAorICAgIHUnXHgxNicgICAgICMgIDB4MzIgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHg5MycgICAgICMgIDB4MzMgLT4gQ09OVFJPTAorICAgIHUnXHg5NCcgICAgICMgIDB4MzQgLT4gQ09OVFJPTAorICAgIHUnXHg5NScgICAgICMgIDB4MzUgLT4gQ09OVFJPTAorICAgIHUnXHg5NicgICAgICMgIDB4MzYgLT4gQ09OVFJPTAorICAgIHUnXHgwNCcgICAgICMgIDB4MzcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHg5OCcgICAgICMgIDB4MzggLT4gQ09OVFJPTAorICAgIHUnXHg5OScgICAgICMgIDB4MzkgLT4gQ09OVFJPTAorICAgIHUnXHg5YScgICAgICMgIDB4M0EgLT4gQ09OVFJPTAorICAgIHUnXHg5YicgICAgICMgIDB4M0IgLT4gQ09OVFJPTAorICAgIHUnXHgxNCcgICAgICMgIDB4M0MgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4M0QgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4OWUnICAgICAjICAweDNFIC0+IENPTlRST0wKKyAgICB1J1x4MWEnICAgICAjICAweDNGIC0+IFNVQlNUSVRVVEUKKyAgICB1JyAnICAgICAgICAjICAweDQwIC0+IFNQQUNFCisgICAgdSdceGEwJyAgICAgIyAgMHg0MSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhlMicgICAgICMgIDB4NDIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHg0MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMCcgICAgICMgIDB4NDQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4NDUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMycgICAgICMgIDB4NDYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNScgICAgICMgIDB4NDcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHg0OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZjEnICAgICAjICAweDQ5IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YTInICAgICAjICAweDRBIC0+IENFTlQgU0lHTgorICAgIHUnLicgICAgICAgICMgIDB4NEIgLT4gRlVMTCBTVE9QCisgICAgdSc8JyAgICAgICAgIyAgMHg0QyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnKCcgICAgICAgICMgIDB4NEQgLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKycgICAgICAgICMgIDB4NEUgLT4gUExVUyBTSUdOCisgICAgdSd8JyAgICAgICAgIyAgMHg0RiAtPiBWRVJUSUNBTCBMSU5FCisgICAgdScmJyAgICAgICAgIyAgMHg1MCAtPiBBTVBFUlNBTkQKKyAgICB1J1x4ZTknICAgICAjICAweDUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweDUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4NTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweDU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweDU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4NTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweDU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZGYnICAgICAjICAweDU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgdSchJyAgICAgICAgIyAgMHg1QSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSckJyAgICAgICAgIyAgMHg1QiAtPiBET0xMQVIgU0lHTgorICAgIHUnKicgICAgICAgICMgIDB4NUMgLT4gQVNURVJJU0sKKyAgICB1JyknICAgICAgICAjICAweDVEIC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdSc7JyAgICAgICAgIyAgMHg1RSAtPiBTRU1JQ09MT04KKyAgICB1J1x4YWMnICAgICAjICAweDVGIC0+IE5PVCBTSUdOCisgICAgdSctJyAgICAgICAgIyAgMHg2MCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy8nICAgICAgICAjICAweDYxIC0+IFNPTElEVVMKKyAgICB1J1x4YzInICAgICAjICAweDYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGM0JyAgICAgIyAgMHg2MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGMwJyAgICAgIyAgMHg2NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweDY1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMycgICAgICMgIDB4NjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM1JyAgICAgIyAgMHg2NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4NjggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZDEnICAgICAjICAweDY5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhNicgICAgICMgIDB4NkEgLT4gQlJPS0VOIEJBUgorICAgIHUnLCcgICAgICAgICMgIDB4NkIgLT4gQ09NTUEKKyAgICB1JyUnICAgICAgICAjICAweDZDIC0+IFBFUkNFTlQgU0lHTgorICAgIHUnXycgICAgICAgICMgIDB4NkQgLT4gTE9XIExJTkUKKyAgICB1Jz4nICAgICAgICAjICAweDZFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHg2RiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdceGY4JyAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhjOScgICAgICMgIDB4NzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGNhJyAgICAgIyAgMHg3MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYicgICAgICMgIDB4NzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4NzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHg3NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweDc2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHg3NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHg3OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J2AnICAgICAgICAjICAweDc5IC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnOicgICAgICAgICMgIDB4N0EgLT4gQ09MT04KKyAgICB1JyMnICAgICAgICAjICAweDdCIC0+IE5VTUJFUiBTSUdOCisgICAgdSdAJyAgICAgICAgIyAgMHg3QyAtPiBDT01NRVJDSUFMIEFUCisgICAgdSInIiAgICAgICAgIyAgMHg3RCAtPiBBUE9TVFJPUEhFCisgICAgdSc9JyAgICAgICAgIyAgMHg3RSAtPiBFUVVBTFMgU0lHTgorICAgIHUnIicgICAgICAgICMgIDB4N0YgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZDgnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J2EnICAgICAgICAjICAweDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4ODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J1x4YWInICAgICAjICAweDhBIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHg4QiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjAnICAgICAjICAweDhDIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEggKElDRUxBTkRJQykKKyAgICB1J1x4ZmQnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZmUnICAgICAjICAweDhFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAoSUNFTEFORElDKQorICAgIHUnXHhiMScgICAgICMgIDB4OEYgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIwJyAgICAgIyAgMHg5MCAtPiBERUdSRUUgU0lHTgorICAgIHUnaicgICAgICAgICMgIDB4OTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUnXHhhYScgICAgICMgIDB4OUEgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDlCIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhlNicgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICB1J1x4YjgnICAgICAjICAweDlEIC0+IENFRElMTEEKKyAgICB1J1x4YzYnICAgICAjICAweDlFIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x1MjBhYycgICAjICAweDlGIC0+IEVVUk8gU0lHTgorICAgIHUnXHhiNScgICAgICMgIDB4QTAgLT4gTUlDUk8gU0lHTgorICAgIHUnficgICAgICAgICMgIDB4QTEgLT4gVElMREUKKyAgICB1J3MnICAgICAgICAjICAweEEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHhBMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4QTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweEE1IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHhBNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4QTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweEE4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHhBOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUnXHhhMScgICAgICMgIDB4QUEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhiZicgICAgICMgIDB4QUIgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhkMCcgICAgICMgIDB4QUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRIIChJQ0VMQU5ESUMpCisgICAgdSdceGRkJyAgICAgIyAgMHhBRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZGUnICAgICAjICAweEFFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOIChJQ0VMQU5ESUMpCisgICAgdSdceGFlJyAgICAgIyAgMHhBRiAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J14nICAgICAgICAjICAweEIwIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdceGEzJyAgICAgIyAgMHhCMSAtPiBQT1VORCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhCMiAtPiBZRU4gU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjMgLT4gTUlERExFIERPVAorICAgIHUnXHhhOScgICAgICMgIDB4QjQgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEI1IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGJjJyAgICAgIyAgMHhCNyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEI4IC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QjkgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdbJyAgICAgICAgIyAgMHhCQSAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSddJyAgICAgICAgIyAgMHhCQiAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXHhhZicgICAgICMgIDB4QkMgLT4gTUFDUk9OCisgICAgdSdceGE4JyAgICAgIyAgMHhCRCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjQnICAgICAjICAweEJFIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhkNycgICAgICMgIDB4QkYgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUneycgICAgICAgICMgIDB4QzAgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSdBJyAgICAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdceGFkJyAgICAgIyAgMHhDQSAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhmNCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHhDQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMicgICAgICMgIDB4Q0QgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4Q0UgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNScgICAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnfScgICAgICAgICMgIDB4RDAgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnSicgICAgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4RDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4RDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnXHhiOScgICAgICMgIDB4REEgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGZiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweERDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY5JyAgICAgIyAgMHhERCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZhJyAgICAgIyAgMHhERSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXFwnICAgICAgICMgIDB4RTAgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSdceGY3JyAgICAgIyAgMHhFMSAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdTJyAgICAgICAgIyAgMHhFMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHhFMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHhFNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHhFNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHhFOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdceGIyJyAgICAgIyAgMHhFQSAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4ZDQnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ2JyAgICAgIyAgMHhFQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQyJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNScgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdScwJyAgICAgICAgIyAgMHhGMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHhGMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweEYyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4RjMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweEY0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweEY1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweEY2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4RjcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweEY4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHhGOSAtPiBESUdJVCBOSU5FCisgICAgdSdceGIzJyAgICAgIyAgMHhGQSAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhkYicgICAgICMgIDB4RkIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweEZDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDknICAgICAjICAweEZEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RkUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceDlmJyAgICAgIyAgMHhGRiAtPiBDT05UUk9MCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDExNDAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMTQwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTEwYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMTQwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDExNDAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMTQwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTEwYjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMTQwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyMGI4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEyNTAgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1AxMjUwLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwMTI1MCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTIwYWMnICAgIyAgMHg4MCAtPiBFVVJPIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDgxIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDFhJyAgICMgIDB4ODIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdWZmZmUnICAgIyAgMHg4MyAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxZScgICAjICAweDg0IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4ODUgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4ODYgLT4gREFHR0VSCisgICAgdSdcdTIwMjEnICAgIyAgMHg4NyAtPiBET1VCTEUgREFHR0VSCisgICAgdSdcdWZmZmUnICAgIyAgMHg4OCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAzMCcgICAjICAweDg5IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdcdTAxNjAnICAgIyAgMHg4QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjAzOScgICAjICAweDhCIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNWEnICAgIyAgMHg4QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2NCcgICAjICAweDhEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTdkJyAgICMgIDB4OEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxNzknICAgIyAgMHg4RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1ZmZmZScgICAjICAweDkwIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDE4JyAgICMgIDB4OTEgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweDkyIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFjJyAgICMgIDB4OTMgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweDk0IC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDIyJyAgICMgIDB4OTUgLT4gQlVMTEVUCisgICAgdSdcdTIwMTMnICAgIyAgMHg5NiAtPiBFTiBEQVNICisgICAgdSdcdTIwMTQnICAgIyAgMHg5NyAtPiBFTSBEQVNICisgICAgdSdcdWZmZmUnICAgIyAgMHg5OCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjEyMicgICAjICAweDk5IC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHUwMTYxJyAgICMgIDB4OUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNWInICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNjUnICAgIyAgMHg5RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENBUk9OCisgICAgdSdcdTAxN2UnICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxN2EnICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwMmM3JyAgICMgIDB4QTEgLT4gQ0FST04KKyAgICB1J1x1MDJkOCcgICAjICAweEEyIC0+IEJSRVZFCisgICAgdSdcdTAxNDEnICAgIyAgMHhBMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTAxMDQnICAgIyAgMHhBNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MDE1ZScgICAjICAweEFBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x1MDE3YicgICAjICAweEFGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MDJkYicgICAjICAweEIyIC0+IE9HT05FSworICAgIHUnXHUwMTQyJyAgICMgIDB4QjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdcdTAxMDUnICAgIyAgMHhCOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTVmJyAgICMgIDB4QkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDEzZCcgICAjICAweEJDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgIHUnXHUwMmRkJyAgICMgIDB4QkQgLT4gRE9VQkxFIEFDVVRFIEFDQ0VOVAorICAgIHUnXHUwMTNlJyAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgIHUnXHUwMTdjJyAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE1NCcgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTAyJyAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMzknICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwNicgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhjNycgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEwYycgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhjOScgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTgnICAgIyAgMHhDQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMWEnICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST04KKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwZScgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTEwJyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTQzJyAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDcnICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE1MCcgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDE1OCcgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIHUnXHUwMTZlJyAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTcwJyAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkZCcgICAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNjInICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x1MDE1NScgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICB1J1x4ZTEnICAgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweEUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTAzJyAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEzYScgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwNycgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTBkJyAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTE5JyAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMWInICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwZicgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x1MDExMScgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgdSdcdTAxNDQnICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDgnICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE1MScgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUwMTU5JyAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIHUnXHUwMTZmJyAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGZhJyAgICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzEnICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZmQnICAgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2MycgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMmQ5JyAgICMgIDB4RkYgLT4gRE9UIEFCT1ZFCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRmZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRmZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2NzcxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MS5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEyNTEgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1AxMjUxLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwMTI1MScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTA0MDInICAgIyAgMHg4MCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBESkUKKyAgICB1J1x1MDQwMycgICAjICAweDgxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdKRQorICAgIHUnXHUyMDFhJyAgICMgIDB4ODIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTA0NTMnICAgIyAgMHg4MyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFCisgICAgdSdcdTIwMWUnICAgIyAgMHg4NCAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweDg1IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x1MjAyMCcgICAjICAweDg2IC0+IERBR0dFUgorICAgIHUnXHUyMDIxJyAgICMgIDB4ODcgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHUyMGFjJyAgICMgIDB4ODggLT4gRVVSTyBTSUdOCisgICAgdSdcdTIwMzAnICAgIyAgMHg4OSAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHUwNDA5JyAgICMgIDB4OEEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTEpFCisgICAgdSdcdTIwMzknICAgIyAgMHg4QiAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwNDBhJyAgICMgIDB4OEMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFCisgICAgdSdcdTA0MGMnICAgIyAgMHg4RCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLSkUKKyAgICB1J1x1MDQwYicgICAjICAweDhFIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUKKyAgICB1J1x1MDQwZicgICAjICAweDhGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERaSEUKKyAgICB1J1x1MDQ1MicgICAjICAweDkwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBESkUKKyAgICB1J1x1MjAxOCcgICAjICAweDkxIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHg5MiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxYycgICAjICAweDkzIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHg5NCAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyMicgICAjICAweDk1IC0+IEJVTExFVAorICAgIHUnXHUyMDEzJyAgICMgIDB4OTYgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4OTcgLT4gRU0gREFTSAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTggLT4gVU5ERUZJTkVECisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1MDQ1OScgICAjICAweDlBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUKKyAgICB1J1x1MjAzYScgICAjICAweDlCIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwNDVhJyAgICMgIDB4OUMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE5KRQorICAgIHUnXHUwNDVjJyAgICMgIDB4OUQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtKRQorICAgIHUnXHUwNDViJyAgICMgIDB4OUUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTSEUKKyAgICB1J1x1MDQ1ZicgICAjICAweDlGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBEWkhFCisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwNDBlJyAgICMgIDB4QTEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIHUnXHUwNDVlJyAgICMgIDB4QTIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKyAgICB1J1x1MDQwOCcgICAjICAweEEzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEpFCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTA0OTAnICAgIyAgMHhBNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUgV0lUSCBVUFRVUk4KKyAgICB1J1x4YTYnICAgICAjICAweEE2IC0+IEJST0tFTiBCQVIKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUwNDAxJyAgICMgIDB4QTggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTA0MDQnICAgIyAgMHhBQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHUwNDA3JyAgICMgIDB4QUYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MDQwNicgICAjICAweEIyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDU2JyAgICMgIDB4QjMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDkxJyAgICMgIDB4QjQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTgorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdcdTA0NTEnICAgIyAgMHhCOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSU8KKyAgICB1J1x1MjExNicgICAjICAweEI5IC0+IE5VTUVSTyBTSUdOCisgICAgdSdcdTA0NTQnICAgIyAgMHhCQSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDQ1OCcgICAjICAweEJDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBKRQorICAgIHUnXHUwNDA1JyAgICMgIDB4QkQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpFCisgICAgdSdcdTA0NTUnICAgIyAgMHhCRSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpFCisgICAgdSdcdTA0NTcnICAgIyAgMHhCRiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKyAgICB1J1x1MDQxMCcgICAjICAweEMwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J1x1MDQxMScgICAjICAweEMxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgdSdcdTA0MTInICAgIyAgMHhDMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIHUnXHUwNDEzJyAgICMgIDB4QzMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MTQnICAgIyAgMHhDNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorICAgIHUnXHUwNDE1JyAgICMgIDB4QzUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICB1J1x1MDQxNicgICAjICAweEM2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDE3JyAgICMgIDB4QzcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKyAgICB1J1x1MDQxOCcgICAjICAweEM4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J1x1MDQxOScgICAjICAweEM5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQxYScgICAjICAweENBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgdSdcdTA0MWInICAgIyAgMHhDQiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIHUnXHUwNDFjJyAgICMgIDB4Q0MgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICB1J1x1MDQxZCcgICAjICAweENEIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgdSdcdTA0MWUnICAgIyAgMHhDRSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdcdTA0MWYnICAgIyAgMHhDRiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgIHUnXHUwNDIwJyAgICMgIDB4RDAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICB1J1x1MDQyMScgICAjICAweEQxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgdSdcdTA0MjInICAgIyAgMHhEMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIHUnXHUwNDIzJyAgICMgIDB4RDMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnXHUwNDI0JyAgICMgIDB4RDQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICB1J1x1MDQyNScgICAjICAweEQ1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgdSdcdTA0MjYnICAgIyAgMHhENiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICB1J1x1MDQyNycgICAjICAweEQ3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIHUnXHUwNDI4JyAgICMgIDB4RDggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgdSdcdTA0MjknICAgIyAgMHhEOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDJhJyAgICMgIDB4REEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisgICAgdSdcdTA0MmInICAgIyAgMHhEQiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0MmMnICAgIyAgMHhEQyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKyAgICB1J1x1MDQyZCcgICAjICAweEREIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J1x1MDQyZScgICAjICAweERFIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgdSdcdTA0MmYnICAgIyAgMHhERiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgIHUnXHUwNDMwJyAgICMgIDB4RTAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICB1J1x1MDQzMScgICAjICAweEUxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIHUnXHUwNDMyJyAgICMgIDB4RTIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgdSdcdTA0MzMnICAgIyAgMHhFMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MzQnICAgIyAgMHhFNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICB1J1x1MDQzNScgICAjICAweEU1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIHUnXHUwNDM2JyAgICMgIDB4RTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDM3JyAgICMgIDB4RTcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgdSdcdTA0MzgnICAgIyAgMHhFOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgIHUnXHUwNDM5JyAgICMgIDB4RTkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQzYScgICAjICAweEVBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIHUnXHUwNDNiJyAgICMgIDB4RUIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgdSdcdTA0M2MnICAgIyAgMHhFQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICB1J1x1MDQzZCcgICAjICAweEVEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIHUnXHUwNDNlJyAgICMgIDB4RUUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICB1J1x1MDQzZicgICAjICAweEVGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIHUnXHUwNDQwJyAgICMgIDB4RjAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgdSdcdTA0NDEnICAgIyAgMHhGMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICB1J1x1MDQ0MicgICAjICAweEYyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIHUnXHUwNDQzJyAgICMgIDB4RjMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICB1J1x1MDQ0NCcgICAjICAweEY0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIHUnXHUwNDQ1JyAgICMgIDB4RjUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgdSdcdTA0NDYnICAgIyAgMHhGNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgdSdcdTA0NDcnICAgIyAgMHhGNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0NDgnICAgIyAgMHhGOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgdSdcdTA0NDknICAgIyAgMHhGOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQ0YScgICAjICAweEZBIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICB1J1x1MDQ0YicgICAjICAweEZCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0NGMnICAgIyAgMHhGQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0NGQnICAgIyAgMHhGRCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIHUnXHUwNDRlJyAgICMgIDB4RkUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisgICAgdSdcdTA0NGYnICAgIyAgMHhGRiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmYzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1MS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYmYzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjBhMzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUyLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMTI1MiBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDEyNTIuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMjUyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x1MjBhYycgICAjICAweDgwIC0+IEVVUk8gU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMWEnICAgIyAgMHg4MiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE5MicgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMDFlJyAgICMgIDB4ODQgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHg4NSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHg4NiAtPiBEQUdHRVIKKyAgICB1J1x1MjAyMScgICAjICAweDg3IC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x1MDJjNicgICAjICAweDg4IC0+IE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHUyMDMwJyAgICMgIDB4ODkgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x1MDE2MCcgICAjICAweDhBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUyMDM5JyAgICMgIDB4OEIgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE1MicgICAjICAweDhDIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKKyAgICB1J1x1ZmZmZScgICAjICAweDhEIC0+IFVOREVGSU5FRAorICAgIHUnXHUwMTdkJyAgICMgIDB4OEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdWZmZmUnICAgIyAgMHg4RiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDkwIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDE4JyAgICMgIDB4OTEgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweDkyIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFjJyAgICMgIDB4OTMgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweDk0IC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDIyJyAgICMgIDB4OTUgLT4gQlVMTEVUCisgICAgdSdcdTIwMTMnICAgIyAgMHg5NiAtPiBFTiBEQVNICisgICAgdSdcdTIwMTQnICAgIyAgMHg5NyAtPiBFTSBEQVNICisgICAgdSdcdTAyZGMnICAgIyAgMHg5OCAtPiBTTUFMTCBUSUxERQorICAgIHUnXHUyMTIyJyAgICMgIDB4OTkgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdTAxNjEnICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTIwM2EnICAgIyAgMHg5QiAtPiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE1MycgICAjICAweDlDIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIE9FCisgICAgdSdcdWZmZmUnICAgIyAgMHg5RCAtPiBVTkRFRklORUQKKyAgICB1J1x1MDE3ZScgICAjICAweDlFIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDE3OCcgICAjICAweDlGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGExJyAgICAgIyAgMHhBMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YWEnICAgICAjICAweEFBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x4YjknICAgICAjICAweEI5IC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiYScgICAgICMgIDB4QkEgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmMnICAgICAjICAweEJDIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCRSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YmYnICAgICAjICAweEJGIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMycgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkMCcgICAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgdSdceGQxJyAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDInICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZScgICAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTMnICAgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTYnICAgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHhlNycgICAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU4JyAgICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVjJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYwJyAgICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgdSdceGYxJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYyJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhmOScgICAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmZCcgICAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhmZScgICAgICMgIDB4RkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgdSdceGZmJyAgICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUyLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyYTU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUyLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyYTU1NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Mi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjZjY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTMucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMjUzIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQMTI1My5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEyNTMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyMGFjJyAgICMgIDB4ODAgLT4gRVVSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg4MSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxYScgICAjICAweDgyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTkyJyAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdcdTIwMWUnICAgIyAgMHg4NCAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweDg1IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x1MjAyMCcgICAjICAweDg2IC0+IERBR0dFUgorICAgIHUnXHUyMDIxJyAgICMgIDB4ODcgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODggLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMzAnICAgIyAgMHg4OSAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4OEEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMzknICAgIyAgMHg4QiAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4OEMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5MCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxOCcgICAjICAweDkxIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHg5MiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxYycgICAjICAweDkzIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHg5NCAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyMicgICAjICAweDk1IC0+IEJVTExFVAorICAgIHUnXHUyMDEzJyAgICMgIDB4OTYgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4OTcgLT4gRU0gREFTSAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTggLT4gVU5ERUZJTkVECisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDlBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RiAtPiBVTkRFRklORUQKKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAzODUnICAgIyAgMHhBMSAtPiBHUkVFSyBESUFMWVRJS0EgVE9OT1MKKyAgICB1J1x1MDM4NicgICAjICAweEEyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweEFBIC0+IFVOREVGSU5FRAorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdcdTIwMTUnICAgIyAgMHhBRiAtPiBIT1JJWk9OVEFMIEJBUgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHUwMzg0JyAgICMgIDB4QjQgLT4gR1JFRUsgVE9OT1MKKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHUwMzg4JyAgICMgIDB4QjggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzODknICAgIyAgMHhCOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwMzhhJyAgICMgIDB4QkEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDM4YycgICAjICAweEJDIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04gV0lUSCBUT05PUworICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdcdTAzOGUnICAgIyAgMHhCRSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4ZicgICAjICAweEJGIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM5MCcgICAjICAweEMwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIHUnXHUwMzkxJyAgICMgIDB4QzEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICB1J1x1MDM5MicgICAjICAweEMyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICB1J1x1MDM5MycgICAjICAweEMzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzOTQnICAgIyAgMHhDNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIHUnXHUwMzk1JyAgICMgIDB4QzUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUwMzk2JyAgICMgIDB4QzYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorICAgIHUnXHUwMzk3JyAgICMgIDB4QzcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgdSdcdTAzOTgnICAgIyAgMHhDOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwMzk5JyAgICMgIDB4QzkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorICAgIHUnXHUwMzlhJyAgICMgIDB4Q0EgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDM5YicgICAjICAweENCIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzOWMnICAgIyAgMHhDQyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIHUnXHUwMzlkJyAgICMgIDB4Q0QgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICB1J1x1MDM5ZScgICAjICAweENFIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgdSdcdTAzOWYnICAgIyAgMHhDRiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTAzYTAnICAgIyAgMHhEMCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIHUnXHUwM2ExJyAgICMgIDB4RDEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgdSdcdWZmZmUnICAgIyAgMHhEMiAtPiBVTkRFRklORUQKKyAgICB1J1x1MDNhMycgICAjICAweEQzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYTQnICAgIyAgMHhENCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNhNScgICAjICAweEQ1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNhNicgICAjICAweEQ2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwM2E3JyAgICMgIDB4RDcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCisgICAgdSdcdTAzYTgnICAgIyAgMHhEOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNhOScgICAjICAweEQ5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYWEnICAgIyAgMHhEQSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYWInICAgIyAgMHhEQiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYWMnICAgIyAgMHhEQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHUwM2FkJyAgICMgIDB4REQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2FlJyAgICMgIDB4REUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWYnICAgIyAgMHhERiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYjAnICAgIyAgMHhFMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICB1J1x1MDNiMScgICAjICAweEUxIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwM2IyJyAgICMgIDB4RTIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEKKyAgICB1J1x1MDNiMycgICAjICAweEUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwM2I0JyAgICMgIDB4RTQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzYjUnICAgIyAgMHhFNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUwM2I2JyAgICMgIDB4RTYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDNiNycgICAjICAweEU3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICB1J1x1MDNiOCcgICAjICAweEU4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2I5JyAgICMgIDB4RTkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDNiYScgICAjICAweEVBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIHUnXHUwM2JiJyAgICMgIDB4RUIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzYmMnICAgIyAgMHhFQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICB1J1x1MDNiZCcgICAjICAweEVEIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIHUnXHUwM2JlJyAgICMgIDB4RUUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgdSdcdTAzYmYnICAgIyAgMHhFRiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIHUnXHUwM2MwJyAgICMgIDB4RjAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYzEnICAgIyAgMHhGMSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgdSdcdTAzYzInICAgIyAgMHhGMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEKKyAgICB1J1x1MDNjMycgICAjICAweEYzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2M0JyAgICMgIDB4RjQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2M1JyAgICMgIDB4RjUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNjNicgICAjICAweEY2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNjNycgICAjICAweEY3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICB1J1x1MDNjOCcgICAjICAweEY4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNjOScgICAjICAweEY5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2NhJyAgICMgIDB4RkEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNjYicgICAjICAweEZCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzY2MnICAgIyAgMHhGQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2QnICAgIyAgMHhGRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2UnICAgIyAgMHhGRSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHVmZmZlJyAgICMgIDB4RkYgLT4gVU5ERUZJTkVECispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE5YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE5YTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjUzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MzBhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEyNTQgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1AxMjU0LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwMTI1NCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTIwYWMnICAgIyAgMHg4MCAtPiBFVVJPIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDgxIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDFhJyAgICMgIDB4ODIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxOTInICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjAxZScgICAjICAweDg0IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4ODUgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4ODYgLT4gREFHR0VSCisgICAgdSdcdTIwMjEnICAgIyAgMHg4NyAtPiBET1VCTEUgREFHR0VSCisgICAgdSdcdTAyYzYnICAgIyAgMHg4OCAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MjAzMCcgICAjICAweDg5IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdcdTAxNjAnICAgIyAgMHg4QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjAzOScgICAjICAweDhCIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTInICAgIyAgMHg4QyAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdWZmZmUnICAgIyAgMHg4RCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5MCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxOCcgICAjICAweDkxIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHg5MiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxYycgICAjICAweDkzIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHg5NCAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyMicgICAjICAweDk1IC0+IEJVTExFVAorICAgIHUnXHUyMDEzJyAgICMgIDB4OTYgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4OTcgLT4gRU0gREFTSAorICAgIHUnXHUwMmRjJyAgICMgIDB4OTggLT4gU01BTEwgVElMREUKKyAgICB1J1x1MjEyMicgICAjICAweDk5IC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHUwMTYxJyAgICMgIDB4OUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTMnICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHVmZmZlJyAgICMgIDB4OUQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RSAtPiBVTkRFRklORUQKKyAgICB1J1x1MDE3OCcgICAjICAweDlGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGExJyAgICAgIyAgMHhBMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YWEnICAgICAjICAweEFBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x4YjknICAgICAjICAweEI5IC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiYScgICAgICMgIDB4QkEgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmMnICAgICAjICAweEJDIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCRSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YmYnICAgICAjICAweEJGIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMycgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFlJyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgdSdceGQxJyAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDInICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEzMCcgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE1ZScgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhlMCcgICAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGUzJyAgICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlNScgICAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOCcgICAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTFmJyAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHhmMScgICAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMicgICAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhmOCcgICAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEzMScgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x1MDE1ZicgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHhmZicgICAgICMgIDB4RkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWRiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWRiNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1NS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDE0NTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU1LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwMTI1NSBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDEyNTUuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3AxMjU1JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x1MjBhYycgICAjICAweDgwIC0+IEVVUk8gU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMWEnICAgIyAgMHg4MiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE5MicgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMDFlJyAgICMgIDB4ODQgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHg4NSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHg4NiAtPiBEQUdHRVIKKyAgICB1J1x1MjAyMScgICAjICAweDg3IC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x1MDJjNicgICAjICAweDg4IC0+IE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHUyMDMwJyAgICMgIDB4ODkgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDhBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDM5JyAgICMgIDB4OEIgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1ZmZmZScgICAjICAweDhDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhGIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTAgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1MDJkYycgICAjICAweDk4IC0+IFNNQUxMIFRJTERFCisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDlBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RiAtPiBVTkRFRklORUQKKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGExJyAgICAgIyAgMHhBMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x1MjBhYScgICAjICAweEE0IC0+IE5FVyBTSEVRRUwgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QTUgLT4gWUVOIFNJR04KKyAgICB1J1x4YTYnICAgICAjICAweEE2IC0+IEJST0tFTiBCQVIKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4QTggLT4gRElBRVJFU0lTCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHhkNycgICAgICMgIDB4QUEgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFmJyAgICAgIyAgMHhBRiAtPiBNQUNST04KKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdceGI4JyAgICAgIyAgMHhCOCAtPiBDRURJTExBCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4ZjcnICAgICAjICAweEJBIC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4YmInICAgICAjICAweEJCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYycgICAgICMgIDB4QkMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCRCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEJFIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhiZicgICAgICMgIDB4QkYgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHUwNWIwJyAgICMgIDB4QzAgLT4gSEVCUkVXIFBPSU5UIFNIRVZBCisgICAgdSdcdTA1YjEnICAgIyAgMHhDMSAtPiBIRUJSRVcgUE9JTlQgSEFUQUYgU0VHT0wKKyAgICB1J1x1MDViMicgICAjICAweEMyIC0+IEhFQlJFVyBQT0lOVCBIQVRBRiBQQVRBSAorICAgIHUnXHUwNWIzJyAgICMgIDB4QzMgLT4gSEVCUkVXIFBPSU5UIEhBVEFGIFFBTUFUUworICAgIHUnXHUwNWI0JyAgICMgIDB4QzQgLT4gSEVCUkVXIFBPSU5UIEhJUklRCisgICAgdSdcdTA1YjUnICAgIyAgMHhDNSAtPiBIRUJSRVcgUE9JTlQgVFNFUkUKKyAgICB1J1x1MDViNicgICAjICAweEM2IC0+IEhFQlJFVyBQT0lOVCBTRUdPTAorICAgIHUnXHUwNWI3JyAgICMgIDB4QzcgLT4gSEVCUkVXIFBPSU5UIFBBVEFICisgICAgdSdcdTA1YjgnICAgIyAgMHhDOCAtPiBIRUJSRVcgUE9JTlQgUUFNQVRTCisgICAgdSdcdTA1YjknICAgIyAgMHhDOSAtPiBIRUJSRVcgUE9JTlQgSE9MQU0KKyAgICB1J1x1ZmZmZScgICAjICAweENBIC0+IFVOREVGSU5FRAorICAgIHUnXHUwNWJiJyAgICMgIDB4Q0IgLT4gSEVCUkVXIFBPSU5UIFFVQlVUUworICAgIHUnXHUwNWJjJyAgICMgIDB4Q0MgLT4gSEVCUkVXIFBPSU5UIERBR0VTSCBPUiBNQVBJUQorICAgIHUnXHUwNWJkJyAgICMgIDB4Q0QgLT4gSEVCUkVXIFBPSU5UIE1FVEVHCisgICAgdSdcdTA1YmUnICAgIyAgMHhDRSAtPiBIRUJSRVcgUFVOQ1RVQVRJT04gTUFRQUYKKyAgICB1J1x1MDViZicgICAjICAweENGIC0+IEhFQlJFVyBQT0lOVCBSQUZFCisgICAgdSdcdTA1YzAnICAgIyAgMHhEMCAtPiBIRUJSRVcgUFVOQ1RVQVRJT04gUEFTRVEKKyAgICB1J1x1MDVjMScgICAjICAweEQxIC0+IEhFQlJFVyBQT0lOVCBTSElOIERPVAorICAgIHUnXHUwNWMyJyAgICMgIDB4RDIgLT4gSEVCUkVXIFBPSU5UIFNJTiBET1QKKyAgICB1J1x1MDVjMycgICAjICAweEQzIC0+IEhFQlJFVyBQVU5DVFVBVElPTiBTT0YgUEFTVVEKKyAgICB1J1x1MDVmMCcgICAjICAweEQ0IC0+IEhFQlJFVyBMSUdBVFVSRSBZSURESVNIIERPVUJMRSBWQVYKKyAgICB1J1x1MDVmMScgICAjICAweEQ1IC0+IEhFQlJFVyBMSUdBVFVSRSBZSURESVNIIFZBViBZT0QKKyAgICB1J1x1MDVmMicgICAjICAweEQ2IC0+IEhFQlJFVyBMSUdBVFVSRSBZSURESVNIIERPVUJMRSBZT0QKKyAgICB1J1x1MDVmMycgICAjICAweEQ3IC0+IEhFQlJFVyBQVU5DVFVBVElPTiBHRVJFU0gKKyAgICB1J1x1MDVmNCcgICAjICAweEQ4IC0+IEhFQlJFVyBQVU5DVFVBVElPTiBHRVJTSEFZSU0KKyAgICB1J1x1ZmZmZScgICAjICAweEQ5IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REEgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhEQiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweERDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhERSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweERGIC0+IFVOREVGSU5FRAorICAgIHUnXHUwNWQwJyAgICMgIDB4RTAgLT4gSEVCUkVXIExFVFRFUiBBTEVGCisgICAgdSdcdTA1ZDEnICAgIyAgMHhFMSAtPiBIRUJSRVcgTEVUVEVSIEJFVAorICAgIHUnXHUwNWQyJyAgICMgIDB4RTIgLT4gSEVCUkVXIExFVFRFUiBHSU1FTAorICAgIHUnXHUwNWQzJyAgICMgIDB4RTMgLT4gSEVCUkVXIExFVFRFUiBEQUxFVAorICAgIHUnXHUwNWQ0JyAgICMgIDB4RTQgLT4gSEVCUkVXIExFVFRFUiBIRQorICAgIHUnXHUwNWQ1JyAgICMgIDB4RTUgLT4gSEVCUkVXIExFVFRFUiBWQVYKKyAgICB1J1x1MDVkNicgICAjICAweEU2IC0+IEhFQlJFVyBMRVRURVIgWkFZSU4KKyAgICB1J1x1MDVkNycgICAjICAweEU3IC0+IEhFQlJFVyBMRVRURVIgSEVUCisgICAgdSdcdTA1ZDgnICAgIyAgMHhFOCAtPiBIRUJSRVcgTEVUVEVSIFRFVAorICAgIHUnXHUwNWQ5JyAgICMgIDB4RTkgLT4gSEVCUkVXIExFVFRFUiBZT0QKKyAgICB1J1x1MDVkYScgICAjICAweEVBIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgS0FGCisgICAgdSdcdTA1ZGInICAgIyAgMHhFQiAtPiBIRUJSRVcgTEVUVEVSIEtBRgorICAgIHUnXHUwNWRjJyAgICMgIDB4RUMgLT4gSEVCUkVXIExFVFRFUiBMQU1FRAorICAgIHUnXHUwNWRkJyAgICMgIDB4RUQgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBNRU0KKyAgICB1J1x1MDVkZScgICAjICAweEVFIC0+IEhFQlJFVyBMRVRURVIgTUVNCisgICAgdSdcdTA1ZGYnICAgIyAgMHhFRiAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTgorICAgIHUnXHUwNWUwJyAgICMgIDB4RjAgLT4gSEVCUkVXIExFVFRFUiBOVU4KKyAgICB1J1x1MDVlMScgICAjICAweEYxIC0+IEhFQlJFVyBMRVRURVIgU0FNRUtICisgICAgdSdcdTA1ZTInICAgIyAgMHhGMiAtPiBIRUJSRVcgTEVUVEVSIEFZSU4KKyAgICB1J1x1MDVlMycgICAjICAweEYzIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgUEUKKyAgICB1J1x1MDVlNCcgICAjICAweEY0IC0+IEhFQlJFVyBMRVRURVIgUEUKKyAgICB1J1x1MDVlNScgICAjICAweEY1IC0+IEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkKKyAgICB1J1x1MDVlNicgICAjICAweEY2IC0+IEhFQlJFVyBMRVRURVIgVFNBREkKKyAgICB1J1x1MDVlNycgICAjICAweEY3IC0+IEhFQlJFVyBMRVRURVIgUU9GCisgICAgdSdcdTA1ZTgnICAgIyAgMHhGOCAtPiBIRUJSRVcgTEVUVEVSIFJFU0gKKyAgICB1J1x1MDVlOScgICAjICAweEY5IC0+IEhFQlJFVyBMRVRURVIgU0hJTgorICAgIHUnXHUwNWVhJyAgICMgIDB4RkEgLT4gSEVCUkVXIExFVFRFUiBUQVYKKyAgICB1J1x1ZmZmZScgICAjICAweEZCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RkMgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMGUnICAgIyAgMHhGRCAtPiBMRUZULVRPLVJJR0hUIE1BUksKKyAgICB1J1x1MjAwZicgICAjICAweEZFIC0+IFJJR0hULVRPLUxFRlQgTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4RkYgLT4gVU5ERUZJTkVECispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q3MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU1LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q3MmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU1LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTYucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAyYjVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ni5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDEyNTYgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL1dJTkRPV1MvQ1AxMjU2LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwMTI1NicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTIwYWMnICAgIyAgMHg4MCAtPiBFVVJPIFNJR04KKyAgICB1J1x1MDY3ZScgICAjICAweDgxIC0+IEFSQUJJQyBMRVRURVIgUEVICisgICAgdSdcdTIwMWEnICAgIyAgMHg4MiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE5MicgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMDFlJyAgICMgIDB4ODQgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHg4NSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHg4NiAtPiBEQUdHRVIKKyAgICB1J1x1MjAyMScgICAjICAweDg3IC0+IERPVUJMRSBEQUdHRVIKKyAgICB1J1x1MDJjNicgICAjICAweDg4IC0+IE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHUyMDMwJyAgICMgIDB4ODkgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x1MDY3OScgICAjICAweDhBIC0+IEFSQUJJQyBMRVRURVIgVFRFSAorICAgIHUnXHUyMDM5JyAgICMgIDB4OEIgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE1MicgICAjICAweDhDIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKKyAgICB1J1x1MDY4NicgICAjICAweDhEIC0+IEFSQUJJQyBMRVRURVIgVENIRUgKKyAgICB1J1x1MDY5OCcgICAjICAweDhFIC0+IEFSQUJJQyBMRVRURVIgSkVICisgICAgdSdcdTA2ODgnICAgIyAgMHg4RiAtPiBBUkFCSUMgTEVUVEVSIEREQUwKKyAgICB1J1x1MDZhZicgICAjICAweDkwIC0+IEFSQUJJQyBMRVRURVIgR0FGCisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1MDZhOScgICAjICAweDk4IC0+IEFSQUJJQyBMRVRURVIgS0VIRUgKKyAgICB1J1x1MjEyMicgICAjICAweDk5IC0+IFRSQURFIE1BUksgU0lHTgorICAgIHUnXHUwNjkxJyAgICMgIDB4OUEgLT4gQVJBQklDIExFVFRFUiBSUkVICisgICAgdSdcdTIwM2EnICAgIyAgMHg5QiAtPiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE1MycgICAjICAweDlDIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIE9FCisgICAgdSdcdTIwMGMnICAgIyAgMHg5RCAtPiBaRVJPIFdJRFRIIE5PTi1KT0lORVIKKyAgICB1J1x1MjAwZCcgICAjICAweDlFIC0+IFpFUk8gV0lEVEggSk9JTkVSCisgICAgdSdcdTA2YmEnICAgIyAgMHg5RiAtPiBBUkFCSUMgTEVUVEVSIE5PT04gR0hVTk5BCisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwNjBjJyAgICMgIDB4QTEgLT4gQVJBQklDIENPTU1BCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MDZiZScgICAjICAweEFBIC0+IEFSQUJJQyBMRVRURVIgSEVIIERPQUNIQVNITUVFCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x4YjknICAgICAjICAweEI5IC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHUwNjFiJyAgICMgIDB4QkEgLT4gQVJBQklDIFNFTUlDT0xPTgorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdcdTA2MWYnICAgIyAgMHhCRiAtPiBBUkFCSUMgUVVFU1RJT04gTUFSSworICAgIHUnXHUwNmMxJyAgICMgIDB4QzAgLT4gQVJBQklDIExFVFRFUiBIRUggR09BTAorICAgIHUnXHUwNjIxJyAgICMgIDB4QzEgLT4gQVJBQklDIExFVFRFUiBIQU1aQQorICAgIHUnXHUwNjIyJyAgICMgIDB4QzIgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUKKyAgICB1J1x1MDYyMycgICAjICAweEMzIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjQnICAgIyAgMHhDNCAtPiBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjUnICAgIyAgMHhDNSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVworICAgIHUnXHUwNjI2JyAgICMgIDB4QzYgLT4gQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI3JyAgICMgIDB4QzcgLT4gQVJBQklDIExFVFRFUiBBTEVGCisgICAgdSdcdTA2MjgnICAgIyAgMHhDOCAtPiBBUkFCSUMgTEVUVEVSIEJFSAorICAgIHUnXHUwNjI5JyAgICMgIDB4QzkgLT4gQVJBQklDIExFVFRFUiBURUggTUFSQlVUQQorICAgIHUnXHUwNjJhJyAgICMgIDB4Q0EgLT4gQVJBQklDIExFVFRFUiBURUgKKyAgICB1J1x1MDYyYicgICAjICAweENCIC0+IEFSQUJJQyBMRVRURVIgVEhFSAorICAgIHUnXHUwNjJjJyAgICMgIDB4Q0MgLT4gQVJBQklDIExFVFRFUiBKRUVNCisgICAgdSdcdTA2MmQnICAgIyAgMHhDRCAtPiBBUkFCSUMgTEVUVEVSIEhBSAorICAgIHUnXHUwNjJlJyAgICMgIDB4Q0UgLT4gQVJBQklDIExFVFRFUiBLSEFICisgICAgdSdcdTA2MmYnICAgIyAgMHhDRiAtPiBBUkFCSUMgTEVUVEVSIERBTAorICAgIHUnXHUwNjMwJyAgICMgIDB4RDAgLT4gQVJBQklDIExFVFRFUiBUSEFMCisgICAgdSdcdTA2MzEnICAgIyAgMHhEMSAtPiBBUkFCSUMgTEVUVEVSIFJFSAorICAgIHUnXHUwNjMyJyAgICMgIDB4RDIgLT4gQVJBQklDIExFVFRFUiBaQUlOCisgICAgdSdcdTA2MzMnICAgIyAgMHhEMyAtPiBBUkFCSUMgTEVUVEVSIFNFRU4KKyAgICB1J1x1MDYzNCcgICAjICAweEQ0IC0+IEFSQUJJQyBMRVRURVIgU0hFRU4KKyAgICB1J1x1MDYzNScgICAjICAweEQ1IC0+IEFSQUJJQyBMRVRURVIgU0FECisgICAgdSdcdTA2MzYnICAgIyAgMHhENiAtPiBBUkFCSUMgTEVUVEVSIERBRAorICAgIHUnXHhkNycgICAgICMgIDB4RDcgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHUwNjM3JyAgICMgIDB4RDggLT4gQVJBQklDIExFVFRFUiBUQUgKKyAgICB1J1x1MDYzOCcgICAjICAweEQ5IC0+IEFSQUJJQyBMRVRURVIgWkFICisgICAgdSdcdTA2MzknICAgIyAgMHhEQSAtPiBBUkFCSUMgTEVUVEVSIEFJTgorICAgIHUnXHUwNjNhJyAgICMgIDB4REIgLT4gQVJBQklDIExFVFRFUiBHSEFJTgorICAgIHUnXHUwNjQwJyAgICMgIDB4REMgLT4gQVJBQklDIFRBVFdFRUwKKyAgICB1J1x1MDY0MScgICAjICAweEREIC0+IEFSQUJJQyBMRVRURVIgRkVICisgICAgdSdcdTA2NDInICAgIyAgMHhERSAtPiBBUkFCSUMgTEVUVEVSIFFBRgorICAgIHUnXHUwNjQzJyAgICMgIDB4REYgLT4gQVJBQklDIExFVFRFUiBLQUYKKyAgICB1J1x4ZTAnICAgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x1MDY0NCcgICAjICAweEUxIC0+IEFSQUJJQyBMRVRURVIgTEFNCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDY0NScgICAjICAweEUzIC0+IEFSQUJJQyBMRVRURVIgTUVFTQorICAgIHUnXHUwNjQ2JyAgICMgIDB4RTQgLT4gQVJBQklDIExFVFRFUiBOT09OCisgICAgdSdcdTA2NDcnICAgIyAgMHhFNSAtPiBBUkFCSUMgTEVUVEVSIEhFSAorICAgIHUnXHUwNjQ4JyAgICMgIDB4RTYgLT4gQVJBQklDIExFVFRFUiBXQVcKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOCcgICAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwNjQ5JyAgICMgIDB4RUMgLT4gQVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkEKKyAgICB1J1x1MDY0YScgICAjICAweEVEIC0+IEFSQUJJQyBMRVRURVIgWUVICisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTA2NGInICAgIyAgMHhGMCAtPiBBUkFCSUMgRkFUSEFUQU4KKyAgICB1J1x1MDY0YycgICAjICAweEYxIC0+IEFSQUJJQyBEQU1NQVRBTgorICAgIHUnXHUwNjRkJyAgICMgIDB4RjIgLT4gQVJBQklDIEtBU1JBVEFOCisgICAgdSdcdTA2NGUnICAgIyAgMHhGMyAtPiBBUkFCSUMgRkFUSEEKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwNjRmJyAgICMgIDB4RjUgLT4gQVJBQklDIERBTU1BCisgICAgdSdcdTA2NTAnICAgIyAgMHhGNiAtPiBBUkFCSUMgS0FTUkEKKyAgICB1J1x4ZjcnICAgICAjICAweEY3IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MDY1MScgICAjICAweEY4IC0+IEFSQUJJQyBTSEFEREEKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x1MDY1MicgICAjICAweEZBIC0+IEFSQUJJQyBTVUtVTgorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDBlJyAgICMgIDB4RkQgLT4gTEVGVC1UTy1SSUdIVCBNQVJLCisgICAgdSdcdTIwMGYnICAgIyAgMHhGRSAtPiBSSUdIVC1UTy1MRUZUIE1BUksKKyAgICB1J1x1MDZkMicgICAjICAweEZGIC0+IEFSQUJJQyBMRVRURVIgWUVIIEJBUlJFRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU2LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ni5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmMGI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ni5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU2LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ni5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmMGI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ni5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU3LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTZiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTcucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMjU3IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQMTI1Ny5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEyNTcnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyMGFjJyAgICMgIDB4ODAgLT4gRVVSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg4MSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxYScgICAjICAweDgyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4ODMgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMWUnICAgIyAgMHg4NCAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweDg1IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x1MjAyMCcgICAjICAweDg2IC0+IERBR0dFUgorICAgIHUnXHUyMDIxJyAgICMgIDB4ODcgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHVmZmZlJyAgICMgIDB4ODggLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMzAnICAgIyAgMHg4OSAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4OEEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMzknICAgIyAgMHg4QiAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4OEMgLT4gVU5ERUZJTkVECisgICAgdSdceGE4JyAgICAgIyAgMHg4RCAtPiBESUFFUkVTSVMKKyAgICB1J1x1MDJjNycgICAjICAweDhFIC0+IENBUk9OCisgICAgdSdceGI4JyAgICAgIyAgMHg4RiAtPiBDRURJTExBCisgICAgdSdcdWZmZmUnICAgIyAgMHg5MCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxOCcgICAjICAweDkxIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHg5MiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxYycgICAjICAweDkzIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHg5NCAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyMicgICAjICAweDk1IC0+IEJVTExFVAorICAgIHUnXHUyMDEzJyAgICMgIDB4OTYgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4OTcgLT4gRU0gREFTSAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTggLT4gVU5ERUZJTkVECisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDlBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QyAtPiBVTkRFRklORUQKKyAgICB1J1x4YWYnICAgICAjICAweDlEIC0+IE1BQ1JPTgorICAgIHUnXHUwMmRiJyAgICMgIDB4OUUgLT4gT0dPTkVLCisgICAgdSdcdWZmZmUnICAgIyAgMHg5RiAtPiBVTkRFRklORUQKKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdWZmZmUnICAgIyAgMHhBMSAtPiBVTkRFRklORUQKKyAgICB1J1x4YTInICAgICAjICAweEEyIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNCcgICAgICMgIDB4QTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4QTUgLT4gVU5ERUZJTkVECisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4ZDgnICAgICAjICAweEE4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTAxNTYnICAgIyAgMHhBQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGM2JyAgICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4ZjgnICAgICAjICAweEI4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x1MDE1NycgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGU2JyAgICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x1MDEwNCcgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEyZScgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwMCcgICAjICAweEMyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x1MDEwNicgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x1MDExOCcgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDExMicgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICB1J1x1MDEwYycgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhjOScgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzknICAgIyAgMHhDQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1MDExNicgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyMicgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMzYnICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTJhJyAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTNiJyAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2MCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTQzJyAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDUnICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNGMnICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdceGQ1JyAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDE3MicgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE0MScgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE1YScgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTZhJyAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTdiJyAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTdkJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHUwMTA1JyAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEyZicgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMDEnICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTA3JyAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTUnICAgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHUwMTE5JyAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDExMycgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMGQnICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxN2EnICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTcnICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTIzJyAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMzcnICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyYicgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgdSdcdTAxM2MnICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2MScgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE0NCcgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0NicgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHUwMTRkJyAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTAxNzMnICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHUwMTQyJyAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE1YicgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2YicgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTdjJyAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE3ZScgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDJkOScgICAjICAweEZGIC0+IERPVCBBQk9WRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU3LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4NWYyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU3LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4NWYyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwMTI1Ny5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjVkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTgucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3AxMjU4IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JQ1NGVC9XSU5ET1dTL0NQMTI1OC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDEyNTgnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHUyMGFjJyAgICMgIDB4ODAgLT4gRVVSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg4MSAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxYScgICAjICAweDgyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTkyJyAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdcdTIwMWUnICAgIyAgMHg4NCAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweDg1IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x1MjAyMCcgICAjICAweDg2IC0+IERBR0dFUgorICAgIHUnXHUyMDIxJyAgICMgIDB4ODcgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHUwMmM2JyAgICMgIDB4ODggLT4gTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdcdTIwMzAnICAgIyAgMHg4OSAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4OEEgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMzknICAgIyAgMHg4QiAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTUyJyAgICMgIDB4OEMgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgIHUnXHVmZmZlJyAgICMgIDB4OEQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhGIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTAgLT4gVU5ERUZJTkVECisgICAgdSdcdTIwMTgnICAgIyAgMHg5MSAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4OTIgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWMnICAgIyAgMHg5MyAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4OTQgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjInICAgIyAgMHg5NSAtPiBCVUxMRVQKKyAgICB1J1x1MjAxMycgICAjICAweDk2IC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweDk3IC0+IEVNIERBU0gKKyAgICB1J1x1MDJkYycgICAjICAweDk4IC0+IFNNQUxMIFRJTERFCisgICAgdSdcdTIxMjInICAgIyAgMHg5OSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDlBIC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDNhJyAgICMgIDB4OUIgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTMnICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHVmZmZlJyAgICMgIDB4OUQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RSAtPiBVTkRFRklORUQKKyAgICB1J1x1MDE3OCcgICAjICAweDlGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGExJyAgICAgIyAgMHhBMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YWEnICAgICAjICAweEFBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x4YjknICAgICAjICAweEI5IC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiYScgICAgICMgIDB4QkEgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmMnICAgICAjICAweEJDIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCRSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YmYnICAgICAjICAweEJGIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTAyJyAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDMwMCcgICAjICAweENDIC0+IENPTUJJTklORyBHUkFWRSBBQ0NFTlQKKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExMCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDEnICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHUwMzA5JyAgICMgIDB4RDIgLT4gQ09NQklOSU5HIEhPT0sgQUJPVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDFhMCcgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBIT1JOCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDFhZicgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBIT1JOCisgICAgdSdcdTAzMDMnICAgIyAgMHhERSAtPiBDT01CSU5JTkcgVElMREUKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwMycgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTYnICAgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHhlNycgICAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU4JyAgICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAzMDEnICAgIyAgMHhFQyAtPiBDT01CSU5JTkcgQUNVVEUgQUNDRU5UCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMTEnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHhmMScgICAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHUwMzIzJyAgICMgIDB4RjIgLT4gQ09NQklOSU5HIERPVCBCRUxPVworICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxYTEnICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEhPUk4KKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhmOScgICAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMWIwJyAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBIT1JOCisgICAgdSdcdTIwYWInICAgIyAgMHhGRSAtPiBET05HIFNJR04KKyAgICB1J1x4ZmYnICAgICAjICAweEZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTgucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNiZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDEyNTgucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDNiZjcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3AxMjU4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQyNC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDI0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYWRlMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQyNC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDQyNCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSVNDL0NQNDI0LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwNDI0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDljJyAgICAgIyAgMHgwNCAtPiBTRUxFQ1QKKyAgICB1J1x0JyAgICAgICAjICAweDA1IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXHg4NicgICAgICMgIDB4MDYgLT4gUkVRVUlSRUQgTkVXIExJTkUKKyAgICB1J1x4N2YnICAgICAjICAweDA3IC0+IERFTEVURQorICAgIHUnXHg5NycgICAgICMgIDB4MDggLT4gR1JBUEhJQyBFU0NBUEUKKyAgICB1J1x4OGQnICAgICAjICAweDA5IC0+IFNVUEVSU0NSSVBUCisgICAgdSdceDhlJyAgICAgIyAgMHgwQSAtPiBSRVBFQVQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4OWQnICAgICAjICAweDE0IC0+IFJFU1RPUkUvRU5BQkxFIFBSRVNFTlRBVElPTgorICAgIHUnXHg4NScgICAgICMgIDB4MTUgLT4gTkVXIExJTkUKKyAgICB1J1x4MDgnICAgICAjICAweDE2IC0+IEJBQ0tTUEFDRQorICAgIHUnXHg4NycgICAgICMgIDB4MTcgLT4gUFJPR1JBTSBPUEVSQVRPUiBDT01NVU5JQ0FUSU9OCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4OTInICAgICAjICAweDFBIC0+IFVOSVQgQkFDSyBTUEFDRQorICAgIHUnXHg4ZicgICAgICMgIDB4MUIgLT4gQ1VTVE9NRVIgVVNFIE9ORQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1J1x4ODAnICAgICAjICAweDIwIC0+IERJR0lUIFNFTEVDVAorICAgIHUnXHg4MScgICAgICMgIDB4MjEgLT4gU1RBUlQgT0YgU0lHTklGSUNBTkNFCisgICAgdSdceDgyJyAgICAgIyAgMHgyMiAtPiBGSUVMRCBTRVBBUkFUT1IKKyAgICB1J1x4ODMnICAgICAjICAweDIzIC0+IFdPUkQgVU5ERVJTQ09SRQorICAgIHUnXHg4NCcgICAgICMgIDB4MjQgLT4gQllQQVNTIE9SIElOSElCSVQgUFJFU0VOVEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgyNSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MTcnICAgICAjICAweDI2IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MWInICAgICAjICAweDI3IC0+IEVTQ0FQRQorICAgIHUnXHg4OCcgICAgICMgIDB4MjggLT4gU0VUIEFUVFJJQlVURQorICAgIHUnXHg4OScgICAgICMgIDB4MjkgLT4gU1RBUlQgRklFTEQgRVhURU5ERUQKKyAgICB1J1x4OGEnICAgICAjICAweDJBIC0+IFNFVCBNT0RFIE9SIFNXSVRDSAorICAgIHUnXHg4YicgICAgICMgIDB4MkIgLT4gQ09OVFJPTCBTRVFVRU5DRSBQUkVGSVgKKyAgICB1J1x4OGMnICAgICAjICAweDJDIC0+IE1PRElGWSBGSUVMRCBBVFRSSUJVVEUKKyAgICB1J1x4MDUnICAgICAjICAweDJEIC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDJFIC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgyRiAtPiBCRUxMCisgICAgdSdceDkwJyAgICAgIyAgMHgzMCAtPiA8cmVzZXJ2ZWQ+CisgICAgdSdceDkxJyAgICAgIyAgMHgzMSAtPiA8cmVzZXJ2ZWQ+CisgICAgdSdceDE2JyAgICAgIyAgMHgzMiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDkzJyAgICAgIyAgMHgzMyAtPiBJTkRFWCBSRVRVUk4KKyAgICB1J1x4OTQnICAgICAjICAweDM0IC0+IFBSRVNFTlRBVElPTiBQT1NJVElPTgorICAgIHUnXHg5NScgICAgICMgIDB4MzUgLT4gVFJBTlNQQVJFTlQKKyAgICB1J1x4OTYnICAgICAjICAweDM2IC0+IE5VTUVSSUMgQkFDS1NQQUNFCisgICAgdSdceDA0JyAgICAgIyAgMHgzNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDk4JyAgICAgIyAgMHgzOCAtPiBTVUJTQ1JJUFQKKyAgICB1J1x4OTknICAgICAjICAweDM5IC0+IElOREVOVCBUQUJVTEFUSU9OCisgICAgdSdceDlhJyAgICAgIyAgMHgzQSAtPiBSRVZFUlNFIEZPUk0gRkVFRAorICAgIHUnXHg5YicgICAgICMgIDB4M0IgLT4gQ1VTVE9NRVIgVVNFIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgzQyAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgzRCAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHg5ZScgICAgICMgIDB4M0UgLT4gPHJlc2VydmVkPgorICAgIHUnXHgxYScgICAgICMgIDB4M0YgLT4gU1VCU1RJVFVURQorICAgIHUnICcgICAgICAgICMgIDB4NDAgLT4gU1BBQ0UKKyAgICB1J1x1MDVkMCcgICAjICAweDQxIC0+IEhFQlJFVyBMRVRURVIgQUxFRgorICAgIHUnXHUwNWQxJyAgICMgIDB4NDIgLT4gSEVCUkVXIExFVFRFUiBCRVQKKyAgICB1J1x1MDVkMicgICAjICAweDQzIC0+IEhFQlJFVyBMRVRURVIgR0lNRUwKKyAgICB1J1x1MDVkMycgICAjICAweDQ0IC0+IEhFQlJFVyBMRVRURVIgREFMRVQKKyAgICB1J1x1MDVkNCcgICAjICAweDQ1IC0+IEhFQlJFVyBMRVRURVIgSEUKKyAgICB1J1x1MDVkNScgICAjICAweDQ2IC0+IEhFQlJFVyBMRVRURVIgVkFWCisgICAgdSdcdTA1ZDYnICAgIyAgMHg0NyAtPiBIRUJSRVcgTEVUVEVSIFpBWUlOCisgICAgdSdcdTA1ZDcnICAgIyAgMHg0OCAtPiBIRUJSRVcgTEVUVEVSIEhFVAorICAgIHUnXHUwNWQ4JyAgICMgIDB4NDkgLT4gSEVCUkVXIExFVFRFUiBURVQKKyAgICB1J1x4YTInICAgICAjICAweDRBIC0+IENFTlQgU0lHTgorICAgIHUnLicgICAgICAgICMgIDB4NEIgLT4gRlVMTCBTVE9QCisgICAgdSc8JyAgICAgICAgIyAgMHg0QyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnKCcgICAgICAgICMgIDB4NEQgLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKycgICAgICAgICMgIDB4NEUgLT4gUExVUyBTSUdOCisgICAgdSd8JyAgICAgICAgIyAgMHg0RiAtPiBWRVJUSUNBTCBMSU5FCisgICAgdScmJyAgICAgICAgIyAgMHg1MCAtPiBBTVBFUlNBTkQKKyAgICB1J1x1MDVkOScgICAjICAweDUxIC0+IEhFQlJFVyBMRVRURVIgWU9ECisgICAgdSdcdTA1ZGEnICAgIyAgMHg1MiAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRgorICAgIHUnXHUwNWRiJyAgICMgIDB4NTMgLT4gSEVCUkVXIExFVFRFUiBLQUYKKyAgICB1J1x1MDVkYycgICAjICAweDU0IC0+IEhFQlJFVyBMRVRURVIgTEFNRUQKKyAgICB1J1x1MDVkZCcgICAjICAweDU1IC0+IEhFQlJFVyBMRVRURVIgRklOQUwgTUVNCisgICAgdSdcdTA1ZGUnICAgIyAgMHg1NiAtPiBIRUJSRVcgTEVUVEVSIE1FTQorICAgIHUnXHUwNWRmJyAgICMgIDB4NTcgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBOVU4KKyAgICB1J1x1MDVlMCcgICAjICAweDU4IC0+IEhFQlJFVyBMRVRURVIgTlVOCisgICAgdSdcdTA1ZTEnICAgIyAgMHg1OSAtPiBIRUJSRVcgTEVUVEVSIFNBTUVLSAorICAgIHUnIScgICAgICAgICMgIDB4NUEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnJCcgICAgICAgICMgIDB4NUIgLT4gRE9MTEFSIFNJR04KKyAgICB1JyonICAgICAgICAjICAweDVDIC0+IEFTVEVSSVNLCisgICAgdScpJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnOycgICAgICAgICMgIDB4NUUgLT4gU0VNSUNPTE9OCisgICAgdSdceGFjJyAgICAgIyAgMHg1RiAtPiBOT1QgU0lHTgorICAgIHUnLScgICAgICAgICMgIDB4NjAgLT4gSFlQSEVOLU1JTlVTCisgICAgdScvJyAgICAgICAgIyAgMHg2MSAtPiBTT0xJRFVTCisgICAgdSdcdTA1ZTInICAgIyAgMHg2MiAtPiBIRUJSRVcgTEVUVEVSIEFZSU4KKyAgICB1J1x1MDVlMycgICAjICAweDYzIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgUEUKKyAgICB1J1x1MDVlNCcgICAjICAweDY0IC0+IEhFQlJFVyBMRVRURVIgUEUKKyAgICB1J1x1MDVlNScgICAjICAweDY1IC0+IEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkKKyAgICB1J1x1MDVlNicgICAjICAweDY2IC0+IEhFQlJFVyBMRVRURVIgVFNBREkKKyAgICB1J1x1MDVlNycgICAjICAweDY3IC0+IEhFQlJFVyBMRVRURVIgUU9GCisgICAgdSdcdTA1ZTgnICAgIyAgMHg2OCAtPiBIRUJSRVcgTEVUVEVSIFJFU0gKKyAgICB1J1x1MDVlOScgICAjICAweDY5IC0+IEhFQlJFVyBMRVRURVIgU0hJTgorICAgIHUnXHhhNicgICAgICMgIDB4NkEgLT4gQlJPS0VOIEJBUgorICAgIHUnLCcgICAgICAgICMgIDB4NkIgLT4gQ09NTUEKKyAgICB1JyUnICAgICAgICAjICAweDZDIC0+IFBFUkNFTlQgU0lHTgorICAgIHUnXycgICAgICAgICMgIDB4NkQgLT4gTE9XIExJTkUKKyAgICB1Jz4nICAgICAgICAjICAweDZFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHg2RiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdcdWZmZmUnICAgIyAgMHg3MCAtPiBVTkRFRklORUQKKyAgICB1J1x1MDVlYScgICAjICAweDcxIC0+IEhFQlJFVyBMRVRURVIgVEFWCisgICAgdSdcdWZmZmUnICAgIyAgMHg3MiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDczIC0+IFVOREVGSU5FRAorICAgIHUnXHhhMCcgICAgICMgIDB4NzQgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1ZmZmZScgICAjICAweDc1IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4NzYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg3NyAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxNycgICAjICAweDc4IC0+IERPVUJMRSBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NzkgLT4gR1JBVkUgQUNDRU5UCisgICAgdSc6JyAgICAgICAgIyAgMHg3QSAtPiBDT0xPTgorICAgIHUnIycgICAgICAgICMgIDB4N0IgLT4gTlVNQkVSIFNJR04KKyAgICB1J0AnICAgICAgICAjICAweDdDIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1IiciICAgICAgICAjICAweDdEIC0+IEFQT1NUUk9QSEUKKyAgICB1Jz0nICAgICAgICAjICAweDdFIC0+IEVRVUFMUyBTSUdOCisgICAgdSciJyAgICAgICAgIyAgMHg3RiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnXHVmZmZlJyAgICMgIDB4ODAgLT4gVU5ERUZJTkVECisgICAgdSdhJyAgICAgICAgIyAgMHg4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4ODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4ODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdceGFiJyAgICAgIyAgMHg4QSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4OEIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdWZmZmUnICAgIyAgMHg4QyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEUgLT4gVU5ERUZJTkVECisgICAgdSdceGIxJyAgICAgIyAgMHg4RiAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjAnICAgICAjICAweDkwIC0+IERFR1JFRSBTSUdOCisgICAgdSdqJyAgICAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDk5IC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdcdWZmZmUnICAgIyAgMHg5QSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUMgLT4gVU5ERUZJTkVECisgICAgdSdceGI4JyAgICAgIyAgMHg5RCAtPiBDRURJTExBCisgICAgdSdcdWZmZmUnICAgIyAgMHg5RSAtPiBVTkRFRklORUQKKyAgICB1J1x4YTQnICAgICAjICAweDlGIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YjUnICAgICAjICAweEEwIC0+IE1JQ1JPIFNJR04KKyAgICB1J34nICAgICAgICAjICAweEExIC0+IFRJTERFCisgICAgdSdzJyAgICAgICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4QTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweEE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHhBNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4QTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHhBOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4QTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J1x1ZmZmZScgICAjICAweEFBIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QUIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBQyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEFEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QUUgLT4gVU5ERUZJTkVECisgICAgdSdceGFlJyAgICAgIyAgMHhBRiAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J14nICAgICAgICAjICAweEIwIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdceGEzJyAgICAgIyAgMHhCMSAtPiBQT1VORCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhCMiAtPiBZRU4gU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjMgLT4gTUlERExFIERPVAorICAgIHUnXHhhOScgICAgICMgIDB4QjQgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEI1IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGJjJyAgICAgIyAgMHhCNyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEI4IC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QjkgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdbJyAgICAgICAgIyAgMHhCQSAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSddJyAgICAgICAgIyAgMHhCQiAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXHhhZicgICAgICMgIDB4QkMgLT4gTUFDUk9OCisgICAgdSdceGE4JyAgICAgIyAgMHhCRCAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjQnICAgICAjICAweEJFIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhkNycgICAgICMgIDB4QkYgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUneycgICAgICAgICMgIDB4QzAgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSdBJyAgICAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdceGFkJyAgICAgIyAgMHhDQSAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHVmZmZlJyAgICMgIDB4Q0IgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhDQyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweENEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4Q0UgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhDRiAtPiBVTkRFRklORUQKKyAgICB1J30nICAgICAgICAjICAweEQwIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J0onICAgICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweEQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1x4YjknICAgICAjICAweERBIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHVmZmZlJyAgICMgIDB4REIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhEQyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEREIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhERiAtPiBVTkRFRklORUQKKyAgICB1J1xcJyAgICAgICAjICAweEUwIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXHhmNycgICAgICMgIDB4RTEgLT4gRElWSVNJT04gU0lHTgorICAgIHUnUycgICAgICAgICMgIDB4RTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4RTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4RTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4RTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4RTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnXHhiMicgICAgICMgIDB4RUEgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdWZmZmUnICAgIyAgMHhFQiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEVDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RUQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFRSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEVGIC0+IFVOREVGSU5FRAorICAgIHUnMCcgICAgICAgICMgIDB4RjAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4RjEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHhGMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweEYzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHhGNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHhGNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHhGNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweEY3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHhGOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4RjkgLT4gRElHSVQgTklORQorICAgIHUnXHhiMycgICAgICMgIDB4RkEgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x1ZmZmZScgICAjICAweEZCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RkMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhGRCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEZFIC0+IFVOREVGSU5FRAorICAgIHUnXHg5ZicgICAgICMgIDB4RkYgLT4gRUlHSFQgT05FUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzU5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQyNC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MjQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NzU5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQyNC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MzcucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQzNy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmNkODgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A0MzcucHkKQEAgLTAsMCArMSw2OTggQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A0MzcgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQNDM3LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A0MzcnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDBlMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODU6IDB4MDBlMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwODY6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODk6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhhOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDhiOiAweDAwZWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YzogMHgwMGVlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhkOiAweDAwZWMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAwYzUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwZTYsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMGYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDA5NjogMHgwMGZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk3OiAweDAwZjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDk4OiAweDAwZmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5OTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YTogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YjogMHgwMGEyLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMDljOiAweDAwYTMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMDlkOiAweDAwYTUsICAgICAjICBZRU4gU0lHTgorICAgIDB4MDA5ZTogMHgyMGE3LCAgICAgIyAgUEVTRVRBIFNJR04KKyAgICAweDAwOWY6IDB4MDE5MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNTogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE2OiAweDAwYWEsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhNzogMHgwMGJhLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE4OiAweDAwYmYsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGE5OiAweDIzMTAsICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAwYTEsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgyNTYxLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjY6IDB4MjU2MiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI3OiAweDI1NTYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI4OiAweDI1NTUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI5OiAweDI1NjMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGJhOiAweDI1NTEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgwMGJiOiAweDI1NTcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDAwYmM6IDB4MjU1ZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDAwYmQ6IDB4MjU1YywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGJlOiAweDI1NWIsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MjU1ZSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBjNzogMHgyNTVmLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDI1NjcsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMDogMHgyNTY4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDE6IDB4MjU2NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDI6IDB4MjU2NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDM6IDB4MjU1OSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNDogMHgyNTU4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ1OiAweDI1NTIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNjogMHgyNTUzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDc6IDB4MjU2YiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQ4OiAweDI1NmEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MjU4YywgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MDBkZTogMHgyNTkwLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwM2IxLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwMGUxOiAweDAwZGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMjogMHgwMzkzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAwZTM6IDB4MDNjMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDBlNDogMHgwM2EzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTU6IDB4MDNjMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlNjogMHgwMGI1LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBlNzogMHgwM2M0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDBlODogMHgwM2E2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwMGU5OiAweDAzOTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDBlYTogMHgwM2E5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAwZWI6IDB4MDNiNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDBlYzogMHgyMjFlLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDAwZWQ6IDB4MDNjNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDAwZWU6IDB4MDNiNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwMGVmOiAweDIyMjksICAgICAjICBJTlRFUlNFQ1RJT04KKyAgICAweDAwZjA6IDB4MjI2MSwgICAgICMgIElERU5USUNBTCBUTworICAgIDB4MDBmMTogMHgwMGIxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGYyOiAweDIyNjUsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjM6IDB4MjI2NCwgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmNDogMHgyMzIwLCAgICAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKyAgICAweDAwZjU6IDB4MjMyMSwgICAgICMgIEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY2OiAweDAwZjcsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY3OiAweDIyNDgsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDAwZjg6IDB4MDBiMCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGY5OiAweDIyMTksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDAwZmE6IDB4MDBiNywgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwZmI6IDB4MjIxYSwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgwMGZjOiAweDIwN2YsICAgICAjICBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDBmZDogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHhjNycgICAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmYycgICAgICMgIDB4MDA4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOScgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHgwMDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMCcgICAgICMgIDB4MDA4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGU1JyAgICAgIyAgMHgwMDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4MDA4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZWEnICAgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHgwMDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU4JyAgICAgIyAgMHgwMDhhIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWYnICAgICAjICAweDAwOGIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWUnICAgICAjICAweDAwOGMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVjJyAgICAgIyAgMHgwMDhkIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4YzQnICAgICAjICAweDAwOGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4MDA4ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjOScgICAgICMgIDB4MDA5MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTYnICAgICAjICAweDAwOTEgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICB1J1x4YzYnICAgICAjICAweDAwOTIgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIHUnXHhmNCcgICAgICMgIDB4MDA5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDAwOTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjInICAgICAjICAweDAwOTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4MDA5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjknICAgICAjICAweDAwOTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmZicgICAgICMgIDB4MDA5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNicgICAgICMgIDB4MDA5OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHgwMDlhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YTInICAgICAjICAweDAwOWIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHgwMDljIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweDAwOWQgLT4gWUVOIFNJR04KKyAgICB1J1x1MjBhNycgICAjICAweDAwOWUgLT4gUEVTRVRBIFNJR04KKyAgICB1J1x1MDE5MicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjEnICAgICAjICAweDAwYTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMScgICAgICMgIDB4MDBhNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YWEnICAgICAjICAweDAwYTYgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDAwYTcgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJmJyAgICAgIyAgMHgwMGE4IC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1MjMxMCcgICAjICAweDAwYTkgLT4gUkVWRVJTRUQgTk9UIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhhMScgICAgICMgIDB4MDBhZCAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjEnICAgIyAgMHgwMGI1IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjInICAgIyAgMHgwMGI2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTYnICAgIyAgMHgwMGI3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NScgICAjICAweDAwYjggLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1YycgICAjICAweDAwYmQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1YicgICAjICAweDAwYmUgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU1ZScgICAjICAweDAwYzYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHgwMGM3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjcnICAgIyAgMHgwMGNmIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHgwMGQwIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjQnICAgIyAgMHgwMGQxIC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2NScgICAjICAweDAwZDIgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4MDBkMyAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1OCcgICAjICAweDAwZDQgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTInICAgIyAgMHgwMGQ1IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTMnICAgIyAgMHgwMGQ2IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NmInICAgIyAgMHgwMGQ3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NmEnICAgIyAgMHgwMGQ4IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHgwMGRkIC0+IExFRlQgSEFMRiBCTE9DSworICAgIHUnXHUyNTkwJyAgICMgIDB4MDBkZSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDNiMScgICAjICAweDAwZTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdcdTAzOTMnICAgIyAgMHgwMGUyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzYzAnICAgIyAgMHgwMGUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2EzJyAgICMgIDB4MDBlNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2MzJyAgICMgIDB4MDBlNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUwM2M0JyAgICMgIDB4MDBlNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTYnICAgIyAgMHgwMGU4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwMzk4JyAgICMgIDB4MDBlOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2E5JyAgICMgIDB4MDBlYSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2I0JyAgICMgIDB4MDBlYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MjIxZScgICAjICAweDAwZWMgLT4gSU5GSU5JVFkKKyAgICB1J1x1MDNjNicgICAjICAweDAwZWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2I1JyAgICMgIDB4MDBlZSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUyMjI5JyAgICMgIDB4MDBlZiAtPiBJTlRFUlNFQ1RJT04KKyAgICB1J1x1MjI2MScgICAjICAweDAwZjAgLT4gSURFTlRJQ0FMIFRPCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY1JyAgICMgIDB4MDBmMiAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDAwZjMgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIzMjAnICAgIyAgMHgwMGY0IC0+IFRPUCBIQUxGIElOVEVHUkFMCisgICAgdSdcdTIzMjEnICAgIyAgMHgwMGY1IC0+IEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjI0OCcgICAjICAweDAwZjcgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHgwMGY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIyMWEnICAgIyAgMHgwMGZiIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIwN2YnICAgIyAgMHgwMGZjIC0+IFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdceGIyJyAgICAgIyAgMHgwMGZkIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhMTogMHgwMGFkLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhMjogMHgwMDliLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGEzOiAweDAwOWMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMGE1OiAweDAwOWQsICAgICAjICBZRU4gU0lHTgorICAgIDB4MDBhYTogMHgwMGE2LCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYWI6IDB4MDBhZSwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFjOiAweDAwYWEsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMGZkLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI3OiAweDAwZmEsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGJhOiAweDAwYTcsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiYzogMHgwMGFjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYmY6IDB4MDBhOCwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYzQ6IDB4MDA4ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYzU6IDB4MDA4ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGM2OiAweDAwOTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgMHgwMGM3OiAweDAwODAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGQxOiAweDAwYTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZDY6IDB4MDA5OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZGM6IDB4MDA5YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZGY6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUwOiAweDAwODUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGUxOiAweDAwYTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGUyOiAweDAwODMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZTQ6IDB4MDA4NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGU1OiAweDAwODYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAwZTY6IDB4MDA5MSwgICAgICMgIExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgMHgwMGU3OiAweDAwODcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwZTg6IDB4MDA4YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwZTk6IDB4MDA4MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZWE6IDB4MDA4OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlYjogMHgwMDg5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZWM6IDB4MDA4ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwZWQ6IDB4MDBhMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZWU6IDB4MDA4YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlZjogMHgwMDhiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZjE6IDB4MDBhNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwZjI6IDB4MDA5NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwZjM6IDB4MDBhMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZjQ6IDB4MDA5MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmNjogMHgwMDk0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZjc6IDB4MDBmNiwgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjk6IDB4MDA5NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZmE6IDB4MDBhMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZmI6IDB4MDA5NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZmY6IDB4MDA5OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgMHgwMTkyOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAzOTM6IDB4MDBlMiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMzk4OiAweDAwZTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDNhMzogMHgwMGU0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYTY6IDB4MDBlOCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDNhOTogMHgwMGVhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAzYjE6IDB4MDBlMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDNiNDogMHgwMGViLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwM2I1OiAweDAwZWUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDNjMDogMHgwMGUzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwM2MzOiAweDAwZTUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYzQ6IDB4MDBlNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAzYzY6IDB4MDBlZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDIwN2Y6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgyMGE3OiAweDAwOWUsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MjIxOTogMHgwMGY5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgyMjFhOiAweDAwZmIsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MjIxZTogMHgwMGVjLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDIyMjk6IDB4MDBlZiwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MjI0ODogMHgwMGY3LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgyMjYxOiAweDAwZjAsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDIyNjQ6IDB4MDBmMywgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjI2NTogMHgwMGYyLCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMzEwOiAweDAwYTksICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MjMyMDogMHgwMGY0LCAgICAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKyAgICAweDIzMjE6IDB4MDBmNSwgICAgICMgIEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTI6IDB4MDBkNSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTUzOiAweDAwZDYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NTogMHgwMGI4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1NjogMHgwMGI3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTU4OiAweDAwZDQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTk6IDB4MDBkMywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWI6IDB4MDBiZSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTVjOiAweDAwYmQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU1ZTogMHgwMGM2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTVmOiAweDAwYzcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYxOiAweDAwYjUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU2MjogMHgwMGI2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjQ6IDB4MDBkMSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NjU6IDB4MDBkMiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2NzogMHgwMGNmLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1Njg6IDB4MDBkMCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZhOiAweDAwZDgsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2YjogMHgwMGQ3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OGM6IDB4MDBkZCwgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MjU5MDogMHgwMGRlLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQzNy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQzNy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhYjQyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDM3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQzNy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDQzNy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhYjQyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNDM3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDUwMC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNTAwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNzY2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDUwMC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDUwMCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvRUJDRElDL0NQNTAwLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwNTAwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDljJyAgICAgIyAgMHgwNCAtPiBDT05UUk9MCisgICAgdSdcdCcgICAgICAgIyAgMHgwNSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1x4ODYnICAgICAjICAweDA2IC0+IENPTlRST0wKKyAgICB1J1x4N2YnICAgICAjICAweDA3IC0+IERFTEVURQorICAgIHUnXHg5NycgICAgICMgIDB4MDggLT4gQ09OVFJPTAorICAgIHUnXHg4ZCcgICAgICMgIDB4MDkgLT4gQ09OVFJPTAorICAgIHUnXHg4ZScgICAgICMgIDB4MEEgLT4gQ09OVFJPTAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHg5ZCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTAorICAgIHUnXHg4NScgICAgICMgIDB4MTUgLT4gQ09OVFJPTAorICAgIHUnXHgwOCcgICAgICMgIDB4MTYgLT4gQkFDS1NQQUNFCisgICAgdSdceDg3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4OTInICAgICAjICAweDFBIC0+IENPTlRST0wKKyAgICB1J1x4OGYnICAgICAjICAweDFCIC0+IENPTlRST0wKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdSdceDgwJyAgICAgIyAgMHgyMCAtPiBDT05UUk9MCisgICAgdSdceDgxJyAgICAgIyAgMHgyMSAtPiBDT05UUk9MCisgICAgdSdceDgyJyAgICAgIyAgMHgyMiAtPiBDT05UUk9MCisgICAgdSdceDgzJyAgICAgIyAgMHgyMyAtPiBDT05UUk9MCisgICAgdSdceDg0JyAgICAgIyAgMHgyNCAtPiBDT05UUk9MCisgICAgdSdcbicgICAgICAgIyAgMHgyNSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MTcnICAgICAjICAweDI2IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MWInICAgICAjICAweDI3IC0+IEVTQ0FQRQorICAgIHUnXHg4OCcgICAgICMgIDB4MjggLT4gQ09OVFJPTAorICAgIHUnXHg4OScgICAgICMgIDB4MjkgLT4gQ09OVFJPTAorICAgIHUnXHg4YScgICAgICMgIDB4MkEgLT4gQ09OVFJPTAorICAgIHUnXHg4YicgICAgICMgIDB4MkIgLT4gQ09OVFJPTAorICAgIHUnXHg4YycgICAgICMgIDB4MkMgLT4gQ09OVFJPTAorICAgIHUnXHgwNScgICAgICMgIDB4MkQgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MkUgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDJGIC0+IEJFTEwKKyAgICB1J1x4OTAnICAgICAjICAweDMwIC0+IENPTlRST0wKKyAgICB1J1x4OTEnICAgICAjICAweDMxIC0+IENPTlRST0wKKyAgICB1J1x4MTYnICAgICAjICAweDMyIC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4OTMnICAgICAjICAweDMzIC0+IENPTlRST0wKKyAgICB1J1x4OTQnICAgICAjICAweDM0IC0+IENPTlRST0wKKyAgICB1J1x4OTUnICAgICAjICAweDM1IC0+IENPTlRST0wKKyAgICB1J1x4OTYnICAgICAjICAweDM2IC0+IENPTlRST0wKKyAgICB1J1x4MDQnICAgICAjICAweDM3IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4OTgnICAgICAjICAweDM4IC0+IENPTlRST0wKKyAgICB1J1x4OTknICAgICAjICAweDM5IC0+IENPTlRST0wKKyAgICB1J1x4OWEnICAgICAjICAweDNBIC0+IENPTlRST0wKKyAgICB1J1x4OWInICAgICAjICAweDNCIC0+IENPTlRST0wKKyAgICB1J1x4MTQnICAgICAjICAweDNDIC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDNEIC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDllJyAgICAgIyAgMHgzRSAtPiBDT05UUk9MCisgICAgdSdceDFhJyAgICAgIyAgMHgzRiAtPiBTVUJTVElUVVRFCisgICAgdScgJyAgICAgICAgIyAgMHg0MCAtPiBTUEFDRQorICAgIHUnXHhhMCcgICAgICMgIDB4NDEgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x4ZTInICAgICAjICAweDQyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4NDMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTAnICAgICAjICAweDQ0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTEnICAgICAjICAweDQ1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTMnICAgICAjICAweDQ2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTUnICAgICAjICAweDQ3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4NDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGYxJyAgICAgIyAgMHg0OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdbJyAgICAgICAgIyAgMHg0QSAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdScuJyAgICAgICAgIyAgMHg0QiAtPiBGVUxMIFNUT1AKKyAgICB1JzwnICAgICAgICAjICAweDRDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdScoJyAgICAgICAgIyAgMHg0RCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScrJyAgICAgICAgIyAgMHg0RSAtPiBQTFVTIFNJR04KKyAgICB1JyEnICAgICAgICAjICAweDRGIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyYnICAgICAgICAjICAweDUwIC0+IEFNUEVSU0FORAorICAgIHUnXHhlOScgICAgICMgIDB4NTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4NTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg1MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4NTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4NTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4NTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg1NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4NTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhkZicgICAgICMgIDB4NTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdFUk1BTikKKyAgICB1J10nICAgICAgICAjICAweDVBIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSckJyAgICAgICAgIyAgMHg1QiAtPiBET0xMQVIgU0lHTgorICAgIHUnKicgICAgICAgICMgIDB4NUMgLT4gQVNURVJJU0sKKyAgICB1JyknICAgICAgICAjICAweDVEIC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdSc7JyAgICAgICAgIyAgMHg1RSAtPiBTRU1JQ09MT04KKyAgICB1J14nICAgICAgICAjICAweDVGIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSctJyAgICAgICAgIyAgMHg2MCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy8nICAgICAgICAjICAweDYxIC0+IFNPTElEVVMKKyAgICB1J1x4YzInICAgICAjICAweDYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGM0JyAgICAgIyAgMHg2MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGMwJyAgICAgIyAgMHg2NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweDY1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMycgICAgICMgIDB4NjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM1JyAgICAgIyAgMHg2NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4NjggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZDEnICAgICAjICAweDY5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhNicgICAgICMgIDB4NkEgLT4gQlJPS0VOIEJBUgorICAgIHUnLCcgICAgICAgICMgIDB4NkIgLT4gQ09NTUEKKyAgICB1JyUnICAgICAgICAjICAweDZDIC0+IFBFUkNFTlQgU0lHTgorICAgIHUnXycgICAgICAgICMgIDB4NkQgLT4gTE9XIExJTkUKKyAgICB1Jz4nICAgICAgICAjICAweDZFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHg2RiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdceGY4JyAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhjOScgICAgICMgIDB4NzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGNhJyAgICAgIyAgMHg3MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYicgICAgICMgIDB4NzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4NzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHg3NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweDc2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHg3NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHg3OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J2AnICAgICAgICAjICAweDc5IC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnOicgICAgICAgICMgIDB4N0EgLT4gQ09MT04KKyAgICB1JyMnICAgICAgICAjICAweDdCIC0+IE5VTUJFUiBTSUdOCisgICAgdSdAJyAgICAgICAgIyAgMHg3QyAtPiBDT01NRVJDSUFMIEFUCisgICAgdSInIiAgICAgICAgIyAgMHg3RCAtPiBBUE9TVFJPUEhFCisgICAgdSc9JyAgICAgICAgIyAgMHg3RSAtPiBFUVVBTFMgU0lHTgorICAgIHUnIicgICAgICAgICMgIDB4N0YgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZDgnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J2EnICAgICAgICAjICAweDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4ODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4ODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J1x4YWInICAgICAjICAweDhBIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHg4QiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjAnICAgICAjICAweDhDIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEggKElDRUxBTkRJQykKKyAgICB1J1x4ZmQnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZmUnICAgICAjICAweDhFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUSE9STiAoSUNFTEFORElDKQorICAgIHUnXHhiMScgICAgICMgIDB4OEYgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIwJyAgICAgIyAgMHg5MCAtPiBERUdSRUUgU0lHTgorICAgIHUnaicgICAgICAgICMgIDB4OTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDkyIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUnXHhhYScgICAgICMgIDB4OUEgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDlCIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhlNicgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICB1J1x4YjgnICAgICAjICAweDlEIC0+IENFRElMTEEKKyAgICB1J1x4YzYnICAgICAjICAweDlFIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x4YTQnICAgICAjICAweDlGIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YjUnICAgICAjICAweEEwIC0+IE1JQ1JPIFNJR04KKyAgICB1J34nICAgICAgICAjICAweEExIC0+IFRJTERFCisgICAgdSdzJyAgICAgICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4QTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweEE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHhBNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4QTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHhBOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4QTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J1x4YTEnICAgICAjICAweEFBIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YmYnICAgICAjICAweEFCIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4ZDAnICAgICAjICAweEFDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEVUSCAoSUNFTEFORElDKQorICAgIHUnXHhkZCcgICAgICMgIDB4QUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGRlJyAgICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiAoSUNFTEFORElDKQorICAgIHUnXHhhZScgICAgICMgIDB4QUYgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGEyJyAgICAgIyAgMHhCMCAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEIxIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEIyIC0+IFlFTiBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCMyAtPiBNSURETEUgRE9UCisgICAgdSdceGE5JyAgICAgIyAgMHhCNCAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4QjUgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YmMnICAgICAjICAweEI3IC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QjggLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCOSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YWMnICAgICAjICAweEJBIC0+IE5PVCBTSUdOCisgICAgdSd8JyAgICAgICAgIyAgMHhCQiAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSdceGFmJyAgICAgIyAgMHhCQyAtPiBNQUNST04KKyAgICB1J1x4YTgnICAgICAjICAweEJEIC0+IERJQUVSRVNJUworICAgIHUnXHhiNCcgICAgICMgIDB4QkUgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGQ3JyAgICAgIyAgMHhCRiAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSd7JyAgICAgICAgIyAgMHhDMCAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J0EnICAgICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweEMyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J1x4YWQnICAgICAjICAweENBIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGY0JyAgICAgIyAgMHhDQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweENDIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYyJyAgICAgIyAgMHhDRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGYzJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY1JyAgICAgIyAgMHhDRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSd9JyAgICAgICAgIyAgMHhEMCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSdKJyAgICAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHhENyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdceGI5JyAgICAgIyAgMHhEQSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4ZmInICAgICAjICAweERCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4REMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjknICAgICAjICAweEREIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweERFIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcXCcgICAgICAgIyAgMHhFMCAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J1x4ZjcnICAgICAjICAweEUxIC0+IERJVklTSU9OIFNJR04KKyAgICB1J1MnICAgICAgICAjICAweEUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweEUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweEU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweEU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweEU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweEU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweEU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1x4YjInICAgICAjICAweEVBIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhkNCcgICAgICMgIDB4RUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDYnICAgICAjICAweEVDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDInICAgICAjICAweEVEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ1JyAgICAgIyAgMHhFRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1JzAnICAgICAgICAjICAweEYwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweEYxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4RjIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHhGMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4RjQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4RjUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4RjYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHhGNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4RjggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweEY5IC0+IERJR0lUIE5JTkUKKyAgICB1J1x4YjMnICAgICAjICAweEZBIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGRiJyAgICAgIyAgMHhGQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4RkMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkOScgICAgICMgIDB4RkQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhGRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4OWYnICAgICAjICAweEZGIC0+IENPTlRST0wKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNTAwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNTAwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJhNzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A1MDAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNTAwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNTAwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGJhNzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A1MDAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MjAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM5NmQ5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5CkBAIC0wLDAgKzEsMzA5IEBACisiIiJQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A3MjAgZ2VuZXJhdGVkIG9uIFdpbmRvd3M6CitWaXN0YSA2LjAuNjAwMiBTUDIgTXVsdGlwcm9jZXNzb3IgRnJlZSB3aXRoIHRoZSBjb21tYW5kOgorICBweXRob24gVG9vbHMvdW5pY29kZS9nZW53aW5jb2RlYy5weSA3MjAKKyIiIiMiCisKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwNzIwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHg4MCcKKyAgICB1J1x4ODEnCisgICAgdSdceGU5JyAgICAgIyAgMHg4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ODQnCisgICAgdSdceGUwJyAgICAgIyAgMHg4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceDg2JworICAgIHUnXHhlNycgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGVhJyAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU4JyAgICAgIyAgMHg4QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVmJyAgICAgIyAgMHg4QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZScgICAgICMgIDB4OEMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceDhkJworICAgIHUnXHg4ZScKKyAgICB1J1x4OGYnCisgICAgdSdceDkwJworICAgIHUnXHUwNjUxJyAgICMgIDB4OTEgLT4gQVJBQklDIFNIQUREQQorICAgIHUnXHUwNjUyJyAgICMgIDB4OTIgLT4gQVJBQklDIFNVS1VOCisgICAgdSdceGY0JyAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YTQnICAgICAjICAweDk0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1MDY0MCcgICAjICAweDk1IC0+IEFSQUJJQyBUQVRXRUVMCisgICAgdSdceGZiJyAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjknICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x1MDYyMScgICAjICAweDk4IC0+IEFSQUJJQyBMRVRURVIgSEFNWkEKKyAgICB1J1x1MDYyMicgICAjICAweDk5IC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFCisgICAgdSdcdTA2MjMnICAgIyAgMHg5QSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI0JyAgICMgIDB4OUIgLT4gQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHhhMycgICAgICMgIDB4OUMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHUwNjI1JyAgICMgIDB4OUQgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQkVMT1cKKyAgICB1J1x1MDYyNicgICAjICAweDlFIC0+IEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNycgICAjICAweDlGIC0+IEFSQUJJQyBMRVRURVIgQUxFRgorICAgIHUnXHUwNjI4JyAgICMgIDB4QTAgLT4gQVJBQklDIExFVFRFUiBCRUgKKyAgICB1J1x1MDYyOScgICAjICAweEExIC0+IEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEKKyAgICB1J1x1MDYyYScgICAjICAweEEyIC0+IEFSQUJJQyBMRVRURVIgVEVICisgICAgdSdcdTA2MmInICAgIyAgMHhBMyAtPiBBUkFCSUMgTEVUVEVSIFRIRUgKKyAgICB1J1x1MDYyYycgICAjICAweEE0IC0+IEFSQUJJQyBMRVRURVIgSkVFTQorICAgIHUnXHUwNjJkJyAgICMgIDB4QTUgLT4gQVJBQklDIExFVFRFUiBIQUgKKyAgICB1J1x1MDYyZScgICAjICAweEE2IC0+IEFSQUJJQyBMRVRURVIgS0hBSAorICAgIHUnXHUwNjJmJyAgICMgIDB4QTcgLT4gQVJBQklDIExFVFRFUiBEQUwKKyAgICB1J1x1MDYzMCcgICAjICAweEE4IC0+IEFSQUJJQyBMRVRURVIgVEhBTAorICAgIHUnXHUwNjMxJyAgICMgIDB4QTkgLT4gQVJBQklDIExFVFRFUiBSRUgKKyAgICB1J1x1MDYzMicgICAjICAweEFBIC0+IEFSQUJJQyBMRVRURVIgWkFJTgorICAgIHUnXHUwNjMzJyAgICMgIDB4QUIgLT4gQVJBQklDIExFVFRFUiBTRUVOCisgICAgdSdcdTA2MzQnICAgIyAgMHhBQyAtPiBBUkFCSUMgTEVUVEVSIFNIRUVOCisgICAgdSdcdTA2MzUnICAgIyAgMHhBRCAtPiBBUkFCSUMgTEVUVEVSIFNBRAorICAgIHUnXHhhYicgICAgICMgIDB4QUUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweEFGIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4QjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweEIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4QjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4QjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHhCNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU2MScgICAjICAweEI1IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjInICAgIyAgMHhCNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU2JyAgICMgIDB4QjcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU1JyAgICMgIDB4QjggLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4QjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4QkEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4QkIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHhCQyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTI1NWMnICAgIyAgMHhCRCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTViJyAgICMgIDB4QkUgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjUxMCcgICAjICAweEJGIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHhDMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHhDMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweEMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHhDMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHhDNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4QzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NWUnICAgIyAgMHhDNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1ZicgICAjICAweEM3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4QzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweEM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweENBIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweENCIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4Q0MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweENEIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4Q0UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY3JyAgICMgIDB4Q0YgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2OCcgICAjICAweEQwIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjQnICAgIyAgMHhEMSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjUnICAgIyAgMHhEMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NTknICAgIyAgMHhEMyAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1OCcgICAjICAweEQ0IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUyJyAgICMgIDB4RDUgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MycgICAjICAweEQ2IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NmInICAgIyAgMHhENyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTZhJyAgICMgIDB4RDggLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjUxOCcgICAjICAweEQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4REEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHhEQiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHhEQyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHhERCAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweERFIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4MCcgICAjICAweERGIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDYzNicgICAjICAweEUwIC0+IEFSQUJJQyBMRVRURVIgREFECisgICAgdSdcdTA2MzcnICAgIyAgMHhFMSAtPiBBUkFCSUMgTEVUVEVSIFRBSAorICAgIHUnXHUwNjM4JyAgICMgIDB4RTIgLT4gQVJBQklDIExFVFRFUiBaQUgKKyAgICB1J1x1MDYzOScgICAjICAweEUzIC0+IEFSQUJJQyBMRVRURVIgQUlOCisgICAgdSdcdTA2M2EnICAgIyAgMHhFNCAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOCisgICAgdSdcdTA2NDEnICAgIyAgMHhFNSAtPiBBUkFCSUMgTEVUVEVSIEZFSAorICAgIHUnXHhiNScgICAgICMgIDB4RTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUwNjQyJyAgICMgIDB4RTcgLT4gQVJBQklDIExFVFRFUiBRQUYKKyAgICB1J1x1MDY0MycgICAjICAweEU4IC0+IEFSQUJJQyBMRVRURVIgS0FGCisgICAgdSdcdTA2NDQnICAgIyAgMHhFOSAtPiBBUkFCSUMgTEVUVEVSIExBTQorICAgIHUnXHUwNjQ1JyAgICMgIDB4RUEgLT4gQVJBQklDIExFVFRFUiBNRUVNCisgICAgdSdcdTA2NDYnICAgIyAgMHhFQiAtPiBBUkFCSUMgTEVUVEVSIE5PT04KKyAgICB1J1x1MDY0NycgICAjICAweEVDIC0+IEFSQUJJQyBMRVRURVIgSEVICisgICAgdSdcdTA2NDgnICAgIyAgMHhFRCAtPiBBUkFCSUMgTEVUVEVSIFdBVworICAgIHUnXHUwNjQ5JyAgICMgIDB4RUUgLT4gQVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkEKKyAgICB1J1x1MDY0YScgICAjICAweEVGIC0+IEFSQUJJQyBMRVRURVIgWUVICisgICAgdSdcdTIyNjEnICAgIyAgMHhGMCAtPiBJREVOVElDQUwgVE8KKyAgICB1J1x1MDY0YicgICAjICAweEYxIC0+IEFSQUJJQyBGQVRIQVRBTgorICAgIHUnXHUwNjRjJyAgICMgIDB4RjIgLT4gQVJBQklDIERBTU1BVEFOCisgICAgdSdcdTA2NGQnICAgIyAgMHhGMyAtPiBBUkFCSUMgS0FTUkFUQU4KKyAgICB1J1x1MDY0ZScgICAjICAweEY0IC0+IEFSQUJJQyBGQVRIQQorICAgIHUnXHUwNjRmJyAgICMgIDB4RjUgLT4gQVJBQklDIERBTU1BCisgICAgdSdcdTA2NTAnICAgIyAgMHhGNiAtPiBBUkFCSUMgS0FTUkEKKyAgICB1J1x1MjI0OCcgICAjICAweEY3IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHhiMCcgICAgICMgIDB4RjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MjIxOScgICAjICAweEY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4RkEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMjFhJyAgICMgIDB4RkIgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjA3ZicgICAjICAweEZDIC0+IFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdceGIyJyAgICAgIyAgMHhGRCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweEZFIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4RkYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY3ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MjAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzIwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY3ODA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MjAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzM3LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1NDQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwNzM3LnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGNwNzM3IGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDczNy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwNzM3JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMzkxLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICAweDAwODE6IDB4MDM5MiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICAweDAwODI6IDB4MDM5MywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMDgzOiAweDAzOTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIDB4MDA4NDogMHgwMzk1LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDA4NTogMHgwMzk2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorICAgIDB4MDA4NjogMHgwMzk3LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgMHgwMDg3OiAweDAzOTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDA4ODogMHgwMzk5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorICAgIDB4MDA4OTogMHgwMzlhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICAweDAwOGE6IDB4MDM5YiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgMHgwMDhiOiAweDAzOWMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIDB4MDA4YzogMHgwMzlkLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICAweDAwOGQ6IDB4MDM5ZSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgMHgwMDhlOiAweDAzOWYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgMHgwMDhmOiAweDAzYTAsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIDB4MDA5MDogMHgwM2ExLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgMHgwMDkxOiAweDAzYTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDA5MjogMHgwM2E0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgMHgwMDkzOiAweDAzYTUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgMHgwMDk0OiAweDAzYTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAwOTU6IDB4MDNhNywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIDB4MDA5NjogMHgwM2E4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgMHgwMDk3OiAweDAzYTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDA5ODogMHgwM2IxLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwMDk5OiAweDAzYjIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQorICAgIDB4MDA5YTogMHgwM2IzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisgICAgMHgwMDliOiAweDAzYjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAwOWM6IDB4MDNiNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwMDlkOiAweDAzYjYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorICAgIDB4MDA5ZTogMHgwM2I3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVUQQorICAgIDB4MDA5ZjogMHgwM2I4LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCisgICAgMHgwMGEwOiAweDAzYjksICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorICAgIDB4MDBhMTogMHgwM2JhLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCisgICAgMHgwMGEyOiAweDAzYmIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEKKyAgICAweDAwYTM6IDB4MDNiYywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBNVQorICAgIDB4MDBhNDogMHgwM2JkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE5VCisgICAgMHgwMGE1OiAweDAzYmUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgWEkKKyAgICAweDAwYTY6IDB4MDNiZiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisgICAgMHgwMGE3OiAweDAzYzAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAwYTg6IDB4MDNjMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBSSE8KKyAgICAweDAwYTk6IDB4MDNjMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDBhYTogMHgwM2MyLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgMHgwMGFiOiAweDAzYzQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwMGFjOiAweDAzYzUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgorICAgIDB4MDBhZDogMHgwM2M2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MDBhZTogMHgwM2M3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIENISQorICAgIDB4MDBhZjogMHgwM2M4LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MjU2MSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI2OiAweDI1NjIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiNzogMHgyNTU2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiODogMHgyNTU1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDI1NWMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiZTogMHgyNTViLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDI1NWUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwYzc6IDB4MjU1ZiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgyNTY3LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDA6IDB4MjU2OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQxOiAweDI1NjQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQyOiAweDI1NjUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQzOiAweDI1NTksICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDQ6IDB4MjU1OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNTogMHgyNTUyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDY6IDB4MjU1MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ3OiAweDI1NmIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkODogMHgyNTZhLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDI1OGMsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGU6IDB4MjU5MCwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDNjOSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIDB4MDBlMTogMHgwM2FjLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICAweDAwZTI6IDB4MDNhZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAwZTM6IDB4MDNhZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDBlNDogMHgwM2NhLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICAweDAwZTU6IDB4MDNhZiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICAweDAwZTY6IDB4MDNjYywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICAweDAwZTc6IDB4MDNjZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAwZTg6IDB4MDNjYiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgMHgwMGU5OiAweDAzY2UsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MDBlYTogMHgwMzg2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIDB4MDBlYjogMHgwMzg4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMGVjOiAweDAzODksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDBlZDogMHgwMzhhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgMHgwMGVlOiAweDAzOGMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICAweDAwZWY6IDB4MDM4ZSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDBmMDogMHgwMzhmLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MDBmMTogMHgwMGIxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGYyOiAweDIyNjUsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjM6IDB4MjI2NCwgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmNDogMHgwM2FhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIDB4MDBmNTogMHgwM2FiLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgyMjQ4LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDBmYzogMHgyMDdmLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwZmQ6IDB4MDBiMiwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x1MDM5MScgICAjICAweDAwODAgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICB1J1x1MDM5MicgICAjICAweDAwODEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorICAgIHUnXHUwMzkzJyAgICMgIDB4MDA4MiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwMzk0JyAgICMgIDB4MDA4MyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIHUnXHUwMzk1JyAgICMgIDB4MDA4NCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzOTYnICAgIyAgMHgwMDg1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDM5NycgICAjICAweDAwODYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgdSdcdTAzOTgnICAgIyAgMHgwMDg3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzOTknICAgIyAgMHgwMDg4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDM5YScgICAjICAweDAwODkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDM5YicgICAjICAweDAwOGEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKyAgICB1J1x1MDM5YycgICAjICAweDAwOGIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUKKyAgICB1J1x1MDM5ZCcgICAjICAweDAwOGMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICB1J1x1MDM5ZScgICAjICAweDAwOGQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKyAgICB1J1x1MDM5ZicgICAjICAweDAwOGUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgorICAgIHUnXHUwM2EwJyAgICMgIDB4MDA4ZiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIHUnXHUwM2ExJyAgICMgIDB4MDA5MCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKyAgICB1J1x1MDNhMycgICAjICAweDAwOTEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNhNCcgICAjICAweDAwOTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTUnICAgIyAgMHgwMDkzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNhNicgICAjICAweDAwOTQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYTcnICAgIyAgMHgwMDk1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIHUnXHUwM2E4JyAgICMgIDB4MDA5NiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNhOScgICAjICAweDAwOTcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNiMScgICAjICAweDAwOTggLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdcdTAzYjInICAgIyAgMHgwMDk5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzYjMnICAgIyAgMHgwMDlhIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwM2I0JyAgICMgIDB4MDA5YiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDNiNScgICAjICAweDAwOWMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MDNiNicgICAjICAweDAwOWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDNiNycgICAjICAweDAwOWUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVUQQorICAgIHUnXHUwM2I4JyAgICMgIDB4MDA5ZiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNiOScgICAjICAweDAwYTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDNiYScgICAjICAweDAwYTEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCisgICAgdSdcdTAzYmInICAgIyAgMHgwMGEyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBMQU1EQQorICAgIHUnXHUwM2JjJyAgICMgIDB4MDBhMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICB1J1x1MDNiZCcgICAjICAweDAwYTQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE5VCisgICAgdSdcdTAzYmUnICAgIyAgMHgwMGE1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBYSQorICAgIHUnXHUwM2JmJyAgICMgIDB4MDBhNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIHUnXHUwM2MwJyAgICMgIDB4MDBhNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MDNjMScgICAjICAweDAwYTggLT4gR1JFRUsgU01BTEwgTEVUVEVSIFJITworICAgIHUnXHUwM2MzJyAgICMgIDB4MDBhOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjMicgICAjICAweDAwYWEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgdSdcdTAzYzQnICAgIyAgMHgwMGFiIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNjNScgICAjICAweDAwYWMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNjNicgICAjICAweDAwYWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2M3JyAgICMgIDB4MDBhZSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisgICAgdSdcdTAzYzgnICAgIyAgMHgwMGFmIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTYxJyAgICMgIDB4MDBiNSAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYyJyAgICMgIDB4MDBiNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU2JyAgICMgIDB4MDBiNyAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTUnICAgIyAgMHgwMGI4IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTI1NWMnICAgIyAgMHgwMGJkIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NWInICAgIyAgMHgwMGJlIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NWUnICAgIyAgMHgwMGM2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTVmJyAgICMgIDB4MDBjNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY3JyAgICMgIDB4MDBjZiAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY4JyAgICMgIDB4MDBkMCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY0JyAgICMgIDB4MDBkMSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjUnICAgIyAgMHgwMGQyIC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU1OScgICAjICAweDAwZDMgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NTgnICAgIyAgMHgwMGQ0IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUyJyAgICMgIDB4MDBkNSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUzJyAgICMgIDB4MDBkNiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTZiJyAgICMgIDB4MDBkNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTZhJyAgICMgIDB4MDBkOCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4MDBkZCAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDAwZGUgLT4gUklHSFQgSEFMRiBCTE9DSworICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTAzYzknICAgIyAgMHgwMGUwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2FjJyAgICMgIDB4MDBlMSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHUwM2FkJyAgICMgIDB4MDBlMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWUnICAgIyAgMHgwMGUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2NhJyAgICMgIDB4MDBlNCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2FmJyAgICMgIDB4MDBlNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2MnICAgIyAgMHgwMGU2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjZCcgICAjICAweDAwZTcgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2NiJyAgICMgIDB4MDBlOCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2NlJyAgICMgIDB4MDBlOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHUwMzg2JyAgICMgIDB4MDBlYSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzODgnICAgIyAgMHgwMGViIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwMzg5JyAgICMgIDB4MDBlYyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwMzhhJyAgICMgIDB4MDBlZCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4YycgICAjICAweDAwZWUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGUnICAgIyAgMHgwMGVmIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwMzhmJyAgICMgIDB4MDBmMCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY1JyAgICMgIDB4MDBmMiAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDAwZjMgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTAzYWEnICAgIyAgMHgwMGY0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNhYicgICAjICAweDAwZjUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHhmNycgICAgICMgIDB4MDBmNiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTIyNDgnICAgIyAgMHgwMGY3IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUyMjE5JyAgICMgIDB4MDBmOSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMjFhJyAgICMgIDB4MDBmYiAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUyMDdmJyAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYjA6IDB4MDBmOCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGIxOiAweDAwZjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwYjI6IDB4MDBmZCwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDM4NjogMHgwMGVhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIDB4MDM4ODogMHgwMGViLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMzg5OiAweDAwZWMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDM4YTogMHgwMGVkLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgMHgwMzhjOiAweDAwZWUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICAweDAzOGU6IDB4MDBlZiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDM4ZjogMHgwMGYwLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MDM5MTogMHgwMDgwLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEKKyAgICAweDAzOTI6IDB4MDA4MSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICAweDAzOTM6IDB4MDA4MiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMzk0OiAweDAwODMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIDB4MDM5NTogMHgwMDg0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDM5NjogMHgwMDg1LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorICAgIDB4MDM5NzogMHgwMDg2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVRBCisgICAgMHgwMzk4OiAweDAwODcsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDM5OTogMHgwMDg4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorICAgIDB4MDM5YTogMHgwMDg5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICAweDAzOWI6IDB4MDA4YSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgMHgwMzljOiAweDAwOGIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBNVQorICAgIDB4MDM5ZDogMHgwMDhjLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICAweDAzOWU6IDB4MDA4ZCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgMHgwMzlmOiAweDAwOGUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OCisgICAgMHgwM2EwOiAweDAwOGYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSQorICAgIDB4MDNhMTogMHgwMDkwLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgMHgwM2EzOiAweDAwOTEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDNhNDogMHgwMDkyLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgMHgwM2E1OiAweDAwOTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgMHgwM2E2OiAweDAwOTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAzYTc6IDB4MDA5NSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIDB4MDNhODogMHgwMDk2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUFNJCisgICAgMHgwM2E5OiAweDAwOTcsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDNhYTogMHgwMGY0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIDB4MDNhYjogMHgwMGY1LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIDB4MDNhYzogMHgwMGUxLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICAweDAzYWQ6IDB4MDBlMiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAzYWU6IDB4MDBlMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDNhZjogMHgwMGU1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIDB4MDNiMTogMHgwMDk4LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwM2IyOiAweDAwOTksICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQorICAgIDB4MDNiMzogMHgwMDlhLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisgICAgMHgwM2I0OiAweDAwOWIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAzYjU6IDB4MDA5YywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwM2I2OiAweDAwOWQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorICAgIDB4MDNiNzogMHgwMDllLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVUQQorICAgIDB4MDNiODogMHgwMDlmLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCisgICAgMHgwM2I5OiAweDAwYTAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorICAgIDB4MDNiYTogMHgwMGExLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCisgICAgMHgwM2JiOiAweDAwYTIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEKKyAgICAweDAzYmM6IDB4MDBhMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBNVQorICAgIDB4MDNiZDogMHgwMGE0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE5VCisgICAgMHgwM2JlOiAweDAwYTUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgWEkKKyAgICAweDAzYmY6IDB4MDBhNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisgICAgMHgwM2MwOiAweDAwYTcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAzYzE6IDB4MDBhOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBSSE8KKyAgICAweDAzYzI6IDB4MDBhYSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorICAgIDB4MDNjMzogMHgwMGE5LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwM2M0OiAweDAwYWIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwM2M1OiAweDAwYWMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgorICAgIDB4MDNjNjogMHgwMGFkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MDNjNzogMHgwMGFlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIENISQorICAgIDB4MDNjODogMHgwMGFmLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorICAgIDB4MDNjOTogMHgwMGUwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCisgICAgMHgwM2NhOiAweDAwZTQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIDB4MDNjYjogMHgwMGU4LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICAweDAzY2M6IDB4MDBlNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICAweDAzY2Q6IDB4MDBlNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAzY2U6IDB4MDBlOSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgMHgyMDdmOiAweDAwZmMsICAgICAjICBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MjIxOTogMHgwMGY5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgyMjFhOiAweDAwZmIsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MjI0ODogMHgwMGY3LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgyMjY0OiAweDAwZjMsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIyNjU6IDB4MDBmMiwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTUyOiAweDAwZDUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1MzogMHgwMGQ2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTU6IDB4MDBiOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NTY6IDB4MDBiNywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1ODogMHgwMGQ0LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTU5OiAweDAwZDMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTViOiAweDAwYmUsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1YzogMHgwMGJkLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NWU6IDB4MDBjNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1ZjogMHgwMGM3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MTogMHgwMGI1LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NjI6IDB4MDBiNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY0OiAweDAwZDEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY1OiAweDAwZDIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njc6IDB4MDBjZiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY4OiAweDAwZDAsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YTogMHgwMGQ4LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NmI6IDB4MDBkNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNThjOiAweDAwZGQsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTA6IDB4MDBkZSwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MzcucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MzcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzQ2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDczNy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MzcucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3MzcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNzQ2OTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDczNy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDc3NS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQ1NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHkKQEAgLTAsMCArMSw2OTcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A3NzUgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQNzc1LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A3NzUnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMTA2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgMHgwMDgxOiAweDAwZmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4MjogMHgwMGU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4MzogMHgwMTAxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICAweDAwODQ6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDg1OiAweDAxMjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICAweDAwODY6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NzogMHgwMTA3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIDB4MDA4ODogMHgwMTQyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICAweDAwODk6IDB4MDExMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgMHgwMDhhOiAweDAxNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIDB4MDA4YjogMHgwMTU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgMHgwMDhjOiAweDAxMmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIDB4MDA4ZDogMHgwMTc5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAwYzUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwZTYsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MzogMHgwMTRkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICAweDAwOTQ6IDB4MDBmNiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk1OiAweDAxMjIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIDB4MDA5NjogMHgwMGEyLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMDk3OiAweDAxNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICAweDAwOTg6IDB4MDE1YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICAweDAwOTk6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWE6IDB4MDBkYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDBmOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMDljOiAweDAwYTMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMDlkOiAweDAwZDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMDllOiAweDAwZDcsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMDlmOiAweDAwYTQsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGEwOiAweDAxMDAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgMHgwMGExOiAweDAxMmEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgMHgwMGEyOiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEzOiAweDAxN2IsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMGE0OiAweDAxN2MsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIDB4MDBhNTogMHgwMTdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIDB4MDBhNjogMHgyMDFkLCAgICAgIyAgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGE3OiAweDAwYTYsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGE4OiAweDAwYTksICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBhOTogMHgwMGFlLCAgICAgIyAgUkVHSVNURVJFRCBTSUdOCisgICAgMHgwMGFhOiAweDAwYWMsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhYjogMHgwMGJkLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGFjOiAweDAwYmMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYWQ6IDB4MDE0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICAweDAwYWU6IDB4MDBhYiwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFmOiAweDAwYmIsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDAxMDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgMHgwMGI2OiAweDAxMGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAweDAwYjc6IDB4MDExOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAweDAwYjg6IDB4MDExNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgwMTJlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIDB4MDBiZTogMHgwMTYwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgwMTcyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIDB4MDBjNzogMHgwMTZhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgwMTdkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgMHgwMGQwOiAweDAxMDUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDBkMTogMHgwMTBkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIDB4MDBkMjogMHgwMTE5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAweDAwZDM6IDB4MDExNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMGQ0OiAweDAxMmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIDB4MDBkNTogMHgwMTYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIDB4MDBkNjogMHgwMTczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICAweDAwZDc6IDB4MDE2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgMHgwMGQ4OiAweDAxN2UsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgyNThjLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgwMGRlOiAweDI1OTAsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgMHgwMGUyOiAweDAxNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgMHgwMGUzOiAweDAxNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICAweDAwZTQ6IDB4MDBmNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZTU6IDB4MDBkNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBlNjogMHgwMGI1LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBlNzogMHgwMTQ0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIDB4MDBlODogMHgwMTM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICAweDAwZTk6IDB4MDEzNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIDB4MDBlYTogMHgwMTNiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICAweDAwZWI6IDB4MDEzYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIDB4MDBlYzogMHgwMTQ2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgMHgwMGVkOiAweDAxMTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgMHgwMGVlOiAweDAxNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIDB4MDBlZjogMHgyMDE5LCAgICAgIyAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGYwOiAweDAwYWQsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBmMTogMHgwMGIxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGYyOiAweDIwMWMsICAgICAjICBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBmMzogMHgwMGJlLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgMHgwMGY0OiAweDAwYjYsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwZjU6IDB4MDBhNywgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgyMDFlLCAgICAgIyAgRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDAwYjksICAgICAjICBTVVBFUlNDUklQVCBPTkUKKyAgICAweDAwZmM6IDB4MDBiMywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdcdTAxMDYnICAgIyAgMHgwMDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhmYycgICAgICMgIDB4MDA4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOScgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDEnICAgIyAgMHgwMDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgdSdceGU0JyAgICAgIyAgMHgwMDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMjMnICAgIyAgMHgwMDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHhlNScgICAgICMgIDB4MDA4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x1MDEwNycgICAjICAweDAwODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTQyJyAgICMgIDB4MDA4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTEzJyAgICMgIDB4MDA4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTU2JyAgICMgIDB4MDA4YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTU3JyAgICMgIDB4MDA4YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyYicgICAjICAweDAwOGMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MDE3OScgICAjICAweDAwOGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdceGM0JyAgICAgIyAgMHgwMDhlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDAwOGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzknICAgICAjICAweDAwOTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU2JyAgICAgIyAgMHgwMDkxIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGM2JyAgICAgIyAgMHgwMDkyIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x1MDE0ZCcgICAjICAweDAwOTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x4ZjYnICAgICAjICAweDAwOTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEyMicgICAjICAweDAwOTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICB1J1x4YTInICAgICAjICAweDAwOTYgLT4gQ0VOVCBTSUdOCisgICAgdSdcdTAxNWEnICAgIyAgMHgwMDk3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTViJyAgICMgIDB4MDA5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdceGQ2JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDAwOWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmOCcgICAgICMgIDB4MDA5YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDcnICAgICAjICAweDAwOWUgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHhhNCcgICAgICMgIDB4MDA5ZiAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTAxMDAnICAgIyAgMHgwMGEwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x1MDEyYScgICAjICAweDAwYTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdcdTAxN2InICAgIyAgMHgwMGEzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE3YycgICAjICAweDAwYTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE3YScgICAjICAweDAwYTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHUyMDFkJyAgICMgIDB4MDBhNiAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YTYnICAgICAjICAweDAwYTcgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhOScgICAgICMgIDB4MDBhOCAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHhhZScgICAgICMgIDB4MDBhOSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHUwMTQxJyAgICMgIDB4MDBhZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTAxMDQnICAgIyAgMHgwMGI1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwYycgICAjICAweDAwYjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdcdTAxMTgnICAgIyAgMHgwMGI3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDExNicgICAjICAweDAwYjggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MDEyZScgICAjICAweDAwYmQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIHUnXHUwMTYwJyAgICMgIDB4MDBiZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MDE3MicgICAjICAweDAwYzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHUwMTZhJyAgICMgIDB4MDBjNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MDE3ZCcgICAjICAweDAwY2YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxMDUnICAgIyAgMHgwMGQwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMGQnICAgIyAgMHgwMGQxIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x1MDExOScgICAjICAweDAwZDIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDExNycgICAjICAweDAwZDMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyZicgICAjICAweDAwZDQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE2MScgICAjICAweDAwZDUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTczJyAgICMgIDB4MDBkNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHUwMTZiJyAgICMgIDB4MDBkNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTdlJyAgICMgIDB4MDBkOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHgwMGRkIC0+IExFRlQgSEFMRiBCTE9DSworICAgIHUnXHUyNTkwJyAgICMgIDB4MDBkZSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x4ZDMnICAgICAjICAweDAwZTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgdSdcdTAxNGMnICAgIyAgMHgwMGUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x1MDE0MycgICAjICAweDAwZTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdceGY1JyAgICAgIyAgMHgwMGU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDUnICAgICAjICAweDAwZTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGI1JyAgICAgIyAgMHgwMGU2IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MDE0NCcgICAjICAweDAwZTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTM2JyAgICMgIDB4MDBlOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTM3JyAgICMgIDB4MDBlOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEzYicgICAjICAweDAwZWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEzYycgICAjICAweDAwZWIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNDYnICAgIyAgMHgwMGVjIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTEyJyAgICMgIDB4MDBlZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxNDUnICAgIyAgMHgwMGVlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgdSdcdTIwMTknICAgIyAgMHgwMGVmIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhZCcgICAgICMgIDB4MDBmMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjAxYycgICAjICAweDAwZjIgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmUnICAgICAjICAweDAwZjMgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGI2JyAgICAgIyAgMHgwMGY0IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4MDBmNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyMDFlJyAgICMgIDB4MDBmNyAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YjAnICAgICAjICAweDAwZjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MjIxOScgICAjICAweDAwZjkgLT4gQlVMTEVUIE9QRVJBVE9SCisgICAgdSdceGI3JyAgICAgIyAgMHgwMGZhIC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjknICAgICAjICAweDAwZmIgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGIzJyAgICAgIyAgMHgwMGZjIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGIyJyAgICAgIyAgMHgwMGZkIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhMjogMHgwMDk2LCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGEzOiAweDAwOWMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMGE0OiAweDAwOWYsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGE2OiAweDAwYTcsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGE3OiAweDAwZjUsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwYTk6IDB4MDBhOCwgICAgICMgIENPUFlSSUdIVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWQ6IDB4MDBmMCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGFlOiAweDAwYTksICAgICAjICBSRUdJU1RFUkVEIFNJR04KKyAgICAweDAwYjA6IDB4MDBmOCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGIxOiAweDAwZjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwYjI6IDB4MDBmZCwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBiMzogMHgwMGZjLCAgICAgIyAgU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjY6IDB4MDBmNCwgICAgICMgIFBJTENST1cgU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiOTogMHgwMGZiLCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYmM6IDB4MDBhYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBiZDogMHgwMGFiLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGJlOiAweDAwZjMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICAweDAwYzQ6IDB4MDA4ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYzU6IDB4MDA4ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGM2OiAweDAwOTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZDM6IDB4MDBlMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBkNTogMHgwMGU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGQ2OiAweDAwOTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQ3OiAweDAwOWUsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMGQ4OiAweDAwOWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR0VSTUFOKQorICAgIDB4MDBlNDogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTU6IDB4MDA4NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBlNjogMHgwMDkxLCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwZTk6IDB4MDA4MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZjM6IDB4MDBhMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZjU6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZjY6IDB4MDA5NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY4OiAweDAwOWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAxMDA6IDB4MDBhMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICAweDAxMDE6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgMHgwMTA0OiAweDAwYjUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgMHgwMTA1OiAweDAwZDAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDEwNjogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgMHgwMTA3OiAweDAwODcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgMHgwMTBjOiAweDAwYjYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAweDAxMGQ6IDB4MDBkMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAweDAxMTI6IDB4MDBlZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICAweDAxMTM6IDB4MDA4OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgMHgwMTE2OiAweDAwYjgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMTE3OiAweDAwZDMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIDB4MDExODogMHgwMGI3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIDB4MDExOTogMHgwMGQyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAweDAxMjI6IDB4MDA5NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgMHgwMTIzOiAweDAwODUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICAweDAxMmE6IDB4MDBhMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICAweDAxMmI6IDB4MDA4YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgMHgwMTJlOiAweDAwYmQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgMHgwMTJmOiAweDAwZDQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIDB4MDEzNjogMHgwMGU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICAweDAxMzc6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIDB4MDEzYjogMHgwMGVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICAweDAxM2M6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIDB4MDE0MTogMHgwMGFkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIDB4MDE0MjogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICAweDAxNDM6IDB4MDBlMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIDB4MDE0NDogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIDB4MDE0NTogMHgwMGVlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICAweDAxNDY6IDB4MDBlYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIDB4MDE0YzogMHgwMGUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgIDB4MDE0ZDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICAweDAxNTY6IDB4MDA4YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgMHgwMTU3OiAweDAwOGIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICAweDAxNWE6IDB4MDA5NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIDB4MDE1YjogMHgwMDk4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIDB4MDE2MDogMHgwMGJlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgMHgwMTYxOiAweDAwZDUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgMHgwMTZhOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgMHgwMTZiOiAweDAwZDcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIDB4MDE3MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIDB4MDE3MzogMHgwMGQ2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICAweDAxNzk6IDB4MDA4ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIDB4MDE3YTogMHgwMGE1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIDB4MDE3YjogMHgwMGEzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIDB4MDE3YzogMHgwMGE0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAweDAxN2Q6IDB4MDBjZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MDE3ZTogMHgwMGQ4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MjAxOTogMHgwMGVmLCAgICAgIyAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgyMDFjOiAweDAwZjIsICAgICAjICBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MjAxZDogMHgwMGE2LCAgICAgIyAgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgMHgyMDFlOiAweDAwZjcsICAgICAjICBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICAweDIyMTk6IDB4MDBmOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNThjOiAweDAwZGQsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTA6IDB4MDBkZSwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTQzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDc3NS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A3NzUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZTQzNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDc3NS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTAucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1MC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzg0NzhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTAucHkKQEAgLTAsMCArMSw2OTggQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODUwLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NTAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDBlMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODU6IDB4MDBlMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwODY6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODk6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhhOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDhiOiAweDAwZWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YzogMHgwMGVlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhkOiAweDAwZWMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAwYzUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwZTYsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMGYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDA5NjogMHgwMGZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk3OiAweDAwZjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDk4OiAweDAwZmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5OTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YTogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YjogMHgwMGY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWU6IDB4MDBkNywgICAgICMgIE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICAweDAwOWY6IDB4MDE5MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNTogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE2OiAweDAwYWEsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhNzogMHgwMGJhLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE4OiAweDAwYmYsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGE5OiAweDAwYWUsICAgICAjICBSRUdJU1RFUkVEIFNJR04KKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDBiYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBhZDogMHgwMGExLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MDBjMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBiNjogMHgwMGMyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwYjc6IDB4MDBjMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBiODogMHgwMGE5LCAgICAgIyAgQ09QWVJJR0hUIFNJR04KKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgwMGEyLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGJlOiAweDAwYTUsICAgICAjICBZRU4gU0lHTgorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MDBlMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzc6IDB4MDBjMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBkMDogMHgwMGYwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIDB4MDBkMTogMHgwMGQwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgMHgwMGQyOiAweDAwY2EsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkMzogMHgwMGNiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNDogMHgwMGM4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGQ1OiAweDAxMzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgMHgwMGQ2OiAweDAwY2QsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZDc6IDB4MDBjZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ4OiAweDAwY2YsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgwMGE2LCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDBkZTogMHgwMGNjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUyOiAweDAwZDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlMzogMHgwMGQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGU0OiAweDAwZjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGU1OiAweDAwZDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IDB4MDBmZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUSE9STgorICAgIDB4MDBlODogMHgwMGRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4KKyAgICAweDAwZTk6IDB4MDBkYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMGRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWI6IDB4MDBkOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBlYzogMHgwMGZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBlZDogMHgwMGRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGVlOiAweDAwYWYsICAgICAjICBNQUNST04KKyAgICAweDAwZWY6IDB4MDBiNCwgICAgICMgIEFDVVRFIEFDQ0VOVAorICAgIDB4MDBmMDogMHgwMGFkLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMDE3LCAgICAgIyAgRE9VQkxFIExPVyBMSU5FCisgICAgMHgwMGYzOiAweDAwYmUsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICAweDAwZjQ6IDB4MDBiNiwgICAgICMgIFBJTENST1cgU0lHTgorICAgIDB4MDBmNTogMHgwMGE3LCAgICAgIyAgU0VDVElPTiBTSUdOCisgICAgMHgwMGY2OiAweDAwZjcsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY3OiAweDAwYjgsICAgICAjICBDRURJTExBCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgwMGE4LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDAwYjksICAgICAjICBTVVBFUlNDUklQVCBPTkUKKyAgICAweDAwZmM6IDB4MDBiMywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdceGM3JyAgICAgIyAgMHgwMDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGZjJyAgICAgIyAgMHgwMDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU5JyAgICAgIyAgMHgwMDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweDAwODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHgwMDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUwJyAgICAgIyAgMHgwMDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTUnICAgICAjICAweDAwODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlYScgICAgICMgIDB4MDA4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDAwOGEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZicgICAgICMgIDB4MDA4YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZScgICAgICMgIDB4MDA4YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWMnICAgICAjICAweDAwOGQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjNCcgICAgICMgIDB4MDA4ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHgwMDhmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDkwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlNicgICAgICMgIDB4MDA5MSAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIHUnXHhjNicgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdceGY0JyAgICAgIyAgMHgwMDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4MDA5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMicgICAgICMgIDB4MDA5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHgwMDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmOScgICAgICMgIDB4MDA5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZmJyAgICAgIyAgMHgwMDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ2JyAgICAgIyAgMHgwMDk5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDAwOWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmOCcgICAgICMgIDB4MDA5YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDcnICAgICAjICAweDAwOWUgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHUwMTkyJyAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x4ZTEnICAgICAjICAweDAwYTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlZCcgICAgICMgIDB4MDBhMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGYzJyAgICAgIyAgMHgwMGEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZmEnICAgICAjICAweDAwYTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmMScgICAgICMgIDB4MDBhNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQxJyAgICAgIyAgMHgwMGE1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhYScgICAgICMgIDB4MDBhNiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4MDBhNyAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmYnICAgICAjICAweDAwYTggLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhhZScgICAgICMgIDB4MDBhOSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWMnICAgICAjICAweDAwYWEgLT4gTk9UIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHgwMGFjIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhhMScgICAgICMgIDB4MDBhZCAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFiJyAgICAgIyAgMHgwMGFlIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHgwMGFmIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdceGMxJyAgICAgIyAgMHgwMGI1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4MDBiNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMCcgICAgICMgIDB4MDBiNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YTknICAgICAjICAweDAwYjggLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdceGEyJyAgICAgIyAgMHgwMGJkIC0+IENFTlQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4MDBiZSAtPiBZRU4gU0lHTgorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhlMycgICAgICMgIDB4MDBjNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGMzJyAgICAgIyAgMHgwMGM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdceGE0JyAgICAgIyAgMHgwMGNmIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4ZjAnICAgICAjICAweDAwZDAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEVUSAorICAgIHUnXHhkMCcgICAgICMgIDB4MDBkMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICB1J1x4Y2EnICAgICAjICAweDAwZDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweDAwZDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4MDBkNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x1MDEzMScgICAjICAweDAwZDUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHhjZCcgICAgICMgIDB4MDBkNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweDAwZDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweDAwZDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHhhNicgICAgICMgIDB4MDBkZCAtPiBCUk9LRU4gQkFSCisgICAgdSdceGNjJyAgICAgIyAgMHgwMGRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdceGQzJyAgICAgIyAgMHgwMGUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhkNCcgICAgICMgIDB4MDBlMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkMicgICAgICMgIDB4MDBlMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjUnICAgICAjICAweDAwZTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkNScgICAgICMgIDB4MDBlNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhmZScgICAgICMgIDB4MDBlNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZGUnICAgICAjICAweDAwZTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZGEnICAgICAjICAweDAwZTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHgwMGVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ5JyAgICAgIyAgMHgwMGViIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmZCcgICAgICMgIDB4MDBlYyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGRkJyAgICAgIyAgMHgwMGVkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhhZicgICAgICMgIDB4MDBlZSAtPiBNQUNST04KKyAgICB1J1x4YjQnICAgICAjICAweDAwZWYgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGFkJyAgICAgIyAgMHgwMGYwIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMDE3JyAgICMgIDB4MDBmMiAtPiBET1VCTEUgTE9XIExJTkUKKyAgICB1J1x4YmUnICAgICAjICAweDAwZjMgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGI2JyAgICAgIyAgMHgwMGY0IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4MDBmNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhiOCcgICAgICMgIDB4MDBmNyAtPiBDRURJTExBCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHgwMGY5IC0+IERJQUVSRVNJUworICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdceGI5JyAgICAgIyAgMHgwMGZiIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiMycgICAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTE6IDB4MDBhZCwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYTI6IDB4MDBiZCwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNDogMHgwMGNmLCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhNTogMHgwMGJlLCAgICAgIyAgWUVOIFNJR04KKyAgICAweDAwYTY6IDB4MDBkZCwgICAgICMgIEJST0tFTiBCQVIKKyAgICAweDAwYTc6IDB4MDBmNSwgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBhODogMHgwMGY5LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGE5OiAweDAwYjgsICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBhYTogMHgwMGE2LCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYWI6IDB4MDBhZSwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFjOiAweDAwYWEsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhZDogMHgwMGYwLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwYWU6IDB4MDBhOSwgICAgICMgIFJFR0lTVEVSRUQgU0lHTgorICAgIDB4MDBhZjogMHgwMGVlLCAgICAgIyAgTUFDUk9OCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjM6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGI0OiAweDAwZWYsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjY6IDB4MDBmNCwgICAgICMgIFBJTENST1cgU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiODogMHgwMGY3LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBiOTogMHgwMGZiLCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGJhOiAweDAwYTcsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiYzogMHgwMGFjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYmU6IDB4MDBmMywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIDB4MDBiZjogMHgwMGE4LCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBjMDogMHgwMGI3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGMxOiAweDAwYjUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYzI6IDB4MDBiNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGMzOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzQ6IDB4MDA4ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYzU6IDB4MDA4ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGM2OiAweDAwOTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgMHgwMGM3OiAweDAwODAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBjODogMHgwMGQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwY2E6IDB4MDBkMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGNiOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGNjOiAweDAwZGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwY2Q6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBjZTogMHgwMGQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwY2Y6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDA6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEVUSAorICAgIDB4MDBkMTogMHgwMGE1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGQyOiAweDAwZTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwZDM6IDB4MDBlMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBkNDogMHgwMGUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDU6IDB4MDBlNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBkNjogMHgwMDk5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNzogMHgwMDllLCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDBkODogMHgwMDlkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBkOTogMHgwMGViLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGRhOiAweDAwZTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZGI6IDB4MDBlYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRkOiAweDAwZWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZGU6IDB4MDBlOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMDogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGUzOiAweDAwYzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGU0OiAweDAwODQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlNTogMHgwMDg2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGU2OiAweDAwOTEsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDBlNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU4OiAweDAwOGEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwODgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWI6IDB4MDA4OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGVjOiAweDAwOGQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGVkOiAweDAwYTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGVlOiAweDAwOGMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWY6IDB4MDA4YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGYwOiAweDAwZDAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgMHgwMGYxOiAweDAwYTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGYyOiAweDAwOTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGYzOiAweDAwYTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY0OiAweDAwOTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZjU6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZjY6IDB4MDA5NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY4OiAweDAwOWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBmOTogMHgwMDk3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYjogMHgwMDk2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGZjOiAweDAwODEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmZDogMHgwMGVjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBmZTogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGZmOiAweDAwOTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MDEzMTogMHgwMGQ1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIDB4MDE5MjogMHgwMDlmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgyMDE3OiAweDAwZjIsICAgICAjICBET1VCTEUgTE9XIExJTkUKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1MC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1MC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNjc4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1MC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1MC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFiNjc4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Mi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWQ1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Mi5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A4NTIuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg1MicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDBjNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDgxOiAweDAwZmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4MjogMHgwMGU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4MzogMHgwMGUyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg0OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4NTogMHgwMTZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMDg2OiAweDAxMDcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgMHgwMDg3OiAweDAwZTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODg6IDB4MDE0MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgMHgwMDg5OiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YTogMHgwMTUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIDB4MDA4YjogMHgwMTUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICAweDAwOGM6IDB4MDBlZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4ZDogMHgwMTc5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAxMDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICAweDAwOTA6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA5MTogMHgwMTM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgMHgwMDkyOiAweDAxM2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgMHgwMDkzOiAweDAwZjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTQ6IDB4MDBmNiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk1OiAweDAxM2QsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICAweDAwOTY6IDB4MDEzZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICAweDAwOTc6IDB4MDE1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIDB4MDA5ODogMHgwMTViLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIDB4MDA5OTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YTogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YjogMHgwMTY0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENBUk9OCisgICAgMHgwMDljOiAweDAxNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENBUk9OCisgICAgMHgwMDlkOiAweDAxNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgMHgwMDllOiAweDAwZDcsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMDlmOiAweDAxMGQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgMHgwMGEwOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGExOiAweDAwZWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGEyOiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEzOiAweDAwZmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGE0OiAweDAxMDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgMHgwMGE1OiAweDAxMDUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDBhNjogMHgwMTdkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgMHgwMGE3OiAweDAxN2UsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgMHgwMGE4OiAweDAxMTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgMHgwMGE5OiAweDAxMTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDE3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAweDAwYWM6IDB4MDEwYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIDB4MDBhZDogMHgwMTVmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgwMGMxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGI2OiAweDAwYzIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBiNzogMHgwMTFhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgMHgwMGI4OiAweDAxNWUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDAxN2IsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMGJlOiAweDAxN2MsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MDEwMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIDB4MDBjNzogMHgwMTAzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBkMDogMHgwMTExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICAweDAwZDE6IDB4MDExMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICAweDAwZDI6IDB4MDEwZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIDB4MDBkMzogMHgwMGNiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNDogMHgwMTBmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIDB4MDBkNTogMHgwMTQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgMHgwMGQ2OiAweDAwY2QsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZDc6IDB4MDBjZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ4OiAweDAxMWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgwMTYyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKyAgICAweDAwZGU6IDB4MDE2ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUyOiAweDAwZDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlMzogMHgwMTQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgMHgwMGU0OiAweDAxNDQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgMHgwMGU1OiAweDAxNDgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgMHgwMGU2OiAweDAxNjAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAweDAwZTc6IDB4MDE2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAweDAwZTg6IDB4MDE1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIDB4MDBlOTogMHgwMGRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAxNTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgMHgwMGViOiAweDAxNzAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisgICAgMHgwMGVjOiAweDAwZmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGVkOiAweDAwZGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZWU6IDB4MDE2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIDB4MDBlZjogMHgwMGI0LCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGYwOiAweDAwYWQsICAgICAjICBTT0ZUIEhZUEhFTgorICAgIDB4MDBmMTogMHgwMmRkLCAgICAgIyAgRE9VQkxFIEFDVVRFIEFDQ0VOVAorICAgIDB4MDBmMjogMHgwMmRiLCAgICAgIyAgT0dPTkVLCisgICAgMHgwMGYzOiAweDAyYzcsICAgICAjICBDQVJPTgorICAgIDB4MDBmNDogMHgwMmQ4LCAgICAgIyAgQlJFVkUKKyAgICAweDAwZjU6IDB4MDBhNywgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgwMGI4LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MDBhOCwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBmYTogMHgwMmQ5LCAgICAgIyAgRE9UIEFCT1ZFCisgICAgMHgwMGZiOiAweDAxNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIDB4MDBmYzogMHgwMTU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgMHgwMGZkOiAweDAxNTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHhjNycgICAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmYycgICAgICMgIDB4MDA4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOScgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHgwMDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTZmJyAgICMgIDB4MDA4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x1MDEwNycgICAjICAweDAwODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhlNycgICAgICMgIDB4MDA4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE0MicgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x4ZWInICAgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE1MCcgICAjICAweDAwOGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHUwMTUxJyAgICMgIDB4MDA4YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4MDA4YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE3OScgICAjICAweDAwOGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdceGM0JyAgICAgIyAgMHgwMDhlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEwNicgICAjICAweDAwOGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDkwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTM5JyAgICMgIDB4MDA5MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x1MDEzYScgICAjICAweDAwOTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4MDA5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDAwOTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEzZCcgICAjICAweDAwOTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgdSdcdTAxM2UnICAgIyAgMHgwMDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICB1J1x1MDE1YScgICAjICAweDAwOTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNWInICAgIyAgMHgwMDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x4ZDYnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNjQnICAgIyAgMHgwMDliIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTY1JyAgICMgIDB4MDA5YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENBUk9OCisgICAgdSdcdTAxNDEnICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDcnICAgICAjICAweDAwOWUgLT4gTVVMVElQTElDQVRJT04gU0lHTgorICAgIHUnXHUwMTBkJyAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwNCcgICAjICAweDAwYTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTA1JyAgICMgIDB4MDBhNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTdkJyAgICMgIDB4MDBhNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDE3ZScgICAjICAweDAwYTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTE4JyAgICMgIDB4MDBhOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTknICAgIyAgMHgwMGE5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGFjJyAgICAgIyAgMHgwMGFhIC0+IE5PVCBTSUdOCisgICAgdSdcdTAxN2EnICAgIyAgMHgwMGFiIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwYycgICAjICAweDAwYWMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdcdTAxNWYnICAgIyAgMHgwMGFkIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHhhYicgICAgICMgIDB4MDBhZSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4MDBhZiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHhjMScgICAgICMgIDB4MDBiNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzInICAgICAjICAweDAwYjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDExYScgICAjICAweDAwYjcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdcdTAxNWUnICAgIyAgMHgwMGI4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUwMTdiJyAgICMgIDB4MDBiZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTAxN2MnICAgIyAgMHgwMGJlIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTAxMDInICAgIyAgMHgwMGM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIHUnXHUwMTAzJyAgICMgIDB4MDBjNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4YTQnICAgICAjICAweDAwY2YgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUwMTExJyAgICMgIDB4MDBkMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTEwJyAgICMgIDB4MDBkMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgdSdcdTAxMGUnICAgIyAgMHgwMGQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIHUnXHhjYicgICAgICMgIDB4MDBkMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMGYnICAgIyAgMHgwMGQ0IC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x1MDE0NycgICAjICAweDAwZDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgdSdceGNkJyAgICAgIyAgMHgwMGQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4MDBkNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTFiJyAgICMgIDB4MDBkOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTAxNjInICAgIyAgMHgwMGRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNmUnICAgIyAgMHgwMGRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x4ZDMnICAgICAjICAweDAwZTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGQ0JyAgICAgIyAgMHgwMGUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxNDMnICAgIyAgMHgwMGUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ0JyAgICMgIDB4MDBlNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDgnICAgIyAgMHgwMGU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICB1J1x1MDE2MCcgICAjICAweDAwZTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxNjEnICAgIyAgMHgwMGU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE1NCcgICAjICAweDAwZTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgdSdceGRhJyAgICAgIyAgMHgwMGU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTU1JyAgICMgIDB4MDBlYSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzAnICAgIyAgMHgwMGViIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZmQnICAgICAjICAweDAwZWMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZCcgICAgICMgIDB4MDBlZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2MycgICAjICAweDAwZWUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDRURJTExBCisgICAgdSdceGI0JyAgICAgIyAgMHgwMGVmIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhhZCcgICAgICMgIDB4MDBmMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHUwMmRkJyAgICMgIDB4MDBmMSAtPiBET1VCTEUgQUNVVEUgQUNDRU5UCisgICAgdSdcdTAyZGInICAgIyAgMHgwMGYyIC0+IE9HT05FSworICAgIHUnXHUwMmM3JyAgICMgIDB4MDBmMyAtPiBDQVJPTgorICAgIHUnXHUwMmQ4JyAgICMgIDB4MDBmNCAtPiBCUkVWRQorICAgIHUnXHhhNycgICAgICMgIDB4MDBmNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhiOCcgICAgICMgIDB4MDBmNyAtPiBDRURJTExBCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHgwMGY5IC0+IERJQUVSRVNJUworICAgIHUnXHUwMmQ5JyAgICMgIDB4MDBmYSAtPiBET1QgQUJPVkUKKyAgICB1J1x1MDE3MScgICAjICAweDAwZmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x1MDE1OCcgICAjICAweDAwZmMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgdSdcdTAxNTknICAgIyAgMHgwMGZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0FST04KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTQ6IDB4MDBjZiwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYTc6IDB4MDBmNSwgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBhODogMHgwMGY5LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWQ6IDB4MDBmMCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiNDogMHgwMGVmLCAgICAgIyAgQUNVVEUgQUNDRU5UCisgICAgMHgwMGI4OiAweDAwZjcsICAgICAjICBDRURJTExBCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYzE6IDB4MDBiNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBjMjogMHgwMGI2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwYzQ6IDB4MDA4ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYzc6IDB4MDA4MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwY2I6IDB4MDBkMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwY2Q6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBjZTogMHgwMGQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDM6IDB4MDBlMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBkNDogMHgwMGUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDY6IDB4MDA5OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDc6IDB4MDA5ZSwgICAgICMgIE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICAweDAwZGE6IDB4MDBlOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZDogMHgwMGVkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGU0OiAweDAwODQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGViOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMDhjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGYzOiAweDAwYTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY0OiAweDAwOTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZjY6IDB4MDA5NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGZhOiAweDAwYTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGZjOiAweDAwODEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmZDogMHgwMGVjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDEwMjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgMHgwMTAzOiAweDAwYzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgMHgwMTA0OiAweDAwYTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgMHgwMTA1OiAweDAwYTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIDB4MDEwNjogMHgwMDhmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgMHgwMTA3OiAweDAwODYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgMHgwMTBjOiAweDAwYWMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAweDAxMGQ6IDB4MDA5ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAweDAxMGU6IDB4MDBkMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIDB4MDEwZjogMHgwMGQ0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIDB4MDExMDogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIDB4MDExMTogMHgwMGQwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICAweDAxMTg6IDB4MDBhOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAweDAxMTk6IDB4MDBhOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgMHgwMTFhOiAweDAwYjcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST04KKyAgICAweDAxMWI6IDB4MDBkOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0FST04KKyAgICAweDAxMzk6IDB4MDA5MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgIDB4MDEzYTogMHgwMDkyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgIDB4MDEzZDogMHgwMDk1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgMHgwMTNlOiAweDAwOTYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgMHgwMTQxOiAweDAwOWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgMHgwMTQyOiAweDAwODgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIDB4MDE0MzogMHgwMGUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgMHgwMTQ0OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgMHgwMTQ3OiAweDAwZDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICAweDAxNDg6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICAweDAxNTA6IDB4MDA4YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICAweDAxNTE6IDB4MDA4YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgMHgwMTU0OiAweDAwZTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICAweDAxNTU6IDB4MDBlYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICAweDAxNTg6IDB4MDBmYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIDB4MDE1OTogMHgwMGZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIDB4MDE1YTogMHgwMDk3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgMHgwMTViOiAweDAwOTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgMHgwMTVlOiAweDAwYjgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIDB4MDE1ZjogMHgwMGFkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgMHgwMTYwOiAweDAwZTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAweDAxNjE6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAweDAxNjI6IDB4MDBkZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDRURJTExBCisgICAgMHgwMTYzOiAweDAwZWUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENFRElMTEEKKyAgICAweDAxNjQ6IDB4MDA5YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIDB4MDE2NTogMHgwMDljLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIDB4MDE2ZTogMHgwMGRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICAweDAxNmY6IDB4MDA4NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIDB4MDE3MDogMHgwMGViLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIDB4MDE3MTogMHgwMGZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICAweDAxNzk6IDB4MDA4ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIDB4MDE3YTogMHgwMGFiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIDB4MDE3YjogMHgwMGJkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIDB4MDE3YzogMHgwMGJlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAweDAxN2Q6IDB4MDBhNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MDE3ZTogMHgwMGE3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIDB4MDJjNzogMHgwMGYzLCAgICAgIyAgQ0FST04KKyAgICAweDAyZDg6IDB4MDBmNCwgICAgICMgIEJSRVZFCisgICAgMHgwMmQ5OiAweDAwZmEsICAgICAjICBET1QgQUJPVkUKKyAgICAweDAyZGI6IDB4MDBmMiwgICAgICMgIE9HT05FSworICAgIDB4MDJkZDogMHgwMGYxLCAgICAgIyAgRE9VQkxFIEFDVVRFIEFDQ0VOVAorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUyLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGRjZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUyLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODUyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGRjZjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU1LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxZWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU1LnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg1NS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODU1JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwNDUyLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERKRQorICAgIDB4MDA4MTogMHgwNDAyLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREpFCisgICAgMHgwMDgyOiAweDA0NTMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFCisgICAgMHgwMDgzOiAweDA0MDMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSkUKKyAgICAweDAwODQ6IDB4MDQ1MSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIDB4MDA4NTogMHgwNDAxLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICAweDAwODY6IDB4MDQ1NCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICAweDAwODc6IDB4MDQwNCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIDB4MDA4ODogMHgwNDU1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaRQorICAgIDB4MDA4OTogMHgwNDA1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRFpFCisgICAgMHgwMDhhOiAweDA0NTYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgMHgwMDhiOiAweDA0MDYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCWUVMT1JVU1NJQU4tVUtSQUlOSUFOIEkKKyAgICAweDAwOGM6IDB4MDQ1NywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZSQorICAgIDB4MDA4ZDogMHgwNDA3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICAweDAwOGU6IDB4MDQ1OCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBKRQorICAgIDB4MDA4ZjogMHgwNDA4LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSkUKKyAgICAweDAwOTA6IDB4MDQ1OSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUKKyAgICAweDAwOTE6IDB4MDQwOSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIExKRQorICAgIDB4MDA5MjogMHgwNDVhLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE5KRQorICAgIDB4MDA5MzogMHgwNDBhLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFCisgICAgMHgwMDk0OiAweDA0NWIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNIRQorICAgIDB4MDA5NTogMHgwNDBiLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNIRQorICAgIDB4MDA5NjogMHgwNDVjLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtKRQorICAgIDB4MDA5NzogMHgwNDBjLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0pFCisgICAgMHgwMDk4OiAweDA0NWUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgVQorICAgIDB4MDA5OTogMHgwNDBlLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIDB4MDA5YTogMHgwNDVmLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaSEUKKyAgICAweDAwOWI6IDB4MDQwZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERaSEUKKyAgICAweDAwOWM6IDB4MDQ0ZSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIDB4MDA5ZDogMHgwNDJlLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICAweDAwOWU6IDB4MDQ0YSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICAweDAwOWY6IDB4MDQyYSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorICAgIDB4MDBhMDogMHgwNDMwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICAweDAwYTE6IDB4MDQxMCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwYTI6IDB4MDQzMSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIDB4MDBhMzogMHgwNDExLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICAweDAwYTQ6IDB4MDQ0NiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKyAgICAweDAwYTU6IDB4MDQyNiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIDB4MDBhNjogMHgwNDM0LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisgICAgMHgwMGE3OiAweDA0MTQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorICAgIDB4MDBhODogMHgwNDM1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgMHgwMGE5OiAweDA0MTUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgIDB4MDBhYTogMHgwNDQ0LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisgICAgMHgwMGFiOiAweDA0MjQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIDB4MDBhYzogMHgwNDMzLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIDB4MDBhZDogMHgwNDEzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgwNDQ1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgMHgwMGI2OiAweDA0MjUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorICAgIDB4MDBiNzogMHgwNDM4LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKyAgICAweDAwYjg6IDB4MDQxOCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgwNDM5LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDAwYmU6IDB4MDQxOSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDA0M2EsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKyAgICAweDAwYzc6IDB4MDQxYSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDAwYTQsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGQwOiAweDA0M2IsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICAweDAwZDE6IDB4MDQxYiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgMHgwMGQyOiAweDA0M2MsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICAweDAwZDM6IDB4MDQxYywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisgICAgMHgwMGQ0OiAweDA0M2QsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4KKyAgICAweDAwZDU6IDB4MDQxZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgMHgwMGQ2OiAweDA0M2UsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIDB4MDBkNzogMHgwNDFlLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDBkODogMHgwNDNmLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgwNDFmLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKyAgICAweDAwZGU6IDB4MDQ0ZiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZQQorICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwNDJmLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKyAgICAweDAwZTE6IDB4MDQ0MCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIDB4MDBlMjogMHgwNDIwLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICAweDAwZTM6IDB4MDQ0MSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgIDB4MDBlNDogMHgwNDIxLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICAweDAwZTU6IDB4MDQ0MiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIDB4MDBlNjogMHgwNDIyLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKyAgICAweDAwZTc6IDB4MDQ0MywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMGU4OiAweDA0MjMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMGU5OiAweDA0MzYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisgICAgMHgwMGVhOiAweDA0MTYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKyAgICAweDAwZWI6IDB4MDQzMiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBWRQorICAgIDB4MDBlYzogMHgwNDEyLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKyAgICAweDAwZWQ6IDB4MDQ0YywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAweDAwZWU6IDB4MDQyYywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIDB4MDBlZjogMHgyMTE2LCAgICAgIyAgTlVNRVJPIFNJR04KKyAgICAweDAwZjA6IDB4MDBhZCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGYxOiAweDA0NGIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIDB4MDBmMjogMHgwNDJiLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorICAgIDB4MDBmMzogMHgwNDM3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgMHgwMGY0OiAweDA0MTcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIDB4MDBmNTogMHgwNDQ4LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorICAgIDB4MDBmNjogMHgwNDI4LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgMHgwMGY3OiAweDA0NGQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIDB4MDBmODogMHgwNDJkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDBmOTogMHgwNDQ5LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgMHgwMGZhOiAweDA0MjksICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIDB4MDBmYjogMHgwNDQ3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorICAgIDB4MDBmYzogMHgwNDI3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgMHgwMGZkOiAweDAwYTcsICAgICAjICBTRUNUSU9OIFNJR04KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdcdTA0NTInICAgIyAgMHgwMDgwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBESkUKKyAgICB1J1x1MDQwMicgICAjICAweDAwODEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREpFCisgICAgdSdcdTA0NTMnICAgIyAgMHgwMDgyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBHSkUKKyAgICB1J1x1MDQwMycgICAjICAweDAwODMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0pFCisgICAgdSdcdTA0NTEnICAgIyAgMHgwMDg0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIHUnXHUwNDAxJyAgICMgIDB4MDA4NSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTworICAgIHUnXHUwNDU0JyAgICMgIDB4MDA4NiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTA0MDQnICAgIyAgMHgwMDg3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUwNDU1JyAgICMgIDB4MDA4OCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpFCisgICAgdSdcdTA0MDUnICAgIyAgMHgwMDg5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERaRQorICAgIHUnXHUwNDU2JyAgICMgIDB4MDA4YSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgdSdcdTA0MDYnICAgIyAgMHgwMDhiIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDU3JyAgICMgIDB4MDA4YyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKyAgICB1J1x1MDQwNycgICAjICAweDAwOGQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICB1J1x1MDQ1OCcgICAjICAweDAwOGUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEpFCisgICAgdSdcdTA0MDgnICAgIyAgMHgwMDhmIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEpFCisgICAgdSdcdTA0NTknICAgIyAgMHgwMDkwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUKKyAgICB1J1x1MDQwOScgICAjICAweDAwOTEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTEpFCisgICAgdSdcdTA0NWEnICAgIyAgMHgwMDkyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKyAgICB1J1x1MDQwYScgICAjICAweDAwOTMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFCisgICAgdSdcdTA0NWInICAgIyAgMHgwMDk0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0MGInICAgIyAgMHgwMDk1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUKKyAgICB1J1x1MDQ1YycgICAjICAweDAwOTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtKRQorICAgIHUnXHUwNDBjJyAgICMgIDB4MDA5NyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLSkUKKyAgICB1J1x1MDQ1ZScgICAjICAweDAwOTggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKyAgICB1J1x1MDQwZScgICAjICAweDAwOTkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIHUnXHUwNDVmJyAgICMgIDB4MDA5YSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpIRQorICAgIHUnXHUwNDBmJyAgICMgIDB4MDA5YiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFCisgICAgdSdcdTA0NGUnICAgIyAgMHgwMDljIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIHUnXHUwNDJlJyAgICMgIDB4MDA5ZCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorICAgIHUnXHUwNDRhJyAgICMgIDB4MDA5ZSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgdSdcdTA0MmEnICAgIyAgMHgwMDlmIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDMwJyAgICMgIDB4MDBhMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorICAgIHUnXHUwNDEwJyAgICMgIDB4MDBhMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdcdTA0MzEnICAgIyAgMHgwMGEyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIHUnXHUwNDExJyAgICMgIDB4MDBhMyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorICAgIHUnXHUwNDQ2JyAgICMgIDB4MDBhNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgdSdcdTA0MjYnICAgIyAgMHgwMGE1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDM0JyAgICMgIDB4MDBhNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICB1J1x1MDQxNCcgICAjICAweDAwYTcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICB1J1x1MDQzNScgICAjICAweDAwYTggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgdSdcdTA0MTUnICAgIyAgMHgwMGE5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgdSdcdTA0NDQnICAgIyAgMHgwMGFhIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIHUnXHUwNDI0JyAgICMgIDB4MDBhYiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIHUnXHUwNDMzJyAgICMgIDB4MDBhYyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MTMnICAgIyAgMHgwMGFkIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorICAgIHUnXHhhYicgICAgICMgIDB4MDBhZSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4MDBhZiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUwNDQ1JyAgICMgIDB4MDBiNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKyAgICB1J1x1MDQyNScgICAjICAweDAwYjYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICB1J1x1MDQzOCcgICAjICAweDAwYjcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKyAgICB1J1x1MDQxOCcgICAjICAweDAwYjggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MDQzOScgICAjICAweDAwYmQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQxOScgICAjICAweDAwYmUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUwNDNhJyAgICMgIDB4MDBjNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKyAgICB1J1x1MDQxYScgICAjICAweDAwYzcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhhNCcgICAgICMgIDB4MDBjZiAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTA0M2InICAgIyAgMHgwMGQwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorICAgIHUnXHUwNDFiJyAgICMgIDB4MDBkMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIHUnXHUwNDNjJyAgICMgIDB4MDBkMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICB1J1x1MDQxYycgICAjICAweDAwZDMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICB1J1x1MDQzZCcgICAjICAweDAwZDQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgdSdcdTA0MWQnICAgIyAgMHgwMGQ1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgdSdcdTA0M2UnICAgIyAgMHgwMGQ2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBPCisgICAgdSdcdTA0MWUnICAgIyAgMHgwMGQ3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1x1MDQzZicgICAjICAweDAwZDggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTA0MWYnICAgIyAgMHgwMGRkIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgdSdcdTA0NGYnICAgIyAgMHgwMGRlIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZQQorICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTA0MmYnICAgIyAgMHgwMGUwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgdSdcdTA0NDAnICAgIyAgMHgwMGUxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIHUnXHUwNDIwJyAgICMgIDB4MDBlMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgIHUnXHUwNDQxJyAgICMgIDB4MDBlMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICB1J1x1MDQyMScgICAjICAweDAwZTQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICB1J1x1MDQ0MicgICAjICAweDAwZTUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgdSdcdTA0MjInICAgIyAgMHgwMGU2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgdSdcdTA0NDMnICAgIyAgMHgwMGU3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgdSdcdTA0MjMnICAgIyAgMHgwMGU4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1x1MDQzNicgICAjICAweDAwZTkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDE2JyAgICMgIDB4MDBlYSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQzMicgICAjICAweDAwZWIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgdSdcdTA0MTInICAgIyAgMHgwMGVjIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgdSdcdTA0NGMnICAgIyAgMHgwMGVkIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR04KKyAgICB1J1x1MDQyYycgICAjICAweDAwZWUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTIxMTYnICAgIyAgMHgwMGVmIC0+IE5VTUVSTyBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHgwMGYwIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdTA0NGInICAgIyAgMHgwMGYxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0MmInICAgIyAgMHgwMGYyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQzNycgICAjICAweDAwZjMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgdSdcdTA0MTcnICAgIyAgMHgwMGY0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisgICAgdSdcdTA0NDgnICAgIyAgMHgwMGY1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQyOCcgICAjICAweDAwZjYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgdSdcdTA0NGQnICAgIyAgMHgwMGY3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFCisgICAgdSdcdTA0MmQnICAgIyAgMHgwMGY4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J1x1MDQ0OScgICAjICAweDAwZjkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0MjknICAgIyAgMHgwMGZhIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0NDcnICAgIyAgMHgwMGZiIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQyNycgICAjICAweDAwZmMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgdSdceGE3JyAgICAgIyAgMHgwMGZkIC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhNDogMHgwMGNmLCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhNzogMHgwMGZkLCAgICAgIyAgU0VDVElPTiBTSUdOCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZDogMHgwMGYwLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDQwMTogMHgwMDg1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICAweDA0MDI6IDB4MDA4MSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERKRQorICAgIDB4MDQwMzogMHgwMDgzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0pFCisgICAgMHgwNDA0OiAweDAwODcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICAweDA0MDU6IDB4MDA4OSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERaRQorICAgIDB4MDQwNjogMHgwMDhiLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgMHgwNDA3OiAweDAwOGQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorICAgIDB4MDQwODogMHgwMDhmLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSkUKKyAgICAweDA0MDk6IDB4MDA5MSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIExKRQorICAgIDB4MDQwYTogMHgwMDkzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFCisgICAgMHgwNDBiOiAweDAwOTUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0hFCisgICAgMHgwNDBjOiAweDAwOTcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLSkUKKyAgICAweDA0MGU6IDB4MDA5OSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIFUKKyAgICAweDA0MGY6IDB4MDA5YiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERaSEUKKyAgICAweDA0MTA6IDB4MDBhMSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDA0MTE6IDB4MDBhMywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEJFCisgICAgMHgwNDEyOiAweDAwZWMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIDB4MDQxMzogMHgwMGFkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgMHgwNDE0OiAweDAwYTcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorICAgIDB4MDQxNTogMHgwMGE5LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICAweDA0MTY6IDB4MDBlYSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorICAgIDB4MDQxNzogMHgwMGY0LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUKKyAgICAweDA0MTg6IDB4MDBiOCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDA0MTk6IDB4MDBiZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDA0MWE6IDB4MDBjNywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBCisgICAgMHgwNDFiOiAweDAwZDEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIDB4MDQxYzogMHgwMGQzLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKyAgICAweDA0MWQ6IDB4MDBkNSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVOCisgICAgMHgwNDFlOiAweDAwZDcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwNDFmOiAweDAwZGQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorICAgIDB4MDQyMDogMHgwMGUyLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICAweDA0MjE6IDB4MDBlNCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgMHgwNDIyOiAweDAwZTYsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIDB4MDQyMzogMHgwMGU4LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDQyNDogMHgwMGFiLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICAweDA0MjU6IDB4MDBiNiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgMHgwNDI2OiAweDAwYTUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0UKKyAgICAweDA0Mjc6IDB4MDBmYywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIDB4MDQyODogMHgwMGY2LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgMHgwNDI5OiAweDAwZmEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIDB4MDQyYTogMHgwMDlmLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisgICAgMHgwNDJiOiAweDAwZjIsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgMHgwNDJjOiAweDAwZWUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAweDA0MmQ6IDB4MDBmOCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDA0MmU6IDB4MDA5ZCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgMHgwNDJmOiAweDAwZTAsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgIDB4MDQzMDogMHgwMGEwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICAweDA0MzE6IDB4MDBhMiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIDB4MDQzMjogMHgwMGViLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgMHgwNDMzOiAweDAwYWMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgMHgwNDM0OiAweDAwYTYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICAweDA0MzU6IDB4MDBhOCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIDB4MDQzNjogMHgwMGU5LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIDB4MDQzNzogMHgwMGYzLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgMHgwNDM4OiAweDAwYjcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgIDB4MDQzOTogMHgwMGJkLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICAweDA0M2E6IDB4MDBjNiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIDB4MDQzYjogMHgwMGQwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgMHgwNDNjOiAweDAwZDIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICAweDA0M2Q6IDB4MDBkNCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIDB4MDQzZTogMHgwMGQ2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICAweDA0M2Y6IDB4MDBkOCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIDB4MDQ0MDogMHgwMGUxLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgMHgwNDQxOiAweDAwZTMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICAweDA0NDI6IDB4MDBlNSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIDB4MDQ0MzogMHgwMGU3LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICAweDA0NDQ6IDB4MDBhYSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIDB4MDQ0NTogMHgwMGI1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgMHgwNDQ2OiAweDAwYTQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgMHgwNDQ3OiAweDAwZmIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgMHgwNDQ4OiAweDAwZjUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgMHgwNDQ5OiAweDAwZjksICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICAweDA0NGE6IDB4MDA5ZSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICAweDA0NGI6IDB4MDBmMSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgMHgwNDRjOiAweDAwZWQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgMHgwNDRkOiAweDAwZjcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIDB4MDQ0ZTogMHgwMDljLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisgICAgMHgwNDRmOiAweDAwZGUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKyAgICAweDA0NTE6IDB4MDA4NCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIDB4MDQ1MjogMHgwMDgwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERKRQorICAgIDB4MDQ1MzogMHgwMDgyLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdKRQorICAgIDB4MDQ1NDogMHgwMDg2LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIDB4MDQ1NTogMHgwMDg4LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaRQorICAgIDB4MDQ1NjogMHgwMDhhLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIDB4MDQ1NzogMHgwMDhjLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJCisgICAgMHgwNDU4OiAweDAwOGUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSkUKKyAgICAweDA0NTk6IDB4MDA5MCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUKKyAgICAweDA0NWE6IDB4MDA5MiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBOSkUKKyAgICAweDA0NWI6IDB4MDA5NCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0hFCisgICAgMHgwNDVjOiAweDAwOTYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0pFCisgICAgMHgwNDVlOiAweDAwOTgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgVQorICAgIDB4MDQ1ZjogMHgwMDlhLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERaSEUKKyAgICAweDIxMTY6IDB4MDBlZiwgICAgICMgIE5VTUVSTyBTSUdOCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTE4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1NS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTE4NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1NS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ni5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNjMmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A4NTYgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlTQy9DUDg1Ni5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg1NicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTA1ZDAnICAgIyAgMHg4MCAtPiBIRUJSRVcgTEVUVEVSIEFMRUYKKyAgICB1J1x1MDVkMScgICAjICAweDgxIC0+IEhFQlJFVyBMRVRURVIgQkVUCisgICAgdSdcdTA1ZDInICAgIyAgMHg4MiAtPiBIRUJSRVcgTEVUVEVSIEdJTUVMCisgICAgdSdcdTA1ZDMnICAgIyAgMHg4MyAtPiBIRUJSRVcgTEVUVEVSIERBTEVUCisgICAgdSdcdTA1ZDQnICAgIyAgMHg4NCAtPiBIRUJSRVcgTEVUVEVSIEhFCisgICAgdSdcdTA1ZDUnICAgIyAgMHg4NSAtPiBIRUJSRVcgTEVUVEVSIFZBVgorICAgIHUnXHUwNWQ2JyAgICMgIDB4ODYgLT4gSEVCUkVXIExFVFRFUiBaQVlJTgorICAgIHUnXHUwNWQ3JyAgICMgIDB4ODcgLT4gSEVCUkVXIExFVFRFUiBIRVQKKyAgICB1J1x1MDVkOCcgICAjICAweDg4IC0+IEhFQlJFVyBMRVRURVIgVEVUCisgICAgdSdcdTA1ZDknICAgIyAgMHg4OSAtPiBIRUJSRVcgTEVUVEVSIFlPRAorICAgIHUnXHUwNWRhJyAgICMgIDB4OEEgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBLQUYKKyAgICB1J1x1MDVkYicgICAjICAweDhCIC0+IEhFQlJFVyBMRVRURVIgS0FGCisgICAgdSdcdTA1ZGMnICAgIyAgMHg4QyAtPiBIRUJSRVcgTEVUVEVSIExBTUVECisgICAgdSdcdTA1ZGQnICAgIyAgMHg4RCAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIE1FTQorICAgIHUnXHUwNWRlJyAgICMgIDB4OEUgLT4gSEVCUkVXIExFVFRFUiBNRU0KKyAgICB1J1x1MDVkZicgICAjICAweDhGIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgTlVOCisgICAgdSdcdTA1ZTAnICAgIyAgMHg5MCAtPiBIRUJSRVcgTEVUVEVSIE5VTgorICAgIHUnXHUwNWUxJyAgICMgIDB4OTEgLT4gSEVCUkVXIExFVFRFUiBTQU1FS0gKKyAgICB1J1x1MDVlMicgICAjICAweDkyIC0+IEhFQlJFVyBMRVRURVIgQVlJTgorICAgIHUnXHUwNWUzJyAgICMgIDB4OTMgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBQRQorICAgIHUnXHUwNWU0JyAgICMgIDB4OTQgLT4gSEVCUkVXIExFVFRFUiBQRQorICAgIHUnXHUwNWU1JyAgICMgIDB4OTUgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBUU0FESQorICAgIHUnXHUwNWU2JyAgICMgIDB4OTYgLT4gSEVCUkVXIExFVFRFUiBUU0FESQorICAgIHUnXHUwNWU3JyAgICMgIDB4OTcgLT4gSEVCUkVXIExFVFRFUiBRT0YKKyAgICB1J1x1MDVlOCcgICAjICAweDk4IC0+IEhFQlJFVyBMRVRURVIgUkVTSAorICAgIHUnXHUwNWU5JyAgICMgIDB4OTkgLT4gSEVCUkVXIExFVFRFUiBTSElOCisgICAgdSdcdTA1ZWEnICAgIyAgMHg5QSAtPiBIRUJSRVcgTEVUVEVSIFRBVgorICAgIHUnXHVmZmZlJyAgICMgIDB4OUIgLT4gVU5ERUZJTkVECisgICAgdSdceGEzJyAgICAgIyAgMHg5QyAtPiBQT1VORCBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHg5RCAtPiBVTkRFRklORUQKKyAgICB1J1x4ZDcnICAgICAjICAweDlFIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDlGIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QTAgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBMSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEEyIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QTMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBNCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEE1IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QTYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhBNyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEE4IC0+IFVOREVGSU5FRAorICAgIHUnXHhhZScgICAgICMgIDB4QTkgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFjJyAgICAgIyAgMHhBQSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4QUIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJjJyAgICAgIyAgMHhBQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x1ZmZmZScgICAjICAweEFEIC0+IFVOREVGSU5FRAorICAgIHUnXHhhYicgICAgICMgIDB4QUUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweEFGIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyNTkxJyAgICMgIDB4QjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweEIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4QjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4QjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHhCNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1ZmZmZScgICAjICAweEI1IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4QjYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhCNyAtPiBVTkRFRklORUQKKyAgICB1J1x4YTknICAgICAjICAweEI4IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTI1NjMnICAgIyAgMHhCOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHhCQSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHhCQiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweEJDIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x4YTInICAgICAjICAweEJEIC0+IENFTlQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QkUgLT4gWUVOIFNJR04KKyAgICB1J1x1MjUxMCcgICAjICAweEJGIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHhDMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHhDMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweEMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHhDMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHhDNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4QzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdWZmZmUnICAgIyAgMHhDNiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEM3IC0+IFVOREVGSU5FRAorICAgIHUnXHUyNTVhJyAgICMgIDB4QzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweEM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweENBIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweENCIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4Q0MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweENEIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4Q0UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhhNCcgICAgICMgIDB4Q0YgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4RDAgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhEMSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEQyIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RDMgLT4gVU5ERUZJTkVEUworICAgIHUnXHVmZmZlJyAgICMgIDB4RDQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhENSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEQ2IC0+IFVOREVGSU5FREUKKyAgICB1J1x1ZmZmZScgICAjICAweEQ3IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RDggLT4gVU5ERUZJTkVECisgICAgdSdcdTI1MTgnICAgIyAgMHhEOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweERBIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4REIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4REMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHhhNicgICAgICMgIDB4REQgLT4gQlJPS0VOIEJBUgorICAgIHUnXHVmZmZlJyAgICMgIDB4REUgLT4gVU5ERUZJTkVECisgICAgdSdcdTI1ODAnICAgIyAgMHhERiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdWZmZmUnICAgIyAgMHhFMCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEUxIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RTIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFMyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEU0IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RTUgLT4gVU5ERUZJTkVECisgICAgdSdceGI1JyAgICAgIyAgMHhFNiAtPiBNSUNSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHhFNyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEU4IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RTkgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFQSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEVCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RUMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhFRCAtPiBVTkRFRklORUQKKyAgICB1J1x4YWYnICAgICAjICAweEVFIC0+IE1BQ1JPTgorICAgIHUnXHhiNCcgICAgICMgIDB4RUYgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGFkJyAgICAgIyAgMHhGMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhiMScgICAgICMgIDB4RjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIwMTcnICAgIyAgMHhGMiAtPiBET1VCTEUgTE9XIExJTkUKKyAgICB1J1x4YmUnICAgICAjICAweEYzIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhiNicgICAgICMgIDB4RjQgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhGNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4ZjcnICAgICAjICAweEY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4YjgnICAgICAjICAweEY3IC0+IENFRElMTEEKKyAgICB1J1x4YjAnICAgICAjICAweEY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhGOSAtPiBESUFFUkVTSVMKKyAgICB1J1x4YjcnICAgICAjICAweEZBIC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjknICAgICAjICAweEZCIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiMycgICAgICMgIDB4RkMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4YjInICAgICAjICAweEZEIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHUyNWEwJyAgICMgIDB4RkUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHhGRiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzQzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ni5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzQzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ni5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTcucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ny5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQxOTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTcucHkKQEAgLTAsMCArMSw2OTQgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODU3LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NTcnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDBlMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODU6IDB4MDBlMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwODY6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODk6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhhOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDhiOiAweDAwZWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YzogMHgwMGVlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhkOiAweDAxMzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAwYzUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwZTYsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMGYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDA5NjogMHgwMGZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk3OiAweDAwZjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDk4OiAweDAxMzAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRE9UIEFCT1ZFCisgICAgMHgwMDk5OiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDlhOiAweDAwZGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDliOiAweDAwZjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwMGQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5ZTogMHgwMTVlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICAweDAwOWY6IDB4MDE1ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNTogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE2OiAweDAxMWUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICAweDAwYTc6IDB4MDExZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICAweDAwYTg6IDB4MDBiZiwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYTk6IDB4MDBhZSwgICAgICMgIFJFR0lTVEVSRUQgU0lHTgorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAwYTEsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgwMGMxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGI2OiAweDAwYzIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBiNzogMHgwMGMwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGI4OiAweDAwYTksICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDAwYTIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYmU6IDB4MDBhNSwgICAgICMgIFlFTiBTSUdOCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgwMGUzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBjNzogMHgwMGMzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDAwYTQsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGQwOiAweDAwYmEsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwZDE6IDB4MDBhYSwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGQyOiAweDAwY2EsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkMzogMHgwMGNiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNDogMHgwMGM4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGQ1OiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwZDY6IDB4MDBjZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBkNzogMHgwMGNlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDg6IDB4MDBjZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDAwYTYsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGRlOiAweDAwY2MsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDBkMywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBlMTogMHgwMGRmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTI6IDB4MDBkNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGUzOiAweDAwZDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwZTQ6IDB4MDBmNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZTU6IDB4MDBkNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBlNjogMHgwMGI1LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBlNzogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMGU4OiAweDAwZDcsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMGU5OiAweDAwZGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZWE6IDB4MDBkYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwZDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZWQ6IDB4MDBmZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGVlOiAweDAwYWYsICAgICAjICBNQUNST04KKyAgICAweDAwZWY6IDB4MDBiNCwgICAgICMgIEFDVVRFIEFDQ0VOVAorICAgIDB4MDBmMDogMHgwMGFkLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMGYzOiAweDAwYmUsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICAweDAwZjQ6IDB4MDBiNiwgICAgICMgIFBJTENST1cgU0lHTgorICAgIDB4MDBmNTogMHgwMGE3LCAgICAgIyAgU0VDVElPTiBTSUdOCisgICAgMHgwMGY2OiAweDAwZjcsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY3OiAweDAwYjgsICAgICAjICBDRURJTExBCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgwMGE4LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDAwYjksICAgICAjICBTVVBFUlNDUklQVCBPTkUKKyAgICAweDAwZmM6IDB4MDBiMywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdceGM3JyAgICAgIyAgMHgwMDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGZjJyAgICAgIyAgMHgwMDgxIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU5JyAgICAgIyAgMHgwMDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweDAwODMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHgwMDg0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUwJyAgICAgIyAgMHgwMDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTUnICAgICAjICAweDAwODYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU3JyAgICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlYScgICAgICMgIDB4MDA4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDAwODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTgnICAgICAjICAweDAwOGEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlZicgICAgICMgIDB4MDA4YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZScgICAgICMgIDB4MDA4YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEzMScgICAjICAweDAwOGQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHhjNCcgICAgICMgIDB4MDA4ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHgwMDhmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDkwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlNicgICAgICMgIDB4MDA5MSAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIHUnXHhjNicgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgdSdceGY0JyAgICAgIyAgMHgwMDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNicgICAgICMgIDB4MDA5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMicgICAgICMgIDB4MDA5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHgwMDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmOScgICAgICMgIDB4MDA5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdTAxMzAnICAgIyAgMHgwMDk4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4ZDYnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY4JyAgICAgIyAgMHgwMDliIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGEzJyAgICAgIyAgMHgwMDljIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4ZDgnICAgICAjICAweDAwOWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTVlJyAgICMgIDB4MDA5ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTVmJyAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTEnICAgICAjICAweDAwYTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlZCcgICAgICMgIDB4MDBhMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGYzJyAgICAgIyAgMHgwMGEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZmEnICAgICAjICAweDAwYTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmMScgICAgICMgIDB4MDBhNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQxJyAgICAgIyAgMHgwMGE1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHUwMTFlJyAgICMgIDB4MDBhNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x1MDExZicgICAjICAweDAwYTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHhiZicgICAgICMgIDB4MDBhOCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGFlJyAgICAgIyAgMHgwMGE5IC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4MDBhYiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmMnICAgICAjICAweDAwYWMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGExJyAgICAgIyAgMHgwMGFkIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x4YzEnICAgICAjICAweDAwYjUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHgwMGI2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMwJyAgICAgIyAgMHgwMGI3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhhOScgICAgICMgIDB4MDBiOCAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x4YTInICAgICAjICAweDAwYmQgLT4gQ0VOVCBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHgwMGJlIC0+IFlFTiBTSUdOCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdceGUzJyAgICAgIyAgMHgwMGM2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4YzMnICAgICAjICAweDAwYzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4YTQnICAgICAjICAweDAwY2YgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHhiYScgICAgICMgIDB4MDBkMCAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YWEnICAgICAjICAweDAwZDEgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4Y2EnICAgICAjICAweDAwZDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweDAwZDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4MDBkNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x1ZmZmZScgICAjICAweDAwZDUgLT4gVU5ERUZJTkVECisgICAgdSdceGNkJyAgICAgIyAgMHgwMGQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4MDBkNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4MDBkOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdceGE2JyAgICAgIyAgMHgwMGRkIC0+IEJST0tFTiBCQVIKKyAgICB1J1x4Y2MnICAgICAjICAweDAwZGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x4ZDMnICAgICAjICAweDAwZTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGQ0JyAgICAgIyAgMHgwMGUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQyJyAgICAgIyAgMHgwMGUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmNScgICAgICMgIDB4MDBlNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ1JyAgICAgIyAgMHgwMGU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhiNScgICAgICMgIDB4MDBlNiAtPiBNSUNSTyBTSUdOCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMGU3IC0+IFVOREVGSU5FRAorICAgIHUnXHhkNycgICAgICMgIDB4MDBlOCAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGRhJyAgICAgIyAgMHgwMGU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4MDBlYSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4MDBlYiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZWMnICAgICAjICAweDAwZWMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhmZicgICAgICMgIDB4MDBlZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhhZicgICAgICMgIDB4MDBlZSAtPiBNQUNST04KKyAgICB1J1x4YjQnICAgICAjICAweDAwZWYgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGFkJyAgICAgIyAgMHgwMGYwIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHVmZmZlJyAgICMgIDB4MDBmMiAtPiBVTkRFRklORUQKKyAgICB1J1x4YmUnICAgICAjICAweDAwZjMgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGI2JyAgICAgIyAgMHgwMGY0IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4MDBmNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhiOCcgICAgICMgIDB4MDBmNyAtPiBDRURJTExBCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHgwMGY5IC0+IERJQUVSRVNJUworICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdceGI5JyAgICAgIyAgMHgwMGZiIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiMycgICAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTE6IDB4MDBhZCwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYTI6IDB4MDBiZCwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNDogMHgwMGNmLCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhNTogMHgwMGJlLCAgICAgIyAgWUVOIFNJR04KKyAgICAweDAwYTY6IDB4MDBkZCwgICAgICMgIEJST0tFTiBCQVIKKyAgICAweDAwYTc6IDB4MDBmNSwgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBhODogMHgwMGY5LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGE5OiAweDAwYjgsICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBhYTogMHgwMGQxLCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYWI6IDB4MDBhZSwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFjOiAweDAwYWEsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhZDogMHgwMGYwLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwYWU6IDB4MDBhOSwgICAgICMgIFJFR0lTVEVSRUQgU0lHTgorICAgIDB4MDBhZjogMHgwMGVlLCAgICAgIyAgTUFDUk9OCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjM6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGI0OiAweDAwZWYsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjY6IDB4MDBmNCwgICAgICMgIFBJTENST1cgU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiODogMHgwMGY3LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBiOTogMHgwMGZiLCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGJhOiAweDAwZDAsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiYzogMHgwMGFjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYmU6IDB4MDBmMywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIDB4MDBiZjogMHgwMGE4LCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBjMDogMHgwMGI3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGMxOiAweDAwYjUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYzI6IDB4MDBiNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGMzOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzQ6IDB4MDA4ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYzU6IDB4MDA4ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGM2OiAweDAwOTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgMHgwMGM3OiAweDAwODAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBjODogMHgwMGQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwY2E6IDB4MDBkMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGNiOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGNjOiAweDAwZGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwY2Q6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBjZTogMHgwMGQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwY2Y6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDE6IDB4MDBhNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBkMjogMHgwMGUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGQzOiAweDAwZTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZDQ6IDB4MDBlMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ1OiAweDAwZTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZDY6IDB4MDA5OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDc6IDB4MDBlOCwgICAgICMgIE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICAweDAwZDg6IDB4MDA5ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZDk6IDB4MDBlYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBkYTogMHgwMGU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGRiOiAweDAwZWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkYzogMHgwMDlhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkZjogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTA6IDB4MDA4NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwZTE6IDB4MDBhMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwZTI6IDB4MDA4MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlMzogMHgwMGM2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBlNDogMHgwMDg0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZTU6IDB4MDA4NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBlNjogMHgwMDkxLCAgICAgIyAgTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICAweDAwZTc6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlODogMHgwMDhhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBlOTogMHgwMDgyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlYzogMHgwMGVjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMDhjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGVmOiAweDAwOGIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmMTogMHgwMGE0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBmMjogMHgwMDk1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY1OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGY2OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmODogMHgwMDliLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwZjk6IDB4MDA5NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZmE6IDB4MDBhMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZmI6IDB4MDA5NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBmYzogMHgwMDgxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZmY6IDB4MDBlZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgMHgwMTFlOiAweDAwYTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICAweDAxMWY6IDB4MDBhNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICAweDAxMzA6IDB4MDA5OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKyAgICAweDAxMzE6IDB4MDA4ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICAweDAxNWU6IDB4MDA5ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgMHgwMTVmOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ny5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ny5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5ZWNhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ny5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1Ny5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5ZWNhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1OC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTc2MjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg1OC5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBmb3IgQ1A4NTgsIG1vZGlmaWVkIGZyb20gY3A4NTAuCisKKyIiIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg1OCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDBjNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDgxOiAweDAwZmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4MjogMHgwMGU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4MzogMHgwMGUyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg0OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4NTogMHgwMGUwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDA4NjogMHgwMGU1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMDg3OiAweDAwZTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODg6IDB4MDBlYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4OTogMHgwMGViLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGE6IDB4MDBlOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwOGI6IDB4MDBlZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhjOiAweDAwZWUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOGQ6IDB4MDBlYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwOGU6IDB4MDBjNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGY6IDB4MDBjNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMDkwOiAweDAwYzksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwOTE6IDB4MDBlNiwgICAgICMgIExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgMHgwMDkyOiAweDAwYzYsICAgICAjICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgMHgwMDkzOiAweDAwZjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTQ6IDB4MDBmNiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk1OiAweDAwZjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMDk2OiAweDAwZmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTc6IDB4MDBmOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwOTg6IDB4MDBmZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk5OiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDlhOiAweDAwZGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDliOiAweDAwZjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwMGQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5ZTogMHgwMGQ3LCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDA5ZjogMHgwMTkyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMGEwOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGExOiAweDAwZWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGEyOiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEzOiAweDAwZmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGE0OiAweDAwZjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE1OiAweDAwZDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwYTY6IDB4MDBhYSwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE3OiAweDAwYmEsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYTg6IDB4MDBiZiwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYTk6IDB4MDBhZSwgICAgICMgIFJFR0lTVEVSRUQgU0lHTgorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAwYTEsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgwMGMxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGI2OiAweDAwYzIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBiNzogMHgwMGMwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGI4OiAweDAwYTksICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDAwYTIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYmU6IDB4MDBhNSwgICAgICMgIFlFTiBTSUdOCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgwMGUzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBjNzogMHgwMGMzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDAwYTQsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGQwOiAweDAwZjAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgMHgwMGQxOiAweDAwZDAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICAweDAwZDI6IDB4MDBjYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQzOiAweDAwY2IsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQ0OiAweDAwYzgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwZDU6IDB4MjBhYywgICAgICMgIEVVUk8gU0lHTgorICAgIDB4MDBkNjogMHgwMGNkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGQ3OiAweDAwY2UsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBkODogMHgwMGNmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MDBhNiwgICAgICMgIEJST0tFTiBCQVIKKyAgICAweDAwZGU6IDB4MDBjYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGUxOiAweDAwZGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMjogMHgwMGQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZTM6IDB4MDBkMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBlNDogMHgwMGY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBlNTogMHgwMGQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGU2OiAweDAwYjUsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGU3OiAweDAwZmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKyAgICAweDAwZTg6IDB4MDBkZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGU5OiAweDAwZGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZWE6IDB4MDBkYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwZDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwZWM6IDB4MDBmZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZWQ6IDB4MDBkZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBlZTogMHgwMGFmLCAgICAgIyAgTUFDUk9OCisgICAgMHgwMGVmOiAweDAwYjQsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwZjA6IDB4MDBhZCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IDB4MjAxNywgICAgICMgIERPVUJMRSBMT1cgTElORQorICAgIDB4MDBmMzogMHgwMGJlLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgMHgwMGY0OiAweDAwYjYsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwZjU6IDB4MDBhNywgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgwMGI4LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MDBhOCwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgwMGI5LCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGZjOiAweDAwYjMsICAgICAjICBTVVBFUlNDUklQVCBUSFJFRQorICAgIDB4MDBmZDogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHhjNycgICAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmYycgICAgICMgIDB4MDA4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOScgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHgwMDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMCcgICAgICMgIDB4MDA4NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGU1JyAgICAgIyAgMHgwMDg2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4MDA4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZWEnICAgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHgwMDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU4JyAgICAgIyAgMHgwMDhhIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZWYnICAgICAjICAweDAwOGIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWUnICAgICAjICAweDAwOGMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVjJyAgICAgIyAgMHgwMDhkIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4YzQnICAgICAjICAweDAwOGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4MDA4ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjOScgICAgICMgIDB4MDA5MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZTYnICAgICAjICAweDAwOTEgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgQUUKKyAgICB1J1x4YzYnICAgICAjICAweDAwOTIgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIHUnXHhmNCcgICAgICMgIDB4MDA5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDAwOTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjInICAgICAjICAweDAwOTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4MDA5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjknICAgICAjICAweDAwOTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmZicgICAgICMgIDB4MDA5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkNicgICAgICMgIDB4MDA5OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHgwMDlhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjgnICAgICAjICAweDAwOWIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YTMnICAgICAjICAweDAwOWMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhkOCcgICAgICMgIDB4MDA5ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ3JyAgICAgIyAgMHgwMDllIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDE5MicgICAjICAweDAwOWYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdceGUxJyAgICAgIyAgMHgwMGEwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZWQnICAgICAjICAweDAwYTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhmMycgICAgICMgIDB4MDBhMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGZhJyAgICAgIyAgMHgwMGEzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjEnICAgICAjICAweDAwYTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMScgICAgICMgIDB4MDBhNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4YWEnICAgICAjICAweDAwYTYgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweDAwYTcgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJmJyAgICAgIyAgMHgwMGE4IC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YWUnICAgICAjICAweDAwYTkgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFjJyAgICAgIyAgMHgwMGFhIC0+IE5PVCBTSUdOCisgICAgdSdceGJkJyAgICAgIyAgMHgwMGFiIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiYycgICAgICMgIDB4MDBhYyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YTEnICAgICAjICAweDAwYWQgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhYicgICAgICMgIDB4MDBhZSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4MDBhZiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHhjMScgICAgICMgIDB4MDBiNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzInICAgICAjICAweDAwYjYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzAnICAgICAjICAweDAwYjcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGE5JyAgICAgIyAgMHgwMGI4IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHhhMicgICAgICMgIDB4MDBiZCAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweDAwYmUgLT4gWUVOIFNJR04KKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x4ZTMnICAgICAjICAweDAwYzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjMycgICAgICMgIDB4MDBjNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhhNCcgICAgICMgIDB4MDBjZiAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdceGYwJyAgICAgIyAgMHgwMGQwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEgKKyAgICB1J1x4ZDAnICAgICAjICAweDAwZDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRICisgICAgdSdceGNhJyAgICAgIyAgMHgwMGQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNiJyAgICAgIyAgMHgwMGQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweDAwZDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdcdTIwYWMnICAgIyAgMHgwMGQ1IC0+IEVVUk8gU0lHTgorICAgIHUnXHhjZCcgICAgICMgIDB4MDBkNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweDAwZDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweDAwZDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHhhNicgICAgICMgIDB4MDBkZCAtPiBCUk9LRU4gQkFSCisgICAgdSdceGNjJyAgICAgIyAgMHgwMGRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdceGQzJyAgICAgIyAgMHgwMGUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhkNCcgICAgICMgIDB4MDBlMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkMicgICAgICMgIDB4MDBlMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjUnICAgICAjICAweDAwZTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhkNScgICAgICMgIDB4MDBlNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhmZScgICAgICMgIDB4MDBlNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZGUnICAgICAjICAweDAwZTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZGEnICAgICAjICAweDAwZTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHgwMGVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ5JyAgICAgIyAgMHgwMGViIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmZCcgICAgICMgIDB4MDBlYyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGRkJyAgICAgIyAgMHgwMGVkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhhZicgICAgICMgIDB4MDBlZSAtPiBNQUNST04KKyAgICB1J1x4YjQnICAgICAjICAweDAwZWYgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGFkJyAgICAgIyAgMHgwMGYwIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMDE3JyAgICMgIDB4MDBmMiAtPiBET1VCTEUgTE9XIExJTkUKKyAgICB1J1x4YmUnICAgICAjICAweDAwZjMgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGI2JyAgICAgIyAgMHgwMGY0IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4MDBmNSAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhiOCcgICAgICMgIDB4MDBmNyAtPiBDRURJTExBCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHgwMGY5IC0+IERJQUVSRVNJUworICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdceGI5JyAgICAgIyAgMHgwMGZiIC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiMycgICAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTE6IDB4MDBhZCwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYTI6IDB4MDBiZCwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNDogMHgwMGNmLCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhNTogMHgwMGJlLCAgICAgIyAgWUVOIFNJR04KKyAgICAweDAwYTY6IDB4MDBkZCwgICAgICMgIEJST0tFTiBCQVIKKyAgICAweDAwYTc6IDB4MDBmNSwgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBhODogMHgwMGY5LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGE5OiAweDAwYjgsICAgICAjICBDT1BZUklHSFQgU0lHTgorICAgIDB4MDBhYTogMHgwMGE2LCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYWI6IDB4MDBhZSwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFjOiAweDAwYWEsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhZDogMHgwMGYwLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwYWU6IDB4MDBhOSwgICAgICMgIFJFR0lTVEVSRUQgU0lHTgorICAgIDB4MDBhZjogMHgwMGVlLCAgICAgIyAgTUFDUk9OCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjM6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGI0OiAweDAwZWYsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjY6IDB4MDBmNCwgICAgICMgIFBJTENST1cgU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiODogMHgwMGY3LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBiOTogMHgwMGZiLCAgICAgIyAgU1VQRVJTQ1JJUFQgT05FCisgICAgMHgwMGJhOiAweDAwYTcsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYmI6IDB4MDBhZiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiYzogMHgwMGFjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGJkOiAweDAwYWIsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYmU6IDB4MDBmMywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIDB4MDBiZjogMHgwMGE4LCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBjMDogMHgwMGI3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGMxOiAweDAwYjUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYzI6IDB4MDBiNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGMzOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwYzQ6IDB4MDA4ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYzU6IDB4MDA4ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGM2OiAweDAwOTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgMHgwMGM3OiAweDAwODAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBjODogMHgwMGQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwY2E6IDB4MDBkMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGNiOiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGNjOiAweDAwZGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwY2Q6IDB4MDBkNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBjZTogMHgwMGQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwY2Y6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZDA6IDB4MDBkMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEVUSAorICAgIDB4MDBkMTogMHgwMGE1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGQyOiAweDAwZTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwZDM6IDB4MDBlMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBkNDogMHgwMGUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDU6IDB4MDBlNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIDB4MDBkNjogMHgwMDk5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNzogMHgwMDllLCAgICAgIyAgTVVMVElQTElDQVRJT04gU0lHTgorICAgIDB4MDBkODogMHgwMDlkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBkOTogMHgwMGViLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGRhOiAweDAwZTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwZGI6IDB4MDBlYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRkOiAweDAwZWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZGU6IDB4MDBlOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMDogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGUzOiAweDAwYzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGU0OiAweDAwODQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlNTogMHgwMDg2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGU2OiAweDAwOTEsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDBlNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU4OiAweDAwOGEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwODgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWI6IDB4MDA4OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGVjOiAweDAwOGQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGVkOiAweDAwYTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGVlOiAweDAwOGMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWY6IDB4MDA4YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGYwOiAweDAwZDAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgMHgwMGYxOiAweDAwYTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGYyOiAweDAwOTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGYzOiAweDAwYTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY0OiAweDAwOTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZjU6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZjY6IDB4MDA5NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY4OiAweDAwOWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBmOTogMHgwMDk3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYjogMHgwMDk2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGZjOiAweDAwODEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmZDogMHgwMGVjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBmZTogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGZmOiAweDAwOTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIDB4MjBhYzogMHgwMGQ1LCAgICAgIyAgRVVSTyBTSUdOCisgICAgMHgwMTkyOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDIwMTc6IDB4MDBmMiwgICAgICMgIERPVUJMRSBMT1cgTElORQorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU4LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ5YTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU4LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODU4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQ5YTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NTgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYwLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFjYjBjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYwLnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg2MC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODYwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODE6IDB4MDBmYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDgyOiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDgzOiAweDAwZTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODQ6IDB4MDBlMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwODU6IDB4MDBlMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwODY6IDB4MDBjMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODk6IDB4MDBjYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhhOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDhiOiAweDAwY2QsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwOGM6IDB4MDBkNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDhkOiAweDAwZWMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMDhlOiAweDAwYzMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAweDAwOGY6IDB4MDBjMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDkwOiAweDAwYzksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwOTE6IDB4MDBjMCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDA5MjogMHgwMGM4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDkzOiAweDAwZjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTQ6IDB4MDBmNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwOTU6IDB4MDBmMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAweDAwOTY6IDB4MDBkYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDA5NzogMHgwMGY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDA5ODogMHgwMGNjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMDk5OiAweDAwZDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwOWE6IDB4MDBkYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDBhMiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwMGQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDllOiAweDIwYTcsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MDA5ZjogMHgwMGQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEwOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGExOiAweDAwZWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGEyOiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEzOiAweDAwZmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGE0OiAweDAwZjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE1OiAweDAwZDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwYTY6IDB4MDBhYSwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE3OiAweDAwYmEsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYTg6IDB4MDBiZiwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYTk6IDB4MDBkMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAwYTEsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGJiLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgyNTYxLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjY6IDB4MjU2MiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI3OiAweDI1NTYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI4OiAweDI1NTUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI5OiAweDI1NjMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGJhOiAweDI1NTEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgwMGJiOiAweDI1NTcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDAwYmM6IDB4MjU1ZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDAwYmQ6IDB4MjU1YywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGJlOiAweDI1NWIsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MjU1ZSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBjNzogMHgyNTVmLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDI1NjcsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMDogMHgyNTY4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDE6IDB4MjU2NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDI6IDB4MjU2NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDM6IDB4MjU1OSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNDogMHgyNTU4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ1OiAweDI1NTIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNjogMHgyNTUzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDc6IDB4MjU2YiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQ4OiAweDI1NmEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MjU4YywgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MDBkZTogMHgyNTkwLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwM2IxLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwMGUxOiAweDAwZGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMjogMHgwMzkzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAwZTM6IDB4MDNjMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDBlNDogMHgwM2EzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTU6IDB4MDNjMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlNjogMHgwMGI1LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBlNzogMHgwM2M0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDBlODogMHgwM2E2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwMGU5OiAweDAzOTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDBlYTogMHgwM2E5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAwZWI6IDB4MDNiNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDBlYzogMHgyMjFlLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDAwZWQ6IDB4MDNjNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDAwZWU6IDB4MDNiNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwMGVmOiAweDIyMjksICAgICAjICBJTlRFUlNFQ1RJT04KKyAgICAweDAwZjA6IDB4MjI2MSwgICAgICMgIElERU5USUNBTCBUTworICAgIDB4MDBmMTogMHgwMGIxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGYyOiAweDIyNjUsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjM6IDB4MjI2NCwgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmNDogMHgyMzIwLCAgICAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKyAgICAweDAwZjU6IDB4MjMyMSwgICAgICMgIEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY2OiAweDAwZjcsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY3OiAweDIyNDgsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDAwZjg6IDB4MDBiMCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGY5OiAweDIyMTksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDAwZmE6IDB4MDBiNywgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwZmI6IDB4MjIxYSwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgwMGZjOiAweDIwN2YsICAgICAjICBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDBmZDogMHgwMGIyLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHhjNycgICAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhmYycgICAgICMgIDB4MDA4MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOScgICAgICMgIDB4MDA4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHgwMDgzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlMycgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGUwJyAgICAgIyAgMHgwMDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzEnICAgICAjICAweDAwODYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGU3JyAgICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlYScgICAgICMgIDB4MDA4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2EnICAgICAjICAweDAwODkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTgnICAgICAjICAweDAwOGEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4MDA4YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweDAwOGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWMnICAgICAjICAweDAwOGQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjMycgICAgICMgIDB4MDA4ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4YzInICAgICAjICAweDAwOGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzknICAgICAjICAweDAwOTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGMwJyAgICAgIyAgMHgwMDkxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjOCcgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZjQnICAgICAjICAweDAwOTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY1JyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjInICAgICAjICAweDAwOTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4MDA5NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZjknICAgICAjICAweDAwOTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhjYycgICAgICMgIDB4MDA5OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZDUnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGRjJyAgICAgIyAgMHgwMDlhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YTInICAgICAjICAweDAwOWIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHgwMDljIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4ZDknICAgICAjICAweDAwOWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdTIwYTcnICAgIyAgMHgwMDllIC0+IFBFU0VUQSBTSUdOCisgICAgdSdceGQzJyAgICAgIyAgMHgwMDlmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhlMScgICAgICMgIDB4MDBhMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGVkJyAgICAgIyAgMHgwMGExIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZjMnICAgICAjICAweDAwYTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmYScgICAgICMgIDB4MDBhMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGYxJyAgICAgIyAgMHgwMGE0IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDEnICAgICAjICAweDAwYTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGFhJyAgICAgIyAgMHgwMGE2IC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHgwMGE3IC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiZicgICAgICMgIDB4MDBhOCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGQyJyAgICAgIyAgMHgwMGE5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4MDBhYiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmMnICAgICAjICAweDAwYWMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGExJyAgICAgIyAgMHgwMGFkIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU2MScgICAjICAweDAwYjUgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MicgICAjICAweDAwYjYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NicgICAjICAweDAwYjcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU1JyAgICMgIDB4MDBiOCAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTVjJyAgICMgIDB4MDBiZCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTViJyAgICMgIDB4MDBiZSAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTVlJyAgICMgIDB4MDBjNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1ZicgICAjICAweDAwYzcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweDAwY2YgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2OCcgICAjICAweDAwZDAgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2NCcgICAjICAweDAwZDEgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY1JyAgICMgIDB4MDBkMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NTknICAgIyAgMHgwMGQzIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTU4JyAgICMgIDB4MDBkNCAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MicgICAjICAweDAwZDUgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MycgICAjICAweDAwZDYgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU2YicgICAjICAweDAwZDcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2YScgICAjICAweDAwZDggLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4YycgICAjICAweDAwZGQgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHgwMGRlIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUwM2IxJyAgICMgIDB4MDBlMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICB1J1x4ZGYnICAgICAjICAweDAwZTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x1MDM5MycgICAjICAweDAwZTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNjMCcgICAjICAweDAwZTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYTMnICAgIyAgMHgwMGU0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYzMnICAgIyAgMHgwMGU1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHhiNScgICAgICMgIDB4MDBlNiAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTAzYzQnICAgIyAgMHgwMGU3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNhNicgICAjICAweDAwZTggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgdSdcdTAzOTgnICAgIyAgMHgwMGU5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzYTknICAgIyAgMHgwMGVhIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYjQnICAgIyAgMHgwMGViIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIHUnXHUyMjFlJyAgICMgIDB4MDBlYyAtPiBJTkZJTklUWQorICAgIHUnXHUwM2M2JyAgICMgIDB4MDBlZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYjUnICAgIyAgMHgwMGVlIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTIyMjknICAgIyAgMHgwMGVmIC0+IElOVEVSU0VDVElPTgorICAgIHUnXHUyMjYxJyAgICMgIDB4MDBmMCAtPiBJREVOVElDQUwgVE8KKyAgICB1J1x4YjEnICAgICAjICAweDAwZjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjUnICAgIyAgMHgwMGYyIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY0JyAgICMgIDB4MDBmMyAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjMyMCcgICAjICAweDAwZjQgLT4gVE9QIEhBTEYgSU5URUdSQUwKKyAgICB1J1x1MjMyMScgICAjICAweDAwZjUgLT4gQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyMjQ4JyAgICMgIDB4MDBmNyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x4YjAnICAgICAjICAweDAwZjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MjIxOScgICAjICAweDAwZjkgLT4gQlVMTEVUIE9QRVJBVE9SCisgICAgdSdceGI3JyAgICAgIyAgMHgwMGZhIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjIxYScgICAjICAweDAwZmIgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjA3ZicgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGExOiAweDAwYWQsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGEyOiAweDAwOWIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYWE6IDB4MDBhNiwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYjA6IDB4MDBmOCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGIxOiAweDAwZjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwYjI6IDB4MDBmZCwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBiNTogMHgwMGU2LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiYTogMHgwMGE3LCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYmM6IDB4MDBhYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBiZDogMHgwMGFiLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGJmOiAweDAwYTgsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGMwOiAweDAwOTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwYzE6IDB4MDA4NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBjMjogMHgwMDhmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwYzM6IDB4MDA4ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzg6IDB4MDA5MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBjOTogMHgwMDkwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGNhOiAweDAwODksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjYzogMHgwMDk4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGNkOiAweDAwOGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwZDE6IDB4MDBhNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBkMjogMHgwMGE5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGQzOiAweDAwOWYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwZDQ6IDB4MDA4YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGQ1OiAweDAwOTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAweDAwZDk6IDB4MDA5ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBkYTogMHgwMDk2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMDogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGUzOiAweDAwODQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgMHgwMGU3OiAweDAwODcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwZTg6IDB4MDA4YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwZTk6IDB4MDA4MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZWE6IDB4MDA4OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBlYzogMHgwMDhkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBmMTogMHgwMGE0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBmMjogMHgwMDk1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY1OiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY5OiAweDAwOTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGZhOiAweDAwYTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGZjOiAweDAwODEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDM5MzogMHgwMGUyLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAzOTg6IDB4MDBlOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwM2EzOiAweDAwZTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDNhNjogMHgwMGU4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwM2E5OiAweDAwZWEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDNiMTogMHgwMGUwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwM2I0OiAweDAwZWIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAzYjU6IDB4MDBlZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwM2MwOiAweDAwZTMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAzYzM6IDB4MDBlNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDNjNDogMHgwMGU3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDNjNjogMHgwMGVkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MjA3ZjogMHgwMGZjLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDIwYTc6IDB4MDA5ZSwgICAgICMgIFBFU0VUQSBTSUdOCisgICAgMHgyMjE5OiAweDAwZjksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDIyMWE6IDB4MDBmYiwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgyMjFlOiAweDAwZWMsICAgICAjICBJTkZJTklUWQorICAgIDB4MjIyOTogMHgwMGVmLCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgyMjQ4OiAweDAwZjcsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDIyNjE6IDB4MDBmMCwgICAgICMgIElERU5USUNBTCBUTworICAgIDB4MjI2NDogMHgwMGYzLCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMjY1OiAweDAwZjIsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIzMjA6IDB4MDBmNCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgyMzIxOiAweDAwZjUsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTUyOiAweDAwZDUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1MzogMHgwMGQ2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTU6IDB4MDBiOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NTY6IDB4MDBiNywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1ODogMHgwMGQ0LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTU5OiAweDAwZDMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTViOiAweDAwYmUsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1YzogMHgwMGJkLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NWU6IDB4MDBjNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1ZjogMHgwMGM3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MTogMHgwMGI1LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NjI6IDB4MDBiNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY0OiAweDAwZDEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY1OiAweDAwZDIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njc6IDB4MDBjZiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY4OiAweDAwZDAsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YTogMHgwMGQ4LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NmI6IDB4MDBkNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNThjOiAweDAwZGQsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTA6IDB4MDBkZSwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlY2Y1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlY2Y1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjEucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTM5YjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjEucHkKQEAgLTAsMCArMSw2OTggQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODYxLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NjEnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4MTogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODI6IDB4MDBlOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwODM6IDB4MDBlMiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4NDogMHgwMGU0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwODU6IDB4MDBlMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwODY6IDB4MDBlNSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA4NzogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDg4OiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODk6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhhOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDhiOiAweDAwZDAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICAweDAwOGM6IDB4MDBmMCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFVEgKKyAgICAweDAwOGQ6IDB4MDBkZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgMHgwMDhlOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhmOiAweDAwYzUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwZTYsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MjogMHgwMGM2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDA5MzogMHgwMGY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDk0OiAweDAwZjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5NTogMHgwMGZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgMHgwMDk2OiAweDAwZmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTc6IDB4MDBkZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDA5ODogMHgwMGZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDA5OTogMHgwMGQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YTogMHgwMGRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA5YjogMHgwMGY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBkOCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAweDAwOWU6IDB4MjBhNywgICAgICMgIFBFU0VUQSBTSUdOCisgICAgMHgwMDlmOiAweDAxOTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAwYTA6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAweDAwYTE6IDB4MDBlZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAweDAwYTI6IDB4MDBmMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwYTM6IDB4MDBmYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwYTQ6IDB4MDBjMSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhNTogMHgwMGNkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGE2OiAweDAwZDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwYTc6IDB4MDBkYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhODogMHgwMGJmLCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBhOTogMHgyMzEwLCAgICAgIyAgUkVWRVJTRUQgTk9UIFNJR04KKyAgICAweDAwYWE6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYmQsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICAweDAwYWM6IDB4MDBiYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBhZDogMHgwMGExLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MjU2MSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI2OiAweDI1NjIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiNzogMHgyNTU2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiODogMHgyNTU1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDI1NWMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiZTogMHgyNTViLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDI1NWUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwYzc6IDB4MjU1ZiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgyNTY3LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDA6IDB4MjU2OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQxOiAweDI1NjQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQyOiAweDI1NjUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQzOiAweDI1NTksICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDQ6IDB4MjU1OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNTogMHgyNTUyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDY6IDB4MjU1MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ3OiAweDI1NmIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkODogMHgyNTZhLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDI1OGMsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGU6IDB4MjU5MCwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDNiMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDBlMTogMHgwMGRmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTI6IDB4MDM5MywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMGUzOiAweDAzYzAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAwZTQ6IDB4MDNhMywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU1OiAweDAzYzMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IDB4MDNjNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAwZTg6IDB4MDNhNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDBlOTogMHgwMzk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAwZWE6IDB4MDNhOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwMGViOiAweDAzYjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAwZWM6IDB4MjIxZSwgICAgICMgIElORklOSVRZCisgICAgMHgwMGVkOiAweDAzYzYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwMGVlOiAweDAzYjUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDBlZjogMHgyMjI5LCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgwMGYwOiAweDIyNjEsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMjY1LCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGYzOiAweDIyNjQsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjQ6IDB4MjMyMCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY1OiAweDIzMjEsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgyMjQ4LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDBmYzogMHgyMDdmLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwZmQ6IDB4MDBiMiwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YzcnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDAwODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTAnICAgICAjICAweDAwODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlNScgICAgICMgIDB4MDA4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDAwODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGVhJyAgICAgIyAgMHgwMDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4MDA4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4MDA4YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGQwJyAgICAgIyAgMHgwMDhiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEVUSAorICAgIHUnXHhmMCcgICAgICMgIDB4MDA4YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgdSdceGRlJyAgICAgIyAgMHgwMDhkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgdSdceGM0JyAgICAgIyAgMHgwMDhlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDAwOGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzknICAgICAjICAweDAwOTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU2JyAgICAgIyAgMHgwMDkxIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGM2JyAgICAgIyAgMHgwMDkyIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x4ZjQnICAgICAjICAweDAwOTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGZlJyAgICAgIyAgMHgwMDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBUSE9STgorICAgIHUnXHhmYicgICAgICMgIDB4MDA5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGQnICAgICAjICAweDAwOTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGZkJyAgICAgIyAgMHgwMDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZDYnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY4JyAgICAgIyAgMHgwMDliIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGEzJyAgICAgIyAgMHgwMDljIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4ZDgnICAgICAjICAweDAwOWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUyMGE3JyAgICMgIDB4MDA5ZSAtPiBQRVNFVEEgU0lHTgorICAgIHUnXHUwMTkyJyAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x4ZTEnICAgICAjICAweDAwYTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlZCcgICAgICMgIDB4MDBhMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGYzJyAgICAgIyAgMHgwMGEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZmEnICAgICAjICAweDAwYTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhjMScgICAgICMgIDB4MDBhNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4Y2QnICAgICAjICAweDAwYTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGQzJyAgICAgIyAgMHgwMGE2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkYScgICAgICMgIDB4MDBhNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4YmYnICAgICAjICAweDAwYTggLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHUyMzEwJyAgICMgIDB4MDBhOSAtPiBSRVZFUlNFRCBOT1QgU0lHTgorICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4MDBhYiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmMnICAgICAjICAweDAwYWMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGExJyAgICAgIyAgMHgwMGFkIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU2MScgICAjICAweDAwYjUgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MicgICAjICAweDAwYjYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NicgICAjICAweDAwYjcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU1JyAgICMgIDB4MDBiOCAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTVjJyAgICMgIDB4MDBiZCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTViJyAgICMgIDB4MDBiZSAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTVlJyAgICMgIDB4MDBjNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1ZicgICAjICAweDAwYzcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweDAwY2YgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2OCcgICAjICAweDAwZDAgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2NCcgICAjICAweDAwZDEgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY1JyAgICMgIDB4MDBkMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NTknICAgIyAgMHgwMGQzIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTU4JyAgICMgIDB4MDBkNCAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MicgICAjICAweDAwZDUgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MycgICAjICAweDAwZDYgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU2YicgICAjICAweDAwZDcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2YScgICAjICAweDAwZDggLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4YycgICAjICAweDAwZGQgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHgwMGRlIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUwM2IxJyAgICMgIDB4MDBlMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICB1J1x4ZGYnICAgICAjICAweDAwZTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x1MDM5MycgICAjICAweDAwZTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNjMCcgICAjICAweDAwZTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYTMnICAgIyAgMHgwMGU0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYzMnICAgIyAgMHgwMGU1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHhiNScgICAgICMgIDB4MDBlNiAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTAzYzQnICAgIyAgMHgwMGU3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNhNicgICAjICAweDAwZTggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgdSdcdTAzOTgnICAgIyAgMHgwMGU5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzYTknICAgIyAgMHgwMGVhIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYjQnICAgIyAgMHgwMGViIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIHUnXHUyMjFlJyAgICMgIDB4MDBlYyAtPiBJTkZJTklUWQorICAgIHUnXHUwM2M2JyAgICMgIDB4MDBlZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYjUnICAgIyAgMHgwMGVlIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTIyMjknICAgIyAgMHgwMGVmIC0+IElOVEVSU0VDVElPTgorICAgIHUnXHUyMjYxJyAgICMgIDB4MDBmMCAtPiBJREVOVElDQUwgVE8KKyAgICB1J1x4YjEnICAgICAjICAweDAwZjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjUnICAgIyAgMHgwMGYyIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY0JyAgICMgIDB4MDBmMyAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjMyMCcgICAjICAweDAwZjQgLT4gVE9QIEhBTEYgSU5URUdSQUwKKyAgICB1J1x1MjMyMScgICAjICAweDAwZjUgLT4gQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyMjQ4JyAgICMgIDB4MDBmNyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x4YjAnICAgICAjICAweDAwZjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MjIxOScgICAjICAweDAwZjkgLT4gQlVMTEVUIE9QRVJBVE9SCisgICAgdSdceGI3JyAgICAgIyAgMHgwMGZhIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjIxYScgICAjICAweDAwZmIgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjA3ZicgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGExOiAweDAwYWQsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGEzOiAweDAwOWMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMGFhLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYjA6IDB4MDBmOCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGIxOiAweDAwZjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwYjI6IDB4MDBmZCwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBiNTogMHgwMGU2LCAgICAgIyAgTUlDUk8gU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiYjogMHgwMGFmLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGJjOiAweDAwYWMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYmQ6IDB4MDBhYiwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBiZjogMHgwMGE4LCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBjMTogMHgwMGE0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM1OiAweDAwOGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBjNjogMHgwMDkyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzk6IDB4MDA5MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBjZDogMHgwMGE1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGQwOiAweDAwOGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICAweDAwZDM6IDB4MDBhNiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBkNjogMHgwMDk5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkODogMHgwMDlkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBkYTogMHgwMGE3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRkOiAweDAwOTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAweDAwZGU6IDB4MDA4ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMDogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGU0OiAweDAwODQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlNTogMHgwMDg2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGU2OiAweDAwOTEsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDBlNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU4OiAweDAwOGEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwODgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWI6IDB4MDA4OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGVkOiAweDAwYTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGYwOiAweDAwOGMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRVRICisgICAgMHgwMGYzOiAweDAwYTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY0OiAweDAwOTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZjY6IDB4MDA5NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY4OiAweDAwOWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYjogMHgwMDk2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGZjOiAweDAwODEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmZDogMHgwMDk4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIDB4MDBmZTogMHgwMDk1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOCisgICAgMHgwMTkyOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAzOTM6IDB4MDBlMiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMzk4OiAweDAwZTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDNhMzogMHgwMGU0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYTY6IDB4MDBlOCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDNhOTogMHgwMGVhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAzYjE6IDB4MDBlMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDNiNDogMHgwMGViLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwM2I1OiAweDAwZWUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDNjMDogMHgwMGUzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwM2MzOiAweDAwZTUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYzQ6IDB4MDBlNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAzYzY6IDB4MDBlZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDIwN2Y6IDB4MDBmYywgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgyMGE3OiAweDAwOWUsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MjIxOTogMHgwMGY5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgyMjFhOiAweDAwZmIsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MjIxZTogMHgwMGVjLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDIyMjk6IDB4MDBlZiwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MjI0ODogMHgwMGY3LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgyMjYxOiAweDAwZjAsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDIyNjQ6IDB4MDBmMywgICAgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjI2NTogMHgwMGYyLCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMzEwOiAweDAwYTksICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MjMyMDogMHgwMGY0LCAgICAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKyAgICAweDIzMjE6IDB4MDBmNSwgICAgICMgIEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgMHgyNTAwOiAweDAwYzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MjUwMjogMHgwMGIzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwZGEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1MTA6IDB4MDBiZiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgyNTE0OiAweDAwYzAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwZDksICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDI1MWM6IDB4MDBjMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1MjQ6IDB4MDBiNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMGMyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1MzQ6IDB4MDBjMSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzYzogMHgwMGM1LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTUwOiAweDAwY2QsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDI1NTE6IDB4MDBiYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDI1NTI6IDB4MDBkNSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTUzOiAweDAwZDYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NTogMHgwMGI4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1NjogMHgwMGI3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTU4OiAweDAwZDQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTk6IDB4MDBkMywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU1YTogMHgwMGM4LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDI1NWI6IDB4MDBiZSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTVjOiAweDAwYmQsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU1ZTogMHgwMGM2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTVmOiAweDAwYzcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NjA6IDB4MDBjYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTYxOiAweDAwYjUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU2MjogMHgwMGI2LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjQ6IDB4MDBkMSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NjU6IDB4MDBkMiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2NzogMHgwMGNmLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1Njg6IDB4MDBkMCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY5OiAweDAwY2EsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTZhOiAweDAwZDgsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2YjogMHgwMGQ3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1NmM6IDB4MDBjZSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1ODA6IDB4MDBkZiwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODQ6IDB4MDBkYywgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDI1ODg6IDB4MDBkYiwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDI1OGM6IDB4MDBkZCwgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MjU5MDogMHgwMGRlLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxZTY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYxLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2MS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxZTY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYxLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Mi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMDQwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Mi5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A4NjIuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg2MicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDVkMCwgICAgICMgIEhFQlJFVyBMRVRURVIgQUxFRgorICAgIDB4MDA4MTogMHgwNWQxLCAgICAgIyAgSEVCUkVXIExFVFRFUiBCRVQKKyAgICAweDAwODI6IDB4MDVkMiwgICAgICMgIEhFQlJFVyBMRVRURVIgR0lNRUwKKyAgICAweDAwODM6IDB4MDVkMywgICAgICMgIEhFQlJFVyBMRVRURVIgREFMRVQKKyAgICAweDAwODQ6IDB4MDVkNCwgICAgICMgIEhFQlJFVyBMRVRURVIgSEUKKyAgICAweDAwODU6IDB4MDVkNSwgICAgICMgIEhFQlJFVyBMRVRURVIgVkFWCisgICAgMHgwMDg2OiAweDA1ZDYsICAgICAjICBIRUJSRVcgTEVUVEVSIFpBWUlOCisgICAgMHgwMDg3OiAweDA1ZDcsICAgICAjICBIRUJSRVcgTEVUVEVSIEhFVAorICAgIDB4MDA4ODogMHgwNWQ4LCAgICAgIyAgSEVCUkVXIExFVFRFUiBURVQKKyAgICAweDAwODk6IDB4MDVkOSwgICAgICMgIEhFQlJFVyBMRVRURVIgWU9ECisgICAgMHgwMDhhOiAweDA1ZGEsICAgICAjICBIRUJSRVcgTEVUVEVSIEZJTkFMIEtBRgorICAgIDB4MDA4YjogMHgwNWRiLCAgICAgIyAgSEVCUkVXIExFVFRFUiBLQUYKKyAgICAweDAwOGM6IDB4MDVkYywgICAgICMgIEhFQlJFVyBMRVRURVIgTEFNRUQKKyAgICAweDAwOGQ6IDB4MDVkZCwgICAgICMgIEhFQlJFVyBMRVRURVIgRklOQUwgTUVNCisgICAgMHgwMDhlOiAweDA1ZGUsICAgICAjICBIRUJSRVcgTEVUVEVSIE1FTQorICAgIDB4MDA4ZjogMHgwNWRmLCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBOVU4KKyAgICAweDAwOTA6IDB4MDVlMCwgICAgICMgIEhFQlJFVyBMRVRURVIgTlVOCisgICAgMHgwMDkxOiAweDA1ZTEsICAgICAjICBIRUJSRVcgTEVUVEVSIFNBTUVLSAorICAgIDB4MDA5MjogMHgwNWUyLCAgICAgIyAgSEVCUkVXIExFVFRFUiBBWUlOCisgICAgMHgwMDkzOiAweDA1ZTMsICAgICAjICBIRUJSRVcgTEVUVEVSIEZJTkFMIFBFCisgICAgMHgwMDk0OiAweDA1ZTQsICAgICAjICBIRUJSRVcgTEVUVEVSIFBFCisgICAgMHgwMDk1OiAweDA1ZTUsICAgICAjICBIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJCisgICAgMHgwMDk2OiAweDA1ZTYsICAgICAjICBIRUJSRVcgTEVUVEVSIFRTQURJCisgICAgMHgwMDk3OiAweDA1ZTcsICAgICAjICBIRUJSRVcgTEVUVEVSIFFPRgorICAgIDB4MDA5ODogMHgwNWU4LCAgICAgIyAgSEVCUkVXIExFVFRFUiBSRVNICisgICAgMHgwMDk5OiAweDA1ZTksICAgICAjICBIRUJSRVcgTEVUVEVSIFNISU4KKyAgICAweDAwOWE6IDB4MDVlYSwgICAgICMgIEhFQlJFVyBMRVRURVIgVEFWCisgICAgMHgwMDliOiAweDAwYTIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwOWM6IDB4MDBhMywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwOWQ6IDB4MDBhNSwgICAgICMgIFlFTiBTSUdOCisgICAgMHgwMDllOiAweDIwYTcsICAgICAjICBQRVNFVEEgU0lHTgorICAgIDB4MDA5ZjogMHgwMTkyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMGEwOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMGExOiAweDAwZWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGEyOiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGEzOiAweDAwZmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGE0OiAweDAwZjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE1OiAweDAwZDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAweDAwYTY6IDB4MDBhYSwgICAgICMgIEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE3OiAweDAwYmEsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYTg6IDB4MDBiZiwgICAgICMgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYTk6IDB4MjMxMCwgICAgICMgIFJFVkVSU0VEIE5PVCBTSUdOCisgICAgMHgwMGFhOiAweDAwYWMsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhYjogMHgwMGJkLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGFjOiAweDAwYmMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYWQ6IDB4MDBhMSwgICAgICMgIElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwYWU6IDB4MDBhYiwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFmOiAweDAwYmIsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDI1NjEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiNjogMHgyNTYyLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjc6IDB4MjU1NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYjg6IDB4MjU1NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjk6IDB4MjU2MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYmE6IDB4MjU1MSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICAweDAwYmI6IDB4MjU1NywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBiYzogMHgyNTVkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MDBiZDogMHgyNTVjLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDAwYmU6IDB4MjU1YiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGJmOiAweDI1MTAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MDBjMDogMHgyNTE0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MDBjMTogMHgyNTM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMyOiAweDI1MmMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMzogMHgyNTFjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjNDogMHgyNTAwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDAwYzU6IDB4MjUzYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjNjogMHgyNTVlLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGM3OiAweDI1NWYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MjU2NywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQwOiAweDI1NjgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMTogMHgyNTY0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMjogMHgyNTY1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkMzogMHgyNTU5LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ0OiAweDI1NTgsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDU6IDB4MjU1MiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ2OiAweDI1NTMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNzogMHgyNTZiLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDg6IDB4MjU2YSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQ5OiAweDI1MTgsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICAweDAwZGE6IDB4MjUwYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDBkYjogMHgyNTg4LCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MDBkYzogMHgyNTg0LCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MDBkZDogMHgyNThjLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgwMGRlOiAweDI1OTAsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAzYjEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAwZTE6IDB4MDBkZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHRVJNQU4pCisgICAgMHgwMGUyOiAweDAzOTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDBlMzogMHgwM2MwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwMGU0OiAweDAzYTMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlNTogMHgwM2MzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU2OiAweDAwYjUsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGU3OiAweDAzYzQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwMGU4OiAweDAzYTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAwZTk6IDB4MDM5OCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwMGVhOiAweDAzYTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDBlYjogMHgwM2I0LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwMGVjOiAweDIyMWUsICAgICAjICBJTkZJTklUWQorICAgIDB4MDBlZDogMHgwM2M2LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MDBlZTogMHgwM2I1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAwZWY6IDB4MjIyOSwgICAgICMgIElOVEVSU0VDVElPTgorICAgIDB4MDBmMDogMHgyMjYxLCAgICAgIyAgSURFTlRJQ0FMIFRPCisgICAgMHgwMGYxOiAweDAwYjEsICAgICAjICBQTFVTLU1JTlVTIFNJR04KKyAgICAweDAwZjI6IDB4MjI2NSwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MDBmMzogMHgyMjY0LCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGY0OiAweDIzMjAsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNTogMHgyMzIxLCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDAwZjY6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZjc6IDB4MjI0OCwgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MDBmODogMHgwMGIwLCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwZjk6IDB4MjIxOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MDBmYTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBmYjogMHgyMjFhLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDAwZmM6IDB4MjA3ZiwgICAgICMgIFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMGZkOiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwZmU6IDB4MjVhMCwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4MDBmZjogMHgwMGEwLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDAwMmQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgwMDJlIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MDAyZiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgwMDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDAwMzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgwMDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MDAzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MDAzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgwMDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDAwMzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgwMDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgwMDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgwMDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDAwM2EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDAwM2IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgwMDNjIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgwMDNkIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgwMDNlIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgwMDNmIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDAwNDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4MDA0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHgwMDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDAwNDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4MDA0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHgwMDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDAwNDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4MDA0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHgwMDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDAwNDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4MDA0YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHgwMDRiIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDAwNGMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4MDA0ZCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHgwMDRlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDAwNGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4MDA1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHgwMDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDAwNTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4MDA1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHgwMDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDAwNTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4MDA1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHgwMDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDAwNTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4MDA1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHgwMDVhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDAwNWIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4MDA1YyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDAwNWQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDAwNWUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDAwNWYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDAwNjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHgwMDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHgwMDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHgwMDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHgwMDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHgwMDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHgwMDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHgwMDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHgwMDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHgwMDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHgwMDZhIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHgwMDZiIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHgwMDZjIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHgwMDZkIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHgwMDZlIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHgwMDZmIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHgwMDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHgwMDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHgwMDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHgwMDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHgwMDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHgwMDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHgwMDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHgwMDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHgwMDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHgwMDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHgwMDdhIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHgwMDdiIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4MDA3YyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHgwMDdkIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDAwN2UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDAwN2YgLT4gREVMRVRFCisgICAgdSdcdTA1ZDAnICAgIyAgMHgwMDgwIC0+IEhFQlJFVyBMRVRURVIgQUxFRgorICAgIHUnXHUwNWQxJyAgICMgIDB4MDA4MSAtPiBIRUJSRVcgTEVUVEVSIEJFVAorICAgIHUnXHUwNWQyJyAgICMgIDB4MDA4MiAtPiBIRUJSRVcgTEVUVEVSIEdJTUVMCisgICAgdSdcdTA1ZDMnICAgIyAgMHgwMDgzIC0+IEhFQlJFVyBMRVRURVIgREFMRVQKKyAgICB1J1x1MDVkNCcgICAjICAweDAwODQgLT4gSEVCUkVXIExFVFRFUiBIRQorICAgIHUnXHUwNWQ1JyAgICMgIDB4MDA4NSAtPiBIRUJSRVcgTEVUVEVSIFZBVgorICAgIHUnXHUwNWQ2JyAgICMgIDB4MDA4NiAtPiBIRUJSRVcgTEVUVEVSIFpBWUlOCisgICAgdSdcdTA1ZDcnICAgIyAgMHgwMDg3IC0+IEhFQlJFVyBMRVRURVIgSEVUCisgICAgdSdcdTA1ZDgnICAgIyAgMHgwMDg4IC0+IEhFQlJFVyBMRVRURVIgVEVUCisgICAgdSdcdTA1ZDknICAgIyAgMHgwMDg5IC0+IEhFQlJFVyBMRVRURVIgWU9ECisgICAgdSdcdTA1ZGEnICAgIyAgMHgwMDhhIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgS0FGCisgICAgdSdcdTA1ZGInICAgIyAgMHgwMDhiIC0+IEhFQlJFVyBMRVRURVIgS0FGCisgICAgdSdcdTA1ZGMnICAgIyAgMHgwMDhjIC0+IEhFQlJFVyBMRVRURVIgTEFNRUQKKyAgICB1J1x1MDVkZCcgICAjICAweDAwOGQgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBNRU0KKyAgICB1J1x1MDVkZScgICAjICAweDAwOGUgLT4gSEVCUkVXIExFVFRFUiBNRU0KKyAgICB1J1x1MDVkZicgICAjICAweDAwOGYgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBOVU4KKyAgICB1J1x1MDVlMCcgICAjICAweDAwOTAgLT4gSEVCUkVXIExFVFRFUiBOVU4KKyAgICB1J1x1MDVlMScgICAjICAweDAwOTEgLT4gSEVCUkVXIExFVFRFUiBTQU1FS0gKKyAgICB1J1x1MDVlMicgICAjICAweDAwOTIgLT4gSEVCUkVXIExFVFRFUiBBWUlOCisgICAgdSdcdTA1ZTMnICAgIyAgMHgwMDkzIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgUEUKKyAgICB1J1x1MDVlNCcgICAjICAweDAwOTQgLT4gSEVCUkVXIExFVFRFUiBQRQorICAgIHUnXHUwNWU1JyAgICMgIDB4MDA5NSAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIFRTQURJCisgICAgdSdcdTA1ZTYnICAgIyAgMHgwMDk2IC0+IEhFQlJFVyBMRVRURVIgVFNBREkKKyAgICB1J1x1MDVlNycgICAjICAweDAwOTcgLT4gSEVCUkVXIExFVFRFUiBRT0YKKyAgICB1J1x1MDVlOCcgICAjICAweDAwOTggLT4gSEVCUkVXIExFVFRFUiBSRVNICisgICAgdSdcdTA1ZTknICAgIyAgMHgwMDk5IC0+IEhFQlJFVyBMRVRURVIgU0hJTgorICAgIHUnXHUwNWVhJyAgICMgIDB4MDA5YSAtPiBIRUJSRVcgTEVUVEVSIFRBVgorICAgIHUnXHhhMicgICAgICMgIDB4MDA5YiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweDAwOWMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4MDA5ZCAtPiBZRU4gU0lHTgorICAgIHUnXHUyMGE3JyAgICMgIDB4MDA5ZSAtPiBQRVNFVEEgU0lHTgorICAgIHUnXHUwMTkyJyAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x4ZTEnICAgICAjICAweDAwYTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlZCcgICAgICMgIDB4MDBhMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGYzJyAgICAgIyAgMHgwMGEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZmEnICAgICAjICAweDAwYTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmMScgICAgICMgIDB4MDBhNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQxJyAgICAgIyAgMHgwMGE1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhYScgICAgICMgIDB4MDBhNiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4MDBhNyAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmYnICAgICAjICAweDAwYTggLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHUyMzEwJyAgICMgIDB4MDBhOSAtPiBSRVZFUlNFRCBOT1QgU0lHTgorICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4MDBhYiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmMnICAgICAjICAweDAwYWMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGExJyAgICAgIyAgMHgwMGFkIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU2MScgICAjICAweDAwYjUgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MicgICAjICAweDAwYjYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NicgICAjICAweDAwYjcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU1JyAgICMgIDB4MDBiOCAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjMnICAgIyAgMHgwMGI5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MjU1MScgICAjICAweDAwYmEgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIHUnXHUyNTU3JyAgICMgIDB4MDBiYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjU1ZCcgICAjICAweDAwYmMgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTVjJyAgICMgIDB4MDBiZCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTViJyAgICMgIDB4MDBiZSAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTEwJyAgICMgIDB4MDBiZiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTE0JyAgICMgIDB4MDBjMCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MzQnICAgIyAgMHgwMGMxIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDBjMiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTFjJyAgICMgIDB4MDBjMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1MDAnICAgIyAgMHgwMGM0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgdSdcdTI1M2MnICAgIyAgMHgwMGM1IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTVlJyAgICMgIDB4MDBjNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1ZicgICAjICAweDAwYzcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweDAwY2YgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2OCcgICAjICAweDAwZDAgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2NCcgICAjICAweDAwZDEgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY1JyAgICMgIDB4MDBkMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NTknICAgIyAgMHgwMGQzIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTU4JyAgICMgIDB4MDBkNCAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MicgICAjICAweDAwZDUgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1MycgICAjICAweDAwZDYgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU2YicgICAjICAweDAwZDcgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU2YScgICAjICAweDAwZDggLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjUxOCcgICAjICAweDAwZDkgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMGRhIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTg4JyAgICMgIDB4MDBkYiAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHgwMGRjIC0+IExPV0VSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4YycgICAjICAweDAwZGQgLT4gTEVGVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1OTAnICAgIyAgMHgwMGRlIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUwM2IxJyAgICMgIDB4MDBlMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICB1J1x4ZGYnICAgICAjICAweDAwZTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdFUk1BTikKKyAgICB1J1x1MDM5MycgICAjICAweDAwZTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNjMCcgICAjICAweDAwZTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYTMnICAgIyAgMHgwMGU0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYzMnICAgIyAgMHgwMGU1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHhiNScgICAgICMgIDB4MDBlNiAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTAzYzQnICAgIyAgMHgwMGU3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNhNicgICAjICAweDAwZTggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgdSdcdTAzOTgnICAgIyAgMHgwMGU5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzYTknICAgIyAgMHgwMGVhIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYjQnICAgIyAgMHgwMGViIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIHUnXHUyMjFlJyAgICMgIDB4MDBlYyAtPiBJTkZJTklUWQorICAgIHUnXHUwM2M2JyAgICMgIDB4MDBlZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYjUnICAgIyAgMHgwMGVlIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTIyMjknICAgIyAgMHgwMGVmIC0+IElOVEVSU0VDVElPTgorICAgIHUnXHUyMjYxJyAgICMgIDB4MDBmMCAtPiBJREVOVElDQUwgVE8KKyAgICB1J1x4YjEnICAgICAjICAweDAwZjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjUnICAgIyAgMHgwMGYyIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY0JyAgICMgIDB4MDBmMyAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjMyMCcgICAjICAweDAwZjQgLT4gVE9QIEhBTEYgSU5URUdSQUwKKyAgICB1J1x1MjMyMScgICAjICAweDAwZjUgLT4gQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICB1J1x4ZjcnICAgICAjICAweDAwZjYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyMjQ4JyAgICMgIDB4MDBmNyAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x4YjAnICAgICAjICAweDAwZjggLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MjIxOScgICAjICAweDAwZjkgLT4gQlVMTEVUIE9QRVJBVE9SCisgICAgdSdceGI3JyAgICAgIyAgMHgwMGZhIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjIxYScgICAjICAweDAwZmIgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjA3ZicgICAjICAweDAwZmMgLT4gU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J1x4YjInICAgICAjICAweDAwZmQgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdcdTI1YTAnICAgIyAgMHgwMGZlIC0+IEJMQUNLIFNRVUFSRQorICAgIHUnXHhhMCcgICAgICMgIDB4MDBmZiAtPiBOTy1CUkVBSyBTUEFDRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIE5VTEwKKyAgICAweDAwMDE6IDB4MDAwMSwgICAgICMgIFNUQVJUIE9GIEhFQURJTkcKKyAgICAweDAwMDI6IDB4MDAwMiwgICAgICMgIFNUQVJUIE9GIFRFWFQKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIEVORCBPRiBURVhUCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgMHgwMDA1OiAweDAwMDUsICAgICAjICBFTlFVSVJZCisgICAgMHgwMDA2OiAweDAwMDYsICAgICAjICBBQ0tOT1dMRURHRQorICAgIDB4MDAwNzogMHgwMDA3LCAgICAgIyAgQkVMTAorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQkFDS1NQQUNFCisgICAgMHgwMDA5OiAweDAwMDksICAgICAjICBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICAweDAwMGE6IDB4MDAwYSwgICAgICMgIExJTkUgRkVFRAorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgVkVSVElDQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYzogMHgwMDBjLCAgICAgIyAgRk9STSBGRUVECisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDQVJSSUFHRSBSRVRVUk4KKyAgICAweDAwMGU6IDB4MDAwZSwgICAgICMgIFNISUZUIE9VVAorICAgIDB4MDAwZjogMHgwMDBmLCAgICAgIyAgU0hJRlQgSU4KKyAgICAweDAwMTA6IDB4MDAxMCwgICAgICMgIERBVEEgTElOSyBFU0NBUEUKKyAgICAweDAwMTE6IDB4MDAxMSwgICAgICMgIERFVklDRSBDT05UUk9MIE9ORQorICAgIDB4MDAxMjogMHgwMDEyLCAgICAgIyAgREVWSUNFIENPTlRST0wgVFdPCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgREVWSUNFIENPTlRST0wgRk9VUgorICAgIDB4MDAxNTogMHgwMDE1LCAgICAgIyAgTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICAweDAwMTY6IDB4MDAxNiwgICAgICMgIFNZTkNIUk9OT1VTIElETEUKKyAgICAweDAwMTc6IDB4MDAxNywgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENBTkNFTAorICAgIDB4MDAxOTogMHgwMDE5LCAgICAgIyAgRU5EIE9GIE1FRElVTQorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgU1VCU1RJVFVURQorICAgIDB4MDAxYjogMHgwMDFiLCAgICAgIyAgRVNDQVBFCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBGSUxFIFNFUEFSQVRPUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgR1JPVVAgU0VQQVJBVE9SCisgICAgMHgwMDFlOiAweDAwMWUsICAgICAjICBSRUNPUkQgU0VQQVJBVE9SCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBVTklUIFNFUEFSQVRPUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UKKyAgICAweDAwMjE6IDB4MDAyMSwgICAgICMgIEVYQ0xBTUFUSU9OIE1BUksKKyAgICAweDAwMjI6IDB4MDAyMiwgICAgICMgIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDIzOiAweDAwMjMsICAgICAjICBOVU1CRVIgU0lHTgorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04KKyAgICAweDAwMjU6IDB4MDAyNSwgICAgICMgIFBFUkNFTlQgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBmZiwgICAgICMgIE5PLUJSRUFLIFNQQUNFCisgICAgMHgwMGExOiAweDAwYWQsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGEyOiAweDAwOWIsICAgICAjICBDRU5UIFNJR04KKyAgICAweDAwYTM6IDB4MDA5YywgICAgICMgIFBPVU5EIFNJR04KKyAgICAweDAwYTU6IDB4MDA5ZCwgICAgICMgIFlFTiBTSUdOCisgICAgMHgwMGFhOiAweDAwYTYsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhYjogMHgwMGFlLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWM6IDB4MDBhYSwgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjc6IDB4MDBmYSwgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwYmE6IDB4MDBhNywgICAgICMgIE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBiYjogMHgwMGFmLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGJjOiAweDAwYWMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYmQ6IDB4MDBhYiwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBiZjogMHgwMGE4LCAgICAgIyAgSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIDB4MDBkMTogMHgwMGE1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR0VSTUFOKQorICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlZDogMHgwMGExLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBmMTogMHgwMGE0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNzogMHgwMGY2LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDE5MjogMHgwMDlmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMzkzOiAweDAwZTIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIDB4MDM5ODogMHgwMGU5LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAzYTM6IDB4MDBlNCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwM2E2OiAweDAwZTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICAweDAzYTk6IDB4MDBlYSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwM2IxOiAweDAwZTAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAzYjQ6IDB4MDBlYiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBERUxUQQorICAgIDB4MDNiNTogMHgwMGVlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICAweDAzYzA6IDB4MDBlMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIDB4MDNjMzogMHgwMGU1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgMHgwM2M0OiAweDAwZTcsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwM2M2OiAweDAwZWQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwNWQwOiAweDAwODAsICAgICAjICBIRUJSRVcgTEVUVEVSIEFMRUYKKyAgICAweDA1ZDE6IDB4MDA4MSwgICAgICMgIEhFQlJFVyBMRVRURVIgQkVUCisgICAgMHgwNWQyOiAweDAwODIsICAgICAjICBIRUJSRVcgTEVUVEVSIEdJTUVMCisgICAgMHgwNWQzOiAweDAwODMsICAgICAjICBIRUJSRVcgTEVUVEVSIERBTEVUCisgICAgMHgwNWQ0OiAweDAwODQsICAgICAjICBIRUJSRVcgTEVUVEVSIEhFCisgICAgMHgwNWQ1OiAweDAwODUsICAgICAjICBIRUJSRVcgTEVUVEVSIFZBVgorICAgIDB4MDVkNjogMHgwMDg2LCAgICAgIyAgSEVCUkVXIExFVFRFUiBaQVlJTgorICAgIDB4MDVkNzogMHgwMDg3LCAgICAgIyAgSEVCUkVXIExFVFRFUiBIRVQKKyAgICAweDA1ZDg6IDB4MDA4OCwgICAgICMgIEhFQlJFVyBMRVRURVIgVEVUCisgICAgMHgwNWQ5OiAweDAwODksICAgICAjICBIRUJSRVcgTEVUVEVSIFlPRAorICAgIDB4MDVkYTogMHgwMDhhLCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBLQUYKKyAgICAweDA1ZGI6IDB4MDA4YiwgICAgICMgIEhFQlJFVyBMRVRURVIgS0FGCisgICAgMHgwNWRjOiAweDAwOGMsICAgICAjICBIRUJSRVcgTEVUVEVSIExBTUVECisgICAgMHgwNWRkOiAweDAwOGQsICAgICAjICBIRUJSRVcgTEVUVEVSIEZJTkFMIE1FTQorICAgIDB4MDVkZTogMHgwMDhlLCAgICAgIyAgSEVCUkVXIExFVFRFUiBNRU0KKyAgICAweDA1ZGY6IDB4MDA4ZiwgICAgICMgIEhFQlJFVyBMRVRURVIgRklOQUwgTlVOCisgICAgMHgwNWUwOiAweDAwOTAsICAgICAjICBIRUJSRVcgTEVUVEVSIE5VTgorICAgIDB4MDVlMTogMHgwMDkxLCAgICAgIyAgSEVCUkVXIExFVFRFUiBTQU1FS0gKKyAgICAweDA1ZTI6IDB4MDA5MiwgICAgICMgIEhFQlJFVyBMRVRURVIgQVlJTgorICAgIDB4MDVlMzogMHgwMDkzLCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBQRQorICAgIDB4MDVlNDogMHgwMDk0LCAgICAgIyAgSEVCUkVXIExFVFRFUiBQRQorICAgIDB4MDVlNTogMHgwMDk1LCAgICAgIyAgSEVCUkVXIExFVFRFUiBGSU5BTCBUU0FESQorICAgIDB4MDVlNjogMHgwMDk2LCAgICAgIyAgSEVCUkVXIExFVFRFUiBUU0FESQorICAgIDB4MDVlNzogMHgwMDk3LCAgICAgIyAgSEVCUkVXIExFVFRFUiBRT0YKKyAgICAweDA1ZTg6IDB4MDA5OCwgICAgICMgIEhFQlJFVyBMRVRURVIgUkVTSAorICAgIDB4MDVlOTogMHgwMDk5LCAgICAgIyAgSEVCUkVXIExFVFRFUiBTSElOCisgICAgMHgwNWVhOiAweDAwOWEsICAgICAjICBIRUJSRVcgTEVUVEVSIFRBVgorICAgIDB4MjA3ZjogMHgwMGZjLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDIwYTc6IDB4MDA5ZSwgICAgICMgIFBFU0VUQSBTSUdOCisgICAgMHgyMjE5OiAweDAwZjksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDIyMWE6IDB4MDBmYiwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgyMjFlOiAweDAwZWMsICAgICAjICBJTkZJTklUWQorICAgIDB4MjIyOTogMHgwMGVmLCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgyMjQ4OiAweDAwZjcsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDIyNjE6IDB4MDBmMCwgICAgICMgIElERU5USUNBTCBUTworICAgIDB4MjI2NDogMHgwMGYzLCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMjY1OiAweDAwZjIsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIzMTA6IDB4MDBhOSwgICAgICMgIFJFVkVSU0VEIE5PVCBTSUdOCisgICAgMHgyMzIwOiAweDAwZjQsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MjMyMTogMHgwMGY1LCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1MjogMHgwMGQ1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTM6IDB4MDBkNiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU1OiAweDAwYjgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTU2OiAweDAwYjcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NTg6IDB4MDBkNCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1OTogMHgwMGQzLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1YjogMHgwMGJlLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NWM6IDB4MDBiZCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTVlOiAweDAwYzYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NWY6IDB4MDBjNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjE6IDB4MDBiNSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTYyOiAweDAwYjYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NDogMHgwMGQxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2NTogMHgwMGQyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY3OiAweDAwY2YsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2ODogMHgwMGQwLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmE6IDB4MDBkOCwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTZiOiAweDAwZDcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU4YzogMHgwMGRkLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgyNTkwOiAweDAwZGUsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYyLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWYzNDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYyLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWYzNDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkZmFiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODYzLnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg2My5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODYzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODE6IDB4MDBmYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDgyOiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDgzOiAweDAwZTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwODQ6IDB4MDBjMiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg1OiAweDAwZTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDg2OiAweDAwYjYsICAgICAjICBQSUxDUk9XIFNJR04KKyAgICAweDAwODc6IDB4MDBlNywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDA4ODogMHgwMGVhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg5OiAweDAwZWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4YTogMHgwMGU4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDA4YjogMHgwMGVmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGM6IDB4MDBlZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4ZDogMHgyMDE3LCAgICAgIyAgRE9VQkxFIExPVyBMSU5FCisgICAgMHgwMDhlOiAweDAwYzAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwOGY6IDB4MDBhNywgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDA5MDogMHgwMGM5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDkxOiAweDAwYzgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwOTI6IDB4MDBjYSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDkzOiAweDAwZjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTQ6IDB4MDBjYiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTU6IDB4MDBjZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOTY6IDB4MDBmYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5NzogMHgwMGY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDA5ODogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDA5OTogMHgwMGQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOWE6IDB4MDBkYywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDBhMiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwMGQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMDllOiAweDAwZGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5ZjogMHgwMTkyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgMHgwMGEwOiAweDAwYTYsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMGExOiAweDAwYjQsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwYTI6IDB4MDBmMywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAweDAwYTM6IDB4MDBmYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwYTQ6IDB4MDBhOCwgICAgICMgIERJQUVSRVNJUworICAgIDB4MDBhNTogMHgwMGI4LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBhNjogMHgwMGIzLCAgICAgIyAgU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICAweDAwYTc6IDB4MDBhZiwgICAgICMgIE1BQ1JPTgorICAgIDB4MDBhODogMHgwMGNlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwYTk6IDB4MjMxMCwgICAgICMgIFJFVkVSU0VEIE5PVCBTSUdOCisgICAgMHgwMGFhOiAweDAwYWMsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhYjogMHgwMGJkLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGFjOiAweDAwYmMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYWQ6IDB4MDBiZSwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIDB4MDBhZTogMHgwMGFiLCAgICAgIyAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYWY6IDB4MDBiYiwgICAgICMgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MjU2MSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI2OiAweDI1NjIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiNzogMHgyNTU2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiODogMHgyNTU1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDI1NWMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiZTogMHgyNTViLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDI1NWUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwYzc6IDB4MjU1ZiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgyNTY3LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDA6IDB4MjU2OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQxOiAweDI1NjQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQyOiAweDI1NjUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQzOiAweDI1NTksICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDQ6IDB4MjU1OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNTogMHgyNTUyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDY6IDB4MjU1MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ3OiAweDI1NmIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkODogMHgyNTZhLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDI1OGMsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGU6IDB4MjU5MCwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDNiMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDBlMTogMHgwMGRmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTI6IDB4MDM5MywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMGUzOiAweDAzYzAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAwZTQ6IDB4MDNhMywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU1OiAweDAzYzMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IDB4MDNjNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAwZTg6IDB4MDNhNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDBlOTogMHgwMzk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAwZWE6IDB4MDNhOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwMGViOiAweDAzYjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAwZWM6IDB4MjIxZSwgICAgICMgIElORklOSVRZCisgICAgMHgwMGVkOiAweDAzYzYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwMGVlOiAweDAzYjUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDBlZjogMHgyMjI5LCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgwMGYwOiAweDIyNjEsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMjY1LCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGYzOiAweDIyNjQsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjQ6IDB4MjMyMCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY1OiAweDIzMjEsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgyMjQ4LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDBmYzogMHgyMDdmLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwZmQ6IDB4MDBiMiwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YzcnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzInICAgICAjICAweDAwODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTAnICAgICAjICAweDAwODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhiNicgICAgICMgIDB4MDA4NiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4ZTcnICAgICAjICAweDAwODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGVhJyAgICAgIyAgMHgwMDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4MDA4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4MDA4YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVmJyAgICAgIyAgMHgwMDhiIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVlJyAgICAgIyAgMHgwMDhjIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUyMDE3JyAgICMgIDB4MDA4ZCAtPiBET1VCTEUgTE9XIExJTkUKKyAgICB1J1x4YzAnICAgICAjICAweDAwOGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGE3JyAgICAgIyAgMHgwMDhmIC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhjOScgICAgICMgIDB4MDA5MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4YzgnICAgICAjICAweDAwOTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNhJyAgICAgIyAgMHgwMDkyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY0JyAgICAgIyAgMHgwMDkzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYicgICAgICMgIDB4MDA5NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNmJyAgICAgIyAgMHgwMDk1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZmInICAgICAjICAweDAwOTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY5JyAgICAgIyAgMHgwMDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4YTQnICAgICAjICAweDAwOTggLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHhkNCcgICAgICMgIDB4MDA5OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEyJyAgICAgIyAgMHgwMDliIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdceGQ5JyAgICAgIyAgMHgwMDlkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYicgICAgICMgIDB4MDA5ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTkyJyAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x4YTYnICAgICAjICAweDAwYTAgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhiNCcgICAgICMgIDB4MDBhMSAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4ZjMnICAgICAjICAweDAwYTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmYScgICAgICMgIDB4MDBhMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGE4JyAgICAgIyAgMHgwMGE0IC0+IERJQUVSRVNJUworICAgIHUnXHhiOCcgICAgICMgIDB4MDBhNSAtPiBDRURJTExBCisgICAgdSdceGIzJyAgICAgIyAgMHgwMGE2IC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGFmJyAgICAgIyAgMHgwMGE3IC0+IE1BQ1JPTgorICAgIHUnXHhjZScgICAgICMgIDB4MDBhOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUyMzEwJyAgICMgIDB4MDBhOSAtPiBSRVZFUlNFRCBOT1QgU0lHTgorICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4MDBhYiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmMnICAgICAjICAweDAwYWMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJlJyAgICAgIyAgMHgwMGFkIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhhYicgICAgICMgIDB4MDBhZSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4MDBhZiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjU5MScgICAjICAweDAwYjAgLT4gTElHSFQgU0hBREUKKyAgICB1J1x1MjU5MicgICAjICAweDAwYjEgLT4gTUVESVVNIFNIQURFCisgICAgdSdcdTI1OTMnICAgIyAgMHgwMGIyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjUwMicgICAjICAweDAwYjMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MjQnICAgIyAgMHgwMGI0IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTYxJyAgICMgIDB4MDBiNSAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYyJyAgICMgIDB4MDBiNiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU2JyAgICMgIDB4MDBiNyAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTUnICAgIyAgMHgwMGI4IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTI1NWMnICAgIyAgMHgwMGJkIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NWInICAgIyAgMHgwMGJlIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1MTAnICAgIyAgMHgwMGJmIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMGMwIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjUzNCcgICAjICAweDAwYzEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MmMnICAgIyAgMHgwMGMyIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMGMzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUwMCcgICAjICAweDAwYzQgLT4gQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICB1J1x1MjUzYycgICAjICAweDAwYzUgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NWUnICAgIyAgMHgwMGM2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTVmJyAgICMgIDB4MDBjNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweDAwYzggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1NCcgICAjICAweDAwYzkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTY5JyAgICMgIDB4MDBjYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjYnICAgIyAgMHgwMGNiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTYwJyAgICMgIDB4MDBjYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTUwJyAgICMgIDB4MDBjZCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICB1J1x1MjU2YycgICAjICAweDAwY2UgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY3JyAgICMgIDB4MDBjZiAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTY4JyAgICMgIDB4MDBkMCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY0JyAgICMgIDB4MDBkMSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjUnICAgIyAgMHgwMGQyIC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICB1J1x1MjU1OScgICAjICAweDAwZDMgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NTgnICAgIyAgMHgwMGQ0IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUyJyAgICMgIDB4MDBkNSAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTUzJyAgICMgIDB4MDBkNiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTZiJyAgICMgIDB4MDBkNyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTZhJyAgICMgIDB4MDBkOCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUyNThjJyAgICMgIDB4MDBkZCAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDAwZGUgLT4gUklHSFQgSEFMRiBCTE9DSworICAgIHUnXHUyNTgwJyAgICMgIDB4MDBkZiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTAzYjEnICAgIyAgMHgwMGUwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHhkZicgICAgICMgIDB4MDBlMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHUwMzkzJyAgICMgIDB4MDBlMiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwM2MwJyAgICMgIDB4MDBlMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MDNhMycgICAjICAweDAwZTQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNjMycgICAjICAweDAwZTUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFNJR01BCisgICAgdSdceGI1JyAgICAgIyAgMHgwMGU2IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MDNjNCcgICAjICAweDAwZTcgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2E2JyAgICMgIDB4MDBlOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICB1J1x1MDM5OCcgICAjICAweDAwZTkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDNhOScgICAjICAweDAwZWEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNiNCcgICAjICAweDAwZWIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTIyMWUnICAgIyAgMHgwMGVjIC0+IElORklOSVRZCisgICAgdSdcdTAzYzYnICAgIyAgMHgwMGVkIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNiNScgICAjICAweDAwZWUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MjIyOScgICAjICAweDAwZWYgLT4gSU5URVJTRUNUSU9OCisgICAgdSdcdTIyNjEnICAgIyAgMHgwMGYwIC0+IElERU5USUNBTCBUTworICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NScgICAjICAweDAwZjIgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjQnICAgIyAgMHgwMGYzIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMzIwJyAgICMgIDB4MDBmNCAtPiBUT1AgSEFMRiBJTlRFR1JBTAorICAgIHUnXHUyMzIxJyAgICMgIDB4MDBmNSAtPiBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIHUnXHhmNycgICAgICMgIDB4MDBmNiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTIyNDgnICAgIyAgMHgwMGY3IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUyMjE5JyAgICMgIDB4MDBmOSAtPiBCVUxMRVQgT1BFUkFUT1IKKyAgICB1J1x4YjcnICAgICAjICAweDAwZmEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMjFhJyAgICMgIDB4MDBmYiAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUyMDdmJyAgICMgIDB4MDBmYyAtPiBTVVBFUlNDUklQVCBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnXHhiMicgICAgICMgIDB4MDBmZCAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTI6IDB4MDA5YiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNDogMHgwMDk4LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhNjogMHgwMGEwLCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDBhNzogMHgwMDhmLCAgICAgIyAgU0VDVElPTiBTSUdOCisgICAgMHgwMGE4OiAweDAwYTQsICAgICAjICBESUFFUkVTSVMKKyAgICAweDAwYWI6IDB4MDBhZSwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFjOiAweDAwYWEsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBhZjogMHgwMGE3LCAgICAgIyAgTUFDUk9OCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwZmQsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjM6IDB4MDBhNiwgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGI0OiAweDAwYTEsICAgICAjICBBQ1VURSBBQ0NFTlQKKyAgICAweDAwYjU6IDB4MDBlNiwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwYjY6IDB4MDA4NiwgICAgICMgIFBJTENST1cgU0lHTgorICAgIDB4MDBiNzogMHgwMGZhLCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDBiODogMHgwMGE1LCAgICAgIyAgQ0VESUxMQQorICAgIDB4MDBiYjogMHgwMGFmLCAgICAgIyAgUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGJjOiAweDAwYWMsICAgICAjICBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAweDAwYmQ6IDB4MDBhYiwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBiZTogMHgwMGFkLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgMHgwMGMwOiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAweDAwYzI6IDB4MDA4NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGM3OiAweDAwODAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBjODogMHgwMDkxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGM5OiAweDAwOTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwY2E6IDB4MDA5MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGNiOiAweDAwOTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGNlOiAweDAwYTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDBjZjogMHgwMDk1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkNDogMHgwMDk5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZDk6IDB4MDA5ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBkYjogMHgwMDllLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZGM6IDB4MDA5YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwZGY6IDB4MDBlMSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgMHgwMGUwOiAweDAwODUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMGUyOiAweDAwODMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZTc6IDB4MDA4NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIDB4MDBlODogMHgwMDhhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIDB4MDBlOTogMHgwMDgyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBlYTogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGViOiAweDAwODksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlZTogMHgwMDhjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGVmOiAweDAwOGIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmMzogMHgwMGEyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBmNDogMHgwMDkzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY5OiAweDAwOTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGZhOiAweDAwYTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGZiOiAweDAwOTYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZmM6IDB4MDA4MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMTkyOiAweDAwOWYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAweDAzOTM6IDB4MDBlMiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMzk4OiAweDAwZTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIDB4MDNhMzogMHgwMGU0LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYTY6IDB4MDBlOCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDNhOTogMHgwMGVhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICAweDAzYjE6IDB4MDBlMCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDNiNDogMHgwMGViLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwM2I1OiAweDAwZWUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDNjMDogMHgwMGUzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwM2MzOiAweDAwZTUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAzYzQ6IDB4MDBlNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAzYzY6IDB4MDBlZCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDIwMTc6IDB4MDA4ZCwgICAgICMgIERPVUJMRSBMT1cgTElORQorICAgIDB4MjA3ZjogMHgwMGZjLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDIyMTk6IDB4MDBmOSwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MjIxYTogMHgwMGZiLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDIyMWU6IDB4MDBlYywgICAgICMgIElORklOSVRZCisgICAgMHgyMjI5OiAweDAwZWYsICAgICAjICBJTlRFUlNFQ1RJT04KKyAgICAweDIyNDg6IDB4MDBmNywgICAgICMgIEFMTU9TVCBFUVVBTCBUTworICAgIDB4MjI2MTogMHgwMGYwLCAgICAgIyAgSURFTlRJQ0FMIFRPCisgICAgMHgyMjY0OiAweDAwZjMsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIyNjU6IDB4MDBmMiwgICAgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIDB4MjMxMDogMHgwMGE5LCAgICAgIyAgUkVWRVJTRUQgTk9UIFNJR04KKyAgICAweDIzMjA6IDB4MDBmNCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgyMzIxOiAweDAwZjUsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTUyOiAweDAwZDUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1MzogMHgwMGQ2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTU6IDB4MDBiOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NTY6IDB4MDBiNywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1ODogMHgwMGQ0LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTU5OiAweDAwZDMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTViOiAweDAwYmUsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1YzogMHgwMGJkLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NWU6IDB4MDBjNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1ZjogMHgwMGM3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MTogMHgwMGI1LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NjI6IDB4MDBiNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY0OiAweDAwZDEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY1OiAweDAwZDIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njc6IDB4MDBjZiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY4OiAweDAwZDAsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YTogMHgwMGQ4LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NmI6IDB4MDBkNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNThjOiAweDAwZGQsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTA6IDB4MDBkZSwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmRiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2My5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmRiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2My5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmEwZTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjQucHkKQEAgLTAsMCArMSw2OTAgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODY0LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NjQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDI1OiAweDA2NmEsICAgICAjICBBUkFCSUMgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDgwOiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDA4MTogMHgwMGI3LCAgICAgIyAgTUlERExFIERPVAorICAgIDB4MDA4MjogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMDgzOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDA4NDogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMDg1OiAweDI1MDAsICAgICAjICBGT1JNUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMDg2OiAweDI1MDIsICAgICAjICBGT1JNUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDA4NzogMHgyNTNjLCAgICAgIyAgRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwODg6IDB4MjUyNCwgICAgICMgIEZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMDg5OiAweDI1MmMsICAgICAjICBGT1JNUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMDhhOiAweDI1MWMsICAgICAjICBGT1JNUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwOGI6IDB4MjUzNCwgICAgICMgIEZPUk1TIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMDhjOiAweDI1MTAsICAgICAjICBGT1JNUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMDhkOiAweDI1MGMsICAgICAjICBGT1JNUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MDA4ZTogMHgyNTE0LCAgICAgIyAgRk9STVMgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMDhmOiAweDI1MTgsICAgICAjICBGT1JNUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDA5MDogMHgwM2IyLCAgICAgIyAgR1JFRUsgU01BTEwgQkVUQQorICAgIDB4MDA5MTogMHgyMjFlLCAgICAgIyAgSU5GSU5JVFkKKyAgICAweDAwOTI6IDB4MDNjNiwgICAgICMgIEdSRUVLIFNNQUxMIFBISQorICAgIDB4MDA5MzogMHgwMGIxLCAgICAgIyAgUExVUy1PUi1NSU5VUyBTSUdOCisgICAgMHgwMDk0OiAweDAwYmQsICAgICAjICBGUkFDVElPTiAxLzIKKyAgICAweDAwOTU6IDB4MDBiYywgICAgICMgIEZSQUNUSU9OIDEvNAorICAgIDB4MDA5NjogMHgyMjQ4LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgwMDk3OiAweDAwYWIsICAgICAjICBMRUZUIFBPSU5USU5HIEdVSUxMRU1FVAorICAgIDB4MDA5ODogMHgwMGJiLCAgICAgIyAgUklHSFQgUE9JTlRJTkcgR1VJTExFTUVUCisgICAgMHgwMDk5OiAweGZlZjcsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICAweDAwOWE6IDB4ZmVmOCwgICAgICMgIEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggSEFNWkEgQUJPVkUgRklOQUwgRk9STQorICAgIDB4MDA5YjogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDljOiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwOWQ6IDB4ZmVmYiwgICAgICMgIEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIElTT0xBVEVEIEZPUk0KKyAgICAweDAwOWU6IDB4ZmVmYywgICAgICMgIEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIEZJTkFMIEZPUk0KKyAgICAweDAwOWY6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDBhMTogMHgwMGFkLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwYTI6IDB4ZmU4MiwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICAweDAwYTU6IDB4ZmU4NCwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICAweDAwYTY6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDBhNzogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMGE4OiAweGZlOGUsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgRklOQUwgRk9STQorICAgIDB4MDBhOTogMHhmZThmLCAgICAgIyAgQVJBQklDIExFVFRFUiBCRUggSVNPTEFURUQgRk9STQorICAgIDB4MDBhYTogMHhmZTk1LCAgICAgIyAgQVJBQklDIExFVFRFUiBURUggSVNPTEFURUQgRk9STQorICAgIDB4MDBhYjogMHhmZTk5LCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEVIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYWM6IDB4MDYwYywgICAgICMgIEFSQUJJQyBDT01NQQorICAgIDB4MDBhZDogMHhmZTlkLCAgICAgIyAgQVJBQklDIExFVFRFUiBKRUVNIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYWU6IDB4ZmVhMSwgICAgICMgIEFSQUJJQyBMRVRURVIgSEFIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYWY6IDB4ZmVhNSwgICAgICMgIEFSQUJJQyBMRVRURVIgS0hBSCBJU09MQVRFRCBGT1JNCisgICAgMHgwMGIwOiAweDA2NjAsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTworICAgIDB4MDBiMTogMHgwNjYxLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIE9ORQorICAgIDB4MDBiMjogMHgwNjYyLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFRXTworICAgIDB4MDBiMzogMHgwNjYzLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFRIUkVFCisgICAgMHgwMGI0OiAweDA2NjQsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgRk9VUgorICAgIDB4MDBiNTogMHgwNjY1LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEZJVkUKKyAgICAweDAwYjY6IDB4MDY2NiwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBTSVgKKyAgICAweDAwYjc6IDB4MDY2NywgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBTRVZFTgorICAgIDB4MDBiODogMHgwNjY4LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEVJR0hUCisgICAgMHgwMGI5OiAweDA2NjksICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgTklORQorICAgIDB4MDBiYTogMHhmZWQxLCAgICAgIyAgQVJBQklDIExFVFRFUiBGRUggSVNPTEFURUQgRk9STQorICAgIDB4MDBiYjogMHgwNjFiLCAgICAgIyAgQVJBQklDIFNFTUlDT0xPTgorICAgIDB4MDBiYzogMHhmZWIxLCAgICAgIyAgQVJBQklDIExFVFRFUiBTRUVOIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYmQ6IDB4ZmViNSwgICAgICMgIEFSQUJJQyBMRVRURVIgU0hFRU4gSVNPTEFURUQgRk9STQorICAgIDB4MDBiZTogMHhmZWI5LCAgICAgIyAgQVJBQklDIExFVFRFUiBTQUQgSVNPTEFURUQgRk9STQorICAgIDB4MDBiZjogMHgwNjFmLCAgICAgIyAgQVJBQklDIFFVRVNUSU9OIE1BUksKKyAgICAweDAwYzA6IDB4MDBhMiwgICAgICMgIENFTlQgU0lHTgorICAgIDB4MDBjMTogMHhmZTgwLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQU1aQSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGMyOiAweGZlODEsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGMzOiAweGZlODMsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGM0OiAweGZlODUsICAgICAjICBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICAweDAwYzU6IDB4ZmVjYSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOIEZJTkFMIEZPUk0KKyAgICAweDAwYzY6IDB4ZmU4YiwgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUgSU5JVElBTCBGT1JNCisgICAgMHgwMGM3OiAweGZlOGQsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgSVNPTEFURUQgRk9STQorICAgIDB4MDBjODogMHhmZTkxLCAgICAgIyAgQVJBQklDIExFVFRFUiBCRUggSU5JVElBTCBGT1JNCisgICAgMHgwMGM5OiAweGZlOTMsICAgICAjICBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBIElTT0xBVEVEIEZPUk0KKyAgICAweDAwY2E6IDB4ZmU5NywgICAgICMgIEFSQUJJQyBMRVRURVIgVEVIIElOSVRJQUwgRk9STQorICAgIDB4MDBjYjogMHhmZTliLCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEVIIElOSVRJQUwgRk9STQorICAgIDB4MDBjYzogMHhmZTlmLCAgICAgIyAgQVJBQklDIExFVFRFUiBKRUVNIElOSVRJQUwgRk9STQorICAgIDB4MDBjZDogMHhmZWEzLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQUggSU5JVElBTCBGT1JNCisgICAgMHgwMGNlOiAweGZlYTcsICAgICAjICBBUkFCSUMgTEVUVEVSIEtIQUggSU5JVElBTCBGT1JNCisgICAgMHgwMGNmOiAweGZlYTksICAgICAjICBBUkFCSUMgTEVUVEVSIERBTCBJU09MQVRFRCBGT1JNCisgICAgMHgwMGQwOiAweGZlYWIsICAgICAjICBBUkFCSUMgTEVUVEVSIFRIQUwgSVNPTEFURUQgRk9STQorICAgIDB4MDBkMTogMHhmZWFkLCAgICAgIyAgQVJBQklDIExFVFRFUiBSRUggSVNPTEFURUQgRk9STQorICAgIDB4MDBkMjogMHhmZWFmLCAgICAgIyAgQVJBQklDIExFVFRFUiBaQUlOIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZDM6IDB4ZmViMywgICAgICMgIEFSQUJJQyBMRVRURVIgU0VFTiBJTklUSUFMIEZPUk0KKyAgICAweDAwZDQ6IDB4ZmViNywgICAgICMgIEFSQUJJQyBMRVRURVIgU0hFRU4gSU5JVElBTCBGT1JNCisgICAgMHgwMGQ1OiAweGZlYmIsICAgICAjICBBUkFCSUMgTEVUVEVSIFNBRCBJTklUSUFMIEZPUk0KKyAgICAweDAwZDY6IDB4ZmViZiwgICAgICMgIEFSQUJJQyBMRVRURVIgREFEIElOSVRJQUwgRk9STQorICAgIDB4MDBkNzogMHhmZWMxLCAgICAgIyAgQVJBQklDIExFVFRFUiBUQUggSVNPTEFURUQgRk9STQorICAgIDB4MDBkODogMHhmZWM1LCAgICAgIyAgQVJBQklDIExFVFRFUiBaQUggSVNPTEFURUQgRk9STQorICAgIDB4MDBkOTogMHhmZWNiLCAgICAgIyAgQVJBQklDIExFVFRFUiBBSU4gSU5JVElBTCBGT1JNCisgICAgMHgwMGRhOiAweGZlY2YsICAgICAjICBBUkFCSUMgTEVUVEVSIEdIQUlOIElOSVRJQUwgRk9STQorICAgIDB4MDBkYjogMHgwMGE2LCAgICAgIyAgQlJPS0VOIFZFUlRJQ0FMIEJBUgorICAgIDB4MDBkYzogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwZGQ6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04KKyAgICAweDAwZGU6IDB4MDBkNywgICAgICMgIE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICAweDAwZGY6IDB4ZmVjOSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZTA6IDB4MDY0MCwgICAgICMgIEFSQUJJQyBUQVRXRUVMCisgICAgMHgwMGUxOiAweGZlZDMsICAgICAjICBBUkFCSUMgTEVUVEVSIEZFSCBJTklUSUFMIEZPUk0KKyAgICAweDAwZTI6IDB4ZmVkNywgICAgICMgIEFSQUJJQyBMRVRURVIgUUFGIElOSVRJQUwgRk9STQorICAgIDB4MDBlMzogMHhmZWRiLCAgICAgIyAgQVJBQklDIExFVFRFUiBLQUYgSU5JVElBTCBGT1JNCisgICAgMHgwMGU0OiAweGZlZGYsICAgICAjICBBUkFCSUMgTEVUVEVSIExBTSBJTklUSUFMIEZPUk0KKyAgICAweDAwZTU6IDB4ZmVlMywgICAgICMgIEFSQUJJQyBMRVRURVIgTUVFTSBJTklUSUFMIEZPUk0KKyAgICAweDAwZTY6IDB4ZmVlNywgICAgICMgIEFSQUJJQyBMRVRURVIgTk9PTiBJTklUSUFMIEZPUk0KKyAgICAweDAwZTc6IDB4ZmVlYiwgICAgICMgIEFSQUJJQyBMRVRURVIgSEVIIElOSVRJQUwgRk9STQorICAgIDB4MDBlODogMHhmZWVkLCAgICAgIyAgQVJBQklDIExFVFRFUiBXQVcgSVNPTEFURUQgRk9STQorICAgIDB4MDBlOTogMHhmZWVmLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIE1BS1NVUkEgSVNPTEFURUQgRk9STQorICAgIDB4MDBlYTogMHhmZWYzLCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUggSU5JVElBTCBGT1JNCisgICAgMHgwMGViOiAweGZlYmQsICAgICAjICBBUkFCSUMgTEVUVEVSIERBRCBJU09MQVRFRCBGT1JNCisgICAgMHgwMGVjOiAweGZlY2MsICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTiBNRURJQUwgRk9STQorICAgIDB4MDBlZDogMHhmZWNlLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTiBGSU5BTCBGT1JNCisgICAgMHgwMGVlOiAweGZlY2QsICAgICAjICBBUkFCSUMgTEVUVEVSIEdIQUlOIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZWY6IDB4ZmVlMSwgICAgICMgIEFSQUJJQyBMRVRURVIgTUVFTSBJU09MQVRFRCBGT1JNCisgICAgMHgwMGYwOiAweGZlN2QsICAgICAjICBBUkFCSUMgU0hBRERBIE1FRElBTCBGT1JNCisgICAgMHgwMGYxOiAweDA2NTEsICAgICAjICBBUkFCSUMgU0hBRERBSAorICAgIDB4MDBmMjogMHhmZWU1LCAgICAgIyAgQVJBQklDIExFVFRFUiBOT09OIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZjM6IDB4ZmVlOSwgICAgICMgIEFSQUJJQyBMRVRURVIgSEVIIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZjQ6IDB4ZmVlYywgICAgICMgIEFSQUJJQyBMRVRURVIgSEVIIE1FRElBTCBGT1JNCisgICAgMHgwMGY1OiAweGZlZjAsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSBGSU5BTCBGT1JNCisgICAgMHgwMGY2OiAweGZlZjIsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBGSU5BTCBGT1JNCisgICAgMHgwMGY3OiAweGZlZDAsICAgICAjICBBUkFCSUMgTEVUVEVSIEdIQUlOIE1FRElBTCBGT1JNCisgICAgMHgwMGY4OiAweGZlZDUsICAgICAjICBBUkFCSUMgTEVUVEVSIFFBRiBJU09MQVRFRCBGT1JNCisgICAgMHgwMGY5OiAweGZlZjUsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIE1BRERBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICAweDAwZmE6IDB4ZmVmNiwgICAgICMgIEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggTUFEREEgQUJPVkUgRklOQUwgRk9STQorICAgIDB4MDBmYjogMHhmZWRkLCAgICAgIyAgQVJBQklDIExFVFRFUiBMQU0gSVNPTEFURUQgRk9STQorICAgIDB4MDBmYzogMHhmZWQ5LCAgICAgIyAgQVJBQklDIExFVFRFUiBLQUYgSVNPTEFURUQgRk9STQorICAgIDB4MDBmZDogMHhmZWYxLCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUggSVNPTEFURUQgRk9STQorICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiBOb25lLCAgICAgICAjICBVTkRFRklORUQKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDAwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDAwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwMDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwMDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwMDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MDAwYSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MDAwYyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwMDBlIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MDAwZiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MDAxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgwMDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MDAxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MDAxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MDAxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgwMDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgwMDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MDAxYiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgwMDFlIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnXHUwNjZhJyAgICMgIDB4MDAyNSAtPiBBUkFCSUMgUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHhiMCcgICAgICMgIDB4MDA4MCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4MDA4MSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIyMTknICAgIyAgMHgwMDgyIC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHUyMjFhJyAgICMgIDB4MDA4MyAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUyNTkyJyAgICMgIDB4MDA4NCAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjUwMCcgICAjICAweDAwODUgLT4gRk9STVMgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTAyJyAgICMgIDB4MDA4NiAtPiBGT1JNUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDA4NyAtPiBGT1JNUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDA4OCAtPiBGT1JNUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTJjJyAgICMgIDB4MDA4OSAtPiBGT1JNUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1MWMnICAgIyAgMHgwMDhhIC0+IEZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDA4YiAtPiBGT1JNUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTEwJyAgICMgIDB4MDA4YyAtPiBGT1JNUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MGMnICAgIyAgMHgwMDhkIC0+IEZPUk1TIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1MTQnICAgIyAgMHgwMDhlIC0+IEZPUk1TIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTE4JyAgICMgIDB4MDA4ZiAtPiBGT1JNUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUwM2IyJyAgICMgIDB4MDA5MCAtPiBHUkVFSyBTTUFMTCBCRVRBCisgICAgdSdcdTIyMWUnICAgIyAgMHgwMDkxIC0+IElORklOSVRZCisgICAgdSdcdTAzYzYnICAgIyAgMHgwMDkyIC0+IEdSRUVLIFNNQUxMIFBISQorICAgIHUnXHhiMScgICAgICMgIDB4MDA5MyAtPiBQTFVTLU9SLU1JTlVTIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweDAwOTQgLT4gRlJBQ1RJT04gMS8yCisgICAgdSdceGJjJyAgICAgIyAgMHgwMDk1IC0+IEZSQUNUSU9OIDEvNAorICAgIHUnXHUyMjQ4JyAgICMgIDB4MDA5NiAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x4YWInICAgICAjICAweDAwOTcgLT4gTEVGVCBQT0lOVElORyBHVUlMTEVNRVQKKyAgICB1J1x4YmInICAgICAjICAweDAwOTggLT4gUklHSFQgUE9JTlRJTkcgR1VJTExFTUVUCisgICAgdSdcdWZlZjcnICAgIyAgMHgwMDk5IC0+IEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWY4JyAgICMgIDB4MDA5YSAtPiBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIEhBTVpBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmZmZScgICAjICAweDAwOWIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDljIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZWZiJyAgICMgIDB4MDA5ZCAtPiBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZmMnICAgIyAgMHgwMDllIC0+IEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmZmZScgICAjICAweDAwOWYgLT4gVU5ERUZJTkVECisgICAgdSdceGEwJyAgICAgIyAgMHgwMGEwIC0+IE5PTi1CUkVBS0lORyBTUEFDRQorICAgIHUnXHhhZCcgICAgICMgIDB4MDBhMSAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHVmZTgyJyAgICMgIDB4MDBhMiAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgdSdceGEzJyAgICAgIyAgMHgwMGEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweDAwYTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHVmZTg0JyAgICMgIDB4MDBhNSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMGE2IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4MDBhNyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmU4ZScgICAjICAweDAwYTggLT4gQVJBQklDIExFVFRFUiBBTEVGIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmU4ZicgICAjICAweDAwYTkgLT4gQVJBQklDIExFVFRFUiBCRUggSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTk1JyAgICMgIDB4MDBhYSAtPiBBUkFCSUMgTEVUVEVSIFRFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOTknICAgIyAgMHgwMGFiIC0+IEFSQUJJQyBMRVRURVIgVEhFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdTA2MGMnICAgIyAgMHgwMGFjIC0+IEFSQUJJQyBDT01NQQorICAgIHUnXHVmZTlkJyAgICMgIDB4MDBhZCAtPiBBUkFCSUMgTEVUVEVSIEpFRU0gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWExJyAgICMgIDB4MDBhZSAtPiBBUkFCSUMgTEVUVEVSIEhBSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYTUnICAgIyAgMHgwMGFmIC0+IEFSQUJJQyBMRVRURVIgS0hBSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdTA2NjAnICAgIyAgMHgwMGIwIC0+IEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPCisgICAgdSdcdTA2NjEnICAgIyAgMHgwMGIxIC0+IEFSQUJJQy1JTkRJQyBESUdJVCBPTkUKKyAgICB1J1x1MDY2MicgICAjICAweDAwYjIgLT4gQVJBQklDLUlORElDIERJR0lUIFRXTworICAgIHUnXHUwNjYzJyAgICMgIDB4MDBiMyAtPiBBUkFCSUMtSU5ESUMgRElHSVQgVEhSRUUKKyAgICB1J1x1MDY2NCcgICAjICAweDAwYjQgLT4gQVJBQklDLUlORElDIERJR0lUIEZPVVIKKyAgICB1J1x1MDY2NScgICAjICAweDAwYjUgLT4gQVJBQklDLUlORElDIERJR0lUIEZJVkUKKyAgICB1J1x1MDY2NicgICAjICAweDAwYjYgLT4gQVJBQklDLUlORElDIERJR0lUIFNJWAorICAgIHUnXHUwNjY3JyAgICMgIDB4MDBiNyAtPiBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4KKyAgICB1J1x1MDY2OCcgICAjICAweDAwYjggLT4gQVJBQklDLUlORElDIERJR0lUIEVJR0hUCisgICAgdSdcdTA2NjknICAgIyAgMHgwMGI5IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBOSU5FCisgICAgdSdcdWZlZDEnICAgIyAgMHgwMGJhIC0+IEFSQUJJQyBMRVRURVIgRkVIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1MDYxYicgICAjICAweDAwYmIgLT4gQVJBQklDIFNFTUlDT0xPTgorICAgIHUnXHVmZWIxJyAgICMgIDB4MDBiYyAtPiBBUkFCSUMgTEVUVEVSIFNFRU4gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWI1JyAgICMgIDB4MDBiZCAtPiBBUkFCSUMgTEVUVEVSIFNIRUVOIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmViOScgICAjICAweDAwYmUgLT4gQVJBQklDIExFVFRFUiBTQUQgSVNPTEFURUQgRk9STQorICAgIHUnXHUwNjFmJyAgICMgIDB4MDBiZiAtPiBBUkFCSUMgUVVFU1RJT04gTUFSSworICAgIHUnXHhhMicgICAgICMgIDB4MDBjMCAtPiBDRU5UIFNJR04KKyAgICB1J1x1ZmU4MCcgICAjICAweDAwYzEgLT4gQVJBQklDIExFVFRFUiBIQU1aQSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlODEnICAgIyAgMHgwMGMyIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU4MycgICAjICAweDAwYzMgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTg1JyAgICMgIDB4MDBjNCAtPiBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVjYScgICAjICAweDAwYzUgLT4gQVJBQklDIExFVFRFUiBBSU4gRklOQUwgRk9STQorICAgIHUnXHVmZThiJyAgICMgIDB4MDBjNiAtPiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFIElOSVRJQUwgRk9STQorICAgIHUnXHVmZThkJyAgICMgIDB4MDBjNyAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZTkxJyAgICMgIDB4MDBjOCAtPiBBUkFCSUMgTEVUVEVSIEJFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmU5MycgICAjICAweDAwYzkgLT4gQVJBQklDIExFVFRFUiBURUggTUFSQlVUQSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlOTcnICAgIyAgMHgwMGNhIC0+IEFSQUJJQyBMRVRURVIgVEVIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZTliJyAgICMgIDB4MDBjYiAtPiBBUkFCSUMgTEVUVEVSIFRIRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlOWYnICAgIyAgMHgwMGNjIC0+IEFSQUJJQyBMRVRURVIgSkVFTSBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVhMycgICAjICAweDAwY2QgLT4gQVJBQklDIExFVFRFUiBIQUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYTcnICAgIyAgMHgwMGNlIC0+IEFSQUJJQyBMRVRURVIgS0hBSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVhOScgICAjICAweDAwY2YgLT4gQVJBQklDIExFVFRFUiBEQUwgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWFiJyAgICMgIDB4MDBkMCAtPiBBUkFCSUMgTEVUVEVSIFRIQUwgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWFkJyAgICMgIDB4MDBkMSAtPiBBUkFCSUMgTEVUVEVSIFJFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYWYnICAgIyAgMHgwMGQyIC0+IEFSQUJJQyBMRVRURVIgWkFJTiBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYjMnICAgIyAgMHgwMGQzIC0+IEFSQUJJQyBMRVRURVIgU0VFTiBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmViNycgICAjICAweDAwZDQgLT4gQVJBQklDIExFVFRFUiBTSEVFTiBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmViYicgICAjICAweDAwZDUgLT4gQVJBQklDIExFVFRFUiBTQUQgSU5JVElBTCBGT1JNCisgICAgdSdcdWZlYmYnICAgIyAgMHgwMGQ2IC0+IEFSQUJJQyBMRVRURVIgREFEIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWMxJyAgICMgIDB4MDBkNyAtPiBBUkFCSUMgTEVUVEVSIFRBSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlYzUnICAgIyAgMHgwMGQ4IC0+IEFSQUJJQyBMRVRURVIgWkFIIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVjYicgICAjICAweDAwZDkgLT4gQVJBQklDIExFVFRFUiBBSU4gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlY2YnICAgIyAgMHgwMGRhIC0+IEFSQUJJQyBMRVRURVIgR0hBSU4gSU5JVElBTCBGT1JNCisgICAgdSdceGE2JyAgICAgIyAgMHgwMGRiIC0+IEJST0tFTiBWRVJUSUNBTCBCQVIKKyAgICB1J1x4YWMnICAgICAjICAweDAwZGMgLT4gTk9UIFNJR04KKyAgICB1J1x4ZjcnICAgICAjICAweDAwZGQgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHhkNycgICAgICMgIDB4MDBkZSAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdcdWZlYzknICAgIyAgMHgwMGRmIC0+IEFSQUJJQyBMRVRURVIgQUlOIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1MDY0MCcgICAjICAweDAwZTAgLT4gQVJBQklDIFRBVFdFRUwKKyAgICB1J1x1ZmVkMycgICAjICAweDAwZTEgLT4gQVJBQklDIExFVFRFUiBGRUggSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZDcnICAgIyAgMHgwMGUyIC0+IEFSQUJJQyBMRVRURVIgUUFGIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWRiJyAgICMgIDB4MDBlMyAtPiBBUkFCSUMgTEVUVEVSIEtBRiBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVkZicgICAjICAweDAwZTQgLT4gQVJBQklDIExFVFRFUiBMQU0gSU5JVElBTCBGT1JNCisgICAgdSdcdWZlZTMnICAgIyAgMHgwMGU1IC0+IEFSQUJJQyBMRVRURVIgTUVFTSBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVlNycgICAjICAweDAwZTYgLT4gQVJBQklDIExFVFRFUiBOT09OIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWViJyAgICMgIDB4MDBlNyAtPiBBUkFCSUMgTEVUVEVSIEhFSCBJTklUSUFMIEZPUk0KKyAgICB1J1x1ZmVlZCcgICAjICAweDAwZTggLT4gQVJBQklDIExFVFRFUiBXQVcgSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWVmJyAgICMgIDB4MDBlOSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZjMnICAgIyAgMHgwMGVhIC0+IEFSQUJJQyBMRVRURVIgWUVIIElOSVRJQUwgRk9STQorICAgIHUnXHVmZWJkJyAgICMgIDB4MDBlYiAtPiBBUkFCSUMgTEVUVEVSIERBRCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlY2MnICAgIyAgMHgwMGVjIC0+IEFSQUJJQyBMRVRURVIgQUlOIE1FRElBTCBGT1JNCisgICAgdSdcdWZlY2UnICAgIyAgMHgwMGVkIC0+IEFSQUJJQyBMRVRURVIgR0hBSU4gRklOQUwgRk9STQorICAgIHUnXHVmZWNkJyAgICMgIDB4MDBlZSAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVlMScgICAjICAweDAwZWYgLT4gQVJBQklDIExFVFRFUiBNRUVNIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmU3ZCcgICAjICAweDAwZjAgLT4gQVJBQklDIFNIQUREQSBNRURJQUwgRk9STQorICAgIHUnXHUwNjUxJyAgICMgIDB4MDBmMSAtPiBBUkFCSUMgU0hBRERBSAorICAgIHUnXHVmZWU1JyAgICMgIDB4MDBmMiAtPiBBUkFCSUMgTEVUVEVSIE5PT04gSVNPTEFURUQgRk9STQorICAgIHUnXHVmZWU5JyAgICMgIDB4MDBmMyAtPiBBUkFCSUMgTEVUVEVSIEhFSCBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZWMnICAgIyAgMHgwMGY0IC0+IEFSQUJJQyBMRVRURVIgSEVIIE1FRElBTCBGT1JNCisgICAgdSdcdWZlZjAnICAgIyAgMHgwMGY1IC0+IEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBIEZJTkFMIEZPUk0KKyAgICB1J1x1ZmVmMicgICAjICAweDAwZjYgLT4gQVJBQklDIExFVFRFUiBZRUggRklOQUwgRk9STQorICAgIHUnXHVmZWQwJyAgICMgIDB4MDBmNyAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOIE1FRElBTCBGT1JNCisgICAgdSdcdWZlZDUnICAgIyAgMHgwMGY4IC0+IEFSQUJJQyBMRVRURVIgUUFGIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVmNScgICAjICAweDAwZjkgLT4gQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZjYnICAgIyAgMHgwMGZhIC0+IEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggTUFEREEgQUJPVkUgRklOQUwgRk9STQorICAgIHUnXHVmZWRkJyAgICMgIDB4MDBmYiAtPiBBUkFCSUMgTEVUVEVSIExBTSBJU09MQVRFRCBGT1JNCisgICAgdSdcdWZlZDknICAgIyAgMHgwMGZjIC0+IEFSQUJJQyBMRVRURVIgS0FGIElTT0xBVEVEIEZPUk0KKyAgICB1J1x1ZmVmMScgICAjICAweDAwZmQgLT4gQVJBQklDIExFVFRFUiBZRUggSVNPTEFURUQgRk9STQorICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x1ZmZmZScgICAjICAweDAwZmYgLT4gVU5ERUZJTkVECispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNjogMHgwMDI2LCAgICAgIyAgQU1QRVJTQU5ECisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFCisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTCisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUworICAgIDB4MDAyYTogMHgwMDJhLCAgICAgIyAgQVNURVJJU0sKKyAgICAweDAwMmI6IDB4MDAyYiwgICAgICMgIFBMVVMgU0lHTgorICAgIDB4MDAyYzogMHgwMDJjLCAgICAgIyAgQ09NTUEKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUworICAgIDB4MDAyZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QCisgICAgMHgwMDJmOiAweDAwMmYsICAgICAjICBTT0xJRFVTCisgICAgMHgwMDMwOiAweDAwMzAsICAgICAjICBESUdJVCBaRVJPCisgICAgMHgwMDMxOiAweDAwMzEsICAgICAjICBESUdJVCBPTkUKKyAgICAweDAwMzI6IDB4MDAzMiwgICAgICMgIERJR0lUIFRXTworICAgIDB4MDAzMzogMHgwMDMzLCAgICAgIyAgRElHSVQgVEhSRUUKKyAgICAweDAwMzQ6IDB4MDAzNCwgICAgICMgIERJR0lUIEZPVVIKKyAgICAweDAwMzU6IDB4MDAzNSwgICAgICMgIERJR0lUIEZJVkUKKyAgICAweDAwMzY6IDB4MDAzNiwgICAgICMgIERJR0lUIFNJWAorICAgIDB4MDAzNzogMHgwMDM3LCAgICAgIyAgRElHSVQgU0VWRU4KKyAgICAweDAwMzg6IDB4MDAzOCwgICAgICMgIERJR0lUIEVJR0hUCisgICAgMHgwMDM5OiAweDAwMzksICAgICAjICBESUdJVCBOSU5FCisgICAgMHgwMDNhOiAweDAwM2EsICAgICAjICBDT0xPTgorICAgIDB4MDAzYjogMHgwMDNiLCAgICAgIyAgU0VNSUNPTE9OCisgICAgMHgwMDNjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTgorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04KKyAgICAweDAwM2U6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOCisgICAgMHgwMDNmOiAweDAwM2YsICAgICAjICBRVUVTVElPTiBNQVJLCisgICAgMHgwMDQwOiAweDAwNDAsICAgICAjICBDT01NRVJDSUFMIEFUCisgICAgMHgwMDQxOiAweDAwNDEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgMHgwMDQyOiAweDAwNDIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgMHgwMDQzOiAweDAwNDMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgMHgwMDQ0OiAweDAwNDQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgMHgwMDQ1OiAweDAwNDUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgMHgwMDQ2OiAweDAwNDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgMHgwMDQ3OiAweDAwNDcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgMHgwMDQ4OiAweDAwNDgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgMHgwMDQ5OiAweDAwNDksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgMHgwMDRhOiAweDAwNGEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgMHgwMDRiOiAweDAwNGIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgMHgwMDRjOiAweDAwNGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgMHgwMDRkOiAweDAwNGQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgMHgwMDRlOiAweDAwNGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgMHgwMDRmOiAweDAwNGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgMHgwMDUwOiAweDAwNTAsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgMHgwMDUxOiAweDAwNTEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgMHgwMDUyOiAweDAwNTIsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgMHgwMDUzOiAweDAwNTMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgMHgwMDU0OiAweDAwNTQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgMHgwMDU1OiAweDAwNTUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDU2OiAweDAwNTYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgMHgwMDU3OiAweDAwNTcsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgMHgwMDU4OiAweDAwNTgsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgMHgwMDU5OiAweDAwNTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgMHgwMDVhOiAweDAwNWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgMHgwMDViOiAweDAwNWIsICAgICAjICBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVjOiAweDAwNWMsICAgICAjICBSRVZFUlNFIFNPTElEVVMKKyAgICAweDAwNWQ6IDB4MDA1ZCwgICAgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgMHgwMDVlOiAweDAwNWUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUKKyAgICAweDAwNjA6IDB4MDA2MCwgICAgICMgIEdSQVZFIEFDQ0VOVAorICAgIDB4MDA2MTogMHgwMDYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICAweDAwNjI6IDB4MDA2MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgMHgwMDYzOiAweDAwNjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIDB4MDA2NDogMHgwMDY0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICAweDAwNjU6IDB4MDA2NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgMHgwMDY2OiAweDAwNjYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIDB4MDA2NzogMHgwMDY3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICAweDAwNjg6IDB4MDA2OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBICisgICAgMHgwMDY5OiAweDAwNjksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIDB4MDA2YTogMHgwMDZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICAweDAwNmI6IDB4MDA2YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgMHgwMDZjOiAweDAwNmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIDB4MDA2ZDogMHgwMDZkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICAweDAwNmU6IDB4MDA2ZSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgMHgwMDZmOiAweDAwNmYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIDB4MDA3MDogMHgwMDcwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICAweDAwNzE6IDB4MDA3MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgMHgwMDcyOiAweDAwNzIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIDB4MDA3MzogMHgwMDczLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICAweDAwNzQ6IDB4MDA3NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgMHgwMDc1OiAweDAwNzUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIDB4MDA3NjogMHgwMDc2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICAweDAwNzc6IDB4MDA3NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgMHgwMDc4OiAweDAwNzgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIDB4MDA3OTogMHgwMDc5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICAweDAwN2E6IDB4MDA3YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgMHgwMDdiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBERUxFVEUKKyAgICAweDAwYTA6IDB4MDBhMCwgICAgICMgIE5PTi1CUkVBS0lORyBTUEFDRQorICAgIDB4MDBhMjogMHgwMGMwLCAgICAgIyAgQ0VOVCBTSUdOCisgICAgMHgwMGEzOiAweDAwYTMsICAgICAjICBQT1VORCBTSUdOCisgICAgMHgwMGE0OiAweDAwYTQsICAgICAjICBDVVJSRU5DWSBTSUdOCisgICAgMHgwMGE2OiAweDAwZGIsICAgICAjICBCUk9LRU4gVkVSVElDQUwgQkFSCisgICAgMHgwMGFiOiAweDAwOTcsICAgICAjICBMRUZUIFBPSU5USU5HIEdVSUxMRU1FVAorICAgIDB4MDBhYzogMHgwMGRjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWQ6IDB4MDBhMSwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGIwOiAweDAwODAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMDkzLCAgICAgIyAgUExVUy1PUi1NSU5VUyBTSUdOCisgICAgMHgwMGI3OiAweDAwODEsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGJiOiAweDAwOTgsICAgICAjICBSSUdIVCBQT0lOVElORyBHVUlMTEVNRVQKKyAgICAweDAwYmM6IDB4MDA5NSwgICAgICMgIEZSQUNUSU9OIDEvNAorICAgIDB4MDBiZDogMHgwMDk0LCAgICAgIyAgRlJBQ1RJT04gMS8yCisgICAgMHgwMGQ3OiAweDAwZGUsICAgICAjICBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgMHgwMGY3OiAweDAwZGQsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwM2IyOiAweDAwOTAsICAgICAjICBHUkVFSyBTTUFMTCBCRVRBCisgICAgMHgwM2M2OiAweDAwOTIsICAgICAjICBHUkVFSyBTTUFMTCBQSEkKKyAgICAweDA2MGM6IDB4MDBhYywgICAgICMgIEFSQUJJQyBDT01NQQorICAgIDB4MDYxYjogMHgwMGJiLCAgICAgIyAgQVJBQklDIFNFTUlDT0xPTgorICAgIDB4MDYxZjogMHgwMGJmLCAgICAgIyAgQVJBQklDIFFVRVNUSU9OIE1BUksKKyAgICAweDA2NDA6IDB4MDBlMCwgICAgICMgIEFSQUJJQyBUQVRXRUVMCisgICAgMHgwNjUxOiAweDAwZjEsICAgICAjICBBUkFCSUMgU0hBRERBSAorICAgIDB4MDY2MDogMHgwMGIwLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFpFUk8KKyAgICAweDA2NjE6IDB4MDBiMSwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUKKyAgICAweDA2NjI6IDB4MDBiMiwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBUV08KKyAgICAweDA2NjM6IDB4MDBiMywgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRQorICAgIDB4MDY2NDogMHgwMGI0LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEZPVVIKKyAgICAweDA2NjU6IDB4MDBiNSwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFCisgICAgMHgwNjY2OiAweDAwYjYsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0lYCisgICAgMHgwNjY3OiAweDAwYjcsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4KKyAgICAweDA2Njg6IDB4MDBiOCwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVAorICAgIDB4MDY2OTogMHgwMGI5LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIE5JTkUKKyAgICAweDA2NmE6IDB4MDAyNSwgICAgICMgIEFSQUJJQyBQRVJDRU5UIFNJR04KKyAgICAweDIyMTk6IDB4MDA4MiwgICAgICMgIEJVTExFVCBPUEVSQVRPUgorICAgIDB4MjIxYTogMHgwMDgzLCAgICAgIyAgU1FVQVJFIFJPT1QKKyAgICAweDIyMWU6IDB4MDA5MSwgICAgICMgIElORklOSVRZCisgICAgMHgyMjQ4OiAweDAwOTYsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDI1MDA6IDB4MDA4NSwgICAgICMgIEZPUk1TIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDA4NiwgICAgICMgIEZPUk1TIExJR0hUIFZFUlRJQ0FMCisgICAgMHgyNTBjOiAweDAwOGQsICAgICAjICBGT1JNUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMDhjLCAgICAgIyAgRk9STVMgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMDhlLCAgICAgIyAgRk9STVMgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgyNTE4OiAweDAwOGYsICAgICAjICBGT1JNUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMDhhLCAgICAgIyAgRk9STVMgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwODgsICAgICAjICBGT1JNUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjUyYzogMHgwMDg5LCAgICAgIyAgRk9STVMgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMDhiLCAgICAgIyAgRk9STVMgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDA4NywgICAgICMgIEZPUk1TIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTkyOiAweDAwODQsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorICAgIDB4ZmU3ZDogMHgwMGYwLCAgICAgIyAgQVJBQklDIFNIQUREQSBNRURJQUwgRk9STQorICAgIDB4ZmU4MDogMHgwMGMxLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQU1aQSBJU09MQVRFRCBGT1JNCisgICAgMHhmZTgxOiAweDAwYzIsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHhmZTgyOiAweDAwYTIsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgMHhmZTgzOiAweDAwYzMsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHhmZTg0OiAweDAwYTUsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgMHhmZTg1OiAweDAwYzQsICAgICAjICBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFIElTT0xBVEVEIEZPUk0KKyAgICAweGZlOGI6IDB4MDBjNiwgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUgSU5JVElBTCBGT1JNCisgICAgMHhmZThkOiAweDAwYzcsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgSVNPTEFURUQgRk9STQorICAgIDB4ZmU4ZTogMHgwMGE4LCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIEZJTkFMIEZPUk0KKyAgICAweGZlOGY6IDB4MDBhOSwgICAgICMgIEFSQUJJQyBMRVRURVIgQkVIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlOTE6IDB4MDBjOCwgICAgICMgIEFSQUJJQyBMRVRURVIgQkVIIElOSVRJQUwgRk9STQorICAgIDB4ZmU5MzogMHgwMGM5LCAgICAgIyAgQVJBQklDIExFVFRFUiBURUggTUFSQlVUQSBJU09MQVRFRCBGT1JNCisgICAgMHhmZTk1OiAweDAwYWEsICAgICAjICBBUkFCSUMgTEVUVEVSIFRFSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZTk3OiAweDAwY2EsICAgICAjICBBUkFCSUMgTEVUVEVSIFRFSCBJTklUSUFMIEZPUk0KKyAgICAweGZlOTk6IDB4MDBhYiwgICAgICMgIEFSQUJJQyBMRVRURVIgVEhFSCBJU09MQVRFRCBGT1JNCisgICAgMHhmZTliOiAweDAwY2IsICAgICAjICBBUkFCSUMgTEVUVEVSIFRIRUggSU5JVElBTCBGT1JNCisgICAgMHhmZTlkOiAweDAwYWQsICAgICAjICBBUkFCSUMgTEVUVEVSIEpFRU0gSVNPTEFURUQgRk9STQorICAgIDB4ZmU5ZjogMHgwMGNjLCAgICAgIyAgQVJBQklDIExFVFRFUiBKRUVNIElOSVRJQUwgRk9STQorICAgIDB4ZmVhMTogMHgwMGFlLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQUggSVNPTEFURUQgRk9STQorICAgIDB4ZmVhMzogMHgwMGNkLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQUggSU5JVElBTCBGT1JNCisgICAgMHhmZWE1OiAweDAwYWYsICAgICAjICBBUkFCSUMgTEVUVEVSIEtIQUggSVNPTEFURUQgRk9STQorICAgIDB4ZmVhNzogMHgwMGNlLCAgICAgIyAgQVJBQklDIExFVFRFUiBLSEFIIElOSVRJQUwgRk9STQorICAgIDB4ZmVhOTogMHgwMGNmLCAgICAgIyAgQVJBQklDIExFVFRFUiBEQUwgSVNPTEFURUQgRk9STQorICAgIDB4ZmVhYjogMHgwMGQwLCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEFMIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYWQ6IDB4MDBkMSwgICAgICMgIEFSQUJJQyBMRVRURVIgUkVIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYWY6IDB4MDBkMiwgICAgICMgIEFSQUJJQyBMRVRURVIgWkFJTiBJU09MQVRFRCBGT1JNCisgICAgMHhmZWIxOiAweDAwYmMsICAgICAjICBBUkFCSUMgTEVUVEVSIFNFRU4gSVNPTEFURUQgRk9STQorICAgIDB4ZmViMzogMHgwMGQzLCAgICAgIyAgQVJBQklDIExFVFRFUiBTRUVOIElOSVRJQUwgRk9STQorICAgIDB4ZmViNTogMHgwMGJkLCAgICAgIyAgQVJBQklDIExFVFRFUiBTSEVFTiBJU09MQVRFRCBGT1JNCisgICAgMHhmZWI3OiAweDAwZDQsICAgICAjICBBUkFCSUMgTEVUVEVSIFNIRUVOIElOSVRJQUwgRk9STQorICAgIDB4ZmViOTogMHgwMGJlLCAgICAgIyAgQVJBQklDIExFVFRFUiBTQUQgSVNPTEFURUQgRk9STQorICAgIDB4ZmViYjogMHgwMGQ1LCAgICAgIyAgQVJBQklDIExFVFRFUiBTQUQgSU5JVElBTCBGT1JNCisgICAgMHhmZWJkOiAweDAwZWIsICAgICAjICBBUkFCSUMgTEVUVEVSIERBRCBJU09MQVRFRCBGT1JNCisgICAgMHhmZWJmOiAweDAwZDYsICAgICAjICBBUkFCSUMgTEVUVEVSIERBRCBJTklUSUFMIEZPUk0KKyAgICAweGZlYzE6IDB4MDBkNywgICAgICMgIEFSQUJJQyBMRVRURVIgVEFIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYzU6IDB4MDBkOCwgICAgICMgIEFSQUJJQyBMRVRURVIgWkFIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlYzk6IDB4MDBkZiwgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOIElTT0xBVEVEIEZPUk0KKyAgICAweGZlY2E6IDB4MDBjNSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOIEZJTkFMIEZPUk0KKyAgICAweGZlY2I6IDB4MDBkOSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOIElOSVRJQUwgRk9STQorICAgIDB4ZmVjYzogMHgwMGVjLCAgICAgIyAgQVJBQklDIExFVFRFUiBBSU4gTUVESUFMIEZPUk0KKyAgICAweGZlY2Q6IDB4MDBlZSwgICAgICMgIEFSQUJJQyBMRVRURVIgR0hBSU4gSVNPTEFURUQgRk9STQorICAgIDB4ZmVjZTogMHgwMGVkLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTiBGSU5BTCBGT1JNCisgICAgMHhmZWNmOiAweDAwZGEsICAgICAjICBBUkFCSUMgTEVUVEVSIEdIQUlOIElOSVRJQUwgRk9STQorICAgIDB4ZmVkMDogMHgwMGY3LCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTiBNRURJQUwgRk9STQorICAgIDB4ZmVkMTogMHgwMGJhLCAgICAgIyAgQVJBQklDIExFVFRFUiBGRUggSVNPTEFURUQgRk9STQorICAgIDB4ZmVkMzogMHgwMGUxLCAgICAgIyAgQVJBQklDIExFVFRFUiBGRUggSU5JVElBTCBGT1JNCisgICAgMHhmZWQ1OiAweDAwZjgsICAgICAjICBBUkFCSUMgTEVUVEVSIFFBRiBJU09MQVRFRCBGT1JNCisgICAgMHhmZWQ3OiAweDAwZTIsICAgICAjICBBUkFCSUMgTEVUVEVSIFFBRiBJTklUSUFMIEZPUk0KKyAgICAweGZlZDk6IDB4MDBmYywgICAgICMgIEFSQUJJQyBMRVRURVIgS0FGIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZGI6IDB4MDBlMywgICAgICMgIEFSQUJJQyBMRVRURVIgS0FGIElOSVRJQUwgRk9STQorICAgIDB4ZmVkZDogMHgwMGZiLCAgICAgIyAgQVJBQklDIExFVFRFUiBMQU0gSVNPTEFURUQgRk9STQorICAgIDB4ZmVkZjogMHgwMGU0LCAgICAgIyAgQVJBQklDIExFVFRFUiBMQU0gSU5JVElBTCBGT1JNCisgICAgMHhmZWUxOiAweDAwZWYsICAgICAjICBBUkFCSUMgTEVUVEVSIE1FRU0gSVNPTEFURUQgRk9STQorICAgIDB4ZmVlMzogMHgwMGU1LCAgICAgIyAgQVJBQklDIExFVFRFUiBNRUVNIElOSVRJQUwgRk9STQorICAgIDB4ZmVlNTogMHgwMGYyLCAgICAgIyAgQVJBQklDIExFVFRFUiBOT09OIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZTc6IDB4MDBlNiwgICAgICMgIEFSQUJJQyBMRVRURVIgTk9PTiBJTklUSUFMIEZPUk0KKyAgICAweGZlZTk6IDB4MDBmMywgICAgICMgIEFSQUJJQyBMRVRURVIgSEVIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZWI6IDB4MDBlNywgICAgICMgIEFSQUJJQyBMRVRURVIgSEVIIElOSVRJQUwgRk9STQorICAgIDB4ZmVlYzogMHgwMGY0LCAgICAgIyAgQVJBQklDIExFVFRFUiBIRUggTUVESUFMIEZPUk0KKyAgICAweGZlZWQ6IDB4MDBlOCwgICAgICMgIEFSQUJJQyBMRVRURVIgV0FXIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZWY6IDB4MDBlOSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZjA6IDB4MDBmNSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBIEZJTkFMIEZPUk0KKyAgICAweGZlZjE6IDB4MDBmZCwgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIElTT0xBVEVEIEZPUk0KKyAgICAweGZlZjI6IDB4MDBmNiwgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIEZJTkFMIEZPUk0KKyAgICAweGZlZjM6IDB4MDBlYSwgICAgICMgIEFSQUJJQyBMRVRURVIgWUVIIElOSVRJQUwgRk9STQorICAgIDB4ZmVmNTogMHgwMGY5LCAgICAgIyAgQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBNQUREQSBBQk9WRSBJU09MQVRFRCBGT1JNCisgICAgMHhmZWY2OiAweDAwZmEsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBXSVRIIE1BRERBIEFCT1ZFIEZJTkFMIEZPUk0KKyAgICAweGZlZjc6IDB4MDA5OSwgICAgICMgIEFSQUJJQyBMSUdBVFVSRSBMQU0gV0lUSCBBTEVGIFdJVEggSEFNWkEgQUJPVkUgSVNPTEFURUQgRk9STQorICAgIDB4ZmVmODogMHgwMDlhLCAgICAgIyAgQVJBQklDIExJR0FUVVJFIExBTSBXSVRIIEFMRUYgV0lUSCBIQU1aQSBBQk9WRSBGSU5BTCBGT1JNCisgICAgMHhmZWZiOiAweDAwOWQsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBJU09MQVRFRCBGT1JNCisgICAgMHhmZWZjOiAweDAwOWUsICAgICAjICBBUkFCSUMgTElHQVRVUkUgTEFNIFdJVEggQUxFRiBGSU5BTCBGT1JNCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1ZmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1ZmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZjQ1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2NS5weQpAQCAtMCwwICsxLDY5OCBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnVkVORE9SUy9NSUNTRlQvUEMvQ1A4NjUuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg2NScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworIyMjIERlY29kaW5nIE1hcAorCitkZWNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9pZGVudGl0eV9kaWN0KHJhbmdlKDI1NikpCitkZWNvZGluZ19tYXAudXBkYXRlKHsKKyAgICAweDAwODA6IDB4MDBjNywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDgxOiAweDAwZmMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4MjogMHgwMGU5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4MzogMHgwMGUyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMDg0OiAweDAwZTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDA4NTogMHgwMGUwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDA4NjogMHgwMGU1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMDg3OiAweDAwZTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODg6IDB4MDBlYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA4OTogMHgwMGViLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGE6IDB4MDBlOCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAweDAwOGI6IDB4MDBlZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhjOiAweDAwZWUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOGQ6IDB4MDBlYywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICAweDAwOGU6IDB4MDBjNCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOGY6IDB4MDBjNSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMDkwOiAweDAwYzksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwOTE6IDB4MDBlNiwgICAgICMgIExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgMHgwMDkyOiAweDAwYzYsICAgICAjICBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIEFFCisgICAgMHgwMDkzOiAweDAwZjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTQ6IDB4MDBmNiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk1OiAweDAwZjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMDk2OiAweDAwZmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTc6IDB4MDBmOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwOTg6IDB4MDBmZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk5OiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDlhOiAweDAwZGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDliOiAweDAwZjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwMGQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDA5ZTogMHgyMGE3LCAgICAgIyAgUEVTRVRBIFNJR04KKyAgICAweDAwOWY6IDB4MDE5MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDBhMDogMHgwMGUxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBhMTogMHgwMGVkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIDB4MDBhMjogMHgwMGYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIDB4MDBhMzogMHgwMGZhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBhNDogMHgwMGYxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBhNTogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGE2OiAweDAwYWEsICAgICAjICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIDB4MDBhNzogMHgwMGJhLCAgICAgIyAgTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgMHgwMGE4OiAweDAwYmYsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGE5OiAweDIzMTAsICAgICAjICBSRVZFUlNFRCBOT1QgU0lHTgorICAgIDB4MDBhYTogMHgwMGFjLCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMGJjLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgMHgwMGFkOiAweDAwYTEsICAgICAjICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMGFlOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhZjogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBiMDogMHgyNTkxLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDAwYjE6IDB4MjU5MiwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MDBiMjogMHgyNTkzLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MDBiMzogMHgyNTAyLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgMHgwMGI0OiAweDI1MjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDAwYjU6IDB4MjU2MSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI2OiAweDI1NjIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiNzogMHgyNTU2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiODogMHgyNTU1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDI1NWMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MDBiZTogMHgyNTViLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYmY6IDB4MjUxMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgMHgwMGMwOiAweDI1MTQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgMHgwMGMxOiAweDI1MzQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzI6IDB4MjUyYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGMzOiAweDI1MWMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGM0OiAweDI1MDAsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIDB4MDBjNTogMHgyNTNjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGM2OiAweDI1NWUsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwYzc6IDB4MjU1ZiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBjODogMHgyNTVhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICAweDAwYzk6IDB4MjU1NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwY2E6IDB4MjU2OSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2I6IDB4MjU2NiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYzogMHgyNTYwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwY2Q6IDB4MjU1MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MDBjZTogMHgyNTZjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjZjogMHgyNTY3LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDA6IDB4MjU2OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQxOiAweDI1NjQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgwMGQyOiAweDI1NjUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQzOiAweDI1NTksICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDQ6IDB4MjU1OCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNTogMHgyNTUyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDAwZDY6IDB4MjU1MywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGQ3OiAweDI1NmIsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MDBkODogMHgyNTZhLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDI1OGMsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGU6IDB4MjU5MCwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDAwZGY6IDB4MjU4MCwgICAgICMgIFVQUEVSIEhBTEYgQkxPQ0sKKyAgICAweDAwZTA6IDB4MDNiMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDBlMTogMHgwMGRmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAweDAwZTI6IDB4MDM5MywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgMHgwMGUzOiAweDAzYzAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAwZTQ6IDB4MDNhMywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwMGU1OiAweDAzYzMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICAweDAwZTY6IDB4MDBiNSwgICAgICMgIE1JQ1JPIFNJR04KKyAgICAweDAwZTc6IDB4MDNjNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUQVUKKyAgICAweDAwZTg6IDB4MDNhNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDBlOTogMHgwMzk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAwZWE6IDB4MDNhOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwMGViOiAweDAzYjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAwZWM6IDB4MjIxZSwgICAgICMgIElORklOSVRZCisgICAgMHgwMGVkOiAweDAzYzYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgMHgwMGVlOiAweDAzYjUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDBlZjogMHgyMjI5LCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgwMGYwOiAweDIyNjEsICAgICAjICBJREVOVElDQUwgVE8KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgyMjY1LCAgICAgIyAgR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgwMGYzOiAweDIyNjQsICAgICAjICBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDAwZjQ6IDB4MjMyMCwgICAgICMgIFRPUCBIQUxGIElOVEVHUkFMCisgICAgMHgwMGY1OiAweDIzMjEsICAgICAjICBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIDB4MDBmNjogMHgwMGY3LCAgICAgIyAgRElWSVNJT04gU0lHTgorICAgIDB4MDBmNzogMHgyMjQ4LCAgICAgIyAgQUxNT1NUIEVRVUFMIFRPCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgyMjE5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgwMGZhOiAweDAwYjcsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGZiOiAweDIyMWEsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MDBmYzogMHgyMDdmLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwZmQ6IDB4MDBiMiwgICAgICMgIFNVUEVSU0NSSVBUIFRXTworICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x4YzcnICAgICAjICAweDAwODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZmMnICAgICAjICAweDAwODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTknICAgICAjICAweDAwODIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDAwODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTAnICAgICAjICAweDAwODUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlNScgICAgICMgIDB4MDA4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDAwODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGVhJyAgICAgIyAgMHgwMDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4MDA4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlOCcgICAgICMgIDB4MDA4YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVmJyAgICAgIyAgMHgwMDhiIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVlJyAgICAgIyAgMHgwMDhjIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYycgICAgICMgIDB4MDA4ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGM0JyAgICAgIyAgMHgwMDhlIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDAwOGYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzknICAgICAjICAweDAwOTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU2JyAgICAgIyAgMHgwMDkxIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEFFCisgICAgdSdceGM2JyAgICAgIyAgMHgwMDkyIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgQUUKKyAgICB1J1x4ZjQnICAgICAjICAweDAwOTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHgwMDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYyJyAgICAgIyAgMHgwMDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZmInICAgICAjICAweDAwOTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY5JyAgICAgIyAgMHgwMDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmYnICAgICAjICAweDAwOTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDYnICAgICAjICAweDAwOTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4MDA5YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY4JyAgICAgIyAgMHgwMDliIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGEzJyAgICAgIyAgMHgwMDljIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4ZDgnICAgICAjICAweDAwOWQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUyMGE3JyAgICMgIDB4MDA5ZSAtPiBQRVNFVEEgU0lHTgorICAgIHUnXHUwMTkyJyAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x4ZTEnICAgICAjICAweDAwYTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlZCcgICAgICMgIDB4MDBhMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGYzJyAgICAgIyAgMHgwMGEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZmEnICAgICAjICAweDAwYTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmMScgICAgICMgIDB4MDBhNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQxJyAgICAgIyAgMHgwMGE1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhhYScgICAgICMgIDB4MDBhNiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4MDBhNyAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmYnICAgICAjICAweDAwYTggLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHUyMzEwJyAgICMgIDB4MDBhOSAtPiBSRVZFUlNFRCBOT1QgU0lHTgorICAgIHUnXHhhYycgICAgICMgIDB4MDBhYSAtPiBOT1QgU0lHTgorICAgIHUnXHhiZCcgICAgICMgIDB4MDBhYiAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmMnICAgICAjICAweDAwYWMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGExJyAgICAgIyAgMHgwMGFkIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YTQnICAgICAjICAweDAwYWYgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjEnICAgIyAgMHgwMGI1IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjInICAgIyAgMHgwMGI2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTYnICAgIyAgMHgwMGI3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NScgICAjICAweDAwYjggLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1YycgICAjICAweDAwYmQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1YicgICAjICAweDAwYmUgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU1ZScgICAjICAweDAwYzYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHgwMGM3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjcnICAgIyAgMHgwMGNmIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHgwMGQwIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjQnICAgIyAgMHgwMGQxIC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2NScgICAjICAweDAwZDIgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4MDBkMyAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1OCcgICAjICAweDAwZDQgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTInICAgIyAgMHgwMGQ1IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTMnICAgIyAgMHgwMGQ2IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NmInICAgIyAgMHgwMGQ3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NmEnICAgIyAgMHgwMGQ4IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHgwMGRkIC0+IExFRlQgSEFMRiBCTE9DSworICAgIHUnXHUyNTkwJyAgICMgIDB4MDBkZSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDNiMScgICAjICAweDAwZTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdceGRmJyAgICAgIyAgMHgwMGUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdcdTAzOTMnICAgIyAgMHgwMGUyIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzYzAnICAgIyAgMHgwMGUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2EzJyAgICMgIDB4MDBlNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2MzJyAgICMgIDB4MDBlNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgU0lHTUEKKyAgICB1J1x4YjUnICAgICAjICAweDAwZTYgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUwM2M0JyAgICMgIDB4MDBlNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTYnICAgIyAgMHgwMGU4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwMzk4JyAgICMgIDB4MDBlOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2E5JyAgICMgIDB4MDBlYSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2I0JyAgICMgIDB4MDBlYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MjIxZScgICAjICAweDAwZWMgLT4gSU5GSU5JVFkKKyAgICB1J1x1MDNjNicgICAjICAweDAwZWQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2I1JyAgICMgIDB4MDBlZSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUyMjI5JyAgICMgIDB4MDBlZiAtPiBJTlRFUlNFQ1RJT04KKyAgICB1J1x1MjI2MScgICAjICAweDAwZjAgLT4gSURFTlRJQ0FMIFRPCisgICAgdSdceGIxJyAgICAgIyAgMHgwMGYxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY1JyAgICMgIDB4MDBmMiAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NCcgICAjICAweDAwZjMgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIzMjAnICAgIyAgMHgwMGY0IC0+IFRPUCBIQUxGIElOVEVHUkFMCisgICAgdSdcdTIzMjEnICAgIyAgMHgwMGY1IC0+IEJPVFRPTSBIQUxGIElOVEVHUkFMCisgICAgdSdceGY3JyAgICAgIyAgMHgwMGY2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjI0OCcgICAjICAweDAwZjcgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHgwMGY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIyMWEnICAgIyAgMHgwMGZiIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIwN2YnICAgIyAgMHgwMGZjIC0+IFNVUEVSU0NSSVBUIExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdceGIyJyAgICAgIyAgMHgwMGZkIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhMTogMHgwMGFkLCAgICAgIyAgSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNDogMHgwMGFmLCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBhYTogMHgwMGE2LCAgICAgIyAgRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYWI6IDB4MDBhZSwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFjOiAweDAwYWEsICAgICAjICBOT1QgU0lHTgorICAgIDB4MDBiMDogMHgwMGY4LCAgICAgIyAgREVHUkVFIFNJR04KKyAgICAweDAwYjE6IDB4MDBmMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBiMjogMHgwMGZkLCAgICAgIyAgU1VQRVJTQ1JJUFQgVFdPCisgICAgMHgwMGI1OiAweDAwZTYsICAgICAjICBNSUNSTyBTSUdOCisgICAgMHgwMGI3OiAweDAwZmEsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGJhOiAweDAwYTcsICAgICAjICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAweDAwYmM6IDB4MDBhYywgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIDB4MDBiZDogMHgwMGFiLCAgICAgIyAgVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgMHgwMGJmOiAweDAwYTgsICAgICAjICBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgMHgwMGM0OiAweDAwOGUsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGM1OiAweDAwOGYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIDB4MDBjNjogMHgwMDkyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBBRQorICAgIDB4MDBjNzogMHgwMDgwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwYzk6IDB4MDA5MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDBkMTogMHgwMGE1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGQ2OiAweDAwOTksICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGQ4OiAweDAwOWQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgMHgwMGRjOiAweDAwOWEsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGRmOiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIDB4MDBlMDogMHgwMDg1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMTogMHgwMGEwLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDgzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGU0OiAweDAwODQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlNTogMHgwMDg2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgMHgwMGU2OiAweDAwOTEsICAgICAjICBMQVRJTiBTTUFMTCBMSUdBVFVSRSBBRQorICAgIDB4MDBlNzogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU4OiAweDAwOGEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGU5OiAweDAwODIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwODgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWI6IDB4MDA4OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGVjOiAweDAwOGQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgMHgwMGVkOiAweDAwYTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGVlOiAweDAwOGMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWY6IDB4MDA4YiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGYxOiAweDAwYTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGYyOiAweDAwOTUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgMHgwMGYzOiAweDAwYTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY0OiAweDAwOTMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZjY6IDB4MDA5NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwZjYsICAgICAjICBESVZJU0lPTiBTSUdOCisgICAgMHgwMGY4OiAweDAwOWIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIDB4MDBmOTogMHgwMDk3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIDB4MDBmYTogMHgwMGEzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIDB4MDBmYjogMHgwMDk2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGZjOiAweDAwODEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBmZjogMHgwMDk4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICAweDAxOTI6IDB4MDA5ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIDB4MDM5MzogMHgwMGUyLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAzOTg6IDB4MDBlOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwM2EzOiAweDAwZTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIDB4MDNhNjogMHgwMGU4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgMHgwM2E5OiAweDAwZWEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIDB4MDNiMTogMHgwMGUwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgMHgwM2I0OiAweDAwZWIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAzYjU6IDB4MDBlZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwM2MwOiAweDAwZTMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAzYzM6IDB4MDBlNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDNjNDogMHgwMGU3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDNjNjogMHgwMGVkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIDB4MjA3ZjogMHgwMGZjLCAgICAgIyAgU1VQRVJTQ1JJUFQgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDIwYTc6IDB4MDA5ZSwgICAgICMgIFBFU0VUQSBTSUdOCisgICAgMHgyMjE5OiAweDAwZjksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDIyMWE6IDB4MDBmYiwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgyMjFlOiAweDAwZWMsICAgICAjICBJTkZJTklUWQorICAgIDB4MjIyOTogMHgwMGVmLCAgICAgIyAgSU5URVJTRUNUSU9OCisgICAgMHgyMjQ4OiAweDAwZjcsICAgICAjICBBTE1PU1QgRVFVQUwgVE8KKyAgICAweDIyNjE6IDB4MDBmMCwgICAgICMgIElERU5USUNBTCBUTworICAgIDB4MjI2NDogMHgwMGYzLCAgICAgIyAgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgMHgyMjY1OiAweDAwZjIsICAgICAjICBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICAweDIzMTA6IDB4MDBhOSwgICAgICMgIFJFVkVSU0VEIE5PVCBTSUdOCisgICAgMHgyMzIwOiAweDAwZjQsICAgICAjICBUT1AgSEFMRiBJTlRFR1JBTAorICAgIDB4MjMyMTogMHgwMGY1LCAgICAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1MjogMHgwMGQ1LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NTM6IDB4MDBkNiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTU0OiAweDAwYzksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTU1OiAweDAwYjgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTU2OiAweDAwYjcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTU3OiAweDAwYmIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDI1NTg6IDB4MDBkNCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1OTogMHgwMGQzLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1YjogMHgwMGJlLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NWM6IDB4MDBiZCwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTVkOiAweDAwYmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgyNTVlOiAweDAwYzYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICAweDI1NWY6IDB4MDBjNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjE6IDB4MDBiNSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgyNTYyOiAweDAwYjYsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIDB4MjU2MzogMHgwMGI5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MjU2NDogMHgwMGQxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2NTogMHgwMGQyLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2NjogMHgwMGNiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTY3OiAweDAwY2YsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MjU2ODogMHgwMGQwLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDI1Njk6IDB4MDBjYSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NmE6IDB4MDBkOCwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTZiOiAweDAwZDcsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU4YzogMHgwMGRkLCAgICAgIyAgTEVGVCBIQUxGIEJMT0NLCisgICAgMHgyNTkwOiAweDAwZGUsICAgICAjICBSSUdIVCBIQUxGIEJMT0NLCisgICAgMHgyNTkxOiAweDAwYjAsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MjU5MjogMHgwMGIxLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgyNTkzOiAweDAwYjIsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgyNWEwOiAweDAwZmUsICAgICAjICBCTEFDSyBTUVVBUkUKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY1LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDZlY2UzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY1LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDZlY2UzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY2LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjljZDg1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY2LnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL01JQ1NGVC9QQy9DUDg2Ni5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwODY2JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgIDB4MDA4MDogMHgwNDEwLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA4MTogMHgwNDExLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICAweDAwODI6IDB4MDQxMiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgMHgwMDgzOiAweDA0MTMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICAweDAwODQ6IDB4MDQxNCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgMHgwMDg1OiAweDA0MTUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgIDB4MDA4NjogMHgwNDE2LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgMHgwMDg3OiAweDA0MTcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIDB4MDA4ODogMHgwNDE4LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA4OTogMHgwNDE5LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIDB4MDA4YTogMHgwNDFhLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICAweDAwOGI6IDB4MDQxYiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgMHgwMDhjOiAweDA0MWMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIDB4MDA4ZDogMHgwNDFkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICAweDAwOGU6IDB4MDQxZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwOGY6IDB4MDQxZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgMHgwMDkwOiAweDA0MjAsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgIDB4MDA5MTogMHgwNDIxLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICAweDAwOTI6IDB4MDQyMiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgMHgwMDkzOiAweDA0MjMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwMDk0OiAweDA0MjQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIDB4MDA5NTogMHgwNDI1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICAweDAwOTY6IDB4MDQyNiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIDB4MDA5NzogMHgwNDI3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgMHgwMDk4OiAweDA0MjgsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKyAgICAweDAwOTk6IDB4MDQyOSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgMHgwMDlhOiAweDA0MmEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKyAgICAweDAwOWI6IDB4MDQyYiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICAweDAwOWM6IDB4MDQyYywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIDB4MDA5ZDogMHgwNDJkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA5ZTogMHgwNDJlLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICAweDAwOWY6IDB4MDQyZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgMHgwMGEwOiAweDA0MzAsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorICAgIDB4MDBhMTogMHgwNDMxLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisgICAgMHgwMGEyOiAweDA0MzIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICAweDAwYTM6IDB4MDQzMywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKyAgICAweDAwYTQ6IDB4MDQzNCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgIDB4MDBhNTogMHgwNDM1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgMHgwMGE2OiAweDA0MzYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisgICAgMHgwMGE3OiAweDA0MzcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKyAgICAweDAwYTg6IDB4MDQzOCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMGE5OiAweDA0MzksICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorICAgIDB4MDBhYTogMHgwNDNhLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgMHgwMGFiOiAweDA0M2IsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICAweDAwYWM6IDB4MDQzYywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorICAgIDB4MDBhZDogMHgwNDNkLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgMHgwMGFlOiAweDA0M2UsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIDB4MDBhZjogMHgwNDNmLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgMHgwMGIwOiAweDI1OTEsICAgICAjICBMSUdIVCBTSEFERQorICAgIDB4MDBiMTogMHgyNTkyLCAgICAgIyAgTUVESVVNIFNIQURFCisgICAgMHgwMGIyOiAweDI1OTMsICAgICAjICBEQVJLIFNIQURFCisgICAgMHgwMGIzOiAweDI1MDIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDAwYjQ6IDB4MjUyNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiNTogMHgyNTYxLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDAwYjY6IDB4MjU2MiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI3OiAweDI1NTYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGI4OiAweDI1NTUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgMHgwMGI5OiAweDI1NjMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGJhOiAweDI1NTEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgwMGJiOiAweDI1NTcsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKyAgICAweDAwYmM6IDB4MjU1ZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDAwYmQ6IDB4MjU1YywgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgwMGJlOiAweDI1NWIsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MjU1ZSwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBjNzogMHgyNTVmLCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgwMGM4OiAweDI1NWEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MDBjOTogMHgyNTU0LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MDBjYTogMHgyNTY5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjYjogMHgyNTY2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNjOiAweDI1NjAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MDBjZDogMHgyNTUwLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgwMGNlOiAweDI1NmMsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNmOiAweDI1NjcsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkMDogMHgyNTY4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDE6IDB4MjU2NCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDAwZDI6IDB4MjU2NSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKyAgICAweDAwZDM6IDB4MjU1OSwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIDB4MDBkNDogMHgyNTU4LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgwMGQ1OiAweDI1NTIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MDBkNjogMHgyNTUzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDAwZDc6IDB4MjU2YiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgwMGQ4OiAweDI1NmEsICAgICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIDB4MDBkOTogMHgyNTE4LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgwMGRhOiAweDI1MGMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICAweDAwZGI6IDB4MjU4OCwgICAgICMgIEZVTEwgQkxPQ0sKKyAgICAweDAwZGM6IDB4MjU4NCwgICAgICMgIExPV0VSIEhBTEYgQkxPQ0sKKyAgICAweDAwZGQ6IDB4MjU4YywgICAgICMgIExFRlQgSEFMRiBCTE9DSworICAgIDB4MDBkZTogMHgyNTkwLCAgICAgIyAgUklHSFQgSEFMRiBCTE9DSworICAgIDB4MDBkZjogMHgyNTgwLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MDBlMDogMHgwNDQwLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgMHgwMGUxOiAweDA0NDEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMKKyAgICAweDAwZTI6IDB4MDQ0MiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBURQorICAgIDB4MDBlMzogMHgwNDQzLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICAweDAwZTQ6IDB4MDQ0NCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIDB4MDBlNTogMHgwNDQ1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgMHgwMGU2OiAweDA0NDYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgMHgwMGU3OiAweDA0NDcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgMHgwMGU4OiAweDA0NDgsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgMHgwMGU5OiAweDA0NDksICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICAweDAwZWE6IDB4MDQ0YSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICAweDAwZWI6IDB4MDQ0YiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgMHgwMGVjOiAweDA0NGMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgMHgwMGVkOiAweDA0NGQsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIDB4MDBlZTogMHgwNDRlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisgICAgMHgwMGVmOiAweDA0NGYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKyAgICAweDAwZjA6IDB4MDQwMSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgMHgwMGYxOiAweDA0NTEsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSU8KKyAgICAweDAwZjI6IDB4MDQwNCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIDB4MDBmMzogMHgwNDU0LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIDB4MDBmNDogMHgwNDA3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkKKyAgICAweDAwZjU6IDB4MDQ1NywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZSQorICAgIDB4MDBmNjogMHgwNDBlLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIDB4MDBmNzogMHgwNDVlLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKyAgICAweDAwZjg6IDB4MDBiMCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGY5OiAweDIyMTksICAgICAjICBCVUxMRVQgT1BFUkFUT1IKKyAgICAweDAwZmE6IDB4MDBiNywgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwZmI6IDB4MjIxYSwgICAgICMgIFNRVUFSRSBST09UCisgICAgMHgwMGZjOiAweDIxMTYsICAgICAjICBOVU1FUk8gU0lHTgorICAgIDB4MDBmZDogMHgwMGE0LCAgICAgIyAgQ1VSUkVOQ1kgU0lHTgorICAgIDB4MDBmZTogMHgyNWEwLCAgICAgIyAgQkxBQ0sgU1FVQVJFCisgICAgMHgwMGZmOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRQorfSkKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDAwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDAwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwMDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDAwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwMDBhIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MDAwYiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwMDBjIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MDAwZCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwMDBmIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgwMDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgwMDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MDAxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MDAxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgwMDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgwMDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MDAxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MDAxYSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgwMDFiIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MDAxYyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MDAxZCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MDAxZiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MDAyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MDAyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgwMDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgwMDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgwMDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgwMDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MDAyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDAwMjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MDAyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgwMDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgwMDJhIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgwMDJiIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MDAyYyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBERUxFVEUKKyAgICB1J1x1MDQxMCcgICAjICAweDAwODAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnXHUwNDExJyAgICMgIDB4MDA4MSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorICAgIHUnXHUwNDEyJyAgICMgIDB4MDA4MiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIHUnXHUwNDEzJyAgICMgIDB4MDA4MyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICB1J1x1MDQxNCcgICAjICAweDAwODQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICB1J1x1MDQxNScgICAjICAweDAwODUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICB1J1x1MDQxNicgICAjICAweDAwODYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MTcnICAgIyAgMHgwMDg3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisgICAgdSdcdTA0MTgnICAgIyAgMHgwMDg4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J1x1MDQxOScgICAjICAweDAwODkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDFhJyAgICMgIDB4MDA4YSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorICAgIHUnXHUwNDFiJyAgICMgIDB4MDA4YiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTAorICAgIHUnXHUwNDFjJyAgICMgIDB4MDA4YyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIHUnXHUwNDFkJyAgICMgIDB4MDA4ZCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIHUnXHUwNDFlJyAgICMgIDB4MDA4ZSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdcdTA0MWYnICAgIyAgMHgwMDhmIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgdSdcdTA0MjAnICAgIyAgMHgwMDkwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSCisgICAgdSdcdTA0MjEnICAgIyAgMHgwMDkxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgdSdcdTA0MjInICAgIyAgMHgwMDkyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgdSdcdTA0MjMnICAgIyAgMHgwMDkzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1x1MDQyNCcgICAjICAweDAwOTQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUYKKyAgICB1J1x1MDQyNScgICAjICAweDAwOTUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICB1J1x1MDQyNicgICAjICAweDAwOTYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisgICAgdSdcdTA0MjcnICAgIyAgMHgwMDk3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIENIRQorICAgIHUnXHUwNDI4JyAgICMgIDB4MDA5OCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQyOScgICAjICAweDAwOTkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQyYScgICAjICAweDAwOWEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCisgICAgdSdcdTA0MmInICAgIyAgMHgwMDliIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQyYycgICAjICAweDAwOWMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0MmQnICAgIyAgMHgwMDlkIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J1x1MDQyZScgICAjICAweDAwOWUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICB1J1x1MDQyZicgICAjICAweDAwOWYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKyAgICB1J1x1MDQzMCcgICAjICAweDAwYTAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICB1J1x1MDQzMScgICAjICAweDAwYTEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisgICAgdSdcdTA0MzInICAgIyAgMHgwMGEyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBWRQorICAgIHUnXHUwNDMzJyAgICMgIDB4MDBhMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MzQnICAgIyAgMHgwMGE0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgIHUnXHUwNDM1JyAgICMgIDB4MDBhNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKyAgICB1J1x1MDQzNicgICAjICAweDAwYTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDM3JyAgICMgIDB4MDBhNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKyAgICB1J1x1MDQzOCcgICAjICAweDAwYTggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKyAgICB1J1x1MDQzOScgICAjICAweDAwYTkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQzYScgICAjICAweDAwYWEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgdSdcdTA0M2InICAgIyAgMHgwMGFiIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorICAgIHUnXHUwNDNjJyAgICMgIDB4MDBhYyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICB1J1x1MDQzZCcgICAjICAweDAwYWQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgdSdcdTA0M2UnICAgIyAgMHgwMGFlIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBPCisgICAgdSdcdTA0M2YnICAgIyAgMHgwMGFmIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIHUnXHUyNTkxJyAgICMgIDB4MDBiMCAtPiBMSUdIVCBTSEFERQorICAgIHUnXHUyNTkyJyAgICMgIDB4MDBiMSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDAwYjIgLT4gREFSSyBTSEFERQorICAgIHUnXHUyNTAyJyAgICMgIDB4MDBiMyAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICB1J1x1MjUyNCcgICAjICAweDAwYjQgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjEnICAgIyAgMHgwMGI1IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NjInICAgIyAgMHgwMGI2IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NTYnICAgIyAgMHgwMGI3IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1NScgICAjICAweDAwYjggLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTYzJyAgICMgIDB4MDBiOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NTEnICAgIyAgMHgwMGJhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwKKyAgICB1J1x1MjU1NycgICAjICAweDAwYmIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NWQnICAgIyAgMHgwMGJjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1YycgICAjICAweDAwYmQgLT4gQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICB1J1x1MjU1YicgICAjICAweDAwYmUgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU1ZScgICAjICAweDAwYzYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHgwMGM3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4MDBjOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTU0JyAgICMgIDB4MDBjOSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1NjknICAgIyAgMHgwMGNhIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NicgICAjICAweDAwY2IgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjAnICAgIyAgMHgwMGNjIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NTAnICAgIyAgMHgwMGNkIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZjJyAgICMgIDB4MDBjZSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NjcnICAgIyAgMHgwMGNmIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHgwMGQwIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjQnICAgIyAgMHgwMGQxIC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2NScgICAjICAweDAwZDIgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTU5JyAgICMgIDB4MDBkMyAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1OCcgICAjICAweDAwZDQgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTInICAgIyAgMHgwMGQ1IC0+IEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTMnICAgIyAgMHgwMGQ2IC0+IEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NmInICAgIyAgMHgwMGQ3IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NmEnICAgIyAgMHgwMGQ4IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1MTgnICAgIyAgMHgwMGQ5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTBjJyAgICMgIDB4MDBkYSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU4OCcgICAjICAweDAwZGIgLT4gRlVMTCBCTE9DSworICAgIHUnXHUyNTg0JyAgICMgIDB4MDBkYyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHgwMGRkIC0+IExFRlQgSEFMRiBCTE9DSworICAgIHUnXHUyNTkwJyAgICMgIDB4MDBkZSAtPiBSSUdIVCBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODAnICAgIyAgMHgwMGRmIC0+IFVQUEVSIEhBTEYgQkxPQ0sKKyAgICB1J1x1MDQ0MCcgICAjICAweDAwZTAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisgICAgdSdcdTA0NDEnICAgIyAgMHgwMGUxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgIHUnXHUwNDQyJyAgICMgIDB4MDBlMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKyAgICB1J1x1MDQ0MycgICAjICAweDAwZTMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKyAgICB1J1x1MDQ0NCcgICAjICAweDAwZTQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisgICAgdSdcdTA0NDUnICAgIyAgMHgwMGU1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQQorICAgIHUnXHUwNDQ2JyAgICMgIDB4MDBlNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgdSdcdTA0NDcnICAgIyAgMHgwMGU3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQ0OCcgICAjICAweDAwZTggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDQ5JyAgICMgIDB4MDBlOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQ0YScgICAjICAweDAwZWEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDRiJyAgICMgIDB4MDBlYiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDRjJyAgICMgIDB4MDBlYyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0NGQnICAgIyAgMHgwMGVkIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFCisgICAgdSdcdTA0NGUnICAgIyAgMHgwMGVlIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIHUnXHUwNDRmJyAgICMgIDB4MDBlZiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKyAgICB1J1x1MDQwMScgICAjICAweDAwZjAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICB1J1x1MDQ1MScgICAjICAweDAwZjEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgdSdcdTA0MDQnICAgIyAgMHgwMGYyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFVLUkFJTklBTiBJRQorICAgIHUnXHUwNDU0JyAgICMgIDB4MDBmMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTA0MDcnICAgIyAgMHgwMGY0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlJCisgICAgdSdcdTA0NTcnICAgIyAgMHgwMGY1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZSQorICAgIHUnXHUwNDBlJyAgICMgIDB4MDBmNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBVCisgICAgdSdcdTA0NWUnICAgIyAgMHgwMGY3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisgICAgdSdceGIwJyAgICAgIyAgMHgwMGY4IC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTIyMTknICAgIyAgMHgwMGY5IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHhiNycgICAgICMgIDB4MDBmYSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIyMWEnICAgIyAgMHgwMGZiIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTIxMTYnICAgIyAgMHgwMGZjIC0+IE5VTUVSTyBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHgwMGZkIC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1MjVhMCcgICAjICAweDAwZmUgLT4gQkxBQ0sgU1FVQVJFCisgICAgdSdceGEwJyAgICAgIyAgMHgwMGZmIC0+IE5PLUJSRUFLIFNQQUNFCispCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0geworICAgIDB4MDAwMDogMHgwMDAwLCAgICAgIyAgTlVMTAorICAgIDB4MDAwMTogMHgwMDAxLCAgICAgIyAgU1RBUlQgT0YgSEVBRElORworICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgU1RBUlQgT0YgVEVYVAorICAgIDB4MDAwMzogMHgwMDAzLCAgICAgIyAgRU5EIE9GIFRFWFQKKyAgICAweDAwMDQ6IDB4MDAwNCwgICAgICMgIEVORCBPRiBUUkFOU01JU1NJT04KKyAgICAweDAwMDU6IDB4MDAwNSwgICAgICMgIEVOUVVJUlkKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIEFDS05PV0xFREdFCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBCRUxMCisgICAgMHgwMDA4OiAweDAwMDgsICAgICAjICBCQUNLU1BBQ0UKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIDB4MDAwYTogMHgwMDBhLCAgICAgIyAgTElORSBGRUVECisgICAgMHgwMDBiOiAweDAwMGIsICAgICAjICBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBjOiAweDAwMGMsICAgICAjICBGT1JNIEZFRUQKKyAgICAweDAwMGQ6IDB4MDAwZCwgICAgICMgIENBUlJJQUdFIFJFVFVSTgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgU0hJRlQgT1VUCisgICAgMHgwMDBmOiAweDAwMGYsICAgICAjICBTSElGVCBJTgorICAgIDB4MDAxMDogMHgwMDEwLCAgICAgIyAgREFUQSBMSU5LIEVTQ0FQRQorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgREVWSUNFIENPTlRST0wgT05FCisgICAgMHgwMDEyOiAweDAwMTIsICAgICAjICBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICAweDAwMTM6IDB4MDAxMywgICAgICMgIERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgMHgwMDE0OiAweDAwMTQsICAgICAjICBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgMHgwMDE1OiAweDAwMTUsICAgICAjICBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIDB4MDAxNjogMHgwMDE2LCAgICAgIyAgU1lOQ0hST05PVVMgSURMRQorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIDB4MDAxODogMHgwMDE4LCAgICAgIyAgQ0FOQ0VMCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBFTkQgT0YgTUVESVVNCisgICAgMHgwMDFhOiAweDAwMWEsICAgICAjICBTVUJTVElUVVRFCisgICAgMHgwMDFiOiAweDAwMWIsICAgICAjICBFU0NBUEUKKyAgICAweDAwMWM6IDB4MDAxYywgICAgICMgIEZJTEUgU0VQQVJBVE9SCisgICAgMHgwMDFkOiAweDAwMWQsICAgICAjICBHUk9VUCBTRVBBUkFUT1IKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIFJFQ09SRCBTRVBBUkFUT1IKKyAgICAweDAwMWY6IDB4MDAxZiwgICAgICMgIFVOSVQgU0VQQVJBVE9SCisgICAgMHgwMDIwOiAweDAwMjAsICAgICAjICBTUEFDRQorICAgIDB4MDAyMTogMHgwMDIxLCAgICAgIyAgRVhDTEFNQVRJT04gTUFSSworICAgIDB4MDAyMjogMHgwMDIyLCAgICAgIyAgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOCisgICAgMHgwMDI0OiAweDAwMjQsICAgICAjICBET0xMQVIgU0lHTgorICAgIDB4MDAyNTogMHgwMDI1LCAgICAgIyAgUEVSQ0VOVCBTSUdOCisgICAgMHgwMDI2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQKKyAgICAweDAwMjc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUKKyAgICAweDAwMjg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMKKyAgICAweDAwMjk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisgICAgMHgwMDJhOiAweDAwMmEsICAgICAjICBBU1RFUklTSworICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOCisgICAgMHgwMDJjOiAweDAwMmMsICAgICAjICBDT01NQQorICAgIDB4MDAyZDogMHgwMDJkLCAgICAgIyAgSFlQSEVOLU1JTlVTCisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AKKyAgICAweDAwMmY6IDB4MDAyZiwgICAgICMgIFNPTElEVVMKKyAgICAweDAwMzA6IDB4MDAzMCwgICAgICMgIERJR0lUIFpFUk8KKyAgICAweDAwMzE6IDB4MDAzMSwgICAgICMgIERJR0lUIE9ORQorICAgIDB4MDAzMjogMHgwMDMyLCAgICAgIyAgRElHSVQgVFdPCisgICAgMHgwMDMzOiAweDAwMzMsICAgICAjICBESUdJVCBUSFJFRQorICAgIDB4MDAzNDogMHgwMDM0LCAgICAgIyAgRElHSVQgRk9VUgorICAgIDB4MDAzNTogMHgwMDM1LCAgICAgIyAgRElHSVQgRklWRQorICAgIDB4MDAzNjogMHgwMDM2LCAgICAgIyAgRElHSVQgU0lYCisgICAgMHgwMDM3OiAweDAwMzcsICAgICAjICBESUdJVCBTRVZFTgorICAgIDB4MDAzODogMHgwMDM4LCAgICAgIyAgRElHSVQgRUlHSFQKKyAgICAweDAwMzk6IDB4MDAzOSwgICAgICMgIERJR0lUIE5JTkUKKyAgICAweDAwM2E6IDB4MDAzYSwgICAgICMgIENPTE9OCisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04KKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOCisgICAgMHgwMDNkOiAweDAwM2QsICAgICAjICBFUVVBTFMgU0lHTgorICAgIDB4MDAzZTogMHgwMDNlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04KKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUksKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUworICAgIDB4MDA1ZDogMHgwMDVkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5UCisgICAgMHgwMDVmOiAweDAwNWYsICAgICAjICBMT1cgTElORQorICAgIDB4MDA2MDogMHgwMDYwLCAgICAgIyAgR1JBVkUgQUNDRU5UCisgICAgMHgwMDYxOiAweDAwNjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIDB4MDA2MjogMHgwMDYyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICAweDAwNjM6IDB4MDA2MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgMHgwMDY0OiAweDAwNjQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIDB4MDA2NTogMHgwMDY1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICAweDAwNjY6IDB4MDA2NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgMHgwMDY3OiAweDAwNjcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIDB4MDA2ODogMHgwMDY4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICAweDAwNjk6IDB4MDA2OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgMHgwMDZhOiAweDAwNmEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIDB4MDA2YjogMHgwMDZiLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICAweDAwNmM6IDB4MDA2YywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgMHgwMDZkOiAweDAwNmQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIDB4MDA2ZTogMHgwMDZlLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICAweDAwNmY6IDB4MDA2ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgMHgwMDcwOiAweDAwNzAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIDB4MDA3MTogMHgwMDcxLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICAweDAwNzI6IDB4MDA3MiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgMHgwMDczOiAweDAwNzMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIDB4MDA3NDogMHgwMDc0LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICAweDAwNzU6IDB4MDA3NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgMHgwMDc2OiAweDAwNzYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIDB4MDA3NzogMHgwMDc3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICAweDAwNzg6IDB4MDA3OCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgMHgwMDc5OiAweDAwNzksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIDB4MDA3YTogMHgwMDdhLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICAweDAwN2I6IDB4MDA3YiwgICAgICMgIExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3YzogMHgwMDdjLCAgICAgIyAgVkVSVElDQUwgTElORQorICAgIDB4MDA3ZDogMHgwMDdkLCAgICAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIDB4MDA3ZTogMHgwMDdlLCAgICAgIyAgVElMREUKKyAgICAweDAwN2Y6IDB4MDA3ZiwgICAgICMgIERFTEVURQorICAgIDB4MDBhMDogMHgwMGZmLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UKKyAgICAweDAwYTQ6IDB4MDBmZCwgICAgICMgIENVUlJFTkNZIFNJR04KKyAgICAweDAwYjA6IDB4MDBmOCwgICAgICMgIERFR1JFRSBTSUdOCisgICAgMHgwMGI3OiAweDAwZmEsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwNDAxOiAweDAwZjAsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJTworICAgIDB4MDQwNDogMHgwMGYyLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgMHgwNDA3OiAweDAwZjQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorICAgIDB4MDQwZTogMHgwMGY2LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIDB4MDQxMDogMHgwMDgwLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDQxMTogMHgwMDgxLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICAweDA0MTI6IDB4MDA4MiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgMHgwNDEzOiAweDAwODMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICAweDA0MTQ6IDB4MDA4NCwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgMHgwNDE1OiAweDAwODUsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgIDB4MDQxNjogMHgwMDg2LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgMHgwNDE3OiAweDAwODcsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIDB4MDQxODogMHgwMDg4LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDQxOTogMHgwMDg5LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIDB4MDQxYTogMHgwMDhhLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICAweDA0MWI6IDB4MDA4YiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgMHgwNDFjOiAweDAwOGMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIDB4MDQxZDogMHgwMDhkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICAweDA0MWU6IDB4MDA4ZSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDA0MWY6IDB4MDA4ZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgMHgwNDIwOiAweDAwOTAsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgIDB4MDQyMTogMHgwMDkxLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICAweDA0MjI6IDB4MDA5MiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgMHgwNDIzOiAweDAwOTMsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgMHgwNDI0OiAweDAwOTQsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIDB4MDQyNTogMHgwMDk1LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICAweDA0MjY6IDB4MDA5NiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIDB4MDQyNzogMHgwMDk3LCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgMHgwNDI4OiAweDAwOTgsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKyAgICAweDA0Mjk6IDB4MDA5OSwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgMHgwNDJhOiAweDAwOWEsICAgICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKyAgICAweDA0MmI6IDB4MDA5YiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICAweDA0MmM6IDB4MDA5YywgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgIDB4MDQyZDogMHgwMDlkLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDQyZTogMHgwMDllLCAgICAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICAweDA0MmY6IDB4MDA5ZiwgICAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgMHgwNDMwOiAweDAwYTAsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorICAgIDB4MDQzMTogMHgwMGExLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisgICAgMHgwNDMyOiAweDAwYTIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICAweDA0MzM6IDB4MDBhMywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKyAgICAweDA0MzQ6IDB4MDBhNCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgIDB4MDQzNTogMHgwMGE1LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgMHgwNDM2OiAweDAwYTYsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisgICAgMHgwNDM3OiAweDAwYTcsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKyAgICAweDA0Mzg6IDB4MDBhOCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgMHgwNDM5OiAweDAwYTksICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorICAgIDB4MDQzYTogMHgwMGFhLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgMHgwNDNiOiAweDAwYWIsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICAweDA0M2M6IDB4MDBhYywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorICAgIDB4MDQzZDogMHgwMGFkLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgMHgwNDNlOiAweDAwYWUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIDB4MDQzZjogMHgwMGFmLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgMHgwNDQwOiAweDAwZTAsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICAweDA0NDE6IDB4MDBlMSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgIDB4MDQ0MjogMHgwMGUyLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgMHgwNDQzOiAweDAwZTMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgIDB4MDQ0NDogMHgwMGU0LCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisgICAgMHgwNDQ1OiAweDAwZTUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKyAgICAweDA0NDY6IDB4MDBlNiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKyAgICAweDA0NDc6IDB4MDBlNywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICAweDA0NDg6IDB4MDBlOCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICAweDA0NDk6IDB4MDBlOSwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQQorICAgIDB4MDQ0YTogMHgwMGVhLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorICAgIDB4MDQ0YjogMHgwMGViLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKyAgICAweDA0NGM6IDB4MDBlYywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAweDA0NGQ6IDB4MDBlZCwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFCisgICAgMHgwNDRlOiAweDAwZWUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICAweDA0NGY6IDB4MDBlZiwgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZQQorICAgIDB4MDQ1MTogMHgwMGYxLCAgICAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgMHgwNDU0OiAweDAwZjMsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgMHgwNDU3OiAweDAwZjUsICAgICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKyAgICAweDA0NWU6IDB4MDBmNywgICAgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBVCisgICAgMHgyMTE2OiAweDAwZmMsICAgICAjICBOVU1FUk8gU0lHTgorICAgIDB4MjIxOTogMHgwMGY5LCAgICAgIyAgQlVMTEVUIE9QRVJBVE9SCisgICAgMHgyMjFhOiAweDAwZmIsICAgICAjICBTUVVBUkUgUk9PVAorICAgIDB4MjUwMDogMHgwMGM0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKyAgICAweDI1MDI6IDB4MDBiMywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MjUwYzogMHgwMGRhLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgyNTEwOiAweDAwYmYsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorICAgIDB4MjUxNDogMHgwMGMwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIDB4MjUxODogMHgwMGQ5LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBMRUZUCisgICAgMHgyNTFjOiAweDAwYzMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgyNTI0OiAweDAwYjQsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1MmM6IDB4MDBjMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTM0OiAweDAwYzEsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICAweDI1M2M6IDB4MDBjNSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU1MDogMHgwMGNkLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgMHgyNTUxOiAweDAwYmEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgMHgyNTUyOiAweDAwZDUsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1MzogMHgwMGQ2LCAgICAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NTQ6IDB4MDBjOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICAweDI1NTU6IDB4MDBiOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NTY6IDB4MDBiNywgICAgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NTc6IDB4MDBiYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIDB4MjU1ODogMHgwMGQ0LCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgMHgyNTU5OiAweDAwZDMsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICAweDI1NWE6IDB4MDBjOCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgyNTViOiAweDAwYmUsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIDB4MjU1YzogMHgwMGJkLCAgICAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKyAgICAweDI1NWQ6IDB4MDBiYywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICAweDI1NWU6IDB4MDBjNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIDB4MjU1ZjogMHgwMGM3LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgMHgyNTYwOiAweDAwY2MsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjU2MTogMHgwMGI1LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICAweDI1NjI6IDB4MDBiNiwgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgMHgyNTYzOiAweDAwYjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTY0OiAweDAwZDEsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY1OiAweDAwZDIsICAgICAjICBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTY2OiAweDAwY2IsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDI1Njc6IDB4MDBjZiwgICAgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgMHgyNTY4OiAweDAwZDAsICAgICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YTogMHgwMGQ4LCAgICAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICAweDI1NmI6IDB4MDBkNywgICAgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgMHgyNTZjOiAweDAwY2UsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTgwOiAweDAwZGYsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg0OiAweDAwZGMsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgyNTg4OiAweDAwZGIsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgyNThjOiAweDAwZGQsICAgICAjICBMRUZUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTA6IDB4MDBkZSwgICAgICMgIFJJR0hUIEhBTEYgQkxPQ0sKKyAgICAweDI1OTE6IDB4MDBiMCwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgyNTkyOiAweDAwYjEsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDI1OTM6IDB4MDBiMiwgICAgICMgIERBUksgU0hBREUKKyAgICAweDI1YTA6IDB4MDBmZSwgICAgICMgIEJMQUNLIFNRVUFSRQorfQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjYucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDI0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Ni5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjYucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDI0YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2Ni5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjkucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2OS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRjOTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NjkucHkKQEAgLTAsMCArMSw2ODkgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1ZFTkRPUlMvTUlDU0ZUL1BDL0NQODY5LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A4NjknLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwODE6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDA4MjogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDgzOiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwODQ6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDA4NTogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDg2OiAweDAzODYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgMHgwMDg3OiBOb25lLCAgICAgICAjICBVTkRFRklORUQKKyAgICAweDAwODg6IDB4MDBiNywgICAgICMgIE1JRERMRSBET1QKKyAgICAweDAwODk6IDB4MDBhYywgICAgICMgIE5PVCBTSUdOCisgICAgMHgwMDhhOiAweDAwYTYsICAgICAjICBCUk9LRU4gQkFSCisgICAgMHgwMDhiOiAweDIwMTgsICAgICAjICBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDA4YzogMHgyMDE5LCAgICAgIyAgUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMDhkOiAweDAzODgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAwOGU6IDB4MjAxNSwgICAgICMgIEhPUklaT05UQUwgQkFSCisgICAgMHgwMDhmOiAweDAzODksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDA5MDogMHgwMzhhLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgMHgwMDkxOiAweDAzYWEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgMHgwMDkyOiAweDAzOGMsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICAweDAwOTM6IE5vbmUsICAgICAgICMgIFVOREVGSU5FRAorICAgIDB4MDA5NDogTm9uZSwgICAgICAgIyAgVU5ERUZJTkVECisgICAgMHgwMDk1OiAweDAzOGUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICAweDAwOTY6IDB4MDNhYiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICAweDAwOTc6IDB4MDBhOSwgICAgICMgIENPUFlSSUdIVCBTSUdOCisgICAgMHgwMDk4OiAweDAzOGYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgMHgwMDk5OiAweDAwYjIsICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwOWE6IDB4MDBiMywgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMDliOiAweDAzYWMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIDB4MDA5YzogMHgwMGEzLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDA5ZDogMHgwM2FkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDA5ZTogMHgwM2FlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisgICAgMHgwMDlmOiAweDAzYWYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgMHgwMGEwOiAweDAzY2EsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIDB4MDBhMTogMHgwMzkwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgMHgwMGEyOiAweDAzY2MsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwMGEzOiAweDAzY2QsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMGE0OiAweDAzOTEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorICAgIDB4MDBhNTogMHgwMzkyLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorICAgIDB4MDBhNjogMHgwMzkzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAwYTc6IDB4MDM5NCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCisgICAgMHgwMGE4OiAweDAzOTUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwMGE5OiAweDAzOTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCisgICAgMHgwMGFhOiAweDAzOTcsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKyAgICAweDAwYWI6IDB4MDBiZCwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDBhYzogMHgwMzk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICAweDAwYWQ6IDB4MDM5OSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICAweDAwYWU6IDB4MDBhYiwgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgwMGFmOiAweDAwYmIsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYjA6IDB4MjU5MSwgICAgICMgIExJR0hUIFNIQURFCisgICAgMHgwMGIxOiAweDI1OTIsICAgICAjICBNRURJVU0gU0hBREUKKyAgICAweDAwYjI6IDB4MjU5MywgICAgICMgIERBUksgU0hBREUKKyAgICAweDAwYjM6IDB4MjUwMiwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIDB4MDBiNDogMHgyNTI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgwMGI1OiAweDAzOWEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQorICAgIDB4MDBiNjogMHgwMzliLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKyAgICAweDAwYjc6IDB4MDM5YywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCisgICAgMHgwMGI4OiAweDAzOWQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQorICAgIDB4MDBiOTogMHgyNTYzLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIDB4MDBiYTogMHgyNTUxLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MDBiYjogMHgyNTU3LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgwMGJjOiAweDI1NWQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgMHgwMGJkOiAweDAzOWUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQorICAgIDB4MDBiZTogMHgwMzlmLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTgorICAgIDB4MDBiZjogMHgyNTEwLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDAwYzA6IDB4MjUxNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDAwYzE6IDB4MjUzNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MDBjMjogMHgyNTJjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzM6IDB4MjUxYywgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDAwYzQ6IDB4MjUwMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgwMGM1OiAweDI1M2MsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwYzY6IDB4MDNhMCwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCisgICAgMHgwMGM3OiAweDAzYTEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKyAgICAweDAwYzg6IDB4MjU1YSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgMHgwMGM5OiAweDI1NTQsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGNhOiAweDI1NjksICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgwMGNiOiAweDI1NjYsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2M6IDB4MjU2MCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgMHgwMGNkOiAweDI1NTAsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIEhPUklaT05UQUwKKyAgICAweDAwY2U6IDB4MjU2YywgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDAwY2Y6IDB4MDNhMywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwMGQwOiAweDAzYTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUKKyAgICAweDAwZDE6IDB4MDNhNSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKyAgICAweDAwZDI6IDB4MDNhNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDBkMzogMHgwM2E3LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCisgICAgMHgwMGQ0OiAweDAzYTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICAweDAwZDU6IDB4MDNhOSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwMGQ2OiAweDAzYjEsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICAweDAwZDc6IDB4MDNiMiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisgICAgMHgwMGQ4OiAweDAzYjMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEKKyAgICAweDAwZDk6IDB4MjUxOCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MDBkYTogMHgyNTBjLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgMHgwMGRiOiAweDI1ODgsICAgICAjICBGVUxMIEJMT0NLCisgICAgMHgwMGRjOiAweDI1ODQsICAgICAjICBMT1dFUiBIQUxGIEJMT0NLCisgICAgMHgwMGRkOiAweDAzYjQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICAweDAwZGU6IDB4MDNiNSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwMGRmOiAweDI1ODAsICAgICAjICBVUFBFUiBIQUxGIEJMT0NLCisgICAgMHgwMGUwOiAweDAzYjYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorICAgIDB4MDBlMTogMHgwM2I3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVUQQorICAgIDB4MDBlMjogMHgwM2I4LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCisgICAgMHgwMGUzOiAweDAzYjksICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorICAgIDB4MDBlNDogMHgwM2JhLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEtBUFBBCisgICAgMHgwMGU1OiAweDAzYmIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTEFNREEKKyAgICAweDAwZTY6IDB4MDNiYywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBNVQorICAgIDB4MDBlNzogMHgwM2JkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIE5VCisgICAgMHgwMGU4OiAweDAzYmUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgWEkKKyAgICAweDAwZTk6IDB4MDNiZiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisgICAgMHgwMGVhOiAweDAzYzAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICAweDAwZWI6IDB4MDNjMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBSSE8KKyAgICAweDAwZWM6IDB4MDNjMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDBlZDogMHgwM2MyLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgMHgwMGVlOiAweDAzYzQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgMHgwMGVmOiAweDAzODQsICAgICAjICBHUkVFSyBUT05PUworICAgIDB4MDBmMDogMHgwMGFkLCAgICAgIyAgU09GVCBIWVBIRU4KKyAgICAweDAwZjE6IDB4MDBiMSwgICAgICMgIFBMVVMtTUlOVVMgU0lHTgorICAgIDB4MDBmMjogMHgwM2M1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICAweDAwZjM6IDB4MDNjNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDAwZjQ6IDB4MDNjNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICAweDAwZjU6IDB4MDBhNywgICAgICMgIFNFQ1RJT04gU0lHTgorICAgIDB4MDBmNjogMHgwM2M4LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorICAgIDB4MDBmNzogMHgwMzg1LCAgICAgIyAgR1JFRUsgRElBTFlUSUtBIFRPTk9TCisgICAgMHgwMGY4OiAweDAwYjAsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBmOTogMHgwMGE4LCAgICAgIyAgRElBRVJFU0lTCisgICAgMHgwMGZhOiAweDAzYzksICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKyAgICAweDAwZmI6IDB4MDNjYiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgMHgwMGZjOiAweDAzYjAsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICAweDAwZmQ6IDB4MDNjZSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgMHgwMGZlOiAweDI1YTAsICAgICAjICBCTEFDSyBTUVVBUkUKKyAgICAweDAwZmY6IDB4MDBhMCwgICAgICMgIE5PLUJSRUFLIFNQQUNFCit9KQorCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDAwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwMDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDAwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDAwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwMDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDAwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwMDBiIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwMDBkIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MDAwZSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MDAxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgwMDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgwMDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MDAxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgwMDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MDAxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgwMDFhIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgwMDFjIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgwMDFkIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MDAxZSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgwMDFmIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgwMDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgwMDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDAwMjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDAwMjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDAwMjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDAwMjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgwMDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MDAyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgwMDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDAwMjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDAwMmEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDAwMmIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgwMDJjIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMDJkIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MDAyZSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDAwMmYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MDAzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgwMDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MDAzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDAwMzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDAwMzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MDAzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgwMDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MDAzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MDAzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MDAzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgwMDNhIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgwMDNiIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDAzYyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4MDAzZCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4MDAzZSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4MDAzZiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHgwMDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDAwNDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4MDA0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHgwMDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDAwNDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4MDA0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHgwMDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDAwNDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4MDA0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHgwMDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDAwNGEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4MDA0YiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHgwMDRjIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDAwNGQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4MDA0ZSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHgwMDRmIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDAwNTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4MDA1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHgwMDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDAwNTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4MDA1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHgwMDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDAwNTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4MDA1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHgwMDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDAwNTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4MDA1YSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHgwMDViIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDAwNWMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHgwMDVkIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHgwMDVlIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHgwMDVmIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHgwMDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4MDA2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4MDA2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4MDA2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4MDA2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4MDA2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4MDA2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4MDA2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4MDA2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4MDA2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4MDA2YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4MDA2YiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4MDA2YyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4MDA2ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4MDA2ZSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4MDA2ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4MDA3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4MDA3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4MDA3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4MDA3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4MDA3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4MDA3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4MDA3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4MDA3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4MDA3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4MDA3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4MDA3YSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4MDA3YiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDAwN2MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4MDA3ZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHgwMDdlIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHgwMDdmIC0+IERFTEVURQorICAgIHUnXHVmZmZlJyAgICMgIDB4MDA4MCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDAwODEgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDgyIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4MDA4MyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDAwODQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDg1IC0+IFVOREVGSU5FRAorICAgIHUnXHUwMzg2JyAgICMgIDB4MDA4NiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDg3IC0+IFVOREVGSU5FRAorICAgIHUnXHhiNycgICAgICMgIDB4MDA4OCAtPiBNSURETEUgRE9UCisgICAgdSdceGFjJyAgICAgIyAgMHgwMDg5IC0+IE5PVCBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHgwMDhhIC0+IEJST0tFTiBCQVIKKyAgICB1J1x1MjAxOCcgICAjICAweDAwOGIgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweDAwOGMgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAzODgnICAgIyAgMHgwMDhkIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUyMDE1JyAgICMgIDB4MDA4ZSAtPiBIT1JJWk9OVEFMIEJBUgorICAgIHUnXHUwMzg5JyAgICMgIDB4MDA4ZiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwMzhhJyAgICMgIDB4MDA5MCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhYScgICAjICAweDAwOTEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwMzhjJyAgICMgIDB4MDA5MiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICB1J1x1ZmZmZScgICAjICAweDAwOTMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHgwMDk0IC0+IFVOREVGSU5FRAorICAgIHUnXHUwMzhlJyAgICMgIDB4MDA5NSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhYicgICAjICAweDAwOTYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQQorICAgIHUnXHhhOScgICAgICMgIDB4MDA5NyAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUwMzhmJyAgICMgIDB4MDA5OCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgdSdceGIyJyAgICAgIyAgMHgwMDk5IC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4MDA5YSAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHUwM2FjJyAgICMgIDB4MDA5YiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHhhMycgICAgICMgIDB4MDA5YyAtPiBQT1VORCBTSUdOCisgICAgdSdcdTAzYWQnICAgIyAgMHgwMDlkIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZScgICAjICAweDAwOWUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWYnICAgIyAgMHgwMDlmIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjYScgICAjICAweDAwYTAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDM5MCcgICAjICAweDAwYTEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgdSdcdTAzY2MnICAgIyAgMHgwMGEyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjZCcgICAjICAweDAwYTMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwMzkxJyAgICMgIDB4MDBhNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwMzkyJyAgICMgIDB4MDBhNSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzOTMnICAgIyAgMHgwMGE2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzOTQnICAgIyAgMHgwMGE3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzOTUnICAgIyAgMHgwMGE4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MDM5NicgICAjICAweDAwYTkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgWkVUQQorICAgIHUnXHUwMzk3JyAgICMgIDB4MDBhYSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKyAgICB1J1x4YmQnICAgICAjICAweDAwYWIgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdcdTAzOTgnICAgIyAgMHgwMGFjIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzOTknICAgIyAgMHgwMGFkIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICB1J1x4YWInICAgICAjICAweDAwYWUgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweDAwYWYgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTI1OTEnICAgIyAgMHgwMGIwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHgwMGIxIC0+IE1FRElVTSBTSEFERQorICAgIHUnXHUyNTkzJyAgICMgIDB4MDBiMiAtPiBEQVJLIFNIQURFCisgICAgdSdcdTI1MDInICAgIyAgMHgwMGIzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTAorICAgIHUnXHUyNTI0JyAgICMgIDB4MDBiNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MDM5YScgICAjICAweDAwYjUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDM5YicgICAjICAweDAwYjYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKyAgICB1J1x1MDM5YycgICAjICAweDAwYjcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTVUKKyAgICB1J1x1MDM5ZCcgICAjICAweDAwYjggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTlUKKyAgICB1J1x1MjU2MycgICAjICAweDAwYjkgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTUxJyAgICMgIDB4MDBiYSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTcnICAgIyAgMHgwMGJiIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTVkJyAgICMgIDB4MDBiYyAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisgICAgdSdcdTAzOWUnICAgIyAgMHgwMGJkIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFhJCisgICAgdSdcdTAzOWYnICAgIyAgMHgwMGJlIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MjUxMCcgICAjICAweDAwYmYgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICB1J1x1MjUxNCcgICAjICAweDAwYzAgLT4gQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBSSUdIVAorICAgIHUnXHUyNTM0JyAgICMgIDB4MDBjMSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUyYycgICAjICAweDAwYzIgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUxYycgICAjICAweDAwYzMgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTAwJyAgICMgIDB4MDBjNCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4MDBjNSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MDNhMCcgICAjICAweDAwYzYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKyAgICB1J1x1MDNhMScgICAjICAweDAwYzcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUkhPCisgICAgdSdcdTI1NWEnICAgIyAgMHgwMGM4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NTQnICAgIyAgMHgwMGM5IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjU2OScgICAjICAweDAwY2EgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY2JyAgICMgIDB4MDBjYiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2MCcgICAjICAweDAwY2MgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjU1MCcgICAjICAweDAwY2QgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmMnICAgIyAgMHgwMGNlIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MDNhMycgICAjICAweDAwY2YgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgU0lHTUEKKyAgICB1J1x1MDNhNCcgICAjICAweDAwZDAgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYTUnICAgIyAgMHgwMGQxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNhNicgICAjICAweDAwZDIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYTcnICAgIyAgMHgwMGQzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIENISQorICAgIHUnXHUwM2E4JyAgICMgIDB4MDBkNCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNhOScgICAjICAweDAwZDUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNiMScgICAjICAweDAwZDYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdcdTAzYjInICAgIyAgMHgwMGQ3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzYjMnICAgIyAgMHgwMGQ4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIHUnXHUyNTE4JyAgICMgIDB4MDBkOSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUwYycgICAjICAweDAwZGEgLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTI1ODgnICAgIyAgMHgwMGRiIC0+IEZVTEwgQkxPQ0sKKyAgICB1J1x1MjU4NCcgICAjICAweDAwZGMgLT4gTE9XRVIgSEFMRiBCTE9DSworICAgIHUnXHUwM2I0JyAgICMgIDB4MDBkZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDNiNScgICAjICAweDAwZGUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MjU4MCcgICAjICAweDAwZGYgLT4gVVBQRVIgSEFMRiBCTE9DSworICAgIHUnXHUwM2I2JyAgICMgIDB4MDBlMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorICAgIHUnXHUwM2I3JyAgICMgIDB4MDBlMSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVRBCisgICAgdSdcdTAzYjgnICAgIyAgMHgwMGUyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2I5JyAgICMgIDB4MDBlMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQQorICAgIHUnXHUwM2JhJyAgICMgIDB4MDBlNCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDNiYicgICAjICAweDAwZTUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzYmMnICAgIyAgMHgwMGU2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBNVQorICAgIHUnXHUwM2JkJyAgICMgIDB4MDBlNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTlUKKyAgICB1J1x1MDNiZScgICAjICAweDAwZTggLT4gR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgdSdcdTAzYmYnICAgIyAgMHgwMGU5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTAzYzAnICAgIyAgMHgwMGVhIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2MxJyAgICMgIDB4MDBlYiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgdSdcdTAzYzMnICAgIyAgMHgwMGVjIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2MyJyAgICMgIDB4MDBlZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEKKyAgICB1J1x1MDNjNCcgICAjICAweDAwZWUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwMzg0JyAgICMgIDB4MDBlZiAtPiBHUkVFSyBUT05PUworICAgIHUnXHhhZCcgICAgICMgIDB4MDBmMCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhiMScgICAgICMgIDB4MDBmMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MDNjNScgICAjICAweDAwZjIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNjNicgICAjICAweDAwZjMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2M3JyAgICMgIDB4MDBmNCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQ0hJCisgICAgdSdceGE3JyAgICAgIyAgMHgwMGY1IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUwM2M4JyAgICMgIDB4MDBmNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCisgICAgdSdcdTAzODUnICAgIyAgMHgwMGY3IC0+IEdSRUVLIERJQUxZVElLQSBUT05PUworICAgIHUnXHhiMCcgICAgICMgIDB4MDBmOCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4MDBmOSAtPiBESUFFUkVTSVMKKyAgICB1J1x1MDNjOScgICAjICAweDAwZmEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzY2InICAgIyAgMHgwMGZiIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYjAnICAgIyAgMHgwMGZjIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIHUnXHUwM2NlJyAgICMgIDB4MDBmZCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHUyNWEwJyAgICMgIDB4MDBmZSAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x4YTAnICAgICAjICAweDAwZmYgLT4gTk8tQlJFQUsgU1BBQ0UKKykKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSB7CisgICAgMHgwMDAwOiAweDAwMDAsICAgICAjICBOVUxMCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBTVEFSVCBPRiBIRUFESU5HCisgICAgMHgwMDAyOiAweDAwMDIsICAgICAjICBTVEFSVCBPRiBURVhUCisgICAgMHgwMDAzOiAweDAwMDMsICAgICAjICBFTkQgT0YgVEVYVAorICAgIDB4MDAwNDogMHgwMDA0LCAgICAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgRU5RVUlSWQorICAgIDB4MDAwNjogMHgwMDA2LCAgICAgIyAgQUNLTk9XTEVER0UKKyAgICAweDAwMDc6IDB4MDAwNywgICAgICMgIEJFTEwKKyAgICAweDAwMDg6IDB4MDAwOCwgICAgICMgIEJBQ0tTUEFDRQorICAgIDB4MDAwOTogMHgwMDA5LCAgICAgIyAgSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBMSU5FIEZFRUQKKyAgICAweDAwMGI6IDB4MDAwYiwgICAgICMgIFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIEZPUk0gRkVFRAorICAgIDB4MDAwZDogMHgwMDBkLCAgICAgIyAgQ0FSUklBR0UgUkVUVVJOCisgICAgMHgwMDBlOiAweDAwMGUsICAgICAjICBTSElGVCBPVVQKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIFNISUZUIElOCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBEQVRBIExJTksgRVNDQVBFCisgICAgMHgwMDExOiAweDAwMTEsICAgICAjICBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIERFVklDRSBDT05UUk9MIFRXTworICAgIDB4MDAxMzogMHgwMDEzLCAgICAgIyAgREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICAweDAwMTQ6IDB4MDAxNCwgICAgICMgIERFVklDRSBDT05UUk9MIEZPVVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBTWU5DSFJPTk9VUyBJRExFCisgICAgMHgwMDE3OiAweDAwMTcsICAgICAjICBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgMHgwMDE4OiAweDAwMTgsICAgICAjICBDQU5DRUwKKyAgICAweDAwMTk6IDB4MDAxOSwgICAgICMgIEVORCBPRiBNRURJVU0KKyAgICAweDAwMWE6IDB4MDAxYSwgICAgICMgIFNVQlNUSVRVVEUKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIEVTQ0FQRQorICAgIDB4MDAxYzogMHgwMDFjLCAgICAgIyAgRklMRSBTRVBBUkFUT1IKKyAgICAweDAwMWQ6IDB4MDAxZCwgICAgICMgIEdST1VQIFNFUEFSQVRPUgorICAgIDB4MDAxZTogMHgwMDFlLCAgICAgIyAgUkVDT1JEIFNFUEFSQVRPUgorICAgIDB4MDAxZjogMHgwMDFmLCAgICAgIyAgVU5JVCBTRVBBUkFUT1IKKyAgICAweDAwMjA6IDB4MDAyMCwgICAgICMgIFNQQUNFCisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLCisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSworICAgIDB4MDAyMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04KKyAgICAweDAwMjQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOCisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04KKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORAorICAgIDB4MDAyNzogMHgwMDI3LCAgICAgIyAgQVBPU1RST1BIRQorICAgIDB4MDAyODogMHgwMDI4LCAgICAgIyAgTEVGVCBQQVJFTlRIRVNJUworICAgIDB4MDAyOTogMHgwMDI5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLCisgICAgMHgwMDJiOiAweDAwMmIsICAgICAjICBQTFVTIFNJR04KKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BCisgICAgMHgwMDJkOiAweDAwMmQsICAgICAjICBIWVBIRU4tTUlOVVMKKyAgICAweDAwMmU6IDB4MDAyZSwgICAgICMgIEZVTEwgU1RPUAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUworICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04KKyAgICAweDAwM2I6IDB4MDAzYiwgICAgICMgIFNFTUlDT0xPTgorICAgIDB4MDAzYzogMHgwMDNjLCAgICAgIyAgTEVTUy1USEFOIFNJR04KKyAgICAweDAwM2Q6IDB4MDAzZCwgICAgICMgIEVRVUFMUyBTSUdOCisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTgorICAgIDB4MDAzZjogMHgwMDNmLCAgICAgIyAgUVVFU1RJT04gTUFSSworICAgIDB4MDA0MDogMHgwMDQwLCAgICAgIyAgQ09NTUVSQ0lBTCBBVAorICAgIDB4MDA0MTogMHgwMDQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIDB4MDA0MjogMHgwMDQyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIDB4MDA0MzogMHgwMDQzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIDB4MDA0NDogMHgwMDQ0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIDB4MDA0NTogMHgwMDQ1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIDB4MDA0NjogMHgwMDQ2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIDB4MDA0NzogMHgwMDQ3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIDB4MDA0ODogMHgwMDQ4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIDB4MDA0OTogMHgwMDQ5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIDB4MDA0YTogMHgwMDRhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIDB4MDA0YjogMHgwMDRiLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIDB4MDA0YzogMHgwMDRjLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIDB4MDA0ZDogMHgwMDRkLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIDB4MDA0ZTogMHgwMDRlLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIDB4MDA0ZjogMHgwMDRmLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIDB4MDA1MDogMHgwMDUwLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIDB4MDA1MTogMHgwMDUxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIDB4MDA1MjogMHgwMDUyLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIDB4MDA1MzogMHgwMDUzLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIDB4MDA1NDogMHgwMDU0LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIDB4MDA1NTogMHgwMDU1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIDB4MDA1NjogMHgwMDU2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIDB4MDA1NzogMHgwMDU3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIDB4MDA1ODogMHgwMDU4LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIDB4MDA1OTogMHgwMDU5LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIDB4MDA1YTogMHgwMDVhLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIDB4MDA1YjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1YzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTCisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIDB4MDA1ZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAweDAwNWY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FCisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdjOiAweDAwN2MsICAgICAjICBWRVJUSUNBTCBMSU5FCisgICAgMHgwMDdkOiAweDAwN2QsICAgICAjICBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgMHgwMDdlOiAweDAwN2UsICAgICAjICBUSUxERQorICAgIDB4MDA3ZjogMHgwMDdmLCAgICAgIyAgREVMRVRFCisgICAgMHgwMGEwOiAweDAwZmYsICAgICAjICBOTy1CUkVBSyBTUEFDRQorICAgIDB4MDBhMzogMHgwMDljLCAgICAgIyAgUE9VTkQgU0lHTgorICAgIDB4MDBhNjogMHgwMDhhLCAgICAgIyAgQlJPS0VOIEJBUgorICAgIDB4MDBhNzogMHgwMGY1LCAgICAgIyAgU0VDVElPTiBTSUdOCisgICAgMHgwMGE4OiAweDAwZjksICAgICAjICBESUFFUkVTSVMKKyAgICAweDAwYTk6IDB4MDA5NywgICAgICMgIENPUFlSSUdIVCBTSUdOCisgICAgMHgwMGFiOiAweDAwYWUsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIDB4MDBhYzogMHgwMDg5LCAgICAgIyAgTk9UIFNJR04KKyAgICAweDAwYWQ6IDB4MDBmMCwgICAgICMgIFNPRlQgSFlQSEVOCisgICAgMHgwMGIwOiAweDAwZjgsICAgICAjICBERUdSRUUgU0lHTgorICAgIDB4MDBiMTogMHgwMGYxLCAgICAgIyAgUExVUy1NSU5VUyBTSUdOCisgICAgMHgwMGIyOiAweDAwOTksICAgICAjICBTVVBFUlNDUklQVCBUV08KKyAgICAweDAwYjM6IDB4MDA5YSwgICAgICMgIFNVUEVSU0NSSVBUIFRIUkVFCisgICAgMHgwMGI3OiAweDAwODgsICAgICAjICBNSURETEUgRE9UCisgICAgMHgwMGJiOiAweDAwYWYsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDAwYmQ6IDB4MDBhYiwgICAgICMgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIDB4MDM4NDogMHgwMGVmLCAgICAgIyAgR1JFRUsgVE9OT1MKKyAgICAweDAzODU6IDB4MDBmNywgICAgICMgIEdSRUVLIERJQUxZVElLQSBUT05PUworICAgIDB4MDM4NjogMHgwMDg2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIDB4MDM4ODogMHgwMDhkLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwMzg5OiAweDAwOGYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIDB4MDM4YTogMHgwMDkwLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgMHgwMzhjOiAweDAwOTIsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICAweDAzOGU6IDB4MDA5NSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDM4ZjogMHgwMDk4LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MDM5MDogMHgwMGExLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgMHgwMzkxOiAweDAwYTQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorICAgIDB4MDM5MjogMHgwMGE1LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorICAgIDB4MDM5MzogMHgwMGE2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICAweDAzOTQ6IDB4MDBhNywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCisgICAgMHgwMzk1OiAweDAwYTgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisgICAgMHgwMzk2OiAweDAwYTksICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCisgICAgMHgwMzk3OiAweDAwYWEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKyAgICAweDAzOTg6IDB4MDBhYywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgMHgwMzk5OiAweDAwYWQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCisgICAgMHgwMzlhOiAweDAwYjUsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQorICAgIDB4MDM5YjogMHgwMGI2LCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKyAgICAweDAzOWM6IDB4MDBiNywgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCisgICAgMHgwMzlkOiAweDAwYjgsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQorICAgIDB4MDM5ZTogMHgwMGJkLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKyAgICAweDAzOWY6IDB4MDBiZSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04KKyAgICAweDAzYTA6IDB4MDBjNiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCisgICAgMHgwM2ExOiAweDAwYzcsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKyAgICAweDAzYTM6IDB4MDBjZiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgMHgwM2E0OiAweDAwZDAsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUKKyAgICAweDAzYTU6IDB4MDBkMSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKyAgICAweDAzYTY6IDB4MDBkMiwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIDB4MDNhNzogMHgwMGQzLCAgICAgIyAgR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCisgICAgMHgwM2E4OiAweDAwZDQsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICAweDAzYTk6IDB4MDBkNSwgICAgICMgIEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgMHgwM2FhOiAweDAwOTEsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgMHgwM2FiOiAweDAwOTYsICAgICAjICBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgMHgwM2FjOiAweDAwOWIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIDB4MDNhZDogMHgwMDlkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIDB4MDNhZTogMHgwMDllLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisgICAgMHgwM2FmOiAweDAwOWYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgMHgwM2IwOiAweDAwZmMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICAweDAzYjE6IDB4MDBkNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIDB4MDNiMjogMHgwMGQ3LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEKKyAgICAweDAzYjM6IDB4MDBkOCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIDB4MDNiNDogMHgwMGRkLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgMHgwM2I1OiAweDAwZGUsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIDB4MDNiNjogMHgwMGUwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICAweDAzYjc6IDB4MDBlMSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICAweDAzYjg6IDB4MDBlMiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIDB4MDNiOTogMHgwMGUzLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICAweDAzYmE6IDB4MDBlNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIDB4MDNiYjogMHgwMGU1LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgMHgwM2JjOiAweDAwZTYsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICAweDAzYmQ6IDB4MDBlNywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIDB4MDNiZTogMHgwMGU4LCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgMHgwM2JmOiAweDAwZTksICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIDB4MDNjMDogMHgwMGVhLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgMHgwM2MxOiAweDAwZWIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgMHgwM2MyOiAweDAwZWQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEKKyAgICAweDAzYzM6IDB4MDBlYywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIDB4MDNjNDogMHgwMGVlLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIDB4MDNjNTogMHgwMGYyLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICAweDAzYzY6IDB4MDBmMywgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICAweDAzYzc6IDB4MDBmNCwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICAweDAzYzg6IDB4MDBmNiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICAweDAzYzk6IDB4MDBmYSwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIDB4MDNjYTogMHgwMGEwLCAgICAgIyAgR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICAweDAzY2I6IDB4MDBmYiwgICAgICMgIEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgMHgwM2NjOiAweDAwYTIsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgMHgwM2NkOiAweDAwYTMsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgMHgwM2NlOiAweDAwZmQsICAgICAjICBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIDB4MjAxNTogMHgwMDhlLCAgICAgIyAgSE9SSVpPTlRBTCBCQVIKKyAgICAweDIwMTg6IDB4MDA4YiwgICAgICMgIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgMHgyMDE5OiAweDAwOGMsICAgICAjICBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAweDI1MDA6IDB4MDBjNCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBIT1JJWk9OVEFMCisgICAgMHgyNTAyOiAweDAwYjMsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKyAgICAweDI1MGM6IDB4MDBkYSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBSSUdIVAorICAgIDB4MjUxMDogMHgwMGJmLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIExFRlQKKyAgICAweDI1MTQ6IDB4MDBjMCwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKyAgICAweDI1MTg6IDB4MDBkOSwgICAgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgTEVGVAorICAgIDB4MjUxYzogMHgwMGMzLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIDB4MjUyNDogMHgwMGI0LCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgMHgyNTJjOiAweDAwYzIsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjUzNDogMHgwMGMxLCAgICAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFVQIEFORCBIT1JJWk9OVEFMCisgICAgMHgyNTNjOiAweDAwYzUsICAgICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKyAgICAweDI1NTA6IDB4MDBjZCwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgSE9SSVpPTlRBTAorICAgIDB4MjU1MTogMHgwMGJhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorICAgIDB4MjU1NDogMHgwMGM5LCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIDB4MjU1NzogMHgwMGJiLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgMHgyNTVhOiAweDAwYzgsICAgICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorICAgIDB4MjU1ZDogMHgwMGJjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIDB4MjU2MDogMHgwMGNjLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICAweDI1NjM6IDB4MDBiOSwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICAweDI1NjY6IDB4MDBjYiwgICAgICMgIEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2OTogMHgwMGNhLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU2YzogMHgwMGNlLCAgICAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIDB4MjU4MDogMHgwMGRmLCAgICAgIyAgVVBQRVIgSEFMRiBCTE9DSworICAgIDB4MjU4NDogMHgwMGRjLCAgICAgIyAgTE9XRVIgSEFMRiBCTE9DSworICAgIDB4MjU4ODogMHgwMGRiLCAgICAgIyAgRlVMTCBCTE9DSworICAgIDB4MjU5MTogMHgwMGIwLCAgICAgIyAgTElHSFQgU0hBREUKKyAgICAweDI1OTI6IDB4MDBiMSwgICAgICMgIE1FRElVTSBTSEFERQorICAgIDB4MjU5MzogMHgwMGIyLCAgICAgIyAgREFSSyBTSEFERQorICAgIDB4MjVhMDogMHgwMGZlLCAgICAgIyAgQkxBQ0sgU1FVQVJFCit9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2OS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2OS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhNWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2OS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg2OS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdhNWE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODY5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTBmNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBjcDg3NCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvV0lORE9XUy9DUDg3NC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg3NCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTIwYWMnICAgIyAgMHg4MCAtPiBFVVJPIFNJR04KKyAgICB1J1x1ZmZmZScgICAjICAweDgxIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4ODIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4MyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDg0IC0+IFVOREVGSU5FRAorICAgIHUnXHUyMDI2JyAgICMgIDB4ODUgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHVmZmZlJyAgICMgIDB4ODYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4NyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDg4IC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4ODkgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4QSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhCIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEMgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg4RCAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDhFIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OEYgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5MCAtPiBVTkRFRklORUQKKyAgICB1J1x1MjAxOCcgICAjICAweDkxIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHg5MiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxYycgICAjICAweDkzIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHg5NCAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyMicgICAjICAweDk1IC0+IEJVTExFVAorICAgIHUnXHUyMDEzJyAgICMgIDB4OTYgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4OTcgLT4gRU0gREFTSAorICAgIHUnXHVmZmZlJyAgICMgIDB4OTggLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5OSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlBIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUIgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5QyAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweDlEIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4OUUgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHg5RiAtPiBVTkRFRklORUQKKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTBlMDEnICAgIyAgMHhBMSAtPiBUSEFJIENIQVJBQ1RFUiBLTyBLQUkKKyAgICB1J1x1MGUwMicgICAjICAweEEyIC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSEFJCisgICAgdSdcdTBlMDMnICAgIyAgMHhBMyAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hVQVQKKyAgICB1J1x1MGUwNCcgICAjICAweEE0IC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSFdBSQorICAgIHUnXHUwZTA1JyAgICMgIDB4QTUgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIT04KKyAgICB1J1x1MGUwNicgICAjICAweEE2IC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBSQUtIQU5HCisgICAgdSdcdTBlMDcnICAgIyAgMHhBNyAtPiBUSEFJIENIQVJBQ1RFUiBOR08gTkdVCisgICAgdSdcdTBlMDgnICAgIyAgMHhBOCAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTgorICAgIHUnXHUwZTA5JyAgICMgIDB4QTkgLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENISU5HCisgICAgdSdcdTBlMGEnICAgIyAgMHhBQSAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hBTkcKKyAgICB1J1x1MGUwYicgICAjICAweEFCIC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFNPCisgICAgdSdcdTBlMGMnICAgIyAgMHhBQyAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hPRQorICAgIHUnXHUwZTBkJyAgICMgIDB4QUQgLT4gVEhBSSBDSEFSQUNURVIgWU8gWUlORworICAgIHUnXHUwZTBlJyAgICMgIDB4QUUgLT4gVEhBSSBDSEFSQUNURVIgRE8gQ0hBREEKKyAgICB1J1x1MGUwZicgICAjICAweEFGIC0+IFRIQUkgQ0hBUkFDVEVSIFRPIFBBVEFLCisgICAgdSdcdTBlMTAnICAgIyAgMHhCMCAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhBTgorICAgIHUnXHUwZTExJyAgICMgIDB4QjEgLT4gVEhBSSBDSEFSQUNURVIgVEhPIE5BTkdNT05USE8KKyAgICB1J1x1MGUxMicgICAjICAweEIyIC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBQSFVUSEFPCisgICAgdSdcdTBlMTMnICAgIyAgMHhCMyAtPiBUSEFJIENIQVJBQ1RFUiBOTyBORU4KKyAgICB1J1x1MGUxNCcgICAjICAweEI0IC0+IFRIQUkgQ0hBUkFDVEVSIERPIERFSworICAgIHUnXHUwZTE1JyAgICMgIDB4QjUgLT4gVEhBSSBDSEFSQUNURVIgVE8gVEFPCisgICAgdSdcdTBlMTYnICAgIyAgMHhCNiAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhVTkcKKyAgICB1J1x1MGUxNycgICAjICAweEI3IC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSEFIQU4KKyAgICB1J1x1MGUxOCcgICAjICAweEI4IC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSE9ORworICAgIHUnXHUwZTE5JyAgICMgIDB4QjkgLT4gVEhBSSBDSEFSQUNURVIgTk8gTlUKKyAgICB1J1x1MGUxYScgICAjICAweEJBIC0+IFRIQUkgQ0hBUkFDVEVSIEJPIEJBSU1BSQorICAgIHUnXHUwZTFiJyAgICMgIDB4QkIgLT4gVEhBSSBDSEFSQUNURVIgUE8gUExBCisgICAgdSdcdTBlMWMnICAgIyAgMHhCQyAtPiBUSEFJIENIQVJBQ1RFUiBQSE8gUEhVTkcKKyAgICB1J1x1MGUxZCcgICAjICAweEJEIC0+IFRIQUkgQ0hBUkFDVEVSIEZPIEZBCisgICAgdSdcdTBlMWUnICAgIyAgMHhCRSAtPiBUSEFJIENIQVJBQ1RFUiBQSE8gUEhBTgorICAgIHUnXHUwZTFmJyAgICMgIDB4QkYgLT4gVEhBSSBDSEFSQUNURVIgRk8gRkFOCisgICAgdSdcdTBlMjAnICAgIyAgMHhDMCAtPiBUSEFJIENIQVJBQ1RFUiBQSE8gU0FNUEhBTworICAgIHUnXHUwZTIxJyAgICMgIDB4QzEgLT4gVEhBSSBDSEFSQUNURVIgTU8gTUEKKyAgICB1J1x1MGUyMicgICAjICAweEMyIC0+IFRIQUkgQ0hBUkFDVEVSIFlPIFlBSworICAgIHUnXHUwZTIzJyAgICMgIDB4QzMgLT4gVEhBSSBDSEFSQUNURVIgUk8gUlVBCisgICAgdSdcdTBlMjQnICAgIyAgMHhDNCAtPiBUSEFJIENIQVJBQ1RFUiBSVQorICAgIHUnXHUwZTI1JyAgICMgIDB4QzUgLT4gVEhBSSBDSEFSQUNURVIgTE8gTElORworICAgIHUnXHUwZTI2JyAgICMgIDB4QzYgLT4gVEhBSSBDSEFSQUNURVIgTFUKKyAgICB1J1x1MGUyNycgICAjICAweEM3IC0+IFRIQUkgQ0hBUkFDVEVSIFdPIFdBRU4KKyAgICB1J1x1MGUyOCcgICAjICAweEM4IC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFNBTEEKKyAgICB1J1x1MGUyOScgICAjICAweEM5IC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFJVU0kKKyAgICB1J1x1MGUyYScgICAjICAweENBIC0+IFRIQUkgQ0hBUkFDVEVSIFNPIFNVQQorICAgIHUnXHUwZTJiJyAgICMgIDB4Q0IgLT4gVEhBSSBDSEFSQUNURVIgSE8gSElQCisgICAgdSdcdTBlMmMnICAgIyAgMHhDQyAtPiBUSEFJIENIQVJBQ1RFUiBMTyBDSFVMQQorICAgIHUnXHUwZTJkJyAgICMgIDB4Q0QgLT4gVEhBSSBDSEFSQUNURVIgTyBBTkcKKyAgICB1J1x1MGUyZScgICAjICAweENFIC0+IFRIQUkgQ0hBUkFDVEVSIEhPIE5PS0hVSworICAgIHUnXHUwZTJmJyAgICMgIDB4Q0YgLT4gVEhBSSBDSEFSQUNURVIgUEFJWUFOTk9JCisgICAgdSdcdTBlMzAnICAgIyAgMHhEMCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEEKKyAgICB1J1x1MGUzMScgICAjICAweEQxIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBIQU4tQUtBVAorICAgIHUnXHUwZTMyJyAgICMgIDB4RDIgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBQQorICAgIHUnXHUwZTMzJyAgICMgIDB4RDMgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBTQorICAgIHUnXHUwZTM0JyAgICMgIDB4RDQgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBJCisgICAgdSdcdTBlMzUnICAgIyAgMHhENSAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIElJCisgICAgdSdcdTBlMzYnICAgIyAgMHhENiAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVFCisgICAgdSdcdTBlMzcnICAgIyAgMHhENyAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVFRQorICAgIHUnXHUwZTM4JyAgICMgIDB4RDggLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVCisgICAgdSdcdTBlMzknICAgIyAgMHhEOSAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFVVCisgICAgdSdcdTBlM2EnICAgIyAgMHhEQSAtPiBUSEFJIENIQVJBQ1RFUiBQSElOVEhVCisgICAgdSdcdWZmZmUnICAgIyAgMHhEQiAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweERDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4REQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhERSAtPiBVTkRFRklORUQKKyAgICB1J1x1MGUzZicgICAjICAweERGIC0+IFRIQUkgQ1VSUkVOQ1kgU1lNQk9MIEJBSFQKKyAgICB1J1x1MGU0MCcgICAjICAweEUwIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgRQorICAgIHUnXHUwZTQxJyAgICMgIDB4RTEgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBRQorICAgIHUnXHUwZTQyJyAgICMgIDB4RTIgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBPCisgICAgdSdcdTBlNDMnICAgIyAgMHhFMyAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1VQU4KKyAgICB1J1x1MGU0NCcgICAjICAweEU0IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUkgTUFJTUFMQUkKKyAgICB1J1x1MGU0NScgICAjICAweEU1IC0+IFRIQUkgQ0hBUkFDVEVSIExBS0tIQU5HWUFPCisgICAgdSdcdTBlNDYnICAgIyAgMHhFNiAtPiBUSEFJIENIQVJBQ1RFUiBNQUlZQU1PSworICAgIHUnXHUwZTQ3JyAgICMgIDB4RTcgLT4gVEhBSSBDSEFSQUNURVIgTUFJVEFJS0hVCisgICAgdSdcdTBlNDgnICAgIyAgMHhFOCAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgRUsKKyAgICB1J1x1MGU0OScgICAjICAweEU5IC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBUSE8KKyAgICB1J1x1MGU0YScgICAjICAweEVBIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBUUkkKKyAgICB1J1x1MGU0YicgICAjICAweEVCIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBDSEFUVEFXQQorICAgIHUnXHUwZTRjJyAgICMgIDB4RUMgLT4gVEhBSSBDSEFSQUNURVIgVEhBTlRIQUtIQVQKKyAgICB1J1x1MGU0ZCcgICAjICAweEVEIC0+IFRIQUkgQ0hBUkFDVEVSIE5JS0hBSElUCisgICAgdSdcdTBlNGUnICAgIyAgMHhFRSAtPiBUSEFJIENIQVJBQ1RFUiBZQU1BS0tBTgorICAgIHUnXHUwZTRmJyAgICMgIDB4RUYgLT4gVEhBSSBDSEFSQUNURVIgRk9OR01BTgorICAgIHUnXHUwZTUwJyAgICMgIDB4RjAgLT4gVEhBSSBESUdJVCBaRVJPCisgICAgdSdcdTBlNTEnICAgIyAgMHhGMSAtPiBUSEFJIERJR0lUIE9ORQorICAgIHUnXHUwZTUyJyAgICMgIDB4RjIgLT4gVEhBSSBESUdJVCBUV08KKyAgICB1J1x1MGU1MycgICAjICAweEYzIC0+IFRIQUkgRElHSVQgVEhSRUUKKyAgICB1J1x1MGU1NCcgICAjICAweEY0IC0+IFRIQUkgRElHSVQgRk9VUgorICAgIHUnXHUwZTU1JyAgICMgIDB4RjUgLT4gVEhBSSBESUdJVCBGSVZFCisgICAgdSdcdTBlNTYnICAgIyAgMHhGNiAtPiBUSEFJIERJR0lUIFNJWAorICAgIHUnXHUwZTU3JyAgICMgIDB4RjcgLT4gVEhBSSBESUdJVCBTRVZFTgorICAgIHUnXHUwZTU4JyAgICMgIDB4RjggLT4gVEhBSSBESUdJVCBFSUdIVAorICAgIHUnXHUwZTU5JyAgICMgIDB4RjkgLT4gVEhBSSBESUdJVCBOSU5FCisgICAgdSdcdTBlNWEnICAgIyAgMHhGQSAtPiBUSEFJIENIQVJBQ1RFUiBBTkdLSEFOS0hVCisgICAgdSdcdTBlNWInICAgIyAgMHhGQiAtPiBUSEFJIENIQVJBQ1RFUiBLSE9NVVQKKyAgICB1J1x1ZmZmZScgICAjICAweEZDIC0+IFVOREVGSU5FRAorICAgIHUnXHVmZmZlJyAgICMgIDB4RkQgLT4gVU5ERUZJTkVECisgICAgdSdcdWZmZmUnICAgIyAgMHhGRSAtPiBVTkRFRklORUQKKyAgICB1J1x1ZmZmZScgICAjICAweEZGIC0+IFVOREVGSU5FRAorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTIwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjZTIwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmIxNjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvY3A4NzUucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgY3A4NzUgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvTUlDU0ZUL0VCQ0RJQy9DUDg3NS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdjcDg3NScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHg5YycgICAgICMgIDB4MDQgLT4gQ09OVFJPTAorICAgIHUnXHQnICAgICAgICMgIDB4MDUgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdceDg2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MCisgICAgdSdceDdmJyAgICAgIyAgMHgwNyAtPiBERUxFVEUKKyAgICB1J1x4OTcnICAgICAjICAweDA4IC0+IENPTlRST0wKKyAgICB1J1x4OGQnICAgICAjICAweDA5IC0+IENPTlRST0wKKyAgICB1J1x4OGUnICAgICAjICAweDBBIC0+IENPTlRST0wKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4OWQnICAgICAjICAweDE0IC0+IENPTlRST0wKKyAgICB1J1x4ODUnICAgICAjICAweDE1IC0+IENPTlRST0wKKyAgICB1J1x4MDgnICAgICAjICAweDE2IC0+IEJBQ0tTUEFDRQorICAgIHUnXHg4NycgICAgICMgIDB4MTcgLT4gQ09OVFJPTAorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDkyJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MCisgICAgdSdceDhmJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnXHg4MCcgICAgICMgIDB4MjAgLT4gQ09OVFJPTAorICAgIHUnXHg4MScgICAgICMgIDB4MjEgLT4gQ09OVFJPTAorICAgIHUnXHg4MicgICAgICMgIDB4MjIgLT4gQ09OVFJPTAorICAgIHUnXHg4MycgICAgICMgIDB4MjMgLT4gQ09OVFJPTAorICAgIHUnXHg4NCcgICAgICMgIDB4MjQgLT4gQ09OVFJPTAorICAgIHUnXG4nICAgICAgICMgIDB4MjUgLT4gTElORSBGRUVECisgICAgdSdceDE3JyAgICAgIyAgMHgyNiAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDFiJyAgICAgIyAgMHgyNyAtPiBFU0NBUEUKKyAgICB1J1x4ODgnICAgICAjICAweDI4IC0+IENPTlRST0wKKyAgICB1J1x4ODknICAgICAjICAweDI5IC0+IENPTlRST0wKKyAgICB1J1x4OGEnICAgICAjICAweDJBIC0+IENPTlRST0wKKyAgICB1J1x4OGInICAgICAjICAweDJCIC0+IENPTlRST0wKKyAgICB1J1x4OGMnICAgICAjICAweDJDIC0+IENPTlRST0wKKyAgICB1J1x4MDUnICAgICAjICAweDJEIC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDJFIC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgyRiAtPiBCRUxMCisgICAgdSdceDkwJyAgICAgIyAgMHgzMCAtPiBDT05UUk9MCisgICAgdSdceDkxJyAgICAgIyAgMHgzMSAtPiBDT05UUk9MCisgICAgdSdceDE2JyAgICAgIyAgMHgzMiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDkzJyAgICAgIyAgMHgzMyAtPiBDT05UUk9MCisgICAgdSdceDk0JyAgICAgIyAgMHgzNCAtPiBDT05UUk9MCisgICAgdSdceDk1JyAgICAgIyAgMHgzNSAtPiBDT05UUk9MCisgICAgdSdceDk2JyAgICAgIyAgMHgzNiAtPiBDT05UUk9MCisgICAgdSdceDA0JyAgICAgIyAgMHgzNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDk4JyAgICAgIyAgMHgzOCAtPiBDT05UUk9MCisgICAgdSdceDk5JyAgICAgIyAgMHgzOSAtPiBDT05UUk9MCisgICAgdSdceDlhJyAgICAgIyAgMHgzQSAtPiBDT05UUk9MCisgICAgdSdceDliJyAgICAgIyAgMHgzQiAtPiBDT05UUk9MCisgICAgdSdceDE0JyAgICAgIyAgMHgzQyAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgzRCAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHg5ZScgICAgICMgIDB4M0UgLT4gQ09OVFJPTAorICAgIHUnXHgxYScgICAgICMgIDB4M0YgLT4gU1VCU1RJVFVURQorICAgIHUnICcgICAgICAgICMgIDB4NDAgLT4gU1BBQ0UKKyAgICB1J1x1MDM5MScgICAjICAweDQxIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBCisgICAgdSdcdTAzOTInICAgIyAgMHg0MiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzOTMnICAgIyAgMHg0MyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwMzk0JyAgICMgIDB4NDQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDM5NScgICAjICAweDQ1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MDM5NicgICAjICAweDQ2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDM5NycgICAjICAweDQ3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorICAgIHUnXHUwMzk4JyAgICMgIDB4NDggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDM5OScgICAjICAweDQ5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEKKyAgICB1J1snICAgICAgICAjICAweDRBIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1Jy4nICAgICAgICAjICAweDRCIC0+IEZVTEwgU1RPUAorICAgIHUnPCcgICAgICAgICMgIDB4NEMgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1JygnICAgICAgICAjICAweDREIC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JysnICAgICAgICAjICAweDRFIC0+IFBMVVMgU0lHTgorICAgIHUnIScgICAgICAgICMgIDB4NEYgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnJicgICAgICAgICMgIDB4NTAgLT4gQU1QRVJTQU5ECisgICAgdSdcdTAzOWEnICAgIyAgMHg1MSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQorICAgIHUnXHUwMzliJyAgICMgIDB4NTIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKyAgICB1J1x1MDM5YycgICAjICAweDUzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCisgICAgdSdcdTAzOWQnICAgIyAgMHg1NCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQorICAgIHUnXHUwMzllJyAgICMgIDB4NTUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKyAgICB1J1x1MDM5ZicgICAjICAweDU2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNhMCcgICAjICAweDU3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCisgICAgdSdcdTAzYTEnICAgIyAgMHg1OCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKyAgICB1J1x1MDNhMycgICAjICAweDU5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSddJyAgICAgICAgIyAgMHg1QSAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnJCcgICAgICAgICMgIDB4NUIgLT4gRE9MTEFSIFNJR04KKyAgICB1JyonICAgICAgICAjICAweDVDIC0+IEFTVEVSSVNLCisgICAgdScpJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnOycgICAgICAgICMgIDB4NUUgLT4gU0VNSUNPTE9OCisgICAgdSdeJyAgICAgICAgIyAgMHg1RiAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnLScgICAgICAgICMgIDB4NjAgLT4gSFlQSEVOLU1JTlVTCisgICAgdScvJyAgICAgICAgIyAgMHg2MSAtPiBTT0xJRFVTCisgICAgdSdcdTAzYTQnICAgIyAgMHg2MiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNhNScgICAjICAweDYzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNhNicgICAjICAweDY0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwM2E3JyAgICMgIDB4NjUgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCisgICAgdSdcdTAzYTgnICAgIyAgMHg2NiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNhOScgICAjICAweDY3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYWEnICAgIyAgMHg2OCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYWInICAgIyAgMHg2OSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSd8JyAgICAgICAgIyAgMHg2QSAtPiBWRVJUSUNBTCBMSU5FCisgICAgdScsJyAgICAgICAgIyAgMHg2QiAtPiBDT01NQQorICAgIHUnJScgICAgICAgICMgIDB4NkMgLT4gUEVSQ0VOVCBTSUdOCisgICAgdSdfJyAgICAgICAgIyAgMHg2RCAtPiBMT1cgTElORQorICAgIHUnPicgICAgICAgICMgIDB4NkUgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDZGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YTgnICAgICAjICAweDcwIC0+IERJQUVSRVNJUworICAgIHUnXHUwMzg2JyAgICMgIDB4NzEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHUwMzg4JyAgICMgIDB4NzIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgRVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzODknICAgIyAgMHg3MyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHhhMCcgICAgICMgIDB4NzQgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDM4YScgICAjICAweDc1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIElPVEEgV0lUSCBUT05PUworICAgIHUnXHUwMzhjJyAgICMgIDB4NzYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGUnICAgIyAgMHg3NyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4ZicgICAjICAweDc4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J2AnICAgICAgICAjICAweDc5IC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnOicgICAgICAgICMgIDB4N0EgLT4gQ09MT04KKyAgICB1JyMnICAgICAgICAjICAweDdCIC0+IE5VTUJFUiBTSUdOCisgICAgdSdAJyAgICAgICAgIyAgMHg3QyAtPiBDT01NRVJDSUFMIEFUCisgICAgdSInIiAgICAgICAgIyAgMHg3RCAtPiBBUE9TVFJPUEhFCisgICAgdSc9JyAgICAgICAgIyAgMHg3RSAtPiBFUVVBTFMgU0lHTgorICAgIHUnIicgICAgICAgICMgIDB4N0YgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDM4NScgICAjICAweDgwIC0+IEdSRUVLIERJQUxZVElLQSBUT05PUworICAgIHUnYScgICAgICAgICMgIDB4ODEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDgyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg4MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4ODQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDg1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg4NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnXHUwM2IxJyAgICMgIDB4OEEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBCisgICAgdSdcdTAzYjInICAgIyAgMHg4QiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQkVUQQorICAgIHUnXHUwM2IzJyAgICMgIDB4OEMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzYjQnICAgIyAgMHg4RCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDNiNScgICAjICAweDhFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzYjYnICAgIyAgMHg4RiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgWkVUQQorICAgIHUnXHhiMCcgICAgICMgIDB4OTAgLT4gREVHUkVFIFNJR04KKyAgICB1J2onICAgICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J1x1MDNiNycgICAjICAweDlBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICB1J1x1MDNiOCcgICAjICAweDlCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2I5JyAgICMgIDB4OUMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDNiYScgICAjICAweDlEIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIHUnXHUwM2JiJyAgICMgIDB4OUUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzYmMnICAgIyAgMHg5RiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICB1J1x4YjQnICAgICAjICAweEEwIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnficgICAgICAgICMgIDB4QTEgLT4gVElMREUKKyAgICB1J3MnICAgICAgICAjICAweEEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHhBMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4QTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweEE1IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHhBNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4QTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweEE4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHhBOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUnXHUwM2JkJyAgICMgIDB4QUEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE5VCisgICAgdSdcdTAzYmUnICAgIyAgMHhBQiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgWEkKKyAgICB1J1x1MDNiZicgICAjICAweEFDIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OCisgICAgdSdcdTAzYzAnICAgIyAgMHhBRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MDNjMScgICAjICAweEFFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBSSE8KKyAgICB1J1x1MDNjMycgICAjICAweEFGIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHhhMycgICAgICMgIDB4QjAgLT4gUE9VTkQgU0lHTgorICAgIHUnXHUwM2FjJyAgICMgIDB4QjEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZCcgICAjICAweEIyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNhZScgICAjICAweEIzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwM2NhJyAgICMgIDB4QjQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNhZicgICAjICAweEI1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjYycgICAjICAweEI2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjZCcgICAjICAweEI3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjYicgICAjICAweEI4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzY2UnICAgIyAgMHhCOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHUwM2MyJyAgICMgIDB4QkEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEZJTkFMIFNJR01BCisgICAgdSdcdTAzYzQnICAgIyAgMHhCQiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVEFVCisgICAgdSdcdTAzYzUnICAgIyAgMHhCQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTgorICAgIHUnXHUwM2M2JyAgICMgIDB4QkQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBISQorICAgIHUnXHUwM2M3JyAgICMgIDB4QkUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIENISQorICAgIHUnXHUwM2M4JyAgICMgIDB4QkYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBTSQorICAgIHUneycgICAgICAgICMgIDB4QzAgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSdBJyAgICAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHhDOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdceGFkJyAgICAgIyAgMHhDQSAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHUwM2M5JyAgICMgIDB4Q0IgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzOTAnICAgIyAgMHhDQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICB1J1x1MDNiMCcgICAjICAweENEIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIHUnXHUyMDE4JyAgICMgIDB4Q0UgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxNScgICAjICAweENGIC0+IEhPUklaT05UQUwgQkFSCisgICAgdSd9JyAgICAgICAgIyAgMHhEMCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSdKJyAgICAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHhENyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdceGIxJyAgICAgIyAgMHhEQSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YmQnICAgICAjICAweERCIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHgxYScgICAgICMgIDB4REMgLT4gU1VCU1RJVFVURQorICAgIHUnXHUwMzg3JyAgICMgIDB4REQgLT4gR1JFRUsgQU5PIFRFTEVJQQorICAgIHUnXHUyMDE5JyAgICMgIDB4REUgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGE2JyAgICAgIyAgMHhERiAtPiBCUk9LRU4gQkFSCisgICAgdSdcXCcgICAgICAgIyAgMHhFMCAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J1x4MWEnICAgICAjICAweEUxIC0+IFNVQlNUSVRVVEUKKyAgICB1J1MnICAgICAgICAjICAweEUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweEUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweEU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweEU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweEU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweEU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweEU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1x4YjInICAgICAjICAweEVBIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhhNycgICAgICMgIDB4RUIgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceDFhJyAgICAgIyAgMHhFQyAtPiBTVUJTVElUVVRFCisgICAgdSdceDFhJyAgICAgIyAgMHhFRCAtPiBTVUJTVElUVVRFCisgICAgdSdceGFiJyAgICAgIyAgMHhFRSAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4RUYgLT4gTk9UIFNJR04KKyAgICB1JzAnICAgICAgICAjICAweEYwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweEYxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4RjIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHhGMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4RjQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4RjUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4RjYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHhGNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4RjggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweEY5IC0+IERJR0lUIE5JTkUKKyAgICB1J1x4YjMnICAgICAjICAweEZBIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGE5JyAgICAgIyAgMHhGQiAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHgxYScgICAgICMgIDB4RkMgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYScgICAgICMgIDB4RkQgLT4gU1VCU1RJVFVURQorICAgIHUnXHhiYicgICAgICMgIDB4RkUgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceDlmJyAgICAgIyAgMHhGRiAtPiBDT05UUk9MCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyMGVjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc1LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDg3NS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcyMGVjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwODc1LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTMyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMWY1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGNwOTMyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5MzIKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnY3A5MzInKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A5MzInLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxYTNjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTMyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDkzMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxYTNjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTMyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTQ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2M4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGNwOTQ5LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5NDkKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2tyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19rci5nZXRjb2RlYygnY3A5NDknKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A5NDknLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyZjRhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTQ5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk0OS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUyZjRhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTQ5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTUwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZWVjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGNwOTUwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5NTAKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX3R3LCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc190dy5nZXRjb2RlYygnY3A5NTAnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nY3A5NTAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3ODFlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTUwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9jcDk1MC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3ODFlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2NwOTUwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJiODdhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGV1Y19qaXNfMjAwNC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEVVQ19KSVNfMjAwNAorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfanAsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2pwLmdldGNvZGVjKCdldWNfamlzXzIwMDQnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZXVjX2ppc18yMDA0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc18yMDA0LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNzJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc18yMDA0LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNzJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDdkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBldWNfamlzeDAyMTMucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBFVUNfSklTWDAyMTMKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnZXVjX2ppc3gwMjEzJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2V1Y19qaXN4MDIxMycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGQ4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMGQ4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qcC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19qcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmNiZTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2pwLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgZXVjX2pwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgRVVDX0pQCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ2V1Y19qcCcpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdldWNfanAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfanAucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2pwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBhZWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2pwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfanAucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2pwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDBhZWNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2pwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfa3IucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9ldWNfa3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmYjEyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19rci5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGV1Y19rci5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEVVQ19LUgorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3Nfa3IsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2tyLmdldGNvZGVjKCdldWNfa3InKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZXVjX2tyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2tyLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19rci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5OWNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19rci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZXVjX2tyLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19rci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY5OWNhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2V1Y19rci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IxODAzMC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMTgwMzAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmYjZjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMTgwMzAucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBnYjE4MDMwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgR0IxODAzMAorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfY24sIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2NuLmdldGNvZGVjKCdnYjE4MDMwJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2diMTgwMzAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMTgwMzAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTA2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMTgwMzAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMTA2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjE4MDMwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjIzMTIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYjIzMTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzYjgzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMjMxMi5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGdiMjMxMi5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEdCMjMxMgorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfY24sIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2NuLmdldGNvZGVjKCdnYjIzMTInKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZ2IyMzEyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IyMzEyLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMjMxMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzODQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMjMxMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2IyMzEyLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMjMxMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzODQ0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diMjMxMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2JrLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvZ2JrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNDVkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYmsucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBnYmsucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBHQksKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2NuLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19jbi5nZXRjb2RlYygnZ2JrJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2diaycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diay5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYmsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzNmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYmsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2diay5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYmsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzNmZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9nYmsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hleF9jb2RlYy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hleF9jb2RlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWIzOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaGV4X2NvZGVjLnB5CkBAIC0wLDAgKzEsNzkgQEAKKyIiIiBQeXRob24gJ2hleF9jb2RlYycgQ29kZWMgLSAyLWRpZ2l0IGhleCBjb250ZW50IHRyYW5zZmVyIGVuY29kaW5nCisKKyAgICBVbmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIgY29kZWNzIHdoaWNoIHRhcmdldCBVbmljb2RlLCB0aGlzIGNvZGVjCisgICAgd2lsbCByZXR1cm4gUHl0aG9uIHN0cmluZyBvYmplY3RzIGZvciBib3RoIGVuY29kZSBhbmQgZGVjb2RlLgorCisgICAgV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyIiIgoraW1wb3J0IGNvZGVjcywgYmluYXNjaWkKKworIyMjIENvZGVjIEFQSXMKKworZGVmIGhleF9lbmNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBFbmNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgb3V0cHV0ID0gYmluYXNjaWkuYjJhX2hleChpbnB1dCkKKyAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKKworZGVmIGhleF9kZWNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBEZWNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgYmZfZ2V0cmVhZGJ1ZgorICAgICAgICBidWZmZXIgc2xvdC4gUHl0aG9uIHN0cmluZ3MsIGJ1ZmZlciBvYmplY3RzIGFuZCBtZW1vcnkKKyAgICAgICAgbWFwcGVkIGZpbGVzIGFyZSBleGFtcGxlcyBvZiBvYmplY3RzIHByb3ZpZGluZyB0aGlzIHNsb3QuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIG91dHB1dCA9IGJpbmFzY2lpLmEyYl9oZXgoaW5wdXQpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBoZXhfZW5jb2RlKGlucHV0LGVycm9ycykKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBoZXhfZGVjb2RlKGlucHV0LGVycm9ycykKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuZXJyb3JzID09ICdzdHJpY3QnCisgICAgICAgIHJldHVybiBiaW5hc2NpaS5iMmFfaGV4KGlucHV0KQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBhc3NlcnQgc2VsZi5lcnJvcnMgPT0gJ3N0cmljdCcKKyAgICAgICAgcmV0dXJuIGJpbmFzY2lpLmEyYl9oZXgoaW5wdXQpCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naGV4JywKKyAgICAgICAgZW5jb2RlPWhleF9lbmNvZGUsCisgICAgICAgIGRlY29kZT1oZXhfZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hleF9jb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmQxOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hleF9jb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTM0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oZXhfY29kZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmFhYTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHBfcm9tYW44LnB5CkBAIC0wLDAgKzEsMTUyIEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdocF9yb21hbjgudHh0JyB3aXRoIGdlbmNvZGVjLnB5LgorCisgICAgQmFzZWQgb24gZGF0YSBmcm9tIGZ0cDovL2RrdXVnLmRrL2kxOG4vY2hhcm1hcHMvSFAtUk9NQU44IChLZWxkIFNpbW9uc2VuKQorCisgICAgT3JpZ2luYWwgc291cmNlOiBMYXNlckpldCBJSVAgUHJpbnRlciBVc2VyJ3MgTWFudWFsIEhQIHBhcnQgbm8KKyAgICAzMzQ3MS05MDkwMSwgSGV3bGV0LVBhY2thcmQsIEp1bmUgMTk4OS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ19tYXApCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX21hcClbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdocC1yb21hbjgnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgICAgIDB4MDBhMTogMHgwMGMwLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgICAgICAweDAwYTI6IDB4MDBjMiwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwYTM6IDB4MDBjOCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGE0OiAweDAwY2EsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGE1OiAweDAwY2IsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwYTY6IDB4MDBjZSwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwYTc6IDB4MDBjZiwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBhODogMHgwMGI0LCAjICAgICAgIEFDVVRFIEFDQ0VOVAorICAgICAgICAweDAwYTk6IDB4MDJjYiwgIyAgICAgICBNT0RJRklFUiBMRVRURVIgR1JBVkUgQUNDRU5UIChNYW5kYXJpbiBDaGluZXNlIGZvdXJ0aCB0b25lKQorICAgICAgICAweDAwYWE6IDB4MDJjNiwgIyAgICAgICBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICAgICAgMHgwMGFiOiAweDAwYTgsICMgICAgICAgRElBRVJFU0lTCisgICAgICAgIDB4MDBhYzogMHgwMmRjLCAjICAgICAgIFNNQUxMIFRJTERFCisgICAgICAgIDB4MDBhZDogMHgwMGQ5LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgICAgICAweDAwYWU6IDB4MDBkYiwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwYWY6IDB4MjBhNCwgIyAgICAgICBMSVJBIFNJR04KKyAgICAgICAgMHgwMGIwOiAweDAwYWYsICMgICAgICAgTUFDUk9OCisgICAgICAgIDB4MDBiMTogMHgwMGRkLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgICAgICAweDAwYjI6IDB4MDBmZCwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBiMzogMHgwMGIwLCAjICAgICAgIERFR1JFRSBTSUdOCisgICAgICAgIDB4MDBiNDogMHgwMGM3LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgICAgIDB4MDBiNTogMHgwMGU3LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwYjY6IDB4MDBkMSwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICAgICAgMHgwMGI3OiAweDAwZjEsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgICAgICAweDAwYjg6IDB4MDBhMSwgIyAgICAgICBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgICAgIDB4MDBiOTogMHgwMGJmLCAjICAgICAgIElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICAgICAgMHgwMGJhOiAweDAwYTQsICMgICAgICAgQ1VSUkVOQ1kgU0lHTgorICAgICAgICAweDAwYmI6IDB4MDBhMywgIyAgICAgICBQT1VORCBTSUdOCisgICAgICAgIDB4MDBiYzogMHgwMGE1LCAjICAgICAgIFlFTiBTSUdOCisgICAgICAgIDB4MDBiZDogMHgwMGE3LCAjICAgICAgIFNFQ1RJT04gU0lHTgorICAgICAgICAweDAwYmU6IDB4MDE5MiwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICAgICAgMHgwMGJmOiAweDAwYTIsICMgICAgICAgQ0VOVCBTSUdOCisgICAgICAgIDB4MDBjMDogMHgwMGUyLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwYzE6IDB4MDBlYSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGMyOiAweDAwZjQsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgICAgIDB4MDBjMzogMHgwMGZiLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwYzQ6IDB4MDBlMSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBjNTogMHgwMGU5LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGM2OiAweDAwZjMsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgICAgICAweDAwYzc6IDB4MDBmYSwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBjODogMHgwMGUwLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGM5OiAweDAwZTgsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgICAgICAweDAwY2E6IDB4MDBmMiwgIyAgICAgICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgICAgIDB4MDBjYjogMHgwMGY5LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGNjOiAweDAwZTQsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGNkOiAweDAwZWIsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGNlOiAweDAwZjYsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGNmOiAweDAwZmMsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGQwOiAweDAwYzUsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICAgICAgMHgwMGQxOiAweDAwZWUsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgICAgIDB4MDBkMjogMHgwMGQ4LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMGQzOiAweDAwYzYsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICAgICAgMHgwMGQ0OiAweDAwZTUsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgICAgIDB4MDBkNTogMHgwMGVkLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGQ2OiAweDAwZjgsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMGQ3OiAweDAwZTYsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgICAgIDB4MDBkODogMHgwMGM0LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGQ5OiAweDAwZWMsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgICAgICAweDAwZGE6IDB4MDBkNiwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBkYjogMHgwMGRjLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGRjOiAweDAwYzksICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBkZDogMHgwMGVmLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDBkZTogMHgwMGRmLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHZXJtYW4pCisgICAgICAgIDB4MDBkZjogMHgwMGQ0LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgICAgIDB4MDBlMDogMHgwMGMxLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgICAgICAweDAwZTE6IDB4MDBjMywgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICAgICAgMHgwMGUyOiAweDAwZTMsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgICAgICAweDAwZTM6IDB4MDBkMCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEggKEljZWxhbmRpYykKKyAgICAgICAgMHgwMGU0OiAweDAwZjAsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEVUSCAoSWNlbGFuZGljKQorICAgICAgICAweDAwZTU6IDB4MDBjZCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGU2OiAweDAwY2MsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgICAgIDB4MDBlNzogMHgwMGQzLCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgICAgICAweDAwZTg6IDB4MDBkMiwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICAgICAgMHgwMGU5OiAweDAwZDUsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgICAgIDB4MDBlYTogMHgwMGY1LCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAgICAgMHgwMGViOiAweDAxNjAsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgICAgIDB4MDBlYzogMHgwMTYxLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGVkOiAweDAwZGEsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBlZTogMHgwMTc4LCAjICAgICAgIExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGVmOiAweDAwZmYsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGYwOiAweDAwZGUsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4gKEljZWxhbmRpYykKKyAgICAgICAgMHgwMGYxOiAweDAwZmUsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOIChJY2VsYW5kaWMpCisgICAgICAgIDB4MDBmMjogMHgwMGI3LCAjICAgICAgIE1JRERMRSBET1QKKyAgICAgICAgMHgwMGYzOiAweDAwYjUsICMgICAgICAgTUlDUk8gU0lHTgorICAgICAgICAweDAwZjQ6IDB4MDBiNiwgIyAgICAgICBQSUxDUk9XIFNJR04KKyAgICAgICAgMHgwMGY1OiAweDAwYmUsICMgICAgICAgVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgICAgIDB4MDBmNjogMHgyMDE0LCAjICAgICAgIEVNIERBU0gKKyAgICAgICAgMHgwMGY3OiAweDAwYmMsICMgICAgICAgVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgICAgIDB4MDBmODogMHgwMGJkLCAjICAgICAgIFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgICAgICAweDAwZjk6IDB4MDBhYSwgIyAgICAgICBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgICAgICAweDAwZmE6IDB4MDBiYSwgIyAgICAgICBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICAgICAgMHgwMGZiOiAweDAwYWIsICMgICAgICAgTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMGZjOiAweDI1YTAsICMgICAgICAgQkxBQ0sgU1FVQVJFCisgICAgICAgIDB4MDBmZDogMHgwMGJiLCAjICAgICAgIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZmU6IDB4MDBiMSwgIyAgICAgICBQTFVTLU1JTlVTIFNJR04KKyAgICAgICAgMHgwMGZmOiBOb25lLAorfSkKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9lbmNvZGluZ19tYXAoZGVjb2RpbmdfbWFwKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHBfcm9tYW44LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5ZjFmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHBfcm9tYW44LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk5ZjFmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2hwX3JvbWFuOC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oei5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODM0NDJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBoei5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEhaCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19jbiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfY24uZ2V0Y29kZWMoJ2h6JykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2h6JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWUzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oei5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaHoucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWUzY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9oei5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaWRuYS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lkbmEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5MGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lkbmEucHkKQEAgLTAsMCArMSwyODggQEAKKyMgVGhpcyBtb2R1bGUgaW1wbGVtZW50cyB0aGUgUkZDcyAzNDkwIChJRE5BKSBhbmQgMzQ5MSAoTmFtZXByZXApCisKK2ltcG9ydCBzdHJpbmdwcmVwLCByZSwgY29kZWNzCitmcm9tIHVuaWNvZGVkYXRhIGltcG9ydCB1Y2RfM18yXzAgYXMgdW5pY29kZWRhdGEKKworIyBJRE5BIHNlY3Rpb24gMy4xCitkb3RzID0gcmUuY29tcGlsZSh1IltcdTAwMkVcdTMwMDJcdUZGMEVcdUZGNjFdIikKKworIyBJRE5BIHNlY3Rpb24gNQorYWNlX3ByZWZpeCA9ICJ4bi0tIgordWFjZV9wcmVmaXggPSB1bmljb2RlKGFjZV9wcmVmaXgsICJhc2NpaSIpCisKKyMgVGhpcyBhc3N1bWVzIHF1ZXJ5IHN0cmluZ3MsIHNvIEFsbG93VW5hc3NpZ25lZCBpcyB0cnVlCitkZWYgbmFtZXByZXAobGFiZWwpOgorICAgICMgTWFwCisgICAgbmV3bGFiZWwgPSBbXQorICAgIGZvciBjIGluIGxhYmVsOgorICAgICAgICBpZiBzdHJpbmdwcmVwLmluX3RhYmxlX2IxKGMpOgorICAgICAgICAgICAgIyBNYXAgdG8gbm90aGluZworICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbmV3bGFiZWwuYXBwZW5kKHN0cmluZ3ByZXAubWFwX3RhYmxlX2IyKGMpKQorICAgIGxhYmVsID0gdSIiLmpvaW4obmV3bGFiZWwpCisKKyAgICAjIE5vcm1hbGl6ZQorICAgIGxhYmVsID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORktDIiwgbGFiZWwpCisKKyAgICAjIFByb2hpYml0CisgICAgZm9yIGMgaW4gbGFiZWw6CisgICAgICAgIGlmIHN0cmluZ3ByZXAuaW5fdGFibGVfYzEyKGMpIG9yIFwKKyAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jMjIoYykgb3IgXAorICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2MzKGMpIG9yIFwKKyAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jNChjKSBvciBcCisgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzUoYykgb3IgXAorICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2M2KGMpIG9yIFwKKyAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jNyhjKSBvciBcCisgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzgoYykgb3IgXAorICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2M5KGMpOgorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJJbnZhbGlkIGNoYXJhY3RlciAlciIgJSBjKQorCisgICAgIyBDaGVjayBiaWRpCisgICAgUmFuZEFMID0gbWFwKHN0cmluZ3ByZXAuaW5fdGFibGVfZDEsIGxhYmVsKQorICAgIGZvciBjIGluIFJhbmRBTDoKKyAgICAgICAgaWYgYzoKKyAgICAgICAgICAgICMgVGhlcmUgaXMgYSBSYW5kQUwgY2hhciBpbiB0aGUgc3RyaW5nLiBNdXN0IHBlcmZvcm0gZnVydGhlcgorICAgICAgICAgICAgIyB0ZXN0czoKKyAgICAgICAgICAgICMgMSkgVGhlIGNoYXJhY3RlcnMgaW4gc2VjdGlvbiA1LjggTVVTVCBiZSBwcm9oaWJpdGVkLgorICAgICAgICAgICAgIyBUaGlzIGlzIHRhYmxlIEMuOCwgd2hpY2ggd2FzIGFscmVhZHkgY2hlY2tlZAorICAgICAgICAgICAgIyAyKSBJZiBhIHN0cmluZyBjb250YWlucyBhbnkgUmFuZEFMQ2F0IGNoYXJhY3RlciwgdGhlIHN0cmluZworICAgICAgICAgICAgIyBNVVNUIE5PVCBjb250YWluIGFueSBMQ2F0IGNoYXJhY3Rlci4KKyAgICAgICAgICAgIGlmIGZpbHRlcihzdHJpbmdwcmVwLmluX3RhYmxlX2QyLCBsYWJlbCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJWaW9sYXRpb24gb2YgQklESSByZXF1aXJlbWVudCAyIikKKworICAgICAgICAgICAgIyAzKSBJZiBhIHN0cmluZyBjb250YWlucyBhbnkgUmFuZEFMQ2F0IGNoYXJhY3RlciwgYQorICAgICAgICAgICAgIyBSYW5kQUxDYXQgY2hhcmFjdGVyIE1VU1QgYmUgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUKKyAgICAgICAgICAgICMgc3RyaW5nLCBhbmQgYSBSYW5kQUxDYXQgY2hhcmFjdGVyIE1VU1QgYmUgdGhlIGxhc3QKKyAgICAgICAgICAgICMgY2hhcmFjdGVyIG9mIHRoZSBzdHJpbmcuCisgICAgICAgICAgICBpZiBub3QgUmFuZEFMWzBdIG9yIG5vdCBSYW5kQUxbLTFdOgorICAgICAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMyIpCisKKyAgICByZXR1cm4gbGFiZWwKKworZGVmIFRvQVNDSUkobGFiZWwpOgorICAgIHRyeToKKyAgICAgICAgIyBTdGVwIDE6IHRyeSBBU0NJSQorICAgICAgICBsYWJlbCA9IGxhYmVsLmVuY29kZSgiYXNjaWkiKQorICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICAjIFNraXAgdG8gc3RlcCAzOiBVc2VTVEQzQVNDSUlSdWxlcyBpcyBmYWxzZSwgc28KKyAgICAgICAgIyBTa2lwIHRvIHN0ZXAgOC4KKyAgICAgICAgaWYgMCA8IGxlbihsYWJlbCkgPCA2NDoKKyAgICAgICAgICAgIHJldHVybiBsYWJlbAorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoImxhYmVsIGVtcHR5IG9yIHRvbyBsb25nIikKKworICAgICMgU3RlcCAyOiBuYW1lcHJlcAorICAgIGxhYmVsID0gbmFtZXByZXAobGFiZWwpCisKKyAgICAjIFN0ZXAgMzogVXNlU1REM0FTQ0lJUnVsZXMgaXMgZmFsc2UKKyAgICAjIFN0ZXAgNDogdHJ5IEFTQ0lJCisgICAgdHJ5OgorICAgICAgICBsYWJlbCA9IGxhYmVsLmVuY29kZSgiYXNjaWkiKQorICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICAjIFNraXAgdG8gc3RlcCA4LgorICAgICAgICBpZiAwIDwgbGVuKGxhYmVsKSA8IDY0OgorICAgICAgICAgICAgcmV0dXJuIGxhYmVsCisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigibGFiZWwgZW1wdHkgb3IgdG9vIGxvbmciKQorCisgICAgIyBTdGVwIDU6IENoZWNrIEFDRSBwcmVmaXgKKyAgICBpZiBsYWJlbC5zdGFydHN3aXRoKHVhY2VfcHJlZml4KToKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJMYWJlbCBzdGFydHMgd2l0aCBBQ0UgcHJlZml4IikKKworICAgICMgU3RlcCA2OiBFbmNvZGUgd2l0aCBQVU5ZQ09ERQorICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCJwdW55Y29kZSIpCisKKyAgICAjIFN0ZXAgNzogUHJlcGVuZCBBQ0UgcHJlZml4CisgICAgbGFiZWwgPSBhY2VfcHJlZml4ICsgbGFiZWwKKworICAgICMgU3RlcCA4OiBDaGVjayBzaXplCisgICAgaWYgMCA8IGxlbihsYWJlbCkgPCA2NDoKKyAgICAgICAgcmV0dXJuIGxhYmVsCisgICAgcmFpc2UgVW5pY29kZUVycm9yKCJsYWJlbCBlbXB0eSBvciB0b28gbG9uZyIpCisKK2RlZiBUb1VuaWNvZGUobGFiZWwpOgorICAgICMgU3RlcCAxOiBDaGVjayBmb3IgQVNDSUkKKyAgICBpZiBpc2luc3RhbmNlKGxhYmVsLCBzdHIpOgorICAgICAgICBwdXJlX2FzY2lpID0gVHJ1ZQorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxhYmVsID0gbGFiZWwuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICBwdXJlX2FzY2lpID0gVHJ1ZQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcHVyZV9hc2NpaSA9IEZhbHNlCisgICAgaWYgbm90IHB1cmVfYXNjaWk6CisgICAgICAgICMgU3RlcCAyOiBQZXJmb3JtIG5hbWVwcmVwCisgICAgICAgIGxhYmVsID0gbmFtZXByZXAobGFiZWwpCisgICAgICAgICMgSXQgZG9lc24ndCBzYXkgdGhpcywgYnV0IGFwcGFyZW50bHksIGl0IHNob3VsZCBiZSBBU0NJSSBub3cKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSW52YWxpZCBjaGFyYWN0ZXIgaW4gSUROIGxhYmVsIikKKyAgICAjIFN0ZXAgMzogQ2hlY2sgZm9yIEFDRSBwcmVmaXgKKyAgICBpZiBub3QgbGFiZWwuc3RhcnRzd2l0aChhY2VfcHJlZml4KToKKyAgICAgICAgcmV0dXJuIHVuaWNvZGUobGFiZWwsICJhc2NpaSIpCisKKyAgICAjIFN0ZXAgNDogUmVtb3ZlIEFDRSBwcmVmaXgKKyAgICBsYWJlbDEgPSBsYWJlbFtsZW4oYWNlX3ByZWZpeCk6XQorCisgICAgIyBTdGVwIDU6IERlY29kZSB1c2luZyBQVU5ZQ09ERQorICAgIHJlc3VsdCA9IGxhYmVsMS5kZWNvZGUoInB1bnljb2RlIikKKworICAgICMgU3RlcCA2OiBBcHBseSBUb0FTQ0lJCisgICAgbGFiZWwyID0gVG9BU0NJSShyZXN1bHQpCisKKyAgICAjIFN0ZXAgNzogQ29tcGFyZSB0aGUgcmVzdWx0IG9mIHN0ZXAgNiB3aXRoIHRoZSBvbmUgb2Ygc3RlcCAzCisgICAgIyBsYWJlbDIgd2lsbCBhbHJlYWR5IGJlIGluIGxvd2VyIGNhc2UuCisgICAgaWYgbGFiZWwubG93ZXIoKSAhPSBsYWJlbDI6CisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSUROQSBkb2VzIG5vdCByb3VuZC10cmlwIiwgbGFiZWwsIGxhYmVsMikKKworICAgICMgU3RlcCA4OiByZXR1cm4gdGhlIHJlc3VsdCBvZiBzdGVwIDUKKyAgICByZXR1cm4gcmVzdWx0CisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgorICAgICAgICAgICAgIyBJRE5BIGlzIHF1aXRlIGNsZWFyIHRoYXQgaW1wbGVtZW50YXRpb25zIG11c3QgYmUgc3RyaWN0CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoInVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQorCisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIHJldHVybiAiIiwgMAorCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGxhYmVscyA9IGRvdHMuc3BsaXQoaW5wdXQpCisgICAgICAgIGlmIGxhYmVscyBhbmQgbGVuKGxhYmVsc1stMV0pPT0wOgorICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJy4nCisgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gJycKKyAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVG9BU0NJSShsYWJlbCkpCisgICAgICAgICMgSm9pbiB3aXRoIFUrMDAyRQorICAgICAgICByZXR1cm4gIi4iLmpvaW4ocmVzdWx0KSt0cmFpbGluZ19kb3QsIGxlbihpbnB1dCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorCisgICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMpCisKKyAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgcmV0dXJuIHUiIiwgMAorCisgICAgICAgICMgSUROQSBhbGxvd3MgZGVjb2RpbmcgdG8gb3BlcmF0ZSBvbiBVbmljb2RlIHN0cmluZ3MsIHRvby4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbnB1dCwgdW5pY29kZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBkb3RzLnNwbGl0KGlucHV0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBNdXN0IGJlIEFTQ0lJIHN0cmluZworICAgICAgICAgICAgaW5wdXQgPSBzdHIoaW5wdXQpCisgICAgICAgICAgICB1bmljb2RlKGlucHV0LCAiYXNjaWkiKQorICAgICAgICAgICAgbGFiZWxzID0gaW5wdXQuc3BsaXQoIi4iKQorCisgICAgICAgIGlmIGxhYmVscyBhbmQgbGVuKGxhYmVsc1stMV0pID09IDA6CisgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCisgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScnCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVG9Vbmljb2RlKGxhYmVsKSkKKworICAgICAgICByZXR1cm4gdSIuIi5qb2luKHJlc3VsdCkrdHJhaWxpbmdfZG90LCBsZW4oaW5wdXQpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBfYnVmZmVyX2VuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzLCBmaW5hbCk6CisgICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKKyAgICAgICAgICAgICMgSUROQSBpcyBxdWl0ZSBjbGVhciB0aGF0IGltcGxlbWVudGF0aW9ucyBtdXN0IGJlIHN0cmljdAorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJ1bnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycykKKworICAgICAgICBpZiBub3QgaW5wdXQ6CisgICAgICAgICAgICByZXR1cm4gKCIiLCAwKQorCisgICAgICAgIGxhYmVscyA9IGRvdHMuc3BsaXQoaW5wdXQpCisgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJworICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgZWxpZiBub3QgZmluYWw6CisgICAgICAgICAgICAgICAgIyBLZWVwIHBvdGVudGlhbGx5IHVuZmluaXNoZWQgbGFiZWwgdW50aWwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCisgICAgICAgICAgICAgICAgaWYgbGFiZWxzOgorICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSAnLicKKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBzaXplID0gMAorICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChUb0FTQ0lJKGxhYmVsKSkKKyAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgc2l6ZSArPSAxCisgICAgICAgICAgICBzaXplICs9IGxlbihsYWJlbCkKKworICAgICAgICAjIEpvaW4gd2l0aCBVKzAwMkUKKyAgICAgICAgcmVzdWx0ID0gIi4iLmpvaW4ocmVzdWx0KSArIHRyYWlsaW5nX2RvdAorICAgICAgICBzaXplICs9IGxlbih0cmFpbGluZ19kb3QpCisgICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQorCisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIHJldHVybiAodSIiLCAwKQorCisgICAgICAgICMgSUROQSBhbGxvd3MgZGVjb2RpbmcgdG8gb3BlcmF0ZSBvbiBVbmljb2RlIHN0cmluZ3MsIHRvby4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbnB1dCwgdW5pY29kZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBkb3RzLnNwbGl0KGlucHV0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBNdXN0IGJlIEFTQ0lJIHN0cmluZworICAgICAgICAgICAgaW5wdXQgPSBzdHIoaW5wdXQpCisgICAgICAgICAgICB1bmljb2RlKGlucHV0LCAiYXNjaWkiKQorICAgICAgICAgICAgbGFiZWxzID0gaW5wdXQuc3BsaXQoIi4iKQorCisgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnJworICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICBpZiBub3QgbGFiZWxzWy0xXToKKyAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCisgICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgICAgIGVsaWYgbm90IGZpbmFsOgorICAgICAgICAgICAgICAgICMgS2VlcCBwb3RlbnRpYWxseSB1bmZpbmlzaGVkIGxhYmVsIHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgICAgIGlmIGxhYmVsczoKKyAgICAgICAgICAgICAgICAgICAgdHJhaWxpbmdfZG90ID0gdScuJworCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIHNpemUgPSAwCisgICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFRvVW5pY29kZShsYWJlbCkpCisgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgIHNpemUgKz0gMQorICAgICAgICAgICAgc2l6ZSArPSBsZW4obGFiZWwpCisKKyAgICAgICAgcmVzdWx0ID0gdSIuIi5qb2luKHJlc3VsdCkgKyB0cmFpbGluZ19kb3QKKyAgICAgICAgc2l6ZSArPSBsZW4odHJhaWxpbmdfZG90KQorICAgICAgICByZXR1cm4gKHJlc3VsdCwgc2l6ZSkKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpZG5hJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaWRuYS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pZG5hLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjk2MDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaWRuYS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaWRuYS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pZG5hLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjk2MDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaWRuYS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwNDA2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanAucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBpc28yMDIyX2pwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUAorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcCcpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYxYTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjYxYTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NzA0NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBpc28yMDIyX2pwXzEucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQXzEKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanBfMScpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwXzEnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjUwY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjUwY2I1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEwNmJmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGlzbzIwMjJfanBfMi5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfMgorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF8yJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanBfMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmUwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YmUwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDE5OGJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yMDA0LnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgaXNvMjAyMl9qcF8yMDA0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF8yMDA0CisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwXzIwMDQnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8yMDA0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yMDA0LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyN2JhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yMDA0LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyN2JhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NmUwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBpc28yMDIyX2pwXzMucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQXzMKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanBfMycpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwXzMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U0YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2U0YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmJhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIGlzbzIwMjJfanBfZXh0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF9FWFQKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKKworY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanBfZXh0JykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanBfZXh0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjQxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjQxNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9rci5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY3MDE4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBpc28yMDIyX2tyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9LUgorIworIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KKyMKKworaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9rcicpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2tyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9rci5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2tyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg1ODc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9rci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9rci5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc28yMDIyX2tyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODg1ODc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvMjAyMl9rci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYmMxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8xIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktMS5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTEnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGExJyAgICAgIyAgMHhBMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4YWEnICAgICAjICAweEFBIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGFiJyAgICAgIyAgMHhBQiAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QUMgLT4gTk9UIFNJR04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdceGFlJyAgICAgIyAgMHhBRSAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YWYnICAgICAjICAweEFGIC0+IE1BQ1JPTgorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHhiMicgICAgICMgIDB4QjIgLT4gU1VQRVJTQ1JJUFQgVFdPCisgICAgdSdceGIzJyAgICAgIyAgMHhCMyAtPiBTVVBFUlNDUklQVCBUSFJFRQorICAgIHUnXHhiNCcgICAgICMgIDB4QjQgLT4gQUNVVEUgQUNDRU5UCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x4YjknICAgICAjICAweEI5IC0+IFNVUEVSU0NSSVBUIE9ORQorICAgIHUnXHhiYScgICAgICMgIDB4QkEgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmMnICAgICAjICAweEJDIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCRSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x4YmYnICAgICAjICAweEJGIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMycgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkMCcgICAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRVRIIChJY2VsYW5kaWMpCisgICAgdSdceGQxJyAgICAgIyAgMHhEMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDInICAgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGQnICAgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhkZScgICAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVEhPUk4gKEljZWxhbmRpYykKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTIChHZXJtYW4pCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTMnICAgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTYnICAgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHhlNycgICAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU4JyAgICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVjJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYwJyAgICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRVRIIChJY2VsYW5kaWMpCisgICAgdSdceGYxJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYyJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhmOScgICAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmZCcgICAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhmZScgICAgICMgIDB4RkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOIChJY2VsYW5kaWMpCisgICAgdSdceGZmJyAgICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwM2IwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwM2IwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3ZTVjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTAucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8xMCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTEwLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktMTAnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAxMDQnICAgIyAgMHhBMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMTInICAgIyAgMHhBMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMjInICAgIyAgMHhBMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTJhJyAgICMgIDB4QTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTI4JyAgICMgIDB4QTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIFRJTERFCisgICAgdSdcdTAxMzYnICAgIyAgMHhBNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTAxM2InICAgIyAgMHhBOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTEwJyAgICMgIDB4QTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTYwJyAgICMgIDB4QUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxNjYnICAgIyAgMHhBQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggU1RST0tFCisgICAgdSdcdTAxN2QnICAgIyAgMHhBQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdTAxNmEnICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgdSdcdTAxNGEnICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkcKKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTAxMDUnICAgIyAgMHhCMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTEzJyAgICMgIDB4QjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICB1J1x1MDEyMycgICAjICAweEIzIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTJiJyAgICMgIDB4QjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MDEyOScgICAjICAweEI1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggVElMREUKKyAgICB1J1x1MDEzNycgICAjICAweEI2IC0+IExBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHUwMTNjJyAgICMgIDB4QjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMTEnICAgIyAgMHhCOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTYxJyAgICMgIDB4QkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTY3JyAgICMgIDB4QkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE3ZScgICAjICAweEJDIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MjAxNScgICAjICAweEJEIC0+IEhPUklaT05UQUwgQkFSCisgICAgdSdcdTAxNmInICAgIyAgMHhCRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTRiJyAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEVORworICAgIHUnXHUwMTAwJyAgICMgIDB4QzAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMycgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x1MDEyZScgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwYycgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhjOScgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTgnICAgIyAgMHhDQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMTYnICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGNkJyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhDRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQwJyAgICAgIyAgMHhEMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEggKEljZWxhbmRpYykKKyAgICB1J1x1MDE0NScgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgdSdcdTAxNGMnICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ1JyAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE2OCcgICAjICAweEQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBUSUxERQorICAgIHUnXHhkOCcgICAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTcyJyAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHhkYScgICAgICMgIDB4REEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkZCcgICAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGRlJyAgICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STiAoSWNlbGFuZGljKQorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMgKEdlcm1hbikKKyAgICB1J1x1MDEwMScgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTMnICAgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTYnICAgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHUwMTJmJyAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwZCcgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x1MDExOScgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTE3JyAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4ZWQnICAgICAjICAweEVEIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjAnICAgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEggKEljZWxhbmRpYykKKyAgICB1J1x1MDE0NicgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTRkJyAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNScgICAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmNicgICAgICMgIDB4RjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE2OScgICAjICAweEY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggVElMREUKKyAgICB1J1x4ZjgnICAgICAjICAweEY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdcdTAxNzMnICAgIyAgMHhGOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmZCcgICAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBBQ1VURQorICAgIHUnXHhmZScgICAgICMgIDB4RkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFRIT1JOIChJY2VsYW5kaWMpCisgICAgdSdcdTAxMzgnICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgS1JBCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDA0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDA0MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzExLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2VjZThkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMS5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzExIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktMTEuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS0xMScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MGUwMScgICAjICAweEExIC0+IFRIQUkgQ0hBUkFDVEVSIEtPIEtBSQorICAgIHUnXHUwZTAyJyAgICMgIDB4QTIgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIQUkKKyAgICB1J1x1MGUwMycgICAjICAweEEzIC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSFVBVAorICAgIHUnXHUwZTA0JyAgICMgIDB4QTQgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIV0FJCisgICAgdSdcdTBlMDUnICAgIyAgMHhBNSAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hPTgorICAgIHUnXHUwZTA2JyAgICMgIDB4QTYgLT4gVEhBSSBDSEFSQUNURVIgS0hPIFJBS0hBTkcKKyAgICB1J1x1MGUwNycgICAjICAweEE3IC0+IFRIQUkgQ0hBUkFDVEVSIE5HTyBOR1UKKyAgICB1J1x1MGUwOCcgICAjICAweEE4IC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSEFOCisgICAgdSdcdTBlMDknICAgIyAgMHhBOSAtPiBUSEFJIENIQVJBQ1RFUiBDSE8gQ0hJTkcKKyAgICB1J1x1MGUwYScgICAjICAweEFBIC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSEFORworICAgIHUnXHUwZTBiJyAgICMgIDB4QUIgLT4gVEhBSSBDSEFSQUNURVIgU08gU08KKyAgICB1J1x1MGUwYycgICAjICAweEFDIC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSE9FCisgICAgdSdcdTBlMGQnICAgIyAgMHhBRCAtPiBUSEFJIENIQVJBQ1RFUiBZTyBZSU5HCisgICAgdSdcdTBlMGUnICAgIyAgMHhBRSAtPiBUSEFJIENIQVJBQ1RFUiBETyBDSEFEQQorICAgIHUnXHUwZTBmJyAgICMgIDB4QUYgLT4gVEhBSSBDSEFSQUNURVIgVE8gUEFUQUsKKyAgICB1J1x1MGUxMCcgICAjICAweEIwIC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSEFOCisgICAgdSdcdTBlMTEnICAgIyAgMHhCMSAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gTkFOR01PTlRITworICAgIHUnXHUwZTEyJyAgICMgIDB4QjIgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFBIVVRIQU8KKyAgICB1J1x1MGUxMycgICAjICAweEIzIC0+IFRIQUkgQ0hBUkFDVEVSIE5PIE5FTgorICAgIHUnXHUwZTE0JyAgICMgIDB4QjQgLT4gVEhBSSBDSEFSQUNURVIgRE8gREVLCisgICAgdSdcdTBlMTUnICAgIyAgMHhCNSAtPiBUSEFJIENIQVJBQ1RFUiBUTyBUQU8KKyAgICB1J1x1MGUxNicgICAjICAweEI2IC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBUSFVORworICAgIHUnXHUwZTE3JyAgICMgIDB4QjcgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIQUhBTgorICAgIHUnXHUwZTE4JyAgICMgIDB4QjggLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIT05HCisgICAgdSdcdTBlMTknICAgIyAgMHhCOSAtPiBUSEFJIENIQVJBQ1RFUiBOTyBOVQorICAgIHUnXHUwZTFhJyAgICMgIDB4QkEgLT4gVEhBSSBDSEFSQUNURVIgQk8gQkFJTUFJCisgICAgdSdcdTBlMWInICAgIyAgMHhCQiAtPiBUSEFJIENIQVJBQ1RFUiBQTyBQTEEKKyAgICB1J1x1MGUxYycgICAjICAweEJDIC0+IFRIQUkgQ0hBUkFDVEVSIFBITyBQSFVORworICAgIHUnXHUwZTFkJyAgICMgIDB4QkQgLT4gVEhBSSBDSEFSQUNURVIgRk8gRkEKKyAgICB1J1x1MGUxZScgICAjICAweEJFIC0+IFRIQUkgQ0hBUkFDVEVSIFBITyBQSEFOCisgICAgdSdcdTBlMWYnICAgIyAgMHhCRiAtPiBUSEFJIENIQVJBQ1RFUiBGTyBGQU4KKyAgICB1J1x1MGUyMCcgICAjICAweEMwIC0+IFRIQUkgQ0hBUkFDVEVSIFBITyBTQU1QSEFPCisgICAgdSdcdTBlMjEnICAgIyAgMHhDMSAtPiBUSEFJIENIQVJBQ1RFUiBNTyBNQQorICAgIHUnXHUwZTIyJyAgICMgIDB4QzIgLT4gVEhBSSBDSEFSQUNURVIgWU8gWUFLCisgICAgdSdcdTBlMjMnICAgIyAgMHhDMyAtPiBUSEFJIENIQVJBQ1RFUiBSTyBSVUEKKyAgICB1J1x1MGUyNCcgICAjICAweEM0IC0+IFRIQUkgQ0hBUkFDVEVSIFJVCisgICAgdSdcdTBlMjUnICAgIyAgMHhDNSAtPiBUSEFJIENIQVJBQ1RFUiBMTyBMSU5HCisgICAgdSdcdTBlMjYnICAgIyAgMHhDNiAtPiBUSEFJIENIQVJBQ1RFUiBMVQorICAgIHUnXHUwZTI3JyAgICMgIDB4QzcgLT4gVEhBSSBDSEFSQUNURVIgV08gV0FFTgorICAgIHUnXHUwZTI4JyAgICMgIDB4QzggLT4gVEhBSSBDSEFSQUNURVIgU08gU0FMQQorICAgIHUnXHUwZTI5JyAgICMgIDB4QzkgLT4gVEhBSSBDSEFSQUNURVIgU08gUlVTSQorICAgIHUnXHUwZTJhJyAgICMgIDB4Q0EgLT4gVEhBSSBDSEFSQUNURVIgU08gU1VBCisgICAgdSdcdTBlMmInICAgIyAgMHhDQiAtPiBUSEFJIENIQVJBQ1RFUiBITyBISVAKKyAgICB1J1x1MGUyYycgICAjICAweENDIC0+IFRIQUkgQ0hBUkFDVEVSIExPIENIVUxBCisgICAgdSdcdTBlMmQnICAgIyAgMHhDRCAtPiBUSEFJIENIQVJBQ1RFUiBPIEFORworICAgIHUnXHUwZTJlJyAgICMgIDB4Q0UgLT4gVEhBSSBDSEFSQUNURVIgSE8gTk9LSFVLCisgICAgdSdcdTBlMmYnICAgIyAgMHhDRiAtPiBUSEFJIENIQVJBQ1RFUiBQQUlZQU5OT0kKKyAgICB1J1x1MGUzMCcgICAjICAweEQwIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQQorICAgIHUnXHUwZTMxJyAgICMgIDB4RDEgLT4gVEhBSSBDSEFSQUNURVIgTUFJIEhBTi1BS0FUCisgICAgdSdcdTBlMzInICAgIyAgMHhEMiAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFBCisgICAgdSdcdTBlMzMnICAgIyAgMHhEMyAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFNCisgICAgdSdcdTBlMzQnICAgIyAgMHhENCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEkKKyAgICB1J1x1MGUzNScgICAjICAweEQ1IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgSUkKKyAgICB1J1x1MGUzNicgICAjICAweEQ2IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVUUKKyAgICB1J1x1MGUzNycgICAjICAweEQ3IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVUVFCisgICAgdSdcdTBlMzgnICAgIyAgMHhEOCAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIFUKKyAgICB1J1x1MGUzOScgICAjICAweEQ5IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVVUKKyAgICB1J1x1MGUzYScgICAjICAweERBIC0+IFRIQUkgQ0hBUkFDVEVSIFBISU5USFUKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MGUzZicgICAjICAweERGIC0+IFRIQUkgQ1VSUkVOQ1kgU1lNQk9MIEJBSFQKKyAgICB1J1x1MGU0MCcgICAjICAweEUwIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgRQorICAgIHUnXHUwZTQxJyAgICMgIDB4RTEgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBRQorICAgIHUnXHUwZTQyJyAgICMgIDB4RTIgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBPCisgICAgdSdcdTBlNDMnICAgIyAgMHhFMyAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFJIE1BSU1VQU4KKyAgICB1J1x1MGU0NCcgICAjICAweEU0IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUkgTUFJTUFMQUkKKyAgICB1J1x1MGU0NScgICAjICAweEU1IC0+IFRIQUkgQ0hBUkFDVEVSIExBS0tIQU5HWUFPCisgICAgdSdcdTBlNDYnICAgIyAgMHhFNiAtPiBUSEFJIENIQVJBQ1RFUiBNQUlZQU1PSworICAgIHUnXHUwZTQ3JyAgICMgIDB4RTcgLT4gVEhBSSBDSEFSQUNURVIgTUFJVEFJS0hVCisgICAgdSdcdTBlNDgnICAgIyAgMHhFOCAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgRUsKKyAgICB1J1x1MGU0OScgICAjICAweEU5IC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBUSE8KKyAgICB1J1x1MGU0YScgICAjICAweEVBIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBUUkkKKyAgICB1J1x1MGU0YicgICAjICAweEVCIC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBDSEFUVEFXQQorICAgIHUnXHUwZTRjJyAgICMgIDB4RUMgLT4gVEhBSSBDSEFSQUNURVIgVEhBTlRIQUtIQVQKKyAgICB1J1x1MGU0ZCcgICAjICAweEVEIC0+IFRIQUkgQ0hBUkFDVEVSIE5JS0hBSElUCisgICAgdSdcdTBlNGUnICAgIyAgMHhFRSAtPiBUSEFJIENIQVJBQ1RFUiBZQU1BS0tBTgorICAgIHUnXHUwZTRmJyAgICMgIDB4RUYgLT4gVEhBSSBDSEFSQUNURVIgRk9OR01BTgorICAgIHUnXHUwZTUwJyAgICMgIDB4RjAgLT4gVEhBSSBESUdJVCBaRVJPCisgICAgdSdcdTBlNTEnICAgIyAgMHhGMSAtPiBUSEFJIERJR0lUIE9ORQorICAgIHUnXHUwZTUyJyAgICMgIDB4RjIgLT4gVEhBSSBESUdJVCBUV08KKyAgICB1J1x1MGU1MycgICAjICAweEYzIC0+IFRIQUkgRElHSVQgVEhSRUUKKyAgICB1J1x1MGU1NCcgICAjICAweEY0IC0+IFRIQUkgRElHSVQgRk9VUgorICAgIHUnXHUwZTU1JyAgICMgIDB4RjUgLT4gVEhBSSBESUdJVCBGSVZFCisgICAgdSdcdTBlNTYnICAgIyAgMHhGNiAtPiBUSEFJIERJR0lUIFNJWAorICAgIHUnXHUwZTU3JyAgICMgIDB4RjcgLT4gVEhBSSBESUdJVCBTRVZFTgorICAgIHUnXHUwZTU4JyAgICMgIDB4RjggLT4gVEhBSSBESUdJVCBFSUdIVAorICAgIHUnXHUwZTU5JyAgICMgIDB4RjkgLT4gVEhBSSBESUdJVCBOSU5FCisgICAgdSdcdTBlNWEnICAgIyAgMHhGQSAtPiBUSEFJIENIQVJBQ1RFUiBBTkdLSEFOS0hVCisgICAgdSdcdTBlNWInICAgIyAgMHhGQiAtPiBUSEFJIENIQVJBQ1RFUiBLSE9NVVQKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjZjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjZjQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYWRiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEzLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGlzbzg4NTlfMTMgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS0xMy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTEzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x4ODAnICAgICAjICAweDgwIC0+IDxjb250cm9sPgorICAgIHUnXHg4MScgICAgICMgIDB4ODEgLT4gPGNvbnRyb2w+CisgICAgdSdceDgyJyAgICAgIyAgMHg4MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODMnICAgICAjICAweDgzIC0+IDxjb250cm9sPgorICAgIHUnXHg4NCcgICAgICMgIDB4ODQgLT4gPGNvbnRyb2w+CisgICAgdSdceDg1JyAgICAgIyAgMHg4NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODYnICAgICAjICAweDg2IC0+IDxjb250cm9sPgorICAgIHUnXHg4NycgICAgICMgIDB4ODcgLT4gPGNvbnRyb2w+CisgICAgdSdceDg4JyAgICAgIyAgMHg4OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODknICAgICAjICAweDg5IC0+IDxjb250cm9sPgorICAgIHUnXHg4YScgICAgICMgIDB4OEEgLT4gPGNvbnRyb2w+CisgICAgdSdceDhiJyAgICAgIyAgMHg4QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGMnICAgICAjICAweDhDIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZCcgICAgICMgIDB4OEQgLT4gPGNvbnRyb2w+CisgICAgdSdceDhlJyAgICAgIyAgMHg4RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGYnICAgICAjICAweDhGIC0+IDxjb250cm9sPgorICAgIHUnXHg5MCcgICAgICMgIDB4OTAgLT4gPGNvbnRyb2w+CisgICAgdSdceDkxJyAgICAgIyAgMHg5MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTInICAgICAjICAweDkyIC0+IDxjb250cm9sPgorICAgIHUnXHg5MycgICAgICMgIDB4OTMgLT4gPGNvbnRyb2w+CisgICAgdSdceDk0JyAgICAgIyAgMHg5NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTUnICAgICAjICAweDk1IC0+IDxjb250cm9sPgorICAgIHUnXHg5NicgICAgICMgIDB4OTYgLT4gPGNvbnRyb2w+CisgICAgdSdceDk3JyAgICAgIyAgMHg5NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTgnICAgICAjICAweDk4IC0+IDxjb250cm9sPgorICAgIHUnXHg5OScgICAgICMgIDB4OTkgLT4gPGNvbnRyb2w+CisgICAgdSdceDlhJyAgICAgIyAgMHg5QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWInICAgICAjICAweDlCIC0+IDxjb250cm9sPgorICAgIHUnXHg5YycgICAgICMgIDB4OUMgLT4gPGNvbnRyb2w+CisgICAgdSdceDlkJyAgICAgIyAgMHg5RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWUnICAgICAjICAweDlFIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZicgICAgICMgIDB4OUYgLT4gPGNvbnRyb2w+CisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUyMDFkJyAgICMgIDB4QTEgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1MjAxZScgICAjICAweEE1IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhhNicgICAgICMgIDB4QTYgLT4gQlJPS0VOIEJBUgorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhBOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUwMTU2JyAgICMgIDB4QUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENFRElMTEEKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhjNicgICAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x1MjAxYycgICAjICAweEI0IC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4YjcnICAgICAjICAweEI3IC0+IE1JRERMRSBET1QKKyAgICB1J1x4ZjgnICAgICAjICAweEI4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x1MDE1NycgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJjJyAgICAgIyAgMHhCQyAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHhiZScgICAgICMgIDB4QkUgLT4gVlVMR0FSIEZSQUNUSU9OIFRIUkVFIFFVQVJURVJTCisgICAgdSdceGU2JyAgICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x1MDEwNCcgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEyZScgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwMCcgICAjICAweEMyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x1MDEwNicgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x1MDExOCcgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDExMicgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICB1J1x1MDEwYycgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhjOScgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzknICAgIyAgMHhDQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1MDExNicgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyMicgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMzYnICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTJhJyAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTNiJyAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2MCcgICAjICAweEQwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTQzJyAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDUnICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHhkMycgICAgICMgIDB4RDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNGMnICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggTUFDUk9OCisgICAgdSdceGQ1JyAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDE3MicgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE0MScgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE1YScgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTZhJyAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTdiJyAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTdkJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdceGRmJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUyAoR2VybWFuKQorICAgIHUnXHUwMTA1JyAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEyZicgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMDEnICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTA3JyAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTUnICAgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHUwMTE5JyAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDExMycgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMGQnICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxN2EnICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTcnICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTIzJyAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMzcnICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEyYicgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgdSdcdTAxM2MnICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2MScgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE0NCcgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0NicgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHUwMTRkJyAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTAxNzMnICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIE9HT05FSworICAgIHUnXHUwMTQyJyAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE1YicgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2YicgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTdjJyAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE3ZScgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MjAxOScgICAjICAweEZGIC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTA2NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzEzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTA2NmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xMy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY4NDNkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTQucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV8xNCBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTE0LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktMTQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTFlMDInICAgIyAgMHhBMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlMDMnICAgIyAgMHhBMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHUwMTBhJyAgICMgIDB4QTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTBiJyAgICMgIDB4QTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MWUwYScgICAjICAweEE2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUxZTgwJyAgICMgIDB4QTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEdSQVZFCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUxZTgyJyAgICMgIDB4QUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIEFDVVRFCisgICAgdSdcdTFlMGInICAgIyAgMHhBQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUxZWYyJyAgICMgIDB4QUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEdSQVZFCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdcdTAxNzgnICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTFlMWUnICAgIyAgMHhCMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlMWYnICAgIyAgMHhCMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTIwJyAgICMgIDB4QjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRyBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTIxJyAgICMgIDB4QjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MWU0MCcgICAjICAweEI0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0gV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MWU0MScgICAjICAweEI1IC0+IExBVElOIFNNQUxMIExFVFRFUiBNIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGI2JyAgICAgIyAgMHhCNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x1MWU1NicgICAjICAweEI3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MWU4MScgICAjICAweEI4IC0+IExBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggR1JBVkUKKyAgICB1J1x1MWU1NycgICAjICAweEI5IC0+IExBVElOIFNNQUxMIExFVFRFUiBQIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlODMnICAgIyAgMHhCQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIEFDVVRFCisgICAgdSdcdTFlNjAnICAgIyAgMHhCQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggRE9UIEFCT1ZFCisgICAgdSdcdTFlZjMnICAgIyAgMHhCQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEdSQVZFCisgICAgdSdcdTFlODQnICAgIyAgMHhCRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTFlODUnICAgIyAgMHhCRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVyBXSVRIIERJQUVSRVNJUworICAgIHUnXHUxZTYxJyAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMycgICAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTc0JyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDEnICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMicgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ1JyAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MWU2YScgICAjICAweEQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4ZDgnICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDknICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4REEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkZCcgICAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzYnICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4ZTAnICAgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTEnICAgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweEUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlMycgICAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTUnICAgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNicgICAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTgnICAgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweEVEIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3NScgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBXIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmMScgICAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMicgICAgICMgIDB4RjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmMycgICAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmNCcgICAgICMgIDB4RjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY1JyAgICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHUxZTZiJyAgICMgIDB4RjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4ZjgnICAgICAjICAweEY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGY5JyAgICAgIyAgMHhGOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZhJyAgICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZiJyAgICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweEZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGZkJyAgICAgIyAgMHhGRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzcnICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmYnICAgICAjICAweEZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YmFmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YmFmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE1LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2IxNDBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNS5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzE1IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktMTUuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS0xNScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x4YTEnICAgICAjICAweEExIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YTInICAgICAjICAweEEyIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHUyMGFjJyAgICMgIDB4QTQgLT4gRVVSTyBTSUdOCisgICAgdSdceGE1JyAgICAgIyAgMHhBNSAtPiBZRU4gU0lHTgorICAgIHUnXHUwMTYwJyAgICMgIDB4QTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MDE2MScgICAjICAweEE4IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdceGFhJyAgICAgIyAgMHhBQSAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhhYicgICAgICMgIDB4QUIgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEFDIC0+IE5PVCBTSUdOCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHhhZScgICAgICMgIDB4QUUgLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGFmJyAgICAgIyAgMHhBRiAtPiBNQUNST04KKyAgICB1J1x4YjAnICAgICAjICAweEIwIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweEIyIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiMycgICAgICMgIDB4QjMgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x1MDE3ZCcgICAjICAweEI0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdcdTAxN2UnICAgIyAgMHhCOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdceGI5JyAgICAgIyAgMHhCOSAtPiBTVVBFUlNDUklQVCBPTkUKKyAgICB1J1x4YmEnICAgICAjICAweEJBIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYicgICAgICMgIDB4QkIgLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTInICAgIyAgMHhCQyAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxNTMnICAgIyAgMHhCRCAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTc4JyAgICMgIDB4QkUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhiZicgICAgICMgIDB4QkYgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhjMCcgICAgICMgIDB4QzAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMxJyAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzInICAgICAjICAweEMyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMzJyAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4YzQnICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM2JyAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorICAgIHUnXHhjNycgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4YzgnICAgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjOScgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGNhJyAgICAgIyAgMHhDQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYicgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhDRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQwJyAgICAgIyAgMHhEMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICB1J1x4ZDEnICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMicgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ1JyAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x4ZDgnICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDknICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4REEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkZCcgICAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGRlJyAgICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUSE9STgorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x4ZTAnICAgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTEnICAgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweEUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlMycgICAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTUnICAgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNicgICAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTgnICAgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweEVEIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjAnICAgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEgKKyAgICB1J1x4ZjEnICAgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjInICAgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmNScgICAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmNicgICAgICMgIDB4RjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZjcnICAgICAjICAweEY3IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x4ZjgnICAgICAjICAweEY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGY5JyAgICAgIyAgMHhGOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZhJyAgICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGZiJyAgICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweEZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGZkJyAgICAgIyAgMHhGRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGZlJyAgICAgIyAgMHhGRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZmYnICAgICAjICAweEZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE1LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmJmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE1LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE1LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNmJmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE1LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE2LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGI5YWM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8xNi5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzE2IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktMTYuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS0xNicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDEwNCcgICAjICAweEExIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEwNScgICAjICAweEEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdcdTAxNDEnICAgIyAgMHhBMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdcdTIwYWMnICAgIyAgMHhBNCAtPiBFVVJPIFNJR04KKyAgICB1J1x1MjAxZScgICAjICAweEE1IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMTYwJyAgICMgIDB4QTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MDE2MScgICAjICAweEE4IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTAyMTgnICAgIyAgMHhBQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ09NTUEgQkVMT1cKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNzknICAgIyAgMHhBQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdTAxN2EnICAgIyAgMHhBRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdcdTAxN2InICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTAxMGMnICAgIyAgMHhCMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x1MDE0MicgICAjICAweEIzIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdcdTAxN2QnICAgIyAgMHhCNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MjAxZCcgICAjICAweEI1IC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiNicgICAgICMgIDB4QjYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdcdTAxN2UnICAgIyAgMHhCOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxMGQnICAgIyAgMHhCOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdcdTAyMTknICAgIyAgMHhCQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENPTU1BIEJFTE9XCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDE1MicgICAjICAweEJDIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKKyAgICB1J1x1MDE1MycgICAjICAweEJEIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxNzgnICAgIyAgMHhCRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxN2MnICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhjMCcgICAgICMgIDB4QzAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMxJyAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzInICAgICAjICAweEMyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdTAxMDInICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x4YzQnICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEwNicgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhjNicgICAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTEwJyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTQzJyAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdceGQyJyAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE1MCcgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE1YScgICAjICAweEQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMTcwJyAgICMgIDB4RDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhkOScgICAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMTgnICAgIyAgMHhERCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdcdTAyMWEnICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ09NTUEgQkVMT1cKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwMycgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMDcnICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOCcgICAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlYScgICAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlYycgICAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZCcgICAgICMgIDB4RUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlZScgICAgICMgIDB4RUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHhFRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTExJyAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x1MDE0NCcgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICB1J1x4ZjInICAgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTUxJyAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNWInICAgIyAgMHhGNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzEnICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTE5JyAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDIxYicgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ09NTUEgQkVMT1cKKyAgICB1J1x4ZmYnICAgICAjICAweEZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE2LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2FiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE2LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE2LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMTYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2FiM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzE2LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhlOTFkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMi5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzIgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS0yLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktMicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDEwNCcgICAjICAweEExIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDJkOCcgICAjICAweEEyIC0+IEJSRVZFCisgICAgdSdcdTAxNDEnICAgIyAgMHhBMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTAxM2QnICAgIyAgMHhBNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICB1J1x1MDE1YScgICAjICAweEE2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x1MDE2MCcgICAjICAweEE5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTVlJyAgICMgIDB4QUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2NCcgICAjICAweEFCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTc5JyAgICMgIDB4QUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIEFDVVRFCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHUwMTdkJyAgICMgIDB4QUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgdSdcdTAxN2InICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUwMTA1JyAgICMgIDB4QjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDJkYicgICAjICAweEIyIC0+IE9HT05FSworICAgIHUnXHUwMTQyJyAgICMgIDB4QjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICB1J1x4YjQnICAgICAjICAweEI0IC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHUwMTNlJyAgICMgIDB4QjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgIHUnXHUwMTViJyAgICMgIDB4QjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgIHUnXHUwMmM3JyAgICMgIDB4QjcgLT4gQ0FST04KKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x1MDE2MScgICAjICAweEI5IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDE1ZicgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTY1JyAgICMgIDB4QkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTdhJyAgICMgIDB4QkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgIHUnXHUwMmRkJyAgICMgIDB4QkQgLT4gRE9VQkxFIEFDVVRFIEFDQ0VOVAorICAgIHUnXHUwMTdlJyAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTdjJyAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE1NCcgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTAyJyAgICMgIDB4QzMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEJSRVZFCisgICAgdSdceGM0JyAgICAgIyAgMHhDNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMzknICAgIyAgMHhDNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwNicgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhjNycgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDEwYycgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhjOScgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTgnICAgIyAgMHhDQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGNiJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMWEnICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST04KKyAgICB1J1x4Y2QnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwZScgICAjICAweENGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTEwJyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTQzJyAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDcnICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE1MCcgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDE1OCcgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIHUnXHUwMTZlJyAgICMgIDB4RDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTcwJyAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkZCcgICAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNjInICAgIyAgMHhERSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIHUnXHhkZicgICAgICMgIDB4REYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICB1J1x1MDE1NScgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICB1J1x4ZTEnICAgICAjICAweEUxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTInICAgICAjICAweEUyIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTAzJyAgICMgIDB4RTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBCUkVWRQorICAgIHUnXHhlNCcgICAgICMgIDB4RTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDEzYScgICAjICAweEU1IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwNycgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICB1J1x4ZTcnICAgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTBkJyAgICMgIDB4RTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHhlOScgICAgICMgIDB4RTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTE5JyAgICMgIDB4RUEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMWInICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEwZicgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICB1J1x1MDExMScgICAjICAweEYwIC0+IExBVElOIFNNQUxMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgdSdcdTAxNDQnICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdcdTAxNDgnICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIENBUk9OCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDE1MScgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRE9VQkxFIEFDVVRFCisgICAgdSdceGY2JyAgICAgIyAgMHhGNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNycgICAgICMgIDB4RjcgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUwMTU5JyAgICMgIDB4RjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDQVJPTgorICAgIHUnXHUwMTZmJyAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGZhJyAgICAgIyAgMHhGQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzEnICAgIyAgMHhGQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZmQnICAgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2MycgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMmQ5JyAgICMgIDB4RkYgLT4gRE9UIEFCT1ZFCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzIucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFjMDEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzIucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWFjMDEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkYWFmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfMy5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzMgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS0zLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktMycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDEyNicgICAjICAweEExIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEggV0lUSCBTVFJPS0UKKyAgICB1J1x1MDJkOCcgICAjICAweEEyIC0+IEJSRVZFCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTAxMjQnICAgIyAgMHhBNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhhNycgICAgICMgIDB4QTcgLT4gU0VDVElPTiBTSUdOCisgICAgdSdceGE4JyAgICAgIyAgMHhBOCAtPiBESUFFUkVTSVMKKyAgICB1J1x1MDEzMCcgICAjICAweEE5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDE1ZScgICAjICAweEFBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMWUnICAgIyAgMHhBQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x1MDEzNCcgICAjICAweEFDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEogV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGFkJyAgICAgIyAgMHhBRCAtPiBTT0ZUIEhZUEhFTgorICAgIHUnXHVmZmZlJworICAgIHUnXHUwMTdiJyAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhiMCcgICAgICMgIDB4QjAgLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MDEyNycgICAjICAweEIxIC0+IExBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggU1RST0tFCisgICAgdSdceGIyJyAgICAgIyAgMHhCMiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweEIzIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGI0JyAgICAgIyAgMHhCNCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MDEyNScgICAjICAweEI2IC0+IExBVElOIFNNQUxMIExFVFRFUiBIIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHhiOCcgICAgICMgIDB4QjggLT4gQ0VESUxMQQorICAgIHUnXHUwMTMxJyAgICMgIDB4QjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHUwMTVmJyAgICMgIDB4QkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdcdTAxMWYnICAgIyAgMHhCQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgdSdcdTAxMzUnICAgIyAgMHhCQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSiBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YmQnICAgICAjICAweEJEIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgSEFMRgorICAgIHUnXHVmZmZlJworICAgIHUnXHUwMTdjJyAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4YzAnICAgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMScgICAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGMyJyAgICAgIyAgMHhDMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHVmZmZlJworICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTBhJyAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTA4JyAgICMgIDB4QzYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzcnICAgICAjICAweEM3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM4JyAgICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhjYScgICAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2InICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHVmZmZlJworICAgIHUnXHhkMScgICAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQyJyAgICAgIyAgMHhEMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEyMCcgICAjICAweEQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x1MDExYycgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ5JyAgICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGMnICAgICAjICAweERDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE2YycgICAjICAweEREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBCUkVWRQorICAgIHUnXHUwMTVjJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMGInICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTA5JyAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU3JyAgICAgIyAgMHhFNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTgnICAgICAjICAweEU4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4ZTknICAgICAjICAweEU5IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZWEnICAgICAjICAweEVBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZWMnICAgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZWQnICAgICAjICAweEVEIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4ZWUnICAgICAjICAweEVFIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4RUYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x4ZjEnICAgICAjICAweEYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjInICAgICAjICAweEYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZjMnICAgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZjQnICAgICAjICAweEY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTIxJyAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTAxMWQnICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjknICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE2ZCcgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQlJFVkUKKyAgICB1J1x1MDE1ZCcgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMmQ5JyAgICMgIDB4RkYgLT4gRE9UIEFCT1ZFCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWZiYjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWZiYjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV8zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMDNiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNC5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzQgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS00LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDEwNCcgICAjICAweEExIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEzOCcgICAjICAweEEyIC0+IExBVElOIFNNQUxMIExFVFRFUiBLUkEKKyAgICB1J1x1MDE1NicgICAjICAweEEzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgdSdceGE0JyAgICAgIyAgMHhBNCAtPiBDVVJSRU5DWSBTSUdOCisgICAgdSdcdTAxMjgnICAgIyAgMHhBNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggVElMREUKKyAgICB1J1x1MDEzYicgICAjICAweEE2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHUwMTYwJyAgICMgIDB4QTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxMTInICAgIyAgMHhBQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMjInICAgIyAgMHhBQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTY2JyAgICMgIDB4QUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIFNUUk9LRQorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1MDE3ZCcgICAjICAweEFFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHhhZicgICAgICMgIDB4QUYgLT4gTUFDUk9OCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHUwMTA1JyAgICMgIDB4QjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICB1J1x1MDJkYicgICAjICAweEIyIC0+IE9HT05FSworICAgIHUnXHUwMTU3JyAgICMgIDB4QjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgdSdceGI0JyAgICAgIyAgMHhCNCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x1MDEyOScgICAjICAweEI1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggVElMREUKKyAgICB1J1x1MDEzYycgICAjICAweEI2IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMmM3JyAgICMgIDB4QjcgLT4gQ0FST04KKyAgICB1J1x4YjgnICAgICAjICAweEI4IC0+IENFRElMTEEKKyAgICB1J1x1MDE2MScgICAjICAweEI5IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MDExMycgICAjICAweEJBIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMjMnICAgIyAgMHhCQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE2NycgICAjICAweEJDIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggU1RST0tFCisgICAgdSdcdTAxNGEnICAgIyAgMHhCRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFTkcKKyAgICB1J1x1MDE3ZScgICAjICAweEJFIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x1MDE0YicgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBFTkcKKyAgICB1J1x1MDEwMCcgICAjICAweEMwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICB1J1x4YzEnICAgICAjICAweEMxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjMicgICAgICMgIDB4QzIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzMnICAgICAjICAweEMzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhjNCcgICAgICMgIDB4QzQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjNScgICAgICMgIDB4QzUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4YzYnICAgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdcdTAxMmUnICAgIyAgMHhDNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMGMnICAgIyAgMHhDOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICB1J1x4YzknICAgICAjICAweEM5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHUwMTE4JyAgICMgIDB4Q0EgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhjYicgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTE2JyAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHhjZCcgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTJhJyAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTEwJyAgICMgIDB4RDAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTQ1JyAgICMgIDB4RDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE0YycgICAjICAweEQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x1MDEzNicgICAjICAweEQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgdSdceGQ0JyAgICAgIyAgMHhENCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkNScgICAgICMgIDB4RDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHhENiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGQ3JyAgICAgIyAgMHhENyAtPiBNVUxUSVBMSUNBVElPTiBTSUdOCisgICAgdSdceGQ4JyAgICAgIyAgMHhEOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdcdTAxNzInICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgdSdceGRhJyAgICAgIyAgMHhEQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweERCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGRjJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNjgnICAgIyAgMHhERCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggVElMREUKKyAgICB1J1x1MDE2YScgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdcdTAxMDEnICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHhlMScgICAgICMgIDB4RTEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMicgICAgICMgIDB4RTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGUzJyAgICAgIyAgMHhFMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU0JyAgICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlNScgICAgICMgIDB4RTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGU2JyAgICAgIyAgMHhFNiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x1MDEyZicgICAjICAweEU3IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgdSdcdTAxMGQnICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMTknICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhlYicgICAgICMgIDB4RUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExNycgICAjICAweEVDIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1MDEyYicgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMTEnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTQ2JyAgICMgIDB4RjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgdSdcdTAxNGQnICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTM3JyAgICMgIDB4RjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTczJyAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x4ZmEnICAgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZmInICAgICAjICAweEZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4RkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE2OScgICAjICAweEZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggVElMREUKKyAgICB1J1x1MDE2YicgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggTUFDUk9OCisgICAgdSdcdTAyZDknICAgIyAgMHhGRiAtPiBET1QgQUJPVkUKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTFkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YTFkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDFjZDFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV81LnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGlzbzg4NTlfNSBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvSVNPODg1OS84ODU5LTUuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvODg1OS01JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IE5VTEwKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IFNUQVJUIE9GIEhFQURJTkcKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IFNUQVJUIE9GIFRFWFQKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IEVORCBPRiBURVhUCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBFTlFVSVJZCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBBQ0tOT1dMRURHRQorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQkVMTAorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQkFDS1NQQUNFCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBIT1JJWk9OVEFMIFRBQlVMQVRJT04KKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IExJTkUgRkVFRAorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gVkVSVElDQUwgVEFCVUxBVElPTgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gRk9STSBGRUVECisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDQVJSSUFHRSBSRVRVUk4KKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IFNISUZUIE9VVAorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gU0hJRlQgSU4KKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IERBVEEgTElOSyBFU0NBUEUKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IERFVklDRSBDT05UUk9MIE9ORQorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gREVWSUNFIENPTlRST0wgVFdPCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBERVZJQ0UgQ09OVFJPTCBUSFJFRQorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gREVWSUNFIENPTlRST0wgRk9VUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gTkVHQVRJVkUgQUNLTk9XTEVER0UKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IFNZTkNIUk9OT1VTIElETEUKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENBTkNFTAorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gRU5EIE9GIE1FRElVTQorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gU1VCU1RJVFVURQorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gRVNDQVBFCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBGSUxFIFNFUEFSQVRPUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gR1JPVVAgU0VQQVJBVE9SCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBSRUNPUkQgU0VQQVJBVE9SCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBVTklUIFNFUEFSQVRPUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBERUxFVEUKKyAgICB1J1x4ODAnICAgICAjICAweDgwIC0+IDxjb250cm9sPgorICAgIHUnXHg4MScgICAgICMgIDB4ODEgLT4gPGNvbnRyb2w+CisgICAgdSdceDgyJyAgICAgIyAgMHg4MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODMnICAgICAjICAweDgzIC0+IDxjb250cm9sPgorICAgIHUnXHg4NCcgICAgICMgIDB4ODQgLT4gPGNvbnRyb2w+CisgICAgdSdceDg1JyAgICAgIyAgMHg4NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODYnICAgICAjICAweDg2IC0+IDxjb250cm9sPgorICAgIHUnXHg4NycgICAgICMgIDB4ODcgLT4gPGNvbnRyb2w+CisgICAgdSdceDg4JyAgICAgIyAgMHg4OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODknICAgICAjICAweDg5IC0+IDxjb250cm9sPgorICAgIHUnXHg4YScgICAgICMgIDB4OEEgLT4gPGNvbnRyb2w+CisgICAgdSdceDhiJyAgICAgIyAgMHg4QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGMnICAgICAjICAweDhDIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZCcgICAgICMgIDB4OEQgLT4gPGNvbnRyb2w+CisgICAgdSdceDhlJyAgICAgIyAgMHg4RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGYnICAgICAjICAweDhGIC0+IDxjb250cm9sPgorICAgIHUnXHg5MCcgICAgICMgIDB4OTAgLT4gPGNvbnRyb2w+CisgICAgdSdceDkxJyAgICAgIyAgMHg5MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTInICAgICAjICAweDkyIC0+IDxjb250cm9sPgorICAgIHUnXHg5MycgICAgICMgIDB4OTMgLT4gPGNvbnRyb2w+CisgICAgdSdceDk0JyAgICAgIyAgMHg5NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTUnICAgICAjICAweDk1IC0+IDxjb250cm9sPgorICAgIHUnXHg5NicgICAgICMgIDB4OTYgLT4gPGNvbnRyb2w+CisgICAgdSdceDk3JyAgICAgIyAgMHg5NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTgnICAgICAjICAweDk4IC0+IDxjb250cm9sPgorICAgIHUnXHg5OScgICAgICMgIDB4OTkgLT4gPGNvbnRyb2w+CisgICAgdSdceDlhJyAgICAgIyAgMHg5QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWInICAgICAjICAweDlCIC0+IDxjb250cm9sPgorICAgIHUnXHg5YycgICAgICMgIDB4OUMgLT4gPGNvbnRyb2w+CisgICAgdSdceDlkJyAgICAgIyAgMHg5RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWUnICAgICAjICAweDlFIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZicgICAgICMgIDB4OUYgLT4gPGNvbnRyb2w+CisgICAgdSdceGEwJyAgICAgIyAgMHhBMCAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwNDAxJyAgICMgIDB4QTEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICB1J1x1MDQwMicgICAjICAweEEyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERKRQorICAgIHUnXHUwNDAzJyAgICMgIDB4QTMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0pFCisgICAgdSdcdTA0MDQnICAgIyAgMHhBNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICB1J1x1MDQwNScgICAjICAweEE1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERaRQorICAgIHUnXHUwNDA2JyAgICMgIDB4QTYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgdSdcdTA0MDcnICAgIyAgMHhBNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorICAgIHUnXHUwNDA4JyAgICMgIDB4QTggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSkUKKyAgICB1J1x1MDQwOScgICAjICAweEE5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIExKRQorICAgIHUnXHUwNDBhJyAgICMgIDB4QUEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTkpFCisgICAgdSdcdTA0MGInICAgIyAgMHhBQiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0MGMnICAgIyAgMHhBQyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLSkUKKyAgICB1J1x4YWQnICAgICAjICAweEFEIC0+IFNPRlQgSFlQSEVOCisgICAgdSdcdTA0MGUnICAgIyAgMHhBRSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBVCisgICAgdSdcdTA0MGYnICAgIyAgMHhBRiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkhFCisgICAgdSdcdTA0MTAnICAgIyAgMHhCMCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdcdTA0MTEnICAgIyAgMHhCMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorICAgIHUnXHUwNDEyJyAgICMgIDB4QjIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKyAgICB1J1x1MDQxMycgICAjICAweEIzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDE0JyAgICMgIDB4QjQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICB1J1x1MDQxNScgICAjICAweEI1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgdSdcdTA0MTYnICAgIyAgMHhCNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQxNycgICAjICAweEI3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisgICAgdSdcdTA0MTgnICAgIyAgMHhCOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdcdTA0MTknICAgIyAgMHhCOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0MWEnICAgIyAgMHhCQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorICAgIHUnXHUwNDFiJyAgICMgIDB4QkIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKyAgICB1J1x1MDQxYycgICAjICAweEJDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisgICAgdSdcdTA0MWQnICAgIyAgMHhCRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIHUnXHUwNDFlJyAgICMgIDB4QkUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworICAgIHUnXHUwNDFmJyAgICMgIDB4QkYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKyAgICB1J1x1MDQyMCcgICAjICAweEMwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSCisgICAgdSdcdTA0MjEnICAgIyAgMHhDMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworICAgIHUnXHUwNDIyJyAgICMgIDB4QzIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKyAgICB1J1x1MDQyMycgICAjICAweEMzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1x1MDQyNCcgICAjICAweEM0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisgICAgdSdcdTA0MjUnICAgIyAgMHhDNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorICAgIHUnXHUwNDI2JyAgICMgIDB4QzYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisgICAgdSdcdTA0MjcnICAgIyAgMHhDNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQyOCcgICAjICAweEM4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDI5JyAgICMgIDB4QzkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQyYScgICAjICAweENBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDJiJyAgICMgIDB4Q0IgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDJjJyAgICMgIDB4Q0MgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0MmQnICAgIyAgMHhDRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdcdTA0MmUnICAgIyAgMHhDRSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorICAgIHUnXHUwNDJmJyAgICMgIDB4Q0YgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKyAgICB1J1x1MDQzMCcgICAjICAweEQwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBBCisgICAgdSdcdTA0MzEnICAgIyAgMHhEMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkUKKyAgICB1J1x1MDQzMicgICAjICAweEQyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBWRQorICAgIHUnXHUwNDMzJyAgICMgIDB4RDMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDM0JyAgICMgIDB4RDQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisgICAgdSdcdTA0MzUnICAgIyAgMHhENSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKyAgICB1J1x1MDQzNicgICAjICAweEQ2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQzNycgICAjICAweEQ3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBaRQorICAgIHUnXHUwNDM4JyAgICMgIDB4RDggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKyAgICB1J1x1MDQzOScgICAjICAweEQ5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0M2EnICAgIyAgMHhEQSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgS0EKKyAgICB1J1x1MDQzYicgICAjICAweERCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorICAgIHUnXHUwNDNjJyAgICMgIDB4REMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVNCisgICAgdSdcdTA0M2QnICAgIyAgMHhERCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU4KKyAgICB1J1x1MDQzZScgICAjICAweERFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBPCisgICAgdSdcdTA0M2YnICAgIyAgMHhERiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgUEUKKyAgICB1J1x1MDQ0MCcgICAjICAweEUwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIHUnXHUwNDQxJyAgICMgIDB4RTEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisgICAgdSdcdTA0NDInICAgIyAgMHhFMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKyAgICB1J1x1MDQ0MycgICAjICAweEUzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgdSdcdTA0NDQnICAgIyAgMHhFNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKyAgICB1J1x1MDQ0NScgICAjICAweEU1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQQorICAgIHUnXHUwNDQ2JyAgICMgIDB4RTYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDQ3JyAgICMgIDB4RTcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorICAgIHUnXHUwNDQ4JyAgICMgIDB4RTggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDQ5JyAgICMgIDB4RTkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0NGEnICAgIyAgMHhFQSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgdSdcdTA0NGInICAgIyAgMHhFQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDRjJyAgICMgIDB4RUMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorICAgIHUnXHUwNDRkJyAgICMgIDB4RUQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEUKKyAgICB1J1x1MDQ0ZScgICAjICAweEVFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIHUnXHUwNDRmJyAgICMgIDB4RUYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisgICAgdSdcdTIxMTYnICAgIyAgMHhGMCAtPiBOVU1FUk8gU0lHTgorICAgIHUnXHUwNDUxJyAgICMgIDB4RjEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgdSdcdTA0NTInICAgIyAgMHhGMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREpFCisgICAgdSdcdTA0NTMnICAgIyAgMHhGMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0pFCisgICAgdSdcdTA0NTQnICAgIyAgMHhGNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTA0NTUnICAgIyAgMHhGNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRFpFCisgICAgdSdcdTA0NTYnICAgIyAgMHhGNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgdSdcdTA0NTcnICAgIyAgMHhGNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkKKyAgICB1J1x1MDQ1OCcgICAjICAweEY4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBKRQorICAgIHUnXHUwNDU5JyAgICMgIDB4RjkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIExKRQorICAgIHUnXHUwNDVhJyAgICMgIDB4RkEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE5KRQorICAgIHUnXHUwNDViJyAgICMgIDB4RkIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTSEUKKyAgICB1J1x1MDQ1YycgICAjICAweEZDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLSkUKKyAgICB1J1x4YTcnICAgICAjICAweEZEIC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUwNDVlJyAgICMgIDB4RkUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKyAgICB1J1x1MDQ1ZicgICAjICAweEZGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBEWkhFCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV81LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZhNjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV81LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV81LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjZhNjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV81LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzYucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMzRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNi5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzYgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS02LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktNicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MDYwYycgICAjICAweEFDIC0+IEFSQUJJQyBDT01NQQorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MDYxYicgICAjICAweEJCIC0+IEFSQUJJQyBTRU1JQ09MT04KKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MDYxZicgICAjICAweEJGIC0+IEFSQUJJQyBRVUVTVElPTiBNQVJLCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTA2MjEnICAgIyAgMHhDMSAtPiBBUkFCSUMgTEVUVEVSIEhBTVpBCisgICAgdSdcdTA2MjInICAgIyAgMHhDMiAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRQorICAgIHUnXHUwNjIzJyAgICMgIDB4QzMgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNCcgICAjICAweEM0IC0+IEFSQUJJQyBMRVRURVIgV0FXIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNScgICAjICAweEM1IC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEJFTE9XCisgICAgdSdcdTA2MjYnICAgIyAgMHhDNiAtPiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjcnICAgIyAgMHhDNyAtPiBBUkFCSUMgTEVUVEVSIEFMRUYKKyAgICB1J1x1MDYyOCcgICAjICAweEM4IC0+IEFSQUJJQyBMRVRURVIgQkVICisgICAgdSdcdTA2MjknICAgIyAgMHhDOSAtPiBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBCisgICAgdSdcdTA2MmEnICAgIyAgMHhDQSAtPiBBUkFCSUMgTEVUVEVSIFRFSAorICAgIHUnXHUwNjJiJyAgICMgIDB4Q0IgLT4gQVJBQklDIExFVFRFUiBUSEVICisgICAgdSdcdTA2MmMnICAgIyAgMHhDQyAtPiBBUkFCSUMgTEVUVEVSIEpFRU0KKyAgICB1J1x1MDYyZCcgICAjICAweENEIC0+IEFSQUJJQyBMRVRURVIgSEFICisgICAgdSdcdTA2MmUnICAgIyAgMHhDRSAtPiBBUkFCSUMgTEVUVEVSIEtIQUgKKyAgICB1J1x1MDYyZicgICAjICAweENGIC0+IEFSQUJJQyBMRVRURVIgREFMCisgICAgdSdcdTA2MzAnICAgIyAgMHhEMCAtPiBBUkFCSUMgTEVUVEVSIFRIQUwKKyAgICB1J1x1MDYzMScgICAjICAweEQxIC0+IEFSQUJJQyBMRVRURVIgUkVICisgICAgdSdcdTA2MzInICAgIyAgMHhEMiAtPiBBUkFCSUMgTEVUVEVSIFpBSU4KKyAgICB1J1x1MDYzMycgICAjICAweEQzIC0+IEFSQUJJQyBMRVRURVIgU0VFTgorICAgIHUnXHUwNjM0JyAgICMgIDB4RDQgLT4gQVJBQklDIExFVFRFUiBTSEVFTgorICAgIHUnXHUwNjM1JyAgICMgIDB4RDUgLT4gQVJBQklDIExFVFRFUiBTQUQKKyAgICB1J1x1MDYzNicgICAjICAweEQ2IC0+IEFSQUJJQyBMRVRURVIgREFECisgICAgdSdcdTA2MzcnICAgIyAgMHhENyAtPiBBUkFCSUMgTEVUVEVSIFRBSAorICAgIHUnXHUwNjM4JyAgICMgIDB4RDggLT4gQVJBQklDIExFVFRFUiBaQUgKKyAgICB1J1x1MDYzOScgICAjICAweEQ5IC0+IEFSQUJJQyBMRVRURVIgQUlOCisgICAgdSdcdTA2M2EnICAgIyAgMHhEQSAtPiBBUkFCSUMgTEVUVEVSIEdIQUlOCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdTA2NDAnICAgIyAgMHhFMCAtPiBBUkFCSUMgVEFUV0VFTAorICAgIHUnXHUwNjQxJyAgICMgIDB4RTEgLT4gQVJBQklDIExFVFRFUiBGRUgKKyAgICB1J1x1MDY0MicgICAjICAweEUyIC0+IEFSQUJJQyBMRVRURVIgUUFGCisgICAgdSdcdTA2NDMnICAgIyAgMHhFMyAtPiBBUkFCSUMgTEVUVEVSIEtBRgorICAgIHUnXHUwNjQ0JyAgICMgIDB4RTQgLT4gQVJBQklDIExFVFRFUiBMQU0KKyAgICB1J1x1MDY0NScgICAjICAweEU1IC0+IEFSQUJJQyBMRVRURVIgTUVFTQorICAgIHUnXHUwNjQ2JyAgICMgIDB4RTYgLT4gQVJBQklDIExFVFRFUiBOT09OCisgICAgdSdcdTA2NDcnICAgIyAgMHhFNyAtPiBBUkFCSUMgTEVUVEVSIEhFSAorICAgIHUnXHUwNjQ4JyAgICMgIDB4RTggLT4gQVJBQklDIExFVFRFUiBXQVcKKyAgICB1J1x1MDY0OScgICAjICAweEU5IC0+IEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisgICAgdSdcdTA2NGEnICAgIyAgMHhFQSAtPiBBUkFCSUMgTEVUVEVSIFlFSAorICAgIHUnXHUwNjRiJyAgICMgIDB4RUIgLT4gQVJBQklDIEZBVEhBVEFOCisgICAgdSdcdTA2NGMnICAgIyAgMHhFQyAtPiBBUkFCSUMgREFNTUFUQU4KKyAgICB1J1x1MDY0ZCcgICAjICAweEVEIC0+IEFSQUJJQyBLQVNSQVRBTgorICAgIHUnXHUwNjRlJyAgICMgIDB4RUUgLT4gQVJBQklDIEZBVEhBCisgICAgdSdcdTA2NGYnICAgIyAgMHhFRiAtPiBBUkFCSUMgREFNTUEKKyAgICB1J1x1MDY1MCcgICAjICAweEYwIC0+IEFSQUJJQyBLQVNSQQorICAgIHUnXHUwNjUxJyAgICMgIDB4RjEgLT4gQVJBQklDIFNIQUREQQorICAgIHUnXHUwNjUyJyAgICMgIDB4RjIgLT4gQVJBQklDIFNVS1VOCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCisgICAgdSdcdWZmZmUnCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzYucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM4MGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzYucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM4MGMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV82LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzcucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MDAyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNy5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzcgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS03LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktNycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MjAxOCcgICAjICAweEExIC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHhBMiAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x1MjBhYycgICAjICAweEE0IC0+IEVVUk8gU0lHTgorICAgIHUnXHUyMGFmJyAgICMgIDB4QTUgLT4gRFJBQ0hNQSBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MDM3YScgICAjICAweEFBIC0+IEdSRUVLIFlQT0dFR1JBTU1FTkkKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MjAxNScgICAjICAweEFGIC0+IEhPUklaT05UQUwgQkFSCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHhCMiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweEIzIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdcdTAzODQnICAgIyAgMHhCNCAtPiBHUkVFSyBUT05PUworICAgIHUnXHUwMzg1JyAgICMgIDB4QjUgLT4gR1JFRUsgRElBTFlUSUtBIFRPTk9TCisgICAgdSdcdTAzODYnICAgIyAgMHhCNiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgdSdceGI3JyAgICAgIyAgMHhCNyAtPiBNSURETEUgRE9UCisgICAgdSdcdTAzODgnICAgIyAgMHhCOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4OScgICAjICAweEI5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGEnICAgIyAgMHhCQSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggVE9OT1MKKyAgICB1J1x4YmInICAgICAjICAweEJCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwMzhjJyAgICMgIDB4QkMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdceGJkJyAgICAgIyAgMHhCRCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x1MDM4ZScgICAjICAweEJFIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwMzhmJyAgICMgIDB4QkYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHUwMzkwJyAgICMgIDB4QzAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgdSdcdTAzOTEnICAgIyAgMHhDMSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwMzkyJyAgICMgIDB4QzIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQkVUQQorICAgIHUnXHUwMzkzJyAgICMgIDB4QzMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDM5NCcgICAjICAweEM0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzOTUnICAgIyAgMHhDNSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzOTYnICAgIyAgMHhDNiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzOTcnICAgIyAgMHhDNyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEKKyAgICB1J1x1MDM5OCcgICAjICAweEM4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzOTknICAgIyAgMHhDOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBCisgICAgdSdcdTAzOWEnICAgIyAgMHhDQSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBLQVBQQQorICAgIHUnXHUwMzliJyAgICMgIDB4Q0IgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgTEFNREEKKyAgICB1J1x1MDM5YycgICAjICAweENDIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCisgICAgdSdcdTAzOWQnICAgIyAgMHhDRCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQorICAgIHUnXHUwMzllJyAgICMgIDB4Q0UgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgWEkKKyAgICB1J1x1MDM5ZicgICAjICAweENGIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNhMCcgICAjICAweEQwIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBJCisgICAgdSdcdTAzYTEnICAgIyAgMHhEMSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBSSE8KKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MDNhMycgICAjICAweEQzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFNJR01BCisgICAgdSdcdTAzYTQnICAgIyAgMHhENCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUKKyAgICB1J1x1MDNhNScgICAjICAweEQ1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNhNicgICAjICAweEQ2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBISQorICAgIHUnXHUwM2E3JyAgICMgIDB4RDcgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgQ0hJCisgICAgdSdcdTAzYTgnICAgIyAgMHhEOCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNhOScgICAjICAweEQ5IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdcdTAzYWEnICAgIyAgMHhEQSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYWInICAgIyAgMHhEQiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzYWMnICAgIyAgMHhEQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEgV0lUSCBUT05PUworICAgIHUnXHUwM2FkJyAgICMgIDB4REQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2FlJyAgICMgIDB4REUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWYnICAgIyAgMHhERiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYjAnICAgIyAgMHhFMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIERJQUxZVElLQSBBTkQgVE9OT1MKKyAgICB1J1x1MDNiMScgICAjICAweEUxIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQQorICAgIHUnXHUwM2IyJyAgICMgIDB4RTIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEJFVEEKKyAgICB1J1x1MDNiMycgICAjICAweEUzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBHQU1NQQorICAgIHUnXHUwM2I0JyAgICMgIDB4RTQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIERFTFRBCisgICAgdSdcdTAzYjUnICAgIyAgMHhFNSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRVBTSUxPTgorICAgIHUnXHUwM2I2JyAgICMgIDB4RTYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDNiNycgICAjICAweEU3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICB1J1x1MDNiOCcgICAjICAweEU4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBUSEVUQQorICAgIHUnXHUwM2I5JyAgICMgIDB4RTkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEKKyAgICB1J1x1MDNiYScgICAjICAweEVBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIHUnXHUwM2JiJyAgICMgIDB4RUIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzYmMnICAgIyAgMHhFQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICB1J1x1MDNiZCcgICAjICAweEVEIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIHUnXHUwM2JlJyAgICMgIDB4RUUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFhJCisgICAgdSdcdTAzYmYnICAgIyAgMHhFRiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTgorICAgIHUnXHUwM2MwJyAgICMgIDB4RjAgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTAzYzEnICAgIyAgMHhGMSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUkhPCisgICAgdSdcdTAzYzInICAgIyAgMHhGMiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgRklOQUwgU0lHTUEKKyAgICB1J1x1MDNjMycgICAjICAweEYzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2M0JyAgICMgIDB4RjQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2M1JyAgICMgIDB4RjUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNjNicgICAjICAweEY2IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNjNycgICAjICAweEY3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBDSEkKKyAgICB1J1x1MDNjOCcgICAjICAweEY4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQU0kKKyAgICB1J1x1MDNjOScgICAjICAweEY5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwM2NhJyAgICMgIDB4RkEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIElPVEEgV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNjYicgICAjICAweEZCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBVUFNJTE9OIFdJVEggRElBTFlUSUtBCisgICAgdSdcdTAzY2MnICAgIyAgMHhGQyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2QnICAgIyAgMHhGRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2UnICAgIyAgMHhGRSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EgV0lUSCBUT05PUworICAgIHUnXHVmZmZlJworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV83LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5NmNmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV83LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5NmNmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfNy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzY2YyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzgucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgaXNvODg1OV84IGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9JU084ODU5Lzg4NTktOC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTgnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gTlVMTAorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gU1RBUlQgT0YgSEVBRElORworICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gU1RBUlQgT0YgVEVYVAorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gRU5EIE9GIFRFWFQKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IEVORCBPRiBUUkFOU01JU1NJT04KKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IEVOUVVJUlkKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IEFDS05PV0xFREdFCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBCRUxMCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBCQUNLU1BBQ0UKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IEhPUklaT05UQUwgVEFCVUxBVElPTgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gTElORSBGRUVECisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBWRVJUSUNBTCBUQUJVTEFUSU9OCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBGT1JNIEZFRUQKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENBUlJJQUdFIFJFVFVSTgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gU0hJRlQgT1VUCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBTSElGVCBJTgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gREFUQSBMSU5LIEVTQ0FQRQorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gREVWSUNFIENPTlRST0wgT05FCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBERVZJQ0UgQ09OVFJPTCBUV08KKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IERFVklDRSBDT05UUk9MIFRIUkVFCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBERVZJQ0UgQ09OVFJPTCBGT1VSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBORUdBVElWRSBBQ0tOT1dMRURHRQorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gU1lOQ0hST05PVVMgSURMRQorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTiBCTE9DSworICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ0FOQ0VMCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBFTkQgT0YgTUVESVVNCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBTVUJTVElUVVRFCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBFU0NBUEUKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IEZJTEUgU0VQQVJBVE9SCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBHUk9VUCBTRVBBUkFUT1IKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IFJFQ09SRCBTRVBBUkFUT1IKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IFVOSVQgU0VQQVJBVE9SCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IERFTEVURQorICAgIHUnXHg4MCcgICAgICMgIDB4ODAgLT4gPGNvbnRyb2w+CisgICAgdSdceDgxJyAgICAgIyAgMHg4MSAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODInICAgICAjICAweDgyIC0+IDxjb250cm9sPgorICAgIHUnXHg4MycgICAgICMgIDB4ODMgLT4gPGNvbnRyb2w+CisgICAgdSdceDg0JyAgICAgIyAgMHg4NCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODUnICAgICAjICAweDg1IC0+IDxjb250cm9sPgorICAgIHUnXHg4NicgICAgICMgIDB4ODYgLT4gPGNvbnRyb2w+CisgICAgdSdceDg3JyAgICAgIyAgMHg4NyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODgnICAgICAjICAweDg4IC0+IDxjb250cm9sPgorICAgIHUnXHg4OScgICAgICMgIDB4ODkgLT4gPGNvbnRyb2w+CisgICAgdSdceDhhJyAgICAgIyAgMHg4QSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGInICAgICAjICAweDhCIC0+IDxjb250cm9sPgorICAgIHUnXHg4YycgICAgICMgIDB4OEMgLT4gPGNvbnRyb2w+CisgICAgdSdceDhkJyAgICAgIyAgMHg4RCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGUnICAgICAjICAweDhFIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZicgICAgICMgIDB4OEYgLT4gPGNvbnRyb2w+CisgICAgdSdceDkwJyAgICAgIyAgMHg5MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTEnICAgICAjICAweDkxIC0+IDxjb250cm9sPgorICAgIHUnXHg5MicgICAgICMgIDB4OTIgLT4gPGNvbnRyb2w+CisgICAgdSdceDkzJyAgICAgIyAgMHg5MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTQnICAgICAjICAweDk0IC0+IDxjb250cm9sPgorICAgIHUnXHg5NScgICAgICMgIDB4OTUgLT4gPGNvbnRyb2w+CisgICAgdSdceDk2JyAgICAgIyAgMHg5NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTcnICAgICAjICAweDk3IC0+IDxjb250cm9sPgorICAgIHUnXHg5OCcgICAgICMgIDB4OTggLT4gPGNvbnRyb2w+CisgICAgdSdceDk5JyAgICAgIyAgMHg5OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWEnICAgICAjICAweDlBIC0+IDxjb250cm9sPgorICAgIHUnXHg5YicgICAgICMgIDB4OUIgLT4gPGNvbnRyb2w+CisgICAgdSdceDljJyAgICAgIyAgMHg5QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWQnICAgICAjICAweDlEIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZScgICAgICMgIDB4OUUgLT4gPGNvbnRyb2w+CisgICAgdSdceDlmJyAgICAgIyAgMHg5RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4YTAnICAgICAjICAweEEwIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdWZmZmUnCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTQnICAgICAjICAweEE0IC0+IENVUlJFTkNZIFNJR04KKyAgICB1J1x4YTUnICAgICAjICAweEE1IC0+IFlFTiBTSUdOCisgICAgdSdceGE2JyAgICAgIyAgMHhBNiAtPiBCUk9LRU4gQkFSCisgICAgdSdceGE3JyAgICAgIyAgMHhBNyAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x4YTgnICAgICAjICAweEE4IC0+IERJQUVSRVNJUworICAgIHUnXHhhOScgICAgICMgIDB4QTkgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x4ZDcnICAgICAjICAweEFBIC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhZicgICAgICMgIDB4QUYgLT4gTUFDUk9OCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHhCMiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweEIzIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGI0JyAgICAgIyAgMHhCNCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHhiOCcgICAgICMgIDB4QjggLT4gQ0VESUxMQQorICAgIHUnXHhiOScgICAgICMgIDB4QjkgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGY3JyAgICAgIyAgMHhCQSAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGJiJyAgICAgIyAgMHhCQiAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmMnICAgICAjICAweEJDIC0+IFZVTEdBUiBGUkFDVElPTiBPTkUgUVVBUlRFUgorICAgIHUnXHhiZCcgICAgICMgIDB4QkQgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdceGJlJyAgICAgIyAgMHhCRSAtPiBWVUxHQVIgRlJBQ1RJT04gVEhSRUUgUVVBUlRFUlMKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MjAxNycgICAjICAweERGIC0+IERPVUJMRSBMT1cgTElORQorICAgIHUnXHUwNWQwJyAgICMgIDB4RTAgLT4gSEVCUkVXIExFVFRFUiBBTEVGCisgICAgdSdcdTA1ZDEnICAgIyAgMHhFMSAtPiBIRUJSRVcgTEVUVEVSIEJFVAorICAgIHUnXHUwNWQyJyAgICMgIDB4RTIgLT4gSEVCUkVXIExFVFRFUiBHSU1FTAorICAgIHUnXHUwNWQzJyAgICMgIDB4RTMgLT4gSEVCUkVXIExFVFRFUiBEQUxFVAorICAgIHUnXHUwNWQ0JyAgICMgIDB4RTQgLT4gSEVCUkVXIExFVFRFUiBIRQorICAgIHUnXHUwNWQ1JyAgICMgIDB4RTUgLT4gSEVCUkVXIExFVFRFUiBWQVYKKyAgICB1J1x1MDVkNicgICAjICAweEU2IC0+IEhFQlJFVyBMRVRURVIgWkFZSU4KKyAgICB1J1x1MDVkNycgICAjICAweEU3IC0+IEhFQlJFVyBMRVRURVIgSEVUCisgICAgdSdcdTA1ZDgnICAgIyAgMHhFOCAtPiBIRUJSRVcgTEVUVEVSIFRFVAorICAgIHUnXHUwNWQ5JyAgICMgIDB4RTkgLT4gSEVCUkVXIExFVFRFUiBZT0QKKyAgICB1J1x1MDVkYScgICAjICAweEVBIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgS0FGCisgICAgdSdcdTA1ZGInICAgIyAgMHhFQiAtPiBIRUJSRVcgTEVUVEVSIEtBRgorICAgIHUnXHUwNWRjJyAgICMgIDB4RUMgLT4gSEVCUkVXIExFVFRFUiBMQU1FRAorICAgIHUnXHUwNWRkJyAgICMgIDB4RUQgLT4gSEVCUkVXIExFVFRFUiBGSU5BTCBNRU0KKyAgICB1J1x1MDVkZScgICAjICAweEVFIC0+IEhFQlJFVyBMRVRURVIgTUVNCisgICAgdSdcdTA1ZGYnICAgIyAgMHhFRiAtPiBIRUJSRVcgTEVUVEVSIEZJTkFMIE5VTgorICAgIHUnXHUwNWUwJyAgICMgIDB4RjAgLT4gSEVCUkVXIExFVFRFUiBOVU4KKyAgICB1J1x1MDVlMScgICAjICAweEYxIC0+IEhFQlJFVyBMRVRURVIgU0FNRUtICisgICAgdSdcdTA1ZTInICAgIyAgMHhGMiAtPiBIRUJSRVcgTEVUVEVSIEFZSU4KKyAgICB1J1x1MDVlMycgICAjICAweEYzIC0+IEhFQlJFVyBMRVRURVIgRklOQUwgUEUKKyAgICB1J1x1MDVlNCcgICAjICAweEY0IC0+IEhFQlJFVyBMRVRURVIgUEUKKyAgICB1J1x1MDVlNScgICAjICAweEY1IC0+IEhFQlJFVyBMRVRURVIgRklOQUwgVFNBREkKKyAgICB1J1x1MDVlNicgICAjICAweEY2IC0+IEhFQlJFVyBMRVRURVIgVFNBREkKKyAgICB1J1x1MDVlNycgICAjICAweEY3IC0+IEhFQlJFVyBMRVRURVIgUU9GCisgICAgdSdcdTA1ZTgnICAgIyAgMHhGOCAtPiBIRUJSRVcgTEVUVEVSIFJFU0gKKyAgICB1J1x1MDVlOScgICAjICAweEY5IC0+IEhFQlJFVyBMRVRURVIgU0hJTgorICAgIHUnXHUwNWVhJyAgICMgIDB4RkEgLT4gSEVCUkVXIExFVFRFUiBUQVYKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1ZmZmZScKKyAgICB1J1x1MjAwZScgICAjICAweEZEIC0+IExFRlQtVE8tUklHSFQgTUFSSworICAgIHUnXHUyMDBmJyAgICMgIDB4RkUgLT4gUklHSFQtVE8tTEVGVCBNQVJLCisgICAgdSdcdWZmZmUnCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzgucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRiMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzgucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRiMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV84LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzkucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9pc284ODU5XzkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwMjkzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOS5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBpc284ODU5XzkgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL0lTTzg4NTkvODg1OS05LlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzg4NTktOScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHhhMCcgICAgICMgIDB4QTAgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x4YTEnICAgICAjICAweEExIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YTInICAgICAjICAweEEyIC0+IENFTlQgU0lHTgorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNCcgICAgICMgIDB4QTQgLT4gQ1VSUkVOQ1kgU0lHTgorICAgIHUnXHhhNScgICAgICMgIDB4QTUgLT4gWUVOIFNJR04KKyAgICB1J1x4YTYnICAgICAjICAweEE2IC0+IEJST0tFTiBCQVIKKyAgICB1J1x4YTcnICAgICAjICAweEE3IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHhhOCcgICAgICMgIDB4QTggLT4gRElBRVJFU0lTCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHhhYScgICAgICMgIDB4QUEgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YWInICAgICAjICAweEFCIC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhBQyAtPiBOT1QgU0lHTgorICAgIHUnXHhhZCcgICAgICMgIDB4QUQgLT4gU09GVCBIWVBIRU4KKyAgICB1J1x4YWUnICAgICAjICAweEFFIC0+IFJFR0lTVEVSRUQgU0lHTgorICAgIHUnXHhhZicgICAgICMgIDB4QUYgLT4gTUFDUk9OCisgICAgdSdceGIwJyAgICAgIyAgMHhCMCAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdceGIyJyAgICAgIyAgMHhCMiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YjMnICAgICAjICAweEIzIC0+IFNVUEVSU0NSSVBUIFRIUkVFCisgICAgdSdceGI0JyAgICAgIyAgMHhCNCAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x4YjYnICAgICAjICAweEI2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHhiNycgICAgICMgIDB4QjcgLT4gTUlERExFIERPVAorICAgIHUnXHhiOCcgICAgICMgIDB4QjggLT4gQ0VESUxMQQorICAgIHUnXHhiOScgICAgICMgIDB4QjkgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGJhJyAgICAgIyAgMHhCQSAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmInICAgICAjICAweEJCIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYycgICAgICMgIDB4QkMgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBRVUFSVEVSCisgICAgdSdceGJkJyAgICAgIyAgMHhCRCAtPiBWVUxHQVIgRlJBQ1RJT04gT05FIEhBTEYKKyAgICB1J1x4YmUnICAgICAjICAweEJFIC0+IFZVTEdBUiBGUkFDVElPTiBUSFJFRSBRVUFSVEVSUworICAgIHUnXHhiZicgICAgICMgIDB4QkYgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhjMCcgICAgICMgIDB4QzAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMxJyAgICAgIyAgMHhDMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4YzInICAgICAjICAweEMyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMzJyAgICAgIyAgMHhDMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4YzQnICAgICAjICAweEM0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM2JyAgICAgIyAgMHhDNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorICAgIHUnXHhjNycgICAgICMgIDB4QzcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4YzgnICAgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjOScgICAgICMgIDB4QzkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGNhJyAgICAgIyAgMHhDQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYicgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhDRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMWUnICAgIyAgMHhEMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQlJFVkUKKyAgICB1J1x4ZDEnICAgICAjICAweEQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkMicgICAgICMgIDB4RDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhEMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ1JyAgICAgIyAgMHhENSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweEQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZDcnICAgICAjICAweEQ3IC0+IE1VTFRJUExJQ0FUSU9OIFNJR04KKyAgICB1J1x4ZDgnICAgICAjICAweEQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDknICAgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4REEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhEQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkYycgICAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTMwJyAgICMgIDB4REQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTVlJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZGYnICAgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGUwJyAgICAgIyAgMHhFMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUxJyAgICAgIyAgMHhFMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUyJyAgICAgIyAgMHhFMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTMnICAgICAjICAweEUzIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTQnICAgICAjICAweEU0IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGU1JyAgICAgIyAgMHhFNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTYnICAgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHhlNycgICAgICMgIDB4RTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU4JyAgICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGU5JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGVhJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweEVCIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVjJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVkJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVlJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweEVGIC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMWYnICAgIyAgMHhGMCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRyBXSVRIIEJSRVZFCisgICAgdSdceGYxJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYyJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGYzJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGY0JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjUnICAgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x4ZjYnICAgICAjICAweEY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHhGNyAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdceGY4JyAgICAgIyAgMHhGOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhmOScgICAgICMgIDB4RjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYScgICAgICMgIDB4RkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmYicgICAgICMgIDB4RkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHhGQyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTMxJyAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHUwMTVmJyAgICMgIDB4RkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMgV0lUSCBDRURJTExBCisgICAgdSdceGZmJyAgICAgIyAgMHhGRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV85LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1MzVhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvaXNvODg1OV85LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY1MzVhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2lzbzg4NTlfOS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9qb2hhYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTJhZWViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHkKQEAgLTAsMCArMSwzOSBAQAorIworIyBqb2hhYi5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEpPSEFCCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19rciwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3Nfa3IuZ2V0Y29kZWMoJ2pvaGFiJykKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKyAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2pvaGFiJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzliOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9qb2hhYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvam9oYWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzliOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9qb2hhYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF9yLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZWI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3IucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMga29pOF9yIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL01JU0MvS09JOC1SLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2tvaTgtcicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTI1MDAnICAgIyAgMHg4MCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTAyJyAgICMgIDB4ODEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MGMnICAgIyAgMHg4MiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjUxMCcgICAjICAweDgzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHg4NCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MTgnICAgIyAgMHg4NSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUxYycgICAjICAweDg2IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUyNCcgICAjICAweDg3IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTJjJyAgICMgIDB4ODggLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUzNCcgICAjICAweDg5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4OEEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1ODAnICAgIyAgMHg4QiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHg4QyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODgnICAgIyAgMHg4RCAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHg4RSAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDhGIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MScgICAjICAweDkwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHg5MSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDkyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjMyMCcgICAjICAweDkzIC0+IFRPUCBIQUxGIElOVEVHUkFMCisgICAgdSdcdTI1YTAnICAgIyAgMHg5NCAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x1MjIxOScgICAjICAweDk1IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHUyMjFhJyAgICMgIDB4OTYgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjI0OCcgICAjICAweDk3IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHUyMjY0JyAgICMgIDB4OTggLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjUnICAgIyAgMHg5OSAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x4YTAnICAgICAjICAweDlBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTIzMjEnICAgIyAgMHg5QiAtPiBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIHUnXHhiMCcgICAgICMgIDB4OUMgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweDlEIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiNycgICAgICMgIDB4OUUgLT4gTUlERExFIERPVAorICAgIHUnXHhmNycgICAgICMgIDB4OUYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyNTUwJyAgICMgIDB4QTAgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NTEnICAgIyAgMHhBMSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTInICAgIyAgMHhBMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUwNDUxJyAgICMgIDB4QTMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgdSdcdTI1NTMnICAgIyAgMHhBNCAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTU0JyAgICMgIDB4QTUgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBSSUdIVAorICAgIHUnXHUyNTU1JyAgICMgIDB4QTYgLT4gQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUyNTU2JyAgICMgIDB4QTcgLT4gQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTU3JyAgICMgIDB4QTggLT4gQk9YIERSQVdJTkdTIERPVUJMRSBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1NTgnICAgIyAgMHhBOSAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKyAgICB1J1x1MjU1OScgICAjICAweEFBIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIFJJR0hUIFNJTkdMRQorICAgIHUnXHUyNTVhJyAgICMgIDB4QUIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgUklHSFQKKyAgICB1J1x1MjU1YicgICAjICAweEFDIC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisgICAgdSdcdTI1NWMnICAgIyAgMHhBRCAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBMRUZUIFNJTkdMRQorICAgIHUnXHUyNTVkJyAgICMgIDB4QUUgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgTEVGVAorICAgIHUnXHUyNTVlJyAgICMgIDB4QUYgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NWYnICAgIyAgMHhCMCAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU2MCcgICAjICAweEIxIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIFJJR0hUCisgICAgdSdcdTI1NjEnICAgIyAgMHhCMiAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUwNDAxJyAgICMgIDB4QjMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICB1J1x1MjU2MicgICAjICAweEI0IC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIExFRlQgU0lOR0xFCisgICAgdSdcdTI1NjMnICAgIyAgMHhCNSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisgICAgdSdcdTI1NjQnICAgIyAgMHhCNiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjUnICAgIyAgMHhCNyAtPiBCT1ggRFJBV0lOR1MgRE9XTiBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjYnICAgIyAgMHhCOCAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjU2NycgICAjICAweEI5IC0+IEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisgICAgdSdcdTI1NjgnICAgIyAgMHhCQSAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBIT1JJWk9OVEFMIFNJTkdMRQorICAgIHUnXHUyNTY5JyAgICMgIDB4QkIgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTZhJyAgICMgIDB4QkMgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2YicgICAjICAweEJEIC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NmMnICAgIyAgMHhCRSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdceGE5JyAgICAgIyAgMHhCRiAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUwNDRlJyAgICMgIDB4QzAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlVCisgICAgdSdcdTA0MzAnICAgIyAgMHhDMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorICAgIHUnXHUwNDMxJyAgICMgIDB4QzIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisgICAgdSdcdTA0NDYnICAgIyAgMHhDMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVFNFCisgICAgdSdcdTA0MzQnICAgIyAgMHhDNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKyAgICB1J1x1MDQzNScgICAjICAweEM1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJRQorICAgIHUnXHUwNDQ0JyAgICMgIDB4QzYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisgICAgdSdcdTA0MzMnICAgIyAgMHhDNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisgICAgdSdcdTA0NDUnICAgIyAgMHhDOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKyAgICB1J1x1MDQzOCcgICAjICAweEM5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgdSdcdTA0MzknICAgIyAgMHhDQSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDNhJyAgICMgIDB4Q0IgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgdSdcdTA0M2InICAgIyAgMHhDQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICB1J1x1MDQzYycgICAjICAweENEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorICAgIHUnXHUwNDNkJyAgICMgIDB4Q0UgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgdSdcdTA0M2UnICAgIyAgMHhDRiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIHUnXHUwNDNmJyAgICMgIDB4RDAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgdSdcdTA0NGYnICAgIyAgMHhEMSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUEKKyAgICB1J1x1MDQ0MCcgICAjICAweEQyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUgorICAgIHUnXHUwNDQxJyAgICMgIDB4RDMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisgICAgdSdcdTA0NDInICAgIyAgMHhENCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVEUKKyAgICB1J1x1MDQ0MycgICAjICAweEQ1IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBVCisgICAgdSdcdTA0MzYnICAgIyAgMHhENiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MzInICAgIyAgMHhENyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICB1J1x1MDQ0YycgICAjICAweEQ4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR04KKyAgICB1J1x1MDQ0YicgICAjICAweEQ5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0MzcnICAgIyAgMHhEQSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKyAgICB1J1x1MDQ0OCcgICAjICAweERCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQ0ZCcgICAjICAweERDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFCisgICAgdSdcdTA0NDknICAgIyAgMHhERCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQ0NycgICAjICAweERFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQ0YScgICAjICAweERGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKyAgICB1J1x1MDQyZScgICAjICAweEUwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlVCisgICAgdSdcdTA0MTAnICAgIyAgMHhFMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdcdTA0MTEnICAgIyAgMHhFMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorICAgIHUnXHUwNDI2JyAgICMgIDB4RTMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisgICAgdSdcdTA0MTQnICAgIyAgMHhFNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBERQorICAgIHUnXHUwNDE1JyAgICMgIDB4RTUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKyAgICB1J1x1MDQyNCcgICAjICAweEU2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisgICAgdSdcdTA0MTMnICAgIyAgMHhFNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICB1J1x1MDQyNScgICAjICAweEU4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisgICAgdSdcdTA0MTgnICAgIyAgMHhFOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdcdTA0MTknICAgIyAgMHhFQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0MWEnICAgIyAgMHhFQiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorICAgIHUnXHUwNDFiJyAgICMgIDB4RUMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKyAgICB1J1x1MDQxYycgICAjICAweEVEIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisgICAgdSdcdTA0MWQnICAgIyAgMHhFRSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIHUnXHUwNDFlJyAgICMgIDB4RUYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworICAgIHUnXHUwNDFmJyAgICMgIDB4RjAgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKyAgICB1J1x1MDQyZicgICAjICAweEYxIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgdSdcdTA0MjAnICAgIyAgMHhGMiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgIHUnXHUwNDIxJyAgICMgIDB4RjMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICB1J1x1MDQyMicgICAjICAweEY0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgdSdcdTA0MjMnICAgIyAgMHhGNSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdcdTA0MTYnICAgIyAgMHhGNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQxMicgICAjICAweEY3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgdSdcdTA0MmMnICAgIyAgMHhGOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTT0ZUIFNJR04KKyAgICB1J1x1MDQyYicgICAjICAweEY5IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQxNycgICAjICAweEZBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisgICAgdSdcdTA0MjgnICAgIyAgMHhGQiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQyZCcgICAjICAweEZDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J1x1MDQyOScgICAjICAweEZEIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0MjcnICAgIyAgMHhGRSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQyYScgICAjICAweEZGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF9yLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyOWE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF9yLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyOWE5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF91LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mva29pOF91LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MzE3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3UucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMga29pOF91IGdlbmVyYXRlZCBmcm9tICdweXRob24tbWFwcGluZ3MvS09JOC1VLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2tvaTgtdScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdcdTI1MDAnICAgIyAgMHg4MCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTAyJyAgICMgIDB4ODEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMCisgICAgdSdcdTI1MGMnICAgIyAgMHg4MiAtPiBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKyAgICB1J1x1MjUxMCcgICAjICAweDgzIC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBET1dOIEFORCBMRUZUCisgICAgdSdcdTI1MTQnICAgIyAgMHg4NCAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1MTgnICAgIyAgMHg4NSAtPiBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKyAgICB1J1x1MjUxYycgICAjICAweDg2IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgUklHSFQKKyAgICB1J1x1MjUyNCcgICAjICAweDg3IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBWRVJUSUNBTCBBTkQgTEVGVAorICAgIHUnXHUyNTJjJyAgICMgIDB4ODggLT4gQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKyAgICB1J1x1MjUzNCcgICAjICAweDg5IC0+IEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTNjJyAgICMgIDB4OEEgLT4gQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1ODAnICAgIyAgMHg4QiAtPiBVUFBFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODQnICAgIyAgMHg4QyAtPiBMT1dFUiBIQUxGIEJMT0NLCisgICAgdSdcdTI1ODgnICAgIyAgMHg4RCAtPiBGVUxMIEJMT0NLCisgICAgdSdcdTI1OGMnICAgIyAgMHg4RSAtPiBMRUZUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MCcgICAjICAweDhGIC0+IFJJR0hUIEhBTEYgQkxPQ0sKKyAgICB1J1x1MjU5MScgICAjICAweDkwIC0+IExJR0hUIFNIQURFCisgICAgdSdcdTI1OTInICAgIyAgMHg5MSAtPiBNRURJVU0gU0hBREUKKyAgICB1J1x1MjU5MycgICAjICAweDkyIC0+IERBUksgU0hBREUKKyAgICB1J1x1MjMyMCcgICAjICAweDkzIC0+IFRPUCBIQUxGIElOVEVHUkFMCisgICAgdSdcdTI1YTAnICAgIyAgMHg5NCAtPiBCTEFDSyBTUVVBUkUKKyAgICB1J1x1MjIxOScgICAjICAweDk1IC0+IEJVTExFVCBPUEVSQVRPUgorICAgIHUnXHUyMjFhJyAgICMgIDB4OTYgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MjI0OCcgICAjICAweDk3IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHUyMjY0JyAgICMgIDB4OTggLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjUnICAgIyAgMHg5OSAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x4YTAnICAgICAjICAweDlBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTIzMjEnICAgIyAgMHg5QiAtPiBCT1RUT00gSEFMRiBJTlRFR1JBTAorICAgIHUnXHhiMCcgICAgICMgIDB4OUMgLT4gREVHUkVFIFNJR04KKyAgICB1J1x4YjInICAgICAjICAweDlEIC0+IFNVUEVSU0NSSVBUIFRXTworICAgIHUnXHhiNycgICAgICMgIDB4OUUgLT4gTUlERExFIERPVAorICAgIHUnXHhmNycgICAgICMgIDB4OUYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyNTUwJyAgICMgIDB4QTAgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisgICAgdSdcdTI1NTEnICAgIyAgMHhBMSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMCisgICAgdSdcdTI1NTInICAgIyAgMHhBMiAtPiBCT1ggRFJBV0lOR1MgRE9XTiBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUwNDUxJyAgICMgIDB4QTMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgdSdcdTA0NTQnICAgIyAgMHhBNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTI1NTQnICAgIyAgMHhBNSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisgICAgdSdcdTA0NTYnICAgIyAgMHhBNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgdSdcdTA0NTcnICAgIyAgMHhBNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUkgKFVLUkFJTklBTikKKyAgICB1J1x1MjU1NycgICAjICAweEE4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgTEVGVAorICAgIHUnXHUyNTU4JyAgICMgIDB4QTkgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisgICAgdSdcdTI1NTknICAgIyAgMHhBQSAtPiBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKyAgICB1J1x1MjU1YScgICAjICAweEFCIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIFJJR0hUCisgICAgdSdcdTI1NWInICAgIyAgMHhBQyAtPiBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorICAgIHUnXHUwNDkxJyAgICMgIDB4QUQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFVLUkFJTklBTiBHSEUgV0lUSCBVUFRVUk4KKyAgICB1J1x1MjU1ZCcgICAjICAweEFFIC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVVAgQU5EIExFRlQKKyAgICB1J1x1MjU1ZScgICAjICAweEFGIC0+IEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIFJJR0hUIERPVUJMRQorICAgIHUnXHUyNTVmJyAgICMgIDB4QjAgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisgICAgdSdcdTI1NjAnICAgIyAgMHhCMSAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBSSUdIVAorICAgIHUnXHUyNTYxJyAgICMgIDB4QjIgLT4gQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgTEVGVCBET1VCTEUKKyAgICB1J1x1MDQwMScgICAjICAweEIzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgdSdcdTA0MDQnICAgIyAgMHhCNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVS1JBSU5JQU4gSUUKKyAgICB1J1x1MjU2MycgICAjICAweEI1IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgVkVSVElDQUwgQU5EIExFRlQKKyAgICB1J1x1MDQwNicgICAjICAweEI2IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEJZRUxPUlVTU0lBTi1VS1JBSU5JQU4gSQorICAgIHUnXHUwNDA3JyAgICMgIDB4QjcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUkgKFVLUkFJTklBTikKKyAgICB1J1x1MjU2NicgICAjICAweEI4IC0+IEJPWCBEUkFXSU5HUyBET1VCTEUgRE9XTiBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHUyNTY3JyAgICMgIDB4QjkgLT4gQk9YIERSQVdJTkdTIFVQIFNJTkdMRSBBTkQgSE9SSVpPTlRBTCBET1VCTEUKKyAgICB1J1x1MjU2OCcgICAjICAweEJBIC0+IEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisgICAgdSdcdTI1NjknICAgIyAgMHhCQiAtPiBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBIT1JJWk9OVEFMCisgICAgdSdcdTI1NmEnICAgIyAgMHhCQyAtPiBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorICAgIHUnXHUwNDkwJyAgICMgIDB4QkQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIEdIRSBXSVRIIFVQVFVSTgorICAgIHUnXHUyNTZjJyAgICMgIDB4QkUgLT4gQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgSE9SSVpPTlRBTAorICAgIHUnXHhhOScgICAgICMgIDB4QkYgLT4gQ09QWVJJR0hUIFNJR04KKyAgICB1J1x1MDQ0ZScgICAjICAweEMwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBZVQorICAgIHUnXHUwNDMwJyAgICMgIDB4QzEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEEKKyAgICB1J1x1MDQzMScgICAjICAweEMyIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorICAgIHUnXHUwNDQ2JyAgICMgIDB4QzMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDM0JyAgICMgIDB4QzQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERFCisgICAgdSdcdTA0MzUnICAgIyAgMHhDNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKyAgICB1J1x1MDQ0NCcgICAjICAweEM2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFRgorICAgIHUnXHUwNDMzJyAgICMgIDB4QzcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDQ1JyAgICMgIDB4QzggLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisgICAgdSdcdTA0MzgnICAgIyAgMHhDOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSQorICAgIHUnXHUwNDM5JyAgICMgIDB4Q0EgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIEkKKyAgICB1J1x1MDQzYScgICAjICAweENCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorICAgIHUnXHUwNDNiJyAgICMgIDB4Q0MgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVMCisgICAgdSdcdTA0M2MnICAgIyAgMHhDRCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRU0KKyAgICB1J1x1MDQzZCcgICAjICAweENFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorICAgIHUnXHUwNDNlJyAgICMgIDB4Q0YgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE8KKyAgICB1J1x1MDQzZicgICAjICAweEQwIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBQRQorICAgIHUnXHUwNDRmJyAgICMgIDB4RDEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisgICAgdSdcdTA0NDAnICAgIyAgMHhEMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICB1J1x1MDQ0MScgICAjICAweEQzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgIHUnXHUwNDQyJyAgICMgIDB4RDQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgdSdcdTA0NDMnICAgIyAgMHhENSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgIHUnXHUwNDM2JyAgICMgIDB4RDYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpIRQorICAgIHUnXHUwNDMyJyAgICMgIDB4RDcgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisgICAgdSdcdTA0NGMnICAgIyAgMHhEOCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0NGInICAgIyAgMHhEOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDM3JyAgICMgIDB4REEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisgICAgdSdcdTA0NDgnICAgIyAgMHhEQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hBCisgICAgdSdcdTA0NGQnICAgIyAgMHhEQyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRQorICAgIHUnXHUwNDQ5JyAgICMgIDB4REQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisgICAgdSdcdTA0NDcnICAgIyAgMHhERSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0NGEnICAgIyAgMHhERiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEFSRCBTSUdOCisgICAgdSdcdTA0MmUnICAgIyAgMHhFMCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorICAgIHUnXHUwNDEwJyAgICMgIDB4RTEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnXHUwNDExJyAgICMgIDB4RTIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICB1J1x1MDQyNicgICAjICAweEUzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgIHUnXHUwNDE0JyAgICMgIDB4RTQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICB1J1x1MDQxNScgICAjICAweEU1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgdSdcdTA0MjQnICAgIyAgMHhFNiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgIHUnXHUwNDEzJyAgICMgIDB4RTcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgR0hFCisgICAgdSdcdTA0MjUnICAgIyAgMHhFOCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorICAgIHUnXHUwNDE4JyAgICMgIDB4RTkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnXHUwNDE5JyAgICMgIDB4RUEgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDFhJyAgICMgIDB4RUIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICB1J1x1MDQxYicgICAjICAweEVDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgdSdcdTA0MWMnICAgIyAgMHhFRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgIHUnXHUwNDFkJyAgICMgIDB4RUUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICB1J1x1MDQxZScgICAjICAweEVGIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1x1MDQxZicgICAjICAweEYwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgdSdcdTA0MmYnICAgIyAgMHhGMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZQQorICAgIHUnXHUwNDIwJyAgICMgIDB4RjIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKyAgICB1J1x1MDQyMScgICAjICAweEYzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTCisgICAgdSdcdTA0MjInICAgIyAgMHhGNCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBURQorICAgIHUnXHUwNDIzJyAgICMgIDB4RjUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnXHUwNDE2JyAgICMgIDB4RjYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MTInICAgIyAgMHhGNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorICAgIHUnXHUwNDJjJyAgICMgIDB4RjggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0MmInICAgIyAgMHhGOSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZRVJVCisgICAgdSdcdTA0MTcnICAgIyAgMHhGQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgIHUnXHUwNDI4JyAgICMgIDB4RkIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisgICAgdSdcdTA0MmQnICAgIyAgMHhGQyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdcdTA0MjknICAgIyAgMHhGRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDI3JyAgICMgIDB4RkUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgdSdcdTA0MmEnICAgIyAgMHhGRiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfdS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTU3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2tvaThfdS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTU3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9rb2k4X3UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2xhdGluXzEucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9sYXRpbl8xLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDE2MGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9sYXRpbl8xLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyIiIiBQeXRob24gJ2xhdGluLTEnIENvZGVjCisKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgIyBOb3RlOiBCaW5kaW5nIHRoZXNlIGFzIEMgZnVuY3Rpb25zIHdpbGwgcmVzdWx0IGluIHRoZSBjbGFzcyBub3QKKyAgICAjIGNvbnZlcnRpbmcgdGhlbSB0byBtZXRob2RzLiBUaGlzIGlzIGludGVuZGVkLgorICAgIGVuY29kZSA9IGNvZGVjcy5sYXRpbl8xX2VuY29kZQorICAgIGRlY29kZSA9IGNvZGVjcy5sYXRpbl8xX2RlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmxhdGluXzFfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmxhdGluXzFfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1Db252ZXJ0ZXIoU3RyZWFtV3JpdGVyLFN0cmVhbVJlYWRlcik6CisKKyAgICBlbmNvZGUgPSBjb2RlY3MubGF0aW5fMV9kZWNvZGUKKyAgICBkZWNvZGUgPSBjb2RlY3MubGF0aW5fMV9lbmNvZGUKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc284ODU5LTEnLAorICAgICAgICBlbmNvZGU9Q29kZWMuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2xhdGluXzEucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbGF0aW5fMS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiN2ZjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2xhdGluXzEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2xhdGluXzEucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbGF0aW5fMS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRiN2ZjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL2xhdGluXzEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19hcmFiaWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhN2QzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfYXJhYmljLnB5CkBAIC0wLDAgKzEsNjk4IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGdlbmVyYXRlZCBmcm9tICdWRU5ET1JTL0FQUExFL0FSQUJJQy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J21hYy1hcmFiaWMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgMHgwMDgwOiAweDAwYzQsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDgxOiAweDAwYTAsICAgICAjICBOTy1CUkVBSyBTUEFDRSwgcmlnaHQtbGVmdAorICAgIDB4MDA4MjogMHgwMGM3LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICAweDAwODM6IDB4MDBjOSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIDB4MDA4NDogMHgwMGQxLCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMDg1OiAweDAwZDYsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDg2OiAweDAwZGMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDg3OiAweDAwZTEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgMHgwMDg4OiAweDAwZTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgMHgwMDg5OiAweDAwZTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOGE6IDB4MDBlNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDhiOiAweDA2YmEsICAgICAjICBBUkFCSUMgTEVUVEVSIE5PT04gR0hVTk5BCisgICAgMHgwMDhjOiAweDAwYWIsICAgICAjICBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIDB4MDA4ZDogMHgwMGU3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMDhlOiAweDAwZTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMDhmOiAweDAwZTgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMDkwOiAweDAwZWEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTE6IDB4MDBlYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDkyOiAweDAwZWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMDkzOiAweDIwMjYsICAgICAjICBIT1JJWk9OVEFMIEVMTElQU0lTLCByaWdodC1sZWZ0CisgICAgMHgwMDk0OiAweDAwZWUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwOTU6IDB4MDBlZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMDk2OiAweDAwZjEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMDk3OiAweDAwZjMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMDk4OiAweDAwYmIsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICAweDAwOTk6IDB4MDBmNCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5YTogMHgwMGY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICAweDAwOWI6IDB4MDBmNywgICAgICMgIERJVklTSU9OIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwOWM6IDB4MDBmYSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAweDAwOWQ6IDB4MDBmOSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICAweDAwOWU6IDB4MDBmYiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIDB4MDA5ZjogMHgwMGZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYTA6IDB4MDAyMCwgICAgICMgIFNQQUNFLCByaWdodC1sZWZ0CisgICAgMHgwMGExOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgMHgwMGEyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIDB4MDBhMzogMHgwMDIzLCAgICAgIyAgTlVNQkVSIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwYTQ6IDB4MDAyNCwgICAgICMgIERPTExBUiBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMGE1OiAweDA2NmEsICAgICAjICBBUkFCSUMgUEVSQ0VOVCBTSUdOCisgICAgMHgwMGE2OiAweDAwMjYsICAgICAjICBBTVBFUlNBTkQsIHJpZ2h0LWxlZnQKKyAgICAweDAwYTc6IDB4MDAyNywgICAgICMgIEFQT1NUUk9QSEUsIHJpZ2h0LWxlZnQKKyAgICAweDAwYTg6IDB4MDAyOCwgICAgICMgIExFRlQgUEFSRU5USEVTSVMsIHJpZ2h0LWxlZnQKKyAgICAweDAwYTk6IDB4MDAyOSwgICAgICMgIFJJR0hUIFBBUkVOVEhFU0lTLCByaWdodC1sZWZ0CisgICAgMHgwMGFhOiAweDAwMmEsICAgICAjICBBU1RFUklTSywgcmlnaHQtbGVmdAorICAgIDB4MDBhYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMGFjOiAweDA2MGMsICAgICAjICBBUkFCSUMgQ09NTUEKKyAgICAweDAwYWQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUywgcmlnaHQtbGVmdAorICAgIDB4MDBhZTogMHgwMDJlLCAgICAgIyAgRlVMTCBTVE9QLCByaWdodC1sZWZ0CisgICAgMHgwMGFmOiAweDAwMmYsICAgICAjICBTT0xJRFVTLCByaWdodC1sZWZ0CisgICAgMHgwMGIwOiAweDA2NjAsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTywgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDAwYjE6IDB4MDY2MSwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGIyOiAweDA2NjIsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgVFdPLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDBiMzogMHgwNjYzLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFRIUkVFLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDBiNDogMHgwNjY0LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEZPVVIsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGI1OiAweDA2NjUsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgRklWRSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDAwYjY6IDB4MDY2NiwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBTSVgsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGI3OiAweDA2NjcsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGI4OiAweDA2NjgsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwMGI5OiAweDA2NjksICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgTklORSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDAwYmE6IDB4MDAzYSwgICAgICMgIENPTE9OLCByaWdodC1sZWZ0CisgICAgMHgwMGJiOiAweDA2MWIsICAgICAjICBBUkFCSUMgU0VNSUNPTE9OCisgICAgMHgwMGJjOiAweDAwM2MsICAgICAjICBMRVNTLVRIQU4gU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDBiZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwYmU6IDB4MDAzZSwgICAgICMgIEdSRUFURVItVEhBTiBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMGJmOiAweDA2MWYsICAgICAjICBBUkFCSUMgUVVFU1RJT04gTUFSSworICAgIDB4MDBjMDogMHgyNzRhLCAgICAgIyAgRUlHSFQgVEVBUkRST1AtU1BPS0VEIFBST1BFTExFUiBBU1RFUklTSywgcmlnaHQtbGVmdAorICAgIDB4MDBjMTogMHgwNjIxLCAgICAgIyAgQVJBQklDIExFVFRFUiBIQU1aQQorICAgIDB4MDBjMjogMHgwNjIyLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUKKyAgICAweDAwYzM6IDB4MDYyMywgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEFCT1ZFCisgICAgMHgwMGM0OiAweDA2MjQsICAgICAjICBBUkFCSUMgTEVUVEVSIFdBVyBXSVRIIEhBTVpBIEFCT1ZFCisgICAgMHgwMGM1OiAweDA2MjUsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVworICAgIDB4MDBjNjogMHgwNjI2LCAgICAgIyAgQVJBQklDIExFVFRFUiBZRUggV0lUSCBIQU1aQSBBQk9WRQorICAgIDB4MDBjNzogMHgwNjI3LCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGCisgICAgMHgwMGM4OiAweDA2MjgsICAgICAjICBBUkFCSUMgTEVUVEVSIEJFSAorICAgIDB4MDBjOTogMHgwNjI5LCAgICAgIyAgQVJBQklDIExFVFRFUiBURUggTUFSQlVUQQorICAgIDB4MDBjYTogMHgwNjJhLCAgICAgIyAgQVJBQklDIExFVFRFUiBURUgKKyAgICAweDAwY2I6IDB4MDYyYiwgICAgICMgIEFSQUJJQyBMRVRURVIgVEhFSAorICAgIDB4MDBjYzogMHgwNjJjLCAgICAgIyAgQVJBQklDIExFVFRFUiBKRUVNCisgICAgMHgwMGNkOiAweDA2MmQsICAgICAjICBBUkFCSUMgTEVUVEVSIEhBSAorICAgIDB4MDBjZTogMHgwNjJlLCAgICAgIyAgQVJBQklDIExFVFRFUiBLSEFICisgICAgMHgwMGNmOiAweDA2MmYsICAgICAjICBBUkFCSUMgTEVUVEVSIERBTAorICAgIDB4MDBkMDogMHgwNjMwLCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEFMCisgICAgMHgwMGQxOiAweDA2MzEsICAgICAjICBBUkFCSUMgTEVUVEVSIFJFSAorICAgIDB4MDBkMjogMHgwNjMyLCAgICAgIyAgQVJBQklDIExFVFRFUiBaQUlOCisgICAgMHgwMGQzOiAweDA2MzMsICAgICAjICBBUkFCSUMgTEVUVEVSIFNFRU4KKyAgICAweDAwZDQ6IDB4MDYzNCwgICAgICMgIEFSQUJJQyBMRVRURVIgU0hFRU4KKyAgICAweDAwZDU6IDB4MDYzNSwgICAgICMgIEFSQUJJQyBMRVRURVIgU0FECisgICAgMHgwMGQ2OiAweDA2MzYsICAgICAjICBBUkFCSUMgTEVUVEVSIERBRAorICAgIDB4MDBkNzogMHgwNjM3LCAgICAgIyAgQVJBQklDIExFVFRFUiBUQUgKKyAgICAweDAwZDg6IDB4MDYzOCwgICAgICMgIEFSQUJJQyBMRVRURVIgWkFICisgICAgMHgwMGQ5OiAweDA2MzksICAgICAjICBBUkFCSUMgTEVUVEVSIEFJTgorICAgIDB4MDBkYTogMHgwNjNhLCAgICAgIyAgQVJBQklDIExFVFRFUiBHSEFJTgorICAgIDB4MDBkYjogMHgwMDViLCAgICAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVCwgcmlnaHQtbGVmdAorICAgIDB4MDBkYzogMHgwMDVjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTLCByaWdodC1sZWZ0CisgICAgMHgwMGRkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVCwgcmlnaHQtbGVmdAorICAgIDB4MDBkZTogMHgwMDVlLCAgICAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQsIHJpZ2h0LWxlZnQKKyAgICAweDAwZGY6IDB4MDA1ZiwgICAgICMgIExPVyBMSU5FLCByaWdodC1sZWZ0CisgICAgMHgwMGUwOiAweDA2NDAsICAgICAjICBBUkFCSUMgVEFUV0VFTAorICAgIDB4MDBlMTogMHgwNjQxLCAgICAgIyAgQVJBQklDIExFVFRFUiBGRUgKKyAgICAweDAwZTI6IDB4MDY0MiwgICAgICMgIEFSQUJJQyBMRVRURVIgUUFGCisgICAgMHgwMGUzOiAweDA2NDMsICAgICAjICBBUkFCSUMgTEVUVEVSIEtBRgorICAgIDB4MDBlNDogMHgwNjQ0LCAgICAgIyAgQVJBQklDIExFVFRFUiBMQU0KKyAgICAweDAwZTU6IDB4MDY0NSwgICAgICMgIEFSQUJJQyBMRVRURVIgTUVFTQorICAgIDB4MDBlNjogMHgwNjQ2LCAgICAgIyAgQVJBQklDIExFVFRFUiBOT09OCisgICAgMHgwMGU3OiAweDA2NDcsICAgICAjICBBUkFCSUMgTEVUVEVSIEhFSAorICAgIDB4MDBlODogMHgwNjQ4LCAgICAgIyAgQVJBQklDIExFVFRFUiBXQVcKKyAgICAweDAwZTk6IDB4MDY0OSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisgICAgMHgwMGVhOiAweDA2NGEsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSAorICAgIDB4MDBlYjogMHgwNjRiLCAgICAgIyAgQVJBQklDIEZBVEhBVEFOCisgICAgMHgwMGVjOiAweDA2NGMsICAgICAjICBBUkFCSUMgREFNTUFUQU4KKyAgICAweDAwZWQ6IDB4MDY0ZCwgICAgICMgIEFSQUJJQyBLQVNSQVRBTgorICAgIDB4MDBlZTogMHgwNjRlLCAgICAgIyAgQVJBQklDIEZBVEhBCisgICAgMHgwMGVmOiAweDA2NGYsICAgICAjICBBUkFCSUMgREFNTUEKKyAgICAweDAwZjA6IDB4MDY1MCwgICAgICMgIEFSQUJJQyBLQVNSQQorICAgIDB4MDBmMTogMHgwNjUxLCAgICAgIyAgQVJBQklDIFNIQUREQQorICAgIDB4MDBmMjogMHgwNjUyLCAgICAgIyAgQVJBQklDIFNVS1VOCisgICAgMHgwMGYzOiAweDA2N2UsICAgICAjICBBUkFCSUMgTEVUVEVSIFBFSAorICAgIDB4MDBmNDogMHgwNjc5LCAgICAgIyAgQVJBQklDIExFVFRFUiBUVEVICisgICAgMHgwMGY1OiAweDA2ODYsICAgICAjICBBUkFCSUMgTEVUVEVSIFRDSEVICisgICAgMHgwMGY2OiAweDA2ZDUsICAgICAjICBBUkFCSUMgTEVUVEVSIEFFCisgICAgMHgwMGY3OiAweDA2YTQsICAgICAjICBBUkFCSUMgTEVUVEVSIFZFSAorICAgIDB4MDBmODogMHgwNmFmLCAgICAgIyAgQVJBQklDIExFVFRFUiBHQUYKKyAgICAweDAwZjk6IDB4MDY4OCwgICAgICMgIEFSQUJJQyBMRVRURVIgRERBTAorICAgIDB4MDBmYTogMHgwNjkxLCAgICAgIyAgQVJBQklDIExFVFRFUiBSUkVICisgICAgMHgwMGZiOiAweDAwN2IsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwZmM6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUsIHJpZ2h0LWxlZnQKKyAgICAweDAwZmQ6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwZmU6IDB4MDY5OCwgICAgICMgIEFSQUJJQyBMRVRURVIgSkVICisgICAgMHgwMGZmOiAweDA2ZDIsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBCQVJSRUUKK30pCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwMDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAwMDEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDInICAgICAjICAweDAwMDIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDMnICAgICAjICAweDAwMDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDAwMDQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDUnICAgICAjICAweDAwMDUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDYnICAgICAjICAweDAwMDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDAwMDcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDgnICAgICAjICAweDAwMDggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x0JyAgICAgICAjICAweDAwMDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDAwMGEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGInICAgICAjICAweDAwMGIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGMnICAgICAjICAweDAwMGMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDAwMGQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGUnICAgICAjICAweDAwMGUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGYnICAgICAjICAweDAwMGYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDAwMTAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTEnICAgICAjICAweDAwMTEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTInICAgICAjICAweDAwMTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDAwMTMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTQnICAgICAjICAweDAwMTQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTUnICAgICAjICAweDAwMTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDAwMTYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTcnICAgICAjICAweDAwMTcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTgnICAgICAjICAweDAwMTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDAwMTkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWEnICAgICAjICAweDAwMWEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWInICAgICAjICAweDAwMWIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDAwMWMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWQnICAgICAjICAweDAwMWQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWUnICAgICAjICAweDAwMWUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDAwMWYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1JyAnICAgICAgICAjICAweDAwMjAgLT4gU1BBQ0UsIGxlZnQtcmlnaHQKKyAgICB1JyEnICAgICAgICAjICAweDAwMjEgLT4gRVhDTEFNQVRJT04gTUFSSywgbGVmdC1yaWdodAorICAgIHUnIicgICAgICAgICMgIDB4MDAyMiAtPiBRVU9UQVRJT04gTUFSSywgbGVmdC1yaWdodAorICAgIHUnIycgICAgICAgICMgIDB4MDAyMyAtPiBOVU1CRVIgU0lHTiwgbGVmdC1yaWdodAorICAgIHUnJCcgICAgICAgICMgIDB4MDAyNCAtPiBET0xMQVIgU0lHTiwgbGVmdC1yaWdodAorICAgIHUnJScgICAgICAgICMgIDB4MDAyNSAtPiBQRVJDRU5UIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1JyYnICAgICAgICAjICAweDAwMjYgLT4gQU1QRVJTQU5ELCBsZWZ0LXJpZ2h0CisgICAgdSInIiAgICAgICAgIyAgMHgwMDI3IC0+IEFQT1NUUk9QSEUsIGxlZnQtcmlnaHQKKyAgICB1JygnICAgICAgICAjICAweDAwMjggLT4gTEVGVCBQQVJFTlRIRVNJUywgbGVmdC1yaWdodAorICAgIHUnKScgICAgICAgICMgIDB4MDAyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUywgbGVmdC1yaWdodAorICAgIHUnKicgICAgICAgICMgIDB4MDAyYSAtPiBBU1RFUklTSywgbGVmdC1yaWdodAorICAgIHUnKycgICAgICAgICMgIDB4MDAyYiAtPiBQTFVTIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1JywnICAgICAgICAjICAweDAwMmMgLT4gQ09NTUEsIGxlZnQtcmlnaHQ7IGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2QyBBUkFCSUMgVEhPVVNBTkRTIFNFUEFSQVRPUgorICAgIHUnLScgICAgICAgICMgIDB4MDAyZCAtPiBIWVBIRU4tTUlOVVMsIGxlZnQtcmlnaHQKKyAgICB1Jy4nICAgICAgICAjICAweDAwMmUgLT4gRlVMTCBTVE9QLCBsZWZ0LXJpZ2h0OyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NkIgQVJBQklDIERFQ0lNQUwgU0VQQVJBVE9SCisgICAgdScvJyAgICAgICAgIyAgMHgwMDJmIC0+IFNPTElEVVMsIGxlZnQtcmlnaHQKKyAgICB1JzAnICAgICAgICAjICAweDAwMzAgLT4gRElHSVQgWkVSTzsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2MCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MDAzMSAtPiBESUdJVCBPTkU7ICAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjYxIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDAwMzIgLT4gRElHSVQgVFdPOyAgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2MiBBUkFCSUMtSU5ESUMgRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgwMDMzIC0+IERJR0lUIFRIUkVFOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjMgQVJBQklDLUlORElDIERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgwMDM0IC0+IERJR0lUIEZPVVI7ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjQgQVJBQklDLUlORElDIERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDAwMzUgLT4gRElHSVQgRklWRTsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2NSBBUkFCSUMtSU5ESUMgRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MDAzNiAtPiBESUdJVCBTSVg7ICAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjY2IEFSQUJJQy1JTkRJQyBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDAwMzcgLT4gRElHSVQgU0VWRU47IGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2NyBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDAwMzggLT4gRElHSVQgRUlHSFQ7IGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2OCBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDAwMzkgLT4gRElHSVQgTklORTsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2OSBBUkFCSUMtSU5ESUMgRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4MDAzYSAtPiBDT0xPTiwgbGVmdC1yaWdodAorICAgIHUnOycgICAgICAgICMgIDB4MDAzYiAtPiBTRU1JQ09MT04sIGxlZnQtcmlnaHQKKyAgICB1JzwnICAgICAgICAjICAweDAwM2MgLT4gTEVTUy1USEFOIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1Jz0nICAgICAgICAjICAweDAwM2QgLT4gRVFVQUxTIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1Jz4nICAgICAgICAjICAweDAwM2UgLT4gR1JFQVRFUi1USEFOIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1Jz8nICAgICAgICAjICAweDAwM2YgLT4gUVVFU1RJT04gTUFSSywgbGVmdC1yaWdodAorICAgIHUnQCcgICAgICAgICMgIDB4MDA0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHgwMDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDAwNDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4MDA0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHgwMDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDAwNDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4MDA0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHgwMDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDAwNDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4MDA0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHgwMDRhIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDAwNGIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4MDA0YyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHgwMDRkIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDAwNGUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4MDA0ZiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHgwMDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDAwNTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4MDA1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHgwMDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDAwNTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4MDA1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHgwMDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDAwNTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4MDA1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHgwMDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDAwNWEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4MDA1YiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgdSdcXCcgICAgICAgIyAgMHgwMDVjIC0+IFJFVkVSU0UgU09MSURVUywgbGVmdC1yaWdodAorICAgIHUnXScgICAgICAgICMgIDB4MDA1ZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIHUnXicgICAgICAgICMgIDB4MDA1ZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVCwgbGVmdC1yaWdodAorICAgIHUnXycgICAgICAgICMgIDB4MDA1ZiAtPiBMT1cgTElORSwgbGVmdC1yaWdodAorICAgIHUnYCcgICAgICAgICMgIDB4MDA2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDAwNjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDAwNjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDAwNjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDAwNjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDAwNjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDAwNjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDAwNjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDAwNjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDAwNjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDAwNmEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDAwNmIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDAwNmMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDAwNmQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDAwNmUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDAwNmYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDAwNzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDAwNzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDAwNzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDAwNzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDAwNzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDAwNzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDAwNzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDAwNzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDAwNzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDAwNzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDAwN2EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDAwN2IgLT4gTEVGVCBDVVJMWSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgdSd8JyAgICAgICAgIyAgMHgwMDdjIC0+IFZFUlRJQ0FMIExJTkUsIGxlZnQtcmlnaHQKKyAgICB1J30nICAgICAgICAjICAweDAwN2QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIHUnficgICAgICAgICMgIDB4MDA3ZSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4MDA3ZiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHhjNCcgICAgICMgIDB4MDA4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHgwMDgxIC0+IE5PLUJSRUFLIFNQQUNFLCByaWdodC1sZWZ0CisgICAgdSdceGM3JyAgICAgIyAgMHgwMDgyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM5JyAgICAgIyAgMHgwMDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhkMScgICAgICMgIDB4MDA4NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweDAwODUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4MDA4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUxJyAgICAgIyAgMHgwMDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTAnICAgICAjICAweDAwODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMicgICAgICMgIDB4MDA4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDAwOGEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDZiYScgICAjICAweDAwOGIgLT4gQVJBQklDIExFVFRFUiBOT09OIEdIVU5OQQorICAgIHUnXHhhYicgICAgICMgIDB4MDA4YyAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIHUnXHhlNycgICAgICMgIDB4MDA4ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4ZTknICAgICAjICAweDAwOGUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4MDA4ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVhJyAgICAgIyAgMHgwMDkwIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlYicgICAgICMgIDB4MDA5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZCcgICAgICMgIDB4MDA5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdcdTIwMjYnICAgIyAgMHgwMDkzIC0+IEhPUklaT05UQUwgRUxMSVBTSVMsIHJpZ2h0LWxlZnQKKyAgICB1J1x4ZWUnICAgICAjICAweDAwOTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHgwMDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYxJyAgICAgIyAgMHgwMDk2IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZjMnICAgICAjICAweDAwOTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhiYicgICAgICMgIDB4MDA5OCAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICB1J1x4ZjQnICAgICAjICAweDAwOTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHgwMDlhIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHgwMDliIC0+IERJVklTSU9OIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1J1x4ZmEnICAgICAjICAweDAwOWMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4MDA5ZCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHgwMDllIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhmYycgICAgICMgIDB4MDA5ZiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnICcgICAgICAgICMgIDB4MDBhMCAtPiBTUEFDRSwgcmlnaHQtbGVmdAorICAgIHUnIScgICAgICAgICMgIDB4MDBhMSAtPiBFWENMQU1BVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgdSciJyAgICAgICAgIyAgMHgwMGEyIC0+IFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgdScjJyAgICAgICAgIyAgMHgwMGEzIC0+IE5VTUJFUiBTSUdOLCByaWdodC1sZWZ0CisgICAgdSckJyAgICAgICAgIyAgMHgwMGE0IC0+IERPTExBUiBTSUdOLCByaWdodC1sZWZ0CisgICAgdSdcdTA2NmEnICAgIyAgMHgwMGE1IC0+IEFSQUJJQyBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDAwYTYgLT4gQU1QRVJTQU5ELCByaWdodC1sZWZ0CisgICAgdSInIiAgICAgICAgIyAgMHgwMGE3IC0+IEFQT1NUUk9QSEUsIHJpZ2h0LWxlZnQKKyAgICB1JygnICAgICAgICAjICAweDAwYTggLT4gTEVGVCBQQVJFTlRIRVNJUywgcmlnaHQtbGVmdAorICAgIHUnKScgICAgICAgICMgIDB4MDBhOSAtPiBSSUdIVCBQQVJFTlRIRVNJUywgcmlnaHQtbGVmdAorICAgIHUnKicgICAgICAgICMgIDB4MDBhYSAtPiBBU1RFUklTSywgcmlnaHQtbGVmdAorICAgIHUnKycgICAgICAgICMgIDB4MDBhYiAtPiBQTFVTIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDYwYycgICAjICAweDAwYWMgLT4gQVJBQklDIENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgwMGFkIC0+IEhZUEhFTi1NSU5VUywgcmlnaHQtbGVmdAorICAgIHUnLicgICAgICAgICMgIDB4MDBhZSAtPiBGVUxMIFNUT1AsIHJpZ2h0LWxlZnQKKyAgICB1Jy8nICAgICAgICAjICAweDAwYWYgLT4gU09MSURVUywgcmlnaHQtbGVmdAorICAgIHUnXHUwNjYwJyAgICMgIDB4MDBiMCAtPiBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTywgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDY2MScgICAjICAweDAwYjEgLT4gQVJBQklDLUlORElDIERJR0lUIE9ORSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDY2MicgICAjICAweDAwYjIgLT4gQVJBQklDLUlORElDIERJR0lUIFRXTywgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDY2MycgICAjICAweDAwYjMgLT4gQVJBQklDLUlORElDIERJR0lUIFRIUkVFLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNjY0JyAgICMgIDB4MDBiNCAtPiBBUkFCSUMtSU5ESUMgRElHSVQgRk9VUiwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDY2NScgICAjICAweDAwYjUgLT4gQVJBQklDLUlORElDIERJR0lUIEZJVkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2NjYnICAgIyAgMHgwMGI2IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBTSVgsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2NjcnICAgIyAgMHgwMGI3IC0+IEFSQUJJQy1JTkRJQyBESUdJVCBTRVZFTiwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDY2OCcgICAjICAweDAwYjggLT4gQVJBQklDLUlORElDIERJR0lUIEVJR0hULCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNjY5JyAgICMgIDB4MDBiOSAtPiBBUkFCSUMtSU5ESUMgRElHSVQgTklORSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1JzonICAgICAgICAjICAweDAwYmEgLT4gQ09MT04sIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDYxYicgICAjICAweDAwYmIgLT4gQVJBQklDIFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4MDBiYyAtPiBMRVNTLVRIQU4gU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnPScgICAgICAgICMgIDB4MDBiZCAtPiBFUVVBTFMgU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnPicgICAgICAgICMgIDB4MDBiZSAtPiBHUkVBVEVSLVRIQU4gU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjFmJyAgICMgIDB4MDBiZiAtPiBBUkFCSUMgUVVFU1RJT04gTUFSSworICAgIHUnXHUyNzRhJyAgICMgIDB4MDBjMCAtPiBFSUdIVCBURUFSRFJPUC1TUE9LRUQgUFJPUEVMTEVSIEFTVEVSSVNLLCByaWdodC1sZWZ0CisgICAgdSdcdTA2MjEnICAgIyAgMHgwMGMxIC0+IEFSQUJJQyBMRVRURVIgSEFNWkEKKyAgICB1J1x1MDYyMicgICAjICAweDAwYzIgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggTUFEREEgQUJPVkUKKyAgICB1J1x1MDYyMycgICAjICAweDAwYzMgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNCcgICAjICAweDAwYzQgLT4gQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI1JyAgICMgIDB4MDBjNSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBCRUxPVworICAgIHUnXHUwNjI2JyAgICMgIDB4MDBjNiAtPiBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFCisgICAgdSdcdTA2MjcnICAgIyAgMHgwMGM3IC0+IEFSQUJJQyBMRVRURVIgQUxFRgorICAgIHUnXHUwNjI4JyAgICMgIDB4MDBjOCAtPiBBUkFCSUMgTEVUVEVSIEJFSAorICAgIHUnXHUwNjI5JyAgICMgIDB4MDBjOSAtPiBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBCisgICAgdSdcdTA2MmEnICAgIyAgMHgwMGNhIC0+IEFSQUJJQyBMRVRURVIgVEVICisgICAgdSdcdTA2MmInICAgIyAgMHgwMGNiIC0+IEFSQUJJQyBMRVRURVIgVEhFSAorICAgIHUnXHUwNjJjJyAgICMgIDB4MDBjYyAtPiBBUkFCSUMgTEVUVEVSIEpFRU0KKyAgICB1J1x1MDYyZCcgICAjICAweDAwY2QgLT4gQVJBQklDIExFVFRFUiBIQUgKKyAgICB1J1x1MDYyZScgICAjICAweDAwY2UgLT4gQVJBQklDIExFVFRFUiBLSEFICisgICAgdSdcdTA2MmYnICAgIyAgMHgwMGNmIC0+IEFSQUJJQyBMRVRURVIgREFMCisgICAgdSdcdTA2MzAnICAgIyAgMHgwMGQwIC0+IEFSQUJJQyBMRVRURVIgVEhBTAorICAgIHUnXHUwNjMxJyAgICMgIDB4MDBkMSAtPiBBUkFCSUMgTEVUVEVSIFJFSAorICAgIHUnXHUwNjMyJyAgICMgIDB4MDBkMiAtPiBBUkFCSUMgTEVUVEVSIFpBSU4KKyAgICB1J1x1MDYzMycgICAjICAweDAwZDMgLT4gQVJBQklDIExFVFRFUiBTRUVOCisgICAgdSdcdTA2MzQnICAgIyAgMHgwMGQ0IC0+IEFSQUJJQyBMRVRURVIgU0hFRU4KKyAgICB1J1x1MDYzNScgICAjICAweDAwZDUgLT4gQVJBQklDIExFVFRFUiBTQUQKKyAgICB1J1x1MDYzNicgICAjICAweDAwZDYgLT4gQVJBQklDIExFVFRFUiBEQUQKKyAgICB1J1x1MDYzNycgICAjICAweDAwZDcgLT4gQVJBQklDIExFVFRFUiBUQUgKKyAgICB1J1x1MDYzOCcgICAjICAweDAwZDggLT4gQVJBQklDIExFVFRFUiBaQUgKKyAgICB1J1x1MDYzOScgICAjICAweDAwZDkgLT4gQVJBQklDIExFVFRFUiBBSU4KKyAgICB1J1x1MDYzYScgICAjICAweDAwZGEgLT4gQVJBQklDIExFVFRFUiBHSEFJTgorICAgIHUnWycgICAgICAgICMgIDB4MDBkYiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgdSdcXCcgICAgICAgIyAgMHgwMGRjIC0+IFJFVkVSU0UgU09MSURVUywgcmlnaHQtbGVmdAorICAgIHUnXScgICAgICAgICMgIDB4MDBkZCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVCwgcmlnaHQtbGVmdAorICAgIHUnXicgICAgICAgICMgIDB4MDBkZSAtPiBDSVJDVU1GTEVYIEFDQ0VOVCwgcmlnaHQtbGVmdAorICAgIHUnXycgICAgICAgICMgIDB4MDBkZiAtPiBMT1cgTElORSwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjQwJyAgICMgIDB4MDBlMCAtPiBBUkFCSUMgVEFUV0VFTAorICAgIHUnXHUwNjQxJyAgICMgIDB4MDBlMSAtPiBBUkFCSUMgTEVUVEVSIEZFSAorICAgIHUnXHUwNjQyJyAgICMgIDB4MDBlMiAtPiBBUkFCSUMgTEVUVEVSIFFBRgorICAgIHUnXHUwNjQzJyAgICMgIDB4MDBlMyAtPiBBUkFCSUMgTEVUVEVSIEtBRgorICAgIHUnXHUwNjQ0JyAgICMgIDB4MDBlNCAtPiBBUkFCSUMgTEVUVEVSIExBTQorICAgIHUnXHUwNjQ1JyAgICMgIDB4MDBlNSAtPiBBUkFCSUMgTEVUVEVSIE1FRU0KKyAgICB1J1x1MDY0NicgICAjICAweDAwZTYgLT4gQVJBQklDIExFVFRFUiBOT09OCisgICAgdSdcdTA2NDcnICAgIyAgMHgwMGU3IC0+IEFSQUJJQyBMRVRURVIgSEVICisgICAgdSdcdTA2NDgnICAgIyAgMHgwMGU4IC0+IEFSQUJJQyBMRVRURVIgV0FXCisgICAgdSdcdTA2NDknICAgIyAgMHgwMGU5IC0+IEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisgICAgdSdcdTA2NGEnICAgIyAgMHgwMGVhIC0+IEFSQUJJQyBMRVRURVIgWUVICisgICAgdSdcdTA2NGInICAgIyAgMHgwMGViIC0+IEFSQUJJQyBGQVRIQVRBTgorICAgIHUnXHUwNjRjJyAgICMgIDB4MDBlYyAtPiBBUkFCSUMgREFNTUFUQU4KKyAgICB1J1x1MDY0ZCcgICAjICAweDAwZWQgLT4gQVJBQklDIEtBU1JBVEFOCisgICAgdSdcdTA2NGUnICAgIyAgMHgwMGVlIC0+IEFSQUJJQyBGQVRIQQorICAgIHUnXHUwNjRmJyAgICMgIDB4MDBlZiAtPiBBUkFCSUMgREFNTUEKKyAgICB1J1x1MDY1MCcgICAjICAweDAwZjAgLT4gQVJBQklDIEtBU1JBCisgICAgdSdcdTA2NTEnICAgIyAgMHgwMGYxIC0+IEFSQUJJQyBTSEFEREEKKyAgICB1J1x1MDY1MicgICAjICAweDAwZjIgLT4gQVJBQklDIFNVS1VOCisgICAgdSdcdTA2N2UnICAgIyAgMHgwMGYzIC0+IEFSQUJJQyBMRVRURVIgUEVICisgICAgdSdcdTA2NzknICAgIyAgMHgwMGY0IC0+IEFSQUJJQyBMRVRURVIgVFRFSAorICAgIHUnXHUwNjg2JyAgICMgIDB4MDBmNSAtPiBBUkFCSUMgTEVUVEVSIFRDSEVICisgICAgdSdcdTA2ZDUnICAgIyAgMHgwMGY2IC0+IEFSQUJJQyBMRVRURVIgQUUKKyAgICB1J1x1MDZhNCcgICAjICAweDAwZjcgLT4gQVJBQklDIExFVFRFUiBWRUgKKyAgICB1J1x1MDZhZicgICAjICAweDAwZjggLT4gQVJBQklDIExFVFRFUiBHQUYKKyAgICB1J1x1MDY4OCcgICAjICAweDAwZjkgLT4gQVJBQklDIExFVFRFUiBEREFMCisgICAgdSdcdTA2OTEnICAgIyAgMHgwMGZhIC0+IEFSQUJJQyBMRVRURVIgUlJFSAorICAgIHUneycgICAgICAgICMgIDB4MDBmYiAtPiBMRUZUIENVUkxZIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICB1J3wnICAgICAgICAjICAweDAwZmMgLT4gVkVSVElDQUwgTElORSwgcmlnaHQtbGVmdAorICAgIHUnfScgICAgICAgICMgIDB4MDBmZCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgdSdcdTA2OTgnICAgIyAgMHgwMGZlIC0+IEFSQUJJQyBMRVRURVIgSkVICisgICAgdSdcdTA2ZDInICAgIyAgMHgwMGZmIC0+IEFSQUJJQyBMRVRURVIgWUVIIEJBUlJFRQorKQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHsKKyAgICAweDAwMDA6IDB4MDAwMCwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDAxOiAweDAwMDEsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwMjogMHgwMDAyLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMDM6IDB4MDAwMywgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDA0OiAweDAwMDQsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwNTogMHgwMDA1LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMDY6IDB4MDAwNiwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDA3OiAweDAwMDcsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwODogMHgwMDA4LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMDk6IDB4MDAwOSwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDBhOiAweDAwMGEsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwYjogMHgwMDBiLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMGM6IDB4MDAwYywgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDBkOiAweDAwMGQsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAwZTogMHgwMDBlLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMGY6IDB4MDAwZiwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDEwOiAweDAwMTAsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxMTogMHgwMDExLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMTI6IDB4MDAxMiwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDEzOiAweDAwMTMsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxNDogMHgwMDE0LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMTU6IDB4MDAxNSwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDE2OiAweDAwMTYsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxNzogMHgwMDE3LCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMTg6IDB4MDAxOCwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDE5OiAweDAwMTksICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxYTogMHgwMDFhLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMWI6IDB4MDAxYiwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDFjOiAweDAwMWMsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAxZDogMHgwMDFkLCAgICAgIyAgQ09OVFJPTCBDSEFSQUNURVIKKyAgICAweDAwMWU6IDB4MDAxZSwgICAgICMgIENPTlRST0wgQ0hBUkFDVEVSCisgICAgMHgwMDFmOiAweDAwMWYsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDAyMDogMHgwMDIwLCAgICAgIyAgU1BBQ0UsIGxlZnQtcmlnaHQKKyAgICAweDAwMjA6IDB4MDBhMCwgICAgICMgIFNQQUNFLCByaWdodC1sZWZ0CisgICAgMHgwMDIxOiAweDAwMjEsICAgICAjICBFWENMQU1BVElPTiBNQVJLLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDIxOiAweDAwYTEsICAgICAjICBFWENMQU1BVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgMHgwMDIyOiAweDAwMjIsICAgICAjICBRVU9UQVRJT04gTUFSSywgbGVmdC1yaWdodAorICAgIDB4MDAyMjogMHgwMGEyLCAgICAgIyAgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICAweDAwMjM6IDB4MDAyMywgICAgICMgIE5VTUJFUiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDIzOiAweDAwYTMsICAgICAjICBOVU1CRVIgU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDAyNDogMHgwMDI0LCAgICAgIyAgRE9MTEFSIFNJR04sIGxlZnQtcmlnaHQKKyAgICAweDAwMjQ6IDB4MDBhNCwgICAgICMgIERPTExBUiBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMDI1OiAweDAwMjUsICAgICAjICBQRVJDRU5UIFNJR04sIGxlZnQtcmlnaHQKKyAgICAweDAwMjY6IDB4MDAyNiwgICAgICMgIEFNUEVSU0FORCwgbGVmdC1yaWdodAorICAgIDB4MDAyNjogMHgwMGE2LCAgICAgIyAgQU1QRVJTQU5ELCByaWdodC1sZWZ0CisgICAgMHgwMDI3OiAweDAwMjcsICAgICAjICBBUE9TVFJPUEhFLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDI3OiAweDAwYTcsICAgICAjICBBUE9TVFJPUEhFLCByaWdodC1sZWZ0CisgICAgMHgwMDI4OiAweDAwMjgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDI4OiAweDAwYTgsICAgICAjICBMRUZUIFBBUkVOVEhFU0lTLCByaWdodC1sZWZ0CisgICAgMHgwMDI5OiAweDAwMjksICAgICAjICBSSUdIVCBQQVJFTlRIRVNJUywgbGVmdC1yaWdodAorICAgIDB4MDAyOTogMHgwMGE5LCAgICAgIyAgUklHSFQgUEFSRU5USEVTSVMsIHJpZ2h0LWxlZnQKKyAgICAweDAwMmE6IDB4MDAyYSwgICAgICMgIEFTVEVSSVNLLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDJhOiAweDAwYWEsICAgICAjICBBU1RFUklTSywgcmlnaHQtbGVmdAorICAgIDB4MDAyYjogMHgwMDJiLCAgICAgIyAgUExVUyBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDJiOiAweDAwYWIsICAgICAjICBQTFVTIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwMmM6IDB4MDAyYywgICAgICMgIENPTU1BLCBsZWZ0LXJpZ2h0OyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NkMgQVJBQklDIFRIT1VTQU5EUyBTRVBBUkFUT1IKKyAgICAweDAwMmQ6IDB4MDAyZCwgICAgICMgIEhZUEhFTi1NSU5VUywgbGVmdC1yaWdodAorICAgIDB4MDAyZDogMHgwMGFkLCAgICAgIyAgSFlQSEVOLU1JTlVTLCByaWdodC1sZWZ0CisgICAgMHgwMDJlOiAweDAwMmUsICAgICAjICBGVUxMIFNUT1AsIGxlZnQtcmlnaHQ7IGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2QiBBUkFCSUMgREVDSU1BTCBTRVBBUkFUT1IKKyAgICAweDAwMmU6IDB4MDBhZSwgICAgICMgIEZVTEwgU1RPUCwgcmlnaHQtbGVmdAorICAgIDB4MDAyZjogMHgwMDJmLCAgICAgIyAgU09MSURVUywgbGVmdC1yaWdodAorICAgIDB4MDAyZjogMHgwMGFmLCAgICAgIyAgU09MSURVUywgcmlnaHQtbGVmdAorICAgIDB4MDAzMDogMHgwMDMwLCAgICAgIyAgRElHSVQgWkVSTzsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2MCBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTworICAgIDB4MDAzMTogMHgwMDMxLCAgICAgIyAgRElHSVQgT05FOyAgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2MSBBUkFCSUMtSU5ESUMgRElHSVQgT05FCisgICAgMHgwMDMyOiAweDAwMzIsICAgICAjICBESUdJVCBUV087ICAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjYyIEFSQUJJQy1JTkRJQyBESUdJVCBUV08KKyAgICAweDAwMzM6IDB4MDAzMywgICAgICMgIERJR0lUIFRIUkVFOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjMgQVJBQklDLUlORElDIERJR0lUIFRIUkVFCisgICAgMHgwMDM0OiAweDAwMzQsICAgICAjICBESUdJVCBGT1VSOyAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjY0IEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSCisgICAgMHgwMDM1OiAweDAwMzUsICAgICAjICBESUdJVCBGSVZFOyAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjY1IEFSQUJJQy1JTkRJQyBESUdJVCBGSVZFCisgICAgMHgwMDM2OiAweDAwMzYsICAgICAjICBESUdJVCBTSVg7ICAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjY2IEFSQUJJQy1JTkRJQyBESUdJVCBTSVgKKyAgICAweDAwMzc6IDB4MDAzNywgICAgICMgIERJR0lUIFNFVkVOOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NjcgQVJBQklDLUlORElDIERJR0lUIFNFVkVOCisgICAgMHgwMDM4OiAweDAwMzgsICAgICAjICBESUdJVCBFSUdIVDsgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNjY4IEFSQUJJQy1JTkRJQyBESUdJVCBFSUdIVAorICAgIDB4MDAzOTogMHgwMDM5LCAgICAgIyAgRElHSVQgTklORTsgIGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDY2OSBBUkFCSUMtSU5ESUMgRElHSVQgTklORQorICAgIDB4MDAzYTogMHgwMDNhLCAgICAgIyAgQ09MT04sIGxlZnQtcmlnaHQKKyAgICAweDAwM2E6IDB4MDBiYSwgICAgICMgIENPTE9OLCByaWdodC1sZWZ0CisgICAgMHgwMDNiOiAweDAwM2IsICAgICAjICBTRU1JQ09MT04sIGxlZnQtcmlnaHQKKyAgICAweDAwM2M6IDB4MDAzYywgICAgICMgIExFU1MtVEhBTiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgMHgwMDNjOiAweDAwYmMsICAgICAjICBMRVNTLVRIQU4gU0lHTiwgcmlnaHQtbGVmdAorICAgIDB4MDAzZDogMHgwMDNkLCAgICAgIyAgRVFVQUxTIFNJR04sIGxlZnQtcmlnaHQKKyAgICAweDAwM2Q6IDB4MDBiZCwgICAgICMgIEVRVUFMUyBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMDNlOiAweDAwM2UsICAgICAjICBHUkVBVEVSLVRIQU4gU0lHTiwgbGVmdC1yaWdodAorICAgIDB4MDAzZTogMHgwMGJlLCAgICAgIyAgR1JFQVRFUi1USEFOIFNJR04sIHJpZ2h0LWxlZnQKKyAgICAweDAwM2Y6IDB4MDAzZiwgICAgICMgIFFVRVNUSU9OIE1BUkssIGxlZnQtcmlnaHQKKyAgICAweDAwNDA6IDB4MDA0MCwgICAgICMgIENPTU1FUkNJQUwgQVQKKyAgICAweDAwNDE6IDB4MDA0MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICAweDAwNDI6IDB4MDA0MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICAweDAwNDM6IDB4MDA0MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICAweDAwNDQ6IDB4MDA0NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICAweDAwNDU6IDB4MDA0NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICAweDAwNDY6IDB4MDA0NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICAweDAwNDc6IDB4MDA0NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICAweDAwNDg6IDB4MDA0OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICAweDAwNDk6IDB4MDA0OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICAweDAwNGE6IDB4MDA0YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICAweDAwNGI6IDB4MDA0YiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICAweDAwNGM6IDB4MDA0YywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICAweDAwNGQ6IDB4MDA0ZCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICAweDAwNGU6IDB4MDA0ZSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICAweDAwNGY6IDB4MDA0ZiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICAweDAwNTA6IDB4MDA1MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICAweDAwNTE6IDB4MDA1MSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICAweDAwNTI6IDB4MDA1MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICAweDAwNTM6IDB4MDA1MywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICAweDAwNTQ6IDB4MDA1NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICAweDAwNTU6IDB4MDA1NSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICAweDAwNTY6IDB4MDA1NiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICAweDAwNTc6IDB4MDA1NywgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICAweDAwNTg6IDB4MDA1OCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICAweDAwNTk6IDB4MDA1OSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICAweDAwNWE6IDB4MDA1YSwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICAweDAwNWI6IDB4MDA1YiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQsIGxlZnQtcmlnaHQKKyAgICAweDAwNWI6IDB4MDBkYiwgICAgICMgIExFRlQgU1FVQVJFIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwNWM6IDB4MDA1YywgICAgICMgIFJFVkVSU0UgU09MSURVUywgbGVmdC1yaWdodAorICAgIDB4MDA1YzogMHgwMGRjLCAgICAgIyAgUkVWRVJTRSBTT0xJRFVTLCByaWdodC1sZWZ0CisgICAgMHgwMDVkOiAweDAwNWQsICAgICAjICBSSUdIVCBTUVVBUkUgQlJBQ0tFVCwgbGVmdC1yaWdodAorICAgIDB4MDA1ZDogMHgwMGRkLCAgICAgIyAgUklHSFQgU1FVQVJFIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwNWU6IDB4MDA1ZSwgICAgICMgIENJUkNVTUZMRVggQUNDRU5ULCBsZWZ0LXJpZ2h0CisgICAgMHgwMDVlOiAweDAwZGUsICAgICAjICBDSVJDVU1GTEVYIEFDQ0VOVCwgcmlnaHQtbGVmdAorICAgIDB4MDA1ZjogMHgwMDVmLCAgICAgIyAgTE9XIExJTkUsIGxlZnQtcmlnaHQKKyAgICAweDAwNWY6IDB4MDBkZiwgICAgICMgIExPVyBMSU5FLCByaWdodC1sZWZ0CisgICAgMHgwMDYwOiAweDAwNjAsICAgICAjICBHUkFWRSBBQ0NFTlQKKyAgICAweDAwNjE6IDB4MDA2MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgMHgwMDYyOiAweDAwNjIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIDB4MDA2MzogMHgwMDYzLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICAweDAwNjQ6IDB4MDA2NCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisgICAgMHgwMDY1OiAweDAwNjUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIDB4MDA2NjogMHgwMDY2LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICAweDAwNjc6IDB4MDA2NywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgMHgwMDY4OiAweDAwNjgsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIDB4MDA2OTogMHgwMDY5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICAweDAwNmE6IDB4MDA2YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgMHgwMDZiOiAweDAwNmIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIDB4MDA2YzogMHgwMDZjLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICAweDAwNmQ6IDB4MDA2ZCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgMHgwMDZlOiAweDAwNmUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIDB4MDA2ZjogMHgwMDZmLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICAweDAwNzA6IDB4MDA3MCwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgMHgwMDcxOiAweDAwNzEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIDB4MDA3MjogMHgwMDcyLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICAweDAwNzM6IDB4MDA3MywgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgMHgwMDc0OiAweDAwNzQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIDB4MDA3NTogMHgwMDc1LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICAweDAwNzY6IDB4MDA3NiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgMHgwMDc3OiAweDAwNzcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIDB4MDA3ODogMHgwMDc4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICAweDAwNzk6IDB4MDA3OSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgMHgwMDdhOiAweDAwN2EsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIDB4MDA3YjogMHgwMDdiLCAgICAgIyAgTEVGVCBDVVJMWSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgMHgwMDdiOiAweDAwZmIsICAgICAjICBMRUZUIENVUkxZIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwN2M6IDB4MDA3YywgICAgICMgIFZFUlRJQ0FMIExJTkUsIGxlZnQtcmlnaHQKKyAgICAweDAwN2M6IDB4MDBmYywgICAgICMgIFZFUlRJQ0FMIExJTkUsIHJpZ2h0LWxlZnQKKyAgICAweDAwN2Q6IDB4MDA3ZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQsIGxlZnQtcmlnaHQKKyAgICAweDAwN2Q6IDB4MDBmZCwgICAgICMgIFJJR0hUIENVUkxZIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICAweDAwN2U6IDB4MDA3ZSwgICAgICMgIFRJTERFCisgICAgMHgwMDdmOiAweDAwN2YsICAgICAjICBDT05UUk9MIENIQVJBQ1RFUgorICAgIDB4MDBhMDogMHgwMDgxLCAgICAgIyAgTk8tQlJFQUsgU1BBQ0UsIHJpZ2h0LWxlZnQKKyAgICAweDAwYWI6IDB4MDA4YywgICAgICMgIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgMHgwMGJiOiAweDAwOTgsICAgICAjICBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICAweDAwYzQ6IDB4MDA4MCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICAweDAwYzc6IDB4MDA4MiwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGM5OiAweDAwODMsICAgICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICAweDAwZDE6IDB4MDA4NCwgICAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIDB4MDBkNjogMHgwMDg1LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIDB4MDBkYzogMHgwMDg2LCAgICAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlMDogMHgwMDg4LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIDB4MDBlMTogMHgwMDg3LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIDB4MDBlMjogMHgwMDg5LCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgMHgwMGU0OiAweDAwOGEsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIDB4MDBlNzogMHgwMDhkLCAgICAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgMHgwMGU4OiAweDAwOGYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgMHgwMGU5OiAweDAwOGUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgMHgwMGVhOiAweDAwOTAsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWI6IDB4MDA5MSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGVkOiAweDAwOTIsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgMHgwMGVlOiAweDAwOTQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZWY6IDB4MDA5NSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGYxOiAweDAwOTYsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgMHgwMGYzOiAweDAwOTcsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgMHgwMGY0OiAweDAwOTksICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZjY6IDB4MDA5YSwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgMHgwMGY3OiAweDAwOWIsICAgICAjICBESVZJU0lPTiBTSUdOLCByaWdodC1sZWZ0CisgICAgMHgwMGY5OiAweDAwOWQsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgMHgwMGZhOiAweDAwOWMsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgMHgwMGZiOiAweDAwOWUsICAgICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICAweDAwZmM6IDB4MDA5ZiwgICAgICMgIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgMHgwNjBjOiAweDAwYWMsICAgICAjICBBUkFCSUMgQ09NTUEKKyAgICAweDA2MWI6IDB4MDBiYiwgICAgICMgIEFSQUJJQyBTRU1JQ09MT04KKyAgICAweDA2MWY6IDB4MDBiZiwgICAgICMgIEFSQUJJQyBRVUVTVElPTiBNQVJLCisgICAgMHgwNjIxOiAweDAwYzEsICAgICAjICBBUkFCSUMgTEVUVEVSIEhBTVpBCisgICAgMHgwNjIyOiAweDAwYzIsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBNQUREQSBBQk9WRQorICAgIDB4MDYyMzogMHgwMGMzLCAgICAgIyAgQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQUJPVkUKKyAgICAweDA2MjQ6IDB4MDBjNCwgICAgICMgIEFSQUJJQyBMRVRURVIgV0FXIFdJVEggSEFNWkEgQUJPVkUKKyAgICAweDA2MjU6IDB4MDBjNSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIEhBTVpBIEJFTE9XCisgICAgMHgwNjI2OiAweDAwYzYsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBXSVRIIEhBTVpBIEFCT1ZFCisgICAgMHgwNjI3OiAweDAwYzcsICAgICAjICBBUkFCSUMgTEVUVEVSIEFMRUYKKyAgICAweDA2Mjg6IDB4MDBjOCwgICAgICMgIEFSQUJJQyBMRVRURVIgQkVICisgICAgMHgwNjI5OiAweDAwYzksICAgICAjICBBUkFCSUMgTEVUVEVSIFRFSCBNQVJCVVRBCisgICAgMHgwNjJhOiAweDAwY2EsICAgICAjICBBUkFCSUMgTEVUVEVSIFRFSAorICAgIDB4MDYyYjogMHgwMGNiLCAgICAgIyAgQVJBQklDIExFVFRFUiBUSEVICisgICAgMHgwNjJjOiAweDAwY2MsICAgICAjICBBUkFCSUMgTEVUVEVSIEpFRU0KKyAgICAweDA2MmQ6IDB4MDBjZCwgICAgICMgIEFSQUJJQyBMRVRURVIgSEFICisgICAgMHgwNjJlOiAweDAwY2UsICAgICAjICBBUkFCSUMgTEVUVEVSIEtIQUgKKyAgICAweDA2MmY6IDB4MDBjZiwgICAgICMgIEFSQUJJQyBMRVRURVIgREFMCisgICAgMHgwNjMwOiAweDAwZDAsICAgICAjICBBUkFCSUMgTEVUVEVSIFRIQUwKKyAgICAweDA2MzE6IDB4MDBkMSwgICAgICMgIEFSQUJJQyBMRVRURVIgUkVICisgICAgMHgwNjMyOiAweDAwZDIsICAgICAjICBBUkFCSUMgTEVUVEVSIFpBSU4KKyAgICAweDA2MzM6IDB4MDBkMywgICAgICMgIEFSQUJJQyBMRVRURVIgU0VFTgorICAgIDB4MDYzNDogMHgwMGQ0LCAgICAgIyAgQVJBQklDIExFVFRFUiBTSEVFTgorICAgIDB4MDYzNTogMHgwMGQ1LCAgICAgIyAgQVJBQklDIExFVFRFUiBTQUQKKyAgICAweDA2MzY6IDB4MDBkNiwgICAgICMgIEFSQUJJQyBMRVRURVIgREFECisgICAgMHgwNjM3OiAweDAwZDcsICAgICAjICBBUkFCSUMgTEVUVEVSIFRBSAorICAgIDB4MDYzODogMHgwMGQ4LCAgICAgIyAgQVJBQklDIExFVFRFUiBaQUgKKyAgICAweDA2Mzk6IDB4MDBkOSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUlOCisgICAgMHgwNjNhOiAweDAwZGEsICAgICAjICBBUkFCSUMgTEVUVEVSIEdIQUlOCisgICAgMHgwNjQwOiAweDAwZTAsICAgICAjICBBUkFCSUMgVEFUV0VFTAorICAgIDB4MDY0MTogMHgwMGUxLCAgICAgIyAgQVJBQklDIExFVFRFUiBGRUgKKyAgICAweDA2NDI6IDB4MDBlMiwgICAgICMgIEFSQUJJQyBMRVRURVIgUUFGCisgICAgMHgwNjQzOiAweDAwZTMsICAgICAjICBBUkFCSUMgTEVUVEVSIEtBRgorICAgIDB4MDY0NDogMHgwMGU0LCAgICAgIyAgQVJBQklDIExFVFRFUiBMQU0KKyAgICAweDA2NDU6IDB4MDBlNSwgICAgICMgIEFSQUJJQyBMRVRURVIgTUVFTQorICAgIDB4MDY0NjogMHgwMGU2LCAgICAgIyAgQVJBQklDIExFVFRFUiBOT09OCisgICAgMHgwNjQ3OiAweDAwZTcsICAgICAjICBBUkFCSUMgTEVUVEVSIEhFSAorICAgIDB4MDY0ODogMHgwMGU4LCAgICAgIyAgQVJBQklDIExFVFRFUiBXQVcKKyAgICAweDA2NDk6IDB4MDBlOSwgICAgICMgIEFSQUJJQyBMRVRURVIgQUxFRiBNQUtTVVJBCisgICAgMHgwNjRhOiAweDAwZWEsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSAorICAgIDB4MDY0YjogMHgwMGViLCAgICAgIyAgQVJBQklDIEZBVEhBVEFOCisgICAgMHgwNjRjOiAweDAwZWMsICAgICAjICBBUkFCSUMgREFNTUFUQU4KKyAgICAweDA2NGQ6IDB4MDBlZCwgICAgICMgIEFSQUJJQyBLQVNSQVRBTgorICAgIDB4MDY0ZTogMHgwMGVlLCAgICAgIyAgQVJBQklDIEZBVEhBCisgICAgMHgwNjRmOiAweDAwZWYsICAgICAjICBBUkFCSUMgREFNTUEKKyAgICAweDA2NTA6IDB4MDBmMCwgICAgICMgIEFSQUJJQyBLQVNSQQorICAgIDB4MDY1MTogMHgwMGYxLCAgICAgIyAgQVJBQklDIFNIQUREQQorICAgIDB4MDY1MjogMHgwMGYyLCAgICAgIyAgQVJBQklDIFNVS1VOCisgICAgMHgwNjYwOiAweDAwYjAsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTywgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDA2NjE6IDB4MDBiMSwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjYyOiAweDAwYjIsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgVFdPLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDY2MzogMHgwMGIzLCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIFRIUkVFLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIDB4MDY2NDogMHgwMGI0LCAgICAgIyAgQVJBQklDLUlORElDIERJR0lUIEZPVVIsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjY1OiAweDAwYjUsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgRklWRSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDA2NjY6IDB4MDBiNiwgICAgICMgIEFSQUJJQy1JTkRJQyBESUdJVCBTSVgsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjY3OiAweDAwYjcsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjY4OiAweDAwYjgsICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgRUlHSFQsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgMHgwNjY5OiAweDAwYjksICAgICAjICBBUkFCSUMtSU5ESUMgRElHSVQgTklORSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICAweDA2NmE6IDB4MDBhNSwgICAgICMgIEFSQUJJQyBQRVJDRU5UIFNJR04KKyAgICAweDA2Nzk6IDB4MDBmNCwgICAgICMgIEFSQUJJQyBMRVRURVIgVFRFSAorICAgIDB4MDY3ZTogMHgwMGYzLCAgICAgIyAgQVJBQklDIExFVFRFUiBQRUgKKyAgICAweDA2ODY6IDB4MDBmNSwgICAgICMgIEFSQUJJQyBMRVRURVIgVENIRUgKKyAgICAweDA2ODg6IDB4MDBmOSwgICAgICMgIEFSQUJJQyBMRVRURVIgRERBTAorICAgIDB4MDY5MTogMHgwMGZhLCAgICAgIyAgQVJBQklDIExFVFRFUiBSUkVICisgICAgMHgwNjk4OiAweDAwZmUsICAgICAjICBBUkFCSUMgTEVUVEVSIEpFSAorICAgIDB4MDZhNDogMHgwMGY3LCAgICAgIyAgQVJBQklDIExFVFRFUiBWRUgKKyAgICAweDA2YWY6IDB4MDBmOCwgICAgICMgIEFSQUJJQyBMRVRURVIgR0FGCisgICAgMHgwNmJhOiAweDAwOGIsICAgICAjICBBUkFCSUMgTEVUVEVSIE5PT04gR0hVTk5BCisgICAgMHgwNmQyOiAweDAwZmYsICAgICAjICBBUkFCSUMgTEVUVEVSIFlFSCBCQVJSRUUKKyAgICAweDA2ZDU6IDB4MDBmNiwgICAgICMgIEFSQUJJQyBMRVRURVIgQUUKKyAgICAweDIwMjY6IDB4MDA5MywgICAgICMgIEhPUklaT05UQUwgRUxMSVBTSVMsIHJpZ2h0LWxlZnQKKyAgICAweDI3NGE6IDB4MDBjMCwgICAgICMgIEVJR0hUIFRFQVJEUk9QLVNQT0tFRCBQUk9QRUxMRVIgQVNURVJJU0ssIHJpZ2h0LWxlZnQKK30KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19hcmFiaWMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2FyYWJpYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkNDE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19hcmFiaWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19hcmFiaWMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2FyYWJpYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkNDE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19hcmFiaWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODNjODIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2NlbnRldXJvLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY19jZW50ZXVybyBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9BUFBMRS9DRU5URVVSTy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtY2VudGV1cm8nLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceGM0JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxMDAnICAgIyAgMHg4MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggTUFDUk9OCisgICAgdSdcdTAxMDEnICAgIyAgMHg4MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE1BQ1JPTgorICAgIHUnXHhjOScgICAgICMgIDB4ODMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDQnICAgIyAgMHg4NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggT0dPTkVLCisgICAgdSdceGQ2JyAgICAgIyAgMHg4NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHg4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUxJyAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDUnICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIE9HT05FSworICAgIHUnXHUwMTBjJyAgICMgIDB4ODkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGU0JyAgICAgIyAgMHg4QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMTBkJyAgICMgIDB4OEIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHUwMTA2JyAgICMgIDB4OEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgdSdcdTAxMDcnICAgIyAgMHg4RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgdSdceGU5JyAgICAgIyAgMHg4RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdcdTAxNzknICAgIyAgMHg4RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1MDE3YScgICAjICAweDkwIC0+IExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICB1J1x1MDEwZScgICAjICAweDkxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIHUnXHhlZCcgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHUwMTBmJyAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBDQVJPTgorICAgIHUnXHUwMTEyJyAgICMgIDB4OTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTEzJyAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICB1J1x1MDExNicgICAjICAweDk2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBET1QgQUJPVkUKKyAgICB1J1x4ZjMnICAgICAjICAweDk3IC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x1MDExNycgICAjICAweDk4IC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgdSdceGY0JyAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDlBIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY1JyAgICAgIyAgMHg5QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGZhJyAgICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMWEnICAgIyAgMHg5RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0FST04KKyAgICB1J1x1MDExYicgICAjICAweDlFIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0FST04KKyAgICB1J1x4ZmMnICAgICAjICAweDlGIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHhBMCAtPiBEQUdHRVIKKyAgICB1J1x4YjAnICAgICAjICAweEExIC0+IERFR1JFRSBTSUdOCisgICAgdSdcdTAxMTgnICAgIyAgMHhBMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggT0dPTkVLCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhBNCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MjAyMicgICAjICAweEE1IC0+IEJVTExFVAorICAgIHUnXHhiNicgICAgICMgIDB4QTYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGRmJyAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyMTIyJyAgICMgIDB4QUEgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdcdTAxMTknICAgIyAgMHhBQiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgIHUnXHhhOCcgICAgICMgIDB4QUMgLT4gRElBRVJFU0lTCisgICAgdSdcdTIyNjAnICAgIyAgMHhBRCAtPiBOT1QgRVFVQUwgVE8KKyAgICB1J1x1MDEyMycgICAjICAweEFFIC0+IExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTJlJyAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE9HT05FSworICAgIHUnXHUwMTJmJyAgICMgIDB4QjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBPR09ORUsKKyAgICB1J1x1MDEyYScgICAjICAweEIxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICB1J1x1MjI2NCcgICAjICAweEIyIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY1JyAgICMgIDB4QjMgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTAxMmInICAgIyAgMHhCNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgIHUnXHUwMTM2JyAgICMgIDB4QjUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSyBXSVRIIENFRElMTEEKKyAgICB1J1x1MjIwMicgICAjICAweEI2IC0+IFBBUlRJQUwgRElGRkVSRU5USUFMCisgICAgdSdcdTIyMTEnICAgIyAgMHhCNyAtPiBOLUFSWSBTVU1NQVRJT04KKyAgICB1J1x1MDE0MicgICAjICAweEI4IC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggU1RST0tFCisgICAgdSdcdTAxM2InICAgIyAgMHhCOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTNjJyAgICMgIDB4QkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgdSdcdTAxM2QnICAgIyAgMHhCQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICB1J1x1MDEzZScgICAjICAweEJDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMIFdJVEggQ0FST04KKyAgICB1J1x1MDEzOScgICAjICAweEJEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgIHUnXHUwMTNhJyAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgIHUnXHUwMTQ1JyAgICMgIDB4QkYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE0NicgICAjICAweEMwIC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTQzJyAgICMgIDB4QzEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIEFDVVRFCisgICAgdSdceGFjJyAgICAgIyAgMHhDMiAtPiBOT1QgU0lHTgorICAgIHUnXHUyMjFhJyAgICMgIDB4QzMgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MDE0NCcgICAjICAweEM0IC0+IExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICB1J1x1MDE0NycgICAjICAweEM1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDQVJPTgorICAgIHUnXHUyMjA2JyAgICMgIDB4QzYgLT4gSU5DUkVNRU5UCisgICAgdSdceGFiJyAgICAgIyAgMHhDNyAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4QzggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHhDOSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhDQSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHUwMTQ4JyAgICMgIDB4Q0IgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBDQVJPTgorICAgIHUnXHUwMTUwJyAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHhkNScgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdcdTAxNTEnICAgIyAgMHhDRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHUwMTRjJyAgICMgIDB4Q0YgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgIHUnXHUyMDEzJyAgICMgIDB4RDAgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4RDEgLT4gRU0gREFTSAorICAgIHUnXHUyMDFjJyAgICMgIDB4RDIgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweEQzIC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE4JyAgICMgIDB4RDQgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweEQ1IC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhmNycgICAgICMgIDB4RDYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyNWNhJyAgICMgIDB4RDcgLT4gTE9aRU5HRQorICAgIHUnXHUwMTRkJyAgICMgIDB4RDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICB1J1x1MDE1NCcgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIHUnXHUwMTU1JyAgICMgIDB4REEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBBQ1VURQorICAgIHUnXHUwMTU4JyAgICMgIDB4REIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgdSdcdTIwMzknICAgIyAgMHhEQyAtPiBTSU5HTEUgTEVGVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDNhJyAgICMgIDB4REQgLT4gU0lOR0xFIFJJR0hULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNTknICAgIyAgMHhERSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgdSdcdTAxNTYnICAgIyAgMHhERiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTU3JyAgICMgIDB4RTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgdSdcdTAxNjAnICAgIyAgMHhFMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjAxYScgICAjICAweEUyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFlJyAgICMgIDB4RTMgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTAxNjEnICAgIyAgMHhFNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgdSdcdTAxNWEnICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x1MDE1YicgICAjICAweEU2IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQUNVVEUKKyAgICB1J1x4YzEnICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHUwMTY0JyAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVCBXSVRIIENBUk9OCisgICAgdSdcdTAxNjUnICAgIyAgMHhFOSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVCBXSVRIIENBUk9OCisgICAgdSdceGNkJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x1MDE3ZCcgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTdlJyAgICMgIDB4RUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHUwMTZhJyAgICMgIDB4RUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgIHUnXHhkMycgICAgICMgIDB4RUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhFRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTZiJyAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICB1J1x1MDE2ZScgICAjICAweEYxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGRhJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x1MDE2ZicgICAjICAweEYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgIHUnXHUwMTcwJyAgICMgIDB4RjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERPVUJMRSBBQ1VURQorICAgIHUnXHUwMTcxJyAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBET1VCTEUgQUNVVEUKKyAgICB1J1x1MDE3MicgICAjICAweEY2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICB1J1x1MDE3MycgICAjICAweEY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggT0dPTkVLCisgICAgdSdceGRkJyAgICAgIyAgMHhGOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4ZmQnICAgICAjICAweEY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x1MDEzNycgICAjICAweEZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgIHUnXHUwMTdiJyAgICMgIDB4RkIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTQxJyAgICMgIDB4RkMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgIHUnXHUwMTdjJyAgICMgIDB4RkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICB1J1x1MDEyMicgICAjICAweEZFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBDRURJTExBCisgICAgdSdcdTAyYzcnICAgIyAgMHhGRiAtPiBDQVJPTgorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2NlbnRldXJvLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxNTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2NlbnRldXJvLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxNTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jZW50ZXVyby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2Nyb2F0aWFuLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2Nyb2F0aWFuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1N2Y3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3JvYXRpYW4ucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgbWFjX2Nyb2F0aWFuIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL0FQUExFL0NST0FUSUFOLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J21hYy1jcm9hdGlhbicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4YzQnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDgxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM3JyAgICAgIyAgMHg4MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOScgICAgICMgIDB4ODMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGQxJyAgICAgIyAgMHg4NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweDg1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDg2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTEnICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTAnICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTInICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4OEEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTMnICAgICAjICAweDhCIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTUnICAgICAjICAweDhDIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4OEQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU5JyAgICAgIyAgMHg4RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU4JyAgICAgIyAgMHg4RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVhJyAgICAgIyAgMHg5MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVkJyAgICAgIyAgMHg5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVjJyAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVlJyAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYxJyAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYzJyAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGYyJyAgICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGY0JyAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDlBIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY1JyAgICAgIyAgMHg5QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGZhJyAgICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGY5JyAgICAgIyAgMHg5RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweDlGIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHhBMCAtPiBEQUdHRVIKKyAgICB1J1x4YjAnICAgICAjICAweEExIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEE0IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUyMDIyJyAgICMgIDB4QTUgLT4gQlVMTEVUCisgICAgdSdceGI2JyAgICAgIyAgMHhBNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4ZGYnICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGFlJyAgICAgIyAgMHhBOCAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x1MDE2MCcgICAjICAweEE5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDQVJPTgorICAgIHUnXHUyMTIyJyAgICMgIDB4QUEgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdceGI0JyAgICAgIyAgMHhBQiAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YTgnICAgICAjICAweEFDIC0+IERJQUVSRVNJUworICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdcdTAxN2QnICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICB1J1x4ZDgnICAgICAjICAweEFGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x1MjIxZScgICAjICAweEIwIC0+IElORklOSVRZCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NCcgICAjICAweEIyIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY1JyAgICMgIDB4QjMgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyMDYnICAgIyAgMHhCNCAtPiBJTkNSRU1FTlQKKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MjIwMicgICAjICAweEI2IC0+IFBBUlRJQUwgRElGRkVSRU5USUFMCisgICAgdSdcdTIyMTEnICAgIyAgMHhCNyAtPiBOLUFSWSBTVU1NQVRJT04KKyAgICB1J1x1MjIwZicgICAjICAweEI4IC0+IE4tQVJZIFBST0RVQ1QKKyAgICB1J1x1MDE2MScgICAjICAweEI5IC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICB1J1x1MjIyYicgICAjICAweEJBIC0+IElOVEVHUkFMCisgICAgdSdceGFhJyAgICAgIyAgMHhCQiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4QkMgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdcdTAzYTknICAgIyAgMHhCRCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHUwMTdlJyAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBDQVJPTgorICAgIHUnXHhmOCcgICAgICMgIDB4QkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBTVFJPS0UKKyAgICB1J1x4YmYnICAgICAjICAweEMwIC0+IElOVkVSVEVEIFFVRVNUSU9OIE1BUksKKyAgICB1J1x4YTEnICAgICAjICAweEMxIC0+IElOVkVSVEVEIEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1J1x4YWMnICAgICAjICAweEMyIC0+IE5PVCBTSUdOCisgICAgdSdcdTIyMWEnICAgIyAgMHhDMyAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUwMTkyJyAgICMgIDB4QzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdcdTIyNDgnICAgIyAgMHhDNSAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x1MDEwNicgICAjICAweEM2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhhYicgICAgICMgIDB4QzcgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDEwYycgICAjICAweEM4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDQVJPTgorICAgIHUnXHUyMDI2JyAgICMgIDB4QzkgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHhhMCcgICAgICMgIDB4Q0EgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x4YzAnICAgICAjICAweENCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhjMycgICAgICMgIDB4Q0MgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGQ1JyAgICAgIyAgMHhDRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICB1J1x1MDE1MicgICAjICAweENFIC0+IExBVElOIENBUElUQUwgTElHQVRVUkUgT0UKKyAgICB1J1x1MDE1MycgICAjICAweENGIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxMTAnICAgIyAgMHhEMCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggU1RST0tFCisgICAgdSdcdTIwMTQnICAgIyAgMHhEMSAtPiBFTSBEQVNICisgICAgdSdcdTIwMWMnICAgIyAgMHhEMiAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4RDMgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTgnICAgIyAgMHhENCAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4RDUgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGY3JyAgICAgIyAgMHhENiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTI1Y2EnICAgIyAgMHhENyAtPiBMT1pFTkdFCisgICAgdSdcdWY4ZmYnICAgIyAgMHhEOCAtPiBBcHBsZSBsb2dvCisgICAgdSdceGE5JyAgICAgIyAgMHhEOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyMDQ0JyAgICMgIDB4REEgLT4gRlJBQ1RJT04gU0xBU0gKKyAgICB1J1x1MjBhYycgICAjICAweERCIC0+IEVVUk8gU0lHTgorICAgIHUnXHUyMDM5JyAgICMgIDB4REMgLT4gU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAzYScgICAjICAweEREIC0+IFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhjNicgICAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQUUKKyAgICB1J1x4YmInICAgICAjICAweERGIC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDEzJyAgICMgIDB4RTAgLT4gRU4gREFTSAorICAgIHUnXHhiNycgICAgICMgIDB4RTEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMDFhJyAgICMgIDB4RTIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWUnICAgIyAgMHhFMyAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAzMCcgICAjICAweEU0IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdceGMyJyAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTA3JyAgICMgIDB4RTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBBQ1VURQorICAgIHUnXHhjMScgICAgICMgIDB4RTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdcdTAxMGQnICAgIyAgMHhFOCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgdSdceGM4JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweEVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4RUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweEVDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweEVEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhFRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHUwMTExJyAgICMgIDB4RjAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQgV0lUSCBTVFJPS0UKKyAgICB1J1x4ZDInICAgICAjICAweEYxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4RjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdTAxMzEnICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgdSdcdTAyYzYnICAgIyAgMHhGNiAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MDJkYycgICAjICAweEY3IC0+IFNNQUxMIFRJTERFCisgICAgdSdceGFmJyAgICAgIyAgMHhGOCAtPiBNQUNST04KKyAgICB1J1x1MDNjMCcgICAjICAweEY5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHhjYicgICAgICMgIDB4RkEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMmRhJyAgICMgIDB4RkIgLT4gUklORyBBQk9WRQorICAgIHUnXHhiOCcgICAgICMgIDB4RkMgLT4gQ0VESUxMQQorICAgIHUnXHhjYScgICAgICMgIDB4RkQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTYnICAgICAjICAweEZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBBRQorICAgIHUnXHUwMmM3JyAgICMgIDB4RkYgLT4gQ0FST04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jcm9hdGlhbi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3JvYXRpYW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGNhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3JvYXRpYW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jcm9hdGlhbi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3JvYXRpYW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OGNhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfY3JvYXRpYW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzMyNGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2N5cmlsbGljLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY19jeXJpbGxpYyBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9BUFBMRS9DWVJJTExJQy5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtY3lyaWxsaWMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdTA0MTAnICAgIyAgMHg4MCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdcdTA0MTEnICAgIyAgMHg4MSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorICAgIHUnXHUwNDEyJyAgICMgIDB4ODIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVkUKKyAgICB1J1x1MDQxMycgICAjICAweDgzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorICAgIHUnXHUwNDE0JyAgICMgIDB4ODQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgREUKKyAgICB1J1x1MDQxNScgICAjICAweDg1IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIElFCisgICAgdSdcdTA0MTYnICAgIyAgMHg4NiAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUKKyAgICB1J1x1MDQxNycgICAjICAweDg3IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisgICAgdSdcdTA0MTgnICAgIyAgMHg4OCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdcdTA0MTknICAgIyAgMHg4OSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSE9SVCBJCisgICAgdSdcdTA0MWEnICAgIyAgMHg4QSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorICAgIHUnXHUwNDFiJyAgICMgIDB4OEIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRUwKKyAgICB1J1x1MDQxYycgICAjICAweDhDIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVNCisgICAgdSdcdTA0MWQnICAgIyAgMHg4RCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorICAgIHUnXHUwNDFlJyAgICMgIDB4OEUgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgTworICAgIHUnXHUwNDFmJyAgICMgIDB4OEYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgUEUKKyAgICB1J1x1MDQyMCcgICAjICAweDkwIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVSCisgICAgdSdcdTA0MjEnICAgIyAgMHg5MSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworICAgIHUnXHUwNDIyJyAgICMgIDB4OTIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVEUKKyAgICB1J1x1MDQyMycgICAjICAweDkzIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1x1MDQyNCcgICAjICAweDk0IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEVGCisgICAgdSdcdTA0MjUnICAgIyAgMHg5NSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQQorICAgIHUnXHUwNDI2JyAgICMgIDB4OTYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVFNFCisgICAgdSdcdTA0MjcnICAgIyAgMHg5NyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQyOCcgICAjICAweDk4IC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQQorICAgIHUnXHUwNDI5JyAgICMgIDB4OTkgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hDSEEKKyAgICB1J1x1MDQyYScgICAjICAweDlBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDJiJyAgICMgIDB4OUIgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorICAgIHUnXHUwNDJjJyAgICMgIDB4OUMgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisgICAgdSdcdTA0MmQnICAgIyAgMHg5RCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdcdTA0MmUnICAgIyAgMHg5RSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorICAgIHUnXHUwNDJmJyAgICMgIDB4OUYgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUEKKyAgICB1J1x1MjAyMCcgICAjICAweEEwIC0+IERBR0dFUgorICAgIHUnXHhiMCcgICAgICMgIDB4QTEgLT4gREVHUkVFIFNJR04KKyAgICB1J1x1MDQ5MCcgICAjICAweEEyIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRSBXSVRIIFVQVFVSTgorICAgIHUnXHhhMycgICAgICMgIDB4QTMgLT4gUE9VTkQgU0lHTgorICAgIHUnXHhhNycgICAgICMgIDB4QTQgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTIwMjInICAgIyAgMHhBNSAtPiBCVUxMRVQKKyAgICB1J1x4YjYnICAgICAjICAweEE2IC0+IFBJTENST1cgU0lHTgorICAgIHUnXHUwNDA2JyAgICMgIDB4QTcgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgdSdceGFlJyAgICAgIyAgMHhBOCAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTIxMjInICAgIyAgMHhBQSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x1MDQwMicgICAjICAweEFCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERKRQorICAgIHUnXHUwNDUyJyAgICMgIDB4QUMgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIERKRQorICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdcdTA0MDMnICAgIyAgMHhBRSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSkUKKyAgICB1J1x1MDQ1MycgICAjICAweEFGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBHSkUKKyAgICB1J1x1MjIxZScgICAjICAweEIwIC0+IElORklOSVRZCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NCcgICAjICAweEIyIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY1JyAgICMgIDB4QjMgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTA0NTYnICAgIyAgMHhCNCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTA0OTEnICAgIyAgMHhCNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFIFdJVEggVVBUVVJOCisgICAgdSdcdTA0MDgnICAgIyAgMHhCNyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBKRQorICAgIHUnXHUwNDA0JyAgICMgIDB4QjggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTA0NTQnICAgIyAgMHhCOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVUtSQUlOSUFOIElFCisgICAgdSdcdTA0MDcnICAgIyAgMHhCQSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZSQorICAgIHUnXHUwNDU3JyAgICMgIDB4QkIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlJCisgICAgdSdcdTA0MDknICAgIyAgMHhCQyAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBMSkUKKyAgICB1J1x1MDQ1OScgICAjICAweEJEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBMSkUKKyAgICB1J1x1MDQwYScgICAjICAweEJFIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIE5KRQorICAgIHUnXHUwNDVhJyAgICMgIDB4QkYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIE5KRQorICAgIHUnXHUwNDU4JyAgICMgIDB4QzAgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEpFCisgICAgdSdcdTA0MDUnICAgIyAgMHhDMSAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBEWkUKKyAgICB1J1x4YWMnICAgICAjICAweEMyIC0+IE5PVCBTSUdOCisgICAgdSdcdTIyMWEnICAgIyAgMHhDMyAtPiBTUVVBUkUgUk9PVAorICAgIHUnXHUwMTkyJyAgICMgIDB4QzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgdSdcdTIyNDgnICAgIyAgMHhDNSAtPiBBTE1PU1QgRVFVQUwgVE8KKyAgICB1J1x1MjIwNicgICAjICAweEM2IC0+IElOQ1JFTUVOVAorICAgIHUnXHhhYicgICAgICMgIDB4QzcgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4YmInICAgICAjICAweEM4IC0+IFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDI2JyAgICMgIDB4QzkgLT4gSE9SSVpPTlRBTCBFTExJUFNJUworICAgIHUnXHhhMCcgICAgICMgIDB4Q0EgLT4gTk8tQlJFQUsgU1BBQ0UKKyAgICB1J1x1MDQwYicgICAjICAweENCIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTSEUKKyAgICB1J1x1MDQ1YicgICAjICAweENDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0hFCisgICAgdSdcdTA0MGMnICAgIyAgMHhDRCAtPiBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLSkUKKyAgICB1J1x1MDQ1YycgICAjICAweENFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBLSkUKKyAgICB1J1x1MDQ1NScgICAjICAweENGIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBEWkUKKyAgICB1J1x1MjAxMycgICAjICAweEQwIC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweEQxIC0+IEVNIERBU0gKKyAgICB1J1x1MjAxYycgICAjICAweEQyIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHhEMyAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOCcgICAjICAweEQ0IC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHhENSAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjcnICAgICAjICAweEQ2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjAxZScgICAjICAweEQ3IC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUwNDBlJyAgICMgIDB4RDggLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVQorICAgIHUnXHUwNDVlJyAgICMgIDB4RDkgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUKKyAgICB1J1x1MDQwZicgICAjICAweERBIC0+IENZUklMTElDIENBUElUQUwgTEVUVEVSIERaSEUKKyAgICB1J1x1MDQ1ZicgICAjICAweERCIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBEWkhFCisgICAgdSdcdTIxMTYnICAgIyAgMHhEQyAtPiBOVU1FUk8gU0lHTgorICAgIHUnXHUwNDAxJyAgICMgIDB4REQgLT4gQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSU8KKyAgICB1J1x1MDQ1MScgICAjICAweERFIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJTworICAgIHUnXHUwNDRmJyAgICMgIDB4REYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisgICAgdSdcdTA0MzAnICAgIyAgMHhFMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorICAgIHUnXHUwNDMxJyAgICMgIDB4RTEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisgICAgdSdcdTA0MzInICAgIyAgMHhFMiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICB1J1x1MDQzMycgICAjICAweEUzIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKyAgICB1J1x1MDQzNCcgICAjICAweEU0IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgIHUnXHUwNDM1JyAgICMgIDB4RTUgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgdSdcdTA0MzYnICAgIyAgMHhFNiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisgICAgdSdcdTA0MzcnICAgIyAgMHhFNyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKyAgICB1J1x1MDQzOCcgICAjICAweEU4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgdSdcdTA0MzknICAgIyAgMHhFOSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorICAgIHUnXHUwNDNhJyAgICMgIDB4RUEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgdSdcdTA0M2InICAgIyAgMHhFQiAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICB1J1x1MDQzYycgICAjICAweEVDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorICAgIHUnXHUwNDNkJyAgICMgIDB4RUQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgdSdcdTA0M2UnICAgIyAgMHhFRSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgIHUnXHUwNDNmJyAgICMgIDB4RUYgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgdSdcdTA0NDAnICAgIyAgMHhGMCAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICB1J1x1MDQ0MScgICAjICAweEYxIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgIHUnXHUwNDQyJyAgICMgIDB4RjIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgdSdcdTA0NDMnICAgIyAgMHhGMyAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgIHUnXHUwNDQ0JyAgICMgIDB4RjQgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisgICAgdSdcdTA0NDUnICAgIyAgMHhGNSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKyAgICB1J1x1MDQ0NicgICAjICAweEY2IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKyAgICB1J1x1MDQ0NycgICAjICAweEY3IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICB1J1x1MDQ0OCcgICAjICAweEY4IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICB1J1x1MDQ0OScgICAjICAweEY5IC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQQorICAgIHUnXHUwNDRhJyAgICMgIDB4RkEgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorICAgIHUnXHUwNDRiJyAgICMgIDB4RkIgLT4gQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKyAgICB1J1x1MDQ0YycgICAjICAweEZDIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR04KKyAgICB1J1x1MDQ0ZCcgICAjICAweEZEIC0+IENZUklMTElDIFNNQUxMIExFVFRFUiBFCisgICAgdSdcdTA0NGUnICAgIyAgMHhGRSAtPiBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICB1J1x1MjBhYycgICAjICAweEZGIC0+IEVVUk8gU0lHTgorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2N5cmlsbGljLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyOTNmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2N5cmlsbGljLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyOTNmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19jeXJpbGxpYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYmQ3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZmFyc2kucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgbWFjX2ZhcnNpIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL0FQUExFL0ZBUlNJLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J21hYy1mYXJzaScsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFLCBsZWZ0LXJpZ2h0CisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLLCBsZWZ0LXJpZ2h0CisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSywgbGVmdC1yaWdodAorICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORCwgbGVmdC1yaWdodAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRSwgbGVmdC1yaWdodAorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUywgbGVmdC1yaWdodAorICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMsIGxlZnQtcmlnaHQKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLLCBsZWZ0LXJpZ2h0CisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BLCBsZWZ0LXJpZ2h0OyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NkMgQVJBQklDIFRIT1VTQU5EUyBTRVBBUkFUT1IKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUywgbGVmdC1yaWdodAorICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QLCBsZWZ0LXJpZ2h0OyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2NkIgQVJBQklDIERFQ0lNQUwgU0VQQVJBVE9SCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTLCBsZWZ0LXJpZ2h0CisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPOyAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkYwIEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkU7ICAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkYxIEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTzsgICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2RjIgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUU7IGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDZGMyBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVI7ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2RjQgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkU7ICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2RjUgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWDsgICBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2RjYgRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU47IGluIEFyYWJpYy1zY3JpcHQgY29udGV4dCwgZGlzcGxheWVkIGFzIDB4MDZGNyBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUOyBpbiBBcmFiaWMtc2NyaXB0IGNvbnRleHQsIGRpc3BsYXllZCBhcyAweDA2RjggRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FOyAgaW4gQXJhYmljLXNjcmlwdCBjb250ZXh0LCBkaXNwbGF5ZWQgYXMgMHgwNkY5IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTiwgbGVmdC1yaWdodAorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OLCBsZWZ0LXJpZ2h0CisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTiwgbGVmdC1yaWdodAorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04sIGxlZnQtcmlnaHQKKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOLCBsZWZ0LXJpZ2h0CisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLLCBsZWZ0LXJpZ2h0CisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMsIGxlZnQtcmlnaHQKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VULCBsZWZ0LXJpZ2h0CisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVCwgbGVmdC1yaWdodAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUsIGxlZnQtcmlnaHQKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQsIGxlZnQtcmlnaHQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUsIGxlZnQtcmlnaHQKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQsIGxlZnQtcmlnaHQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHhjNCcgICAgICMgIDB4ODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhhMCcgICAgICMgIDB4ODEgLT4gTk8tQlJFQUsgU1BBQ0UsIHJpZ2h0LWxlZnQKKyAgICB1J1x4YzcnICAgICAjICAweDgyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGM5JyAgICAgIyAgMHg4MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQUNVVEUKKyAgICB1J1x4ZDEnICAgICAjICAweDg0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhkNicgICAgICMgIDB4ODUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkYycgICAgICMgIDB4ODYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlMScgICAgICMgIDB4ODcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhlMCcgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMicgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHg4QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwNmJhJyAgICMgIDB4OEIgLT4gQVJBQklDIExFVFRFUiBOT09OIEdIVU5OQQorICAgIHUnXHhhYicgICAgICMgIDB4OEMgLT4gTEVGVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICB1J1x4ZTcnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4OEYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4OTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZCcgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHUyMDI2JyAgICMgIDB4OTMgLT4gSE9SSVpPTlRBTCBFTExJUFNJUywgcmlnaHQtbGVmdAorICAgIHUnXHhlZScgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMScgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMycgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhiYicgICAgICMgIDB4OTggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLLCByaWdodC1sZWZ0CisgICAgdSdceGY0JyAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDlBIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY3JyAgICAgIyAgMHg5QiAtPiBESVZJU0lPTiBTSUdOLCByaWdodC1sZWZ0CisgICAgdSdceGZhJyAgICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGY5JyAgICAgIyAgMHg5RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweDlGIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdScgJyAgICAgICAgIyAgMHhBMCAtPiBTUEFDRSwgcmlnaHQtbGVmdAorICAgIHUnIScgICAgICAgICMgIDB4QTEgLT4gRVhDTEFNQVRJT04gTUFSSywgcmlnaHQtbGVmdAorICAgIHUnIicgICAgICAgICMgIDB4QTIgLT4gUVVPVEFUSU9OIE1BUkssIHJpZ2h0LWxlZnQKKyAgICB1JyMnICAgICAgICAjICAweEEzIC0+IE5VTUJFUiBTSUdOLCByaWdodC1sZWZ0CisgICAgdSckJyAgICAgICAgIyAgMHhBNCAtPiBET0xMQVIgU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjZhJyAgICMgIDB4QTUgLT4gQVJBQklDIFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4QTYgLT4gQU1QRVJTQU5ELCByaWdodC1sZWZ0CisgICAgdSInIiAgICAgICAgIyAgMHhBNyAtPiBBUE9TVFJPUEhFLCByaWdodC1sZWZ0CisgICAgdScoJyAgICAgICAgIyAgMHhBOCAtPiBMRUZUIFBBUkVOVEhFU0lTLCByaWdodC1sZWZ0CisgICAgdScpJyAgICAgICAgIyAgMHhBOSAtPiBSSUdIVCBQQVJFTlRIRVNJUywgcmlnaHQtbGVmdAorICAgIHUnKicgICAgICAgICMgIDB4QUEgLT4gQVNURVJJU0ssIHJpZ2h0LWxlZnQKKyAgICB1JysnICAgICAgICAjICAweEFCIC0+IFBMVVMgU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjBjJyAgICMgIDB4QUMgLT4gQVJBQklDIENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHhBRCAtPiBIWVBIRU4tTUlOVVMsIHJpZ2h0LWxlZnQKKyAgICB1Jy4nICAgICAgICAjICAweEFFIC0+IEZVTEwgU1RPUCwgcmlnaHQtbGVmdAorICAgIHUnLycgICAgICAgICMgIDB4QUYgLT4gU09MSURVUywgcmlnaHQtbGVmdAorICAgIHUnXHUwNmYwJyAgICMgIDB4QjAgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFpFUk8sIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2ZjEnICAgIyAgMHhCMSAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgT05FLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNmYyJyAgICMgIDB4QjIgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFRXTywgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDZmMycgICAjICAweEIzIC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBUSFJFRSwgcmlnaHQtbGVmdCAobmVlZCBvdmVycmlkZSkKKyAgICB1J1x1MDZmNCcgICAjICAweEI0IC0+IEVYVEVOREVEIEFSQUJJQy1JTkRJQyBESUdJVCBGT1VSLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNmY1JyAgICMgIDB4QjUgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEZJVkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSdcdTA2ZjYnICAgIyAgMHhCNiAtPiBFWFRFTkRFRCBBUkFCSUMtSU5ESUMgRElHSVQgU0lYLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNmY3JyAgICMgIDB4QjcgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIFNFVkVOLCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNmY4JyAgICMgIDB4QjggLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIEVJR0hULCByaWdodC1sZWZ0IChuZWVkIG92ZXJyaWRlKQorICAgIHUnXHUwNmY5JyAgICMgIDB4QjkgLT4gRVhURU5ERUQgQVJBQklDLUlORElDIERJR0lUIE5JTkUsIHJpZ2h0LWxlZnQgKG5lZWQgb3ZlcnJpZGUpCisgICAgdSc6JyAgICAgICAgIyAgMHhCQSAtPiBDT0xPTiwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjFiJyAgICMgIDB4QkIgLT4gQVJBQklDIFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4QkMgLT4gTEVTUy1USEFOIFNJR04sIHJpZ2h0LWxlZnQKKyAgICB1Jz0nICAgICAgICAjICAweEJEIC0+IEVRVUFMUyBTSUdOLCByaWdodC1sZWZ0CisgICAgdSc+JyAgICAgICAgIyAgMHhCRSAtPiBHUkVBVEVSLVRIQU4gU0lHTiwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjFmJyAgICMgIDB4QkYgLT4gQVJBQklDIFFVRVNUSU9OIE1BUksKKyAgICB1J1x1Mjc0YScgICAjICAweEMwIC0+IEVJR0hUIFRFQVJEUk9QLVNQT0tFRCBQUk9QRUxMRVIgQVNURVJJU0ssIHJpZ2h0LWxlZnQKKyAgICB1J1x1MDYyMScgICAjICAweEMxIC0+IEFSQUJJQyBMRVRURVIgSEFNWkEKKyAgICB1J1x1MDYyMicgICAjICAweEMyIC0+IEFSQUJJQyBMRVRURVIgQUxFRiBXSVRIIE1BRERBIEFCT1ZFCisgICAgdSdcdTA2MjMnICAgIyAgMHhDMyAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI0JyAgICMgIDB4QzQgLT4gQVJBQklDIExFVFRFUiBXQVcgV0lUSCBIQU1aQSBBQk9WRQorICAgIHUnXHUwNjI1JyAgICMgIDB4QzUgLT4gQVJBQklDIExFVFRFUiBBTEVGIFdJVEggSEFNWkEgQkVMT1cKKyAgICB1J1x1MDYyNicgICAjICAweEM2IC0+IEFSQUJJQyBMRVRURVIgWUVIIFdJVEggSEFNWkEgQUJPVkUKKyAgICB1J1x1MDYyNycgICAjICAweEM3IC0+IEFSQUJJQyBMRVRURVIgQUxFRgorICAgIHUnXHUwNjI4JyAgICMgIDB4QzggLT4gQVJBQklDIExFVFRFUiBCRUgKKyAgICB1J1x1MDYyOScgICAjICAweEM5IC0+IEFSQUJJQyBMRVRURVIgVEVIIE1BUkJVVEEKKyAgICB1J1x1MDYyYScgICAjICAweENBIC0+IEFSQUJJQyBMRVRURVIgVEVICisgICAgdSdcdTA2MmInICAgIyAgMHhDQiAtPiBBUkFCSUMgTEVUVEVSIFRIRUgKKyAgICB1J1x1MDYyYycgICAjICAweENDIC0+IEFSQUJJQyBMRVRURVIgSkVFTQorICAgIHUnXHUwNjJkJyAgICMgIDB4Q0QgLT4gQVJBQklDIExFVFRFUiBIQUgKKyAgICB1J1x1MDYyZScgICAjICAweENFIC0+IEFSQUJJQyBMRVRURVIgS0hBSAorICAgIHUnXHUwNjJmJyAgICMgIDB4Q0YgLT4gQVJBQklDIExFVFRFUiBEQUwKKyAgICB1J1x1MDYzMCcgICAjICAweEQwIC0+IEFSQUJJQyBMRVRURVIgVEhBTAorICAgIHUnXHUwNjMxJyAgICMgIDB4RDEgLT4gQVJBQklDIExFVFRFUiBSRUgKKyAgICB1J1x1MDYzMicgICAjICAweEQyIC0+IEFSQUJJQyBMRVRURVIgWkFJTgorICAgIHUnXHUwNjMzJyAgICMgIDB4RDMgLT4gQVJBQklDIExFVFRFUiBTRUVOCisgICAgdSdcdTA2MzQnICAgIyAgMHhENCAtPiBBUkFCSUMgTEVUVEVSIFNIRUVOCisgICAgdSdcdTA2MzUnICAgIyAgMHhENSAtPiBBUkFCSUMgTEVUVEVSIFNBRAorICAgIHUnXHUwNjM2JyAgICMgIDB4RDYgLT4gQVJBQklDIExFVFRFUiBEQUQKKyAgICB1J1x1MDYzNycgICAjICAweEQ3IC0+IEFSQUJJQyBMRVRURVIgVEFICisgICAgdSdcdTA2MzgnICAgIyAgMHhEOCAtPiBBUkFCSUMgTEVUVEVSIFpBSAorICAgIHUnXHUwNjM5JyAgICMgIDB4RDkgLT4gQVJBQklDIExFVFRFUiBBSU4KKyAgICB1J1x1MDYzYScgICAjICAweERBIC0+IEFSQUJJQyBMRVRURVIgR0hBSU4KKyAgICB1J1snICAgICAgICAjICAweERCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICB1J1xcJyAgICAgICAjICAweERDIC0+IFJFVkVSU0UgU09MSURVUywgcmlnaHQtbGVmdAorICAgIHUnXScgICAgICAgICMgIDB4REQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQsIHJpZ2h0LWxlZnQKKyAgICB1J14nICAgICAgICAjICAweERFIC0+IENJUkNVTUZMRVggQUNDRU5ULCByaWdodC1sZWZ0CisgICAgdSdfJyAgICAgICAgIyAgMHhERiAtPiBMT1cgTElORSwgcmlnaHQtbGVmdAorICAgIHUnXHUwNjQwJyAgICMgIDB4RTAgLT4gQVJBQklDIFRBVFdFRUwKKyAgICB1J1x1MDY0MScgICAjICAweEUxIC0+IEFSQUJJQyBMRVRURVIgRkVICisgICAgdSdcdTA2NDInICAgIyAgMHhFMiAtPiBBUkFCSUMgTEVUVEVSIFFBRgorICAgIHUnXHUwNjQzJyAgICMgIDB4RTMgLT4gQVJBQklDIExFVFRFUiBLQUYKKyAgICB1J1x1MDY0NCcgICAjICAweEU0IC0+IEFSQUJJQyBMRVRURVIgTEFNCisgICAgdSdcdTA2NDUnICAgIyAgMHhFNSAtPiBBUkFCSUMgTEVUVEVSIE1FRU0KKyAgICB1J1x1MDY0NicgICAjICAweEU2IC0+IEFSQUJJQyBMRVRURVIgTk9PTgorICAgIHUnXHUwNjQ3JyAgICMgIDB4RTcgLT4gQVJBQklDIExFVFRFUiBIRUgKKyAgICB1J1x1MDY0OCcgICAjICAweEU4IC0+IEFSQUJJQyBMRVRURVIgV0FXCisgICAgdSdcdTA2NDknICAgIyAgMHhFOSAtPiBBUkFCSUMgTEVUVEVSIEFMRUYgTUFLU1VSQQorICAgIHUnXHUwNjRhJyAgICMgIDB4RUEgLT4gQVJBQklDIExFVFRFUiBZRUgKKyAgICB1J1x1MDY0YicgICAjICAweEVCIC0+IEFSQUJJQyBGQVRIQVRBTgorICAgIHUnXHUwNjRjJyAgICMgIDB4RUMgLT4gQVJBQklDIERBTU1BVEFOCisgICAgdSdcdTA2NGQnICAgIyAgMHhFRCAtPiBBUkFCSUMgS0FTUkFUQU4KKyAgICB1J1x1MDY0ZScgICAjICAweEVFIC0+IEFSQUJJQyBGQVRIQQorICAgIHUnXHUwNjRmJyAgICMgIDB4RUYgLT4gQVJBQklDIERBTU1BCisgICAgdSdcdTA2NTAnICAgIyAgMHhGMCAtPiBBUkFCSUMgS0FTUkEKKyAgICB1J1x1MDY1MScgICAjICAweEYxIC0+IEFSQUJJQyBTSEFEREEKKyAgICB1J1x1MDY1MicgICAjICAweEYyIC0+IEFSQUJJQyBTVUtVTgorICAgIHUnXHUwNjdlJyAgICMgIDB4RjMgLT4gQVJBQklDIExFVFRFUiBQRUgKKyAgICB1J1x1MDY3OScgICAjICAweEY0IC0+IEFSQUJJQyBMRVRURVIgVFRFSAorICAgIHUnXHUwNjg2JyAgICMgIDB4RjUgLT4gQVJBQklDIExFVFRFUiBUQ0hFSAorICAgIHUnXHUwNmQ1JyAgICMgIDB4RjYgLT4gQVJBQklDIExFVFRFUiBBRQorICAgIHUnXHUwNmE0JyAgICMgIDB4RjcgLT4gQVJBQklDIExFVFRFUiBWRUgKKyAgICB1J1x1MDZhZicgICAjICAweEY4IC0+IEFSQUJJQyBMRVRURVIgR0FGCisgICAgdSdcdTA2ODgnICAgIyAgMHhGOSAtPiBBUkFCSUMgTEVUVEVSIEREQUwKKyAgICB1J1x1MDY5MScgICAjICAweEZBIC0+IEFSQUJJQyBMRVRURVIgUlJFSAorICAgIHUneycgICAgICAgICMgIDB4RkIgLT4gTEVGVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgdSd8JyAgICAgICAgIyAgMHhGQyAtPiBWRVJUSUNBTCBMSU5FLCByaWdodC1sZWZ0CisgICAgdSd9JyAgICAgICAgIyAgMHhGRCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VULCByaWdodC1sZWZ0CisgICAgdSdcdTA2OTgnICAgIyAgMHhGRSAtPiBBUkFCSUMgTEVUVEVSIEpFSAorICAgIHUnXHUwNmQyJyAgICMgIDB4RkYgLT4gQVJBQklDIExFVFRFUiBZRUggQkFSUkVFCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZmFyc2kucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzYyYmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZmFyc2kucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzYyYmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ZhcnNpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmNGZmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19ncmVlay5weQpAQCAtMCwwICsxLDMwNyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBtYWNfZ3JlZWsgZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvR1JFRUsuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWFjLWdyZWVrJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisKKyMjIyBEZWNvZGluZyBUYWJsZQorCitkZWNvZGluZ190YWJsZSA9ICgKKyAgICB1J1x4MDAnICAgICAjICAweDAwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMicgICAgICMgIDB4MDIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDMnICAgICAjICAweDAzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA0JyAgICAgIyAgMHgwNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDYnICAgICAjICAweDA2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA3JyAgICAgIyAgMHgwNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwOCcgICAgICMgIDB4MDggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x0JyAgICAgICAjICAweDA5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYicgICAgICMgIDB4MEIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdccicgICAgICAgIyAgMHgwRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZScgICAgICMgIDB4MEUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMScgICAgICMgIDB4MTEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEzJyAgICAgIyAgMHgxMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNCcgICAgICMgIDB4MTQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNycgICAgICMgIDB4MTcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTgnICAgICAjICAweDE4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE5JyAgICAgIyAgMHgxOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYScgICAgICMgIDB4MUEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFjJyAgICAgIyAgMHgxQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZCcgICAgICMgIDB4MUQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWUnICAgICAjICAweDFFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFmJyAgICAgIyAgMHgxRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnICcgICAgICAgICMgIDB4MjAgLT4gU1BBQ0UKKyAgICB1JyEnICAgICAgICAjICAweDIxIC0+IEVYQ0xBTUFUSU9OIE1BUksKKyAgICB1JyInICAgICAgICAjICAweDIyIC0+IFFVT1RBVElPTiBNQVJLCisgICAgdScjJyAgICAgICAgIyAgMHgyMyAtPiBOVU1CRVIgU0lHTgorICAgIHUnJCcgICAgICAgICMgIDB4MjQgLT4gRE9MTEFSIFNJR04KKyAgICB1JyUnICAgICAgICAjICAweDI1IC0+IFBFUkNFTlQgU0lHTgorICAgIHUnJicgICAgICAgICMgIDB4MjYgLT4gQU1QRVJTQU5ECisgICAgdSInIiAgICAgICAgIyAgMHgyNyAtPiBBUE9TVFJPUEhFCisgICAgdScoJyAgICAgICAgIyAgMHgyOCAtPiBMRUZUIFBBUkVOVEhFU0lTCisgICAgdScpJyAgICAgICAgIyAgMHgyOSAtPiBSSUdIVCBQQVJFTlRIRVNJUworICAgIHUnKicgICAgICAgICMgIDB4MkEgLT4gQVNURVJJU0sKKyAgICB1JysnICAgICAgICAjICAweDJCIC0+IFBMVVMgU0lHTgorICAgIHUnLCcgICAgICAgICMgIDB4MkMgLT4gQ09NTUEKKyAgICB1Jy0nICAgICAgICAjICAweDJEIC0+IEhZUEhFTi1NSU5VUworICAgIHUnLicgICAgICAgICMgIDB4MkUgLT4gRlVMTCBTVE9QCisgICAgdScvJyAgICAgICAgIyAgMHgyRiAtPiBTT0xJRFVTCisgICAgdScwJyAgICAgICAgIyAgMHgzMCAtPiBESUdJVCBaRVJPCisgICAgdScxJyAgICAgICAgIyAgMHgzMSAtPiBESUdJVCBPTkUKKyAgICB1JzInICAgICAgICAjICAweDMyIC0+IERJR0lUIFRXTworICAgIHUnMycgICAgICAgICMgIDB4MzMgLT4gRElHSVQgVEhSRUUKKyAgICB1JzQnICAgICAgICAjICAweDM0IC0+IERJR0lUIEZPVVIKKyAgICB1JzUnICAgICAgICAjICAweDM1IC0+IERJR0lUIEZJVkUKKyAgICB1JzYnICAgICAgICAjICAweDM2IC0+IERJR0lUIFNJWAorICAgIHUnNycgICAgICAgICMgIDB4MzcgLT4gRElHSVQgU0VWRU4KKyAgICB1JzgnICAgICAgICAjICAweDM4IC0+IERJR0lUIEVJR0hUCisgICAgdSc5JyAgICAgICAgIyAgMHgzOSAtPiBESUdJVCBOSU5FCisgICAgdSc6JyAgICAgICAgIyAgMHgzQSAtPiBDT0xPTgorICAgIHUnOycgICAgICAgICMgIDB4M0IgLT4gU0VNSUNPTE9OCisgICAgdSc8JyAgICAgICAgIyAgMHgzQyAtPiBMRVNTLVRIQU4gU0lHTgorICAgIHUnPScgICAgICAgICMgIDB4M0QgLT4gRVFVQUxTIFNJR04KKyAgICB1Jz4nICAgICAgICAjICAweDNFIC0+IEdSRUFURVItVEhBTiBTSUdOCisgICAgdSc/JyAgICAgICAgIyAgMHgzRiAtPiBRVUVTVElPTiBNQVJLCisgICAgdSdAJyAgICAgICAgIyAgMHg0MCAtPiBDT01NRVJDSUFMIEFUCisgICAgdSdBJyAgICAgICAgIyAgMHg0MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBCisgICAgdSdCJyAgICAgICAgIyAgMHg0MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisgICAgdSdDJyAgICAgICAgIyAgMHg0MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDCisgICAgdSdEJyAgICAgICAgIyAgMHg0NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBECisgICAgdSdFJyAgICAgICAgIyAgMHg0NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisgICAgdSdGJyAgICAgICAgIyAgMHg0NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBGCisgICAgdSdHJyAgICAgICAgIyAgMHg0NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBHCisgICAgdSdIJyAgICAgICAgIyAgMHg0OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisgICAgdSdJJyAgICAgICAgIyAgMHg0OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJCisgICAgdSdKJyAgICAgICAgIyAgMHg0QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBKCisgICAgdSdLJyAgICAgICAgIyAgMHg0QiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisgICAgdSdMJyAgICAgICAgIyAgMHg0QyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBMCisgICAgdSdNJyAgICAgICAgIyAgMHg0RCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBNCisgICAgdSdOJyAgICAgICAgIyAgMHg0RSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisgICAgdSdPJyAgICAgICAgIyAgMHg0RiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPCisgICAgdSdQJyAgICAgICAgIyAgMHg1MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBQCisgICAgdSdRJyAgICAgICAgIyAgMHg1MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisgICAgdSdSJyAgICAgICAgIyAgMHg1MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBSCisgICAgdSdTJyAgICAgICAgIyAgMHg1MyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBTCisgICAgdSdUJyAgICAgICAgIyAgMHg1NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisgICAgdSdVJyAgICAgICAgIyAgMHg1NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVCisgICAgdSdWJyAgICAgICAgIyAgMHg1NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBWCisgICAgdSdXJyAgICAgICAgIyAgMHg1NyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisgICAgdSdYJyAgICAgICAgIyAgMHg1OCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBYCisgICAgdSdZJyAgICAgICAgIyAgMHg1OSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZCisgICAgdSdaJyAgICAgICAgIyAgMHg1QSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisgICAgdSdbJyAgICAgICAgIyAgMHg1QiAtPiBMRUZUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdcXCcgICAgICAgIyAgMHg1QyAtPiBSRVZFUlNFIFNPTElEVVMKKyAgICB1J10nICAgICAgICAjICAweDVEIC0+IFJJR0hUIFNRVUFSRSBCUkFDS0VUCisgICAgdSdeJyAgICAgICAgIyAgMHg1RSAtPiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXycgICAgICAgICMgIDB4NUYgLT4gTE9XIExJTkUKKyAgICB1J2AnICAgICAgICAjICAweDYwIC0+IEdSQVZFIEFDQ0VOVAorICAgIHUnYScgICAgICAgICMgIDB4NjEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEKKyAgICB1J2InICAgICAgICAjICAweDYyIC0+IExBVElOIFNNQUxMIExFVFRFUiBCCisgICAgdSdjJyAgICAgICAgIyAgMHg2MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQworICAgIHUnZCcgICAgICAgICMgIDB4NjQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEQKKyAgICB1J2UnICAgICAgICAjICAweDY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBFCisgICAgdSdmJyAgICAgICAgIyAgMHg2NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRgorICAgIHUnZycgICAgICAgICMgIDB4NjcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcKKyAgICB1J2gnICAgICAgICAjICAweDY4IC0+IExBVElOIFNNQUxMIExFVFRFUiBICisgICAgdSdpJyAgICAgICAgIyAgMHg2OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSQorICAgIHUnaicgICAgICAgICMgIDB4NkEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEoKKyAgICB1J2snICAgICAgICAjICAweDZCIC0+IExBVElOIFNNQUxMIExFVFRFUiBLCisgICAgdSdsJyAgICAgICAgIyAgMHg2QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTAorICAgIHUnbScgICAgICAgICMgIDB4NkQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE0KKyAgICB1J24nICAgICAgICAjICAweDZFIC0+IExBVElOIFNNQUxMIExFVFRFUiBOCisgICAgdSdvJyAgICAgICAgIyAgMHg2RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTworICAgIHUncCcgICAgICAgICMgIDB4NzAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFAKKyAgICB1J3EnICAgICAgICAjICAweDcxIC0+IExBVElOIFNNQUxMIExFVFRFUiBRCisgICAgdSdyJyAgICAgICAgIyAgMHg3MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUgorICAgIHUncycgICAgICAgICMgIDB4NzMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFMKKyAgICB1J3QnICAgICAgICAjICAweDc0IC0+IExBVElOIFNNQUxMIExFVFRFUiBUCisgICAgdSd1JyAgICAgICAgIyAgMHg3NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVQorICAgIHUndicgICAgICAgICMgIDB4NzYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFYKKyAgICB1J3cnICAgICAgICAjICAweDc3IC0+IExBVElOIFNNQUxMIExFVFRFUiBXCisgICAgdSd4JyAgICAgICAgIyAgMHg3OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWAorICAgIHUneScgICAgICAgICMgIDB4NzkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkKKyAgICB1J3onICAgICAgICAjICAweDdBIC0+IExBVElOIFNNQUxMIExFVFRFUiBaCisgICAgdSd7JyAgICAgICAgIyAgMHg3QiAtPiBMRUZUIENVUkxZIEJSQUNLRVQKKyAgICB1J3wnICAgICAgICAjICAweDdDIC0+IFZFUlRJQ0FMIExJTkUKKyAgICB1J30nICAgICAgICAjICAweDdEIC0+IFJJR0hUIENVUkxZIEJSQUNLRVQKKyAgICB1J34nICAgICAgICAjICAweDdFIC0+IFRJTERFCisgICAgdSdceDdmJyAgICAgIyAgMHg3RiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHhjNCcgICAgICMgIDB4ODAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhiOScgICAgICMgIDB4ODEgLT4gU1VQRVJTQ1JJUFQgT05FCisgICAgdSdceGIyJyAgICAgIyAgMHg4MiAtPiBTVVBFUlNDUklQVCBUV08KKyAgICB1J1x4YzknICAgICAjICAweDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhiMycgICAgICMgIDB4ODQgLT4gU1VQRVJTQ1JJUFQgVEhSRUUKKyAgICB1J1x4ZDYnICAgICAjICAweDg1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDg2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDM4NScgICAjICAweDg3IC0+IEdSRUVLIERJQUxZVElLQSBUT05PUworICAgIHUnXHhlMCcgICAgICMgIDB4ODggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBHUkFWRQorICAgIHUnXHhlMicgICAgICMgIDB4ODkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGU0JyAgICAgIyAgMHg4QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUwMzg0JyAgICMgIDB4OEIgLT4gR1JFRUsgVE9OT1MKKyAgICB1J1x4YTgnICAgICAjICAweDhDIC0+IERJQUVSRVNJUworICAgIHUnXHhlNycgICAgICMgIDB4OEQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU5JyAgICAgIyAgMHg4RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU4JyAgICAgIyAgMHg4RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVhJyAgICAgIyAgMHg5MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGEzJyAgICAgIyAgMHg5MiAtPiBQT1VORCBTSUdOCisgICAgdSdcdTIxMjInICAgIyAgMHg5MyAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x4ZWUnICAgICAjICAweDk0IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlZicgICAgICMgIDB4OTUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MjAyMicgICAjICAweDk2IC0+IEJVTExFVAorICAgIHUnXHhiZCcgICAgICMgIDB4OTcgLT4gVlVMR0FSIEZSQUNUSU9OIE9ORSBIQUxGCisgICAgdSdcdTIwMzAnICAgIyAgMHg5OCAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhhNicgICAgICMgIDB4OUIgLT4gQlJPS0VOIEJBUgorICAgIHUnXHUyMGFjJyAgICMgIDB4OUMgLT4gRVVSTyBTSUdOICMgYmVmb3JlIE1hYyBPUyA5LjIuMiwgd2FzIFNPRlQgSFlQSEVOCisgICAgdSdceGY5JyAgICAgIyAgMHg5RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweDlGIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHhBMCAtPiBEQUdHRVIKKyAgICB1J1x1MDM5MycgICAjICAweEExIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEdBTU1BCisgICAgdSdcdTAzOTQnICAgIyAgMHhBMiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBERUxUQQorICAgIHUnXHUwMzk4JyAgICMgIDB4QTMgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgVEhFVEEKKyAgICB1J1x1MDM5YicgICAjICAweEE0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzOWUnICAgIyAgMHhBNSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBYSQorICAgIHUnXHUwM2EwJyAgICMgIDB4QTYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgUEkKKyAgICB1J1x4ZGYnICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGFlJyAgICAgIyAgMHhBOCAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTAzYTMnICAgIyAgMHhBQSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2FhJyAgICMgIDB4QUIgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIHUnXHhhNycgICAgICMgIDB4QUMgLT4gU0VDVElPTiBTSUdOCisgICAgdSdcdTIyNjAnICAgIyAgMHhBRCAtPiBOT1QgRVFVQUwgVE8KKyAgICB1J1x4YjAnICAgICAjICAweEFFIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGI3JyAgICAgIyAgMHhBRiAtPiBNSURETEUgRE9UCisgICAgdSdcdTAzOTEnICAgIyAgMHhCMCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBBTFBIQQorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjQnICAgIyAgMHhCMiAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NScgICAjICAweEIzIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHhhNScgICAgICMgIDB4QjQgLT4gWUVOIFNJR04KKyAgICB1J1x1MDM5MicgICAjICAweEI1IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEJFVEEKKyAgICB1J1x1MDM5NScgICAjICAweEI2IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04KKyAgICB1J1x1MDM5NicgICAjICAweEI3IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFpFVEEKKyAgICB1J1x1MDM5NycgICAjICAweEI4IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVUQQorICAgIHUnXHUwMzk5JyAgICMgIDB4QjkgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQQorICAgIHUnXHUwMzlhJyAgICMgIDB4QkEgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgS0FQUEEKKyAgICB1J1x1MDM5YycgICAjICAweEJCIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE1VCisgICAgdSdcdTAzYTYnICAgIyAgMHhCQyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBQSEkKKyAgICB1J1x1MDNhYicgICAjICAweEJEIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDNhOCcgICAjICAweEJFIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFBTSQorICAgIHUnXHUwM2E5JyAgICMgIDB4QkYgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNhYycgICAjICAweEMwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBBTFBIQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzOWQnICAgIyAgMHhDMSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBOVQorICAgIHUnXHhhYycgICAgICMgIDB4QzIgLT4gTk9UIFNJR04KKyAgICB1J1x1MDM5ZicgICAjICAweEMzIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNhMScgICAjICAweEM0IC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFJITworICAgIHUnXHUyMjQ4JyAgICMgIDB4QzUgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdcdTAzYTQnICAgIyAgMHhDNiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBUQVUKKyAgICB1J1x4YWInICAgICAjICAweEM3IC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHhDOCAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweEM5IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x4YTAnICAgICAjICAweENBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdcdTAzYTUnICAgIyAgMHhDQiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBVUFNJTE9OCisgICAgdSdcdTAzYTcnICAgIyAgMHhDQyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBDSEkKKyAgICB1J1x1MDM4NicgICAjICAweENEIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEFMUEhBIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4OCcgICAjICAweENFIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwMTUzJyAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1MjAxMycgICAjICAweEQwIC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNScgICAjICAweEQxIC0+IEhPUklaT05UQUwgQkFSCisgICAgdSdcdTIwMWMnICAgIyAgMHhEMiAtPiBMRUZUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFkJyAgICMgIDB4RDMgLT4gUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTgnICAgIyAgMHhENCAtPiBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE5JyAgICMgIDB4RDUgLT4gUklHSFQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGY3JyAgICAgIyAgMHhENiAtPiBESVZJU0lPTiBTSUdOCisgICAgdSdcdTAzODknICAgIyAgMHhENyAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBFVEEgV0lUSCBUT05PUworICAgIHUnXHUwMzhhJyAgICMgIDB4RDggLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGMnICAgIyAgMHhEOSAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUlDUk9OIFdJVEggVE9OT1MKKyAgICB1J1x1MDM4ZScgICAjICAweERBIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIFVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2FkJyAgICMgIDB4REIgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVQU0lMT04gV0lUSCBUT05PUworICAgIHUnXHUwM2FlJyAgICMgIDB4REMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIEVUQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzYWYnICAgIyAgMHhERCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2MnICAgIyAgMHhERSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01JQ1JPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzOGYnICAgIyAgMHhERiAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQSBXSVRIIFRPTk9TCisgICAgdSdcdTAzY2QnICAgIyAgMHhFMCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgVVBTSUxPTiBXSVRIIFRPTk9TCisgICAgdSdcdTAzYjEnICAgIyAgMHhFMSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEEKKyAgICB1J1x1MDNiMicgICAjICAweEUyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBCRVRBCisgICAgdSdcdTAzYzgnICAgIyAgMHhFMyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUFNJCisgICAgdSdcdTAzYjQnICAgIyAgMHhFNCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgREVMVEEKKyAgICB1J1x1MDNiNScgICAjICAweEU1IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFUFNJTE9OCisgICAgdSdcdTAzYzYnICAgIyAgMHhFNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEhJCisgICAgdSdcdTAzYjMnICAgIyAgMHhFNyAtPiBHUkVFSyBTTUFMTCBMRVRURVIgR0FNTUEKKyAgICB1J1x1MDNiNycgICAjICAweEU4IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBFVEEKKyAgICB1J1x1MDNiOScgICAjICAweEU5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBCisgICAgdSdcdTAzYmUnICAgIyAgMHhFQSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgWEkKKyAgICB1J1x1MDNiYScgICAjICAweEVCIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBLQVBQQQorICAgIHUnXHUwM2JiJyAgICMgIDB4RUMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIExBTURBCisgICAgdSdcdTAzYmMnICAgIyAgMHhFRCAtPiBHUkVFSyBTTUFMTCBMRVRURVIgTVUKKyAgICB1J1x1MDNiZCcgICAjICAweEVFIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBOVQorICAgIHUnXHUwM2JmJyAgICMgIDB4RUYgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NSUNST04KKyAgICB1J1x1MDNjMCcgICAjICAweEYwIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUwM2NlJyAgICMgIDB4RjEgLT4gR1JFRUsgU01BTEwgTEVUVEVSIE9NRUdBIFdJVEggVE9OT1MKKyAgICB1J1x1MDNjMScgICAjICAweEYyIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBSSE8KKyAgICB1J1x1MDNjMycgICAjICAweEYzIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBTSUdNQQorICAgIHUnXHUwM2M0JyAgICMgIDB4RjQgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRBVQorICAgIHUnXHUwM2I4JyAgICMgIDB4RjUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFRIRVRBCisgICAgdSdcdTAzYzknICAgIyAgMHhGNiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDNjMicgICAjICAweEY3IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBGSU5BTCBTSUdNQQorICAgIHUnXHUwM2M3JyAgICMgIDB4RjggLT4gR1JFRUsgU01BTEwgTEVUVEVSIENISQorICAgIHUnXHUwM2M1JyAgICMgIDB4RjkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04KKyAgICB1J1x1MDNiNicgICAjICAweEZBIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBaRVRBCisgICAgdSdcdTAzY2EnICAgIyAgMHhGQiAtPiBHUkVFSyBTTUFMTCBMRVRURVIgSU9UQSBXSVRIIERJQUxZVElLQQorICAgIHUnXHUwM2NiJyAgICMgIDB4RkMgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EKKyAgICB1J1x1MDM5MCcgICAjICAweEZEIC0+IEdSRUVLIFNNQUxMIExFVFRFUiBJT1RBIFdJVEggRElBTFlUSUtBIEFORCBUT05PUworICAgIHUnXHUwM2IwJyAgICMgIDB4RkUgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFVQU0lMT04gV0lUSCBESUFMWVRJS0EgQU5EIFRPTk9TCisgICAgdSdceGFkJyAgICAgIyAgMHhGRiAtPiBTT0ZUIEhZUEhFTiAjIGJlZm9yZSBNYWMgT1MgOS4yLjIsIHdhcyB1bmRlZmluZWQKKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19ncmVlay5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDFhODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19ncmVlay5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDFhODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfZ3JlZWsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19pY2VsYW5kLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2ljZWxhbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0YWRkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19pY2VsYW5kLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY19pY2VsYW5kIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL0FQUExFL0lDRUxBTkQuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nbWFjLWljZWxhbmQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceGM0JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHg4MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4ODIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4YzknICAgICAjICAweDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhkMScgICAgICMgIDB4ODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHg4NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHg4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUxJyAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUwJyAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUyJyAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDhBIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUzJyAgICAgIyAgMHg4QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU1JyAgICAgIyAgMHg4QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4OEYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4OTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZCcgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlYycgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZScgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMScgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMycgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmMicgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNScgICAgICMgIDB4OUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmYScgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhkZCcgICAgICMgIDB4QTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgdSdceGIwJyAgICAgIyAgMHhBMSAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhBNCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MjAyMicgICAjICAweEE1IC0+IEJVTExFVAorICAgIHUnXHhiNicgICAgICMgIDB4QTYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGRmJyAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyMTIyJyAgICMgIDB4QUEgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdceGI0JyAgICAgIyAgMHhBQiAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YTgnICAgICAjICAweEFDIC0+IERJQUVSRVNJUworICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdceGM2JyAgICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBRQorICAgIHUnXHhkOCcgICAgICMgIDB4QUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHUyMjFlJyAgICMgIDB4QjAgLT4gSU5GSU5JVFkKKyAgICB1J1x4YjEnICAgICAjICAweEIxIC0+IFBMVVMtTUlOVVMgU0lHTgorICAgIHUnXHUyMjY0JyAgICMgIDB4QjIgLT4gTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdcdTIyNjUnICAgIyAgMHhCMyAtPiBHUkVBVEVSLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x4YTUnICAgICAjICAweEI0IC0+IFlFTiBTSUdOCisgICAgdSdceGI1JyAgICAgIyAgMHhCNSAtPiBNSUNSTyBTSUdOCisgICAgdSdcdTIyMDInICAgIyAgMHhCNiAtPiBQQVJUSUFMIERJRkZFUkVOVElBTAorICAgIHUnXHUyMjExJyAgICMgIDB4QjcgLT4gTi1BUlkgU1VNTUFUSU9OCisgICAgdSdcdTIyMGYnICAgIyAgMHhCOCAtPiBOLUFSWSBQUk9EVUNUCisgICAgdSdcdTAzYzAnICAgIyAgMHhCOSAtPiBHUkVFSyBTTUFMTCBMRVRURVIgUEkKKyAgICB1J1x1MjIyYicgICAjICAweEJBIC0+IElOVEVHUkFMCisgICAgdSdceGFhJyAgICAgIyAgMHhCQiAtPiBGRU1JTklORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHhiYScgICAgICMgIDB4QkMgLT4gTUFTQ1VMSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdcdTAzYTknICAgIyAgMHhCRCAtPiBHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQQorICAgIHUnXHhlNicgICAgICMgIDB4QkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEFFCisgICAgdSdceGY4JyAgICAgIyAgMHhCRiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFNUUk9LRQorICAgIHUnXHhiZicgICAgICMgIDB4QzAgLT4gSU5WRVJURUQgUVVFU1RJT04gTUFSSworICAgIHUnXHhhMScgICAgICMgIDB4QzEgLT4gSU5WRVJURUQgRVhDTEFNQVRJT04gTUFSSworICAgIHUnXHhhYycgICAgICMgIDB4QzIgLT4gTk9UIFNJR04KKyAgICB1J1x1MjIxYScgICAjICAweEMzIC0+IFNRVUFSRSBST09UCisgICAgdSdcdTAxOTInICAgIyAgMHhDNCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRiBXSVRIIEhPT0sKKyAgICB1J1x1MjI0OCcgICAjICAweEM1IC0+IEFMTU9TVCBFUVVBTCBUTworICAgIHUnXHUyMjA2JyAgICMgIDB4QzYgLT4gSU5DUkVNRU5UCisgICAgdSdceGFiJyAgICAgIyAgMHhDNyAtPiBMRUZULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhiYicgICAgICMgIDB4QzggLT4gUklHSFQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMjYnICAgIyAgMHhDOSAtPiBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgdSdceGEwJyAgICAgIyAgMHhDQSAtPiBOTy1CUkVBSyBTUEFDRQorICAgIHUnXHhjMCcgICAgICMgIDB4Q0IgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGMzJyAgICAgIyAgMHhDQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZDUnICAgICAjICAweENEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHUwMTUyJyAgICMgIDB4Q0UgLT4gTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgIHUnXHUwMTUzJyAgICMgIDB4Q0YgLT4gTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICB1J1x1MjAxMycgICAjICAweEQwIC0+IEVOIERBU0gKKyAgICB1J1x1MjAxNCcgICAjICAweEQxIC0+IEVNIERBU0gKKyAgICB1J1x1MjAxYycgICAjICAweEQyIC0+IExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWQnICAgIyAgMHhEMyAtPiBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOCcgICAjICAweEQ0IC0+IExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMTknICAgIyAgMHhENSAtPiBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x4ZjcnICAgICAjICAweEQ2IC0+IERJVklTSU9OIFNJR04KKyAgICB1J1x1MjVjYScgICAjICAweEQ3IC0+IExPWkVOR0UKKyAgICB1J1x4ZmYnICAgICAjICAweEQ4IC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTAxNzgnICAgIyAgMHhEOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBZIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwNDQnICAgIyAgMHhEQSAtPiBGUkFDVElPTiBTTEFTSAorICAgIHUnXHUyMGFjJyAgICMgIDB4REIgLT4gRVVSTyBTSUdOCisgICAgdSdceGQwJyAgICAgIyAgMHhEQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFVEgKKyAgICB1J1x4ZjAnICAgICAjICAweEREIC0+IExBVElOIFNNQUxMIExFVFRFUiBFVEgKKyAgICB1J1x4ZGUnICAgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFRIT1JOCisgICAgdSdceGZlJyAgICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVEhPUk4KKyAgICB1J1x4ZmQnICAgICAjICAweEUwIC0+IExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICB1J1x4YjcnICAgICAjICAweEUxIC0+IE1JRERMRSBET1QKKyAgICB1J1x1MjAxYScgICAjICAweEUyIC0+IFNJTkdMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDFlJyAgICMgIDB4RTMgLT4gRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMzAnICAgIyAgMHhFNCAtPiBQRVIgTUlMTEUgU0lHTgorICAgIHUnXHhjMicgICAgICMgIDB4RTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2EnICAgICAjICAweEU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGMxJyAgICAgIyAgMHhFNyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4Y2InICAgICAjICAweEU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzgnICAgICAjICAweEU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhjZCcgICAgICMgIDB4RUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGNlJyAgICAgIyAgMHhFQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjZicgICAgICMgIDB4RUMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjYycgICAgICMgIDB4RUQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGQzJyAgICAgIyAgMHhFRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICB1J1x4ZDQnICAgICAjICAweEVGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdcdWY4ZmYnICAgIyAgMHhGMCAtPiBBcHBsZSBsb2dvCisgICAgdSdceGQyJyAgICAgIyAgMHhGMSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggR1JBVkUKKyAgICB1J1x4ZGEnICAgICAjICAweEYyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhkYicgICAgICMgIDB4RjMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZDknICAgICAjICAweEY0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHUwMTMxJyAgICMgIDB4RjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHUwMmM2JyAgICMgIDB4RjYgLT4gTU9ESUZJRVIgTEVUVEVSIENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdcdTAyZGMnICAgIyAgMHhGNyAtPiBTTUFMTCBUSUxERQorICAgIHUnXHhhZicgICAgICMgIDB4RjggLT4gTUFDUk9OCisgICAgdSdcdTAyZDgnICAgIyAgMHhGOSAtPiBCUkVWRQorICAgIHUnXHUwMmQ5JyAgICMgIDB4RkEgLT4gRE9UIEFCT1ZFCisgICAgdSdcdTAyZGEnICAgIyAgMHhGQiAtPiBSSU5HIEFCT1ZFCisgICAgdSdceGI4JyAgICAgIyAgMHhGQyAtPiBDRURJTExBCisgICAgdSdcdTAyZGQnICAgIyAgMHhGRCAtPiBET1VCTEUgQUNVVEUgQUNDRU5UCisgICAgdSdcdTAyZGInICAgIyAgMHhGRSAtPiBPR09ORUsKKyAgICB1J1x1MDJjNycgICAjICAweEZGIC0+IENBUk9OCispCisKKyMjIyBFbmNvZGluZyB0YWJsZQorZW5jb2RpbmdfdGFibGU9Y29kZWNzLmNoYXJtYXBfYnVpbGQoZGVjb2RpbmdfdGFibGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNDZkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19pY2VsYW5kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfaWNlbGFuZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNDZkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19pY2VsYW5kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfbGF0aW4yLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzIyYmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weQpAQCAtMCwwICsxLDE4MyBAQAorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBnZW5lcmF0ZWQgZnJvbSAnTEFUSU4yLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisoYykgQ29weXJpZ2h0IDIwMDAgR3VpZG8gdmFuIFJvc3N1bS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ19tYXApCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX21hcClbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtbGF0aW4yJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKK2RlY29kaW5nX21hcC51cGRhdGUoeworICAgICAgICAweDAwODA6IDB4MDBjNCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDA4MTogMHgwMTAwLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMDgyOiAweDAxMDEsICMgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMDgzOiAweDAwYzksICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDA4NDogMHgwMTA0LCAjIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICAgICAgMHgwMDg1OiAweDAwZDYsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwODY6IDB4MDBkYywgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDA4NzogMHgwMGUxLCAjIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMDg4OiAweDAxMDUsICMgTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBPR09ORUsKKyAgICAgICAgMHgwMDg5OiAweDAxMGMsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENBUk9OCisgICAgICAgIDB4MDA4YTogMHgwMGU0LCAjIExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgICAgIDB4MDA4YjogMHgwMTBkLCAjIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0FST04KKyAgICAgICAgMHgwMDhjOiAweDAxMDYsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIEFDVVRFCisgICAgICAgIDB4MDA4ZDogMHgwMTA3LCAjIExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMDhlOiAweDAwZTksICMgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgICAgICAweDAwOGY6IDB4MDE3OSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBaIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMDkwOiAweDAxN2EsICMgTEFUSU4gU01BTEwgTEVUVEVSIFogV0lUSCBBQ1VURQorICAgICAgICAweDAwOTE6IDB4MDEwZSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBEIFdJVEggQ0FST04KKyAgICAgICAgMHgwMDkyOiAweDAwZWQsICMgTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgICAgICAweDAwOTM6IDB4MDEwZiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgRCBXSVRIIENBUk9OCisgICAgICAgIDB4MDA5NDogMHgwMTEyLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMDk1OiAweDAxMTMsICMgTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMDk2OiAweDAxMTYsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERPVCBBQk9WRQorICAgICAgICAweDAwOTc6IDB4MDBmMywgIyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgICAgIDB4MDA5ODogMHgwMTE3LCAjIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRE9UIEFCT1ZFCisgICAgICAgIDB4MDA5OTogMHgwMGY0LCAjIExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgICAgICAweDAwOWE6IDB4MDBmNiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgICAgICAweDAwOWI6IDB4MDBmNSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgICAgIDB4MDA5YzogMHgwMGZhLCAjIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMDlkOiAweDAxMWEsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENBUk9OCisgICAgICAgIDB4MDA5ZTogMHgwMTFiLCAjIExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggQ0FST04KKyAgICAgICAgMHgwMDlmOiAweDAwZmMsICMgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICAgICAgMHgwMGEwOiAweDIwMjAsICMgREFHR0VSCisgICAgICAgIDB4MDBhMTogMHgwMGIwLCAjIERFR1JFRSBTSUdOCisgICAgICAgIDB4MDBhMjogMHgwMTE4LCAjIExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBPR09ORUsKKyAgICAgICAgMHgwMGE0OiAweDAwYTcsICMgU0VDVElPTiBTSUdOCisgICAgICAgIDB4MDBhNTogMHgyMDIyLCAjIEJVTExFVAorICAgICAgICAweDAwYTY6IDB4MDBiNiwgIyBQSUxDUk9XIFNJR04KKyAgICAgICAgMHgwMGE3OiAweDAwZGYsICMgTEFUSU4gU01BTEwgTEVUVEVSIFNIQVJQIFMKKyAgICAgICAgMHgwMGE4OiAweDAwYWUsICMgUkVHSVNURVJFRCBTSUdOCisgICAgICAgIDB4MDBhYTogMHgyMTIyLCAjIFRSQURFIE1BUksgU0lHTgorICAgICAgICAweDAwYWI6IDB4MDExOSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIE9HT05FSworICAgICAgICAweDAwYWM6IDB4MDBhOCwgIyBESUFFUkVTSVMKKyAgICAgICAgMHgwMGFkOiAweDIyNjAsICMgTk9UIEVRVUFMIFRPCisgICAgICAgIDB4MDBhZTogMHgwMTIzLCAjIExBVElOIFNNQUxMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwYWY6IDB4MDEyZSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgICAgIDB4MDBiMDogMHgwMTJmLCAjIExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggT0dPTkVLCisgICAgICAgIDB4MDBiMTogMHgwMTJhLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMGIyOiAweDIyNjQsICMgTEVTUy1USEFOIE9SIEVRVUFMIFRPCisgICAgICAgIDB4MDBiMzogMHgyMjY1LCAjIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgICAgICAweDAwYjQ6IDB4MDEyYiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgICAgICAweDAwYjU6IDB4MDEzNiwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBLIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwYjY6IDB4MjIwMiwgIyBQQVJUSUFMIERJRkZFUkVOVElBTAorICAgICAgICAweDAwYjc6IDB4MjIxMSwgIyBOLUFSWSBTVU1NQVRJT04KKyAgICAgICAgMHgwMGI4OiAweDAxNDIsICMgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMGI5OiAweDAxM2IsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIENFRElMTEEKKyAgICAgICAgMHgwMGJhOiAweDAxM2MsICMgTEFUSU4gU01BTEwgTEVUVEVSIEwgV0lUSCBDRURJTExBCisgICAgICAgIDB4MDBiYjogMHgwMTNkLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBDQVJPTgorICAgICAgICAweDAwYmM6IDB4MDEzZSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIENBUk9OCisgICAgICAgIDB4MDBiZDogMHgwMTM5LCAjIExBVElOIENBUElUQUwgTEVUVEVSIEwgV0lUSCBBQ1VURQorICAgICAgICAweDAwYmU6IDB4MDEzYSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgTCBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBiZjogMHgwMTQ1LCAjIExBVElOIENBUElUQUwgTEVUVEVSIE4gV0lUSCBDRURJTExBCisgICAgICAgIDB4MDBjMDogMHgwMTQ2LCAjIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwYzE6IDB4MDE0MywgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGMyOiAweDAwYWMsICMgTk9UIFNJR04KKyAgICAgICAgMHgwMGMzOiAweDIyMWEsICMgU1FVQVJFIFJPT1QKKyAgICAgICAgMHgwMGM0OiAweDAxNDQsICMgTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBBQ1VURQorICAgICAgICAweDAwYzU6IDB4MDE0NywgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGM2OiAweDIyMDYsICMgSU5DUkVNRU5UCisgICAgICAgIDB4MDBjNzogMHgwMGFiLCAjIExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDBjODogMHgwMGJiLCAjIFJJR0hULVBPSU5USU5HIERPVUJMRSBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwYzk6IDB4MjAyNiwgIyBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgICAgIDB4MDBjYTogMHgwMGEwLCAjIE5PLUJSRUFLIFNQQUNFCisgICAgICAgIDB4MDBjYjogMHgwMTQ4LCAjIExBVElOIFNNQUxMIExFVFRFUiBOIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGNjOiAweDAxNTAsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIERPVUJMRSBBQ1VURQorICAgICAgICAweDAwY2Q6IDB4MDBkNSwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggVElMREUKKyAgICAgICAgMHgwMGNlOiAweDAxNTEsICMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBET1VCTEUgQUNVVEUKKyAgICAgICAgMHgwMGNmOiAweDAxNGMsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIE1BQ1JPTgorICAgICAgICAweDAwZDA6IDB4MjAxMywgIyBFTiBEQVNICisgICAgICAgIDB4MDBkMTogMHgyMDE0LCAjIEVNIERBU0gKKyAgICAgICAgMHgwMGQyOiAweDIwMWMsICMgTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMGQzOiAweDIwMWQsICMgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDBkNDogMHgyMDE4LCAjIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDBkNTogMHgyMDE5LCAjIFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZDY6IDB4MDBmNywgIyBESVZJU0lPTiBTSUdOCisgICAgICAgIDB4MDBkNzogMHgyNWNhLCAjIExPWkVOR0UKKyAgICAgICAgMHgwMGQ4OiAweDAxNGQsICMgTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBNQUNST04KKyAgICAgICAgMHgwMGQ5OiAweDAxNTQsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBkYTogMHgwMTU1LCAjIExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGRiOiAweDAxNTgsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgICAgIDB4MDBkYzogMHgyMDM5LCAjIFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDBkZDogMHgyMDNhLCAjIFNJTkdMRSBSSUdIVC1QT0lOVElORyBBTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZGU6IDB4MDE1OSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgUiBXSVRIIENBUk9OCisgICAgICAgIDB4MDBkZjogMHgwMTU2LCAjIExBVElOIENBUElUQUwgTEVUVEVSIFIgV0lUSCBDRURJTExBCisgICAgICAgIDB4MDBlMDogMHgwMTU3LCAjIExBVElOIFNNQUxMIExFVFRFUiBSIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwZTE6IDB4MDE2MCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGUyOiAweDIwMWEsICMgU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDBlMzogMHgyMDFlLCAjIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwZTQ6IDB4MDE2MSwgIyBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIENBUk9OCisgICAgICAgIDB4MDBlNTogMHgwMTVhLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBBQ1VURQorICAgICAgICAweDAwZTY6IDB4MDE1YiwgIyBMQVRJTiBTTUFMTCBMRVRURVIgUyBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBlNzogMHgwMGMxLCAjIExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgICAgICAweDAwZTg6IDB4MDE2NCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBUIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGU5OiAweDAxNjUsICMgTEFUSU4gU01BTEwgTEVUVEVSIFQgV0lUSCBDQVJPTgorICAgICAgICAweDAwZWE6IDB4MDBjZCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGViOiAweDAxN2QsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWiBXSVRIIENBUk9OCisgICAgICAgIDB4MDBlYzogMHgwMTdlLCAjIExBVElOIFNNQUxMIExFVFRFUiBaIFdJVEggQ0FST04KKyAgICAgICAgMHgwMGVkOiAweDAxNmEsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgICAgICAweDAwZWU6IDB4MDBkMywgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGVmOiAweDAwZDQsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICAgICAgMHgwMGYwOiAweDAxNmIsICMgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMGYxOiAweDAxNmUsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIFJJTkcgQUJPVkUKKyAgICAgICAgMHgwMGYyOiAweDAwZGEsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBmMzogMHgwMTZmLCAjIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggUklORyBBQk9WRQorICAgICAgICAweDAwZjQ6IDB4MDE3MCwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisgICAgICAgIDB4MDBmNTogMHgwMTcxLCAjIExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRE9VQkxFIEFDVVRFCisgICAgICAgIDB4MDBmNjogMHgwMTcyLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICAgICAgMHgwMGY3OiAweDAxNzMsICMgTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBPR09ORUsKKyAgICAgICAgMHgwMGY4OiAweDAwZGQsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIEFDVVRFCisgICAgICAgIDB4MDBmOTogMHgwMGZkLCAjIExBVElOIFNNQUxMIExFVFRFUiBZIFdJVEggQUNVVEUKKyAgICAgICAgMHgwMGZhOiAweDAxMzcsICMgTEFUSU4gU01BTEwgTEVUVEVSIEsgV0lUSCBDRURJTExBCisgICAgICAgIDB4MDBmYjogMHgwMTdiLCAjIExBVElOIENBUElUQUwgTEVUVEVSIFogV0lUSCBET1QgQUJPVkUKKyAgICAgICAgMHgwMGZjOiAweDAxNDEsICMgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTCBXSVRIIFNUUk9LRQorICAgICAgICAweDAwZmQ6IDB4MDE3YywgIyBMQVRJTiBTTUFMTCBMRVRURVIgWiBXSVRIIERPVCBBQk9WRQorICAgICAgICAweDAwZmU6IDB4MDEyMiwgIyBMQVRJTiBDQVBJVEFMIExFVFRFUiBHIFdJVEggQ0VESUxMQQorICAgICAgICAweDAwZmY6IDB4MDJjNywgIyBDQVJPTgorfSkKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9lbmNvZGluZ19tYXAoZGVjb2RpbmdfbWFwKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfbGF0aW4yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQxYTFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfbGF0aW4yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQxYTFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX2xhdGluMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNjA1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW4ucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgbWFjX3JvbWFuIGdlbmVyYXRlZCBmcm9tICdNQVBQSU5HUy9WRU5ET1JTL0FQUExFL1JPTUFOLlRYVCcgd2l0aCBnZW5jb2RlYy5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX3RhYmxlKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX3RhYmxlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX3RhYmxlKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J21hYy1yb21hbicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4YzQnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDgxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM3JyAgICAgIyAgMHg4MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOScgICAgICMgIDB4ODMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGQxJyAgICAgIyAgMHg4NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweDg1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDg2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTEnICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTAnICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTInICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4OEEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTMnICAgICAjICAweDhCIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTUnICAgICAjICAweDhDIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4OEQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU5JyAgICAgIyAgMHg4RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU4JyAgICAgIyAgMHg4RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVhJyAgICAgIyAgMHg5MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVkJyAgICAgIyAgMHg5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVjJyAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVlJyAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYxJyAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYzJyAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGYyJyAgICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGY0JyAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDlBIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY1JyAgICAgIyAgMHg5QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGZhJyAgICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGY5JyAgICAgIyAgMHg5RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweDlGIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHhBMCAtPiBEQUdHRVIKKyAgICB1J1x4YjAnICAgICAjICAweEExIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEE0IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUyMDIyJyAgICMgIDB4QTUgLT4gQlVMTEVUCisgICAgdSdceGI2JyAgICAgIyAgMHhBNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4ZGYnICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGFlJyAgICAgIyAgMHhBOCAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTIxMjInICAgIyAgMHhBQSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x4YjQnICAgICAjICAweEFCIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhhOCcgICAgICMgIDB4QUMgLT4gRElBRVJFU0lTCisgICAgdSdcdTIyNjAnICAgIyAgMHhBRCAtPiBOT1QgRVFVQUwgVE8KKyAgICB1J1x4YzYnICAgICAjICAweEFFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGQ4JyAgICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdcdTIyMWUnICAgIyAgMHhCMCAtPiBJTkZJTklUWQorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjQnICAgIyAgMHhCMiAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NScgICAjICAweEIzIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHhhNScgICAgICMgIDB4QjQgLT4gWUVOIFNJR04KKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MjIwMicgICAjICAweEI2IC0+IFBBUlRJQUwgRElGRkVSRU5USUFMCisgICAgdSdcdTIyMTEnICAgIyAgMHhCNyAtPiBOLUFSWSBTVU1NQVRJT04KKyAgICB1J1x1MjIwZicgICAjICAweEI4IC0+IE4tQVJZIFBST0RVQ1QKKyAgICB1J1x1MDNjMCcgICAjICAweEI5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUyMjJiJyAgICMgIDB4QkEgLT4gSU5URUdSQUwKKyAgICB1J1x4YWEnICAgICAjICAweEJCIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHhCQyAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x1MDNhOScgICAjICAweEJEIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdceGU2JyAgICAgIyAgMHhCRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZjgnICAgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGJmJyAgICAgIyAgMHhDMCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGExJyAgICAgIyAgMHhDMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhDMiAtPiBOT1QgU0lHTgorICAgIHUnXHUyMjFhJyAgICMgIDB4QzMgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MDE5MicgICAjICAweEM0IC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMjQ4JyAgICMgIDB4QzUgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdcdTIyMDYnICAgIyAgMHhDNiAtPiBJTkNSRU1FTlQKKyAgICB1J1x4YWInICAgICAjICAweEM3IC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHhDOCAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweEM5IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x4YTAnICAgICAjICAweENBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGMwJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzMnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhkNScgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdcdTAxNTInICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxNTMnICAgIyAgMHhDRiAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHUyMDEzJyAgICMgIDB4RDAgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4RDEgLT4gRU0gREFTSAorICAgIHUnXHUyMDFjJyAgICMgIDB4RDIgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweEQzIC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE4JyAgICMgIDB4RDQgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweEQ1IC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhmNycgICAgICMgIDB4RDYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyNWNhJyAgICMgIDB4RDcgLT4gTE9aRU5HRQorICAgIHUnXHhmZicgICAgICMgIDB4RDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3OCcgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MjA0NCcgICAjICAweERBIC0+IEZSQUNUSU9OIFNMQVNICisgICAgdSdcdTIwYWMnICAgIyAgMHhEQiAtPiBFVVJPIFNJR04KKyAgICB1J1x1MjAzOScgICAjICAweERDIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwM2EnICAgIyAgMHhERCAtPiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1ZmIwMScgICAjICAweERFIC0+IExBVElOIFNNQUxMIExJR0FUVVJFIEZJCisgICAgdSdcdWZiMDInICAgIyAgMHhERiAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBGTAorICAgIHUnXHUyMDIxJyAgICMgIDB4RTAgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHhiNycgICAgICMgIDB4RTEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMDFhJyAgICMgIDB4RTIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWUnICAgIyAgMHhFMyAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAzMCcgICAjICAweEU0IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdceGMyJyAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYScgICAgICMgIDB4RTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzEnICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjYicgICAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1ZjhmZicgICAjICAweEYwIC0+IEFwcGxlIGxvZ28KKyAgICB1J1x4ZDInICAgICAjICAweEYxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4RjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdTAxMzEnICAgIyAgMHhGNSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRE9UTEVTUyBJCisgICAgdSdcdTAyYzYnICAgIyAgMHhGNiAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MDJkYycgICAjICAweEY3IC0+IFNNQUxMIFRJTERFCisgICAgdSdceGFmJyAgICAgIyAgMHhGOCAtPiBNQUNST04KKyAgICB1J1x1MDJkOCcgICAjICAweEY5IC0+IEJSRVZFCisgICAgdSdcdTAyZDknICAgIyAgMHhGQSAtPiBET1QgQUJPVkUKKyAgICB1J1x1MDJkYScgICAjICAweEZCIC0+IFJJTkcgQUJPVkUKKyAgICB1J1x4YjgnICAgICAjICAweEZDIC0+IENFRElMTEEKKyAgICB1J1x1MDJkZCcgICAjICAweEZEIC0+IERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICB1J1x1MDJkYicgICAjICAweEZFIC0+IE9HT05FSworICAgIHUnXHUwMmM3JyAgICMgIDB4RkYgLT4gQ0FST04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbi5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OTg3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbi5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OTg3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfcm9tYW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmQ1YWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuaWFuLnB5CkBAIC0wLDAgKzEsMzA3IEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIG1hY19yb21hbmlhbiBnZW5lcmF0ZWQgZnJvbSAnTUFQUElOR1MvVkVORE9SUy9BUFBMRS9ST01BTklBTi5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtcm9tYW5pYW4nLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKworIyMjIERlY29kaW5nIFRhYmxlCisKK2RlY29kaW5nX3RhYmxlID0gKAorICAgIHUnXHgwMCcgICAgICMgIDB4MDAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDEnICAgICAjICAweDAxIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMycgICAgICMgIDB4MDMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDQnICAgICAjICAweDA0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA1JyAgICAgIyAgMHgwNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA4JyAgICAgIyAgMHgwOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xuJyAgICAgICAjICAweDBBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBiJyAgICAgIyAgMHgwQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwYycgICAgICMgIDB4MEMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1xyJyAgICAgICAjICAweDBEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwZicgICAgICMgIDB4MEYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTAnICAgICAjICAweDEwIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMicgICAgICMgIDB4MTIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTMnICAgICAjICAweDEzIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE0JyAgICAgIyAgMHgxNCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNScgICAgICMgIDB4MTUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTYnICAgICAjICAweDE2IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOCcgICAgICMgIDB4MTggLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFhJyAgICAgIyAgMHgxQSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYicgICAgICMgIDB4MUIgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWMnICAgICAjICAweDFDIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFkJyAgICAgIyAgMHgxRCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWYnICAgICAjICAweDFGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdScgJyAgICAgICAgIyAgMHgyMCAtPiBTUEFDRQorICAgIHUnIScgICAgICAgICMgIDB4MjEgLT4gRVhDTEFNQVRJT04gTUFSSworICAgIHUnIicgICAgICAgICMgIDB4MjIgLT4gUVVPVEFUSU9OIE1BUksKKyAgICB1JyMnICAgICAgICAjICAweDIzIC0+IE5VTUJFUiBTSUdOCisgICAgdSckJyAgICAgICAgIyAgMHgyNCAtPiBET0xMQVIgU0lHTgorICAgIHUnJScgICAgICAgICMgIDB4MjUgLT4gUEVSQ0VOVCBTSUdOCisgICAgdScmJyAgICAgICAgIyAgMHgyNiAtPiBBTVBFUlNBTkQKKyAgICB1IiciICAgICAgICAjICAweDI3IC0+IEFQT1NUUk9QSEUKKyAgICB1JygnICAgICAgICAjICAweDI4IC0+IExFRlQgUEFSRU5USEVTSVMKKyAgICB1JyknICAgICAgICAjICAweDI5IC0+IFJJR0hUIFBBUkVOVEhFU0lTCisgICAgdScqJyAgICAgICAgIyAgMHgyQSAtPiBBU1RFUklTSworICAgIHUnKycgICAgICAgICMgIDB4MkIgLT4gUExVUyBTSUdOCisgICAgdScsJyAgICAgICAgIyAgMHgyQyAtPiBDT01NQQorICAgIHUnLScgICAgICAgICMgIDB4MkQgLT4gSFlQSEVOLU1JTlVTCisgICAgdScuJyAgICAgICAgIyAgMHgyRSAtPiBGVUxMIFNUT1AKKyAgICB1Jy8nICAgICAgICAjICAweDJGIC0+IFNPTElEVVMKKyAgICB1JzAnICAgICAgICAjICAweDMwIC0+IERJR0lUIFpFUk8KKyAgICB1JzEnICAgICAgICAjICAweDMxIC0+IERJR0lUIE9ORQorICAgIHUnMicgICAgICAgICMgIDB4MzIgLT4gRElHSVQgVFdPCisgICAgdSczJyAgICAgICAgIyAgMHgzMyAtPiBESUdJVCBUSFJFRQorICAgIHUnNCcgICAgICAgICMgIDB4MzQgLT4gRElHSVQgRk9VUgorICAgIHUnNScgICAgICAgICMgIDB4MzUgLT4gRElHSVQgRklWRQorICAgIHUnNicgICAgICAgICMgIDB4MzYgLT4gRElHSVQgU0lYCisgICAgdSc3JyAgICAgICAgIyAgMHgzNyAtPiBESUdJVCBTRVZFTgorICAgIHUnOCcgICAgICAgICMgIDB4MzggLT4gRElHSVQgRUlHSFQKKyAgICB1JzknICAgICAgICAjICAweDM5IC0+IERJR0lUIE5JTkUKKyAgICB1JzonICAgICAgICAjICAweDNBIC0+IENPTE9OCisgICAgdSc7JyAgICAgICAgIyAgMHgzQiAtPiBTRU1JQ09MT04KKyAgICB1JzwnICAgICAgICAjICAweDNDIC0+IExFU1MtVEhBTiBTSUdOCisgICAgdSc9JyAgICAgICAgIyAgMHgzRCAtPiBFUVVBTFMgU0lHTgorICAgIHUnPicgICAgICAgICMgIDB4M0UgLT4gR1JFQVRFUi1USEFOIFNJR04KKyAgICB1Jz8nICAgICAgICAjICAweDNGIC0+IFFVRVNUSU9OIE1BUksKKyAgICB1J0AnICAgICAgICAjICAweDQwIC0+IENPTU1FUkNJQUwgQVQKKyAgICB1J0EnICAgICAgICAjICAweDQxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEKKyAgICB1J0InICAgICAgICAjICAweDQyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEIKKyAgICB1J0MnICAgICAgICAjICAweDQzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEMKKyAgICB1J0QnICAgICAgICAjICAweDQ0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEQKKyAgICB1J0UnICAgICAgICAjICAweDQ1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUKKyAgICB1J0YnICAgICAgICAjICAweDQ2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEYKKyAgICB1J0cnICAgICAgICAjICAweDQ3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcKKyAgICB1J0gnICAgICAgICAjICAweDQ4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEgKKyAgICB1J0knICAgICAgICAjICAweDQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkKKyAgICB1J0onICAgICAgICAjICAweDRBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEoKKyAgICB1J0snICAgICAgICAjICAweDRCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEsKKyAgICB1J0wnICAgICAgICAjICAweDRDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEwKKyAgICB1J00nICAgICAgICAjICAweDREIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE0KKyAgICB1J04nICAgICAgICAjICAweDRFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE4KKyAgICB1J08nICAgICAgICAjICAweDRGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8KKyAgICB1J1AnICAgICAgICAjICAweDUwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFAKKyAgICB1J1EnICAgICAgICAjICAweDUxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFEKKyAgICB1J1InICAgICAgICAjICAweDUyIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFIKKyAgICB1J1MnICAgICAgICAjICAweDUzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMKKyAgICB1J1QnICAgICAgICAjICAweDU0IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQKKyAgICB1J1UnICAgICAgICAjICAweDU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUKKyAgICB1J1YnICAgICAgICAjICAweDU2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFYKKyAgICB1J1cnICAgICAgICAjICAweDU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFcKKyAgICB1J1gnICAgICAgICAjICAweDU4IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFgKKyAgICB1J1knICAgICAgICAjICAweDU5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkKKyAgICB1J1onICAgICAgICAjICAweDVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFoKKyAgICB1J1snICAgICAgICAjICAweDVCIC0+IExFRlQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J1xcJyAgICAgICAjICAweDVDIC0+IFJFVkVSU0UgU09MSURVUworICAgIHUnXScgICAgICAgICMgIDB4NUQgLT4gUklHSFQgU1FVQVJFIEJSQUNLRVQKKyAgICB1J14nICAgICAgICAjICAweDVFIC0+IENJUkNVTUZMRVggQUNDRU5UCisgICAgdSdfJyAgICAgICAgIyAgMHg1RiAtPiBMT1cgTElORQorICAgIHUnYCcgICAgICAgICMgIDB4NjAgLT4gR1JBVkUgQUNDRU5UCisgICAgdSdhJyAgICAgICAgIyAgMHg2MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQQorICAgIHUnYicgICAgICAgICMgIDB4NjIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEIKKyAgICB1J2MnICAgICAgICAjICAweDYzIC0+IExBVElOIFNNQUxMIExFVFRFUiBDCisgICAgdSdkJyAgICAgICAgIyAgMHg2NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRAorICAgIHUnZScgICAgICAgICMgIDB4NjUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUKKyAgICB1J2YnICAgICAgICAjICAweDY2IC0+IExBVElOIFNNQUxMIExFVFRFUiBGCisgICAgdSdnJyAgICAgICAgIyAgMHg2NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRworICAgIHUnaCcgICAgICAgICMgIDB4NjggLT4gTEFUSU4gU01BTEwgTEVUVEVSIEgKKyAgICB1J2knICAgICAgICAjICAweDY5IC0+IExBVElOIFNNQUxMIExFVFRFUiBJCisgICAgdSdqJyAgICAgICAgIyAgMHg2QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSgorICAgIHUnaycgICAgICAgICMgIDB4NkIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEsKKyAgICB1J2wnICAgICAgICAjICAweDZDIC0+IExBVElOIFNNQUxMIExFVFRFUiBMCisgICAgdSdtJyAgICAgICAgIyAgMHg2RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTQorICAgIHUnbicgICAgICAgICMgIDB4NkUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4KKyAgICB1J28nICAgICAgICAjICAweDZGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPCisgICAgdSdwJyAgICAgICAgIyAgMHg3MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUAorICAgIHUncScgICAgICAgICMgIDB4NzEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFEKKyAgICB1J3InICAgICAgICAjICAweDcyIC0+IExBVElOIFNNQUxMIExFVFRFUiBSCisgICAgdSdzJyAgICAgICAgIyAgMHg3MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUworICAgIHUndCcgICAgICAgICMgIDB4NzQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFQKKyAgICB1J3UnICAgICAgICAjICAweDc1IC0+IExBVElOIFNNQUxMIExFVFRFUiBVCisgICAgdSd2JyAgICAgICAgIyAgMHg3NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVgorICAgIHUndycgICAgICAgICMgIDB4NzcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFcKKyAgICB1J3gnICAgICAgICAjICAweDc4IC0+IExBVElOIFNNQUxMIExFVFRFUiBYCisgICAgdSd5JyAgICAgICAgIyAgMHg3OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWQorICAgIHUneicgICAgICAgICMgIDB4N0EgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFoKKyAgICB1J3snICAgICAgICAjICAweDdCIC0+IExFRlQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnfCcgICAgICAgICMgIDB4N0MgLT4gVkVSVElDQUwgTElORQorICAgIHUnfScgICAgICAgICMgIDB4N0QgLT4gUklHSFQgQ1VSTFkgQlJBQ0tFVAorICAgIHUnficgICAgICAgICMgIDB4N0UgLT4gVElMREUKKyAgICB1J1x4N2YnICAgICAjICAweDdGIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceGM0JyAgICAgIyAgMHg4MCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM1JyAgICAgIyAgMHg4MSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhjNycgICAgICMgIDB4ODIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQyBXSVRIIENFRElMTEEKKyAgICB1J1x4YzknICAgICAjICAweDgzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhkMScgICAgICMgIDB4ODQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGQ2JyAgICAgIyAgMHg4NSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGRjJyAgICAgIyAgMHg4NiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUxJyAgICAgIyAgMHg4NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGUwJyAgICAgIyAgMHg4OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIEdSQVZFCisgICAgdSdceGUyJyAgICAgIyAgMHg4OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZTQnICAgICAjICAweDhBIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggRElBRVJFU0lTCisgICAgdSdceGUzJyAgICAgIyAgMHg4QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFRJTERFCisgICAgdSdceGU1JyAgICAgIyAgMHg4QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQSBXSVRIIFJJTkcgQUJPVkUKKyAgICB1J1x4ZTcnICAgICAjICAweDhEIC0+IExBVElOIFNNQUxMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhlOScgICAgICMgIDB4OEUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBBQ1VURQorICAgIHUnXHhlOCcgICAgICMgIDB4OEYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBHUkFWRQorICAgIHUnXHhlYScgICAgICMgIDB4OTAgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGViJyAgICAgIyAgMHg5MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhlZCcgICAgICMgIDB4OTIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhlYycgICAgICMgIDB4OTMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhlZScgICAgICMgIDB4OTQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGVmJyAgICAgIyAgMHg5NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmMScgICAgICMgIDB4OTYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE4gV0lUSCBUSUxERQorICAgIHUnXHhmMycgICAgICMgIDB4OTcgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhmMicgICAgICMgIDB4OTggLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhmNCcgICAgICMgIDB4OTkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGY2JyAgICAgIyAgMHg5QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIERJQUVSRVNJUworICAgIHUnXHhmNScgICAgICMgIDB4OUIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBUSUxERQorICAgIHUnXHhmYScgICAgICMgIDB4OUMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBBQ1VURQorICAgIHUnXHhmOScgICAgICMgIDB4OUQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBHUkFWRQorICAgIHUnXHhmYicgICAgICMgIDB4OUUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGZjJyAgICAgIyAgMHg5RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIERJQUVSRVNJUworICAgIHUnXHUyMDIwJyAgICMgIDB4QTAgLT4gREFHR0VSCisgICAgdSdceGIwJyAgICAgIyAgMHhBMSAtPiBERUdSRUUgU0lHTgorICAgIHUnXHhhMicgICAgICMgIDB4QTIgLT4gQ0VOVCBTSUdOCisgICAgdSdceGEzJyAgICAgIyAgMHhBMyAtPiBQT1VORCBTSUdOCisgICAgdSdceGE3JyAgICAgIyAgMHhBNCAtPiBTRUNUSU9OIFNJR04KKyAgICB1J1x1MjAyMicgICAjICAweEE1IC0+IEJVTExFVAorICAgIHUnXHhiNicgICAgICMgIDB4QTYgLT4gUElMQ1JPVyBTSUdOCisgICAgdSdceGRmJyAgICAgIyAgMHhBNyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgU0hBUlAgUworICAgIHUnXHhhZScgICAgICMgIDB4QTggLT4gUkVHSVNURVJFRCBTSUdOCisgICAgdSdceGE5JyAgICAgIyAgMHhBOSAtPiBDT1BZUklHSFQgU0lHTgorICAgIHUnXHUyMTIyJyAgICMgIDB4QUEgLT4gVFJBREUgTUFSSyBTSUdOCisgICAgdSdceGI0JyAgICAgIyAgMHhBQiAtPiBBQ1VURSBBQ0NFTlQKKyAgICB1J1x4YTgnICAgICAjICAweEFDIC0+IERJQUVSRVNJUworICAgIHUnXHUyMjYwJyAgICMgIDB4QUQgLT4gTk9UIEVRVUFMIFRPCisgICAgdSdcdTAxMDInICAgIyAgMHhBRSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x1MDIxOCcgICAjICAweEFGIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFMgV0lUSCBDT01NQSBCRUxPVyAjIGZvciBVbmljb2RlIDMuMCBhbmQgbGF0ZXIKKyAgICB1J1x1MjIxZScgICAjICAweEIwIC0+IElORklOSVRZCisgICAgdSdceGIxJyAgICAgIyAgMHhCMSAtPiBQTFVTLU1JTlVTIFNJR04KKyAgICB1J1x1MjI2NCcgICAjICAweEIyIC0+IExFU1MtVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHUyMjY1JyAgICMgIDB4QjMgLT4gR1JFQVRFUi1USEFOIE9SIEVRVUFMIFRPCisgICAgdSdceGE1JyAgICAgIyAgMHhCNCAtPiBZRU4gU0lHTgorICAgIHUnXHhiNScgICAgICMgIDB4QjUgLT4gTUlDUk8gU0lHTgorICAgIHUnXHUyMjAyJyAgICMgIDB4QjYgLT4gUEFSVElBTCBESUZGRVJFTlRJQUwKKyAgICB1J1x1MjIxMScgICAjICAweEI3IC0+IE4tQVJZIFNVTU1BVElPTgorICAgIHUnXHUyMjBmJyAgICMgIDB4QjggLT4gTi1BUlkgUFJPRFVDVAorICAgIHUnXHUwM2MwJyAgICMgIDB4QjkgLT4gR1JFRUsgU01BTEwgTEVUVEVSIFBJCisgICAgdSdcdTIyMmInICAgIyAgMHhCQSAtPiBJTlRFR1JBTAorICAgIHUnXHhhYScgICAgICMgIDB4QkIgLT4gRkVNSU5JTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x4YmEnICAgICAjICAweEJDIC0+IE1BU0NVTElORSBPUkRJTkFMIElORElDQVRPUgorICAgIHUnXHUwM2E5JyAgICMgIDB4QkQgLT4gR1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0EKKyAgICB1J1x1MDEwMycgICAjICAweEJFIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQlJFVkUKKyAgICB1J1x1MDIxOScgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ09NTUEgQkVMT1cgIyBmb3IgVW5pY29kZSAzLjAgYW5kIGxhdGVyCisgICAgdSdceGJmJyAgICAgIyAgMHhDMCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGExJyAgICAgIyAgMHhDMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhDMiAtPiBOT1QgU0lHTgorICAgIHUnXHUyMjFhJyAgICMgIDB4QzMgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MDE5MicgICAjICAweEM0IC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMjQ4JyAgICMgIDB4QzUgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdcdTIyMDYnICAgIyAgMHhDNiAtPiBJTkNSRU1FTlQKKyAgICB1J1x4YWInICAgICAjICAweEM3IC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHhDOCAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweEM5IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x4YTAnICAgICAjICAweENBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGMwJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzMnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhkNScgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdcdTAxNTInICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxNTMnICAgIyAgMHhDRiAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHUyMDEzJyAgICMgIDB4RDAgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4RDEgLT4gRU0gREFTSAorICAgIHUnXHUyMDFjJyAgICMgIDB4RDIgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweEQzIC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE4JyAgICMgIDB4RDQgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweEQ1IC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhmNycgICAgICMgIDB4RDYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyNWNhJyAgICMgIDB4RDcgLT4gTE9aRU5HRQorICAgIHUnXHhmZicgICAgICMgIDB4RDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3OCcgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MjA0NCcgICAjICAweERBIC0+IEZSQUNUSU9OIFNMQVNICisgICAgdSdcdTIwYWMnICAgIyAgMHhEQiAtPiBFVVJPIFNJR04KKyAgICB1J1x1MjAzOScgICAjICAweERDIC0+IFNJTkdMRSBMRUZULVBPSU5USU5HIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwM2EnICAgIyAgMHhERCAtPiBTSU5HTEUgUklHSFQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MDIxYScgICAjICAweERFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFQgV0lUSCBDT01NQSBCRUxPVyAjIGZvciBVbmljb2RlIDMuMCBhbmQgbGF0ZXIKKyAgICB1J1x1MDIxYicgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBUIFdJVEggQ09NTUEgQkVMT1cgIyBmb3IgVW5pY29kZSAzLjAgYW5kIGxhdGVyCisgICAgdSdcdTIwMjEnICAgIyAgMHhFMCAtPiBET1VCTEUgREFHR0VSCisgICAgdSdceGI3JyAgICAgIyAgMHhFMSAtPiBNSURETEUgRE9UCisgICAgdSdcdTIwMWEnICAgIyAgMHhFMiAtPiBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZScgICAjICAweEUzIC0+IERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDMwJyAgICMgIDB4RTQgLT4gUEVSIE1JTExFIFNJR04KKyAgICB1J1x4YzInICAgICAjICAweEU1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNhJyAgICAgIyAgMHhFNiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjMScgICAgICMgIDB4RTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQSBXSVRIIEFDVVRFCisgICAgdSdceGNiJyAgICAgIyAgMHhFOCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGM4JyAgICAgIyAgMHhFOSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBFIFdJVEggR1JBVkUKKyAgICB1J1x4Y2QnICAgICAjICAweEVBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBBQ1VURQorICAgIHUnXHhjZScgICAgICMgIDB4RUIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4Y2YnICAgICAjICAweEVDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4Y2MnICAgICAjICAweEVEIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBHUkFWRQorICAgIHUnXHhkMycgICAgICMgIDB4RUUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGQ0JyAgICAgIyAgMHhFRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHVmOGZmJyAgICMgIDB4RjAgLT4gQXBwbGUgbG9nbworICAgIHUnXHhkMicgICAgICMgIDB4RjEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGRhJyAgICAgIyAgMHhGMiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQUNVVEUKKyAgICB1J1x4ZGInICAgICAjICAweEYzIC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGQ5JyAgICAgIyAgMHhGNCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggR1JBVkUKKyAgICB1J1x1MDEzMScgICAjICAweEY1IC0+IExBVElOIFNNQUxMIExFVFRFUiBET1RMRVNTIEkKKyAgICB1J1x1MDJjNicgICAjICAweEY2IC0+IE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgIHUnXHUwMmRjJyAgICMgIDB4RjcgLT4gU01BTEwgVElMREUKKyAgICB1J1x4YWYnICAgICAjICAweEY4IC0+IE1BQ1JPTgorICAgIHUnXHUwMmQ4JyAgICMgIDB4RjkgLT4gQlJFVkUKKyAgICB1J1x1MDJkOScgICAjICAweEZBIC0+IERPVCBBQk9WRQorICAgIHUnXHUwMmRhJyAgICMgIDB4RkIgLT4gUklORyBBQk9WRQorICAgIHUnXHhiOCcgICAgICMgIDB4RkMgLT4gQ0VESUxMQQorICAgIHUnXHUwMmRkJyAgICMgIDB4RkQgLT4gRE9VQkxFIEFDVVRFIEFDQ0VOVAorICAgIHUnXHUwMmRiJyAgICMgIDB4RkUgLT4gT0dPTkVLCisgICAgdSdcdTAyYzcnICAgIyAgMHhGRiAtPiBDQVJPTgorKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuaWFuLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3NzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3JvbWFuaWFuLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3NzI5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY19yb21hbmlhbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3R1cmtpc2gucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYWNfdHVya2lzaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzg3ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3R1cmtpc2gucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgbWFjX3R1cmtpc2ggZ2VuZXJhdGVkIGZyb20gJ01BUFBJTkdTL1ZFTkRPUlMvQVBQTEUvVFVSS0lTSC5UWFQnIHdpdGggZ2VuY29kZWMucHkuCisKKyIiIiMiCisKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ190YWJsZSkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ190YWJsZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ190YWJsZSlbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYWMtdHVya2lzaCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwMScgICAgICMgIDB4MDEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDInICAgICAjICAweDAyIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDUnICAgICAjICAweDA1IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDA2JyAgICAgIyAgMHgwNiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgwNycgICAgICMgIDB4MDcgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdcdCcgICAgICAgIyAgMHgwOSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXG4nICAgICAgICMgIDB4MEEgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBjJyAgICAgIyAgMHgwQyAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MGUnICAgICAjICAweDBFIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDBmJyAgICAgIyAgMHgwRiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMCcgICAgICMgIDB4MTAgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTEnICAgICAjICAweDExIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDEyJyAgICAgIyAgMHgxMiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE1JyAgICAgIyAgMHgxNSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxNicgICAgICMgIDB4MTYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MTcnICAgICAjICAweDE3IC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxOScgICAgICMgIDB4MTkgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFiJyAgICAgIyAgMHgxQiAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IENPTlRST0wgQ0hBUkFDVEVSCisgICAgdSdceDFlJyAgICAgIyAgMHgxRSAtPiBDT05UUk9MIENIQVJBQ1RFUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gQ09OVFJPTCBDSEFSQUNURVIKKyAgICB1J1x4YzQnICAgICAjICAweDgwIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4YzUnICAgICAjICAweDgxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBSSU5HIEFCT1ZFCisgICAgdSdceGM3JyAgICAgIyAgMHg4MiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQQorICAgIHUnXHhjOScgICAgICMgIDB4ODMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGQxJyAgICAgIyAgMHg4NCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBOIFdJVEggVElMREUKKyAgICB1J1x4ZDYnICAgICAjICAweDg1IC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZGMnICAgICAjICAweDg2IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFUgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTEnICAgICAjICAweDg3IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQUNVVEUKKyAgICB1J1x4ZTAnICAgICAjICAweDg4IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4ZTInICAgICAjICAweDg5IC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhlNCcgICAgICMgIDB4OEEgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x4ZTMnICAgICAjICAweDhCIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggVElMREUKKyAgICB1J1x4ZTUnICAgICAjICAweDhDIC0+IExBVElOIFNNQUxMIExFVFRFUiBBIFdJVEggUklORyBBQk9WRQorICAgIHUnXHhlNycgICAgICMgIDB4OEQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMgV0lUSCBDRURJTExBCisgICAgdSdceGU5JyAgICAgIyAgMHg4RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEFDVVRFCisgICAgdSdceGU4JyAgICAgIyAgMHg4RiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGVhJyAgICAgIyAgMHg5MCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWInICAgICAjICAweDkxIC0+IExBVElOIFNNQUxMIExFVFRFUiBFIFdJVEggRElBRVJFU0lTCisgICAgdSdceGVkJyAgICAgIyAgMHg5MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEFDVVRFCisgICAgdSdceGVjJyAgICAgIyAgMHg5MyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIEdSQVZFCisgICAgdSdceGVlJyAgICAgIyAgMHg5NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZWYnICAgICAjICAweDk1IC0+IExBVElOIFNNQUxMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGYxJyAgICAgIyAgMHg5NiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTiBXSVRIIFRJTERFCisgICAgdSdceGYzJyAgICAgIyAgMHg5NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEFDVVRFCisgICAgdSdceGYyJyAgICAgIyAgMHg5OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIEdSQVZFCisgICAgdSdceGY0JyAgICAgIyAgMHg5OSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZjYnICAgICAjICAweDlBIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggRElBRVJFU0lTCisgICAgdSdceGY1JyAgICAgIyAgMHg5QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdceGZhJyAgICAgIyAgMHg5QyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGY5JyAgICAgIyAgMHg5RCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdceGZiJyAgICAgIyAgMHg5RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4ZmMnICAgICAjICAweDlGIC0+IExBVElOIFNNQUxMIExFVFRFUiBVIFdJVEggRElBRVJFU0lTCisgICAgdSdcdTIwMjAnICAgIyAgMHhBMCAtPiBEQUdHRVIKKyAgICB1J1x4YjAnICAgICAjICAweEExIC0+IERFR1JFRSBTSUdOCisgICAgdSdceGEyJyAgICAgIyAgMHhBMiAtPiBDRU5UIFNJR04KKyAgICB1J1x4YTMnICAgICAjICAweEEzIC0+IFBPVU5EIFNJR04KKyAgICB1J1x4YTcnICAgICAjICAweEE0IC0+IFNFQ1RJT04gU0lHTgorICAgIHUnXHUyMDIyJyAgICMgIDB4QTUgLT4gQlVMTEVUCisgICAgdSdceGI2JyAgICAgIyAgMHhBNiAtPiBQSUxDUk9XIFNJR04KKyAgICB1J1x4ZGYnICAgICAjICAweEE3IC0+IExBVElOIFNNQUxMIExFVFRFUiBTSEFSUCBTCisgICAgdSdceGFlJyAgICAgIyAgMHhBOCAtPiBSRUdJU1RFUkVEIFNJR04KKyAgICB1J1x4YTknICAgICAjICAweEE5IC0+IENPUFlSSUdIVCBTSUdOCisgICAgdSdcdTIxMjInICAgIyAgMHhBQSAtPiBUUkFERSBNQVJLIFNJR04KKyAgICB1J1x4YjQnICAgICAjICAweEFCIC0+IEFDVVRFIEFDQ0VOVAorICAgIHUnXHhhOCcgICAgICMgIDB4QUMgLT4gRElBRVJFU0lTCisgICAgdSdcdTIyNjAnICAgIyAgMHhBRCAtPiBOT1QgRVFVQUwgVE8KKyAgICB1J1x4YzYnICAgICAjICAweEFFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEFFCisgICAgdSdceGQ4JyAgICAgIyAgMHhBRiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdcdTIyMWUnICAgIyAgMHhCMCAtPiBJTkZJTklUWQorICAgIHUnXHhiMScgICAgICMgIDB4QjEgLT4gUExVUy1NSU5VUyBTSUdOCisgICAgdSdcdTIyNjQnICAgIyAgMHhCMiAtPiBMRVNTLVRIQU4gT1IgRVFVQUwgVE8KKyAgICB1J1x1MjI2NScgICAjICAweEIzIC0+IEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworICAgIHUnXHhhNScgICAgICMgIDB4QjQgLT4gWUVOIFNJR04KKyAgICB1J1x4YjUnICAgICAjICAweEI1IC0+IE1JQ1JPIFNJR04KKyAgICB1J1x1MjIwMicgICAjICAweEI2IC0+IFBBUlRJQUwgRElGRkVSRU5USUFMCisgICAgdSdcdTIyMTEnICAgIyAgMHhCNyAtPiBOLUFSWSBTVU1NQVRJT04KKyAgICB1J1x1MjIwZicgICAjICAweEI4IC0+IE4tQVJZIFBST0RVQ1QKKyAgICB1J1x1MDNjMCcgICAjICAweEI5IC0+IEdSRUVLIFNNQUxMIExFVFRFUiBQSQorICAgIHUnXHUyMjJiJyAgICMgIDB4QkEgLT4gSU5URUdSQUwKKyAgICB1J1x4YWEnICAgICAjICAweEJCIC0+IEZFTUlOSU5FIE9SRElOQUwgSU5ESUNBVE9SCisgICAgdSdceGJhJyAgICAgIyAgMHhCQyAtPiBNQVNDVUxJTkUgT1JESU5BTCBJTkRJQ0FUT1IKKyAgICB1J1x1MDNhOScgICAjICAweEJEIC0+IEdSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBCisgICAgdSdceGU2JyAgICAgIyAgMHhCRSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQUUKKyAgICB1J1x4ZjgnICAgICAjICAweEJGIC0+IExBVElOIFNNQUxMIExFVFRFUiBPIFdJVEggU1RST0tFCisgICAgdSdceGJmJyAgICAgIyAgMHhDMCAtPiBJTlZFUlRFRCBRVUVTVElPTiBNQVJLCisgICAgdSdceGExJyAgICAgIyAgMHhDMSAtPiBJTlZFUlRFRCBFWENMQU1BVElPTiBNQVJLCisgICAgdSdceGFjJyAgICAgIyAgMHhDMiAtPiBOT1QgU0lHTgorICAgIHUnXHUyMjFhJyAgICMgIDB4QzMgLT4gU1FVQVJFIFJPT1QKKyAgICB1J1x1MDE5MicgICAjICAweEM0IC0+IExBVElOIFNNQUxMIExFVFRFUiBGIFdJVEggSE9PSworICAgIHUnXHUyMjQ4JyAgICMgIDB4QzUgLT4gQUxNT1NUIEVRVUFMIFRPCisgICAgdSdcdTIyMDYnICAgIyAgMHhDNiAtPiBJTkNSRU1FTlQKKyAgICB1J1x4YWInICAgICAjICAweEM3IC0+IExFRlQtUE9JTlRJTkcgRE9VQkxFIEFOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgdSdceGJiJyAgICAgIyAgMHhDOCAtPiBSSUdIVC1QT0lOVElORyBET1VCTEUgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAyNicgICAjICAweEM5IC0+IEhPUklaT05UQUwgRUxMSVBTSVMKKyAgICB1J1x4YTAnICAgICAjICAweENBIC0+IE5PLUJSRUFLIFNQQUNFCisgICAgdSdceGMwJyAgICAgIyAgMHhDQiAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggR1JBVkUKKyAgICB1J1x4YzMnICAgICAjICAweENDIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBUSUxERQorICAgIHUnXHhkNScgICAgICMgIDB4Q0QgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIFRJTERFCisgICAgdSdcdTAxNTInICAgIyAgMHhDRSAtPiBMQVRJTiBDQVBJVEFMIExJR0FUVVJFIE9FCisgICAgdSdcdTAxNTMnICAgIyAgMHhDRiAtPiBMQVRJTiBTTUFMTCBMSUdBVFVSRSBPRQorICAgIHUnXHUyMDEzJyAgICMgIDB4RDAgLT4gRU4gREFTSAorICAgIHUnXHUyMDE0JyAgICMgIDB4RDEgLT4gRU0gREFTSAorICAgIHUnXHUyMDFjJyAgICMgIDB4RDIgLT4gTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxZCcgICAjICAweEQzIC0+IFJJR0hUIERPVUJMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHUyMDE4JyAgICMgIDB4RDQgLT4gTEVGVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAxOScgICAjICAweEQ1IC0+IFJJR0hUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgIHUnXHhmNycgICAgICMgIDB4RDYgLT4gRElWSVNJT04gU0lHTgorICAgIHUnXHUyNWNhJyAgICMgIDB4RDcgLT4gTE9aRU5HRQorICAgIHUnXHhmZicgICAgICMgIDB4RDggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDE3OCcgICAjICAweEQ5IC0+IExBVElOIENBUElUQUwgTEVUVEVSIFkgV0lUSCBESUFFUkVTSVMKKyAgICB1J1x1MDExZScgICAjICAweERBIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHUwMTFmJyAgICMgIDB4REIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEcgV0lUSCBCUkVWRQorICAgIHUnXHUwMTMwJyAgICMgIDB4REMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSSBXSVRIIERPVCBBQk9WRQorICAgIHUnXHUwMTMxJyAgICMgIDB4REQgLT4gTEFUSU4gU01BTEwgTEVUVEVSIERPVExFU1MgSQorICAgIHUnXHUwMTVlJyAgICMgIDB4REUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUyBXSVRIIENFRElMTEEKKyAgICB1J1x1MDE1ZicgICAjICAweERGIC0+IExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0VESUxMQQorICAgIHUnXHUyMDIxJyAgICMgIDB4RTAgLT4gRE9VQkxFIERBR0dFUgorICAgIHUnXHhiNycgICAgICMgIDB4RTEgLT4gTUlERExFIERPVAorICAgIHUnXHUyMDFhJyAgICMgIDB4RTIgLT4gU0lOR0xFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgdSdcdTIwMWUnICAgIyAgMHhFMyAtPiBET1VCTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICB1J1x1MjAzMCcgICAjICAweEU0IC0+IFBFUiBNSUxMRSBTSUdOCisgICAgdSdceGMyJyAgICAgIyAgMHhFNSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBBIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhjYScgICAgICMgIDB4RTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x4YzEnICAgICAjICAweEU3IC0+IExBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBBQ1VURQorICAgIHUnXHhjYicgICAgICMgIDB4RTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIERJQUVSRVNJUworICAgIHUnXHhjOCcgICAgICMgIDB4RTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRSBXSVRIIEdSQVZFCisgICAgdSdceGNkJyAgICAgIyAgMHhFQSAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggQUNVVEUKKyAgICB1J1x4Y2UnICAgICAjICAweEVCIC0+IExBVElOIENBUElUQUwgTEVUVEVSIEkgV0lUSCBDSVJDVU1GTEVYCisgICAgdSdceGNmJyAgICAgIyAgMHhFQyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggRElBRVJFU0lTCisgICAgdSdceGNjJyAgICAgIyAgMHhFRCAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBJIFdJVEggR1JBVkUKKyAgICB1J1x4ZDMnICAgICAjICAweEVFIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBBQ1VURQorICAgIHUnXHhkNCcgICAgICMgIDB4RUYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTyBXSVRIIENJUkNVTUZMRVgKKyAgICB1J1x1ZjhmZicgICAjICAweEYwIC0+IEFwcGxlIGxvZ28KKyAgICB1J1x4ZDInICAgICAjICAweEYxIC0+IExBVElOIENBUElUQUwgTEVUVEVSIE8gV0lUSCBHUkFWRQorICAgIHUnXHhkYScgICAgICMgIDB4RjIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEFDVVRFCisgICAgdSdceGRiJyAgICAgIyAgMHhGMyAtPiBMQVRJTiBDQVBJVEFMIExFVFRFUiBVIFdJVEggQ0lSQ1VNRkxFWAorICAgIHUnXHhkOScgICAgICMgIDB4RjQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVSBXSVRIIEdSQVZFCisgICAgdSdcdWY4YTAnICAgIyAgMHhGNSAtPiB1bmRlZmluZWQxCisgICAgdSdcdTAyYzYnICAgIyAgMHhGNiAtPiBNT0RJRklFUiBMRVRURVIgQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J1x1MDJkYycgICAjICAweEY3IC0+IFNNQUxMIFRJTERFCisgICAgdSdceGFmJyAgICAgIyAgMHhGOCAtPiBNQUNST04KKyAgICB1J1x1MDJkOCcgICAjICAweEY5IC0+IEJSRVZFCisgICAgdSdcdTAyZDknICAgIyAgMHhGQSAtPiBET1QgQUJPVkUKKyAgICB1J1x1MDJkYScgICAjICAweEZCIC0+IFJJTkcgQUJPVkUKKyAgICB1J1x4YjgnICAgICAjICAweEZDIC0+IENFRElMTEEKKyAgICB1J1x1MDJkZCcgICAjICAweEZEIC0+IERPVUJMRSBBQ1VURSBBQ0NFTlQKKyAgICB1J1x1MDJkYicgICAjICAweEZFIC0+IE9HT05FSworICAgIHUnXHUwMmM3JyAgICMgIDB4RkYgLT4gQ0FST04KKykKKworIyMjIEVuY29kaW5nIHRhYmxlCitlbmNvZGluZ190YWJsZT1jb2RlY3MuY2hhcm1hcF9idWlsZChkZWNvZGluZ190YWJsZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg4NDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3R1cmtpc2gucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21hY190dXJraXNoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg4NDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvbWFjX3R1cmtpc2gucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21iY3MucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjQ2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5CkBAIC0wLDAgKzEsNDcgQEAKKyIiIiBQeXRob24gJ21iY3MnIENvZGVjIGZvciBXaW5kb3dzCisKKworQ2xvbmVkIGJ5IE1hcmsgSGFtbW9uZCAobWhhbW1vbmRAc2tpcHBpbmV0LmNvbS5hdSkgZnJvbSBhc2NpaS5weSwKK3doaWNoIHdhcyB3cml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiCisjIEltcG9ydCB0aGVtIGV4cGxpY2l0bHkgdG8gY2F1c2UgYW4gSW1wb3J0RXJyb3IKKyMgb24gbm9uLVdpbmRvd3Mgc3lzdGVtcworZnJvbSBjb2RlY3MgaW1wb3J0IG1iY3NfZW5jb2RlLCBtYmNzX2RlY29kZQorIyBmb3IgSW5jcmVtZW50YWxEZWNvZGVyLCBJbmNyZW1lbnRhbEVuY29kZXIsIC4uLgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitlbmNvZGUgPSBtYmNzX2VuY29kZQorCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBtYmNzX2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gbWJjc19lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBfYnVmZmVyX2RlY29kZSA9IG1iY3NfZGVjb2RlCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBtYmNzX2VuY29kZQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgZGVjb2RlID0gbWJjc19kZWNvZGUKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdtYmNzJywKKyAgICAgICAgZW5jb2RlPWVuY29kZSwKKyAgICAgICAgZGVjb2RlPWRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21iY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODllZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL21iY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODllZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9tYmNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wYWxtb3MucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wYWxtb3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3N2UyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3BhbG1vcy5weQpAQCAtMCwwICsxLDgzIEBACisiIiIgUHl0aG9uIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIGZvciBQYWxtT1MgMy41LgorCitXcml0dGVuIGJ5IFNqb2VyZCBNdWxsZW5kZXIgKHNqb2VyZEBhY20ub3JnKTsgYmFzZWQgb24gaXNvODg1OV8xNS5weS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LGVycm9ycyxlbmNvZGluZ19tYXApCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfbWFwKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZW5jb2RlKGlucHV0LHNlbGYuZXJyb3JzLGVuY29kaW5nX21hcClbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxzZWxmLmVycm9ycyxkZWNvZGluZ19tYXApWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ncGFsbW9zJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQorCisjIyMgRGVjb2RpbmcgTWFwCisKK2RlY29kaW5nX21hcCA9IGNvZGVjcy5tYWtlX2lkZW50aXR5X2RpY3QocmFuZ2UoMjU2KSkKKworIyBUaGUgUGFsbU9TIGNoYXJhY3RlciBzZXQgaXMgbW9zdGx5IGlzby04ODU5LTEgd2l0aCBzb21lIGRpZmZlcmVuY2VzLgorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgICAgIDB4MDA4MDogMHgyMGFjLCAjICAgICAgIEVVUk8gU0lHTgorICAgICAgICAweDAwODI6IDB4MjAxYSwgIyAgICAgICBTSU5HTEUgTE9XLTkgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDgzOiAweDAxOTIsICMgICAgICAgTEFUSU4gU01BTEwgTEVUVEVSIEYgV0lUSCBIT09LCisgICAgICAgIDB4MDA4NDogMHgyMDFlLCAjICAgICAgIERPVUJMRSBMT1ctOSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwODU6IDB4MjAyNiwgIyAgICAgICBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgICAgIDB4MDA4NjogMHgyMDIwLCAjICAgICAgIERBR0dFUgorICAgICAgICAweDAwODc6IDB4MjAyMSwgIyAgICAgICBET1VCTEUgREFHR0VSCisgICAgICAgIDB4MDA4ODogMHgwMmM2LCAjICAgICAgIE1PRElGSUVSIExFVFRFUiBDSVJDVU1GTEVYIEFDQ0VOVAorICAgICAgICAweDAwODk6IDB4MjAzMCwgIyAgICAgICBQRVIgTUlMTEUgU0lHTgorICAgICAgICAweDAwOGE6IDB4MDE2MCwgIyAgICAgICBMQVRJTiBDQVBJVEFMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAgICAgMHgwMDhiOiAweDIwMzksICMgICAgICAgU0lOR0xFIExFRlQtUE9JTlRJTkcgQU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDhjOiAweDAxNTIsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMSUdBVFVSRSBPRQorICAgICAgICAweDAwOGQ6IDB4MjY2NiwgIyAgICAgICBCTEFDSyBESUFNT05EIFNVSVQKKyAgICAgICAgMHgwMDhlOiAweDI2NjMsICMgICAgICAgQkxBQ0sgQ0xVQiBTVUlUCisgICAgICAgIDB4MDA4ZjogMHgyNjY1LCAjICAgICAgIEJMQUNLIEhFQVJUIFNVSVQKKyAgICAgICAgMHgwMDkwOiAweDI2NjAsICMgICAgICAgQkxBQ0sgU1BBREUgU1VJVAorICAgICAgICAweDAwOTE6IDB4MjAxOCwgIyAgICAgICBMRUZUIFNJTkdMRSBRVU9UQVRJT04gTUFSSworICAgICAgICAweDAwOTI6IDB4MjAxOSwgIyAgICAgICBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDkzOiAweDIwMWMsICMgICAgICAgTEVGVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDk0OiAweDIwMWQsICMgICAgICAgUklHSFQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA5NTogMHgyMDIyLCAjICAgICAgIEJVTExFVAorICAgICAgICAweDAwOTY6IDB4MjAxMywgIyAgICAgICBFTiBEQVNICisgICAgICAgIDB4MDA5NzogMHgyMDE0LCAjICAgICAgIEVNIERBU0gKKyAgICAgICAgMHgwMDk4OiAweDAyZGMsICMgICAgICAgU01BTEwgVElMREUKKyAgICAgICAgMHgwMDk5OiAweDIxMjIsICMgICAgICAgVFJBREUgTUFSSyBTSUdOCisgICAgICAgIDB4MDA5YTogMHgwMTYxLCAjICAgICAgIExBVElOIFNNQUxMIExFVFRFUiBTIFdJVEggQ0FST04KKyAgICAgICAgMHgwMDljOiAweDAxNTMsICMgICAgICAgTEFUSU4gU01BTEwgTElHQVRVUkUgT0UKKyAgICAgICAgMHgwMDlmOiAweDAxNzgsICMgICAgICAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWSBXSVRIIERJQUVSRVNJUworfSkKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9lbmNvZGluZ19tYXAoZGVjb2RpbmdfbWFwKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcGFsbW9zLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3BhbG1vcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzYjYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3BhbG1vcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcGFsbW9zLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3BhbG1vcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzYjYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3BhbG1vcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHRjcDE1NC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B0Y3AxNTQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmODk3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B0Y3AxNTQucHkKQEAgLTAsMCArMSwxNzUgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgZ2VuZXJhdGVkIGZyb20gJ1BUQ1AxNTQudHh0JyB3aXRoIGdlbmNvZGVjLnB5LgorCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKyhjKSBDb3B5cmlnaHQgMjAwMCBHdWlkbyB2YW4gUm9zc3VtLgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsZXJyb3JzLGRlY29kaW5nX21hcCkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxzZWxmLmVycm9ycyxlbmNvZGluZ19tYXApWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfbWFwKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3B0Y3AxNTQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgICAgIDB4MDA4MDogMHgwNDk2LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaSEUgV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMDgxOiAweDA0OTIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRSBXSVRIIFNUUk9LRQorICAgICAgICAweDAwODI6IDB4MDRlZSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVSBXSVRIIE1BQ1JPTgorICAgICAgICAweDAwODM6IDB4MDQ5MywgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEdIRSBXSVRIIFNUUk9LRQorICAgICAgICAweDAwODQ6IDB4MjAxZSwgIyAgICAgICAgRE9VQkxFIExPVy05IFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA4NTogMHgyMDI2LCAjICAgICAgICBIT1JJWk9OVEFMIEVMTElQU0lTCisgICAgICAgIDB4MDA4NjogMHgwNGI2LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUgV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMDg3OiAweDA0YWUsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNUUkFJR0hUIFUKKyAgICAgICAgMHgwMDg4OiAweDA0YjIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA4OTogMHgwNGFmLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU1RSQUlHSFQgVQorICAgICAgICAweDAwOGE6IDB4MDRhMCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkFTSEtJUiBLQQorICAgICAgICAweDAwOGI6IDB4MDRlMiwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSSBXSVRIIE1BQ1JPTgorICAgICAgICAweDAwOGM6IDB4MDRhMiwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4gV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMDhkOiAweDA0OWEsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA4ZTogMHgwNGJhLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEhBCisgICAgICAgIDB4MDA4ZjogMHgwNGI4LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBDSEUgV0lUSCBWRVJUSUNBTCBTVFJPS0UKKyAgICAgICAgMHgwMDkwOiAweDA0OTcsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBaSEUgV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMDkxOiAweDIwMTgsICMgICAgICAgIExFRlQgU0lOR0xFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA5MjogMHgyMDE5LCAjICAgICAgICBSSUdIVCBTSU5HTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDkzOiAweDIwMWMsICMgICAgICAgIExFRlQgRE9VQkxFIFFVT1RBVElPTiBNQVJLCisgICAgICAgIDB4MDA5NDogMHgyMDFkLCAjICAgICAgICBSSUdIVCBET1VCTEUgUVVPVEFUSU9OIE1BUksKKyAgICAgICAgMHgwMDk1OiAweDIwMjIsICMgICAgICAgIEJVTExFVAorICAgICAgICAweDAwOTY6IDB4MjAxMywgIyAgICAgICAgRU4gREFTSAorICAgICAgICAweDAwOTc6IDB4MjAxNCwgIyAgICAgICAgRU0gREFTSAorICAgICAgICAweDAwOTg6IDB4MDRiMywgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA5OTogMHgwNGI3LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQ0hFIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA5YTogMHgwNGExLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQkFTSEtJUiBLQQorICAgICAgICAweDAwOWI6IDB4MDRlMywgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMDljOiAweDA0YTMsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTiBXSVRIIERFU0NFTkRFUgorICAgICAgICAweDAwOWQ6IDB4MDQ5YiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDA5ZTogMHgwNGJiLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hIQQorICAgICAgICAweDAwOWY6IDB4MDRiOSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRSBXSVRIIFZFUlRJQ0FMIFNUUk9LRQorICAgICAgICAweDAwYTE6IDB4MDQwZSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgVSAoQnllbG9ydXNzaWFuKQorICAgICAgICAweDAwYTI6IDB4MDQ1ZSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIT1JUIFUgKEJ5ZWxvcnVzc2lhbikKKyAgICAgICAgMHgwMGEzOiAweDA0MDgsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEpFCisgICAgICAgIDB4MDBhNDogMHgwNGU4LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCQVJSRUQgTworICAgICAgICAweDAwYTU6IDB4MDQ5OCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkUgV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMGE2OiAweDA0YjAsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNUUkFJR0hUIFUgV0lUSCBTVFJPS0UKKyAgICAgICAgMHgwMGE4OiAweDA0MDEsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisgICAgICAgIDB4MDBhYTogMHgwNGQ4LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTQ0hXQQorICAgICAgICAweDAwYWQ6IDB4MDRlZiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUgV0lUSCBNQUNST04KKyAgICAgICAgMHgwMGFmOiAweDA0OWMsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEtBIFdJVEggVkVSVElDQUwgU1RST0tFCisgICAgICAgIDB4MDBiMTogMHgwNGIxLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU1RSQUlHSFQgVSBXSVRIIFNUUk9LRQorICAgICAgICAweDAwYjI6IDB4MDQwNiwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgICAgIDB4MDBiMzogMHgwNDU2LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQllFTE9SVVNTSUFOLVVLUkFJTklBTiBJCisgICAgICAgIDB4MDBiNDogMHgwNDk5LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUgV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMGI1OiAweDA0ZTksICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBCQVJSRUQgTworICAgICAgICAweDAwYjg6IDB4MDQ1MSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisgICAgICAgIDB4MDBiOTogMHgyMTE2LCAjICAgICAgICBOVU1FUk8gU0lHTgorICAgICAgICAweDAwYmE6IDB4MDRkOSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNDSFdBCisgICAgICAgIDB4MDBiYzogMHgwNDU4LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSkUKKyAgICAgICAgMHgwMGJkOiAweDA0YWEsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVTIFdJVEggREVTQ0VOREVSCisgICAgICAgIDB4MDBiZTogMHgwNGFiLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVMgV0lUSCBERVNDRU5ERVIKKyAgICAgICAgMHgwMGJmOiAweDA0OWQsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQSBXSVRIIFZFUlRJQ0FMIFNUUk9LRQorICAgICAgICAweDAwYzA6IDB4MDQxMCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQQorICAgICAgICAweDAwYzE6IDB4MDQxMSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICAgICAgMHgwMGMyOiAweDA0MTIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisgICAgICAgIDB4MDBjMzogMHgwNDEzLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBHSEUKKyAgICAgICAgMHgwMGM0OiAweDA0MTQsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisgICAgICAgIDB4MDBjNTogMHgwNDE1LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBJRQorICAgICAgICAweDAwYzY6IDB4MDQxNiwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWkhFCisgICAgICAgIDB4MDBjNzogMHgwNDE3LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBaRQorICAgICAgICAweDAwYzg6IDB4MDQxOCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorICAgICAgICAweDAwYzk6IDB4MDQxOSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hPUlQgSQorICAgICAgICAweDAwY2E6IDB4MDQxYSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgS0EKKyAgICAgICAgMHgwMGNiOiAweDA0MWIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisgICAgICAgIDB4MDBjYzogMHgwNDFjLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTQorICAgICAgICAweDAwY2Q6IDB4MDQxZCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU4KKyAgICAgICAgMHgwMGNlOiAweDA0MWUsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKyAgICAgICAgMHgwMGNmOiAweDA0MWYsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFBFCisgICAgICAgIDB4MDBkMDogMHgwNDIwLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUgorICAgICAgICAweDAwZDE6IDB4MDQyMSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVMKKyAgICAgICAgMHgwMGQyOiAweDA0MjIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisgICAgICAgIDB4MDBkMzogMHgwNDIzLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBVCisgICAgICAgIDB4MDBkNDogMHgwNDI0LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorICAgICAgICAweDAwZDU6IDB4MDQyNSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEEKKyAgICAgICAgMHgwMGQ2OiAweDA0MjYsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorICAgICAgICAweDAwZDc6IDB4MDQyNywgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisgICAgICAgIDB4MDBkODogMHgwNDI4LCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBTSEEKKyAgICAgICAgMHgwMGQ5OiAweDA0MjksICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisgICAgICAgIDB4MDBkYTogMHgwNDJhLCAjICAgICAgICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBIQVJEIFNJR04KKyAgICAgICAgMHgwMGRiOiAweDA0MmIsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlFUlUKKyAgICAgICAgMHgwMGRjOiAweDA0MmMsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNPRlQgU0lHTgorICAgICAgICAweDAwZGQ6IDB4MDQyZCwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorICAgICAgICAweDAwZGU6IDB4MDQyZSwgIyAgICAgICAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWVUKKyAgICAgICAgMHgwMGRmOiAweDA0MmYsICMgICAgICAgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisgICAgICAgIDB4MDBlMDogMHgwNDMwLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorICAgICAgICAweDAwZTE6IDB4MDQzMSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEJFCisgICAgICAgIDB4MDBlMjogMHgwNDMyLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVkUKKyAgICAgICAgMHgwMGUzOiAweDA0MzMsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBHSEUKKyAgICAgICAgMHgwMGU0OiAweDA0MzQsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBERQorICAgICAgICAweDAwZTU6IDB4MDQzNSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElFCisgICAgICAgIDB4MDBlNjogMHgwNDM2LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisgICAgICAgIDB4MDBlNzogMHgwNDM3LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkUKKyAgICAgICAgMHgwMGU4OiAweDA0MzgsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBJCisgICAgICAgIDB4MDBlOTogMHgwNDM5LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorICAgICAgICAweDAwZWE6IDB4MDQzYSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEtBCisgICAgICAgIDB4MDBlYjogMHgwNDNiLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUwKKyAgICAgICAgMHgwMGVjOiAweDA0M2MsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorICAgICAgICAweDAwZWQ6IDB4MDQzZCwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVOCisgICAgICAgIDB4MDBlZTogMHgwNDNlLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgTworICAgICAgICAweDAwZWY6IDB4MDQzZiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisgICAgICAgIDB4MDBmMDogMHgwNDQwLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRVIKKyAgICAgICAgMHgwMGYxOiAweDA0NDEsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBFUworICAgICAgICAweDAwZjI6IDB4MDQ0MiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisgICAgICAgIDB4MDBmMzogMHgwNDQzLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgVQorICAgICAgICAweDAwZjQ6IDB4MDQ0NCwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVGCisgICAgICAgIDB4MDBmNTogMHgwNDQ1LCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSEEKKyAgICAgICAgMHgwMGY2OiAweDA0NDYsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKyAgICAgICAgMHgwMGY3OiAweDA0NDcsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBDSEUKKyAgICAgICAgMHgwMGY4OiAweDA0NDgsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSEEKKyAgICAgICAgMHgwMGY5OiAweDA0NDksICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBTSENIQQorICAgICAgICAweDAwZmE6IDB4MDQ0YSwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBUkQgU0lHTgorICAgICAgICAweDAwZmI6IDB4MDQ0YiwgIyAgICAgICAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlFUlUKKyAgICAgICAgMHgwMGZjOiAweDA0NGMsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBTT0ZUIFNJR04KKyAgICAgICAgMHgwMGZkOiAweDA0NGQsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBFCisgICAgICAgIDB4MDBmZTogMHgwNDRlLCAjICAgICAgICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKyAgICAgICAgMHgwMGZmOiAweDA0NGYsICMgICAgICAgIENZUklMTElDIFNNQUxMIExFVFRFUiBZQQorfSkKKworIyMjIEVuY29kaW5nIE1hcAorCitlbmNvZGluZ19tYXAgPSBjb2RlY3MubWFrZV9lbmNvZGluZ19tYXAoZGVjb2RpbmdfbWFwKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHRjcDE1NC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdGNwMTU0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFmNDFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHRjcDE1NC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHRjcDE1NC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdGNwMTU0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDFmNDFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHRjcDE1NC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHVueWNvZGUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdW55Y29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTcyMDBmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcHVueWNvZGUucHkKQEAgLTAsMCArMSwyMzggQEAKKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KKyIiIiBDb2RlYyBmb3IgdGhlIFB1bmljb2RlIGVuY29kaW5nLCBhcyBzcGVjaWZpZWQgaW4gUkZDIDM0OTIKKworV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMuCisiIiIKKworaW1wb3J0IGNvZGVjcworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRW5jb2RpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgc2VncmVnYXRlKHN0cik6CisgICAgIiIiMy4xIEJhc2ljIGNvZGUgcG9pbnQgc2VncmVnYXRpb24iIiIKKyAgICBiYXNlID0gW10KKyAgICBleHRlbmRlZCA9IHt9CisgICAgZm9yIGMgaW4gc3RyOgorICAgICAgICBpZiBvcmQoYykgPCAxMjg6CisgICAgICAgICAgICBiYXNlLmFwcGVuZChjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXh0ZW5kZWRbY10gPSAxCisgICAgZXh0ZW5kZWQgPSBleHRlbmRlZC5rZXlzKCkKKyAgICBleHRlbmRlZC5zb3J0KCkKKyAgICByZXR1cm4gIiIuam9pbihiYXNlKS5lbmNvZGUoImFzY2lpIiksZXh0ZW5kZWQKKworZGVmIHNlbGVjdGl2ZV9sZW4oc3RyLCBtYXgpOgorICAgICIiIlJldHVybiB0aGUgbGVuZ3RoIG9mIHN0ciwgY29uc2lkZXJpbmcgb25seSBjaGFyYWN0ZXJzIGJlbG93IG1heC4iIiIKKyAgICByZXMgPSAwCisgICAgZm9yIGMgaW4gc3RyOgorICAgICAgICBpZiBvcmQoYykgPCBtYXg6CisgICAgICAgICAgICByZXMgKz0gMQorICAgIHJldHVybiByZXMKKworZGVmIHNlbGVjdGl2ZV9maW5kKHN0ciwgY2hhciwgaW5kZXgsIHBvcyk6CisgICAgIiIiUmV0dXJuIGEgcGFpciAoaW5kZXgsIHBvcyksIGluZGljYXRpbmcgdGhlIG5leHQgb2NjdXJyZW5jZSBvZgorICAgIGNoYXIgaW4gc3RyLiBpbmRleCBpcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciBjb25zaWRlcmluZworICAgIG9ubHkgb3JkaW5hbHMgdXAgdG8gYW5kIGluY2x1ZGluZyBjaGFyLCBhbmQgcG9zIGlzIHRoZSBwb3NpdGlvbiBpbgorICAgIHRoZSBmdWxsIHN0cmluZy4gaW5kZXgvcG9zIGlzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgZnVsbAorICAgIHN0cmluZy4iIiIKKworICAgIGwgPSBsZW4oc3RyKQorICAgIHdoaWxlIDE6CisgICAgICAgIHBvcyArPSAxCisgICAgICAgIGlmIHBvcyA9PSBsOgorICAgICAgICAgICAgcmV0dXJuICgtMSwgLTEpCisgICAgICAgIGMgPSBzdHJbcG9zXQorICAgICAgICBpZiBjID09IGNoYXI6CisgICAgICAgICAgICByZXR1cm4gaW5kZXgrMSwgcG9zCisgICAgICAgIGVsaWYgYyA8IGNoYXI6CisgICAgICAgICAgICBpbmRleCArPSAxCisKK2RlZiBpbnNlcnRpb25fdW5zb3J0KHN0ciwgZXh0ZW5kZWQpOgorICAgICIiIjMuMiBJbnNlcnRpb24gdW5zb3J0IGNvZGluZyIiIgorICAgIG9sZGNoYXIgPSAweDgwCisgICAgcmVzdWx0ID0gW10KKyAgICBvbGRpbmRleCA9IC0xCisgICAgZm9yIGMgaW4gZXh0ZW5kZWQ6CisgICAgICAgIGluZGV4ID0gcG9zID0gLTEKKyAgICAgICAgY2hhciA9IG9yZChjKQorICAgICAgICBjdXJsZW4gPSBzZWxlY3RpdmVfbGVuKHN0ciwgY2hhcikKKyAgICAgICAgZGVsdGEgPSAoY3VybGVuKzEpICogKGNoYXIgLSBvbGRjaGFyKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaW5kZXgscG9zID0gc2VsZWN0aXZlX2ZpbmQoc3RyLGMsaW5kZXgscG9zKQorICAgICAgICAgICAgaWYgaW5kZXggPT0gLTE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGRlbHRhICs9IGluZGV4IC0gb2xkaW5kZXgKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGVsdGEtMSkKKyAgICAgICAgICAgIG9sZGluZGV4ID0gaW5kZXgKKyAgICAgICAgICAgIGRlbHRhID0gMAorICAgICAgICBvbGRjaGFyID0gY2hhcgorCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgVChqLCBiaWFzKToKKyAgICAjIFB1bnljb2RlIHBhcmFtZXRlcnM6IHRtaW4gPSAxLCB0bWF4ID0gMjYsIGJhc2UgPSAzNgorICAgIHJlcyA9IDM2ICogKGogKyAxKSAtIGJpYXMKKyAgICBpZiByZXMgPCAxOiByZXR1cm4gMQorICAgIGlmIHJlcyA+IDI2OiByZXR1cm4gMjYKKyAgICByZXR1cm4gcmVzCisKK2RpZ2l0cyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkiCitkZWYgZ2VuZXJhdGVfZ2VuZXJhbGl6ZWRfaW50ZWdlcihOLCBiaWFzKToKKyAgICAiIiIzLjMgR2VuZXJhbGl6ZWQgdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzIiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBqID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIHQgPSBUKGosIGJpYXMpCisgICAgICAgIGlmIE4gPCB0OgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkaWdpdHNbTl0pCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlnaXRzW3QgKyAoKE4gLSB0KSAlICgzNiAtIHQpKV0pCisgICAgICAgIE4gPSAoTiAtIHQpIC8vICgzNiAtIHQpCisgICAgICAgIGogKz0gMQorCitkZWYgYWRhcHQoZGVsdGEsIGZpcnN0LCBudW1jaGFycyk6CisgICAgaWYgZmlyc3Q6CisgICAgICAgIGRlbHRhIC8vPSA3MDAKKyAgICBlbHNlOgorICAgICAgICBkZWx0YSAvLz0gMgorICAgIGRlbHRhICs9IGRlbHRhIC8vIG51bWNoYXJzCisgICAgIyAoKGJhc2UgLSB0bWluKSAqIHRtYXgpIC8vIDIgPT0gNDU1CisgICAgZGl2aXNpb25zID0gMAorICAgIHdoaWxlIGRlbHRhID4gNDU1OgorICAgICAgICBkZWx0YSA9IGRlbHRhIC8vIDM1ICMgYmFzZSAtIHRtaW4KKyAgICAgICAgZGl2aXNpb25zICs9IDM2CisgICAgYmlhcyA9IGRpdmlzaW9ucyArICgzNiAqIGRlbHRhIC8vIChkZWx0YSArIDM4KSkKKyAgICByZXR1cm4gYmlhcworCisKK2RlZiBnZW5lcmF0ZV9pbnRlZ2VycyhiYXNlbGVuLCBkZWx0YXMpOgorICAgICIiIjMuNCBCaWFzIGFkYXB0YXRpb24iIiIKKyAgICAjIFB1bnljb2RlIHBhcmFtZXRlcnM6IGluaXRpYWwgYmlhcyA9IDcyLCBkYW1wID0gNzAwLCBza2V3ID0gMzgKKyAgICByZXN1bHQgPSBbXQorICAgIGJpYXMgPSA3MgorICAgIGZvciBwb2ludHMsIGRlbHRhIGluIGVudW1lcmF0ZShkZWx0YXMpOgorICAgICAgICBzID0gZ2VuZXJhdGVfZ2VuZXJhbGl6ZWRfaW50ZWdlcihkZWx0YSwgYmlhcykKKyAgICAgICAgcmVzdWx0LmV4dGVuZChzKQorICAgICAgICBiaWFzID0gYWRhcHQoZGVsdGEsIHBvaW50cz09MCwgYmFzZWxlbitwb2ludHMrMSkKKyAgICByZXR1cm4gIiIuam9pbihyZXN1bHQpCisKK2RlZiBwdW55Y29kZV9lbmNvZGUodGV4dCk6CisgICAgYmFzZSwgZXh0ZW5kZWQgPSBzZWdyZWdhdGUodGV4dCkKKyAgICBiYXNlID0gYmFzZS5lbmNvZGUoImFzY2lpIikKKyAgICBkZWx0YXMgPSBpbnNlcnRpb25fdW5zb3J0KHRleHQsIGV4dGVuZGVkKQorICAgIGV4dGVuZGVkID0gZ2VuZXJhdGVfaW50ZWdlcnMobGVuKGJhc2UpLCBkZWx0YXMpCisgICAgaWYgYmFzZToKKyAgICAgICAgcmV0dXJuIGJhc2UgKyAiLSIgKyBleHRlbmRlZAorICAgIHJldHVybiBleHRlbmRlZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMgRGVjb2RpbmcgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgZGVjb2RlX2dlbmVyYWxpemVkX251bWJlcihleHRlbmRlZCwgZXh0cG9zLCBiaWFzLCBlcnJvcnMpOgorICAgICIiIjMuMyBHZW5lcmFsaXplZCB2YXJpYWJsZS1sZW5ndGggaW50ZWdlcnMiIiIKKyAgICByZXN1bHQgPSAwCisgICAgdyA9IDEKKyAgICBqID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoYXIgPSBvcmQoZXh0ZW5kZWRbZXh0cG9zXSkKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBpZiBlcnJvcnMgPT0gInN0cmljdCI6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiaW5jb21wbGV0ZSBwdW5pY29kZSBzdHJpbmciCisgICAgICAgICAgICByZXR1cm4gZXh0cG9zICsgMSwgTm9uZQorICAgICAgICBleHRwb3MgKz0gMQorICAgICAgICBpZiAweDQxIDw9IGNoYXIgPD0gMHg1QTogIyBBLVoKKyAgICAgICAgICAgIGRpZ2l0ID0gY2hhciAtIDB4NDEKKyAgICAgICAgZWxpZiAweDMwIDw9IGNoYXIgPD0gMHgzOToKKyAgICAgICAgICAgIGRpZ2l0ID0gY2hhciAtIDIyICMgMHgzMC0yNgorICAgICAgICBlbGlmIGVycm9ycyA9PSAic3RyaWN0IjoKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSW52YWxpZCBleHRlbmRlZCBjb2RlIHBvaW50ICclcyciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBleHRlbmRlZFtleHRwb3NdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGV4dHBvcywgTm9uZQorICAgICAgICB0ID0gVChqLCBiaWFzKQorICAgICAgICByZXN1bHQgKz0gZGlnaXQgKiB3CisgICAgICAgIGlmIGRpZ2l0IDwgdDoKKyAgICAgICAgICAgIHJldHVybiBleHRwb3MsIHJlc3VsdAorICAgICAgICB3ID0gdyAqICgzNiAtIHQpCisgICAgICAgIGogKz0gMQorCisKK2RlZiBpbnNlcnRpb25fc29ydChiYXNlLCBleHRlbmRlZCwgZXJyb3JzKToKKyAgICAiIiIzLjIgSW5zZXJ0aW9uIHVuc29ydCBjb2RpbmciIiIKKyAgICBjaGFyID0gMHg4MAorICAgIHBvcyA9IC0xCisgICAgYmlhcyA9IDcyCisgICAgZXh0cG9zID0gMAorICAgIHdoaWxlIGV4dHBvcyA8IGxlbihleHRlbmRlZCk6CisgICAgICAgIG5ld3BvcywgZGVsdGEgPSBkZWNvZGVfZ2VuZXJhbGl6ZWRfbnVtYmVyKGV4dGVuZGVkLCBleHRwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMsIGVycm9ycykKKyAgICAgICAgaWYgZGVsdGEgaXMgTm9uZToKKyAgICAgICAgICAgICMgVGhlcmUgd2FzIGFuIGVycm9yIGluIGRlY29kaW5nLiBXZSBjYW4ndCBjb250aW51ZSBiZWNhdXNlCisgICAgICAgICAgICAjIHN5bmNocm9uaXphdGlvbiBpcyBsb3N0LgorICAgICAgICAgICAgcmV0dXJuIGJhc2UKKyAgICAgICAgcG9zICs9IGRlbHRhKzEKKyAgICAgICAgY2hhciArPSBwb3MgLy8gKGxlbihiYXNlKSArIDEpCisgICAgICAgIGlmIGNoYXIgPiAweDEwRkZGRjoKKyAgICAgICAgICAgIGlmIGVycm9ycyA9PSAic3RyaWN0IjoKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICgiSW52YWxpZCBjaGFyYWN0ZXIgVSsleCIgJSBjaGFyKQorICAgICAgICAgICAgY2hhciA9IG9yZCgnPycpCisgICAgICAgIHBvcyA9IHBvcyAlIChsZW4oYmFzZSkgKyAxKQorICAgICAgICBiYXNlID0gYmFzZVs6cG9zXSArIHVuaWNocihjaGFyKSArIGJhc2VbcG9zOl0KKyAgICAgICAgYmlhcyA9IGFkYXB0KGRlbHRhLCAoZXh0cG9zID09IDApLCBsZW4oYmFzZSkpCisgICAgICAgIGV4dHBvcyA9IG5ld3BvcworICAgIHJldHVybiBiYXNlCisKK2RlZiBwdW55Y29kZV9kZWNvZGUodGV4dCwgZXJyb3JzKToKKyAgICBwb3MgPSB0ZXh0LnJmaW5kKCItIikKKyAgICBpZiBwb3MgPT0gLTE6CisgICAgICAgIGJhc2UgPSAiIgorICAgICAgICBleHRlbmRlZCA9IHRleHQKKyAgICBlbHNlOgorICAgICAgICBiYXNlID0gdGV4dFs6cG9zXQorICAgICAgICBleHRlbmRlZCA9IHRleHRbcG9zKzE6XQorICAgIGJhc2UgPSB1bmljb2RlKGJhc2UsICJhc2NpaSIsIGVycm9ycykKKyAgICBleHRlbmRlZCA9IGV4dGVuZGVkLnVwcGVyKCkKKyAgICByZXR1cm4gaW5zZXJ0aW9uX3NvcnQoYmFzZSwgZXh0ZW5kZWQsIGVycm9ycykKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgIGRlZiBlbmNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXMgPSBwdW55Y29kZV9lbmNvZGUoaW5wdXQpCisgICAgICAgIHJldHVybiByZXMsIGxlbihpbnB1dCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBpZiBlcnJvcnMgbm90IGluICgnc3RyaWN0JywgJ3JlcGxhY2UnLCAnaWdub3JlJyk6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycworICAgICAgICByZXMgPSBwdW55Y29kZV9kZWNvZGUoaW5wdXQsIGVycm9ycykKKyAgICAgICAgcmV0dXJuIHJlcywgbGVuKGlucHV0KQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gcHVueWNvZGVfZW5jb2RlKGlucHV0KQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBpZiBzZWxmLmVycm9ycyBub3QgaW4gKCdzdHJpY3QnLCAncmVwbGFjZScsICdpZ25vcmUnKToKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIlVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrc2VsZi5lcnJvcnMKKyAgICAgICAgcmV0dXJuIHB1bnljb2RlX2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ncHVueWNvZGUnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdW55Y29kZS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdW55Y29kZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5NDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B1bnljb2RlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdW55Y29kZS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9wdW55Y29kZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU5NDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3B1bnljb2RlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2ODNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3F1b3ByaV9jb2RlYy5weQpAQCAtMCwwICsxLDc1IEBACisiIiJDb2RlYyBmb3IgcXVvdGVkLXByaW50YWJsZSBlbmNvZGluZy4KKworTGlrZSBiYXNlNjQgYW5kIHJvdDEzLCB0aGlzIHJldHVybnMgUHl0aG9uIHN0cmluZ3MsIG5vdCBVbmljb2RlLgorIiIiCisKK2ltcG9ydCBjb2RlY3MsIHF1b3ByaQordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2RlZiBxdW9wcmlfZW5jb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgICIiIkVuY29kZSB0aGUgaW5wdXQsIHJldHVybmluZyBhIHR1cGxlIChvdXRwdXQgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICBlcnJvciBoYW5kbGluZyBmb3IgdGhpcyBjb2RlYy4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICAjIHVzaW5nIHN0cigpIGJlY2F1c2Ugb2YgY1N0cmluZ0lPJ3MgVW5pY29kZSB1bmRlc2lyZWQgVW5pY29kZSBiZWhhdmlvci4KKyAgICBmID0gU3RyaW5nSU8oc3RyKGlucHV0KSkKKyAgICBnID0gU3RyaW5nSU8oKQorICAgIHF1b3ByaS5lbmNvZGUoZiwgZywgMSkKKyAgICBvdXRwdXQgPSBnLmdldHZhbHVlKCkKKyAgICByZXR1cm4gKG91dHB1dCwgbGVuKGlucHV0KSkKKworZGVmIHF1b3ByaV9kZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgIiIiRGVjb2RlIHRoZSBpbnB1dCwgcmV0dXJuaW5nIGEgdHVwbGUgKG91dHB1dCBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgJ3N0cmljdCcgaGFuZGxpbmcgd2hpY2ggaXMgdGhlIG9ubHkgY3VycmVudGx5IHN1cHBvcnRlZAorICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIGYgPSBTdHJpbmdJTyhzdHIoaW5wdXQpKQorICAgIGcgPSBTdHJpbmdJTygpCisgICAgcXVvcHJpLmRlY29kZShmLCBnKQorICAgIG91dHB1dCA9IGcuZ2V0dmFsdWUoKQorICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gcXVvcHJpX2VuY29kZShpbnB1dCxlcnJvcnMpCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gcXVvcHJpX2RlY29kZShpbnB1dCxlcnJvcnMpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBxdW9wcmlfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIHF1b3ByaV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ncXVvcHJpJywKKyAgICAgICAgZW5jb2RlPXF1b3ByaV9lbmNvZGUsCisgICAgICAgIGRlY29kZT1xdW9wcmlfZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3F1b3ByaV9jb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MzRlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3F1b3ByaV9jb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNGU2MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9xdW9wcmlfY29kZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjkxOWI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcmF3X3VuaWNvZGVfZXNjYXBlLnB5CkBAIC0wLDAgKzEsNDUgQEAKKyIiIiBQeXRob24gJ3Jhdy11bmljb2RlLWVzY2FwZScgQ29kZWMKKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICAjIE5vdGU6IEJpbmRpbmcgdGhlc2UgYXMgQyBmdW5jdGlvbnMgd2lsbCByZXN1bHQgaW4gdGhlIGNsYXNzIG5vdAorICAgICMgY29udmVydGluZyB0aGVtIHRvIG1ldGhvZHMuIFRoaXMgaXMgaW50ZW5kZWQuCisgICAgZW5jb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3Jhdy11bmljb2RlLWVzY2FwZScsCisgICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcmF3X3VuaWNvZGVfZXNjYXBlLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyOWU3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvcmF3X3VuaWNvZGVfZXNjYXBlLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyOWU3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Jhd191bmljb2RlX2VzY2FwZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvcm90XzEzLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvcm90XzEzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYjY0MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yb3RfMTMucHkKQEAgLTAsMCArMSwxMTggQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiIFB5dGhvbiBDaGFyYWN0ZXIgTWFwcGluZyBDb2RlYyBmb3IgUk9UMTMuCisKKyAgICBTZWUgaHR0cDovL3Vjc3ViLmNvbG9yYWRvLmVkdS9+a29taW5lay9yb3QxMy8gZm9yIGRldGFpbHMuCisKKyAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworIiIiIyIKKworaW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsZXJyb3JzLGVuY29kaW5nX21hcCkKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LGVycm9ycyxkZWNvZGluZ19tYXApCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfbWFwKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmNoYXJtYXBfZGVjb2RlKGlucHV0LHNlbGYuZXJyb3JzLGRlY29kaW5nX21hcClbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdyb3QtMTMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAweDAwNDE6IDB4MDA0ZSwKKyAgIDB4MDA0MjogMHgwMDRmLAorICAgMHgwMDQzOiAweDAwNTAsCisgICAweDAwNDQ6IDB4MDA1MSwKKyAgIDB4MDA0NTogMHgwMDUyLAorICAgMHgwMDQ2OiAweDAwNTMsCisgICAweDAwNDc6IDB4MDA1NCwKKyAgIDB4MDA0ODogMHgwMDU1LAorICAgMHgwMDQ5OiAweDAwNTYsCisgICAweDAwNGE6IDB4MDA1NywKKyAgIDB4MDA0YjogMHgwMDU4LAorICAgMHgwMDRjOiAweDAwNTksCisgICAweDAwNGQ6IDB4MDA1YSwKKyAgIDB4MDA0ZTogMHgwMDQxLAorICAgMHgwMDRmOiAweDAwNDIsCisgICAweDAwNTA6IDB4MDA0MywKKyAgIDB4MDA1MTogMHgwMDQ0LAorICAgMHgwMDUyOiAweDAwNDUsCisgICAweDAwNTM6IDB4MDA0NiwKKyAgIDB4MDA1NDogMHgwMDQ3LAorICAgMHgwMDU1OiAweDAwNDgsCisgICAweDAwNTY6IDB4MDA0OSwKKyAgIDB4MDA1NzogMHgwMDRhLAorICAgMHgwMDU4OiAweDAwNGIsCisgICAweDAwNTk6IDB4MDA0YywKKyAgIDB4MDA1YTogMHgwMDRkLAorICAgMHgwMDYxOiAweDAwNmUsCisgICAweDAwNjI6IDB4MDA2ZiwKKyAgIDB4MDA2MzogMHgwMDcwLAorICAgMHgwMDY0OiAweDAwNzEsCisgICAweDAwNjU6IDB4MDA3MiwKKyAgIDB4MDA2NjogMHgwMDczLAorICAgMHgwMDY3OiAweDAwNzQsCisgICAweDAwNjg6IDB4MDA3NSwKKyAgIDB4MDA2OTogMHgwMDc2LAorICAgMHgwMDZhOiAweDAwNzcsCisgICAweDAwNmI6IDB4MDA3OCwKKyAgIDB4MDA2YzogMHgwMDc5LAorICAgMHgwMDZkOiAweDAwN2EsCisgICAweDAwNmU6IDB4MDA2MSwKKyAgIDB4MDA2ZjogMHgwMDYyLAorICAgMHgwMDcwOiAweDAwNjMsCisgICAweDAwNzE6IDB4MDA2NCwKKyAgIDB4MDA3MjogMHgwMDY1LAorICAgMHgwMDczOiAweDAwNjYsCisgICAweDAwNzQ6IDB4MDA2NywKKyAgIDB4MDA3NTogMHgwMDY4LAorICAgMHgwMDc2OiAweDAwNjksCisgICAweDAwNzc6IDB4MDA2YSwKKyAgIDB4MDA3ODogMHgwMDZiLAorICAgMHgwMDc5OiAweDAwNmMsCisgICAweDAwN2E6IDB4MDA2ZCwKK30pCisKKyMjIyBFbmNvZGluZyBNYXAKKworZW5jb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfZW5jb2RpbmdfbWFwKGRlY29kaW5nX21hcCkKKworIyMjIEZpbHRlciBBUEkKKworZGVmIHJvdDEzKGluZmlsZSwgb3V0ZmlsZSk6CisgICAgb3V0ZmlsZS53cml0ZShpbmZpbGUucmVhZCgpLmVuY29kZSgncm90LTEzJykpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHN5cworICAgIHJvdDEzKHN5cy5zdGRpbiwgc3lzLnN0ZG91dCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3JvdF8xMy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yb3RfMTMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNWJmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yb3RfMTMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3JvdF8xMy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yb3RfMTMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNWJmNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9yb3RfMTMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzM4MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyMKKyMgc2hpZnRfamlzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgU0hJRlRfSklTCisjCisjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgorIworCitpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYworCitjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppcycpCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdzaGlmdF9qaXMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXMucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ViMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXMucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2ViMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MWIxZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIHNoaWZ0X2ppc18yMDA0LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgU0hJRlRfSklTXzIwMDQKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnc2hpZnRfamlzXzIwMDQnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc2hpZnRfamlzXzIwMDQnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODllNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlODllNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNjUzZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weQpAQCAtMCwwICsxLDM5IEBACisjCisjIHNoaWZ0X2ppc3gwMjEzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgU0hJRlRfSklTWDAyMTMKKyMKKyMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+CisjCisKK2ltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCisKK2NvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnc2hpZnRfamlzeDAyMTMnKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQorICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc2hpZnRfamlzeDAyMTMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0ZTQxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg0ZTQxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zdHJpbmdfZXNjYXBlLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI5YTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weQpAQCAtMCwwICsxLDM4IEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCisiIiIgUHl0aG9uICdlc2NhcGUnIENvZGVjCisKKworV3JpdHRlbiBieSBNYXJ0aW4gdi4gTPZ3aXMgKG1hcnRpbkB2LmxvZXdpcy5kZSkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZW5jb2RlID0gY29kZWNzLmVzY2FwZV9lbmNvZGUKKyAgICBkZWNvZGUgPSBjb2RlY3MuZXNjYXBlX2RlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmVzY2FwZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLmVzY2FwZV9kZWNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nc3RyaW5nLWVzY2FwZScsCisgICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zdHJpbmdfZXNjYXBlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ2ZDZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy9zdHJpbmdfZXNjYXBlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjQ2ZDZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3Mvc3RyaW5nX2VzY2FwZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdGlzXzYyMC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Rpc182MjAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjZDIyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3Rpc182MjAucHkKQEAgLTAsMCArMSwzMDcgQEAKKyIiIiBQeXRob24gQ2hhcmFjdGVyIE1hcHBpbmcgQ29kZWMgdGlzXzYyMCBnZW5lcmF0ZWQgZnJvbSAncHl0aG9uLW1hcHBpbmdzL1RJUy02MjAuVFhUJyB3aXRoIGdlbmNvZGVjLnB5LgorCisiIiIjIgorCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICBkZWYgZW5jb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfdGFibGUpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfdGFibGUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZW5jb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMsZGVjb2RpbmdfdGFibGUpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndGlzLTYyMCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKKworCisjIyMgRGVjb2RpbmcgVGFibGUKKworZGVjb2RpbmdfdGFibGUgPSAoCisgICAgdSdceDAwJyAgICAgIyAgMHgwMCAtPiBOVUxMCisgICAgdSdceDAxJyAgICAgIyAgMHgwMSAtPiBTVEFSVCBPRiBIRUFESU5HCisgICAgdSdceDAyJyAgICAgIyAgMHgwMiAtPiBTVEFSVCBPRiBURVhUCisgICAgdSdceDAzJyAgICAgIyAgMHgwMyAtPiBFTkQgT0YgVEVYVAorICAgIHUnXHgwNCcgICAgICMgIDB4MDQgLT4gRU5EIE9GIFRSQU5TTUlTU0lPTgorICAgIHUnXHgwNScgICAgICMgIDB4MDUgLT4gRU5RVUlSWQorICAgIHUnXHgwNicgICAgICMgIDB4MDYgLT4gQUNLTk9XTEVER0UKKyAgICB1J1x4MDcnICAgICAjICAweDA3IC0+IEJFTEwKKyAgICB1J1x4MDgnICAgICAjICAweDA4IC0+IEJBQ0tTUEFDRQorICAgIHUnXHQnICAgICAgICMgIDB4MDkgLT4gSE9SSVpPTlRBTCBUQUJVTEFUSU9OCisgICAgdSdcbicgICAgICAgIyAgMHgwQSAtPiBMSU5FIEZFRUQKKyAgICB1J1x4MGInICAgICAjICAweDBCIC0+IFZFUlRJQ0FMIFRBQlVMQVRJT04KKyAgICB1J1x4MGMnICAgICAjICAweDBDIC0+IEZPUk0gRkVFRAorICAgIHUnXHInICAgICAgICMgIDB4MEQgLT4gQ0FSUklBR0UgUkVUVVJOCisgICAgdSdceDBlJyAgICAgIyAgMHgwRSAtPiBTSElGVCBPVVQKKyAgICB1J1x4MGYnICAgICAjICAweDBGIC0+IFNISUZUIElOCisgICAgdSdceDEwJyAgICAgIyAgMHgxMCAtPiBEQVRBIExJTksgRVNDQVBFCisgICAgdSdceDExJyAgICAgIyAgMHgxMSAtPiBERVZJQ0UgQ09OVFJPTCBPTkUKKyAgICB1J1x4MTInICAgICAjICAweDEyIC0+IERFVklDRSBDT05UUk9MIFRXTworICAgIHUnXHgxMycgICAgICMgIDB4MTMgLT4gREVWSUNFIENPTlRST0wgVEhSRUUKKyAgICB1J1x4MTQnICAgICAjICAweDE0IC0+IERFVklDRSBDT05UUk9MIEZPVVIKKyAgICB1J1x4MTUnICAgICAjICAweDE1IC0+IE5FR0FUSVZFIEFDS05PV0xFREdFCisgICAgdSdceDE2JyAgICAgIyAgMHgxNiAtPiBTWU5DSFJPTk9VUyBJRExFCisgICAgdSdceDE3JyAgICAgIyAgMHgxNyAtPiBFTkQgT0YgVFJBTlNNSVNTSU9OIEJMT0NLCisgICAgdSdceDE4JyAgICAgIyAgMHgxOCAtPiBDQU5DRUwKKyAgICB1J1x4MTknICAgICAjICAweDE5IC0+IEVORCBPRiBNRURJVU0KKyAgICB1J1x4MWEnICAgICAjICAweDFBIC0+IFNVQlNUSVRVVEUKKyAgICB1J1x4MWInICAgICAjICAweDFCIC0+IEVTQ0FQRQorICAgIHUnXHgxYycgICAgICMgIDB4MUMgLT4gRklMRSBTRVBBUkFUT1IKKyAgICB1J1x4MWQnICAgICAjICAweDFEIC0+IEdST1VQIFNFUEFSQVRPUgorICAgIHUnXHgxZScgICAgICMgIDB4MUUgLT4gUkVDT1JEIFNFUEFSQVRPUgorICAgIHUnXHgxZicgICAgICMgIDB4MUYgLT4gVU5JVCBTRVBBUkFUT1IKKyAgICB1JyAnICAgICAgICAjICAweDIwIC0+IFNQQUNFCisgICAgdSchJyAgICAgICAgIyAgMHgyMSAtPiBFWENMQU1BVElPTiBNQVJLCisgICAgdSciJyAgICAgICAgIyAgMHgyMiAtPiBRVU9UQVRJT04gTUFSSworICAgIHUnIycgICAgICAgICMgIDB4MjMgLT4gTlVNQkVSIFNJR04KKyAgICB1JyQnICAgICAgICAjICAweDI0IC0+IERPTExBUiBTSUdOCisgICAgdSclJyAgICAgICAgIyAgMHgyNSAtPiBQRVJDRU5UIFNJR04KKyAgICB1JyYnICAgICAgICAjICAweDI2IC0+IEFNUEVSU0FORAorICAgIHUiJyIgICAgICAgICMgIDB4MjcgLT4gQVBPU1RST1BIRQorICAgIHUnKCcgICAgICAgICMgIDB4MjggLT4gTEVGVCBQQVJFTlRIRVNJUworICAgIHUnKScgICAgICAgICMgIDB4MjkgLT4gUklHSFQgUEFSRU5USEVTSVMKKyAgICB1JyonICAgICAgICAjICAweDJBIC0+IEFTVEVSSVNLCisgICAgdScrJyAgICAgICAgIyAgMHgyQiAtPiBQTFVTIFNJR04KKyAgICB1JywnICAgICAgICAjICAweDJDIC0+IENPTU1BCisgICAgdSctJyAgICAgICAgIyAgMHgyRCAtPiBIWVBIRU4tTUlOVVMKKyAgICB1Jy4nICAgICAgICAjICAweDJFIC0+IEZVTEwgU1RPUAorICAgIHUnLycgICAgICAgICMgIDB4MkYgLT4gU09MSURVUworICAgIHUnMCcgICAgICAgICMgIDB4MzAgLT4gRElHSVQgWkVSTworICAgIHUnMScgICAgICAgICMgIDB4MzEgLT4gRElHSVQgT05FCisgICAgdScyJyAgICAgICAgIyAgMHgzMiAtPiBESUdJVCBUV08KKyAgICB1JzMnICAgICAgICAjICAweDMzIC0+IERJR0lUIFRIUkVFCisgICAgdSc0JyAgICAgICAgIyAgMHgzNCAtPiBESUdJVCBGT1VSCisgICAgdSc1JyAgICAgICAgIyAgMHgzNSAtPiBESUdJVCBGSVZFCisgICAgdSc2JyAgICAgICAgIyAgMHgzNiAtPiBESUdJVCBTSVgKKyAgICB1JzcnICAgICAgICAjICAweDM3IC0+IERJR0lUIFNFVkVOCisgICAgdSc4JyAgICAgICAgIyAgMHgzOCAtPiBESUdJVCBFSUdIVAorICAgIHUnOScgICAgICAgICMgIDB4MzkgLT4gRElHSVQgTklORQorICAgIHUnOicgICAgICAgICMgIDB4M0EgLT4gQ09MT04KKyAgICB1JzsnICAgICAgICAjICAweDNCIC0+IFNFTUlDT0xPTgorICAgIHUnPCcgICAgICAgICMgIDB4M0MgLT4gTEVTUy1USEFOIFNJR04KKyAgICB1Jz0nICAgICAgICAjICAweDNEIC0+IEVRVUFMUyBTSUdOCisgICAgdSc+JyAgICAgICAgIyAgMHgzRSAtPiBHUkVBVEVSLVRIQU4gU0lHTgorICAgIHUnPycgICAgICAgICMgIDB4M0YgLT4gUVVFU1RJT04gTUFSSworICAgIHUnQCcgICAgICAgICMgIDB4NDAgLT4gQ09NTUVSQ0lBTCBBVAorICAgIHUnQScgICAgICAgICMgIDB4NDEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQQorICAgIHUnQicgICAgICAgICMgIDB4NDIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQgorICAgIHUnQycgICAgICAgICMgIDB4NDMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworICAgIHUnRCcgICAgICAgICMgIDB4NDQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRAorICAgIHUnRScgICAgICAgICMgIDB4NDUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRQorICAgIHUnRicgICAgICAgICMgIDB4NDYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorICAgIHUnRycgICAgICAgICMgIDB4NDcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgRworICAgIHUnSCcgICAgICAgICMgIDB4NDggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSAorICAgIHUnSScgICAgICAgICMgIDB4NDkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorICAgIHUnSicgICAgICAgICMgIDB4NEEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSgorICAgIHUnSycgICAgICAgICMgIDB4NEIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgSworICAgIHUnTCcgICAgICAgICMgIDB4NEMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorICAgIHUnTScgICAgICAgICMgIDB4NEQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTQorICAgIHUnTicgICAgICAgICMgIDB4NEUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTgorICAgIHUnTycgICAgICAgICMgIDB4NEYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworICAgIHUnUCcgICAgICAgICMgIDB4NTAgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUAorICAgIHUnUScgICAgICAgICMgIDB4NTEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUQorICAgIHUnUicgICAgICAgICMgIDB4NTIgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorICAgIHUnUycgICAgICAgICMgIDB4NTMgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgUworICAgIHUnVCcgICAgICAgICMgIDB4NTQgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVAorICAgIHUnVScgICAgICAgICMgIDB4NTUgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorICAgIHUnVicgICAgICAgICMgIDB4NTYgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVgorICAgIHUnVycgICAgICAgICMgIDB4NTcgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgVworICAgIHUnWCcgICAgICAgICMgIDB4NTggLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorICAgIHUnWScgICAgICAgICMgIDB4NTkgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWQorICAgIHUnWicgICAgICAgICMgIDB4NUEgLT4gTEFUSU4gQ0FQSVRBTCBMRVRURVIgWgorICAgIHUnWycgICAgICAgICMgIDB4NUIgLT4gTEVGVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXFwnICAgICAgICMgIDB4NUMgLT4gUkVWRVJTRSBTT0xJRFVTCisgICAgdSddJyAgICAgICAgIyAgMHg1RCAtPiBSSUdIVCBTUVVBUkUgQlJBQ0tFVAorICAgIHUnXicgICAgICAgICMgIDB4NUUgLT4gQ0lSQ1VNRkxFWCBBQ0NFTlQKKyAgICB1J18nICAgICAgICAjICAweDVGIC0+IExPVyBMSU5FCisgICAgdSdgJyAgICAgICAgIyAgMHg2MCAtPiBHUkFWRSBBQ0NFTlQKKyAgICB1J2EnICAgICAgICAjICAweDYxIC0+IExBVElOIFNNQUxMIExFVFRFUiBBCisgICAgdSdiJyAgICAgICAgIyAgMHg2MiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgQgorICAgIHUnYycgICAgICAgICMgIDB4NjMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEMKKyAgICB1J2QnICAgICAgICAjICAweDY0IC0+IExBVElOIFNNQUxMIExFVFRFUiBECisgICAgdSdlJyAgICAgICAgIyAgMHg2NSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgRQorICAgIHUnZicgICAgICAgICMgIDB4NjYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEYKKyAgICB1J2cnICAgICAgICAjICAweDY3IC0+IExBVElOIFNNQUxMIExFVFRFUiBHCisgICAgdSdoJyAgICAgICAgIyAgMHg2OCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSAorICAgIHUnaScgICAgICAgICMgIDB4NjkgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEkKKyAgICB1J2onICAgICAgICAjICAweDZBIC0+IExBVElOIFNNQUxMIExFVFRFUiBKCisgICAgdSdrJyAgICAgICAgIyAgMHg2QiAtPiBMQVRJTiBTTUFMTCBMRVRURVIgSworICAgIHUnbCcgICAgICAgICMgIDB4NkMgLT4gTEFUSU4gU01BTEwgTEVUVEVSIEwKKyAgICB1J20nICAgICAgICAjICAweDZEIC0+IExBVElOIFNNQUxMIExFVFRFUiBNCisgICAgdSduJyAgICAgICAgIyAgMHg2RSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgTgorICAgIHUnbycgICAgICAgICMgIDB4NkYgLT4gTEFUSU4gU01BTEwgTEVUVEVSIE8KKyAgICB1J3AnICAgICAgICAjICAweDcwIC0+IExBVElOIFNNQUxMIExFVFRFUiBQCisgICAgdSdxJyAgICAgICAgIyAgMHg3MSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgUQorICAgIHUncicgICAgICAgICMgIDB4NzIgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFIKKyAgICB1J3MnICAgICAgICAjICAweDczIC0+IExBVElOIFNNQUxMIExFVFRFUiBTCisgICAgdSd0JyAgICAgICAgIyAgMHg3NCAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVAorICAgIHUndScgICAgICAgICMgIDB4NzUgLT4gTEFUSU4gU01BTEwgTEVUVEVSIFUKKyAgICB1J3YnICAgICAgICAjICAweDc2IC0+IExBVElOIFNNQUxMIExFVFRFUiBWCisgICAgdSd3JyAgICAgICAgIyAgMHg3NyAtPiBMQVRJTiBTTUFMTCBMRVRURVIgVworICAgIHUneCcgICAgICAgICMgIDB4NzggLT4gTEFUSU4gU01BTEwgTEVUVEVSIFgKKyAgICB1J3knICAgICAgICAjICAweDc5IC0+IExBVElOIFNNQUxMIExFVFRFUiBZCisgICAgdSd6JyAgICAgICAgIyAgMHg3QSAtPiBMQVRJTiBTTUFMTCBMRVRURVIgWgorICAgIHUneycgICAgICAgICMgIDB4N0IgLT4gTEVGVCBDVVJMWSBCUkFDS0VUCisgICAgdSd8JyAgICAgICAgIyAgMHg3QyAtPiBWRVJUSUNBTCBMSU5FCisgICAgdSd9JyAgICAgICAgIyAgMHg3RCAtPiBSSUdIVCBDVVJMWSBCUkFDS0VUCisgICAgdSd+JyAgICAgICAgIyAgMHg3RSAtPiBUSUxERQorICAgIHUnXHg3ZicgICAgICMgIDB4N0YgLT4gREVMRVRFCisgICAgdSdceDgwJyAgICAgIyAgMHg4MCAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODEnICAgICAjICAweDgxIC0+IDxjb250cm9sPgorICAgIHUnXHg4MicgICAgICMgIDB4ODIgLT4gPGNvbnRyb2w+CisgICAgdSdceDgzJyAgICAgIyAgMHg4MyAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODQnICAgICAjICAweDg0IC0+IDxjb250cm9sPgorICAgIHUnXHg4NScgICAgICMgIDB4ODUgLT4gPGNvbnRyb2w+CisgICAgdSdceDg2JyAgICAgIyAgMHg4NiAtPiA8Y29udHJvbD4KKyAgICB1J1x4ODcnICAgICAjICAweDg3IC0+IDxjb250cm9sPgorICAgIHUnXHg4OCcgICAgICMgIDB4ODggLT4gPGNvbnRyb2w+CisgICAgdSdceDg5JyAgICAgIyAgMHg4OSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGEnICAgICAjICAweDhBIC0+IDxjb250cm9sPgorICAgIHUnXHg4YicgICAgICMgIDB4OEIgLT4gPGNvbnRyb2w+CisgICAgdSdceDhjJyAgICAgIyAgMHg4QyAtPiA8Y29udHJvbD4KKyAgICB1J1x4OGQnICAgICAjICAweDhEIC0+IDxjb250cm9sPgorICAgIHUnXHg4ZScgICAgICMgIDB4OEUgLT4gPGNvbnRyb2w+CisgICAgdSdceDhmJyAgICAgIyAgMHg4RiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTAnICAgICAjICAweDkwIC0+IDxjb250cm9sPgorICAgIHUnXHg5MScgICAgICMgIDB4OTEgLT4gPGNvbnRyb2w+CisgICAgdSdceDkyJyAgICAgIyAgMHg5MiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTMnICAgICAjICAweDkzIC0+IDxjb250cm9sPgorICAgIHUnXHg5NCcgICAgICMgIDB4OTQgLT4gPGNvbnRyb2w+CisgICAgdSdceDk1JyAgICAgIyAgMHg5NSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTYnICAgICAjICAweDk2IC0+IDxjb250cm9sPgorICAgIHUnXHg5NycgICAgICMgIDB4OTcgLT4gPGNvbnRyb2w+CisgICAgdSdceDk4JyAgICAgIyAgMHg5OCAtPiA8Y29udHJvbD4KKyAgICB1J1x4OTknICAgICAjICAweDk5IC0+IDxjb250cm9sPgorICAgIHUnXHg5YScgICAgICMgIDB4OUEgLT4gPGNvbnRyb2w+CisgICAgdSdceDliJyAgICAgIyAgMHg5QiAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWMnICAgICAjICAweDlDIC0+IDxjb250cm9sPgorICAgIHUnXHg5ZCcgICAgICMgIDB4OUQgLT4gPGNvbnRyb2w+CisgICAgdSdceDllJyAgICAgIyAgMHg5RSAtPiA8Y29udHJvbD4KKyAgICB1J1x4OWYnICAgICAjICAweDlGIC0+IDxjb250cm9sPgorICAgIHUnXHVmZmZlJworICAgIHUnXHUwZTAxJyAgICMgIDB4QTEgLT4gVEhBSSBDSEFSQUNURVIgS08gS0FJCisgICAgdSdcdTBlMDInICAgIyAgMHhBMiAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hBSQorICAgIHUnXHUwZTAzJyAgICMgIDB4QTMgLT4gVEhBSSBDSEFSQUNURVIgS0hPIEtIVUFUCisgICAgdSdcdTBlMDQnICAgIyAgMHhBNCAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gS0hXQUkKKyAgICB1J1x1MGUwNScgICAjICAweEE1IC0+IFRIQUkgQ0hBUkFDVEVSIEtITyBLSE9OCisgICAgdSdcdTBlMDYnICAgIyAgMHhBNiAtPiBUSEFJIENIQVJBQ1RFUiBLSE8gUkFLSEFORworICAgIHUnXHUwZTA3JyAgICMgIDB4QTcgLT4gVEhBSSBDSEFSQUNURVIgTkdPIE5HVQorICAgIHUnXHUwZTA4JyAgICMgIDB4QTggLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENIQU4KKyAgICB1J1x1MGUwOScgICAjICAweEE5IC0+IFRIQUkgQ0hBUkFDVEVSIENITyBDSElORworICAgIHUnXHUwZTBhJyAgICMgIDB4QUEgLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENIQU5HCisgICAgdSdcdTBlMGInICAgIyAgMHhBQiAtPiBUSEFJIENIQVJBQ1RFUiBTTyBTTworICAgIHUnXHUwZTBjJyAgICMgIDB4QUMgLT4gVEhBSSBDSEFSQUNURVIgQ0hPIENIT0UKKyAgICB1J1x1MGUwZCcgICAjICAweEFEIC0+IFRIQUkgQ0hBUkFDVEVSIFlPIFlJTkcKKyAgICB1J1x1MGUwZScgICAjICAweEFFIC0+IFRIQUkgQ0hBUkFDVEVSIERPIENIQURBCisgICAgdSdcdTBlMGYnICAgIyAgMHhBRiAtPiBUSEFJIENIQVJBQ1RFUiBUTyBQQVRBSworICAgIHUnXHUwZTEwJyAgICMgIDB4QjAgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIQU4KKyAgICB1J1x1MGUxMScgICAjICAweEIxIC0+IFRIQUkgQ0hBUkFDVEVSIFRITyBOQU5HTU9OVEhPCisgICAgdSdcdTBlMTInICAgIyAgMHhCMiAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gUEhVVEhBTworICAgIHUnXHUwZTEzJyAgICMgIDB4QjMgLT4gVEhBSSBDSEFSQUNURVIgTk8gTkVOCisgICAgdSdcdTBlMTQnICAgIyAgMHhCNCAtPiBUSEFJIENIQVJBQ1RFUiBETyBERUsKKyAgICB1J1x1MGUxNScgICAjICAweEI1IC0+IFRIQUkgQ0hBUkFDVEVSIFRPIFRBTworICAgIHUnXHUwZTE2JyAgICMgIDB4QjYgLT4gVEhBSSBDSEFSQUNURVIgVEhPIFRIVU5HCisgICAgdSdcdTBlMTcnICAgIyAgMHhCNyAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhBSEFOCisgICAgdSdcdTBlMTgnICAgIyAgMHhCOCAtPiBUSEFJIENIQVJBQ1RFUiBUSE8gVEhPTkcKKyAgICB1J1x1MGUxOScgICAjICAweEI5IC0+IFRIQUkgQ0hBUkFDVEVSIE5PIE5VCisgICAgdSdcdTBlMWEnICAgIyAgMHhCQSAtPiBUSEFJIENIQVJBQ1RFUiBCTyBCQUlNQUkKKyAgICB1J1x1MGUxYicgICAjICAweEJCIC0+IFRIQUkgQ0hBUkFDVEVSIFBPIFBMQQorICAgIHUnXHUwZTFjJyAgICMgIDB4QkMgLT4gVEhBSSBDSEFSQUNURVIgUEhPIFBIVU5HCisgICAgdSdcdTBlMWQnICAgIyAgMHhCRCAtPiBUSEFJIENIQVJBQ1RFUiBGTyBGQQorICAgIHUnXHUwZTFlJyAgICMgIDB4QkUgLT4gVEhBSSBDSEFSQUNURVIgUEhPIFBIQU4KKyAgICB1J1x1MGUxZicgICAjICAweEJGIC0+IFRIQUkgQ0hBUkFDVEVSIEZPIEZBTgorICAgIHUnXHUwZTIwJyAgICMgIDB4QzAgLT4gVEhBSSBDSEFSQUNURVIgUEhPIFNBTVBIQU8KKyAgICB1J1x1MGUyMScgICAjICAweEMxIC0+IFRIQUkgQ0hBUkFDVEVSIE1PIE1BCisgICAgdSdcdTBlMjInICAgIyAgMHhDMiAtPiBUSEFJIENIQVJBQ1RFUiBZTyBZQUsKKyAgICB1J1x1MGUyMycgICAjICAweEMzIC0+IFRIQUkgQ0hBUkFDVEVSIFJPIFJVQQorICAgIHUnXHUwZTI0JyAgICMgIDB4QzQgLT4gVEhBSSBDSEFSQUNURVIgUlUKKyAgICB1J1x1MGUyNScgICAjICAweEM1IC0+IFRIQUkgQ0hBUkFDVEVSIExPIExJTkcKKyAgICB1J1x1MGUyNicgICAjICAweEM2IC0+IFRIQUkgQ0hBUkFDVEVSIExVCisgICAgdSdcdTBlMjcnICAgIyAgMHhDNyAtPiBUSEFJIENIQVJBQ1RFUiBXTyBXQUVOCisgICAgdSdcdTBlMjgnICAgIyAgMHhDOCAtPiBUSEFJIENIQVJBQ1RFUiBTTyBTQUxBCisgICAgdSdcdTBlMjknICAgIyAgMHhDOSAtPiBUSEFJIENIQVJBQ1RFUiBTTyBSVVNJCisgICAgdSdcdTBlMmEnICAgIyAgMHhDQSAtPiBUSEFJIENIQVJBQ1RFUiBTTyBTVUEKKyAgICB1J1x1MGUyYicgICAjICAweENCIC0+IFRIQUkgQ0hBUkFDVEVSIEhPIEhJUAorICAgIHUnXHUwZTJjJyAgICMgIDB4Q0MgLT4gVEhBSSBDSEFSQUNURVIgTE8gQ0hVTEEKKyAgICB1J1x1MGUyZCcgICAjICAweENEIC0+IFRIQUkgQ0hBUkFDVEVSIE8gQU5HCisgICAgdSdcdTBlMmUnICAgIyAgMHhDRSAtPiBUSEFJIENIQVJBQ1RFUiBITyBOT0tIVUsKKyAgICB1J1x1MGUyZicgICAjICAweENGIC0+IFRIQUkgQ0hBUkFDVEVSIFBBSVlBTk5PSQorICAgIHUnXHUwZTMwJyAgICMgIDB4RDAgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBCisgICAgdSdcdTBlMzEnICAgIyAgMHhEMSAtPiBUSEFJIENIQVJBQ1RFUiBNQUkgSEFOLUFLQVQKKyAgICB1J1x1MGUzMicgICAjICAweEQyIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUEKKyAgICB1J1x1MGUzMycgICAjICAweEQzIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQU0KKyAgICB1J1x1MGUzNCcgICAjICAweEQ0IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgSQorICAgIHUnXHUwZTM1JyAgICMgIDB4RDUgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBJSQorICAgIHUnXHUwZTM2JyAgICMgIDB4RDYgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVRQorICAgIHUnXHUwZTM3JyAgICMgIDB4RDcgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVRUUKKyAgICB1J1x1MGUzOCcgICAjICAweEQ4IC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgVQorICAgIHUnXHUwZTM5JyAgICMgIDB4RDkgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBVVQorICAgIHUnXHUwZTNhJyAgICMgIDB4REEgLT4gVEhBSSBDSEFSQUNURVIgUEhJTlRIVQorICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHUwZTNmJyAgICMgIDB4REYgLT4gVEhBSSBDVVJSRU5DWSBTWU1CT0wgQkFIVAorICAgIHUnXHUwZTQwJyAgICMgIDB4RTAgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBFCisgICAgdSdcdTBlNDEnICAgIyAgMHhFMSAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIEFFCisgICAgdSdcdTBlNDInICAgIyAgMHhFMiAtPiBUSEFJIENIQVJBQ1RFUiBTQVJBIE8KKyAgICB1J1x1MGU0MycgICAjICAweEUzIC0+IFRIQUkgQ0hBUkFDVEVSIFNBUkEgQUkgTUFJTVVBTgorICAgIHUnXHUwZTQ0JyAgICMgIDB4RTQgLT4gVEhBSSBDSEFSQUNURVIgU0FSQSBBSSBNQUlNQUxBSQorICAgIHUnXHUwZTQ1JyAgICMgIDB4RTUgLT4gVEhBSSBDSEFSQUNURVIgTEFLS0hBTkdZQU8KKyAgICB1J1x1MGU0NicgICAjICAweEU2IC0+IFRIQUkgQ0hBUkFDVEVSIE1BSVlBTU9LCisgICAgdSdcdTBlNDcnICAgIyAgMHhFNyAtPiBUSEFJIENIQVJBQ1RFUiBNQUlUQUlLSFUKKyAgICB1J1x1MGU0OCcgICAjICAweEU4IC0+IFRIQUkgQ0hBUkFDVEVSIE1BSSBFSworICAgIHUnXHUwZTQ5JyAgICMgIDB4RTkgLT4gVEhBSSBDSEFSQUNURVIgTUFJIFRITworICAgIHUnXHUwZTRhJyAgICMgIDB4RUEgLT4gVEhBSSBDSEFSQUNURVIgTUFJIFRSSQorICAgIHUnXHUwZTRiJyAgICMgIDB4RUIgLT4gVEhBSSBDSEFSQUNURVIgTUFJIENIQVRUQVdBCisgICAgdSdcdTBlNGMnICAgIyAgMHhFQyAtPiBUSEFJIENIQVJBQ1RFUiBUSEFOVEhBS0hBVAorICAgIHUnXHUwZTRkJyAgICMgIDB4RUQgLT4gVEhBSSBDSEFSQUNURVIgTklLSEFISVQKKyAgICB1J1x1MGU0ZScgICAjICAweEVFIC0+IFRIQUkgQ0hBUkFDVEVSIFlBTUFLS0FOCisgICAgdSdcdTBlNGYnICAgIyAgMHhFRiAtPiBUSEFJIENIQVJBQ1RFUiBGT05HTUFOCisgICAgdSdcdTBlNTAnICAgIyAgMHhGMCAtPiBUSEFJIERJR0lUIFpFUk8KKyAgICB1J1x1MGU1MScgICAjICAweEYxIC0+IFRIQUkgRElHSVQgT05FCisgICAgdSdcdTBlNTInICAgIyAgMHhGMiAtPiBUSEFJIERJR0lUIFRXTworICAgIHUnXHUwZTUzJyAgICMgIDB4RjMgLT4gVEhBSSBESUdJVCBUSFJFRQorICAgIHUnXHUwZTU0JyAgICMgIDB4RjQgLT4gVEhBSSBESUdJVCBGT1VSCisgICAgdSdcdTBlNTUnICAgIyAgMHhGNSAtPiBUSEFJIERJR0lUIEZJVkUKKyAgICB1J1x1MGU1NicgICAjICAweEY2IC0+IFRIQUkgRElHSVQgU0lYCisgICAgdSdcdTBlNTcnICAgIyAgMHhGNyAtPiBUSEFJIERJR0lUIFNFVkVOCisgICAgdSdcdTBlNTgnICAgIyAgMHhGOCAtPiBUSEFJIERJR0lUIEVJR0hUCisgICAgdSdcdTBlNTknICAgIyAgMHhGOSAtPiBUSEFJIERJR0lUIE5JTkUKKyAgICB1J1x1MGU1YScgICAjICAweEZBIC0+IFRIQUkgQ0hBUkFDVEVSIEFOR0tIQU5LSFUKKyAgICB1J1x1MGU1YicgICAjICAweEZCIC0+IFRIQUkgQ0hBUkFDVEVSIEtIT01VVAorICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworICAgIHUnXHVmZmZlJworKQorCisjIyMgRW5jb2RpbmcgdGFibGUKK2VuY29kaW5nX3RhYmxlPWNvZGVjcy5jaGFybWFwX2J1aWxkKGRlY29kaW5nX3RhYmxlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdGlzXzYyMC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy90aXNfNjIwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU4OTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdGlzXzYyMC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdGlzXzYyMC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy90aXNfNjIwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWU4OTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdGlzXzYyMC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5kZWZpbmVkLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5kZWZpbmVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OTAyODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmRlZmluZWQucHkKQEAgLTAsMCArMSw0OSBAQAorIiIiIFB5dGhvbiAndW5kZWZpbmVkJyBDb2RlYworCisgICAgVGhpcyBjb2RlYyB3aWxsIGFsd2F5cyByYWlzZSBhIFZhbHVlRXJyb3IgZXhjZXB0aW9uIHdoZW4gYmVpbmcKKyAgICB1c2VkLiBJdCBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSBzaXRlLnB5IGZpbGUgdG8gc3dpdGNoIG9mZgorICAgIGF1dG9tYXRpYyBzdHJpbmcgdG8gVW5pY29kZSBjb2VyY2lvbi4KKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigidW5kZWZpbmVkIGVuY29kaW5nIikKKworICAgIGRlZiBkZWNvZGUoc2VsZixpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoInVuZGVmaW5lZCBlbmNvZGluZyIpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigidW5kZWZpbmVkIGVuY29kaW5nIikKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJ1bmRlZmluZWQgZW5jb2RpbmciKQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3VuZGVmaW5lZCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuZGVmaW5lZC5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmRlZmluZWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWNkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmRlZmluZWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuZGVmaW5lZC5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmRlZmluZWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWNkNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmRlZmluZWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfZXNjYXBlLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9lc2NhcGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3ZjkzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfZXNjYXBlLnB5CkBAIC0wLDAgKzEsNDUgQEAKKyIiIiBQeXRob24gJ3VuaWNvZGUtZXNjYXBlJyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworY2xhc3MgQ29kZWMoY29kZWNzLkNvZGVjKToKKworICAgICMgTm90ZTogQmluZGluZyB0aGVzZSBhcyBDIGZ1bmN0aW9ucyB3aWxsIHJlc3VsdCBpbiB0aGUgY2xhc3Mgbm90CisgICAgIyBjb252ZXJ0aW5nIHRoZW0gdG8gbWV0aG9kcy4gVGhpcyBpcyBpbnRlbmRlZC4KKyAgICBlbmNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2RlY29kZQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1bmljb2RlLWVzY2FwZScsCisgICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9lc2NhcGUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9lc2NhcGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDliYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2VzY2FwZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9lc2NhcGUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9lc2NhcGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDliYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2VzY2FwZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdW5pY29kZV9pbnRlcm5hbC5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfaW50ZXJuYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzZTc3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfaW50ZXJuYWwucHkKQEAgLTAsMCArMSw0NSBAQAorIiIiIFB5dGhvbiAndW5pY29kZS1pbnRlcm5hbCcgQ29kZWMKKworCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2NsYXNzIENvZGVjKGNvZGVjcy5Db2RlYyk6CisKKyAgICAjIE5vdGU6IEJpbmRpbmcgdGhlc2UgYXMgQyBmdW5jdGlvbnMgd2lsbCByZXN1bHQgaW4gdGhlIGNsYXNzIG5vdAorICAgICMgY29udmVydGluZyB0aGVtIHRvIG1ldGhvZHMuIFRoaXMgaXMgaW50ZW5kZWQuCisgICAgZW5jb2RlID0gY29kZWNzLnVuaWNvZGVfaW50ZXJuYWxfZW5jb2RlCisgICAgZGVjb2RlID0gY29kZWNzLnVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MudW5pY29kZV9pbnRlcm5hbF9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnVuaWNvZGVfaW50ZXJuYWxfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIHBhc3MKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIHBhc3MKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1bmljb2RlLWludGVybmFsJywKKyAgICAgICAgZW5jb2RlPUNvZGVjLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfaW50ZXJuYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDJmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3VuaWNvZGVfaW50ZXJuYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZDJmNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91bmljb2RlX2ludGVybmFsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTYucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmYWRmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNi5weQpAQCAtMCwwICsxLDEyNiBAQAorIiIiIFB5dGhvbiAndXRmLTE2JyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MsIHN5cworCisjIyMgQ29kZWMgQVBJcworCitlbmNvZGUgPSBjb2RlY3MudXRmXzE2X2VuY29kZQorCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBjb2RlY3MudXRmXzE2X2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmVuY29kZXIgPSBOb25lCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIGlmIHNlbGYuZW5jb2RlciBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gY29kZWNzLnV0Zl8xNl9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzE2X2xlX2VuY29kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzE2X2JlX2VuY29kZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGVyKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmVuY29kZXIgPSBOb25lCisKKyAgICBkZWYgZ2V0c3RhdGUoc2VsZik6CisgICAgICAgICMgc3RhdGUgaW5mbyB3ZSByZXR1cm4gdG8gdGhlIGNhbGxlcjoKKyAgICAgICAgIyAwOiBzdHJlYW0gaXMgaW4gbmF0dXJhbCBvcmRlciBmb3IgdGhpcyBwbGF0Zm9ybQorICAgICAgICAjIDI6IGVuZGlhbm5lc3MgaGFzbid0IGJlZW4gZGV0ZXJtaW5lZCB5ZXQKKyAgICAgICAgIyAod2UncmUgbmV2ZXIgd3JpdGluZyBpbiB1bm5hdHVyYWwgb3JkZXIpCisgICAgICAgIHJldHVybiAoMiBpZiBzZWxmLmVuY29kZXIgaXMgTm9uZSBlbHNlIDApCisKKyAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8xNl9sZV9lbmNvZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8xNl9iZV9lbmNvZGUKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlci5fX2luaXRfXyhzZWxmLCBlcnJvcnMpCisgICAgICAgIHNlbGYuZGVjb2RlciA9IE5vbmUKKworICAgIGRlZiBfYnVmZmVyX2RlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzLCBmaW5hbCk6CisgICAgICAgIGlmIHNlbGYuZGVjb2RlciBpcyBOb25lOgorICAgICAgICAgICAgKG91dHB1dCwgY29uc3VtZWQsIGJ5dGVvcmRlcikgPSBcCisgICAgICAgICAgICAgICAgY29kZWNzLnV0Zl8xNl9leF9kZWNvZGUoaW5wdXQsIGVycm9ycywgMCwgZmluYWwpCisgICAgICAgICAgICBpZiBieXRlb3JkZXIgPT0gLTE6CisgICAgICAgICAgICAgICAgc2VsZi5kZWNvZGVyID0gY29kZWNzLnV0Zl8xNl9sZV9kZWNvZGUKKyAgICAgICAgICAgIGVsaWYgYnl0ZW9yZGVyID09IDE6CisgICAgICAgICAgICAgICAgc2VsZi5kZWNvZGVyID0gY29kZWNzLnV0Zl8xNl9iZV9kZWNvZGUKKyAgICAgICAgICAgIGVsaWYgY29uc3VtZWQgPj0gMjoKKyAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVURi0xNiBzdHJlYW0gZG9lcyBub3Qgc3RhcnQgd2l0aCBCT00iKQorICAgICAgICAgICAgcmV0dXJuIChvdXRwdXQsIGNvbnN1bWVkKQorICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGVyKGlucHV0LCBzZWxmLmVycm9ycywgZmluYWwpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmRlY29kZXIgPSBOb25lCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQorICAgICAgICBzZWxmLmVuY29kZXIgPSBOb25lCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgaWYgc2VsZi5lbmNvZGVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXN1bHQgPSBjb2RlY3MudXRmXzE2X2VuY29kZShpbnB1dCwgZXJyb3JzKQorICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzE2X2xlX2VuY29kZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBjb2RlY3MudXRmXzE2X2JlX2VuY29kZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlcihpbnB1dCwgZXJyb3JzKQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIucmVzZXQoc2VsZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuZGVjb2RlCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIChvYmplY3QsIGNvbnN1bWVkLCBieXRlb3JkZXIpID0gXAorICAgICAgICAgICAgY29kZWNzLnV0Zl8xNl9leF9kZWNvZGUoaW5wdXQsIGVycm9ycywgMCwgRmFsc2UpCisgICAgICAgIGlmIGJ5dGVvcmRlciA9PSAtMToKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlID0gY29kZWNzLnV0Zl8xNl9sZV9kZWNvZGUKKyAgICAgICAgZWxpZiBieXRlb3JkZXIgPT0gMToKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlID0gY29kZWNzLnV0Zl8xNl9iZV9kZWNvZGUKKyAgICAgICAgZWxpZiBjb25zdW1lZD49MjoKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwiVVRGLTE2IHN0cmVhbSBkb2VzIG5vdCBzdGFydCB3aXRoIEJPTSIKKyAgICAgICAgcmV0dXJuIChvYmplY3QsIGNvbnN1bWVkKQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V0Zi0xNicsCisgICAgICAgIGVuY29kZT1lbmNvZGUsCisgICAgICAgIGRlY29kZT1kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYzMGEwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YjQ1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfYmUucHkKQEAgLTAsMCArMSw0MiBAQAorIiIiIFB5dGhvbiAndXRmLTE2LWJlJyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gY29kZWNzLnV0Zl8xNl9iZV9lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gY29kZWNzLnV0Zl8xNl9iZV9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBlbmNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGNvZGVjcy51dGZfMTZfYmVfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgX2J1ZmZlcl9kZWNvZGUgPSBjb2RlY3MudXRmXzE2X2JlX2RlY29kZQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgZW5jb2RlID0gY29kZWNzLnV0Zl8xNl9iZV9lbmNvZGUKKworY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGRlY29kZSA9IGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndXRmLTE2LWJlJywKKyAgICAgICAgZW5jb2RlPWVuY29kZSwKKyAgICAgICAgZGVjb2RlPWRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfYmUucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY3NGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfYmUucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTY3NGFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzE2X2JlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NTQxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9sZS5weQpAQCAtMCwwICsxLDQyIEBACisiIiIgUHl0aG9uICd1dGYtMTYtbGUnIENvZGVjCisKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgQ05SSSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gTk8gV0FSUkFOVFkuCisKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitlbmNvZGUgPSBjb2RlY3MudXRmXzE2X2xlX2VuY29kZQorCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBjb2RlY3MudXRmXzE2X2xlX2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl8xNl9sZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBfYnVmZmVyX2RlY29kZSA9IGNvZGVjcy51dGZfMTZfbGVfZGVjb2RlCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBjb2RlY3MudXRmXzE2X2xlX2VuY29kZQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgZGVjb2RlID0gY29kZWNzLnV0Zl8xNl9sZV9kZWNvZGUKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1dGYtMTYtbGUnLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9sZS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDBlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8xNl9sZS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDBlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMTZfbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMi5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgwMTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyLnB5CkBAIC0wLDAgKzEsMTUwIEBACisiIiIKK1B5dGhvbiAndXRmLTMyJyBDb2RlYworIiIiCitpbXBvcnQgY29kZWNzLCBzeXMKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gY29kZWNzLnV0Zl8zMl9lbmNvZGUKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICByZXR1cm4gY29kZWNzLnV0Zl8zMl9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKworY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBpZiBzZWxmLmVuY29kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvZGVjcy51dGZfMzJfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8zMl9sZV9lbmNvZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5lbmNvZGVyID0gY29kZWNzLnV0Zl8zMl9iZV9lbmNvZGUKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlcihpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5lbmNvZGVyID0gTm9uZQorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAjIHN0YXRlIGluZm8gd2UgcmV0dXJuIHRvIHRoZSBjYWxsZXI6CisgICAgICAgICMgMDogc3RyZWFtIGlzIGluIG5hdHVyYWwgb3JkZXIgZm9yIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgIyAyOiBlbmRpYW5uZXNzIGhhc24ndCBiZWVuIGRldGVybWluZWQgeWV0CisgICAgICAgICMgKHdlJ3JlIG5ldmVyIHdyaXRpbmcgaW4gdW5uYXR1cmFsIG9yZGVyKQorICAgICAgICByZXR1cm4gKDIgaWYgc2VsZi5lbmNvZGVyIGlzIE5vbmUgZWxzZSAwKQorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgaWYgc3RhdGU6CisgICAgICAgICAgICBzZWxmLmVuY29kZXIgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMzJfbGVfZW5jb2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMzJfYmVfZW5jb2RlCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmRlY29kZXIgPSBOb25lCisKKyAgICBkZWYgX2J1ZmZlcl9kZWNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICBpZiBzZWxmLmRlY29kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIChvdXRwdXQsIGNvbnN1bWVkLCBieXRlb3JkZXIpID0gXAorICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfZXhfZGVjb2RlKGlucHV0LCBlcnJvcnMsIDAsIGZpbmFsKQorICAgICAgICAgICAgaWYgYnl0ZW9yZGVyID09IC0xOgorICAgICAgICAgICAgICAgIHNlbGYuZGVjb2RlciA9IGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlCisgICAgICAgICAgICBlbGlmIGJ5dGVvcmRlciA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuZGVjb2RlciA9IGNvZGVjcy51dGZfMzJfYmVfZGVjb2RlCisgICAgICAgICAgICBlbGlmIGNvbnN1bWVkID49IDQ6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJVVEYtMzIgc3RyZWFtIGRvZXMgbm90IHN0YXJ0IHdpdGggQk9NIikKKyAgICAgICAgICAgIHJldHVybiAob3V0cHV0LCBjb25zdW1lZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGVjb2RlcihpbnB1dCwgc2VsZi5lcnJvcnMsIGZpbmFsKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5kZWNvZGVyID0gTm9uZQorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAjIGFkZGl0b25hbCBzdGF0ZSBpbmZvIGZyb20gdGhlIGJhc2UgY2xhc3MgbXVzdCBiZSBOb25lIGhlcmUsCisgICAgICAgICMgYXMgaXQgaXNuJ3QgcGFzc2VkIGFsb25nIHRvIHRoZSBjYWxsZXIKKyAgICAgICAgc3RhdGUgPSBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIuZ2V0c3RhdGUoc2VsZilbMF0KKyAgICAgICAgIyBhZGRpdGlvbmFsIHN0YXRlIGluZm8gd2UgcGFzcyB0byB0aGUgY2FsbGVyOgorICAgICAgICAjIDA6IHN0cmVhbSBpcyBpbiBuYXR1cmFsIG9yZGVyIGZvciB0aGlzIHBsYXRmb3JtCisgICAgICAgICMgMTogc3RyZWFtIGlzIGluIHVubmF0dXJhbCBvcmRlcgorICAgICAgICAjIDI6IGVuZGlhbm5lc3MgaGFzbid0IGJlZW4gZGV0ZXJtaW5lZCB5ZXQKKyAgICAgICAgaWYgc2VsZi5kZWNvZGVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gKHN0YXRlLCAyKQorICAgICAgICBhZGRzdGF0ZSA9IGludCgoc3lzLmJ5dGVvcmRlciA9PSAiYmlnIikgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuZGVjb2RlciBpcyBjb2RlY3MudXRmXzMyX2JlX2RlY29kZSkpCisgICAgICAgIHJldHVybiAoc3RhdGUsIGFkZHN0YXRlKQorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgIyBzdGF0ZVsxXSB3aWxsIGJlIGlnbm9yZWQgYnkgQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIuc2V0c3RhdGUoKQorICAgICAgICBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIuc2V0c3RhdGUoc2VsZiwgc3RhdGUpCisgICAgICAgIHN0YXRlID0gc3RhdGVbMV0KKyAgICAgICAgaWYgc3RhdGUgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlciA9IChjb2RlY3MudXRmXzMyX2JlX2RlY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImJpZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlKQorICAgICAgICBlbGlmIHN0YXRlID09IDE6CisgICAgICAgICAgICBzZWxmLmRlY29kZXIgPSAoY29kZWNzLnV0Zl8zMl9sZV9kZWNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJiaWciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBjb2RlY3MudXRmXzMyX2JlX2RlY29kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlciA9IE5vbmUKKworY2xhc3MgU3RyZWFtV3JpdGVyKGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHNlbGYuZW5jb2RlciA9IE5vbmUKKyAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmVuY29kZXIgPSBOb25lCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBpZiBzZWxmLmVuY29kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IGNvZGVjcy51dGZfMzJfZW5jb2RlKGlucHV0LCBlcnJvcnMpCisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMzJfbGVfZW5jb2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZW5jb2RlciA9IGNvZGVjcy51dGZfMzJfYmVfZW5jb2RlCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGVyKGlucHV0LCBlcnJvcnMpCisKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5yZXNldChzZWxmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5kZWNvZGUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgKG9iamVjdCwgY29uc3VtZWQsIGJ5dGVvcmRlcikgPSBcCisgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2V4X2RlY29kZShpbnB1dCwgZXJyb3JzLCAwLCBGYWxzZSkKKyAgICAgICAgaWYgYnl0ZW9yZGVyID09IC0xOgorICAgICAgICAgICAgc2VsZi5kZWNvZGUgPSBjb2RlY3MudXRmXzMyX2xlX2RlY29kZQorICAgICAgICBlbGlmIGJ5dGVvcmRlciA9PSAxOgorICAgICAgICAgICAgc2VsZi5kZWNvZGUgPSBjb2RlY3MudXRmXzMyX2JlX2RlY29kZQorICAgICAgICBlbGlmIGNvbnN1bWVkPj00OgorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCJVVEYtMzIgc3RyZWFtIGRvZXMgbm90IHN0YXJ0IHdpdGggQk9NIgorICAgICAgICByZXR1cm4gKG9iamVjdCwgY29uc3VtZWQpCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndXRmLTMyJywKKyAgICAgICAgZW5jb2RlPWVuY29kZSwKKyAgICAgICAgZGVjb2RlPWRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzIucHljIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRiMGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzIucHlvIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRiMGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfYmUucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfYmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyNzJiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9iZS5weQpAQCAtMCwwICsxLDM3IEBACisiIiIKK1B5dGhvbiAndXRmLTMyLWJlJyBDb2RlYworIiIiCitpbXBvcnQgY29kZWNzCisKKyMjIyBDb2RlYyBBUElzCisKK2VuY29kZSA9IGNvZGVjcy51dGZfMzJfYmVfZW5jb2RlCisKK2RlZiBkZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgcmV0dXJuIGNvZGVjcy51dGZfMzJfYmVfZGVjb2RlKGlucHV0LCBlcnJvcnMsIFRydWUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzMyX2JlX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIF9idWZmZXJfZGVjb2RlID0gY29kZWNzLnV0Zl8zMl9iZV9kZWNvZGUKKworY2xhc3MgU3RyZWFtV3JpdGVyKGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGVuY29kZSA9IGNvZGVjcy51dGZfMzJfYmVfZW5jb2RlCisKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBkZWNvZGUgPSBjb2RlY3MudXRmXzMyX2JlX2RlY29kZQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V0Zi0zMi1iZScsCisgICAgICAgIGVuY29kZT1lbmNvZGUsCisgICAgICAgIGRlY29kZT1kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2JlLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9iZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkYWFlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9iZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2JlLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9iZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkYWFlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9iZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2xlLnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzMyX2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDgyMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfbGUucHkKQEAgLTAsMCArMSwzNyBAQAorIiIiCitQeXRob24gJ3V0Zi0zMi1sZScgQ29kZWMKKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitlbmNvZGUgPSBjb2RlY3MudXRmXzMyX2xlX2VuY29kZQorCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBjb2RlY3MudXRmXzMyX2xlX2RlY29kZShpbnB1dCwgZXJyb3JzLCBUcnVlKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl8zMl9sZV9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQorCitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBfYnVmZmVyX2RlY29kZSA9IGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBjb2RlY3MudXRmXzMyX2xlX2VuY29kZQorCitjbGFzcyBTdHJlYW1SZWFkZXIoY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgZGVjb2RlID0gY29kZWNzLnV0Zl8zMl9sZV9kZWNvZGUKKworIyMjIGVuY29kaW5ncyBtb2R1bGUgQVBJCisKK2RlZiBnZXRyZWdlbnRyeSgpOgorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSd1dGYtMzItbGUnLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9sZS5weWMgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl8zMl9sZS5weW8gYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZjNkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dGZfMzJfbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwNTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5CkBAIC0wLDAgKzEsMzggQEAKKyIiIiBQeXRob24gJ3V0Zi03JyBDb2RlYworCitXcml0dGVuIGJ5IEJyaWFuIFF1aW5sYW4gKGJyaWFuQHN3ZWV0YXBwLmNvbSkuCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gY29kZWNzLnV0Zl83X2VuY29kZQorCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBjb2RlY3MudXRmXzdfZGVjb2RlKGlucHV0LCBlcnJvcnMsIFRydWUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzdfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgX2J1ZmZlcl9kZWNvZGUgPSBjb2RlY3MudXRmXzdfZGVjb2RlCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBjb2RlY3MudXRmXzdfZW5jb2RlCisKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBkZWNvZGUgPSBjb2RlY3MudXRmXzdfZGVjb2RlCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndXRmLTcnLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NmZjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl83LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2NmZjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5IGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJmNjMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5CkBAIC0wLDAgKzEsNDIgQEAKKyIiIiBQeXRob24gJ3V0Zi04JyBDb2RlYworCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKK2ltcG9ydCBjb2RlY3MKKworIyMjIENvZGVjIEFQSXMKKworZW5jb2RlID0gY29kZWNzLnV0Zl84X2VuY29kZQorCitkZWYgZGVjb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiBjb2RlY3MudXRmXzhfZGVjb2RlKGlucHV0LCBlcnJvcnMsIFRydWUpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzhfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgX2J1ZmZlcl9kZWNvZGUgPSBjb2RlY3MudXRmXzhfZGVjb2RlCisKK2NsYXNzIFN0cmVhbVdyaXRlcihjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBlbmNvZGUgPSBjb2RlY3MudXRmXzhfZW5jb2RlCisKK2NsYXNzIFN0cmVhbVJlYWRlcihjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBkZWNvZGUgPSBjb2RlY3MudXRmXzhfZGVjb2RlCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndXRmLTgnLAorICAgICAgICBlbmNvZGU9ZW5jb2RlLAorICAgICAgICBkZWNvZGU9ZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjY2MWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjY2MWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weSBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzg0Njk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5CkBAIC0wLDAgKzEsMTE3IEBACisiIiIgUHl0aG9uICd1dGYtOC1zaWcnIENvZGVjCitUaGlzIHdvcmsgc2ltaWxhciB0byBVVEYtOCB3aXRoIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKKworKiBPbiBlbmNvZGluZy93cml0aW5nIGEgVVRGLTggZW5jb2RlZCBCT00gd2lsbCBiZSBwcmVwZW5kZWQvd3JpdHRlbiBhcyB0aGUKKyAgZmlyc3QgdGhyZWUgYnl0ZXMuCisKKyogT24gZGVjb2RpbmcvcmVhZGluZyBpZiB0aGUgZmlyc3QgdGhyZWUgYnl0ZXMgYXJlIGEgVVRGLTggZW5jb2RlZCBCT00sIHRoZXNlCisgIGJ5dGVzIHdpbGwgYmUgc2tpcHBlZC4KKyIiIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitkZWYgZW5jb2RlKGlucHV0LCBlcnJvcnM9J3N0cmljdCcpOgorICAgIHJldHVybiAoY29kZWNzLkJPTV9VVEY4ICsgY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgZXJyb3JzKVswXSwgbGVuKGlucHV0KSkKKworZGVmIGRlY29kZShpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICBwcmVmaXggPSAwCisgICAgaWYgaW5wdXRbOjNdID09IGNvZGVjcy5CT01fVVRGODoKKyAgICAgICAgaW5wdXQgPSBpbnB1dFszOl0KKyAgICAgICAgcHJlZml4ID0gMworICAgIChvdXRwdXQsIGNvbnN1bWVkKSA9IGNvZGVjcy51dGZfOF9kZWNvZGUoaW5wdXQsIGVycm9ycywgVHJ1ZSkKKyAgICByZXR1cm4gKG91dHB1dCwgY29uc3VtZWQrcHJlZml4KQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmZpcnN0ID0gMQorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBpZiBzZWxmLmZpcnN0OgorICAgICAgICAgICAgc2VsZi5maXJzdCA9IDAKKyAgICAgICAgICAgIHJldHVybiBjb2RlY3MuQk9NX1VURjggKyBjb2RlY3MudXRmXzhfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzhfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmZpcnN0ID0gMQorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5maXJzdAorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5maXJzdCA9IHN0YXRlCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmZpcnN0ID0gVHJ1ZQorCisgICAgZGVmIF9idWZmZXJfZGVjb2RlKHNlbGYsIGlucHV0LCBlcnJvcnMsIGZpbmFsKToKKyAgICAgICAgaWYgc2VsZi5maXJzdDoKKyAgICAgICAgICAgIGlmIGxlbihpbnB1dCkgPCAzOgorICAgICAgICAgICAgICAgIGlmIGNvZGVjcy5CT01fVVRGOC5zdGFydHN3aXRoKGlucHV0KToKKyAgICAgICAgICAgICAgICAgICAgIyBub3QgZW5vdWdoIGRhdGEgdG8gZGVjaWRlIGlmIHRoaXMgcmVhbGx5IGlzIGEgQk9NCisgICAgICAgICAgICAgICAgICAgICMgPT4gdHJ5IGFnYWluIG9uIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1IiIsIDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdCA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5maXJzdCA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBpbnB1dFs6M10gPT0gY29kZWNzLkJPTV9VVEY4OgorICAgICAgICAgICAgICAgICAgICAob3V0cHV0LCBjb25zdW1lZCkgPSBjb2RlY3MudXRmXzhfZGVjb2RlKGlucHV0WzM6XSwgZXJyb3JzLCBmaW5hbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvdXRwdXQsIGNvbnN1bWVkKzMpCisgICAgICAgIHJldHVybiBjb2RlY3MudXRmXzhfZGVjb2RlKGlucHV0LCBlcnJvcnMsIGZpbmFsKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5maXJzdCA9IFRydWUKKworY2xhc3MgU3RyZWFtV3JpdGVyKGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5yZXNldChzZWxmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5lbmNvZGUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgc2VsZi5lbmNvZGUgPSBjb2RlY3MudXRmXzhfZW5jb2RlCisgICAgICAgIHJldHVybiBlbmNvZGUoaW5wdXQsIGVycm9ycykKKworY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5yZXNldChzZWxmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5kZWNvZGUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgaWYgbGVuKGlucHV0KSA8IDM6CisgICAgICAgICAgICBpZiBjb2RlY3MuQk9NX1VURjguc3RhcnRzd2l0aChpbnB1dCk6CisgICAgICAgICAgICAgICAgIyBub3QgZW5vdWdoIGRhdGEgdG8gZGVjaWRlIGlmIHRoaXMgaXMgYSBCT00KKyAgICAgICAgICAgICAgICAjID0+IHRyeSBhZ2FpbiBvbiB0aGUgbmV4dCBjYWxsCisgICAgICAgICAgICAgICAgcmV0dXJuICh1IiIsIDApCisgICAgICAgIGVsaWYgaW5wdXRbOjNdID09IGNvZGVjcy5CT01fVVRGODoKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlID0gY29kZWNzLnV0Zl84X2RlY29kZQorICAgICAgICAgICAgKG91dHB1dCwgY29uc3VtZWQpID0gY29kZWNzLnV0Zl84X2RlY29kZShpbnB1dFszOl0sZXJyb3JzKQorICAgICAgICAgICAgcmV0dXJuIChvdXRwdXQsIGNvbnN1bWVkKzMpCisgICAgICAgICMgKGVsc2UpIG5vIEJPTSBwcmVzZW50CisgICAgICAgIHNlbGYuZGVjb2RlID0gY29kZWNzLnV0Zl84X2RlY29kZQorICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl84X2RlY29kZShpbnB1dCwgZXJyb3JzKQorCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3V0Zi04LXNpZycsCisgICAgICAgIGVuY29kZT1lbmNvZGUsCisgICAgICAgIGRlY29kZT1kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3YTcyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3YTcyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V0Zl84X3NpZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXVfY29kZWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy91dV9jb2RlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjAzNzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXVfY29kZWMucHkKQEAgLTAsMCArMSwxMjkgQEAKKyIiIiBQeXRob24gJ3V1X2NvZGVjJyBDb2RlYyAtIFVVIGNvbnRlbnQgdHJhbnNmZXIgZW5jb2RpbmcKKworICAgIFVubGlrZSBtb3N0IG9mIHRoZSBvdGhlciBjb2RlY3Mgd2hpY2ggdGFyZ2V0IFVuaWNvZGUsIHRoaXMgY29kZWMKKyAgICB3aWxsIHJldHVybiBQeXRob24gc3RyaW5nIG9iamVjdHMgZm9yIGJvdGggZW5jb2RlIGFuZCBkZWNvZGUuCisKKyAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4gU29tZSBkZXRhaWxzIHdlcmUKKyAgICBhZGFwdGVkIGZyb20gdXUucHkgd2hpY2ggd2FzIHdyaXR0ZW4gYnkgTGFuY2UgRWxsaW5naG91c2UgYW5kCisgICAgbW9kaWZpZWQgYnkgSmFjayBKYW5zZW4gYW5kIEZyZWRyaWsgTHVuZGguCisKKyIiIgoraW1wb3J0IGNvZGVjcywgYmluYXNjaWkKKworIyMjIENvZGVjIEFQSXMKKworZGVmIHV1X2VuY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcsZmlsZW5hbWU9JzxkYXRhPicsbW9kZT0wNjY2KToKKworICAgICIiIiBFbmNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZnJvbSBiaW5hc2NpaSBpbXBvcnQgYjJhX3V1CisgICAgIyB1c2luZyBzdHIoKSBiZWNhdXNlIG9mIGNTdHJpbmdJTydzIFVuaWNvZGUgdW5kZXNpcmVkIFVuaWNvZGUgYmVoYXZpb3IuCisgICAgaW5maWxlID0gU3RyaW5nSU8oc3RyKGlucHV0KSkKKyAgICBvdXRmaWxlID0gU3RyaW5nSU8oKQorICAgIHJlYWQgPSBpbmZpbGUucmVhZAorICAgIHdyaXRlID0gb3V0ZmlsZS53cml0ZQorCisgICAgIyBFbmNvZGUKKyAgICB3cml0ZSgnYmVnaW4gJW8gJXNcbicgJSAobW9kZSAmIDA3NzcsIGZpbGVuYW1lKSkKKyAgICBjaHVuayA9IHJlYWQoNDUpCisgICAgd2hpbGUgY2h1bms6CisgICAgICAgIHdyaXRlKGIyYV91dShjaHVuaykpCisgICAgICAgIGNodW5rID0gcmVhZCg0NSkKKyAgICB3cml0ZSgnIFxuZW5kXG4nKQorCisgICAgcmV0dXJuIChvdXRmaWxlLmdldHZhbHVlKCksIGxlbihpbnB1dCkpCisKK2RlZiB1dV9kZWNvZGUoaW5wdXQsZXJyb3JzPSdzdHJpY3QnKToKKworICAgICIiIiBEZWNvZGVzIHRoZSBvYmplY3QgaW5wdXQgYW5kIHJldHVybnMgYSB0dXBsZSAob3V0cHV0CisgICAgICAgIG9iamVjdCwgbGVuZ3RoIGNvbnN1bWVkKS4KKworICAgICAgICBpbnB1dCBtdXN0IGJlIGFuIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgYmZfZ2V0cmVhZGJ1ZgorICAgICAgICBidWZmZXIgc2xvdC4gUHl0aG9uIHN0cmluZ3MsIGJ1ZmZlciBvYmplY3RzIGFuZCBtZW1vcnkKKyAgICAgICAgbWFwcGVkIGZpbGVzIGFyZSBleGFtcGxlcyBvZiBvYmplY3RzIHByb3ZpZGluZyB0aGlzIHNsb3QuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgICAgIE5vdGU6IGZpbGVuYW1lIGFuZCBmaWxlIG1vZGUgaW5mb3JtYXRpb24gaW4gdGhlIGlucHV0IGRhdGEgaXMKKyAgICAgICAgaWdub3JlZC4KKworICAgICIiIgorICAgIGFzc2VydCBlcnJvcnMgPT0gJ3N0cmljdCcKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBmcm9tIGJpbmFzY2lpIGltcG9ydCBhMmJfdXUKKyAgICBpbmZpbGUgPSBTdHJpbmdJTyhzdHIoaW5wdXQpKQorICAgIG91dGZpbGUgPSBTdHJpbmdJTygpCisgICAgcmVhZGxpbmUgPSBpbmZpbGUucmVhZGxpbmUKKyAgICB3cml0ZSA9IG91dGZpbGUud3JpdGUKKworICAgICMgRmluZCBzdGFydCBvZiBlbmNvZGVkIGRhdGEKKyAgICB3aGlsZSAxOgorICAgICAgICBzID0gcmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdNaXNzaW5nICJiZWdpbiIgbGluZSBpbiBpbnB1dCBkYXRhJworICAgICAgICBpZiBzWzo1XSA9PSAnYmVnaW4nOgorICAgICAgICAgICAgYnJlYWsKKworICAgICMgRGVjb2RlCisgICAgd2hpbGUgMToKKyAgICAgICAgcyA9IHJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHMgb3IgXAorICAgICAgICAgICBzID09ICdlbmRcbic6CisgICAgICAgICAgICBicmVhaworICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gYTJiX3V1KHMpCisgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvciwgdjoKKyAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgYnJva2VuIHV1ZW5jb2RlcnMgYnkgL0ZyZWRyaWsgTHVuZGgKKyAgICAgICAgICAgIG5ieXRlcyA9ICgoKG9yZChzWzBdKS0zMikgJiA2MykgKiA0ICsgNSkgLyAzCisgICAgICAgICAgICBkYXRhID0gYTJiX3V1KHNbOm5ieXRlc10pCisgICAgICAgICAgICAjc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogJXNcbiIgJSBzdHIodikpCisgICAgICAgIHdyaXRlKGRhdGEpCisgICAgaWYgbm90IHM6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdUcnVuY2F0ZWQgaW5wdXQgZGF0YScKKworICAgIHJldHVybiAob3V0ZmlsZS5nZXR2YWx1ZSgpLCBsZW4oaW5wdXQpKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiB1dV9lbmNvZGUoaW5wdXQsZXJyb3JzKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisgICAgICAgIHJldHVybiB1dV9kZWNvZGUoaW5wdXQsZXJyb3JzKQorCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICByZXR1cm4gdXVfZW5jb2RlKGlucHV0LCBzZWxmLmVycm9ycylbMF0KKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBkZWNvZGUoc2VsZiwgaW5wdXQsIGZpbmFsPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIHV1X2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBwYXNzCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYyxjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBwYXNzCisKKyMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQorCitkZWYgZ2V0cmVnZW50cnkoKToKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0ndXUnLAorICAgICAgICBlbmNvZGU9dXVfZW5jb2RlLAorICAgICAgICBkZWNvZGU9dXVfZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWRjNmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXVfY29kZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3V1X2NvZGVjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmY2ODRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9lbmNvZGluZ3MvdXVfY29kZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3psaWJfY29kZWMucHkgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MTlmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5CkBAIC0wLDAgKzEsMTAyIEBACisiIiIgUHl0aG9uICd6bGliX2NvZGVjJyBDb2RlYyAtIHpsaWIgY29tcHJlc3Npb24gZW5jb2RpbmcKKworICAgIFVubGlrZSBtb3N0IG9mIHRoZSBvdGhlciBjb2RlY3Mgd2hpY2ggdGFyZ2V0IFVuaWNvZGUsIHRoaXMgY29kZWMKKyAgICB3aWxsIHJldHVybiBQeXRob24gc3RyaW5nIG9iamVjdHMgZm9yIGJvdGggZW5jb2RlIGFuZCBkZWNvZGUuCisKKyAgICBXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworIiIiCitpbXBvcnQgY29kZWNzCitpbXBvcnQgemxpYiAjIHRoaXMgY29kZWMgbmVlZHMgdGhlIG9wdGlvbmFsIHpsaWIgbW9kdWxlICEKKworIyMjIENvZGVjIEFQSXMKKworZGVmIHpsaWJfZW5jb2RlKGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAiIiIgRW5jb2RlcyB0aGUgb2JqZWN0IGlucHV0IGFuZCByZXR1cm5zIGEgdHVwbGUgKG91dHB1dAorICAgICAgICBvYmplY3QsIGxlbmd0aCBjb25zdW1lZCkuCisKKyAgICAgICAgZXJyb3JzIGRlZmluZXMgdGhlIGVycm9yIGhhbmRsaW5nIHRvIGFwcGx5LiBJdCBkZWZhdWx0cyB0bworICAgICAgICAnc3RyaWN0JyBoYW5kbGluZyB3aGljaCBpcyB0aGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICAgIGVycm9yIGhhbmRsaW5nIGZvciB0aGlzIGNvZGVjLgorCisgICAgIiIiCisgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgIG91dHB1dCA9IHpsaWIuY29tcHJlc3MoaW5wdXQpCisgICAgcmV0dXJuIChvdXRwdXQsIGxlbihpbnB1dCkpCisKK2RlZiB6bGliX2RlY29kZShpbnB1dCxlcnJvcnM9J3N0cmljdCcpOgorCisgICAgIiIiIERlY29kZXMgdGhlIG9iamVjdCBpbnB1dCBhbmQgcmV0dXJucyBhIHR1cGxlIChvdXRwdXQKKyAgICAgICAgb2JqZWN0LCBsZW5ndGggY29uc3VtZWQpLgorCisgICAgICAgIGlucHV0IG11c3QgYmUgYW4gb2JqZWN0IHdoaWNoIHByb3ZpZGVzIHRoZSBiZl9nZXRyZWFkYnVmCisgICAgICAgIGJ1ZmZlciBzbG90LiBQeXRob24gc3RyaW5ncywgYnVmZmVyIG9iamVjdHMgYW5kIG1lbW9yeQorICAgICAgICBtYXBwZWQgZmlsZXMgYXJlIGV4YW1wbGVzIG9mIG9iamVjdHMgcHJvdmlkaW5nIHRoaXMgc2xvdC4KKworICAgICAgICBlcnJvcnMgZGVmaW5lcyB0aGUgZXJyb3IgaGFuZGxpbmcgdG8gYXBwbHkuIEl0IGRlZmF1bHRzIHRvCisgICAgICAgICdzdHJpY3QnIGhhbmRsaW5nIHdoaWNoIGlzIHRoZSBvbmx5IGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgICAgZXJyb3IgaGFuZGxpbmcgZm9yIHRoaXMgY29kZWMuCisKKyAgICAiIiIKKyAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgb3V0cHV0ID0gemxpYi5kZWNvbXByZXNzKGlucHV0KQorICAgIHJldHVybiAob3V0cHV0LCBsZW4oaW5wdXQpKQorCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIHpsaWJfZW5jb2RlKGlucHV0LCBlcnJvcnMpCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgcmV0dXJuIHpsaWJfZGVjb2RlKGlucHV0LCBlcnJvcnMpCisKK2NsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyb3JzPSdzdHJpY3QnKToKKyAgICAgICAgYXNzZXJ0IGVycm9ycyA9PSAnc3RyaWN0JworICAgICAgICBzZWxmLmVycm9ycyA9IGVycm9ycworICAgICAgICBzZWxmLmNvbXByZXNzb2JqID0gemxpYi5jb21wcmVzc29iaigpCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIGlmIGZpbmFsOgorICAgICAgICAgICAgYyA9IHNlbGYuY29tcHJlc3NvYmouY29tcHJlc3MoaW5wdXQpCisgICAgICAgICAgICByZXR1cm4gYyArIHNlbGYuY29tcHJlc3NvYmouZmx1c2goKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tcHJlc3NvYmouY29tcHJlc3MoaW5wdXQpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuY29tcHJlc3NvYmogPSB6bGliLmNvbXByZXNzb2JqKCkKKworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBhc3NlcnQgZXJyb3JzID09ICdzdHJpY3QnCisgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIHNlbGYuZGVjb21wcmVzc29iaiA9IHpsaWIuZGVjb21wcmVzc29iaigpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgIGlmIGZpbmFsOgorICAgICAgICAgICAgYyA9IHNlbGYuZGVjb21wcmVzc29iai5kZWNvbXByZXNzKGlucHV0KQorICAgICAgICAgICAgcmV0dXJuIGMgKyBzZWxmLmRlY29tcHJlc3NvYmouZmx1c2goKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVjb21wcmVzc29iai5kZWNvbXByZXNzKGlucHV0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmRlY29tcHJlc3NvYmogPSB6bGliLmRlY29tcHJlc3NvYmooKQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3psaWInLAorICAgICAgICBlbmNvZGU9emxpYl9lbmNvZGUsCisgICAgICAgIGRlY29kZT16bGliX2RlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5YyBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3psaWJfY29kZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjZmOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5byBiL2xpYi9weXRob24yLjcvZW5jb2RpbmdzL3psaWJfY29kZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzY4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2VuY29kaW5ncy96bGliX2NvZGVjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZpbGVjbXAucHkgYi9saWIvcHl0aG9uMi43L2ZpbGVjbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E3OTM4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZmlsZWNtcC5weQpAQCAtMCwwICsxLDI5NiBAQAorIiIiVXRpbGl0aWVzIGZvciBjb21wYXJpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorCitDbGFzc2VzOgorICAgIGRpcmNtcAorCitGdW5jdGlvbnM6CisgICAgY21wKGYxLCBmMiwgc2hhbGxvdz0xKSAtPiBpbnQKKyAgICBjbXBmaWxlcyhhLCBiLCBjb21tb24pIC0+IChbXSwgW10sIFtdKQorCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3RhdAorZnJvbSBpdGVydG9vbHMgaW1wb3J0IGlmaWx0ZXIsIGlmaWx0ZXJmYWxzZSwgaW1hcCwgaXppcAorCitfX2FsbF9fID0gWyJjbXAiLCJkaXJjbXAiLCJjbXBmaWxlcyJdCisKK19jYWNoZSA9IHt9CitCVUZTSVpFPTgqMTAyNAorCitkZWYgY21wKGYxLCBmMiwgc2hhbGxvdz0xKToKKyAgICAiIiJDb21wYXJlIHR3byBmaWxlcy4KKworICAgIEFyZ3VtZW50czoKKworICAgIGYxIC0tIEZpcnN0IGZpbGUgbmFtZQorCisgICAgZjIgLS0gU2Vjb25kIGZpbGUgbmFtZQorCisgICAgc2hhbGxvdyAtLSBKdXN0IGNoZWNrIHN0YXQgc2lnbmF0dXJlIChkbyBub3QgcmVhZCB0aGUgZmlsZXMpLgorICAgICAgICAgICAgICAgZGVmYXVsdHMgdG8gMS4KKworICAgIFJldHVybiB2YWx1ZToKKworICAgIFRydWUgaWYgdGhlIGZpbGVzIGFyZSB0aGUgc2FtZSwgRmFsc2Ugb3RoZXJ3aXNlLgorCisgICAgVGhpcyBmdW5jdGlvbiB1c2VzIGEgY2FjaGUgZm9yIHBhc3QgY29tcGFyaXNvbnMgYW5kIHRoZSByZXN1bHRzLAorICAgIHdpdGggYSBjYWNoZSBpbnZhbGlkYXRpb24gbWVjaGFuaXNtIHJlbHlpbmcgb24gc3RhbGUgc2lnbmF0dXJlcy4KKworICAgICIiIgorCisgICAgczEgPSBfc2lnKG9zLnN0YXQoZjEpKQorICAgIHMyID0gX3NpZyhvcy5zdGF0KGYyKSkKKyAgICBpZiBzMVswXSAhPSBzdGF0LlNfSUZSRUcgb3IgczJbMF0gIT0gc3RhdC5TX0lGUkVHOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBzaGFsbG93IGFuZCBzMSA9PSBzMjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiBzMVsxXSAhPSBzMlsxXToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBvdXRjb21lID0gX2NhY2hlLmdldCgoZjEsIGYyLCBzMSwgczIpKQorICAgIGlmIG91dGNvbWUgaXMgTm9uZToKKyAgICAgICAgb3V0Y29tZSA9IF9kb19jbXAoZjEsIGYyKQorICAgICAgICBpZiBsZW4oX2NhY2hlKSA+IDEwMDogICAgICAjIGxpbWl0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlCisgICAgICAgICAgICBfY2FjaGUuY2xlYXIoKQorICAgICAgICBfY2FjaGVbZjEsIGYyLCBzMSwgczJdID0gb3V0Y29tZQorICAgIHJldHVybiBvdXRjb21lCisKK2RlZiBfc2lnKHN0KToKKyAgICByZXR1cm4gKHN0YXQuU19JRk1UKHN0LnN0X21vZGUpLAorICAgICAgICAgICAgc3Quc3Rfc2l6ZSwKKyAgICAgICAgICAgIHN0LnN0X210aW1lKQorCitkZWYgX2RvX2NtcChmMSwgZjIpOgorICAgIGJ1ZnNpemUgPSBCVUZTSVpFCisgICAgd2l0aCBvcGVuKGYxLCAncmInKSBhcyBmcDEsIG9wZW4oZjIsICdyYicpIGFzIGZwMjoKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGIxID0gZnAxLnJlYWQoYnVmc2l6ZSkKKyAgICAgICAgICAgIGIyID0gZnAyLnJlYWQoYnVmc2l6ZSkKKyAgICAgICAgICAgIGlmIGIxICE9IGIyOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgbm90IGIxOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyMgRGlyZWN0b3J5IGNvbXBhcmlzb24gY2xhc3MuCisjCitjbGFzcyBkaXJjbXA6CisgICAgIiIiQSBjbGFzcyB0aGF0IG1hbmFnZXMgdGhlIGNvbXBhcmlzb24gb2YgMiBkaXJlY3Rvcmllcy4KKworICAgIGRpcmNtcChhLGIsaWdub3JlPU5vbmUsaGlkZT1Ob25lKQorICAgICAgQSBhbmQgQiBhcmUgZGlyZWN0b3JpZXMuCisgICAgICBJR05PUkUgaXMgYSBsaXN0IG9mIG5hbWVzIHRvIGlnbm9yZSwKKyAgICAgICAgZGVmYXVsdHMgdG8gWydSQ1MnLCAnQ1ZTJywgJ3RhZ3MnXS4KKyAgICAgIEhJREUgaXMgYSBsaXN0IG9mIG5hbWVzIHRvIGhpZGUsCisgICAgICAgIGRlZmF1bHRzIHRvIFtvcy5jdXJkaXIsIG9zLnBhcmRpcl0uCisKKyAgICBIaWdoIGxldmVsIHVzYWdlOgorICAgICAgeCA9IGRpcmNtcChkaXIxLCBkaXIyKQorICAgICAgeC5yZXBvcnQoKSAtPiBwcmludHMgYSByZXBvcnQgb24gdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gZGlyMSBhbmQgZGlyMgorICAgICAgIG9yCisgICAgICB4LnJlcG9ydF9wYXJ0aWFsX2Nsb3N1cmUoKSAtPiBwcmludHMgcmVwb3J0IG9uIGRpZmZlcmVuY2VzIGJldHdlZW4gZGlyMQorICAgICAgICAgICAgYW5kIGRpcjIsIGFuZCByZXBvcnRzIG9uIGNvbW1vbiBpbW1lZGlhdGUgc3ViZGlyZWN0b3JpZXMuCisgICAgICB4LnJlcG9ydF9mdWxsX2Nsb3N1cmUoKSAtPiBsaWtlIHJlcG9ydF9wYXJ0aWFsX2Nsb3N1cmUsCisgICAgICAgICAgICBidXQgZnVsbHkgcmVjdXJzaXZlLgorCisgICAgQXR0cmlidXRlczoKKyAgICAgbGVmdF9saXN0LCByaWdodF9saXN0OiBUaGUgZmlsZXMgaW4gZGlyMSBhbmQgZGlyMiwKKyAgICAgICAgZmlsdGVyZWQgYnkgaGlkZSBhbmQgaWdub3JlLgorICAgICBjb21tb246IGEgbGlzdCBvZiBuYW1lcyBpbiBib3RoIGRpcjEgYW5kIGRpcjIuCisgICAgIGxlZnRfb25seSwgcmlnaHRfb25seTogbmFtZXMgb25seSBpbiBkaXIxLCBkaXIyLgorICAgICBjb21tb25fZGlyczogc3ViZGlyZWN0b3JpZXMgaW4gYm90aCBkaXIxIGFuZCBkaXIyLgorICAgICBjb21tb25fZmlsZXM6IGZpbGVzIGluIGJvdGggZGlyMSBhbmQgZGlyMi4KKyAgICAgY29tbW9uX2Z1bm55OiBuYW1lcyBpbiBib3RoIGRpcjEgYW5kIGRpcjIgd2hlcmUgdGhlIHR5cGUgZGlmZmVycyBiZXR3ZWVuCisgICAgICAgIGRpcjEgYW5kIGRpcjIsIG9yIHRoZSBuYW1lIGlzIG5vdCBzdGF0LWFibGUuCisgICAgIHNhbWVfZmlsZXM6IGxpc3Qgb2YgaWRlbnRpY2FsIGZpbGVzLgorICAgICBkaWZmX2ZpbGVzOiBsaXN0IG9mIGZpbGVuYW1lcyB3aGljaCBkaWZmZXIuCisgICAgIGZ1bm55X2ZpbGVzOiBsaXN0IG9mIGZpbGVzIHdoaWNoIGNvdWxkIG5vdCBiZSBjb21wYXJlZC4KKyAgICAgc3ViZGlyczogYSBkaWN0aW9uYXJ5IG9mIGRpcmNtcCBvYmplY3RzLCBrZXllZCBieSBuYW1lcyBpbiBjb21tb25fZGlycy4KKyAgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYSwgYiwgaWdub3JlPU5vbmUsIGhpZGU9Tm9uZSk6ICMgSW5pdGlhbGl6ZQorICAgICAgICBzZWxmLmxlZnQgPSBhCisgICAgICAgIHNlbGYucmlnaHQgPSBiCisgICAgICAgIGlmIGhpZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaGlkZSA9IFtvcy5jdXJkaXIsIG9zLnBhcmRpcl0gIyBOYW1lcyBuZXZlciB0byBiZSBzaG93bgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5oaWRlID0gaGlkZQorICAgICAgICBpZiBpZ25vcmUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaWdub3JlID0gWydSQ1MnLCAnQ1ZTJywgJ3RhZ3MnXSAjIE5hbWVzIGlnbm9yZWQgaW4gY29tcGFyaXNvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pZ25vcmUgPSBpZ25vcmUKKworICAgIGRlZiBwaGFzZTAoc2VsZik6ICMgQ29tcGFyZSBldmVyeXRoaW5nIGV4Y2VwdCBjb21tb24gc3ViZGlyZWN0b3JpZXMKKyAgICAgICAgc2VsZi5sZWZ0X2xpc3QgPSBfZmlsdGVyKG9zLmxpc3RkaXIoc2VsZi5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGlkZStzZWxmLmlnbm9yZSkKKyAgICAgICAgc2VsZi5yaWdodF9saXN0ID0gX2ZpbHRlcihvcy5saXN0ZGlyKHNlbGYucmlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGlkZStzZWxmLmlnbm9yZSkKKyAgICAgICAgc2VsZi5sZWZ0X2xpc3Quc29ydCgpCisgICAgICAgIHNlbGYucmlnaHRfbGlzdC5zb3J0KCkKKworICAgIGRlZiBwaGFzZTEoc2VsZik6ICMgQ29tcHV0ZSBjb21tb24gbmFtZXMKKyAgICAgICAgYSA9IGRpY3QoaXppcChpbWFwKG9zLnBhdGgubm9ybWNhc2UsIHNlbGYubGVmdF9saXN0KSwgc2VsZi5sZWZ0X2xpc3QpKQorICAgICAgICBiID0gZGljdChpemlwKGltYXAob3MucGF0aC5ub3JtY2FzZSwgc2VsZi5yaWdodF9saXN0KSwgc2VsZi5yaWdodF9saXN0KSkKKyAgICAgICAgc2VsZi5jb21tb24gPSBtYXAoYS5fX2dldGl0ZW1fXywgaWZpbHRlcihiLl9fY29udGFpbnNfXywgYSkpCisgICAgICAgIHNlbGYubGVmdF9vbmx5ID0gbWFwKGEuX19nZXRpdGVtX18sIGlmaWx0ZXJmYWxzZShiLl9fY29udGFpbnNfXywgYSkpCisgICAgICAgIHNlbGYucmlnaHRfb25seSA9IG1hcChiLl9fZ2V0aXRlbV9fLCBpZmlsdGVyZmFsc2UoYS5fX2NvbnRhaW5zX18sIGIpKQorCisgICAgZGVmIHBoYXNlMihzZWxmKTogIyBEaXN0aW5ndWlzaCBmaWxlcywgZGlyZWN0b3JpZXMsIGZ1bm5pZXMKKyAgICAgICAgc2VsZi5jb21tb25fZGlycyA9IFtdCisgICAgICAgIHNlbGYuY29tbW9uX2ZpbGVzID0gW10KKyAgICAgICAgc2VsZi5jb21tb25fZnVubnkgPSBbXQorCisgICAgICAgIGZvciB4IGluIHNlbGYuY29tbW9uOgorICAgICAgICAgICAgYV9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYubGVmdCwgeCkKKyAgICAgICAgICAgIGJfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnJpZ2h0LCB4KQorCisgICAgICAgICAgICBvayA9IDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhX3N0YXQgPSBvcy5zdGF0KGFfcGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgd2h5OgorICAgICAgICAgICAgICAgICMgcHJpbnQgJ0NhblwndCBzdGF0JywgYV9wYXRoLCAnOicsIHdoeVsxXQorICAgICAgICAgICAgICAgIG9rID0gMAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJfc3RhdCA9IG9zLnN0YXQoYl9wYXRoKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCB3aHk6CisgICAgICAgICAgICAgICAgIyBwcmludCAnQ2FuXCd0IHN0YXQnLCBiX3BhdGgsICc6Jywgd2h5WzFdCisgICAgICAgICAgICAgICAgb2sgPSAwCisKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGFfdHlwZSA9IHN0YXQuU19JRk1UKGFfc3RhdC5zdF9tb2RlKQorICAgICAgICAgICAgICAgIGJfdHlwZSA9IHN0YXQuU19JRk1UKGJfc3RhdC5zdF9tb2RlKQorICAgICAgICAgICAgICAgIGlmIGFfdHlwZSAhPSBiX3R5cGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55LmFwcGVuZCh4KQorICAgICAgICAgICAgICAgIGVsaWYgc3RhdC5TX0lTRElSKGFfdHlwZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2RpcnMuYXBwZW5kKHgpCisgICAgICAgICAgICAgICAgZWxpZiBzdGF0LlNfSVNSRUcoYV90eXBlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tb25fZmlsZXMuYXBwZW5kKHgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tb25fZnVubnkuYXBwZW5kKHgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55LmFwcGVuZCh4KQorCisgICAgZGVmIHBoYXNlMyhzZWxmKTogIyBGaW5kIG91dCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbW1vbiBmaWxlcworICAgICAgICB4eCA9IGNtcGZpbGVzKHNlbGYubGVmdCwgc2VsZi5yaWdodCwgc2VsZi5jb21tb25fZmlsZXMpCisgICAgICAgIHNlbGYuc2FtZV9maWxlcywgc2VsZi5kaWZmX2ZpbGVzLCBzZWxmLmZ1bm55X2ZpbGVzID0geHgKKworICAgIGRlZiBwaGFzZTQoc2VsZik6ICMgRmluZCBvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb21tb24gc3ViZGlyZWN0b3JpZXMKKyAgICAgICAgIyBBIG5ldyBkaXJjbXAgb2JqZWN0IGlzIGNyZWF0ZWQgZm9yIGVhY2ggY29tbW9uIHN1YmRpcmVjdG9yeSwKKyAgICAgICAgIyB0aGVzZSBhcmUgc3RvcmVkIGluIGEgZGljdGlvbmFyeSBpbmRleGVkIGJ5IGZpbGVuYW1lLgorICAgICAgICAjIFRoZSBoaWRlIGFuZCBpZ25vcmUgcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudAorICAgICAgICBzZWxmLnN1YmRpcnMgPSB7fQorICAgICAgICBmb3IgeCBpbiBzZWxmLmNvbW1vbl9kaXJzOgorICAgICAgICAgICAgYV94ID0gb3MucGF0aC5qb2luKHNlbGYubGVmdCwgeCkKKyAgICAgICAgICAgIGJfeCA9IG9zLnBhdGguam9pbihzZWxmLnJpZ2h0LCB4KQorICAgICAgICAgICAgc2VsZi5zdWJkaXJzW3hdICA9IGRpcmNtcChhX3gsIGJfeCwgc2VsZi5pZ25vcmUsIHNlbGYuaGlkZSkKKworICAgIGRlZiBwaGFzZTRfY2xvc3VyZShzZWxmKTogIyBSZWN1cnNpdmVseSBjYWxsIHBoYXNlNCgpIG9uIHN1YmRpcmVjdG9yaWVzCisgICAgICAgIHNlbGYucGhhc2U0KCkKKyAgICAgICAgZm9yIHNkIGluIHNlbGYuc3ViZGlycy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBzZC5waGFzZTRfY2xvc3VyZSgpCisKKyAgICBkZWYgcmVwb3J0KHNlbGYpOiAjIFByaW50IGEgcmVwb3J0IG9uIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGEgYW5kIGIKKyAgICAgICAgIyBPdXRwdXQgZm9ybWF0IGlzIHB1cnBvc2VseSBsb3VzeQorICAgICAgICBwcmludCAnZGlmZicsIHNlbGYubGVmdCwgc2VsZi5yaWdodAorICAgICAgICBpZiBzZWxmLmxlZnRfb25seToKKyAgICAgICAgICAgIHNlbGYubGVmdF9vbmx5LnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgJ09ubHkgaW4nLCBzZWxmLmxlZnQsICc6Jywgc2VsZi5sZWZ0X29ubHkKKyAgICAgICAgaWYgc2VsZi5yaWdodF9vbmx5OgorICAgICAgICAgICAgc2VsZi5yaWdodF9vbmx5LnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgJ09ubHkgaW4nLCBzZWxmLnJpZ2h0LCAnOicsIHNlbGYucmlnaHRfb25seQorICAgICAgICBpZiBzZWxmLnNhbWVfZmlsZXM6CisgICAgICAgICAgICBzZWxmLnNhbWVfZmlsZXMuc29ydCgpCisgICAgICAgICAgICBwcmludCAnSWRlbnRpY2FsIGZpbGVzIDonLCBzZWxmLnNhbWVfZmlsZXMKKyAgICAgICAgaWYgc2VsZi5kaWZmX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi5kaWZmX2ZpbGVzLnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgJ0RpZmZlcmluZyBmaWxlcyA6Jywgc2VsZi5kaWZmX2ZpbGVzCisgICAgICAgIGlmIHNlbGYuZnVubnlfZmlsZXM6CisgICAgICAgICAgICBzZWxmLmZ1bm55X2ZpbGVzLnNvcnQoKQorICAgICAgICAgICAgcHJpbnQgJ1Ryb3VibGUgd2l0aCBjb21tb24gZmlsZXMgOicsIHNlbGYuZnVubnlfZmlsZXMKKyAgICAgICAgaWYgc2VsZi5jb21tb25fZGlyczoKKyAgICAgICAgICAgIHNlbGYuY29tbW9uX2RpcnMuc29ydCgpCisgICAgICAgICAgICBwcmludCAnQ29tbW9uIHN1YmRpcmVjdG9yaWVzIDonLCBzZWxmLmNvbW1vbl9kaXJzCisgICAgICAgIGlmIHNlbGYuY29tbW9uX2Z1bm55OgorICAgICAgICAgICAgc2VsZi5jb21tb25fZnVubnkuc29ydCgpCisgICAgICAgICAgICBwcmludCAnQ29tbW9uIGZ1bm55IGNhc2VzIDonLCBzZWxmLmNvbW1vbl9mdW5ueQorCisgICAgZGVmIHJlcG9ydF9wYXJ0aWFsX2Nsb3N1cmUoc2VsZik6ICMgUHJpbnQgcmVwb3J0cyBvbiBzZWxmIGFuZCBvbiBzdWJkaXJzCisgICAgICAgIHNlbGYucmVwb3J0KCkKKyAgICAgICAgZm9yIHNkIGluIHNlbGYuc3ViZGlycy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgc2QucmVwb3J0KCkKKworICAgIGRlZiByZXBvcnRfZnVsbF9jbG9zdXJlKHNlbGYpOiAjIFJlcG9ydCBvbiBzZWxmIGFuZCBzdWJkaXJzIHJlY3Vyc2l2ZWx5CisgICAgICAgIHNlbGYucmVwb3J0KCkKKyAgICAgICAgZm9yIHNkIGluIHNlbGYuc3ViZGlycy5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgc2QucmVwb3J0X2Z1bGxfY2xvc3VyZSgpCisKKyAgICBtZXRob2RtYXAgPSBkaWN0KHN1YmRpcnM9cGhhc2U0LAorICAgICAgICAgICAgICAgICAgICAgc2FtZV9maWxlcz1waGFzZTMsIGRpZmZfZmlsZXM9cGhhc2UzLCBmdW5ueV9maWxlcz1waGFzZTMsCisgICAgICAgICAgICAgICAgICAgICBjb21tb25fZGlycyA9IHBoYXNlMiwgY29tbW9uX2ZpbGVzPXBoYXNlMiwgY29tbW9uX2Z1bm55PXBoYXNlMiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1vbj1waGFzZTEsIGxlZnRfb25seT1waGFzZTEsIHJpZ2h0X29ubHk9cGhhc2UxLAorICAgICAgICAgICAgICAgICAgICAgbGVmdF9saXN0PXBoYXNlMCwgcmlnaHRfbGlzdD1waGFzZTApCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGF0dHIgbm90IGluIHNlbGYubWV0aG9kbWFwOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIGF0dHIKKyAgICAgICAgc2VsZi5tZXRob2RtYXBbYXR0cl0oc2VsZikKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgYXR0cikKKworZGVmIGNtcGZpbGVzKGEsIGIsIGNvbW1vbiwgc2hhbGxvdz0xKToKKyAgICAiIiJDb21wYXJlIGNvbW1vbiBmaWxlcyBpbiB0d28gZGlyZWN0b3JpZXMuCisKKyAgICBhLCBiIC0tIGRpcmVjdG9yeSBuYW1lcworICAgIGNvbW1vbiAtLSBsaXN0IG9mIGZpbGUgbmFtZXMgZm91bmQgaW4gYm90aCBkaXJlY3RvcmllcworICAgIHNoYWxsb3cgLS0gaWYgdHJ1ZSwgZG8gY29tcGFyaXNvbiBiYXNlZCBzb2xlbHkgb24gc3RhdCgpIGluZm9ybWF0aW9uCisKKyAgICBSZXR1cm5zIGEgdHVwbGUgb2YgdGhyZWUgbGlzdHM6CisgICAgICBmaWxlcyB0aGF0IGNvbXBhcmUgZXF1YWwKKyAgICAgIGZpbGVzIHRoYXQgYXJlIGRpZmZlcmVudAorICAgICAgZmlsZW5hbWVzIHRoYXQgYXJlbid0IHJlZ3VsYXIgZmlsZXMuCisKKyAgICAiIiIKKyAgICByZXMgPSAoW10sIFtdLCBbXSkKKyAgICBmb3IgeCBpbiBjb21tb246CisgICAgICAgIGF4ID0gb3MucGF0aC5qb2luKGEsIHgpCisgICAgICAgIGJ4ID0gb3MucGF0aC5qb2luKGIsIHgpCisgICAgICAgIHJlc1tfY21wKGF4LCBieCwgc2hhbGxvdyldLmFwcGVuZCh4KQorICAgIHJldHVybiByZXMKKworCisjIENvbXBhcmUgdHdvIGZpbGVzLgorIyBSZXR1cm46CisjICAgICAgIDAgZm9yIGVxdWFsCisjICAgICAgIDEgZm9yIGRpZmZlcmVudAorIyAgICAgICAyIGZvciBmdW5ueSBjYXNlcyAoY2FuJ3Qgc3RhdCwgZXRjLikKKyMKK2RlZiBfY21wKGEsIGIsIHNoLCBhYnM9YWJzLCBjbXA9Y21wKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBub3QgYWJzKGNtcChhLCBiLCBzaCkpCisgICAgZXhjZXB0IChvcy5lcnJvciwgSU9FcnJvcik6CisgICAgICAgIHJldHVybiAyCisKKworIyBSZXR1cm4gYSBjb3B5IHdpdGggaXRlbXMgdGhhdCBvY2N1ciBpbiBza2lwIHJlbW92ZWQuCisjCitkZWYgX2ZpbHRlcihmbGlzdCwgc2tpcCk6CisgICAgcmV0dXJuIGxpc3QoaWZpbHRlcmZhbHNlKHNraXAuX19jb250YWluc19fLCBmbGlzdCkpCisKKworIyBEZW1vbnN0cmF0aW9uIGFuZCB0ZXN0aW5nLgorIworZGVmIGRlbW8oKToKKyAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IGdldG9wdAorICAgIG9wdGlvbnMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ3InKQorICAgIGlmIGxlbihhcmdzKSAhPSAyOgorICAgICAgICByYWlzZSBnZXRvcHQuR2V0b3B0RXJyb3IoJ25lZWQgZXhhY3RseSB0d28gYXJncycsIE5vbmUpCisgICAgZGQgPSBkaXJjbXAoYXJnc1swXSwgYXJnc1sxXSkKKyAgICBpZiAoJy1yJywgJycpIGluIG9wdGlvbnM6CisgICAgICAgIGRkLnJlcG9ydF9mdWxsX2Nsb3N1cmUoKQorICAgIGVsc2U6CisgICAgICAgIGRkLnJlcG9ydCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZGVtbygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZpbGVjbXAucHljIGIvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYyY2JiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZpbGVjbXAucHlvIGIvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzYyY2JiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9maWxlY21wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZpbGVpbnB1dC5weSBiL2xpYi9weXRob24yLjcvZmlsZWlucHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDg1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZpbGVpbnB1dC5weQpAQCAtMCwwICsxLDQxMyBAQAorIiIiSGVscGVyIGNsYXNzIHRvIHF1aWNrbHkgd3JpdGUgYSBsb29wIG92ZXIgYWxsIHN0YW5kYXJkIGlucHV0IGZpbGVzLgorCitUeXBpY2FsIHVzZSBpczoKKworICAgIGltcG9ydCBmaWxlaW5wdXQKKyAgICBmb3IgbGluZSBpbiBmaWxlaW5wdXQuaW5wdXQoKToKKyAgICAgICAgcHJvY2VzcyhsaW5lKQorCitUaGlzIGl0ZXJhdGVzIG92ZXIgdGhlIGxpbmVzIG9mIGFsbCBmaWxlcyBsaXN0ZWQgaW4gc3lzLmFyZ3ZbMTpdLAorZGVmYXVsdGluZyB0byBzeXMuc3RkaW4gaWYgdGhlIGxpc3QgaXMgZW1wdHkuICBJZiBhIGZpbGVuYW1lIGlzICctJyBpdAoraXMgYWxzbyByZXBsYWNlZCBieSBzeXMuc3RkaW4uICBUbyBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGxpc3Qgb2YKK2ZpbGVuYW1lcywgcGFzcyBpdCBhcyB0aGUgYXJndW1lbnQgdG8gaW5wdXQoKS4gIEEgc2luZ2xlIGZpbGUgbmFtZSBpcworYWxzbyBhbGxvd2VkLgorCitGdW5jdGlvbnMgZmlsZW5hbWUoKSwgbGluZW5vKCkgcmV0dXJuIHRoZSBmaWxlbmFtZSBhbmQgY3VtdWxhdGl2ZSBsaW5lCitudW1iZXIgb2YgdGhlIGxpbmUgdGhhdCBoYXMganVzdCBiZWVuIHJlYWQ7IGZpbGVsaW5lbm8oKSByZXR1cm5zIGl0cworbGluZSBudW1iZXIgaW4gdGhlIGN1cnJlbnQgZmlsZTsgaXNmaXJzdGxpbmUoKSByZXR1cm5zIHRydWUgaWZmIHRoZQorbGluZSBqdXN0IHJlYWQgaXMgdGhlIGZpcnN0IGxpbmUgb2YgaXRzIGZpbGU7IGlzc3RkaW4oKSByZXR1cm5zIHRydWUKK2lmZiB0aGUgbGluZSB3YXMgcmVhZCBmcm9tIHN5cy5zdGRpbi4gIEZ1bmN0aW9uIG5leHRmaWxlKCkgY2xvc2VzIHRoZQorY3VycmVudCBmaWxlIHNvIHRoYXQgdGhlIG5leHQgaXRlcmF0aW9uIHdpbGwgcmVhZCB0aGUgZmlyc3QgbGluZSBmcm9tCit0aGUgbmV4dCBmaWxlIChpZiBhbnkpOyBsaW5lcyBub3QgcmVhZCBmcm9tIHRoZSBmaWxlIHdpbGwgbm90IGNvdW50Cit0b3dhcmRzIHRoZSBjdW11bGF0aXZlIGxpbmUgY291bnQ7IHRoZSBmaWxlbmFtZSBpcyBub3QgY2hhbmdlZCB1bnRpbAorYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIG5leHQgZmlsZSBoYXMgYmVlbiByZWFkLiAgRnVuY3Rpb24gY2xvc2UoKQorY2xvc2VzIHRoZSBzZXF1ZW5jZS4KKworQmVmb3JlIGFueSBsaW5lcyBoYXZlIGJlZW4gcmVhZCwgZmlsZW5hbWUoKSByZXR1cm5zIE5vbmUgYW5kIGJvdGggbGluZQorbnVtYmVycyBhcmUgemVybzsgbmV4dGZpbGUoKSBoYXMgbm8gZWZmZWN0LiAgQWZ0ZXIgYWxsIGxpbmVzIGhhdmUgYmVlbgorcmVhZCwgZmlsZW5hbWUoKSBhbmQgdGhlIGxpbmUgbnVtYmVyIGZ1bmN0aW9ucyByZXR1cm4gdGhlIHZhbHVlcworcGVydGFpbmluZyB0byB0aGUgbGFzdCBsaW5lIHJlYWQ7IG5leHRmaWxlKCkgaGFzIG5vIGVmZmVjdC4KKworQWxsIGZpbGVzIGFyZSBvcGVuZWQgaW4gdGV4dCBtb2RlIGJ5IGRlZmF1bHQsIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBieQorc2V0dGluZyB0aGUgbW9kZSBwYXJhbWV0ZXIgdG8gaW5wdXQoKSBvciBGaWxlSW5wdXQuX19pbml0X18oKS4KK0lmIGFuIEkvTyBlcnJvciBvY2N1cnMgZHVyaW5nIG9wZW5pbmcgb3IgcmVhZGluZyBhIGZpbGUsIHRoZSBJT0Vycm9yCitleGNlcHRpb24gaXMgcmFpc2VkLgorCitJZiBzeXMuc3RkaW4gaXMgdXNlZCBtb3JlIHRoYW4gb25jZSwgdGhlIHNlY29uZCBhbmQgZnVydGhlciB1c2Ugd2lsbAorcmV0dXJuIG5vIGxpbmVzLCBleGNlcHQgcGVyaGFwcyBmb3IgaW50ZXJhY3RpdmUgdXNlLCBvciBpZiBpdCBoYXMgYmVlbgorZXhwbGljaXRseSByZXNldCAoZS5nLiB1c2luZyBzeXMuc3RkaW4uc2VlaygwKSkuCisKK0VtcHR5IGZpbGVzIGFyZSBvcGVuZWQgYW5kIGltbWVkaWF0ZWx5IGNsb3NlZDsgdGhlIG9ubHkgdGltZSB0aGVpcgorcHJlc2VuY2UgaW4gdGhlIGxpc3Qgb2YgZmlsZW5hbWVzIGlzIG5vdGljZWFibGUgYXQgYWxsIGlzIHdoZW4gdGhlCitsYXN0IGZpbGUgb3BlbmVkIGlzIGVtcHR5LgorCitJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIGRvZXNuJ3QgZW5kIGluIGEgbmV3bGluZQorY2hhcmFjdGVyOyBvdGhlcndpc2UgbGluZXMgYXJlIHJldHVybmVkIGluY2x1ZGluZyB0aGUgdHJhaWxpbmcKK25ld2xpbmUuCisKK0NsYXNzIEZpbGVJbnB1dCBpcyB0aGUgaW1wbGVtZW50YXRpb247IGl0cyBtZXRob2RzIGZpbGVuYW1lKCksCitsaW5lbm8oKSwgZmlsZWxpbmUoKSwgaXNmaXJzdGxpbmUoKSwgaXNzdGRpbigpLCBuZXh0ZmlsZSgpIGFuZCBjbG9zZSgpCitjb3JyZXNwb25kIHRvIHRoZSBmdW5jdGlvbnMgaW4gdGhlIG1vZHVsZS4gIEluIGFkZGl0aW9uIGl0IGhhcyBhCityZWFkbGluZSgpIG1ldGhvZCB3aGljaCByZXR1cm5zIHRoZSBuZXh0IGlucHV0IGxpbmUsIGFuZCBhCitfX2dldGl0ZW1fXygpIG1ldGhvZCB3aGljaCBpbXBsZW1lbnRzIHRoZSBzZXF1ZW5jZSBiZWhhdmlvci4gIFRoZQorc2VxdWVuY2UgbXVzdCBiZSBhY2Nlc3NlZCBpbiBzdHJpY3RseSBzZXF1ZW50aWFsIG9yZGVyOyBzZXF1ZW5jZQorYWNjZXNzIGFuZCByZWFkbGluZSgpIGNhbm5vdCBiZSBtaXhlZC4KKworT3B0aW9uYWwgaW4tcGxhY2UgZmlsdGVyaW5nOiBpZiB0aGUga2V5d29yZCBhcmd1bWVudCBpbnBsYWNlPTEgaXMKK3Bhc3NlZCB0byBpbnB1dCgpIG9yIHRvIHRoZSBGaWxlSW5wdXQgY29uc3RydWN0b3IsIHRoZSBmaWxlIGlzIG1vdmVkCit0byBhIGJhY2t1cCBmaWxlIGFuZCBzdGFuZGFyZCBvdXRwdXQgaXMgZGlyZWN0ZWQgdG8gdGhlIGlucHV0IGZpbGUuCitUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHdyaXRlIGEgZmlsdGVyIHRoYXQgcmV3cml0ZXMgaXRzIGlucHV0IGZpbGUKK2luIHBsYWNlLiAgSWYgdGhlIGtleXdvcmQgYXJndW1lbnQgYmFja3VwPSIuPHNvbWUgZXh0ZW5zaW9uPiIgaXMgYWxzbworZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgZXh0ZW5zaW9uIGZvciB0aGUgYmFja3VwIGZpbGUsIGFuZCB0aGUgYmFja3VwCitmaWxlIHJlbWFpbnMgYXJvdW5kOyBieSBkZWZhdWx0LCB0aGUgZXh0ZW5zaW9uIGlzICIuYmFrIiBhbmQgaXQgaXMKK2RlbGV0ZWQgd2hlbiB0aGUgb3V0cHV0IGZpbGUgaXMgY2xvc2VkLiAgSW4tcGxhY2UgZmlsdGVyaW5nIGlzCitkaXNhYmxlZCB3aGVuIHN0YW5kYXJkIGlucHV0IGlzIHJlYWQuICBYWFggVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KK2RvZXMgbm90IHdvcmsgZm9yIE1TLURPUyA4KzMgZmlsZXN5c3RlbXMuCisKK1BlcmZvcm1hbmNlOiB0aGlzIG1vZHVsZSBpcyB1bmZvcnR1bmF0ZWx5IG9uZSBvZiB0aGUgc2xvd2VyIHdheXMgb2YKK3Byb2Nlc3NpbmcgbGFyZ2UgbnVtYmVycyBvZiBpbnB1dCBsaW5lcy4gIE5ldmVydGhlbGVzcywgYSBzaWduaWZpY2FudAorc3BlZWQtdXAgaGFzIGJlZW4gb2J0YWluZWQgYnkgdXNpbmcgcmVhZGxpbmVzKGJ1ZnNpemUpIGluc3RlYWQgb2YKK3JlYWRsaW5lKCkuICBBIG5ldyBrZXl3b3JkIGFyZ3VtZW50LCBidWZzaXplPU4sIGlzIHByZXNlbnQgb24gdGhlCitpbnB1dCgpIGZ1bmN0aW9uIGFuZCB0aGUgRmlsZUlucHV0KCkgY2xhc3MgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQKK2J1ZmZlciBzaXplLgorCitYWFggUG9zc2libGUgYWRkaXRpb25zOgorCistIG9wdGlvbmFsIGdldG9wdCBhcmd1bWVudCBwcm9jZXNzaW5nCistIGlzYXR0eSgpCistIHJlYWQoKSwgcmVhZChzaXplKSwgZXZlbiByZWFkbGluZXMoKQorCisiIiIKKworaW1wb3J0IHN5cywgb3MKKworX19hbGxfXyA9IFsiaW5wdXQiLCJjbG9zZSIsIm5leHRmaWxlIiwiZmlsZW5hbWUiLCJsaW5lbm8iLCJmaWxlbGluZW5vIiwKKyAgICAgICAgICAgImlzZmlyc3RsaW5lIiwiaXNzdGRpbiIsIkZpbGVJbnB1dCJdCisKK19zdGF0ZSA9IE5vbmUKKworREVGQVVMVF9CVUZTSVpFID0gOCoxMDI0CisKK2RlZiBpbnB1dChmaWxlcz1Ob25lLCBpbnBsYWNlPTAsIGJhY2t1cD0iIiwgYnVmc2l6ZT0wLAorICAgICAgICAgIG1vZGU9InIiLCBvcGVuaG9vaz1Ob25lKToKKyAgICAiIiJpbnB1dChbZmlsZXNbLCBpbnBsYWNlWywgYmFja3VwWywgbW9kZVssIG9wZW5ob29rXV1dXV0pCisKKyAgICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIEZpbGVJbnB1dCBjbGFzcy4gVGhlIGluc3RhbmNlIHdpbGwgYmUgdXNlZAorICAgIGFzIGdsb2JhbCBzdGF0ZSBmb3IgdGhlIGZ1bmN0aW9ucyBvZiB0aGlzIG1vZHVsZSwgYW5kIGlzIGFsc28gcmV0dXJuZWQKKyAgICB0byB1c2UgZHVyaW5nIGl0ZXJhdGlvbi4gVGhlIHBhcmFtZXRlcnMgdG8gdGhpcyBmdW5jdGlvbiB3aWxsIGJlIHBhc3NlZAorICAgIGFsb25nIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgRmlsZUlucHV0IGNsYXNzLgorICAgICIiIgorICAgIGdsb2JhbCBfc3RhdGUKKyAgICBpZiBfc3RhdGUgYW5kIF9zdGF0ZS5fZmlsZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiaW5wdXQoKSBhbHJlYWR5IGFjdGl2ZSIKKyAgICBfc3RhdGUgPSBGaWxlSW5wdXQoZmlsZXMsIGlucGxhY2UsIGJhY2t1cCwgYnVmc2l6ZSwgbW9kZSwgb3Blbmhvb2spCisgICAgcmV0dXJuIF9zdGF0ZQorCitkZWYgY2xvc2UoKToKKyAgICAiIiJDbG9zZSB0aGUgc2VxdWVuY2UuIiIiCisgICAgZ2xvYmFsIF9zdGF0ZQorICAgIHN0YXRlID0gX3N0YXRlCisgICAgX3N0YXRlID0gTm9uZQorICAgIGlmIHN0YXRlOgorICAgICAgICBzdGF0ZS5jbG9zZSgpCisKK2RlZiBuZXh0ZmlsZSgpOgorICAgICIiIgorICAgIENsb3NlIHRoZSBjdXJyZW50IGZpbGUgc28gdGhhdCB0aGUgbmV4dCBpdGVyYXRpb24gd2lsbCByZWFkIHRoZSBmaXJzdAorICAgIGxpbmUgZnJvbSB0aGUgbmV4dCBmaWxlIChpZiBhbnkpOyBsaW5lcyBub3QgcmVhZCBmcm9tIHRoZSBmaWxlIHdpbGwKKyAgICBub3QgY291bnQgdG93YXJkcyB0aGUgY3VtdWxhdGl2ZSBsaW5lIGNvdW50LiBUaGUgZmlsZW5hbWUgaXMgbm90CisgICAgY2hhbmdlZCB1bnRpbCBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiB0aGUgbmV4dCBmaWxlIGhhcyBiZWVuIHJlYWQuCisgICAgQmVmb3JlIHRoZSBmaXJzdCBsaW5lIGhhcyBiZWVuIHJlYWQsIHRoaXMgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdDsKKyAgICBpdCBjYW5ub3QgYmUgdXNlZCB0byBza2lwIHRoZSBmaXJzdCBmaWxlLiBBZnRlciB0aGUgbGFzdCBsaW5lIG9mIHRoZQorICAgIGxhc3QgZmlsZSBoYXMgYmVlbiByZWFkLCB0aGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QuCisgICAgIiIiCisgICAgaWYgbm90IF9zdGF0ZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gYWN0aXZlIGlucHV0KCkiCisgICAgcmV0dXJuIF9zdGF0ZS5uZXh0ZmlsZSgpCisKK2RlZiBmaWxlbmFtZSgpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlsZSBjdXJyZW50bHkgYmVpbmcgcmVhZC4KKyAgICBCZWZvcmUgdGhlIGZpcnN0IGxpbmUgaGFzIGJlZW4gcmVhZCwgcmV0dXJucyBOb25lLgorICAgICIiIgorICAgIGlmIG5vdCBfc3RhdGU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIm5vIGFjdGl2ZSBpbnB1dCgpIgorICAgIHJldHVybiBfc3RhdGUuZmlsZW5hbWUoKQorCitkZWYgbGluZW5vKCk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBjdW11bGF0aXZlIGxpbmUgbnVtYmVyIG9mIHRoZSBsaW5lIHRoYXQgaGFzIGp1c3QgYmVlbiByZWFkLgorICAgIEJlZm9yZSB0aGUgZmlyc3QgbGluZSBoYXMgYmVlbiByZWFkLCByZXR1cm5zIDAuIEFmdGVyIHRoZSBsYXN0IGxpbmUKKyAgICBvZiB0aGUgbGFzdCBmaWxlIGhhcyBiZWVuIHJlYWQsIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoYXQgbGluZS4KKyAgICAiIiIKKyAgICBpZiBub3QgX3N0YXRlOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBhY3RpdmUgaW5wdXQoKSIKKyAgICByZXR1cm4gX3N0YXRlLmxpbmVubygpCisKK2RlZiBmaWxlbGluZW5vKCk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBsaW5lIG51bWJlciBpbiB0aGUgY3VycmVudCBmaWxlLiBCZWZvcmUgdGhlIGZpcnN0IGxpbmUKKyAgICBoYXMgYmVlbiByZWFkLCByZXR1cm5zIDAuIEFmdGVyIHRoZSBsYXN0IGxpbmUgb2YgdGhlIGxhc3QgZmlsZSBoYXMKKyAgICBiZWVuIHJlYWQsIHJldHVybnMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoYXQgbGluZSB3aXRoaW4gdGhlIGZpbGUuCisgICAgIiIiCisgICAgaWYgbm90IF9zdGF0ZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gYWN0aXZlIGlucHV0KCkiCisgICAgcmV0dXJuIF9zdGF0ZS5maWxlbGluZW5vKCkKKworZGVmIGZpbGVubygpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgZmlsZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgZmlsZS4gV2hlbiBubyBmaWxlIGlzIGN1cnJlbnRseQorICAgIG9wZW5lZCwgcmV0dXJucyAtMS4KKyAgICAiIiIKKyAgICBpZiBub3QgX3N0YXRlOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJubyBhY3RpdmUgaW5wdXQoKSIKKyAgICByZXR1cm4gX3N0YXRlLmZpbGVubygpCisKK2RlZiBpc2ZpcnN0bGluZSgpOgorICAgICIiIgorICAgIFJldHVybnMgdHJ1ZSB0aGUgbGluZSBqdXN0IHJlYWQgaXMgdGhlIGZpcnN0IGxpbmUgb2YgaXRzIGZpbGUsCisgICAgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgIiIiCisgICAgaWYgbm90IF9zdGF0ZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gYWN0aXZlIGlucHV0KCkiCisgICAgcmV0dXJuIF9zdGF0ZS5pc2ZpcnN0bGluZSgpCisKK2RlZiBpc3N0ZGluKCk6CisgICAgIiIiCisgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBsYXN0IGxpbmUgd2FzIHJlYWQgZnJvbSBzeXMuc3RkaW4sCisgICAgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgIiIiCisgICAgaWYgbm90IF9zdGF0ZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gYWN0aXZlIGlucHV0KCkiCisgICAgcmV0dXJuIF9zdGF0ZS5pc3N0ZGluKCkKKworY2xhc3MgRmlsZUlucHV0OgorICAgICIiImNsYXNzIEZpbGVJbnB1dChbZmlsZXNbLCBpbnBsYWNlWywgYmFja3VwWywgbW9kZVssIG9wZW5ob29rXV1dXV0pCisKKyAgICBDbGFzcyBGaWxlSW5wdXQgaXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2R1bGU7IGl0cyBtZXRob2RzCisgICAgZmlsZW5hbWUoKSwgbGluZW5vKCksIGZpbGVsaW5lKCksIGlzZmlyc3RsaW5lKCksIGlzc3RkaW4oKSwgZmlsZW5vKCksCisgICAgbmV4dGZpbGUoKSBhbmQgY2xvc2UoKSBjb3JyZXNwb25kIHRvIHRoZSBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZQorICAgIGluIHRoZSBtb2R1bGUuCisgICAgSW4gYWRkaXRpb24gaXQgaGFzIGEgcmVhZGxpbmUoKSBtZXRob2Qgd2hpY2ggcmV0dXJucyB0aGUgbmV4dAorICAgIGlucHV0IGxpbmUsIGFuZCBhIF9fZ2V0aXRlbV9fKCkgbWV0aG9kIHdoaWNoIGltcGxlbWVudHMgdGhlCisgICAgc2VxdWVuY2UgYmVoYXZpb3IuIFRoZSBzZXF1ZW5jZSBtdXN0IGJlIGFjY2Vzc2VkIGluIHN0cmljdGx5CisgICAgc2VxdWVudGlhbCBvcmRlcjsgcmFuZG9tIGFjY2VzcyBhbmQgcmVhZGxpbmUoKSBjYW5ub3QgYmUgbWl4ZWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZXM9Tm9uZSwgaW5wbGFjZT0wLCBiYWNrdXA9IiIsIGJ1ZnNpemU9MCwKKyAgICAgICAgICAgICAgICAgbW9kZT0iciIsIG9wZW5ob29rPU5vbmUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGZpbGVzID0gKGZpbGVzLCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGZpbGVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZmlsZXMgPSBzeXMuYXJndlsxOl0KKyAgICAgICAgICAgIGlmIG5vdCBmaWxlczoKKyAgICAgICAgICAgICAgICBmaWxlcyA9ICgnLScsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmaWxlcyA9IHR1cGxlKGZpbGVzKQorICAgICAgICBzZWxmLl9maWxlcyA9IGZpbGVzCisgICAgICAgIHNlbGYuX2lucGxhY2UgPSBpbnBsYWNlCisgICAgICAgIHNlbGYuX2JhY2t1cCA9IGJhY2t1cAorICAgICAgICBzZWxmLl9idWZzaXplID0gYnVmc2l6ZSBvciBERUZBVUxUX0JVRlNJWkUKKyAgICAgICAgc2VsZi5fc2F2ZXN0ZG91dCA9IE5vbmUKKyAgICAgICAgc2VsZi5fb3V0cHV0ID0gTm9uZQorICAgICAgICBzZWxmLl9maWxlbmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fbGluZW5vID0gMAorICAgICAgICBzZWxmLl9maWxlbGluZW5vID0gMAorICAgICAgICBzZWxmLl9maWxlID0gTm9uZQorICAgICAgICBzZWxmLl9pc3N0ZGluID0gRmFsc2UKKyAgICAgICAgc2VsZi5fYmFja3VwZmlsZW5hbWUgPSBOb25lCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgIHNlbGYuX2J1ZmluZGV4ID0gMAorICAgICAgICAjIHJlc3RyaWN0IG1vZGUgYXJndW1lbnQgdG8gcmVhZGluZyBtb2RlcworICAgICAgICBpZiBtb2RlIG5vdCBpbiAoJ3InLCAnclUnLCAnVScsICdyYicpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmlsZUlucHV0IG9wZW5pbmcgbW9kZSBtdXN0IGJlIG9uZSBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIncicsICdyVScsICdVJyBhbmQgJ3JiJyIpCisgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIGlmIGlucGxhY2UgYW5kIG9wZW5ob29rOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRmlsZUlucHV0IGNhbm5vdCB1c2UgYW4gb3BlbmluZyBob29rIGluIGlucGxhY2UgbW9kZSIpCisgICAgICAgIGVsaWYgb3Blbmhvb2sgYW5kIG5vdCBoYXNhdHRyKG9wZW5ob29rLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkZpbGVJbnB1dCBvcGVuaG9vayBtdXN0IGJlIGNhbGxhYmxlIikKKyAgICAgICAgc2VsZi5fb3Blbmhvb2sgPSBvcGVuaG9vaworCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLm5leHRmaWxlKCkKKyAgICAgICAgc2VsZi5fZmlsZXMgPSAoKQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9idWZmZXJbc2VsZi5fYnVmaW5kZXhdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYnVmaW5kZXggKz0gMQorICAgICAgICAgICAgc2VsZi5fbGluZW5vICs9IDEKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVsaW5lbm8gKz0gMQorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgaWYgaSAhPSBzZWxmLl9saW5lbm86CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJhY2Nlc3NpbmcgbGluZXMgb3V0IG9mIG9yZGVyIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZXh0KCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yLCAiZW5kIG9mIGlucHV0IHJlYWNoZWQiCisKKyAgICBkZWYgbmV4dGZpbGUoc2VsZik6CisgICAgICAgIHNhdmVzdGRvdXQgPSBzZWxmLl9zYXZlc3Rkb3V0CisgICAgICAgIHNlbGYuX3NhdmVzdGRvdXQgPSAwCisgICAgICAgIGlmIHNhdmVzdGRvdXQ6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZXN0ZG91dAorCisgICAgICAgIG91dHB1dCA9IHNlbGYuX291dHB1dAorICAgICAgICBzZWxmLl9vdXRwdXQgPSAwCisgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpCisKKyAgICAgICAgZmlsZSA9IHNlbGYuX2ZpbGUKKyAgICAgICAgc2VsZi5fZmlsZSA9IDAKKyAgICAgICAgaWYgZmlsZSBhbmQgbm90IHNlbGYuX2lzc3RkaW46CisgICAgICAgICAgICBmaWxlLmNsb3NlKCkKKworICAgICAgICBiYWNrdXBmaWxlbmFtZSA9IHNlbGYuX2JhY2t1cGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2JhY2t1cGZpbGVuYW1lID0gMAorICAgICAgICBpZiBiYWNrdXBmaWxlbmFtZSBhbmQgbm90IHNlbGYuX2JhY2t1cDoKKyAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGJhY2t1cGZpbGVuYW1lKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKKworICAgICAgICBzZWxmLl9pc3N0ZGluID0gRmFsc2UKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi5fYnVmaW5kZXggPSAwCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9idWZmZXJbc2VsZi5fYnVmaW5kZXhdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fYnVmaW5kZXggKz0gMQorICAgICAgICAgICAgc2VsZi5fbGluZW5vICs9IDEKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVsaW5lbm8gKz0gMQorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGU6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZmlsZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICBzZWxmLl9maWxlbmFtZSA9IHNlbGYuX2ZpbGVzWzBdCisgICAgICAgICAgICBzZWxmLl9maWxlcyA9IHNlbGYuX2ZpbGVzWzE6XQorICAgICAgICAgICAgc2VsZi5fZmlsZWxpbmVubyA9IDAKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9pc3N0ZGluID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYuX2JhY2t1cGZpbGVuYW1lID0gMAorICAgICAgICAgICAgaWYgc2VsZi5fZmlsZW5hbWUgPT0gJy0nOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVuYW1lID0gJzxzdGRpbj4nCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZSA9IHN5cy5zdGRpbgorICAgICAgICAgICAgICAgIHNlbGYuX2lzc3RkaW4gPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2lucGxhY2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JhY2t1cGZpbGVuYW1lID0gKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW5hbWUgKyAoc2VsZi5fYmFja3VwIG9yIG9zLmV4dHNlcCsiYmFrIikpCisgICAgICAgICAgICAgICAgICAgIHRyeTogb3MudW5saW5rKHNlbGYuX2JhY2t1cGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6IHBhc3MKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmV4dCBmZXcgbGluZXMgbWF5IHJhaXNlIElPRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKHNlbGYuX2ZpbGVuYW1lLCBzZWxmLl9iYWNrdXBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZSA9IG9wZW4oc2VsZi5fYmFja3VwZmlsZW5hbWUsIHNlbGYuX21vZGUpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcm0gPSBvcy5mc3RhdChzZWxmLl9maWxlLmZpbGVubygpKS5zdF9tb2RlCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3V0cHV0ID0gb3BlbihzZWxmLl9maWxlbmFtZSwgInciKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZmQgPSBvcy5vcGVuKHNlbGYuX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fQ1JFQVQgfCBvcy5PX1dST05MWSB8IG9zLk9fVFJVTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX291dHB1dCA9IG9zLmZkb3BlbihmZCwgInciKQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICdjaG1vZCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5jaG1vZChzZWxmLl9maWxlbmFtZSwgcGVybSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc2F2ZXN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuX291dHB1dAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVGhpcyBtYXkgcmFpc2UgSU9FcnJvcgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9vcGVuaG9vazoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBzZWxmLl9vcGVuaG9vayhzZWxmLl9maWxlbmFtZSwgc2VsZi5fbW9kZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBvcGVuKHNlbGYuX2ZpbGVuYW1lLCBzZWxmLl9tb2RlKQorICAgICAgICBzZWxmLl9idWZmZXIgPSBzZWxmLl9maWxlLnJlYWRsaW5lcyhzZWxmLl9idWZzaXplKQorICAgICAgICBzZWxmLl9idWZpbmRleCA9IDAKKyAgICAgICAgaWYgbm90IHNlbGYuX2J1ZmZlcjoKKyAgICAgICAgICAgIHNlbGYubmV4dGZpbGUoKQorICAgICAgICAjIFJlY3Vyc2l2ZSBjYWxsCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRsaW5lKCkKKworICAgIGRlZiBmaWxlbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lCisKKyAgICBkZWYgbGluZW5vKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbGluZW5vCisKKyAgICBkZWYgZmlsZWxpbmVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVsaW5lbm8KKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2ZpbGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUuZmlsZW5vKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIC0xCisKKyAgICBkZWYgaXNmaXJzdGxpbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbGluZW5vID09IDEKKworICAgIGRlZiBpc3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXNzdGRpbgorCisKK2RlZiBob29rX2NvbXByZXNzZWQoZmlsZW5hbWUsIG1vZGUpOgorICAgIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpWzFdCisgICAgaWYgZXh0ID09ICcuZ3onOgorICAgICAgICBpbXBvcnQgZ3ppcAorICAgICAgICByZXR1cm4gZ3ppcC5vcGVuKGZpbGVuYW1lLCBtb2RlKQorICAgIGVsaWYgZXh0ID09ICcuYnoyJzoKKyAgICAgICAgaW1wb3J0IGJ6MgorICAgICAgICByZXR1cm4gYnoyLkJaMkZpbGUoZmlsZW5hbWUsIG1vZGUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsIG1vZGUpCisKKworZGVmIGhvb2tfZW5jb2RlZChlbmNvZGluZyk6CisgICAgaW1wb3J0IGNvZGVjcworICAgIGRlZiBvcGVuaG9vayhmaWxlbmFtZSwgbW9kZSk6CisgICAgICAgIHJldHVybiBjb2RlY3Mub3BlbihmaWxlbmFtZSwgbW9kZSwgZW5jb2RpbmcpCisgICAgcmV0dXJuIG9wZW5ob29rCisKKworZGVmIF90ZXN0KCk6CisgICAgaW1wb3J0IGdldG9wdAorICAgIGlucGxhY2UgPSAwCisgICAgYmFja3VwID0gMAorICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImliOiIpCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLWknOiBpbnBsYWNlID0gMQorICAgICAgICBpZiBvID09ICctYic6IGJhY2t1cCA9IGEKKyAgICBmb3IgbGluZSBpbiBpbnB1dChhcmdzLCBpbnBsYWNlPWlucGxhY2UsIGJhY2t1cD1iYWNrdXApOgorICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQorICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xyJzogbGluZSA9IGxpbmVbOi0xXQorICAgICAgICBwcmludCAiJWQ6ICVzWyVkXSVzICVzIiAlIChsaW5lbm8oKSwgZmlsZW5hbWUoKSwgZmlsZWxpbmVubygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2ZpcnN0bGluZSgpIGFuZCAiKiIgb3IgIiIsIGxpbmUpCisgICAgcHJpbnQgIiVkOiAlc1slZF0iICUgKGxpbmVubygpLCBmaWxlbmFtZSgpLCBmaWxlbGluZW5vKCkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHljIGIvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDFhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZpbGVpbnB1dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHlvIGIvbGliL3B5dGhvbjIuNy9maWxlaW5wdXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDFhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZpbGVpbnB1dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5IGIvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTk5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZubWF0Y2gucHkKQEAgLTAsMCArMSwxMTYgQEAKKyIiIkZpbGVuYW1lIG1hdGNoaW5nIHdpdGggc2hlbGwgcGF0dGVybnMuCisKK2ZubWF0Y2goRklMRU5BTUUsIFBBVFRFUk4pIG1hdGNoZXMgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbCBjb252ZW50aW9uLgorZm5tYXRjaGNhc2UoRklMRU5BTUUsIFBBVFRFUk4pIGFsd2F5cyB0YWtlcyBjYXNlIGluIGFjY291bnQuCisKK1RoZSBmdW5jdGlvbnMgb3BlcmF0ZSBieSB0cmFuc2xhdGluZyB0aGUgcGF0dGVybiBpbnRvIGEgcmVndWxhcgorZXhwcmVzc2lvbi4gIFRoZXkgY2FjaGUgdGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIHNwZWVkLgorCitUaGUgZnVuY3Rpb24gdHJhbnNsYXRlKFBBVFRFUk4pIHJldHVybnMgYSByZWd1bGFyIGV4cHJlc3Npb24KK2NvcnJlc3BvbmRpbmcgdG8gUEFUVEVSTi4gIChJdCBkb2VzIG5vdCBjb21waWxlIGl0LikKKyIiIgorCitpbXBvcnQgcmUKKworX19hbGxfXyA9IFsiZmlsdGVyIiwgImZubWF0Y2giLCAiZm5tYXRjaGNhc2UiLCAidHJhbnNsYXRlIl0KKworX2NhY2hlID0ge30KK19NQVhDQUNIRSA9IDEwMAorCitkZWYgX3B1cmdlKCk6CisgICAgIiIiQ2xlYXIgdGhlIHBhdHRlcm4gY2FjaGUiIiIKKyAgICBfY2FjaGUuY2xlYXIoKQorCitkZWYgZm5tYXRjaChuYW1lLCBwYXQpOgorICAgICIiIlRlc3Qgd2hldGhlciBGSUxFTkFNRSBtYXRjaGVzIFBBVFRFUk4uCisKKyAgICBQYXR0ZXJucyBhcmUgVW5peCBzaGVsbCBzdHlsZToKKworICAgICogICAgICAgbWF0Y2hlcyBldmVyeXRoaW5nCisgICAgPyAgICAgICBtYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyCisgICAgW3NlcV0gICBtYXRjaGVzIGFueSBjaGFyYWN0ZXIgaW4gc2VxCisgICAgWyFzZXFdICBtYXRjaGVzIGFueSBjaGFyIG5vdCBpbiBzZXEKKworICAgIEFuIGluaXRpYWwgcGVyaW9kIGluIEZJTEVOQU1FIGlzIG5vdCBzcGVjaWFsLgorICAgIEJvdGggRklMRU5BTUUgYW5kIFBBVFRFUk4gYXJlIGZpcnN0IGNhc2Utbm9ybWFsaXplZAorICAgIGlmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHJlcXVpcmVzIGl0LgorICAgIElmIHlvdSBkb24ndCB3YW50IHRoaXMsIHVzZSBmbm1hdGNoY2FzZShGSUxFTkFNRSwgUEFUVEVSTikuCisgICAgIiIiCisKKyAgICBpbXBvcnQgb3MKKyAgICBuYW1lID0gb3MucGF0aC5ub3JtY2FzZShuYW1lKQorICAgIHBhdCA9IG9zLnBhdGgubm9ybWNhc2UocGF0KQorICAgIHJldHVybiBmbm1hdGNoY2FzZShuYW1lLCBwYXQpCisKK2RlZiBmaWx0ZXIobmFtZXMsIHBhdCk6CisgICAgIiIiUmV0dXJuIHRoZSBzdWJzZXQgb2YgdGhlIGxpc3QgTkFNRVMgdGhhdCBtYXRjaCBQQVQiIiIKKyAgICBpbXBvcnQgb3MscG9zaXhwYXRoCisgICAgcmVzdWx0PVtdCisgICAgcGF0PW9zLnBhdGgubm9ybWNhc2UocGF0KQorICAgIGlmIG5vdCBwYXQgaW4gX2NhY2hlOgorICAgICAgICByZXMgPSB0cmFuc2xhdGUocGF0KQorICAgICAgICBpZiBsZW4oX2NhY2hlKSA+PSBfTUFYQ0FDSEU6CisgICAgICAgICAgICBfY2FjaGUuY2xlYXIoKQorICAgICAgICBfY2FjaGVbcGF0XSA9IHJlLmNvbXBpbGUocmVzKQorICAgIG1hdGNoPV9jYWNoZVtwYXRdLm1hdGNoCisgICAgaWYgb3MucGF0aCBpcyBwb3NpeHBhdGg6CisgICAgICAgICMgbm9ybWNhc2Ugb24gcG9zaXggaXMgTk9QLiBPcHRpbWl6ZSBpdCBhd2F5IGZyb20gdGhlIGxvb3AuCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgaWYgbWF0Y2gobmFtZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChuYW1lKQorICAgIGVsc2U6CisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgaWYgbWF0Y2gob3MucGF0aC5ub3JtY2FzZShuYW1lKSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChuYW1lKQorICAgIHJldHVybiByZXN1bHQKKworZGVmIGZubWF0Y2hjYXNlKG5hbWUsIHBhdCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIEZJTEVOQU1FIG1hdGNoZXMgUEFUVEVSTiwgaW5jbHVkaW5nIGNhc2UuCisKKyAgICBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmbm1hdGNoKCkgd2hpY2ggZG9lc24ndCBjYXNlLW5vcm1hbGl6ZQorICAgIGl0cyBhcmd1bWVudHMuCisgICAgIiIiCisKKyAgICBpZiBub3QgcGF0IGluIF9jYWNoZToKKyAgICAgICAgcmVzID0gdHJhbnNsYXRlKHBhdCkKKyAgICAgICAgaWYgbGVuKF9jYWNoZSkgPj0gX01BWENBQ0hFOgorICAgICAgICAgICAgX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgX2NhY2hlW3BhdF0gPSByZS5jb21waWxlKHJlcykKKyAgICByZXR1cm4gX2NhY2hlW3BhdF0ubWF0Y2gobmFtZSkgaXMgbm90IE5vbmUKKworZGVmIHRyYW5zbGF0ZShwYXQpOgorICAgICIiIlRyYW5zbGF0ZSBhIHNoZWxsIFBBVFRFUk4gdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCisKKyAgICBUaGVyZSBpcyBubyB3YXkgdG8gcXVvdGUgbWV0YS1jaGFyYWN0ZXJzLgorICAgICIiIgorCisgICAgaSwgbiA9IDAsIGxlbihwYXQpCisgICAgcmVzID0gJycKKyAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgYyA9IHBhdFtpXQorICAgICAgICBpID0gaSsxCisgICAgICAgIGlmIGMgPT0gJyonOgorICAgICAgICAgICAgcmVzID0gcmVzICsgJy4qJworICAgICAgICBlbGlmIGMgPT0gJz8nOgorICAgICAgICAgICAgcmVzID0gcmVzICsgJy4nCisgICAgICAgIGVsaWYgYyA9PSAnWyc6CisgICAgICAgICAgICBqID0gaQorICAgICAgICAgICAgaWYgaiA8IG4gYW5kIHBhdFtqXSA9PSAnISc6CisgICAgICAgICAgICAgICAgaiA9IGorMQorICAgICAgICAgICAgaWYgaiA8IG4gYW5kIHBhdFtqXSA9PSAnXSc6CisgICAgICAgICAgICAgICAgaiA9IGorMQorICAgICAgICAgICAgd2hpbGUgaiA8IG4gYW5kIHBhdFtqXSAhPSAnXSc6CisgICAgICAgICAgICAgICAgaiA9IGorMQorICAgICAgICAgICAgaWYgaiA+PSBuOgorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICdcXFsnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0dWZmID0gcGF0W2k6al0ucmVwbGFjZSgnXFwnLCdcXFxcJykKKyAgICAgICAgICAgICAgICBpID0gaisxCisgICAgICAgICAgICAgICAgaWYgc3R1ZmZbMF0gPT0gJyEnOgorICAgICAgICAgICAgICAgICAgICBzdHVmZiA9ICdeJyArIHN0dWZmWzE6XQorICAgICAgICAgICAgICAgIGVsaWYgc3R1ZmZbMF0gPT0gJ14nOgorICAgICAgICAgICAgICAgICAgICBzdHVmZiA9ICdcXCcgKyBzdHVmZgorICAgICAgICAgICAgICAgIHJlcyA9ICclc1slc10nICUgKHJlcywgc3R1ZmYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXMgPSByZXMgKyByZS5lc2NhcGUoYykKKyAgICByZXR1cm4gcmVzICsgJ1xaKD9tcyknCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZubWF0Y2gucHljIGIvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzg2OGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZubWF0Y2gucHlvIGIvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzg2OGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mbm1hdGNoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weSBiL2xpYi9weXRob24yLjcvZm9ybWF0dGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYThmZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weQpAQCAtMCwwICsxLDQ0NSBAQAorIiIiR2VuZXJpYyBvdXRwdXQgZm9ybWF0dGluZy4KKworRm9ybWF0dGVyIG9iamVjdHMgdHJhbnNmb3JtIGFuIGFic3RyYWN0IGZsb3cgb2YgZm9ybWF0dGluZyBldmVudHMgaW50bworc3BlY2lmaWMgb3V0cHV0IGV2ZW50cyBvbiB3cml0ZXIgb2JqZWN0cy4gRm9ybWF0dGVycyBtYW5hZ2Ugc2V2ZXJhbCBzdGFjaworc3RydWN0dXJlcyB0byBhbGxvdyB2YXJpb3VzIHByb3BlcnRpZXMgb2YgYSB3cml0ZXIgb2JqZWN0IHRvIGJlIGNoYW5nZWQgYW5kCityZXN0b3JlZDsgd3JpdGVycyBuZWVkIG5vdCBiZSBhYmxlIHRvIGhhbmRsZSByZWxhdGl2ZSBjaGFuZ2VzIG5vciBhbnkgc29ydAorb2YgYGBjaGFuZ2UgYmFjaycnIG9wZXJhdGlvbi4gU3BlY2lmaWMgd3JpdGVyIHByb3BlcnRpZXMgd2hpY2ggbWF5IGJlCitjb250cm9sbGVkIHZpYSBmb3JtYXR0ZXIgb2JqZWN0cyBhcmUgaG9yaXpvbnRhbCBhbGlnbm1lbnQsIGZvbnQsIGFuZCBsZWZ0CittYXJnaW4gaW5kZW50YXRpb25zLiBBIG1lY2hhbmlzbSBpcyBwcm92aWRlZCB3aGljaCBzdXBwb3J0cyBwcm92aWRpbmcKK2FyYml0cmFyeSwgbm9uLWV4Y2x1c2l2ZSBzdHlsZSBzZXR0aW5ncyB0byBhIHdyaXRlciBhcyB3ZWxsLiBBZGRpdGlvbmFsCitpbnRlcmZhY2VzIGZhY2lsaXRhdGUgZm9ybWF0dGluZyBldmVudHMgd2hpY2ggYXJlIG5vdCByZXZlcnNpYmxlLCBzdWNoIGFzCitwYXJhZ3JhcGggc2VwYXJhdGlvbi4KKworV3JpdGVyIG9iamVjdHMgZW5jYXBzdWxhdGUgZGV2aWNlIGludGVyZmFjZXMuIEFic3RyYWN0IGRldmljZXMsIHN1Y2ggYXMKK2ZpbGUgZm9ybWF0cywgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsIGFzIHBoeXNpY2FsIGRldmljZXMuIFRoZSBwcm92aWRlZAoraW1wbGVtZW50YXRpb25zIGFsbCB3b3JrIHdpdGggYWJzdHJhY3QgZGV2aWNlcy4gVGhlIGludGVyZmFjZSBtYWtlcworYXZhaWxhYmxlIG1lY2hhbmlzbXMgZm9yIHNldHRpbmcgdGhlIHByb3BlcnRpZXMgd2hpY2ggZm9ybWF0dGVyIG9iamVjdHMKK21hbmFnZSBhbmQgaW5zZXJ0aW5nIGRhdGEgaW50byB0aGUgb3V0cHV0LgorIiIiCisKK2ltcG9ydCBzeXMKKworCitBU19JUyA9IE5vbmUKKworCitjbGFzcyBOdWxsRm9ybWF0dGVyOgorICAgICIiIkEgZm9ybWF0dGVyIHdoaWNoIGRvZXMgbm90aGluZy4KKworICAgIElmIHRoZSB3cml0ZXIgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIGEgTnVsbFdyaXRlciBpbnN0YW5jZSBpcyBjcmVhdGVkLgorICAgIE5vIG1ldGhvZHMgb2YgdGhlIHdyaXRlciBhcmUgY2FsbGVkIGJ5IE51bGxGb3JtYXR0ZXIgaW5zdGFuY2VzLgorCisgICAgSW1wbGVtZW50YXRpb25zIHNob3VsZCBpbmhlcml0IGZyb20gdGhpcyBjbGFzcyBpZiBpbXBsZW1lbnRpbmcgYSB3cml0ZXIKKyAgICBpbnRlcmZhY2UgYnV0IGRvbid0IG5lZWQgdG8gaW5oZXJpdCBhbnkgaW1wbGVtZW50YXRpb24uCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cml0ZXI9Tm9uZSk6CisgICAgICAgIGlmIHdyaXRlciBpcyBOb25lOgorICAgICAgICAgICAgd3JpdGVyID0gTnVsbFdyaXRlcigpCisgICAgICAgIHNlbGYud3JpdGVyID0gd3JpdGVyCisgICAgZGVmIGVuZF9wYXJhZ3JhcGgoc2VsZiwgYmxhbmtsaW5lKTogcGFzcworICAgIGRlZiBhZGRfbGluZV9icmVhayhzZWxmKTogcGFzcworICAgIGRlZiBhZGRfaG9yX3J1bGUoc2VsZiwgKmFyZ3MsICoqa3cpOiBwYXNzCisgICAgZGVmIGFkZF9sYWJlbF9kYXRhKHNlbGYsIGZvcm1hdCwgY291bnRlciwgYmxhbmtsaW5lPU5vbmUpOiBwYXNzCisgICAgZGVmIGFkZF9mbG93aW5nX2RhdGEoc2VsZiwgZGF0YSk6IHBhc3MKKyAgICBkZWYgYWRkX2xpdGVyYWxfZGF0YShzZWxmLCBkYXRhKTogcGFzcworICAgIGRlZiBmbHVzaF9zb2Z0c3BhY2Uoc2VsZik6IHBhc3MKKyAgICBkZWYgcHVzaF9hbGlnbm1lbnQoc2VsZiwgYWxpZ24pOiBwYXNzCisgICAgZGVmIHBvcF9hbGlnbm1lbnQoc2VsZik6IHBhc3MKKyAgICBkZWYgcHVzaF9mb250KHNlbGYsIHgpOiBwYXNzCisgICAgZGVmIHBvcF9mb250KHNlbGYpOiBwYXNzCisgICAgZGVmIHB1c2hfbWFyZ2luKHNlbGYsIG1hcmdpbik6IHBhc3MKKyAgICBkZWYgcG9wX21hcmdpbihzZWxmKTogcGFzcworICAgIGRlZiBzZXRfc3BhY2luZyhzZWxmLCBzcGFjaW5nKTogcGFzcworICAgIGRlZiBwdXNoX3N0eWxlKHNlbGYsICpzdHlsZXMpOiBwYXNzCisgICAgZGVmIHBvcF9zdHlsZShzZWxmLCBuPTEpOiBwYXNzCisgICAgZGVmIGFzc2VydF9saW5lX2RhdGEoc2VsZiwgZmxhZz0xKTogcGFzcworCisKK2NsYXNzIEFic3RyYWN0Rm9ybWF0dGVyOgorICAgICIiIlRoZSBzdGFuZGFyZCBmb3JtYXR0ZXIuCisKKyAgICBUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBkZW1vbnN0cmF0ZWQgd2lkZSBhcHBsaWNhYmlsaXR5IHRvIG1hbnkgd3JpdGVycywKKyAgICBhbmQgbWF5IGJlIHVzZWQgZGlyZWN0bHkgaW4gbW9zdCBjaXJjdW1zdGFuY2VzLiAgSXQgaGFzIGJlZW4gdXNlZCB0bworICAgIGltcGxlbWVudCBhIGZ1bGwtZmVhdHVyZWQgV29ybGQgV2lkZSBXZWIgYnJvd3Nlci4KKworICAgICIiIgorCisgICAgIyAgU3BhY2UgaGFuZGxpbmcgcG9saWN5OiAgYmxhbmsgc3BhY2VzIGF0IHRoZSBib3VuZGFyeSBiZXR3ZWVuIGVsZW1lbnRzCisgICAgIyAgYXJlIGhhbmRsZWQgYnkgdGhlIG91dGVybW9zdCBjb250ZXh0LiAgIkxpdGVyYWwiIGRhdGEgaXMgbm90IGNoZWNrZWQKKyAgICAjICB0byBkZXRlcm1pbmUgY29udGV4dCwgc28gc3BhY2VzIGluIGxpdGVyYWwgZGF0YSBhcmUgaGFuZGxlZCBkaXJlY3RseQorICAgICMgIGluIGFsbCBjaXJjdW1zdGFuY2VzLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdyaXRlcik6CisgICAgICAgIHNlbGYud3JpdGVyID0gd3JpdGVyICAgICAgICAgICAgIyBPdXRwdXQgZGV2aWNlCisgICAgICAgIHNlbGYuYWxpZ24gPSBOb25lICAgICAgICAgICAgICAgIyBDdXJyZW50IGFsaWdubWVudAorICAgICAgICBzZWxmLmFsaWduX3N0YWNrID0gW10gICAgICAgICAgICMgQWxpZ25tZW50IHN0YWNrCisgICAgICAgIHNlbGYuZm9udF9zdGFjayA9IFtdICAgICAgICAgICAgIyBGb250IHN0YXRlCisgICAgICAgIHNlbGYubWFyZ2luX3N0YWNrID0gW10gICAgICAgICAgIyBNYXJnaW4gc3RhdGUKKyAgICAgICAgc2VsZi5zcGFjaW5nID0gTm9uZSAgICAgICAgICAgICAjIFZlcnRpY2FsIHNwYWNpbmcgc3RhdGUKKyAgICAgICAgc2VsZi5zdHlsZV9zdGFjayA9IFtdICAgICAgICAgICAjIE90aGVyIHN0YXRlLCBlLmcuIGNvbG9yCisgICAgICAgIHNlbGYubm9zcGFjZSA9IDEgICAgICAgICAgICAgICAgIyBTaG91bGQgbGVhZGluZyBzcGFjZSBiZSBzdXBwcmVzc2VkCisgICAgICAgIHNlbGYuc29mdHNwYWNlID0gMCAgICAgICAgICAgICAgIyBTaG91bGQgYSBzcGFjZSBiZSBpbnNlcnRlZAorICAgICAgICBzZWxmLnBhcmFfZW5kID0gMSAgICAgICAgICAgICAgICMgSnVzdCBlbmRlZCBhIHBhcmFncmFwaAorICAgICAgICBzZWxmLnBhcnNraXAgPSAwICAgICAgICAgICAgICAgICMgU2tpcHBlZCBzcGFjZSBiZXR3ZWVuIHBhcmFncmFwaHM/CisgICAgICAgIHNlbGYuaGFyZF9icmVhayA9IDEgICAgICAgICAgICAgIyBIYXZlIGEgaGFyZCBicmVhaworICAgICAgICBzZWxmLmhhdmVfbGFiZWwgPSAwCisKKyAgICBkZWYgZW5kX3BhcmFncmFwaChzZWxmLCBibGFua2xpbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5oYXJkX2JyZWFrOgorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9saW5lX2JyZWFrKCkKKyAgICAgICAgICAgIHNlbGYuaGF2ZV9sYWJlbCA9IDAKKyAgICAgICAgaWYgc2VsZi5wYXJza2lwIDwgYmxhbmtsaW5lIGFuZCBub3Qgc2VsZi5oYXZlX2xhYmVsOgorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9wYXJhZ3JhcGgoYmxhbmtsaW5lIC0gc2VsZi5wYXJza2lwKQorICAgICAgICAgICAgc2VsZi5wYXJza2lwID0gYmxhbmtsaW5lCisgICAgICAgICAgICBzZWxmLmhhdmVfbGFiZWwgPSAwCisgICAgICAgIHNlbGYuaGFyZF9icmVhayA9IHNlbGYubm9zcGFjZSA9IHNlbGYucGFyYV9lbmQgPSAxCisgICAgICAgIHNlbGYuc29mdHNwYWNlID0gMAorCisgICAgZGVmIGFkZF9saW5lX2JyZWFrKHNlbGYpOgorICAgICAgICBpZiBub3QgKHNlbGYuaGFyZF9icmVhayBvciBzZWxmLnBhcmFfZW5kKToKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfbGluZV9icmVhaygpCisgICAgICAgICAgICBzZWxmLmhhdmVfbGFiZWwgPSBzZWxmLnBhcnNraXAgPSAwCisgICAgICAgIHNlbGYuaGFyZF9icmVhayA9IHNlbGYubm9zcGFjZSA9IDEKKyAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAwCisKKyAgICBkZWYgYWRkX2hvcl9ydWxlKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFyZF9icmVhazoKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfbGluZV9icmVhaygpCisgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfaG9yX3J1bGUoKmFyZ3MsICoqa3cpCisgICAgICAgIHNlbGYuaGFyZF9icmVhayA9IHNlbGYubm9zcGFjZSA9IDEKKyAgICAgICAgc2VsZi5oYXZlX2xhYmVsID0gc2VsZi5wYXJhX2VuZCA9IHNlbGYuc29mdHNwYWNlID0gc2VsZi5wYXJza2lwID0gMAorCisgICAgZGVmIGFkZF9sYWJlbF9kYXRhKHNlbGYsIGZvcm1hdCwgY291bnRlciwgYmxhbmtsaW5lID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuaGF2ZV9sYWJlbCBvciBub3Qgc2VsZi5oYXJkX2JyZWFrOgorICAgICAgICAgICAgc2VsZi53cml0ZXIuc2VuZF9saW5lX2JyZWFrKCkKKyAgICAgICAgaWYgbm90IHNlbGYucGFyYV9lbmQ6CisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX3BhcmFncmFwaCgoYmxhbmtsaW5lIGFuZCAxKSBvciAwKQorICAgICAgICBpZiBpc2luc3RhbmNlKGZvcm1hdCwgc3RyKToKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfbGFiZWxfZGF0YShzZWxmLmZvcm1hdF9jb3VudGVyKGZvcm1hdCwgY291bnRlcikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2xhYmVsX2RhdGEoZm9ybWF0KQorICAgICAgICBzZWxmLm5vc3BhY2UgPSBzZWxmLmhhdmVfbGFiZWwgPSBzZWxmLmhhcmRfYnJlYWsgPSBzZWxmLnBhcmFfZW5kID0gMQorICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IHNlbGYucGFyc2tpcCA9IDAKKworICAgIGRlZiBmb3JtYXRfY291bnRlcihzZWxmLCBmb3JtYXQsIGNvdW50ZXIpOgorICAgICAgICBsYWJlbCA9ICcnCisgICAgICAgIGZvciBjIGluIGZvcm1hdDoKKyAgICAgICAgICAgIGlmIGMgPT0gJzEnOgorICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwgKyAoJyVkJyAlIGNvdW50ZXIpCisgICAgICAgICAgICBlbGlmIGMgaW4gJ2FBJzoKKyAgICAgICAgICAgICAgICBpZiBjb3VudGVyID4gMDoKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbCArIHNlbGYuZm9ybWF0X2xldHRlcihjLCBjb3VudGVyKQorICAgICAgICAgICAgZWxpZiBjIGluICdpSSc6CisgICAgICAgICAgICAgICAgaWYgY291bnRlciA+IDA6CisgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwgKyBzZWxmLmZvcm1hdF9yb21hbihjLCBjb3VudGVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsICsgYworICAgICAgICByZXR1cm4gbGFiZWwKKworICAgIGRlZiBmb3JtYXRfbGV0dGVyKHNlbGYsIGNhc2UsIGNvdW50ZXIpOgorICAgICAgICBsYWJlbCA9ICcnCisgICAgICAgIHdoaWxlIGNvdW50ZXIgPiAwOgorICAgICAgICAgICAgY291bnRlciwgeCA9IGRpdm1vZChjb3VudGVyLTEsIDI2KQorICAgICAgICAgICAgIyBUaGlzIG1ha2VzIGEgc3Ryb25nIGFzc3VtcHRpb24gdGhhdCBsb3dlcmNhc2UgbGV0dGVycworICAgICAgICAgICAgIyBhbmQgdXBwZXJjYXNlIGxldHRlcnMgZm9ybSB0d28gY29udGlndW91cyBibG9ja3MsIHdpdGgKKyAgICAgICAgICAgICMgbGV0dGVycyBpbiBvcmRlciEKKyAgICAgICAgICAgIHMgPSBjaHIob3JkKGNhc2UpICsgeCkKKyAgICAgICAgICAgIGxhYmVsID0gcyArIGxhYmVsCisgICAgICAgIHJldHVybiBsYWJlbAorCisgICAgZGVmIGZvcm1hdF9yb21hbihzZWxmLCBjYXNlLCBjb3VudGVyKToKKyAgICAgICAgb25lcyA9IFsnaScsICd4JywgJ2MnLCAnbSddCisgICAgICAgIGZpdmVzID0gWyd2JywgJ2wnLCAnZCddCisgICAgICAgIGxhYmVsLCBpbmRleCA9ICcnLCAwCisgICAgICAgICMgVGhpcyB3aWxsIGRpZSBvZiBJbmRleEVycm9yIHdoZW4gY291bnRlciBpcyB0b28gYmlnCisgICAgICAgIHdoaWxlIGNvdW50ZXIgPiAwOgorICAgICAgICAgICAgY291bnRlciwgeCA9IGRpdm1vZChjb3VudGVyLCAxMCkKKyAgICAgICAgICAgIGlmIHggPT0gOToKKyAgICAgICAgICAgICAgICBsYWJlbCA9IG9uZXNbaW5kZXhdICsgb25lc1tpbmRleCsxXSArIGxhYmVsCisgICAgICAgICAgICBlbGlmIHggPT0gNDoKKyAgICAgICAgICAgICAgICBsYWJlbCA9IG9uZXNbaW5kZXhdICsgZml2ZXNbaW5kZXhdICsgbGFiZWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgeCA+PSA1OgorICAgICAgICAgICAgICAgICAgICBzID0gZml2ZXNbaW5kZXhdCisgICAgICAgICAgICAgICAgICAgIHggPSB4LTUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzID0gJycKKyAgICAgICAgICAgICAgICBzID0gcyArIG9uZXNbaW5kZXhdKngKKyAgICAgICAgICAgICAgICBsYWJlbCA9IHMgKyBsYWJlbAorICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKKyAgICAgICAgaWYgY2FzZSA9PSAnSSc6CisgICAgICAgICAgICByZXR1cm4gbGFiZWwudXBwZXIoKQorICAgICAgICByZXR1cm4gbGFiZWwKKworICAgIGRlZiBhZGRfZmxvd2luZ19kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3QgZGF0YTogcmV0dXJuCisgICAgICAgIHByZXNwYWNlID0gZGF0YVs6MV0uaXNzcGFjZSgpCisgICAgICAgIHBvc3RzcGFjZSA9IGRhdGFbLTE6XS5pc3NwYWNlKCkKKyAgICAgICAgZGF0YSA9ICIgIi5qb2luKGRhdGEuc3BsaXQoKSkKKyAgICAgICAgaWYgc2VsZi5ub3NwYWNlIGFuZCBub3QgZGF0YToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHByZXNwYWNlIG9yIHNlbGYuc29mdHNwYWNlOgorICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYubm9zcGFjZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2Z0c3BhY2UgPSAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyc2tpcCA9IDAKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLm5vc3BhY2U6CisgICAgICAgICAgICAgICAgZGF0YSA9ICcgJyArIGRhdGEKKyAgICAgICAgc2VsZi5oYXJkX2JyZWFrID0gc2VsZi5ub3NwYWNlID0gc2VsZi5wYXJhX2VuZCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJza2lwID0gc2VsZi5oYXZlX2xhYmVsID0gMAorICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IHBvc3RzcGFjZQorICAgICAgICBzZWxmLndyaXRlci5zZW5kX2Zsb3dpbmdfZGF0YShkYXRhKQorCisgICAgZGVmIGFkZF9saXRlcmFsX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIG5vdCBkYXRhOiByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5zb2Z0c3BhY2U6CisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2Zsb3dpbmdfZGF0YSgiICIpCisgICAgICAgIHNlbGYuaGFyZF9icmVhayA9IGRhdGFbLTE6XSA9PSAnXG4nCisgICAgICAgIHNlbGYubm9zcGFjZSA9IHNlbGYucGFyYV9lbmQgPSBzZWxmLnNvZnRzcGFjZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJza2lwID0gc2VsZi5oYXZlX2xhYmVsID0gMAorICAgICAgICBzZWxmLndyaXRlci5zZW5kX2xpdGVyYWxfZGF0YShkYXRhKQorCisgICAgZGVmIGZsdXNoX3NvZnRzcGFjZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zb2Z0c3BhY2U6CisgICAgICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSBzZWxmLnBhcmFfZW5kID0gc2VsZi5wYXJza2lwID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYXZlX2xhYmVsID0gc2VsZi5zb2Z0c3BhY2UgPSAwCisgICAgICAgICAgICBzZWxmLm5vc3BhY2UgPSAxCisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2Zsb3dpbmdfZGF0YSgnICcpCisKKyAgICBkZWYgcHVzaF9hbGlnbm1lbnQoc2VsZiwgYWxpZ24pOgorICAgICAgICBpZiBhbGlnbiBhbmQgYWxpZ24gIT0gc2VsZi5hbGlnbjoKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLm5ld19hbGlnbm1lbnQoYWxpZ24pCisgICAgICAgICAgICBzZWxmLmFsaWduID0gYWxpZ24KKyAgICAgICAgICAgIHNlbGYuYWxpZ25fc3RhY2suYXBwZW5kKGFsaWduKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hbGlnbl9zdGFjay5hcHBlbmQoc2VsZi5hbGlnbikKKworICAgIGRlZiBwb3BfYWxpZ25tZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmFsaWduX3N0YWNrOgorICAgICAgICAgICAgZGVsIHNlbGYuYWxpZ25fc3RhY2tbLTFdCisgICAgICAgIGlmIHNlbGYuYWxpZ25fc3RhY2s6CisgICAgICAgICAgICBzZWxmLmFsaWduID0gYWxpZ24gPSBzZWxmLmFsaWduX3N0YWNrWy0xXQorICAgICAgICAgICAgc2VsZi53cml0ZXIubmV3X2FsaWdubWVudChhbGlnbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYWxpZ24gPSBOb25lCisgICAgICAgICAgICBzZWxmLndyaXRlci5uZXdfYWxpZ25tZW50KE5vbmUpCisKKyAgICBkZWYgcHVzaF9mb250KHNlbGYsIGZvbnQpOgorICAgICAgICBzaXplLCBpLCBiLCB0dCA9IGZvbnQKKyAgICAgICAgaWYgc2VsZi5zb2Z0c3BhY2U6CisgICAgICAgICAgICBzZWxmLmhhcmRfYnJlYWsgPSBzZWxmLnBhcmFfZW5kID0gc2VsZi5zb2Z0c3BhY2UgPSAwCisgICAgICAgICAgICBzZWxmLm5vc3BhY2UgPSAxCisgICAgICAgICAgICBzZWxmLndyaXRlci5zZW5kX2Zsb3dpbmdfZGF0YSgnICcpCisgICAgICAgIGlmIHNlbGYuZm9udF9zdGFjazoKKyAgICAgICAgICAgIGNzaXplLCBjaSwgY2IsIGN0dCA9IHNlbGYuZm9udF9zdGFja1stMV0KKyAgICAgICAgICAgIGlmIHNpemUgaXMgQVNfSVM6IHNpemUgPSBjc2l6ZQorICAgICAgICAgICAgaWYgaSBpcyBBU19JUzogaSA9IGNpCisgICAgICAgICAgICBpZiBiIGlzIEFTX0lTOiBiID0gY2IKKyAgICAgICAgICAgIGlmIHR0IGlzIEFTX0lTOiB0dCA9IGN0dAorICAgICAgICBmb250ID0gKHNpemUsIGksIGIsIHR0KQorICAgICAgICBzZWxmLmZvbnRfc3RhY2suYXBwZW5kKGZvbnQpCisgICAgICAgIHNlbGYud3JpdGVyLm5ld19mb250KGZvbnQpCisKKyAgICBkZWYgcG9wX2ZvbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZm9udF9zdGFjazoKKyAgICAgICAgICAgIGRlbCBzZWxmLmZvbnRfc3RhY2tbLTFdCisgICAgICAgIGlmIHNlbGYuZm9udF9zdGFjazoKKyAgICAgICAgICAgIGZvbnQgPSBzZWxmLmZvbnRfc3RhY2tbLTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb250ID0gTm9uZQorICAgICAgICBzZWxmLndyaXRlci5uZXdfZm9udChmb250KQorCisgICAgZGVmIHB1c2hfbWFyZ2luKHNlbGYsIG1hcmdpbik6CisgICAgICAgIHNlbGYubWFyZ2luX3N0YWNrLmFwcGVuZChtYXJnaW4pCisgICAgICAgIGZzdGFjayA9IGZpbHRlcihOb25lLCBzZWxmLm1hcmdpbl9zdGFjaykKKyAgICAgICAgaWYgbm90IG1hcmdpbiBhbmQgZnN0YWNrOgorICAgICAgICAgICAgbWFyZ2luID0gZnN0YWNrWy0xXQorICAgICAgICBzZWxmLndyaXRlci5uZXdfbWFyZ2luKG1hcmdpbiwgbGVuKGZzdGFjaykpCisKKyAgICBkZWYgcG9wX21hcmdpbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5tYXJnaW5fc3RhY2s6CisgICAgICAgICAgICBkZWwgc2VsZi5tYXJnaW5fc3RhY2tbLTFdCisgICAgICAgIGZzdGFjayA9IGZpbHRlcihOb25lLCBzZWxmLm1hcmdpbl9zdGFjaykKKyAgICAgICAgaWYgZnN0YWNrOgorICAgICAgICAgICAgbWFyZ2luID0gZnN0YWNrWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWFyZ2luID0gTm9uZQorICAgICAgICBzZWxmLndyaXRlci5uZXdfbWFyZ2luKG1hcmdpbiwgbGVuKGZzdGFjaykpCisKKyAgICBkZWYgc2V0X3NwYWNpbmcoc2VsZiwgc3BhY2luZyk6CisgICAgICAgIHNlbGYuc3BhY2luZyA9IHNwYWNpbmcKKyAgICAgICAgc2VsZi53cml0ZXIubmV3X3NwYWNpbmcoc3BhY2luZykKKworICAgIGRlZiBwdXNoX3N0eWxlKHNlbGYsICpzdHlsZXMpOgorICAgICAgICBpZiBzZWxmLnNvZnRzcGFjZToKKyAgICAgICAgICAgIHNlbGYuaGFyZF9icmVhayA9IHNlbGYucGFyYV9lbmQgPSBzZWxmLnNvZnRzcGFjZSA9IDAKKyAgICAgICAgICAgIHNlbGYubm9zcGFjZSA9IDEKKyAgICAgICAgICAgIHNlbGYud3JpdGVyLnNlbmRfZmxvd2luZ19kYXRhKCcgJykKKyAgICAgICAgZm9yIHN0eWxlIGluIHN0eWxlczoKKyAgICAgICAgICAgIHNlbGYuc3R5bGVfc3RhY2suYXBwZW5kKHN0eWxlKQorICAgICAgICBzZWxmLndyaXRlci5uZXdfc3R5bGVzKHR1cGxlKHNlbGYuc3R5bGVfc3RhY2spKQorCisgICAgZGVmIHBvcF9zdHlsZShzZWxmLCBuPTEpOgorICAgICAgICBkZWwgc2VsZi5zdHlsZV9zdGFja1stbjpdCisgICAgICAgIHNlbGYud3JpdGVyLm5ld19zdHlsZXModHVwbGUoc2VsZi5zdHlsZV9zdGFjaykpCisKKyAgICBkZWYgYXNzZXJ0X2xpbmVfZGF0YShzZWxmLCBmbGFnPTEpOgorICAgICAgICBzZWxmLm5vc3BhY2UgPSBzZWxmLmhhcmRfYnJlYWsgPSBub3QgZmxhZworICAgICAgICBzZWxmLnBhcmFfZW5kID0gc2VsZi5wYXJza2lwID0gc2VsZi5oYXZlX2xhYmVsID0gMAorCisKK2NsYXNzIE51bGxXcml0ZXI6CisgICAgIiIiTWluaW1hbCB3cml0ZXIgaW50ZXJmYWNlIHRvIHVzZSBpbiB0ZXN0aW5nICYgaW5oZXJpdGFuY2UuCisKKyAgICBBIHdyaXRlciB3aGljaCBvbmx5IHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbjsgbm8gYWN0aW9ucyBhcmUKKyAgICB0YWtlbiBvbiBhbnkgbWV0aG9kcy4gIFRoaXMgc2hvdWxkIGJlIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgd3JpdGVycworICAgIHdoaWNoIGRvIG5vdCBuZWVkIHRvIGluaGVyaXQgYW55IGltcGxlbWVudGF0aW9uIG1ldGhvZHMuCisKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6IHBhc3MKKyAgICBkZWYgZmx1c2goc2VsZik6IHBhc3MKKyAgICBkZWYgbmV3X2FsaWdubWVudChzZWxmLCBhbGlnbik6IHBhc3MKKyAgICBkZWYgbmV3X2ZvbnQoc2VsZiwgZm9udCk6IHBhc3MKKyAgICBkZWYgbmV3X21hcmdpbihzZWxmLCBtYXJnaW4sIGxldmVsKTogcGFzcworICAgIGRlZiBuZXdfc3BhY2luZyhzZWxmLCBzcGFjaW5nKTogcGFzcworICAgIGRlZiBuZXdfc3R5bGVzKHNlbGYsIHN0eWxlcyk6IHBhc3MKKyAgICBkZWYgc2VuZF9wYXJhZ3JhcGgoc2VsZiwgYmxhbmtsaW5lKTogcGFzcworICAgIGRlZiBzZW5kX2xpbmVfYnJlYWsoc2VsZik6IHBhc3MKKyAgICBkZWYgc2VuZF9ob3JfcnVsZShzZWxmLCAqYXJncywgKiprdyk6IHBhc3MKKyAgICBkZWYgc2VuZF9sYWJlbF9kYXRhKHNlbGYsIGRhdGEpOiBwYXNzCisgICAgZGVmIHNlbmRfZmxvd2luZ19kYXRhKHNlbGYsIGRhdGEpOiBwYXNzCisgICAgZGVmIHNlbmRfbGl0ZXJhbF9kYXRhKHNlbGYsIGRhdGEpOiBwYXNzCisKKworY2xhc3MgQWJzdHJhY3RXcml0ZXIoTnVsbFdyaXRlcik6CisgICAgIiIiQSB3cml0ZXIgd2hpY2ggY2FuIGJlIHVzZWQgaW4gZGVidWdnaW5nIGZvcm1hdHRlcnMsIGJ1dCBub3QgbXVjaCBlbHNlLgorCisgICAgRWFjaCBtZXRob2Qgc2ltcGx5IGFubm91bmNlcyBpdHNlbGYgYnkgcHJpbnRpbmcgaXRzIG5hbWUgYW5kCisgICAgYXJndW1lbnRzIG9uIHN0YW5kYXJkIG91dHB1dC4KKworICAgICIiIgorCisgICAgZGVmIG5ld19hbGlnbm1lbnQoc2VsZiwgYWxpZ24pOgorICAgICAgICBwcmludCAibmV3X2FsaWdubWVudCglcikiICUgKGFsaWduLCkKKworICAgIGRlZiBuZXdfZm9udChzZWxmLCBmb250KToKKyAgICAgICAgcHJpbnQgIm5ld19mb250KCVyKSIgJSAoZm9udCwpCisKKyAgICBkZWYgbmV3X21hcmdpbihzZWxmLCBtYXJnaW4sIGxldmVsKToKKyAgICAgICAgcHJpbnQgIm5ld19tYXJnaW4oJXIsICVkKSIgJSAobWFyZ2luLCBsZXZlbCkKKworICAgIGRlZiBuZXdfc3BhY2luZyhzZWxmLCBzcGFjaW5nKToKKyAgICAgICAgcHJpbnQgIm5ld19zcGFjaW5nKCVyKSIgJSAoc3BhY2luZywpCisKKyAgICBkZWYgbmV3X3N0eWxlcyhzZWxmLCBzdHlsZXMpOgorICAgICAgICBwcmludCAibmV3X3N0eWxlcyglcikiICUgKHN0eWxlcywpCisKKyAgICBkZWYgc2VuZF9wYXJhZ3JhcGgoc2VsZiwgYmxhbmtsaW5lKToKKyAgICAgICAgcHJpbnQgInNlbmRfcGFyYWdyYXBoKCVyKSIgJSAoYmxhbmtsaW5lLCkKKworICAgIGRlZiBzZW5kX2xpbmVfYnJlYWsoc2VsZik6CisgICAgICAgIHByaW50ICJzZW5kX2xpbmVfYnJlYWsoKSIKKworICAgIGRlZiBzZW5kX2hvcl9ydWxlKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgcHJpbnQgInNlbmRfaG9yX3J1bGUoKSIKKworICAgIGRlZiBzZW5kX2xhYmVsX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHByaW50ICJzZW5kX2xhYmVsX2RhdGEoJXIpIiAlIChkYXRhLCkKKworICAgIGRlZiBzZW5kX2Zsb3dpbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgcHJpbnQgInNlbmRfZmxvd2luZ19kYXRhKCVyKSIgJSAoZGF0YSwpCisKKyAgICBkZWYgc2VuZF9saXRlcmFsX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHByaW50ICJzZW5kX2xpdGVyYWxfZGF0YSglcikiICUgKGRhdGEsKQorCisKK2NsYXNzIER1bWJXcml0ZXIoTnVsbFdyaXRlcik6CisgICAgIiIiU2ltcGxlIHdyaXRlciBjbGFzcyB3aGljaCB3cml0ZXMgb3V0cHV0IG9uIHRoZSBmaWxlIG9iamVjdCBwYXNzZWQgaW4KKyAgICBhcyB0aGUgZmlsZSBwYXJhbWV0ZXIgb3IsIGlmIGZpbGUgaXMgb21pdHRlZCwgb24gc3RhbmRhcmQgb3V0cHV0LiAgVGhlCisgICAgb3V0cHV0IGlzIHNpbXBseSB3b3JkLXdyYXBwZWQgdG8gdGhlIG51bWJlciBvZiBjb2x1bW5zIHNwZWNpZmllZCBieQorICAgIHRoZSBtYXhjb2wgcGFyYW1ldGVyLiAgVGhpcyBjbGFzcyBpcyBzdWl0YWJsZSBmb3IgcmVmbG93aW5nIGEgc2VxdWVuY2UKKyAgICBvZiBwYXJhZ3JhcGhzLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZT1Ob25lLCBtYXhjb2w9NzIpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlIG9yIHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5tYXhjb2wgPSBtYXhjb2wKKyAgICAgICAgTnVsbFdyaXRlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLnJlc2V0KCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5jb2wgPSAwCisgICAgICAgIHNlbGYuYXRicmVhayA9IDAKKworICAgIGRlZiBzZW5kX3BhcmFncmFwaChzZWxmLCBibGFua2xpbmUpOgorICAgICAgICBzZWxmLmZpbGUud3JpdGUoJ1xuJypibGFua2xpbmUpCisgICAgICAgIHNlbGYuY29sID0gMAorICAgICAgICBzZWxmLmF0YnJlYWsgPSAwCisKKyAgICBkZWYgc2VuZF9saW5lX2JyZWFrKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGUud3JpdGUoJ1xuJykKKyAgICAgICAgc2VsZi5jb2wgPSAwCisgICAgICAgIHNlbGYuYXRicmVhayA9IDAKKworICAgIGRlZiBzZW5kX2hvcl9ydWxlKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5maWxlLndyaXRlKCdcbicpCisgICAgICAgIHNlbGYuZmlsZS53cml0ZSgnLScqc2VsZi5tYXhjb2wpCisgICAgICAgIHNlbGYuZmlsZS53cml0ZSgnXG4nKQorICAgICAgICBzZWxmLmNvbCA9IDAKKyAgICAgICAgc2VsZi5hdGJyZWFrID0gMAorCisgICAgZGVmIHNlbmRfbGl0ZXJhbF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmZpbGUud3JpdGUoZGF0YSkKKyAgICAgICAgaSA9IGRhdGEucmZpbmQoJ1xuJykKKyAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgc2VsZi5jb2wgPSAwCisgICAgICAgICAgICBkYXRhID0gZGF0YVtpKzE6XQorICAgICAgICBkYXRhID0gZGF0YS5leHBhbmR0YWJzKCkKKyAgICAgICAgc2VsZi5jb2wgPSBzZWxmLmNvbCArIGxlbihkYXRhKQorICAgICAgICBzZWxmLmF0YnJlYWsgPSAwCisKKyAgICBkZWYgc2VuZF9mbG93aW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIG5vdCBkYXRhOiByZXR1cm4KKyAgICAgICAgYXRicmVhayA9IHNlbGYuYXRicmVhayBvciBkYXRhWzBdLmlzc3BhY2UoKQorICAgICAgICBjb2wgPSBzZWxmLmNvbAorICAgICAgICBtYXhjb2wgPSBzZWxmLm1heGNvbAorICAgICAgICB3cml0ZSA9IHNlbGYuZmlsZS53cml0ZQorICAgICAgICBmb3Igd29yZCBpbiBkYXRhLnNwbGl0KCk6CisgICAgICAgICAgICBpZiBhdGJyZWFrOgorICAgICAgICAgICAgICAgIGlmIGNvbCArIGxlbih3b3JkKSA+PSBtYXhjb2w6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKCdcbicpCisgICAgICAgICAgICAgICAgICAgIGNvbCA9IDAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB3cml0ZSgnICcpCisgICAgICAgICAgICAgICAgICAgIGNvbCA9IGNvbCArIDEKKyAgICAgICAgICAgIHdyaXRlKHdvcmQpCisgICAgICAgICAgICBjb2wgPSBjb2wgKyBsZW4od29yZCkKKyAgICAgICAgICAgIGF0YnJlYWsgPSAxCisgICAgICAgIHNlbGYuY29sID0gY29sCisgICAgICAgIHNlbGYuYXRicmVhayA9IGRhdGFbLTFdLmlzc3BhY2UoKQorCisKK2RlZiB0ZXN0KGZpbGUgPSBOb25lKToKKyAgICB3ID0gRHVtYldyaXRlcigpCisgICAgZiA9IEFic3RyYWN0Rm9ybWF0dGVyKHcpCisgICAgaWYgZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgZnAgPSBvcGVuKGZpbGUpCisgICAgZWxpZiBzeXMuYXJndlsxOl06CisgICAgICAgIGZwID0gb3BlbihzeXMuYXJndlsxXSkKKyAgICBlbHNlOgorICAgICAgICBmcCA9IHN5cy5zdGRpbgorICAgIGZvciBsaW5lIGluIGZwOgorICAgICAgICBpZiBsaW5lID09ICdcbic6CisgICAgICAgICAgICBmLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGYuYWRkX2Zsb3dpbmdfZGF0YShsaW5lKQorICAgIGYuZW5kX3BhcmFncmFwaCgwKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weWMgYi9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmMDY1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZm9ybWF0dGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weW8gYi9saWIvcHl0aG9uMi43L2Zvcm1hdHRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZmMDY1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZm9ybWF0dGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZwZm9ybWF0LnB5IGIvbGliL3B5dGhvbjIuNy9mcGZvcm1hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNiYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mcGZvcm1hdC5weQpAQCAtMCwwICsxLDE0NSBAQAorIiIiR2VuZXJhbCBmbG9hdGluZyBwb2ludCBmb3JtYXR0aW5nIGZ1bmN0aW9ucy4KKworRnVuY3Rpb25zOgorZml4KHgsIGRpZ2l0c19iZWhpbmQpCitzY2koeCwgZGlnaXRzX2JlaGluZCkKKworRWFjaCB0YWtlcyBhIG51bWJlciBvciBhIHN0cmluZyBhbmQgYSBudW1iZXIgb2YgZGlnaXRzIGFzIGFyZ3VtZW50cy4KKworUGFyYW1ldGVyczoKK3g6ICAgICAgICAgICAgIG51bWJlciB0byBiZSBmb3JtYXR0ZWQ7IG9yIGEgc3RyaW5nIHJlc2VtYmxpbmcgYSBudW1iZXIKK2RpZ2l0c19iZWhpbmQ6IG51bWJlciBvZiBkaWdpdHMgYmVoaW5kIHRoZSBkZWNpbWFsIHBvaW50CisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIGZwZm9ybWF0IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworaW1wb3J0IHJlCisKK19fYWxsX18gPSBbImZpeCIsInNjaSIsIk5vdEFOdW1iZXIiXQorCisjIENvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byAiZGVjb2RlIiBhIG51bWJlcgorZGVjb2RlciA9IHJlLmNvbXBpbGUocideKFstK10/KTAqKFxkKikoKD86XC5cZCopPykoKFtlRV1bLStdP1xkKyk/KSQnKQorIyBcMCB0aGUgd2hvbGUgdGhpbmcKKyMgXDEgbGVhZGluZyBzaWduIG9yIGVtcHR5CisjIFwyIGRpZ2l0cyBsZWZ0IG9mIGRlY2ltYWwgcG9pbnQKKyMgXDMgZnJhY3Rpb24gKGVtcHR5IG9yIGJlZ2lucyB3aXRoIHBvaW50KQorIyBcNCBleHBvbmVudCBwYXJ0IChlbXB0eSBvciBiZWdpbnMgd2l0aCAnZScgb3IgJ0UnKQorCit0cnk6CisgICAgY2xhc3MgTm90QU51bWJlcihWYWx1ZUVycm9yKToKKyAgICAgICAgcGFzcworZXhjZXB0IFR5cGVFcnJvcjoKKyAgICBOb3RBTnVtYmVyID0gJ2ZwZm9ybWF0Lk5vdEFOdW1iZXInCisKK2RlZiBleHRyYWN0KHMpOgorICAgICIiIlJldHVybiAoc2lnbiwgaW50cGFydCwgZnJhY3Rpb24sIGV4cG8pIG9yIHJhaXNlIGFuIGV4Y2VwdGlvbjoKKyAgICBzaWduIGlzICcrJyBvciAnLScKKyAgICBpbnRwYXJ0IGlzIDAgb3IgbW9yZSBkaWdpdHMgYmVnaW5uaW5nIHdpdGggYSBub256ZXJvCisgICAgZnJhY3Rpb24gaXMgMCBvciBtb3JlIGRpZ2l0cworICAgIGV4cG8gaXMgYW4gaW50ZWdlciIiIgorICAgIHJlcyA9IGRlY29kZXIubWF0Y2gocykKKyAgICBpZiByZXMgaXMgTm9uZTogcmFpc2UgTm90QU51bWJlciwgcworICAgIHNpZ24sIGludHBhcnQsIGZyYWN0aW9uLCBleHBwYXJ0ID0gcmVzLmdyb3VwKDEsMiwzLDQpCisgICAgaWYgc2lnbiA9PSAnKyc6IHNpZ24gPSAnJworICAgIGlmIGZyYWN0aW9uOiBmcmFjdGlvbiA9IGZyYWN0aW9uWzE6XQorICAgIGlmIGV4cHBhcnQ6IGV4cG8gPSBpbnQoZXhwcGFydFsxOl0pCisgICAgZWxzZTogZXhwbyA9IDAKKyAgICByZXR1cm4gc2lnbiwgaW50cGFydCwgZnJhY3Rpb24sIGV4cG8KKworZGVmIHVuZXhwbyhpbnRwYXJ0LCBmcmFjdGlvbiwgZXhwbyk6CisgICAgIiIiUmVtb3ZlIHRoZSBleHBvbmVudCBieSBjaGFuZ2luZyBpbnRwYXJ0IGFuZCBmcmFjdGlvbi4iIiIKKyAgICBpZiBleHBvID4gMDogIyBNb3ZlIHRoZSBwb2ludCBsZWZ0CisgICAgICAgIGYgPSBsZW4oZnJhY3Rpb24pCisgICAgICAgIGludHBhcnQsIGZyYWN0aW9uID0gaW50cGFydCArIGZyYWN0aW9uWzpleHBvXSwgZnJhY3Rpb25bZXhwbzpdCisgICAgICAgIGlmIGV4cG8gPiBmOgorICAgICAgICAgICAgaW50cGFydCA9IGludHBhcnQgKyAnMCcqKGV4cG8tZikKKyAgICBlbGlmIGV4cG8gPCAwOiAjIE1vdmUgdGhlIHBvaW50IHJpZ2h0CisgICAgICAgIGkgPSBsZW4oaW50cGFydCkKKyAgICAgICAgaW50cGFydCwgZnJhY3Rpb24gPSBpbnRwYXJ0WzpleHBvXSwgaW50cGFydFtleHBvOl0gKyBmcmFjdGlvbgorICAgICAgICBpZiBleHBvIDwgLWk6CisgICAgICAgICAgICBmcmFjdGlvbiA9ICcwJyooLWV4cG8taSkgKyBmcmFjdGlvbgorICAgIHJldHVybiBpbnRwYXJ0LCBmcmFjdGlvbgorCitkZWYgcm91bmRmcmFjKGludHBhcnQsIGZyYWN0aW9uLCBkaWdzKToKKyAgICAiIiJSb3VuZCBvciBleHRlbmQgdGhlIGZyYWN0aW9uIHRvIHNpemUgZGlncy4iIiIKKyAgICBmID0gbGVuKGZyYWN0aW9uKQorICAgIGlmIGYgPD0gZGlnczoKKyAgICAgICAgcmV0dXJuIGludHBhcnQsIGZyYWN0aW9uICsgJzAnKihkaWdzLWYpCisgICAgaSA9IGxlbihpbnRwYXJ0KQorICAgIGlmIGkrZGlncyA8IDA6CisgICAgICAgIHJldHVybiAnMCcqLWRpZ3MsICcnCisgICAgdG90YWwgPSBpbnRwYXJ0ICsgZnJhY3Rpb24KKyAgICBuZXh0ZGlnaXQgPSB0b3RhbFtpK2RpZ3NdCisgICAgaWYgbmV4dGRpZ2l0ID49ICc1JzogIyBIYXJkIGNhc2U6IGluY3JlbWVudCBsYXN0IGRpZ2l0LCBtYXkgaGF2ZSBjYXJyeSEKKyAgICAgICAgbiA9IGkgKyBkaWdzIC0gMQorICAgICAgICB3aGlsZSBuID49IDA6CisgICAgICAgICAgICBpZiB0b3RhbFtuXSAhPSAnOSc6IGJyZWFrCisgICAgICAgICAgICBuID0gbi0xCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0b3RhbCA9ICcwJyArIHRvdGFsCisgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICBuID0gMAorICAgICAgICB0b3RhbCA9IHRvdGFsWzpuXSArIGNocihvcmQodG90YWxbbl0pICsgMSkgKyAnMCcqKGxlbih0b3RhbCktbi0xKQorICAgICAgICBpbnRwYXJ0LCBmcmFjdGlvbiA9IHRvdGFsWzppXSwgdG90YWxbaTpdCisgICAgaWYgZGlncyA+PSAwOgorICAgICAgICByZXR1cm4gaW50cGFydCwgZnJhY3Rpb25bOmRpZ3NdCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGludHBhcnRbOmRpZ3NdICsgJzAnKi1kaWdzLCAnJworCitkZWYgZml4KHgsIGRpZ3MpOgorICAgICIiIkZvcm1hdCB4IGFzIFstXWRkZC5kZGQgd2l0aCAnZGlncycgZGlnaXRzIGFmdGVyIHRoZSBwb2ludAorICAgIGFuZCBhdCBsZWFzdCBvbmUgZGlnaXQgYmVmb3JlLgorICAgIElmIGRpZ3MgPD0gMCwgdGhlIHBvaW50IGlzIHN1cHByZXNzZWQuIiIiCisgICAgaWYgdHlwZSh4KSAhPSB0eXBlKCcnKTogeCA9IHJlcHIoeCkKKyAgICB0cnk6CisgICAgICAgIHNpZ24sIGludHBhcnQsIGZyYWN0aW9uLCBleHBvID0gZXh0cmFjdCh4KQorICAgIGV4Y2VwdCBOb3RBTnVtYmVyOgorICAgICAgICByZXR1cm4geAorICAgIGludHBhcnQsIGZyYWN0aW9uID0gdW5leHBvKGludHBhcnQsIGZyYWN0aW9uLCBleHBvKQorICAgIGludHBhcnQsIGZyYWN0aW9uID0gcm91bmRmcmFjKGludHBhcnQsIGZyYWN0aW9uLCBkaWdzKQorICAgIHdoaWxlIGludHBhcnQgYW5kIGludHBhcnRbMF0gPT0gJzAnOiBpbnRwYXJ0ID0gaW50cGFydFsxOl0KKyAgICBpZiBpbnRwYXJ0ID09ICcnOiBpbnRwYXJ0ID0gJzAnCisgICAgaWYgZGlncyA+IDA6IHJldHVybiBzaWduICsgaW50cGFydCArICcuJyArIGZyYWN0aW9uCisgICAgZWxzZTogcmV0dXJuIHNpZ24gKyBpbnRwYXJ0CisKK2RlZiBzY2koeCwgZGlncyk6CisgICAgIiIiRm9ybWF0IHggYXMgWy1dZC5kZGRFWystXWRkZCB3aXRoICdkaWdzJyBkaWdpdHMgYWZ0ZXIgdGhlIHBvaW50CisgICAgYW5kIGV4YWN0bHkgb25lIGRpZ2l0IGJlZm9yZS4KKyAgICBJZiBkaWdzIGlzIDw9IDAsIG9uZSBkaWdpdCBpcyBrZXB0IGFuZCB0aGUgcG9pbnQgaXMgc3VwcHJlc3NlZC4iIiIKKyAgICBpZiB0eXBlKHgpICE9IHR5cGUoJycpOiB4ID0gcmVwcih4KQorICAgIHNpZ24sIGludHBhcnQsIGZyYWN0aW9uLCBleHBvID0gZXh0cmFjdCh4KQorICAgIGlmIG5vdCBpbnRwYXJ0OgorICAgICAgICB3aGlsZSBmcmFjdGlvbiBhbmQgZnJhY3Rpb25bMF0gPT0gJzAnOgorICAgICAgICAgICAgZnJhY3Rpb24gPSBmcmFjdGlvblsxOl0KKyAgICAgICAgICAgIGV4cG8gPSBleHBvIC0gMQorICAgICAgICBpZiBmcmFjdGlvbjoKKyAgICAgICAgICAgIGludHBhcnQsIGZyYWN0aW9uID0gZnJhY3Rpb25bMF0sIGZyYWN0aW9uWzE6XQorICAgICAgICAgICAgZXhwbyA9IGV4cG8gLSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbnRwYXJ0ID0gJzAnCisgICAgZWxzZToKKyAgICAgICAgZXhwbyA9IGV4cG8gKyBsZW4oaW50cGFydCkgLSAxCisgICAgICAgIGludHBhcnQsIGZyYWN0aW9uID0gaW50cGFydFswXSwgaW50cGFydFsxOl0gKyBmcmFjdGlvbgorICAgIGRpZ3MgPSBtYXgoMCwgZGlncykKKyAgICBpbnRwYXJ0LCBmcmFjdGlvbiA9IHJvdW5kZnJhYyhpbnRwYXJ0LCBmcmFjdGlvbiwgZGlncykKKyAgICBpZiBsZW4oaW50cGFydCkgPiAxOgorICAgICAgICBpbnRwYXJ0LCBmcmFjdGlvbiwgZXhwbyA9IFwKKyAgICAgICAgICAgIGludHBhcnRbMF0sIGludHBhcnRbMTpdICsgZnJhY3Rpb25bOi0xXSwgXAorICAgICAgICAgICAgZXhwbyArIGxlbihpbnRwYXJ0KSAtIDEKKyAgICBzID0gc2lnbiArIGludHBhcnQKKyAgICBpZiBkaWdzID4gMDogcyA9IHMgKyAnLicgKyBmcmFjdGlvbgorICAgIGUgPSByZXByKGFicyhleHBvKSkKKyAgICBlID0gJzAnKigzLWxlbihlKSkgKyBlCisgICAgaWYgZXhwbyA8IDA6IGUgPSAnLScgKyBlCisgICAgZWxzZTogZSA9ICcrJyArIGUKKyAgICByZXR1cm4gcyArICdlJyArIGUKKworZGVmIHRlc3QoKToKKyAgICAiIiJJbnRlcmFjdGl2ZSB0ZXN0IHJ1bi4iIiIKKyAgICB0cnk6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB4LCBkaWdzID0gaW5wdXQoJ0VudGVyICh4LCBkaWdzKTogJykKKyAgICAgICAgICAgIHByaW50IHgsIGZpeCh4LCBkaWdzKSwgc2NpKHgsIGRpZ3MpCisgICAgZXhjZXB0IChFT0ZFcnJvciwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZwZm9ybWF0LnB5YyBiL2xpYi9weXRob24yLjcvZnBmb3JtYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDliNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZwZm9ybWF0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZwZm9ybWF0LnB5byBiL2xpYi9weXRob24yLjcvZnBmb3JtYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNDliNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZwZm9ybWF0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ZyYWN0aW9ucy5weSBiL2xpYi9weXRob24yLjcvZnJhY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDg2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZyYWN0aW9ucy5weQpAQCAtMCwwICsxLDYwNSBAQAorIyBPcmlnaW5hbGx5IGNvbnRyaWJ1dGVkIGJ5IFNqb2VyZCBNdWxsZW5kZXIuCisjIFNpZ25pZmljYW50bHkgbW9kaWZpZWQgYnkgSmVmZnJleSBZYXNza2luIDxqeWFzc2tpbiBhdCBnbWFpbC5jb20+LgorCisiIiJSYXRpb25hbCwgaW5maW5pdGUtcHJlY2lzaW9uLCByZWFsIG51bWJlcnMuIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KK2Zyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAoraW1wb3J0IG1hdGgKK2ltcG9ydCBudW1iZXJzCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCByZQorCitfX2FsbF9fID0gWydGcmFjdGlvbicsICdnY2QnXQorCitSYXRpb25hbCA9IG51bWJlcnMuUmF0aW9uYWwKKworCitkZWYgZ2NkKGEsIGIpOgorICAgICIiIkNhbGN1bGF0ZSB0aGUgR3JlYXRlc3QgQ29tbW9uIERpdmlzb3Igb2YgYSBhbmQgYi4KKworICAgIFVubGVzcyBiPT0wLCB0aGUgcmVzdWx0IHdpbGwgaGF2ZSB0aGUgc2FtZSBzaWduIGFzIGIgKHNvIHRoYXQgd2hlbgorICAgIGIgaXMgZGl2aWRlZCBieSBpdCwgdGhlIHJlc3VsdCBjb21lcyBvdXQgcG9zaXRpdmUpLgorICAgICIiIgorICAgIHdoaWxlIGI6CisgICAgICAgIGEsIGIgPSBiLCBhJWIKKyAgICByZXR1cm4gYQorCisKK19SQVRJT05BTF9GT1JNQVQgPSByZS5jb21waWxlKHIiIiIKKyAgICBcQVxzKiAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0LCB0aGVuCisgICAgKD9QPHNpZ24+Wy0rXT8pICAgICAgICAgICAgIyBhbiBvcHRpb25hbCBzaWduLCB0aGVuCisgICAgKD89XGR8XC5cZCkgICAgICAgICAgICAgICAgIyBsb29rYWhlYWQgZm9yIGRpZ2l0IG9yIC5kaWdpdAorICAgICg/UDxudW0+XGQqKSAgICAgICAgICAgICAgICMgbnVtZXJhdG9yIChwb3NzaWJseSBlbXB0eSkKKyAgICAoPzogICAgICAgICAgICAgICAgICAgICAgICAjIGZvbGxvd2VkIGJ5CisgICAgICAgKD86Lyg/UDxkZW5vbT5cZCspKT8gICAgIyBhbiBvcHRpb25hbCBkZW5vbWluYXRvcgorICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKKyAgICAgICAoPzpcLig/UDxkZWNpbWFsPlxkKikpPyAjIGFuIG9wdGlvbmFsIGZyYWN0aW9uYWwgcGFydAorICAgICAgICg/OkUoP1A8ZXhwPlstK10/XGQrKSk/ICMgYW5kIG9wdGlvbmFsIGV4cG9uZW50CisgICAgKQorICAgIFxzKlxaICAgICAgICAgICAgICAgICAgICAgICMgYW5kIG9wdGlvbmFsIHdoaXRlc3BhY2UgdG8gZmluaXNoCisiIiIsIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFKQorCisKK2NsYXNzIEZyYWN0aW9uKFJhdGlvbmFsKToKKyAgICAiIiJUaGlzIGNsYXNzIGltcGxlbWVudHMgcmF0aW9uYWwgbnVtYmVycy4KKworICAgIEluIHRoZSB0d28tYXJndW1lbnQgZm9ybSBvZiB0aGUgY29uc3RydWN0b3IsIEZyYWN0aW9uKDgsIDYpIHdpbGwKKyAgICBwcm9kdWNlIGEgcmF0aW9uYWwgbnVtYmVyIGVxdWl2YWxlbnQgdG8gNC8zLiBCb3RoIGFyZ3VtZW50cyBtdXN0CisgICAgYmUgUmF0aW9uYWwuIFRoZSBudW1lcmF0b3IgZGVmYXVsdHMgdG8gMCBhbmQgdGhlIGRlbm9taW5hdG9yCisgICAgZGVmYXVsdHMgdG8gMSBzbyB0aGF0IEZyYWN0aW9uKDMpID09IDMgYW5kIEZyYWN0aW9uKCkgPT0gMC4KKworICAgIEZyYWN0aW9ucyBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCBmcm9tOgorCisgICAgICAtIG51bWVyaWMgc3RyaW5ncyBzaW1pbGFyIHRvIHRob3NlIGFjY2VwdGVkIGJ5IHRoZQorICAgICAgICBmbG9hdCBjb25zdHJ1Y3RvciAoZm9yIGV4YW1wbGUsICctMi4zJyBvciAnMWUxMCcpCisKKyAgICAgIC0gc3RyaW5ncyBvZiB0aGUgZm9ybSAnMTIzLzQ1NicKKworICAgICAgLSBmbG9hdCBhbmQgRGVjaW1hbCBpbnN0YW5jZXMKKworICAgICAgLSBvdGhlciBSYXRpb25hbCBpbnN0YW5jZXMgKGluY2x1ZGluZyBpbnRlZ2VycykKKworICAgICIiIgorCisgICAgX19zbG90c19fID0gKCdfbnVtZXJhdG9yJywgJ19kZW5vbWluYXRvcicpCisKKyAgICAjIFdlJ3JlIGltbXV0YWJsZSwgc28gdXNlIF9fbmV3X18gbm90IF9faW5pdF9fCisgICAgZGVmIF9fbmV3X18oY2xzLCBudW1lcmF0b3I9MCwgZGVub21pbmF0b3I9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdHMgYSBGcmFjdGlvbi4KKworICAgICAgICBUYWtlcyBhIHN0cmluZyBsaWtlICczLzInIG9yICcxLjUnLCBhbm90aGVyIFJhdGlvbmFsIGluc3RhbmNlLCBhCisgICAgICAgIG51bWVyYXRvci9kZW5vbWluYXRvciBwYWlyLCBvciBhIGZsb2F0LgorCisgICAgICAgIEV4YW1wbGVzCisgICAgICAgIC0tLS0tLS0tCisKKyAgICAgICAgPj4+IEZyYWN0aW9uKDEwLCAtOCkKKyAgICAgICAgRnJhY3Rpb24oLTUsIDQpCisgICAgICAgID4+PiBGcmFjdGlvbihGcmFjdGlvbigxLCA3KSwgNSkKKyAgICAgICAgRnJhY3Rpb24oMSwgMzUpCisgICAgICAgID4+PiBGcmFjdGlvbihGcmFjdGlvbigxLCA3KSwgRnJhY3Rpb24oMiwgMykpCisgICAgICAgIEZyYWN0aW9uKDMsIDE0KQorICAgICAgICA+Pj4gRnJhY3Rpb24oJzMxNCcpCisgICAgICAgIEZyYWN0aW9uKDMxNCwgMSkKKyAgICAgICAgPj4+IEZyYWN0aW9uKCctMzUvNCcpCisgICAgICAgIEZyYWN0aW9uKC0zNSwgNCkKKyAgICAgICAgPj4+IEZyYWN0aW9uKCczLjE0MTUnKSAjIGNvbnZlcnNpb24gZnJvbSBudW1lcmljIHN0cmluZworICAgICAgICBGcmFjdGlvbig2MjgzLCAyMDAwKQorICAgICAgICA+Pj4gRnJhY3Rpb24oJy00N2UtMicpICMgc3RyaW5nIG1heSBpbmNsdWRlIGEgZGVjaW1hbCBleHBvbmVudAorICAgICAgICBGcmFjdGlvbigtNDcsIDEwMCkKKyAgICAgICAgPj4+IEZyYWN0aW9uKDEuNDcpICAjIGRpcmVjdCBjb25zdHJ1Y3Rpb24gZnJvbSBmbG9hdCAoZXhhY3QgY29udmVyc2lvbikKKyAgICAgICAgRnJhY3Rpb24oNjYyMDI5MTQ1MjIzNDYyOSwgNDUwMzU5OTYyNzM3MDQ5NikKKyAgICAgICAgPj4+IEZyYWN0aW9uKDIuMjUpCisgICAgICAgIEZyYWN0aW9uKDksIDQpCisgICAgICAgID4+PiBGcmFjdGlvbihEZWNpbWFsKCcxLjQ3JykpCisgICAgICAgIEZyYWN0aW9uKDE0NywgMTAwKQorCisgICAgICAgICIiIgorICAgICAgICBzZWxmID0gc3VwZXIoRnJhY3Rpb24sIGNscykuX19uZXdfXyhjbHMpCisKKyAgICAgICAgaWYgZGVub21pbmF0b3IgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBSYXRpb25hbCk6CisgICAgICAgICAgICAgICAgc2VsZi5fbnVtZXJhdG9yID0gbnVtZXJhdG9yLm51bWVyYXRvcgorICAgICAgICAgICAgICAgIHNlbGYuX2Rlbm9taW5hdG9yID0gbnVtZXJhdG9yLmRlbm9taW5hdG9yCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgZmxvYXQpOgorICAgICAgICAgICAgICAgICMgRXhhY3QgY29udmVyc2lvbiBmcm9tIGZsb2F0CisgICAgICAgICAgICAgICAgdmFsdWUgPSBGcmFjdGlvbi5mcm9tX2Zsb2F0KG51bWVyYXRvcikKKyAgICAgICAgICAgICAgICBzZWxmLl9udW1lcmF0b3IgPSB2YWx1ZS5fbnVtZXJhdG9yCisgICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgPSB2YWx1ZS5fZGVub21pbmF0b3IKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UobnVtZXJhdG9yLCBEZWNpbWFsKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IEZyYWN0aW9uLmZyb21fZGVjaW1hbChudW1lcmF0b3IpCisgICAgICAgICAgICAgICAgc2VsZi5fbnVtZXJhdG9yID0gdmFsdWUuX251bWVyYXRvcgorICAgICAgICAgICAgICAgIHNlbGYuX2Rlbm9taW5hdG9yID0gdmFsdWUuX2Rlbm9taW5hdG9yCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKG51bWVyYXRvciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgIyBIYW5kbGUgY29uc3RydWN0aW9uIGZyb20gc3RyaW5ncy4KKyAgICAgICAgICAgICAgICBtID0gX1JBVElPTkFMX0ZPUk1BVC5tYXRjaChudW1lcmF0b3IpCisgICAgICAgICAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAlcicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyYXRvcikKKyAgICAgICAgICAgICAgICBudW1lcmF0b3IgPSBpbnQobS5ncm91cCgnbnVtJykgb3IgJzAnKQorICAgICAgICAgICAgICAgIGRlbm9tID0gbS5ncm91cCgnZGVub20nKQorICAgICAgICAgICAgICAgIGlmIGRlbm9tOgorICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IGludChkZW5vbSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZW5vbWluYXRvciA9IDEKKyAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCA9IG0uZ3JvdXAoJ2RlY2ltYWwnKQorICAgICAgICAgICAgICAgICAgICBpZiBkZWNpbWFsOgorICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSAxMCoqbGVuKGRlY2ltYWwpCisgICAgICAgICAgICAgICAgICAgICAgICBudW1lcmF0b3IgPSBudW1lcmF0b3IgKiBzY2FsZSArIGludChkZWNpbWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVub21pbmF0b3IgKj0gc2NhbGUKKyAgICAgICAgICAgICAgICAgICAgZXhwID0gbS5ncm91cCgnZXhwJykKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhwOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwID0gaW50KGV4cCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4cCA+PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWVyYXRvciAqPSAxMCoqZXhwCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yICo9IDEwKiotZXhwCisgICAgICAgICAgICAgICAgaWYgbS5ncm91cCgnc2lnbicpID09ICctJzoKKyAgICAgICAgICAgICAgICAgICAgbnVtZXJhdG9yID0gLW51bWVyYXRvcgorCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiYXJndW1lbnQgc2hvdWxkIGJlIGEgc3RyaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yIGEgUmF0aW9uYWwgaW5zdGFuY2UiKQorCisgICAgICAgIGVsaWYgKGlzaW5zdGFuY2UobnVtZXJhdG9yLCBSYXRpb25hbCkgYW5kCisgICAgICAgICAgICBpc2luc3RhbmNlKGRlbm9taW5hdG9yLCBSYXRpb25hbCkpOgorICAgICAgICAgICAgbnVtZXJhdG9yLCBkZW5vbWluYXRvciA9ICgKKyAgICAgICAgICAgICAgICBudW1lcmF0b3IubnVtZXJhdG9yICogZGVub21pbmF0b3IuZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgZGVub21pbmF0b3IubnVtZXJhdG9yICogbnVtZXJhdG9yLmRlbm9taW5hdG9yCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJib3RoIGFyZ3VtZW50cyBzaG91bGQgYmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYXRpb25hbCBpbnN0YW5jZXMiKQorCisgICAgICAgIGlmIGRlbm9taW5hdG9yID09IDA6CisgICAgICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcignRnJhY3Rpb24oJXMsIDApJyAlIG51bWVyYXRvcikKKyAgICAgICAgZyA9IGdjZChudW1lcmF0b3IsIGRlbm9taW5hdG9yKQorICAgICAgICBzZWxmLl9udW1lcmF0b3IgPSBudW1lcmF0b3IgLy8gZworICAgICAgICBzZWxmLl9kZW5vbWluYXRvciA9IGRlbm9taW5hdG9yIC8vIGcKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX2Zsb2F0KGNscywgZik6CisgICAgICAgICIiIkNvbnZlcnRzIGEgZmluaXRlIGZsb2F0IHRvIGEgcmF0aW9uYWwgbnVtYmVyLCBleGFjdGx5LgorCisgICAgICAgIEJld2FyZSB0aGF0IEZyYWN0aW9uLmZyb21fZmxvYXQoMC4zKSAhPSBGcmFjdGlvbigzLCAxMCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZiwgbnVtYmVycy5JbnRlZ3JhbCk6CisgICAgICAgICAgICByZXR1cm4gY2xzKGYpCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UoZiwgZmxvYXQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcy5mcm9tX2Zsb2F0KCkgb25seSB0YWtlcyBmbG9hdHMsIG5vdCAlciAoJXMpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNscy5fX25hbWVfXywgZiwgdHlwZShmKS5fX25hbWVfXykpCisgICAgICAgIGlmIG1hdGguaXNuYW4oZikgb3IgbWF0aC5pc2luZihmKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgJXIgdG8gJXMuIiAlIChmLCBjbHMuX19uYW1lX18pKQorICAgICAgICByZXR1cm4gY2xzKCpmLmFzX2ludGVnZXJfcmF0aW8oKSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmcm9tX2RlY2ltYWwoY2xzLCBkZWMpOgorICAgICAgICAiIiJDb252ZXJ0cyBhIGZpbml0ZSBEZWNpbWFsIGluc3RhbmNlIHRvIGEgcmF0aW9uYWwgbnVtYmVyLCBleGFjdGx5LiIiIgorICAgICAgICBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkZWMsIG51bWJlcnMuSW50ZWdyYWwpOgorICAgICAgICAgICAgZGVjID0gRGVjaW1hbChpbnQoZGVjKSkKKyAgICAgICAgZWxpZiBub3QgaXNpbnN0YW5jZShkZWMsIERlY2ltYWwpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICAgICAgICIlcy5mcm9tX2RlY2ltYWwoKSBvbmx5IHRha2VzIERlY2ltYWxzLCBub3QgJXIgKCVzKSIgJQorICAgICAgICAgICAgICAgIChjbHMuX19uYW1lX18sIGRlYywgdHlwZShkZWMpLl9fbmFtZV9fKSkKKyAgICAgICAgaWYgbm90IGRlYy5pc19maW5pdGUoKToKKyAgICAgICAgICAgICMgQ2F0Y2hlcyBpbmZpbml0aWVzIGFuZCBuYW5zLgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCAlcyB0byAlcy4iICUgKGRlYywgY2xzLl9fbmFtZV9fKSkKKyAgICAgICAgc2lnbiwgZGlnaXRzLCBleHAgPSBkZWMuYXNfdHVwbGUoKQorICAgICAgICBkaWdpdHMgPSBpbnQoJycuam9pbihtYXAoc3RyLCBkaWdpdHMpKSkKKyAgICAgICAgaWYgc2lnbjoKKyAgICAgICAgICAgIGRpZ2l0cyA9IC1kaWdpdHMKKyAgICAgICAgaWYgZXhwID49IDA6CisgICAgICAgICAgICByZXR1cm4gY2xzKGRpZ2l0cyAqIDEwICoqIGV4cCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbHMoZGlnaXRzLCAxMCAqKiAtZXhwKQorCisgICAgZGVmIGxpbWl0X2Rlbm9taW5hdG9yKHNlbGYsIG1heF9kZW5vbWluYXRvcj0xMDAwMDAwKToKKyAgICAgICAgIiIiQ2xvc2VzdCBGcmFjdGlvbiB0byBzZWxmIHdpdGggZGVub21pbmF0b3IgYXQgbW9zdCBtYXhfZGVub21pbmF0b3IuCisKKyAgICAgICAgPj4+IEZyYWN0aW9uKCczLjE0MTU5MjY1MzU4OTc5MycpLmxpbWl0X2Rlbm9taW5hdG9yKDEwKQorICAgICAgICBGcmFjdGlvbigyMiwgNykKKyAgICAgICAgPj4+IEZyYWN0aW9uKCczLjE0MTU5MjY1MzU4OTc5MycpLmxpbWl0X2Rlbm9taW5hdG9yKDEwMCkKKyAgICAgICAgRnJhY3Rpb24oMzExLCA5OSkKKyAgICAgICAgPj4+IEZyYWN0aW9uKDQzMjEsIDg3NjUpLmxpbWl0X2Rlbm9taW5hdG9yKDEwMDAwKQorICAgICAgICBGcmFjdGlvbig0MzIxLCA4NzY1KQorCisgICAgICAgICIiIgorICAgICAgICAjIEFsZ29yaXRobSBub3RlczogRm9yIGFueSByZWFsIG51bWJlciB4LCBkZWZpbmUgYSAqYmVzdCB1cHBlcgorICAgICAgICAjIGFwcHJveGltYXRpb24qIHRvIHggdG8gYmUgYSByYXRpb25hbCBudW1iZXIgcC9xIHN1Y2ggdGhhdDoKKyAgICAgICAgIworICAgICAgICAjICAgKDEpIHAvcSA+PSB4LCBhbmQKKyAgICAgICAgIyAgICgyKSBpZiBwL3EgPiByL3MgPj0geCB0aGVuIHMgPiBxLCBmb3IgYW55IHJhdGlvbmFsIHIvcy4KKyAgICAgICAgIworICAgICAgICAjIERlZmluZSAqYmVzdCBsb3dlciBhcHByb3hpbWF0aW9uKiBzaW1pbGFybHkuICBUaGVuIGl0IGNhbiBiZQorICAgICAgICAjIHByb3ZlZCB0aGF0IGEgcmF0aW9uYWwgbnVtYmVyIGlzIGEgYmVzdCB1cHBlciBvciBsb3dlcgorICAgICAgICAjIGFwcHJveGltYXRpb24gdG8geCBpZiwgYW5kIG9ubHkgaWYsIGl0IGlzIGEgY29udmVyZ2VudCBvcgorICAgICAgICAjIHNlbWljb252ZXJnZW50IG9mIHRoZSAodW5pcXVlIHNob3J0ZXN0KSBjb250aW51ZWQgZnJhY3Rpb24KKyAgICAgICAgIyBhc3NvY2lhdGVkIHRvIHguCisgICAgICAgICMKKyAgICAgICAgIyBUbyBmaW5kIGEgYmVzdCByYXRpb25hbCBhcHByb3hpbWF0aW9uIHdpdGggZGVub21pbmF0b3IgPD0gTSwKKyAgICAgICAgIyB3ZSBmaW5kIHRoZSBiZXN0IHVwcGVyIGFuZCBsb3dlciBhcHByb3hpbWF0aW9ucyB3aXRoCisgICAgICAgICMgZGVub21pbmF0b3IgPD0gTSBhbmQgdGFrZSB3aGljaGV2ZXIgb2YgdGhlc2UgaXMgY2xvc2VyIHRvIHguCisgICAgICAgICMgSW4gdGhlIGV2ZW50IG9mIGEgdGllLCB0aGUgYm91bmQgd2l0aCBzbWFsbGVyIGRlbm9taW5hdG9yIGlzCisgICAgICAgICMgY2hvc2VuLiAgSWYgYm90aCBkZW5vbWluYXRvcnMgYXJlIGVxdWFsICh3aGljaCBjYW4gaGFwcGVuCisgICAgICAgICMgb25seSB3aGVuIG1heF9kZW5vbWluYXRvciA9PSAxIGFuZCBzZWxmIGlzIG1pZHdheSBiZXR3ZWVuCisgICAgICAgICMgdHdvIGludGVnZXJzKSB0aGUgbG93ZXIgYm91bmQtLS1pLmUuLCB0aGUgZmxvb3Igb2Ygc2VsZiwgaXMKKyAgICAgICAgIyB0YWtlbi4KKworICAgICAgICBpZiBtYXhfZGVub21pbmF0b3IgPCAxOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWF4X2Rlbm9taW5hdG9yIHNob3VsZCBiZSBhdCBsZWFzdCAxIikKKyAgICAgICAgaWYgc2VsZi5fZGVub21pbmF0b3IgPD0gbWF4X2Rlbm9taW5hdG9yOgorICAgICAgICAgICAgcmV0dXJuIEZyYWN0aW9uKHNlbGYpCisKKyAgICAgICAgcDAsIHEwLCBwMSwgcTEgPSAwLCAxLCAxLCAwCisgICAgICAgIG4sIGQgPSBzZWxmLl9udW1lcmF0b3IsIHNlbGYuX2Rlbm9taW5hdG9yCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBhID0gbi8vZAorICAgICAgICAgICAgcTIgPSBxMCthKnExCisgICAgICAgICAgICBpZiBxMiA+IG1heF9kZW5vbWluYXRvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcDAsIHEwLCBwMSwgcTEgPSBwMSwgcTEsIHAwK2EqcDEsIHEyCisgICAgICAgICAgICBuLCBkID0gZCwgbi1hKmQKKworICAgICAgICBrID0gKG1heF9kZW5vbWluYXRvci1xMCkvL3ExCisgICAgICAgIGJvdW5kMSA9IEZyYWN0aW9uKHAwK2sqcDEsIHEwK2sqcTEpCisgICAgICAgIGJvdW5kMiA9IEZyYWN0aW9uKHAxLCBxMSkKKyAgICAgICAgaWYgYWJzKGJvdW5kMiAtIHNlbGYpIDw9IGFicyhib3VuZDEtc2VsZik6CisgICAgICAgICAgICByZXR1cm4gYm91bmQyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gYm91bmQxCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbnVtZXJhdG9yKGEpOgorICAgICAgICByZXR1cm4gYS5fbnVtZXJhdG9yCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGVub21pbmF0b3IoYSk6CisgICAgICAgIHJldHVybiBhLl9kZW5vbWluYXRvcgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJyZXByKHNlbGYpIiIiCisgICAgICAgIHJldHVybiAoJ0ZyYWN0aW9uKCVzLCAlcyknICUgKHNlbGYuX251bWVyYXRvciwgc2VsZi5fZGVub21pbmF0b3IpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICIiInN0cihzZWxmKSIiIgorICAgICAgICBpZiBzZWxmLl9kZW5vbWluYXRvciA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLl9udW1lcmF0b3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJyVzLyVzJyAlIChzZWxmLl9udW1lcmF0b3IsIHNlbGYuX2Rlbm9taW5hdG9yKQorCisgICAgZGVmIF9vcGVyYXRvcl9mYWxsYmFja3MobW9ub21vcnBoaWNfb3BlcmF0b3IsIGZhbGxiYWNrX29wZXJhdG9yKToKKyAgICAgICAgIiIiR2VuZXJhdGVzIGZvcndhcmQgYW5kIHJldmVyc2Ugb3BlcmF0b3JzIGdpdmVuIGEgcHVyZWx5LXJhdGlvbmFsCisgICAgICAgIG9wZXJhdG9yIGFuZCBhIGZ1bmN0aW9uIGZyb20gdGhlIG9wZXJhdG9yIG1vZHVsZS4KKworICAgICAgICBVc2UgdGhpcyBsaWtlOgorICAgICAgICBfX29wX18sIF9fcm9wX18gPSBfb3BlcmF0b3JfZmFsbGJhY2tzKGp1c3RfcmF0aW9uYWxfb3AsIG9wZXJhdG9yLm9wKQorCisgICAgICAgIEluIGdlbmVyYWwsIHdlIHdhbnQgdG8gaW1wbGVtZW50IHRoZSBhcml0aG1ldGljIG9wZXJhdGlvbnMgc28KKyAgICAgICAgdGhhdCBtaXhlZC1tb2RlIG9wZXJhdGlvbnMgZWl0aGVyIGNhbGwgYW4gaW1wbGVtZW50YXRpb24gd2hvc2UKKyAgICAgICAgYXV0aG9yIGtuZXcgYWJvdXQgdGhlIHR5cGVzIG9mIGJvdGggYXJndW1lbnRzLCBvciBjb252ZXJ0IGJvdGgKKyAgICAgICAgdG8gdGhlIG5lYXJlc3QgYnVpbHQgaW4gdHlwZSBhbmQgZG8gdGhlIG9wZXJhdGlvbiB0aGVyZS4gSW4KKyAgICAgICAgRnJhY3Rpb24sIHRoYXQgbWVhbnMgdGhhdCB3ZSBkZWZpbmUgX19hZGRfXyBhbmQgX19yYWRkX18gYXM6CisKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICAjIEJvdGggdHlwZXMgaGF2ZSBudW1lcmF0b3JzL2Rlbm9taW5hdG9yIGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgIyBzbyBkbyB0aGUgb3BlcmF0aW9uIGRpcmVjdGx5CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgKGludCwgbG9uZywgRnJhY3Rpb24pKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZyYWN0aW9uKHNlbGYubnVtZXJhdG9yICogb3RoZXIuZGVub21pbmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIubnVtZXJhdG9yICogc2VsZi5kZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVub21pbmF0b3IgKiBvdGhlci5kZW5vbWluYXRvcikKKyAgICAgICAgICAgICAgICAjIGZsb2F0IGFuZCBjb21wbGV4IGRvbid0IGhhdmUgdGhvc2Ugb3BlcmF0aW9ucywgYnV0IHdlCisgICAgICAgICAgICAgICAgIyBrbm93IGFib3V0IHRob3NlIHR5cGVzLCBzbyBzcGVjaWFsIGNhc2UgdGhlbS4KKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGZsb2F0KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYpICsgb3RoZXIKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIGNvbXBsZXgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleChzZWxmKSArIG90aGVyCisgICAgICAgICAgICAgICAgIyBMZXQgdGhlIG90aGVyIHR5cGUgdGFrZSBvdmVyLgorICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgICAgICAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICMgcmFkZCBoYW5kbGVzIG1vcmUgdHlwZXMgdGhhbiBhZGQgYmVjYXVzZSB0aGVyZSdzCisgICAgICAgICAgICAgICAgIyBub3RoaW5nIGxlZnQgdG8gZmFsbCBiYWNrIHRvLgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFJhdGlvbmFsKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZyYWN0aW9uKHNlbGYubnVtZXJhdG9yICogb3RoZXIuZGVub21pbmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIubnVtZXJhdG9yICogc2VsZi5kZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVub21pbmF0b3IgKiBvdGhlci5kZW5vbWluYXRvcikKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIFJlYWwpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQob3RoZXIpICsgZmxvYXQoc2VsZikKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIENvbXBsZXgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleChvdGhlcikgKyBjb21wbGV4KHNlbGYpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKworICAgICAgICBUaGVyZSBhcmUgNSBkaWZmZXJlbnQgY2FzZXMgZm9yIGEgbWl4ZWQtdHlwZSBhZGRpdGlvbiBvbgorICAgICAgICBGcmFjdGlvbi4gSSdsbCByZWZlciB0byBhbGwgb2YgdGhlIGFib3ZlIGNvZGUgdGhhdCBkb2Vzbid0CisgICAgICAgIHJlZmVyIHRvIEZyYWN0aW9uLCBmbG9hdCwgb3IgY29tcGxleCBhcyAiYm9pbGVycGxhdGUiLiAncicKKyAgICAgICAgd2lsbCBiZSBhbiBpbnN0YW5jZSBvZiBGcmFjdGlvbiwgd2hpY2ggaXMgYSBzdWJ0eXBlIG9mCisgICAgICAgIFJhdGlvbmFsIChyIDogRnJhY3Rpb24gPDogUmF0aW9uYWwpLCBhbmQgYiA6IEIgPDoKKyAgICAgICAgQ29tcGxleC4gVGhlIGZpcnN0IHRocmVlIGludm9sdmUgJ3IgKyBiJzoKKworICAgICAgICAgICAgMS4gSWYgQiA8OiBGcmFjdGlvbiwgaW50LCBmbG9hdCwgb3IgY29tcGxleCwgd2UgaGFuZGxlCisgICAgICAgICAgICAgICB0aGF0IHNwZWNpYWxseSwgYW5kIGFsbCBpcyB3ZWxsLgorICAgICAgICAgICAgMi4gSWYgRnJhY3Rpb24gZmFsbHMgYmFjayB0byB0aGUgYm9pbGVycGxhdGUgY29kZSwgYW5kIGl0CisgICAgICAgICAgICAgICB3ZXJlIHRvIHJldHVybiBhIHZhbHVlIGZyb20gX19hZGRfXywgd2UnZCBtaXNzIHRoZQorICAgICAgICAgICAgICAgcG9zc2liaWxpdHkgdGhhdCBCIGRlZmluZXMgYSBtb3JlIGludGVsbGlnZW50IF9fcmFkZF9fLAorICAgICAgICAgICAgICAgc28gdGhlIGJvaWxlcnBsYXRlIHNob3VsZCByZXR1cm4gTm90SW1wbGVtZW50ZWQgZnJvbQorICAgICAgICAgICAgICAgX19hZGRfXy4gSW4gcGFydGljdWxhciwgd2UgZG9uJ3QgaGFuZGxlIFJhdGlvbmFsCisgICAgICAgICAgICAgICBoZXJlLCBldmVuIHRob3VnaCB3ZSBjb3VsZCBnZXQgYW4gZXhhY3QgYW5zd2VyLCBpbiBjYXNlCisgICAgICAgICAgICAgICB0aGUgb3RoZXIgdHlwZSB3YW50cyB0byBkbyBzb21ldGhpbmcgc3BlY2lhbC4KKyAgICAgICAgICAgIDMuIElmIEIgPDogRnJhY3Rpb24sIFB5dGhvbiB0cmllcyBCLl9fcmFkZF9fIGJlZm9yZQorICAgICAgICAgICAgICAgRnJhY3Rpb24uX19hZGRfXy4gVGhpcyBpcyBvaywgYmVjYXVzZSBpdCB3YXMKKyAgICAgICAgICAgICAgIGltcGxlbWVudGVkIHdpdGgga25vd2xlZGdlIG9mIEZyYWN0aW9uLCBzbyBpdCBjYW4KKyAgICAgICAgICAgICAgIGhhbmRsZSB0aG9zZSBpbnN0YW5jZXMgYmVmb3JlIGRlbGVnYXRpbmcgdG8gUmVhbCBvcgorICAgICAgICAgICAgICAgQ29tcGxleC4KKworICAgICAgICBUaGUgbmV4dCB0d28gc2l0dWF0aW9ucyBkZXNjcmliZSAnYiArIHInLiBXZSBhc3N1bWUgdGhhdCBiCisgICAgICAgIGRpZG4ndCBrbm93IGFib3V0IEZyYWN0aW9uIGluIGl0cyBpbXBsZW1lbnRhdGlvbiwgYW5kIHRoYXQgaXQKKyAgICAgICAgdXNlcyBzaW1pbGFyIGJvaWxlcnBsYXRlIGNvZGU6CisKKyAgICAgICAgICAgIDQuIElmIEIgPDogUmF0aW9uYWwsIHRoZW4gX19yYWRkXyBjb252ZXJ0cyBib3RoIHRvIHRoZQorICAgICAgICAgICAgICAgYnVpbHRpbiByYXRpb25hbCB0eXBlIChoZXkgbG9vaywgdGhhdCdzIHVzKSBhbmQKKyAgICAgICAgICAgICAgIHByb2NlZWRzLgorICAgICAgICAgICAgNS4gT3RoZXJ3aXNlLCBfX3JhZGRfXyB0cmllcyB0byBmaW5kIHRoZSBuZWFyZXN0IGNvbW1vbgorICAgICAgICAgICAgICAgYmFzZSBBQkMsIGFuZCBmYWxsIGJhY2sgdG8gaXRzIGJ1aWx0aW4gdHlwZS4gU2luY2UgdGhpcworICAgICAgICAgICAgICAgY2xhc3MgZG9lc24ndCBzdWJjbGFzcyBhIGNvbmNyZXRlIHR5cGUsIHRoZXJlJ3Mgbm8KKyAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRvIGZhbGwgYmFjayB0bywgc28gd2UgbmVlZCB0byB0cnkgYXMKKyAgICAgICAgICAgICAgIGhhcmQgYXMgcG9zc2libGUgdG8gcmV0dXJuIGFuIGFjdHVhbCB2YWx1ZSwgb3IgdGhlIHVzZXIKKyAgICAgICAgICAgICAgIHdpbGwgZ2V0IGEgVHlwZUVycm9yLgorCisgICAgICAgICIiIgorICAgICAgICBkZWYgZm9yd2FyZChhLCBiKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgKGludCwgbG9uZywgRnJhY3Rpb24pKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9ub21vcnBoaWNfb3BlcmF0b3IoYSwgYikKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShiLCBmbG9hdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrX29wZXJhdG9yKGZsb2F0KGEpLCBiKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGIsIGNvbXBsZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFja19vcGVyYXRvcihjb21wbGV4KGEpLCBiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgZm9yd2FyZC5fX25hbWVfXyA9ICdfXycgKyBmYWxsYmFja19vcGVyYXRvci5fX25hbWVfXyArICdfXycKKyAgICAgICAgZm9yd2FyZC5fX2RvY19fID0gbW9ub21vcnBoaWNfb3BlcmF0b3IuX19kb2NfXworCisgICAgICAgIGRlZiByZXZlcnNlKGIsIGEpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhLCBSYXRpb25hbCk6CisgICAgICAgICAgICAgICAgIyBJbmNsdWRlcyBpbnRzLgorICAgICAgICAgICAgICAgIHJldHVybiBtb25vbW9ycGhpY19vcGVyYXRvcihhLCBiKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGEsIG51bWJlcnMuUmVhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrX29wZXJhdG9yKGZsb2F0KGEpLCBmbG9hdChiKSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhLCBudW1iZXJzLkNvbXBsZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxsYmFja19vcGVyYXRvcihjb21wbGV4KGEpLCBjb21wbGV4KGIpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV2ZXJzZS5fX25hbWVfXyA9ICdfX3InICsgZmFsbGJhY2tfb3BlcmF0b3IuX19uYW1lX18gKyAnX18nCisgICAgICAgIHJldmVyc2UuX19kb2NfXyA9IG1vbm9tb3JwaGljX29wZXJhdG9yLl9fZG9jX18KKworICAgICAgICByZXR1cm4gZm9yd2FyZCwgcmV2ZXJzZQorCisgICAgZGVmIF9hZGQoYSwgYik6CisgICAgICAgICIiImEgKyBiIiIiCisgICAgICAgIHJldHVybiBGcmFjdGlvbihhLm51bWVyYXRvciAqIGIuZGVub21pbmF0b3IgKworICAgICAgICAgICAgICAgICAgICAgICAgYi5udW1lcmF0b3IgKiBhLmRlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYS5kZW5vbWluYXRvciAqIGIuZGVub21pbmF0b3IpCisKKyAgICBfX2FkZF9fLCBfX3JhZGRfXyA9IF9vcGVyYXRvcl9mYWxsYmFja3MoX2FkZCwgb3BlcmF0b3IuYWRkKQorCisgICAgZGVmIF9zdWIoYSwgYik6CisgICAgICAgICIiImEgLSBiIiIiCisgICAgICAgIHJldHVybiBGcmFjdGlvbihhLm51bWVyYXRvciAqIGIuZGVub21pbmF0b3IgLQorICAgICAgICAgICAgICAgICAgICAgICAgYi5udW1lcmF0b3IgKiBhLmRlbm9taW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgYS5kZW5vbWluYXRvciAqIGIuZGVub21pbmF0b3IpCisKKyAgICBfX3N1Yl9fLCBfX3JzdWJfXyA9IF9vcGVyYXRvcl9mYWxsYmFja3MoX3N1Yiwgb3BlcmF0b3Iuc3ViKQorCisgICAgZGVmIF9tdWwoYSwgYik6CisgICAgICAgICIiImEgKiBiIiIiCisgICAgICAgIHJldHVybiBGcmFjdGlvbihhLm51bWVyYXRvciAqIGIubnVtZXJhdG9yLCBhLmRlbm9taW5hdG9yICogYi5kZW5vbWluYXRvcikKKworICAgIF9fbXVsX18sIF9fcm11bF9fID0gX29wZXJhdG9yX2ZhbGxiYWNrcyhfbXVsLCBvcGVyYXRvci5tdWwpCisKKyAgICBkZWYgX2RpdihhLCBiKToKKyAgICAgICAgIiIiYSAvIGIiIiIKKyAgICAgICAgcmV0dXJuIEZyYWN0aW9uKGEubnVtZXJhdG9yICogYi5kZW5vbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEuZGVub21pbmF0b3IgKiBiLm51bWVyYXRvcikKKworICAgIF9fdHJ1ZWRpdl9fLCBfX3J0cnVlZGl2X18gPSBfb3BlcmF0b3JfZmFsbGJhY2tzKF9kaXYsIG9wZXJhdG9yLnRydWVkaXYpCisgICAgX19kaXZfXywgX19yZGl2X18gPSBfb3BlcmF0b3JfZmFsbGJhY2tzKF9kaXYsIG9wZXJhdG9yLmRpdikKKworICAgIGRlZiBfX2Zsb29yZGl2X18oYSwgYik6CisgICAgICAgICIiImEgLy8gYiIiIgorICAgICAgICAjIFdpbGwgYmUgbWF0aC5mbG9vcihhIC8gYikgaW4gMy4wLgorICAgICAgICBkaXYgPSBhIC8gYgorICAgICAgICBpZiBpc2luc3RhbmNlKGRpdiwgUmF0aW9uYWwpOgorICAgICAgICAgICAgIyB0cnVuYyhtYXRoLmZsb29yKGRpdikpIGRvZXNuJ3Qgd29yayBpZiB0aGUgcmF0aW9uYWwgaXMKKyAgICAgICAgICAgICMgbW9yZSBwcmVjaXNlIHRoYW4gYSBmbG9hdCBiZWNhdXNlIHRoZSBpbnRlcm1lZGlhdGUKKyAgICAgICAgICAgICMgcm91bmRpbmcgbWF5IGNyb3NzIGFuIGludGVnZXIgYm91bmRhcnkuCisgICAgICAgICAgICByZXR1cm4gZGl2Lm51bWVyYXRvciAvLyBkaXYuZGVub21pbmF0b3IKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBtYXRoLmZsb29yKGRpdikKKworICAgIGRlZiBfX3JmbG9vcmRpdl9fKGIsIGEpOgorICAgICAgICAiIiJhIC8vIGIiIiIKKyAgICAgICAgIyBXaWxsIGJlIG1hdGguZmxvb3IoYSAvIGIpIGluIDMuMC4KKyAgICAgICAgZGl2ID0gYSAvIGIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShkaXYsIFJhdGlvbmFsKToKKyAgICAgICAgICAgICMgdHJ1bmMobWF0aC5mbG9vcihkaXYpKSBkb2Vzbid0IHdvcmsgaWYgdGhlIHJhdGlvbmFsIGlzCisgICAgICAgICAgICAjIG1vcmUgcHJlY2lzZSB0aGFuIGEgZmxvYXQgYmVjYXVzZSB0aGUgaW50ZXJtZWRpYXRlCisgICAgICAgICAgICAjIHJvdW5kaW5nIG1heSBjcm9zcyBhbiBpbnRlZ2VyIGJvdW5kYXJ5LgorICAgICAgICAgICAgcmV0dXJuIGRpdi5udW1lcmF0b3IgLy8gZGl2LmRlbm9taW5hdG9yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbWF0aC5mbG9vcihkaXYpCisKKyAgICBkZWYgX19tb2RfXyhhLCBiKToKKyAgICAgICAgIiIiYSAlIGIiIiIKKyAgICAgICAgZGl2ID0gYSAvLyBiCisgICAgICAgIHJldHVybiBhIC0gYiAqIGRpdgorCisgICAgZGVmIF9fcm1vZF9fKGIsIGEpOgorICAgICAgICAiIiJhICUgYiIiIgorICAgICAgICBkaXYgPSBhIC8vIGIKKyAgICAgICAgcmV0dXJuIGEgLSBiICogZGl2CisKKyAgICBkZWYgX19wb3dfXyhhLCBiKToKKyAgICAgICAgIiIiYSAqKiBiCisKKyAgICAgICAgSWYgYiBpcyBub3QgYW4gaW50ZWdlciwgdGhlIHJlc3VsdCB3aWxsIGJlIGEgZmxvYXQgb3IgY29tcGxleAorICAgICAgICBzaW5jZSByb290cyBhcmUgZ2VuZXJhbGx5IGlycmF0aW9uYWwuIElmIGIgaXMgYW4gaW50ZWdlciwgdGhlCisgICAgICAgIHJlc3VsdCB3aWxsIGJlIHJhdGlvbmFsLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGIsIFJhdGlvbmFsKToKKyAgICAgICAgICAgIGlmIGIuZGVub21pbmF0b3IgPT0gMToKKyAgICAgICAgICAgICAgICBwb3dlciA9IGIubnVtZXJhdG9yCisgICAgICAgICAgICAgICAgaWYgcG93ZXIgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZyYWN0aW9uKGEuX251bWVyYXRvciAqKiBwb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuX2Rlbm9taW5hdG9yICoqIHBvd2VyKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGcmFjdGlvbihhLl9kZW5vbWluYXRvciAqKiAtcG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLl9udW1lcmF0b3IgKiogLXBvd2VyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEEgZnJhY3Rpb25hbCBwb3dlciB3aWxsIGdlbmVyYWxseSBwcm9kdWNlIGFuCisgICAgICAgICAgICAgICAgIyBpcnJhdGlvbmFsIG51bWJlci4KKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQoYSkgKiogZmxvYXQoYikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmbG9hdChhKSAqKiBiCisKKyAgICBkZWYgX19ycG93X18oYiwgYSk6CisgICAgICAgICIiImEgKiogYiIiIgorICAgICAgICBpZiBiLl9kZW5vbWluYXRvciA9PSAxIGFuZCBiLl9udW1lcmF0b3IgPj0gMDoKKyAgICAgICAgICAgICMgSWYgYSBpcyBhbiBpbnQsIGtlZXAgaXQgdGhhdCB3YXkgaWYgcG9zc2libGUuCisgICAgICAgICAgICByZXR1cm4gYSAqKiBiLl9udW1lcmF0b3IKKworICAgICAgICBpZiBpc2luc3RhbmNlKGEsIFJhdGlvbmFsKToKKyAgICAgICAgICAgIHJldHVybiBGcmFjdGlvbihhLm51bWVyYXRvciwgYS5kZW5vbWluYXRvcikgKiogYgorCisgICAgICAgIGlmIGIuX2Rlbm9taW5hdG9yID09IDE6CisgICAgICAgICAgICByZXR1cm4gYSAqKiBiLl9udW1lcmF0b3IKKworICAgICAgICByZXR1cm4gYSAqKiBmbG9hdChiKQorCisgICAgZGVmIF9fcG9zX18oYSk6CisgICAgICAgICIiIithOiBDb2VyY2VzIGEgc3ViY2xhc3MgaW5zdGFuY2UgdG8gRnJhY3Rpb24iIiIKKyAgICAgICAgcmV0dXJuIEZyYWN0aW9uKGEuX251bWVyYXRvciwgYS5fZGVub21pbmF0b3IpCisKKyAgICBkZWYgX19uZWdfXyhhKToKKyAgICAgICAgIiIiLWEiIiIKKyAgICAgICAgcmV0dXJuIEZyYWN0aW9uKC1hLl9udW1lcmF0b3IsIGEuX2Rlbm9taW5hdG9yKQorCisgICAgZGVmIF9fYWJzX18oYSk6CisgICAgICAgICIiImFicyhhKSIiIgorICAgICAgICByZXR1cm4gRnJhY3Rpb24oYWJzKGEuX251bWVyYXRvciksIGEuX2Rlbm9taW5hdG9yKQorCisgICAgZGVmIF9fdHJ1bmNfXyhhKToKKyAgICAgICAgIiIidHJ1bmMoYSkiIiIKKyAgICAgICAgaWYgYS5fbnVtZXJhdG9yIDwgMDoKKyAgICAgICAgICAgIHJldHVybiAtKC1hLl9udW1lcmF0b3IgLy8gYS5fZGVub21pbmF0b3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gYS5fbnVtZXJhdG9yIC8vIGEuX2Rlbm9taW5hdG9yCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICIiImhhc2goc2VsZikKKworICAgICAgICBUcmlja3kgYmVjYXVzZSB2YWx1ZXMgdGhhdCBhcmUgZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIGEKKyAgICAgICAgZmxvYXQgbXVzdCBoYXZlIHRoZSBzYW1lIGhhc2ggYXMgdGhhdCBmbG9hdC4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBYWFggc2luY2UgdGhpcyBtZXRob2QgaXMgZXhwZW5zaXZlLCBjb25zaWRlciBjYWNoaW5nIHRoZSByZXN1bHQKKyAgICAgICAgaWYgc2VsZi5fZGVub21pbmF0b3IgPT0gMToKKyAgICAgICAgICAgICMgR2V0IGludGVnZXJzIHJpZ2h0LgorICAgICAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fbnVtZXJhdG9yKQorICAgICAgICAjIEV4cGVuc2l2ZSBjaGVjaywgYnV0IGRlZmluaXRlbHkgY29ycmVjdC4KKyAgICAgICAgaWYgc2VsZiA9PSBmbG9hdChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBoYXNoKGZsb2F0KHNlbGYpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVc2UgdHVwbGUncyBoYXNoIHRvIGF2b2lkIGEgaGlnaCBjb2xsaXNpb24gcmF0ZSBvbgorICAgICAgICAgICAgIyBzaW1wbGUgZnJhY3Rpb25zLgorICAgICAgICAgICAgcmV0dXJuIGhhc2goKHNlbGYuX251bWVyYXRvciwgc2VsZi5fZGVub21pbmF0b3IpKQorCisgICAgZGVmIF9fZXFfXyhhLCBiKToKKyAgICAgICAgIiIiYSA9PSBiIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgUmF0aW9uYWwpOgorICAgICAgICAgICAgcmV0dXJuIChhLl9udW1lcmF0b3IgPT0gYi5udW1lcmF0b3IgYW5kCisgICAgICAgICAgICAgICAgICAgIGEuX2Rlbm9taW5hdG9yID09IGIuZGVub21pbmF0b3IpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgbnVtYmVycy5Db21wbGV4KSBhbmQgYi5pbWFnID09IDA6CisgICAgICAgICAgICBiID0gYi5yZWFsCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYiwgZmxvYXQpOgorICAgICAgICAgICAgaWYgbWF0aC5pc25hbihiKSBvciBtYXRoLmlzaW5mKGIpOgorICAgICAgICAgICAgICAgICMgY29tcGFyaXNvbnMgd2l0aCBhbiBpbmZpbml0eSBvciBuYW4gc2hvdWxkIGJlaGF2ZSBpbgorICAgICAgICAgICAgICAgICMgdGhlIHNhbWUgd2F5IGZvciBhbnkgZmluaXRlIGEsIHNvIHRyZWF0IGEgYXMgemVyby4KKyAgICAgICAgICAgICAgICByZXR1cm4gMC4wID09IGIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGEgPT0gYS5mcm9tX2Zsb2F0KGIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFNpbmNlIGEgZG9lc24ndCBrbm93IGhvdyB0byBjb21wYXJlIHdpdGggYiwgbGV0J3MgZ2l2ZSBiCisgICAgICAgICAgICAjIGEgY2hhbmNlIHRvIGNvbXBhcmUgaXRzZWxmIHdpdGggYS4KKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9yaWNoY21wKHNlbGYsIG90aGVyLCBvcCk6CisgICAgICAgICIiIkhlbHBlciBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMsIGZvciBpbnRlcm5hbCB1c2Ugb25seS4KKworICAgICAgICBJbXBsZW1lbnQgY29tcGFyaXNvbiBiZXR3ZWVuIGEgUmF0aW9uYWwgaW5zdGFuY2UgYHNlbGZgLCBhbmQKKyAgICAgICAgZWl0aGVyIGFub3RoZXIgUmF0aW9uYWwgaW5zdGFuY2Ugb3IgYSBmbG9hdCBgb3RoZXJgLiAgSWYKKyAgICAgICAgYG90aGVyYCBpcyBub3QgYSBSYXRpb25hbCBpbnN0YW5jZSBvciBhIGZsb2F0LCByZXR1cm4KKyAgICAgICAgTm90SW1wbGVtZW50ZWQuIGBvcGAgc2hvdWxkIGJlIG9uZSBvZiB0aGUgc2l4IHN0YW5kYXJkCisgICAgICAgIGNvbXBhcmlzb24gb3BlcmF0b3JzLgorCisgICAgICAgICIiIgorICAgICAgICAjIGNvbnZlcnQgb3RoZXIgdG8gYSBSYXRpb25hbCBpbnN0YW5jZSB3aGVyZSByZWFzb25hYmxlLgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBSYXRpb25hbCk6CisgICAgICAgICAgICByZXR1cm4gb3Aoc2VsZi5fbnVtZXJhdG9yICogb3RoZXIuZGVub21pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGVub21pbmF0b3IgKiBvdGhlci5udW1lcmF0b3IpCisgICAgICAgICMgY29tcGFyaXNvbnMgd2l0aCBjb21wbGV4IHNob3VsZCByYWlzZSBhIFR5cGVFcnJvciwgZm9yIGNvbnNpc3RlbmN5CisgICAgICAgICMgd2l0aCBpbnQ8LT5jb21wbGV4LCBmbG9hdDwtPmNvbXBsZXgsIGFuZCBjb21wbGV4PC0+Y29tcGxleCBjb21wYXJpc29ucy4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgY29tcGxleCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIm5vIG9yZGVyaW5nIHJlbGF0aW9uIGlzIGRlZmluZWQgZm9yIGNvbXBsZXggbnVtYmVycyIpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGZsb2F0KToKKyAgICAgICAgICAgIGlmIG1hdGguaXNuYW4ob3RoZXIpIG9yIG1hdGguaXNpbmYob3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBvcCgwLjAsIG90aGVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gb3Aoc2VsZiwgc2VsZi5mcm9tX2Zsb2F0KG90aGVyKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9fbHRfXyhhLCBiKToKKyAgICAgICAgIiIiYSA8IGIiIiIKKyAgICAgICAgcmV0dXJuIGEuX3JpY2hjbXAoYiwgb3BlcmF0b3IubHQpCisKKyAgICBkZWYgX19ndF9fKGEsIGIpOgorICAgICAgICAiIiJhID4gYiIiIgorICAgICAgICByZXR1cm4gYS5fcmljaGNtcChiLCBvcGVyYXRvci5ndCkKKworICAgIGRlZiBfX2xlX18oYSwgYik6CisgICAgICAgICIiImEgPD0gYiIiIgorICAgICAgICByZXR1cm4gYS5fcmljaGNtcChiLCBvcGVyYXRvci5sZSkKKworICAgIGRlZiBfX2dlX18oYSwgYik6CisgICAgICAgICIiImEgPj0gYiIiIgorICAgICAgICByZXR1cm4gYS5fcmljaGNtcChiLCBvcGVyYXRvci5nZSkKKworICAgIGRlZiBfX25vbnplcm9fXyhhKToKKyAgICAgICAgIiIiYSAhPSAwIiIiCisgICAgICAgIHJldHVybiBhLl9udW1lcmF0b3IgIT0gMAorCisgICAgIyBzdXBwb3J0IGZvciBwaWNrbGluZywgY29weSwgYW5kIGRlZXBjb3B5CisKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLl9fY2xhc3NfXywgKHN0cihzZWxmKSwpKQorCisgICAgZGVmIF9fY29weV9fKHNlbGYpOgorICAgICAgICBpZiB0eXBlKHNlbGYpID09IEZyYWN0aW9uOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYgICAgICMgSSdtIGltbXV0YWJsZTsgdGhlcmVmb3JlIEkgYW0gbXkgb3duIGNsb25lCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLl9udW1lcmF0b3IsIHNlbGYuX2Rlbm9taW5hdG9yKQorCisgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vKToKKyAgICAgICAgaWYgdHlwZShzZWxmKSA9PSBGcmFjdGlvbjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmICAgICAjIE15IGNvbXBvbmVudHMgYXJlIGFsc28gaW1tdXRhYmxlCisgICAgICAgIHJldHVybiBzZWxmLl9fY2xhc3NfXyhzZWxmLl9udW1lcmF0b3IsIHNlbGYuX2Rlbm9taW5hdG9yKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDViYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZyYWN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy9mcmFjdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDViYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ZyYWN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9mdHBsaWIucHkgYi9saWIvcHl0aG9uMi43L2Z0cGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjIyMThiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mdHBsaWIucHkKQEAgLTAsMCArMSwxMDQ2IEBACisiIiJBbiBGVFAgY2xpZW50IGNsYXNzIGFuZCBzb21lIGhlbHBlciBmdW5jdGlvbnMuCisKK0Jhc2VkIG9uIFJGQyA5NTk6IEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgKEZUUCksIGJ5IEouIFBvc3RlbCBhbmQgSi4gUmV5bm9sZHMKKworRXhhbXBsZToKKworPj4+IGZyb20gZnRwbGliIGltcG9ydCBGVFAKKz4+PiBmdHAgPSBGVFAoJ2Z0cC5weXRob24ub3JnJykgIyBjb25uZWN0IHRvIGhvc3QsIGRlZmF1bHQgcG9ydAorPj4+IGZ0cC5sb2dpbigpICMgZGVmYXVsdCwgaS5lLjogdXNlciBhbm9ueW1vdXMsIHBhc3N3ZCBhbm9ueW1vdXNACisnMjMwIEd1ZXN0IGxvZ2luIG9rLCBhY2Nlc3MgcmVzdHJpY3Rpb25zIGFwcGx5LicKKz4+PiBmdHAucmV0cmxpbmVzKCdMSVNUJykgIyBsaXN0IGRpcmVjdG9yeSBjb250ZW50cwordG90YWwgOQorZHJ3eHIteHIteCAgIDggcm9vdCAgICAgd2hlZWwgICAgICAgIDEwMjQgSmFuICAzICAxOTk0IC4KK2Ryd3hyLXhyLXggICA4IHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IEphbiAgMyAgMTk5NCAuLgorZHJ3eHIteHIteCAgIDIgcm9vdCAgICAgd2hlZWwgICAgICAgIDEwMjQgSmFuICAzICAxOTk0IGJpbgorZHJ3eHIteHIteCAgIDIgcm9vdCAgICAgd2hlZWwgICAgICAgIDEwMjQgSmFuICAzICAxOTk0IGV0YworZC13eHJ3eHIteCAgIDIgZnRwICAgICAgd2hlZWwgICAgICAgIDEwMjQgU2VwICA1IDEzOjQzIGluY29taW5nCitkcnd4ci14ci14ICAgMiByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBOb3YgMTcgIDE5OTMgbGliCitkcnd4ci14ci14ICAgNiAxMDk0ICAgICB3aGVlbCAgICAgICAgMTAyNCBTZXAgMTMgMTk6MDcgcHViCitkcnd4ci14ci14ICAgMyByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBKYW4gIDMgIDE5OTQgdXNyCistcnctci0tci0tICAgMSByb290ICAgICByb290ICAgICAgICAgIDMxMiBBdWcgIDEgIDE5OTQgd2VsY29tZS5tc2cKKycyMjYgVHJhbnNmZXIgY29tcGxldGUuJworPj4+IGZ0cC5xdWl0KCkKKycyMjEgR29vZGJ5ZS4nCis+Pj4KKworQSBuaWNlIHRlc3QgdGhhdCByZXZlYWxzIHNvbWUgb2YgdGhlIG5ldHdvcmsgZGlhbG9ndWUgd291bGQgYmU6CitweXRob24gZnRwbGliLnB5IC1kIGxvY2FsaG9zdCAtbCAtcCAtbAorIiIiCisKKyMKKyMgQ2hhbmdlcyBhbmQgaW1wcm92ZW1lbnRzIHN1Z2dlc3RlZCBieSBTdGV2ZSBNYWpld3NraS4KKyMgTW9kaWZpZWQgYnkgSmFjayB0byB3b3JrIG9uIHRoZSBtYWMuCisjIE1vZGlmaWVkIGJ5IFNpZWJyZW4gdG8gc3VwcG9ydCBkb2NzdHJpbmdzIGFuZCBQQVNWLgorIyBNb2RpZmllZCBieSBQaGlsIFNjaHdhcnR6IHRvIGFkZCBzdG9yYmluYXJ5IGFuZCBzdG9ybGluZXMgY2FsbGJhY2tzLgorIyBNb2RpZmllZCBieSBHaWFtcGFvbG8gUm9kb2xhJyB0byBhZGQgVExTIHN1cHBvcnQuCisjCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworCisjIEltcG9ydCBTT0NLUyBtb2R1bGUgaWYgaXQgZXhpc3RzLCBlbHNlIHN0YW5kYXJkIHNvY2tldCBtb2R1bGUgc29ja2V0Cit0cnk6CisgICAgaW1wb3J0IFNPQ0tTOyBzb2NrZXQgPSBTT0NLUzsgZGVsIFNPQ0tTICMgaW1wb3J0IFNPQ0tTIGFzIHNvY2tldAorICAgIGZyb20gc29ja2V0IGltcG9ydCBnZXRmcWRuOyBzb2NrZXQuZ2V0ZnFkbiA9IGdldGZxZG47IGRlbCBnZXRmcWRuCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IHNvY2tldAorZnJvbSBzb2NrZXQgaW1wb3J0IF9HTE9CQUxfREVGQVVMVF9USU1FT1VUCisKK19fYWxsX18gPSBbIkZUUCIsIk5ldHJjIl0KKworIyBNYWdpYyBudW1iZXIgZnJvbSA8c29ja2V0Lmg+CitNU0dfT09CID0gMHgxICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQcm9jZXNzIGRhdGEgb3V0IG9mIGJhbmQKKworCisjIFRoZSBzdGFuZGFyZCBGVFAgc2VydmVyIGNvbnRyb2wgcG9ydAorRlRQX1BPUlQgPSAyMQorCisKKyMgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIG9yIGludmFsaWQgcmVzcG9uc2UgaXMgcmVjZWl2ZWQKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6IHBhc3MKK2NsYXNzIGVycm9yX3JlcGx5KEVycm9yKTogcGFzcyAgICAgICAgICAjIHVuZXhwZWN0ZWQgWzEyM114eCByZXBseQorY2xhc3MgZXJyb3JfdGVtcChFcnJvcik6IHBhc3MgICAgICAgICAgICMgNHh4IGVycm9ycworY2xhc3MgZXJyb3JfcGVybShFcnJvcik6IHBhc3MgICAgICAgICAgICMgNXh4IGVycm9ycworY2xhc3MgZXJyb3JfcHJvdG8oRXJyb3IpOiBwYXNzICAgICAgICAgICMgcmVzcG9uc2UgZG9lcyBub3QgYmVnaW4gd2l0aCBbMS01XQorCisKKyMgQWxsIGV4Y2VwdGlvbnMgKGhvcGVmdWxseSkgdGhhdCBtYXkgYmUgcmFpc2VkIGhlcmUgYW5kIHRoYXQgYXJlbid0CisjIChhbHdheXMpIHByb2dyYW1taW5nIGVycm9ycyBvbiBvdXIgc2lkZQorYWxsX2Vycm9ycyA9IChFcnJvciwgSU9FcnJvciwgRU9GRXJyb3IpCisKKworIyBMaW5lIHRlcm1pbmF0b3JzICh3ZSBhbHdheXMgb3V0cHV0IENSTEYsIGJ1dCBhY2NlcHQgYW55IG9mIENSTEYsIENSLCBMRikKK0NSTEYgPSAnXHJcbicKKworIyBUaGUgY2xhc3MgaXRzZWxmCitjbGFzcyBGVFA6CisKKyAgICAnJydBbiBGVFAgY2xpZW50IGNsYXNzLgorCisgICAgVG8gY3JlYXRlIGEgY29ubmVjdGlvbiwgY2FsbCB0aGUgY2xhc3MgdXNpbmcgdGhlc2UgYXJndW1lbnRzOgorICAgICAgICAgICAgaG9zdCwgdXNlciwgcGFzc3dkLCBhY2N0LCB0aW1lb3V0CisKKyAgICBUaGUgZmlyc3QgZm91ciBhcmd1bWVudHMgYXJlIGFsbCBzdHJpbmdzLCBhbmQgaGF2ZSBkZWZhdWx0IHZhbHVlICcnLgorICAgIHRpbWVvdXQgbXVzdCBiZSBudW1lcmljIGFuZCBkZWZhdWx0cyB0byBOb25lIGlmIG5vdCBwYXNzZWQsCisgICAgbWVhbmluZyB0aGF0IG5vIHRpbWVvdXQgd2lsbCBiZSBzZXQgb24gYW55IGZ0cCBzb2NrZXQocykKKyAgICBJZiBhIHRpbWVvdXQgaXMgcGFzc2VkLCB0aGVuIHRoaXMgaXMgbm93IHRoZSBkZWZhdWx0IHRpbWVvdXQgZm9yIGFsbCBmdHAKKyAgICBzb2NrZXQgb3BlcmF0aW9ucyBmb3IgdGhpcyBpbnN0YW5jZS4KKworICAgIFRoZW4gdXNlIHNlbGYuY29ubmVjdCgpIHdpdGggb3B0aW9uYWwgaG9zdCBhbmQgcG9ydCBhcmd1bWVudC4KKworICAgIFRvIGRvd25sb2FkIGEgZmlsZSwgdXNlIGZ0cC5yZXRybGluZXMoJ1JFVFIgJyArIGZpbGVuYW1lKSwKKyAgICBvciBmdHAucmV0cmJpbmFyeSgpIHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGFyZ3VtZW50cy4KKyAgICBUbyB1cGxvYWQgYSBmaWxlLCB1c2UgZnRwLnN0b3JsaW5lcygpIG9yIGZ0cC5zdG9yYmluYXJ5KCksCisgICAgd2hpY2ggaGF2ZSBhbiBvcGVuIGZpbGUgYXMgYXJndW1lbnQgKHNlZSB0aGVpciBkZWZpbml0aW9ucworICAgIGJlbG93IGZvciBkZXRhaWxzKS4KKyAgICBUaGUgZG93bmxvYWQvdXBsb2FkIGZ1bmN0aW9ucyBmaXJzdCBpc3N1ZSBhcHByb3ByaWF0ZSBUWVBFCisgICAgYW5kIFBPUlQgb3IgUEFTViBjb21tYW5kcy4KKycnJworCisgICAgZGVidWdnaW5nID0gMAorICAgIGhvc3QgPSAnJworICAgIHBvcnQgPSBGVFBfUE9SVAorICAgIHNvY2sgPSBOb25lCisgICAgZmlsZSA9IE5vbmUKKyAgICB3ZWxjb21lID0gTm9uZQorICAgIHBhc3NpdmVzZXJ2ZXIgPSAxCisKKyAgICAjIEluaXRpYWxpemF0aW9uIG1ldGhvZCAoY2FsbGVkIGJ5IGNsYXNzIGluc3RhbnRpYXRpb24pLgorICAgICMgSW5pdGlhbGl6ZSBob3N0IHRvIGxvY2FsaG9zdCwgcG9ydCB0byBzdGFuZGFyZCBmdHAgcG9ydAorICAgICMgT3B0aW9uYWwgYXJndW1lbnRzIGFyZSBob3N0IChmb3IgY29ubmVjdCgpKSwKKyAgICAjIGFuZCB1c2VyLCBwYXNzd2QsIGFjY3QgKGZvciBsb2dpbigpKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCB1c2VyPScnLCBwYXNzd2Q9JycsIGFjY3Q9JycsCisgICAgICAgICAgICAgICAgIHRpbWVvdXQ9X0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQpOgorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIGlmIGhvc3Q6CisgICAgICAgICAgICBzZWxmLmNvbm5lY3QoaG9zdCkKKyAgICAgICAgICAgIGlmIHVzZXI6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dpbih1c2VyLCBwYXNzd2QsIGFjY3QpCisKKyAgICBkZWYgY29ubmVjdChzZWxmLCBob3N0PScnLCBwb3J0PTAsIHRpbWVvdXQ9LTk5OSk6CisgICAgICAgICcnJ0Nvbm5lY3QgdG8gaG9zdC4gIEFyZ3VtZW50cyBhcmU6CisgICAgICAgICAtIGhvc3Q6IGhvc3RuYW1lIHRvIGNvbm5lY3QgdG8gKHN0cmluZywgZGVmYXVsdCBwcmV2aW91cyBob3N0KQorICAgICAgICAgLSBwb3J0OiBwb3J0IHRvIGNvbm5lY3QgdG8gKGludGVnZXIsIGRlZmF1bHQgcHJldmlvdXMgcG9ydCkKKyAgICAgICAgJycnCisgICAgICAgIGlmIGhvc3QgIT0gJyc6CisgICAgICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIGlmIHBvcnQgPiAwOgorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBpZiB0aW1lb3V0ICE9IC05OTk6CisgICAgICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLCBzZWxmLnRpbWVvdXQpCisgICAgICAgIHNlbGYuYWYgPSBzZWxmLnNvY2suZmFtaWx5CisgICAgICAgIHNlbGYuZmlsZSA9IHNlbGYuc29jay5tYWtlZmlsZSgncmInKQorICAgICAgICBzZWxmLndlbGNvbWUgPSBzZWxmLmdldHJlc3AoKQorICAgICAgICByZXR1cm4gc2VsZi53ZWxjb21lCisKKyAgICBkZWYgZ2V0d2VsY29tZShzZWxmKToKKyAgICAgICAgJycnR2V0IHRoZSB3ZWxjb21lIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyLgorICAgICAgICAodGhpcyBpcyByZWFkIGFuZCBzcXVpcnJlbGVkIGF3YXkgYnkgY29ubmVjdCgpKScnJworICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZzoKKyAgICAgICAgICAgIHByaW50ICcqd2VsY29tZSonLCBzZWxmLnNhbml0aXplKHNlbGYud2VsY29tZSkKKyAgICAgICAgcmV0dXJuIHNlbGYud2VsY29tZQorCisgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGxldmVsKToKKyAgICAgICAgJycnU2V0IHRoZSBkZWJ1Z2dpbmcgbGV2ZWwuCisgICAgICAgIFRoZSByZXF1aXJlZCBhcmd1bWVudCBsZXZlbCBtZWFuczoKKyAgICAgICAgMDogbm8gZGVidWdnaW5nIG91dHB1dCAoZGVmYXVsdCkKKyAgICAgICAgMTogcHJpbnQgY29tbWFuZHMgYW5kIHJlc3BvbnNlcyBidXQgbm90IGJvZHkgdGV4dCBldGMuCisgICAgICAgIDI6IGFsc28gcHJpbnQgcmF3IGxpbmVzIHJlYWQgYW5kIHNlbnQgYmVmb3JlIHN0cmlwcGluZyBDUi9MRicnJworICAgICAgICBzZWxmLmRlYnVnZ2luZyA9IGxldmVsCisgICAgZGVidWcgPSBzZXRfZGVidWdsZXZlbAorCisgICAgZGVmIHNldF9wYXN2KHNlbGYsIHZhbCk6CisgICAgICAgICcnJ1VzZSBwYXNzaXZlIG9yIGFjdGl2ZSBtb2RlIGZvciBkYXRhIHRyYW5zZmVycy4KKyAgICAgICAgV2l0aCBhIGZhbHNlIGFyZ3VtZW50LCB1c2UgdGhlIG5vcm1hbCBQT1JUIG1vZGUsCisgICAgICAgIFdpdGggYSB0cnVlIGFyZ3VtZW50LCB1c2UgdGhlIFBBU1YgY29tbWFuZC4nJycKKyAgICAgICAgc2VsZi5wYXNzaXZlc2VydmVyID0gdmFsCisKKyAgICAjIEludGVybmFsOiAic2FuaXRpemUiIGEgc3RyaW5nIGZvciBwcmludGluZworICAgIGRlZiBzYW5pdGl6ZShzZWxmLCBzKToKKyAgICAgICAgaWYgc1s6NV0gPT0gJ3Bhc3MgJyBvciBzWzo1XSA9PSAnUEFTUyAnOgorICAgICAgICAgICAgaSA9IGxlbihzKQorICAgICAgICAgICAgd2hpbGUgaSA+IDUgYW5kIHNbaS0xXSBpbiAnXHJcbic6CisgICAgICAgICAgICAgICAgaSA9IGktMQorICAgICAgICAgICAgcyA9IHNbOjVdICsgJyonKihpLTUpICsgc1tpOl0KKyAgICAgICAgcmV0dXJuIHJlcHIocykKKworICAgICMgSW50ZXJuYWw6IHNlbmQgb25lIGxpbmUgdG8gdGhlIHNlcnZlciwgYXBwZW5kaW5nIENSTEYKKyAgICBkZWYgcHV0bGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgbGluZSA9IGxpbmUgKyBDUkxGCisgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nID4gMTogcHJpbnQgJypwdXQqJywgc2VsZi5zYW5pdGl6ZShsaW5lKQorICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChsaW5lKQorCisgICAgIyBJbnRlcm5hbDogc2VuZCBvbmUgY29tbWFuZCB0byB0aGUgc2VydmVyICh0aHJvdWdoIHB1dGxpbmUoKSkKKyAgICBkZWYgcHV0Y21kKHNlbGYsIGxpbmUpOgorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZzogcHJpbnQgJypjbWQqJywgc2VsZi5zYW5pdGl6ZShsaW5lKQorICAgICAgICBzZWxmLnB1dGxpbmUobGluZSkKKworICAgICMgSW50ZXJuYWw6IHJldHVybiBvbmUgbGluZSBmcm9tIHRoZSBzZXJ2ZXIsIHN0cmlwcGluZyBDUkxGLgorICAgICMgUmFpc2UgRU9GRXJyb3IgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkCisgICAgZGVmIGdldGxpbmUoc2VsZik6CisgICAgICAgIGxpbmUgPSBzZWxmLmZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZyA+IDE6CisgICAgICAgICAgICBwcmludCAnKmdldConLCBzZWxmLnNhbml0aXplKGxpbmUpCisgICAgICAgIGlmIG5vdCBsaW5lOiByYWlzZSBFT0ZFcnJvcgorICAgICAgICBpZiBsaW5lWy0yOl0gPT0gQ1JMRjogbGluZSA9IGxpbmVbOi0yXQorICAgICAgICBlbGlmIGxpbmVbLTE6XSBpbiBDUkxGOiBsaW5lID0gbGluZVs6LTFdCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICAjIEludGVybmFsOiBnZXQgYSByZXNwb25zZSBmcm9tIHRoZSBzZXJ2ZXIsIHdoaWNoIG1heSBwb3NzaWJseQorICAgICMgY29uc2lzdCBvZiBtdWx0aXBsZSBsaW5lcy4gIFJldHVybiBhIHNpbmdsZSBzdHJpbmcgd2l0aCBubworICAgICMgdHJhaWxpbmcgQ1JMRi4gIElmIHRoZSByZXNwb25zZSBjb25zaXN0cyBvZiBtdWx0aXBsZSBsaW5lcywKKyAgICAjIHRoZXNlIGFyZSBzZXBhcmF0ZWQgYnkgJ1xuJyBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcKKyAgICBkZWYgZ2V0bXVsdGlsaW5lKHNlbGYpOgorICAgICAgICBsaW5lID0gc2VsZi5nZXRsaW5lKCkKKyAgICAgICAgaWYgbGluZVszOjRdID09ICctJzoKKyAgICAgICAgICAgIGNvZGUgPSBsaW5lWzozXQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBuZXh0bGluZSA9IHNlbGYuZ2V0bGluZSgpCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAoJ1xuJyArIG5leHRsaW5lKQorICAgICAgICAgICAgICAgIGlmIG5leHRsaW5lWzozXSA9PSBjb2RlIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0bGluZVszOjRdICE9ICctJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgICMgSW50ZXJuYWw6IGdldCBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlci4KKyAgICAjIFJhaXNlIHZhcmlvdXMgZXJyb3JzIGlmIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgYW4gZXJyb3IKKyAgICBkZWYgZ2V0cmVzcChzZWxmKToKKyAgICAgICAgcmVzcCA9IHNlbGYuZ2V0bXVsdGlsaW5lKCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6IHByaW50ICcqcmVzcConLCBzZWxmLnNhbml0aXplKHJlc3ApCisgICAgICAgIHNlbGYubGFzdHJlc3AgPSByZXNwWzozXQorICAgICAgICBjID0gcmVzcFs6MV0KKyAgICAgICAgaWYgYyBpbiAoJzEnLCAnMicsICczJyk6CisgICAgICAgICAgICByZXR1cm4gcmVzcAorICAgICAgICBpZiBjID09ICc0JzoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yX3RlbXAsIHJlc3AKKyAgICAgICAgaWYgYyA9PSAnNSc6CisgICAgICAgICAgICByYWlzZSBlcnJvcl9wZXJtLCByZXNwCisgICAgICAgIHJhaXNlIGVycm9yX3Byb3RvLCByZXNwCisKKyAgICBkZWYgdm9pZHJlc3Aoc2VsZik6CisgICAgICAgICIiIkV4cGVjdCBhIHJlc3BvbnNlIGJlZ2lubmluZyB3aXRoICcyJy4iIiIKKyAgICAgICAgcmVzcCA9IHNlbGYuZ2V0cmVzcCgpCisgICAgICAgIGlmIHJlc3BbOjFdICE9ICcyJzoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yX3JlcGx5LCByZXNwCisgICAgICAgIHJldHVybiByZXNwCisKKyAgICBkZWYgYWJvcnQoc2VsZik6CisgICAgICAgICcnJ0Fib3J0IGEgZmlsZSB0cmFuc2Zlci4gIFVzZXMgb3V0LW9mLWJhbmQgZGF0YS4KKyAgICAgICAgVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIHByb2NlZHVyZSBmcm9tIHRoZSBSRkMgdG8gc2VuZCBUZWxuZXQKKyAgICAgICAgSVAgYW5kIFN5bmNoOyB0aGF0IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIHdpdGggdGhlIHNlcnZlcnMgSSd2ZQorICAgICAgICB0cmllZC4gIEluc3RlYWQsIGp1c3Qgc2VuZCB0aGUgQUJPUiBjb21tYW5kIGFzIE9PQiBkYXRhLicnJworICAgICAgICBsaW5lID0gJ0FCT1InICsgQ1JMRgorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZyA+IDE6IHByaW50ICcqcHV0IHVyZ2VudConLCBzZWxmLnNhbml0aXplKGxpbmUpCisgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKGxpbmUsIE1TR19PT0IpCisgICAgICAgIHJlc3AgPSBzZWxmLmdldG11bHRpbGluZSgpCisgICAgICAgIGlmIHJlc3BbOjNdIG5vdCBpbiAoJzQyNicsICcyMjUnLCAnMjI2Jyk6CisgICAgICAgICAgICByYWlzZSBlcnJvcl9wcm90bywgcmVzcAorCisgICAgZGVmIHNlbmRjbWQoc2VsZiwgY21kKToKKyAgICAgICAgJycnU2VuZCBhIGNvbW1hbmQgYW5kIHJldHVybiB0aGUgcmVzcG9uc2UuJycnCisgICAgICAgIHNlbGYucHV0Y21kKGNtZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVzcCgpCisKKyAgICBkZWYgdm9pZGNtZChzZWxmLCBjbWQpOgorICAgICAgICAiIiJTZW5kIGEgY29tbWFuZCBhbmQgZXhwZWN0IGEgcmVzcG9uc2UgYmVnaW5uaW5nIHdpdGggJzInLiIiIgorICAgICAgICBzZWxmLnB1dGNtZChjbWQpCisgICAgICAgIHJldHVybiBzZWxmLnZvaWRyZXNwKCkKKworICAgIGRlZiBzZW5kcG9ydChzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgJycnU2VuZCBhIFBPUlQgY29tbWFuZCB3aXRoIHRoZSBjdXJyZW50IGhvc3QgYW5kIHRoZSBnaXZlbgorICAgICAgICBwb3J0IG51bWJlci4KKyAgICAgICAgJycnCisgICAgICAgIGhieXRlcyA9IGhvc3Quc3BsaXQoJy4nKQorICAgICAgICBwYnl0ZXMgPSBbcmVwcihwb3J0Ly8yNTYpLCByZXByKHBvcnQlMjU2KV0KKyAgICAgICAgYnl0ZXMgPSBoYnl0ZXMgKyBwYnl0ZXMKKyAgICAgICAgY21kID0gJ1BPUlQgJyArICcsJy5qb2luKGJ5dGVzKQorICAgICAgICByZXR1cm4gc2VsZi52b2lkY21kKGNtZCkKKworICAgIGRlZiBzZW5kZXBydChzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgJycnU2VuZCBhIEVQUlQgY29tbWFuZCB3aXRoIHRoZSBjdXJyZW50IGhvc3QgYW5kIHRoZSBnaXZlbiBwb3J0IG51bWJlci4nJycKKyAgICAgICAgYWYgPSAwCisgICAgICAgIGlmIHNlbGYuYWYgPT0gc29ja2V0LkFGX0lORVQ6CisgICAgICAgICAgICBhZiA9IDEKKyAgICAgICAgaWYgc2VsZi5hZiA9PSBzb2NrZXQuQUZfSU5FVDY6CisgICAgICAgICAgICBhZiA9IDIKKyAgICAgICAgaWYgYWYgPT0gMDoKKyAgICAgICAgICAgIHJhaXNlIGVycm9yX3Byb3RvLCAndW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHknCisgICAgICAgIGZpZWxkcyA9IFsnJywgcmVwcihhZiksIGhvc3QsIHJlcHIocG9ydCksICcnXQorICAgICAgICBjbWQgPSAnRVBSVCAnICsgJ3wnLmpvaW4oZmllbGRzKQorICAgICAgICByZXR1cm4gc2VsZi52b2lkY21kKGNtZCkKKworICAgIGRlZiBtYWtlcG9ydChzZWxmKToKKyAgICAgICAgJycnQ3JlYXRlIGEgbmV3IHNvY2tldCBhbmQgc2VuZCBhIFBPUlQgY29tbWFuZCBmb3IgaXQuJycnCisgICAgICAgIGVyciA9IE5vbmUKKyAgICAgICAgc29jayA9IE5vbmUKKyAgICAgICAgZm9yIHJlcyBpbiBzb2NrZXQuZ2V0YWRkcmluZm8oTm9uZSwgMCwgc2VsZi5hZiwgc29ja2V0LlNPQ0tfU1RSRUFNLCAwLCBzb2NrZXQuQUlfUEFTU0lWRSk6CisgICAgICAgICAgICBhZiwgc29ja3R5cGUsIHByb3RvLCBjYW5vbm5hbWUsIHNhID0gcmVzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoYWYsIHNvY2t0eXBlLCBwcm90bykKKyAgICAgICAgICAgICAgICBzb2NrLmJpbmQoc2EpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgaWYgc29jazoKKyAgICAgICAgICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgICAgICAgICAgc29jayA9IE5vbmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgc29jayBpcyBOb25lOgorICAgICAgICAgICAgaWYgZXJyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoImdldGFkZHJpbmZvIHJldHVybnMgYW4gZW1wdHkgbGlzdCIpCisgICAgICAgIHNvY2subGlzdGVuKDEpCisgICAgICAgIHBvcnQgPSBzb2NrLmdldHNvY2tuYW1lKClbMV0gIyBHZXQgcHJvcGVyIHBvcnQKKyAgICAgICAgaG9zdCA9IHNlbGYuc29jay5nZXRzb2NrbmFtZSgpWzBdICMgR2V0IHByb3BlciBob3N0CisgICAgICAgIGlmIHNlbGYuYWYgPT0gc29ja2V0LkFGX0lORVQ6CisgICAgICAgICAgICByZXNwID0gc2VsZi5zZW5kcG9ydChob3N0LCBwb3J0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGVwcnQoaG9zdCwgcG9ydCkKKyAgICAgICAgaWYgc2VsZi50aW1lb3V0IGlzIG5vdCBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVDoKKyAgICAgICAgICAgIHNvY2suc2V0dGltZW91dChzZWxmLnRpbWVvdXQpCisgICAgICAgIHJldHVybiBzb2NrCisKKyAgICBkZWYgbWFrZXBhc3Yoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYWYgPT0gc29ja2V0LkFGX0lORVQ6CisgICAgICAgICAgICBob3N0LCBwb3J0ID0gcGFyc2UyMjcoc2VsZi5zZW5kY21kKCdQQVNWJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBob3N0LCBwb3J0ID0gcGFyc2UyMjkoc2VsZi5zZW5kY21kKCdFUFNWJyksIHNlbGYuc29jay5nZXRwZWVybmFtZSgpKQorICAgICAgICByZXR1cm4gaG9zdCwgcG9ydAorCisgICAgZGVmIG50cmFuc2ZlcmNtZChzZWxmLCBjbWQsIHJlc3Q9Tm9uZSk6CisgICAgICAgICIiIkluaXRpYXRlIGEgdHJhbnNmZXIgb3ZlciB0aGUgZGF0YSBjb25uZWN0aW9uLgorCisgICAgICAgIElmIHRoZSB0cmFuc2ZlciBpcyBhY3RpdmUsIHNlbmQgYSBwb3J0IGNvbW1hbmQgYW5kIHRoZQorICAgICAgICB0cmFuc2ZlciBjb21tYW5kLCBhbmQgYWNjZXB0IHRoZSBjb25uZWN0aW9uLiAgSWYgdGhlIHNlcnZlciBpcworICAgICAgICBwYXNzaXZlLCBzZW5kIGEgcGFzdiBjb21tYW5kLCBjb25uZWN0IHRvIGl0LCBhbmQgc3RhcnQgdGhlCisgICAgICAgIHRyYW5zZmVyIGNvbW1hbmQuICBFaXRoZXIgd2F5LCByZXR1cm4gdGhlIHNvY2tldCBmb3IgdGhlCisgICAgICAgIGNvbm5lY3Rpb24gYW5kIHRoZSBleHBlY3RlZCBzaXplIG9mIHRoZSB0cmFuc2Zlci4gIFRoZQorICAgICAgICBleHBlY3RlZCBzaXplIG1heSBiZSBOb25lIGlmIGl0IGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLgorCisgICAgICAgIE9wdGlvbmFsIGByZXN0JyBhcmd1bWVudCBjYW4gYmUgYSBzdHJpbmcgdGhhdCBpcyBzZW50IGFzIHRoZQorICAgICAgICBhcmd1bWVudCB0byBhIFJFU1QgY29tbWFuZC4gIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBzZXJ2ZXIKKyAgICAgICAgbWFya2VyIHVzZWQgdG8gdGVsbCB0aGUgc2VydmVyIHRvIHNraXAgb3ZlciBhbnkgZGF0YSB1cCB0byB0aGUKKyAgICAgICAgZ2l2ZW4gbWFya2VyLgorICAgICAgICAiIiIKKyAgICAgICAgc2l6ZSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5wYXNzaXZlc2VydmVyOgorICAgICAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYubWFrZXBhc3YoKQorICAgICAgICAgICAgY29ubiA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCksIHNlbGYudGltZW91dCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiByZXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNlbmRjbWQoIlJFU1QgJXMiICUgcmVzdCkKKyAgICAgICAgICAgICAgICByZXNwID0gc2VsZi5zZW5kY21kKGNtZCkKKyAgICAgICAgICAgICAgICAjIFNvbWUgc2VydmVycyBhcHBhcmVudGx5IHNlbmQgYSAyMDAgcmVwbHkgdG8KKyAgICAgICAgICAgICAgICAjIGEgTElTVCBvciBTVE9SIGNvbW1hbmQsIGJlZm9yZSB0aGUgMTUwIHJlcGx5CisgICAgICAgICAgICAgICAgIyAoYW5kIHdheSBiZWZvcmUgdGhlIDIyNiByZXBseSkuIFRoaXMgc2VlbXMgdG8KKyAgICAgICAgICAgICAgICAjIGJlIGluIHZpb2xhdGlvbiBvZiB0aGUgcHJvdG9jb2wgKHdoaWNoIG9ubHkgYWxsb3dzCisgICAgICAgICAgICAgICAgIyAxeHggb3IgZXJyb3IgbWVzc2FnZXMgZm9yIExJU1QpLCBzbyB3ZSBqdXN0IGRpc2NhcmQKKyAgICAgICAgICAgICAgICAjIHRoaXMgcmVzcG9uc2UuCisgICAgICAgICAgICAgICAgaWYgcmVzcFswXSA9PSAnMic6CisgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLmdldHJlc3AoKQorICAgICAgICAgICAgICAgIGlmIHJlc3BbMF0gIT0gJzEnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcl9yZXBseSwgcmVzcAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzb2NrID0gc2VsZi5tYWtlcG9ydCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgcmVzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kY21kKCJSRVNUICVzIiAlIHJlc3QpCisgICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZChjbWQpCisgICAgICAgICAgICAgICAgIyBTZWUgYWJvdmUuCisgICAgICAgICAgICAgICAgaWYgcmVzcFswXSA9PSAnMic6CisgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBzZWxmLmdldHJlc3AoKQorICAgICAgICAgICAgICAgIGlmIHJlc3BbMF0gIT0gJzEnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcl9yZXBseSwgcmVzcAorICAgICAgICAgICAgICAgIGNvbm4sIHNvY2thZGRyID0gc29jay5hY2NlcHQoKQorICAgICAgICAgICAgICAgIGlmIHNlbGYudGltZW91dCBpcyBub3QgX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQ6CisgICAgICAgICAgICAgICAgICAgIGNvbm4uc2V0dGltZW91dChzZWxmLnRpbWVvdXQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICBpZiByZXNwWzozXSA9PSAnMTUwJzoKKyAgICAgICAgICAgICMgdGhpcyBpcyBjb25kaXRpb25hbCBpbiBjYXNlIHdlIHJlY2VpdmVkIGEgMTI1CisgICAgICAgICAgICBzaXplID0gcGFyc2UxNTAocmVzcCkKKyAgICAgICAgcmV0dXJuIGNvbm4sIHNpemUKKworICAgIGRlZiB0cmFuc2ZlcmNtZChzZWxmLCBjbWQsIHJlc3Q9Tm9uZSk6CisgICAgICAgICIiIkxpa2UgbnRyYW5zZmVyY21kKCkgYnV0IHJldHVybnMgb25seSB0aGUgc29ja2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5udHJhbnNmZXJjbWQoY21kLCByZXN0KVswXQorCisgICAgZGVmIGxvZ2luKHNlbGYsIHVzZXIgPSAnJywgcGFzc3dkID0gJycsIGFjY3QgPSAnJyk6CisgICAgICAgICcnJ0xvZ2luLCBkZWZhdWx0IGFub255bW91cy4nJycKKyAgICAgICAgaWYgbm90IHVzZXI6IHVzZXIgPSAnYW5vbnltb3VzJworICAgICAgICBpZiBub3QgcGFzc3dkOiBwYXNzd2QgPSAnJworICAgICAgICBpZiBub3QgYWNjdDogYWNjdCA9ICcnCisgICAgICAgIGlmIHVzZXIgPT0gJ2Fub255bW91cycgYW5kIHBhc3N3ZCBpbiAoJycsICctJyk6CisgICAgICAgICAgICAjIElmIHRoZXJlIGlzIG5vIGFub255bW91cyBmdHAgcGFzc3dvcmQgc3BlY2lmaWVkCisgICAgICAgICAgICAjIHRoZW4gd2UnbGwganVzdCB1c2UgYW5vbnltb3VzQAorICAgICAgICAgICAgIyBXZSBkb24ndCBzZW5kIGFueSBvdGhlciB0aGluZyBiZWNhdXNlOgorICAgICAgICAgICAgIyAtIFdlIHdhbnQgdG8gcmVtYWluIGFub255bW91cworICAgICAgICAgICAgIyAtIFdlIHdhbnQgdG8gc3RvcCBTUEFNCisgICAgICAgICAgICAjIC0gV2UgZG9uJ3Qgd2FudCB0byBsZXQgZnRwIHNpdGVzIHRvIGRpc2NyaW1pbmF0ZSBieSB0aGUgdXNlciwKKyAgICAgICAgICAgICMgICBob3N0IG9yIGNvdW50cnkuCisgICAgICAgICAgICBwYXNzd2QgPSBwYXNzd2QgKyAnYW5vbnltb3VzQCcKKyAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZCgnVVNFUiAnICsgdXNlcikKKyAgICAgICAgaWYgcmVzcFswXSA9PSAnMyc6IHJlc3AgPSBzZWxmLnNlbmRjbWQoJ1BBU1MgJyArIHBhc3N3ZCkKKyAgICAgICAgaWYgcmVzcFswXSA9PSAnMyc6IHJlc3AgPSBzZWxmLnNlbmRjbWQoJ0FDQ1QgJyArIGFjY3QpCisgICAgICAgIGlmIHJlc3BbMF0gIT0gJzInOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKyAgICAgICAgcmV0dXJuIHJlc3AKKworICAgIGRlZiByZXRyYmluYXJ5KHNlbGYsIGNtZCwgY2FsbGJhY2ssIGJsb2Nrc2l6ZT04MTkyLCByZXN0PU5vbmUpOgorICAgICAgICAiIiJSZXRyaWV2ZSBkYXRhIGluIGJpbmFyeSBtb2RlLiAgQSBuZXcgcG9ydCBpcyBjcmVhdGVkIGZvciB5b3UuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICBjbWQ6IEEgUkVUUiBjb21tYW5kLgorICAgICAgICAgIGNhbGxiYWNrOiBBIHNpbmdsZSBwYXJhbWV0ZXIgY2FsbGFibGUgdG8gYmUgY2FsbGVkIG9uIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgYmxvY2sgb2YgZGF0YSByZWFkLgorICAgICAgICAgIGJsb2Nrc2l6ZTogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIHNvY2tldCBhdCBvbmUgdGltZS4gIFtkZWZhdWx0OiA4MTkyXQorICAgICAgICAgIHJlc3Q6IFBhc3NlZCB0byB0cmFuc2ZlcmNtZCgpLiAgW2RlZmF1bHQ6IE5vbmVdCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBUaGUgcmVzcG9uc2UgY29kZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudm9pZGNtZCgnVFlQRSBJJykKKyAgICAgICAgY29ubiA9IHNlbGYudHJhbnNmZXJjbWQoY21kLCByZXN0KQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZGF0YSA9IGNvbm4ucmVjdihibG9ja3NpemUpCisgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2FsbGJhY2soZGF0YSkKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIHJldHVybiBzZWxmLnZvaWRyZXNwKCkKKworICAgIGRlZiByZXRybGluZXMoc2VsZiwgY21kLCBjYWxsYmFjayA9IE5vbmUpOgorICAgICAgICAiIiJSZXRyaWV2ZSBkYXRhIGluIGxpbmUgbW9kZS4gIEEgbmV3IHBvcnQgaXMgY3JlYXRlZCBmb3IgeW91LgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgY21kOiBBIFJFVFIsIExJU1QsIE5MU1QsIG9yIE1MU0QgY29tbWFuZC4KKyAgICAgICAgICBjYWxsYmFjazogQW4gb3B0aW9uYWwgc2luZ2xlIHBhcmFtZXRlciBjYWxsYWJsZSB0aGF0IGlzIGNhbGxlZAorICAgICAgICAgICAgICAgICAgICBmb3IgZWFjaCBsaW5lIHdpdGggdGhlIHRyYWlsaW5nIENSTEYgc3RyaXBwZWQuCisgICAgICAgICAgICAgICAgICAgIFtkZWZhdWx0OiBwcmludF9saW5lKCldCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBUaGUgcmVzcG9uc2UgY29kZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGNhbGxiYWNrIGlzIE5vbmU6IGNhbGxiYWNrID0gcHJpbnRfbGluZQorICAgICAgICByZXNwID0gc2VsZi5zZW5kY21kKCdUWVBFIEEnKQorICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQpCisgICAgICAgIGZwID0gY29ubi5tYWtlZmlsZSgncmInKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nID4gMjogcHJpbnQgJypyZXRyKicsIHJlcHIobGluZSkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWy0yOl0gPT0gQ1JMRjoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgICAgICBlbGlmIGxpbmVbLTE6XSA9PSAnXG4nOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgIGNhbGxiYWNrKGxpbmUpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIHJldHVybiBzZWxmLnZvaWRyZXNwKCkKKworICAgIGRlZiBzdG9yYmluYXJ5KHNlbGYsIGNtZCwgZnAsIGJsb2Nrc2l6ZT04MTkyLCBjYWxsYmFjaz1Ob25lLCByZXN0PU5vbmUpOgorICAgICAgICAiIiJTdG9yZSBhIGZpbGUgaW4gYmluYXJ5IG1vZGUuICBBIG5ldyBwb3J0IGlzIGNyZWF0ZWQgZm9yIHlvdS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgIGNtZDogQSBTVE9SIGNvbW1hbmQuCisgICAgICAgICAgZnA6IEEgZmlsZS1saWtlIG9iamVjdCB3aXRoIGEgcmVhZChudW1fYnl0ZXMpIG1ldGhvZC4KKyAgICAgICAgICBibG9ja3NpemU6IFRoZSBtYXhpbXVtIGRhdGEgc2l6ZSB0byByZWFkIGZyb20gZnAgYW5kIHNlbmQgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgdGhlIGNvbm5lY3Rpb24gYXQgb25jZS4gIFtkZWZhdWx0OiA4MTkyXQorICAgICAgICAgIGNhbGxiYWNrOiBBbiBvcHRpb25hbCBzaW5nbGUgcGFyYW1ldGVyIGNhbGxhYmxlIHRoYXQgaXMgY2FsbGVkIG9uCisgICAgICAgICAgICAgICAgICAgIGVhY2ggYmxvY2sgb2YgZGF0YSBhZnRlciBpdCBpcyBzZW50LiAgW2RlZmF1bHQ6IE5vbmVdCisgICAgICAgICAgcmVzdDogUGFzc2VkIHRvIHRyYW5zZmVyY21kKCkuICBbZGVmYXVsdDogTm9uZV0KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIFRoZSByZXNwb25zZSBjb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi52b2lkY21kKCdUWVBFIEknKQorICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQsIHJlc3QpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBidWYgPSBmcC5yZWFkKGJsb2Nrc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6IGJyZWFrCisgICAgICAgICAgICBjb25uLnNlbmRhbGwoYnVmKQorICAgICAgICAgICAgaWYgY2FsbGJhY2s6IGNhbGxiYWNrKGJ1ZikKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIHJldHVybiBzZWxmLnZvaWRyZXNwKCkKKworICAgIGRlZiBzdG9ybGluZXMoc2VsZiwgY21kLCBmcCwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgICIiIlN0b3JlIGEgZmlsZSBpbiBsaW5lIG1vZGUuICBBIG5ldyBwb3J0IGlzIGNyZWF0ZWQgZm9yIHlvdS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgIGNtZDogQSBTVE9SIGNvbW1hbmQuCisgICAgICAgICAgZnA6IEEgZmlsZS1saWtlIG9iamVjdCB3aXRoIGEgcmVhZGxpbmUoKSBtZXRob2QuCisgICAgICAgICAgY2FsbGJhY2s6IEFuIG9wdGlvbmFsIHNpbmdsZSBwYXJhbWV0ZXIgY2FsbGFibGUgdGhhdCBpcyBjYWxsZWQgb24KKyAgICAgICAgICAgICAgICAgICAgZWFjaCBsaW5lIGFmdGVyIGl0IGlzIHNlbnQuICBbZGVmYXVsdDogTm9uZV0KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIFRoZSByZXNwb25zZSBjb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi52b2lkY21kKCdUWVBFIEEnKQorICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBidWYgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgYnVmOiBicmVhaworICAgICAgICAgICAgaWYgYnVmWy0yOl0gIT0gQ1JMRjoKKyAgICAgICAgICAgICAgICBpZiBidWZbLTFdIGluIENSTEY6IGJ1ZiA9IGJ1Zls6LTFdCisgICAgICAgICAgICAgICAgYnVmID0gYnVmICsgQ1JMRgorICAgICAgICAgICAgY29ubi5zZW5kYWxsKGJ1ZikKKyAgICAgICAgICAgIGlmIGNhbGxiYWNrOiBjYWxsYmFjayhidWYpCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICBkZWYgYWNjdChzZWxmLCBwYXNzd29yZCk6CisgICAgICAgICcnJ1NlbmQgbmV3IGFjY291bnQgbmFtZS4nJycKKyAgICAgICAgY21kID0gJ0FDQ1QgJyArIHBhc3N3b3JkCisgICAgICAgIHJldHVybiBzZWxmLnZvaWRjbWQoY21kKQorCisgICAgZGVmIG5sc3Qoc2VsZiwgKmFyZ3MpOgorICAgICAgICAnJydSZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGluIGEgZ2l2ZW4gZGlyZWN0b3J5IChkZWZhdWx0IHRoZSBjdXJyZW50KS4nJycKKyAgICAgICAgY21kID0gJ05MU1QnCisgICAgICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgIGNtZCA9IGNtZCArICgnICcgKyBhcmcpCisgICAgICAgIGZpbGVzID0gW10KKyAgICAgICAgc2VsZi5yZXRybGluZXMoY21kLCBmaWxlcy5hcHBlbmQpCisgICAgICAgIHJldHVybiBmaWxlcworCisgICAgZGVmIGRpcihzZWxmLCAqYXJncyk6CisgICAgICAgICcnJ0xpc3QgYSBkaXJlY3RvcnkgaW4gbG9uZyBmb3JtLgorICAgICAgICBCeSBkZWZhdWx0IGxpc3QgY3VycmVudCBkaXJlY3RvcnkgdG8gc3Rkb3V0LgorICAgICAgICBPcHRpb25hbCBsYXN0IGFyZ3VtZW50IGlzIGNhbGxiYWNrIGZ1bmN0aW9uOyBhbGwKKyAgICAgICAgbm9uLWVtcHR5IGFyZ3VtZW50cyBiZWZvcmUgaXQgYXJlIGNvbmNhdGVuYXRlZCB0byB0aGUKKyAgICAgICAgTElTVCBjb21tYW5kLiAgKFRoaXMgKnNob3VsZCogb25seSBiZSB1c2VkIGZvciBhIHBhdGhuYW1lLiknJycKKyAgICAgICAgY21kID0gJ0xJU1QnCisgICAgICAgIGZ1bmMgPSBOb25lCisgICAgICAgIGlmIGFyZ3NbLTE6XSBhbmQgdHlwZShhcmdzWy0xXSkgIT0gdHlwZSgnJyk6CisgICAgICAgICAgICBhcmdzLCBmdW5jID0gYXJnc1s6LTFdLCBhcmdzWy0xXQorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICAgICAgY21kID0gY21kICsgKCcgJyArIGFyZykKKyAgICAgICAgc2VsZi5yZXRybGluZXMoY21kLCBmdW5jKQorCisgICAgZGVmIHJlbmFtZShzZWxmLCBmcm9tbmFtZSwgdG9uYW1lKToKKyAgICAgICAgJycnUmVuYW1lIGEgZmlsZS4nJycKKyAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZCgnUk5GUiAnICsgZnJvbW5hbWUpCisgICAgICAgIGlmIHJlc3BbMF0gIT0gJzMnOgorICAgICAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKyAgICAgICAgcmV0dXJuIHNlbGYudm9pZGNtZCgnUk5UTyAnICsgdG9uYW1lKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICcnJ0RlbGV0ZSBhIGZpbGUuJycnCisgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRjbWQoJ0RFTEUgJyArIGZpbGVuYW1lKQorICAgICAgICBpZiByZXNwWzozXSBpbiAoJzI1MCcsICcyMDAnKToKKyAgICAgICAgICAgIHJldHVybiByZXNwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBlcnJvcl9yZXBseSwgcmVzcAorCisgICAgZGVmIGN3ZChzZWxmLCBkaXJuYW1lKToKKyAgICAgICAgJycnQ2hhbmdlIHRvIGEgZGlyZWN0b3J5LicnJworICAgICAgICBpZiBkaXJuYW1lID09ICcuLic6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudm9pZGNtZCgnQ0RVUCcpCisgICAgICAgICAgICBleGNlcHQgZXJyb3JfcGVybSwgbXNnOgorICAgICAgICAgICAgICAgIGlmIG1zZy5hcmdzWzBdWzozXSAhPSAnNTAwJzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxpZiBkaXJuYW1lID09ICcnOgorICAgICAgICAgICAgZGlybmFtZSA9ICcuJyAgIyBkb2VzIG5vdGhpbmcsIGJ1dCBjb3VsZCByZXR1cm4gZXJyb3IKKyAgICAgICAgY21kID0gJ0NXRCAnICsgZGlybmFtZQorICAgICAgICByZXR1cm4gc2VsZi52b2lkY21kKGNtZCkKKworICAgIGRlZiBzaXplKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgJycnUmV0cmlldmUgdGhlIHNpemUgb2YgYSBmaWxlLicnJworICAgICAgICAjIFRoZSBTSVpFIGNvbW1hbmQgaXMgZGVmaW5lZCBpbiBSRkMtMzY1OQorICAgICAgICByZXNwID0gc2VsZi5zZW5kY21kKCdTSVpFICcgKyBmaWxlbmFtZSkKKyAgICAgICAgaWYgcmVzcFs6M10gPT0gJzIxMyc6CisgICAgICAgICAgICBzID0gcmVzcFszOl0uc3RyaXAoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQocykKKyAgICAgICAgICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvbmcocykKKworICAgIGRlZiBta2Qoc2VsZiwgZGlybmFtZSk6CisgICAgICAgICcnJ01ha2UgYSBkaXJlY3RvcnksIHJldHVybiBpdHMgZnVsbCBwYXRobmFtZS4nJycKKyAgICAgICAgcmVzcCA9IHNlbGYuc2VuZGNtZCgnTUtEICcgKyBkaXJuYW1lKQorICAgICAgICByZXR1cm4gcGFyc2UyNTcocmVzcCkKKworICAgIGRlZiBybWQoc2VsZiwgZGlybmFtZSk6CisgICAgICAgICcnJ1JlbW92ZSBhIGRpcmVjdG9yeS4nJycKKyAgICAgICAgcmV0dXJuIHNlbGYudm9pZGNtZCgnUk1EICcgKyBkaXJuYW1lKQorCisgICAgZGVmIHB3ZChzZWxmKToKKyAgICAgICAgJycnUmV0dXJuIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuJycnCisgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRjbWQoJ1BXRCcpCisgICAgICAgIHJldHVybiBwYXJzZTI1NyhyZXNwKQorCisgICAgZGVmIHF1aXQoc2VsZik6CisgICAgICAgICcnJ1F1aXQsIGFuZCBjbG9zZSB0aGUgY29ubmVjdGlvbi4nJycKKyAgICAgICAgcmVzcCA9IHNlbGYudm9pZGNtZCgnUVVJVCcpCisgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gcmVzcAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAnJydDbG9zZSB0aGUgY29ubmVjdGlvbiB3aXRob3V0IGFzc3VtaW5nIGFueXRoaW5nIGFib3V0IGl0LicnJworICAgICAgICBpZiBzZWxmLmZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLnNvY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLnNvY2sgPSBOb25lCisKK3RyeToKKyAgICBpbXBvcnQgc3NsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBGVFBfVExTKEZUUCk6CisgICAgICAgICcnJ0EgRlRQIHN1YmNsYXNzIHdoaWNoIGFkZHMgVExTIHN1cHBvcnQgdG8gRlRQIGFzIGRlc2NyaWJlZAorICAgICAgICBpbiBSRkMtNDIxNy4KKworICAgICAgICBDb25uZWN0IGFzIHVzdWFsIHRvIHBvcnQgMjEgaW1wbGljaXRseSBzZWN1cmluZyB0aGUgRlRQIGNvbnRyb2wKKyAgICAgICAgY29ubmVjdGlvbiBiZWZvcmUgYXV0aGVudGljYXRpbmcuCisKKyAgICAgICAgU2VjdXJpbmcgdGhlIGRhdGEgY29ubmVjdGlvbiByZXF1aXJlcyB1c2VyIHRvIGV4cGxpY2l0bHkgYXNrCisgICAgICAgIGZvciBpdCBieSBjYWxsaW5nIHByb3RfcCgpIG1ldGhvZC4KKworICAgICAgICBVc2FnZSBleGFtcGxlOgorICAgICAgICA+Pj4gZnJvbSBmdHBsaWIgaW1wb3J0IEZUUF9UTFMKKyAgICAgICAgPj4+IGZ0cHMgPSBGVFBfVExTKCdmdHAucHl0aG9uLm9yZycpCisgICAgICAgID4+PiBmdHBzLmxvZ2luKCkgICMgbG9naW4gYW5vbnltb3VzbHkgcHJldmlvdXNseSBzZWN1cmluZyBjb250cm9sIGNoYW5uZWwKKyAgICAgICAgJzIzMCBHdWVzdCBsb2dpbiBvaywgYWNjZXNzIHJlc3RyaWN0aW9ucyBhcHBseS4nCisgICAgICAgID4+PiBmdHBzLnByb3RfcCgpICAjIHN3aXRjaCB0byBzZWN1cmUgZGF0YSBjb25uZWN0aW9uCisgICAgICAgICcyMDAgUHJvdGVjdGlvbiBsZXZlbCBzZXQgdG8gUCcKKyAgICAgICAgPj4+IGZ0cHMucmV0cmxpbmVzKCdMSVNUJykgICMgbGlzdCBkaXJlY3RvcnkgY29udGVudCBzZWN1cmVseQorICAgICAgICB0b3RhbCA5CisgICAgICAgIGRyd3hyLXhyLXggICA4IHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IEphbiAgMyAgMTk5NCAuCisgICAgICAgIGRyd3hyLXhyLXggICA4IHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IEphbiAgMyAgMTk5NCAuLgorICAgICAgICBkcnd4ci14ci14ICAgMiByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBKYW4gIDMgIDE5OTQgYmluCisgICAgICAgIGRyd3hyLXhyLXggICAyIHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IEphbiAgMyAgMTk5NCBldGMKKyAgICAgICAgZC13eHJ3eHIteCAgIDIgZnRwICAgICAgd2hlZWwgICAgICAgIDEwMjQgU2VwICA1IDEzOjQzIGluY29taW5nCisgICAgICAgIGRyd3hyLXhyLXggICAyIHJvb3QgICAgIHdoZWVsICAgICAgICAxMDI0IE5vdiAxNyAgMTk5MyBsaWIKKyAgICAgICAgZHJ3eHIteHIteCAgIDYgMTA5NCAgICAgd2hlZWwgICAgICAgIDEwMjQgU2VwIDEzIDE5OjA3IHB1YgorICAgICAgICBkcnd4ci14ci14ICAgMyByb290ICAgICB3aGVlbCAgICAgICAgMTAyNCBKYW4gIDMgIDE5OTQgdXNyCisgICAgICAgIC1ydy1yLS1yLS0gICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgMzEyIEF1ZyAgMSAgMTk5NCB3ZWxjb21lLm1zZworICAgICAgICAnMjI2IFRyYW5zZmVyIGNvbXBsZXRlLicKKyAgICAgICAgPj4+IGZ0cHMucXVpdCgpCisgICAgICAgICcyMjEgR29vZGJ5ZS4nCisgICAgICAgID4+PgorICAgICAgICAnJycKKyAgICAgICAgc3NsX3ZlcnNpb24gPSBzc2wuUFJPVE9DT0xfVExTdjEKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgdXNlcj0nJywgcGFzc3dkPScnLCBhY2N0PScnLCBrZXlmaWxlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1Ob25lLCB0aW1lb3V0PV9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleWZpbGUKKyAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorICAgICAgICAgICAgc2VsZi5fcHJvdF9wID0gRmFsc2UKKyAgICAgICAgICAgIEZUUC5fX2luaXRfXyhzZWxmLCBob3N0LCB1c2VyLCBwYXNzd2QsIGFjY3QsIHRpbWVvdXQpCisKKyAgICAgICAgZGVmIGxvZ2luKHNlbGYsIHVzZXI9JycsIHBhc3N3ZD0nJywgYWNjdD0nJywgc2VjdXJlPVRydWUpOgorICAgICAgICAgICAgaWYgc2VjdXJlIGFuZCBub3QgaXNpbnN0YW5jZShzZWxmLnNvY2ssIHNzbC5TU0xTb2NrZXQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXV0aCgpCisgICAgICAgICAgICByZXR1cm4gRlRQLmxvZ2luKHNlbGYsIHVzZXIsIHBhc3N3ZCwgYWNjdCkKKworICAgICAgICBkZWYgYXV0aChzZWxmKToKKyAgICAgICAgICAgICcnJ1NldCB1cCBzZWN1cmUgY29udHJvbCBjb25uZWN0aW9uIGJ5IHVzaW5nIFRMUy9TU0wuJycnCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuc29jaywgc3NsLlNTTFNvY2tldCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQWxyZWFkeSB1c2luZyBUTFMiKQorICAgICAgICAgICAgaWYgc2VsZi5zc2xfdmVyc2lvbiA9PSBzc2wuUFJPVE9DT0xfVExTdjE6CisgICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYudm9pZGNtZCgnQVVUSCBUTFMnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXNwID0gc2VsZi52b2lkY21kKCdBVVRIIFNTTCcpCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoc2VsZi5zb2NrLCBzZWxmLmtleWZpbGUsIHNlbGYuY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c2VsZi5zc2xfdmVyc2lvbikKKyAgICAgICAgICAgIHNlbGYuZmlsZSA9IHNlbGYuc29jay5tYWtlZmlsZShtb2RlPSdyYicpCisgICAgICAgICAgICByZXR1cm4gcmVzcAorCisgICAgICAgIGRlZiBwcm90X3Aoc2VsZik6CisgICAgICAgICAgICAnJydTZXQgdXAgc2VjdXJlIGRhdGEgY29ubmVjdGlvbi4nJycKKyAgICAgICAgICAgICMgUFJPVCBkZWZpbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBkYXRhIGNoYW5uZWwgaXMgdG8gYmUgcHJvdGVjdGVkLgorICAgICAgICAgICAgIyBUaG91Z2ggUkZDLTIyMjggZGVmaW5lcyBmb3VyIHBvc3NpYmxlIHByb3RlY3Rpb24gbGV2ZWxzLAorICAgICAgICAgICAgIyBSRkMtNDIxNyBvbmx5IHJlY29tbWVuZHMgdHdvLCBDbGVhciBhbmQgUHJpdmF0ZS4KKyAgICAgICAgICAgICMgQ2xlYXIgKFBST1QgQykgbWVhbnMgdGhhdCBubyBzZWN1cml0eSBpcyB0byBiZSB1c2VkIG9uIHRoZQorICAgICAgICAgICAgIyBkYXRhLWNoYW5uZWwsIFByaXZhdGUgKFBST1QgUCkgbWVhbnMgdGhhdCB0aGUgZGF0YS1jaGFubmVsCisgICAgICAgICAgICAjIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgVExTLgorICAgICAgICAgICAgIyBQQlNaIGNvbW1hbmQgTVVTVCBzdGlsbCBiZSBpc3N1ZWQsIGJ1dCBtdXN0IGhhdmUgYSBwYXJhbWV0ZXIgb2YKKyAgICAgICAgICAgICMgJzAnIHRvIGluZGljYXRlIHRoYXQgbm8gYnVmZmVyaW5nIGlzIHRha2luZyBwbGFjZSBhbmQgdGhlIGRhdGEKKyAgICAgICAgICAgICMgY29ubmVjdGlvbiBzaG91bGQgbm90IGJlIGVuY2Fwc3VsYXRlZC4KKyAgICAgICAgICAgIHNlbGYudm9pZGNtZCgnUEJTWiAwJykKKyAgICAgICAgICAgIHJlc3AgPSBzZWxmLnZvaWRjbWQoJ1BST1QgUCcpCisgICAgICAgICAgICBzZWxmLl9wcm90X3AgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gcmVzcAorCisgICAgICAgIGRlZiBwcm90X2Moc2VsZik6CisgICAgICAgICAgICAnJydTZXQgdXAgY2xlYXIgdGV4dCBkYXRhIGNvbm5lY3Rpb24uJycnCisgICAgICAgICAgICByZXNwID0gc2VsZi52b2lkY21kKCdQUk9UIEMnKQorICAgICAgICAgICAgc2VsZi5fcHJvdF9wID0gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiByZXNwCisKKyAgICAgICAgIyAtLS0gT3ZlcnJpZGRlbiBGVFAgbWV0aG9kcworCisgICAgICAgIGRlZiBudHJhbnNmZXJjbWQoc2VsZiwgY21kLCByZXN0PU5vbmUpOgorICAgICAgICAgICAgY29ubiwgc2l6ZSA9IEZUUC5udHJhbnNmZXJjbWQoc2VsZiwgY21kLCByZXN0KQorICAgICAgICAgICAgaWYgc2VsZi5fcHJvdF9wOgorICAgICAgICAgICAgICAgIGNvbm4gPSBzc2wud3JhcF9zb2NrZXQoY29ubiwgc2VsZi5rZXlmaWxlLCBzZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c2VsZi5zc2xfdmVyc2lvbikKKyAgICAgICAgICAgIHJldHVybiBjb25uLCBzaXplCisKKyAgICAgICAgZGVmIHJldHJiaW5hcnkoc2VsZiwgY21kLCBjYWxsYmFjaywgYmxvY2tzaXplPTgxOTIsIHJlc3Q9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLnZvaWRjbWQoJ1RZUEUgSScpCisgICAgICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQsIHJlc3QpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGNvbm4ucmVjdihibG9ja3NpemUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSkKKyAgICAgICAgICAgICAgICAjIHNodXRkb3duIHNzbCBsYXllcgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY29ubiwgc3NsLlNTTFNvY2tldCk6CisgICAgICAgICAgICAgICAgICAgIGNvbm4udW53cmFwKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICAgICAgZGVmIHJldHJsaW5lcyhzZWxmLCBjbWQsIGNhbGxiYWNrID0gTm9uZSk6CisgICAgICAgICAgICBpZiBjYWxsYmFjayBpcyBOb25lOiBjYWxsYmFjayA9IHByaW50X2xpbmUKKyAgICAgICAgICAgIHJlc3AgPSBzZWxmLnNlbmRjbWQoJ1RZUEUgQScpCisgICAgICAgICAgICBjb25uID0gc2VsZi50cmFuc2ZlcmNtZChjbWQpCisgICAgICAgICAgICBmcCA9IGNvbm4ubWFrZWZpbGUoJ3JiJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZyA+IDI6IHByaW50ICcqcmV0cionLCByZXByKGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVstMjpdID09IENSTEY6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTJdCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZVstMTpdID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGxpbmUpCisgICAgICAgICAgICAgICAgIyBzaHV0ZG93biBzc2wgbGF5ZXIKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbm4sIHNzbC5TU0xTb2NrZXQpOgorICAgICAgICAgICAgICAgICAgICBjb25uLnVud3JhcCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZvaWRyZXNwKCkKKworICAgICAgICBkZWYgc3RvcmJpbmFyeShzZWxmLCBjbWQsIGZwLCBibG9ja3NpemU9ODE5MiwgY2FsbGJhY2s9Tm9uZSwgcmVzdD1Ob25lKToKKyAgICAgICAgICAgIHNlbGYudm9pZGNtZCgnVFlQRSBJJykKKyAgICAgICAgICAgIGNvbm4gPSBzZWxmLnRyYW5zZmVyY21kKGNtZCwgcmVzdCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBidWYgPSBmcC5yZWFkKGJsb2Nrc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgY29ubi5zZW5kYWxsKGJ1ZikKKyAgICAgICAgICAgICAgICAgICAgaWYgY2FsbGJhY2s6IGNhbGxiYWNrKGJ1ZikKKyAgICAgICAgICAgICAgICAjIHNodXRkb3duIHNzbCBsYXllcgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY29ubiwgc3NsLlNTTFNvY2tldCk6CisgICAgICAgICAgICAgICAgICAgIGNvbm4udW53cmFwKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi52b2lkcmVzcCgpCisKKyAgICAgICAgZGVmIHN0b3JsaW5lcyhzZWxmLCBjbWQsIGZwLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgICAgIHNlbGYudm9pZGNtZCgnVFlQRSBBJykKKyAgICAgICAgICAgIGNvbm4gPSBzZWxmLnRyYW5zZmVyY21kKGNtZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBidWYgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBidWY6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGlmIGJ1ZlstMjpdICE9IENSTEY6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBidWZbLTFdIGluIENSTEY6IGJ1ZiA9IGJ1Zls6LTFdCisgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSBidWYgKyBDUkxGCisgICAgICAgICAgICAgICAgICAgIGNvbm4uc2VuZGFsbChidWYpCisgICAgICAgICAgICAgICAgICAgIGlmIGNhbGxiYWNrOiBjYWxsYmFjayhidWYpCisgICAgICAgICAgICAgICAgIyBzaHV0ZG93biBzc2wgbGF5ZXIKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbm4sIHNzbC5TU0xTb2NrZXQpOgorICAgICAgICAgICAgICAgICAgICBjb25uLnVud3JhcCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudm9pZHJlc3AoKQorCisgICAgX19hbGxfXy5hcHBlbmQoJ0ZUUF9UTFMnKQorICAgIGFsbF9lcnJvcnMgPSAoRXJyb3IsIElPRXJyb3IsIEVPRkVycm9yLCBzc2wuU1NMRXJyb3IpCisKKworXzE1MF9yZSA9IE5vbmUKKworZGVmIHBhcnNlMTUwKHJlc3ApOgorICAgICcnJ1BhcnNlIHRoZSAnMTUwJyByZXNwb25zZSBmb3IgYSBSRVRSIHJlcXVlc3QuCisgICAgUmV0dXJucyB0aGUgZXhwZWN0ZWQgdHJhbnNmZXIgc2l6ZSBvciBOb25lOyBzaXplIGlzIG5vdCBndWFyYW50ZWVkIHRvCisgICAgYmUgcHJlc2VudCBpbiB0aGUgMTUwIG1lc3NhZ2UuCisgICAgJycnCisgICAgaWYgcmVzcFs6M10gIT0gJzE1MCc6CisgICAgICAgIHJhaXNlIGVycm9yX3JlcGx5LCByZXNwCisgICAgZ2xvYmFsIF8xNTBfcmUKKyAgICBpZiBfMTUwX3JlIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfMTUwX3JlID0gcmUuY29tcGlsZSgiMTUwIC4qIFwoKFxkKykgYnl0ZXNcKSIsIHJlLklHTk9SRUNBU0UpCisgICAgbSA9IF8xNTBfcmUubWF0Y2gocmVzcCkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBzID0gbS5ncm91cCgxKQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGludChzKQorICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgIHJldHVybiBsb25nKHMpCisKKworXzIyN19yZSA9IE5vbmUKKworZGVmIHBhcnNlMjI3KHJlc3ApOgorICAgICcnJ1BhcnNlIHRoZSAnMjI3JyByZXNwb25zZSBmb3IgYSBQQVNWIHJlcXVlc3QuCisgICAgUmFpc2VzIGVycm9yX3Byb3RvIGlmIGl0IGRvZXMgbm90IGNvbnRhaW4gJyhoMSxoMixoMyxoNCxwMSxwMiknCisgICAgUmV0dXJuICgnaG9zdC5hZGRyLmFzLm51bWJlcnMnLCBwb3J0IykgdHVwbGUuJycnCisKKyAgICBpZiByZXNwWzozXSAhPSAnMjI3JzoKKyAgICAgICAgcmFpc2UgZXJyb3JfcmVwbHksIHJlc3AKKyAgICBnbG9iYWwgXzIyN19yZQorICAgIGlmIF8yMjdfcmUgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIF8yMjdfcmUgPSByZS5jb21waWxlKHInKFxkKyksKFxkKyksKFxkKyksKFxkKyksKFxkKyksKFxkKyknKQorICAgIG0gPSBfMjI3X3JlLnNlYXJjaChyZXNwKQorICAgIGlmIG5vdCBtOgorICAgICAgICByYWlzZSBlcnJvcl9wcm90bywgcmVzcAorICAgIG51bWJlcnMgPSBtLmdyb3VwcygpCisgICAgaG9zdCA9ICcuJy5qb2luKG51bWJlcnNbOjRdKQorICAgIHBvcnQgPSAoaW50KG51bWJlcnNbNF0pIDw8IDgpICsgaW50KG51bWJlcnNbNV0pCisgICAgcmV0dXJuIGhvc3QsIHBvcnQKKworCitkZWYgcGFyc2UyMjkocmVzcCwgcGVlcik6CisgICAgJycnUGFyc2UgdGhlICcyMjknIHJlc3BvbnNlIGZvciBhIEVQU1YgcmVxdWVzdC4KKyAgICBSYWlzZXMgZXJyb3JfcHJvdG8gaWYgaXQgZG9lcyBub3QgY29udGFpbiAnKHx8fHBvcnR8KScKKyAgICBSZXR1cm4gKCdob3N0LmFkZHIuYXMubnVtYmVycycsIHBvcnQjKSB0dXBsZS4nJycKKworICAgIGlmIHJlc3BbOjNdICE9ICcyMjknOgorICAgICAgICByYWlzZSBlcnJvcl9yZXBseSwgcmVzcAorICAgIGxlZnQgPSByZXNwLmZpbmQoJygnKQorICAgIGlmIGxlZnQgPCAwOiByYWlzZSBlcnJvcl9wcm90bywgcmVzcAorICAgIHJpZ2h0ID0gcmVzcC5maW5kKCcpJywgbGVmdCArIDEpCisgICAgaWYgcmlnaHQgPCAwOgorICAgICAgICByYWlzZSBlcnJvcl9wcm90bywgcmVzcCAjIHNob3VsZCBjb250YWluICcofHx8cG9ydHwpJworICAgIGlmIHJlc3BbbGVmdCArIDFdICE9IHJlc3BbcmlnaHQgLSAxXToKKyAgICAgICAgcmFpc2UgZXJyb3JfcHJvdG8sIHJlc3AKKyAgICBwYXJ0cyA9IHJlc3BbbGVmdCArIDE6cmlnaHRdLnNwbGl0KHJlc3BbbGVmdCsxXSkKKyAgICBpZiBsZW4ocGFydHMpICE9IDU6CisgICAgICAgIHJhaXNlIGVycm9yX3Byb3RvLCByZXNwCisgICAgaG9zdCA9IHBlZXJbMF0KKyAgICBwb3J0ID0gaW50KHBhcnRzWzNdKQorICAgIHJldHVybiBob3N0LCBwb3J0CisKKworZGVmIHBhcnNlMjU3KHJlc3ApOgorICAgICcnJ1BhcnNlIHRoZSAnMjU3JyByZXNwb25zZSBmb3IgYSBNS0Qgb3IgUFdEIHJlcXVlc3QuCisgICAgVGhpcyBpcyBhIHJlc3BvbnNlIHRvIGEgTUtEIG9yIFBXRCByZXF1ZXN0OiBhIGRpcmVjdG9yeSBuYW1lLgorICAgIFJldHVybnMgdGhlIGRpcmVjdG9yeW5hbWUgaW4gdGhlIDI1NyByZXBseS4nJycKKworICAgIGlmIHJlc3BbOjNdICE9ICcyNTcnOgorICAgICAgICByYWlzZSBlcnJvcl9yZXBseSwgcmVzcAorICAgIGlmIHJlc3BbMzo1XSAhPSAnICInOgorICAgICAgICByZXR1cm4gJycgIyBOb3QgY29tcGxpYW50IHRvIFJGQyA5NTksIGJ1dCBVTklYIGZ0cGQgZG9lcyB0aGlzCisgICAgZGlybmFtZSA9ICcnCisgICAgaSA9IDUKKyAgICBuID0gbGVuKHJlc3ApCisgICAgd2hpbGUgaSA8IG46CisgICAgICAgIGMgPSByZXNwW2ldCisgICAgICAgIGkgPSBpKzEKKyAgICAgICAgaWYgYyA9PSAnIic6CisgICAgICAgICAgICBpZiBpID49IG4gb3IgcmVzcFtpXSAhPSAnIic6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgZGlybmFtZSA9IGRpcm5hbWUgKyBjCisgICAgcmV0dXJuIGRpcm5hbWUKKworCitkZWYgcHJpbnRfbGluZShsaW5lKToKKyAgICAnJydEZWZhdWx0IHJldHJsaW5lcyBjYWxsYmFjayB0byBwcmludCBhIGxpbmUuJycnCisgICAgcHJpbnQgbGluZQorCisKK2RlZiBmdHBjcChzb3VyY2UsIHNvdXJjZW5hbWUsIHRhcmdldCwgdGFyZ2V0bmFtZSA9ICcnLCB0eXBlID0gJ0knKToKKyAgICAnJydDb3B5IGZpbGUgZnJvbSBvbmUgRlRQLWluc3RhbmNlIHRvIGFub3RoZXIuJycnCisgICAgaWYgbm90IHRhcmdldG5hbWU6IHRhcmdldG5hbWUgPSBzb3VyY2VuYW1lCisgICAgdHlwZSA9ICdUWVBFICcgKyB0eXBlCisgICAgc291cmNlLnZvaWRjbWQodHlwZSkKKyAgICB0YXJnZXQudm9pZGNtZCh0eXBlKQorICAgIHNvdXJjZWhvc3QsIHNvdXJjZXBvcnQgPSBwYXJzZTIyNyhzb3VyY2Uuc2VuZGNtZCgnUEFTVicpKQorICAgIHRhcmdldC5zZW5kcG9ydChzb3VyY2Vob3N0LCBzb3VyY2Vwb3J0KQorICAgICMgUkZDIDk1OTogdGhlIHVzZXIgbXVzdCAibGlzdGVuIiBbLi4uXSBCRUZPUkUgc2VuZGluZyB0aGUKKyAgICAjIHRyYW5zZmVyIHJlcXVlc3QuCisgICAgIyBTbzogU1RPUiBiZWZvcmUgUkVUUiwgYmVjYXVzZSBoZXJlIHRoZSB0YXJnZXQgaXMgYSAidXNlciIuCisgICAgdHJlcGx5ID0gdGFyZ2V0LnNlbmRjbWQoJ1NUT1IgJyArIHRhcmdldG5hbWUpCisgICAgaWYgdHJlcGx5WzozXSBub3QgaW4gKCcxMjUnLCAnMTUwJyk6IHJhaXNlIGVycm9yX3Byb3RvICAjIFJGQyA5NTkKKyAgICBzcmVwbHkgPSBzb3VyY2Uuc2VuZGNtZCgnUkVUUiAnICsgc291cmNlbmFtZSkKKyAgICBpZiBzcmVwbHlbOjNdIG5vdCBpbiAoJzEyNScsICcxNTAnKTogcmFpc2UgZXJyb3JfcHJvdG8gICMgUkZDIDk1OQorICAgIHNvdXJjZS52b2lkcmVzcCgpCisgICAgdGFyZ2V0LnZvaWRyZXNwKCkKKworCitjbGFzcyBOZXRyYzoKKyAgICAiIiJDbGFzcyB0byBwYXJzZSAmIHByb3ZpZGUgYWNjZXNzIHRvICduZXRyYycgZm9ybWF0IGZpbGVzLgorCisgICAgU2VlIHRoZSBuZXRyYyg0KSBtYW4gcGFnZSBmb3IgaW5mb3JtYXRpb24gb24gdGhlIGZpbGUgZm9ybWF0LgorCisgICAgV0FSTklORzogVGhpcyBjbGFzcyBpcyBvYnNvbGV0ZSAtLSB1c2UgbW9kdWxlIG5ldHJjIGluc3RlYWQuCisKKyAgICAiIiIKKyAgICBfX2RlZnVzZXIgPSBOb25lCisgICAgX19kZWZwYXNzd2QgPSBOb25lCisgICAgX19kZWZhY2N0ID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgaWYgIkhPTUUiIGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsiSE9NRSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIubmV0cmMiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgInNwZWNpZnkgZmlsZSB0byBsb2FkIG9yIHNldCAkSE9NRSIKKyAgICAgICAgc2VsZi5fX2hvc3RzID0ge30KKyAgICAgICAgc2VsZi5fX21hY3JvcyA9IHt9CisgICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgInIiKQorICAgICAgICBpbl9tYWNybyA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgIGlmIGluX21hY3JvIGFuZCBsaW5lLnN0cmlwKCk6CisgICAgICAgICAgICAgICAgbWFjcm9fbGluZXMuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgaW5fbWFjcm86CisgICAgICAgICAgICAgICAgc2VsZi5fX21hY3Jvc1ttYWNyb19uYW1lXSA9IHR1cGxlKG1hY3JvX2xpbmVzKQorICAgICAgICAgICAgICAgIGluX21hY3JvID0gMAorICAgICAgICAgICAgd29yZHMgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgICAgIGhvc3QgPSB1c2VyID0gcGFzc3dkID0gYWNjdCA9IE5vbmUKKyAgICAgICAgICAgIGRlZmF1bHQgPSAwCisgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgd2hpbGUgaSA8IGxlbih3b3Jkcyk6CisgICAgICAgICAgICAgICAgdzEgPSB3b3Jkc1tpXQorICAgICAgICAgICAgICAgIGlmIGkrMSA8IGxlbih3b3Jkcyk6CisgICAgICAgICAgICAgICAgICAgIHcyID0gd29yZHNbaSArIDFdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdzIgPSBOb25lCisgICAgICAgICAgICAgICAgaWYgdzEgPT0gJ2RlZmF1bHQnOgorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0ID0gMQorICAgICAgICAgICAgICAgIGVsaWYgdzEgPT0gJ21hY2hpbmUnIGFuZCB3MjoKKyAgICAgICAgICAgICAgICAgICAgaG9zdCA9IHcyLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICAgICAgZWxpZiB3MSA9PSAnbG9naW4nIGFuZCB3MjoKKyAgICAgICAgICAgICAgICAgICAgdXNlciA9IHcyCisgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgIGVsaWYgdzEgPT0gJ3Bhc3N3b3JkJyBhbmQgdzI6CisgICAgICAgICAgICAgICAgICAgIHBhc3N3ZCA9IHcyCisgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgIGVsaWYgdzEgPT0gJ2FjY291bnQnIGFuZCB3MjoKKyAgICAgICAgICAgICAgICAgICAgYWNjdCA9IHcyCisgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgIGVsaWYgdzEgPT0gJ21hY2RlZicgYW5kIHcyOgorICAgICAgICAgICAgICAgICAgICBtYWNyb19uYW1lID0gdzIKKyAgICAgICAgICAgICAgICAgICAgbWFjcm9fbGluZXMgPSBbXQorICAgICAgICAgICAgICAgICAgICBpbl9tYWNybyA9IDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgICAgIGlmIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc2VsZi5fX2RlZnVzZXIgPSB1c2VyIG9yIHNlbGYuX19kZWZ1c2VyCisgICAgICAgICAgICAgICAgc2VsZi5fX2RlZnBhc3N3ZCA9IHBhc3N3ZCBvciBzZWxmLl9fZGVmcGFzc3dkCisgICAgICAgICAgICAgICAgc2VsZi5fX2RlZmFjY3QgPSBhY2N0IG9yIHNlbGYuX19kZWZhY2N0CisgICAgICAgICAgICBpZiBob3N0OgorICAgICAgICAgICAgICAgIGlmIGhvc3QgaW4gc2VsZi5fX2hvc3RzOgorICAgICAgICAgICAgICAgICAgICBvdXNlciwgb3Bhc3N3ZCwgb2FjY3QgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9faG9zdHNbaG9zdF0KKyAgICAgICAgICAgICAgICAgICAgdXNlciA9IHVzZXIgb3Igb3VzZXIKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dkID0gcGFzc3dkIG9yIG9wYXNzd2QKKyAgICAgICAgICAgICAgICAgICAgYWNjdCA9IGFjY3Qgb3Igb2FjY3QKKyAgICAgICAgICAgICAgICBzZWxmLl9faG9zdHNbaG9zdF0gPSB1c2VyLCBwYXNzd2QsIGFjY3QKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIGdldF9ob3N0cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBob3N0cyBtZW50aW9uZWQgaW4gdGhlIC5uZXRyYyBmaWxlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX2hvc3RzLmtleXMoKQorCisgICAgZGVmIGdldF9hY2NvdW50KHNlbGYsIGhvc3QpOgorICAgICAgICAiIiJSZXR1cm5zIGxvZ2luIGluZm9ybWF0aW9uIGZvciB0aGUgbmFtZWQgaG9zdC4KKworICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgdHJpcGxlIGNvbnRhaW5pbmcgdXNlcmlkLAorICAgICAgICBwYXNzd29yZCwgYW5kIHRoZSBhY2NvdW50aW5nIGZpZWxkLgorCisgICAgICAgICIiIgorICAgICAgICBob3N0ID0gaG9zdC5sb3dlcigpCisgICAgICAgIHVzZXIgPSBwYXNzd2QgPSBhY2N0ID0gTm9uZQorICAgICAgICBpZiBob3N0IGluIHNlbGYuX19ob3N0czoKKyAgICAgICAgICAgIHVzZXIsIHBhc3N3ZCwgYWNjdCA9IHNlbGYuX19ob3N0c1tob3N0XQorICAgICAgICB1c2VyID0gdXNlciBvciBzZWxmLl9fZGVmdXNlcgorICAgICAgICBwYXNzd2QgPSBwYXNzd2Qgb3Igc2VsZi5fX2RlZnBhc3N3ZAorICAgICAgICBhY2N0ID0gYWNjdCBvciBzZWxmLl9fZGVmYWNjdAorICAgICAgICByZXR1cm4gdXNlciwgcGFzc3dkLCBhY2N0CisKKyAgICBkZWYgZ2V0X21hY3JvcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgZGVmaW5lZCBtYWNybyBuYW1lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19tYWNyb3Mua2V5cygpCisKKyAgICBkZWYgZ2V0X21hY3JvKHNlbGYsIG1hY3JvKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc2VxdWVuY2Ugb2YgbGluZXMgd2hpY2ggZGVmaW5lIGEgbmFtZWQgbWFjcm8uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fbWFjcm9zW21hY3JvXQorCisKKworZGVmIHRlc3QoKToKKyAgICAnJydUZXN0IHByb2dyYW0uCisgICAgVXNhZ2U6IGZ0cCBbLWRdIFstcltmaWxlXV0gaG9zdCBbLWxbZGlyXV0gWy1kW2Rpcl1dIFstcF0gW2ZpbGVdIC4uLgorCisgICAgLWQgZGlyCisgICAgLWwgbGlzdAorICAgIC1wIHBhc3N3b3JkCisgICAgJycnCisKKyAgICBpZiBsZW4oc3lzLmFyZ3YpIDwgMjoKKyAgICAgICAgcHJpbnQgdGVzdC5fX2RvY19fCisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICBkZWJ1Z2dpbmcgPSAwCisgICAgcmNmaWxlID0gTm9uZQorICAgIHdoaWxlIHN5cy5hcmd2WzFdID09ICctZCc6CisgICAgICAgIGRlYnVnZ2luZyA9IGRlYnVnZ2luZysxCisgICAgICAgIGRlbCBzeXMuYXJndlsxXQorICAgIGlmIHN5cy5hcmd2WzFdWzoyXSA9PSAnLXInOgorICAgICAgICAjIGdldCBuYW1lIG9mIGFsdGVybmF0ZSB+Ly5uZXRyYyBmaWxlOgorICAgICAgICByY2ZpbGUgPSBzeXMuYXJndlsxXVsyOl0KKyAgICAgICAgZGVsIHN5cy5hcmd2WzFdCisgICAgaG9zdCA9IHN5cy5hcmd2WzFdCisgICAgZnRwID0gRlRQKGhvc3QpCisgICAgZnRwLnNldF9kZWJ1Z2xldmVsKGRlYnVnZ2luZykKKyAgICB1c2VyaWQgPSBwYXNzd2QgPSBhY2N0ID0gJycKKyAgICB0cnk6CisgICAgICAgIG5ldHJjID0gTmV0cmMocmNmaWxlKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBpZiByY2ZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJDb3VsZCBub3Qgb3BlbiBhY2NvdW50IGZpbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLS0gdXNpbmcgYW5vbnltb3VzIGxvZ2luLiIpCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXNlcmlkLCBwYXNzd2QsIGFjY3QgPSBuZXRyYy5nZXRfYWNjb3VudChob3N0KQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAjIG5vIGFjY291bnQgZm9yIGhvc3QKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICJObyBhY2NvdW50IC0tIHVzaW5nIGFub255bW91cyBsb2dpbi4iKQorICAgIGZ0cC5sb2dpbih1c2VyaWQsIHBhc3N3ZCwgYWNjdCkKKyAgICBmb3IgZmlsZSBpbiBzeXMuYXJndlsyOl06CisgICAgICAgIGlmIGZpbGVbOjJdID09ICctbCc6CisgICAgICAgICAgICBmdHAuZGlyKGZpbGVbMjpdKQorICAgICAgICBlbGlmIGZpbGVbOjJdID09ICctZCc6CisgICAgICAgICAgICBjbWQgPSAnQ1dEJworICAgICAgICAgICAgaWYgZmlsZVsyOl06IGNtZCA9IGNtZCArICcgJyArIGZpbGVbMjpdCisgICAgICAgICAgICByZXNwID0gZnRwLnNlbmRjbWQoY21kKQorICAgICAgICBlbGlmIGZpbGUgPT0gJy1wJzoKKyAgICAgICAgICAgIGZ0cC5zZXRfcGFzdihub3QgZnRwLnBhc3NpdmVzZXJ2ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmdHAucmV0cmJpbmFyeSgnUkVUUiAnICsgZmlsZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSwgMTAyNCkKKyAgICBmdHAucXVpdCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZnRwbGliLnB5YyBiL2xpYi9weXRob24yLjcvZnRwbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGExNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mdHBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZnRwbGliLnB5byBiL2xpYi9weXRob24yLjcvZnRwbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGExNzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9mdHBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvZnVuY3Rvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy9mdW5jdG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2ODBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZnVuY3Rvb2xzLnB5CkBAIC0wLDAgKzEsMTAwIEBACisiIiJmdW5jdG9vbHMucHkgLSBUb29scyBmb3Igd29ya2luZyB3aXRoIGZ1bmN0aW9ucyBhbmQgY2FsbGFibGUgb2JqZWN0cworIiIiCisjIFB5dGhvbiBtb2R1bGUgd3JhcHBlciBmb3IgX2Z1bmN0b29scyBDIG1vZHVsZQorIyB0byBhbGxvdyB1dGlsaXRpZXMgd3JpdHRlbiBpbiBQeXRob24gdG8gYmUgYWRkZWQKKyMgdG8gdGhlIGZ1bmN0b29scyBtb2R1bGUuCisjIFdyaXR0ZW4gYnkgTmljayBDb2dobGFuIDxuY29naGxhbiBhdCBnbWFpbC5jb20+CisjICAgQ29weXJpZ2h0IChDKSAyMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorIyBTZWUgQyBzb3VyY2UgY29kZSBmb3IgX2Z1bmN0b29scyBjcmVkaXRzL2NvcHlyaWdodAorCitmcm9tIF9mdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwsIHJlZHVjZQorCisjIHVwZGF0ZV93cmFwcGVyKCkgYW5kIHdyYXBzKCkgYXJlIHRvb2xzIHRvIGhlbHAgd3JpdGUKKyMgd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBjYW4gaGFuZGxlIG5haXZlIGludHJvc3BlY3Rpb24KKworV1JBUFBFUl9BU1NJR05NRU5UUyA9ICgnX19tb2R1bGVfXycsICdfX25hbWVfXycsICdfX2RvY19fJykKK1dSQVBQRVJfVVBEQVRFUyA9ICgnX19kaWN0X18nLCkKK2RlZiB1cGRhdGVfd3JhcHBlcih3cmFwcGVyLAorICAgICAgICAgICAgICAgICAgIHdyYXBwZWQsCisgICAgICAgICAgICAgICAgICAgYXNzaWduZWQgPSBXUkFQUEVSX0FTU0lHTk1FTlRTLAorICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSBXUkFQUEVSX1VQREFURVMpOgorICAgICIiIlVwZGF0ZSBhIHdyYXBwZXIgZnVuY3Rpb24gdG8gbG9vayBsaWtlIHRoZSB3cmFwcGVkIGZ1bmN0aW9uCisKKyAgICAgICB3cmFwcGVyIGlzIHRoZSBmdW5jdGlvbiB0byBiZSB1cGRhdGVkCisgICAgICAgd3JhcHBlZCBpcyB0aGUgb3JpZ2luYWwgZnVuY3Rpb24KKyAgICAgICBhc3NpZ25lZCBpcyBhIHR1cGxlIG5hbWluZyB0aGUgYXR0cmlidXRlcyBhc3NpZ25lZCBkaXJlY3RseQorICAgICAgIGZyb20gdGhlIHdyYXBwZWQgZnVuY3Rpb24gdG8gdGhlIHdyYXBwZXIgZnVuY3Rpb24gKGRlZmF1bHRzIHRvCisgICAgICAgZnVuY3Rvb2xzLldSQVBQRVJfQVNTSUdOTUVOVFMpCisgICAgICAgdXBkYXRlZCBpcyBhIHR1cGxlIG5hbWluZyB0aGUgYXR0cmlidXRlcyBvZiB0aGUgd3JhcHBlciB0aGF0CisgICAgICAgYXJlIHVwZGF0ZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUgZnJvbSB0aGUgd3JhcHBlZAorICAgICAgIGZ1bmN0aW9uIChkZWZhdWx0cyB0byBmdW5jdG9vbHMuV1JBUFBFUl9VUERBVEVTKQorICAgICIiIgorICAgIGZvciBhdHRyIGluIGFzc2lnbmVkOgorICAgICAgICBzZXRhdHRyKHdyYXBwZXIsIGF0dHIsIGdldGF0dHIod3JhcHBlZCwgYXR0cikpCisgICAgZm9yIGF0dHIgaW4gdXBkYXRlZDoKKyAgICAgICAgZ2V0YXR0cih3cmFwcGVyLCBhdHRyKS51cGRhdGUoZ2V0YXR0cih3cmFwcGVkLCBhdHRyLCB7fSkpCisgICAgIyBSZXR1cm4gdGhlIHdyYXBwZXIgc28gdGhpcyBjYW4gYmUgdXNlZCBhcyBhIGRlY29yYXRvciB2aWEgcGFydGlhbCgpCisgICAgcmV0dXJuIHdyYXBwZXIKKworZGVmIHdyYXBzKHdyYXBwZWQsCisgICAgICAgICAgYXNzaWduZWQgPSBXUkFQUEVSX0FTU0lHTk1FTlRTLAorICAgICAgICAgIHVwZGF0ZWQgPSBXUkFQUEVSX1VQREFURVMpOgorICAgICIiIkRlY29yYXRvciBmYWN0b3J5IHRvIGFwcGx5IHVwZGF0ZV93cmFwcGVyKCkgdG8gYSB3cmFwcGVyIGZ1bmN0aW9uCisKKyAgICAgICBSZXR1cm5zIGEgZGVjb3JhdG9yIHRoYXQgaW52b2tlcyB1cGRhdGVfd3JhcHBlcigpIHdpdGggdGhlIGRlY29yYXRlZAorICAgICAgIGZ1bmN0aW9uIGFzIHRoZSB3cmFwcGVyIGFyZ3VtZW50IGFuZCB0aGUgYXJndW1lbnRzIHRvIHdyYXBzKCkgYXMgdGhlCisgICAgICAgcmVtYWluaW5nIGFyZ3VtZW50cy4gRGVmYXVsdCBhcmd1bWVudHMgYXJlIGFzIGZvciB1cGRhdGVfd3JhcHBlcigpLgorICAgICAgIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0byBzaW1wbGlmeSBhcHBseWluZyBwYXJ0aWFsKCkgdG8KKyAgICAgICB1cGRhdGVfd3JhcHBlcigpLgorICAgICIiIgorICAgIHJldHVybiBwYXJ0aWFsKHVwZGF0ZV93cmFwcGVyLCB3cmFwcGVkPXdyYXBwZWQsCisgICAgICAgICAgICAgICAgICAgYXNzaWduZWQ9YXNzaWduZWQsIHVwZGF0ZWQ9dXBkYXRlZCkKKworZGVmIHRvdGFsX29yZGVyaW5nKGNscyk6CisgICAgIiIiQ2xhc3MgZGVjb3JhdG9yIHRoYXQgZmlsbHMgaW4gbWlzc2luZyBvcmRlcmluZyBtZXRob2RzIiIiCisgICAgY29udmVydCA9IHsKKyAgICAgICAgJ19fbHRfXyc6IFsoJ19fZ3RfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogbm90IChzZWxmIDwgb3RoZXIgb3Igc2VsZiA9PSBvdGhlcikpLAorICAgICAgICAgICAgICAgICAgICgnX19sZV9fJywgbGFtYmRhIHNlbGYsIG90aGVyOiBzZWxmIDwgb3RoZXIgb3Igc2VsZiA9PSBvdGhlciksCisgICAgICAgICAgICAgICAgICAgKCdfX2dlX18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IG5vdCBzZWxmIDwgb3RoZXIpXSwKKyAgICAgICAgJ19fbGVfXyc6IFsoJ19fZ2VfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogbm90IHNlbGYgPD0gb3RoZXIgb3Igc2VsZiA9PSBvdGhlciksCisgICAgICAgICAgICAgICAgICAgKCdfX2x0X18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IHNlbGYgPD0gb3RoZXIgYW5kIG5vdCBzZWxmID09IG90aGVyKSwKKyAgICAgICAgICAgICAgICAgICAoJ19fZ3RfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogbm90IHNlbGYgPD0gb3RoZXIpXSwKKyAgICAgICAgJ19fZ3RfXyc6IFsoJ19fbHRfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogbm90IChzZWxmID4gb3RoZXIgb3Igc2VsZiA9PSBvdGhlcikpLAorICAgICAgICAgICAgICAgICAgICgnX19nZV9fJywgbGFtYmRhIHNlbGYsIG90aGVyOiBzZWxmID4gb3RoZXIgb3Igc2VsZiA9PSBvdGhlciksCisgICAgICAgICAgICAgICAgICAgKCdfX2xlX18nLCBsYW1iZGEgc2VsZiwgb3RoZXI6IG5vdCBzZWxmID4gb3RoZXIpXSwKKyAgICAgICAgJ19fZ2VfXyc6IFsoJ19fbGVfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogKG5vdCBzZWxmID49IG90aGVyKSBvciBzZWxmID09IG90aGVyKSwKKyAgICAgICAgICAgICAgICAgICAoJ19fZ3RfXycsIGxhbWJkYSBzZWxmLCBvdGhlcjogc2VsZiA+PSBvdGhlciBhbmQgbm90IHNlbGYgPT0gb3RoZXIpLAorICAgICAgICAgICAgICAgICAgICgnX19sdF9fJywgbGFtYmRhIHNlbGYsIG90aGVyOiBub3Qgc2VsZiA+PSBvdGhlcildCisgICAgfQorICAgIHJvb3RzID0gc2V0KGRpcihjbHMpKSAmIHNldChjb252ZXJ0KQorICAgIGlmIG5vdCByb290czoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIG9yZGVyaW5nIG9wZXJhdGlvbjogPCA+IDw9ID49JykKKyAgICByb290ID0gbWF4KHJvb3RzKSAgICAgICAjIHByZWZlciBfX2x0X18gdG8gX19sZV9fIHRvIF9fZ3RfXyB0byBfX2dlX18KKyAgICBmb3Igb3BuYW1lLCBvcGZ1bmMgaW4gY29udmVydFtyb290XToKKyAgICAgICAgaWYgb3BuYW1lIG5vdCBpbiByb290czoKKyAgICAgICAgICAgIG9wZnVuYy5fX25hbWVfXyA9IG9wbmFtZQorICAgICAgICAgICAgb3BmdW5jLl9fZG9jX18gPSBnZXRhdHRyKGludCwgb3BuYW1lKS5fX2RvY19fCisgICAgICAgICAgICBzZXRhdHRyKGNscywgb3BuYW1lLCBvcGZ1bmMpCisgICAgcmV0dXJuIGNscworCitkZWYgY21wX3RvX2tleShteWNtcCk6CisgICAgIiIiQ29udmVydCBhIGNtcD0gZnVuY3Rpb24gaW50byBhIGtleT0gZnVuY3Rpb24iIiIKKyAgICBjbGFzcyBLKG9iamVjdCk6CisgICAgICAgIF9fc2xvdHNfXyA9IFsnb2JqJ10KKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaiwgKmFyZ3MpOgorICAgICAgICAgICAgc2VsZi5vYmogPSBvYmoKKyAgICAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gbXljbXAoc2VsZi5vYmosIG90aGVyLm9iaikgPCAwCisgICAgICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIG15Y21wKHNlbGYub2JqLCBvdGhlci5vYmopID4gMAorICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBteWNtcChzZWxmLm9iaiwgb3RoZXIub2JqKSA9PSAwCisgICAgICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIG15Y21wKHNlbGYub2JqLCBvdGhlci5vYmopIDw9IDAKKyAgICAgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gbXljbXAoc2VsZi5vYmosIG90aGVyLm9iaikgPj0gMAorICAgICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBteWNtcChzZWxmLm9iaiwgb3RoZXIub2JqKSAhPSAwCisgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignaGFzaCBub3QgaW1wbGVtZW50ZWQnKQorICAgIHJldHVybiBLCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weWMgYi9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5MjUxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZnVuY3Rvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weW8gYi9saWIvcHl0aG9uMi43L2Z1bmN0b29scy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM5MjUxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZnVuY3Rvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2dlbmVyaWNwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJmNjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weQpAQCAtMCwwICsxLDEwNSBAQAorIiIiCitQYXRoIG9wZXJhdGlvbnMgY29tbW9uIHRvIG1vcmUgdGhhbiBvbmUgT1MKK0RvIG5vdCB1c2UgZGlyZWN0bHkuICBUaGUgT1Mgc3BlY2lmaWMgbW9kdWxlcyBpbXBvcnQgdGhlIGFwcHJvcHJpYXRlCitmdW5jdGlvbnMgZnJvbSB0aGlzIG1vZHVsZSB0aGVtc2VsdmVzLgorIiIiCitpbXBvcnQgb3MKK2ltcG9ydCBzdGF0CisKK19fYWxsX18gPSBbJ2NvbW1vbnByZWZpeCcsICdleGlzdHMnLCAnZ2V0YXRpbWUnLCAnZ2V0Y3RpbWUnLCAnZ2V0bXRpbWUnLAorICAgICAgICAgICAnZ2V0c2l6ZScsICdpc2RpcicsICdpc2ZpbGUnXQorCisKKyMgRG9lcyBhIHBhdGggZXhpc3Q/CisjIFRoaXMgaXMgZmFsc2UgZm9yIGRhbmdsaW5nIHN5bWJvbGljIGxpbmtzIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHRoZW0uCitkZWYgZXhpc3RzKHBhdGgpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggZXhpc3RzLiAgUmV0dXJucyBGYWxzZSBmb3IgYnJva2VuIHN5bWJvbGljIGxpbmtzIiIiCisgICAgdHJ5OgorICAgICAgICBvcy5zdGF0KHBhdGgpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisKKyMgVGhpcyBmb2xsb3dzIHN5bWJvbGljIGxpbmtzLCBzbyBib3RoIGlzbGluaygpIGFuZCBpc2RpcigpIGNhbiBiZSB0cnVlCisjIGZvciB0aGUgc2FtZSBwYXRoIG9ubyBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzeW1saW5rcworZGVmIGlzZmlsZShwYXRoKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgYSBwYXRoIGlzIGEgcmVndWxhciBmaWxlIiIiCisgICAgdHJ5OgorICAgICAgICBzdCA9IG9zLnN0YXQocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBzdGF0LlNfSVNSRUcoc3Quc3RfbW9kZSkKKworCisjIElzIGEgcGF0aCBhIGRpcmVjdG9yeT8KKyMgVGhpcyBmb2xsb3dzIHN5bWJvbGljIGxpbmtzLCBzbyBib3RoIGlzbGluaygpIGFuZCBpc2RpcigpCisjIGNhbiBiZSB0cnVlIGZvciB0aGUgc2FtZSBwYXRoIG9uIHN5c3RlbXMgdGhhdCBzdXBwb3J0IHN5bWxpbmtzCitkZWYgaXNkaXIocyk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIHBhdGhuYW1lIHJlZmVycyB0byBhbiBleGlzdGluZyBkaXJlY3RvcnkuIiIiCisgICAgdHJ5OgorICAgICAgICBzdCA9IG9zLnN0YXQocykKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSkKKworCitkZWYgZ2V0c2l6ZShmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBzaXplIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgorICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9zaXplCisKKworZGVmIGdldG10aW1lKGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm4gdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgYSBmaWxlLCByZXBvcnRlZCBieSBvcy5zdGF0KCkuIiIiCisgICAgcmV0dXJuIG9zLnN0YXQoZmlsZW5hbWUpLnN0X210aW1lCisKKworZGVmIGdldGF0aW1lKGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm4gdGhlIGxhc3QgYWNjZXNzIHRpbWUgb2YgYSBmaWxlLCByZXBvcnRlZCBieSBvcy5zdGF0KCkuIiIiCisgICAgcmV0dXJuIG9zLnN0YXQoZmlsZW5hbWUpLnN0X2F0aW1lCisKKworZGVmIGdldGN0aW1lKGZpbGVuYW1lKToKKyAgICAiIiJSZXR1cm4gdGhlIG1ldGFkYXRhIGNoYW5nZSB0aW1lIG9mIGEgZmlsZSwgcmVwb3J0ZWQgYnkgb3Muc3RhdCgpLiIiIgorICAgIHJldHVybiBvcy5zdGF0KGZpbGVuYW1lKS5zdF9jdGltZQorCisKKyMgUmV0dXJuIHRoZSBsb25nZXN0IHByZWZpeCBvZiBhbGwgbGlzdCBlbGVtZW50cy4KK2RlZiBjb21tb25wcmVmaXgobSk6CisgICAgIkdpdmVuIGEgbGlzdCBvZiBwYXRobmFtZXMsIHJldHVybnMgdGhlIGxvbmdlc3QgY29tbW9uIGxlYWRpbmcgY29tcG9uZW50IgorICAgIGlmIG5vdCBtOiByZXR1cm4gJycKKyAgICBzMSA9IG1pbihtKQorICAgIHMyID0gbWF4KG0pCisgICAgZm9yIGksIGMgaW4gZW51bWVyYXRlKHMxKToKKyAgICAgICAgaWYgYyAhPSBzMltpXToKKyAgICAgICAgICAgIHJldHVybiBzMVs6aV0KKyAgICByZXR1cm4gczEKKworIyBTcGxpdCBhIHBhdGggaW4gcm9vdCBhbmQgZXh0ZW5zaW9uLgorIyBUaGUgZXh0ZW5zaW9uIGlzIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgYXQgdGhlIGxhc3QgZG90IGluIHRoZSBsYXN0CisjIHBhdGhuYW1lIGNvbXBvbmVudDsgdGhlIHJvb3QgaXMgZXZlcnl0aGluZyBiZWZvcmUgdGhhdC4KKyMgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCByb290ICsgZXh0ID09IHAuCisKKyMgR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBzcGxpdGV4dCwgdG8gYmUgcGFyYW1ldHJpemVkIHdpdGgKKyMgdGhlIHNlcGFyYXRvcnMKK2RlZiBfc3BsaXRleHQocCwgc2VwLCBhbHRzZXAsIGV4dHNlcCk6CisgICAgIiIiU3BsaXQgdGhlIGV4dGVuc2lvbiBmcm9tIGEgcGF0aG5hbWUuCisKKyAgICBFeHRlbnNpb24gaXMgZXZlcnl0aGluZyBmcm9tIHRoZSBsYXN0IGRvdCB0byB0aGUgZW5kLCBpZ25vcmluZworICAgIGxlYWRpbmcgZG90cy4gIFJldHVybnMgIihyb290LCBleHQpIjsgZXh0IG1heSBiZSBlbXB0eS4iIiIKKworICAgIHNlcEluZGV4ID0gcC5yZmluZChzZXApCisgICAgaWYgYWx0c2VwOgorICAgICAgICBhbHRzZXBJbmRleCA9IHAucmZpbmQoYWx0c2VwKQorICAgICAgICBzZXBJbmRleCA9IG1heChzZXBJbmRleCwgYWx0c2VwSW5kZXgpCisKKyAgICBkb3RJbmRleCA9IHAucmZpbmQoZXh0c2VwKQorICAgIGlmIGRvdEluZGV4ID4gc2VwSW5kZXg6CisgICAgICAgICMgc2tpcCBhbGwgbGVhZGluZyBkb3RzCisgICAgICAgIGZpbGVuYW1lSW5kZXggPSBzZXBJbmRleCArIDEKKyAgICAgICAgd2hpbGUgZmlsZW5hbWVJbmRleCA8IGRvdEluZGV4OgorICAgICAgICAgICAgaWYgcFtmaWxlbmFtZUluZGV4XSAhPSBleHRzZXA6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBbOmRvdEluZGV4XSwgcFtkb3RJbmRleDpdCisgICAgICAgICAgICBmaWxlbmFtZUluZGV4ICs9IDEKKworICAgIHJldHVybiBwLCAnJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weWMgYi9saWIvcHl0aG9uMi43L2dlbmVyaWNwYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA3YzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weW8gYi9saWIvcHl0aG9uMi43L2dlbmVyaWNwYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTA3YzRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nZW5lcmljcGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXRvcHQucHkgYi9saWIvcHl0aG9uMi43L2dldG9wdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTFkODljCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nZXRvcHQucHkKQEAgLTAsMCArMSwyMTAgQEAKKyIiIlBhcnNlciBmb3IgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisKK1RoaXMgbW9kdWxlIGhlbHBzIHNjcmlwdHMgdG8gcGFyc2UgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4KK3N5cy5hcmd2LiAgSXQgc3VwcG9ydHMgdGhlIHNhbWUgY29udmVudGlvbnMgYXMgdGhlIFVuaXggZ2V0b3B0KCkKK2Z1bmN0aW9uIChpbmNsdWRpbmcgdGhlIHNwZWNpYWwgbWVhbmluZ3Mgb2YgYXJndW1lbnRzIG9mIHRoZSBmb3JtIGAtJworYW5kIGAtLScpLiAgTG9uZyBvcHRpb25zIHNpbWlsYXIgdG8gdGhvc2Ugc3VwcG9ydGVkIGJ5IEdOVSBzb2Z0d2FyZQorbWF5IGJlIHVzZWQgYXMgd2VsbCB2aWEgYW4gb3B0aW9uYWwgdGhpcmQgYXJndW1lbnQuICBUaGlzIG1vZHVsZQorcHJvdmlkZXMgdHdvIGZ1bmN0aW9ucyBhbmQgYW4gZXhjZXB0aW9uOgorCitnZXRvcHQoKSAtLSBQYXJzZSBjb21tYW5kIGxpbmUgb3B0aW9ucworZ251X2dldG9wdCgpIC0tIExpa2UgZ2V0b3B0KCksIGJ1dCBhbGxvdyBvcHRpb24gYW5kIG5vbi1vcHRpb24gYXJndW1lbnRzCit0byBiZSBpbnRlcm1peGVkLgorR2V0b3B0RXJyb3IgLS0gZXhjZXB0aW9uIChjbGFzcykgcmFpc2VkIHdpdGggJ29wdCcgYXR0cmlidXRlLCB3aGljaCBpcyB0aGUKK29wdGlvbiBpbnZvbHZlZCB3aXRoIHRoZSBleGNlcHRpb24uCisiIiIKKworIyBMb25nIG9wdGlvbiBzdXBwb3J0IGFkZGVkIGJ5IExhcnMgV2lyemVuaXVzIDxsaXdAaWtpLmZpPi4KKyMKKyMgR2Vycml0IEhvbGwgPGdlcnJpdEBubC5saW51eC5vcmc+IG1vdmVkIHRoZSBzdHJpbmctYmFzZWQgZXhjZXB0aW9ucworIyB0byBjbGFzcy1iYXNlZCBleGNlcHRpb25zLgorIworIyBQZXRlciBBc3RyYW5kIDxhc3RyYW5kQGx5c2F0b3IubGl1LnNlPiBhZGRlZCBnbnVfZ2V0b3B0KCkuCisjCisjIFRPRE8gZm9yIGdudV9nZXRvcHQoKToKKyMKKyMgLSBHTlUgZ2V0b3B0X2xvbmdfb25seSBtZWNoYW5pc20KKyMgLSBhbGxvdyB0aGUgY2FsbGVyIHRvIHNwZWNpZnkgb3JkZXJpbmcKKyMgLSBSRVRVUk5fSU5fT1JERVIgb3B0aW9uCisjIC0gR05VIGV4dGVuc2lvbiB3aXRoICctJyBhcyBmaXJzdCBjaGFyYWN0ZXIgb2Ygb3B0aW9uIHN0cmluZworIyAtIG9wdGlvbmFsIGFyZ3VtZW50cywgc3BlY2lmaWVkIGJ5IGRvdWJsZSBjb2xvbnMKKyMgLSBhIG9wdGlvbiBzdHJpbmcgd2l0aCBhIFcgZm9sbG93ZWQgYnkgc2VtaWNvbG9uIHNob3VsZAorIyAgIHRyZWF0ICItVyBmb28iIGFzICItLWZvbyIKKworX19hbGxfXyA9IFsiR2V0b3B0RXJyb3IiLCJlcnJvciIsImdldG9wdCIsImdudV9nZXRvcHQiXQorCitpbXBvcnQgb3MKKworY2xhc3MgR2V0b3B0RXJyb3IoRXhjZXB0aW9uKToKKyAgICBvcHQgPSAnJworICAgIG1zZyA9ICcnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgb3B0PScnKToKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgc2VsZi5vcHQgPSBvcHQKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZywgb3B0KQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1zZworCitlcnJvciA9IEdldG9wdEVycm9yICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCitkZWYgZ2V0b3B0KGFyZ3MsIHNob3J0b3B0cywgbG9uZ29wdHMgPSBbXSk6CisgICAgIiIiZ2V0b3B0KGFyZ3MsIG9wdGlvbnNbLCBsb25nX29wdGlvbnNdKSAtPiBvcHRzLCBhcmdzCisKKyAgICBQYXJzZXMgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHBhcmFtZXRlciBsaXN0LiAgYXJncyBpcyB0aGUKKyAgICBhcmd1bWVudCBsaXN0IHRvIGJlIHBhcnNlZCwgd2l0aG91dCB0aGUgbGVhZGluZyByZWZlcmVuY2UgdG8gdGhlCisgICAgcnVubmluZyBwcm9ncmFtLiAgVHlwaWNhbGx5LCB0aGlzIG1lYW5zICJzeXMuYXJndlsxOl0iLiAgc2hvcnRvcHRzCisgICAgaXMgdGhlIHN0cmluZyBvZiBvcHRpb24gbGV0dGVycyB0aGF0IHRoZSBzY3JpcHQgd2FudHMgdG8KKyAgICByZWNvZ25pemUsIHdpdGggb3B0aW9ucyB0aGF0IHJlcXVpcmUgYW4gYXJndW1lbnQgZm9sbG93ZWQgYnkgYQorICAgIGNvbG9uIChpLmUuLCB0aGUgc2FtZSBmb3JtYXQgdGhhdCBVbml4IGdldG9wdCgpIHVzZXMpLiAgSWYKKyAgICBzcGVjaWZpZWQsIGxvbmdvcHRzIGlzIGEgbGlzdCBvZiBzdHJpbmdzIHdpdGggdGhlIG5hbWVzIG9mIHRoZQorICAgIGxvbmcgb3B0aW9ucyB3aGljaCBzaG91bGQgYmUgc3VwcG9ydGVkLiAgVGhlIGxlYWRpbmcgJy0tJworICAgIGNoYXJhY3RlcnMgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgb3B0aW9uIG5hbWUuICBPcHRpb25zCisgICAgd2hpY2ggcmVxdWlyZSBhbiBhcmd1bWVudCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYW4gZXF1YWwgc2lnbgorICAgICgnPScpLgorCisgICAgVGhlIHJldHVybiB2YWx1ZSBjb25zaXN0cyBvZiB0d28gZWxlbWVudHM6IHRoZSBmaXJzdCBpcyBhIGxpc3Qgb2YKKyAgICAob3B0aW9uLCB2YWx1ZSkgcGFpcnM7IHRoZSBzZWNvbmQgaXMgdGhlIGxpc3Qgb2YgcHJvZ3JhbSBhcmd1bWVudHMKKyAgICBsZWZ0IGFmdGVyIHRoZSBvcHRpb24gbGlzdCB3YXMgc3RyaXBwZWQgKHRoaXMgaXMgYSB0cmFpbGluZyBzbGljZQorICAgIG9mIHRoZSBmaXJzdCBhcmd1bWVudCkuICBFYWNoIG9wdGlvbi1hbmQtdmFsdWUgcGFpciByZXR1cm5lZCBoYXMKKyAgICB0aGUgb3B0aW9uIGFzIGl0cyBmaXJzdCBlbGVtZW50LCBwcmVmaXhlZCB3aXRoIGEgaHlwaGVuIChlLmcuLAorICAgICcteCcpLCBhbmQgdGhlIG9wdGlvbiBhcmd1bWVudCBhcyBpdHMgc2Vjb25kIGVsZW1lbnQsIG9yIGFuIGVtcHR5CisgICAgc3RyaW5nIGlmIHRoZSBvcHRpb24gaGFzIG5vIGFyZ3VtZW50LiAgVGhlIG9wdGlvbnMgb2NjdXIgaW4gdGhlCisgICAgbGlzdCBpbiB0aGUgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgZm91bmQsIHRodXMgYWxsb3dpbmcKKyAgICBtdWx0aXBsZSBvY2N1cnJlbmNlcy4gIExvbmcgYW5kIHNob3J0IG9wdGlvbnMgbWF5IGJlIG1peGVkLgorCisgICAgIiIiCisKKyAgICBvcHRzID0gW10KKyAgICBpZiB0eXBlKGxvbmdvcHRzKSA9PSB0eXBlKCIiKToKKyAgICAgICAgbG9uZ29wdHMgPSBbbG9uZ29wdHNdCisgICAgZWxzZToKKyAgICAgICAgbG9uZ29wdHMgPSBsaXN0KGxvbmdvcHRzKQorICAgIHdoaWxlIGFyZ3MgYW5kIGFyZ3NbMF0uc3RhcnRzd2l0aCgnLScpIGFuZCBhcmdzWzBdICE9ICctJzoKKyAgICAgICAgaWYgYXJnc1swXSA9PSAnLS0nOgorICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBhcmdzWzBdLnN0YXJ0c3dpdGgoJy0tJyk6CisgICAgICAgICAgICBvcHRzLCBhcmdzID0gZG9fbG9uZ3Mob3B0cywgYXJnc1swXVsyOl0sIGxvbmdvcHRzLCBhcmdzWzE6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBkb19zaG9ydHMob3B0cywgYXJnc1swXVsxOl0sIHNob3J0b3B0cywgYXJnc1sxOl0pCisKKyAgICByZXR1cm4gb3B0cywgYXJncworCitkZWYgZ251X2dldG9wdChhcmdzLCBzaG9ydG9wdHMsIGxvbmdvcHRzID0gW10pOgorICAgICIiImdldG9wdChhcmdzLCBvcHRpb25zWywgbG9uZ19vcHRpb25zXSkgLT4gb3B0cywgYXJncworCisgICAgVGhpcyBmdW5jdGlvbiB3b3JrcyBsaWtlIGdldG9wdCgpLCBleGNlcHQgdGhhdCBHTlUgc3R5bGUgc2Nhbm5pbmcKKyAgICBtb2RlIGlzIHVzZWQgYnkgZGVmYXVsdC4gVGhpcyBtZWFucyB0aGF0IG9wdGlvbiBhbmQgbm9uLW9wdGlvbgorICAgIGFyZ3VtZW50cyBtYXkgYmUgaW50ZXJtaXhlZC4gVGhlIGdldG9wdCgpIGZ1bmN0aW9uIHN0b3BzCisgICAgcHJvY2Vzc2luZyBvcHRpb25zIGFzIHNvb24gYXMgYSBub24tb3B0aW9uIGFyZ3VtZW50IGlzCisgICAgZW5jb3VudGVyZWQuCisKKyAgICBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBvcHRpb24gc3RyaW5nIGlzIGArJywgb3IgaWYgdGhlCisgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgUE9TSVhMWV9DT1JSRUNUIGlzIHNldCwgdGhlbiBvcHRpb24KKyAgICBwcm9jZXNzaW5nIHN0b3BzIGFzIHNvb24gYXMgYSBub24tb3B0aW9uIGFyZ3VtZW50IGlzIGVuY291bnRlcmVkLgorCisgICAgIiIiCisKKyAgICBvcHRzID0gW10KKyAgICBwcm9nX2FyZ3MgPSBbXQorICAgIGlmIGlzaW5zdGFuY2UobG9uZ29wdHMsIHN0cik6CisgICAgICAgIGxvbmdvcHRzID0gW2xvbmdvcHRzXQorICAgIGVsc2U6CisgICAgICAgIGxvbmdvcHRzID0gbGlzdChsb25nb3B0cykKKworICAgICMgQWxsb3cgb3B0aW9ucyBhZnRlciBub24tb3B0aW9uIGFyZ3VtZW50cz8KKyAgICBpZiBzaG9ydG9wdHMuc3RhcnRzd2l0aCgnKycpOgorICAgICAgICBzaG9ydG9wdHMgPSBzaG9ydG9wdHNbMTpdCisgICAgICAgIGFsbF9vcHRpb25zX2ZpcnN0ID0gVHJ1ZQorICAgIGVsaWYgb3MuZW52aXJvbi5nZXQoIlBPU0lYTFlfQ09SUkVDVCIpOgorICAgICAgICBhbGxfb3B0aW9uc19maXJzdCA9IFRydWUKKyAgICBlbHNlOgorICAgICAgICBhbGxfb3B0aW9uc19maXJzdCA9IEZhbHNlCisKKyAgICB3aGlsZSBhcmdzOgorICAgICAgICBpZiBhcmdzWzBdID09ICctLSc6CisgICAgICAgICAgICBwcm9nX2FyZ3MgKz0gYXJnc1sxOl0KKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgYXJnc1swXVs6Ml0gPT0gJy0tJzoKKyAgICAgICAgICAgIG9wdHMsIGFyZ3MgPSBkb19sb25ncyhvcHRzLCBhcmdzWzBdWzI6XSwgbG9uZ29wdHMsIGFyZ3NbMTpdKQorICAgICAgICBlbGlmIGFyZ3NbMF1bOjFdID09ICctJyBhbmQgYXJnc1swXSAhPSAnLSc6CisgICAgICAgICAgICBvcHRzLCBhcmdzID0gZG9fc2hvcnRzKG9wdHMsIGFyZ3NbMF1bMTpdLCBzaG9ydG9wdHMsIGFyZ3NbMTpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYWxsX29wdGlvbnNfZmlyc3Q6CisgICAgICAgICAgICAgICAgcHJvZ19hcmdzICs9IGFyZ3MKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcm9nX2FyZ3MuYXBwZW5kKGFyZ3NbMF0pCisgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisKKyAgICByZXR1cm4gb3B0cywgcHJvZ19hcmdzCisKK2RlZiBkb19sb25ncyhvcHRzLCBvcHQsIGxvbmdvcHRzLCBhcmdzKToKKyAgICB0cnk6CisgICAgICAgIGkgPSBvcHQuaW5kZXgoJz0nKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBvcHRhcmcgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgb3B0LCBvcHRhcmcgPSBvcHRbOmldLCBvcHRbaSsxOl0KKworICAgIGhhc19hcmcsIG9wdCA9IGxvbmdfaGFzX2FyZ3Mob3B0LCBsb25nb3B0cykKKyAgICBpZiBoYXNfYXJnOgorICAgICAgICBpZiBvcHRhcmcgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgICAgIHJhaXNlIEdldG9wdEVycm9yKCdvcHRpb24gLS0lcyByZXF1aXJlcyBhcmd1bWVudCcgJSBvcHQsIG9wdCkKKyAgICAgICAgICAgIG9wdGFyZywgYXJncyA9IGFyZ3NbMF0sIGFyZ3NbMTpdCisgICAgZWxpZiBvcHRhcmcgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIEdldG9wdEVycm9yKCdvcHRpb24gLS0lcyBtdXN0IG5vdCBoYXZlIGFuIGFyZ3VtZW50JyAlIG9wdCwgb3B0KQorICAgIG9wdHMuYXBwZW5kKCgnLS0nICsgb3B0LCBvcHRhcmcgb3IgJycpKQorICAgIHJldHVybiBvcHRzLCBhcmdzCisKKyMgUmV0dXJuOgorIyAgIGhhc19hcmc/CisjICAgZnVsbCBvcHRpb24gbmFtZQorZGVmIGxvbmdfaGFzX2FyZ3Mob3B0LCBsb25nb3B0cyk6CisgICAgcG9zc2liaWxpdGllcyA9IFtvIGZvciBvIGluIGxvbmdvcHRzIGlmIG8uc3RhcnRzd2l0aChvcHQpXQorICAgIGlmIG5vdCBwb3NzaWJpbGl0aWVzOgorICAgICAgICByYWlzZSBHZXRvcHRFcnJvcignb3B0aW9uIC0tJXMgbm90IHJlY29nbml6ZWQnICUgb3B0LCBvcHQpCisgICAgIyBJcyB0aGVyZSBhbiBleGFjdCBtYXRjaD8KKyAgICBpZiBvcHQgaW4gcG9zc2liaWxpdGllczoKKyAgICAgICAgcmV0dXJuIEZhbHNlLCBvcHQKKyAgICBlbGlmIG9wdCArICc9JyBpbiBwb3NzaWJpbGl0aWVzOgorICAgICAgICByZXR1cm4gVHJ1ZSwgb3B0CisgICAgIyBObyBleGFjdCBtYXRjaCwgc28gYmV0dGVyIGJlIHVuaXF1ZS4KKyAgICBpZiBsZW4ocG9zc2liaWxpdGllcykgPiAxOgorICAgICAgICAjIFhYWCBzaW5jZSBwb3NzaWJpbGl0aWVzIGNvbnRhaW5zIGFsbCB2YWxpZCBjb250aW51YXRpb25zLCBtaWdodCBiZQorICAgICAgICAjIG5pY2UgdG8gd29yayB0aGVtIGludG8gdGhlIGVycm9yIG1zZworICAgICAgICByYWlzZSBHZXRvcHRFcnJvcignb3B0aW9uIC0tJXMgbm90IGEgdW5pcXVlIHByZWZpeCcgJSBvcHQsIG9wdCkKKyAgICBhc3NlcnQgbGVuKHBvc3NpYmlsaXRpZXMpID09IDEKKyAgICB1bmlxdWVfbWF0Y2ggPSBwb3NzaWJpbGl0aWVzWzBdCisgICAgaGFzX2FyZyA9IHVuaXF1ZV9tYXRjaC5lbmRzd2l0aCgnPScpCisgICAgaWYgaGFzX2FyZzoKKyAgICAgICAgdW5pcXVlX21hdGNoID0gdW5pcXVlX21hdGNoWzotMV0KKyAgICByZXR1cm4gaGFzX2FyZywgdW5pcXVlX21hdGNoCisKK2RlZiBkb19zaG9ydHMob3B0cywgb3B0c3RyaW5nLCBzaG9ydG9wdHMsIGFyZ3MpOgorICAgIHdoaWxlIG9wdHN0cmluZyAhPSAnJzoKKyAgICAgICAgb3B0LCBvcHRzdHJpbmcgPSBvcHRzdHJpbmdbMF0sIG9wdHN0cmluZ1sxOl0KKyAgICAgICAgaWYgc2hvcnRfaGFzX2FyZyhvcHQsIHNob3J0b3B0cyk6CisgICAgICAgICAgICBpZiBvcHRzdHJpbmcgPT0gJyc6CisgICAgICAgICAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEdldG9wdEVycm9yKCdvcHRpb24gLSVzIHJlcXVpcmVzIGFyZ3VtZW50JyAlIG9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0KQorICAgICAgICAgICAgICAgIG9wdHN0cmluZywgYXJncyA9IGFyZ3NbMF0sIGFyZ3NbMTpdCisgICAgICAgICAgICBvcHRhcmcsIG9wdHN0cmluZyA9IG9wdHN0cmluZywgJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wdGFyZyA9ICcnCisgICAgICAgIG9wdHMuYXBwZW5kKCgnLScgKyBvcHQsIG9wdGFyZykpCisgICAgcmV0dXJuIG9wdHMsIGFyZ3MKKworZGVmIHNob3J0X2hhc19hcmcob3B0LCBzaG9ydG9wdHMpOgorICAgIGZvciBpIGluIHJhbmdlKGxlbihzaG9ydG9wdHMpKToKKyAgICAgICAgaWYgb3B0ID09IHNob3J0b3B0c1tpXSAhPSAnOic6CisgICAgICAgICAgICByZXR1cm4gc2hvcnRvcHRzLnN0YXJ0c3dpdGgoJzonLCBpKzEpCisgICAgcmFpc2UgR2V0b3B0RXJyb3IoJ29wdGlvbiAtJXMgbm90IHJlY29nbml6ZWQnICUgb3B0LCBvcHQpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IHN5cworICAgIHByaW50IGdldG9wdChzeXMuYXJndlsxOl0sICJhOmIiLCBbImFscGhhPSIsICJiZXRhIl0pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2dldG9wdC5weWMgYi9saWIvcHl0aG9uMi43L2dldG9wdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3YTUxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0b3B0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2dldG9wdC5weW8gYi9saWIvcHl0aG9uMi43L2dldG9wdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEwZGM0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0b3B0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2dldHBhc3MucHkgYi9saWIvcHl0aG9uMi43L2dldHBhc3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFjNmZkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0cGFzcy5weQpAQCAtMCwwICsxLDE3OSBAQAorIiIiVXRpbGl0aWVzIHRvIGdldCBhIHBhc3N3b3JkIGFuZC9vciB0aGUgY3VycmVudCB1c2VyIG5hbWUuCisKK2dldHBhc3MocHJvbXB0Wywgc3RyZWFtXSkgLSBQcm9tcHQgZm9yIGEgcGFzc3dvcmQsIHdpdGggZWNobyB0dXJuZWQgb2ZmLgorZ2V0dXNlcigpIC0gR2V0IHRoZSB1c2VyIG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQgb3IgcGFzc3dvcmQgZGF0YWJhc2UuCisKK0dldFBhc3NXYXJuaW5nIC0gVGhpcyBVc2VyV2FybmluZyBpcyBpc3N1ZWQgd2hlbiBnZXRwYXNzKCkgY2Fubm90IHByZXZlbnQKKyAgICAgICAgICAgICAgICAgZWNob2luZyBvZiB0aGUgcGFzc3dvcmQgY29udGVudHMgd2hpbGUgcmVhZGluZy4KKworT24gV2luZG93cywgdGhlIG1zdmNydCBtb2R1bGUgd2lsbCBiZSB1c2VkLgorT24gdGhlIE1hYyBFYXN5RGlhbG9ncy5Bc2tQYXNzd29yZCBpcyB1c2VkLCBpZiBhdmFpbGFibGUuCisKKyIiIgorCisjIEF1dGhvcnM6IFBpZXJzIExhdWRlciAob3JpZ2luYWwpCisjICAgICAgICAgIEd1aWRvIHZhbiBSb3NzdW0gKFdpbmRvd3Mgc3VwcG9ydCBhbmQgY2xlYW51cCkKKyMgICAgICAgICAgR3JlZ29yeSBQLiBTbWl0aCAodHR5IHN1cHBvcnQgJiBHZXRQYXNzV2FybmluZykKKworaW1wb3J0IG9zLCBzeXMsIHdhcm5pbmdzCisKK19fYWxsX18gPSBbImdldHBhc3MiLCJnZXR1c2VyIiwiR2V0UGFzc1dhcm5pbmciXQorCisKK2NsYXNzIEdldFBhc3NXYXJuaW5nKFVzZXJXYXJuaW5nKTogcGFzcworCisKK2RlZiB1bml4X2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJywgc3RyZWFtPU5vbmUpOgorICAgICIiIlByb21wdCBmb3IgYSBwYXNzd29yZCwgd2l0aCBlY2hvIHR1cm5lZCBvZmYuCisKKyAgICBBcmdzOgorICAgICAgcHJvbXB0OiBXcml0dGVuIG9uIHN0cmVhbSB0byBhc2sgZm9yIHRoZSBpbnB1dC4gIERlZmF1bHQ6ICdQYXNzd29yZDogJworICAgICAgc3RyZWFtOiBBIHdyaXRhYmxlIGZpbGUgb2JqZWN0IHRvIGRpc3BsYXkgdGhlIHByb21wdC4gIERlZmF1bHRzIHRvCisgICAgICAgICAgICAgIHRoZSB0dHkuICBJZiBubyB0dHkgaXMgYXZhaWxhYmxlIGRlZmF1bHRzIHRvIHN5cy5zdGRlcnIuCisgICAgUmV0dXJuczoKKyAgICAgIFRoZSBzZUtyM3QgaW5wdXQuCisgICAgUmFpc2VzOgorICAgICAgRU9GRXJyb3I6IElmIG91ciBpbnB1dCB0dHkgb3Igc3RkaW4gd2FzIGNsb3NlZC4KKyAgICAgIEdldFBhc3NXYXJuaW5nOiBXaGVuIHdlIHdlcmUgdW5hYmxlIHRvIHR1cm4gZWNobyBvZmYgb24gdGhlIGlucHV0LgorCisgICAgQWx3YXlzIHJlc3RvcmVzIHRlcm1pbmFsIHNldHRpbmdzIGJlZm9yZSByZXR1cm5pbmcuCisgICAgIiIiCisgICAgZmQgPSBOb25lCisgICAgdHR5ID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgIyBBbHdheXMgdHJ5IHJlYWRpbmcgYW5kIHdyaXRpbmcgZGlyZWN0bHkgb24gdGhlIHR0eSBmaXJzdC4KKyAgICAgICAgZmQgPSBvcy5vcGVuKCcvZGV2L3R0eScsIG9zLk9fUkRXUnxvcy5PX05PQ1RUWSkKKyAgICAgICAgdHR5ID0gb3MuZmRvcGVuKGZkLCAndysnLCAxKQorICAgICAgICBpbnB1dCA9IHR0eQorICAgICAgICBpZiBub3Qgc3RyZWFtOgorICAgICAgICAgICAgc3RyZWFtID0gdHR5CisgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICMgSWYgdGhhdCBmYWlscywgc2VlIGlmIHN0ZGluIGNhbiBiZSBjb250cm9sbGVkLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmZCA9IHN5cy5zdGRpbi5maWxlbm8oKQorICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHBhc3N3ZCA9IGZhbGxiYWNrX2dldHBhc3MocHJvbXB0LCBzdHJlYW0pCisgICAgICAgIGlucHV0ID0gc3lzLnN0ZGluCisgICAgICAgIGlmIG5vdCBzdHJlYW06CisgICAgICAgICAgICBzdHJlYW0gPSBzeXMuc3RkZXJyCisKKyAgICBpZiBmZCBpcyBub3QgTm9uZToKKyAgICAgICAgcGFzc3dkID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvbGQgPSB0ZXJtaW9zLnRjZ2V0YXR0cihmZCkgICAgICMgYSBjb3B5IHRvIHNhdmUKKyAgICAgICAgICAgIG5ldyA9IG9sZFs6XQorICAgICAgICAgICAgbmV3WzNdICY9IH50ZXJtaW9zLkVDSE8gICMgMyA9PSAnbGZsYWdzJworICAgICAgICAgICAgdGNzZXRhdHRyX2ZsYWdzID0gdGVybWlvcy5UQ1NBRkxVU0gKKyAgICAgICAgICAgIGlmIGhhc2F0dHIodGVybWlvcywgJ1RDU0FTT0ZUJyk6CisgICAgICAgICAgICAgICAgdGNzZXRhdHRyX2ZsYWdzIHw9IHRlcm1pb3MuVENTQVNPRlQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZXJtaW9zLnRjc2V0YXR0cihmZCwgdGNzZXRhdHRyX2ZsYWdzLCBuZXcpCisgICAgICAgICAgICAgICAgcGFzc3dkID0gX3Jhd19pbnB1dChwcm9tcHQsIHN0cmVhbSwgaW5wdXQ9aW5wdXQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRlcm1pb3MudGNzZXRhdHRyKGZkLCB0Y3NldGF0dHJfZmxhZ3MsIG9sZCkKKyAgICAgICAgICAgICAgICBzdHJlYW0uZmx1c2goKSAgIyBpc3N1ZTcyMDgKKyAgICAgICAgZXhjZXB0IHRlcm1pb3MuZXJyb3IsIGU6CisgICAgICAgICAgICBpZiBwYXNzd2QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBfcmF3X2lucHV0IHN1Y2NlZWRlZC4gIFRoZSBmaW5hbCB0Y3NldGF0dHIgZmFpbGVkLiAgUmVyYWlzZQorICAgICAgICAgICAgICAgICMgaW5zdGVhZCBvZiBsZWF2aW5nIHRoZSB0ZXJtaW5hbCBpbiBhbiB1bmtub3duIHN0YXRlLgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAjIFdlIGNhbid0IGNvbnRyb2wgdGhlIHR0eSBvciBzdGRpbi4gIEdpdmUgdXAgYW5kIHVzZSBub3JtYWwgSU8uCisgICAgICAgICAgICAjIGZhbGxiYWNrX2dldHBhc3MoKSByYWlzZXMgYW4gYXBwcm9wcmlhdGUgd2FybmluZy4KKyAgICAgICAgICAgIGRlbCBpbnB1dCwgdHR5ICAjIGNsZWFuIHVwIHVudXNlZCBmaWxlIG9iamVjdHMgYmVmb3JlIGJsb2NraW5nCisgICAgICAgICAgICBwYXNzd2QgPSBmYWxsYmFja19nZXRwYXNzKHByb21wdCwgc3RyZWFtKQorCisgICAgc3RyZWFtLndyaXRlKCdcbicpCisgICAgcmV0dXJuIHBhc3N3ZAorCisKK2RlZiB3aW5fZ2V0cGFzcyhwcm9tcHQ9J1Bhc3N3b3JkOiAnLCBzdHJlYW09Tm9uZSk6CisgICAgIiIiUHJvbXB0IGZvciBwYXNzd29yZCB3aXRoIGVjaG8gb2ZmLCB1c2luZyBXaW5kb3dzIGdldGNoKCkuIiIiCisgICAgaWYgc3lzLnN0ZGluIGlzIG5vdCBzeXMuX19zdGRpbl9fOgorICAgICAgICByZXR1cm4gZmFsbGJhY2tfZ2V0cGFzcyhwcm9tcHQsIHN0cmVhbSkKKyAgICBpbXBvcnQgbXN2Y3J0CisgICAgZm9yIGMgaW4gcHJvbXB0OgorICAgICAgICBtc3ZjcnQucHV0Y2goYykKKyAgICBwdyA9ICIiCisgICAgd2hpbGUgMToKKyAgICAgICAgYyA9IG1zdmNydC5nZXRjaCgpCisgICAgICAgIGlmIGMgPT0gJ1xyJyBvciBjID09ICdcbic6CisgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBjID09ICdcMDAzJzoKKyAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIGlmIGMgPT0gJ1xiJzoKKyAgICAgICAgICAgIHB3ID0gcHdbOi0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHcgPSBwdyArIGMKKyAgICBtc3ZjcnQucHV0Y2goJ1xyJykKKyAgICBtc3ZjcnQucHV0Y2goJ1xuJykKKyAgICByZXR1cm4gcHcKKworCitkZWYgZmFsbGJhY2tfZ2V0cGFzcyhwcm9tcHQ9J1Bhc3N3b3JkOiAnLCBzdHJlYW09Tm9uZSk6CisgICAgd2FybmluZ3Mud2FybigiQ2FuIG5vdCBjb250cm9sIGVjaG8gb24gdGhlIHRlcm1pbmFsLiIsIEdldFBhc3NXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgIGlmIG5vdCBzdHJlYW06CisgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRlcnIKKyAgICBwcmludCA+PnN0cmVhbSwgIldhcm5pbmc6IFBhc3N3b3JkIGlucHV0IG1heSBiZSBlY2hvZWQuIgorICAgIHJldHVybiBfcmF3X2lucHV0KHByb21wdCwgc3RyZWFtKQorCisKK2RlZiBfcmF3X2lucHV0KHByb21wdD0iIiwgc3RyZWFtPU5vbmUsIGlucHV0PU5vbmUpOgorICAgICMgQSByYXdfaW5wdXQoKSByZXBsYWNlbWVudCB0aGF0IGRvZXNuJ3Qgc2F2ZSB0aGUgc3RyaW5nIGluIHRoZQorICAgICMgR05VIHJlYWRsaW5lIGhpc3RvcnkuCisgICAgaWYgbm90IHN0cmVhbToKKyAgICAgICAgc3RyZWFtID0gc3lzLnN0ZGVycgorICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgaW5wdXQgPSBzeXMuc3RkaW4KKyAgICBwcm9tcHQgPSBzdHIocHJvbXB0KQorICAgIGlmIHByb21wdDoKKyAgICAgICAgc3RyZWFtLndyaXRlKHByb21wdCkKKyAgICAgICAgc3RyZWFtLmZsdXNoKCkKKyAgICAjIE5PVEU6IFRoZSBQeXRob24gQyBBUEkgY2FsbHMgZmxvY2tmaWxlKCkgKGFuZCB1bmxvY2spIGR1cmluZyByZWFkbGluZS4KKyAgICBsaW5lID0gaW5wdXQucmVhZGxpbmUoKQorICAgIGlmIG5vdCBsaW5lOgorICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgIGlmIGxpbmVbLTFdID09ICdcbic6CisgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICByZXR1cm4gbGluZQorCisKK2RlZiBnZXR1c2VyKCk6CisgICAgIiIiR2V0IHRoZSB1c2VybmFtZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBvciBwYXNzd29yZCBkYXRhYmFzZS4KKworICAgIEZpcnN0IHRyeSB2YXJpb3VzIGVudmlyb25tZW50IHZhcmlhYmxlcywgdGhlbiB0aGUgcGFzc3dvcmQKKyAgICBkYXRhYmFzZS4gIFRoaXMgd29ya3Mgb24gV2luZG93cyBhcyBsb25nIGFzIFVTRVJOQU1FIGlzIHNldC4KKworICAgICIiIgorCisgICAgaW1wb3J0IG9zCisKKyAgICBmb3IgbmFtZSBpbiAoJ0xPR05BTUUnLCAnVVNFUicsICdMTkFNRScsICdVU0VSTkFNRScpOgorICAgICAgICB1c2VyID0gb3MuZW52aXJvbi5nZXQobmFtZSkKKyAgICAgICAgaWYgdXNlcjoKKyAgICAgICAgICAgIHJldHVybiB1c2VyCisKKyAgICAjIElmIHRoaXMgZmFpbHMsIHRoZSBleGNlcHRpb24gd2lsbCAiZXhwbGFpbiIgd2h5CisgICAgaW1wb3J0IHB3ZAorICAgIHJldHVybiBwd2QuZ2V0cHd1aWQob3MuZ2V0dWlkKCkpWzBdCisKKyMgQmluZCB0aGUgbmFtZSBnZXRwYXNzIHRvIHRoZSBhcHByb3ByaWF0ZSBmdW5jdGlvbgordHJ5OgorICAgIGltcG9ydCB0ZXJtaW9zCisgICAgIyBpdCdzIHBvc3NpYmxlIHRoZXJlIGlzIGFuIGluY29tcGF0aWJsZSB0ZXJtaW9zIGZyb20gdGhlCisgICAgIyBNY01pbGxhbiBJbnN0YWxsZXIsIG1ha2Ugc3VyZSB3ZSBoYXZlIGEgVU5JWC1jb21wYXRpYmxlIHRlcm1pb3MKKyAgICB0ZXJtaW9zLnRjZ2V0YXR0ciwgdGVybWlvcy50Y3NldGF0dHIKK2V4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gRWFzeURpYWxvZ3MgaW1wb3J0IEFza1Bhc3N3b3JkCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGdldHBhc3MgPSBmYWxsYmFja19nZXRwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnZXRwYXNzID0gQXNrUGFzc3dvcmQKKyAgICBlbHNlOgorICAgICAgICBnZXRwYXNzID0gd2luX2dldHBhc3MKK2Vsc2U6CisgICAgZ2V0cGFzcyA9IHVuaXhfZ2V0cGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXRwYXNzLnB5YyBiL2xpYi9weXRob24yLjcvZ2V0cGFzcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjMDJmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0cGFzcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXRwYXNzLnB5byBiL2xpYi9weXRob24yLjcvZ2V0cGFzcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjMDJmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0cGFzcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXR0ZXh0LnB5IGIvbGliL3B5dGhvbjIuNy9nZXR0ZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDc1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dldHRleHQucHkKQEAgLTAsMCArMSw1OTEgQEAKKyIiIkludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGl6YXRpb24gc3VwcG9ydC4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW50ZXJuYXRpb25hbGl6YXRpb24gKEkxOE4pIGFuZCBsb2NhbGl6YXRpb24gKEwxME4pCitzdXBwb3J0IGZvciB5b3VyIFB5dGhvbiBwcm9ncmFtcyBieSBwcm92aWRpbmcgYW4gaW50ZXJmYWNlIHRvIHRoZSBHTlUgZ2V0dGV4dAorbWVzc2FnZSBjYXRhbG9nIGxpYnJhcnkuCisKK0kxOE4gcmVmZXJzIHRvIHRoZSBvcGVyYXRpb24gYnkgd2hpY2ggYSBwcm9ncmFtIGlzIG1hZGUgYXdhcmUgb2YgbXVsdGlwbGUKK2xhbmd1YWdlcy4gIEwxME4gcmVmZXJzIHRvIHRoZSBhZGFwdGF0aW9uIG9mIHlvdXIgcHJvZ3JhbSwgb25jZQoraW50ZXJuYXRpb25hbGl6ZWQsIHRvIHRoZSBsb2NhbCBsYW5ndWFnZSBhbmQgY3VsdHVyYWwgaGFiaXRzLgorCisiIiIKKworIyBUaGlzIG1vZHVsZSByZXByZXNlbnRzIHRoZSBpbnRlZ3JhdGlvbiBvZiB3b3JrLCBjb250cmlidXRpb25zLCBmZWVkYmFjaywgYW5kCisjIHN1Z2dlc3Rpb25zIGZyb20gdGhlIGZvbGxvd2luZyBwZW9wbGU6CisjCisjIE1hcnRpbiB2b24gTG9ld2lzLCB3aG8gd3JvdGUgdGhlIGluaXRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuZGVybHlpbmcKKyMgQy1iYXNlZCBsaWJpbnRsbW9kdWxlIChsYXRlciByZW5hbWVkIF9nZXR0ZXh0KSwgYWxvbmcgd2l0aCBhIHNrZWxldGFsCisjIGdldHRleHQucHkgaW1wbGVtZW50YXRpb24uCisjCisjIFBldGVyIEZ1bmssIHdobyB3cm90ZSBmaW50bC5weSwgYSBmYWlybHkgY29tcGxldGUgd3JhcHBlciBhcm91bmQgaW50bG1vZHVsZSwKKyMgd2hpY2ggYWxzbyBpbmNsdWRlZCBhIHB1cmUtUHl0aG9uIGltcGxlbWVudGF0aW9uIHRvIHJlYWQgLm1vIGZpbGVzIGlmCisjIGludGxtb2R1bGUgd2Fzbid0IGF2YWlsYWJsZS4KKyMKKyMgSmFtZXMgSGVuc3RyaWRnZSwgd2hvIGFsc28gd3JvdGUgYSBnZXR0ZXh0LnB5IG1vZHVsZSwgd2hpY2ggaGFzIHNvbWUKKyMgaW50ZXJlc3RpbmcsIGJ1dCBjdXJyZW50bHkgdW5zdXBwb3J0ZWQgZXhwZXJpbWVudGFsIGZlYXR1cmVzOiB0aGUgbm90aW9uIG9mCisjIGEgQ2F0YWxvZyBjbGFzcyBhbmQgaW5zdGFuY2VzLCBhbmQgdGhlIGFiaWxpdHkgdG8gYWRkIHRvIGEgY2F0YWxvZyBmaWxlIHZpYQorIyBhIFB5dGhvbiBBUEkuCisjCisjIEJhcnJ5IFdhcnNhdyBpbnRlZ3JhdGVkIHRoZXNlIG1vZHVsZXMsIHdyb3RlIHRoZSAuaW5zdGFsbCgpIEFQSSBhbmQgY29kZSwKKyMgYW5kIGNvbmZvcm1lZCBhbGwgQyBhbmQgUHl0aG9uIGNvZGUgdG8gUHl0aG9uJ3MgY29kaW5nIHN0YW5kYXJkcy4KKyMKKyMgRnJhbmNvaXMgUGluYXJkIGFuZCBNYXJjLUFuZHJlIExlbWJ1cmcgYWxzbyBjb250cmlidXRlZCB2YWx1YWJseSB0byB0aGlzCisjIG1vZHVsZS4KKyMKKyMgSi4gRGF2aWQgSWJhbmV6IGltcGxlbWVudGVkIHBsdXJhbCBmb3Jtcy4gQnJ1bm8gSGFpYmxlIGZpeGVkIHNvbWUgYnVncy4KKyMKKyMgVE9ETzoKKyMgLSBMYXp5IGxvYWRpbmcgb2YgLm1vIGZpbGVzLiAgQ3VycmVudGx5IHRoZSBlbnRpcmUgY2F0YWxvZyBpcyBsb2FkZWQgaW50bworIyAgIG1lbW9yeSwgYnV0IHRoYXQncyBwcm9iYWJseSBiYWQgZm9yIGxhcmdlIHRyYW5zbGF0ZWQgcHJvZ3JhbXMuICBJbnN0ZWFkLAorIyAgIHRoZSBsZXhpY2FsIHNvcnQgb2Ygb3JpZ2luYWwgc3RyaW5ncyBpbiBHTlUgLm1vIGZpbGVzIHNob3VsZCBiZSBleHBsb2l0ZWQKKyMgICB0byBkbyBiaW5hcnkgc2VhcmNoZXMgYW5kIGxhenkgaW5pdGlhbGl6YXRpb25zLiAgT3IgeW91IG1pZ2h0IHdhbnQgdG8gdXNlCisjICAgdGhlIHVuZG9jdW1lbnRlZCBkb3VibGUtaGFzaCBhbGdvcml0aG0gZm9yIC5tbyBmaWxlcyB3aXRoIGhhc2ggdGFibGVzLCBidXQKKyMgICB5b3UnbGwgbmVlZCB0byBzdHVkeSB0aGUgR05VIGdldHRleHQgY29kZSB0byBkbyB0aGlzLgorIworIyAtIFN1cHBvcnQgU29sYXJpcyAubW8gZmlsZSBmb3JtYXRzLiAgVW5mb3J0dW5hdGVseSwgd2UndmUgYmVlbiB1bmFibGUgdG8KKyMgICBmaW5kIHRoaXMgZm9ybWF0IGRvY3VtZW50ZWQgYW55d2hlcmUuCisKKworaW1wb3J0IGxvY2FsZSwgY29weSwgb3MsIHJlLCBzdHJ1Y3QsIHN5cworZnJvbSBlcnJubyBpbXBvcnQgRU5PRU5UCisKKworX19hbGxfXyA9IFsnTnVsbFRyYW5zbGF0aW9ucycsICdHTlVUcmFuc2xhdGlvbnMnLCAnQ2F0YWxvZycsCisgICAgICAgICAgICdmaW5kJywgJ3RyYW5zbGF0aW9uJywgJ2luc3RhbGwnLCAndGV4dGRvbWFpbicsICdiaW5kdGV4dGRvbWFpbicsCisgICAgICAgICAgICdkZ2V0dGV4dCcsICdkbmdldHRleHQnLCAnZ2V0dGV4dCcsICduZ2V0dGV4dCcsCisgICAgICAgICAgIF0KKworX2RlZmF1bHRfbG9jYWxlZGlyID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdzaGFyZScsICdsb2NhbGUnKQorCisKK2RlZiB0ZXN0KGNvbmRpdGlvbiwgdHJ1ZSwgZmFsc2UpOgorICAgICIiIgorICAgIEltcGxlbWVudHMgdGhlIEMgZXhwcmVzc2lvbjoKKworICAgICAgY29uZGl0aW9uID8gdHJ1ZSA6IGZhbHNlCisKKyAgICBSZXF1aXJlZCB0byBjb3JyZWN0bHkgaW50ZXJwcmV0IHBsdXJhbCBmb3Jtcy4KKyAgICAiIiIKKyAgICBpZiBjb25kaXRpb246CisgICAgICAgIHJldHVybiB0cnVlCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGZhbHNlCisKKworZGVmIGMycHkocGx1cmFsKToKKyAgICAiIiJHZXRzIGEgQyBleHByZXNzaW9uIGFzIHVzZWQgaW4gUE8gZmlsZXMgZm9yIHBsdXJhbCBmb3JtcyBhbmQgcmV0dXJucyBhCisgICAgUHl0aG9uIGxhbWJkYSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgYW4gZXF1aXZhbGVudCBleHByZXNzaW9uLgorICAgICIiIgorICAgICMgU2VjdXJpdHkgY2hlY2ssIGFsbG93IG9ubHkgdGhlICJuIiBpZGVudGlmaWVyCisgICAgdHJ5OgorICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgaW1wb3J0IHRva2VuLCB0b2tlbml6ZQorICAgIHRva2VucyA9IHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTyhwbHVyYWwpLnJlYWRsaW5lKQorICAgIHRyeToKKyAgICAgICAgZGFuZ2VyID0gW3ggZm9yIHggaW4gdG9rZW5zIGlmIHhbMF0gPT0gdG9rZW4uTkFNRSBhbmQgeFsxXSAhPSAnbiddCisgICAgZXhjZXB0IHRva2VuaXplLlRva2VuRXJyb3I6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgJ3BsdXJhbCBmb3JtcyBleHByZXNzaW9uIGVycm9yLCBtYXliZSB1bmJhbGFuY2VkIHBhcmVudGhlc2lzJworICAgIGVsc2U6CisgICAgICAgIGlmIGRhbmdlcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdwbHVyYWwgZm9ybXMgZXhwcmVzc2lvbiBjb3VsZCBiZSBkYW5nZXJvdXMnCisKKyAgICAjIFJlcGxhY2Ugc29tZSBDIG9wZXJhdG9ycyBieSB0aGVpciBQeXRob24gZXF1aXZhbGVudHMKKyAgICBwbHVyYWwgPSBwbHVyYWwucmVwbGFjZSgnJiYnLCAnIGFuZCAnKQorICAgIHBsdXJhbCA9IHBsdXJhbC5yZXBsYWNlKCd8fCcsICcgb3IgJykKKworICAgIGV4cHIgPSByZS5jb21waWxlKHInXCEoW149XSknKQorICAgIHBsdXJhbCA9IGV4cHIuc3ViKCcgbm90IFxcMScsIHBsdXJhbCkKKworICAgICMgUmVndWxhciBleHByZXNzaW9uIGFuZCByZXBsYWNlbWVudCBmdW5jdGlvbiB1c2VkIHRvIHRyYW5zZm9ybQorICAgICMgImE/YjpjIiB0byAidGVzdChhLGIsYykiLgorICAgIGV4cHIgPSByZS5jb21waWxlKHInKC4qPylcPyguKj8pOiguKiknKQorICAgIGRlZiByZXBsKHgpOgorICAgICAgICByZXR1cm4gInRlc3QoJXMsICVzLCAlcykiICUgKHguZ3JvdXAoMSksIHguZ3JvdXAoMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwci5zdWIocmVwbCwgeC5ncm91cCgzKSkpCisKKyAgICAjIENvZGUgdG8gdHJhbnNmb3JtIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiwgdGFraW5nIGNhcmUgb2YgcGFyZW50aGVzZXMKKyAgICBzdGFjayA9IFsnJ10KKyAgICBmb3IgYyBpbiBwbHVyYWw6CisgICAgICAgIGlmIGMgPT0gJygnOgorICAgICAgICAgICAgc3RhY2suYXBwZW5kKCcnKQorICAgICAgICBlbGlmIGMgPT0gJyknOgorICAgICAgICAgICAgaWYgbGVuKHN0YWNrKSA9PSAxOgorICAgICAgICAgICAgICAgICMgQWN0dWFsbHksIHdlIG5ldmVyIHJlYWNoIHRoaXMgY29kZSwgYmVjYXVzZSB1bmJhbGFuY2VkCisgICAgICAgICAgICAgICAgIyBwYXJlbnRoZXNlcyBnZXQgY2F1Z2h0IGluIHRoZSBzZWN1cml0eSBjaGVjayBhdCB0aGUKKyAgICAgICAgICAgICAgICAjIGJlZ2lubmluZy4KKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAndW5iYWxhbmNlZCBwYXJlbnRoZXNpcyBpbiBwbHVyYWwgZm9ybScKKyAgICAgICAgICAgIHMgPSBleHByLnN1YihyZXBsLCBzdGFjay5wb3AoKSkKKyAgICAgICAgICAgIHN0YWNrWy0xXSArPSAnKCVzKScgJSBzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGFja1stMV0gKz0gYworICAgIHBsdXJhbCA9IGV4cHIuc3ViKHJlcGwsIHN0YWNrLnBvcCgpKQorCisgICAgcmV0dXJuIGV2YWwoJ2xhbWJkYSBuOiBpbnQoJXMpJyAlIHBsdXJhbCkKKworCisKK2RlZiBfZXhwYW5kX2xhbmcobG9jYWxlKToKKyAgICBmcm9tIGxvY2FsZSBpbXBvcnQgbm9ybWFsaXplCisgICAgbG9jYWxlID0gbm9ybWFsaXplKGxvY2FsZSkKKyAgICBDT01QT05FTlRfQ09ERVNFVCAgID0gMSA8PCAwCisgICAgQ09NUE9ORU5UX1RFUlJJVE9SWSA9IDEgPDwgMQorICAgIENPTVBPTkVOVF9NT0RJRklFUiAgPSAxIDw8IDIKKyAgICAjIHNwbGl0IHVwIHRoZSBsb2NhbGUgaW50byBpdHMgYmFzZSBjb21wb25lbnRzCisgICAgbWFzayA9IDAKKyAgICBwb3MgPSBsb2NhbGUuZmluZCgnQCcpCisgICAgaWYgcG9zID49IDA6CisgICAgICAgIG1vZGlmaWVyID0gbG9jYWxlW3BvczpdCisgICAgICAgIGxvY2FsZSA9IGxvY2FsZVs6cG9zXQorICAgICAgICBtYXNrIHw9IENPTVBPTkVOVF9NT0RJRklFUgorICAgIGVsc2U6CisgICAgICAgIG1vZGlmaWVyID0gJycKKyAgICBwb3MgPSBsb2NhbGUuZmluZCgnLicpCisgICAgaWYgcG9zID49IDA6CisgICAgICAgIGNvZGVzZXQgPSBsb2NhbGVbcG9zOl0KKyAgICAgICAgbG9jYWxlID0gbG9jYWxlWzpwb3NdCisgICAgICAgIG1hc2sgfD0gQ09NUE9ORU5UX0NPREVTRVQKKyAgICBlbHNlOgorICAgICAgICBjb2Rlc2V0ID0gJycKKyAgICBwb3MgPSBsb2NhbGUuZmluZCgnXycpCisgICAgaWYgcG9zID49IDA6CisgICAgICAgIHRlcnJpdG9yeSA9IGxvY2FsZVtwb3M6XQorICAgICAgICBsb2NhbGUgPSBsb2NhbGVbOnBvc10KKyAgICAgICAgbWFzayB8PSBDT01QT05FTlRfVEVSUklUT1JZCisgICAgZWxzZToKKyAgICAgICAgdGVycml0b3J5ID0gJycKKyAgICBsYW5ndWFnZSA9IGxvY2FsZQorICAgIHJldCA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UobWFzaysxKToKKyAgICAgICAgaWYgbm90IChpICYgfm1hc2spOiAgIyBpZiBhbGwgY29tcG9uZW50cyBmb3IgdGhpcyBjb21ibyBleGlzdCAuLi4KKyAgICAgICAgICAgIHZhbCA9IGxhbmd1YWdlCisgICAgICAgICAgICBpZiBpICYgQ09NUE9ORU5UX1RFUlJJVE9SWTogdmFsICs9IHRlcnJpdG9yeQorICAgICAgICAgICAgaWYgaSAmIENPTVBPTkVOVF9DT0RFU0VUOiAgIHZhbCArPSBjb2Rlc2V0CisgICAgICAgICAgICBpZiBpICYgQ09NUE9ORU5UX01PRElGSUVSOiAgdmFsICs9IG1vZGlmaWVyCisgICAgICAgICAgICByZXQuYXBwZW5kKHZhbCkKKyAgICByZXQucmV2ZXJzZSgpCisgICAgcmV0dXJuIHJldAorCisKKworY2xhc3MgTnVsbFRyYW5zbGF0aW9uczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnA9Tm9uZSk6CisgICAgICAgIHNlbGYuX2luZm8gPSB7fQorICAgICAgICBzZWxmLl9jaGFyc2V0ID0gTm9uZQorICAgICAgICBzZWxmLl9vdXRwdXRfY2hhcnNldCA9IE5vbmUKKyAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBOb25lCisgICAgICAgIGlmIGZwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fcGFyc2UoZnApCisKKyAgICBkZWYgX3BhcnNlKHNlbGYsIGZwKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGFkZF9mYWxsYmFjayhzZWxmLCBmYWxsYmFjayk6CisgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgc2VsZi5fZmFsbGJhY2suYWRkX2ZhbGxiYWNrKGZhbGxiYWNrKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZmFsbGJhY2sgPSBmYWxsYmFjaworCisgICAgZGVmIGdldHRleHQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLmdldHRleHQobWVzc2FnZSkKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKworICAgIGRlZiBsZ2V0dGV4dChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFsbGJhY2subGdldHRleHQobWVzc2FnZSkKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKworICAgIGRlZiBuZ2V0dGV4dChzZWxmLCBtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLm5nZXR0ZXh0KG1zZ2lkMSwgbXNnaWQyLCBuKQorICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICByZXR1cm4gbXNnaWQxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbXNnaWQyCisKKyAgICBkZWYgbG5nZXR0ZXh0KHNlbGYsIG1zZ2lkMSwgbXNnaWQyLCBuKToKKyAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFsbGJhY2subG5nZXR0ZXh0KG1zZ2lkMSwgbXNnaWQyLCBuKQorICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICByZXR1cm4gbXNnaWQxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbXNnaWQyCisKKyAgICBkZWYgdWdldHRleHQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLnVnZXR0ZXh0KG1lc3NhZ2UpCisgICAgICAgIHJldHVybiB1bmljb2RlKG1lc3NhZ2UpCisKKyAgICBkZWYgdW5nZXR0ZXh0KHNlbGYsIG1zZ2lkMSwgbXNnaWQyLCBuKToKKyAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFsbGJhY2sudW5nZXR0ZXh0KG1zZ2lkMSwgbXNnaWQyLCBuKQorICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShtc2dpZDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShtc2dpZDIpCisKKyAgICBkZWYgaW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2luZm8KKworICAgIGRlZiBjaGFyc2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2hhcnNldAorCisgICAgZGVmIG91dHB1dF9jaGFyc2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fb3V0cHV0X2NoYXJzZXQKKworICAgIGRlZiBzZXRfb3V0cHV0X2NoYXJzZXQoc2VsZiwgY2hhcnNldCk6CisgICAgICAgIHNlbGYuX291dHB1dF9jaGFyc2V0ID0gY2hhcnNldAorCisgICAgZGVmIGluc3RhbGwoc2VsZiwgdW5pY29kZT1GYWxzZSwgbmFtZXM9Tm9uZSk6CisgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICBfX2J1aWx0aW5fXy5fX2RpY3RfX1snXyddID0gdW5pY29kZSBhbmQgc2VsZi51Z2V0dGV4dCBvciBzZWxmLmdldHRleHQKKyAgICAgICAgaWYgaGFzYXR0cihuYW1lcywgIl9fY29udGFpbnNfXyIpOgorICAgICAgICAgICAgaWYgImdldHRleHQiIGluIG5hbWVzOgorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9fLl9fZGljdF9fWydnZXR0ZXh0J10gPSBfX2J1aWx0aW5fXy5fX2RpY3RfX1snXyddCisgICAgICAgICAgICBpZiAibmdldHRleHQiIGluIG5hbWVzOgorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9fLl9fZGljdF9fWyduZ2V0dGV4dCddID0gKHVuaWNvZGUgYW5kIHNlbGYudW5nZXR0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2VsZi5uZ2V0dGV4dCkKKyAgICAgICAgICAgIGlmICJsZ2V0dGV4dCIgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgX19idWlsdGluX18uX19kaWN0X19bJ2xnZXR0ZXh0J10gPSBzZWxmLmxnZXR0ZXh0CisgICAgICAgICAgICBpZiAibG5nZXR0ZXh0IiBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICBfX2J1aWx0aW5fXy5fX2RpY3RfX1snbG5nZXR0ZXh0J10gPSBzZWxmLmxuZ2V0dGV4dAorCisKK2NsYXNzIEdOVVRyYW5zbGF0aW9ucyhOdWxsVHJhbnNsYXRpb25zKToKKyAgICAjIE1hZ2ljIG51bWJlciBvZiAubW8gZmlsZXMKKyAgICBMRV9NQUdJQyA9IDB4OTUwNDEyZGVMCisgICAgQkVfTUFHSUMgPSAweGRlMTIwNDk1TAorCisgICAgZGVmIF9wYXJzZShzZWxmLCBmcCk6CisgICAgICAgICIiIk92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHN1cHBvcnQgYWx0ZXJuYXRpdmUgLm1vIGZvcm1hdHMuIiIiCisgICAgICAgIHVucGFjayA9IHN0cnVjdC51bnBhY2sKKyAgICAgICAgZmlsZW5hbWUgPSBnZXRhdHRyKGZwLCAnbmFtZScsICcnKQorICAgICAgICAjIFBhcnNlIHRoZSAubW8gZmlsZSBoZWFkZXIsIHdoaWNoIGNvbnNpc3RzIG9mIDUgbGl0dGxlIGVuZGlhbiAzMgorICAgICAgICAjIGJpdCB3b3Jkcy4KKyAgICAgICAgc2VsZi5fY2F0YWxvZyA9IGNhdGFsb2cgPSB7fQorICAgICAgICBzZWxmLnBsdXJhbCA9IGxhbWJkYSBuOiBpbnQobiAhPSAxKSAjIGdlcm1hbmljIHBsdXJhbCBieSBkZWZhdWx0CisgICAgICAgIGJ1ZiA9IGZwLnJlYWQoKQorICAgICAgICBidWZsZW4gPSBsZW4oYnVmKQorICAgICAgICAjIEFyZSB3ZSBiaWcgZW5kaWFuIG9yIGxpdHRsZSBlbmRpYW4/CisgICAgICAgIG1hZ2ljID0gdW5wYWNrKCc8SScsIGJ1Zls6NF0pWzBdCisgICAgICAgIGlmIG1hZ2ljID09IHNlbGYuTEVfTUFHSUM6CisgICAgICAgICAgICB2ZXJzaW9uLCBtc2djb3VudCwgbWFzdGVyaWR4LCB0cmFuc2lkeCA9IHVucGFjaygnPDRJJywgYnVmWzQ6MjBdKQorICAgICAgICAgICAgaWkgPSAnPElJJworICAgICAgICBlbGlmIG1hZ2ljID09IHNlbGYuQkVfTUFHSUM6CisgICAgICAgICAgICB2ZXJzaW9uLCBtc2djb3VudCwgbWFzdGVyaWR4LCB0cmFuc2lkeCA9IHVucGFjaygnPjRJJywgYnVmWzQ6MjBdKQorICAgICAgICAgICAgaWkgPSAnPklJJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigwLCAnQmFkIG1hZ2ljIG51bWJlcicsIGZpbGVuYW1lKQorICAgICAgICAjIE5vdyBwdXQgYWxsIG1lc3NhZ2VzIGZyb20gdGhlIC5tbyBmaWxlIGJ1ZmZlciBpbnRvIHRoZSBjYXRhbG9nCisgICAgICAgICMgZGljdGlvbmFyeS4KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDAsIG1zZ2NvdW50KToKKyAgICAgICAgICAgIG1sZW4sIG1vZmYgPSB1bnBhY2soaWksIGJ1ZlttYXN0ZXJpZHg6bWFzdGVyaWR4KzhdKQorICAgICAgICAgICAgbWVuZCA9IG1vZmYgKyBtbGVuCisgICAgICAgICAgICB0bGVuLCB0b2ZmID0gdW5wYWNrKGlpLCBidWZbdHJhbnNpZHg6dHJhbnNpZHgrOF0pCisgICAgICAgICAgICB0ZW5kID0gdG9mZiArIHRsZW4KKyAgICAgICAgICAgIGlmIG1lbmQgPCBidWZsZW4gYW5kIHRlbmQgPCBidWZsZW46CisgICAgICAgICAgICAgICAgbXNnID0gYnVmW21vZmY6bWVuZF0KKyAgICAgICAgICAgICAgICB0bXNnID0gYnVmW3RvZmY6dGVuZF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigwLCAnRmlsZSBpcyBjb3JydXB0JywgZmlsZW5hbWUpCisgICAgICAgICAgICAjIFNlZSBpZiB3ZSdyZSBsb29raW5nIGF0IEdOVSAubW8gY29udmVudGlvbnMgZm9yIG1ldGFkYXRhCisgICAgICAgICAgICBpZiBtbGVuID09IDA6CisgICAgICAgICAgICAgICAgIyBDYXRhbG9nIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgbGFzdGsgPSBrID0gTm9uZQorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHRtc2cuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gaXRlbS5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpdGVtOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgJzonIGluIGl0ZW06CisgICAgICAgICAgICAgICAgICAgICAgICBrLCB2ID0gaXRlbS5zcGxpdCgnOicsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBrID0gay5zdHJpcCgpLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSB2LnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luZm9ba10gPSB2CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ayA9IGsKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBsYXN0azoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luZm9bbGFzdGtdICs9ICdcbicgKyBpdGVtCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPT0gJ2NvbnRlbnQtdHlwZSc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGFyc2V0ID0gdi5zcGxpdCgnY2hhcnNldD0nKVsxXQorICAgICAgICAgICAgICAgICAgICBlbGlmIGsgPT0gJ3BsdXJhbC1mb3Jtcyc6CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gdi5zcGxpdCgnOycpCisgICAgICAgICAgICAgICAgICAgICAgICBwbHVyYWwgPSB2WzFdLnNwbGl0KCdwbHVyYWw9JylbMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGx1cmFsID0gYzJweShwbHVyYWwpCisgICAgICAgICAgICAjIE5vdGU6IHdlIHVuY29uZGl0aW9uYWxseSBjb252ZXJ0IGJvdGggbXNnaWRzIGFuZCBtc2dzdHJzIHRvCisgICAgICAgICAgICAjIFVuaWNvZGUgdXNpbmcgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBzcGVjaWZpZWQgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgICAgICMgcGFyYW1ldGVyIG9mIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyLiAgVGhlIGdldHRleHQgZG9jdW1lbnRhdGlvbgorICAgICAgICAgICAgIyBzdHJvbmdseSBlbmNvdXJhZ2VzIG1zZ2lkcyB0byBiZSB1cy1hc2NpaSwgYnV0IHNvbWUgYXBwbGljYXRpb25zCisgICAgICAgICAgICAjIHJlcXVpcmUgYWx0ZXJuYXRpdmUgZW5jb2RpbmdzIChlLmcuIFpvcGUncyBaQ01MIGFuZCBaUFQpLiAgRm9yCisgICAgICAgICAgICAjIHRyYWRpdGlvbmFsIGdldHRleHQgYXBwbGljYXRpb25zLCB0aGUgbXNnaWQgY29udmVyc2lvbiB3aWxsCisgICAgICAgICAgICAjIGNhdXNlIG5vIHByb2JsZW1zIHNpbmNlIHVzLWFzY2lpIHNob3VsZCBhbHdheXMgYmUgYSBzdWJzZXQgb2YKKyAgICAgICAgICAgICMgdGhlIGNoYXJzZXQgZW5jb2RpbmcuICBXZSBtYXkgd2FudCB0byBmYWxsIGJhY2sgdG8gOC1iaXQgbXNnaWRzCisgICAgICAgICAgICAjIGlmIHRoZSBVbmljb2RlIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICAgICAgICBpZiAnXHgwMCcgaW4gbXNnOgorICAgICAgICAgICAgICAgICMgUGx1cmFsIGZvcm1zCisgICAgICAgICAgICAgICAgbXNnaWQxLCBtc2dpZDIgPSBtc2cuc3BsaXQoJ1x4MDAnKQorICAgICAgICAgICAgICAgIHRtc2cgPSB0bXNnLnNwbGl0KCdceDAwJykKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9jaGFyc2V0OgorICAgICAgICAgICAgICAgICAgICBtc2dpZDEgPSB1bmljb2RlKG1zZ2lkMSwgc2VsZi5fY2hhcnNldCkKKyAgICAgICAgICAgICAgICAgICAgdG1zZyA9IFt1bmljb2RlKHgsIHNlbGYuX2NoYXJzZXQpIGZvciB4IGluIHRtc2ddCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHRtc2cpKToKKyAgICAgICAgICAgICAgICAgICAgY2F0YWxvZ1sobXNnaWQxLCBpKV0gPSB0bXNnW2ldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2NoYXJzZXQ6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IHVuaWNvZGUobXNnLCBzZWxmLl9jaGFyc2V0KQorICAgICAgICAgICAgICAgICAgICB0bXNnID0gdW5pY29kZSh0bXNnLCBzZWxmLl9jaGFyc2V0KQorICAgICAgICAgICAgICAgIGNhdGFsb2dbbXNnXSA9IHRtc2cKKyAgICAgICAgICAgICMgYWR2YW5jZSB0byBuZXh0IGVudHJ5IGluIHRoZSBzZWVrIHRhYmxlcworICAgICAgICAgICAgbWFzdGVyaWR4ICs9IDgKKyAgICAgICAgICAgIHRyYW5zaWR4ICs9IDgKKworICAgIGRlZiBnZXR0ZXh0KHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKKyAgICAgICAgdG1zZyA9IHNlbGYuX2NhdGFsb2cuZ2V0KG1lc3NhZ2UsIG1pc3NpbmcpCisgICAgICAgIGlmIHRtc2cgaXMgbWlzc2luZzoKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWxsYmFjay5nZXR0ZXh0KG1lc3NhZ2UpCisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZQorICAgICAgICAjIEVuY29kZSB0aGUgVW5pY29kZSB0bXNnIGJhY2sgdG8gYW4gOC1iaXQgc3RyaW5nLCBpZiBwb3NzaWJsZQorICAgICAgICBpZiBzZWxmLl9vdXRwdXRfY2hhcnNldDoKKyAgICAgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShzZWxmLl9vdXRwdXRfY2hhcnNldCkKKyAgICAgICAgZWxpZiBzZWxmLl9jaGFyc2V0OgorICAgICAgICAgICAgcmV0dXJuIHRtc2cuZW5jb2RlKHNlbGYuX2NoYXJzZXQpCisgICAgICAgIHJldHVybiB0bXNnCisKKyAgICBkZWYgbGdldHRleHQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIG1pc3NpbmcgPSBvYmplY3QoKQorICAgICAgICB0bXNnID0gc2VsZi5fY2F0YWxvZy5nZXQobWVzc2FnZSwgbWlzc2luZykKKyAgICAgICAgaWYgdG1zZyBpcyBtaXNzaW5nOgorICAgICAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLmxnZXR0ZXh0KG1lc3NhZ2UpCisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZQorICAgICAgICBpZiBzZWxmLl9vdXRwdXRfY2hhcnNldDoKKyAgICAgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShzZWxmLl9vdXRwdXRfY2hhcnNldCkKKyAgICAgICAgcmV0dXJuIHRtc2cuZW5jb2RlKGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZygpKQorCisgICAgZGVmIG5nZXR0ZXh0KHNlbGYsIG1zZ2lkMSwgbXNnaWQyLCBuKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG1zZyA9IHNlbGYuX2NhdGFsb2dbKG1zZ2lkMSwgc2VsZi5wbHVyYWwobikpXQorICAgICAgICAgICAgaWYgc2VsZi5fb3V0cHV0X2NoYXJzZXQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRtc2cuZW5jb2RlKHNlbGYuX291dHB1dF9jaGFyc2V0KQorICAgICAgICAgICAgZWxpZiBzZWxmLl9jaGFyc2V0OgorICAgICAgICAgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShzZWxmLl9jaGFyc2V0KQorICAgICAgICAgICAgcmV0dXJuIHRtc2cKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLm5nZXR0ZXh0KG1zZ2lkMSwgbXNnaWQyLCBuKQorICAgICAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBtc2dpZDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMgorCisgICAgZGVmIGxuZ2V0dGV4dChzZWxmLCBtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRtc2cgPSBzZWxmLl9jYXRhbG9nWyhtc2dpZDEsIHNlbGYucGx1cmFsKG4pKV0KKyAgICAgICAgICAgIGlmIHNlbGYuX291dHB1dF9jaGFyc2V0OgorICAgICAgICAgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShzZWxmLl9vdXRwdXRfY2hhcnNldCkKKyAgICAgICAgICAgIHJldHVybiB0bXNnLmVuY29kZShsb2NhbGUuZ2V0cHJlZmVycmVkZW5jb2RpbmcoKSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5fZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZhbGxiYWNrLmxuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikKKyAgICAgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gbXNnaWQxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBtc2dpZDIKKworICAgIGRlZiB1Z2V0dGV4dChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCisgICAgICAgIHRtc2cgPSBzZWxmLl9jYXRhbG9nLmdldChtZXNzYWdlLCBtaXNzaW5nKQorICAgICAgICBpZiB0bXNnIGlzIG1pc3Npbmc6CisgICAgICAgICAgICBpZiBzZWxmLl9mYWxsYmFjazoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFsbGJhY2sudWdldHRleHQobWVzc2FnZSkKKyAgICAgICAgICAgIHJldHVybiB1bmljb2RlKG1lc3NhZ2UpCisgICAgICAgIHJldHVybiB0bXNnCisKKyAgICBkZWYgdW5nZXR0ZXh0KHNlbGYsIG1zZ2lkMSwgbXNnaWQyLCBuKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdG1zZyA9IHNlbGYuX2NhdGFsb2dbKG1zZ2lkMSwgc2VsZi5wbHVyYWwobikpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBpZiBzZWxmLl9mYWxsYmFjazoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmFsbGJhY2sudW5nZXR0ZXh0KG1zZ2lkMSwgbXNnaWQyLCBuKQorICAgICAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgICAgIHRtc2cgPSB1bmljb2RlKG1zZ2lkMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdG1zZyA9IHVuaWNvZGUobXNnaWQyKQorICAgICAgICByZXR1cm4gdG1zZworCisKKyMgTG9jYXRlIGEgLm1vIGZpbGUgdXNpbmcgdGhlIGdldHRleHQgc3RyYXRlZ3kKK2RlZiBmaW5kKGRvbWFpbiwgbG9jYWxlZGlyPU5vbmUsIGxhbmd1YWdlcz1Ob25lLCBhbGw9MCk6CisgICAgIyBHZXQgc29tZSByZWFzb25hYmxlIGRlZmF1bHRzIGZvciBhcmd1bWVudHMgdGhhdCB3ZXJlIG5vdCBzdXBwbGllZAorICAgIGlmIGxvY2FsZWRpciBpcyBOb25lOgorICAgICAgICBsb2NhbGVkaXIgPSBfZGVmYXVsdF9sb2NhbGVkaXIKKyAgICBpZiBsYW5ndWFnZXMgaXMgTm9uZToKKyAgICAgICAgbGFuZ3VhZ2VzID0gW10KKyAgICAgICAgZm9yIGVudmFyIGluICgnTEFOR1VBR0UnLCAnTENfQUxMJywgJ0xDX01FU1NBR0VTJywgJ0xBTkcnKToKKyAgICAgICAgICAgIHZhbCA9IG9zLmVudmlyb24uZ2V0KGVudmFyKQorICAgICAgICAgICAgaWYgdmFsOgorICAgICAgICAgICAgICAgIGxhbmd1YWdlcyA9IHZhbC5zcGxpdCgnOicpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgJ0MnIG5vdCBpbiBsYW5ndWFnZXM6CisgICAgICAgICAgICBsYW5ndWFnZXMuYXBwZW5kKCdDJykKKyAgICAjIG5vdyBub3JtYWxpemUgYW5kIGV4cGFuZCB0aGUgbGFuZ3VhZ2VzCisgICAgbmVsYW5ncyA9IFtdCisgICAgZm9yIGxhbmcgaW4gbGFuZ3VhZ2VzOgorICAgICAgICBmb3IgbmVsYW5nIGluIF9leHBhbmRfbGFuZyhsYW5nKToKKyAgICAgICAgICAgIGlmIG5lbGFuZyBub3QgaW4gbmVsYW5nczoKKyAgICAgICAgICAgICAgICBuZWxhbmdzLmFwcGVuZChuZWxhbmcpCisgICAgIyBzZWxlY3QgYSBsYW5ndWFnZQorICAgIGlmIGFsbDoKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICBlbHNlOgorICAgICAgICByZXN1bHQgPSBOb25lCisgICAgZm9yIGxhbmcgaW4gbmVsYW5nczoKKyAgICAgICAgaWYgbGFuZyA9PSAnQyc6CisgICAgICAgICAgICBicmVhaworICAgICAgICBtb2ZpbGUgPSBvcy5wYXRoLmpvaW4obG9jYWxlZGlyLCBsYW5nLCAnTENfTUVTU0FHRVMnLCAnJXMubW8nICUgZG9tYWluKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhtb2ZpbGUpOgorICAgICAgICAgICAgaWYgYWxsOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobW9maWxlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbW9maWxlCisgICAgcmV0dXJuIHJlc3VsdAorCisKKworIyBhIG1hcHBpbmcgYmV0d2VlbiBhYnNvbHV0ZSAubW8gZmlsZSBwYXRoIGFuZCBUcmFuc2xhdGlvbiBvYmplY3QKK190cmFuc2xhdGlvbnMgPSB7fQorCitkZWYgdHJhbnNsYXRpb24oZG9tYWluLCBsb2NhbGVkaXI9Tm9uZSwgbGFuZ3VhZ2VzPU5vbmUsCisgICAgICAgICAgICAgICAgY2xhc3NfPU5vbmUsIGZhbGxiYWNrPUZhbHNlLCBjb2Rlc2V0PU5vbmUpOgorICAgIGlmIGNsYXNzXyBpcyBOb25lOgorICAgICAgICBjbGFzc18gPSBHTlVUcmFuc2xhdGlvbnMKKyAgICBtb2ZpbGVzID0gZmluZChkb21haW4sIGxvY2FsZWRpciwgbGFuZ3VhZ2VzLCBhbGw9MSkKKyAgICBpZiBub3QgbW9maWxlczoKKyAgICAgICAgaWYgZmFsbGJhY2s6CisgICAgICAgICAgICByZXR1cm4gTnVsbFRyYW5zbGF0aW9ucygpCisgICAgICAgIHJhaXNlIElPRXJyb3IoRU5PRU5ULCAnTm8gdHJhbnNsYXRpb24gZmlsZSBmb3VuZCBmb3IgZG9tYWluJywgZG9tYWluKQorICAgICMgQXZvaWQgb3BlbmluZywgcmVhZGluZywgYW5kIHBhcnNpbmcgdGhlIC5tbyBmaWxlIGFmdGVyIGl0J3MgYmVlbiBkb25lCisgICAgIyBvbmNlLgorICAgIHJlc3VsdCA9IE5vbmUKKyAgICBmb3IgbW9maWxlIGluIG1vZmlsZXM6CisgICAgICAgIGtleSA9IChjbGFzc18sIG9zLnBhdGguYWJzcGF0aChtb2ZpbGUpKQorICAgICAgICB0ID0gX3RyYW5zbGF0aW9ucy5nZXQoa2V5KQorICAgICAgICBpZiB0IGlzIE5vbmU6CisgICAgICAgICAgICB3aXRoIG9wZW4obW9maWxlLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgICAgICB0ID0gX3RyYW5zbGF0aW9ucy5zZXRkZWZhdWx0KGtleSwgY2xhc3NfKGZwKSkKKyAgICAgICAgIyBDb3B5IHRoZSB0cmFuc2xhdGlvbiBvYmplY3QgdG8gYWxsb3cgc2V0dGluZyBmYWxsYmFja3MgYW5kCisgICAgICAgICMgb3V0cHV0IGNoYXJzZXQuIEFsbCBvdGhlciBpbnN0YW5jZSBkYXRhIGlzIHNoYXJlZCB3aXRoIHRoZQorICAgICAgICAjIGNhY2hlZCBvYmplY3QuCisgICAgICAgIHQgPSBjb3B5LmNvcHkodCkKKyAgICAgICAgaWYgY29kZXNldDoKKyAgICAgICAgICAgIHQuc2V0X291dHB1dF9jaGFyc2V0KGNvZGVzZXQpCisgICAgICAgIGlmIHJlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgcmVzdWx0ID0gdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0LmFkZF9mYWxsYmFjayh0KQorICAgIHJldHVybiByZXN1bHQKKworCitkZWYgaW5zdGFsbChkb21haW4sIGxvY2FsZWRpcj1Ob25lLCB1bmljb2RlPUZhbHNlLCBjb2Rlc2V0PU5vbmUsIG5hbWVzPU5vbmUpOgorICAgIHQgPSB0cmFuc2xhdGlvbihkb21haW4sIGxvY2FsZWRpciwgZmFsbGJhY2s9VHJ1ZSwgY29kZXNldD1jb2Rlc2V0KQorICAgIHQuaW5zdGFsbCh1bmljb2RlLCBuYW1lcykKKworCisKKyMgYSBtYXBwaW5nIGIvdyBkb21haW5zIGFuZCBsb2NhbGUgZGlyZWN0b3JpZXMKK19sb2NhbGVkaXJzID0ge30KKyMgYSBtYXBwaW5nIGIvdyBkb21haW5zIGFuZCBjb2Rlc2V0cworX2xvY2FsZWNvZGVzZXRzID0ge30KKyMgY3VycmVudCBnbG9iYWwgZG9tYWluLCBgbWVzc2FnZXMnIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgdy8gR05VIGdldHRleHQKK19jdXJyZW50X2RvbWFpbiA9ICdtZXNzYWdlcycKKworCitkZWYgdGV4dGRvbWFpbihkb21haW49Tm9uZSk6CisgICAgZ2xvYmFsIF9jdXJyZW50X2RvbWFpbgorICAgIGlmIGRvbWFpbiBpcyBub3QgTm9uZToKKyAgICAgICAgX2N1cnJlbnRfZG9tYWluID0gZG9tYWluCisgICAgcmV0dXJuIF9jdXJyZW50X2RvbWFpbgorCisKK2RlZiBiaW5kdGV4dGRvbWFpbihkb21haW4sIGxvY2FsZWRpcj1Ob25lKToKKyAgICBnbG9iYWwgX2xvY2FsZWRpcnMKKyAgICBpZiBsb2NhbGVkaXIgaXMgbm90IE5vbmU6CisgICAgICAgIF9sb2NhbGVkaXJzW2RvbWFpbl0gPSBsb2NhbGVkaXIKKyAgICByZXR1cm4gX2xvY2FsZWRpcnMuZ2V0KGRvbWFpbiwgX2RlZmF1bHRfbG9jYWxlZGlyKQorCisKK2RlZiBiaW5kX3RleHRkb21haW5fY29kZXNldChkb21haW4sIGNvZGVzZXQ9Tm9uZSk6CisgICAgZ2xvYmFsIF9sb2NhbGVjb2Rlc2V0cworICAgIGlmIGNvZGVzZXQgaXMgbm90IE5vbmU6CisgICAgICAgIF9sb2NhbGVjb2Rlc2V0c1tkb21haW5dID0gY29kZXNldAorICAgIHJldHVybiBfbG9jYWxlY29kZXNldHMuZ2V0KGRvbWFpbikKKworCitkZWYgZGdldHRleHQoZG9tYWluLCBtZXNzYWdlKToKKyAgICB0cnk6CisgICAgICAgIHQgPSB0cmFuc2xhdGlvbihkb21haW4sIF9sb2NhbGVkaXJzLmdldChkb21haW4sIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29kZXNldD1fbG9jYWxlY29kZXNldHMuZ2V0KGRvbWFpbikpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBtZXNzYWdlCisgICAgcmV0dXJuIHQuZ2V0dGV4dChtZXNzYWdlKQorCitkZWYgbGRnZXR0ZXh0KGRvbWFpbiwgbWVzc2FnZSk6CisgICAgdHJ5OgorICAgICAgICB0ID0gdHJhbnNsYXRpb24oZG9tYWluLCBfbG9jYWxlZGlycy5nZXQoZG9tYWluLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQ9X2xvY2FsZWNvZGVzZXRzLmdldChkb21haW4pKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gbWVzc2FnZQorICAgIHJldHVybiB0LmxnZXR0ZXh0KG1lc3NhZ2UpCisKK2RlZiBkbmdldHRleHQoZG9tYWluLCBtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgdHJ5OgorICAgICAgICB0ID0gdHJhbnNsYXRpb24oZG9tYWluLCBfbG9jYWxlZGlycy5nZXQoZG9tYWluLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVzZXQ9X2xvY2FsZWNvZGVzZXRzLmdldChkb21haW4pKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICByZXR1cm4gbXNnaWQxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbXNnaWQyCisgICAgcmV0dXJuIHQubmdldHRleHQobXNnaWQxLCBtc2dpZDIsIG4pCisKK2RlZiBsZG5nZXR0ZXh0KGRvbWFpbiwgbXNnaWQxLCBtc2dpZDIsIG4pOgorICAgIHRyeToKKyAgICAgICAgdCA9IHRyYW5zbGF0aW9uKGRvbWFpbiwgX2xvY2FsZWRpcnMuZ2V0KGRvbWFpbiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb2Rlc2V0PV9sb2NhbGVjb2Rlc2V0cy5nZXQoZG9tYWluKSkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgaWYgbiA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG1zZ2lkMgorICAgIHJldHVybiB0LmxuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbikKKworZGVmIGdldHRleHQobWVzc2FnZSk6CisgICAgcmV0dXJuIGRnZXR0ZXh0KF9jdXJyZW50X2RvbWFpbiwgbWVzc2FnZSkKKworZGVmIGxnZXR0ZXh0KG1lc3NhZ2UpOgorICAgIHJldHVybiBsZGdldHRleHQoX2N1cnJlbnRfZG9tYWluLCBtZXNzYWdlKQorCitkZWYgbmdldHRleHQobXNnaWQxLCBtc2dpZDIsIG4pOgorICAgIHJldHVybiBkbmdldHRleHQoX2N1cnJlbnRfZG9tYWluLCBtc2dpZDEsIG1zZ2lkMiwgbikKKworZGVmIGxuZ2V0dGV4dChtc2dpZDEsIG1zZ2lkMiwgbik6CisgICAgcmV0dXJuIGxkbmdldHRleHQoX2N1cnJlbnRfZG9tYWluLCBtc2dpZDEsIG1zZ2lkMiwgbikKKworIyBkY2dldHRleHQoKSBoYXMgYmVlbiBkZWVtZWQgdW5uZWNlc3NhcnkgYW5kIGlzIG5vdCBpbXBsZW1lbnRlZC4KKworIyBKYW1lcyBIZW5zdHJpZGdlJ3MgQ2F0YWxvZyBjb25zdHJ1Y3RvciBmcm9tIEdOT01FIGdldHRleHQuICBEb2N1bWVudGVkIHVzYWdlCisjIHdhczoKKyMKKyMgICAgaW1wb3J0IGdldHRleHQKKyMgICAgY2F0ID0gZ2V0dGV4dC5DYXRhbG9nKFBBQ0tBR0UsIGxvY2FsZWRpcj1MT0NBTEVESVIpCisjICAgIF8gPSBjYXQuZ2V0dGV4dAorIyAgICBwcmludCBfKCdIZWxsbyBXb3JsZCcpCisKKyMgVGhlIHJlc3VsdGluZyBjYXRhbG9nIG9iamVjdCBjdXJyZW50bHkgZG9uJ3Qgc3VwcG9ydCBhY2Nlc3MgdGhyb3VnaCBhCisjIGRpY3Rpb25hcnkgQVBJLCB3aGljaCB3YXMgc3VwcG9ydGVkIChidXQgYXBwYXJlbnRseSB1bnVzZWQpIGluIEdOT01FCisjIGdldHRleHQuCisKK0NhdGFsb2cgPSB0cmFuc2xhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXR0ZXh0LnB5YyBiL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiYjdmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nZXR0ZXh0LnB5byBiL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZiYjdmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ2V0dGV4dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nbG9iLnB5IGIvbGliL3B5dGhvbjIuNy9nbG9iLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDUzNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2dsb2IucHkKQEAgLTAsMCArMSw5NSBAQAorIiIiRmlsZW5hbWUgZ2xvYmJpbmcgdXRpbGl0eS4iIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBmbm1hdGNoCisKK3RyeToKKyAgICBfdW5pY29kZSA9IHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBJZiBQeXRob24gaXMgYnVpbHQgd2l0aG91dCBVbmljb2RlIHN1cHBvcnQsIHRoZSB1bmljb2RlIHR5cGUKKyAgICAjIHdpbGwgbm90IGV4aXN0LiBGYWtlIG9uZS4KKyAgICBjbGFzcyBfdW5pY29kZShvYmplY3QpOgorICAgICAgICBwYXNzCisKK19fYWxsX18gPSBbImdsb2IiLCAiaWdsb2IiXQorCitkZWYgZ2xvYihwYXRobmFtZSk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBwYXRocyBtYXRjaGluZyBhIHBhdGhuYW1lIHBhdHRlcm4uCisKKyAgICBUaGUgcGF0dGVybiBtYXkgY29udGFpbiBzaW1wbGUgc2hlbGwtc3R5bGUgd2lsZGNhcmRzIGEgbGEKKyAgICBmbm1hdGNoLiBIb3dldmVyLCB1bmxpa2UgZm5tYXRjaCwgZmlsZW5hbWVzIHN0YXJ0aW5nIHdpdGggYQorICAgIGRvdCBhcmUgc3BlY2lhbCBjYXNlcyB0aGF0IGFyZSBub3QgbWF0Y2hlZCBieSAnKicgYW5kICc/JworICAgIHBhdHRlcm5zLgorCisgICAgIiIiCisgICAgcmV0dXJuIGxpc3QoaWdsb2IocGF0aG5hbWUpKQorCitkZWYgaWdsb2IocGF0aG5hbWUpOgorICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB3aGljaCB5aWVsZHMgdGhlIHBhdGhzIG1hdGNoaW5nIGEgcGF0aG5hbWUgcGF0dGVybi4KKworICAgIFRoZSBwYXR0ZXJuIG1heSBjb250YWluIHNpbXBsZSBzaGVsbC1zdHlsZSB3aWxkY2FyZHMgYSBsYQorICAgIGZubWF0Y2guIEhvd2V2ZXIsIHVubGlrZSBmbm1hdGNoLCBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCBhCisgICAgZG90IGFyZSBzcGVjaWFsIGNhc2VzIHRoYXQgYXJlIG5vdCBtYXRjaGVkIGJ5ICcqJyBhbmQgJz8nCisgICAgcGF0dGVybnMuCisKKyAgICAiIiIKKyAgICBpZiBub3QgaGFzX21hZ2ljKHBhdGhuYW1lKToKKyAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHBhdGhuYW1lKToKKyAgICAgICAgICAgIHlpZWxkIHBhdGhuYW1lCisgICAgICAgIHJldHVybgorICAgIGRpcm5hbWUsIGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChwYXRobmFtZSkKKyAgICBpZiBub3QgZGlybmFtZToKKyAgICAgICAgZm9yIG5hbWUgaW4gZ2xvYjEob3MuY3VyZGlyLCBiYXNlbmFtZSk6CisgICAgICAgICAgICB5aWVsZCBuYW1lCisgICAgICAgIHJldHVybgorICAgICMgYG9zLnBhdGguc3BsaXQoKWAgcmV0dXJucyB0aGUgYXJndW1lbnQgaXRzZWxmIGFzIGEgZGlybmFtZSBpZiBpdCBpcyBhCisgICAgIyBkcml2ZSBvciBVTkMgcGF0aC4gIFByZXZlbnQgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgZHJpdmUgb3IgVU5DIHBhdGgKKyAgICAjIGNvbnRhaW5zIG1hZ2ljIGNoYXJhY3RlcnMgKGkuZS4gcidcXD9cQzonKS4KKyAgICBpZiBkaXJuYW1lICE9IHBhdGhuYW1lIGFuZCBoYXNfbWFnaWMoZGlybmFtZSk6CisgICAgICAgIGRpcnMgPSBpZ2xvYihkaXJuYW1lKQorICAgIGVsc2U6CisgICAgICAgIGRpcnMgPSBbZGlybmFtZV0KKyAgICBpZiBoYXNfbWFnaWMoYmFzZW5hbWUpOgorICAgICAgICBnbG9iX2luX2RpciA9IGdsb2IxCisgICAgZWxzZToKKyAgICAgICAgZ2xvYl9pbl9kaXIgPSBnbG9iMAorICAgIGZvciBkaXJuYW1lIGluIGRpcnM6CisgICAgICAgIGZvciBuYW1lIGluIGdsb2JfaW5fZGlyKGRpcm5hbWUsIGJhc2VuYW1lKToKKyAgICAgICAgICAgIHlpZWxkIG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKQorCisjIFRoZXNlIDIgaGVscGVyIGZ1bmN0aW9ucyBub24tcmVjdXJzaXZlbHkgZ2xvYiBpbnNpZGUgYSBsaXRlcmFsIGRpcmVjdG9yeS4KKyMgVGhleSByZXR1cm4gYSBsaXN0IG9mIGJhc2VuYW1lcy4gYGdsb2IxYCBhY2NlcHRzIGEgcGF0dGVybiB3aGlsZSBgZ2xvYjBgCisjIHRha2VzIGEgbGl0ZXJhbCBiYXNlbmFtZSAoc28gaXQgb25seSBoYXMgdG8gY2hlY2sgZm9yIGl0cyBleGlzdGVuY2UpLgorCitkZWYgZ2xvYjEoZGlybmFtZSwgcGF0dGVybik6CisgICAgaWYgbm90IGRpcm5hbWU6CisgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIKKyAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm4sIF91bmljb2RlKSBhbmQgbm90IGlzaW5zdGFuY2UoZGlybmFtZSwgdW5pY29kZSk6CisgICAgICAgIGRpcm5hbWUgPSB1bmljb2RlKGRpcm5hbWUsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkpCisgICAgdHJ5OgorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHJldHVybiBbXQorICAgIGlmIHBhdHRlcm5bMF0gIT0gJy4nOgorICAgICAgICBuYW1lcyA9IGZpbHRlcihsYW1iZGEgeDogeFswXSAhPSAnLicsIG5hbWVzKQorICAgIHJldHVybiBmbm1hdGNoLmZpbHRlcihuYW1lcywgcGF0dGVybikKKworZGVmIGdsb2IwKGRpcm5hbWUsIGJhc2VuYW1lKToKKyAgICBpZiBiYXNlbmFtZSA9PSAnJzoKKyAgICAgICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIGFuIGVtcHR5IGJhc2VuYW1lIGZvciBwYXRocyBlbmRpbmcgd2l0aCBhCisgICAgICAgICMgZGlyZWN0b3J5IHNlcGFyYXRvci4gICdxKngvJyBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3Rvcmllcy4KKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBbYmFzZW5hbWVdCisgICAgZWxzZToKKyAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKG9zLnBhdGguam9pbihkaXJuYW1lLCBiYXNlbmFtZSkpOgorICAgICAgICAgICAgcmV0dXJuIFtiYXNlbmFtZV0KKyAgICByZXR1cm4gW10KKworCittYWdpY19jaGVjayA9IHJlLmNvbXBpbGUoJ1sqP1tdJykKKworZGVmIGhhc19tYWdpYyhzKToKKyAgICByZXR1cm4gbWFnaWNfY2hlY2suc2VhcmNoKHMpIGlzIG5vdCBOb25lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2dsb2IucHljIGIvbGliL3B5dGhvbjIuNy9nbG9iLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk5ZjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nbG9iLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2dsb2IucHlvIGIvbGliL3B5dGhvbjIuNy9nbG9iLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk5ZjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9nbG9iLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2d6aXAucHkgYi9saWIvcHl0aG9uMi43L2d6aXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxM2JhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ3ppcC5weQpAQCAtMCwwICsxLDUxOCBAQAorIiIiRnVuY3Rpb25zIHRoYXQgcmVhZCBhbmQgd3JpdGUgZ3ppcHBlZCBmaWxlcy4KKworVGhlIHVzZXIgb2YgdGhlIGZpbGUgZG9lc24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBjb21wcmVzc2lvbiwKK2J1dCByYW5kb20gYWNjZXNzIGlzIG5vdCBhbGxvd2VkLiIiIgorCisjIGJhc2VkIG9uIEFuZHJldyBLdWNobGluZydzIG1pbmlnemlwLnB5IGRpc3RyaWJ1dGVkIHdpdGggdGhlIHpsaWIgbW9kdWxlCisKK2ltcG9ydCBzdHJ1Y3QsIHN5cywgdGltZSwgb3MKK2ltcG9ydCB6bGliCitpbXBvcnQgaW8KK2ltcG9ydCBfX2J1aWx0aW5fXworCitfX2FsbF9fID0gWyJHemlwRmlsZSIsIm9wZW4iXQorCitGVEVYVCwgRkhDUkMsIEZFWFRSQSwgRk5BTUUsIEZDT01NRU5UID0gMSwgMiwgNCwgOCwgMTYKKworUkVBRCwgV1JJVEUgPSAxLCAyCisKK2RlZiB3cml0ZTMydShvdXRwdXQsIHZhbHVlKToKKyAgICAjIFRoZSBMIGZvcm1hdCB3cml0ZXMgdGhlIGJpdCBwYXR0ZXJuIGNvcnJlY3RseSB3aGV0aGVyIHNpZ25lZAorICAgICMgb3IgdW5zaWduZWQuCisgICAgb3V0cHV0LndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHZhbHVlKSkKKworZGVmIHJlYWQzMihpbnB1dCk6CisgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soIjxJIiwgaW5wdXQucmVhZCg0KSlbMF0KKworZGVmIG9wZW4oZmlsZW5hbWUsIG1vZGU9InJiIiwgY29tcHJlc3NsZXZlbD05KToKKyAgICAiIiJTaG9ydGhhbmQgZm9yIEd6aXBGaWxlKGZpbGVuYW1lLCBtb2RlLCBjb21wcmVzc2xldmVsKS4KKworICAgIFRoZSBmaWxlbmFtZSBhcmd1bWVudCBpcyByZXF1aXJlZDsgbW9kZSBkZWZhdWx0cyB0byAncmInCisgICAgYW5kIGNvbXByZXNzbGV2ZWwgZGVmYXVsdHMgdG8gOS4KKworICAgICIiIgorICAgIHJldHVybiBHemlwRmlsZShmaWxlbmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCkKKworY2xhc3MgR3ppcEZpbGUoaW8uQnVmZmVyZWRJT0Jhc2UpOgorICAgICIiIlRoZSBHemlwRmlsZSBjbGFzcyBzaW11bGF0ZXMgbW9zdCBvZiB0aGUgbWV0aG9kcyBvZiBhIGZpbGUgb2JqZWN0IHdpdGgKKyAgICB0aGUgZXhjZXB0aW9uIG9mIHRoZSByZWFkaW50bygpIGFuZCB0cnVuY2F0ZSgpIG1ldGhvZHMuCisKKyAgICAiIiIKKworICAgIG15ZmlsZW9iaiA9IE5vbmUKKyAgICBtYXhfcmVhZF9jaHVuayA9IDEwICogMTAyNCAqIDEwMjQgICAjIDEwTWIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZT1Ob25lLCBtb2RlPU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbXByZXNzbGV2ZWw9OSwgZmlsZW9iaj1Ob25lLCBtdGltZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IgZm9yIHRoZSBHemlwRmlsZSBjbGFzcy4KKworICAgICAgICBBdCBsZWFzdCBvbmUgb2YgZmlsZW9iaiBhbmQgZmlsZW5hbWUgbXVzdCBiZSBnaXZlbiBhCisgICAgICAgIG5vbi10cml2aWFsIHZhbHVlLgorCisgICAgICAgIFRoZSBuZXcgY2xhc3MgaW5zdGFuY2UgaXMgYmFzZWQgb24gZmlsZW9iaiwgd2hpY2ggY2FuIGJlIGEgcmVndWxhcgorICAgICAgICBmaWxlLCBhIFN0cmluZ0lPIG9iamVjdCwgb3IgYW55IG90aGVyIG9iamVjdCB3aGljaCBzaW11bGF0ZXMgYSBmaWxlLgorICAgICAgICBJdCBkZWZhdWx0cyB0byBOb25lLCBpbiB3aGljaCBjYXNlIGZpbGVuYW1lIGlzIG9wZW5lZCB0byBwcm92aWRlCisgICAgICAgIGEgZmlsZSBvYmplY3QuCisKKyAgICAgICAgV2hlbiBmaWxlb2JqIGlzIG5vdCBOb25lLCB0aGUgZmlsZW5hbWUgYXJndW1lbnQgaXMgb25seSB1c2VkIHRvIGJlCisgICAgICAgIGluY2x1ZGVkIGluIHRoZSBnemlwIGZpbGUgaGVhZGVyLCB3aGljaCBtYXkgaW5jbHVkZXMgdGhlIG9yaWdpbmFsCisgICAgICAgIGZpbGVuYW1lIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZS4gIEl0IGRlZmF1bHRzIHRvIHRoZSBmaWxlbmFtZSBvZgorICAgICAgICBmaWxlb2JqLCBpZiBkaXNjZXJuaWJsZTsgb3RoZXJ3aXNlLCBpdCBkZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLAorICAgICAgICBhbmQgaW4gdGhpcyBjYXNlIHRoZSBvcmlnaW5hbCBmaWxlbmFtZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGhlYWRlci4KKworICAgICAgICBUaGUgbW9kZSBhcmd1bWVudCBjYW4gYmUgYW55IG9mICdyJywgJ3JiJywgJ2EnLCAnYWInLCAndycsIG9yICd3YicsCisgICAgICAgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaWxlIHdpbGwgYmUgcmVhZCBvciB3cml0dGVuLiAgVGhlIGRlZmF1bHQKKyAgICAgICAgaXMgdGhlIG1vZGUgb2YgZmlsZW9iaiBpZiBkaXNjZXJuaWJsZTsgb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBpcyAncmInLgorICAgICAgICBCZSBhd2FyZSB0aGF0IG9ubHkgdGhlICdyYicsICdhYicsIGFuZCAnd2InIHZhbHVlcyBzaG91bGQgYmUgdXNlZAorICAgICAgICBmb3IgY3Jvc3MtcGxhdGZvcm0gcG9ydGFiaWxpdHkuCisKKyAgICAgICAgVGhlIGNvbXByZXNzbGV2ZWwgYXJndW1lbnQgaXMgYW4gaW50ZWdlciBmcm9tIDAgdG8gOSBjb250cm9sbGluZyB0aGUKKyAgICAgICAgbGV2ZWwgb2YgY29tcHJlc3Npb247IDEgaXMgZmFzdGVzdCBhbmQgcHJvZHVjZXMgdGhlIGxlYXN0IGNvbXByZXNzaW9uLAorICAgICAgICBhbmQgOSBpcyBzbG93ZXN0IGFuZCBwcm9kdWNlcyB0aGUgbW9zdCBjb21wcmVzc2lvbi4gMCBpcyBubyBjb21wcmVzc2lvbgorICAgICAgICBhdCBhbGwuIFRoZSBkZWZhdWx0IGlzIDkuCisKKyAgICAgICAgVGhlIG10aW1lIGFyZ3VtZW50IGlzIGFuIG9wdGlvbmFsIG51bWVyaWMgdGltZXN0YW1wIHRvIGJlIHdyaXR0ZW4KKyAgICAgICAgdG8gdGhlIHN0cmVhbSB3aGVuIGNvbXByZXNzaW5nLiAgQWxsIGd6aXAgY29tcHJlc3NlZCBzdHJlYW1zCisgICAgICAgIGFyZSByZXF1aXJlZCB0byBjb250YWluIGEgdGltZXN0YW1wLiAgSWYgb21pdHRlZCBvciBOb25lLCB0aGUKKyAgICAgICAgY3VycmVudCB0aW1lIGlzIHVzZWQuICBUaGlzIG1vZHVsZSBpZ25vcmVzIHRoZSB0aW1lc3RhbXAgd2hlbgorICAgICAgICBkZWNvbXByZXNzaW5nOyBob3dldmVyLCBzb21lIHByb2dyYW1zLCBzdWNoIGFzIGd1bnppcCwgbWFrZSB1c2UKKyAgICAgICAgb2YgaXQuICBUaGUgZm9ybWF0IG9mIHRoZSB0aW1lc3RhbXAgaXMgdGhlIHNhbWUgYXMgdGhhdCBvZiB0aGUKKyAgICAgICAgcmV0dXJuIHZhbHVlIG9mIHRpbWUudGltZSgpIGFuZCBvZiB0aGUgc3RfbXRpbWUgbWVtYmVyIG9mIHRoZQorICAgICAgICBvYmplY3QgcmV0dXJuZWQgYnkgb3Muc3RhdCgpLgorCisgICAgICAgICIiIgorCisgICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IGluYWR2ZXJ0ZW50bHkgZW5hYmxlIHVuaXZlcnNhbCBuZXdsaW5lcyBvbiB0aGUKKyAgICAgICAgIyB1bmRlcmx5aW5nIGZpbGUgb2JqZWN0IC0gaW4gcmVhZCBtb2RlLCB0aGlzIGNhdXNlcyBkYXRhIGNvcnJ1cHRpb24uCisgICAgICAgIGlmIG1vZGU6CisgICAgICAgICAgICBtb2RlID0gbW9kZS5yZXBsYWNlKCdVJywgJycpCisgICAgICAgICMgZ3VhcmFudGVlIHRoZSBmaWxlIGlzIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSBvbiBwbGF0Zm9ybXMKKyAgICAgICAgIyB0aGF0IGNhcmUgYWJvdXQgdGhhdCBzb3J0IG9mIHRoaW5nCisgICAgICAgIGlmIG1vZGUgYW5kICdiJyBub3QgaW4gbW9kZToKKyAgICAgICAgICAgIG1vZGUgKz0gJ2InCisgICAgICAgIGlmIGZpbGVvYmogaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGVvYmogPSBzZWxmLm15ZmlsZW9iaiA9IF9fYnVpbHRpbl9fLm9wZW4oZmlsZW5hbWUsIG1vZGUgb3IgJ3JiJykKKyAgICAgICAgaWYgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgSXNzdWUgIzEzNzgxOiBvcy5mZG9wZW4oKSBjcmVhdGVzIGEgZmlsZW9iaiB3aXRoIGEgYm9ndXMgbmFtZQorICAgICAgICAgICAgIyBhdHRyaWJ1dGUuIEF2b2lkIHNhdmluZyB0aGlzIGluIHRoZSBnemlwIGhlYWRlcidzIGZpbGVuYW1lIGZpZWxkLgorICAgICAgICAgICAgaWYgaGFzYXR0cihmaWxlb2JqLCAnbmFtZScpIGFuZCBmaWxlb2JqLm5hbWUgIT0gJzxmZG9wZW4+JzoKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVvYmoubmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICcnCisgICAgICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZmlsZW9iaiwgJ21vZGUnKTogbW9kZSA9IGZpbGVvYmoubW9kZQorICAgICAgICAgICAgZWxzZTogbW9kZSA9ICdyYicKKworICAgICAgICBpZiBtb2RlWzA6MV0gPT0gJ3InOgorICAgICAgICAgICAgc2VsZi5tb2RlID0gUkVBRAorICAgICAgICAgICAgIyBTZXQgZmxhZyBpbmRpY2F0aW5nIHN0YXJ0IG9mIGEgbmV3IG1lbWJlcgorICAgICAgICAgICAgc2VsZi5fbmV3X21lbWJlciA9IFRydWUKKyAgICAgICAgICAgICMgQnVmZmVyIGRhdGEgcmVhZCBmcm9tIGd6aXAgZmlsZS4gZXh0cmFzdGFydCBpcyBvZmZzZXQgaW4KKyAgICAgICAgICAgICMgc3RyZWFtIHdoZXJlIGJ1ZmZlciBzdGFydHMuIGV4dHJhc2l6ZSBpcyBudW1iZXIgb2YKKyAgICAgICAgICAgICMgYnl0ZXMgcmVtYWluaW5nIGluIGJ1ZmZlciBmcm9tIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uLgorICAgICAgICAgICAgc2VsZi5leHRyYWJ1ZiA9ICIiCisgICAgICAgICAgICBzZWxmLmV4dHJhc2l6ZSA9IDAKKyAgICAgICAgICAgIHNlbGYuZXh0cmFzdGFydCA9IDAKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IGZpbGVuYW1lCisgICAgICAgICAgICAjIFN0YXJ0cyBzbWFsbCwgc2NhbGVzIGV4cG9uZW50aWFsbHkKKyAgICAgICAgICAgIHNlbGYubWluX3JlYWRzaXplID0gMTAwCisKKyAgICAgICAgZWxpZiBtb2RlWzA6MV0gPT0gJ3cnIG9yIG1vZGVbMDoxXSA9PSAnYSc6CisgICAgICAgICAgICBzZWxmLm1vZGUgPSBXUklURQorICAgICAgICAgICAgc2VsZi5faW5pdF93cml0ZShmaWxlbmFtZSkKKyAgICAgICAgICAgIHNlbGYuY29tcHJlc3MgPSB6bGliLmNvbXByZXNzb2JqKGNvbXByZXNzbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6bGliLkRFRkxBVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXpsaWIuTUFYX1dCSVRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemxpYi5ERUZfTUVNX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJNb2RlICIgKyBtb2RlICsgIiBub3Qgc3VwcG9ydGVkIgorCisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICAgICAgc2VsZi5vZmZzZXQgPSAwCisgICAgICAgIHNlbGYubXRpbWUgPSBtdGltZQorCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSBXUklURToKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2d6aXBfaGVhZGVyKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBmaWxlbmFtZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgIHdhcm5pbmdzLndhcm4oInVzZSB0aGUgbmFtZSBhdHRyaWJ1dGUiLCBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSBXUklURSBhbmQgc2VsZi5uYW1lWy0zOl0gIT0gIi5neiI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5uYW1lICsgIi5neiIKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBzID0gcmVwcihzZWxmLmZpbGVvYmopCisgICAgICAgIHJldHVybiAnPGd6aXAgJyArIHNbMTotMV0gKyAnICcgKyBoZXgoaWQoc2VsZikpICsgJz4nCisKKyAgICBkZWYgX2NoZWNrX2Nsb3NlZChzZWxmKToKKyAgICAgICAgIiIiUmFpc2VzIGEgVmFsdWVFcnJvciBpZiB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdCBoYXMgYmVlbiBjbG9zZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZS4nKQorCisgICAgZGVmIF9pbml0X3dyaXRlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKCIiKSAmIDB4ZmZmZmZmZmZMCisgICAgICAgIHNlbGYuc2l6ZSA9IDAKKyAgICAgICAgc2VsZi53cml0ZWJ1ZiA9IFtdCisgICAgICAgIHNlbGYuYnVmc2l6ZSA9IDAKKworICAgIGRlZiBfd3JpdGVfZ3ppcF9oZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZSgnXDAzN1wyMTMnKSAgICAgICAgICAgICAjIG1hZ2ljIGhlYWRlcgorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoJ1wwMTAnKSAgICAgICAgICAgICAgICAgIyBjb21wcmVzc2lvbiBtZXRob2QKKyAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYubmFtZSkKKyAgICAgICAgaWYgZm5hbWUuZW5kc3dpdGgoIi5neiIpOgorICAgICAgICAgICAgZm5hbWUgPSBmbmFtZVs6LTNdCisgICAgICAgIGZsYWdzID0gMAorICAgICAgICBpZiBmbmFtZToKKyAgICAgICAgICAgIGZsYWdzID0gRk5BTUUKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGNocihmbGFncykpCisgICAgICAgIG10aW1lID0gc2VsZi5tdGltZQorICAgICAgICBpZiBtdGltZSBpcyBOb25lOgorICAgICAgICAgICAgbXRpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICB3cml0ZTMydShzZWxmLmZpbGVvYmosIGxvbmcobXRpbWUpKQorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoJ1wwMDInKQorICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoJ1wzNzcnKQorICAgICAgICBpZiBmbmFtZToKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShmbmFtZSArICdcMDAwJykKKworICAgIGRlZiBfaW5pdF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmNyYyA9IHpsaWIuY3JjMzIoIiIpICYgMHhmZmZmZmZmZkwKKyAgICAgICAgc2VsZi5zaXplID0gMAorCisgICAgZGVmIF9yZWFkX2d6aXBfaGVhZGVyKHNlbGYpOgorICAgICAgICBtYWdpYyA9IHNlbGYuZmlsZW9iai5yZWFkKDIpCisgICAgICAgIGlmIG1hZ2ljICE9ICdcMDM3XDIxMyc6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAnTm90IGEgZ3ppcHBlZCBmaWxlJworICAgICAgICBtZXRob2QgPSBvcmQoIHNlbGYuZmlsZW9iai5yZWFkKDEpICkKKyAgICAgICAgaWYgbWV0aG9kICE9IDg6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAnVW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnCisgICAgICAgIGZsYWcgPSBvcmQoIHNlbGYuZmlsZW9iai5yZWFkKDEpICkKKyAgICAgICAgc2VsZi5tdGltZSA9IHJlYWQzMihzZWxmLmZpbGVvYmopCisgICAgICAgICMgZXh0cmFmbGFnID0gc2VsZi5maWxlb2JqLnJlYWQoMSkKKyAgICAgICAgIyBvcyA9IHNlbGYuZmlsZW9iai5yZWFkKDEpCisgICAgICAgIHNlbGYuZmlsZW9iai5yZWFkKDIpCisKKyAgICAgICAgaWYgZmxhZyAmIEZFWFRSQToKKyAgICAgICAgICAgICMgUmVhZCAmIGRpc2NhcmQgdGhlIGV4dHJhIGZpZWxkLCBpZiBwcmVzZW50CisgICAgICAgICAgICB4bGVuID0gb3JkKHNlbGYuZmlsZW9iai5yZWFkKDEpKQorICAgICAgICAgICAgeGxlbiA9IHhsZW4gKyAyNTYqb3JkKHNlbGYuZmlsZW9iai5yZWFkKDEpKQorICAgICAgICAgICAgc2VsZi5maWxlb2JqLnJlYWQoeGxlbikKKyAgICAgICAgaWYgZmxhZyAmIEZOQU1FOgorICAgICAgICAgICAgIyBSZWFkIGFuZCBkaXNjYXJkIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBmaWxlbmFtZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi5maWxlb2JqLnJlYWQoMSkKKyAgICAgICAgICAgICAgICBpZiBub3QgcyBvciBzPT0nXDAwMCc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGZsYWcgJiBGQ09NTUVOVDoKKyAgICAgICAgICAgICMgUmVhZCBhbmQgZGlzY2FyZCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyBhIGNvbW1lbnQKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuZmlsZW9iai5yZWFkKDEpCisgICAgICAgICAgICAgICAgaWYgbm90IHMgb3Igcz09J1wwMDAnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBmbGFnICYgRkhDUkM6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmoucmVhZCgyKSAgICAgIyBSZWFkICYgZGlzY2FyZCB0aGUgMTYtYml0IGhlYWRlciBDUkMKKworICAgIGRlZiB3cml0ZShzZWxmLGRhdGEpOgorICAgICAgICBzZWxmLl9jaGVja19jbG9zZWQoKQorICAgICAgICBpZiBzZWxmLm1vZGUgIT0gV1JJVEU6CisgICAgICAgICAgICBpbXBvcnQgZXJybm8KKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoZXJybm8uRUJBREYsICJ3cml0ZSgpIG9uIHJlYWQtb25seSBHemlwRmlsZSBvYmplY3QiKQorCisgICAgICAgIGlmIHNlbGYuZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIndyaXRlKCkgb24gY2xvc2VkIEd6aXBGaWxlIG9iamVjdCIKKworICAgICAgICAjIENvbnZlcnQgZGF0YSB0eXBlIGlmIGNhbGxlZCBieSBpby5CdWZmZXJlZFdyaXRlci4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBtZW1vcnl2aWV3KToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLnRvYnl0ZXMoKQorCisgICAgICAgIGlmIGxlbihkYXRhKSA+IDA6CisgICAgICAgICAgICBzZWxmLnNpemUgPSBzZWxmLnNpemUgKyBsZW4oZGF0YSkKKyAgICAgICAgICAgIHNlbGYuY3JjID0gemxpYi5jcmMzMihkYXRhLCBzZWxmLmNyYykgJiAweGZmZmZmZmZmTAorICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKCBzZWxmLmNvbXByZXNzLmNvbXByZXNzKGRhdGEpICkKKyAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihkYXRhKQorCisgICAgICAgIHJldHVybiBsZW4oZGF0YSkKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBzZWxmLl9jaGVja19jbG9zZWQoKQorICAgICAgICBpZiBzZWxmLm1vZGUgIT0gUkVBRDoKKyAgICAgICAgICAgIGltcG9ydCBlcnJubworICAgICAgICAgICAgcmFpc2UgSU9FcnJvcihlcnJuby5FQkFERiwgInJlYWQoKSBvbiB3cml0ZS1vbmx5IEd6aXBGaWxlIG9iamVjdCIpCisKKyAgICAgICAgaWYgc2VsZi5leHRyYXNpemUgPD0gMCBhbmQgc2VsZi5maWxlb2JqIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gJycKKworICAgICAgICByZWFkc2l6ZSA9IDEwMjQKKyAgICAgICAgaWYgc2l6ZSA8IDA6ICAgICAgICAjIGdldCB0aGUgd2hvbGUgdGhpbmcKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZWFkKHJlYWRzaXplKQorICAgICAgICAgICAgICAgICAgICByZWFkc2l6ZSA9IG1pbihzZWxmLm1heF9yZWFkX2NodW5rLCByZWFkc2l6ZSAqIDIpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNlbGYuZXh0cmFzaXplCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgIyBqdXN0IGdldCBzb21lIG1vcmUgb2YgaXQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSBzaXplID4gc2VsZi5leHRyYXNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWQocmVhZHNpemUpCisgICAgICAgICAgICAgICAgICAgIHJlYWRzaXplID0gbWluKHNlbGYubWF4X3JlYWRfY2h1bmssIHJlYWRzaXplICogMikKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBzaXplID4gc2VsZi5leHRyYXNpemU6CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzZWxmLmV4dHJhc2l6ZQorCisgICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0IC0gc2VsZi5leHRyYXN0YXJ0CisgICAgICAgIGNodW5rID0gc2VsZi5leHRyYWJ1ZltvZmZzZXQ6IG9mZnNldCArIHNpemVdCisgICAgICAgIHNlbGYuZXh0cmFzaXplID0gc2VsZi5leHRyYXNpemUgLSBzaXplCisKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gc2l6ZQorICAgICAgICByZXR1cm4gY2h1bmsKKworICAgIGRlZiBfdW5yZWFkKHNlbGYsIGJ1Zik6CisgICAgICAgIHNlbGYuZXh0cmFzaXplID0gbGVuKGJ1ZikgKyBzZWxmLmV4dHJhc2l6ZQorICAgICAgICBzZWxmLm9mZnNldCAtPSBsZW4oYnVmKQorCisgICAgZGVmIF9yZWFkKHNlbGYsIHNpemU9MTAyNCk6CisgICAgICAgIGlmIHNlbGYuZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IsICJSZWFjaGVkIEVPRiIKKworICAgICAgICBpZiBzZWxmLl9uZXdfbWVtYmVyOgorICAgICAgICAgICAgIyBJZiB0aGUgX25ld19tZW1iZXIgZmxhZyBpcyBzZXQsIHdlIGhhdmUgdG8KKyAgICAgICAgICAgICMganVtcCB0byB0aGUgbmV4dCBtZW1iZXIsIGlmIHRoZXJlIGlzIG9uZS4KKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgRmlyc3QsIGNoZWNrIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGU7CisgICAgICAgICAgICAjIGlmIHNvLCBpdCdzIHRpbWUgdG8gc3RvcDsgbm8gbW9yZSBtZW1iZXJzIHRvIHJlYWQuCisgICAgICAgICAgICBwb3MgPSBzZWxmLmZpbGVvYmoudGVsbCgpICAgIyBTYXZlIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKDAsIDIpICAgICAjIFNlZWsgdG8gZW5kIG9mIGZpbGUKKyAgICAgICAgICAgIGlmIHBvcyA9PSBzZWxmLmZpbGVvYmoudGVsbCgpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yLCAiUmVhY2hlZCBFT0YiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKCBwb3MgKSAjIFJldHVybiB0byBvcmlnaW5hbCBwb3NpdGlvbgorCisgICAgICAgICAgICBzZWxmLl9pbml0X3JlYWQoKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9nemlwX2hlYWRlcigpCisgICAgICAgICAgICBzZWxmLmRlY29tcHJlc3MgPSB6bGliLmRlY29tcHJlc3NvYmooLXpsaWIuTUFYX1dCSVRTKQorICAgICAgICAgICAgc2VsZi5fbmV3X21lbWJlciA9IEZhbHNlCisKKyAgICAgICAgIyBSZWFkIGEgY2h1bmsgb2YgZGF0YSBmcm9tIHRoZSBmaWxlCisgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKHNpemUpCisKKyAgICAgICAgIyBJZiB0aGUgRU9GIGhhcyBiZWVuIHJlYWNoZWQsIGZsdXNoIHRoZSBkZWNvbXByZXNzaW9uIG9iamVjdAorICAgICAgICAjIGFuZCBtYXJrIHRoaXMgb2JqZWN0IGFzIGZpbmlzaGVkLgorCisgICAgICAgIGlmIGJ1ZiA9PSAiIjoKKyAgICAgICAgICAgIHVuY29tcHJlc3MgPSBzZWxmLmRlY29tcHJlc3MuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5fcmVhZF9lb2YoKQorICAgICAgICAgICAgc2VsZi5fYWRkX3JlYWRfZGF0YSggdW5jb21wcmVzcyApCisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvciwgJ1JlYWNoZWQgRU9GJworCisgICAgICAgIHVuY29tcHJlc3MgPSBzZWxmLmRlY29tcHJlc3MuZGVjb21wcmVzcyhidWYpCisgICAgICAgIHNlbGYuX2FkZF9yZWFkX2RhdGEoIHVuY29tcHJlc3MgKQorCisgICAgICAgIGlmIHNlbGYuZGVjb21wcmVzcy51bnVzZWRfZGF0YSAhPSAiIjoKKyAgICAgICAgICAgICMgRW5kaW5nIGNhc2U6IHdlJ3ZlIGNvbWUgdG8gdGhlIGVuZCBvZiBhIG1lbWJlciBpbiB0aGUgZmlsZSwKKyAgICAgICAgICAgICMgc28gc2VlayBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgdW51c2VkIGRhdGEsIGZpbmlzaCB1cAorICAgICAgICAgICAgIyB0aGlzIG1lbWJlciwgYW5kIHJlYWQgYSBuZXcgZ3ppcCBoZWFkZXIuCisgICAgICAgICAgICAjIChUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNlZWsgYmFjayBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB1bnVzZWQKKyAgICAgICAgICAgICMgZGF0YSwgbWludXMgOCBiZWNhdXNlIF9yZWFkX2VvZigpIHdpbGwgcmV3aW5kIGEgZnVydGhlciA4IGJ5dGVzKQorICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoIC1sZW4oc2VsZi5kZWNvbXByZXNzLnVudXNlZF9kYXRhKSs4LCAxKQorCisgICAgICAgICAgICAjIENoZWNrIHRoZSBDUkMgYW5kIGZpbGUgc2l6ZSwgYW5kIHNldCB0aGUgZmxhZyBzbyB3ZSByZWFkCisgICAgICAgICAgICAjIGEgbmV3IG1lbWJlciBvbiB0aGUgbmV4dCBjYWxsCisgICAgICAgICAgICBzZWxmLl9yZWFkX2VvZigpCisgICAgICAgICAgICBzZWxmLl9uZXdfbWVtYmVyID0gVHJ1ZQorCisgICAgZGVmIF9hZGRfcmVhZF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmNyYyA9IHpsaWIuY3JjMzIoZGF0YSwgc2VsZi5jcmMpICYgMHhmZmZmZmZmZkwKKyAgICAgICAgb2Zmc2V0ID0gc2VsZi5vZmZzZXQgLSBzZWxmLmV4dHJhc3RhcnQKKyAgICAgICAgc2VsZi5leHRyYWJ1ZiA9IHNlbGYuZXh0cmFidWZbb2Zmc2V0Ol0gKyBkYXRhCisgICAgICAgIHNlbGYuZXh0cmFzaXplID0gc2VsZi5leHRyYXNpemUgKyBsZW4oZGF0YSkKKyAgICAgICAgc2VsZi5leHRyYXN0YXJ0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgc2VsZi5zaXplID0gc2VsZi5zaXplICsgbGVuKGRhdGEpCisKKyAgICBkZWYgX3JlYWRfZW9mKHNlbGYpOgorICAgICAgICAjIFdlJ3ZlIHJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwgc28gd2UgaGF2ZSB0byByZXdpbmQgaW4gb3JkZXIKKyAgICAgICAgIyB0byByZXJlYWQgdGhlIDggYnl0ZXMgY29udGFpbmluZyB0aGUgQ1JDIGFuZCB0aGUgZmlsZSBzaXplLgorICAgICAgICAjIFdlIGNoZWNrIHRoZSB0aGF0IHRoZSBjb21wdXRlZCBDUkMgYW5kIHNpemUgb2YgdGhlCisgICAgICAgICMgdW5jb21wcmVzc2VkIGRhdGEgbWF0Y2hlcyB0aGUgc3RvcmVkIHZhbHVlcy4gIE5vdGUgdGhhdCB0aGUgc2l6ZQorICAgICAgICAjIHN0b3JlZCBpcyB0aGUgdHJ1ZSBmaWxlIHNpemUgbW9kIDIqKjMyLgorICAgICAgICBzZWxmLmZpbGVvYmouc2VlaygtOCwgMSkKKyAgICAgICAgY3JjMzIgPSByZWFkMzIoc2VsZi5maWxlb2JqKQorICAgICAgICBpc2l6ZSA9IHJlYWQzMihzZWxmLmZpbGVvYmopICAjIG1heSBleGNlZWQgMkdCCisgICAgICAgIGlmIGNyYzMyICE9IHNlbGYuY3JjOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiQ1JDIGNoZWNrIGZhaWxlZCAlcyAhPSAlcyIgJSAoaGV4KGNyYzMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleChzZWxmLmNyYykpKQorICAgICAgICBlbGlmIGlzaXplICE9IChzZWxmLnNpemUgJiAweGZmZmZmZmZmTCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiSW5jb3JyZWN0IGxlbmd0aCBvZiBkYXRhIHByb2R1Y2VkIgorCisgICAgICAgICMgR3ppcCBmaWxlcyBjYW4gYmUgcGFkZGVkIHdpdGggemVyb2VzIGFuZCBzdGlsbCBoYXZlIGFyY2hpdmVzLgorICAgICAgICAjIENvbnN1bWUgYWxsIHplcm8gYnl0ZXMgYW5kIHNldCB0aGUgZmlsZSBwb3NpdGlvbiB0byB0aGUgZmlyc3QKKyAgICAgICAgIyBub24temVybyBieXRlLiBTZWUgaHR0cDovL3d3dy5nemlwLm9yZy8jZmFxOAorICAgICAgICBjID0gIlx4MDAiCisgICAgICAgIHdoaWxlIGMgPT0gIlx4MDAiOgorICAgICAgICAgICAgYyA9IHNlbGYuZmlsZW9iai5yZWFkKDEpCisgICAgICAgIGlmIGM6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlaygtMSwgMSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjbG9zZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmZpbGVvYmogaXMgTm9uZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZpbGVvYmogaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gV1JJVEU6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5jb21wcmVzcy5mbHVzaCgpKQorICAgICAgICAgICAgd3JpdGUzMnUoc2VsZi5maWxlb2JqLCBzZWxmLmNyYykKKyAgICAgICAgICAgICMgc2VsZi5zaXplIG1heSBleGNlZWQgMkdCLCBvciBldmVuIDRHQgorICAgICAgICAgICAgd3JpdGUzMnUoc2VsZi5maWxlb2JqLCBzZWxmLnNpemUgJiAweGZmZmZmZmZmTCkKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iaiA9IE5vbmUKKyAgICAgICAgZWxpZiBzZWxmLm1vZGUgPT0gUkVBRDoKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iaiA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5teWZpbGVvYmo6CisgICAgICAgICAgICBzZWxmLm15ZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLm15ZmlsZW9iaiA9IE5vbmUKKworICAgIGRlZiBmbHVzaChzZWxmLHpsaWJfbW9kZT16bGliLlpfU1lOQ19GTFVTSCk6CisgICAgICAgIHNlbGYuX2NoZWNrX2Nsb3NlZCgpCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSBXUklURToKKyAgICAgICAgICAgICMgRW5zdXJlIHRoZSBjb21wcmVzc29yJ3MgYnVmZmVyIGlzIGZsdXNoZWQKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzZWxmLmNvbXByZXNzLmZsdXNoKHpsaWJfbW9kZSkpCisgICAgICAgICAgICBzZWxmLmZpbGVvYmouZmx1c2goKQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgIiIiSW52b2tlIHRoZSB1bmRlcmx5aW5nIGZpbGUgb2JqZWN0J3MgZmlsZW5vKCkgbWV0aG9kLgorCisgICAgICAgIFRoaXMgd2lsbCByYWlzZSBBdHRyaWJ1dGVFcnJvciBpZiB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdAorICAgICAgICBkb2Vzbid0IHN1cHBvcnQgZmlsZW5vKCkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLmZpbGVubygpCisKKyAgICBkZWYgcmV3aW5kKHNlbGYpOgorICAgICAgICAnJydSZXR1cm4gdGhlIHVuY29tcHJlc3NlZCBzdHJlYW0gZmlsZSBwb3NpdGlvbiBpbmRpY2F0b3IgdG8gdGhlCisgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgZmlsZScnJworICAgICAgICBpZiBzZWxmLm1vZGUgIT0gUkVBRDoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNhbid0IHJld2luZCBpbiB3cml0ZSBtb2RlIikKKyAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoMCkKKyAgICAgICAgc2VsZi5fbmV3X21lbWJlciA9IFRydWUKKyAgICAgICAgc2VsZi5leHRyYWJ1ZiA9ICIiCisgICAgICAgIHNlbGYuZXh0cmFzaXplID0gMAorICAgICAgICBzZWxmLmV4dHJhc3RhcnQgPSAwCisgICAgICAgIHNlbGYub2Zmc2V0ID0gMAorCisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tb2RlID09IFJFQUQKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubW9kZSA9PSBXUklURQorCisgICAgZGVmIHNlZWthYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNlZWsoc2VsZiwgb2Zmc2V0LCB3aGVuY2U9MCk6CisgICAgICAgIGlmIHdoZW5jZToKKyAgICAgICAgICAgIGlmIHdoZW5jZSA9PSAxOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IHNlbGYub2Zmc2V0ICsgb2Zmc2V0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1NlZWsgZnJvbSBlbmQgbm90IHN1cHBvcnRlZCcpCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSBXUklURToKKyAgICAgICAgICAgIGlmIG9mZnNldCA8IHNlbGYub2Zmc2V0OgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ05lZ2F0aXZlIHNlZWsgaW4gd3JpdGUgbW9kZScpCisgICAgICAgICAgICBjb3VudCA9IG9mZnNldCAtIHNlbGYub2Zmc2V0CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoY291bnQgLy8gMTAyNCk6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgxMDI0ICogJ1wwJykKKyAgICAgICAgICAgIHNlbGYud3JpdGUoKGNvdW50ICUgMTAyNCkgKiAnXDAnKQorICAgICAgICBlbGlmIHNlbGYubW9kZSA9PSBSRUFEOgorICAgICAgICAgICAgaWYgb2Zmc2V0IDwgc2VsZi5vZmZzZXQ6CisgICAgICAgICAgICAgICAgIyBmb3IgbmVnYXRpdmUgc2VlaywgcmV3aW5kIGFuZCBkbyBwb3NpdGl2ZSBzZWVrCisgICAgICAgICAgICAgICAgc2VsZi5yZXdpbmQoKQorICAgICAgICAgICAgY291bnQgPSBvZmZzZXQgLSBzZWxmLm9mZnNldAorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGNvdW50IC8vIDEwMjQpOgorICAgICAgICAgICAgICAgIHNlbGYucmVhZCgxMDI0KQorICAgICAgICAgICAgc2VsZi5yZWFkKGNvdW50ICUgMTAyNCkKKworICAgICAgICByZXR1cm4gc2VsZi5vZmZzZXQKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICAjIFNob3J0Y3V0IGNvbW1vbiBjYXNlIC0gbmV3bGluZSBmb3VuZCBpbiBidWZmZXIuCisgICAgICAgICAgICBvZmZzZXQgPSBzZWxmLm9mZnNldCAtIHNlbGYuZXh0cmFzdGFydAorICAgICAgICAgICAgaSA9IHNlbGYuZXh0cmFidWYuZmluZCgnXG4nLCBvZmZzZXQpICsgMQorICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5leHRyYXNpemUgLT0gaSAtIG9mZnNldAorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGkgLSBvZmZzZXQKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5leHRyYWJ1ZltvZmZzZXQ6IGldCisKKyAgICAgICAgICAgIHNpemUgPSBzeXMubWF4aW50CisgICAgICAgICAgICByZWFkc2l6ZSA9IHNlbGYubWluX3JlYWRzaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWFkc2l6ZSA9IHNpemUKKyAgICAgICAgYnVmcyA9IFtdCisgICAgICAgIHdoaWxlIHNpemUgIT0gMDoKKyAgICAgICAgICAgIGMgPSBzZWxmLnJlYWQocmVhZHNpemUpCisgICAgICAgICAgICBpID0gYy5maW5kKCdcbicpCisKKyAgICAgICAgICAgICMgV2Ugc2V0IGk9c2l6ZSB0byBicmVhayBvdXQgb2YgdGhlIGxvb3AgdW5kZXIgdHdvCisgICAgICAgICAgICAjIGNvbmRpdGlvbnM6IDEpIHRoZXJlJ3Mgbm8gbmV3bGluZSwgYW5kIHRoZSBjaHVuayBpcworICAgICAgICAgICAgIyBsYXJnZXIgdGhhbiBzaXplLCBvciAyKSB0aGVyZSBpcyBhIG5ld2xpbmUsIGJ1dCB0aGUKKyAgICAgICAgICAgICMgcmVzdWx0aW5nIGxpbmUgd291bGQgYmUgbG9uZ2VyIHRoYW4gJ3NpemUnLgorICAgICAgICAgICAgaWYgKHNpemUgPD0gaSkgb3IgKGkgPT0gLTEgYW5kIGxlbihjKSA+IHNpemUpOgorICAgICAgICAgICAgICAgIGkgPSBzaXplIC0gMQorCisgICAgICAgICAgICBpZiBpID49IDAgb3IgYyA9PSAnJzoKKyAgICAgICAgICAgICAgICBidWZzLmFwcGVuZChjWzppICsgMV0pICAgICMgQWRkIHBvcnRpb24gb2YgbGFzdCBjaHVuaworICAgICAgICAgICAgICAgIHNlbGYuX3VucmVhZChjW2kgKyAxOl0pICAgIyBQdXNoIGJhY2sgcmVzdCBvZiBjaHVuaworICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICMgQXBwZW5kIGNodW5rIHRvIGxpc3QsIGRlY3JlYXNlICdzaXplJywKKyAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGMpCisgICAgICAgICAgICBzaXplID0gc2l6ZSAtIGxlbihjKQorICAgICAgICAgICAgcmVhZHNpemUgPSBtaW4oc2l6ZSwgcmVhZHNpemUgKiAyKQorICAgICAgICBpZiByZWFkc2l6ZSA+IHNlbGYubWluX3JlYWRzaXplOgorICAgICAgICAgICAgc2VsZi5taW5fcmVhZHNpemUgPSBtaW4ocmVhZHNpemUsIHNlbGYubWluX3JlYWRzaXplICogMiwgNTEyKQorICAgICAgICByZXR1cm4gJycuam9pbihidWZzKSAjIFJldHVybiByZXN1bHRpbmcgbGluZQorCisKK2RlZiBfdGVzdCgpOgorICAgICMgQWN0IGxpa2UgZ3ppcDsgd2l0aCAtZCwgYWN0IGxpa2UgZ3VuemlwLgorICAgICMgVGhlIGlucHV0IGZpbGUgaXMgbm90IGRlbGV0ZWQsIGhvd2V2ZXIsIG5vciBhcmUgYW55IG90aGVyIGd6aXAKKyAgICAjIG9wdGlvbnMgb3IgZmVhdHVyZXMgc3VwcG9ydGVkLgorICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBkZWNvbXByZXNzID0gYXJncyBhbmQgYXJnc1swXSA9PSAiLWQiCisgICAgaWYgZGVjb21wcmVzczoKKyAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIGFyZ3MgPSBbIi0iXQorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgaWYgZGVjb21wcmVzczoKKyAgICAgICAgICAgIGlmIGFyZyA9PSAiLSI6CisgICAgICAgICAgICAgICAgZiA9IEd6aXBGaWxlKGZpbGVuYW1lPSIiLCBtb2RlPSJyYiIsIGZpbGVvYmo9c3lzLnN0ZGluKQorICAgICAgICAgICAgICAgIGcgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGFyZ1stMzpdICE9ICIuZ3oiOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiZmlsZW5hbWUgZG9lc24ndCBlbmQgaW4gLmd6OiIsIHJlcHIoYXJnKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKGFyZywgInJiIikKKyAgICAgICAgICAgICAgICBnID0gX19idWlsdGluX18ub3BlbihhcmdbOi0zXSwgIndiIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGFyZyA9PSAiLSI6CisgICAgICAgICAgICAgICAgZiA9IHN5cy5zdGRpbgorICAgICAgICAgICAgICAgIGcgPSBHemlwRmlsZShmaWxlbmFtZT0iIiwgbW9kZT0id2IiLCBmaWxlb2JqPXN5cy5zdGRvdXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYgPSBfX2J1aWx0aW5fXy5vcGVuKGFyZywgInJiIikKKyAgICAgICAgICAgICAgICBnID0gb3BlbihhcmcgKyAiLmd6IiwgIndiIikKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNodW5rID0gZi5yZWFkKDEwMjQpCisgICAgICAgICAgICBpZiBub3QgY2h1bms6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGcud3JpdGUoY2h1bmspCisgICAgICAgIGlmIGcgaXMgbm90IHN5cy5zdGRvdXQ6CisgICAgICAgICAgICBnLmNsb3NlKCkKKyAgICAgICAgaWYgZiBpcyBub3Qgc3lzLnN0ZGluOgorICAgICAgICAgICAgZi5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nemlwLnB5YyBiL2xpYi9weXRob24yLjcvZ3ppcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4Mjk1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ3ppcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9nemlwLnB5byBiL2xpYi9weXRob24yLjcvZ3ppcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM4Mjk1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvZ3ppcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9oYXNobGliLnB5IGIvbGliL3B5dGhvbjIuNy9oYXNobGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMGUxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hhc2hsaWIucHkKQEAgLTAsMCArMSwxNDYgQEAKKyMgJElkJAorIworIyAgQ29weXJpZ2h0IChDKSAyMDA1ICAgR3JlZ29yeSBQLiBTbWl0aCAoZ3JlZ0BrcnlwdG8ub3JnKQorIyAgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIworCitfX2RvY19fID0gIiIiaGFzaGxpYiBtb2R1bGUgLSBBIGNvbW1vbiBpbnRlcmZhY2UgdG8gbWFueSBoYXNoIGZ1bmN0aW9ucy4KKworbmV3KG5hbWUsIHN0cmluZz0nJykgLSByZXR1cm5zIGEgbmV3IGhhc2ggb2JqZWN0IGltcGxlbWVudGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gaGFzaCBmdW5jdGlvbjsgaW5pdGlhbGl6aW5nIHRoZSBoYXNoCisgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBnaXZlbiBzdHJpbmcgZGF0YS4KKworTmFtZWQgY29uc3RydWN0b3IgZnVuY3Rpb25zIGFyZSBhbHNvIGF2YWlsYWJsZSwgdGhlc2UgYXJlIG11Y2ggZmFzdGVyCit0aGFuIHVzaW5nIG5ldygpOgorCittZDUoKSwgc2hhMSgpLCBzaGEyMjQoKSwgc2hhMjU2KCksIHNoYTM4NCgpLCBhbmQgc2hhNTEyKCkKKworTW9yZSBhbGdvcml0aG1zIG1heSBiZSBhdmFpbGFibGUgb24geW91ciBwbGF0Zm9ybSBidXQgdGhlIGFib3ZlIGFyZQorZ3VhcmFudGVlZCB0byBleGlzdC4KKworTk9URTogSWYgeW91IHdhbnQgdGhlIGFkbGVyMzIgb3IgY3JjMzIgaGFzaCBmdW5jdGlvbnMgdGhleSBhcmUgYXZhaWxhYmxlIGluCit0aGUgemxpYiBtb2R1bGUuCisKK0Nob29zZSB5b3VyIGhhc2ggZnVuY3Rpb24gd2lzZWx5LiAgU29tZSBoYXZlIGtub3duIGNvbGxpc2lvbiB3ZWFrbmVzc2VzLgorc2hhMzg0IGFuZCBzaGE1MTIgd2lsbCBiZSBzbG93IG9uIDMyIGJpdCBwbGF0Zm9ybXMuCisKK0hhc2ggb2JqZWN0cyBoYXZlIHRoZXNlIG1ldGhvZHM6CisgLSB1cGRhdGUoYXJnKTogVXBkYXRlIHRoZSBoYXNoIG9iamVjdCB3aXRoIHRoZSBzdHJpbmcgYXJnLiBSZXBlYXRlZCBjYWxscworICAgICAgICAgICAgICAgIGFyZSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGNhbGwgd2l0aCB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwKKyAgICAgICAgICAgICAgICB0aGUgYXJndW1lbnRzLgorIC0gZGlnZXN0KCk6ICAgIFJldHVybiB0aGUgZGlnZXN0IG9mIHRoZSBzdHJpbmdzIHBhc3NlZCB0byB0aGUgdXBkYXRlKCkgbWV0aG9kCisgICAgICAgICAgICAgICAgc28gZmFyLiBUaGlzIG1heSBjb250YWluIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcKKyAgICAgICAgICAgICAgICBOVUwgYnl0ZXMuCisgLSBoZXhkaWdlc3QoKTogTGlrZSBkaWdlc3QoKSBleGNlcHQgdGhlIGRpZ2VzdCBpcyByZXR1cm5lZCBhcyBhIHN0cmluZyBvZgorICAgICAgICAgICAgICAgIGRvdWJsZSBsZW5ndGgsIGNvbnRhaW5pbmcgb25seSBoZXhhZGVjaW1hbCBkaWdpdHMuCisgLSBjb3B5KCk6ICAgICAgUmV0dXJuIGEgY29weSAoY2xvbmUpIG9mIHRoZSBoYXNoIG9iamVjdC4gVGhpcyBjYW4gYmUgdXNlZCB0bworICAgICAgICAgICAgICAgIGVmZmljaWVudGx5IGNvbXB1dGUgdGhlIGRpZ2VzdHMgb2Ygc3RyaW5ncyB0aGF0IHNoYXJlIGEgY29tbW9uCisgICAgICAgICAgICAgICAgaW5pdGlhbCBzdWJzdHJpbmcuCisKK0ZvciBleGFtcGxlLCB0byBvYnRhaW4gdGhlIGRpZ2VzdCBvZiB0aGUgc3RyaW5nICdOb2JvZHkgaW5zcGVjdHMgdGhlCitzcGFtbWlzaCByZXBldGl0aW9uJzoKKworICAgID4+PiBpbXBvcnQgaGFzaGxpYgorICAgID4+PiBtID0gaGFzaGxpYi5tZDUoKQorICAgID4+PiBtLnVwZGF0ZSgiTm9ib2R5IGluc3BlY3RzIikKKyAgICA+Pj4gbS51cGRhdGUoIiB0aGUgc3BhbW1pc2ggcmVwZXRpdGlvbiIpCisgICAgPj4+IG0uZGlnZXN0KCkKKyAgICAnXFx4YmJkXFx4OWNcXHg4M1xceGRkXFx4MWVcXHhhNVxceGM5XFx4ZDlcXHhkZVxceGM5XFx4YTFcXHg4ZFxceGYwXFx4ZmZcXHhlOScKKworTW9yZSBjb25kZW5zZWQ6CisKKyAgICA+Pj4gaGFzaGxpYi5zaGEyMjQoIk5vYm9keSBpbnNwZWN0cyB0aGUgc3BhbW1pc2ggcmVwZXRpdGlvbiIpLmhleGRpZ2VzdCgpCisgICAgJ2E0MzM3YmM0NWE4ZmM1NDRjMDNmNTJkYzU1MGNkNmUxZTg3MDIxYmM4OTY1ODhiZDc5ZTkwMWUyJworCisiIiIKKworIyBUaGlzIHR1cGxlIGFuZCBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKCkgbXVzdCBiZSBtb2RpZmllZCBpZiBhIG5ldworIyBhbHdheXMgYXZhaWxhYmxlIGFsZ29yaXRobSBpcyBhZGRlZC4KK19fYWx3YXlzX3N1cHBvcnRlZCA9ICgnbWQ1JywgJ3NoYTEnLCAnc2hhMjI0JywgJ3NoYTI1NicsICdzaGEzODQnLCAnc2hhNTEyJykKKworYWxnb3JpdGhtcyA9IF9fYWx3YXlzX3N1cHBvcnRlZAorCitfX2FsbF9fID0gX19hbHdheXNfc3VwcG9ydGVkICsgKCduZXcnLCAnYWxnb3JpdGhtcycpCisKKworZGVmIF9fZ2V0X2J1aWx0aW5fY29uc3RydWN0b3IobmFtZSk6CisgICAgdHJ5OgorICAgICAgICBpZiBuYW1lIGluICgnU0hBMScsICdzaGExJyk6CisgICAgICAgICAgICBpbXBvcnQgX3NoYQorICAgICAgICAgICAgcmV0dXJuIF9zaGEubmV3CisgICAgICAgIGVsaWYgbmFtZSBpbiAoJ01ENScsICdtZDUnKToKKyAgICAgICAgICAgIGltcG9ydCBfbWQ1CisgICAgICAgICAgICByZXR1cm4gX21kNS5uZXcKKyAgICAgICAgZWxpZiBuYW1lIGluICgnU0hBMjU2JywgJ3NoYTI1NicsICdTSEEyMjQnLCAnc2hhMjI0Jyk6CisgICAgICAgICAgICBpbXBvcnQgX3NoYTI1NgorICAgICAgICAgICAgYnMgPSBuYW1lWzM6XQorICAgICAgICAgICAgaWYgYnMgPT0gJzI1Nic6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zaGEyNTYuc2hhMjU2CisgICAgICAgICAgICBlbGlmIGJzID09ICcyMjQnOgorICAgICAgICAgICAgICAgIHJldHVybiBfc2hhMjU2LnNoYTIyNAorICAgICAgICBlbGlmIG5hbWUgaW4gKCdTSEE1MTInLCAnc2hhNTEyJywgJ1NIQTM4NCcsICdzaGEzODQnKToKKyAgICAgICAgICAgIGltcG9ydCBfc2hhNTEyCisgICAgICAgICAgICBicyA9IG5hbWVbMzpdCisgICAgICAgICAgICBpZiBicyA9PSAnNTEyJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gX3NoYTUxMi5zaGE1MTIKKyAgICAgICAgICAgIGVsaWYgYnMgPT0gJzM4NCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIF9zaGE1MTIuc2hhMzg0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzICAjIG5vIGV4dGVuc2lvbiBtb2R1bGUsIHRoaXMgaGFzaCBpcyB1bnN1cHBvcnRlZC4KKworICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3Vuc3VwcG9ydGVkIGhhc2ggdHlwZSAnICsgbmFtZSkKKworCitkZWYgX19nZXRfb3BlbnNzbF9jb25zdHJ1Y3RvcihuYW1lKToKKyAgICB0cnk6CisgICAgICAgIGYgPSBnZXRhdHRyKF9oYXNobGliLCAnb3BlbnNzbF8nICsgbmFtZSkKKyAgICAgICAgIyBBbGxvdyB0aGUgQyBtb2R1bGUgdG8gcmFpc2UgVmFsdWVFcnJvci4gIFRoZSBmdW5jdGlvbiB3aWxsIGJlCisgICAgICAgICMgZGVmaW5lZCBidXQgdGhlIGhhc2ggbm90IGFjdHVhbGx5IGF2YWlsYWJsZSB0aGFua3MgdG8gT3BlblNTTC4KKyAgICAgICAgZigpCisgICAgICAgICMgVXNlIHRoZSBDIGZ1bmN0aW9uIGRpcmVjdGx5ICh2ZXJ5IGZhc3QpCisgICAgICAgIHJldHVybiBmCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgIHJldHVybiBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yKG5hbWUpCisKKworZGVmIF9fcHlfbmV3KG5hbWUsIHN0cmluZz0nJyk6CisgICAgIiIibmV3KG5hbWUsIHN0cmluZz0nJykgLSBSZXR1cm4gYSBuZXcgaGFzaGluZyBvYmplY3QgdXNpbmcgdGhlIG5hbWVkIGFsZ29yaXRobTsKKyAgICBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggYSBzdHJpbmcuCisgICAgIiIiCisgICAgcmV0dXJuIF9fZ2V0X2J1aWx0aW5fY29uc3RydWN0b3IobmFtZSkoc3RyaW5nKQorCisKK2RlZiBfX2hhc2hfbmV3KG5hbWUsIHN0cmluZz0nJyk6CisgICAgIiIibmV3KG5hbWUsIHN0cmluZz0nJykgLSBSZXR1cm4gYSBuZXcgaGFzaGluZyBvYmplY3QgdXNpbmcgdGhlIG5hbWVkIGFsZ29yaXRobTsKKyAgICBvcHRpb25hbGx5IGluaXRpYWxpemVkIHdpdGggYSBzdHJpbmcuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX2hhc2hsaWIubmV3KG5hbWUsIHN0cmluZykKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgIyBJZiB0aGUgX2hhc2hsaWIgbW9kdWxlIChPcGVuU1NMKSBkb2Vzbid0IHN1cHBvcnQgdGhlIG5hbWVkCisgICAgICAgICMgaGFzaCwgdHJ5IHVzaW5nIG91ciBidWlsdGluIGltcGxlbWVudGF0aW9ucy4KKyAgICAgICAgIyBUaGlzIGFsbG93cyBmb3IgU0hBMjI0LzI1NiBhbmQgU0hBMzg0LzUxMiBzdXBwb3J0IGV2ZW4gdGhvdWdoCisgICAgICAgICMgdGhlIE9wZW5TU0wgbGlicmFyeSBwcmlvciB0byAwLjkuOCBkb2Vzbid0IHByb3ZpZGUgdGhlbS4KKyAgICAgICAgcmV0dXJuIF9fZ2V0X2J1aWx0aW5fY29uc3RydWN0b3IobmFtZSkoc3RyaW5nKQorCisKK3RyeToKKyAgICBpbXBvcnQgX2hhc2hsaWIKKyAgICBuZXcgPSBfX2hhc2hfbmV3CisgICAgX19nZXRfaGFzaCA9IF9fZ2V0X29wZW5zc2xfY29uc3RydWN0b3IKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBuZXcgPSBfX3B5X25ldworICAgIF9fZ2V0X2hhc2ggPSBfX2dldF9idWlsdGluX2NvbnN0cnVjdG9yCisKK2ZvciBfX2Z1bmNfbmFtZSBpbiBfX2Fsd2F5c19zdXBwb3J0ZWQ6CisgICAgIyB0cnkgdGhlbSBhbGwsIHNvbWUgbWF5IG5vdCB3b3JrIGR1ZSB0byB0aGUgT3BlblNTTAorICAgICMgdmVyc2lvbiBub3Qgc3VwcG9ydGluZyB0aGF0IGFsZ29yaXRobS4KKyAgICB0cnk6CisgICAgICAgIGdsb2JhbHMoKVtfX2Z1bmNfbmFtZV0gPSBfX2dldF9oYXNoKF9fZnVuY19uYW1lKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBpbXBvcnQgbG9nZ2luZworICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbignY29kZSBmb3IgaGFzaCAlcyB3YXMgbm90IGZvdW5kLicsIF9fZnVuY19uYW1lKQorCisjIENsZWFudXAgbG9jYWxzKCkKK2RlbCBfX2Fsd2F5c19zdXBwb3J0ZWQsIF9fZnVuY19uYW1lLCBfX2dldF9oYXNoCitkZWwgX19weV9uZXcsIF9faGFzaF9uZXcsIF9fZ2V0X29wZW5zc2xfY29uc3RydWN0b3IKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaGFzaGxpYi5weWMgYi9saWIvcHl0aG9uMi43L2hhc2hsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODFiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hhc2hsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaGFzaGxpYi5weW8gYi9saWIvcHl0aG9uMi43L2hhc2hsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODFiY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hhc2hsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaGVhcHEucHkgYi9saWIvcHl0aG9uMi43L2hlYXBxLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzlkYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hlYXBxLnB5CkBAIC0wLDAgKzEsNDgwIEBACisjIC0qLSBjb2Rpbmc6IGxhdGluLTEgLSotCisKKyIiIkhlYXAgcXVldWUgYWxnb3JpdGhtIChhLmsuYS4gcHJpb3JpdHkgcXVldWUpLgorCitIZWFwcyBhcmUgYXJyYXlzIGZvciB3aGljaCBhW2tdIDw9IGFbMiprKzFdIGFuZCBhW2tdIDw9IGFbMiprKzJdIGZvcgorYWxsIGssIGNvdW50aW5nIGVsZW1lbnRzIGZyb20gMC4gIEZvciB0aGUgc2FrZSBvZiBjb21wYXJpc29uLAorbm9uLWV4aXN0aW5nIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIHRvIGJlIGluZmluaXRlLiAgVGhlIGludGVyZXN0aW5nCitwcm9wZXJ0eSBvZiBhIGhlYXAgaXMgdGhhdCBhWzBdIGlzIGFsd2F5cyBpdHMgc21hbGxlc3QgZWxlbWVudC4KKworVXNhZ2U6CisKK2hlYXAgPSBbXSAgICAgICAgICAgICMgY3JlYXRlcyBhbiBlbXB0eSBoZWFwCitoZWFwcHVzaChoZWFwLCBpdGVtKSAjIHB1c2hlcyBhIG5ldyBpdGVtIG9uIHRoZSBoZWFwCitpdGVtID0gaGVhcHBvcChoZWFwKSAjIHBvcHMgdGhlIHNtYWxsZXN0IGl0ZW0gZnJvbSB0aGUgaGVhcAoraXRlbSA9IGhlYXBbMF0gICAgICAgIyBzbWFsbGVzdCBpdGVtIG9uIHRoZSBoZWFwIHdpdGhvdXQgcG9wcGluZyBpdAoraGVhcGlmeSh4KSAgICAgICAgICAgIyB0cmFuc2Zvcm1zIGxpc3QgaW50byBhIGhlYXAsIGluLXBsYWNlLCBpbiBsaW5lYXIgdGltZQoraXRlbSA9IGhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pICMgcG9wcyBhbmQgcmV0dXJucyBzbWFsbGVzdCBpdGVtLCBhbmQgYWRkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbmV3IGl0ZW07IHRoZSBoZWFwIHNpemUgaXMgdW5jaGFuZ2VkCisKK091ciBBUEkgZGlmZmVycyBmcm9tIHRleHRib29rIGhlYXAgYWxnb3JpdGhtcyBhcyBmb2xsb3dzOgorCistIFdlIHVzZSAwLWJhc2VkIGluZGV4aW5nLiAgVGhpcyBtYWtlcyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlCisgIGluZGV4IGZvciBhIG5vZGUgYW5kIHRoZSBpbmRleGVzIGZvciBpdHMgY2hpbGRyZW4gc2xpZ2h0bHkgbGVzcworICBvYnZpb3VzLCBidXQgaXMgbW9yZSBzdWl0YWJsZSBzaW5jZSBQeXRob24gdXNlcyAwLWJhc2VkIGluZGV4aW5nLgorCistIE91ciBoZWFwcG9wKCkgbWV0aG9kIHJldHVybnMgdGhlIHNtYWxsZXN0IGl0ZW0sIG5vdCB0aGUgbGFyZ2VzdC4KKworVGhlc2UgdHdvIG1ha2UgaXQgcG9zc2libGUgdG8gdmlldyB0aGUgaGVhcCBhcyBhIHJlZ3VsYXIgUHl0aG9uIGxpc3QKK3dpdGhvdXQgc3VycHJpc2VzOiBoZWFwWzBdIGlzIHRoZSBzbWFsbGVzdCBpdGVtLCBhbmQgaGVhcC5zb3J0KCkKK21haW50YWlucyB0aGUgaGVhcCBpbnZhcmlhbnQhCisiIiIKKworIyBPcmlnaW5hbCBjb2RlIGJ5IEtldmluIE8nQ29ubm9yLCBhdWdtZW50ZWQgYnkgVGltIFBldGVycyBhbmQgUmF5bW9uZCBIZXR0aW5nZXIKKworX19hYm91dF9fID0gIiIiSGVhcCBxdWV1ZXMKKworW2V4cGxhbmF0aW9uIGJ5IEZyYW7nb2lzIFBpbmFyZF0KKworSGVhcHMgYXJlIGFycmF5cyBmb3Igd2hpY2ggYVtrXSA8PSBhWzIqaysxXSBhbmQgYVtrXSA8PSBhWzIqaysyXSBmb3IKK2FsbCBrLCBjb3VudGluZyBlbGVtZW50cyBmcm9tIDAuICBGb3IgdGhlIHNha2Ugb2YgY29tcGFyaXNvbiwKK25vbi1leGlzdGluZyBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCB0byBiZSBpbmZpbml0ZS4gIFRoZSBpbnRlcmVzdGluZworcHJvcGVydHkgb2YgYSBoZWFwIGlzIHRoYXQgYVswXSBpcyBhbHdheXMgaXRzIHNtYWxsZXN0IGVsZW1lbnQuCisKK1RoZSBzdHJhbmdlIGludmFyaWFudCBhYm92ZSBpcyBtZWFudCB0byBiZSBhbiBlZmZpY2llbnQgbWVtb3J5CityZXByZXNlbnRhdGlvbiBmb3IgYSB0b3VybmFtZW50LiAgVGhlIG51bWJlcnMgYmVsb3cgYXJlIGBrJywgbm90IGFba106CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisgICAgICAgICAgMyAgICAgICAgICAgICAgIDQgICAgICAgICAgICAgICAgNSAgICAgICAgICAgICAgIDYKKworICAgICAgNyAgICAgICA4ICAgICAgIDkgICAgICAgMTAgICAgICAxMSAgICAgIDEyICAgICAgMTMgICAgICAxNAorCisgICAgMTUgMTYgICAxNyAxOCAgIDE5IDIwICAgMjEgMjIgICAyMyAyNCAgIDI1IDI2ICAgMjcgMjggICAyOSAzMAorCisKK0luIHRoZSB0cmVlIGFib3ZlLCBlYWNoIGNlbGwgYGsnIGlzIHRvcHBpbmcgYDIqaysxJyBhbmQgYDIqaysyJy4gIEluCithbiB1c3VhbCBiaW5hcnkgdG91cm5hbWVudCB3ZSBzZWUgaW4gc3BvcnRzLCBlYWNoIGNlbGwgaXMgdGhlIHdpbm5lcgorb3ZlciB0aGUgdHdvIGNlbGxzIGl0IHRvcHMsIGFuZCB3ZSBjYW4gdHJhY2UgdGhlIHdpbm5lciBkb3duIHRoZSB0cmVlCit0byBzZWUgYWxsIG9wcG9uZW50cyBzL2hlIGhhZC4gIEhvd2V2ZXIsIGluIG1hbnkgY29tcHV0ZXIgYXBwbGljYXRpb25zCitvZiBzdWNoIHRvdXJuYW1lbnRzLCB3ZSBkbyBub3QgbmVlZCB0byB0cmFjZSB0aGUgaGlzdG9yeSBvZiBhIHdpbm5lci4KK1RvIGJlIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgd2hlbiBhIHdpbm5lciBpcyBwcm9tb3RlZCwgd2UgdHJ5IHRvCityZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBlbHNlIGF0IGEgbG93ZXIgbGV2ZWwsIGFuZCB0aGUgcnVsZSBiZWNvbWVzCit0aGF0IGEgY2VsbCBhbmQgdGhlIHR3byBjZWxscyBpdCB0b3BzIGNvbnRhaW4gdGhyZWUgZGlmZmVyZW50IGl0ZW1zLAorYnV0IHRoZSB0b3AgY2VsbCAid2lucyIgb3ZlciB0aGUgdHdvIHRvcHBlZCBjZWxscy4KKworSWYgdGhpcyBoZWFwIGludmFyaWFudCBpcyBwcm90ZWN0ZWQgYXQgYWxsIHRpbWUsIGluZGV4IDAgaXMgY2xlYXJseQordGhlIG92ZXJhbGwgd2lubmVyLiAgVGhlIHNpbXBsZXN0IGFsZ29yaXRobWljIHdheSB0byByZW1vdmUgaXQgYW5kCitmaW5kIHRoZSAibmV4dCIgd2lubmVyIGlzIHRvIG1vdmUgc29tZSBsb3NlciAobGV0J3Mgc2F5IGNlbGwgMzAgaW4gdGhlCitkaWFncmFtIGFib3ZlKSBpbnRvIHRoZSAwIHBvc2l0aW9uLCBhbmQgdGhlbiBwZXJjb2xhdGUgdGhpcyBuZXcgMCBkb3duCit0aGUgdHJlZSwgZXhjaGFuZ2luZyB2YWx1ZXMsIHVudGlsIHRoZSBpbnZhcmlhbnQgaXMgcmUtZXN0YWJsaXNoZWQuCitUaGlzIGlzIGNsZWFybHkgbG9nYXJpdGhtaWMgb24gdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgdHJlZS4KK0J5IGl0ZXJhdGluZyBvdmVyIGFsbCBpdGVtcywgeW91IGdldCBhbiBPKG4gbG4gbikgc29ydC4KKworQSBuaWNlIGZlYXR1cmUgb2YgdGhpcyBzb3J0IGlzIHRoYXQgeW91IGNhbiBlZmZpY2llbnRseSBpbnNlcnQgbmV3CitpdGVtcyB3aGlsZSB0aGUgc29ydCBpcyBnb2luZyBvbiwgcHJvdmlkZWQgdGhhdCB0aGUgaW5zZXJ0ZWQgaXRlbXMgYXJlCitub3QgImJldHRlciIgdGhhbiB0aGUgbGFzdCAwJ3RoIGVsZW1lbnQgeW91IGV4dHJhY3RlZC4gIFRoaXMgaXMKK2VzcGVjaWFsbHkgdXNlZnVsIGluIHNpbXVsYXRpb24gY29udGV4dHMsIHdoZXJlIHRoZSB0cmVlIGhvbGRzIGFsbAoraW5jb21pbmcgZXZlbnRzLCBhbmQgdGhlICJ3aW4iIGNvbmRpdGlvbiBtZWFucyB0aGUgc21hbGxlc3Qgc2NoZWR1bGVkCit0aW1lLiAgV2hlbiBhbiBldmVudCBzY2hlZHVsZSBvdGhlciBldmVudHMgZm9yIGV4ZWN1dGlvbiwgdGhleSBhcmUKK3NjaGVkdWxlZCBpbnRvIHRoZSBmdXR1cmUsIHNvIHRoZXkgY2FuIGVhc2lseSBnbyBpbnRvIHRoZSBoZWFwLiAgU28sIGEKK2hlYXAgaXMgYSBnb29kIHN0cnVjdHVyZSBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgKHRoaXMgaXMgd2hhdCBJCit1c2VkIGZvciBteSBNSURJIHNlcXVlbmNlciA6LSkuCisKK1ZhcmlvdXMgc3RydWN0dXJlcyBmb3IgaW1wbGVtZW50aW5nIHNjaGVkdWxlcnMgaGF2ZSBiZWVuIGV4dGVuc2l2ZWx5CitzdHVkaWVkLCBhbmQgaGVhcHMgYXJlIGdvb2QgZm9yIHRoaXMsIGFzIHRoZXkgYXJlIHJlYXNvbmFibHkgc3BlZWR5LAordGhlIHNwZWVkIGlzIGFsbW9zdCBjb25zdGFudCwgYW5kIHRoZSB3b3JzdCBjYXNlIGlzIG5vdCBtdWNoIGRpZmZlcmVudAordGhhbiB0aGUgYXZlcmFnZSBjYXNlLiAgSG93ZXZlciwgdGhlcmUgYXJlIG90aGVyIHJlcHJlc2VudGF0aW9ucyB3aGljaAorYXJlIG1vcmUgZWZmaWNpZW50IG92ZXJhbGwsIHlldCB0aGUgd29yc3QgY2FzZXMgbWlnaHQgYmUgdGVycmlibGUuCisKK0hlYXBzIGFyZSBhbHNvIHZlcnkgdXNlZnVsIGluIGJpZyBkaXNrIHNvcnRzLiAgWW91IG1vc3QgcHJvYmFibHkgYWxsCitrbm93IHRoYXQgYSBiaWcgc29ydCBpbXBsaWVzIHByb2R1Y2luZyAicnVucyIgKHdoaWNoIGFyZSBwcmUtc29ydGVkCitzZXF1ZW5jZXMsIHdoaWNoIHNpemUgaXMgdXN1YWxseSByZWxhdGVkIHRvIHRoZSBhbW91bnQgb2YgQ1BVIG1lbW9yeSksCitmb2xsb3dlZCBieSBhIG1lcmdpbmcgcGFzc2VzIGZvciB0aGVzZSBydW5zLCB3aGljaCBtZXJnaW5nIGlzIG9mdGVuCit2ZXJ5IGNsZXZlcmx5IG9yZ2FuaXNlZFsxXS4gIEl0IGlzIHZlcnkgaW1wb3J0YW50IHRoYXQgdGhlIGluaXRpYWwKK3NvcnQgcHJvZHVjZXMgdGhlIGxvbmdlc3QgcnVucyBwb3NzaWJsZS4gIFRvdXJuYW1lbnRzIGFyZSBhIGdvb2Qgd2F5Cit0byB0aGF0LiAgSWYsIHVzaW5nIGFsbCB0aGUgbWVtb3J5IGF2YWlsYWJsZSB0byBob2xkIGEgdG91cm5hbWVudCwgeW91CityZXBsYWNlIGFuZCBwZXJjb2xhdGUgaXRlbXMgdGhhdCBoYXBwZW4gdG8gZml0IHRoZSBjdXJyZW50IHJ1biwgeW91J2xsCitwcm9kdWNlIHJ1bnMgd2hpY2ggYXJlIHR3aWNlIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgZm9yIHJhbmRvbSBpbnB1dCwKK2FuZCBtdWNoIGJldHRlciBmb3IgaW5wdXQgZnV6emlseSBvcmRlcmVkLgorCitNb3Jlb3ZlciwgaWYgeW91IG91dHB1dCB0aGUgMCd0aCBpdGVtIG9uIGRpc2sgYW5kIGdldCBhbiBpbnB1dCB3aGljaAorbWF5IG5vdCBmaXQgaW4gdGhlIGN1cnJlbnQgdG91cm5hbWVudCAoYmVjYXVzZSB0aGUgdmFsdWUgIndpbnMiIG92ZXIKK3RoZSBsYXN0IG91dHB1dCB2YWx1ZSksIGl0IGNhbm5vdCBmaXQgaW4gdGhlIGhlYXAsIHNvIHRoZSBzaXplIG9mIHRoZQoraGVhcCBkZWNyZWFzZXMuICBUaGUgZnJlZWQgbWVtb3J5IGNvdWxkIGJlIGNsZXZlcmx5IHJldXNlZCBpbW1lZGlhdGVseQorZm9yIHByb2dyZXNzaXZlbHkgYnVpbGRpbmcgYSBzZWNvbmQgaGVhcCwgd2hpY2ggZ3Jvd3MgYXQgZXhhY3RseSB0aGUKK3NhbWUgcmF0ZSB0aGUgZmlyc3QgaGVhcCBpcyBtZWx0aW5nLiAgV2hlbiB0aGUgZmlyc3QgaGVhcCBjb21wbGV0ZWx5Cit2YW5pc2hlcywgeW91IHN3aXRjaCBoZWFwcyBhbmQgc3RhcnQgYSBuZXcgcnVuLiAgQ2xldmVyIGFuZCBxdWl0ZQorZWZmZWN0aXZlIQorCitJbiBhIHdvcmQsIGhlYXBzIGFyZSB1c2VmdWwgbWVtb3J5IHN0cnVjdHVyZXMgdG8ga25vdy4gIEkgdXNlIHRoZW0gaW4KK2EgZmV3IGFwcGxpY2F0aW9ucywgYW5kIEkgdGhpbmsgaXQgaXMgZ29vZCB0byBrZWVwIGEgYGhlYXAnIG1vZHVsZQorYXJvdW5kLiA6LSkKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1sxXSBUaGUgZGlzayBiYWxhbmNpbmcgYWxnb3JpdGhtcyB3aGljaCBhcmUgY3VycmVudCwgbm93YWRheXMsIGFyZQorbW9yZSBhbm5veWluZyB0aGFuIGNsZXZlciwgYW5kIHRoaXMgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc2Vla2luZworY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNrcy4gIE9uIGRldmljZXMgd2hpY2ggY2Fubm90IHNlZWssIGxpa2UgYmlnCit0YXBlIGRyaXZlcywgdGhlIHN0b3J5IHdhcyBxdWl0ZSBkaWZmZXJlbnQsIGFuZCBvbmUgaGFkIHRvIGJlIHZlcnkKK2NsZXZlciB0byBlbnN1cmUgKGZhciBpbiBhZHZhbmNlKSB0aGF0IGVhY2ggdGFwZSBtb3ZlbWVudCB3aWxsIGJlIHRoZQorbW9zdCBlZmZlY3RpdmUgcG9zc2libGUgKHRoYXQgaXMsIHdpbGwgYmVzdCBwYXJ0aWNpcGF0ZSBhdAorInByb2dyZXNzaW5nIiB0aGUgbWVyZ2UpLiAgU29tZSB0YXBlcyB3ZXJlIGV2ZW4gYWJsZSB0byByZWFkCitiYWNrd2FyZHMsIGFuZCB0aGlzIHdhcyBhbHNvIHVzZWQgdG8gYXZvaWQgdGhlIHJld2luZGluZyB0aW1lLgorQmVsaWV2ZSBtZSwgcmVhbCBnb29kIHRhcGUgc29ydHMgd2VyZSBxdWl0ZSBzcGVjdGFjdWxhciB0byB3YXRjaCEKK0Zyb20gYWxsIHRpbWVzLCBzb3J0aW5nIGhhcyBhbHdheXMgYmVlbiBhIEdyZWF0IEFydCEgOi0pCisiIiIKKworX19hbGxfXyA9IFsnaGVhcHB1c2gnLCAnaGVhcHBvcCcsICdoZWFwaWZ5JywgJ2hlYXByZXBsYWNlJywgJ21lcmdlJywKKyAgICAgICAgICAgJ25sYXJnZXN0JywgJ25zbWFsbGVzdCcsICdoZWFwcHVzaHBvcCddCisKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UsIGNvdW50LCBpbWFwLCBpemlwLCB0ZWUsIGNoYWluCitmcm9tIG9wZXJhdG9yIGltcG9ydCBpdGVtZ2V0dGVyCisKK2RlZiBjbXBfbHQoeCwgeSk6CisgICAgIyBVc2UgX19sdF9fIGlmIGF2YWlsYWJsZTsgb3RoZXJ3aXNlLCB0cnkgX19sZV9fLgorICAgICMgSW4gUHkzLngsIG9ubHkgX19sdF9fIHdpbGwgYmUgY2FsbGVkLgorICAgIHJldHVybiAoeCA8IHkpIGlmIGhhc2F0dHIoeCwgJ19fbHRfXycpIGVsc2UgKG5vdCB5IDw9IHgpCisKK2RlZiBoZWFwcHVzaChoZWFwLCBpdGVtKToKKyAgICAiIiJQdXNoIGl0ZW0gb250byBoZWFwLCBtYWludGFpbmluZyB0aGUgaGVhcCBpbnZhcmlhbnQuIiIiCisgICAgaGVhcC5hcHBlbmQoaXRlbSkKKyAgICBfc2lmdGRvd24oaGVhcCwgMCwgbGVuKGhlYXApLTEpCisKK2RlZiBoZWFwcG9wKGhlYXApOgorICAgICIiIlBvcCB0aGUgc21hbGxlc3QgaXRlbSBvZmYgdGhlIGhlYXAsIG1haW50YWluaW5nIHRoZSBoZWFwIGludmFyaWFudC4iIiIKKyAgICBsYXN0ZWx0ID0gaGVhcC5wb3AoKSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkKKyAgICBpZiBoZWFwOgorICAgICAgICByZXR1cm5pdGVtID0gaGVhcFswXQorICAgICAgICBoZWFwWzBdID0gbGFzdGVsdAorICAgICAgICBfc2lmdHVwKGhlYXAsIDApCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuaXRlbSA9IGxhc3RlbHQKKyAgICByZXR1cm4gcmV0dXJuaXRlbQorCitkZWYgaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSk6CisgICAgIiIiUG9wIGFuZCByZXR1cm4gdGhlIGN1cnJlbnQgc21hbGxlc3QgdmFsdWUsIGFuZCBhZGQgdGhlIG5ldyBpdGVtLgorCisgICAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGhlYXBwb3AoKSBmb2xsb3dlZCBieSBoZWFwcHVzaCgpLCBhbmQgY2FuIGJlCisgICAgbW9yZSBhcHByb3ByaWF0ZSB3aGVuIHVzaW5nIGEgZml4ZWQtc2l6ZSBoZWFwLiAgTm90ZSB0aGF0IHRoZSB2YWx1ZQorICAgIHJldHVybmVkIG1heSBiZSBsYXJnZXIgdGhhbiBpdGVtISAgVGhhdCBjb25zdHJhaW5zIHJlYXNvbmFibGUgdXNlcyBvZgorICAgIHRoaXMgcm91dGluZSB1bmxlc3Mgd3JpdHRlbiBhcyBwYXJ0IG9mIGEgY29uZGl0aW9uYWwgcmVwbGFjZW1lbnQ6CisKKyAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06CisgICAgICAgICAgICBpdGVtID0gaGVhcHJlcGxhY2UoaGVhcCwgaXRlbSkKKyAgICAiIiIKKyAgICByZXR1cm5pdGVtID0gaGVhcFswXSAgICAjIHJhaXNlcyBhcHByb3ByaWF0ZSBJbmRleEVycm9yIGlmIGhlYXAgaXMgZW1wdHkKKyAgICBoZWFwWzBdID0gaXRlbQorICAgIF9zaWZ0dXAoaGVhcCwgMCkKKyAgICByZXR1cm4gcmV0dXJuaXRlbQorCitkZWYgaGVhcHB1c2hwb3AoaGVhcCwgaXRlbSk6CisgICAgIiIiRmFzdCB2ZXJzaW9uIG9mIGEgaGVhcHB1c2ggZm9sbG93ZWQgYnkgYSBoZWFwcG9wLiIiIgorICAgIGlmIGhlYXAgYW5kIGNtcF9sdChoZWFwWzBdLCBpdGVtKToKKyAgICAgICAgaXRlbSwgaGVhcFswXSA9IGhlYXBbMF0sIGl0ZW0KKyAgICAgICAgX3NpZnR1cChoZWFwLCAwKQorICAgIHJldHVybiBpdGVtCisKK2RlZiBoZWFwaWZ5KHgpOgorICAgICIiIlRyYW5zZm9ybSBsaXN0IGludG8gYSBoZWFwLCBpbi1wbGFjZSwgaW4gTyhsZW4oeCkpIHRpbWUuIiIiCisgICAgbiA9IGxlbih4KQorICAgICMgVHJhbnNmb3JtIGJvdHRvbS11cC4gIFRoZSBsYXJnZXN0IGluZGV4IHRoZXJlJ3MgYW55IHBvaW50IHRvIGxvb2tpbmcgYXQKKyAgICAjIGlzIHRoZSBsYXJnZXN0IHdpdGggYSBjaGlsZCBpbmRleCBpbi1yYW5nZSwgc28gbXVzdCBoYXZlIDIqaSArIDEgPCBuLAorICAgICMgb3IgaSA8IChuLTEpLzIuICBJZiBuIGlzIGV2ZW4gPSAyKmosIHRoaXMgaXMgKDIqai0xKS8yID0gai0xLzIgc28KKyAgICAjIGotMSBpcyB0aGUgbGFyZ2VzdCwgd2hpY2ggaXMgbi8vMiAtIDEuICBJZiBuIGlzIG9kZCA9IDIqaisxLCB0aGlzIGlzCisgICAgIyAoMipqKzEtMSkvMiA9IGogc28gai0xIGlzIHRoZSBsYXJnZXN0LCBhbmQgdGhhdCdzIGFnYWluIG4vLzItMS4KKyAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2Uobi8vMikpOgorICAgICAgICBfc2lmdHVwKHgsIGkpCisKK2RlZiBfaGVhcHB1c2hwb3BfbWF4KGhlYXAsIGl0ZW0pOgorICAgICIiIk1heGhlYXAgdmVyc2lvbiBvZiBhIGhlYXBwdXNoIGZvbGxvd2VkIGJ5IGEgaGVhcHBvcC4iIiIKKyAgICBpZiBoZWFwIGFuZCBjbXBfbHQoaXRlbSwgaGVhcFswXSk6CisgICAgICAgIGl0ZW0sIGhlYXBbMF0gPSBoZWFwWzBdLCBpdGVtCisgICAgICAgIF9zaWZ0dXBfbWF4KGhlYXAsIDApCisgICAgcmV0dXJuIGl0ZW0KKworZGVmIF9oZWFwaWZ5X21heCh4KToKKyAgICAiIiJUcmFuc2Zvcm0gbGlzdCBpbnRvIGEgbWF4aGVhcCwgaW4tcGxhY2UsIGluIE8obGVuKHgpKSB0aW1lLiIiIgorICAgIG4gPSBsZW4oeCkKKyAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShuLy8yKSk6CisgICAgICAgIF9zaWZ0dXBfbWF4KHgsIGkpCisKK2RlZiBubGFyZ2VzdChuLCBpdGVyYWJsZSk6CisgICAgIiIiRmluZCB0aGUgbiBsYXJnZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KKworICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIHJldmVyc2U9VHJ1ZSlbOm5dCisgICAgIiIiCisgICAgaWYgbiA8IDA6CisgICAgICAgIHJldHVybiBbXQorICAgIGl0ID0gaXRlcihpdGVyYWJsZSkKKyAgICByZXN1bHQgPSBsaXN0KGlzbGljZShpdCwgbikpCisgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgIGhlYXBpZnkocmVzdWx0KQorICAgIF9oZWFwcHVzaHBvcCA9IGhlYXBwdXNocG9wCisgICAgZm9yIGVsZW0gaW4gaXQ6CisgICAgICAgIF9oZWFwcHVzaHBvcChyZXN1bHQsIGVsZW0pCisgICAgcmVzdWx0LnNvcnQocmV2ZXJzZT1UcnVlKQorICAgIHJldHVybiByZXN1bHQKKworZGVmIG5zbWFsbGVzdChuLCBpdGVyYWJsZSk6CisgICAgIiIiRmluZCB0aGUgbiBzbWFsbGVzdCBlbGVtZW50cyBpbiBhIGRhdGFzZXQuCisKKyAgICBFcXVpdmFsZW50IHRvOiAgc29ydGVkKGl0ZXJhYmxlKVs6bl0KKyAgICAiIiIKKyAgICBpZiBuIDwgMDoKKyAgICAgICAgcmV0dXJuIFtdCisgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQorICAgIHJlc3VsdCA9IGxpc3QoaXNsaWNlKGl0LCBuKSkKKyAgICBpZiBub3QgcmVzdWx0OgorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgX2hlYXBpZnlfbWF4KHJlc3VsdCkKKyAgICBfaGVhcHB1c2hwb3AgPSBfaGVhcHB1c2hwb3BfbWF4CisgICAgZm9yIGVsZW0gaW4gaXQ6CisgICAgICAgIF9oZWFwcHVzaHBvcChyZXN1bHQsIGVsZW0pCisgICAgcmVzdWx0LnNvcnQoKQorICAgIHJldHVybiByZXN1bHQKKworIyAnaGVhcCcgaXMgYSBoZWFwIGF0IGFsbCBpbmRpY2VzID49IHN0YXJ0cG9zLCBleGNlcHQgcG9zc2libHkgZm9yIHBvcy4gIHBvcworIyBpcyB0aGUgaW5kZXggb2YgYSBsZWFmIHdpdGggYSBwb3NzaWJseSBvdXQtb2Ytb3JkZXIgdmFsdWUuICBSZXN0b3JlIHRoZQorIyBoZWFwIGludmFyaWFudC4KK2RlZiBfc2lmdGRvd24oaGVhcCwgc3RhcnRwb3MsIHBvcyk6CisgICAgbmV3aXRlbSA9IGhlYXBbcG9zXQorICAgICMgRm9sbG93IHRoZSBwYXRoIHRvIHRoZSByb290LCBtb3ZpbmcgcGFyZW50cyBkb3duIHVudGlsIGZpbmRpbmcgYSBwbGFjZQorICAgICMgbmV3aXRlbSBmaXRzLgorICAgIHdoaWxlIHBvcyA+IHN0YXJ0cG9zOgorICAgICAgICBwYXJlbnRwb3MgPSAocG9zIC0gMSkgPj4gMQorICAgICAgICBwYXJlbnQgPSBoZWFwW3BhcmVudHBvc10KKyAgICAgICAgaWYgY21wX2x0KG5ld2l0ZW0sIHBhcmVudCk6CisgICAgICAgICAgICBoZWFwW3Bvc10gPSBwYXJlbnQKKyAgICAgICAgICAgIHBvcyA9IHBhcmVudHBvcworICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgYnJlYWsKKyAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCisKKyMgVGhlIGNoaWxkIGluZGljZXMgb2YgaGVhcCBpbmRleCBwb3MgYXJlIGFscmVhZHkgaGVhcHMsIGFuZCB3ZSB3YW50IHRvIG1ha2UKKyMgYSBoZWFwIGF0IGluZGV4IHBvcyB0b28uICBXZSBkbyB0aGlzIGJ5IGJ1YmJsaW5nIHRoZSBzbWFsbGVyIGNoaWxkIG9mCisjIHBvcyB1cCAoYW5kIHNvIG9uIHdpdGggdGhhdCBjaGlsZCdzIGNoaWxkcmVuLCBldGMpIHVudGlsIGhpdHRpbmcgYSBsZWFmLAorIyB0aGVuIHVzaW5nIF9zaWZ0ZG93biB0byBtb3ZlIHRoZSBvZGRiYWxsIG9yaWdpbmFsbHkgYXQgaW5kZXggcG9zIGludG8gcGxhY2UuCisjCisjIFdlICpjb3VsZCogYnJlYWsgb3V0IG9mIHRoZSBsb29wIGFzIHNvb24gYXMgd2UgZmluZCBhIHBvcyB3aGVyZSBuZXdpdGVtIDw9CisjIGJvdGggaXRzIGNoaWxkcmVuLCBidXQgdHVybnMgb3V0IHRoYXQncyBub3QgYSBnb29kIGlkZWEsIGFuZCBkZXNwaXRlIHRoYXQKKyMgbWFueSBib29rcyB3cml0ZSB0aGUgYWxnb3JpdGhtIHRoYXQgd2F5LiAgRHVyaW5nIGEgaGVhcCBwb3AsIHRoZSBsYXN0IGFycmF5CisjIGVsZW1lbnQgaXMgc2lmdGVkIGluLCBhbmQgdGhhdCB0ZW5kcyB0byBiZSBsYXJnZSwgc28gdGhhdCBjb21wYXJpbmcgaXQKKyMgYWdhaW5zdCB2YWx1ZXMgc3RhcnRpbmcgZnJvbSB0aGUgcm9vdCB1c3VhbGx5IGRvZXNuJ3QgcGF5ICg9IHVzdWFsbHkgZG9lc24ndAorIyBnZXQgdXMgb3V0IG9mIHRoZSBsb29wIGVhcmx5KS4gIFNlZSBLbnV0aCwgVm9sdW1lIDMsIHdoZXJlIHRoaXMgaXMKKyMgZXhwbGFpbmVkIGFuZCBxdWFudGlmaWVkIGluIGFuIGV4ZXJjaXNlLgorIworIyBDdXR0aW5nIHRoZSAjIG9mIGNvbXBhcmlzb25zIGlzIGltcG9ydGFudCwgc2luY2UgdGhlc2Ugcm91dGluZXMgaGF2ZSBubworIyB3YXkgdG8gZXh0cmFjdCAidGhlIHByaW9yaXR5IiBmcm9tIGFuIGFycmF5IGVsZW1lbnQsIHNvIHRoYXQgaW50ZWxsaWdlbmNlCisjIGlzIGxpa2VseSB0byBiZSBoaWRpbmcgaW4gY3VzdG9tIF9fY21wX18gbWV0aG9kcywgb3IgaW4gYXJyYXkgZWxlbWVudHMKKyMgc3RvcmluZyAocHJpb3JpdHksIHJlY29yZCkgdHVwbGVzLiAgQ29tcGFyaXNvbnMgYXJlIHRodXMgcG90ZW50aWFsbHkKKyMgZXhwZW5zaXZlLgorIworIyBPbiByYW5kb20gYXJyYXlzIG9mIGxlbmd0aCAxMDAwLCBtYWtpbmcgdGhpcyBjaGFuZ2UgY3V0IHRoZSBudW1iZXIgb2YKKyMgY29tcGFyaXNvbnMgbWFkZSBieSBoZWFwaWZ5KCkgYSBsaXR0bGUsIGFuZCB0aG9zZSBtYWRlIGJ5IGV4aGF1c3RpdmUKKyMgaGVhcHBvcCgpIGEgbG90LCBpbiBhY2NvcmQgd2l0aCB0aGVvcnkuICBIZXJlIGFyZSB0eXBpY2FsIHJlc3VsdHMgZnJvbSAzCisjIHJ1bnMgKDMganVzdCB0byBkZW1vbnN0cmF0ZSBob3cgc21hbGwgdGhlIHZhcmlhbmNlIGlzKToKKyMKKyMgQ29tcGFyZXMgbmVlZGVkIGJ5IGhlYXBpZnkgICAgIENvbXBhcmVzIG5lZWRlZCBieSAxMDAwIGhlYXBwb3BzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAxODM3IGN1dCB0byAxNjYzICAgICAgICAgICAgICAgMTQ5OTYgY3V0IHRvIDg2ODAKKyMgMTg1NSBjdXQgdG8gMTY1OSAgICAgICAgICAgICAgIDE0OTY2IGN1dCB0byA4Njc4CisjIDE4NDcgY3V0IHRvIDE2NjAgICAgICAgICAgICAgICAxNTAyNCBjdXQgdG8gODcwMworIworIyBCdWlsZGluZyB0aGUgaGVhcCBieSB1c2luZyBoZWFwcHVzaCgpIDEwMDAgdGltZXMgaW5zdGVhZCByZXF1aXJlZAorIyAyMTk4LCAyMTQ4LCBhbmQgMjIxOSBjb21wYXJlczogIGhlYXBpZnkoKSBpcyBtb3JlIGVmZmljaWVudCwgd2hlbgorIyB5b3UgY2FuIHVzZSBpdC4KKyMKKyMgVGhlIHRvdGFsIGNvbXBhcmVzIG5lZWRlZCBieSBsaXN0LnNvcnQoKSBvbiB0aGUgc2FtZSBsaXN0cyB3ZXJlIDg2MjcsCisjIDg2MjcsIGFuZCA4NjMyICh0aGlzIHNob3VsZCBiZSBjb21wYXJlZCB0byB0aGUgc3VtIG9mIGhlYXBpZnkoKSBhbmQKKyMgaGVhcHBvcCgpIGNvbXBhcmVzKTogIGxpc3Quc29ydCgpIGlzICh1bnN1cnByaXNpbmdseSEpIG1vcmUgZWZmaWNpZW50CisjIGZvciBzb3J0aW5nLgorCitkZWYgX3NpZnR1cChoZWFwLCBwb3MpOgorICAgIGVuZHBvcyA9IGxlbihoZWFwKQorICAgIHN0YXJ0cG9zID0gcG9zCisgICAgbmV3aXRlbSA9IGhlYXBbcG9zXQorICAgICMgQnViYmxlIHVwIHRoZSBzbWFsbGVyIGNoaWxkIHVudGlsIGhpdHRpbmcgYSBsZWFmLgorICAgIGNoaWxkcG9zID0gMipwb3MgKyAxICAgICMgbGVmdG1vc3QgY2hpbGQgcG9zaXRpb24KKyAgICB3aGlsZSBjaGlsZHBvcyA8IGVuZHBvczoKKyAgICAgICAgIyBTZXQgY2hpbGRwb3MgdG8gaW5kZXggb2Ygc21hbGxlciBjaGlsZC4KKyAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDEKKyAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBjbXBfbHQoaGVhcFtjaGlsZHBvc10sIGhlYXBbcmlnaHRwb3NdKToKKyAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3MKKyAgICAgICAgIyBNb3ZlIHRoZSBzbWFsbGVyIGNoaWxkIHVwLgorICAgICAgICBoZWFwW3Bvc10gPSBoZWFwW2NoaWxkcG9zXQorICAgICAgICBwb3MgPSBjaGlsZHBvcworICAgICAgICBjaGlsZHBvcyA9IDIqcG9zICsgMQorICAgICMgVGhlIGxlYWYgYXQgcG9zIGlzIGVtcHR5IG5vdy4gIFB1dCBuZXdpdGVtIHRoZXJlLCBhbmQgYnViYmxlIGl0IHVwCisgICAgIyB0byBpdHMgZmluYWwgcmVzdGluZyBwbGFjZSAoYnkgc2lmdGluZyBpdHMgcGFyZW50cyBkb3duKS4KKyAgICBoZWFwW3Bvc10gPSBuZXdpdGVtCisgICAgX3NpZnRkb3duKGhlYXAsIHN0YXJ0cG9zLCBwb3MpCisKK2RlZiBfc2lmdGRvd25fbWF4KGhlYXAsIHN0YXJ0cG9zLCBwb3MpOgorICAgICdNYXhoZWFwIHZhcmlhbnQgb2YgX3NpZnRkb3duJworICAgIG5ld2l0ZW0gPSBoZWFwW3Bvc10KKyAgICAjIEZvbGxvdyB0aGUgcGF0aCB0byB0aGUgcm9vdCwgbW92aW5nIHBhcmVudHMgZG93biB1bnRpbCBmaW5kaW5nIGEgcGxhY2UKKyAgICAjIG5ld2l0ZW0gZml0cy4KKyAgICB3aGlsZSBwb3MgPiBzdGFydHBvczoKKyAgICAgICAgcGFyZW50cG9zID0gKHBvcyAtIDEpID4+IDEKKyAgICAgICAgcGFyZW50ID0gaGVhcFtwYXJlbnRwb3NdCisgICAgICAgIGlmIGNtcF9sdChwYXJlbnQsIG5ld2l0ZW0pOgorICAgICAgICAgICAgaGVhcFtwb3NdID0gcGFyZW50CisgICAgICAgICAgICBwb3MgPSBwYXJlbnRwb3MKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGJyZWFrCisgICAgaGVhcFtwb3NdID0gbmV3aXRlbQorCitkZWYgX3NpZnR1cF9tYXgoaGVhcCwgcG9zKToKKyAgICAnTWF4aGVhcCB2YXJpYW50IG9mIF9zaWZ0dXAnCisgICAgZW5kcG9zID0gbGVuKGhlYXApCisgICAgc3RhcnRwb3MgPSBwb3MKKyAgICBuZXdpdGVtID0gaGVhcFtwb3NdCisgICAgIyBCdWJibGUgdXAgdGhlIGxhcmdlciBjaGlsZCB1bnRpbCBoaXR0aW5nIGEgbGVhZi4KKyAgICBjaGlsZHBvcyA9IDIqcG9zICsgMSAgICAjIGxlZnRtb3N0IGNoaWxkIHBvc2l0aW9uCisgICAgd2hpbGUgY2hpbGRwb3MgPCBlbmRwb3M6CisgICAgICAgICMgU2V0IGNoaWxkcG9zIHRvIGluZGV4IG9mIGxhcmdlciBjaGlsZC4KKyAgICAgICAgcmlnaHRwb3MgPSBjaGlsZHBvcyArIDEKKyAgICAgICAgaWYgcmlnaHRwb3MgPCBlbmRwb3MgYW5kIG5vdCBjbXBfbHQoaGVhcFtyaWdodHBvc10sIGhlYXBbY2hpbGRwb3NdKToKKyAgICAgICAgICAgIGNoaWxkcG9zID0gcmlnaHRwb3MKKyAgICAgICAgIyBNb3ZlIHRoZSBsYXJnZXIgY2hpbGQgdXAuCisgICAgICAgIGhlYXBbcG9zXSA9IGhlYXBbY2hpbGRwb3NdCisgICAgICAgIHBvcyA9IGNoaWxkcG9zCisgICAgICAgIGNoaWxkcG9zID0gMipwb3MgKyAxCisgICAgIyBUaGUgbGVhZiBhdCBwb3MgaXMgZW1wdHkgbm93LiAgUHV0IG5ld2l0ZW0gdGhlcmUsIGFuZCBidWJibGUgaXQgdXAKKyAgICAjIHRvIGl0cyBmaW5hbCByZXN0aW5nIHBsYWNlIChieSBzaWZ0aW5nIGl0cyBwYXJlbnRzIGRvd24pLgorICAgIGhlYXBbcG9zXSA9IG5ld2l0ZW0KKyAgICBfc2lmdGRvd25fbWF4KGhlYXAsIHN0YXJ0cG9zLCBwb3MpCisKKyMgSWYgYXZhaWxhYmxlLCB1c2UgQyBpbXBsZW1lbnRhdGlvbgordHJ5OgorICAgIGZyb20gX2hlYXBxIGltcG9ydCAqCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCitkZWYgbWVyZ2UoKml0ZXJhYmxlcyk6CisgICAgJycnTWVyZ2UgbXVsdGlwbGUgc29ydGVkIGlucHV0cyBpbnRvIGEgc2luZ2xlIHNvcnRlZCBvdXRwdXQuCisKKyAgICBTaW1pbGFyIHRvIHNvcnRlZChpdGVydG9vbHMuY2hhaW4oKml0ZXJhYmxlcykpIGJ1dCByZXR1cm5zIGEgZ2VuZXJhdG9yLAorICAgIGRvZXMgbm90IHB1bGwgdGhlIGRhdGEgaW50byBtZW1vcnkgYWxsIGF0IG9uY2UsIGFuZCBhc3N1bWVzIHRoYXQgZWFjaCBvZgorICAgIHRoZSBpbnB1dCBzdHJlYW1zIGlzIGFscmVhZHkgc29ydGVkIChzbWFsbGVzdCB0byBsYXJnZXN0KS4KKworICAgID4+PiBsaXN0KG1lcmdlKFsxLDMsNSw3XSwgWzAsMiw0LDhdLCBbNSwxMCwxNSwyMF0sIFtdLCBbMjVdKSkKKyAgICBbMCwgMSwgMiwgMywgNCwgNSwgNSwgNywgOCwgMTAsIDE1LCAyMCwgMjVdCisKKyAgICAnJycKKyAgICBfaGVhcHBvcCwgX2hlYXByZXBsYWNlLCBfU3RvcEl0ZXJhdGlvbiA9IGhlYXBwb3AsIGhlYXByZXBsYWNlLCBTdG9wSXRlcmF0aW9uCisKKyAgICBoID0gW10KKyAgICBoX2FwcGVuZCA9IGguYXBwZW5kCisgICAgZm9yIGl0bnVtLCBpdCBpbiBlbnVtZXJhdGUobWFwKGl0ZXIsIGl0ZXJhYmxlcykpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0ID0gaXQubmV4dAorICAgICAgICAgICAgaF9hcHBlbmQoW25leHQoKSwgaXRudW0sIG5leHRdKQorICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisgICAgaGVhcGlmeShoKQorCisgICAgd2hpbGUgMToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB2LCBpdG51bSwgbmV4dCA9IHMgPSBoWzBdICAgIyByYWlzZXMgSW5kZXhFcnJvciB3aGVuIGggaXMgZW1wdHkKKyAgICAgICAgICAgICAgICB5aWVsZCB2CisgICAgICAgICAgICAgICAgc1swXSA9IG5leHQoKSAgICAgICAgICAgICAgICMgcmFpc2VzIFN0b3BJdGVyYXRpb24gd2hlbiBleGhhdXN0ZWQKKyAgICAgICAgICAgICAgICBfaGVhcHJlcGxhY2UoaCwgcykgICAgICAgICAgIyByZXN0b3JlIGhlYXAgY29uZGl0aW9uCisgICAgICAgIGV4Y2VwdCBfU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIF9oZWFwcG9wKGgpICAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1wdHkgaXRlcmF0b3IKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworIyBFeHRlbmQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBuc21hbGxlc3QgYW5kIG5sYXJnZXN0IHRvIHVzZSBhIGtleT0gYXJndW1lbnQKK19uc21hbGxlc3QgPSBuc21hbGxlc3QKK2RlZiBuc21hbGxlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToKKyAgICAiIiJGaW5kIHRoZSBuIHNtYWxsZXN0IGVsZW1lbnRzIGluIGEgZGF0YXNldC4KKworICAgIEVxdWl2YWxlbnQgdG86ICBzb3J0ZWQoaXRlcmFibGUsIGtleT1rZXkpWzpuXQorICAgICIiIgorICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtaW4oKSB3aGVuIGxlbihpdGVyYWJsZSk+MAorICAgIGlmIG4gPT0gMToKKyAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQorICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQorICAgICAgICBpZiBub3QgaGVhZDoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBpZiBrZXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSldCisgICAgICAgIHJldHVybiBbbWluKGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldCisKKyAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpCisgICAgdHJ5OgorICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBpZiBuID49IHNpemU6CisgICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5KVs6bl0KKworICAgICMgV2hlbiBrZXkgaXMgbm9uZSwgdXNlIHNpbXBsZXIgZGVjb3JhdGlvbgorICAgIGlmIGtleSBpcyBOb25lOgorICAgICAgICBpdCA9IGl6aXAoaXRlcmFibGUsIGNvdW50KCkpICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWNvcmF0ZQorICAgICAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQorICAgICAgICByZXR1cm4gbWFwKGl0ZW1nZXR0ZXIoMCksIHJlc3VsdCkgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCisKKyAgICAjIEdlbmVyYWwgY2FzZSwgc2xvd2VzdCBtZXRob2QKKyAgICBpbjEsIGluMiA9IHRlZShpdGVyYWJsZSkKKyAgICBpdCA9IGl6aXAoaW1hcChrZXksIGluMSksIGNvdW50KCksIGluMikgICAgICAgICAgICAgICAgICMgZGVjb3JhdGUKKyAgICByZXN1bHQgPSBfbnNtYWxsZXN0KG4sIGl0KQorICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCisKK19ubGFyZ2VzdCA9IG5sYXJnZXN0CitkZWYgbmxhcmdlc3QobiwgaXRlcmFibGUsIGtleT1Ob25lKToKKyAgICAiIiJGaW5kIHRoZSBuIGxhcmdlc3QgZWxlbWVudHMgaW4gYSBkYXRhc2V0LgorCisgICAgRXF1aXZhbGVudCB0bzogIHNvcnRlZChpdGVyYWJsZSwga2V5PWtleSwgcmV2ZXJzZT1UcnVlKVs6bl0KKyAgICAiIiIKKworICAgICMgU2hvcnQtY3V0IGZvciBuPT0xIGlzIHRvIHVzZSBtYXgoKSB3aGVuIGxlbihpdGVyYWJsZSk+MAorICAgIGlmIG4gPT0gMToKKyAgICAgICAgaXQgPSBpdGVyKGl0ZXJhYmxlKQorICAgICAgICBoZWFkID0gbGlzdChpc2xpY2UoaXQsIDEpKQorICAgICAgICBpZiBub3QgaGVhZDoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBpZiBrZXkgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSldCisgICAgICAgIHJldHVybiBbbWF4KGNoYWluKGhlYWQsIGl0KSwga2V5PWtleSldCisKKyAgICAjIFdoZW4gbj49c2l6ZSwgaXQncyBmYXN0ZXIgdG8gdXNlIHNvcnRlZCgpCisgICAgdHJ5OgorICAgICAgICBzaXplID0gbGVuKGl0ZXJhYmxlKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBpZiBuID49IHNpemU6CisgICAgICAgICAgICByZXR1cm4gc29ydGVkKGl0ZXJhYmxlLCBrZXk9a2V5LCByZXZlcnNlPVRydWUpWzpuXQorCisgICAgIyBXaGVuIGtleSBpcyBub25lLCB1c2Ugc2ltcGxlciBkZWNvcmF0aW9uCisgICAgaWYga2V5IGlzIE5vbmU6CisgICAgICAgIGl0ID0gaXppcChpdGVyYWJsZSwgY291bnQoMCwtMSkpICAgICAgICAgICAgICAgICAgICAjIGRlY29yYXRlCisgICAgICAgIHJlc3VsdCA9IF9ubGFyZ2VzdChuLCBpdCkKKyAgICAgICAgcmV0dXJuIG1hcChpdGVtZ2V0dGVyKDApLCByZXN1bHQpICAgICAgICAgICAgICAgICAgICMgdW5kZWNvcmF0ZQorCisgICAgIyBHZW5lcmFsIGNhc2UsIHNsb3dlc3QgbWV0aG9kCisgICAgaW4xLCBpbjIgPSB0ZWUoaXRlcmFibGUpCisgICAgaXQgPSBpemlwKGltYXAoa2V5LCBpbjEpLCBjb3VudCgwLC0xKSwgaW4yKSAgICAgICAgICAgICAjIGRlY29yYXRlCisgICAgcmVzdWx0ID0gX25sYXJnZXN0KG4sIGl0KQorICAgIHJldHVybiBtYXAoaXRlbWdldHRlcigyKSwgcmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgIyB1bmRlY29yYXRlCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBTaW1wbGUgc2FuaXR5IHRlc3QKKyAgICBoZWFwID0gW10KKyAgICBkYXRhID0gWzEsIDMsIDUsIDcsIDksIDIsIDQsIDYsIDgsIDBdCisgICAgZm9yIGl0ZW0gaW4gZGF0YToKKyAgICAgICAgaGVhcHB1c2goaGVhcCwgaXRlbSkKKyAgICBzb3J0ID0gW10KKyAgICB3aGlsZSBoZWFwOgorICAgICAgICBzb3J0LmFwcGVuZChoZWFwcG9wKGhlYXApKQorICAgIHByaW50IHNvcnQKKworICAgIGltcG9ydCBkb2N0ZXN0CisgICAgZG9jdGVzdC50ZXN0bW9kKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaGVhcHEucHljIGIvbGliL3B5dGhvbjIuNy9oZWFwcS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1ZmRmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaGVhcHEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaGVhcHEucHlvIGIvbGliL3B5dGhvbjIuNy9oZWFwcS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1ZmRmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaGVhcHEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG1hYy5weSBiL2xpYi9weXRob24yLjcvaG1hYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzg4MTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9obWFjLnB5CkBAIC0wLDAgKzEsMTMzIEBACisiIiJITUFDIChLZXllZC1IYXNoaW5nIGZvciBNZXNzYWdlIEF1dGhlbnRpY2F0aW9uKSBQeXRob24gbW9kdWxlLgorCitJbXBsZW1lbnRzIHRoZSBITUFDIGFsZ29yaXRobSBhcyBkZXNjcmliZWQgYnkgUkZDIDIxMDQuCisiIiIKKworaW1wb3J0IHdhcm5pbmdzIGFzIF93YXJuaW5ncworCit0cmFuc181QyA9ICIiLmpvaW4gKFtjaHIgKHggXiAweDVDKSBmb3IgeCBpbiB4cmFuZ2UoMjU2KV0pCit0cmFuc18zNiA9ICIiLmpvaW4gKFtjaHIgKHggXiAweDM2KSBmb3IgeCBpbiB4cmFuZ2UoMjU2KV0pCisKKyMgVGhlIHNpemUgb2YgdGhlIGRpZ2VzdHMgcmV0dXJuZWQgYnkgSE1BQyBkZXBlbmRzIG9uIHRoZSB1bmRlcmx5aW5nCisjIGhhc2hpbmcgbW9kdWxlIHVzZWQuICBVc2UgZGlnZXN0X3NpemUgZnJvbSB0aGUgaW5zdGFuY2Ugb2YgSE1BQyBpbnN0ZWFkLgorZGlnZXN0X3NpemUgPSBOb25lCisKKyMgQSB1bmlxdWUgb2JqZWN0IHBhc3NlZCBieSBITUFDLmNvcHkoKSB0byB0aGUgSE1BQyBjb25zdHJ1Y3RvciwgaW4gb3JkZXIKKyMgdGhhdCB0aGUgbGF0dGVyIHJldHVybiB2ZXJ5IHF1aWNrbHkuICBITUFDKCIiKSBpbiBjb250cmFzdCBpcyBxdWl0ZQorIyBleHBlbnNpdmUuCitfc2VjcmV0X2JhY2tkb29yX2tleSA9IFtdCisKK2NsYXNzIEhNQUM6CisgICAgIiIiUkZDIDIxMDQgSE1BQyBjbGFzcy4gIEFsc28gY29tcGxpZXMgd2l0aCBSRkMgNDIzMS4KKworICAgIFRoaXMgc3VwcG9ydHMgdGhlIEFQSSBmb3IgQ3J5cHRvZ3JhcGhpYyBIYXNoIEZ1bmN0aW9ucyAoUEVQIDI0NykuCisgICAgIiIiCisgICAgYmxvY2tzaXplID0gNjQgICMgNTEyLWJpdCBITUFDOyBjYW4gYmUgY2hhbmdlZCBpbiBzdWJjbGFzc2VzLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgbXNnID0gTm9uZSwgZGlnZXN0bW9kID0gTm9uZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBITUFDIG9iamVjdC4KKworICAgICAgICBrZXk6ICAgICAgIGtleSBmb3IgdGhlIGtleWVkIGhhc2ggb2JqZWN0LgorICAgICAgICBtc2c6ICAgICAgIEluaXRpYWwgaW5wdXQgZm9yIHRoZSBoYXNoLCBpZiBwcm92aWRlZC4KKyAgICAgICAgZGlnZXN0bW9kOiBBIG1vZHVsZSBzdXBwb3J0aW5nIFBFUCAyNDcuICAqT1IqCisgICAgICAgICAgICAgICAgICAgQSBoYXNobGliIGNvbnN0cnVjdG9yIHJldHVybmluZyBhIG5ldyBoYXNoIG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byBoYXNobGliLm1kNS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYga2V5IGlzIF9zZWNyZXRfYmFja2Rvb3Jfa2V5OiAjIGNoZWFwCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBkaWdlc3Rtb2QgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCBoYXNobGliCisgICAgICAgICAgICBkaWdlc3Rtb2QgPSBoYXNobGliLm1kNQorCisgICAgICAgIGlmIGhhc2F0dHIoZGlnZXN0bW9kLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHNlbGYuZGlnZXN0X2NvbnMgPSBkaWdlc3Rtb2QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZGlnZXN0X2NvbnMgPSBsYW1iZGEgZD0nJzogZGlnZXN0bW9kLm5ldyhkKQorCisgICAgICAgIHNlbGYub3V0ZXIgPSBzZWxmLmRpZ2VzdF9jb25zKCkKKyAgICAgICAgc2VsZi5pbm5lciA9IHNlbGYuZGlnZXN0X2NvbnMoKQorICAgICAgICBzZWxmLmRpZ2VzdF9zaXplID0gc2VsZi5pbm5lci5kaWdlc3Rfc2l6ZQorCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5pbm5lciwgJ2Jsb2NrX3NpemUnKToKKyAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IHNlbGYuaW5uZXIuYmxvY2tfc2l6ZQorICAgICAgICAgICAgaWYgYmxvY2tzaXplIDwgMTY6CisgICAgICAgICAgICAgICAgIyBWZXJ5IGxvdyBibG9ja3NpemUsIG1vc3QgbGlrZWx5IGEgbGVnYWN5IHZhbHVlIGxpa2UKKyAgICAgICAgICAgICAgICAjIExpYi9zaGEucHkgYW5kIExpYi9tZDUucHkgaGF2ZS4KKyAgICAgICAgICAgICAgICBfd2FybmluZ3Mud2FybignYmxvY2tfc2l6ZSBvZiAlZCBzZWVtcyB0b28gc21hbGw7IHVzaW5nIG91ciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmF1bHQgb2YgJWQuJyAlIChibG9ja3NpemUsIHNlbGYuYmxvY2tzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZywgMikKKyAgICAgICAgICAgICAgICBibG9ja3NpemUgPSBzZWxmLmJsb2Nrc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgX3dhcm5pbmdzLndhcm4oJ05vIGJsb2NrX3NpemUgYXR0cmlidXRlIG9uIGdpdmVuIGRpZ2VzdCBvYmplY3Q7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdBc3N1bWluZyAlZC4nICUgKHNlbGYuYmxvY2tzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLCAyKQorICAgICAgICAgICAgYmxvY2tzaXplID0gc2VsZi5ibG9ja3NpemUKKworICAgICAgICBpZiBsZW4oa2V5KSA+IGJsb2Nrc2l6ZToKKyAgICAgICAgICAgIGtleSA9IHNlbGYuZGlnZXN0X2NvbnMoa2V5KS5kaWdlc3QoKQorCisgICAgICAgIGtleSA9IGtleSArIGNocigwKSAqIChibG9ja3NpemUgLSBsZW4oa2V5KSkKKyAgICAgICAgc2VsZi5vdXRlci51cGRhdGUoa2V5LnRyYW5zbGF0ZSh0cmFuc181QykpCisgICAgICAgIHNlbGYuaW5uZXIudXBkYXRlKGtleS50cmFuc2xhdGUodHJhbnNfMzYpKQorICAgICAgICBpZiBtc2cgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShtc2cpCisKKyMjICAgIGRlZiBjbGVhcihzZWxmKToKKyMjICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAiY2xlYXIoKSBtZXRob2Qgbm90IGF2YWlsYWJsZSBpbiBITUFDLiIKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgbXNnKToKKyAgICAgICAgIiIiVXBkYXRlIHRoaXMgaGFzaGluZyBvYmplY3Qgd2l0aCB0aGUgc3RyaW5nIG1zZy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaW5uZXIudXBkYXRlKG1zZykKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBzZXBhcmF0ZSBjb3B5IG9mIHRoaXMgaGFzaGluZyBvYmplY3QuCisKKyAgICAgICAgQW4gdXBkYXRlIHRvIHRoaXMgY29weSB3b24ndCBhZmZlY3QgdGhlIG9yaWdpbmFsIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIG90aGVyID0gc2VsZi5fX2NsYXNzX18oX3NlY3JldF9iYWNrZG9vcl9rZXkpCisgICAgICAgIG90aGVyLmRpZ2VzdF9jb25zID0gc2VsZi5kaWdlc3RfY29ucworICAgICAgICBvdGhlci5kaWdlc3Rfc2l6ZSA9IHNlbGYuZGlnZXN0X3NpemUKKyAgICAgICAgb3RoZXIuaW5uZXIgPSBzZWxmLmlubmVyLmNvcHkoKQorICAgICAgICBvdGhlci5vdXRlciA9IHNlbGYub3V0ZXIuY29weSgpCisgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgZGVmIF9jdXJyZW50KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBoYXNoIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuCisKKyAgICAgICAgVG8gYmUgdXNlZCBvbmx5IGludGVybmFsbHkgd2l0aCBkaWdlc3QoKSBhbmQgaGV4ZGlnZXN0KCkuCisgICAgICAgICIiIgorICAgICAgICBoID0gc2VsZi5vdXRlci5jb3B5KCkKKyAgICAgICAgaC51cGRhdGUoc2VsZi5pbm5lci5kaWdlc3QoKSkKKyAgICAgICAgcmV0dXJuIGgKKworICAgIGRlZiBkaWdlc3Qoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgaGFzaCB2YWx1ZSBvZiB0aGlzIGhhc2hpbmcgb2JqZWN0LgorCisgICAgICAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIDgtYml0IGRhdGEuICBUaGUgb2JqZWN0IGlzCisgICAgICAgIG5vdCBhbHRlcmVkIGluIGFueSB3YXkgYnkgdGhpcyBmdW5jdGlvbjsgeW91IGNhbiBjb250aW51ZQorICAgICAgICB1cGRhdGluZyB0aGUgb2JqZWN0IGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGggPSBzZWxmLl9jdXJyZW50KCkKKyAgICAgICAgcmV0dXJuIGguZGlnZXN0KCkKKworICAgIGRlZiBoZXhkaWdlc3Qoc2VsZik6CisgICAgICAgICIiIkxpa2UgZGlnZXN0KCksIGJ1dCByZXR1cm5zIGEgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cyBpbnN0ZWFkLgorICAgICAgICAiIiIKKyAgICAgICAgaCA9IHNlbGYuX2N1cnJlbnQoKQorICAgICAgICByZXR1cm4gaC5oZXhkaWdlc3QoKQorCitkZWYgbmV3KGtleSwgbXNnID0gTm9uZSwgZGlnZXN0bW9kID0gTm9uZSk6CisgICAgIiIiQ3JlYXRlIGEgbmV3IGhhc2hpbmcgb2JqZWN0IGFuZCByZXR1cm4gaXQuCisKKyAgICBrZXk6IFRoZSBzdGFydGluZyBrZXkgZm9yIHRoZSBoYXNoLgorICAgIG1zZzogaWYgYXZhaWxhYmxlLCB3aWxsIGltbWVkaWF0ZWx5IGJlIGhhc2hlZCBpbnRvIHRoZSBvYmplY3QncyBzdGFydGluZworICAgIHN0YXRlLgorCisgICAgWW91IGNhbiBub3cgZmVlZCBhcmJpdHJhcnkgc3RyaW5ncyBpbnRvIHRoZSBvYmplY3QgdXNpbmcgaXRzIHVwZGF0ZSgpCisgICAgbWV0aG9kLCBhbmQgY2FuIGFzayBmb3IgdGhlIGhhc2ggdmFsdWUgYXQgYW55IHRpbWUgYnkgY2FsbGluZyBpdHMgZGlnZXN0KCkKKyAgICBtZXRob2QuCisgICAgIiIiCisgICAgcmV0dXJuIEhNQUMoa2V5LCBtc2csIGRpZ2VzdG1vZCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG1hYy5weWMgYi9saWIvcHl0aG9uMi43L2htYWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5M2ZmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2htYWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG1hYy5weW8gYi9saWIvcHl0aG9uMi43L2htYWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5M2ZmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2htYWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvaG90c2hvdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTU2YWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNzggQEAKKyIiIkhpZ2gtcGVyZm9tYW5jZSBsb2dnaW5nIHByb2ZpbGVyLCBtb3N0bHkgd3JpdHRlbiBpbiBDLiIiIgorCitpbXBvcnQgX2hvdHNob3QKK2Zyb20gX2hvdHNob3QgaW1wb3J0IFByb2ZpbGVyRXJyb3IKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sgYXMgX3dhcm5weTNrCitfd2FybnB5M2soIlRoZSAnaG90c2hvdCcgbW9kdWxlIGlzIG5vdCBzdXBwb3J0ZWQgaW4gMy54LCAiCisgICAgICAgICAgInVzZSB0aGUgJ3Byb2ZpbGUnIG1vZHVsZSBpbnN0ZWFkLiIsIHN0YWNrbGV2ZWw9MikKKworY2xhc3MgUHJvZmlsZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nZm4sIGxpbmVldmVudHM9MCwgbGluZXRpbWluZ3M9MSk6CisgICAgICAgIHNlbGYubGluZWV2ZW50cyA9IGxpbmVldmVudHMgYW5kIDEgb3IgMAorICAgICAgICBzZWxmLmxpbmV0aW1pbmdzID0gKGxpbmV0aW1pbmdzIGFuZCBsaW5lZXZlbnRzKSBhbmQgMSBvciAwCisgICAgICAgIHNlbGYuX3Byb2YgPSBwID0gX2hvdHNob3QucHJvZmlsZXIoCisgICAgICAgICAgICBsb2dmbiwgc2VsZi5saW5lZXZlbnRzLCBzZWxmLmxpbmV0aW1pbmdzKQorCisgICAgICAgICMgQXR0ZW1wdCB0byBhdm9pZCBjb25mdXNpbmcgcmVzdWx0cyBjYXVzZWQgYnkgdGhlIHByZXNlbmNlIG9mCisgICAgICAgICMgUHl0aG9uIHdyYXBwZXJzIGFyb3VuZCB0aGVzZSBmdW5jdGlvbnMsIGJ1dCBvbmx5IGlmIHdlIGNhbgorICAgICAgICAjIGJlIHN1cmUgdGhlIG1ldGhvZHMgaGF2ZSBub3QgYmVlbiBvdmVycmlkZGVuIG9yIGV4dGVuZGVkLgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBQcm9maWxlOgorICAgICAgICAgICAgc2VsZi5jbG9zZSA9IHAuY2xvc2UKKyAgICAgICAgICAgIHNlbGYuc3RhcnQgPSBwLnN0YXJ0CisgICAgICAgICAgICBzZWxmLnN0b3AgPSBwLnN0b3AKKyAgICAgICAgICAgIHNlbGYuYWRkaW5mbyA9IHAuYWRkaW5mbworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgbG9nZmlsZSBhbmQgdGVybWluYXRlIHRoZSBwcm9maWxlci4iIiIKKyAgICAgICAgc2VsZi5fcHJvZi5jbG9zZSgpCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgcHJvZmlsZXIncyBsb2cgZmlsZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2YuZmlsZW5vKCkKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgIiIiU3RhcnQgdGhlIHByb2ZpbGVyLiIiIgorICAgICAgICBzZWxmLl9wcm9mLnN0YXJ0KCkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAiIiJTdG9wIHRoZSBwcm9maWxlci4iIiIKKyAgICAgICAgc2VsZi5fcHJvZi5zdG9wKCkKKworICAgIGRlZiBhZGRpbmZvKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAiIiJBZGQgYW4gYXJiaXRyYXJ5IGxhYmVsbGVkIHZhbHVlIHRvIHRoZSBwcm9maWxlIGxvZy4iIiIKKyAgICAgICAgc2VsZi5fcHJvZi5hZGRpbmZvKGtleSwgdmFsdWUpCisKKyAgICAjIFRoZXNlIG1ldGhvZHMgb2ZmZXIgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSBwcm9maWxlLlByb2ZpbGUgY2xhc3MsCisgICAgIyBidXQgZGVsZWdhdGUgbW9zdCBvZiB0aGUgd29yayB0byB0aGUgQyBpbXBsZW1lbnRhdGlvbiB1bmRlcm5lYXRoLgorCisgICAgZGVmIHJ1bihzZWxmLCBjbWQpOgorICAgICAgICAiIiJQcm9maWxlIGFuIGV4ZWMtY29tcGF0aWJsZSBzdHJpbmcgaW4gdGhlIHNjcmlwdAorICAgICAgICBlbnZpcm9ubWVudC4KKworICAgICAgICBUaGUgZ2xvYmFscyBmcm9tIHRoZSBfX21haW5fXyBtb2R1bGUgYXJlIHVzZWQgYXMgYm90aCB0aGUKKyAgICAgICAgZ2xvYmFscyBhbmQgbG9jYWxzIGZvciB0aGUgc2NyaXB0LgorICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIGRpY3QgPSBfX21haW5fXy5fX2RpY3RfXworICAgICAgICByZXR1cm4gc2VsZi5ydW5jdHgoY21kLCBkaWN0LCBkaWN0KQorCisgICAgZGVmIHJ1bmN0eChzZWxmLCBjbWQsIGdsb2JhbHMsIGxvY2Fscyk6CisgICAgICAgICIiIkV2YWx1YXRlIGFuIGV4ZWMtY29tcGF0aWJsZSBzdHJpbmcgaW4gYSBzcGVjaWZpYworICAgICAgICBlbnZpcm9ubWVudC4KKworICAgICAgICBUaGUgc3RyaW5nIGlzIGNvbXBpbGVkIGJlZm9yZSBwcm9maWxpbmcgYmVnaW5zLgorICAgICAgICAiIiIKKyAgICAgICAgY29kZSA9IGNvbXBpbGUoY21kLCAiPHN0cmluZz4iLCAiZXhlYyIpCisgICAgICAgIHNlbGYuX3Byb2YucnVuY29kZShjb2RlLCBnbG9iYWxzLCBsb2NhbHMpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgcnVuY2FsbChzZWxmLCBmdW5jLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIlByb2ZpbGUgYSBzaW5nbGUgY2FsbCBvZiBhIGNhbGxhYmxlLgorCisgICAgICAgIEFkZGl0aW9uYWwgcG9zaXRpb25hbCBhbmQga2V5d29yZCBhcmd1bWVudHMgbWF5IGJlIHBhc3NlZAorICAgICAgICBhbG9uZzsgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbCBpcyByZXR1cm5lZCwgYW5kIGV4Y2VwdGlvbnMgYXJlCisgICAgICAgIGFsbG93ZWQgdG8gcHJvcG9nYXRlIGNsZWFubHksIHdoaWxlIGVuc3VyaW5nIHRoYXQgcHJvZmlsaW5nIGlzCisgICAgICAgIGRpc2FibGVkIG9uIHRoZSB3YXkgb3V0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2YucnVuY2FsbChmdW5jLCBhcmdzLCBrdykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjJkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjJkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hvdHNob3QvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9sb2cucHkgYi9saWIvcHl0aG9uMi43L2hvdHNob3QvbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZThiNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hvdHNob3QvbG9nLnB5CkBAIC0wLDAgKzEsMTk0IEBACitpbXBvcnQgX2hvdHNob3QKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgcGFyc2VyCitpbXBvcnQgc3ltYm9sCisKK2Zyb20gX2hvdHNob3QgaW1wb3J0IFwKKyAgICAgV0hBVF9FTlRFUiwgXAorICAgICBXSEFUX0VYSVQsIFwKKyAgICAgV0hBVF9MSU5FTk8sIFwKKyAgICAgV0hBVF9ERUZJTkVfRklMRSwgXAorICAgICBXSEFUX0RFRklORV9GVU5DLCBcCisgICAgIFdIQVRfQUREX0lORk8KKworCitfX2FsbF9fID0gWyJMb2dSZWFkZXIiLCAiRU5URVIiLCAiRVhJVCIsICJMSU5FIl0KKworCitFTlRFUiA9IFdIQVRfRU5URVIKK0VYSVQgID0gV0hBVF9FWElUCitMSU5FICA9IFdIQVRfTElORU5PCisKKworY2xhc3MgTG9nUmVhZGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dmbik6CisgICAgICAgICMgZmlsZW5vIC0+IGZpbGVuYW1lCisgICAgICAgIHNlbGYuX2ZpbGVtYXAgPSB7fQorICAgICAgICAjIChmaWxlbm8sIGxpbmVubykgLT4gZmlsZW5hbWUsIGZ1bmNuYW1lCisgICAgICAgIHNlbGYuX2Z1bmNtYXAgPSB7fQorCisgICAgICAgIHNlbGYuX3JlYWRlciA9IF9ob3RzaG90LmxvZ3JlYWRlcihsb2dmbikKKyAgICAgICAgc2VsZi5fbmV4dGl0ZW0gPSBzZWxmLl9yZWFkZXIubmV4dAorICAgICAgICBzZWxmLl9pbmZvID0gc2VsZi5fcmVhZGVyLmluZm8KKyAgICAgICAgaWYgJ2N1cnJlbnQtZGlyZWN0b3J5JyBpbiBzZWxmLl9pbmZvOgorICAgICAgICAgICAgc2VsZi5jd2QgPSBzZWxmLl9pbmZvWydjdXJyZW50LWRpcmVjdG9yeSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmN3ZCA9IE5vbmUKKworICAgICAgICAjIFRoaXMgbWlycm9ycyB0aGUgY2FsbCBzdGFjayBvZiB0aGUgcHJvZmlsZWQgY29kZSBhcyB0aGUgbG9nCisgICAgICAgICMgaXMgcmVhZCBiYWNrIGluLiAgSXQgY29udGFpbnMgdHVwbGVzIG9mIHRoZSBmb3JtOgorICAgICAgICAjCisgICAgICAgICMgICAoZmlsZSBuYW1lLCBsaW5lIG51bWJlciBvZiBmdW5jdGlvbiBkZWYsIGZ1bmN0aW9uIG5hbWUpCisgICAgICAgICMKKyAgICAgICAgc2VsZi5fc3RhY2sgPSBbXQorICAgICAgICBzZWxmLl9hcHBlbmQgPSBzZWxmLl9zdGFjay5hcHBlbmQKKyAgICAgICAgc2VsZi5fcG9wID0gc2VsZi5fc3RhY2sucG9wCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3JlYWRlci5jbG9zZSgpCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGUgZGVzY3JpcHRvciBvZiB0aGUgbG9nIHJlYWRlcidzIGxvZyBmaWxlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZGVyLmZpbGVubygpCisKKyAgICBkZWYgYWRkaW5mbyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZvciBlYWNoIGFkZGl0aW9uYWwgQUREX0lORk8gcmVjb3JkLgorCisgICAgICAgIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byByZWNlaXZlCisgICAgICAgIHRoZXNlIGV2ZW50cy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUKKyAgICAgICAgY2FsbGVkIGJ5IGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMuCisKKyAgICAgICAgVGhlIGluaXRpYWwgc2V0IG9mIEFERF9JTkZPIHJlY29yZHMgZG8gbm90IHBhc3MgdGhyb3VnaCB0aGlzCisgICAgICAgIG1lY2hhbmlzbTsgdGhpcyBpcyBvbmx5IG5lZWRlZCB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuCisgICAgICAgIG5ldyB2YWx1ZXMgYXJlIGFkZGVkLiAgU3ViY2xhc3NlcyBjYW4gaW5zcGVjdCBzZWxmLl9pbmZvIGFmdGVyCisgICAgICAgIGNhbGxpbmcgTG9nUmVhZGVyLl9faW5pdF9fKCkuCisgICAgICAgICIiIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0X2ZpbGVuYW1lKHNlbGYsIGZpbGVubyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9maWxlbWFwW2ZpbGVub10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gZmlsZW5vIgorCisgICAgZGVmIGdldF9maWxlbmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbWFwLnZhbHVlcygpCisKKyAgICBkZWYgZ2V0X2ZpbGVubyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLm5vcm1wYXRoKGZpbGVuYW1lKSkKKyAgICAgICAgZm9yIGZpbGVubywgbmFtZSBpbiBzZWxmLl9maWxlbWFwLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lID09IGZpbGVuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBmaWxlbm8KKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gZmlsZW5hbWUiCisKKyAgICBkZWYgZ2V0X2Z1bmNuYW1lKHNlbGYsIGZpbGVubywgbGluZW5vKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gZnVuY3Rpb24gbG9jYXRpb24iCisKKyAgICAjIEl0ZXJhdGlvbiBzdXBwb3J0OgorICAgICMgVGhpcyBhZGRzIGFuIG9wdGlvbmFsICgmIGlnbm9yZWQpIHBhcmFtZXRlciB0byBuZXh0KCkgc28gdGhhdCB0aGUKKyAgICAjIHNhbWUgYm91bmQgbWV0aG9kIGNhbiBiZSB1c2VkIGFzIHRoZSBfX2dldGl0ZW1fXygpIG1ldGhvZCAtLSB0aGlzCisgICAgIyBhdm9pZHMgdXNpbmcgYW4gYWRkaXRpb25hbCBtZXRob2QgY2FsbCB3aGljaCBraWxscyB0aGUgcGVyZm9ybWFuY2UuCisKKyAgICBkZWYgbmV4dChzZWxmLCBpbmRleD0wKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgVGhpcyBjYWxsIG1heSByYWlzZSBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgd2hhdCwgdGRlbHRhLCBmaWxlbm8sIGxpbmVubyA9IHNlbGYuX25leHRpdGVtKCkKKworICAgICAgICAgICAgIyBoYW5kbGUgdGhlIG1vc3QgY29tbW9uIGNhc2VzIGZpcnN0CisKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gV0hBVF9FTlRFUjoKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZnVuY25hbWUgPSBzZWxmLl9kZWNvZGVfbG9jYXRpb24oZmlsZW5vLCBsaW5lbm8pCisgICAgICAgICAgICAgICAgdCA9IChmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9hcHBlbmQodCkKKyAgICAgICAgICAgICAgICByZXR1cm4gd2hhdCwgdCwgdGRlbHRhCisKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gV0hBVF9FWElUOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdoYXQsIHNlbGYuX3BvcCgpLCB0ZGVsdGEKKyAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgICAgICAgICBpZiB3aGF0ID09IFdIQVRfTElORU5POgorICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmaXJzdGxpbmVubywgZnVuY25hbWUgPSBzZWxmLl9zdGFja1stMV0KKyAgICAgICAgICAgICAgICByZXR1cm4gd2hhdCwgKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lKSwgdGRlbHRhCisKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gV0hBVF9ERUZJTkVfRklMRToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5ub3JtcGF0aCh0ZGVsdGEpKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVtYXBbZmlsZW5vXSA9IGZpbGVuYW1lCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gV0hBVF9ERUZJTkVfRlVOQzoKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuX2ZpbGVtYXBbZmlsZW5vXQorICAgICAgICAgICAgICAgIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0gPSAoZmlsZW5hbWUsIHRkZWx0YSkKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSBXSEFUX0FERF9JTkZPOgorICAgICAgICAgICAgICAgICMgdmFsdWUgYWxyZWFkeSBsb2FkZWQgaW50byBzZWxmLmluZm87IGNhbGwgdGhlCisgICAgICAgICAgICAgICAgIyBvdmVycmlkYWJsZSBhZGRpbmZvKCkgaGFuZGxlciBzbyBoaWdoZXItbGV2ZWwgY29kZQorICAgICAgICAgICAgICAgICMgY2FuIHBpY2sgdXAgdGhlIG5ldyB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIHRkZWx0YSA9PSAnY3VycmVudC1kaXJlY3RvcnknOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmN3ZCA9IGxpbmVubworICAgICAgICAgICAgICAgIHNlbGYuYWRkaW5mbyh0ZGVsdGEsIGxpbmVubykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gZXZlbnQgdHlwZSIKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICMKKyAgICAjICBoZWxwZXJzCisgICAgIworCisgICAgZGVmIF9kZWNvZGVfbG9jYXRpb24oc2VsZiwgZmlsZW5vLCBsaW5lbm8pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZnVuY21hcFsoZmlsZW5vLCBsaW5lbm8pXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIG9ubHkgYmUgbmVlZGVkIHdoZW4gdGhlIGxvZyBmaWxlIGRvZXMgbm90CisgICAgICAgICAgICAjIGNvbnRhaW4gYWxsIHRoZSBERUZJTkVfRlVOQyByZWNvcmRzIG5lZWRlZCB0byBhbGxvdyB0aGUKKyAgICAgICAgICAgICMgZnVuY3Rpb24gbmFtZSB0byBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgbG9nIGZpbGUuCisgICAgICAgICAgICAjCisgICAgICAgICAgICBpZiBzZWxmLl9sb2FkZmlsZShmaWxlbm8pOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZnVuY25hbWUgPSBOb25lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGZ1bmNuYW1lID0gc2VsZi5fZnVuY21hcFsoZmlsZW5vLCBsaW5lbm8pXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5fZmlsZW1hcC5nZXQoZmlsZW5vKQorICAgICAgICAgICAgICAgIGZ1bmNuYW1lID0gTm9uZQorICAgICAgICAgICAgICAgIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgbGluZW5vKV0gPSAoZmlsZW5hbWUsIGZ1bmNuYW1lKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUsIGZ1bmNuYW1lCisKKyAgICBkZWYgX2xvYWRmaWxlKHNlbGYsIGZpbGVubyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5fZmlsZW1hcFtmaWxlbm9dCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByaW50ICJDb3VsZCBub3QgaWRlbnRpZnkgZmlsZUlkIiwgZmlsZW5vCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgYWJzbmFtZSA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5qb2luKHNlbGYuY3dkLCBmaWxlbmFtZSkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnAgPSBvcGVuKGFic25hbWUpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHN0ID0gcGFyc2VyLnN1aXRlKGZwLnJlYWQoKSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICMgU2NhbiB0aGUgdHJlZSBsb29raW5nIGZvciBkZWYgYW5kIGxhbWJkYSBub2RlcywgZmlsbGluZyBpbgorICAgICAgICAjIHNlbGYuX2Z1bmNtYXAgd2l0aCBhbGwgdGhlIGF2YWlsYWJsZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgZnVuY2RlZiA9IHN5bWJvbC5mdW5jZGVmCisgICAgICAgIGxhbWJkZWYgPSBzeW1ib2wubGFtYmRlZgorCisgICAgICAgIHN0YWNrID0gW3N0LnRvdHVwbGUoMSldCisKKyAgICAgICAgd2hpbGUgc3RhY2s6CisgICAgICAgICAgICB0cmVlID0gc3RhY2sucG9wKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeW0gPSB0cmVlWzBdCisgICAgICAgICAgICBleGNlcHQgKEluZGV4RXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHN5bSA9PSBmdW5jZGVmOgorICAgICAgICAgICAgICAgIHNlbGYuX2Z1bmNtYXBbKGZpbGVubywgdHJlZVsyXVsyXSldID0gZmlsZW5hbWUsIHRyZWVbMl1bMV0KKyAgICAgICAgICAgIGVsaWYgc3ltID09IGxhbWJkZWY6CisgICAgICAgICAgICAgICAgc2VsZi5fZnVuY21hcFsoZmlsZW5vLCB0cmVlWzFdWzJdKV0gPSBmaWxlbmFtZSwgIjxsYW1iZGE+IgorICAgICAgICAgICAgc3RhY2suZXh0ZW5kKGxpc3QodHJlZVsxOl0pKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weWMgYi9saWIvcHl0aG9uMi43L2hvdHNob3QvbG9nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmNkNjdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weW8gYi9saWIvcHl0aG9uMi43L2hvdHNob3QvbG9nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmNkNjdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L2xvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5IGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RhdHMucHkKQEAgLTAsMCArMSw5MyBAQAorIiIiU3RhdGlzdGljcyBhbmFseXplciBmb3IgSG90U2hvdC4iIiIKKworaW1wb3J0IHByb2ZpbGUKK2ltcG9ydCBwc3RhdHMKKworaW1wb3J0IGhvdHNob3QubG9nCisKK2Zyb20gaG90c2hvdC5sb2cgaW1wb3J0IEVOVEVSLCBFWElUCisKKworZGVmIGxvYWQoZmlsZW5hbWUpOgorICAgIHJldHVybiBTdGF0c0xvYWRlcihmaWxlbmFtZSkubG9hZCgpCisKKworY2xhc3MgU3RhdHNMb2FkZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvZ2ZuKToKKyAgICAgICAgc2VsZi5fbG9nZm4gPSBsb2dmbgorICAgICAgICBzZWxmLl9jb2RlID0ge30KKyAgICAgICAgc2VsZi5fc3RhY2sgPSBbXQorICAgICAgICBzZWxmLnBvcF9mcmFtZSA9IHNlbGYuX3N0YWNrLnBvcAorCisgICAgZGVmIGxvYWQoc2VsZik6CisgICAgICAgICMgVGhlIHRpbWVyIHNlbGVjdGVkIGJ5IHRoZSBwcm9maWxlciBzaG91bGQgbmV2ZXIgYmUgdXNlZCwgc28gbWFrZQorICAgICAgICAjIHN1cmUgaXQgZG9lc24ndCB3b3JrOgorICAgICAgICBwID0gUHJvZmlsZSgpCisgICAgICAgIHAuZ2V0X3RpbWUgPSBfYnJva2VudGltZXIKKyAgICAgICAgbG9nID0gaG90c2hvdC5sb2cuTG9nUmVhZGVyKHNlbGYuX2xvZ2ZuKQorICAgICAgICB0YWNjdW0gPSAwCisgICAgICAgIGZvciBldmVudCBpbiBsb2c6CisgICAgICAgICAgICB3aGF0LCAoZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUpLCB0ZGVsdGEgPSBldmVudAorICAgICAgICAgICAgaWYgdGRlbHRhID4gMDoKKyAgICAgICAgICAgICAgICB0YWNjdW0gKz0gdGRlbHRhCisKKyAgICAgICAgICAgICMgV2UgbXVsdGlwbHkgdGFjY3VtIHRvIGNvbnZlcnQgZnJvbSB0aGUgbWljcm9zZWNvbmRzIHdlCisgICAgICAgICAgICAjIGhhdmUgdG8gdGhlIHNlY29uZHMgdGhhdCB0aGUgcHJvZmlsZS9wc3RhdHMgbW9kdWxlIHdvcmsKKyAgICAgICAgICAgICMgd2l0aDsgdGhpcyBhbGxvd3MgdGhlIG51bWJlcnMgdG8gaGF2ZSBzb21lIGJhc2lzIGluCisgICAgICAgICAgICAjIHJlYWxpdHkgKGlnbm9yaW5nIGNhbGlicmF0aW9uIGlzc3VlcyBmb3Igbm93KS4KKworICAgICAgICAgICAgaWYgd2hhdCA9PSBFTlRFUjoKKyAgICAgICAgICAgICAgICBmcmFtZSA9IHNlbGYubmV3X2ZyYW1lKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmNuYW1lKQorICAgICAgICAgICAgICAgIHAudHJhY2VfZGlzcGF0Y2hfY2FsbChmcmFtZSwgdGFjY3VtICogLjAwMDAwMSkKKyAgICAgICAgICAgICAgICB0YWNjdW0gPSAwCisKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSBFWElUOgorICAgICAgICAgICAgICAgIGZyYW1lID0gc2VsZi5wb3BfZnJhbWUoKQorICAgICAgICAgICAgICAgIHAudHJhY2VfZGlzcGF0Y2hfcmV0dXJuKGZyYW1lLCB0YWNjdW0gKiAuMDAwMDAxKQorICAgICAgICAgICAgICAgIHRhY2N1bSA9IDAKKworICAgICAgICAgICAgIyBubyBmdXJ0aGVyIHdvcmsgZm9yIGxpbmUgZXZlbnRzCisKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9zdGFjaworICAgICAgICByZXR1cm4gcHN0YXRzLlN0YXRzKHApCisKKyAgICBkZWYgbmV3X2ZyYW1lKHNlbGYsICphcmdzKToKKyAgICAgICAgIyBhcmdzIG11c3QgYmUgZmlsZW5hbWUsIGZpcnN0bGluZW5vLCBmdW5jbmFtZQorICAgICAgICAjIG91ciBjb2RlIG9iamVjdHMgYXJlIGNhY2hlZCBzaW5jZSB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZQorICAgICAgICAjIG5ldyBvbmVzIGV2ZXJ5IHRpbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29kZSA9IHNlbGYuX2NvZGVbYXJnc10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgY29kZSA9IEZha2VDb2RlKCphcmdzKQorICAgICAgICAgICAgc2VsZi5fY29kZVthcmdzXSA9IGNvZGUKKyAgICAgICAgIyBmcmFtZSBvYmplY3RzIGFyZSBjcmVhdGUgZnJlc2gsIHNpbmNlIHRoZSBiYWNrIHBvaW50ZXIgd2lsbAorICAgICAgICAjIHZhcnkgY29uc2lkZXJhYmx5CisgICAgICAgIGlmIHNlbGYuX3N0YWNrOgorICAgICAgICAgICAgYmFjayA9IHNlbGYuX3N0YWNrWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFjayA9IE5vbmUKKyAgICAgICAgZnJhbWUgPSBGYWtlRnJhbWUoY29kZSwgYmFjaykKKyAgICAgICAgc2VsZi5fc3RhY2suYXBwZW5kKGZyYW1lKQorICAgICAgICByZXR1cm4gZnJhbWUKKworCitjbGFzcyBQcm9maWxlKHByb2ZpbGUuUHJvZmlsZSk6CisgICAgZGVmIHNpbXVsYXRlX2NtZF9jb21wbGV0ZShzZWxmKToKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEZha2VDb2RlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgZmlyc3RsaW5lbm8sIGZ1bmNuYW1lKToKKyAgICAgICAgc2VsZi5jb19maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuY29fZmlyc3RsaW5lbm8gPSBmaXJzdGxpbmVubworICAgICAgICBzZWxmLmNvX25hbWUgPSBzZWxmLl9fbmFtZV9fID0gZnVuY25hbWUKKworCitjbGFzcyBGYWtlRnJhbWU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUsIGJhY2spOgorICAgICAgICBzZWxmLmZfYmFjayA9IGJhY2sKKyAgICAgICAgc2VsZi5mX2NvZGUgPSBjb2RlCisKKworZGVmIF9icm9rZW50aW1lcigpOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgInRoaXMgdGltZXIgc2hvdWxkIG5vdCBiZSBjYWxsZWQiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RhdHMucHljIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzczNzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RhdHMucHlvIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjBhZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0YXRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2hvdHNob3Qvc3RvbmVzLnB5IGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0b25lcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjg4ZDU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0b25lcy5weQpAQCAtMCwwICsxLDMwIEBACitpbXBvcnQgZXJybm8KK2ltcG9ydCBob3RzaG90CitpbXBvcnQgaG90c2hvdC5zdGF0cworaW1wb3J0IHN5cworaW1wb3J0IHRlc3QucHlzdG9uZQorCitkZWYgbWFpbihsb2dmaWxlKToKKyAgICBwID0gaG90c2hvdC5Qcm9maWxlKGxvZ2ZpbGUpCisgICAgYmVuY2h0aW1lLCBzdG9uZXMgPSBwLnJ1bmNhbGwodGVzdC5weXN0b25lLnB5c3RvbmVzKQorICAgIHAuY2xvc2UoKQorCisgICAgcHJpbnQgIlB5c3RvbmUoJXMpIHRpbWUgZm9yICVkIHBhc3NlcyA9ICVnIiAlIFwKKyAgICAgICAgICAodGVzdC5weXN0b25lLl9fdmVyc2lvbl9fLCB0ZXN0LnB5c3RvbmUuTE9PUFMsIGJlbmNodGltZSkKKyAgICBwcmludCAiVGhpcyBtYWNoaW5lIGJlbmNobWFya3MgYXQgJWcgcHlzdG9uZXMvc2Vjb25kIiAlIHN0b25lcworCisgICAgc3RhdHMgPSBob3RzaG90LnN0YXRzLmxvYWQobG9nZmlsZSkKKyAgICBzdGF0cy5zdHJpcF9kaXJzKCkKKyAgICBzdGF0cy5zb3J0X3N0YXRzKCd0aW1lJywgJ2NhbGxzJykKKyAgICB0cnk6CisgICAgICAgIHN0YXRzLnByaW50X3N0YXRzKDIwKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVQSVBFOgorICAgICAgICAgICAgcmFpc2UKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIG1haW4oc3lzLmFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgIG1haW4odGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkubmFtZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHljIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0b25lcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjZTY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHlvIGIvbGliL3B5dGhvbjIuNy9ob3RzaG90L3N0b25lcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJjZTY4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaG90c2hvdC9zdG9uZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaHRtbGVudGl0eWRlZnMucHkgYi9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDE0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5CkBAIC0wLDAgKzEsMjczIEBACisiIiJIVE1MIGNoYXJhY3RlciBlbnRpdHkgcmVmZXJlbmNlcy4iIiIKKworIyBtYXBzIHRoZSBIVE1MIGVudGl0eSBuYW1lIHRvIHRoZSBVbmljb2RlIGNvZGVwb2ludAorbmFtZTJjb2RlcG9pbnQgPSB7CisgICAgJ0FFbGlnJzogICAgMHgwMGM2LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEFFID0gbGF0aW4gY2FwaXRhbCBsaWdhdHVyZSBBRSwgVSswMEM2IElTT2xhdDEKKyAgICAnQWFjdXRlJzogICAweDAwYzEsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGFjdXRlLCBVKzAwQzEgSVNPbGF0MQorICAgICdBY2lyYyc6ICAgIDB4MDBjMiwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggY2lyY3VtZmxleCwgVSswMEMyIElTT2xhdDEKKyAgICAnQWdyYXZlJzogICAweDAwYzAsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIGdyYXZlID0gbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSBncmF2ZSwgVSswMEMwIElTT2xhdDEKKyAgICAnQWxwaGEnOiAgICAweDAzOTEsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgYWxwaGEsIFUrMDM5MQorICAgICdBcmluZyc6ICAgIDB4MDBjNSwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggcmluZyBhYm92ZSA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIEEgcmluZywgVSswMEM1IElTT2xhdDEKKyAgICAnQXRpbGRlJzogICAweDAwYzMsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQSB3aXRoIHRpbGRlLCBVKzAwQzMgSVNPbGF0MQorICAgICdBdW1sJzogICAgIDB4MDBjNCwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBBIHdpdGggZGlhZXJlc2lzLCBVKzAwQzQgSVNPbGF0MQorICAgICdCZXRhJzogICAgIDB4MDM5MiwgIyBncmVlayBjYXBpdGFsIGxldHRlciBiZXRhLCBVKzAzOTIKKyAgICAnQ2NlZGlsJzogICAweDAwYzcsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgQyB3aXRoIGNlZGlsbGEsIFUrMDBDNyBJU09sYXQxCisgICAgJ0NoaSc6ICAgICAgMHgwM2E3LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGNoaSwgVSswM0E3CisgICAgJ0RhZ2dlcic6ICAgMHgyMDIxLCAjIGRvdWJsZSBkYWdnZXIsIFUrMjAyMSBJU09wdWIKKyAgICAnRGVsdGEnOiAgICAweDAzOTQsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZGVsdGEsIFUrMDM5NCBJU09ncmszCisgICAgJ0VUSCc6ICAgICAgMHgwMGQwLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEVUSCwgVSswMEQwIElTT2xhdDEKKyAgICAnRWFjdXRlJzogICAweDAwYzksICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGFjdXRlLCBVKzAwQzkgSVNPbGF0MQorICAgICdFY2lyYyc6ICAgIDB4MDBjYSwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBFIHdpdGggY2lyY3VtZmxleCwgVSswMENBIElTT2xhdDEKKyAgICAnRWdyYXZlJzogICAweDAwYzgsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGdyYXZlLCBVKzAwQzggSVNPbGF0MQorICAgICdFcHNpbG9uJzogIDB4MDM5NSwgIyBncmVlayBjYXBpdGFsIGxldHRlciBlcHNpbG9uLCBVKzAzOTUKKyAgICAnRXRhJzogICAgICAweDAzOTcsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZXRhLCBVKzAzOTcKKyAgICAnRXVtbCc6ICAgICAweDAwY2IsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgRSB3aXRoIGRpYWVyZXNpcywgVSswMENCIElTT2xhdDEKKyAgICAnR2FtbWEnOiAgICAweDAzOTMsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgZ2FtbWEsIFUrMDM5MyBJU09ncmszCisgICAgJ0lhY3V0ZSc6ICAgMHgwMGNkLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBhY3V0ZSwgVSswMENEIElTT2xhdDEKKyAgICAnSWNpcmMnOiAgICAweDAwY2UsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgSSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBDRSBJU09sYXQxCisgICAgJ0lncmF2ZSc6ICAgMHgwMGNjLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBncmF2ZSwgVSswMENDIElTT2xhdDEKKyAgICAnSW90YSc6ICAgICAweDAzOTksICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgaW90YSwgVSswMzk5CisgICAgJ0l1bWwnOiAgICAgMHgwMGNmLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIEkgd2l0aCBkaWFlcmVzaXMsIFUrMDBDRiBJU09sYXQxCisgICAgJ0thcHBhJzogICAgMHgwMzlhLCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIGthcHBhLCBVKzAzOUEKKyAgICAnTGFtYmRhJzogICAweDAzOWIsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbGFtYmRhLCBVKzAzOUIgSVNPZ3JrMworICAgICdNdSc6ICAgICAgIDB4MDM5YywgIyBncmVlayBjYXBpdGFsIGxldHRlciBtdSwgVSswMzlDCisgICAgJ050aWxkZSc6ICAgMHgwMGQxLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIE4gd2l0aCB0aWxkZSwgVSswMEQxIElTT2xhdDEKKyAgICAnTnUnOiAgICAgICAweDAzOWQsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgbnUsIFUrMDM5RAorICAgICdPRWxpZyc6ICAgIDB4MDE1MiwgIyBsYXRpbiBjYXBpdGFsIGxpZ2F0dXJlIE9FLCBVKzAxNTIgSVNPbGF0MgorICAgICdPYWN1dGUnOiAgIDB4MDBkMywgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggYWN1dGUsIFUrMDBEMyBJU09sYXQxCisgICAgJ09jaXJjJzogICAgMHgwMGQ0LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCBjaXJjdW1mbGV4LCBVKzAwRDQgSVNPbGF0MQorICAgICdPZ3JhdmUnOiAgIDB4MDBkMiwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBPIHdpdGggZ3JhdmUsIFUrMDBEMiBJU09sYXQxCisgICAgJ09tZWdhJzogICAgMHgwM2E5LCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIG9tZWdhLCBVKzAzQTkgSVNPZ3JrMworICAgICdPbWljcm9uJzogIDB4MDM5ZiwgIyBncmVlayBjYXBpdGFsIGxldHRlciBvbWljcm9uLCBVKzAzOUYKKyAgICAnT3NsYXNoJzogICAweDAwZDgsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIHN0cm9rZSA9IGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gc2xhc2gsIFUrMDBEOCBJU09sYXQxCisgICAgJ090aWxkZSc6ICAgMHgwMGQ1LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIE8gd2l0aCB0aWxkZSwgVSswMEQ1IElTT2xhdDEKKyAgICAnT3VtbCc6ICAgICAweDAwZDYsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgTyB3aXRoIGRpYWVyZXNpcywgVSswMEQ2IElTT2xhdDEKKyAgICAnUGhpJzogICAgICAweDAzYTYsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcGhpLCBVKzAzQTYgSVNPZ3JrMworICAgICdQaSc6ICAgICAgIDB4MDNhMCwgIyBncmVlayBjYXBpdGFsIGxldHRlciBwaSwgVSswM0EwIElTT2dyazMKKyAgICAnUHJpbWUnOiAgICAweDIwMzMsICMgZG91YmxlIHByaW1lID0gc2Vjb25kcyA9IGluY2hlcywgVSsyMDMzIElTT3RlY2gKKyAgICAnUHNpJzogICAgICAweDAzYTgsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgcHNpLCBVKzAzQTggSVNPZ3JrMworICAgICdSaG8nOiAgICAgIDB4MDNhMSwgIyBncmVlayBjYXBpdGFsIGxldHRlciByaG8sIFUrMDNBMQorICAgICdTY2Fyb24nOiAgIDB4MDE2MCwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBTIHdpdGggY2Fyb24sIFUrMDE2MCBJU09sYXQyCisgICAgJ1NpZ21hJzogICAgMHgwM2EzLCAjIGdyZWVrIGNhcGl0YWwgbGV0dGVyIHNpZ21hLCBVKzAzQTMgSVNPZ3JrMworICAgICdUSE9STic6ICAgIDB4MDBkZSwgIyBsYXRpbiBjYXBpdGFsIGxldHRlciBUSE9STiwgVSswMERFIElTT2xhdDEKKyAgICAnVGF1JzogICAgICAweDAzYTQsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGF1LCBVKzAzQTQKKyAgICAnVGhldGEnOiAgICAweDAzOTgsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdGhldGEsIFUrMDM5OCBJU09ncmszCisgICAgJ1VhY3V0ZSc6ICAgMHgwMGRhLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBhY3V0ZSwgVSswMERBIElTT2xhdDEKKyAgICAnVWNpcmMnOiAgICAweDAwZGIsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBEQiBJU09sYXQxCisgICAgJ1VncmF2ZSc6ICAgMHgwMGQ5LCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFUgd2l0aCBncmF2ZSwgVSswMEQ5IElTT2xhdDEKKyAgICAnVXBzaWxvbic6ICAweDAzYTUsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgdXBzaWxvbiwgVSswM0E1IElTT2dyazMKKyAgICAnVXVtbCc6ICAgICAweDAwZGMsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgVSB3aXRoIGRpYWVyZXNpcywgVSswMERDIElTT2xhdDEKKyAgICAnWGknOiAgICAgICAweDAzOWUsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgeGksIFUrMDM5RSBJU09ncmszCisgICAgJ1lhY3V0ZSc6ICAgMHgwMGRkLCAjIGxhdGluIGNhcGl0YWwgbGV0dGVyIFkgd2l0aCBhY3V0ZSwgVSswMEREIElTT2xhdDEKKyAgICAnWXVtbCc6ICAgICAweDAxNzgsICMgbGF0aW4gY2FwaXRhbCBsZXR0ZXIgWSB3aXRoIGRpYWVyZXNpcywgVSswMTc4IElTT2xhdDIKKyAgICAnWmV0YSc6ICAgICAweDAzOTYsICMgZ3JlZWsgY2FwaXRhbCBsZXR0ZXIgemV0YSwgVSswMzk2CisgICAgJ2FhY3V0ZSc6ICAgMHgwMGUxLCAjIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggYWN1dGUsIFUrMDBFMSBJU09sYXQxCisgICAgJ2FjaXJjJzogICAgMHgwMGUyLCAjIGxhdGluIHNtYWxsIGxldHRlciBhIHdpdGggY2lyY3VtZmxleCwgVSswMEUyIElTT2xhdDEKKyAgICAnYWN1dGUnOiAgICAweDAwYjQsICMgYWN1dGUgYWNjZW50ID0gc3BhY2luZyBhY3V0ZSwgVSswMEI0IElTT2RpYQorICAgICdhZWxpZyc6ICAgIDB4MDBlNiwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYWUgPSBsYXRpbiBzbWFsbCBsaWdhdHVyZSBhZSwgVSswMEU2IElTT2xhdDEKKyAgICAnYWdyYXZlJzogICAweDAwZTAsICMgbGF0aW4gc21hbGwgbGV0dGVyIGEgd2l0aCBncmF2ZSA9IGxhdGluIHNtYWxsIGxldHRlciBhIGdyYXZlLCBVKzAwRTAgSVNPbGF0MQorICAgICdhbGVmc3ltJzogIDB4MjEzNSwgIyBhbGVmIHN5bWJvbCA9IGZpcnN0IHRyYW5zZmluaXRlIGNhcmRpbmFsLCBVKzIxMzUgTkVXCisgICAgJ2FscGhhJzogICAgMHgwM2IxLCAjIGdyZWVrIHNtYWxsIGxldHRlciBhbHBoYSwgVSswM0IxIElTT2dyazMKKyAgICAnYW1wJzogICAgICAweDAwMjYsICMgYW1wZXJzYW5kLCBVKzAwMjYgSVNPbnVtCisgICAgJ2FuZCc6ICAgICAgMHgyMjI3LCAjIGxvZ2ljYWwgYW5kID0gd2VkZ2UsIFUrMjIyNyBJU090ZWNoCisgICAgJ2FuZyc6ICAgICAgMHgyMjIwLCAjIGFuZ2xlLCBVKzIyMjAgSVNPYW1zbworICAgICdhcmluZyc6ICAgIDB4MDBlNSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHJpbmcgYWJvdmUgPSBsYXRpbiBzbWFsbCBsZXR0ZXIgYSByaW5nLCBVKzAwRTUgSVNPbGF0MQorICAgICdhc3ltcCc6ICAgIDB4MjI0OCwgIyBhbG1vc3QgZXF1YWwgdG8gPSBhc3ltcHRvdGljIHRvLCBVKzIyNDggSVNPYW1zcgorICAgICdhdGlsZGUnOiAgIDB4MDBlMywgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIHRpbGRlLCBVKzAwRTMgSVNPbGF0MQorICAgICdhdW1sJzogICAgIDB4MDBlNCwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYSB3aXRoIGRpYWVyZXNpcywgVSswMEU0IElTT2xhdDEKKyAgICAnYmRxdW8nOiAgICAweDIwMWUsICMgZG91YmxlIGxvdy05IHF1b3RhdGlvbiBtYXJrLCBVKzIwMUUgTkVXCisgICAgJ2JldGEnOiAgICAgMHgwM2IyLCAjIGdyZWVrIHNtYWxsIGxldHRlciBiZXRhLCBVKzAzQjIgSVNPZ3JrMworICAgICdicnZiYXInOiAgIDB4MDBhNiwgIyBicm9rZW4gYmFyID0gYnJva2VuIHZlcnRpY2FsIGJhciwgVSswMEE2IElTT251bQorICAgICdidWxsJzogICAgIDB4MjAyMiwgIyBidWxsZXQgPSBibGFjayBzbWFsbCBjaXJjbGUsIFUrMjAyMiBJU09wdWIKKyAgICAnY2FwJzogICAgICAweDIyMjksICMgaW50ZXJzZWN0aW9uID0gY2FwLCBVKzIyMjkgSVNPdGVjaAorICAgICdjY2VkaWwnOiAgIDB4MDBlNywgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgYyB3aXRoIGNlZGlsbGEsIFUrMDBFNyBJU09sYXQxCisgICAgJ2NlZGlsJzogICAgMHgwMGI4LCAjIGNlZGlsbGEgPSBzcGFjaW5nIGNlZGlsbGEsIFUrMDBCOCBJU09kaWEKKyAgICAnY2VudCc6ICAgICAweDAwYTIsICMgY2VudCBzaWduLCBVKzAwQTIgSVNPbnVtCisgICAgJ2NoaSc6ICAgICAgMHgwM2M3LCAjIGdyZWVrIHNtYWxsIGxldHRlciBjaGksIFUrMDNDNyBJU09ncmszCisgICAgJ2NpcmMnOiAgICAgMHgwMmM2LCAjIG1vZGlmaWVyIGxldHRlciBjaXJjdW1mbGV4IGFjY2VudCwgVSswMkM2IElTT3B1YgorICAgICdjbHVicyc6ICAgIDB4MjY2MywgIyBibGFjayBjbHViIHN1aXQgPSBzaGFtcm9jaywgVSsyNjYzIElTT3B1YgorICAgICdjb25nJzogICAgIDB4MjI0NSwgIyBhcHByb3hpbWF0ZWx5IGVxdWFsIHRvLCBVKzIyNDUgSVNPdGVjaAorICAgICdjb3B5JzogICAgIDB4MDBhOSwgIyBjb3B5cmlnaHQgc2lnbiwgVSswMEE5IElTT251bQorICAgICdjcmFycic6ICAgIDB4MjFiNSwgIyBkb3dud2FyZHMgYXJyb3cgd2l0aCBjb3JuZXIgbGVmdHdhcmRzID0gY2FycmlhZ2UgcmV0dXJuLCBVKzIxQjUgTkVXCisgICAgJ2N1cCc6ICAgICAgMHgyMjJhLCAjIHVuaW9uID0gY3VwLCBVKzIyMkEgSVNPdGVjaAorICAgICdjdXJyZW4nOiAgIDB4MDBhNCwgIyBjdXJyZW5jeSBzaWduLCBVKzAwQTQgSVNPbnVtCisgICAgJ2RBcnInOiAgICAgMHgyMWQzLCAjIGRvd253YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMyBJU09hbXNhCisgICAgJ2RhZ2dlcic6ICAgMHgyMDIwLCAjIGRhZ2dlciwgVSsyMDIwIElTT3B1YgorICAgICdkYXJyJzogICAgIDB4MjE5MywgIyBkb3dud2FyZHMgYXJyb3csIFUrMjE5MyBJU09udW0KKyAgICAnZGVnJzogICAgICAweDAwYjAsICMgZGVncmVlIHNpZ24sIFUrMDBCMCBJU09udW0KKyAgICAnZGVsdGEnOiAgICAweDAzYjQsICMgZ3JlZWsgc21hbGwgbGV0dGVyIGRlbHRhLCBVKzAzQjQgSVNPZ3JrMworICAgICdkaWFtcyc6ICAgIDB4MjY2NiwgIyBibGFjayBkaWFtb25kIHN1aXQsIFUrMjY2NiBJU09wdWIKKyAgICAnZGl2aWRlJzogICAweDAwZjcsICMgZGl2aXNpb24gc2lnbiwgVSswMEY3IElTT251bQorICAgICdlYWN1dGUnOiAgIDB4MDBlOSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGFjdXRlLCBVKzAwRTkgSVNPbGF0MQorICAgICdlY2lyYyc6ICAgIDB4MDBlYSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgZSB3aXRoIGNpcmN1bWZsZXgsIFUrMDBFQSBJU09sYXQxCisgICAgJ2VncmF2ZSc6ICAgMHgwMGU4LCAjIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZ3JhdmUsIFUrMDBFOCBJU09sYXQxCisgICAgJ2VtcHR5JzogICAgMHgyMjA1LCAjIGVtcHR5IHNldCA9IG51bGwgc2V0ID0gZGlhbWV0ZXIsIFUrMjIwNSBJU09hbXNvCisgICAgJ2Vtc3AnOiAgICAgMHgyMDAzLCAjIGVtIHNwYWNlLCBVKzIwMDMgSVNPcHViCisgICAgJ2Vuc3AnOiAgICAgMHgyMDAyLCAjIGVuIHNwYWNlLCBVKzIwMDIgSVNPcHViCisgICAgJ2Vwc2lsb24nOiAgMHgwM2I1LCAjIGdyZWVrIHNtYWxsIGxldHRlciBlcHNpbG9uLCBVKzAzQjUgSVNPZ3JrMworICAgICdlcXVpdic6ICAgIDB4MjI2MSwgIyBpZGVudGljYWwgdG8sIFUrMjI2MSBJU090ZWNoCisgICAgJ2V0YSc6ICAgICAgMHgwM2I3LCAjIGdyZWVrIHNtYWxsIGxldHRlciBldGEsIFUrMDNCNyBJU09ncmszCisgICAgJ2V0aCc6ICAgICAgMHgwMGYwLCAjIGxhdGluIHNtYWxsIGxldHRlciBldGgsIFUrMDBGMCBJU09sYXQxCisgICAgJ2V1bWwnOiAgICAgMHgwMGViLCAjIGxhdGluIHNtYWxsIGxldHRlciBlIHdpdGggZGlhZXJlc2lzLCBVKzAwRUIgSVNPbGF0MQorICAgICdldXJvJzogICAgIDB4MjBhYywgIyBldXJvIHNpZ24sIFUrMjBBQyBORVcKKyAgICAnZXhpc3QnOiAgICAweDIyMDMsICMgdGhlcmUgZXhpc3RzLCBVKzIyMDMgSVNPdGVjaAorICAgICdmbm9mJzogICAgIDB4MDE5MiwgIyBsYXRpbiBzbWFsbCBmIHdpdGggaG9vayA9IGZ1bmN0aW9uID0gZmxvcmluLCBVKzAxOTIgSVNPdGVjaAorICAgICdmb3JhbGwnOiAgIDB4MjIwMCwgIyBmb3IgYWxsLCBVKzIyMDAgSVNPdGVjaAorICAgICdmcmFjMTInOiAgIDB4MDBiZCwgIyB2dWxnYXIgZnJhY3Rpb24gb25lIGhhbGYgPSBmcmFjdGlvbiBvbmUgaGFsZiwgVSswMEJEIElTT251bQorICAgICdmcmFjMTQnOiAgIDB4MDBiYywgIyB2dWxnYXIgZnJhY3Rpb24gb25lIHF1YXJ0ZXIgPSBmcmFjdGlvbiBvbmUgcXVhcnRlciwgVSswMEJDIElTT251bQorICAgICdmcmFjMzQnOiAgIDB4MDBiZSwgIyB2dWxnYXIgZnJhY3Rpb24gdGhyZWUgcXVhcnRlcnMgPSBmcmFjdGlvbiB0aHJlZSBxdWFydGVycywgVSswMEJFIElTT251bQorICAgICdmcmFzbCc6ICAgIDB4MjA0NCwgIyBmcmFjdGlvbiBzbGFzaCwgVSsyMDQ0IE5FVworICAgICdnYW1tYSc6ICAgIDB4MDNiMywgIyBncmVlayBzbWFsbCBsZXR0ZXIgZ2FtbWEsIFUrMDNCMyBJU09ncmszCisgICAgJ2dlJzogICAgICAgMHgyMjY1LCAjIGdyZWF0ZXItdGhhbiBvciBlcXVhbCB0bywgVSsyMjY1IElTT3RlY2gKKyAgICAnZ3QnOiAgICAgICAweDAwM2UsICMgZ3JlYXRlci10aGFuIHNpZ24sIFUrMDAzRSBJU09udW0KKyAgICAnaEFycic6ICAgICAweDIxZDQsICMgbGVmdCByaWdodCBkb3VibGUgYXJyb3csIFUrMjFENCBJU09hbXNhCisgICAgJ2hhcnInOiAgICAgMHgyMTk0LCAjIGxlZnQgcmlnaHQgYXJyb3csIFUrMjE5NCBJU09hbXNhCisgICAgJ2hlYXJ0cyc6ICAgMHgyNjY1LCAjIGJsYWNrIGhlYXJ0IHN1aXQgPSB2YWxlbnRpbmUsIFUrMjY2NSBJU09wdWIKKyAgICAnaGVsbGlwJzogICAweDIwMjYsICMgaG9yaXpvbnRhbCBlbGxpcHNpcyA9IHRocmVlIGRvdCBsZWFkZXIsIFUrMjAyNiBJU09wdWIKKyAgICAnaWFjdXRlJzogICAweDAwZWQsICMgbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBhY3V0ZSwgVSswMEVEIElTT2xhdDEKKyAgICAnaWNpcmMnOiAgICAweDAwZWUsICMgbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRUUgSVNPbGF0MQorICAgICdpZXhjbCc6ICAgIDB4MDBhMSwgIyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrLCBVKzAwQTEgSVNPbnVtCisgICAgJ2lncmF2ZSc6ICAgMHgwMGVjLCAjIGxhdGluIHNtYWxsIGxldHRlciBpIHdpdGggZ3JhdmUsIFUrMDBFQyBJU09sYXQxCisgICAgJ2ltYWdlJzogICAgMHgyMTExLCAjIGJsYWNrbGV0dGVyIGNhcGl0YWwgSSA9IGltYWdpbmFyeSBwYXJ0LCBVKzIxMTEgSVNPYW1zbworICAgICdpbmZpbic6ICAgIDB4MjIxZSwgIyBpbmZpbml0eSwgVSsyMjFFIElTT3RlY2gKKyAgICAnaW50JzogICAgICAweDIyMmIsICMgaW50ZWdyYWwsIFUrMjIyQiBJU090ZWNoCisgICAgJ2lvdGEnOiAgICAgMHgwM2I5LCAjIGdyZWVrIHNtYWxsIGxldHRlciBpb3RhLCBVKzAzQjkgSVNPZ3JrMworICAgICdpcXVlc3QnOiAgIDB4MDBiZiwgIyBpbnZlcnRlZCBxdWVzdGlvbiBtYXJrID0gdHVybmVkIHF1ZXN0aW9uIG1hcmssIFUrMDBCRiBJU09udW0KKyAgICAnaXNpbic6ICAgICAweDIyMDgsICMgZWxlbWVudCBvZiwgVSsyMjA4IElTT3RlY2gKKyAgICAnaXVtbCc6ICAgICAweDAwZWYsICMgbGF0aW4gc21hbGwgbGV0dGVyIGkgd2l0aCBkaWFlcmVzaXMsIFUrMDBFRiBJU09sYXQxCisgICAgJ2thcHBhJzogICAgMHgwM2JhLCAjIGdyZWVrIHNtYWxsIGxldHRlciBrYXBwYSwgVSswM0JBIElTT2dyazMKKyAgICAnbEFycic6ICAgICAweDIxZDAsICMgbGVmdHdhcmRzIGRvdWJsZSBhcnJvdywgVSsyMUQwIElTT3RlY2gKKyAgICAnbGFtYmRhJzogICAweDAzYmIsICMgZ3JlZWsgc21hbGwgbGV0dGVyIGxhbWJkYSwgVSswM0JCIElTT2dyazMKKyAgICAnbGFuZyc6ICAgICAweDIzMjksICMgbGVmdC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0gYnJhLCBVKzIzMjkgSVNPdGVjaAorICAgICdsYXF1byc6ICAgIDB4MDBhYiwgIyBsZWZ0LXBvaW50aW5nIGRvdWJsZSBhbmdsZSBxdW90YXRpb24gbWFyayA9IGxlZnQgcG9pbnRpbmcgZ3VpbGxlbWV0LCBVKzAwQUIgSVNPbnVtCisgICAgJ2xhcnInOiAgICAgMHgyMTkwLCAjIGxlZnR3YXJkcyBhcnJvdywgVSsyMTkwIElTT251bQorICAgICdsY2VpbCc6ICAgIDB4MjMwOCwgIyBsZWZ0IGNlaWxpbmcgPSBhcGwgdXBzdGlsZSwgVSsyMzA4IElTT2Ftc2MKKyAgICAnbGRxdW8nOiAgICAweDIwMWMsICMgbGVmdCBkb3VibGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxQyBJU09udW0KKyAgICAnbGUnOiAgICAgICAweDIyNjQsICMgbGVzcy10aGFuIG9yIGVxdWFsIHRvLCBVKzIyNjQgSVNPdGVjaAorICAgICdsZmxvb3InOiAgIDB4MjMwYSwgIyBsZWZ0IGZsb29yID0gYXBsIGRvd25zdGlsZSwgVSsyMzBBIElTT2Ftc2MKKyAgICAnbG93YXN0JzogICAweDIyMTcsICMgYXN0ZXJpc2sgb3BlcmF0b3IsIFUrMjIxNyBJU090ZWNoCisgICAgJ2xveic6ICAgICAgMHgyNWNhLCAjIGxvemVuZ2UsIFUrMjVDQSBJU09wdWIKKyAgICAnbHJtJzogICAgICAweDIwMGUsICMgbGVmdC10by1yaWdodCBtYXJrLCBVKzIwMEUgTkVXIFJGQyAyMDcwCisgICAgJ2xzYXF1byc6ICAgMHgyMDM5LCAjIHNpbmdsZSBsZWZ0LXBvaW50aW5nIGFuZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMzkgSVNPIHByb3Bvc2VkCisgICAgJ2xzcXVvJzogICAgMHgyMDE4LCAjIGxlZnQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMTggSVNPbnVtCisgICAgJ2x0JzogICAgICAgMHgwMDNjLCAjIGxlc3MtdGhhbiBzaWduLCBVKzAwM0MgSVNPbnVtCisgICAgJ21hY3InOiAgICAgMHgwMGFmLCAjIG1hY3JvbiA9IHNwYWNpbmcgbWFjcm9uID0gb3ZlcmxpbmUgPSBBUEwgb3ZlcmJhciwgVSswMEFGIElTT2RpYQorICAgICdtZGFzaCc6ICAgIDB4MjAxNCwgIyBlbSBkYXNoLCBVKzIwMTQgSVNPcHViCisgICAgJ21pY3JvJzogICAgMHgwMGI1LCAjIG1pY3JvIHNpZ24sIFUrMDBCNSBJU09udW0KKyAgICAnbWlkZG90JzogICAweDAwYjcsICMgbWlkZGxlIGRvdCA9IEdlb3JnaWFuIGNvbW1hID0gR3JlZWsgbWlkZGxlIGRvdCwgVSswMEI3IElTT251bQorICAgICdtaW51cyc6ICAgIDB4MjIxMiwgIyBtaW51cyBzaWduLCBVKzIyMTIgSVNPdGVjaAorICAgICdtdSc6ICAgICAgIDB4MDNiYywgIyBncmVlayBzbWFsbCBsZXR0ZXIgbXUsIFUrMDNCQyBJU09ncmszCisgICAgJ25hYmxhJzogICAgMHgyMjA3LCAjIG5hYmxhID0gYmFja3dhcmQgZGlmZmVyZW5jZSwgVSsyMjA3IElTT3RlY2gKKyAgICAnbmJzcCc6ICAgICAweDAwYTAsICMgbm8tYnJlYWsgc3BhY2UgPSBub24tYnJlYWtpbmcgc3BhY2UsIFUrMDBBMCBJU09udW0KKyAgICAnbmRhc2gnOiAgICAweDIwMTMsICMgZW4gZGFzaCwgVSsyMDEzIElTT3B1YgorICAgICduZSc6ICAgICAgIDB4MjI2MCwgIyBub3QgZXF1YWwgdG8sIFUrMjI2MCBJU090ZWNoCisgICAgJ25pJzogICAgICAgMHgyMjBiLCAjIGNvbnRhaW5zIGFzIG1lbWJlciwgVSsyMjBCIElTT3RlY2gKKyAgICAnbm90JzogICAgICAweDAwYWMsICMgbm90IHNpZ24sIFUrMDBBQyBJU09udW0KKyAgICAnbm90aW4nOiAgICAweDIyMDksICMgbm90IGFuIGVsZW1lbnQgb2YsIFUrMjIwOSBJU090ZWNoCisgICAgJ25zdWInOiAgICAgMHgyMjg0LCAjIG5vdCBhIHN1YnNldCBvZiwgVSsyMjg0IElTT2Ftc24KKyAgICAnbnRpbGRlJzogICAweDAwZjEsICMgbGF0aW4gc21hbGwgbGV0dGVyIG4gd2l0aCB0aWxkZSwgVSswMEYxIElTT2xhdDEKKyAgICAnbnUnOiAgICAgICAweDAzYmQsICMgZ3JlZWsgc21hbGwgbGV0dGVyIG51LCBVKzAzQkQgSVNPZ3JrMworICAgICdvYWN1dGUnOiAgIDB4MDBmMywgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGFjdXRlLCBVKzAwRjMgSVNPbGF0MQorICAgICdvY2lyYyc6ICAgIDB4MDBmNCwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGNpcmN1bWZsZXgsIFUrMDBGNCBJU09sYXQxCisgICAgJ29lbGlnJzogICAgMHgwMTUzLCAjIGxhdGluIHNtYWxsIGxpZ2F0dXJlIG9lLCBVKzAxNTMgSVNPbGF0MgorICAgICdvZ3JhdmUnOiAgIDB4MDBmMiwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIGdyYXZlLCBVKzAwRjIgSVNPbGF0MQorICAgICdvbGluZSc6ICAgIDB4MjAzZSwgIyBvdmVybGluZSA9IHNwYWNpbmcgb3ZlcnNjb3JlLCBVKzIwM0UgTkVXCisgICAgJ29tZWdhJzogICAgMHgwM2M5LCAjIGdyZWVrIHNtYWxsIGxldHRlciBvbWVnYSwgVSswM0M5IElTT2dyazMKKyAgICAnb21pY3Jvbic6ICAweDAzYmYsICMgZ3JlZWsgc21hbGwgbGV0dGVyIG9taWNyb24sIFUrMDNCRiBORVcKKyAgICAnb3BsdXMnOiAgICAweDIyOTUsICMgY2lyY2xlZCBwbHVzID0gZGlyZWN0IHN1bSwgVSsyMjk1IElTT2Ftc2IKKyAgICAnb3InOiAgICAgICAweDIyMjgsICMgbG9naWNhbCBvciA9IHZlZSwgVSsyMjI4IElTT3RlY2gKKyAgICAnb3JkZic6ICAgICAweDAwYWEsICMgZmVtaW5pbmUgb3JkaW5hbCBpbmRpY2F0b3IsIFUrMDBBQSBJU09udW0KKyAgICAnb3JkbSc6ICAgICAweDAwYmEsICMgbWFzY3VsaW5lIG9yZGluYWwgaW5kaWNhdG9yLCBVKzAwQkEgSVNPbnVtCisgICAgJ29zbGFzaCc6ICAgMHgwMGY4LCAjIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggc3Ryb2tlLCA9IGxhdGluIHNtYWxsIGxldHRlciBvIHNsYXNoLCBVKzAwRjggSVNPbGF0MQorICAgICdvdGlsZGUnOiAgIDB4MDBmNSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgbyB3aXRoIHRpbGRlLCBVKzAwRjUgSVNPbGF0MQorICAgICdvdGltZXMnOiAgIDB4MjI5NywgIyBjaXJjbGVkIHRpbWVzID0gdmVjdG9yIHByb2R1Y3QsIFUrMjI5NyBJU09hbXNiCisgICAgJ291bWwnOiAgICAgMHgwMGY2LCAjIGxhdGluIHNtYWxsIGxldHRlciBvIHdpdGggZGlhZXJlc2lzLCBVKzAwRjYgSVNPbGF0MQorICAgICdwYXJhJzogICAgIDB4MDBiNiwgIyBwaWxjcm93IHNpZ24gPSBwYXJhZ3JhcGggc2lnbiwgVSswMEI2IElTT251bQorICAgICdwYXJ0JzogICAgIDB4MjIwMiwgIyBwYXJ0aWFsIGRpZmZlcmVudGlhbCwgVSsyMjAyIElTT3RlY2gKKyAgICAncGVybWlsJzogICAweDIwMzAsICMgcGVyIG1pbGxlIHNpZ24sIFUrMjAzMCBJU090ZWNoCisgICAgJ3BlcnAnOiAgICAgMHgyMmE1LCAjIHVwIHRhY2sgPSBvcnRob2dvbmFsIHRvID0gcGVycGVuZGljdWxhciwgVSsyMkE1IElTT3RlY2gKKyAgICAncGhpJzogICAgICAweDAzYzYsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHBoaSwgVSswM0M2IElTT2dyazMKKyAgICAncGknOiAgICAgICAweDAzYzAsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHBpLCBVKzAzQzAgSVNPZ3JrMworICAgICdwaXYnOiAgICAgIDB4MDNkNiwgIyBncmVlayBwaSBzeW1ib2wsIFUrMDNENiBJU09ncmszCisgICAgJ3BsdXNtbic6ICAgMHgwMGIxLCAjIHBsdXMtbWludXMgc2lnbiA9IHBsdXMtb3ItbWludXMgc2lnbiwgVSswMEIxIElTT251bQorICAgICdwb3VuZCc6ICAgIDB4MDBhMywgIyBwb3VuZCBzaWduLCBVKzAwQTMgSVNPbnVtCisgICAgJ3ByaW1lJzogICAgMHgyMDMyLCAjIHByaW1lID0gbWludXRlcyA9IGZlZXQsIFUrMjAzMiBJU090ZWNoCisgICAgJ3Byb2QnOiAgICAgMHgyMjBmLCAjIG4tYXJ5IHByb2R1Y3QgPSBwcm9kdWN0IHNpZ24sIFUrMjIwRiBJU09hbXNiCisgICAgJ3Byb3AnOiAgICAgMHgyMjFkLCAjIHByb3BvcnRpb25hbCB0bywgVSsyMjFEIElTT3RlY2gKKyAgICAncHNpJzogICAgICAweDAzYzgsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHBzaSwgVSswM0M4IElTT2dyazMKKyAgICAncXVvdCc6ICAgICAweDAwMjIsICMgcXVvdGF0aW9uIG1hcmsgPSBBUEwgcXVvdGUsIFUrMDAyMiBJU09udW0KKyAgICAnckFycic6ICAgICAweDIxZDIsICMgcmlnaHR3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMiBJU090ZWNoCisgICAgJ3JhZGljJzogICAgMHgyMjFhLCAjIHNxdWFyZSByb290ID0gcmFkaWNhbCBzaWduLCBVKzIyMUEgSVNPdGVjaAorICAgICdyYW5nJzogICAgIDB4MjMyYSwgIyByaWdodC1wb2ludGluZyBhbmdsZSBicmFja2V0ID0ga2V0LCBVKzIzMkEgSVNPdGVjaAorICAgICdyYXF1byc6ICAgIDB4MDBiYiwgIyByaWdodC1wb2ludGluZyBkb3VibGUgYW5nbGUgcXVvdGF0aW9uIG1hcmsgPSByaWdodCBwb2ludGluZyBndWlsbGVtZXQsIFUrMDBCQiBJU09udW0KKyAgICAncmFycic6ICAgICAweDIxOTIsICMgcmlnaHR3YXJkcyBhcnJvdywgVSsyMTkyIElTT251bQorICAgICdyY2VpbCc6ICAgIDB4MjMwOSwgIyByaWdodCBjZWlsaW5nLCBVKzIzMDkgSVNPYW1zYworICAgICdyZHF1byc6ICAgIDB4MjAxZCwgIyByaWdodCBkb3VibGUgcXVvdGF0aW9uIG1hcmssIFUrMjAxRCBJU09udW0KKyAgICAncmVhbCc6ICAgICAweDIxMWMsICMgYmxhY2tsZXR0ZXIgY2FwaXRhbCBSID0gcmVhbCBwYXJ0IHN5bWJvbCwgVSsyMTFDIElTT2Ftc28KKyAgICAncmVnJzogICAgICAweDAwYWUsICMgcmVnaXN0ZXJlZCBzaWduID0gcmVnaXN0ZXJlZCB0cmFkZSBtYXJrIHNpZ24sIFUrMDBBRSBJU09udW0KKyAgICAncmZsb29yJzogICAweDIzMGIsICMgcmlnaHQgZmxvb3IsIFUrMjMwQiBJU09hbXNjCisgICAgJ3Jobyc6ICAgICAgMHgwM2MxLCAjIGdyZWVrIHNtYWxsIGxldHRlciByaG8sIFUrMDNDMSBJU09ncmszCisgICAgJ3JsbSc6ICAgICAgMHgyMDBmLCAjIHJpZ2h0LXRvLWxlZnQgbWFyaywgVSsyMDBGIE5FVyBSRkMgMjA3MAorICAgICdyc2FxdW8nOiAgIDB4MjAzYSwgIyBzaW5nbGUgcmlnaHQtcG9pbnRpbmcgYW5nbGUgcXVvdGF0aW9uIG1hcmssIFUrMjAzQSBJU08gcHJvcG9zZWQKKyAgICAncnNxdW8nOiAgICAweDIwMTksICMgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrLCBVKzIwMTkgSVNPbnVtCisgICAgJ3NicXVvJzogICAgMHgyMDFhLCAjIHNpbmdsZSBsb3ctOSBxdW90YXRpb24gbWFyaywgVSsyMDFBIE5FVworICAgICdzY2Fyb24nOiAgIDB4MDE2MSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgcyB3aXRoIGNhcm9uLCBVKzAxNjEgSVNPbGF0MgorICAgICdzZG90JzogICAgIDB4MjJjNSwgIyBkb3Qgb3BlcmF0b3IsIFUrMjJDNSBJU09hbXNiCisgICAgJ3NlY3QnOiAgICAgMHgwMGE3LCAjIHNlY3Rpb24gc2lnbiwgVSswMEE3IElTT251bQorICAgICdzaHknOiAgICAgIDB4MDBhZCwgIyBzb2Z0IGh5cGhlbiA9IGRpc2NyZXRpb25hcnkgaHlwaGVuLCBVKzAwQUQgSVNPbnVtCisgICAgJ3NpZ21hJzogICAgMHgwM2MzLCAjIGdyZWVrIHNtYWxsIGxldHRlciBzaWdtYSwgVSswM0MzIElTT2dyazMKKyAgICAnc2lnbWFmJzogICAweDAzYzIsICMgZ3JlZWsgc21hbGwgbGV0dGVyIGZpbmFsIHNpZ21hLCBVKzAzQzIgSVNPZ3JrMworICAgICdzaW0nOiAgICAgIDB4MjIzYywgIyB0aWxkZSBvcGVyYXRvciA9IHZhcmllcyB3aXRoID0gc2ltaWxhciB0bywgVSsyMjNDIElTT3RlY2gKKyAgICAnc3BhZGVzJzogICAweDI2NjAsICMgYmxhY2sgc3BhZGUgc3VpdCwgVSsyNjYwIElTT3B1YgorICAgICdzdWInOiAgICAgIDB4MjI4MiwgIyBzdWJzZXQgb2YsIFUrMjI4MiBJU090ZWNoCisgICAgJ3N1YmUnOiAgICAgMHgyMjg2LCAjIHN1YnNldCBvZiBvciBlcXVhbCB0bywgVSsyMjg2IElTT3RlY2gKKyAgICAnc3VtJzogICAgICAweDIyMTEsICMgbi1hcnkgc3VtYXRpb24sIFUrMjIxMSBJU09hbXNiCisgICAgJ3N1cCc6ICAgICAgMHgyMjgzLCAjIHN1cGVyc2V0IG9mLCBVKzIyODMgSVNPdGVjaAorICAgICdzdXAxJzogICAgIDB4MDBiOSwgIyBzdXBlcnNjcmlwdCBvbmUgPSBzdXBlcnNjcmlwdCBkaWdpdCBvbmUsIFUrMDBCOSBJU09udW0KKyAgICAnc3VwMic6ICAgICAweDAwYjIsICMgc3VwZXJzY3JpcHQgdHdvID0gc3VwZXJzY3JpcHQgZGlnaXQgdHdvID0gc3F1YXJlZCwgVSswMEIyIElTT251bQorICAgICdzdXAzJzogICAgIDB4MDBiMywgIyBzdXBlcnNjcmlwdCB0aHJlZSA9IHN1cGVyc2NyaXB0IGRpZ2l0IHRocmVlID0gY3ViZWQsIFUrMDBCMyBJU09udW0KKyAgICAnc3VwZSc6ICAgICAweDIyODcsICMgc3VwZXJzZXQgb2Ygb3IgZXF1YWwgdG8sIFUrMjI4NyBJU090ZWNoCisgICAgJ3N6bGlnJzogICAgMHgwMGRmLCAjIGxhdGluIHNtYWxsIGxldHRlciBzaGFycCBzID0gZXNzLXplZCwgVSswMERGIElTT2xhdDEKKyAgICAndGF1JzogICAgICAweDAzYzQsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHRhdSwgVSswM0M0IElTT2dyazMKKyAgICAndGhlcmU0JzogICAweDIyMzQsICMgdGhlcmVmb3JlLCBVKzIyMzQgSVNPdGVjaAorICAgICd0aGV0YSc6ICAgIDB4MDNiOCwgIyBncmVlayBzbWFsbCBsZXR0ZXIgdGhldGEsIFUrMDNCOCBJU09ncmszCisgICAgJ3RoZXRhc3ltJzogMHgwM2QxLCAjIGdyZWVrIHNtYWxsIGxldHRlciB0aGV0YSBzeW1ib2wsIFUrMDNEMSBORVcKKyAgICAndGhpbnNwJzogICAweDIwMDksICMgdGhpbiBzcGFjZSwgVSsyMDA5IElTT3B1YgorICAgICd0aG9ybic6ICAgIDB4MDBmZSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgdGhvcm4gd2l0aCwgVSswMEZFIElTT2xhdDEKKyAgICAndGlsZGUnOiAgICAweDAyZGMsICMgc21hbGwgdGlsZGUsIFUrMDJEQyBJU09kaWEKKyAgICAndGltZXMnOiAgICAweDAwZDcsICMgbXVsdGlwbGljYXRpb24gc2lnbiwgVSswMEQ3IElTT251bQorICAgICd0cmFkZSc6ICAgIDB4MjEyMiwgIyB0cmFkZSBtYXJrIHNpZ24sIFUrMjEyMiBJU09udW0KKyAgICAndUFycic6ICAgICAweDIxZDEsICMgdXB3YXJkcyBkb3VibGUgYXJyb3csIFUrMjFEMSBJU09hbXNhCisgICAgJ3VhY3V0ZSc6ICAgMHgwMGZhLCAjIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggYWN1dGUsIFUrMDBGQSBJU09sYXQxCisgICAgJ3VhcnInOiAgICAgMHgyMTkxLCAjIHVwd2FyZHMgYXJyb3csIFUrMjE5MSBJU09udW0KKyAgICAndWNpcmMnOiAgICAweDAwZmIsICMgbGF0aW4gc21hbGwgbGV0dGVyIHUgd2l0aCBjaXJjdW1mbGV4LCBVKzAwRkIgSVNPbGF0MQorICAgICd1Z3JhdmUnOiAgIDB4MDBmOSwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgdSB3aXRoIGdyYXZlLCBVKzAwRjkgSVNPbGF0MQorICAgICd1bWwnOiAgICAgIDB4MDBhOCwgIyBkaWFlcmVzaXMgPSBzcGFjaW5nIGRpYWVyZXNpcywgVSswMEE4IElTT2RpYQorICAgICd1cHNpaCc6ICAgIDB4MDNkMiwgIyBncmVlayB1cHNpbG9uIHdpdGggaG9vayBzeW1ib2wsIFUrMDNEMiBORVcKKyAgICAndXBzaWxvbic6ICAweDAzYzUsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHVwc2lsb24sIFUrMDNDNSBJU09ncmszCisgICAgJ3V1bWwnOiAgICAgMHgwMGZjLCAjIGxhdGluIHNtYWxsIGxldHRlciB1IHdpdGggZGlhZXJlc2lzLCBVKzAwRkMgSVNPbGF0MQorICAgICd3ZWllcnAnOiAgIDB4MjExOCwgIyBzY3JpcHQgY2FwaXRhbCBQID0gcG93ZXIgc2V0ID0gV2VpZXJzdHJhc3MgcCwgVSsyMTE4IElTT2Ftc28KKyAgICAneGknOiAgICAgICAweDAzYmUsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHhpLCBVKzAzQkUgSVNPZ3JrMworICAgICd5YWN1dGUnOiAgIDB4MDBmZCwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGFjdXRlLCBVKzAwRkQgSVNPbGF0MQorICAgICd5ZW4nOiAgICAgIDB4MDBhNSwgIyB5ZW4gc2lnbiA9IHl1YW4gc2lnbiwgVSswMEE1IElTT251bQorICAgICd5dW1sJzogICAgIDB4MDBmZiwgIyBsYXRpbiBzbWFsbCBsZXR0ZXIgeSB3aXRoIGRpYWVyZXNpcywgVSswMEZGIElTT2xhdDEKKyAgICAnemV0YSc6ICAgICAweDAzYjYsICMgZ3JlZWsgc21hbGwgbGV0dGVyIHpldGEsIFUrMDNCNiBJU09ncmszCisgICAgJ3p3aic6ICAgICAgMHgyMDBkLCAjIHplcm8gd2lkdGggam9pbmVyLCBVKzIwMEQgTkVXIFJGQyAyMDcwCisgICAgJ3p3bmonOiAgICAgMHgyMDBjLCAjIHplcm8gd2lkdGggbm9uLWpvaW5lciwgVSsyMDBDIE5FVyBSRkMgMjA3MAorfQorCisjIG1hcHMgdGhlIFVuaWNvZGUgY29kZXBvaW50IHRvIHRoZSBIVE1MIGVudGl0eSBuYW1lCitjb2RlcG9pbnQybmFtZSA9IHt9CisKKyMgbWFwcyB0aGUgSFRNTCBlbnRpdHkgbmFtZSB0byB0aGUgY2hhcmFjdGVyCisjIChvciBhIGNoYXJhY3RlciByZWZlcmVuY2UgaWYgdGhlIGNoYXJhY3RlciBpcyBvdXRzaWRlIHRoZSBMYXRpbi0xIHJhbmdlKQorZW50aXR5ZGVmcyA9IHt9CisKK2ZvciAobmFtZSwgY29kZXBvaW50KSBpbiBuYW1lMmNvZGVwb2ludC5pdGVyaXRlbXMoKToKKyAgICBjb2RlcG9pbnQybmFtZVtjb2RlcG9pbnRdID0gbmFtZQorICAgIGlmIGNvZGVwb2ludCA8PSAweGZmOgorICAgICAgICBlbnRpdHlkZWZzW25hbWVdID0gY2hyKGNvZGVwb2ludCkKKyAgICBlbHNlOgorICAgICAgICBlbnRpdHlkZWZzW25hbWVdID0gJyYjJWQ7JyAlIGNvZGVwb2ludAorCitkZWwgbmFtZSwgY29kZXBvaW50CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5YyBiL2xpYi9weXRob24yLjcvaHRtbGVudGl0eWRlZnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTJiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5byBiL2xpYi9weXRob24yLjcvaHRtbGVudGl0eWRlZnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMTJiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0bWxlbnRpdHlkZWZzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2h0bWxsaWIucHkgYi9saWIvcHl0aG9uMi43L2h0bWxsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ2NDdkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaHRtbGxpYi5weQpAQCAtMCwwICsxLDQ5MSBAQAorIiIiSFRNTCAyLjAgcGFyc2VyLgorCitTZWUgdGhlIEhUTUwgMi4wIHNwZWNpZmljYXRpb246CitodHRwOi8vd3d3LnczLm9yZy9oeXBlcnRleHQvV1dXL01hcmtVcC9odG1sLXNwZWMvaHRtbC1zcGVjX3RvYy5odG1sCisiIiIKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgaHRtbGxpYiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwKKyAgICAgICAgIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCitpbXBvcnQgc2dtbGxpYgorCitmcm9tIGZvcm1hdHRlciBpbXBvcnQgQVNfSVMKKworX19hbGxfXyA9IFsiSFRNTFBhcnNlciIsICJIVE1MUGFyc2VFcnJvciJdCisKKworY2xhc3MgSFRNTFBhcnNlRXJyb3Ioc2dtbGxpYi5TR01MUGFyc2VFcnJvcik6CisgICAgIiIiRXJyb3IgcmFpc2VkIHdoZW4gYW4gSFRNTCBkb2N1bWVudCBjYW4ndCBiZSBwYXJzZWQuIiIiCisKKworY2xhc3MgSFRNTFBhcnNlcihzZ21sbGliLlNHTUxQYXJzZXIpOgorICAgICIiIlRoaXMgaXMgdGhlIGJhc2ljIEhUTUwgcGFyc2VyIGNsYXNzLgorCisgICAgSXQgc3VwcG9ydHMgYWxsIGVudGl0eSBuYW1lcyByZXF1aXJlZCBieSB0aGUgWEhUTUwgMS4wIFJlY29tbWVuZGF0aW9uLgorICAgIEl0IGFsc28gZGVmaW5lcyBoYW5kbGVycyBmb3IgYWxsIEhUTUwgMi4wIGFuZCBtYW55IEhUTUwgMy4wIGFuZCAzLjIKKyAgICBlbGVtZW50cy4KKworICAgICIiIgorCisgICAgZnJvbSBodG1sZW50aXR5ZGVmcyBpbXBvcnQgZW50aXR5ZGVmcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvcm1hdHRlciwgdmVyYm9zZT0wKToKKyAgICAgICAgIiIiQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgSFRNTFBhcnNlciBjbGFzcy4KKworICAgICAgICBUaGUgZm9ybWF0dGVyIHBhcmFtZXRlciBpcyB0aGUgZm9ybWF0dGVyIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aAorICAgICAgICB0aGUgcGFyc2VyLgorCisgICAgICAgICIiIgorICAgICAgICBzZ21sbGliLlNHTUxQYXJzZXIuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBmb3JtYXR0ZXIKKworICAgIGRlZiBlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcmFpc2UgSFRNTFBhcnNlRXJyb3IobWVzc2FnZSkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2dtbGxpYi5TR01MUGFyc2VyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuc2F2ZWRhdGEgPSBOb25lCisgICAgICAgIHNlbGYuaXNpbmRleCA9IDAKKyAgICAgICAgc2VsZi50aXRsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5iYXNlID0gTm9uZQorICAgICAgICBzZWxmLmFuY2hvciA9IE5vbmUKKyAgICAgICAgc2VsZi5hbmNob3JsaXN0ID0gW10KKyAgICAgICAgc2VsZi5ub2ZpbGwgPSAwCisgICAgICAgIHNlbGYubGlzdF9zdGFjayA9IFtdCisKKyAgICAjIC0tLS0tLSBNZXRob2RzIHVzZWQgaW50ZXJuYWxseTsgc29tZSBtYXkgYmUgb3ZlcnJpZGRlbgorCisgICAgIyAtLS0gRm9ybWF0dGVyIGludGVyZmFjZSwgdGFraW5nIGNhcmUgb2YgJ3NhdmVkYXRhJyBtb2RlOworICAgICMgc2hvdWxkbid0IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbgorCisgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBzZWxmLnNhdmVkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zYXZlZGF0YSA9IHNlbGYuc2F2ZWRhdGEgKyBkYXRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLm5vZmlsbDoKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5hZGRfbGl0ZXJhbF9kYXRhKGRhdGEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0dGVyLmFkZF9mbG93aW5nX2RhdGEoZGF0YSkKKworICAgICMgLS0tIEhvb2tzIHRvIHNhdmUgZGF0YTsgc2hvdWxkbid0IG5lZWQgdG8gYmUgb3ZlcnJpZGRlbgorCisgICAgZGVmIHNhdmVfYmduKHNlbGYpOgorICAgICAgICAiIiJCZWdpbnMgc2F2aW5nIGNoYXJhY3RlciBkYXRhIGluIGEgYnVmZmVyIGluc3RlYWQgb2Ygc2VuZGluZyBpdAorICAgICAgICB0byB0aGUgZm9ybWF0dGVyIG9iamVjdC4KKworICAgICAgICBSZXRyaWV2ZSB0aGUgc3RvcmVkIGRhdGEgdmlhIHRoZSBzYXZlX2VuZCgpIG1ldGhvZC4gIFVzZSBvZiB0aGUKKyAgICAgICAgc2F2ZV9iZ24oKSAvIHNhdmVfZW5kKCkgcGFpciBtYXkgbm90IGJlIG5lc3RlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zYXZlZGF0YSA9ICcnCisKKyAgICBkZWYgc2F2ZV9lbmQoc2VsZik6CisgICAgICAgICIiIkVuZHMgYnVmZmVyaW5nIGNoYXJhY3RlciBkYXRhIGFuZCByZXR1cm5zIGFsbCBkYXRhIHNhdmVkIHNpbmNlCisgICAgICAgIHRoZSBwcmVjZWRpbmcgY2FsbCB0byB0aGUgc2F2ZV9iZ24oKSBtZXRob2QuCisKKyAgICAgICAgSWYgdGhlIG5vZmlsbCBmbGFnIGlzIGZhbHNlLCB3aGl0ZXNwYWNlIGlzIGNvbGxhcHNlZCB0byBzaW5nbGUKKyAgICAgICAgc3BhY2VzLiAgQSBjYWxsIHRvIHRoaXMgbWV0aG9kIHdpdGhvdXQgYSBwcmVjZWRpbmcgY2FsbCB0byB0aGUKKyAgICAgICAgc2F2ZV9iZ24oKSBtZXRob2Qgd2lsbCByYWlzZSBhIFR5cGVFcnJvciBleGNlcHRpb24uCisKKyAgICAgICAgIiIiCisgICAgICAgIGRhdGEgPSBzZWxmLnNhdmVkYXRhCisgICAgICAgIHNlbGYuc2F2ZWRhdGEgPSBOb25lCisgICAgICAgIGlmIG5vdCBzZWxmLm5vZmlsbDoKKyAgICAgICAgICAgIGRhdGEgPSAnICcuam9pbihkYXRhLnNwbGl0KCkpCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICAjIC0tLSBIb29rcyBmb3IgYW5jaG9yczsgc2hvdWxkIHByb2JhYmx5IGJlIG92ZXJyaWRkZW4KKworICAgIGRlZiBhbmNob3JfYmduKHNlbGYsIGhyZWYsIG5hbWUsIHR5cGUpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIGFuY2hvciByZWdpb24uCisKKyAgICAgICAgVGhlIGFyZ3VtZW50cyBjb3JyZXNwb25kIHRvIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSA8QT4gdGFnIHdpdGgKKyAgICAgICAgdGhlIHNhbWUgbmFtZXMuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBtYWludGFpbnMgYSBsaXN0IG9mCisgICAgICAgIGh5cGVybGlua3MgKGRlZmluZWQgYnkgdGhlIEhSRUYgYXR0cmlidXRlIGZvciA8QT4gdGFncykgd2l0aGluCisgICAgICAgIHRoZSBkb2N1bWVudC4gIFRoZSBsaXN0IG9mIGh5cGVybGlua3MgaXMgYXZhaWxhYmxlIGFzIHRoZSBkYXRhCisgICAgICAgIGF0dHJpYnV0ZSBhbmNob3JsaXN0LgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFuY2hvciA9IGhyZWYKKyAgICAgICAgaWYgc2VsZi5hbmNob3I6CisgICAgICAgICAgICBzZWxmLmFuY2hvcmxpc3QuYXBwZW5kKGhyZWYpCisKKyAgICBkZWYgYW5jaG9yX2VuZChzZWxmKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgYW4gYW5jaG9yIHJlZ2lvbi4KKworICAgICAgICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhZGRzIGEgdGV4dHVhbCBmb290bm90ZSBtYXJrZXIgdXNpbmcgYW4KKyAgICAgICAgaW5kZXggaW50byB0aGUgbGlzdCBvZiBoeXBlcmxpbmtzIGNyZWF0ZWQgYnkgdGhlIGFuY2hvcl9iZ24oKW1ldGhvZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5hbmNob3I6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKCJbJWRdIiAlIGxlbihzZWxmLmFuY2hvcmxpc3QpKQorICAgICAgICAgICAgc2VsZi5hbmNob3IgPSBOb25lCisKKyAgICAjIC0tLSBIb29rIGZvciBpbWFnZXM7IHNob3VsZCBwcm9iYWJseSBiZSBvdmVycmlkZGVuCisKKyAgICBkZWYgaGFuZGxlX2ltYWdlKHNlbGYsIHNyYywgYWx0LCAqYXJncyk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBoYW5kbGUgaW1hZ2VzLgorCisgICAgICAgIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBwYXNzZXMgdGhlIGFsdCB2YWx1ZSB0byB0aGUKKyAgICAgICAgaGFuZGxlX2RhdGEoKSBtZXRob2QuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoYWx0KQorCisgICAgIyAtLS0tLS0tLS0gVG9wIGxldmVsIGVsZW1lbXRzCisKKyAgICBkZWYgc3RhcnRfaHRtbChzZWxmLCBhdHRycyk6IHBhc3MKKyAgICBkZWYgZW5kX2h0bWwoc2VsZik6IHBhc3MKKworICAgIGRlZiBzdGFydF9oZWFkKHNlbGYsIGF0dHJzKTogcGFzcworICAgIGRlZiBlbmRfaGVhZChzZWxmKTogcGFzcworCisgICAgZGVmIHN0YXJ0X2JvZHkoc2VsZiwgYXR0cnMpOiBwYXNzCisgICAgZGVmIGVuZF9ib2R5KHNlbGYpOiBwYXNzCisKKyAgICAjIC0tLS0tLSBIZWFkIGVsZW1lbnRzCisKKyAgICBkZWYgc3RhcnRfdGl0bGUoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLnNhdmVfYmduKCkKKworICAgIGRlZiBlbmRfdGl0bGUoc2VsZik6CisgICAgICAgIHNlbGYudGl0bGUgPSBzZWxmLnNhdmVfZW5kKCkKKworICAgIGRlZiBkb19iYXNlKHNlbGYsIGF0dHJzKToKKyAgICAgICAgZm9yIGEsIHYgaW4gYXR0cnM6CisgICAgICAgICAgICBpZiBhID09ICdocmVmJzoKKyAgICAgICAgICAgICAgICBzZWxmLmJhc2UgPSB2CisKKyAgICBkZWYgZG9faXNpbmRleChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuaXNpbmRleCA9IDEKKworICAgIGRlZiBkb19saW5rKHNlbGYsIGF0dHJzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGRvX21ldGEoc2VsZiwgYXR0cnMpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZG9fbmV4dGlkKHNlbGYsIGF0dHJzKTogIyBEZXByZWNhdGVkCisgICAgICAgIHBhc3MKKworICAgICMgLS0tLS0tIEJvZHkgZWxlbWVudHMKKworICAgICMgLS0tIEhlYWRpbmdzCisKKyAgICBkZWYgc3RhcnRfaDEoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfZm9udCgoJ2gxJywgMCwgMSwgMCkpCisKKyAgICBkZWYgZW5kX2gxKHNlbGYpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKworICAgIGRlZiBzdGFydF9oMihzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KCgnaDInLCAwLCAxLCAwKSkKKworICAgIGRlZiBlbmRfaDIoc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgZGVmIHN0YXJ0X2gzKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKCdoMycsIDAsIDEsIDApKQorCisgICAgZGVmIGVuZF9oMyhzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfZm9udCgpCisKKyAgICBkZWYgc3RhcnRfaDQoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfZm9udCgoJ2g0JywgMCwgMSwgMCkpCisKKyAgICBkZWYgZW5kX2g0KHNlbGYpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9mb250KCkKKworICAgIGRlZiBzdGFydF9oNShzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KCgnaDUnLCAwLCAxLCAwKSkKKworICAgIGRlZiBlbmRfaDUoc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgZGVmIHN0YXJ0X2g2KHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKCdoNicsIDAsIDEsIDApKQorCisgICAgZGVmIGVuZF9oNihzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfZm9udCgpCisKKyAgICAjIC0tLSBCbG9jayBTdHJ1Y3R1cmluZyBFbGVtZW50cworCisgICAgZGVmIGRvX3Aoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisKKyAgICBkZWYgc3RhcnRfcHJlKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKEFTX0lTLCBBU19JUywgQVNfSVMsIDEpKQorICAgICAgICBzZWxmLm5vZmlsbCA9IHNlbGYubm9maWxsICsgMQorCisgICAgZGVmIGVuZF9wcmUoc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMSkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorICAgICAgICBzZWxmLm5vZmlsbCA9IG1heCgwLCBzZWxmLm5vZmlsbCAtIDEpCisKKyAgICBkZWYgc3RhcnRfeG1wKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5zdGFydF9wcmUoYXR0cnMpCisgICAgICAgIHNlbGYuc2V0bGl0ZXJhbCgneG1wJykgIyBUZWxsIFNHTUwgcGFyc2VyCisKKyAgICBkZWYgZW5kX3htcChzZWxmKToKKyAgICAgICAgc2VsZi5lbmRfcHJlKCkKKworICAgIGRlZiBzdGFydF9saXN0aW5nKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5zdGFydF9wcmUoYXR0cnMpCisgICAgICAgIHNlbGYuc2V0bGl0ZXJhbCgnbGlzdGluZycpICMgVGVsbCBTR01MIHBhcnNlcgorCisgICAgZGVmIGVuZF9saXN0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmVuZF9wcmUoKQorCisgICAgZGVmIHN0YXJ0X2FkZHJlc3Moc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDApCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfZm9udCgoQVNfSVMsIDEsIEFTX0lTLCBBU19JUykpCisKKyAgICBkZWYgZW5kX2FkZHJlc3Moc2VsZik6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMCkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgZGVmIHN0YXJ0X2Jsb2NrcXVvdGUoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5lbmRfcGFyYWdyYXBoKDEpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfbWFyZ2luKCdibG9ja3F1b3RlJykKKworICAgIGRlZiBlbmRfYmxvY2txdW90ZShzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfbWFyZ2luKCkKKworICAgICMgLS0tIExpc3QgRWxlbWVudHMKKworICAgIGRlZiBzdGFydF91bChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgobm90IHNlbGYubGlzdF9zdGFjaykKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9tYXJnaW4oJ3VsJykKKyAgICAgICAgc2VsZi5saXN0X3N0YWNrLmFwcGVuZChbJ3VsJywgJyonLCAwXSkKKworICAgIGRlZiBlbmRfdWwoc2VsZik6CisgICAgICAgIGlmIHNlbGYubGlzdF9zdGFjazogZGVsIHNlbGYubGlzdF9zdGFja1stMV0KKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaChub3Qgc2VsZi5saXN0X3N0YWNrKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfbWFyZ2luKCkKKworICAgIGRlZiBkb19saShzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgoMCkKKyAgICAgICAgaWYgc2VsZi5saXN0X3N0YWNrOgorICAgICAgICAgICAgW2R1bW15LCBsYWJlbCwgY291bnRlcl0gPSB0b3AgPSBzZWxmLmxpc3Rfc3RhY2tbLTFdCisgICAgICAgICAgICB0b3BbMl0gPSBjb3VudGVyID0gY291bnRlcisxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsYWJlbCwgY291bnRlciA9ICcqJywgMAorICAgICAgICBzZWxmLmZvcm1hdHRlci5hZGRfbGFiZWxfZGF0YShsYWJlbCwgY291bnRlcikKKworICAgIGRlZiBzdGFydF9vbChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmVuZF9wYXJhZ3JhcGgobm90IHNlbGYubGlzdF9zdGFjaykKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9tYXJnaW4oJ29sJykKKyAgICAgICAgbGFiZWwgPSAnMS4nCisgICAgICAgIGZvciBhLCB2IGluIGF0dHJzOgorICAgICAgICAgICAgaWYgYSA9PSAndHlwZSc6CisgICAgICAgICAgICAgICAgaWYgbGVuKHYpID09IDE6IHYgPSB2ICsgJy4nCisgICAgICAgICAgICAgICAgbGFiZWwgPSB2CisgICAgICAgIHNlbGYubGlzdF9zdGFjay5hcHBlbmQoWydvbCcsIGxhYmVsLCAwXSkKKworICAgIGRlZiBlbmRfb2woc2VsZik6CisgICAgICAgIGlmIHNlbGYubGlzdF9zdGFjazogZGVsIHNlbGYubGlzdF9zdGFja1stMV0KKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaChub3Qgc2VsZi5saXN0X3N0YWNrKQorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfbWFyZ2luKCkKKworICAgIGRlZiBzdGFydF9tZW51KHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5zdGFydF91bChhdHRycykKKworICAgIGRlZiBlbmRfbWVudShzZWxmKToKKyAgICAgICAgc2VsZi5lbmRfdWwoKQorCisgICAgZGVmIHN0YXJ0X2RpcihzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuc3RhcnRfdWwoYXR0cnMpCisKKyAgICBkZWYgZW5kX2RpcihzZWxmKToKKyAgICAgICAgc2VsZi5lbmRfdWwoKQorCisgICAgZGVmIHN0YXJ0X2RsKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaCgxKQorICAgICAgICBzZWxmLmxpc3Rfc3RhY2suYXBwZW5kKFsnZGwnLCAnJywgMF0pCisKKyAgICBkZWYgZW5kX2RsKHNlbGYpOgorICAgICAgICBzZWxmLmRkcG9wKDEpCisgICAgICAgIGlmIHNlbGYubGlzdF9zdGFjazogZGVsIHNlbGYubGlzdF9zdGFja1stMV0KKworICAgIGRlZiBkb19kdChzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZGRwb3AoKQorCisgICAgZGVmIGRvX2RkKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5kZHBvcCgpCisgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfbWFyZ2luKCdkZCcpCisgICAgICAgIHNlbGYubGlzdF9zdGFjay5hcHBlbmQoWydkZCcsICcnLCAwXSkKKworICAgIGRlZiBkZHBvcChzZWxmLCBibD0wKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuZW5kX3BhcmFncmFwaChibCkKKyAgICAgICAgaWYgc2VsZi5saXN0X3N0YWNrOgorICAgICAgICAgICAgaWYgc2VsZi5saXN0X3N0YWNrWy0xXVswXSA9PSAnZGQnOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmxpc3Rfc3RhY2tbLTFdCisgICAgICAgICAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX21hcmdpbigpCisKKyAgICAjIC0tLSBQaHJhc2UgTWFya3VwCisKKyAgICAjIElkaW9tYXRpYyBFbGVtZW50cworCisgICAgZGVmIHN0YXJ0X2NpdGUoc2VsZiwgYXR0cnMpOiBzZWxmLnN0YXJ0X2koYXR0cnMpCisgICAgZGVmIGVuZF9jaXRlKHNlbGYpOiBzZWxmLmVuZF9pKCkKKworICAgIGRlZiBzdGFydF9jb2RlKHNlbGYsIGF0dHJzKTogc2VsZi5zdGFydF90dChhdHRycykKKyAgICBkZWYgZW5kX2NvZGUoc2VsZik6IHNlbGYuZW5kX3R0KCkKKworICAgIGRlZiBzdGFydF9lbShzZWxmLCBhdHRycyk6IHNlbGYuc3RhcnRfaShhdHRycykKKyAgICBkZWYgZW5kX2VtKHNlbGYpOiBzZWxmLmVuZF9pKCkKKworICAgIGRlZiBzdGFydF9rYmQoc2VsZiwgYXR0cnMpOiBzZWxmLnN0YXJ0X3R0KGF0dHJzKQorICAgIGRlZiBlbmRfa2JkKHNlbGYpOiBzZWxmLmVuZF90dCgpCisKKyAgICBkZWYgc3RhcnRfc2FtcChzZWxmLCBhdHRycyk6IHNlbGYuc3RhcnRfdHQoYXR0cnMpCisgICAgZGVmIGVuZF9zYW1wKHNlbGYpOiBzZWxmLmVuZF90dCgpCisKKyAgICBkZWYgc3RhcnRfc3Ryb25nKHNlbGYsIGF0dHJzKTogc2VsZi5zdGFydF9iKGF0dHJzKQorICAgIGRlZiBlbmRfc3Ryb25nKHNlbGYpOiBzZWxmLmVuZF9iKCkKKworICAgIGRlZiBzdGFydF92YXIoc2VsZiwgYXR0cnMpOiBzZWxmLnN0YXJ0X2koYXR0cnMpCisgICAgZGVmIGVuZF92YXIoc2VsZik6IHNlbGYuZW5kX2koKQorCisgICAgIyBUeXBvZ3JhcGhpYyBFbGVtZW50cworCisgICAgZGVmIHN0YXJ0X2koc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKEFTX0lTLCAxLCBBU19JUywgQVNfSVMpKQorICAgIGRlZiBlbmRfaShzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgZGVmIHN0YXJ0X2Ioc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5wdXNoX2ZvbnQoKEFTX0lTLCBBU19JUywgMSwgQVNfSVMpKQorICAgIGRlZiBlbmRfYihzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucG9wX2ZvbnQoKQorCisgICAgZGVmIHN0YXJ0X3R0KHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIucHVzaF9mb250KChBU19JUywgQVNfSVMsIEFTX0lTLCAxKSkKKyAgICBkZWYgZW5kX3R0KHNlbGYpOgorICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3BfZm9udCgpCisKKyAgICBkZWYgc3RhcnRfYShzZWxmLCBhdHRycyk6CisgICAgICAgIGhyZWYgPSAnJworICAgICAgICBuYW1lID0gJycKKyAgICAgICAgdHlwZSA9ICcnCisgICAgICAgIGZvciBhdHRybmFtZSwgdmFsdWUgaW4gYXR0cnM6CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lID09ICdocmVmJzoKKyAgICAgICAgICAgICAgICBocmVmID0gdmFsdWUKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lID09ICduYW1lJzoKKyAgICAgICAgICAgICAgICBuYW1lID0gdmFsdWUKKyAgICAgICAgICAgIGlmIGF0dHJuYW1lID09ICd0eXBlJzoKKyAgICAgICAgICAgICAgICB0eXBlID0gdmFsdWUubG93ZXIoKQorICAgICAgICBzZWxmLmFuY2hvcl9iZ24oaHJlZiwgbmFtZSwgdHlwZSkKKworICAgIGRlZiBlbmRfYShzZWxmKToKKyAgICAgICAgc2VsZi5hbmNob3JfZW5kKCkKKworICAgICMgLS0tIExpbmUgQnJlYWsKKworICAgIGRlZiBkb19icihzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuZm9ybWF0dGVyLmFkZF9saW5lX2JyZWFrKCkKKworICAgICMgLS0tIEhvcml6b250YWwgUnVsZQorCisgICAgZGVmIGRvX2hyKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuYWRkX2hvcl9ydWxlKCkKKworICAgICMgLS0tIEltYWdlCisKKyAgICBkZWYgZG9faW1nKHNlbGYsIGF0dHJzKToKKyAgICAgICAgYWxpZ24gPSAnJworICAgICAgICBhbHQgPSAnKGltYWdlKScKKyAgICAgICAgaXNtYXAgPSAnJworICAgICAgICBzcmMgPSAnJworICAgICAgICB3aWR0aCA9IDAKKyAgICAgICAgaGVpZ2h0ID0gMAorICAgICAgICBmb3IgYXR0cm5hbWUsIHZhbHVlIGluIGF0dHJzOgorICAgICAgICAgICAgaWYgYXR0cm5hbWUgPT0gJ2FsaWduJzoKKyAgICAgICAgICAgICAgICBhbGlnbiA9IHZhbHVlCisgICAgICAgICAgICBpZiBhdHRybmFtZSA9PSAnYWx0JzoKKyAgICAgICAgICAgICAgICBhbHQgPSB2YWx1ZQorICAgICAgICAgICAgaWYgYXR0cm5hbWUgPT0gJ2lzbWFwJzoKKyAgICAgICAgICAgICAgICBpc21hcCA9IHZhbHVlCisgICAgICAgICAgICBpZiBhdHRybmFtZSA9PSAnc3JjJzoKKyAgICAgICAgICAgICAgICBzcmMgPSB2YWx1ZQorICAgICAgICAgICAgaWYgYXR0cm5hbWUgPT0gJ3dpZHRoJzoKKyAgICAgICAgICAgICAgICB0cnk6IHdpZHRoID0gaW50KHZhbHVlKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgICAgICBpZiBhdHRybmFtZSA9PSAnaGVpZ2h0JzoKKyAgICAgICAgICAgICAgICB0cnk6IGhlaWdodCA9IGludCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBzZWxmLmhhbmRsZV9pbWFnZShzcmMsIGFsdCwgaXNtYXAsIGFsaWduLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyAtLS0gUmVhbGx5IE9sZCBVbm9mZmljaWFsIERlcHJlY2F0ZWQgU3R1ZmYKKworICAgIGRlZiBkb19wbGFpbnRleHQoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLnN0YXJ0X3ByZShhdHRycykKKyAgICAgICAgc2VsZi5zZXRub21vcmV0YWdzKCkgIyBUZWxsIFNHTUwgcGFyc2VyCisKKyAgICAjIC0tLSBVbmhhbmRsZWQgdGFncworCisgICAgZGVmIHVua25vd25fc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB1bmtub3duX2VuZHRhZyhzZWxmLCB0YWcpOgorICAgICAgICBwYXNzCisKKworZGVmIHRlc3QoYXJncyA9IE5vbmUpOgorICAgIGltcG9ydCBzeXMsIGZvcm1hdHRlcgorCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKworICAgIHNpbGVudCA9IGFyZ3MgYW5kIGFyZ3NbMF0gPT0gJy1zJworICAgIGlmIHNpbGVudDoKKyAgICAgICAgZGVsIGFyZ3NbMF0KKworICAgIGlmIGFyZ3M6CisgICAgICAgIGZpbGUgPSBhcmdzWzBdCisgICAgZWxzZToKKyAgICAgICAgZmlsZSA9ICd0ZXN0Lmh0bWwnCisKKyAgICBpZiBmaWxlID09ICctJzoKKyAgICAgICAgZiA9IHN5cy5zdGRpbgorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGUsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50IGZpbGUsICI6IiwgbXNnCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgZGF0YSA9IGYucmVhZCgpCisKKyAgICBpZiBmIGlzIG5vdCBzeXMuc3RkaW46CisgICAgICAgIGYuY2xvc2UoKQorCisgICAgaWYgc2lsZW50OgorICAgICAgICBmID0gZm9ybWF0dGVyLk51bGxGb3JtYXR0ZXIoKQorICAgIGVsc2U6CisgICAgICAgIGYgPSBmb3JtYXR0ZXIuQWJzdHJhY3RGb3JtYXR0ZXIoZm9ybWF0dGVyLkR1bWJXcml0ZXIoKSkKKworICAgIHAgPSBIVE1MUGFyc2VyKGYpCisgICAgcC5mZWVkKGRhdGEpCisgICAgcC5jbG9zZSgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaHRtbGxpYi5weWMgYi9saWIvcHl0aG9uMi43L2h0bWxsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZGZlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0bWxsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaHRtbGxpYi5weW8gYi9saWIvcHl0aG9uMi43L2h0bWxsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZGZlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2h0bWxsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaHR0cGxpYi5weSBiL2xpYi9weXRob24yLjcvaHR0cGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzkxOWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9odHRwbGliLnB5CkBAIC0wLDAgKzEsMTM0MiBAQAorciIiIkhUVFAvMS4xIGNsaWVudCBsaWJyYXJ5CisKKzxpbnRybyBzdHVmZiBnb2VzIGhlcmU+Cis8b3RoZXIgc3R1ZmYsIHRvbz4KKworSFRUUENvbm5lY3Rpb24gZ29lcyB0aHJvdWdoIGEgbnVtYmVyIG9mICJzdGF0ZXMiLCB3aGljaCBkZWZpbmUgd2hlbiBhIGNsaWVudAorbWF5IGxlZ2FsbHkgbWFrZSBhbm90aGVyIHJlcXVlc3Qgb3IgZmV0Y2ggdGhlIHJlc3BvbnNlIGZvciBhIHBhcnRpY3VsYXIKK3JlcXVlc3QuIFRoaXMgZGlhZ3JhbSBkZXRhaWxzIHRoZXNlIHN0YXRlIHRyYW5zaXRpb25zOgorCisgICAgKG51bGwpCisgICAgICB8CisgICAgICB8IEhUVFBDb25uZWN0aW9uKCkKKyAgICAgIHYKKyAgICBJZGxlCisgICAgICB8CisgICAgICB8IHB1dHJlcXVlc3QoKQorICAgICAgdgorICAgIFJlcXVlc3Qtc3RhcnRlZAorICAgICAgfAorICAgICAgfCAoIHB1dGhlYWRlcigpICkqICBlbmRoZWFkZXJzKCkKKyAgICAgIHYKKyAgICBSZXF1ZXN0LXNlbnQKKyAgICAgIHwKKyAgICAgIHwgcmVzcG9uc2UgPSBnZXRyZXNwb25zZSgpCisgICAgICB2CisgICAgVW5yZWFkLXJlc3BvbnNlICAgW1Jlc3BvbnNlLWhlYWRlcnMtcmVhZF0KKyAgICAgIHxcX19fX19fX19fX19fX19fX19fX18KKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICB8CisgICAgICB8IHJlc3BvbnNlLnJlYWQoKSAgICAgfCBwdXRyZXF1ZXN0KCkKKyAgICAgIHYgICAgICAgICAgICAgICAgICAgICB2CisgICAgSWRsZSAgICAgICAgICAgICAgICAgIFJlcS1zdGFydGVkLXVucmVhZC1yZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgX19fX19fL3wKKyAgICAgICAgICAgICAgICAgICAvICAgICAgICB8CisgICByZXNwb25zZS5yZWFkKCkgfCAgICAgICAgfCAoIHB1dGhlYWRlcigpICkqICBlbmRoZWFkZXJzKCkKKyAgICAgICAgICAgICAgICAgICB2ICAgICAgICB2CisgICAgICAgUmVxdWVzdC1zdGFydGVkICAgIFJlcS1zZW50LXVucmVhZC1yZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlc3BvbnNlLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdC1zZW50CisKK1RoaXMgZGlhZ3JhbSBwcmVzZW50cyB0aGUgZm9sbG93aW5nIHJ1bGVzOgorICAtLSBhIHNlY29uZCByZXF1ZXN0IG1heSBub3QgYmUgc3RhcnRlZCB1bnRpbCB7cmVzcG9uc2UtaGVhZGVycy1yZWFkfQorICAtLSBhIHJlc3BvbnNlIFtvYmplY3RdIGNhbm5vdCBiZSByZXRyaWV2ZWQgdW50aWwge3JlcXVlc3Qtc2VudH0KKyAgLS0gdGhlcmUgaXMgbm8gZGlmZmVyZW50aWF0aW9uIGJldHdlZW4gYW4gdW5yZWFkIHJlc3BvbnNlIGJvZHkgYW5kIGEKKyAgICAgcGFydGlhbGx5IHJlYWQgcmVzcG9uc2UgYm9keQorCitOb3RlOiB0aGlzIGVuZm9yY2VtZW50IGlzIGFwcGxpZWQgYnkgdGhlIEhUVFBDb25uZWN0aW9uIGNsYXNzLiBUaGUKKyAgICAgIEhUVFBSZXNwb25zZSBjbGFzcyBkb2VzIG5vdCBlbmZvcmNlIHRoaXMgc3RhdGUgbWFjaGluZSwgd2hpY2gKKyAgICAgIGltcGxpZXMgc29waGlzdGljYXRlZCBjbGllbnRzIG1heSBhY2NlbGVyYXRlIHRoZSByZXF1ZXN0L3Jlc3BvbnNlCisgICAgICBwaXBlbGluZS4gQ2F1dGlvbiBzaG91bGQgYmUgdGFrZW4sIHRob3VnaDogYWNjZWxlcmF0aW5nIHRoZSBzdGF0ZXMKKyAgICAgIGJleW9uZCB0aGUgYWJvdmUgcGF0dGVybiBtYXkgaW1wbHkga25vd2xlZGdlIG9mIHRoZSBzZXJ2ZXIncworICAgICAgY29ubmVjdGlvbi1jbG9zZSBiZWhhdmlvciBmb3IgY2VydGFpbiByZXF1ZXN0cy4gRm9yIGV4YW1wbGUsIGl0CisgICAgICBpcyBpbXBvc3NpYmxlIHRvIHRlbGwgd2hldGhlciB0aGUgc2VydmVyIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgIFVOVElMIHRoZSByZXNwb25zZSBoZWFkZXJzIGhhdmUgYmVlbiByZWFkOyB0aGlzIG1lYW5zIHRoYXQgZnVydGhlcgorICAgICAgcmVxdWVzdHMgY2Fubm90IGJlIHBsYWNlZCBpbnRvIHRoZSBwaXBlbGluZSB1bnRpbCBpdCBpcyBrbm93biB0aGF0CisgICAgICB0aGUgc2VydmVyIHdpbGwgTk9UIGJlIGNsb3NpbmcgdGhlIGNvbm5lY3Rpb24uCisKK0xvZ2ljYWwgU3RhdGUgICAgICAgICAgICAgICAgICBfX3N0YXRlICAgICAgICAgICAgX19yZXNwb25zZQorLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAgIC0tLS0tLS0gICAgICAgICAgICAtLS0tLS0tLS0tCitJZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NTX0lETEUgICAgICAgICAgIE5vbmUKK1JlcXVlc3Qtc3RhcnRlZCAgICAgICAgICAgICAgICBfQ1NfUkVRX1NUQVJURUQgICAgTm9uZQorUmVxdWVzdC1zZW50ICAgICAgICAgICAgICAgICAgIF9DU19SRVFfU0VOVCAgICAgICBOb25lCitVbnJlYWQtcmVzcG9uc2UgICAgICAgICAgICAgICAgX0NTX0lETEUgICAgICAgICAgIDxyZXNwb25zZV9jbGFzcz4KK1JlcS1zdGFydGVkLXVucmVhZC1yZXNwb25zZSAgICBfQ1NfUkVRX1NUQVJURUQgICAgPHJlc3BvbnNlX2NsYXNzPgorUmVxLXNlbnQtdW5yZWFkLXJlc3BvbnNlICAgICAgIF9DU19SRVFfU0VOVCAgICAgICA8cmVzcG9uc2VfY2xhc3M+CisiIiIKKworZnJvbSBhcnJheSBpbXBvcnQgYXJyYXkKK2ltcG9ydCBvcworaW1wb3J0IHNvY2tldAorZnJvbSBzeXMgaW1wb3J0IHB5M2t3YXJuaW5nCitmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxzcGxpdAoraW1wb3J0IHdhcm5pbmdzCit3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgaWYgcHkza3dhcm5pbmc6CisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLiptaW1ldG9vbHMgaGFzIGJlZW4gcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICBpbXBvcnQgbWltZXRvb2xzCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitfX2FsbF9fID0gWyJIVFRQIiwgIkhUVFBSZXNwb25zZSIsICJIVFRQQ29ubmVjdGlvbiIsCisgICAgICAgICAgICJIVFRQRXhjZXB0aW9uIiwgIk5vdENvbm5lY3RlZCIsICJVbmtub3duUHJvdG9jb2wiLAorICAgICAgICAgICAiVW5rbm93blRyYW5zZmVyRW5jb2RpbmciLCAiVW5pbXBsZW1lbnRlZEZpbGVNb2RlIiwKKyAgICAgICAgICAgIkluY29tcGxldGVSZWFkIiwgIkludmFsaWRVUkwiLCAiSW1wcm9wZXJDb25uZWN0aW9uU3RhdGUiLAorICAgICAgICAgICAiQ2Fubm90U2VuZFJlcXVlc3QiLCAiQ2Fubm90U2VuZEhlYWRlciIsICJSZXNwb25zZU5vdFJlYWR5IiwKKyAgICAgICAgICAgIkJhZFN0YXR1c0xpbmUiLCAiZXJyb3IiLCAicmVzcG9uc2VzIl0KKworSFRUUF9QT1JUID0gODAKK0hUVFBTX1BPUlQgPSA0NDMKKworX1VOS05PV04gPSAnVU5LTk9XTicKKworIyBjb25uZWN0aW9uIHN0YXRlcworX0NTX0lETEUgPSAnSWRsZScKK19DU19SRVFfU1RBUlRFRCA9ICdSZXF1ZXN0LXN0YXJ0ZWQnCitfQ1NfUkVRX1NFTlQgPSAnUmVxdWVzdC1zZW50JworCisjIHN0YXR1cyBjb2RlcworIyBpbmZvcm1hdGlvbmFsCitDT05USU5VRSA9IDEwMAorU1dJVENISU5HX1BST1RPQ09MUyA9IDEwMQorUFJPQ0VTU0lORyA9IDEwMgorCisjIHN1Y2Nlc3NmdWwKK09LID0gMjAwCitDUkVBVEVEID0gMjAxCitBQ0NFUFRFRCA9IDIwMgorTk9OX0FVVEhPUklUQVRJVkVfSU5GT1JNQVRJT04gPSAyMDMKK05PX0NPTlRFTlQgPSAyMDQKK1JFU0VUX0NPTlRFTlQgPSAyMDUKK1BBUlRJQUxfQ09OVEVOVCA9IDIwNgorTVVMVElfU1RBVFVTID0gMjA3CitJTV9VU0VEID0gMjI2CisKKyMgcmVkaXJlY3Rpb24KK01VTFRJUExFX0NIT0lDRVMgPSAzMDAKK01PVkVEX1BFUk1BTkVOVExZID0gMzAxCitGT1VORCA9IDMwMgorU0VFX09USEVSID0gMzAzCitOT1RfTU9ESUZJRUQgPSAzMDQKK1VTRV9QUk9YWSA9IDMwNQorVEVNUE9SQVJZX1JFRElSRUNUID0gMzA3CisKKyMgY2xpZW50IGVycm9yCitCQURfUkVRVUVTVCA9IDQwMAorVU5BVVRIT1JJWkVEID0gNDAxCitQQVlNRU5UX1JFUVVJUkVEID0gNDAyCitGT1JCSURERU4gPSA0MDMKK05PVF9GT1VORCA9IDQwNAorTUVUSE9EX05PVF9BTExPV0VEID0gNDA1CitOT1RfQUNDRVBUQUJMRSA9IDQwNgorUFJPWFlfQVVUSEVOVElDQVRJT05fUkVRVUlSRUQgPSA0MDcKK1JFUVVFU1RfVElNRU9VVCA9IDQwOAorQ09ORkxJQ1QgPSA0MDkKK0dPTkUgPSA0MTAKK0xFTkdUSF9SRVFVSVJFRCA9IDQxMQorUFJFQ09ORElUSU9OX0ZBSUxFRCA9IDQxMgorUkVRVUVTVF9FTlRJVFlfVE9PX0xBUkdFID0gNDEzCitSRVFVRVNUX1VSSV9UT09fTE9ORyA9IDQxNAorVU5TVVBQT1JURURfTUVESUFfVFlQRSA9IDQxNQorUkVRVUVTVEVEX1JBTkdFX05PVF9TQVRJU0ZJQUJMRSA9IDQxNgorRVhQRUNUQVRJT05fRkFJTEVEID0gNDE3CitVTlBST0NFU1NBQkxFX0VOVElUWSA9IDQyMgorTE9DS0VEID0gNDIzCitGQUlMRURfREVQRU5ERU5DWSA9IDQyNAorVVBHUkFERV9SRVFVSVJFRCA9IDQyNgorCisjIHNlcnZlciBlcnJvcgorSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gNTAwCitOT1RfSU1QTEVNRU5URUQgPSA1MDEKK0JBRF9HQVRFV0FZID0gNTAyCitTRVJWSUNFX1VOQVZBSUxBQkxFID0gNTAzCitHQVRFV0FZX1RJTUVPVVQgPSA1MDQKK0hUVFBfVkVSU0lPTl9OT1RfU1VQUE9SVEVEID0gNTA1CitJTlNVRkZJQ0lFTlRfU1RPUkFHRSA9IDUwNworTk9UX0VYVEVOREVEID0gNTEwCisKKyMgTWFwcGluZyBzdGF0dXMgY29kZXMgdG8gb2ZmaWNpYWwgVzNDIG5hbWVzCityZXNwb25zZXMgPSB7CisgICAgMTAwOiAnQ29udGludWUnLAorICAgIDEwMTogJ1N3aXRjaGluZyBQcm90b2NvbHMnLAorCisgICAgMjAwOiAnT0snLAorICAgIDIwMTogJ0NyZWF0ZWQnLAorICAgIDIwMjogJ0FjY2VwdGVkJywKKyAgICAyMDM6ICdOb24tQXV0aG9yaXRhdGl2ZSBJbmZvcm1hdGlvbicsCisgICAgMjA0OiAnTm8gQ29udGVudCcsCisgICAgMjA1OiAnUmVzZXQgQ29udGVudCcsCisgICAgMjA2OiAnUGFydGlhbCBDb250ZW50JywKKworICAgIDMwMDogJ011bHRpcGxlIENob2ljZXMnLAorICAgIDMwMTogJ01vdmVkIFBlcm1hbmVudGx5JywKKyAgICAzMDI6ICdGb3VuZCcsCisgICAgMzAzOiAnU2VlIE90aGVyJywKKyAgICAzMDQ6ICdOb3QgTW9kaWZpZWQnLAorICAgIDMwNTogJ1VzZSBQcm94eScsCisgICAgMzA2OiAnKFVudXNlZCknLAorICAgIDMwNzogJ1RlbXBvcmFyeSBSZWRpcmVjdCcsCisKKyAgICA0MDA6ICdCYWQgUmVxdWVzdCcsCisgICAgNDAxOiAnVW5hdXRob3JpemVkJywKKyAgICA0MDI6ICdQYXltZW50IFJlcXVpcmVkJywKKyAgICA0MDM6ICdGb3JiaWRkZW4nLAorICAgIDQwNDogJ05vdCBGb3VuZCcsCisgICAgNDA1OiAnTWV0aG9kIE5vdCBBbGxvd2VkJywKKyAgICA0MDY6ICdOb3QgQWNjZXB0YWJsZScsCisgICAgNDA3OiAnUHJveHkgQXV0aGVudGljYXRpb24gUmVxdWlyZWQnLAorICAgIDQwODogJ1JlcXVlc3QgVGltZW91dCcsCisgICAgNDA5OiAnQ29uZmxpY3QnLAorICAgIDQxMDogJ0dvbmUnLAorICAgIDQxMTogJ0xlbmd0aCBSZXF1aXJlZCcsCisgICAgNDEyOiAnUHJlY29uZGl0aW9uIEZhaWxlZCcsCisgICAgNDEzOiAnUmVxdWVzdCBFbnRpdHkgVG9vIExhcmdlJywKKyAgICA0MTQ6ICdSZXF1ZXN0LVVSSSBUb28gTG9uZycsCisgICAgNDE1OiAnVW5zdXBwb3J0ZWQgTWVkaWEgVHlwZScsCisgICAgNDE2OiAnUmVxdWVzdGVkIFJhbmdlIE5vdCBTYXRpc2ZpYWJsZScsCisgICAgNDE3OiAnRXhwZWN0YXRpb24gRmFpbGVkJywKKworICAgIDUwMDogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsCisgICAgNTAxOiAnTm90IEltcGxlbWVudGVkJywKKyAgICA1MDI6ICdCYWQgR2F0ZXdheScsCisgICAgNTAzOiAnU2VydmljZSBVbmF2YWlsYWJsZScsCisgICAgNTA0OiAnR2F0ZXdheSBUaW1lb3V0JywKKyAgICA1MDU6ICdIVFRQIFZlcnNpb24gTm90IFN1cHBvcnRlZCcsCit9CisKKyMgbWF4aW1hbCBhbW91bnQgb2YgZGF0YSB0byByZWFkIGF0IG9uZSB0aW1lIGluIF9zYWZlX3JlYWQKK01BWEFNT1VOVCA9IDEwNDg1NzYKKworIyBtYXhpbWFsIGxpbmUgbGVuZ3RoIHdoZW4gY2FsbGluZyByZWFkbGluZSgpLgorX01BWExJTkUgPSA2NTUzNgorCitjbGFzcyBIVFRQTWVzc2FnZShtaW1ldG9vbHMuTWVzc2FnZSk6CisKKyAgICBkZWYgYWRkaGVhZGVyKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAiIiJBZGQgaGVhZGVyIGZvciBmaWVsZCBrZXkgaGFuZGxpbmcgcmVwZWF0cy4iIiIKKyAgICAgICAgcHJldiA9IHNlbGYuZGljdC5nZXQoa2V5KQorICAgICAgICBpZiBwcmV2IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmRpY3Rba2V5XSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb21iaW5lZCA9ICIsICIuam9pbigocHJldiwgdmFsdWUpKQorICAgICAgICAgICAgc2VsZi5kaWN0W2tleV0gPSBjb21iaW5lZAorCisgICAgZGVmIGFkZGNvbnRpbnVlKHNlbGYsIGtleSwgbW9yZSk6CisgICAgICAgICIiIkFkZCBtb3JlIGZpZWxkIGRhdGEgZnJvbSBhIGNvbnRpbnVhdGlvbiBsaW5lLiIiIgorICAgICAgICBwcmV2ID0gc2VsZi5kaWN0W2tleV0KKyAgICAgICAgc2VsZi5kaWN0W2tleV0gPSBwcmV2ICsgIlxuICIgKyBtb3JlCisKKyAgICBkZWYgcmVhZGhlYWRlcnMoc2VsZik6CisgICAgICAgICIiIlJlYWQgaGVhZGVyIGxpbmVzLgorCisgICAgICAgIFJlYWQgaGVhZGVyIGxpbmVzIHVwIHRvIHRoZSBlbnRpcmVseSBibGFuayBsaW5lIHRoYXQgdGVybWluYXRlcyB0aGVtLgorICAgICAgICBUaGUgKG5vcm1hbGx5IGJsYW5rKSBsaW5lIHRoYXQgZW5kcyB0aGUgaGVhZGVycyBpcyBza2lwcGVkLCBidXQgbm90CisgICAgICAgIGluY2x1ZGVkIGluIHRoZSByZXR1cm5lZCBsaXN0LiAgSWYgYSBub24taGVhZGVyIGxpbmUgZW5kcyB0aGUgaGVhZGVycywKKyAgICAgICAgKHdoaWNoIGlzIGFuIGVycm9yKSwgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGJhY2tzcGFjZSBvdmVyIGl0OyBpdCBpcworICAgICAgICBuZXZlciBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgbGlzdC4KKworICAgICAgICBUaGUgdmFyaWFibGUgc2VsZi5zdGF0dXMgaXMgc2V0IHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgYWxsIHdlbnQgd2VsbCwKKyAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGFuIGVycm9yIG1lc3NhZ2UuICBUaGUgdmFyaWFibGUgc2VsZi5oZWFkZXJzIGlzIGEKKyAgICAgICAgY29tcGxldGVseSB1bmludGVycHJldGVkIGxpc3Qgb2YgbGluZXMgY29udGFpbmVkIGluIHRoZSBoZWFkZXIgKHNvCisgICAgICAgIHByaW50aW5nIHRoZW0gd2lsbCByZXByb2R1Y2UgdGhlIGhlYWRlciBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gdGhlCisgICAgICAgIGZpbGUpLgorCisgICAgICAgIElmIG11bHRpcGxlIGhlYWRlciBmaWVsZHMgd2l0aCB0aGUgc2FtZSBuYW1lIG9jY3VyLCB0aGV5IGFyZSBjb21iaW5lZAorICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGluIFJGQyAyNjE2IHNlYyA0LjI6CisKKyAgICAgICAgQXBwZW5kaW5nIGVhY2ggc3Vic2VxdWVudCBmaWVsZC12YWx1ZSB0byB0aGUgZmlyc3QsIGVhY2ggc2VwYXJhdGVkCisgICAgICAgIGJ5IGEgY29tbWEuIFRoZSBvcmRlciBpbiB3aGljaCBoZWFkZXIgZmllbGRzIHdpdGggdGhlIHNhbWUgZmllbGQtbmFtZQorICAgICAgICBhcmUgcmVjZWl2ZWQgaXMgc2lnbmlmaWNhbnQgdG8gdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSBjb21iaW5lZAorICAgICAgICBmaWVsZCB2YWx1ZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYIFRoZSBpbXBsZW1lbnRhdGlvbiBvdmVycmlkZXMgdGhlIHJlYWRoZWFkZXJzKCkgbWV0aG9kIG9mCisgICAgICAgICMgcmZjODIyLk1lc3NhZ2UuICBUaGUgYmFzZSBjbGFzcyBkZXNpZ24gaXNuJ3QgYW1lbmFibGUgdG8KKyAgICAgICAgIyBjdXN0b21pemVkIGJlaGF2aW9yIGhlcmUgc28gdGhlIG1ldGhvZCBoZXJlIGlzIGEgY29weSBvZiB0aGUKKyAgICAgICAgIyBiYXNlIGNsYXNzIGNvZGUgd2l0aCBhIGZldyBzbWFsbCBjaGFuZ2VzLgorCisgICAgICAgIHNlbGYuZGljdCA9IHt9CisgICAgICAgIHNlbGYudW5peGZyb20gPSAnJworICAgICAgICBzZWxmLmhlYWRlcnMgPSBobGlzdCA9IFtdCisgICAgICAgIHNlbGYuc3RhdHVzID0gJycKKyAgICAgICAgaGVhZGVyc2VlbiA9ICIiCisgICAgICAgIGZpcnN0bGluZSA9IDEKKyAgICAgICAgc3RhcnRvZmxpbmUgPSB1bnJlYWQgPSB0ZWxsID0gTm9uZQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZnAsICd1bnJlYWQnKToKKyAgICAgICAgICAgIHVucmVhZCA9IHNlbGYuZnAudW5yZWFkCisgICAgICAgIGVsaWYgc2VsZi5zZWVrYWJsZToKKyAgICAgICAgICAgIHRlbGwgPSBzZWxmLmZwLnRlbGwKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIHRlbGw6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzdGFydG9mbGluZSA9IHRlbGwoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzdGFydG9mbGluZSA9IHRlbGwgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Vla2FibGUgPSAwCisgICAgICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZShfTUFYTElORSArIDEpCisgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBfTUFYTElORToKKyAgICAgICAgICAgICAgICByYWlzZSBMaW5lVG9vTG9uZygiaGVhZGVyIGxpbmUiKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnRU9GIGluIGhlYWRlcnMnCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgU2tpcCB1bml4IEZyb20gbmFtZSB0aW1lIGxpbmVzCisgICAgICAgICAgICBpZiBmaXJzdGxpbmUgYW5kIGxpbmUuc3RhcnRzd2l0aCgnRnJvbSAnKToKKyAgICAgICAgICAgICAgICBzZWxmLnVuaXhmcm9tID0gc2VsZi51bml4ZnJvbSArIGxpbmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmlyc3RsaW5lID0gMAorICAgICAgICAgICAgaWYgaGVhZGVyc2VlbiBhbmQgbGluZVswXSBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICAjIFhYWCBOb3Qgc3VyZSBpZiBjb250aW51YXRpb24gbGluZXMgYXJlIGhhbmRsZWQgcHJvcGVybHkKKyAgICAgICAgICAgICAgICAjIGZvciBodHRwIGFuZC9vciBmb3IgcmVwZWF0aW5nIGhlYWRlcnMKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBjb250aW51YXRpb24gbGluZS4KKyAgICAgICAgICAgICAgICBobGlzdC5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFkZGNvbnRpbnVlKGhlYWRlcnNlZW4sIGxpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzZWxmLmlzY29tbWVudChsaW5lKToKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBjb21tZW50LiAgSWdub3JlIGl0LgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHNlbGYuaXNsYXN0KGxpbmUpOgorICAgICAgICAgICAgICAgICMgTm90ZSEgTm8gcHVzaGJhY2sgaGVyZSEgIFRoZSBkZWxpbWl0ZXIgbGluZSBnZXRzIGVhdGVuLgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBoZWFkZXJzZWVuID0gc2VsZi5pc2hlYWRlcihsaW5lKQorICAgICAgICAgICAgaWYgaGVhZGVyc2VlbjoKKyAgICAgICAgICAgICAgICAjIEl0J3MgYSBsZWdhbCBoZWFkZXIgbGluZSwgc2F2ZSBpdC4KKyAgICAgICAgICAgICAgICBobGlzdC5hcHBlbmQobGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFkZGhlYWRlcihoZWFkZXJzZWVuLCBsaW5lW2xlbihoZWFkZXJzZWVuKSsxOl0uc3RyaXAoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEl0J3Mgbm90IGEgaGVhZGVyIGxpbmU7IHRocm93IGl0IGJhY2sgYW5kIHN0b3AgaGVyZS4KKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kaWN0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9ICdObyBoZWFkZXJzJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gJ05vbi1oZWFkZXIgbGluZSB3aGVyZSBoZWFkZXIgZXhwZWN0ZWQnCisgICAgICAgICAgICAgICAgIyBUcnkgdG8gdW5kbyB0aGUgcmVhZC4KKyAgICAgICAgICAgICAgICBpZiB1bnJlYWQ6CisgICAgICAgICAgICAgICAgICAgIHVucmVhZChsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgdGVsbDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHN0YXJ0b2ZsaW5lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gc2VsZi5zdGF0dXMgKyAnOyBiYWQgc2VlaycKKyAgICAgICAgICAgICAgICBicmVhaworCitjbGFzcyBIVFRQUmVzcG9uc2U6CisKKyAgICAjIHN0cmljdDogSWYgdHJ1ZSwgcmFpc2UgQmFkU3RhdHVzTGluZSBpZiB0aGUgc3RhdHVzIGxpbmUgY2FuJ3QgYmUKKyAgICAjIHBhcnNlZCBhcyBhIHZhbGlkIEhUVFAvMS4wIG9yIDEuMSBzdGF0dXMgbGluZS4gIEJ5IGRlZmF1bHQgaXQgaXMKKyAgICAjIGZhbHNlIGJlY2F1c2UgaXQgcHJldmVudHMgY2xpZW50cyBmcm9tIHRhbGtpbmcgdG8gSFRUUC8wLjkKKyAgICAjIHNlcnZlcnMuICBOb3RlIHRoYXQgYSByZXNwb25zZSB3aXRoIGEgc3VmZmljaWVudGx5IGNvcnJ1cHRlZAorICAgICMgc3RhdHVzIGxpbmUgd2lsbCBsb29rIGxpa2UgYW4gSFRUUC8wLjkgcmVzcG9uc2UuCisKKyAgICAjIFNlZSBSRkMgMjYxNiBzZWMgMTkuNiBhbmQgUkZDIDE5NDUgc2VjIDYgZm9yIGRldGFpbHMuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29jaywgZGVidWdsZXZlbD0wLCBzdHJpY3Q9MCwgbWV0aG9kPU5vbmUsIGJ1ZmZlcmluZz1GYWxzZSk6CisgICAgICAgIGlmIGJ1ZmZlcmluZzoKKyAgICAgICAgICAgICMgVGhlIGNhbGxlciB3b24ndCBiZSB1c2luZyBhbnkgc29jay5yZWN2KCkgY2FsbHMsIHNvIGJ1ZmZlcmluZworICAgICAgICAgICAgIyBpcyBmaW5lIGFuZCByZWNvbW1lbmRlZCBmb3IgcGVyZm9ybWFuY2UuCisgICAgICAgICAgICBzZWxmLmZwID0gc29jay5tYWtlZmlsZSgncmInKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGUgYnVmZmVyIHNpemUgaXMgc3BlY2lmaWVkIGFzIHplcm8sIGJlY2F1c2UgdGhlIGhlYWRlcnMgb2YKKyAgICAgICAgICAgICMgdGhlIHJlc3BvbnNlIGFyZSByZWFkIHdpdGggcmVhZGxpbmUoKS4gIElmIHRoZSByZWFkcyB3ZXJlCisgICAgICAgICAgICAjIGJ1ZmZlcmVkIHRoZSByZWFkbGluZSgpIGNhbGxzIGNvdWxkIGNvbnN1bWUgc29tZSBvZiB0aGUKKyAgICAgICAgICAgICMgcmVzcG9uc2UsIHdoaWNoIG1ha2UgYmUgcmVhZCB2aWEgYSByZWN2KCkgb24gdGhlIHVuZGVybHlpbmcKKyAgICAgICAgICAgICMgc29ja2V0LgorICAgICAgICAgICAgc2VsZi5mcCA9IHNvY2subWFrZWZpbGUoJ3JiJywgMCkKKyAgICAgICAgc2VsZi5kZWJ1Z2xldmVsID0gZGVidWdsZXZlbAorICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAorICAgICAgICBzZWxmLl9tZXRob2QgPSBtZXRob2QKKworICAgICAgICBzZWxmLm1zZyA9IE5vbmUKKworICAgICAgICAjIGZyb20gdGhlIFN0YXR1cy1MaW5lIG9mIHRoZSByZXNwb25zZQorICAgICAgICBzZWxmLnZlcnNpb24gPSBfVU5LTk9XTiAjIEhUVFAtVmVyc2lvbgorICAgICAgICBzZWxmLnN0YXR1cyA9IF9VTktOT1dOICAjIFN0YXR1cy1Db2RlCisgICAgICAgIHNlbGYucmVhc29uID0gX1VOS05PV04gICMgUmVhc29uLVBocmFzZQorCisgICAgICAgIHNlbGYuY2h1bmtlZCA9IF9VTktOT1dOICAgICAgICAgIyBpcyAiY2h1bmtlZCIgYmVpbmcgdXNlZD8KKyAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gX1VOS05PV04gICAgICAjIGJ5dGVzIGxlZnQgdG8gcmVhZCBpbiBjdXJyZW50IGNodW5rCisgICAgICAgIHNlbGYubGVuZ3RoID0gX1VOS05PV04gICAgICAgICAgIyBudW1iZXIgb2YgYnl0ZXMgbGVmdCBpbiByZXNwb25zZQorICAgICAgICBzZWxmLndpbGxfY2xvc2UgPSBfVU5LTk9XTiAgICAgICMgY29ubiB3aWxsIGNsb3NlIGF0IGVuZCBvZiByZXNwb25zZQorCisgICAgZGVmIF9yZWFkX3N0YXR1cyhzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIHdpdGggU2ltcGxlLVJlc3BvbnNlIGRlZmF1bHRzCisgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKF9NQVhMSU5FICsgMSkKKyAgICAgICAgaWYgbGVuKGxpbmUpID4gX01BWExJTkU6CisgICAgICAgICAgICByYWlzZSBMaW5lVG9vTG9uZygiaGVhZGVyIGxpbmUiKQorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQgInJlcGx5OiIsIHJlcHIobGluZSkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAjIFByZXN1bWFibHksIHRoZSBzZXJ2ZXIgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGJlZm9yZQorICAgICAgICAgICAgIyBzZW5kaW5nIGEgdmFsaWQgcmVzcG9uc2UuCisgICAgICAgICAgICByYWlzZSBCYWRTdGF0dXNMaW5lKGxpbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFt2ZXJzaW9uLCBzdGF0dXMsIHJlYXNvbl0gPSBsaW5lLnNwbGl0KE5vbmUsIDIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIFt2ZXJzaW9uLCBzdGF0dXNdID0gbGluZS5zcGxpdChOb25lLCAxKQorICAgICAgICAgICAgICAgIHJlYXNvbiA9ICIiCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGVtcHR5IHZlcnNpb24gd2lsbCBjYXVzZSBuZXh0IHRlc3QgdG8gZmFpbCBhbmQgc3RhdHVzCisgICAgICAgICAgICAgICAgIyB3aWxsIGJlIHRyZWF0ZWQgYXMgMC45IHJlc3BvbnNlLgorICAgICAgICAgICAgICAgIHZlcnNpb24gPSAiIgorICAgICAgICBpZiBub3QgdmVyc2lvbi5zdGFydHN3aXRoKCdIVFRQLycpOgorICAgICAgICAgICAgaWYgc2VsZi5zdHJpY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UgQmFkU3RhdHVzTGluZShsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGFzc3VtZSBpdCdzIGEgU2ltcGxlLVJlc3BvbnNlIGZyb20gYW4gMC45IHNlcnZlcgorICAgICAgICAgICAgICAgIHNlbGYuZnAgPSBMaW5lQW5kRmlsZVdyYXBwZXIobGluZSwgc2VsZi5mcCkKKyAgICAgICAgICAgICAgICByZXR1cm4gIkhUVFAvMC45IiwgMjAwLCAiIgorCisgICAgICAgICMgVGhlIHN0YXR1cyBjb2RlIGlzIGEgdGhyZWUtZGlnaXQgbnVtYmVyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0YXR1cyA9IGludChzdGF0dXMpCisgICAgICAgICAgICBpZiBzdGF0dXMgPCAxMDAgb3Igc3RhdHVzID4gOTk5OgorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFN0YXR1c0xpbmUobGluZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBCYWRTdGF0dXNMaW5lKGxpbmUpCisgICAgICAgIHJldHVybiB2ZXJzaW9uLCBzdGF0dXMsIHJlYXNvbgorCisgICAgZGVmIGJlZ2luKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1zZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgd2UndmUgYWxyZWFkeSBzdGFydGVkIHJlYWRpbmcgdGhlIHJlc3BvbnNlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHJlYWQgdW50aWwgd2UgZ2V0IGEgbm9uLTEwMCByZXNwb25zZQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdmVyc2lvbiwgc3RhdHVzLCByZWFzb24gPSBzZWxmLl9yZWFkX3N0YXR1cygpCisgICAgICAgICAgICBpZiBzdGF0dXMgIT0gQ09OVElOVUU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgc2tpcCB0aGUgaGVhZGVyIGZyb20gdGhlIDEwMCByZXNwb25zZQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBza2lwID0gc2VsZi5mcC5yZWFkbGluZShfTUFYTElORSArIDEpCisgICAgICAgICAgICAgICAgaWYgbGVuKHNraXApID4gX01BWExJTkU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIExpbmVUb29Mb25nKCJoZWFkZXIgbGluZSIpCisgICAgICAgICAgICAgICAgc2tpcCA9IHNraXAuc3RyaXAoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBza2lwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJoZWFkZXI6Iiwgc2tpcAorCisgICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCisgICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uLnN0cmlwKCkKKyAgICAgICAgaWYgdmVyc2lvbiA9PSAnSFRUUC8xLjAnOgorICAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gMTAKKyAgICAgICAgZWxpZiB2ZXJzaW9uLnN0YXJ0c3dpdGgoJ0hUVFAvMS4nKToKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IDExICAgIyB1c2UgSFRUUC8xLjEgY29kZSBmb3IgSFRUUC8xLnggd2hlcmUgeD49MQorICAgICAgICBlbGlmIHZlcnNpb24gPT0gJ0hUVFAvMC45JzoKKyAgICAgICAgICAgIHNlbGYudmVyc2lvbiA9IDkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFVua25vd25Qcm90b2NvbCh2ZXJzaW9uKQorCisgICAgICAgIGlmIHNlbGYudmVyc2lvbiA9PSA5OgorICAgICAgICAgICAgc2VsZi5sZW5ndGggPSBOb25lCisgICAgICAgICAgICBzZWxmLmNodW5rZWQgPSAwCisgICAgICAgICAgICBzZWxmLndpbGxfY2xvc2UgPSAxCisgICAgICAgICAgICBzZWxmLm1zZyA9IEhUVFBNZXNzYWdlKFN0cmluZ0lPKCkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLm1zZyA9IEhUVFBNZXNzYWdlKHNlbGYuZnAsIDApCisgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICBmb3IgaGRyIGluIHNlbGYubXNnLmhlYWRlcnM6CisgICAgICAgICAgICAgICAgcHJpbnQgImhlYWRlcjoiLCBoZHIsCisKKyAgICAgICAgIyBkb24ndCBsZXQgdGhlIG1zZyBrZWVwIGFuIGZwCisgICAgICAgIHNlbGYubXNnLmZwID0gTm9uZQorCisgICAgICAgICMgYXJlIHdlIHVzaW5nIHRoZSBjaHVua2VkLXN0eWxlIG9mIHRyYW5zZmVyIGVuY29kaW5nPworICAgICAgICB0cl9lbmMgPSBzZWxmLm1zZy5nZXRoZWFkZXIoJ3RyYW5zZmVyLWVuY29kaW5nJykKKyAgICAgICAgaWYgdHJfZW5jIGFuZCB0cl9lbmMubG93ZXIoKSA9PSAiY2h1bmtlZCI6CisgICAgICAgICAgICBzZWxmLmNodW5rZWQgPSAxCisgICAgICAgICAgICBzZWxmLmNodW5rX2xlZnQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNodW5rZWQgPSAwCisKKyAgICAgICAgIyB3aWxsIHRoZSBjb25uZWN0aW9uIGNsb3NlIGF0IHRoZSBlbmQgb2YgdGhlIHJlc3BvbnNlPworICAgICAgICBzZWxmLndpbGxfY2xvc2UgPSBzZWxmLl9jaGVja19jbG9zZSgpCisKKyAgICAgICAgIyBkbyB3ZSBoYXZlIGEgQ29udGVudC1MZW5ndGg/CisgICAgICAgICMgTk9URTogUkZDIDI2MTYsIFM0LjQsICMzIHNheXMgd2UgaWdub3JlIHRoaXMgaWYgdHJfZW5jIGlzICJjaHVua2VkIgorICAgICAgICBsZW5ndGggPSBzZWxmLm1zZy5nZXRoZWFkZXIoJ2NvbnRlbnQtbGVuZ3RoJykKKyAgICAgICAgaWYgbGVuZ3RoIGFuZCBub3Qgc2VsZi5jaHVua2VkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gaW50KGxlbmd0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxlbmd0aCA8IDA6ICAjIGlnbm9yZSBub25zZW5zaWNhbCBuZWdhdGl2ZSBsZW5ndGhzCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sZW5ndGggPSBOb25lCisKKyAgICAgICAgIyBkb2VzIHRoZSBib2R5IGhhdmUgYSBmaXhlZCBsZW5ndGg/IChvZiB6ZXJvKQorICAgICAgICBpZiAoc3RhdHVzID09IE5PX0NPTlRFTlQgb3Igc3RhdHVzID09IE5PVF9NT0RJRklFRCBvcgorICAgICAgICAgICAgMTAwIDw9IHN0YXR1cyA8IDIwMCBvciAgICAgICMgMXh4IGNvZGVzCisgICAgICAgICAgICBzZWxmLl9tZXRob2QgPT0gJ0hFQUQnKToKKyAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gMAorCisgICAgICAgICMgaWYgdGhlIGNvbm5lY3Rpb24gcmVtYWlucyBvcGVuLCBhbmQgd2UgYXJlbid0IHVzaW5nIGNodW5rZWQsIGFuZAorICAgICAgICAjIGEgY29udGVudC1sZW5ndGggd2FzIG5vdCBwcm92aWRlZCwgdGhlbiBhc3N1bWUgdGhhdCB0aGUgY29ubmVjdGlvbgorICAgICAgICAjIFdJTEwgY2xvc2UuCisgICAgICAgIGlmIG5vdCBzZWxmLndpbGxfY2xvc2UgYW5kIFwKKyAgICAgICAgICAgbm90IHNlbGYuY2h1bmtlZCBhbmQgXAorICAgICAgICAgICBzZWxmLmxlbmd0aCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi53aWxsX2Nsb3NlID0gMQorCisgICAgZGVmIF9jaGVja19jbG9zZShzZWxmKToKKyAgICAgICAgY29ubiA9IHNlbGYubXNnLmdldGhlYWRlcignY29ubmVjdGlvbicpCisgICAgICAgIGlmIHNlbGYudmVyc2lvbiA9PSAxMToKKyAgICAgICAgICAgICMgQW4gSFRUUC8xLjEgcHJveHkgaXMgYXNzdW1lZCB0byBzdGF5IG9wZW4gdW5sZXNzCisgICAgICAgICAgICAjIGV4cGxpY2l0bHkgY2xvc2VkLgorICAgICAgICAgICAgY29ubiA9IHNlbGYubXNnLmdldGhlYWRlcignY29ubmVjdGlvbicpCisgICAgICAgICAgICBpZiBjb25uIGFuZCAiY2xvc2UiIGluIGNvbm4ubG93ZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgIyBTb21lIEhUVFAvMS4wIGltcGxlbWVudGF0aW9ucyBoYXZlIHN1cHBvcnQgZm9yIHBlcnNpc3RlbnQKKyAgICAgICAgIyBjb25uZWN0aW9ucywgdXNpbmcgcnVsZXMgZGlmZmVyZW50IHRoYW4gSFRUUC8xLjEuCisKKyAgICAgICAgIyBGb3Igb2xkZXIgSFRUUCwgS2VlcC1BbGl2ZSBpbmRpY2F0ZXMgcGVyc2lzdGVudCBjb25uZWN0aW9uLgorICAgICAgICBpZiBzZWxmLm1zZy5nZXRoZWFkZXIoJ2tlZXAtYWxpdmUnKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgQXQgbGVhc3QgQWthbWFpIHJldHVybnMgYSAiQ29ubmVjdGlvbjogS2VlcC1BbGl2ZSIgaGVhZGVyLAorICAgICAgICAjIHdoaWNoIHdhcyBzdXBwb3NlZCB0byBiZSBzZW50IGJ5IHRoZSBjbGllbnQuCisgICAgICAgIGlmIGNvbm4gYW5kICJrZWVwLWFsaXZlIiBpbiBjb25uLmxvd2VyKCk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAjIFByb3h5LUNvbm5lY3Rpb24gaXMgYSBuZXRzY2FwZSBoYWNrLgorICAgICAgICBwY29ubiA9IHNlbGYubXNnLmdldGhlYWRlcigncHJveHktY29ubmVjdGlvbicpCisgICAgICAgIGlmIHBjb25uIGFuZCAia2VlcC1hbGl2ZSIgaW4gcGNvbm4ubG93ZXIoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICMgb3RoZXJ3aXNlLCBhc3N1bWUgaXQgd2lsbCBjbG9zZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZwOgorICAgICAgICAgICAgc2VsZi5mcC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmZwID0gTm9uZQorCisgICAgZGVmIGlzY2xvc2VkKHNlbGYpOgorICAgICAgICAjIE5PVEU6IGl0IGlzIHBvc3NpYmxlIHRoYXQgd2Ugd2lsbCBub3QgZXZlciBjYWxsIHNlbGYuY2xvc2UoKS4gVGhpcworICAgICAgICAjICAgICAgIGNhc2Ugb2NjdXJzIHdoZW4gd2lsbF9jbG9zZSBpcyBUUlVFLCBsZW5ndGggaXMgTm9uZSwgYW5kIHdlCisgICAgICAgICMgICAgICAgcmVhZCB1cCB0byB0aGUgbGFzdCBieXRlLCBidXQgTk9UIHBhc3QgaXQuCisgICAgICAgICMKKyAgICAgICAgIyBJTVBMSUVTOiBpZiB3aWxsX2Nsb3NlIGlzIEZBTFNFLCB0aGVuIHNlbGYuY2xvc2UoKSB3aWxsIEFMV0FZUyBiZQorICAgICAgICAjICAgICAgICAgIGNhbGxlZCwgbWVhbmluZyBzZWxmLmlzY2xvc2VkKCkgaXMgbWVhbmluZ2Z1bC4KKyAgICAgICAgcmV0dXJuIHNlbGYuZnAgaXMgTm9uZQorCisgICAgIyBYWFggSXQgd291bGQgYmUgbmljZSB0byBoYXZlIHJlYWRsaW5lIGFuZCBfX2l0ZXJfXyBmb3IgdGhpcywgdG9vLgorCisgICAgZGVmIHJlYWQoc2VsZiwgYW10PU5vbmUpOgorICAgICAgICBpZiBzZWxmLmZwIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gJycKKworICAgICAgICBpZiBzZWxmLl9tZXRob2QgPT0gJ0hFQUQnOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gJycKKworICAgICAgICBpZiBzZWxmLmNodW5rZWQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF9jaHVua2VkKGFtdCkKKworICAgICAgICBpZiBhbXQgaXMgTm9uZToKKyAgICAgICAgICAgICMgdW5ib3VuZGVkIHJlYWQKKyAgICAgICAgICAgIGlmIHNlbGYubGVuZ3RoIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuZnAucmVhZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcyA9IHNlbGYuX3NhZmVfcmVhZChzZWxmLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSW5jb21wbGV0ZVJlYWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gMAorICAgICAgICAgICAgc2VsZi5jbG9zZSgpICAgICAgICAjIHdlIHJlYWQgZXZlcnl0aGluZworICAgICAgICAgICAgcmV0dXJuIHMKKworICAgICAgICBpZiBzZWxmLmxlbmd0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGFtdCA+IHNlbGYubGVuZ3RoOgorICAgICAgICAgICAgICAgICMgY2xpcCB0aGUgcmVhZCB0byB0aGUgImVuZCBvZiByZXNwb25zZSIKKyAgICAgICAgICAgICAgICBhbXQgPSBzZWxmLmxlbmd0aAorCisgICAgICAgICMgd2UgZG8gbm90IHVzZSBfc2FmZV9yZWFkKCkgaGVyZSBiZWNhdXNlIHRoaXMgbWF5IGJlIGEgLndpbGxfY2xvc2UKKyAgICAgICAgIyBjb25uZWN0aW9uLCBhbmQgdGhlIHVzZXIgaXMgcmVhZGluZyBtb3JlIGJ5dGVzIHRoYW4gd2lsbCBiZSBwcm92aWRlZAorICAgICAgICAjIChmb3IgZXhhbXBsZSwgcmVhZGluZyBpbiAxayBjaHVua3MpCisgICAgICAgIHMgPSBzZWxmLmZwLnJlYWQoYW10KQorICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgICMgSWRlYWxseSwgd2Ugd291bGQgcmFpc2UgSW5jb21wbGV0ZVJlYWQgaWYgdGhlIGNvbnRlbnQtbGVuZ3RoCisgICAgICAgICAgICAjIHdhc24ndCBzYXRpc2ZpZWQsIGJ1dCBpdCBtaWdodCBicmVhayBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIGlmIHNlbGYubGVuZ3RoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5sZW5ndGggLT0gbGVuKHMpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5sZW5ndGg6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfcmVhZF9jaHVua2VkKHNlbGYsIGFtdCk6CisgICAgICAgIGFzc2VydCBzZWxmLmNodW5rZWQgIT0gX1VOS05PV04KKyAgICAgICAgY2h1bmtfbGVmdCA9IHNlbGYuY2h1bmtfbGVmdAorICAgICAgICB2YWx1ZSA9IFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpZiBjaHVua19sZWZ0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoX01BWExJTkUgKyAxKQorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IF9NQVhMSU5FOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBMaW5lVG9vTG9uZygiY2h1bmsgc2l6ZSIpCisgICAgICAgICAgICAgICAgaSA9IGxpbmUuZmluZCgnOycpCisgICAgICAgICAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6aV0gIyBzdHJpcCBjaHVuay1leHRlbnNpb25zCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBjaHVua19sZWZ0ID0gaW50KGxpbmUsIDE2KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzIHByb3RvY29sIHN5bmNocm9uaXNhdGlvbiBpcworICAgICAgICAgICAgICAgICAgICAjIHByb2JhYmx5IGxvc3QKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluY29tcGxldGVSZWFkKCcnLmpvaW4odmFsdWUpKQorICAgICAgICAgICAgICAgIGlmIGNodW5rX2xlZnQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGFtdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChzZWxmLl9zYWZlX3JlYWQoY2h1bmtfbGVmdCkpCisgICAgICAgICAgICBlbGlmIGFtdCA8IGNodW5rX2xlZnQ6CisgICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKHNlbGYuX3NhZmVfcmVhZChhbXQpKQorICAgICAgICAgICAgICAgIHNlbGYuY2h1bmtfbGVmdCA9IGNodW5rX2xlZnQgLSBhbXQKKyAgICAgICAgICAgICAgICByZXR1cm4gJycuam9pbih2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgYW10ID09IGNodW5rX2xlZnQ6CisgICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKHNlbGYuX3NhZmVfcmVhZChhbXQpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NhZmVfcmVhZCgyKSAgIyB0b3NzIHRoZSBDUkxGIGF0IHRoZSBlbmQgb2YgdGhlIGNodW5rCisgICAgICAgICAgICAgICAgc2VsZi5jaHVua19sZWZ0ID0gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiAnJy5qb2luKHZhbHVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoc2VsZi5fc2FmZV9yZWFkKGNodW5rX2xlZnQpKQorICAgICAgICAgICAgICAgIGFtdCAtPSBjaHVua19sZWZ0CisKKyAgICAgICAgICAgICMgd2UgcmVhZCB0aGUgd2hvbGUgY2h1bmssIGdldCBhbm90aGVyCisgICAgICAgICAgICBzZWxmLl9zYWZlX3JlYWQoMikgICAgICAjIHRvc3MgdGhlIENSTEYgYXQgdGhlIGVuZCBvZiB0aGUgY2h1bmsKKyAgICAgICAgICAgIGNodW5rX2xlZnQgPSBOb25lCisKKyAgICAgICAgIyByZWFkIGFuZCBkaXNjYXJkIHRyYWlsZXIgdXAgdG8gdGhlIENSTEYgdGVybWluYXRvcgorICAgICAgICAjIyMgbm90ZTogd2Ugc2hvdWxkbid0IGhhdmUgYW55IHRyYWlsZXJzIQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoX01BWExJTkUgKyAxKQorICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gX01BWExJTkU6CisgICAgICAgICAgICAgICAgcmFpc2UgTGluZVRvb0xvbmcoInRyYWlsZXIgbGluZSIpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAjIGEgdmFuaXNoaW5nbHkgc21hbGwgbnVtYmVyIG9mIHNpdGVzIEVPRiB3aXRob3V0CisgICAgICAgICAgICAgICAgIyBzZW5kaW5nIHRoZSB0cmFpbGVyCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1xyXG4nOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgIyB3ZSByZWFkIGV2ZXJ5dGhpbmc7IGNsb3NlIHRoZSAiZmlsZSIKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odmFsdWUpCisKKyAgICBkZWYgX3NhZmVfcmVhZChzZWxmLCBhbXQpOgorICAgICAgICAiIiJSZWFkIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLCBjb21wZW5zYXRpbmcgZm9yIHBhcnRpYWwgcmVhZHMuCisKKyAgICAgICAgTm9ybWFsbHksIHdlIGhhdmUgYSBibG9ja2luZyBzb2NrZXQsIGJ1dCBhIHJlYWQoKSBjYW4gYmUgaW50ZXJydXB0ZWQKKyAgICAgICAgYnkgYSBzaWduYWwgKHJlc3VsdGluZyBpbiBhIHBhcnRpYWwgcmVhZCkuCisKKyAgICAgICAgTm90ZSB0aGF0IHdlIGNhbm5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIEVPRiBhbmQgYW4gaW50ZXJydXB0IHdoZW4gemVybworICAgICAgICBieXRlcyBoYXZlIGJlZW4gcmVhZC4gSW5jb21wbGV0ZVJlYWQoKSB3aWxsIGJlIHJhaXNlZCBpbiB0aGlzCisgICAgICAgIHNpdHVhdGlvbi4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIHdoZW4gPGFtdD4gYnl0ZXMgInNob3VsZCIgYmUgcHJlc2VudCBmb3IKKyAgICAgICAgcmVhZGluZy4gSWYgdGhlIGJ5dGVzIGFyZSB0cnVseSBub3QgYXZhaWxhYmxlIChkdWUgdG8gRU9GKSwgdGhlbiB0aGUKKyAgICAgICAgSW5jb21wbGV0ZVJlYWQgZXhjZXB0aW9uIGNhbiBiZSB1c2VkIHRvIGRldGVjdCB0aGUgcHJvYmxlbS4KKyAgICAgICAgIiIiCisgICAgICAgICMgTk9URShncHMpOiBBcyBvZiBzdm4gcjc0NDI2IHNvY2tldC5fZmlsZW9iamVjdC5yZWFkKHgpIHdpbGwgbmV2ZXIKKyAgICAgICAgIyByZXR1cm4gbGVzcyB0aGFuIHggYnl0ZXMgdW5sZXNzIEVPRiBpcyBlbmNvdW50ZXJlZC4gIEl0IG5vdyBoYW5kbGVzCisgICAgICAgICMgc2lnbmFsIGludGVycnVwdGlvbnMgKHNvY2tldC5lcnJvciBFSU5UUikgaW50ZXJuYWxseS4gIFRoaXMgY29kZQorICAgICAgICAjIG5ldmVyIGNhdWdodCB0aGF0IGV4Y2VwdGlvbiBhbnl3YXlzLiAgSXQgc2VlbXMgbGFyZ2VseSBwb2ludGxlc3MuCisgICAgICAgICMgc2VsZi5mcC5yZWFkKGFtdCkgd2lsbCB3b3JrIGZpbmUuCisgICAgICAgIHMgPSBbXQorICAgICAgICB3aGlsZSBhbXQgPiAwOgorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLmZwLnJlYWQobWluKGFtdCwgTUFYQU1PVU5UKSkKKyAgICAgICAgICAgIGlmIG5vdCBjaHVuazoKKyAgICAgICAgICAgICAgICByYWlzZSBJbmNvbXBsZXRlUmVhZCgnJy5qb2luKHMpLCBhbXQpCisgICAgICAgICAgICBzLmFwcGVuZChjaHVuaykKKyAgICAgICAgICAgIGFtdCAtPSBsZW4oY2h1bmspCisgICAgICAgIHJldHVybiAnJy5qb2luKHMpCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5mcC5maWxlbm8oKQorCisgICAgZGVmIGdldGhlYWRlcihzZWxmLCBuYW1lLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICBpZiBzZWxmLm1zZyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgUmVzcG9uc2VOb3RSZWFkeSgpCisgICAgICAgIHJldHVybiBzZWxmLm1zZy5nZXRoZWFkZXIobmFtZSwgZGVmYXVsdCkKKworICAgIGRlZiBnZXRoZWFkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiAoaGVhZGVyLCB2YWx1ZSkgdHVwbGVzLiIiIgorICAgICAgICBpZiBzZWxmLm1zZyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgUmVzcG9uc2VOb3RSZWFkeSgpCisgICAgICAgIHJldHVybiBzZWxmLm1zZy5pdGVtcygpCisKKworY2xhc3MgSFRUUENvbm5lY3Rpb246CisKKyAgICBfaHR0cF92c24gPSAxMQorICAgIF9odHRwX3Zzbl9zdHIgPSAnSFRUUC8xLjEnCisKKyAgICByZXNwb25zZV9jbGFzcyA9IEhUVFBSZXNwb25zZQorICAgIGRlZmF1bHRfcG9ydCA9IEhUVFBfUE9SVAorICAgIGF1dG9fb3BlbiA9IDEKKyAgICBkZWJ1Z2xldmVsID0gMAorICAgIHN0cmljdCA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PU5vbmUsIHN0cmljdD1Ob25lLAorICAgICAgICAgICAgICAgICB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwgc291cmNlX2FkZHJlc3M9Tm9uZSk6CisgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgc2VsZi5zb3VyY2VfYWRkcmVzcyA9IHNvdXJjZV9hZGRyZXNzCisgICAgICAgIHNlbGYuc29jayA9IE5vbmUKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi5fX3Jlc3BvbnNlID0gTm9uZQorICAgICAgICBzZWxmLl9fc3RhdGUgPSBfQ1NfSURMRQorICAgICAgICBzZWxmLl9tZXRob2QgPSBOb25lCisgICAgICAgIHNlbGYuX3R1bm5lbF9ob3N0ID0gTm9uZQorICAgICAgICBzZWxmLl90dW5uZWxfcG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdHVubmVsX2hlYWRlcnMgPSB7fQorCisgICAgICAgIHNlbGYuX3NldF9ob3N0cG9ydChob3N0LCBwb3J0KQorICAgICAgICBpZiBzdHJpY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnN0cmljdCA9IHN0cmljdAorCisgICAgZGVmIHNldF90dW5uZWwoc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBoZWFkZXJzPU5vbmUpOgorICAgICAgICAiIiIgU2V0cyB1cCB0aGUgaG9zdCBhbmQgdGhlIHBvcnQgZm9yIHRoZSBIVFRQIENPTk5FQ1QgVHVubmVsbGluZy4KKworICAgICAgICBUaGUgaGVhZGVycyBhcmd1bWVudCBzaG91bGQgYmUgYSBtYXBwaW5nIG9mIGV4dHJhIEhUVFAgaGVhZGVycworICAgICAgICB0byBzZW5kIHdpdGggdGhlIENPTk5FQ1QgcmVxdWVzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3R1bm5lbF9ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLl90dW5uZWxfcG9ydCA9IHBvcnQKKyAgICAgICAgaWYgaGVhZGVyczoKKyAgICAgICAgICAgIHNlbGYuX3R1bm5lbF9oZWFkZXJzID0gaGVhZGVycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdHVubmVsX2hlYWRlcnMuY2xlYXIoKQorCisgICAgZGVmIF9zZXRfaG9zdHBvcnQoc2VsZiwgaG9zdCwgcG9ydCk6CisgICAgICAgIGlmIHBvcnQgaXMgTm9uZToKKyAgICAgICAgICAgIGkgPSBob3N0LnJmaW5kKCc6JykKKyAgICAgICAgICAgIGogPSBob3N0LnJmaW5kKCddJykgICAgICAgICAjIGlwdjYgYWRkcmVzc2VzIGhhdmUgWy4uLl0KKyAgICAgICAgICAgIGlmIGkgPiBqOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IGludChob3N0W2krMTpdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiBob3N0W2krMTpdID09ICIiOiAgIyBodHRwOi8vZm9vLmNvbTovID09IGh0dHA6Ly9mb28uY29tLworICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA9IHNlbGYuZGVmYXVsdF9wb3J0CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkVVJMKCJub25udW1lcmljIHBvcnQ6ICclcyciICUgaG9zdFtpKzE6XSkKKyAgICAgICAgICAgICAgICBob3N0ID0gaG9zdFs6aV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcG9ydCA9IHNlbGYuZGVmYXVsdF9wb3J0CisgICAgICAgICAgICBpZiBob3N0IGFuZCBob3N0WzBdID09ICdbJyBhbmQgaG9zdFstMV0gPT0gJ10nOgorICAgICAgICAgICAgICAgIGhvc3QgPSBob3N0WzE6LTFdCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorCisgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGxldmVsKToKKyAgICAgICAgc2VsZi5kZWJ1Z2xldmVsID0gbGV2ZWwKKworICAgIGRlZiBfdHVubmVsKHNlbGYpOgorICAgICAgICBzZWxmLl9zZXRfaG9zdHBvcnQoc2VsZi5fdHVubmVsX2hvc3QsIHNlbGYuX3R1bm5lbF9wb3J0KQorICAgICAgICBzZWxmLnNlbmQoIkNPTk5FQ1QgJXM6JWQgSFRUUC8xLjBcclxuIiAlIChzZWxmLmhvc3QsIHNlbGYucG9ydCkpCisgICAgICAgIGZvciBoZWFkZXIsIHZhbHVlIGluIHNlbGYuX3R1bm5lbF9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5zZW5kKCIlczogJXNcclxuIiAlIChoZWFkZXIsIHZhbHVlKSkKKyAgICAgICAgc2VsZi5zZW5kKCJcclxuIikKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlc3BvbnNlX2NsYXNzKHNlbGYuc29jaywgc3RyaWN0ID0gc2VsZi5zdHJpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSBzZWxmLl9tZXRob2QpCisgICAgICAgICh2ZXJzaW9uLCBjb2RlLCBtZXNzYWdlKSA9IHJlc3BvbnNlLl9yZWFkX3N0YXR1cygpCisKKyAgICAgICAgaWYgY29kZSAhPSAyMDA6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvcigiVHVubmVsIGNvbm5lY3Rpb24gZmFpbGVkOiAlZCAlcyIgJSAoY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5zdHJpcCgpKSkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSByZXNwb25zZS5mcC5yZWFkbGluZShfTUFYTElORSArIDEpCisgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBfTUFYTElORToKKyAgICAgICAgICAgICAgICByYWlzZSBMaW5lVG9vTG9uZygiaGVhZGVyIGxpbmUiKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgIyBmb3Igc2l0ZXMgd2hpY2ggRU9GIHdpdGhvdXQgc2VuZGluZyB0cmFpbGVyCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1xyXG4nOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKworICAgIGRlZiBjb25uZWN0KHNlbGYpOgorICAgICAgICAiIiJDb25uZWN0IHRvIHRoZSBob3N0IGFuZCBwb3J0IHNwZWNpZmllZCBpbiBfX2luaXRfXy4iIiIKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChzZWxmLmhvc3Qsc2VsZi5wb3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGltZW91dCwgc2VsZi5zb3VyY2VfYWRkcmVzcykKKworICAgICAgICBpZiBzZWxmLl90dW5uZWxfaG9zdDoKKyAgICAgICAgICAgIHNlbGYuX3R1bm5lbCgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBIVFRQIHNlcnZlci4iIiIKKyAgICAgICAgaWYgc2VsZi5zb2NrOgorICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkgICAjIGNsb3NlIGl0IG1hbnVhbGx5Li4uIHRoZXJlIG1heSBiZSBvdGhlciByZWZzCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgIGlmIHNlbGYuX19yZXNwb25zZToKKyAgICAgICAgICAgIHNlbGYuX19yZXNwb25zZS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9fcmVzcG9uc2UgPSBOb25lCisgICAgICAgIHNlbGYuX19zdGF0ZSA9IF9DU19JRExFCisKKyAgICBkZWYgc2VuZChzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiU2VuZCBgZGF0YScgdG8gdGhlIHNlcnZlci4iIiIKKyAgICAgICAgaWYgc2VsZi5zb2NrIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmF1dG9fb3BlbjoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3QoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RDb25uZWN0ZWQoKQorCisgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICBwcmludCAic2VuZDoiLCByZXByKGRhdGEpCisgICAgICAgIGJsb2Nrc2l6ZSA9IDgxOTIKKyAgICAgICAgaWYgaGFzYXR0cihkYXRhLCdyZWFkJykgYW5kIG5vdCBpc2luc3RhbmNlKGRhdGEsIGFycmF5KToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6IHByaW50ICJzZW5kSW5nIGEgcmVhZCgpYWJsZSIKKyAgICAgICAgICAgIGRhdGFibG9jayA9IGRhdGEucmVhZChibG9ja3NpemUpCisgICAgICAgICAgICB3aGlsZSBkYXRhYmxvY2s6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwoZGF0YWJsb2NrKQorICAgICAgICAgICAgICAgIGRhdGFibG9jayA9IGRhdGEucmVhZChibG9ja3NpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChkYXRhKQorCisgICAgZGVmIF9vdXRwdXQoc2VsZiwgcyk6CisgICAgICAgICIiIkFkZCBhIGxpbmUgb2Ygb3V0cHV0IHRvIHRoZSBjdXJyZW50IHJlcXVlc3QgYnVmZmVyLgorCisgICAgICAgIEFzc3VtZXMgdGhhdCB0aGUgbGluZSBkb2VzICpub3QqIGVuZCB3aXRoIFxcclxcbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2J1ZmZlci5hcHBlbmQocykKKworICAgIGRlZiBfc2VuZF9vdXRwdXQoc2VsZiwgbWVzc2FnZV9ib2R5PU5vbmUpOgorICAgICAgICAiIiJTZW5kIHRoZSBjdXJyZW50bHkgYnVmZmVyZWQgcmVxdWVzdCBhbmQgY2xlYXIgdGhlIGJ1ZmZlci4KKworICAgICAgICBBcHBlbmRzIGFuIGV4dHJhIFxcclxcbiB0byB0aGUgYnVmZmVyLgorICAgICAgICBBIG1lc3NhZ2VfYm9keSBtYXkgYmUgc3BlY2lmaWVkLCB0byBiZSBhcHBlbmRlZCB0byB0aGUgcmVxdWVzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2J1ZmZlci5leHRlbmQoKCIiLCAiIikpCisgICAgICAgIG1zZyA9ICJcclxuIi5qb2luKHNlbGYuX2J1ZmZlcikKKyAgICAgICAgZGVsIHNlbGYuX2J1ZmZlcls6XQorICAgICAgICAjIElmIG1zZyBhbmQgbWVzc2FnZV9ib2R5IGFyZSBzZW50IGluIGEgc2luZ2xlIHNlbmQoKSBjYWxsLAorICAgICAgICAjIGl0IHdpbGwgYXZvaWQgcGVyZm9ybWFuY2UgcHJvYmxlbXMgY2F1c2VkIGJ5IHRoZSBpbnRlcmFjdGlvbgorICAgICAgICAjIGJldHdlZW4gZGVsYXllZCBhY2sgYW5kIHRoZSBOYWdsZSBhbGdvcml0aG0uCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZV9ib2R5LCBzdHIpOgorICAgICAgICAgICAgbXNnICs9IG1lc3NhZ2VfYm9keQorICAgICAgICAgICAgbWVzc2FnZV9ib2R5ID0gTm9uZQorICAgICAgICBzZWxmLnNlbmQobXNnKQorICAgICAgICBpZiBtZXNzYWdlX2JvZHkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjbWVzc2FnZV9ib2R5IHdhcyBub3QgYSBzdHJpbmcgKGkuZS4gaXQgaXMgYSBmaWxlKSBhbmQKKyAgICAgICAgICAgICN3ZSBtdXN0IHJ1biB0aGUgcmlzayBvZiBOYWdsZQorICAgICAgICAgICAgc2VsZi5zZW5kKG1lc3NhZ2VfYm9keSkKKworICAgIGRlZiBwdXRyZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBza2lwX2hvc3Q9MCwgc2tpcF9hY2NlcHRfZW5jb2Rpbmc9MCk6CisgICAgICAgICIiIlNlbmQgYSByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgYG1ldGhvZCcgc3BlY2lmaWVzIGFuIEhUVFAgcmVxdWVzdCBtZXRob2QsIGUuZy4gJ0dFVCcuCisgICAgICAgIGB1cmwnIHNwZWNpZmllcyB0aGUgb2JqZWN0IGJlaW5nIHJlcXVlc3RlZCwgZS5nLiAnL2luZGV4Lmh0bWwnLgorICAgICAgICBgc2tpcF9ob3N0JyBpZiBUcnVlIGRvZXMgbm90IGFkZCBhdXRvbWF0aWNhbGx5IGEgJ0hvc3Q6JyBoZWFkZXIKKyAgICAgICAgYHNraXBfYWNjZXB0X2VuY29kaW5nJyBpZiBUcnVlIGRvZXMgbm90IGFkZCBhdXRvbWF0aWNhbGx5IGFuCisgICAgICAgICAgICdBY2NlcHQtRW5jb2Rpbmc6JyBoZWFkZXIKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBpZiBhIHByaW9yIHJlc3BvbnNlIGhhcyBiZWVuIGNvbXBsZXRlZCwgdGhlbiBmb3JnZXQgYWJvdXQgaXQuCisgICAgICAgIGlmIHNlbGYuX19yZXNwb25zZSBhbmQgc2VsZi5fX3Jlc3BvbnNlLmlzY2xvc2VkKCk6CisgICAgICAgICAgICBzZWxmLl9fcmVzcG9uc2UgPSBOb25lCisKKworICAgICAgICAjIGluIGNlcnRhaW4gY2FzZXMsIHdlIGNhbm5vdCBpc3N1ZSBhbm90aGVyIHJlcXVlc3Qgb24gdGhpcyBjb25uZWN0aW9uLgorICAgICAgICAjIHRoaXMgb2NjdXJzIHdoZW46CisgICAgICAgICMgICAxKSB3ZSBhcmUgaW4gdGhlIHByb2Nlc3Mgb2Ygc2VuZGluZyBhIHJlcXVlc3QuICAgKF9DU19SRVFfU1RBUlRFRCkKKyAgICAgICAgIyAgIDIpIGEgcmVzcG9uc2UgdG8gYSBwcmV2aW91cyByZXF1ZXN0IGhhcyBzaWduYWxsZWQgdGhhdCBpdCBpcyBnb2luZworICAgICAgICAjICAgICAgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24gdXBvbiBjb21wbGV0aW9uLgorICAgICAgICAjICAgMykgdGhlIGhlYWRlcnMgZm9yIHRoZSBwcmV2aW91cyByZXNwb25zZSBoYXZlIG5vdCBiZWVuIHJlYWQsIHRodXMKKyAgICAgICAgIyAgICAgIHdlIGNhbm5vdCBkZXRlcm1pbmUgd2hldGhlciBwb2ludCAoMikgaXMgdHJ1ZS4gICAoX0NTX1JFUV9TRU5UKQorICAgICAgICAjCisgICAgICAgICMgaWYgdGhlcmUgaXMgbm8gcHJpb3IgcmVzcG9uc2UsIHRoZW4gd2UgY2FuIHJlcXVlc3QgYXQgd2lsbC4KKyAgICAgICAgIworICAgICAgICAjIGlmIHBvaW50ICgyKSBpcyB0cnVlLCB0aGVuIHdlIHdpbGwgaGF2ZSBwYXNzZWQgdGhlIHNvY2tldCB0byB0aGUKKyAgICAgICAgIyByZXNwb25zZSAoZWZmZWN0aXZlbHkgbWVhbmluZywgInRoZXJlIGlzIG5vIHByaW9yIHJlc3BvbnNlIiksIGFuZAorICAgICAgICAjIHdpbGwgb3BlbiBhIG5ldyBvbmUgd2hlbiBhIG5ldyByZXF1ZXN0IGlzIG1hZGUuCisgICAgICAgICMKKyAgICAgICAgIyBOb3RlOiBpZiBhIHByaW9yIHJlc3BvbnNlIGV4aXN0cywgdGhlbiB3ZSAqY2FuKiBzdGFydCBhIG5ldyByZXF1ZXN0LgorICAgICAgICAjICAgICAgIFdlIGFyZSBub3QgYWxsb3dlZCB0byBiZWdpbiBmZXRjaGluZyB0aGUgcmVzcG9uc2UgdG8gdGhpcyBuZXcKKyAgICAgICAgIyAgICAgICByZXF1ZXN0LCBob3dldmVyLCB1bnRpbCB0aGF0IHByaW9yIHJlc3BvbnNlIGlzIGNvbXBsZXRlLgorICAgICAgICAjCisgICAgICAgIGlmIHNlbGYuX19zdGF0ZSA9PSBfQ1NfSURMRToKKyAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IF9DU19SRVFfU1RBUlRFRAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQ2Fubm90U2VuZFJlcXVlc3QoKQorCisgICAgICAgICMgU2F2ZSB0aGUgbWV0aG9kIHdlIHVzZSwgd2UgbmVlZCBpdCBsYXRlciBpbiB0aGUgcmVzcG9uc2UgcGhhc2UKKyAgICAgICAgc2VsZi5fbWV0aG9kID0gbWV0aG9kCisgICAgICAgIGlmIG5vdCB1cmw6CisgICAgICAgICAgICB1cmwgPSAnLycKKyAgICAgICAgaGRyID0gJyVzICVzICVzJyAlIChtZXRob2QsIHVybCwgc2VsZi5faHR0cF92c25fc3RyKQorCisgICAgICAgIHNlbGYuX291dHB1dChoZHIpCisKKyAgICAgICAgaWYgc2VsZi5faHR0cF92c24gPT0gMTE6CisgICAgICAgICAgICAjIElzc3VlIHNvbWUgc3RhbmRhcmQgaGVhZGVycyBmb3IgYmV0dGVyIEhUVFAvMS4xIGNvbXBsaWFuY2UKKworICAgICAgICAgICAgaWYgbm90IHNraXBfaG9zdDoKKyAgICAgICAgICAgICAgICAjIHRoaXMgaGVhZGVyIGlzIGlzc3VlZCAqb25seSogZm9yIEhUVFAvMS4xCisgICAgICAgICAgICAgICAgIyBjb25uZWN0aW9ucy4gbW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWVhbnMgaXQgaXMKKyAgICAgICAgICAgICAgICAjIG9ubHkgaXNzdWVkIHdoZW4gdGhlIGNsaWVudCB1c2VzIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAjIEhUVFBDb25uZWN0aW9uKCkgY2xhc3MuIGJhY2t3YXJkcy1jb21wYXQgY2xpZW50cworICAgICAgICAgICAgICAgICMgd2lsbCBiZSB1c2luZyBIVFRQLzEuMCBhbmQgdGhvc2UgY2xpZW50cyBtYXkgYmUKKyAgICAgICAgICAgICAgICAjIGlzc3VpbmcgdGhpcyBoZWFkZXIgdGhlbXNlbHZlcy4gd2Ugc2hvdWxkIE5PVCBpc3N1ZQorICAgICAgICAgICAgICAgICMgaXQgdHdpY2U7IHNvbWUgd2ViIHNlcnZlcnMgKHN1Y2ggYXMgQXBhY2hlKSBiYXJmCisgICAgICAgICAgICAgICAgIyB3aGVuIHRoZXkgc2VlIHR3byBIb3N0OiBoZWFkZXJzCisKKyAgICAgICAgICAgICAgICAjIElmIHdlIG5lZWQgYSBub24tc3RhbmRhcmQgcG9ydCxpbmNsdWRlIGl0IGluIHRoZQorICAgICAgICAgICAgICAgICMgaGVhZGVyLiAgSWYgdGhlIHJlcXVlc3QgaXMgZ29pbmcgdGhyb3VnaCBhIHByb3h5LAorICAgICAgICAgICAgICAgICMgYnV0IHRoZSBob3N0IG9mIHRoZSBhY3R1YWwgVVJMLCBub3QgdGhlIGhvc3Qgb2YgdGhlCisgICAgICAgICAgICAgICAgIyBwcm94eS4KKworICAgICAgICAgICAgICAgIG5ldGxvYyA9ICcnCisgICAgICAgICAgICAgICAgaWYgdXJsLnN0YXJ0c3dpdGgoJ2h0dHAnKToKKyAgICAgICAgICAgICAgICAgICAgbmlsLCBuZXRsb2MsIG5pbCwgbmlsLCBuaWwgPSB1cmxzcGxpdCh1cmwpCisKKyAgICAgICAgICAgICAgICBpZiBuZXRsb2M6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldGxvY19lbmMgPSBuZXRsb2MuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBuZXRsb2NfZW5jID0gbmV0bG9jLmVuY29kZSgiaWRuYSIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdIb3N0JywgbmV0bG9jX2VuYykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2VuYyA9IHNlbGYuaG9zdC5lbmNvZGUoImFzY2lpIikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfZW5jID0gc2VsZi5ob3N0LmVuY29kZSgiaWRuYSIpCisgICAgICAgICAgICAgICAgICAgICMgV3JhcCB0aGUgSVB2NiBIb3N0IEhlYWRlciB3aXRoIFtdIChSRkMgMjczMikKKyAgICAgICAgICAgICAgICAgICAgaWYgaG9zdF9lbmMuZmluZCgnOicpID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBob3N0X2VuYyA9ICJbIiArIGhvc3RfZW5jICsgIl0iCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYucG9ydCA9PSBzZWxmLmRlZmF1bHRfcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdIb3N0JywgaG9zdF9lbmMpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignSG9zdCcsICIlczolcyIgJSAoaG9zdF9lbmMsIHNlbGYucG9ydCkpCisKKyAgICAgICAgICAgICMgbm90ZTogd2UgYXJlIGFzc3VtaW5nIHRoYXQgY2xpZW50cyB3aWxsIG5vdCBhdHRlbXB0IHRvIHNldCB0aGVzZQorICAgICAgICAgICAgIyAgICAgICBoZWFkZXJzIHNpbmNlICp0aGlzKiBsaWJyYXJ5IG11c3QgZGVhbCB3aXRoIHRoZQorICAgICAgICAgICAgIyAgICAgICBjb25zZXF1ZW5jZXMuIHRoaXMgYWxzbyBtZWFucyB0aGF0IHdoZW4gdGhlIHN1cHBvcnRpbmcKKyAgICAgICAgICAgICMgICAgICAgbGlicmFyaWVzIGFyZSB1cGRhdGVkIHRvIHJlY29nbml6ZSBvdGhlciBmb3JtcywgdGhlbiB0aGlzCisgICAgICAgICAgICAjICAgICAgIGNvZGUgc2hvdWxkIGJlIGNoYW5nZWQgKHJlbW92ZWQgb3IgdXBkYXRlZCkuCisKKyAgICAgICAgICAgICMgd2Ugb25seSB3YW50IGEgQ29udGVudC1FbmNvZGluZyBvZiAiaWRlbnRpdHkiIHNpbmNlIHdlIGRvbid0CisgICAgICAgICAgICAjIHN1cHBvcnQgZW5jb2RpbmdzIHN1Y2ggYXMgeC1nemlwIG9yIHgtZGVmbGF0ZS4KKyAgICAgICAgICAgIGlmIG5vdCBza2lwX2FjY2VwdF9lbmNvZGluZzoKKyAgICAgICAgICAgICAgICBzZWxmLnB1dGhlYWRlcignQWNjZXB0LUVuY29kaW5nJywgJ2lkZW50aXR5JykKKworICAgICAgICAgICAgIyB3ZSBjYW4gYWNjZXB0ICJjaHVua2VkIiBUcmFuc2Zlci1FbmNvZGluZ3MsIGJ1dCBubyBvdGhlcnMKKyAgICAgICAgICAgICMgTk9URTogbm8gVEUgaGVhZGVyIGltcGxpZXMgKm9ubHkqICJjaHVua2VkIgorICAgICAgICAgICAgI3NlbGYucHV0aGVhZGVyKCdURScsICdjaHVua2VkJykKKworICAgICAgICAgICAgIyBpZiBURSBpcyBzdXBwbGllZCBpbiB0aGUgaGVhZGVyLCB0aGVuIGl0IG11c3QgYXBwZWFyIGluIGEKKyAgICAgICAgICAgICMgQ29ubmVjdGlvbiBoZWFkZXIuCisgICAgICAgICAgICAjc2VsZi5wdXRoZWFkZXIoJ0Nvbm5lY3Rpb24nLCAnVEUnKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEZvciBIVFRQLzEuMCwgdGhlIHNlcnZlciB3aWxsIGFzc3VtZSAibm90IGNodW5rZWQiCisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgcHV0aGVhZGVyKHNlbGYsIGhlYWRlciwgKnZhbHVlcyk6CisgICAgICAgICIiIlNlbmQgYSByZXF1ZXN0IGhlYWRlciBsaW5lIHRvIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgRm9yIGV4YW1wbGU6IGgucHV0aGVhZGVyKCdBY2NlcHQnLCAndGV4dC9odG1sJykKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX19zdGF0ZSAhPSBfQ1NfUkVRX1NUQVJURUQ6CisgICAgICAgICAgICByYWlzZSBDYW5ub3RTZW5kSGVhZGVyKCkKKworICAgICAgICBoZHIgPSAnJXM6ICVzJyAlIChoZWFkZXIsICdcclxuXHQnLmpvaW4oW3N0cih2KSBmb3IgdiBpbiB2YWx1ZXNdKSkKKyAgICAgICAgc2VsZi5fb3V0cHV0KGhkcikKKworICAgIGRlZiBlbmRoZWFkZXJzKHNlbGYsIG1lc3NhZ2VfYm9keT1Ob25lKToKKyAgICAgICAgIiIiSW5kaWNhdGUgdGhhdCB0aGUgbGFzdCBoZWFkZXIgbGluZSBoYXMgYmVlbiBzZW50IHRvIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgc2VuZHMgdGhlIHJlcXVlc3QgdG8gdGhlIHNlcnZlci4gIFRoZSBvcHRpb25hbAorICAgICAgICBtZXNzYWdlX2JvZHkgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gcGFzcyBhIG1lc3NhZ2UgYm9keQorICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3QuICBUaGUgbWVzc2FnZSBib2R5IHdpbGwgYmUgc2VudCBpbgorICAgICAgICB0aGUgc2FtZSBwYWNrZXQgYXMgdGhlIG1lc3NhZ2UgaGVhZGVycyBpZiBpdCBpcyBzdHJpbmcsIG90aGVyd2lzZSBpdCBpcworICAgICAgICBzZW50IGFzIGEgc2VwYXJhdGUgcGFja2V0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fX3N0YXRlID09IF9DU19SRVFfU1RBUlRFRDoKKyAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IF9DU19SRVFfU0VOVAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQ2Fubm90U2VuZEhlYWRlcigpCisgICAgICAgIHNlbGYuX3NlbmRfb3V0cHV0KG1lc3NhZ2VfYm9keSkKKworICAgIGRlZiByZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5PU5vbmUsIGhlYWRlcnM9e30pOgorICAgICAgICAiIiJTZW5kIGEgY29tcGxldGUgcmVxdWVzdCB0byB0aGUgc2VydmVyLiIiIgorICAgICAgICBzZWxmLl9zZW5kX3JlcXVlc3QobWV0aG9kLCB1cmwsIGJvZHksIGhlYWRlcnMpCisKKyAgICBkZWYgX3NldF9jb250ZW50X2xlbmd0aChzZWxmLCBib2R5KToKKyAgICAgICAgIyBTZXQgdGhlIGNvbnRlbnQtbGVuZ3RoIGJhc2VkIG9uIHRoZSBib2R5LgorICAgICAgICB0aGVsZW4gPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRoZWxlbiA9IHN0cihsZW4oYm9keSkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIHRlOgorICAgICAgICAgICAgIyBJZiB0aGlzIGlzIGEgZmlsZS1saWtlIG9iamVjdCwgdHJ5IHRvCisgICAgICAgICAgICAjIGZzdGF0IGl0cyBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0aGVsZW4gPSBzdHIob3MuZnN0YXQoYm9keS5maWxlbm8oKSkuc3Rfc2l6ZSkKKyAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICAgICAgICAgICMgRG9uJ3Qgc2VuZCBhIGxlbmd0aCBpZiB0aGlzIGZhaWxlZAorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6IHByaW50ICJDYW5ub3Qgc3RhdCEhIgorCisgICAgICAgIGlmIHRoZWxlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsIHRoZWxlbikKKworICAgIGRlZiBfc2VuZF9yZXF1ZXN0KHNlbGYsIG1ldGhvZCwgdXJsLCBib2R5LCBoZWFkZXJzKToKKyAgICAgICAgIyBIb25vciBleHBsaWNpdGx5IHJlcXVlc3RlZCBIb3N0OiBhbmQgQWNjZXB0LUVuY29kaW5nOiBoZWFkZXJzLgorICAgICAgICBoZWFkZXJfbmFtZXMgPSBkaWN0LmZyb21rZXlzKFtrLmxvd2VyKCkgZm9yIGsgaW4gaGVhZGVyc10pCisgICAgICAgIHNraXBzID0ge30KKyAgICAgICAgaWYgJ2hvc3QnIGluIGhlYWRlcl9uYW1lczoKKyAgICAgICAgICAgIHNraXBzWydza2lwX2hvc3QnXSA9IDEKKyAgICAgICAgaWYgJ2FjY2VwdC1lbmNvZGluZycgaW4gaGVhZGVyX25hbWVzOgorICAgICAgICAgICAgc2tpcHNbJ3NraXBfYWNjZXB0X2VuY29kaW5nJ10gPSAxCisKKyAgICAgICAgc2VsZi5wdXRyZXF1ZXN0KG1ldGhvZCwgdXJsLCAqKnNraXBzKQorCisgICAgICAgIGlmIGJvZHkgaXMgbm90IE5vbmUgYW5kICdjb250ZW50LWxlbmd0aCcgbm90IGluIGhlYWRlcl9uYW1lczoKKyAgICAgICAgICAgIHNlbGYuX3NldF9jb250ZW50X2xlbmd0aChib2R5KQorICAgICAgICBmb3IgaGRyLCB2YWx1ZSBpbiBoZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5wdXRoZWFkZXIoaGRyLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5lbmRoZWFkZXJzKGJvZHkpCisKKyAgICBkZWYgZ2V0cmVzcG9uc2Uoc2VsZiwgYnVmZmVyaW5nPUZhbHNlKToKKyAgICAgICAgIkdldCB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLiIKKworICAgICAgICAjIGlmIGEgcHJpb3IgcmVzcG9uc2UgaGFzIGJlZW4gY29tcGxldGVkLCB0aGVuIGZvcmdldCBhYm91dCBpdC4KKyAgICAgICAgaWYgc2VsZi5fX3Jlc3BvbnNlIGFuZCBzZWxmLl9fcmVzcG9uc2UuaXNjbG9zZWQoKToKKyAgICAgICAgICAgIHNlbGYuX19yZXNwb25zZSA9IE5vbmUKKworICAgICAgICAjCisgICAgICAgICMgaWYgYSBwcmlvciByZXNwb25zZSBleGlzdHMsIHRoZW4gaXQgbXVzdCBiZSBjb21wbGV0ZWQgKG90aGVyd2lzZSwgd2UKKyAgICAgICAgIyBjYW5ub3QgcmVhZCB0aGlzIHJlc3BvbnNlJ3MgaGVhZGVyIHRvIGRldGVybWluZSB0aGUgY29ubmVjdGlvbi1jbG9zZQorICAgICAgICAjIGJlaGF2aW9yKQorICAgICAgICAjCisgICAgICAgICMgbm90ZTogaWYgYSBwcmlvciByZXNwb25zZSBleGlzdGVkLCBidXQgd2FzIGNvbm5lY3Rpb24tY2xvc2UsIHRoZW4gdGhlCisgICAgICAgICMgc29ja2V0IGFuZCByZXNwb25zZSB3ZXJlIG1hZGUgaW5kZXBlbmRlbnQgb2YgdGhpcyBIVFRQQ29ubmVjdGlvbgorICAgICAgICAjIG9iamVjdCBzaW5jZSBhIG5ldyByZXF1ZXN0IHJlcXVpcmVzIHRoYXQgd2Ugb3BlbiBhIHdob2xlIG5ldworICAgICAgICAjIGNvbm5lY3Rpb24KKyAgICAgICAgIworICAgICAgICAjIHRoaXMgbWVhbnMgdGhlIHByaW9yIHJlc3BvbnNlIGhhZCBvbmUgb2YgdHdvIHN0YXRlczoKKyAgICAgICAgIyAgIDEpIHdpbGxfY2xvc2U6IHRoaXMgY29ubmVjdGlvbiB3YXMgcmVzZXQgYW5kIHRoZSBwcmlvciBzb2NrZXQgYW5kCisgICAgICAgICMgICAgICAgICAgICAgICAgICByZXNwb25zZSBvcGVyYXRlIGluZGVwZW5kZW50bHkKKyAgICAgICAgIyAgIDIpIHBlcnNpc3RlbnQ6IHRoZSByZXNwb25zZSB3YXMgcmV0YWluZWQgYW5kIHdlIGF3YWl0IGl0cworICAgICAgICAjICAgICAgICAgICAgICAgICAgaXNjbG9zZWQoKSBzdGF0dXMgdG8gYmVjb21lIHRydWUuCisgICAgICAgICMKKyAgICAgICAgaWYgc2VsZi5fX3N0YXRlICE9IF9DU19SRVFfU0VOVCBvciBzZWxmLl9fcmVzcG9uc2U6CisgICAgICAgICAgICByYWlzZSBSZXNwb25zZU5vdFJlYWR5KCkKKworICAgICAgICBhcmdzID0gKHNlbGYuc29jaywpCisgICAgICAgIGt3ZHMgPSB7InN0cmljdCI6c2VsZi5zdHJpY3QsICJtZXRob2QiOnNlbGYuX21ldGhvZH0KKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIGFyZ3MgKz0gKHNlbGYuZGVidWdsZXZlbCwpCisgICAgICAgIGlmIGJ1ZmZlcmluZzoKKyAgICAgICAgICAgICNvbmx5IGFkZCB0aGlzIGtleXdvcmQgaWYgbm9uLWRlZmF1bHQsIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICAgICAgICAgICNvdGhlciByZXNwb25zZV9jbGFzc2VzLgorICAgICAgICAgICAga3dkc1siYnVmZmVyaW5nIl0gPSBUcnVlOworICAgICAgICByZXNwb25zZSA9IHNlbGYucmVzcG9uc2VfY2xhc3MoKmFyZ3MsICoqa3dkcykKKworICAgICAgICByZXNwb25zZS5iZWdpbigpCisgICAgICAgIGFzc2VydCByZXNwb25zZS53aWxsX2Nsb3NlICE9IF9VTktOT1dOCisgICAgICAgIHNlbGYuX19zdGF0ZSA9IF9DU19JRExFCisKKyAgICAgICAgaWYgcmVzcG9uc2Uud2lsbF9jbG9zZToKKyAgICAgICAgICAgICMgdGhpcyBlZmZlY3RpdmVseSBwYXNzZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlc3BvbnNlCisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgcmVtZW1iZXIgdGhpcywgc28gd2UgY2FuIHRlbGwgd2hlbiBpdCBpcyBjb21wbGV0ZQorICAgICAgICAgICAgc2VsZi5fX3Jlc3BvbnNlID0gcmVzcG9uc2UKKworICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworCitjbGFzcyBIVFRQOgorICAgICJDb21wYXRpYmlsaXR5IGNsYXNzIHdpdGggaHR0cGxpYi5weSBmcm9tIDEuNS4iCisKKyAgICBfaHR0cF92c24gPSAxMAorICAgIF9odHRwX3Zzbl9zdHIgPSAnSFRUUC8xLjAnCisKKyAgICBkZWJ1Z2xldmVsID0gMAorCisgICAgX2Nvbm5lY3Rpb25fY2xhc3MgPSBIVFRQQ29ubmVjdGlvbgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9JycsIHBvcnQ9Tm9uZSwgc3RyaWN0PU5vbmUpOgorICAgICAgICAiUHJvdmlkZSBhIGRlZmF1bHQgaG9zdCwgc2luY2UgdGhlIHN1cGVyY2xhc3MgcmVxdWlyZXMgb25lLiIKKworICAgICAgICAjIHNvbWUgam9rZXIgcGFzc2VkIDAgZXhwbGljaXRseSwgbWVhbmluZyBkZWZhdWx0IHBvcnQKKyAgICAgICAgaWYgcG9ydCA9PSAwOgorICAgICAgICAgICAgcG9ydCA9IE5vbmUKKworICAgICAgICAjIE5vdGUgdGhhdCB3ZSBtYXkgcGFzcyBhbiBlbXB0eSBzdHJpbmcgYXMgdGhlIGhvc3Q7IHRoaXMgd2lsbCByYWlzZQorICAgICAgICAjIGFuIGVycm9yIHdoZW4gd2UgYXR0ZW1wdCB0byBjb25uZWN0LiBQcmVzdW1hYmx5LCB0aGUgY2xpZW50IGNvZGUKKyAgICAgICAgIyB3aWxsIGNhbGwgY29ubmVjdCBiZWZvcmUgdGhlbiwgd2l0aCBhIHByb3BlciBob3N0LgorICAgICAgICBzZWxmLl9zZXR1cChzZWxmLl9jb25uZWN0aW9uX2NsYXNzKGhvc3QsIHBvcnQsIHN0cmljdCkpCisKKyAgICBkZWYgX3NldHVwKHNlbGYsIGNvbm4pOgorICAgICAgICBzZWxmLl9jb25uID0gY29ubgorCisgICAgICAgICMgc2V0IHVwIGRlbGVnYXRpb24gdG8gZmxlc2ggb3V0IGludGVyZmFjZQorICAgICAgICBzZWxmLnNlbmQgPSBjb25uLnNlbmQKKyAgICAgICAgc2VsZi5wdXRyZXF1ZXN0ID0gY29ubi5wdXRyZXF1ZXN0CisgICAgICAgIHNlbGYucHV0aGVhZGVyID0gY29ubi5wdXRoZWFkZXIKKyAgICAgICAgc2VsZi5lbmRoZWFkZXJzID0gY29ubi5lbmRoZWFkZXJzCisgICAgICAgIHNlbGYuc2V0X2RlYnVnbGV2ZWwgPSBjb25uLnNldF9kZWJ1Z2xldmVsCisKKyAgICAgICAgY29ubi5faHR0cF92c24gPSBzZWxmLl9odHRwX3ZzbgorICAgICAgICBjb25uLl9odHRwX3Zzbl9zdHIgPSBzZWxmLl9odHRwX3Zzbl9zdHIKKworICAgICAgICBzZWxmLmZpbGUgPSBOb25lCisKKyAgICBkZWYgY29ubmVjdChzZWxmLCBob3N0PU5vbmUsIHBvcnQ9Tm9uZSk6CisgICAgICAgICJBY2NlcHQgYXJndW1lbnRzIHRvIHNldCB0aGUgaG9zdC9wb3J0LCBzaW5jZSB0aGUgc3VwZXJjbGFzcyBkb2Vzbid0LiIKKworICAgICAgICBpZiBob3N0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fY29ubi5fc2V0X2hvc3Rwb3J0KGhvc3QsIHBvcnQpCisgICAgICAgIHNlbGYuX2Nvbm4uY29ubmVjdCgpCisKKyAgICBkZWYgZ2V0ZmlsZShzZWxmKToKKyAgICAgICAgIlByb3ZpZGUgYSBnZXRmaWxlLCBzaW5jZSB0aGUgc3VwZXJjbGFzcycgZG9lcyBub3QgdXNlIHRoaXMgY29uY2VwdC4iCisgICAgICAgIHJldHVybiBzZWxmLmZpbGUKKworICAgIGRlZiBnZXRyZXBseShzZWxmLCBidWZmZXJpbmc9RmFsc2UpOgorICAgICAgICAiIiJDb21wYXQgZGVmaW5pdGlvbiBzaW5jZSBzdXBlcmNsYXNzIGRvZXMgbm90IGRlZmluZSBpdC4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgY29uc2lzdGluZyBvZjoKKyAgICAgICAgLSBzZXJ2ZXIgc3RhdHVzIGNvZGUgKGUuZy4gJzIwMCcgaWYgYWxsIGdvZXMgd2VsbCkKKyAgICAgICAgLSBzZXJ2ZXIgInJlYXNvbiIgY29ycmVzcG9uZGluZyB0byBzdGF0dXMgY29kZQorICAgICAgICAtIGFueSBSRkM4MjIgaGVhZGVycyBpbiB0aGUgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgYnVmZmVyaW5nOgorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5fY29ubi5nZXRyZXNwb25zZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICNvbmx5IGFkZCB0aGlzIGtleXdvcmQgaWYgbm9uLWRlZmF1bHQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgICAgICAgICAgICAjd2l0aCBvdGhlciBjb25uZWN0aW9uIGNsYXNzZXMKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYuX2Nvbm4uZ2V0cmVzcG9uc2UoYnVmZmVyaW5nKQorICAgICAgICBleGNlcHQgQmFkU3RhdHVzTGluZSwgZToKKyAgICAgICAgICAgICMjIyBobW0uIGlmIGdldHJlc3BvbnNlKCkgZXZlciBjbG9zZXMgdGhlIHNvY2tldCBvbiBhIGJhZCByZXF1ZXN0LAorICAgICAgICAgICAgIyMjIHRoZW4gd2UgYXJlIGdvaW5nIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBzZWxmLnNvY2sKKworICAgICAgICAgICAgIyMjIHNob3VsZCB3ZSBrZWVwIHRoaXMgYmVoYXZpb3I/IGRvIHBlb3BsZSB1c2UgaXQ/CisgICAgICAgICAgICAjIGtlZXAgdGhlIHNvY2tldCBvcGVuIChhcyBhIGZpbGUpLCBhbmQgcmV0dXJuIGl0CisgICAgICAgICAgICBzZWxmLmZpbGUgPSBzZWxmLl9jb25uLnNvY2subWFrZWZpbGUoJ3JiJywgMCkKKworICAgICAgICAgICAgIyBjbG9zZSBvdXIgc29ja2V0IC0tIHdlIHdhbnQgdG8gcmVzdGFydCBhZnRlciBhbnkgcHJvdG9jb2wgZXJyb3IKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmhlYWRlcnMgPSBOb25lCisgICAgICAgICAgICByZXR1cm4gLTEsIGUubGluZSwgTm9uZQorCisgICAgICAgIHNlbGYuaGVhZGVycyA9IHJlc3BvbnNlLm1zZworICAgICAgICBzZWxmLmZpbGUgPSByZXNwb25zZS5mcAorICAgICAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzLCByZXNwb25zZS5yZWFzb24sIHJlc3BvbnNlLm1zZworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9jb25uLmNsb3NlKCkKKworICAgICAgICAjIG5vdGUgdGhhdCBzZWxmLmZpbGUgPT0gcmVzcG9uc2UuZnAsIHdoaWNoIGdldHMgY2xvc2VkIGJ5IHRoZQorICAgICAgICAjIHN1cGVyY2xhc3MuIGp1c3QgY2xlYXIgdGhlIG9iamVjdCByZWYgaGVyZS4KKyAgICAgICAgIyMjIGhtbS4gbWVzc3kuIGlmIHN0YXR1cz09LTEsIHRoZW4gc2VsZi5maWxlIGlzIG93bmVkIGJ5IHVzLgorICAgICAgICAjIyMgd2VsbC4uLiB3ZSBhcmVuJ3QgZXhwbGljaXRseSBjbG9zaW5nLCBidXQgbG9zaW5nIHRoaXMgcmVmIHdpbGwKKyAgICAgICAgIyMjIGRvIGl0CisgICAgICAgIHNlbGYuZmlsZSA9IE5vbmUKKwordHJ5OgorICAgIGltcG9ydCBzc2wKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIEhUVFBTQ29ubmVjdGlvbihIVFRQQ29ubmVjdGlvbik6CisgICAgICAgICJUaGlzIGNsYXNzIGFsbG93cyBjb21tdW5pY2F0aW9uIHZpYSBTU0wuIgorCisgICAgICAgIGRlZmF1bHRfcG9ydCA9IEhUVFBTX1BPUlQKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1Ob25lLCBrZXlfZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1Ob25lLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV9hZGRyZXNzPU5vbmUpOgorICAgICAgICAgICAgSFRUUENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgc3RyaWN0LCB0aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3MpCisgICAgICAgICAgICBzZWxmLmtleV9maWxlID0ga2V5X2ZpbGUKKyAgICAgICAgICAgIHNlbGYuY2VydF9maWxlID0gY2VydF9maWxlCisKKyAgICAgICAgZGVmIGNvbm5lY3Qoc2VsZik6CisgICAgICAgICAgICAiQ29ubmVjdCB0byBhIGhvc3Qgb24gYSBnaXZlbiAoU1NMKSBwb3J0LiIKKworICAgICAgICAgICAgc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoc2VsZi5ob3N0LCBzZWxmLnBvcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXQsIHNlbGYuc291cmNlX2FkZHJlc3MpCisgICAgICAgICAgICBpZiBzZWxmLl90dW5uZWxfaG9zdDoKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2sgPSBzb2NrCisgICAgICAgICAgICAgICAgc2VsZi5fdHVubmVsKCkKKyAgICAgICAgICAgIHNlbGYuc29jayA9IHNzbC53cmFwX3NvY2tldChzb2NrLCBzZWxmLmtleV9maWxlLCBzZWxmLmNlcnRfZmlsZSkKKworICAgIF9fYWxsX18uYXBwZW5kKCJIVFRQU0Nvbm5lY3Rpb24iKQorCisgICAgY2xhc3MgSFRUUFMoSFRUUCk6CisgICAgICAgICIiIkNvbXBhdGliaWxpdHkgd2l0aCAxLjUgaHR0cGxpYiBpbnRlcmZhY2UKKworICAgICAgICBQeXRob24gMS41LjIgZGlkIG5vdCBoYXZlIGFuIEhUVFBTIGNsYXNzLCBidXQgaXQgZGVmaW5lZCBhbgorICAgICAgICBpbnRlcmZhY2UgZm9yIHNlbmRpbmcgaHR0cCByZXF1ZXN0cyB0aGF0IGlzIGFsc28gdXNlZnVsIGZvcgorICAgICAgICBodHRwcy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgX2Nvbm5lY3Rpb25fY2xhc3MgPSBIVFRQU0Nvbm5lY3Rpb24KKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgcG9ydD1Ob25lLCBrZXlfZmlsZT1Ob25lLCBjZXJ0X2ZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1Ob25lKToKKyAgICAgICAgICAgICMgcHJvdmlkZSBhIGRlZmF1bHQgaG9zdCwgcGFzcyB0aGUgWDUwOSBjZXJ0IGluZm8KKworICAgICAgICAgICAgIyB1cmYuIGNvbXBlbnNhdGUgZm9yIGJhZCBpbnB1dC4KKyAgICAgICAgICAgIGlmIHBvcnQgPT0gMDoKKyAgICAgICAgICAgICAgICBwb3J0ID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fc2V0dXAoc2VsZi5fY29ubmVjdGlvbl9jbGFzcyhob3N0LCBwb3J0LCBrZXlfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlLCBzdHJpY3QpKQorCisgICAgICAgICAgICAjIHdlIG5ldmVyIGFjdHVhbGx5IHVzZSB0aGVzZSBmb3IgYW55dGhpbmcsIGJ1dCB3ZSBrZWVwIHRoZW0KKyAgICAgICAgICAgICMgaGVyZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHBvc3QtMS41LjIgQ1ZTLgorICAgICAgICAgICAgc2VsZi5rZXlfZmlsZSA9IGtleV9maWxlCisgICAgICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IGNlcnRfZmlsZQorCisKKyAgICBkZWYgRmFrZVNvY2tldCAoc29jaywgc3Nsb2JqKToKKyAgICAgICAgd2FybmluZ3Mud2FybigiRmFrZVNvY2tldCBpcyBkZXByZWNhdGVkLCBhbmQgd29uJ3QgYmUgaW4gMy54LiAgIiArCisgICAgICAgICAgICAgICAgICAgICAgIlVzZSB0aGUgcmVzdWx0IG9mIHNzbC53cmFwX3NvY2tldCgpIGRpcmVjdGx5IGluc3RlYWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgcmV0dXJuIHNzbG9iagorCisKK2NsYXNzIEhUVFBFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAjIFN1YmNsYXNzZXMgdGhhdCBkZWZpbmUgYW4gX19pbml0X18gbXVzdCBjYWxsIEV4Y2VwdGlvbi5fX2luaXRfXworICAgICMgb3IgZGVmaW5lIHNlbGYuYXJncy4gIE90aGVyd2lzZSwgc3RyKCkgd2lsbCBmYWlsLgorICAgIHBhc3MKKworY2xhc3MgTm90Q29ubmVjdGVkKEhUVFBFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgSW52YWxpZFVSTChIVFRQRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2NsYXNzIFVua25vd25Qcm90b2NvbChIVFRQRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyc2lvbik6CisgICAgICAgIHNlbGYuYXJncyA9IHZlcnNpb24sCisgICAgICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KKworY2xhc3MgVW5rbm93blRyYW5zZmVyRW5jb2RpbmcoSFRUUEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBVbmltcGxlbWVudGVkRmlsZU1vZGUoSFRUUEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBJbmNvbXBsZXRlUmVhZChIVFRQRXhjZXB0aW9uKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFydGlhbCwgZXhwZWN0ZWQ9Tm9uZSk6CisgICAgICAgIHNlbGYuYXJncyA9IHBhcnRpYWwsCisgICAgICAgIHNlbGYucGFydGlhbCA9IHBhcnRpYWwKKyAgICAgICAgc2VsZi5leHBlY3RlZCA9IGV4cGVjdGVkCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmV4cGVjdGVkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZSA9ICcsICVpIG1vcmUgZXhwZWN0ZWQnICUgc2VsZi5leHBlY3RlZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZSA9ICcnCisgICAgICAgIHJldHVybiAnSW5jb21wbGV0ZVJlYWQoJWkgYnl0ZXMgcmVhZCVzKScgJSAobGVuKHNlbGYucGFydGlhbCksIGUpCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiByZXByKHNlbGYpCisKK2NsYXNzIEltcHJvcGVyQ29ubmVjdGlvblN0YXRlKEhUVFBFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgQ2Fubm90U2VuZFJlcXVlc3QoSW1wcm9wZXJDb25uZWN0aW9uU3RhdGUpOgorICAgIHBhc3MKKworY2xhc3MgQ2Fubm90U2VuZEhlYWRlcihJbXByb3BlckNvbm5lY3Rpb25TdGF0ZSk6CisgICAgcGFzcworCitjbGFzcyBSZXNwb25zZU5vdFJlYWR5KEltcHJvcGVyQ29ubmVjdGlvblN0YXRlKToKKyAgICBwYXNzCisKK2NsYXNzIEJhZFN0YXR1c0xpbmUoSFRUUEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmUpOgorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGxpbmUgPSByZXByKGxpbmUpCisgICAgICAgIHNlbGYuYXJncyA9IGxpbmUsCisgICAgICAgIHNlbGYubGluZSA9IGxpbmUKKworY2xhc3MgTGluZVRvb0xvbmcoSFRUUEV4Y2VwdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVfdHlwZSk6CisgICAgICAgIEhUVFBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgImdvdCBtb3JlIHRoYW4gJWQgYnl0ZXMgd2hlbiByZWFkaW5nICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKF9NQVhMSU5FLCBsaW5lX3R5cGUpKQorCisjIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorZXJyb3IgPSBIVFRQRXhjZXB0aW9uCisKK2NsYXNzIExpbmVBbmRGaWxlV3JhcHBlcjoKKyAgICAiIiJBIGxpbWl0ZWQgZmlsZS1saWtlIG9iamVjdCBmb3IgSFRUUC8wLjkgcmVzcG9uc2VzLiIiIgorCisgICAgIyBUaGUgc3RhdHVzLWxpbmUgcGFyc2luZyBjb2RlIGNhbGxzIHJlYWRsaW5lKCksIHdoaWNoIG5vcm1hbGx5CisgICAgIyBnZXQgdGhlIEhUVFAgc3RhdHVzIGxpbmUuICBGb3IgYSAwLjkgcmVzcG9uc2UsIGhvd2V2ZXIsIHRoaXMgaXMKKyAgICAjIGFjdHVhbGx5IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBib2R5ISAgQ2xpZW50cyBuZWVkIHRvIGdldCBhCisgICAgIyByZWFkYWJsZSBmaWxlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoYXQgbGluZS4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lLCBmaWxlKToKKyAgICAgICAgc2VsZi5fbGluZSA9IGxpbmUKKyAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5fbGluZV9jb25zdW1lZCA9IDAKKyAgICAgICAgc2VsZi5fbGluZV9vZmZzZXQgPSAwCisgICAgICAgIHNlbGYuX2xpbmVfbGVmdCA9IGxlbihsaW5lKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9maWxlLCBhdHRyKQorCisgICAgZGVmIF9kb25lKHNlbGYpOgorICAgICAgICAjIGNhbGxlZCB3aGVuIHRoZSBsYXN0IGJ5dGUgaXMgcmVhZCBmcm9tIHRoZSBsaW5lLiAgQWZ0ZXIgdGhlCisgICAgICAgICMgY2FsbCwgYWxsIHJlYWQgbWV0aG9kcyBhcmUgZGVsZWdhdGVkIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUKKyAgICAgICAgIyBvYmplY3QuCisgICAgICAgIHNlbGYuX2xpbmVfY29uc3VtZWQgPSAxCisgICAgICAgIHNlbGYucmVhZCA9IHNlbGYuX2ZpbGUucmVhZAorICAgICAgICBzZWxmLnJlYWRsaW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZQorICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IHNlbGYuX2ZpbGUucmVhZGxpbmVzCisKKyAgICBkZWYgcmVhZChzZWxmLCBhbXQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuX2xpbmVfY29uc3VtZWQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5yZWFkKGFtdCkKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xpbmVfbGVmdAorICAgICAgICBpZiBhbXQgaXMgTm9uZSBvciBhbXQgPiBzZWxmLl9saW5lX2xlZnQ6CisgICAgICAgICAgICBzID0gc2VsZi5fbGluZVtzZWxmLl9saW5lX29mZnNldDpdCisgICAgICAgICAgICBzZWxmLl9kb25lKCkKKyAgICAgICAgICAgIGlmIGFtdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBzICsgc2VsZi5fZmlsZS5yZWFkKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHMgKyBzZWxmLl9maWxlLnJlYWQoYW10IC0gbGVuKHMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IGFtdCA8PSBzZWxmLl9saW5lX2xlZnQKKyAgICAgICAgICAgIGkgPSBzZWxmLl9saW5lX29mZnNldAorICAgICAgICAgICAgaiA9IGkgKyBhbXQKKyAgICAgICAgICAgIHMgPSBzZWxmLl9saW5lW2k6al0KKyAgICAgICAgICAgIHNlbGYuX2xpbmVfb2Zmc2V0ID0gagorICAgICAgICAgICAgc2VsZi5fbGluZV9sZWZ0IC09IGFtdAorICAgICAgICAgICAgaWYgc2VsZi5fbGluZV9sZWZ0ID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9uZSgpCisgICAgICAgICAgICByZXR1cm4gcworCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9saW5lX2NvbnN1bWVkOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBhc3NlcnQgc2VsZi5fbGluZV9sZWZ0CisgICAgICAgIHMgPSBzZWxmLl9saW5lW3NlbGYuX2xpbmVfb2Zmc2V0Ol0KKyAgICAgICAgc2VsZi5fZG9uZSgpCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemU9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuX2xpbmVfY29uc3VtZWQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5yZWFkbGluZXMoc2l6ZSkKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2xpbmVfbGVmdAorICAgICAgICBMID0gW3NlbGYuX2xpbmVbc2VsZi5fbGluZV9vZmZzZXQ6XV0KKyAgICAgICAgc2VsZi5fZG9uZSgpCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBMICsgc2VsZi5fZmlsZS5yZWFkbGluZXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEwgKyBzZWxmLl9maWxlLnJlYWRsaW5lcyhzaXplKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9odHRwbGliLnB5YyBiL2xpYi9weXRob24yLjcvaHR0cGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkZDlhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaHR0cGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9odHRwbGliLnB5byBiL2xpYi9weXRob24yLjcvaHR0cGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyNTZlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaHR0cGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZS5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUxNzMyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGUucHkKQEAgLTAsMCArMSwyMjcgQEAKKyIiIkF1dG9Db21wbGV0ZS5weSAtIEFuIElETEUgZXh0ZW5zaW9uIGZvciBhdXRvbWF0aWNhbGx5IGNvbXBsZXRpbmcgbmFtZXMuCisKK1RoaXMgZXh0ZW5zaW9uIGNhbiBjb21wbGV0ZSBlaXRoZXIgYXR0cmlidXRlIG5hbWVzIG9mIGZpbGUgbmFtZXMuIEl0IGNhbiBwb3AKK2Egd2luZG93IHdpdGggYWxsIGF2YWlsYWJsZSBuYW1lcywgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCBmcm9tLgorIiIiCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJpbmcKKworZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKKyMgVGhpcyBzdHJpbmcgaW5jbHVkZXMgYWxsIGNoYXJzIHRoYXQgbWF5IGJlIGluIGEgZmlsZSBuYW1lICh3aXRob3V0IGEgcGF0aAorIyBzZXBhcmF0b3IpCitGSUxFTkFNRV9DSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArIG9zLmN1cmRpciArICIuX34jJDotIgorIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgaW4gYW4gaWRlbnRpZmllcgorSURfQ0hBUlMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiXyIKKworIyBUaGVzZSBjb25zdGFudHMgcmVwcmVzZW50IHRoZSB0d28gZGlmZmVyZW50IHR5cGVzIG9mIGNvbXBsZXRpb25zCitDT01QTEVURV9BVFRSSUJVVEVTLCBDT01QTEVURV9GSUxFUyA9IHJhbmdlKDEsIDIrMSkKKworZnJvbSBpZGxlbGliIGltcG9ydCBBdXRvQ29tcGxldGVXaW5kb3cKK2Zyb20gaWRsZWxpYi5IeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKKworaW1wb3J0IF9fbWFpbl9fCisKK1NFUFMgPSBvcy5zZXAKK2lmIG9zLmFsdHNlcDogICMgZS5nLiAnLycgb24gV2luZG93cy4uLgorICAgIFNFUFMgKz0gb3MuYWx0c2VwCisKK2NsYXNzIEF1dG9Db21wbGV0ZToKKworICAgIG1lbnVkZWZzID0gWworICAgICAgICAoJ2VkaXQnLCBbCisgICAgICAgICAgICAoIlNob3cgQ29tcGxldGlvbnMiLCAiPDxmb3JjZS1vcGVuLWNvbXBsZXRpb25zPj4iKSwKKyAgICAgICAgXSkKKyAgICBdCisKKyAgICBwb3B1cHdhaXQgPSBpZGxlQ29uZi5HZXRPcHRpb24oImV4dGVuc2lvbnMiLCAiQXV0b0NvbXBsZXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBvcHVwd2FpdCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luPU5vbmUpOgorICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCisgICAgICAgIGlmIGVkaXR3aW4gaXMgTm9uZTogICMgc3VicHJvY2VzcyBhbmQgdGVzdAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudGV4dCA9IGVkaXR3aW4udGV4dAorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyA9IE5vbmUKKworICAgICAgICAjIGlkIG9mIGRlbGF5ZWQgY2FsbCwgYW5kIHRoZSBpbmRleCBvZiB0aGUgdGV4dCBpbnNlcnQgd2hlbiB0aGUgZGVsYXllZAorICAgICAgICAjIGNhbGwgd2FzIGlzc3VlZC4gSWYgX2RlbGF5ZWRfY29tcGxldGlvbl9pZCBpcyBOb25lLCB0aGVyZSBpcyBubworICAgICAgICAjIGRlbGF5ZWQgY2FsbC4KKyAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkID0gTm9uZQorICAgICAgICBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faW5kZXggPSBOb25lCisKKyAgICBkZWYgX21ha2VfYXV0b2NvbXBsZXRlX3dpbmRvdyhzZWxmKToKKyAgICAgICAgcmV0dXJuIEF1dG9Db21wbGV0ZVdpbmRvdy5BdXRvQ29tcGxldGVXaW5kb3coc2VsZi50ZXh0KQorCisgICAgZGVmIF9yZW1vdmVfYXV0b2NvbXBsZXRlX3dpbmRvdyhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5hdXRvY29tcGxldGV3aW5kb3c6CisgICAgICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdy5oaWRlX3dpbmRvdygpCisgICAgICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyA9IE5vbmUKKworICAgIGRlZiBmb3JjZV9vcGVuX2NvbXBsZXRpb25zX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiSGFwcGVucyB3aGVuIHRoZSB1c2VyIHJlYWxseSB3YW50cyB0byBvcGVuIGEgY29tcGxldGlvbiBsaXN0LCBldmVuCisgICAgICAgIGlmIGEgZnVuY3Rpb24gY2FsbCBpcyBuZWVkZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm9wZW5fY29tcGxldGlvbnMoVHJ1ZSwgRmFsc2UsIFRydWUpCisKKyAgICBkZWYgdHJ5X29wZW5fY29tcGxldGlvbnNfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJIYXBwZW5zIHdoZW4gaXQgd291bGQgYmUgbmljZSB0byBvcGVuIGEgY29tcGxldGlvbiBsaXN0LCBidXQgbm90CisgICAgICAgIHJlYWxseSBuZWNlc3NhcnksIGZvciBleGFtcGxlIGFmdGVyIGFuIGRvdCwgc28gZnVuY3Rpb24KKyAgICAgICAgY2FsbHMgd29uJ3QgYmUgbWFkZS4KKyAgICAgICAgIiIiCisgICAgICAgIGxhc3RjaGFyID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0LTFjIikKKyAgICAgICAgaWYgbGFzdGNoYXIgPT0gIi4iOgorICAgICAgICAgICAgc2VsZi5fb3Blbl9jb21wbGV0aW9uc19sYXRlcihGYWxzZSwgRmFsc2UsIEZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT01QTEVURV9BVFRSSUJVVEVTKQorICAgICAgICBlbGlmIGxhc3RjaGFyIGluIFNFUFM6CisgICAgICAgICAgICBzZWxmLl9vcGVuX2NvbXBsZXRpb25zX2xhdGVyKEZhbHNlLCBGYWxzZSwgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTVBMRVRFX0ZJTEVTKQorCisgICAgZGVmIGF1dG9jb21wbGV0ZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICIiIkhhcHBlbnMgd2hlbiB0aGUgdXNlciB3YW50cyB0byBjb21wbGV0ZSBoaXMgd29yZCwgYW5kIGlmIG5lY2Vzc2FyeSwKKyAgICAgICAgb3BlbiBhIGNvbXBsZXRpb24gbGlzdCBhZnRlciB0aGF0IChpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lCisgICAgICAgIGNvbXBsZXRpb24pCisgICAgICAgICIiIgorICAgICAgICBpZiBoYXNhdHRyKGV2ZW50LCAibWNfc3RhdGUiKSBhbmQgZXZlbnQubWNfc3RhdGU6CisgICAgICAgICAgICAjIEEgbW9kaWZpZXIgd2FzIHByZXNzZWQgYWxvbmcgd2l0aCB0aGUgdGFiLCBjb250aW51ZSBhcyB1c3VhbC4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyBhbmQgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdy5jb21wbGV0ZSgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3BlbmVkID0gc2VsZi5vcGVuX2NvbXBsZXRpb25zKEZhbHNlLCBUcnVlLCBUcnVlKQorICAgICAgICAgICAgaWYgb3BlbmVkOgorICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgX29wZW5fY29tcGxldGlvbnNfbGF0ZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faW5kZXggPSBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpCisgICAgICAgIGlmIHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGV4dC5hZnRlcl9jYW5jZWwoc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkKQorICAgICAgICBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faWQgPSBcCisgICAgICAgICAgICBzZWxmLnRleHQuYWZ0ZXIoc2VsZi5wb3B1cHdhaXQsIHNlbGYuX2RlbGF5ZWRfb3Blbl9jb21wbGV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJncykKKworICAgIGRlZiBfZGVsYXllZF9vcGVuX2NvbXBsZXRpb25zKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkID0gTm9uZQorICAgICAgICBpZiBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpICE9IHNlbGYuX2RlbGF5ZWRfY29tcGxldGlvbl9pbmRleDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm9wZW5fY29tcGxldGlvbnMoKmFyZ3MpCisKKyAgICBkZWYgb3Blbl9jb21wbGV0aW9ucyhzZWxmLCBldmFsZnVuY3MsIGNvbXBsZXRlLCB1c2VyV2FudHNXaW4sIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIkZpbmQgdGhlIGNvbXBsZXRpb25zIGFuZCBjcmVhdGUgdGhlIEF1dG9Db21wbGV0ZVdpbmRvdy4KKyAgICAgICAgUmV0dXJuIFRydWUgaWYgc3VjY2Vzc2Z1bCAobm8gc3ludGF4IGVycm9yIG9yIHNvIGZvdW5kKS4KKyAgICAgICAgaWYgY29tcGxldGUgaXMgVHJ1ZSwgdGhlbiBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gY29tcGxldGUgYW5kIG5vCisgICAgICAgIHN0YXJ0IG9mIGNvbXBsZXRpb24sIHdvbid0IG9wZW4gY29tcGxldGlvbnMgYW5kIHJldHVybiBGYWxzZS4KKyAgICAgICAgSWYgbW9kZSBpcyBnaXZlbiwgd2lsbCBvcGVuIGEgY29tcGxldGlvbiBsaXN0IG9ubHkgaW4gdGhpcyBtb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgIyBDYW5jZWwgYW5vdGhlciBkZWxheWVkIGNhbGwsIGlmIGl0IGV4aXN0cy4KKyAgICAgICAgaWYgc2VsZi5fZGVsYXllZF9jb21wbGV0aW9uX2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50ZXh0LmFmdGVyX2NhbmNlbChzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faWQpCisgICAgICAgICAgICBzZWxmLl9kZWxheWVkX2NvbXBsZXRpb25faWQgPSBOb25lCisKKyAgICAgICAgaHAgPSBIeXBlclBhcnNlcihzZWxmLmVkaXR3aW4sICJpbnNlcnQiKQorICAgICAgICBjdXJsaW5lID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKQorICAgICAgICBpID0gaiA9IGxlbihjdXJsaW5lKQorICAgICAgICBpZiBocC5pc19pbl9zdHJpbmcoKSBhbmQgKG5vdCBtb2RlIG9yIG1vZGU9PUNPTVBMRVRFX0ZJTEVTKToKKyAgICAgICAgICAgIHNlbGYuX3JlbW92ZV9hdXRvY29tcGxldGVfd2luZG93KCkKKyAgICAgICAgICAgIG1vZGUgPSBDT01QTEVURV9GSUxFUworICAgICAgICAgICAgd2hpbGUgaSBhbmQgY3VybGluZVtpLTFdIGluIEZJTEVOQU1FX0NIQVJTOgorICAgICAgICAgICAgICAgIGkgLT0gMQorICAgICAgICAgICAgY29tcF9zdGFydCA9IGN1cmxpbmVbaTpqXQorICAgICAgICAgICAgaiA9IGkKKyAgICAgICAgICAgIHdoaWxlIGkgYW5kIGN1cmxpbmVbaS0xXSBpbiBGSUxFTkFNRV9DSEFSUyArIFNFUFM6CisgICAgICAgICAgICAgICAgaSAtPSAxCisgICAgICAgICAgICBjb21wX3doYXQgPSBjdXJsaW5lW2k6al0KKyAgICAgICAgZWxpZiBocC5pc19pbl9jb2RlKCkgYW5kIChub3QgbW9kZSBvciBtb2RlPT1DT01QTEVURV9BVFRSSUJVVEVTKToKKyAgICAgICAgICAgIHNlbGYuX3JlbW92ZV9hdXRvY29tcGxldGVfd2luZG93KCkKKyAgICAgICAgICAgIG1vZGUgPSBDT01QTEVURV9BVFRSSUJVVEVTCisgICAgICAgICAgICB3aGlsZSBpIGFuZCBjdXJsaW5lW2ktMV0gaW4gSURfQ0hBUlM6CisgICAgICAgICAgICAgICAgaSAtPSAxCisgICAgICAgICAgICBjb21wX3N0YXJ0ID0gY3VybGluZVtpOmpdCisgICAgICAgICAgICBpZiBpIGFuZCBjdXJsaW5lW2ktMV0gPT0gJy4nOgorICAgICAgICAgICAgICAgIGhwLnNldF9pbmRleCgiaW5zZXJ0LSVkYyIgJSAobGVuKGN1cmxpbmUpLShpLTEpKSkKKyAgICAgICAgICAgICAgICBjb21wX3doYXQgPSBocC5nZXRfZXhwcmVzc2lvbigpCisgICAgICAgICAgICAgICAgaWYgbm90IGNvbXBfd2hhdCBvciBcCisgICAgICAgICAgICAgICAgICAgKG5vdCBldmFsZnVuY3MgYW5kIGNvbXBfd2hhdC5maW5kKCcoJykgIT0gLTEpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tcF93aGF0ID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIGNvbXBsZXRlIGFuZCBub3QgY29tcF93aGF0IGFuZCBub3QgY29tcF9zdGFydDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjb21wX2xpc3RzID0gc2VsZi5mZXRjaF9jb21wbGV0aW9ucyhjb21wX3doYXQsIG1vZGUpCisgICAgICAgIGlmIG5vdCBjb21wX2xpc3RzWzBdOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93ID0gc2VsZi5fbWFrZV9hdXRvY29tcGxldGVfd2luZG93KCkKKyAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cuc2hvd193aW5kb3coY29tcF9saXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc2VydC0lZGMiICUgbGVuKGNvbXBfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcldhbnRzV2luKQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGZldGNoX2NvbXBsZXRpb25zKHNlbGYsIHdoYXQsIG1vZGUpOgorICAgICAgICAiIiJSZXR1cm4gYSBwYWlyIG9mIGxpc3RzIG9mIGNvbXBsZXRpb25zIGZvciBzb21ldGhpbmcuIFRoZSBmaXJzdCBsaXN0CisgICAgICAgIGlzIGEgc3VibGlzdCBvZiB0aGUgc2Vjb25kLiBCb3RoIGFyZSBzb3J0ZWQuCisKKyAgICAgICAgSWYgdGhlcmUgaXMgYSBQeXRob24gc3VicHJvY2VzcywgZ2V0IHRoZSBjb21wLiBsaXN0IHRoZXJlLiAgT3RoZXJ3aXNlLAorICAgICAgICBlaXRoZXIgZmV0Y2hfY29tcGxldGlvbnMoKSBpcyBydW5uaW5nIGluIHRoZSBzdWJwcm9jZXNzIGl0c2VsZiBvciBpdAorICAgICAgICB3YXMgY2FsbGVkIGluIGFuIElETEUgRWRpdG9yV2luZG93IGJlZm9yZSBhbnkgc2NyaXB0IGhhZCBiZWVuIHJ1bi4KKworICAgICAgICBUaGUgc3VicHJvY2VzcyBlbnZpcm9ubWVudCBpcyB0aGF0IG9mIHRoZSBtb3N0IHJlY2VudGx5IHJ1biBzY3JpcHQuICBJZgorICAgICAgICB0d28gdW5yZWxhdGVkIG1vZHVsZXMgYXJlIGJlaW5nIGVkaXRlZCBzb21lIGNhbGx0aXBzIGluIHRoZSBjdXJyZW50CisgICAgICAgIG1vZHVsZSBtYXkgYmUgaW5vcGVyYXRpdmUgaWYgdGhlIG1vZHVsZSB3YXMgbm90IHRoZSBsYXN0IHRvIHJ1bi4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJwY2NsdCA9IHNlbGYuZWRpdHdpbi5mbGlzdC5weXNoZWxsLmludGVycC5ycGNjbHQKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcnBjY2x0ID0gTm9uZQorICAgICAgICBpZiBycGNjbHQ6CisgICAgICAgICAgICByZXR1cm4gcnBjY2x0LnJlbW90ZWNhbGwoImV4ZWMiLCAiZ2V0X3RoZV9jb21wbGV0aW9uX2xpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGF0LCBtb2RlKSwge30pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBtb2RlID09IENPTVBMRVRFX0FUVFJJQlVURVM6CisgICAgICAgICAgICAgICAgaWYgd2hhdCA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlID0gX19tYWluX18uX19kaWN0X18uY29weSgpCisgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZS51cGRhdGUoX19tYWluX18uX19idWlsdGluc19fLl9fZGljdF9fKQorICAgICAgICAgICAgICAgICAgICBiaWdsID0gZXZhbCgiZGlyKCkiLCBuYW1lc3BhY2UpCisgICAgICAgICAgICAgICAgICAgIGJpZ2wuc29ydCgpCisgICAgICAgICAgICAgICAgICAgIGlmICJfX2FsbF9fIiBpbiBiaWdsOgorICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gc29ydGVkKGV2YWwoIl9fYWxsX18iLCBuYW1lc3BhY2UpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc21hbGxsID0gW3MgZm9yIHMgaW4gYmlnbCBpZiBzWzoxXSAhPSAnXyddCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5ID0gc2VsZi5nZXRfZW50aXR5KHdoYXQpCisgICAgICAgICAgICAgICAgICAgICAgICBiaWdsID0gZGlyKGVudGl0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpZ2wuc29ydCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAiX19hbGxfXyIgaW4gYmlnbDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbWFsbGwgPSBzb3J0ZWQoZW50aXR5Ll9fYWxsX18pCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNtYWxsbCA9IFtzIGZvciBzIGluIGJpZ2wgaWYgc1s6MV0gIT0gJ18nXQorICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10sIFtdCisKKyAgICAgICAgICAgIGVsaWYgbW9kZSA9PSBDT01QTEVURV9GSUxFUzoKKyAgICAgICAgICAgICAgICBpZiB3aGF0ID09ICIiOgorICAgICAgICAgICAgICAgICAgICB3aGF0ID0gIi4iCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBleHBhbmRlZHBhdGggPSBvcy5wYXRoLmV4cGFuZHVzZXIod2hhdCkKKyAgICAgICAgICAgICAgICAgICAgYmlnbCA9IG9zLmxpc3RkaXIoZXhwYW5kZWRwYXRoKQorICAgICAgICAgICAgICAgICAgICBiaWdsLnNvcnQoKQorICAgICAgICAgICAgICAgICAgICBzbWFsbGwgPSBbcyBmb3IgcyBpbiBiaWdsIGlmIHNbOjFdICE9ICcuJ10KKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdLCBbXQorCisgICAgICAgICAgICBpZiBub3Qgc21hbGxsOgorICAgICAgICAgICAgICAgIHNtYWxsbCA9IGJpZ2wKKyAgICAgICAgICAgIHJldHVybiBzbWFsbGwsIGJpZ2wKKworICAgIGRlZiBnZXRfZW50aXR5KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJMb29rdXAgbmFtZSBpbiBhIG5hbWVzcGFjZSBzcGFubmluZyBzeXMubW9kdWxlcyBhbmQgX19tYWluLmRpY3RfXyIiIgorICAgICAgICBuYW1lc3BhY2UgPSBzeXMubW9kdWxlcy5jb3B5KCkKKyAgICAgICAgbmFtZXNwYWNlLnVwZGF0ZShfX21haW5fXy5fX2RpY3RfXykKKyAgICAgICAgcmV0dXJuIGV2YWwobmFtZSwgbmFtZXNwYWNlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZS5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDE0OTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZS5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDE0OTc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4MTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvQ29tcGxldGVXaW5kb3cucHkKQEAgLTAsMCArMSw0MDUgQEAKKyIiIgorQW4gYXV0by1jb21wbGV0aW9uIHdpbmRvdyBmb3IgSURMRSwgdXNlZCBieSB0aGUgQXV0b0NvbXBsZXRlIGV4dGVuc2lvbgorIiIiCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gaWRsZWxpYi5NdWx0aUNhbGwgaW1wb3J0IE1DX1NISUZUCitmcm9tIGlkbGVsaWIuQXV0b0NvbXBsZXRlIGltcG9ydCBDT01QTEVURV9GSUxFUywgQ09NUExFVEVfQVRUUklCVVRFUworCitISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSA9ICI8PGF1dG9jb21wbGV0ZXdpbmRvdy1oaWRlPj4iCitISURFX1NFUVVFTkNFUyA9ICgiPEZvY3VzT3V0PiIsICI8QnV0dG9uUHJlc3M+IikKK0tFWVBSRVNTX1ZJUlRVQUxfRVZFTlRfTkFNRSA9ICI8PGF1dG9jb21wbGV0ZXdpbmRvdy1rZXlwcmVzcz4+IgorIyBXZSBuZWVkIHRvIGJpbmQgZXZlbnQgYmV5b25kIDxLZXk+IHNvIHRoYXQgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCisjIGJlZm9yZSB0aGUgZGVmYXVsdCBzcGVjaWZpYyBJRExFIGZ1bmN0aW9uCitLRVlQUkVTU19TRVFVRU5DRVMgPSAoIjxLZXk+IiwgIjxLZXktQmFja1NwYWNlPiIsICI8S2V5LVJldHVybj4iLCAiPEtleS1UYWI+IiwKKyAgICAgICAgICAgICAgICAgICAgICAiPEtleS1VcD4iLCAiPEtleS1Eb3duPiIsICI8S2V5LUhvbWU+IiwgIjxLZXktRW5kPiIsCisgICAgICAgICAgICAgICAgICAgICAgIjxLZXktUHJpb3I+IiwgIjxLZXktTmV4dD4iKQorS0VZUkVMRUFTRV9WSVJUVUFMX0VWRU5UX05BTUUgPSAiPDxhdXRvY29tcGxldGV3aW5kb3cta2V5cmVsZWFzZT4+IgorS0VZUkVMRUFTRV9TRVFVRU5DRSA9ICI8S2V5UmVsZWFzZT4iCitMSVNUVVBEQVRFX1NFUVVFTkNFID0gIjxCMS1CdXR0b25SZWxlYXNlPiIKK1dJTkNPTkZJR19TRVFVRU5DRSA9ICI8Q29uZmlndXJlPiIKK0RPVUJMRUNMSUNLX1NFUVVFTkNFID0gIjxCMS1Eb3VibGUtQnV0dG9uUmVsZWFzZT4iCisKK2NsYXNzIEF1dG9Db21wbGV0ZVdpbmRvdzoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aWRnZXQpOgorICAgICAgICAjIFRoZSB3aWRnZXQgKFRleHQpIG9uIHdoaWNoIHdlIHBsYWNlIHRoZSBBdXRvQ29tcGxldGVXaW5kb3cKKyAgICAgICAgc2VsZi53aWRnZXQgPSB3aWRnZXQKKyAgICAgICAgIyBUaGUgd2lkZ2V0cyB3ZSBjcmVhdGUKKyAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cgPSBzZWxmLmxpc3Rib3ggPSBzZWxmLnNjcm9sbGJhciA9IE5vbmUKKyAgICAgICAgIyBUaGUgZGVmYXVsdCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIG9mIGEgc2VsZWN0aW9uLiBTYXZlZCBiZWNhdXNlCisgICAgICAgICMgdGhleSBhcmUgY2hhbmdlZCB0byB0aGUgcmVndWxhciBjb2xvcnMgb2YgbGlzdCBpdGVtcyB3aGVuIHRoZQorICAgICAgICAjIGNvbXBsZXRpb24gc3RhcnQgaXMgbm90IGEgcHJlZml4IG9mIHRoZSBzZWxlY3RlZCBjb21wbGV0aW9uCisgICAgICAgIHNlbGYub3JpZ3NlbGZvcmVncm91bmQgPSBzZWxmLm9yaWdzZWxiYWNrZ3JvdW5kID0gTm9uZQorICAgICAgICAjIFRoZSBsaXN0IG9mIGNvbXBsZXRpb25zCisgICAgICAgIHNlbGYuY29tcGxldGlvbnMgPSBOb25lCisgICAgICAgICMgQSBsaXN0IHdpdGggbW9yZSBjb21wbGV0aW9ucywgb3IgTm9uZQorICAgICAgICBzZWxmLm1vcmVjb21wbGV0aW9ucyA9IE5vbmUKKyAgICAgICAgIyBUaGUgY29tcGxldGlvbiBtb2RlLiBFaXRoZXIgQXV0b0NvbXBsZXRlLkNPTVBMRVRFX0FUVFJJQlVURVMgb3IKKyAgICAgICAgIyBBdXRvQ29tcGxldGUuQ09NUExFVEVfRklMRVMKKyAgICAgICAgc2VsZi5tb2RlID0gTm9uZQorICAgICAgICAjIFRoZSBjdXJyZW50IGNvbXBsZXRpb24gc3RhcnQsIG9uIHRoZSB0ZXh0IGJveCAoYSBzdHJpbmcpCisgICAgICAgIHNlbGYuc3RhcnQgPSBOb25lCisgICAgICAgICMgVGhlIGluZGV4IG9mIHRoZSBzdGFydCBvZiB0aGUgY29tcGxldGlvbgorICAgICAgICBzZWxmLnN0YXJ0aW5kZXggPSBOb25lCisgICAgICAgICMgVGhlIGxhc3QgdHlwZWQgc3RhcnQsIHVzZWQgc28gdGhhdCB3aGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcywKKyAgICAgICAgIyB0aGUgbmV3IHN0YXJ0IHdpbGwgYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIGxhc3QgdHlwZWQgb25lLgorICAgICAgICBzZWxmLmxhc3R0eXBlZHN0YXJ0ID0gTm9uZQorICAgICAgICAjIERvIHdlIGhhdmUgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSB1c2VyIHdhbnRzIHRoZSBjb21wbGV0aW9uIHdpbmRvdworICAgICAgICAjIChmb3IgZXhhbXBsZSwgaGUgY2xpY2tlZCB0aGUgbGlzdCkKKyAgICAgICAgc2VsZi51c2Vyd2FudHN3aW5kb3cgPSBOb25lCisgICAgICAgICMgZXZlbnQgaWRzCisgICAgICAgIHNlbGYuaGlkZWlkID0gc2VsZi5rZXlwcmVzc2lkID0gc2VsZi5saXN0dXBkYXRlaWQgPSBzZWxmLndpbmNvbmZpZ2lkIFwKKyAgICAgICAgPSBzZWxmLmtleXJlbGVhc2VpZCA9IHNlbGYuZG91YmxlY2xpY2tpZCAgICAgICAgICAgICAgICAgICAgICAgICA9IE5vbmUKKyAgICAgICAgIyBGbGFnIHNldCBpZiBsYXN0IGtleXByZXNzIHdhcyBhIHRhYgorICAgICAgICBzZWxmLmxhc3RrZXlfd2FzX3RhYiA9IEZhbHNlCisKKyAgICBkZWYgX2NoYW5nZV9zdGFydChzZWxmLCBuZXdzdGFydCk6CisgICAgICAgIG1pbl9sZW4gPSBtaW4obGVuKHNlbGYuc3RhcnQpLCBsZW4obmV3c3RhcnQpKQorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBpIDwgbWluX2xlbiBhbmQgc2VsZi5zdGFydFtpXSA9PSBuZXdzdGFydFtpXToKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBpZiBpIDwgbGVuKHNlbGYuc3RhcnQpOgorICAgICAgICAgICAgc2VsZi53aWRnZXQuZGVsZXRlKCIlcyslZGMiICUgKHNlbGYuc3RhcnRpbmRleCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKyVkYyIgJSAoc2VsZi5zdGFydGluZGV4LCBsZW4oc2VsZi5zdGFydCkpKQorICAgICAgICBpZiBpIDwgbGVuKG5ld3N0YXJ0KToKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0Lmluc2VydCgiJXMrJWRjIiAlIChzZWxmLnN0YXJ0aW5kZXgsIGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3N0YXJ0W2k6XSkKKyAgICAgICAgc2VsZi5zdGFydCA9IG5ld3N0YXJ0CisKKyAgICBkZWYgX2JpbmFyeV9zZWFyY2goc2VsZiwgcyk6CisgICAgICAgICIiIkZpbmQgdGhlIGZpcnN0IGluZGV4IGluIHNlbGYuY29tcGxldGlvbnMgd2hlcmUgY29tcGxldGlvbnNbaV0gaXMKKyAgICAgICAgZ3JlYXRlciBvciBlcXVhbCB0byBzLCBvciB0aGUgbGFzdCBpbmRleCBpZiB0aGVyZSBpcyBubyBzdWNoCisgICAgICAgIG9uZS4iIiIKKyAgICAgICAgaSA9IDA7IGogPSBsZW4oc2VsZi5jb21wbGV0aW9ucykKKyAgICAgICAgd2hpbGUgaiA+IGk6CisgICAgICAgICAgICBtID0gKGkgKyBqKSAvLyAyCisgICAgICAgICAgICBpZiBzZWxmLmNvbXBsZXRpb25zW21dID49IHM6CisgICAgICAgICAgICAgICAgaiA9IG0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaSA9IG0gKyAxCisgICAgICAgIHJldHVybiBtaW4oaSwgbGVuKHNlbGYuY29tcGxldGlvbnMpLTEpCisKKyAgICBkZWYgX2NvbXBsZXRlX3N0cmluZyhzZWxmLCBzKToKKyAgICAgICAgIiIiQXNzdW1pbmcgdGhhdCBzIGlzIHRoZSBwcmVmaXggb2YgYSBzdHJpbmcgaW4gc2VsZi5jb21wbGV0aW9ucywKKyAgICAgICAgcmV0dXJuIHRoZSBsb25nZXN0IHN0cmluZyB3aGljaCBpcyBhIHByZWZpeCBvZiBhbGwgdGhlIHN0cmluZ3Mgd2hpY2gKKyAgICAgICAgcyBpcyBhIHByZWZpeCBvZiB0aGVtLiBJZiBzIGlzIG5vdCBhIHByZWZpeCBvZiBhIHN0cmluZywgcmV0dXJuIHMuIiIiCisgICAgICAgIGZpcnN0ID0gc2VsZi5fYmluYXJ5X3NlYXJjaChzKQorICAgICAgICBpZiBzZWxmLmNvbXBsZXRpb25zW2ZpcnN0XVs6bGVuKHMpXSAhPSBzOgorICAgICAgICAgICAgIyBUaGVyZSBpcyBub3QgZXZlbiBvbmUgY29tcGxldGlvbiB3aGljaCBzIGlzIGEgcHJlZml4IG9mLgorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgIyBGaW5kIHRoZSBlbmQgb2YgdGhlIHJhbmdlIG9mIGNvbXBsZXRpb25zIHdoZXJlIHMgaXMgYSBwcmVmaXggb2YuCisgICAgICAgIGkgPSBmaXJzdCArIDEKKyAgICAgICAgaiA9IGxlbihzZWxmLmNvbXBsZXRpb25zKQorICAgICAgICB3aGlsZSBqID4gaToKKyAgICAgICAgICAgIG0gPSAoaSArIGopIC8vIDIKKyAgICAgICAgICAgIGlmIHNlbGYuY29tcGxldGlvbnNbbV1bOmxlbihzKV0gIT0gczoKKyAgICAgICAgICAgICAgICBqID0gbQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpID0gbSArIDEKKyAgICAgICAgbGFzdCA9IGktMQorCisgICAgICAgIGlmIGZpcnN0ID09IGxhc3Q6ICMgb25seSBvbmUgcG9zc2libGUgY29tcGxldGlvbgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29tcGxldGlvbnNbZmlyc3RdCisKKyAgICAgICAgIyBXZSBzaG91bGQgcmV0dXJuIHRoZSBtYXhpbXVtIHByZWZpeCBvZiBmaXJzdCBhbmQgbGFzdAorICAgICAgICBmaXJzdF9jb21wID0gc2VsZi5jb21wbGV0aW9uc1tmaXJzdF0KKyAgICAgICAgbGFzdF9jb21wID0gc2VsZi5jb21wbGV0aW9uc1tsYXN0XQorICAgICAgICBtaW5fbGVuID0gbWluKGxlbihmaXJzdF9jb21wKSwgbGVuKGxhc3RfY29tcCkpCisgICAgICAgIGkgPSBsZW4ocykKKyAgICAgICAgd2hpbGUgaSA8IG1pbl9sZW4gYW5kIGZpcnN0X2NvbXBbaV0gPT0gbGFzdF9jb21wW2ldOgorICAgICAgICAgICAgaSArPSAxCisgICAgICAgIHJldHVybiBmaXJzdF9jb21wWzppXQorCisgICAgZGVmIF9zZWxlY3Rpb25fY2hhbmdlZChzZWxmKToKKyAgICAgICAgIiIiU2hvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBzZWxlY3Rpb24gb2YgdGhlIExpc3Rib3ggaGFzIGNoYW5nZWQuCisgICAgICAgIFVwZGF0ZXMgdGhlIExpc3Rib3ggZGlzcGxheSBhbmQgY2FsbHMgX2NoYW5nZV9zdGFydC4iIiIKKyAgICAgICAgY3Vyc2VsID0gaW50KHNlbGYubGlzdGJveC5jdXJzZWxlY3Rpb24oKVswXSkKKworICAgICAgICBzZWxmLmxpc3Rib3guc2VlKGN1cnNlbCkKKworICAgICAgICBsdHMgPSBzZWxmLmxhc3R0eXBlZHN0YXJ0CisgICAgICAgIHNlbHN0YXJ0ID0gc2VsZi5jb21wbGV0aW9uc1tjdXJzZWxdCisgICAgICAgIGlmIHNlbGYuX2JpbmFyeV9zZWFyY2gobHRzKSA9PSBjdXJzZWw6CisgICAgICAgICAgICBuZXdzdGFydCA9IGx0cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWluX2xlbiA9IG1pbihsZW4obHRzKSwgbGVuKHNlbHN0YXJ0KSkKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICB3aGlsZSBpIDwgbWluX2xlbiBhbmQgbHRzW2ldID09IHNlbHN0YXJ0W2ldOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgbmV3c3RhcnQgPSBzZWxzdGFydFs6aV0KKyAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KG5ld3N0YXJ0KQorCisgICAgICAgIGlmIHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsXVs6bGVuKHNlbGYuc3RhcnQpXSA9PSBzZWxmLnN0YXJ0OgorICAgICAgICAgICAgIyBzdGFydCBpcyBhIHByZWZpeCBvZiB0aGUgc2VsZWN0ZWQgY29tcGxldGlvbgorICAgICAgICAgICAgc2VsZi5saXN0Ym94LmNvbmZpZ3VyZShzZWxlY3RiYWNrZ3JvdW5kPXNlbGYub3JpZ3NlbGJhY2tncm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGZvcmVncm91bmQ9c2VsZi5vcmlnc2VsZm9yZWdyb3VuZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGlzdGJveC5jb25maWd1cmUoc2VsZWN0YmFja2dyb3VuZD1zZWxmLmxpc3Rib3guY2dldCgiYmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Zm9yZWdyb3VuZD1zZWxmLmxpc3Rib3guY2dldCgiZmciKSkKKyAgICAgICAgICAgICMgSWYgdGhlcmUgYXJlIG1vcmUgY29tcGxldGlvbnMsIHNob3cgdGhlbSwgYW5kIGNhbGwgbWUgYWdhaW4uCisgICAgICAgICAgICBpZiBzZWxmLm1vcmVjb21wbGV0aW9uczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBsZXRpb25zID0gc2VsZi5tb3JlY29tcGxldGlvbnMKKyAgICAgICAgICAgICAgICBzZWxmLm1vcmVjb21wbGV0aW9ucyA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3Rib3guZGVsZXRlKDAsIEVORCkKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmNvbXBsZXRpb25zOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpc3Rib3guaW5zZXJ0KEVORCwgaXRlbSkKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3Rib3guc2VsZWN0X3NldChzZWxmLl9iaW5hcnlfc2VhcmNoKHNlbGYuc3RhcnQpKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbGVjdGlvbl9jaGFuZ2VkKCkKKworICAgIGRlZiBzaG93X3dpbmRvdyhzZWxmLCBjb21wX2xpc3RzLCBpbmRleCwgY29tcGxldGUsIG1vZGUsIHVzZXJXYW50c1dpbik6CisgICAgICAgICIiIlNob3cgdGhlIGF1dG9jb21wbGV0ZSBsaXN0LCBiaW5kIGV2ZW50cy4KKyAgICAgICAgSWYgY29tcGxldGUgaXMgVHJ1ZSwgY29tcGxldGUgdGhlIHRleHQsIGFuZCBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZQorICAgICAgICBtYXRjaGluZyBjb21wbGV0aW9uLCBkb24ndCBvcGVuIGEgbGlzdC4iIiIKKyAgICAgICAgIyBIYW5kbGUgdGhlIHN0YXJ0IHdlIGFscmVhZHkgaGF2ZQorICAgICAgICBzZWxmLmNvbXBsZXRpb25zLCBzZWxmLm1vcmVjb21wbGV0aW9ucyA9IGNvbXBfbGlzdHMKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLnN0YXJ0aW5kZXggPSBzZWxmLndpZGdldC5pbmRleChpbmRleCkKKyAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYud2lkZ2V0LmdldChzZWxmLnN0YXJ0aW5kZXgsICJpbnNlcnQiKQorICAgICAgICBpZiBjb21wbGV0ZToKKyAgICAgICAgICAgIGNvbXBsZXRlZCA9IHNlbGYuX2NvbXBsZXRlX3N0cmluZyhzZWxmLnN0YXJ0KQorICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KGNvbXBsZXRlZCkKKyAgICAgICAgICAgIGkgPSBzZWxmLl9iaW5hcnlfc2VhcmNoKGNvbXBsZXRlZCkKKyAgICAgICAgICAgIGlmIHNlbGYuY29tcGxldGlvbnNbaV0gPT0gY29tcGxldGVkIGFuZCBcCisgICAgICAgICAgICAgICAoaSA9PSBsZW4oc2VsZi5jb21wbGV0aW9ucyktMSBvcgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGxldGlvbnNbaSsxXVs6bGVuKGNvbXBsZXRlZCldICE9IGNvbXBsZXRlZCk6CisgICAgICAgICAgICAgICAgIyBUaGVyZSBpcyBleGFjdGx5IG9uZSBtYXRjaGluZyBjb21wbGV0aW9uCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudXNlcndhbnRzd2luZG93ID0gdXNlcldhbnRzV2luCisgICAgICAgIHNlbGYubGFzdHR5cGVkc3RhcnQgPSBzZWxmLnN0YXJ0CisKKyAgICAgICAgIyBQdXQgd2lkZ2V0cyBpbiBwbGFjZQorICAgICAgICBzZWxmLmF1dG9jb21wbGV0ZXdpbmRvdyA9IGFjdyA9IFRvcGxldmVsKHNlbGYud2lkZ2V0KQorICAgICAgICAjIFB1dCBpdCBpbiBhIHBvc2l0aW9uIHNvIHRoYXQgaXQgaXMgbm90IHNlZW4uCisgICAgICAgIGFjdy53bV9nZW9tZXRyeSgiKzEwMDAwKzEwMDAwIikKKyAgICAgICAgIyBNYWtlIGl0IGZsb2F0CisgICAgICAgIGFjdy53bV9vdmVycmlkZXJlZGlyZWN0KDEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgVGhpcyBjb21tYW5kIGlzIG9ubHkgbmVlZGVkIGFuZCBhdmFpbGFibGUgb24gVGsgPj0gOC40LjAgZm9yIE9TWAorICAgICAgICAgICAgIyBXaXRob3V0IGl0LCBjYWxsIHRpcHMgaW50cnVkZSBvbiB0aGUgdHlwaW5nIHByb2Nlc3MgYnkgZ3JhYmJpbmcKKyAgICAgICAgICAgICMgdGhlIGZvY3VzLgorICAgICAgICAgICAgYWN3LnRrLmNhbGwoIjo6dGs6OnVuc3VwcG9ydGVkOjpNYWNXaW5kb3dTdHlsZSIsICJzdHlsZSIsIGFjdy5fdywKKyAgICAgICAgICAgICAgICAgICAgICAgICJoZWxwIiwgIm5vQWN0aXZhdGVzIikKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnNjcm9sbGJhciA9IHNjcm9sbGJhciA9IFNjcm9sbGJhcihhY3csIG9yaWVudD1WRVJUSUNBTCkKKyAgICAgICAgc2VsZi5saXN0Ym94ID0gbGlzdGJveCA9IExpc3Rib3goYWN3LCB5c2Nyb2xsY29tbWFuZD1zY3JvbGxiYXIuc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzZWxlY3Rpb249RmFsc2UsIGJnPSJ3aGl0ZSIpCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuY29tcGxldGlvbnM6CisgICAgICAgICAgICBsaXN0Ym94Lmluc2VydChFTkQsIGl0ZW0pCisgICAgICAgIHNlbGYub3JpZ3NlbGZvcmVncm91bmQgPSBsaXN0Ym94LmNnZXQoInNlbGVjdGZvcmVncm91bmQiKQorICAgICAgICBzZWxmLm9yaWdzZWxiYWNrZ3JvdW5kID0gbGlzdGJveC5jZ2V0KCJzZWxlY3RiYWNrZ3JvdW5kIikKKyAgICAgICAgc2Nyb2xsYmFyLmNvbmZpZyhjb21tYW5kPWxpc3Rib3gueXZpZXcpCisgICAgICAgIHNjcm9sbGJhci5wYWNrKHNpZGU9UklHSFQsIGZpbGw9WSkKKyAgICAgICAgbGlzdGJveC5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9VHJ1ZSkKKworICAgICAgICAjIEluaXRpYWxpemUgdGhlIGxpc3Rib3ggc2VsZWN0aW9uCisgICAgICAgIHNlbGYubGlzdGJveC5zZWxlY3Rfc2V0KHNlbGYuX2JpbmFyeV9zZWFyY2goc2VsZi5zdGFydCkpCisgICAgICAgIHNlbGYuX3NlbGVjdGlvbl9jaGFuZ2VkKCkKKworICAgICAgICAjIGJpbmQgZXZlbnRzCisgICAgICAgIHNlbGYuaGlkZWlkID0gc2VsZi53aWRnZXQuYmluZChISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGlkZV9ldmVudCkKKyAgICAgICAgZm9yIHNlcSBpbiBISURFX1NFUVVFTkNFUzoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmV2ZW50X2FkZChISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorICAgICAgICBzZWxmLmtleXByZXNzaWQgPSBzZWxmLndpZGdldC5iaW5kKEtFWVBSRVNTX1ZJUlRVQUxfRVZFTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmtleXByZXNzX2V2ZW50KQorICAgICAgICBmb3Igc2VxIGluIEtFWVBSRVNTX1NFUVVFTkNFUzoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmV2ZW50X2FkZChLRVlQUkVTU19WSVJUVUFMX0VWRU5UX05BTUUsIHNlcSkKKyAgICAgICAgc2VsZi5rZXlyZWxlYXNlaWQgPSBzZWxmLndpZGdldC5iaW5kKEtFWVJFTEVBU0VfVklSVFVBTF9FVkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5rZXlyZWxlYXNlX2V2ZW50KQorICAgICAgICBzZWxmLndpZGdldC5ldmVudF9hZGQoS0VZUkVMRUFTRV9WSVJUVUFMX0VWRU5UX05BTUUsS0VZUkVMRUFTRV9TRVFVRU5DRSkKKyAgICAgICAgc2VsZi5saXN0dXBkYXRlaWQgPSBsaXN0Ym94LmJpbmQoTElTVFVQREFURV9TRVFVRU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saXN0c2VsZWN0X2V2ZW50KQorICAgICAgICBzZWxmLndpbmNvbmZpZ2lkID0gYWN3LmJpbmQoV0lOQ09ORklHX1NFUVVFTkNFLCBzZWxmLndpbmNvbmZpZ19ldmVudCkKKyAgICAgICAgc2VsZi5kb3VibGVjbGlja2lkID0gbGlzdGJveC5iaW5kKERPVUJMRUNMSUNLX1NFUVVFTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kb3VibGVjbGlja19ldmVudCkKKworICAgIGRlZiB3aW5jb25maWdfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBub3Qgc2VsZi5pc19hY3RpdmUoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFBvc2l0aW9uIHRoZSBjb21wbGV0aW9uIGxpc3Qgd2luZG93CisgICAgICAgIHRleHQgPSBzZWxmLndpZGdldAorICAgICAgICB0ZXh0LnNlZShzZWxmLnN0YXJ0aW5kZXgpCisgICAgICAgIHgsIHksIGN4LCBjeSA9IHRleHQuYmJveChzZWxmLnN0YXJ0aW5kZXgpCisgICAgICAgIGFjdyA9IHNlbGYuYXV0b2NvbXBsZXRld2luZG93CisgICAgICAgIGFjd193aWR0aCwgYWN3X2hlaWdodCA9IGFjdy53aW5mb193aWR0aCgpLCBhY3cud2luZm9faGVpZ2h0KCkKKyAgICAgICAgdGV4dF93aWR0aCwgdGV4dF9oZWlnaHQgPSB0ZXh0LndpbmZvX3dpZHRoKCksIHRleHQud2luZm9faGVpZ2h0KCkKKyAgICAgICAgbmV3X3ggPSB0ZXh0LndpbmZvX3Jvb3R4KCkgKyBtaW4oeCwgbWF4KDAsIHRleHRfd2lkdGggLSBhY3dfd2lkdGgpKQorICAgICAgICBuZXdfeSA9IHRleHQud2luZm9fcm9vdHkoKSArIHkKKyAgICAgICAgaWYgKHRleHRfaGVpZ2h0IC0gKHkgKyBjeSkgPj0gYWN3X2hlaWdodCAjIGVub3VnaCBoZWlnaHQgYmVsb3cKKyAgICAgICAgICAgIG9yIHkgPCBhY3dfaGVpZ2h0KTogIyBub3QgZW5vdWdoIGhlaWdodCBhYm92ZQorICAgICAgICAgICAgIyBwbGFjZSBhY3cgYmVsb3cgY3VycmVudCBsaW5lCisgICAgICAgICAgICBuZXdfeSArPSBjeQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBwbGFjZSBhY3cgYWJvdmUgY3VycmVudCBsaW5lCisgICAgICAgICAgICBuZXdfeSAtPSBhY3dfaGVpZ2h0CisgICAgICAgIGFjdy53bV9nZW9tZXRyeSgiKyVkKyVkIiAlIChuZXdfeCwgbmV3X3kpKQorCisgICAgZGVmIGhpZGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBub3Qgc2VsZi5pc19hY3RpdmUoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKworICAgIGRlZiBsaXN0c2VsZWN0X2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi51c2Vyd2FudHN3aW5kb3cgPSBUcnVlCisgICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCisgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF0pCisKKyAgICBkZWYgZG91YmxlY2xpY2tfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAjIFB1dCB0aGUgc2VsZWN0ZWQgY29tcGxldGlvbiBpbiB0aGUgdGV4dCwgYW5kIGNsb3NlIHRoZSBsaXN0CisgICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCisgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLmNvbXBsZXRpb25zW2N1cnNlbF0pCisgICAgICAgIHNlbGYuaGlkZV93aW5kb3coKQorCisgICAgZGVmIGtleXByZXNzX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAga2V5c3ltID0gZXZlbnQua2V5c3ltCisgICAgICAgIGlmIGhhc2F0dHIoZXZlbnQsICJtY19zdGF0ZSIpOgorICAgICAgICAgICAgc3RhdGUgPSBldmVudC5tY19zdGF0ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdGUgPSAwCisgICAgICAgIGlmIGtleXN5bSAhPSAiVGFiIjoKKyAgICAgICAgICAgIHNlbGYubGFzdGtleV93YXNfdGFiID0gRmFsc2UKKyAgICAgICAgaWYgKGxlbihrZXlzeW0pID09IDEgb3Iga2V5c3ltIGluICgidW5kZXJzY29yZSIsICJCYWNrU3BhY2UiKQorICAgICAgICAgICAgb3IgKHNlbGYubW9kZSA9PSBDT01QTEVURV9GSUxFUyBhbmQga2V5c3ltIGluCisgICAgICAgICAgICAgICAgKCJwZXJpb2QiLCAibWludXMiKSkpIFwKKyAgICAgICAgICAgYW5kIG5vdCAoc3RhdGUgJiB+TUNfU0hJRlQpOgorICAgICAgICAgICAgIyBOb3JtYWwgZWRpdGluZyBvZiB0ZXh0CisgICAgICAgICAgICBpZiBsZW4oa2V5c3ltKSA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLnN0YXJ0ICsga2V5c3ltKQorICAgICAgICAgICAgZWxpZiBrZXlzeW0gPT0gInVuZGVyc2NvcmUiOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLnN0YXJ0ICsgJ18nKQorICAgICAgICAgICAgZWxpZiBrZXlzeW0gPT0gInBlcmlvZCI6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuc3RhcnQgKyAnLicpCisgICAgICAgICAgICBlbGlmIGtleXN5bSA9PSAibWludXMiOgorICAgICAgICAgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLnN0YXJ0ICsgJy0nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGtleXN5bSA9PSAiQmFja1NwYWNlIgorICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLnN0YXJ0KSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuc3RhcnRbOi0xXSkKKyAgICAgICAgICAgIHNlbGYubGFzdHR5cGVkc3RhcnQgPSBzZWxmLnN0YXJ0CisgICAgICAgICAgICBzZWxmLmxpc3Rib3guc2VsZWN0X2NsZWFyKDAsIGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pKQorICAgICAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdF9zZXQoc2VsZi5fYmluYXJ5X3NlYXJjaChzZWxmLnN0YXJ0KSkKKyAgICAgICAgICAgIHNlbGYuX3NlbGVjdGlvbl9jaGFuZ2VkKCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICAgICAgZWxpZiBrZXlzeW0gPT0gIlJldHVybiI6CisgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGVsaWYgKHNlbGYubW9kZSA9PSBDT01QTEVURV9BVFRSSUJVVEVTIGFuZCBrZXlzeW0gaW4KKyAgICAgICAgICAgICAgKCJwZXJpb2QiLCAic3BhY2UiLCAicGFyZW5sZWZ0IiwgInBhcmVucmlnaHQiLCAiYnJhY2tldGxlZnQiLAorICAgICAgICAgICAgICAgImJyYWNrZXRyaWdodCIpKSBvciBcCisgICAgICAgICAgICAgKHNlbGYubW9kZSA9PSBDT01QTEVURV9GSUxFUyBhbmQga2V5c3ltIGluCisgICAgICAgICAgICAgICgic2xhc2giLCAiYmFja3NsYXNoIiwgInF1b3RlZGJsIiwgImFwb3N0cm9waGUiKSkgXAorICAgICAgICAgICAgIGFuZCBub3QgKHN0YXRlICYgfk1DX1NISUZUKToKKyAgICAgICAgICAgICMgSWYgc3RhcnQgaXMgYSBwcmVmaXggb2YgdGhlIHNlbGVjdGlvbiwgYnV0IGlzIG5vdCAnJyB3aGVuCisgICAgICAgICAgICAjIGNvbXBsZXRpbmcgZmlsZSBuYW1lcywgcHV0IHRoZSB3aG9sZQorICAgICAgICAgICAgIyBzZWxlY3RlZCBjb21wbGV0aW9uLiBBbnl3YXksIGNsb3NlIHRoZSBsaXN0LgorICAgICAgICAgICAgY3Vyc2VsID0gaW50KHNlbGYubGlzdGJveC5jdXJzZWxlY3Rpb24oKVswXSkKKyAgICAgICAgICAgIGlmIHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsXVs6bGVuKHNlbGYuc3RhcnQpXSA9PSBzZWxmLnN0YXJ0IFwKKyAgICAgICAgICAgICAgIGFuZCAoc2VsZi5tb2RlID09IENPTVBMRVRFX0FUVFJJQlVURVMgb3Igc2VsZi5zdGFydCk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsXSkKKyAgICAgICAgICAgIHNlbGYuaGlkZV93aW5kb3coKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZWxpZiBrZXlzeW0gaW4gKCJIb21lIiwgIkVuZCIsICJQcmlvciIsICJOZXh0IiwgIlVwIiwgIkRvd24iKSBhbmQgXAorICAgICAgICAgICAgIG5vdCBzdGF0ZToKKyAgICAgICAgICAgICMgTW92ZSB0aGUgc2VsZWN0aW9uIGluIHRoZSBsaXN0Ym94CisgICAgICAgICAgICBzZWxmLnVzZXJ3YW50c3dpbmRvdyA9IFRydWUKKyAgICAgICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCisgICAgICAgICAgICBpZiBrZXlzeW0gPT0gIkhvbWUiOgorICAgICAgICAgICAgICAgIG5ld3NlbCA9IDAKKyAgICAgICAgICAgIGVsaWYga2V5c3ltID09ICJFbmQiOgorICAgICAgICAgICAgICAgIG5ld3NlbCA9IGxlbihzZWxmLmNvbXBsZXRpb25zKS0xCisgICAgICAgICAgICBlbGlmIGtleXN5bSBpbiAoIlByaW9yIiwgIk5leHQiKToKKyAgICAgICAgICAgICAgICBqdW1wID0gc2VsZi5saXN0Ym94Lm5lYXJlc3Qoc2VsZi5saXN0Ym94LndpbmZvX2hlaWdodCgpKSAtIFwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saXN0Ym94Lm5lYXJlc3QoMCkKKyAgICAgICAgICAgICAgICBpZiBrZXlzeW0gPT0gIlByaW9yIjoKKyAgICAgICAgICAgICAgICAgICAgbmV3c2VsID0gbWF4KDAsIGN1cnNlbC1qdW1wKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBrZXlzeW0gPT0gIk5leHQiCisgICAgICAgICAgICAgICAgICAgIG5ld3NlbCA9IG1pbihsZW4oc2VsZi5jb21wbGV0aW9ucyktMSwgY3Vyc2VsK2p1bXApCisgICAgICAgICAgICBlbGlmIGtleXN5bSA9PSAiVXAiOgorICAgICAgICAgICAgICAgIG5ld3NlbCA9IG1heCgwLCBjdXJzZWwtMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGtleXN5bSA9PSAiRG93biIKKyAgICAgICAgICAgICAgICBuZXdzZWwgPSBtaW4obGVuKHNlbGYuY29tcGxldGlvbnMpLTEsIGN1cnNlbCsxKQorICAgICAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdF9jbGVhcihjdXJzZWwpCisgICAgICAgICAgICBzZWxmLmxpc3Rib3guc2VsZWN0X3NldChuZXdzZWwpCisgICAgICAgICAgICBzZWxmLl9zZWxlY3Rpb25fY2hhbmdlZCgpCisgICAgICAgICAgICBzZWxmLl9jaGFuZ2Vfc3RhcnQoc2VsZi5jb21wbGV0aW9uc1tuZXdzZWxdKQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgICAgICBlbGlmIChrZXlzeW0gPT0gIlRhYiIgYW5kIG5vdCBzdGF0ZSk6CisgICAgICAgICAgICBpZiBzZWxmLmxhc3RrZXlfd2FzX3RhYjoKKyAgICAgICAgICAgICAgICAjIHR3byB0YWJzIGluIGEgcm93OyBpbnNlcnQgY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsb3NlIGFjdworICAgICAgICAgICAgICAgIGN1cnNlbCA9IGludChzZWxmLmxpc3Rib3guY3Vyc2VsZWN0aW9uKClbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5fY2hhbmdlX3N0YXJ0KHNlbGYuY29tcGxldGlvbnNbY3Vyc2VsXSkKKyAgICAgICAgICAgICAgICBzZWxmLmhpZGVfd2luZG93KCkKKyAgICAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGZpcnN0IHRhYjsgbGV0IEF1dG9Db21wbGV0ZSBoYW5kbGUgdGhlIGNvbXBsZXRpb24KKyAgICAgICAgICAgICAgICBzZWxmLnVzZXJ3YW50c3dpbmRvdyA9IFRydWUKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3RrZXlfd2FzX3RhYiA9IFRydWUKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBlbGlmIGFueShzIGluIGtleXN5bSBmb3IgcyBpbiAoIlNoaWZ0IiwgIkNvbnRyb2wiLCAiQWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRhIiwgIkNvbW1hbmQiLCAiT3B0aW9uIikpOgorICAgICAgICAgICAgIyBBIG1vZGlmaWVyIGtleSwgc28gaWdub3JlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVbmtub3duIGV2ZW50LCBjbG9zZSB0aGUgd2luZG93IGFuZCBsZXQgaXQgdGhyb3VnaC4KKyAgICAgICAgICAgIHNlbGYuaGlkZV93aW5kb3coKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYga2V5cmVsZWFzZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYud2lkZ2V0LmluZGV4KCJpbnNlcnQiKSAhPSBcCisgICAgICAgICAgIHNlbGYud2lkZ2V0LmluZGV4KCIlcyslZGMiICUgKHNlbGYuc3RhcnRpbmRleCwgbGVuKHNlbGYuc3RhcnQpKSk6CisgICAgICAgICAgICAjIElmIHdlIGRpZG4ndCBjYXRjaCBhbiBldmVudCB3aGljaCBtb3ZlZCB0aGUgaW5zZXJ0LCBjbG9zZSB3aW5kb3cKKyAgICAgICAgICAgIHNlbGYuaGlkZV93aW5kb3coKQorCisgICAgZGVmIGlzX2FjdGl2ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXV0b2NvbXBsZXRld2luZG93IGlzIG5vdCBOb25lCisKKyAgICBkZWYgY29tcGxldGUoc2VsZik6CisgICAgICAgIHNlbGYuX2NoYW5nZV9zdGFydChzZWxmLl9jb21wbGV0ZV9zdHJpbmcoc2VsZi5zdGFydCkpCisgICAgICAgICMgVGhlIHNlbGVjdGlvbiBkb2Vzbid0IGNoYW5nZS4KKworICAgIGRlZiBoaWRlX3dpbmRvdyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfYWN0aXZlKCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIHVuYmluZCBldmVudHMKKyAgICAgICAgZm9yIHNlcSBpbiBISURFX1NFUVVFTkNFUzoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmV2ZW50X2RlbGV0ZShISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VxKQorICAgICAgICBzZWxmLndpZGdldC51bmJpbmQoSElERV9WSVJUVUFMX0VWRU5UX05BTUUsIHNlbGYuaGlkZWlkKQorICAgICAgICBzZWxmLmhpZGVpZCA9IE5vbmUKKyAgICAgICAgZm9yIHNlcSBpbiBLRVlQUkVTU19TRVFVRU5DRVM6CisgICAgICAgICAgICBzZWxmLndpZGdldC5ldmVudF9kZWxldGUoS0VZUFJFU1NfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisgICAgICAgIHNlbGYud2lkZ2V0LnVuYmluZChLRVlQUkVTU19WSVJUVUFMX0VWRU5UX05BTUUsIHNlbGYua2V5cHJlc3NpZCkKKyAgICAgICAgc2VsZi5rZXlwcmVzc2lkID0gTm9uZQorICAgICAgICBzZWxmLndpZGdldC5ldmVudF9kZWxldGUoS0VZUkVMRUFTRV9WSVJUVUFMX0VWRU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlSRUxFQVNFX1NFUVVFTkNFKQorICAgICAgICBzZWxmLndpZGdldC51bmJpbmQoS0VZUkVMRUFTRV9WSVJUVUFMX0VWRU5UX05BTUUsIHNlbGYua2V5cmVsZWFzZWlkKQorICAgICAgICBzZWxmLmtleXJlbGVhc2VpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5saXN0Ym94LnVuYmluZChMSVNUVVBEQVRFX1NFUVVFTkNFLCBzZWxmLmxpc3R1cGRhdGVpZCkKKyAgICAgICAgc2VsZi5saXN0dXBkYXRlaWQgPSBOb25lCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93LnVuYmluZChXSU5DT05GSUdfU0VRVUVOQ0UsIHNlbGYud2luY29uZmlnaWQpCisgICAgICAgIHNlbGYud2luY29uZmlnaWQgPSBOb25lCisKKyAgICAgICAgIyBkZXN0cm95IHdpZGdldHMKKyAgICAgICAgc2VsZi5zY3JvbGxiYXIuZGVzdHJveSgpCisgICAgICAgIHNlbGYuc2Nyb2xsYmFyID0gTm9uZQorICAgICAgICBzZWxmLmxpc3Rib3guZGVzdHJveSgpCisgICAgICAgIHNlbGYubGlzdGJveCA9IE5vbmUKKyAgICAgICAgc2VsZi5hdXRvY29tcGxldGV3aW5kb3cuZGVzdHJveSgpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRld2luZG93ID0gTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjkyMmZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0NvbXBsZXRlV2luZG93LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdjM2VlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9Db21wbGV0ZVdpbmRvdy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9FeHBhbmQucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQXV0b0V4cGFuZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTkzZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9FeHBhbmQucHkKQEAgLTAsMCArMSw4MyBAQAoraW1wb3J0IHN0cmluZworaW1wb3J0IHJlCisKKyMjIyQgZXZlbnQgPDxleHBhbmQtd29yZD4+CisjIyMkIHdpbiA8QWx0LXNsYXNoPgorIyMjJCB1bml4IDxBbHQtc2xhc2g+CisKK2NsYXNzIEF1dG9FeHBhbmQ6CisKKyAgICBtZW51ZGVmcyA9IFsKKyAgICAgICAgKCdlZGl0JywgWworICAgICAgICAgICAgKCdFX3hwYW5kIFdvcmQnLCAnPDxleHBhbmQtd29yZD4+JyksCisgICAgICAgICBdKSwKKyAgICBdCisKKyAgICB3b3JkY2hhcnMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiXyIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKKyAgICAgICAgc2VsZi50ZXh0ID0gZWRpdHdpbi50ZXh0CisgICAgICAgIHNlbGYuc3RhdGUgPSBOb25lCisKKyAgICBkZWYgZXhwYW5kX3dvcmRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBjdXJpbnNlcnQgPSBzZWxmLnRleHQuaW5kZXgoImluc2VydCIpCisgICAgICAgIGN1cmxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCBsaW5lZW5kIikKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdGU6CisgICAgICAgICAgICB3b3JkcyA9IHNlbGYuZ2V0d29yZHMoKQorICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3b3JkcywgaW5kZXgsIGluc2VydCwgbGluZSA9IHNlbGYuc3RhdGUKKyAgICAgICAgICAgIGlmIGluc2VydCAhPSBjdXJpbnNlcnQgb3IgbGluZSAhPSBjdXJsaW5lOgorICAgICAgICAgICAgICAgIHdvcmRzID0gc2VsZi5nZXR3b3JkcygpCisgICAgICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgIGlmIG5vdCB3b3JkczoKKyAgICAgICAgICAgIHNlbGYudGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIHdvcmQgPSBzZWxmLmdldHByZXZ3b3JkKCkKKyAgICAgICAgc2VsZi50ZXh0LmRlbGV0ZSgiaW5zZXJ0IC0gJWQgY2hhcnMiICUgbGVuKHdvcmQpLCAiaW5zZXJ0IikKKyAgICAgICAgbmV3d29yZCA9IHdvcmRzW2luZGV4XQorICAgICAgICBpbmRleCA9IChpbmRleCArIDEpICUgbGVuKHdvcmRzKQorICAgICAgICBpZiBpbmRleCA9PSAwOgorICAgICAgICAgICAgc2VsZi50ZXh0LmJlbGwoKSAgICAgICAgICAgICMgV2FybiB3ZSBjeWNsZWQgYXJvdW5kCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQoImluc2VydCIsIG5ld3dvcmQpCisgICAgICAgIGN1cmluc2VydCA9IHNlbGYudGV4dC5pbmRleCgiaW5zZXJ0IikKKyAgICAgICAgY3VybGluZSA9IHNlbGYudGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IGxpbmVlbmQiKQorICAgICAgICBzZWxmLnN0YXRlID0gd29yZHMsIGluZGV4LCBjdXJpbnNlcnQsIGN1cmxpbmUKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBnZXR3b3JkcyhzZWxmKToKKyAgICAgICAgd29yZCA9IHNlbGYuZ2V0cHJldndvcmQoKQorICAgICAgICBpZiBub3Qgd29yZDoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBiZWZvcmUgPSBzZWxmLnRleHQuZ2V0KCIxLjAiLCAiaW5zZXJ0IHdvcmRzdGFydCIpCisgICAgICAgIHdiZWZvcmUgPSByZS5maW5kYWxsKHIiXGIiICsgd29yZCArIHIiXHcrXGIiLCBiZWZvcmUpCisgICAgICAgIGRlbCBiZWZvcmUKKyAgICAgICAgYWZ0ZXIgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgd29yZGVuZCIsICJlbmQiKQorICAgICAgICB3YWZ0ZXIgPSByZS5maW5kYWxsKHIiXGIiICsgd29yZCArIHIiXHcrXGIiLCBhZnRlcikKKyAgICAgICAgZGVsIGFmdGVyCisgICAgICAgIGlmIG5vdCB3YmVmb3JlIGFuZCBub3Qgd2FmdGVyOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHdvcmRzID0gW10KKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgICMgc2VhcmNoIGJhY2t3YXJkcyB0aHJvdWdoIHdvcmRzIGJlZm9yZQorICAgICAgICB3YmVmb3JlLnJldmVyc2UoKQorICAgICAgICBmb3IgdyBpbiB3YmVmb3JlOgorICAgICAgICAgICAgaWYgZGljdC5nZXQodyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHdvcmRzLmFwcGVuZCh3KQorICAgICAgICAgICAgZGljdFt3XSA9IHcKKyAgICAgICAgIyBzZWFyY2ggb253YXJkcyB0aHJvdWdoIHdvcmRzIGFmdGVyCisgICAgICAgIGZvciB3IGluIHdhZnRlcjoKKyAgICAgICAgICAgIGlmIGRpY3QuZ2V0KHcpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB3b3Jkcy5hcHBlbmQodykKKyAgICAgICAgICAgIGRpY3Rbd10gPSB3CisgICAgICAgIHdvcmRzLmFwcGVuZCh3b3JkKQorICAgICAgICByZXR1cm4gd29yZHMKKworICAgIGRlZiBnZXRwcmV2d29yZChzZWxmKToKKyAgICAgICAgbGluZSA9IHNlbGYudGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IikKKyAgICAgICAgaSA9IGxlbihsaW5lKQorICAgICAgICB3aGlsZSBpID4gMCBhbmQgbGluZVtpLTFdIGluIHNlbGYud29yZGNoYXJzOgorICAgICAgICAgICAgaSA9IGktMQorICAgICAgICByZXR1cm4gbGluZVtpOl0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ5ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9FeHBhbmQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9BdXRvRXhwYW5kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWQ5ZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0F1dG9FeHBhbmQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9CaW5kaW5ncy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9CaW5kaW5ncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzI3MjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0JpbmRpbmdzLnB5CkBAIC0wLDAgKzEsMTAzIEBACisiIiJEZWZpbmUgdGhlIG1lbnUgY29udGVudHMsIGhvdGtleXMsIGFuZCBldmVudCBiaW5kaW5ncy4KKworVGhlcmUgaXMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGluIHRoZSBFZGl0b3JXaW5kb3cgY2xhc3MgKGFuZAorc3ViY2xhc3Nlcyk6IHRoZSBtZW51cyBhcmUgY3JlYXRlZCB0aGVyZSBiYXNlZCBvbiB0aGUgbWVudV9zcGVjcyAoY2xhc3MpCit2YXJpYWJsZSwgYW5kIG1lbnVzIG5vdCBjcmVhdGVkIGFyZSBzaWxlbnRseSBza2lwcGVkIGluIHRoZSBjb2RlIGhlcmUuICBUaGlzCittYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGV4YW1wbGUsIHRvIGRlZmluZSBhIERlYnVnIG1lbnUgd2hpY2ggaXMgb25seSBwcmVzZW50IGluCit0aGUgUHl0aG9uU2hlbGwgd2luZG93LCBhbmQgYSBGb3JtYXQgbWVudSB3aGljaCBpcyBvbmx5IHByZXNlbnQgaW4gdGhlIEVkaXRvcgord2luZG93cy4KKworIiIiCitpbXBvcnQgc3lzCitmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorCittZW51ZGVmcyA9IFsKKyAjIHVuZGVyc2NvcmUgcHJlZml4ZXMgY2hhcmFjdGVyIHRvIHVuZGVyc2NvcmUKKyAoJ2ZpbGUnLCBbCisgICAoJ19OZXcgV2luZG93JywgJzw8b3Blbi1uZXctd2luZG93Pj4nKSwKKyAgICgnX09wZW4uLi4nLCAnPDxvcGVuLXdpbmRvdy1mcm9tLWZpbGU+PicpLAorICAgKCdPcGVuIF9Nb2R1bGUuLi4nLCAnPDxvcGVuLW1vZHVsZT4+JyksCisgICAoJ0NsYXNzIF9Ccm93c2VyJywgJzw8b3Blbi1jbGFzcy1icm93c2VyPj4nKSwKKyAgICgnX1BhdGggQnJvd3NlcicsICc8PG9wZW4tcGF0aC1icm93c2VyPj4nKSwKKyAgIE5vbmUsCisgICAoJ19TYXZlJywgJzw8c2F2ZS13aW5kb3c+PicpLAorICAgKCdTYXZlIF9Bcy4uLicsICc8PHNhdmUtd2luZG93LWFzLWZpbGU+PicpLAorICAgKCdTYXZlIENvcF95IEFzLi4uJywgJzw8c2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlPj4nKSwKKyAgIE5vbmUsCisgICAoJ1ByaW5fdCBXaW5kb3cnLCAnPDxwcmludC13aW5kb3c+PicpLAorICAgTm9uZSwKKyAgICgnX0Nsb3NlJywgJzw8Y2xvc2Utd2luZG93Pj4nKSwKKyAgICgnRV94aXQnLCAnPDxjbG9zZS1hbGwtd2luZG93cz4+JyksCisgIF0pLAorICgnZWRpdCcsIFsKKyAgICgnX1VuZG8nLCAnPDx1bmRvPj4nKSwKKyAgICgnX1JlZG8nLCAnPDxyZWRvPj4nKSwKKyAgIE5vbmUsCisgICAoJ0N1X3QnLCAnPDxjdXQ+PicpLAorICAgKCdfQ29weScsICc8PGNvcHk+PicpLAorICAgKCdfUGFzdGUnLCAnPDxwYXN0ZT4+JyksCisgICAoJ1NlbGVjdCBfQWxsJywgJzw8c2VsZWN0LWFsbD4+JyksCisgICBOb25lLAorICAgKCdfRmluZC4uLicsICc8PGZpbmQ+PicpLAorICAgKCdGaW5kIEFfZ2FpbicsICc8PGZpbmQtYWdhaW4+PicpLAorICAgKCdGaW5kIF9TZWxlY3Rpb24nLCAnPDxmaW5kLXNlbGVjdGlvbj4+JyksCisgICAoJ0ZpbmQgaW4gRmlsZXMuLi4nLCAnPDxmaW5kLWluLWZpbGVzPj4nKSwKKyAgICgnUl9lcGxhY2UuLi4nLCAnPDxyZXBsYWNlPj4nKSwKKyAgICgnR28gdG8gX0xpbmUnLCAnPDxnb3RvLWxpbmU+PicpLAorICBdKSwKKygnZm9ybWF0JywgWworICAgKCdfSW5kZW50IFJlZ2lvbicsICc8PGluZGVudC1yZWdpb24+PicpLAorICAgKCdfRGVkZW50IFJlZ2lvbicsICc8PGRlZGVudC1yZWdpb24+PicpLAorICAgKCdDb21tZW50IF9PdXQgUmVnaW9uJywgJzw8Y29tbWVudC1yZWdpb24+PicpLAorICAgKCdVX25jb21tZW50IFJlZ2lvbicsICc8PHVuY29tbWVudC1yZWdpb24+PicpLAorICAgKCdUYWJpZnkgUmVnaW9uJywgJzw8dGFiaWZ5LXJlZ2lvbj4+JyksCisgICAoJ1VudGFiaWZ5IFJlZ2lvbicsICc8PHVudGFiaWZ5LXJlZ2lvbj4+JyksCisgICAoJ1RvZ2dsZSBUYWJzJywgJzw8dG9nZ2xlLXRhYnM+PicpLAorICAgKCdOZXcgSW5kZW50IFdpZHRoJywgJzw8Y2hhbmdlLWluZGVudHdpZHRoPj4nKSwKKyAgIF0pLAorICgncnVuJywgWworICAgKCdQeXRob24gU2hlbGwnLCAnPDxvcGVuLXB5dGhvbi1zaGVsbD4+JyksCisgICBdKSwKKyAoJ3NoZWxsJywgWworICAgKCdfVmlldyBMYXN0IFJlc3RhcnQnLCAnPDx2aWV3LXJlc3RhcnQ+PicpLAorICAgKCdfUmVzdGFydCBTaGVsbCcsICc8PHJlc3RhcnQtc2hlbGw+PicpLAorICAgXSksCisgKCdkZWJ1ZycsIFsKKyAgICgnX0dvIHRvIEZpbGUvTGluZScsICc8PGdvdG8tZmlsZS1saW5lPj4nKSwKKyAgICgnIV9EZWJ1Z2dlcicsICc8PHRvZ2dsZS1kZWJ1Z2dlcj4+JyksCisgICAoJ19TdGFjayBWaWV3ZXInLCAnPDxvcGVuLXN0YWNrLXZpZXdlcj4+JyksCisgICAoJyFfQXV0by1vcGVuIFN0YWNrIFZpZXdlcicsICc8PHRvZ2dsZS1qaXQtc3RhY2stdmlld2VyPj4nKSwKKyAgIF0pLAorICgnb3B0aW9ucycsIFsKKyAgICgnX0NvbmZpZ3VyZSBJRExFLi4uJywgJzw8b3Blbi1jb25maWctZGlhbG9nPj4nKSwKKyAgIE5vbmUsCisgICBdKSwKKyAoJ2hlbHAnLCBbCisgICAoJ19BYm91dCBJRExFJywgJzw8YWJvdXQtaWRsZT4+JyksCisgICBOb25lLAorICAgKCdfSURMRSBIZWxwJywgJzw8aGVscD4+JyksCisgICAoJ1B5dGhvbiBfRG9jcycsICc8PHB5dGhvbi1kb2NzPj4nKSwKKyAgIF0pLAorXQorCitpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICMgUnVubmluZyBhcyBhIHByb3BlciBNYWNPUyBhcHBsaWNhdGlvbiBidW5kbGUuIFRoaXMgYmxvY2sgcmVzdHJ1Y3R1cmVzCisgICAgIyB0aGUgbWVudXMgYSBsaXR0bGUgdG8gbWFrZSB0aGVtIGNvbmZvcm0gYmV0dGVyIHRvIHRoZSBISUcuCisKKyAgICBxdWl0SXRlbSA9IG1lbnVkZWZzWzBdWzFdWy0xXQorICAgIGNsb3NlSXRlbSA9IG1lbnVkZWZzWzBdWzFdWy0yXQorCisgICAgIyBSZW1vdmUgdGhlIGxhc3QgMyBpdGVtcyBvZiB0aGUgZmlsZSBtZW51OiBhIHNlcGFyYXRvciwgY2xvc2Ugd2luZG93IGFuZAorICAgICMgcXVpdC4gQ2xvc2Ugd2luZG93IHdpbGwgYmUgcmVpbnNlcnRlZCBqdXN0IGFib3ZlIHRoZSBzYXZlIGl0ZW0sIHdoZXJlCisgICAgIyBpdCBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBISUcuIFF1aXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lbnUuCisgICAgZGVsIG1lbnVkZWZzWzBdWzFdWy0zOl0KKyAgICBtZW51ZGVmc1swXVsxXS5pbnNlcnQoNiwgY2xvc2VJdGVtKQorCisgICAgIyBSZW1vdmUgdGhlICdBYm91dCcgZW50cnkgZnJvbSB0aGUgaGVscCBtZW51LCBpdCBpcyBpbiB0aGUgYXBwbGljYXRpb24KKyAgICAjIG1lbnUKKyAgICBkZWwgbWVudWRlZnNbLTFdWzFdWzA6Ml0KKworZGVmYXVsdF9rZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisKK2RlbCBzeXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9CaW5kaW5ncy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODI5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9CaW5kaW5ncy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODI5NDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQmluZGluZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DUkVESVRTLnR4dCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DUkVESVRTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmY1OTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NSRURJVFMudHh0CkBAIC0wLDAgKzEsMzcgQEAKK0d1aWRvIHZhbiBSb3NzdW0sIGFzIHdlbGwgYXMgYmVpbmcgdGhlIGNyZWF0b3Igb2YgdGhlIFB5dGhvbiBsYW5ndWFnZSwgaXMgdGhlCitvcmlnaW5hbCBjcmVhdG9yIG9mIElETEUuICBPdGhlciBjb250cmlidXRvcnMgcHJpb3IgdG8gVmVyc2lvbiAwLjggaW5jbHVkZQorTWFyayBIYW1tb25kLCBKZXJlbXkgSHlsdG9uLCBUaW0gUGV0ZXJzLCBhbmQgTW9zaGUgWmFka2EuCisKK0lETEUncyByZWNlbnQgZGV2ZWxvcG1lbnQgd2FzIGNhcnJpZWQgb3V0IGluIHRoZSBTRiBJRExFZm9yayBwcm9qZWN0LiBUaGUKK29iamVjdGl2ZSB3YXMgdG8gZGV2ZWxvcCBhIHZlcnNpb24gb2YgSURMRSB3aGljaCBoYWQgYW4gZXhlY3V0aW9uIGVudmlyb25tZW50Cit3aGljaCBjb3VsZCBiZSBpbml0aWFsaXplZCBwcmlvciB0byBlYWNoIHJ1biBvZiB1c2VyIGNvZGUuCisKK1RoZSBJRExFZm9yayBwcm9qZWN0IHdhcyBpbml0aWF0ZWQgYnkgRGF2aWQgU2NoZXJlciwgd2l0aCBzb21lIGhlbHAgZnJvbSBQZXRlcgorU2NobmVpZGVyLUthbXAgYW5kIE5pY2hvbGFzIFJpbGV5LiAgRGF2aWQgd3JvdGUgdGhlIGZpcnN0IHZlcnNpb24gb2YgdGhlIFJQQworY29kZSBhbmQgZGVzaWduZWQgYSBmYXN0IHR1cm4tYXJvdW5kIGVudmlyb25tZW50IGZvciBWUHl0aG9uLiAgR3VpZG8gZGV2ZWxvcGVkCit0aGUgUlBDIGNvZGUgYW5kIFJlbW90ZSBEZWJ1Z2dlciBjdXJyZW50bHkgaW50ZWdyYXRlZCBpbiBJRExFLiAgQnJ1Y2UgU2hlcndvb2QKK2NvbnRyaWJ1dGVkIGNvbnNpZGVyYWJsZSB0aW1lIHRlc3RpbmcgYW5kIHN1Z2dlc3RpbmcgaW1wcm92ZW1lbnRzLgorCitCZXNpZGVzIERhdmlkIGFuZCBHdWlkbywgdGhlIG1haW4gZGV2ZWxvcGVycyB3aG8gd2VyZSBhY3RpdmUgb24gSURMRWZvcmsKK2FyZSBTdGVwaGVuIE0uIEdhdmEsIHdobyBpbXBsZW1lbnRlZCB0aGUgY29uZmlndXJhdGlvbiBHVUksIHRoZSBuZXcKK2NvbmZpZ3VyYXRpb24gc3lzdGVtLCBhbmQgdGhlIEFib3V0IGRpYWxvZywgYW5kIEt1cnQgQi4gS2Fpc2VyLCB3aG8gY29tcGxldGVkCit0aGUgaW50ZWdyYXRpb24gb2YgdGhlIFJQQyBhbmQgcmVtb3RlIGRlYnVnZ2VyLCBpbXBsZW1lbnRlZCB0aGUgdGhyZWFkZWQKK3N1YnByb2Nlc3MsIGFuZCBtYWRlIGEgbnVtYmVyIG9mIHVzYWJpbGl0eSBlbmhhbmNlbWVudHMuCisKK090aGVyIGNvbnRyaWJ1dG9ycyBpbmNsdWRlIFJheW1vbmQgSGV0dGluZ2VyLCBUb255IExvd25kcyAoTWFjIGludGVncmF0aW9uKSwKK05lYWwgTm9yd2l0eiAoY29kZSBjaGVjayBhbmQgY2xlYW4tdXApLCBSb25hbGQgT3Vzc29yZW4gKE1hYyBpbnRlZ3JhdGlvbiksCitOb2FtIFJhcGhhZWwgKENvZGUgQ29udGV4dCwgQ2FsbCBUaXBzLCBtYW55IG90aGVyIHBhdGNoZXMpLCBhbmQgQ2h1aSBUZXkgKFJQQworaW50ZWdyYXRpb24sIGRlYnVnZ2VyIGludGVncmF0aW9uIGFuZCBwZXJzaXN0ZW50IGJyZWFrcG9pbnRzKS4KKworU2NvdHQgRGF2aWQgRGFuaWVscywgVGFsIEVpbmF0LCBIZXJuYW4gRm9mZmFuaSwgQ2hyaXN0b3MgR2Vvcmdpb3UsCitKaW0gSmV3ZXR0LCBNYXJ0aW4gdi4gTPZ3aXMsIEphc29uIE9yZW5kb3JmZiwgR3VpbGhlcm1lIFBvbG8sIEpvc2ggUm9iYiwKK05pZ2VsIFJvd2UsIEJydWNlIFNoZXJ3b29kLCBKZWZmIFNodXRlLCBhbmQgV2VlYmxlIGhhdmUgc3VibWl0dGVkIHVzZWZ1bAorcGF0Y2hlcy4gIFRoYW5rcywgZ3V5cyEKKworRm9yIGFkZGl0aW9uYWwgZGV0YWlscyByZWZlciB0byBORVdTLnR4dCBhbmQgQ2hhbmdlbG9nLgorCitQbGVhc2UgY29udGFjdCB0aGUgSURMRSBtYWludGFpbmVyIChrYmtAc2hvcmUubmV0KSB0byBoYXZlIHlvdXJzZWxmIGluY2x1ZGVkCitoZXJlIGlmIHlvdSBhcmUgb25lIG9mIHRob3NlIHdlIG1pc3NlZCEKKworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiNjJiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CkBAIC0wLDAgKzEsMTc1IEBACisiIiJBIENhbGxUaXAgd2luZG93IGNsYXNzIGZvciBUa2ludGVyL0lETEUuCisKK0FmdGVyIFRvb2xUaXAucHksIHdoaWNoIHVzZXMgaWRlYXMgZ2xlYW5lZCBmcm9tIFB5U29sCitVc2VkIGJ5IHRoZSBDYWxsVGlwcyBJRExFIGV4dGVuc2lvbi4KKworIiIiCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworSElERV9WSVJUVUFMX0VWRU5UX05BTUUgPSAiPDxjYWxsdGlwd2luZG93LWhpZGU+PiIKK0hJREVfU0VRVUVOQ0VTID0gKCI8S2V5LUVzY2FwZT4iLCAiPEZvY3VzT3V0PiIpCitDSEVDS0hJREVfVklSVFVBTF9FVkVOVF9OQU1FID0gIjw8Y2FsbHRpcHdpbmRvdy1jaGVja2hpZGU+PiIKK0NIRUNLSElERV9TRVFVRU5DRVMgPSAoIjxLZXlSZWxlYXNlPiIsICI8QnV0dG9uUmVsZWFzZT4iKQorQ0hFQ0tISURFX1RJTUUgPSAxMDAgIyBtaWxpc2Vjb25kcworCitNQVJLX1JJR0hUID0gImNhbGx0aXB3aW5kb3dyZWdpb25fcmlnaHQiCisKK2NsYXNzIENhbGxUaXA6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi53aWRnZXQgPSB3aWRnZXQKKyAgICAgICAgc2VsZi50aXB3aW5kb3cgPSBzZWxmLmxhYmVsID0gTm9uZQorICAgICAgICBzZWxmLnBhcmVubGluZSA9IHNlbGYucGFyZW5jb2wgPSBOb25lCisgICAgICAgIHNlbGYubGFzdGxpbmUgPSBOb25lCisgICAgICAgIHNlbGYuaGlkZWlkID0gc2VsZi5jaGVja2hpZGVpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5jaGVja2hpZGVfYWZ0ZXJfaWQgPSBOb25lCisKKyAgICBkZWYgcG9zaXRpb25fd2luZG93KHNlbGYpOgorICAgICAgICAiIiJDaGVjayBpZiBuZWVkcyB0byByZXBvc2l0aW9uIHRoZSB3aW5kb3csIGFuZCBpZiBzbyAtIGRvIGl0LiIiIgorICAgICAgICBjdXJsaW5lID0gaW50KHNlbGYud2lkZ2V0LmluZGV4KCJpbnNlcnQiKS5zcGxpdCgnLicpWzBdKQorICAgICAgICBpZiBjdXJsaW5lID09IHNlbGYubGFzdGxpbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5sYXN0bGluZSA9IGN1cmxpbmUKKyAgICAgICAgc2VsZi53aWRnZXQuc2VlKCJpbnNlcnQiKQorICAgICAgICBpZiBjdXJsaW5lID09IHNlbGYucGFyZW5saW5lOgorICAgICAgICAgICAgYm94ID0gc2VsZi53aWRnZXQuYmJveCgiJWQuJWQiICUgKHNlbGYucGFyZW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFyZW5jb2wpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYm94ID0gc2VsZi53aWRnZXQuYmJveCgiJWQuMCIgJSBjdXJsaW5lKQorICAgICAgICBpZiBub3QgYm94OgorICAgICAgICAgICAgYm94ID0gbGlzdChzZWxmLndpZGdldC5iYm94KCJpbnNlcnQiKSkKKyAgICAgICAgICAgICMgYWxpZ24gdG8gbGVmdCBvZiB3aW5kb3cKKyAgICAgICAgICAgIGJveFswXSA9IDAKKyAgICAgICAgICAgIGJveFsyXSA9IDAKKyAgICAgICAgeCA9IGJveFswXSArIHNlbGYud2lkZ2V0LndpbmZvX3Jvb3R4KCkgKyAyCisgICAgICAgIHkgPSBib3hbMV0gKyBib3hbM10gKyBzZWxmLndpZGdldC53aW5mb19yb290eSgpCisgICAgICAgIHNlbGYudGlwd2luZG93LndtX2dlb21ldHJ5KCIrJWQrJWQiICUgKHgsIHkpKQorCisgICAgZGVmIHNob3d0aXAoc2VsZiwgdGV4dCwgcGFyZW5sZWZ0LCBwYXJlbnJpZ2h0KToKKyAgICAgICAgIiIiU2hvdyB0aGUgY2FsbHRpcCwgYmluZCBldmVudHMgd2hpY2ggd2lsbCBjbG9zZSBpdCBhbmQgcmVwb3NpdGlvbiBpdC4KKyAgICAgICAgIiIiCisgICAgICAgICMgdHJ1bmNhdGUgb3Zlcmx5IGxvbmcgY2FsbHRpcAorICAgICAgICBpZiBsZW4odGV4dCkgPj0gNzk6CisgICAgICAgICAgICB0ZXh0bGluZXMgPSB0ZXh0LnNwbGl0bGluZXMoKQorICAgICAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKHRleHRsaW5lcyk6CisgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gNzk6CisgICAgICAgICAgICAgICAgICAgIHRleHRsaW5lc1tpXSA9IGxpbmVbOjc1XSArICcgLi4uJworICAgICAgICAgICAgdGV4dCA9ICdcbicuam9pbih0ZXh0bGluZXMpCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAgICAgaWYgc2VsZi50aXB3aW5kb3cgb3Igbm90IHNlbGYudGV4dDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYud2lkZ2V0Lm1hcmtfc2V0KE1BUktfUklHSFQsIHBhcmVucmlnaHQpCisgICAgICAgIHNlbGYucGFyZW5saW5lLCBzZWxmLnBhcmVuY29sID0gbWFwKAorICAgICAgICAgICAgaW50LCBzZWxmLndpZGdldC5pbmRleChwYXJlbmxlZnQpLnNwbGl0KCIuIikpCisKKyAgICAgICAgc2VsZi50aXB3aW5kb3cgPSB0dyA9IFRvcGxldmVsKHNlbGYud2lkZ2V0KQorICAgICAgICBzZWxmLnBvc2l0aW9uX3dpbmRvdygpCisgICAgICAgICMgcmVtb3ZlIGJvcmRlciBvbiBjYWxsdGlwIHdpbmRvdworICAgICAgICB0dy53bV9vdmVycmlkZXJlZGlyZWN0KDEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgVGhpcyBjb21tYW5kIGlzIG9ubHkgbmVlZGVkIGFuZCBhdmFpbGFibGUgb24gVGsgPj0gOC40LjAgZm9yIE9TWAorICAgICAgICAgICAgIyBXaXRob3V0IGl0LCBjYWxsIHRpcHMgaW50cnVkZSBvbiB0aGUgdHlwaW5nIHByb2Nlc3MgYnkgZ3JhYmJpbmcKKyAgICAgICAgICAgICMgdGhlIGZvY3VzLgorICAgICAgICAgICAgdHcudGsuY2FsbCgiOjp0azo6dW5zdXBwb3J0ZWQ6Ok1hY1dpbmRvd1N0eWxlIiwgInN0eWxlIiwgdHcuX3csCisgICAgICAgICAgICAgICAgICAgICAgICJoZWxwIiwgIm5vQWN0aXZhdGVzIikKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmxhYmVsID0gTGFiZWwodHcsIHRleHQ9c2VsZi50ZXh0LCBqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kPSIjZmZmZmUwIiwgcmVsaWVmPVNPTElELCBib3JkZXJ3aWR0aD0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udCA9IHNlbGYud2lkZ2V0Wydmb250J10pCisgICAgICAgIHNlbGYubGFiZWwucGFjaygpCisKKyAgICAgICAgc2VsZi5jaGVja2hpZGVpZCA9IHNlbGYud2lkZ2V0LmJpbmQoQ0hFQ0tISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja2hpZGVfZXZlbnQpCisgICAgICAgIGZvciBzZXEgaW4gQ0hFQ0tISURFX1NFUVVFTkNFUzoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmV2ZW50X2FkZChDSEVDS0hJREVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisgICAgICAgIHNlbGYud2lkZ2V0LmFmdGVyKENIRUNLSElERV9USU1FLCBzZWxmLmNoZWNraGlkZV9ldmVudCkKKyAgICAgICAgc2VsZi5oaWRlaWQgPSBzZWxmLndpZGdldC5iaW5kKEhJREVfVklSVFVBTF9FVkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oaWRlX2V2ZW50KQorICAgICAgICBmb3Igc2VxIGluIEhJREVfU0VRVUVOQ0VTOgorICAgICAgICAgICAgc2VsZi53aWRnZXQuZXZlbnRfYWRkKEhJREVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisKKyAgICBkZWYgY2hlY2toaWRlX2V2ZW50KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi50aXB3aW5kb3c6CisgICAgICAgICAgICAjIElmIHRoZSBldmVudCB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSBzYW1lIGV2ZW50IHRoYXQgdW5iaW5kZWQKKyAgICAgICAgICAgICMgdGhpcyBmdW5jdGlvbiwgdGhlIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG5ldmVydGhlbGVzcywKKyAgICAgICAgICAgICMgc28gZG8gbm90aGluZyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY3VybGluZSwgY3VyY29sID0gbWFwKGludCwgc2VsZi53aWRnZXQuaW5kZXgoImluc2VydCIpLnNwbGl0KCcuJykpCisgICAgICAgIGlmIGN1cmxpbmUgPCBzZWxmLnBhcmVubGluZSBvciBcCisgICAgICAgICAgIChjdXJsaW5lID09IHNlbGYucGFyZW5saW5lIGFuZCBjdXJjb2wgPD0gc2VsZi5wYXJlbmNvbCkgb3IgXAorICAgICAgICAgICBzZWxmLndpZGdldC5jb21wYXJlKCJpbnNlcnQiLCAiPiIsIE1BUktfUklHSFQpOgorICAgICAgICAgICAgc2VsZi5oaWRldGlwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb25fd2luZG93KCkKKyAgICAgICAgICAgIGlmIHNlbGYuY2hlY2toaWRlX2FmdGVyX2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud2lkZ2V0LmFmdGVyX2NhbmNlbChzZWxmLmNoZWNraGlkZV9hZnRlcl9pZCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2toaWRlX2FmdGVyX2lkID0gXAorICAgICAgICAgICAgICAgIHNlbGYud2lkZ2V0LmFmdGVyKENIRUNLSElERV9USU1FLCBzZWxmLmNoZWNraGlkZV9ldmVudCkKKworICAgIGRlZiBoaWRlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYudGlwd2luZG93OgorICAgICAgICAgICAgIyBTZWUgdGhlIGV4cGxhbmF0aW9uIGluIGNoZWNraGlkZV9ldmVudC4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmhpZGV0aXAoKQorCisgICAgZGVmIGhpZGV0aXAoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnRpcHdpbmRvdzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBzZXEgaW4gQ0hFQ0tISURFX1NFUVVFTkNFUzoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LmV2ZW50X2RlbGV0ZShDSEVDS0hJREVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisgICAgICAgIHNlbGYud2lkZ2V0LnVuYmluZChDSEVDS0hJREVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZWxmLmNoZWNraGlkZWlkKQorICAgICAgICBzZWxmLmNoZWNraGlkZWlkID0gTm9uZQorICAgICAgICBmb3Igc2VxIGluIEhJREVfU0VRVUVOQ0VTOgorICAgICAgICAgICAgc2VsZi53aWRnZXQuZXZlbnRfZGVsZXRlKEhJREVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisgICAgICAgIHNlbGYud2lkZ2V0LnVuYmluZChISURFX1ZJUlRVQUxfRVZFTlRfTkFNRSwgc2VsZi5oaWRlaWQpCisgICAgICAgIHNlbGYuaGlkZWlkID0gTm9uZQorCisgICAgICAgIHNlbGYubGFiZWwuZGVzdHJveSgpCisgICAgICAgIHNlbGYubGFiZWwgPSBOb25lCisgICAgICAgIHNlbGYudGlwd2luZG93LmRlc3Ryb3koKQorICAgICAgICBzZWxmLnRpcHdpbmRvdyA9IE5vbmUKKworICAgICAgICBzZWxmLndpZGdldC5tYXJrX3Vuc2V0KE1BUktfUklHSFQpCisgICAgICAgIHNlbGYucGFyZW5saW5lID0gc2VsZi5wYXJlbmNvbCA9IHNlbGYubGFzdGxpbmUgPSBOb25lCisKKyAgICBkZWYgaXNfYWN0aXZlKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLnRpcHdpbmRvdykKKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgVGVzdCBDb2RlCisjCitjbGFzcyBjb250YWluZXI6ICMgQ29uY2VwdHVhbGx5IGFuIGVkaXRvcl93aW5kb3cKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHJvb3QgPSBUaygpCisgICAgICAgIHRleHQgPSBzZWxmLnRleHQgPSBUZXh0KHJvb3QpCisgICAgICAgIHRleHQucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCisgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCAic3RyaW5nLnNwbGl0IikKKyAgICAgICAgcm9vdC51cGRhdGUoKQorICAgICAgICBzZWxmLmNhbGx0aXAgPSBDYWxsVGlwKHRleHQpCisKKyAgICAgICAgdGV4dC5ldmVudF9hZGQoIjw8Y2FsbHRpcC1zaG93Pj4iLCAiKCIpCisgICAgICAgIHRleHQuZXZlbnRfYWRkKCI8PGNhbGx0aXAtaGlkZT4+IiwgIikiKQorICAgICAgICB0ZXh0LmJpbmQoIjw8Y2FsbHRpcC1zaG93Pj4iLCBzZWxmLmNhbGx0aXBfc2hvdykKKyAgICAgICAgdGV4dC5iaW5kKCI8PGNhbGx0aXAtaGlkZT4+Iiwgc2VsZi5jYWxsdGlwX2hpZGUpCisKKyAgICAgICAgdGV4dC5mb2N1c19zZXQoKQorICAgICAgICByb290Lm1haW5sb29wKCkKKworICAgIGRlZiBjYWxsdGlwX3Nob3coc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmNhbGx0aXAuc2hvd3RpcCgiSGVsbG8gd29ybGQiKQorCisgICAgZGVmIGNhbGx0aXBfaGlkZShzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuY2FsbHRpcC5oaWRldGlwKCkKKworZGVmIG1haW4oKToKKyAgICAjIFRlc3QgY29kZQorICAgIGM9Y29udGFpbmVyKCkKKworaWYgX19uYW1lX189PSdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzNDJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzNDJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzM2NlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwcy5weQpAQCAtMCwwICsxLDIyNiBAQAorIiIiQ2FsbFRpcHMucHkgLSBBbiBJRExFIEV4dGVuc2lvbiB0byBKb2cgWW91ciBNZW1vcnkKKworQ2FsbCBUaXBzIGFyZSBmbG9hdGluZyB3aW5kb3dzIHdoaWNoIGRpc3BsYXkgZnVuY3Rpb24sIGNsYXNzLCBhbmQgbWV0aG9kCitwYXJhbWV0ZXIgYW5kIGRvY3N0cmluZyBpbmZvcm1hdGlvbiB3aGVuIHlvdSB0eXBlIGFuIG9wZW5pbmcgcGFyZW50aGVzaXMsIGFuZAord2hpY2ggZGlzYXBwZWFyIHdoZW4geW91IHR5cGUgYSBjbG9zaW5nIHBhcmVudGhlc2lzLgorCisiIiIKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgQ2FsbFRpcFdpbmRvdworZnJvbSBpZGxlbGliLkh5cGVyUGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgorCitpbXBvcnQgX19tYWluX18KKworY2xhc3MgQ2FsbFRpcHM6CisKKyAgICBtZW51ZGVmcyA9IFsKKyAgICAgICAgKCdlZGl0JywgWworICAgICAgICAgICAgKCJTaG93IGNhbGwgdGlwIiwgIjw8Zm9yY2Utb3Blbi1jYWxsdGlwPj4iKSwKKyAgICAgICAgXSkKKyAgICBdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbj1Ob25lKToKKyAgICAgICAgaWYgZWRpdHdpbiBpcyBOb25lOiAgIyBzdWJwcm9jZXNzIGFuZCB0ZXN0CisgICAgICAgICAgICBzZWxmLmVkaXR3aW4gPSBOb25lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorICAgICAgICBzZWxmLnRleHQgPSBlZGl0d2luLnRleHQKKyAgICAgICAgc2VsZi5jYWxsdGlwID0gTm9uZQorICAgICAgICBzZWxmLl9tYWtlX2NhbGx0aXBfd2luZG93ID0gc2VsZi5fbWFrZV90a19jYWxsdGlwX3dpbmRvdworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9tYWtlX2NhbGx0aXBfd2luZG93ID0gTm9uZQorCisgICAgZGVmIF9tYWtlX3RrX2NhbGx0aXBfd2luZG93KHNlbGYpOgorICAgICAgICAjIFNlZSBfX2luaXRfXyBmb3IgdXNhZ2UKKyAgICAgICAgcmV0dXJuIENhbGxUaXBXaW5kb3cuQ2FsbFRpcChzZWxmLnRleHQpCisKKyAgICBkZWYgX3JlbW92ZV9jYWxsdGlwX3dpbmRvdyhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5jYWxsdGlwOgorICAgICAgICAgICAgc2VsZi5jYWxsdGlwLmhpZGV0aXAoKQorICAgICAgICAgICAgc2VsZi5jYWxsdGlwID0gTm9uZQorCisgICAgZGVmIGZvcmNlX29wZW5fY2FsbHRpcF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICIiIkhhcHBlbnMgd2hlbiB0aGUgdXNlciByZWFsbHkgd2FudHMgdG8gb3BlbiBhIENhbGxUaXAsIGV2ZW4gaWYgYQorICAgICAgICBmdW5jdGlvbiBjYWxsIGlzIG5lZWRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub3Blbl9jYWxsdGlwKFRydWUpCisKKyAgICBkZWYgdHJ5X29wZW5fY2FsbHRpcF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICIiIkhhcHBlbnMgd2hlbiBpdCB3b3VsZCBiZSBuaWNlIHRvIG9wZW4gYSBDYWxsVGlwLCBidXQgbm90IHJlYWxseQorICAgICAgICBuZWNlc3NhcnksIGZvciBleGFtcGxlIGFmdGVyIGFuIG9wZW5pbmcgYnJhY2tldCwgc28gZnVuY3Rpb24gY2FsbHMKKyAgICAgICAgd29uJ3QgYmUgbWFkZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub3Blbl9jYWxsdGlwKEZhbHNlKQorCisgICAgZGVmIHJlZnJlc2hfY2FsbHRpcF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICIiIklmIHRoZXJlIGlzIGFscmVhZHkgYSBjYWxsdGlwIHdpbmRvdywgY2hlY2sgaWYgaXQgaXMgc3RpbGwgbmVlZGVkLAorICAgICAgICBhbmQgaWYgc28sIHJlbG9hZCBpdC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2FsbHRpcCBhbmQgc2VsZi5jYWxsdGlwLmlzX2FjdGl2ZSgpOgorICAgICAgICAgICAgc2VsZi5vcGVuX2NhbGx0aXAoRmFsc2UpCisKKyAgICBkZWYgb3Blbl9jYWxsdGlwKHNlbGYsIGV2YWxmdW5jcyk6CisgICAgICAgIHNlbGYuX3JlbW92ZV9jYWxsdGlwX3dpbmRvdygpCisKKyAgICAgICAgaHAgPSBIeXBlclBhcnNlcihzZWxmLmVkaXR3aW4sICJpbnNlcnQiKQorICAgICAgICBzdXJfcGFyZW4gPSBocC5nZXRfc3Vycm91bmRpbmdfYnJhY2tldHMoJygnKQorICAgICAgICBpZiBub3Qgc3VyX3BhcmVuOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGhwLnNldF9pbmRleChzdXJfcGFyZW5bMF0pCisgICAgICAgIGV4cHJlc3Npb24gPSBocC5nZXRfZXhwcmVzc2lvbigpCisgICAgICAgIGlmIG5vdCBleHByZXNzaW9uIG9yIChub3QgZXZhbGZ1bmNzIGFuZCBleHByZXNzaW9uLmZpbmQoJygnKSAhPSAtMSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYXJnX3RleHQgPSBzZWxmLmZldGNoX3RpcChleHByZXNzaW9uKQorICAgICAgICBpZiBub3QgYXJnX3RleHQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jYWxsdGlwID0gc2VsZi5fbWFrZV9jYWxsdGlwX3dpbmRvdygpCisgICAgICAgIHNlbGYuY2FsbHRpcC5zaG93dGlwKGFyZ190ZXh0LCBzdXJfcGFyZW5bMF0sIHN1cl9wYXJlblsxXSkKKworICAgIGRlZiBmZXRjaF90aXAoc2VsZiwgZXhwcmVzc2lvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgYXJndW1lbnQgbGlzdCBhbmQgZG9jc3RyaW5nIG9mIGEgZnVuY3Rpb24gb3IgY2xhc3MKKworICAgICAgICBJZiB0aGVyZSBpcyBhIFB5dGhvbiBzdWJwcm9jZXNzLCBnZXQgdGhlIGNhbGx0aXAgdGhlcmUuICBPdGhlcndpc2UsCisgICAgICAgIGVpdGhlciBmZXRjaF90aXAoKSBpcyBydW5uaW5nIGluIHRoZSBzdWJwcm9jZXNzIGl0c2VsZiBvciBpdCB3YXMgY2FsbGVkCisgICAgICAgIGluIGFuIElETEUgRWRpdG9yV2luZG93IGJlZm9yZSBhbnkgc2NyaXB0IGhhZCBiZWVuIHJ1bi4KKworICAgICAgICBUaGUgc3VicHJvY2VzcyBlbnZpcm9ubWVudCBpcyB0aGF0IG9mIHRoZSBtb3N0IHJlY2VudGx5IHJ1biBzY3JpcHQuICBJZgorICAgICAgICB0d28gdW5yZWxhdGVkIG1vZHVsZXMgYXJlIGJlaW5nIGVkaXRlZCBzb21lIGNhbGx0aXBzIGluIHRoZSBjdXJyZW50CisgICAgICAgIG1vZHVsZSBtYXkgYmUgaW5vcGVyYXRpdmUgaWYgdGhlIG1vZHVsZSB3YXMgbm90IHRoZSBsYXN0IHRvIHJ1bi4KKworICAgICAgICBUbyBmaW5kIG1ldGhvZHMsIGZldGNoX3RpcCBtdXN0IGJlIGZlZCBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBycGNjbHQgPSBzZWxmLmVkaXR3aW4uZmxpc3QucHlzaGVsbC5pbnRlcnAucnBjY2x0CisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJwY2NsdCA9IE5vbmUKKyAgICAgICAgaWYgcnBjY2x0OgorICAgICAgICAgICAgcmV0dXJuIHJwY2NsdC5yZW1vdGVjYWxsKCJleGVjIiwgImdldF90aGVfY2FsbHRpcCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cHJlc3Npb24sKSwge30pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnRpdHkgPSBzZWxmLmdldF9lbnRpdHkoZXhwcmVzc2lvbikKKyAgICAgICAgICAgIHJldHVybiBnZXRfYXJnX3RleHQoZW50aXR5KQorCisgICAgZGVmIGdldF9lbnRpdHkoc2VsZiwgZXhwcmVzc2lvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gZXhwcmVzc2lvbiBldmFsdWF0ZWQKKyAgICAgICAgaW4gYSBuYW1lc3BhY2Ugc3Bhbm5pbmcgc3lzLm1vZHVsZXMgYW5kIF9fbWFpbi5kaWN0X18uCisgICAgICAgICIiIgorICAgICAgICBpZiBleHByZXNzaW9uOgorICAgICAgICAgICAgbmFtZXNwYWNlID0gc3lzLm1vZHVsZXMuY29weSgpCisgICAgICAgICAgICBuYW1lc3BhY2UudXBkYXRlKF9fbWFpbl9fLl9fZGljdF9fKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBldmFsKGV4cHJlc3Npb24sIG5hbWVzcGFjZSkKKyAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICMgQW4gdW5jYXVnaHQgZXhjZXB0aW9uIGNsb3NlcyBpZGxlLCBhbmQgZXZhbCBjYW4gcmFpc2UgYW55CisgICAgICAgICAgICAgICAgIyBleGNlcHRpb24sIGVzcGVjaWFsbHkgaWYgdXNlciBjbGFzc2VzIGFyZSBpbnZvbHZlZC4KKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCitkZWYgX2ZpbmRfY29uc3RydWN0b3IoY2xhc3Nfb2IpOgorICAgICMgR2l2ZW4gYSBjbGFzcyBvYmplY3QsIHJldHVybiBhIGZ1bmN0aW9uIG9iamVjdCB1c2VkIGZvciB0aGUKKyAgICAjIGNvbnN0cnVjdG9yIChpZSwgX19pbml0X18oKSApIG9yIE5vbmUgaWYgd2UgY2FuJ3QgZmluZCBvbmUuCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gY2xhc3Nfb2IuX19pbml0X18uaW1fZnVuYworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgZm9yIGJhc2UgaW4gY2xhc3Nfb2IuX19iYXNlc19fOgorICAgICAgICAgICAgcmMgPSBfZmluZF9jb25zdHJ1Y3RvcihiYXNlKQorICAgICAgICAgICAgaWYgcmMgaXMgbm90IE5vbmU6IHJldHVybiByYworICAgIHJldHVybiBOb25lCisKK2RlZiBnZXRfYXJnX3RleHQob2IpOgorICAgICIiIkdldCBhIHN0cmluZyBkZXNjcmliaW5nIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBnaXZlbiBvYmplY3QsCisgICAgICAgb25seSBpZiBpdCBpcyBjYWxsYWJsZS4iIiIKKyAgICBhcmdfdGV4dCA9ICIiCisgICAgaWYgb2IgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIob2IsICdfX2NhbGxfXycpOgorICAgICAgICBhcmdfb2Zmc2V0ID0gMAorICAgICAgICBpZiB0eXBlKG9iKSBpbiAodHlwZXMuQ2xhc3NUeXBlLCB0eXBlcy5UeXBlVHlwZSk6CisgICAgICAgICAgICAjIExvb2sgZm9yIHRoZSBoaWdoZXN0IF9faW5pdF9fIGluIHRoZSBjbGFzcyBjaGFpbi4KKyAgICAgICAgICAgIGZvYiA9IF9maW5kX2NvbnN0cnVjdG9yKG9iKQorICAgICAgICAgICAgaWYgZm9iIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZm9iID0gbGFtYmRhOiBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFyZ19vZmZzZXQgPSAxCisgICAgICAgIGVsaWYgdHlwZShvYik9PXR5cGVzLk1ldGhvZFR5cGU6CisgICAgICAgICAgICAjIGJpdCBvZiBhIGhhY2sgZm9yIG1ldGhvZHMgLSB0dXJuIGl0IGludG8gYSBmdW5jdGlvbgorICAgICAgICAgICAgIyBidXQgd2UgZHJvcCB0aGUgInNlbGYiIHBhcmFtLgorICAgICAgICAgICAgZm9iID0gb2IuaW1fZnVuYworICAgICAgICAgICAgYXJnX29mZnNldCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvYiA9IG9iCisgICAgICAgICMgVHJ5IHRvIGJ1aWxkIG9uZSBmb3IgUHl0aG9uIGRlZmluZWQgZnVuY3Rpb25zCisgICAgICAgIGlmIHR5cGUoZm9iKSBpbiBbdHlwZXMuRnVuY3Rpb25UeXBlLCB0eXBlcy5MYW1iZGFUeXBlXToKKyAgICAgICAgICAgIGFyZ2NvdW50ID0gZm9iLmZ1bmNfY29kZS5jb19hcmdjb3VudAorICAgICAgICAgICAgcmVhbF9hcmdzID0gZm9iLmZ1bmNfY29kZS5jb192YXJuYW1lc1thcmdfb2Zmc2V0OmFyZ2NvdW50XQorICAgICAgICAgICAgZGVmYXVsdHMgPSBmb2IuZnVuY19kZWZhdWx0cyBvciBbXQorICAgICAgICAgICAgZGVmYXVsdHMgPSBsaXN0KG1hcChsYW1iZGEgbmFtZTogIj0lcyIgJSByZXByKG5hbWUpLCBkZWZhdWx0cykpCisgICAgICAgICAgICBkZWZhdWx0cyA9IFsiIl0gKiAobGVuKHJlYWxfYXJncykgLSBsZW4oZGVmYXVsdHMpKSArIGRlZmF1bHRzCisgICAgICAgICAgICBpdGVtcyA9IG1hcChsYW1iZGEgYXJnLCBkZmx0OiBhcmcgKyBkZmx0LCByZWFsX2FyZ3MsIGRlZmF1bHRzKQorICAgICAgICAgICAgaWYgZm9iLmZ1bmNfY29kZS5jb19mbGFncyAmIDB4NDoKKyAgICAgICAgICAgICAgICBpdGVtcy5hcHBlbmQoIi4uLiIpCisgICAgICAgICAgICBpZiBmb2IuZnVuY19jb2RlLmNvX2ZsYWdzICYgMHg4OgorICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgiKioqIikKKyAgICAgICAgICAgIGFyZ190ZXh0ID0gIiwgIi5qb2luKGl0ZW1zKQorICAgICAgICAgICAgYXJnX3RleHQgPSAiKCVzKSIgJSByZS5zdWIoIlwuXGQrIiwgIjx0dXBsZT4iLCBhcmdfdGV4dCkKKyAgICAgICAgIyBTZWUgaWYgd2UgY2FuIHVzZSB0aGUgZG9jc3RyaW5nCisgICAgICAgIGRvYyA9IGdldGF0dHIob2IsICJfX2RvY19fIiwgIiIpCisgICAgICAgIGlmIGRvYzoKKyAgICAgICAgICAgIGRvYyA9IGRvYy5sc3RyaXAoKQorICAgICAgICAgICAgcG9zID0gZG9jLmZpbmQoIlxuIikKKyAgICAgICAgICAgIGlmIHBvcyA8IDAgb3IgcG9zID4gNzA6CisgICAgICAgICAgICAgICAgcG9zID0gNzAKKyAgICAgICAgICAgIGlmIGFyZ190ZXh0OgorICAgICAgICAgICAgICAgIGFyZ190ZXh0ICs9ICJcbiIKKyAgICAgICAgICAgIGFyZ190ZXh0ICs9IGRvY1s6cG9zXQorICAgIHJldHVybiBhcmdfdGV4dAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFRlc3QgY29kZQorIworaWYgX19uYW1lX189PSdfX21haW5fXyc6CisKKyAgICBkZWYgdDEoKTogIigpIgorICAgIGRlZiB0MihhLCBiPU5vbmUpOiAiKGEsIGI9Tm9uZSkiCisgICAgZGVmIHQzKGEsICphcmdzKTogIihhLCAuLi4pIgorICAgIGRlZiB0NCgqYXJncyk6ICIoLi4uKSIKKyAgICBkZWYgdDUoYSwgKmFyZ3MpOiAiKGEsIC4uLikiCisgICAgZGVmIHQ2KGEsIGI9Tm9uZSwgKmFyZ3MsICoqa3cpOiAiKGEsIGI9Tm9uZSwgLi4uLCAqKiopIgorICAgIGRlZiB0NygoYSwgYiksIGMsIChkLCBlKSk6ICIoPHR1cGxlPiwgYywgPHR1cGxlPikiCisKKyAgICBjbGFzcyBUQyhvYmplY3QpOgorICAgICAgICAiKGFpPU5vbmUsIC4uLikiCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhaT1Ob25lLCAqYik6ICIoYWk9Tm9uZSwgLi4uKSIKKyAgICAgICAgZGVmIHQxKHNlbGYpOiAiKCkiCisgICAgICAgIGRlZiB0MihzZWxmLCBhaSwgYj1Ob25lKTogIihhaSwgYj1Ob25lKSIKKyAgICAgICAgZGVmIHQzKHNlbGYsIGFpLCAqYXJncyk6ICIoYWksIC4uLikiCisgICAgICAgIGRlZiB0NChzZWxmLCAqYXJncyk6ICIoLi4uKSIKKyAgICAgICAgZGVmIHQ1KHNlbGYsIGFpLCAqYXJncyk6ICIoYWksIC4uLikiCisgICAgICAgIGRlZiB0NihzZWxmLCBhaSwgYj1Ob25lLCAqYXJncywgKiprdyk6ICIoYWksIGI9Tm9uZSwgLi4uLCAqKiopIgorICAgICAgICBkZWYgdDcoc2VsZiwgKGFpLCBiKSwgYywgKGQsIGUpKTogIig8dHVwbGU+LCBjLCA8dHVwbGU+KSIKKworICAgIGRlZiB0ZXN0KHRlc3RzKToKKyAgICAgICAgY3QgPSBDYWxsVGlwcygpCisgICAgICAgIGZhaWxlZD1bXQorICAgICAgICBmb3IgdCBpbiB0ZXN0czoKKyAgICAgICAgICAgIGV4cGVjdGVkID0gdC5fX2RvY19fICsgIlxuIiArIHQuX19kb2NfXworICAgICAgICAgICAgbmFtZSA9IHQuX19uYW1lX18KKyAgICAgICAgICAgICMgZXhlcmNpc2UgZmV0Y2hfdGlwKCksIG5vdCBqdXN0IGdldF9hcmdfdGV4dCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcXVhbGlmaWVkX25hbWUgPSAiJXMuJXMiICUgKHQuaW1fY2xhc3MuX19uYW1lX18sIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcXVhbGlmaWVkX25hbWUgPSBuYW1lCisgICAgICAgICAgICBhcmdfdGV4dCA9IGN0LmZldGNoX3RpcChxdWFsaWZpZWRfbmFtZSkKKyAgICAgICAgICAgIGlmIGFyZ190ZXh0ICE9IGV4cGVjdGVkOgorICAgICAgICAgICAgICAgIGZhaWxlZC5hcHBlbmQodCkKKyAgICAgICAgICAgICAgICBmbXQgPSAiJXMgLSBleHBlY3RlZCAlcywgYnV0IGdvdCAlcyIKKyAgICAgICAgICAgICAgICBwcmludCAgZm10ICUgKHQuX19uYW1lX18sIGV4cGVjdGVkLCBnZXRfYXJnX3RleHQodCkpCisgICAgICAgIHByaW50ICIlZCBvZiAlZCB0ZXN0cyBmYWlsZWQiICUgKGxlbihmYWlsZWQpLCBsZW4odGVzdHMpKQorCisgICAgdGMgPSBUQygpCisgICAgdGVzdHMgPSAodDEsIHQyLCB0MywgdDQsIHQ1LCB0NiwgdDcsCisgICAgICAgICAgICAgVEMsIHRjLnQxLCB0Yy50MiwgdGMudDMsIHRjLnQ0LCB0Yy50NSwgdGMudDYsIHRjLnQ3KQorCisgICAgdGVzdCh0ZXN0cykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwcy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTZmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DYWxsVGlwcy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTZmMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2FsbFRpcHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9DaGFuZ2VMb2cgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTg3MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2hhbmdlTG9nCkBAIC0wLDAgKzEsMTU5MSBAQAorUGxlYXNlIHJlZmVyIHRvIHRoZSBJRExFZm9yayBhbmQgSURMRSBDVlMgcmVwb3NpdG9yaWVzIGZvcgorY2hhbmdlIGRldGFpbHMgc3Vic2VxdWVudCB0byB0aGUgMC44LjEgcmVsZWFzZS4KKworCitJRExFZm9yayBDaGFuZ2VMb2cKKz09PT09PT09PT09PT09PT09PQorCisyMDAxLTA3LTIwIDExOjM1ICBlbGd1YXZhcworCisJKiBSRUFETUUudHh0LCBORVdTLnR4dDogYnJpbmcgdXAgdG8gZGF0ZSBmb3IgMC44LjEgcmVsZWFzZQorCisyMDAxLTA3LTE5IDE2OjQwICBlbGd1YXZhcworCisJKiBJRExFRk9SSy5odG1sOiByZXBsYWNlZCBieSBJRExFRk9SSy1pbmRleC5odG1sCisKKzIwMDEtMDctMTkgMTY6MzkgIGVsZ3VhdmFzCisKKwkqIElETEVGT1JLLWluZGV4Lmh0bWw6IHVwZGF0ZWQgcGxhY2Vob2xkZXIgaWRsZWZvcmsgaG9tZXBhZ2UKKworMjAwMS0wNy0xOSAxNDo0OSAgZWxndWF2YXMKKworCSogQ2hhbmdlTG9nLCBFZGl0b3JXaW5kb3cucHksIElOU1RBTExBVElPTiwgTkVXUy50eHQsIFJFQURNRS50eHQsCisJVE9ETy50eHQsIGlkbGV2ZXIucHk6IAorCW1pbm9yIHRpZHktdXBzIHJlYWR5IGZvciAwLjguMSBhbHBoYSB0YXJiYWxsIHJlbGVhc2UKKworMjAwMS0wNy0xNyAxNToxMiAga2JrCisKKwkqIElOU1RBTExBVElPTiwgc2V0dXAucHk6IElOU1RBTExBVElPTjogUmVtb3ZlIHRoZSBjb2V4aXN0LnBhdGNoCisJaW5zdHJ1Y3Rpb25zCisJCisJKioqKioqKioqKioqKioqKiBzZXR1cC5weToKKwkKKwlSZW1vdmUgdGhlIGlkbGVzIHNjcmlwdCwgYWRkIHNvbWUgd29yZHMgb24gSURMRSBGb3JrIHRvIHRoZQorCWxvbmdfZGVzY3JpcHRpb24sIGFuZCBjbGVhbiB1cCBzb21lIGxpbmUgc3BhY2luZy4KKworMjAwMS0wNy0xNyAxNTowMSAga2JrCisKKwkqIGNvZXhpc3QucGF0Y2g6IFB1dCB0aGlzIGluIHRoZSBhdHRpYywgYXQgbGVhc3QgZm9yIG5vdy4uLgorCisyMDAxLTA3LTE3IDE0OjU5ICBrYmsKKworCSogUHlTaGVsbC5weSwgaWRsZSwgaWRsZXM6IEltcGxlbWVudCBpZGxlIGNvbW1hbmQgaW50ZXJmYWNlIGFzCisJc3VnZ2VzdGVkIGJ5IEd2UiBbaWRsZS1kZXZdIDE2IEp1bHkgKioqKioqKioqKioqKioqKiBQeVNoZWxsOiBBZGRlZAorCWZ1bmN0aW9uYWxpdHk6CisJCisJdXNhZ2U6IGlkbGUucHkgWy1jIGNvbW1hbmRdIFstZF0gWy1pXSBbLXIgc2NyaXB0XSBbLXNdIFstdCB0aXRsZV0KKwlbYXJnXSAuLi4KKwkKKwlpZGxlIGZpbGUocykJKHdpdGhvdXQgb3B0aW9ucykgZWRpdCB0aGUgZmlsZShzKQorCQorCS1jIGNtZAkgICBydW4gdGhlIGNvbW1hbmQgaW4gYSBzaGVsbCAtZAkgZW5hYmxlIHRoZQorCWRlYnVnZ2VyIC1pCSAgICBvcGVuIGFuIGludGVyYWN0aXZlIHNoZWxsIC1pIGZpbGUocykgb3BlbiBhCisJc2hlbGwgYW5kIGFsc28gYW4gZWRpdG9yIHdpbmRvdyBmb3IgZWFjaCBmaWxlIC1yIHNjcmlwdCAgcnVuIGEgZmlsZQorCWFzIGEgc2NyaXB0IGluIGEgc2hlbGwgLXMJICBydW4gJElETEVTVEFSVFVQIG9yCisJJFBZVEhPTlNUQVJUVVAgYmVmb3JlIGFueXRoaW5nIGVsc2UgLXQgdGl0bGUgICBzZXQgdGl0bGUgb2Ygc2hlbGwKKwl3aW5kb3cKKwkKKwlSZW1haW5pbmcgYXJndW1lbnRzIGFyZSBhcHBsaWVkIHRvIHRoZSBjb21tYW5kICgtYykgb3Igc2NyaXB0ICgtcikuCisJCisJKioqKioqKioqKioqKioqKioqIGlkbGVzOiBSZW1vdmVkIHRoZSBpZGxlcyBzY3JpcHQsIG5vdCBuZWVkZWQKKwkKKwkqKioqKioqKioqKioqKioqKiogaWRsZTogIFJlbW92ZWQgdGhlIElkbGVDb25mIHJlZmVyZW5jZXMsIG5vdAorCXJlcXVpcmVkIGFueW1vcmUKKworMjAwMS0wNy0xNiAxNzowOCAga2JrCisKKwkqIElOU1RBTExBVElPTiwgY29leGlzdC5wYXRjaDogQWRkZWQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KKwkKKwlBZGRlZCBhIHBhdGNoIHdoaWNoIG1vZGlmaWVzIGlkbGVmb3JrIHNvIHRoYXQgaXQgY2FuIGNvLWV4aXN0IHdpdGgKKwkib2ZmaWNpYWwiIElETEUgaW4gdGhlIHNpdGUtcGFja2FnZXMgZGlyZWN0b3J5LiBUaGlzIHBhdGNoIGlzIG5vdAorCW5lY2Vzc2FyeSBpZiBvbmx5IGlkbGVmb3JrIElETEUgaXMgaW5zdGFsbGVkLiBTZWUgSU5TVEFMTEFUSU9OIGZvcgorCWZ1cnRoZXIgZGV0YWlscy4KKworMjAwMS0wNy0xNiAxNTo1MCAga2JrCisKKwkqIGlkbGVzOiBBZGQgYSBzY3JpcHQgImlkbGVzIiB3aGljaCBvcGVucyBhIFB5dGhvbiBTaGVsbCB3aW5kb3cuCisJCisJVGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIGlkbGVmb3JrIGlkbGUgaXMgdG8gb3BlbiBhbiBlZGl0b3Igd2luZG93CisJaW5zdGVhZCBvZiBhIHNoZWxsLiBDb21wbGV4IGV4cHJlc3Npb25zIG1heSBiZSBydW4gaW4gYSBmcmVzaAorCWVudmlyb25tZW50IGJ5IHNlbGVjdGluZyAicnVuIi4gIFRoZXJlIGFyZSB0aW1lcywgaG93ZXZlciwgd2hlbiBhCisJc2hlbGwgaXMgZGVzaXJlZC4gIFRob3VnaCBvbmUgY2FuIGJlIHN0YXJ0ZWQgYnkgImlkbGUgLXQgJ2ZvbyciLAorCXRoaXMgc2NyaXB0IGlzIG1vcmUgY29udmVuaWVudC4gIEluIGFkZGl0aW9uLCBhIHNoZWxsIGFuZCBhbiBlZGl0b3IKKwl3aW5kb3cgY2FuIGJlIHN0YXJ0ZWQgaW4gcGFyYWxsZWwgYnkgImlkbGVzIC1lIGZvby5weSIuCisKKzIwMDEtMDctMTYgMTU6MjUgIGtiaworCisJKiBQeVNoZWxsLnB5OiBDYWxsIG91dCBJRExFIEZvcmsgaW4gc3RhcnR1cCBtZXNzYWdlLgorCisyMDAxLTA3LTE2IDE0OjAwICBrYmsKKworCSogUHlTaGVsbC5weSwgc2V0dXAucHk6IEFkZCBhIHNjcmlwdCAiaWRsZXMiIHdoaWNoIG9wZW5zIGEgUHl0aG9uCisJU2hlbGwgd2luZG93LgorCQorCVRoZSBkZWZhdWx0IGJlaGF2aW91ciBvZiBpZGxlZm9yayBpZGxlIGlzIHRvIG9wZW4gYW4gZWRpdG9yIHdpbmRvdworCWluc3RlYWQgb2YgYSBzaGVsbC4gQ29tcGxleCBleHByZXNzaW9ucyBtYXkgYmUgcnVuIGluIGEgZnJlc2gKKwllbnZpcm9ubWVudCBieSBzZWxlY3RpbmcgInJ1biIuICBUaGVyZSBhcmUgdGltZXMsIGhvd2V2ZXIsIHdoZW4gYQorCXNoZWxsIGlzIGRlc2lyZWQuICBUaG91Z2ggb25lIGNhbiBiZSBzdGFydGVkIGJ5ICJpZGxlIC10ICdmb28nIiwKKwl0aGlzIHNjcmlwdCBpcyBtb3JlIGNvbnZlbmllbnQuICBJbiBhZGRpdGlvbiwgYSBzaGVsbCBhbmQgYW4gZWRpdG9yCisJd2luZG93IGNhbiBiZSBzdGFydGVkIGluIHBhcmFsbGVsIGJ5ICJpZGxlcyAtZSBmb28ucHkiLgorCisyMDAxLTA3LTE1IDAzOjA2ICBrYmsKKworCSogcHljbGJyLnB5LCB0YWJuYW5ueS5weTogdGFibmFubnkgYW5kIHB5Y2xiciBhcmUgbm93IGZvdW5kIGluIC9MaWIKKworMjAwMS0wNy0xNSAwMjoyOSAga2JrCisKKwkqIEJyb3dzZXJDb250cm9sLnB5OiBSZW1vdmUsIHdhcyByZXRhaW5lZCBmb3IgMS41LjIgc3VwcG9ydAorCisyMDAxLTA3LTE0IDE1OjQ4ICBrYmsKKworCSogc2V0dXAucHk6IEluc3RhbGxpbmcgSWRsZSB0byBzaXRlLXBhY2thZ2VzIHZpYSBEaXN0dXRpbHMgZG9lcyBub3QKKwljb3B5IHRoZSBJZGxlIGhlbHAudHh0IGZpbGUuCisJCisJUmVmIFNGIFB5dGhvbiBQYXRjaCA0MjI0NzEKKworMjAwMS0wNy0xNCAxNToyNiAga2JrCisKKwkqIGtleWRlZnMucHk6IHB5LWN2cy0yMDAxXzA3XzEzIChSZXYgMS4zKSBtZXJnZQorCQorCSJNYWtlIGNvcHksIGN1dCBhbmQgcGFzdGUgZXZlbnRzIGNhc2UgaW5zZW5zaXRpdmUuICBSZXBvcnRlZCBieQorCVBhdHJpY2sgSy4gTydCcmllbiBvbiBpZGxlLWRldi4gKFNob3VsZCBvdGhlciBiaW5kaW5ncyBmb2xsb3cKKwlzdWl0PykiIC0tR3ZSCisKKzIwMDEtMDctMTQgMTU6MjEgIGtiaworCisJKiBpZGxlLnB5OiBweS1jdnMtMjAwMV8wN18xMyAoUmV2IDEuNCkgbWVyZ2UKKwkKKwkiTW92ZSB0aGUgYWN0aW9uIG9mIGxvYWRpbmcgdGhlIGNvbmZpZ3VyYXRpb24gdG8gdGhlIElkbGVDb25mCisJbW9kdWxlIHJhdGhlciB0aGFuIHRoZSBpZGxlLnB5IHNjcmlwdC4JVGhpcyBoYXMgYWR2YW50YWdlcyBhbmQKKwlkaXNhZHZhbnRhZ2VzOyB0aGUgYmlnZ2VzdCBhZHZhbnRhZ2UgYmVpbmcgdGhhdCB3ZSBjYW4gbW9yZSBlYXNpbHkKKwloYXZlIGFuIGFsdGVybmF0aXZlIG1haW4gcHJvZ3JhbS4iICAtLUd2UgorCisyMDAxLTA3LTE0IDE1OjE4ICBrYmsKKworCSogZXh0ZW5kLnR4dDogcHktY3ZzLTIwMDFfMDdfMTMgKFJldiAxLjQpIG1lcmdlCisJCisJIlF1aWNrIHVwZGF0ZSB0byB0aGUgZXh0ZW5zaW9uIG1lY2hhbmlzbSAoZXh0ZW5kLnB5IGlzIGdvbmUsIGxvbmcKKwlsaXZlIGNvbmZpZy50eHQpIiAtLUd2UgorCisyMDAxLTA3LTE0IDE1OjE1ICBrYmsKKworCSogU3RhY2tWaWV3ZXIucHk6IHB5LWN2cy0yMDAxXzA3XzEzIChSZXYgMS4xNikgbWVyZ2UKKwkKKwkiUmVmYWN0b3JlZCwgd2l0aCBzb21lIGZ1dHVyZSBwbGFucyBpbiBtaW5kLiBUaGlzIG5vdyB1c2VzIHRoZSBuZXcKKwlnb3RvZmlsZWxpbmUoKSBtZXRob2QgZGVmaW5lZCBpbiBGaWxlTGlzdC5weSIgIC0tR3ZSCisKKzIwMDEtMDctMTQgMTU6MTAgIGtiaworCisJKiBQeVNoZWxsLnB5OiBweS1jdnMtMjAwMV8wN18xMyAoUmV2IDEuMzQpIG1lcmdlCisJCisJIkFtYXppbmcuICBBIHZlcnkgc3VidGxlIGNoYW5nZSBpbiBwb2xpY3kgaW4gZGVzY3ItYnJhbmNoIGFjdHVhbGx5CisJZm91bmQgYSBidWcgaGVyZS4gIEhlcmUncyB0aGUgZGVhbDogQ2xhc3MgUHlTaGVsbCBkZXJpdmVzIGZyb20KKwljbGFzcyBPdXRwdXRXaW5kb3cuICBNZXRob2QgUHlTaGVsbC5jbG9zZSgpIHdhbnRzIHRvIGludm9rZSBpdHMKKwlwYXJlbnQgbWV0aG9kLCBidXQgYmVjYXVzZSBQeVNoZWxsIGxvbmcgYWdvIHdhcyBpbmhlcml0ZWQgZnJvbQorCWNsYXNzIFB5U2hlbGxFZGl0b3JXaW5kb3csIGl0IGludm9rZXMKKwlQeVNoZWxFZGl0b3JXaW5kb3cuY2xvc2Uoc2VsZikuICBOb3csIGNsYXNzIFB5U2hlbGxFZGl0b3JXaW5kb3cKKwlpdHNlbGYgZGVyaXZlcyBmcm9tIGNsYXNzIE91dHB1dFdpbmRvdywgYW5kIGluaGVyaXRzIHRoZSBjbG9zZSgpCisJbWV0aG9kIGZyb20gdGhlcmUgd2l0aG91dCBvdmVycmlkaW5nIGl0LiAgVW5kZXIgdGhlIG9sZCBydWxlcywKKwlQeVNoZWxsRWRpdG9yV2luZG93LmNsb3NlIHdvdWxkIHJldHVybiBhbiB1bmJvdW5kIG1ldGhvZCByZXN0cmljdGVkCisJdG8gdGhlIGNsYXNzIHRoYXQgZGVmaW5lZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgY2xvc2UoKSwgd2hpY2ggd2FzCisJT3V0cHV0V2luZG93LmNsb3NlLiAgVW5kZXIgdGhlIG5ldyBydWxlcywgdGhlIHVuYm91bmQgbWV0aG9kIGlzCisJcmVzdHJpY3RlZCB0byB0aGUgY2xhc3Mgd2hvc2UgbWV0aG9kIHdhcyByZXF1ZXN0ZWQsIHRoYXQgaXMKKwlQeVNoZWxsRWRpdG9yV2luZG93LCBhbmQgdGhpcyB3YXMgY29ycmVjdGx5IHRyYXBwZWQgYXMgYW4gZXJyb3IuIgorCS0tR3ZSCisKKzIwMDEtMDctMTQgMTQ6NTkgIGtiaworCisJKiBQeVBhcnNlLnB5OiBweS1jdnMtMjAwMV8wN18xMyAoUmVsIDEuOSkgbWVyZ2UKKwkKKwkiVGF1Z2h0IElETEUncyBhdXRvaWRlbnQgcGFyc2VyIHRoYXQgInlpZWxkIiBpcyBhIGtleXdvcmQgdGhhdAorCWJlZ2lucyBhIHN0bXQuCUFsb25nIHcvIHRoZSBwcmVjZWRpbmcgY2hhbmdlIHRvIGtleXdvcmQucHksIG1ha2luZworCWFsbCB0aGlzIHdvcmsgdy8gYSBmdXR1cmUtc3RtdCBqdXN0IGxvb2tzIGhhcmRlciBhbmQgaGFyZGVyLiIKKwktLXRpbV9vbmUKKwkKKwkoRnJvbSBSZWwgMS44OiAiSGFjayB0byBtYWtlIHRoaXMgc3RpbGwgd29yayB3aXRoIFB5dGhvbiAxLjUuMi4gCisJOy0oICIgLS1mZHJha2UpCisKKzIwMDEtMDctMTQgMTQ6NTEgIGtiaworCisJKiBJZGxlQ29uZi5weTogcHktY3ZzLTIwMDFfMDdfMTMgKFJlbCAxLjcpIG1lcmdlCisJCisJIk1vdmUgdGhlIGFjdGlvbiBvZiBsb2FkaW5nIHRoZSBjb25maWd1cmF0aW9uIHRvIHRoZSBJZGxlQ29uZgorCW1vZHVsZSByYXRoZXIgdGhhbiB0aGUgaWRsZS5weSBzY3JpcHQuCVRoaXMgaGFzIGFkdmFudGFnZXMgYW5kCisJZGlzYWR2YW50YWdlczsgdGhlIGJpZ2dlc3QgYWR2YW50YWdlIGJlaW5nIHRoYXQgd2UgY2FuIG1vcmUgZWFzaWx5CisJaGF2ZSBhbiBhbHRlcm5hdGl2ZSBtYWluIHByb2dyYW0uIiAtLUd2UgorCisyMDAxLTA3LTE0IDE0OjQ1ICBrYmsKKworCSogRmlsZUxpc3QucHk6IHB5LWN2cy0yMDAwXzA3XzEzIChSZXYgMS45KSBtZXJnZQorCQorCSJEZWxldGUgZ29vZG5hbWUoKSBtZXRob2QsIHdoaWNoIGlzIHVudXNlZC4gQWRkIGdvdG9maWxlbGluZSgpLCBhCisJY29udmVuaWVuY2UgbWV0aG9kIHdoaWNoIEkgaW50ZW5kIHRvIHVzZSBpbiBhIHZhcmlhbnQuIFJlbmFtZQorCXRlc3QoKSB0byBfdGVzdCgpLiIgIC0tR3ZSCisJCisJVGhpcyB3YXMgYW4gaW50ZXJlc3RpbmcgbWVyZ2UuIFRoZSBqb2luIGNvbXBsZXRlbHkgbWlzc2VkIHJlbW92aW5nCisJZ29vZG5hbWUoKSwgd2hpY2ggd2FzIGFkamFjZW50LCBidXQgb3V0c2lkZSBvZiwgYSBzbWFsbCBjb25mbGljdC4gCisJSSBvbmx5IGNhdWdodCBpdCBieSBjb21wYXJpbmcgdGhlIDEuMS4zLjIvMS4xLjMuMyBkaWZmLiAgQ1ZTIGFpbid0CisJaW5mYWxsaWJsZS4KKworMjAwMS0wNy0xNCAxMzo1OCAga2JrCisKKwkqIEVkaXRvcldpbmRvdy5weTogcHktY3ZzLTIwMDBfMDdfMTMgKFJldiAxLjM4KSBtZXJnZSAiUmVtb3ZlCisJbGVnYWN5IHN1cHBvcnQgZm9yIHRoZSBCcm93c2VyQ29udHJvbCBtb2R1bGU7IHRoZSB3ZWJicm93c2VyIG1vZHVsZQorCWhhcyBiZWVuIGluY2x1ZGVkIHNpbmNlIFB5dGhvbiAyLjAsIGFuZCB0aGF0IGlzIHRoZSBwcmVmZXJyZWQKKwlpbnRlcmZhY2UuIiAtLWZkcmFrZQorCisyMDAxLTA3LTE0IDEzOjMyICBrYmsKKworCSogRWRpdG9yV2luZG93LnB5LCBGaWxlTGlzdC5weSwgSWRsZUNvbmYucHksIFB5UGFyc2UucHksCisJUHlTaGVsbC5weSwgU3RhY2tWaWV3ZXIucHksIGV4dGVuZC50eHQsIGlkbGUucHksIGtleWRlZnMucHk6IEltcG9ydAorCXRoZSAyMDAxIEp1bHkgMTMgMjM6NTkgR01UIHZlcnNpb24gb2YgUHl0aG9uIENWUyBJRExFIG9uIHRoZQorCWV4aXN0aW5nIDEuMS4zIHZlbmRvciBicmFuY2ggbmFtZWQgcHktY3ZzLXZlbmRvci1icmFuY2guIFJlbGVhc2UKKwl0YWcgaXMgcHktY3ZzLTIwMDFfMDdfMTMuCisKKzIwMDEtMDctMTQgMTI6MDIgIGtiaworCisJKiBJY29ucy9weXRob24uZ2lmOiBweS1jdnMtcmVsMl8xIChSZXYgMS4yKSBtZXJnZSBDb3BpZWQgcHktY3ZzIHJldgorCTEuMiBjaGFuZ2VkIGZpbGUgdG8gaWRsZWZvcmsgTUFJTgorCisyMDAxLTA3LTE0IDExOjU4ICBrYmsKKworCSogSWNvbnMvbWludXNub2RlLmdpZjogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMikgbWVyZ2UgQ29waWVkIHB5LWN2cworCTEuMiBjaGFuZ2VkIGZpbGUgdG8gaWRsZWZvcmsgTUFJTgorCisyMDAxLTA3LTE0IDExOjIzICBrYmsKKworCSogU2Nyb2xsZWRMaXN0LnB5OiBweS1jdnMtcmVsMl8xIChyZXYgMS41KSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTQgMTE6MjAgIGtiaworCisJKiBTZXBhcmF0b3IucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjMpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xNCAxMToxNiAga2JrCisKKwkqIFN0YWNrVmlld2VyLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4xNSkgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDExOjE0ICBrYmsKKworCSogVG9vbFRpcC5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMikgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDEwOjEzICBrYmsKKworCSogUHlTaGVsbC5weTogY3ZzLXB5LXJlbDJfMSAoUmV2IDEuMjkgLSAxLjMzKSBtZXJnZQorCQorCU1lcmdlZCB0aGUgZm9sbG93aW5nIHB5LWN2cyByZXZzIHdpdGhvdXQgY29uZmxpY3Q6IDEuMjkgUmVkdWNlCisJY29weXJpZ2h0IHRleHQgb3V0cHV0IGF0IHN0YXJ0dXAgMS4zMCBEZWxheSBzZXR0aW5nIHN5cy5hcmdzIHVudGlsCisJVGtpbnRlciBpcyBmdWxseSBpbml0aWFsaXplZCAxLjMxIFdoaXRlc3BhY2Ugbm9ybWFsaXphdGlvbiAxLjMyCisJVHVybiBzeW50YXggd2FybmluZyBpbnRvIGVycm9yIHdoZW4gaW50ZXJhY3RpdmUgMS4zMyBGaXggd2FybmluZworCWluaXRpYWxpemF0aW9uIGJ1ZworCQorCU5vdGUgdGhhdCBtb2R1bGUgaXMgZXh0ZW5zaXZlbHkgbW9kaWZpZWQgd3J0IHB5LWN2cworCisyMDAxLTA3LTE0IDA2OjMzICBrYmsKKworCSogUHlQYXJzZS5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuNiAtIDEuOCkgbWVyZ2UgRml4IGF1dG9pbmRlbnQKKwlidWcgYW5kIGRlZmxlY3QgVW5pY29kZSBmcm9tIHRleHQuZ2V0KCkKKworMjAwMS0wNy0xNCAwNjowMCAga2JrCisKKwkqIFBlcmNvbGF0b3IucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjMpICJtb3ZlICJmcm9tIFRraW50ZXIgaW1wb3J0CisJKiIgdG8gbW9kdWxlIGxldmVsIiAtLWpoeWx0b24KKworMjAwMS0wNy0xNCAwNTo1NyAga2JrCisKKwkqIFBhdGhCcm93c2VyLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS42KSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTQgMDU6NDkgIGtiaworCisJKiBQYXJlbk1hdGNoLnB5OiBjdnMtcHktcmVsMl8xIChSZXYgMS41KSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTQgMDM6NTcgIGtiaworCisJKiBPYmplY3RCcm93c2VyLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4zKSBtZXJnZSAiTWFrZSB0aGUgdGVzdAorCXByb2dyYW0gd29yayBvdXRzaWRlIElETEUuIiAgLS0gR3ZSCisKKzIwMDEtMDctMTQgMDM6NTIgIGtiaworCisJKiBNdWx0aVN0YXR1c0Jhci5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMikgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDAzOjQ0ICBrYmsKKworCSogTXVsdGlTY3JvbGxlZExpc3RzLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4yKSBtZXJnZSAtIHdoaXRlc3BhY2UKKwlub3JtYWxpemF0aW9uCisKKzIwMDEtMDctMTQgMDM6NDAgIGtiaworCisJKiBJZGxlSGlzdG9yeS5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuNCkgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTE0IDAzOjM4ICBrYmsKKworCSogSWRsZUNvbmYucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjYpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAxNDoxOCAga2JrCisKKwkqIElPQmluZGluZy5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuNCkgbWVyZ2UgLSBtb3ZlICJpbXBvcnQgKiIgdG8KKwltb2R1bGUgbGV2ZWwKKworMjAwMS0wNy0xMyAxNDoxMiAga2JrCisKKwkqIEZvcm1hdFBhcmFncmFwaC5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuOSkgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTEzIDE0OjA3ICBrYmsKKworCSogRmlsZUxpc3QucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjgpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAxMzozNSAga2JrCisKKwkqIEVkaXRvcldpbmRvdy5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMzMgLSAxLjM3KSBtZXJnZQorCQorCVZQIElETEUgdmVyc2lvbiBkZXBlbmRlZCBvbiBWUCdzIEV4ZWNCaW5kaW5nLnB5IGFuZCBzcGF3bi5weSB0byBnZXQKKwl0aGUgcGF0aCB0byB0aGUgV2luZG93cyBEb2MgZGlyZWN0b3J5IChyZWxhdGl2ZSB0byBweXRob24uZXhlKS4KKwlSZW1vdmVkIHRoaXMgY29uZmxpY3RpbmcgY29kZSBpbiBmYXZvciBvZiBweS1jdnMgdXBkYXRlcyB3aGljaCBvbgorCVdpbmRvd3MgdXNlIGEgaGFyZCBjb2RlZCBwYXRoIHJlbGF0aXZlIHRvIHRoZSBsb2NhdGlvbiBvZiB0aGlzCisJbW9kdWxlLiBweS1jdnMgdXBkYXRlcyBpbmNsdWRlIHN1cHBvcnQgZm9yIHdlYmJyb3dzZXIucHkuICBNb2R1bGUKKwlzdGlsbCBoYXMgQnJvd3NlckNvbnRyb2wucHkgZm9yIDEuNS4yIHN1cHBvcnQuCisJCisJQXQgdGhpcyBwb2ludCwgdGhlIGRpZmZlcmVuY2VzIHdydCBweS1jdnMgcmVsYXRlIHRvIG1lbnUKKwlmdW5jdGlvbmFsaXR5LgorCisyMDAxLTA3LTEzIDExOjMwICBrYmsKKworCSogQ29uZmlnUGFyc2VyLnB5OiBweS1jdnMtcmVsMl8xIG1lcmdlIC0gUmVtb3ZlLCBsaXZlcyBpbiAvTGliCisKKzIwMDEtMDctMTMgMTA6MTAgIGtiaworCisJKiBEZWxlZ2F0b3IucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjMpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAxMDowNyAga2JrCisKKwkqIERlYnVnZ2VyLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4xNSkgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTEzIDEwOjA0ICBrYmsKKworCSogQ29sb3JEZWxlZ2F0b3IucHk6IHB5LWN2cy1yZWwyXzEgKFJldiAxLjExIGFuZCAxLjEyKSBtZXJnZQorCUNvbG9yaXplICJhcyIgYWZ0ZXIgImltcG9ydCIgLyB1c2UgREVCVUcgaW5zdGVhZCBvZiBfX2RlYnVnX18KKworMjAwMS0wNy0xMyAwOTo1NCAga2JrCisKKwkqIENsYXNzQnJvd3Nlci5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMTIpIG1lcmdlIC0gd2hpdGVzcGFjZQorCW5vcm1hbGl6YXRpb24KKworMjAwMS0wNy0xMyAwOTo0MSAga2JrCisKKwkqIEJyb3dzZXJDb250cm9sLnB5OiBweS1jdnMtcmVsMl8xIChSZXYgMS4xKSBtZXJnZSAtIE5ldyBGaWxlIC0KKwlGb3JjZSBIRUFEIHRvIHRydW5rIHdpdGggLWYgTm90ZTogYnJvd3Nlci5weSB3YXMgcmVuYW1lZAorCUJyb3dzZXJDb250cm9sLnB5IDEwIE1heSAyMDAwLiBJdCBwcm92aWRlcyBhIGNvbGxlY3Rpb24gb2YgY2xhc3NlcworCWFuZCBjb252ZW5pZW5jZSBmdW5jdGlvbnMgdG8gY29udHJvbCBleHRlcm5hbCBicm93c2VycyAiZm9yIDEuNS4yCisJc3VwcG9ydCIuIEl0IHdhcyByZW1vdmVkIGZyb20gcHktY3ZzIDE4IEFwcmlsIDIwMDEuCisKKzIwMDEtMDctMTMgMDk6MTAgIGtiaworCisJKiBDYWxsVGlwcy5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuOCkgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTEzIDA4OjI2ICBrYmsKKworCSogQ2FsbFRpcFdpbmRvdy5weTogcHktY3ZzLXJlbDJfMSAoUmV2IDEuMykgbWVyZ2UgLSB3aGl0ZXNwYWNlCisJbm9ybWFsaXphdGlvbgorCisyMDAxLTA3LTEzIDA4OjEzICBrYmsKKworCSogQXV0b0V4cGFuZC5weTogcHktY3ZzLXJlbDFfMiAoUmV2IDEuNCkgbWVyZ2UsICJBZGQgQWx0LXNsYXNoIHRvCisJVW5peCBrZXlkZWZzIChJIHNvbWVob3cgbmVlZCBpdCBvbiBSSCA2LjIpLiAgR2V0IHJpZCBvZiBhc3NpZ25tZW50CisJdG8gdW51c2VkIHNlbGYudGV4dC53b3JkbGlzdC4iCS0tR3ZSCisKKzIwMDEtMDctMTIgMTY6NTQgIGVsZ3VhdmFzCisKKwkqIFJlcGxhY2VEaWFsb2cucHk6IHB5LWN2cyBtZXJnZSwgcHl0aG9uIDEuNS4yIGNvbXBhdGliaWxpdHkKKworMjAwMS0wNy0xMiAxNjo0NiAgZWxndWF2YXMKKworCSogU2NyaXB0QmluZGluZy5weTogcHktY3ZzIG1lcmdlLCBiZXR0ZXIgZXJyb3IgZGlhbG9nCisKKzIwMDEtMDctMTIgMTY6MzggIGVsZ3VhdmFzCisKKwkqIFRPRE8udHh0OiBweS1jdnMgbWVyZ2UsIGFkZGl0aW9ucworCisyMDAxLTA3LTEyIDE1OjM1ICBlbGd1YXZhcworCisJKiBXaW5kb3dMaXN0LnB5OiBweS1jdnMgbWVyZ2UsIGNvcnJlY3QgaW5kZW50YXRpb24KKworMjAwMS0wNy0xMiAxNToyNCAgZWxndWF2YXMKKworCSogY29uZmlnLnR4dDogcHktY3ZzIG1lcmdlLCBjb3JyZWN0IHR5cG8KKworMjAwMS0wNy0xMiAxNToyMSAgZWxndWF2YXMKKworCSogaGVscC50eHQ6IHB5LWN2cyBtZXJnZSwgdXBkYXRlIGNvbG91ciBjaGFuZ2luZyBpbmZvCisKKzIwMDEtMDctMTIgMTQ6NTEgIGVsZ3VhdmFzCisKKwkqIGlkbGUucHk6IHB5LWN2cyBtZXJnZSwgaWRsZV9kaXIgbG9hZGluZyBjaGFuZ2VkCisKKzIwMDEtMDctMTIgMTQ6NDQgIGVsZ3VhdmFzCisKKwkqIGlkbGV2ZXIucHk6IHB5LWN2cyBtZXJnZSwgdmVyc2lvbiB1cGRhdGUKKworMjAwMS0wNy0xMSAxMjo1MyAga2JrCisKKwkqIEJyb3dzZXJDb250cm9sLnB5OiBJbml0aWFsIHJldmlzaW9uCisKKzIwMDEtMDctMTEgMTI6NTMgIGtiaworCisJKiBBdXRvRXhwYW5kLnB5LCBCcm93c2VyQ29udHJvbC5weSwgQ2FsbFRpcFdpbmRvdy5weSwgQ2FsbFRpcHMucHksCisJQ2xhc3NCcm93c2VyLnB5LCBDb2xvckRlbGVnYXRvci5weSwgRGVidWdnZXIucHksIERlbGVnYXRvci5weSwKKwlFZGl0b3JXaW5kb3cucHksIEZpbGVMaXN0LnB5LCBGb3JtYXRQYXJhZ3JhcGgucHksIElPQmluZGluZy5weSwKKwlJZGxlQ29uZi5weSwgSWRsZUhpc3RvcnkucHksIE11bHRpU2Nyb2xsZWRMaXN0cy5weSwKKwlNdWx0aVN0YXR1c0Jhci5weSwgT2JqZWN0QnJvd3Nlci5weSwgT3V0cHV0V2luZG93LnB5LAorCVBhcmVuTWF0Y2gucHksIFBhdGhCcm93c2VyLnB5LCBQZXJjb2xhdG9yLnB5LCBQeVBhcnNlLnB5LAorCVB5U2hlbGwucHksIFJlbW90ZUludGVycC5weSwgUmVwbGFjZURpYWxvZy5weSwgU2NyaXB0QmluZGluZy5weSwKKwlTY3JvbGxlZExpc3QucHksIFNlcGFyYXRvci5weSwgU3RhY2tWaWV3ZXIucHksIFRPRE8udHh0LAorCVRvb2xUaXAucHksIFdpbmRvd0xpc3QucHksIGNvbmZpZy50eHQsIGhlbHAudHh0LCBpZGxlLCBpZGxlLmJhdCwKKwlpZGxlLnB5LCBpZGxldmVyLnB5LCBzZXR1cC5weSwgSWNvbnMvbWludXNub2RlLmdpZiwKKwlJY29ucy9weXRob24uZ2lmOiBJbXBvcnQgdGhlIHJlbGVhc2UgMi4xIHZlcnNpb24gb2YgUHl0aG9uIENWUyBJRExFCisJb24gdGhlIGV4aXN0aW5nIDEuMS4zIHZlbmRvciBicmFuY2ggbmFtZWQgcHktY3ZzLXZlbmRvci1icmFuY2gsCisJd2l0aCByZWxlYXNlIHRhZyBweS1jdnMtcmVsMl8xLgorCisyMDAxLTA3LTExIDEyOjM0ICBrYmsKKworCSogQXV0b0V4cGFuZC5weSwgQXV0b0luZGVudC5weSwgQmluZGluZ3MucHksIENhbGxUaXBXaW5kb3cucHksCisJQ2FsbFRpcHMucHksIENoYW5nZUxvZywgQ2xhc3NCcm93c2VyLnB5LCBDb2xvckRlbGVnYXRvci5weSwKKwlEZWJ1Z2dlci5weSwgRGVsZWdhdG9yLnB5LCBFZGl0b3JXaW5kb3cucHksIEZpbGVMaXN0LnB5LAorCUZvcm1hdFBhcmFncmFwaC5weSwgRnJhbWVWaWV3ZXIucHksIEdyZXBEaWFsb2cucHksIElPQmluZGluZy5weSwKKwlJZGxlQ29uZi5weSwgSWRsZUhpc3RvcnkucHksIE11bHRpU2Nyb2xsZWRMaXN0cy5weSwKKwlNdWx0aVN0YXR1c0Jhci5weSwgTkVXUy50eHQsIE9iamVjdEJyb3dzZXIucHksIE9sZFN0YWNrVmlld2VyLnB5LAorCU91dHB1dFdpbmRvdy5weSwgUGFyZW5NYXRjaC5weSwgUGF0aEJyb3dzZXIucHksIFBlcmNvbGF0b3IucHksCisJUHlQYXJzZS5weSwgUHlTaGVsbC5weSwgUkVBRE1FLnR4dCwgUmVtb3RlSW50ZXJwLnB5LAorCVJlcGxhY2VEaWFsb2cucHksIFNjcmlwdEJpbmRpbmcucHksIFNjcm9sbGVkTGlzdC5weSwKKwlTZWFyY2hCaW5kaW5nLnB5LCBTZWFyY2hEaWFsb2cucHksIFNlYXJjaERpYWxvZ0Jhc2UucHksCisJU2VhcmNoRW5naW5lLnB5LCBTZXBhcmF0b3IucHksIFN0YWNrVmlld2VyLnB5LCBUT0RPLnR4dCwKKwlUb29sVGlwLnB5LCBUcmVlV2lkZ2V0LnB5LCBVbmRvRGVsZWdhdG9yLnB5LCBXaWRnZXRSZWRpcmVjdG9yLnB5LAorCVdpbmRvd0xpc3QucHksIFpvb21IZWlnaHQucHksIF9faW5pdF9fLnB5LCBjb25maWctdW5peC50eHQsCisJY29uZmlnLXdpbi50eHQsIGNvbmZpZy50eHQsIGV2ZW50cGFyc2UucHksIGV4dGVuZC50eHQsIGhlbHAudHh0LAorCWlkbGUuYmF0LCBpZGxlLnB5LCBpZGxlLnB5dywgaWRsZXZlci5weSwga2V5ZGVmcy5weSwgcHljbGJyLnB5LAorCXRhYm5hbm55LnB5LCB0ZXN0Y29kZS5weSwgSWNvbnMvZm9sZGVyLmdpZiwgSWNvbnMvbWludXNub2RlLmdpZiwKKwlJY29ucy9vcGVuZm9sZGVyLmdpZiwgSWNvbnMvcGx1c25vZGUuZ2lmLCBJY29ucy9weXRob24uZ2lmLAorCUljb25zL3RrLmdpZjogSW1wb3J0IHRoZSA5IE1hcmNoIDIwMDAgdmVyc2lvbiBvZiBQeXRob24gQ1ZTIElETEUgYXMKKwkxLjEuMyB2ZW5kb3IgYnJhbmNoIG5hbWVkIHB5LWN2cy12ZW5kb3ItYnJhbmNoLgorCisyMDAxLTA3LTA0IDEzOjQzICBrYmsKKworCSogSWNvbnMvOiBmb2xkZXIuZ2lmLCBtaW51c25vZGUuZ2lmLCBvcGVuZm9sZGVyLmdpZiwgcGx1c25vZGUuZ2lmLAorCXB5dGhvbi5naWYsIHRrLmdpZjogTnVsbCBjb21taXQgd2l0aCAtZiBvcHRpb24gdG8gZm9yY2UgYW4gdXByZXYKKwlhbmQgcHV0IEhFQURzIGZpcm1seSBvbiB0aGUgdHJ1bmsuCisKKzIwMDEtMDctMDQgMTM6MTUgIGtiaworCisJKiBBdXRvRXhwYW5kLnB5LCBBdXRvSW5kZW50LnB5LCBCaW5kaW5ncy5weSwgQ2FsbFRpcFdpbmRvdy5weSwKKwlDYWxsVGlwcy5weSwgQ2hhbmdlTG9nLCBDbGFzc0Jyb3dzZXIucHksIENvbG9yRGVsZWdhdG9yLnB5LAorCUNvbmZpZ1BhcnNlci5weSwgRGVidWdnZXIucHksIERlbGVnYXRvci5weSwgRWRpdG9yV2luZG93LnB5LAorCUV4ZWNCaW5kaW5nLnB5LCBGaWxlTGlzdC5weSwgRm9ybWF0UGFyYWdyYXBoLnB5LCBGcmFtZVZpZXdlci5weSwKKwlHcmVwRGlhbG9nLnB5LCBJRExFRk9SSy5odG1sLCBJT0JpbmRpbmcucHksIElkbGVDb25mLnB5LAorCUlkbGVIaXN0b3J5LnB5LCBNdWx0aVNjcm9sbGVkTGlzdHMucHksIE11bHRpU3RhdHVzQmFyLnB5LCBORVdTLnR4dCwKKwlPYmplY3RCcm93c2VyLnB5LCBPbGRTdGFja1ZpZXdlci5weSwgT3V0cHV0V2luZG93LnB5LAorCVBhcmVuTWF0Y2gucHksIFBhdGhCcm93c2VyLnB5LCBQZXJjb2xhdG9yLnB5LCBQeVBhcnNlLnB5LAorCVB5U2hlbGwucHksIFJFQURNRS50eHQsIFJlbW90ZS5weSwgUmVtb3RlSW50ZXJwLnB5LAorCVJlcGxhY2VEaWFsb2cucHksIFNjcmlwdEJpbmRpbmcucHksIFNjcm9sbGVkTGlzdC5weSwKKwlTZWFyY2hCaW5kaW5nLnB5LCBTZWFyY2hEaWFsb2cucHksIFNlYXJjaERpYWxvZ0Jhc2UucHksCisJU2VhcmNoRW5naW5lLnB5LCBTZXBhcmF0b3IucHksIFN0YWNrVmlld2VyLnB5LCBUT0RPLnR4dCwKKwlUb29sVGlwLnB5LCBUcmVlV2lkZ2V0LnB5LCBVbmRvRGVsZWdhdG9yLnB5LCBXaWRnZXRSZWRpcmVjdG9yLnB5LAorCVdpbmRvd0xpc3QucHksIFpvb21IZWlnaHQucHksIF9faW5pdF9fLnB5LCBjb25maWctdW5peC50eHQsCisJY29uZmlnLXdpbi50eHQsIGNvbmZpZy50eHQsIGV2ZW50cGFyc2UucHksIGV4dGVuZC50eHQsIGhlbHAudHh0LAorCWlkbGUsIGlkbGUuYmF0LCBpZGxlLnB5LCBpZGxlLnB5dywgaWRsZXZlci5weSwga2V5ZGVmcy5weSwKKwlsb2FkZXIucHksIHByb3RvY29sLnB5LCBweWNsYnIucHksIHNldHVwLnB5LCBzcGF3bi5weSwgdGFibmFubnkucHksCisJdGVzdGNvZGUucHk6IE51bGwgY29tbWl0IHdpdGggLWYgb3B0aW9uIHRvIGZvcmNlIGFuIHVwcmV2IGFuZCBwdXQKKwlIRUFEcyBmaXJtbHkgb24gdGhlIHRydW5rLgorCisyMDAxLTA2LTI3IDEwOjI0ICBlbGd1YXZhcworCisJKiBJRExFRk9SSy5odG1sOiB1cGRhdGVkIGNvbnRhY3QgZGV0YWlscworCisyMDAxLTA2LTI1IDE3OjIzICBlbGd1YXZhcworCisJKiBpZGxlLCBSZW1vdGVJbnRlcnAucHksIHNldHVwLnB5OiBJbml0aWFsIHJldmlzaW9uCisKKzIwMDEtMDYtMjUgMTc6MjMgIGVsZ3VhdmFzCisKKwkqIGlkbGUsIFJlbW90ZUludGVycC5weSwgc2V0dXAucHk6IGltcG9ydCBjdXJyZW50IHB5dGhvbiBjdnMgaWRsZQorCWFzIGEgdmVuZG9yIGJyYW5jaAorCisyMDAxLTA2LTI0IDE1OjEwICBlbGd1YXZhcworCisJKiBJRExFRk9SSy5odG1sOiB0aW55IGNoYW5nZSB0byB0ZXN0IG5ldyBzeW5jbWFpbCBzZXR1cAorCisyMDAxLTA2LTI0IDE0OjQxICBlbGd1YXZhcworCisJKiBJRExFRk9SSy5odG1sOiBjaGFuZ2UgdG8gbmV3IGRldmVsb3BlciBjb250YWN0LCBhbHNvIGEgdGVzdAorCWNvbW1pdCBmb3IgbmV3IHN5bmNtYWlsIHNldHVwCisKKzIwMDEtMDYtMjMgMTg6MTUgIGVsZ3VhdmFzCisKKwkqIElETEVGT1JLLmh0bWw6IHRpbnkgdGVzdCB1cGRhdGUgZm9yIHJldml0YWxpc2VkIGlkbGUtZm9yaworCisyMDAwLTA5LTI0IDE3OjI5ICBucmlsZXkKKworCSogcHJvdG9jb2wucHk6IEZpeGVzIGZvciBQeXRob24gMS42IGNvbXBhdGliaWxpdHkgLSBzb2NrZXQgYmluZCBhbmQKKwljb25uZWN0IGdldCBhIHR1cGxlIGluc3RlYWQgdHdvIGFyZ3VtZW50cy4KKworMjAwMC0wOS0yNCAxNzoyOCAgbnJpbGV5CisKKwkqIHNwYXduLnB5OiBDaGFuZ2UgZm9yIFB5dGhvbiAxLjYgY29tcGF0aWJpbGl0eSAtIFVOSVgncyAnb3MnCisJbW9kdWxlIGRlZmluZXMgJ3NwYXdudicgbm93LCBzbyB3ZSBjaGVjayBmb3IgJ2ZvcmsnIGZpcnN0LgorCisyMDAwLTA4LTE1IDIyOjUxICBub3dvbmRlcgorCisJKiBJRExFRk9SSy5odG1sOiAKKwljb3JyZWN0ZWQgZW1haWwgYWRkcmVzcworCisyMDAwLTA4LTE1IDIyOjQ3ICBub3dvbmRlcgorCisJKiBJRExFRk9SSy5odG1sOiAKKwlhZGRlZCAuaHRtbCBmaWxlIGZvciBodHRwOi8vaWRsZWZvcmsuc291cmNlZm9yZ2UubmV0CisKKzIwMDAtMDgtMTUgMTE6MTMgIGRzY2hlcmVyCisKKwkqIEF1dG9FeHBhbmQucHksIEF1dG9JbmRlbnQucHksIEJpbmRpbmdzLnB5LCBDYWxsVGlwV2luZG93LnB5LAorCUNhbGxUaXBzLnB5LCBfX2luaXRfXy5weSwgQ2hhbmdlTG9nLCBDbGFzc0Jyb3dzZXIucHksCisJQ29sb3JEZWxlZ2F0b3IucHksIENvbmZpZ1BhcnNlci5weSwgRGVidWdnZXIucHksIERlbGVnYXRvci5weSwKKwlGaWxlTGlzdC5weSwgRm9ybWF0UGFyYWdyYXBoLnB5LCBGcmFtZVZpZXdlci5weSwgR3JlcERpYWxvZy5weSwKKwlJT0JpbmRpbmcucHksIElkbGVDb25mLnB5LCBJZGxlSGlzdG9yeS5weSwgTXVsdGlTY3JvbGxlZExpc3RzLnB5LAorCU11bHRpU3RhdHVzQmFyLnB5LCBORVdTLnR4dCwgT2JqZWN0QnJvd3Nlci5weSwgT2xkU3RhY2tWaWV3ZXIucHksCisJT3V0cHV0V2luZG93LnB5LCBQYXJlbk1hdGNoLnB5LCBQYXRoQnJvd3Nlci5weSwgUGVyY29sYXRvci5weSwKKwlQeVBhcnNlLnB5LCBQeVNoZWxsLnB5LCBSRUFETUUudHh0LCBSZXBsYWNlRGlhbG9nLnB5LAorCVNjcmlwdEJpbmRpbmcucHksIFNjcm9sbGVkTGlzdC5weSwgU2VhcmNoQmluZGluZy5weSwKKwlTZWFyY2hEaWFsb2cucHksIFNlYXJjaERpYWxvZ0Jhc2UucHksIFNlYXJjaEVuZ2luZS5weSwKKwlTZXBhcmF0b3IucHksIFN0YWNrVmlld2VyLnB5LCBUT0RPLnR4dCwgVG9vbFRpcC5weSwgVHJlZVdpZGdldC5weSwKKwlVbmRvRGVsZWdhdG9yLnB5LCBXaWRnZXRSZWRpcmVjdG9yLnB5LCBXaW5kb3dMaXN0LnB5LCBoZWxwLnR4dCwKKwlab29tSGVpZ2h0LnB5LCBjb25maWctdW5peC50eHQsIGNvbmZpZy13aW4udHh0LCBjb25maWcudHh0LAorCWV2ZW50cGFyc2UucHksIGV4dGVuZC50eHQsIGlkbGUuYmF0LCBpZGxlLnB5LCBpZGxlLnB5dywgaWRsZXZlci5weSwKKwlrZXlkZWZzLnB5LCBsb2FkZXIucHksIHB5Y2xici5weSwgdGFibmFubnkucHksIHRlc3Rjb2RlLnB5LAorCUVkaXRvcldpbmRvdy5weSwgRXhlY0JpbmRpbmcucHksIFJlbW90ZS5weSwgcHJvdG9jb2wucHksIHNwYXduLnB5LAorCUljb25zL2ZvbGRlci5naWYsIEljb25zL21pbnVzbm9kZS5naWYsIEljb25zL29wZW5mb2xkZXIuZ2lmLAorCUljb25zL3BsdXNub2RlLmdpZiwgSWNvbnMvcHl0aG9uLmdpZiwgSWNvbnMvdGsuZ2lmOiBJbml0aWFsCisJcmV2aXNpb24KKworMjAwMC0wOC0xNSAxMToxMyAgZHNjaGVyZXIKKworCSogQXV0b0V4cGFuZC5weSwgQXV0b0luZGVudC5weSwgQmluZGluZ3MucHksIENhbGxUaXBXaW5kb3cucHksCisJQ2FsbFRpcHMucHksIF9faW5pdF9fLnB5LCBDaGFuZ2VMb2csIENsYXNzQnJvd3Nlci5weSwKKwlDb2xvckRlbGVnYXRvci5weSwgQ29uZmlnUGFyc2VyLnB5LCBEZWJ1Z2dlci5weSwgRGVsZWdhdG9yLnB5LAorCUZpbGVMaXN0LnB5LCBGb3JtYXRQYXJhZ3JhcGgucHksIEZyYW1lVmlld2VyLnB5LCBHcmVwRGlhbG9nLnB5LAorCUlPQmluZGluZy5weSwgSWRsZUNvbmYucHksIElkbGVIaXN0b3J5LnB5LCBNdWx0aVNjcm9sbGVkTGlzdHMucHksCisJTXVsdGlTdGF0dXNCYXIucHksIE5FV1MudHh0LCBPYmplY3RCcm93c2VyLnB5LCBPbGRTdGFja1ZpZXdlci5weSwKKwlPdXRwdXRXaW5kb3cucHksIFBhcmVuTWF0Y2gucHksIFBhdGhCcm93c2VyLnB5LCBQZXJjb2xhdG9yLnB5LAorCVB5UGFyc2UucHksIFB5U2hlbGwucHksIFJFQURNRS50eHQsIFJlcGxhY2VEaWFsb2cucHksCisJU2NyaXB0QmluZGluZy5weSwgU2Nyb2xsZWRMaXN0LnB5LCBTZWFyY2hCaW5kaW5nLnB5LAorCVNlYXJjaERpYWxvZy5weSwgU2VhcmNoRGlhbG9nQmFzZS5weSwgU2VhcmNoRW5naW5lLnB5LAorCVNlcGFyYXRvci5weSwgU3RhY2tWaWV3ZXIucHksIFRPRE8udHh0LCBUb29sVGlwLnB5LCBUcmVlV2lkZ2V0LnB5LAorCVVuZG9EZWxlZ2F0b3IucHksIFdpZGdldFJlZGlyZWN0b3IucHksIFdpbmRvd0xpc3QucHksIGhlbHAudHh0LAorCVpvb21IZWlnaHQucHksIGNvbmZpZy11bml4LnR4dCwgY29uZmlnLXdpbi50eHQsIGNvbmZpZy50eHQsCisJZXZlbnRwYXJzZS5weSwgZXh0ZW5kLnR4dCwgaWRsZS5iYXQsIGlkbGUucHksIGlkbGUucHl3LCBpZGxldmVyLnB5LAorCWtleWRlZnMucHksIGxvYWRlci5weSwgcHljbGJyLnB5LCB0YWJuYW5ueS5weSwgdGVzdGNvZGUucHksCisJRWRpdG9yV2luZG93LnB5LCBFeGVjQmluZGluZy5weSwgUmVtb3RlLnB5LCBwcm90b2NvbC5weSwgc3Bhd24ucHksCisJSWNvbnMvZm9sZGVyLmdpZiwgSWNvbnMvbWludXNub2RlLmdpZiwgSWNvbnMvb3BlbmZvbGRlci5naWYsCisJSWNvbnMvcGx1c25vZGUuZ2lmLCBJY29ucy9weXRob24uZ2lmLCBJY29ucy90ay5naWY6IE1vZGlmaWVkIElETEUKKwlmcm9tIFZQeXRob24gMC4yCisKKworb3JpZ2luYWwgSURMRSBDaGFuZ2VMb2c6Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworVHVlIEZlYiAxNSAxODowODoxOSAyMDAwICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIE5FV1MudHh0OiBOb3RpY2Ugc3RhdHVzIGJhciBhbmQgc3RhY2sgdmlld2VyLgorCisJKiBFZGl0b3JXaW5kb3cucHk6IFN1cHBvcnQgZm9yIE1vc2hlJ3Mgc3RhdHVzIGJhci4KKworCSogTXVsdGlTdGF0dXNCYXIucHk6IFN0YXR1cyBiYXIgY29kZSAtLSBieSBNb3NoZSBaYWRrYS4KKworCSogT2xkU3RhY2tWaWV3ZXIucHk6CisJQWRkaW5nIHRoZSBvbGQgc3RhY2sgdmlld2VyIGltcGxlbWVudGF0aW9uIGJhY2ssIGZvciB0aGUgZGVidWdnZXIuCisKKwkqIFN0YWNrVmlld2VyLnB5OiBOZXcgc3RhY2sgdmlld2VyLCB1c2VzIGEgdHJlZSB3aWRnZXQuCisJKFhYWDogdGhlIGRlYnVnZ2VyIGRvZXNuJ3QgeWV0IHVzZSB0aGlzLikKKworCSogV2luZG93TGlzdC5weToKKwlDb3JyZWN0IGEgdHlwbyBhbmQgcmVtb3ZlIGFuIHVucXVhbGlmaWVkIGV4Y2VwdCB0aGF0IHdhcyBoaWRpbmcgdGhlIGVycm9yLgorCisJKiBDbGFzc0Jyb3dzZXIucHk6IEFkZCBhbiBYWFggY29tbWVudCBhYm91dCB0aGUgQ2xhc3NCcm93c2VyIEFJUC4KKworCSogQ2hhbmdlTG9nOiBVcGRhdGVkIGNoYW5nZSBsb2cuCisKKwkqIE5FV1MudHh0OiBOZXdzIHVwZGF0ZS4gIFByb2JhYmx5IGluY29tcGxldGU7IHdoYXQgZWxzZSBpcyBuZXc/CisKKwkqIFJFQURNRS50eHQ6CisJVXBkYXRlZCBmb3IgcGVuZGluZyBJRExFIDAuNSByZWxlYXNlIChzdGlsbCB2ZXJ5IHJvdWdoIC0tIGp1c3QgZ2V0dGluZworCWl0IG91dCBpbiBhIG1vcmUgY29udmVuaWVudCBmb3JtYXQgdGhhbiBDVlMpLgorCisJKiBUT0RPLnR4dDogVGlueSBhZGRpdGlvbi4KKworVGh1IFNlcCAgOSAxNDoxNjowMiAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFRPRE8udHh0OiBBIGZldyBuZXcgVE9ETyBlbnRyaWVzLgorCitUaHUgQXVnIDI2IDIzOjA2OjIyIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQmluZGluZ3MucHk6IEFkZCBQeXRob24gRG9jdW1lbnRhdGlvbiBlbnRyeSB0byBIZWxwIG1lbnUuCisKKwkqIEVkaXRvcldpbmRvdy5weToKKwlGaW5kIHRoZSBoZWxwLnR4dCBmaWxlIHJlbGF0aXZlIHRvIF9fZmlsZV9fIG9yICIuIiwgbm90IGluIHN5cy5wYXRoLgorCShTdWdnZXN0ZWQgYnkgTW9zaGUgWmFka2EsIGJ1dCBpbXBsZW1lbnRlZCBkaWZmZXJlbnRseS4pCisKKwlBZGQgPDxweXRob24tZG9jcz4+IGV2ZW50IHdoaWNoLCBvbiBVbml4LCBicmluZ3MgdXAgTmV0c2NhcGUgcG9pbnRpbmcKKwl0byBodHRwOi8vd3d3LnB5dGhvbi5kb2MvY3VycmVudC8gKGEgbG9jYWwgY29weSB3b3VsZCBiZSBuaWNlIGJ1dCBpdHMKKwlsb2NhdGlvbiBjYW4ndCBiZSBwcmVkaWN0ZWQpLiAgV2luZG93cyBzb2x1dGlvbiBUQkQuCisKK1dlZCBBdWcgMTEgMTQ6NTU6NDMgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBUcmVlV2lkZ2V0LnB5OgorCU1vc2hlIG5vdGljZWQgYW4gaW5jb25zaXN0ZW5jeSBpbiBoaXMgY29tbWVudCwgc28gSSdtIHJlcGhyYXNpbmcgaXQgdG8KKwliZSBjbGVhcmVyLgorCisJKiBUcmVlV2lkZ2V0LnB5OgorCVBhdGNoIGluc3BpcmVkIGJ5IE1vc2hlIFphZGthIHRvIHNlYXJjaCBmb3IgdGhlIEljb25zIGRpcmVjdG9yeSBpbiB0aGUKKwlzYW1lIGRpcmVjdG9yeSBhcyBfX2ZpbGVfXywgcmF0aGVyIHRoYW4gc2VhcmNoaW5nIGZvciBpdCBhbG9uZyBzeXMucGF0aC4KKwlUaGlzIHdvcmtzIGJldHRlciB3aGVuIGlkbGUgaXMgYSBwYWNrYWdlLgorCitUaHUgSnVsIDE1IDEzOjExOjAyIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogVE9ETy50eHQ6IE5ldyB3aXNoZXMuCisKK1NhdCBKdWwgMTAgMTM6MTc6MzUgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBJZGxlUHJlZnMucHk6CisJTWFrZSB0aGUgY29sb3IgZm9yIHN0ZGVyciByZWQgKGkuZS4gdGhlIHN0YW5kYXJkIHdhcm5pbmcvZGFuZ2VyL3N0b3AKKwljb2xvcikgcmF0aGVyIHRoYW4gZ3JlZW4uICBTdWdnZXN0ZWQgYnkgU2FtIFNjaHVsZW5idXJnLgorCitGcmkgSnVuIDI1IDE3OjI2OjM0IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogUHlTaGVsbC5weTogQ2xvc2UgZGVidWdnZXIgd2hlbiBjbG9zaW5nLiAgVGhpcyBtYXkgYnJlYWsgYSBjeWNsZS4KKworCSogRGVidWdnZXIucHk6IEJyZWFrIGN5Y2xlIG9uIGNsb3NlLgorCisJKiBDbGFzc0Jyb3dzZXIucHk6IERlc3Ryb3kgdGhlIHRyZWUgd2hlbiBjbG9zaW5nLgorCisJKiBUcmVlV2lkZ2V0LnB5OiBBZGQgZGVzdHJveSgpIG1ldGhvZCB0byByZWN1cnNpdmVseSBkZXN0cm95IGEgdHJlZS4KKworCSogUHlTaGVsbC5weTogRXh0ZW5kIF9jbG9zZSgpIHRvIGJyZWFrIGN5Y2xlcy4KKwlCcmVhayBzb21lIG90aGVyIGN5Y2xlcyB0b28gKGFuZCBkZXN0cm95IHRoZSByb290IHdoZW4gZG9uZSkuCisKKwkqIEVkaXRvcldpbmRvdy5weToKKwlBZGQgX2Nsb3NlKCkgbWV0aG9kIHRoYXQgZG9lcyB0aGUgYWN0dWFsIGNsZWFudXAgKGNsb3NlKCkgYXNrcyB0aGUKKwl1c2VyIHdoYXQgdGhleSB3YW50IGZpcnN0IGlmIHRoZXJlJ3MgdW5zYXZlZCBzdHVmZiwgYW5kIG1heSBjYW5jZWwpLgorCUl0IGNsb3NlcyBtb3JlIHRoYW4gYmVmb3JlLgorCisJQWRkIHVubG9hZF9leHRlbnNpb25zKCkgbWV0aG9kIHRvIHVubG9hZCBhbGwgZXh0ZW5zaW9uczsgY2FsbGVkIGZyb20KKwlfY2xvc2UoKS4gIEl0IGNhbGxzIGFuIGV4dGVuc2lvbidzIGNsb3NlKCkgbWV0aG9kIGlmIGl0IGhhcyBvbmUuCisKKwkqIFBlcmNvbGF0b3IucHk6IEFkZCBjbG9zZSgpIG1ldGhvZCB0aGF0IGJyZWFrcyBjeWNsZXMuCisKKwkqIFdpZGdldFJlZGlyZWN0b3IucHk6IEFkZCB1bnJlZ2lzdGVyKCkgbWV0aG9kLgorCVVucmVnaXN0ZXIgZXZlcnl0aGluZyBhdCBjbG9zaW5nLgorCURvbid0IGNhbGwgY2xvc2UoKSBpbiBfX2RlbF9fLCByZWx5IG9uIGV4cGxpY2l0IGNhbGwgdG8gY2xvc2UoKS4KKworCSogSU9CaW5kaW5nLnB5LCBGb3JtYXRQYXJhZ3JhcGgucHksIENhbGxUaXBzLnB5OgorCUFkZCBjbG9zZSgpIG1ldGhvZCB0aGF0IGJyZWFrcyBhIGN5Y2xlLgorCitGcmkgSnVuIDExIDE1OjAzOjAwIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXV0b0luZGVudC5weSwgRWRpdG9yV2luZG93LnB5LCBGb3JtYXRQYXJhZ3JhcGgucHk6CisJVGltIFBldGVycyBzbWFydC5wYXRjaDoKKworCUVkaXRvcldpbmRvdy5weToKKworCSsgQWRkZWQgZ2V0X3RhYndpZHRoICYgc2V0X3RhYndpZHRoICJ2aXJ0dWFsIHRleHQiIG1ldGhvZHMsIHRoYXQgZ2V0L3NldCB0aGUKKwl3aWRnZXQncyB2aWV3IG9mIHdoYXQgYSB0YWIgbWVhbnMuCisKKwkrIE1vdmVkIFRLX1RBQldJRFRIX0RFRkFVTFQgaGVyZSBmcm9tIEF1dG9JbmRlbnQuCisKKwkrIFJlbmFtZWQgTWFyaydzIGdldF9zZWxlY3Rpb25faW5kZXggdG8gZ2V0X3NlbGVjdGlvbl9pbmRpY2VzIChzb3JyeSwgTWFyaywKKwlidXQgdGhlIG5hbWUgd2FzIHBsYWluIHdyb25nIDx3aW5rPikuCisKKwlGb3JtYXRQYXJhZ3JhcGgucHk6ICByZW5hbWVkIHVzZSBvZiBnZXRfc2VsZWN0aW9uX2luZGV4LgorCisJQXV0b0luZGVudC5weToKKworCSsgTW92ZWQgVEtfVEFCV0lEVEhfREVGQVVMVCB0byBFZGl0b3JXaW5kb3cuCisKKwkrIFJld3JvdGUgc2V0X2luZGVudGF0aW9uX3BhcmFtcyB0byB1c2UgbmV3IFZUVyBnZXQvc2V0X3RhYndpZHRoIG1ldGhvZHMuCisKKwkrIENoYW5nZWQgc21hcnRfYmFja3NwYWNlX2V2ZW50IHRvIGRlbGV0ZSB3aGl0ZXNwYWNlIGJhY2sgdG8gY2xvc2VzdAorCXByZWNlZGluZyB2aXJ0dWFsIHRhYiBzdG9wIG9yIHJlYWwgY2hhcmFjdGVyIChub3RlIHRoYXQgdGhpcyBtYXkgcmVxdWlyZQorCWluc2VydGluZyBjaGFyYWN0ZXJzIGlmIGJhY2tzcGFjaW5nIG92ZXIgYSB0YWIhKS4KKworCSsgTnVrZWQgYWxtb3N0IHJlZmVyZW5jZXMgdG8gdGhlIHNlbGVjdGlvbiB0YWcsIGluIGZhdm9yIG9mIHVzaW5nCisJZ2V0X3NlbGVjdGlvbl9pbmRpY2VzLiAgVGhlIHNvbGUgZXhjZXB0aW9uIGlzIGluIHNldF9yZWdpb24sIGZvciB3aGljaCBubworCSJzZXRfc2VsZWN0aW9uIiBhYnN0cmFjdGlvbiBoYXMgeWV0IGJlZW4gYWdyZWVkIHVwb24uCisKKwkrIEhhZCB0b28gbXVjaCBmdW4gdXNpbmcgdGhlIHNwaWZmeSBuZXcgZmVhdHVyZXMgb2YgdGhlIGZvcm1hdC1wYXJhZ3JhcGgKKwljbWQuCisKK1RodSBKdW4gMTAgMTc6NDg6MDIgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBGb3JtYXRQYXJhZ3JhcGgucHk6CisJQ29kZSBieSBNYXJrIEhhbW1vbmQgdG8gZm9ybWF0IHBhcmFncmFwaHMgZW1iZWRkZWQgaW4gY29tbWVudHMuCisJUmVhZCB0aGUgY29tbWVudHMgKHdoaWNoIEkgcmVmb3JtYXR0ZWQgdXNpbmcgdGhlIG5ldyBmZWF0dXJlIDotKQorCWZvciBzb21lIGxpbWl0YXRpb25zLgorCisJKiBFZGl0b3JXaW5kb3cucHk6CisJQWRkZWQgYWJzdHJhY3Rpb24gZ2V0X3NlbGVjdGlvbl9pbmRleCgpIChNYXJrIEhhbW1vbmQpLiAgQWxzbworCXJlZm9ybWF0dGVkIHNvbWUgY29tbWVudCBibG9ja3MgdG8gc2hvdyBvZmYgYSBjb29sIGZlYXR1cmUgSSdtIGFib3V0CisJdG8gY2hlY2sgaW4gbmV4dC4KKworCSogQ2xhc3NCcm93c2VyLnB5OgorCUFkYXB0IHRvIHRoZSBuZXcgcHljbGJyJ3Mgc3VwcG9ydCBvZiBsaXN0aW5nIHRvcC1sZXZlbCBmdW5jdGlvbnMuICBJZgorCXRoaXMgZnVuY3Rpb25hbGl0eSBpcyBub3QgcHJlc2VudCAoZS5nLiB3aGVuIHVzZWQgd2l0aCBhIHZpbnRhZ2UKKwlQeXRob24gMS41LjIgaW5zdGFsbGF0aW9uKSB0b3AtbGV2ZWwgZnVuY3Rpb25zIGFyZSBub3QgbGlzdGVkLgorCisJKEhtbS4uLiAgQW55IGRpc3RyaWJ1dGlvbiBvZiBJRExFIDAuNSBzaG91bGQgcHJvYmFibHkgaW5jbHVkZSBhIGNvcHkKKwlvZiB0aGUgbmV3IHB5Y2xici5weSEpCisKKwkqIEF1dG9JbmRlbnQucHk6CisJRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gVGltJ3MgcmVjZW50IGNoYW5nZSB0byBjb21tZW50X3JlZ2lvbigpOiB0aGUKKwlsaXN0IG9mIGxpbmVzIHJldHVybmVkIGJ5IGdldF9yZWdpb24oKSBjb250YWlucyBhbiBlbXB0eSBsaW5lIGF0IHRoZQorCWVuZCByZXByZXNlbnRpbmcgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IGxpbmUsIGFuZCB0aGlzIHNob3VsZG4ndCBiZQorCWNvbW1lbnRlZCBvdXQhCisKKwkqIENhbGxUaXBzLnB5OgorCU1hcmsgSGFtbW9uZCB3cml0ZXM6IEhlcmUgaXMgYW5vdGhlciBjaGFuZ2UgdGhhdCBhbGxvd3MgaXQgdG8gd29yayBmb3IKKwljbGFzcyBjcmVhdGlvbiAtIHRyaWVzIHRvIGxvY2F0ZSBhbiBfX2luaXRfXyBmdW5jdGlvbi4gIEFsc28gdXBkYXRlZAorCXRoZSB0ZXN0IGNvZGUgdG8gcmVmbGVjdCB5b3VyIG5ldyAiKioqIiBjaGFuZ2UuCisKKwkqIENhbGxUaXBXaW5kb3cucHk6CisJTWFyayBIYW1tb25kIHdyaXRlczogVGltJ3Mgc3VnZ2VzdGlvbiBvZiBjb3B5aW5nIHRoZSBmb250IGZvciB0aGUKKwlDYWxsVGlwV2luZG93IGZyb20gdGhlIHRleHQgY29udHJvbCBtYWtlcyBzZW5zZSwgYW5kIGFjdHVhbGx5IG1ha2VzCisJdGhlIGNvbnRyb2wgbG9vayBiZXR0ZXIgSU1PLgorCitXZWQgSnVuICA5IDIwOjM0OjU3IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQ2FsbFRpcHMucHk6CisJQXBwZW5kICIuLi4iIGlmIHRoZSBhcHByb3ByaWF0ZSBmbGFnIChmb3IgdmFyYXJncykgaW4gY29fZmxhZ3MgaXMgc2V0LgorCURpdHRvICIqKioiIGZvciBrd2FyZ3MuCisKK1R1ZSBKdW4gIDggMTM6MDY6MDcgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBSZXBsYWNlRGlhbG9nLnB5OgorCUhtbS4uLiAgVGltIGRpZG4ndCB0dXJuICJyZXBsYWNlIGFsbCIgaW50byBhIHNpbmdsZSB1bmRvIGJsb2NrLgorCUkgdGhpbmsgSSBsaWtlIGl0IGJldHRlciBpZiBpdCBvcywgc28gaGVyZS4KKworCSogUmVwbGFjZURpYWxvZy5weTogVGltIFBldGVyczogbWFkZSByZXBsYWNlbWVudCBhdG9taWMgZm9yIHVuZG8vcmVkby4KKworCSogQXV0b0luZGVudC5weTogVGltIFBldGVyczoKKworCSsgU2V0IHVzZXRhYnM9MS4gIEVkaXRpbmcgcHljbGJyLnB5IHdhcyBkcml2aW5nIG1lIG51dHMgPDAuNiB3aW5rPi4KKwl1c2V0YWJzPTEgaXMgdGhlIEVtYWNzIHB5bW9kZSBkZWZhdWx0IHRvbywgYW5kIHRoYW5rcyB0byBpbmRlbnR3aWR0aCAhPQorCXRhYndpZHRoIG1hZ2ljYWwgdXNldGFicyBkaXNhYmxpbmcsIG5ldyBmaWxlcyBhcmUgc3RpbGwgY3JlYXRlZCB3aXRoIHRhYnMKKwl0dXJuZWQgb2ZmLiAgVGhlIG9ubHkgaW1wbGljYXRpb24gaXMgdGhhdCBpZiB5b3Ugb3BlbiBhIGZpbGUgd2hvc2UgZmlyc3QKKwlpbmRlbnQgaXMgYSBzaW5nbGUgdGFiLCBJRExFIHdpbGwgbm93IG1hZ2ljYWxseSB1c2UgdGFicyBmb3IgdGhhdCBmaWxlIChhbmQKKwlzZXQgaW5kZW50d2lkdGggdG8gOCkuICBOb3RlIHRoYXQgdGhlIHdob2xlIHNjaGVtZSBkb2Vzbid0IHdvcmsgcmlnaHQgZm9yCisJUHl0aG9uV2luLCB0aG91Z2gsIHNpbmNlIFdpbmRvd3MgdXNlcnMgdHlwaWNhbGx5IHNldCB0YWJ3aWR0aCB0byA0OyBNYXJrCisJcHJvYmFibHkgaGFzIHRvIGhpZGUgdGhlIElETEUgYWxnb3JpdGhtIGZyb20gdGhlbSAod2hpY2ggaGUgYWxyZWFkeSBrbm93cykuCisKKwkrIENoYW5nZWQgY29tbWVudF9yZWdpb25fZXZlbnQgdG8gc3RpY2sgIiMjIiBpbiBmcm9udCBvZiBldmVyeSBsaW5lLiAgVGhlCisJImhvbGVzIiBwcmV2aW91c2x5IGxlZnQgb24gYmxhbmsgbGluZXMgd2VyZSB2aXN1YWxseSBjb25mdXNpbmcgKG1hZGUgaXQKKwluZWVkbGVzc2x5IGhhcmQgdG8gZmlndXJlIG91dCB3aGF0IHRvIHVuY29tbWVudCBsYXRlcikuCisKK01vbiBKdW4gIDcgMTU6Mzg6NDAgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBUcmVlV2lkZ2V0LnB5LCBPYmplY3RCcm93c2VyLnB5OgorCVJlbW92ZSB1bm5lY2Vzc2FyeSByZWZlcmVuY2UgdG8gcHljbGJyIGZyb20gdGVzdCgpIGNvZGUuCisKKwkqIFB5UGFyc2UucHk6IFRpbSBQZXRlcnM6CisKKwlTbWFydGVyIGxvZ2ljIGZvciBmaW5kaW5nIGEgcGFyc2Ugc3luY2ggcG9pbnQuCisKKwlEb2VzIGEgaGFsZiB0byBhIGZpZnRoIHRoZSB3b3JrIGluIG5vcm1hbCBjYXNlczsgZG9uJ3Qgbm90aWNlIHRoZSBzcGVlZHVwLAorCWJ1dCBtYWtlcyAgbW9yZSBicmVhdGhpbmcgcm9vbSBmb3Igb3RoZXIgZXh0ZW5zaW9ucy4KKworCVNwZWVkcyB0ZXJyaWJsZSBjYXNlcyBieSBhdCBsZWFzdCBhIGZhY3RvciBvZiAxMC4gIlRlcnJpYmxlIiA9PSBlLmcuIHlvdSBwdXQKKwkiIiIgYXQgdGhlIHN0YXJ0IG9mIFRraW50ZXIucHksIHVuZG8gaXQsIHpvb20gdG8gdGhlIGJvdHRvbSwgYW5kIHN0YXJ0CisJdHlwaW5nIGluIGNvZGUuICBVc2VkIHRvIHRha2UgYWJvdXQgOCBzZWNvbmRzIGZvciBFTlRFUiB0byByZXNwb25kLCBub3cgc29tZQorCWxhcmdlIGZyYWN0aW9uIG9mIGEgc2Vjb25kLiAgVGhlIG5ldyBjb2RlIGdldHMgaW5kZW50ZWQgY29ycmVjdGx5LCBkZXNwaXRlCisJdGhhdCBpdCBhbGwgcmVtYWlucyAic3RyaW5nIGNvbG9yZWQiIHVudGlsIHRoZSBjb2xvcml6ZXIgY2F0Y2hlcyB1cCAoYWZ0ZXIKKwl3aGljaCwgRU5URVIgYXBwZWFycyBpbnN0YW50YW5lb3VzIGFnYWluKS4KKworRnJpIEp1biAgNCAxOToyMToxOSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIGV4dGVuZC5weTogTWlnaHQgYXMgd2VsbCBlbmFibGUgQ2FsbFRpcHMgYnkgZGVmYXVsdC4KKwlJZiB0aGVyZSBhcmUgdG9vIG1hbnkgY29tcGxhaW50cyBJJ2xsIHJlbW92ZSBpdCBhZ2FpbiBvciBmaXggaXQuCisKK1RodSBKdW4gIDMgMTQ6MzI6MTYgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdXRvSW5kZW50LnB5LCBFZGl0b3JXaW5kb3cucHksIFB5UGFyc2UucHk6CisJTmV3IG9mZmVyaW5ncyBieSBUaW0gUGV0ZXJzOyBoZSB3cml0ZXM6CisKKwlJRExFIGlzIG5vdyB0aGUgZmlyc3QgUHl0aG9uIGVkaXRvciBpbiB0aGUgVW5pdmVyc2Ugbm90IGNvbmZ1c2VkIGJ5IG15CisJZG9jdGVzdC5weSA8d2luaz4uCisKKwlBcyB0aHJlYXRlbmVkLCB0aGlzIGRlZmluZXMgSURMRSdzIGlzX2NoYXJfaW5fc3RyaW5nIGZ1bmN0aW9uIGFzIGEKKwltZXRob2Qgb2YgRWRpdG9yV2luZG93LiAgWW91IGp1c3QgbmVlZCB0byBkZWZpbmUgb25lIHNpbWlsYXJseSBpbgorCXdoYXRldmVyIGl0IGlzIHlvdSBwYXNzIGFzIGVkaXR3aW4gdG8gQXV0b0luZGVudDsgbG9va2luZyBhdCB0aGUKKwlFZGl0b3JXaW5kb3cucHkgcGFydCBvZiB0aGUgcGF0Y2ggc2hvdWxkIG1ha2UgdGhpcyBjbGVhci4KKworCSogR3JlcERpYWxvZy5weTogRW5jbG9zZSBwYXR0ZXJuIGluIHF1b3RlcyBpbiBzdGF0dXMgbWVzc2FnZS4KKworCSogQ2FsbFRpcHMucHk6CisJTWFyayBIYW1tb25kIGZpeGVkIHNvbWUgY29tbWVudHMgYW5kIGltcHJvdmVkIHRoZSB3YXkgdGhlIHRpcCB0ZXh0IGlzCisJY29uc3RydWN0ZWQuCisKK1dlZCBKdW4gIDIgMTg6MTg6NTcgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBDYWxsVGlwcy5weToKKwlNeSBmaXggdG8gTWFyaydzIGNvZGU6IHJlc3RvcmUgdGhlIHVuaXZlcnNhbCBjaGVjayBvbiA8S2V5UmVsZWFzZT4uCisJQWx3YXlzIGNhbmNlbCBvbiA8S2V5LUVzY2FwZT4gb3IgPEJ1dHRvblByZXNzPi4KKworCSogQ2FsbFRpcHMucHk6CisJQSB2ZXJzaW9uIHRoYXQgTWFyayBIYW1tb25kIHBvc3RlZCB0byB0aGUgbmV3c2dyb3VwLiAgSGFzIHNvbWUgbmV3ZXIKKwlzdHVmZiBmb3IgZ2V0dGluZyB0aGUgdGlwLiAgSGFkIHRvIGZpeCB0aGUgS2V5LSggYW5kIEtleS0pIGV2ZW50cworCWZvciBVbml4LiAgV2lsbCBoYXZlIHRvIHJlLWFwcGx5IG15IHBhdGNoIGZvciBjYXRjaGluZyBLZXlSZWxlYXNlIGFuZAorCUJ1dHRvblJlbGVhc2UgZXZlbnRzLgorCisJKiBDYWxsVGlwV2luZG93LnB5LCBDYWxsVGlwcy5weToKKwlDYWxsIHRpcHMgYnkgTWFyayBIYW1tb25kIChwbHVzIHRpbnkgZml4IGJ5IG1lLikKKworCSogSWRsZUhpc3RvcnkucHk6CisJQ2hhbmdlcyBieSBNYXJrIEhhbW1vbmQ6ICgxKSBzdXBwb3J0IG9wdGlvbmFsIG91dHB1dF9zZXAgYXJndW1lbnQgdG8KKwl0aGUgY29uc3RydWN0b3Igc28gaGUgY2FuIGVsaW1pbmF0ZSB0aGUgc3lzLnBzMiB0aGF0IFB5dGhvbldpbiBsZWF2ZXMKKwlpbiB0aGUgc291cmNlOyAoMikgcmVtb3ZlIGR1cGxpY2F0ZSBoaXN0b3J5IGl0ZW1zLgorCisJKiBBdXRvSW5kZW50LnB5OgorCUNoYW5nZXMgYnkgTWFyayBIYW1tb25kIHRvIGFsbG93IHVzaW5nIElETEUgZXh0ZW5zaW9ucyBpbiBQeXRob25XaW4gYXMKKwl3ZWxsOiBtYWtlIHRocmVlIGRpYWxvZyByb3V0aW5lcyBpbnN0YW5jZSB2YXJpYWJsZXMuCisKKwkqIEVkaXRvcldpbmRvdy5weToKKwlDaGFuZ2UgYnkgTWFyayBIYW1tb25kIHRvIGFsbG93IHVzaW5nIElETEUgZXh0ZW5zaW9ucyBpbiBQeXRob25XaW4gYXMKKwl3ZWxsOiBtYWtlIHRocmVlIGRpYWxvZyByb3V0aW5lcyBpbnN0YW5jZSB2YXJpYWJsZXMuCisKK1R1ZSBKdW4gIDEgMjA6MDY6NDQgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdXRvSW5kZW50LnB5OiBIYWghICBBIGZpeCBvZiBteSBvd24gdG8gVGltJ3MgY29kZSEKKwlVbml4IGJpbmRpbmdzIGZvciA8PHRvZ2dsZS10YWJzPj4gYW5kIDw8Y2hhbmdlLWluZGVudHdpZHRoPj4gd2VyZQorCW1pc3NpbmcsIGFuZCBzb21laG93IHRoYXQgbWVhbnQgdGhlIGV2ZW50cyB3ZXJlIG5ldmVyIGdlbmVyYXRlZCwKKwlldmVuIHRob3VnaCB0aGV5IHdlcmUgaW4gdGhlIG1lbnUuICBUaGUgbmV3IFVuaXggYmluZGluZ3MgYXJlIG5vdworCXRoZSBzYW1lIGFzIHRoZSBXaW5kb3dzIGJpbmRpbmdzIChNLXQgYW5kIE0tdSkuCisKKwkqIEF1dG9JbmRlbnQucHksIFB5UGFyc2UucHksIFB5U2hlbGwucHk6IFRpbSBQZXRlcnMgYWdhaW46CisKKwlUaGUgbmV3IHZlcnNpb24gKGF0dGFjaGVkKSBpcyBmYXN0IGVub3VnaCBhbGwgdGhlIHRpbWUgaW4gZXZlcnkgcmVhbCBtb2R1bGUKKwlJIGhhdmUgPHdoZXchPi4gIFlvdSBjYW4gbWFrZSBpdCBzbG93IGJ5LCBlLmcuLCBjcmVhdGluZyBhbiBvcGVuIGxpc3Qgd2l0aAorCTUsMDAwIDkwLWNoYXJhY3RlciBpZGVudGlmaWVycyAoKyB0cmFpbGluZyBjb21tYSkgZWFjaCBvbiBpdHMgb3duIGxpbmUsIHRoZW4KKwlhZGRpbmcgYW4gaXRlbSB0byB0aGUgZW5kIC0tIGJ1dCB0aGF0IHN0aWxsIGNvbnN1bWVzIGxlc3MgdGhhbiBhIHNlY29uZCBvbgorCW15IFA1LTE2Ni4gIFJlc3BvbnNlIHRpbWUgaW4gcmVhbCBjb2RlIGFwcGVhcnMgaW5zdGFudGFuZW91cy4KKworCUZpeGVkIHNvbWUgYnVncy4KKworCU5ldyBmZWF0dXJlOiAgd2hlbiBoaXR0aW5nIEVOVEVSIGFuZCB0aGUgY3Vyc29yIGlzIGJleW9uZCB0aGUgbGluZSdzIGxlYWRpbmcKKwlpbmRlbnRhdGlvbiwgd2hpdGVzcGFjZSBpcyByZW1vdmVkIG9uIGJvdGggc2lkZXMgb2YgdGhlIGN1cnNvcjsgYmVmb3JlCisJd2hpdGVzcGFjZSB3YXMgcmVtb3ZlZCBvbmx5IG9uIHRoZSBsZWZ0OyBlLmcuLCBhc3N1bWluZyB0aGUgY3Vyc29yIGlzCisJYmV0d2VlbiB0aGUgY29tbWEgYW5kIHRoZSBzcGFjZToKKworCWRlZiBzb21ldGhpbmcoYXJnMSwgYXJnMik6CisJICAgICAgICAgICAgICAgICAgIF4gY3Vyc29yIHRvIHRoZSBsZWZ0IG9mIGhlcmUsIGFuZCBoaXQgRU5URVIKKwkgICAgICAgICAgICAgICBhcmcyKTogICAjIG5ldyBsaW5lIHVzZWQgdG8gZW5kIHVwIGhlcmUKKwkgICAgICAgICAgICAgIGFyZzIpOiAgICAjIGJ1dCBub3cgbGluZXMgdXAgdGhlIHdheSB5b3UgZXhwZWN0CisKKwlOZXcgaGFjazogIEF1dG9JbmRlbnQgaGFzIGdyb3duIGEgY29udGV4dF91c2VfcHMxIEJvb2xlYW4gY29uZmlnIG9wdGlvbiwKKwlkZWZhdWx0aW5nIHRvIDAgKGZhbHNlKSBhbmQgc2V0IHRvIDEgKG9ubHkpIGJ5IFB5U2hlbGwuICBSZWFzb246ICBoYW5kbGluZworCXRoZSBmYW5jeSBzdHVmZiByZXF1aXJlcyBsb29raW5nIGJhY2t3YXJkIGZvciBhIHBhcnNpbmcgc3luY2ggcG9pbnQ7IHBzMQorCWxpbmVzIGFyZSB0aGUgb25seSBzZW5zaWJsZSB0aGluZyB0byBsb29rIGZvciBpbiBhIHNoZWxsIHdpbmRvdywgYnV0IGFyZSBhCisJYmFkIHRoaW5nIHRvIGxvb2sgZm9yIGluIGEgZmlsZSB3aW5kb3cgKHBzMSBsaW5lcyBzaG93IHVwIGluIG15IG1vZHVsZQorCWRvY3N0cmluZ3Mgb2Z0ZW4pLiAgUHl0aG9uV2luJ3Mgc2hlbGwgc2hvdWxkIHNldCB0aGlzIHRydWUgdG9vLgorCisJUGVyc2lzdGVudCBwcm9ibGVtOiAgc3RyaW5ncyBjb250YWluaW5nIGRlZi9jbGFzcyBjYW4gc3RpbGwgc2NyZXcgdGhpbmdzIHVwCisJY29tcGxldGVseS4gIE5vIGltcHJvdmVtZW50LiAgU2ltcGxlc3Qgd29ya2Fyb3VuZCBpcyBvbiB0aGUgdXNlcidzIGhlYWQsIGFuZAorCWNvbnNpc3RzIG9mIGluc2VydGluZyBlLmcuCisKKwlkZWYgXygpOiBwYXNzCisKKwkob3IgYW55IG90aGVyIGRlZi9jbGFzcykgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgbXVsdGlsaW5lIHN0cmluZyB0aGF0J3MKKwlzY3Jld2luZyB0aGVtIHVwLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGlya3NvbWUgYmVjYXVzZSBJRExFJ3Mgc3ludGF4IGNvbG9yaW5nCisJaXMgKm5vdCogY29uZnVzZWQsIHNvIHdoZW4gdGhpcyBoYXBwZW5zIHRoZSBjb2xvcnMgZG9uJ3QgbWF0Y2ggdGhlCisJaW5kZW50YXRpb24gYmVoYXZpb3IgdGhleSBzZWUuCisKKwkqIEF1dG9JbmRlbnQucHk6IFRpbSBQZXRlcnMgYWdhaW46CisKKwlbVGltLCBhZnRlciBhZGRpbmcgc29tZSBicmFja2V0IHNtYXJ0cyB0byBBdXRvSW5kZW50LnB5XQorCT4gLi4uCisJPiBXaGF0IGl0IGNhbid0IHBvc3NpYmx5IGRvIHdpdGhvdXQgcmVwYXJzaW5nIGxhcmdlIGdvYnMgb2YgdGV4dCBpcworCT4gc3VnZ2VzdCBhIHJlYXNvbmFibGUgaW5kZW50IGxldmVsIGFmdGVyIHlvdSd2ZSAqY2xvc2VkKiBhIGJyYWNrZXQKKwk+IGxlZnQgb3BlbiBvbiBzb21lIHByZXZpb3VzIGxpbmUuCisJPiAuLi4KKworCVRoZSBhdHRhY2hlZCBjYW4sIGFuZCBhY3R1YWxseSBmYXN0IGVub3VnaCB0byB1c2UgLS0gbW9zdCBvZiB0aGUgdGltZS4gIFRoZQorCWNvZGUgaXMgdHJpY2t5IGJleW9uZCBiZWxpZWYgdG8gYWNoaWV2ZSB0aGF0LCBidXQgaXQgd29ya3Mgc28gZmFyOyBlLmcuLAorCisJICAgICAgICByZXR1cm4gbGVuKHN0cmluZy5leHBhbmR0YWJzKHN0cltzZWxmLnN0bXRfc3RhcnQgOgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBpbmRlbnRzIHRvIGNhcmV0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpXSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBpbmRlbnRzIHRvIGNhcmV0CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFid2lkdGgpKSArIDEKKwkgICAgXiBpbmRlbnRzIHRvIGNhcmV0CisKKwlJdCdzIGFib3V0IGFzIHNtYXJ0IGFzIHB5bW9kZSBub3csIHdydCBib3RoIGJyYWNrZXQgYW5kIGJhY2tzbGFzaAorCWNvbnRpbnVhdGlvbiBydWxlcy4gIEl0IGRvZXMgcmVxdWlyZSByZXBhcnNpbmcgbGFyZ2UgZ29icyBvZiB0ZXh0LCBhbmQgaWYgaXQKKwloYXBwZW5zIHRvIGZpbmQgc29tZXRoaW5nIHRoYXQgbG9va3MgbGlrZSBhICJkZWYiIG9yICJjbGFzcyIgb3Igc3lzLnBzMQorCWJ1cmllZCBpbiBhIG11bHRpbGluZSBzdHJpbmcsIGJ1dCBkaWRuJ3Qgc3VjayB1cCBlbm91Z2ggcHJlY2VkaW5nIHRleHQgdG8KKwlzZWUgdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcsIGl0J3MgY29tcGxldGVseSBob3NlZC4gIEkgY2FuJ3QgcmVwYWlyIHRoYXQgLS0KKwlpdCdzIGp1c3QgdG9vIHNsb3cgdG8gcmVwYXJzZSBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlsZSBhbGwgdGhlIHRpbWUuCisKKwlBdXRvSW5kZW50IGhhcyBncm93biBhIG5ldyBudW1fY29udGV4dF9saW5lcyB0dXBsZSBhdHRyaWJ1dGUgdGhhdCBjb250cm9scworCWhvdyBmYXIgdG8gbG9vayBiYWNrLCBhbmQtLSBsaWtlIG90aGVyIHBhcmFtcyAtLXRoaXMgY291bGQvc2hvdWxkIGJlIG1hZGUKKwl1c2VyLW92ZXJyaWRhYmxlIGF0IHN0YXJ0dXAgYW5kIHBlci1maWxlIG9uIHRoZSBmbHkuCisKKwkqIFB5UGFyc2UucHk6IE5ldyBmaWxlIGJ5IFRpbSBQZXRlcnM6CisKKwlPbmUgbmV3IGZpbGUgaW4gdGhlIGF0dGFjaGVkLCBQeVBhcnNlLnB5LiAgVGhlIExpbmVTdHVkaWVyICh3aGF0ZXZlciBpdCB3YXMKKwljYWxsZWQgPHdpbms+KSBjbGFzcyB3YXMgcmVtb3ZlZCBmcm9tIEF1dG9JbmRlbnQ7IFB5UGFyc2Ugc3Vic3VtZXMgaXRzCisJZnVuY3Rpb25hbGl0eS4KKworCSogQXV0b0luZGVudC5weTogVGltIFBldGVycyBrZWVwcyByZXZpc2luZyB0aGlzIG1vZHVsZSAobW9yZSB0byBjb21lKToKKworCVJlbW92ZWQgIk5ldyB0YWJ3aWR0aCIgbWVudSBiaW5kaW5nLgorCisJQWRkZWQgImEgdGFiIG1lYW5zIGhvdyBtYW55IHNwYWNlcz8iIGRpYWxvZyB0byBibG9jayB0YWJpZnkgYW5kIHVudGFiaWZ5LiAgSQorCXRoaW5rIHByb21wdGluZyBmb3IgdGhpcyBpcyBnb29kIG5vdzogIHRoZXkncmUgdXN1YWxseSBhdC1tb3N0LW9uY2UtcGVyLWZpbGUKKwljb21tYW5kcywgYW5kIElETEUgY2FuJ3QgbGV0IHRoZW0gY2hhbmdlIHRhYndpZHRoIGZyb20gdGhlIFRrIGRlZmF1bHQKKwlhbnltb3JlLCBzbyBJRExFIGNhbiBubyBsb25nZXIgcHJlc3VtZSB0byBoYXZlIGFueSBpZGVhIHdoYXQgYSB0YWIgbWVhbnMuCisKKwlJcm9ueTogIGZvciB0aGUgcHVycG9zZSBvZiBrZWVwaW5nIGNvbW1lbnRzIGFsaWduZWQgdmlhIHRhYnMsIFRrJ3MKKwlub24tZGVmYXVsdCBhcHByb2FjaCBpcyBtdWNoIG5pY2VyIHRoYW4gdGhlIEVtYWNzL05vdGVwYWQvQ29kZXdyaWdodC92aS9ldGMKKwlhcHByb2FjaC4KKworCSogRWRpdG9yV2luZG93LnB5OgorCTEuIENhdGNoIE5hbWVFcnJvciBvbiBpbXBvcnQgKGNvdWxkIGJlIHJhaXNlZCBieSBjYXNlIG1pc21hdGNoIG9uIFdpbmRvd3MpLgorCTIuIE5vIGxvbmdlciBuZWVkIHRvIHJlc2V0IHB5Y2xiciBjYWNoZSBhbmQgc2hvdyB3YXRjaCBjdXJzb3Igd2hlbiBjYWxsaW5nCisJICAgQ2xhc3NCcm93c2VyIC0tIHRoZSBDbGFzc0Jyb3dzZXIgdGFrZXMgY2FyZSBvZiBweWNsYnIgYW5kIHRoZSBUcmVlV2lkZ2V0CisJICAgdGFrZXMgY2FyZSBvZiB0aGUgd2F0Y2ggY3Vyc29yLgorCTMuIFJlc2V0IHRoZSBmb2N1cyB0byB0aGUgY3VycmVudCB3aW5kb3cgYWZ0ZXIgZXJyb3IgbWVzc2FnZSBhYm91dCBjbGFzcworCSAgIGJyb3dzZXIgb24gYnVmZmVyIHdpdGhvdXQgZmlsZW5hbWUuCisKKwkqIEljb25zL21pbnVzbm9kZS5naWYsIEljb25zL3BsdXNub2RlLmdpZjogTWlzc2VkIGEgZmV3LgorCisJKiBDbGFzc0Jyb3dzZXIucHksIFBhdGhCcm93c2VyLnB5OiBSZXdyaXR0ZW4gYmFzZWQgb24gVHJlZVdpZGdldC5weQorCisJKiBPYmplY3RCcm93c2VyLnB5OiBPYmplY3QgYnJvd3NlciwgYmFzZWQgb24gVHJlZVdpZGdldC5weS4KKworCSogVHJlZVdpZGdldC5weTogVHJlZSB3aWRnZXQgZG9uZSByaWdodC4KKworCSogVG9vbFRpcC5weTogQXMgeWV0IHVudXNlZCBjb2RlIGZvciB0b29sIHRpcHMuCisKKwkqIFNjcmlwdEJpbmRpbmcucHk6CisJRW5zdXJlIHN5cy5hcmd2WzBdIGlzIHRoZSBzY3JpcHQgbmFtZSBvbiBSdW4gU2NyaXB0LgorCisJKiBab29tSGVpZ2h0LnB5OiBNb3ZlIHpvb20gaGVpZ2h0IGZ1bmN0aW9uYWxpdHkgdG8gc2VwYXJhdGUgZnVuY3Rpb24uCisKKwkqIEljb25zL2ZvbGRlci5naWYsIEljb25zL29wZW5mb2xkZXIuZ2lmLCBJY29ucy9weXRob24uZ2lmLCBJY29ucy90ay5naWY6CisJQSBmZXcgaWNvbnMgdXNlZCBieSAuLi9UcmVlV2lkZ2V0LnB5IGFuZCBpdHMgY2FsbGVycy4KKworCSogQXV0b0luZGVudC5weTogTmV3IHZlcnNpb24gYnkgVGltIFBldGVycyBpbXByb3ZlcyBibG9jayBvcGVuaW5nIHRlc3QuCisKK0ZyaSBNYXkgMjEgMDQ6NDY6MTcgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdHRpYy9IaXN0b3J5LnB5LCBQeVNoZWxsLnB5OiBSZW5hbWUgSGlzdG9yeSB0byBJZGxlSGlzdG9yeS4KKwlBZGQgaXNhdHR5KCkgdG8gcHNldWRvIGZpbGVzLgorCisJKiBTdGFja1ZpZXdlci5weTogTWFrZSBpbml0aWFsIHN0YWNrIHZpZXdlciB3aWRlcgorCisJKiBUT0RPLnR4dDogTmV3IHdpc2hlcworCisJKiBBdXRvSW5kZW50LnB5LCBFZGl0b3JXaW5kb3cucHksIFB5U2hlbGwucHk6CisJTXVjaCBpbXByb3ZlZCBhdXRvaW5kZW50IGFuZCBoYW5kbGluZyBvZiB0YWJzLAorCWJ5IFRpbSBQZXRlcnMuCisKK01vbiBNYXkgIDMgMTU6NDk6NTIgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdXRvSW5kZW50LnB5LCBFZGl0b3JXaW5kb3cucHksIEZvcm1hdFBhcmFncmFwaC5weSwgVW5kb0RlbGVnYXRvci5weToKKwlUaW0gUGV0ZXJzIHdyaXRlczoKKworCUknbSBzdGlsbCB1bnN1cmUsIGJ1dCBjb3VsZG4ndCBzdGFuZCB0aGUgdmlydHVhbCBldmVudCB0cmlja2VyeSBzbyB0cmllZCBhCisJZGlmZmVyZW50IHNpbiAoYWRkaW5nIHVuZG9fYmxvY2tfc3RhcnQvc3RvcCBtZXRob2RzIHRvIHRoZSBUZXh0IGluc3RhbmNlIGluCisJRWRpdG9yV2luZG93LnB5KS4gIExpa2UgaXQgb3Igbm90LCBpdCdzIGVmZmljaWVudCBhbmQgd29ya3MgPHdpbms+LiAgQmV0dGVyCisJaWRlYT8KKworCUdpdmUgdGhlIGF0dGFjaGVkIGEgd2hpcmwuICBFdmVuIGlmIHlvdSBoYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiwgSSB0aGluaworCXlvdSdsbCBsaWtlIHRoZSByZXN1bHRzLiAgVGhpbmsgSSBjYXVnaHQgYWxsIHRoZSAiYmxvY2sgZWRpdCIgY21kcywKKwlpbmNsdWRpbmcgRm9ybWF0IFBhcmFncmFwaCwgcGx1cyBzdWJ0bGVyIG9uZXMgaW52b2x2aW5nIHNtYXJ0IGluZGVudHMgYW5kCisJYmFja3NwYWNpbmcuCisKKwkqIFdpZGdldFJlZGlyZWN0b3IucHk6IFRpbSBQZXRlcnMgd3JpdGVzOgorCisJW1ddaGlsZSB0cnlpbmcgdG8gZG9wZSBvdXQgaG93IHJlZGlyZWN0aW9uIHdvcmtzLCBzdHVtYmxlZCBpbnRvIHR3bworCXBvc3NpYmxlIGdsaXRjaGVzLiAgSW4gdGhlIGZpcnN0LCBpdCBkb2Vzbid0IGFwcGVhciB0byBtYWtlIHNlbnNlIHRvIHRyeSB0bworCXJlbmFtZSBhIGNvbW1hbmQgdGhhdCdzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQ7IGluIHRoZSBzZWNvbmQsIHRoZSBuYW1lCisJInByZXZpb3VzIiBkb2Vzbid0IHJlYWxseSBicmluZyB0byBtaW5kICJpZ25vcmUgdGhlIHByZXZpb3VzIHZhbHVlIiA8d2luaz4uCisKK0ZyaSBBcHIgMzAgMTk6Mzk6MjUgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBfX2luaXRfXy5weTogU3VwcG9ydCBmb3IgdXNpbmcgaWRsZSBhcyBhIHBhY2thZ2UuCisKKwkqIFBhdGhCcm93c2VyLnB5OgorCUF2b2lkIGxpc3RpbmcgZmlsZXMgbW9yZSB0aGFuIG9uY2UgKGUuZy4gZm9vbW9kdWxlLnNvIGhhcyB0d28gaGl0czoKKwlvbmNlIGZvciBmb28gKyBtb2R1bGUuc28sIG9uY2UgZm9yIGZvb21vZHVsZSArIC5zbykuCisKK01vbiBBcHIgMjYgMjI6MjA6MzggMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBDaGFuZ2VMb2csIENvbG9yRGVsZWdhdG9yLnB5LCBQeVNoZWxsLnB5OiBUaW0gUGV0ZXJzIHN0cmlrZXMgYWdhaW46CisKKwlIbyBobyBobyAtLSB0aGF0J3MgdHJpY2tpZXIgdGhhbiBpdCBzb3VuZGVkISAgVGhlIGNvbG9yaXplciBpcyB3b3JraW5nIHdpdGgKKwkibGluZS5jb2wiIHN0cmluZ3MgaW5zdGVhZCBvZiBUZXh0IG1hcmtzLCBhbmQgdGhlIGFic29sdXRlIGNvb3JkaW5hdGVzIG9mCisJdGhlIHBvaW50IG9mIGludGVyZXN0IGNhbiBjaGFuZ2UgYWNyb3NzIHRoZSBzZWxmLnVwZGF0ZSBjYWxsICh2b2ljZSBvZgorCWJhZmZsZWQgZXhwZXJpZW5jZSwgd2hlbiB0d28gcXVpY2sgYmFja3NwYWNlcyBubyBsb25nZXIgZm9vbGVkIGl0LCBidXQgYQorCWJhY2tzcGFjZSBmb2xsb3dlZCBieSBhIHF1aWNrIEVOVEVSIGRpZCA8d2luaz4pLgorCisJQW55d2F5LCB0aGUgYXR0YWNoZWQgYXBwZWFycyB0byBkbyB0aGUgdHJpY2suICBDUFUgdXNhZ2UgZ29lcyB3YXkgdXAgd2hlbgorCXR5cGluZyBxdWlja2x5IGludG8gYSBsb25nIHRyaXBsZS1xdW90ZWQgc3RyaW5nLCBidXQgdGhlIGxhdGVuY3kgaXMgZmluZSBmb3IKKwltZSAoYSByZWxhdGl2ZWx5IGZhc3QgdHlwaXN0IG9uIGEgcmVsYXRpdmVseSBzbG93IG1hY2hpbmUpLiAgTW9zdCBvZiB0aGUKKwljaGFuZ2VzIGhlcmUgYXJlIGxlZnQgb3ZlciBmcm9tIHJlZHVjaW5nIHRoZSAjIG9mIHZyYmwgbmFtZXMgdG8gaGVscCBtZQorCXJlYXNvbiBhYm91dCB0aGUgbG9naWMgYmV0dGVyOyBJIGhvcGUgdGhlIGNvZGUgaXMgYSAqbGl0dGxlKiBlYXNpZXIgdG8KKworRnJpIEFwciAyMyAxNDowMToyNSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEVkaXRvcldpbmRvdy5weToKKwlQcm92aWRlIGZ1bGwgYXJndW1lbnRzIHRvIF9faW1wb3J0X18gc28gaXQgd29ya3MgaW4gcGFja2FnaXplZCBJRExFLgorCitUaHUgQXByIDIyIDIzOjIwOjE3IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworICAgICAgICAqIGhlbHAudHh0OgorICAgICAgICBCdW5jaCBvZiB1cGRhdGVzIG5lY2Vzc2FyeSBkdWUgdG8gcmVjZW50IGNoYW5nZXM7IGFkZGVkIGRvY3MgZm9yIEZpbGUKKyAgICAgICAgbWVudSwgY29tbWFuZCBsaW5lIGFuZCBjb2xvciBwcmVmZXJlbmNlcy4KKworICAgICAgICAqIEJpbmRpbmdzLnB5OiBSZW1vdmUgb2Jzb2xldGUgJ3NjcmlwdCcgbWVudS4KKworCSogVE9ETy50eHQ6IFNldmVyYWwgd2lzaGVzIGZ1bGZpbGxlZC4KKworCSogT3V0cHV0V2luZG93LnB5OgorCU1vdmVkIGNsYXNzZXMgT25EZW1hbmRPdXRwdXRXaW5kb3cgYW5kIFBzZXVkb0ZpbGUgaGVyZSwKKwlmcm9tIFNjcmlwdEJpbmRpbmcucHkgd2hlcmUgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKworCSogU2NyaXB0QmluZGluZy5weToKKwlNb3N0bHkgcmV3cml0dGVuLiAgSW5zdGVhZCBvZiB0aGUgb2xkIFJ1biBtb2R1bGUgYW5kIERlYnVnIG1vZHVsZSwKKwl0aGVyZSBhcmUgdHdvIG5ldyBjb21tYW5kczoKKworCUltcG9ydCBtb2R1bGUgKEY1KSBpbXBvcnRzIG9yIHJlbG9hZHMgdGhlIG1vZHVsZSBhbmQgYWxzbyBhZGRzIGl0cworCW5hbWUgdG8gdGhlIF9fbWFpbl9fIG5hbWVzcGFjZS4gIFRoaXMgZ2V0cyBleGVjdXRlZCBpbiB0aGUgUHlTaGVsbAorCXdpbmRvdyB1bmRlciBjb250cm9sIG9mIGl0cyBkZWJ1ZyBzZXR0aW5ncy4KKworCVJ1biBzY3JpcHQgKENvbnRyb2wtRjUpIGlzIHNpbWlsYXIgYnV0IGV4ZWN1dGVzIHRoZSBjb250ZW50cyBvZiB0aGUKKwlmaWxlIGRpcmVjdGx5IGluIHRoZSBfX21haW5fXyBuYW1lc3BhY2UuCisKKwkqIFB5U2hlbGwucHk6IE5pdHM6IGRvY3VtZW50IHVzZSBvZiAkSURMRVNUQVJUVVA7IGRpc3BsYXkgaWRsZSB2ZXJzaW9uCisKKwkqIGlkbGV2ZXIucHk6IE5ldyB2ZXJzaW9uIHRvIGNlbGVicmF0ZSBuZXcgY29tbWFuZCBsaW5lCisKKwkqIE91dHB1dFdpbmRvdy5weTogQWRkZWQgZmx1c2goKSwgZm9yIGNvbXBsZXRlbmVzcy4KKworCSogUHlTaGVsbC5weToKKwlBIGxvdCBvZiBjaGFuZ2VzIHRvIG1ha2UgdGhlIGNvbW1hbmQgbGluZSBtb3JlIHVzZWZ1bC4gIFlvdSBjYW4gbm93IGRvOgorCSAgaWRsZS5weSAtZSBmaWxlIC4uLiAgICAtLSB0byBlZGl0IGZpbGVzCisJICBpZGxlLnB5IHNjcmlwdCBhcmcgLi4uIC0tIHRvIHJ1biBhIHNjcmlwdAorCSAgaWRsZS5weSAtYyBjbWQgYXJnIC4uLiAtLSB0byBydW4gYSBjb21tYW5kCisJT3RoZXIgb3B0aW9ucywgc2VlIGFsc28gdGhlIHVzYWdlIG1lc3NhZ2UgKGFsc28gbmV3ISkgZm9yIG1vcmUgZGV0YWlsczoKKwkgIC1kICAgICAgIC0tIGVuYWJsZSBkZWJ1Z2dlcgorCSAgLXMgICAgICAgLS0gcnVuICRJRExFU1RBUlRVUCBvciAkUFlUSE9OU1RBUlRVUAorCSAgLXQgdGl0bGUgLS0gc2V0IFB5dGhvbiBTaGVsbCB3aW5kb3cncyB0aXRsZQorCXN5cy5hcmd2IGlzIHNldCBhY2NvcmRpbmdseSwgdW5sZXNzIC1lIGlzIHVzZWQuCisJc3lzLnBhdGggaXMgYWJzb2x1dGl6ZWQsIGFuZCBhbGwgcmVsZXZhbnQgcGF0aHMgYXJlIGluc2VydGVkIGludG8gaXQuCisKKwlPdGhlciBjaGFuZ2VzOgorCS0gdGhlIGVudmlyb25tZW50IGluIHdoaWNoIGNvbW1hbmRzIGFyZSBleGVjdXRlZCBpcyBub3cgdGhlCisJICBfX21haW5fXyBtb2R1bGUKKwktIGV4cGxpY2l0bHkgc2F2ZSBzeXMuc3Rkb3V0IGV0Yy4sIGRvbid0IHJlc3RvcmUgZnJvbSBzeXMuX19zdGRvdXRfXworCS0gbmV3IGludGVycHJldGVyIG1ldGhvZHMgZXhlY3NvdXJjZSgpLCBleGVjZmlsZSgpLCBzdHVmZnNvdXJjZSgpCisJLSBhIGZldyBzbWFsbCBuaXRzCisKKwkqIFRPRE8udHh0OgorCVNvbWUgbW9yZSBUT0RPIGl0ZW1zLiAgTWFkZSB1cCBteSBtaW5kIGFib3V0IGNvbW1hbmQgbGluZSBhcmdzLAorCVJ1bi9JbXBvcnQsIF9fbWFpbl9fLgorCisJKiBDb2xvckRlbGVnYXRvci5weToKKwlTdXBlci1lbGVnYW50IHBhdGNoIGJ5IFRpbSBQZXRlcnMgdGhhdCBzcGVlZHMgdXAgY29sb3JpemF0aW9uCisJZHJhbWF0aWNhbGx5ICh1cCB0byAxNSB0aW1lcyBoZSBjbGFpbXMpLiAgV29ya3MgYnkgcmVhZGluZyBtb3JlIHRoYW4KKwlvbmUgbGluZSBhdCBhIHRpbWUsIHVwIHRvIDEwMC1saW5lIGNodW5rcyAoc3RhcnRpbmcgd2l0aCBvbmUgbGluZSBhbmQKKwl0aGVuIGRvdWJsaW5nIHVwIHRvIHRoZSBsaW1pdCkuICBPbiBhIHR5cGljYWwgbWFjaGluZSAoZS5nLiBUaW0ncworCVA1LTE2NikgdGhpcyBkb2Vzbid0IHJlZHVjZSBpbnRlcmFjdGl2ZSByZXNwb25zaXZlbmVzcyBpbiBhIG5vdGljZWFibGUKKwl3YXkuCisKK1dlZCBBcHIgMjEgMTU6NDk6MzQgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBDb2xvckRlbGVnYXRvci5weToKKwlQYXRjaCBieSBUaW0gUGV0ZXJzIHRvIHNwZWVkIHVwIGNvbG9yaXppbmcgb2YgYmlnIG11bHRpbGluZSBzdHJpbmdzLgorCitUdWUgQXByIDIwIDE3OjMyOjUyIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogZXh0ZW5kLnR4dDoKKwlGb3IgYW4gZXZlbnQgJ2Zvby1iYXInLCB0aGUgY29ycmVzcG9uZGluZyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKKwlmb29fYmFyX2V2ZW50KCkuICBUaGVyZWZvcmUsIGZpeCB0aGUgcmVmZXJlbmNlcyB0byB6b29tX2hlaWdodCgpIGluCisJdGhlIGV4YW1wbGUuCisKKwkqIElkbGVQcmVmcy5weTogUmVzdG9yZWQgdGhlIG9yaWdpbmFsIElETEUgY29sb3Igc2NoZW1lLgorCisJKiBQeVNoZWxsLnB5LCBJZGxlUHJlZnMucHksIENvbG9yRGVsZWdhdG9yLnB5LCBFZGl0b3JXaW5kb3cucHk6CisJQ29sb3IgcHJlZmVyZW5jZXMgY29kZSBieSBMb3JlbiBMdWtlIChtYXNzYWdlZCBieSBtZSBzb21ld2hhdCkKKworCSogU2VhcmNoRW5naW5lLnB5OgorCVBhdGNoIGJ5IE1hcmsgRmF2YXM6IGl0IGZpeGVzIHRoZSBzZWFyY2ggZW5naW5lIGJlaGF2aW91ciB3aGVyZSBhbgorCXVuc3VjY2Vzc2Z1bCBzZWFyY2ggd3JhcHMgYXJvdW5kIGFuZCByZS1zZWFyY2hlcyB0aGF0IHBhcnQgb2YgdGhlIGZpbGUKKwliZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgc2VhcmNoIGFuZCB0aGUgZW5kIG9mIHRoZSBmaWxlIC0gb25seSByZWFsbHkKKwlhbiBpc3N1ZSBmb3IgdmVyeSBsYXJnZSBmaWxlcywgYnV0Li4uIChhbHNvIHJlbW92ZXMgYSByZWR1bmRhbnQKKwltLnNwYW4oKSBjYWxsKS4KKworTW9uIEFwciAxOSAxNjoyNjowMiAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFRPRE8udHh0OiBBIGZldyB3aXNoZXMgYXJlIG5vdyBmdWxmaWxsZWQuCisKKwkqIEF1dG9JbmRlbnQucHk6IFRpbSBQZXRlcnMgaW1wbGVtZW50cyBzb21lIG9mIG15IHdpc2hlczoKKworCW8gTWFrZXMgdGhlIHRhYiBrZXkgaW50ZWxsaWdlbnRseSBpbnNlcnQgc3BhY2VzIHdoZW4gYXBwcm9wcmlhdGUKKwkoc2VlIEhlbHAgbGlzdCBiYW50ZXIgdHdpeHQgRGF2aWQgQXNjaGVyIGFuZCBtZTsgaWRlYSBzdG9sZW4gZnJvbQorCWV2ZXJ5IG90aGVyIGVkaXRvciBvbiBlYXJ0aCA8d2luaz4pLgorCisJbyBuZXdsaW5lX2FuZF9pbmRlbnRfZXZlbnQgdHJpbXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvbiB0aGUgb2xkCisJbGluZSAocHltb2RlIGFuZCBDb2Rld3JpZ2h0KS4KKworCW8gbmV3bGluZV9hbmRfaW5kZW50X2V2ZW50IG5vIGxvbmdlciBmb29sZWQgYnkgdHJhaWxpbmcgd2hpdGVzcGFjZSBvcgorCWNvbW1lbnQgYWZ0ZXIgIjoiIChweW1vZGUsIFBUVUkpLgorCisJbyBuZXdsaW5lX2FuZF9pbmRlbnRfZXZlbnQgbm93IHJlZHVjZXMgdGhlIG5ldyBsaW5lJ3MgaW5kZW50YXRpb24gYWZ0ZXIKKwlyZXR1cm4sIGJyZWFrLCBjb250aW51ZSwgcmFpc2UgYW5kIHBhc3Mgc3RtdHMgKHB5bW9kZSkuCisKKwlUaGUgbGFzdCB0d28gYXJlIGVhc3kgdG8gZm9vbCBpbiB0aGUgcHJlc2VuY2Ugb2Ygc3RyaW5ncyAmCisJY29udGludWF0aW9ucywgYnV0IHB5bW9kZSByZXF1aXJlcyBFbWFjcydzIGhpZ2gtcG93ZXJlZCBDIHBhcnNpbmcKKwlmdW5jdGlvbnMgdG8gYXZvaWQgdGhhdCBpbiBmaW5pdGUgdGltZS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCVB5dGhvbiByZWxlYXNlIDEuNS4yYzEsIElETEUgdmVyc2lvbiAwLjQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworV2VkIEFwciAgNyAxODo0MTo1OSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFJFQURNRS50eHQsIE5FV1MudHh0OiBOZXcgdmVyc2lvbi4KKworCSogaWRsZXZlci5weTogVmVyc2lvbiBidW1wIGF3YWl0aW5nIGltcGVuZGluZyBuZXcgcmVsZWFzZS4KKwkoTm90IG11Y2ggaGFzIGNoYW5nZWQgOi0oICkKKworTW9uIE1hciAyOSAxNDo1MjoyOCAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFNjcmlwdEJpbmRpbmcucHksIFB5U2hlbGwucHk6CisJQXQgVGltIFBldGVycycgcmVjb21tZW5kYXRpb24sIGFkZCBhIGR1bW15IGZsdXNoKCkgbWV0aG9kIHRvCisJUHNldWRvRmlsZS4KKworVGh1IE1hciAxMSAyMzoyMToyMyAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFBhdGhCcm93c2VyLnB5OiBEb24ndCBjcmFzaCB3aGVuIHN5cy5wYXRoIGNvbnRhaW5zIGFuIGVtcHR5IHN0cmluZy4KKworCSogQXR0aWMvT3V0bGluZS5weTogVGhpcyBmaWxlIHdhcyBuZXZlciBzdXBwb3NlZCB0byBiZSBwYXJ0IG9mIElETEUuCisKKwkqIFBhdGhCcm93c2VyLnB5OgorCS0gRG9uJ3QgY3Jhc2ggaW4gdGhlIGNhc2Ugd2hlcmUgYSBzdXBlcmNsYXNzIGlzIGEgc3RyaW5nIGluc3RlYWQgb2YgYQorCXB5Y2xici5DbGFzcyBvYmplY3Q7IHRoaXMgY2FuIGhhcHBlbiB3aGVuIHRoZSBzdXBlcmNsYXNzIGlzCisJdW5yZWNvZ25pemFibGUgKHRvIHB5Y2xiciksIGUuZy4gd2hlbiBtb2R1bGUgcmVuYW1pbmcgaXMgdXNlZC4KKworCS0gU2hvdyBhIHdhdGNoIGN1cnNvciB3aGVuIGNhbGxpbmcgcHljbGJyIChzaW5jZSBpdCBtYXkgdGFrZSBhIHdoaWxlCisJcmVjdXJzaXZlbHkgcGFyc2luZyBpbXBvcnRlZCBtb2R1bGVzISkuCisKK1dlZCBNYXIgMTAgMDU6MTg6MDIgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBFZGl0b3JXaW5kb3cucHksIEJpbmRpbmdzLnB5OiBBZGQgUGF0aEJyb3dzZXIgdG8gRmlsZSBtb2R1bGUKKworCSogUGF0aEJyb3dzZXIucHk6ICJQYXRoIGJyb3dzZXIiIC0gNCBzY3JvbGxlZCBsaXN0cyBkaXNwbGF5aW5nOgorCSAgICBkaXJlY3RvcmllcyBvbiBzeXMucGF0aAorCSAgICBtb2R1bGVzIGluIHNlbGVjdGVkIGRpcmVjdG9yeQorCSAgICBjbGFzc2VzIGluIHNlbGVjdGVkIG1vZHVsZQorCSAgICBtZXRob2RzIG9mIHNlbGVjdGVkIGNsYXNzCisKKwlTaW5sZ2UgY2xpY2tpbmcgaW4gYSBkaXJlY3RvcnksIG1vZHVsZSBvciBjbGFzcyBpdGVtIHVwZGF0ZXMgdGhlIG5leHQKKwljb2x1bW4gd2l0aCBpbmZvIGFib3V0IHRoZSBzZWxlY3RlZCBpdGVtLiAgRG91YmxlIGNsaWNraW5nIGluIGEKKwltb2R1bGUsIGNsYXNzIG9yIG1ldGhvZCBpdGVtIG9wZW5zIHRoZSBmaWxlIChhbmQgc2VsZWN0cyB0aGUgY2xpY2tlZAorCWl0ZW0gaWYgaXQgaXMgYSBjbGFzcyBvciBtZXRob2QpLgorCisJSSBndWVzcyBldmVudHVhbGx5IEkgc2hvdWxkIGJlIHVzaW5nIGEgdHJlZSB3aWRnZXQgZm9yIHRoaXMsIGJ1dCB0aGUKKwlvbmVzIEkndmUgc2VlbiBkb24ndCB3b3JrIHdlbGwgZW5vdWdoLCBzbyBmb3Igbm93IEkgdXNlIHRoZSBvbGQKKwlTbWFsbHRhbGsgb3IgTmVYVCBzdHlsZSBtdWx0aS1jb2x1bW4gaGllcmFyY2hpY2FsIGJyb3dzZXIuCisKKwkqIE11bHRpU2Nyb2xsZWRMaXN0cy5weToKKwlOZXcgdXRpbGl0eTogbXVsdGlwbGUgc2Nyb2xsZWQgbGlzdHMgaW4gcGFyYWxsZWwKKworCSogU2Nyb2xsZWRMaXN0LnB5OiAtIFdoaXRlIGJhY2tncm91bmQuCisJLSBEaXNwbGF5ICIoTm9uZSkiIChvciB0ZXh0IG9mIHlvdXIgY2hvb3NpbmcpIHdoZW4gZW1wdHkuCisJLSBEb24ndCBzZXQgdGhlIGZvY3VzLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJUHl0aG9uIHJlbGVhc2UgMS41LjJiMiwgSURMRSB2ZXJzaW9uIDAuMworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCQorV2VkIEZlYiAxNyAyMjo0Nzo0MSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIE5FV1MudHh0OiBOZXdzIGluIDAuMy4KKworCSogUkVBRE1FLnR4dCwgaWRsZXZlci5weTogQnVtcCB2ZXJzaW9uIHRvIDAuMy4KKworCSogRWRpdG9yV2luZG93LnB5OgorCUFmdGVyIGFsbCwgd2UgZG9uJ3QgbmVlZCB0byBjYWxsIHRoZSBjYWxsYmFja3Mgb3Vyc2VsdmVzIQorCisJKiBXaW5kb3dMaXN0LnB5OgorCVdoZW4gZGVsZXRpbmcsIGNhbGwgdGhlIGNhbGxiYWNrcyAqYWZ0ZXIqIGRlbGV0aW5nIHRoZSB3aW5kb3cgZnJvbSBvdXIgbGlzdCEKKworCSogRWRpdG9yV2luZG93LnB5OgorCUZpeCB1cCB0aGUgV2luZG93cyBtZW51IHZpYSB0aGUgbmV3IGNhbGxiYWNrIG1lY2hhbmlzbSBpbnN0ZWFkIG9mCisJZGVwZW5kaW5nIG9uIG1lbnUgcG9zdCBjb21tYW5kcyAod2hpY2ggZG9uJ3Qgd29yayB3aGVuIHRoZSBtZW51IGlzCisJdG9ybiBvZmYpLgorCisJKiBXaW5kb3dMaXN0LnB5OgorCVN1cHBvcnQgY2FsbGJhY2tzIHRvIHBhdGNoIHVwIFdpbmRvd3MgbWVudXMgZXZlcnl3aGVyZS4KKworCSogQ2hhbmdlTG9nOiBPaCwgd2h5IG5vdC4gIENoZWNraW5nIGluIHRoZSBFbWFjcy1nZW5lcmF0ZWQgY2hhbmdlIGxvZy4KKworVHVlIEZlYiAxNiAyMjozNDoxNyAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFNjcmlwdEJpbmRpbmcucHk6CisJT25seSBwb3AgdXAgdGhlIHN0YWNrIHZpZXdlciB3aGVuIHJlcXVlc3RlZCBpbiB0aGUgRGVidWcgbWVudS4KKworTW9uIEZlYiAgOCAyMjoyNzo0OSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFdpbmRvd0xpc3QucHk6IERvbid0IGNyYXNoIGlmIGEgd2luZG93IG5vIGxvbmdlciBleGlzdHMuCisKKwkqIFRPRE8udHh0OiBSZXN0cnVjdHVyZWQgYSBiaXQuCisKK01vbiBGZWIgIDEgMjM6MDY6MTcgMTk5OSAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBQeVNoZWxsLnB5OiBBZGQgY3VycmVudCBkaXIgb3IgcGF0aHMgb2YgZmlsZSBhcmdzIHRvIHN5cy5wYXRoLgorCisJKiBEZWJ1Z2dlci5weTogQWRkIGNhbm9uaWMoKSBmdW5jdGlvbiAtLSBmb3IgYnJhbmQgbmV3IGJkYi5weSBmZWF0dXJlLgorCisJKiBTdGFja1ZpZXdlci5weTogUHJvdGVjdCBhZ2FpbnN0IGFjY2Vzc2luZyBhbiBlbXB0eSBzdGFjay4KKworRnJpIEphbiAyOSAyMDo0NDo0NSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFpvb21IZWlnaHQucHk6CisJVXNlIG9ubHkgdGhlIGhlaWdodCB0byBkZWNpZGUgd2hldGhlciB0byB6b29tIGluIG9yIG91dC4KKworVGh1IEphbiAyOCAyMjoyNDozMCAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEVkaXRvcldpbmRvdy5weSwgRmlsZUxpc3QucHk6CisJTWFrZSBzdXJlIHRoZSBUY2wgdmFyaWFibGVzIGFyZSBzaGFyZWQgYmV0d2VlbiB3aW5kb3dzLgorCisJKiBQeVNoZWxsLnB5LCBFZGl0b3JXaW5kb3cucHksIEJpbmRpbmdzLnB5OgorCU1vdmUgbWVudS9rZXkgYmluZGluZyBjb2RlIGZyb20gQmluZGluZ3MucHkgdG8gRWRpdG9yV2luZG93LnB5LAorCXdpdGggY2hhbmdlZCBBUElzIC0tIGl0IG1ha2VzIG11Y2ggbW9yZSBzZW5zZSB0aGVyZS4KKwlBbHNvIGFkZCBhIG5ldyBmZWF0dXJlOiBpZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgbWVudSBsYWJlbCBpcworCWEgJyEnLCBpdCBnZXRzIGEgY2hlY2tib3guICBDaGVja2JveGVzIGFyZSBib3VuZCB0byBCb29sZWFuIFRjbCB2YXJpYWJsZXMKKwl0aGF0IGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIHRoZSBuZXcgZ2V0dmFyL3NldHZhci9nZXRyYXd2YXIgQVBJOworCXRoZSB2YXJpYWJsZSBpcyBuYW1lZCBhZnRlciB0aGUgZXZlbnQgdG8gd2hpY2ggdGhlIG1lbnUgaXMgYm91bmQuCisKKwkqIERlYnVnZ2VyLnB5OiBBZGQgUXVpdCBidXR0b24gdG8gdGhlIGRlYnVnZ2VyIHdpbmRvdy4KKworCSogU2VhcmNoRGlhbG9nLnB5OgorCVdoZW4gZmluZF9hZ2FpbigpIGZpbmRzIGV4YWN0bHkgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBpdCdzIGEgZmFpbHVyZS4KKworCSogaWRsZS5weSwgQXR0aWMvaWRsZTogUmVuYW1lIGlkbGUgLT4gaWRsZS5weQorCitNb24gSmFuIDE4IDE1OjE4OjU3IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogRWRpdG9yV2luZG93LnB5LCBXaW5kb3dMaXN0LnB5OiBPbmx5IGRlaWNvbmlmeSB3aGVuIGljb25pYy4KKworCSogVE9ETy50eHQ6IE1pc2MKKworVHVlIEphbiAxMiAyMjoxNDozNCAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIHRlc3Rjb2RlLnB5LCBBdHRpYy90ZXN0LnB5OgorCVJlbmFtZWQgdGVzdC5weSB0byB0ZXN0Y29kZS5weSBzbyBvbmUgY2FuIGltcG9ydCBQeXRob24ncworCXRlc3QgcGFja2FnZSBmcm9tIGluc2lkZSBJRExFLiAgKFN1Z2dlc3RlZCBieSBKYWNrIEphbnNlbi4pCisKKwkqIEVkaXRvcldpbmRvdy5weSwgQ29sb3JEZWxlZ2F0b3IucHk6CisJSGFjayB0byBjbG9zZSBhIHdpbmRvdyB0aGF0IGlzIGNvbG9yaXppbmcuCisKKwkqIFNlcGFyYXRvci5weTogVmxhZGltaXIgTWFyYW5nb3pvdidzIHBhdGNoOgorCVRoZSBzZXBhcmF0b3IgZGFuY2VzIHRvbyBtdWNoIGFuZCBzZWVtcyB0byBqdW1wIGJ5IGFyYml0cmFyeSBhbW91bnRzCisJaW4gYXJiaXRyYXJ5IGRpcmVjdGlvbnMgd2hlbiBJIHRyeSB0byBtb3ZlIGl0IGZvciByZXNpemluZyB0aGUgZnJhbWVzLgorCVRoaXMgcGF0Y2ggbWFrZXMgaXQgbW9yZSBxdWlldC4KKworTW9uIEphbiAxMSAxNDo1Mjo0MCAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFRPRE8udHh0OiBTb21lIHJlcXVlc3RzIGhhdmUgYmVlbiBmdWxmaWxsZWQuCisKKwkqIEVkaXRvcldpbmRvdy5weToKKwlTZXQgdGhlIGN1cnNvciB0byBhIHdhdGNoIHdoZW4gb3BlbmluZyB0aGUgY2xhc3MgYnJvd3NlciAod2hpY2ggbWF5CisJdGFrZSBxdWl0ZSBhIHdoaWxlLCBicm93c2luZyBtdWx0aXBsZSBmaWxlcykuCisKKwlOZXdlciwgYmV0dGVyIGNlbnRlcigpIC0tIGJ1dCBhc3N1bWVzIG5vIHdyYXBwaW5nLgorCisJKiBTZWFyY2hCaW5kaW5nLnB5OgorCUdvdCByaWQgb2YgZGVidWcgcHJpbnQgc3RhdGVtZW50IGluIGdvdG9fbGluZV9ldmVudCgpLgorCisJKiBTY3JpcHRCaW5kaW5nLnB5OgorCUkgdGhpbmsgSSBsaWtlIGl0IGJldHRlciBpZiBpdCBwcmludHMgdGhlIHRyYWNlYmFjayBldmVuIHdoZW4gaXQgZGlzcGxheXMKKwl0aGUgc3RhY2sgdmlld2VyLgorCisJKiBEZWJ1Z2dlci5weTogQmluZCBFU0MgdG8gY2xvc2Utd2luZG93LgorCisJKiBDbGFzc0Jyb3dzZXIucHk6IFVzZSBhIEhTZXBhcmF0b3IgYmV0d2VlbiB0aGUgY2xhc3NlcyBhbmQgdGhlIGl0ZW1zLgorCU1ha2UgdGhlIGxpc3Qgb2YgY2xhc3NlcyB3aWRlciBieSBkZWZhdWx0ICg0MCBjaGFycykuCisJQmluZCBFU0MgdG8gY2xvc2Utd2luZG93LgorCisJKiBTZXBhcmF0b3IucHk6CisJU2VwYXJhdG9yIGNsYXNzZXMgKGRyYWdnYWJsZSBkaXZpZGVyIGJldHdlZW4gdHdvIHBhbmVzKS4KKworU2F0IEphbiAgOSAyMjowMTozMyAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFdpbmRvd0xpc3QucHk6CisJRG9uJ3QgdHJhY2ViYWNrIHdoZW4gd2FrZXVwKCkgaXMgY2FsbGVkIHdoZW4gdGhlIHdpbmRvdyBoYXMgYmVlbiBkZXN0cm95ZWQuCisJVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSB0b3JuLW9mIFdpbmRvd3MgbWVudSByZWZlcmVuY2VzIGNsb3NlZCB3aW5kb3dzLgorCUFuZCBUaW0gUGV0ZXJzIGNsYWltcyB0aGF0IHRoZSBXaW5kb3dzIG1lbnUgaXMgaGlzIGZhdm9yaXRlIHRvIHRlYXIgb2ZmLi4uCisKKwkqIEVkaXRvcldpbmRvdy5weTogQWxsb3cgdGVhcmluZyBvZmYgb2YgdGhlIFdpbmRvd3MgbWVudS4KKworCSogU3RhY2tWaWV3ZXIucHk6IENsb3NlIG9uIEVTQy4KKworCSogaGVscC50eHQ6IFVwZGF0ZWQgYSBidW5jaCBvZiB0aGluZ3MgKGl0IHdhcyBtb3N0bHkgc3RpbGwgMC4xISkKKworCSogZXh0ZW5kLnB5OiBBZGRlZCBTY3JpcHRCaW5kaW5nIHRvIHN0YW5kYXJkIGJpbmRpbmdzLgorCisJKiBTY3JpcHRCaW5kaW5nLnB5OgorCVRoaXMgbm93IGFjdHVhbGx5IHdvcmtzLiAgU2VlIGRvYyBzdHJpbmcuICBJdCBjYW4gcnVuIGEgbW9kdWxlIChpLmUuCisJaW1wb3J0IG9yIHJlbG9hZCkgb3IgZGVidWcgaXQgKHNhbWUgd2l0aCBkZWJ1Z2dlciBjb250cm9sKS4gIE91dHB1dAorCWdvZXMgdG8gYSBmcmVzaCBvdXRwdXQgd2luZG93LCBvbmx5IGNyZWF0ZWQgd2hlbiBuZWVkZWQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlQeXRob24gcmVsZWFzZSAxLjUuMmIxLCBJRExFIHZlcnNpb24gMC4yCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJCitGcmkgSmFuICA4IDE3OjI2OjAyIDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogUkVBRE1FLnR4dCwgTkVXUy50eHQ6IFdoYXQncyBuZXcgaW4gdGhpcyByZWxlYXNlLgorCisJKiBCaW5kaW5ncy5weSwgUHlTaGVsbC5weToKKwlQYXVsIFByZXNjb2QncyBwYXRjaGVzIHRvIGFsbG93IHRoZSBzdGFjayB2aWV3ZXIgdG8gcG9wIHVwIHdoZW4gYQorCXRyYWNlYmFjayBpcyBwcmludGVkLgorCitUaHUgSmFuICA3IDAwOjEyOjE1IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogRm9ybWF0UGFyYWdyYXBoLnB5OgorCUNoYW5nZSBwYXJhZ3JhcGggd2lkdGggbGltaXQgdG8gNzAgKGxpa2UgRW1hY3MgTS1RKS4KKworCSogUkVBRE1FLnR4dDoKKwlTZXBhcmF0aW5nIFRPRE8gZnJvbSBSRUFETUUuICBTbGlnaHQgcmVmb3JtdWxhdGlvbiBvZiBmZWF0dXJlcy4gIE5vCisJZXhhY3QgcmVsZWFzZSBkYXRlLgorCisJKiBUT0RPLnR4dDogU2VwYXJhdGluZyBUT0RPIGZyb20gUkVBRE1FLgorCitNb24gSmFuICA0IDIxOjE5OjA5IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogRm9ybWF0UGFyYWdyYXBoLnB5OgorCUhtLiAgVGhlcmUgd2FzIGEgYm91bmRhcnkgY29uZGl0aW9uIGVycm9yIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdG9vLgorCisJKiBTZWFyY2hCaW5kaW5nLnB5OiBIbS4gIEFkZCBVbml4IGJpbmRpbmcgZm9yIHJlcGxhY2UsIHRvby4KKworCSoga2V5ZGVmcy5weTogUmFuIGV2ZW50cGFyc2UucHkgYWdhaW4uCisKKwkqIEZvcm1hdFBhcmFncmFwaC5weTogQWRkZWQgVW5peCBNZXRhLXEga2V5IGJpbmRpbmc7CisJZml4IGZpbmRfcGFyYWdyYXBoIHdoZW4gYXQgc3RhcnQgb2YgZmlsZS4KKworCSogQXV0b0V4cGFuZC5weTogQWRkZWQgTWV0YS0vIGJpbmRpbmcgZm9yIFVuaXggYXMgYWx0IGZvciBBbHQtLy4KKworCSogU2VhcmNoQmluZGluZy5weToKKwlBZGQgdW5peCBiaW5kaW5nIGZvciBncmVwIChvdGhlcndpc2UgdGhlIG1lbnUgZW50cnkgZG9lc24ndCB3b3JrISkKKworCSogWm9vbUhlaWdodC5weTogQWRqdXN0ZWQgVW5peCBoZWlnaHQgdG8gd29yayB3aXRoIGZ2d205Ni4gOj0oCisKKwkqIEdyZXBEaWFsb2cucHk6IE5lZWQgdG8gaW1wb3J0IHN5cyEKKworCSogaGVscC50eHQsIGV4dGVuZC50eHQsIFJFQURNRS50eHQ6IEZvcm1hdHRlZCBzb21lIHBhcmFncmFwaHMKKworCSogZXh0ZW5kLnB5LCBGb3JtYXRQYXJhZ3JhcGgucHk6CisJQWRkIG5ldyBleHRlbnNpb24gdG8gcmVmb3JtYXQgYSAodGV4dCkgcGFyYWdyYXBoLgorCisJKiBab29tSGVpZ2h0LnB5OiBUeXBvIGluIFdpbiBzcGVjaWZpYyBoZWlnaHQgc2V0dGluZy4KKworU3VuIEphbiAgMyAwMDo0NzozNSAxOTk5ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEF1dG9JbmRlbnQucHk6IEFkZGVkIHNvbWV0aGluZyBsaWtlIFRpbSBQZXRlcnMnIGJhY2tzcGFjZSBwYXRjaC4KKworCSogWm9vbUhlaWdodC5weTogQWRhcHRlZCB0byBVbml4IChpLmUuLCBtb3JlIGhhcmRjb2RlZCBjb25zdGFudHMpLgorCitTYXQgSmFuICAyIDIxOjI4OjU0IDE5OTkgIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSoga2V5ZGVmcy5weSwgaWRsZXZlci5weSwgaWRsZS5weXcsIGlkbGUuYmF0LCBoZWxwLnR4dCwgZXh0ZW5kLnR4dCwgZXh0ZW5kLnB5LCBldmVudHBhcnNlLnB5LCBab29tSGVpZ2h0LnB5LCBXaW5kb3dMaXN0LnB5LCBVbmRvRGVsZWdhdG9yLnB5LCBTdGFja1ZpZXdlci5weSwgU2VhcmNoRW5naW5lLnB5LCBTZWFyY2hEaWFsb2dCYXNlLnB5LCBTZWFyY2hEaWFsb2cucHksIFNjcm9sbGVkTGlzdC5weSwgU2VhcmNoQmluZGluZy5weSwgU2NyaXB0QmluZGluZy5weSwgUmVwbGFjZURpYWxvZy5weSwgQXR0aWMvUkVBRE1FLCBSRUFETUUudHh0LCBQeVNoZWxsLnB5LCBBdHRpYy9Qb3B1cE1lbnUucHksIE91dHB1dFdpbmRvdy5weSwgSU9CaW5kaW5nLnB5LCBBdHRpYy9IZWxwV2luZG93LnB5LCBIaXN0b3J5LnB5LCBHcmVwRGlhbG9nLnB5LCBGaWxlTGlzdC5weSwgRnJhbWVWaWV3ZXIucHksIEVkaXRvcldpbmRvdy5weSwgRGVidWdnZXIucHksIERlbGVnYXRvci5weSwgQ29sb3JEZWxlZ2F0b3IucHksIEJpbmRpbmdzLnB5LCBDbGFzc0Jyb3dzZXIucHksIEF1dG9FeHBhbmQucHksIEF1dG9JbmRlbnQucHk6CisJQ2hlY2tpbmcgaW4gSURMRSAwLjIuCisKKwlNdWNoIGhhcyBjaGFuZ2VkIC0tIHRvbyBtdWNoLCBpbiBmYWN0LCB0byB3cml0ZSBkb3duLgorCVRoZSBiaWcgbmV3cyBpcyB0aGF0IHRoZXJlJ3MgYSBzdGFuZGFyZCB3YXkgdG8gd3JpdGUgSURMRSBleHRlbnNpb25zOworCXNlZSBleHRlbmQudHh0LiAgU29tZSBzYW1wbGUgZXh0ZW5zaW9ucyBoYXZlIGJlZW4gcHJvdmlkZWQsIGFuZAorCXNvbWUgZXhpc3RpbmcgY29kZSBoYXMgYmVlbiBjb252ZXJ0ZWQgdG8gZXh0ZW5zaW9ucy4gIFByb2JhYmx5IHRoZQorCWJpZ2dlc3QgbmV3IHVzZXIgZmVhdHVyZSBpcyBhIG5ldyBzZWFyY2ggZGlhbG9nIHdpdGggbW9yZSBvcHRpb25zLAorCXNlYXJjaCBhbmQgcmVwbGFjZSwgYW5kIGV2ZW4gc2VhcmNoIGluIGZpbGVzIChncmVwKS4KKworCVRoaXMgaXMgZXhhY3RseSBhcyBkb3dubG9hZGVkIGZyb20gbXkgbGFwdG9wIGFmdGVyIHJldHVybmluZworCWZyb20gdGhlIGhvbGlkYXlzIC0tIGl0IGhhc24ndCBldmVuIGJlZW4gdGVzdGVkIG9uIFVuaXggeWV0LgorCitGcmkgRGVjIDE4IDE1OjUyOjU0IDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogRmlsZUxpc3QucHksIENsYXNzQnJvd3Nlci5weToKKwlGaXggdGhlIGNsYXNzIGJyb3dzZXIgdG8gd29yayBldmVuIHdoZW4gdGhlIGZpbGUgaXMgbm90IG9uIHN5cy5wYXRoLgorCitUdWUgRGVjICA4IDIwOjM5OjM2IDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQXR0aWMvdHVydGxlLnB5OiBNb3ZlZCB0byBQeXRob24gMS41LjIvTGliCisKK0ZyaSBOb3YgMjcgMDM6MTk6MjAgMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBoZWxwLnR4dDogVHlwbworCisJKiBFZGl0b3JXaW5kb3cucHksIEZpbGVMaXN0LnB5OiBTdXBwb3J0IHVuZGVybGluaW5nIG9mIG1lbnUgbGFiZWxzCisKKwkqIEJpbmRpbmdzLnB5OgorCU5ldyBhcHByb2FjaCwgc2VwYXJhdGUgdGFibGVzIGZvciBtZW51cyAocGxhdGZvcm0taW5kZXBlbmRlbnQpIGFuZCBrZXkKKwlkZWZpbml0aW9ucyAocGxhdGZvcm0tc3BlY2lmaWMpLCBhbmQgZ2VuZXJhdGluZyBhY2NlbGVyYXRvciBzdHJpbmdzCisJYXV0b21hdGljYWxseSBmcm9tIHRoZSBrZXkgZGVmaW5pdGlvbnMuCisKK01vbiBOb3YgMTYgMTg6Mzc6NDIgMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdHRpYy9SRUFETUU6IENsYXJpZnkgcG9ydGFiaWxpdHkgYW5kIG1haW4gcHJvZ3JhbS4KKworCSogQXR0aWMvUkVBRE1FOiBBZGRlZCBpbnRybyBmb3IgMC4xIHJlbGVhc2UgYW5kIGFwcGVuZCBHcmFpbCBub3Rlcy4KKworTW9uIE9jdCAyNiAxODo0OTowMCAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIEF0dGljL3R1cnRsZS5weTogcm9vdCBpcyBub3cgYSBnbG9iYWwgY2FsbGVkIF9yb290CisKK1NhdCBPY3QgMjQgMTY6Mzg6MzggMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBBdHRpYy90dXJ0bGUucHk6IFJhaXNlIHRoZSByb290IHdpbmRvdyBvbiByZXNldCgpLgorCURpZmZlcmVudCBhY3Rpb24gb24gV01fREVMRVRFX1dJTkRPVyBpcyBtb3JlIGxpa2VseSB0byBkbyB0aGUgcmlnaHQgdGhpbmcsCisJYWxsb3dpbmcgdXMgdG8gZGVzdHJveSBvbGQgd2luZG93cy4KKworCSogQXR0aWMvdHVydGxlLnB5OgorCVNwbGl0IHRoZSBnb3RvKCkgZnVuY3Rpb24gaW4gdHdvOiBfZ290bygpIGlzIHRoZSBpbnRlcm5hbCBvbmUsCisJdXNpbmcgQ2FudmFzIGNvb3JkaW5hdGVzLCBhbmQgZ290bygpIHVzZXMgdHVydGxlIGNvb3JkaW5hdGVzCisJYW5kIGFjY2VwdHMgdmFyaWFibGUgYXJndW1lbnQgbGlzdHMuCisKKwkqIEF0dGljL3R1cnRsZS5weTogQ29wZSB3aXRoIGRlc3RydWN0aW9uIG9mIHRoZSB3aW5kb3cKKworCSogQXR0aWMvdHVydGxlLnB5OiBUdXJ0bGUgZ3JhcGhpY3MKKworCSogRGVidWdnZXIucHk6IFVzZSBvZiBCcmVha3BvaW50IGNsYXNzIHNob3VsZCBiZSBiZGIuQnJlYWtwb2ludC4KKworTW9uIE9jdCAxOSAwMzozMzo0MCAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFNlYXJjaEJpbmRpbmcucHk6CisJU3BlZWQgdXAgdGhlIHNlYXJjaCBhIGJpdCAtLSBkb24ndCBkcmFnIGEgbWFyayBhcm91bmQuLi4KKworCSogUHlTaGVsbC5weToKKwlDaGFuZ2Ugb3VyIHNwZWNpYWwgZW50cmllcyBmcm9tIDxjb25zb2xlI04+IHRvIDxweXNoZWxsI04+LgorCVBhdGNoIGxpbmVjYWNoZS5jaGVja2NhY2hlKCkgdG8ga2VlcCBvdXIgc3BlY2lhbCBlbnRyaWVzIGFsaXZlLgorCUFkZCBwb3B1cCBtZW51IHRvIGFsbCBlZGl0b3Igd2luZG93cyB0byBzZXQgYSBicmVha3BvaW50LgorCisJKiBEZWJ1Z2dlci5weToKKwlVc2UgYW5kIHBhc3MgdGhyb3VnaCB0aGUgJ2ZvcmNlJyBmbGFnIHRvIHNldF9kaWN0KCkgd2hlcmUgYXBwcm9wcmlhdGUuCisJRGVmYXVsdCBzb3VyY2UgYW5kIGdsb2JhbHMgY2hlY2tib3hlcyB0byBmYWxzZS4KKwlEb24ndCBpbnRlcmFjdCBpbiB1c2VyX3JldHVybigpLgorCUFkZCBwcmltaXRpdmUgc2V0X2JyZWFrcG9pbnQoKSBtZXRob2QuCisKKwkqIENvbG9yRGVsZWdhdG9yLnB5OgorCVJhaXNlIHByaW9yaXR5IG9mICdzZWwnIHRhZyBzbyBpdHMgZm9yZWdyb3VuZCAob24gV2luZG93cykgd2lsbCB0YWtlCisJcHJpb3JpdHkgb3ZlciB0ZXh0IGNvbG9yaXphdGlvbiAod2hpY2ggb24gV2luZG93cyBpcyBhbG1vc3QgdGhlCisJc2FtZSBjb2xvciBhcyB0aGUgc2VsZWN0aW9uIGJhY2tncm91bmQpLgorCisJRGVmaW5lIGEgdGFnIGFuZCBjb2xvciBmb3IgYnJlYWtwb2ludHMgKCJCUkVBSyIpLgorCisJKiBBdHRpYy9Qb3B1cE1lbnUucHk6IERpc2FibGUgIk9wZW4gc3RhY2sgdmlld2VyIiBhbmQgImhlbHAiIGNvbW1hbmRzLgorCisJKiBTdGFja1ZpZXdlci5weToKKwlBZGQgb3B0aW9uYWwgJ2ZvcmNlJyBhcmd1bWVudCAoZGVmYXVsdCAwKSB0byBsb2FkX2RpY3QoKS4KKwlJZiBzZXQsIHJlZG8gdGhlIGRpc3BsYXkgZXZlbiBpZiBpdCdzIHRoZSBzYW1lIGRpY3QuCisKK0ZyaSBPY3QgMTYgMjE6MTA6MTIgMTk5OCAgR3VpZG8gdmFuIFJvc3N1bSAgPGd1aWRvQGNucmkucmVzdG9uLnZhLnVzPgorCisJKiBTdGFja1ZpZXdlci5weTogRG8gbm90aGluZyB3aGVuIGxvYWRpbmcgdGhlIHNhbWUgZGljdCBhcyBiZWZvcmUuCisKKwkqIFB5U2hlbGwucHk6IERldGFpbHMgZm9yIGRlYnVnZ2VyIGludGVyZmFjZS4KKworCSogRGVidWdnZXIucHk6CisJUmVzdHJ1Y3R1cmVkIGFuZCBtb3JlIGNvbnNpc3RlbnQuICBTYXZlIGNoZWNrYm94ZXMgYWNyb3NzIGluc3RhbnRpYXRpb25zLgorCisJKiBFZGl0b3JXaW5kb3cucHksIEF0dGljL1JFQURNRSwgQmluZGluZ3MucHk6CisJR2V0IHJpZCBvZiBjb25mbGljdGluZyBeWCBiaW5kaW5nLiAgVXNlIF5XLgorCisJKiBEZWJ1Z2dlci5weSwgU3RhY2tWaWV3ZXIucHk6CisJRGVidWdnZXIgY2FuIG5vdyBzaG93IGxvY2FsIGFuZCBnbG9iYWwgdmFyaWFibGVzLgorCisJKiBEZWJ1Z2dlci5weTogT29wcworCisJKiBEZWJ1Z2dlci5weSwgUHlTaGVsbC5weTogQmV0dGVyIGRlYnVnZ2VyIHN1cHBvcnQgKHNob3cgc3RhY2sgZXRjKS4KKworCSogQXR0aWMvUG9wdXBNZW51LnB5OiBGb2xsb3cgcmVuYW1lcyBpbiBTdGFja1ZpZXdlciBtb2R1bGUKKworCSogU3RhY2tWaWV3ZXIucHk6CisJUmVuYW1lIGNsYXNzZXMgdG8gU3RhY2tWaWV3ZXIgKHRoZSB3aWRnZXQpIGFuZCBTdGFja0Jyb3dzZXIgKHRoZSB0b3BsZXZlbCkuCisKKwkqIFNjcm9sbGVkTGlzdC5weTogQWRkIGNsb3NlKCkgbWV0aG9kCisKKwkqIEVkaXRvcldpbmRvdy5weTogQ2xhcmlmeSAnT3BlbiBNb2R1bGUnIGRpYWxvZyB0ZXh0CisKKwkqIFN0YWNrVmlld2VyLnB5OiBSZXN0cnVjdHVyZWQgaW50byBhIGJyb3dzZXIgYW5kIGEgd2lkZ2V0LgorCitUaHUgT2N0IDE1IDIzOjI3OjA4IDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogQ2xhc3NCcm93c2VyLnB5LCBTY3JvbGxlZExpc3QucHk6CisJR2VuZXJhbGl6ZWQgdGhlIHNjcm9sbGVkIGxpc3Qgd2hpY2ggaXMgdGhlIGJhc2UgZm9yIHRoZSBjbGFzcyBhbmQKKwltZXRob2QgYnJvd3NlciBpbnRvIGEgc2VwYXJhdGUgY2xhc3MgaW4gaXRzIG93biBtb2R1bGUuCisKKwkqIEF0dGljL3Rlc3QucHk6IENvc21ldGljIGNoYW5nZQorCisJKiBEZWJ1Z2dlci5weTogRG9uJ3Qgc2hvdyBmdW5jdGlvbiBuYW1lIGlmIHRoZXJlIGlzIG5vbmUKKworV2VkIE9jdCAxNCAwMzo0MzowNSAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIERlYnVnZ2VyLnB5LCBQeVNoZWxsLnB5OiBQb2xpc2ggdGhlIERlYnVnZ2VyIEdVSSBhIGJpdC4KKwlDbG9zaW5nIGl0IG5vdyBhbHNvIGRvZXMgdGhlIHJpZ2h0IHRoaW5nLgorCitUdWUgT2N0IDEzIDIzOjUxOjEzIDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogRGVidWdnZXIucHksIFB5U2hlbGwucHksIEJpbmRpbmdzLnB5OgorCUFkIHByaW1pdGl2ZSBkZWJ1Z2dlciBpbnRlcmZhY2UgKHNvIGZhciBpdCB3aWxsIHN0ZXAgYW5kIHNob3cgeW91IHRoZQorCXNvdXJjZSwgYnV0IGl0IGRvZXNuJ3QgeWV0IHNob3cgdGhlIHN0YWNrKS4KKworCSogQXR0aWMvUkVBRE1FOiBNaXNjCisKKwkqIFN0YWNrVmlld2VyLnB5OiBXaG9vcHMgLS0gcmVmZXJlbmNlZCBzZWxmLnRvcCBiZWZvcmUgaXQgd2FzIHNldC4KKworCSogaGVscC50eHQ6IEFkZGVkIGhpc3RvcnkgYW5kIGNvbXBsZXRpb24gY29tbWFuZHMuCisKKwkqIGhlbHAudHh0OiBVcGRhdGVkCisKKwkqIEZpbGVMaXN0LnB5OiBBZGQgY2xhc3MgYnJvd3NlciBmdW5jdGlvbmFsaXR5LgorCisJKiBTdGFja1ZpZXdlci5weToKKwlBZGQgYSBjbG9zZSgpIG1ldGhvZCBhbmQgYmluZCB0byBXTV9ERUxFVEVfV0lORE9XIHByb3RvY29sCisKKwkqIFB5U2hlbGwucHk6IENsZWFyIHRoZSBsaW5lY2FjaGUgYmVmb3JlIHByaW50aW5nIGEgdHJhY2ViYWNrCisKKwkqIEJpbmRpbmdzLnB5OiBBZGRlZCBjbGFzcyBicm93c2VyIGJpbmRpbmcuCisKKwkqIENsYXNzQnJvd3Nlci5weTogTXVjaCBpbXByb3ZlZCwgbXVjaCBsZWZ0IHRvIGRvLgorCisJKiBQeVNoZWxsLnB5OiBNYWtlIHRoZSByZXR1cm4ga2V5IGRvIHdoYXQgSSBtZWFuIG1vcmUgb2Z0ZW4uCisKKwkqIENsYXNzQnJvd3Nlci5weToKKwlBZGRpbmcgdGhlIGJlZ2lubmluZ3Mgb2YgYSBDbGFzcyBicm93c2VyLiAgSW5jb21wbGV0ZSwgeWV0LgorCisJKiBFZGl0b3JXaW5kb3cucHksIEJpbmRpbmdzLnB5OgorCUFkZCBuZXcgY29tbWFuZCwgIk9wZW4gbW9kdWxlIi4gIFlvdSBzZWxlY3Qgb3IgdHlwZSBhIG1vZHVsZSBuYW1lLAorCWFuZCBpdCBvcGVucyB0aGUgc291cmNlLgorCitNb24gT2N0IDEyIDIzOjU5OjI3IDE5OTggIEd1aWRvIHZhbiBSb3NzdW0gIDxndWlkb0BjbnJpLnJlc3Rvbi52YS51cz4KKworCSogUHlTaGVsbC5weTogU3Vic3VtZSBmdW5jdGlvbmFsaXR5IGZyb20gUG9wdXAgbWVudSBpbiBEZWJ1ZyBtZW51LgorCU90aGVyIHN0dWZmIHNvIHRoZSBQeVNoZWxsIHdpbmRvdyBjYW4gYmUgcmVzdXJyZWN0ZWQgZnJvbSB0aGUgV2luZG93cyBtZW51LgorCisJKiBGaWxlTGlzdC5weTogR2V0IHJpZCBvZiBQb3BVcCBtZW51LgorCUNyZWF0ZSBhIHNpbXBsZSBXaW5kb3dzIG1lbnUuICAoSW1wZXJmZWN0IHdoZW4gVW50aXRsZWQgd2luZG93cyBleGlzdC4pCisJQWRkIHdha2V1cCgpIG1ldGhvZDogZGVpY29uaWZ5LCByYWlzZSwgZm9jdXMuCisKKwkqIEVkaXRvcldpbmRvdy5weTogR2VuZXJhbGl6ZSBtZW51IGNyZWF0aW9uLgorCisJKiBCaW5kaW5ncy5weTogQWRkIERlYnVnIGFuZCBIZWxwIG1lbnUgaXRlbXMuCisKKwkqIEVkaXRvcldpbmRvdy5weTogQWRkZWQgYSBtZW51IGJhciB0byBldmVyeSB3aW5kb3cuCisKKwkqIEJpbmRpbmdzLnB5OiBBZGQgbWVudSBjb25maWd1cmF0aW9uIHRvIHRoZSBldmVudCBjb25maWd1cmF0aW9uLgorCisJKiBBdHRpYy9Qb3B1cE1lbnUucHk6IFBhc3MgYSByb290IHRvIHRoZSBoZWxwIHdpbmRvdy4KKworCSogU2VhcmNoQmluZGluZy5weToKKwlBZGQgcGFyZW50IGFyZ3VtZW50IHRvICd0byB0byBsaW5lIG51bWJlcicgZGlhbG9nIGJveC4KKworU2F0IE9jdCAxMCAxOToxNTozMiAxOTk4ICBHdWlkbyB2YW4gUm9zc3VtICA8Z3VpZG9AY25yaS5yZXN0b24udmEudXM+CisKKwkqIFN0YWNrVmlld2VyLnB5OgorCUFkZCBhIGxhYmVsIGF0IHRoZSB0b3Agc2hvd2luZyAodmVyeSBiYXNpYykgaGVscCBmb3IgdGhlIHN0YWNrIHZpZXdlci4KKwlBZGQgYSBsYWJlbCBhdCB0aGUgYm90dG9tIHNob3dpbmcgdGhlIGV4Y2VwdGlvbiBpbmZvLgorCisJKiBBdHRpYy90ZXN0LnB5LCBBdHRpYy9pZGxlOiBBZGQgVW5peCBtYWluIHNjcmlwdCBhbmQgdGVzdCBwcm9ncmFtLgorCisJKiBpZGxlLnB5dywgaGVscC50eHQsIFdpZGdldFJlZGlyZWN0b3IucHksIFVuZG9EZWxlZ2F0b3IucHksIFN0YWNrVmlld2VyLnB5LCBTZWFyY2hCaW5kaW5nLnB5LCBBdHRpYy9SRUFETUUsIFB5U2hlbGwucHksIEF0dGljL1BvcHVwTWVudS5weSwgUGVyY29sYXRvci5weSwgT3V0bGluZS5weSwgSU9CaW5kaW5nLnB5LCBIaXN0b3J5LnB5LCBBdHRpYy9IZWxwV2luZG93LnB5LCBGcmFtZVZpZXdlci5weSwgRmlsZUxpc3QucHksIEVkaXRvcldpbmRvdy5weSwgRGVsZWdhdG9yLnB5LCBDb2xvckRlbGVnYXRvci5weSwgQmluZGluZ3MucHksIEF1dG9JbmRlbnQucHksIEF1dG9FeHBhbmQucHk6CisJSW5pdGlhbCBjaGVja2luZyBvZiBUay1iYXNlZCBQeXRob24gSURFLgorCUZlYXR1cmVzOiB0ZXh0IGVkaXRvciB3aXRoIHN5bnRheCBjb2xvcmluZyBhbmQgdW5kbzsKKwlzdWJjbGFzc2VkIGludG8gaW50ZXJhY3RpdmUgUHl0aG9uIHNoZWxsIHdoaWNoIGFkZHMgaGlzdG9yeS4KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NsYXNzQnJvd3Nlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk1YjMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9DbGFzc0Jyb3dzZXIucHkKQEAgLTAsMCArMSwyMjEgQEAKKyIiIkNsYXNzIGJyb3dzZXIuCisKK1hYWCBUTyBETzoKKworLSByZXBhcnNlIHdoZW4gc291cmNlIGNoYW5nZWQgKG1heWJlIGp1c3QgYSBidXR0b24gd291bGQgYmUgT0s/KQorICAgIChvciByZWNoZWNrIG9uIHdpbmRvdyBwb3B1cCkKKy0gYWRkIHBvcHVwIG1lbnUgd2l0aCBtb3JlIG9wdGlvbnMgKGUuZy4gZG9jIHN0cmluZ3MsIGJhc2UgY2xhc3NlcywgaW1wb3J0cykKKy0gc2hvdyBmdW5jdGlvbiBhcmd1bWVudCBsaXN0PyAoaGF2ZSB0byBkbyBwYXR0ZXJuIG1hdGNoaW5nIG9uIHNvdXJjZSkKKy0gc2hvdWxkIHRoZSBjbGFzc2VzIGFuZCBtZXRob2RzIGxpc3RzIGFsc28gYmUgaW4gdGhlIG1vZHVsZSdzIG1lbnUgYmFyPworLSBhZGQgYmFzZSBjbGFzc2VzIHRvIGNsYXNzIGJyb3dzZXIgdHJlZQorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHB5Y2xicgorCitmcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKK2Zyb20gaWRsZWxpYi5XaW5kb3dMaXN0IGltcG9ydCBMaXN0ZWRUb3BsZXZlbAorZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVOb2RlLCBUcmVlSXRlbSwgU2Nyb2xsZWRDYW52YXMKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCitjbGFzcyBDbGFzc0Jyb3dzZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmxpc3QsIG5hbWUsIHBhdGgpOgorICAgICAgICAjIFhYWCBUaGlzIEFQSSBzaG91bGQgY2hhbmdlLCBpZiB0aGUgZmlsZSBkb2Vzbid0IGVuZCBpbiAiLnB5IgorICAgICAgICAjIFhYWCB0aGUgY29kZSBoZXJlIGlzIGJvZ3VzIQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuZmlsZSA9IG9zLnBhdGguam9pbihwYXRoWzBdLCBzZWxmLm5hbWUgKyAiLnB5IikKKyAgICAgICAgc2VsZi5pbml0KGZsaXN0KQorCisgICAgZGVmIGNsb3NlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnRvcC5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5ub2RlLmRlc3Ryb3koKQorCisgICAgZGVmIGluaXQoc2VsZiwgZmxpc3QpOgorICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKKyAgICAgICAgIyByZXNldCBweWNsYnIKKyAgICAgICAgcHljbGJyLl9tb2R1bGVzLmNsZWFyKCkKKyAgICAgICAgIyBjcmVhdGUgdG9wCisgICAgICAgIHNlbGYudG9wID0gdG9wID0gTGlzdGVkVG9wbGV2ZWwoZmxpc3Qucm9vdCkKKyAgICAgICAgdG9wLnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgc2VsZi5jbG9zZSkKKyAgICAgICAgdG9wLmJpbmQoIjxFc2NhcGU+Iiwgc2VsZi5jbG9zZSkKKyAgICAgICAgc2VsZi5zZXR0aXRsZSgpCisgICAgICAgIHRvcC5mb2N1c19zZXQoKQorICAgICAgICAjIGNyZWF0ZSBzY3JvbGxlZCBjYW52YXMKKyAgICAgICAgdGhlbWUgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdUaGVtZScsJ25hbWUnKQorICAgICAgICBiYWNrZ3JvdW5kID0gaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnbm9ybWFsJylbJ2JhY2tncm91bmQnXQorICAgICAgICBzYyA9IFNjcm9sbGVkQ2FudmFzKHRvcCwgYmc9YmFja2dyb3VuZCwgaGlnaGxpZ2h0dGhpY2tuZXNzPTAsIHRha2Vmb2N1cz0xKQorICAgICAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICAgICAgaXRlbSA9IHNlbGYucm9vdG5vZGUoKQorICAgICAgICBzZWxmLm5vZGUgPSBub2RlID0gVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQorICAgICAgICBub2RlLnVwZGF0ZSgpCisgICAgICAgIG5vZGUuZXhwYW5kKCkKKworICAgIGRlZiBzZXR0aXRsZShzZWxmKToKKyAgICAgICAgc2VsZi50b3Aud21fdGl0bGUoIkNsYXNzIEJyb3dzZXIgLSAiICsgc2VsZi5uYW1lKQorICAgICAgICBzZWxmLnRvcC53bV9pY29ubmFtZSgiQ2xhc3MgQnJvd3NlciIpCisKKyAgICBkZWYgcm9vdG5vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBNb2R1bGVCcm93c2VyVHJlZUl0ZW0oc2VsZi5maWxlKQorCitjbGFzcyBNb2R1bGVCcm93c2VyVHJlZUl0ZW0oVHJlZUl0ZW0pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5maWxlKQorCisgICAgZGVmIEdldEljb25OYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gInB5dGhvbiIKKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5saXN0Y2xhc3NlcygpOgorICAgICAgICAgICAgaXRlbSA9IENsYXNzQnJvd3NlclRyZWVJdGVtKG5hbWUsIHNlbGYuY2xhc3Nlcywgc2VsZi5maWxlKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworICAgIGRlZiBPbkRvdWJsZUNsaWNrKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLm5vcm1jYXNlKHNlbGYuZmlsZVstMzpdKSAhPSAiLnB5IjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBQeVNoZWxsLmZsaXN0Lm9wZW4oc2VsZi5maWxlKQorCisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uoc2VsZi5maWxlWy0zOl0pID09ICIucHkiCisKKyAgICBkZWYgbGlzdGNsYXNzZXMoc2VsZik6CisgICAgICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5maWxlKQorICAgICAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGUpCisgICAgICAgIGlmIG9zLnBhdGgubm9ybWNhc2UoZXh0KSAhPSAiLnB5IjoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkaWN0ID0gcHljbGJyLnJlYWRtb2R1bGVfZXgobmFtZSwgW2Rpcl0gKyBzeXMucGF0aCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBtc2c6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBzZWxmLmNsYXNzZXMgPSB7fQorICAgICAgICBmb3Iga2V5LCBjbCBpbiBkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBjbC5tb2R1bGUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICBzID0ga2V5CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihjbCwgJ3N1cGVyJykgYW5kIGNsLnN1cGVyOgorICAgICAgICAgICAgICAgICAgICBzdXBlcnMgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3Igc3VwIGluIGNsLnN1cGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHlwZShzdXApIGlzIHR5cGUoJycpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYW1lID0gc3VwCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNuYW1lID0gc3VwLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzdXAubW9kdWxlICE9IGNsLm1vZHVsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25hbWUgPSAiJXMuJXMiICUgKHN1cC5tb2R1bGUsIHNuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJzLmFwcGVuZChzbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgcyA9IHMgKyAiKCVzKSIgJSAiLCAiLmpvaW4oc3VwZXJzKQorICAgICAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgoY2wubGluZW5vLCBzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmNsYXNzZXNbc10gPSBjbAorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIGZvciBpdGVtLCBzIGluIGl0ZW1zOgorICAgICAgICAgICAgbGlzdC5hcHBlbmQocykKKyAgICAgICAgcmV0dXJuIGxpc3QKKworY2xhc3MgQ2xhc3NCcm93c2VyVHJlZUl0ZW0oVHJlZUl0ZW0pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGNsYXNzZXMsIGZpbGUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuY2xhc3NlcyA9IGNsYXNzZXMKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsID0gc2VsZi5jbGFzc2VzW3NlbGYubmFtZV0KKyAgICAgICAgZXhjZXB0IChJbmRleEVycm9yLCBLZXlFcnJvcik6CisgICAgICAgICAgICBzZWxmLmNsID0gTm9uZQorICAgICAgICBzZWxmLmlzZnVuY3Rpb24gPSBpc2luc3RhbmNlKHNlbGYuY2wsIHB5Y2xici5GdW5jdGlvbikKKworICAgIGRlZiBHZXRUZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlzZnVuY3Rpb246CisgICAgICAgICAgICByZXR1cm4gImRlZiAiICsgc2VsZi5uYW1lICsgIiguLi4pIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJjbGFzcyAiICsgc2VsZi5uYW1lCisKKyAgICBkZWYgR2V0SWNvbk5hbWUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaXNmdW5jdGlvbjoKKyAgICAgICAgICAgIHJldHVybiAicHl0aG9uIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICJmb2xkZXIiCisKKyAgICBkZWYgSXNFeHBhbmRhYmxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBub3Qgbm90IHNlbGYuY2wubWV0aG9kcworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNsOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHN1Ymxpc3QgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmxpc3RtZXRob2RzKCk6CisgICAgICAgICAgICBpdGVtID0gTWV0aG9kQnJvd3NlclRyZWVJdGVtKG5hbWUsIHNlbGYuY2wsIHNlbGYuZmlsZSkKKyAgICAgICAgICAgIHN1Ymxpc3QuYXBwZW5kKGl0ZW0pCisgICAgICAgIHJldHVybiBzdWJsaXN0CisKKyAgICBkZWYgT25Eb3VibGVDbGljayhzZWxmKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWRpdCA9IFB5U2hlbGwuZmxpc3Qub3BlbihzZWxmLmZpbGUpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5jbCwgJ2xpbmVubycpOgorICAgICAgICAgICAgbGluZW5vID0gc2VsZi5jbC5saW5lbm8KKyAgICAgICAgICAgIGVkaXQuZ290b2xpbmUobGluZW5vKQorCisgICAgZGVmIGxpc3RtZXRob2RzKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jbDoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIGZvciBuYW1lLCBsaW5lbm8gaW4gc2VsZi5jbC5tZXRob2RzLml0ZW1zKCk6CisgICAgICAgICAgICBpdGVtcy5hcHBlbmQoKGxpbmVubywgbmFtZSkpCisgICAgICAgIGl0ZW1zLnNvcnQoKQorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgZm9yIGl0ZW0sIG5hbWUgaW4gaXRlbXM6CisgICAgICAgICAgICBsaXN0LmFwcGVuZChuYW1lKQorICAgICAgICByZXR1cm4gbGlzdAorCitjbGFzcyBNZXRob2RCcm93c2VyVHJlZUl0ZW0oVHJlZUl0ZW0pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGNsLCBmaWxlKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmNsID0gY2wKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiAiZGVmICIgKyBzZWxmLm5hbWUgKyAiKC4uLikiCisKKyAgICBkZWYgR2V0SWNvbk5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiAicHl0aG9uIiAjIFhYWAorCisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBPbkRvdWJsZUNsaWNrKHNlbGYpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlZGl0ID0gUHlTaGVsbC5mbGlzdC5vcGVuKHNlbGYuZmlsZSkKKyAgICAgICAgZWRpdC5nb3RvbGluZShzZWxmLmNsLm1ldGhvZHNbc2VsZi5uYW1lXSkKKworZGVmIG1haW4oKToKKyAgICB0cnk6CisgICAgICAgIGZpbGUgPSBfX2ZpbGVfXworICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgIGZpbGUgPSBzeXMuYXJndlswXQorICAgICAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICBmaWxlID0gc3lzLmFyZ3ZbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGUgPSBzeXMuYXJndlswXQorICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQoZmlsZSkKKyAgICBuYW1lID0gb3MucGF0aC5zcGxpdGV4dChmaWxlKVswXQorICAgIENsYXNzQnJvd3NlcihQeVNoZWxsLmZsaXN0LCBuYW1lLCBbZGlyXSkKKyAgICBpZiBzeXMuc3RkaW4gaXMgc3lzLl9fc3RkaW5fXzoKKyAgICAgICAgbWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NsYXNzQnJvd3Nlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA5OWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NsYXNzQnJvd3Nlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NsYXNzQnJvd3Nlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ2xhc3NCcm93c2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzA5OWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NsYXNzQnJvd3Nlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvZGVDb250ZXh0LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvZGVDb250ZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNmY3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29kZUNvbnRleHQucHkKQEAgLTAsMCArMSwxNzYgQEAKKyIiIkNvZGVDb250ZXh0IC0gRXh0ZW5zaW9uIHRvIGRpc3BsYXkgdGhlIGJsb2NrIGNvbnRleHQgYWJvdmUgdGhlIGVkaXQgd2luZG93CisKK09uY2UgY29kZSBoYXMgc2Nyb2xsZWQgb2ZmIHRoZSB0b3Agb2YgYSB3aW5kb3csIGl0IGNhbiBiZSBkaWZmaWN1bHQgdG8KK2RldGVybWluZSB3aGljaCBibG9jayB5b3UgYXJlIGluLiAgVGhpcyBleHRlbnNpb24gaW1wbGVtZW50cyBhIHBhbmUgYXQgdGhlIHRvcAorb2YgZWFjaCBJRExFIGVkaXQgd2luZG93IHdoaWNoIHByb3ZpZGVzIGJsb2NrIHN0cnVjdHVyZSBoaW50cy4gIFRoZXNlIGhpbnRzIGFyZQordGhlIGxpbmVzIHdoaWNoIGNvbnRhaW4gdGhlIGJsb2NrIG9wZW5pbmcga2V5d29yZHMsIGUuZy4gJ2lmJywgZm9yIHRoZQorZW5jbG9zaW5nIGJsb2NrLiAgVGhlIG51bWJlciBvZiBoaW50IGxpbmVzIGlzIGRldGVybWluZWQgYnkgdGhlIG51bWxpbmVzCit2YXJpYWJsZSBpbiB0aGUgQ29kZUNvbnRleHQgc2VjdGlvbiBvZiBjb25maWctZXh0ZW5zaW9ucy5kZWYuIExpbmVzIHdoaWNoIGRvCitub3Qgb3BlbiBibG9ja3MgYXJlIG5vdCBzaG93biBpbiB0aGUgY29udGV4dCBoaW50cyBwYW5lLgorCisiIiIKK2ltcG9ydCBUa2ludGVyCitmcm9tIFRrY29uc3RhbnRzIGltcG9ydCBUT1AsIExFRlQsIFgsIFcsIFNVTktFTgoraW1wb3J0IHJlCitmcm9tIHN5cyBpbXBvcnQgbWF4aW50IGFzIElORklOSVRZCitmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKKworQkxPQ0tPUEVORVJTID0gc2V0KFsiY2xhc3MiLCAiZGVmIiwgImVsaWYiLCAiZWxzZSIsICJleGNlcHQiLCAiZmluYWxseSIsICJmb3IiLAorICAgICAgICAgICAgICAgICAgICAiaWYiLCAidHJ5IiwgIndoaWxlIiwgIndpdGgiXSkKK1VQREFURUlOVEVSVkFMID0gMTAwICMgbWlsbGlzZWMKK0ZPTlRVUERBVEVJTlRFUlZBTCA9IDEwMDAgIyBtaWxsaXNlYworCitnZXRzcGFjZXNmaXJzdHdvcmQgPVwKKyAgICAgICAgICAgICAgICAgICBsYW1iZGEgcywgYz1yZS5jb21waWxlKHIiXihccyopKFx3KikiKTogYy5tYXRjaChzKS5ncm91cHMoKQorCitjbGFzcyBDb2RlQ29udGV4dDoKKyAgICBtZW51ZGVmcyA9IFsoJ29wdGlvbnMnLCBbKCchQ29kZSBDb250ZV94dCcsICc8PHRvZ2dsZS1jb2RlLWNvbnRleHQ+PicpXSldCisgICAgY29udGV4dF9kZXB0aCA9IGlkbGVDb25mLkdldE9wdGlvbigiZXh0ZW5zaW9ucyIsICJDb2RlQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVtbGluZXMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTMpCisgICAgYmdjb2xvciA9IGlkbGVDb25mLkdldE9wdGlvbigiZXh0ZW5zaW9ucyIsICJDb2RlQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmdjb2xvciIsIHR5cGU9InN0ciIsIGRlZmF1bHQ9IkxpZ2h0R3JheSIpCisgICAgZmdjb2xvciA9IGlkbGVDb25mLkdldE9wdGlvbigiZXh0ZW5zaW9ucyIsICJDb2RlQ29udGV4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmdjb2xvciIsIHR5cGU9InN0ciIsIGRlZmF1bHQ9IkJsYWNrIikKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKyAgICAgICAgc2VsZi50ZXh0ID0gZWRpdHdpbi50ZXh0CisgICAgICAgIHNlbGYudGV4dGZvbnQgPSBzZWxmLnRleHRbImZvbnQiXQorICAgICAgICBzZWxmLmxhYmVsID0gTm9uZQorICAgICAgICAjIHNlbGYuaW5mbyBpcyBhIGxpc3Qgb2YgKGxpbmUgbnVtYmVyLCBpbmRlbnQgbGV2ZWwsIGxpbmUgdGV4dCwgYmxvY2sKKyAgICAgICAgIyBrZXl3b3JkKSB0dXBsZXMgcHJvdmlkaW5nIHRoZSBibG9jayBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgICMgc2VsZi50b3B2aXNpYmxlICh0aGUgbGluZW51bWJlciBvZiB0aGUgbGluZSBkaXNwbGF5ZWQgYXQgdGhlIHRvcCBvZgorICAgICAgICAjIHRoZSBlZGl0IHdpbmRvdykuIHNlbGYuaW5mb1swXSBpcyBpbml0aWFsaXplZCBhcyBhICdkdW1teScgbGluZSB3aGljaAorICAgICAgICAjIHN0YXJ0cyB0aGUgdG9wbGV2ZWwgJ2Jsb2NrJyBvZiB0aGUgbW9kdWxlLgorICAgICAgICBzZWxmLmluZm8gPSBbKDAsIC0xLCAiIiwgRmFsc2UpXQorICAgICAgICBzZWxmLnRvcHZpc2libGUgPSAxCisgICAgICAgIHZpc2libGUgPSBpZGxlQ29uZi5HZXRPcHRpb24oImV4dGVuc2lvbnMiLCAiQ29kZUNvbnRleHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aXNpYmxlIiwgdHlwZT0iYm9vbCIsIGRlZmF1bHQ9RmFsc2UpCisgICAgICAgIGlmIHZpc2libGU6CisgICAgICAgICAgICBzZWxmLnRvZ2dsZV9jb2RlX2NvbnRleHRfZXZlbnQoKQorICAgICAgICAgICAgc2VsZi5lZGl0d2luLnNldHZhcignPDx0b2dnbGUtY29kZS1jb250ZXh0Pj4nLCBUcnVlKQorICAgICAgICAjIFN0YXJ0IHR3byB1cGRhdGUgY3ljbGVzLCBvbmUgZm9yIGNvbnRleHQgbGluZXMsIG9uZSBmb3IgZm9udCBjaGFuZ2VzLgorICAgICAgICBzZWxmLnRleHQuYWZ0ZXIoVVBEQVRFSU5URVJWQUwsIHNlbGYudGltZXJfZXZlbnQpCisgICAgICAgIHNlbGYudGV4dC5hZnRlcihGT05UVVBEQVRFSU5URVJWQUwsIHNlbGYuZm9udF90aW1lcl9ldmVudCkKKworICAgIGRlZiB0b2dnbGVfY29kZV9jb250ZXh0X2V2ZW50KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5sYWJlbDoKKyAgICAgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBib3JkZXIgd2lkdGggYW5kIGhvcml6b250YWwgcGFkZGluZyByZXF1aXJlZCB0bworICAgICAgICAgICAgIyBhbGlnbiB0aGUgY29udGV4dCB3aXRoIHRoZSB0ZXh0IGluIHRoZSBtYWluIFRleHQgd2lkZ2V0LgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBBbGwgdmFsdWVzIGFyZSBwYXNzZWQgdGhyb3VnaCBpbnQoc3RyKDx2YWx1ZT4pKSwgc2luY2Ugc29tZQorICAgICAgICAgICAgIyB2YWx1ZXMgbWF5IGJlIHBpeGVsIG9iamVjdHMsIHdoaWNoIGNhbid0IHNpbXBseSBiZSBhZGRlZCB0byBpbnRzLgorICAgICAgICAgICAgd2lkZ2V0cyA9IHNlbGYuZWRpdHdpbi50ZXh0LCBzZWxmLmVkaXR3aW4udGV4dF9mcmFtZQorICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIHZlcnRpY2FsIHBhZGRpbmcKKyAgICAgICAgICAgIHBhZHggPSAwCisgICAgICAgICAgICBmb3Igd2lkZ2V0IGluIHdpZGdldHM6CisgICAgICAgICAgICAgICAgcGFkeCArPSBpbnQoc3RyKCB3aWRnZXQucGFja19pbmZvKClbJ3BhZHgnXSApKQorICAgICAgICAgICAgICAgIHBhZHggKz0gaW50KHN0ciggd2lkZ2V0LmNnZXQoJ3BhZHgnKSApKQorICAgICAgICAgICAgIyBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGJvcmRlciB3aWR0aAorICAgICAgICAgICAgYm9yZGVyID0gMAorICAgICAgICAgICAgZm9yIHdpZGdldCBpbiB3aWRnZXRzOgorICAgICAgICAgICAgICAgIGJvcmRlciArPSBpbnQoc3RyKCB3aWRnZXQuY2dldCgnYm9yZGVyJykgKSkKKyAgICAgICAgICAgIHNlbGYubGFiZWwgPSBUa2ludGVyLkxhYmVsKHNlbGYuZWRpdHdpbi50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJcbiIgKiAoc2VsZi5jb250ZXh0X2RlcHRoIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3I9VywganVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udD1zZWxmLnRleHRmb250LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmc9c2VsZi5iZ2NvbG9yLCBmZz1zZWxmLmZnY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0xLCAjZG9uJ3QgcmVxdWVzdCBtb3JlIHRoYW4gd2UgZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWR4PXBhZHgsIGJvcmRlcj1ib3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9U1VOS0VOKQorICAgICAgICAgICAgIyBQYWNrIHRoZSBsYWJlbCB3aWRnZXQgYmVmb3JlIGFuZCBhYm92ZSB0aGUgdGV4dF9mcmFtZSB3aWRnZXQsCisgICAgICAgICAgICAjIHRodXMgZW5zdXJpbmcgdGhhdCBpdCB3aWxsIGFwcGVhciBkaXJlY3RseSBhYm92ZSB0ZXh0X2ZyYW1lCisgICAgICAgICAgICBzZWxmLmxhYmVsLnBhY2soc2lkZT1UT1AsIGZpbGw9WCwgZXhwYW5kPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZT1zZWxmLmVkaXR3aW4udGV4dF9mcmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubGFiZWwuZGVzdHJveSgpCisgICAgICAgICAgICBzZWxmLmxhYmVsID0gTm9uZQorICAgICAgICBpZGxlQ29uZi5TZXRPcHRpb24oImV4dGVuc2lvbnMiLCAiQ29kZUNvbnRleHQiLCAidmlzaWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoc2VsZi5sYWJlbCBpcyBub3QgTm9uZSkpCisgICAgICAgIGlkbGVDb25mLlNhdmVVc2VyQ2ZnRmlsZXMoKQorCisgICAgZGVmIGdldF9saW5lX2luZm8oc2VsZiwgbGluZW51bSk6CisgICAgICAgICIiIkdldCB0aGUgbGluZSBpbmRlbnQgdmFsdWUsIHRleHQsIGFuZCBhbnkgYmxvY2sgc3RhcnQga2V5d29yZAorCisgICAgICAgIElmIHRoZSBsaW5lIGRvZXMgbm90IHN0YXJ0IGEgYmxvY2ssIHRoZSBrZXl3b3JkIHZhbHVlIGlzIEZhbHNlLgorICAgICAgICBUaGUgaW5kZW50YXRpb24gb2YgZW1wdHkgbGluZXMgKG9yIGNvbW1lbnQgbGluZXMpIGlzIElORklOSVRZLgorCisgICAgICAgICIiIgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0LmdldCgiJWQuMCIgJSBsaW5lbnVtLCAiJWQuZW5kIiAlIGxpbmVudW0pCisgICAgICAgIHNwYWNlcywgZmlyc3R3b3JkID0gZ2V0c3BhY2VzZmlyc3R3b3JkKHRleHQpCisgICAgICAgIG9wZW5lciA9IGZpcnN0d29yZCBpbiBCTE9DS09QRU5FUlMgYW5kIGZpcnN0d29yZAorICAgICAgICBpZiBsZW4odGV4dCkgPT0gbGVuKHNwYWNlcykgb3IgdGV4dFtsZW4oc3BhY2VzKV0gPT0gJyMnOgorICAgICAgICAgICAgaW5kZW50ID0gSU5GSU5JVFkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZGVudCA9IGxlbihzcGFjZXMpCisgICAgICAgIHJldHVybiBpbmRlbnQsIHRleHQsIG9wZW5lcgorCisgICAgZGVmIGdldF9jb250ZXh0KHNlbGYsIG5ld190b3B2aXNpYmxlLCBzdG9wbGluZT0xLCBzdG9waW5kZW50PTApOgorICAgICAgICAiIiJHZXQgY29udGV4dCBsaW5lcywgc3RhcnRpbmcgYXQgbmV3X3RvcHZpc2libGUgYW5kIHdvcmtpbmcgYmFja3dhcmRzLgorCisgICAgICAgIFN0b3Agd2hlbiBzdG9wbGluZSBvciBzdG9waW5kZW50IGlzIHJlYWNoZWQuIFJldHVybiBhIHR1cGxlIG9mIGNvbnRleHQKKyAgICAgICAgZGF0YSBhbmQgdGhlIGluZGVudCBsZXZlbCBhdCB0aGUgdG9wIG9mIHRoZSByZWdpb24gaW5zcGVjdGVkLgorCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgc3RvcGxpbmUgPiAwCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgIyBUaGUgaW5kZW50YXRpb24gbGV2ZWwgd2UgYXJlIGN1cnJlbnRseSBpbjoKKyAgICAgICAgbGFzdGluZGVudCA9IElORklOSVRZCisgICAgICAgICMgRm9yIGEgbGluZSB0byBiZSBpbnRlcmVzdGluZywgaXQgbXVzdCBiZWdpbiB3aXRoIGEgYmxvY2sgb3BlbmluZworICAgICAgICAjIGtleXdvcmQsIGFuZCBoYXZlIGxlc3MgaW5kZW50YXRpb24gdGhhbiBsYXN0aW5kZW50LgorICAgICAgICBmb3IgbGluZW51bSBpbiB4cmFuZ2UobmV3X3RvcHZpc2libGUsIHN0b3BsaW5lLTEsIC0xKToKKyAgICAgICAgICAgIGluZGVudCwgdGV4dCwgb3BlbmVyID0gc2VsZi5nZXRfbGluZV9pbmZvKGxpbmVudW0pCisgICAgICAgICAgICBpZiBpbmRlbnQgPCBsYXN0aW5kZW50OgorICAgICAgICAgICAgICAgIGxhc3RpbmRlbnQgPSBpbmRlbnQKKyAgICAgICAgICAgICAgICBpZiBvcGVuZXIgaW4gKCJlbHNlIiwgImVsaWYiKToKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBhbHNvIHNob3cgdGhlIGlmIHN0YXRlbWVudAorICAgICAgICAgICAgICAgICAgICBsYXN0aW5kZW50ICs9IDEKKyAgICAgICAgICAgICAgICBpZiBvcGVuZXIgYW5kIGxpbmVudW0gPCBuZXdfdG9wdmlzaWJsZSBhbmQgaW5kZW50ID49IHN0b3BpbmRlbnQ6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgobGluZW51bSwgaW5kZW50LCB0ZXh0LCBvcGVuZXIpKQorICAgICAgICAgICAgICAgIGlmIGxhc3RpbmRlbnQgPD0gc3RvcGluZGVudDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbGluZXMucmV2ZXJzZSgpCisgICAgICAgIHJldHVybiBsaW5lcywgbGFzdGluZGVudAorCisgICAgZGVmIHVwZGF0ZV9jb2RlX2NvbnRleHQoc2VsZik6CisgICAgICAgICIiIlVwZGF0ZSBjb250ZXh0IGluZm9ybWF0aW9uIGFuZCBsaW5lcyB2aXNpYmxlIGluIHRoZSBjb250ZXh0IHBhbmUuCisKKyAgICAgICAgIiIiCisgICAgICAgIG5ld190b3B2aXNpYmxlID0gaW50KHNlbGYudGV4dC5pbmRleCgiQDAsMCIpLnNwbGl0KCcuJylbMF0pCisgICAgICAgIGlmIHNlbGYudG9wdmlzaWJsZSA9PSBuZXdfdG9wdmlzaWJsZTogICAgICAjIGhhdmVuJ3Qgc2Nyb2xsZWQKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnRvcHZpc2libGUgPCBuZXdfdG9wdmlzaWJsZTogICAgICAgIyBzY3JvbGwgZG93bgorICAgICAgICAgICAgbGluZXMsIGxhc3RpbmRlbnQgPSBzZWxmLmdldF9jb250ZXh0KG5ld190b3B2aXNpYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9wdmlzaWJsZSkKKyAgICAgICAgICAgICMgcmV0YWluIG9ubHkgY29udGV4dCBpbmZvIGFwcGxpY2FibGUgdG8gdGhlIHJlZ2lvbgorICAgICAgICAgICAgIyBiZXR3ZWVuIHRvcHZpc2libGUgYW5kIG5ld190b3B2aXNpYmxlOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5pbmZvWy0xXVsxXSA+PSBsYXN0aW5kZW50OgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmluZm9bLTFdCisgICAgICAgIGVsaWYgc2VsZi50b3B2aXNpYmxlID4gbmV3X3RvcHZpc2libGU6ICAgICAjIHNjcm9sbCB1cAorICAgICAgICAgICAgc3RvcGluZGVudCA9IHNlbGYuaW5mb1stMV1bMV0gKyAxCisgICAgICAgICAgICAjIHJldGFpbiBvbmx5IGNvbnRleHQgaW5mbyBhc3NvY2lhdGVkCisgICAgICAgICAgICAjIHdpdGggbGluZXMgYWJvdmUgbmV3X3RvcHZpc2libGU6CisgICAgICAgICAgICB3aGlsZSBzZWxmLmluZm9bLTFdWzBdID49IG5ld190b3B2aXNpYmxlOgorICAgICAgICAgICAgICAgIHN0b3BpbmRlbnQgPSBzZWxmLmluZm9bLTFdWzFdCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuaW5mb1stMV0KKyAgICAgICAgICAgIGxpbmVzLCBsYXN0aW5kZW50ID0gc2VsZi5nZXRfY29udGV4dChuZXdfdG9wdmlzaWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluZm9bLTFdWzBdKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcGluZGVudCkKKyAgICAgICAgc2VsZi5pbmZvLmV4dGVuZChsaW5lcykKKyAgICAgICAgc2VsZi50b3B2aXNpYmxlID0gbmV3X3RvcHZpc2libGUKKyAgICAgICAgIyBlbXB0eSBsaW5lcyBpbiBjb250ZXh0IHBhbmU6CisgICAgICAgIGNvbnRleHRfc3RyaW5ncyA9IFsiIl0gKiBtYXgoMCwgc2VsZi5jb250ZXh0X2RlcHRoIC0gbGVuKHNlbGYuaW5mbykpCisgICAgICAgICMgZm9sbG93ZWQgYnkgdGhlIGNvbnRleHQgaGludCBsaW5lczoKKyAgICAgICAgY29udGV4dF9zdHJpbmdzICs9IFt4WzJdIGZvciB4IGluIHNlbGYuaW5mb1stc2VsZi5jb250ZXh0X2RlcHRoOl1dCisgICAgICAgIHNlbGYubGFiZWxbInRleHQiXSA9ICdcbicuam9pbihjb250ZXh0X3N0cmluZ3MpCisKKyAgICBkZWYgdGltZXJfZXZlbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYubGFiZWw6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9jb2RlX2NvbnRleHQoKQorICAgICAgICBzZWxmLnRleHQuYWZ0ZXIoVVBEQVRFSU5URVJWQUwsIHNlbGYudGltZXJfZXZlbnQpCisKKyAgICBkZWYgZm9udF90aW1lcl9ldmVudChzZWxmKToKKyAgICAgICAgbmV3dGV4dGZvbnQgPSBzZWxmLnRleHRbImZvbnQiXQorICAgICAgICBpZiBzZWxmLmxhYmVsIGFuZCBuZXd0ZXh0Zm9udCAhPSBzZWxmLnRleHRmb250OgorICAgICAgICAgICAgc2VsZi50ZXh0Zm9udCA9IG5ld3RleHRmb250CisgICAgICAgICAgICBzZWxmLmxhYmVsWyJmb250Il0gPSBzZWxmLnRleHRmb250CisgICAgICAgIHNlbGYudGV4dC5hZnRlcihGT05UVVBEQVRFSU5URVJWQUwsIHNlbGYuZm9udF90aW1lcl9ldmVudCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2RlQ29udGV4dC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29kZUNvbnRleHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYzUzNTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29kZUNvbnRleHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2RlQ29udGV4dC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29kZUNvbnRleHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWYwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29kZUNvbnRleHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ4NjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CkBAIC0wLDAgKzEsMjY4IEBACitpbXBvcnQgdGltZQoraW1wb3J0IHJlCitpbXBvcnQga2V5d29yZAoraW1wb3J0IF9fYnVpbHRpbl9fCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gaWRsZWxpYi5EZWxlZ2F0b3IgaW1wb3J0IERlbGVnYXRvcgorZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKK0RFQlVHID0gRmFsc2UKKworZGVmIGFueShuYW1lLCBhbHRlcm5hdGVzKToKKyAgICAiUmV0dXJuIGEgbmFtZWQgZ3JvdXAgcGF0dGVybiBtYXRjaGluZyBsaXN0IG9mIGFsdGVybmF0ZXMuIgorICAgIHJldHVybiAiKD9QPCVzPiIgJSBuYW1lICsgInwiLmpvaW4oYWx0ZXJuYXRlcykgKyAiKSIKKworZGVmIG1ha2VfcGF0KCk6CisgICAga3cgPSByIlxiIiArIGFueSgiS0VZV09SRCIsIGtleXdvcmQua3dsaXN0KSArIHIiXGIiCisgICAgYnVpbHRpbmxpc3QgPSBbc3RyKG5hbWUpIGZvciBuYW1lIGluIGRpcihfX2J1aWx0aW5fXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyldCisgICAgIyBzZWxmLmZpbGUgPSBmaWxlKCJmaWxlIikgOgorICAgICMgMXN0ICdmaWxlJyBjb2xvcml6ZWQgbm9ybWFsLCAybmQgYXMgYnVpbHRpbiwgM3JkIGFzIHN0cmluZworICAgIGJ1aWx0aW4gPSByIihbXi4nXCJcXCNdXGJ8XikiICsgYW55KCJCVUlMVElOIiwgYnVpbHRpbmxpc3QpICsgciJcYiIKKyAgICBjb21tZW50ID0gYW55KCJDT01NRU5UIiwgW3IiI1teXG5dKiJdKQorICAgIHN0cmluZ3ByZWZpeCA9IHIiKFxicnx1fHVyfFJ8VXxVUnxVcnx1UnxifEJ8YnJ8QnJ8YlJ8QlIpPyIKKyAgICBzcXN0cmluZyA9IHN0cmluZ3ByZWZpeCArIHIiJ1teJ1xcXG5dKihcXC5bXidcXFxuXSopKic/IgorICAgIGRxc3RyaW5nID0gc3RyaW5ncHJlZml4ICsgciciW14iXFxcbl0qKFxcLlteIlxcXG5dKikqIj8nCisgICAgc3Ezc3RyaW5nID0gc3RyaW5ncHJlZml4ICsgciInJydbXidcXF0qKChcXC58Jyg/IScnKSlbXidcXF0qKSooJycnKT8iCisgICAgZHEzc3RyaW5nID0gc3RyaW5ncHJlZml4ICsgciciIiJbXiJcXF0qKChcXC58Iig/ISIiKSlbXiJcXF0qKSooIiIiKT8nCisgICAgc3RyaW5nID0gYW55KCJTVFJJTkciLCBbc3Ezc3RyaW5nLCBkcTNzdHJpbmcsIHNxc3RyaW5nLCBkcXN0cmluZ10pCisgICAgcmV0dXJuIGt3ICsgInwiICsgYnVpbHRpbiArICJ8IiArIGNvbW1lbnQgKyAifCIgKyBzdHJpbmcgK1wKKyAgICAgICAgICAgInwiICsgYW55KCJTWU5DIiwgW3IiXG4iXSkKKworcHJvZyA9IHJlLmNvbXBpbGUobWFrZV9wYXQoKSwgcmUuUykKK2lkcHJvZyA9IHJlLmNvbXBpbGUociJccysoXHcrKSIsIHJlLlMpCithc3Byb2cgPSByZS5jb21waWxlKHIiLio/XGIoYXMpXGIiKQorCitjbGFzcyBDb2xvckRlbGVnYXRvcihEZWxlZ2F0b3IpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBEZWxlZ2F0b3IuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5wcm9nID0gcHJvZworICAgICAgICBzZWxmLmlkcHJvZyA9IGlkcHJvZworICAgICAgICBzZWxmLmFzcHJvZyA9IGFzcHJvZworICAgICAgICBzZWxmLkxvYWRUYWdEZWZzKCkKKworICAgIGRlZiBzZXRkZWxlZ2F0ZShzZWxmLCBkZWxlZ2F0ZSk6CisgICAgICAgIGlmIHNlbGYuZGVsZWdhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnVuYmluZCgiPDx0b2dnbGUtYXV0by1jb2xvcmluZz4+IikKKyAgICAgICAgRGVsZWdhdG9yLnNldGRlbGVnYXRlKHNlbGYsIGRlbGVnYXRlKQorICAgICAgICBpZiBkZWxlZ2F0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29uZmlnX2NvbG9ycygpCisgICAgICAgICAgICBzZWxmLmJpbmQoIjw8dG9nZ2xlLWF1dG8tY29sb3Jpbmc+PiIsIHNlbGYudG9nZ2xlX2NvbG9yaXplX2V2ZW50KQorICAgICAgICAgICAgc2VsZi5ub3RpZnlfcmFuZ2UoIjEuMCIsICJlbmQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBObyBkZWxlZ2F0ZSAtIHN0b3AgYW55IGNvbG9yaXppbmcKKyAgICAgICAgICAgIHNlbGYuc3RvcF9jb2xvcml6aW5nID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5hbGxvd19jb2xvcml6aW5nID0gRmFsc2UKKworICAgIGRlZiBjb25maWdfY29sb3JzKHNlbGYpOgorICAgICAgICBmb3IgdGFnLCBjbmYgaW4gc2VsZi50YWdkZWZzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBjbmY6CisgICAgICAgICAgICAgICAgc2VsZi50YWdfY29uZmlndXJlKHRhZywgKipjbmYpCisgICAgICAgIHNlbGYudGFnX3JhaXNlKCdzZWwnKQorCisgICAgZGVmIExvYWRUYWdEZWZzKHNlbGYpOgorICAgICAgICB0aGVtZSA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ1RoZW1lJywnbmFtZScpCisgICAgICAgIHNlbGYudGFnZGVmcyA9IHsKKyAgICAgICAgICAgICJDT01NRU5UIjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAiY29tbWVudCIpLAorICAgICAgICAgICAgIktFWVdPUkQiOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJrZXl3b3JkIiksCisgICAgICAgICAgICAiQlVJTFRJTiI6IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgImJ1aWx0aW4iKSwKKyAgICAgICAgICAgICJTVFJJTkciOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJzdHJpbmciKSwKKyAgICAgICAgICAgICJERUZJTklUSU9OIjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAiZGVmaW5pdGlvbiIpLAorICAgICAgICAgICAgIlNZTkMiOiB7J2JhY2tncm91bmQnOk5vbmUsJ2ZvcmVncm91bmQnOk5vbmV9LAorICAgICAgICAgICAgIlRPRE8iOiB7J2JhY2tncm91bmQnOk5vbmUsJ2ZvcmVncm91bmQnOk5vbmV9LAorICAgICAgICAgICAgIkJSRUFLIjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAiYnJlYWsiKSwKKyAgICAgICAgICAgICJFUlJPUiI6IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgImVycm9yIiksCisgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgaXMgdXNlZCBieSBSZXBsYWNlRGlhbG9nOgorICAgICAgICAgICAgImhpdCI6IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgImhpdCIpLAorICAgICAgICAgICAgfQorCisgICAgICAgIGlmIERFQlVHOiBwcmludCAndGFnZGVmcycsc2VsZi50YWdkZWZzCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBjaGFycywgdGFncz1Ob25lKToKKyAgICAgICAgaW5kZXggPSBzZWxmLmluZGV4KGluZGV4KQorICAgICAgICBzZWxmLmRlbGVnYXRlLmluc2VydChpbmRleCwgY2hhcnMsIHRhZ3MpCisgICAgICAgIHNlbGYubm90aWZ5X3JhbmdlKGluZGV4LCBpbmRleCArICIrJWRjIiAlIGxlbihjaGFycykpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICBpbmRleDEgPSBzZWxmLmluZGV4KGluZGV4MSkKKyAgICAgICAgc2VsZi5kZWxlZ2F0ZS5kZWxldGUoaW5kZXgxLCBpbmRleDIpCisgICAgICAgIHNlbGYubm90aWZ5X3JhbmdlKGluZGV4MSkKKworICAgIGFmdGVyX2lkID0gTm9uZQorICAgIGFsbG93X2NvbG9yaXppbmcgPSBUcnVlCisgICAgY29sb3JpemluZyA9IEZhbHNlCisKKyAgICBkZWYgbm90aWZ5X3JhbmdlKHNlbGYsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICBzZWxmLnRhZ19hZGQoIlRPRE8iLCBpbmRleDEsIGluZGV4MikKKyAgICAgICAgaWYgc2VsZi5hZnRlcl9pZDoKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiY29sb3JpemluZyBhbHJlYWR5IHNjaGVkdWxlZCIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmNvbG9yaXppbmc6CisgICAgICAgICAgICBzZWxmLnN0b3BfY29sb3JpemluZyA9IFRydWUKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAic3RvcCBjb2xvcml6aW5nIgorICAgICAgICBpZiBzZWxmLmFsbG93X2NvbG9yaXppbmc6CisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgInNjaGVkdWxlIGNvbG9yaXppbmciCisgICAgICAgICAgICBzZWxmLmFmdGVyX2lkID0gc2VsZi5hZnRlcigxLCBzZWxmLnJlY29sb3JpemUpCisKKyAgICBjbG9zZV93aGVuX2RvbmUgPSBOb25lICMgV2luZG93IHRvIGJlIGNsb3NlZCB3aGVuIGRvbmUgY29sb3JpemluZworCisgICAgZGVmIGNsb3NlKHNlbGYsIGNsb3NlX3doZW5fZG9uZT1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5hZnRlcl9pZDoKKyAgICAgICAgICAgIGFmdGVyX2lkID0gc2VsZi5hZnRlcl9pZAorICAgICAgICAgICAgc2VsZi5hZnRlcl9pZCA9IE5vbmUKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiY2FuY2VsIHNjaGVkdWxlZCByZWNvbG9yaXplciIKKyAgICAgICAgICAgIHNlbGYuYWZ0ZXJfY2FuY2VsKGFmdGVyX2lkKQorICAgICAgICBzZWxmLmFsbG93X2NvbG9yaXppbmcgPSBGYWxzZQorICAgICAgICBzZWxmLnN0b3BfY29sb3JpemluZyA9IFRydWUKKyAgICAgICAgaWYgY2xvc2Vfd2hlbl9kb25lOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY29sb3JpemluZzoKKyAgICAgICAgICAgICAgICBjbG9zZV93aGVuX2RvbmUuZGVzdHJveSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2Vfd2hlbl9kb25lID0gY2xvc2Vfd2hlbl9kb25lCisKKyAgICBkZWYgdG9nZ2xlX2NvbG9yaXplX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5hZnRlcl9pZDoKKyAgICAgICAgICAgIGFmdGVyX2lkID0gc2VsZi5hZnRlcl9pZAorICAgICAgICAgICAgc2VsZi5hZnRlcl9pZCA9IE5vbmUKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiY2FuY2VsIHNjaGVkdWxlZCByZWNvbG9yaXplciIKKyAgICAgICAgICAgIHNlbGYuYWZ0ZXJfY2FuY2VsKGFmdGVyX2lkKQorICAgICAgICBpZiBzZWxmLmFsbG93X2NvbG9yaXppbmcgYW5kIHNlbGYuY29sb3JpemluZzoKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAic3RvcCBjb2xvcml6aW5nIgorICAgICAgICAgICAgc2VsZi5zdG9wX2NvbG9yaXppbmcgPSBUcnVlCisgICAgICAgIHNlbGYuYWxsb3dfY29sb3JpemluZyA9IG5vdCBzZWxmLmFsbG93X2NvbG9yaXppbmcKKyAgICAgICAgaWYgc2VsZi5hbGxvd19jb2xvcml6aW5nIGFuZCBub3Qgc2VsZi5jb2xvcml6aW5nOgorICAgICAgICAgICAgc2VsZi5hZnRlcl9pZCA9IHNlbGYuYWZ0ZXIoMSwgc2VsZi5yZWNvbG9yaXplKQorICAgICAgICBpZiBERUJVRzoKKyAgICAgICAgICAgIHByaW50ICJhdXRvIGNvbG9yaXppbmcgdHVybmVkIixcCisgICAgICAgICAgICAgICAgICBzZWxmLmFsbG93X2NvbG9yaXppbmcgYW5kICJvbiIgb3IgIm9mZiIKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiByZWNvbG9yaXplKHNlbGYpOgorICAgICAgICBzZWxmLmFmdGVyX2lkID0gTm9uZQorICAgICAgICBpZiBub3Qgc2VsZi5kZWxlZ2F0ZToKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAibm8gZGVsZWdhdGUiCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHNlbGYuYWxsb3dfY29sb3JpemluZzoKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiYXV0byBjb2xvcml6aW5nIGlzIG9mZiIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmNvbG9yaXppbmc6CisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgImFscmVhZHkgY29sb3JpemluZyIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnN0b3BfY29sb3JpemluZyA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmNvbG9yaXppbmcgPSBUcnVlCisgICAgICAgICAgICBpZiBERUJVRzogcHJpbnQgImNvbG9yaXppbmcuLi4iCisgICAgICAgICAgICB0MCA9IHRpbWUuY2xvY2soKQorICAgICAgICAgICAgc2VsZi5yZWNvbG9yaXplX21haW4oKQorICAgICAgICAgICAgdDEgPSB0aW1lLmNsb2NrKCkKKyAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiJS4zZiBzZWNvbmRzIiAlICh0MS10MCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY29sb3JpemluZyA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYuYWxsb3dfY29sb3JpemluZyBhbmQgc2VsZi50YWdfbmV4dHJhbmdlKCJUT0RPIiwgIjEuMCIpOgorICAgICAgICAgICAgaWYgREVCVUc6IHByaW50ICJyZXNjaGVkdWxlIGNvbG9yaXppbmciCisgICAgICAgICAgICBzZWxmLmFmdGVyX2lkID0gc2VsZi5hZnRlcigxLCBzZWxmLnJlY29sb3JpemUpCisgICAgICAgIGlmIHNlbGYuY2xvc2Vfd2hlbl9kb25lOgorICAgICAgICAgICAgdG9wID0gc2VsZi5jbG9zZV93aGVuX2RvbmUKKyAgICAgICAgICAgIHNlbGYuY2xvc2Vfd2hlbl9kb25lID0gTm9uZQorICAgICAgICAgICAgdG9wLmRlc3Ryb3koKQorCisgICAgZGVmIHJlY29sb3JpemVfbWFpbihzZWxmKToKKyAgICAgICAgbmV4dCA9ICIxLjAiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBpdGVtID0gc2VsZi50YWdfbmV4dHJhbmdlKCJUT0RPIiwgbmV4dCkKKyAgICAgICAgICAgIGlmIG5vdCBpdGVtOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBoZWFkLCB0YWlsID0gaXRlbQorICAgICAgICAgICAgc2VsZi50YWdfcmVtb3ZlKCJTWU5DIiwgaGVhZCwgdGFpbCkKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnRhZ19wcmV2cmFuZ2UoIlNZTkMiLCBoZWFkKQorICAgICAgICAgICAgaWYgaXRlbToKKyAgICAgICAgICAgICAgICBoZWFkID0gaXRlbVsxXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoZWFkID0gIjEuMCIKKworICAgICAgICAgICAgY2hhcnMgPSAiIgorICAgICAgICAgICAgbmV4dCA9IGhlYWQKKyAgICAgICAgICAgIGxpbmVzX3RvX2dldCA9IDEKKyAgICAgICAgICAgIG9rID0gRmFsc2UKKyAgICAgICAgICAgIHdoaWxlIG5vdCBvazoKKyAgICAgICAgICAgICAgICBtYXJrID0gbmV4dAorICAgICAgICAgICAgICAgIG5leHQgPSBzZWxmLmluZGV4KG1hcmsgKyAiKyVkIGxpbmVzIGxpbmVzdGFydCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lc190b19nZXQpCisgICAgICAgICAgICAgICAgbGluZXNfdG9fZ2V0ID0gbWluKGxpbmVzX3RvX2dldCAqIDIsIDEwMCkKKyAgICAgICAgICAgICAgICBvayA9ICJTWU5DIiBpbiBzZWxmLnRhZ19uYW1lcyhuZXh0ICsgIi0xYyIpCisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZ2V0KG1hcmssIG5leHQpCisgICAgICAgICAgICAgICAgIyNwcmludCBoZWFkLCAiZ2V0IiwgbWFyaywgbmV4dCwgIi0+IiwgcmVwcihsaW5lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBmb3IgdGFnIGluIHNlbGYudGFnZGVmcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFnX3JlbW92ZSh0YWcsIG1hcmssIG5leHQpCisgICAgICAgICAgICAgICAgY2hhcnMgPSBjaGFycyArIGxpbmUKKyAgICAgICAgICAgICAgICBtID0gc2VsZi5wcm9nLnNlYXJjaChjaGFycykKKyAgICAgICAgICAgICAgICB3aGlsZSBtOgorICAgICAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtLmdyb3VwZGljdCgpLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLCBiID0gbS5zcGFuKGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhZ19hZGQoa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCArICIrJWRjIiAlIGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgaW4gKCJkZWYiLCAiY2xhc3MiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTEgPSBzZWxmLmlkcHJvZy5tYXRjaChjaGFycywgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLCBiID0gbTEuc3BhbigxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50YWdfYWRkKCJERUZJTklUSU9OIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkICsgIislZGMiICUgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHZhbHVlID09ICJpbXBvcnQiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGFsbCB0aGUgImFzIiB3b3JkcyBvbiBzYW1lIGxpbmUsIGV4Y2VwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGluIGEgY29tbWVudDsgY2hlYXAgYXBwcm94aW1hdGlvbiB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnV0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAnIycgaW4gY2hhcnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBjaGFycy5pbmRleCgnIycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBsZW4oY2hhcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtMSA9IHNlbGYuYXNwcm9nLm1hdGNoKGNoYXJzLCBiLCBlbmRwb3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbTE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsIGIgPSBtMS5zcGFuKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRhZ19hZGQoIktFWVdPUkQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgKyAiKyVkYyIgJSBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgKyAiKyVkYyIgJSBiKQorICAgICAgICAgICAgICAgICAgICBtID0gc2VsZi5wcm9nLnNlYXJjaChjaGFycywgbS5lbmQoKSkKKyAgICAgICAgICAgICAgICBpZiAiU1lOQyIgaW4gc2VsZi50YWdfbmFtZXMobmV4dCArICItMWMiKToKKyAgICAgICAgICAgICAgICAgICAgaGVhZCA9IG5leHQKKyAgICAgICAgICAgICAgICAgICAgY2hhcnMgPSAiIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9rID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgICAgICMgV2UncmUgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLCBhbmQgdGhlIGNhbGwgdG8KKyAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgbWF5IHRlbGwgdXMgdG8gc3RvcC4gIEl0IG1heSBhbHNvIGNoYW5nZQorICAgICAgICAgICAgICAgICAgICAjIHRoZSBjb3JyZWN0IHZhbHVlIGZvciAibmV4dCIgKHNpbmNlIHRoaXMgaXMgYQorICAgICAgICAgICAgICAgICAgICAjIGxpbmUuY29sIHN0cmluZywgbm90IGEgdHJ1ZSBtYXJrKS4gIFNvIGxlYXZlIGEKKyAgICAgICAgICAgICAgICAgICAgIyBjcnVtYiB0ZWxsaW5nIHRoZSBuZXh0IGludm9jYXRpb24gdG8gcmVzdW1lIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgIyBpbiBjYXNlIHVwZGF0ZSB0ZWxscyB1cyB0byBsZWF2ZS4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YWdfYWRkKCJUT0RPIiwgbmV4dCkKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZSgpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdG9wX2NvbG9yaXppbmc6CisgICAgICAgICAgICAgICAgICAgIGlmIERFQlVHOiBwcmludCAiY29sb3JpemluZyBzdG9wcGVkIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgIGRlZiByZW1vdmVjb2xvcnMoc2VsZik6CisgICAgICAgIGZvciB0YWcgaW4gc2VsZi50YWdkZWZzLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYudGFnX3JlbW92ZSh0YWcsICIxLjAiLCAiZW5kIikKKworZGVmIG1haW4oKToKKyAgICBmcm9tIGlkbGVsaWIuUGVyY29sYXRvciBpbXBvcnQgUGVyY29sYXRvcgorICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC53bV9wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHJvb3QucXVpdCkKKyAgICB0ZXh0ID0gVGV4dChiYWNrZ3JvdW5kPSJ3aGl0ZSIpCisgICAgdGV4dC5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICB0ZXh0LmZvY3VzX3NldCgpCisgICAgcCA9IFBlcmNvbGF0b3IodGV4dCkKKyAgICBkID0gQ29sb3JEZWxlZ2F0b3IoKQorICAgIHAuaW5zZXJ0ZmlsdGVyKGQpCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjlhNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvQ29sb3JEZWxlZ2F0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjlhNjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVidWdnZXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVidWdnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlZWEzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWJ1Z2dlci5weQpAQCAtMCwwICsxLDQ4MSBAQAoraW1wb3J0IG9zCitpbXBvcnQgYmRiCitpbXBvcnQgdHlwZXMKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBpZGxlbGliLldpbmRvd0xpc3QgaW1wb3J0IExpc3RlZFRvcGxldmVsCitmcm9tIGlkbGVsaWIuU2Nyb2xsZWRMaXN0IGltcG9ydCBTY3JvbGxlZExpc3QKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorCisKK2NsYXNzIElkYihiZGIuQmRiKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBndWkpOgorICAgICAgICBzZWxmLmd1aSA9IGd1aQorICAgICAgICBiZGIuQmRiLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgdXNlcl9saW5lKHNlbGYsIGZyYW1lKToKKyAgICAgICAgaWYgc2VsZi5pbl9ycGNfY29kZShmcmFtZSk6CisgICAgICAgICAgICBzZWxmLnNldF9zdGVwKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtZXNzYWdlID0gc2VsZi5fX2ZyYW1lMm1lc3NhZ2UoZnJhbWUpCisgICAgICAgIHNlbGYuZ3VpLmludGVyYWN0aW9uKG1lc3NhZ2UsIGZyYW1lKQorCisgICAgZGVmIHVzZXJfZXhjZXB0aW9uKHNlbGYsIGZyYW1lLCBpbmZvKToKKyAgICAgICAgaWYgc2VsZi5pbl9ycGNfY29kZShmcmFtZSk6CisgICAgICAgICAgICBzZWxmLnNldF9zdGVwKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtZXNzYWdlID0gc2VsZi5fX2ZyYW1lMm1lc3NhZ2UoZnJhbWUpCisgICAgICAgIHNlbGYuZ3VpLmludGVyYWN0aW9uKG1lc3NhZ2UsIGZyYW1lLCBpbmZvKQorCisgICAgZGVmIGluX3JwY19jb2RlKHNlbGYsIGZyYW1lKToKKyAgICAgICAgaWYgZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lLmNvdW50KCdycGMucHknKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmV2X2ZyYW1lID0gZnJhbWUuZl9iYWNrCisgICAgICAgICAgICBpZiBwcmV2X2ZyYW1lLmZfY29kZS5jb19maWxlbmFtZS5jb3VudCgnRGVidWdnZXIucHknKToKKyAgICAgICAgICAgICAgICAjICh0aGF0IHRlc3Qgd2lsbCBjYXRjaCBib3RoIERlYnVnZ2VyLnB5IGFuZCBSZW1vdGVEZWJ1Z2dlci5weSkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmluX3JwY19jb2RlKHByZXZfZnJhbWUpCisKKyAgICBkZWYgX19mcmFtZTJtZXNzYWdlKHNlbGYsIGZyYW1lKToKKyAgICAgICAgY29kZSA9IGZyYW1lLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgbGluZW5vID0gZnJhbWUuZl9saW5lbm8KKyAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgICAgICBtZXNzYWdlID0gIiVzOiVzIiAlIChiYXNlbmFtZSwgbGluZW5vKQorICAgICAgICBpZiBjb2RlLmNvX25hbWUgIT0gIj8iOgorICAgICAgICAgICAgbWVzc2FnZSA9ICIlczogJXMoKSIgJSAobWVzc2FnZSwgY29kZS5jb19uYW1lKQorICAgICAgICByZXR1cm4gbWVzc2FnZQorCisKK2NsYXNzIERlYnVnZ2VyOgorCisgICAgdnN0YWNrID0gdnNvdXJjZSA9IHZsb2NhbHMgPSB2Z2xvYmFscyA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBweXNoZWxsLCBpZGI9Tm9uZSk6CisgICAgICAgIGlmIGlkYiBpcyBOb25lOgorICAgICAgICAgICAgaWRiID0gSWRiKHNlbGYpCisgICAgICAgIHNlbGYucHlzaGVsbCA9IHB5c2hlbGwKKyAgICAgICAgc2VsZi5pZGIgPSBpZGIKKyAgICAgICAgc2VsZi5mcmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5tYWtlX2d1aSgpCisgICAgICAgIHNlbGYuaW50ZXJhY3RpbmcgPSAwCisKKyAgICBkZWYgcnVuKHNlbGYsICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5pbnRlcmFjdGluZyA9IDEKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmlkYi5ydW4oKmFyZ3MpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmludGVyYWN0aW5nID0gMAorCisgICAgZGVmIGNsb3NlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLmludGVyYWN0aW5nOgorICAgICAgICAgICAgc2VsZi50b3AuYmVsbCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5zdGFja3ZpZXdlcjoKKyAgICAgICAgICAgIHNlbGYuc3RhY2t2aWV3ZXIuY2xvc2UoKTsgc2VsZi5zdGFja3ZpZXdlciA9IE5vbmUKKyAgICAgICAgIyBDbGVhbiB1cCBweXNoZWxsIGlmIHVzZXIgY2xpY2tlZCBkZWJ1Z2dlciBjb250cm9sIGNsb3NlIHdpZGdldC4KKyAgICAgICAgIyAoQ2F1c2VzIGEgaGFybWxlc3MgZXh0cmEgY3ljbGUgdGhyb3VnaCBjbG9zZV9kZWJ1Z2dlcigpIGlmIHVzZXIKKyAgICAgICAgIyB0b2dnbGVkIGRlYnVnZ2VyIGZyb20gcHlzaGVsbCBEZWJ1ZyBtZW51KQorICAgICAgICBzZWxmLnB5c2hlbGwuY2xvc2VfZGVidWdnZXIoKQorICAgICAgICAjIE5vdyBjbG9zZSB0aGUgZGVidWdnZXIgY29udHJvbCB3aW5kb3cuLi4uCisgICAgICAgIHNlbGYudG9wLmRlc3Ryb3koKQorCisgICAgZGVmIG1ha2VfZ3VpKHNlbGYpOgorICAgICAgICBweXNoZWxsID0gc2VsZi5weXNoZWxsCisgICAgICAgIHNlbGYuZmxpc3QgPSBweXNoZWxsLmZsaXN0CisgICAgICAgIHNlbGYucm9vdCA9IHJvb3QgPSBweXNoZWxsLnJvb3QKKyAgICAgICAgc2VsZi50b3AgPSB0b3AgPSBMaXN0ZWRUb3BsZXZlbChyb290KQorICAgICAgICBzZWxmLnRvcC53bV90aXRsZSgiRGVidWcgQ29udHJvbCIpCisgICAgICAgIHNlbGYudG9wLndtX2ljb25uYW1lKCJEZWJ1ZyIpCisgICAgICAgIHRvcC53bV9wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCisgICAgICAgIHNlbGYudG9wLmJpbmQoIjxFc2NhcGU+Iiwgc2VsZi5jbG9zZSkKKyAgICAgICAgIworICAgICAgICBzZWxmLmJmcmFtZSA9IGJmcmFtZSA9IEZyYW1lKHRvcCkKKyAgICAgICAgc2VsZi5iZnJhbWUucGFjayhhbmNob3I9InciKQorICAgICAgICBzZWxmLmJ1dHRvbnMgPSBibCA9IFtdCisgICAgICAgICMKKyAgICAgICAgc2VsZi5iY29udCA9IGIgPSBCdXR0b24oYmZyYW1lLCB0ZXh0PSJHbyIsIGNvbW1hbmQ9c2VsZi5jb250KQorICAgICAgICBibC5hcHBlbmQoYikKKyAgICAgICAgc2VsZi5ic3RlcCA9IGIgPSBCdXR0b24oYmZyYW1lLCB0ZXh0PSJTdGVwIiwgY29tbWFuZD1zZWxmLnN0ZXApCisgICAgICAgIGJsLmFwcGVuZChiKQorICAgICAgICBzZWxmLmJuZXh0ID0gYiA9IEJ1dHRvbihiZnJhbWUsIHRleHQ9Ik92ZXIiLCBjb21tYW5kPXNlbGYubmV4dCkKKyAgICAgICAgYmwuYXBwZW5kKGIpCisgICAgICAgIHNlbGYuYnJldCA9IGIgPSBCdXR0b24oYmZyYW1lLCB0ZXh0PSJPdXQiLCBjb21tYW5kPXNlbGYucmV0KQorICAgICAgICBibC5hcHBlbmQoYikKKyAgICAgICAgc2VsZi5icmV0ID0gYiA9IEJ1dHRvbihiZnJhbWUsIHRleHQ9IlF1aXQiLCBjb21tYW5kPXNlbGYucXVpdCkKKyAgICAgICAgYmwuYXBwZW5kKGIpCisgICAgICAgICMKKyAgICAgICAgZm9yIGIgaW4gYmw6CisgICAgICAgICAgICBiLmNvbmZpZ3VyZShzdGF0ZT0iZGlzYWJsZWQiKQorICAgICAgICAgICAgYi5wYWNrKHNpZGU9ImxlZnQiKQorICAgICAgICAjCisgICAgICAgIHNlbGYuY2ZyYW1lID0gY2ZyYW1lID0gRnJhbWUoYmZyYW1lKQorICAgICAgICBzZWxmLmNmcmFtZS5wYWNrKHNpZGU9ImxlZnQiKQorICAgICAgICAjCisgICAgICAgIGlmIG5vdCBzZWxmLnZzdGFjazoKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLnZzdGFjayA9IEJvb2xlYW5WYXIodG9wKQorICAgICAgICAgICAgc2VsZi52c3RhY2suc2V0KDEpCisgICAgICAgIHNlbGYuYnN0YWNrID0gQ2hlY2tidXR0b24oY2ZyYW1lLAorICAgICAgICAgICAgdGV4dD0iU3RhY2siLCBjb21tYW5kPXNlbGYuc2hvd19zdGFjaywgdmFyaWFibGU9c2VsZi52c3RhY2spCisgICAgICAgIHNlbGYuYnN0YWNrLmdyaWQocm93PTAsIGNvbHVtbj0wKQorICAgICAgICBpZiBub3Qgc2VsZi52c291cmNlOgorICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18udnNvdXJjZSA9IEJvb2xlYW5WYXIodG9wKQorICAgICAgICBzZWxmLmJzb3VyY2UgPSBDaGVja2J1dHRvbihjZnJhbWUsCisgICAgICAgICAgICB0ZXh0PSJTb3VyY2UiLCBjb21tYW5kPXNlbGYuc2hvd19zb3VyY2UsIHZhcmlhYmxlPXNlbGYudnNvdXJjZSkKKyAgICAgICAgc2VsZi5ic291cmNlLmdyaWQocm93PTAsIGNvbHVtbj0xKQorICAgICAgICBpZiBub3Qgc2VsZi52bG9jYWxzOgorICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18udmxvY2FscyA9IEJvb2xlYW5WYXIodG9wKQorICAgICAgICAgICAgc2VsZi52bG9jYWxzLnNldCgxKQorICAgICAgICBzZWxmLmJsb2NhbHMgPSBDaGVja2J1dHRvbihjZnJhbWUsCisgICAgICAgICAgICB0ZXh0PSJMb2NhbHMiLCBjb21tYW5kPXNlbGYuc2hvd19sb2NhbHMsIHZhcmlhYmxlPXNlbGYudmxvY2FscykKKyAgICAgICAgc2VsZi5ibG9jYWxzLmdyaWQocm93PTEsIGNvbHVtbj0wKQorICAgICAgICBpZiBub3Qgc2VsZi52Z2xvYmFsczoKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLnZnbG9iYWxzID0gQm9vbGVhblZhcih0b3ApCisgICAgICAgIHNlbGYuYmdsb2JhbHMgPSBDaGVja2J1dHRvbihjZnJhbWUsCisgICAgICAgICAgICB0ZXh0PSJHbG9iYWxzIiwgY29tbWFuZD1zZWxmLnNob3dfZ2xvYmFscywgdmFyaWFibGU9c2VsZi52Z2xvYmFscykKKyAgICAgICAgc2VsZi5iZ2xvYmFscy5ncmlkKHJvdz0xLCBjb2x1bW49MSkKKyAgICAgICAgIworICAgICAgICBzZWxmLnN0YXR1cyA9IExhYmVsKHRvcCwgYW5jaG9yPSJ3IikKKyAgICAgICAgc2VsZi5zdGF0dXMucGFjayhhbmNob3I9InciKQorICAgICAgICBzZWxmLmVycm9yID0gTGFiZWwodG9wLCBhbmNob3I9InciKQorICAgICAgICBzZWxmLmVycm9yLnBhY2soYW5jaG9yPSJ3IiwgZmlsbD0ieCIpCisgICAgICAgIHNlbGYuZXJyb3JiZyA9IHNlbGYuZXJyb3IuY2dldCgiYmFja2dyb3VuZCIpCisgICAgICAgICMKKyAgICAgICAgc2VsZi5mc3RhY2sgPSBGcmFtZSh0b3AsIGhlaWdodD0xKQorICAgICAgICBzZWxmLmZzdGFjay5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICAgICAgc2VsZi5mbG9jYWxzID0gRnJhbWUodG9wKQorICAgICAgICBzZWxmLmZsb2NhbHMucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgICAgIHNlbGYuZmdsb2JhbHMgPSBGcmFtZSh0b3AsIGhlaWdodD0xKQorICAgICAgICBzZWxmLmZnbG9iYWxzLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQorICAgICAgICAjCisgICAgICAgIGlmIHNlbGYudnN0YWNrLmdldCgpOgorICAgICAgICAgICAgc2VsZi5zaG93X3N0YWNrKCkKKyAgICAgICAgaWYgc2VsZi52bG9jYWxzLmdldCgpOgorICAgICAgICAgICAgc2VsZi5zaG93X2xvY2FscygpCisgICAgICAgIGlmIHNlbGYudmdsb2JhbHMuZ2V0KCk6CisgICAgICAgICAgICBzZWxmLnNob3dfZ2xvYmFscygpCisKKyAgICBkZWYgaW50ZXJhY3Rpb24oc2VsZiwgbWVzc2FnZSwgZnJhbWUsIGluZm89Tm9uZSk6CisgICAgICAgIHNlbGYuZnJhbWUgPSBmcmFtZQorICAgICAgICBzZWxmLnN0YXR1cy5jb25maWd1cmUodGV4dD1tZXNzYWdlKQorICAgICAgICAjCisgICAgICAgIGlmIGluZm86CisgICAgICAgICAgICB0eXBlLCB2YWx1ZSwgdGIgPSBpbmZvCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbTEgPSB0eXBlLl9fbmFtZV9fCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgbTEgPSAiJXMiICUgc3RyKHR5cGUpCisgICAgICAgICAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG0xID0gIiVzOiAlcyIgJSAobTEsIHN0cih2YWx1ZSkpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBiZyA9ICJ5ZWxsb3ciCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtMSA9ICIiCisgICAgICAgICAgICB0YiA9IE5vbmUKKyAgICAgICAgICAgIGJnID0gc2VsZi5lcnJvcmJnCisgICAgICAgIHNlbGYuZXJyb3IuY29uZmlndXJlKHRleHQ9bTEsIGJhY2tncm91bmQ9YmcpCisgICAgICAgICMKKyAgICAgICAgc3YgPSBzZWxmLnN0YWNrdmlld2VyCisgICAgICAgIGlmIHN2OgorICAgICAgICAgICAgc3RhY2ssIGkgPSBzZWxmLmlkYi5nZXRfc3RhY2soc2VsZi5mcmFtZSwgdGIpCisgICAgICAgICAgICBzdi5sb2FkX3N0YWNrKHN0YWNrLCBpKQorICAgICAgICAjCisgICAgICAgIHNlbGYuc2hvd192YXJpYWJsZXMoMSkKKyAgICAgICAgIworICAgICAgICBpZiBzZWxmLnZzb3VyY2UuZ2V0KCk6CisgICAgICAgICAgICBzZWxmLnN5bmNfc291cmNlX2xpbmUoKQorICAgICAgICAjCisgICAgICAgIGZvciBiIGluIHNlbGYuYnV0dG9uczoKKyAgICAgICAgICAgIGIuY29uZmlndXJlKHN0YXRlPSJub3JtYWwiKQorICAgICAgICAjCisgICAgICAgIHNlbGYudG9wLndha2V1cCgpCisgICAgICAgIHNlbGYucm9vdC5tYWlubG9vcCgpCisgICAgICAgICMKKyAgICAgICAgZm9yIGIgaW4gc2VsZi5idXR0b25zOgorICAgICAgICAgICAgYi5jb25maWd1cmUoc3RhdGU9ImRpc2FibGVkIikKKyAgICAgICAgc2VsZi5zdGF0dXMuY29uZmlndXJlKHRleHQ9IiIpCisgICAgICAgIHNlbGYuZXJyb3IuY29uZmlndXJlKHRleHQ9IiIsIGJhY2tncm91bmQ9c2VsZi5lcnJvcmJnKQorICAgICAgICBzZWxmLmZyYW1lID0gTm9uZQorCisgICAgZGVmIHN5bmNfc291cmNlX2xpbmUoc2VsZik6CisgICAgICAgIGZyYW1lID0gc2VsZi5mcmFtZQorICAgICAgICBpZiBub3QgZnJhbWU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmlsZW5hbWUsIGxpbmVubyA9IHNlbGYuX19mcmFtZTJmaWxlbGluZShmcmFtZSkKKyAgICAgICAgaWYgZmlsZW5hbWVbOjFdICsgZmlsZW5hbWVbLTE6XSAhPSAiPD4iIGFuZCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgICAgICBzZWxmLmZsaXN0LmdvdG9maWxlbGluZShmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIF9fZnJhbWUyZmlsZWxpbmUoc2VsZiwgZnJhbWUpOgorICAgICAgICBjb2RlID0gZnJhbWUuZl9jb2RlCisgICAgICAgIGZpbGVuYW1lID0gY29kZS5jb19maWxlbmFtZQorICAgICAgICBsaW5lbm8gPSBmcmFtZS5mX2xpbmVubworICAgICAgICByZXR1cm4gZmlsZW5hbWUsIGxpbmVubworCisgICAgZGVmIGNvbnQoc2VsZik6CisgICAgICAgIHNlbGYuaWRiLnNldF9jb250aW51ZSgpCisgICAgICAgIHNlbGYucm9vdC5xdWl0KCkKKworICAgIGRlZiBzdGVwKHNlbGYpOgorICAgICAgICBzZWxmLmlkYi5zZXRfc3RlcCgpCisgICAgICAgIHNlbGYucm9vdC5xdWl0KCkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBzZWxmLmlkYi5zZXRfbmV4dChzZWxmLmZyYW1lKQorICAgICAgICBzZWxmLnJvb3QucXVpdCgpCisKKyAgICBkZWYgcmV0KHNlbGYpOgorICAgICAgICBzZWxmLmlkYi5zZXRfcmV0dXJuKHNlbGYuZnJhbWUpCisgICAgICAgIHNlbGYucm9vdC5xdWl0KCkKKworICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICBzZWxmLmlkYi5zZXRfcXVpdCgpCisgICAgICAgIHNlbGYucm9vdC5xdWl0KCkKKworICAgIHN0YWNrdmlld2VyID0gTm9uZQorCisgICAgZGVmIHNob3dfc3RhY2soc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnN0YWNrdmlld2VyIGFuZCBzZWxmLnZzdGFjay5nZXQoKToKKyAgICAgICAgICAgIHNlbGYuc3RhY2t2aWV3ZXIgPSBzdiA9IFN0YWNrVmlld2VyKHNlbGYuZnN0YWNrLCBzZWxmLmZsaXN0LCBzZWxmKQorICAgICAgICAgICAgaWYgc2VsZi5mcmFtZToKKyAgICAgICAgICAgICAgICBzdGFjaywgaSA9IHNlbGYuaWRiLmdldF9zdGFjayhzZWxmLmZyYW1lLCBOb25lKQorICAgICAgICAgICAgICAgIHN2LmxvYWRfc3RhY2soc3RhY2ssIGkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdiA9IHNlbGYuc3RhY2t2aWV3ZXIKKyAgICAgICAgICAgIGlmIHN2IGFuZCBub3Qgc2VsZi52c3RhY2suZ2V0KCk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGFja3ZpZXdlciA9IE5vbmUKKyAgICAgICAgICAgICAgICBzdi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmZzdGFja1snaGVpZ2h0J10gPSAxCisKKyAgICBkZWYgc2hvd19zb3VyY2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYudnNvdXJjZS5nZXQoKToKKyAgICAgICAgICAgIHNlbGYuc3luY19zb3VyY2VfbGluZSgpCisKKyAgICBkZWYgc2hvd19mcmFtZShzZWxmLCAoZnJhbWUsIGxpbmVubykpOgorICAgICAgICBzZWxmLmZyYW1lID0gZnJhbWUKKyAgICAgICAgc2VsZi5zaG93X3ZhcmlhYmxlcygpCisKKyAgICBsb2NhbHN2aWV3ZXIgPSBOb25lCisgICAgZ2xvYmFsc3ZpZXdlciA9IE5vbmUKKworICAgIGRlZiBzaG93X2xvY2FscyhzZWxmKToKKyAgICAgICAgbHYgPSBzZWxmLmxvY2Fsc3ZpZXdlcgorICAgICAgICBpZiBzZWxmLnZsb2NhbHMuZ2V0KCk6CisgICAgICAgICAgICBpZiBub3QgbHY6CisgICAgICAgICAgICAgICAgc2VsZi5sb2NhbHN2aWV3ZXIgPSBOYW1lc3BhY2VWaWV3ZXIoc2VsZi5mbG9jYWxzLCAiTG9jYWxzIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGx2OgorICAgICAgICAgICAgICAgIHNlbGYubG9jYWxzdmlld2VyID0gTm9uZQorICAgICAgICAgICAgICAgIGx2LmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmZsb2NhbHNbJ2hlaWdodCddID0gMQorICAgICAgICBzZWxmLnNob3dfdmFyaWFibGVzKCkKKworICAgIGRlZiBzaG93X2dsb2JhbHMoc2VsZik6CisgICAgICAgIGd2ID0gc2VsZi5nbG9iYWxzdmlld2VyCisgICAgICAgIGlmIHNlbGYudmdsb2JhbHMuZ2V0KCk6CisgICAgICAgICAgICBpZiBub3QgZ3Y6CisgICAgICAgICAgICAgICAgc2VsZi5nbG9iYWxzdmlld2VyID0gTmFtZXNwYWNlVmlld2VyKHNlbGYuZmdsb2JhbHMsICJHbG9iYWxzIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGd2OgorICAgICAgICAgICAgICAgIHNlbGYuZ2xvYmFsc3ZpZXdlciA9IE5vbmUKKyAgICAgICAgICAgICAgICBndi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5mZ2xvYmFsc1snaGVpZ2h0J10gPSAxCisgICAgICAgIHNlbGYuc2hvd192YXJpYWJsZXMoKQorCisgICAgZGVmIHNob3dfdmFyaWFibGVzKHNlbGYsIGZvcmNlPTApOgorICAgICAgICBsdiA9IHNlbGYubG9jYWxzdmlld2VyCisgICAgICAgIGd2ID0gc2VsZi5nbG9iYWxzdmlld2VyCisgICAgICAgIGZyYW1lID0gc2VsZi5mcmFtZQorICAgICAgICBpZiBub3QgZnJhbWU6CisgICAgICAgICAgICBsZGljdCA9IGdkaWN0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGRpY3QgPSBmcmFtZS5mX2xvY2FscworICAgICAgICAgICAgZ2RpY3QgPSBmcmFtZS5mX2dsb2JhbHMKKyAgICAgICAgICAgIGlmIGx2IGFuZCBndiBhbmQgbGRpY3QgaXMgZ2RpY3Q6CisgICAgICAgICAgICAgICAgbGRpY3QgPSBOb25lCisgICAgICAgIGlmIGx2OgorICAgICAgICAgICAgbHYubG9hZF9kaWN0KGxkaWN0LCBmb3JjZSwgc2VsZi5weXNoZWxsLmludGVycC5ycGNjbHQpCisgICAgICAgIGlmIGd2OgorICAgICAgICAgICAgZ3YubG9hZF9kaWN0KGdkaWN0LCBmb3JjZSwgc2VsZi5weXNoZWxsLmludGVycC5ycGNjbHQpCisKKyAgICBkZWYgc2V0X2JyZWFrcG9pbnRfaGVyZShzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgc2VsZi5pZGIuc2V0X2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pCisKKyAgICBkZWYgY2xlYXJfYnJlYWtwb2ludF9oZXJlKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBzZWxmLmlkYi5jbGVhcl9icmVhayhmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIGNsZWFyX2ZpbGVfYnJlYWtzKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5pZGIuY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQorCisgICAgZGVmIGxvYWRfYnJlYWtwb2ludHMoc2VsZik6CisgICAgICAgICJMb2FkIFB5U2hlbGxFZGl0b3JXaW5kb3cgYnJlYWtwb2ludHMgaW50byBzdWJwcm9jZXNzIGRlYnVnZ2VyIgorICAgICAgICBweXNoZWxsX2VkaXRfd2luZG93cyA9IHNlbGYucHlzaGVsbC5mbGlzdC5pbnZlcnNlZGljdC5rZXlzKCkKKyAgICAgICAgZm9yIGVkaXR3aW4gaW4gcHlzaGVsbF9lZGl0X3dpbmRvd3M6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGVkaXR3aW4uaW8uZmlsZW5hbWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgbGluZW5vIGluIGVkaXR3aW4uYnJlYWtwb2ludHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0X2JyZWFrcG9pbnRfaGVyZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKK2NsYXNzIFN0YWNrVmlld2VyKFNjcm9sbGVkTGlzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBmbGlzdCwgZ3VpKToKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgQXQgbGVhc3Qgb24gd2l0aCB0aGUgc3RvY2sgQXF1YVRrIHZlcnNpb24gb24gT1NYIDEwLjQgeW91J2xsCisgICAgICAgICAgICAjIGdldCBhbiBzaGFraW5nIEdVSSB0aGF0IGV2ZW50dWFsbHkga2lsbHMgSURMRSBpZiB0aGUgd2lkdGgKKyAgICAgICAgICAgICMgYXJndW1lbnQgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgU2Nyb2xsZWRMaXN0Ll9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcm9sbGVkTGlzdC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZHRoPTgwKQorICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKKyAgICAgICAgc2VsZi5ndWkgPSBndWkKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisKKyAgICBkZWYgbG9hZF9zdGFjayhzZWxmLCBzdGFjaywgaW5kZXg9Tm9uZSk6CisgICAgICAgIHNlbGYuc3RhY2sgPSBzdGFjaworICAgICAgICBzZWxmLmNsZWFyKCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHN0YWNrKSk6CisgICAgICAgICAgICBmcmFtZSwgbGluZW5vID0gc3RhY2tbaV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gZnJhbWUuZl9nbG9iYWxzWyJfX25hbWVfXyJdCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9ICI/IgorICAgICAgICAgICAgY29kZSA9IGZyYW1lLmZfY29kZQorICAgICAgICAgICAgZmlsZW5hbWUgPSBjb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICBmdW5jbmFtZSA9IGNvZGUuY29fbmFtZQorICAgICAgICAgICAgaW1wb3J0IGxpbmVjYWNoZQorICAgICAgICAgICAgc291cmNlbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICBpbXBvcnQgc3RyaW5nCisgICAgICAgICAgICBzb3VyY2VsaW5lID0gc3RyaW5nLnN0cmlwKHNvdXJjZWxpbmUpCisgICAgICAgICAgICBpZiBmdW5jbmFtZSBpbiAoIj8iLCAiIiwgTm9uZSk6CisgICAgICAgICAgICAgICAgaXRlbSA9ICIlcywgbGluZSAlZDogJXMiICUgKG1vZG5hbWUsIGxpbmVubywgc291cmNlbGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaXRlbSA9ICIlcy4lcygpLCBsaW5lICVkOiAlcyIgJSAobW9kbmFtZSwgZnVuY25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBzb3VyY2VsaW5lKQorICAgICAgICAgICAgaWYgaSA9PSBpbmRleDoKKyAgICAgICAgICAgICAgICBpdGVtID0gIj4gIiArIGl0ZW0KKyAgICAgICAgICAgIHNlbGYuYXBwZW5kKGl0ZW0pCisgICAgICAgIGlmIGluZGV4IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zZWxlY3QoaW5kZXgpCisKKyAgICBkZWYgcG9wdXBfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAib3ZlcnJpZGUgYmFzZSBtZXRob2QiCisgICAgICAgIGlmIHNlbGYuc3RhY2s6CisgICAgICAgICAgICByZXR1cm4gU2Nyb2xsZWRMaXN0LnBvcHVwX2V2ZW50KHNlbGYsIGV2ZW50KQorCisgICAgZGVmIGZpbGxfbWVudShzZWxmKToKKyAgICAgICAgIm92ZXJyaWRlIGJhc2UgbWV0aG9kIgorICAgICAgICBtZW51ID0gc2VsZi5tZW51CisgICAgICAgIG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9IkdvIHRvIHNvdXJjZSBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuZ290b19zb3VyY2VfbGluZSkKKyAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD0iU2hvdyBzdGFjayBmcmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLnNob3dfc3RhY2tfZnJhbWUpCisKKyAgICBkZWYgb25fc2VsZWN0KHNlbGYsIGluZGV4KToKKyAgICAgICAgIm92ZXJyaWRlIGJhc2UgbWV0aG9kIgorICAgICAgICBpZiAwIDw9IGluZGV4IDwgbGVuKHNlbGYuc3RhY2spOgorICAgICAgICAgICAgc2VsZi5ndWkuc2hvd19mcmFtZShzZWxmLnN0YWNrW2luZGV4XSkKKworICAgIGRlZiBvbl9kb3VibGUoc2VsZiwgaW5kZXgpOgorICAgICAgICAib3ZlcnJpZGUgYmFzZSBtZXRob2QiCisgICAgICAgIHNlbGYuc2hvd19zb3VyY2UoaW5kZXgpCisKKyAgICBkZWYgZ290b19zb3VyY2VfbGluZShzZWxmKToKKyAgICAgICAgaW5kZXggPSBzZWxmLmxpc3Rib3guaW5kZXgoImFjdGl2ZSIpCisgICAgICAgIHNlbGYuc2hvd19zb3VyY2UoaW5kZXgpCisKKyAgICBkZWYgc2hvd19zdGFja19mcmFtZShzZWxmKToKKyAgICAgICAgaW5kZXggPSBzZWxmLmxpc3Rib3guaW5kZXgoImFjdGl2ZSIpCisgICAgICAgIGlmIDAgPD0gaW5kZXggPCBsZW4oc2VsZi5zdGFjayk6CisgICAgICAgICAgICBzZWxmLmd1aS5zaG93X2ZyYW1lKHNlbGYuc3RhY2tbaW5kZXhdKQorCisgICAgZGVmIHNob3dfc291cmNlKHNlbGYsIGluZGV4KToKKyAgICAgICAgaWYgbm90ICgwIDw9IGluZGV4IDwgbGVuKHNlbGYuc3RhY2spKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmcmFtZSwgbGluZW5vID0gc2VsZi5zdGFja1tpbmRleF0KKyAgICAgICAgY29kZSA9IGZyYW1lLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpOgorICAgICAgICAgICAgZWRpdCA9IHNlbGYuZmxpc3Qub3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGVkaXQ6CisgICAgICAgICAgICAgICAgZWRpdC5nb3RvbGluZShsaW5lbm8pCisKKworY2xhc3MgTmFtZXNwYWNlVmlld2VyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgdGl0bGUsIGRpY3Q9Tm9uZSk6CisgICAgICAgIHdpZHRoID0gMAorICAgICAgICBoZWlnaHQgPSA0MAorICAgICAgICBpZiBkaWN0OgorICAgICAgICAgICAgaGVpZ2h0ID0gMjAqbGVuKGRpY3QpICMgWFhYIDIwID09IG9ic2VydmVkIGhlaWdodCBvZiBFbnRyeSB3aWRnZXQKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisgICAgICAgIGltcG9ydCByZXByCisgICAgICAgIHNlbGYucmVwciA9IHJlcHIuUmVwcigpCisgICAgICAgIHNlbGYucmVwci5tYXhzdHJpbmcgPSA2MAorICAgICAgICBzZWxmLnJlcHIubWF4b3RoZXIgPSA2MAorICAgICAgICBzZWxmLmZyYW1lID0gZnJhbWUgPSBGcmFtZShtYXN0ZXIpCisgICAgICAgIHNlbGYuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgICAgIHNlbGYubGFiZWwgPSBMYWJlbChmcmFtZSwgdGV4dD10aXRsZSwgYm9yZGVyd2lkdGg9MiwgcmVsaWVmPSJncm9vdmUiKQorICAgICAgICBzZWxmLmxhYmVsLnBhY2soZmlsbD0ieCIpCisgICAgICAgIHNlbGYudmJhciA9IHZiYXIgPSBTY3JvbGxiYXIoZnJhbWUsIG5hbWU9InZiYXIiKQorICAgICAgICB2YmFyLnBhY2soc2lkZT0icmlnaHQiLCBmaWxsPSJ5IikKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjYW52YXMgPSBDYW52YXMoZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodD1taW4oMzAwLCBtYXgoNDAsIGhlaWdodCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxyZWdpb249KDAsIDAsIHdpZHRoLCBoZWlnaHQpKQorICAgICAgICBjYW52YXMucGFjayhzaWRlPSJsZWZ0IiwgZmlsbD0iYm90aCIsIGV4cGFuZD0xKQorICAgICAgICB2YmFyWyJjb21tYW5kIl0gPSBjYW52YXMueXZpZXcKKyAgICAgICAgY2FudmFzWyJ5c2Nyb2xsY29tbWFuZCJdID0gdmJhci5zZXQKKyAgICAgICAgc2VsZi5zdWJmcmFtZSA9IHN1YmZyYW1lID0gRnJhbWUoY2FudmFzKQorICAgICAgICBzZWxmLnNmaWQgPSBjYW52YXMuY3JlYXRlX3dpbmRvdygwLCAwLCB3aW5kb3c9c3ViZnJhbWUsIGFuY2hvcj0ibnciKQorICAgICAgICBzZWxmLmxvYWRfZGljdChkaWN0KQorCisgICAgZGljdCA9IC0xCisKKyAgICBkZWYgbG9hZF9kaWN0KHNlbGYsIGRpY3QsIGZvcmNlPTAsIHJwY19jbGllbnQ9Tm9uZSk6CisgICAgICAgIGlmIGRpY3QgaXMgc2VsZi5kaWN0IGFuZCBub3QgZm9yY2U6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc3ViZnJhbWUgPSBzZWxmLnN1YmZyYW1lCisgICAgICAgIGZyYW1lID0gc2VsZi5mcmFtZQorICAgICAgICBmb3IgYyBpbiBzdWJmcmFtZS5jaGlsZHJlbi52YWx1ZXMoKToKKyAgICAgICAgICAgIGMuZGVzdHJveSgpCisgICAgICAgIHNlbGYuZGljdCA9IE5vbmUKKyAgICAgICAgaWYgbm90IGRpY3Q6CisgICAgICAgICAgICBsID0gTGFiZWwoc3ViZnJhbWUsIHRleHQ9Ik5vbmUiKQorICAgICAgICAgICAgbC5ncmlkKHJvdz0wLCBjb2x1bW49MCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWVzID0gZGljdC5rZXlzKCkKKyAgICAgICAgICAgIG5hbWVzLnNvcnQoKQorICAgICAgICAgICAgcm93ID0gMAorICAgICAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBkaWN0W25hbWVdCisgICAgICAgICAgICAgICAgc3ZhbHVlID0gc2VsZi5yZXByLnJlcHIodmFsdWUpICMgcmVwcih2YWx1ZSkKKyAgICAgICAgICAgICAgICAjIFN0cmlwIGV4dHJhIHF1b3RlcyBjYXVzZWQgYnkgY2FsbGluZyByZXByIG9uIHRoZSAoYWxyZWFkeSkKKyAgICAgICAgICAgICAgICAjIHJlcHInZCB2YWx1ZSBzZW50IGFjcm9zcyB0aGUgUlBDIGludGVyZmFjZToKKyAgICAgICAgICAgICAgICBpZiBycGNfY2xpZW50OgorICAgICAgICAgICAgICAgICAgICBzdmFsdWUgPSBzdmFsdWVbMTotMV0KKyAgICAgICAgICAgICAgICBsID0gTGFiZWwoc3ViZnJhbWUsIHRleHQ9bmFtZSkKKyAgICAgICAgICAgICAgICBsLmdyaWQocm93PXJvdywgY29sdW1uPTAsIHN0aWNreT0ibnciKQorICAgICAgICAgICAgICAgIGwgPSBFbnRyeShzdWJmcmFtZSwgd2lkdGg9MCwgYm9yZGVyd2lkdGg9MCkKKyAgICAgICAgICAgICAgICBsLmluc2VydCgwLCBzdmFsdWUpCisgICAgICAgICAgICAgICAgbC5ncmlkKHJvdz1yb3csIGNvbHVtbj0xLCBzdGlja3k9Im53IikKKyAgICAgICAgICAgICAgICByb3cgPSByb3crMQorICAgICAgICBzZWxmLmRpY3QgPSBkaWN0CisgICAgICAgICMgWFhYIENvdWxkIHdlIHVzZSBhIDxDb25maWd1cmU+IGNhbGxiYWNrIGZvciB0aGUgZm9sbG93aW5nPworICAgICAgICBzdWJmcmFtZS51cGRhdGVfaWRsZXRhc2tzKCkgIyBBbGFzIQorICAgICAgICB3aWR0aCA9IHN1YmZyYW1lLndpbmZvX3JlcXdpZHRoKCkKKyAgICAgICAgaGVpZ2h0ID0gc3ViZnJhbWUud2luZm9fcmVxaGVpZ2h0KCkKKyAgICAgICAgY2FudmFzID0gc2VsZi5jYW52YXMKKyAgICAgICAgc2VsZi5jYW52YXNbInNjcm9sbHJlZ2lvbiJdID0gKDAsIDAsIHdpZHRoLCBoZWlnaHQpCisgICAgICAgIGlmIGhlaWdodCA+IDMwMDoKKyAgICAgICAgICAgIGNhbnZhc1siaGVpZ2h0Il0gPSAzMDAKKyAgICAgICAgICAgIGZyYW1lLnBhY2soZXhwYW5kPTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjYW52YXNbImhlaWdodCJdID0gaGVpZ2h0CisgICAgICAgICAgICBmcmFtZS5wYWNrKGV4cGFuZD0wKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmZyYW1lLmRlc3Ryb3koKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlYnVnZ2VyLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWJ1Z2dlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhNzFmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWJ1Z2dlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlYnVnZ2VyLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWJ1Z2dlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhNzFmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWJ1Z2dlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlbGVnYXRvci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWxlZ2F0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEyNTU5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9EZWxlZ2F0b3IucHkKQEAgLTAsMCArMSwzMyBAQAorY2xhc3MgRGVsZWdhdG9yOgorCisgICAgIyBUaGUgY2FjaGUgaXMgb25seSB1c2VkIHRvIGJlIGFibGUgdG8gY2hhbmdlIGRlbGVnYXRlcyEKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWxlZ2F0ZT1Ob25lKToKKyAgICAgICAgc2VsZi5kZWxlZ2F0ZSA9IGRlbGVnYXRlCisgICAgICAgIHNlbGYuX19jYWNoZSA9IHt9CisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIGF0dHIgPSBnZXRhdHRyKHNlbGYuZGVsZWdhdGUsIG5hbWUpICMgTWF5IHJhaXNlIEF0dHJpYnV0ZUVycm9yCisgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgYXR0cikKKyAgICAgICAgc2VsZi5fX2NhY2hlW25hbWVdID0gYXR0cgorICAgICAgICByZXR1cm4gYXR0cgorCisgICAgZGVmIHJlc2V0Y2FjaGUoc2VsZik6CisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fX2NhY2hlLmtleXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWxhdHRyKHNlbGYsIGtleSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuX19jYWNoZS5jbGVhcigpCisKKyAgICBkZWYgY2FjaGVyZXBvcnQoc2VsZik6CisgICAgICAgIGtleXMgPSBzZWxmLl9fY2FjaGUua2V5cygpCisgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIHByaW50IGtleXMKKworICAgIGRlZiBzZXRkZWxlZ2F0ZShzZWxmLCBkZWxlZ2F0ZSk6CisgICAgICAgIHNlbGYucmVzZXRjYWNoZSgpCisgICAgICAgIHNlbGYuZGVsZWdhdGUgPSBkZWxlZ2F0ZQorCisgICAgZGVmIGdldGRlbGVnYXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kZWxlZ2F0ZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlbGVnYXRvci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVsZWdhdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI4ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlbGVnYXRvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlbGVnYXRvci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRGVsZWdhdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDI4ZjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0RlbGVnYXRvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0VkaXRvcldpbmRvdy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YzZmFkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKQEAgLTAsMCArMSwxNjkzIEBACitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IGltcAorZnJvbSBUa2ludGVyIGltcG9ydCAqCitpbXBvcnQgdGtTaW1wbGVEaWFsb2cKK2ltcG9ydCB0a01lc3NhZ2VCb3gKK2ltcG9ydCB3ZWJicm93c2VyCisKK2Zyb20gaWRsZWxpYi5NdWx0aUNhbGwgaW1wb3J0IE11bHRpQ2FsbENyZWF0b3IKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaWRsZXZlcgorZnJvbSBpZGxlbGliIGltcG9ydCBXaW5kb3dMaXN0Citmcm9tIGlkbGVsaWIgaW1wb3J0IFNlYXJjaERpYWxvZworZnJvbSBpZGxlbGliIGltcG9ydCBHcmVwRGlhbG9nCitmcm9tIGlkbGVsaWIgaW1wb3J0IFJlcGxhY2VEaWFsb2cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgUHlQYXJzZQorZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IGFib3V0RGlhbG9nLCB0ZXh0VmlldywgY29uZmlnRGlhbG9nCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKworIyBUaGUgZGVmYXVsdCB0YWIgc2V0dGluZyBmb3IgYSBUZXh0IHdpZGdldCwgaW4gYXZlcmFnZS13aWR0aCBjaGFyYWN0ZXJzLgorVEtfVEFCV0lEVEhfREVGQVVMVCA9IDgKKworZGVmIF9zcGhpbnhfdmVyc2lvbigpOgorICAgICJGb3JtYXQgc3lzLnZlcnNpb25faW5mbyB0byBwcm9kdWNlIHRoZSBTcGhpbnggdmVyc2lvbiBzdHJpbmcgdXNlZCB0byBpbnN0YWxsIHRoZSBjaG0gZG9jcyIKKyAgICBtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsID0gc3lzLnZlcnNpb25faW5mbworICAgIHJlbGVhc2UgPSAnJXMlcycgJSAobWFqb3IsIG1pbm9yKQorICAgIGlmIG1pY3JvOgorICAgICAgICByZWxlYXNlICs9ICclcycgJSAobWljcm8sKQorICAgIGlmIGxldmVsID09ICdjYW5kaWRhdGUnOgorICAgICAgICByZWxlYXNlICs9ICdyYyVzJyAlIChzZXJpYWwsKQorICAgIGVsaWYgbGV2ZWwgIT0gJ2ZpbmFsJzoKKyAgICAgICAgcmVsZWFzZSArPSAnJXMlcycgJSAobGV2ZWxbMF0sIHNlcmlhbCkKKyAgICByZXR1cm4gcmVsZWFzZQorCitkZWYgX2ZpbmRfbW9kdWxlKGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgorICAgICIiIlZlcnNpb24gb2YgaW1wLmZpbmRfbW9kdWxlKCkgdGhhdCBoYW5kbGVzIGhpZXJhcmNoaWNhbCBtb2R1bGUgbmFtZXMiIiIKKworICAgIGZpbGUgPSBOb25lCisgICAgZm9yIHRndCBpbiBmdWxsbmFtZS5zcGxpdCgnLicpOgorICAgICAgICBpZiBmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZmlsZS5jbG9zZSgpICAgICAgICAgICAgIyBjbG9zZSBpbnRlcm1lZGlhdGUgZmlsZXMKKyAgICAgICAgKGZpbGUsIGZpbGVuYW1lLCBkZXNjcikgPSBpbXAuZmluZF9tb2R1bGUodGd0LCBwYXRoKQorICAgICAgICBpZiBkZXNjclsyXSA9PSBpbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgYnJlYWsgICAgICAgICAgICAgICAgICAgIyBmaW5kIGJ1dCBub3QgbG9hZCB0aGUgc291cmNlIGZpbGUKKyAgICAgICAgbW9kdWxlID0gaW1wLmxvYWRfbW9kdWxlKHRndCwgZmlsZSwgZmlsZW5hbWUsIGRlc2NyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXRoID0gbW9kdWxlLl9fcGF0aF9fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAnTm8gc291cmNlIGZvciBtb2R1bGUgJyArIG1vZHVsZS5fX25hbWVfXworICAgIGlmIGRlc2NyWzJdICE9IGltcC5QWV9TT1VSQ0U6CisgICAgICAgICMgSWYgYWxsIG9mIHRoZSBhYm92ZSBmYWlscyBhbmQgZGlkbid0IHJhaXNlIGFuIGV4Y2VwdGlvbixmYWxsYmFjaworICAgICAgICAjIHRvIGEgc3RyYWlnaHQgaW1wb3J0IHdoaWNoIGNhbiBmaW5kIF9faW5pdF9fLnB5IGluIGEgcGFja2FnZS4KKyAgICAgICAgbSA9IF9faW1wb3J0X18oZnVsbG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gbS5fX2ZpbGVfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlID0gTm9uZQorICAgICAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGV4dCA9PSAnLnB5Yyc6CisgICAgICAgICAgICAgICAgZXh0ID0gJy5weScKKyAgICAgICAgICAgIGZpbGVuYW1lID0gYmFzZSArIGV4dAorICAgICAgICAgICAgZGVzY3IgPSBmaWxlbmFtZSwgTm9uZSwgaW1wLlBZX1NPVVJDRQorICAgIHJldHVybiBmaWxlLCBmaWxlbmFtZSwgZGVzY3IKKworCitjbGFzcyBIZWxwRGlhbG9nKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZSAgICAgICMgcGFyZW50IG9mIGhlbHAgd2luZG93CisgICAgICAgIHNlbGYuZGxnID0gTm9uZSAgICAgICAgICMgdGhlIGhlbHAgd2luZG93IGl0ZXNlbGYKKworICAgIGRlZiBkaXNwbGF5KHNlbGYsIHBhcmVudCwgbmVhcj1Ob25lKToKKyAgICAgICAgIiIiIERpc3BsYXkgdGhlIGhlbHAgZGlhbG9nLgorCisgICAgICAgICAgICBwYXJlbnQgLSBwYXJlbnQgd2lkZ2V0IGZvciB0aGUgaGVscCB3aW5kb3cKKworICAgICAgICAgICAgbmVhciAtIGEgVG9wbGV2ZWwgd2lkZ2V0IChlLmcuIEVkaXRvcldpbmRvdyBvciBQeVNoZWxsKQorICAgICAgICAgICAgICAgICAgIHRvIHVzZSBhcyBhIHJlZmVyZW5jZSBmb3IgcGxhY2luZyB0aGUgaGVscCB3aW5kb3cKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZGxnIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnNob3dfZGlhbG9nKHBhcmVudCkKKyAgICAgICAgaWYgbmVhcjoKKyAgICAgICAgICAgIHNlbGYubmVhcndpbmRvdyhuZWFyKQorCisgICAgZGVmIHNob3dfZGlhbG9nKHNlbGYsIHBhcmVudCk6CisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgIGZuPW9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksJ2hlbHAudHh0JykKKyAgICAgICAgc2VsZi5kbGcgPSBkbGcgPSB0ZXh0Vmlldy52aWV3X2ZpbGUocGFyZW50LCdIZWxwJyxmbiwgbW9kYWw9RmFsc2UpCisgICAgICAgIGRsZy5iaW5kKCc8RGVzdHJveT4nLCBzZWxmLmRlc3Ryb3ksICcrJykKKworICAgIGRlZiBuZWFyd2luZG93KHNlbGYsIG5lYXIpOgorICAgICAgICAjIFBsYWNlIHRoZSBoZWxwIGRpYWxvZyBuZWFyIHRoZSB3aW5kb3cgc3BlY2lmaWVkIGJ5IHBhcmVudC4KKyAgICAgICAgIyBOb3RlIC0gdGhpcyBtYXkgbm90IHJlcG9zaXRpb24gdGhlIHdpbmRvdyBpbiBNZXRhY2l0eQorICAgICAgICAjICBpZiAiL2FwcHMvbWV0YWNpdHkvZ2VuZXJhbC9kaXNhYmxlX3dvcmthcm91bmRzIiBpcyBlbmFibGVkCisgICAgICAgIGRsZyA9IHNlbGYuZGxnCisgICAgICAgIGdlb20gPSAobmVhci53aW5mb19yb290eCgpICsgMTAsIG5lYXIud2luZm9fcm9vdHkoKSArIDEwKQorICAgICAgICBkbGcud2l0aGRyYXcoKQorICAgICAgICBkbGcuZ2VvbWV0cnkoIj0rJWQrJWQiICUgZ2VvbSkKKyAgICAgICAgZGxnLmRlaWNvbmlmeSgpCisgICAgICAgIGRsZy5saWZ0KCkKKworICAgIGRlZiBkZXN0cm95KHNlbGYsIGV2PU5vbmUpOgorICAgICAgICBzZWxmLmRsZyA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisKK2hlbHBEaWFsb2cgPSBIZWxwRGlhbG9nKCkgICMgc2luZ2xldG9uIGluc3RhbmNlCisKKworY2xhc3MgRWRpdG9yV2luZG93KG9iamVjdCk6CisgICAgZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICBmcm9tIGlkbGVsaWIuQ29sb3JEZWxlZ2F0b3IgaW1wb3J0IENvbG9yRGVsZWdhdG9yCisgICAgZnJvbSBpZGxlbGliLlVuZG9EZWxlZ2F0b3IgaW1wb3J0IFVuZG9EZWxlZ2F0b3IKKyAgICBmcm9tIGlkbGVsaWIuSU9CaW5kaW5nIGltcG9ydCBJT0JpbmRpbmcsIGZpbGVzeXN0ZW1lbmNvZGluZywgZW5jb2RpbmcKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IEJpbmRpbmdzCisgICAgZnJvbSBUa2ludGVyIGltcG9ydCBUb3BsZXZlbAorICAgIGZyb20gaWRsZWxpYi5NdWx0aVN0YXR1c0JhciBpbXBvcnQgTXVsdGlTdGF0dXNCYXIKKworICAgIGhlbHBfdXJsID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIGZpbGVuYW1lPU5vbmUsIGtleT1Ob25lLCByb290PU5vbmUpOgorICAgICAgICBpZiBFZGl0b3JXaW5kb3cuaGVscF91cmwgaXMgTm9uZToKKyAgICAgICAgICAgIGRvY2hvbWUgPSAgb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdEb2MnLCAnaW5kZXguaHRtbCcpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uY291bnQoJ2xpbnV4Jyk6CisgICAgICAgICAgICAgICAgIyBsb29rIGZvciBodG1sIGRvY3MgaW4gYSBjb3VwbGUgb2Ygc3RhbmRhcmQgcGxhY2VzCisgICAgICAgICAgICAgICAgcHl2ZXIgPSAncHl0aG9uLWRvY3MtJyArICclcy4lcy4lcycgJSBzeXMudmVyc2lvbl9pbmZvWzozXQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoJy92YXIvd3d3L2h0bWwvcHl0aG9uLycpOiAgIyAicHl0aG9uMiIgcnBtCisgICAgICAgICAgICAgICAgICAgIGRvY2hvbWUgPSAnL3Zhci93d3cvaHRtbC9weXRob24vaW5kZXguaHRtbCcKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBiYXNlcGF0aCA9ICcvdXNyL3NoYXJlL2RvYy8nICAjIHN0YW5kYXJkIGxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIGRvY2hvbWUgPSBvcy5wYXRoLmpvaW4oYmFzZXBhdGgsIHB5dmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEb2MnLCAnaW5kZXguaHRtbCcpCisgICAgICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICAgICAgY2htZmlsZSA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnRG9jJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQeXRob24lcy5jaG0nICUgX3NwaGlueF92ZXJzaW9uKCkpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY2htZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIGRvY2hvbWUgPSBjaG1maWxlCisgICAgICAgICAgICBlbGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAgICAgIyBkb2N1bWVudGF0aW9uIGlzIHN0b3JlZCBpbnNpZGUgdGhlIHB5dGhvbiBmcmFtZXdvcmsKKyAgICAgICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAnUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbi9pbmRleC5odG1sJykKKyAgICAgICAgICAgIGRvY2hvbWUgPSBvcy5wYXRoLm5vcm1wYXRoKGRvY2hvbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShkb2Nob21lKToKKyAgICAgICAgICAgICAgICBFZGl0b3JXaW5kb3cuaGVscF91cmwgPSBkb2Nob21lCisgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgICAgICAjIFNhZmFyaSByZXF1aXJlcyByZWFsIGZpbGU6LVVSTHMKKyAgICAgICAgICAgICAgICAgICAgRWRpdG9yV2luZG93LmhlbHBfdXJsID0gJ2ZpbGU6Ly8nICsgRWRpdG9yV2luZG93LmhlbHBfdXJsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIEVkaXRvcldpbmRvdy5oZWxwX3VybCA9ICJodHRwOi8vZG9jcy5weXRob24ub3JnLyVkLiVkIiAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCisgICAgICAgIGN1cnJlbnRUaGVtZT1pZGxlQ29uZi5DdXJyZW50VGhlbWUoKQorICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKKyAgICAgICAgcm9vdCA9IHJvb3Qgb3IgZmxpc3Qucm9vdAorICAgICAgICBzZWxmLnJvb3QgPSByb290CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5wczEKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc3lzLnBzMSA9ICc+Pj4gJworICAgICAgICBzZWxmLm1lbnViYXIgPSBNZW51KHJvb3QpCisgICAgICAgIHNlbGYudG9wID0gdG9wID0gV2luZG93TGlzdC5MaXN0ZWRUb3BsZXZlbChyb290LCBtZW51PXNlbGYubWVudWJhcikKKyAgICAgICAgaWYgZmxpc3Q6CisgICAgICAgICAgICBzZWxmLnRraW50ZXJfdmFycyA9IGZsaXN0LnZhcnMKKyAgICAgICAgICAgICNzZWxmLnRvcC5pbnN0YW5jZV9kaWN0IG1ha2VzIGZsaXN0LmludmVyc2VkaWN0IGF2YWlsYWJsZSB0bworICAgICAgICAgICAgI2NvbmZpZ0RpYWxvZy5weSBzbyBpdCBjYW4gYWNjZXNzIGFsbCBFZGl0b3JXaW5kb3cgaW5zdGFuY2VzCisgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0gZmxpc3QuaW52ZXJzZWRpY3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGtpbnRlcl92YXJzID0ge30gICMga2V5czogVGtpbnRlciBldmVudCBuYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB2YWx1ZXM6IFRraW50ZXIgdmFyaWFibGUgaW5zdGFuY2VzCisgICAgICAgICAgICBzZWxmLnRvcC5pbnN0YW5jZV9kaWN0ID0ge30KKyAgICAgICAgc2VsZi5yZWNlbnRfZmlsZXNfcGF0aCA9IG9zLnBhdGguam9pbihpZGxlQ29uZi5HZXRVc2VyQ2ZnRGlyKCksCisgICAgICAgICAgICAgICAgJ3JlY2VudC1maWxlcy5sc3QnKQorICAgICAgICBzZWxmLnRleHRfZnJhbWUgPSB0ZXh0X2ZyYW1lID0gRnJhbWUodG9wKQorICAgICAgICBzZWxmLnZiYXIgPSB2YmFyID0gU2Nyb2xsYmFyKHRleHRfZnJhbWUsIG5hbWU9J3ZiYXInKQorICAgICAgICBzZWxmLndpZHRoID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93Jywnd2lkdGgnLCB0eXBlPSdpbnQnKQorICAgICAgICB0ZXh0X29wdGlvbnMgPSB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAndGV4dCcsCisgICAgICAgICAgICAgICAgJ3BhZHgnOiA1LAorICAgICAgICAgICAgICAgICd3cmFwJzogJ25vbmUnLAorICAgICAgICAgICAgICAgICd3aWR0aCc6IHNlbGYud2lkdGgsCisgICAgICAgICAgICAgICAgJ2hlaWdodCc6IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdFZGl0b3JXaW5kb3cnLCAnaGVpZ2h0JywgdHlwZT0naW50Jyl9CisgICAgICAgIGlmIFRrVmVyc2lvbiA+PSA4LjU6CisgICAgICAgICAgICAjIFN0YXJ0aW5nIHdpdGggdGsgOC41IHdlIGhhdmUgdG8gc2V0IHRoZSBuZXcgdGFic3R5bGUgb3B0aW9uCisgICAgICAgICAgICAjIHRvICd3b3JkcHJvY2Vzc29yJyB0byBhY2hpZXZlIHRoZSBzYW1lIGRpc3BsYXkgb2YgdGFicyBhcyBpbgorICAgICAgICAgICAgIyBvbGRlciB0ayB2ZXJzaW9ucy4KKyAgICAgICAgICAgIHRleHRfb3B0aW9uc1sndGFic3R5bGUnXSA9ICd3b3JkcHJvY2Vzc29yJworICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gTXVsdGlDYWxsQ3JlYXRvcihUZXh0KSh0ZXh0X2ZyYW1lLCAqKnRleHRfb3B0aW9ucykKKyAgICAgICAgc2VsZi50b3AuZm9jdXNlZF93aWRnZXQgPSBzZWxmLnRleHQKKworICAgICAgICBzZWxmLmNyZWF0ZW1lbnViYXIoKQorICAgICAgICBzZWxmLmFwcGx5X2JpbmRpbmdzKCkKKworICAgICAgICBzZWxmLnRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCisgICAgICAgIHNlbGYudG9wLmJpbmQoIjw8Y2xvc2Utd2luZG93Pj4iLCBzZWxmLmNsb3NlX2V2ZW50KQorICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgIyBDb21tYW5kLVcgb24gZWRpdG9yd2luZG93cyBkb2Vzbid0IHdvcmsgd2l0aG91dCB0aGlzLgorICAgICAgICAgICAgdGV4dC5iaW5kKCc8PGNsb3NlLXdpbmRvdz4+Jywgc2VsZi5jbG9zZV9ldmVudCkKKyAgICAgICAgICAgICMgU29tZSBPUyBYIHN5c3RlbXMgaGF2ZSBvbmx5IG9uZSBtb3VzZSBidXR0b24sCisgICAgICAgICAgICAjIHNvIHVzZSBjb250cm9sLWNsaWNrIGZvciBwdWxsZG93biBtZW51cyB0aGVyZS4KKyAgICAgICAgICAgICMgIChOb3RlLCBBcXVhVGsgZGVmaW5lcyA8Mj4gYXMgdGhlIHJpZ2h0IGJ1dHRvbiBpZgorICAgICAgICAgICAgIyAgIHByZXNlbnQgYW5kIHRoZSBUayBUZXh0IHdpZGdldCBhbHJlYWR5IGJpbmRzIDwyPi4pCisgICAgICAgICAgICB0ZXh0LmJpbmQoIjxDb250cm9sLUJ1dHRvbi0xPiIsc2VsZi5yaWdodF9tZW51X2V2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBFbHNld2hlcmUsIHVzZSByaWdodC1jbGljayBmb3IgcHVsbGRvd24gbWVudXMuCisgICAgICAgICAgICB0ZXh0LmJpbmQoIjwzPiIsc2VsZi5yaWdodF9tZW51X2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8Y3V0Pj4iLCBzZWxmLmN1dCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGNvcHk+PiIsIHNlbGYuY29weSkKKyAgICAgICAgdGV4dC5iaW5kKCI8PHBhc3RlPj4iLCBzZWxmLnBhc3RlKQorICAgICAgICB0ZXh0LmJpbmQoIjw8Y2VudGVyLWluc2VydD4+Iiwgc2VsZi5jZW50ZXJfaW5zZXJ0X2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8aGVscD4+Iiwgc2VsZi5oZWxwX2RpYWxvZykKKyAgICAgICAgdGV4dC5iaW5kKCI8PHB5dGhvbi1kb2NzPj4iLCBzZWxmLnB5dGhvbl9kb2NzKQorICAgICAgICB0ZXh0LmJpbmQoIjw8YWJvdXQtaWRsZT4+Iiwgc2VsZi5hYm91dF9kaWFsb2cpCisgICAgICAgIHRleHQuYmluZCgiPDxvcGVuLWNvbmZpZy1kaWFsb2c+PiIsIHNlbGYuY29uZmlnX2RpYWxvZykKKyAgICAgICAgdGV4dC5iaW5kKCI8PG9wZW4tbW9kdWxlPj4iLCBzZWxmLm9wZW5fbW9kdWxlKQorICAgICAgICB0ZXh0LmJpbmQoIjw8ZG8tbm90aGluZz4+IiwgbGFtYmRhIGV2ZW50OiAiYnJlYWsiKQorICAgICAgICB0ZXh0LmJpbmQoIjw8c2VsZWN0LWFsbD4+Iiwgc2VsZi5zZWxlY3RfYWxsKQorICAgICAgICB0ZXh0LmJpbmQoIjw8cmVtb3ZlLXNlbGVjdGlvbj4+Iiwgc2VsZi5yZW1vdmVfc2VsZWN0aW9uKQorICAgICAgICB0ZXh0LmJpbmQoIjw8ZmluZD4+Iiwgc2VsZi5maW5kX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8ZmluZC1hZ2Fpbj4+Iiwgc2VsZi5maW5kX2FnYWluX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8ZmluZC1pbi1maWxlcz4+Iiwgc2VsZi5maW5kX2luX2ZpbGVzX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8ZmluZC1zZWxlY3Rpb24+PiIsIHNlbGYuZmluZF9zZWxlY3Rpb25fZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPDxyZXBsYWNlPj4iLCBzZWxmLnJlcGxhY2VfZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPDxnb3RvLWxpbmU+PiIsIHNlbGYuZ290b19saW5lX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8c21hcnQtYmFja3NwYWNlPj4iLHNlbGYuc21hcnRfYmFja3NwYWNlX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8bmV3bGluZS1hbmQtaW5kZW50Pj4iLHNlbGYubmV3bGluZV9hbmRfaW5kZW50X2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8c21hcnQtaW5kZW50Pj4iLHNlbGYuc21hcnRfaW5kZW50X2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8aW5kZW50LXJlZ2lvbj4+IixzZWxmLmluZGVudF9yZWdpb25fZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPDxkZWRlbnQtcmVnaW9uPj4iLHNlbGYuZGVkZW50X3JlZ2lvbl9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGNvbW1lbnQtcmVnaW9uPj4iLHNlbGYuY29tbWVudF9yZWdpb25fZXZlbnQpCisgICAgICAgIHRleHQuYmluZCgiPDx1bmNvbW1lbnQtcmVnaW9uPj4iLHNlbGYudW5jb21tZW50X3JlZ2lvbl9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PHRhYmlmeS1yZWdpb24+PiIsc2VsZi50YWJpZnlfcmVnaW9uX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8dW50YWJpZnktcmVnaW9uPj4iLHNlbGYudW50YWJpZnlfcmVnaW9uX2V2ZW50KQorICAgICAgICB0ZXh0LmJpbmQoIjw8dG9nZ2xlLXRhYnM+PiIsc2VsZi50b2dnbGVfdGFic19ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGNoYW5nZS1pbmRlbnR3aWR0aD4+IixzZWxmLmNoYW5nZV9pbmRlbnR3aWR0aF9ldmVudCkKKyAgICAgICAgdGV4dC5iaW5kKCI8TGVmdD4iLCBzZWxmLm1vdmVfYXRfZWRnZV9pZl9zZWxlY3Rpb24oMCkpCisgICAgICAgIHRleHQuYmluZCgiPFJpZ2h0PiIsIHNlbGYubW92ZV9hdF9lZGdlX2lmX3NlbGVjdGlvbigxKSkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGRlbC13b3JkLWxlZnQ+PiIsIHNlbGYuZGVsX3dvcmRfbGVmdCkKKyAgICAgICAgdGV4dC5iaW5kKCI8PGRlbC13b3JkLXJpZ2h0Pj4iLCBzZWxmLmRlbF93b3JkX3JpZ2h0KQorICAgICAgICB0ZXh0LmJpbmQoIjw8YmVnaW5uaW5nLW9mLWxpbmU+PiIsIHNlbGYuaG9tZV9jYWxsYmFjaykKKworICAgICAgICBpZiBmbGlzdDoKKyAgICAgICAgICAgIGZsaXN0LmludmVyc2VkaWN0W3NlbGZdID0ga2V5CisgICAgICAgICAgICBpZiBrZXk6CisgICAgICAgICAgICAgICAgZmxpc3QuZGljdFtrZXldID0gc2VsZgorICAgICAgICAgICAgdGV4dC5iaW5kKCI8PG9wZW4tbmV3LXdpbmRvdz4+Iiwgc2VsZi5uZXdfY2FsbGJhY2spCisgICAgICAgICAgICB0ZXh0LmJpbmQoIjw8Y2xvc2UtYWxsLXdpbmRvd3M+PiIsIHNlbGYuZmxpc3QuY2xvc2VfYWxsX2NhbGxiYWNrKQorICAgICAgICAgICAgdGV4dC5iaW5kKCI8PG9wZW4tY2xhc3MtYnJvd3Nlcj4+Iiwgc2VsZi5vcGVuX2NsYXNzX2Jyb3dzZXIpCisgICAgICAgICAgICB0ZXh0LmJpbmQoIjw8b3Blbi1wYXRoLWJyb3dzZXI+PiIsIHNlbGYub3Blbl9wYXRoX2Jyb3dzZXIpCisKKyAgICAgICAgc2VsZi5zZXRfc3RhdHVzX2JhcigpCisgICAgICAgIHZiYXJbJ2NvbW1hbmQnXSA9IHRleHQueXZpZXcKKyAgICAgICAgdmJhci5wYWNrKHNpZGU9UklHSFQsIGZpbGw9WSkKKyAgICAgICAgdGV4dFsneXNjcm9sbGNvbW1hbmQnXSA9IHZiYXIuc2V0CisgICAgICAgIGZvbnRXZWlnaHQgPSAnbm9ybWFsJworICAgICAgICBpZiBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywgJ2ZvbnQtYm9sZCcsIHR5cGU9J2Jvb2wnKToKKyAgICAgICAgICAgIGZvbnRXZWlnaHQ9J2JvbGQnCisgICAgICAgIHRleHQuY29uZmlnKGZvbnQ9KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdFZGl0b3JXaW5kb3cnLCAnZm9udCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCAnRWRpdG9yV2luZG93JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb250LXNpemUnLCB0eXBlPSdpbnQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodCkpCisgICAgICAgIHRleHRfZnJhbWUucGFjayhzaWRlPUxFRlQsIGZpbGw9Qk9USCwgZXhwYW5kPTEpCisgICAgICAgIHRleHQucGFjayhzaWRlPVRPUCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKKyAgICAgICAgdGV4dC5mb2N1c19zZXQoKQorCisgICAgICAgICMgdXNldGFicyB0cnVlICAtPiBsaXRlcmFsIHRhYiBjaGFyYWN0ZXJzIGFyZSB1c2VkIGJ5IGluZGVudCBhbmQKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgIGRlZGVudCBjbWRzLCBwb3NzaWJseSBtaXhlZCB3aXRoIHNwYWNlcyBpZgorICAgICAgICAjICAgICAgICAgICAgICAgICAgaW5kZW50d2lkdGggaXMgbm90IGEgbXVsdGlwbGUgb2YgdGFid2lkdGgsCisgICAgICAgICMgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGNhdXNlIFRhYm5hbm55IHRvIG5hZyEKKyAgICAgICAgIyAgICAgICAgIGZhbHNlIC0+IHRhYiBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgdG8gc3BhY2VzIGJ5IGluZGVudAorICAgICAgICAjICAgICAgICAgICAgICAgICAgYW5kIGRlZGVudCBjbWRzLCBhbmQgZGl0dG8gVEFCIGtleXN0cm9rZXMKKyAgICAgICAgIyBBbHRob3VnaCB1c2Utc3BhY2VzPTAgY2FuIGJlIGNvbmZpZ3VyZWQgbWFudWFsbHkgaW4gY29uZmlnLW1haW4uZGVmLAorICAgICAgICAjIGNvbmZpZ3VyYXRpb24gb2YgdGFicyB2LiBzcGFjZXMgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgY29uZmlndXJhdGlvbgorICAgICAgICAjIGRpYWxvZy4gIElETEUgcHJvbW90ZXMgdGhlIHByZWZlcnJlZCBQeXRob24gaW5kZW50YXRpb246IHVzZSBzcGFjZXMhCisgICAgICAgIHVzZXNwYWNlcyA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdJbmRlbnQnLCAndXNlLXNwYWNlcycsIHR5cGU9J2Jvb2wnKQorICAgICAgICBzZWxmLnVzZXRhYnMgPSBub3QgdXNlc3BhY2VzCisKKyAgICAgICAgIyB0YWJ3aWR0aCBpcyB0aGUgZGlzcGxheSB3aWR0aCBvZiBhIGxpdGVyYWwgdGFiIGNoYXJhY3Rlci4KKyAgICAgICAgIyBDQVVUSU9OOiAgdGVsbGluZyBUayB0byB1c2UgYW55dGhpbmcgb3RoZXIgdGhhbiBpdHMgZGVmYXVsdAorICAgICAgICAjIHRhYiBzZXR0aW5nIGNhdXNlcyBpdCB0byB1c2UgYW4gZW50aXJlbHkgZGlmZmVyZW50IHRhYmJpbmcgYWxnb3JpdGhtLAorICAgICAgICAjIHRyZWF0aW5nIHRhYiBzdG9wcyBhcyBmaXhlZCBkaXN0YW5jZXMgZnJvbSB0aGUgbGVmdCBtYXJnaW4uCisgICAgICAgICMgTm9ib2R5IGV4cGVjdHMgdGhpcywgc28gZm9yIG5vdyB0YWJ3aWR0aCBzaG91bGQgbmV2ZXIgYmUgY2hhbmdlZC4KKyAgICAgICAgc2VsZi50YWJ3aWR0aCA9IDggICAgIyBtdXN0IHJlbWFpbiA4IHVudGlsIFRrIGlzIGZpeGVkLgorCisgICAgICAgICMgaW5kZW50d2lkdGggaXMgdGhlIG51bWJlciBvZiBzY3JlZW4gY2hhcmFjdGVycyBwZXIgaW5kZW50IGxldmVsLgorICAgICAgICAjIFRoZSByZWNvbW1lbmRlZCBQeXRob24gaW5kZW50YXRpb24gaXMgZm91ciBzcGFjZXMuCisgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBzZWxmLnRhYndpZHRoCisgICAgICAgIHNlbGYuc2V0X25vdGFic19pbmRlbnR3aWR0aCgpCisKKyAgICAgICAgIyBJZiBjb250ZXh0X3VzZV9wczEgaXMgdHJ1ZSwgcGFyc2luZyBzZWFyY2hlcyBiYWNrIGZvciBhIHBzMSBsaW5lOworICAgICAgICAjIGVsc2Ugc2VhcmNoZXMgZm9yIGEgcG9wdWxhciAoaWYsIGRlZiwgLi4uKSBQeXRob24gc3RtdC4KKyAgICAgICAgc2VsZi5jb250ZXh0X3VzZV9wczEgPSBGYWxzZQorCisgICAgICAgICMgV2hlbiBzZWFyY2hpbmcgYmFja3dhcmRzIGZvciBhIHJlbGlhYmxlIHBsYWNlIHRvIGJlZ2luIHBhcnNpbmcsCisgICAgICAgICMgZmlyc3Qgc3RhcnQgbnVtX2NvbnRleHRfbGluZXNbMF0gbGluZXMgYmFjaywgdGhlbgorICAgICAgICAjIG51bV9jb250ZXh0X2xpbmVzWzFdIGxpbmVzIGJhY2sgaWYgdGhhdCBkaWRuJ3Qgd29yaywgYW5kIHNvIG9uLgorICAgICAgICAjIFRoZSBsYXN0IHZhbHVlIHNob3VsZCBiZSBodWdlIChsYXJnZXIgdGhhbiB0aGUgIyBvZiBsaW5lcyBpbiBhCisgICAgICAgICMgY29uY2VpdmFibGUgZmlsZSkuCisgICAgICAgICMgTWFraW5nIHRoZSBpbml0aWFsIHZhbHVlcyBsYXJnZXIgc2xvd3MgdGhpbmdzIGRvd24gbW9yZSBvZnRlbi4KKyAgICAgICAgc2VsZi5udW1fY29udGV4dF9saW5lcyA9IDUwLCA1MDAsIDUwMDAwMDAKKworICAgICAgICBzZWxmLnBlciA9IHBlciA9IHNlbGYuUGVyY29sYXRvcih0ZXh0KQorCisgICAgICAgIHNlbGYudW5kbyA9IHVuZG8gPSBzZWxmLlVuZG9EZWxlZ2F0b3IoKQorICAgICAgICBwZXIuaW5zZXJ0ZmlsdGVyKHVuZG8pCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdGFydCA9IHVuZG8udW5kb19ibG9ja19zdGFydAorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RvcCA9IHVuZG8udW5kb19ibG9ja19zdG9wCisgICAgICAgIHVuZG8uc2V0X3NhdmVkX2NoYW5nZV9ob29rKHNlbGYuc2F2ZWRfY2hhbmdlX2hvb2spCisKKyAgICAgICAgIyBJT0JpbmRpbmcgaW1wbGVtZW50cyBmaWxlIEkvTyBhbmQgcHJpbnRpbmcgZnVuY3Rpb25hbGl0eQorICAgICAgICBzZWxmLmlvID0gaW8gPSBzZWxmLklPQmluZGluZyhzZWxmKQorICAgICAgICBpby5zZXRfZmlsZW5hbWVfY2hhbmdlX2hvb2soc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vaykKKworICAgICAgICAjIENyZWF0ZSB0aGUgcmVjZW50IGZpbGVzIHN1Ym1lbnUKKyAgICAgICAgc2VsZi5yZWNlbnRfZmlsZXNfbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyKQorICAgICAgICBzZWxmLm1lbnVkaWN0WydmaWxlJ10uaW5zZXJ0X2Nhc2NhZGUoMywgbGFiZWw9J1JlY2VudCBGaWxlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcmxpbmU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnU9c2VsZi5yZWNlbnRfZmlsZXNfbWVudSkKKyAgICAgICAgc2VsZi51cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3QoKQorCisgICAgICAgIHNlbGYuY29sb3IgPSBOb25lICMgaW5pdGlhbGl6ZWQgYmVsb3cgaW4gc2VsZi5SZXNldENvbG9yaXplcgorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSBhbmQgbm90IG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIGlvLmxvYWRmaWxlKGZpbGVuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpby5zZXRfZmlsZW5hbWUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuUmVzZXRDb2xvcml6ZXIoKQorICAgICAgICBzZWxmLnNhdmVkX2NoYW5nZV9ob29rKCkKKworICAgICAgICBzZWxmLnNldF9pbmRlbnRhdGlvbl9wYXJhbXMoc2VsZi5pc3B5dGhvbnNvdXJjZShmaWxlbmFtZSkpCisKKyAgICAgICAgc2VsZi5sb2FkX2V4dGVuc2lvbnMoKQorCisgICAgICAgIG1lbnUgPSBzZWxmLm1lbnVkaWN0LmdldCgnd2luZG93cycpCisgICAgICAgIGlmIG1lbnU6CisgICAgICAgICAgICBlbmQgPSBtZW51LmluZGV4KCJlbmQiKQorICAgICAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZW5kID0gLTEKKyAgICAgICAgICAgIGlmIGVuZCA+PSAwOgorICAgICAgICAgICAgICAgIG1lbnUuYWRkX3NlcGFyYXRvcigpCisgICAgICAgICAgICAgICAgZW5kID0gZW5kICsgMQorICAgICAgICAgICAgc2VsZi53bWVudV9lbmQgPSBlbmQKKyAgICAgICAgICAgIFdpbmRvd0xpc3QucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCisKKyAgICAgICAgIyBTb21lIGFic3RyYWN0aW9ucyBzbyBJRExFIGV4dGVuc2lvbnMgYXJlIGNyb3NzLUlERQorICAgICAgICBzZWxmLmFza3llc25vID0gdGtNZXNzYWdlQm94LmFza3llc25vCisgICAgICAgIHNlbGYuYXNraW50ZWdlciA9IHRrU2ltcGxlRGlhbG9nLmFza2ludGVnZXIKKyAgICAgICAgc2VsZi5zaG93ZXJyb3IgPSB0a01lc3NhZ2VCb3guc2hvd2Vycm9yCisKKyAgICBkZWYgX2ZpbGVuYW1lX3RvX3VuaWNvZGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJjb252ZXJ0IGZpbGVuYW1lIHRvIHVuaWNvZGUgaW4gb3JkZXIgdG8gZGlzcGxheSBpdCBpbiBUayIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGVuYW1lLCB1bmljb2RlKSBvciBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUuZGVjb2RlKHNlbGYuZmlsZXN5c3RlbWVuY29kaW5nKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFhYWAorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmRlY29kZShzZWxmLmVuY29kaW5nKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgYnl0ZS10by1ieXRlIGNvbnZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lLmRlY29kZSgnaXNvODg1OS0xJykKKworICAgIGRlZiBuZXdfY2FsbGJhY2soc2VsZiwgZXZlbnQpOgorICAgICAgICBkaXJuYW1lLCBiYXNlbmFtZSA9IHNlbGYuaW8uZGVmYXVsdGZpbGVuYW1lKCkKKyAgICAgICAgc2VsZi5mbGlzdC5uZXcoZGlybmFtZSkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBob21lX2NhbGxiYWNrKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgKGV2ZW50LnN0YXRlICYgNCkgIT0gMCBhbmQgZXZlbnQua2V5c3ltID09ICJIb21lIjoKKyAgICAgICAgICAgICMgc3RhdGUmND09Q29udHJvbC4gSWYgPENvbnRyb2wtSG9tZT4sIHVzZSB0aGUgVGsgYmluZGluZy4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLnRleHQuaW5kZXgoImlvbWFyayIpIGFuZCBcCisgICAgICAgICAgIHNlbGYudGV4dC5jb21wYXJlKCJpb21hcmsiLCAiPD0iLCAiaW5zZXJ0IGxpbmVlbmQiKSBhbmQgXAorICAgICAgICAgICBzZWxmLnRleHQuY29tcGFyZSgiaW5zZXJ0IGxpbmVzdGFydCIsICI8PSIsICJpb21hcmsiKToKKyAgICAgICAgICAgICMgSW4gU2hlbGwgb24gaW5wdXQgbGluZSwgZ28gdG8ganVzdCBhZnRlciBwcm9tcHQKKyAgICAgICAgICAgIGluc2VydHB0ID0gaW50KHNlbGYudGV4dC5pbmRleCgiaW9tYXJrIikuc3BsaXQoIi4iKVsxXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCBsaW5lZW5kIikKKyAgICAgICAgICAgIGZvciBpbnNlcnRwdCBpbiB4cmFuZ2UobGVuKGxpbmUpKToKKyAgICAgICAgICAgICAgICBpZiBsaW5lW2luc2VydHB0XSBub3QgaW4gKCcgJywnXHQnKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW5zZXJ0cHQ9bGVuKGxpbmUpCisgICAgICAgIGxpbmVhdCA9IGludChzZWxmLnRleHQuaW5kZXgoImluc2VydCIpLnNwbGl0KCcuJylbMV0pCisgICAgICAgIGlmIGluc2VydHB0ID09IGxpbmVhdDoKKyAgICAgICAgICAgIGluc2VydHB0ID0gMAorICAgICAgICBkZXN0ID0gImluc2VydCBsaW5lc3RhcnQrIitzdHIoaW5zZXJ0cHQpKyJjIgorICAgICAgICBpZiAoZXZlbnQuc3RhdGUmMSkgPT0gMDoKKyAgICAgICAgICAgICMgc2hpZnQgd2FzIG5vdCBwcmVzc2VkCisgICAgICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IHNlbGYudGV4dC5pbmRleCgic2VsLmZpcnN0Iik6CisgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJteV9hbmNob3IiLCAiaW5zZXJ0IikgICMgdGhlcmUgd2FzIG5vIHByZXZpb3VzIHNlbGVjdGlvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZShzZWxmLnRleHQuaW5kZXgoInNlbC5maXJzdCIpLCAiPCIsIHNlbGYudGV4dC5pbmRleCgiaW5zZXJ0IikpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRleHQubWFya19zZXQoIm15X2FuY2hvciIsICJzZWwuZmlyc3QiKSAjIGV4dGVuZCBiYWNrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJteV9hbmNob3IiLCAic2VsLmxhc3QiKSAjIGV4dGVuZCBmb3J3YXJkCisgICAgICAgICAgICBmaXJzdCA9IHNlbGYudGV4dC5pbmRleChkZXN0KQorICAgICAgICAgICAgbGFzdCA9IHNlbGYudGV4dC5pbmRleCgibXlfYW5jaG9yIikKKyAgICAgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKGZpcnN0LCI+IixsYXN0KToKKyAgICAgICAgICAgICAgICBmaXJzdCxsYXN0ID0gbGFzdCxmaXJzdAorICAgICAgICAgICAgc2VsZi50ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCJzZWwiLCBmaXJzdCwgbGFzdCkKKyAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBkZXN0KQorICAgICAgICBzZWxmLnRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHNldF9zdGF0dXNfYmFyKHNlbGYpOgorICAgICAgICBzZWxmLnN0YXR1c19iYXIgPSBzZWxmLk11bHRpU3RhdHVzQmFyKHNlbGYudG9wKQorICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgIyBJbnNlcnQgc29tZSBwYWRkaW5nIHRvIGF2b2lkIG9ic2N1cmluZyBzb21lIG9mIHRoZSBzdGF0dXNiYXIKKyAgICAgICAgICAgICMgYnkgdGhlIHJlc2l6ZSB3aWRnZXQuCisgICAgICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdfcGFkZGluZzEnLCAnICAgICcsIHNpZGU9UklHSFQpCisgICAgICAgIHNlbGYuc3RhdHVzX2Jhci5zZXRfbGFiZWwoJ2NvbHVtbicsICdDb2w6ID8nLCBzaWRlPVJJR0hUKQorICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdsaW5lJywgJ0xuOiA/Jywgc2lkZT1SSUdIVCkKKyAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKyAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjw8c2V0LWxpbmUtYW5kLWNvbHVtbj4+Iiwgc2VsZi5zZXRfbGluZV9hbmRfY29sdW1uKQorICAgICAgICBzZWxmLnRleHQuZXZlbnRfYWRkKCI8PHNldC1saW5lLWFuZC1jb2x1bW4+PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxLZXlSZWxlYXNlPiIsICI8QnV0dG9uUmVsZWFzZT4iKQorICAgICAgICBzZWxmLnRleHQuYWZ0ZXJfaWRsZShzZWxmLnNldF9saW5lX2FuZF9jb2x1bW4pCisKKyAgICBkZWYgc2V0X2xpbmVfYW5kX2NvbHVtbihzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgbGluZSwgY29sdW1uID0gc2VsZi50ZXh0LmluZGV4KElOU0VSVCkuc3BsaXQoJy4nKQorICAgICAgICBzZWxmLnN0YXR1c19iYXIuc2V0X2xhYmVsKCdjb2x1bW4nLCAnQ29sOiAlcycgJSBjb2x1bW4pCisgICAgICAgIHNlbGYuc3RhdHVzX2Jhci5zZXRfbGFiZWwoJ2xpbmUnLCAnTG46ICVzJyAlIGxpbmUpCisKKyAgICBtZW51X3NwZWNzID0gWworICAgICAgICAoImZpbGUiLCAiX0ZpbGUiKSwKKyAgICAgICAgKCJlZGl0IiwgIl9FZGl0IiksCisgICAgICAgICgiZm9ybWF0IiwgIkZfb3JtYXQiKSwKKyAgICAgICAgKCJydW4iLCAiX1J1biIpLAorICAgICAgICAoIm9wdGlvbnMiLCAiX09wdGlvbnMiKSwKKyAgICAgICAgKCJ3aW5kb3dzIiwgIl9XaW5kb3dzIiksCisgICAgICAgICgiaGVscCIsICJfSGVscCIpLAorICAgIF0KKworICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgIGRlbCBtZW51X3NwZWNzWy0zXQorICAgICAgICBtZW51X3NwZWNzWy0yXSA9ICgid2luZG93cyIsICJfV2luZG93IikKKworCisgICAgZGVmIGNyZWF0ZW1lbnViYXIoc2VsZik6CisgICAgICAgIG1iYXIgPSBzZWxmLm1lbnViYXIKKyAgICAgICAgc2VsZi5tZW51ZGljdCA9IG1lbnVkaWN0ID0ge30KKyAgICAgICAgZm9yIG5hbWUsIGxhYmVsIGluIHNlbGYubWVudV9zcGVjczoKKyAgICAgICAgICAgIHVuZGVybGluZSwgbGFiZWwgPSBwcmVwc3RyKGxhYmVsKQorICAgICAgICAgICAgbWVudWRpY3RbbmFtZV0gPSBtZW51ID0gTWVudShtYmFyLCBuYW1lPW5hbWUpCisgICAgICAgICAgICBtYmFyLmFkZF9jYXNjYWRlKGxhYmVsPWxhYmVsLCBtZW51PW1lbnUsIHVuZGVybGluZT11bmRlcmxpbmUpCisKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5pc0NhcmJvbkFxdWFUayhzZWxmLnJvb3QpOgorICAgICAgICAgICAgIyBJbnNlcnQgdGhlIGFwcGxpY2F0aW9uIG1lbnUKKyAgICAgICAgICAgIG1lbnVkaWN0WydhcHBsaWNhdGlvbiddID0gbWVudSA9IE1lbnUobWJhciwgbmFtZT0nYXBwbGUnKQorICAgICAgICAgICAgbWJhci5hZGRfY2FzY2FkZShsYWJlbD0nSURMRScsIG1lbnU9bWVudSkKKworICAgICAgICBzZWxmLmZpbGxfbWVudXMoKQorICAgICAgICBzZWxmLmJhc2VfaGVscG1lbnVfbGVuZ3RoID0gc2VsZi5tZW51ZGljdFsnaGVscCddLmluZGV4KEVORCkKKyAgICAgICAgc2VsZi5yZXNldF9oZWxwX21lbnVfZW50cmllcygpCisKKyAgICBkZWYgcG9zdHdpbmRvd3NtZW51KHNlbGYpOgorICAgICAgICAjIE9ubHkgY2FsbGVkIHdoZW4gV2luZG93cyBtZW51IGV4aXN0cworICAgICAgICBtZW51ID0gc2VsZi5tZW51ZGljdFsnd2luZG93cyddCisgICAgICAgIGVuZCA9IG1lbnUuaW5kZXgoImVuZCIpCisgICAgICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgICAgICAgZW5kID0gLTEKKyAgICAgICAgaWYgZW5kID4gc2VsZi53bWVudV9lbmQ6CisgICAgICAgICAgICBtZW51LmRlbGV0ZShzZWxmLndtZW51X2VuZCsxLCBlbmQpCisgICAgICAgIFdpbmRvd0xpc3QuYWRkX3dpbmRvd3NfdG9fbWVudShtZW51KQorCisgICAgcm1lbnUgPSBOb25lCisKKyAgICBkZWYgcmlnaHRfbWVudV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgIkAlZCwlZCIgJSAoZXZlbnQueCwgZXZlbnQueSkpCisgICAgICAgIGlmIG5vdCBzZWxmLnJtZW51OgorICAgICAgICAgICAgc2VsZi5tYWtlX3JtZW51KCkKKyAgICAgICAgcm1lbnUgPSBzZWxmLnJtZW51CisgICAgICAgIHNlbGYuZXZlbnQgPSBldmVudAorICAgICAgICBpc3dpbiA9IHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbicKKyAgICAgICAgaWYgaXN3aW46CisgICAgICAgICAgICBzZWxmLnRleHQuY29uZmlnKGN1cnNvcj0iYXJyb3ciKQorCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYucm1lbnVfc3BlY3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGFiZWwsIGV2ZW50bmFtZSwgdmVyaWZ5X3N0YXRlID0gaXRlbQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6ICMgc2VlIGlzc3VlMTIwNzU4OQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIHZlcmlmeV9zdGF0ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzdGF0ZSA9IGdldGF0dHIoc2VsZiwgdmVyaWZ5X3N0YXRlKSgpCisgICAgICAgICAgICBybWVudS5lbnRyeWNvbmZpZ3VyZShsYWJlbCwgc3RhdGU9c3RhdGUpCisKKyAgICAgICAgcm1lbnUudGtfcG9wdXAoZXZlbnQueF9yb290LCBldmVudC55X3Jvb3QpCisgICAgICAgIGlmIGlzd2luOgorICAgICAgICAgICAgc2VsZi50ZXh0LmNvbmZpZyhjdXJzb3I9ImliZWFtIikKKworICAgIHJtZW51X3NwZWNzID0gWworICAgICAgICAjICgiTGFiZWwiLCAiPDx2aXJ0dWFsLWV2ZW50Pj4iLCAic3RhdGVmdW5jbmFtZSIpLCAuLi4KKyAgICAgICAgKCJDbG9zZSIsICI8PGNsb3NlLXdpbmRvdz4+IiwgTm9uZSksICMgRXhhbXBsZQorICAgIF0KKworICAgIGRlZiBtYWtlX3JtZW51KHNlbGYpOgorICAgICAgICBybWVudSA9IE1lbnUoc2VsZi50ZXh0LCB0ZWFyb2ZmPTApCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYucm1lbnVfc3BlY3M6CisgICAgICAgICAgICBsYWJlbCwgZXZlbnRuYW1lID0gaXRlbVswXSwgaXRlbVsxXQorICAgICAgICAgICAgaWYgbGFiZWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZGVmIGNvbW1hbmQodGV4dD1zZWxmLnRleHQsIGV2ZW50bmFtZT1ldmVudG5hbWUpOgorICAgICAgICAgICAgICAgICAgICB0ZXh0LmV2ZW50X2dlbmVyYXRlKGV2ZW50bmFtZSkKKyAgICAgICAgICAgICAgICBybWVudS5hZGRfY29tbWFuZChsYWJlbD1sYWJlbCwgY29tbWFuZD1jb21tYW5kKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBybWVudS5hZGRfc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5ybWVudSA9IHJtZW51CisKKyAgICBkZWYgcm1lbnVfY2hlY2tfY3V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ybWVudV9jaGVja19jb3B5KCkKKworICAgIGRlZiBybWVudV9jaGVja19jb3B5KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmR4ID0gc2VsZi50ZXh0LmluZGV4KCdzZWwuZmlyc3QnKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gJ2Rpc2FibGVkJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdub3JtYWwnIGlmIGluZHggZWxzZSAnZGlzYWJsZWQnCisKKyAgICBkZWYgcm1lbnVfY2hlY2tfcGFzdGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGV4dC50ay5jYWxsKCd0azo6R2V0U2VsZWN0aW9uJywgc2VsZi50ZXh0LCAnQ0xJUEJPQVJEJykKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuICdkaXNhYmxlZCcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnbm9ybWFsJworCisgICAgZGVmIGFib3V0X2RpYWxvZyhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgYWJvdXREaWFsb2cuQWJvdXREaWFsb2coc2VsZi50b3AsJ0Fib3V0IElETEUnKQorCisgICAgZGVmIGNvbmZpZ19kaWFsb2coc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGNvbmZpZ0RpYWxvZy5Db25maWdEaWFsb2coc2VsZi50b3AsJ1NldHRpbmdzJykKKworICAgIGRlZiBoZWxwX2RpYWxvZyhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5yb290OgorICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5yb290CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLnRvcAorICAgICAgICBoZWxwRGlhbG9nLmRpc3BsYXkocGFyZW50LCBuZWFyPXNlbGYudG9wKQorCisgICAgZGVmIHB5dGhvbl9kb2NzKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnN0YXJ0ZmlsZShzZWxmLmhlbHBfdXJsKQorICAgICAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvciBhcyB3aHk6CisgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRG9jdW1lbnQgU3RhcnQgRmFpbHVyZScsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9c3RyKHdoeSksIHBhcmVudD1zZWxmLnRleHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3ZWJicm93c2VyLm9wZW4oc2VsZi5oZWxwX3VybCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBjdXQoc2VsZixldmVudCk6CisgICAgICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgiPDxDdXQ+PiIpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgY29weShzZWxmLGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYudGV4dC50YWdfcmFuZ2VzKCJzZWwiKToKKyAgICAgICAgICAgICMgVGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBzbyBkbyBub3RoaW5nIGFuZCBtYXliZSBpbnRlcnJ1cHQuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCI8PENvcHk+PiIpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgcGFzdGUoc2VsZixldmVudCk6CisgICAgICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgiPDxQYXN0ZT4+IikKKyAgICAgICAgc2VsZi50ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBzZWxlY3RfYWxsKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnRleHQudGFnX2FkZCgic2VsIiwgIjEuMCIsICJlbmQtMWMiKQorICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICIxLjAiKQorICAgICAgICBzZWxmLnRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHJlbW92ZV9zZWxlY3Rpb24oc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYudGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgIHNlbGYudGV4dC5zZWUoImluc2VydCIpCisKKyAgICBkZWYgbW92ZV9hdF9lZGdlX2lmX3NlbGVjdGlvbihzZWxmLCBlZGdlX2luZGV4KToKKyAgICAgICAgIiIiQ3Vyc29yIG1vdmUgYmVnaW5zIGF0IHN0YXJ0IG9yIGVuZCBvZiBzZWxlY3Rpb24KKworICAgICAgICBXaGVuIGEgbGVmdC9yaWdodCBjdXJzb3Iga2V5IGlzIHByZXNzZWQgY3JlYXRlIGFuZCByZXR1cm4gdG8gVGtpbnRlciBhCisgICAgICAgIGZ1bmN0aW9uIHdoaWNoIGNhdXNlcyBhIGN1cnNvciBtb3ZlIGZyb20gdGhlIGFzc29jaWF0ZWQgZWRnZSBvZiB0aGUKKyAgICAgICAgc2VsZWN0aW9uLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmX3RleHRfaW5kZXggPSBzZWxmLnRleHQuaW5kZXgKKyAgICAgICAgc2VsZl90ZXh0X21hcmtfc2V0ID0gc2VsZi50ZXh0Lm1hcmtfc2V0CisgICAgICAgIGVkZ2VzX3RhYmxlID0gKCJzZWwuZmlyc3QrMWMiLCAic2VsLmxhc3QtMWMiKQorICAgICAgICBkZWYgbW92ZV9hdF9lZGdlKGV2ZW50KToKKyAgICAgICAgICAgIGlmIChldmVudC5zdGF0ZSAmIDUpID09IDA6ICMgbm8gc2hpZnQoPT0xKSBvciBjb250cm9sKD09NCkgcHJlc3NlZAorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZl90ZXh0X2luZGV4KCJzZWwuZmlyc3QiKQorICAgICAgICAgICAgICAgICAgICBzZWxmX3RleHRfbWFya19zZXQoImluc2VydCIsIGVkZ2VzX3RhYmxlW2VkZ2VfaW5kZXhdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gbW92ZV9hdF9lZGdlCisKKyAgICBkZWYgZGVsX3dvcmRfbGVmdChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgnPE1ldGEtRGVsZXRlPicpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZGVsX3dvcmRfcmlnaHQoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoJzxNZXRhLWQ+JykKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBmaW5kX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgU2VhcmNoRGlhbG9nLmZpbmQoc2VsZi50ZXh0KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGZpbmRfYWdhaW5fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBTZWFyY2hEaWFsb2cuZmluZF9hZ2FpbihzZWxmLnRleHQpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZmluZF9zZWxlY3Rpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBTZWFyY2hEaWFsb2cuZmluZF9zZWxlY3Rpb24oc2VsZi50ZXh0KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGZpbmRfaW5fZmlsZXNfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBHcmVwRGlhbG9nLmdyZXAoc2VsZi50ZXh0LCBzZWxmLmlvLCBzZWxmLmZsaXN0KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHJlcGxhY2VfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBSZXBsYWNlRGlhbG9nLnJlcGxhY2Uoc2VsZi50ZXh0KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGdvdG9fbGluZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgbGluZW5vID0gdGtTaW1wbGVEaWFsb2cuYXNraW50ZWdlcigiR290byIsCisgICAgICAgICAgICAgICAgIkdvIHRvIGxpbmUgbnVtYmVyOiIscGFyZW50PXRleHQpCisgICAgICAgIGlmIGxpbmVubyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgaWYgbGluZW5vIDw9IDA6CisgICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgIiVkLjAiICUgbGluZW5vKQorICAgICAgICB0ZXh0LnNlZSgiaW5zZXJ0IikKKworICAgIGRlZiBvcGVuX21vZHVsZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgIyBYWFggU2hvdWxkbid0IHRoaXMgYmUgaW4gSU9CaW5kaW5nIG9yIGluIEZpbGVMaXN0PworICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lID0gc2VsZi50ZXh0LmdldCgic2VsLmZpcnN0IiwgInNlbC5sYXN0IikKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgbmFtZSA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCisgICAgICAgIG5hbWUgPSB0a1NpbXBsZURpYWxvZy5hc2tzdHJpbmcoIk1vZHVsZSIsCisgICAgICAgICAgICAgICAgICJFbnRlciB0aGUgbmFtZSBvZiBhIFB5dGhvbiBtb2R1bGVcbiIKKyAgICAgICAgICAgICAgICAgInRvIHNlYXJjaCBvbiBzeXMucGF0aCBhbmQgb3BlbjoiLAorICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZi50ZXh0LCBpbml0aWFsdmFsdWU9bmFtZSkKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN0cmlwKCkKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBYWFggT3VnaHQgdG8gaW5zZXJ0IGN1cnJlbnQgZmlsZSdzIGRpcmVjdG9yeSBpbiBmcm9udCBvZiBwYXRoCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIChmLCBmaWxlLCAoc3VmZml4LCBtb2RlLCB0eXBlKSkgPSBfZmluZF9tb2R1bGUobmFtZSkKKyAgICAgICAgZXhjZXB0IChOYW1lRXJyb3IsIEltcG9ydEVycm9yKSwgbXNnOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSW1wb3J0IGVycm9yIiwgc3RyKG1zZyksIHBhcmVudD1zZWxmLnRleHQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgdHlwZSAhPSBpbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiVW5zdXBwb3J0ZWQgdHlwZSIsCisgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHNvdXJjZSBtb2R1bGUiICUgbmFtZSwgcGFyZW50PXNlbGYudGV4dCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBmOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGlmIHNlbGYuZmxpc3Q6CisgICAgICAgICAgICBzZWxmLmZsaXN0Lm9wZW4oZmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW8ubG9hZGZpbGUoZmlsZSkKKworICAgIGRlZiBvcGVuX2NsYXNzX2Jyb3dzZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5pby5maWxlbmFtZQorICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKAorICAgICAgICAgICAgICAgICJObyBmaWxlbmFtZSIsCisgICAgICAgICAgICAgICAgIlRoaXMgYnVmZmVyIGhhcyBubyBhc3NvY2lhdGVkIGZpbGVuYW1lIiwKKyAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICAgICAgc2VsZi50ZXh0LmZvY3VzX3NldCgpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKKyAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dCh0YWlsKQorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IENsYXNzQnJvd3NlcgorICAgICAgICBDbGFzc0Jyb3dzZXIuQ2xhc3NCcm93c2VyKHNlbGYuZmxpc3QsIGJhc2UsIFtoZWFkXSkKKworICAgIGRlZiBvcGVuX3BhdGhfYnJvd3NlcihzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBQYXRoQnJvd3NlcgorICAgICAgICBQYXRoQnJvd3Nlci5QYXRoQnJvd3NlcihzZWxmLmZsaXN0KQorCisgICAgZGVmIGdvdG9saW5lKHNlbGYsIGxpbmVubyk6CisgICAgICAgIGlmIGxpbmVubyBpcyBub3QgTm9uZSBhbmQgbGluZW5vID4gMDoKKyAgICAgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgIiVkLjAiICUgbGluZW5vKQorICAgICAgICAgICAgc2VsZi50ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCJzZWwiLCAiaW5zZXJ0IiwgImluc2VydCArMWwiKQorICAgICAgICAgICAgc2VsZi5jZW50ZXIoKQorCisgICAgZGVmIGlzcHl0aG9uc291cmNlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lIG9yIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgYmFzZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSkKKyAgICAgICAgaWYgb3MucGF0aC5ub3JtY2FzZShleHQpIGluICgiLnB5IiwgIi5weXciKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBsaW5lLnN0YXJ0c3dpdGgoJyMhJykgYW5kIGxpbmUuZmluZCgncHl0aG9uJykgPj0gMAorCisgICAgZGVmIGNsb3NlX2hvb2soc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmxpc3Q6CisgICAgICAgICAgICBzZWxmLmZsaXN0LnVucmVnaXN0ZXJfbWF5YmVfdGVybWluYXRlKHNlbGYpCisgICAgICAgICAgICBzZWxmLmZsaXN0ID0gTm9uZQorCisgICAgZGVmIHNldF9jbG9zZV9ob29rKHNlbGYsIGNsb3NlX2hvb2spOgorICAgICAgICBzZWxmLmNsb3NlX2hvb2sgPSBjbG9zZV9ob29rCisKKyAgICBkZWYgZmlsZW5hbWVfY2hhbmdlX2hvb2soc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmxpc3Q6CisgICAgICAgICAgICBzZWxmLmZsaXN0LmZpbGVuYW1lX2NoYW5nZWRfZWRpdChzZWxmKQorICAgICAgICBzZWxmLnNhdmVkX2NoYW5nZV9ob29rKCkKKyAgICAgICAgc2VsZi50b3AudXBkYXRlX3dpbmRvd2xpc3RfcmVnaXN0cnkoc2VsZikKKyAgICAgICAgc2VsZi5SZXNldENvbG9yaXplcigpCisKKyAgICBkZWYgX2FkZGNvbG9yaXplcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jb2xvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLmlzcHl0aG9uc291cmNlKHNlbGYuaW8uZmlsZW5hbWUpOgorICAgICAgICAgICAgc2VsZi5jb2xvciA9IHNlbGYuQ29sb3JEZWxlZ2F0b3IoKQorICAgICAgICAjIGNhbiBhZGQgbW9yZSBjb2xvcml6ZXJzIGhlcmUuLi4KKyAgICAgICAgaWYgc2VsZi5jb2xvcjoKKyAgICAgICAgICAgIHNlbGYucGVyLnJlbW92ZWZpbHRlcihzZWxmLnVuZG8pCisgICAgICAgICAgICBzZWxmLnBlci5pbnNlcnRmaWx0ZXIoc2VsZi5jb2xvcikKKyAgICAgICAgICAgIHNlbGYucGVyLmluc2VydGZpbHRlcihzZWxmLnVuZG8pCisKKyAgICBkZWYgX3JtY29sb3JpemVyKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5jb2xvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNvbG9yLnJlbW92ZWNvbG9ycygpCisgICAgICAgIHNlbGYucGVyLnJlbW92ZWZpbHRlcihzZWxmLmNvbG9yKQorICAgICAgICBzZWxmLmNvbG9yID0gTm9uZQorCisgICAgZGVmIFJlc2V0Q29sb3JpemVyKHNlbGYpOgorICAgICAgICAiVXBkYXRlIHRoZSBjb2xvdXIgdGhlbWUiCisgICAgICAgICMgQ2FsbGVkIGZyb20gc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vayBhbmQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgc2VsZi5fcm1jb2xvcml6ZXIoKQorICAgICAgICBzZWxmLl9hZGRjb2xvcml6ZXIoKQorICAgICAgICB0aGVtZSA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ1RoZW1lJywnbmFtZScpCisgICAgICAgIG5vcm1hbF9jb2xvcnMgPSBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICdub3JtYWwnKQorICAgICAgICBjdXJzb3JfY29sb3IgPSBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICdjdXJzb3InLCBmZ0JnPSdmZycpCisgICAgICAgIHNlbGVjdF9jb2xvcnMgPSBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICdoaWxpdGUnKQorICAgICAgICBzZWxmLnRleHQuY29uZmlnKAorICAgICAgICAgICAgZm9yZWdyb3VuZD1ub3JtYWxfY29sb3JzWydmb3JlZ3JvdW5kJ10sCisgICAgICAgICAgICBiYWNrZ3JvdW5kPW5vcm1hbF9jb2xvcnNbJ2JhY2tncm91bmQnXSwKKyAgICAgICAgICAgIGluc2VydGJhY2tncm91bmQ9Y3Vyc29yX2NvbG9yLAorICAgICAgICAgICAgc2VsZWN0Zm9yZWdyb3VuZD1zZWxlY3RfY29sb3JzWydmb3JlZ3JvdW5kJ10sCisgICAgICAgICAgICBzZWxlY3RiYWNrZ3JvdW5kPXNlbGVjdF9jb2xvcnNbJ2JhY2tncm91bmQnXSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBSZXNldEZvbnQoc2VsZik6CisgICAgICAgICJVcGRhdGUgdGhlIHRleHQgd2lkZ2V0cycgZm9udCBpZiBpdCBpcyBjaGFuZ2VkIgorICAgICAgICAjIENhbGxlZCBmcm9tIGNvbmZpZ0RpYWxvZy5weQorICAgICAgICBmb250V2VpZ2h0PSdub3JtYWwnCisgICAgICAgIGlmIGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2ZvbnQtYm9sZCcsdHlwZT0nYm9vbCcpOgorICAgICAgICAgICAgZm9udFdlaWdodD0nYm9sZCcKKyAgICAgICAgc2VsZi50ZXh0LmNvbmZpZyhmb250PShpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdmb250JyksCisgICAgICAgICAgICAgICAgaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udC1zaXplJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JyksCisgICAgICAgICAgICAgICAgZm9udFdlaWdodCkpCisKKyAgICBkZWYgUmVtb3ZlS2V5YmluZGluZ3Moc2VsZik6CisgICAgICAgICJSZW1vdmUgdGhlIGtleWJpbmRpbmdzIGJlZm9yZSB0aGV5IGFyZSBjaGFuZ2VkLiIKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgIGZvciBldmVudCwga2V5bGlzdCBpbiBrZXlkZWZzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLnRleHQuZXZlbnRfZGVsZXRlKGV2ZW50LCAqa2V5bGlzdCkKKyAgICAgICAgZm9yIGV4dGVuc2lvbk5hbWUgaW4gc2VsZi5nZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKCk6CisgICAgICAgICAgICB4a2V5ZGVmcyA9IGlkbGVDb25mLkdldEV4dGVuc2lvbkJpbmRpbmdzKGV4dGVuc2lvbk5hbWUpCisgICAgICAgICAgICBpZiB4a2V5ZGVmczoKKyAgICAgICAgICAgICAgICBmb3IgZXZlbnQsIGtleWxpc3QgaW4geGtleWRlZnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2RlbGV0ZShldmVudCwgKmtleWxpc3QpCisKKyAgICBkZWYgQXBwbHlLZXliaW5kaW5ncyhzZWxmKToKKyAgICAgICAgIlVwZGF0ZSB0aGUga2V5YmluZGluZ3MgYWZ0ZXIgdGhleSBhcmUgY2hhbmdlZCIKKyAgICAgICAgIyBDYWxsZWQgZnJvbSBjb25maWdEaWFsb2cucHkKKyAgICAgICAgc2VsZi5CaW5kaW5ncy5kZWZhdWx0X2tleWRlZnMgPSBrZXlkZWZzID0gaWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgIHNlbGYuYXBwbHlfYmluZGluZ3MoKQorICAgICAgICBmb3IgZXh0ZW5zaW9uTmFtZSBpbiBzZWxmLmdldF9zdGFuZGFyZF9leHRlbnNpb25fbmFtZXMoKToKKyAgICAgICAgICAgIHhrZXlkZWZzID0gaWRsZUNvbmYuR2V0RXh0ZW5zaW9uQmluZGluZ3MoZXh0ZW5zaW9uTmFtZSkKKyAgICAgICAgICAgIGlmIHhrZXlkZWZzOgorICAgICAgICAgICAgICAgIHNlbGYuYXBwbHlfYmluZGluZ3MoeGtleWRlZnMpCisgICAgICAgICN1cGRhdGUgbWVudSBhY2NlbGVyYXRvcnMKKyAgICAgICAgbWVudUV2ZW50RGljdCA9IHt9CisgICAgICAgIGZvciBtZW51IGluIHNlbGYuQmluZGluZ3MubWVudWRlZnM6CisgICAgICAgICAgICBtZW51RXZlbnREaWN0W21lbnVbMF1dID0ge30KKyAgICAgICAgICAgIGZvciBpdGVtIGluIG1lbnVbMV06CisgICAgICAgICAgICAgICAgaWYgaXRlbToKKyAgICAgICAgICAgICAgICAgICAgbWVudUV2ZW50RGljdFttZW51WzBdXVtwcmVwc3RyKGl0ZW1bMF0pWzFdXSA9IGl0ZW1bMV0KKyAgICAgICAgZm9yIG1lbnViYXJJdGVtIGluIHNlbGYubWVudWRpY3Qua2V5cygpOgorICAgICAgICAgICAgbWVudSA9IHNlbGYubWVudWRpY3RbbWVudWJhckl0ZW1dCisgICAgICAgICAgICBlbmQgPSBtZW51LmluZGV4KEVORCkgKyAxCisgICAgICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMCwgZW5kKToKKyAgICAgICAgICAgICAgICBpZiBtZW51LnR5cGUoaW5kZXgpID09ICdjb21tYW5kJzoKKyAgICAgICAgICAgICAgICAgICAgYWNjZWwgPSBtZW51LmVudHJ5Y2dldChpbmRleCwgJ2FjY2VsZXJhdG9yJykKKyAgICAgICAgICAgICAgICAgICAgaWYgYWNjZWw6CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTmFtZSA9IG1lbnUuZW50cnljZ2V0KGluZGV4LCAnbGFiZWwnKQorICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSAnJworICAgICAgICAgICAgICAgICAgICAgICAgaWYgbWVudWJhckl0ZW0gaW4gbWVudUV2ZW50RGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpdGVtTmFtZSBpbiBtZW51RXZlbnREaWN0W21lbnViYXJJdGVtXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBtZW51RXZlbnREaWN0W21lbnViYXJJdGVtXVtpdGVtTmFtZV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV2ZW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsID0gZ2V0X2FjY2VsZXJhdG9yKGtleWRlZnMsIGV2ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUuZW50cnljb25maWcoaW5kZXgsIGFjY2VsZXJhdG9yPWFjY2VsKQorCisgICAgZGVmIHNldF9ub3RhYnNfaW5kZW50d2lkdGgoc2VsZik6CisgICAgICAgICJVcGRhdGUgdGhlIGluZGVudHdpZHRoIGlmIGNoYW5nZWQgYW5kIG5vdCB1c2luZyB0YWJzIGluIHRoaXMgd2luZG93IgorICAgICAgICAjIENhbGxlZCBmcm9tIGNvbmZpZ0RpYWxvZy5weQorICAgICAgICBpZiBub3Qgc2VsZi51c2V0YWJzOgorICAgICAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdJbmRlbnQnLCdudW0tc3BhY2VzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JykKKworICAgIGRlZiByZXNldF9oZWxwX21lbnVfZW50cmllcyhzZWxmKToKKyAgICAgICAgIlVwZGF0ZSB0aGUgYWRkaXRpb25hbCBoZWxwIGVudHJpZXMgb24gdGhlIEhlbHAgbWVudSIKKyAgICAgICAgaGVscF9saXN0ID0gaWRsZUNvbmYuR2V0QWxsRXh0cmFIZWxwU291cmNlc0xpc3QoKQorICAgICAgICBoZWxwbWVudSA9IHNlbGYubWVudWRpY3RbJ2hlbHAnXQorICAgICAgICAjIGZpcnN0IGRlbGV0ZSB0aGUgZXh0cmEgaGVscCBlbnRyaWVzLCBpZiBhbnkKKyAgICAgICAgaGVscG1lbnVfbGVuZ3RoID0gaGVscG1lbnUuaW5kZXgoRU5EKQorICAgICAgICBpZiBoZWxwbWVudV9sZW5ndGggPiBzZWxmLmJhc2VfaGVscG1lbnVfbGVuZ3RoOgorICAgICAgICAgICAgaGVscG1lbnUuZGVsZXRlKChzZWxmLmJhc2VfaGVscG1lbnVfbGVuZ3RoICsgMSksIGhlbHBtZW51X2xlbmd0aCkKKyAgICAgICAgIyB0aGVuIHJlYnVpbGQgdGhlbQorICAgICAgICBpZiBoZWxwX2xpc3Q6CisgICAgICAgICAgICBoZWxwbWVudS5hZGRfc2VwYXJhdG9yKCkKKyAgICAgICAgICAgIGZvciBlbnRyeSBpbiBoZWxwX2xpc3Q6CisgICAgICAgICAgICAgICAgY21kID0gc2VsZi5fX2V4dHJhX2hlbHBfY2FsbGJhY2soZW50cnlbMV0pCisgICAgICAgICAgICAgICAgaGVscG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9ZW50cnlbMF0sIGNvbW1hbmQ9Y21kKQorICAgICAgICAjIGFuZCB1cGRhdGUgdGhlIG1lbnUgZGljdGlvbmFyeQorICAgICAgICBzZWxmLm1lbnVkaWN0WydoZWxwJ10gPSBoZWxwbWVudQorCisgICAgZGVmIF9fZXh0cmFfaGVscF9jYWxsYmFjayhzZWxmLCBoZWxwZmlsZSk6CisgICAgICAgICJDcmVhdGUgYSBjYWxsYmFjayB3aXRoIHRoZSBoZWxwZmlsZSB2YWx1ZSBmcm96ZW4gYXQgZGVmaW5pdGlvbiB0aW1lIgorICAgICAgICBkZWYgZGlzcGxheV9leHRyYV9oZWxwKGhlbHBmaWxlPWhlbHBmaWxlKToKKyAgICAgICAgICAgIGlmIG5vdCBoZWxwZmlsZS5zdGFydHN3aXRoKCgnd3d3JywgJ2h0dHAnKSk6CisgICAgICAgICAgICAgICAgaGVscGZpbGUgPSBvcy5wYXRoLm5vcm1wYXRoKGhlbHBmaWxlKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnN0YXJ0ZmlsZShoZWxwZmlsZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yIGFzIHdoeToKKyAgICAgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRG9jdW1lbnQgU3RhcnQgRmFpbHVyZScsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPXN0cih3aHkpLCBwYXJlbnQ9c2VsZi50ZXh0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3ZWJicm93c2VyLm9wZW4oaGVscGZpbGUpCisgICAgICAgIHJldHVybiBkaXNwbGF5X2V4dHJhX2hlbHAKKworICAgIGRlZiB1cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3Qoc2VsZiwgbmV3X2ZpbGU9Tm9uZSk6CisgICAgICAgICJMb2FkIGFuZCB1cGRhdGUgdGhlIHJlY2VudCBmaWxlcyBsaXN0IGFuZCBtZW51cyIKKyAgICAgICAgcmZfbGlzdCA9IFtdCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYucmVjZW50X2ZpbGVzX3BhdGgpOgorICAgICAgICAgICAgcmZfbGlzdF9maWxlID0gb3BlbihzZWxmLnJlY2VudF9maWxlc19wYXRoLCdyJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZl9saXN0ID0gcmZfbGlzdF9maWxlLnJlYWRsaW5lcygpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJmX2xpc3RfZmlsZS5jbG9zZSgpCisgICAgICAgIGlmIG5ld19maWxlOgorICAgICAgICAgICAgbmV3X2ZpbGUgPSBvcy5wYXRoLmFic3BhdGgobmV3X2ZpbGUpICsgJ1xuJworICAgICAgICAgICAgaWYgbmV3X2ZpbGUgaW4gcmZfbGlzdDoKKyAgICAgICAgICAgICAgICByZl9saXN0LnJlbW92ZShuZXdfZmlsZSkgICMgbW92ZSB0byB0b3AKKyAgICAgICAgICAgIHJmX2xpc3QuaW5zZXJ0KDAsIG5ld19maWxlKQorICAgICAgICAjIGNsZWFuIGFuZCBzYXZlIHRoZSByZWNlbnQgZmlsZXMgbGlzdAorICAgICAgICBiYWRfcGF0aHMgPSBbXQorICAgICAgICBmb3IgcGF0aCBpbiByZl9saXN0OgorICAgICAgICAgICAgaWYgJ1wwJyBpbiBwYXRoIG9yIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoWzA6LTFdKToKKyAgICAgICAgICAgICAgICBiYWRfcGF0aHMuYXBwZW5kKHBhdGgpCisgICAgICAgIHJmX2xpc3QgPSBbcGF0aCBmb3IgcGF0aCBpbiByZl9saXN0IGlmIHBhdGggbm90IGluIGJhZF9wYXRoc10KKyAgICAgICAgdWxjaGFycyA9ICIxMjM0NTY3ODkwQUJDREVGR0hJSksiCisgICAgICAgIHJmX2xpc3QgPSByZl9saXN0WzA6bGVuKHVsY2hhcnMpXQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5yZWNlbnRfZmlsZXNfcGF0aCwgJ3cnKSBhcyByZl9maWxlOgorICAgICAgICAgICAgICAgIHJmX2ZpbGUud3JpdGVsaW5lcyhyZl9saXN0KQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBub3QgZ2V0YXR0cihzZWxmLnJvb3QsICJyZWNlbnRmaWxlbGlzdF9lcnJvcl9kaXNwbGF5ZWQiLCBGYWxzZSk6CisgICAgICAgICAgICAgICAgc2VsZi5yb290LnJlY2VudGZpbGVsaXN0X2Vycm9yX2Rpc3BsYXllZCA9IFRydWUKKyAgICAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdJRExFIEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVW5hYmxlIHRvIHVwZGF0ZSBSZWNlbnQgRmlsZXMgbGlzdDpcbiVzJworICAgICAgICAgICAgICAgICAgICAgICAgJSBzdHIoZXJyKSwKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCkKKyAgICAgICAgIyBmb3IgZWFjaCBlZGl0IHdpbmRvdyBpbnN0YW5jZSwgY29uc3RydWN0IHRoZSByZWNlbnQgZmlsZXMgbWVudQorICAgICAgICBmb3IgaW5zdGFuY2UgaW4gc2VsZi50b3AuaW5zdGFuY2VfZGljdC5rZXlzKCk6CisgICAgICAgICAgICBtZW51ID0gaW5zdGFuY2UucmVjZW50X2ZpbGVzX21lbnUKKyAgICAgICAgICAgIG1lbnUuZGVsZXRlKDAsIEVORCkgICMgY2xlYXIsIGFuZCByZWJ1aWxkOgorICAgICAgICAgICAgZm9yIGksIGZpbGVfbmFtZSBpbiBlbnVtZXJhdGUocmZfbGlzdCk6CisgICAgICAgICAgICAgICAgZmlsZV9uYW1lID0gZmlsZV9uYW1lLnJzdHJpcCgpICAjIHphcCBcbgorICAgICAgICAgICAgICAgICMgbWFrZSB1bmljb2RlIHN0cmluZyB0byBkaXNwbGF5IG5vbi1BU0NJSSBjaGFycyBjb3JyZWN0bHkKKyAgICAgICAgICAgICAgICB1ZmlsZV9uYW1lID0gc2VsZi5fZmlsZW5hbWVfdG9fdW5pY29kZShmaWxlX25hbWUpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBpbnN0YW5jZS5fX3JlY2VudF9maWxlX2NhbGxiYWNrKGZpbGVfbmFtZSkKKyAgICAgICAgICAgICAgICBtZW51LmFkZF9jb21tYW5kKGxhYmVsPXVsY2hhcnNbaV0gKyAiICIgKyB1ZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1jYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybGluZT0wKQorCisgICAgZGVmIF9fcmVjZW50X2ZpbGVfY2FsbGJhY2soc2VsZiwgZmlsZV9uYW1lKToKKyAgICAgICAgZGVmIG9wZW5fcmVjZW50X2ZpbGUoZm5fY2xvc3VyZT1maWxlX25hbWUpOgorICAgICAgICAgICAgc2VsZi5pby5vcGVuKGVkaXRGaWxlPWZuX2Nsb3N1cmUpCisgICAgICAgIHJldHVybiBvcGVuX3JlY2VudF9maWxlCisKKyAgICBkZWYgc2F2ZWRfY2hhbmdlX2hvb2soc2VsZik6CisgICAgICAgIHNob3J0ID0gc2VsZi5zaG9ydF90aXRsZSgpCisgICAgICAgIGxvbmcgPSBzZWxmLmxvbmdfdGl0bGUoKQorICAgICAgICBpZiBzaG9ydCBhbmQgbG9uZzoKKyAgICAgICAgICAgIHRpdGxlID0gc2hvcnQgKyAiIC0gIiArIGxvbmcKKyAgICAgICAgZWxpZiBzaG9ydDoKKyAgICAgICAgICAgIHRpdGxlID0gc2hvcnQKKyAgICAgICAgZWxpZiBsb25nOgorICAgICAgICAgICAgdGl0bGUgPSBsb25nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aXRsZSA9ICJVbnRpdGxlZCIKKyAgICAgICAgaWNvbiA9IHNob3J0IG9yIGxvbmcgb3IgdGl0bGUKKyAgICAgICAgaWYgbm90IHNlbGYuZ2V0X3NhdmVkKCk6CisgICAgICAgICAgICB0aXRsZSA9ICIqJXMqIiAlIHRpdGxlCisgICAgICAgICAgICBpY29uID0gIiolcyIgJSBpY29uCisgICAgICAgIHNlbGYudG9wLndtX3RpdGxlKHRpdGxlKQorICAgICAgICBzZWxmLnRvcC53bV9pY29ubmFtZShpY29uKQorCisgICAgZGVmIGdldF9zYXZlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudW5kby5nZXRfc2F2ZWQoKQorCisgICAgZGVmIHNldF9zYXZlZChzZWxmLCBmbGFnKToKKyAgICAgICAgc2VsZi51bmRvLnNldF9zYXZlZChmbGFnKQorCisgICAgZGVmIHJlc2V0X3VuZG8oc2VsZik6CisgICAgICAgIHNlbGYudW5kby5yZXNldF91bmRvKCkKKworICAgIGRlZiBzaG9ydF90aXRsZShzZWxmKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmlvLmZpbGVuYW1lCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgICAgICAjIHJldHVybiB1bmljb2RlIHN0cmluZyB0byBkaXNwbGF5IG5vbi1BU0NJSSBjaGFycyBjb3JyZWN0bHkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVuYW1lX3RvX3VuaWNvZGUoZmlsZW5hbWUpCisKKyAgICBkZWYgbG9uZ190aXRsZShzZWxmKToKKyAgICAgICAgIyByZXR1cm4gdW5pY29kZSBzdHJpbmcgdG8gZGlzcGxheSBub24tQVNDSUkgY2hhcnMgY29ycmVjdGx5CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlbmFtZV90b191bmljb2RlKHNlbGYuaW8uZmlsZW5hbWUgb3IgIiIpCisKKyAgICBkZWYgY2VudGVyX2luc2VydF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuY2VudGVyKCkKKworICAgIGRlZiBjZW50ZXIoc2VsZiwgbWFyaz0iaW5zZXJ0Iik6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgdG9wLCBib3QgPSBzZWxmLmdldHdpbmRvd2xpbmVzKCkKKyAgICAgICAgbGluZW5vID0gc2VsZi5nZXRsaW5lbm8obWFyaykKKyAgICAgICAgaGVpZ2h0ID0gYm90IC0gdG9wCisgICAgICAgIG5ld3RvcCA9IG1heCgxLCBsaW5lbm8gLSBoZWlnaHQvLzIpCisgICAgICAgIHRleHQueXZpZXcoZmxvYXQobmV3dG9wKSkKKworICAgIGRlZiBnZXR3aW5kb3dsaW5lcyhzZWxmKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICB0b3AgPSBzZWxmLmdldGxpbmVubygiQDAsMCIpCisgICAgICAgIGJvdCA9IHNlbGYuZ2V0bGluZW5vKCJAMCw2NTUzNSIpCisgICAgICAgIGlmIHRvcCA9PSBib3QgYW5kIHRleHQud2luZm9faGVpZ2h0KCkgPT0gMToKKyAgICAgICAgICAgICMgR2VvbWV0cnkgbWFuYWdlciBoYXNuJ3QgcnVuIHlldAorICAgICAgICAgICAgaGVpZ2h0ID0gaW50KHRleHRbJ2hlaWdodCddKQorICAgICAgICAgICAgYm90ID0gdG9wICsgaGVpZ2h0IC0gMQorICAgICAgICByZXR1cm4gdG9wLCBib3QKKworICAgIGRlZiBnZXRsaW5lbm8oc2VsZiwgbWFyaz0iaW5zZXJ0Iik6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgcmV0dXJuIGludChmbG9hdCh0ZXh0LmluZGV4KG1hcmspKSkKKworICAgIGRlZiBnZXRfZ2VvbWV0cnkoc2VsZik6CisgICAgICAgICJSZXR1cm4gKHdpZHRoLCBoZWlnaHQsIHgsIHkpIgorICAgICAgICBnZW9tID0gc2VsZi50b3Aud21fZ2VvbWV0cnkoKQorICAgICAgICBtID0gcmUubWF0Y2gociIoXGQrKXgoXGQrKVwrKC0/XGQrKVwrKC0/XGQrKSIsIGdlb20pCisgICAgICAgIHR1cGxlID0gKG1hcChpbnQsIG0uZ3JvdXBzKCkpKQorICAgICAgICByZXR1cm4gdHVwbGUKKworICAgIGRlZiBjbG9zZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIG1heWJlc2F2ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pbzoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmdldF9zYXZlZCgpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudG9wLnN0YXRlKCkhPSdub3JtYWwnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRvcC5kZWljb25pZnkoKQorICAgICAgICAgICAgICAgIHNlbGYudG9wLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBzZWxmLnRvcC5saWZ0KCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmlvLm1heWJlc2F2ZSgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHJlcGx5ID0gc2VsZi5tYXliZXNhdmUoKQorICAgICAgICBpZiBzdHIocmVwbHkpICE9ICJjYW5jZWwiOgorICAgICAgICAgICAgc2VsZi5fY2xvc2UoKQorICAgICAgICByZXR1cm4gcmVwbHkKKworICAgIGRlZiBfY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW8uZmlsZW5hbWU6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9yZWNlbnRfZmlsZXNfbGlzdChuZXdfZmlsZT1zZWxmLmlvLmZpbGVuYW1lKQorICAgICAgICBXaW5kb3dMaXN0LnVucmVnaXN0ZXJfY2FsbGJhY2soc2VsZi5wb3N0d2luZG93c21lbnUpCisgICAgICAgIHNlbGYudW5sb2FkX2V4dGVuc2lvbnMoKQorICAgICAgICBzZWxmLmlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5pbyA9IE5vbmUKKyAgICAgICAgc2VsZi51bmRvID0gTm9uZQorICAgICAgICBpZiBzZWxmLmNvbG9yOgorICAgICAgICAgICAgc2VsZi5jb2xvci5jbG9zZShGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuY29sb3IgPSBOb25lCisgICAgICAgIHNlbGYudGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi50a2ludGVyX3ZhcnMgPSBOb25lCisgICAgICAgIHNlbGYucGVyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5wZXIgPSBOb25lCisgICAgICAgIHNlbGYudG9wLmRlc3Ryb3koKQorICAgICAgICBpZiBzZWxmLmNsb3NlX2hvb2s6CisgICAgICAgICAgICAjIHVubGVzcyBvdmVycmlkZTogdW5yZWdpc3RlciBmcm9tIGZsaXN0LCB0ZXJtaW5hdGUgaWYgbGFzdCB3aW5kb3cKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfaG9vaygpCisKKyAgICBkZWYgbG9hZF9leHRlbnNpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSB7fQorICAgICAgICBzZWxmLmxvYWRfc3RhbmRhcmRfZXh0ZW5zaW9ucygpCisKKyAgICBkZWYgdW5sb2FkX2V4dGVuc2lvbnMoc2VsZik6CisgICAgICAgIGZvciBpbnMgaW4gc2VsZi5leHRlbnNpb25zLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgaGFzYXR0cihpbnMsICJjbG9zZSIpOgorICAgICAgICAgICAgICAgIGlucy5jbG9zZSgpCisgICAgICAgIHNlbGYuZXh0ZW5zaW9ucyA9IHt9CisKKyAgICBkZWYgbG9hZF9zdGFuZGFyZF9leHRlbnNpb25zKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmdldF9zdGFuZGFyZF9leHRlbnNpb25fbmFtZXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmxvYWRfZXh0ZW5zaW9uKG5hbWUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcHJpbnQgIkZhaWxlZCB0byBsb2FkIGV4dGVuc2lvbiIsIHJlcHIobmFtZSkKKyAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisKKyAgICBkZWYgZ2V0X3N0YW5kYXJkX2V4dGVuc2lvbl9uYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkbGVDb25mLkdldEV4dGVuc2lvbnMoZWRpdG9yX29ubHk9VHJ1ZSkKKworICAgIGRlZiBsb2FkX2V4dGVuc2lvbihzZWxmLCBuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhuYW1lLCBnbG9iYWxzKCksIGxvY2FscygpLCBbXSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcHJpbnQgIlxuRmFpbGVkIHRvIGltcG9ydCBleHRlbnNpb246ICIsIG5hbWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjbHMgPSBnZXRhdHRyKG1vZCwgbmFtZSkKKyAgICAgICAga2V5ZGVmcyA9IGlkbGVDb25mLkdldEV4dGVuc2lvbkJpbmRpbmdzKG5hbWUpCisgICAgICAgIGlmIGhhc2F0dHIoY2xzLCAibWVudWRlZnMiKToKKyAgICAgICAgICAgIHNlbGYuZmlsbF9tZW51cyhjbHMubWVudWRlZnMsIGtleWRlZnMpCisgICAgICAgIGlucyA9IGNscyhzZWxmKQorICAgICAgICBzZWxmLmV4dGVuc2lvbnNbbmFtZV0gPSBpbnMKKyAgICAgICAgaWYga2V5ZGVmczoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfYmluZGluZ3Moa2V5ZGVmcykKKyAgICAgICAgICAgIGZvciB2ZXZlbnQgaW4ga2V5ZGVmcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgbWV0aG9kbmFtZSA9IHZldmVudC5yZXBsYWNlKCItIiwgIl8iKQorICAgICAgICAgICAgICAgIHdoaWxlIG1ldGhvZG5hbWVbOjFdID09ICc8JzoKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kbmFtZSA9IG1ldGhvZG5hbWVbMTpdCisgICAgICAgICAgICAgICAgd2hpbGUgbWV0aG9kbmFtZVstMTpdID09ICc+JzoKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kbmFtZSA9IG1ldGhvZG5hbWVbOi0xXQorICAgICAgICAgICAgICAgIG1ldGhvZG5hbWUgPSBtZXRob2RuYW1lICsgIl9ldmVudCIKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGlucywgbWV0aG9kbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5iaW5kKHZldmVudCwgZ2V0YXR0cihpbnMsIG1ldGhvZG5hbWUpKQorCisgICAgZGVmIGFwcGx5X2JpbmRpbmdzKHNlbGYsIGtleWRlZnM9Tm9uZSk6CisgICAgICAgIGlmIGtleWRlZnMgaXMgTm9uZToKKyAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLkJpbmRpbmdzLmRlZmF1bHRfa2V5ZGVmcworICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHRleHQua2V5ZGVmcyA9IGtleWRlZnMKKyAgICAgICAgZm9yIGV2ZW50LCBrZXlsaXN0IGluIGtleWRlZnMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleWxpc3Q6CisgICAgICAgICAgICAgICAgdGV4dC5ldmVudF9hZGQoZXZlbnQsICprZXlsaXN0KQorCisgICAgZGVmIGZpbGxfbWVudXMoc2VsZiwgbWVudWRlZnM9Tm9uZSwga2V5ZGVmcz1Ob25lKToKKyAgICAgICAgIiIiQWRkIGFwcHJvcHJpYXRlIGVudHJpZXMgdG8gdGhlIG1lbnVzIGFuZCBzdWJtZW51cworCisgICAgICAgIE1lbnVzIHRoYXQgYXJlIGFic2VudCBvciBOb25lIGluIHNlbGYubWVudWRpY3QgYXJlIGlnbm9yZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBtZW51ZGVmcyBpcyBOb25lOgorICAgICAgICAgICAgbWVudWRlZnMgPSBzZWxmLkJpbmRpbmdzLm1lbnVkZWZzCisgICAgICAgIGlmIGtleWRlZnMgaXMgTm9uZToKKyAgICAgICAgICAgIGtleWRlZnMgPSBzZWxmLkJpbmRpbmdzLmRlZmF1bHRfa2V5ZGVmcworICAgICAgICBtZW51ZGljdCA9IHNlbGYubWVudWRpY3QKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBmb3IgbW5hbWUsIGVudHJ5bGlzdCBpbiBtZW51ZGVmczoKKyAgICAgICAgICAgIG1lbnUgPSBtZW51ZGljdC5nZXQobW5hbWUpCisgICAgICAgICAgICBpZiBub3QgbWVudToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGVudHJ5IGluIGVudHJ5bGlzdDoKKyAgICAgICAgICAgICAgICBpZiBub3QgZW50cnk6CisgICAgICAgICAgICAgICAgICAgIG1lbnUuYWRkX3NlcGFyYXRvcigpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwsIGV2ZW50bmFtZSA9IGVudHJ5CisgICAgICAgICAgICAgICAgICAgIGNoZWNrYnV0dG9uID0gKGxhYmVsWzoxXSA9PSAnIScpCisgICAgICAgICAgICAgICAgICAgIGlmIGNoZWNrYnV0dG9uOgorICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsYWJlbFsxOl0KKyAgICAgICAgICAgICAgICAgICAgdW5kZXJsaW5lLCBsYWJlbCA9IHByZXBzdHIobGFiZWwpCisgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdG9yID0gZ2V0X2FjY2VsZXJhdG9yKGtleWRlZnMsIGV2ZW50bmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZGVmIGNvbW1hbmQodGV4dD10ZXh0LCBldmVudG5hbWU9ZXZlbnRuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuZXZlbnRfZ2VuZXJhdGUoZXZlbnRuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBjaGVja2J1dHRvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciA9IHNlbGYuZ2V0X3Zhcl9vYmooZXZlbnRuYW1lLCBCb29sZWFuVmFyKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVudS5hZGRfY2hlY2tidXR0b24obGFiZWw9bGFiZWwsIHVuZGVybGluZT11bmRlcmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1jb21tYW5kLCBhY2NlbGVyYXRvcj1hY2NlbGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZT12YXIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtZW51LmFkZF9jb21tYW5kKGxhYmVsPWxhYmVsLCB1bmRlcmxpbmU9dW5kZXJsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPWNvbW1hbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VsZXJhdG9yPWFjY2VsZXJhdG9yKQorCisgICAgZGVmIGdldHZhcihzZWxmLCBuYW1lKToKKyAgICAgICAgdmFyID0gc2VsZi5nZXRfdmFyX29iaihuYW1lKQorICAgICAgICBpZiB2YXI6CisgICAgICAgICAgICB2YWx1ZSA9IHZhci5nZXQoKQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOYW1lRXJyb3IsIG5hbWUKKworICAgIGRlZiBzZXR2YXIoc2VsZiwgbmFtZSwgdmFsdWUsIHZhcnR5cGU9Tm9uZSk6CisgICAgICAgIHZhciA9IHNlbGYuZ2V0X3Zhcl9vYmoobmFtZSwgdmFydHlwZSkKKyAgICAgICAgaWYgdmFyOgorICAgICAgICAgICAgdmFyLnNldCh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIE5hbWVFcnJvciwgbmFtZQorCisgICAgZGVmIGdldF92YXJfb2JqKHNlbGYsIG5hbWUsIHZhcnR5cGU9Tm9uZSk6CisgICAgICAgIHZhciA9IHNlbGYudGtpbnRlcl92YXJzLmdldChuYW1lKQorICAgICAgICBpZiBub3QgdmFyIGFuZCB2YXJ0eXBlOgorICAgICAgICAgICAgIyBjcmVhdGUgYSBUa2ludGVyIHZhcmlhYmxlIG9iamVjdCB3aXRoIHNlbGYudGV4dCBhcyBtYXN0ZXI6CisgICAgICAgICAgICBzZWxmLnRraW50ZXJfdmFyc1tuYW1lXSA9IHZhciA9IHZhcnR5cGUoc2VsZi50ZXh0KQorICAgICAgICByZXR1cm4gdmFyCisKKyAgICAjIFRrIGltcGxlbWVudGF0aW9ucyBvZiAidmlydHVhbCB0ZXh0IG1ldGhvZHMiIC0tIGVhY2ggcGxhdGZvcm0KKyAgICAjIHJldXNpbmcgSURMRSdzIHN1cHBvcnQgY29kZSBuZWVkcyB0byBkZWZpbmUgdGhlc2UgZm9yIGl0cyBHVUkncworICAgICMgZmxhdm9yIG9mIHdpZGdldC4KKworICAgICMgSXMgY2hhcmFjdGVyIGF0IHRleHRfaW5kZXggaW4gYSBQeXRob24gc3RyaW5nPyAgUmV0dXJuIDAgZm9yCisgICAgIyAiZ3VhcmFudGVlZCBubyIsIHRydWUgZm9yIGFueXRoaW5nIGVsc2UuICBUaGlzIGluZm8gaXMgZXhwZW5zaXZlCisgICAgIyB0byBjb21wdXRlIGFiIGluaXRpbywgYnV0IGlzIHByb2JhYmx5IGFscmVhZHkga25vd24gYnkgdGhlCisgICAgIyBwbGF0Zm9ybSdzIGNvbG9yaXplci4KKworICAgIGRlZiBpc19jaGFyX2luX3N0cmluZyhzZWxmLCB0ZXh0X2luZGV4KToKKyAgICAgICAgaWYgc2VsZi5jb2xvcjoKKyAgICAgICAgICAgICMgUmV0dXJuIHRydWUgaWZmIGNvbG9yaXplciBoYXNuJ3QgKHJlKWdvdHRlbiB0aGlzIGZhcgorICAgICAgICAgICAgIyB5ZXQsIG9yIHRoZSBjaGFyYWN0ZXIgaXMgdGFnZ2VkIGFzIGJlaW5nIGluIGEgc3RyaW5nCisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZXh0LnRhZ19wcmV2cmFuZ2UoIlRPRE8iLCB0ZXh0X2luZGV4KSBvciBcCisgICAgICAgICAgICAgICAgICAgIlNUUklORyIgaW4gc2VsZi50ZXh0LnRhZ19uYW1lcyh0ZXh0X2luZGV4KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGUgY29sb3JpemVyIGlzIG1pc3Npbmc6IGFzc3VtZSB0aGUgd29yc3QKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAjIElmIGEgc2VsZWN0aW9uIGlzIGRlZmluZWQgaW4gdGhlIHRleHQgd2lkZ2V0LCByZXR1cm4gKHN0YXJ0LAorICAgICMgZW5kKSBhcyBUa2ludGVyIHRleHQgaW5kaWNlcywgb3RoZXJ3aXNlIHJldHVybiAoTm9uZSwgTm9uZSkKKyAgICBkZWYgZ2V0X3NlbGVjdGlvbl9pbmRpY2VzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaXJzdCA9IHNlbGYudGV4dC5pbmRleCgic2VsLmZpcnN0IikKKyAgICAgICAgICAgIGxhc3QgPSBzZWxmLnRleHQuaW5kZXgoInNlbC5sYXN0IikKKyAgICAgICAgICAgIHJldHVybiBmaXJzdCwgbGFzdAorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCisgICAgIyBSZXR1cm4gdGhlIHRleHQgd2lkZ2V0J3MgY3VycmVudCB2aWV3IG9mIHdoYXQgYSB0YWIgc3RvcCBtZWFucworICAgICMgKGVxdWl2YWxlbnQgd2lkdGggaW4gc3BhY2VzKS4KKworICAgIGRlZiBnZXRfdGFid2lkdGgoc2VsZik6CisgICAgICAgIGN1cnJlbnQgPSBzZWxmLnRleHRbJ3RhYnMnXSBvciBUS19UQUJXSURUSF9ERUZBVUxUCisgICAgICAgIHJldHVybiBpbnQoY3VycmVudCkKKworICAgICMgU2V0IHRoZSB0ZXh0IHdpZGdldCdzIGN1cnJlbnQgdmlldyBvZiB3aGF0IGEgdGFiIHN0b3AgbWVhbnMuCisKKyAgICBkZWYgc2V0X3RhYndpZHRoKHNlbGYsIG5ld3RhYndpZHRoKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBpZiBzZWxmLmdldF90YWJ3aWR0aCgpICE9IG5ld3RhYndpZHRoOgorICAgICAgICAgICAgcGl4ZWxzID0gdGV4dC50ay5jYWxsKCJmb250IiwgIm1lYXN1cmUiLCB0ZXh0WyJmb250Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1kaXNwbGF5b2YiLCB0ZXh0Lm1hc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibiIgKiBuZXd0YWJ3aWR0aCkKKyAgICAgICAgICAgIHRleHQuY29uZmlndXJlKHRhYnM9cGl4ZWxzKQorCisgICAgIyBJZiBpc3B5dGhvbnNvdXJjZSBhbmQgZ3Vlc3MgYXJlIHRydWUsIGd1ZXNzIGEgZ29vZCB2YWx1ZSBmb3IKKyAgICAjIGluZGVudHdpZHRoIGJhc2VkIG9uIGZpbGUgY29udGVudCAoaWYgcG9zc2libGUpLCBhbmQgaWYKKyAgICAjIGluZGVudHdpZHRoICE9IHRhYndpZHRoIHNldCB1c2V0YWJzIGZhbHNlLgorICAgICMgSW4gYW55IGNhc2UsIGFkanVzdCB0aGUgVGV4dCB3aWRnZXQncyB2aWV3IG9mIHdoYXQgYSB0YWIKKyAgICAjIGNoYXJhY3RlciBtZWFucy4KKworICAgIGRlZiBzZXRfaW5kZW50YXRpb25fcGFyYW1zKHNlbGYsIGlzcHl0aG9uc291cmNlLCBndWVzcz1UcnVlKToKKyAgICAgICAgaWYgZ3Vlc3MgYW5kIGlzcHl0aG9uc291cmNlOgorICAgICAgICAgICAgaSA9IHNlbGYuZ3Vlc3NfaW5kZW50KCkKKyAgICAgICAgICAgIGlmIDIgPD0gaSA8PSA4OgorICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50d2lkdGggPSBpCisgICAgICAgICAgICBpZiBzZWxmLmluZGVudHdpZHRoICE9IHNlbGYudGFid2lkdGg6CisgICAgICAgICAgICAgICAgc2VsZi51c2V0YWJzID0gRmFsc2UKKyAgICAgICAgc2VsZi5zZXRfdGFid2lkdGgoc2VsZi50YWJ3aWR0aCkKKworICAgIGRlZiBzbWFydF9iYWNrc3BhY2VfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIGZpcnN0LCBsYXN0ID0gc2VsZi5nZXRfc2VsZWN0aW9uX2luZGljZXMoKQorICAgICAgICBpZiBmaXJzdCBhbmQgbGFzdDoKKyAgICAgICAgICAgIHRleHQuZGVsZXRlKGZpcnN0LCBsYXN0KQorICAgICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgZmlyc3QpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICAjIERlbGV0ZSB3aGl0ZXNwYWNlIGxlZnQsIHVudGlsIGhpdHRpbmcgYSByZWFsIGNoYXIgb3IgY2xvc2VzdAorICAgICAgICAjIHByZWNlZGluZyB2aXJ0dWFsIHRhYiBzdG9wLgorICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCIpCisgICAgICAgIGlmIGNoYXJzID09ICcnOgorICAgICAgICAgICAgaWYgdGV4dC5jb21wYXJlKCJpbnNlcnQiLCAiPiIsICIxLjAiKToKKyAgICAgICAgICAgICAgICAjIGVhc3k6IGRlbGV0ZSBwcmVjZWRpbmcgbmV3bGluZQorICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKCJpbnNlcnQtMWMiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ZXh0LmJlbGwoKSAgICAgIyBhdCBzdGFydCBvZiBidWZmZXIKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGlmICBjaGFyc1stMV0gbm90IGluICIgXHQiOgorICAgICAgICAgICAgIyBlYXN5OiBkZWxldGUgcHJlY2VkaW5nIHJlYWwgY2hhcgorICAgICAgICAgICAgdGV4dC5kZWxldGUoImluc2VydC0xYyIpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICAjIEljay4gIEl0IG1heSByZXF1aXJlICppbnNlcnRpbmcqIHNwYWNlcyBpZiB3ZSBiYWNrIHVwIG92ZXIgYQorICAgICAgICAjIHRhYiBjaGFyYWN0ZXIhICBUaGlzIGlzIHdyaXR0ZW4gdG8gYmUgY2xlYXIsIG5vdCBmYXN0LgorICAgICAgICB0YWJ3aWR0aCA9IHNlbGYudGFid2lkdGgKKyAgICAgICAgaGF2ZSA9IGxlbihjaGFycy5leHBhbmR0YWJzKHRhYndpZHRoKSkKKyAgICAgICAgYXNzZXJ0IGhhdmUgPiAwCisgICAgICAgIHdhbnQgPSAoKGhhdmUgLSAxKSAvLyBzZWxmLmluZGVudHdpZHRoKSAqIHNlbGYuaW5kZW50d2lkdGgKKyAgICAgICAgIyBEZWJ1ZyBwcm9tcHQgaXMgbXVsdGlsaW5lZC4uLi4KKyAgICAgICAgaWYgc2VsZi5jb250ZXh0X3VzZV9wczE6CisgICAgICAgICAgICBsYXN0X2xpbmVfb2ZfcHJvbXB0ID0gc3lzLnBzMS5zcGxpdCgnXG4nKVstMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhc3RfbGluZV9vZl9wcm9tcHQgPSAnJworICAgICAgICBuY2hhcnNkZWxldGVkID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaWYgY2hhcnMgPT0gbGFzdF9saW5lX29mX3Byb21wdDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2hhcnMgPSBjaGFyc1s6LTFdCisgICAgICAgICAgICBuY2hhcnNkZWxldGVkID0gbmNoYXJzZGVsZXRlZCArIDEKKyAgICAgICAgICAgIGhhdmUgPSBsZW4oY2hhcnMuZXhwYW5kdGFicyh0YWJ3aWR0aCkpCisgICAgICAgICAgICBpZiBoYXZlIDw9IHdhbnQgb3IgY2hhcnNbLTFdIG5vdCBpbiAiIFx0IjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RhcnQoKQorICAgICAgICB0ZXh0LmRlbGV0ZSgiaW5zZXJ0LSVkYyIgJSBuY2hhcnNkZWxldGVkLCAiaW5zZXJ0IikKKyAgICAgICAgaWYgaGF2ZSA8IHdhbnQ6CisgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgJyAnICogKHdhbnQgLSBoYXZlKSkKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0b3AoKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHNtYXJ0X2luZGVudF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICMgaWYgaW50cmFsaW5lIHNlbGVjdGlvbjoKKyAgICAgICAgIyAgICAgZGVsZXRlIGl0CisgICAgICAgICMgZWxpZiBtdWx0aWxpbmUgc2VsZWN0aW9uOgorICAgICAgICAjICAgICBkbyBpbmRlbnQtcmVnaW9uCisgICAgICAgICMgZWxzZToKKyAgICAgICAgIyAgICAgaW5kZW50IG9uZSBsZXZlbAorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIGZpcnN0LCBsYXN0ID0gc2VsZi5nZXRfc2VsZWN0aW9uX2luZGljZXMoKQorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RhcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBmaXJzdCBhbmQgbGFzdDoKKyAgICAgICAgICAgICAgICBpZiBpbmRleDJsaW5lKGZpcnN0KSAhPSBpbmRleDJsaW5lKGxhc3QpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRlbnRfcmVnaW9uX2V2ZW50KGV2ZW50KQorICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKGZpcnN0LCBsYXN0KQorICAgICAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGZpcnN0KQorICAgICAgICAgICAgcHJlZml4ID0gdGV4dC5nZXQoImluc2VydCBsaW5lc3RhcnQiLCAiaW5zZXJ0IikKKyAgICAgICAgICAgIHJhdywgZWZmZWN0aXZlID0gY2xhc3NpZnl3cyhwcmVmaXgsIHNlbGYudGFid2lkdGgpCisgICAgICAgICAgICBpZiByYXcgPT0gbGVuKHByZWZpeCk6CisgICAgICAgICAgICAgICAgIyBvbmx5IHdoaXRlc3BhY2UgdG8gdGhlIGxlZnQKKyAgICAgICAgICAgICAgICBzZWxmLnJlaW5kZW50X3RvKGVmZmVjdGl2ZSArIHNlbGYuaW5kZW50d2lkdGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgdGFiIHRvIHRoZSBuZXh0ICdzdG9wJyB3aXRoaW4gb3IgdG8gcmlnaHQgb2YgbGluZSdzIHRleHQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi51c2V0YWJzOgorICAgICAgICAgICAgICAgICAgICBwYWQgPSAnXHQnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlID0gbGVuKHByZWZpeC5leHBhbmR0YWJzKHNlbGYudGFid2lkdGgpKQorICAgICAgICAgICAgICAgICAgICBuID0gc2VsZi5pbmRlbnR3aWR0aAorICAgICAgICAgICAgICAgICAgICBwYWQgPSAnICcgKiAobiAtIGVmZmVjdGl2ZSAlIG4pCisgICAgICAgICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsIHBhZCkKKyAgICAgICAgICAgIHRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKworICAgIGRlZiBuZXdsaW5lX2FuZF9pbmRlbnRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIGZpcnN0LCBsYXN0ID0gc2VsZi5nZXRfc2VsZWN0aW9uX2luZGljZXMoKQorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RhcnQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBmaXJzdCBhbmQgbGFzdDoKKyAgICAgICAgICAgICAgICB0ZXh0LmRlbGV0ZShmaXJzdCwgbGFzdCkKKyAgICAgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBmaXJzdCkKKyAgICAgICAgICAgIGxpbmUgPSB0ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKQorICAgICAgICAgICAgaSwgbiA9IDAsIGxlbihsaW5lKQorICAgICAgICAgICAgd2hpbGUgaSA8IG4gYW5kIGxpbmVbaV0gaW4gIiBcdCI6CisgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgaWYgaSA9PSBuOgorICAgICAgICAgICAgICAgICMgdGhlIGN1cnNvciBpcyBpbiBvciBhdCBsZWFkaW5nIGluZGVudGF0aW9uIGluIGEgY29udGludWF0aW9uCisgICAgICAgICAgICAgICAgIyBsaW5lOyBqdXN0IGluamVjdCBhbiBlbXB0eSBsaW5lIGF0IHRoZSBzdGFydAorICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQgbGluZXN0YXJ0IiwgJ1xuJykKKyAgICAgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorICAgICAgICAgICAgaW5kZW50ID0gbGluZVs6aV0KKyAgICAgICAgICAgICMgc3RyaXAgd2hpdGVzcGFjZSBiZWZvcmUgaW5zZXJ0IHBvaW50IHVubGVzcyBpdCdzIGluIHRoZSBwcm9tcHQKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICBsYXN0X2xpbmVfb2ZfcHJvbXB0ID0gc3lzLnBzMS5zcGxpdCgnXG4nKVstMV0KKyAgICAgICAgICAgIHdoaWxlIGxpbmUgYW5kIGxpbmVbLTFdIGluICIgXHQiIGFuZCBsaW5lICE9IGxhc3RfbGluZV9vZl9wcm9tcHQ6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgIGlmIGk6CisgICAgICAgICAgICAgICAgdGV4dC5kZWxldGUoImluc2VydCAtICVkIGNoYXJzIiAlIGksICJpbnNlcnQiKQorICAgICAgICAgICAgIyBzdHJpcCB3aGl0ZXNwYWNlIGFmdGVyIGluc2VydCBwb2ludAorICAgICAgICAgICAgd2hpbGUgdGV4dC5nZXQoImluc2VydCIpIGluICIgXHQiOgorICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKCJpbnNlcnQiKQorICAgICAgICAgICAgIyBzdGFydCBuZXcgbGluZQorICAgICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsICdcbicpCisKKyAgICAgICAgICAgICMgYWRqdXN0IGluZGVudGF0aW9uIGZvciBjb250aW51YXRpb25zIGFuZCBibG9jaworICAgICAgICAgICAgIyBvcGVuL2Nsb3NlIGZpcnN0IG5lZWQgdG8gZmluZCB0aGUgbGFzdCBzdG10CisgICAgICAgICAgICBsbm8gPSBpbmRleDJsaW5lKHRleHQuaW5kZXgoJ2luc2VydCcpKQorICAgICAgICAgICAgeSA9IFB5UGFyc2UuUGFyc2VyKHNlbGYuaW5kZW50d2lkdGgsIHNlbGYudGFid2lkdGgpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5jb250ZXh0X3VzZV9wczE6CisgICAgICAgICAgICAgICAgZm9yIGNvbnRleHQgaW4gc2VsZi5udW1fY29udGV4dF9saW5lczoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRhdCA9IG1heChsbm8gLSBjb250ZXh0LCAxKQorICAgICAgICAgICAgICAgICAgICBzdGFydGF0aW5kZXggPSByZXByKHN0YXJ0YXQpICsgIi4wIgorICAgICAgICAgICAgICAgICAgICByYXd0ZXh0ID0gdGV4dC5nZXQoc3RhcnRhdGluZGV4LCAiaW5zZXJ0IikKKyAgICAgICAgICAgICAgICAgICAgeS5zZXRfc3RyKHJhd3RleHQpCisgICAgICAgICAgICAgICAgICAgIGJvZCA9IHkuZmluZF9nb29kX3BhcnNlX3N0YXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0X3VzZV9wczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9idWlsZF9jaGFyX2luX3N0cmluZ19mdW5jKHN0YXJ0YXRpbmRleCkpCisgICAgICAgICAgICAgICAgICAgIGlmIGJvZCBpcyBub3QgTm9uZSBvciBzdGFydGF0ID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHkuc2V0X2xvKGJvZCBvciAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByID0gdGV4dC50YWdfcHJldnJhbmdlKCJjb25zb2xlIiwgImluc2VydCIpCisgICAgICAgICAgICAgICAgaWYgcjoKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRhdGluZGV4ID0gclsxXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0YXRpbmRleCA9ICIxLjAiCisgICAgICAgICAgICAgICAgcmF3dGV4dCA9IHRleHQuZ2V0KHN0YXJ0YXRpbmRleCwgImluc2VydCIpCisgICAgICAgICAgICAgICAgeS5zZXRfc3RyKHJhd3RleHQpCisgICAgICAgICAgICAgICAgeS5zZXRfbG8oMCkKKworICAgICAgICAgICAgYyA9IHkuZ2V0X2NvbnRpbnVhdGlvbl90eXBlKCkKKyAgICAgICAgICAgIGlmIGMgIT0gUHlQYXJzZS5DX05PTkU6CisgICAgICAgICAgICAgICAgIyBUaGUgY3VycmVudCBzdG10IGhhc24ndCBlbmRlZCB5ZXQuCisgICAgICAgICAgICAgICAgaWYgYyA9PSBQeVBhcnNlLkNfU1RSSU5HX0ZJUlNUX0xJTkU6CisgICAgICAgICAgICAgICAgICAgICMgYWZ0ZXIgdGhlIGZpcnN0IGxpbmUgb2YgYSBzdHJpbmc7IGRvIG5vdCBpbmRlbnQgYXQgYWxsCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbGlmIGMgPT0gUHlQYXJzZS5DX1NUUklOR19ORVhUX0xJTkVTOgorICAgICAgICAgICAgICAgICAgICAjIGluc2lkZSBhIHN0cmluZyB3aGljaCBzdGFydGVkIGJlZm9yZSB0aGlzIGxpbmU7CisgICAgICAgICAgICAgICAgICAgICMganVzdCBtaW1pYyB0aGUgY3VycmVudCBpbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5pbnNlcnQoImluc2VydCIsIGluZGVudCkKKyAgICAgICAgICAgICAgICBlbGlmIGMgPT0gUHlQYXJzZS5DX0JSQUNLRVQ6CisgICAgICAgICAgICAgICAgICAgICMgbGluZSB1cCB3aXRoIHRoZSBmaXJzdCAoaWYgYW55KSBlbGVtZW50IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAjIGxhc3Qgb3BlbiBicmFja2V0IHN0cnVjdHVyZTsgZWxzZSBpbmRlbnQgb25lCisgICAgICAgICAgICAgICAgICAgICMgbGV2ZWwgYmV5b25kIHRoZSBpbmRlbnQgb2YgdGhlIGxpbmUgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBsYXN0IG9wZW4gYnJhY2tldAorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlaW5kZW50X3RvKHkuY29tcHV0ZV9icmFja2V0X2luZGVudCgpKQorICAgICAgICAgICAgICAgIGVsaWYgYyA9PSBQeVBhcnNlLkNfQkFDS1NMQVNIOgorICAgICAgICAgICAgICAgICAgICAjIGlmIG1vcmUgdGhhbiBvbmUgbGluZSBpbiB0aGlzIHN0bXQgYWxyZWFkeSwganVzdAorICAgICAgICAgICAgICAgICAgICAjIG1pbWljIHRoZSBjdXJyZW50IGluZGVudDsgZWxzZSBpZiBpbml0aWFsIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgIyBoYXMgYSBzdGFydCBvbiBhbiBhc3NpZ25tZW50IHN0bXQsIGluZGVudCB0bworICAgICAgICAgICAgICAgICAgICAjIGJleW9uZCBsZWZ0bW9zdCA9OyBlbHNlIHRvIGJleW9uZCBmaXJzdCBjaHVuayBvZgorICAgICAgICAgICAgICAgICAgICAjIG5vbi13aGl0ZXNwYWNlIG9uIGluaXRpYWwgbGluZQorICAgICAgICAgICAgICAgICAgICBpZiB5LmdldF9udW1fbGluZXNfaW5fc3RtdCgpID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRleHQuaW5zZXJ0KCJpbnNlcnQiLCBpbmRlbnQpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlaW5kZW50X3RvKHkuY29tcHV0ZV9iYWNrc2xhc2hfaW5kZW50KCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IDAsICJib2d1cyBjb250aW51YXRpb24gdHlwZSAlciIgJSAoYywpCisgICAgICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgICAgICAgICAgIyBUaGlzIGxpbmUgc3RhcnRzIGEgYnJhbmQgbmV3IHN0bXQ7IGluZGVudCByZWxhdGl2ZSB0bworICAgICAgICAgICAgIyBpbmRlbnRhdGlvbiBvZiBpbml0aWFsIGxpbmUgb2YgY2xvc2VzdCBwcmVjZWRpbmcKKyAgICAgICAgICAgICMgaW50ZXJlc3Rpbmcgc3RtdC4KKyAgICAgICAgICAgIGluZGVudCA9IHkuZ2V0X2Jhc2VfaW5kZW50X3N0cmluZygpCisgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0IiwgaW5kZW50KQorICAgICAgICAgICAgaWYgeS5pc19ibG9ja19vcGVuZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLnNtYXJ0X2luZGVudF9ldmVudChldmVudCkKKyAgICAgICAgICAgIGVsaWYgaW5kZW50IGFuZCB5LmlzX2Jsb2NrX2Nsb3NlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuc21hcnRfYmFja3NwYWNlX2V2ZW50KGV2ZW50KQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0b3AoKQorCisgICAgIyBPdXIgZWRpdHdpbiBwcm92aWRlcyBhIGlzX2NoYXJfaW5fc3RyaW5nIGZ1bmN0aW9uIHRoYXQgd29ya3MKKyAgICAjIHdpdGggYSBUayB0ZXh0IGluZGV4LCBidXQgUHlQYXJzZSBvbmx5IGtub3dzIGFib3V0IG9mZnNldHMgaW50bworICAgICMgYSBzdHJpbmcuIFRoaXMgYnVpbGRzIGEgZnVuY3Rpb24gZm9yIFB5UGFyc2UgdGhhdCBhY2NlcHRzIGFuCisgICAgIyBvZmZzZXQuCisKKyAgICBkZWYgX2J1aWxkX2NoYXJfaW5fc3RyaW5nX2Z1bmMoc2VsZiwgc3RhcnRpbmRleCk6CisgICAgICAgIGRlZiBpbm5lcihvZmZzZXQsIF9zdGFydGluZGV4PXN0YXJ0aW5kZXgsCisgICAgICAgICAgICAgICAgICBfaWNpcz1zZWxmLmlzX2NoYXJfaW5fc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiBfaWNpcyhfc3RhcnRpbmRleCArICIrJWRjIiAlIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIGlubmVyCisKKyAgICBkZWYgaW5kZW50X3JlZ2lvbl9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcyA9IHNlbGYuZ2V0X3JlZ2lvbigpCisgICAgICAgIGZvciBwb3MgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBsaW5lID0gbGluZXNbcG9zXQorICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICByYXcsIGVmZmVjdGl2ZSA9IGNsYXNzaWZ5d3MobGluZSwgc2VsZi50YWJ3aWR0aCkKKyAgICAgICAgICAgICAgICBlZmZlY3RpdmUgPSBlZmZlY3RpdmUgKyBzZWxmLmluZGVudHdpZHRoCisgICAgICAgICAgICAgICAgbGluZXNbcG9zXSA9IHNlbGYuX21ha2VfYmxhbmtzKGVmZmVjdGl2ZSkgKyBsaW5lW3JhdzpdCisgICAgICAgIHNlbGYuc2V0X3JlZ2lvbihoZWFkLCB0YWlsLCBjaGFycywgbGluZXMpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZGVkZW50X3JlZ2lvbl9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcyA9IHNlbGYuZ2V0X3JlZ2lvbigpCisgICAgICAgIGZvciBwb3MgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBsaW5lID0gbGluZXNbcG9zXQorICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICByYXcsIGVmZmVjdGl2ZSA9IGNsYXNzaWZ5d3MobGluZSwgc2VsZi50YWJ3aWR0aCkKKyAgICAgICAgICAgICAgICBlZmZlY3RpdmUgPSBtYXgoZWZmZWN0aXZlIC0gc2VsZi5pbmRlbnR3aWR0aCwgMCkKKyAgICAgICAgICAgICAgICBsaW5lc1twb3NdID0gc2VsZi5fbWFrZV9ibGFua3MoZWZmZWN0aXZlKSArIGxpbmVbcmF3Ol0KKyAgICAgICAgc2VsZi5zZXRfcmVnaW9uKGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcykKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBjb21tZW50X3JlZ2lvbl9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcyA9IHNlbGYuZ2V0X3JlZ2lvbigpCisgICAgICAgIGZvciBwb3MgaW4gcmFuZ2UobGVuKGxpbmVzKSAtIDEpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVzW3Bvc10KKyAgICAgICAgICAgIGxpbmVzW3Bvc10gPSAnIyMnICsgbGluZQorICAgICAgICBzZWxmLnNldF9yZWdpb24oaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzKQorCisgICAgZGVmIHVuY29tbWVudF9yZWdpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMgPSBzZWxmLmdldF9yZWdpb24oKQorICAgICAgICBmb3IgcG9zIGluIHJhbmdlKGxlbihsaW5lcykpOgorICAgICAgICAgICAgbGluZSA9IGxpbmVzW3Bvc10KKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBsaW5lWzoyXSA9PSAnIyMnOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzI6XQorICAgICAgICAgICAgZWxpZiBsaW5lWzoxXSA9PSAnIyc6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbMTpdCisgICAgICAgICAgICBsaW5lc1twb3NdID0gbGluZQorICAgICAgICBzZWxmLnNldF9yZWdpb24oaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzKQorCisgICAgZGVmIHRhYmlmeV9yZWdpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMgPSBzZWxmLmdldF9yZWdpb24oKQorICAgICAgICB0YWJ3aWR0aCA9IHNlbGYuX2Fza3RhYndpZHRoKCkKKyAgICAgICAgaWYgdGFid2lkdGggaXMgTm9uZTogcmV0dXJuCisgICAgICAgIGZvciBwb3MgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBsaW5lID0gbGluZXNbcG9zXQorICAgICAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgICAgICByYXcsIGVmZmVjdGl2ZSA9IGNsYXNzaWZ5d3MobGluZSwgdGFid2lkdGgpCisgICAgICAgICAgICAgICAgbnRhYnMsIG5zcGFjZXMgPSBkaXZtb2QoZWZmZWN0aXZlLCB0YWJ3aWR0aCkKKyAgICAgICAgICAgICAgICBsaW5lc1twb3NdID0gJ1x0JyAqIG50YWJzICsgJyAnICogbnNwYWNlcyArIGxpbmVbcmF3Ol0KKyAgICAgICAgc2VsZi5zZXRfcmVnaW9uKGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcykKKworICAgIGRlZiB1bnRhYmlmeV9yZWdpb25fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMgPSBzZWxmLmdldF9yZWdpb24oKQorICAgICAgICB0YWJ3aWR0aCA9IHNlbGYuX2Fza3RhYndpZHRoKCkKKyAgICAgICAgaWYgdGFid2lkdGggaXMgTm9uZTogcmV0dXJuCisgICAgICAgIGZvciBwb3MgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBsaW5lc1twb3NdID0gbGluZXNbcG9zXS5leHBhbmR0YWJzKHRhYndpZHRoKQorICAgICAgICBzZWxmLnNldF9yZWdpb24oaGVhZCwgdGFpbCwgY2hhcnMsIGxpbmVzKQorCisgICAgZGVmIHRvZ2dsZV90YWJzX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5hc2t5ZXNubygKKyAgICAgICAgICAgICAgIlRvZ2dsZSB0YWJzIiwKKyAgICAgICAgICAgICAgIlR1cm4gdGFicyAiICsgKCJvbiIsICJvZmYiKVtzZWxmLnVzZXRhYnNdICsKKyAgICAgICAgICAgICAgIj9cbkluZGVudCB3aWR0aCAiICsKKyAgICAgICAgICAgICAgKCJ3aWxsIGJlIiwgInJlbWFpbnMgYXQiKVtzZWxmLnVzZXRhYnNdICsgIiA4LiIgKworICAgICAgICAgICAgICAiXG4gTm90ZTogYSB0YWIgaXMgYWx3YXlzIDggY29sdW1ucyIsCisgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpOgorICAgICAgICAgICAgc2VsZi51c2V0YWJzID0gbm90IHNlbGYudXNldGFicworICAgICAgICAgICAgIyBUcnkgdG8gcHJldmVudCBpbmNvbnNpc3RlbnQgaW5kZW50YXRpb24uCisgICAgICAgICAgICAjIFVzZXIgbXVzdCBjaGFuZ2UgaW5kZW50IHdpZHRoIG1hbnVhbGx5IGFmdGVyIHVzaW5nIHRhYnMuCisgICAgICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gOAorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgIyBYWFggdGhpcyBpc24ndCBib3VuZCB0byBhbnl0aGluZyAtLSBzZWUgdGFid2lkdGggY29tbWVudHMKKyMjICAgICBkZWYgY2hhbmdlX3RhYndpZHRoX2V2ZW50KHNlbGYsIGV2ZW50KToKKyMjICAgICAgICAgbmV3ID0gc2VsZi5fYXNrdGFid2lkdGgoKQorIyMgICAgICAgICBpZiBuZXcgIT0gc2VsZi50YWJ3aWR0aDoKKyMjICAgICAgICAgICAgIHNlbGYudGFid2lkdGggPSBuZXcKKyMjICAgICAgICAgICAgIHNlbGYuc2V0X2luZGVudGF0aW9uX3BhcmFtcygwLCBndWVzcz0wKQorIyMgICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGNoYW5nZV9pbmRlbnR3aWR0aF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIG5ldyA9IHNlbGYuYXNraW50ZWdlcigKKyAgICAgICAgICAgICAgICAgICJJbmRlbnQgd2lkdGgiLAorICAgICAgICAgICAgICAgICAgIk5ldyBpbmRlbnQgd2lkdGggKDItMTYpXG4oQWx3YXlzIHVzZSA4IHdoZW4gdXNpbmcgdGFicykiLAorICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCwKKyAgICAgICAgICAgICAgICAgIGluaXRpYWx2YWx1ZT1zZWxmLmluZGVudHdpZHRoLAorICAgICAgICAgICAgICAgICAgbWludmFsdWU9MiwKKyAgICAgICAgICAgICAgICAgIG1heHZhbHVlPTE2KQorICAgICAgICBpZiBuZXcgYW5kIG5ldyAhPSBzZWxmLmluZGVudHdpZHRoIGFuZCBub3Qgc2VsZi51c2V0YWJzOgorICAgICAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IG5ldworICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGdldF9yZWdpb24oc2VsZik6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgZmlyc3QsIGxhc3QgPSBzZWxmLmdldF9zZWxlY3Rpb25faW5kaWNlcygpCisgICAgICAgIGlmIGZpcnN0IGFuZCBsYXN0OgorICAgICAgICAgICAgaGVhZCA9IHRleHQuaW5kZXgoZmlyc3QgKyAiIGxpbmVzdGFydCIpCisgICAgICAgICAgICB0YWlsID0gdGV4dC5pbmRleChsYXN0ICsgIi0xYyBsaW5lZW5kICsxYyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkID0gdGV4dC5pbmRleCgiaW5zZXJ0IGxpbmVzdGFydCIpCisgICAgICAgICAgICB0YWlsID0gdGV4dC5pbmRleCgiaW5zZXJ0IGxpbmVlbmQgKzFjIikKKyAgICAgICAgY2hhcnMgPSB0ZXh0LmdldChoZWFkLCB0YWlsKQorICAgICAgICBsaW5lcyA9IGNoYXJzLnNwbGl0KCJcbiIpCisgICAgICAgIHJldHVybiBoZWFkLCB0YWlsLCBjaGFycywgbGluZXMKKworICAgIGRlZiBzZXRfcmVnaW9uKHNlbGYsIGhlYWQsIHRhaWwsIGNoYXJzLCBsaW5lcyk6CisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgbmV3Y2hhcnMgPSAiXG4iLmpvaW4obGluZXMpCisgICAgICAgIGlmIG5ld2NoYXJzID09IGNoYXJzOgorICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgaGVhZCkKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgdGV4dC5kZWxldGUoaGVhZCwgdGFpbCkKKyAgICAgICAgdGV4dC5pbnNlcnQoaGVhZCwgbmV3Y2hhcnMpCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKyAgICAgICAgdGV4dC50YWdfYWRkKCJzZWwiLCBoZWFkLCAiaW5zZXJ0IikKKworICAgICMgTWFrZSBzdHJpbmcgdGhhdCBkaXNwbGF5cyBhcyBuIGxlYWRpbmcgYmxhbmtzLgorCisgICAgZGVmIF9tYWtlX2JsYW5rcyhzZWxmLCBuKToKKyAgICAgICAgaWYgc2VsZi51c2V0YWJzOgorICAgICAgICAgICAgbnRhYnMsIG5zcGFjZXMgPSBkaXZtb2Qobiwgc2VsZi50YWJ3aWR0aCkKKyAgICAgICAgICAgIHJldHVybiAnXHQnICogbnRhYnMgKyAnICcgKiBuc3BhY2VzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJyAnICogbgorCisgICAgIyBEZWxldGUgZnJvbSBiZWdpbm5pbmcgb2YgbGluZSB0byBpbnNlcnQgcG9pbnQsIHRoZW4gcmVpbnNlcnQKKyAgICAjIGNvbHVtbiBsb2dpY2FsIChtZWFuaW5nIHVzZSB0YWJzIGlmIGFwcHJvcHJpYXRlKSBzcGFjZXMuCisKKyAgICBkZWYgcmVpbmRlbnRfdG8oc2VsZiwgY29sdW1uKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RhcnQoKQorICAgICAgICBpZiB0ZXh0LmNvbXBhcmUoImluc2VydCBsaW5lc3RhcnQiLCAiIT0iLCAiaW5zZXJ0Iik6CisgICAgICAgICAgICB0ZXh0LmRlbGV0ZSgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKQorICAgICAgICBpZiBjb2x1bW46CisgICAgICAgICAgICB0ZXh0Lmluc2VydCgiaW5zZXJ0Iiwgc2VsZi5fbWFrZV9ibGFua3MoY29sdW1uKSkKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0b3AoKQorCisgICAgZGVmIF9hc2t0YWJ3aWR0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXNraW50ZWdlcigKKyAgICAgICAgICAgICJUYWIgd2lkdGgiLAorICAgICAgICAgICAgIkNvbHVtbnMgcGVyIHRhYj8gKDItMTYpIiwKKyAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQsCisgICAgICAgICAgICBpbml0aWFsdmFsdWU9c2VsZi5pbmRlbnR3aWR0aCwKKyAgICAgICAgICAgIG1pbnZhbHVlPTIsCisgICAgICAgICAgICBtYXh2YWx1ZT0xNikKKworICAgICMgR3Vlc3MgaW5kZW50d2lkdGggZnJvbSB0ZXh0IGNvbnRlbnQuCisgICAgIyBSZXR1cm4gZ3Vlc3NlZCBpbmRlbnR3aWR0aC4gIFRoaXMgc2hvdWxkIG5vdCBiZSBiZWxpZXZlZCB1bmxlc3MKKyAgICAjIGl0J3MgaW4gYSByZWFzb25hYmxlIHJhbmdlIChlLmcuLCBpdCB3aWxsIGJlIDAgaWYgbm8gaW5kZW50ZWQKKyAgICAjIGJsb2NrcyBhcmUgZm91bmQpLgorCisgICAgZGVmIGd1ZXNzX2luZGVudChzZWxmKToKKyAgICAgICAgb3BlbmVyLCBpbmRlbnRlZCA9IEluZGVudFNlYXJjaGVyKHNlbGYudGV4dCwgc2VsZi50YWJ3aWR0aCkucnVuKCkKKyAgICAgICAgaWYgb3BlbmVyIGFuZCBpbmRlbnRlZDoKKyAgICAgICAgICAgIHJhdywgaW5kZW50c21hbGwgPSBjbGFzc2lmeXdzKG9wZW5lciwgc2VsZi50YWJ3aWR0aCkKKyAgICAgICAgICAgIHJhdywgaW5kZW50bGFyZ2UgPSBjbGFzc2lmeXdzKGluZGVudGVkLCBzZWxmLnRhYndpZHRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5kZW50c21hbGwgPSBpbmRlbnRsYXJnZSA9IDAKKyAgICAgICAgcmV0dXJuIGluZGVudGxhcmdlIC0gaW5kZW50c21hbGwKKworIyAibGluZS5jb2wiIC0+IGxpbmUsIGFzIGFuIGludAorZGVmIGluZGV4MmxpbmUoaW5kZXgpOgorICAgIHJldHVybiBpbnQoZmxvYXQoaW5kZXgpKQorCisjIExvb2sgYXQgdGhlIGxlYWRpbmcgd2hpdGVzcGFjZSBpbiBzLgorIyBSZXR1cm4gcGFpciAoIyBvZiBsZWFkaW5nIHdzIGNoYXJhY3RlcnMsCisjICAgICAgICAgICAgICBlZmZlY3RpdmUgIyBvZiBsZWFkaW5nIGJsYW5rcyBhZnRlciBleHBhbmRpbmcKKyMgICAgICAgICAgICAgIHRhYnMgdG8gd2lkdGggdGFid2lkdGgpCisKK2RlZiBjbGFzc2lmeXdzKHMsIHRhYndpZHRoKToKKyAgICByYXcgPSBlZmZlY3RpdmUgPSAwCisgICAgZm9yIGNoIGluIHM6CisgICAgICAgIGlmIGNoID09ICcgJzoKKyAgICAgICAgICAgIHJhdyA9IHJhdyArIDEKKyAgICAgICAgICAgIGVmZmVjdGl2ZSA9IGVmZmVjdGl2ZSArIDEKKyAgICAgICAgZWxpZiBjaCA9PSAnXHQnOgorICAgICAgICAgICAgcmF3ID0gcmF3ICsgMQorICAgICAgICAgICAgZWZmZWN0aXZlID0gKGVmZmVjdGl2ZSAvLyB0YWJ3aWR0aCArIDEpICogdGFid2lkdGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIHJhdywgZWZmZWN0aXZlCisKK2ltcG9ydCB0b2tlbml6ZQorX3Rva2VuaXplID0gdG9rZW5pemUKK2RlbCB0b2tlbml6ZQorCitjbGFzcyBJbmRlbnRTZWFyY2hlcihvYmplY3QpOgorCisgICAgIyAucnVuKCkgY2hld3Mgb3ZlciB0aGUgVGV4dCB3aWRnZXQsIGxvb2tpbmcgZm9yIGEgYmxvY2sgb3BlbmVyCisgICAgIyBhbmQgdGhlIHN0bXQgZm9sbG93aW5nIGl0LiAgUmV0dXJucyBhIHBhaXIsCisgICAgIyAgICAgKGxpbmUgY29udGFpbmluZyBibG9jayBvcGVuZXIsIGxpbmUgY29udGFpbmluZyBzdG10KQorICAgICMgRWl0aGVyIG9yIGJvdGggbWF5IGJlIE5vbmUuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgdGFid2lkdGgpOgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisgICAgICAgIHNlbGYudGFid2lkdGggPSB0YWJ3aWR0aAorICAgICAgICBzZWxmLmkgPSBzZWxmLmZpbmlzaGVkID0gMAorICAgICAgICBzZWxmLmJsa29wZW5saW5lID0gc2VsZi5pbmRlbnRlZGxpbmUgPSBOb25lCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZmluaXNoZWQ6CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgaSA9IHNlbGYuaSA9IHNlbGYuaSArIDEKKyAgICAgICAgbWFyayA9IHJlcHIoaSkgKyAiLjAiCisgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKG1hcmssICI+PSIsICJlbmQiKToKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICByZXR1cm4gc2VsZi50ZXh0LmdldChtYXJrLCBtYXJrICsgIiBsaW5lZW5kKzFjIikKKworICAgIGRlZiB0b2tlbmVhdGVyKHNlbGYsIHR5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lLAorICAgICAgICAgICAgICAgICAgIElOREVOVD1fdG9rZW5pemUuSU5ERU5ULAorICAgICAgICAgICAgICAgICAgIE5BTUU9X3Rva2VuaXplLk5BTUUsCisgICAgICAgICAgICAgICAgICAgT1BFTkVSUz0oJ2NsYXNzJywgJ2RlZicsICdmb3InLCAnaWYnLCAndHJ5JywgJ3doaWxlJykpOgorICAgICAgICBpZiBzZWxmLmZpbmlzaGVkOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIHR5cGUgPT0gTkFNRSBhbmQgdG9rZW4gaW4gT1BFTkVSUzoKKyAgICAgICAgICAgIHNlbGYuYmxrb3BlbmxpbmUgPSBsaW5lCisgICAgICAgIGVsaWYgdHlwZSA9PSBJTkRFTlQgYW5kIHNlbGYuYmxrb3BlbmxpbmU6CisgICAgICAgICAgICBzZWxmLmluZGVudGVkbGluZSA9IGxpbmUKKyAgICAgICAgICAgIHNlbGYuZmluaXNoZWQgPSAxCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzYXZlX3RhYnNpemUgPSBfdG9rZW5pemUudGFic2l6ZQorICAgICAgICBfdG9rZW5pemUudGFic2l6ZSA9IHNlbGYudGFid2lkdGgKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF90b2tlbml6ZS50b2tlbml6ZShzZWxmLnJlYWRsaW5lLCBzZWxmLnRva2VuZWF0ZXIpCisgICAgICAgICAgICBleGNlcHQgKF90b2tlbml6ZS5Ub2tlbkVycm9yLCBTeW50YXhFcnJvcik6CisgICAgICAgICAgICAgICAgIyBzaW5jZSB3ZSBjdXQgb2ZmIHRoZSB0b2tlbml6ZXIgZWFybHksIHdlIGNhbiB0cmlnZ2VyCisgICAgICAgICAgICAgICAgIyBzcHVyaW91cyBlcnJvcnMKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBfdG9rZW5pemUudGFic2l6ZSA9IHNhdmVfdGFic2l6ZQorICAgICAgICByZXR1cm4gc2VsZi5ibGtvcGVubGluZSwgc2VsZi5pbmRlbnRlZGxpbmUKKworIyMjIGVuZCBhdXRvaW5kZW50IGNvZGUgIyMjCisKK2RlZiBwcmVwc3RyKHMpOgorICAgICMgSGVscGVyIHRvIGV4dHJhY3QgdGhlIHVuZGVyc2NvcmUgZnJvbSBhIHN0cmluZywgZS5nLgorICAgICMgcHJlcHN0cigiQ29fcHkiKSByZXR1cm5zICgyLCAiQ29weSIpLgorICAgIGkgPSBzLmZpbmQoJ18nKQorICAgIGlmIGkgPj0gMDoKKyAgICAgICAgcyA9IHNbOmldICsgc1tpKzE6XQorICAgIHJldHVybiBpLCBzCisKKwora2V5bmFtZXMgPSB7CisgJ2JyYWNrZXRsZWZ0JzogJ1snLAorICdicmFja2V0cmlnaHQnOiAnXScsCisgJ3NsYXNoJzogJy8nLAorfQorCitkZWYgZ2V0X2FjY2VsZXJhdG9yKGtleWRlZnMsIGV2ZW50bmFtZSk6CisgICAga2V5bGlzdCA9IGtleWRlZnMuZ2V0KGV2ZW50bmFtZSkKKyAgICAjIGlzc3VlMTA5NDA6IHRlbXBvcmFyeSB3b3JrYXJvdW5kIHRvIHByZXZlbnQgaGFuZyB3aXRoIE9TIFggQ29jb2EgVGsgOC41CisgICAgIyBpZiBub3Qga2V5bGlzdDoKKyAgICBpZiAobm90IGtleWxpc3QpIG9yIChtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpIGFuZCBldmVudG5hbWUgaW4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PG9wZW4tbW9kdWxlPj4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8PGdvdG8tbGluZT4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPDxjaGFuZ2UtaW5kZW50d2lkdGg+PiJ9KToKKyAgICAgICAgcmV0dXJuICIiCisgICAgcyA9IGtleWxpc3RbMF0KKyAgICBzID0gcmUuc3ViKHIiLVthLXpdXGIiLCBsYW1iZGEgbTogbS5ncm91cCgpLnVwcGVyKCksIHMpCisgICAgcyA9IHJlLnN1YihyIlxiXHcrXGIiLCBsYW1iZGEgbToga2V5bmFtZXMuZ2V0KG0uZ3JvdXAoKSwgbS5ncm91cCgpKSwgcykKKyAgICBzID0gcmUuc3ViKCJLZXktIiwgIiIsIHMpCisgICAgcyA9IHJlLnN1YigiQ2FuY2VsIiwiQ3RybC1CcmVhayIscykgICAjIGRzY2hlcmVyQGNtdS5lZHUKKyAgICBzID0gcmUuc3ViKCJDb250cm9sLSIsICJDdHJsLSIsIHMpCisgICAgcyA9IHJlLnN1YigiLSIsICIrIiwgcykKKyAgICBzID0gcmUuc3ViKCI+PCIsICIgIiwgcykKKyAgICBzID0gcmUuc3ViKCI8IiwgIiIsIHMpCisgICAgcyA9IHJlLnN1YigiPiIsICIiLCBzKQorICAgIHJldHVybiBzCisKKworZGVmIGZpeHdvcmRicmVha3Mocm9vdCk6CisgICAgIyBNYWtlIHN1cmUgdGhhdCBUaydzIGRvdWJsZS1jbGljayBhbmQgbmV4dC9wcmV2aW91cyB3b3JkCisgICAgIyBvcGVyYXRpb25zIHVzZSBvdXIgZGVmaW5pdGlvbiBvZiBhIHdvcmQgKGkuZS4gYW4gaWRlbnRpZmllcikKKyAgICB0ayA9IHJvb3QudGsKKyAgICB0ay5jYWxsKCd0Y2xfd29yZEJyZWFrQWZ0ZXInLCAnYSBiJywgMCkgIyBtYWtlIHN1cmUgd29yZC50Y2wgaXMgbG9hZGVkCisgICAgdGsuY2FsbCgnc2V0JywgJ3RjbF93b3JkY2hhcnMnLCAnW2EtekEtWjAtOV9dJykKKyAgICB0ay5jYWxsKCdzZXQnLCAndGNsX25vbndvcmRjaGFycycsICdbXmEtekEtWjAtOV9dJykKKworCitkZWYgdGVzdCgpOgorICAgIHJvb3QgPSBUaygpCisgICAgZml4d29yZGJyZWFrcyhyb290KQorICAgIHJvb3Qud2l0aGRyYXcoKQorICAgIGlmIHN5cy5hcmd2WzE6XToKKyAgICAgICAgZmlsZW5hbWUgPSBzeXMuYXJndlsxXQorICAgIGVsc2U6CisgICAgICAgIGZpbGVuYW1lID0gTm9uZQorICAgIGVkaXQgPSBFZGl0b3JXaW5kb3cocm9vdD1yb290LCBmaWxlbmFtZT1maWxlbmFtZSkKKyAgICBlZGl0LnNldF9jbG9zZV9ob29rKHJvb3QucXVpdCkKKyAgICBlZGl0LnRleHQuYmluZCgiPDxjbG9zZS1hbGwtd2luZG93cz4+IiwgZWRpdC5jbG9zZV9ldmVudCkKKyAgICByb290Lm1haW5sb29wKCkKKyAgICByb290LmRlc3Ryb3koKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0VkaXRvcldpbmRvdy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRWRpdG9yV2luZG93LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQ0MjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0VkaXRvcldpbmRvdy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0VkaXRvcldpbmRvdy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRWRpdG9yV2luZG93LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjIwYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0VkaXRvcldpbmRvdy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ZpbGVMaXN0LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ZpbGVMaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMThmZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRmlsZUxpc3QucHkKQEAgLTAsMCArMSwxMjQgQEAKK2ltcG9ydCBvcworZnJvbSBUa2ludGVyIGltcG9ydCAqCitpbXBvcnQgdGtNZXNzYWdlQm94CisKKworY2xhc3MgRmlsZUxpc3Q6CisKKyAgICAjIE4uQi4gdGhpcyBpbXBvcnQgb3ZlcnJpZGRlbiBpbiBQeVNoZWxsRmlsZUxpc3QuCisgICAgZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CisgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKKyAgICAgICAgc2VsZi5kaWN0ID0ge30KKyAgICAgICAgc2VsZi5pbnZlcnNlZGljdCA9IHt9CisgICAgICAgIHNlbGYudmFycyA9IHt9ICMgRm9yIEVkaXRvcldpbmRvdy5nZXRyYXd2YXIgKHNoYXJlZCBUY2wgdmFyaWFibGVzKQorCisgICAgZGVmIG9wZW4oc2VsZiwgZmlsZW5hbWUsIGFjdGlvbj1Ob25lKToKKyAgICAgICAgYXNzZXJ0IGZpbGVuYW1lCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jYW5vbml6ZShmaWxlbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmaWxlbmFtZSk6CisgICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiB3aGVuIGJhZCBmaWxlbmFtZSBpcyBwYXNzZWQgb24gY29tbWFuZCBsaW5lOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICAgICAiRmlsZSBFcnJvciIsCisgICAgICAgICAgICAgICAgIiVyIGlzIGEgZGlyZWN0b3J5LiIgJSAoZmlsZW5hbWUsKSwKKyAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi5yb290KQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAga2V5ID0gb3MucGF0aC5ub3JtY2FzZShmaWxlbmFtZSkKKyAgICAgICAgaWYga2V5IGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIGVkaXQgPSBzZWxmLmRpY3Rba2V5XQorICAgICAgICAgICAgZWRpdC50b3Aud2FrZXVwKCkKKyAgICAgICAgICAgIHJldHVybiBlZGl0CisgICAgICAgIGlmIGFjdGlvbjoKKyAgICAgICAgICAgICMgRG9uJ3QgY3JlYXRlIHdpbmRvdywgcGVyZm9ybSAnYWN0aW9uJywgZS5nLiBvcGVuIGluIHNhbWUgd2luZG93CisgICAgICAgICAgICByZXR1cm4gYWN0aW9uKGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuRWRpdG9yV2luZG93KHNlbGYsIGZpbGVuYW1lLCBrZXkpCisKKyAgICBkZWYgZ290b2ZpbGVsaW5lKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIGVkaXQgPSBzZWxmLm9wZW4oZmlsZW5hbWUpCisgICAgICAgIGlmIGVkaXQgaXMgbm90IE5vbmUgYW5kIGxpbmVubyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVkaXQuZ290b2xpbmUobGluZW5vKQorCisgICAgZGVmIG5ldyhzZWxmLCBmaWxlbmFtZT1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuRWRpdG9yV2luZG93KHNlbGYsIGZpbGVuYW1lKQorCisgICAgZGVmIGNsb3NlX2FsbF9jYWxsYmFjayhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgZm9yIGVkaXQgaW4gc2VsZi5pbnZlcnNlZGljdC5rZXlzKCk6CisgICAgICAgICAgICByZXBseSA9IGVkaXQuY2xvc2UoKQorICAgICAgICAgICAgaWYgcmVwbHkgPT0gImNhbmNlbCI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiB1bnJlZ2lzdGVyX21heWJlX3Rlcm1pbmF0ZShzZWxmLCBlZGl0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2V5ID0gc2VsZi5pbnZlcnNlZGljdFtlZGl0XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwcmludCAiRG9uJ3Qga25vdyB0aGlzIEVkaXRvcldpbmRvdyBvYmplY3QuICAoY2xvc2UpIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGtleToKKyAgICAgICAgICAgIGRlbCBzZWxmLmRpY3Rba2V5XQorICAgICAgICBkZWwgc2VsZi5pbnZlcnNlZGljdFtlZGl0XQorICAgICAgICBpZiBub3Qgc2VsZi5pbnZlcnNlZGljdDoKKyAgICAgICAgICAgIHNlbGYucm9vdC5xdWl0KCkKKworICAgIGRlZiBmaWxlbmFtZV9jaGFuZ2VkX2VkaXQoc2VsZiwgZWRpdCk6CisgICAgICAgIGVkaXQuc2F2ZWRfY2hhbmdlX2hvb2soKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBrZXkgPSBzZWxmLmludmVyc2VkaWN0W2VkaXRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHByaW50ICJEb24ndCBrbm93IHRoaXMgRWRpdG9yV2luZG93IG9iamVjdC4gIChyZW5hbWUpIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbGVuYW1lID0gZWRpdC5pby5maWxlbmFtZQorICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICBpZiBrZXk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGljdFtrZXldCisgICAgICAgICAgICBzZWxmLmludmVyc2VkaWN0W2VkaXRdID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jYW5vbml6ZShmaWxlbmFtZSkKKyAgICAgICAgbmV3a2V5ID0gb3MucGF0aC5ub3JtY2FzZShmaWxlbmFtZSkKKyAgICAgICAgaWYgbmV3a2V5ID09IGtleToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBuZXdrZXkgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgY29uZmxpY3QgPSBzZWxmLmRpY3RbbmV3a2V5XQorICAgICAgICAgICAgc2VsZi5pbnZlcnNlZGljdFtjb25mbGljdF0gPSBOb25lCisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKAorICAgICAgICAgICAgICAgICJOYW1lIENvbmZsaWN0IiwKKyAgICAgICAgICAgICAgICAiWW91IG5vdyBoYXZlIG11bHRpcGxlIGVkaXQgd2luZG93cyBvcGVuIGZvciAlciIgJSAoZmlsZW5hbWUsKSwKKyAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi5yb290KQorICAgICAgICBzZWxmLmRpY3RbbmV3a2V5XSA9IGVkaXQKKyAgICAgICAgc2VsZi5pbnZlcnNlZGljdFtlZGl0XSA9IG5ld2tleQorICAgICAgICBpZiBrZXk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGljdFtrZXldCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNhbm9uaXplKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNhYnMoZmlsZW5hbWUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHB3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihwd2QsIGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gb3MucGF0aC5ub3JtcGF0aChmaWxlbmFtZSkKKworCitkZWYgX3Rlc3QoKToKKyAgICBmcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBmaXh3b3JkYnJlYWtzCisgICAgaW1wb3J0IHN5cworICAgIHJvb3QgPSBUaygpCisgICAgZml4d29yZGJyZWFrcyhyb290KQorICAgIHJvb3Qud2l0aGRyYXcoKQorICAgIGZsaXN0ID0gRmlsZUxpc3Qocm9vdCkKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICBmbGlzdC5vcGVuKGZpbGVuYW1lKQorICAgIGVsc2U6CisgICAgICAgIGZsaXN0Lm5ldygpCisgICAgaWYgZmxpc3QuaW52ZXJzZWRpY3Q6CisgICAgICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9GaWxlTGlzdC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRmlsZUxpc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkODRjOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRmlsZUxpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9GaWxlTGlzdC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRmlsZUxpc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmM2U2ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRmlsZUxpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Gb3JtYXRQYXJhZ3JhcGgucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1N2Q4YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5CkBAIC0wLDAgKzEsMTUwIEBACisjIEV4dGVuc2lvbiB0byBmb3JtYXQgYSBwYXJhZ3JhcGgKKworIyBEb2VzIGJhc2ljLCBzdGFuZGFyZCB0ZXh0IGZvcm1hdHRpbmcsIGFuZCBhbHNvIHVuZGVyc3RhbmRzIFB5dGhvbgorIyBjb21tZW50IGJsb2Nrcy4gIFRodXMsIGZvciBlZGl0aW5nIFB5dGhvbiBzb3VyY2UgY29kZSwgdGhpcworIyBleHRlbnNpb24gaXMgcmVhbGx5IG9ubHkgc3VpdGFibGUgZm9yIHJlZm9ybWF0dGluZyB0aGVzZSBjb21tZW50CisjIGJsb2NrcyBvciB0cmlwbGUtcXVvdGVkIHN0cmluZ3MuCisKKyMgS25vd24gcHJvYmxlbXMgd2l0aCBjb21tZW50IHJlZm9ybWF0dGluZzoKKyMgKiBJZiB0aGVyZSBpcyBhIHNlbGVjdGlvbiBtYXJrZWQsIGFuZCB0aGUgZmlyc3QgbGluZSBvZiB0aGUKKyMgICBzZWxlY3Rpb24gaXMgbm90IGNvbXBsZXRlLCB0aGUgYmxvY2sgd2lsbCBwcm9iYWJseSBub3QgYmUgZGV0ZWN0ZWQKKyMgICBhcyBjb21tZW50cywgYW5kIHdpbGwgaGF2ZSB0aGUgbm9ybWFsICJ0ZXh0IGZvcm1hdHRpbmciIHJ1bGVzCisjICAgYXBwbGllZC4KKyMgKiBJZiBhIGNvbW1lbnQgYmxvY2sgaGFzIGxlYWRpbmcgd2hpdGVzcGFjZSB0aGF0IG1peGVzIHRhYnMgYW5kCisjICAgc3BhY2VzLCB0aGV5IHdpbGwgbm90IGJlIGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgc2FtZSBibG9jay4KKyMgKiBGYW5jeSBjb21tZW50cywgbGlrZSB0aGlzIGJ1bGxldGVkIGxpc3QsIGFyZW50IGhhbmRsZWQgOi0pCisKK2ltcG9ydCByZQorZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKK2NsYXNzIEZvcm1hdFBhcmFncmFwaDoKKworICAgIG1lbnVkZWZzID0gWworICAgICAgICAoJ2Zvcm1hdCcsIFsgICAjIC9zL2VkaXQvZm9ybWF0ICAgZHNjaGVyZXJAY211LmVkdQorICAgICAgICAgICAgKCdGb3JtYXQgUGFyYWdyYXBoJywgJzw8Zm9ybWF0LXBhcmFncmFwaD4+JyksCisgICAgICAgICBdKQorICAgIF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmVkaXR3aW4gPSBOb25lCisKKyAgICBkZWYgZm9ybWF0X3BhcmFncmFwaF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIG1heGZvcm1hdHdpZHRoID0gaW50KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0Zvcm1hdFBhcmFncmFwaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyYWdyYXBoJywgdHlwZT0naW50JykpCisgICAgICAgIHRleHQgPSBzZWxmLmVkaXR3aW4udGV4dAorICAgICAgICBmaXJzdCwgbGFzdCA9IHNlbGYuZWRpdHdpbi5nZXRfc2VsZWN0aW9uX2luZGljZXMoKQorICAgICAgICBpZiBmaXJzdCBhbmQgbGFzdDoKKyAgICAgICAgICAgIGRhdGEgPSB0ZXh0LmdldChmaXJzdCwgbGFzdCkKKyAgICAgICAgICAgIGNvbW1lbnRfaGVhZGVyID0gJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0LCBsYXN0LCBjb21tZW50X2hlYWRlciwgZGF0YSA9IFwKKyAgICAgICAgICAgICAgICAgICAgZmluZF9wYXJhZ3JhcGgodGV4dCwgdGV4dC5pbmRleCgiaW5zZXJ0IikpCisgICAgICAgIGlmIGNvbW1lbnRfaGVhZGVyOgorICAgICAgICAgICAgIyBSZWZvcm1hdCB0aGUgY29tbWVudCBsaW5lcyAtIGNvbnZlcnQgdG8gdGV4dCBzYW5zIGhlYWRlci4KKyAgICAgICAgICAgIGxpbmVzID0gZGF0YS5zcGxpdCgiXG4iKQorICAgICAgICAgICAgbGluZXMgPSBtYXAobGFtYmRhIHN0LCBsPWxlbihjb21tZW50X2hlYWRlcik6IHN0W2w6XSwgbGluZXMpCisgICAgICAgICAgICBkYXRhID0gIlxuIi5qb2luKGxpbmVzKQorICAgICAgICAgICAgIyBSZWZvcm1hdCB0byBtYXhmb3JtYXR3aWR0aCBjaGFycyBvciBhIDIwIGNoYXIgd2lkdGgsIHdoaWNoZXZlciBpcyBncmVhdGVyLgorICAgICAgICAgICAgZm9ybWF0X3dpZHRoID0gbWF4KG1heGZvcm1hdHdpZHRoIC0gbGVuKGNvbW1lbnRfaGVhZGVyKSwgMjApCisgICAgICAgICAgICBuZXdkYXRhID0gcmVmb3JtYXRfcGFyYWdyYXBoKGRhdGEsIGZvcm1hdF93aWR0aCkKKyAgICAgICAgICAgICMgcmUtc3BsaXQgYW5kIHJlLWluc2VydCB0aGUgY29tbWVudCBoZWFkZXIuCisgICAgICAgICAgICBuZXdkYXRhID0gbmV3ZGF0YS5zcGxpdCgiXG4iKQorICAgICAgICAgICAgIyBJZiB0aGUgYmxvY2sgZW5kcyBpbiBhIFxuLCB3ZSBkb250IHdhbnQgdGhlIGNvbW1lbnQKKyAgICAgICAgICAgICMgcHJlZml4IGluc2VydGVkIGFmdGVyIGl0LiAoSW0gbm90IHN1cmUgaXQgbWFrZXMgc2Vuc2UgdG8KKyAgICAgICAgICAgICMgcmVmb3JtYXQgYSBjb21tZW50IGJsb2NrIHRoYXQgaXNudCBtYWRlIG9mIGNvbXBsZXRlCisgICAgICAgICAgICAjIGxpbmVzLCBidXQgd2hhdGV2ZXIhKSAgQ2FuJ3QgdGhpbmsgb2YgYSBjbGVhbiBzb2x1dGlvbiwKKyAgICAgICAgICAgICMgc28gd2UgaGFjayBhd2F5CisgICAgICAgICAgICBibG9ja19zdWZmaXggPSAiIgorICAgICAgICAgICAgaWYgbm90IG5ld2RhdGFbLTFdOgorICAgICAgICAgICAgICAgIGJsb2NrX3N1ZmZpeCA9ICJcbiIKKyAgICAgICAgICAgICAgICBuZXdkYXRhID0gbmV3ZGF0YVs6LTFdCisgICAgICAgICAgICBidWlsZGVyID0gbGFtYmRhIGl0ZW0sIHByZWZpeD1jb21tZW50X2hlYWRlcjogcHJlZml4K2l0ZW0KKyAgICAgICAgICAgIG5ld2RhdGEgPSAnXG4nLmpvaW4obWFwKGJ1aWxkZXIsIG5ld2RhdGEpKSArIGJsb2NrX3N1ZmZpeAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBKdXN0IGEgbm9ybWFsIHRleHQgZm9ybWF0CisgICAgICAgICAgICBuZXdkYXRhID0gcmVmb3JtYXRfcGFyYWdyYXBoKGRhdGEsIG1heGZvcm1hdHdpZHRoKQorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgaWYgbmV3ZGF0YSAhPSBkYXRhOgorICAgICAgICAgICAgdGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgZmlyc3QpCisgICAgICAgICAgICB0ZXh0LnVuZG9fYmxvY2tfc3RhcnQoKQorICAgICAgICAgICAgdGV4dC5kZWxldGUoZmlyc3QsIGxhc3QpCisgICAgICAgICAgICB0ZXh0Lmluc2VydChmaXJzdCwgbmV3ZGF0YSkKKyAgICAgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGxhc3QpCisgICAgICAgIHRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCitkZWYgZmluZF9wYXJhZ3JhcGgodGV4dCwgbWFyayk6CisgICAgbGluZW5vLCBjb2wgPSBtYXAoaW50LCBtYXJrLnNwbGl0KCIuIikpCisgICAgbGluZSA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmVubywgIiVkLjAgbGluZWVuZCIgJSBsaW5lbm8pCisgICAgd2hpbGUgdGV4dC5jb21wYXJlKCIlZC4wIiAlIGxpbmVubywgIjwiLCAiZW5kIikgYW5kIGlzX2FsbF93aGl0ZShsaW5lKToKKyAgICAgICAgbGluZW5vID0gbGluZW5vICsgMQorICAgICAgICBsaW5lID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZW5vLCAiJWQuMCBsaW5lZW5kIiAlIGxpbmVubykKKyAgICBmaXJzdF9saW5lbm8gPSBsaW5lbm8KKyAgICBjb21tZW50X2hlYWRlciA9IGdldF9jb21tZW50X2hlYWRlcihsaW5lKQorICAgIGNvbW1lbnRfaGVhZGVyX2xlbiA9IGxlbihjb21tZW50X2hlYWRlcikKKyAgICB3aGlsZSBnZXRfY29tbWVudF9oZWFkZXIobGluZSk9PWNvbW1lbnRfaGVhZGVyIGFuZCBcCisgICAgICAgICAgICAgIG5vdCBpc19hbGxfd2hpdGUobGluZVtjb21tZW50X2hlYWRlcl9sZW46XSk6CisgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgbGluZSA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmVubywgIiVkLjAgbGluZWVuZCIgJSBsaW5lbm8pCisgICAgbGFzdCA9ICIlZC4wIiAlIGxpbmVubworICAgICMgU2VhcmNoIGJhY2sgdG8gYmVnaW5uaW5nIG9mIHBhcmFncmFwaAorICAgIGxpbmVubyA9IGZpcnN0X2xpbmVubyAtIDEKKyAgICBsaW5lID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZW5vLCAiJWQuMCBsaW5lZW5kIiAlIGxpbmVubykKKyAgICB3aGlsZSBsaW5lbm8gPiAwIGFuZCBcCisgICAgICAgICAgICAgIGdldF9jb21tZW50X2hlYWRlcihsaW5lKT09Y29tbWVudF9oZWFkZXIgYW5kIFwKKyAgICAgICAgICAgICAgbm90IGlzX2FsbF93aGl0ZShsaW5lW2NvbW1lbnRfaGVhZGVyX2xlbjpdKToKKyAgICAgICAgbGluZW5vID0gbGluZW5vIC0gMQorICAgICAgICBsaW5lID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZW5vLCAiJWQuMCBsaW5lZW5kIiAlIGxpbmVubykKKyAgICBmaXJzdCA9ICIlZC4wIiAlIChsaW5lbm8rMSkKKyAgICByZXR1cm4gZmlyc3QsIGxhc3QsIGNvbW1lbnRfaGVhZGVyLCB0ZXh0LmdldChmaXJzdCwgbGFzdCkKKworZGVmIHJlZm9ybWF0X3BhcmFncmFwaChkYXRhLCBsaW1pdCk6CisgICAgbGluZXMgPSBkYXRhLnNwbGl0KCJcbiIpCisgICAgaSA9IDAKKyAgICBuID0gbGVuKGxpbmVzKQorICAgIHdoaWxlIGkgPCBuIGFuZCBpc19hbGxfd2hpdGUobGluZXNbaV0pOgorICAgICAgICBpID0gaSsxCisgICAgaWYgaSA+PSBuOgorICAgICAgICByZXR1cm4gZGF0YQorICAgIGluZGVudDEgPSBnZXRfaW5kZW50KGxpbmVzW2ldKQorICAgIGlmIGkrMSA8IG4gYW5kIG5vdCBpc19hbGxfd2hpdGUobGluZXNbaSsxXSk6CisgICAgICAgIGluZGVudDIgPSBnZXRfaW5kZW50KGxpbmVzW2krMV0pCisgICAgZWxzZToKKyAgICAgICAgaW5kZW50MiA9IGluZGVudDEKKyAgICBuZXcgPSBsaW5lc1s6aV0KKyAgICBwYXJ0aWFsID0gaW5kZW50MQorICAgIHdoaWxlIGkgPCBuIGFuZCBub3QgaXNfYWxsX3doaXRlKGxpbmVzW2ldKToKKyAgICAgICAgIyBYWFggU2hvdWxkIHRha2UgZG91YmxlIHNwYWNlIGFmdGVyIHBlcmlvZCAoZXRjLikgaW50byBhY2NvdW50CisgICAgICAgIHdvcmRzID0gcmUuc3BsaXQoIihccyspIiwgbGluZXNbaV0pCisgICAgICAgIGZvciBqIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgorICAgICAgICAgICAgd29yZCA9IHdvcmRzW2pdCisgICAgICAgICAgICBpZiBub3Qgd29yZDoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAjIENhbiBoYXBwZW4gd2hlbiBsaW5lIGVuZHMgaW4gd2hpdGVzcGFjZQorICAgICAgICAgICAgaWYgbGVuKChwYXJ0aWFsICsgd29yZCkuZXhwYW5kdGFicygpKSA+IGxpbWl0IGFuZCBcCisgICAgICAgICAgICAgICBwYXJ0aWFsICE9IGluZGVudDE6CisgICAgICAgICAgICAgICAgbmV3LmFwcGVuZChwYXJ0aWFsLnJzdHJpcCgpKQorICAgICAgICAgICAgICAgIHBhcnRpYWwgPSBpbmRlbnQyCisgICAgICAgICAgICBwYXJ0aWFsID0gcGFydGlhbCArIHdvcmQgKyAiICIKKyAgICAgICAgICAgIGlmIGorMSA8IGxlbih3b3JkcykgYW5kIHdvcmRzW2orMV0gIT0gIiAiOgorICAgICAgICAgICAgICAgIHBhcnRpYWwgPSBwYXJ0aWFsICsgIiAiCisgICAgICAgIGkgPSBpKzEKKyAgICBuZXcuYXBwZW5kKHBhcnRpYWwucnN0cmlwKCkpCisgICAgIyBYWFggU2hvdWxkIHJlZm9ybWF0IHJlbWFpbmluZyBwYXJhZ3JhcGhzIGFzIHdlbGwKKyAgICBuZXcuZXh0ZW5kKGxpbmVzW2k6XSkKKyAgICByZXR1cm4gIlxuIi5qb2luKG5ldykKKworZGVmIGlzX2FsbF93aGl0ZShsaW5lKToKKyAgICByZXR1cm4gcmUubWF0Y2gociJeXHMqJCIsIGxpbmUpIGlzIG5vdCBOb25lCisKK2RlZiBnZXRfaW5kZW50KGxpbmUpOgorICAgIHJldHVybiByZS5tYXRjaChyIl4oXHMqKSIsIGxpbmUpLmdyb3VwKCkKKworZGVmIGdldF9jb21tZW50X2hlYWRlcihsaW5lKToKKyAgICBtID0gcmUubWF0Y2gociJeKFxzKiMqKSIsIGxpbmUpCisgICAgaWYgbSBpcyBOb25lOiByZXR1cm4gIiIKKyAgICByZXR1cm4gbS5ncm91cCgxKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmM2NmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvRm9ybWF0UGFyYWdyYXBoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmM2NmI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0Zvcm1hdFBhcmFncmFwaC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0dyZXBEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvR3JlcERpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDBlNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0dyZXBEaWFsb2cucHkKQEAgLTAsMCArMSwxMzMgQEAKK2ltcG9ydCBvcworaW1wb3J0IGZubWF0Y2gKK2ltcG9ydCBzeXMKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUKK2Zyb20gaWRsZWxpYi5TZWFyY2hEaWFsb2dCYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCisKK2RlZiBncmVwKHRleHQsIGlvPU5vbmUsIGZsaXN0PU5vbmUpOgorICAgIHJvb3QgPSB0ZXh0Ll9yb290KCkKKyAgICBlbmdpbmUgPSBTZWFyY2hFbmdpbmUuZ2V0KHJvb3QpCisgICAgaWYgbm90IGhhc2F0dHIoZW5naW5lLCAiX2dyZXBkaWFsb2ciKToKKyAgICAgICAgZW5naW5lLl9ncmVwZGlhbG9nID0gR3JlcERpYWxvZyhyb290LCBlbmdpbmUsIGZsaXN0KQorICAgIGRpYWxvZyA9IGVuZ2luZS5fZ3JlcGRpYWxvZworICAgIHNlYXJjaHBocmFzZSA9IHRleHQuZ2V0KCJzZWwuZmlyc3QiLCAic2VsLmxhc3QiKQorICAgIGRpYWxvZy5vcGVuKHRleHQsIHNlYXJjaHBocmFzZSwgaW8pCisKK2NsYXNzIEdyZXBEaWFsb2coU2VhcmNoRGlhbG9nQmFzZSk6CisKKyAgICB0aXRsZSA9ICJGaW5kIGluIEZpbGVzIERpYWxvZyIKKyAgICBpY29uID0gIkdyZXAiCisgICAgbmVlZHdyYXBidXR0b24gPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCwgZW5naW5lLCBmbGlzdCk6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuX19pbml0X18oc2VsZiwgcm9vdCwgZW5naW5lKQorICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKKyAgICAgICAgc2VsZi5nbG9idmFyID0gU3RyaW5nVmFyKHJvb3QpCisgICAgICAgIHNlbGYucmVjdmFyID0gQm9vbGVhblZhcihyb290KQorCisgICAgZGVmIG9wZW4oc2VsZiwgdGV4dCwgc2VhcmNocGhyYXNlLCBpbz1Ob25lKToKKyAgICAgICAgU2VhcmNoRGlhbG9nQmFzZS5vcGVuKHNlbGYsIHRleHQsIHNlYXJjaHBocmFzZSkKKyAgICAgICAgaWYgaW86CisgICAgICAgICAgICBwYXRoID0gaW8uZmlsZW5hbWUgb3IgIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSAiIgorICAgICAgICBkaXIsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisgICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2UpCisgICAgICAgIGlmIG5vdCB0YWlsOgorICAgICAgICAgICAgdGFpbCA9ICIucHkiCisgICAgICAgIHNlbGYuZ2xvYnZhci5zZXQob3MucGF0aC5qb2luKGRpciwgIioiICsgdGFpbCkpCisKKyAgICBkZWYgY3JlYXRlX2VudHJpZXMoc2VsZik6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2VudHJpZXMoc2VsZikKKyAgICAgICAgc2VsZi5nbG9iZW50ID0gc2VsZi5tYWtlX2VudHJ5KCJJbiBmaWxlczoiLCBzZWxmLmdsb2J2YXIpCisKKyAgICBkZWYgY3JlYXRlX290aGVyX2J1dHRvbnMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm1ha2VfZnJhbWUoKQorCisgICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGYsIGFuY2hvcj0idyIsCisgICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5yZWN2YXIsCisgICAgICAgICAgICAgICAgdGV4dD0iUmVjdXJzZSBkb3duIHN1YmRpcmVjdG9yaWVzIikKKyAgICAgICAgYnRuLnBhY2soc2lkZT0idG9wIiwgZmlsbD0iYm90aCIpCisgICAgICAgIGJ0bi5zZWxlY3QoKQorCisgICAgZGVmIGNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKQorICAgICAgICBzZWxmLm1ha2VfYnV0dG9uKCJTZWFyY2ggRmlsZXMiLCBzZWxmLmRlZmF1bHRfY29tbWFuZCwgMSkKKworICAgIGRlZiBkZWZhdWx0X2NvbW1hbmQoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHByb2cgPSBzZWxmLmVuZ2luZS5nZXRwcm9nKCkKKyAgICAgICAgaWYgbm90IHByb2c6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGF0aCA9IHNlbGYuZ2xvYnZhci5nZXQoKQorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIHNlbGYudG9wLmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZyb20gaWRsZWxpYi5PdXRwdXRXaW5kb3cgaW1wb3J0IE91dHB1dFdpbmRvdworICAgICAgICBzYXZlID0gc3lzLnN0ZG91dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gT3V0cHV0V2luZG93KHNlbGYuZmxpc3QpCisgICAgICAgICAgICBzZWxmLmdyZXBfaXQocHJvZywgcGF0aCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlCisKKyAgICBkZWYgZ3JlcF9pdChzZWxmLCBwcm9nLCBwYXRoKToKKyAgICAgICAgZGlyLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICBsaXN0ID0gc2VsZi5maW5kZmlsZXMoZGlyLCBiYXNlLCBzZWxmLnJlY3Zhci5nZXQoKSkKKyAgICAgICAgbGlzdC5zb3J0KCkKKyAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIHBhdCA9IHNlbGYuZW5naW5lLmdldHBhdCgpCisgICAgICAgIHByaW50ICJTZWFyY2hpbmcgJXIgaW4gJXMgLi4uIiAlIChwYXQsIHBhdGgpCisgICAgICAgIGhpdHMgPSAwCisgICAgICAgIGZvciBmbiBpbiBsaXN0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZuKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGluZW5vID0gMAorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBibG9jayA9IGYucmVhZGxpbmVzKDEwMDAwMCkKKyAgICAgICAgICAgICAgICBpZiBub3QgYmxvY2s6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gYmxvY2s6CisgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZVstMTpdID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6LTFdCisgICAgICAgICAgICAgICAgICAgIGlmIHByb2cuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiJXM6ICVzOiAlc1xuIiAlIChmbiwgbGluZW5vLCBsaW5lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpdHMgPSBoaXRzICsgMQorICAgICAgICBpZiBoaXRzOgorICAgICAgICAgICAgaWYgaGl0cyA9PSAxOgorICAgICAgICAgICAgICAgIHMgPSAiIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzID0gInMiCisgICAgICAgICAgICBwcmludCAiRm91bmQiLCBoaXRzLCAiaGl0JXMuIiAlIHMKKyAgICAgICAgICAgIHByaW50ICIoSGludDogcmlnaHQtY2xpY2sgdG8gb3BlbiBsb2NhdGlvbnMuKSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJObyBoaXRzLiIKKworICAgIGRlZiBmaW5kZmlsZXMoc2VsZiwgZGlyLCBiYXNlLCByZWMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIoZGlyIG9yIG9zLmN1cmRpcikKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yLCBtc2c6CisgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgc3ViZGlycyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihmbik6CisgICAgICAgICAgICAgICAgc3ViZGlycy5hcHBlbmQoZm4pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGZubWF0Y2guZm5tYXRjaChuYW1lLCBiYXNlKToKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoZm4pCisgICAgICAgIGlmIHJlYzoKKyAgICAgICAgICAgIGZvciBzdWJkaXIgaW4gc3ViZGlyczoKKyAgICAgICAgICAgICAgICBsaXN0LmV4dGVuZChzZWxmLmZpbmRmaWxlcyhzdWJkaXIsIGJhc2UsIHJlYykpCisgICAgICAgIHJldHVybiBsaXN0CisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYudG9wOgorICAgICAgICAgICAgc2VsZi50b3AuZ3JhYl9yZWxlYXNlKCkKKyAgICAgICAgICAgIHNlbGYudG9wLndpdGhkcmF3KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVhOGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0dyZXBEaWFsb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9HcmVwRGlhbG9nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVhOGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0dyZXBEaWFsb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ISVNUT1JZLnR4dCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ISVNUT1JZLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQ3M2VkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0hJU1RPUlkudHh0CkBAIC0wLDAgKzEsMjk2IEBACitJRExFIEhpc3RvcnkKKz09PT09PT09PT09PQorCitUaGlzIGZpbGUgY29udGFpbnMgdGhlIHJlbGVhc2UgbWVzc2FnZXMgZm9yIHByZXZpb3VzIElETEUgcmVsZWFzZXMuCitBcyB5b3UgcmVhZCBvbiB5b3UgZ28gYmFjayB0byB0aGUgZGFyayBhZ2VzIG9mIElETEUncyBoaXN0b3J5LgorCisKK1doYXQncyBOZXcgaW4gSURMRWZvcmsgMC44LjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyMi1KdWwtMjAwMSoKKworLSBOZXcgdGFyYmFsbCByZWxlYXNlZCBhcyBhIHJlc3VsdCBvZiB0aGUgJ3Jldml0YWxpc2F0aW9uJyBvZiB0aGUgSURMRWZvcmsKKyAgcHJvamVjdC4gCisKKy0gVGhpcyByZWxlYXNlIHJlcXVpcmVzIHB5dGhvbiAyLjEgb3IgYmV0dGVyLiBDb21wYXRpYmlsaXR5IHdpdGggZWFybGllcgorICB2ZXJzaW9ucyBvZiBweXRob24gKGVzcGVjaWFsbHkgYW5jaWVudCBvbmVzIGxpa2UgMS41eCkgaXMgbm8gbG9uZ2VyIGEKKyAgcHJpb3JpdHkgaW4gSURMRWZvcmsgZGV2ZWxvcG1lbnQuCisKKy0gVGhpcyByZWxlYXNlIGlzIGJhc2VkIG9uIGEgbWVyZ2luZyBvZiB0aGUgZWFybGllciBJRExFIGZvcmsgd29yayB3aXRoIGN1cnJlbnQKKyAgY3ZzIElETEUgKHBvc3QgSURMRSB2ZXJzaW9uIDAuOCksIHdpdGggc29tZSBtaW5vciBhZGRpdGlvbmFsIGNvZGluZyBieSBLdXJ0CisgIEIuIEthaXNlciBhbmQgU3RlcGhlbiBNLiBHYXZhLgorCistIFRoaXMgcmVsZWFzZSBpcyBiYXNpY2FsbHkgZnVuY3Rpb25hbCBidXQgYWxzbyBjb250YWlucyBzb21lIGtub3duIGJyZWFrYWdlcywKKyAgcGFydGljdWxhcmx5IHdpdGggcnVubmluZyB0aGluZ3MgZnJvbSB0aGUgc2hlbGwgd2luZG93LiBBbHNvIHRoZSBkZWJ1Z2dlciBpcworICBub3Qgd29ya2luZywgYnV0IEkgYmVsaWV2ZSB0aGlzIHdhcyB0aGUgY2FzZSB3aXRoIHRoZSBwcmV2aW91cyBJRExFIGZvcmsKKyAgcmVsZWFzZSAoMC43LjEpIGFzIHdlbGwuCisKKy0gVGhpcyByZWxlYXNlIGlzIGJlaW5nIG1hZGUgbm93IHRvIG1hcmsgdGhlIHBvaW50IGF0IHdoaWNoIElETEVmb3JrIGlzIAorICBsYXVuY2hpbmcgaW50byBhIG5ldyBzdGFnZSBvZiBkZXZlbG9wbWVudC4gCisKKy0gSURMRWZvcmsgQ1ZTIHdpbGwgbm93IGJlIGJyYW5jaGVkIHRvIGVuYWJsZSBmdXJ0aGVyIGRldmVsb3BtZW50IGFuZAorICBleHBsb3JhdGlvbiBvZiB0aGUgdHdvICJleGVjdXRpb24gaW4gYSByZW1vdGUgcHJvY2VzcyIgcGF0Y2hlcyBzdWJtaXR0ZWQgYnkKKyAgRGF2aWQgU2NoZXJlciAoRGF2aWQncyBpcyBjdXJyZW50bHkgaW4gSURMRWZvcmspIGFuZCBHdlIsIHdoaWxlIHN0YWJpbGlzYXRpb24KKyAgYW5kIGRldmVsb3BtZW50IG9mIGxlc3MgaGVhdnl3ZWlnaHQgaW1wcm92ZW1lbnRzIChsaWtlIHVzZXIgY3VzdG9taXNhdGlvbikKKyAgY2FuIGNvbnRpbnVlIG9uIHRoZSB0cnVuay4KKworCitXaGF0J3MgTmV3IGluIElETEVmb3JrIDAuNy4xPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE1LUF1Zy0yMDAwKgorCistIEZpcnN0IHByb2plY3QgdGFyYmFsbCByZWxlYXNlZC4KKworLSBUaGlzIHdhcyB0aGUgZmlyc3QgcmVsZWFzZSBvZiBJRExFIGZvcmssIHdoaWNoIGF0IHRoaXMgc3RhZ2Ugd2FzIGEKKyAgY29tYmluYXRpb24gb2YgSURMRSAwLjUgYW5kIHRoZSBWUHl0aG9uIGlkbGUgZm9yaywgd2l0aCBhZGRpdGlvbmFsIGNoYW5nZXMKKyAgY29kZWQgYnkgRGF2aWQgU2NoZXJlciwgUGV0ZXIgU2NobmVpZGVyLUthbXAgYW5kIE5pY2hvbGFzIFJpbGV5LgorCisKKworSURMRWZvcmsgMC43LjEgLSAyOSBNYXkgMjAwMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgRGF2aWQgU2NoZXJlciAgPGRzY2hlcmVyQGNtdS5lZHU+CisKKy0gVGhpcyBpcyBhIG1vZGlmaWNhdGlvbiBvZiB0aGUgQ1ZTIHZlcnNpb24gb2YgSURMRSAwLjUsIHVwZGF0ZWQgYXMgb2YKKyAgMjAwMC0wMy0wOS4gIEl0IGlzIGFscGhhIHNvZnR3YXJlIGFuZCBtaWdodCBiZSB1bnN0YWJsZS4gIElmIGl0IGJyZWFrcywgeW91CisgIGdldCB0byBrZWVwIGJvdGggcGllY2VzLgorCistIElmIHlvdSBoYXZlIHByb2JsZW1zIG9yIHN1Z2dlc3Rpb25zLCB5b3Ugc2hvdWxkIGVpdGhlciBjb250YWN0IG1lIG9yIHBvc3QgdG8KKyAgdGhlIGxpc3QgYXQgaHR0cDovL3d3dy5weXRob24ub3JnL21haWxtYW4vbGlzdGluZm8vaWRsZS1kZXYgKG1ha2luZyBpdCBjbGVhcgorICB0aGF0IHlvdSBhcmUgdXNpbmcgdGhpcyBtb2RpZmllZCB2ZXJzaW9uIG9mIElETEUpLgorCistIENoYW5nZXM6CisKKyAgLSBUaGUgRXhlY0JpbmRpbmcgbW9kdWxlLCBhIHJlcGxhY2VtZW50IGZvciBTY3JpcHRCaW5kaW5nLCBleGVjdXRlcyBwcm9ncmFtcworICAgIGluIGEgc2VwYXJhdGUgcHJvY2VzcywgcGlwaW5nIHN0YW5kYXJkIEkvTyB0aHJvdWdoIGFuIFJQQyBtZWNoYW5pc20gdG8gYW4KKyAgICBPbkRlbWFuZE91dHB1dFdpbmRvdyBpbiBJRExFLiAgSXQgc3VwcG9ydHMgZXhlY3V0aW5nIHVubmFtZWQgcHJvZ3JhbXMKKyAgICAodGhyb3VnaCBhIHRlbXBvcmFyeSBmaWxlKS4gIEl0IGRvZXMgbm90IHlldCBzdXBwb3J0IGRlYnVnZ2luZy4KKworICAtIFdoZW4gcnVubmluZyBwcm9ncmFtcyB3aXRoIEV4ZWNCaW5kaW5nLCB0cmFjZWJhY2tzIHdpbGwgYmUgY2xpcHBlZCB0bworICAgIGV4Y2x1ZGUgc3lzdGVtIG1vZHVsZXMuICBJZiwgaG93ZXZlciwgYSBzeXN0ZW0gbW9kdWxlIGNhbGxzIGJhY2sgaW50byB0aGUKKyAgICB1c2VyIHByb2dyYW0sIHRoYXQgcGFydCBvZiB0aGUgdHJhY2ViYWNrIHdpbGwgYmUgc2hvd24uCisKKyAgLSBUaGUgT25EZW1hbmRPdXRwdXRXaW5kb3cgY2xhc3MgaGFzIGJlZW4gaW1wcm92ZWQuICBJbiBwYXJ0aWN1bGFyLCBpdCBub3cKKyAgICBzdXBwb3J0cyBhIHJlYWRsaW5lKCkgZnVuY3Rpb24gdXNlZCB0byBpbXBsZW1lbnQgdXNlciBpbnB1dCwgYW5kIGEKKyAgICBzY3JvbGxfY2xlYXIoKSBvcGVyYXRpb24gd2hpY2ggaXMgdXNlZCB0byBoaWRlIHRoZSBvdXRwdXQgb2YgYSBwcmV2aW91cyBydW4KKyAgICBieSBzY3JvbGxpbmcgaXQgb3V0IG9mIHRoZSB3aW5kb3cuCisKKyAgLSBTdGFydHVwIGJlaGF2aW9yIGhhcyBiZWVuIGNoYW5nZWQuICBCeSBkZWZhdWx0IElETEUgc3RhcnRzIHVwIHdpdGgganVzdCBhCisgICAgYmxhbmsgZWRpdG9yIHdpbmRvdywgcmF0aGVyIHRoYW4gYW4gaW50ZXJhY3RpdmUgd2luZG93LiAgT3BlbmluZyBhIGZpbGUgaW4KKyAgICBzdWNoIGEgYmxhbmsgd2luZG93IHJlcGxhY2VzIHRoZSAobm9uZXhpc3RlbnQpIGNvbnRlbnRzIG9mIHRoYXQgd2luZG93CisgICAgaW5zdGVhZCBvZiBjcmVhdGluZyBhbm90aGVyIHdpbmRvdy4gIEJlY2F1c2Ugb2YgdGhlIG5lZWQgdG8gaGF2ZSBhCisgICAgd2VsbC1rbm93biBwb3J0IGZvciB0aGUgRXhlY0JpbmRpbmcgcHJvdG9jb2wsIG9ubHkgb25lIGNvcHkgb2YgSURMRSBjYW4gYmUKKyAgICBydW5uaW5nLiAgQWRkaXRpb25hbCBpbnZvY2F0aW9ucyB1c2UgdGhlIFJQQyBtZWNoYW5pc20gdG8gcmVwb3J0IHRoZWlyCisgICAgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byB0aGUgY29weSBhbHJlYWR5IHJ1bm5pbmcuCisKKyAgLSBUaGUgbWVudXMgaGF2ZSBiZWVuIHJlb3JnYW5pemVkLiAgSW4gcGFydGljdWxhciwgdGhlIGV4Y2Vzc2l2ZWx5IGxhcmdlCisgICAgJ2VkaXQnIG1lbnUgaGFzIGJlZW4gc3BsaXQgdXAgaW50byAnZWRpdCcsICdmb3JtYXQnLCBhbmQgJ3J1bicuCisKKyAgLSAnUHl0aG9uIERvY3VtZW50YXRpb24nIG5vdyB3b3JrcyBvbiBXaW5kb3dzLCBpZiB0aGUgd2luMzJhcGkgbW9kdWxlIGlzCisgICAgcHJlc2VudC4KKworICAtIEEgZmV3IGtleSBiaW5kaW5ncyBoYXZlIGJlZW4gY2hhbmdlZDogRjEgbm93IGxvYWRzIFB5dGhvbiBEb2N1bWVudGF0aW9uCisgICAgaW5zdGVhZCBvZiB0aGUgSURMRSBoZWxwOyBzaGlmdC1UQUIgaXMgbm93IGEgc3lub255bSBmb3IgdW5pbmRlbnQuCisKKy0gTmV3IG1vZHVsZXM6CisgIAorICBFeGVjQmluZGluZy5weSAgICAgICAgIEV4ZWN1dGVzIHByb2dyYW0gdGhyb3VnaCBsb2FkZXIKKyAgbG9hZGVyLnB5ICAgICAgICAgICAgICBCb290c3RyYXBzIHVzZXIgcHJvZ3JhbQorICBwcm90b2NvbC5weSAgICAgICAgICAgIFJQQyBwcm90b2NvbAorICBSZW1vdGUucHkgICAgICAgICAgICAgIFVzZXItcHJvY2VzcyBpbnRlcnByZXRlcgorICBzcGF3bi5weSAgICAgICAgICAgICAgIE9TLXNwZWNpZmljIGNvZGUgdG8gc3RhcnQgcHJvZ3JhbXMKKworLSBGaWxlcyBtb2RpZmllZDoKKworICBhdXRvaW5kZW50LnB5ICAgICAgICAgICggYmluZGluZ3MgdHdlYWtlZCApCisgIGJpbmRpbmdzLnB5ICAgICAgICAgICAgKCBtZW51cyByZW9yZ2FuaXplZCApCisgIGNvbmZpZy50eHQgICAgICAgICAgICAgKCBleGVjYmluZGluZyBlbmFibGVkICkKKyAgZWRpdG9yd2luZG93LnB5ICAgICAgICAoIG5ldyBtZW51cywgZml4ZWQgJ1B5dGhvbiBEb2N1bWVudGF0aW9uJyApCisgIGZpbGVsaXN0LnB5ICAgICAgICAgICAgKCBob29rIGZvciAib3BlbiBpbiBzYW1lIHdpbmRvdyIgKQorICBmb3JtYXRwYXJhZ3JhcGgucHkgICAgICggYmluZGluZ3MgdHdlYWtlZCApCisgIGlkbGUuYmF0ICAgICAgICAgICAgICAgKCByZW1vdmVkIGFic29sdXRlIHBhdGhuYW1lICkKKyAgaWRsZS5weXcgICAgICAgICAgICAgICAoIHdlaXJkIGJ1ZyBkdWUgdG8gaW1wb3J0IHdpdGggc2FtZSBuYW1lPyApCisgIGlvYmluZGluZy5weSAgICAgICAgICAgKCBvcGVuIGluIHNhbWUgd2luZG93LCBFT0wgY29udmVudGlvbiApCisgIGtleWRlZnMucHkgICAgICAgICAgICAgKCBiaW5kaW5ncyB0d2Vha2VkICkKKyAgb3V0cHV0d2luZG93LnB5ICAgICAgICAoIHJlYWRsaW5lLCBzY3JvbGxfY2xlYXIsIGV0YyApCisgIHB5c2hlbGwucHkgICAgICAgICAgICAgKCBjaGFuZ2VkIHN0YXJ0dXAgYmVoYXZpb3IgKQorICByZWFkbWUudHh0ICAgICAgICAgICAgICggPFJlY3Vyc2lvbiBvbiBmaWxlIHdpdGggaWQ9MTIzNDU2Nz4gKQorCisKKworSURMRSAwLjUgLSBGZWJydWFyeSAyMDAwIC0gUmVsZWFzZSBOb3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGlzIGFuIGVhcmx5IHJlbGVhc2Ugb2YgSURMRSwgbXkgb3duIGF0dGVtcHQgYXQgYSBUa2ludGVyLWJhc2VkCitJREUgZm9yIFB5dGhvbi4KKworKEZvciBhIG1vcmUgZGV0YWlsZWQgY2hhbmdlIGxvZywgc2VlIHRoZSBmaWxlIENoYW5nZUxvZy4pCisKK0ZFQVRVUkVTCisKK0lETEUgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6CisKKy0gY29kZWQgaW4gMTAwJSBwdXJlIFB5dGhvbiwgdXNpbmcgdGhlIFRraW50ZXIgR1VJIHRvb2xraXQgKGkuZS4gVGNsL1RrKQorCistIGNyb3NzLXBsYXRmb3JtOiB3b3JrcyBvbiBXaW5kb3dzIGFuZCBVbml4IChvbiB0aGUgTWFjLCB0aGVyZSBhcmUKK2N1cnJlbnRseSBwcm9ibGVtcyB3aXRoIFRjbC9UaykKKworLSBtdWx0aS13aW5kb3cgdGV4dCBlZGl0b3Igd2l0aCBtdWx0aXBsZSB1bmRvLCBQeXRob24gY29sb3JpemluZworYW5kIG1hbnkgb3RoZXIgZmVhdHVyZXMsIGUuZy4gc21hcnQgaW5kZW50IGFuZCBjYWxsIHRpcHMKKworLSBQeXRob24gc2hlbGwgd2luZG93IChhLmsuYS4gaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIpCisKKy0gZGVidWdnZXIgKG5vdCBjb21wbGV0ZSwgYnV0IHlvdSBjYW4gc2V0IGJyZWFrcG9pbnRzLCB2aWV3ICBhbmQgc3RlcCkKKworVVNBR0UKKworVGhlIG1haW4gcHJvZ3JhbSBpcyBpbiB0aGUgZmlsZSAiaWRsZS5weSI7IG9uIFVuaXgsIHlvdSBzaG91bGQgYmUgYWJsZQordG8gcnVuIGl0IGJ5IHR5cGluZyAiLi9pZGxlLnB5IiB0byB5b3VyIHNoZWxsLiAgT24gV2luZG93cywgeW91IGNhbgorcnVuIGl0IGJ5IGRvdWJsZS1jbGlja2luZyBpdDsgeW91IGNhbiB1c2UgaWRsZS5weXcgdG8gYXZvaWQgcG9wcGluZyB1cAorYSBET1MgY29uc29sZS4gIElmIHlvdSB3YW50IHRvIHBhc3MgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBvbiBXaW5kb3dzLAordXNlIHRoZSBiYXRjaCBmaWxlIGlkbGUuYmF0LgorCitDb21tYW5kIGxpbmUgYXJndW1lbnRzOiBmaWxlcyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBhcmUgZXhlY3V0ZWQsCitub3Qgb3BlbmVkIGZvciBlZGl0aW5nLCB1bmxlc3MgeW91IGdpdmUgdGhlIC1lIGNvbW1hbmQgbGluZSBvcHRpb24uCitUcnkgIi4vaWRsZS5weSAtaCIgdG8gc2VlIG90aGVyIGNvbW1hbmQgbGluZSBvcHRpb25zLgorCitJRExFIHJlcXVpcmVzIFB5dGhvbiAxLjUuMiwgc28gaXQgaXMgY3VycmVudGx5IG9ubHkgdXNhYmxlIHdpdGggYQorUHl0aG9uIDEuNS4yIGRpc3RyaWJ1dGlvbi4gIChBbiBvbGRlciB2ZXJzaW9uIG9mIElETEUgaXMgZGlzdHJpYnV0ZWQKK3dpdGggUHl0aG9uIDEuNS4yOyB5b3UgY2FuIGRyb3AgdGhpcyB2ZXJzaW9uIG9uIHRvcCBvZiBpdC4pCisKK0NPUFlSSUdIVAorCitJRExFIGlzIGNvdmVyZWQgYnkgdGhlIHN0YW5kYXJkIFB5dGhvbiBjb3B5cmlnaHQgbm90aWNlCisoaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9Db3B5cmlnaHQuaHRtbCkuCisKKworTmV3IGluIElETEUgMC41ICgyLzE1LzIwMDApCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVG9ucyBvZiBzdHVmZiwgbXVjaCBvZiBpdCBjb250cmlidXRlZCBieSBUaW0gUGV0ZXJzIGFuZCBNYXJrIEhhbW1vbmQ6CisKKy0gU3RhdHVzIGJhciwgZGlzcGxheWluZyBjdXJyZW50IGxpbmUvY29sdW1uIChNb3NoZSBaYWRrYSkuCisKKy0gQmV0dGVyIHN0YWNrIHZpZXdlciwgdXNpbmcgdHJlZSB3aWRnZXQuICAoWFhYIE9ubHkgdXNlZCBieSBTdGFjaworVmlld2VyIG1lbnUsIG5vdCBieSB0aGUgZGVidWdnZXIuKQorCistIEZvcm1hdCBwYXJhZ3JhcGggbm93IHJlY29nbml6ZXMgUHl0aG9uIGJsb2NrIGNvbW1lbnRzIGFuZCByZWZvcm1hdHMKK3RoZW0gY29ycmVjdGx5IChNSCkKKworLSBOZXcgdmVyc2lvbiBvZiBweWNsYnIucHkgcGFyc2VzIHRvcC1sZXZlbCBmdW5jdGlvbnMgYW5kIHVuZGVyc3RhbmRzCittdWNoIG1vcmUgb2YgUHl0aG9uJ3Mgc3ludGF4OyB0aGlzIGlzIHJlZmxlY3RlZCBpbiB0aGUgY2xhc3MgYW5kIHBhdGgKK2Jyb3dzZXJzIChUUCkKKworLSBNdWNoIGJldHRlciBhdXRvLWluZGVudDsga25vd3MgaG93IHRvIGluZGVudCB0aGUgaW5zaWRlcyBvZgorbXVsdGktbGluZSBzdGF0ZW1lbnRzIChUUCkKKworLSBDYWxsIHRpcCB3aW5kb3cgcG9wcyB1cCB3aGVuIHlvdSB0eXBlIHRoZSBuYW1lIG9mIGEga25vd24gZnVuY3Rpb24KK2ZvbGxvd2VkIGJ5IGFuIG9wZW4gcGFyZW50aGVzaXMuICBIaXQgRVNDIG9yIGNsaWNrIGVsc2V3aGVyZSBpbiB0aGUKK3dpbmRvdyB0byBjbG9zZSB0aGUgdGlwIHdpbmRvdyAoTUgpCisKKy0gQ29tbWVudCBvdXQgcmVnaW9uIG5vdyBpbnNlcnRzICMjIHRvIG1ha2UgaXQgc3RhbmQgb3V0IG1vcmUgKFRQKQorCistIE5ldyBwYXRoIGFuZCBjbGFzcyBicm93c2VycyBiYXNlZCBvbiBhIHRyZWUgd2lkZ2V0IHRoYXQgbG9va3MKK2ZhbWlsaWFyIHRvIFdpbmRvd3MgdXNlcnMKKworLSBSZXdvcmtlZCBzY3JpcHQgcnVubmluZyBjb21tYW5kcyB0byBiZSBtb3JlIGludHVpdGl2ZTogSS9PIG5vdworYWx3YXlzIGdvZXMgdG8gdGhlICpQeXRob24gU2hlbGwqIHdpbmRvdywgYW5kIHJhd19pbnB1dCgpIHdvcmtzCitjb3JyZWN0bHkuICBZb3UgdXNlIEY1IHRvIGltcG9ydC9yZWxvYWQgYSBtb2R1bGU6IHRoaXMgYWRkcyB0aGUgbW9kdWxlCituYW1lIHRvIHRoZSBfX21haW5fXyBuYW1lc3BhY2UuICBZb3UgdXNlIENvbnRyb2wtRjUgdG8gcnVuIGEgc2NyaXB0OgordGhpcyBydW5zIHRoZSBzY3JpcHQgKmluKiB0aGUgX19tYWluX18gbmFtZXNwYWNlLiAgVGhlIGxhdHRlciBhbHNvCitzZXRzIHN5cy5hcmd2W10gdG8gdGhlIHNjcmlwdCBuYW1lCisKKworTmV3IGluIElETEUgMC40ICg0LzcvOTkpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTW9zdCBpbXBvcnRhbnQgY2hhbmdlOiBhIG5ldyBtZW51IGVudHJ5ICJGaWxlIC0+IFBhdGggYnJvd3NlciIsIHNob3dzCithIDQtY29sdW1uIGhpZXJhcmNoaWNhbCBicm93c2VyIHdoaWNoIGxldHMgeW91IGJyb3dzZSBzeXMucGF0aCwKK2RpcmVjdG9yaWVzLCBtb2R1bGVzLCBhbmQgY2xhc3Nlcy4gIFllcywgaXQncyBhIHN1cGVyc2V0IG9mIHRoZSBDbGFzcworYnJvd3NlciBtZW51IGVudHJ5LiAgVGhlcmUncyBhbHNvIGEgbmV3IGludGVybmFsIG1vZHVsZSwKK011bHRpU2Nyb2xsZWRMaXN0cy5weSwgd2hpY2ggcHJvdmlkZXMgdGhlIGZyYW1ld29yayBmb3IgdGhpcyBkaWFsb2cuCisKKworTmV3IGluIElETEUgMC4zICgyLzE3Lzk5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNb3N0IGltcG9ydGFudCBjaGFuZ2VzOgorCistIEVuYWJsZWQgc3VwcG9ydCBmb3IgcnVubmluZyBhIG1vZHVsZSwgd2l0aCBvciB3aXRob3V0IHRoZSBkZWJ1Z2dlci4KK091dHB1dCBnb2VzIHRvIGEgbmV3IHdpbmRvdy4gIFByZXNzaW5nIEY1IGluIGEgbW9kdWxlIGlzIGVmZmVjdGl2ZWx5IGEKK3JlbG9hZCBvZiB0aGF0IG1vZHVsZTsgQ29udHJvbC1GNSBsb2FkcyBpdCB1bmRlciB0aGUgZGVidWdnZXIuCisKKy0gUmUtZW5hYmxlIHRlYXJpbmcgb2ZmIHRoZSBXaW5kb3dzIG1lbnUsIGFuZCBtYWtlIGEgdG9ybi1vZmYgV2luZG93cworbWVudSB1cGRhdGUgaXRzZWxmIHdoZW5ldmVyIGEgd2luZG93IGlzIG9wZW5lZCBvciBjbG9zZWQuCisKKy0gTWVudSBpdGVtcyBjYW4gbm93IGJlIGhhdmUgYSBjaGVja2JveCAod2hlbiB0aGUgbWVudSBsYWJlbCBzdGFydHMKK3dpdGggIiEiKTsgdXNlIHRoaXMgZm9yIHRoZSBEZWJ1Z2dlciBhbmQgIkF1dG8tb3BlbiBzdGFjayB2aWV3ZXIiCisod2FzOiBKSVQgc3RhY2sgdmlld2VyKSBtZW51IGl0ZW1zLgorCistIEFkZGVkIGEgUXVpdCBidXR0b24gdG8gdGhlIERlYnVnZ2VyIEFQSS4KKworLSBUaGUgY3VycmVudCBkaXJlY3RvcnkgaXMgZXhwbGljaXRseSBpbnNlcnRlZCBpbnRvIHN5cy5wYXRoLgorCistIEZpeCB0aGUgZGVidWdnZXIgKHdoZW4gdXNpbmcgUHl0aG9uIDEuNS4yYjIpIHRvIHVzZSBjYW5vbmljYWwKK2ZpbGVuYW1lcyBmb3IgYnJlYWtwb2ludHMsIHNvIHRoZXNlIGFjdHVhbGx5IHdvcmsuICAoVGhlcmUncyBzdGlsbCBhCitsb3Qgb2Ygd29yayB0byBiZSBkb25lIHRvIHRoZSBtYW5hZ2VtZW50IG9mIGJyZWFrcG9pbnRzIGluIHRoZQorZGVidWdnZXIgdGhvdWdoLikKKworLSBDbG9zaW5nIGEgd2luZG93IHRoYXQgaXMgc3RpbGwgY29sb3JpemluZyBub3cgYWN0dWFsbHkgd29ya3MuCisKKy0gQWxsb3cgZHJhZ2dpbmcgb2YgdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHRoZSB0d28gbGlzdCBib3hlcyBpbiB0aGUKK2NsYXNzIGJyb3dzZXIuCisKKy0gQmluZCBFU0MgdG8gImNsb3NlIHdpbmRvdyIgb2YgdGhlIGRlYnVnZ2VyLCBzdGFjayB2aWV3ZXIgYW5kIGNsYXNzCiticm93c2VyLiAgSXQgcmVtb3ZlcyB0aGUgc2VsZWN0aW9uIGhpZ2hsaWdodGluZyBpbiByZWd1bGFyIHRleHQKK3dpbmRvd3MuICAoVGhlc2UgYXJlIHN0YW5kYXJkIFdpbmRvd3MgY29udmVudGlvbnMuKQorCisKK05ldyBpbiBJRExFIDAuMiAoMS84Lzk5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xvdHMgb2YgY2hhbmdlczsgaGVyZSBhcmUgdGhlIGhpZ2hsaWdodHM6CisKK0dlbmVyYWw6CisKKy0gWW91IGNhbiBub3cgd3JpdGUgYW5kIGNvbmZpZ3VyZSB5b3VyIG93biBJRExFIGV4dGVuc2lvbiBtb2R1bGVzOyBzZWUKK2V4dGVuZC50eHQuCisKKworRmlsZSBtZW51OgorCitUaGUgY29tbWFuZCB0byBvcGVuIHRoZSBQeXRob24gc2hlbGwgd2luZG93IGlzIG5vdyBpbiB0aGUgRmlsZSBtZW51LgorCisKK0VkaXQgbWVudToKKworTmV3IEZpbmQgZGlhbG9nIHdpdGggbW9yZSBvcHRpb25zOyByZXBsYWNlIGRpYWxvZzsgZmluZCBpbiBmaWxlcyBkaWFsb2cuCisKK0NvbW1hbmRzIHRvIHRhYmlmeSBvciB1bnRhYmlmeSBhIHJlZ2lvbi4KKworQ29tbWFuZCB0byBmb3JtYXQgYSBwYXJhZ3JhcGguCisKKworRGVidWcgbWVudToKKworSklUIChKdXN0LUluLVRpbWUpIHN0YWNrIHZpZXdlciB0b2dnbGUgLS0gaWYgc2V0LCB0aGUgc3RhY2sgdmlld2VyCithdXRvbWF0aWNhbGwgcG9wcyB1cCB3aGVuIHlvdSBnZXQgYSB0cmFjZWJhY2suCisKK1dpbmRvd3MgbWVudToKKworWm9vbSBoZWlnaHQgLS0gbWFrZSB0aGUgd2luZG93IGZ1bGwgaGVpZ2h0LgorCisKK0hlbHAgbWVudToKKworVGhlIGhlbHAgdGV4dCBub3cgc2hvdyB1cCBpbiBhIHJlZ3VsYXIgd2luZG93IHNvIHlvdSBjYW4gc2VhcmNoIGFuZAorZXZlbiBlZGl0IGl0IGlmIHlvdSBsaWtlLgorCisKKworSURMRSAwLjEgd2FzIGRpc3RyaWJ1dGVkIHdpdGggdGhlIFB5dGhvbiAxLjUuMmIxIHJlbGVhc2Ugb24gMTIvMjIvOTguCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9IeXBlclBhcnNlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9IeXBlclBhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY0YjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0h5cGVyUGFyc2VyLnB5CkBAIC0wLDAgKzEsMjQ2IEBACisiIiIKK0h5cGVyUGFyc2VyCis9PT09PT09PT09PQorVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgSHlwZXJQYXJzZXIgY2xhc3MsIHdoaWNoIHByb3ZpZGVzIGFkdmFuY2VkIHBhcnNpbmcKK2FiaWxpdGllcyBmb3IgdGhlIFBhcmVuTWF0Y2ggYW5kIG90aGVyIGV4dGVuc2lvbnMuCitUaGUgSHlwZXJQYXJzZXIgdXNlcyBQeVBhcnNlci4gUHlQYXJzZXIgaXMgaW50ZW5kZWQgbW9zdGx5IHRvIGdpdmUgaW5mb3JtYXRpb24KK29uIHRoZSBwcm9wZXIgaW5kZW50YXRpb24gb2YgY29kZS4gSHlwZXJQYXJzZXIgZ2l2ZXMgc29tZSBpbmZvcm1hdGlvbiBvbiB0aGUKK3N0cnVjdHVyZSBvZiBjb2RlLCB1c2VkIGJ5IGV4dGVuc2lvbnMgdG8gaGVscCB0aGUgdXNlci4KKyIiIgorCitpbXBvcnQgc3RyaW5nCitpbXBvcnQga2V5d29yZAorZnJvbSBpZGxlbGliIGltcG9ydCBQeVBhcnNlCisKK2NsYXNzIEh5cGVyUGFyc2VyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4sIGluZGV4KToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSB0aGUgSHlwZXJQYXJzZXIgdG8gYW5hbHl6ZSB0aGUgc3Vycm91bmRpbmdzIG9mIHRoZSBnaXZlbgorICAgICAgICBpbmRleC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0ID0gZWRpdHdpbi50ZXh0CisKKyAgICAgICAgcGFyc2VyID0gUHlQYXJzZS5QYXJzZXIoZWRpdHdpbi5pbmRlbnR3aWR0aCwgZWRpdHdpbi50YWJ3aWR0aCkKKworICAgICAgICBkZWYgaW5kZXgybGluZShpbmRleCk6CisgICAgICAgICAgICByZXR1cm4gaW50KGZsb2F0KGluZGV4KSkKKyAgICAgICAgbG5vID0gaW5kZXgybGluZSh0ZXh0LmluZGV4KGluZGV4KSkKKworICAgICAgICBpZiBub3QgZWRpdHdpbi5jb250ZXh0X3VzZV9wczE6CisgICAgICAgICAgICBmb3IgY29udGV4dCBpbiBlZGl0d2luLm51bV9jb250ZXh0X2xpbmVzOgorICAgICAgICAgICAgICAgIHN0YXJ0YXQgPSBtYXgobG5vIC0gY29udGV4dCwgMSkKKyAgICAgICAgICAgICAgICBzdGFydGF0aW5kZXggPSByZXByKHN0YXJ0YXQpICsgIi4wIgorICAgICAgICAgICAgICAgIHN0b3BhdGluZGV4ID0gIiVkLmVuZCIgJSBsbm8KKyAgICAgICAgICAgICAgICAjIFdlIGFkZCB0aGUgbmV3bGluZSBiZWNhdXNlIFB5UGFyc2UgcmVxdWlyZXMgYSBuZXdsaW5lIGF0IGVuZC4KKyAgICAgICAgICAgICAgICAjIFdlIGFkZCBhIHNwYWNlIHNvIHRoYXQgaW5kZXggd29uJ3QgYmUgYXQgZW5kIG9mIGxpbmUsIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAjIGl0cyBzdGF0dXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2hhciBiZWZvcmUgaXQsIGlmIHNob3VsZC4KKyAgICAgICAgICAgICAgICBwYXJzZXIuc2V0X3N0cih0ZXh0LmdldChzdGFydGF0aW5kZXgsIHN0b3BhdGluZGV4KSsnIFxuJykKKyAgICAgICAgICAgICAgICBib2QgPSBwYXJzZXIuZmluZF9nb29kX3BhcnNlX3N0YXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICBlZGl0d2luLl9idWlsZF9jaGFyX2luX3N0cmluZ19mdW5jKHN0YXJ0YXRpbmRleCkpCisgICAgICAgICAgICAgICAgaWYgYm9kIGlzIG5vdCBOb25lIG9yIHN0YXJ0YXQgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHBhcnNlci5zZXRfbG8oYm9kIG9yIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByID0gdGV4dC50YWdfcHJldnJhbmdlKCJjb25zb2xlIiwgaW5kZXgpCisgICAgICAgICAgICBpZiByOgorICAgICAgICAgICAgICAgIHN0YXJ0YXRpbmRleCA9IHJbMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RhcnRhdGluZGV4ID0gIjEuMCIKKyAgICAgICAgICAgIHN0b3BhdGluZGV4ID0gIiVkLmVuZCIgJSBsbm8KKyAgICAgICAgICAgICMgV2UgYWRkIHRoZSBuZXdsaW5lIGJlY2F1c2UgUHlQYXJzZSByZXF1aXJlcyBhIG5ld2xpbmUgYXQgZW5kLgorICAgICAgICAgICAgIyBXZSBhZGQgYSBzcGFjZSBzbyB0aGF0IGluZGV4IHdvbid0IGJlIGF0IGVuZCBvZiBsaW5lLCBzbyB0aGF0CisgICAgICAgICAgICAjIGl0cyBzdGF0dXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgY2hhciBiZWZvcmUgaXQsIGlmIHNob3VsZC4KKyAgICAgICAgICAgIHBhcnNlci5zZXRfc3RyKHRleHQuZ2V0KHN0YXJ0YXRpbmRleCwgc3RvcGF0aW5kZXgpKycgXG4nKQorICAgICAgICAgICAgcGFyc2VyLnNldF9sbygwKQorCisgICAgICAgICMgV2Ugd2FudCB3aGF0IHRoZSBwYXJzZXIgaGFzLCBleGNlcHQgZm9yIHRoZSBsYXN0IG5ld2xpbmUgYW5kIHNwYWNlLgorICAgICAgICBzZWxmLnJhd3RleHQgPSBwYXJzZXIuc3RyWzotMl0KKyAgICAgICAgIyBBcyBmYXIgYXMgSSBjYW4gc2VlLCBwYXJzZXIuc3RyIHByZXNlcnZlcyB0aGUgc3RhdGVtZW50IHdlIGFyZSBpbiwKKyAgICAgICAgIyBzbyB0aGF0IHN0b3BhdGluZGV4IGNhbiBiZSB1c2VkIHRvIHN5bmNocm9uaXplIHRoZSBzdHJpbmcgd2l0aCB0aGUKKyAgICAgICAgIyB0ZXh0IGJveCBpbmRpY2VzLgorICAgICAgICBzZWxmLnN0b3BhdGluZGV4ID0gc3RvcGF0aW5kZXgKKyAgICAgICAgc2VsZi5icmFja2V0aW5nID0gcGFyc2VyLmdldF9sYXN0X3N0bXRfYnJhY2tldGluZygpCisgICAgICAgICMgZmluZCB3aGljaCBwYWlycyBvZiBicmFja2V0aW5nIGFyZSBvcGVuZXJzLiBUaGVzZSBhbHdheXMgY29ycmVzcG9uZAorICAgICAgICAjIHRvIGEgY2hhcmFjdGVyIG9mIHJhd3RleHQuCisgICAgICAgIHNlbGYuaXNvcGVuZXIgPSBbaT4wIGFuZCBzZWxmLmJyYWNrZXRpbmdbaV1bMV0gPiBzZWxmLmJyYWNrZXRpbmdbaS0xXVsxXQorICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmJyYWNrZXRpbmcpKV0KKworICAgICAgICBzZWxmLnNldF9pbmRleChpbmRleCkKKworICAgIGRlZiBzZXRfaW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJTZXQgdGhlIGluZGV4IHRvIHdoaWNoIHRoZSBmdW5jdGlvbnMgcmVsYXRlLiBOb3RlIHRoYXQgaXQgbXVzdCBiZQorICAgICAgICBpbiB0aGUgc2FtZSBzdGF0ZW1lbnQuCisgICAgICAgICIiIgorICAgICAgICBpbmRleGlucmF3dGV4dCA9IFwKKyAgICAgICAgICAgIGxlbihzZWxmLnJhd3RleHQpIC0gbGVuKHNlbGYudGV4dC5nZXQoaW5kZXgsIHNlbGYuc3RvcGF0aW5kZXgpKQorICAgICAgICBpZiBpbmRleGlucmF3dGV4dCA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJUaGUgaW5kZXggZ2l2ZW4gaXMgYmVmb3JlIHRoZSBhbmFseXplZCBzdGF0ZW1lbnQiKQorICAgICAgICBzZWxmLmluZGV4aW5yYXd0ZXh0ID0gaW5kZXhpbnJhd3RleHQKKyAgICAgICAgIyBmaW5kIHRoZSByaWdodG1vc3QgYnJhY2tldCB0byB3aGljaCBpbmRleCBiZWxvbmdzCisgICAgICAgIHNlbGYuaW5kZXhicmFja2V0ID0gMAorICAgICAgICB3aGlsZSBzZWxmLmluZGV4YnJhY2tldCA8IGxlbihzZWxmLmJyYWNrZXRpbmcpLTEgYW5kIFwKKyAgICAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW3NlbGYuaW5kZXhicmFja2V0KzFdWzBdIDwgc2VsZi5pbmRleGlucmF3dGV4dDoKKyAgICAgICAgICAgIHNlbGYuaW5kZXhicmFja2V0ICs9IDEKKyAgICAgICAgaWYgc2VsZi5pbmRleGJyYWNrZXQgPCBsZW4oc2VsZi5icmFja2V0aW5nKS0xIGFuZCBcCisgICAgICAgICAgIHNlbGYuYnJhY2tldGluZ1tzZWxmLmluZGV4YnJhY2tldCsxXVswXSA9PSBzZWxmLmluZGV4aW5yYXd0ZXh0IGFuZCBcCisgICAgICAgICAgIG5vdCBzZWxmLmlzb3BlbmVyW3NlbGYuaW5kZXhicmFja2V0KzFdOgorICAgICAgICAgICAgc2VsZi5pbmRleGJyYWNrZXQgKz0gMQorCisgICAgZGVmIGlzX2luX3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiSXMgdGhlIGluZGV4IGdpdmVuIHRvIHRoZSBIeXBlclBhcnNlciBpcyBpbiBhIHN0cmluZz8iIiIKKyAgICAgICAgIyBUaGUgYnJhY2tldCB0byB3aGljaCB3ZSBiZWxvbmcgc2hvdWxkIGJlIGFuIG9wZW5lci4KKyAgICAgICAgIyBJZiBpdCdzIGFuIG9wZW5lciwgaXQgaGFzIHRvIGhhdmUgYSBjaGFyYWN0ZXIuCisgICAgICAgIHJldHVybiBzZWxmLmlzb3BlbmVyW3NlbGYuaW5kZXhicmFja2V0XSBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5yYXd0ZXh0W3NlbGYuYnJhY2tldGluZ1tzZWxmLmluZGV4YnJhY2tldF1bMF1dIGluICgnIicsICInIikKKworICAgIGRlZiBpc19pbl9jb2RlKHNlbGYpOgorICAgICAgICAiIiJJcyB0aGUgaW5kZXggZ2l2ZW4gdG8gdGhlIEh5cGVyUGFyc2VyIGlzIGluIGEgbm9ybWFsIGNvZGU/IiIiCisgICAgICAgIHJldHVybiBub3Qgc2VsZi5pc29wZW5lcltzZWxmLmluZGV4YnJhY2tldF0gb3IgXAorICAgICAgICAgICAgICAgc2VsZi5yYXd0ZXh0W3NlbGYuYnJhY2tldGluZ1tzZWxmLmluZGV4YnJhY2tldF1bMF1dIG5vdCBpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcjJywgJyInLCAiJyIpCisKKyAgICBkZWYgZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKHNlbGYsIG9wZW5lcnM9JyhbeycsIG11c3RjbG9zZT1GYWxzZSk6CisgICAgICAgICIiIklmIHRoZSBpbmRleCBnaXZlbiB0byB0aGUgSHlwZXJQYXJzZXIgaXMgc3Vycm91bmRlZCBieSBhIGJyYWNrZXQKKyAgICAgICAgZGVmaW5lZCBpbiBvcGVuZXJzIChvciBhdCBsZWFzdCBoYXMgb25lIGJlZm9yZSBpdCksIHJldHVybiB0aGUKKyAgICAgICAgaW5kaWNlcyBvZiB0aGUgb3BlbmluZyBicmFja2V0IGFuZCB0aGUgY2xvc2luZyBicmFja2V0IChvciB0aGUKKyAgICAgICAgZW5kIG9mIGxpbmUsIHdoaWNoZXZlciBjb21lcyBmaXJzdCkuCisgICAgICAgIElmIGl0IGlzIG5vdCBzdXJyb3VuZGVkIGJ5IGJyYWNrZXRzLCBvciB0aGUgZW5kIG9mIGxpbmUgY29tZXMgYmVmb3JlCisgICAgICAgIHRoZSBjbG9zaW5nIGJyYWNrZXQgYW5kIG11c3RjbG9zZSBpcyBUcnVlLCByZXR1cm5zIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBicmFja2V0aW5nbGV2ZWwgPSBzZWxmLmJyYWNrZXRpbmdbc2VsZi5pbmRleGJyYWNrZXRdWzFdCisgICAgICAgIGJlZm9yZSA9IHNlbGYuaW5kZXhicmFja2V0CisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmlzb3BlbmVyW2JlZm9yZV0gb3IgXAorICAgICAgICAgICAgICBzZWxmLnJhd3RleHRbc2VsZi5icmFja2V0aW5nW2JlZm9yZV1bMF1dIG5vdCBpbiBvcGVuZXJzIG9yIFwKKyAgICAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2JlZm9yZV1bMV0gPiBicmFja2V0aW5nbGV2ZWw6CisgICAgICAgICAgICBiZWZvcmUgLT0gMQorICAgICAgICAgICAgaWYgYmVmb3JlIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgYnJhY2tldGluZ2xldmVsID0gbWluKGJyYWNrZXRpbmdsZXZlbCwgc2VsZi5icmFja2V0aW5nW2JlZm9yZV1bMV0pCisgICAgICAgIGFmdGVyID0gc2VsZi5pbmRleGJyYWNrZXQgKyAxCisgICAgICAgIHdoaWxlIGFmdGVyIDwgbGVuKHNlbGYuYnJhY2tldGluZykgYW5kIFwKKyAgICAgICAgICAgICAgc2VsZi5icmFja2V0aW5nW2FmdGVyXVsxXSA+PSBicmFja2V0aW5nbGV2ZWw6CisgICAgICAgICAgICBhZnRlciArPSAxCisKKyAgICAgICAgYmVmb3JlaW5kZXggPSBzZWxmLnRleHQuaW5kZXgoIiVzLSVkYyIgJQorICAgICAgICAgICAgKHNlbGYuc3RvcGF0aW5kZXgsIGxlbihzZWxmLnJhd3RleHQpLXNlbGYuYnJhY2tldGluZ1tiZWZvcmVdWzBdKSkKKyAgICAgICAgaWYgYWZ0ZXIgPj0gbGVuKHNlbGYuYnJhY2tldGluZykgb3IgXAorICAgICAgICAgICBzZWxmLmJyYWNrZXRpbmdbYWZ0ZXJdWzBdID4gbGVuKHNlbGYucmF3dGV4dCk6CisgICAgICAgICAgICBpZiBtdXN0Y2xvc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGFmdGVyaW5kZXggPSBzZWxmLnN0b3BhdGluZGV4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlIGFyZSBhZnRlciBhIHJlYWwgY2hhciwgc28gaXQgaXMgYSAnKScgYW5kIHdlIGdpdmUgdGhlIGluZGV4CisgICAgICAgICAgICAjIGJlZm9yZSBpdC4KKyAgICAgICAgICAgIGFmdGVyaW5kZXggPSBzZWxmLnRleHQuaW5kZXgoIiVzLSVkYyIgJQorICAgICAgICAgICAgICAgIChzZWxmLnN0b3BhdGluZGV4LAorICAgICAgICAgICAgICAgICBsZW4oc2VsZi5yYXd0ZXh0KS0oc2VsZi5icmFja2V0aW5nW2FmdGVyXVswXS0xKSkpCisKKyAgICAgICAgcmV0dXJuIGJlZm9yZWluZGV4LCBhZnRlcmluZGV4CisKKyAgICAjIFRoaXMgc3RyaW5nIGluY2x1ZGVzIGFsbCBjaGFycyB0aGF0IG1heSBiZSBpbiBhIHdoaXRlIHNwYWNlCisgICAgX3doaXRlc3BhY2VfY2hhcnMgPSAiIFx0XG5cXCIKKyAgICAjIFRoaXMgc3RyaW5nIGluY2x1ZGVzIGFsbCBjaGFycyB0aGF0IG1heSBiZSBpbiBhbiBpZGVudGlmaWVyCisgICAgX2lkX2NoYXJzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCisgICAgIyBUaGlzIHN0cmluZyBpbmNsdWRlcyBhbGwgY2hhcnMgdGhhdCBtYXkgYmUgdGhlIGZpcnN0IGNoYXIgb2YgYW4gaWRlbnRpZmllcgorICAgIF9pZF9maXJzdF9jaGFycyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgIl8iCisKKyAgICAjIEdpdmVuIGEgc3RyaW5nIGFuZCBwb3MsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBpZGVudGlmaWVyCisgICAgIyB3aGljaCBlbmRzIGF0IHBvcywgb3IgMCBpZiB0aGVyZSBpcyBubyBzdWNoIG9uZS4gU2F2ZWQgd29yZHMgYXJlIG5vdAorICAgICMgaWRlbnRpZmllcnMuCisgICAgZGVmIF9lYXRfaWRlbnRpZmllcihzZWxmLCBzdHIsIGxpbWl0LCBwb3MpOgorICAgICAgICBpID0gcG9zCisgICAgICAgIHdoaWxlIGkgPiBsaW1pdCBhbmQgc3RyW2ktMV0gaW4gc2VsZi5faWRfY2hhcnM6CisgICAgICAgICAgICBpIC09IDEKKyAgICAgICAgaWYgaSA8IHBvcyBhbmQgKHN0cltpXSBub3QgaW4gc2VsZi5faWRfZmlyc3RfY2hhcnMgb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAga2V5d29yZC5pc2tleXdvcmQoc3RyW2k6cG9zXSkpOgorICAgICAgICAgICAgaSA9IHBvcworICAgICAgICByZXR1cm4gcG9zIC0gaQorCisgICAgZGVmIGdldF9leHByZXNzaW9uKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgd2l0aCB0aGUgUHl0aG9uIGV4cHJlc3Npb24gd2hpY2ggZW5kcyBhdCB0aGUgZ2l2ZW4KKyAgICAgICAgaW5kZXgsIHdoaWNoIGlzIGVtcHR5IGlmIHRoZXJlIGlzIG5vIHJlYWwgb25lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfaW5fY29kZSgpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZ2V0X2V4cHJlc3Npb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGlmIGluZGV4ICJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyBpbnNpZGUgYSBjb2RlLiIpCisKKyAgICAgICAgcmF3dGV4dCA9IHNlbGYucmF3dGV4dAorICAgICAgICBicmFja2V0aW5nID0gc2VsZi5icmFja2V0aW5nCisKKyAgICAgICAgYnJja19pbmRleCA9IHNlbGYuaW5kZXhicmFja2V0CisgICAgICAgIGJyY2tfbGltaXQgPSBicmFja2V0aW5nW2JyY2tfaW5kZXhdWzBdCisgICAgICAgIHBvcyA9IHNlbGYuaW5kZXhpbnJhd3RleHQKKworICAgICAgICBsYXN0X2lkZW50aWZpZXJfcG9zID0gcG9zCisgICAgICAgIHBvc3Rkb3RfcGhhc2UgPSBUcnVlCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgRWF0IHdoaXRlc3BhY2VzLCBjb21tZW50cywgYW5kIGlmIHBvc3Rkb3RfcGhhc2UgaXMgRmFsc2UgLSBvbmUgZG90CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIHBvcz5icmNrX2xpbWl0IGFuZCByYXd0ZXh0W3Bvcy0xXSBpbiBzZWxmLl93aGl0ZXNwYWNlX2NoYXJzOgorICAgICAgICAgICAgICAgICAgICAjIEVhdCBhIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgcG9zIC09IDEKKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBwb3N0ZG90X3BoYXNlIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICBwb3MgPiBicmNrX2xpbWl0IGFuZCByYXd0ZXh0W3Bvcy0xXSA9PSAnLic6CisgICAgICAgICAgICAgICAgICAgICMgRWF0IGEgZG90CisgICAgICAgICAgICAgICAgICAgIHBvcyAtPSAxCisgICAgICAgICAgICAgICAgICAgIHBvc3Rkb3RfcGhhc2UgPSBUcnVlCisgICAgICAgICAgICAgICAgIyBUaGUgbmV4dCBsaW5lIHdpbGwgZmFpbCBpZiB3ZSBhcmUgKmluc2lkZSogYSBjb21tZW50LCBidXQgd2UKKyAgICAgICAgICAgICAgICAjIHNob3VsZG4ndCBiZS4KKyAgICAgICAgICAgICAgICBlbGlmIHBvcyA9PSBicmNrX2xpbWl0IGFuZCBicmNrX2luZGV4ID4gMCBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgcmF3dGV4dFticmFja2V0aW5nW2JyY2tfaW5kZXgtMV1bMF1dID09ICcjJzoKKyAgICAgICAgICAgICAgICAgICAgIyBFYXQgYSBjb21tZW50CisgICAgICAgICAgICAgICAgICAgIGJyY2tfaW5kZXggLT0gMgorICAgICAgICAgICAgICAgICAgICBicmNrX2xpbWl0ID0gYnJhY2tldGluZ1ticmNrX2luZGV4XVswXQorICAgICAgICAgICAgICAgICAgICBwb3MgPSBicmFja2V0aW5nW2JyY2tfaW5kZXgrMV1bMF0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIElmIHdlIGRpZG4ndCBlYXQgYW55dGhpbmcsIHF1aXQuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIG5vdCBwb3N0ZG90X3BoYXNlOgorICAgICAgICAgICAgICAgICMgV2UgZGlkbid0IGZpbmQgYSBkb3QsIHNvIHRoZSBleHByZXNzaW9uIGVuZCBhdCB0aGUgbGFzdAorICAgICAgICAgICAgICAgICMgaWRlbnRpZmllciBwb3MuCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgcmV0ID0gc2VsZi5fZWF0X2lkZW50aWZpZXIocmF3dGV4dCwgYnJja19saW1pdCwgcG9zKQorICAgICAgICAgICAgaWYgcmV0OgorICAgICAgICAgICAgICAgICMgVGhlcmUgaXMgYW4gaWRlbnRpZmllciB0byBlYXQKKyAgICAgICAgICAgICAgICBwb3MgPSBwb3MgLSByZXQKKyAgICAgICAgICAgICAgICBsYXN0X2lkZW50aWZpZXJfcG9zID0gcG9zCisgICAgICAgICAgICAgICAgIyBOb3csIGluIG9yZGVyIHRvIGNvbnRpbnVlIHRoZSBzZWFyY2gsIHdlIG11c3QgZmluZCBhIGRvdC4KKyAgICAgICAgICAgICAgICBwb3N0ZG90X3BoYXNlID0gRmFsc2UKKyAgICAgICAgICAgICAgICAjICh0aGUgbG9vcCBjb250aW51ZXMgbm93KQorCisgICAgICAgICAgICBlbGlmIHBvcyA9PSBicmNrX2xpbWl0OgorICAgICAgICAgICAgICAgICMgV2UgYXJlIGF0IGEgYnJhY2tldGluZyBsaW1pdC4gSWYgaXQgaXMgYSBjbG9zaW5nIGJyYWNrZXQsCisgICAgICAgICAgICAgICAgIyBlYXQgdGhlIGJyYWNrZXQsIG90aGVyd2lzZSwgc3RvcCB0aGUgc2VhcmNoLgorICAgICAgICAgICAgICAgIGxldmVsID0gYnJhY2tldGluZ1ticmNrX2luZGV4XVsxXQorICAgICAgICAgICAgICAgIHdoaWxlIGJyY2tfaW5kZXggPiAwIGFuZCBicmFja2V0aW5nW2JyY2tfaW5kZXgtMV1bMV0gPiBsZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgYnJja19pbmRleCAtPSAxCisgICAgICAgICAgICAgICAgaWYgYnJhY2tldGluZ1ticmNrX2luZGV4XVswXSA9PSBicmNrX2xpbWl0OgorICAgICAgICAgICAgICAgICAgICAjIFdlIHdlcmUgbm90IGF0IHRoZSBlbmQgb2YgYSBjbG9zaW5nIGJyYWNrZXQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBwb3MgPSBicmFja2V0aW5nW2JyY2tfaW5kZXhdWzBdCisgICAgICAgICAgICAgICAgYnJja19pbmRleCAtPSAxCisgICAgICAgICAgICAgICAgYnJja19saW1pdCA9IGJyYWNrZXRpbmdbYnJja19pbmRleF1bMF0KKyAgICAgICAgICAgICAgICBsYXN0X2lkZW50aWZpZXJfcG9zID0gcG9zCisgICAgICAgICAgICAgICAgaWYgcmF3dGV4dFtwb3NdIGluICIoWyI6CisgICAgICAgICAgICAgICAgICAgICMgW10gYW5kICgpIG1heSBiZSB1c2VkIGFmdGVyIGFuIGlkZW50aWZpZXIsIHNvIHdlCisgICAgICAgICAgICAgICAgICAgICMgY29udGludWUuIHBvc3Rkb3RfcGhhc2UgaXMgVHJ1ZSwgc28gd2UgZG9uJ3QgYWxsb3cgYSBkb3QuCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIFdlIGNhbid0IGNvbnRpbnVlIGFmdGVyIG90aGVyIHR5cGVzIG9mIGJyYWNrZXRzCisgICAgICAgICAgICAgICAgICAgIGlmIHJhd3RleHRbcG9zXSBpbiAiJ1wiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU2NhbiBhIHN0cmluZyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHBvcyA+IDAgYW5kIHJhd3RleHRbcG9zIC0gMV0gaW4gInJSYkJ1VSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zIC09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfaWRlbnRpZmllcl9wb3MgPSBwb3MKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFdlJ3ZlIGZvdW5kIGFuIG9wZXJhdG9yIG9yIHNvbWV0aGluZy4KKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIHJldHVybiByYXd0ZXh0W2xhc3RfaWRlbnRpZmllcl9wb3M6c2VsZi5pbmRleGlucmF3dGV4dF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9IeXBlclBhcnNlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTAxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9IeXBlclBhcnNlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTAxMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSHlwZXJQYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9JT0JpbmRpbmcucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSU9CaW5kaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNzhjM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSU9CaW5kaW5nLnB5CkBAIC0wLDAgKzEsNTk5IEBACisjIGNoYW5nZXMgYnkgZHNjaGVyZXJAY211LmVkdQorIyAgIC0gSU9CaW5kaW5nLm9wZW4oKSByZXBsYWNlcyB0aGUgY3VycmVudCB3aW5kb3cgd2l0aCB0aGUgb3BlbmVkIGZpbGUsCisjICAgICBpZiB0aGUgY3VycmVudCB3aW5kb3cgaXMgYm90aCB1bm1vZGlmaWVkIGFuZCB1bm5hbWVkCisjICAgLSBJT0JpbmRpbmcubG9hZGZpbGUoKSBpbnRlcnByZXRzIFdpbmRvd3MsIFVOSVgsIGFuZCBNYWNpbnRvc2gKKyMgICAgIGVuZC1vZi1saW5lIGNvbnZlbnRpb25zLCBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gdGhlIHN0YW5kYXJkIGxpYnJhcnksCisjICAgICB3aGljaCB3aWxsIG9ubHkgdW5kZXJzdGFuZCB0aGUgbG9jYWwgY29udmVudGlvbi4KKworaW1wb3J0IG9zCitpbXBvcnQgdHlwZXMKK2ltcG9ydCBwaXBlcworaW1wb3J0IHN5cworaW1wb3J0IGNvZGVjcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGtGaWxlRGlhbG9nCitpbXBvcnQgdGtNZXNzYWdlQm94CitpbXBvcnQgcmUKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorZnJvbSBTaW1wbGVEaWFsb2cgaW1wb3J0IFNpbXBsZURpYWxvZworCitmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKKwordHJ5OgorICAgIGZyb20gY29kZWNzIGltcG9ydCBCT01fVVRGOAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgb25seSBhdmFpbGFibGUgc2luY2UgUHl0aG9uIDIuMworICAgIEJPTV9VVEY4ID0gJ1x4ZWZceGJiXHhiZicKKworIyBUcnkgc2V0dGluZyB0aGUgbG9jYWxlLCBzbyB0aGF0IHdlIGNhbiBmaW5kIG91dAorIyB3aGF0IGVuY29kaW5nIHRvIHVzZQordHJ5OgorICAgIGltcG9ydCBsb2NhbGUKKyAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DVFlQRSwgIiIpCitleGNlcHQgKEltcG9ydEVycm9yLCBsb2NhbGUuRXJyb3IpOgorICAgIHBhc3MKKworIyBFbmNvZGluZyBmb3IgZmlsZSBuYW1lcworZmlsZXN5c3RlbWVuY29kaW5nID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCisKK2VuY29kaW5nID0gImFzY2lpIgoraWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgIyBPbiBXaW5kb3dzLCB3ZSBjb3VsZCB1c2UgIm1iY3MiLiBIb3dldmVyLCB0byBnaXZlIHRoZSB1c2VyCisgICAgIyBhIHBvcnRhYmxlIGVuY29kaW5nIG5hbWUsIHdlIG5lZWQgdG8gZmluZCB0aGUgY29kZSBwYWdlCisgICAgdHJ5OgorICAgICAgICBlbmNvZGluZyA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0KKyAgICAgICAgY29kZWNzLmxvb2t1cChlbmNvZGluZykKKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgIHBhc3MKK2Vsc2U6CisgICAgdHJ5OgorICAgICAgICAjIERpZmZlcmVudCB0aGluZ3MgY2FuIGZhaWwgaGVyZTogdGhlIGxvY2FsZSBtb2R1bGUgbWF5IG5vdCBiZQorICAgICAgICAjIGxvYWRlZCwgaXQgbWF5IG5vdCBvZmZlciBubF9sYW5naW5mbywgb3IgQ09ERVNFVCwgb3IgdGhlCisgICAgICAgICMgcmVzdWx0aW5nIGNvZGVzZXQgbWF5IGJlIHVua25vd24gdG8gUHl0aG9uLiBXZSBpZ25vcmUgYWxsCisgICAgICAgICMgdGhlc2UgcHJvYmxlbXMsIGZhbGxpbmcgYmFjayB0byBBU0NJSQorICAgICAgICBlbmNvZGluZyA9IGxvY2FsZS5ubF9sYW5naW5mbyhsb2NhbGUuQ09ERVNFVCkKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZSBvciBlbmNvZGluZyBpcyAnJzoKKyAgICAgICAgICAgICMgc2l0dWF0aW9uIG9jY3VycyBvbiBNYWMgT1MgWAorICAgICAgICAgICAgZW5jb2RpbmcgPSAnYXNjaWknCisgICAgICAgIGNvZGVjcy5sb29rdXAoZW5jb2RpbmcpCisgICAgZXhjZXB0IChOYW1lRXJyb3IsIEF0dHJpYnV0ZUVycm9yLCBMb29rdXBFcnJvcik6CisgICAgICAgICMgVHJ5IGdldGRlZmF1bHRsb2NhbGUgd2VsbDogaXQgcGFyc2VzIGVudmlyb25tZW50IHZhcmlhYmxlcywKKyAgICAgICAgIyB3aGljaCBtYXkgZ2l2ZSBhIGNsdWUuIFVuZm9ydHVuYXRlbHksIGdldGRlZmF1bHRsb2NhbGUgaGFzCisgICAgICAgICMgYnVncyB0aGF0IGNhbiBjYXVzZSBWYWx1ZUVycm9yLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbmNvZGluZyA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmUgb3IgZW5jb2RpbmcgaXMgJyc6CisgICAgICAgICAgICAgICAgIyBzaXR1YXRpb24gb2NjdXJzIG9uIE1hYyBPUyBYCisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAnYXNjaWknCisgICAgICAgICAgICBjb2RlY3MubG9va3VwKGVuY29kaW5nKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIExvb2t1cEVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKworZW5jb2RpbmcgPSBlbmNvZGluZy5sb3dlcigpCisKK2NvZGluZ19yZSA9IHJlLmNvbXBpbGUoImNvZGluZ1s6PV1ccyooWy1cd18uXSspIikKKworY2xhc3MgRW5jb2RpbmdNZXNzYWdlKFNpbXBsZURpYWxvZyk6CisgICAgIkluZm9ybSB1c2VyIHRoYXQgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24gaXMgbmVlZGVkLiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBlbmMpOgorICAgICAgICBzZWxmLnNob3VsZF9lZGl0ID0gRmFsc2UKKworICAgICAgICBzZWxmLnJvb3QgPSB0b3AgPSBUb3BsZXZlbChtYXN0ZXIpCisgICAgICAgIHRvcC5iaW5kKCI8UmV0dXJuPiIsIHNlbGYucmV0dXJuX2V2ZW50KQorICAgICAgICB0b3AuYmluZCgiPEVzY2FwZT4iLCBzZWxmLmRvX29rKQorICAgICAgICB0b3AucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLndtX2RlbGV0ZV93aW5kb3cpCisgICAgICAgIHRvcC53bV90aXRsZSgiSS9PIFdhcm5pbmciKQorICAgICAgICB0b3Aud21faWNvbm5hbWUoIkkvTyBXYXJuaW5nIikKKyAgICAgICAgc2VsZi50b3AgPSB0b3AKKworICAgICAgICBsMSA9IExhYmVsKHRvcCwKKyAgICAgICAgICAgIHRleHQ9Ik5vbi1BU0NJSSBmb3VuZCwgeWV0IG5vIGVuY29kaW5nIGRlY2xhcmVkLiBBZGQgYSBsaW5lIGxpa2UiKQorICAgICAgICBsMS5wYWNrKHNpZGU9VE9QLCBhbmNob3I9VykKKyAgICAgICAgbDIgPSBFbnRyeSh0b3AsIGZvbnQ9ImNvdXJpZXIiKQorICAgICAgICBsMi5pbnNlcnQoMCwgIiMgLSotIGNvZGluZzogJXMgLSotIiAlIGVuYykKKyAgICAgICAgIyBGb3Igc29tZSByZWFzb24sIHRoZSB0ZXh0IGlzIG5vdCBzZWxlY3RhYmxlIGFueW1vcmUgaWYgdGhlCisgICAgICAgICMgd2lkZ2V0IGlzIGRpc2FibGVkLgorICAgICAgICAjIGwyWydzdGF0ZSddID0gRElTQUJMRUQKKyAgICAgICAgbDIucGFjayhzaWRlPVRPUCwgYW5jaG9yID0gVywgZmlsbD1YKQorICAgICAgICBsMyA9IExhYmVsKHRvcCwgdGV4dD0idG8geW91ciBmaWxlXG4iCisgICAgICAgICAgICAgICAgICAgIkNob29zZSBPSyB0byBzYXZlIHRoaXMgZmlsZSBhcyAlc1xuIgorICAgICAgICAgICAgICAgICAgICJFZGl0IHlvdXIgZ2VuZXJhbCBvcHRpb25zIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nIiAlIGVuYykKKyAgICAgICAgbDMucGFjayhzaWRlPVRPUCwgYW5jaG9yID0gVykKKworICAgICAgICBidXR0b25zID0gRnJhbWUodG9wKQorICAgICAgICBidXR0b25zLnBhY2soc2lkZT1UT1AsIGZpbGw9WCkKKyAgICAgICAgIyBCb3RoIHJldHVybiBhbmQgY2FuY2VsIG1lYW4gdGhlIHNhbWUgdGhpbmc6IGRvIG5vdGhpbmcKKyAgICAgICAgc2VsZi5kZWZhdWx0ID0gc2VsZi5jYW5jZWwgPSAwCisgICAgICAgIGIxID0gQnV0dG9uKGJ1dHRvbnMsIHRleHQ9Ik9rIiwgZGVmYXVsdD0iYWN0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmRvX29rKQorICAgICAgICBiMS5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKKyAgICAgICAgYjIgPSBCdXR0b24oYnV0dG9ucywgdGV4dD0iRWRpdCBteSBmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmRvX2VkaXQpCisgICAgICAgIGIyLnBhY2soc2lkZT1MRUZULCBmaWxsPUJPVEgsIGV4cGFuZD0xKQorCisgICAgICAgIHNlbGYuX3NldF90cmFuc2llbnQobWFzdGVyKQorCisgICAgZGVmIGRvX29rKHNlbGYpOgorICAgICAgICBzZWxmLmRvbmUoMCkKKworICAgIGRlZiBkb19lZGl0KHNlbGYpOgorICAgICAgICBzZWxmLmRvbmUoMSkKKworZGVmIGNvZGluZ19zcGVjKHN0cik6CisgICAgIiIiUmV0dXJuIHRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbiBhY2NvcmRpbmcgdG8gUEVQIDI2My4KKworICAgIFJhaXNlIExvb2t1cEVycm9yIGlmIHRoZSBlbmNvZGluZyBpcyBkZWNsYXJlZCBidXQgdW5rbm93bi4KKyAgICAiIiIKKyAgICAjIE9ubHkgY29uc2lkZXIgdGhlIGZpcnN0IHR3byBsaW5lcworICAgIHN0ciA9IHN0ci5zcGxpdCgiXG4iKVs6Ml0KKyAgICBzdHIgPSAiXG4iLmpvaW4oc3RyKQorCisgICAgbWF0Y2ggPSBjb2RpbmdfcmUuc2VhcmNoKHN0cikKKyAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgIHJldHVybiBOb25lCisgICAgbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgIyBDaGVjayB3aGV0aGVyIHRoZSBlbmNvZGluZyBpcyBrbm93bgorICAgIGltcG9ydCBjb2RlY3MKKyAgICB0cnk6CisgICAgICAgIGNvZGVjcy5sb29rdXAobmFtZSkKKyAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICMgVGhlIHN0YW5kYXJkIGVuY29kaW5nIGVycm9yIGRvZXMgbm90IGluZGljYXRlIHRoZSBlbmNvZGluZworICAgICAgICByYWlzZSBMb29rdXBFcnJvciwgIlVua25vd24gZW5jb2RpbmcgIituYW1lCisgICAgcmV0dXJuIG5hbWUKKworCitjbGFzcyBJT0JpbmRpbmc6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKyAgICAgICAgc2VsZi50ZXh0ID0gZWRpdHdpbi50ZXh0CisgICAgICAgIHNlbGYuX19pZF9vcGVuID0gc2VsZi50ZXh0LmJpbmQoIjw8b3Blbi13aW5kb3ctZnJvbS1maWxlPj4iLCBzZWxmLm9wZW4pCisgICAgICAgIHNlbGYuX19pZF9zYXZlID0gc2VsZi50ZXh0LmJpbmQoIjw8c2F2ZS13aW5kb3c+PiIsIHNlbGYuc2F2ZSkKKyAgICAgICAgc2VsZi5fX2lkX3NhdmVhcyA9IHNlbGYudGV4dC5iaW5kKCI8PHNhdmUtd2luZG93LWFzLWZpbGU+PiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNhdmVfYXMpCisgICAgICAgIHNlbGYuX19pZF9zYXZlY29weSA9IHNlbGYudGV4dC5iaW5kKCI8PHNhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZT4+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zYXZlX2FfY29weSkKKyAgICAgICAgc2VsZi5maWxlZW5jb2RpbmcgPSBOb25lCisgICAgICAgIHNlbGYuX19pZF9wcmludCA9IHNlbGYudGV4dC5iaW5kKCI8PHByaW50LXdpbmRvdz4+Iiwgc2VsZi5wcmludF93aW5kb3cpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICMgVW5kbyBjb21tYW5kIGJpbmRpbmdzCisgICAgICAgIHNlbGYudGV4dC51bmJpbmQoIjw8b3Blbi13aW5kb3ctZnJvbS1maWxlPj4iLCBzZWxmLl9faWRfb3BlbikKKyAgICAgICAgc2VsZi50ZXh0LnVuYmluZCgiPDxzYXZlLXdpbmRvdz4+Iiwgc2VsZi5fX2lkX3NhdmUpCisgICAgICAgIHNlbGYudGV4dC51bmJpbmQoIjw8c2F2ZS13aW5kb3ctYXMtZmlsZT4+IixzZWxmLl9faWRfc2F2ZWFzKQorICAgICAgICBzZWxmLnRleHQudW5iaW5kKCI8PHNhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZT4+Iiwgc2VsZi5fX2lkX3NhdmVjb3B5KQorICAgICAgICBzZWxmLnRleHQudW5iaW5kKCI8PHByaW50LXdpbmRvdz4+Iiwgc2VsZi5fX2lkX3ByaW50KQorICAgICAgICAjIEJyZWFrIGN5Y2xlcworICAgICAgICBzZWxmLmVkaXR3aW4gPSBOb25lCisgICAgICAgIHNlbGYudGV4dCA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vayA9IE5vbmUKKworICAgIGRlZiBnZXRfc2F2ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVkaXR3aW4uZ2V0X3NhdmVkKCkKKworICAgIGRlZiBzZXRfc2F2ZWQoc2VsZiwgZmxhZyk6CisgICAgICAgIHNlbGYuZWRpdHdpbi5zZXRfc2F2ZWQoZmxhZykKKworICAgIGRlZiByZXNldF91bmRvKHNlbGYpOgorICAgICAgICBzZWxmLmVkaXR3aW4ucmVzZXRfdW5kbygpCisKKyAgICBmaWxlbmFtZV9jaGFuZ2VfaG9vayA9IE5vbmUKKworICAgIGRlZiBzZXRfZmlsZW5hbWVfY2hhbmdlX2hvb2soc2VsZiwgaG9vayk6CisgICAgICAgIHNlbGYuZmlsZW5hbWVfY2hhbmdlX2hvb2sgPSBob29rCisKKyAgICBmaWxlbmFtZSA9IE5vbmUKKyAgICBkaXJuYW1lID0gTm9uZQorCisgICAgZGVmIHNldF9maWxlbmFtZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIGZpbGVuYW1lIGFuZCBvcy5wYXRoLmlzZGlyKGZpbGVuYW1lKToKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBOb25lCisgICAgICAgICAgICBzZWxmLmRpcm5hbWUgPSBmaWxlbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgICAgICBzZWxmLmRpcm5hbWUgPSBOb25lCisgICAgICAgICAgICBzZWxmLnNldF9zYXZlZCgxKQorICAgICAgICAgICAgaWYgc2VsZi5maWxlbmFtZV9jaGFuZ2VfaG9vazoKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lX2NoYW5nZV9ob29rKCkKKworICAgIGRlZiBvcGVuKHNlbGYsIGV2ZW50PU5vbmUsIGVkaXRGaWxlPU5vbmUpOgorICAgICAgICBmbGlzdCA9IHNlbGYuZWRpdHdpbi5mbGlzdAorICAgICAgICAjIFNhdmUgaW4gY2FzZSBwYXJlbnQgd2luZG93IGlzIGNsb3NlZCAoaWUsIGR1cmluZyBhc2tvcGVuZmlsZSgpKS4KKyAgICAgICAgaWYgZmxpc3Q6CisgICAgICAgICAgICBpZiBub3QgZWRpdEZpbGU6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmFza29wZW5maWxlKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmlsZW5hbWU9ZWRpdEZpbGUKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgICAgICMgSWYgZWRpdEZpbGUgaXMgdmFsaWQgYW5kIGFscmVhZHkgb3BlbiwgZmxpc3Qub3BlbiB3aWxsCisgICAgICAgICAgICAgICAgIyBzaGlmdCBmb2N1cyB0byBpdHMgZXhpc3Rpbmcgd2luZG93LgorICAgICAgICAgICAgICAgICMgSWYgdGhlIGN1cnJlbnQgd2luZG93IGV4aXN0cyBhbmQgaXMgYSBmcmVzaCB1bm5hbWVkLAorICAgICAgICAgICAgICAgICMgdW5tb2RpZmllZCBlZGl0b3Igd2luZG93IChub3QgYW4gaW50ZXJwcmV0ZXIgc2hlbGwpLAorICAgICAgICAgICAgICAgICMgcGFzcyBzZWxmLmxvYWRmaWxlIHRvIGZsaXN0Lm9wZW4gc28gaXQgd2lsbCBsb2FkIHRoZSBmaWxlCisgICAgICAgICAgICAgICAgIyBpbiB0aGUgY3VycmVudCB3aW5kb3cgKGlmIHRoZSBmaWxlIGlzIG5vdCBhbHJlYWR5IG9wZW4pCisgICAgICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIGEgbmV3IHdpbmRvdy4KKyAgICAgICAgICAgICAgICBpZiAoc2VsZi5lZGl0d2luIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgbm90IGdldGF0dHIoc2VsZi5lZGl0d2luLCAnaW50ZXJwJywgTm9uZSkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc2VsZi5maWxlbmFtZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0X3NhdmVkKCkpOgorICAgICAgICAgICAgICAgICAgICBmbGlzdC5vcGVuKGZpbGVuYW1lLCBzZWxmLmxvYWRmaWxlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZsaXN0Lm9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudGV4dDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmZvY3VzX3NldCgpCisgICAgICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgICAgICMgQ29kZSBmb3IgdXNlIG91dHNpZGUgSURMRToKKyAgICAgICAgaWYgc2VsZi5nZXRfc2F2ZWQoKToKKyAgICAgICAgICAgIHJlcGx5ID0gc2VsZi5tYXliZXNhdmUoKQorICAgICAgICAgICAgaWYgcmVwbHkgPT0gImNhbmNlbCI6CisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmZvY3VzX3NldCgpCisgICAgICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgaWYgbm90IGVkaXRGaWxlOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmFza29wZW5maWxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGVuYW1lPWVkaXRGaWxlCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5sb2FkZmlsZShmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZW9sID0gciIoXHJcbil8XG58XHIiICAjIFxyXG4gKFdpbmRvd3MpLCBcbiAoVU5JWCksIG9yIFxyIChNYWMpCisgICAgZW9sX3JlID0gcmUuY29tcGlsZShlb2wpCisgICAgZW9sX2NvbnZlbnRpb24gPSBvcy5saW5lc2VwICMgRGVmYXVsdAorCisgICAgZGVmIGxvYWRmaWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBvcGVuIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlIHNvIHRoYXQgd2UgY2FuIGhhbmRsZQorICAgICAgICAgICAgIyAgIGVuZC1vZi1saW5lIGNvbnZlbnRpb24gb3Vyc2VsdmVzLgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3JiJykKKyAgICAgICAgICAgIGNoYXJzID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSS9PIEVycm9yIiwgc3RyKG1zZyksIG1hc3Rlcj1zZWxmLnRleHQpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBjaGFycyA9IHNlbGYuZGVjb2RlKGNoYXJzKQorICAgICAgICAjIFdlIG5vdyBjb252ZXJ0IGFsbCBlbmQtb2YtbGluZXMgdG8gJ1xuJ3MKKyAgICAgICAgZmlyc3Rlb2wgPSBzZWxmLmVvbF9yZS5zZWFyY2goY2hhcnMpCisgICAgICAgIGlmIGZpcnN0ZW9sOgorICAgICAgICAgICAgc2VsZi5lb2xfY29udmVudGlvbiA9IGZpcnN0ZW9sLmdyb3VwKDApCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuZW9sX2NvbnZlbnRpb24sIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIGl0IGlzIGFuIEFTQ0lJIHN0cmluZworICAgICAgICAgICAgICAgIHNlbGYuZW9sX2NvbnZlbnRpb24gPSBzZWxmLmVvbF9jb252ZW50aW9uLmVuY29kZSgiYXNjaWkiKQorICAgICAgICAgICAgY2hhcnMgPSBzZWxmLmVvbF9yZS5zdWIociJcbiIsIGNoYXJzKQorCisgICAgICAgIHNlbGYudGV4dC5kZWxldGUoIjEuMCIsICJlbmQiKQorICAgICAgICBzZWxmLnNldF9maWxlbmFtZShOb25lKQorICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCIxLjAiLCBjaGFycykKKyAgICAgICAgc2VsZi5yZXNldF91bmRvKCkKKyAgICAgICAgc2VsZi5zZXRfZmlsZW5hbWUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgIjEuMCIpCisgICAgICAgIHNlbGYudGV4dC55dmlldygiaW5zZXJ0IikKKyAgICAgICAgc2VsZi51cGRhdGVyZWNlbnRmaWxlc2xpc3QoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIGNoYXJzKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgVW5pY29kZSBzdHJpbmcKKworICAgICAgICBJZiB0aGF0IGZhaWxzLCBsZXQgVGNsIHRyeSBpdHMgYmVzdAorICAgICAgICAiIiIKKyAgICAgICAgIyBDaGVjayBwcmVzZW5jZSBvZiBhIFVURi04IHNpZ25hdHVyZSBmaXJzdAorICAgICAgICBpZiBjaGFycy5zdGFydHN3aXRoKEJPTV9VVEY4KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjaGFycyA9IGNoYXJzWzM6XS5kZWNvZGUoInV0Zi04IikKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBoYXMgVVRGLTggc2lnbmF0dXJlLCBidXQgZmFpbHMgdG8gZGVjb2RlLi4uCisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgSW5kaWNhdGVzIHRoYXQgdGhpcyBmaWxlIG9yaWdpbmFsbHkgaGFkIGEgQk9NCisgICAgICAgICAgICAgICAgc2VsZi5maWxlZW5jb2RpbmcgPSBCT01fVVRGOAorICAgICAgICAgICAgICAgIHJldHVybiBjaGFycworICAgICAgICAjIE5leHQgbG9vayBmb3IgY29kaW5nIHNwZWNpZmljYXRpb24KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jID0gY29kaW5nX3NwZWMoY2hhcnMpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvciwgbmFtZToKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoCisgICAgICAgICAgICAgICAgdGl0bGU9IkVycm9yIGxvYWRpbmcgdGhlIGZpbGUiLAorICAgICAgICAgICAgICAgIG1lc3NhZ2U9IlRoZSBlbmNvZGluZyAnJXMnIGlzIG5vdCBrbm93biB0byB0aGlzIFB5dGhvbiAiXAorICAgICAgICAgICAgICAgICJpbnN0YWxsYXRpb24uIFRoZSBmaWxlIG1heSBub3QgZGlzcGxheSBjb3JyZWN0bHkiICUgbmFtZSwKKyAgICAgICAgICAgICAgICBtYXN0ZXIgPSBzZWxmLnRleHQpCisgICAgICAgICAgICBlbmMgPSBOb25lCisgICAgICAgIGlmIGVuYzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pY29kZShjaGFycywgZW5jKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICMgSWYgaXQgaXMgQVNDSUksIHdlIG5lZWQgbm90IHRvIHJlY29yZCBhbnl0aGluZworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShjaGFycywgJ2FzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBGaW5hbGx5LCB0cnkgdGhlIGxvY2FsZSdzIGVuY29kaW5nLiBUaGlzIGlzIGRlcHJlY2F0ZWQ7CisgICAgICAgICMgdGhlIHVzZXIgc2hvdWxkIGRlY2xhcmUgYSBub24tQVNDSUkgZW5jb2RpbmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2hhcnMgPSB1bmljb2RlKGNoYXJzLCBlbmNvZGluZykKKyAgICAgICAgICAgIHNlbGYuZmlsZWVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIGNoYXJzCisKKyAgICBkZWYgbWF5YmVzYXZlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmdldF9zYXZlZCgpOgorICAgICAgICAgICAgcmV0dXJuICJ5ZXMiCisgICAgICAgIG1lc3NhZ2UgPSAiRG8geW91IHdhbnQgdG8gc2F2ZSAlcyBiZWZvcmUgY2xvc2luZz8iICUgKAorICAgICAgICAgICAgc2VsZi5maWxlbmFtZSBvciAidGhpcyB1bnRpdGxlZCBkb2N1bWVudCIpCisgICAgICAgIGNvbmZpcm0gPSB0a01lc3NhZ2VCb3guYXNreWVzbm9jYW5jZWwoCisgICAgICAgICAgICAgICAgICB0aXRsZT0iU2F2ZSBPbiBDbG9zZSIsCisgICAgICAgICAgICAgICAgICBtZXNzYWdlPW1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICBkZWZhdWx0PXRrTWVzc2FnZUJveC5ZRVMsCisgICAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICBpZiBjb25maXJtOgorICAgICAgICAgICAgcmVwbHkgPSAieWVzIgorICAgICAgICAgICAgc2VsZi5zYXZlKE5vbmUpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5nZXRfc2F2ZWQoKToKKyAgICAgICAgICAgICAgICByZXBseSA9ICJjYW5jZWwiCisgICAgICAgIGVsaWYgY29uZmlybSBpcyBOb25lOgorICAgICAgICAgICAgcmVwbHkgPSAiY2FuY2VsIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVwbHkgPSAibm8iCisgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQorICAgICAgICByZXR1cm4gcmVwbHkKKworICAgIGRlZiBzYXZlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYuZmlsZW5hbWU6CisgICAgICAgICAgICBzZWxmLnNhdmVfYXMoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLndyaXRlZmlsZShzZWxmLmZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLnNldF9zYXZlZChUcnVlKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lZGl0d2luLnN0b3JlX2ZpbGVfYnJlYWtzKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIG1heSBiZSBhIFB5U2hlbGwKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBzYXZlX2FzKHNlbGYsIGV2ZW50KToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmFza3NhdmVmaWxlKCkKKyAgICAgICAgaWYgZmlsZW5hbWU6CisgICAgICAgICAgICBpZiBzZWxmLndyaXRlZmlsZShmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5zZXRfZmlsZW5hbWUoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5zZXRfc2F2ZWQoMSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5zdG9yZV9maWxlX2JyZWFrcygpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLnVwZGF0ZXJlY2VudGZpbGVzbGlzdChmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBzYXZlX2FfY29weShzZWxmLCBldmVudCk6CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5hc2tzYXZlZmlsZSgpCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi53cml0ZWZpbGUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYudGV4dC5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLnVwZGF0ZXJlY2VudGZpbGVzbGlzdChmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiB3cml0ZWZpbGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLmZpeGxhc3RsaW5lKCkKKyAgICAgICAgY2hhcnMgPSBzZWxmLmVuY29kZShzZWxmLnRleHQuZ2V0KCIxLjAiLCAiZW5kLTFjIikpCisgICAgICAgIGlmIHNlbGYuZW9sX2NvbnZlbnRpb24gIT0gIlxuIjoKKyAgICAgICAgICAgIGNoYXJzID0gY2hhcnMucmVwbGFjZSgiXG4iLCBzZWxmLmVvbF9jb252ZW50aW9uKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgIndiIikKKyAgICAgICAgICAgIGYud3JpdGUoY2hhcnMpCisgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIkkvTyBFcnJvciIsIHN0cihtc2cpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXI9c2VsZi50ZXh0KQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGNoYXJzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjaGFycywgdHlwZXMuU3RyaW5nVHlwZSk6CisgICAgICAgICAgICAjIFRoaXMgaXMgZWl0aGVyIHBsYWluIEFTQ0lJLCBvciBUayB3YXMgcmV0dXJuaW5nIG1peGVkLWVuY29kaW5nCisgICAgICAgICAgICAjIHRleHQgdG8gdXMuIERvbid0IHRyeSB0byBndWVzcyBmdXJ0aGVyLgorICAgICAgICAgICAgcmV0dXJuIGNoYXJzCisgICAgICAgICMgU2VlIHdoZXRoZXIgdGhlcmUgaXMgYW55dGhpbmcgbm9uLUFTQ0lJIGluIGl0LgorICAgICAgICAjIElmIG5vdCwgbm8gbmVlZCB0byBmaWd1cmUgb3V0IHRoZSBlbmNvZGluZy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGNoYXJzLmVuY29kZSgnYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIElmIHRoZXJlIGlzIGFuIGVuY29kaW5nIGRlY2xhcmVkLCB0cnkgdGhpcyBmaXJzdC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jID0gY29kaW5nX3NwZWMoY2hhcnMpCisgICAgICAgICAgICBmYWlsZWQgPSBOb25lCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvciwgbXNnOgorICAgICAgICAgICAgZmFpbGVkID0gbXNnCisgICAgICAgICAgICBlbmMgPSBOb25lCisgICAgICAgIGlmIGVuYzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhcnMuZW5jb2RlKGVuYykKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgZmFpbGVkID0gIkludmFsaWQgZW5jb2RpbmcgJyVzJyIgJSBlbmMKKyAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICAgICAiSS9PIEVycm9yIiwKKyAgICAgICAgICAgICAgICAiJXMuIFNhdmluZyBhcyBVVEYtOCIgJSBmYWlsZWQsCisgICAgICAgICAgICAgICAgbWFzdGVyID0gc2VsZi50ZXh0KQorICAgICAgICAjIElmIHRoZXJlIHdhcyBhIFVURi04IHNpZ25hdHVyZSwgdXNlIHRoYXQuIFRoaXMgc2hvdWxkIG5vdCBmYWlsCisgICAgICAgIGlmIHNlbGYuZmlsZWVuY29kaW5nID09IEJPTV9VVEY4IG9yIGZhaWxlZDoKKyAgICAgICAgICAgIHJldHVybiBCT01fVVRGOCArIGNoYXJzLmVuY29kZSgidXRmLTgiKQorICAgICAgICAjIFRyeSB0aGUgb3JpZ2luYWwgZmlsZSBlbmNvZGluZyBuZXh0LCBpZiBhbnkKKyAgICAgICAgaWYgc2VsZi5maWxlZW5jb2Rpbmc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJzLmVuY29kZShzZWxmLmZpbGVlbmNvZGluZykKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIkkvTyBFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICJDYW5ub3Qgc2F2ZSB0aGlzIGFzICclcycgYW55bW9yZS4gU2F2aW5nIGFzIFVURi04IiBcCisgICAgICAgICAgICAgICAgICAgICUgc2VsZi5maWxlZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgIG1hc3RlciA9IHNlbGYudGV4dCkKKyAgICAgICAgICAgICAgICByZXR1cm4gQk9NX1VURjggKyBjaGFycy5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgIyBOb3RoaW5nIHdhcyBkZWNsYXJlZCwgYW5kIHdlIGhhZCBub3QgZGV0ZXJtaW5lZCBhbiBlbmNvZGluZworICAgICAgICAjIG9uIGxvYWRpbmcuIFJlY29tbWVuZCBhbiBlbmNvZGluZyBsaW5lLgorICAgICAgICBjb25maWdfZW5jb2RpbmcgPSBpZGxlQ29uZi5HZXRPcHRpb24oIm1haW4iLCJFZGl0b3JXaW5kb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuY29kaW5nIikKKyAgICAgICAgaWYgY29uZmlnX2VuY29kaW5nID09ICd1dGYtOCc6CisgICAgICAgICAgICAjIFVzZXIgaGFzIHJlcXVlc3RlZCB0aGF0IHdlIHNhdmUgZmlsZXMgYXMgVVRGLTgKKyAgICAgICAgICAgIHJldHVybiBCT01fVVRGOCArIGNoYXJzLmVuY29kZSgidXRmLTgiKQorICAgICAgICBhc2tfdXNlciA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2hhcnMgPSBjaGFycy5lbmNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBlbmMgPSBlbmNvZGluZworICAgICAgICAgICAgaWYgY29uZmlnX2VuY29kaW5nID09ICdsb2NhbGUnOgorICAgICAgICAgICAgICAgIGFza191c2VyID0gRmFsc2UKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIGNoYXJzID0gQk9NX1VURjggKyBjaGFycy5lbmNvZGUoInV0Zi04IikKKyAgICAgICAgICAgIGVuYyA9ICJ1dGYtOCIKKyAgICAgICAgaWYgbm90IGFza191c2VyOgorICAgICAgICAgICAgcmV0dXJuIGNoYXJzCisgICAgICAgIGRpYWxvZyA9IEVuY29kaW5nTWVzc2FnZShzZWxmLmVkaXR3aW4udG9wLCBlbmMpCisgICAgICAgIGRpYWxvZy5nbygpCisgICAgICAgIGlmIGRpYWxvZy5udW0gPT0gMToKKyAgICAgICAgICAgICMgVXNlciBhc2tlZCB1cyB0byBlZGl0IHRoZSBmaWxlCisgICAgICAgICAgICBlbmNsaW5lID0gIiMgLSotIGNvZGluZzogJXMgLSotXG4iICUgZW5jCisgICAgICAgICAgICBmaXJzdGxpbmUgPSBzZWxmLnRleHQuZ2V0KCIxLjAiLCAiMi4wIikKKyAgICAgICAgICAgIGlmIGZpcnN0bGluZS5zdGFydHN3aXRoKCIjISIpOgorICAgICAgICAgICAgICAgICMgSW5zZXJ0IGVuY29kaW5nIGFmdGVyICMhIGxpbmUKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCIyLjAiLCBlbmNsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCIxLjAiLCBlbmNsaW5lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RlKHNlbGYudGV4dC5nZXQoIjEuMCIsICJlbmQtMWMiKSkKKyAgICAgICAgcmV0dXJuIGNoYXJzCisKKyAgICBkZWYgZml4bGFzdGxpbmUoc2VsZik6CisgICAgICAgIGMgPSBzZWxmLnRleHQuZ2V0KCJlbmQtMmMiKQorICAgICAgICBpZiBjICE9ICdcbic6CisgICAgICAgICAgICBzZWxmLnRleHQuaW5zZXJ0KCJlbmQtMWMiLCAiXG4iKQorCisgICAgZGVmIHByaW50X3dpbmRvdyhzZWxmLCBldmVudCk6CisgICAgICAgIGNvbmZpcm0gPSB0a01lc3NhZ2VCb3guYXNrb2tjYW5jZWwoCisgICAgICAgICAgICAgICAgICB0aXRsZT0iUHJpbnQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZT0iUHJpbnQgdG8gRGVmYXVsdCBQcmludGVyIiwKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9dGtNZXNzYWdlQm94Lk9LLAorICAgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYudGV4dCkKKyAgICAgICAgaWYgbm90IGNvbmZpcm06CisgICAgICAgICAgICBzZWxmLnRleHQuZm9jdXNfc2V0KCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIHRlbXBmaWxlbmFtZSA9IE5vbmUKKyAgICAgICAgc2F2ZWQgPSBzZWxmLmdldF9zYXZlZCgpCisgICAgICAgIGlmIHNhdmVkOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmZpbGVuYW1lCisgICAgICAgICMgc2hlbGwgdW5kbyBpcyByZXNldCBhZnRlciBldmVyeSBwcm9tcHQsIGxvb2tzIHNhdmVkLCBwcm9iYWJseSBpc24ndAorICAgICAgICBpZiBub3Qgc2F2ZWQgb3IgZmlsZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICh0ZmQsIHRlbXBmaWxlbmFtZSkgPSB0ZW1wZmlsZS5ta3N0ZW1wKHByZWZpeD0nSURMRV90bXBfJykKKyAgICAgICAgICAgIGZpbGVuYW1lID0gdGVtcGZpbGVuYW1lCisgICAgICAgICAgICBvcy5jbG9zZSh0ZmQpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi53cml0ZWZpbGUodGVtcGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVtcGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIHBsYXRmb3JtID0gb3MubmFtZQorICAgICAgICBwcmludFBsYXRmb3JtID0gVHJ1ZQorICAgICAgICBpZiBwbGF0Zm9ybSA9PSAncG9zaXgnOiAjcG9zaXggcGxhdGZvcm0KKyAgICAgICAgICAgIGNvbW1hbmQgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdHZW5lcmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW50LWNvbW1hbmQtcG9zaXgnKQorICAgICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQgKyAiIDI+JjEiCisgICAgICAgIGVsaWYgcGxhdGZvcm0gPT0gJ250JzogI3dpbjMyIHBsYXRmb3JtCisgICAgICAgICAgICBjb21tYW5kID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnR2VuZXJhbCcsJ3ByaW50LWNvbW1hbmQtd2luJykKKyAgICAgICAgZWxzZTogI25vIHByaW50aW5nIGZvciB0aGlzIHBsYXRmb3JtCisgICAgICAgICAgICBwcmludFBsYXRmb3JtID0gRmFsc2UKKyAgICAgICAgaWYgcHJpbnRQbGF0Zm9ybTogICN3ZSBjYW4gdHJ5IHRvIHByaW50IGZvciB0aGlzIHBsYXRmb3JtCisgICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZCAlIHBpcGVzLnF1b3RlKGZpbGVuYW1lKQorICAgICAgICAgICAgcGlwZSA9IG9zLnBvcGVuKGNvbW1hbmQsICJyIikKKyAgICAgICAgICAgICMgdGhpbmdzIGNhbiBnZXQgdWdseSBvbiBOVCBpZiB0aGVyZSBpcyBubyBwcmludGVyIGF2YWlsYWJsZS4KKyAgICAgICAgICAgIG91dHB1dCA9IHBpcGUucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgIHN0YXR1cyA9IHBpcGUuY2xvc2UoKQorICAgICAgICAgICAgaWYgc3RhdHVzOgorICAgICAgICAgICAgICAgIG91dHB1dCA9ICJQcmludGluZyBmYWlsZWQgKGV4aXQgc3RhdHVzIDB4JXgpXG4iICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyArIG91dHB1dAorICAgICAgICAgICAgaWYgb3V0cHV0OgorICAgICAgICAgICAgICAgIG91dHB1dCA9ICJQcmludGluZyBjb21tYW5kOiAlc1xuIiAlIHJlcHIoY29tbWFuZCkgKyBvdXRwdXQKKyAgICAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJQcmludCBzdGF0dXMiLCBvdXRwdXQsIG1hc3Rlcj1zZWxmLnRleHQpCisgICAgICAgIGVsc2U6ICAjbm8gcHJpbnRpbmcgZm9yIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgICAgIG1lc3NhZ2UgPSAiUHJpbnRpbmcgaXMgbm90IGVuYWJsZWQgZm9yIHRoaXMgcGxhdGZvcm06ICVzIiAlIHBsYXRmb3JtCisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2luZm8oIlByaW50IHN0YXR1cyIsIG1lc3NhZ2UsIG1hc3Rlcj1zZWxmLnRleHQpCisgICAgICAgIGlmIHRlbXBmaWxlbmFtZToKKyAgICAgICAgICAgIG9zLnVubGluayh0ZW1wZmlsZW5hbWUpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBvcGVuZGlhbG9nID0gTm9uZQorICAgIHNhdmVkaWFsb2cgPSBOb25lCisKKyAgICBmaWxldHlwZXMgPSBbCisgICAgICAgICgiUHl0aG9uIGZpbGVzIiwgIioucHkgKi5weXciLCAiVEVYVCIpLAorICAgICAgICAoIlRleHQgZmlsZXMiLCAiKi50eHQiLCAiVEVYVCIpLAorICAgICAgICAoIkFsbCBmaWxlcyIsICIqIiksCisgICAgICAgIF0KKworICAgIGRlZiBhc2tvcGVuZmlsZShzZWxmKToKKyAgICAgICAgZGlyLCBiYXNlID0gc2VsZi5kZWZhdWx0ZmlsZW5hbWUoIm9wZW4iKQorICAgICAgICBpZiBub3Qgc2VsZi5vcGVuZGlhbG9nOgorICAgICAgICAgICAgc2VsZi5vcGVuZGlhbG9nID0gdGtGaWxlRGlhbG9nLk9wZW4obWFzdGVyPXNlbGYudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGV0eXBlcz1zZWxmLmZpbGV0eXBlcykKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm9wZW5kaWFsb2cuc2hvdyhpbml0aWFsZGlyPWRpciwgaW5pdGlhbGZpbGU9YmFzZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlbmFtZSwgdW5pY29kZSk6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLmVuY29kZShmaWxlc3lzdGVtZW5jb2RpbmcpCisgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIGRlZmF1bHRmaWxlbmFtZShzZWxmLCBtb2RlPSJvcGVuIik6CisgICAgICAgIGlmIHNlbGYuZmlsZW5hbWU6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5zcGxpdChzZWxmLmZpbGVuYW1lKQorICAgICAgICBlbGlmIHNlbGYuZGlybmFtZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRpcm5hbWUsICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHdkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwd2QgPSAiIgorICAgICAgICAgICAgcmV0dXJuIHB3ZCwgIiIKKworICAgIGRlZiBhc2tzYXZlZmlsZShzZWxmKToKKyAgICAgICAgZGlyLCBiYXNlID0gc2VsZi5kZWZhdWx0ZmlsZW5hbWUoInNhdmUiKQorICAgICAgICBpZiBub3Qgc2VsZi5zYXZlZGlhbG9nOgorICAgICAgICAgICAgc2VsZi5zYXZlZGlhbG9nID0gdGtGaWxlRGlhbG9nLlNhdmVBcyhtYXN0ZXI9c2VsZi50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxldHlwZXM9c2VsZi5maWxldHlwZXMpCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5zYXZlZGlhbG9nLnNob3coaW5pdGlhbGRpcj1kaXIsIGluaXRpYWxmaWxlPWJhc2UpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZW5hbWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5lbmNvZGUoZmlsZXN5c3RlbWVuY29kaW5nKQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiB1cGRhdGVyZWNlbnRmaWxlc2xpc3Qoc2VsZixmaWxlbmFtZSk6CisgICAgICAgICJVcGRhdGUgcmVjZW50IGZpbGUgbGlzdCBvbiBhbGwgZWRpdG9yIHdpbmRvd3MiCisgICAgICAgIHNlbGYuZWRpdHdpbi51cGRhdGVfcmVjZW50X2ZpbGVzX2xpc3QoZmlsZW5hbWUpCisKK2RlZiB0ZXN0KCk6CisgICAgcm9vdCA9IFRrKCkKKyAgICBjbGFzcyBNeUVkaXRXaW46CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKKyAgICAgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAgICAgICAgIHNlbGYuZmxpc3QgPSBOb25lCisgICAgICAgICAgICBzZWxmLnRleHQuYmluZCgiPENvbnRyb2wtbz4iLCBzZWxmLm9wZW4pCisgICAgICAgICAgICBzZWxmLnRleHQuYmluZCgiPENvbnRyb2wtcz4iLCBzZWxmLnNhdmUpCisgICAgICAgICAgICBzZWxmLnRleHQuYmluZCgiPEFsdC1zPiIsIHNlbGYuc2F2ZV9hcykKKyAgICAgICAgICAgIHNlbGYudGV4dC5iaW5kKCI8QWx0LXo+Iiwgc2VsZi5zYXZlX2FfY29weSkKKyAgICAgICAgZGVmIGdldF9zYXZlZChzZWxmKTogcmV0dXJuIDAKKyAgICAgICAgZGVmIHNldF9zYXZlZChzZWxmLCBmbGFnKTogcGFzcworICAgICAgICBkZWYgcmVzZXRfdW5kbyhzZWxmKTogcGFzcworICAgICAgICBkZWYgb3BlbihzZWxmLCBldmVudCk6CisgICAgICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoIjw8b3Blbi13aW5kb3ctZnJvbS1maWxlPj4iKQorICAgICAgICBkZWYgc2F2ZShzZWxmLCBldmVudCk6CisgICAgICAgICAgICBzZWxmLnRleHQuZXZlbnRfZ2VuZXJhdGUoIjw8c2F2ZS13aW5kb3c+PiIpCisgICAgICAgIGRlZiBzYXZlX2FzKHNlbGYsIGV2ZW50KToKKyAgICAgICAgICAgIHNlbGYudGV4dC5ldmVudF9nZW5lcmF0ZSgiPDxzYXZlLXdpbmRvdy1hcy1maWxlPj4iKQorICAgICAgICBkZWYgc2F2ZV9hX2NvcHkoc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2dlbmVyYXRlKCI8PHNhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZT4+IikKKyAgICB0ZXh0ID0gVGV4dChyb290KQorICAgIHRleHQucGFjaygpCisgICAgdGV4dC5mb2N1c19zZXQoKQorICAgIGVkaXR3aW4gPSBNeUVkaXRXaW4odGV4dCkKKyAgICBpbyA9IElPQmluZGluZyhlZGl0d2luKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSU9CaW5kaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RiOTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSU9CaW5kaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RiOTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lPQmluZGluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL2ZvbGRlci5naWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvZm9sZGVyLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZlOGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL2ZvbGRlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL2lkbGUuaWNucyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9pZGxlLmljbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZTMxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9pZGxlLmljbnMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL21pbnVzbm9kZS5naWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvbWludXNub2RlLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJlNDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL21pbnVzbm9kZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL29wZW5mb2xkZXIuZ2lmIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL29wZW5mb2xkZXIuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YWVhMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvb3BlbmZvbGRlci5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL3BsdXNub2RlLmdpZiBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9wbHVzbm9kZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhY2U5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy9wbHVzbm9kZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL3B5dGhvbi5naWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWNvbnMvcHl0aG9uLmdpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODI3MWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL3B5dGhvbi5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0ljb25zL3RrLmdpZiBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy90ay5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwM2Y1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9JY29ucy90ay5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4M2ExNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWRsZUhpc3RvcnkucHkKQEAgLTAsMCArMSw4OCBAQAorZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKK2NsYXNzIEhpc3Rvcnk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGV4dCwgb3V0cHV0X3NlcCA9ICJcbiIpOgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisgICAgICAgIHNlbGYuaGlzdG9yeSA9IFtdCisgICAgICAgIHNlbGYuaGlzdG9yeV9wcmVmaXggPSBOb25lCisgICAgICAgIHNlbGYuaGlzdG9yeV9wb2ludGVyID0gTm9uZQorICAgICAgICBzZWxmLm91dHB1dF9zZXAgPSBvdXRwdXRfc2VwCisgICAgICAgIHNlbGYuY3ljbGljID0gaWRsZUNvbmYuR2V0T3B0aW9uKCJtYWluIiwgIkhpc3RvcnkiLCAiY3ljbGljIiwgMSwgImJvb2wiKQorICAgICAgICB0ZXh0LmJpbmQoIjw8aGlzdG9yeS1wcmV2aW91cz4+Iiwgc2VsZi5oaXN0b3J5X3ByZXYpCisgICAgICAgIHRleHQuYmluZCgiPDxoaXN0b3J5LW5leHQ+PiIsIHNlbGYuaGlzdG9yeV9uZXh0KQorCisgICAgZGVmIGhpc3RvcnlfbmV4dChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuaGlzdG9yeV9kbygwKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGhpc3RvcnlfcHJldihzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuaGlzdG9yeV9kbygxKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIF9nZXRfc291cmNlKHNlbGYsIHN0YXJ0LCBlbmQpOgorICAgICAgICAjIEdldCBzb3VyY2UgY29kZSBmcm9tIHN0YXJ0IGluZGV4IHRvIGVuZCBpbmRleC4gIExpbmVzIGluIHRoZQorICAgICAgICAjIHRleHQgY29udHJvbCBtYXkgYmUgc2VwYXJhdGVkIGJ5IHN5cy5wczIgLgorICAgICAgICBsaW5lcyA9IHNlbGYudGV4dC5nZXQoc3RhcnQsIGVuZCkuc3BsaXQoc2VsZi5vdXRwdXRfc2VwKQorICAgICAgICByZXR1cm4gIlxuIi5qb2luKGxpbmVzKQorCisgICAgZGVmIF9wdXRfc291cmNlKHNlbGYsIHdoZXJlLCBzb3VyY2UpOgorICAgICAgICBvdXRwdXQgPSBzZWxmLm91dHB1dF9zZXAuam9pbihzb3VyY2Uuc3BsaXQoIlxuIikpCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQod2hlcmUsIG91dHB1dCkKKworICAgIGRlZiBoaXN0b3J5X2RvKHNlbGYsIHJldmVyc2UpOgorICAgICAgICBuaGlzdCA9IGxlbihzZWxmLmhpc3RvcnkpCisgICAgICAgIHBvaW50ZXIgPSBzZWxmLmhpc3RvcnlfcG9pbnRlcgorICAgICAgICBwcmVmaXggPSBzZWxmLmhpc3RvcnlfcHJlZml4CisgICAgICAgIGlmIHBvaW50ZXIgaXMgbm90IE5vbmUgYW5kIHByZWZpeCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCJpbnNlcnQiLCAiIT0iLCAiZW5kLTFjIikgb3IgXAorICAgICAgICAgICAgICAgc2VsZi5fZ2V0X3NvdXJjZSgiaW9tYXJrIiwgImVuZC0xYyIpICE9IHNlbGYuaGlzdG9yeVtwb2ludGVyXToKKyAgICAgICAgICAgICAgICBwb2ludGVyID0gcHJlZml4ID0gTm9uZQorICAgICAgICBpZiBwb2ludGVyIGlzIE5vbmUgb3IgcHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICBwcmVmaXggPSBzZWxmLl9nZXRfc291cmNlKCJpb21hcmsiLCAiZW5kLTFjIikKKyAgICAgICAgICAgIGlmIHJldmVyc2U6CisgICAgICAgICAgICAgICAgcG9pbnRlciA9IG5oaXN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY3ljbGljOgorICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gLTEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBucHJlZml4ID0gbGVuKHByZWZpeCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGlmIHJldmVyc2U6CisgICAgICAgICAgICAgICAgcG9pbnRlciA9IHBvaW50ZXIgLSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBwb2ludGVyICsgMQorICAgICAgICAgICAgaWYgcG9pbnRlciA8IDAgb3IgcG9pbnRlciA+PSBuaGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQuYmVsbCgpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuY3ljbGljIGFuZCBwb2ludGVyIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5fZ2V0X3NvdXJjZSgiaW9tYXJrIiwgImVuZC0xYyIpICE9IHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGV4dC5kZWxldGUoImlvbWFyayIsICJlbmQtMWMiKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHV0X3NvdXJjZSgiaW9tYXJrIiwgcHJlZml4KQorICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gcHJlZml4ID0gTm9uZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpdGVtID0gc2VsZi5oaXN0b3J5W3BvaW50ZXJdCisgICAgICAgICAgICBpZiBpdGVtWzpucHJlZml4XSA9PSBwcmVmaXggYW5kIGxlbihpdGVtKSA+IG5wcmVmaXg6CisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmRlbGV0ZSgiaW9tYXJrIiwgImVuZC0xYyIpCisgICAgICAgICAgICAgICAgc2VsZi5fcHV0X3NvdXJjZSgiaW9tYXJrIiwgaXRlbSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICJlbmQtMWMiKQorICAgICAgICBzZWxmLnRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICBzZWxmLnRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQorICAgICAgICBzZWxmLmhpc3RvcnlfcG9pbnRlciA9IHBvaW50ZXIKKyAgICAgICAgc2VsZi5oaXN0b3J5X3ByZWZpeCA9IHByZWZpeAorCisgICAgZGVmIGhpc3Rvcnlfc3RvcmUoc2VsZiwgc291cmNlKToKKyAgICAgICAgc291cmNlID0gc291cmNlLnN0cmlwKCkKKyAgICAgICAgaWYgbGVuKHNvdXJjZSkgPiAyOgorICAgICAgICAgICAgIyBhdm9pZCBkdXBsaWNhdGVzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5oaXN0b3J5LnJlbW92ZShzb3VyY2UpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLmhpc3RvcnkuYXBwZW5kKHNvdXJjZSkKKyAgICAgICAgc2VsZi5oaXN0b3J5X3BvaW50ZXIgPSBOb25lCisgICAgICAgIHNlbGYuaGlzdG9yeV9wcmVmaXggPSBOb25lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWRsZUhpc3RvcnkucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUzOTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvSWRsZUhpc3RvcnkucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmUzOTkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL0lkbGVIaXN0b3J5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlDYWxsLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpQ2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDMyYTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL011bHRpQ2FsbC5weQpAQCAtMCwwICsxLDQyMyBAQAorIiIiCitNdWx0aUNhbGwgLSBhIGNsYXNzIHdoaWNoIGluaGVyaXRzIGl0cyBtZXRob2RzIGZyb20gYSBUa2ludGVyIHdpZGdldCAoVGV4dCwgZm9yCitleGFtcGxlKSwgYnV0IGVuYWJsZXMgbXVsdGlwbGUgY2FsbHMgb2YgZnVuY3Rpb25zIHBlciB2aXJ0dWFsIGV2ZW50IC0gYWxsCittYXRjaGluZyBldmVudHMgd2lsbCBiZSBjYWxsZWQsIG5vdCBvbmx5IHRoZSBtb3N0IHNwZWNpZmljIG9uZS4gVGhpcyBpcyBkb25lCitieSB3cmFwcGluZyB0aGUgZXZlbnQgZnVuY3Rpb25zIC0gZXZlbnRfYWRkLCBldmVudF9kZWxldGUgYW5kIGV2ZW50X2luZm8uCitNdWx0aUNhbGwgcmVjb2duaXplcyBvbmx5IGEgc3Vic2V0IG9mIGxlZ2FsIGV2ZW50IHNlcXVlbmNlcy4gU2VxdWVuY2VzIHdoaWNoCithcmUgbm90IHJlY29nbml6ZWQgYXJlIHRyZWF0ZWQgYnkgdGhlIG9yaWdpbmFsIFRrIGhhbmRsaW5nIG1lY2hhbmlzbS4gQQorbW9yZS1zcGVjaWZpYyBldmVudCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgYSBsZXNzLXNwZWNpZmljIGV2ZW50LgorCitUaGUgcmVjb2duaXplZCBzZXF1ZW5jZXMgYXJlIGNvbXBsZXRlIG9uZS1ldmVudCBzZXF1ZW5jZXMgKG5vIGVtYWNzLXN0eWxlCitDdHJsLVggQ3RybC1DLCBubyBzaG9ydGN1dHMgbGlrZSA8Mz4pLCBmb3IgYWxsIHR5cGVzIG9mIGV2ZW50cy4KK0tleS9CdXR0b24gUHJlc3MvUmVsZWFzZSBldmVudHMgY2FuIGhhdmUgbW9kaWZpZXJzLgorVGhlIHJlY29nbml6ZWQgbW9kaWZpZXJzIGFyZSBTaGlmdCwgQ29udHJvbCwgT3B0aW9uIGFuZCBDb21tYW5kIGZvciBNYWMsIGFuZAorQ29udHJvbCwgQWx0LCBTaGlmdCwgTWV0YS9NIGZvciBvdGhlciBwbGF0Zm9ybXMuCisKK0ZvciBhbGwgZXZlbnRzIHdoaWNoIHdlcmUgaGFuZGxlZCBieSBNdWx0aUNhbGwsIGEgbmV3IG1lbWJlciBpcyBhZGRlZCB0byB0aGUKK2V2ZW50IGluc3RhbmNlIHBhc3NlZCB0byB0aGUgYmluZGVkIGZ1bmN0aW9ucyAtIG1jX3R5cGUuIFRoaXMgaXMgb25lIG9mIHRoZQorZXZlbnQgdHlwZSBjb25zdGFudHMgZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSAoc3VjaCBhcyBNQ19LRVlQUkVTUykuCitGb3IgS2V5L0J1dHRvbiBldmVudHMgKHdoaWNoIGFyZSBoYW5kbGVkIGJ5IE11bHRpQ2FsbCBhbmQgbWF5IHJlY2VpdmUKK21vZGlmaWVycyksIGFub3RoZXIgbWVtYmVyIGlzIGFkZGVkIC0gbWNfc3RhdGUuIFRoaXMgbWVtYmVyIGdpdmVzIHRoZSBzdGF0ZQorb2YgdGhlIHJlY29nbml6ZWQgbW9kaWZpZXJzLCBhcyBhIGNvbWJpbmF0aW9uIG9mIHRoZSBtb2RpZmllciBjb25zdGFudHMKK2Fsc28gZGVmaW5lZCBpbiB0aGlzIG1vZHVsZSAoZm9yIGV4YW1wbGUsIE1DX1NISUZUKS4KK1VzaW5nIHRoZXNlIG1lbWJlcnMgaXMgYWJzb2x1dGVseSBwb3J0YWJsZS4KKworVGhlIG9yZGVyIGJ5IHdoaWNoIGV2ZW50cyBhcmUgY2FsbGVkIGlzIGRlZmluZWQgYnkgdGhlc2UgcnVsZXM6CisxLiBBIG1vcmUtc3BlY2lmaWMgZXZlbnQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGEgbGVzcy1zcGVjaWZpYyBldmVudC4KKzIuIEEgcmVjZW50bHktYmluZGVkIGV2ZW50IHdpbGwgYmUgY2FsbGVkIGJlZm9yZSBhIHByZXZpb3VzbHktYmluZGVkIGV2ZW50LAorICAgdW5sZXNzIHRoaXMgY29uZmxpY3RzIHdpdGggdGhlIGZpcnN0IHJ1bGUuCitFYWNoIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBmb3IgZWFjaCBldmVudC4KKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgcmUKK2ltcG9ydCBUa2ludGVyCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKworIyB0aGUgZXZlbnQgdHlwZSBjb25zdGFudHMsIHdoaWNoIGRlZmluZSB0aGUgbWVhbmluZyBvZiBtY190eXBlCitNQ19LRVlQUkVTUz0wOyBNQ19LRVlSRUxFQVNFPTE7IE1DX0JVVFRPTlBSRVNTPTI7IE1DX0JVVFRPTlJFTEVBU0U9MzsKK01DX0FDVElWQVRFPTQ7IE1DX0NJUkNVTEFURT01OyBNQ19DT0xPUk1BUD02OyBNQ19DT05GSUdVUkU9NzsKK01DX0RFQUNUSVZBVEU9ODsgTUNfREVTVFJPWT05OyBNQ19FTlRFUj0xMDsgTUNfRVhQT1NFPTExOyBNQ19GT0NVU0lOPTEyOworTUNfRk9DVVNPVVQ9MTM7IE1DX0dSQVZJVFk9MTQ7IE1DX0xFQVZFPTE1OyBNQ19NQVA9MTY7IE1DX01PVElPTj0xNzsKK01DX01PVVNFV0hFRUw9MTg7IE1DX1BST1BFUlRZPTE5OyBNQ19SRVBBUkVOVD0yMDsgTUNfVU5NQVA9MjE7IE1DX1ZJU0lCSUxJVFk9MjI7CisjIHRoZSBtb2RpZmllciBzdGF0ZSBjb25zdGFudHMsIHdoaWNoIGRlZmluZSB0aGUgbWVhbmluZyBvZiBtY19zdGF0ZQorTUNfU0hJRlQgPSAxPDwwOyBNQ19DT05UUk9MID0gMTw8MjsgTUNfQUxUID0gMTw8MzsgTUNfTUVUQSA9IDE8PDUKK01DX09QVElPTiA9IDE8PDY7IE1DX0NPTU1BTkQgPSAxPDw3CisKKyMgZGVmaW5lIHRoZSBsaXN0IG9mIG1vZGlmaWVycywgdG8gYmUgdXNlZCBpbiBjb21wbGV4IGV2ZW50IHR5cGVzLgoraWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICBfbW9kaWZpZXJzID0gKCgiU2hpZnQiLCksICgiQ29udHJvbCIsKSwgKCJPcHRpb24iLCksICgiQ29tbWFuZCIsKSkKKyAgICBfbW9kaWZpZXJfbWFza3MgPSAoTUNfU0hJRlQsIE1DX0NPTlRST0wsIE1DX09QVElPTiwgTUNfQ09NTUFORCkKK2Vsc2U6CisgICAgX21vZGlmaWVycyA9ICgoIkNvbnRyb2wiLCksICgiQWx0IiwpLCAoIlNoaWZ0IiwpLCAoIk1ldGEiLCAiTSIpKQorICAgIF9tb2RpZmllcl9tYXNrcyA9IChNQ19DT05UUk9MLCBNQ19BTFQsIE1DX1NISUZULCBNQ19NRVRBKQorCisjIGEgZGljdGlvbmFyeSB0byBtYXAgYSBtb2RpZmllciBuYW1lIGludG8gaXRzIG51bWJlcgorX21vZGlmaWVyX25hbWVzID0gZGljdChbKG5hbWUsIG51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbnVtYmVyIGluIHJhbmdlKGxlbihfbW9kaWZpZXJzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBfbW9kaWZpZXJzW251bWJlcl1dKQorCisjIEEgYmluZGVyIGlzIGEgY2xhc3Mgd2hpY2ggYmluZHMgZnVuY3Rpb25zIHRvIG9uZSB0eXBlIG9mIGV2ZW50LiBJdCBoYXMgdHdvCisjIG1ldGhvZHM6IGJpbmQgYW5kIHVuYmluZCwgd2hpY2ggZ2V0IGEgZnVuY3Rpb24gYW5kIGEgcGFyc2VkIHNlcXVlbmNlLCBhcworIyByZXR1cm5lZCBieSBfcGFyc2Vfc2VxdWVuY2UoKS4gVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBiaW5kZXJzOgorIyBfU2ltcGxlQmluZGVyIGhhbmRsZXMgZXZlbnQgdHlwZXMgd2l0aCBubyBtb2RpZmllcnMgYW5kIG5vIGRldGFpbC4KKyMgTm8gUHl0aG9uIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdoZW4gbm8gZXZlbnRzIGFyZSBiaW5kZWQuCisjIF9Db21wbGV4QmluZGVyIGhhbmRsZXMgZXZlbnQgdHlwZXMgd2l0aCBtb2RpZmllcnMgYW5kIGEgZGV0YWlsLgorIyBBIFB5dGhvbiBmdW5jdGlvbiBpcyBjYWxsZWQgZWFjaCB0aW1lIGFuIGV2ZW50IGlzIGdlbmVyYXRlZC4KKworY2xhc3MgX1NpbXBsZUJpbmRlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSwgd2lkZ2V0LCB3aWRnZXRpbnN0KToKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLnNlcXVlbmNlID0gJzwnK190eXBlc1t0eXBlXVswXSsnPicKKyAgICAgICAgc2VsZi53aWRnZXQgPSB3aWRnZXQKKyAgICAgICAgc2VsZi53aWRnZXRpbnN0ID0gd2lkZ2V0aW5zdAorICAgICAgICBzZWxmLmJpbmRlZGZ1bmNzID0gW10KKyAgICAgICAgc2VsZi5oYW5kbGVyaWQgPSBOb25lCisKKyAgICBkZWYgYmluZChzZWxmLCB0cmlwbGV0LCBmdW5jKToKKyAgICAgICAgaWYgbm90IHNlbGYuaGFuZGxlcmlkOgorICAgICAgICAgICAgZGVmIGhhbmRsZXIoZXZlbnQsIGwgPSBzZWxmLmJpbmRlZGZ1bmNzLCBtY190eXBlID0gc2VsZi50eXBlKToKKyAgICAgICAgICAgICAgICBldmVudC5tY190eXBlID0gbWNfdHlwZQorICAgICAgICAgICAgICAgIHdhc2NhbGxlZCA9IHt9CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGwpLTEsIC0xLCAtMSk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMgPSBsW2ldCisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmMgbm90IGluIHdhc2NhbGxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhc2NhbGxlZFtmdW5jXSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBmdW5jKGV2ZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcgorICAgICAgICAgICAgc2VsZi5oYW5kbGVyaWQgPSBzZWxmLndpZGdldC5iaW5kKHNlbGYud2lkZ2V0aW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcXVlbmNlLCBoYW5kbGVyKQorICAgICAgICBzZWxmLmJpbmRlZGZ1bmNzLmFwcGVuZChmdW5jKQorCisgICAgZGVmIHVuYmluZChzZWxmLCB0cmlwbGV0LCBmdW5jKToKKyAgICAgICAgc2VsZi5iaW5kZWRmdW5jcy5yZW1vdmUoZnVuYykKKyAgICAgICAgaWYgbm90IHNlbGYuYmluZGVkZnVuY3M6CisgICAgICAgICAgICBzZWxmLndpZGdldC51bmJpbmQoc2VsZi53aWRnZXRpbnN0LCBzZWxmLnNlcXVlbmNlLCBzZWxmLmhhbmRsZXJpZCkKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlcmlkID0gTm9uZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuaGFuZGxlcmlkOgorICAgICAgICAgICAgc2VsZi53aWRnZXQudW5iaW5kKHNlbGYud2lkZ2V0aW5zdCwgc2VsZi5zZXF1ZW5jZSwgc2VsZi5oYW5kbGVyaWQpCisKKyMgQW4gaW50IGluIHJhbmdlKDEgPDwgbGVuKF9tb2RpZmllcnMpKSByZXByZXNlbnRzIGEgY29tYmluYXRpb24gb2YgbW9kaWZpZXJzCisjIChpZiB0aGUgbGVhc3Qgc2lnbmlmaWNlbnQgYml0IGlzIG9uLCBfbW9kaWZpZXJzWzBdIGlzIG9uLCBhbmQgc28gb24pLgorIyBfc3RhdGVfc3Vic2V0cyBnaXZlcyBmb3IgZWFjaCBjb21iaW5hdGlvbiBvZiBtb2RpZmllcnMsIG9yICpzdGF0ZSosCisjIGEgbGlzdCBvZiB0aGUgc3RhdGVzIHdoaWNoIGFyZSBhIHN1YnNldCBvZiBpdC4gVGhpcyBsaXN0IGlzIG9yZGVyZWQgYnkgdGhlCisjIG51bWJlciBvZiBtb2RpZmllcnMgaXMgdGhlIHN0YXRlIC0gdGhlIG1vc3Qgc3BlY2lmaWMgc3RhdGUgY29tZXMgZmlyc3QuCitfc3RhdGVzID0gcmFuZ2UoMSA8PCBsZW4oX21vZGlmaWVycykpCitfc3RhdGVfbmFtZXMgPSBbJycuam9pbihtWzBdKyctJworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGksIG0gaW4gZW51bWVyYXRlKF9tb2RpZmllcnMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoMSA8PCBpKSAmIHMpCisgICAgICAgICAgICAgICAgZm9yIHMgaW4gX3N0YXRlc10KKworZGVmIGV4cGFuZF9zdWJzdGF0ZXMoc3RhdGVzKToKKyAgICAnJydGb3IgZWFjaCBpdGVtIG9mIHN0YXRlcyByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgYWxsIGNvbWJpbmF0aW9ucyBvZgorICAgIHRoYXQgaXRlbSB3aXRoIGluZGl2aWR1YWwgYml0cyByZXNldCwgc29ydGVkIGJ5IHRoZSBudW1iZXIgb2Ygc2V0IGJpdHMuCisgICAgJycnCisgICAgZGVmIG5iaXRzKG4pOgorICAgICAgICAibnVtYmVyIG9mIGJpdHMgc2V0IGluIG4gYmFzZSAyIgorICAgICAgICBuYiA9IDAKKyAgICAgICAgd2hpbGUgbjoKKyAgICAgICAgICAgIG4sIHJlbSA9IGRpdm1vZChuLCAyKQorICAgICAgICAgICAgbmIgKz0gcmVtCisgICAgICAgIHJldHVybiBuYgorICAgIHN0YXRlbGlzdCA9IFtdCisgICAgZm9yIHN0YXRlIGluIHN0YXRlczoKKyAgICAgICAgc3Vic3RhdGVzID0gbGlzdChzZXQoc3RhdGUgJiB4IGZvciB4IGluIHN0YXRlcykpCisgICAgICAgIHN1YnN0YXRlcy5zb3J0KGtleT1uYml0cywgcmV2ZXJzZT1UcnVlKQorICAgICAgICBzdGF0ZWxpc3QuYXBwZW5kKHN1YnN0YXRlcykKKyAgICByZXR1cm4gc3RhdGVsaXN0CisKK19zdGF0ZV9zdWJzZXRzID0gZXhwYW5kX3N1YnN0YXRlcyhfc3RhdGVzKQorCisjIF9zdGF0ZV9jb2RlcyBnaXZlcyBmb3IgZWFjaCBzdGF0ZSwgdGhlIHBvcnRhYmxlIGNvZGUgdG8gYmUgcGFzc2VkIGFzIG1jX3N0YXRlCitfc3RhdGVfY29kZXMgPSBbXQorZm9yIHMgaW4gX3N0YXRlczoKKyAgICByID0gMAorICAgIGZvciBpIGluIHJhbmdlKGxlbihfbW9kaWZpZXJzKSk6CisgICAgICAgIGlmICgxIDw8IGkpICYgczoKKyAgICAgICAgICAgIHIgfD0gX21vZGlmaWVyX21hc2tzW2ldCisgICAgX3N0YXRlX2NvZGVzLmFwcGVuZChyKQorCitjbGFzcyBfQ29tcGxleEJpbmRlcjoKKyAgICAjIFRoaXMgY2xhc3MgYmluZHMgbWFueSBmdW5jdGlvbnMsIGFuZCBvbmx5IHVuYmluZHMgdGhlbSB3aGVuIGl0IGlzIGRlbGV0ZWQuCisgICAgIyBzZWxmLmhhbmRsZXJpZHMgaXMgdGhlIGxpc3Qgb2Ygc2VxcyBhbmQgaWRzIG9mIGJpbmRlZCBoYW5kbGVyIGZ1bmN0aW9ucy4KKyAgICAjIFRoZSBiaW5kZWQgZnVuY3Rpb25zIHNpdCBpbiBhIGRpY3Rpb25hcnkgb2YgbGlzdHMgb2YgbGlzdHMsIHdoaWNoIG1hcHMKKyAgICAjIGEgZGV0YWlsIChvciBOb25lKSBhbmQgYSBzdGF0ZSBpbnRvIGEgbGlzdCBvZiBmdW5jdGlvbnMuCisgICAgIyBXaGVuIGEgbmV3IGRldGFpbCBpcyBkaXNjb3ZlcmVkLCBoYW5kbGVycyBmb3IgYWxsIHRoZSBwb3NzaWJsZSBzdGF0ZXMKKyAgICAjIGFyZSBiaW5kZWQuCisKKyAgICBkZWYgX19jcmVhdGVfaGFuZGxlcihzZWxmLCBsaXN0cywgbWNfdHlwZSwgbWNfc3RhdGUpOgorICAgICAgICBkZWYgaGFuZGxlcihldmVudCwgbGlzdHMgPSBsaXN0cywKKyAgICAgICAgICAgICAgICAgICAgbWNfdHlwZSA9IG1jX3R5cGUsIG1jX3N0YXRlID0gbWNfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIGlzaGFuZGxlcnJ1bm5pbmcgPSBzZWxmLmlzaGFuZGxlcnJ1bm5pbmcsCisgICAgICAgICAgICAgICAgICAgIGRvYWZ0ZXJoYW5kbGVyID0gc2VsZi5kb2FmdGVyaGFuZGxlcik6CisgICAgICAgICAgICBpc2hhbmRsZXJydW5uaW5nWzpdID0gW1RydWVdCisgICAgICAgICAgICBldmVudC5tY190eXBlID0gbWNfdHlwZQorICAgICAgICAgICAgZXZlbnQubWNfc3RhdGUgPSBtY19zdGF0ZQorICAgICAgICAgICAgd2FzY2FsbGVkID0ge30KKyAgICAgICAgICAgIHIgPSBOb25lCisgICAgICAgICAgICBmb3IgbCBpbiBsaXN0czoKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obCktMSwgLTEsIC0xKToKKyAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGxbaV0KKyAgICAgICAgICAgICAgICAgICAgaWYgZnVuYyBub3QgaW4gd2FzY2FsbGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgd2FzY2FsbGVkW2Z1bmNdID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgciA9IGxbaV0oZXZlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiByOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlzaGFuZGxlcnJ1bm5pbmdbOl0gPSBbXQorICAgICAgICAgICAgIyBDYWxsIGFsbCBmdW5jdGlvbnMgaW4gZG9hZnRlcmhhbmRsZXIgYW5kIHJlbW92ZSB0aGVtIGZyb20gbGlzdAorICAgICAgICAgICAgZm9yIGYgaW4gZG9hZnRlcmhhbmRsZXI6CisgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBkb2FmdGVyaGFuZGxlcls6XSA9IFtdCisgICAgICAgICAgICBpZiByOgorICAgICAgICAgICAgICAgIHJldHVybiByCisgICAgICAgIHJldHVybiBoYW5kbGVyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZSwgd2lkZ2V0LCB3aWRnZXRpbnN0KToKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLnR5cGVuYW1lID0gX3R5cGVzW3R5cGVdWzBdCisgICAgICAgIHNlbGYud2lkZ2V0ID0gd2lkZ2V0CisgICAgICAgIHNlbGYud2lkZ2V0aW5zdCA9IHdpZGdldGluc3QKKyAgICAgICAgc2VsZi5iaW5kZWRmdW5jcyA9IHtOb25lOiBbW10gZm9yIHMgaW4gX3N0YXRlc119CisgICAgICAgIHNlbGYuaGFuZGxlcmlkcyA9IFtdCisgICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0byBjaGFuZ2UgdGhlIGxpc3RzIG9mIGZ1bmN0aW9ucyB3aGlsZSBhIGhhbmRsZXIgaXMKKyAgICAgICAgIyBydW5uaW5nIC0gaXQgd2lsbCBtZXNzIHVwIHRoZSBsb29wIGFuZCBhbnl3YXksIHdlIHVzdWFsbHkgd2FudCB0aGUKKyAgICAgICAgIyBjaGFuZ2UgdG8gaGFwcGVuIGZyb20gdGhlIG5leHQgZXZlbnQuIFNvIHdlIGhhdmUgYSBsaXN0IG9mIGZ1bmN0aW9ucworICAgICAgICAjIGZvciB0aGUgaGFuZGxlciB0byBydW4gYWZ0ZXIgaXQgZmluaXNoZXMgY2FsbGluZyB0aGUgYmluZGVkIGZ1bmN0aW9ucy4KKyAgICAgICAgIyBJdCBjYWxscyB0aGVtIG9ubHkgb25jZS4KKyAgICAgICAgIyBpc2hhbmRsZXJydW5uaW5nIGlzIGEgbGlzdC4gQW4gZW1wdHkgb25lIG1lYW5zIG5vLCBvdGhlcndpc2UgLSB5ZXMuCisgICAgICAgICMgdGhpcyBpcyBkb25lIHNvIHRoYXQgaXQgd291bGQgYmUgbXV0YWJsZS4KKyAgICAgICAgc2VsZi5pc2hhbmRsZXJydW5uaW5nID0gW10KKyAgICAgICAgc2VsZi5kb2FmdGVyaGFuZGxlciA9IFtdCisgICAgICAgIGZvciBzIGluIF9zdGF0ZXM6CisgICAgICAgICAgICBsaXN0cyA9IFtzZWxmLmJpbmRlZGZ1bmNzW05vbmVdW2ldIGZvciBpIGluIF9zdGF0ZV9zdWJzZXRzW3NdXQorICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuX19jcmVhdGVfaGFuZGxlcihsaXN0cywgdHlwZSwgX3N0YXRlX2NvZGVzW3NdKQorICAgICAgICAgICAgc2VxID0gJzwnK19zdGF0ZV9uYW1lc1tzXStzZWxmLnR5cGVuYW1lKyc+JworICAgICAgICAgICAgc2VsZi5oYW5kbGVyaWRzLmFwcGVuZCgoc2VxLCBzZWxmLndpZGdldC5iaW5kKHNlbGYud2lkZ2V0aW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEsIGhhbmRsZXIpKSkKKworICAgIGRlZiBiaW5kKHNlbGYsIHRyaXBsZXQsIGZ1bmMpOgorICAgICAgICBpZiB0cmlwbGV0WzJdIG5vdCBpbiBzZWxmLmJpbmRlZGZ1bmNzOgorICAgICAgICAgICAgc2VsZi5iaW5kZWRmdW5jc1t0cmlwbGV0WzJdXSA9IFtbXSBmb3IgcyBpbiBfc3RhdGVzXQorICAgICAgICAgICAgZm9yIHMgaW4gX3N0YXRlczoKKyAgICAgICAgICAgICAgICBsaXN0cyA9IFsgc2VsZi5iaW5kZWRmdW5jc1tkZXRhaWxdW2ldCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBkZXRhaWwgaW4gKHRyaXBsZXRbMl0sIE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIF9zdGF0ZV9zdWJzZXRzW3NdICAgICAgIF0KKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5fX2NyZWF0ZV9oYW5kbGVyKGxpc3RzLCBzZWxmLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RhdGVfY29kZXNbc10pCisgICAgICAgICAgICAgICAgc2VxID0gIjwlcyVzLSVzPiIlIChfc3RhdGVfbmFtZXNbc10sIHNlbGYudHlwZW5hbWUsIHRyaXBsZXRbMl0pCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVyaWRzLmFwcGVuZCgoc2VxLCBzZWxmLndpZGdldC5iaW5kKHNlbGYud2lkZ2V0aW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxLCBoYW5kbGVyKSkpCisgICAgICAgIGRvaXQgPSBsYW1iZGE6IHNlbGYuYmluZGVkZnVuY3NbdHJpcGxldFsyXV1bdHJpcGxldFswXV0uYXBwZW5kKGZ1bmMpCisgICAgICAgIGlmIG5vdCBzZWxmLmlzaGFuZGxlcnJ1bm5pbmc6CisgICAgICAgICAgICBkb2l0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZG9hZnRlcmhhbmRsZXIuYXBwZW5kKGRvaXQpCisKKyAgICBkZWYgdW5iaW5kKHNlbGYsIHRyaXBsZXQsIGZ1bmMpOgorICAgICAgICBkb2l0ID0gbGFtYmRhOiBzZWxmLmJpbmRlZGZ1bmNzW3RyaXBsZXRbMl1dW3RyaXBsZXRbMF1dLnJlbW92ZShmdW5jKQorICAgICAgICBpZiBub3Qgc2VsZi5pc2hhbmRsZXJydW5uaW5nOgorICAgICAgICAgICAgZG9pdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRvYWZ0ZXJoYW5kbGVyLmFwcGVuZChkb2l0KQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGZvciBzZXEsIGlkIGluIHNlbGYuaGFuZGxlcmlkczoKKyAgICAgICAgICAgIHNlbGYud2lkZ2V0LnVuYmluZChzZWxmLndpZGdldGluc3QsIHNlcSwgaWQpCisKKyMgZGVmaW5lIHRoZSBsaXN0IG9mIGV2ZW50IHR5cGVzIHRvIGJlIGhhbmRsZWQgYnkgTXVsdGlFdmVudC4gdGhlIG9yZGVyIGlzCisjIGNvbXBhdGlibGUgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBldmVudCB0eXBlIGNvbnN0YW50cy4KK190eXBlcyA9ICgKKyAgICAoIktleVByZXNzIiwgIktleSIpLCAoIktleVJlbGVhc2UiLCksICgiQnV0dG9uUHJlc3MiLCAiQnV0dG9uIiksCisgICAgKCJCdXR0b25SZWxlYXNlIiwpLCAoIkFjdGl2YXRlIiwpLCAoIkNpcmN1bGF0ZSIsKSwgKCJDb2xvcm1hcCIsKSwKKyAgICAoIkNvbmZpZ3VyZSIsKSwgKCJEZWFjdGl2YXRlIiwpLCAoIkRlc3Ryb3kiLCksICgiRW50ZXIiLCksICgiRXhwb3NlIiwpLAorICAgICgiRm9jdXNJbiIsKSwgKCJGb2N1c091dCIsKSwgKCJHcmF2aXR5IiwpLCAoIkxlYXZlIiwpLCAoIk1hcCIsKSwKKyAgICAoIk1vdGlvbiIsKSwgKCJNb3VzZVdoZWVsIiwpLCAoIlByb3BlcnR5IiwpLCAoIlJlcGFyZW50IiwpLCAoIlVubWFwIiwpLAorICAgICgiVmlzaWJpbGl0eSIsKSwKKykKKworIyB3aGljaCBiaW5kZXIgc2hvdWxkIGJlIHVzZWQgZm9yIGV2ZXJ5IGV2ZW50IHR5cGU/CitfYmluZGVyX2NsYXNzZXMgPSAoX0NvbXBsZXhCaW5kZXIsKSAqIDQgKyAoX1NpbXBsZUJpbmRlciwpICogKGxlbihfdHlwZXMpLTQpCisKKyMgQSBkaWN0aW9uYXJ5IHRvIG1hcCBhIHR5cGUgbmFtZSBpbnRvIGl0cyBudW1iZXIKK190eXBlX25hbWVzID0gZGljdChbKG5hbWUsIG51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgIGZvciBudW1iZXIgaW4gcmFuZ2UobGVuKF90eXBlcykpCisgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBfdHlwZXNbbnVtYmVyXV0pCisKK19rZXlzeW1fcmUgPSByZS5jb21waWxlKHIiXlx3KyQiKQorX2J1dHRvbl9yZSA9IHJlLmNvbXBpbGUociJeWzEtNV0kIikKK2RlZiBfcGFyc2Vfc2VxdWVuY2Uoc2VxdWVuY2UpOgorICAgICIiIkdldCBhIHN0cmluZyB3aGljaCBzaG91bGQgZGVzY3JpYmUgYW4gZXZlbnQgc2VxdWVuY2UuIElmIGl0IGlzCisgICAgc3VjY2Vzc2Z1bGx5IHBhcnNlZCBhcyBvbmUsIHJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHN0YXRlIChhcyBhbiBpbnQpLAorICAgIHRoZSBldmVudCB0eXBlIChhcyBhbiBpbmRleCBvZiBfdHlwZXMpLCBhbmQgdGhlIGRldGFpbCAtIE5vbmUgaWYgbm9uZSwgb3IgYQorICAgIHN0cmluZyBpZiB0aGVyZSBpcyBvbmUuIElmIHRoZSBwYXJzaW5nIGlzIHVuc3VjY2Vzc2Z1bCwgcmV0dXJuIE5vbmUuCisgICAgIiIiCisgICAgaWYgbm90IHNlcXVlbmNlIG9yIHNlcXVlbmNlWzBdICE9ICc8JyBvciBzZXF1ZW5jZVstMV0gIT0gJz4nOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHdvcmRzID0gc3RyaW5nLnNwbGl0KHNlcXVlbmNlWzE6LTFdLCAnLScpCisKKyAgICBtb2RpZmllcnMgPSAwCisgICAgd2hpbGUgd29yZHMgYW5kIHdvcmRzWzBdIGluIF9tb2RpZmllcl9uYW1lczoKKyAgICAgICAgbW9kaWZpZXJzIHw9IDEgPDwgX21vZGlmaWVyX25hbWVzW3dvcmRzWzBdXQorICAgICAgICBkZWwgd29yZHNbMF0KKworICAgIGlmIHdvcmRzIGFuZCB3b3Jkc1swXSBpbiBfdHlwZV9uYW1lczoKKyAgICAgICAgdHlwZSA9IF90eXBlX25hbWVzW3dvcmRzWzBdXQorICAgICAgICBkZWwgd29yZHNbMF0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgaWYgX2JpbmRlcl9jbGFzc2VzW3R5cGVdIGlzIF9TaW1wbGVCaW5kZXI6CisgICAgICAgIGlmIG1vZGlmaWVycyBvciB3b3JkczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXRhaWwgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgIyBfQ29tcGxleEJpbmRlcgorICAgICAgICBpZiB0eXBlIGluIFtfdHlwZV9uYW1lc1tzXSBmb3IgcyBpbiAoIktleVByZXNzIiwgIktleVJlbGVhc2UiKV06CisgICAgICAgICAgICB0eXBlX3JlID0gX2tleXN5bV9yZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHlwZV9yZSA9IF9idXR0b25fcmUKKworICAgICAgICBpZiBub3Qgd29yZHM6CisgICAgICAgICAgICBkZXRhaWwgPSBOb25lCisgICAgICAgIGVsaWYgbGVuKHdvcmRzKSA9PSAxIGFuZCB0eXBlX3JlLm1hdGNoKHdvcmRzWzBdKToKKyAgICAgICAgICAgIGRldGFpbCA9IHdvcmRzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgcmV0dXJuIG1vZGlmaWVycywgdHlwZSwgZGV0YWlsCisKK2RlZiBfdHJpcGxldF90b19zZXF1ZW5jZSh0cmlwbGV0KToKKyAgICBpZiB0cmlwbGV0WzJdOgorICAgICAgICByZXR1cm4gJzwnK19zdGF0ZV9uYW1lc1t0cmlwbGV0WzBdXStfdHlwZXNbdHJpcGxldFsxXV1bMF0rJy0nKyBcCisgICAgICAgICAgICAgICB0cmlwbGV0WzJdKyc+JworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnPCcrX3N0YXRlX25hbWVzW3RyaXBsZXRbMF1dK190eXBlc1t0cmlwbGV0WzFdXVswXSsnPicKKworX211bHRpY2FsbF9kaWN0ID0ge30KK2RlZiBNdWx0aUNhbGxDcmVhdG9yKHdpZGdldCk6CisgICAgIiIiUmV0dXJuIGEgTXVsdGlDYWxsIGNsYXNzIHdoaWNoIGluaGVyaXRzIGl0cyBtZXRob2RzIGZyb20gdGhlCisgICAgZ2l2ZW4gd2lkZ2V0IGNsYXNzIChmb3IgZXhhbXBsZSwgVGtpbnRlci5UZXh0KS4gVGhpcyBpcyB1c2VkCisgICAgaW5zdGVhZCBvZiBhIHRlbXBsYXRpbmcgbWVjaGFuaXNtLgorICAgICIiIgorICAgIGlmIHdpZGdldCBpbiBfbXVsdGljYWxsX2RpY3Q6CisgICAgICAgIHJldHVybiBfbXVsdGljYWxsX2RpY3Rbd2lkZ2V0XQorCisgICAgY2xhc3MgTXVsdGlDYWxsICh3aWRnZXQpOgorICAgICAgICBhc3NlcnQgaXNzdWJjbGFzcyh3aWRnZXQsIFRraW50ZXIuTWlzYykKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHdpZGdldC5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICAjIGEgZGljdGlvbmFyeSB3aGljaCBtYXBzIGEgdmlydHVhbCBldmVudCB0byBhIHR1cGxlIHdpdGg6CisgICAgICAgICAgICAjICAwLiB0aGUgZnVuY3Rpb24gYmluZGVkCisgICAgICAgICAgICAjICAxLiBhIGxpc3Qgb2YgdHJpcGxldHMgLSB0aGUgc2VxdWVuY2VzIGl0IGlzIGJpbmRlZCB0bworICAgICAgICAgICAgc2VsZi5fX2V2ZW50aW5mbyA9IHt9CisgICAgICAgICAgICBzZWxmLl9fYmluZGVycyA9IFtfYmluZGVyX2NsYXNzZXNbaV0oaSwgd2lkZ2V0LCBzZWxmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKF90eXBlcykpXQorCisgICAgICAgIGRlZiBiaW5kKHNlbGYsIHNlcXVlbmNlPU5vbmUsIGZ1bmM9Tm9uZSwgYWRkPU5vbmUpOgorICAgICAgICAgICAgI3ByaW50ICJiaW5kKCVzLCAlcywgJXMpIGNhbGxlZC4iICUgKHNlcXVlbmNlLCBmdW5jLCBhZGQpCisgICAgICAgICAgICBpZiB0eXBlKHNlcXVlbmNlKSBpcyBzdHIgYW5kIGxlbihzZXF1ZW5jZSkgPiAyIGFuZCBcCisgICAgICAgICAgICAgICBzZXF1ZW5jZVs6Ml0gPT0gIjw8IiBhbmQgc2VxdWVuY2VbLTI6XSA9PSAiPj4iOgorICAgICAgICAgICAgICAgIGlmIHNlcXVlbmNlIGluIHNlbGYuX19ldmVudGluZm86CisgICAgICAgICAgICAgICAgICAgIGVpID0gc2VsZi5fX2V2ZW50aW5mb1tzZXF1ZW5jZV0KKyAgICAgICAgICAgICAgICAgICAgaWYgZWlbMF0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdHJpcGxldCBpbiBlaVsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYmluZGVyc1t0cmlwbGV0WzFdXS51bmJpbmQodHJpcGxldCwgZWlbMF0pCisgICAgICAgICAgICAgICAgICAgIGVpWzBdID0gZnVuYworICAgICAgICAgICAgICAgICAgICBpZiBlaVswXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0cmlwbGV0IGluIGVpWzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19iaW5kZXJzW3RyaXBsZXRbMV1dLmJpbmQodHJpcGxldCwgZnVuYykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZXZlbnRpbmZvW3NlcXVlbmNlXSA9IFtmdW5jLCBbXV0KKyAgICAgICAgICAgIHJldHVybiB3aWRnZXQuYmluZChzZWxmLCBzZXF1ZW5jZSwgZnVuYywgYWRkKQorCisgICAgICAgIGRlZiB1bmJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmNpZD1Ob25lKToKKyAgICAgICAgICAgIGlmIHR5cGUoc2VxdWVuY2UpIGlzIHN0ciBhbmQgbGVuKHNlcXVlbmNlKSA+IDIgYW5kIFwKKyAgICAgICAgICAgICAgIHNlcXVlbmNlWzoyXSA9PSAiPDwiIGFuZCBzZXF1ZW5jZVstMjpdID09ICI+PiIgYW5kIFwKKyAgICAgICAgICAgICAgIHNlcXVlbmNlIGluIHNlbGYuX19ldmVudGluZm86CisgICAgICAgICAgICAgICAgZnVuYywgdHJpcGxldHMgPSBzZWxmLl9fZXZlbnRpbmZvW3NlcXVlbmNlXQorICAgICAgICAgICAgICAgIGlmIGZ1bmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZvciB0cmlwbGV0IGluIHRyaXBsZXRzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2JpbmRlcnNbdHJpcGxldFsxXV0udW5iaW5kKHRyaXBsZXQsIGZ1bmMpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19ldmVudGluZm9bc2VxdWVuY2VdWzBdID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIHdpZGdldC51bmJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmNpZCkKKworICAgICAgICBkZWYgZXZlbnRfYWRkKHNlbGYsIHZpcnR1YWwsICpzZXF1ZW5jZXMpOgorICAgICAgICAgICAgI3ByaW50ICJldmVudF9hZGQoJXMsJXMpIHdhcyBjYWxsZWQiJShyZXByKHZpcnR1YWwpLHJlcHIoc2VxdWVuY2VzKSkKKyAgICAgICAgICAgIGlmIHZpcnR1YWwgbm90IGluIHNlbGYuX19ldmVudGluZm86CisgICAgICAgICAgICAgICAgc2VsZi5fX2V2ZW50aW5mb1t2aXJ0dWFsXSA9IFtOb25lLCBbXV0KKworICAgICAgICAgICAgZnVuYywgdHJpcGxldHMgPSBzZWxmLl9fZXZlbnRpbmZvW3ZpcnR1YWxdCisgICAgICAgICAgICBmb3Igc2VxIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICB0cmlwbGV0ID0gX3BhcnNlX3NlcXVlbmNlKHNlcSkKKyAgICAgICAgICAgICAgICBpZiB0cmlwbGV0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICNwcmludCA+PiBzeXMuc3RkZXJyLCAiU2VxLiAlcyB3YXMgYWRkZWQgYnkgVGtpbnRlci4iJXNlcQorICAgICAgICAgICAgICAgICAgICB3aWRnZXQuZXZlbnRfYWRkKHNlbGYsIHZpcnR1YWwsIHNlcSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2JpbmRlcnNbdHJpcGxldFsxXV0uYmluZCh0cmlwbGV0LCBmdW5jKQorICAgICAgICAgICAgICAgICAgICB0cmlwbGV0cy5hcHBlbmQodHJpcGxldCkKKworICAgICAgICBkZWYgZXZlbnRfZGVsZXRlKHNlbGYsIHZpcnR1YWwsICpzZXF1ZW5jZXMpOgorICAgICAgICAgICAgaWYgdmlydHVhbCBub3QgaW4gc2VsZi5fX2V2ZW50aW5mbzoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZ1bmMsIHRyaXBsZXRzID0gc2VsZi5fX2V2ZW50aW5mb1t2aXJ0dWFsXQorICAgICAgICAgICAgZm9yIHNlcSBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgdHJpcGxldCA9IF9wYXJzZV9zZXF1ZW5jZShzZXEpCisgICAgICAgICAgICAgICAgaWYgdHJpcGxldCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAjcHJpbnQgPj4gc3lzLnN0ZGVyciwgIlNlcS4gJXMgd2FzIGRlbGV0ZWQgYnkgVGtpbnRlci4iJXNlcQorICAgICAgICAgICAgICAgICAgICB3aWRnZXQuZXZlbnRfZGVsZXRlKHNlbGYsIHZpcnR1YWwsIHNlcSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2JpbmRlcnNbdHJpcGxldFsxXV0udW5iaW5kKHRyaXBsZXQsIGZ1bmMpCisgICAgICAgICAgICAgICAgICAgIHRyaXBsZXRzLnJlbW92ZSh0cmlwbGV0KQorCisgICAgICAgIGRlZiBldmVudF9pbmZvKHNlbGYsIHZpcnR1YWw9Tm9uZSk6CisgICAgICAgICAgICBpZiB2aXJ0dWFsIGlzIE5vbmUgb3IgdmlydHVhbCBub3QgaW4gc2VsZi5fX2V2ZW50aW5mbzoKKyAgICAgICAgICAgICAgICByZXR1cm4gd2lkZ2V0LmV2ZW50X2luZm8oc2VsZiwgdmlydHVhbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHR1cGxlKG1hcChfdHJpcGxldF90b19zZXF1ZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19ldmVudGluZm9bdmlydHVhbF1bMV0pKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0LmV2ZW50X2luZm8oc2VsZiwgdmlydHVhbCkKKworICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgIGZvciB2aXJ0dWFsIGluIHNlbGYuX19ldmVudGluZm86CisgICAgICAgICAgICAgICAgZnVuYywgdHJpcGxldHMgPSBzZWxmLl9fZXZlbnRpbmZvW3ZpcnR1YWxdCisgICAgICAgICAgICAgICAgaWYgZnVuYzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRyaXBsZXQgaW4gdHJpcGxldHM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYmluZGVyc1t0cmlwbGV0WzFdXS51bmJpbmQodHJpcGxldCwgZnVuYykKKworCisgICAgX211bHRpY2FsbF9kaWN0W3dpZGdldF0gPSBNdWx0aUNhbGwKKyAgICByZXR1cm4gTXVsdGlDYWxsCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBUZXN0CisgICAgcm9vdCA9IFRraW50ZXIuVGsoKQorICAgIHRleHQgPSBNdWx0aUNhbGxDcmVhdG9yKFRraW50ZXIuVGV4dCkocm9vdCkKKyAgICB0ZXh0LnBhY2soKQorICAgIGRlZiBiaW5kc2VxKHNlcSwgbj1bMF0pOgorICAgICAgICBkZWYgaGFuZGxlcihldmVudCk6CisgICAgICAgICAgICBwcmludCBzZXEKKyAgICAgICAgdGV4dC5iaW5kKCI8PGhhbmRsZXIlZD4+IiVuWzBdLCBoYW5kbGVyKQorICAgICAgICB0ZXh0LmV2ZW50X2FkZCgiPDxoYW5kbGVyJWQ+PiIlblswXSwgc2VxKQorICAgICAgICBuWzBdICs9IDEKKyAgICBiaW5kc2VxKCI8S2V5PiIpCisgICAgYmluZHNlcSgiPENvbnRyb2wtS2V5PiIpCisgICAgYmluZHNlcSgiPEFsdC1LZXktYT4iKQorICAgIGJpbmRzZXEoIjxDb250cm9sLUtleS1hPiIpCisgICAgYmluZHNlcSgiPEFsdC1Db250cm9sLUtleS1hPiIpCisgICAgYmluZHNlcSgiPEtleS1iPiIpCisgICAgYmluZHNlcSgiPENvbnRyb2wtQnV0dG9uLTE+IikKKyAgICBiaW5kc2VxKCI8QWx0LUJ1dHRvbi0xPiIpCisgICAgYmluZHNlcSgiPEZvY3VzT3V0PiIpCisgICAgYmluZHNlcSgiPEVudGVyPiIpCisgICAgYmluZHNlcSgiPExlYXZlPiIpCisgICAgcm9vdC5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlDYWxsLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9NdWx0aUNhbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YmMxMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlDYWxsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlDYWxsLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9NdWx0aUNhbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYmE2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlDYWxsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVlMmQwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weQpAQCAtMCwwICsxLDMyIEBACitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworY2xhc3MgTXVsdGlTdGF0dXNCYXIoRnJhbWUpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgaWYgbWFzdGVyIGlzIE5vbmU6CisgICAgICAgICAgICBtYXN0ZXIgPSBUaygpCisgICAgICAgIEZyYW1lLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgKiprdykKKyAgICAgICAgc2VsZi5sYWJlbHMgPSB7fQorCisgICAgZGVmIHNldF9sYWJlbChzZWxmLCBuYW1lLCB0ZXh0PScnLCBzaWRlPUxFRlQpOgorICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLmxhYmVsczoKKyAgICAgICAgICAgIGxhYmVsID0gTGFiZWwoc2VsZiwgYmQ9MSwgcmVsaWVmPVNVTktFTiwgYW5jaG9yPVcpCisgICAgICAgICAgICBsYWJlbC5wYWNrKHNpZGU9c2lkZSkKKyAgICAgICAgICAgIHNlbGYubGFiZWxzW25hbWVdID0gbGFiZWwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhYmVsID0gc2VsZi5sYWJlbHNbbmFtZV0KKyAgICAgICAgbGFiZWwuY29uZmlnKHRleHQ9dGV4dCkKKworZGVmIF90ZXN0KCk6CisgICAgYiA9IEZyYW1lKCkKKyAgICBjID0gVGV4dChiKQorICAgIGMucGFjayhzaWRlPVRPUCkKKyAgICBhID0gTXVsdGlTdGF0dXNCYXIoYikKKyAgICBhLnNldF9sYWJlbCgib25lIiwgImhlbGxvIikKKyAgICBhLnNldF9sYWJlbCgidHdvIiwgIndvcmxkIikKKyAgICBhLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKyAgICBiLnBhY2soKQorICAgIGIubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTAwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9NdWx0aVN0YXR1c0Jhci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTAwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvTXVsdGlTdGF0dXNCYXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ORVdTLnR4dCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ORVdTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FiMDgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL05FV1MudHh0CkBAIC0wLDAgKzEsNzgwIEBACitXaGF0J3MgTmV3IGluIElETEUgMi43LjU/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKy0gSXNzdWUgIzE3MzkwOiBEaXNwbGF5IFB5dGhvbiB2ZXJzaW9uIG9uIElkbGUgdGl0bGUgYmFyLgorICBJbml0aWFsIHBhdGNoIGJ5IEVkbW9uZCBCdXJuZXR0LgorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjcuND8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworLSBJc3N1ZSAjMTUzMTg6IFByZXZlbnQgd3JpdGluZyB0byBzeXMuc3RkaW4uCisKKy0gSXNzdWUgIzEzNTMyLCAjMTUzMTk6IENoZWNrIHRoYXQgYXJndW1lbnRzIHRvIHN5cy5zdGRvdXQud3JpdGUgYXJlIHN0cmluZ3MuCisKKy0gSXNzdWUgIyAxMjUxMDogQXR0ZW1wdCB0byBnZXQgY2VydGFpbiB0b29sIHRpcHMgbm8gbG9uZ2VyIGNyYXNoZXMgSURMRS4KKworLSBJc3N1ZTEwMzY1OiBGaWxlIG9wZW4gZGlhbG9nIG5vdyB3b3JrcyBpbnN0ZWFkIG9mIGNyYXNoaW5nIGV2ZW4gd2hlbgorICBwYXJlbnQgd2luZG93IGlzIGNsb3NlZCB3aGlsZSBkaWFsb2cgaXMgb3Blbi4KKworLSBJc3N1ZSAxNDg3NjogdXNlIHVzZXItc2VsZWN0ZWQgZm9udCBmb3IgaGlnaGxpZ2h0IGNvbmZpZ3VyYXRpb24uCisKKy0gSXNzdWUgIzE0MDE4OiBVcGRhdGUgY2hlY2tzIGZvciB1bnN0YWJsZSBzeXN0ZW0gVGNsL1RrIHZlcnNpb25zIG9uIE9TIFgKKyAgdG8gaW5jbHVkZSB2ZXJzaW9ucyBzaGlwcGVkIHdpdGggT1MgWCAxMC43IGFuZCAxMC44IGluIGFkZGl0aW9uIHRvIDEwLjYuCisKKy0gSXNzdWUgIzE1ODUzOiBQcmV2ZW50IElETEUgY3Jhc2ggb24gT1MgWCB3aGVuIG9wZW5pbmcgUHJlZmVyZW5jZXMgbWVudQorICB3aXRoIGNlcnRhaW4gdmVyc2lvbnMgb2YgVGsgOC41LiAgSW5pdGlhbCBwYXRjaCBieSBLZXZpbiBXYWx6ZXIuCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDIuNy4zPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCistIElzc3VlICMxNDQwOTogSURMRSBub3cgcHJvcGVybHkgZXhlY3V0ZXMgY29tbWFuZHMgaW4gdGhlIFNoZWxsIHdpbmRvdworICB3aGVuIGl0IGNhbm5vdCByZWFkIHRoZSBub3JtYWwgY29uZmlnIGZpbGVzIG9uIHN0YXJ0dXAgYW5kCisgIGhhcyB0byB1c2UgdGhlIGJ1aWx0LWluIGRlZmF1bHQga2V5IGJpbmRpbmdzLgorICBUaGVyZSB3YXMgcHJldmlvdXNseSBhIGJ1ZyBpbiBvbmUgb2YgdGhlIGRlZmF1bHRzLgorCistIElzc3VlICMzNTczOiBJRExFIGhhbmdzIHdoZW4gcGFzc2luZyBpbnZhbGlkIGNvbW1hbmQgbGluZSBhcmdzCisgIChkaXJlY3RvcnkoaWVzKSBpbnN0ZWFkIG9mIGZpbGUocykpLgorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjcuMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjktTWF5LTIwMTEqCisKKy0gSXNzdWUgIzYzNzg6IEZ1cnRoZXIgYWRqdXN0IGlkbGUuYmF0IHRvIHN0YXJ0IGFzc29jaWF0ZWQgUHl0aG9uCisKKy0gSXNzdWUgIzExODk2OiBTYXZlIG9uIENsb3NlIGZhaWxlZCBkZXNwaXRlIHNlbGVjdGluZyAiWWVzIiBpbiBkaWFsb2cuCisKKy0gPEhvbWU+IHRvZ2dsZSBmYWlsaW5nIG9uIFRrIDguNSwgY2F1c2luZyBJRExFIGV4aXRzIGFuZCBzdHJhbmdlIHNlbGVjdGlvbgorICBiZWhhdmlvci4gSXNzdWUgNDY3Ni4gIEltcHJvdmUgc2VsZWN0aW9uIGV4dGVuc2lvbiBiZWhhdmlvdXIuCisKKy0gPEhvbWU+IHRvZ2dsZSBub24tZnVuY3Rpb25hbCB3aGVuIE51bUxvY2sgc2V0IG9uIFdpbmRvd3MuICBJc3N1ZSAzODUxLgorCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjc/Cis9PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwNy0wMy0yMDEwKgorCistIGlkbGUucHkgbW9kaWZpZWQgYW5kIHNpbXBsaWZpZWQgdG8gYmV0dGVyIHN1cHBvcnQgZGV2ZWxvcGluZyBleHBlcmltZW50YWwKKyAgdmVyc2lvbnMgb2YgSURMRSB3aGljaCBhcmUgbm90IGluc3RhbGxlZCBpbiB0aGUgc3RhbmRhcmQgbG9jYXRpb24uCisKKy0gT3V0cHV0V2luZG93L1B5U2hlbGwgcmlnaHQgY2xpY2sgbWVudSAiR28gdG8gZmlsZS9saW5lIiB3YXNuJ3Qgd29ya2luZyB3aXRoCisgIGZpbGUgcGF0aHMgY29udGFpbmluZyBzcGFjZXMuICBCdWcgNTU1OS4KKworLSBXaW5kb3dzOiBWZXJzaW9uIHN0cmluZyBmb3IgdGhlIC5jaG0gaGVscCBmaWxlIGNoYW5nZWQsIGZpbGUgbm90IGJlaW5nCisgIGFjY2Vzc2VkICBQYXRjaCA1NzgzIEd1aWxoZXJtZSBQb2xvCisKKy0gQWxsb3cgbXVsdGlwbGUgSURMRSBHVUkvc3VicHJvY2VzcyBwYWlycyB0byBleGlzdCBzaW11bHRhbmVvdXNseS4gVGhhbmtzIHRvCisgIERhdmlkIFNjaGVyZXIgZm9yIHN1Z2dlc3RpbmcgdGhlIHVzZSBvZiBhbiBlcGhlbWVyYWwgcG9ydCBmb3IgdGhlIEdVSS4KKyAgUGF0Y2ggMTUyOTE0MiBXZWVibGUuCisKKy0gUmVtb3ZlIHBvcnQgc3BlYyBmcm9tIHJ1bi5weSBhbmQgZml4IGJ1ZyB3aGVyZSBzdWJwcm9jZXNzIGZhaWxzIHRvCisgIGV4dHJhY3QgcG9ydCBmcm9tIGNvbW1hbmQgbGluZSB3aGVuIHdhcm5pbmdzIGFyZSBwcmVzZW50LgorCistIFRrIDguNSBUZXh0IHdpZGdldCByZXF1aXJlcyAnd29yZHByb2Nlc3NvcicgdGFic3R5bGUgYXR0ciB0byBoYW5kbGUKKyAgbWl4ZWQgc3BhY2UvdGFiIHByb3Blcmx5LiBJc3N1ZSA1MTI5LCBwYXRjaCBieSBHdWlsaGVybWUgUG9sby4KKworLSBJc3N1ZSAjMzU0OTogT24gTWFjT1MgdGhlIHByZWZlcmVuY2VzIG1lbnUgd2FzIG5vdCBwcmVzZW50CisKKworV2hhdCdzIE5ldyBpbiBJRExFIDIuNj8KKz09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDAxLU9jdC0yMDA4KgorCistIElzc3VlICMyNjY1OiBPbiBXaW5kb3dzLCBhbiBJRExFIGluc3RhbGxhdGlvbiB1cGdyYWRlZCBmcm9tIGFuIG9sZCB2ZXJzaW9uCisgIHdvdWxkIG5vdCBzdGFydCBpZiBhIGN1c3RvbSB0aGVtZSB3YXMgZGVmaW5lZC4KKworLSBIb21lIC8gQ29udHJvbC1BIHRvZ2dsZXMgYmV0d2VlbiBsZWZ0IG1hcmdpbiBhbmQgZW5kIG9mIGxlYWRpbmcgd2hpdGUKKyAgc3BhY2UuICBQYXRjaCAxMTk2OTAzIEplZmYgU2h1dGUuCisKKy0gSW1wcm92ZWQgQXV0b0NvbXBsZXRlV2luZG93IGxvZ2ljLiAgUGF0Y2ggMjA2MiBUYWwgRWluYXQuCisKKy0gQXV0b2NvbXBsZXRpb24gb2YgZmlsZW5hbWVzIG5vdyBzdXBwb3J0IGFsdGVybmF0ZSBzZXBhcmF0b3JzLCBlLmcuIHRoZQorICAnLycgY2hhciBvbiBXaW5kb3dzLiAgUGF0Y2ggMjA2MSBUYWwgRWluYXQuCisKK1doYXQncyBOZXcgaW4gSURMRSAyLjZhMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjktRmViLTIwMDgqCisKKy0gQ29uZmlndXJlZCBzZWxlY3Rpb24gaGlnaGxpZ2h0aW5nIGNvbG9ycyB3ZXJlIGlnbm9yZWQ7IHVwZGF0aW5nIGhpZ2hsaWdodGluZworICBpbiB0aGUgY29uZmlnIGRpYWxvZyB3b3VsZCBjYXVzZSBub24tUHl0aG9uIGZpbGVzIHRvIGJlIGNvbG9yZWQgYXMgaWYgdGhleQorICB3ZXJlIFB5dGhvbiBzb3VyY2U7IGltcHJvdmUgdXNlIG9mIENvbG9yRGVsYWdhdG9yLiAgUGF0Y2ggMTMzNC4gVGFsIEVpbmF0LgorCistIFNjcmlwdEJpbmRpbmcgZXZlbnQgaGFuZGxlcnMgd2VyZW4ndCByZXR1cm5pbmcgJ2JyZWFrJy4gUGF0Y2ggMjA1MCwgVGFsIEVpbmF0LgorCistIFRoZXJlIHdhcyBhbiBlcnJvciBvbiBleGl0IGlmIG5vIHN5cy5leGl0ZnVuYyB3YXMgZGVmaW5lZC4gSXNzdWUgMTY0Ny4KKworLSBDb3VsZCBub3Qgb3BlbiBmaWxlcyBpbiAuaWRsZXJjIGRpcmVjdG9yeSBpZiBsYXR0ZXIgd2FzIGhpZGRlbiBvbiBXaW5kb3dzLgorICBJc3N1ZSAxNzQzLCBJc3N1ZSAxODYyLgorCistIENvbmZpZ3VyZSBEaWFsb2c6IGltcHJvdmVkIGxheW91dCBmb3Iga2V5YmluZGluZy4gIFBhdGNoIDE0NTcgVGFsIEVpbmF0LgorCistIHRhYnBhZ2UucHkgdXBkYXRlZDogdGFiYmVkUGFnZXMucHkgbm93IHN1cHBvcnRzIG11bHRpcGxlIGR5bmFtaWMgcm93cworICBvZiB0YWJzLiAgUGF0Y2ggMTYxMjc0NiBUYWwgRWluYXQuCisKKy0gQWRkIGNvbmZpcm1hdGlvbiBkaWFsb2cgYmVmb3JlIHByaW50aW5nLiAgUGF0Y2ggMTcxNzE3MCBUYWwgRWluYXQuCisKKy0gU2hvdyBwYXN0ZSBwb3NpdGlvbiBpZiA+IDgwIGNvbC4gIFBhdGNoIDE2NTkzMjYgVGFsIEVpbmF0LgorCistIFVwZGF0ZSBjdXJzb3IgY29sb3Igd2l0aG91dCByZXN0YXJ0aW5nLiAgUGF0Y2ggMTcyNTU3NiBUYWwgRWluYXQuCisKKy0gQWxsb3cga2V5Ym9hcmQgaW50ZXJydXB0IG9ubHkgd2hlbiB1c2VyIGNvZGUgaXMgZXhlY3V0aW5nIGluIHN1YnByb2Nlc3MuCisgIFBhdGNoIDEyMjUgVGFsIEVpbmF0IChyZXdvcmtlZCBmcm9tIElETEUtU3Bvb24pLgorCistIGNvbmZpZ0RpYWxvZyBjbGVhbnVwLiBQYXRjaCAxNzMwMjE3IFRhbCBFaW5hdC4KKworLSB0ZXh0VmlldyBjbGVhbnVwLiBQYXRjaCAxNzE4MDQzIFRhbCBFaW5hdC4KKworLSBDbGVhbiB1cCBFZGl0b3JXaW5kb3cgY2xvc2UuCisKKy0gUGF0Y2ggMTY5MzI1ODogRml4IGZvciBkdXBsaWNhdGUgInByZWZlcmVuY2VzIiBtZW51LU9TIFguIEJhY2twb3J0IG9mIHI1NjIwNC4KKworLSBPU1g6IEF2b2lkIGNyYXNoIGZvciB0aG9zZSB2ZXJzaW9ucyBvZiBUY2wvVGsgd2hpY2ggZG9uJ3QgaGF2ZSBhIGNvbnNvbGUKKworLSBCdWcgaW4gaWRsZWxpYi5NdWx0aUNhbGw6IE9wdGlvbnMgZGlhbG9nIHdhcyBjcmFzaGluZyBJRExFIGlmIHRoZXJlIHdhcyBhbgorICBvcHRpb24gaW4gY29uZmlnLWV4dGVuc2lvbnMgdy9vIGEgdmFsdWUuIFBhdGNoICMxNjcyNDgxLCBUYWwgRWluYXQKKworLSBDb3JyZWN0ZWQgc29tZSBidWdzIGluIEF1dG9Db21wbGV0ZS4gIEFsc28sIFBhZ2UgVXAvRG93biBpbiBBQ1cgaW1wbGVtZW50ZWQ7CisgIG1vdXNlIGFuZCBjdXJzb3Igc2VsZWN0aW9uIGluIEFDV2luZG93IGltcGxlbWVudGVkOyBkb3VibGUgVGFiIGluc2VydHMKKyAgY3VycmVudCBzZWxlY3Rpb24gYW5kIGNsb3NlcyBBQ1cgKHNpbWlsYXIgdG8gZG91YmxlLWNsaWNrIGFuZCBSZXR1cm4pOyBzY3JvbGwKKyAgd2hlZWwgbm93IHdvcmtzIGluIEFDVy4gIEFkZGVkIEF1dG9Db21wbGV0ZSBpbnN0cnVjdGlvbnMgdG8gSURMRSBIZWxwLgorCistIEF1dG9Db21wbGV0ZVdpbmRvdyBtb3ZlZCBiZWxvdyBpbnB1dCBsaW5lLCB3aWxsIG1vdmUgYWJvdmUgaWYgdGhlcmUKKyAgaXNuJ3QgZW5vdWdoIHNwYWNlLiAgUGF0Y2ggMTYyMTI2NSBUYWwgRWluYXQKKworLSBDYWxsdGlwcyBub3cgJ2hhbmRsZScgdHVwbGVzIGluIHRoZSBhcmd1bWVudCBsaXN0IChkaXNwbGF5ICc8dHVwbGU+JyA6KQorICBTdWdnZXN0ZWQgc29sdXRpb24gYnkgQ2hyaXN0b3MgR2Vvcmdpb3UsIEJ1ZyA3OTE5NjguCisKKy0gQWRkICdyYXcnIHN1cHBvcnQgdG8gY29uZmlnSGFuZGxlci4gUGF0Y2ggMTY1MDE3NCBUYWwgRWluYXQuCisKKy0gQXZvaWQgaGFuZyB3aGVuIGVuY291bnRlcmluZyBhIGR1cGxpY2F0ZSBpbiBhIGNvbXBsZXRpb24gbGlzdC4gQnVnIDE1NzExMTIuCisKKy0gUGF0Y2ggIzEzNjI5NzU6IFJld29yayBDb2RlQ29udGV4dCBpbmRlbnRhdGlvbiBhbGdvcml0aG0gdG8KKyAgYXZvaWQgaGFyZC1jb2RpbmcgcGl4ZWwgd2lkdGhzLgorCistIEJ1ZyAjODEzMzQyOiBTdGFydCB0aGUgSURMRSBzdWJwcm9jZXNzIHdpdGggLVFuZXcgaWYgdGhlIHBhcmVudAorICBpcyBzdGFydGVkIHdpdGggdGhhdCBvcHRpb24uCisKKy0gSG9ub3IgdGhlICJDYW5jZWwiIGFjdGlvbiBpbiB0aGUgc2F2ZSBkaWFsb2cgKERlYmlhbiBidWcgIzI5OTA5MikKKworLSBTb21lIHN5bnRheCBlcnJvcnMgd2VyZSBiZWluZyBjYXVnaHQgYnkgdG9rZW5pemUgZHVyaW5nIHRoZSB0YWJuYW5ueQorICBjaGVjaywgcmVzdWx0aW5nIGluIG9ic2N1cmUgZXJyb3IgbWVzc2FnZXMuICBEbyB0aGUgc3ludGF4IGNoZWNrCisgIGZpcnN0LiAgQnVnIDE1NjI3MTYsIDE1NjI3MTkKKworLSBJRExFJ3MgdmVyc2lvbiBudW1iZXIgdGFrZXMgYSBiaWcganVtcCB0byBtYXRjaCB0aGUgdmVyc2lvbiBudW1iZXIgb2YKKyAgdGhlIFB5dGhvbiByZWxlYXNlIG9mIHdoaWNoIGl0J3MgYSBwYXJ0LgorCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjI/Cis9PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAxOS1TRVAtMjAwNioKKworCitXaGF0J3MgTmV3IGluIElETEUgMS4yYzE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE3LUFVRy0yMDA2KgorCistIEZpbGUgbWVudSBob3RrZXlzOiB0aGVyZSB3ZXJlIHRocmVlICdwJyBhc3NpZ25tZW50cy4gIFJlYXNzaWduIHRoZQorICAnU2F2ZSBDb3B5IEFzJyBhbmQgJ1ByaW50JyBob3RrZXlzIHRvICd5JyBhbmQgJ3QnLiAgQ2hhbmdlIHRoZQorICBTaGVsbCBob3RrZXkgZnJvbSAncycgdG8gJ2wnLgorCistIElETEUgaG9ub3JzIG5ldyBxdWl0KCkgYW5kIGV4aXQoKSBjb21tYW5kcyBmcm9tIHNpdGUucHkgUXVpdHRlcigpIG9iamVjdC4KKyAgUGF0Y2ggMTU0MDg5MiwgSmltIEpld2V0dAorCistIFRoZSAnd2l0aCcgc3RhdGVtZW50IGlzIG5vdyBhIENvZGUgQ29udGV4dCBibG9jayBvcGVuZXIuCisgIFBhdGNoIDE1NDA4NTEsIEppbSBKZXdldHQKKworLSBSZXRyaWV2YWwgb2YgcHJldmlvdXMgc2hlbGwgY29tbWFuZCB3YXMgbm90IGFsd2F5cyBwcmVzZXJ2aW5nIGluZGVudGF0aW9uCisgIChzaW5jZSAxLjJhMSkgUGF0Y2ggMTUyODQ2OCBUYWwgRWluYXQuCisKKy0gQ2hhbmdpbmcgdG9rZW5pemUgKDM5MDQ2KSB0byBkZXRlY3QgZGVkZW50IGJyb2tlIHRhYm5hbm55IGNoZWNrIChzaW5jZSAxLjJhMSkKKworLSBUb2dnbGVUYWIgZGlhbG9nIHdhcyBzZXR0aW5nIGluZGVudCB0byA4IGV2ZW4gaWYgY2FuY2VsbGVkIChzaW5jZSAxLjJhMSkuCisKKy0gV2hlbiB1c2VkIHcvbyBzdWJwcm9jZXNzLCBhbGwgZXhjZXB0aW9ucyB3ZXJlIHByZWNlZGVkIGJ5IGFuIGVycm9yCisgIG1lc3NhZ2UgY2xhaW1pbmcgdGhleSB3ZXJlIElETEUgaW50ZXJuYWwgZXJyb3JzIChzaW5jZSAxLjJhMSkuCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjJiMz8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMDMtQVVHLTIwMDYqCisKKy0gQnVnICMxNTI1ODE3OiBEb24ndCB0cnVuY2F0ZSBzaG9ydCBsaW5lcyBpbiBJRExFJ3MgdG9vbCB0aXBzLgorCistIEJ1ZyAjMTUxNzk5MDogSURMRSBrZXliaW5kaW5ncyBvbiBNYWNPUyBYIG5vdyB3b3JrIGNvcnJlY3RseQorCistIEJ1ZyAjMTUxNzk5NjogSURMRSBub3cgbG9uZ2VyIHNob3dzIHRoZSBkZWZhdWx0IFRrIG1lbnUgd2hlbiBhCisgIHBhdGggYnJvd3NlciwgY2xhc3MgYnJvd3NlciBvciBkZWJ1Z2dlciBpcyB0aGUgZnJvbnRtb3N0IHdpbmRvdyBvbiBNYWNPUyBYCisKKy0gRWRpdG9yV2luZG93LnRlc3QoKSB3YXMgZmFpbGluZy4gIEJ1ZyAxNDE3NTk4CisKKy0gRWRpdG9yV2luZG93IGZhaWxlZCB3aGVuIHVzZWQgc3RhbmQtYWxvbmUgaWYgc3lzLnBzMSBub3Qgc2V0LgorICBCdWcgMTAxMDM3MCBEYXZlIEZsb3JlaworCistIFRvb2x0aXBzIGZhaWxlZCBvbiBuZXctc3lsZSBjbGFzcyBfX2luaXRfXyBhcmdzLiAgQnVnIDEwMjc1NjYgTG9yZW4gR3V0aHJpZQorCistIEF2b2lkIG9jY2FzaW9uYWwgZmFpbHVyZSB0byBkZXRlY3QgY2xvc2luZyBwYXJlbiBwcm9wZXJseS4KKyAgUGF0Y2ggMTQwNzI4MCBUYWwgRWluYXQKKworLSBSZWJpbmRpbmcgVGFiIGtleSB3YXMgaW5zZXJ0aW5nICd0YWInIGluc3RlYWQgb2YgJ1RhYicuICBCdWcgMTE3OTE2OC4KKworLSBDb2xvcml6ZXIgbm93IGhhbmRsZXMgIzxidWlsdGluPiBjb3JyZWN0bHksIGFsc28gdW5pY29kZSBzdHJpbmdzIGFuZAorICAnYXMnIGtleXdvcmQgaW4gY29tbWVudCBkaXJlY3RseSBmb2xsb3dpbmcgaW1wb3J0IGNvbW1hbmQuIENsb3NlcyAxMzI1MDcxLgorICBQYXRjaCAxNDc5MjE5IFRhbCBFaW5hdAorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYjI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDExLUpVTC0yMDA2KgorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYjE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDIwLUpVTi0yMDA2KgorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYTI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI3LUFQUi0yMDA2KgorCitXaGF0J3MgTmV3IGluIElETEUgMS4yYTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDA1LUFQUi0yMDA2KgorCistIFBhdGNoICMxMTYyODI1OiBTdXBwb3J0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGluIElETEUgd2luZG93IHRpdGxlcy4KKworLSBTb3VyY2UgZmlsZSBmLmZsdXNoKCkgYWZ0ZXIgd3JpdGluZzsgdHJ5aW5nIHRvIGF2b2lkIGxvc3NhZ2UgaWYgdXNlcgorICBraWxscyBHVUkuCisKKy0gT3B0aW9ucyAvIEtleXMgLyBBZHZhbmNlZCBkaWFsb2cgbWFkZSBmdW5jdGlvbmFsLiAgQWxzbywgYWxsb3cgYmluZGluZworICBvZiAnbW92ZW1lbnQnIGtleXMuCisKKy0gJ3N5bnRheCcgcGF0Y2ggYWRkcyBpbXByb3ZlZCBjYWxsdGlwcyBhbmQgYSBuZXcgY2xhc3MgYXR0cmlidXRlIGxpc3Rib3guCisgIE11bHRpQ2FsbCBtb2R1bGUgYWxsb3dzIGJpbmRpbmcgbXVsdGlwbGUgYWN0aW9ucyB0byBhbiBldmVudC4KKyAgUGF0Y2ggOTA2NzAyIE5vYW0gUmFwaGFlbAorCistIEJldHRlciBpbmRlbnRhdGlvbiBhZnRlciBmaXJzdCBsaW5lIG9mIHN0cmluZyBjb250aW51YXRpb24uCisgIElETEVmb3JrIFBhdGNoIDY4MTk5MiwgTm9hbSBSYXBoYWVsCisKKy0gRml4ZWQgQ29kZUNvbnRleHQgYWxpZ25tZW50IHByb2JsZW0sIGZvbGxvd2luZyBzdWdnZXN0aW9uIGZyb20gVGFsIEVpbmF0LgorCistIEluY3JlYXNlZCBwZXJmb3JtYW5jZSBpbiBDb2RlQ29udGV4dCBleHRlbnNpb24gIFBhdGNoIDkzNjE2OSBOb2FtIFJhcGhhZWwKKworLSBNYWMgbGluZSBlbmRpbmdzIHdlcmUgaW5jb3JyZWN0IHdoZW4gcGFzdGluZyBjb2RlIGZyb20gc29tZSBicm93c2VycworICB3aGVuIHVzaW5nIFgxMSBhbmQgdGhlIEZpbmsgZGlzdHJpYnV0aW9uLiAgUHl0aG9uIEJ1ZyAxMjYzNjU2LgorCistIDxFbnRlcj4gd2hlbiBjdXJzb3IgaXMgb24gYSBwcmV2aW91cyBjb21tYW5kIHJldHJpZXZlcyB0aGF0IGNvbW1hbmQuICBJbnN0ZWFkCisgIG9mIHJlcGxhY2luZyB0aGUgaW5wdXQgbGluZSwgdGhlIHByZXZpb3VzIGNvbW1hbmQgaXMgbm93IGFwcGVuZGVkIHRvIHRoZQorICBpbnB1dCBsaW5lLiBJbmRlbnRhdGlvbiBpcyBwcmVzZXJ2ZWQsIGFuZCB1bmRvIGlzIGVuYWJsZWQuCisgIFBhdGNoIDExOTY5MTcgIEplZmYgU2h1dGUKKworLSBDbGFyaWZ5ICJ0YWIvc3BhY2UiIEVycm9yIERpYWxvZyBhbmQgIlRhYiBXaWR0aCIgRGlhbG9nIGFzc29jaWF0ZWQgd2l0aAorICB0aGUgVW50YWJpZnkgY29tbWFuZC4KKworLSBDb3JyZWN0ZWQgInRhYi9zcGFjZSIgRXJyb3IgRGlhbG9nIHRvIHNob3cgY29ycmVjdCBtZW51IGZvciBVbnRhYmlmeS4KKyAgUGF0Y2ggMTE5Njk4MCBKZWZmIFNodXRlCisKKy0gTmV3IGZpbGVzIGFyZSBjb2xvcml6ZWQgYnkgZGVmYXVsdCwgYW5kIGNvbG9yaXppbmcgaXMgcmVtb3ZlZCB3aGVuCisgIHNhdmluZyBhcyBub24tUHl0aG9uIGZpbGVzLiBQYXRjaCAxMTk2ODk1IEplZmYgU2h1dGUKKyAgQ2xvc2VzIFB5dGhvbiBCdWdzIDc3NTAxMiBhbmQgODAwNDMyLCBwYXJ0aWFsIGZpeCBJRExFZm9yayA3NjM1MjQKKworLSBJbXByb3ZlIHN1YnByb2Nlc3MgbGluayBlcnJvciBub3RpZmljYXRpb24uCisKKy0gcnVuLnB5OiB1c2UgUXVldWUncyBibG9ja2luZyBmZWF0dXJlIGluc3RlYWQgb2Ygc2xlZXBpbmcgaW4gdGhlIG1haW4KKyAgbG9vcC4gIFBhdGNoICMgMTE5MDE2MyBNaWNoaWVsIGRlIEhvb24KKworLSBBZGQgY29uZmlnLW1haW4gb3B0aW9uIHRvIG1ha2UgdGhlICdoaXN0b3J5JyBmZWF0dXJlIG5vbi1jeWNsaWMuCisgIERlZmF1bHQgcmVtYWlucyBjeWNsaWMuICBQeXRob24gUGF0Y2ggOTE0NTQ2IE5vYW0gUmFwaGFlbC4KKworLSBSZW1vdmVkIGFiaWxpdHkgdG8gY29uZmlndXJlIHRhYnMgaW5kZW50IGZyb20gT3B0aW9ucyBkaWFsb2cuICBUaGlzICdmZWF0dXJlJworICBoYXMgbmV2ZXIgd29ya2VkIGFuZCBubyBvbmUgaGFzIGNvbXBsYWluZWQuICBJdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBzZXQgYQorICBkZWZhdWx0IHRhYnMgKHYuIHNwYWNlcykgaW5kZW50ICdtYW51YWxseScgdmlhIGNvbmZpZy1tYWluLmRlZiAob3IgdG8gdHVybiBvbgorICB0YWJzIGZvciB0aGUgY3VycmVudCBFZGl0b3JXaW5kb3cgdmlhIHRoZSBGb3JtYXQgbWVudSkgYnV0IElETEUgd2lsbAorICBlbmNvdXJhZ2UgaW5kZW50YXRpb24gdmlhIHNwYWNlcy4KKworLSBFbmFibGUgc2V0dGluZyB0aGUgaW5kZW50YXRpb24gd2lkdGggdXNpbmcgdGhlIE9wdGlvbnMgZGlhbG9nLgorICBCdWcgIyA3ODM4NzcKKworLSBBZGQga2V5YmluZGluZ3MgZm9yIGRlbC13b3JkLWxlZnQgYW5kIGRlbC13b3JkLXJpZ2h0LgorCistIERpc2NvdXJhZ2UgdXNpbmcgYW4gaW5kZW50IHdpZHRoIG90aGVyIHRoYW4gOCB3aGVuIHVzaW5nIHRhYnMgdG8gaW5kZW50CisgIFB5dGhvbiBjb2RlLgorCistIFJlc3RvcmUgdXNlIG9mIEVkaXRvcldpbmRvdy5zZXRfaW5kZW50YXRpb25fcGFyYW1zKCksIHdhcyBkZWFkIGNvZGUgc2luY2UKKyAgQXV0b2luZGVudCB3YXMgbWVyZ2VkIGludG8gRWRpdG9yV2luZG93LiAgVGhpcyBhbGxvd3MgSURMRSB0byBjb25mb3JtIHRvIHRoZQorICBpbmRlbnRhdGlvbiB3aWR0aCBvZiBhIGxvYWRlZCBmaWxlLiAgKEJ1dCBpdCBzdGlsbCB3aWxsIG5vdCBzd2l0Y2ggdG8gdGFicworICBldmVuIGlmIHRoZSBmaWxlIHVzZXMgdGFicy4pICBBbnkgY2hhbmdlIGluIGluZGVudCB3aWR0aCBpcyBsb2NhbCB0byB0aGF0CisgIHdpbmRvdy4KKworLSBBZGQgVGFibmFubnkgY2hlY2sgYmVmb3JlIFJ1bi9GNSwgbm90IGp1c3Qgd2hlbiBDaGVja2luZyBtb2R1bGUuCisKKy0gSWYgYW4gZXh0ZW5zaW9uIGNhbid0IGJlIGxvYWRlZCwgcHJpbnQgd2FybmluZyBhbmQgc2tpcCBpdCBpbnN0ZWFkIG9mCisgIGVycm9yaW5nIG91dC4KKworLSBJbXByb3ZlIGVycm9yIGhhbmRsaW5nIHdoZW4gLmlkbGVyYyBjYW4ndCBiZSBjcmVhdGVkICh3YXJuIGFuZCBleGl0KS4KKworLSBUaGUgR1VJIHdhcyBoYW5naW5nIGlmIHRoZSBzaGVsbCB3aW5kb3cgd2FzIGNsb3NlZCB3aGlsZSBhIHJhd19pbnB1dCgpCisgIHdhcyBwZW5kaW5nLiAgUmVzdG9yZWQgdGhlIHF1aXQoKSBvZiB0aGUgcmVhZGxpbmUoKSBtYWlubG9vcCgpLgorICBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9pZGxlLWRldi8yMDA0LURlY2VtYmVyLzAwMjMwNy5odG1sCisKKy0gVGhlIHJlbW90ZSBwcm9jZWR1cmUgY2FsbCBtb2R1bGUgcnBjLnB5IGNhbiBub3cgYWNjZXNzIGRhdGEgYXR0cmlidXRlcyBvZgorICByZW1vdGUgcmVnaXN0ZXJlZCBvYmplY3RzLiAgQ2hhbmdlcyB0byB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBsb2NhbCwgaG93ZXZlci4KKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMT8KKz09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDMwLU5PVi0yMDA0KgorCistIE9uIE9wZW5CU0QsIHRlcm1pbmF0aW5nIElETEUgd2l0aCBjdHJsLWMgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGNhdXNlZCBhCisgIHN0dWNrIHN1YnByb2Nlc3MgTWFpblRocmVhZCBiZWNhdXNlIG9ubHkgdGhlIFNvY2tldFRocmVhZCB3YXMgZXhpdGluZy4KKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMWIzL3JjMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE4LU5PVi0yMDA0KgorCistIFNhdmluZyBhIEtleXNldCB3L28gbWFraW5nIGNoYW5nZXMgKGJ5IHVzaW5nIHRoZSAiU2F2ZSBhcyBOZXcgQ3VzdG9tIEtleSBTZXQiCisgIGJ1dHRvbikgY2F1c2VkIElETEUgdG8gZmFpbCBvbiByZXN0YXJ0IChubyBuZXcga2V5c2V0IHdhcyBjcmVhdGVkIGluCisgIGNvbmZpZy1rZXlzLmNmZykuICBBbHNvIHRydWUgZm9yIFRoZW1lL2hpZ2hsaWdodHMuICBQeXRob24gQnVnIDEwNjQ1MzUuCisKKy0gQSBjaGFuZ2UgdG8gdGhlIGxpbmVjYWNoZS5weSBBUEkgY2F1c2VkIElETEUgdG8gZXhpdCB3aGVuIGFuIGV4Y2VwdGlvbiB3YXMKKyAgcmFpc2VkIHdoaWxlIHJ1bm5pbmcgd2l0aG91dCB0aGUgc3VicHJvY2VzcyAoLW4gc3dpdGNoKS4gIFB5dGhvbiBCdWcgMTA2Mzg0MC4KKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMWIyPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwMy1OT1YtMjAwNCoKKworLSBXaGVuIHBhcmFncmFwaCByZWZvcm1hdCB3aWR0aCB3YXMgbWFkZSBjb25maWd1cmFibGUsIGEgYnVnIHdhcworICBpbnRyb2R1Y2VkIHRoYXQgY2F1c2VkIHJlZm9ybWF0dGluZyBvZiBjb21tZW50IGJsb2NrcyB0byBpZ25vcmUgaG93CisgIGZhciB0aGUgYmxvY2sgd2FzIGluZGVudGVkLCBlZmZlY3RpdmVseSBhZGRpbmcgdGhlIGluZGVudGF0aW9uIHdpZHRoCisgIHRvIHRoZSByZWZvcm1hdCB3aWR0aC4gIFRoaXMgaGFzIGJlZW4gcmVwYWlyZWQsIGFuZCB0aGUgcmVmb3JtYXQKKyAgd2lkdGggaXMgYWdhaW4gYSBib3VuZCBvbiB0aGUgdG90YWwgd2lkdGggb2YgcmVmb3JtYXR0ZWQgbGluZXMuCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjFiMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTUtT0NULTIwMDQqCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMWEzPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwMi1TRVAtMjAwNCoKKworLSBJbXByb3ZlIGtleWJvYXJkIGZvY3VzIGJpbmRpbmcsIGVzcGVjaWFsbHkgaW4gV2luZG93cyBtZW51LiAgSW1wcm92ZQorICB3aW5kb3cgcmFpc2luZywgZXNwZWNpYWxseSBpbiB0aGUgV2luZG93cyBtZW51IGFuZCBpbiB0aGUgZGVidWdnZXIuCisgIElETEVmb3JrIDc2MzUyNC4KKworLSBJZiB1c2VyIHBhc3NlcyBhIG5vbi1leGlzdGVudCBmaWxlbmFtZSBvbiB0aGUgY29tbWFuZGxpbmUsIGp1c3QKKyAgb3BlbiBhIG5ldyBmaWxlLCBkb24ndCByYWlzZSBhIGRpYWxvZy4gIElETEVmb3JrIDg1NDkyOC4KKworCitXaGF0J3MgTmV3IGluIElETEUgMS4xYTI/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDA1LUFVRy0yMDA0KgorCistIEVkaXRvcldpbmRvdy5weSB3YXMgbm90IGZpbmRpbmcgdGhlIC5jaG0gaGVscCBmaWxlIG9uIFdpbmRvd3MuICBUeXBvCisgIGF0IFJldiAxLjU0LiAgUHl0aG9uIEJ1ZyA5OTA5NTQKKworLSBjaGVja2luZyBzeXMucGxhdGZvcm0gZm9yIHN1YnN0cmluZyAnd2luJyB3YXMgYnJlYWtpbmcgSURMRSBkb2NzIG9uIE1hYworICAoZGFyd2luKS4gIEFsc28sIE1hYyBTYWZhcmkgYnJvd3NlciByZXF1aXJlcyBmdWxsIGZpbGU6Ly8gVVJJcy4gIFNGIDkwMDU4MC4KKworCitXaGF0J3MgTmV3IGluIElETEUgMS4xYTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDA4LUpVTC0yMDA0KgorCistIFJlZGlyZWN0IHRoZSB3YXJuaW5nIHN0cmVhbSB0byB0aGUgc2hlbGwgZHVyaW5nIHRoZSBTY3JpcHRCaW5kaW5nIGNoZWNrIG9mCisgIHVzZXIgY29kZSBhbmQgZm9ybWF0IHRoZSB3YXJuaW5nIHNpbWlsYXJseSB0byBhbiBleGNlcHRpb24gZm9yIGJvdGggdGhhdAorICBjaGVjayBhbmQgZm9yIHJ1bnRpbWUgd2FybmluZ3MgcmFpc2VkIGluIHRoZSBzdWJwcm9jZXNzLgorCistIENvZGVDb250ZXh0IGhpbnQgcGFuZSB2aXNpYmlsaXR5IHN0YXRlIGlzIG5vdyBwZXJzaXN0ZW50IGFjcm9zcyBzZXNzaW9ucy4KKyAgVGhlIHBhbmUgbm8gbG9uZ2VyIGFwcGVhcnMgaW4gdGhlIHNoZWxsIHdpbmRvdy4gIEFkZGVkIGNhcGFiaWxpdHkgdG8gbGltaXQKKyAgZXh0ZW5zaW9ucyB0byBzaGVsbCB3aW5kb3cgb3IgZWRpdG9yIHdpbmRvd3MuICBOb2FtIFJhcGhhZWwgYWRkaXRpb24KKyAgdG8gUGF0Y2ggOTM2MTY5LgorCistIFBhcmFncmFwaCByZWZvcm1hdCB3aWR0aCBpcyBub3cgYSBjb25maWd1cmFibGUgcGFyYW1ldGVyIGluIHRoZQorICBPcHRpb25zIEdVSS4KKworLSBOZXcgRXh0ZW5zaW9uOiBDb2RlQ29udGV4dC4gIFByb3ZpZGVzIGJsb2NrIHN0cnVjdHVyaW5nIGhpbnRzIGZvciBjb2RlCisgIHdoaWNoIGhhcyBzY3JvbGxlZCBhYm92ZSBhbiBlZGl0IHdpbmRvdy4gUGF0Y2ggOTM2MTY5IE5vYW0gUmFwaGFlbC4KKworLSBJZiBudWxscyBzb21laG93IGdvdCBpbnRvIHRoZSBzdHJpbmdzIGluIHJlY2VudC1maWxlcy5sc3QKKyAgRWRpdG9yV2luZG93LnVwZGF0ZV9yZWNlbnRfZmlsZXNfbGlzdCgpIHdhcyBmYWlsaW5nLiAgUHl0aG9uIEJ1ZyA5MzEzMzYuCisKKy0gSWYgdGhlIG5vcm1hbCBiYWNrZ3JvdW5kIGlzIGNoYW5nZWQgdmlhIENvbmZpZ3VyZS9IaWdobGlnaHRpbmcsIGl0IHdpbGwKKyAgdXBkYXRlIGltbWVkaWF0ZWx5LCB0aGFua3MgdG8gdGhlIHByZXZpb3VzbHkgbWVudGlvbmVkIHBhdGNoIGJ5IE5pZ2VsIFJvd2UuCisKKy0gQWRkIGEgaGlnaGxpZ2h0IHRoZW1lIGZvciBidWlsdGluIGtleXdvcmRzLiAgUHl0aG9uIFBhdGNoIDgwNTgzMCBOaWdlbCBSb3dlCisgIFRoaXMgYWxzbyBmaXhlZCBJRExFZm9yayBidWcgWyA2OTM0MTggXSBOb3JtYWwgdGV4dCBiYWNrZ3JvdW5kIGNvbG9yIG5vdAorICByZWZyZXNoZWQgYW5kIFB5dGhvbiBidWcgWzg5Nzg3MiBdIFVua25vd24gY29sb3IgbmFtZSBvbiBIUC1VWAorCistIHJwYy5weTpTb2NrZXRJTyAtIExhcmdlIG1vZHVsZXMgd2VyZSBnZW5lcmF0aW5nIGxhcmdlIHBpY2tsZXMgd2hlbiBkb3dubG9hZGVkCisgIHRvIHRoZSBleGVjdXRpb24gc2VydmVyLiAgVGhlIHJldHVybiBvZiB0aGUgT0sgcmVzcG9uc2UgZnJvbSB0aGUgc3VicHJvY2VzcworICBpbml0aWFsaXphdGlvbiB3YXMgaW50ZXJmZXJpbmcgYW5kIGNhdXNpbmcgdGhlIHNlbmRpbmcgc29ja2V0IHRvIGJlIG5vdAorICByZWFkeS4gIEFkZCBhbiBJTyByZWFkeSB0ZXN0IHRvIGZpeCB0aGlzLiAgTW92ZWQgdGhlIHBvbGxpbmcgSU8gcmVhZHkgdGVzdAorICBpbnRvIHBvbGxwYWNrZXQoKS4KKworLSBGaXggdHlwbyBpbiBycGMucHksIHMvYiAicGlja2xlLlBpY2tsaW5nRXJyb3IiIG5vdCAicGlja2xlLlVucGlja2xpbmdFcnJvciIuCisKKy0gQWRkZWQgYSBUayBlcnJvciBkaWFsb2cgdG8gcnVuLnB5IGluZm9ybSB0aGUgdXNlciBpZiB0aGUgc3VicHJvY2VzcyBjYW4ndAorICBjb25uZWN0IHRvIHRoZSB1c2VyIEdVSSBwcm9jZXNzLiAgQWRkZWQgYSB0aW1lb3V0IHRvIHRoZSBHVUkncyBsaXN0ZW5pbmcKKyAgc29ja2V0LiAgQWRkZWQgVGsgZXJyb3IgZGlhbG9ncyB0byBQeVNoZWxsLnB5IHRvIGFubm91bmNlIGEgZmFpbHVyZSB0byBiaW5kCisgIHRoZSBwb3J0IG9yIGNvbm5lY3QgdG8gdGhlIHN1YnByb2Nlc3MuICBDbGVhbiB1cCBlcnJvciBoYW5kbGluZyBkdXJpbmcKKyAgY29ubmVjdGlvbiBpbml0aWF0aW9uIHBoYXNlLiAgVGhpcyBpcyBhbiB1cGRhdGUgb2YgUHl0aG9uIFBhdGNoIDc3ODMyMy4KKworLSBQcmludCBjb3JyZWN0IGV4Y2VwdGlvbiBldmVuIGlmIHNvdXJjZSBmaWxlIGNoYW5nZWQgc2luY2Ugc2hlbGwgd2FzCisgIHJlc3RhcnRlZC4gIElETEVmb3JrIFBhdGNoIDg2OTAxMiBOb2FtIFJhcGhhZWwKKworLSBLZXliaW5kaW5ncyB3aXRoIHRoZSBTaGlmdCBtb2RpZmllciBub3cgd29yayBjb3JyZWN0bHkuICBTbyBkbyBiaW5kaW5ncyB3aGljaAorICB1c2UgdGhlIFNwYWNlIGtleS4gIExpbWl0IHVubW9kaWZpZWQgdXNlciBrZXliaW5kaW5ncyB0byB0aGUgZnVuY3Rpb24ga2V5cy4KKyAgUHl0aG9uIEJ1ZyA3NzUzNTMsIElETEVmb3JrIEJ1Z3MgNzU1NjQ3LCA3NjE1NTcKKworLSBBZnRlciBhbiBleGNlcHRpb24sIHJ1bi5weSB3YXMgbm90IHNldHRpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IuIE5vYW0KKyAgUmFwaGFlbCBzdWdnZXN0ZWQgY29ycmVjdGluZyB0aGlzIHNvIHBkYidzIHBvc3Rtb3J0ZW0gcG0oKSB3b3VsZCB3b3JrLgorICBJRExFZm9yayBQYXRjaCA4NDQ2NzUKKworLSBJRExFIG5vdyBkb2VzIG5vdCBmYWlsIHRvIHNhdmUgdGhlIGZpbGUgYW55bW9yZSBpZiB0aGUgVGsgYnVmZmVyIGlzIG5vdCBhCisgIFVuaWNvZGUgc3RyaW5nLCB5ZXQgZW9sX2NvbnZlbnRpb24gaXMuICBQeXRob24gQnVncyA3NzQ2ODAsIDc4ODM3OAorCistIElETEUgZGlkbid0IHN0YXJ0IGNvcnJlY3RseSB3aGVuIFB5dGhvbiB3YXMgaW5zdGFsbGVkIGluICJQcm9ncmFtIEZpbGVzIiBvbgorICBXMksgYW5kIFhQLiAgUHl0aG9uIEJ1Z3MgNzgwNDUxLCA3ODQxODMKKworLSBjb25maWctbWFpbi5kZWYgZG9jdW1lbnRhdGlvbiBpbmNvcnJlY3RseSByZWZlcnJlZCB0byBpZGxlLSBpbnN0ZWFkIG9mCisgIGNvbmZpZy0gIGZpbGVuYW1lcy4gIFNGIDc4Mjc1OSAgQWxzbyBhZGRlZCBub3RlIGFib3V0IC5pZGxlcmMgbG9jYXRpb24uCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMD8KKz09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDI5LUp1bC0yMDAzKgorCistIEFkZGVkIGEgYmFubmVyIHRvIHRoZSBzaGVsbCBkaXNjdXNzaW5nIHdhcm5pbmdzIHBvc3NpYmx5IHJhaXNlZCBieSBwZXJzb25hbAorICBmaXJld2FsbCBzb2Z0d2FyZS4gIEFkZGVkIHNhbWUgY29tbWVudCB0byBSRUFETUUudHh0LgorCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjAgcmVsZWFzZSBjYW5kaWRhdGUgMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjQtSnVsLTIwMDMqCisKKy0gQ2FsbHRpcCBlcnJvciB3aGVuIGRvY3N0cmluZyB3YXMgTm9uZSAgUHl0aG9uIEJ1ZyA3NzU1NDEKKworCitXaGF0J3MgTmV3IGluIElETEUgMS4wIHJlbGVhc2UgY2FuZGlkYXRlIDE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDE4LUp1bC0yMDAzKgorCistIFVwZGF0ZWQgZXh0ZW5kLnR4dCwgaGVscC50eHQsIGFuZCBjb25maWctZXh0ZW5zaW9ucy5kZWYgdG8gY29ycmVjdGx5CisgIHJlZmxlY3QgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBjb25maWd1cmF0aW9uIHN5c3RlbS4gIFB5dGhvbiBCdWcgNzY4NDY5CisKKy0gRml4ZWQ6IENhbGwgVGlwIFRyaW1taW5nIE1heSBMb29wIEZvcmV2ZXIuIFB5dGhvbiBQYXRjaCA3NjkxNDIgKERhbmllbHMpCisKKy0gUmVwbGFjZWQgYXBwbHkoZiwgYXJncywga3dkcykgd2l0aCBmKCphcmdzLCAqKmt3YXJncykgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQorICBQeXRob24gUGF0Y2ggNzY4MTg3CisKKy0gQnJlYWsgb3IgY29udGludWUgc3RhdGVtZW50cyBvdXRzaWRlIGEgbG9vcCB3ZXJlIGNhdXNpbmcgSURMRSBjcmFzaAorICBQeXRob24gQnVnIDc2Nzc5NAorCistIENvbnZlcnQgVW5pY29kZSBzdHJpbmdzIGZyb20gcmVhZGxpbmUgdG8gSU9CaW5kaW5nLmVuY29kaW5nLiAgQWxzbyBzZXQKKyAgc3lzLnN0ZHtpbnxvdXR8ZXJyfS5lbmNvZGluZywgZm9yIGJvdGggdGhlIGxvY2FsIGFuZCB0aGUgc3VicHJvY2VzcyBjYXNlLgorICBTRiBJRExFZm9yayBwYXRjaCA2ODIzNDcuCisKKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMGIyPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAyOS1KdW4tMjAwMyoKKworLSBFeHRlbmQgQWJvdXREaWFsb2cuVmlld0ZpbGUoKSB0byBzdXBwb3J0IGZpbGUgZW5jb2RpbmdzLiAgTWFrZSB0aGUgQ1JFRElUUworICBmaWxlIExhdGluLTEuCisKKy0gVXBkYXRlZCB0aGUgQWJvdXQgZGlhbG9nIHRvIHJlZmxlY3QgcmUtaW50ZWdyYXRpb24gaW50byBQeXRob24uICBQcm92aWRlCisgIGJ1dHRvbnMgdG8gZGlzcGxheSBQeXRob24ncyBORVdTLCBMaWNlbnNlLCBhbmQgQ3JlZGl0cywgcGx1cyBhZGRpdGlvbmFsCisgIGJ1dHRvbnMgZm9yIElETEUncyBSRUFETUUgYW5kIE5FV1MuCisKKy0gVGV4dFZpZXdlcigpIG5vdyBoYXMgYSB0aGlyZCBwYXJhbWV0ZXIgd2hpY2ggYWxsb3dzIGluc2VydGluZyB0ZXh0IGludG8gdGhlCisgIHZpZXdlciBpbnN0ZWFkIG9mIHJlYWRpbmcgZnJvbSBhIGZpbGUuCisKKy0gKENyZWF0ZWQgdGhlIC4uLi9MaWIvaWRsZWxpYiBkaXJlY3RvcnkgaW4gdGhlIFB5dGhvbiBDVlMsIHdoaWNoIGlzIGEgY2xvbmUgb2YKKyAgSURMRWZvcmsgbW9kaWZpZWQgdG8gaW5zdGFsbCBpbiB0aGUgUHl0aG9uIGVudmlyb25tZW50LiAgVGhlIGNvZGUgaW4gdGhlCisgIGludGVycnVwdCBtb2R1bGUgaGFzIGJlZW4gbW92ZWQgdG8gdGhyZWFkLmludGVycnVwdF9tYWluKCkuICkKKworLSBQcmludGluZyB0aGUgU2hlbGwgd2luZG93IHdhcyBmYWlsaW5nIGlmIGl0IHdhcyBub3Qgc2F2ZWQgZmlyc3QgU0YgNzQ4OTc1CisKKy0gV2hlbiB1c2luZyB0aGUgU2VhcmNoIGluIEZpbGVzIGRpYWxvZywgaWYgdGhlIHVzZXIgaGFkIGEgc2VsZWN0aW9uCisgIGhpZ2hsaWdodGVkIGluIGhpcyBFZGl0b3Igd2luZG93LCBpbnNlcnQgaXQgaW50byB0aGUgZGlhbG9nIHNlYXJjaCBmaWVsZC4KKworLSBUaGUgUHl0aG9uIFNoZWxsIGVudHJ5IHdhcyBkaXNhcHBlYXJpbmcgZnJvbSB0aGUgV2luZG93cyBtZW51LgorCistIFVwZGF0ZSB0aGUgV2luZG93cyBmaWxlIGxpc3Qgd2hlbiBhIGZpbGUgbmFtZSBjaGFuZ2Ugb2NjdXJzCisKKy0gQ2hhbmdlIHRvIEZpbGUgLyBPcGVuIE1vZHVsZTogYWx3YXlzIHBvcCB1cCB0aGUgZGlhbG9nLCB1c2luZyB0aGUgY3VycmVudAorICBzZWxlY3Rpb24gYXMgdGhlIGRlZmF1bHQgdmFsdWUuICBUaGlzIGlzIGVhc2llciB0byB1c2UgaGFiaXR1YWxseS4KKworLSBBdm9pZGVkIGEgcHJvYmxlbSB3aXRoIHN0YXJ0aW5nIHRoZSBzdWJwcm9jZXNzIHdoZW4gJ2xvY2FsaG9zdCcgZG9lc24ndAorICByZXNvbHZlIHRvIHRoZSB1c2VyJ3MgbG9vcGJhY2sgaW50ZXJmYWNlLiAgU0YgNzQ3NzcyCisKKy0gRml4ZWQgYW4gaXNzdWUgd2l0aCBoaWdobGlnaHRlZCBlcnJvcnMgbmV2ZXIgZGUtY29sb3JpemluZy4gIFNGIDc0NzY3Ny4gIEFsc28KKyAgaW1wcm92ZWQgbm90aWZpY2F0aW9uIG9mIFRhYm5hbm55IFRva2VuIEVycm9yLgorCistIEZpbGUgLyBOZXcgd2lsbCBieSBkZWZhdWx0IHNhdmUgaW4gdGhlIGRpcmVjdG9yeSBvZiB0aGUgRWRpdCB3aW5kb3cgZnJvbQorICB3aGljaCBpdCB3YXMgaW5pdGlhdGVkLiAgU0YgNzQ4OTczIEd1aWRvIHZhbiBSb3NzdW0gcGF0Y2guCisKKworV2hhdCdzIE5ldyBpbiBJRExFZm9yayAwLjliMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDAyLUp1bi0yMDAzKgorCistIFRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IG9mIHRoZSBleGVjdXRpb24gZW52aXJvbm1lbnQgKGFuZCBzaGVsbAorICBmb2xsb3dpbmcgY29tcGxldGlvbiBvZiBleGVjdXRpb24pIGlzIG5vdyB0aGF0IG9mIHRoZSBtb2R1bGUgYmVpbmcgcnVuLgorCistIEFkZGVkIHRoZSBkZWxldGUtZXhpdGZ1bmMgb3B0aW9uIHRvIGNvbmZpZy1tYWluLmRlZi4gIChUaGlzIG9wdGlvbiBpcyBub3QKKyAgaW5jbHVkZWQgaW4gdGhlIE9wdGlvbnMgZGlhbG9nLikgIFNldHRpbmcgdGhpcyB0byBUcnVlICh0aGUgZGVmYXVsdCkgd2lsbAorICBjYXVzZSBJRExFIHRvIG5vdCBydW4gc3lzLmV4aXRmdW5jL2F0ZXhpdCB3aGVuIHRoZSBzdWJwcm9jZXNzIGV4aXRzLgorCistIElETEUgbm93IHByZXNlcnZlcyB0aGUgbGluZSBlbmRpbmcgY29kZXMgd2hlbiBlZGl0aW5nIGEgZmlsZSBwcm9kdWNlZCBvbgorICBhIGRpZmZlcmVudCBwbGF0Zm9ybS4gU0YgNjYxNzU5LCAgU0YgNTM4NTg0CisKKy0gUmVkdWNlZCBkZWZhdWx0IGVkaXRvciBmb250IHNpemUgdG8gMTAgcG9pbnQgYW5kIGluY3JlYXNlZCB3aW5kb3cgaGVpZ2h0CisgIHRvIHByb3ZpZGUgYSBiZXR0ZXIgaW5pdGlhbCBpbXByZXNzaW9uIG9uIFdpbmRvd3MuCisKKy0gT3B0aW9ucyAvIEZvbnRzL1RhYnMgLyBTZXQgQmFzZSBFZGl0b3IgRm9udDogTGlzdCBib3ggd2FzIG5vdCBoaWdobGlnaHRpbmcKKyAgdGhlIGRlZmF1bHQgZm9udCB3aGVuIGZpcnN0IGluc3RhbGxlZCBvbiBXaW5kb3dzLiAgU0YgNjYxNjc2CisKKy0gQWRkZWQgQXV0b3NhdmUgZmVhdHVyZTogd2hlbiB1c2VyIHJ1bnMgY29kZSBmcm9tIGVkaXQgd2luZG93LCBpZiB0aGUgZmlsZQorICBoYXMgYmVlbiBtb2RpZmllZCBJRExFIHdpbGwgc2lsZW50bHkgc2F2ZSBpdCBpZiBBdXRvc2F2ZSBpcyBlbmFibGVkLiAgVGhlCisgIG9wdGlvbiBpcyBzZXQgaW4gdGhlIE9wdGlvbnMgZGlhbG9nLCBhbmQgdGhlIGRlZmF1bHQgaXMgdG8gcHJvbXB0IHRoZQorICB1c2VyIHRvIHNhdmUgdGhlIGZpbGUuICAgU0YgNjYxMzE4IEJydWNlIFNoZXJ3b29kIHBhdGNoLgorCistIEltcHJvdmVkIHRoZSBSRVNUQVJUIGFubm90YXRpb24gaW4gdGhlIHNoZWxsIHdpbmRvdyB3aGVuIHRoZSB1c2VyIHJlc3RhcnRzCisgIHRoZSBzaGVsbCB3aGlsZSBpdCBpcyBnZW5lcmF0aW5nIG91dHB1dC4gIEFsc28gaW1wcm92ZWQgYW5ub3RhdGlvbiB3aGVuIHVzZXIKKyAgcmVwZWF0ZWRseSBoYW1tZXJzIHRoZSBDdHJsLUY2IHJlc3RhcnQuCisKKy0gQWxsb3cgSURMRSB0byBydW4gd2hlbiBub3QgaW5zdGFsbGVkIGFuZCBjd2QgaXMgbm90IHRoZSBJRExFIGRpcmVjdG9yeQorICBTRiBQYXRjaCA2ODYyNTQgIlJ1biBJRExFZm9yayBmcm9tIGFueSBkaXJlY3Rvcnkgd2l0aG91dCBzZXQtdXAiIC0gUmFwaGFlbAorCistIFdoZW4gYSBtb2R1bGUgaXMgcnVuIGZyb20gYW4gRWRpdG9yV2luZG93OiBpZiBpdHMgZGlyZWN0b3J5IGlzIG5vdCBpbgorICBzeXMucGF0aCwgcHJlcGVuZCBpdC4gIFRoaXMgYWxsb3dzIHRoZSBtb2R1bGUgdG8gaW1wb3J0IG90aGVyIG1vZHVsZXMgaW4KKyAgdGhlIHNhbWUgZGlyZWN0b3J5LiAgRG8gdGhlIHNhbWUgZm9yIGEgc2NyaXB0IHJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKKy0gQ29ycmVjdGx5IHJlc3RhcnQgdGhlIHN1YnByb2Nlc3MgaWYgaXQgaXMgcnVubmluZyB1c2VyIGNvZGUgYW5kIHRoZSB1c2VyCisgIGF0dGVtcHRzIHRvIHJ1biBzb21lIG90aGVyIG1vZHVsZSBvciByZXN0YXJ0cyB0aGUgc2hlbGwuICBEbyB0aGUgc2FtZSBpZgorICB0aGUgbGluayBpcyBicm9rZW4gYW5kIGl0IGlzIHBvc3NpYmxlIHRvIHJlc3RhcnQgdGhlIHN1YnByb2Nlc3MgYW5kIHJlLQorICBjb25uZWN0IHRvIHRoZSBHVUkuICAgU0YgUkZFIDY2MTMyMS4KKworLSBJbXByb3ZlZCBleGNlcHRpb24gcmVwb3J0aW5nIHdoZW4gcnVubmluZyBjb21tYW5kcyBvciBzY3JpcHRzIGZyb20gdGhlCisgIGNvbW1hbmQgbGluZS4KKworLSBBZGRlZCBhIC1uIGNvbW1hbmQgbGluZSBzd2l0Y2ggdG8gc3RhcnQgSURMRSB3aXRob3V0IHRoZSBzdWJwcm9jZXNzLgorICBSZW1vdmVkIHRoZSBTaGVsbCBtZW51IHdoZW4gcnVubmluZyBpbiB0aGF0IG1vZGUuICBVcGRhdGVkIGhlbHAgbWVzc2FnZXMuCisKKy0gQWRkZWQgYSBjb21tZW50IHRvIHRoZSBzaGVsbCBzdGFydHVwIGhlYWRlciB0byBpbmRpY2F0ZSB3aGVuIElETEUgaXMgbm90CisgIHVzaW5nIHRoZSBzdWJwcm9jZXNzLgorCistIFJlc3RvcmUgdGhlIGFiaWxpdHkgdG8gcnVuIHdpdGhvdXQgdGhlIHN1YnByb2Nlc3MuICBUaGlzIGNhbiBiZSBpbXBvcnRhbnQgZm9yCisgIHNvbWUgcGxhdGZvcm1zIG9yIGNvbmZpZ3VyYXRpb25zLiAgKFJ1bm5pbmcgd2l0aG91dCB0aGUgc3VicHJvY2VzcyBhbGxvd3MgdGhlCisgIGRlYnVnZ2VyIHRvIHRyYWNlIHRocm91Z2ggcGFydHMgb2YgSURMRSBpdHNlbGYsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlCisgIGRlc2lyYWJsZSwgZGVwZW5kaW5nIG9uIHlvdXIgcG9pbnQgb2Ygdmlldy4gIEluIGFkZGl0aW9uLCB0aGUgdHJhZGl0aW9uYWwKKyAgcmVsb2FkL2ltcG9ydCB0cmlja3MgbXVzdCBiZSB1c2UgaWYgdXNlciBzb3VyY2UgY29kZSBpcyBjaGFuZ2VkLikgIFRoaXMgaXMKKyAgaGVscGZ1bCBmb3IgZGV2ZWxvcGluZyBJRExFIHVzaW5nIElETEUsIGJlY2F1c2Ugb25lIGluc3RhbmNlIGNhbiBiZSB1c2VkIHRvCisgIGVkaXQgdGhlIGNvZGUgYW5kIGEgc2VwYXJhdGUgaW5zdGFuY2UgcnVuIHRvIHRlc3QgY2hhbmdlcy4gIChNdWx0aXBsZQorICBjb25jdXJyZW50IElETEUgaW5zdGFuY2VzIHdpdGggc3VicHJvY2Vzc2VzIGlzIGEgZnV0dXJlIGZlYXR1cmUpCisKKy0gSW1wcm92ZSB0aGUgZXJyb3IgbWVzc2FnZSBhIHVzZXIgZ2V0cyB3aGVuIHNhdmluZyBhIGZpbGUgd2l0aCBub24tQVNDSUkKKyAgY2hhcmFjdGVycyBhbmQgbm8gc291cmNlIGVuY29kaW5nIGlzIHNwZWNpZmllZC4gIERvbmUgYnkgYWRkaW5nIGEgZGlhbG9nCisgICdFbmNvZGluZ01lc3NhZ2UnLCB3aGljaCBjb250YWlucyB0aGUgbGluZSB0byBhZGQgaW4gYSBmaXhlZC1mb250IGVudHJ5CisgIHdpZGdldCwgYW5kIHdoaWNoIGhhcyBhIGJ1dHRvbiB0byBhZGQgdGhhdCBsaW5lIHRvIHRoZSBmaWxlIGF1dG9tYXRpY2FsbHkuCisgIEFsc28sIGFkZCBhIGNvbmZpZ3VyYXRpb24gb3B0aW9uICdFZGl0b3JXaW5kb3cvZW5jb2RpbmcnLCB3aGljaCBoYXMgdGhyZWUKKyAgcG9zc2libGUgdmFsdWVzOiBub25lLCB1dGYtOCwgYW5kIGxvY2FsZS4gTm9uZSBpcyB0aGUgZGVmYXVsdDogSURMRSB3aWxsIHNob3cKKyAgdGhpcyBkaWFsb2cgd2hlbiBub24tQVNDSUkgY2hhcmFjdGVycyBhcmUgZW5jb3VudGVyZWQuIHV0Zi04IG1lYW5zIHRoYXQgZmlsZXMKKyAgd2l0aCBub24tQVNDSUkgY2hhcmFjdGVycyBhcmUgc2F2ZWQgYXMgdXRmLTgtd2l0aC1ib20uIGxvY2FsZSBtZWFucyB0aGF0CisgIGZpbGVzIGFyZSBzYXZlZCBpbiB0aGUgbG9jYWxlJ3MgZW5jb2Rpbmc7IHRoZSBkaWFsb2cgaXMgb25seSBkaXNwbGF5ZWQgaWYgdGhlCisgIHNvdXJjZSBjb250YWlucyBjaGFyYWN0ZXJzIG91dHNpZGUgdGhlIGxvY2FsZSdzIGNoYXJzZXQuICBTRiA3MTA3MzMgLSBMb2V3aXMKKworLSBJbXByb3ZlZCBJL08gcmVzcG9uc2UgYnkgdHdlYWtpbmcgdGhlIHdhaXQgcGFyYW1ldGVyIGluIHZhcmlvdXMKKyAgY2FsbHMgdG8gc2lnbmFsLnNpZ25hbCgpLgorCistIEltcGxlbWVudGVkIGEgdGhyZWFkZWQgc3VicHJvY2VzcyB3aGljaCBhbGxvd3MgaW50ZXJydXB0aW5nIGEgcGFzcworICBsb29wIGluIHVzZXIgY29kZSB1c2luZyB0aGUgJ2ludGVycnVwdCcgZXh0ZW5zaW9uLiAgVXNlciBjb2RlIHJ1bnMKKyAgaW4gTWFpblRocmVhZCwgd2hpbGUgdGhlIFJQQ1NlcnZlciBpcyBoYW5kbGVkIGJ5IFNvY2tUaHJlYWQuICBUaGlzIGlzCisgIG5lY2Vzc2FyeSBiZWNhdXNlIFdpbmRvd3MgZG9lc24ndCBzdXBwb3J0IHNpZ25hbHMuCisKKy0gSW1wbGVtZW50ZWQgdGhlICdpbnRlcnJ1cHQnIGV4dGVuc2lvbiBtb2R1bGUsIHdoaWNoIGFsbG93cyBhIHN1YnRocmVhZAorICB0byByYWlzZSBhIEtleWJvYXJkSW50ZXJydXB0IGluIHRoZSBtYWluIHRocmVhZC4KKworLSBBdHRlbXB0aW5nIHRvIHNhdmUgdGhlIHNoZWxsIHJhaXNlZCBhbiBlcnJvciByZWxhdGVkIHRvIHNhdmluZworICBicmVha3BvaW50cywgd2hpY2ggYXJlIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgc2hlbGwKKworLSBQcm92aWRlIGEgY29ycmVjdCBtZXNzYWdlIHdoZW4gJ2V4aXQnIG9yICdxdWl0JyBhcmUgZW50ZXJlZCBhdCB0aGUKKyAgSURMRSBjb21tYW5kIHByb21wdCAgU0YgNjk1ODYxCisKKy0gRWxpbWluYXRlIGV4dHJhIGJsYW5rIGxpbmUgaW4gc2hlbGwgb3V0cHV0IGNhdXNlZCBieSBub3QgZmx1c2hpbmcKKyAgc3Rkb3V0IHdoZW4gdXNlciBjb2RlIGVuZHMgd2l0aCBhbiB1bnRlcm1pbmF0ZWQgcHJpbnQuIFNGIDY5NTg2MQorCistIE1vdmVkIHJlc3BvbnNpYmlsaXR5IGZvciBleGNlcHRpb24gZm9ybWF0dGluZyAoaS5lLiBwcnVuaW5nIElETEUgaW50ZXJuYWwKKyAgY2FsbHMpIG91dCBvZiBycGMucHkgaW50byB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIuCisKKy0gRXhpdCBJRExFIGNsZWFubHkgZXZlbiB3aGVuIGRvaW5nIHN1YnByb2Nlc3MgSS9PCisKKy0gSGFuZGxlIHN1YnByb2Nlc3MgaW50ZXJydXB0IHdpdGggYW4gUlBDIG1lc3NhZ2UuCisKKy0gUmVzdGFydCB0aGUgc3VicHJvY2VzcyBpZiBpdCB0ZXJtaW5hdGVzIGl0c2VsZi4gKFZQeXRob24gcHJvZ3JhbXMgZG8gdGhhdCkKKworLSBTdXBwb3J0IHN1YmNsYXNzaW5nIG9mIGV4Y2VwdGlvbnMsIGluY2x1ZGluZyBpbiB0aGUgc2hlbGwsIGJ5IG1vdmluZyB0aGUKKyAgZXhjZXB0aW9uIGZvcm1hdHRpbmcgdG8gdGhlIHN1YnByb2Nlc3MuCisKKworCitXaGF0J3MgTmV3IGluIElETEVmb3JrIDAuOSBBbHBoYSAyPworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjctSmFuLTIwMDMqCisKKy0gVXBkYXRlZCBJTlNUQUxMLnR4dCB0byBjbGFpZnkgdXNlIG9mIHRoZSBweXRob24yIHJwbS4KKworLSBJbXByb3ZlZCBmb3JtYXR0aW5nIGluIElETEUgSGVscC4KKworLSBSdW4gbWVudTogUmVwbGFjZSAiUnVuIFNjcmlwdCIgd2l0aCAiUnVuIE1vZHVsZSIuCisKKy0gQ29kZSBlbmNvdW50ZXJpbmcgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiB1bmRlciB0aGUgZGVidWdnZXIgbm93IHNob3dzCisgIHRoZSBjb3JyZWN0IHRyYWNlYmFjaywgd2l0aCBJRExFIGludGVybmFsIGxldmVscyBwcnVuZWQgb3V0LgorCistIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgZW50aXJlbHkgaW4gSURMRSwgZG9uJ3QgcHJ1bmUgdGhlIElETEUgaW50ZXJuYWwKKyAgbW9kdWxlcyBmcm9tIHRoZSB0cmFjZWJhY2sgZGlzcGxheWVkLgorCistIENsYXNzIEJyb3dzZXIgYW5kIFBhdGggQnJvd3NlciBub3cgdXNlIEFsdC1LZXktMiBmb3IgdmVydGljYWwgem9vbS4KKworLSBJRExFIGljb25zIHdpbGwgbm93IGluc3RhbGwgY29ycmVjdGx5IGV2ZW4gd2hlbiBzZXR1cC5weSBpcyBydW4gZnJvbSB0aGUKKyAgYnVpbGQgZGlyZWN0b3J5CisKKy0gQ2xhc3MgQnJvd3NlciBub3cgY29tcGF0aWJsZSB3aXRoIFB5dGhvbjIuMyB2ZXJzaW9uIG9mIHB5Y2xici5weQorCistIExlZnQgY3Vyc29yIG1vdmUgaW4gcHJlc2VuY2Ugb2Ygc2VsZWN0ZWQgdGV4dCBub3cgbW92ZXMgZnJvbSBsZWZ0IGVuZAorICBvZiB0aGUgc2VsZWN0aW9uLgorCistIEFkZCBNZXRhIGtleWJpbmRpbmdzIHRvICJJRExFIENsYXNzaWMgV2luZG93cyIgdG8gaGFuZGxlIHJldmVyc2VkCisgIEFsdC9NZXRhIG9uIHNvbWUgTGludXggZGlzdHJvcy4KKworLSBDaGFuZ2UgZGVmYXVsdDogSURMRSBub3cgc3RhcnRzIHdpdGggUHl0aG9uIFNoZWxsLgorCistIFJlbW92ZWQgdGhlIEZpbGUgUGF0aCBmcm9tIHRoZSBBZGRpdGlvbmFsIEhlbHAgU291cmNlcyBzY3JvbGxlZCBsaXN0LgorCistIEFkZCBjYXBhYmlsaXR5IHRvIGFjY2VzcyBBZGRpdGlvbmFsIEhlbHAgU291cmNlcyBvbiB0aGUgd2ViIGlmIHRoZQorICBIZWxwIEZpbGUgUGF0aCBiZWdpbnMgd2l0aCAvL2h0dHAgb3Igd3d3LiAgKE90aGVyd2lzZSBsb2NhbCBwYXRoIGlzCisgIHZhbGlkYXRlZCwgYXMgYmVmb3JlLikKKworLSBBZGRpdGlvbmFsIEhlbHAgU291cmNlcyB3ZXJlIG5vdCBiZWluZyBwb3N0ZWQgb24gdGhlIEhlbHAgbWVudSBpbiB0aGUKKyAgb3JkZXIgZW50ZXJlZC4gIEltcGxlbWVudCBzb3J0aW5nIHRoZSBsaXN0IGJ5IFtIZWxwRmlsZXNdICdvcHRpb24nCisgIG51bWJlci4KKworLSBBZGQgQnJvd3NlIGJ1dHRvbiB0byBOZXcgSGVscCBTb3VyY2UgZGlhbG9nLiAgQXJyYW5nZSB0byBzdGFydCBpbgorICBQeXRob24vRG9jIGlmIHBsYXRmb3JtIGlzIFdpbmRvd3MsIG90aGVyd2lzZSBzdGFydCBpbiBjdXJyZW50IGRpcmVjdG9yeS4KKworLSBQdXQgdGhlIEFkZGl0aW9uYWwgSGVscCBTb3VyY2VzIGRpcmVjdGx5IG9uIHRoZSBIZWxwIG1lbnUgaW5zdGVhZCBvZiBpbgorICBhbiBFeHRyYSBIZWxwIGNhc2NhZGUgbWVudS4gIFJlYXJyYW5nZSB0aGUgSGVscCBtZW51IHNvIHRoZSBBZGRpdGlvbmFsCisgIEhlbHAgU291cmNlcyBjb21lIGxhc3QuICBVcGRhdGUgaGVscC50eHQgYXBwcm9wcmlhdGVseS4KKworLSBGaXggVGsgcm9vdCBwb3AtdXBzIGluIGNvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5ICBhbmQgY29uZmlnRGlhbG9nLnB5CisKKy0gVW5pZm9ybSBjYXBpdGFsaXphdGlvbiBpbiBHZW5lcmFsIHRhYiBvZiBDb25maWdEaWFsb2csIHVwZGF0ZSB0aGUgZG9jIHN0cmluZy4KKworLSBGaXggYnVnIGluIENvbmZpZ0RpYWxvZyB3aGVyZSBTYXZlQWxsQ2hhbmdlZENvbmZpZygpIHdhcyB1bmV4cGVjdGVkbHkKKyAgZGVsZXRpbmcgQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgZnJvbSB0aGUgdXNlcidzIGNvbmZpZyBmaWxlLgorCistIE1ha2UgY29uZmlnSGVscFNvdXJjZUVkaXQgT0sgYnV0dG9uIHRoZSBkZWZhdWx0IGFuZCBiaW5kIDxSZXR1cm4+CisKKy0gRml4IFRrIHJvb3QgcG9wLXVwcyBpbiBjb25maWdIZWxwU291cmNlRWRpdDogZXJyb3IgZGlhbG9ncyBub3QgYXR0YWNoZWQKKyAgdG8gcGFyZW50cy4KKworLSBVc2Ugb3Muc3RhcnRmaWxlKCkgdG8gb3BlbiBib3RoIEFkZGl0aW9uYWwgSGVscCBhbmQgUHl0aG9uIEhlbHAgb24gdGhlCisgIFdpbmRvd3MgcGxhdGZvcm0uICBUaGUgYXBwbGljYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIHR5cGUgd2lsbCBhY3QgYXMKKyAgdGhlIHZpZXdlci4gIFdpbmRvd3MgaGVscCBmaWxlcyAoLmNobSkgYXJlIG5vdyBzdXBwb3J0ZWQgdmlhIHRoZQorICBTZXR0aW5ncy9HZW5lcmFsL0FkZGl0aW9uYWwgSGVscCBmYWNpbGl0eS4KKworLSBJZiBQeXRob24gSGVscCBmaWxlcyBhcmUgaW5zdGFsbGVkIGxvY2FsbHkgb24gTGludXgsIHVzZSB0aGVtIGluc3RlYWQgb2YKKyAgYWNjZXNzaW5nIHB5dGhvbi5vcmcuCisKKy0gTWFrZSB0aGUgbWV0aG9kcyBmb3IgZmluZGluZyB0aGUgUHl0aG9uIGhlbHAgZG9jcyBtb3JlIHJvYnVzdCwgYW5kIG1ha2UKKyAgdGhlbSB3b3JrIGluIHRoZSBpbnN0YWxsZWQgY29uZmlndXJhdGlvbiwgYWxzby4KKworLSBPbiB0aGUgU2F2ZSBCZWZvcmUgUnVuIGRpYWxvZywgbWFrZSB0aGUgT0sgYnV0dG9uIHRoZSBkZWZhdWx0LiAgT25lCisgIGxlc3MgbW91c2UgYWN0aW9uIQorCistIEFkZCBhIG1ldGhvZDogRWRpdG9yV2luZG93LmdldF9nZW9tZXRyeSgpIGZvciBmdXR1cmUgdXNlIGluIGltcGxlbWVudGluZworICB3aW5kb3cgbG9jYXRpb24gcGVyc2lzdGVuY2UuCisKKy0gUmVtb3ZlZCB0aGUgIkhlbHAvQWR2aWNlIiBtZW51IGVudHJ5LiAgVGhhbmtzLCBEYXZpZCEgIFdlJ2xsIHJlbWVtYmVyIQorCistIENoYW5nZSB0aGUgIkNsYXNzaWMgV2luZG93cyIgdGhlbWUncyBwYXN0ZSBrZXkgdG8gYmUgPGN0cmwtdj4uCisKKy0gUmVhcnJhbmdlIHRoZSBTaGVsbCBtZW51IHRvIHB1dCBTdGFjayBWaWV3ZXIgZW50cmllcyBhZGphY2VudC4KKworLSBBZGQgdGhlIGFiaWxpdHkgdG8gcmVzdGFydCB0aGUgc3VicHJvY2VzcyBpbnRlcnByZXRlciBmcm9tIHRoZSBzaGVsbCB3aW5kb3c7CisgIGFkZCBhbiBhc3NvY2lhdGVkIG1lbnUgZW50cnkgIlNoZWxsL1Jlc3RhcnQiIHdpdGggYmluZGluZyBDb250cm9sLUY2LiAgVXBkYXRlCisgIElETEUgaGVscC4KKworLSBVcG9uIGEgcmVzdGFydCwgYW5ub3RhdGUgdGhlIHNoZWxsIHdpbmRvdyB3aXRoIGEgInJlc3RhcnQgYm91bmRhcnkiLiAgQWRkIGEKKyAgc2hlbGwgd2luZG93IG1lbnUgIlNoZWxsL1ZpZXcgUmVzdGFydCIgd2l0aCBiaW5kaW5nIEY2IHRvIGp1bXAgdG8gdGhlIG1vc3QKKyAgcmVjZW50IHJlc3RhcnQgYm91bmRhcnkuCisKKy0gQWRkIFNoZWxsIG1lbnUgdG8gUHl0aG9uIFNoZWxsOyBjaGFuZ2UgIlNldHRpbmdzIiB0byAiT3B0aW9ucyIuCisKKy0gUmVtb3ZlIGluY29ycmVjdCBjb21tZW50IGluIHNldHVwLnB5OiBJRExFZm9yayBpcyBub3cgaW5zdGFsbGVkIGFzIGEgcGFja2FnZS4KKworLSBBZGQgSU5TVEFMTC50eHQsIEhJU1RPUlkudHh0LCBORVdTLnR4dCB0byBpbnN0YWxsZWQgY29uZmlndXJhdGlvbi4KKworLSBJbiBpbnN0YWxsZXIgdGV4dCwgZml4IHJlZmVyZW5jZSB0byBWaXN1YWwgUHl0aG9uLCBzaG91bGQgYmUgVlB5dGhvbi4KKyAgUHJvcGVybHkgY3JlZGl0IERhdmlkIFNjaGVyZXIuCisKKy0gTW9kaWZpZWQgaWRsZSwgaWRsZS5weSwgaWRsZS5weXcgdG8gaW1wcm92ZSBleGNlcHRpb24gaGFuZGxpbmcuCisKKworV2hhdCdzIE5ldyBpbiBJRExFZm9yayAwLjkgQWxwaGEgMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKypSZWxlYXNlIGRhdGU6IDMxLURlYy0yMDAyKgorCistIEZpcnN0IHJlbGVhc2Ugb2YgbWFqb3IgbmV3IGZ1bmN0aW9uYWxpdHkuICBGb3IgZnVydGhlciBkZXRhaWxzIHJlZmVyIHRvCisgIElkbGUtZGV2IGFuZC9vciB0aGUgU291cmNlZm9yZ2UgQ1ZTLgorCistIEFkYXB0ZWQgdG8gdGhlIE1hYyBwbGF0Zm9ybS4KKworLSBPdmVyaGF1bGVkIHRoZSBJRExFIHN0YXJ0dXAgb3B0aW9ucyBhbmQgcmV2aXNlZCB0aGUgaWRsZSAtaCBoZWxwIG1lc3NhZ2UsCisgIHdoaWNoIHByb3ZpZGVzIGRldGFpbHMgb2YgY29tbWFuZCBsaW5lIHVzYWdlLgorCistIE11bHRpcGxlIGJ1ZyBmaXhlcyBhbmQgdXNhYmlsaXR5IGVuaGFuY2VtZW50cy4KKworLSBJbnRyb2R1Y2VkIHRoZSBuZXcgUlBDIGltcGxlbWVudGF0aW9uLCB3aGljaCBpbmNsdWRlcyBhIGRlYnVnZ2VyLiAgVGhlIG91dHB1dAorICBvZiB1c2VyIGNvZGUgaXMgdG8gdGhlIHNoZWxsLCBhbmQgdGhlIHNoZWxsIG1heSBiZSB1c2VkIHRvIGluc3BlY3QgdGhlCisgIGVudmlyb25tZW50IGFmdGVyIHRoZSBydW4gaGFzIGZpbmlzaGVkLiAgKEluIHZlcnNpb24gMC44LjEgdGhlIHNoZWxsCisgIGVudmlyb25tZW50IHdhcyBzZXBhcmF0ZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBvZiB0aGUgdXNlciBjb2RlLikKKworLSBJbnRyb2R1Y2VkIHRoZSBjb25maWd1cmF0aW9uIEdVSSBhbmQgYSBuZXcgQWJvdXQgZGlhbG9nLgorCistIFJlbW92ZWQgRGF2aWQgU2NoZXJlcidzIFJlbW90ZSBQcm9jZWR1cmUgQ2FsbCBjb2RlIGFuZCByZXBsYWNlZCB3aXRoIEd1aWRvCisgIHZhbiBSb3NzdW0ncy4gIEd2UiBjb2RlIGhhcyBzdXBwb3J0IGZvciB0aGUgSURMRSBkZWJ1Z2dlciBhbmQgdXNlcyB0aGUgc2hlbGwKKyAgdG8gaW5zcGVjdCB0aGUgZW52aXJvbm1lbnQgb2YgY29kZSBSdW4gZnJvbSBhbiBFZGl0IHdpbmRvdy4gIEZpbGVzIHJlbW92ZWQ6CisgIEV4ZWNCaW5kaW5nLnB5LCBsb2FkZXIucHksIHByb3RvY29sLnB5LCBSZW1vdGUucHksIHNwYXduLnB5CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitSZWZlciB0byBISVNUT1JZLnR4dCBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiBlYXJsaWVyIHJlbGVhc2VzLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9PYmplY3RCcm93c2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZTY5ODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weQpAQCAtMCwwICsxLDE1MSBAQAorIyBYWFggVE8gRE86CisjIC0gcG9wdXAgbWVudQorIyAtIHN1cHBvcnQgcGFydGlhbCBvciB0b3RhbCByZWRpc3BsYXkKKyMgLSBtb3JlIGRvYyBzdHJpbmdzCisjIC0gdG9vbHRpcHMKKworIyBvYmplY3QgYnJvd3NlcgorCisjIFhYWCBUTyBETzoKKyMgLSBmb3IgY2xhc3Nlcy9tb2R1bGVzLCBhZGQgIm9wZW4gc291cmNlIiB0byBvYmplY3QgYnJvd3NlcgorCitmcm9tIGlkbGVsaWIuVHJlZVdpZGdldCBpbXBvcnQgVHJlZUl0ZW0sIFRyZWVOb2RlLCBTY3JvbGxlZENhbnZhcworCitmcm9tIHJlcHIgaW1wb3J0IFJlcHIKKworbXlyZXByID0gUmVwcigpCitteXJlcHIubWF4c3RyaW5nID0gMTAwCitteXJlcHIubWF4b3RoZXIgPSAxMDAKKworY2xhc3MgT2JqZWN0VHJlZUl0ZW0oVHJlZUl0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsYWJlbHRleHQsIG9iamVjdCwgc2V0ZnVuY3Rpb249Tm9uZSk6CisgICAgICAgIHNlbGYubGFiZWx0ZXh0ID0gbGFiZWx0ZXh0CisgICAgICAgIHNlbGYub2JqZWN0ID0gb2JqZWN0CisgICAgICAgIHNlbGYuc2V0ZnVuY3Rpb24gPSBzZXRmdW5jdGlvbgorICAgIGRlZiBHZXRMYWJlbFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxhYmVsdGV4dAorICAgIGRlZiBHZXRUZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gbXlyZXByLnJlcHIoc2VsZi5vYmplY3QpCisgICAgZGVmIEdldEljb25OYW1lKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5Jc0V4cGFuZGFibGUoKToKKyAgICAgICAgICAgIHJldHVybiAicHl0aG9uIgorICAgIGRlZiBJc0VkaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zZXRmdW5jdGlvbiBpcyBub3QgTm9uZQorICAgIGRlZiBTZXRUZXh0KHNlbGYsIHRleHQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IGV2YWwodGV4dCkKKyAgICAgICAgICAgIHNlbGYuc2V0ZnVuY3Rpb24odmFsdWUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub2JqZWN0ID0gdmFsdWUKKyAgICBkZWYgSXNFeHBhbmRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gbm90IG5vdCBkaXIoc2VsZi5vYmplY3QpCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIGtleXMgPSBkaXIoc2VsZi5vYmplY3QpCisgICAgICAgIHN1Ymxpc3QgPSBbXQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYub2JqZWN0LCBrZXkpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGl0ZW0gPSBtYWtlX29iamVjdHRyZWVpdGVtKAorICAgICAgICAgICAgICAgIHN0cihrZXkpICsgIiA9IiwKKyAgICAgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgICAgICBsYW1iZGEgdmFsdWUsIGtleT1rZXksIG9iamVjdD1zZWxmLm9iamVjdDoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihvYmplY3QsIGtleSwgdmFsdWUpKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworY2xhc3MgSW5zdGFuY2VUcmVlSXRlbShPYmplY3RUcmVlSXRlbSk6CisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgc3VibGlzdCA9IE9iamVjdFRyZWVJdGVtLkdldFN1Ykxpc3Qoc2VsZikKKyAgICAgICAgc3VibGlzdC5pbnNlcnQoMCwKKyAgICAgICAgICAgIG1ha2Vfb2JqZWN0dHJlZWl0ZW0oIl9fY2xhc3NfXyA9Iiwgc2VsZi5vYmplY3QuX19jbGFzc19fKSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworY2xhc3MgQ2xhc3NUcmVlSXRlbShPYmplY3RUcmVlSXRlbSk6CisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgc3VibGlzdCA9IE9iamVjdFRyZWVJdGVtLkdldFN1Ykxpc3Qoc2VsZikKKyAgICAgICAgaWYgbGVuKHNlbGYub2JqZWN0Ll9fYmFzZXNfXykgPT0gMToKKyAgICAgICAgICAgIGl0ZW0gPSBtYWtlX29iamVjdHRyZWVpdGVtKCJfX2Jhc2VzX19bMF0gPSIsCisgICAgICAgICAgICAgICAgc2VsZi5vYmplY3QuX19iYXNlc19fWzBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaXRlbSA9IG1ha2Vfb2JqZWN0dHJlZWl0ZW0oIl9fYmFzZXNfXyA9Iiwgc2VsZi5vYmplY3QuX19iYXNlc19fKQorICAgICAgICBzdWJsaXN0Lmluc2VydCgwLCBpdGVtKQorICAgICAgICByZXR1cm4gc3VibGlzdAorCitjbGFzcyBBdG9taWNPYmplY3RUcmVlSXRlbShPYmplY3RUcmVlSXRlbSk6CisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworY2xhc3MgU2VxdWVuY2VUcmVlSXRlbShPYmplY3RUcmVlSXRlbSk6CisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLm9iamVjdCkgPiAwCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiByYW5nZShsZW4oc2VsZi5vYmplY3QpKQorICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLmtleXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYub2JqZWN0W2tleV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZGVmIHNldGZ1bmN0aW9uKHZhbHVlLCBrZXk9a2V5LCBvYmplY3Q9c2VsZi5vYmplY3QpOgorICAgICAgICAgICAgICAgIG9iamVjdFtrZXldID0gdmFsdWUKKyAgICAgICAgICAgIGl0ZW0gPSBtYWtlX29iamVjdHRyZWVpdGVtKCIlcjoiICUgKGtleSwpLCB2YWx1ZSwgc2V0ZnVuY3Rpb24pCisgICAgICAgICAgICBzdWJsaXN0LmFwcGVuZChpdGVtKQorICAgICAgICByZXR1cm4gc3VibGlzdAorCitjbGFzcyBEaWN0VHJlZUl0ZW0oU2VxdWVuY2VUcmVlSXRlbSk6CisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIGtleXMgPSBzZWxmLm9iamVjdC5rZXlzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4ga2V5cworCitmcm9tIHR5cGVzIGltcG9ydCAqCisKK2Rpc3BhdGNoID0geworICAgIEludFR5cGU6IEF0b21pY09iamVjdFRyZWVJdGVtLAorICAgIExvbmdUeXBlOiBBdG9taWNPYmplY3RUcmVlSXRlbSwKKyAgICBGbG9hdFR5cGU6IEF0b21pY09iamVjdFRyZWVJdGVtLAorICAgIFN0cmluZ1R5cGU6IEF0b21pY09iamVjdFRyZWVJdGVtLAorICAgIFR1cGxlVHlwZTogU2VxdWVuY2VUcmVlSXRlbSwKKyAgICBMaXN0VHlwZTogU2VxdWVuY2VUcmVlSXRlbSwKKyAgICBEaWN0VHlwZTogRGljdFRyZWVJdGVtLAorICAgIEluc3RhbmNlVHlwZTogSW5zdGFuY2VUcmVlSXRlbSwKKyAgICBDbGFzc1R5cGU6IENsYXNzVHJlZUl0ZW0sCit9CisKK2RlZiBtYWtlX29iamVjdHRyZWVpdGVtKGxhYmVsdGV4dCwgb2JqZWN0LCBzZXRmdW5jdGlvbj1Ob25lKToKKyAgICB0ID0gdHlwZShvYmplY3QpCisgICAgaWYgdCBpbiBkaXNwYXRjaDoKKyAgICAgICAgYyA9IGRpc3BhdGNoW3RdCisgICAgZWxzZToKKyAgICAgICAgYyA9IE9iamVjdFRyZWVJdGVtCisgICAgcmV0dXJuIGMobGFiZWx0ZXh0LCBvYmplY3QsIHNldGZ1bmN0aW9uKQorCisjIFRlc3Qgc2NyaXB0CisKK2RlZiBfdGVzdCgpOgorICAgIGltcG9ydCBzeXMKKyAgICBmcm9tIFRraW50ZXIgaW1wb3J0IFRrCisgICAgcm9vdCA9IFRrKCkKKyAgICByb290LmNvbmZpZ3VyZShiZD0wLCBiZz0ieWVsbG93IikKKyAgICByb290LmZvY3VzX3NldCgpCisgICAgc2MgPSBTY3JvbGxlZENhbnZhcyhyb290LCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCwgdGFrZWZvY3VzPTEpCisgICAgc2MuZnJhbWUucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgaXRlbSA9IG1ha2Vfb2JqZWN0dHJlZWl0ZW0oInN5cyIsIHN5cykKKyAgICBub2RlID0gVHJlZU5vZGUoc2MuY2FudmFzLCBOb25lLCBpdGVtKQorICAgIG5vZGUudXBkYXRlKCkKKyAgICByb290Lm1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxMDdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9PYmplY3RCcm93c2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT2JqZWN0QnJvd3Nlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYxMDdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9PYmplY3RCcm93c2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvT3V0cHV0V2luZG93LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMThkODQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weQpAQCAtMCwwICsxLDE0OSBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCitmcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBFZGl0b3JXaW5kb3cKK2ltcG9ydCByZQoraW1wb3J0IHRrTWVzc2FnZUJveAorZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKKworY2xhc3MgT3V0cHV0V2luZG93KEVkaXRvcldpbmRvdyk6CisKKyAgICAiIiJBbiBlZGl0b3Igd2luZG93IHRoYXQgY2FuIHNlcnZlIGFzIGFuIG91dHB1dCBmaWxlLgorCisgICAgQWxzbyB0aGUgZnV0dXJlIGJhc2UgY2xhc3MgZm9yIHRoZSBQeXRob24gc2hlbGwgd2luZG93LgorICAgIFRoaXMgY2xhc3MgaGFzIG5vIGlucHV0IGZhY2lsaXRpZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBFZGl0b3JXaW5kb3cuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYudGV4dC5iaW5kKCI8PGdvdG8tZmlsZS1saW5lPj4iLCBzZWxmLmdvdG9fZmlsZV9saW5lKQorCisgICAgIyBDdXN0b21pemUgRWRpdG9yV2luZG93CisKKyAgICBkZWYgaXNweXRob25zb3VyY2Uoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAjIE5vIGNvbG9yaXphdGlvbiBuZWVkZWQKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBzaG9ydF90aXRsZShzZWxmKToKKyAgICAgICAgcmV0dXJuICJPdXRwdXQiCisKKyAgICBkZWYgbWF5YmVzYXZlKHNlbGYpOgorICAgICAgICAjIE92ZXJyaWRlIGJhc2UgY2xhc3MgbWV0aG9kIC0tIGRvbid0IGFzayBhbnkgcXVlc3Rpb25zCisgICAgICAgIGlmIHNlbGYuZ2V0X3NhdmVkKCk6CisgICAgICAgICAgICByZXR1cm4gInllcyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAibm8iCisKKyAgICAjIEFjdCBhcyBvdXRwdXQgZmlsZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMsIHRhZ3M9KCksIG1hcms9Imluc2VydCIpOgorICAgICAgICAjIFRrIGFzc3VtZXMgdGhhdCBieXRlIHN0cmluZ3MgYXJlIExhdGluLTE7CisgICAgICAgICMgd2UgYXNzdW1lIHRoYXQgdGhleSBhcmUgaW4gdGhlIGxvY2FsZSdzIGVuY29kaW5nCisgICAgICAgIGlmIGlzaW5zdGFuY2Uocywgc3RyKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzID0gdW5pY29kZShzLCBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgICMgc29tZSBvdGhlciBlbmNvZGluZzsgbGV0IFRjbCBkZWFsIHdpdGggaXQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGV4dC5pbnNlcnQobWFyaywgcywgdGFncykKKyAgICAgICAgc2VsZi50ZXh0LnNlZShtYXJrKQorICAgICAgICBzZWxmLnRleHQudXBkYXRlKCkKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGxpbmVzKToKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBzZWxmLndyaXRlKGxpbmUpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHBhc3MKKworICAgICMgT3VyIG93biByaWdodC1idXR0b24gbWVudQorCisgICAgcm1lbnVfc3BlY3MgPSBbCisgICAgICAgICgiQ3V0IiwgIjw8Y3V0Pj4iLCAicm1lbnVfY2hlY2tfY3V0IiksCisgICAgICAgICgiQ29weSIsICI8PGNvcHk+PiIsICJybWVudV9jaGVja19jb3B5IiksCisgICAgICAgICgiUGFzdGUiLCAiPDxwYXN0ZT4+IiwgInJtZW51X2NoZWNrX3Bhc3RlIiksCisgICAgICAgIChOb25lLCBOb25lLCBOb25lKSwKKyAgICAgICAgKCJHbyB0byBmaWxlL2xpbmUiLCAiPDxnb3RvLWZpbGUtbGluZT4+IiwgTm9uZSksCisgICAgXQorCisgICAgZmlsZV9saW5lX3BhdHMgPSBbCisgICAgICAgICMgb3JkZXIgb2YgcGF0dGVybnMgbWF0dGVycworICAgICAgICByJ2ZpbGUgIihbXiJdKikiLCBsaW5lIChcZCspJywKKyAgICAgICAgcicoW15cc10rKVwoKFxkKylcKScsCisgICAgICAgIHInXihccypcUy4qPyk6XHMqKFxkKyk6JywgICMgV2luIGZpbGVuYW1lLCBtYXliZSBzdGFydGluZyB3aXRoIHNwYWNlcworICAgICAgICByJyhbXlxzXSspOlxzKihcZCspOicsICAgICAjIGZpbGVuYW1lIG9yIHBhdGgsIGx0cmltCisgICAgICAgIHInXlxzKihcUy4qPyk6XHMqKFxkKyk6JywgICMgV2luIGFicyBwYXRoIHdpdGggZW1iZWRkZWQgc3BhY2VzLCBsdHJpbQorICAgIF0KKworICAgIGZpbGVfbGluZV9wcm9ncyA9IE5vbmUKKworICAgIGRlZiBnb3RvX2ZpbGVfbGluZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5maWxlX2xpbmVfcHJvZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIGwgPSBbXQorICAgICAgICAgICAgZm9yIHBhdCBpbiBzZWxmLmZpbGVfbGluZV9wYXRzOgorICAgICAgICAgICAgICAgIGwuYXBwZW5kKHJlLmNvbXBpbGUocGF0LCByZS5JR05PUkVDQVNFKSkKKyAgICAgICAgICAgIHNlbGYuZmlsZV9saW5lX3Byb2dzID0gbAorICAgICAgICAjIHgsIHkgPSBzZWxmLmV2ZW50LngsIHNlbGYuZXZlbnQueQorICAgICAgICAjIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgIkAlZCwlZCIgJSAoeCwgeSkpCisgICAgICAgIGxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCBsaW5lZW5kIikKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fZmlsZV9saW5lX2hlbHBlcihsaW5lKQorICAgICAgICBpZiBub3QgcmVzdWx0OgorICAgICAgICAgICAgIyBUcnkgdGhlIHByZXZpb3VzIGxpbmUuICBUaGlzIGlzIGhhbmR5IGUuZy4gaW4gdHJhY2ViYWNrcywKKyAgICAgICAgICAgICMgd2hlcmUgeW91IHRlbmQgdG8gcmlnaHQtY2xpY2sgb24gdGhlIGRpc3BsYXllZCBzb3VyY2UgbGluZQorICAgICAgICAgICAgbGluZSA9IHNlbGYudGV4dC5nZXQoImluc2VydCAtMWxpbmUgbGluZXN0YXJ0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnNlcnQgLTFsaW5lIGxpbmVlbmQiKQorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5fZmlsZV9saW5lX2hlbHBlcihsaW5lKQorICAgICAgICAgICAgaWYgbm90IHJlc3VsdDoKKyAgICAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiTm8gc3BlY2lhbCBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBsaW5lIHlvdSBwb2ludCBhdCBkb2Vzbid0IGxvb2sgbGlrZSAiCisgICAgICAgICAgICAgICAgICAgICJhIHZhbGlkIGZpbGUgbmFtZSBmb2xsb3dlZCBieSBhIGxpbmUgbnVtYmVyLiIsCisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcj1zZWxmLnRleHQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbGVuYW1lLCBsaW5lbm8gPSByZXN1bHQKKyAgICAgICAgZWRpdCA9IHNlbGYuZmxpc3Qub3BlbihmaWxlbmFtZSkKKyAgICAgICAgZWRpdC5nb3RvbGluZShsaW5lbm8pCisKKyAgICBkZWYgX2ZpbGVfbGluZV9oZWxwZXIoc2VsZiwgbGluZSk6CisgICAgICAgIGZvciBwcm9nIGluIHNlbGYuZmlsZV9saW5lX3Byb2dzOgorICAgICAgICAgICAgbWF0Y2ggPSBwcm9nLnNlYXJjaChsaW5lKQorICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVubyA9IG1hdGNoLmdyb3VwKDEsIDIpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInIiKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZSwgaW50KGxpbmVubykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyMgVGhlc2UgY2xhc3NlcyBhcmUgY3VycmVudGx5IG5vdCB1c2VkIGJ1dCBtaWdodCBjb21lIGluIGhhbmR5CisKK2NsYXNzIE9uRGVtYW5kT3V0cHV0V2luZG93OgorCisgICAgdGFnZGVmcyA9IHsKKyAgICAgICAgIyBYWFggU2hvdWxkIHVzZSBJZGxlUHJlZnMuQ29sb3JQcmVmcworICAgICAgICAic3Rkb3V0IjogIHsiZm9yZWdyb3VuZCI6ICJibHVlIn0sCisgICAgICAgICJzdGRlcnIiOiAgeyJmb3JlZ3JvdW5kIjogIiMwMDc3MDAifSwKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmxpc3QpOgorICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKKyAgICAgICAgc2VsZi5vd2luID0gTm9uZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIHMsIHRhZ3MsIG1hcmspOgorICAgICAgICBpZiBub3Qgc2VsZi5vd2luOgorICAgICAgICAgICAgc2VsZi5zZXR1cCgpCisgICAgICAgIHNlbGYub3dpbi53cml0ZShzLCB0YWdzLCBtYXJrKQorCisgICAgZGVmIHNldHVwKHNlbGYpOgorICAgICAgICBzZWxmLm93aW4gPSBvd2luID0gT3V0cHV0V2luZG93KHNlbGYuZmxpc3QpCisgICAgICAgIHRleHQgPSBvd2luLnRleHQKKyAgICAgICAgZm9yIHRhZywgY25mIGluIHNlbGYudGFnZGVmcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgY25mOgorICAgICAgICAgICAgICAgIHRleHQudGFnX2NvbmZpZ3VyZSh0YWcsICoqY25mKQorICAgICAgICB0ZXh0LnRhZ19yYWlzZSgnc2VsJykKKyAgICAgICAgc2VsZi53cml0ZSA9IHNlbGYub3dpbi53cml0ZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT3V0cHV0V2luZG93LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFhZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvT3V0cHV0V2luZG93LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFhZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL091dHB1dFdpbmRvdy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhcmVuTWF0Y2gucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGFyZW5NYXRjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDkxYjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BhcmVuTWF0Y2gucHkKQEAgLTAsMCArMSwxNzIgQEAKKyIiIlBhcmVuTWF0Y2ggLS0gQW4gSURMRSBleHRlbnNpb24gZm9yIHBhcmVudGhlc2lzIG1hdGNoaW5nLgorCitXaGVuIHlvdSBoaXQgYSByaWdodCBwYXJlbiwgdGhlIGN1cnNvciBzaG91bGQgbW92ZSBicmllZmx5IHRvIHRoZSBsZWZ0CitwYXJlbi4gIFBhcmVuIGhlcmUgaXMgdXNlZCBnZW5lcmljYWxseTsgdGhlIG1hdGNoaW5nIGFwcGxpZXMgdG8KK3BhcmVudGhlc2VzLCBzcXVhcmUgYnJhY2tldHMsIGFuZCBjdXJseSBicmFjZXMuCisiIiIKKworZnJvbSBpZGxlbGliLkh5cGVyUGFyc2VyIGltcG9ydCBIeXBlclBhcnNlcgorZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCisKK19vcGVuZXJzID0geycpJzonKCcsJ10nOidbJywnfSc6J3snfQorQ0hFQ0tfREVMQVkgPSAxMDAgIyBtaWxpc2Vjb25kcworCitjbGFzcyBQYXJlbk1hdGNoOgorICAgICIiIkhpZ2hsaWdodCBtYXRjaGluZyBwYXJlbnRoZXNlcworCisgICAgVGhlcmUgYXJlIHRocmVlIHN1cHBvcnRlZCBzdHlsZSBvZiBwYXJlbiBtYXRjaGluZywgYmFzZWQgbG9vc2VseQorICAgIG9uIHRoZSBFbWFjcyBvcHRpb25zLiAgVGhlIHN0eWxlIGlzIHNlbGVjdCBiYXNlZCBvbiB0aGUKKyAgICBISUxJVEVfU1RZTEUgYXR0cmlidXRlOyBpdCBjYW4gYmUgY2hhbmdlZCB1c2VkIHRoZSBzZXRfc3R5bGUKKyAgICBtZXRob2QuCisKKyAgICBUaGUgc3VwcG9ydGVkIHN0eWxlcyBhcmU6CisKKyAgICBkZWZhdWx0IC0tIFdoZW4gYSByaWdodCBwYXJlbiBpcyB0eXBlZCwgaGlnaGxpZ2h0IHRoZSBtYXRjaGluZworICAgICAgICBsZWZ0IHBhcmVuIGZvciAxLzIgc2VjLgorCisgICAgZXhwcmVzc2lvbiAtLSBXaGVuIGEgcmlnaHQgcGFyZW4gaXMgdHlwZWQsIGhpZ2hsaWdodCB0aGUgZW50aXJlCisgICAgICAgIGV4cHJlc3Npb24gZnJvbSB0aGUgbGVmdCBwYXJlbiB0byB0aGUgcmlnaHQgcGFyZW4uCisKKyAgICBUT0RPOgorICAgICAgICAtIGV4dGVuZCBJRExFIHdpdGggY29uZmlndXJhdGlvbiBkaWFsb2cgdG8gY2hhbmdlIG9wdGlvbnMKKyAgICAgICAgLSBpbXBsZW1lbnQgcmVzdCBvZiBFbWFjcyBoaWdobGlnaHQgc3R5bGVzIChzZWUgYmVsb3cpCisgICAgICAgIC0gcHJpbnQgbWlzbWF0Y2ggd2FybmluZyBpbiBJRExFIHN0YXR1cyB3aW5kb3cKKworICAgIE5vdGU6IEluIEVtYWNzLCB0aGVyZSBhcmUgc2V2ZXJhbCBzdHlsZXMgb2YgaGlnaGxpZ2h0IHdoZXJlIHRoZQorICAgIG1hdGNoaW5nIHBhcmVuIGlzIGhpZ2hsaWdodGVkIHdoZW5ldmVyIHRoZSBjdXJzb3IgaXMgaW1tZWRpYXRlbHkKKyAgICB0byB0aGUgcmlnaHQgb2YgYSByaWdodCBwYXJlbi4gIEkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhhdCBpbiBUaywKKyAgICBzbyBJIGhhdmVuJ3QgYm90aGVyZWQuCisgICAgIiIiCisgICAgbWVudWRlZnMgPSBbCisgICAgICAgICgnZWRpdCcsIFsKKyAgICAgICAgICAgICgiU2hvdyBzdXJyb3VuZGluZyBwYXJlbnMiLCAiPDxmbGFzaC1wYXJlbj4+IiksCisgICAgICAgIF0pCisgICAgXQorICAgIFNUWUxFID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdleHRlbnNpb25zJywnUGFyZW5NYXRjaCcsJ3N0eWxlJywKKyAgICAgICAgICAgIGRlZmF1bHQ9J2V4cHJlc3Npb24nKQorICAgIEZMQVNIX0RFTEFZID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdleHRlbnNpb25zJywnUGFyZW5NYXRjaCcsJ2ZsYXNoLWRlbGF5JywKKyAgICAgICAgICAgIHR5cGU9J2ludCcsZGVmYXVsdD01MDApCisgICAgSElMSVRFX0NPTkZJRyA9IGlkbGVDb25mLkdldEhpZ2hsaWdodChpZGxlQ29uZi5DdXJyZW50VGhlbWUoKSwnaGlsaXRlJykKKyAgICBCRUxMID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdleHRlbnNpb25zJywnUGFyZW5NYXRjaCcsJ2JlbGwnLAorICAgICAgICAgICAgdHlwZT0nYm9vbCcsZGVmYXVsdD0xKQorCisgICAgUkVTVE9SRV9WSVJUVUFMX0VWRU5UX05BTUUgPSAiPDxwYXJlbm1hdGNoLWNoZWNrLXJlc3RvcmU+PiIKKyAgICAjIFdlIHdhbnQgdGhlIHJlc3RvcmUgZXZlbnQgYmUgY2FsbGVkIGJlZm9yZSB0aGUgdXN1YWwgcmV0dXJuIGFuZAorICAgICMgYmFja3NwYWNlIGV2ZW50cy4KKyAgICBSRVNUT1JFX1NFUVVFTkNFUyA9ICgiPEtleVByZXNzPiIsICI8QnV0dG9uUHJlc3M+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPEtleS1SZXR1cm4+IiwgIjxLZXktQmFja1NwYWNlPiIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZWRpdHdpbik6CisgICAgICAgIHNlbGYuZWRpdHdpbiA9IGVkaXR3aW4KKyAgICAgICAgc2VsZi50ZXh0ID0gZWRpdHdpbi50ZXh0CisgICAgICAgICMgQmluZCB0aGUgY2hlY2stcmVzdG9yZSBldmVudCB0byB0aGUgZnVuY3Rpb24gcmVzdG9yZV9ldmVudCwKKyAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiB0aGVuIHVzZSBhY3RpdmF0ZV9yZXN0b3JlICh3aGljaCBjYWxscyBldmVudF9hZGQpCisgICAgICAgICMgYW5kIGRlYWN0aXZhdGVfcmVzdG9yZSAod2hpY2ggY2FsbHMgZXZlbnRfZGVsZXRlKS4KKyAgICAgICAgZWRpdHdpbi50ZXh0LmJpbmQoc2VsZi5SRVNUT1JFX1ZJUlRVQUxfRVZFTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN0b3JlX2V2ZW50KQorICAgICAgICBzZWxmLmNvdW50ZXIgPSAwCisgICAgICAgIHNlbGYuaXNfcmVzdG9yZV9hY3RpdmUgPSAwCisgICAgICAgIHNlbGYuc2V0X3N0eWxlKHNlbGYuU1RZTEUpCisKKyAgICBkZWYgYWN0aXZhdGVfcmVzdG9yZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaXNfcmVzdG9yZV9hY3RpdmU6CisgICAgICAgICAgICBmb3Igc2VxIGluIHNlbGYuUkVTVE9SRV9TRVFVRU5DRVM6CisgICAgICAgICAgICAgICAgc2VsZi50ZXh0LmV2ZW50X2FkZChzZWxmLlJFU1RPUkVfVklSVFVBTF9FVkVOVF9OQU1FLCBzZXEpCisgICAgICAgICAgICBzZWxmLmlzX3Jlc3RvcmVfYWN0aXZlID0gVHJ1ZQorCisgICAgZGVmIGRlYWN0aXZhdGVfcmVzdG9yZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pc19yZXN0b3JlX2FjdGl2ZToKKyAgICAgICAgICAgIGZvciBzZXEgaW4gc2VsZi5SRVNUT1JFX1NFUVVFTkNFUzoKKyAgICAgICAgICAgICAgICBzZWxmLnRleHQuZXZlbnRfZGVsZXRlKHNlbGYuUkVTVE9SRV9WSVJUVUFMX0VWRU5UX05BTUUsIHNlcSkKKyAgICAgICAgICAgIHNlbGYuaXNfcmVzdG9yZV9hY3RpdmUgPSBGYWxzZQorCisgICAgZGVmIHNldF9zdHlsZShzZWxmLCBzdHlsZSk6CisgICAgICAgIHNlbGYuU1RZTEUgPSBzdHlsZQorICAgICAgICBpZiBzdHlsZSA9PSAiZGVmYXVsdCI6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV90YWcgPSBzZWxmLmNyZWF0ZV90YWdfZGVmYXVsdAorICAgICAgICAgICAgc2VsZi5zZXRfdGltZW91dCA9IHNlbGYuc2V0X3RpbWVvdXRfbGFzdAorICAgICAgICBlbGlmIHN0eWxlID09ICJleHByZXNzaW9uIjoKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX3RhZyA9IHNlbGYuY3JlYXRlX3RhZ19leHByZXNzaW9uCisgICAgICAgICAgICBzZWxmLnNldF90aW1lb3V0ID0gc2VsZi5zZXRfdGltZW91dF9ub25lCisKKyAgICBkZWYgZmxhc2hfcGFyZW5fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpbmRpY2VzID0gSHlwZXJQYXJzZXIoc2VsZi5lZGl0d2luLCAiaW5zZXJ0IikuZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKCkKKyAgICAgICAgaWYgaW5kaWNlcyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi53YXJuX21pc21hdGNoZWQoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYWN0aXZhdGVfcmVzdG9yZSgpCisgICAgICAgIHNlbGYuY3JlYXRlX3RhZyhpbmRpY2VzKQorICAgICAgICBzZWxmLnNldF90aW1lb3V0X2xhc3QoKQorCisgICAgZGVmIHBhcmVuX2Nsb3NlZF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgICMgSWYgaXQgd2FzIGEgc2hvcnRjdXQgYW5kIG5vdCByZWFsbHkgYSBjbG9zaW5nIHBhcmVuLCBxdWl0LgorICAgICAgICBjbG9zZXIgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQtMWMiKQorICAgICAgICBpZiBjbG9zZXIgbm90IGluIF9vcGVuZXJzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGhwID0gSHlwZXJQYXJzZXIoc2VsZi5lZGl0d2luLCAiaW5zZXJ0LTFjIikKKyAgICAgICAgaWYgbm90IGhwLmlzX2luX2NvZGUoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbmRpY2VzID0gaHAuZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKF9vcGVuZXJzW2Nsb3Nlcl0sIFRydWUpCisgICAgICAgIGlmIGluZGljZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYud2Fybl9taXNtYXRjaGVkKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFjdGl2YXRlX3Jlc3RvcmUoKQorICAgICAgICBzZWxmLmNyZWF0ZV90YWcoaW5kaWNlcykKKyAgICAgICAgc2VsZi5zZXRfdGltZW91dCgpCisKKyAgICBkZWYgcmVzdG9yZV9ldmVudChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi50ZXh0LnRhZ19kZWxldGUoInBhcmVuIikKKyAgICAgICAgc2VsZi5kZWFjdGl2YXRlX3Jlc3RvcmUoKQorICAgICAgICBzZWxmLmNvdW50ZXIgKz0gMSAgICMgZGlzYWJsZSB0aGUgbGFzdCB0aW1lciwgaWYgdGhlcmUgaXMgb25lLgorCisgICAgZGVmIGhhbmRsZV9yZXN0b3JlX3RpbWVyKHNlbGYsIHRpbWVyX2NvdW50KToKKyAgICAgICAgaWYgdGltZXJfY291bnQgPT0gc2VsZi5jb3VudGVyOgorICAgICAgICAgICAgc2VsZi5yZXN0b3JlX2V2ZW50KCkKKworICAgIGRlZiB3YXJuX21pc21hdGNoZWQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuQkVMTDoKKyAgICAgICAgICAgIHNlbGYudGV4dC5iZWxsKCkKKworICAgICMgYW55IG9uZSBvZiB0aGUgY3JlYXRlX3RhZ19YWFggbWV0aG9kcyBjYW4gYmUgdXNlZCBkZXBlbmRpbmcgb24KKyAgICAjIHRoZSBzdHlsZQorCisgICAgZGVmIGNyZWF0ZV90YWdfZGVmYXVsdChzZWxmLCBpbmRpY2VzKToKKyAgICAgICAgIiIiSGlnaGxpZ2h0IHRoZSBzaW5nbGUgcGFyZW4gdGhhdCBtYXRjaGVzIiIiCisgICAgICAgIHNlbGYudGV4dC50YWdfYWRkKCJwYXJlbiIsIGluZGljZXNbMF0pCisgICAgICAgIHNlbGYudGV4dC50YWdfY29uZmlnKCJwYXJlbiIsIHNlbGYuSElMSVRFX0NPTkZJRykKKworICAgIGRlZiBjcmVhdGVfdGFnX2V4cHJlc3Npb24oc2VsZiwgaW5kaWNlcyk6CisgICAgICAgICIiIkhpZ2hsaWdodCB0aGUgZW50aXJlIGV4cHJlc3Npb24iIiIKKyAgICAgICAgaWYgc2VsZi50ZXh0LmdldChpbmRpY2VzWzFdKSBpbiAoJyknLCAnXScsICd9Jyk6CisgICAgICAgICAgICByaWdodGluZGV4ID0gaW5kaWNlc1sxXSsiKzFjIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmlnaHRpbmRleCA9IGluZGljZXNbMV0KKyAgICAgICAgc2VsZi50ZXh0LnRhZ19hZGQoInBhcmVuIiwgaW5kaWNlc1swXSwgcmlnaHRpbmRleCkKKyAgICAgICAgc2VsZi50ZXh0LnRhZ19jb25maWcoInBhcmVuIiwgc2VsZi5ISUxJVEVfQ09ORklHKQorCisgICAgIyBhbnkgb25lIG9mIHRoZSBzZXRfdGltZW91dF9YWFggbWV0aG9kcyBjYW4gYmUgdXNlZCBkZXBlbmRpbmcgb24KKyAgICAjIHRoZSBzdHlsZQorCisgICAgZGVmIHNldF90aW1lb3V0X25vbmUoc2VsZik6CisgICAgICAgICIiIkhpZ2hsaWdodCB3aWxsIHJlbWFpbiB1bnRpbCB1c2VyIGlucHV0IHR1cm5zIGl0IG9mZgorICAgICAgICBvciB0aGUgaW5zZXJ0IGhhcyBtb3ZlZCIiIgorICAgICAgICAjIEFmdGVyIENIRUNLX0RFTEFZLCBjYWxsIGEgZnVuY3Rpb24gd2hpY2ggZGlzYWJsZXMgdGhlICJwYXJlbiIgdGFnCisgICAgICAgICMgaWYgdGhlIGV2ZW50IGlzIGZvciB0aGUgbW9zdCByZWNlbnQgdGltZXIgYW5kIHRoZSBpbnNlcnQgaGFzIGNoYW5nZWQsCisgICAgICAgICMgb3Igc2NoZWR1bGVzIGFub3RoZXIgY2FsbCBmb3IgaXRzZWxmLgorICAgICAgICBzZWxmLmNvdW50ZXIgKz0gMQorICAgICAgICBkZWYgY2FsbG1lKGNhbGxtZSwgc2VsZj1zZWxmLCBjPXNlbGYuY291bnRlciwKKyAgICAgICAgICAgICAgICAgICBpbmRleD1zZWxmLnRleHQuaW5kZXgoImluc2VydCIpKToKKyAgICAgICAgICAgIGlmIGluZGV4ICE9IHNlbGYudGV4dC5pbmRleCgiaW5zZXJ0Iik6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfcmVzdG9yZV90aW1lcihjKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVkaXR3aW4udGV4dF9mcmFtZS5hZnRlcihDSEVDS19ERUxBWSwgY2FsbG1lLCBjYWxsbWUpCisgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmFmdGVyKENIRUNLX0RFTEFZLCBjYWxsbWUsIGNhbGxtZSkKKworICAgIGRlZiBzZXRfdGltZW91dF9sYXN0KHNlbGYpOgorICAgICAgICAiIiJUaGUgbGFzdCBoaWdobGlnaHQgY3JlYXRlZCB3aWxsIGJlIHJlbW92ZWQgYWZ0ZXIgLjUgc2VjIiIiCisgICAgICAgICMgYXNzb2NpYXRlIGEgY291bnRlciB3aXRoIGFuIGV2ZW50OyBvbmx5IGRpc2FibGUgdGhlICJwYXJlbiIKKyAgICAgICAgIyB0YWcgaWYgdGhlIGV2ZW50IGlzIGZvciB0aGUgbW9zdCByZWNlbnQgdGltZXIuCisgICAgICAgIHNlbGYuY291bnRlciArPSAxCisgICAgICAgIHNlbGYuZWRpdHdpbi50ZXh0X2ZyYW1lLmFmdGVyKHNlbGYuRkxBU0hfREVMQVksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSBzZWxmPXNlbGYsIGM9c2VsZi5jb3VudGVyOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3Jlc3RvcmVfdGltZXIoYykpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGFyZW5NYXRjaC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGFyZW5NYXRjaC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyYmVmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QYXJlbk1hdGNoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGFyZW5NYXRjaC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGFyZW5NYXRjaC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEyYmVmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QYXJlbk1hdGNoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4YTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QYXRoQnJvd3Nlci5weQpAQCAtMCwwICsxLDk1IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBpbXAKKworZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVJdGVtCitmcm9tIGlkbGVsaWIuQ2xhc3NCcm93c2VyIGltcG9ydCBDbGFzc0Jyb3dzZXIsIE1vZHVsZUJyb3dzZXJUcmVlSXRlbQorCitjbGFzcyBQYXRoQnJvd3NlcihDbGFzc0Jyb3dzZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0KToKKyAgICAgICAgc2VsZi5pbml0KGZsaXN0KQorCisgICAgZGVmIHNldHRpdGxlKHNlbGYpOgorICAgICAgICBzZWxmLnRvcC53bV90aXRsZSgiUGF0aCBCcm93c2VyIikKKyAgICAgICAgc2VsZi50b3Aud21faWNvbm5hbWUoIlBhdGggQnJvd3NlciIpCisKKyAgICBkZWYgcm9vdG5vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBQYXRoQnJvd3NlclRyZWVJdGVtKCkKKworY2xhc3MgUGF0aEJyb3dzZXJUcmVlSXRlbShUcmVlSXRlbSk6CisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuICJzeXMucGF0aCIKKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIGl0ZW0gPSBEaXJCcm93c2VyVHJlZUl0ZW0oZGlyKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworY2xhc3MgRGlyQnJvd3NlclRyZWVJdGVtKFRyZWVJdGVtKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXIsIHBhY2thZ2VzPVtdKToKKyAgICAgICAgc2VsZi5kaXIgPSBkaXIKKyAgICAgICAgc2VsZi5wYWNrYWdlcyA9IHBhY2thZ2VzCisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhY2thZ2VzWy0xXSArICI6IHBhY2thZ2UiCisKKyAgICBkZWYgR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHNlbGYuZGlyIG9yIG9zLmN1cmRpcikKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHBhY2thZ2VzID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBmaWxlID0gb3MucGF0aC5qb2luKHNlbGYuZGlyLCBuYW1lKQorICAgICAgICAgICAgaWYgc2VsZi5pc3BhY2thZ2VkaXIoZmlsZSk6CisgICAgICAgICAgICAgICAgbm4gPSBvcy5wYXRoLm5vcm1jYXNlKG5hbWUpCisgICAgICAgICAgICAgICAgcGFja2FnZXMuYXBwZW5kKChubiwgbmFtZSwgZmlsZSkpCisgICAgICAgIHBhY2thZ2VzLnNvcnQoKQorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIG5uLCBuYW1lLCBmaWxlIGluIHBhY2thZ2VzOgorICAgICAgICAgICAgaXRlbSA9IERpckJyb3dzZXJUcmVlSXRlbShmaWxlLCBzZWxmLnBhY2thZ2VzICsgW25hbWVdKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgZm9yIG5uLCBuYW1lIGluIHNlbGYubGlzdG1vZHVsZXMobmFtZXMpOgorICAgICAgICAgICAgaXRlbSA9IE1vZHVsZUJyb3dzZXJUcmVlSXRlbShvcy5wYXRoLmpvaW4oc2VsZi5kaXIsIG5hbWUpKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworICAgIGRlZiBpc3BhY2thZ2VkaXIoc2VsZiwgZmlsZSk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGZpbGUpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaW5pdCA9IG9zLnBhdGguam9pbihmaWxlLCAiX19pbml0X18ucHkiKQorICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMoaW5pdCkKKworICAgIGRlZiBsaXN0bW9kdWxlcyhzZWxmLCBhbGxuYW1lcyk6CisgICAgICAgIG1vZHVsZXMgPSB7fQorICAgICAgICBzdWZmaXhlcyA9IGltcC5nZXRfc3VmZml4ZXMoKQorICAgICAgICBzb3J0ZWQgPSBbXQorICAgICAgICBmb3Igc3VmZiwgbW9kZSwgZmxhZyBpbiBzdWZmaXhlczoKKyAgICAgICAgICAgIGkgPSAtbGVuKHN1ZmYpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBhbGxuYW1lc1s6XToKKyAgICAgICAgICAgICAgICBub3JtZWRfbmFtZSA9IG9zLnBhdGgubm9ybWNhc2UobmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3JtZWRfbmFtZVtpOl0gPT0gc3VmZjoKKyAgICAgICAgICAgICAgICAgICAgbW9kX25hbWUgPSBuYW1lWzppXQorICAgICAgICAgICAgICAgICAgICBpZiBtb2RfbmFtZSBub3QgaW4gbW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbbW9kX25hbWVdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkLmFwcGVuZCgobm9ybWVkX25hbWUsIG5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgYWxsbmFtZXMucmVtb3ZlKG5hbWUpCisgICAgICAgIHNvcnRlZC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHNvcnRlZAorCitkZWYgbWFpbigpOgorICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgUHlTaGVsbAorICAgIFBhdGhCcm93c2VyKFB5U2hlbGwuZmxpc3QpCisgICAgaWYgc3lzLnN0ZGluIGlzIHN5cy5fX3N0ZGluX186CisgICAgICAgIG1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9QYXRoQnJvd3Nlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjU2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9QYXRoQnJvd3Nlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNjU2MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGF0aEJyb3dzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9QZXJjb2xhdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1BlcmNvbGF0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0Njg5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QZXJjb2xhdG9yLnB5CkBAIC0wLDAgKzEsODUgQEAKK2Zyb20gaWRsZWxpYi5XaWRnZXRSZWRpcmVjdG9yIGltcG9ydCBXaWRnZXRSZWRpcmVjdG9yCitmcm9tIGlkbGVsaWIuRGVsZWdhdG9yIGltcG9ydCBEZWxlZ2F0b3IKKworY2xhc3MgUGVyY29sYXRvcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0KToKKyAgICAgICAgIyBYWFggd291bGQgYmUgbmljZSB0byBpbmhlcml0IGZyb20gRGVsZWdhdG9yCisgICAgICAgIHNlbGYudGV4dCA9IHRleHQKKyAgICAgICAgc2VsZi5yZWRpciA9IFdpZGdldFJlZGlyZWN0b3IodGV4dCkKKyAgICAgICAgc2VsZi50b3AgPSBzZWxmLmJvdHRvbSA9IERlbGVnYXRvcih0ZXh0KQorICAgICAgICBzZWxmLmJvdHRvbS5pbnNlcnQgPSBzZWxmLnJlZGlyLnJlZ2lzdGVyKCJpbnNlcnQiLCBzZWxmLmluc2VydCkKKyAgICAgICAgc2VsZi5ib3R0b20uZGVsZXRlID0gc2VsZi5yZWRpci5yZWdpc3RlcigiZGVsZXRlIiwgc2VsZi5kZWxldGUpCisgICAgICAgIHNlbGYuZmlsdGVycyA9IFtdCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYudG9wIGlzIG5vdCBzZWxmLmJvdHRvbToKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlZmlsdGVyKHNlbGYudG9wKQorICAgICAgICBzZWxmLnRvcCA9IE5vbmUKKyAgICAgICAgc2VsZi5ib3R0b20uc2V0ZGVsZWdhdGUoTm9uZSk7IHNlbGYuYm90dG9tID0gTm9uZQorICAgICAgICBzZWxmLnJlZGlyLmNsb3NlKCk7IHNlbGYucmVkaXIgPSBOb25lCisgICAgICAgIHNlbGYudGV4dCA9IE5vbmUKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGNoYXJzLCB0YWdzPU5vbmUpOgorICAgICAgICAjIENvdWxkIGdvIGF3YXkgaWYgaW5oZXJpdGluZyBmcm9tIERlbGVnYXRvcgorICAgICAgICBzZWxmLnRvcC5pbnNlcnQoaW5kZXgsIGNoYXJzLCB0YWdzKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgIyBDb3VsZCBnbyBhd2F5IGlmIGluaGVyaXRpbmcgZnJvbSBEZWxlZ2F0b3IKKyAgICAgICAgc2VsZi50b3AuZGVsZXRlKGluZGV4MSwgaW5kZXgyKQorCisgICAgZGVmIGluc2VydGZpbHRlcihzZWxmLCBmaWx0ZXIpOgorICAgICAgICAjIFBlcmhhcHMgcmVuYW1lIHRvIHB1c2hmaWx0ZXIoKT8KKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZmlsdGVyLCBEZWxlZ2F0b3IpCisgICAgICAgIGFzc2VydCBmaWx0ZXIuZGVsZWdhdGUgaXMgTm9uZQorICAgICAgICBmaWx0ZXIuc2V0ZGVsZWdhdGUoc2VsZi50b3ApCisgICAgICAgIHNlbGYudG9wID0gZmlsdGVyCisKKyAgICBkZWYgcmVtb3ZlZmlsdGVyKHNlbGYsIGZpbHRlcik6CisgICAgICAgICMgWFhYIFBlcmhhcHMgc2hvdWxkIG9ubHkgc3VwcG9ydCBwb3BmaWx0ZXIoKT8KKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZmlsdGVyLCBEZWxlZ2F0b3IpCisgICAgICAgIGFzc2VydCBmaWx0ZXIuZGVsZWdhdGUgaXMgbm90IE5vbmUKKyAgICAgICAgZiA9IHNlbGYudG9wCisgICAgICAgIGlmIGYgaXMgZmlsdGVyOgorICAgICAgICAgICAgc2VsZi50b3AgPSBmaWx0ZXIuZGVsZWdhdGUKKyAgICAgICAgICAgIGZpbHRlci5zZXRkZWxlZ2F0ZShOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2hpbGUgZi5kZWxlZ2F0ZSBpcyBub3QgZmlsdGVyOgorICAgICAgICAgICAgICAgIGFzc2VydCBmIGlzIG5vdCBzZWxmLmJvdHRvbQorICAgICAgICAgICAgICAgIGYucmVzZXRjYWNoZSgpCisgICAgICAgICAgICAgICAgZiA9IGYuZGVsZWdhdGUKKyAgICAgICAgICAgIGYuc2V0ZGVsZWdhdGUoZmlsdGVyLmRlbGVnYXRlKQorICAgICAgICAgICAgZmlsdGVyLnNldGRlbGVnYXRlKE5vbmUpCisKKworZGVmIG1haW4oKToKKyAgICBjbGFzcyBUcmFjZXIoRGVsZWdhdG9yKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICAgICAgRGVsZWdhdG9yLl9faW5pdF9fKHNlbGYsIE5vbmUpCisgICAgICAgIGRlZiBpbnNlcnQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAiOiBpbnNlcnQiLCBhcmdzCisgICAgICAgICAgICBzZWxmLmRlbGVnYXRlLmluc2VydCgqYXJncykKKyAgICAgICAgZGVmIGRlbGV0ZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBwcmludCBzZWxmLm5hbWUsICI6IGRlbGV0ZSIsIGFyZ3MKKyAgICAgICAgICAgIHNlbGYuZGVsZWdhdGUuZGVsZXRlKCphcmdzKQorICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC53bV9wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHJvb3QucXVpdCkKKyAgICB0ZXh0ID0gVGV4dCgpCisgICAgdGV4dC5wYWNrKCkKKyAgICB0ZXh0LmZvY3VzX3NldCgpCisgICAgcCA9IFBlcmNvbGF0b3IodGV4dCkKKyAgICB0MSA9IFRyYWNlcigidDEiKQorICAgIHQyID0gVHJhY2VyKCJ0MiIpCisgICAgcC5pbnNlcnRmaWx0ZXIodDEpCisgICAgcC5pbnNlcnRmaWx0ZXIodDIpCisgICAgcm9vdC5tYWlubG9vcCgpCisgICAgcC5yZW1vdmVmaWx0ZXIodDIpCisgICAgcm9vdC5tYWlubG9vcCgpCisgICAgcC5pbnNlcnRmaWx0ZXIodDIpCisgICAgcC5yZW1vdmVmaWx0ZXIodDEpCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZnJvbSBUa2ludGVyIGltcG9ydCAqCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjZGFhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QZXJjb2xhdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUGVyY29sYXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlZDJiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QZXJjb2xhdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlQYXJzZS5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVBhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOWRiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlQYXJzZS5weQpAQCAtMCwwICsxLDU5NCBAQAoraW1wb3J0IHJlCitpbXBvcnQgc3lzCisKKyMgUmVhc29uIGxhc3Qgc3RtdCBpcyBjb250aW51ZWQgKG9yIENfTk9ORSBpZiBpdCdzIG5vdCkuCisoQ19OT05FLCBDX0JBQ0tTTEFTSCwgQ19TVFJJTkdfRklSU1RfTElORSwKKyBDX1NUUklOR19ORVhUX0xJTkVTLCBDX0JSQUNLRVQpID0gcmFuZ2UoNSkKKworaWYgMDogICAjIGZvciB0aHJvd2F3YXkgZGVidWdnaW5nIG91dHB1dAorICAgIGRlZiBkdW1wKCpzdHVmZik6CisgICAgICAgIHN5cy5fX3N0ZG91dF9fLndyaXRlKCIgIi5qb2luKG1hcChzdHIsIHN0dWZmKSkgKyAiXG4iKQorCisjIEZpbmQgd2hhdCBsb29rcyBsaWtlIHRoZSBzdGFydCBvZiBhIHBvcHVsYXIgc3RtdC4KKworX3N5bmNocmUgPSByZS5jb21waWxlKHIiIiIKKyAgICBeCisgICAgWyBcdF0qCisgICAgKD86IHdoaWxlCisgICAgfCAgIGVsc2UKKyAgICB8ICAgZGVmCisgICAgfCAgIHJldHVybgorICAgIHwgICBhc3NlcnQKKyAgICB8ICAgYnJlYWsKKyAgICB8ICAgY2xhc3MKKyAgICB8ICAgY29udGludWUKKyAgICB8ICAgZWxpZgorICAgIHwgICB0cnkKKyAgICB8ICAgZXhjZXB0CisgICAgfCAgIHJhaXNlCisgICAgfCAgIGltcG9ydAorICAgIHwgICB5aWVsZAorICAgICkKKyAgICBcYgorIiIiLCByZS5WRVJCT1NFIHwgcmUuTVVMVElMSU5FKS5zZWFyY2gKKworIyBNYXRjaCBibGFuayBsaW5lIG9yIG5vbi1pbmRlbnRpbmcgY29tbWVudCBsaW5lLgorCitfanVua3JlID0gcmUuY29tcGlsZShyIiIiCisgICAgWyBcdF0qCisgICAgKD86IFwjIFxTIC4qICk/CisgICAgXG4KKyIiIiwgcmUuVkVSQk9TRSkubWF0Y2gKKworIyBNYXRjaCBhbnkgZmxhdm9yIG9mIHN0cmluZzsgdGhlIHRlcm1pbmF0aW5nIHF1b3RlIGlzIG9wdGlvbmFsCisjIHNvIHRoYXQgd2UncmUgcm9idXN0IGluIHRoZSBmYWNlIG9mIGluY29tcGxldGUgcHJvZ3JhbSB0ZXh0LgorCitfbWF0Y2hfc3RyaW5ncmUgPSByZS5jb21waWxlKHIiIiIKKyAgICBcIiIiIFteIlxcXSogKD86CisgICAgICAgICAgICAgICAgICAgICAoPzogXFwuIHwgIig/ISIiKSApCisgICAgICAgICAgICAgICAgICAgICBbXiJcXF0qCisgICAgICAgICAgICAgICAgICkqCisgICAgKD86IFwiIiIgKT8KKworfCAgICIgW14iXFxcbl0qICg/OiBcXC4gW14iXFxcbl0qICkqICI/CisKK3wgICAnJycgW14nXFxdKiAoPzoKKyAgICAgICAgICAgICAgICAgICAoPzogXFwuIHwgJyg/IScnKSApCisgICAgICAgICAgICAgICAgICAgW14nXFxdKgorICAgICAgICAgICAgICAgICkqCisgICAgKD86ICcnJyApPworCit8ICAgJyBbXidcXFxuXSogKD86IFxcLiBbXidcXFxuXSogKSogJz8KKyIiIiwgcmUuVkVSQk9TRSB8IHJlLkRPVEFMTCkubWF0Y2gKKworIyBNYXRjaCBhIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBzb21ldGhpbmcgaW50ZXJlc3Rpbmc7CisjIHVzZWQgdG8gZmluZCB0aGUgZmlyc3QgaXRlbSBvZiBhIGJyYWNrZXQgc3RydWN0dXJlLgorCitfaXRlbXJlID0gcmUuY29tcGlsZShyIiIiCisgICAgWyBcdF0qCisgICAgW15ccyNcXF0gICAgIyBpZiB3ZSBtYXRjaCwgbS5lbmQoKS0xIGlzIHRoZSBpbnRlcmVzdGluZyBjaGFyCisiIiIsIHJlLlZFUkJPU0UpLm1hdGNoCisKKyMgTWF0Y2ggc3RhcnQgb2Ygc3RtdHMgdGhhdCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgYSBkZWRlbnQuCisKK19jbG9zZXJlID0gcmUuY29tcGlsZShyIiIiCisgICAgXHMqCisgICAgKD86IHJldHVybgorICAgIHwgICBicmVhaworICAgIHwgICBjb250aW51ZQorICAgIHwgICByYWlzZQorICAgIHwgICBwYXNzCisgICAgKQorICAgIFxiCisiIiIsIHJlLlZFUkJPU0UpLm1hdGNoCisKKyMgQ2hldyB1cCBub24tc3BlY2lhbCBjaGFycyBhcyBxdWlja2x5IGFzIHBvc3NpYmxlLiAgSWYgbWF0Y2ggaXMKKyMgc3VjY2Vzc2Z1bCwgbS5lbmQoKSBsZXNzIDEgaXMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGJvcmluZyBjaGFyCisjIG1hdGNoZWQuICBJZiBtYXRjaCBpcyB1bnN1Y2Nlc3NmdWwsIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYW4KKyMgaW50ZXJlc3RpbmcgY2hhci4KKworX2NoZXdfb3JkaW5hcnlyZSA9IHJlLmNvbXBpbGUociIiIgorICAgIFteW1xdKCl7fSMnIlxcXSsKKyIiIiwgcmUuVkVSQk9TRSkubWF0Y2gKKworIyBCdWlsZCB0cmFuc2xhdGlvbiB0YWJsZSB0byBtYXAgdW5pbnRlcmVzdGluZyBjaGFycyB0byAieCIsIG9wZW4KKyMgYnJhY2tldHMgdG8gIigiLCBhbmQgY2xvc2UgYnJhY2tldHMgdG8gIikiLgorCitfdHJhbiA9IFsneCddICogMjU2Citmb3IgY2ggaW4gIih7WyI6CisgICAgX3RyYW5bb3JkKGNoKV0gPSAnKCcKK2ZvciBjaCBpbiAiKX1dIjoKKyAgICBfdHJhbltvcmQoY2gpXSA9ICcpJworZm9yIGNoIGluICJcIidcXFxuIyI6CisgICAgX3RyYW5bb3JkKGNoKV0gPSBjaAorX3RyYW4gPSAnJy5qb2luKF90cmFuKQorZGVsIGNoCisKK3RyeToKKyAgICBVbmljb2RlVHlwZSA9IHR5cGUodW5pY29kZSgiIikpCitleGNlcHQgTmFtZUVycm9yOgorICAgIFVuaWNvZGVUeXBlID0gTm9uZQorCitjbGFzcyBQYXJzZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZW50d2lkdGgsIHRhYndpZHRoKToKKyAgICAgICAgc2VsZi5pbmRlbnR3aWR0aCA9IGluZGVudHdpZHRoCisgICAgICAgIHNlbGYudGFid2lkdGggPSB0YWJ3aWR0aAorCisgICAgZGVmIHNldF9zdHIoc2VsZiwgc3RyKToKKyAgICAgICAgYXNzZXJ0IGxlbihzdHIpID09IDAgb3Igc3RyWy0xXSA9PSAnXG4nCisgICAgICAgIGlmIHR5cGUoc3RyKSBpcyBVbmljb2RlVHlwZToKKyAgICAgICAgICAgICMgVGhlIHBhcnNlIGZ1bmN0aW9ucyBoYXZlIG5vIGlkZWEgd2hhdCB0byBkbyB3aXRoIFVuaWNvZGUsIHNvCisgICAgICAgICAgICAjIHJlcGxhY2UgYWxsIFVuaWNvZGUgY2hhcmFjdGVycyB3aXRoICJ4Ii4gIFRoaXMgaXMgInNhZmUiCisgICAgICAgICAgICAjIHNvIGxvbmcgYXMgdGhlIG9ubHkgY2hhcmFjdGVycyBnZXJtYW5lIHRvIHBhcnNpbmcgdGhlIHN0cnVjdHVyZQorICAgICAgICAgICAgIyBvZiBQeXRob24gYXJlIDctYml0IEFTQ0lJLiAgSXQncyAqbmVjZXNzYXJ5KiBiZWNhdXNlIFVuaWNvZGUKKyAgICAgICAgICAgICMgc3RyaW5ncyBkb24ndCBoYXZlIGEgLnRyYW5zbGF0ZSgpIG1ldGhvZCB0aGF0IHN1cHBvcnRzCisgICAgICAgICAgICAjIGRlbGV0ZWNoYXJzLgorICAgICAgICAgICAgdW5pcGhvb2V5ID0gc3RyCisgICAgICAgICAgICBzdHIgPSBbXQorICAgICAgICAgICAgcHVzaCA9IHN0ci5hcHBlbmQKKyAgICAgICAgICAgIGZvciByYXcgaW4gbWFwKG9yZCwgdW5pcGhvb2V5KToKKyAgICAgICAgICAgICAgICBwdXNoKHJhdyA8IDEyNyBhbmQgY2hyKHJhdykgb3IgIngiKQorICAgICAgICAgICAgc3RyID0gIiIuam9pbihzdHIpCisgICAgICAgIHNlbGYuc3RyID0gc3RyCisgICAgICAgIHNlbGYuc3R1ZHlfbGV2ZWwgPSAwCisKKyAgICAjIFJldHVybiBpbmRleCBvZiBhIGdvb2QgcGxhY2UgdG8gYmVnaW4gcGFyc2luZywgYXMgY2xvc2UgdG8gdGhlCisgICAgIyBlbmQgb2YgdGhlIHN0cmluZyBhcyBwb3NzaWJsZS4gIFRoaXMgd2lsbCBiZSB0aGUgc3RhcnQgb2Ygc29tZQorICAgICMgcG9wdWxhciBzdG10IGxpa2UgImlmIiBvciAiZGVmIi4gIFJldHVybiBOb25lIGlmIG5vbmUgZm91bmQ6CisgICAgIyB0aGUgY2FsbGVyIHNob3VsZCBwYXNzIG1vcmUgcHJpb3IgY29udGV4dCB0aGVuLCBpZiBwb3NzaWJsZSwgb3IKKyAgICAjIGlmIG5vdCAodGhlIGVudGlyZSBwcm9ncmFtIHRleHQgdXAgdW50aWwgdGhlIHBvaW50IG9mIGludGVyZXN0CisgICAgIyBoYXMgYWxyZWFkeSBiZWVuIHRyaWVkKSBwYXNzIDAgdG8gc2V0X2xvLgorICAgICMKKyAgICAjIFRoaXMgd2lsbCBiZSByZWxpYWJsZSBpZmYgZ2l2ZW4gYSByZWxpYWJsZSBpc19jaGFyX2luX3N0cmluZworICAgICMgZnVuY3Rpb24sIG1lYW5pbmcgdGhhdCB3aGVuIGl0IHNheXMgIm5vIiwgaXQncyBhYnNvbHV0ZWx5CisgICAgIyBndWFyYW50ZWVkIHRoYXQgdGhlIGNoYXIgaXMgbm90IGluIGEgc3RyaW5nLgorCisgICAgZGVmIGZpbmRfZ29vZF9wYXJzZV9zdGFydChzZWxmLCBpc19jaGFyX2luX3N0cmluZz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N5bmNocmU9X3N5bmNocmUpOgorICAgICAgICBzdHIsIHBvcyA9IHNlbGYuc3RyLCBOb25lCisKKyAgICAgICAgaWYgbm90IGlzX2NoYXJfaW5fc3RyaW5nOgorICAgICAgICAgICAgIyBubyBjbHVlIC0tIG1ha2UgdGhlIGNhbGxlciBwYXNzIGV2ZXJ5dGhpbmcKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBQZWVrIGJhY2sgZnJvbSB0aGUgZW5kIGZvciBhIGdvb2QgcGxhY2UgdG8gc3RhcnQsCisgICAgICAgICMgYnV0IGRvbid0IHRyeSB0b28gb2Z0ZW47IHBvcyB3aWxsIGJlIGxlZnQgTm9uZSwgb3IKKyAgICAgICAgIyBidW1wZWQgdG8gYSBsZWdpdGltYXRlIHN5bmNoIHBvaW50LgorICAgICAgICBsaW1pdCA9IGxlbihzdHIpCisgICAgICAgIGZvciB0cmllcyBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGkgPSBzdHIucmZpbmQoIjpcbiIsIDAsIGxpbWl0KQorICAgICAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGkgPSBzdHIucmZpbmQoJ1xuJywgMCwgaSkgKyAxICAjIHN0YXJ0IG9mIGNvbG9uIGxpbmUKKyAgICAgICAgICAgIG0gPSBfc3luY2hyZShzdHIsIGksIGxpbWl0KQorICAgICAgICAgICAgaWYgbSBhbmQgbm90IGlzX2NoYXJfaW5fc3RyaW5nKG0uc3RhcnQoKSk6CisgICAgICAgICAgICAgICAgcG9zID0gbS5zdGFydCgpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxpbWl0ID0gaQorICAgICAgICBpZiBwb3MgaXMgTm9uZToKKyAgICAgICAgICAgICMgTm90aGluZyBsb29rcyBsaWtlIGEgYmxvY2stb3BlbmVyLCBvciBzdHVmZiBkb2VzCisgICAgICAgICAgICAjIGJ1dCBpc19jaGFyX2luX3N0cmluZyBrZWVwcyByZXR1cm5pbmcgdHJ1ZTsgbW9zdCBsaWtlbHkKKyAgICAgICAgICAgICMgd2UncmUgaW4gb3IgbmVhciBhIGdpYW50IHN0cmluZywgdGhlIGNvbG9yaXplciBoYXNuJ3QKKyAgICAgICAgICAgICMgY2F1Z2h0IHVwIGVub3VnaCB0byBiZSBoZWxwZnVsLCBvciB0aGVyZSBzaW1wbHkgKmFyZW4ndCoKKyAgICAgICAgICAgICMgYW55IGludGVyZXN0aW5nIHN0bXRzLiAgSW4gYW55IG9mIHRoZXNlIGNhc2VzIHdlJ3JlCisgICAgICAgICAgICAjIGdvaW5nIHRvIGhhdmUgdG8gcGFyc2UgdGhlIHdob2xlIHRoaW5nIHRvIGJlIHN1cmUsIHNvCisgICAgICAgICAgICAjIGdpdmUgaXQgb25lIGxhc3QgdHJ5IGZyb20gdGhlIHN0YXJ0LCBidXQgc3RvcCB3YXN0aW5nCisgICAgICAgICAgICAjIHRpbWUgaGVyZSByZWdhcmRsZXNzIG9mIHRoZSBvdXRjb21lLgorICAgICAgICAgICAgbSA9IF9zeW5jaHJlKHN0cikKKyAgICAgICAgICAgIGlmIG0gYW5kIG5vdCBpc19jaGFyX2luX3N0cmluZyhtLnN0YXJ0KCkpOgorICAgICAgICAgICAgICAgIHBvcyA9IG0uc3RhcnQoKQorICAgICAgICAgICAgcmV0dXJuIHBvcworCisgICAgICAgICMgUGVla2luZyBiYWNrIHdvcmtlZDsgbG9vayBmb3J3YXJkIHVudGlsIF9zeW5jaHJlIG5vIGxvbmdlcgorICAgICAgICAjIG1hdGNoZXMuCisgICAgICAgIGkgPSBwb3MgKyAxCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBtID0gX3N5bmNocmUoc3RyLCBpKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBzLCBpID0gbS5zcGFuKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNfY2hhcl9pbl9zdHJpbmcocyk6CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IHMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIHBvcworCisgICAgIyBUaHJvdyBhd2F5IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLiAgSW50ZW5kZWQgdG8gYmUgY2FsbGVkIHdpdGgKKyAgICAjIGZpbmRfZ29vZF9wYXJzZV9zdGFydCdzIHJlc3VsdC4KKworICAgIGRlZiBzZXRfbG8oc2VsZiwgbG8pOgorICAgICAgICBhc3NlcnQgbG8gPT0gMCBvciBzZWxmLnN0cltsby0xXSA9PSAnXG4nCisgICAgICAgIGlmIGxvID4gMDoKKyAgICAgICAgICAgIHNlbGYuc3RyID0gc2VsZi5zdHJbbG86XQorCisgICAgIyBBcyBxdWlja2x5IGFzIGh1bWFubHkgcG9zc2libGUgPHdpbms+LCBmaW5kIHRoZSBsaW5lIG51bWJlcnMgKDAtCisgICAgIyBiYXNlZCkgb2YgdGhlIG5vbi1jb250aW51YXRpb24gbGluZXMuCisgICAgIyBDcmVhdGVzIHNlbGYue2dvb2RsaW5lcywgY29udGludWF0aW9ufS4KKworICAgIGRlZiBfc3R1ZHkxKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnN0dWR5X2xldmVsID49IDE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5zdHVkeV9sZXZlbCA9IDEKKworICAgICAgICAjIE1hcCBhbGwgdW5pbnRlcmVzdGluZyBjaGFyYWN0ZXJzIHRvICJ4IiwgYWxsIG9wZW4gYnJhY2tldHMKKyAgICAgICAgIyB0byAiKCIsIGFsbCBjbG9zZSBicmFja2V0cyB0byAiKSIsIHRoZW4gY29sbGFwc2UgcnVucyBvZgorICAgICAgICAjIHVuaW50ZXJlc3RpbmcgY2hhcmFjdGVycy4gIFRoaXMgY2FuIGN1dCB0aGUgbnVtYmVyIG9mIGNoYXJzCisgICAgICAgICMgYnkgYSBmYWN0b3Igb2YgMTAtNDAsIGFuZCBzbyBncmVhdGx5IHNwZWVkIHRoZSBmb2xsb3dpbmcgbG9vcC4KKyAgICAgICAgc3RyID0gc2VsZi5zdHIKKyAgICAgICAgc3RyID0gc3RyLnRyYW5zbGF0ZShfdHJhbikKKyAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoJ3h4eHh4eHh4JywgJ3gnKQorICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgneHh4eCcsICd4JykKKyAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoJ3h4JywgJ3gnKQorICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgneHgnLCAneCcpCisgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKCdcbngnLCAnXG4nKQorICAgICAgICAjIG5vdGUgdGhhdCByZXBsYWNpbmcgeFxuIHdpdGggXG4gd291bGQgYmUgaW5jb3JyZWN0LCBiZWNhdXNlCisgICAgICAgICMgeCBtYXkgYmUgcHJlY2VkZWQgYnkgYSBiYWNrc2xhc2gKKworICAgICAgICAjIE1hcmNoIG92ZXIgdGhlIHNxdWFzaGVkIHZlcnNpb24gb2YgdGhlIHByb2dyYW0sIGFjY3VtdWxhdGluZworICAgICAgICAjIHRoZSBsaW5lIG51bWJlcnMgb2Ygbm9uLWNvbnRpbnVlZCBzdG10cywgYW5kIGRldGVybWluaW5nCisgICAgICAgICMgd2hldGhlciAmIHdoeSB0aGUgbGFzdCBzdG10IGlzIGEgY29udGludWF0aW9uLgorICAgICAgICBjb250aW51YXRpb24gPSBDX05PTkUKKyAgICAgICAgbGV2ZWwgPSBsbm8gPSAwICAgICAjIGxldmVsIGlzIG5lc3RpbmcgbGV2ZWw7IGxubyBpcyBsaW5lIG51bWJlcgorICAgICAgICBzZWxmLmdvb2RsaW5lcyA9IGdvb2RsaW5lcyA9IFswXQorICAgICAgICBwdXNoX2dvb2QgPSBnb29kbGluZXMuYXBwZW5kCisgICAgICAgIGksIG4gPSAwLCBsZW4oc3RyKQorICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgIGNoID0gc3RyW2ldCisgICAgICAgICAgICBpID0gaSsxCisKKyAgICAgICAgICAgICMgY2FzZXMgYXJlIGNoZWNrZWQgaW4gZGVjcmVhc2luZyBvcmRlciBvZiBmcmVxdWVuY3kKKyAgICAgICAgICAgIGlmIGNoID09ICd4JzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjaCA9PSAnXG4nOgorICAgICAgICAgICAgICAgIGxubyA9IGxubyArIDEKKyAgICAgICAgICAgICAgICBpZiBsZXZlbCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBwdXNoX2dvb2QobG5vKQorICAgICAgICAgICAgICAgICAgICAjIGVsc2Ugd2UncmUgaW4gYW4gdW5jbG9zZWQgYnJhY2tldCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjaCA9PSAnKCc6CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCArIDEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjaCA9PSAnKSc6CisgICAgICAgICAgICAgICAgaWYgbGV2ZWw6CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgLSAxCisgICAgICAgICAgICAgICAgICAgICMgZWxzZSB0aGUgcHJvZ3JhbSBpcyBpbnZhbGlkLCBidXQgd2UgY2FuJ3QgY29tcGxhaW4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjaCA9PSAnIicgb3IgY2ggPT0gIiciOgorICAgICAgICAgICAgICAgICMgY29uc3VtZSB0aGUgc3RyaW5nCisgICAgICAgICAgICAgICAgcXVvdGUgPSBjaAorICAgICAgICAgICAgICAgIGlmIHN0cltpLTE6aSsyXSA9PSBxdW90ZSAqIDM6CisgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gcXVvdGUgKiAzCisgICAgICAgICAgICAgICAgZmlyc3Rsbm8gPSBsbm8KKyAgICAgICAgICAgICAgICB3ID0gbGVuKHF1b3RlKSAtIDEKKyAgICAgICAgICAgICAgICBpID0gaSt3CisgICAgICAgICAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICAgICAgICAgIGNoID0gc3RyW2ldCisgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKworICAgICAgICAgICAgICAgICAgICBpZiBjaCA9PSAneCc6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgIGlmIHN0cltpLTE6aSt3XSA9PSBxdW90ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpK3cKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxubyA9IGxubyArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHcgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVudGVybWluYXRlZCBzaW5nbGUtcXVvdGVkIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldmVsID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfZ29vZChsbm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgaWYgY2ggPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBpIDwgbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3RyW2ldID09ICdcbic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5vID0gbG5vICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICAjIGVsc2UgY29tbWVudCBjaGFyIG9yIHBhcmVuIGluc2lkZSBzdHJpbmcKKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgZGlkbid0IGJyZWFrIG91dCBvZiB0aGUgbG9vcCwgc28gd2UncmUgc3RpbGwKKyAgICAgICAgICAgICAgICAgICAgIyBpbnNpZGUgYSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxubyAtIDEpID09IGZpcnN0bG5vOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBiZWZvcmUgdGhlIHByZXZpb3VzIFxuIGluIHN0ciwgd2Ugd2VyZSBpbiB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbGluZSBvZiB0aGUgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb24gPSBDX1NUUklOR19GSVJTVF9MSU5FCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb24gPSBDX1NUUklOR19ORVhUX0xJTkVTCisgICAgICAgICAgICAgICAgY29udGludWUgICAgIyB3aXRoIG91dGVyIGxvb3AKKworICAgICAgICAgICAgaWYgY2ggPT0gJyMnOgorICAgICAgICAgICAgICAgICMgY29uc3VtZSB0aGUgY29tbWVudAorICAgICAgICAgICAgICAgIGkgPSBzdHIuZmluZCgnXG4nLCBpKQorICAgICAgICAgICAgICAgIGFzc2VydCBpID49IDAKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBhc3NlcnQgY2ggPT0gJ1xcJworICAgICAgICAgICAgYXNzZXJ0IGkgPCBuCisgICAgICAgICAgICBpZiBzdHJbaV0gPT0gJ1xuJzoKKyAgICAgICAgICAgICAgICBsbm8gPSBsbm8gKyAxCisgICAgICAgICAgICAgICAgaWYgaSsxID09IG46CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbiA9IENfQkFDS1NMQVNICisgICAgICAgICAgICBpID0gaSsxCisKKyAgICAgICAgIyBUaGUgbGFzdCBzdG10IG1heSBiZSBjb250aW51ZWQgZm9yIGFsbCAzIHJlYXNvbnMuCisgICAgICAgICMgU3RyaW5nIGNvbnRpbnVhdGlvbiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYnJhY2tldAorICAgICAgICAjIGNvbnRpbnVhdGlvbiwgd2hpY2ggYmVhdHMgYmFja3NsYXNoIGNvbnRpbnVhdGlvbi4KKyAgICAgICAgaWYgKGNvbnRpbnVhdGlvbiAhPSBDX1NUUklOR19GSVJTVF9MSU5FCisgICAgICAgICAgICBhbmQgY29udGludWF0aW9uICE9IENfU1RSSU5HX05FWFRfTElORVMgYW5kIGxldmVsID4gMCk6CisgICAgICAgICAgICBjb250aW51YXRpb24gPSBDX0JSQUNLRVQKKyAgICAgICAgc2VsZi5jb250aW51YXRpb24gPSBjb250aW51YXRpb24KKworICAgICAgICAjIFB1c2ggdGhlIGZpbmFsIGxpbmUgbnVtYmVyIGFzIGEgc2VudGluZWwgdmFsdWUsIHJlZ2FyZGxlc3Mgb2YKKyAgICAgICAgIyB3aGV0aGVyIGl0J3MgY29udGludWVkLgorICAgICAgICBhc3NlcnQgKGNvbnRpbnVhdGlvbiA9PSBDX05PTkUpID09IChnb29kbGluZXNbLTFdID09IGxubykKKyAgICAgICAgaWYgZ29vZGxpbmVzWy0xXSAhPSBsbm86CisgICAgICAgICAgICBwdXNoX2dvb2QobG5vKQorCisgICAgZGVmIGdldF9jb250aW51YXRpb25fdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5fc3R1ZHkxKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY29udGludWF0aW9uCisKKyAgICAjIHN0dWR5MSB3YXMgc3VmZmljaWVudCB0byBkZXRlcm1pbmUgdGhlIGNvbnRpbnVhdGlvbiBzdGF0dXMsCisgICAgIyBidXQgZG9pbmcgbW9yZSByZXF1aXJlcyBsb29raW5nIGF0IGV2ZXJ5IGNoYXJhY3Rlci4gIHN0dWR5MgorICAgICMgZG9lcyB0aGlzIGZvciB0aGUgbGFzdCBpbnRlcmVzdGluZyBzdGF0ZW1lbnQgaW4gdGhlIGJsb2NrLgorICAgICMgQ3JlYXRlczoKKyAgICAjICAgICBzZWxmLnN0bXRfc3RhcnQsIHN0bXRfZW5kCisgICAgIyAgICAgICAgIHNsaWNlIGluZGljZXMgb2YgbGFzdCBpbnRlcmVzdGluZyBzdG10CisgICAgIyAgICAgc2VsZi5zdG10X2JyYWNrZXRpbmcKKyAgICAjICAgICAgICAgdGhlIGJyYWNrZXRpbmcgc3RydWN0dXJlIG9mIHRoZSBsYXN0IGludGVyZXN0aW5nIHN0bXQ7CisgICAgIyAgICAgICAgIGZvciBleGFtcGxlLCBmb3IgdGhlIHN0YXRlbWVudCAic2F5KGJvbykgb3IgZGllIiwgc3RtdF9icmFja2V0aW5nCisgICAgIyAgICAgICAgIHdpbGwgYmUgWygwLCAwKSwgKDMsIDEpLCAoOCwgMCldLiBTdHJpbmdzIGFuZCBjb21tZW50cyBhcmUKKyAgICAjICAgICAgICAgdHJlYXRlZCBhcyBicmFja2V0cywgZm9yIHRoZSBtYXR0ZXIuCisgICAgIyAgICAgc2VsZi5sYXN0Y2gKKyAgICAjICAgICAgICAgbGFzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgYmVmb3JlIG9wdGlvbmFsIHRyYWlsaW5nCisgICAgIyAgICAgICAgIGNvbW1lbnQKKyAgICAjICAgICBzZWxmLmxhc3RvcGVuYnJhY2tldHBvcworICAgICMgICAgICAgICBpZiBjb250aW51YXRpb24gaXMgQ19CUkFDS0VULCBpbmRleCBvZiBsYXN0IG9wZW4gYnJhY2tldAorCisgICAgZGVmIF9zdHVkeTIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3R1ZHlfbGV2ZWwgPj0gMjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9zdHVkeTEoKQorICAgICAgICBzZWxmLnN0dWR5X2xldmVsID0gMgorCisgICAgICAgICMgU2V0IHAgYW5kIHEgdG8gc2xpY2UgaW5kaWNlcyBvZiBsYXN0IGludGVyZXN0aW5nIHN0bXQuCisgICAgICAgIHN0ciwgZ29vZGxpbmVzID0gc2VsZi5zdHIsIHNlbGYuZ29vZGxpbmVzCisgICAgICAgIGkgPSBsZW4oZ29vZGxpbmVzKSAtIDEKKyAgICAgICAgcCA9IGxlbihzdHIpICAgICMgaW5kZXggb2YgbmV3ZXN0IGxpbmUKKyAgICAgICAgd2hpbGUgaToKKyAgICAgICAgICAgIGFzc2VydCBwCisgICAgICAgICAgICAjIHAgaXMgdGhlIGluZGV4IG9mIHRoZSBzdG10IGF0IGxpbmUgbnVtYmVyIGdvb2RsaW5lc1tpXS4KKyAgICAgICAgICAgICMgTW92ZSBwIGJhY2sgdG8gdGhlIHN0bXQgYXQgbGluZSBudW1iZXIgZ29vZGxpbmVzW2ktMV0uCisgICAgICAgICAgICBxID0gcAorICAgICAgICAgICAgZm9yIG5vdGhpbmcgaW4gcmFuZ2UoZ29vZGxpbmVzW2ktMV0sIGdvb2RsaW5lc1tpXSk6CisgICAgICAgICAgICAgICAgIyB0cmlja3k6IHNldHMgcCB0byAwIGlmIG5vIHByZWNlZGluZyBuZXdsaW5lCisgICAgICAgICAgICAgICAgcCA9IHN0ci5yZmluZCgnXG4nLCAwLCBwLTEpICsgMQorICAgICAgICAgICAgIyBUaGUgc3RtdCBzdHJbcDpxXSBpc24ndCBhIGNvbnRpbnVhdGlvbiwgYnV0IG1heSBiZSBibGFuaworICAgICAgICAgICAgIyBvciBhIG5vbi1pbmRlbnRpbmcgY29tbWVudCBsaW5lLgorICAgICAgICAgICAgaWYgIF9qdW5rcmUoc3RyLCBwKToKKyAgICAgICAgICAgICAgICBpID0gaS0xCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGkgPT0gMDoKKyAgICAgICAgICAgICMgbm90aGluZyBidXQganVuayEKKyAgICAgICAgICAgIGFzc2VydCBwID09IDAKKyAgICAgICAgICAgIHEgPSBwCisgICAgICAgIHNlbGYuc3RtdF9zdGFydCwgc2VsZi5zdG10X2VuZCA9IHAsIHEKKworICAgICAgICAjIEFuYWx5emUgdGhpcyBzdG10LCB0byBmaW5kIHRoZSBsYXN0IG9wZW4gYnJhY2tldCAoaWYgYW55KQorICAgICAgICAjIGFuZCBsYXN0IGludGVyZXN0aW5nIGNoYXJhY3RlciAoaWYgYW55KS4KKyAgICAgICAgbGFzdGNoID0gIiIKKyAgICAgICAgc3RhY2sgPSBbXSAgIyBzdGFjayBvZiBvcGVuIGJyYWNrZXQgaW5kaWNlcworICAgICAgICBwdXNoX3N0YWNrID0gc3RhY2suYXBwZW5kCisgICAgICAgIGJyYWNrZXRpbmcgPSBbKHAsIDApXQorICAgICAgICB3aGlsZSBwIDwgcToKKyAgICAgICAgICAgICMgc3VjayB1cCBhbGwgZXhjZXB0ICgpW117fSciI1xcCisgICAgICAgICAgICBtID0gX2NoZXdfb3JkaW5hcnlyZShzdHIsIHAsIHEpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICMgd2Ugc2tpcHBlZCBhdCBsZWFzdCBvbmUgYm9yaW5nIGNoYXIKKyAgICAgICAgICAgICAgICBuZXdwID0gbS5lbmQoKQorICAgICAgICAgICAgICAgICMgYmFjayB1cCBvdmVyIHRvdGFsbHkgYm9yaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICBpID0gbmV3cCAtIDEgICAgIyBpbmRleCBvZiBsYXN0IGJvcmluZyBjaGFyCisgICAgICAgICAgICAgICAgd2hpbGUgaSA+PSBwIGFuZCBzdHJbaV0gaW4gIiBcdFxuIjoKKyAgICAgICAgICAgICAgICAgICAgaSA9IGktMQorICAgICAgICAgICAgICAgIGlmIGkgPj0gcDoKKyAgICAgICAgICAgICAgICAgICAgbGFzdGNoID0gc3RyW2ldCisgICAgICAgICAgICAgICAgcCA9IG5ld3AKKyAgICAgICAgICAgICAgICBpZiBwID49IHE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGNoID0gc3RyW3BdCisKKyAgICAgICAgICAgIGlmIGNoIGluICIoW3siOgorICAgICAgICAgICAgICAgIHB1c2hfc3RhY2socCkKKyAgICAgICAgICAgICAgICBicmFja2V0aW5nLmFwcGVuZCgocCwgbGVuKHN0YWNrKSkpCisgICAgICAgICAgICAgICAgbGFzdGNoID0gY2gKKyAgICAgICAgICAgICAgICBwID0gcCsxCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY2ggaW4gIildfSI6CisgICAgICAgICAgICAgICAgaWYgc3RhY2s6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzdGFja1stMV0KKyAgICAgICAgICAgICAgICBsYXN0Y2ggPSBjaAorICAgICAgICAgICAgICAgIHAgPSBwKzEKKyAgICAgICAgICAgICAgICBicmFja2V0aW5nLmFwcGVuZCgocCwgbGVuKHN0YWNrKSkpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY2ggPT0gJyInIG9yIGNoID09ICInIjoKKyAgICAgICAgICAgICAgICAjIGNvbnN1bWUgc3RyaW5nCisgICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQgc3R1ZHkxIGRpZCB0aGlzIHdpdGggYSBQeXRob24gbG9vcCwgYnV0CisgICAgICAgICAgICAgICAgIyB3ZSB1c2UgYSByZWdleHAgaGVyZTsgdGhlIHJlYXNvbiBpcyBzcGVlZCBpbiBib3RoCisgICAgICAgICAgICAgICAgIyBjYXNlczsgdGhlIHN0cmluZyBtYXkgYmUgaHVnZSwgYnV0IHN0dWR5MSBwcmUtc3F1YXNoZWQKKyAgICAgICAgICAgICAgICAjIHN0cmluZ3MgdG8gYSBjb3VwbGUgb2YgY2hhcmFjdGVycyBwZXIgbGluZS4gIHN0dWR5MQorICAgICAgICAgICAgICAgICMgYWxzbyBuZWVkZWQgdG8ga2VlcCB0cmFjayBvZiBuZXdsaW5lcywgYW5kIHdlIGRvbid0CisgICAgICAgICAgICAgICAgIyBoYXZlIHRvLgorICAgICAgICAgICAgICAgIGJyYWNrZXRpbmcuYXBwZW5kKChwLCBsZW4oc3RhY2spKzEpKQorICAgICAgICAgICAgICAgIGxhc3RjaCA9IGNoCisgICAgICAgICAgICAgICAgcCA9IF9tYXRjaF9zdHJpbmdyZShzdHIsIHAsIHEpLmVuZCgpCisgICAgICAgICAgICAgICAgYnJhY2tldGluZy5hcHBlbmQoKHAsIGxlbihzdGFjaykpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGNoID09ICcjJzoKKyAgICAgICAgICAgICAgICAjIGNvbnN1bWUgY29tbWVudCBhbmQgdHJhaWxpbmcgbmV3bGluZQorICAgICAgICAgICAgICAgIGJyYWNrZXRpbmcuYXBwZW5kKChwLCBsZW4oc3RhY2spKzEpKQorICAgICAgICAgICAgICAgIHAgPSBzdHIuZmluZCgnXG4nLCBwLCBxKSArIDEKKyAgICAgICAgICAgICAgICBhc3NlcnQgcCA+IDAKKyAgICAgICAgICAgICAgICBicmFja2V0aW5nLmFwcGVuZCgocCwgbGVuKHN0YWNrKSkpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgYXNzZXJ0IGNoID09ICdcXCcKKyAgICAgICAgICAgIHAgPSBwKzEgICAgICMgYmV5b25kIGJhY2tzbGFzaAorICAgICAgICAgICAgYXNzZXJ0IHAgPCBxCisgICAgICAgICAgICBpZiBzdHJbcF0gIT0gJ1xuJzoKKyAgICAgICAgICAgICAgICAjIHRoZSBwcm9ncmFtIGlzIGludmFsaWQsIGJ1dCBjYW4ndCBjb21wbGFpbgorICAgICAgICAgICAgICAgIGxhc3RjaCA9IGNoICsgc3RyW3BdCisgICAgICAgICAgICBwID0gcCsxICAgICAjIGJleW9uZCBlc2NhcGVkIGNoYXIKKworICAgICAgICAjIGVuZCB3aGlsZSBwIDwgcToKKworICAgICAgICBzZWxmLmxhc3RjaCA9IGxhc3RjaAorICAgICAgICBpZiBzdGFjazoKKyAgICAgICAgICAgIHNlbGYubGFzdG9wZW5icmFja2V0cG9zID0gc3RhY2tbLTFdCisgICAgICAgIHNlbGYuc3RtdF9icmFja2V0aW5nID0gdHVwbGUoYnJhY2tldGluZykKKworICAgICMgQXNzdW1pbmcgY29udGludWF0aW9uIGlzIENfQlJBQ0tFVCwgcmV0dXJuIHRoZSBudW1iZXIKKyAgICAjIG9mIHNwYWNlcyB0aGUgbmV4dCBsaW5lIHNob3VsZCBiZSBpbmRlbnRlZC4KKworICAgIGRlZiBjb21wdXRlX2JyYWNrZXRfaW5kZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9zdHVkeTIoKQorICAgICAgICBhc3NlcnQgc2VsZi5jb250aW51YXRpb24gPT0gQ19CUkFDS0VUCisgICAgICAgIGogPSBzZWxmLmxhc3RvcGVuYnJhY2tldHBvcworICAgICAgICBzdHIgPSBzZWxmLnN0cgorICAgICAgICBuID0gbGVuKHN0cikKKyAgICAgICAgb3JpZ2kgPSBpID0gc3RyLnJmaW5kKCdcbicsIDAsIGopICsgMQorICAgICAgICBqID0gaisxICAgICAjIG9uZSBiZXlvbmQgb3BlbiBicmFja2V0CisgICAgICAgICMgZmluZCBmaXJzdCBsaXN0IGl0ZW07IHNldCBpIHRvIHN0YXJ0IG9mIGl0cyBsaW5lCisgICAgICAgIHdoaWxlIGogPCBuOgorICAgICAgICAgICAgbSA9IF9pdGVtcmUoc3RyLCBqKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBqID0gbS5lbmQoKSAtIDEgICAgICMgaW5kZXggb2YgZmlyc3QgaW50ZXJlc3RpbmcgY2hhcgorICAgICAgICAgICAgICAgIGV4dHJhID0gMAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgdGhpcyBsaW5lIGlzIGp1bms7IGFkdmFuY2UgdG8gbmV4dCBsaW5lCisgICAgICAgICAgICAgICAgaSA9IGogPSBzdHIuZmluZCgnXG4nLCBqKSArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbm90aGluZyBpbnRlcmVzdGluZyBmb2xsb3dzIHRoZSBicmFja2V0OworICAgICAgICAgICAgIyByZXByb2R1Y2UgdGhlIGJyYWNrZXQgbGluZSdzIGluZGVudGF0aW9uICsgYSBsZXZlbAorICAgICAgICAgICAgaiA9IGkgPSBvcmlnaQorICAgICAgICAgICAgd2hpbGUgc3RyW2pdIGluICIgXHQiOgorICAgICAgICAgICAgICAgIGogPSBqKzEKKyAgICAgICAgICAgIGV4dHJhID0gc2VsZi5pbmRlbnR3aWR0aAorICAgICAgICByZXR1cm4gbGVuKHN0cltpOmpdLmV4cGFuZHRhYnMoc2VsZi50YWJ3aWR0aCkpICsgZXh0cmEKKworICAgICMgUmV0dXJuIG51bWJlciBvZiBwaHlzaWNhbCBsaW5lcyBpbiBsYXN0IHN0bXQgKHdoZXRoZXIgb3Igbm90CisgICAgIyBpdCdzIGFuIGludGVyZXN0aW5nIHN0bXQhICB0aGlzIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCB3aGVuCisgICAgIyBjb250aW51YXRpb24gaXMgQ19CQUNLU0xBU0gpLgorCisgICAgZGVmIGdldF9udW1fbGluZXNfaW5fc3RtdChzZWxmKToKKyAgICAgICAgc2VsZi5fc3R1ZHkxKCkKKyAgICAgICAgZ29vZGxpbmVzID0gc2VsZi5nb29kbGluZXMKKyAgICAgICAgcmV0dXJuIGdvb2RsaW5lc1stMV0gLSBnb29kbGluZXNbLTJdCisKKyAgICAjIEFzc3VtaW5nIGNvbnRpbnVhdGlvbiBpcyBDX0JBQ0tTTEFTSCwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc3BhY2VzCisgICAgIyB0aGUgbmV4dCBsaW5lIHNob3VsZCBiZSBpbmRlbnRlZC4gIEFsc28gYXNzdW1pbmcgdGhlIG5ldyBsaW5lIGlzCisgICAgIyB0aGUgZmlyc3Qgb25lIGZvbGxvd2luZyB0aGUgaW5pdGlhbCBsaW5lIG9mIHRoZSBzdG10LgorCisgICAgZGVmIGNvbXB1dGVfYmFja3NsYXNoX2luZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fc3R1ZHkyKCkKKyAgICAgICAgYXNzZXJ0IHNlbGYuY29udGludWF0aW9uID09IENfQkFDS1NMQVNICisgICAgICAgIHN0ciA9IHNlbGYuc3RyCisgICAgICAgIGkgPSBzZWxmLnN0bXRfc3RhcnQKKyAgICAgICAgd2hpbGUgc3RyW2ldIGluICIgXHQiOgorICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICBzdGFydHBvcyA9IGkKKworICAgICAgICAjIFNlZSB3aGV0aGVyIHRoZSBpbml0aWFsIGxpbmUgc3RhcnRzIGFuIGFzc2lnbm1lbnQgc3RtdDsgaS5lLiwKKyAgICAgICAgIyBsb29rIGZvciBhbiA9IG9wZXJhdG9yCisgICAgICAgIGVuZHBvcyA9IHN0ci5maW5kKCdcbicsIHN0YXJ0cG9zKSArIDEKKyAgICAgICAgZm91bmQgPSBsZXZlbCA9IDAKKyAgICAgICAgd2hpbGUgaSA8IGVuZHBvczoKKyAgICAgICAgICAgIGNoID0gc3RyW2ldCisgICAgICAgICAgICBpZiBjaCBpbiAiKFt7IjoKKyAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsICsgMQorICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgIGVsaWYgY2ggaW4gIildfSI6CisgICAgICAgICAgICAgICAgaWYgbGV2ZWw6CisgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbGV2ZWwgLSAxCisgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgZWxpZiBjaCA9PSAnIicgb3IgY2ggPT0gIiciOgorICAgICAgICAgICAgICAgIGkgPSBfbWF0Y2hfc3RyaW5ncmUoc3RyLCBpLCBlbmRwb3MpLmVuZCgpCisgICAgICAgICAgICBlbGlmIGNoID09ICcjJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBsZXZlbCA9PSAwIGFuZCBjaCA9PSAnPScgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAoaSA9PSAwIG9yIHN0cltpLTFdIG5vdCBpbiAiPTw+ISIpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgc3RyW2krMV0gIT0gJz0nOgorICAgICAgICAgICAgICAgIGZvdW5kID0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGkgPSBpKzEKKworICAgICAgICBpZiBmb3VuZDoKKyAgICAgICAgICAgICMgZm91bmQgYSBsZWdpdCA9LCBidXQgaXQgbWF5IGJlIHRoZSBsYXN0IGludGVyZXN0aW5nCisgICAgICAgICAgICAjIHRoaW5nIG9uIHRoZSBsaW5lCisgICAgICAgICAgICBpID0gaSsxICAgICAjIG1vdmUgYmV5b25kIHRoZSA9CisgICAgICAgICAgICBmb3VuZCA9IHJlLm1hdGNoKHIiXHMqXFwiLCBzdHJbaTplbmRwb3NdKSBpcyBOb25lCisKKyAgICAgICAgaWYgbm90IGZvdW5kOgorICAgICAgICAgICAgIyBvaCB3ZWxsIC4uLiBzZXR0bGUgZm9yIG1vdmluZyBiZXlvbmQgdGhlIGZpcnN0IGNodW5rCisgICAgICAgICAgICAjIG9mIG5vbi13aGl0ZXNwYWNlIGNoYXJzCisgICAgICAgICAgICBpID0gc3RhcnRwb3MKKyAgICAgICAgICAgIHdoaWxlIHN0cltpXSBub3QgaW4gIiBcdFxuIjoKKyAgICAgICAgICAgICAgICBpID0gaSsxCisKKyAgICAgICAgcmV0dXJuIGxlbihzdHJbc2VsZi5zdG10X3N0YXJ0OmldLmV4cGFuZHRhYnMoXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFid2lkdGgpKSArIDEKKworICAgICMgUmV0dXJuIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2Ugb24gdGhlIGluaXRpYWwgbGluZSBvZiB0aGUgbGFzdAorICAgICMgaW50ZXJlc3Rpbmcgc3RtdC4KKworICAgIGRlZiBnZXRfYmFzZV9pbmRlbnRfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9zdHVkeTIoKQorICAgICAgICBpLCBuID0gc2VsZi5zdG10X3N0YXJ0LCBzZWxmLnN0bXRfZW5kCisgICAgICAgIGogPSBpCisgICAgICAgIHN0ciA9IHNlbGYuc3RyCisgICAgICAgIHdoaWxlIGogPCBuIGFuZCBzdHJbal0gaW4gIiBcdCI6CisgICAgICAgICAgICBqID0gaiArIDEKKyAgICAgICAgcmV0dXJuIHN0cltpOmpdCisKKyAgICAjIERpZCB0aGUgbGFzdCBpbnRlcmVzdGluZyBzdG10IG9wZW4gYSBibG9jaz8KKworICAgIGRlZiBpc19ibG9ja19vcGVuZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3N0dWR5MigpCisgICAgICAgIHJldHVybiBzZWxmLmxhc3RjaCA9PSAnOicKKworICAgICMgRGlkIHRoZSBsYXN0IGludGVyZXN0aW5nIHN0bXQgY2xvc2UgYSBibG9jaz8KKworICAgIGRlZiBpc19ibG9ja19jbG9zZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3N0dWR5MigpCisgICAgICAgIHJldHVybiBfY2xvc2VyZShzZWxmLnN0ciwgc2VsZi5zdG10X3N0YXJ0KSBpcyBub3QgTm9uZQorCisgICAgIyBpbmRleCBvZiBsYXN0IG9wZW4gYnJhY2tldCAoe1ssIG9yIE5vbmUgaWYgbm9uZQorICAgIGxhc3RvcGVuYnJhY2tldHBvcyA9IE5vbmUKKworICAgIGRlZiBnZXRfbGFzdF9vcGVuX2JyYWNrZXRfcG9zKHNlbGYpOgorICAgICAgICBzZWxmLl9zdHVkeTIoKQorICAgICAgICByZXR1cm4gc2VsZi5sYXN0b3BlbmJyYWNrZXRwb3MKKworICAgICMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgYnJhY2tldGluZyBvZiB0aGUgbGFzdCBpbnRlcmVzdGluZyBzdGF0ZW1lbnQsCisgICAgIyBpbiB0aGUgZm9ybWF0IGRlZmluZWQgaW4gX3N0dWR5Miwgb3IgTm9uZSBpZiB0aGUgdGV4dCBkaWRuJ3QgY29udGFpbgorICAgICMgYW55dGhpbmcKKyAgICBzdG10X2JyYWNrZXRpbmcgPSBOb25lCisKKyAgICBkZWYgZ2V0X2xhc3Rfc3RtdF9icmFja2V0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9zdHVkeTIoKQorICAgICAgICByZXR1cm4gc2VsZi5zdG10X2JyYWNrZXRpbmcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVBhcnNlLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVBhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI0NDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5UGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVBhcnNlLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVBhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTgwODJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5UGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVNoZWxsLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1B5U2hlbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhZjg1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVNoZWxsLnB5CkBAIC0wLDAgKzEsMTU2OCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc3lzCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgZ2V0b3B0CitpbXBvcnQgcmUKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB0aW1lCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgdHlwZXMKK2ltcG9ydCBpbworCitpbXBvcnQgbGluZWNhY2hlCitmcm9tIGNvZGUgaW1wb3J0IEludGVyYWN0aXZlSW50ZXJwcmV0ZXIKK2Zyb20gcGxhdGZvcm0gaW1wb3J0IHB5dGhvbl92ZXJzaW9uCisKK3RyeToKKyAgICBmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwcmludD4+c3lzLl9fc3RkZXJyX18sICIqKiBJRExFIGNhbid0IGltcG9ydCBUa2ludGVyLiAgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiWW91ciBQeXRob24gbWF5IG5vdCBiZSBjb25maWd1cmVkIGZvciBUay4gKioiCisgICAgc3lzLmV4aXQoMSkKK2ltcG9ydCB0a01lc3NhZ2VCb3gKKworZnJvbSBpZGxlbGliLkVkaXRvcldpbmRvdyBpbXBvcnQgRWRpdG9yV2luZG93LCBmaXh3b3JkYnJlYWtzCitmcm9tIGlkbGVsaWIuRmlsZUxpc3QgaW1wb3J0IEZpbGVMaXN0Citmcm9tIGlkbGVsaWIuQ29sb3JEZWxlZ2F0b3IgaW1wb3J0IENvbG9yRGVsZWdhdG9yCitmcm9tIGlkbGVsaWIuVW5kb0RlbGVnYXRvciBpbXBvcnQgVW5kb0RlbGVnYXRvcgorZnJvbSBpZGxlbGliLk91dHB1dFdpbmRvdyBpbXBvcnQgT3V0cHV0V2luZG93Citmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYiBpbXBvcnQgaWRsZXZlcgorZnJvbSBpZGxlbGliIGltcG9ydCBycGMKK2Zyb20gaWRsZWxpYiBpbXBvcnQgRGVidWdnZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgUmVtb3RlRGVidWdnZXIKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorCitJREVOVENIQVJTID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgIl8iCitIT1NUID0gJzEyNy4wLjAuMScgIyBweXRob24gZXhlY3V0aW9uIHNlcnZlciBvbiBsb2NhbGhvc3QgbG9vcGJhY2sKK1BPUlQgPSAwICAjIHNvbWVkYXkgcGFzcyBpbiBob3N0LCBwb3J0IGZvciByZW1vdGUgZGVidWcgY2FwYWJpbGl0eQorCit0cnk6CisgICAgZnJvbSBzaWduYWwgaW1wb3J0IFNJR1RFUk0KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBTSUdURVJNID0gMTUKKworIyBPdmVycmlkZSB3YXJuaW5ncyBtb2R1bGUgdG8gd3JpdGUgdG8gd2FybmluZ19zdHJlYW0uICBJbml0aWFsaXplIHRvIHNlbmQgSURMRQorIyBpbnRlcm5hbCB3YXJuaW5ncyB0byB0aGUgY29uc29sZS4gIFNjcmlwdEJpbmRpbmcuY2hlY2tfc3ludGF4KCkgd2lsbAorIyB0ZW1wb3JhcmlseSByZWRpcmVjdCB0aGUgc3RyZWFtIHRvIHRoZSBzaGVsbCB3aW5kb3cgdG8gZGlzcGxheSB3YXJuaW5ncyB3aGVuCisjIGNoZWNraW5nIHVzZXIncyBjb2RlLgorZ2xvYmFsIHdhcm5pbmdfc3RyZWFtCit3YXJuaW5nX3N0cmVhbSA9IHN5cy5fX3N0ZGVycl9fCit0cnk6CisgICAgaW1wb3J0IHdhcm5pbmdzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBkZWYgaWRsZV9zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CisgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGUgPSB3YXJuaW5nX3N0cmVhbQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlLndyaXRlKHdhcm5pbmdzLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVubywgbGluZT1saW5lKSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBwYXNzICAjIyBmaWxlIChwcm9iYWJseSBfX3N0ZGVycl9fKSBpcyBpbnZhbGlkLCB3YXJuaW5nIGRyb3BwZWQuCisgICAgd2FybmluZ3Muc2hvd3dhcm5pbmcgPSBpZGxlX3Nob3d3YXJuaW5nCisgICAgZGVmIGlkbGVfZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZT1Ob25lKToKKyAgICAgICAgIiIiRm9ybWF0IHdhcm5pbmdzIHRoZSBJRExFIHdheSIiIgorICAgICAgICBzID0gIlxuV2FybmluZyAoZnJvbSB3YXJuaW5ncyBtb2R1bGUpOlxuIgorICAgICAgICBzICs9ICcgIEZpbGUgXCIlc1wiLCBsaW5lICVzXG4nICUgKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGlmIGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICBzICs9ICIgICAgJXNcbiIgJSBsaW5lCisgICAgICAgIHMgKz0gIiVzOiAlc1xuPj4+ICIgJSAoY2F0ZWdvcnkuX19uYW1lX18sIG1lc3NhZ2UpCisgICAgICAgIHJldHVybiBzCisgICAgd2FybmluZ3MuZm9ybWF0d2FybmluZyA9IGlkbGVfZm9ybWF0d2FybmluZworCitkZWYgZXh0ZW5kZWRfbGluZWNhY2hlX2NoZWNrY2FjaGUoZmlsZW5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnX2NoZWNrY2FjaGU9bGluZWNhY2hlLmNoZWNrY2FjaGUpOgorICAgICIiIkV4dGVuZCBsaW5lY2FjaGUuY2hlY2tjYWNoZSB0byBwcmVzZXJ2ZSB0aGUgPHB5c2hlbGwjLi4uPiBlbnRyaWVzCisKKyAgICBSYXRoZXIgdGhhbiByZXBlYXRpbmcgdGhlIGxpbmVjYWNoZSBjb2RlLCBwYXRjaCBpdCB0byBzYXZlIHRoZQorICAgIDxweXNoZWxsIy4uLj4gZW50cmllcywgY2FsbCB0aGUgb3JpZ2luYWwgbGluZWNhY2hlLmNoZWNrY2FjaGUoKQorICAgIChza2lwcGluZyB0aGVtKSwgYW5kIHRoZW4gcmVzdG9yZSB0aGUgc2F2ZWQgZW50cmllcy4KKworICAgIG9yaWdfY2hlY2tjYWNoZSBpcyBib3VuZCBhdCBkZWZpbml0aW9uIHRpbWUgdG8gdGhlIG9yaWdpbmFsCisgICAgbWV0aG9kLCBhbGxvd2luZyBpdCB0byBiZSBwYXRjaGVkLgorICAgICIiIgorICAgIGNhY2hlID0gbGluZWNhY2hlLmNhY2hlCisgICAgc2F2ZSA9IHt9CisgICAgZm9yIGtleSBpbiBsaXN0KGNhY2hlKToKKyAgICAgICAgaWYga2V5WzoxXSArIGtleVstMTpdID09ICc8Pic6CisgICAgICAgICAgICBzYXZlW2tleV0gPSBjYWNoZS5wb3Aoa2V5KQorICAgIG9yaWdfY2hlY2tjYWNoZShmaWxlbmFtZSkKKyAgICBjYWNoZS51cGRhdGUoc2F2ZSkKKworIyBQYXRjaCBsaW5lY2FjaGUuY2hlY2tjYWNoZSgpOgorbGluZWNhY2hlLmNoZWNrY2FjaGUgPSBleHRlbmRlZF9saW5lY2FjaGVfY2hlY2tjYWNoZQorCisKK2NsYXNzIFB5U2hlbGxFZGl0b3JXaW5kb3coRWRpdG9yV2luZG93KToKKyAgICAiUmVndWxhciB0ZXh0IGVkaXQgd2luZG93IGluIElETEUsIHN1cHBvcnRzIGJyZWFrcG9pbnRzIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5icmVha3BvaW50cyA9IFtdCisgICAgICAgIEVkaXRvcldpbmRvdy5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgc2VsZi50ZXh0LmJpbmQoIjw8c2V0LWJyZWFrcG9pbnQtaGVyZT4+Iiwgc2VsZi5zZXRfYnJlYWtwb2ludF9oZXJlKQorICAgICAgICBzZWxmLnRleHQuYmluZCgiPDxjbGVhci1icmVha3BvaW50LWhlcmU+PiIsIHNlbGYuY2xlYXJfYnJlYWtwb2ludF9oZXJlKQorICAgICAgICBzZWxmLnRleHQuYmluZCgiPDxvcGVuLXB5dGhvbi1zaGVsbD4+Iiwgc2VsZi5mbGlzdC5vcGVuX3NoZWxsKQorCisgICAgICAgIHNlbGYuYnJlYWtwb2ludFBhdGggPSBvcy5wYXRoLmpvaW4oaWRsZUNvbmYuR2V0VXNlckNmZ0RpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdicmVha3BvaW50cy5sc3QnKQorICAgICAgICAjIHdoZW5ldmVyIGEgZmlsZSBpcyBjaGFuZ2VkLCByZXN0b3JlIGJyZWFrcG9pbnRzCisgICAgICAgIGRlZiBmaWxlbmFtZV9jaGFuZ2VkX2hvb2sob2xkX2hvb2s9c2VsZi5pby5maWxlbmFtZV9jaGFuZ2VfaG9vaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmPXNlbGYpOgorICAgICAgICAgICAgc2VsZi5yZXN0b3JlX2ZpbGVfYnJlYWtzKCkKKyAgICAgICAgICAgIG9sZF9ob29rKCkKKyAgICAgICAgc2VsZi5pby5zZXRfZmlsZW5hbWVfY2hhbmdlX2hvb2soZmlsZW5hbWVfY2hhbmdlZF9ob29rKQorICAgICAgICBpZiBzZWxmLmlvLmZpbGVuYW1lOgorICAgICAgICAgICAgc2VsZi5yZXN0b3JlX2ZpbGVfYnJlYWtzKCkKKworICAgIHJtZW51X3NwZWNzID0gWworICAgICAgICAoIkN1dCIsICI8PGN1dD4+IiwgInJtZW51X2NoZWNrX2N1dCIpLAorICAgICAgICAoIkNvcHkiLCAiPDxjb3B5Pj4iLCAicm1lbnVfY2hlY2tfY29weSIpLAorICAgICAgICAoIlBhc3RlIiwgIjw8cGFzdGU+PiIsICJybWVudV9jaGVja19wYXN0ZSIpLAorICAgICAgICAoIlNldCBCcmVha3BvaW50IiwgIjw8c2V0LWJyZWFrcG9pbnQtaGVyZT4+IiwgTm9uZSksCisgICAgICAgICgiQ2xlYXIgQnJlYWtwb2ludCIsICI8PGNsZWFyLWJyZWFrcG9pbnQtaGVyZT4+IiwgTm9uZSkKKyAgICBdCisKKyAgICBkZWYgc2V0X2JyZWFrcG9pbnQoc2VsZiwgbGluZW5vKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUKKyAgICAgICAgdGV4dC50YWdfYWRkKCJCUkVBSyIsICIlZC4wIiAlIGxpbmVubywgIiVkLjAiICUgKGxpbmVubysxKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaSA9IHNlbGYuYnJlYWtwb2ludHMuaW5kZXgobGluZW5vKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogICMgb25seSBhZGQgaWYgbWlzc2luZywgaS5lLiBkbyBvbmNlCisgICAgICAgICAgICBzZWxmLmJyZWFrcG9pbnRzLmFwcGVuZChsaW5lbm8pCisgICAgICAgIHRyeTogICAgIyB1cGRhdGUgdGhlIHN1YnByb2Nlc3MgZGVidWdnZXIKKyAgICAgICAgICAgIGRlYnVnID0gc2VsZi5mbGlzdC5weXNoZWxsLmludGVycC5kZWJ1Z2dlcgorICAgICAgICAgICAgZGVidWcuc2V0X2JyZWFrcG9pbnRfaGVyZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBleGNlcHQ6ICMgYnV0IGRlYnVnZ2VyIG1heSBub3QgYmUgYWN0aXZlIHJpZ2h0IG5vdy4uLi4KKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBzZXRfYnJlYWtwb2ludF9oZXJlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5pby5maWxlbmFtZQorICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGxpbmVubyA9IGludChmbG9hdCh0ZXh0LmluZGV4KCJpbnNlcnQiKSkpCisgICAgICAgIHNlbGYuc2V0X2JyZWFrcG9pbnQobGluZW5vKQorCisgICAgZGVmIGNsZWFyX2JyZWFrcG9pbnRfaGVyZShzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuaW8uZmlsZW5hbWUKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBsaW5lbm8gPSBpbnQoZmxvYXQodGV4dC5pbmRleCgiaW5zZXJ0IikpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmJyZWFrcG9pbnRzLnJlbW92ZShsaW5lbm8pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJCUkVBSyIsICJpbnNlcnQgbGluZXN0YXJ0IixcCisgICAgICAgICAgICAgICAgICAgICAgICAiaW5zZXJ0IGxpbmVlbmQgKzFjaGFyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVidWcgPSBzZWxmLmZsaXN0LnB5c2hlbGwuaW50ZXJwLmRlYnVnZ2VyCisgICAgICAgICAgICBkZWJ1Zy5jbGVhcl9icmVha3BvaW50X2hlcmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNsZWFyX2ZpbGVfYnJlYWtzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJyZWFrcG9pbnRzOgorICAgICAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmlvLmZpbGVuYW1lCisgICAgICAgICAgICBpZiBub3QgZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgdGV4dC5iZWxsKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuYnJlYWtwb2ludHMgPSBbXQorICAgICAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJCUkVBSyIsICIxLjAiLCBFTkQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVidWcgPSBzZWxmLmZsaXN0LnB5c2hlbGwuaW50ZXJwLmRlYnVnZ2VyCisgICAgICAgICAgICAgICAgZGVidWcuY2xlYXJfZmlsZV9icmVha3MoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHN0b3JlX2ZpbGVfYnJlYWtzKHNlbGYpOgorICAgICAgICAiU2F2ZSBicmVha3BvaW50cyB3aGVuIGZpbGUgaXMgc2F2ZWQiCisgICAgICAgICMgWFhYIDEzIERlYyAyMDAyIEtCSyBDdXJyZW50bHkgdGhlIGZpbGUgbXVzdCBiZSBzYXZlZCBiZWZvcmUgaXQgY2FuCisgICAgICAgICMgICAgIGJlIHJ1bi4gIFRoZSBicmVha3MgYXJlIHNhdmVkIGF0IHRoYXQgdGltZS4gIElmIHdlIGludHJvZHVjZQorICAgICAgICAjICAgICBhIHRlbXBvcmFyeSBmaWxlIHNhdmUgZmVhdHVyZSB0aGUgc2F2ZSBicmVha3MgZnVuY3Rpb25hbGl0eQorICAgICAgICAjICAgICBuZWVkcyB0byBiZSByZS12ZXJpZmllZCwgc2luY2UgdGhlIGJyZWFrcyBhdCB0aGUgdGltZSB0aGUKKyAgICAgICAgIyAgICAgdGVtcCBmaWxlIGlzIGNyZWF0ZWQgbWF5IGRpZmZlciBmcm9tIHRoZSBicmVha3MgYXQgdGhlIGxhc3QKKyAgICAgICAgIyAgICAgcGVybWFuZW50IHNhdmUgb2YgdGhlIGZpbGUuICBDdXJyZW50bHksIGEgYnJlYWsgaW50cm9kdWNlZAorICAgICAgICAjICAgICBhZnRlciBhIHNhdmUgd2lsbCBiZSBlZmZlY3RpdmUsIGJ1dCBub3QgcGVyc2lzdGVudC4KKyAgICAgICAgIyAgICAgVGhpcyBpcyBuZWNlc3NhcnkgdG8ga2VlcCB0aGUgc2F2ZWQgYnJlYWtzIHN5bmNoZWQgd2l0aCB0aGUKKyAgICAgICAgIyAgICAgc2F2ZWQgZmlsZS4KKyAgICAgICAgIworICAgICAgICAjICAgICBCcmVha3BvaW50cyBhcmUgc2V0IGFzIHRhZ2dlZCByYW5nZXMgaW4gdGhlIHRleHQuICBDZXJ0YWluCisgICAgICAgICMgICAgIGtpbmRzIG9mIGVkaXRzIGNhdXNlIHRoZXNlIHJhbmdlcyB0byBiZSBkZWxldGVkOiBJbnNlcnRpbmcKKyAgICAgICAgIyAgICAgb3IgZGVsZXRpbmcgYSBsaW5lIGp1c3QgYmVmb3JlIGEgYnJlYWtwb2ludCwgYW5kIGNlcnRhaW4KKyAgICAgICAgIyAgICAgZGVsZXRpb25zIHByaW9yIHRvIGEgYnJlYWtwb2ludC4gIFRoZXNlIGlzc3VlcyBuZWVkIHRvIGJlCisgICAgICAgICMgICAgIGludmVzdGlnYXRlZCBhbmQgdW5kZXJzdG9vZC4gIEl0J3Mgbm90IGNsZWFyIGlmIHRoZXkgYXJlCisgICAgICAgICMgICAgIFRrIGlzc3VlcyBvciBJRExFIGlzc3Vlcywgb3Igd2hldGhlciB0aGV5IGNhbiBhY3R1YWxseQorICAgICAgICAjICAgICBiZSBmaXhlZC4gIFNpbmNlIGEgbW9kaWZpZWQgZmlsZSBoYXMgdG8gYmUgc2F2ZWQgYmVmb3JlIGl0IGlzCisgICAgICAgICMgICAgIHJ1biwgYW5kIHNpbmNlIHNlbGYuYnJlYWtwb2ludHMgKGZyb20gd2hpY2ggdGhlIHN1YnByb2Nlc3MKKyAgICAgICAgIyAgICAgZGVidWdnZXIgaXMgbG9hZGVkKSBpcyB1cGRhdGVkIGR1cmluZyB0aGUgc2F2ZSwgdGhlIHZpc2libGUKKyAgICAgICAgIyAgICAgYnJlYWtzIHN0YXkgc3luY2hlZCB3aXRoIHRoZSBzdWJwcm9jZXNzIGV2ZW4gaWYgb25lIG9mIHRoZXNlCisgICAgICAgICMgICAgIHVuZXhwZWN0ZWQgYnJlYWtwb2ludCBkZWxldGlvbnMgb2NjdXJzLgorICAgICAgICBicmVha3MgPSBzZWxmLmJyZWFrcG9pbnRzCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5pby5maWxlbmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIG9wZW4oc2VsZi5icmVha3BvaW50UGF0aCwiciIpIGFzIG9sZF9maWxlOgorICAgICAgICAgICAgICAgIGxpbmVzID0gb2xkX2ZpbGUucmVhZGxpbmVzKCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLmJyZWFrcG9pbnRQYXRoLCJ3IikgYXMgbmV3X2ZpbGU6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoZmlsZW5hbWUgKyAnPScpOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2ZpbGUud3JpdGUobGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZV9icmVha3BvaW50cygpCisgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VsZi5icmVha3BvaW50cworICAgICAgICAgICAgICAgIGlmIGJyZWFrczoKKyAgICAgICAgICAgICAgICAgICAgbmV3X2ZpbGUud3JpdGUoZmlsZW5hbWUgKyAnPScgKyBzdHIoYnJlYWtzKSArICdcbicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGVycjoKKyAgICAgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYucm9vdCwgImJyZWFrcG9pbnRfZXJyb3JfZGlzcGxheWVkIiwgRmFsc2UpOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdC5icmVha3BvaW50X2Vycm9yX2Rpc3BsYXllZCA9IFRydWUKKyAgICAgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdJRExFIEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVW5hYmxlIHRvIHVwZGF0ZSBicmVha3BvaW50IGxpc3Q6XG4lcycKKyAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyKGVyciksCisgICAgICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpCisKKyAgICBkZWYgcmVzdG9yZV9maWxlX2JyZWFrcyhzZWxmKToKKyAgICAgICAgc2VsZi50ZXh0LnVwZGF0ZSgpICAgIyB0aGlzIGVuYWJsZXMgc2V0dGluZyAiQlJFQUsiIHRhZ3MgdG8gYmUgdmlzaWJsZQorICAgICAgICBpZiBzZWxmLmlvIGlzIE5vbmU6CisgICAgICAgICAgICAjIGNhbiBoYXBwZW4gaWYgSURMRSBjbG9zZXMgZHVlIHRvIHRoZSAudXBkYXRlKCkgY2FsbAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5pby5maWxlbmFtZQorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuYnJlYWtwb2ludFBhdGgpOgorICAgICAgICAgICAgbGluZXMgPSBvcGVuKHNlbGYuYnJlYWtwb2ludFBhdGgsInIiKS5yZWFkbGluZXMoKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKGZpbGVuYW1lICsgJz0nKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludF9saW5lbnVtYmVycyA9IGV2YWwobGluZVtsZW4oZmlsZW5hbWUpKzE6XSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGJyZWFrcG9pbnRfbGluZW51bWJlciBpbiBicmVha3BvaW50X2xpbmVudW1iZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRfYnJlYWtwb2ludChicmVha3BvaW50X2xpbmVudW1iZXIpCisKKyAgICBkZWYgdXBkYXRlX2JyZWFrcG9pbnRzKHNlbGYpOgorICAgICAgICAiUmV0cmlldmVzIGFsbCB0aGUgYnJlYWtwb2ludHMgaW4gdGhlIGN1cnJlbnQgd2luZG93IgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHJhbmdlcyA9IHRleHQudGFnX3JhbmdlcygiQlJFQUsiKQorICAgICAgICBsaW5lbnVtYmVyX2xpc3QgPSBzZWxmLnJhbmdlc190b19saW5lbnVtYmVycyhyYW5nZXMpCisgICAgICAgIHNlbGYuYnJlYWtwb2ludHMgPSBsaW5lbnVtYmVyX2xpc3QKKworICAgIGRlZiByYW5nZXNfdG9fbGluZW51bWJlcnMoc2VsZiwgcmFuZ2VzKToKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UoMCwgbGVuKHJhbmdlcyksIDIpOgorICAgICAgICAgICAgbGluZW5vID0gaW50KGZsb2F0KHJhbmdlc1tpbmRleF0uc3RyaW5nKSkKKyAgICAgICAgICAgIGVuZCA9IGludChmbG9hdChyYW5nZXNbaW5kZXgrMV0uc3RyaW5nKSkKKyAgICAgICAgICAgIHdoaWxlIGxpbmVubyA8IGVuZDoKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQobGluZW5vKQorICAgICAgICAgICAgICAgIGxpbmVubyArPSAxCisgICAgICAgIHJldHVybiBsaW5lcworCisjIFhYWCAxMyBEZWMgMjAwMiBLQksgTm90IHVzZWQgY3VycmVudGx5CisjICAgIGRlZiBzYXZlZF9jaGFuZ2VfaG9vayhzZWxmKToKKyMgICAgICAgICJFeHRlbmQgYmFzZSBtZXRob2QgLSBjbGVhciBicmVha3MgaWYgbW9kdWxlIGlzIG1vZGlmaWVkIgorIyAgICAgICAgaWYgbm90IHNlbGYuZ2V0X3NhdmVkKCk6CisjICAgICAgICAgICAgc2VsZi5jbGVhcl9maWxlX2JyZWFrcygpCisjICAgICAgICBFZGl0b3JXaW5kb3cuc2F2ZWRfY2hhbmdlX2hvb2soc2VsZikKKworICAgIGRlZiBfY2xvc2Uoc2VsZik6CisgICAgICAgICJFeHRlbmQgYmFzZSBtZXRob2QgLSBjbGVhciBicmVha3Mgd2hlbiBtb2R1bGUgaXMgY2xvc2VkIgorICAgICAgICBzZWxmLmNsZWFyX2ZpbGVfYnJlYWtzKCkKKyAgICAgICAgRWRpdG9yV2luZG93Ll9jbG9zZShzZWxmKQorCisKK2NsYXNzIFB5U2hlbGxGaWxlTGlzdChGaWxlTGlzdCk6CisgICAgIkV4dGVuZCBiYXNlIGNsYXNzOiBJRExFIHN1cHBvcnRzIGEgc2hlbGwgYW5kIGJyZWFrcG9pbnRzIgorCisgICAgIyBvdmVycmlkZSBGaWxlTGlzdCdzIGNsYXNzIHZhcmlhYmxlLCBpbnN0YW5jZXMgcmV0dXJuIFB5U2hlbGxFZGl0b3JXaW5kb3cKKyAgICAjIGluc3RlYWQgb2YgRWRpdG9yV2luZG93IHdoZW4gbmV3IGVkaXQgd2luZG93cyBhcmUgY3JlYXRlZC4KKyAgICBFZGl0b3JXaW5kb3cgPSBQeVNoZWxsRWRpdG9yV2luZG93CisKKyAgICBweXNoZWxsID0gTm9uZQorCisgICAgZGVmIG9wZW5fc2hlbGwoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYucHlzaGVsbDoKKyAgICAgICAgICAgIHNlbGYucHlzaGVsbC50b3Aud2FrZXVwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHlzaGVsbCA9IFB5U2hlbGwoc2VsZikKKyAgICAgICAgICAgIGlmIHNlbGYucHlzaGVsbDoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5weXNoZWxsLmJlZ2luKCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLnB5c2hlbGwKKworCitjbGFzcyBNb2RpZmllZENvbG9yRGVsZWdhdG9yKENvbG9yRGVsZWdhdG9yKToKKyAgICAiRXh0ZW5kIGJhc2UgY2xhc3M6IGNvbG9yaXplciBmb3IgdGhlIHNoZWxsIHdpbmRvdyBpdHNlbGYiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIENvbG9yRGVsZWdhdG9yLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuTG9hZFRhZ0RlZnMoKQorCisgICAgZGVmIHJlY29sb3JpemVfbWFpbihzZWxmKToKKyAgICAgICAgc2VsZi50YWdfcmVtb3ZlKCJUT0RPIiwgIjEuMCIsICJpb21hcmsiKQorICAgICAgICBzZWxmLnRhZ19hZGQoIlNZTkMiLCAiMS4wIiwgImlvbWFyayIpCisgICAgICAgIENvbG9yRGVsZWdhdG9yLnJlY29sb3JpemVfbWFpbihzZWxmKQorCisgICAgZGVmIExvYWRUYWdEZWZzKHNlbGYpOgorICAgICAgICBDb2xvckRlbGVnYXRvci5Mb2FkVGFnRGVmcyhzZWxmKQorICAgICAgICB0aGVtZSA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ1RoZW1lJywnbmFtZScpCisgICAgICAgIHNlbGYudGFnZGVmcy51cGRhdGUoeworICAgICAgICAgICAgInN0ZGluIjogeydiYWNrZ3JvdW5kJzpOb25lLCdmb3JlZ3JvdW5kJzpOb25lfSwKKyAgICAgICAgICAgICJzdGRvdXQiOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJzdGRvdXQiKSwKKyAgICAgICAgICAgICJzdGRlcnIiOiBpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICJzdGRlcnIiKSwKKyAgICAgICAgICAgICJjb25zb2xlIjogaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAiY29uc29sZSIpLAorICAgICAgICB9KQorCisgICAgZGVmIHJlbW92ZWNvbG9ycyhzZWxmKToKKyAgICAgICAgIyBEb24ndCByZW1vdmUgc2hlbGwgY29sb3IgdGFncyBiZWZvcmUgImlvbWFyayIKKyAgICAgICAgZm9yIHRhZyBpbiBzZWxmLnRhZ2RlZnM6CisgICAgICAgICAgICBzZWxmLnRhZ19yZW1vdmUodGFnLCAiaW9tYXJrIiwgImVuZCIpCisKK2NsYXNzIE1vZGlmaWVkVW5kb0RlbGVnYXRvcihVbmRvRGVsZWdhdG9yKToKKyAgICAiRXh0ZW5kIGJhc2UgY2xhc3M6IGZvcmJpZCBpbnNlcnQvZGVsZXRlIGJlZm9yZSB0aGUgSS9PIG1hcmsiCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBjaGFycywgdGFncz1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5kZWxlZ2F0ZS5jb21wYXJlKGluZGV4LCAiPCIsICJpb21hcmsiKToKKyAgICAgICAgICAgICAgICBzZWxmLmRlbGVnYXRlLmJlbGwoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIFVuZG9EZWxlZ2F0b3IuaW5zZXJ0KHNlbGYsIGluZGV4LCBjaGFycywgdGFncykKKworICAgIGRlZiBkZWxldGUoc2VsZiwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVsZWdhdGUuY29tcGFyZShpbmRleDEsICI8IiwgImlvbWFyayIpOgorICAgICAgICAgICAgICAgIHNlbGYuZGVsZWdhdGUuYmVsbCgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgVW5kb0RlbGVnYXRvci5kZWxldGUoc2VsZiwgaW5kZXgxLCBpbmRleDIpCisKKworY2xhc3MgTXlSUENDbGllbnQocnBjLlJQQ0NsaWVudCk6CisKKyAgICBkZWYgaGFuZGxlX0VPRihzZWxmKToKKyAgICAgICAgIk92ZXJyaWRlIHRoZSBiYXNlIGNsYXNzIC0ganVzdCByZS1yYWlzZSBFT0ZFcnJvciIKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKworCitjbGFzcyBNb2RpZmllZEludGVycHJldGVyKEludGVyYWN0aXZlSW50ZXJwcmV0ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRrY29uc29sZSk6CisgICAgICAgIHNlbGYudGtjb25zb2xlID0gdGtjb25zb2xlCisgICAgICAgIGxvY2FscyA9IHN5cy5tb2R1bGVzWydfX21haW5fXyddLl9fZGljdF9fCisgICAgICAgIEludGVyYWN0aXZlSW50ZXJwcmV0ZXIuX19pbml0X18oc2VsZiwgbG9jYWxzPWxvY2FscykKKyAgICAgICAgc2VsZi5zYXZlX3dhcm5pbmdzX2ZpbHRlcnMgPSBOb25lCisgICAgICAgIHNlbGYucmVzdGFydGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYuc3VicHJvY2Vzc19hcmdsaXN0ID0gTm9uZQorICAgICAgICBzZWxmLnBvcnQgPSBQT1JUCisgICAgICAgIHNlbGYub3JpZ2luYWxfY29tcGlsZXJfZmxhZ3MgPSBzZWxmLmNvbXBpbGUuY29tcGlsZXIuZmxhZ3MKKworICAgIHJwY2NsdCA9IE5vbmUKKyAgICBycGNwaWQgPSBOb25lCisKKyAgICBkZWYgc3Bhd25fc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdWJwcm9jZXNzX2FyZ2xpc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3VicHJvY2Vzc19hcmdsaXN0ID0gc2VsZi5idWlsZF9zdWJwcm9jZXNzX2FyZ2xpc3QoKQorICAgICAgICBhcmdzID0gc2VsZi5zdWJwcm9jZXNzX2FyZ2xpc3QKKyAgICAgICAgc2VsZi5ycGNwaWQgPSBvcy5zcGF3bnYob3MuUF9OT1dBSVQsIHN5cy5leGVjdXRhYmxlLCBhcmdzKQorCisgICAgZGVmIGJ1aWxkX3N1YnByb2Nlc3NfYXJnbGlzdChzZWxmKToKKyAgICAgICAgYXNzZXJ0IChzZWxmLnBvcnQhPTApLCAoCisgICAgICAgICAgICAiU29ja2V0IHNob3VsZCBoYXZlIGJlZW4gYXNzaWduZWQgYSBwb3J0IG51bWJlci4iKQorICAgICAgICB3ID0gWyctVycgKyBzIGZvciBzIGluIHN5cy53YXJub3B0aW9uc10KKyAgICAgICAgaWYgMS8yID4gMDogIyBhY2NvdW50IGZvciBuZXcgZGl2aXNpb24KKyAgICAgICAgICAgIHcuYXBwZW5kKCctUW5ldycpCisgICAgICAgICMgTWF5YmUgSURMRSBpcyBpbnN0YWxsZWQgYW5kIGlzIGJlaW5nIGFjY2Vzc2VkIHZpYSBzeXMucGF0aCwKKyAgICAgICAgIyBvciBtYXliZSBpdCdzIG5vdCBpbnN0YWxsZWQgYW5kIHRoZSBpZGxlLnB5IHNjcmlwdCBpcyBiZWluZworICAgICAgICAjIHJ1biBmcm9tIHRoZSBJRExFIHNvdXJjZSBkaXJlY3RvcnkuCisgICAgICAgIGRlbF9leGl0ZiA9IGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsICdHZW5lcmFsJywgJ2RlbGV0ZS1leGl0ZnVuYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLCB0eXBlPSdib29sJykKKyAgICAgICAgaWYgX19uYW1lX18gPT0gJ2lkbGVsaWIuUHlTaGVsbCc6CisgICAgICAgICAgICBjb21tYW5kID0gIl9faW1wb3J0X18oJ2lkbGVsaWIucnVuJykucnVuLm1haW4oJXIpIiAlIChkZWxfZXhpdGYsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tbWFuZCA9ICJfX2ltcG9ydF9fKCdydW4nKS5tYWluKCVyKSIgJSAoZGVsX2V4aXRmLCkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJyBhbmQgJyAnIGluIHN5cy5leGVjdXRhYmxlOgorICAgICAgICAgICAgIyBoYW5kbGUgZW1iZWRkZWQgc3BhY2UgaW4gcGF0aCBieSBxdW90aW5nIHRoZSBhcmd1bWVudAorICAgICAgICAgICAgZGVjb3JhdGVkX2V4ZWMgPSAnIiVzIicgJSBzeXMuZXhlY3V0YWJsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVjb3JhdGVkX2V4ZWMgPSBzeXMuZXhlY3V0YWJsZQorICAgICAgICByZXR1cm4gW2RlY29yYXRlZF9leGVjXSArIHcgKyBbIi1jIiwgY29tbWFuZCwgc3RyKHNlbGYucG9ydCldCisKKyAgICBkZWYgc3RhcnRfc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgYWRkciA9IChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgICMgR1VJIG1ha2VzIHNldmVyYWwgYXR0ZW1wdHMgdG8gYWNxdWlyZSBzb2NrZXQsIGxpc3RlbnMgZm9yIGNvbm5lY3Rpb24KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICB0aW1lLnNsZWVwKGkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5ycGNjbHQgPSBNeVJQQ0NsaWVudChhZGRyKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kaXNwbGF5X3BvcnRfYmluZGluZ19lcnJvcigpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAjIGlmIFBPUlQgd2FzIDAsIHN5c3RlbSB3aWxsIGFzc2lnbiBhbiAnZXBoZW1lcmFsJyBwb3J0LiBGaW5kIGl0IG91dDoKKyAgICAgICAgc2VsZi5wb3J0ID0gc2VsZi5ycGNjbHQubGlzdGVuaW5nX3NvY2suZ2V0c29ja25hbWUoKVsxXQorICAgICAgICAjIGlmIFBPUlQgd2FzIG5vdCAwLCBwcm9iYWJseSB3b3JraW5nIHdpdGggYSByZW1vdGUgZXhlY3V0aW9uIHNlcnZlcgorICAgICAgICBpZiBQT1JUICE9IDA6CisgICAgICAgICAgICAjIFRvIGFsbG93IHJlY29ubmVjdGlvbiB3aXRoaW4gdGhlIDJNU0wgd2FpdCAoY2YuIFN0ZXZlbnMgVENQCisgICAgICAgICAgICAjIFYxLCAxOC42KSwgIHNldCBTT19SRVVTRUFERFIuICBOb3RlIHRoYXQgdGhpcyBjYW4gYmUgcHJvYmxlbWF0aWMKKyAgICAgICAgICAgICMgb24gV2luZG93cyBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gYWxsb3dzIHR3byBhY3RpdmUgc29ja2V0cyBvbgorICAgICAgICAgICAgIyB0aGUgc2FtZSBhZGRyZXNzIQorICAgICAgICAgICAgc2VsZi5ycGNjbHQubGlzdGVuaW5nX3NvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQorICAgICAgICBzZWxmLnNwYXduX3N1YnByb2Nlc3MoKQorICAgICAgICAjdGltZS5zbGVlcCgyMCkgIyB0ZXN0IHRvIHNpbXVsYXRlIEdVSSBub3QgYWNjZXB0aW5nIGNvbm5lY3Rpb24KKyAgICAgICAgIyBBY2NlcHQgdGhlIGNvbm5lY3Rpb24gZnJvbSB0aGUgUHl0aG9uIGV4ZWN1dGlvbiBzZXJ2ZXIKKyAgICAgICAgc2VsZi5ycGNjbHQubGlzdGVuaW5nX3NvY2suc2V0dGltZW91dCgxMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5ycGNjbHQuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0LCBlcnI6CisgICAgICAgICAgICBzZWxmLmRpc3BsYXlfbm9fc3VicHJvY2Vzc19lcnJvcigpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzZWxmLnJwY2NsdC5yZWdpc3RlcigiY29uc29sZSIsIHNlbGYudGtjb25zb2xlKQorICAgICAgICBzZWxmLnJwY2NsdC5yZWdpc3Rlcigic3RkaW4iLCBzZWxmLnRrY29uc29sZS5zdGRpbikKKyAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoInN0ZG91dCIsIHNlbGYudGtjb25zb2xlLnN0ZG91dCkKKyAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoInN0ZGVyciIsIHNlbGYudGtjb25zb2xlLnN0ZGVycikKKyAgICAgICAgc2VsZi5ycGNjbHQucmVnaXN0ZXIoImZsaXN0Iiwgc2VsZi50a2NvbnNvbGUuZmxpc3QpCisgICAgICAgIHNlbGYucnBjY2x0LnJlZ2lzdGVyKCJsaW5lY2FjaGUiLCBsaW5lY2FjaGUpCisgICAgICAgIHNlbGYucnBjY2x0LnJlZ2lzdGVyKCJpbnRlcnAiLCBzZWxmKQorICAgICAgICBzZWxmLnRyYW5zZmVyX3BhdGgod2l0aF9jd2Q9VHJ1ZSkKKyAgICAgICAgc2VsZi5wb2xsX3N1YnByb2Nlc3MoKQorICAgICAgICByZXR1cm4gc2VsZi5ycGNjbHQKKworICAgIGRlZiByZXN0YXJ0X3N1YnByb2Nlc3Moc2VsZiwgd2l0aF9jd2Q9RmFsc2UpOgorICAgICAgICBpZiBzZWxmLnJlc3RhcnRpbmc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5ycGNjbHQKKyAgICAgICAgc2VsZi5yZXN0YXJ0aW5nID0gVHJ1ZQorICAgICAgICAjIGNsb3NlIG9ubHkgdGhlIHN1YnByb2Nlc3MgZGVidWdnZXIKKyAgICAgICAgZGVidWcgPSBzZWxmLmdldGRlYnVnZ2VyKCkKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBPbmx5IGNsb3NlIHN1YnByb2Nlc3MgZGVidWdnZXIsIGRvbid0IHVucmVnaXN0ZXIgZ3VpX2FkYXAhCisgICAgICAgICAgICAgICAgUmVtb3RlRGVidWdnZXIuY2xvc2Vfc3VicHJvY2Vzc19kZWJ1Z2dlcihzZWxmLnJwY2NsdCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICMgS2lsbCBzdWJwcm9jZXNzLCBzcGF3biBhIG5ldyBvbmUsIGFjY2VwdCBjb25uZWN0aW9uLgorICAgICAgICBzZWxmLnJwY2NsdC5jbG9zZSgpCisgICAgICAgIHNlbGYudW5peF90ZXJtaW5hdGUoKQorICAgICAgICBjb25zb2xlID0gc2VsZi50a2NvbnNvbGUKKyAgICAgICAgd2FzX2V4ZWN1dGluZyA9IGNvbnNvbGUuZXhlY3V0aW5nCisgICAgICAgIGNvbnNvbGUuZXhlY3V0aW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5zcGF3bl9zdWJwcm9jZXNzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5ycGNjbHQuYWNjZXB0KCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0LCBlcnI6CisgICAgICAgICAgICBzZWxmLmRpc3BsYXlfbm9fc3VicHJvY2Vzc19lcnJvcigpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzZWxmLnRyYW5zZmVyX3BhdGgod2l0aF9jd2Q9d2l0aF9jd2QpCisgICAgICAgIGNvbnNvbGUuc3RvcF9yZWFkbGluZSgpCisgICAgICAgICMgYW5ub3RhdGUgcmVzdGFydCBpbiBzaGVsbCB3aW5kb3cgYW5kIG1hcmsgaXQKKyAgICAgICAgY29uc29sZS50ZXh0LmRlbGV0ZSgiaW9tYXJrIiwgImVuZC0xYyIpCisgICAgICAgIGlmIHdhc19leGVjdXRpbmc6CisgICAgICAgICAgICBjb25zb2xlLndyaXRlKCdcbicpCisgICAgICAgICAgICBjb25zb2xlLnNob3dwcm9tcHQoKQorICAgICAgICBoYWxmYmFyID0gKChpbnQoY29uc29sZS53aWR0aCkgLSAxNikgLy8gMikgKiAnPScKKyAgICAgICAgY29uc29sZS53cml0ZShoYWxmYmFyICsgJyBSRVNUQVJUICcgKyBoYWxmYmFyKQorICAgICAgICBjb25zb2xlLnRleHQubWFya19zZXQoInJlc3RhcnQiLCAiZW5kLTFjIikKKyAgICAgICAgY29uc29sZS50ZXh0Lm1hcmtfZ3Jhdml0eSgicmVzdGFydCIsICJsZWZ0IikKKyAgICAgICAgY29uc29sZS5zaG93cHJvbXB0KCkKKyAgICAgICAgIyByZXN0YXJ0IHN1YnByb2Nlc3MgZGVidWdnZXIKKyAgICAgICAgaWYgZGVidWc6CisgICAgICAgICAgICAjIFJlc3RhcnRlZCBkZWJ1Z2dlciBjb25uZWN0cyB0byBjdXJyZW50IGluc3RhbmNlIG9mIGRlYnVnIEdVSQorICAgICAgICAgICAgZ3VpID0gUmVtb3RlRGVidWdnZXIucmVzdGFydF9zdWJwcm9jZXNzX2RlYnVnZ2VyKHNlbGYucnBjY2x0KQorICAgICAgICAgICAgIyByZWxvYWQgcmVtb3RlIGRlYnVnZ2VyIGJyZWFrcG9pbnRzIGZvciBhbGwgUHlTaGVsbEVkaXRXaW5kb3dzCisgICAgICAgICAgICBkZWJ1Zy5sb2FkX2JyZWFrcG9pbnRzKCkKKyAgICAgICAgc2VsZi5jb21waWxlLmNvbXBpbGVyLmZsYWdzID0gc2VsZi5vcmlnaW5hbF9jb21waWxlcl9mbGFncworICAgICAgICBzZWxmLnJlc3RhcnRpbmcgPSBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi5ycGNjbHQKKworICAgIGRlZiBfX3JlcXVlc3RfaW50ZXJydXB0KHNlbGYpOgorICAgICAgICBzZWxmLnJwY2NsdC5yZW1vdGVjYWxsKCJleGVjIiwgImludGVycnVwdF90aGVfc2VydmVyIiwgKCksIHt9KQorCisgICAgZGVmIGludGVycnVwdF9zdWJwcm9jZXNzKHNlbGYpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLl9fcmVxdWVzdF9pbnRlcnJ1cHQpLnN0YXJ0KCkKKworICAgIGRlZiBraWxsX3N1YnByb2Nlc3Moc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucnBjY2x0LmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBubyBzb2NrZXQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi51bml4X3Rlcm1pbmF0ZSgpCisgICAgICAgIHNlbGYudGtjb25zb2xlLmV4ZWN1dGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYucnBjY2x0ID0gTm9uZQorCisgICAgZGVmIHVuaXhfdGVybWluYXRlKHNlbGYpOgorICAgICAgICAiVU5JWDogbWFrZSBzdXJlIHN1YnByb2Nlc3MgaXMgdGVybWluYXRlZCBhbmQgY29sbGVjdCBzdGF0dXMiCisgICAgICAgIGlmIGhhc2F0dHIob3MsICdraWxsJyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Mua2lsbChzZWxmLnJwY3BpZCwgU0lHVEVSTSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICMgcHJvY2VzcyBhbHJlYWR5IHRlcm1pbmF0ZWQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChzZWxmLnJwY3BpZCwgMCkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgdHJhbnNmZXJfcGF0aChzZWxmLCB3aXRoX2N3ZD1GYWxzZSk6CisgICAgICAgIGlmIHdpdGhfY3dkOiAgICAgICAgIyBJc3N1ZSAxMzUwNgorICAgICAgICAgICAgcGF0aCA9IFsnJ10gICAgICMgaW5jbHVkZSBDdXJyZW50IFdvcmtpbmcgRGlyZWN0b3J5CisgICAgICAgICAgICBwYXRoLmV4dGVuZChzeXMucGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBzeXMucGF0aAorCisgICAgICAgIHNlbGYucnVuY29tbWFuZCgiIiJpZiAxOgorICAgICAgICBpbXBvcnQgc3lzIGFzIF9zeXMKKyAgICAgICAgX3N5cy5wYXRoID0gJXIKKyAgICAgICAgZGVsIF9zeXMKKyAgICAgICAgXG4iIiIgJSAocGF0aCwpKQorCisgICAgYWN0aXZlX3NlcSA9IE5vbmUKKworICAgIGRlZiBwb2xsX3N1YnByb2Nlc3Moc2VsZik6CisgICAgICAgIGNsdCA9IHNlbGYucnBjY2x0CisgICAgICAgIGlmIGNsdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3BvbnNlID0gY2x0LnBvbGxyZXNwb25zZShzZWxmLmFjdGl2ZV9zZXEsIHdhaXQ9MC4wNSkKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgSU9FcnJvciwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgorICAgICAgICAgICAgIyBsb3N0IGNvbm5lY3Rpb24gb3Igc3VicHJvY2VzcyB0ZXJtaW5hdGVkIGl0c2VsZiwgcmVzdGFydAorICAgICAgICAgICAgIyBbdGhlIEtCSSBpcyBmcm9tIHJwYy5Tb2NrZXRJTy5oYW5kbGVfRU9GKCldCisgICAgICAgICAgICBpZiBzZWxmLnRrY29uc29sZS5jbG9zaW5nOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgcmVzcG9uc2UgPSBOb25lCisgICAgICAgICAgICBzZWxmLnJlc3RhcnRfc3VicHJvY2VzcygpCisgICAgICAgIGlmIHJlc3BvbnNlOgorICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUucmVzZXRvdXRwdXQoKQorICAgICAgICAgICAgc2VsZi5hY3RpdmVfc2VxID0gTm9uZQorICAgICAgICAgICAgaG93LCB3aGF0ID0gcmVzcG9uc2UKKyAgICAgICAgICAgIGNvbnNvbGUgPSBzZWxmLnRrY29uc29sZS5jb25zb2xlCisgICAgICAgICAgICBpZiBob3cgPT0gIk9LIjoKKyAgICAgICAgICAgICAgICBpZiB3aGF0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PmNvbnNvbGUsIHJlcHIod2hhdCkKKyAgICAgICAgICAgIGVsaWYgaG93ID09ICJFWENFUFRJT04iOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudGtjb25zb2xlLmdldHZhcigiPDx0b2dnbGUtaml0LXN0YWNrLXZpZXdlcj4+Iik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3RlX3N0YWNrX3ZpZXdlcigpCisgICAgICAgICAgICBlbGlmIGhvdyA9PSAiRVJST1IiOgorICAgICAgICAgICAgICAgIGVycm1zZyA9ICJQeVNoZWxsLk1vZGlmaWVkSW50ZXJwcmV0ZXI6IFN1YnByb2Nlc3MgRVJST1I6XG4iCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgZXJybXNnLCB3aGF0CisgICAgICAgICAgICAgICAgcHJpbnQgPj5jb25zb2xlLCBlcnJtc2csIHdoYXQKKyAgICAgICAgICAgICMgd2UgcmVjZWl2ZWQgYSByZXNwb25zZSB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBzZXEgbnVtYmVyOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLmVuZGV4ZWN1dGluZygpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6ICAjIHNoZWxsIG1heSBoYXZlIGNsb3NlZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBSZXNjaGVkdWxlIG15c2VsZgorICAgICAgICBpZiBub3Qgc2VsZi50a2NvbnNvbGUuY2xvc2luZzoKKyAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnRleHQuYWZ0ZXIoc2VsZi50a2NvbnNvbGUucG9sbGludGVydmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBvbGxfc3VicHJvY2VzcykKKworICAgIGRlYnVnZ2VyID0gTm9uZQorCisgICAgZGVmIHNldGRlYnVnZ2VyKHNlbGYsIGRlYnVnZ2VyKToKKyAgICAgICAgc2VsZi5kZWJ1Z2dlciA9IGRlYnVnZ2VyCisKKyAgICBkZWYgZ2V0ZGVidWdnZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRlYnVnZ2VyCisKKyAgICBkZWYgb3Blbl9yZW1vdGVfc3RhY2tfdmlld2VyKHNlbGYpOgorICAgICAgICAiIiJJbml0aWF0ZSB0aGUgcmVtb3RlIHN0YWNrIHZpZXdlciBmcm9tIGEgc2VwYXJhdGUgdGhyZWFkLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIHRoZSBzdWJwcm9jZXNzLCBhbmQgYnkgcmV0dXJuaW5nIGZyb20gdGhpcworICAgICAgICBtZXRob2Qgd2UgYWxsb3cgdGhlIHN1YnByb2Nlc3MgdG8gdW5ibG9jay4gIEFmdGVyIGEgYml0IHRoZSBzaGVsbAorICAgICAgICByZXF1ZXN0cyB0aGUgc3VicHJvY2VzcyB0byBvcGVuIHRoZSByZW1vdGUgc3RhY2sgdmlld2VyIHdoaWNoIHJldHVybnMgYQorICAgICAgICBzdGF0aWMgb2JqZWN0IGxvb2tpbmcgYXQgdGhlIGxhc3QgZXhjZXB0aW9uLiAgSXQgaXMgcXVlcmllZCB0aHJvdWdoCisgICAgICAgIHRoZSBSUEMgbWVjaGFuaXNtLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRrY29uc29sZS50ZXh0LmFmdGVyKDMwMCwgc2VsZi5yZW1vdGVfc3RhY2tfdmlld2VyKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiByZW1vdGVfc3RhY2tfdmlld2VyKHNlbGYpOgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IFJlbW90ZU9iamVjdEJyb3dzZXIKKyAgICAgICAgb2lkID0gc2VsZi5ycGNjbHQucmVtb3RlcXVldWUoImV4ZWMiLCAic3RhY2t2aWV3ZXIiLCAoImZsaXN0IiwpLCB7fSkKKyAgICAgICAgaWYgb2lkIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5yb290LmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGl0ZW0gPSBSZW1vdGVPYmplY3RCcm93c2VyLlN0dWJPYmplY3RUcmVlSXRlbShzZWxmLnJwY2NsdCwgb2lkKQorICAgICAgICBmcm9tIGlkbGVsaWIuVHJlZVdpZGdldCBpbXBvcnQgU2Nyb2xsZWRDYW52YXMsIFRyZWVOb2RlCisgICAgICAgIHRvcCA9IFRvcGxldmVsKHNlbGYudGtjb25zb2xlLnJvb3QpCisgICAgICAgIHRoZW1lID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnVGhlbWUnLCduYW1lJykKKyAgICAgICAgYmFja2dyb3VuZCA9IGlkbGVDb25mLkdldEhpZ2hsaWdodCh0aGVtZSwgJ25vcm1hbCcpWydiYWNrZ3JvdW5kJ10KKyAgICAgICAgc2MgPSBTY3JvbGxlZENhbnZhcyh0b3AsIGJnPWJhY2tncm91bmQsIGhpZ2hsaWdodHRoaWNrbmVzcz0wKQorICAgICAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICAgICAgbm9kZSA9IFRyZWVOb2RlKHNjLmNhbnZhcywgTm9uZSwgaXRlbSkKKyAgICAgICAgbm9kZS5leHBhbmQoKQorICAgICAgICAjIFhYWCBTaG91bGQgR0MgdGhlIHJlbW90ZSB0cmVlIHdoZW4gY2xvc2luZyB0aGUgd2luZG93CisKKyAgICBnaWQgPSAwCisKKyAgICBkZWYgZXhlY3NvdXJjZShzZWxmLCBzb3VyY2UpOgorICAgICAgICAiTGlrZSBydW5zb3VyY2UoKSBidXQgYXNzdW1lcyBjb21wbGV0ZSBleGVjIHNvdXJjZSIKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLnN0dWZmc291cmNlKHNvdXJjZSkKKyAgICAgICAgc2VsZi5leGVjZmlsZShmaWxlbmFtZSwgc291cmNlKQorCisgICAgZGVmIGV4ZWNmaWxlKHNlbGYsIGZpbGVuYW1lLCBzb3VyY2U9Tm9uZSk6CisgICAgICAgICJFeGVjdXRlIGFuIGV4aXN0aW5nIGZpbGUiCisgICAgICAgIGlmIHNvdXJjZSBpcyBOb25lOgorICAgICAgICAgICAgc291cmNlID0gb3BlbihmaWxlbmFtZSwgInIiKS5yZWFkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoc291cmNlLCBmaWxlbmFtZSwgImV4ZWMiKQorICAgICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFN5bnRheEVycm9yKToKKyAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgICAgIHRrZXJyID0gc2VsZi50a2NvbnNvbGUuc3RkZXJyCisgICAgICAgICAgICBwcmludD4+dGtlcnIsICcqKiogRXJyb3IgaW4gc2NyaXB0IG9yIGNvbW1hbmQhXG4nCisgICAgICAgICAgICBwcmludD4+dGtlcnIsICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6JworICAgICAgICAgICAgSW50ZXJhY3RpdmVJbnRlcnByZXRlci5zaG93c3ludGF4ZXJyb3Ioc2VsZiwgZmlsZW5hbWUpCisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5zaG93cHJvbXB0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucnVuY29kZShjb2RlKQorCisgICAgZGVmIHJ1bnNvdXJjZShzZWxmLCBzb3VyY2UpOgorICAgICAgICAiRXh0ZW5kIGJhc2UgY2xhc3MgbWV0aG9kOiBTdHVmZiB0aGUgc291cmNlIGluIHRoZSBsaW5lIGNhY2hlIGZpcnN0IgorICAgICAgICBmaWxlbmFtZSA9IHNlbGYuc3R1ZmZzb3VyY2Uoc291cmNlKQorICAgICAgICBzZWxmLm1vcmUgPSAwCisgICAgICAgIHNlbGYuc2F2ZV93YXJuaW5nc19maWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncyhhY3Rpb249ImVycm9yIiwgY2F0ZWdvcnk9U3ludGF4V2FybmluZykKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzb3VyY2UsIHR5cGVzLlVuaWNvZGVUeXBlKToKKyAgICAgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgSU9CaW5kaW5nCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc291cmNlID0gc291cmNlLmVuY29kZShJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCJVbnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGluIGlucHV0XG4iKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEludGVyYWN0aXZlSW50ZXJwcmV0ZXIucnVuc291cmNlKCkgY2FsbHMgaXRzIHJ1bmNvZGUoKSBtZXRob2QsCisgICAgICAgICAgICAjIHdoaWNoIGlzIG92ZXJyaWRkZW4gKHNlZSBiZWxvdykKKyAgICAgICAgICAgIHJldHVybiBJbnRlcmFjdGl2ZUludGVycHJldGVyLnJ1bnNvdXJjZShzZWxmLCBzb3VyY2UsIGZpbGVuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgc2VsZi5zYXZlX3dhcm5pbmdzX2ZpbHRlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IHNlbGYuc2F2ZV93YXJuaW5nc19maWx0ZXJzCisgICAgICAgICAgICAgICAgc2VsZi5zYXZlX3dhcm5pbmdzX2ZpbHRlcnMgPSBOb25lCisKKyAgICBkZWYgc3R1ZmZzb3VyY2Uoc2VsZiwgc291cmNlKToKKyAgICAgICAgIlN0dWZmIHNvdXJjZSBpbiB0aGUgZmlsZW5hbWUgY2FjaGUiCisgICAgICAgIGZpbGVuYW1lID0gIjxweXNoZWxsIyVkPiIgJSBzZWxmLmdpZAorICAgICAgICBzZWxmLmdpZCA9IHNlbGYuZ2lkICsgMQorICAgICAgICBsaW5lcyA9IHNvdXJjZS5zcGxpdCgiXG4iKQorICAgICAgICBsaW5lY2FjaGUuY2FjaGVbZmlsZW5hbWVdID0gbGVuKHNvdXJjZSkrMSwgMCwgbGluZXMsIGZpbGVuYW1lCisgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIHByZXBlbmRfc3lzcGF0aChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICJQcmVwZW5kIHN5cy5wYXRoIHdpdGggZmlsZSdzIGRpcmVjdG9yeSBpZiBub3QgYWxyZWFkeSBpbmNsdWRlZCIKKyAgICAgICAgc2VsZi5ydW5jb21tYW5kKCIiImlmIDE6CisgICAgICAgICAgICBfZmlsZW5hbWUgPSAlcgorICAgICAgICAgICAgaW1wb3J0IHN5cyBhcyBfc3lzCisgICAgICAgICAgICBmcm9tIG9zLnBhdGggaW1wb3J0IGRpcm5hbWUgYXMgX2Rpcm5hbWUKKyAgICAgICAgICAgIF9kaXIgPSBfZGlybmFtZShfZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3QgX2RpciBpbiBfc3lzLnBhdGg6CisgICAgICAgICAgICAgICAgX3N5cy5wYXRoLmluc2VydCgwLCBfZGlyKQorICAgICAgICAgICAgZGVsIF9maWxlbmFtZSwgX3N5cywgX2Rpcm5hbWUsIF9kaXIKKyAgICAgICAgICAgIFxuIiIiICUgKGZpbGVuYW1lLCkpCisKKyAgICBkZWYgc2hvd3N5bnRheGVycm9yKHNlbGYsIGZpbGVuYW1lPU5vbmUpOgorICAgICAgICAiIiJFeHRlbmQgYmFzZSBjbGFzcyBtZXRob2Q6IEFkZCBDb2xvcml6aW5nCisKKyAgICAgICAgQ29sb3IgdGhlIG9mZmVuZGluZyBwb3NpdGlvbiBpbnN0ZWFkIG9mIHByaW50aW5nIGl0IGFuZCBwb2ludGluZyBhdCBpdAorICAgICAgICB3aXRoIGEgY2FyZXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRleHQgPSBzZWxmLnRrY29uc29sZS50ZXh0CisgICAgICAgIHN0dWZmID0gc2VsZi51bnBhY2tlcnJvcigpCisgICAgICAgIGlmIHN0dWZmOgorICAgICAgICAgICAgbXNnLCBsaW5lbm8sIG9mZnNldCwgbGluZSA9IHN0dWZmCisgICAgICAgICAgICBpZiBsaW5lbm8gPT0gMToKKyAgICAgICAgICAgICAgICBwb3MgPSAiaW9tYXJrICsgJWQgY2hhcnMiICUgKG9mZnNldC0xKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwb3MgPSAiaW9tYXJrIGxpbmVzdGFydCArICVkIGxpbmVzICsgJWQgY2hhcnMiICUgXAorICAgICAgICAgICAgICAgICAgICAgIChsaW5lbm8tMSwgb2Zmc2V0LTEpCisgICAgICAgICAgICB0ZXh0LnRhZ19hZGQoIkVSUk9SIiwgcG9zKQorICAgICAgICAgICAgdGV4dC5zZWUocG9zKQorICAgICAgICAgICAgY2hhciA9IHRleHQuZ2V0KHBvcykKKyAgICAgICAgICAgIGlmIGNoYXIgYW5kIGNoYXIgaW4gSURFTlRDSEFSUzoKKyAgICAgICAgICAgICAgICB0ZXh0LnRhZ19hZGQoIkVSUk9SIiwgcG9zICsgIiB3b3Jkc3RhcnQiLCBwb3MpCisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5yZXNldG91dHB1dCgpCisgICAgICAgICAgICBzZWxmLndyaXRlKCJTeW50YXhFcnJvcjogJXNcbiIgJSBzdHIobXNnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgICAgIEludGVyYWN0aXZlSW50ZXJwcmV0ZXIuc2hvd3N5bnRheGVycm9yKHNlbGYsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLnRrY29uc29sZS5zaG93cHJvbXB0KCkKKworICAgIGRlZiB1bnBhY2tlcnJvcihzZWxmKToKKyAgICAgICAgdHlwZSwgdmFsdWUsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgb2sgPSB0eXBlIGlzIFN5bnRheEVycm9yCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1zZywgKGR1bW15X2ZpbGVuYW1lLCBsaW5lbm8sIG9mZnNldCwgbGluZSkgPSB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBvZmZzZXQ6CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IDAKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBvayA9IDAKKyAgICAgICAgaWYgb2s6CisgICAgICAgICAgICByZXR1cm4gbXNnLCBsaW5lbm8sIG9mZnNldCwgbGluZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBzaG93dHJhY2ViYWNrKHNlbGYpOgorICAgICAgICAiRXh0ZW5kIGJhc2UgY2xhc3MgbWV0aG9kIHRvIHJlc2V0IG91dHB1dCBwcm9wZXJseSIKKyAgICAgICAgc2VsZi50a2NvbnNvbGUucmVzZXRvdXRwdXQoKQorICAgICAgICBzZWxmLmNoZWNrbGluZWNhY2hlKCkKKyAgICAgICAgSW50ZXJhY3RpdmVJbnRlcnByZXRlci5zaG93dHJhY2ViYWNrKHNlbGYpCisgICAgICAgIGlmIHNlbGYudGtjb25zb2xlLmdldHZhcigiPDx0b2dnbGUtaml0LXN0YWNrLXZpZXdlcj4+Iik6CisgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5vcGVuX3N0YWNrX3ZpZXdlcigpCisKKyAgICBkZWYgY2hlY2tsaW5lY2FjaGUoc2VsZik6CisgICAgICAgIGMgPSBsaW5lY2FjaGUuY2FjaGUKKyAgICAgICAgZm9yIGtleSBpbiBjLmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleVs6MV0gKyBrZXlbLTE6XSAhPSAiPD4iOgorICAgICAgICAgICAgICAgIGRlbCBjW2tleV0KKworICAgIGRlZiBydW5jb21tYW5kKHNlbGYsIGNvZGUpOgorICAgICAgICAiUnVuIHRoZSBjb2RlIHdpdGhvdXQgaW52b2tpbmcgdGhlIGRlYnVnZ2VyIgorICAgICAgICAjIFRoZSBjb2RlIGJldHRlciBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIQorICAgICAgICBpZiBzZWxmLnRrY29uc29sZS5leGVjdXRpbmc6CisgICAgICAgICAgICBzZWxmLmRpc3BsYXlfZXhlY3V0aW5nX2RpYWxvZygpCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBzZWxmLnJwY2NsdDoKKyAgICAgICAgICAgIHNlbGYucnBjY2x0LnJlbW90ZXF1ZXVlKCJleGVjIiwgInJ1bmNvZGUiLCAoY29kZSwpLCB7fSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBzZWxmLmxvY2FscworICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIHJ1bmNvZGUoc2VsZiwgY29kZSk6CisgICAgICAgICJPdmVycmlkZSBiYXNlIGNsYXNzIG1ldGhvZCIKKyAgICAgICAgaWYgc2VsZi50a2NvbnNvbGUuZXhlY3V0aW5nOgorICAgICAgICAgICAgc2VsZi5pbnRlcnAucmVzdGFydF9zdWJwcm9jZXNzKCkKKyAgICAgICAgc2VsZi5jaGVja2xpbmVjYWNoZSgpCisgICAgICAgIGlmIHNlbGYuc2F2ZV93YXJuaW5nc19maWx0ZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IHNlbGYuc2F2ZV93YXJuaW5nc19maWx0ZXJzCisgICAgICAgICAgICBzZWxmLnNhdmVfd2FybmluZ3NfZmlsdGVycyA9IE5vbmUKKyAgICAgICAgZGVidWdnZXIgPSBzZWxmLmRlYnVnZ2VyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLmJlZ2luZXhlY3V0aW5nKCkKKyAgICAgICAgICAgIGlmIG5vdCBkZWJ1Z2dlciBhbmQgc2VsZi5ycGNjbHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hY3RpdmVfc2VxID0gc2VsZi5ycGNjbHQuYXN5bmNxdWV1ZSgiZXhlYyIsICJydW5jb2RlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUsKSwge30pCisgICAgICAgICAgICBlbGlmIGRlYnVnZ2VyOgorICAgICAgICAgICAgICAgIGRlYnVnZ2VyLnJ1bihjb2RlLCBzZWxmLmxvY2FscykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhlYyBjb2RlIGluIHNlbGYubG9jYWxzCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgaWYgbm90IHNlbGYudGtjb25zb2xlLmNsb3Npbmc6CisgICAgICAgICAgICAgICAgaWYgdGtNZXNzYWdlQm94LmFza3llc25vKAorICAgICAgICAgICAgICAgICAgICAiRXhpdD8iLAorICAgICAgICAgICAgICAgICAgICAiRG8geW91IHdhbnQgdG8gZXhpdCBhbHRvZ2V0aGVyPyIsCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9InllcyIsCisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcj1zZWxmLnRrY29uc29sZS50ZXh0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3d0cmFjZWJhY2soKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiB1c2Vfc3VicHJvY2VzczoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYudGtjb25zb2xlLnN0ZGVyciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJJRExFIGludGVybmFsIGVycm9yIGluIHJ1bmNvZGUoKSIKKyAgICAgICAgICAgICAgICBzZWxmLnNob3d0cmFjZWJhY2soKQorICAgICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLmVuZGV4ZWN1dGluZygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYudGtjb25zb2xlLmNhbmNlbGVkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5jYW5jZWxlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi50a2NvbnNvbGUuc3RkZXJyLCAiS2V5Ym9hcmRJbnRlcnJ1cHQiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaG93dHJhY2ViYWNrKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCB1c2Vfc3VicHJvY2VzczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGtjb25zb2xlLmVuZGV4ZWN1dGluZygpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiAgIyBzaGVsbCBtYXkgaGF2ZSBjbG9zZWQKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICAiT3ZlcnJpZGUgYmFzZSBjbGFzcyBtZXRob2QiCisgICAgICAgIHNlbGYudGtjb25zb2xlLnN0ZGVyci53cml0ZShzKQorCisgICAgZGVmIGRpc3BsYXlfcG9ydF9iaW5kaW5nX2Vycm9yKHNlbGYpOgorICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKAorICAgICAgICAgICAgIlBvcnQgQmluZGluZyBFcnJvciIsCisgICAgICAgICAgICAiSURMRSBjYW4ndCBiaW5kIHRvIGEgVENQL0lQIHBvcnQsIHdoaWNoIGlzIG5lY2Vzc2FyeSB0byAiCisgICAgICAgICAgICAiY29tbXVuaWNhdGUgd2l0aCBpdHMgUHl0aG9uIGV4ZWN1dGlvbiBzZXJ2ZXIuICBUaGlzIG1pZ2h0IGJlICIKKyAgICAgICAgICAgICJiZWNhdXNlIG5vIG5ldHdvcmtpbmcgaXMgaW5zdGFsbGVkIG9uIHRoaXMgY29tcHV0ZXIuICAiCisgICAgICAgICAgICAiUnVuIElETEUgd2l0aCB0aGUgLW4gY29tbWFuZCBsaW5lIHN3aXRjaCB0byBzdGFydCB3aXRob3V0IGEgIgorICAgICAgICAgICAgInN1YnByb2Nlc3MgYW5kIHJlZmVyIHRvIEhlbHAvSURMRSBIZWxwICdSdW5uaW5nIHdpdGhvdXQgYSAiCisgICAgICAgICAgICAic3VicHJvY2VzcycgZm9yIGZ1cnRoZXIgZGV0YWlscy4iLAorICAgICAgICAgICAgbWFzdGVyPXNlbGYudGtjb25zb2xlLnRleHQpCisKKyAgICBkZWYgZGlzcGxheV9ub19zdWJwcm9jZXNzX2Vycm9yKHNlbGYpOgorICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKAorICAgICAgICAgICAgIlN1YnByb2Nlc3MgU3RhcnR1cCBFcnJvciIsCisgICAgICAgICAgICAiSURMRSdzIHN1YnByb2Nlc3MgZGlkbid0IG1ha2UgY29ubmVjdGlvbi4gIEVpdGhlciBJRExFIGNhbid0ICIKKyAgICAgICAgICAgICJzdGFydCBhIHN1YnByb2Nlc3Mgb3IgcGVyc29uYWwgZmlyZXdhbGwgc29mdHdhcmUgaXMgYmxvY2tpbmcgIgorICAgICAgICAgICAgInRoZSBjb25uZWN0aW9uLiIsCisgICAgICAgICAgICBtYXN0ZXI9c2VsZi50a2NvbnNvbGUudGV4dCkKKworICAgIGRlZiBkaXNwbGF5X2V4ZWN1dGluZ19kaWFsb2coc2VsZik6CisgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoCisgICAgICAgICAgICAiQWxyZWFkeSBleGVjdXRpbmciLAorICAgICAgICAgICAgIlRoZSBQeXRob24gU2hlbGwgd2luZG93IGlzIGFscmVhZHkgZXhlY3V0aW5nIGEgY29tbWFuZDsgIgorICAgICAgICAgICAgInBsZWFzZSB3YWl0IHVudGlsIGl0IGlzIGZpbmlzaGVkLiIsCisgICAgICAgICAgICBtYXN0ZXI9c2VsZi50a2NvbnNvbGUudGV4dCkKKworCitjbGFzcyBQeVNoZWxsKE91dHB1dFdpbmRvdyk6CisKKyAgICBzaGVsbF90aXRsZSA9ICJQeXRob24gIiArIHB5dGhvbl92ZXJzaW9uKCkgKyAiIFNoZWxsIgorCisgICAgIyBPdmVycmlkZSBjbGFzc2VzCisgICAgQ29sb3JEZWxlZ2F0b3IgPSBNb2RpZmllZENvbG9yRGVsZWdhdG9yCisgICAgVW5kb0RlbGVnYXRvciA9IE1vZGlmaWVkVW5kb0RlbGVnYXRvcgorCisgICAgIyBPdmVycmlkZSBtZW51cworICAgIG1lbnVfc3BlY3MgPSBbCisgICAgICAgICgiZmlsZSIsICJfRmlsZSIpLAorICAgICAgICAoImVkaXQiLCAiX0VkaXQiKSwKKyAgICAgICAgKCJkZWJ1ZyIsICJfRGVidWciKSwKKyAgICAgICAgKCJvcHRpb25zIiwgIl9PcHRpb25zIiksCisgICAgICAgICgid2luZG93cyIsICJfV2luZG93cyIpLAorICAgICAgICAoImhlbHAiLCAiX0hlbHAiKSwKKyAgICBdCisKKyAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICBkZWwgbWVudV9zcGVjc1stM10KKyAgICAgICAgbWVudV9zcGVjc1stMl0gPSAoIndpbmRvd3MiLCAiX1dpbmRvdyIpCisKKworICAgICMgTmV3IGNsYXNzZXMKKyAgICBmcm9tIGlkbGVsaWIuSWRsZUhpc3RvcnkgaW1wb3J0IEhpc3RvcnkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbGlzdD1Ob25lKToKKyAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICBtcyA9IHNlbGYubWVudV9zcGVjcworICAgICAgICAgICAgaWYgbXNbMl1bMF0gIT0gInNoZWxsIjoKKyAgICAgICAgICAgICAgICBtcy5pbnNlcnQoMiwgKCJzaGVsbCIsICJTaGVfbGwiKSkKKyAgICAgICAgc2VsZi5pbnRlcnAgPSBNb2RpZmllZEludGVycHJldGVyKHNlbGYpCisgICAgICAgIGlmIGZsaXN0IGlzIE5vbmU6CisgICAgICAgICAgICByb290ID0gVGsoKQorICAgICAgICAgICAgZml4d29yZGJyZWFrcyhyb290KQorICAgICAgICAgICAgcm9vdC53aXRoZHJhdygpCisgICAgICAgICAgICBmbGlzdCA9IFB5U2hlbGxGaWxlTGlzdChyb290KQorICAgICAgICAjCisgICAgICAgIE91dHB1dFdpbmRvdy5fX2luaXRfXyhzZWxmLCBmbGlzdCwgTm9uZSwgTm9uZSkKKyAgICAgICAgIworIyMgICAgICAgIHNlbGYuY29uZmlnKHVzZXRhYnM9MSwgaW5kZW50d2lkdGg9OCwgY29udGV4dF91c2VfcHMxPTEpCisgICAgICAgIHNlbGYudXNldGFicyA9IFRydWUKKyAgICAgICAgIyBpbmRlbnR3aWR0aCBtdXN0IGJlIDggd2hlbiB1c2luZyB0YWJzLiAgU2VlIG5vdGUgaW4gRWRpdG9yV2luZG93OgorICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gOAorICAgICAgICBzZWxmLmNvbnRleHRfdXNlX3BzMSA9IFRydWUKKyAgICAgICAgIworICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHRleHQuY29uZmlndXJlKHdyYXA9ImNoYXIiKQorICAgICAgICB0ZXh0LmJpbmQoIjw8bmV3bGluZS1hbmQtaW5kZW50Pj4iLCBzZWxmLmVudGVyX2NhbGxiYWNrKQorICAgICAgICB0ZXh0LmJpbmQoIjw8cGxhaW4tbmV3bGluZS1hbmQtaW5kZW50Pj4iLCBzZWxmLmxpbmVmZWVkX2NhbGxiYWNrKQorICAgICAgICB0ZXh0LmJpbmQoIjw8aW50ZXJydXB0LWV4ZWN1dGlvbj4+Iiwgc2VsZi5jYW5jZWxfY2FsbGJhY2spCisgICAgICAgIHRleHQuYmluZCgiPDxlbmQtb2YtZmlsZT4+Iiwgc2VsZi5lb2ZfY2FsbGJhY2spCisgICAgICAgIHRleHQuYmluZCgiPDxvcGVuLXN0YWNrLXZpZXdlcj4+Iiwgc2VsZi5vcGVuX3N0YWNrX3ZpZXdlcikKKyAgICAgICAgdGV4dC5iaW5kKCI8PHRvZ2dsZS1kZWJ1Z2dlcj4+Iiwgc2VsZi50b2dnbGVfZGVidWdnZXIpCisgICAgICAgIHRleHQuYmluZCgiPDx0b2dnbGUtaml0LXN0YWNrLXZpZXdlcj4+Iiwgc2VsZi50b2dnbGVfaml0X3N0YWNrX3ZpZXdlcikKKyAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICB0ZXh0LmJpbmQoIjw8dmlldy1yZXN0YXJ0Pj4iLCBzZWxmLnZpZXdfcmVzdGFydF9tYXJrKQorICAgICAgICAgICAgdGV4dC5iaW5kKCI8PHJlc3RhcnQtc2hlbGw+PiIsIHNlbGYucmVzdGFydF9zaGVsbCkKKyAgICAgICAgIworICAgICAgICBzZWxmLnNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLnNhdmVfc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICBzZWxmLnNhdmVfc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCBJT0JpbmRpbmcKKyAgICAgICAgc2VsZi5zdGRpbiA9IFBzZXVkb0lucHV0RmlsZShzZWxmLCAic3RkaW4iLCBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuc3Rkb3V0ID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAic3Rkb3V0IiwgSU9CaW5kaW5nLmVuY29kaW5nKQorICAgICAgICBzZWxmLnN0ZGVyciA9IFBzZXVkb091dHB1dEZpbGUoc2VsZiwgInN0ZGVyciIsIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgc2VsZi5jb25zb2xlID0gUHNldWRvT3V0cHV0RmlsZShzZWxmLCAiY29uc29sZSIsIElPQmluZGluZy5lbmNvZGluZykKKyAgICAgICAgaWYgbm90IHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5zdGRlcnIKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IHNlbGYuc3RkaW4KKyAgICAgICAgIworICAgICAgICBzZWxmLmhpc3RvcnkgPSBzZWxmLkhpc3Rvcnkoc2VsZi50ZXh0KQorICAgICAgICAjCisgICAgICAgIHNlbGYucG9sbGludGVydmFsID0gNTAgICMgbWlsbGlzZWMKKworICAgIGRlZiBnZXRfc3RhbmRhcmRfZXh0ZW5zaW9uX25hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gaWRsZUNvbmYuR2V0RXh0ZW5zaW9ucyhzaGVsbF9vbmx5PVRydWUpCisKKyAgICByZWFkaW5nID0gRmFsc2UKKyAgICBleGVjdXRpbmcgPSBGYWxzZQorICAgIGNhbmNlbGVkID0gRmFsc2UKKyAgICBlbmRvZmZpbGUgPSBGYWxzZQorICAgIGNsb3NpbmcgPSBGYWxzZQorICAgIF9zdG9wX3JlYWRsaW5lX2ZsYWcgPSBGYWxzZQorCisgICAgZGVmIHNldF93YXJuaW5nX3N0cmVhbShzZWxmLCBzdHJlYW0pOgorICAgICAgICBnbG9iYWwgd2FybmluZ19zdHJlYW0KKyAgICAgICAgd2FybmluZ19zdHJlYW0gPSBzdHJlYW0KKworICAgIGRlZiBnZXRfd2FybmluZ19zdHJlYW0oc2VsZik6CisgICAgICAgIHJldHVybiB3YXJuaW5nX3N0cmVhbQorCisgICAgZGVmIHRvZ2dsZV9kZWJ1Z2dlcihzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5leGVjdXRpbmc6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJEb24ndCBkZWJ1ZyBub3ciLAorICAgICAgICAgICAgICAgICJZb3UgY2FuIG9ubHkgdG9nZ2xlIHRoZSBkZWJ1Z2dlciB3aGVuIGlkbGUiLAorICAgICAgICAgICAgICAgIG1hc3Rlcj1zZWxmLnRleHQpCisgICAgICAgICAgICBzZWxmLnNldF9kZWJ1Z2dlcl9pbmRpY2F0b3IoKQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRiID0gc2VsZi5pbnRlcnAuZ2V0ZGVidWdnZXIoKQorICAgICAgICAgICAgaWYgZGI6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZV9kZWJ1Z2dlcigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYub3Blbl9kZWJ1Z2dlcigpCisKKyAgICBkZWYgc2V0X2RlYnVnZ2VyX2luZGljYXRvcihzZWxmKToKKyAgICAgICAgZGIgPSBzZWxmLmludGVycC5nZXRkZWJ1Z2dlcigpCisgICAgICAgIHNlbGYuc2V0dmFyKCI8PHRvZ2dsZS1kZWJ1Z2dlcj4+Iiwgbm90IG5vdCBkYikKKworICAgIGRlZiB0b2dnbGVfaml0X3N0YWNrX3ZpZXdlcihzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgcGFzcyAjIEFsbCB3ZSBuZWVkIGlzIHRoZSB2YXJpYWJsZQorCisgICAgZGVmIGNsb3NlX2RlYnVnZ2VyKHNlbGYpOgorICAgICAgICBkYiA9IHNlbGYuaW50ZXJwLmdldGRlYnVnZ2VyKCkKKyAgICAgICAgaWYgZGI6CisgICAgICAgICAgICBzZWxmLmludGVycC5zZXRkZWJ1Z2dlcihOb25lKQorICAgICAgICAgICAgZGIuY2xvc2UoKQorICAgICAgICAgICAgaWYgc2VsZi5pbnRlcnAucnBjY2x0OgorICAgICAgICAgICAgICAgIFJlbW90ZURlYnVnZ2VyLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcihzZWxmLmludGVycC5ycGNjbHQpCisgICAgICAgICAgICBzZWxmLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgICAgIHNlbGYuY29uc29sZS53cml0ZSgiW0RFQlVHIE9GRl1cbiIpCisgICAgICAgICAgICBzeXMucHMxID0gIj4+PiAiCisgICAgICAgICAgICBzZWxmLnNob3dwcm9tcHQoKQorICAgICAgICBzZWxmLnNldF9kZWJ1Z2dlcl9pbmRpY2F0b3IoKQorCisgICAgZGVmIG9wZW5fZGVidWdnZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW50ZXJwLnJwY2NsdDoKKyAgICAgICAgICAgIGRiZ19ndWkgPSBSZW1vdGVEZWJ1Z2dlci5zdGFydF9yZW1vdGVfZGVidWdnZXIoc2VsZi5pbnRlcnAucnBjY2x0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGJnX2d1aSA9IERlYnVnZ2VyLkRlYnVnZ2VyKHNlbGYpCisgICAgICAgIHNlbGYuaW50ZXJwLnNldGRlYnVnZ2VyKGRiZ19ndWkpCisgICAgICAgIGRiZ19ndWkubG9hZF9icmVha3BvaW50cygpCisgICAgICAgIHN5cy5wczEgPSAiW0RFQlVHIE9OXVxuPj4+ICIKKyAgICAgICAgc2VsZi5zaG93cHJvbXB0KCkKKyAgICAgICAgc2VsZi5zZXRfZGVidWdnZXJfaW5kaWNhdG9yKCkKKworICAgIGRlZiBiZWdpbmV4ZWN1dGluZyhzZWxmKToKKyAgICAgICAgIkhlbHBlciBmb3IgTW9kaWZpZWRJbnRlcnByZXRlciIKKyAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCisgICAgICAgIHNlbGYuZXhlY3V0aW5nID0gMQorCisgICAgZGVmIGVuZGV4ZWN1dGluZyhzZWxmKToKKyAgICAgICAgIkhlbHBlciBmb3IgTW9kaWZpZWRJbnRlcnByZXRlciIKKyAgICAgICAgc2VsZi5leGVjdXRpbmcgPSAwCisgICAgICAgIHNlbGYuY2FuY2VsZWQgPSAwCisgICAgICAgIHNlbGYuc2hvd3Byb21wdCgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICJFeHRlbmQgRWRpdG9yV2luZG93LmNsb3NlKCkiCisgICAgICAgIGlmIHNlbGYuZXhlY3V0aW5nOgorICAgICAgICAgICAgcmVzcG9uc2UgPSB0a01lc3NhZ2VCb3guYXNrb2tjYW5jZWwoCisgICAgICAgICAgICAgICAgIktpbGw/IiwKKyAgICAgICAgICAgICAgICAiVGhlIHByb2dyYW0gaXMgc3RpbGwgcnVubmluZyFcbiBEbyB5b3Ugd2FudCB0byBraWxsIGl0PyIsCisgICAgICAgICAgICAgICAgZGVmYXVsdD0ib2siLAorICAgICAgICAgICAgICAgIHBhcmVudD1zZWxmLnRleHQpCisgICAgICAgICAgICBpZiByZXNwb25zZSBpcyBGYWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gImNhbmNlbCIKKyAgICAgICAgc2VsZi5zdG9wX3JlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5jYW5jZWxlZCA9IFRydWUKKyAgICAgICAgc2VsZi5jbG9zaW5nID0gVHJ1ZQorICAgICAgICAjIFdhaXQgZm9yIHBvbGxfc3VicHJvY2VzcygpIHJlc2NoZWR1bGluZyB0byBzdG9wCisgICAgICAgIHNlbGYudGV4dC5hZnRlcigyICogc2VsZi5wb2xsaW50ZXJ2YWwsIHNlbGYuY2xvc2UyKQorCisgICAgZGVmIGNsb3NlMihzZWxmKToKKyAgICAgICAgcmV0dXJuIEVkaXRvcldpbmRvdy5jbG9zZShzZWxmKQorCisgICAgZGVmIF9jbG9zZShzZWxmKToKKyAgICAgICAgIkV4dGVuZCBFZGl0b3JXaW5kb3cuX2Nsb3NlKCksIHNodXQgZG93biBkZWJ1Z2dlciBhbmQgZXhlY3V0aW9uIHNlcnZlciIKKyAgICAgICAgc2VsZi5jbG9zZV9kZWJ1Z2dlcigpCisgICAgICAgIGlmIHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgc2VsZi5pbnRlcnAua2lsbF9zdWJwcm9jZXNzKCkKKyAgICAgICAgIyBSZXN0b3JlIHN0ZCBzdHJlYW1zCisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLnNhdmVfc3Rkb3V0CisgICAgICAgIHN5cy5zdGRlcnIgPSBzZWxmLnNhdmVfc3RkZXJyCisgICAgICAgIHN5cy5zdGRpbiA9IHNlbGYuc2F2ZV9zdGRpbgorICAgICAgICAjIEJyZWFrIGN5Y2xlcworICAgICAgICBzZWxmLmludGVycCA9IE5vbmUKKyAgICAgICAgc2VsZi5jb25zb2xlID0gTm9uZQorICAgICAgICBzZWxmLmZsaXN0LnB5c2hlbGwgPSBOb25lCisgICAgICAgIHNlbGYuaGlzdG9yeSA9IE5vbmUKKyAgICAgICAgRWRpdG9yV2luZG93Ll9jbG9zZShzZWxmKQorCisgICAgZGVmIGlzcHl0aG9uc291cmNlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIk92ZXJyaWRlIEVkaXRvcldpbmRvdyBtZXRob2Q6IG5ldmVyIHJlbW92ZSB0aGUgY29sb3JpemVyIgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHNob3J0X3RpdGxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zaGVsbF90aXRsZQorCisgICAgQ09QWVJJR0hUID0gXAorICAgICAgICAgICdUeXBlICJjb3B5cmlnaHQiLCAiY3JlZGl0cyIgb3IgImxpY2Vuc2UoKSIgZm9yIG1vcmUgaW5mb3JtYXRpb24uJworCisgICAgZGVmIGJlZ2luKHNlbGYpOgorICAgICAgICBzZWxmLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICBub3N1YiA9ICcnCisgICAgICAgICAgICBjbGllbnQgPSBzZWxmLmludGVycC5zdGFydF9zdWJwcm9jZXNzKCkKKyAgICAgICAgICAgIGlmIG5vdCBjbGllbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub3N1YiA9ICI9PT09IE5vIFN1YnByb2Nlc3MgPT09PSIKKyAgICAgICAgc2VsZi53cml0ZSgiUHl0aG9uICVzIG9uICVzXG4lc1xuJXMiICUKKyAgICAgICAgICAgICAgICAgICAoc3lzLnZlcnNpb24sIHN5cy5wbGF0Zm9ybSwgc2VsZi5DT1BZUklHSFQsIG5vc3ViKSkKKyAgICAgICAgc2VsZi5zaG93cHJvbXB0KCkKKyAgICAgICAgaW1wb3J0IFRraW50ZXIKKyAgICAgICAgVGtpbnRlci5fZGVmYXVsdF9yb290ID0gTm9uZSAjIDAzSmFuMDQgS0JLIFdoYXQncyB0aGlzPworICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHN0b3BfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnJlYWRpbmc6ICAjIG5vIG5lc3RlZCBtYWlubG9vcCB0byBleGl0LgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3N0b3BfcmVhZGxpbmVfZmxhZyA9IFRydWUKKyAgICAgICAgc2VsZi50b3AucXVpdCgpCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHNhdmUgPSBzZWxmLnJlYWRpbmcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZWFkaW5nID0gMQorICAgICAgICAgICAgc2VsZi50b3AubWFpbmxvb3AoKSAgIyBuZXN0ZWQgbWFpbmxvb3AoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWFkaW5nID0gc2F2ZQorICAgICAgICBpZiBzZWxmLl9zdG9wX3JlYWRsaW5lX2ZsYWc6CisgICAgICAgICAgICBzZWxmLl9zdG9wX3JlYWRsaW5lX2ZsYWcgPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIGxpbmUgPSBzZWxmLnRleHQuZ2V0KCJpb21hcmsiLCAiZW5kLTFjIikKKyAgICAgICAgaWYgbGVuKGxpbmUpID09IDA6ICAjIG1heSBiZSBFT0YgaWYgd2UgcXVpdCBvdXIgbWFpbmxvb3Agd2l0aCBDdHJsLUMKKyAgICAgICAgICAgIGxpbmUgPSAiXG4iCisgICAgICAgIGlmIGlzaW5zdGFuY2UobGluZSwgdW5pY29kZSk6CisgICAgICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IElPQmluZGluZworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLmVuY29kZShJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCisgICAgICAgIGlmIHNlbGYuY2FuY2VsZWQ6CisgICAgICAgICAgICBzZWxmLmNhbmNlbGVkID0gMAorICAgICAgICAgICAgaWYgbm90IHVzZV9zdWJwcm9jZXNzOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIGlmIHNlbGYuZW5kb2ZmaWxlOgorICAgICAgICAgICAgc2VsZi5lbmRvZmZpbGUgPSAwCisgICAgICAgICAgICBsaW5lID0gIiIKKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiBpc2F0dHkoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgY2FuY2VsX2NhbGxiYWNrKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZSgic2VsLmZpcnN0IiwgIiE9IiwgInNlbC5sYXN0Iik6CisgICAgICAgICAgICAgICAgcmV0dXJuICMgQWN0aXZlIHNlbGVjdGlvbiAtLSBhbHdheXMgdXNlIGRlZmF1bHQgYmluZGluZworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIG5vdCAoc2VsZi5leGVjdXRpbmcgb3Igc2VsZi5yZWFkaW5nKToKKyAgICAgICAgICAgIHNlbGYucmVzZXRvdXRwdXQoKQorICAgICAgICAgICAgc2VsZi5pbnRlcnAud3JpdGUoIktleWJvYXJkSW50ZXJydXB0XG4iKQorICAgICAgICAgICAgc2VsZi5zaG93cHJvbXB0KCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIHNlbGYuZW5kb2ZmaWxlID0gMAorICAgICAgICBzZWxmLmNhbmNlbGVkID0gMQorICAgICAgICBpZiAoc2VsZi5leGVjdXRpbmcgYW5kIHNlbGYuaW50ZXJwLnJwY2NsdCk6CisgICAgICAgICAgICBpZiBzZWxmLmludGVycC5nZXRkZWJ1Z2dlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJwLnJlc3RhcnRfc3VicHJvY2VzcygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJwLmludGVycnVwdF9zdWJwcm9jZXNzKCkKKyAgICAgICAgaWYgc2VsZi5yZWFkaW5nOgorICAgICAgICAgICAgc2VsZi50b3AucXVpdCgpICAjIGV4aXQgdGhlIG5lc3RlZCBtYWlubG9vcCgpIGluIHJlYWRsaW5lKCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBlb2ZfY2FsbGJhY2soc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBzZWxmLmV4ZWN1dGluZyBhbmQgbm90IHNlbGYucmVhZGluZzoKKyAgICAgICAgICAgIHJldHVybiAjIExldCB0aGUgZGVmYXVsdCBiaW5kaW5nIChkZWxldGUgbmV4dCBjaGFyKSB0YWtlIG92ZXIKKyAgICAgICAgaWYgbm90IChzZWxmLnRleHQuY29tcGFyZSgiaW9tYXJrIiwgIj09IiwgImluc2VydCIpIGFuZAorICAgICAgICAgICAgICAgIHNlbGYudGV4dC5jb21wYXJlKCJpbnNlcnQiLCAiPT0iLCAiZW5kLTFjIikpOgorICAgICAgICAgICAgcmV0dXJuICMgTGV0IHRoZSBkZWZhdWx0IGJpbmRpbmcgKGRlbGV0ZSBuZXh0IGNoYXIpIHRha2Ugb3ZlcgorICAgICAgICBpZiBub3Qgc2VsZi5leGVjdXRpbmc6CisgICAgICAgICAgICBzZWxmLnJlc2V0b3V0cHV0KCkKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jYW5jZWxlZCA9IDAKKyAgICAgICAgICAgIHNlbGYuZW5kb2ZmaWxlID0gMQorICAgICAgICAgICAgc2VsZi50b3AucXVpdCgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgbGluZWZlZWRfY2FsbGJhY2soc2VsZiwgZXZlbnQpOgorICAgICAgICAjIEluc2VydCBhIGxpbmVmZWVkIHdpdGhvdXQgZW50ZXJpbmcgYW55dGhpbmcgKHN0aWxsIGF1dG9pbmRlbnRlZCkKKyAgICAgICAgaWYgc2VsZi5yZWFkaW5nOgorICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiaW5zZXJ0IiwgIlxuIikKKyAgICAgICAgICAgIHNlbGYudGV4dC5zZWUoImluc2VydCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm5ld2xpbmVfYW5kX2luZGVudF9ldmVudChldmVudCkKKyAgICAgICAgcmV0dXJuICJicmVhayIKKworICAgIGRlZiBlbnRlcl9jYWxsYmFjayhzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuZXhlY3V0aW5nIGFuZCBub3Qgc2VsZi5yZWFkaW5nOgorICAgICAgICAgICAgcmV0dXJuICMgTGV0IHRoZSBkZWZhdWx0IGJpbmRpbmcgKGluc2VydCAnXG4nKSB0YWtlIG92ZXIKKyAgICAgICAgIyBJZiBzb21lIHRleHQgaXMgc2VsZWN0ZWQsIHJlY2FsbCB0aGUgc2VsZWN0aW9uCisgICAgICAgICMgKGJ1dCBvbmx5IGlmIHRoaXMgYmVmb3JlIHRoZSBJL08gbWFyaykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsID0gc2VsZi50ZXh0LmdldCgic2VsLmZpcnN0IiwgInNlbC5sYXN0IikKKyAgICAgICAgICAgIGlmIHNlbDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZSgic2VsLmxhc3QiLCAiPD0iLCAiaW9tYXJrIik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVjYWxsKHNlbCwgZXZlbnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBJZiB3ZSdyZSBzdHJpY3RseSBiZWZvcmUgdGhlIGxpbmUgY29udGFpbmluZyBpb21hcmssIHJlY2FsbAorICAgICAgICAjIHRoZSBjdXJyZW50IGxpbmUsIGxlc3MgYSBsZWFkaW5nIHByb21wdCwgbGVzcyBsZWFkaW5nIG9yCisgICAgICAgICMgdHJhaWxpbmcgd2hpdGVzcGFjZQorICAgICAgICBpZiBzZWxmLnRleHQuY29tcGFyZSgiaW5zZXJ0IiwgIjwiLCAiaW9tYXJrIGxpbmVzdGFydCIpOgorICAgICAgICAgICAgIyBDaGVjayBpZiB0aGVyZSdzIGEgcmVsZXZhbnQgc3RkaW4gcmFuZ2UgLS0gaWYgc28sIHVzZSBpdAorICAgICAgICAgICAgcHJldiA9IHNlbGYudGV4dC50YWdfcHJldnJhbmdlKCJzdGRpbiIsICJpbnNlcnQiKQorICAgICAgICAgICAgaWYgcHJldiBhbmQgc2VsZi50ZXh0LmNvbXBhcmUoImluc2VydCIsICI8IiwgcHJldlsxXSk6CisgICAgICAgICAgICAgICAgc2VsZi5yZWNhbGwoc2VsZi50ZXh0LmdldChwcmV2WzBdLCBwcmV2WzFdKSwgZXZlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgICAgIG5leHQgPSBzZWxmLnRleHQudGFnX25leHRyYW5nZSgic3RkaW4iLCAiaW5zZXJ0IikKKyAgICAgICAgICAgIGlmIG5leHQgYW5kIHNlbGYudGV4dC5jb21wYXJlKCJpbnNlcnQgbGluZWVuZCIsICI+PSIsIG5leHRbMF0pOgorICAgICAgICAgICAgICAgIHNlbGYucmVjYWxsKHNlbGYudGV4dC5nZXQobmV4dFswXSwgbmV4dFsxXSksIGV2ZW50KQorICAgICAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgICAgICAjIE5vIHN0ZGluIG1hcmsgLS0ganVzdCBnZXQgdGhlIGN1cnJlbnQgbGluZSwgbGVzcyBhbnkgcHJvbXB0CisgICAgICAgICAgICBpbmRpY2VzID0gc2VsZi50ZXh0LnRhZ19uZXh0cmFuZ2UoImNvbnNvbGUiLCAiaW5zZXJ0IGxpbmVzdGFydCIpCisgICAgICAgICAgICBpZiBpbmRpY2VzIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLnRleHQuY29tcGFyZShpbmRpY2VzWzBdLCAiPD0iLCAiaW5zZXJ0IGxpbmVzdGFydCIpOgorICAgICAgICAgICAgICAgIHNlbGYucmVjYWxsKHNlbGYudGV4dC5nZXQoaW5kaWNlc1sxXSwgImluc2VydCBsaW5lZW5kIiksIGV2ZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlY2FsbChzZWxmLnRleHQuZ2V0KCJpbnNlcnQgbGluZXN0YXJ0IiwgImluc2VydCBsaW5lZW5kIiksIGV2ZW50KQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgIyBJZiB3ZSdyZSBiZXR3ZWVuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgYW5kIHRoZSBpb21hcmssIGkuZS4KKyAgICAgICAgIyBpbiB0aGUgcHJvbXB0IGFyZWEsIG1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgcHJvbXB0CisgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCJpbnNlcnQiLCAiPCIsICJpb21hcmsiKToKKyAgICAgICAgICAgIHNlbGYudGV4dC5tYXJrX3NldCgiaW5zZXJ0IiwgImlvbWFyayIpCisgICAgICAgICMgSWYgd2UncmUgaW4gdGhlIGN1cnJlbnQgaW5wdXQgYW5kIHRoZXJlJ3Mgb25seSB3aGl0ZXNwYWNlCisgICAgICAgICMgYmV5b25kIHRoZSBjdXJzb3IsIGVyYXNlIHRoYXQgd2hpdGVzcGFjZSBmaXJzdAorICAgICAgICBzID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IiwgImVuZC0xYyIpCisgICAgICAgIGlmIHMgYW5kIG5vdCBzLnN0cmlwKCk6CisgICAgICAgICAgICBzZWxmLnRleHQuZGVsZXRlKCJpbnNlcnQiLCAiZW5kLTFjIikKKyAgICAgICAgIyBJZiB3ZSdyZSBpbiB0aGUgY3VycmVudCBpbnB1dCBiZWZvcmUgaXRzIGxhc3QgbGluZSwKKyAgICAgICAgIyBpbnNlcnQgYSBuZXdsaW5lIHJpZ2h0IGF0IHRoZSBpbnNlcnQgcG9pbnQKKyAgICAgICAgaWYgc2VsZi50ZXh0LmNvbXBhcmUoImluc2VydCIsICI8IiwgImVuZC0xYyBsaW5lc3RhcnQiKToKKyAgICAgICAgICAgIHNlbGYubmV3bGluZV9hbmRfaW5kZW50X2V2ZW50KGV2ZW50KQorICAgICAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICAgICAgIyBXZSdyZSBpbiB0aGUgbGFzdCBsaW5lOyBhcHBlbmQgYSBuZXdsaW5lIGFuZCBzdWJtaXQgaXQKKyAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCAiZW5kLTFjIikKKyAgICAgICAgaWYgc2VsZi5yZWFkaW5nOgorICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiaW5zZXJ0IiwgIlxuIikKKyAgICAgICAgICAgIHNlbGYudGV4dC5zZWUoImluc2VydCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm5ld2xpbmVfYW5kX2luZGVudF9ldmVudChldmVudCkKKyAgICAgICAgc2VsZi50ZXh0LnRhZ19hZGQoInN0ZGluIiwgImlvbWFyayIsICJlbmQtMWMiKQorICAgICAgICBzZWxmLnRleHQudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIGlmIHNlbGYucmVhZGluZzoKKyAgICAgICAgICAgIHNlbGYudG9wLnF1aXQoKSAjIEJyZWFrIG91dCBvZiByZWN1cnNpdmUgbWFpbmxvb3AoKSBpbiByYXdfaW5wdXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ydW5pdCgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgcmVjYWxsKHNlbGYsIHMsIGV2ZW50KToKKyAgICAgICAgIyByZW1vdmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgZW1wdHkgb3Igd2hpdGVzcGFjZSBsaW5lcworICAgICAgICBzID0gcmUuc3ViKHInXlxzKlxuJywgJycgLCBzKQorICAgICAgICBzID0gcmUuc3ViKHInXG5ccyokJywgJycsIHMpCisgICAgICAgIGxpbmVzID0gcy5zcGxpdCgnXG4nKQorICAgICAgICBzZWxmLnRleHQudW5kb19ibG9ja19zdGFydCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGV4dC50YWdfcmVtb3ZlKCJzZWwiLCAiMS4wIiwgImVuZCIpCisgICAgICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICJlbmQtMWMiKQorICAgICAgICAgICAgcHJlZml4ID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKQorICAgICAgICAgICAgaWYgcHJlZml4LnJzdHJpcCgpLmVuZHN3aXRoKCc6Jyk6CisgICAgICAgICAgICAgICAgc2VsZi5uZXdsaW5lX2FuZF9pbmRlbnRfZXZlbnQoZXZlbnQpCisgICAgICAgICAgICAgICAgcHJlZml4ID0gc2VsZi50ZXh0LmdldCgiaW5zZXJ0IGxpbmVzdGFydCIsICJpbnNlcnQiKQorICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiaW5zZXJ0IiwgbGluZXNbMF0uc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIGxlbihsaW5lcykgPiAxOgorICAgICAgICAgICAgICAgIG9yaWdfYmFzZV9pbmRlbnQgPSByZS5zZWFyY2gocideKFsgXHRdKiknLCBsaW5lc1swXSkuZ3JvdXAoMCkKKyAgICAgICAgICAgICAgICBuZXdfYmFzZV9pbmRlbnQgID0gcmUuc2VhcmNoKHInXihbIFx0XSopJywgcHJlZml4KS5ncm91cCgwKQorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKG9yaWdfYmFzZV9pbmRlbnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyByZXBsYWNlIG9yaWcgYmFzZSBpbmRlbnRhdGlvbiB3aXRoIG5ldyBpbmRlbnRhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZSA9IG5ld19iYXNlX2luZGVudCArIGxpbmVbbGVuKG9yaWdfYmFzZV9pbmRlbnQpOl0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgnaW5zZXJ0JywgJ1xuJytsaW5lLnJzdHJpcCgpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi50ZXh0LnNlZSgiaW5zZXJ0IikKKyAgICAgICAgICAgIHNlbGYudGV4dC51bmRvX2Jsb2NrX3N0b3AoKQorCisgICAgZGVmIHJ1bml0KHNlbGYpOgorICAgICAgICBsaW5lID0gc2VsZi50ZXh0LmdldCgiaW9tYXJrIiwgImVuZC0xYyIpCisgICAgICAgICMgU3RyaXAgb2ZmIGxhc3QgbmV3bGluZSBhbmQgc3Vycm91bmRpbmcgd2hpdGVzcGFjZS4KKyAgICAgICAgIyAoVG8gYWxsb3cgeW91IHRvIGhpdCByZXR1cm4gdHdpY2UgdG8gZW5kIGEgc3RhdGVtZW50LikKKyAgICAgICAgaSA9IGxlbihsaW5lKQorICAgICAgICB3aGlsZSBpID4gMCBhbmQgbGluZVtpLTFdIGluICIgXHQiOgorICAgICAgICAgICAgaSA9IGktMQorICAgICAgICBpZiBpID4gMCBhbmQgbGluZVtpLTFdID09ICJcbiI6CisgICAgICAgICAgICBpID0gaS0xCisgICAgICAgIHdoaWxlIGkgPiAwIGFuZCBsaW5lW2ktMV0gaW4gIiBcdCI6CisgICAgICAgICAgICBpID0gaS0xCisgICAgICAgIGxpbmUgPSBsaW5lWzppXQorICAgICAgICBtb3JlID0gc2VsZi5pbnRlcnAucnVuc291cmNlKGxpbmUpCisKKyAgICBkZWYgb3Blbl9zdGFja192aWV3ZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuaW50ZXJwLnJwY2NsdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmludGVycC5yZW1vdGVfc3RhY2tfdmlld2VyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLmxhc3RfdHJhY2ViYWNrCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIk5vIHN0YWNrIHRyYWNlIiwKKyAgICAgICAgICAgICAgICAiVGhlcmUgaXMgbm8gc3RhY2sgdHJhY2UgeWV0LlxuIgorICAgICAgICAgICAgICAgICIoc3lzLmxhc3RfdHJhY2ViYWNrIGlzIG5vdCBkZWZpbmVkKSIsCisgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYudGV4dCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmcm9tIGlkbGVsaWIuU3RhY2tWaWV3ZXIgaW1wb3J0IFN0YWNrQnJvd3NlcgorICAgICAgICBzdiA9IFN0YWNrQnJvd3NlcihzZWxmLnJvb3QsIHNlbGYuZmxpc3QpCisKKyAgICBkZWYgdmlld19yZXN0YXJ0X21hcmsoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYudGV4dC5zZWUoImlvbWFyayIpCisgICAgICAgIHNlbGYudGV4dC5zZWUoInJlc3RhcnQiKQorCisgICAgZGVmIHJlc3RhcnRfc2hlbGwoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICJDYWxsYmFjayBmb3IgUnVuL1Jlc3RhcnQgU2hlbGwgQ250bC1GNiIKKyAgICAgICAgc2VsZi5pbnRlcnAucmVzdGFydF9zdWJwcm9jZXNzKHdpdGhfY3dkPVRydWUpCisKKyAgICBkZWYgc2hvd3Byb21wdChzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldG91dHB1dCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzdHIoc3lzLnBzMSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcyA9ICIiCisgICAgICAgIHNlbGYuY29uc29sZS53cml0ZShzKQorICAgICAgICBzZWxmLnRleHQubWFya19zZXQoImluc2VydCIsICJlbmQtMWMiKQorICAgICAgICBzZWxmLnNldF9saW5lX2FuZF9jb2x1bW4oKQorICAgICAgICBzZWxmLmlvLnJlc2V0X3VuZG8oKQorCisgICAgZGVmIHJlc2V0b3V0cHV0KHNlbGYpOgorICAgICAgICBzb3VyY2UgPSBzZWxmLnRleHQuZ2V0KCJpb21hcmsiLCAiZW5kLTFjIikKKyAgICAgICAgaWYgc2VsZi5oaXN0b3J5OgorICAgICAgICAgICAgc2VsZi5oaXN0b3J5Lmhpc3Rvcnlfc3RvcmUoc291cmNlKQorICAgICAgICBpZiBzZWxmLnRleHQuZ2V0KCJlbmQtMmMiKSAhPSAiXG4iOgorICAgICAgICAgICAgc2VsZi50ZXh0Lmluc2VydCgiZW5kLTFjIiwgIlxuIikKKyAgICAgICAgc2VsZi50ZXh0Lm1hcmtfc2V0KCJpb21hcmsiLCAiZW5kLTFjIikKKyAgICAgICAgc2VsZi5zZXRfbGluZV9hbmRfY29sdW1uKCkKKyAgICAgICAgc3lzLnN0ZG91dC5zb2Z0c3BhY2UgPSAwCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcywgdGFncz0oKSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGV4dC5tYXJrX2dyYXZpdHkoImlvbWFyayIsICJyaWdodCIpCisgICAgICAgICAgICBPdXRwdXRXaW5kb3cud3JpdGUoc2VsZiwgcywgdGFncywgImlvbWFyayIpCisgICAgICAgICAgICBzZWxmLnRleHQubWFya19ncmF2aXR5KCJpb21hcmsiLCAibGVmdCIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgc2VsZi5jYW5jZWxlZDoKKyAgICAgICAgICAgIHNlbGYuY2FuY2VsZWQgPSAwCisgICAgICAgICAgICBpZiBub3QgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKworICAgIGRlZiBybWVudV9jaGVja19jdXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCdzZWwuZmlyc3QnLCAnPCcsICdpb21hcmsnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2Rpc2FibGVkJworICAgICAgICBleGNlcHQgVGNsRXJyb3I6ICMgbm8gc2VsZWN0aW9uLCBzbyB0aGUgaW5kZXggJ3NlbC5maXJzdCcgZG9lc24ndCBleGlzdAorICAgICAgICAgICAgcmV0dXJuICdkaXNhYmxlZCcKKyAgICAgICAgcmV0dXJuIHN1cGVyKFB5U2hlbGwsIHNlbGYpLnJtZW51X2NoZWNrX2N1dCgpCisKKyAgICBkZWYgcm1lbnVfY2hlY2tfcGFzdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYudGV4dC5jb21wYXJlKCdpbnNlcnQnLCAnPCcsICdpb21hcmsnKToKKyAgICAgICAgICAgIHJldHVybiAnZGlzYWJsZWQnCisgICAgICAgIHJldHVybiBzdXBlcihQeVNoZWxsLCBzZWxmKS5ybWVudV9jaGVja19wYXN0ZSgpCisKK2NsYXNzIFBzZXVkb0ZpbGUoaW8uVGV4dElPQmFzZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBzZWxmLnNoZWxsID0gc2hlbGwKKyAgICAgICAgc2VsZi50YWdzID0gdGFncworICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IDAKKyAgICAgICAgc2VsZi5fZW5jb2RpbmcgPSBlbmNvZGluZworCisgICAgQHByb3BlcnR5CisgICAgZGVmIGVuY29kaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZW5jb2RpbmcKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gJzwlcz4nICUgc2VsZi50YWdzCisKKyAgICBkZWYgaXNhdHR5KHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFBzZXVkb091dHB1dEZpbGUoUHNldWRvRmlsZSk6CisKKyAgICBkZWYgd3JpdGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigid3JpdGUgdG8gY2xvc2VkIGZpbGUiKQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzLCAoYmFzZXN0cmluZywgYnl0ZWFycmF5KSk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ211c3QgYmUgc3RyaW5nLCBub3QgJyArIHR5cGUocykuX19uYW1lX18pCisgICAgICAgIHJldHVybiBzZWxmLnNoZWxsLndyaXRlKHMsIHNlbGYudGFncykKKworCitjbGFzcyBQc2V1ZG9JbnB1dEZpbGUoUHNldWRvRmlsZSk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2hlbGwsIHRhZ3MsIGVuY29kaW5nPU5vbmUpOgorICAgICAgICBQc2V1ZG9GaWxlLl9faW5pdF9fKHNlbGYsIHNoZWxsLCB0YWdzLCBlbmNvZGluZykKKyAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSAnJworCisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT0tMSk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVhZCBmcm9tIGNsb3NlZCBmaWxlIikKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IC0xCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uoc2l6ZSwgaW50KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbXVzdCBiZSBpbnQsIG5vdCAnICsgdHlwZShzaXplKS5fX25hbWVfXykKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fbGluZV9idWZmZXIKKyAgICAgICAgc2VsZi5fbGluZV9idWZmZXIgPSAnJworICAgICAgICBpZiBzaXplIDwgMDoKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc2hlbGwucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aGlsZSBsZW4ocmVzdWx0KSA8IHNpemU6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuc2hlbGwucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAgICAgICAgIHJlc3VsdCArPSBsaW5lCisgICAgICAgICAgICBzZWxmLl9saW5lX2J1ZmZlciA9IHJlc3VsdFtzaXplOl0KKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFs6c2l6ZV0KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlYWQgZnJvbSBjbG9zZWQgZmlsZSIpCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNpemUgPSAtMQorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHNpemUsIGludCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ211c3QgYmUgaW50LCBub3QgJyArIHR5cGUoc2l6ZSkuX19uYW1lX18pCisgICAgICAgIGxpbmUgPSBzZWxmLl9saW5lX2J1ZmZlciBvciBzZWxmLnNoZWxsLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICBzaXplID0gbGVuKGxpbmUpCisgICAgICAgIHNlbGYuX2xpbmVfYnVmZmVyID0gbGluZVtzaXplOl0KKyAgICAgICAgcmV0dXJuIGxpbmVbOnNpemVdCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuc2hlbGwuY2xvc2UoKQorCisKK3VzYWdlX21zZyA9ICIiIlwKKworVVNBR0U6IGlkbGUgIFstZGVpbnNdIFstdCB0aXRsZV0gW2ZpbGVdKgorICAgICAgIGlkbGUgIFstZG5zXSBbLXQgdGl0bGVdICgtYyBjbWQgfCAtciBmaWxlKSBbYXJnXSoKKyAgICAgICBpZGxlICBbLWRuc10gWy10IHRpdGxlXSAtIFthcmddKgorCisgIC1oICAgICAgICAgcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLW4gICAgICAgICBydW4gSURMRSB3aXRob3V0IGEgc3VicHJvY2VzcyAoc2VlIEhlbHAvSURMRSBIZWxwIGZvciBkZXRhaWxzKQorCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgd2lsbCBvdmVycmlkZSB0aGUgSURMRSAnc2V0dGluZ3MnIGNvbmZpZ3VyYXRpb246CisKKyAgLWUgICAgICAgICBvcGVuIGFuIGVkaXQgd2luZG93CisgIC1pICAgICAgICAgb3BlbiBhIHNoZWxsIHdpbmRvdworCitUaGUgZm9sbG93aW5nIG9wdGlvbnMgaW1wbHkgLWkgYW5kIHdpbGwgb3BlbiBhIHNoZWxsOgorCisgIC1jIGNtZCAgICAgcnVuIHRoZSBjb21tYW5kIGluIGEgc2hlbGwsIG9yCisgIC1yIGZpbGUgICAgcnVuIHNjcmlwdCBmcm9tIGZpbGUKKworICAtZCAgICAgICAgIGVuYWJsZSB0aGUgZGVidWdnZXIKKyAgLXMgICAgICAgICBydW4gJElETEVTVEFSVFVQIG9yICRQWVRIT05TVEFSVFVQIGJlZm9yZSBhbnl0aGluZyBlbHNlCisgIC10IHRpdGxlICAgc2V0IHRpdGxlIG9mIHNoZWxsIHdpbmRvdworCitBIGRlZmF1bHQgZWRpdCB3aW5kb3cgd2lsbCBiZSBieXBhc3NlZCB3aGVuIC1jLCAtciwgb3IgLSBhcmUgdXNlZC4KKworW2FyZ10qIGFyZSBwYXNzZWQgdG8gdGhlIGNvbW1hbmQgKC1jKSBvciBzY3JpcHQgKC1yKSBpbiBzeXMuYXJndlsxOl0uCisKK0V4YW1wbGVzOgorCitpZGxlCisgICAgICAgIE9wZW4gYW4gZWRpdCB3aW5kb3cgb3Igc2hlbGwgZGVwZW5kaW5nIG9uIElETEUncyBjb25maWd1cmF0aW9uLgorCitpZGxlIGZvby5weSBmb29iYXIucHkKKyAgICAgICAgRWRpdCB0aGUgZmlsZXMsIGFsc28gb3BlbiBhIHNoZWxsIGlmIGNvbmZpZ3VyZWQgdG8gc3RhcnQgd2l0aCBzaGVsbC4KKworaWRsZSAtZXN0ICJCYXoiIGZvby5weQorICAgICAgICBSdW4gJElETEVTVEFSVFVQIG9yICRQWVRIT05TVEFSVFVQLCBlZGl0IGZvby5weSwgYW5kIG9wZW4gYSBzaGVsbAorICAgICAgICB3aW5kb3cgd2l0aCB0aGUgdGl0bGUgIkJheiIuCisKK2lkbGUgLWMgImltcG9ydCBzeXM7IHByaW50IHN5cy5hcmd2IiAiZm9vIgorICAgICAgICBPcGVuIGEgc2hlbGwgd2luZG93IGFuZCBydW4gdGhlIGNvbW1hbmQsIHBhc3NpbmcgIi1jIiBpbiBzeXMuYXJndlswXQorICAgICAgICBhbmQgImZvbyIgaW4gc3lzLmFyZ3ZbMV0uCisKK2lkbGUgLWQgLXMgLXIgZm9vLnB5ICJIZWxsbyBXb3JsZCIKKyAgICAgICAgT3BlbiBhIHNoZWxsIHdpbmRvdywgcnVuIGEgc3RhcnR1cCBzY3JpcHQsIGVuYWJsZSB0aGUgZGVidWdnZXIsIGFuZAorICAgICAgICBydW4gZm9vLnB5LCBwYXNzaW5nICJmb28ucHkiIGluIHN5cy5hcmd2WzBdIGFuZCAiSGVsbG8gV29ybGQiIGluCisgICAgICAgIHN5cy5hcmd2WzFdLgorCitlY2hvICJpbXBvcnQgc3lzOyBwcmludCBzeXMuYXJndiIgfCBpZGxlIC0gImZvb2JhciIKKyAgICAgICAgT3BlbiBhIHNoZWxsIHdpbmRvdywgcnVuIHRoZSBzY3JpcHQgcGlwZWQgaW4sIHBhc3NpbmcgJycgaW4gc3lzLmFyZ3ZbMF0KKyAgICAgICAgYW5kICJmb29iYXIiIGluIHN5cy5hcmd2WzFdLgorIiIiCisKK2RlZiBtYWluKCk6CisgICAgZ2xvYmFsIGZsaXN0LCByb290LCB1c2Vfc3VicHJvY2VzcworCisgICAgdXNlX3N1YnByb2Nlc3MgPSBUcnVlCisgICAgZW5hYmxlX3NoZWxsID0gRmFsc2UKKyAgICBlbmFibGVfZWRpdCA9IEZhbHNlCisgICAgZGVidWcgPSBGYWxzZQorICAgIGNtZCA9IE5vbmUKKyAgICBzY3JpcHQgPSBOb25lCisgICAgc3RhcnR1cCA9IEZhbHNlCisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJjOmRlaWhucjpzdDoiKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiRXJyb3I6ICVzXG4iICUgc3RyKG1zZykpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUodXNhZ2VfbXNnKQorICAgICAgICBzeXMuZXhpdCgyKQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy1jJzoKKyAgICAgICAgICAgIGNtZCA9IGEKKyAgICAgICAgICAgIGVuYWJsZV9zaGVsbCA9IFRydWUKKyAgICAgICAgaWYgbyA9PSAnLWQnOgorICAgICAgICAgICAgZGVidWcgPSBUcnVlCisgICAgICAgICAgICBlbmFibGVfc2hlbGwgPSBUcnVlCisgICAgICAgIGlmIG8gPT0gJy1lJzoKKyAgICAgICAgICAgIGVuYWJsZV9lZGl0ID0gVHJ1ZQorICAgICAgICBpZiBvID09ICctaCc6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHVzYWdlX21zZykKKyAgICAgICAgICAgIHN5cy5leGl0KCkKKyAgICAgICAgaWYgbyA9PSAnLWknOgorICAgICAgICAgICAgZW5hYmxlX3NoZWxsID0gVHJ1ZQorICAgICAgICBpZiBvID09ICctbic6CisgICAgICAgICAgICB1c2Vfc3VicHJvY2VzcyA9IEZhbHNlCisgICAgICAgIGlmIG8gPT0gJy1yJzoKKyAgICAgICAgICAgIHNjcmlwdCA9IGEKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNjcmlwdCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAiTm8gc2NyaXB0IGZpbGU6ICIsIHNjcmlwdAorICAgICAgICAgICAgICAgIHN5cy5leGl0KCkKKyAgICAgICAgICAgIGVuYWJsZV9zaGVsbCA9IFRydWUKKyAgICAgICAgaWYgbyA9PSAnLXMnOgorICAgICAgICAgICAgc3RhcnR1cCA9IFRydWUKKyAgICAgICAgICAgIGVuYWJsZV9zaGVsbCA9IFRydWUKKyAgICAgICAgaWYgbyA9PSAnLXQnOgorICAgICAgICAgICAgUHlTaGVsbC5zaGVsbF90aXRsZSA9IGEKKyAgICAgICAgICAgIGVuYWJsZV9zaGVsbCA9IFRydWUKKyAgICBpZiBhcmdzIGFuZCBhcmdzWzBdID09ICctJzoKKyAgICAgICAgY21kID0gc3lzLnN0ZGluLnJlYWQoKQorICAgICAgICBlbmFibGVfc2hlbGwgPSBUcnVlCisgICAgIyBwcm9jZXNzIHN5cy5hcmd2IGFuZCBzeXMucGF0aDoKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oc3lzLnBhdGgpKToKKyAgICAgICAgc3lzLnBhdGhbaV0gPSBvcy5wYXRoLmFic3BhdGgoc3lzLnBhdGhbaV0pCisgICAgaWYgYXJncyBhbmQgYXJnc1swXSA9PSAnLSc6CisgICAgICAgIHN5cy5hcmd2ID0gWycnXSArIGFyZ3NbMTpdCisgICAgZWxpZiBjbWQ6CisgICAgICAgIHN5cy5hcmd2ID0gWyctYyddICsgYXJncworICAgIGVsaWYgc2NyaXB0OgorICAgICAgICBzeXMuYXJndiA9IFtzY3JpcHRdICsgYXJncworICAgIGVsaWYgYXJnczoKKyAgICAgICAgZW5hYmxlX2VkaXQgPSBUcnVlCisgICAgICAgIHBhdGh4ID0gW10KKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CisgICAgICAgICAgICBwYXRoeC5hcHBlbmQob3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKSkKKyAgICAgICAgZm9yIGRpciBpbiBwYXRoeDoKKyAgICAgICAgICAgIGRpciA9IG9zLnBhdGguYWJzcGF0aChkaXIpCisgICAgICAgICAgICBpZiBkaXIgbm90IGluIHN5cy5wYXRoOgorICAgICAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBkaXIpCisgICAgZWxzZToKKyAgICAgICAgZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgaWYgbm90IGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBkaXIpCisgICAgIyBjaGVjayB0aGUgSURMRSBzZXR0aW5ncyBjb25maWd1cmF0aW9uIChidXQgY29tbWFuZCBsaW5lIG92ZXJyaWRlcykKKyAgICBlZGl0X3N0YXJ0ID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0dlbmVyYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRvci1vbi1zdGFydHVwJywgdHlwZT0nYm9vbCcpCisgICAgZW5hYmxlX2VkaXQgPSBlbmFibGVfZWRpdCBvciBlZGl0X3N0YXJ0CisgICAgZW5hYmxlX3NoZWxsID0gZW5hYmxlX3NoZWxsIG9yIG5vdCBlbmFibGVfZWRpdAorICAgICMgc3RhcnQgZWRpdG9yIGFuZC9vciBzaGVsbCB3aW5kb3dzOgorICAgIHJvb3QgPSBUayhjbGFzc05hbWU9IklkbGUiKQorCisgICAgZml4d29yZGJyZWFrcyhyb290KQorICAgIHJvb3Qud2l0aGRyYXcoKQorICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCisgICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBmbGlzdCkKKworICAgIGlmIGVuYWJsZV9lZGl0OgorICAgICAgICBpZiBub3QgKGNtZCBvciBzY3JpcHQpOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3NbOl06CisgICAgICAgICAgICAgICAgaWYgZmxpc3Qub3BlbihmaWxlbmFtZSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBmaWxlbmFtZSBpcyBhIGRpcmVjdG9yeSBhY3R1YWxseSwgZGlzY29uc2lkZXIgaXQKKyAgICAgICAgICAgICAgICAgICAgYXJncy5yZW1vdmUoZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgICAgICBmbGlzdC5uZXcoKQorICAgIGlmIGVuYWJsZV9zaGVsbDoKKyAgICAgICAgc2hlbGwgPSBmbGlzdC5vcGVuX3NoZWxsKCkKKyAgICAgICAgaWYgbm90IHNoZWxsOgorICAgICAgICAgICAgcmV0dXJuICMgY291bGRuJ3Qgb3BlbiBzaGVsbAorCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCkgYW5kIGZsaXN0LmRpY3Q6CisgICAgICAgICAgICAjIE9uIE9TWDogd2hlbiB0aGUgdXNlciBoYXMgZG91YmxlLWNsaWNrZWQgb24gYSBmaWxlIHRoYXQgY2F1c2VzCisgICAgICAgICAgICAjIElETEUgdG8gYmUgbGF1bmNoZWQgdGhlIHNoZWxsIHdpbmRvdyB3aWxsIG9wZW4ganVzdCBpbiBmcm9udCBvZgorICAgICAgICAgICAgIyB0aGUgZmlsZSBzaGUgd2FudHMgdG8gc2VlLiBMb3dlciB0aGUgaW50ZXJwcmV0ZXIgd2luZG93IHdoZW4KKyAgICAgICAgICAgICMgdGhlcmUgYXJlIG9wZW4gZmlsZXMuCisgICAgICAgICAgICBzaGVsbC50b3AubG93ZXIoKQorCisgICAgc2hlbGwgPSBmbGlzdC5weXNoZWxsCisgICAgIyBoYW5kbGUgcmVtYWluaW5nIG9wdGlvbnM6CisgICAgaWYgZGVidWc6CisgICAgICAgIHNoZWxsLm9wZW5fZGVidWdnZXIoKQorICAgIGlmIHN0YXJ0dXA6CisgICAgICAgIGZpbGVuYW1lID0gb3MuZW52aXJvbi5nZXQoIklETEVTVEFSVFVQIikgb3IgXAorICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb24uZ2V0KCJQWVRIT05TVEFSVFVQIikKKyAgICAgICAgaWYgZmlsZW5hbWUgYW5kIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKKyAgICAgICAgICAgIHNoZWxsLmludGVycC5leGVjZmlsZShmaWxlbmFtZSkKKyAgICBpZiBzaGVsbCBhbmQgY21kIG9yIHNjcmlwdDoKKyAgICAgICAgc2hlbGwuaW50ZXJwLnJ1bmNvbW1hbmQoIiIiaWYgMToKKyAgICAgICAgICAgIGltcG9ydCBzeXMgYXMgX3N5cworICAgICAgICAgICAgX3N5cy5hcmd2ID0gJXIKKyAgICAgICAgICAgIGRlbCBfc3lzCisgICAgICAgICAgICBcbiIiIiAlIChzeXMuYXJndiwpKQorICAgICAgICBpZiBjbWQ6CisgICAgICAgICAgICBzaGVsbC5pbnRlcnAuZXhlY3NvdXJjZShjbWQpCisgICAgICAgIGVsaWYgc2NyaXB0OgorICAgICAgICAgICAgc2hlbGwuaW50ZXJwLnByZXBlbmRfc3lzcGF0aChzY3JpcHQpCisgICAgICAgICAgICBzaGVsbC5pbnRlcnAuZXhlY2ZpbGUoc2NyaXB0KQorCisgICAgIyBDaGVjayBmb3IgcHJvYmxlbWF0aWMgT1MgWCBUayB2ZXJzaW9ucyBhbmQgcHJpbnQgYSB3YXJuaW5nIG1lc3NhZ2UKKyAgICAjIGluIHRoZSBJRExFIHNoZWxsIHdpbmRvdzsgdGhpcyBpcyBsZXNzIGludHJ1c2l2ZSB0aGFuIGFsd2F5cyBvcGVuaW5nCisgICAgIyBhIHNlcGFyYXRlIHdpbmRvdy4KKyAgICB0a3ZlcnNpb253YXJuaW5nID0gbWFjb3N4U3VwcG9ydC50a1ZlcnNpb25XYXJuaW5nKHJvb3QpCisgICAgaWYgdGt2ZXJzaW9ud2FybmluZzoKKyAgICAgICAgc2hlbGwuaW50ZXJwLnJ1bmNvbW1hbmQoJycuam9pbigoInByaW50KCciLCB0a3ZlcnNpb253YXJuaW5nLCAiJykiKSkpCisKKyAgICB3aGlsZSBmbGlzdC5pbnZlcnNlZGljdDogICMga2VlcCBJRExFIHJ1bm5pbmcgd2hpbGUgZmlsZXMgYXJlIG9wZW4uCisgICAgICAgIHJvb3QubWFpbmxvb3AoKQorICAgIHJvb3QuZGVzdHJveSgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLm1vZHVsZXNbJ1B5U2hlbGwnXSA9IHN5cy5tb2R1bGVzWydfX21haW5fXyddCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjY2NmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVNoZWxsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUHlTaGVsbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgzNTdiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9QeVNoZWxsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUkVBRE1FLnR4dCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWY3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUkVBRE1FLnR4dApAQCAtMCwwICsxLDYzIEBACitJRExFIGlzIFB5dGhvbidzIFRraW50ZXItYmFzZWQgSW50ZWdyYXRlZCBEZXZlTG9wbWVudCBFbnZpcm9ubWVudC4KKworSURMRSBlbXBoYXNpemVzIGEgbGlnaHR3ZWlnaHQsIGNsZWFuIGRlc2lnbiB3aXRoIGEgc2ltcGxlIHVzZXIgaW50ZXJmYWNlLgorQWx0aG91Z2ggaXQgaXMgc3VpdGFibGUgZm9yIGJlZ2lubmVycywgZXZlbiBhZHZhbmNlZCB1c2VycyB3aWxsIGZpbmQgdGhhdAorSURMRSBoYXMgZXZlcnl0aGluZyB0aGV5IHJlYWxseSBuZWVkIHRvIGRldmVsb3AgcHVyZSBQeXRob24gY29kZS4KKworSURMRSBmZWF0dXJlcyBhIG11bHRpLXdpbmRvdyB0ZXh0IGVkaXRvciB3aXRoIG11bHRpcGxlIHVuZG8sIFB5dGhvbiBjb2xvcml6aW5nLAorYW5kIG1hbnkgb3RoZXIgY2FwYWJpbGl0aWVzLCBlLmcuIHNtYXJ0IGluZGVudCwgY2FsbCB0aXBzLCBhbmQgYXV0b2NvbXBsZXRpb24uCisKK1RoZSBlZGl0b3IgaGFzIGNvbXByZWhlbnNpdmUgc2VhcmNoIGZ1bmN0aW9ucywgaW5jbHVkaW5nIHNlYXJjaGluZyB0aHJvdWdoCittdWx0aXBsZSBmaWxlcy4gIENsYXNzIGJyb3dzZXJzIGFuZCBwYXRoIGJyb3dzZXJzIHByb3ZpZGUgZmFzdCBhY2Nlc3MgdG8KK2NvZGUgb2JqZWN0cyBmcm9tIGEgdG9wIGxldmVsIHZpZXdwb2ludCB3aXRob3V0IGRlYWxpbmcgd2l0aCBjb2RlIGZvbGRpbmcuCisKK1RoZXJlIGlzIGEgUHl0aG9uIFNoZWxsIHdpbmRvdyB3aGljaCBmZWF0dXJlcyBjb2xvcml6aW5nIGFuZCBjb21tYW5kIHJlY2FsbC4KKworSURMRSBleGVjdXRlcyBQeXRob24gY29kZSBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsIHdoaWNoIGlzIHJlc3RhcnRlZCBmb3IgZWFjaAorUnVuIChGNSkgaW5pdGlhdGVkIGZyb20gYW4gZWRpdG9yIHdpbmRvdy4gIFRoZSBlbnZpcm9ubWVudCBjYW4gYWxzbyBiZSAKK3Jlc3RhcnRlZCBmcm9tIHRoZSBTaGVsbCB3aW5kb3cgd2l0aG91dCByZXN0YXJ0aW5nIElETEUuCisKK1RoaXMgZW5oYW5jZW1lbnQgaGFzIG9mdGVuIGJlZW4gcmVxdWVzdGVkLCBhbmQgaXMgbm93IGZpbmFsbHkgYXZhaWxhYmxlLiAgVGhlCittYWdpYyAicmVsb2FkL2ltcG9ydCAqIiBpbmNhbnRhdGlvbnMgYXJlIG5vIGxvbmdlciByZXF1aXJlZCB3aGVuIGVkaXRpbmcgYW5kCit0ZXN0aW5nIGEgbW9kdWxlIHR3byBvciB0aHJlZSBzdGVwcyBkb3duIHRoZSBpbXBvcnQgY2hhaW4uCisKKyhQZXJzb25hbCBmaXJld2FsbCBzb2Z0d2FyZSBtYXkgd2FybiBhYm91dCB0aGUgY29ubmVjdGlvbiBJRExFIG1ha2VzIHRvIGl0cworc3VicHJvY2VzcyB1c2luZyB0aGlzIGNvbXB1dGVyJ3MgaW50ZXJuYWwgbG9vcGJhY2sgaW50ZXJmYWNlLiAgVGhpcyBjb25uZWN0aW9uCitpcyBub3QgdmlzaWJsZSBvbiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGFuZCBubyBkYXRhIGlzIHNlbnQgdG8gb3IgcmVjZWl2ZWQKK2Zyb20gdGhlIEludGVybmV0LikKKworSXQgaXMgcG9zc2libGUgdG8gaW50ZXJydXB0IHRpZ2h0bHkgbG9vcGluZyB1c2VyIGNvZGUsIGV2ZW4gb24gV2luZG93cy4KKworQXBwbGljYXRpb25zIHdoaWNoIGNhbm5vdCBzdXBwb3J0IHN1YnByb2Nlc3NlcyBhbmQvb3Igc29ja2V0cyBjYW4gc3RpbGwgcnVuCitJRExFIGluIGEgc2luZ2xlIHByb2Nlc3MuCisKK0lETEUgaGFzIGFuIGludGVncmF0ZWQgZGVidWdnZXIgd2l0aCBzdGVwcGluZywgcGVyc2lzdGVudCBicmVha3BvaW50cywgYW5kIGNhbGwKK3N0YWNrIHZpc2liaWxpdHkuCisKK1RoZXJlIGlzIGEgR1VJIGNvbmZpZ3VyYXRpb24gbWFuYWdlciB3aGljaCBtYWtlcyBpdCBlYXN5IHRvIHNlbGVjdCBmb250cywKK2NvbG9ycywga2V5YmluZGluZ3MsIGFuZCBzdGFydHVwIG9wdGlvbnMuICBUaGlzIGZhY2lsaXR5IGluY2x1ZGVzIGEgZmVhdHVyZQord2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBoZWxwIHNvdXJjZXMsIGVpdGhlciBsb2NhbGx5IG9yIG9uCit0aGUgd2ViLgorCitJRExFIGlzIGNvZGVkIGluIDEwMCUgcHVyZSBQeXRob24sIHVzaW5nIHRoZSBUa2ludGVyIEdVSSB0b29sa2l0IChUay9UY2wpCithbmQgaXMgY3Jvc3MtcGxhdGZvcm0sIHdvcmtpbmcgb24gVW5peCwgTWFjLCBhbmQgV2luZG93cy4KKworSURMRSBhY2NlcHRzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuICBUcnkgaWRsZSAtaCB0byBzZWUgdGhlIG9wdGlvbnMuCisKKworSWYgeW91IGZpbmQgYnVncyBvciBoYXZlIHN1Z2dlc3Rpb25zLCBsZXQgdXMga25vdyBhYm91dCB0aGVtIGJ5IHVzaW5nIHRoZQorUHl0aG9uIEJ1ZyBUcmFja2VyOgorCitodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3B5dGhvbgorCitQYXRjaGVzIGFyZSBhbHdheXMgYXBwcmVjaWF0ZWQgYXQgdGhlIFB5dGhvbiBQYXRjaCBUcmFja2VyLCBhbmQgY2hhbmdlCityZXF1ZXN0cyBzaG91bGQgYmUgcG9zdGVkIHRvIHRoZSBSRkUgVHJhY2tlci4KKworRm9yIGZ1cnRoZXIgZGV0YWlscyBhbmQgbGlua3MsIHJlYWQgdGhlIEhlbHAgZmlsZXMgYW5kIGNoZWNrIHRoZSBJRExFIGhvbWUKK3BhZ2UgYXQKKworaHR0cDovL3d3dy5weXRob24ub3JnL2lkbGUvCisKK1RoZXJlIGlzIGEgbWFpbCBsaXN0IGZvciBJRExFOiBpZGxlLWRldkBweXRob24ub3JnLiAgWW91IGNhbiBqb2luIGF0CisKK2h0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvbWFpbG1hbi9saXN0aW5mby9pZGxlLWRldgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzI4NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHkKQEAgLTAsMCArMSwzODAgQEAKKyIiIlN1cHBvcnQgZm9yIHJlbW90ZSBQeXRob24gZGVidWdnaW5nLgorCitTb21lIEFTQ0lJIGFydCB0byBkZXNjcmliZSB0aGUgc3RydWN0dXJlOgorCisgICAgICAgSU4gUFlUSE9OIFNVQlBST0NFU1MgICAgICAgICAgIyAgICAgICAgICAgICBJTiBJRExFIFBST0NFU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgb2lkPSdndWlfYWRhcHRlcicKKyAgICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0rICAgICAgICAjICAgICAgICstLS0tLS0tLS0tLS0rICAgICAgICAgICstLS0tLSsKKyAgICAgICAgICAgICAgICAgfCBHVUlQcm94eSB8LS1yZW1vdGUjY2FsbC0tPnwgR1VJQWRhcHRlciB8LS1jYWxscy0tPnwgR1VJIHwKKystLS0tLSstLWNhbGxzLS0+Ky0tLS0tLS0tLS0rICAgICAgICAjICAgICAgICstLS0tLS0tLS0tLS0rICAgICAgICAgICstLS0tLSsKK3wgSWRiIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLworKy0tLS0tKzwtY2FsbHMtLSstLS0tLS0tLS0tLS0rICAgICAgICAgIyAgICAgICstLS0tLS0tLS0tKzwtLWNhbGxzLS8KKyAgICAgICAgICAgICAgICB8IElkYkFkYXB0ZXIgfDwtLXJlbW90ZSNjYWxsLS18IElkYlByb3h5IHwKKyAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tKyAgICAgICAgICMgICAgICArLS0tLS0tLS0tLSsKKyAgICAgICAgICAgICAgICBvaWQ9J2lkYl9hZGFwdGVyJyAgICAgICMKKworVGhlIHB1cnBvc2Ugb2YgdGhlIFByb3h5IGFuZCBBZGFwdGVyIGNsYXNzZXMgaXMgdG8gdHJhbnNsYXRlIGNlcnRhaW4KK2FyZ3VtZW50cyBhbmQgcmV0dXJuIHZhbHVlcyB0aGF0IGNhbm5vdCBiZSB0cmFuc3BvcnRlZCB0aHJvdWdoIHRoZSBSUEMKK2JhcnJpZXIsIGluIHBhcnRpY3VsYXIgZnJhbWUgYW5kIHRyYWNlYmFjayBvYmplY3RzLgorCisiIiIKKworaW1wb3J0IHR5cGVzCitmcm9tIGlkbGVsaWIgaW1wb3J0IHJwYworZnJvbSBpZGxlbGliIGltcG9ydCBEZWJ1Z2dlcgorCitkZWJ1Z2dpbmcgPSAwCisKK2lkYl9hZGFwX29pZCA9ICJpZGJfYWRhcHRlciIKK2d1aV9hZGFwX29pZCA9ICJndWlfYWRhcHRlciIKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBJbiB0aGUgUFlUSE9OIHN1YnByb2Nlc3M6CisKK2ZyYW1ldGFibGUgPSB7fQorZGljdHRhYmxlID0ge30KK2NvZGV0YWJsZSA9IHt9Cit0cmFjZWJhY2t0YWJsZSA9IHt9CisKK2RlZiB3cmFwX2ZyYW1lKGZyYW1lKToKKyAgICBmaWQgPSBpZChmcmFtZSkKKyAgICBmcmFtZXRhYmxlW2ZpZF0gPSBmcmFtZQorICAgIHJldHVybiBmaWQKKworZGVmIHdyYXBfaW5mbyhpbmZvKToKKyAgICAicmVwbGFjZSBpbmZvWzJdLCBhIHRyYWNlYmFjayBpbnN0YW5jZSwgYnkgaXRzIElEIgorICAgIGlmIGluZm8gaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICB0cmFjZWJhY2sgPSBpbmZvWzJdCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHRyYWNlYmFjaywgdHlwZXMuVHJhY2ViYWNrVHlwZSkKKyAgICAgICAgdHJhY2ViYWNrX2lkID0gaWQodHJhY2ViYWNrKQorICAgICAgICB0cmFjZWJhY2t0YWJsZVt0cmFjZWJhY2tfaWRdID0gdHJhY2ViYWNrCisgICAgICAgIG1vZGlmaWVkX2luZm8gPSAoaW5mb1swXSwgaW5mb1sxXSwgdHJhY2ViYWNrX2lkKQorICAgICAgICByZXR1cm4gbW9kaWZpZWRfaW5mbworCitjbGFzcyBHVUlQcm94eToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCBndWlfYWRhcF9vaWQpOgorICAgICAgICBzZWxmLmNvbm4gPSBjb25uCisgICAgICAgIHNlbGYub2lkID0gZ3VpX2FkYXBfb2lkCisKKyAgICBkZWYgaW50ZXJhY3Rpb24oc2VsZiwgbWVzc2FnZSwgZnJhbWUsIGluZm89Tm9uZSk6CisgICAgICAgICMgY2FsbHMgcnBjLlNvY2tldElPLnJlbW90ZWNhbGwoKSB2aWEgcnVuLk15SGFuZGxlciBpbnN0YW5jZQorICAgICAgICAjIHBhc3MgZnJhbWUgYW5kIHRyYWNlYmFjayBvYmplY3QgSURzIGluc3RlYWQgb2YgdGhlIG9iamVjdHMgdGhlbXNlbHZlcworICAgICAgICBzZWxmLmNvbm4ucmVtb3RlY2FsbChzZWxmLm9pZCwgImludGVyYWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UsIHdyYXBfZnJhbWUoZnJhbWUpLCB3cmFwX2luZm8oaW5mbykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSkKKworY2xhc3MgSWRiQWRhcHRlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpZGIpOgorICAgICAgICBzZWxmLmlkYiA9IGlkYgorCisgICAgIy0tLS0tLS0tLS1jYWxsZWQgYnkgYW4gSWRiUHJveHktLS0tLS0tLS0tCisKKyAgICBkZWYgc2V0X3N0ZXAoc2VsZik6CisgICAgICAgIHNlbGYuaWRiLnNldF9zdGVwKCkKKworICAgIGRlZiBzZXRfcXVpdChzZWxmKToKKyAgICAgICAgc2VsZi5pZGIuc2V0X3F1aXQoKQorCisgICAgZGVmIHNldF9jb250aW51ZShzZWxmKToKKyAgICAgICAgc2VsZi5pZGIuc2V0X2NvbnRpbnVlKCkKKworICAgIGRlZiBzZXRfbmV4dChzZWxmLCBmaWQpOgorICAgICAgICBmcmFtZSA9IGZyYW1ldGFibGVbZmlkXQorICAgICAgICBzZWxmLmlkYi5zZXRfbmV4dChmcmFtZSkKKworICAgIGRlZiBzZXRfcmV0dXJuKHNlbGYsIGZpZCk6CisgICAgICAgIGZyYW1lID0gZnJhbWV0YWJsZVtmaWRdCisgICAgICAgIHNlbGYuaWRiLnNldF9yZXR1cm4oZnJhbWUpCisKKyAgICBkZWYgZ2V0X3N0YWNrKHNlbGYsIGZpZCwgdGJpZCk6CisgICAgICAgICMjcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgImdldF9zdGFjayglciwgJXIpIiAlIChmaWQsIHRiaWQpCisgICAgICAgIGZyYW1lID0gZnJhbWV0YWJsZVtmaWRdCisgICAgICAgIGlmIHRiaWQgaXMgTm9uZToKKyAgICAgICAgICAgIHRiID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGIgPSB0cmFjZWJhY2t0YWJsZVt0YmlkXQorICAgICAgICBzdGFjaywgaSA9IHNlbGYuaWRiLmdldF9zdGFjayhmcmFtZSwgdGIpCisgICAgICAgICMjcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgImdldF9zdGFjaygpIC0+Iiwgc3RhY2sKKyAgICAgICAgc3RhY2sgPSBbKHdyYXBfZnJhbWUoZnJhbWUpLCBrKSBmb3IgZnJhbWUsIGsgaW4gc3RhY2tdCisgICAgICAgICMjcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgImdldF9zdGFjaygpIC0+Iiwgc3RhY2sKKyAgICAgICAgcmV0dXJuIHN0YWNrLCBpCisKKyAgICBkZWYgcnVuKHNlbGYsIGNtZCk6CisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBzZWxmLmlkYi5ydW4oY21kLCBfX21haW5fXy5fX2RpY3RfXykKKworICAgIGRlZiBzZXRfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIG1zZyA9IHNlbGYuaWRiLnNldF9icmVhayhmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICByZXR1cm4gbXNnCisKKyAgICBkZWYgY2xlYXJfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIG1zZyA9IHNlbGYuaWRiLmNsZWFyX2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBjbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBtc2cgPSBzZWxmLmlkYi5jbGVhcl9hbGxfZmlsZV9icmVha3MoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBtc2cKKworICAgICMtLS0tLS0tLS0tY2FsbGVkIGJ5IGEgRnJhbWVQcm94eS0tLS0tLS0tLS0KKworICAgIGRlZiBmcmFtZV9hdHRyKHNlbGYsIGZpZCwgbmFtZSk6CisgICAgICAgIGZyYW1lID0gZnJhbWV0YWJsZVtmaWRdCisgICAgICAgIHJldHVybiBnZXRhdHRyKGZyYW1lLCBuYW1lKQorCisgICAgZGVmIGZyYW1lX2dsb2JhbHMoc2VsZiwgZmlkKToKKyAgICAgICAgZnJhbWUgPSBmcmFtZXRhYmxlW2ZpZF0KKyAgICAgICAgZGljdCA9IGZyYW1lLmZfZ2xvYmFscworICAgICAgICBkaWQgPSBpZChkaWN0KQorICAgICAgICBkaWN0dGFibGVbZGlkXSA9IGRpY3QKKyAgICAgICAgcmV0dXJuIGRpZAorCisgICAgZGVmIGZyYW1lX2xvY2FscyhzZWxmLCBmaWQpOgorICAgICAgICBmcmFtZSA9IGZyYW1ldGFibGVbZmlkXQorICAgICAgICBkaWN0ID0gZnJhbWUuZl9sb2NhbHMKKyAgICAgICAgZGlkID0gaWQoZGljdCkKKyAgICAgICAgZGljdHRhYmxlW2RpZF0gPSBkaWN0CisgICAgICAgIHJldHVybiBkaWQKKworICAgIGRlZiBmcmFtZV9jb2RlKHNlbGYsIGZpZCk6CisgICAgICAgIGZyYW1lID0gZnJhbWV0YWJsZVtmaWRdCisgICAgICAgIGNvZGUgPSBmcmFtZS5mX2NvZGUKKyAgICAgICAgY2lkID0gaWQoY29kZSkKKyAgICAgICAgY29kZXRhYmxlW2NpZF0gPSBjb2RlCisgICAgICAgIHJldHVybiBjaWQKKworICAgICMtLS0tLS0tLS0tY2FsbGVkIGJ5IGEgQ29kZVByb3h5LS0tLS0tLS0tLQorCisgICAgZGVmIGNvZGVfbmFtZShzZWxmLCBjaWQpOgorICAgICAgICBjb2RlID0gY29kZXRhYmxlW2NpZF0KKyAgICAgICAgcmV0dXJuIGNvZGUuY29fbmFtZQorCisgICAgZGVmIGNvZGVfZmlsZW5hbWUoc2VsZiwgY2lkKToKKyAgICAgICAgY29kZSA9IGNvZGV0YWJsZVtjaWRdCisgICAgICAgIHJldHVybiBjb2RlLmNvX2ZpbGVuYW1lCisKKyAgICAjLS0tLS0tLS0tLWNhbGxlZCBieSBhIERpY3RQcm94eS0tLS0tLS0tLS0KKworICAgIGRlZiBkaWN0X2tleXMoc2VsZiwgZGlkKToKKyAgICAgICAgZGljdCA9IGRpY3R0YWJsZVtkaWRdCisgICAgICAgIHJldHVybiBkaWN0LmtleXMoKQorCisgICAgZGVmIGRpY3RfaXRlbShzZWxmLCBkaWQsIGtleSk6CisgICAgICAgIGRpY3QgPSBkaWN0dGFibGVbZGlkXQorICAgICAgICB2YWx1ZSA9IGRpY3Rba2V5XQorICAgICAgICB2YWx1ZSA9IHJlcHIodmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisjLS0tLS0tLS0tLWVuZCBjbGFzcyBJZGJBZGFwdGVyLS0tLS0tLS0tLQorCisKK2RlZiBzdGFydF9kZWJ1Z2dlcihycGNoYW5kbGVyLCBndWlfYWRhcF9vaWQpOgorICAgICIiIlN0YXJ0IHRoZSBkZWJ1Z2dlciBhbmQgaXRzIFJQQyBsaW5rIGluIHRoZSBQeXRob24gc3VicHJvY2VzcworCisgICAgU3RhcnQgdGhlIHN1YnByb2Nlc3Mgc2lkZSBvZiB0aGUgc3BsaXQgZGVidWdnZXIgYW5kIHNldCB1cCB0aGF0IHNpZGUgb2YgdGhlCisgICAgUlBDIGxpbmsgYnkgaW5zdGFudGlhdGluZyB0aGUgR1VJUHJveHksIElkYiBkZWJ1Z2dlciwgYW5kIElkYkFkYXB0ZXIKKyAgICBvYmplY3RzIGFuZCBsaW5raW5nIHRoZW0gdG9nZXRoZXIuICBSZWdpc3RlciB0aGUgSWRiQWRhcHRlciB3aXRoIHRoZQorICAgIFJQQ1NlcnZlciB0byBoYW5kbGUgUlBDIHJlcXVlc3RzIGZyb20gdGhlIHNwbGl0IGRlYnVnZ2VyIEdVSSB2aWEgdGhlCisgICAgSWRiUHJveHkuCisKKyAgICAiIiIKKyAgICBndWlfcHJveHkgPSBHVUlQcm94eShycGNoYW5kbGVyLCBndWlfYWRhcF9vaWQpCisgICAgaWRiID0gRGVidWdnZXIuSWRiKGd1aV9wcm94eSkKKyAgICBpZGJfYWRhcCA9IElkYkFkYXB0ZXIoaWRiKQorICAgIHJwY2hhbmRsZXIucmVnaXN0ZXIoaWRiX2FkYXBfb2lkLCBpZGJfYWRhcCkKKyAgICByZXR1cm4gaWRiX2FkYXBfb2lkCisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBJbiB0aGUgSURMRSBwcm9jZXNzOgorCisKK2NsYXNzIEZyYW1lUHJveHk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubiwgZmlkKToKKyAgICAgICAgc2VsZi5fY29ubiA9IGNvbm4KKyAgICAgICAgc2VsZi5fZmlkID0gZmlkCisgICAgICAgIHNlbGYuX29pZCA9ICJpZGJfYWRhcHRlciIKKyAgICAgICAgc2VsZi5fZGljdGNhY2hlID0ge30KKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZVs6MV0gPT0gIl8iOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKyAgICAgICAgaWYgbmFtZSA9PSAiZl9jb2RlIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZl9jb2RlKCkKKyAgICAgICAgaWYgbmFtZSA9PSAiZl9nbG9iYWxzIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZl9nbG9iYWxzKCkKKyAgICAgICAgaWYgbmFtZSA9PSAiZl9sb2NhbHMiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9mX2xvY2FscygpCisgICAgICAgIHJldHVybiBzZWxmLl9jb25uLnJlbW90ZWNhbGwoc2VsZi5fb2lkLCAiZnJhbWVfYXR0ciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX2ZpZCwgbmFtZSksIHt9KQorCisgICAgZGVmIF9nZXRfZl9jb2RlKHNlbGYpOgorICAgICAgICBjaWQgPSBzZWxmLl9jb25uLnJlbW90ZWNhbGwoc2VsZi5fb2lkLCAiZnJhbWVfY29kZSIsIChzZWxmLl9maWQsKSwge30pCisgICAgICAgIHJldHVybiBDb2RlUHJveHkoc2VsZi5fY29ubiwgc2VsZi5fb2lkLCBjaWQpCisKKyAgICBkZWYgX2dldF9mX2dsb2JhbHMoc2VsZik6CisgICAgICAgIGRpZCA9IHNlbGYuX2Nvbm4ucmVtb3RlY2FsbChzZWxmLl9vaWQsICJmcmFtZV9nbG9iYWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9maWQsKSwge30pCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZGljdF9wcm94eShkaWQpCisKKyAgICBkZWYgX2dldF9mX2xvY2FscyhzZWxmKToKKyAgICAgICAgZGlkID0gc2VsZi5fY29ubi5yZW1vdGVjYWxsKHNlbGYuX29pZCwgImZyYW1lX2xvY2FscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fZmlkLCksIHt9KQorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2RpY3RfcHJveHkoZGlkKQorCisgICAgZGVmIF9nZXRfZGljdF9wcm94eShzZWxmLCBkaWQpOgorICAgICAgICBpZiBkaWQgaW4gc2VsZi5fZGljdGNhY2hlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpY3RjYWNoZVtkaWRdCisgICAgICAgIGRwID0gRGljdFByb3h5KHNlbGYuX2Nvbm4sIHNlbGYuX29pZCwgZGlkKQorICAgICAgICBzZWxmLl9kaWN0Y2FjaGVbZGlkXSA9IGRwCisgICAgICAgIHJldHVybiBkcAorCisKK2NsYXNzIENvZGVQcm94eToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCBvaWQsIGNpZCk6CisgICAgICAgIHNlbGYuX2Nvbm4gPSBjb25uCisgICAgICAgIHNlbGYuX29pZCA9IG9pZAorICAgICAgICBzZWxmLl9jaWQgPSBjaWQKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSA9PSAiY29fbmFtZSI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29ubi5yZW1vdGVjYWxsKHNlbGYuX29pZCwgImNvZGVfbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9jaWQsKSwge30pCisgICAgICAgIGlmIG5hbWUgPT0gImNvX2ZpbGVuYW1lIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb25uLnJlbW90ZWNhbGwoc2VsZi5fb2lkLCAiY29kZV9maWxlbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9jaWQsKSwge30pCisKKworY2xhc3MgRGljdFByb3h5OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIG9pZCwgZGlkKToKKyAgICAgICAgc2VsZi5fY29ubiA9IGNvbm4KKyAgICAgICAgc2VsZi5fb2lkID0gb2lkCisgICAgICAgIHNlbGYuX2RpZCA9IGRpZAorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb25uLnJlbW90ZWNhbGwoc2VsZi5fb2lkLCAiZGljdF9rZXlzIiwgKHNlbGYuX2RpZCwpLCB7fSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29ubi5yZW1vdGVjYWxsKHNlbGYuX29pZCwgImRpY3RfaXRlbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX2RpZCwga2V5KSwge30pCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgICMjcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgImZhaWxlZCBEaWN0UHJveHkuX19nZXRhdHRyX186IiwgbmFtZQorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorCisKK2NsYXNzIEdVSUFkYXB0ZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubiwgZ3VpKToKKyAgICAgICAgc2VsZi5jb25uID0gY29ubgorICAgICAgICBzZWxmLmd1aSA9IGd1aQorCisgICAgZGVmIGludGVyYWN0aW9uKHNlbGYsIG1lc3NhZ2UsIGZpZCwgbW9kaWZpZWRfaW5mbyk6CisgICAgICAgICMjcHJpbnQgImludGVyYWN0aW9uOiAoJXMsICVzLCAlcykiICUgKG1lc3NhZ2UsIGZpZCwgbW9kaWZpZWRfaW5mbykKKyAgICAgICAgZnJhbWUgPSBGcmFtZVByb3h5KHNlbGYuY29ubiwgZmlkKQorICAgICAgICBzZWxmLmd1aS5pbnRlcmFjdGlvbihtZXNzYWdlLCBmcmFtZSwgbW9kaWZpZWRfaW5mbykKKworCitjbGFzcyBJZGJQcm94eToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCBzaGVsbCwgb2lkKToKKyAgICAgICAgc2VsZi5vaWQgPSBvaWQKKyAgICAgICAgc2VsZi5jb25uID0gY29ubgorICAgICAgICBzZWxmLnNoZWxsID0gc2hlbGwKKworICAgIGRlZiBjYWxsKHNlbGYsIG1ldGhvZG5hbWUsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICMjcHJpbnQgIioqSWRiUHJveHkuY2FsbCAlcyAlcyAlcyIgJSAobWV0aG9kbmFtZSwgYXJncywga3dhcmdzKQorICAgICAgICB2YWx1ZSA9IHNlbGYuY29ubi5yZW1vdGVjYWxsKHNlbGYub2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpCisgICAgICAgICMjcHJpbnQgIioqSWRiUHJveHkuY2FsbCAlcyByZXR1cm5zICVyIiAlIChtZXRob2RuYW1lLCB2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgcnVuKHNlbGYsIGNtZCwgbG9jYWxzKToKKyAgICAgICAgIyBJZ25vcmVzIGxvY2FscyBvbiBwdXJwb3NlIQorICAgICAgICBzZXEgPSBzZWxmLmNvbm4uYXN5bmNxdWV1ZShzZWxmLm9pZCwgInJ1biIsIChjbWQsKSwge30pCisgICAgICAgIHNlbGYuc2hlbGwuaW50ZXJwLmFjdGl2ZV9zZXEgPSBzZXEKKworICAgIGRlZiBnZXRfc3RhY2soc2VsZiwgZnJhbWUsIHRiaWQpOgorICAgICAgICAjIHBhc3NpbmcgZnJhbWUgYW5kIHRyYWNlYmFjayBJRHMsIG5vdCB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzCisgICAgICAgIHN0YWNrLCBpID0gc2VsZi5jYWxsKCJnZXRfc3RhY2siLCBmcmFtZS5fZmlkLCB0YmlkKQorICAgICAgICBzdGFjayA9IFsoRnJhbWVQcm94eShzZWxmLmNvbm4sIGZpZCksIGspIGZvciBmaWQsIGsgaW4gc3RhY2tdCisgICAgICAgIHJldHVybiBzdGFjaywgaQorCisgICAgZGVmIHNldF9jb250aW51ZShzZWxmKToKKyAgICAgICAgc2VsZi5jYWxsKCJzZXRfY29udGludWUiKQorCisgICAgZGVmIHNldF9zdGVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhbGwoInNldF9zdGVwIikKKworICAgIGRlZiBzZXRfbmV4dChzZWxmLCBmcmFtZSk6CisgICAgICAgIHNlbGYuY2FsbCgic2V0X25leHQiLCBmcmFtZS5fZmlkKQorCisgICAgZGVmIHNldF9yZXR1cm4oc2VsZiwgZnJhbWUpOgorICAgICAgICBzZWxmLmNhbGwoInNldF9yZXR1cm4iLCBmcmFtZS5fZmlkKQorCisgICAgZGVmIHNldF9xdWl0KHNlbGYpOgorICAgICAgICBzZWxmLmNhbGwoInNldF9xdWl0IikKKworICAgIGRlZiBzZXRfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIG1zZyA9IHNlbGYuY2FsbCgic2V0X2JyZWFrIiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgcmV0dXJuIG1zZworCisgICAgZGVmIGNsZWFyX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBtc2cgPSBzZWxmLmNhbGwoImNsZWFyX2JyZWFrIiwgZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgcmV0dXJuIG1zZworCisgICAgZGVmIGNsZWFyX2FsbF9maWxlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIG1zZyA9IHNlbGYuY2FsbCgiY2xlYXJfYWxsX2ZpbGVfYnJlYWtzIiwgZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBtc2cKKworZGVmIHN0YXJ0X3JlbW90ZV9kZWJ1Z2dlcihycGNjbHQsIHB5c2hlbGwpOgorICAgICIiIlN0YXJ0IHRoZSBzdWJwcm9jZXNzIGRlYnVnZ2VyLCBpbml0aWFsaXplIHRoZSBkZWJ1Z2dlciBHVUkgYW5kIFJQQyBsaW5rCisKKyAgICBSZXF1ZXN0IHRoZSBSUENTZXJ2ZXIgc3RhcnQgdGhlIFB5dGhvbiBzdWJwcm9jZXNzIGRlYnVnZ2VyIGFuZCBsaW5rLiAgU2V0CisgICAgdXAgdGhlIElkbGUgc2lkZSBvZiB0aGUgc3BsaXQgZGVidWdnZXIgYnkgaW5zdGFudGlhdGluZyB0aGUgSWRiUHJveHksCisgICAgZGVidWdnZXIgR1VJLCBhbmQgZGVidWdnZXIgR1VJQWRhcHRlciBvYmplY3RzIGFuZCBsaW5raW5nIHRoZW0gdG9nZXRoZXIuCisKKyAgICBSZWdpc3RlciB0aGUgR1VJQWRhcHRlciB3aXRoIHRoZSBSUENDbGllbnQgdG8gaGFuZGxlIGRlYnVnZ2VyIEdVSQorICAgIGludGVyYWN0aW9uIHJlcXVlc3RzIGNvbWluZyBmcm9tIHRoZSBzdWJwcm9jZXNzIGRlYnVnZ2VyIHZpYSB0aGUgR1VJUHJveHkuCisKKyAgICBUaGUgSWRiQWRhcHRlciB3aWxsIHBhc3MgZXhlY3V0aW9uIGFuZCBlbnZpcm9ubWVudCByZXF1ZXN0cyBjb21pbmcgZnJvbSB0aGUKKyAgICBJZGxlIGRlYnVnZ2VyIEdVSSB0byB0aGUgc3VicHJvY2VzcyBkZWJ1Z2dlciB2aWEgdGhlIElkYlByb3h5LgorCisgICAgIiIiCisgICAgZ2xvYmFsIGlkYl9hZGFwX29pZAorCisgICAgaWRiX2FkYXBfb2lkID0gcnBjY2x0LnJlbW90ZWNhbGwoImV4ZWMiLCAic3RhcnRfdGhlX2RlYnVnZ2VyIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWlfYWRhcF9vaWQsKSwge30pCisgICAgaWRiX3Byb3h5ID0gSWRiUHJveHkocnBjY2x0LCBweXNoZWxsLCBpZGJfYWRhcF9vaWQpCisgICAgZ3VpID0gRGVidWdnZXIuRGVidWdnZXIocHlzaGVsbCwgaWRiX3Byb3h5KQorICAgIGd1aV9hZGFwID0gR1VJQWRhcHRlcihycGNjbHQsIGd1aSkKKyAgICBycGNjbHQucmVnaXN0ZXIoZ3VpX2FkYXBfb2lkLCBndWlfYWRhcCkKKyAgICByZXR1cm4gZ3VpCisKK2RlZiBjbG9zZV9yZW1vdGVfZGVidWdnZXIocnBjY2x0KToKKyAgICAiIiJTaHV0IGRvd24gc3VicHJvY2VzcyBkZWJ1Z2dlciBhbmQgSWRsZSBzaWRlIG9mIGRlYnVnZ2VyIFJQQyBsaW5rCisKKyAgICBSZXF1ZXN0IHRoYXQgdGhlIFJQQ1NlcnZlciBzaHV0IGRvd24gdGhlIHN1YnByb2Nlc3MgZGVidWdnZXIgYW5kIGxpbmsuCisgICAgVW5yZWdpc3RlciB0aGUgR1VJQWRhcHRlciwgd2hpY2ggd2lsbCBjYXVzZSBhIEdDIG9uIHRoZSBJZGxlIHByb2Nlc3MKKyAgICBkZWJ1Z2dlciBhbmQgUlBDIGxpbmsgb2JqZWN0cy4gIChUaGUgc2Vjb25kIHJlZmVyZW5jZSB0byB0aGUgZGVidWdnZXIgR1VJCisgICAgaXMgZGVsZXRlZCBpbiBQeVNoZWxsLmNsb3NlX3JlbW90ZV9kZWJ1Z2dlcigpLikKKworICAgICIiIgorICAgIGNsb3NlX3N1YnByb2Nlc3NfZGVidWdnZXIocnBjY2x0KQorICAgIHJwY2NsdC51bnJlZ2lzdGVyKGd1aV9hZGFwX29pZCkKKworZGVmIGNsb3NlX3N1YnByb2Nlc3NfZGVidWdnZXIocnBjY2x0KToKKyAgICBycGNjbHQucmVtb3RlY2FsbCgiZXhlYyIsICJzdG9wX3RoZV9kZWJ1Z2dlciIsIChpZGJfYWRhcF9vaWQsKSwge30pCisKK2RlZiByZXN0YXJ0X3N1YnByb2Nlc3NfZGVidWdnZXIocnBjY2x0KToKKyAgICBpZGJfYWRhcF9vaWRfcmV0ID0gcnBjY2x0LnJlbW90ZWNhbGwoImV4ZWMiLCAic3RhcnRfdGhlX2RlYnVnZ2VyIixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChndWlfYWRhcF9vaWQsKSwge30pCisgICAgYXNzZXJ0IGlkYl9hZGFwX29pZF9yZXQgPT0gaWRiX2FkYXBfb2lkLCAnSWRiIHJlc3RhcnRlZCB3aXRoIGRpZmZlcmVudCBvaWQnCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjlkODNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlRGVidWdnZXIucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTk2ZjRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JlbW90ZURlYnVnZ2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVPYmplY3RCcm93c2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZTJjNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weQpAQCAtMCwwICsxLDM2IEBACitmcm9tIGlkbGVsaWIgaW1wb3J0IHJwYworCitkZWYgcmVtb3RlX29iamVjdF90cmVlX2l0ZW0oaXRlbSk6CisgICAgd3JhcHBlciA9IFdyYXBwZWRPYmplY3RUcmVlSXRlbShpdGVtKQorICAgIG9pZCA9IGlkKHdyYXBwZXIpCisgICAgcnBjLm9iamVjdHRhYmxlW29pZF0gPSB3cmFwcGVyCisgICAgcmV0dXJuIG9pZAorCitjbGFzcyBXcmFwcGVkT2JqZWN0VHJlZUl0ZW06CisgICAgIyBMaXZlcyBpbiBQWVRIT04gc3VicHJvY2VzcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZW0pOgorICAgICAgICBzZWxmLl9faXRlbSA9IGl0ZW0KKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgdmFsdWUgPSBnZXRhdHRyKHNlbGYuX19pdGVtLCBuYW1lKQorICAgICAgICByZXR1cm4gdmFsdWUKKworICAgIGRlZiBfR2V0U3ViTGlzdChzZWxmKToKKyAgICAgICAgbGlzdCA9IHNlbGYuX19pdGVtLl9HZXRTdWJMaXN0KCkKKyAgICAgICAgcmV0dXJuIG1hcChyZW1vdGVfb2JqZWN0X3RyZWVfaXRlbSwgbGlzdCkKKworY2xhc3MgU3R1Yk9iamVjdFRyZWVJdGVtOgorICAgICMgTGl2ZXMgaW4gSURMRSBwcm9jZXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29ja2lvLCBvaWQpOgorICAgICAgICBzZWxmLnNvY2tpbyA9IHNvY2tpbworICAgICAgICBzZWxmLm9pZCA9IG9pZAorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICB2YWx1ZSA9IHJwYy5NZXRob2RQcm94eShzZWxmLnNvY2tpbywgc2VsZi5vaWQsIG5hbWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIF9HZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBsaXN0ID0gc2VsZi5zb2NraW8ucmVtb3RlY2FsbChzZWxmLm9pZCwgIl9HZXRTdWJMaXN0IiwgKCksIHt9KQorICAgICAgICByZXR1cm4gW1N0dWJPYmplY3RUcmVlSXRlbShzZWxmLnNvY2tpbywgb2lkKSBmb3Igb2lkIGluIGxpc3RdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0MzQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVPYmplY3RCcm93c2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVtb3RlT2JqZWN0QnJvd3Nlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0MzQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZW1vdGVPYmplY3RCcm93c2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzI3MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weQpAQCAtMCwwICsxLDE4OSBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2Zyb20gaWRsZWxpYiBpbXBvcnQgU2VhcmNoRW5naW5lCitmcm9tIGlkbGVsaWIuU2VhcmNoRGlhbG9nQmFzZSBpbXBvcnQgU2VhcmNoRGlhbG9nQmFzZQoraW1wb3J0IHJlCisKKworZGVmIHJlcGxhY2UodGV4dCk6CisgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQorICAgIGVuZ2luZSA9IFNlYXJjaEVuZ2luZS5nZXQocm9vdCkKKyAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfcmVwbGFjZWRpYWxvZyIpOgorICAgICAgICBlbmdpbmUuX3JlcGxhY2VkaWFsb2cgPSBSZXBsYWNlRGlhbG9nKHJvb3QsIGVuZ2luZSkKKyAgICBkaWFsb2cgPSBlbmdpbmUuX3JlcGxhY2VkaWFsb2cKKyAgICBkaWFsb2cub3Blbih0ZXh0KQorCisKK2NsYXNzIFJlcGxhY2VEaWFsb2coU2VhcmNoRGlhbG9nQmFzZSk6CisKKyAgICB0aXRsZSA9ICJSZXBsYWNlIERpYWxvZyIKKyAgICBpY29uID0gIlJlcGxhY2UiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCwgZW5naW5lKToKKyAgICAgICAgU2VhcmNoRGlhbG9nQmFzZS5fX2luaXRfXyhzZWxmLCByb290LCBlbmdpbmUpCisgICAgICAgIHNlbGYucmVwbHZhciA9IFN0cmluZ1Zhcihyb290KQorCisgICAgZGVmIG9wZW4oc2VsZiwgdGV4dCk6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2Uub3BlbihzZWxmLCB0ZXh0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaXJzdCA9IHRleHQuaW5kZXgoInNlbC5maXJzdCIpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgIGZpcnN0ID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsYXN0ID0gdGV4dC5pbmRleCgic2VsLmxhc3QiKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICBsYXN0ID0gTm9uZQorICAgICAgICBmaXJzdCA9IGZpcnN0IG9yIHRleHQuaW5kZXgoImluc2VydCIpCisgICAgICAgIGxhc3QgPSBsYXN0IG9yIGZpcnN0CisgICAgICAgIHNlbGYuc2hvd19oaXQoZmlyc3QsIGxhc3QpCisgICAgICAgIHNlbGYub2sgPSAxCisKKyAgICBkZWYgY3JlYXRlX2VudHJpZXMoc2VsZik6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2VudHJpZXMoc2VsZikKKyAgICAgICAgc2VsZi5yZXBsZW50ID0gc2VsZi5tYWtlX2VudHJ5KCJSZXBsYWNlIHdpdGg6Iiwgc2VsZi5yZXBsdmFyKQorCisgICAgZGVmIGNyZWF0ZV9jb21tYW5kX2J1dHRvbnMoc2VsZik6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKQorICAgICAgICBzZWxmLm1ha2VfYnV0dG9uKCJGaW5kIiwgc2VsZi5maW5kX2l0KQorICAgICAgICBzZWxmLm1ha2VfYnV0dG9uKCJSZXBsYWNlIiwgc2VsZi5yZXBsYWNlX2l0KQorICAgICAgICBzZWxmLm1ha2VfYnV0dG9uKCJSZXBsYWNlK0ZpbmQiLCBzZWxmLmRlZmF1bHRfY29tbWFuZCwgMSkKKyAgICAgICAgc2VsZi5tYWtlX2J1dHRvbigiUmVwbGFjZSBBbGwiLCBzZWxmLnJlcGxhY2VfYWxsKQorCisgICAgZGVmIGZpbmRfaXQoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYuZG9fZmluZCgwKQorCisgICAgZGVmIHJlcGxhY2VfaXQoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuZG9fZmluZChzZWxmLm9rKToKKyAgICAgICAgICAgIHNlbGYuZG9fcmVwbGFjZSgpCisKKyAgICBkZWYgZGVmYXVsdF9jb21tYW5kKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLmRvX2ZpbmQoc2VsZi5vayk6CisgICAgICAgICAgICBpZiBzZWxmLmRvX3JlcGxhY2UoKTogICAjIE9ubHkgZmluZCBuZXh0IG1hdGNoIGlmIHJlcGxhY2Ugc3VjY2VlZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBIGJhZCByZSBjYW4gY2F1c2UgYSBpdCB0byBmYWlsLgorICAgICAgICAgICAgICAgIHNlbGYuZG9fZmluZCgwKQorCisgICAgZGVmIF9yZXBsYWNlX2V4cGFuZChzZWxmLCBtLCByZXBsKToKKyAgICAgICAgIiIiIEhlbHBlciBmdW5jdGlvbiBmb3IgZXhwYW5kaW5nIGEgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgICAgICBpbiB0aGUgcmVwbGFjZSBmaWVsZCwgaWYgbmVlZGVkLiAiIiIKKyAgICAgICAgaWYgc2VsZi5lbmdpbmUuaXNyZSgpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5ldyA9IG0uZXhwYW5kKHJlcGwpCisgICAgICAgICAgICBleGNlcHQgcmUuZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5lbmdpbmUucmVwb3J0X2Vycm9yKHJlcGwsICdJbnZhbGlkIFJlcGxhY2UgRXhwcmVzc2lvbicpCisgICAgICAgICAgICAgICAgbmV3ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3ID0gcmVwbAorICAgICAgICByZXR1cm4gbmV3CisKKyAgICBkZWYgcmVwbGFjZV9hbGwoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHByb2cgPSBzZWxmLmVuZ2luZS5nZXRwcm9nKCkKKyAgICAgICAgaWYgbm90IHByb2c6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmVwbCA9IHNlbGYucmVwbHZhci5nZXQoKQorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHJlcyA9IHNlbGYuZW5naW5lLnNlYXJjaF90ZXh0KHRleHQsIHByb2cpCisgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRleHQudGFnX3JlbW92ZSgic2VsIiwgIjEuMCIsICJlbmQiKQorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoImhpdCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgbGluZSA9IHJlc1swXQorICAgICAgICBjb2wgPSByZXNbMV0uc3RhcnQoKQorICAgICAgICBpZiBzZWxmLmVuZ2luZS5pc3dyYXAoKToKKyAgICAgICAgICAgIGxpbmUgPSAxCisgICAgICAgICAgICBjb2wgPSAwCisgICAgICAgIG9rID0gMQorICAgICAgICBmaXJzdCA9IGxhc3QgPSBOb25lCisgICAgICAgICMgWFhYIG91Z2h0IHRvIHJlcGxhY2UgY2lyY3VsYXIgaW5zdGVhZCBvZiB0b3AtdG8tYm90dG9tIHdoZW4gd3JhcHBpbmcKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHJlcyA9IHNlbGYuZW5naW5lLnNlYXJjaF9mb3J3YXJkKHRleHQsIHByb2csIGxpbmUsIGNvbCwgMCwgb2spCisgICAgICAgICAgICBpZiBub3QgcmVzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsaW5lLCBtID0gcmVzCisgICAgICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmUsICIlZC4wIiAlIChsaW5lKzEpKQorICAgICAgICAgICAgb3JpZyA9IG0uZ3JvdXAoKQorICAgICAgICAgICAgbmV3ID0gc2VsZi5fcmVwbGFjZV9leHBhbmQobSwgcmVwbCkKKyAgICAgICAgICAgIGlmIG5ldyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpLCBqID0gbS5zcGFuKCkKKyAgICAgICAgICAgIGZpcnN0ID0gIiVkLiVkIiAlIChsaW5lLCBpKQorICAgICAgICAgICAgbGFzdCA9ICIlZC4lZCIgJSAobGluZSwgaikKKyAgICAgICAgICAgIGlmIG5ldyA9PSBvcmlnOgorICAgICAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGxhc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGZpcnN0KQorICAgICAgICAgICAgICAgIGlmIGZpcnN0ICE9IGxhc3Q6CisgICAgICAgICAgICAgICAgICAgIHRleHQuZGVsZXRlKGZpcnN0LCBsYXN0KQorICAgICAgICAgICAgICAgIGlmIG5ldzoKKyAgICAgICAgICAgICAgICAgICAgdGV4dC5pbnNlcnQoZmlyc3QsIG5ldykKKyAgICAgICAgICAgIGNvbCA9IGkgKyBsZW4obmV3KQorICAgICAgICAgICAgb2sgPSAwCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKyAgICAgICAgaWYgZmlyc3QgYW5kIGxhc3Q6CisgICAgICAgICAgICBzZWxmLnNob3dfaGl0KGZpcnN0LCBsYXN0KQorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBkb19maW5kKHNlbGYsIG9rPTApOgorICAgICAgICBpZiBub3Qgc2VsZi5lbmdpbmUuZ2V0cHJvZygpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHRleHQgPSBzZWxmLnRleHQKKyAgICAgICAgcmVzID0gc2VsZi5lbmdpbmUuc2VhcmNoX3RleHQodGV4dCwgTm9uZSwgb2spCisgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGxpbmUsIG0gPSByZXMKKyAgICAgICAgaSwgaiA9IG0uc3BhbigpCisgICAgICAgIGZpcnN0ID0gIiVkLiVkIiAlIChsaW5lLCBpKQorICAgICAgICBsYXN0ID0gIiVkLiVkIiAlIChsaW5lLCBqKQorICAgICAgICBzZWxmLnNob3dfaGl0KGZpcnN0LCBsYXN0KQorICAgICAgICBzZWxmLm9rID0gMQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGRvX3JlcGxhY2Uoc2VsZik6CisgICAgICAgIHByb2cgPSBzZWxmLmVuZ2luZS5nZXRwcm9nKCkKKyAgICAgICAgaWYgbm90IHByb2c6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgdGV4dCA9IHNlbGYudGV4dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaXJzdCA9IHBvcyA9IHRleHQuaW5kZXgoInNlbC5maXJzdCIpCisgICAgICAgICAgICBsYXN0ID0gdGV4dC5pbmRleCgic2VsLmxhc3QiKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICBwb3MgPSBOb25lCisgICAgICAgIGlmIG5vdCBwb3M6CisgICAgICAgICAgICBmaXJzdCA9IGxhc3QgPSBwb3MgPSB0ZXh0LmluZGV4KCJpbnNlcnQiKQorICAgICAgICBsaW5lLCBjb2wgPSBTZWFyY2hFbmdpbmUuZ2V0X2xpbmVfY29sKHBvcykKKyAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lLCAiJWQuMCIgJSAobGluZSsxKSkKKyAgICAgICAgbSA9IHByb2cubWF0Y2goY2hhcnMsIGNvbCkKKyAgICAgICAgaWYgbm90IHByb2c6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgbmV3ID0gc2VsZi5fcmVwbGFjZV9leHBhbmQobSwgc2VsZi5yZXBsdmFyLmdldCgpKQorICAgICAgICBpZiBuZXcgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBmaXJzdCkKKyAgICAgICAgdGV4dC51bmRvX2Jsb2NrX3N0YXJ0KCkKKyAgICAgICAgaWYgbS5ncm91cCgpOgorICAgICAgICAgICAgdGV4dC5kZWxldGUoZmlyc3QsIGxhc3QpCisgICAgICAgIGlmIG5ldzoKKyAgICAgICAgICAgIHRleHQuaW5zZXJ0KGZpcnN0LCBuZXcpCisgICAgICAgIHRleHQudW5kb19ibG9ja19zdG9wKCkKKyAgICAgICAgc2VsZi5zaG93X2hpdChmaXJzdCwgdGV4dC5pbmRleCgiaW5zZXJ0IikpCisgICAgICAgIHNlbGYub2sgPSAwCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2hvd19oaXQoc2VsZiwgZmlyc3QsIGxhc3QpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisgICAgICAgIHRleHQubWFya19zZXQoImluc2VydCIsIGZpcnN0KQorICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgdGV4dC50YWdfYWRkKCJzZWwiLCBmaXJzdCwgbGFzdCkKKyAgICAgICAgdGV4dC50YWdfcmVtb3ZlKCJoaXQiLCAiMS4wIiwgImVuZCIpCisgICAgICAgIGlmIGZpcnN0ID09IGxhc3Q6CisgICAgICAgICAgICB0ZXh0LnRhZ19hZGQoImhpdCIsIGZpcnN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dC50YWdfYWRkKCJoaXQiLCBmaXJzdCwgbGFzdCkKKyAgICAgICAgdGV4dC5zZWUoImluc2VydCIpCisgICAgICAgIHRleHQudXBkYXRlX2lkbGV0YXNrcygpCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIFNlYXJjaERpYWxvZ0Jhc2UuY2xvc2Uoc2VsZiwgZXZlbnQpCisgICAgICAgIHNlbGYudGV4dC50YWdfcmVtb3ZlKCJoaXQiLCAiMS4wIiwgImVuZCIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlMjgxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUmVwbGFjZURpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVlMjgxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9SZXBsYWNlRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWUzNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weQpAQCAtMCwwICsxLDI5IEBACisnUHJvdmlkZXMgIlN0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UiIHVuZGVyIHRoZSAiRm9ybWF0IiBtZW51LicKKworX19hdXRob3JfXyA9ICJSb2dlciBELiBTZXJ3eSA8cm9nZXIuc2Vyd3kgYXQgZ21haWwuY29tPiIKKworY2xhc3MgUnN0cmlwRXh0ZW5zaW9uOgorCisgICAgbWVudWRlZnMgPSBbCisgICAgICAgICgnZm9ybWF0JywgW05vbmUsCisgICAgICAgICAgICAgICAoJ1N0cmlwIHRyYWlsaW5nIHdoaXRlc3BhY2UnLCAnPDxkby1yc3RyaXA+PicpLAorICAgICAgIF0pLF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorICAgICAgICBzZWxmLmVkaXR3aW4udGV4dC5iaW5kKCI8PGRvLXJzdHJpcD4+Iiwgc2VsZi5kb19yc3RyaXApCisKKyAgICBkZWYgZG9fcnN0cmlwKHNlbGYsIGV2ZW50PU5vbmUpOgorCisgICAgICAgIHRleHQgPSBzZWxmLmVkaXR3aW4udGV4dAorICAgICAgICB1bmRvID0gc2VsZi5lZGl0d2luLnVuZG8KKworICAgICAgICB1bmRvLnVuZG9fYmxvY2tfc3RhcnQoKQorCisgICAgICAgIGVuZF9saW5lID0gaW50KGZsb2F0KHRleHQuaW5kZXgoJ2VuZCcpKSkgKyAxCisgICAgICAgIGZvciBjdXIgaW4gcmFuZ2UoMSwgZW5kX2xpbmUpOgorICAgICAgICAgICAgdHh0ID0gdGV4dC5nZXQoJyVpLjAnICUgY3VyLCAnJWkuMCBsaW5lZW5kJyAlIGN1cikKKyAgICAgICAgICAgIGN1dCA9IGxlbih0eHQucnN0cmlwKCkpCisgICAgICAgICAgICB0ZXh0LmRlbGV0ZSgnJWkuJWknICUgKGN1ciwgY3V0KSwgJyVpLjAgbGluZWVuZCcgJSBjdXIpCisKKyAgICAgICAgdW5kby51bmRvX2Jsb2NrX3N0b3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI1Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvUnN0cmlwRXh0ZW5zaW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmI1Nzc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1JzdHJpcEV4dGVuc2lvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2NyaXB0QmluZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWFjNDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKQEAgLTAsMCArMSwyMjMgQEAKKyIiIkV4dGVuc2lvbiB0byBleGVjdXRlIGNvZGUgb3V0c2lkZSB0aGUgUHl0aG9uIHNoZWxsIHdpbmRvdy4KKworVGhpcyBhZGRzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CisKKy0gQ2hlY2sgbW9kdWxlIGRvZXMgYSBmdWxsIHN5bnRheCBjaGVjayBvZiB0aGUgY3VycmVudCBtb2R1bGUuCisgIEl0IGFsc28gcnVucyB0aGUgdGFibmFubnkgdG8gY2F0Y2ggYW55IGluY29uc2lzdGVudCB0YWJzLgorCistIFJ1biBtb2R1bGUgZXhlY3V0ZXMgdGhlIG1vZHVsZSdzIGNvZGUgaW4gdGhlIF9fbWFpbl9fIG5hbWVzcGFjZS4gIFRoZSB3aW5kb3cKKyAgbXVzdCBoYXZlIGJlZW4gc2F2ZWQgcHJldmlvdXNseS4gVGhlIG1vZHVsZSBpcyBhZGRlZCB0byBzeXMubW9kdWxlcywgYW5kIGlzCisgIGFsc28gYWRkZWQgdG8gdGhlIF9fbWFpbl9fIG5hbWVzcGFjZS4KKworWFhYIEd2UiBSZWRlc2lnbiB0aGlzIGludGVyZmFjZSAoeWV0IGFnYWluKSBhcyBmb2xsb3dzOgorCistIFByZXNlbnQgYSBkaWFsb2cgYm94IGZvciBgYFJ1biBNb2R1bGUnJworCistIEFsbG93IHNwZWNpZnkgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBpbiB0aGUgZGlhbG9nIGJveAorCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB0YWJuYW5ueQoraW1wb3J0IHRva2VuaXplCitpbXBvcnQgdGtNZXNzYWdlQm94Citmcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKKworZnJvbSBpZGxlbGliLmNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCitmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKworSURFTlRDSEFSUyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICJfIgorCitpbmRlbnRfbWVzc2FnZSA9ICIiIkVycm9yOiBJbmNvbnNpc3RlbnQgaW5kZW50YXRpb24gZGV0ZWN0ZWQhCisKKzEpIFlvdXIgaW5kZW50YXRpb24gaXMgb3V0cmlnaHQgaW5jb3JyZWN0IChlYXN5IHRvIGZpeCksIE9SCisKKzIpIFlvdXIgaW5kZW50YXRpb24gbWl4ZXMgdGFicyBhbmQgc3BhY2VzLgorCitUbyBmaXggY2FzZSAyLCBjaGFuZ2UgYWxsIHRhYnMgdG8gc3BhY2VzIGJ5IHVzaW5nIEVkaXQtPlNlbGVjdCBBbGwgZm9sbG93ZWQgXAorYnkgRm9ybWF0LT5VbnRhYmlmeSBSZWdpb24gYW5kIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zIHVzZWQgYnkgZWFjaCB0YWIuCisiIiIKKworY2xhc3MgU2NyaXB0QmluZGluZzoKKworICAgIG1lbnVkZWZzID0gWworICAgICAgICAoJ3J1bicsIFtOb25lLAorICAgICAgICAgICAgICAgICAoJ0NoZWNrIE1vZHVsZScsICc8PGNoZWNrLW1vZHVsZT4+JyksCisgICAgICAgICAgICAgICAgICgnUnVuIE1vZHVsZScsICc8PHJ1bi1tb2R1bGU+PicpLCBdKSwgXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgorICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCisgICAgICAgICMgUHJvdmlkZSBpbnN0YW5jZSB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieSBEZWJ1Z2dlcgorICAgICAgICAjIFhYWCBUaGlzIHNob3VsZCBiZSBkb25lIGRpZmZlcmVudGx5CisgICAgICAgIHNlbGYuZmxpc3QgPSBzZWxmLmVkaXR3aW4uZmxpc3QKKyAgICAgICAgc2VsZi5yb290ID0gc2VsZi5lZGl0d2luLnJvb3QKKworICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgc2VsZi5lZGl0d2luLnRleHRfZnJhbWUuYmluZCgnPDxydW4tbW9kdWxlLWV2ZW50LTI+PicsIHNlbGYuX3J1bl9tb2R1bGVfZXZlbnQpCisKKyAgICBkZWYgY2hlY2tfbW9kdWxlX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldGZpbGVuYW1lKCkKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuICdicmVhaycKKyAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tzeW50YXgoZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuICdicmVhaycKKyAgICAgICAgaWYgbm90IHNlbGYudGFibmFubnkoZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuICdicmVhaycKKworICAgIGRlZiB0YWJuYW5ueShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAncicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhYm5hbm55LnByb2Nlc3NfdG9rZW5zKHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKSkKKyAgICAgICAgZXhjZXB0IHRva2VuaXplLlRva2VuRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIG1zZ3R4dCwgKGxpbmVubywgc3RhcnQpID0gbXNnCisgICAgICAgICAgICBzZWxmLmVkaXR3aW4uZ290b2xpbmUobGluZW5vKQorICAgICAgICAgICAgc2VsZi5lcnJvcmJveCgiVGFibmFubnkgVG9rZW5pemluZyBFcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUb2tlbiBFcnJvcjogJXMiICUgbXNndHh0KQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGV4Y2VwdCB0YWJuYW5ueS5OYW5ueU5hZywgbmFnOgorICAgICAgICAgICAgIyBUaGUgZXJyb3IgbWVzc2FnZXMgZnJvbSB0YWJuYW5ueSBhcmUgdG9vIGNvbmZ1c2luZy4uLgorICAgICAgICAgICAgc2VsZi5lZGl0d2luLmdvdG9saW5lKG5hZy5nZXRfbGluZW5vKCkpCisgICAgICAgICAgICBzZWxmLmVycm9yYm94KCJUYWIvc3BhY2UgZXJyb3IiLCBpbmRlbnRfbWVzc2FnZSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNoZWNrc3ludGF4KHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5zaGVsbCA9IHNoZWxsID0gc2VsZi5mbGlzdC5vcGVuX3NoZWxsKCkKKyAgICAgICAgc2F2ZWRfc3RyZWFtID0gc2hlbGwuZ2V0X3dhcm5pbmdfc3RyZWFtKCkKKyAgICAgICAgc2hlbGwuc2V0X3dhcm5pbmdfc3RyZWFtKHNoZWxsLnN0ZGVycikKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyJykKKyAgICAgICAgc291cmNlID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGlmICdccicgaW4gc291cmNlOgorICAgICAgICAgICAgc291cmNlID0gcmUuc3ViKHIiXHJcbiIsICJcbiIsIHNvdXJjZSkKKyAgICAgICAgICAgIHNvdXJjZSA9IHJlLnN1YihyIlxyIiwgIlxuIiwgc291cmNlKQorICAgICAgICBpZiBzb3VyY2UgYW5kIHNvdXJjZVstMV0gIT0gJ1xuJzoKKyAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZSArICdcbicKKyAgICAgICAgdGV4dCA9IHNlbGYuZWRpdHdpbi50ZXh0CisgICAgICAgIHRleHQudGFnX3JlbW92ZSgiRVJST1IiLCAiMS4wIiwgImVuZCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIElmIHN1Y2Nlc3NmdWwsIHJldHVybiB0aGUgY29tcGlsZWQgY29kZQorICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlKHNvdXJjZSwgZmlsZW5hbWUsICJleGVjIikKKyAgICAgICAgICAgIGV4Y2VwdCAoU3ludGF4RXJyb3IsIE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpLCBlcnI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtc2csIChlcnJvcmZpbGVuYW1lLCBsaW5lbm8sIG9mZnNldCwgbGluZSkgPSBlcnIKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVycm9yZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIuYXJncyA9IG1zZywgKGZpbGVuYW1lLCBsaW5lbm8sIG9mZnNldCwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyci5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sb3JpemVfc3ludGF4X2Vycm9yKG1zZywgbGluZW5vLCBvZmZzZXQpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBtc2cgPSAiKioqICIgKyBzdHIoZXJyKQorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3Jib3goIlN5bnRheCBlcnJvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUncyBhbiBlcnJvciBpbiB5b3VyIHByb2dyYW06XG4iICsgbXNnKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2hlbGwuc2V0X3dhcm5pbmdfc3RyZWFtKHNhdmVkX3N0cmVhbSkKKworICAgIGRlZiBjb2xvcml6ZV9zeW50YXhfZXJyb3Ioc2VsZiwgbXNnLCBsaW5lbm8sIG9mZnNldCk6CisgICAgICAgIHRleHQgPSBzZWxmLmVkaXR3aW4udGV4dAorICAgICAgICBwb3MgPSAiMC4wICsgJWQgbGluZXMgKyAlZCBjaGFycyIgJSAobGluZW5vLTEsIG9mZnNldC0xKQorICAgICAgICB0ZXh0LnRhZ19hZGQoIkVSUk9SIiwgcG9zKQorICAgICAgICBjaGFyID0gdGV4dC5nZXQocG9zKQorICAgICAgICBpZiBjaGFyIGFuZCBjaGFyIGluIElERU5UQ0hBUlM6CisgICAgICAgICAgICB0ZXh0LnRhZ19hZGQoIkVSUk9SIiwgcG9zICsgIiB3b3Jkc3RhcnQiLCBwb3MpCisgICAgICAgIGlmICdcbicgPT0gdGV4dC5nZXQocG9zKTogICAjIGVycm9yIGF0IGxpbmUgZW5kCisgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBwb3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBwb3MgKyAiKzFjIikKKyAgICAgICAgdGV4dC5zZWUocG9zKQorCisgICAgZGVmIHJ1bl9tb2R1bGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiIiJSdW4gdGhlIG1vZHVsZSBhZnRlciBzZXR0aW5nIHVwIHRoZSBlbnZpcm9ubWVudC4KKworICAgICAgICBGaXJzdCBjaGVjayB0aGUgc3ludGF4LiAgSWYgT0ssIG1ha2Ugc3VyZSB0aGUgc2hlbGwgaXMgYWN0aXZlIGFuZAorICAgICAgICB0aGVuIHRyYW5zZmVyIHRoZSBhcmd1bWVudHMsIHNldCB0aGUgcnVuIGVudmlyb25tZW50J3Mgd29ya2luZworICAgICAgICBkaXJlY3RvcnkgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgbW9kdWxlIGJlaW5nIGV4ZWN1dGVkIGFuZCBhbHNvCisgICAgICAgIGFkZCB0aGF0IGRpcmVjdG9yeSB0byBpdHMgc3lzLnBhdGggaWYgbm90IGFscmVhZHkgaW5jbHVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5nZXRmaWxlbmFtZSgpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCisgICAgICAgIGNvZGUgPSBzZWxmLmNoZWNrc3ludGF4KGZpbGVuYW1lKQorICAgICAgICBpZiBub3QgY29kZToKKyAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCisgICAgICAgIGlmIG5vdCBzZWxmLnRhYm5hbm55KGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCisgICAgICAgIGludGVycCA9IHNlbGYuc2hlbGwuaW50ZXJwCisgICAgICAgIGlmIFB5U2hlbGwudXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICBpbnRlcnAucmVzdGFydF9zdWJwcm9jZXNzKHdpdGhfY3dkPUZhbHNlKQorICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5kaXJuYW1lKGZpbGVuYW1lKQorICAgICAgICAjIFhYWCBUb28gb2Z0ZW4gdGhpcyBkaXNjYXJkcyBhcmd1bWVudHMgdGhlIHVzZXIganVzdCBzZXQuLi4KKyAgICAgICAgaW50ZXJwLnJ1bmNvbW1hbmQoIiIiaWYgMToKKyAgICAgICAgICAgIF9maWxlbmFtZSA9ICVyCisgICAgICAgICAgICBpbXBvcnQgc3lzIGFzIF9zeXMKKyAgICAgICAgICAgIGZyb20gb3MucGF0aCBpbXBvcnQgYmFzZW5hbWUgYXMgX2Jhc2VuYW1lCisgICAgICAgICAgICBpZiAobm90IF9zeXMuYXJndiBvcgorICAgICAgICAgICAgICAgIF9iYXNlbmFtZShfc3lzLmFyZ3ZbMF0pICE9IF9iYXNlbmFtZShfZmlsZW5hbWUpKToKKyAgICAgICAgICAgICAgICBfc3lzLmFyZ3YgPSBbX2ZpbGVuYW1lXQorICAgICAgICAgICAgaW1wb3J0IG9zIGFzIF9vcworICAgICAgICAgICAgX29zLmNoZGlyKCVyKQorICAgICAgICAgICAgZGVsIF9maWxlbmFtZSwgX3N5cywgX2Jhc2VuYW1lLCBfb3MKKyAgICAgICAgICAgIFxuIiIiICUgKGZpbGVuYW1lLCBkaXJuYW1lKSkKKyAgICAgICAgaW50ZXJwLnByZXBlbmRfc3lzcGF0aChmaWxlbmFtZSkKKyAgICAgICAgIyBYWFggS0JLIDAzSnVsMDQgV2hlbiBydW4gdy9vIHN1YnByb2Nlc3MsIHJ1bnRpbWUgd2FybmluZ3Mgc3RpbGwKKyAgICAgICAgIyAgICAgICAgIGdvIHRvIF9fc3RkZXJyX18uICBXaXRoIHN1YnByb2Nlc3MsIHRoZXkgZ28gdG8gdGhlIHNoZWxsLgorICAgICAgICAjICAgICAgICAgTmVlZCB0byBjaGFuZ2Ugc3RyZWFtcyBpbiBQeVNoZWxsLk1vZGlmaWVkSW50ZXJwcmV0ZXIuCisgICAgICAgIGludGVycC5ydW5jb2RlKGNvZGUpCisgICAgICAgIHJldHVybiAnYnJlYWsnCisKKyAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAjIFRrLUNvY29hIGluIE1hY09TWCBpcyBicm9rZW4gdW50aWwgYXQgbGVhc3QKKyAgICAgICAgIyBUayA4LjUuOSwgYW5kIHdpdGhvdXQgdGhpcyByYXRoZXIKKyAgICAgICAgIyBjcnVkZSB3b3JrYXJvdW5kIElETEUgd291bGQgaGFuZyB3aGVuIGEgdXNlcgorICAgICAgICAjIHRyaWVzIHRvIHJ1biBhIG1vZHVsZSB1c2luZyB0aGUga2V5Ym9hcmQgc2hvcnRjdXQKKyAgICAgICAgIyAodGhlIG1lbnUgaXRlbSB3b3JrcyBmaW5lKS4KKyAgICAgICAgX3J1bl9tb2R1bGVfZXZlbnQgPSBydW5fbW9kdWxlX2V2ZW50CisKKyAgICAgICAgZGVmIHJ1bl9tb2R1bGVfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAgICAgc2VsZi5lZGl0d2luLnRleHRfZnJhbWUuYWZ0ZXIoMjAwLAorICAgICAgICAgICAgICAgIGxhbWJkYTogc2VsZi5lZGl0d2luLnRleHRfZnJhbWUuZXZlbnRfZ2VuZXJhdGUoJzw8cnVuLW1vZHVsZS1ldmVudC0yPj4nKSkKKyAgICAgICAgICAgIHJldHVybiAnYnJlYWsnCisKKyAgICBkZWYgZ2V0ZmlsZW5hbWUoc2VsZik6CisgICAgICAgICIiIkdldCBzb3VyY2UgZmlsZW5hbWUuICBJZiBub3Qgc2F2ZWQsIG9mZmVyIHRvIHNhdmUgKG9yIGNyZWF0ZSkgZmlsZQorCisgICAgICAgIFRoZSBkZWJ1Z2dlciByZXF1aXJlcyBhIHNvdXJjZSBmaWxlLiAgTWFrZSBzdXJlIHRoZXJlIGlzIG9uZSwgYW5kIHRoYXQKKyAgICAgICAgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgc291cmNlIGJ1ZmZlciBoYXMgYmVlbiBzYXZlZC4gIElmIHRoZSB1c2VyCisgICAgICAgIGRlY2xpbmVzIHRvIHNhdmUgb3IgY2FuY2VscyB0aGUgU2F2ZSBBcyBkaWFsb2csIHJldHVybiBOb25lLgorCisgICAgICAgIElmIHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIElETEUgZm9yIEF1dG9zYXZlLCB0aGUgZmlsZSB3aWxsIGJlCisgICAgICAgIHNpbGVudGx5IHNhdmVkIGlmIGl0IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBkaXJ0eS4KKworICAgICAgICAiIiIKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmVkaXR3aW4uaW8uZmlsZW5hbWUKKyAgICAgICAgaWYgbm90IHNlbGYuZWRpdHdpbi5nZXRfc2F2ZWQoKToKKyAgICAgICAgICAgIGF1dG9zYXZlID0gaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0dlbmVyYWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dG9zYXZlJywgdHlwZT0nYm9vbCcpCisgICAgICAgICAgICBpZiBhdXRvc2F2ZSBhbmQgZmlsZW5hbWU6CisgICAgICAgICAgICAgICAgc2VsZi5lZGl0d2luLmlvLnNhdmUoTm9uZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29uZmlybSA9IHNlbGYuYXNrX3NhdmVfZGlhbG9nKCkKKyAgICAgICAgICAgICAgICBzZWxmLmVkaXR3aW4udGV4dC5mb2N1c19zZXQoKQorICAgICAgICAgICAgICAgIGlmIGNvbmZpcm06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5pby5zYXZlKE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gc2VsZi5lZGl0d2luLmlvLmZpbGVuYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBOb25lCisgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIGFza19zYXZlX2RpYWxvZyhzZWxmKToKKyAgICAgICAgbXNnID0gIlNvdXJjZSBNdXN0IEJlIFNhdmVkXG4iICsgNSonICcgKyAiT0sgdG8gU2F2ZT8iCisgICAgICAgIGNvbmZpcm0gPSB0a01lc3NhZ2VCb3guYXNrb2tjYW5jZWwodGl0bGU9IlNhdmUgQmVmb3JlIFJ1biBvciBDaGVjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT1tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD10a01lc3NhZ2VCb3guT0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyPXNlbGYuZWRpdHdpbi50ZXh0KQorICAgICAgICByZXR1cm4gY29uZmlybQorCisgICAgZGVmIGVycm9yYm94KHNlbGYsIHRpdGxlLCBtZXNzYWdlKToKKyAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgcmVhbGx5IGJlIGEgZnVuY3Rpb24gb2YgRWRpdG9yV2luZG93Li4uCisgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGUsIG1lc3NhZ2UsIG1hc3Rlcj1zZWxmLmVkaXR3aW4udGV4dCkKKyAgICAgICAgc2VsZi5lZGl0d2luLnRleHQuZm9jdXNfc2V0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWVjM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWVjM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JvbGxlZExpc3QucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTE5MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5CkBAIC0wLDAgKzEsMTM5IEBACitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworY2xhc3MgU2Nyb2xsZWRMaXN0OgorCisgICAgZGVmYXVsdCA9ICIoTm9uZSkiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKm9wdGlvbnMpOgorICAgICAgICAjIENyZWF0ZSB0b3AgZnJhbWUsIHdpdGggc2Nyb2xsYmFyIGFuZCBsaXN0Ym94CisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYuZnJhbWUgPSBmcmFtZSA9IEZyYW1lKG1hc3RlcikKKyAgICAgICAgc2VsZi5mcmFtZS5wYWNrKGZpbGw9ImJvdGgiLCBleHBhbmQ9MSkKKyAgICAgICAgc2VsZi52YmFyID0gdmJhciA9IFNjcm9sbGJhcihmcmFtZSwgbmFtZT0idmJhciIpCisgICAgICAgIHNlbGYudmJhci5wYWNrKHNpZGU9InJpZ2h0IiwgZmlsbD0ieSIpCisgICAgICAgIHNlbGYubGlzdGJveCA9IGxpc3Rib3ggPSBMaXN0Ym94KGZyYW1lLCBleHBvcnRzZWxlY3Rpb249MCwKKyAgICAgICAgICAgIGJhY2tncm91bmQ9IndoaXRlIikKKyAgICAgICAgaWYgb3B0aW9uczoKKyAgICAgICAgICAgIGxpc3Rib3guY29uZmlndXJlKG9wdGlvbnMpCisgICAgICAgIGxpc3Rib3gucGFjayhleHBhbmQ9MSwgZmlsbD0iYm90aCIpCisgICAgICAgICMgVGllIGxpc3Rib3ggYW5kIHNjcm9sbGJhciB0b2dldGhlcgorICAgICAgICB2YmFyWyJjb21tYW5kIl0gPSBsaXN0Ym94Lnl2aWV3CisgICAgICAgIGxpc3Rib3hbInlzY3JvbGxjb21tYW5kIl0gPSB2YmFyLnNldAorICAgICAgICAjIEJpbmQgZXZlbnRzIHRvIHRoZSBsaXN0IGJveAorICAgICAgICBsaXN0Ym94LmJpbmQoIjxCdXR0b25SZWxlYXNlLTE+Iiwgc2VsZi5jbGlja19ldmVudCkKKyAgICAgICAgbGlzdGJveC5iaW5kKCI8RG91YmxlLUJ1dHRvblJlbGVhc2UtMT4iLCBzZWxmLmRvdWJsZV9jbGlja19ldmVudCkKKyAgICAgICAgbGlzdGJveC5iaW5kKCI8QnV0dG9uUHJlc3MtMz4iLCBzZWxmLnBvcHVwX2V2ZW50KQorICAgICAgICBsaXN0Ym94LmJpbmQoIjxLZXktVXA+Iiwgc2VsZi51cF9ldmVudCkKKyAgICAgICAgbGlzdGJveC5iaW5kKCI8S2V5LURvd24+Iiwgc2VsZi5kb3duX2V2ZW50KQorICAgICAgICAjIE1hcmsgYXMgZW1wdHkKKyAgICAgICAgc2VsZi5jbGVhcigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZnJhbWUuZGVzdHJveSgpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYubGlzdGJveC5kZWxldGUoMCwgImVuZCIpCisgICAgICAgIHNlbGYuZW1wdHkgPSAxCisgICAgICAgIHNlbGYubGlzdGJveC5pbnNlcnQoImVuZCIsIHNlbGYuZGVmYXVsdCkKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CisgICAgICAgIGlmIHNlbGYuZW1wdHk6CisgICAgICAgICAgICBzZWxmLmxpc3Rib3guZGVsZXRlKDAsICJlbmQiKQorICAgICAgICAgICAgc2VsZi5lbXB0eSA9IDAKKyAgICAgICAgc2VsZi5saXN0Ym94Lmluc2VydCgiZW5kIiwgc3RyKGl0ZW0pKQorCisgICAgZGVmIGdldChzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLmxpc3Rib3guZ2V0KGluZGV4KQorCisgICAgZGVmIGNsaWNrX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5saXN0Ym94LmFjdGl2YXRlKCJAJWQsJWQiICUgKGV2ZW50LngsIGV2ZW50LnkpKQorICAgICAgICBpbmRleCA9IHNlbGYubGlzdGJveC5pbmRleCgiYWN0aXZlIikKKyAgICAgICAgc2VsZi5zZWxlY3QoaW5kZXgpCisgICAgICAgIHNlbGYub25fc2VsZWN0KGluZGV4KQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGRvdWJsZV9jbGlja19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGluZGV4ID0gc2VsZi5saXN0Ym94LmluZGV4KCJhY3RpdmUiKQorICAgICAgICBzZWxmLnNlbGVjdChpbmRleCkKKyAgICAgICAgc2VsZi5vbl9kb3VibGUoaW5kZXgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBtZW51ID0gTm9uZQorCisgICAgZGVmIHBvcHVwX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IHNlbGYubWVudToKKyAgICAgICAgICAgIHNlbGYubWFrZV9tZW51KCkKKyAgICAgICAgbWVudSA9IHNlbGYubWVudQorICAgICAgICBzZWxmLmxpc3Rib3guYWN0aXZhdGUoIkAlZCwlZCIgJSAoZXZlbnQueCwgZXZlbnQueSkpCisgICAgICAgIGluZGV4ID0gc2VsZi5saXN0Ym94LmluZGV4KCJhY3RpdmUiKQorICAgICAgICBzZWxmLnNlbGVjdChpbmRleCkKKyAgICAgICAgbWVudS50a19wb3B1cChldmVudC54X3Jvb3QsIGV2ZW50Lnlfcm9vdCkKKworICAgIGRlZiBtYWtlX21lbnUoc2VsZik6CisgICAgICAgIG1lbnUgPSBNZW51KHNlbGYubGlzdGJveCwgdGVhcm9mZj0wKQorICAgICAgICBzZWxmLm1lbnUgPSBtZW51CisgICAgICAgIHNlbGYuZmlsbF9tZW51KCkKKworICAgIGRlZiB1cF9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGluZGV4ID0gc2VsZi5saXN0Ym94LmluZGV4KCJhY3RpdmUiKQorICAgICAgICBpZiBzZWxmLmxpc3Rib3guc2VsZWN0aW9uX2luY2x1ZGVzKGluZGV4KToKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggLSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmRleCA9IHNlbGYubGlzdGJveC5zaXplKCkgLSAxCisgICAgICAgIGlmIGluZGV4IDwgMDoKKyAgICAgICAgICAgIHNlbGYubGlzdGJveC5iZWxsKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0KGluZGV4KQorICAgICAgICAgICAgc2VsZi5vbl9zZWxlY3QoaW5kZXgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgZG93bl9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGluZGV4ID0gc2VsZi5saXN0Ym94LmluZGV4KCJhY3RpdmUiKQorICAgICAgICBpZiBzZWxmLmxpc3Rib3guc2VsZWN0aW9uX2luY2x1ZGVzKGluZGV4KToKKyAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgaWYgaW5kZXggPj0gc2VsZi5saXN0Ym94LnNpemUoKToKKyAgICAgICAgICAgIHNlbGYubGlzdGJveC5iZWxsKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0KGluZGV4KQorICAgICAgICAgICAgc2VsZi5vbl9zZWxlY3QoaW5kZXgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgc2VsZWN0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi5saXN0Ym94LmZvY3VzX3NldCgpCisgICAgICAgIHNlbGYubGlzdGJveC5hY3RpdmF0ZShpbmRleCkKKyAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdGlvbl9jbGVhcigwLCAiZW5kIikKKyAgICAgICAgc2VsZi5saXN0Ym94LnNlbGVjdGlvbl9zZXQoaW5kZXgpCisgICAgICAgIHNlbGYubGlzdGJveC5zZWUoaW5kZXgpCisKKyAgICAjIE1ldGhvZHMgdG8gb3ZlcnJpZGUgZm9yIHNwZWNpZmljIGFjdGlvbnMKKworICAgIGRlZiBmaWxsX21lbnUoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBvbl9zZWxlY3Qoc2VsZiwgaW5kZXgpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb25fZG91YmxlKHNlbGYsIGluZGV4KToKKyAgICAgICAgcGFzcworCisKK2RlZiB0ZXN0KCk6CisgICAgcm9vdCA9IFRrKCkKKyAgICByb290LnByb3RvY29sKCJXTV9ERUxFVEVfV0lORE9XIiwgcm9vdC5kZXN0cm95KQorICAgIGNsYXNzIE15U2Nyb2xsZWRMaXN0KFNjcm9sbGVkTGlzdCk6CisgICAgICAgIGRlZiBmaWxsX21lbnUoc2VsZik6IHNlbGYubWVudS5hZGRfY29tbWFuZChsYWJlbD0icGFzcyIpCisgICAgICAgIGRlZiBvbl9zZWxlY3Qoc2VsZiwgaW5kZXgpOiBwcmludCAic2VsZWN0Iiwgc2VsZi5nZXQoaW5kZXgpCisgICAgICAgIGRlZiBvbl9kb3VibGUoc2VsZiwgaW5kZXgpOiBwcmludCAiZG91YmxlIiwgc2VsZi5nZXQoaW5kZXgpCisgICAgcyA9IE15U2Nyb2xsZWRMaXN0KHJvb3QpCisgICAgZm9yIGkgaW4gcmFuZ2UoMzApOgorICAgICAgICBzLmFwcGVuZCgiaXRlbSAlMDJkIiAlIGkpCisgICAgcmV0dXJuIHJvb3QKKworZGVmIG1haW4oKToKKyAgICByb290ID0gdGVzdCgpCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JvbGxlZExpc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NmMxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TY3JvbGxlZExpc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NmMxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2Nyb2xsZWRMaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzcwYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZy5weQpAQCAtMCwwICsxLDY4IEBACitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworZnJvbSBpZGxlbGliIGltcG9ydCBTZWFyY2hFbmdpbmUKK2Zyb20gaWRsZWxpYi5TZWFyY2hEaWFsb2dCYXNlIGltcG9ydCBTZWFyY2hEaWFsb2dCYXNlCisKK2RlZiBfc2V0dXAodGV4dCk6CisgICAgcm9vdCA9IHRleHQuX3Jvb3QoKQorICAgIGVuZ2luZSA9IFNlYXJjaEVuZ2luZS5nZXQocm9vdCkKKyAgICBpZiBub3QgaGFzYXR0cihlbmdpbmUsICJfc2VhcmNoZGlhbG9nIik6CisgICAgICAgIGVuZ2luZS5fc2VhcmNoZGlhbG9nID0gU2VhcmNoRGlhbG9nKHJvb3QsIGVuZ2luZSkKKyAgICByZXR1cm4gZW5naW5lLl9zZWFyY2hkaWFsb2cKKworZGVmIGZpbmQodGV4dCk6CisgICAgcGF0ID0gdGV4dC5nZXQoInNlbC5maXJzdCIsICJzZWwubGFzdCIpCisgICAgcmV0dXJuIF9zZXR1cCh0ZXh0KS5vcGVuKHRleHQscGF0KQorCitkZWYgZmluZF9hZ2Fpbih0ZXh0KToKKyAgICByZXR1cm4gX3NldHVwKHRleHQpLmZpbmRfYWdhaW4odGV4dCkKKworZGVmIGZpbmRfc2VsZWN0aW9uKHRleHQpOgorICAgIHJldHVybiBfc2V0dXAodGV4dCkuZmluZF9zZWxlY3Rpb24odGV4dCkKKworY2xhc3MgU2VhcmNoRGlhbG9nKFNlYXJjaERpYWxvZ0Jhc2UpOgorCisgICAgZGVmIGNyZWF0ZV93aWRnZXRzKHNlbGYpOgorICAgICAgICBmID0gU2VhcmNoRGlhbG9nQmFzZS5jcmVhdGVfd2lkZ2V0cyhzZWxmKQorICAgICAgICBzZWxmLm1ha2VfYnV0dG9uKCJGaW5kIiwgc2VsZi5kZWZhdWx0X2NvbW1hbmQsIDEpCisKKyAgICBkZWYgZGVmYXVsdF9jb21tYW5kKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5lbmdpbmUuZ2V0cHJvZygpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuZmluZF9hZ2FpbihzZWxmLnRleHQpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZmluZF9hZ2FpbihzZWxmLCB0ZXh0KToKKyAgICAgICAgaWYgbm90IHNlbGYuZW5naW5lLmdldHBhdCgpOgorICAgICAgICAgICAgc2VsZi5vcGVuKHRleHQpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgbm90IHNlbGYuZW5naW5lLmdldHByb2coKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXMgPSBzZWxmLmVuZ2luZS5zZWFyY2hfdGV4dCh0ZXh0KQorICAgICAgICBpZiByZXM6CisgICAgICAgICAgICBsaW5lLCBtID0gcmVzCisgICAgICAgICAgICBpLCBqID0gbS5zcGFuKCkKKyAgICAgICAgICAgIGZpcnN0ID0gIiVkLiVkIiAlIChsaW5lLCBpKQorICAgICAgICAgICAgbGFzdCA9ICIlZC4lZCIgJSAobGluZSwgaikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmaXJzdCA9IHRleHQuaW5kZXgoInNlbC5maXJzdCIpCisgICAgICAgICAgICAgICAgc2VsbGFzdCA9IHRleHQuaW5kZXgoInNlbC5sYXN0IikKKyAgICAgICAgICAgICAgICBpZiBzZWxmaXJzdCA9PSBmaXJzdCBhbmQgc2VsbGFzdCA9PSBsYXN0OgorICAgICAgICAgICAgICAgICAgICB0ZXh0LmJlbGwoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0ZXh0LnRhZ19yZW1vdmUoInNlbCIsICIxLjAiLCAiZW5kIikKKyAgICAgICAgICAgIHRleHQudGFnX2FkZCgic2VsIiwgZmlyc3QsIGxhc3QpCisgICAgICAgICAgICB0ZXh0Lm1hcmtfc2V0KCJpbnNlcnQiLCBzZWxmLmVuZ2luZS5pc2JhY2soKSBhbmQgZmlyc3Qgb3IgbGFzdCkKKyAgICAgICAgICAgIHRleHQuc2VlKCJpbnNlcnQiKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQuYmVsbCgpCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBmaW5kX3NlbGVjdGlvbihzZWxmLCB0ZXh0KToKKyAgICAgICAgcGF0ID0gdGV4dC5nZXQoInNlbC5maXJzdCIsICJzZWwubGFzdCIpCisgICAgICAgIGlmIHBhdDoKKyAgICAgICAgICAgIHNlbGYuZW5naW5lLnNldGNvb2tlZHBhdChwYXQpCisgICAgICAgIHJldHVybiBzZWxmLmZpbmRfYWdhaW4odGV4dCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3ODE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3ODE2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYzZTdhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hEaWFsb2dCYXNlLnB5CkBAIC0wLDAgKzEsMTQwIEBACitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworY2xhc3MgU2VhcmNoRGlhbG9nQmFzZToKKworICAgIHRpdGxlID0gIlNlYXJjaCBEaWFsb2ciCisgICAgaWNvbiA9ICJTZWFyY2giCisgICAgbmVlZHdyYXBidXR0b24gPSAxCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCwgZW5naW5lKToKKyAgICAgICAgc2VsZi5yb290ID0gcm9vdAorICAgICAgICBzZWxmLmVuZ2luZSA9IGVuZ2luZQorICAgICAgICBzZWxmLnRvcCA9IE5vbmUKKworICAgIGRlZiBvcGVuKHNlbGYsIHRleHQsIHNlYXJjaHBocmFzZT1Ob25lKToKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBpZiBub3Qgc2VsZi50b3A6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV93aWRnZXRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudG9wLmRlaWNvbmlmeSgpCisgICAgICAgICAgICBzZWxmLnRvcC50a3JhaXNlKCkKKyAgICAgICAgaWYgc2VhcmNocGhyYXNlOgorICAgICAgICAgICAgc2VsZi5lbnQuZGVsZXRlKDAsImVuZCIpCisgICAgICAgICAgICBzZWxmLmVudC5pbnNlcnQoImVuZCIsc2VhcmNocGhyYXNlKQorICAgICAgICBzZWxmLmVudC5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLmVudC5zZWxlY3Rpb25fcmFuZ2UoMCwgImVuZCIpCisgICAgICAgIHNlbGYuZW50LmljdXJzb3IoMCkKKyAgICAgICAgc2VsZi50b3AuZ3JhYl9zZXQoKQorCisgICAgZGVmIGNsb3NlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLnRvcDoKKyAgICAgICAgICAgIHNlbGYudG9wLmdyYWJfcmVsZWFzZSgpCisgICAgICAgICAgICBzZWxmLnRvcC53aXRoZHJhdygpCisKKyAgICBkZWYgY3JlYXRlX3dpZGdldHMoc2VsZik6CisgICAgICAgIHRvcCA9IFRvcGxldmVsKHNlbGYucm9vdCkKKyAgICAgICAgdG9wLmJpbmQoIjxSZXR1cm4+Iiwgc2VsZi5kZWZhdWx0X2NvbW1hbmQpCisgICAgICAgIHRvcC5iaW5kKCI8RXNjYXBlPiIsIHNlbGYuY2xvc2UpCisgICAgICAgIHRvcC5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuY2xvc2UpCisgICAgICAgIHRvcC53bV90aXRsZShzZWxmLnRpdGxlKQorICAgICAgICB0b3Aud21faWNvbm5hbWUoc2VsZi5pY29uKQorICAgICAgICBzZWxmLnRvcCA9IHRvcAorCisgICAgICAgIHNlbGYucm93ID0gMAorICAgICAgICBzZWxmLnRvcC5ncmlkX2NvbHVtbmNvbmZpZ3VyZSgwLCBwYWQ9Miwgd2VpZ2h0PTApCisgICAgICAgIHNlbGYudG9wLmdyaWRfY29sdW1uY29uZmlndXJlKDEsIHBhZD0yLCBtaW5zaXplPTEwMCwgd2VpZ2h0PTEwMCkKKworICAgICAgICBzZWxmLmNyZWF0ZV9lbnRyaWVzKCkKKyAgICAgICAgc2VsZi5jcmVhdGVfb3B0aW9uX2J1dHRvbnMoKQorICAgICAgICBzZWxmLmNyZWF0ZV9vdGhlcl9idXR0b25zKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY3JlYXRlX2NvbW1hbmRfYnV0dG9ucygpCisKKyAgICBkZWYgbWFrZV9lbnRyeShzZWxmLCBsYWJlbCwgdmFyKToKKyAgICAgICAgbCA9IExhYmVsKHNlbGYudG9wLCB0ZXh0PWxhYmVsKQorICAgICAgICBsLmdyaWQocm93PXNlbGYucm93LCBjb2x1bW49MCwgc3RpY2t5PSJudyIpCisgICAgICAgIGUgPSBFbnRyeShzZWxmLnRvcCwgdGV4dHZhcmlhYmxlPXZhciwgZXhwb3J0c2VsZWN0aW9uPTApCisgICAgICAgIGUuZ3JpZChyb3c9c2VsZi5yb3csIGNvbHVtbj0xLCBzdGlja3k9Im53ZSIpCisgICAgICAgIHNlbGYucm93ID0gc2VsZi5yb3cgKyAxCisgICAgICAgIHJldHVybiBlCisKKyAgICBkZWYgbWFrZV9mcmFtZShzZWxmLGxhYmVsdGV4dD1Ob25lKToKKyAgICAgICAgaWYgbGFiZWx0ZXh0OgorICAgICAgICAgICAgbCA9IExhYmVsKHNlbGYudG9wLCB0ZXh0PWxhYmVsdGV4dCkKKyAgICAgICAgICAgIGwuZ3JpZChyb3c9c2VsZi5yb3csIGNvbHVtbj0wLCBzdGlja3k9Im53IikKKyAgICAgICAgZiA9IEZyYW1lKHNlbGYudG9wKQorICAgICAgICBmLmdyaWQocm93PXNlbGYucm93LCBjb2x1bW49MSwgY29sdW1uc3Bhbj0xLCBzdGlja3k9Im53ZSIpCisgICAgICAgIHNlbGYucm93ID0gc2VsZi5yb3cgKyAxCisgICAgICAgIHJldHVybiBmCisKKyAgICBkZWYgbWFrZV9idXR0b24oc2VsZiwgbGFiZWwsIGNvbW1hbmQsIGlzZGVmPTApOgorICAgICAgICBiID0gQnV0dG9uKHNlbGYuYnV0dG9uZnJhbWUsCisgICAgICAgICAgICAgICAgICAgdGV4dD1sYWJlbCwgY29tbWFuZD1jb21tYW5kLAorICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9aXNkZWYgYW5kICJhY3RpdmUiIG9yICJub3JtYWwiKQorICAgICAgICBjb2xzLHJvd3M9c2VsZi5idXR0b25mcmFtZS5ncmlkX3NpemUoKQorICAgICAgICBiLmdyaWQocGFkeT0xLHJvdz1yb3dzLGNvbHVtbj0wLHN0aWNreT0iZXciKQorICAgICAgICBzZWxmLmJ1dHRvbmZyYW1lLmdyaWQocm93c3Bhbj1yb3dzKzEpCisgICAgICAgIHJldHVybiBiCisKKyAgICBkZWYgY3JlYXRlX2VudHJpZXMoc2VsZik6CisgICAgICAgIHNlbGYuZW50ID0gc2VsZi5tYWtlX2VudHJ5KCJGaW5kOiIsIHNlbGYuZW5naW5lLnBhdHZhcikKKworICAgIGRlZiBjcmVhdGVfb3B0aW9uX2J1dHRvbnMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm1ha2VfZnJhbWUoIk9wdGlvbnMiKQorCisgICAgICAgIGJ0biA9IENoZWNrYnV0dG9uKGYsIGFuY2hvcj0idyIsCisgICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5lbmdpbmUucmV2YXIsCisgICAgICAgICAgICAgICAgdGV4dD0iUmVndWxhciBleHByZXNzaW9uIikKKyAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQorICAgICAgICBpZiBzZWxmLmVuZ2luZS5pc3JlKCk6CisgICAgICAgICAgICBidG4uc2VsZWN0KCkKKworICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmLCBhbmNob3I9InciLAorICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYuZW5naW5lLmNhc2V2YXIsCisgICAgICAgICAgICAgICAgdGV4dD0iTWF0Y2ggY2FzZSIpCisgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKKyAgICAgICAgaWYgc2VsZi5lbmdpbmUuaXNjYXNlKCk6CisgICAgICAgICAgICBidG4uc2VsZWN0KCkKKworICAgICAgICBidG4gPSBDaGVja2J1dHRvbihmLCBhbmNob3I9InciLAorICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYuZW5naW5lLndvcmR2YXIsCisgICAgICAgICAgICAgICAgdGV4dD0iV2hvbGUgd29yZCIpCisgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKKyAgICAgICAgaWYgc2VsZi5lbmdpbmUuaXN3b3JkKCk6CisgICAgICAgICAgICBidG4uc2VsZWN0KCkKKworICAgICAgICBpZiBzZWxmLm5lZWR3cmFwYnV0dG9uOgorICAgICAgICAgICAgYnRuID0gQ2hlY2tidXR0b24oZiwgYW5jaG9yPSJ3IiwKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5lbmdpbmUud3JhcHZhciwKKyAgICAgICAgICAgICAgICAgICAgdGV4dD0iV3JhcCBhcm91bmQiKQorICAgICAgICAgICAgYnRuLnBhY2soc2lkZT0ibGVmdCIsIGZpbGw9ImJvdGgiKQorICAgICAgICAgICAgaWYgc2VsZi5lbmdpbmUuaXN3cmFwKCk6CisgICAgICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisKKyAgICBkZWYgY3JlYXRlX290aGVyX2J1dHRvbnMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLm1ha2VfZnJhbWUoIkRpcmVjdGlvbiIpCisKKyAgICAgICAgI2xibCA9IExhYmVsKGYsIHRleHQ9IkRpcmVjdGlvbjogIikKKyAgICAgICAgI2xibC5wYWNrKHNpZGU9ImxlZnQiKQorCisgICAgICAgIGJ0biA9IFJhZGlvYnV0dG9uKGYsIGFuY2hvcj0idyIsCisgICAgICAgICAgICAgICAgdmFyaWFibGU9c2VsZi5lbmdpbmUuYmFja3ZhciwgdmFsdWU9MSwKKyAgICAgICAgICAgICAgICB0ZXh0PSJVcCIpCisgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKKyAgICAgICAgaWYgc2VsZi5lbmdpbmUuaXNiYWNrKCk6CisgICAgICAgICAgICBidG4uc2VsZWN0KCkKKworICAgICAgICBidG4gPSBSYWRpb2J1dHRvbihmLCBhbmNob3I9InciLAorICAgICAgICAgICAgICAgIHZhcmlhYmxlPXNlbGYuZW5naW5lLmJhY2t2YXIsIHZhbHVlPTAsCisgICAgICAgICAgICAgICAgdGV4dD0iRG93biIpCisgICAgICAgIGJ0bi5wYWNrKHNpZGU9ImxlZnQiLCBmaWxsPSJib3RoIikKKyAgICAgICAgaWYgbm90IHNlbGYuZW5naW5lLmlzYmFjaygpOgorICAgICAgICAgICAgYnRuLnNlbGVjdCgpCisKKyAgICBkZWYgY3JlYXRlX2NvbW1hbmRfYnV0dG9ucyhzZWxmKToKKyAgICAgICAgIworICAgICAgICAjIHBsYWNlIGJ1dHRvbiBmcmFtZSBvbiB0aGUgcmlnaHQKKyAgICAgICAgZiA9IHNlbGYuYnV0dG9uZnJhbWUgPSBGcmFtZShzZWxmLnRvcCkKKyAgICAgICAgZi5ncmlkKHJvdz0wLGNvbHVtbj0yLHBhZHg9MixwYWR5PTIsaXBhZHg9MixpcGFkeT0yKQorCisgICAgICAgIGIgPSBzZWxmLm1ha2VfYnV0dG9uKCJjbG9zZSIsIHNlbGYuY2xvc2UpCisgICAgICAgIGIubG93ZXIoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTJmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaERpYWxvZ0Jhc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTJmMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvU2VhcmNoRGlhbG9nQmFzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaEVuZ2luZS5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0MGEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHkKQEAgLTAsMCArMSwyMjAgQEAKK2ltcG9ydCByZQorZnJvbSBUa2ludGVyIGltcG9ydCAqCitpbXBvcnQgdGtNZXNzYWdlQm94CisKK2RlZiBnZXQocm9vdCk6CisgICAgaWYgbm90IGhhc2F0dHIocm9vdCwgIl9zZWFyY2hlbmdpbmUiKToKKyAgICAgICAgcm9vdC5fc2VhcmNoZW5naW5lID0gU2VhcmNoRW5naW5lKHJvb3QpCisgICAgICAgICMgWFhYIFRoaXMgd2lsbCBuZXZlciBnYXJiYWdlLWNvbGxlY3QgLS0gd2hvIGNhcmVzCisgICAgcmV0dXJuIHJvb3QuX3NlYXJjaGVuZ2luZQorCitjbGFzcyBTZWFyY2hFbmdpbmU6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcm9vdCk6CisgICAgICAgIHNlbGYucm9vdCA9IHJvb3QKKyAgICAgICAgIyBTdGF0ZSBzaGFyZWQgYnkgc2VhcmNoLCByZXBsYWNlLCBhbmQgZ3JlcDsKKyAgICAgICAgIyB0aGUgc2VhcmNoIGRpYWxvZ3MgYmluZCB0aGVzZSB0byBVSSBlbGVtZW50cy4KKyAgICAgICAgc2VsZi5wYXR2YXIgPSBTdHJpbmdWYXIocm9vdCkgICAgICAgICAgICMgc2VhcmNoIHBhdHRlcm4KKyAgICAgICAgc2VsZi5yZXZhciA9IEJvb2xlYW5WYXIocm9vdCkgICAgICAgICAgICMgcmVndWxhciBleHByZXNzaW9uPworICAgICAgICBzZWxmLmNhc2V2YXIgPSBCb29sZWFuVmFyKHJvb3QpICAgICAgICAgIyBtYXRjaCBjYXNlPworICAgICAgICBzZWxmLndvcmR2YXIgPSBCb29sZWFuVmFyKHJvb3QpICAgICAgICAgIyBtYXRjaCB3aG9sZSB3b3JkPworICAgICAgICBzZWxmLndyYXB2YXIgPSBCb29sZWFuVmFyKHJvb3QpICAgICAgICAgIyB3cmFwIGFyb3VuZCBidWZmZXI/CisgICAgICAgIHNlbGYud3JhcHZhci5zZXQoMSkgICAgICAgICAgICAgICAgICAgICAjIChvbiBieSBkZWZhdWx0KQorICAgICAgICBzZWxmLmJhY2t2YXIgPSBCb29sZWFuVmFyKHJvb3QpICAgICAgICAgIyBzZWFyY2ggYmFja3dhcmRzPworCisgICAgIyBBY2Nlc3MgbWV0aG9kcworCisgICAgZGVmIGdldHBhdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGF0dmFyLmdldCgpCisKKyAgICBkZWYgc2V0cGF0KHNlbGYsIHBhdCk6CisgICAgICAgIHNlbGYucGF0dmFyLnNldChwYXQpCisKKyAgICBkZWYgaXNyZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmV2YXIuZ2V0KCkKKworICAgIGRlZiBpc2Nhc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNhc2V2YXIuZ2V0KCkKKworICAgIGRlZiBpc3dvcmQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndvcmR2YXIuZ2V0KCkKKworICAgIGRlZiBpc3dyYXAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndyYXB2YXIuZ2V0KCkKKworICAgIGRlZiBpc2JhY2soc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJhY2t2YXIuZ2V0KCkKKworICAgICMgSGlnaGVyIGxldmVsIGFjY2VzcyBtZXRob2RzCisKKyAgICBkZWYgZ2V0Y29va2VkcGF0KHNlbGYpOgorICAgICAgICBwYXQgPSBzZWxmLmdldHBhdCgpCisgICAgICAgIGlmIG5vdCBzZWxmLmlzcmUoKToKKyAgICAgICAgICAgIHBhdCA9IHJlLmVzY2FwZShwYXQpCisgICAgICAgIGlmIHNlbGYuaXN3b3JkKCk6CisgICAgICAgICAgICBwYXQgPSByIlxiJXNcYiIgJSBwYXQKKyAgICAgICAgcmV0dXJuIHBhdAorCisgICAgZGVmIGdldHByb2coc2VsZik6CisgICAgICAgIHBhdCA9IHNlbGYuZ2V0cGF0KCkKKyAgICAgICAgaWYgbm90IHBhdDoKKyAgICAgICAgICAgIHNlbGYucmVwb3J0X2Vycm9yKHBhdCwgIkVtcHR5IHJlZ3VsYXIgZXhwcmVzc2lvbiIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBwYXQgPSBzZWxmLmdldGNvb2tlZHBhdCgpCisgICAgICAgIGZsYWdzID0gMAorICAgICAgICBpZiBub3Qgc2VsZi5pc2Nhc2UoKToKKyAgICAgICAgICAgIGZsYWdzID0gZmxhZ3MgfCByZS5JR05PUkVDQVNFCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByb2cgPSByZS5jb21waWxlKHBhdCwgZmxhZ3MpCisgICAgICAgIGV4Y2VwdCByZS5lcnJvciwgd2hhdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtc2csIGNvbCA9IHdoYXQKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBtc2cgPSBzdHIod2hhdCkKKyAgICAgICAgICAgICAgICBjb2wgPSAtMQorICAgICAgICAgICAgc2VsZi5yZXBvcnRfZXJyb3IocGF0LCBtc2csIGNvbCkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBwcm9nCisKKyAgICBkZWYgcmVwb3J0X2Vycm9yKHNlbGYsIHBhdCwgbXNnLCBjb2w9LTEpOgorICAgICAgICAjIERlcml2ZWQgY2xhc3MgY291bGQgb3ZlcnJpZCB0aGlzIHdpdGggc29tZXRoaW5nIGZhbmNpZXIKKyAgICAgICAgbXNnID0gIkVycm9yOiAiICsgc3RyKG1zZykKKyAgICAgICAgaWYgcGF0OgorICAgICAgICAgICAgbXNnID0gbXNnICsgIlxucFxQYXR0ZXJuOiAiICsgc3RyKHBhdCkKKyAgICAgICAgaWYgY29sID49IDA6CisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiXG5PZmZzZXQ6ICIgKyBzdHIoY29sKQorICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKCJSZWd1bGFyIGV4cHJlc3Npb24gZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZywgbWFzdGVyPXNlbGYucm9vdCkKKworICAgIGRlZiBzZXRjb29rZWRwYXQoc2VsZiwgcGF0KToKKyAgICAgICAgaWYgc2VsZi5pc3JlKCk6CisgICAgICAgICAgICBwYXQgPSByZS5lc2NhcGUocGF0KQorICAgICAgICBzZWxmLnNldHBhdChwYXQpCisKKyAgICBkZWYgc2VhcmNoX3RleHQoc2VsZiwgdGV4dCwgcHJvZz1Ob25lLCBvaz0wKToKKyAgICAgICAgIiIiU2VhcmNoIGEgdGV4dCB3aWRnZXQgZm9yIHRoZSBwYXR0ZXJuLgorCisgICAgICAgIElmIHByb2cgaXMgZ2l2ZW4sIGl0IHNob3VsZCBiZSB0aGUgcHJlY29tcGlsZWQgcGF0dGVybi4KKyAgICAgICAgUmV0dXJuIGEgdHVwbGUgKGxpbmVubywgbWF0Y2hvYmopOyBOb25lIGlmIG5vdCBmb3VuZC4KKworICAgICAgICBUaGlzIG9iZXlzIHRoZSB3cmFwIGFuZCBkaXJlY3Rpb24gKGJhY2spIHNldHRpbmdzLgorCisgICAgICAgIFRoZSBzZWFyY2ggc3RhcnRzIGF0IHRoZSBzZWxlY3Rpb24gKGlmIHRoZXJlIGlzIG9uZSkgb3IKKyAgICAgICAgYXQgdGhlIGluc2VydCBtYXJrIChvdGhlcndpc2UpLiAgSWYgdGhlIHNlYXJjaCBpcyBmb3J3YXJkLAorICAgICAgICBpdCBzdGFydHMgYXQgdGhlIHJpZ2h0IG9mIHRoZSBzZWxlY3Rpb247IGZvciBhIGJhY2t3YXJkCisgICAgICAgIHNlYXJjaCwgaXQgc3RhcnRzIGF0IHRoZSBsZWZ0IGVuZC4gIEFuIGVtcHR5IG1hdGNoIGV4YWN0bHkKKyAgICAgICAgYXQgZWl0aGVyIGVuZCBvZiB0aGUgc2VsZWN0aW9uIChvciBhdCB0aGUgaW5zZXJ0IG1hcmsgaWYKKyAgICAgICAgdGhlcmUgaXMgbm8gc2VsZWN0aW9uKSBpcyBpZ25vcmVkICB1bmxlc3MgdGhlIG9rIGZsYWcgaXMgdHJ1ZQorICAgICAgICAtLSB0aGlzIGlzIGRvbmUgdG8gZ3VhcmFudGVlIHByb2dyZXNzLgorCisgICAgICAgIElmIHRoZSBzZWFyY2ggaXMgYWxsb3dlZCB0byB3cmFwIGFyb3VuZCwgaXQgd2lsbCByZXR1cm4gdGhlCisgICAgICAgIG9yaWdpbmFsIHNlbGVjdGlvbiBpZiAoYW5kIG9ubHkgaWYpIGl0IGlzIHRoZSBvbmx5IG1hdGNoLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgcHJvZzoKKyAgICAgICAgICAgIHByb2cgPSBzZWxmLmdldHByb2coKQorICAgICAgICAgICAgaWYgbm90IHByb2c6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUgIyBDb21waWxhdGlvbiBmYWlsZWQgLS0gc3RvcAorICAgICAgICB3cmFwID0gc2VsZi53cmFwdmFyLmdldCgpCisgICAgICAgIGZpcnN0LCBsYXN0ID0gZ2V0X3NlbGVjdGlvbih0ZXh0KQorICAgICAgICBpZiBzZWxmLmlzYmFjaygpOgorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBsYXN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gZmlyc3QKKyAgICAgICAgICAgIGxpbmUsIGNvbCA9IGdldF9saW5lX2NvbChzdGFydCkKKyAgICAgICAgICAgIHJlcyA9IHNlbGYuc2VhcmNoX2JhY2t3YXJkKHRleHQsIHByb2csIGxpbmUsIGNvbCwgd3JhcCwgb2spCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBzdGFydCA9IGZpcnN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJ0ID0gbGFzdAorICAgICAgICAgICAgbGluZSwgY29sID0gZ2V0X2xpbmVfY29sKHN0YXJ0KQorICAgICAgICAgICAgcmVzID0gc2VsZi5zZWFyY2hfZm9yd2FyZCh0ZXh0LCBwcm9nLCBsaW5lLCBjb2wsIHdyYXAsIG9rKQorICAgICAgICByZXR1cm4gcmVzCisKKyAgICBkZWYgc2VhcmNoX2ZvcndhcmQoc2VsZiwgdGV4dCwgcHJvZywgbGluZSwgY29sLCB3cmFwLCBvaz0wKToKKyAgICAgICAgd3JhcHBlZCA9IDAKKyAgICAgICAgc3RhcnRsaW5lID0gbGluZQorICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmUsICIlZC4wIiAlIChsaW5lKzEpKQorICAgICAgICB3aGlsZSBjaGFyczoKKyAgICAgICAgICAgIG0gPSBwcm9nLnNlYXJjaChjaGFyc1s6LTFdLCBjb2wpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIGlmIG9rIG9yIG0uZW5kKCkgPiBjb2w6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLCBtCisgICAgICAgICAgICBsaW5lID0gbGluZSArIDEKKyAgICAgICAgICAgIGlmIHdyYXBwZWQgYW5kIGxpbmUgPiBzdGFydGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNvbCA9IDAKKyAgICAgICAgICAgIG9rID0gMQorICAgICAgICAgICAgY2hhcnMgPSB0ZXh0LmdldCgiJWQuMCIgJSBsaW5lLCAiJWQuMCIgJSAobGluZSsxKSkKKyAgICAgICAgICAgIGlmIG5vdCBjaGFycyBhbmQgd3JhcDoKKyAgICAgICAgICAgICAgICB3cmFwcGVkID0gMQorICAgICAgICAgICAgICAgIHdyYXAgPSAwCisgICAgICAgICAgICAgICAgbGluZSA9IDEKKyAgICAgICAgICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCIxLjAiLCAiMi4wIikKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBzZWFyY2hfYmFja3dhcmQoc2VsZiwgdGV4dCwgcHJvZywgbGluZSwgY29sLCB3cmFwLCBvaz0wKToKKyAgICAgICAgd3JhcHBlZCA9IDAKKyAgICAgICAgc3RhcnRsaW5lID0gbGluZQorICAgICAgICBjaGFycyA9IHRleHQuZ2V0KCIlZC4wIiAlIGxpbmUsICIlZC4wIiAlIChsaW5lKzEpKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbSA9IHNlYXJjaF9yZXZlcnNlKHByb2csIGNoYXJzWzotMV0sIGNvbCkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgaWYgb2sgb3IgbS5zdGFydCgpIDwgY29sOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGluZSwgbQorICAgICAgICAgICAgbGluZSA9IGxpbmUgLSAxCisgICAgICAgICAgICBpZiB3cmFwcGVkIGFuZCBsaW5lIDwgc3RhcnRsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBvayA9IDEKKyAgICAgICAgICAgIGlmIGxpbmUgPD0gMDoKKyAgICAgICAgICAgICAgICBpZiBub3Qgd3JhcDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB3cmFwcGVkID0gMQorICAgICAgICAgICAgICAgIHdyYXAgPSAwCisgICAgICAgICAgICAgICAgcG9zID0gdGV4dC5pbmRleCgiZW5kLTFjIikKKyAgICAgICAgICAgICAgICBsaW5lLCBjb2wgPSBtYXAoaW50LCBwb3Muc3BsaXQoIi4iKSkKKyAgICAgICAgICAgIGNoYXJzID0gdGV4dC5nZXQoIiVkLjAiICUgbGluZSwgIiVkLjAiICUgKGxpbmUrMSkpCisgICAgICAgICAgICBjb2wgPSBsZW4oY2hhcnMpIC0gMQorICAgICAgICByZXR1cm4gTm9uZQorCisjIEhlbHBlciB0byBzZWFyY2ggYmFja3dhcmRzIGluIGEgc3RyaW5nLgorIyAoT3B0aW1pemVkIGZvciB0aGUgY2FzZSB3aGVyZSB0aGUgcGF0dGVybiBpc24ndCBmb3VuZC4pCisKK2RlZiBzZWFyY2hfcmV2ZXJzZShwcm9nLCBjaGFycywgY29sKToKKyAgICBtID0gcHJvZy5zZWFyY2goY2hhcnMpCisgICAgaWYgbm90IG06CisgICAgICAgIHJldHVybiBOb25lCisgICAgZm91bmQgPSBOb25lCisgICAgaSwgaiA9IG0uc3BhbigpCisgICAgd2hpbGUgaSA8IGNvbCBhbmQgaiA8PSBjb2w6CisgICAgICAgIGZvdW5kID0gbQorICAgICAgICBpZiBpID09IGo6CisgICAgICAgICAgICBqID0gaisxCisgICAgICAgIG0gPSBwcm9nLnNlYXJjaChjaGFycywgaikKKyAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICBicmVhaworICAgICAgICBpLCBqID0gbS5zcGFuKCkKKyAgICByZXR1cm4gZm91bmQKKworIyBIZWxwZXIgdG8gZ2V0IHNlbGVjdGlvbiBlbmQgcG9pbnRzLCBkZWZhdWx0aW5nIHRvIGluc2VydCBtYXJrLgorIyBSZXR1cm4gYSB0dXBsZSBvZiBpbmRpY2VzICgibGluZS5jb2wiIHN0cmluZ3MpLgorCitkZWYgZ2V0X3NlbGVjdGlvbih0ZXh0KToKKyAgICB0cnk6CisgICAgICAgIGZpcnN0ID0gdGV4dC5pbmRleCgic2VsLmZpcnN0IikKKyAgICAgICAgbGFzdCA9IHRleHQuaW5kZXgoInNlbC5sYXN0IikKKyAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgIGZpcnN0ID0gbGFzdCA9IE5vbmUKKyAgICBpZiBub3QgZmlyc3Q6CisgICAgICAgIGZpcnN0ID0gdGV4dC5pbmRleCgiaW5zZXJ0IikKKyAgICBpZiBub3QgbGFzdDoKKyAgICAgICAgbGFzdCA9IGZpcnN0CisgICAgcmV0dXJuIGZpcnN0LCBsYXN0CisKKyMgSGVscGVyIHRvIHBhcnNlIGEgdGV4dCBpbmRleCBpbnRvIGEgKGxpbmUsIGNvbCkgdHVwbGUuCisKK2RlZiBnZXRfbGluZV9jb2woaW5kZXgpOgorICAgIGxpbmUsIGNvbCA9IG1hcChpbnQsIGluZGV4LnNwbGl0KCIuIikpICMgRmFpbHMgb24gaW52YWxpZCBpbmRleAorICAgIHJldHVybiBsaW5lLCBjb2wKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaEVuZ2luZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMGM4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1NlYXJjaEVuZ2luZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwMGM4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TZWFyY2hFbmdpbmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI3NzNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1N0YWNrVmlld2VyLnB5CkBAIC0wLDAgKzEsMTM3IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBsaW5lY2FjaGUKKworZnJvbSBpZGxlbGliLlRyZWVXaWRnZXQgaW1wb3J0IFRyZWVOb2RlLCBUcmVlSXRlbSwgU2Nyb2xsZWRDYW52YXMKK2Zyb20gaWRsZWxpYi5PYmplY3RCcm93c2VyIGltcG9ydCBPYmplY3RUcmVlSXRlbSwgbWFrZV9vYmplY3R0cmVlaXRlbQorCitkZWYgU3RhY2tCcm93c2VyKHJvb3QsIGZsaXN0PU5vbmUsIHRiPU5vbmUsIHRvcD1Ob25lKToKKyAgICBpZiB0b3AgaXMgTm9uZToKKyAgICAgICAgZnJvbSBUa2ludGVyIGltcG9ydCBUb3BsZXZlbAorICAgICAgICB0b3AgPSBUb3BsZXZlbChyb290KQorICAgIHNjID0gU2Nyb2xsZWRDYW52YXModG9wLCBiZz0id2hpdGUiLCBoaWdobGlnaHR0aGlja25lc3M9MCkKKyAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICBpdGVtID0gU3RhY2tUcmVlSXRlbShmbGlzdCwgdGIpCisgICAgbm9kZSA9IFRyZWVOb2RlKHNjLmNhbnZhcywgTm9uZSwgaXRlbSkKKyAgICBub2RlLmV4cGFuZCgpCisKK2NsYXNzIFN0YWNrVHJlZUl0ZW0oVHJlZUl0ZW0pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZsaXN0PU5vbmUsIHRiPU5vbmUpOgorICAgICAgICBzZWxmLmZsaXN0ID0gZmxpc3QKKyAgICAgICAgc2VsZi5zdGFjayA9IHNlbGYuZ2V0X3N0YWNrKHRiKQorICAgICAgICBzZWxmLnRleHQgPSBzZWxmLmdldF9leGNlcHRpb24oKQorCisgICAgZGVmIGdldF9zdGFjayhzZWxmLCB0Yik6CisgICAgICAgIGlmIHRiIGlzIE5vbmU6CisgICAgICAgICAgICB0YiA9IHN5cy5sYXN0X3RyYWNlYmFjaworICAgICAgICBzdGFjayA9IFtdCisgICAgICAgIGlmIHRiIGFuZCB0Yi50Yl9mcmFtZSBpcyBOb25lOgorICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgICAgIHdoaWxlIHRiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3RhY2suYXBwZW5kKCh0Yi50Yl9mcmFtZSwgdGIudGJfbGluZW5vKSkKKyAgICAgICAgICAgIHRiID0gdGIudGJfbmV4dAorICAgICAgICByZXR1cm4gc3RhY2sKKworICAgIGRlZiBnZXRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0eXBlID0gc3lzLmxhc3RfdHlwZQorICAgICAgICB2YWx1ZSA9IHN5cy5sYXN0X3ZhbHVlCisgICAgICAgIGlmIGhhc2F0dHIodHlwZSwgIl9fbmFtZV9fIik6CisgICAgICAgICAgICB0eXBlID0gdHlwZS5fX25hbWVfXworICAgICAgICBzID0gc3RyKHR5cGUpCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcyA9IHMgKyAiOiAiICsgc3RyKHZhbHVlKQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIEdldFRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRleHQKKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICBzdWJsaXN0ID0gW10KKyAgICAgICAgZm9yIGluZm8gaW4gc2VsZi5zdGFjazoKKyAgICAgICAgICAgIGl0ZW0gPSBGcmFtZVRyZWVJdGVtKGluZm8sIHNlbGYuZmxpc3QpCisgICAgICAgICAgICBzdWJsaXN0LmFwcGVuZChpdGVtKQorICAgICAgICByZXR1cm4gc3VibGlzdAorCitjbGFzcyBGcmFtZVRyZWVJdGVtKFRyZWVJdGVtKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmZvLCBmbGlzdCk6CisgICAgICAgIHNlbGYuaW5mbyA9IGluZm8KKyAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgZnJhbWUsIGxpbmVubyA9IHNlbGYuaW5mbworICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2RuYW1lID0gZnJhbWUuZl9nbG9iYWxzWyJfX25hbWVfXyJdCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIG1vZG5hbWUgPSAiPyIKKyAgICAgICAgY29kZSA9IGZyYW1lLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgZnVuY25hbWUgPSBjb2RlLmNvX25hbWUKKyAgICAgICAgc291cmNlbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNvdXJjZWxpbmUgPSBzb3VyY2VsaW5lLnN0cmlwKCkKKyAgICAgICAgaWYgZnVuY25hbWUgaW4gKCI/IiwgIiIsIE5vbmUpOgorICAgICAgICAgICAgaXRlbSA9ICIlcywgbGluZSAlZDogJXMiICUgKG1vZG5hbWUsIGxpbmVubywgc291cmNlbGluZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGl0ZW0gPSAiJXMuJXMoLi4uKSwgbGluZSAlZDogJXMiICUgKG1vZG5hbWUsIGZ1bmNuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBzb3VyY2VsaW5lKQorICAgICAgICByZXR1cm4gaXRlbQorCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIGZyYW1lLCBsaW5lbm8gPSBzZWxmLmluZm8KKyAgICAgICAgc3VibGlzdCA9IFtdCisgICAgICAgIGlmIGZyYW1lLmZfZ2xvYmFscyBpcyBub3QgZnJhbWUuZl9sb2NhbHM6CisgICAgICAgICAgICBpdGVtID0gVmFyaWFibGVzVHJlZUl0ZW0oIjxsb2NhbHM+IiwgZnJhbWUuZl9sb2NhbHMsIHNlbGYuZmxpc3QpCisgICAgICAgICAgICBzdWJsaXN0LmFwcGVuZChpdGVtKQorICAgICAgICBpdGVtID0gVmFyaWFibGVzVHJlZUl0ZW0oIjxnbG9iYWxzPiIsIGZyYW1lLmZfZ2xvYmFscywgc2VsZi5mbGlzdCkKKyAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworICAgIGRlZiBPbkRvdWJsZUNsaWNrKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZsaXN0OgorICAgICAgICAgICAgZnJhbWUsIGxpbmVubyA9IHNlbGYuaW5mbworICAgICAgICAgICAgZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLmZsaXN0LmdvdG9maWxlbGluZShmaWxlbmFtZSwgbGluZW5vKQorCitjbGFzcyBWYXJpYWJsZXNUcmVlSXRlbShPYmplY3RUcmVlSXRlbSk6CisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubGFiZWx0ZXh0CisKKyAgICBkZWYgR2V0TGFiZWxUZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLm9iamVjdCkgPiAwCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYub2JqZWN0LmtleXMoKQorCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIHN1Ymxpc3QgPSBbXQorICAgICAgICBmb3Iga2V5IGluIHNlbGYua2V5cygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5vYmplY3Rba2V5XQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBkZWYgc2V0ZnVuY3Rpb24odmFsdWUsIGtleT1rZXksIG9iamVjdD1zZWxmLm9iamVjdCk6CisgICAgICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgaXRlbSA9IG1ha2Vfb2JqZWN0dHJlZWl0ZW0oa2V5ICsgIiA9IiwgdmFsdWUsIHNldGZ1bmN0aW9uKQorICAgICAgICAgICAgc3VibGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIHN1Ymxpc3QKKworCitkZWYgX3Rlc3QoKToKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB0ZXN0Y29kZQorICAgICAgICByZWxvYWQodGVzdGNvZGUpCisgICAgZXhjZXB0OgorICAgICAgICBzeXMubGFzdF90eXBlLCBzeXMubGFzdF92YWx1ZSwgc3lzLmxhc3RfdHJhY2ViYWNrID0gc3lzLmV4Y19pbmZvKCkKKyAgICBmcm9tIFRraW50ZXIgaW1wb3J0IFRrCisgICAgcm9vdCA9IFRrKCkKKyAgICBTdGFja0Jyb3dzZXIoTm9uZSwgdG9wPXJvb3QpCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1N0YWNrVmlld2VyLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMjU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1N0YWNrVmlld2VyLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYyMjU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9TdGFja1ZpZXdlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RPRE8udHh0IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RPRE8udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZjFhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVE9ETy50eHQKQEAgLTAsMCArMSwyMTAgQEAKK09yaWdpbmFsIElETEUgdG9kbywgbXVjaCBvZiBpdCBub3cgb3V0ZGF0ZWQ6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorVE8gRE86CisKKy0gaW1wcm92ZSBkZWJ1Z2dlcjoKKyAgICAtIG1hbmFnZSBicmVha3BvaW50cyBnbG9iYWxseSwgYWxsb3cgYnAgZGVsZXRpb24sIHRicmVhaywgY2JyZWFrIGV0Yy4KKyAgICAtIHJlYWwgb2JqZWN0IGJyb3dzZXIKKyAgICAtIGhlbHAgb24gaG93IHRvIHVzZSBpdCAoYSBzaW1wbGUgaGVscCBidXR0b24gd2lsbCBkbyB3b25kZXJzKQorICAgIC0gcGVyZm9ybWFuY2U/ICAodXBkYXRlcyBvZiBsYXJnZSBzZXRzIG9mIGxvY2FscyBhcmUgc2xvdykKKyAgICAtIGJldHRlciBpbnRlZ3JhdGlvbiBvZiAiZGVidWcgbW9kdWxlIgorICAgIC0gZGVidWdnZXIgc2hvdWxkIGJlIGdsb2JhbCByZXNvdXJjZSAoYXR0YWNoZWQgdG8gZmxpc3QsIG5vdCB0byBzaGVsbCkKKyAgICAtIGZpeCB0aGUgc3R1cGlkIGJ1ZyB3aGVyZSB5b3UgbmVlZCB0byBzdGVwIHR3aWNlCisgICAgLSBkaXNwbGF5IGNsYXNzIG5hbWUgaW4gc3RhY2sgdmlld2VyIGVudHJpZXMgZm9yIG1ldGhvZHMKKyAgICAtIHN1cHByZXNzIHRyYWNpbmcgdGhyb3VnaCBJRExFIGludGVybmFscyAoZS5nLiBwcmludCkgRE9ORQorICAgIC0gYWRkIGEgYnV0dG9uIHRvIHN1cHByZXNzIHRocm91Z2ggYSBzcGVjaWZpYyBtb2R1bGUgb3IgY2xhc3Mgb3IgbWV0aG9kCisgICAgLSBtb3JlIG9iamVjdCBpbnNwZWN0aW9uIHRvIHN0YWNrIHZpZXdlciwgZS5nLiB0byB2aWV3IGFsbCBhcnJheSBpdGVtcworLSBpbnNlcnQgdGhlIGluaXRpYWwgY3VycmVudCBkaXJlY3RvcnkgaW50byBzeXMucGF0aCBET05FCistIGRlZmF1bHQgZGlyZWN0b3J5IGF0dHJpYnV0ZSBmb3IgZWFjaCB3aW5kb3cgaW5zdGVhZCBvZiBvbmx5IGZvciB3aW5kb3dzCisgIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIGZpbGVuYW1lCistIGNvbW1hbmQgZXhwYW5zaW9uIGZyb20ga2V5d29yZHMsIG1vZHVsZSBjb250ZW50cywgb3RoZXIgYnVmZmVycywgZXRjLgorLSAiUmVjZW50IGRvY3VtZW50cyIgbWVudSBpdGVtIERPTkUKKy0gRmlsdGVyIHJlZ2lvbiBjb21tYW5kCistIE9wdGlvbmFsIGhvcml6b250YWwgc2Nyb2xsIGJhcgorLSBtb3JlIEVtYWNzaXNtczoKKyAgICAtIF5LIHNob3VsZCBjdXQgdG8gYnVmZmVyCisgICAgLSBNLVssIE0tXSB0byBtb3ZlIGJ5IHBhcmFncmFwaHMKKyAgICAtIGluY3JlbWVudGFsIHNlYXJjaD8KKy0gc2VhcmNoIHNob3VsZCBpbmRpY2F0ZSB3cmFwLWFyb3VuZCBpbiBzb21lIHdheQorLSByZXN0cnVjdHVyZSBzdGF0ZSBzZW5zaXRpdmUgY29kZSB0byBhdm9pZCB0ZXN0aW5nIGZsYWdzIGFsbCB0aGUgdGltZQorLSBwZXJzaXN0ZW50IHVzZXIgc3RhdGUgKGUuZy4gd2luZG93IGFuZCBjdXJzb3IgcG9zaXRpb25zLCBiaW5kaW5ncykKKy0gbWFrZSBiYWNrdXBzIHdoZW4gc2F2aW5nCistIGNoZWNrIGZpbGUgbXRpbWVzIGF0IHZhcmlvdXMgcG9pbnRzCistIFBsdWdnYWJsZSBpbnRlcmZhY2Ugd2l0aCBSQ1MvQ1ZTL1BlcmZvcmNlL0NsZWFyY2FzZQorLSBiZXR0ZXIgaGVscD8KKy0gZG9uJ3Qgb3BlbiBzZWNvbmQgY2xhc3MgYnJvd3NlciBvbiBzYW1lIG1vZHVsZSAobm9yIHNlY29uZCBwYXRoIGJyb3dzZXIpCistIHVuaWZ5IGNsYXNzIGFuZCBwYXRoIGJyb3dzZXJzCistIE5lZWQgdG8gZGVmaW5lIGEgc3RhbmRhcmQgd2F5IHdoZXJlYnkgb25lIGNhbiBkZXRlcm1pbmUgb25lIGlzIHJ1bm5pbmcKKyAgaW5zaWRlIElETEUgKG5lZWRlZCBmb3IgVGsgbWFpbmxvb3AsIGFsc28gaGFuZHkgZm9yICRQWVRIT05TVEFSVFVQKQorLSBBZGQgbW9yZSB1dGlsaXR5IG1ldGhvZHMgZm9yIHVzZSBieSBleHRlbnNpb25zIChhIGxhIGdldF9zZWxlY3Rpb24pCistIFdheSB0byBydW4gY29tbWFuZCBpbiB0b3RhbGx5IHNlcGFyYXRlIGludGVycHJldGVyIChmb3JrK29zLnN5c3RlbT8pIERPTkUKKy0gV2F5IHRvIGZpbmQgZGVmaW5pdGlvbiBvZiBmdWxseS1xdWFsaWZpZWQgbmFtZToKKyAgSW4gb3RoZXIgd29yZHMsIHNlbGVjdCAiVXNlckRpY3QuVXNlckRpY3QiLCBoaXQgc29tZSBtYWdpYyBrZXkgYW5kCisgIGl0IGxvYWRzIHVwIFVzZXJEaWN0LnB5IGFuZCBmaW5kcyB0aGUgZmlyc3QgZGVmIG9yIGNsYXNzIGZvciBVc2VyRGljdC4KKy0gbmVlZCBhIHdheSB0byBmb3JjZSBjb2xvcml6YXRpb24gb24vb2ZmCistIG5lZWQgYSB3YXkgdG8gZm9yY2UgYXV0by1pbmRlbnQgb24vb2ZmCisKK0RldGFpbHM6CisKKy0gXk8gKG9uIFVuaXggLS0gb3Blbi1saW5lKSBzaG91bGQgaG9ub3IgYXV0b2luZGVudAorLSBhZnRlciBwYXN0ZSwgc2hvdyBlbmQgb2YgcGFzdGVkIHRleHQKKy0gb24gV2luZG93cywgc2hvdWxkIHR1cm4gc2hvcnQgZmlsZW5hbWUgdG8gbG9uZyBmaWxlbmFtZSAobm90IG9ubHkgaW4gYXJndiEpCisgIChzaG91bGRuJ3QgdGhpcyBiZSBkb25lIC0tIG9yIHVuZG9uZSAtLSBieSBudHBhdGgubm9ybXBhdGg/KQorLSBuZXcgYXV0b2luZGVudCBhZnRlciBjb2xvbiBldmVuIGluZGVudHMgd2hlbiB0aGUgY29sb24gaXMgaW4gYSBjb21tZW50IQorLSBzb21ldGltZXMgZm9yd2FyZCBzbGFzaGVzIGluIHBhdGhuYW1lIHJlbWFpbgorLSBzb21ldGltZXMgc3RhciBpbiB3aW5kb3cgbmFtZSByZW1haW5zIGluIFdpbmRvd3MgbWVudQorLSBXaXRoIHVuaXggYmluZGluZ3MsIEVTQyBieSBpdHNlbGYgaXMgaWdub3JlZAorLSBTb21ldGltZXMgZm9yIG5vIGFwcGFyZW50IHJlYXNvbiBhIHNlbGVjdGlvbiBmcm9tIHRoZSBjdXJzb3IgdG8gdGhlCisgIGVuZCBvZiB0aGUgY29tbWFuZCBidWZmZXIgYXBwZWFycywgd2hpY2ggaXMgaGFyZCB0byBnZXQgcmlkIG9mCisgIGJlY2F1c2UgaXQgc3RheXMgd2hlbiB5b3UgYXJlIHR5cGluZyEKKy0gVGhlIExpbmUvQ29sIGluIHRoZSBzdGF0dXMgYmFyIGNhbiBiZSB3cm9uZyBpbml0aWFsbHkgaW4gUHlTaGVsbCBET05FCisKK1N0cnVjdHVyYWwgcHJvYmxlbXM6CisKKy0gdG9vIG11Y2gga25vd2xlZGdlIGluIEZpbGVMaXN0IGFib3V0IEVkaXRvcldpbmRvdyAoZm9yIGV4YW1wbGUpCistIHNob3VsZCBhZGQgc29tZSBwcmltaXRpdmVzIGZvciBhY2Nlc3NpbmcgdGhlIHNlbGVjdGlvbiBldGMuCisgIHRvIHJlcGVhdCBjdW1iZXJzb21lIGNvZGUgb3ZlciBhbmQgb3ZlcgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0plZmYgQmF1ZXIgc3VnZ2VzdHM6CisKKy0gT3BlbiBNb2R1bGUgZG9lc24ndCBhcHBlYXIgdG8gaGFuZGxlIGhpZXJhcmNoaWNhbCBwYWNrYWdlcy4KKy0gQ2xhc3MgYnJvd3NlciBzaG91bGQgYWxzbyBhbGxvdyBoaWVyYXJjaGljYWwgcGFja2FnZXMuCistIE9wZW4gYW5kIE9wZW4gTW9kdWxlIGNvdWxkIGJlbmVmaXQgZnJvbSBhIGhpc3RvcnksIERPTkUKKyAgZWl0aGVyIGNvbW1hbmQgbGluZSBzdHlsZSwgb3IgTWljcm9zb2Z0IHJlY2VudC1maWxlCisgIHN0eWxlLgorLSBBZGQgYSBTbWFsbHRhbGstc3R5bGUgaW5zcGVjdG9yICAoaS5lLiBUa2luc3BlY3QpCisKK1RoZSBsYXN0IHN1Z2dlc3Rpb24gaXMgYWxyZWFkeSBhIHJlYWxpdHksIGJ1dCBub3QgeWV0CitpbnRlZ3JhdGVkIGludG8gSURMRS4gIEkgdXNlIGEgbW9kdWxlIGNhbGxlZCBpbnNwZWN0b3IucHksCit0aGF0IHVzZWQgdG8gYmUgYXZhaWxhYmxlIGZyb20gcHl0aG9uLm9yZyg/KSAgSXQgbm8gbG9uZ2VyCithcHBlYXJzIHRvIGJlIGluIHRoZSBjb250cmlidXRlZCBzZWN0aW9uLCBhbmQgdGhlIHNvdXJjZQoraGFzIG5vIGF1dGhvciBhdHRyaWJ1dGlvbi4KKworSW4gYW55IGNhc2UsIHRoZSBjb2RlIGlzIHVzZWZ1bCBmb3IgdmlzdWFsbHkgbmF2aWdhdGluZworYW4gb2JqZWN0J3MgYXR0cmlidXRlcywgaW5jbHVkaW5nIGl0cyBjb250YWluZXIgaGllcmFyY2h5LgorCisgICAgPj4+IGZyb20gaW5zcGVjdG9yIGltcG9ydCBUa2luc3BlY3QKKyAgICA+Pj4gVGtpbnNwZWN0KE5vbmUsIG15T2JqZWN0KQorCitUa2luc3BlY3QgY291bGQgcHJvYmFibHkgYmUgZXh0ZW5kZWQgYW5kIHJlZmluZWQgdG8KK2ludGVncmF0ZSBiZXR0ZXIgaW50byBJRExFLgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0NvbXBhcmlzb24gdG8gUFRVSQorLS0tLS0tLS0tLS0tLS0tLS0tCisKKysgUFRVSSdzIGhlbHAgaXMgYmV0dGVyIChIVE1MISkKKworKyBQVFVJIGNhbiBhdHRhY2ggYSBzaGVsbCB0byBhbnkgbW9kdWxlCisKKysgUFRVSSBoYXMgc29tZSBtb3JlIEkvTyBjb21tYW5kczoKKyAgb3BlbiBtdWx0aXBsZQorICBhcHBlbmQKKyAgZXhhbWluZSAod2hhdCdzIHRoYXQ/KQorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK05vdGVzIGFmdGVyIHRyeWluZyB0byBydW4gR3JhaWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLSBHcmFpbCBkb2VzIHN0dWZmIHRvIHN5cy5wYXRoIGJhc2VkIG9uIHN5cy5hcmd2WzBdOyB5b3UgbXVzdCBzZXQKK3N5cy5hcmd2WzBdIHRvIHNvbWV0aGluZyBkZWNlbnQgZmlyc3QgKGl0IGlzIG5vcm1hbGx5IHNldCB0byB0aGUgcGF0aCBvZgordGhlIGlkbGUgc2NyaXB0KS4KKworLSBHcmFpbCBtdXN0IGJlIGV4ZWMnZWQgaW4gX19tYWluX18gYmVjYXVzZSB0aGF0J3MgaW1wb3J0ZWQgYnkgc29tZQorb3RoZXIgcGFydHMgb2YgR3JhaWwuCisKKy0gR3JhaWwgdXNlcyBhIG1vZHVsZSBjYWxsZWQgSGlzdG9yeSBhbmQgc28gZG9lcyBpZGxlIDotKAorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JvYmluIEZyaWVkcmljaCdzIGl0ZW1zOgorCitUaGluZ3MgSSdkIGxpa2UgdG8gc2VlOgorICAgIC0gSSdkIGxpa2Ugc3VwcG9ydCBmb3Igc2hpZnQtY2xpY2sgZXh0ZW5kaW5nIHRoZSBzZWxlY3Rpb24uIFRoZXJlJ3MgYQorICAgICAgYnVnIG5vdyB0aGF0IGl0IGRvZXNuJ3Qgd29yayB0aGUgZmlyc3QgdGltZSB5b3UgdHJ5IGl0LgorICAgIC0gUHJpbnRpbmcgaXMgbmVlZGVkLiBIb3cgaGFyZCBjYW4gdGhhdCBiZSBvbiBXaW5kb3dzPyBGSVJTVCBDVVQgRE9ORQorICAgIC0gVGhlIHB5dGhvbi1tb2RlIHRyaWNrIG9mIGF1dG9pbmRlbnRpbmcgYSBsaW5lIHdpdGggPHRhYj4gaXMgbmVhdCBhbmQKKyAgICAgIHZlcnkgaGFuZHkuCisgICAgLSAoc29tZWRheSkgYSBzcGVsbGNoZWNrZXIgZm9yIGRvY3N0cmluZ3MgYW5kIGNvbW1lbnRzLgorICAgIC0gYSBwYWdlZG93bi91cCBjb21tYW5kIGtleSB3aGljaCBtb3ZlcyB0byBuZXh0IGNsYXNzL2RlZiBzdGF0ZW1lbnQgKHRvcAorICAgICAgbGV2ZWwpCisgICAgLSBzcGxpdCB3aW5kb3cgY2FwYWJpbGl0eQorICAgIC0gRG5EIHRleHQgcmVsb2NhdGlvbi9jb3B5aW5nCisKK1RoaW5ncyBJIGRvbid0IHdhbnQgdG8gc2VlLgorICAgIC0gbGluZSBudW1iZXJzLi4uICB3aWxsIHByb2JhYmx5IHNsb3cgdGhpbmdzIGRvd24gd2F5IHRvbyBtdWNoLgorICAgIC0gUGxlYXNlIHVzZSBhbm90aGVyIGljb24gZm9yIHRoZSB0cmVlIGJyb3dzZXIgbGVhZi4gVGhlIHNtYWxsIHNuYWtlCisgICAgICBpc24ndCBjdXR0aW5nIGl0LgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0gQ3VzdG9taXphYmxlIHZpZXdzIChtdWx0aS13aW5kb3cgb3IgbXVsdGktcGFuZSkuICAoTWFya3VzIEdyaXRzY2gpCisKKy0gQmVpbmcgYWJsZSB0byBkb3VibGUgY2xpY2sgKG1heWJlIGRvdWJsZSByaWdodCBjbGljaykgb24gYSBjYWxsYWJsZQorb2JqZWN0IGluIHRoZSBlZGl0b3Igd2hpY2ggc2hvd3MgdGhlIHNvdXJjZSBvZiB0aGUgb2JqZWN0LCBpZgorcG9zc2libGUuICAoR2Vycml0IEhvbGwpCisKKy0gSG9va3MgaW50byB0aGUgZ3V0cywgbGlrZSBpbiBFbWFjcy4gIChNaWtlIFJvbWJlcmcpCisKKy0gU2hhcmluZyB0aGUgZWRpdG9yIHdpdGggYSByZW1vdGUgdHV0b3IuICAoTWFydGlqbiBGYWFzc2VuKQorCistIE11bHRpcGxlIHZpZXdzIG9uIHRoZSBzYW1lIGZpbGUuICAoVG9ueSBKIEliYnMpCisKKy0gU3RvcmUgYnJlYWtwb2ludHMgaW4gYSBnbG9iYWwgKHBlci1wcm9qZWN0KSBkYXRhYmFzZSAoR3ZSKTsgRGlyaworSGVpc2UgYWRkczogc2F2ZSBzb21lIHNwYWNlLXRyaW1tZWQgY29udGV4dCBhbmQgc2VhcmNoIGFyb3VuZCB3aGVuCityZW9wZW5pbmcgYSBmaWxlIHRoYXQgbWlnaHQgaGF2ZSBiZWVuIGVkaXRlZCBieSBzb21lb25lIGVsc2UuCisKKy0gQ2FwdHVyZSBtZW51IGV2ZW50cyBpbiBleHRlbnNpb25zIHdpdGhvdXQgY2hhbmdpbmcgdGhlIElETEUgc291cmNlLgorKE1hdHRoaWFzIEJhcm1laWVyKQorCistIFVzZSBvdmVybGFwcGluZyBwYW5lbHMgKGEgIm5vdGVib29rIiBpbiBNRkMgdGVybXMgSSB0aGluaykgZm9yIGluZm8KK3RoYXQgZG9lc24ndCBuZWVkIHRvIGJlIGFjY2Vzc2libGUgc2ltdWx0YW5lb3VzbHkgKGUuZy4gSFRNTCBzb3VyY2UKK2FuZCBvdXRwdXQpLiAgVXNlIG11bHRpLXBhbmUgd2luZG93cyBmb3IgaW5mbyB0aGF0IGRvZXMgbmVlZCB0byBiZQorc2hvd24gdG9nZXRoZXIgKGUuZy4gY2xhc3MgYnJvd3NlciBhbmQgc291cmNlKS4gIChBbGJlcnQgQnJhbmRsKQorCistIEEgcHJvamVjdCBzaG91bGQgaW52aXNpYmx5IHRyYWNrIGFsbCBzeW1ib2xzLCBmb3IgaW5zdGFudCBzZWFyY2gsCityZXBsYWNlIGFuZCBjcm9zcy1yZWYuICBQcm9qZWN0cyBzaG91bGQgYmUgYWxsb3dlZCB0byBzcGFuIG11bHRpcGxlCitkaXJlY3RvcmllcywgaG9zdHMsIGV0Yy4gIFByb2plY3QgbWFuYWdlbWVudCBmaWxlcyBhcmUgcGxhY2VkIGluIGEKK2RpcmVjdG9yeSB5b3Ugc3BlY2lmeS4gIEEgZ2xvYmFsIG1hcHBpbmcgYmV0d2VlbiBwcm9qZWN0IG5hbWVzIGFuZAorcHJvamVjdCBkaXJlY3RvcmllcyBzaG91bGQgZXhpc3QgW25vdCBzbyBzdXJlIC0tR3ZSXS4gIChUaW0gUGV0ZXJzKQorCistIE1lcmdlIGF0dHItdGlwcyBhbmQgYXV0by1leHBhbmQuICAoTWFyayBIYW1tb25kLCBUaW0gUGV0ZXJzKQorCistIFB5dGhvbiBTaGVsbCBzaG91bGQgYmVoYXZlIG1vcmUgbGlrZSBhICJzaGVsbCB3aW5kb3ciIGFzIHVzZXJzIGtub3cKK2l0IC0tIGkuZS4geW91IGNhbiBvbmx5IGVkaXQgdGhlIGN1cnJlbnQgY29tbWFuZCwgYW5kIHRoZSBjdXJzb3IgY2FuJ3QKK2VzY2FwZSBmcm9tIHRoZSBjb21tYW5kIGFyZWEuICAoQWxiZXJ0IEJyYW5kbCkKKworLSBTZXQgWDExIGNsYXNzIHRvICJpZGxlL0lkbGUiLCBzZXQgaWNvbiBhbmQgdGl0bGUgdG8gc29tZXRoaW5nCitiZWdpbm5pbmcgd2l0aCAiaWRsZSIgLS0gZm9yIHdpbmRvdyBtYW5hbmdlcnMuICAoUmFuZGFsbCBIb3BwZXIpCisKKy0gQ29uZmlnIGZpbGVzIGVkaXRhYmxlIHRocm91Z2ggYSBwcmVmZXJlbmNlcyBkaWFsb2cuICAobWUpIERPTkUKKworLSBDb25maWcgZmlsZXMgc3RpbGwgZWRpdGFibGUgb3V0c2lkZSB0aGUgcHJlZmVyZW5jZXMgZGlhbG9nLgorKFJhbmRhbGwgSG9wcGVyKSBET05FCisKKy0gV2hlbiB5b3UncmUgZWRpdGluZyBhIGNvbW1hbmQgaW4gUHlTaGVsbCwgYW5kIHRoZXJlIGFyZSBvbmx5IGJsYW5rCitsaW5lcyBiZWxvdyB0aGUgY3Vyc29yLCBoaXR0aW5nIFJldHVybiBzaG91bGQgaWdub3JlIG9yIGRlbGV0ZSB0aG9zZQorYmxhbmsgbGluZXMgcmF0aGVyIHRoYW4gZGVjaWRpbmcgeW91J3JlIG5vdCBvbiB0aGUgbGFzdCBsaW5lLiAgKG1lKQorCistIFJ1biBjb21tYW5kIChGNSBjLnMuKSBzaG91bGQgYmUgbW9yZSBsaWtlIFB5dGhvbndpbidzIFJ1biAtLSBhCitkaWFsb2cgd2l0aCBvcHRpb25zIHRvIGdpdmUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cywgcnVuIHRoZSBkZWJ1Z2dlciwKK2V0Yy4gIChtZSkKKworLSBTaG91bGRuJ3QgYmUgYWJsZSB0byBkZWxldGUgcGFydCBvZiB0aGUgcHJvbXB0IChvciBhbnkgdGV4dCBiZWZvcmUKK2l0KSBpbiB0aGUgUHlTaGVsbC4gIChNYXJ0aWpuIEZhYXNzZW4pICAgRE9ORQorCistIEVtYWNzIHN0eWxlIGF1dG8tZmlsbCAoYWxzbyBzbWFydCBhYm91dCBjb21tZW50cyBhbmQgc3RyaW5ncykuCisoSmVyZW15IEh5bHRvbikKKworLSBPdXRwdXQgb2YgUnVuIFNjcmlwdCBzaG91bGQgZ28gdG8gYSBzZXBhcmF0ZSBvdXRwdXQgd2luZG93LCBub3QgdG8KK3RoZSBzaGVsbCB3aW5kb3cuICBPdXRwdXQgb2Ygc2VwYXJhdGUgcnVucyBzaG91bGQgYWxsIGdvIHRvIHRoZSBzYW1lCit3aW5kb3cgYnV0IGNsZWFybHkgZGVsaW1pdGVkLiAgKERhdmlkIFNjaGVyZXIpIFJFSkVDVCBGSVJTVCwgTEFUVEVSIERPTkUKKworLSBHVUkgZm9ybSBkZXNpZ25lciB0byBraWNrIFZCJ3MgYnV0dC4gIChSb2JlcnQgR2VpZ2VyKSBUSEFUJ1MgTk9UIElETEUKKworLSBQcmludGluZyEgIFBvc3NpYmx5IHZpYSBnZW5lcmF0aW9uIG9mIFBERiBmaWxlcyB3aGljaCB0aGUgdXNlciBtdXN0Cit0aGVuIHNlbmQgdG8gdGhlIHByaW50ZXIgc2VwYXJhdGVseS4gIChEaW51IEdoZXJtYW4pICBGSVJTVCBDVVQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9Ub29sVGlwLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Rvb2xUaXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3YTNkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9Ub29sVGlwLnB5CkBAIC0wLDAgKzEsODkgQEAKKyMgZ2VuZXJhbCBwdXJwb3NlICd0b29sdGlwJyByb3V0aW5lcyAtIGN1cnJlbnRseSB1bnVzZWQgaW4gaWRsZWZvcmsKKyMgKGFsdGhvdWdoIHRoZSAnY2FsbHRpcHMnIGV4dGVuc2lvbiBpcyBwYXJ0bHkgYmFzZWQgb24gdGhpcyBjb2RlKQorIyBtYXkgYmUgdXNlZnVsIGZvciBzb21lIHB1cnBvc2VzIGluIChvciBhbG1vc3QgaW4gOykgdGhlIGN1cnJlbnQgcHJvamVjdCBzY29wZQorIyBJZGVhcyBnbGVhbmVkIGZyb20gUHlTb2wKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2NsYXNzIFRvb2xUaXBCYXNlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1dHRvbik6CisgICAgICAgIHNlbGYuYnV0dG9uID0gYnV0dG9uCisgICAgICAgIHNlbGYudGlwd2luZG93ID0gTm9uZQorICAgICAgICBzZWxmLmlkID0gTm9uZQorICAgICAgICBzZWxmLnggPSBzZWxmLnkgPSAwCisgICAgICAgIHNlbGYuX2lkMSA9IHNlbGYuYnV0dG9uLmJpbmQoIjxFbnRlcj4iLCBzZWxmLmVudGVyKQorICAgICAgICBzZWxmLl9pZDIgPSBzZWxmLmJ1dHRvbi5iaW5kKCI8TGVhdmU+Iiwgc2VsZi5sZWF2ZSkKKyAgICAgICAgc2VsZi5faWQzID0gc2VsZi5idXR0b24uYmluZCgiPEJ1dHRvblByZXNzPiIsIHNlbGYubGVhdmUpCisKKyAgICBkZWYgZW50ZXIoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYuc2NoZWR1bGUoKQorCisgICAgZGVmIGxlYXZlKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnVuc2NoZWR1bGUoKQorICAgICAgICBzZWxmLmhpZGV0aXAoKQorCisgICAgZGVmIHNjaGVkdWxlKHNlbGYpOgorICAgICAgICBzZWxmLnVuc2NoZWR1bGUoKQorICAgICAgICBzZWxmLmlkID0gc2VsZi5idXR0b24uYWZ0ZXIoMTUwMCwgc2VsZi5zaG93dGlwKQorCisgICAgZGVmIHVuc2NoZWR1bGUoc2VsZik6CisgICAgICAgIGlkID0gc2VsZi5pZAorICAgICAgICBzZWxmLmlkID0gTm9uZQorICAgICAgICBpZiBpZDoKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uLmFmdGVyX2NhbmNlbChpZCkKKworICAgIGRlZiBzaG93dGlwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRpcHdpbmRvdzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFRoZSB0aXAgd2luZG93IG11c3QgYmUgY29tcGxldGVseSBvdXRzaWRlIHRoZSBidXR0b247CisgICAgICAgICMgb3RoZXJ3aXNlIHdoZW4gdGhlIG1vdXNlIGVudGVycyB0aGUgdGlwIHdpbmRvdyB3ZSBnZXQKKyAgICAgICAgIyBhIGxlYXZlIGV2ZW50IGFuZCBpdCBkaXNhcHBlYXJzLCBhbmQgdGhlbiB3ZSBnZXQgYW4gZW50ZXIKKyAgICAgICAgIyBldmVudCBhbmQgaXQgcmVhcHBlYXJzLCBhbmQgc28gb24gZm9yZXZlciA6LSgKKyAgICAgICAgeCA9IHNlbGYuYnV0dG9uLndpbmZvX3Jvb3R4KCkgKyAyMAorICAgICAgICB5ID0gc2VsZi5idXR0b24ud2luZm9fcm9vdHkoKSArIHNlbGYuYnV0dG9uLndpbmZvX2hlaWdodCgpICsgMQorICAgICAgICBzZWxmLnRpcHdpbmRvdyA9IHR3ID0gVG9wbGV2ZWwoc2VsZi5idXR0b24pCisgICAgICAgIHR3LndtX292ZXJyaWRlcmVkaXJlY3QoMSkKKyAgICAgICAgdHcud21fZ2VvbWV0cnkoIislZCslZCIgJSAoeCwgeSkpCisgICAgICAgIHNlbGYuc2hvd2NvbnRlbnRzKCkKKworICAgIGRlZiBzaG93Y29udGVudHMoc2VsZiwgdGV4dD0iWW91ciB0ZXh0IGhlcmUiKToKKyAgICAgICAgIyBPdmVycmlkZSB0aGlzIGluIGRlcml2ZWQgY2xhc3MKKyAgICAgICAgbGFiZWwgPSBMYWJlbChzZWxmLnRpcHdpbmRvdywgdGV4dD10ZXh0LCBqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD0iI2ZmZmZlMCIsIHJlbGllZj1TT0xJRCwgYm9yZGVyd2lkdGg9MSkKKyAgICAgICAgbGFiZWwucGFjaygpCisKKyAgICBkZWYgaGlkZXRpcChzZWxmKToKKyAgICAgICAgdHcgPSBzZWxmLnRpcHdpbmRvdworICAgICAgICBzZWxmLnRpcHdpbmRvdyA9IE5vbmUKKyAgICAgICAgaWYgdHc6CisgICAgICAgICAgICB0dy5kZXN0cm95KCkKKworY2xhc3MgVG9vbFRpcChUb29sVGlwQmFzZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1dHRvbiwgdGV4dCk6CisgICAgICAgIFRvb2xUaXBCYXNlLl9faW5pdF9fKHNlbGYsIGJ1dHRvbikKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgIGRlZiBzaG93Y29udGVudHMoc2VsZik6CisgICAgICAgIFRvb2xUaXBCYXNlLnNob3djb250ZW50cyhzZWxmLCBzZWxmLnRleHQpCisKK2NsYXNzIExpc3Rib3hUb29sVGlwKFRvb2xUaXBCYXNlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnV0dG9uLCBpdGVtcyk6CisgICAgICAgIFRvb2xUaXBCYXNlLl9faW5pdF9fKHNlbGYsIGJ1dHRvbikKKyAgICAgICAgc2VsZi5pdGVtcyA9IGl0ZW1zCisgICAgZGVmIHNob3djb250ZW50cyhzZWxmKToKKyAgICAgICAgbGlzdGJveCA9IExpc3Rib3goc2VsZi50aXB3aW5kb3csIGJhY2tncm91bmQ9IiNmZmZmZTAiKQorICAgICAgICBsaXN0Ym94LnBhY2soKQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zOgorICAgICAgICAgICAgbGlzdGJveC5pbnNlcnQoRU5ELCBpdGVtKQorCitkZWYgbWFpbigpOgorICAgICMgVGVzdCBjb2RlCisgICAgcm9vdCA9IFRrKCkKKyAgICBiID0gQnV0dG9uKHJvb3QsIHRleHQ9IkhlbGxvIiwgY29tbWFuZD1yb290LmRlc3Ryb3kpCisgICAgYi5wYWNrKCkKKyAgICByb290LnVwZGF0ZSgpCisgICAgdGlwID0gTGlzdGJveFRvb2xUaXAoYiwgWyJIZWxsbyIsICJ3b3JsZCJdKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Rvb2xUaXAucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Rvb2xUaXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjA5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVG9vbFRpcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Rvb2xUaXAucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1Rvb2xUaXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjA5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVG9vbFRpcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RyZWVXaWRnZXQucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVHJlZVdpZGdldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmVjYTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RyZWVXaWRnZXQucHkKQEAgLTAsMCArMSw0NzcgQEAKKyMgWFhYIFRPIERPOgorIyAtIHBvcHVwIG1lbnUKKyMgLSBzdXBwb3J0IHBhcnRpYWwgb3IgdG90YWwgcmVkaXNwbGF5CisjIC0ga2V5IGJpbmRpbmdzIChpbnN0ZWFkIG9mIHF1aWNrLW4tZGlydHkgYmluZGluZ3Mgb24gQ2FudmFzKToKKyMgICAtIHVwL2Rvd24gYXJyb3cga2V5cyB0byBtb3ZlIGZvY3VzIGFyb3VuZAorIyAgIC0gZGl0dG8gZm9yIHBhZ2UgdXAvZG93biwgaG9tZS9lbmQKKyMgICAtIGxlZnQvcmlnaHQgYXJyb3dzIHRvIGV4cGFuZC9jb2xsYXBzZSAmIG1vdmUgb3V0L2luCisjIC0gbW9yZSBkb2Mgc3RyaW5ncworIyAtIGFkZCBpY29ucyBmb3IgImZpbGUiLCAibW9kdWxlIiwgImNsYXNzIiwgIm1ldGhvZCI7IGJldHRlciAicHl0aG9uIiBpY29uCisjIC0gY2FsbGJhY2sgZm9yIHNlbGVjdGlvbj8/PworIyAtIG11bHRpcGxlLWl0ZW0gc2VsZWN0aW9uCisjIC0gdG9vbHRpcHMKKyMgLSByZWRvIGdlb21ldHJ5IHdpdGhvdXQgbWFnaWMgbnVtYmVycworIyAtIGtlZXAgdHJhY2sgb2Ygb2JqZWN0IGlkcyB0byBhbGxvdyBtb3JlIGNhcmVmdWwgY2xlYW5pbmcKKyMgLSBvcHRpbWl6ZSB0cmVlIHJlZHJhdyBhZnRlciBleHBhbmQgb2Ygc3Vibm9kZQorCitpbXBvcnQgb3MKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IGltcAorCitmcm9tIGlkbGVsaWIgaW1wb3J0IFpvb21IZWlnaHQKK2Zyb20gaWRsZWxpYi5jb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgorCitJQ09ORElSID0gIkljb25zIgorCisjIExvb2sgZm9yIEljb25zIHN1YmRpcmVjdG9yeSBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhpcyBtb2R1bGUKK3RyeToKKyAgICBfaWNvbmRpciA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCBJQ09ORElSKQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBfaWNvbmRpciA9IElDT05ESVIKK2lmIG9zLnBhdGguaXNkaXIoX2ljb25kaXIpOgorICAgIElDT05ESVIgPSBfaWNvbmRpcgorZWxpZiBub3Qgb3MucGF0aC5pc2RpcihJQ09ORElSKToKKyAgICByYWlzZSBSdW50aW1lRXJyb3IsICJjYW4ndCBmaW5kIGljb24gZGlyZWN0b3J5ICglcikiICUgKElDT05ESVIsKQorCitkZWYgbGlzdGljb25zKGljb25kaXI9SUNPTkRJUik6CisgICAgIiIiVXRpbGl0eSB0byBkaXNwbGF5IHRoZSBhdmFpbGFibGUgaWNvbnMuIiIiCisgICAgcm9vdCA9IFRrKCkKKyAgICBpbXBvcnQgZ2xvYgorICAgIGxpc3QgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGljb25kaXIsICIqLmdpZiIpKQorICAgIGxpc3Quc29ydCgpCisgICAgaW1hZ2VzID0gW10KKyAgICByb3cgPSBjb2x1bW4gPSAwCisgICAgZm9yIGZpbGUgaW4gbGlzdDoKKyAgICAgICAgbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShmaWxlKSlbMF0KKyAgICAgICAgaW1hZ2UgPSBQaG90b0ltYWdlKGZpbGU9ZmlsZSwgbWFzdGVyPXJvb3QpCisgICAgICAgIGltYWdlcy5hcHBlbmQoaW1hZ2UpCisgICAgICAgIGxhYmVsID0gTGFiZWwocm9vdCwgaW1hZ2U9aW1hZ2UsIGJkPTEsIHJlbGllZj0icmFpc2VkIikKKyAgICAgICAgbGFiZWwuZ3JpZChyb3c9cm93LCBjb2x1bW49Y29sdW1uKQorICAgICAgICBsYWJlbCA9IExhYmVsKHJvb3QsIHRleHQ9bmFtZSkKKyAgICAgICAgbGFiZWwuZ3JpZChyb3c9cm93KzEsIGNvbHVtbj1jb2x1bW4pCisgICAgICAgIGNvbHVtbiA9IGNvbHVtbiArIDEKKyAgICAgICAgaWYgY29sdW1uID49IDEwOgorICAgICAgICAgICAgcm93ID0gcm93KzIKKyAgICAgICAgICAgIGNvbHVtbiA9IDAKKyAgICByb290LmltYWdlcyA9IGltYWdlcworCisKK2NsYXNzIFRyZWVOb2RlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcywgcGFyZW50LCBpdGVtKToKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjYW52YXMKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5pdGVtID0gaXRlbQorICAgICAgICBzZWxmLnN0YXRlID0gJ2NvbGxhcHNlZCcKKyAgICAgICAgc2VsZi5zZWxlY3RlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQorICAgICAgICBzZWxmLnggPSBzZWxmLnkgPSBOb25lCisgICAgICAgIHNlbGYuaWNvbmltYWdlcyA9IHt9ICMgY2FjaGUgb2YgUGhvdG9JbWFnZSBpbnN0YW5jZXMgZm9yIGljb25zCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5jaGlsZHJlbls6XToKKyAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4ucmVtb3ZlKGMpCisgICAgICAgICAgICBjLmRlc3Ryb3koKQorICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKKworICAgIGRlZiBnZXRpY29uaW1hZ2Uoc2VsZiwgbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmljb25pbWFnZXNbbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaWxlLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGV4dCA9IGV4dCBvciAiLmdpZiIKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oSUNPTkRJUiwgZmlsZSArIGV4dCkKKyAgICAgICAgaW1hZ2UgPSBQaG90b0ltYWdlKG1hc3Rlcj1zZWxmLmNhbnZhcywgZmlsZT1mdWxsbmFtZSkKKyAgICAgICAgc2VsZi5pY29uaW1hZ2VzW25hbWVdID0gaW1hZ2UKKyAgICAgICAgcmV0dXJuIGltYWdlCisKKyAgICBkZWYgc2VsZWN0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLnNlbGVjdGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZGVzZWxlY3RhbGwoKQorICAgICAgICBzZWxmLnNlbGVjdGVkID0gVHJ1ZQorICAgICAgICBzZWxmLmNhbnZhcy5kZWxldGUoc2VsZi5pbWFnZV9pZCkKKyAgICAgICAgc2VsZi5kcmF3aWNvbigpCisgICAgICAgIHNlbGYuZHJhd3RleHQoKQorCisgICAgZGVmIGRlc2VsZWN0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5zZWxlY3RlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNlbGVjdGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5jYW52YXMuZGVsZXRlKHNlbGYuaW1hZ2VfaWQpCisgICAgICAgIHNlbGYuZHJhd2ljb24oKQorICAgICAgICBzZWxmLmRyYXd0ZXh0KCkKKworICAgIGRlZiBkZXNlbGVjdGFsbChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQ6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5kZXNlbGVjdGFsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRlc2VsZWN0dHJlZSgpCisKKyAgICBkZWYgZGVzZWxlY3R0cmVlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnNlbGVjdGVkOgorICAgICAgICAgICAgc2VsZi5kZXNlbGVjdCgpCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgY2hpbGQuZGVzZWxlY3R0cmVlKCkKKworICAgIGRlZiBmbGlwKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLnN0YXRlID09ICdleHBhbmRlZCc6CisgICAgICAgICAgICBzZWxmLmNvbGxhcHNlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kKCkKKyAgICAgICAgc2VsZi5pdGVtLk9uRG91YmxlQ2xpY2soKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIGV4cGFuZChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgbm90IHNlbGYuaXRlbS5fSXNFeHBhbmRhYmxlKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSAnZXhwYW5kZWQnOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdleHBhbmRlZCcKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKCkKKyAgICAgICAgICAgIHNlbGYudmlldygpCisKKyAgICBkZWYgY29sbGFwc2Uoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuc3RhdGUgIT0gJ2NvbGxhcHNlZCc6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2NvbGxhcHNlZCcKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKCkKKworICAgIGRlZiB2aWV3KHNlbGYpOgorICAgICAgICB0b3AgPSBzZWxmLnkgLSAyCisgICAgICAgIGJvdHRvbSA9IHNlbGYubGFzdHZpc2libGVjaGlsZCgpLnkgKyAxNworICAgICAgICBoZWlnaHQgPSBib3R0b20gLSB0b3AKKyAgICAgICAgdmlzaWJsZV90b3AgPSBzZWxmLmNhbnZhcy5jYW52YXN5KDApCisgICAgICAgIHZpc2libGVfaGVpZ2h0ID0gc2VsZi5jYW52YXMud2luZm9faGVpZ2h0KCkKKyAgICAgICAgdmlzaWJsZV9ib3R0b20gPSBzZWxmLmNhbnZhcy5jYW52YXN5KHZpc2libGVfaGVpZ2h0KQorICAgICAgICBpZiB2aXNpYmxlX3RvcCA8PSB0b3AgYW5kIGJvdHRvbSA8PSB2aXNpYmxlX2JvdHRvbToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB4MCwgeTAsIHgxLCB5MSA9IHNlbGYuY2FudmFzLl9nZXRpbnRzKHNlbGYuY2FudmFzWydzY3JvbGxyZWdpb24nXSkKKyAgICAgICAgaWYgdG9wID49IHZpc2libGVfdG9wIGFuZCBoZWlnaHQgPD0gdmlzaWJsZV9oZWlnaHQ6CisgICAgICAgICAgICBmcmFjdGlvbiA9IHRvcCArIGhlaWdodCAtIHZpc2libGVfaGVpZ2h0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcmFjdGlvbiA9IHRvcAorICAgICAgICBmcmFjdGlvbiA9IGZsb2F0KGZyYWN0aW9uKSAvIHkxCisgICAgICAgIHNlbGYuY2FudmFzLnl2aWV3X21vdmV0byhmcmFjdGlvbikKKworICAgIGRlZiBsYXN0dmlzaWJsZWNoaWxkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNoaWxkcmVuIGFuZCBzZWxmLnN0YXRlID09ICdleHBhbmRlZCc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGlsZHJlblstMV0ubGFzdHZpc2libGVjaGlsZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQ6CisgICAgICAgICAgICBzZWxmLnBhcmVudC51cGRhdGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2xkY3Vyc29yID0gc2VsZi5jYW52YXNbJ2N1cnNvciddCisgICAgICAgICAgICBzZWxmLmNhbnZhc1snY3Vyc29yJ10gPSAid2F0Y2giCisgICAgICAgICAgICBzZWxmLmNhbnZhcy51cGRhdGUoKQorICAgICAgICAgICAgc2VsZi5jYW52YXMuZGVsZXRlKEFMTCkgICAgICMgWFhYIGNvdWxkIGJlIG1vcmUgc3VidGxlCisgICAgICAgICAgICBzZWxmLmRyYXcoNywgMikKKyAgICAgICAgICAgIHgwLCB5MCwgeDEsIHkxID0gc2VsZi5jYW52YXMuYmJveChBTEwpCisgICAgICAgICAgICBzZWxmLmNhbnZhcy5jb25maWd1cmUoc2Nyb2xscmVnaW9uPSgwLCAwLCB4MSwgeTEpKQorICAgICAgICAgICAgc2VsZi5jYW52YXNbJ2N1cnNvciddID0gb2xkY3Vyc29yCisKKyAgICBkZWYgZHJhdyhzZWxmLCB4LCB5KToKKyAgICAgICAgIyBYWFggVGhpcyBoYXJkLWNvZGVzIHRvbyBtYW55IGdlb21ldHJ5IGNvbnN0YW50cyEKKyAgICAgICAgc2VsZi54LCBzZWxmLnkgPSB4LCB5CisgICAgICAgIHNlbGYuZHJhd2ljb24oKQorICAgICAgICBzZWxmLmRyYXd0ZXh0KCkKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSAhPSAnZXhwYW5kZWQnOgorICAgICAgICAgICAgcmV0dXJuIHkrMTcKKyAgICAgICAgIyBkcmF3IGNoaWxkcmVuCisgICAgICAgIGlmIG5vdCBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgc3VibGlzdCA9IHNlbGYuaXRlbS5fR2V0U3ViTGlzdCgpCisgICAgICAgICAgICBpZiBub3Qgc3VibGlzdDoKKyAgICAgICAgICAgICAgICAjIF9Jc0V4cGFuZGFibGUoKSB3YXMgbWlzdGFrZW47IHRoYXQncyBhbGxvd2VkCisgICAgICAgICAgICAgICAgcmV0dXJuIHkrMTcKKyAgICAgICAgICAgIGZvciBpdGVtIGluIHN1Ymxpc3Q6CisgICAgICAgICAgICAgICAgY2hpbGQgPSBzZWxmLl9fY2xhc3NfXyhzZWxmLmNhbnZhcywgc2VsZiwgaXRlbSkKKyAgICAgICAgICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChjaGlsZCkKKyAgICAgICAgY3ggPSB4KzIwCisgICAgICAgIGN5ID0geSsxNworICAgICAgICBjeWxhc3QgPSAwCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgY3lsYXN0ID0gY3kKKyAgICAgICAgICAgIHNlbGYuY2FudmFzLmNyZWF0ZV9saW5lKHgrOSwgY3krNywgY3gsIGN5KzcsIGZpbGw9ImdyYXk1MCIpCisgICAgICAgICAgICBjeSA9IGNoaWxkLmRyYXcoY3gsIGN5KQorICAgICAgICAgICAgaWYgY2hpbGQuaXRlbS5fSXNFeHBhbmRhYmxlKCk6CisgICAgICAgICAgICAgICAgaWYgY2hpbGQuc3RhdGUgPT0gJ2V4cGFuZGVkJzoKKyAgICAgICAgICAgICAgICAgICAgaWNvbm5hbWUgPSAibWludXNub2RlIgorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGNoaWxkLmNvbGxhcHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWNvbm5hbWUgPSAicGx1c25vZGUiCisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gY2hpbGQuZXhwYW5kCisgICAgICAgICAgICAgICAgaW1hZ2UgPSBzZWxmLmdldGljb25pbWFnZShpY29ubmFtZSkKKyAgICAgICAgICAgICAgICBpZCA9IHNlbGYuY2FudmFzLmNyZWF0ZV9pbWFnZSh4KzksIGN5bGFzdCs3LCBpbWFnZT1pbWFnZSkKKyAgICAgICAgICAgICAgICAjIFhYWCBUaGlzIGxlYWtzIGJpbmRpbmdzIHVudGlsIGNhbnZhcyBpcyBkZWxldGVkOgorICAgICAgICAgICAgICAgIHNlbGYuY2FudmFzLnRhZ19iaW5kKGlkLCAiPDE+IiwgY2FsbGJhY2spCisgICAgICAgICAgICAgICAgc2VsZi5jYW52YXMudGFnX2JpbmQoaWQsICI8RG91YmxlLTE+IiwgbGFtYmRhIHg6IE5vbmUpCisgICAgICAgIGlkID0gc2VsZi5jYW52YXMuY3JlYXRlX2xpbmUoeCs5LCB5KzEwLCB4KzksIGN5bGFzdCs3LAorICAgICAgICAgICAgIyNzdGlwcGxlPSJncmF5NTAiLCAgICAgIyBYWFggU2VlbXMgYnJva2VuIGluIFRrIDguMC54CisgICAgICAgICAgICBmaWxsPSJncmF5NTAiKQorICAgICAgICBzZWxmLmNhbnZhcy50YWdfbG93ZXIoaWQpICMgWFhYIC5sb3dlcihpZCkgYmVmb3JlIFB5dGhvbiAxLjUuMgorICAgICAgICByZXR1cm4gY3kKKworICAgIGRlZiBkcmF3aWNvbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zZWxlY3RlZDoKKyAgICAgICAgICAgIGltYWdlbmFtZSA9IChzZWxmLml0ZW0uR2V0U2VsZWN0ZWRJY29uTmFtZSgpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtLkdldEljb25OYW1lKCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3BlbmZvbGRlciIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbWFnZW5hbWUgPSBzZWxmLml0ZW0uR2V0SWNvbk5hbWUoKSBvciAiZm9sZGVyIgorICAgICAgICBpbWFnZSA9IHNlbGYuZ2V0aWNvbmltYWdlKGltYWdlbmFtZSkKKyAgICAgICAgaWQgPSBzZWxmLmNhbnZhcy5jcmVhdGVfaW1hZ2Uoc2VsZi54LCBzZWxmLnksIGFuY2hvcj0ibnciLCBpbWFnZT1pbWFnZSkKKyAgICAgICAgc2VsZi5pbWFnZV9pZCA9IGlkCisgICAgICAgIHNlbGYuY2FudmFzLnRhZ19iaW5kKGlkLCAiPDE+Iiwgc2VsZi5zZWxlY3QpCisgICAgICAgIHNlbGYuY2FudmFzLnRhZ19iaW5kKGlkLCAiPERvdWJsZS0xPiIsIHNlbGYuZmxpcCkKKworICAgIGRlZiBkcmF3dGV4dChzZWxmKToKKyAgICAgICAgdGV4dHggPSBzZWxmLngrMjAtMQorICAgICAgICB0ZXh0eSA9IHNlbGYueS0xCisgICAgICAgIGxhYmVsdGV4dCA9IHNlbGYuaXRlbS5HZXRMYWJlbFRleHQoKQorICAgICAgICBpZiBsYWJlbHRleHQ6CisgICAgICAgICAgICBpZCA9IHNlbGYuY2FudmFzLmNyZWF0ZV90ZXh0KHRleHR4LCB0ZXh0eSwgYW5jaG9yPSJudyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9bGFiZWx0ZXh0KQorICAgICAgICAgICAgc2VsZi5jYW52YXMudGFnX2JpbmQoaWQsICI8MT4iLCBzZWxmLnNlbGVjdCkKKyAgICAgICAgICAgIHNlbGYuY2FudmFzLnRhZ19iaW5kKGlkLCAiPERvdWJsZS0xPiIsIHNlbGYuZmxpcCkKKyAgICAgICAgICAgIHgwLCB5MCwgeDEsIHkxID0gc2VsZi5jYW52YXMuYmJveChpZCkKKyAgICAgICAgICAgIHRleHR4ID0gbWF4KHgxLCAyMDApICsgMTAKKyAgICAgICAgdGV4dCA9IHNlbGYuaXRlbS5HZXRUZXh0KCkgb3IgIjxubyB0ZXh0PiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5lbnRyeQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmVkaXRfZmluaXNoKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGFiZWwgPSBzZWxmLmxhYmVsCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICMgcGFkZGluZyBjYXJlZnVsbHkgc2VsZWN0ZWQgKG9uIFdpbmRvd3MpIHRvIG1hdGNoIEVudHJ5IHdpZGdldDoKKyAgICAgICAgICAgIHNlbGYubGFiZWwgPSBMYWJlbChzZWxmLmNhbnZhcywgdGV4dD10ZXh0LCBiZD0wLCBwYWR4PTIsIHBhZHk9MikKKyAgICAgICAgdGhlbWUgPSBpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdUaGVtZScsJ25hbWUnKQorICAgICAgICBpZiBzZWxmLnNlbGVjdGVkOgorICAgICAgICAgICAgc2VsZi5sYWJlbC5jb25maWd1cmUoaWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLCAnaGlsaXRlJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxhYmVsLmNvbmZpZ3VyZShpZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsICdub3JtYWwnKSkKKyAgICAgICAgaWQgPSBzZWxmLmNhbnZhcy5jcmVhdGVfd2luZG93KHRleHR4LCB0ZXh0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcj0ibnciLCB3aW5kb3c9c2VsZi5sYWJlbCkKKyAgICAgICAgc2VsZi5sYWJlbC5iaW5kKCI8MT4iLCBzZWxmLnNlbGVjdF9vcl9lZGl0KQorICAgICAgICBzZWxmLmxhYmVsLmJpbmQoIjxEb3VibGUtMT4iLCBzZWxmLmZsaXApCisgICAgICAgIHNlbGYudGV4dF9pZCA9IGlkCisKKyAgICBkZWYgc2VsZWN0X29yX2VkaXQoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuc2VsZWN0ZWQgYW5kIHNlbGYuaXRlbS5Jc0VkaXRhYmxlKCk6CisgICAgICAgICAgICBzZWxmLmVkaXQoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNlbGVjdChldmVudCkKKworICAgIGRlZiBlZGl0KHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLmVudHJ5ID0gRW50cnkoc2VsZi5sYWJlbCwgYmQ9MCwgaGlnaGxpZ2h0dGhpY2tuZXNzPTEsIHdpZHRoPTApCisgICAgICAgIHNlbGYuZW50cnkuaW5zZXJ0KDAsIHNlbGYubGFiZWxbJ3RleHQnXSkKKyAgICAgICAgc2VsZi5lbnRyeS5zZWxlY3Rpb25fcmFuZ2UoMCwgRU5EKQorICAgICAgICBzZWxmLmVudHJ5LnBhY2soaXBhZHg9NSkKKyAgICAgICAgc2VsZi5lbnRyeS5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLmVudHJ5LmJpbmQoIjxSZXR1cm4+Iiwgc2VsZi5lZGl0X2ZpbmlzaCkKKyAgICAgICAgc2VsZi5lbnRyeS5iaW5kKCI8RXNjYXBlPiIsIHNlbGYuZWRpdF9jYW5jZWwpCisKKyAgICBkZWYgZWRpdF9maW5pc2goc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVudHJ5ID0gc2VsZi5lbnRyeQorICAgICAgICAgICAgZGVsIHNlbGYuZW50cnkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRleHQgPSBlbnRyeS5nZXQoKQorICAgICAgICBlbnRyeS5kZXN0cm95KCkKKyAgICAgICAgaWYgdGV4dCBhbmQgdGV4dCAhPSBzZWxmLml0ZW0uR2V0VGV4dCgpOgorICAgICAgICAgICAgc2VsZi5pdGVtLlNldFRleHQodGV4dCkKKyAgICAgICAgdGV4dCA9IHNlbGYuaXRlbS5HZXRUZXh0KCkKKyAgICAgICAgc2VsZi5sYWJlbFsndGV4dCddID0gdGV4dAorICAgICAgICBzZWxmLmRyYXd0ZXh0KCkKKyAgICAgICAgc2VsZi5jYW52YXMuZm9jdXNfc2V0KCkKKworICAgIGRlZiBlZGl0X2NhbmNlbChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW50cnkgPSBzZWxmLmVudHJ5CisgICAgICAgICAgICBkZWwgc2VsZi5lbnRyeQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZW50cnkuZGVzdHJveSgpCisgICAgICAgIHNlbGYuZHJhd3RleHQoKQorICAgICAgICBzZWxmLmNhbnZhcy5mb2N1c19zZXQoKQorCisKK2NsYXNzIFRyZWVJdGVtOgorCisgICAgIiIiQWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50aW5nIHRyZWUgaXRlbXMuCisKKyAgICBNZXRob2RzIHNob3VsZCB0eXBpY2FsbHkgYmUgb3ZlcnJpZGRlbiwgb3RoZXJ3aXNlIGEgZGVmYXVsdCBhY3Rpb24KKyAgICBpcyB1c2VkLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICIiIkNvbnN0cnVjdG9yLiAgRG8gd2hhdGV2ZXIgeW91IG5lZWQgdG8gZG8uIiIiCisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRleHQgc3RyaW5nIHRvIGRpc3BsYXkuIiIiCisKKyAgICBkZWYgR2V0TGFiZWxUZXh0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbGFiZWwgdGV4dCBzdHJpbmcgdG8gZGlzcGxheSBpbiBmcm9udCBvZiB0ZXh0IChpZiBhbnkpLiIiIgorCisgICAgZXhwYW5kYWJsZSA9IE5vbmUKKworICAgIGRlZiBfSXNFeHBhbmRhYmxlKHNlbGYpOgorICAgICAgICAiIiJEbyBub3Qgb3ZlcnJpZGUhICBDYWxsZWQgYnkgVHJlZU5vZGUuIiIiCisgICAgICAgIGlmIHNlbGYuZXhwYW5kYWJsZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5leHBhbmRhYmxlID0gc2VsZi5Jc0V4cGFuZGFibGUoKQorICAgICAgICByZXR1cm4gc2VsZi5leHBhbmRhYmxlCisKKyAgICBkZWYgSXNFeHBhbmRhYmxlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2hldGhlciB0aGVyZSBhcmUgc3ViaXRlbXMuIiIiCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgX0dldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgICIiIkRvIG5vdCBvdmVycmlkZSEgIENhbGxlZCBieSBUcmVlTm9kZS4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuSXNFeHBhbmRhYmxlKCk6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgc3VibGlzdCA9IHNlbGYuR2V0U3ViTGlzdCgpCisgICAgICAgIGlmIG5vdCBzdWJsaXN0OgorICAgICAgICAgICAgc2VsZi5leHBhbmRhYmxlID0gMAorICAgICAgICByZXR1cm4gc3VibGlzdAorCisgICAgZGVmIElzRWRpdGFibGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aGV0aGVyIHRoZSBpdGVtJ3MgdGV4dCBtYXkgYmUgZWRpdGVkLiIiIgorCisgICAgZGVmIFNldFRleHQoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIkNoYW5nZSB0aGUgaXRlbSdzIHRleHQgKGlmIGl0IGlzIGVkaXRhYmxlKS4iIiIKKworICAgIGRlZiBHZXRJY29uTmFtZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIG5hbWUgb2YgaWNvbiB0byBiZSBkaXNwbGF5ZWQgbm9ybWFsbHkuIiIiCisKKyAgICBkZWYgR2V0U2VsZWN0ZWRJY29uTmFtZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIG5hbWUgb2YgaWNvbiB0byBiZSBkaXNwbGF5ZWQgd2hlbiBzZWxlY3RlZC4iIiIKKworICAgIGRlZiBHZXRTdWJMaXN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBpdGVtcyBmb3JtaW5nIHN1Ymxpc3QuIiIiCisKKyAgICBkZWYgT25Eb3VibGVDbGljayhzZWxmKToKKyAgICAgICAgIiIiQ2FsbGVkIG9uIGEgZG91YmxlLWNsaWNrIG9uIHRoZSBpdGVtLiIiIgorCisKKyMgRXhhbXBsZSBhcHBsaWNhdGlvbgorCitjbGFzcyBGaWxlVHJlZUl0ZW0oVHJlZUl0ZW0pOgorCisgICAgIiIiRXhhbXBsZSBUcmVlSXRlbSBzdWJjbGFzcyAtLSBicm93c2UgdGhlIGZpbGUgc3lzdGVtLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisKKyAgICBkZWYgR2V0VGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5wYXRoKSBvciBzZWxmLnBhdGgKKworICAgIGRlZiBJc0VkaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzZWxmLnBhdGgpICE9ICIiCisKKyAgICBkZWYgU2V0VGV4dChzZWxmLCB0ZXh0KToKKyAgICAgICAgbmV3cGF0aCA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCisgICAgICAgIG5ld3BhdGggPSBvcy5wYXRoLmpvaW4obmV3cGF0aCwgdGV4dCkKKyAgICAgICAgaWYgb3MucGF0aC5kaXJuYW1lKG5ld3BhdGgpICE9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLnBhdGgsIG5ld3BhdGgpCisgICAgICAgICAgICBzZWxmLnBhdGggPSBuZXdwYXRoCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBHZXRJY29uTmFtZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuSXNFeHBhbmRhYmxlKCk6CisgICAgICAgICAgICByZXR1cm4gInB5dGhvbiIgIyBYWFggd2lzaCB0aGVyZSB3YXMgYSAiZmlsZSIgaWNvbgorCisgICAgZGVmIElzRXhwYW5kYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNkaXIoc2VsZi5wYXRoKQorCisgICAgZGVmIEdldFN1Ykxpc3Qoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihzZWxmLnBhdGgpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBuYW1lcy5zb3J0KGtleSA9IG9zLnBhdGgubm9ybWNhc2UpCisgICAgICAgIHN1Ymxpc3QgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGl0ZW0gPSBGaWxlVHJlZUl0ZW0ob3MucGF0aC5qb2luKHNlbGYucGF0aCwgbmFtZSkpCisgICAgICAgICAgICBzdWJsaXN0LmFwcGVuZChpdGVtKQorICAgICAgICByZXR1cm4gc3VibGlzdAorCisKKyMgQSBjYW52YXMgd2lkZ2V0IHdpdGggc2Nyb2xsIGJhcnMgYW5kIHNvbWUgdXNlZnVsIGJpbmRpbmdzCisKK2NsYXNzIFNjcm9sbGVkQ2FudmFzOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsICoqb3B0cyk6CisgICAgICAgIGlmICd5c2Nyb2xsaW5jcmVtZW50JyBub3QgaW4gb3B0czoKKyAgICAgICAgICAgIG9wdHNbJ3lzY3JvbGxpbmNyZW1lbnQnXSA9IDE3CisgICAgICAgIHNlbGYubWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYuZnJhbWUgPSBGcmFtZShtYXN0ZXIpCisgICAgICAgIHNlbGYuZnJhbWUucm93Y29uZmlndXJlKDAsIHdlaWdodD0xKQorICAgICAgICBzZWxmLmZyYW1lLmNvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKyAgICAgICAgc2VsZi5jYW52YXMgPSBDYW52YXMoc2VsZi5mcmFtZSwgKipvcHRzKQorICAgICAgICBzZWxmLmNhbnZhcy5ncmlkKHJvdz0wLCBjb2x1bW49MCwgc3RpY2t5PSJuc2V3IikKKyAgICAgICAgc2VsZi52YmFyID0gU2Nyb2xsYmFyKHNlbGYuZnJhbWUsIG5hbWU9InZiYXIiKQorICAgICAgICBzZWxmLnZiYXIuZ3JpZChyb3c9MCwgY29sdW1uPTEsIHN0aWNreT0ibnNlIikKKyAgICAgICAgc2VsZi5oYmFyID0gU2Nyb2xsYmFyKHNlbGYuZnJhbWUsIG5hbWU9ImhiYXIiLCBvcmllbnQ9Imhvcml6b250YWwiKQorICAgICAgICBzZWxmLmhiYXIuZ3JpZChyb3c9MSwgY29sdW1uPTAsIHN0aWNreT0iZXdzIikKKyAgICAgICAgc2VsZi5jYW52YXNbJ3lzY3JvbGxjb21tYW5kJ10gPSBzZWxmLnZiYXIuc2V0CisgICAgICAgIHNlbGYudmJhclsnY29tbWFuZCddID0gc2VsZi5jYW52YXMueXZpZXcKKyAgICAgICAgc2VsZi5jYW52YXNbJ3hzY3JvbGxjb21tYW5kJ10gPSBzZWxmLmhiYXIuc2V0CisgICAgICAgIHNlbGYuaGJhclsnY29tbWFuZCddID0gc2VsZi5jYW52YXMueHZpZXcKKyAgICAgICAgc2VsZi5jYW52YXMuYmluZCgiPEtleS1Qcmlvcj4iLCBzZWxmLnBhZ2VfdXApCisgICAgICAgIHNlbGYuY2FudmFzLmJpbmQoIjxLZXktTmV4dD4iLCBzZWxmLnBhZ2VfZG93bikKKyAgICAgICAgc2VsZi5jYW52YXMuYmluZCgiPEtleS1VcD4iLCBzZWxmLnVuaXRfdXApCisgICAgICAgIHNlbGYuY2FudmFzLmJpbmQoIjxLZXktRG93bj4iLCBzZWxmLnVuaXRfZG93bikKKyAgICAgICAgI2lmIGlzaW5zdGFuY2UobWFzdGVyLCBUb3BsZXZlbCkgb3IgaXNpbnN0YW5jZShtYXN0ZXIsIFRrKToKKyAgICAgICAgc2VsZi5jYW52YXMuYmluZCgiPEFsdC1LZXktMj4iLCBzZWxmLnpvb21faGVpZ2h0KQorICAgICAgICBzZWxmLmNhbnZhcy5mb2N1c19zZXQoKQorICAgIGRlZiBwYWdlX3VwKHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5jYW52YXMueXZpZXdfc2Nyb2xsKC0xLCAicGFnZSIpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgZGVmIHBhZ2VfZG93bihzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuY2FudmFzLnl2aWV3X3Njcm9sbCgxLCAicGFnZSIpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgZGVmIHVuaXRfdXAoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmNhbnZhcy55dmlld19zY3JvbGwoLTEsICJ1bml0IikKKyAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICBkZWYgdW5pdF9kb3duKHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi5jYW52YXMueXZpZXdfc2Nyb2xsKDEsICJ1bml0IikKKyAgICAgICAgcmV0dXJuICJicmVhayIKKyAgICBkZWYgem9vbV9oZWlnaHQoc2VsZiwgZXZlbnQpOgorICAgICAgICBab29tSGVpZ2h0Lnpvb21faGVpZ2h0KHNlbGYubWFzdGVyKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisKKyMgVGVzdGluZyBmdW5jdGlvbnMKKworZGVmIHRlc3QoKToKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IFB5U2hlbGwKKyAgICByb290ID0gVG9wbGV2ZWwoUHlTaGVsbC5yb290KQorICAgIHJvb3QuY29uZmlndXJlKGJkPTAsIGJnPSJ5ZWxsb3ciKQorICAgIHJvb3QuZm9jdXNfc2V0KCkKKyAgICBzYyA9IFNjcm9sbGVkQ2FudmFzKHJvb3QsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCB0YWtlZm9jdXM9MSkKKyAgICBzYy5mcmFtZS5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICBpdGVtID0gRmlsZVRyZWVJdGVtKCJDOi93aW5kb3dzL2Rlc2t0b3AiKQorICAgIG5vZGUgPSBUcmVlTm9kZShzYy5jYW52YXMsIE5vbmUsIGl0ZW0pCisgICAgbm9kZS5leHBhbmQoKQorCitkZWYgdGVzdDIoKToKKyAgICAjIHRlc3Qgdy9vIHNjcm9sbGluZyBjYW52YXMKKyAgICByb290ID0gVGsoKQorICAgIHJvb3QuY29uZmlndXJlKGJkPTApCisgICAgY2FudmFzID0gQ2FudmFzKHJvb3QsIGJnPSJ3aGl0ZSIsIGhpZ2hsaWdodHRoaWNrbmVzcz0wKQorICAgIGNhbnZhcy5wYWNrKGV4cGFuZD0xLCBmaWxsPSJib3RoIikKKyAgICBpdGVtID0gRmlsZVRyZWVJdGVtKG9zLmN1cmRpcikKKyAgICBub2RlID0gVHJlZU5vZGUoY2FudmFzLCBOb25lLCBpdGVtKQorICAgIG5vZGUudXBkYXRlKCkKKyAgICBjYW52YXMuZm9jdXNfc2V0KCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg4ZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RyZWVXaWRnZXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9UcmVlV2lkZ2V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTg4ZDg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1RyZWVXaWRnZXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1VuZG9EZWxlZ2F0b3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkM2FlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5CkBAIC0wLDAgKzEsMzUyIEBACitpbXBvcnQgc3RyaW5nCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworZnJvbSBpZGxlbGliLkRlbGVnYXRvciBpbXBvcnQgRGVsZWdhdG9yCisKKyMkIGV2ZW50IDw8cmVkbz4+CisjJCB3aW4gPENvbnRyb2wteT4KKyMkIHVuaXggPEFsdC16PgorCisjJCBldmVudCA8PHVuZG8+PgorIyQgd2luIDxDb250cm9sLXo+CisjJCB1bml4IDxDb250cm9sLXo+CisKKyMkIGV2ZW50IDw8ZHVtcC11bmRvLXN0YXRlPj4KKyMkIHdpbiA8Q29udHJvbC1iYWNrc2xhc2g+CisjJCB1bml4IDxDb250cm9sLWJhY2tzbGFzaD4KKworCitjbGFzcyBVbmRvRGVsZWdhdG9yKERlbGVnYXRvcik6CisKKyAgICBtYXhfdW5kbyA9IDEwMDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgRGVsZWdhdG9yLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYucmVzZXRfdW5kbygpCisKKyAgICBkZWYgc2V0ZGVsZWdhdGUoc2VsZiwgZGVsZWdhdGUpOgorICAgICAgICBpZiBzZWxmLmRlbGVnYXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51bmJpbmQoIjw8dW5kbz4+IikKKyAgICAgICAgICAgIHNlbGYudW5iaW5kKCI8PHJlZG8+PiIpCisgICAgICAgICAgICBzZWxmLnVuYmluZCgiPDxkdW1wLXVuZG8tc3RhdGU+PiIpCisgICAgICAgIERlbGVnYXRvci5zZXRkZWxlZ2F0ZShzZWxmLCBkZWxlZ2F0ZSkKKyAgICAgICAgaWYgZGVsZWdhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmJpbmQoIjw8dW5kbz4+Iiwgc2VsZi51bmRvX2V2ZW50KQorICAgICAgICAgICAgc2VsZi5iaW5kKCI8PHJlZG8+PiIsIHNlbGYucmVkb19ldmVudCkKKyAgICAgICAgICAgIHNlbGYuYmluZCgiPDxkdW1wLXVuZG8tc3RhdGU+PiIsIHNlbGYuZHVtcF9ldmVudCkKKworICAgIGRlZiBkdW1wX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgZnJvbSBwcHJpbnQgaW1wb3J0IHBwcmludAorICAgICAgICBwcHJpbnQoc2VsZi51bmRvbGlzdFs6c2VsZi5wb2ludGVyXSkKKyAgICAgICAgcHJpbnQgInBvaW50ZXI6Iiwgc2VsZi5wb2ludGVyLAorICAgICAgICBwcmludCAic2F2ZWQ6Iiwgc2VsZi5zYXZlZCwKKyAgICAgICAgcHJpbnQgImNhbl9tZXJnZToiLCBzZWxmLmNhbl9tZXJnZSwKKyAgICAgICAgcHJpbnQgImdldF9zYXZlZCgpOiIsIHNlbGYuZ2V0X3NhdmVkKCkKKyAgICAgICAgcHByaW50KHNlbGYudW5kb2xpc3Rbc2VsZi5wb2ludGVyOl0pCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKyAgICBkZWYgcmVzZXRfdW5kbyhzZWxmKToKKyAgICAgICAgc2VsZi53YXNfc2F2ZWQgPSAtMQorICAgICAgICBzZWxmLnBvaW50ZXIgPSAwCisgICAgICAgIHNlbGYudW5kb2xpc3QgPSBbXQorICAgICAgICBzZWxmLnVuZG9ibG9jayA9IDAgICMgb3IgYSBDb21tYW5kU2VxdWVuY2UgaW5zdGFuY2UKKyAgICAgICAgc2VsZi5zZXRfc2F2ZWQoMSkKKworICAgIGRlZiBzZXRfc2F2ZWQoc2VsZiwgZmxhZyk6CisgICAgICAgIGlmIGZsYWc6CisgICAgICAgICAgICBzZWxmLnNhdmVkID0gc2VsZi5wb2ludGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnNhdmVkID0gLTEKKyAgICAgICAgc2VsZi5jYW5fbWVyZ2UgPSBGYWxzZQorICAgICAgICBzZWxmLmNoZWNrX3NhdmVkKCkKKworICAgIGRlZiBnZXRfc2F2ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNhdmVkID09IHNlbGYucG9pbnRlcgorCisgICAgc2F2ZWRfY2hhbmdlX2hvb2sgPSBOb25lCisKKyAgICBkZWYgc2V0X3NhdmVkX2NoYW5nZV9ob29rKHNlbGYsIGhvb2spOgorICAgICAgICBzZWxmLnNhdmVkX2NoYW5nZV9ob29rID0gaG9vaworCisgICAgd2FzX3NhdmVkID0gLTEKKworICAgIGRlZiBjaGVja19zYXZlZChzZWxmKToKKyAgICAgICAgaXNfc2F2ZWQgPSBzZWxmLmdldF9zYXZlZCgpCisgICAgICAgIGlmIGlzX3NhdmVkICE9IHNlbGYud2FzX3NhdmVkOgorICAgICAgICAgICAgc2VsZi53YXNfc2F2ZWQgPSBpc19zYXZlZAorICAgICAgICAgICAgaWYgc2VsZi5zYXZlZF9jaGFuZ2VfaG9vazoKKyAgICAgICAgICAgICAgICBzZWxmLnNhdmVkX2NoYW5nZV9ob29rKCkKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGNoYXJzLCB0YWdzPU5vbmUpOgorICAgICAgICBzZWxmLmFkZGNtZChJbnNlcnRDb21tYW5kKGluZGV4LCBjaGFycywgdGFncykpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICBzZWxmLmFkZGNtZChEZWxldGVDb21tYW5kKGluZGV4MSwgaW5kZXgyKSkKKworICAgICMgQ2xpZW50cyBzaG91bGQgY2FsbCB1bmRvX2Jsb2NrX3N0YXJ0KCkgYW5kIHVuZG9fYmxvY2tfc3RvcCgpCisgICAgIyBhcm91bmQgYSBzZXF1ZW5jZSBvZiBlZGl0aW5nIGNtZHMgdG8gYmUgdHJlYXRlZCBhcyBhIHVuaXQgYnkKKyAgICAjIHVuZG8gJiByZWRvLiAgTmVzdGVkIG1hdGNoaW5nIGNhbGxzIGFyZSBPSywgYW5kIHRoZSBpbm5lciBjYWxscworICAgICMgdGhlbiBhY3QgbGlrZSBub3BzLiAgT0sgdG9vIGlmIG5vIGVkaXRpbmcgY21kcywgb3Igb25seSBvbmUKKyAgICAjIGVkaXRpbmcgY21kLCBpcyBpc3N1ZWQgaW4gYmV0d2VlbjogIGlmIG5vIGNtZHMsIHRoZSB3aG9sZQorICAgICMgc2VxdWVuY2UgaGFzIG5vIGVmZmVjdDsgYW5kIGlmIG9ubHkgb25lIGNtZCwgdGhhdCBjbWQgaXMgZW50ZXJlZAorICAgICMgZGlyZWN0bHkgaW50byB0aGUgdW5kbyBsaXN0LCBhcyBpZiB1bmRvX2Jsb2NrX3h4eCBoYWRuJ3QgYmVlbgorICAgICMgY2FsbGVkLiAgVGhlIGludGVudCBvZiBhbGwgdGhhdCBpcyB0byBtYWtlIHRoaXMgc2NoZW1lIGVhc3kKKyAgICAjIHRvIHVzZTogIGFsbCB0aGUgY2xpZW50IGhhcyB0byB3b3JyeSBhYm91dCBpcyBtYWtpbmcgc3VyZSBlYWNoCisgICAgIyBfc3RhcnQoKSBjYWxsIGlzIG1hdGNoZWQgYnkgYSBfc3RvcCgpIGNhbGwuCisKKyAgICBkZWYgdW5kb19ibG9ja19zdGFydChzZWxmKToKKyAgICAgICAgaWYgc2VsZi51bmRvYmxvY2sgPT0gMDoKKyAgICAgICAgICAgIHNlbGYudW5kb2Jsb2NrID0gQ29tbWFuZFNlcXVlbmNlKCkKKyAgICAgICAgc2VsZi51bmRvYmxvY2suYnVtcF9kZXB0aCgpCisKKyAgICBkZWYgdW5kb19ibG9ja19zdG9wKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnVuZG9ibG9jay5idW1wX2RlcHRoKC0xKSA9PSAwOgorICAgICAgICAgICAgY21kID0gc2VsZi51bmRvYmxvY2sKKyAgICAgICAgICAgIHNlbGYudW5kb2Jsb2NrID0gMAorICAgICAgICAgICAgaWYgbGVuKGNtZCkgPiAwOgorICAgICAgICAgICAgICAgIGlmIGxlbihjbWQpID09IDE6CisgICAgICAgICAgICAgICAgICAgICMgbm8gbmVlZCB0byB3cmFwIGEgc2luZ2xlIGNtZAorICAgICAgICAgICAgICAgICAgICBjbWQgPSBjbWQuZ2V0Y21kKDApCisgICAgICAgICAgICAgICAgIyB0aGlzIGJsayBvZiBjbWRzLCBvciBzaW5nbGUgY21kLCBoYXMgYWxyZWFkeQorICAgICAgICAgICAgICAgICMgYmVlbiBkb25lLCBzbyBkb24ndCBleGVjdXRlIGl0IGFnYWluCisgICAgICAgICAgICAgICAgc2VsZi5hZGRjbWQoY21kLCAwKQorCisgICAgZGVmIGFkZGNtZChzZWxmLCBjbWQsIGV4ZWN1dGU9VHJ1ZSk6CisgICAgICAgIGlmIGV4ZWN1dGU6CisgICAgICAgICAgICBjbWQuZG8oc2VsZi5kZWxlZ2F0ZSkKKyAgICAgICAgaWYgc2VsZi51bmRvYmxvY2sgIT0gMDoKKyAgICAgICAgICAgIHNlbGYudW5kb2Jsb2NrLmFwcGVuZChjbWQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5jYW5fbWVyZ2UgYW5kIHNlbGYucG9pbnRlciA+IDA6CisgICAgICAgICAgICBsYXN0Y21kID0gc2VsZi51bmRvbGlzdFtzZWxmLnBvaW50ZXItMV0KKyAgICAgICAgICAgIGlmIGxhc3RjbWQubWVyZ2UoY21kKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi51bmRvbGlzdFtzZWxmLnBvaW50ZXI6XSA9IFtjbWRdCisgICAgICAgIGlmIHNlbGYuc2F2ZWQgPiBzZWxmLnBvaW50ZXI6CisgICAgICAgICAgICBzZWxmLnNhdmVkID0gLTEKKyAgICAgICAgc2VsZi5wb2ludGVyID0gc2VsZi5wb2ludGVyICsgMQorICAgICAgICBpZiBsZW4oc2VsZi51bmRvbGlzdCkgPiBzZWxmLm1heF91bmRvOgorICAgICAgICAgICAgIyNwcmludCAidHJ1bmNhdGluZyB1bmRvIGxpc3QiCisgICAgICAgICAgICBkZWwgc2VsZi51bmRvbGlzdFswXQorICAgICAgICAgICAgc2VsZi5wb2ludGVyID0gc2VsZi5wb2ludGVyIC0gMQorICAgICAgICAgICAgaWYgc2VsZi5zYXZlZCA+PSAwOgorICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWQgPSBzZWxmLnNhdmVkIC0gMQorICAgICAgICBzZWxmLmNhbl9tZXJnZSA9IFRydWUKKyAgICAgICAgc2VsZi5jaGVja19zYXZlZCgpCisKKyAgICBkZWYgdW5kb19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYucG9pbnRlciA9PSAwOgorICAgICAgICAgICAgc2VsZi5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGNtZCA9IHNlbGYudW5kb2xpc3Rbc2VsZi5wb2ludGVyIC0gMV0KKyAgICAgICAgY21kLnVuZG8oc2VsZi5kZWxlZ2F0ZSkKKyAgICAgICAgc2VsZi5wb2ludGVyID0gc2VsZi5wb2ludGVyIC0gMQorICAgICAgICBzZWxmLmNhbl9tZXJnZSA9IEZhbHNlCisgICAgICAgIHNlbGYuY2hlY2tfc2F2ZWQoKQorICAgICAgICByZXR1cm4gImJyZWFrIgorCisgICAgZGVmIHJlZG9fZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBzZWxmLnBvaW50ZXIgPj0gbGVuKHNlbGYudW5kb2xpc3QpOgorICAgICAgICAgICAgc2VsZi5iZWxsKCkKKyAgICAgICAgICAgIHJldHVybiAiYnJlYWsiCisgICAgICAgIGNtZCA9IHNlbGYudW5kb2xpc3Rbc2VsZi5wb2ludGVyXQorICAgICAgICBjbWQucmVkbyhzZWxmLmRlbGVnYXRlKQorICAgICAgICBzZWxmLnBvaW50ZXIgPSBzZWxmLnBvaW50ZXIgKyAxCisgICAgICAgIHNlbGYuY2FuX21lcmdlID0gRmFsc2UKKyAgICAgICAgc2VsZi5jaGVja19zYXZlZCgpCisgICAgICAgIHJldHVybiAiYnJlYWsiCisKKworY2xhc3MgQ29tbWFuZDoKKworICAgICMgQmFzZSBjbGFzcyBmb3IgVW5kb2FibGUgY29tbWFuZHMKKworICAgIHRhZ3MgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5kZXgxLCBpbmRleDIsIGNoYXJzLCB0YWdzPU5vbmUpOgorICAgICAgICBzZWxmLm1hcmtzX2JlZm9yZSA9IHt9CisgICAgICAgIHNlbGYubWFya3NfYWZ0ZXIgPSB7fQorICAgICAgICBzZWxmLmluZGV4MSA9IGluZGV4MQorICAgICAgICBzZWxmLmluZGV4MiA9IGluZGV4MgorICAgICAgICBzZWxmLmNoYXJzID0gY2hhcnMKKyAgICAgICAgaWYgdGFnczoKKyAgICAgICAgICAgIHNlbGYudGFncyA9IHRhZ3MKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcyA9IHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIHQgPSAoc2VsZi5pbmRleDEsIHNlbGYuaW5kZXgyLCBzZWxmLmNoYXJzLCBzZWxmLnRhZ3MpCisgICAgICAgIGlmIHNlbGYudGFncyBpcyBOb25lOgorICAgICAgICAgICAgdCA9IHRbOi0xXQorICAgICAgICByZXR1cm4gcyArIHJlcHIodCkKKworICAgIGRlZiBkbyhzZWxmLCB0ZXh0KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJlZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB1bmRvKHNlbGYsIHRleHQpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgbWVyZ2Uoc2VsZiwgY21kKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBzYXZlX21hcmtzKHNlbGYsIHRleHQpOgorICAgICAgICBtYXJrcyA9IHt9CisgICAgICAgIGZvciBuYW1lIGluIHRleHQubWFya19uYW1lcygpOgorICAgICAgICAgICAgaWYgbmFtZSAhPSAiaW5zZXJ0IiBhbmQgbmFtZSAhPSAiY3VycmVudCI6CisgICAgICAgICAgICAgICAgbWFya3NbbmFtZV0gPSB0ZXh0LmluZGV4KG5hbWUpCisgICAgICAgIHJldHVybiBtYXJrcworCisgICAgZGVmIHNldF9tYXJrcyhzZWxmLCB0ZXh0LCBtYXJrcyk6CisgICAgICAgIGZvciBuYW1lLCBpbmRleCBpbiBtYXJrcy5pdGVtcygpOgorICAgICAgICAgICAgdGV4dC5tYXJrX3NldChuYW1lLCBpbmRleCkKKworCitjbGFzcyBJbnNlcnRDb21tYW5kKENvbW1hbmQpOgorCisgICAgIyBVbmRvYWJsZSBpbnNlcnQgY29tbWFuZAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4MSwgY2hhcnMsIHRhZ3M9Tm9uZSk6CisgICAgICAgIENvbW1hbmQuX19pbml0X18oc2VsZiwgaW5kZXgxLCBOb25lLCBjaGFycywgdGFncykKKworICAgIGRlZiBkbyhzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5tYXJrc19iZWZvcmUgPSBzZWxmLnNhdmVfbWFya3ModGV4dCkKKyAgICAgICAgc2VsZi5pbmRleDEgPSB0ZXh0LmluZGV4KHNlbGYuaW5kZXgxKQorICAgICAgICBpZiB0ZXh0LmNvbXBhcmUoc2VsZi5pbmRleDEsICI+IiwgImVuZC0xYyIpOgorICAgICAgICAgICAgIyBJbnNlcnQgYmVmb3JlIHRoZSBmaW5hbCBuZXdsaW5lCisgICAgICAgICAgICBzZWxmLmluZGV4MSA9IHRleHQuaW5kZXgoImVuZC0xYyIpCisgICAgICAgIHRleHQuaW5zZXJ0KHNlbGYuaW5kZXgxLCBzZWxmLmNoYXJzLCBzZWxmLnRhZ3MpCisgICAgICAgIHNlbGYuaW5kZXgyID0gdGV4dC5pbmRleCgiJXMrJWRjIiAlIChzZWxmLmluZGV4MSwgbGVuKHNlbGYuY2hhcnMpKSkKKyAgICAgICAgc2VsZi5tYXJrc19hZnRlciA9IHNlbGYuc2F2ZV9tYXJrcyh0ZXh0KQorICAgICAgICAjI3N5cy5fX3N0ZGVycl9fLndyaXRlKCJkbzogJXNcbiIgJSBzZWxmKQorCisgICAgZGVmIHJlZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHRleHQubWFya19zZXQoJ2luc2VydCcsIHNlbGYuaW5kZXgxKQorICAgICAgICB0ZXh0Lmluc2VydChzZWxmLmluZGV4MSwgc2VsZi5jaGFycywgc2VsZi50YWdzKQorICAgICAgICBzZWxmLnNldF9tYXJrcyh0ZXh0LCBzZWxmLm1hcmtzX2FmdGVyKQorICAgICAgICB0ZXh0LnNlZSgnaW5zZXJ0JykKKyAgICAgICAgIyNzeXMuX19zdGRlcnJfXy53cml0ZSgicmVkbzogJXNcbiIgJSBzZWxmKQorCisgICAgZGVmIHVuZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHRleHQubWFya19zZXQoJ2luc2VydCcsIHNlbGYuaW5kZXgxKQorICAgICAgICB0ZXh0LmRlbGV0ZShzZWxmLmluZGV4MSwgc2VsZi5pbmRleDIpCisgICAgICAgIHNlbGYuc2V0X21hcmtzKHRleHQsIHNlbGYubWFya3NfYmVmb3JlKQorICAgICAgICB0ZXh0LnNlZSgnaW5zZXJ0JykKKyAgICAgICAgIyNzeXMuX19zdGRlcnJfXy53cml0ZSgidW5kbzogJXNcbiIgJSBzZWxmKQorCisgICAgZGVmIG1lcmdlKHNlbGYsIGNtZCk6CisgICAgICAgIGlmIHNlbGYuX19jbGFzc19fIGlzIG5vdCBjbWQuX19jbGFzc19fOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYuaW5kZXgyICE9IGNtZC5pbmRleDE6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi50YWdzICE9IGNtZC50YWdzOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGxlbihjbWQuY2hhcnMpICE9IDE6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5jaGFycyBhbmQgXAorICAgICAgICAgICBzZWxmLmNsYXNzaWZ5KHNlbGYuY2hhcnNbLTFdKSAhPSBzZWxmLmNsYXNzaWZ5KGNtZC5jaGFycyk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgc2VsZi5pbmRleDIgPSBjbWQuaW5kZXgyCisgICAgICAgIHNlbGYuY2hhcnMgPSBzZWxmLmNoYXJzICsgY21kLmNoYXJzCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBhbHBoYW51bWVyaWMgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAiXyIKKworICAgIGRlZiBjbGFzc2lmeShzZWxmLCBjKToKKyAgICAgICAgaWYgYyBpbiBzZWxmLmFscGhhbnVtZXJpYzoKKyAgICAgICAgICAgIHJldHVybiAiYWxwaGFudW1lcmljIgorICAgICAgICBpZiBjID09ICJcbiI6CisgICAgICAgICAgICByZXR1cm4gIm5ld2xpbmUiCisgICAgICAgIHJldHVybiAicHVuY3R1YXRpb24iCisKKworY2xhc3MgRGVsZXRlQ29tbWFuZChDb21tYW5kKToKKworICAgICMgVW5kb2FibGUgZGVsZXRlIGNvbW1hbmQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgQ29tbWFuZC5fX2luaXRfXyhzZWxmLCBpbmRleDEsIGluZGV4MiwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBkbyhzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5tYXJrc19iZWZvcmUgPSBzZWxmLnNhdmVfbWFya3ModGV4dCkKKyAgICAgICAgc2VsZi5pbmRleDEgPSB0ZXh0LmluZGV4KHNlbGYuaW5kZXgxKQorICAgICAgICBpZiBzZWxmLmluZGV4MjoKKyAgICAgICAgICAgIHNlbGYuaW5kZXgyID0gdGV4dC5pbmRleChzZWxmLmluZGV4MikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW5kZXgyID0gdGV4dC5pbmRleChzZWxmLmluZGV4MSArICIgKzFjIikKKyAgICAgICAgaWYgdGV4dC5jb21wYXJlKHNlbGYuaW5kZXgyLCAiPiIsICJlbmQtMWMiKToKKyAgICAgICAgICAgICMgRG9uJ3QgZGVsZXRlIHRoZSBmaW5hbCBuZXdsaW5lCisgICAgICAgICAgICBzZWxmLmluZGV4MiA9IHRleHQuaW5kZXgoImVuZC0xYyIpCisgICAgICAgIHNlbGYuY2hhcnMgPSB0ZXh0LmdldChzZWxmLmluZGV4MSwgc2VsZi5pbmRleDIpCisgICAgICAgIHRleHQuZGVsZXRlKHNlbGYuaW5kZXgxLCBzZWxmLmluZGV4MikKKyAgICAgICAgc2VsZi5tYXJrc19hZnRlciA9IHNlbGYuc2F2ZV9tYXJrcyh0ZXh0KQorICAgICAgICAjI3N5cy5fX3N0ZGVycl9fLndyaXRlKCJkbzogJXNcbiIgJSBzZWxmKQorCisgICAgZGVmIHJlZG8oc2VsZiwgdGV4dCk6CisgICAgICAgIHRleHQubWFya19zZXQoJ2luc2VydCcsIHNlbGYuaW5kZXgxKQorICAgICAgICB0ZXh0LmRlbGV0ZShzZWxmLmluZGV4MSwgc2VsZi5pbmRleDIpCisgICAgICAgIHNlbGYuc2V0X21hcmtzKHRleHQsIHNlbGYubWFya3NfYWZ0ZXIpCisgICAgICAgIHRleHQuc2VlKCdpbnNlcnQnKQorICAgICAgICAjI3N5cy5fX3N0ZGVycl9fLndyaXRlKCJyZWRvOiAlc1xuIiAlIHNlbGYpCisKKyAgICBkZWYgdW5kbyhzZWxmLCB0ZXh0KToKKyAgICAgICAgdGV4dC5tYXJrX3NldCgnaW5zZXJ0Jywgc2VsZi5pbmRleDEpCisgICAgICAgIHRleHQuaW5zZXJ0KHNlbGYuaW5kZXgxLCBzZWxmLmNoYXJzKQorICAgICAgICBzZWxmLnNldF9tYXJrcyh0ZXh0LCBzZWxmLm1hcmtzX2JlZm9yZSkKKyAgICAgICAgdGV4dC5zZWUoJ2luc2VydCcpCisgICAgICAgICMjc3lzLl9fc3RkZXJyX18ud3JpdGUoInVuZG86ICVzXG4iICUgc2VsZikKKworY2xhc3MgQ29tbWFuZFNlcXVlbmNlKENvbW1hbmQpOgorCisgICAgIyBXcmFwcGVyIGZvciBhIHNlcXVlbmNlIG9mIHVuZG9hYmxlIGNtZHMgdG8gYmUgdW5kb25lL3JlZG9uZQorICAgICMgYXMgYSB1bml0CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY21kcyA9IFtdCisgICAgICAgIHNlbGYuZGVwdGggPSAwCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHMgPSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICBzdHJzID0gW10KKyAgICAgICAgZm9yIGNtZCBpbiBzZWxmLmNtZHM6CisgICAgICAgICAgICBzdHJzLmFwcGVuZCgiICAgICVyIiAlIChjbWQsKSkKKyAgICAgICAgcmV0dXJuIHMgKyAiKFxuIiArICIsXG4iLmpvaW4oc3RycykgKyAiXG4pIgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5jbWRzKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBjbWQpOgorICAgICAgICBzZWxmLmNtZHMuYXBwZW5kKGNtZCkKKworICAgIGRlZiBnZXRjbWQoc2VsZiwgaSk6CisgICAgICAgIHJldHVybiBzZWxmLmNtZHNbaV0KKworICAgIGRlZiByZWRvKHNlbGYsIHRleHQpOgorICAgICAgICBmb3IgY21kIGluIHNlbGYuY21kczoKKyAgICAgICAgICAgIGNtZC5yZWRvKHRleHQpCisKKyAgICBkZWYgdW5kbyhzZWxmLCB0ZXh0KToKKyAgICAgICAgY21kcyA9IHNlbGYuY21kc1s6XQorICAgICAgICBjbWRzLnJldmVyc2UoKQorICAgICAgICBmb3IgY21kIGluIGNtZHM6CisgICAgICAgICAgICBjbWQudW5kbyh0ZXh0KQorCisgICAgZGVmIGJ1bXBfZGVwdGgoc2VsZiwgaW5jcj0xKToKKyAgICAgICAgc2VsZi5kZXB0aCA9IHNlbGYuZGVwdGggKyBpbmNyCisgICAgICAgIHJldHVybiBzZWxmLmRlcHRoCisKK2RlZiBtYWluKCk6CisgICAgZnJvbSBpZGxlbGliLlBlcmNvbGF0b3IgaW1wb3J0IFBlcmNvbGF0b3IKKyAgICByb290ID0gVGsoKQorICAgIHJvb3Qud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCByb290LnF1aXQpCisgICAgdGV4dCA9IFRleHQoKQorICAgIHRleHQucGFjaygpCisgICAgdGV4dC5mb2N1c19zZXQoKQorICAgIHAgPSBQZXJjb2xhdG9yKHRleHQpCisgICAgZCA9IFVuZG9EZWxlZ2F0b3IoKQorICAgIHAuaW5zZXJ0ZmlsdGVyKGQpCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1MGVjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvVW5kb0RlbGVnYXRvci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI1MGVjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9VbmRvRGVsZWdhdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaWRnZXRSZWRpcmVjdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMzQxZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weQpAQCAtMCwwICsxLDEyNiBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2NsYXNzIFdpZGdldFJlZGlyZWN0b3I6CisKKyAgICAiIiJTdXBwb3J0IGZvciByZWRpcmVjdGluZyBhcmJpdHJhcnkgd2lkZ2V0IHN1YmNvbW1hbmRzLgorCisgICAgU29tZSBUayBvcGVyYXRpb25zIGRvbid0IG5vcm1hbGx5IHBhc3MgdGhyb3VnaCBUa2ludGVyLiAgRm9yIGV4YW1wbGUsIGlmIGEKKyAgICBjaGFyYWN0ZXIgaXMgaW5zZXJ0ZWQgaW50byBhIFRleHQgd2lkZ2V0IGJ5IHByZXNzaW5nIGEga2V5LCBhIGRlZmF1bHQgVGsKKyAgICBiaW5kaW5nIHRvIHRoZSB3aWRnZXQncyAnaW5zZXJ0JyBvcGVyYXRpb24gaXMgYWN0aXZhdGVkLCBhbmQgdGhlIFRrIGxpYnJhcnkKKyAgICBwcm9jZXNzZXMgdGhlIGluc2VydCB3aXRob3V0IGNhbGxpbmcgYmFjayBpbnRvIFRraW50ZXIuCisKKyAgICBBbHRob3VnaCBhIGJpbmRpbmcgdG8gPEtleT4gY291bGQgYmUgbWFkZSB2aWEgVGtpbnRlciwgd2hhdCB3ZSByZWFsbHkgd2FudAorICAgIHRvIGRvIGlzIHRvIGhvb2sgdGhlIFRrICdpbnNlcnQnIG9wZXJhdGlvbiBpdHNlbGYuCisKKyAgICBXaGVuIGEgd2lkZ2V0IGlzIGluc3RhbnRpYXRlZCwgYSBUY2wgY29tbWFuZCBpcyBjcmVhdGVkIHdob3NlIG5hbWUgaXMgdGhlCisgICAgc2FtZSBhcyB0aGUgcGF0aG5hbWUgd2lkZ2V0Ll93LiAgVGhpcyBjb21tYW5kIGlzIHVzZWQgdG8gaW52b2tlIHRoZSB2YXJpb3VzCisgICAgd2lkZ2V0IG9wZXJhdGlvbnMsIGUuZy4gaW5zZXJ0IChmb3IgYSBUZXh0IHdpZGdldCkuIFdlIGFyZSBnb2luZyB0byBob29rCisgICAgdGhpcyBjb21tYW5kIGFuZCBwcm92aWRlIGEgZmFjaWxpdHkgKCdyZWdpc3RlcicpIHRvIGludGVyY2VwdCB0aGUgd2lkZ2V0CisgICAgb3BlcmF0aW9uLgorCisgICAgSW4gSURMRSwgdGhlIGZ1bmN0aW9uIGJlaW5nIHJlZ2lzdGVyZWQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0b3Agb2YgYQorICAgIFBlcmNvbGF0b3IgY2hhaW4uICBBdCB0aGUgYm90dG9tIG9mIHRoZSBjaGFpbiBpcyBhIGNhbGwgdG8gdGhlIG9yaWdpbmFsCisgICAgVGsgd2lkZ2V0IG9wZXJhdGlvbi4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3aWRnZXQpOgorICAgICAgICBzZWxmLl9vcGVyYXRpb25zID0ge30KKyAgICAgICAgc2VsZi53aWRnZXQgPSB3aWRnZXQgICAgICAgICAgICAjIHdpZGdldCBpbnN0YW5jZQorICAgICAgICBzZWxmLnRrID0gdGsgPSB3aWRnZXQudGsgICAgICAgICMgd2lkZ2V0J3Mgcm9vdAorICAgICAgICB3ID0gd2lkZ2V0Ll93ICAgICAgICAgICAgICAgICAgICMgd2lkZ2V0J3MgKGZ1bGwpIFRrIHBhdGhuYW1lCisgICAgICAgIHNlbGYub3JpZyA9IHcgKyAiX29yaWciCisgICAgICAgICMgUmVuYW1lIHRoZSBUY2wgY29tbWFuZCB3aXRoaW4gVGNsOgorICAgICAgICB0ay5jYWxsKCJyZW5hbWUiLCB3LCBzZWxmLm9yaWcpCisgICAgICAgICMgQ3JlYXRlIGEgbmV3IFRjbCBjb21tYW5kIHdob3NlIG5hbWUgaXMgdGhlIHdpZGdldCdzIHBhdGhuYW1lLCBhbmQKKyAgICAgICAgIyB3aG9zZSBhY3Rpb24gaXMgdG8gZGlzcGF0Y2ggb24gdGhlIG9wZXJhdGlvbiBwYXNzZWQgdG8gdGhlIHdpZGdldDoKKyAgICAgICAgdGsuY3JlYXRlY29tbWFuZCh3LCBzZWxmLmRpc3BhdGNoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIldpZGdldFJlZGlyZWN0b3IoJXM8JXM+KSIgJSAoc2VsZi53aWRnZXQuX19jbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53aWRnZXQuX3cpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGZvciBvcGVyYXRpb24gaW4gbGlzdChzZWxmLl9vcGVyYXRpb25zKToKKyAgICAgICAgICAgIHNlbGYudW5yZWdpc3RlcihvcGVyYXRpb24pCisgICAgICAgIHdpZGdldCA9IHNlbGYud2lkZ2V0OyBkZWwgc2VsZi53aWRnZXQKKyAgICAgICAgb3JpZyA9IHNlbGYub3JpZzsgZGVsIHNlbGYub3JpZworICAgICAgICB0ayA9IHdpZGdldC50aworICAgICAgICB3ID0gd2lkZ2V0Ll93CisgICAgICAgIHRrLmRlbGV0ZWNvbW1hbmQodykKKyAgICAgICAgIyByZXN0b3JlIHRoZSBvcmlnaW5hbCB3aWRnZXQgVGNsIGNvbW1hbmQ6CisgICAgICAgIHRrLmNhbGwoInJlbmFtZSIsIG9yaWcsIHcpCisKKyAgICBkZWYgcmVnaXN0ZXIoc2VsZiwgb3BlcmF0aW9uLCBmdW5jdGlvbik6CisgICAgICAgIHNlbGYuX29wZXJhdGlvbnNbb3BlcmF0aW9uXSA9IGZ1bmN0aW9uCisgICAgICAgIHNldGF0dHIoc2VsZi53aWRnZXQsIG9wZXJhdGlvbiwgZnVuY3Rpb24pCisgICAgICAgIHJldHVybiBPcmlnaW5hbENvbW1hbmQoc2VsZiwgb3BlcmF0aW9uKQorCisgICAgZGVmIHVucmVnaXN0ZXIoc2VsZiwgb3BlcmF0aW9uKToKKyAgICAgICAgaWYgb3BlcmF0aW9uIGluIHNlbGYuX29wZXJhdGlvbnM6CisgICAgICAgICAgICBmdW5jdGlvbiA9IHNlbGYuX29wZXJhdGlvbnNbb3BlcmF0aW9uXQorICAgICAgICAgICAgZGVsIHNlbGYuX29wZXJhdGlvbnNbb3BlcmF0aW9uXQorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLndpZGdldCwgb3BlcmF0aW9uKToKKyAgICAgICAgICAgICAgICBkZWxhdHRyKHNlbGYud2lkZ2V0LCBvcGVyYXRpb24pCisgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgb3BlcmF0aW9uLCAqYXJncyk6CisgICAgICAgICcnJ0NhbGxiYWNrIGZyb20gVGNsIHdoaWNoIHJ1bnMgd2hlbiB0aGUgd2lkZ2V0IGlzIHJlZmVyZW5jZWQuCisKKyAgICAgICAgSWYgYW4gb3BlcmF0aW9uIGhhcyBiZWVuIHJlZ2lzdGVyZWQgaW4gc2VsZi5fb3BlcmF0aW9ucywgYXBwbHkgdGhlCisgICAgICAgIGFzc29jaWF0ZWQgZnVuY3Rpb24gdG8gdGhlIGFyZ3MgcGFzc2VkIGludG8gVGNsLiBPdGhlcndpc2UsIHBhc3MgdGhlCisgICAgICAgIG9wZXJhdGlvbiB0aHJvdWdoIHRvIFRrIHZpYSB0aGUgb3JpZ2luYWwgVGNsIGZ1bmN0aW9uLgorCisgICAgICAgIE5vdGUgdGhhdCBpZiBhIHJlZ2lzdGVyZWQgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgb3BlcmF0aW9uIGlzIG5vdAorICAgICAgICBwYXNzZWQgdGhyb3VnaCB0byBUay4gIEFwcGx5IHRoZSBmdW5jdGlvbiByZXR1cm5lZCBieSBzZWxmLnJlZ2lzdGVyKCkKKyAgICAgICAgdG8gKmFyZ3MgdG8gYWNjb21wbGlzaCB0aGF0LiAgRm9yIGFuIGV4YW1wbGUsIHNlZSBDb2xvckRlbGVnYXRvci5weS4KKworICAgICAgICAnJycKKyAgICAgICAgbSA9IHNlbGYuX29wZXJhdGlvbnMuZ2V0KG9wZXJhdGlvbikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICByZXR1cm4gbSgqYXJncykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoc2VsZi5vcmlnLCBvcGVyYXRpb24pICsgYXJncykKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKworY2xhc3MgT3JpZ2luYWxDb21tYW5kOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlZGlyLCBvcGVyYXRpb24pOgorICAgICAgICBzZWxmLnJlZGlyID0gcmVkaXIKKyAgICAgICAgc2VsZi5vcGVyYXRpb24gPSBvcGVyYXRpb24KKyAgICAgICAgc2VsZi50ayA9IHJlZGlyLnRrCisgICAgICAgIHNlbGYub3JpZyA9IHJlZGlyLm9yaWcKKyAgICAgICAgc2VsZi50a19jYWxsID0gc2VsZi50ay5jYWxsCisgICAgICAgIHNlbGYub3JpZ19hbmRfb3BlcmF0aW9uID0gKHNlbGYub3JpZywgc2VsZi5vcGVyYXRpb24pCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiT3JpZ2luYWxDb21tYW5kKCVyLCAlcikiICUgKHNlbGYucmVkaXIsIHNlbGYub3BlcmF0aW9uKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGtfY2FsbChzZWxmLm9yaWdfYW5kX29wZXJhdGlvbiArIGFyZ3MpCisKKworZGVmIG1haW4oKToKKyAgICByb290ID0gVGsoKQorICAgIHJvb3Qud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCByb290LnF1aXQpCisgICAgdGV4dCA9IFRleHQoKQorICAgIHRleHQucGFjaygpCisgICAgdGV4dC5mb2N1c19zZXQoKQorICAgIHJlZGlyID0gV2lkZ2V0UmVkaXJlY3Rvcih0ZXh0KQorICAgIGdsb2JhbCBwcmV2aW91c190Y2xfZmNuCisgICAgZGVmIG15X2luc2VydCgqYXJncyk6CisgICAgICAgIHByaW50ICJpbnNlcnQiLCBhcmdzCisgICAgICAgIHByZXZpb3VzX3RjbF9mY24oKmFyZ3MpCisgICAgcHJldmlvdXNfdGNsX2ZjbiA9IHJlZGlyLnJlZ2lzdGVyKCJpbnNlcnQiLCBteV9pbnNlcnQpCisgICAgcm9vdC5tYWlubG9vcCgpCisgICAgcmVkaXIudW5yZWdpc3RlcigiaW5zZXJ0IikgICMgcnVucyBhZnRlciBmaXJzdCAnY2xvc2Ugd2luZG93JworICAgIHJlZGlyLmNsb3NlKCkKKyAgICByb290Lm1haW5sb29wKCkKKyAgICByb290LmRlc3Ryb3koKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTM2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpZGdldFJlZGlyZWN0b3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NTM2OWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2lkZ2V0UmVkaXJlY3Rvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpbmRvd0xpc3QucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvV2luZG93TGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTg1MDJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpbmRvd0xpc3QucHkKQEAgLTAsMCArMSw5MCBAQAorZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2NsYXNzIFdpbmRvd0xpc3Q6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGljdCA9IHt9CisgICAgICAgIHNlbGYuY2FsbGJhY2tzID0gW10KKworICAgIGRlZiBhZGQoc2VsZiwgd2luZG93KToKKyAgICAgICAgd2luZG93LmFmdGVyX2lkbGUoc2VsZi5jYWxsX2NhbGxiYWNrcykKKyAgICAgICAgc2VsZi5kaWN0W3N0cih3aW5kb3cpXSA9IHdpbmRvdworCisgICAgZGVmIGRlbGV0ZShzZWxmLCB3aW5kb3cpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5kaWN0W3N0cih3aW5kb3cpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAjIFNvbWV0aW1lcywgZGVzdHJveSgpIGlzIGNhbGxlZCB0d2ljZQorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmNhbGxfY2FsbGJhY2tzKCkKKworICAgIGRlZiBhZGRfd2luZG93c190b19tZW51KHNlbGYsICBtZW51KToKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5kaWN0LmtleXMoKToKKyAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYuZGljdFtrZXldCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGl0bGUgPSB3aW5kb3cuZ2V0X3RpdGxlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbGlzdC5hcHBlbmQoKHRpdGxlLCB3aW5kb3cpKQorICAgICAgICBsaXN0LnNvcnQoKQorICAgICAgICBmb3IgdGl0bGUsIHdpbmRvdyBpbiBsaXN0OgorICAgICAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD10aXRsZSwgY29tbWFuZD13aW5kb3cud2FrZXVwKQorCisgICAgZGVmIHJlZ2lzdGVyX2NhbGxiYWNrKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgc2VsZi5jYWxsYmFja3MuYXBwZW5kKGNhbGxiYWNrKQorCisgICAgZGVmIHVucmVnaXN0ZXJfY2FsbGJhY2soc2VsZiwgY2FsbGJhY2spOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNhbGxiYWNrcy5yZW1vdmUoY2FsbGJhY2spCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNhbGxfY2FsbGJhY2tzKHNlbGYpOgorICAgICAgICBmb3IgY2FsbGJhY2sgaW4gc2VsZi5jYWxsYmFja3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2FsbGJhY2soKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHByaW50ICJ3YXJuaW5nOiBjYWxsYmFjayBmYWlsZWQgaW4gV2luZG93TGlzdCIsIFwKKyAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhjX3R5cGUsICI6Iiwgc3lzLmV4Y192YWx1ZQorCityZWdpc3RyeSA9IFdpbmRvd0xpc3QoKQorCithZGRfd2luZG93c190b19tZW51ID0gcmVnaXN0cnkuYWRkX3dpbmRvd3NfdG9fbWVudQorcmVnaXN0ZXJfY2FsbGJhY2sgPSByZWdpc3RyeS5yZWdpc3Rlcl9jYWxsYmFjawordW5yZWdpc3Rlcl9jYWxsYmFjayA9IHJlZ2lzdHJ5LnVucmVnaXN0ZXJfY2FsbGJhY2sKKworCitjbGFzcyBMaXN0ZWRUb3BsZXZlbChUb3BsZXZlbCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KToKKyAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgbWFzdGVyLCBrdykKKyAgICAgICAgcmVnaXN0cnkuYWRkKHNlbGYpCisgICAgICAgIHNlbGYuZm9jdXNlZF93aWRnZXQgPSBzZWxmCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgcmVnaXN0cnkuZGVsZXRlKHNlbGYpCisgICAgICAgIFRvcGxldmVsLmRlc3Ryb3koc2VsZikKKyAgICAgICAgIyBJZiB0aGlzIGlzIElkbGUncyBsYXN0IHdpbmRvdyB0aGVuIHF1aXQgdGhlIG1haW5sb29wCisgICAgICAgICMgKE5lZWRlZCBmb3IgY2xlYW4gZXhpdCBvbiBXaW5kb3dzIDk4KQorICAgICAgICBpZiBub3QgcmVnaXN0cnkuZGljdDoKKyAgICAgICAgICAgIHNlbGYucXVpdCgpCisKKyAgICBkZWYgdXBkYXRlX3dpbmRvd2xpc3RfcmVnaXN0cnkoc2VsZiwgd2luZG93KToKKyAgICAgICAgcmVnaXN0cnkuY2FsbF9jYWxsYmFja3MoKQorCisgICAgZGVmIGdldF90aXRsZShzZWxmKToKKyAgICAgICAgIyBTdWJjbGFzcyBjYW4gb3ZlcnJpZGUKKyAgICAgICAgcmV0dXJuIHNlbGYud21fdGl0bGUoKQorCisgICAgZGVmIHdha2V1cChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi53bV9zdGF0ZSgpID09ICJpY29uaWMiOgorICAgICAgICAgICAgICAgIHNlbGYud21fd2l0aGRyYXcoKQorICAgICAgICAgICAgICAgIHNlbGYud21fZGVpY29uaWZ5KCkKKyAgICAgICAgICAgIHNlbGYudGtyYWlzZSgpCisgICAgICAgICAgICBzZWxmLmZvY3VzZWRfd2lkZ2V0LmZvY3VzX3NldCgpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgICMgVGhpcyBjYW4gaGFwcGVuIHdoZW4gdGhlIHdpbmRvdyBtZW51IHdhcyB0b3JuIG9mZi4KKyAgICAgICAgICAgICMgU2ltcGx5IGlnbm9yZSBpdC4KKyAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDlmNzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpbmRvd0xpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9XaW5kb3dMaXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDlmNzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1dpbmRvd0xpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ab29tSGVpZ2h0LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1pvb21IZWlnaHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkMTcxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ab29tSGVpZ2h0LnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMgU2FtcGxlIGV4dGVuc2lvbjogem9vbSBhIHdpbmRvdyB0byBtYXhpbXVtIGhlaWdodAorCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKKworZnJvbSBpZGxlbGliIGltcG9ydCBtYWNvc3hTdXBwb3J0CisKK2NsYXNzIFpvb21IZWlnaHQ6CisKKyAgICBtZW51ZGVmcyA9IFsKKyAgICAgICAgKCd3aW5kb3dzJywgWworICAgICAgICAgICAgKCdfWm9vbSBIZWlnaHQnLCAnPDx6b29tLWhlaWdodD4+JyksCisgICAgICAgICBdKQorICAgIF0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlZGl0d2luKToKKyAgICAgICAgc2VsZi5lZGl0d2luID0gZWRpdHdpbgorCisgICAgZGVmIHpvb21faGVpZ2h0X2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgdG9wID0gc2VsZi5lZGl0d2luLnRvcAorICAgICAgICB6b29tX2hlaWdodCh0b3ApCisKK2RlZiB6b29tX2hlaWdodCh0b3ApOgorICAgIGdlb20gPSB0b3Aud21fZ2VvbWV0cnkoKQorICAgIG0gPSByZS5tYXRjaChyIihcZCspeChcZCspXCsoLT9cZCspXCsoLT9cZCspIiwgZ2VvbSkKKyAgICBpZiBub3QgbToKKyAgICAgICAgdG9wLmJlbGwoKQorICAgICAgICByZXR1cm4KKyAgICB3aWR0aCwgaGVpZ2h0LCB4LCB5ID0gbWFwKGludCwgbS5ncm91cHMoKSkKKyAgICBuZXdoZWlnaHQgPSB0b3Aud2luZm9fc2NyZWVuaGVpZ2h0KCkKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgbmV3eSA9IDAKKyAgICAgICAgbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gNzIKKworICAgIGVsaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgIyBUaGUgJzg4JyBiZWxvdyBpcyBhIG1hZ2ljIG51bWJlciB0aGF0IGF2b2lkcyBwbGFjaW5nIHRoZSBib3R0b20KKyAgICAgICAgIyBvZiB0aGUgd2luZG93IGJlbG93IHRoZSBwYW5lbCBvbiBteSBtYWNoaW5lLiBJIGRvbid0IGtub3cgaG93CisgICAgICAgICMgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZhbHVlIGZvciB0aGlzIHdpdGggdGtpbnRlci4KKyAgICAgICAgbmV3eSA9IDIyCisgICAgICAgIG5ld2hlaWdodCA9IG5ld2hlaWdodCAtIG5ld3kgLSA4OAorCisgICAgZWxzZToKKyAgICAgICAgI25ld3kgPSAyNAorICAgICAgICBuZXd5ID0gMAorICAgICAgICAjbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gOTYKKyAgICAgICAgbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gODgKKyAgICBpZiBoZWlnaHQgPj0gbmV3aGVpZ2h0OgorICAgICAgICBuZXdnZW9tID0gIiIKKyAgICBlbHNlOgorICAgICAgICBuZXdnZW9tID0gIiVkeCVkKyVkKyVkIiAlICh3aWR0aCwgbmV3aGVpZ2h0LCB4LCBuZXd5KQorICAgIHRvcC53bV9nZW9tZXRyeShuZXdnZW9tKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1pvb21IZWlnaHQucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1pvb21IZWlnaHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTEwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvWm9vbUhlaWdodC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL1pvb21IZWlnaHQucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL1pvb21IZWlnaHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTEwYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvWm9vbUhlaWdodC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhODNkZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBEdW1teSBmaWxlIHRvIG1ha2UgdGhpcyBhIHBhY2thZ2UuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI2NTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTI2NTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvYWJvdXREaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvYWJvdXREaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczNDUxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9hYm91dERpYWxvZy5weQpAQCAtMCwwICsxLDE0NSBAQAorIiIiQWJvdXQgRGlhbG9nIGZvciBJRExFCisKKyIiIgorCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2ltcG9ydCBvcworCitmcm9tIGlkbGVsaWIgaW1wb3J0IHRleHRWaWV3Citmcm9tIGlkbGVsaWIgaW1wb3J0IGlkbGV2ZXIKKworY2xhc3MgQWJvdXREaWFsb2coVG9wbGV2ZWwpOgorICAgICIiIk1vZGFsIGFib3V0IGRpYWxvZyBmb3IgaWRsZQorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYscGFyZW50LHRpdGxlKToKKyAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQorICAgICAgICBzZWxmLmdlb21ldHJ5KCIrJWQrJWQiICUgKHBhcmVudC53aW5mb19yb290eCgpKzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpKzMwKSkKKyAgICAgICAgc2VsZi5iZyA9ICIjNzA3MDcwIgorICAgICAgICBzZWxmLmZnID0gIiNmZmZmZmYiCisgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSwgd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLk9rKQorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLmJ1dHRvbk9rLmZvY3VzX3NldCgpCisgICAgICAgIHNlbGYuYmluZCgnPFJldHVybj4nLHNlbGYuT2spICNkaXNtaXNzIGRpYWxvZworICAgICAgICBzZWxmLmJpbmQoJzxFc2NhcGU+JyxzZWxmLk9rKSAjZGlzbWlzcyBkaWFsb2cKKyAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCisKKyAgICBkZWYgQ3JlYXRlV2lkZ2V0cyhzZWxmKToKKyAgICAgICAgZnJhbWVNYWluID0gRnJhbWUoc2VsZiwgYm9yZGVyd2lkdGg9MiwgcmVsaWVmPVNVTktFTikKKyAgICAgICAgZnJhbWVCdXR0b25zID0gRnJhbWUoc2VsZikKKyAgICAgICAgZnJhbWVCdXR0b25zLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKyAgICAgICAgZnJhbWVNYWluLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuYnV0dG9uT2sgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdDbG9zZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLk9rKQorICAgICAgICBzZWxmLmJ1dHRvbk9rLnBhY2socGFkeD01LCBwYWR5PTUpCisgICAgICAgICNzZWxmLnBpY3R1cmUgPSBJbWFnZSgncGhvdG8nLCBkYXRhPXNlbGYucGljdHVyZURhdGEpCisgICAgICAgIGZyYW1lQmcgPSBGcmFtZShmcmFtZU1haW4sIGJnPXNlbGYuYmcpCisgICAgICAgIGZyYW1lQmcucGFjayhleHBhbmQ9VFJVRSwgZmlsbD1CT1RIKQorICAgICAgICBsYWJlbFRpdGxlID0gTGFiZWwoZnJhbWVCZywgdGV4dD0nSURMRScsIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250PSgnY291cmllcicsIDI0LCAnYm9sZCcpKQorICAgICAgICBsYWJlbFRpdGxlLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9VywgcGFkeD0xMCwgcGFkeT0xMCkKKyAgICAgICAgI2xhYmVsUGljdHVyZSA9IExhYmVsKGZyYW1lQmcsIHRleHQ9J1twaWN0dXJlXScpCisgICAgICAgICNpbWFnZT1zZWxmLnBpY3R1cmUsIGJnPXNlbGYuYmcpCisgICAgICAgICNsYWJlbFBpY3R1cmUuZ3JpZChyb3c9MSwgY29sdW1uPTEsIHN0aWNreT1XLCByb3dzcGFuPTIsCisgICAgICAgICMgICAgICAgICAgICAgICAgICBwYWR4PTAsIHBhZHk9MykKKyAgICAgICAgYnlsaW5lID0gIlB5dGhvbidzIEludGVncmF0ZWQgRGV2ZUxvcG1lbnQgRW52aXJvbm1lbnQiICsgNSonXG4nCisgICAgICAgIGxhYmVsRGVzYyA9IExhYmVsKGZyYW1lQmcsIHRleHQ9YnlsaW5lLCBqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCisgICAgICAgIGxhYmVsRGVzYy5ncmlkKHJvdz0yLCBjb2x1bW49MCwgc3RpY2t5PVcsIGNvbHVtbnNwYW49MywgcGFkeD0xMCwgcGFkeT01KQorICAgICAgICBsYWJlbEVtYWlsID0gTGFiZWwoZnJhbWVCZywgdGV4dD0nZW1haWw6ICBpZGxlLWRldkBweXRob24ub3JnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnk9TEVGVCwgZmc9c2VsZi5mZywgYmc9c2VsZi5iZykKKyAgICAgICAgbGFiZWxFbWFpbC5ncmlkKHJvdz02LCBjb2x1bW49MCwgY29sdW1uc3Bhbj0yLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RpY2t5PVcsIHBhZHg9MTAsIHBhZHk9MCkKKyAgICAgICAgbGFiZWxXV1cgPSBMYWJlbChmcmFtZUJnLCB0ZXh0PSd3d3c6ICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvaWRsZS8nLAorICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3RpZnk9TEVGVCwgZmc9c2VsZi5mZywgYmc9c2VsZi5iZykKKyAgICAgICAgbGFiZWxXV1cuZ3JpZChyb3c9NywgY29sdW1uPTAsIGNvbHVtbnNwYW49Miwgc3RpY2t5PVcsIHBhZHg9MTAsIHBhZHk9MCkKKyAgICAgICAgRnJhbWUoZnJhbWVCZywgYm9yZGVyd2lkdGg9MSwgcmVsaWVmPVNVTktFTiwKKyAgICAgICAgICAgICAgaGVpZ2h0PTIsIGJnPXNlbGYuYmcpLmdyaWQocm93PTgsIGNvbHVtbj0wLCBzdGlja3k9RVcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbnNwYW49MywgcGFkeD01LCBwYWR5PTUpCisgICAgICAgIGxhYmVsUHl0aG9uVmVyID0gTGFiZWwoZnJhbWVCZywgdGV4dD0nUHl0aG9uIHZlcnNpb246ICAnICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy52ZXJzaW9uLnNwbGl0KClbMF0sIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCisgICAgICAgIGxhYmVsUHl0aG9uVmVyLmdyaWQocm93PTksIGNvbHVtbj0wLCBzdGlja3k9VywgcGFkeD0xMCwgcGFkeT0wKQorICAgICAgICB0a1ZlciA9IHNlbGYudGsuY2FsbCgnaW5mbycsICdwYXRjaGxldmVsJykKKyAgICAgICAgbGFiZWxUa1ZlciA9IExhYmVsKGZyYW1lQmcsIHRleHQ9J1RrIHZlcnNpb246ICAnKworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGtWZXIsIGZnPXNlbGYuZmcsIGJnPXNlbGYuYmcpCisgICAgICAgIGxhYmVsVGtWZXIuZ3JpZChyb3c9OSwgY29sdW1uPTEsIHN0aWNreT1XLCBwYWR4PTIsIHBhZHk9MCkKKyAgICAgICAgcHlfYnV0dG9uX2YgPSBGcmFtZShmcmFtZUJnLCBiZz1zZWxmLmJnKQorICAgICAgICBweV9idXR0b25fZi5ncmlkKHJvdz0xMCwgY29sdW1uPTAsIGNvbHVtbnNwYW49Miwgc3RpY2t5PU5TRVcpCisgICAgICAgIGJ1dHRvbkxpY2Vuc2UgPSBCdXR0b24ocHlfYnV0dG9uX2YsIHRleHQ9J0xpY2Vuc2UnLCB3aWR0aD04LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQ9c2VsZi5iZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuU2hvd0xpY2Vuc2UpCisgICAgICAgIGJ1dHRvbkxpY2Vuc2UucGFjayhzaWRlPUxFRlQsIHBhZHg9MTAsIHBhZHk9MTApCisgICAgICAgIGJ1dHRvbkNvcHlyaWdodCA9IEJ1dHRvbihweV9idXR0b25fZiwgdGV4dD0nQ29weXJpZ2h0Jywgd2lkdGg9OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQ9c2VsZi5iZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5TaG93Q29weXJpZ2h0KQorICAgICAgICBidXR0b25Db3B5cmlnaHQucGFjayhzaWRlPUxFRlQsIHBhZHg9MTAsIHBhZHk9MTApCisgICAgICAgIGJ1dHRvbkNyZWRpdHMgPSBCdXR0b24ocHlfYnV0dG9uX2YsIHRleHQ9J0NyZWRpdHMnLCB3aWR0aD04LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQ9c2VsZi5iZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuU2hvd1B5dGhvbkNyZWRpdHMpCisgICAgICAgIGJ1dHRvbkNyZWRpdHMucGFjayhzaWRlPUxFRlQsIHBhZHg9MTAsIHBhZHk9MTApCisgICAgICAgIEZyYW1lKGZyYW1lQmcsIGJvcmRlcndpZHRoPTEsIHJlbGllZj1TVU5LRU4sCisgICAgICAgICAgICAgIGhlaWdodD0yLCBiZz1zZWxmLmJnKS5ncmlkKHJvdz0xMSwgY29sdW1uPTAsIHN0aWNreT1FVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uc3Bhbj0zLCBwYWR4PTUsIHBhZHk9NSkKKyAgICAgICAgaWRsZV92ID0gTGFiZWwoZnJhbWVCZywgdGV4dD0nSURMRSB2ZXJzaW9uOiAgICcgKyBpZGxldmVyLklETEVfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmc9c2VsZi5mZywgYmc9c2VsZi5iZykKKyAgICAgICAgaWRsZV92LmdyaWQocm93PTEyLCBjb2x1bW49MCwgc3RpY2t5PVcsIHBhZHg9MTAsIHBhZHk9MCkKKyAgICAgICAgaWRsZV9idXR0b25fZiA9IEZyYW1lKGZyYW1lQmcsIGJnPXNlbGYuYmcpCisgICAgICAgIGlkbGVfYnV0dG9uX2YuZ3JpZChyb3c9MTMsIGNvbHVtbj0wLCBjb2x1bW5zcGFuPTMsIHN0aWNreT1OU0VXKQorICAgICAgICBpZGxlX2Fib3V0X2IgPSBCdXR0b24oaWRsZV9idXR0b25fZiwgdGV4dD0nUkVBRE1FJywgd2lkdGg9OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0YmFja2dyb3VuZD1zZWxmLmJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuU2hvd0lETEVBYm91dCkKKyAgICAgICAgaWRsZV9hYm91dF9iLnBhY2soc2lkZT1MRUZULCBwYWR4PTEwLCBwYWR5PTEwKQorICAgICAgICBpZGxlX25ld3NfYiA9IEJ1dHRvbihpZGxlX2J1dHRvbl9mLCB0ZXh0PSdORVdTJywgd2lkdGg9OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0YmFja2dyb3VuZD1zZWxmLmJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuU2hvd0lETEVORVdTKQorICAgICAgICBpZGxlX25ld3NfYi5wYWNrKHNpZGU9TEVGVCwgcGFkeD0xMCwgcGFkeT0xMCkKKyAgICAgICAgaWRsZV9jcmVkaXRzX2IgPSBCdXR0b24oaWRsZV9idXR0b25fZiwgdGV4dD0nQ3JlZGl0cycsIHdpZHRoPTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQ9c2VsZi5iZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLlNob3dJRExFQ3JlZGl0cykKKyAgICAgICAgaWRsZV9jcmVkaXRzX2IucGFjayhzaWRlPUxFRlQsIHBhZHg9MTAsIHBhZHk9MTApCisKKyAgICBkZWYgU2hvd0xpY2Vuc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZGlzcGxheV9wcmludGVyX3RleHQoJ0Fib3V0IC0gTGljZW5zZScsIGxpY2Vuc2UpCisKKyAgICBkZWYgU2hvd0NvcHlyaWdodChzZWxmKToKKyAgICAgICAgc2VsZi5kaXNwbGF5X3ByaW50ZXJfdGV4dCgnQWJvdXQgLSBDb3B5cmlnaHQnLCBjb3B5cmlnaHQpCisKKyAgICBkZWYgU2hvd1B5dGhvbkNyZWRpdHMoc2VsZik6CisgICAgICAgIHNlbGYuZGlzcGxheV9wcmludGVyX3RleHQoJ0Fib3V0IC0gUHl0aG9uIENyZWRpdHMnLCBjcmVkaXRzKQorCisgICAgZGVmIFNob3dJRExFQ3JlZGl0cyhzZWxmKToKKyAgICAgICAgc2VsZi5kaXNwbGF5X2ZpbGVfdGV4dCgnQWJvdXQgLSBDcmVkaXRzJywgJ0NSRURJVFMudHh0JywgJ2lzby04ODU5LTEnKQorCisgICAgZGVmIFNob3dJRExFQWJvdXQoc2VsZik6CisgICAgICAgIHNlbGYuZGlzcGxheV9maWxlX3RleHQoJ0Fib3V0IC0gUmVhZG1lJywgJ1JFQURNRS50eHQnKQorCisgICAgZGVmIFNob3dJRExFTkVXUyhzZWxmKToKKyAgICAgICAgc2VsZi5kaXNwbGF5X2ZpbGVfdGV4dCgnQWJvdXQgLSBORVdTJywgJ05FV1MudHh0JykKKworICAgIGRlZiBkaXNwbGF5X3ByaW50ZXJfdGV4dChzZWxmLCB0aXRsZSwgcHJpbnRlcik6CisgICAgICAgIHByaW50ZXIuX1ByaW50ZXJfX3NldHVwKCkKKyAgICAgICAgdGV4dCA9ICdcbicuam9pbihwcmludGVyLl9QcmludGVyX19saW5lcykKKyAgICAgICAgdGV4dFZpZXcudmlld190ZXh0KHNlbGYsIHRpdGxlLCB0ZXh0KQorCisgICAgZGVmIGRpc3BsYXlfZmlsZV90ZXh0KHNlbGYsIHRpdGxlLCBmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSwgZmlsZW5hbWUpCisgICAgICAgIHRleHRWaWV3LnZpZXdfZmlsZShzZWxmLCB0aXRsZSwgZm4sIGVuY29kaW5nKQorCisgICAgZGVmIE9rKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLmRlc3Ryb3koKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgdGVzdCB0aGUgZGlhbG9nCisgICAgcm9vdCA9IFRrKCkKKyAgICBkZWYgcnVuKCk6CisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgYWJvdXREaWFsb2cKKyAgICAgICAgYWJvdXREaWFsb2cuQWJvdXREaWFsb2cocm9vdCwgJ0Fib3V0JykKKyAgICBCdXR0b24ocm9vdCwgdGV4dD0nRGlhbG9nJywgY29tbWFuZD1ydW4pLnBhY2soKQorICAgIHJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2Fib3V0RGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9hYm91dERpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxMWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9hYm91dERpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2Fib3V0RGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9hYm91dERpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxMWRhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9hYm91dERpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZy1leHRlbnNpb25zLmRlZiBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWctZXh0ZW5zaW9ucy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNjljZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWctZXh0ZW5zaW9ucy5kZWYKQEAgLTAsMCArMSw5NiBAQAorIyBjb25maWctZXh0ZW5zaW9ucy5kZWYKKyMKKyMgSURMRSByZWFkcyBzZXZlcmFsIGNvbmZpZyBmaWxlcyB0byBkZXRlcm1pbmUgdXNlciBwcmVmZXJlbmNlcy4gIFRoaXMKKyMgZmlsZSBpcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIElETEUgZXh0ZW5zaW9ucyBzZXR0aW5ncy4KKyMKKyMgRWFjaCBleHRlbnNpb24gbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBzZWN0aW9uLCBuYW1lZCBhZnRlciB0aGUgZXh0ZW5zaW9uCisjIG1vZHVsZS4gVGhpcyBzZWN0aW9uIG11c3QgY29udGFpbiBhbiAnZW5hYmxlJyBpdGVtICg9MSB0byBlbmFibGUgdGhlCisjIGV4dGVuc2lvbiwgPTAgdG8gZGlzYWJsZSBpdCksIGl0IG1heSBjb250YWluICdlbmFibGVfZWRpdG9yJyBvciAnZW5hYmxlX3NoZWxsJworIyBpdGVtcywgdG8gYXBwbHkgaXQgb25seSB0byBlZGl0b3Ivc2hlbGwgd2luZG93cywgYW5kIG1heSBhbHNvIGNvbnRhaW4gYW55CisjIG90aGVyIGdlbmVyYWwgY29uZmlndXJhdGlvbiBpdGVtcyBmb3IgdGhlIGV4dGVuc2lvbi4KKyMKKyMgRWFjaCBleHRlbnNpb24gbXVzdCBkZWZpbmUgYXQgbGVhc3Qgb25lIHNlY3Rpb24gbmFtZWQgRXh0ZW5zaW9uTmFtZV9iaW5kaW5ncworIyBvciBFeHRlbnNpb25OYW1lX2NmZ0JpbmRpbmdzLiBJZiBwcmVzZW50LCBFeHRlbnNpb25OYW1lX2JpbmRpbmdzIGRlZmluZXMKKyMgdmlydHVhbCBldmVudCBiaW5kaW5ncyBmb3IgdGhlIGV4dGVuc2lvbiB0aGF0IGFyZSBub3QgdXNlciByZS1jb25maWd1cmFibGUuCisjIElmIHByZXNlbnQsIEV4dGVuc2lvbk5hbWVfY2ZnQmluZGluZ3MgZGVmaW5lcyB2aXJ0dWFsIGV2ZW50IGJpbmRpbmdzIGZvciB0aGUKKyMgZXh0ZW5zaW9uIHRoYXQgbWF5IGJlIHNlbnNpYmx5IHJlLWNvbmZpZ3VyZWQuCisjCisjIElmIHRoZXJlIGFyZSBubyBrZXliaW5kaW5ncyBmb3IgYSBtZW51cycgdmlydHVhbCBldmVudHMsIGluY2x1ZGUgbGluZXMgbGlrZQorIyA8PHRvZ2dsZS1jb2RlLWNvbnRleHQ+Pj0gICAoU2VlIFtDb2RlQ29udGV4dF0sIGJlbG93LikKKyMKKyMgQ3VycmVudGx5IGl0IGlzIG5lY2Vzc2FyeSB0byBtYW51YWxseSBtb2RpZnkgdGhpcyBmaWxlIHRvIGNoYW5nZSBleHRlbnNpb24KKyMga2V5IGJpbmRpbmdzIGFuZCBkZWZhdWx0IHZhbHVlcy4gVG8gY3VzdG9taXplLCBjcmVhdGUKKyMgfi8uaWRsZXJjL2NvbmZpZy1leHRlbnNpb25zLmNmZyBhbmQgYXBwZW5kIHRoZSBhcHByb3ByaWF0ZSBjdXN0b21pemVkCisjIHNlY3Rpb24ocykuICBUaG9zZSBzZWN0aW9ucyB3aWxsIG92ZXJyaWRlIHRoZSBkZWZhdWx0cyBpbiB0aGlzIGZpbGUuCisjCisjIE5vdGU6IElmIGEga2V5YmluZGluZyBpcyBhbHJlYWR5IGluIHVzZSB3aGVuIHRoZSBleHRlbnNpb24gaXMKKyMgbG9hZGVkLCB0aGUgZXh0ZW5zaW9uJ3MgdmlydHVhbCBldmVudCdzIGtleWJpbmRpbmcgd2lsbCBiZSBzZXQgdG8gJycuCisjCisjIFNlZSBjb25maWcta2V5cy5kZWYgZm9yIG5vdGVzIG9uIHNwZWNpZnlpbmcga2V5cyBhbmQgZXh0ZW5kLnR4dCBmb3IKKyMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgSURMRSBleHRlbnNpb25zLgorCitbRm9ybWF0UGFyYWdyYXBoXQorZW5hYmxlPTEKK1tGb3JtYXRQYXJhZ3JhcGhfY2ZnQmluZGluZ3NdCitmb3JtYXQtcGFyYWdyYXBoPTxBbHQtS2V5LXE+CisKK1tBdXRvRXhwYW5kXQorZW5hYmxlPTEKK1tBdXRvRXhwYW5kX2NmZ0JpbmRpbmdzXQorZXhwYW5kLXdvcmQ9PEFsdC1LZXktc2xhc2g+CisKK1tab29tSGVpZ2h0XQorZW5hYmxlPTEKK1tab29tSGVpZ2h0X2NmZ0JpbmRpbmdzXQorem9vbS1oZWlnaHQ9PEFsdC1LZXktMj4KKworW1NjcmlwdEJpbmRpbmddCitlbmFibGU9MQorZW5hYmxlX3NoZWxsPTAKK2VuYWJsZV9lZGl0b3I9MQorW1NjcmlwdEJpbmRpbmdfY2ZnQmluZGluZ3NdCitydW4tbW9kdWxlPTxLZXktRjU+CitjaGVjay1tb2R1bGU9PEFsdC1LZXkteD4KKworW0NhbGxUaXBzXQorZW5hYmxlPTEKK1tDYWxsVGlwc19jZmdCaW5kaW5nc10KK2ZvcmNlLW9wZW4tY2FsbHRpcD08Q29udHJvbC1LZXktYmFja3NsYXNoPgorW0NhbGxUaXBzX2JpbmRpbmdzXQordHJ5LW9wZW4tY2FsbHRpcD08S2V5UmVsZWFzZS1wYXJlbmxlZnQ+CityZWZyZXNoLWNhbGx0aXA9PEtleVJlbGVhc2UtcGFyZW5yaWdodD4gPEtleVJlbGVhc2UtMD4KKworW1BhcmVuTWF0Y2hdCitlbmFibGU9MQorc3R5bGU9IGV4cHJlc3Npb24KK2ZsYXNoLWRlbGF5PSA1MDAKK2JlbGw9IDEKK1tQYXJlbk1hdGNoX2NmZ0JpbmRpbmdzXQorZmxhc2gtcGFyZW49PENvbnRyb2wtS2V5LTA+CitbUGFyZW5NYXRjaF9iaW5kaW5nc10KK3BhcmVuLWNsb3NlZD08S2V5UmVsZWFzZS1wYXJlbnJpZ2h0PiA8S2V5UmVsZWFzZS1icmFja2V0cmlnaHQ+IDxLZXlSZWxlYXNlLWJyYWNlcmlnaHQ+CisKK1tBdXRvQ29tcGxldGVdCitlbmFibGU9MQorcG9wdXB3YWl0PTIwMDAKK1tBdXRvQ29tcGxldGVfY2ZnQmluZGluZ3NdCitmb3JjZS1vcGVuLWNvbXBsZXRpb25zPTxDb250cm9sLUtleS1zcGFjZT4KK1tBdXRvQ29tcGxldGVfYmluZGluZ3NdCithdXRvY29tcGxldGU9PEtleS1UYWI+Cit0cnktb3Blbi1jb21wbGV0aW9ucz08S2V5UmVsZWFzZS1wZXJpb2Q+IDxLZXlSZWxlYXNlLXNsYXNoPiA8S2V5UmVsZWFzZS1iYWNrc2xhc2g+CisKK1tDb2RlQ29udGV4dF0KK2VuYWJsZT0xCitlbmFibGVfc2hlbGw9MAorbnVtbGluZXM9MwordmlzaWJsZT0wCitiZ2NvbG9yPUxpZ2h0R3JheQorZmdjb2xvcj1CbGFjaworW0NvZGVDb250ZXh0X2JpbmRpbmdzXQordG9nZ2xlLWNvZGUtY29udGV4dD0KKworW1JzdHJpcEV4dGVuc2lvbl0KK2VuYWJsZT0xCitlbmFibGVfc2hlbGw9MAorZW5hYmxlX2VkaXRvcj0xCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWctaGlnaGxpZ2h0LmRlZiBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWctaGlnaGxpZ2h0LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDIwZjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZy1oaWdobGlnaHQuZGVmCkBAIC0wLDAgKzEsNjQgQEAKKyMgSURMRSByZWFkcyBzZXZlcmFsIGNvbmZpZyBmaWxlcyB0byBkZXRlcm1pbmUgdXNlciBwcmVmZXJlbmNlcy4gIFRoaXMKKyMgZmlsZSBpcyB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSBmb3IgaWRsZSBoaWdobGlnaHQgdGhlbWUgc2V0dGluZ3MuCisKK1tJRExFIENsYXNzaWNdCitub3JtYWwtZm9yZWdyb3VuZD0gIzAwMDAwMAorbm9ybWFsLWJhY2tncm91bmQ9ICNmZmZmZmYKK2tleXdvcmQtZm9yZWdyb3VuZD0gI2ZmNzcwMAora2V5d29yZC1iYWNrZ3JvdW5kPSAjZmZmZmZmCitidWlsdGluLWZvcmVncm91bmQ9ICM5MDAwOTAKK2J1aWx0aW4tYmFja2dyb3VuZD0gI2ZmZmZmZgorY29tbWVudC1mb3JlZ3JvdW5kPSAjZGQwMDAwCitjb21tZW50LWJhY2tncm91bmQ9ICNmZmZmZmYKK3N0cmluZy1mb3JlZ3JvdW5kPSAjMDBhYTAwCitzdHJpbmctYmFja2dyb3VuZD0gI2ZmZmZmZgorZGVmaW5pdGlvbi1mb3JlZ3JvdW5kPSAjMDAwMGZmCitkZWZpbml0aW9uLWJhY2tncm91bmQ9ICNmZmZmZmYKK2hpbGl0ZS1mb3JlZ3JvdW5kPSAjMDAwMDAwCitoaWxpdGUtYmFja2dyb3VuZD0gZ3JheQorYnJlYWstZm9yZWdyb3VuZD0gYmxhY2sKK2JyZWFrLWJhY2tncm91bmQ9ICNmZmZmNTUKK2hpdC1mb3JlZ3JvdW5kPSAjZmZmZmZmCitoaXQtYmFja2dyb3VuZD0gIzAwMDAwMAorZXJyb3ItZm9yZWdyb3VuZD0gIzAwMDAwMAorZXJyb3ItYmFja2dyb3VuZD0gI2ZmNzc3NworI2N1cnNvciAob25seSBmb3JlZ3JvdW5kIGNhbiBiZSBzZXQsIHJlc3RhcnQgSURMRSkKK2N1cnNvci1mb3JlZ3JvdW5kPSBibGFjaworI3NoZWxsIHdpbmRvdworc3Rkb3V0LWZvcmVncm91bmQ9IGJsdWUKK3N0ZG91dC1iYWNrZ3JvdW5kPSAjZmZmZmZmCitzdGRlcnItZm9yZWdyb3VuZD0gcmVkCitzdGRlcnItYmFja2dyb3VuZD0gI2ZmZmZmZgorY29uc29sZS1mb3JlZ3JvdW5kPSAjNzcwMDAwCitjb25zb2xlLWJhY2tncm91bmQ9ICNmZmZmZmYKKworW0lETEUgTmV3XQorbm9ybWFsLWZvcmVncm91bmQ9ICMwMDAwMDAKK25vcm1hbC1iYWNrZ3JvdW5kPSAjZmZmZmZmCitrZXl3b3JkLWZvcmVncm91bmQ9ICNmZjc3MDAKK2tleXdvcmQtYmFja2dyb3VuZD0gI2ZmZmZmZgorYnVpbHRpbi1mb3JlZ3JvdW5kPSAjOTAwMDkwCitidWlsdGluLWJhY2tncm91bmQ9ICNmZmZmZmYKK2NvbW1lbnQtZm9yZWdyb3VuZD0gI2RkMDAwMAorY29tbWVudC1iYWNrZ3JvdW5kPSAjZmZmZmZmCitzdHJpbmctZm9yZWdyb3VuZD0gIzAwYWEwMAorc3RyaW5nLWJhY2tncm91bmQ9ICNmZmZmZmYKK2RlZmluaXRpb24tZm9yZWdyb3VuZD0gIzAwMDBmZgorZGVmaW5pdGlvbi1iYWNrZ3JvdW5kPSAjZmZmZmZmCitoaWxpdGUtZm9yZWdyb3VuZD0gIzAwMDAwMAoraGlsaXRlLWJhY2tncm91bmQ9IGdyYXkKK2JyZWFrLWZvcmVncm91bmQ9IGJsYWNrCiticmVhay1iYWNrZ3JvdW5kPSAjZmZmZjU1CitoaXQtZm9yZWdyb3VuZD0gI2ZmZmZmZgoraGl0LWJhY2tncm91bmQ9ICMwMDAwMDAKK2Vycm9yLWZvcmVncm91bmQ9ICMwMDAwMDAKK2Vycm9yLWJhY2tncm91bmQ9ICNmZjc3NzcKKyNjdXJzb3IgKG9ubHkgZm9yZWdyb3VuZCBjYW4gYmUgc2V0LCByZXN0YXJ0IElETEUpCitjdXJzb3ItZm9yZWdyb3VuZD0gYmxhY2sKKyNzaGVsbCB3aW5kb3cKK3N0ZG91dC1mb3JlZ3JvdW5kPSBibHVlCitzdGRvdXQtYmFja2dyb3VuZD0gI2ZmZmZmZgorc3RkZXJyLWZvcmVncm91bmQ9IHJlZAorc3RkZXJyLWJhY2tncm91bmQ9ICNmZmZmZmYKK2NvbnNvbGUtZm9yZWdyb3VuZD0gIzc3MDAwMAorY29uc29sZS1iYWNrZ3JvdW5kPSAjZmZmZmZmCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLWtleXMuZGVmIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGMzNWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgpAQCAtMCwwICsxLDIxNCBAQAorIyBJRExFIHJlYWRzIHNldmVyYWwgY29uZmlnIGZpbGVzIHRvIGRldGVybWluZSB1c2VyIHByZWZlcmVuY2VzLiAgVGhpcworIyBmaWxlIGlzIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlIGZvciBpZGxlIGtleSBiaW5kaW5nIHNldHRpbmdzLgorIyBXaGVyZSBtdWx0aXBsZSBrZXlzIGFyZSBzcGVjaWZpZWQgZm9yIGFuIGFjdGlvbjogaWYgdGhleSBhcmUgc2VwYXJhdGVkCisjIGJ5IGEgc3BhY2UgKGVnLiBhY3Rpb249PGtleTE+IDxrZXkyPikgdGhlbiB0aGUga2V5cyBhcmUgYWx0ZXJuYXRpdmVzLCBpZgorIyB0aGVyZSBpcyBubyBzcGFjZSAoZWcuIGFjdGlvbj08a2V5MT48a2V5Mj4pIHRoZW4gdGhlIGtleXMgY29tcHJpc2UgYQorIyBzaW5nbGUgJ2VtYWNzIHN0eWxlJyBtdWx0aS1rZXlzdG9rZSBiaW5kaW5nLiBUaGUgdGsgZXZlbnQgc3BlY2lmaWVyICdLZXknCisjIGlzIHVzZWQgaW4gYWxsIGNhc2VzLCBmb3IgY29uc2lzdGVuY3kgaW4gYXV0byBrZXkgY29uZmxpY3QgY2hlY2tpbmcgaW4gdGhlCisjIGNvbmZpZ3VyYXRpb24gZ3VpLgorCitbSURMRSBDbGFzc2ljIFdpbmRvd3NdCitjb3B5PTxDb250cm9sLUtleS1jPiA8Q29udHJvbC1LZXktQz4KK2N1dD08Q29udHJvbC1LZXkteD4gPENvbnRyb2wtS2V5LVg+CitwYXN0ZT08Q29udHJvbC1LZXktdj4gPENvbnRyb2wtS2V5LVY+CitiZWdpbm5pbmctb2YtbGluZT0gPEtleS1Ib21lPgorY2VudGVyLWluc2VydD08Q29udHJvbC1LZXktbD4gPENvbnRyb2wtS2V5LUw+CitjbG9zZS1hbGwtd2luZG93cz08Q29udHJvbC1LZXktcT4KK2Nsb3NlLXdpbmRvdz08QWx0LUtleS1GND4gPE1ldGEtS2V5LUY0PgorZG8tbm90aGluZz08Q29udHJvbC1LZXktRjEyPgorZW5kLW9mLWZpbGU9PENvbnRyb2wtS2V5LWQ+IDxDb250cm9sLUtleS1EPgorcHl0aG9uLWRvY3M9PEtleS1GMT4KK3B5dGhvbi1jb250ZXh0LWhlbHA9PFNoaWZ0LUtleS1GMT4KK2hpc3RvcnktbmV4dD08QWx0LUtleS1uPiA8TWV0YS1LZXktbj4KK2hpc3RvcnktcHJldmlvdXM9PEFsdC1LZXktcD4gPE1ldGEtS2V5LXA+CitpbnRlcnJ1cHQtZXhlY3V0aW9uPTxDb250cm9sLUtleS1jPiA8Q29udHJvbC1LZXktQz4KK3ZpZXctcmVzdGFydD08S2V5LUY2PgorcmVzdGFydC1zaGVsbD08Q29udHJvbC1LZXktRjY+CitvcGVuLWNsYXNzLWJyb3dzZXI9PEFsdC1LZXktYz4gPE1ldGEtS2V5LWM+IDxBbHQtS2V5LUM+CitvcGVuLW1vZHVsZT08QWx0LUtleS1tPiA8TWV0YS1LZXktbT4gPEFsdC1LZXktTT4KK29wZW4tbmV3LXdpbmRvdz08Q29udHJvbC1LZXktbj4gPENvbnRyb2wtS2V5LU4+CitvcGVuLXdpbmRvdy1mcm9tLWZpbGU9PENvbnRyb2wtS2V5LW8+IDxDb250cm9sLUtleS1PPgorcGxhaW4tbmV3bGluZS1hbmQtaW5kZW50PTxDb250cm9sLUtleS1qPiA8Q29udHJvbC1LZXktSj4KK3ByaW50LXdpbmRvdz08Q29udHJvbC1LZXktcD4gPENvbnRyb2wtS2V5LVA+CityZWRvPTxDb250cm9sLVNoaWZ0LUtleS1aPgorcmVtb3ZlLXNlbGVjdGlvbj08S2V5LUVzY2FwZT4KK3NhdmUtY29weS1vZi13aW5kb3ctYXMtZmlsZT08QWx0LVNoaWZ0LUtleS1TPgorc2F2ZS13aW5kb3ctYXMtZmlsZT08Q29udHJvbC1TaGlmdC1LZXktUz4KK3NhdmUtd2luZG93PTxDb250cm9sLUtleS1zPgorc2VsZWN0LWFsbD08Q29udHJvbC1LZXktYT4KK3RvZ2dsZS1hdXRvLWNvbG9yaW5nPTxDb250cm9sLUtleS1zbGFzaD4KK3VuZG89PENvbnRyb2wtS2V5LXo+IDxDb250cm9sLUtleS1aPgorZmluZD08Q29udHJvbC1LZXktZj4gPENvbnRyb2wtS2V5LUY+CitmaW5kLWFnYWluPTxDb250cm9sLUtleS1nPiA8S2V5LUYzPgorZmluZC1pbi1maWxlcz08QWx0LUtleS1GMz4gPE1ldGEtS2V5LUYzPgorZmluZC1zZWxlY3Rpb249PENvbnRyb2wtS2V5LUYzPgorcmVwbGFjZT08Q29udHJvbC1LZXktaD4gPENvbnRyb2wtS2V5LUg+Citnb3RvLWxpbmU9PEFsdC1LZXktZz4gPE1ldGEtS2V5LWc+CitzbWFydC1iYWNrc3BhY2U9PEtleS1CYWNrU3BhY2U+CituZXdsaW5lLWFuZC1pbmRlbnQ9PEtleS1SZXR1cm4+IDxLZXktS1BfRW50ZXI+CitzbWFydC1pbmRlbnQ9PEtleS1UYWI+CitpbmRlbnQtcmVnaW9uPTxDb250cm9sLUtleS1icmFja2V0cmlnaHQ+CitkZWRlbnQtcmVnaW9uPTxDb250cm9sLUtleS1icmFja2V0bGVmdD4KK2NvbW1lbnQtcmVnaW9uPTxBbHQtS2V5LTM+IDxNZXRhLUtleS0zPgordW5jb21tZW50LXJlZ2lvbj08QWx0LUtleS00PiA8TWV0YS1LZXktND4KK3RhYmlmeS1yZWdpb249PEFsdC1LZXktNT4gPE1ldGEtS2V5LTU+Cit1bnRhYmlmeS1yZWdpb249PEFsdC1LZXktNj4gPE1ldGEtS2V5LTY+Cit0b2dnbGUtdGFicz08QWx0LUtleS10PiA8TWV0YS1LZXktdD4gPEFsdC1LZXktVD4KK2NoYW5nZS1pbmRlbnR3aWR0aD08QWx0LUtleS11PiA8TWV0YS1LZXktdT4gPEFsdC1LZXktVT4KK2RlbC13b3JkLWxlZnQ9PENvbnRyb2wtS2V5LUJhY2tTcGFjZT4KK2RlbC13b3JkLXJpZ2h0PTxDb250cm9sLUtleS1EZWxldGU+CisKK1tJRExFIENsYXNzaWMgVW5peF0KK2NvcHk9PEFsdC1LZXktdz4gPE1ldGEtS2V5LXc+CitjdXQ9PENvbnRyb2wtS2V5LXc+CitwYXN0ZT08Q29udHJvbC1LZXkteT4KK2JlZ2lubmluZy1vZi1saW5lPTxDb250cm9sLUtleS1hPiA8S2V5LUhvbWU+CitjZW50ZXItaW5zZXJ0PTxDb250cm9sLUtleS1sPgorY2xvc2UtYWxsLXdpbmRvd3M9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LWM+CitjbG9zZS13aW5kb3c9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LTA+Citkby1ub3RoaW5nPTxDb250cm9sLUtleS14PgorZW5kLW9mLWZpbGU9PENvbnRyb2wtS2V5LWQ+CitoaXN0b3J5LW5leHQ9PEFsdC1LZXktbj4gPE1ldGEtS2V5LW4+CitoaXN0b3J5LXByZXZpb3VzPTxBbHQtS2V5LXA+IDxNZXRhLUtleS1wPgoraW50ZXJydXB0LWV4ZWN1dGlvbj08Q29udHJvbC1LZXktYz4KK3ZpZXctcmVzdGFydD08S2V5LUY2PgorcmVzdGFydC1zaGVsbD08Q29udHJvbC1LZXktRjY+CitvcGVuLWNsYXNzLWJyb3dzZXI9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LWI+CitvcGVuLW1vZHVsZT08Q29udHJvbC1LZXkteD48Q29udHJvbC1LZXktbT4KK29wZW4tbmV3LXdpbmRvdz08Q29udHJvbC1LZXkteD48Q29udHJvbC1LZXktbj4KK29wZW4td2luZG93LWZyb20tZmlsZT08Q29udHJvbC1LZXkteD48Q29udHJvbC1LZXktZj4KK3BsYWluLW5ld2xpbmUtYW5kLWluZGVudD08Q29udHJvbC1LZXktaj4KK3ByaW50LXdpbmRvdz08Q29udHJvbC14PjxDb250cm9sLUtleS1wPgorcHl0aG9uLWRvY3M9PENvbnRyb2wtS2V5LWg+CitweXRob24tY29udGV4dC1oZWxwPTxDb250cm9sLVNoaWZ0LUtleS1IPgorcmVkbz08QWx0LUtleS16PiA8TWV0YS1LZXktej4KK3JlbW92ZS1zZWxlY3Rpb249PEtleS1Fc2NhcGU+CitzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LXk+CitzYXZlLXdpbmRvdy1hcy1maWxlPTxDb250cm9sLUtleS14PjxDb250cm9sLUtleS13Pgorc2F2ZS13aW5kb3c9PENvbnRyb2wtS2V5LXg+PENvbnRyb2wtS2V5LXM+CitzZWxlY3QtYWxsPTxBbHQtS2V5LWE+IDxNZXRhLUtleS1hPgordG9nZ2xlLWF1dG8tY29sb3Jpbmc9PENvbnRyb2wtS2V5LXNsYXNoPgordW5kbz08Q29udHJvbC1LZXktej4KK2ZpbmQ9PENvbnRyb2wtS2V5LXU+PENvbnRyb2wtS2V5LXU+PENvbnRyb2wtS2V5LXM+CitmaW5kLWFnYWluPTxDb250cm9sLUtleS11PjxDb250cm9sLUtleS1zPgorZmluZC1pbi1maWxlcz08QWx0LUtleS1zPiA8TWV0YS1LZXktcz4KK2ZpbmQtc2VsZWN0aW9uPTxDb250cm9sLUtleS1zPgorcmVwbGFjZT08Q29udHJvbC1LZXktcj4KK2dvdG8tbGluZT08QWx0LUtleS1nPiA8TWV0YS1LZXktZz4KK3NtYXJ0LWJhY2tzcGFjZT08S2V5LUJhY2tTcGFjZT4KK25ld2xpbmUtYW5kLWluZGVudD08S2V5LVJldHVybj4gPEtleS1LUF9FbnRlcj4KK3NtYXJ0LWluZGVudD08S2V5LVRhYj4KK2luZGVudC1yZWdpb249PENvbnRyb2wtS2V5LWJyYWNrZXRyaWdodD4KK2RlZGVudC1yZWdpb249PENvbnRyb2wtS2V5LWJyYWNrZXRsZWZ0PgorY29tbWVudC1yZWdpb249PEFsdC1LZXktMz4KK3VuY29tbWVudC1yZWdpb249PEFsdC1LZXktND4KK3RhYmlmeS1yZWdpb249PEFsdC1LZXktNT4KK3VudGFiaWZ5LXJlZ2lvbj08QWx0LUtleS02PgordG9nZ2xlLXRhYnM9PEFsdC1LZXktdD4KK2NoYW5nZS1pbmRlbnR3aWR0aD08QWx0LUtleS11PgorZGVsLXdvcmQtbGVmdD08QWx0LUtleS1CYWNrU3BhY2U+CitkZWwtd29yZC1yaWdodD08QWx0LUtleS1kPgorCitbSURMRSBDbGFzc2ljIE1hY10KK2NvcHk9PENvbW1hbmQtS2V5LWM+CitjdXQ9PENvbW1hbmQtS2V5LXg+CitwYXN0ZT08Q29tbWFuZC1LZXktdj4KK2JlZ2lubmluZy1vZi1saW5lPSA8S2V5LUhvbWU+CitjZW50ZXItaW5zZXJ0PTxDb250cm9sLUtleS1sPgorY2xvc2UtYWxsLXdpbmRvd3M9PENvbW1hbmQtS2V5LXE+CitjbG9zZS13aW5kb3c9PENvbW1hbmQtS2V5LXc+Citkby1ub3RoaW5nPTxDb250cm9sLUtleS1GMTI+CitlbmQtb2YtZmlsZT08Q29udHJvbC1LZXktZD4KK3B5dGhvbi1kb2NzPTxLZXktRjE+CitweXRob24tY29udGV4dC1oZWxwPTxTaGlmdC1LZXktRjE+CitoaXN0b3J5LW5leHQ9PENvbnRyb2wtS2V5LW4+CitoaXN0b3J5LXByZXZpb3VzPTxDb250cm9sLUtleS1wPgoraW50ZXJydXB0LWV4ZWN1dGlvbj08Q29udHJvbC1LZXktYz4KK3ZpZXctcmVzdGFydD08S2V5LUY2PgorcmVzdGFydC1zaGVsbD08Q29udHJvbC1LZXktRjY+CitvcGVuLWNsYXNzLWJyb3dzZXI9PENvbW1hbmQtS2V5LWI+CitvcGVuLW1vZHVsZT08Q29tbWFuZC1LZXktbT4KK29wZW4tbmV3LXdpbmRvdz08Q29tbWFuZC1LZXktbj4KK29wZW4td2luZG93LWZyb20tZmlsZT08Q29tbWFuZC1LZXktbz4KK3BsYWluLW5ld2xpbmUtYW5kLWluZGVudD08Q29udHJvbC1LZXktaj4KK3ByaW50LXdpbmRvdz08Q29tbWFuZC1LZXktcD4KK3JlZG89PFNoaWZ0LUNvbW1hbmQtS2V5LVo+CityZW1vdmUtc2VsZWN0aW9uPTxLZXktRXNjYXBlPgorc2F2ZS13aW5kb3ctYXMtZmlsZT08U2hpZnQtQ29tbWFuZC1LZXktUz4KK3NhdmUtd2luZG93PTxDb21tYW5kLUtleS1zPgorc2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlPTxPcHRpb24tQ29tbWFuZC1LZXktcz4KK3NlbGVjdC1hbGw9PENvbW1hbmQtS2V5LWE+Cit0b2dnbGUtYXV0by1jb2xvcmluZz08Q29udHJvbC1LZXktc2xhc2g+Cit1bmRvPTxDb21tYW5kLUtleS16PgorZmluZD08Q29tbWFuZC1LZXktZj4KK2ZpbmQtYWdhaW49PENvbW1hbmQtS2V5LWc+IDxLZXktRjM+CitmaW5kLWluLWZpbGVzPTxDb21tYW5kLUtleS1GMz4KK2ZpbmQtc2VsZWN0aW9uPTxTaGlmdC1Db21tYW5kLUtleS1GMz4KK3JlcGxhY2U9PENvbW1hbmQtS2V5LXI+Citnb3RvLWxpbmU9PENvbW1hbmQtS2V5LWo+CitzbWFydC1iYWNrc3BhY2U9PEtleS1CYWNrU3BhY2U+CituZXdsaW5lLWFuZC1pbmRlbnQ9PEtleS1SZXR1cm4+IDxLZXktS1BfRW50ZXI+CitzbWFydC1pbmRlbnQ9PEtleS1UYWI+CitpbmRlbnQtcmVnaW9uPTxDb21tYW5kLUtleS1icmFja2V0cmlnaHQ+CitkZWRlbnQtcmVnaW9uPTxDb21tYW5kLUtleS1icmFja2V0bGVmdD4KK2NvbW1lbnQtcmVnaW9uPTxDb250cm9sLUtleS0zPgordW5jb21tZW50LXJlZ2lvbj08Q29udHJvbC1LZXktND4KK3RhYmlmeS1yZWdpb249PENvbnRyb2wtS2V5LTU+Cit1bnRhYmlmeS1yZWdpb249PENvbnRyb2wtS2V5LTY+Cit0b2dnbGUtdGFicz08Q29udHJvbC1LZXktdD4KK2NoYW5nZS1pbmRlbnR3aWR0aD08Q29udHJvbC1LZXktdT4KK2RlbC13b3JkLWxlZnQ9PENvbnRyb2wtS2V5LUJhY2tTcGFjZT4KK2RlbC13b3JkLXJpZ2h0PTxDb250cm9sLUtleS1EZWxldGU+CisKK1tJRExFIENsYXNzaWMgT1NYXQordG9nZ2xlLXRhYnMgPSA8Q29udHJvbC1LZXktdD4KK2ludGVycnVwdC1leGVjdXRpb24gPSA8Q29udHJvbC1LZXktYz4KK3VudGFiaWZ5LXJlZ2lvbiA9IDxDb250cm9sLUtleS02PgorcmVtb3ZlLXNlbGVjdGlvbiA9IDxLZXktRXNjYXBlPgorcHJpbnQtd2luZG93ID0gPENvbW1hbmQtS2V5LXA+CityZXBsYWNlID0gPENvbW1hbmQtS2V5LXI+Citnb3RvLWxpbmUgPSA8Q29tbWFuZC1LZXktaj4KK3BsYWluLW5ld2xpbmUtYW5kLWluZGVudCA9IDxDb250cm9sLUtleS1qPgoraGlzdG9yeS1wcmV2aW91cyA9IDxDb250cm9sLUtleS1wPgorYmVnaW5uaW5nLW9mLWxpbmUgPSA8Q29udHJvbC1LZXktTGVmdD4KK2VuZC1vZi1saW5lID0gPENvbnRyb2wtS2V5LVJpZ2h0PgorY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktMz4KK3JlZG8gPSA8U2hpZnQtQ29tbWFuZC1LZXktWj4KK2Nsb3NlLXdpbmRvdyA9IDxDb21tYW5kLUtleS13PgorcmVzdGFydC1zaGVsbCA9IDxDb250cm9sLUtleS1GNj4KK3NhdmUtd2luZG93LWFzLWZpbGUgPSA8U2hpZnQtQ29tbWFuZC1LZXktUz4KK2Nsb3NlLWFsbC13aW5kb3dzID0gPENvbW1hbmQtS2V5LXE+Cit2aWV3LXJlc3RhcnQgPSA8S2V5LUY2PgordGFiaWZ5LXJlZ2lvbiA9IDxDb250cm9sLUtleS01PgorZmluZC1hZ2FpbiA9IDxDb21tYW5kLUtleS1nPiA8S2V5LUYzPgorZmluZCA9IDxDb21tYW5kLUtleS1mPgordG9nZ2xlLWF1dG8tY29sb3JpbmcgPSA8Q29udHJvbC1LZXktc2xhc2g+CitzZWxlY3QtYWxsID0gPENvbW1hbmQtS2V5LWE+CitzbWFydC1iYWNrc3BhY2UgPSA8S2V5LUJhY2tTcGFjZT4KK2NoYW5nZS1pbmRlbnR3aWR0aCA9IDxDb250cm9sLUtleS11PgorZG8tbm90aGluZyA9IDxDb250cm9sLUtleS1GMTI+CitzbWFydC1pbmRlbnQgPSA8S2V5LVRhYj4KK2NlbnRlci1pbnNlcnQgPSA8Q29udHJvbC1LZXktbD4KK2hpc3RvcnktbmV4dCA9IDxDb250cm9sLUtleS1uPgorZGVsLXdvcmQtcmlnaHQgPSA8T3B0aW9uLUtleS1EZWxldGU+Cit1bmRvID0gPENvbW1hbmQtS2V5LXo+CitzYXZlLXdpbmRvdyA9IDxDb21tYW5kLUtleS1zPgordW5jb21tZW50LXJlZ2lvbiA9IDxDb250cm9sLUtleS00PgorY3V0ID0gPENvbW1hbmQtS2V5LXg+CitmaW5kLWluLWZpbGVzID0gPENvbW1hbmQtS2V5LUYzPgorZGVkZW50LXJlZ2lvbiA9IDxDb21tYW5kLUtleS1icmFja2V0bGVmdD4KK2NvcHkgPSA8Q29tbWFuZC1LZXktYz4KK3Bhc3RlID0gPENvbW1hbmQtS2V5LXY+CitpbmRlbnQtcmVnaW9uID0gPENvbW1hbmQtS2V5LWJyYWNrZXRyaWdodD4KK2RlbC13b3JkLWxlZnQgPSA8T3B0aW9uLUtleS1CYWNrU3BhY2U+IDxPcHRpb24tQ29tbWFuZC1LZXktQmFja1NwYWNlPgorbmV3bGluZS1hbmQtaW5kZW50ID0gPEtleS1SZXR1cm4+IDxLZXktS1BfRW50ZXI+CitlbmQtb2YtZmlsZSA9IDxDb250cm9sLUtleS1kPgorb3Blbi1jbGFzcy1icm93c2VyID0gPENvbW1hbmQtS2V5LWI+CitvcGVuLW5ldy13aW5kb3cgPSA8Q29tbWFuZC1LZXktbj4KK29wZW4tbW9kdWxlID0gPENvbW1hbmQtS2V5LW0+CitmaW5kLXNlbGVjdGlvbiA9IDxTaGlmdC1Db21tYW5kLUtleS1GMz4KK3B5dGhvbi1jb250ZXh0LWhlbHAgPSA8U2hpZnQtS2V5LUYxPgorc2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlID0gPE9wdGlvbi1Db21tYW5kLUtleS1zPgorb3Blbi13aW5kb3ctZnJvbS1maWxlID0gPENvbW1hbmQtS2V5LW8+CitweXRob24tZG9jcyA9IDxLZXktRjE+CisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWctbWFpbi5kZWYgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLW1haW4uZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZGQwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnLW1haW4uZGVmCkBAIC0wLDAgKzEsNzkgQEAKKyMgSURMRSByZWFkcyBzZXZlcmFsIGNvbmZpZyBmaWxlcyB0byBkZXRlcm1pbmUgdXNlciBwcmVmZXJlbmNlcy4gIFRoaXMKKyMgZmlsZSBpcyB0aGUgZGVmYXVsdCBjb25maWcgZmlsZSBmb3IgZ2VuZXJhbCBpZGxlIHNldHRpbmdzLgorIworIyBXaGVuIElETEUgc3RhcnRzLCBpdCB3aWxsIGxvb2sgaW4KKyMgdGhlIGZvbGxvd2luZyB0d28gc2V0cyBvZiBmaWxlcywgaW4gb3JkZXI6CisjCisjICAgICBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyMgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgY29uZmlnLW1haW4uZGVmICAgICAgICAgdGhlIGRlZmF1bHQgZ2VuZXJhbCBjb25maWcgZmlsZQorIyAgICAgY29uZmlnLWV4dGVuc2lvbnMuZGVmICAgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGNvbmZpZyBmaWxlCisjICAgICBjb25maWctaGlnaGxpZ2h0LmRlZiAgICB0aGUgZGVmYXVsdCBoaWdobGlnaHRpbmcgY29uZmlnIGZpbGUKKyMgICAgIGNvbmZpZy1rZXlzLmRlZiAgICAgICAgIHRoZSBkZWZhdWx0IGtleWJpbmRpbmcgY29uZmlnIGZpbGUKKyMKKyMgICAgIHVzZXIgY29uZmlndXJhdGlvbgorIyAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgICAgfi8uaWRsZXJjL2NvbmZpZy1tYWluLmNmZyAgICAgICAgICAgIHRoZSB1c2VyIGdlbmVyYWwgY29uZmlnIGZpbGUKKyMgICAgIH4vLmlkbGVyYy9jb25maWctZXh0ZW5zaW9ucy5jZmcgICAgICB0aGUgdXNlciBleHRlbnNpb24gY29uZmlnIGZpbGUKKyMgICAgIH4vLmlkbGVyYy9jb25maWctaGlnaGxpZ2h0LmNmZyAgICAgICB0aGUgdXNlciBoaWdobGlnaHRpbmcgY29uZmlnIGZpbGUKKyMgICAgIH4vLmlkbGVyYy9jb25maWcta2V5cy5jZmcgICAgICAgICAgICB0aGUgdXNlciBrZXliaW5kaW5nIGNvbmZpZyBmaWxlCisjCisjIE9uIFdpbmRvd3MyMDAwIGFuZCBXaW5kb3dzIFhQIHRoZSAuaWRsZXJjIGRpcmVjdG9yeSBpcyBhdAorIyAgICAgRG9jdW1lbnRzIGFuZCBTZXR0aW5nc1w8dXNlcm5hbWU+XC5pZGxlcmMKKyMKKyMgT24gV2luZG93czk4IGl0IGlzIGF0IGM6XC5pZGxlcmMKKyMKKyMgQW55IG9wdGlvbnMgdGhlIHVzZXIgc2F2ZXMgdGhyb3VnaCB0aGUgY29uZmlnIGRpYWxvZyB3aWxsIGJlIHNhdmVkIHRvCisjIHRoZSByZWxldmFudCB1c2VyIGNvbmZpZyBmaWxlLiBSZXZlcnRpbmcgYW55IGdlbmVyYWwgc2V0dGluZyB0byB0aGUKKyMgZGVmYXVsdCBjYXVzZXMgdGhhdCBlbnRyeSB0byBiZSB3aXBlZCBmcm9tIHRoZSB1c2VyIGZpbGUgYW5kIHJlLXJlYWQKKyMgZnJvbSB0aGUgZGVmYXVsdCBmaWxlLiBVc2VyIGhpZ2hsaWdodGluZyB0aGVtZXMgb3Iga2V5YmluZGluZyBzZXRzIGFyZQorIyByZXRhaW5lZCB1bmxlc3Mgc3BlY2lmaWNhbGx5IGRlbGV0ZWQgd2l0aGluIHRoZSBjb25maWcgZGlhbG9nLiBDaG9vc2luZworIyBvbmUgb2YgdGhlIGRlZmF1bHQgdGhlbWVzIG9yIGtleXNldHMganVzdCBhcHBsaWVzIHRoZSByZWxldmFudCBzZXR0aW5ncworIyBmcm9tIHRoZSBkZWZhdWx0IGZpbGUuCisjCisjIEFkZGl0aW9uYWwgaGVscCBzb3VyY2VzIGFyZSBsaXN0ZWQgaW4gdGhlIFtIZWxwRmlsZXNdIHNlY3Rpb24gYW5kIG11c3QgYmUKKyMgdmlld2FibGUgYnkgYSB3ZWIgYnJvd3NlciAob3IgdGhlIFdpbmRvd3MgSGVscCB2aWV3ZXIgaW4gdGhlIGNhc2Ugb2YgLmNobQorIyBmaWxlcykuIFRoZXNlIHNvdXJjZXMgd2lsbCBiZSBsaXN0ZWQgb24gdGhlIEhlbHAgbWVudS4gIFRoZSBwYXR0ZXJuIGlzCisjIDxzZXF1ZW5jZV9udW1iZXIgPSBtZW51IGl0ZW07L3BhdGgvdG8vaGVscC9zb3VyY2U+CisjIFlvdSBjYW4ndCB1c2UgYSBzZW1pLWNvbG9uIGluIGEgbWVudSBpdGVtIG9yIHBhdGguICBUaGUgcGF0aCB3aWxsIGJlIHBsYXRmb3JtCisjIHNwZWNpZmljIGJlY2F1c2Ugb2YgcGF0aCBzZXBhcmF0b3JzLCBkcml2ZSBzcGVjcyBldGMuCisjCisjIEl0IGlzIGJlc3QgdG8gdXNlIHRoZSBDb25maWd1cmF0aW9uIEdVSSB0byBzZXQgdXAgYWRkaXRpb25hbCBoZWxwIHNvdXJjZXMhCisjIEV4YW1wbGU6CisjMSA9IE15IEV4dHJhIEhlbHAgU291cmNlOy91c3Ivc2hhcmUvZG9jL2Zvby9pbmRleC5odG1sCisjMiA9IEFub3RoZXIgSGVscCBTb3VyY2U7L3BhdGgvdG8vYW5vdGhlci5wZGYKKworW0dlbmVyYWxdCitlZGl0b3Itb24tc3RhcnR1cD0gMAorYXV0b3NhdmU9IDAKK3ByaW50LWNvbW1hbmQtcG9zaXg9bHByICVzCitwcmludC1jb21tYW5kLXdpbj1zdGFydCAvbWluIG5vdGVwYWQgL3AgJXMKK2RlbGV0ZS1leGl0ZnVuYz0gMQorCitbRWRpdG9yV2luZG93XQord2lkdGg9IDgwCitoZWlnaHQ9IDQwCitmb250PSBjb3VyaWVyCitmb250LXNpemU9IDEwCitmb250LWJvbGQ9IDAKK2VuY29kaW5nPSBub25lCisKK1tGb3JtYXRQYXJhZ3JhcGhdCitwYXJhZ3JhcGg9NzAKKworW0luZGVudF0KK3VzZS1zcGFjZXM9IDEKK251bS1zcGFjZXM9IDQKKworW1RoZW1lXQorZGVmYXVsdD0gMQorbmFtZT0gSURMRSBDbGFzc2ljCisKK1tLZXlzXQorZGVmYXVsdD0gMQorbmFtZT0gSURMRSBDbGFzc2ljIFdpbmRvd3MKKworW0hpc3RvcnldCitjeWNsaWM9MQorCitbSGVscEZpbGVzXQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcwN2ZjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHkKQEAgLTAsMCArMSwxMTU4IEBACisiIiJJRExFIENvbmZpZ3VyYXRpb24gRGlhbG9nOiBzdXBwb3J0IHVzZXIgY3VzdG9taXphdGlvbiBvZiBJRExFIGJ5IEdVSQorCitDdXN0b21pemUgZm9udCBmYWNlcywgc2l6ZXMsIGFuZCBjb2xvcml6YXRpb24gYXR0cmlidXRlcy4gIFNldCBpbmRlbnRhdGlvbgorZGVmYXVsdHMuICBDdXN0b21pemUga2V5YmluZGluZ3MuICBDb2xvcml6YXRpb24gYW5kIGtleWJpbmRpbmdzIGNhbiBiZQorc2F2ZWQgYXMgdXNlciBkZWZpbmVkIHNldHMuICBTZWxlY3Qgc3RhcnR1cCBvcHRpb25zIGluY2x1ZGluZyBzaGVsbC9lZGl0b3IKK2FuZCBkZWZhdWx0IHdpbmRvdyBzaXplLiAgRGVmaW5lIGFkZGl0aW9uYWwgaGVscCBzb3VyY2VzLgorCitOb3RlIHRoYXQgdGFiIHdpZHRoIGluIElETEUgaXMgY3VycmVudGx5IGZpeGVkIGF0IGVpZ2h0IGR1ZSB0byBUayBpc3N1ZXMuCitSZWZlciB0byBjb21tZW50cyBpbiBFZGl0b3JXaW5kb3cgYXV0b2luZGVudCBjb2RlIGZvciBkZXRhaWxzLgorCisiIiIKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrTWVzc2FnZUJveCwgdGtDb2xvckNob29zZXIsIHRrRm9udAoraW1wb3J0IHN0cmluZworCitmcm9tIGlkbGVsaWIuY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKK2Zyb20gaWRsZWxpYi5keW5PcHRpb25NZW51V2lkZ2V0IGltcG9ydCBEeW5PcHRpb25NZW51Citmcm9tIGlkbGVsaWIudGFiYmVkcGFnZXMgaW1wb3J0IFRhYmJlZFBhZ2VTZXQKK2Zyb20gaWRsZWxpYi5rZXliaW5kaW5nRGlhbG9nIGltcG9ydCBHZXRLZXlzRGlhbG9nCitmcm9tIGlkbGVsaWIuY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cgaW1wb3J0IEdldENmZ1NlY3Rpb25OYW1lRGlhbG9nCitmcm9tIGlkbGVsaWIuY29uZmlnSGVscFNvdXJjZUVkaXQgaW1wb3J0IEdldEhlbHBTb3VyY2VEaWFsb2cKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorCitjbGFzcyBDb25maWdEaWFsb2coVG9wbGV2ZWwpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYscGFyZW50LHRpdGxlKToKKyAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLndtX3dpdGhkcmF3KCkKKworICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQorICAgICAgICBzZWxmLnRpdGxlKCdJRExFIFByZWZlcmVuY2VzJykKKyAgICAgICAgc2VsZi5nZW9tZXRyeSgiKyVkKyVkIiAlIChwYXJlbnQud2luZm9fcm9vdHgoKSsyMCwKKyAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSszMCkpCisgICAgICAgICNUaGVtZSBFbGVtZW50cy4gRWFjaCB0aGVtZSBlbGVtZW50IGtleSBpcyBpdHMgZGlzcGxheSBuYW1lLgorICAgICAgICAjVGhlIGZpcnN0IHZhbHVlIG9mIHRoZSB0dXBsZSBpcyB0aGUgc2FtcGxlIGFyZWEgdGFnIG5hbWUuCisgICAgICAgICNUaGUgc2Vjb25kIHZhbHVlIGlzIHRoZSBkaXNwbGF5IG5hbWUgbGlzdCBzb3J0IGluZGV4LgorICAgICAgICBzZWxmLnRoZW1lRWxlbWVudHM9eydOb3JtYWwgVGV4dCc6KCdub3JtYWwnLCcwMCcpLAorICAgICAgICAgICAgJ1B5dGhvbiBLZXl3b3Jkcyc6KCdrZXl3b3JkJywnMDEnKSwKKyAgICAgICAgICAgICdQeXRob24gRGVmaW5pdGlvbnMnOignZGVmaW5pdGlvbicsJzAyJyksCisgICAgICAgICAgICAnUHl0aG9uIEJ1aWx0aW5zJzooJ2J1aWx0aW4nLCAnMDMnKSwKKyAgICAgICAgICAgICdQeXRob24gQ29tbWVudHMnOignY29tbWVudCcsJzA0JyksCisgICAgICAgICAgICAnUHl0aG9uIFN0cmluZ3MnOignc3RyaW5nJywnMDUnKSwKKyAgICAgICAgICAgICdTZWxlY3RlZCBUZXh0JzooJ2hpbGl0ZScsJzA2JyksCisgICAgICAgICAgICAnRm91bmQgVGV4dCc6KCdoaXQnLCcwNycpLAorICAgICAgICAgICAgJ0N1cnNvcic6KCdjdXJzb3InLCcwOCcpLAorICAgICAgICAgICAgJ0Vycm9yIFRleHQnOignZXJyb3InLCcwOScpLAorICAgICAgICAgICAgJ1NoZWxsIE5vcm1hbCBUZXh0JzooJ2NvbnNvbGUnLCcxMCcpLAorICAgICAgICAgICAgJ1NoZWxsIFN0ZG91dCBUZXh0JzooJ3N0ZG91dCcsJzExJyksCisgICAgICAgICAgICAnU2hlbGwgU3RkZXJyIFRleHQnOignc3RkZXJyJywnMTInKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgc2VsZi5SZXNldENoYW5nZWRJdGVtcygpICNsb2FkIGluaXRpYWwgdmFsdWVzIGluIGNoYW5nZWQgaXRlbXMgZGljdAorICAgICAgICBzZWxmLkNyZWF0ZVdpZGdldHMoKQorICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0Usd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi50YWJQYWdlcy5mb2N1c19zZXQoKQorICAgICAgICAja2V5IGJpbmRpbmdzIGZvciB0aGlzIGRpYWxvZworICAgICAgICAjc2VsZi5iaW5kKCc8RXNjYXBlPicsc2VsZi5DYW5jZWwpICNkaXNtaXNzIGRpYWxvZywgbm8gc2F2ZQorICAgICAgICAjc2VsZi5iaW5kKCc8QWx0LWE+JyxzZWxmLkFwcGx5KSAjYXBwbHkgY2hhbmdlcywgc2F2ZQorICAgICAgICAjc2VsZi5iaW5kKCc8RjE+JyxzZWxmLkhlbHApICNjb250ZXh0IGhlbHAKKyAgICAgICAgc2VsZi5Mb2FkQ29uZmlncygpCisgICAgICAgIHNlbGYuQXR0YWNoVmFyQ2FsbGJhY2tzKCkgI2F2b2lkIGNhbGxiYWNrcyBkdXJpbmcgTG9hZENvbmZpZ3MKKworICAgICAgICBzZWxmLndtX2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQorCisgICAgZGVmIENyZWF0ZVdpZGdldHMoc2VsZik6CisgICAgICAgIHNlbGYudGFiUGFnZXMgPSBUYWJiZWRQYWdlU2V0KHNlbGYsCisgICAgICAgICAgICAgICAgcGFnZV9uYW1lcz1bJ0ZvbnRzL1RhYnMnLCdIaWdobGlnaHRpbmcnLCdLZXlzJywnR2VuZXJhbCddKQorICAgICAgICBmcmFtZUFjdGlvbkJ1dHRvbnMgPSBGcmFtZShzZWxmLHBhZHk9MikKKyAgICAgICAgI2FjdGlvbiBidXR0b25zCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAjIENoYW5naW5nIHRoZSBkZWZhdWx0IHBhZGRpbmcgb24gT1NYIHJlc3VsdHMgaW4gdW5yZWFkYWJsZQorICAgICAgICAgICAgIyB0ZXh0IGluIHRoZSBidXR0b25zCisgICAgICAgICAgICBwYWRkaW5nQXJncz17fQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFkZGluZ0FyZ3M9eydwYWR4Jzo2LCAncGFkeSc6M30KKworICAgICAgICBzZWxmLmJ1dHRvbkhlbHAgPSBCdXR0b24oZnJhbWVBY3Rpb25CdXR0b25zLHRleHQ9J0hlbHAnLAorICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5IZWxwLHRha2Vmb2N1cz1GQUxTRSwKKyAgICAgICAgICAgICAgICAqKnBhZGRpbmdBcmdzKQorICAgICAgICBzZWxmLmJ1dHRvbk9rID0gQnV0dG9uKGZyYW1lQWN0aW9uQnV0dG9ucyx0ZXh0PSdPaycsCisgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLk9rLHRha2Vmb2N1cz1GQUxTRSwKKyAgICAgICAgICAgICAgICAqKnBhZGRpbmdBcmdzKQorICAgICAgICBzZWxmLmJ1dHRvbkFwcGx5ID0gQnV0dG9uKGZyYW1lQWN0aW9uQnV0dG9ucyx0ZXh0PSdBcHBseScsCisgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLkFwcGx5LHRha2Vmb2N1cz1GQUxTRSwKKyAgICAgICAgICAgICAgICAqKnBhZGRpbmdBcmdzKQorICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbCA9IEJ1dHRvbihmcmFtZUFjdGlvbkJ1dHRvbnMsdGV4dD0nQ2FuY2VsJywKKyAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuQ2FuY2VsLHRha2Vmb2N1cz1GQUxTRSwKKyAgICAgICAgICAgICAgICAqKnBhZGRpbmdBcmdzKQorICAgICAgICBzZWxmLkNyZWF0ZVBhZ2VGb250VGFiKCkKKyAgICAgICAgc2VsZi5DcmVhdGVQYWdlSGlnaGxpZ2h0KCkKKyAgICAgICAgc2VsZi5DcmVhdGVQYWdlS2V5cygpCisgICAgICAgIHNlbGYuQ3JlYXRlUGFnZUdlbmVyYWwoKQorICAgICAgICBzZWxmLmJ1dHRvbkhlbHAucGFjayhzaWRlPVJJR0hULHBhZHg9NSkKKyAgICAgICAgc2VsZi5idXR0b25Pay5wYWNrKHNpZGU9TEVGVCxwYWR4PTUpCisgICAgICAgIHNlbGYuYnV0dG9uQXBwbHkucGFjayhzaWRlPUxFRlQscGFkeD01KQorICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbC5wYWNrKHNpZGU9TEVGVCxwYWR4PTUpCisgICAgICAgIGZyYW1lQWN0aW9uQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NKQorICAgICAgICBGcmFtZShzZWxmLCBoZWlnaHQ9MiwgYm9yZGVyd2lkdGg9MCkucGFjayhzaWRlPUJPVFRPTSkKKyAgICAgICAgc2VsZi50YWJQYWdlcy5wYWNrKHNpZGU9VE9QLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKworICAgIGRlZiBDcmVhdGVQYWdlRm9udFRhYihzZWxmKToKKyAgICAgICAgI3RrVmFycworICAgICAgICBzZWxmLmZvbnRTaXplPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmZvbnRCb2xkPUJvb2xlYW5WYXIoc2VsZikKKyAgICAgICAgc2VsZi5mb250TmFtZT1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5zcGFjZU51bT1JbnRWYXIoc2VsZikKKyAgICAgICAgc2VsZi5lZGl0Rm9udD10a0ZvbnQuRm9udChzZWxmLCgnY291cmllcicsMTAsJ25vcm1hbCcpKQorICAgICAgICAjI3dpZGdldCBjcmVhdGlvbgorICAgICAgICAjYm9keSBmcmFtZQorICAgICAgICBmcmFtZT1zZWxmLnRhYlBhZ2VzLnBhZ2VzWydGb250cy9UYWJzJ10uZnJhbWUKKyAgICAgICAgI2JvZHkgc2VjdGlvbiBmcmFtZXMKKyAgICAgICAgZnJhbWVGb250PUxhYmVsRnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PScgQmFzZSBFZGl0b3IgRm9udCAnKQorICAgICAgICBmcmFtZUluZGVudD1MYWJlbEZyYW1lKGZyYW1lLGJvcmRlcndpZHRoPTIscmVsaWVmPUdST09WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PScgSW5kZW50YXRpb24gV2lkdGggJykKKyAgICAgICAgI2ZyYW1lRm9udAorICAgICAgICBmcmFtZUZvbnROYW1lPUZyYW1lKGZyYW1lRm9udCkKKyAgICAgICAgZnJhbWVGb250UGFyYW09RnJhbWUoZnJhbWVGb250KQorICAgICAgICBsYWJlbEZvbnROYW1lVGl0bGU9TGFiZWwoZnJhbWVGb250TmFtZSxqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgdGV4dD0nRm9udCBGYWNlIDonKQorICAgICAgICBzZWxmLmxpc3RGb250TmFtZT1MaXN0Ym94KGZyYW1lRm9udE5hbWUsaGVpZ2h0PTUsdGFrZWZvY3VzPUZBTFNFLAorICAgICAgICAgICAgICAgIGV4cG9ydHNlbGVjdGlvbj1GQUxTRSkKKyAgICAgICAgc2VsZi5saXN0Rm9udE5hbWUuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLHNlbGYuT25MaXN0Rm9udEJ1dHRvblJlbGVhc2UpCisgICAgICAgIHNjcm9sbEZvbnQ9U2Nyb2xsYmFyKGZyYW1lRm9udE5hbWUpCisgICAgICAgIHNjcm9sbEZvbnQuY29uZmlnKGNvbW1hbmQ9c2VsZi5saXN0Rm9udE5hbWUueXZpZXcpCisgICAgICAgIHNlbGYubGlzdEZvbnROYW1lLmNvbmZpZyh5c2Nyb2xsY29tbWFuZD1zY3JvbGxGb250LnNldCkKKyAgICAgICAgbGFiZWxGb250U2l6ZVRpdGxlPUxhYmVsKGZyYW1lRm9udFBhcmFtLHRleHQ9J1NpemUgOicpCisgICAgICAgIHNlbGYub3B0TWVudUZvbnRTaXplPUR5bk9wdGlvbk1lbnUoZnJhbWVGb250UGFyYW0sc2VsZi5mb250U2l6ZSxOb25lLAorICAgICAgICAgICAgY29tbWFuZD1zZWxmLlNldEZvbnRTYW1wbGUpCisgICAgICAgIGNoZWNrRm9udEJvbGQ9Q2hlY2tidXR0b24oZnJhbWVGb250UGFyYW0sdmFyaWFibGU9c2VsZi5mb250Qm9sZCwKKyAgICAgICAgICAgIG9udmFsdWU9MSxvZmZ2YWx1ZT0wLHRleHQ9J0JvbGQnLGNvbW1hbmQ9c2VsZi5TZXRGb250U2FtcGxlKQorICAgICAgICBmcmFtZUZvbnRTYW1wbGU9RnJhbWUoZnJhbWVGb250LHJlbGllZj1TT0xJRCxib3JkZXJ3aWR0aD0xKQorICAgICAgICBzZWxmLmxhYmVsRm9udFNhbXBsZT1MYWJlbChmcmFtZUZvbnRTYW1wbGUsCisgICAgICAgICAgICAgICAgdGV4dD0nQWFCYkNjRGRFZVxuRmZHZ0hoSWlKaktcbjEyMzQ1Njc4OTBcbiM6Kz0oKXt9W10nLAorICAgICAgICAgICAgICAgIGp1c3RpZnk9TEVGVCxmb250PXNlbGYuZWRpdEZvbnQpCisgICAgICAgICNmcmFtZUluZGVudAorICAgICAgICBmcmFtZUluZGVudFNpemU9RnJhbWUoZnJhbWVJbmRlbnQpCisgICAgICAgIGxhYmVsU3BhY2VOdW1UaXRsZT1MYWJlbChmcmFtZUluZGVudFNpemUsIGp1c3RpZnk9TEVGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9J1B5dGhvbiBTdGFuZGFyZDogNCBTcGFjZXMhJykKKyAgICAgICAgc2VsZi5zY2FsZVNwYWNlTnVtPVNjYWxlKGZyYW1lSW5kZW50U2l6ZSwgdmFyaWFibGU9c2VsZi5zcGFjZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD0naG9yaXpvbnRhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aWNraW50ZXJ2YWw9MiwgZnJvbV89MiwgdG89MTYpCisgICAgICAgICN3aWRnZXQgcGFja2luZworICAgICAgICAjYm9keQorICAgICAgICBmcmFtZUZvbnQucGFjayhzaWRlPUxFRlQscGFkeD01LHBhZHk9NSxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisgICAgICAgIGZyYW1lSW5kZW50LnBhY2soc2lkZT1MRUZULHBhZHg9NSxwYWR5PTUsZmlsbD1ZKQorICAgICAgICAjZnJhbWVGb250CisgICAgICAgIGZyYW1lRm9udE5hbWUucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGZpbGw9WCkKKyAgICAgICAgZnJhbWVGb250UGFyYW0ucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGZpbGw9WCkKKyAgICAgICAgbGFiZWxGb250TmFtZVRpdGxlLnBhY2soc2lkZT1UT1AsYW5jaG9yPVcpCisgICAgICAgIHNlbGYubGlzdEZvbnROYW1lLnBhY2soc2lkZT1MRUZULGV4cGFuZD1UUlVFLGZpbGw9WCkKKyAgICAgICAgc2Nyb2xsRm9udC5wYWNrKHNpZGU9TEVGVCxmaWxsPVkpCisgICAgICAgIGxhYmVsRm9udFNpemVUaXRsZS5wYWNrKHNpZGU9TEVGVCxhbmNob3I9VykKKyAgICAgICAgc2VsZi5vcHRNZW51Rm9udFNpemUucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcpCisgICAgICAgIGNoZWNrRm9udEJvbGQucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcscGFkeD0yMCkKKyAgICAgICAgZnJhbWVGb250U2FtcGxlLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9NSxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisgICAgICAgIHNlbGYubGFiZWxGb250U2FtcGxlLnBhY2soZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICAjZnJhbWVJbmRlbnQKKyAgICAgICAgZnJhbWVJbmRlbnRTaXplLnBhY2soc2lkZT1UT1AsZmlsbD1YKQorICAgICAgICBsYWJlbFNwYWNlTnVtVGl0bGUucGFjayhzaWRlPVRPUCxhbmNob3I9VyxwYWR4PTUpCisgICAgICAgIHNlbGYuc2NhbGVTcGFjZU51bS5wYWNrKHNpZGU9VE9QLHBhZHg9NSxmaWxsPVgpCisgICAgICAgIHJldHVybiBmcmFtZQorCisgICAgZGVmIENyZWF0ZVBhZ2VIaWdobGlnaHQoc2VsZik6CisgICAgICAgIHNlbGYuYnVpbHRpblRoZW1lPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmN1c3RvbVRoZW1lPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmZnSGlsaXRlPUJvb2xlYW5WYXIoc2VsZikKKyAgICAgICAgc2VsZi5jb2xvdXI9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYuZm9udE5hbWU9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW49Qm9vbGVhblZhcihzZWxmKQorICAgICAgICBzZWxmLmhpZ2hsaWdodFRhcmdldD1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgIyN3aWRnZXQgY3JlYXRpb24KKyAgICAgICAgI2JvZHkgZnJhbWUKKyAgICAgICAgZnJhbWU9c2VsZi50YWJQYWdlcy5wYWdlc1snSGlnaGxpZ2h0aW5nJ10uZnJhbWUKKyAgICAgICAgI2JvZHkgc2VjdGlvbiBmcmFtZXMKKyAgICAgICAgZnJhbWVDdXN0b209TGFiZWxGcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIEN1c3RvbSBIaWdobGlnaHRpbmcgJykKKyAgICAgICAgZnJhbWVUaGVtZT1MYWJlbEZyYW1lKGZyYW1lLGJvcmRlcndpZHRoPTIscmVsaWVmPUdST09WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9JyBIaWdobGlnaHRpbmcgVGhlbWUgJykKKyAgICAgICAgI2ZyYW1lQ3VzdG9tCisgICAgICAgIHNlbGYudGV4dEhpZ2hsaWdodFNhbXBsZT1UZXh0KGZyYW1lQ3VzdG9tLHJlbGllZj1TT0xJRCxib3JkZXJ3aWR0aD0xLAorICAgICAgICAgICAgZm9udD0oJ2NvdXJpZXInLDEyLCcnKSxjdXJzb3I9J2hhbmQyJyx3aWR0aD0yMSxoZWlnaHQ9MTEsCisgICAgICAgICAgICB0YWtlZm9jdXM9RkFMU0UsaGlnaGxpZ2h0dGhpY2tuZXNzPTAsd3JhcD1OT05FKQorICAgICAgICB0ZXh0PXNlbGYudGV4dEhpZ2hsaWdodFNhbXBsZQorICAgICAgICB0ZXh0LmJpbmQoJzxEb3VibGUtQnV0dG9uLTE+JyxsYW1iZGEgZTogJ2JyZWFrJykKKyAgICAgICAgdGV4dC5iaW5kKCc8QjEtTW90aW9uPicsbGFtYmRhIGU6ICdicmVhaycpCisgICAgICAgIHRleHRBbmRUYWdzPSgoJyN5b3UgY2FuIGNsaWNrIGhlcmUnLCdjb21tZW50JyksKCdcbicsJ25vcm1hbCcpLAorICAgICAgICAgICAgKCcjdG8gY2hvb3NlIGl0ZW1zJywnY29tbWVudCcpLCgnXG4nLCdub3JtYWwnKSwoJ2RlZicsJ2tleXdvcmQnKSwKKyAgICAgICAgICAgICgnICcsJ25vcm1hbCcpLCgnZnVuYycsJ2RlZmluaXRpb24nKSwoJyhwYXJhbSk6Jywnbm9ybWFsJyksCisgICAgICAgICAgICAoJ1xuICAnLCdub3JtYWwnKSwoJyIiInN0cmluZyIiIicsJ3N0cmluZycpLCgnXG4gIHZhcjAgPSAnLCdub3JtYWwnKSwKKyAgICAgICAgICAgICgiJ3N0cmluZyciLCdzdHJpbmcnKSwoJ1xuICB2YXIxID0gJywnbm9ybWFsJyksKCInc2VsZWN0ZWQnIiwnaGlsaXRlJyksCisgICAgICAgICAgICAoJ1xuICB2YXIyID0gJywnbm9ybWFsJyksKCInZm91bmQnIiwnaGl0JyksCisgICAgICAgICAgICAoJ1xuICB2YXIzID0gJywnbm9ybWFsJyksKCdsaXN0JywgJ2J1aWx0aW4nKSwgKCcoJywnbm9ybWFsJyksCisgICAgICAgICAgICAoJ05vbmUnLCAnYnVpbHRpbicpLCgnKVxuXG4nLCdub3JtYWwnKSwKKyAgICAgICAgICAgICgnIGVycm9yICcsJ2Vycm9yJyksKCcgJywnbm9ybWFsJyksKCdjdXJzb3IgfCcsJ2N1cnNvcicpLAorICAgICAgICAgICAgKCdcbiAnLCdub3JtYWwnKSwoJ3NoZWxsJywnY29uc29sZScpLCgnICcsJ25vcm1hbCcpLCgnc3Rkb3V0Jywnc3Rkb3V0JyksCisgICAgICAgICAgICAoJyAnLCdub3JtYWwnKSwoJ3N0ZGVycicsJ3N0ZGVycicpLCgnXG4nLCdub3JtYWwnKSkKKyAgICAgICAgZm9yIHR4VGEgaW4gdGV4dEFuZFRhZ3M6CisgICAgICAgICAgICB0ZXh0Lmluc2VydChFTkQsdHhUYVswXSx0eFRhWzFdKQorICAgICAgICBmb3IgZWxlbWVudCBpbiBzZWxmLnRoZW1lRWxlbWVudHMua2V5cygpOgorICAgICAgICAgICAgdGV4dC50YWdfYmluZChzZWxmLnRoZW1lRWxlbWVudHNbZWxlbWVudF1bMF0sJzxCdXR0b25QcmVzcy0xPicsCisgICAgICAgICAgICAgICAgbGFtYmRhIGV2ZW50LGVsZW09ZWxlbWVudDogZXZlbnQud2lkZ2V0LndpbmZvX3RvcGxldmVsKCkKKyAgICAgICAgICAgICAgICAuaGlnaGxpZ2h0VGFyZ2V0LnNldChlbGVtKSkKKyAgICAgICAgdGV4dC5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgIHNlbGYuZnJhbWVDb2xvdXJTZXQ9RnJhbWUoZnJhbWVDdXN0b20scmVsaWVmPVNPTElELGJvcmRlcndpZHRoPTEpCisgICAgICAgIGZyYW1lRmdCZz1GcmFtZShmcmFtZUN1c3RvbSkKKyAgICAgICAgYnV0dG9uU2V0Q29sb3VyPUJ1dHRvbihzZWxmLmZyYW1lQ29sb3VyU2V0LHRleHQ9J0Nob29zZSBDb2xvdXIgZm9yIDonLAorICAgICAgICAgICAgY29tbWFuZD1zZWxmLkdldENvbG91cixoaWdobGlnaHR0aGlja25lc3M9MCkKKyAgICAgICAgc2VsZi5vcHRNZW51SGlnaGxpZ2h0VGFyZ2V0PUR5bk9wdGlvbk1lbnUoc2VsZi5mcmFtZUNvbG91clNldCwKKyAgICAgICAgICAgIHNlbGYuaGlnaGxpZ2h0VGFyZ2V0LE5vbmUsaGlnaGxpZ2h0dGhpY2tuZXNzPTApIyxjb21tYW5kPXNlbGYuU2V0SGlnaGxpZ2h0VGFyZ2V0QmluZGluZworICAgICAgICBzZWxmLnJhZGlvRmc9UmFkaW9idXR0b24oZnJhbWVGZ0JnLHZhcmlhYmxlPXNlbGYuZmdIaWxpdGUsCisgICAgICAgICAgICB2YWx1ZT0xLHRleHQ9J0ZvcmVncm91bmQnLGNvbW1hbmQ9c2VsZi5TZXRDb2xvdXJTYW1wbGVCaW5kaW5nKQorICAgICAgICBzZWxmLnJhZGlvQmc9UmFkaW9idXR0b24oZnJhbWVGZ0JnLHZhcmlhYmxlPXNlbGYuZmdIaWxpdGUsCisgICAgICAgICAgICB2YWx1ZT0wLHRleHQ9J0JhY2tncm91bmQnLGNvbW1hbmQ9c2VsZi5TZXRDb2xvdXJTYW1wbGVCaW5kaW5nKQorICAgICAgICBzZWxmLmZnSGlsaXRlLnNldCgxKQorICAgICAgICBidXR0b25TYXZlQ3VzdG9tVGhlbWU9QnV0dG9uKGZyYW1lQ3VzdG9tLAorICAgICAgICAgICAgdGV4dD0nU2F2ZSBhcyBOZXcgQ3VzdG9tIFRoZW1lJyxjb21tYW5kPXNlbGYuU2F2ZUFzTmV3VGhlbWUpCisgICAgICAgICNmcmFtZVRoZW1lCisgICAgICAgIGxhYmVsVHlwZVRpdGxlPUxhYmVsKGZyYW1lVGhlbWUsdGV4dD0nU2VsZWN0IDogJykKKyAgICAgICAgc2VsZi5yYWRpb1RoZW1lQnVpbHRpbj1SYWRpb2J1dHRvbihmcmFtZVRoZW1lLHZhcmlhYmxlPXNlbGYudGhlbWVJc0J1aWx0aW4sCisgICAgICAgICAgICB2YWx1ZT0xLGNvbW1hbmQ9c2VsZi5TZXRUaGVtZVR5cGUsdGV4dD0nYSBCdWlsdC1pbiBUaGVtZScpCisgICAgICAgIHNlbGYucmFkaW9UaGVtZUN1c3RvbT1SYWRpb2J1dHRvbihmcmFtZVRoZW1lLHZhcmlhYmxlPXNlbGYudGhlbWVJc0J1aWx0aW4sCisgICAgICAgICAgICB2YWx1ZT0wLGNvbW1hbmQ9c2VsZi5TZXRUaGVtZVR5cGUsdGV4dD0nYSBDdXN0b20gVGhlbWUnKQorICAgICAgICBzZWxmLm9wdE1lbnVUaGVtZUJ1aWx0aW49RHluT3B0aW9uTWVudShmcmFtZVRoZW1lLAorICAgICAgICAgICAgc2VsZi5idWlsdGluVGhlbWUsTm9uZSxjb21tYW5kPU5vbmUpCisgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tPUR5bk9wdGlvbk1lbnUoZnJhbWVUaGVtZSwKKyAgICAgICAgICAgIHNlbGYuY3VzdG9tVGhlbWUsTm9uZSxjb21tYW5kPU5vbmUpCisgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tVGhlbWU9QnV0dG9uKGZyYW1lVGhlbWUsdGV4dD0nRGVsZXRlIEN1c3RvbSBUaGVtZScsCisgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLkRlbGV0ZUN1c3RvbVRoZW1lKQorICAgICAgICAjI3dpZGdldCBwYWNraW5nCisgICAgICAgICNib2R5CisgICAgICAgIGZyYW1lQ3VzdG9tLnBhY2soc2lkZT1MRUZULHBhZHg9NSxwYWR5PTUsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICBmcmFtZVRoZW1lLnBhY2soc2lkZT1MRUZULHBhZHg9NSxwYWR5PTUsZmlsbD1ZKQorICAgICAgICAjZnJhbWVDdXN0b20KKyAgICAgICAgc2VsZi5mcmFtZUNvbG91clNldC5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZXhwYW5kPVRSVUUsZmlsbD1YKQorICAgICAgICBmcmFtZUZnQmcucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT0wKQorICAgICAgICBzZWxmLnRleHRIaWdobGlnaHRTYW1wbGUucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGV4cGFuZD1UUlVFLAorICAgICAgICAgICAgZmlsbD1CT1RIKQorICAgICAgICBidXR0b25TZXRDb2xvdXIucGFjayhzaWRlPVRPUCxleHBhbmQ9VFJVRSxmaWxsPVgscGFkeD04LHBhZHk9NCkKKyAgICAgICAgc2VsZi5vcHRNZW51SGlnaGxpZ2h0VGFyZ2V0LnBhY2soc2lkZT1UT1AsZXhwYW5kPVRSVUUsZmlsbD1YLHBhZHg9OCxwYWR5PTMpCisgICAgICAgIHNlbGYucmFkaW9GZy5wYWNrKHNpZGU9TEVGVCxhbmNob3I9RSkKKyAgICAgICAgc2VsZi5yYWRpb0JnLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9VykKKyAgICAgICAgYnV0dG9uU2F2ZUN1c3RvbVRoZW1lLnBhY2soc2lkZT1CT1RUT00sZmlsbD1YLHBhZHg9NSxwYWR5PTUpCisgICAgICAgICNmcmFtZVRoZW1lCisgICAgICAgIGxhYmVsVHlwZVRpdGxlLnBhY2soc2lkZT1UT1AsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgc2VsZi5yYWRpb1RoZW1lQnVpbHRpbi5wYWNrKHNpZGU9VE9QLGFuY2hvcj1XLHBhZHg9NSkKKyAgICAgICAgc2VsZi5yYWRpb1RoZW1lQ3VzdG9tLnBhY2soc2lkZT1UT1AsYW5jaG9yPVcscGFkeD01LHBhZHk9MikKKyAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVCdWlsdGluLnBhY2soc2lkZT1UT1AsZmlsbD1YLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQ3VzdG9tLnBhY2soc2lkZT1UT1AsZmlsbD1YLGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tVGhlbWUucGFjayhzaWRlPVRPUCxmaWxsPVgscGFkeD01LHBhZHk9NSkKKyAgICAgICAgcmV0dXJuIGZyYW1lCisKKyAgICBkZWYgQ3JlYXRlUGFnZUtleXMoc2VsZik6CisgICAgICAgICN0a1ZhcnMKKyAgICAgICAgc2VsZi5iaW5kaW5nVGFyZ2V0PVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmN1c3RvbUtleXM9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYua2V5c0FyZUJ1aWx0aW49Qm9vbGVhblZhcihzZWxmKQorICAgICAgICBzZWxmLmtleUJpbmRpbmc9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgICMjd2lkZ2V0IGNyZWF0aW9uCisgICAgICAgICNib2R5IGZyYW1lCisgICAgICAgIGZyYW1lPXNlbGYudGFiUGFnZXMucGFnZXNbJ0tleXMnXS5mcmFtZQorICAgICAgICAjYm9keSBzZWN0aW9uIGZyYW1lcworICAgICAgICBmcmFtZUN1c3RvbT1MYWJlbEZyYW1lKGZyYW1lLGJvcmRlcndpZHRoPTIscmVsaWVmPUdST09WRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PScgQ3VzdG9tIEtleSBCaW5kaW5ncyAnKQorICAgICAgICBmcmFtZUtleVNldHM9TGFiZWxGcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PScgS2V5IFNldCAnKQorICAgICAgICAjZnJhbWVDdXN0b20KKyAgICAgICAgZnJhbWVUYXJnZXQ9RnJhbWUoZnJhbWVDdXN0b20pCisgICAgICAgIGxhYmVsVGFyZ2V0VGl0bGU9TGFiZWwoZnJhbWVUYXJnZXQsdGV4dD0nQWN0aW9uIC0gS2V5KHMpJykKKyAgICAgICAgc2Nyb2xsVGFyZ2V0WT1TY3JvbGxiYXIoZnJhbWVUYXJnZXQpCisgICAgICAgIHNjcm9sbFRhcmdldFg9U2Nyb2xsYmFyKGZyYW1lVGFyZ2V0LG9yaWVudD1IT1JJWk9OVEFMKQorICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncz1MaXN0Ym94KGZyYW1lVGFyZ2V0LHRha2Vmb2N1cz1GQUxTRSwKKyAgICAgICAgICAgICAgICBleHBvcnRzZWxlY3Rpb249RkFMU0UpCisgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLmJpbmQoJzxCdXR0b25SZWxlYXNlLTE+JyxzZWxmLktleUJpbmRpbmdTZWxlY3RlZCkKKyAgICAgICAgc2Nyb2xsVGFyZ2V0WS5jb25maWcoY29tbWFuZD1zZWxmLmxpc3RCaW5kaW5ncy55dmlldykKKyAgICAgICAgc2Nyb2xsVGFyZ2V0WC5jb25maWcoY29tbWFuZD1zZWxmLmxpc3RCaW5kaW5ncy54dmlldykKKyAgICAgICAgc2VsZi5saXN0QmluZGluZ3MuY29uZmlnKHlzY3JvbGxjb21tYW5kPXNjcm9sbFRhcmdldFkuc2V0KQorICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5jb25maWcoeHNjcm9sbGNvbW1hbmQ9c2Nyb2xsVGFyZ2V0WC5zZXQpCisgICAgICAgIHNlbGYuYnV0dG9uTmV3S2V5cz1CdXR0b24oZnJhbWVDdXN0b20sdGV4dD0nR2V0IE5ldyBLZXlzIGZvciBTZWxlY3Rpb24nLAorICAgICAgICAgICAgY29tbWFuZD1zZWxmLkdldE5ld0tleXMsc3RhdGU9RElTQUJMRUQpCisgICAgICAgICNmcmFtZUtleVNldHMKKyAgICAgICAgZnJhbWVzID0gW0ZyYW1lKGZyYW1lS2V5U2V0cywgcGFkeD0yLCBwYWR5PTIsIGJvcmRlcndpZHRoPTApCisgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyKV0KKyAgICAgICAgc2VsZi5yYWRpb0tleXNCdWlsdGluPVJhZGlvYnV0dG9uKGZyYW1lc1swXSx2YXJpYWJsZT1zZWxmLmtleXNBcmVCdWlsdGluLAorICAgICAgICAgICAgdmFsdWU9MSxjb21tYW5kPXNlbGYuU2V0S2V5c1R5cGUsdGV4dD0nVXNlIGEgQnVpbHQtaW4gS2V5IFNldCcpCisgICAgICAgIHNlbGYucmFkaW9LZXlzQ3VzdG9tPVJhZGlvYnV0dG9uKGZyYW1lc1swXSx2YXJpYWJsZT1zZWxmLmtleXNBcmVCdWlsdGluLAorICAgICAgICAgICAgdmFsdWU9MCxjb21tYW5kPXNlbGYuU2V0S2V5c1R5cGUsdGV4dD0nVXNlIGEgQ3VzdG9tIEtleSBTZXQnKQorICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQnVpbHRpbj1EeW5PcHRpb25NZW51KGZyYW1lc1swXSwKKyAgICAgICAgICAgIHNlbGYuYnVpbHRpbktleXMsTm9uZSxjb21tYW5kPU5vbmUpCisgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b209RHluT3B0aW9uTWVudShmcmFtZXNbMF0sCisgICAgICAgICAgICBzZWxmLmN1c3RvbUtleXMsTm9uZSxjb21tYW5kPU5vbmUpCisgICAgICAgIHNlbGYuYnV0dG9uRGVsZXRlQ3VzdG9tS2V5cz1CdXR0b24oZnJhbWVzWzFdLHRleHQ9J0RlbGV0ZSBDdXN0b20gS2V5IFNldCcsCisgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLkRlbGV0ZUN1c3RvbUtleXMpCisgICAgICAgIGJ1dHRvblNhdmVDdXN0b21LZXlzPUJ1dHRvbihmcmFtZXNbMV0sCisgICAgICAgICAgICAgICAgdGV4dD0nU2F2ZSBhcyBOZXcgQ3VzdG9tIEtleSBTZXQnLGNvbW1hbmQ9c2VsZi5TYXZlQXNOZXdLZXlTZXQpCisgICAgICAgICMjd2lkZ2V0IHBhY2tpbmcKKyAgICAgICAgI2JvZHkKKyAgICAgICAgZnJhbWVDdXN0b20ucGFjayhzaWRlPUJPVFRPTSxwYWR4PTUscGFkeT01LGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgZnJhbWVLZXlTZXRzLnBhY2soc2lkZT1CT1RUT00scGFkeD01LHBhZHk9NSxmaWxsPUJPVEgpCisgICAgICAgICNmcmFtZUN1c3RvbQorICAgICAgICBzZWxmLmJ1dHRvbk5ld0tleXMucGFjayhzaWRlPUJPVFRPTSxmaWxsPVgscGFkeD01LHBhZHk9NSkKKyAgICAgICAgZnJhbWVUYXJnZXQucGFjayhzaWRlPUxFRlQscGFkeD01LHBhZHk9NSxleHBhbmQ9VFJVRSxmaWxsPUJPVEgpCisgICAgICAgICNmcmFtZSB0YXJnZXQKKyAgICAgICAgZnJhbWVUYXJnZXQuY29sdW1uY29uZmlndXJlKDAsd2VpZ2h0PTEpCisgICAgICAgIGZyYW1lVGFyZ2V0LnJvd2NvbmZpZ3VyZSgxLHdlaWdodD0xKQorICAgICAgICBsYWJlbFRhcmdldFRpdGxlLmdyaWQocm93PTAsY29sdW1uPTAsY29sdW1uc3Bhbj0yLHN0aWNreT1XKQorICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5ncmlkKHJvdz0xLGNvbHVtbj0wLHN0aWNreT1OU0VXKQorICAgICAgICBzY3JvbGxUYXJnZXRZLmdyaWQocm93PTEsY29sdW1uPTEsc3RpY2t5PU5TKQorICAgICAgICBzY3JvbGxUYXJnZXRYLmdyaWQocm93PTIsY29sdW1uPTAsc3RpY2t5PUVXKQorICAgICAgICAjZnJhbWVLZXlTZXRzCisgICAgICAgIHNlbGYucmFkaW9LZXlzQnVpbHRpbi5ncmlkKHJvdz0wLCBjb2x1bW49MCwgc3RpY2t5PVcrTlMpCisgICAgICAgIHNlbGYucmFkaW9LZXlzQ3VzdG9tLmdyaWQocm93PTEsIGNvbHVtbj0wLCBzdGlja3k9VytOUykKKyAgICAgICAgc2VsZi5vcHRNZW51S2V5c0J1aWx0aW4uZ3JpZChyb3c9MCwgY29sdW1uPTEsIHN0aWNreT1OU0VXKQorICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQ3VzdG9tLmdyaWQocm93PTEsIGNvbHVtbj0xLCBzdGlja3k9TlNFVykKKyAgICAgICAgc2VsZi5idXR0b25EZWxldGVDdXN0b21LZXlzLnBhY2soc2lkZT1MRUZULGZpbGw9WCxleHBhbmQ9VHJ1ZSxwYWR4PTIpCisgICAgICAgIGJ1dHRvblNhdmVDdXN0b21LZXlzLnBhY2soc2lkZT1MRUZULGZpbGw9WCxleHBhbmQ9VHJ1ZSxwYWR4PTIpCisgICAgICAgIGZyYW1lc1swXS5wYWNrKHNpZGU9VE9QLCBmaWxsPUJPVEgsIGV4cGFuZD1UcnVlKQorICAgICAgICBmcmFtZXNbMV0ucGFjayhzaWRlPVRPUCwgZmlsbD1YLCBleHBhbmQ9VHJ1ZSwgcGFkeT0yKQorICAgICAgICByZXR1cm4gZnJhbWUKKworICAgIGRlZiBDcmVhdGVQYWdlR2VuZXJhbChzZWxmKToKKyAgICAgICAgI3RrVmFycworICAgICAgICBzZWxmLndpbldpZHRoPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLndpbkhlaWdodD1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5wYXJhV2lkdGg9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYuc3RhcnR1cEVkaXQ9SW50VmFyKHNlbGYpCisgICAgICAgIHNlbGYuYXV0b1NhdmU9SW50VmFyKHNlbGYpCisgICAgICAgIHNlbGYuZW5jb2Rpbmc9U3RyaW5nVmFyKHNlbGYpCisgICAgICAgIHNlbGYudXNlckhlbHBCcm93c2VyPUJvb2xlYW5WYXIoc2VsZikKKyAgICAgICAgc2VsZi5oZWxwQnJvd3Nlcj1TdHJpbmdWYXIoc2VsZikKKyAgICAgICAgI3dpZGdldCBjcmVhdGlvbgorICAgICAgICAjYm9keQorICAgICAgICBmcmFtZT1zZWxmLnRhYlBhZ2VzLnBhZ2VzWydHZW5lcmFsJ10uZnJhbWUKKyAgICAgICAgI2JvZHkgc2VjdGlvbiBmcmFtZXMKKyAgICAgICAgZnJhbWVSdW49TGFiZWxGcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0nIFN0YXJ0dXAgUHJlZmVyZW5jZXMgJykKKyAgICAgICAgZnJhbWVTYXZlPUxhYmVsRnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PScgQXV0b3NhdmUgUHJlZmVyZW5jZXMgJykKKyAgICAgICAgZnJhbWVXaW5TaXplPUZyYW1lKGZyYW1lLGJvcmRlcndpZHRoPTIscmVsaWVmPUdST09WRSkKKyAgICAgICAgZnJhbWVQYXJhU2l6ZT1GcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUpCisgICAgICAgIGZyYW1lRW5jb2Rpbmc9RnJhbWUoZnJhbWUsYm9yZGVyd2lkdGg9MixyZWxpZWY9R1JPT1ZFKQorICAgICAgICBmcmFtZUhlbHA9TGFiZWxGcmFtZShmcmFtZSxib3JkZXJ3aWR0aD0yLHJlbGllZj1HUk9PVkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9JyBBZGRpdGlvbmFsIEhlbHAgU291cmNlcyAnKQorICAgICAgICAjZnJhbWVSdW4KKyAgICAgICAgbGFiZWxSdW5DaG9pY2VUaXRsZT1MYWJlbChmcmFtZVJ1bix0ZXh0PSdBdCBTdGFydHVwJykKKyAgICAgICAgcmFkaW9TdGFydHVwRWRpdD1SYWRpb2J1dHRvbihmcmFtZVJ1bix2YXJpYWJsZT1zZWxmLnN0YXJ0dXBFZGl0LAorICAgICAgICAgICAgdmFsdWU9MSxjb21tYW5kPXNlbGYuU2V0S2V5c1R5cGUsdGV4dD0iT3BlbiBFZGl0IFdpbmRvdyIpCisgICAgICAgIHJhZGlvU3RhcnR1cFNoZWxsPVJhZGlvYnV0dG9uKGZyYW1lUnVuLHZhcmlhYmxlPXNlbGYuc3RhcnR1cEVkaXQsCisgICAgICAgICAgICB2YWx1ZT0wLGNvbW1hbmQ9c2VsZi5TZXRLZXlzVHlwZSx0ZXh0PSdPcGVuIFNoZWxsIFdpbmRvdycpCisgICAgICAgICNmcmFtZVNhdmUKKyAgICAgICAgbGFiZWxSdW5TYXZlVGl0bGU9TGFiZWwoZnJhbWVTYXZlLHRleHQ9J0F0IFN0YXJ0IG9mIFJ1biAoRjUpICAnKQorICAgICAgICByYWRpb1NhdmVBc2s9UmFkaW9idXR0b24oZnJhbWVTYXZlLHZhcmlhYmxlPXNlbGYuYXV0b1NhdmUsCisgICAgICAgICAgICB2YWx1ZT0wLGNvbW1hbmQ9c2VsZi5TZXRLZXlzVHlwZSx0ZXh0PSJQcm9tcHQgdG8gU2F2ZSIpCisgICAgICAgIHJhZGlvU2F2ZUF1dG89UmFkaW9idXR0b24oZnJhbWVTYXZlLHZhcmlhYmxlPXNlbGYuYXV0b1NhdmUsCisgICAgICAgICAgICB2YWx1ZT0xLGNvbW1hbmQ9c2VsZi5TZXRLZXlzVHlwZSx0ZXh0PSdObyBQcm9tcHQnKQorICAgICAgICAjZnJhbWVXaW5TaXplCisgICAgICAgIGxhYmVsV2luU2l6ZVRpdGxlPUxhYmVsKGZyYW1lV2luU2l6ZSx0ZXh0PSdJbml0aWFsIFdpbmRvdyBTaXplJysKKyAgICAgICAgICAgICAgICAnICAoaW4gY2hhcmFjdGVycyknKQorICAgICAgICBsYWJlbFdpbldpZHRoVGl0bGU9TGFiZWwoZnJhbWVXaW5TaXplLHRleHQ9J1dpZHRoJykKKyAgICAgICAgZW50cnlXaW5XaWR0aD1FbnRyeShmcmFtZVdpblNpemUsdGV4dHZhcmlhYmxlPXNlbGYud2luV2lkdGgsCisgICAgICAgICAgICAgICAgd2lkdGg9MykKKyAgICAgICAgbGFiZWxXaW5IZWlnaHRUaXRsZT1MYWJlbChmcmFtZVdpblNpemUsdGV4dD0nSGVpZ2h0JykKKyAgICAgICAgZW50cnlXaW5IZWlnaHQ9RW50cnkoZnJhbWVXaW5TaXplLHRleHR2YXJpYWJsZT1zZWxmLndpbkhlaWdodCwKKyAgICAgICAgICAgICAgICB3aWR0aD0zKQorICAgICAgICAjcGFyYWdyYXBoRm9ybWF0V2lkdGgKKyAgICAgICAgbGFiZWxQYXJhV2lkdGhUaXRsZT1MYWJlbChmcmFtZVBhcmFTaXplLHRleHQ9J1BhcmFncmFwaCByZWZvcm1hdCcrCisgICAgICAgICAgICAgICAgJyB3aWR0aCAoaW4gY2hhcmFjdGVycyknKQorICAgICAgICBlbnRyeVBhcmFXaWR0aD1FbnRyeShmcmFtZVBhcmFTaXplLHRleHR2YXJpYWJsZT1zZWxmLnBhcmFXaWR0aCwKKyAgICAgICAgICAgICAgICB3aWR0aD0zKQorICAgICAgICAjZnJhbWVFbmNvZGluZworICAgICAgICBsYWJlbEVuY29kaW5nVGl0bGU9TGFiZWwoZnJhbWVFbmNvZGluZyx0ZXh0PSJEZWZhdWx0IFNvdXJjZSBFbmNvZGluZyIpCisgICAgICAgIHJhZGlvRW5jTG9jYWxlPVJhZGlvYnV0dG9uKGZyYW1lRW5jb2RpbmcsdmFyaWFibGU9c2VsZi5lbmNvZGluZywKKyAgICAgICAgICAgIHZhbHVlPSJsb2NhbGUiLHRleHQ9IkxvY2FsZS1kZWZpbmVkIikKKyAgICAgICAgcmFkaW9FbmNVVEY4PVJhZGlvYnV0dG9uKGZyYW1lRW5jb2RpbmcsdmFyaWFibGU9c2VsZi5lbmNvZGluZywKKyAgICAgICAgICAgIHZhbHVlPSJ1dGYtOCIsdGV4dD0iVVRGLTgiKQorICAgICAgICByYWRpb0VuY05vbmU9UmFkaW9idXR0b24oZnJhbWVFbmNvZGluZyx2YXJpYWJsZT1zZWxmLmVuY29kaW5nLAorICAgICAgICAgICAgdmFsdWU9Im5vbmUiLHRleHQ9Ik5vbmUiKQorICAgICAgICAjZnJhbWVIZWxwCisgICAgICAgIGZyYW1lSGVscExpc3Q9RnJhbWUoZnJhbWVIZWxwKQorICAgICAgICBmcmFtZUhlbHBMaXN0QnV0dG9ucz1GcmFtZShmcmFtZUhlbHBMaXN0KQorICAgICAgICBzY3JvbGxIZWxwTGlzdD1TY3JvbGxiYXIoZnJhbWVIZWxwTGlzdCkKKyAgICAgICAgc2VsZi5saXN0SGVscD1MaXN0Ym94KGZyYW1lSGVscExpc3QsaGVpZ2h0PTUsdGFrZWZvY3VzPUZBTFNFLAorICAgICAgICAgICAgICAgIGV4cG9ydHNlbGVjdGlvbj1GQUxTRSkKKyAgICAgICAgc2Nyb2xsSGVscExpc3QuY29uZmlnKGNvbW1hbmQ9c2VsZi5saXN0SGVscC55dmlldykKKyAgICAgICAgc2VsZi5saXN0SGVscC5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2Nyb2xsSGVscExpc3Quc2V0KQorICAgICAgICBzZWxmLmxpc3RIZWxwLmJpbmQoJzxCdXR0b25SZWxlYXNlLTE+JyxzZWxmLkhlbHBTb3VyY2VTZWxlY3RlZCkKKyAgICAgICAgc2VsZi5idXR0b25IZWxwTGlzdEVkaXQ9QnV0dG9uKGZyYW1lSGVscExpc3RCdXR0b25zLHRleHQ9J0VkaXQnLAorICAgICAgICAgICAgICAgIHN0YXRlPURJU0FCTEVELHdpZHRoPTgsY29tbWFuZD1zZWxmLkhlbHBMaXN0SXRlbUVkaXQpCisgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RBZGQ9QnV0dG9uKGZyYW1lSGVscExpc3RCdXR0b25zLHRleHQ9J0FkZCcsCisgICAgICAgICAgICAgICAgd2lkdGg9OCxjb21tYW5kPXNlbGYuSGVscExpc3RJdGVtQWRkKQorICAgICAgICBzZWxmLmJ1dHRvbkhlbHBMaXN0UmVtb3ZlPUJ1dHRvbihmcmFtZUhlbHBMaXN0QnV0dG9ucyx0ZXh0PSdSZW1vdmUnLAorICAgICAgICAgICAgICAgIHN0YXRlPURJU0FCTEVELHdpZHRoPTgsY29tbWFuZD1zZWxmLkhlbHBMaXN0SXRlbVJlbW92ZSkKKyAgICAgICAgI3dpZGdldCBwYWNraW5nCisgICAgICAgICNib2R5CisgICAgICAgIGZyYW1lUnVuLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9NSxmaWxsPVgpCisgICAgICAgIGZyYW1lU2F2ZS5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZmlsbD1YKQorICAgICAgICBmcmFtZVdpblNpemUucGFjayhzaWRlPVRPUCxwYWR4PTUscGFkeT01LGZpbGw9WCkKKyAgICAgICAgZnJhbWVQYXJhU2l6ZS5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZmlsbD1YKQorICAgICAgICBmcmFtZUVuY29kaW5nLnBhY2soc2lkZT1UT1AscGFkeD01LHBhZHk9NSxmaWxsPVgpCisgICAgICAgIGZyYW1lSGVscC5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICAjZnJhbWVSdW4KKyAgICAgICAgbGFiZWxSdW5DaG9pY2VUaXRsZS5wYWNrKHNpZGU9TEVGVCxhbmNob3I9VyxwYWR4PTUscGFkeT01KQorICAgICAgICByYWRpb1N0YXJ0dXBTaGVsbC5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgcmFkaW9TdGFydHVwRWRpdC5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgI2ZyYW1lU2F2ZQorICAgICAgICBsYWJlbFJ1blNhdmVUaXRsZS5wYWNrKHNpZGU9TEVGVCxhbmNob3I9VyxwYWR4PTUscGFkeT01KQorICAgICAgICByYWRpb1NhdmVBdXRvLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9VyxwYWR4PTUscGFkeT01KQorICAgICAgICByYWRpb1NhdmVBc2sucGFjayhzaWRlPVJJR0hULGFuY2hvcj1XLHBhZHg9NSxwYWR5PTUpCisgICAgICAgICNmcmFtZVdpblNpemUKKyAgICAgICAgbGFiZWxXaW5TaXplVGl0bGUucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgZW50cnlXaW5IZWlnaHQucGFjayhzaWRlPVJJR0hULGFuY2hvcj1FLHBhZHg9MTAscGFkeT01KQorICAgICAgICBsYWJlbFdpbkhlaWdodFRpdGxlLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9RSxwYWR5PTUpCisgICAgICAgIGVudHJ5V2luV2lkdGgucGFjayhzaWRlPVJJR0hULGFuY2hvcj1FLHBhZHg9MTAscGFkeT01KQorICAgICAgICBsYWJlbFdpbldpZHRoVGl0bGUucGFjayhzaWRlPVJJR0hULGFuY2hvcj1FLHBhZHk9NSkKKyAgICAgICAgI3BhcmFncmFwaEZvcm1hdFdpZHRoCisgICAgICAgIGxhYmVsUGFyYVdpZHRoVGl0bGUucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgZW50cnlQYXJhV2lkdGgucGFjayhzaWRlPVJJR0hULGFuY2hvcj1FLHBhZHg9MTAscGFkeT01KQorICAgICAgICAjZnJhbWVFbmNvZGluZworICAgICAgICBsYWJlbEVuY29kaW5nVGl0bGUucGFjayhzaWRlPUxFRlQsYW5jaG9yPVcscGFkeD01LHBhZHk9NSkKKyAgICAgICAgcmFkaW9FbmNOb25lLnBhY2soc2lkZT1SSUdIVCxhbmNob3I9RSxwYWR5PTUpCisgICAgICAgIHJhZGlvRW5jVVRGOC5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPUUscGFkeT01KQorICAgICAgICByYWRpb0VuY0xvY2FsZS5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPUUscGFkeT01KQorICAgICAgICAjZnJhbWVIZWxwCisgICAgICAgIGZyYW1lSGVscExpc3RCdXR0b25zLnBhY2soc2lkZT1SSUdIVCxwYWR4PTUscGFkeT01LGZpbGw9WSkKKyAgICAgICAgZnJhbWVIZWxwTGlzdC5wYWNrKHNpZGU9VE9QLHBhZHg9NSxwYWR5PTUsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICBzY3JvbGxIZWxwTGlzdC5wYWNrKHNpZGU9UklHSFQsYW5jaG9yPVcsZmlsbD1ZKQorICAgICAgICBzZWxmLmxpc3RIZWxwLnBhY2soc2lkZT1MRUZULGFuY2hvcj1FLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5idXR0b25IZWxwTGlzdEVkaXQucGFjayhzaWRlPVRPUCxhbmNob3I9VyxwYWR5PTUpCisgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RBZGQucGFjayhzaWRlPVRPUCxhbmNob3I9VykKKyAgICAgICAgc2VsZi5idXR0b25IZWxwTGlzdFJlbW92ZS5wYWNrKHNpZGU9VE9QLGFuY2hvcj1XLHBhZHk9NSkKKyAgICAgICAgcmV0dXJuIGZyYW1lCisKKyAgICBkZWYgQXR0YWNoVmFyQ2FsbGJhY2tzKHNlbGYpOgorICAgICAgICBzZWxmLmZvbnRTaXplLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfZm9udFNpemUpCisgICAgICAgIHNlbGYuZm9udE5hbWUudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9mb250TmFtZSkKKyAgICAgICAgc2VsZi5mb250Qm9sZC50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2ZvbnRCb2xkKQorICAgICAgICBzZWxmLnNwYWNlTnVtLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfc3BhY2VOdW0pCisgICAgICAgIHNlbGYuY29sb3VyLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfY29sb3VyKQorICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZS50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2J1aWx0aW5UaGVtZSkKKyAgICAgICAgc2VsZi5jdXN0b21UaGVtZS50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2N1c3RvbVRoZW1lKQorICAgICAgICBzZWxmLnRoZW1lSXNCdWlsdGluLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfdGhlbWVJc0J1aWx0aW4pCisgICAgICAgIHNlbGYuaGlnaGxpZ2h0VGFyZ2V0LnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfaGlnaGxpZ2h0VGFyZ2V0KQorICAgICAgICBzZWxmLmtleUJpbmRpbmcudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9rZXlCaW5kaW5nKQorICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfYnVpbHRpbktleXMpCisgICAgICAgIHNlbGYuY3VzdG9tS2V5cy50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2N1c3RvbUtleXMpCisgICAgICAgIHNlbGYua2V5c0FyZUJ1aWx0aW4udHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9rZXlzQXJlQnVpbHRpbikKKyAgICAgICAgc2VsZi53aW5XaWR0aC50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX3dpbldpZHRoKQorICAgICAgICBzZWxmLndpbkhlaWdodC50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX3dpbkhlaWdodCkKKyAgICAgICAgc2VsZi5wYXJhV2lkdGgudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9wYXJhV2lkdGgpCisgICAgICAgIHNlbGYuc3RhcnR1cEVkaXQudHJhY2VfdmFyaWFibGUoJ3cnLHNlbGYuVmFyQ2hhbmdlZF9zdGFydHVwRWRpdCkKKyAgICAgICAgc2VsZi5hdXRvU2F2ZS50cmFjZV92YXJpYWJsZSgndycsc2VsZi5WYXJDaGFuZ2VkX2F1dG9TYXZlKQorICAgICAgICBzZWxmLmVuY29kaW5nLnRyYWNlX3ZhcmlhYmxlKCd3JyxzZWxmLlZhckNoYW5nZWRfZW5jb2RpbmcpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9mb250U2l6ZShzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLmZvbnRTaXplLmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdmb250LXNpemUnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfZm9udE5hbWUoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5mb250TmFtZS5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udCcsdmFsdWUpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9mb250Qm9sZChzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLmZvbnRCb2xkLmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCdmb250LWJvbGQnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfc3BhY2VOdW0oc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5zcGFjZU51bS5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnSW5kZW50JywnbnVtLXNwYWNlcycsdmFsdWUpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9jb2xvdXIoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgc2VsZi5Pbk5ld0NvbG91clNldCgpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9idWlsdGluVGhlbWUoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5idWlsdGluVGhlbWUuZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ1RoZW1lJywnbmFtZScsdmFsdWUpCisgICAgICAgIHNlbGYuUGFpbnRUaGVtZVNhbXBsZSgpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9jdXN0b21UaGVtZShzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLmN1c3RvbVRoZW1lLmdldCgpCisgICAgICAgIGlmIHZhbHVlICE9ICctIG5vIGN1c3RvbSB0aGVtZXMgLSc6CisgICAgICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnVGhlbWUnLCduYW1lJyx2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuUGFpbnRUaGVtZVNhbXBsZSgpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF90aGVtZUlzQnVpbHRpbihzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLnRoZW1lSXNCdWlsdGluLmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdUaGVtZScsJ2RlZmF1bHQnLHZhbHVlKQorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluVGhlbWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5WYXJDaGFuZ2VkX2N1c3RvbVRoZW1lKCkKKworICAgIGRlZiBWYXJDaGFuZ2VkX2hpZ2hsaWdodFRhcmdldChzZWxmLCpwYXJhbXMpOgorICAgICAgICBzZWxmLlNldEhpZ2hsaWdodFRhcmdldCgpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9rZXlCaW5kaW5nKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYua2V5QmluZGluZy5nZXQoKQorICAgICAgICBrZXlTZXQ9c2VsZi5jdXN0b21LZXlzLmdldCgpCisgICAgICAgIGV2ZW50PXNlbGYubGlzdEJpbmRpbmdzLmdldChBTkNIT1IpLnNwbGl0KClbMF0KKyAgICAgICAgaWYgaWRsZUNvbmYuSXNDb3JlQmluZGluZyhldmVudCk6CisgICAgICAgICAgICAjdGhpcyBpcyBhIGNvcmUga2V5YmluZGluZworICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgna2V5cycsa2V5U2V0LGV2ZW50LHZhbHVlKQorICAgICAgICBlbHNlOiAjdGhpcyBpcyBhbiBleHRlbnNpb24ga2V5IGJpbmRpbmcKKyAgICAgICAgICAgIGV4dE5hbWU9aWRsZUNvbmYuR2V0RXh0bk5hbWVGb3JFdmVudChldmVudCkKKyAgICAgICAgICAgIGV4dEtleWJpbmRTZWN0aW9uPWV4dE5hbWUrJ19jZmdCaW5kaW5ncycKKyAgICAgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ2V4dGVuc2lvbnMnLGV4dEtleWJpbmRTZWN0aW9uLGV2ZW50LHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfYnVpbHRpbktleXMoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5idWlsdGluS2V5cy5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnS2V5cycsJ25hbWUnLHZhbHVlKQorICAgICAgICBzZWxmLkxvYWRLZXlzTGlzdCh2YWx1ZSkKKworICAgIGRlZiBWYXJDaGFuZ2VkX2N1c3RvbUtleXMoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5jdXN0b21LZXlzLmdldCgpCisgICAgICAgIGlmIHZhbHVlICE9ICctIG5vIGN1c3RvbSBrZXlzIC0nOgorICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0tleXMnLCduYW1lJyx2YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuTG9hZEtleXNMaXN0KHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfa2V5c0FyZUJ1aWx0aW4oc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5rZXlzQXJlQnVpbHRpbi5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnS2V5cycsJ2RlZmF1bHQnLHZhbHVlKQorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHNlbGYuVmFyQ2hhbmdlZF9idWlsdGluS2V5cygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLlZhckNoYW5nZWRfY3VzdG9tS2V5cygpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF93aW5XaWR0aChzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLndpbldpZHRoLmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdFZGl0b3JXaW5kb3cnLCd3aWR0aCcsdmFsdWUpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF93aW5IZWlnaHQoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi53aW5IZWlnaHQuZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0VkaXRvcldpbmRvdycsJ2hlaWdodCcsdmFsdWUpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9wYXJhV2lkdGgoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5wYXJhV2lkdGguZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0Zvcm1hdFBhcmFncmFwaCcsJ3BhcmFncmFwaCcsdmFsdWUpCisKKyAgICBkZWYgVmFyQ2hhbmdlZF9zdGFydHVwRWRpdChzZWxmLCpwYXJhbXMpOgorICAgICAgICB2YWx1ZT1zZWxmLnN0YXJ0dXBFZGl0LmdldCgpCisgICAgICAgIHNlbGYuQWRkQ2hhbmdlZEl0ZW0oJ21haW4nLCdHZW5lcmFsJywnZWRpdG9yLW9uLXN0YXJ0dXAnLHZhbHVlKQorCisgICAgZGVmIFZhckNoYW5nZWRfYXV0b1NhdmUoc2VsZiwqcGFyYW1zKToKKyAgICAgICAgdmFsdWU9c2VsZi5hdXRvU2F2ZS5nZXQoKQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdtYWluJywnR2VuZXJhbCcsJ2F1dG9zYXZlJyx2YWx1ZSkKKworICAgIGRlZiBWYXJDaGFuZ2VkX2VuY29kaW5nKHNlbGYsKnBhcmFtcyk6CisgICAgICAgIHZhbHVlPXNlbGYuZW5jb2RpbmcuZ2V0KCkKKyAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0VkaXRvcldpbmRvdycsJ2VuY29kaW5nJyx2YWx1ZSkKKworICAgIGRlZiBSZXNldENoYW5nZWRJdGVtcyhzZWxmKToKKyAgICAgICAgI1doZW4gYW55IGNvbmZpZyBpdGVtIGlzIGNoYW5nZWQgaW4gdGhpcyBkaWFsb2csIGFuIGVudHJ5CisgICAgICAgICNzaG91bGQgYmUgbWFkZSBpbiB0aGUgcmVsZXZhbnQgc2VjdGlvbiAoY29uZmlnIHR5cGUpIG9mIHRoaXMKKyAgICAgICAgI2RpY3Rpb25hcnkuIFRoZSBrZXkgc2hvdWxkIGJlIHRoZSBjb25maWcgZmlsZSBzZWN0aW9uIG5hbWUgYW5kIHRoZQorICAgICAgICAjdmFsdWUgYSBkaWN0aW9uYXJ5LCB3aG9zZSBrZXk6dmFsdWUgcGFpcnMgYXJlIGl0ZW09dmFsdWUgcGFpcnMgZm9yCisgICAgICAgICN0aGF0IGNvbmZpZyBmaWxlIHNlY3Rpb24uCisgICAgICAgIHNlbGYuY2hhbmdlZEl0ZW1zPXsnbWFpbic6e30sJ2hpZ2hsaWdodCc6e30sJ2tleXMnOnt9LCdleHRlbnNpb25zJzp7fX0KKworICAgIGRlZiBBZGRDaGFuZ2VkSXRlbShzZWxmLHR5cGUsc2VjdGlvbixpdGVtLHZhbHVlKToKKyAgICAgICAgdmFsdWU9c3RyKHZhbHVlKSAjbWFrZSBzdXJlIHdlIHVzZSBhIHN0cmluZworICAgICAgICBpZiBzZWN0aW9uIG5vdCBpbiBzZWxmLmNoYW5nZWRJdGVtc1t0eXBlXToKKyAgICAgICAgICAgIHNlbGYuY2hhbmdlZEl0ZW1zW3R5cGVdW3NlY3Rpb25dPXt9CisgICAgICAgIHNlbGYuY2hhbmdlZEl0ZW1zW3R5cGVdW3NlY3Rpb25dW2l0ZW1dPXZhbHVlCisKKyAgICBkZWYgR2V0RGVmYXVsdEl0ZW1zKHNlbGYpOgorICAgICAgICBkSXRlbXM9eydtYWluJzp7fSwnaGlnaGxpZ2h0Jzp7fSwna2V5cyc6e30sJ2V4dGVuc2lvbnMnOnt9fQorICAgICAgICBmb3IgY29uZmlnVHlwZSBpbiBkSXRlbXMua2V5cygpOgorICAgICAgICAgICAgc2VjdGlvbnM9aWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ2RlZmF1bHQnLGNvbmZpZ1R5cGUpCisgICAgICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWN0aW9uczoKKyAgICAgICAgICAgICAgICBkSXRlbXNbY29uZmlnVHlwZV1bc2VjdGlvbl09e30KKyAgICAgICAgICAgICAgICBvcHRpb25zPWlkbGVDb25mLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0uR2V0T3B0aW9uTGlzdChzZWN0aW9uKQorICAgICAgICAgICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgZEl0ZW1zW2NvbmZpZ1R5cGVdW3NlY3Rpb25dW29wdGlvbl09KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkbGVDb25mLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0uR2V0KHNlY3Rpb24sb3B0aW9uKSkKKyAgICAgICAgcmV0dXJuIGRJdGVtcworCisgICAgZGVmIFNldFRoZW1lVHlwZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50aGVtZUlzQnVpbHRpbi5nZXQoKToKKyAgICAgICAgICAgIHNlbGYub3B0TWVudVRoZW1lQnVpbHRpbi5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVDdXN0b20uY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgc2VsZi5idXR0b25EZWxldGVDdXN0b21UaGVtZS5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm9wdE1lbnVUaGVtZUJ1aWx0aW4uY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgc2VsZi5yYWRpb1RoZW1lQ3VzdG9tLmNvbmZpZyhzdGF0ZT1OT1JNQUwpCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVUaGVtZUN1c3RvbS5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgc2VsZi5idXR0b25EZWxldGVDdXN0b21UaGVtZS5jb25maWcoc3RhdGU9Tk9STUFMKQorCisgICAgZGVmIFNldEtleXNUeXBlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmtleXNBcmVCdWlsdGluLmdldCgpOgorICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0J1aWx0aW4uY29uZmlnKHN0YXRlPU5PUk1BTCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNDdXN0b20uY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgc2VsZi5idXR0b25EZWxldGVDdXN0b21LZXlzLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYucmFkaW9LZXlzQ3VzdG9tLmNvbmZpZyhzdGF0ZT1OT1JNQUwpCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQ3VzdG9tLmNvbmZpZyhzdGF0ZT1OT1JNQUwpCisgICAgICAgICAgICBzZWxmLmJ1dHRvbkRlbGV0ZUN1c3RvbUtleXMuY29uZmlnKHN0YXRlPU5PUk1BTCkKKworICAgIGRlZiBHZXROZXdLZXlzKHNlbGYpOgorICAgICAgICBsaXN0SW5kZXg9c2VsZi5saXN0QmluZGluZ3MuaW5kZXgoQU5DSE9SKQorICAgICAgICBiaW5kaW5nPXNlbGYubGlzdEJpbmRpbmdzLmdldChsaXN0SW5kZXgpCisgICAgICAgIGJpbmROYW1lPWJpbmRpbmcuc3BsaXQoKVswXSAjZmlyc3QgcGFydCwgdXAgdG8gZmlyc3Qgc3BhY2UKKyAgICAgICAgaWYgc2VsZi5rZXlzQXJlQnVpbHRpbi5nZXQoKToKKyAgICAgICAgICAgIGN1cnJlbnRLZXlTZXROYW1lPXNlbGYuYnVpbHRpbktleXMuZ2V0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGN1cnJlbnRLZXlTZXROYW1lPXNlbGYuY3VzdG9tS2V5cy5nZXQoKQorICAgICAgICBjdXJyZW50QmluZGluZ3M9aWRsZUNvbmYuR2V0Q3VycmVudEtleVNldCgpCisgICAgICAgIGlmIGN1cnJlbnRLZXlTZXROYW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ10ua2V5cygpOiAjdW5zYXZlZCBjaGFuZ2VzCisgICAgICAgICAgICBrZXlTZXRDaGFuZ2VzPXNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ11bY3VycmVudEtleVNldE5hbWVdCisgICAgICAgICAgICBmb3IgZXZlbnQgaW4ga2V5U2V0Q2hhbmdlcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgY3VycmVudEJpbmRpbmdzW2V2ZW50XT1rZXlTZXRDaGFuZ2VzW2V2ZW50XS5zcGxpdCgpCisgICAgICAgIGN1cnJlbnRLZXlTZXF1ZW5jZXM9Y3VycmVudEJpbmRpbmdzLnZhbHVlcygpCisgICAgICAgIG5ld0tleXM9R2V0S2V5c0RpYWxvZyhzZWxmLCdHZXQgTmV3IEtleXMnLGJpbmROYW1lLAorICAgICAgICAgICAgICAgIGN1cnJlbnRLZXlTZXF1ZW5jZXMpLnJlc3VsdAorICAgICAgICBpZiBuZXdLZXlzOiAjbmV3IGtleXMgd2VyZSBzcGVjaWZpZWQKKyAgICAgICAgICAgIGlmIHNlbGYua2V5c0FyZUJ1aWx0aW4uZ2V0KCk6ICNjdXJyZW50IGtleSBzZXQgaXMgYSBidWlsdC1pbgorICAgICAgICAgICAgICAgIG1lc3NhZ2U9KCdZb3VyIGNoYW5nZXMgd2lsbCBiZSBzYXZlZCBhcyBhIG5ldyBDdXN0b20gS2V5IFNldC4gJysKKyAgICAgICAgICAgICAgICAgICAgICAgICdFbnRlciBhIG5hbWUgZm9yIHlvdXIgbmV3IEN1c3RvbSBLZXkgU2V0IGJlbG93LicpCisgICAgICAgICAgICAgICAgbmV3S2V5U2V0PXNlbGYuR2V0TmV3S2V5c05hbWUobWVzc2FnZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgbmV3S2V5U2V0OiAjdXNlciBjYW5jZWxsZWQgY3VzdG9tIGtleSBzZXQgY3JlYXRpb24KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3Muc2VsZWN0X3NldChsaXN0SW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLnNlbGVjdF9hbmNob3IobGlzdEluZGV4KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbHNlOiAjY3JlYXRlIG5ldyBjdXN0b20ga2V5IHNldCBiYXNlZCBvbiBwcmV2aW91c2x5IGFjdGl2ZSBrZXkgc2V0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuQ3JlYXRlTmV3S2V5U2V0KG5ld0tleVNldCkKKyAgICAgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLmRlbGV0ZShsaXN0SW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5pbnNlcnQobGlzdEluZGV4LGJpbmROYW1lKycgLSAnK25ld0tleXMpCisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5zZWxlY3Rfc2V0KGxpc3RJbmRleCkKKyAgICAgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLnNlbGVjdF9hbmNob3IobGlzdEluZGV4KQorICAgICAgICAgICAgc2VsZi5rZXlCaW5kaW5nLnNldChuZXdLZXlzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3Muc2VsZWN0X3NldChsaXN0SW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5zZWxlY3RfYW5jaG9yKGxpc3RJbmRleCkKKworICAgIGRlZiBHZXROZXdLZXlzTmFtZShzZWxmLG1lc3NhZ2UpOgorICAgICAgICB1c2VkTmFtZXM9KGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywna2V5cycpKworICAgICAgICAgICAgICAgIGlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0Jywna2V5cycpKQorICAgICAgICBuZXdLZXlTZXQ9R2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2coc2VsZiwnTmV3IEN1c3RvbSBLZXkgU2V0JywKKyAgICAgICAgICAgICAgICBtZXNzYWdlLHVzZWROYW1lcykucmVzdWx0CisgICAgICAgIHJldHVybiBuZXdLZXlTZXQKKworICAgIGRlZiBTYXZlQXNOZXdLZXlTZXQoc2VsZik6CisgICAgICAgIG5ld0tleXNOYW1lPXNlbGYuR2V0TmV3S2V5c05hbWUoJ05ldyBLZXkgU2V0IE5hbWU6JykKKyAgICAgICAgaWYgbmV3S2V5c05hbWU6CisgICAgICAgICAgICBzZWxmLkNyZWF0ZU5ld0tleVNldChuZXdLZXlzTmFtZSkKKworICAgIGRlZiBLZXlCaW5kaW5nU2VsZWN0ZWQoc2VsZixldmVudCk6CisgICAgICAgIHNlbGYuYnV0dG9uTmV3S2V5cy5jb25maWcoc3RhdGU9Tk9STUFMKQorCisgICAgZGVmIENyZWF0ZU5ld0tleVNldChzZWxmLG5ld0tleVNldE5hbWUpOgorICAgICAgICAjY3JlYXRlcyBuZXcgY3VzdG9tIGtleSBzZXQgYmFzZWQgb24gdGhlIHByZXZpb3VzbHkgYWN0aXZlIGtleSBzZXQsCisgICAgICAgICNhbmQgbWFrZXMgdGhlIG5ldyBrZXkgc2V0IGFjdGl2ZQorICAgICAgICBpZiBzZWxmLmtleXNBcmVCdWlsdGluLmdldCgpOgorICAgICAgICAgICAgcHJldktleVNldE5hbWU9c2VsZi5idWlsdGluS2V5cy5nZXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJldktleVNldE5hbWU9c2VsZi5jdXN0b21LZXlzLmdldCgpCisgICAgICAgIHByZXZLZXlzPWlkbGVDb25mLkdldENvcmVLZXlzKHByZXZLZXlTZXROYW1lKQorICAgICAgICBuZXdLZXlzPXt9CisgICAgICAgIGZvciBldmVudCBpbiBwcmV2S2V5cy5rZXlzKCk6ICNhZGQga2V5IHNldCB0byBjaGFuZ2VkIGl0ZW1zCisgICAgICAgICAgICBldmVudE5hbWU9ZXZlbnRbMjotMl0gI3RyaW0gb2ZmIHRoZSBhbmdsZSBicmFja2V0cworICAgICAgICAgICAgYmluZGluZz1zdHJpbmcuam9pbihwcmV2S2V5c1tldmVudF0pCisgICAgICAgICAgICBuZXdLZXlzW2V2ZW50TmFtZV09YmluZGluZworICAgICAgICAjaGFuZGxlIGFueSB1bnNhdmVkIGNoYW5nZXMgdG8gcHJldiBrZXkgc2V0CisgICAgICAgIGlmIHByZXZLZXlTZXROYW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ10ua2V5cygpOgorICAgICAgICAgICAga2V5U2V0Q2hhbmdlcz1zZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddW3ByZXZLZXlTZXROYW1lXQorICAgICAgICAgICAgZm9yIGV2ZW50IGluIGtleVNldENoYW5nZXMua2V5cygpOgorICAgICAgICAgICAgICAgIG5ld0tleXNbZXZlbnRdPWtleVNldENoYW5nZXNbZXZlbnRdCisgICAgICAgICNzYXZlIHRoZSBuZXcgdGhlbWUKKyAgICAgICAgc2VsZi5TYXZlTmV3S2V5U2V0KG5ld0tleVNldE5hbWUsbmV3S2V5cykKKyAgICAgICAgI2NoYW5nZSBndWkgb3ZlciB0byB0aGUgbmV3IGtleSBzZXQKKyAgICAgICAgY3VzdG9tS2V5TGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2tleXMnKQorICAgICAgICBjdXN0b21LZXlMaXN0LnNvcnQoKQorICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQ3VzdG9tLlNldE1lbnUoY3VzdG9tS2V5TGlzdCxuZXdLZXlTZXROYW1lKQorICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnNldCgwKQorICAgICAgICBzZWxmLlNldEtleXNUeXBlKCkKKworICAgIGRlZiBMb2FkS2V5c0xpc3Qoc2VsZixrZXlTZXROYW1lKToKKyAgICAgICAgcmVzZWxlY3Q9MAorICAgICAgICBuZXdLZXlTZXQ9MAorICAgICAgICBpZiBzZWxmLmxpc3RCaW5kaW5ncy5jdXJzZWxlY3Rpb24oKToKKyAgICAgICAgICAgIHJlc2VsZWN0PTEKKyAgICAgICAgICAgIGxpc3RJbmRleD1zZWxmLmxpc3RCaW5kaW5ncy5pbmRleChBTkNIT1IpCisgICAgICAgIGtleVNldD1pZGxlQ29uZi5HZXRLZXlTZXQoa2V5U2V0TmFtZSkKKyAgICAgICAgYmluZE5hbWVzPWtleVNldC5rZXlzKCkKKyAgICAgICAgYmluZE5hbWVzLnNvcnQoKQorICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5kZWxldGUoMCxFTkQpCisgICAgICAgIGZvciBiaW5kTmFtZSBpbiBiaW5kTmFtZXM6CisgICAgICAgICAgICBrZXk9c3RyaW5nLmpvaW4oa2V5U2V0W2JpbmROYW1lXSkgI21ha2Uga2V5KHMpIGludG8gYSBzdHJpbmcKKyAgICAgICAgICAgIGJpbmROYW1lPWJpbmROYW1lWzI6LTJdICN0cmltIG9mZiB0aGUgYW5nbGUgYnJhY2tldHMKKyAgICAgICAgICAgIGlmIGtleVNldE5hbWUgaW4gc2VsZi5jaGFuZ2VkSXRlbXNbJ2tleXMnXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgI2hhbmRsZSBhbnkgdW5zYXZlZCBjaGFuZ2VzIHRvIHRoaXMga2V5IHNldAorICAgICAgICAgICAgICAgIGlmIGJpbmROYW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ11ba2V5U2V0TmFtZV0ua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBrZXk9c2VsZi5jaGFuZ2VkSXRlbXNbJ2tleXMnXVtrZXlTZXROYW1lXVtiaW5kTmFtZV0KKyAgICAgICAgICAgIHNlbGYubGlzdEJpbmRpbmdzLmluc2VydChFTkQsIGJpbmROYW1lKycgLSAnK2tleSkKKyAgICAgICAgaWYgcmVzZWxlY3Q6CisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5zZWUobGlzdEluZGV4KQorICAgICAgICAgICAgc2VsZi5saXN0QmluZGluZ3Muc2VsZWN0X3NldChsaXN0SW5kZXgpCisgICAgICAgICAgICBzZWxmLmxpc3RCaW5kaW5ncy5zZWxlY3RfYW5jaG9yKGxpc3RJbmRleCkKKworICAgIGRlZiBEZWxldGVDdXN0b21LZXlzKHNlbGYpOgorICAgICAgICBrZXlTZXROYW1lPXNlbGYuY3VzdG9tS2V5cy5nZXQoKQorICAgICAgICBpZiBub3QgdGtNZXNzYWdlQm94LmFza3llc25vKCdEZWxldGUgS2V5IFNldCcsJ0FyZSB5b3Ugc3VyZSB5b3Ugd2lzaCAnKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0byBkZWxldGUgdGhlIGtleSBzZXQgJXIgPycgJSAoa2V5U2V0TmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICNyZW1vdmUga2V5IHNldCBmcm9tIGNvbmZpZworICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydrZXlzJ10ucmVtb3ZlX3NlY3Rpb24oa2V5U2V0TmFtZSkKKyAgICAgICAgaWYga2V5U2V0TmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1sna2V5cyddOgorICAgICAgICAgICAgZGVsKHNlbGYuY2hhbmdlZEl0ZW1zWydrZXlzJ11ba2V5U2V0TmFtZV0pCisgICAgICAgICN3cml0ZSBjaGFuZ2VzCisgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2tleXMnXS5TYXZlKCkKKyAgICAgICAgI3JlbG9hZCB1c2VyIGtleSBzZXQgbGlzdAorICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2tleXMnKQorICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgaWYgbm90IGl0ZW1MaXN0OgorICAgICAgICAgICAgc2VsZi5yYWRpb0tleXNDdXN0b20uY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5TZXRNZW51KGl0ZW1MaXN0LCctIG5vIGN1c3RvbSBrZXlzIC0nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5TZXRNZW51KGl0ZW1MaXN0LGl0ZW1MaXN0WzBdKQorICAgICAgICAjcmV2ZXJ0IHRvIGRlZmF1bHQga2V5IHNldAorICAgICAgICBzZWxmLmtleXNBcmVCdWlsdGluLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywnZGVmYXVsdCcpKQorICAgICAgICBzZWxmLmJ1aWx0aW5LZXlzLnNldChpZGxlQ29uZi5kZWZhdWx0Q2ZnWydtYWluJ10uR2V0KCdLZXlzJywnbmFtZScpKQorICAgICAgICAjdXNlciBjYW4ndCBiYWNrIG91dCBvZiB0aGVzZSBjaGFuZ2VzLCB0aGV5IG11c3QgYmUgYXBwbGllZCBub3cKKyAgICAgICAgc2VsZi5BcHBseSgpCisgICAgICAgIHNlbGYuU2V0S2V5c1R5cGUoKQorCisgICAgZGVmIERlbGV0ZUN1c3RvbVRoZW1lKHNlbGYpOgorICAgICAgICB0aGVtZU5hbWU9c2VsZi5jdXN0b21UaGVtZS5nZXQoKQorICAgICAgICBpZiBub3QgdGtNZXNzYWdlQm94LmFza3llc25vKCdEZWxldGUgVGhlbWUnLCdBcmUgeW91IHN1cmUgeW91IHdpc2ggJysKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG8gZGVsZXRlIHRoZSB0aGVtZSAlciA/JyAlICh0aGVtZU5hbWUsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgI3JlbW92ZSB0aGVtZSBmcm9tIGNvbmZpZworICAgICAgICBpZGxlQ29uZi51c2VyQ2ZnWydoaWdobGlnaHQnXS5yZW1vdmVfc2VjdGlvbih0aGVtZU5hbWUpCisgICAgICAgIGlmIHRoZW1lTmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1snaGlnaGxpZ2h0J106CisgICAgICAgICAgICBkZWwoc2VsZi5jaGFuZ2VkSXRlbXNbJ2hpZ2hsaWdodCddW3RoZW1lTmFtZV0pCisgICAgICAgICN3cml0ZSBjaGFuZ2VzCisgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2hpZ2hsaWdodCddLlNhdmUoKQorICAgICAgICAjcmVsb2FkIHVzZXIgdGhlbWUgbGlzdAorICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2hpZ2hsaWdodCcpCisgICAgICAgIGl0ZW1MaXN0LnNvcnQoKQorICAgICAgICBpZiBub3QgaXRlbUxpc3Q6CisgICAgICAgICAgICBzZWxmLnJhZGlvVGhlbWVDdXN0b20uY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVDdXN0b20uU2V0TWVudShpdGVtTGlzdCwnLSBubyBjdXN0b20gdGhlbWVzIC0nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVDdXN0b20uU2V0TWVudShpdGVtTGlzdCxpdGVtTGlzdFswXSkKKyAgICAgICAgI3JldmVydCB0byBkZWZhdWx0IHRoZW1lCisgICAgICAgIHNlbGYudGhlbWVJc0J1aWx0aW4uc2V0KGlkbGVDb25mLmRlZmF1bHRDZmdbJ21haW4nXS5HZXQoJ1RoZW1lJywnZGVmYXVsdCcpKQorICAgICAgICBzZWxmLmJ1aWx0aW5UaGVtZS5zZXQoaWRsZUNvbmYuZGVmYXVsdENmZ1snbWFpbiddLkdldCgnVGhlbWUnLCduYW1lJykpCisgICAgICAgICN1c2VyIGNhbid0IGJhY2sgb3V0IG9mIHRoZXNlIGNoYW5nZXMsIHRoZXkgbXVzdCBiZSBhcHBsaWVkIG5vdworICAgICAgICBzZWxmLkFwcGx5KCkKKyAgICAgICAgc2VsZi5TZXRUaGVtZVR5cGUoKQorCisgICAgZGVmIEdldENvbG91cihzZWxmKToKKyAgICAgICAgdGFyZ2V0PXNlbGYuaGlnaGxpZ2h0VGFyZ2V0LmdldCgpCisgICAgICAgIHByZXZDb2xvdXI9c2VsZi5mcmFtZUNvbG91clNldC5jZ2V0KCdiZycpCisgICAgICAgIHJnYlR1cGxldCwgY29sb3VyU3RyaW5nID0gdGtDb2xvckNob29zZXIuYXNrY29sb3IocGFyZW50PXNlbGYsCisgICAgICAgICAgICB0aXRsZT0nUGljayBuZXcgY29sb3VyIGZvciA6ICcrdGFyZ2V0LGluaXRpYWxjb2xvcj1wcmV2Q29sb3VyKQorICAgICAgICBpZiBjb2xvdXJTdHJpbmcgYW5kIChjb2xvdXJTdHJpbmchPXByZXZDb2xvdXIpOgorICAgICAgICAgICAgI3VzZXIgZGlkbid0IGNhbmNlbCwgYW5kIHRoZXkgY2hvc2UgYSBuZXcgY29sb3VyCisgICAgICAgICAgICBpZiBzZWxmLnRoZW1lSXNCdWlsdGluLmdldCgpOiAjY3VycmVudCB0aGVtZSBpcyBhIGJ1aWx0LWluCisgICAgICAgICAgICAgICAgbWVzc2FnZT0oJ1lvdXIgY2hhbmdlcyB3aWxsIGJlIHNhdmVkIGFzIGEgbmV3IEN1c3RvbSBUaGVtZS4gJysKKyAgICAgICAgICAgICAgICAgICAgICAgICdFbnRlciBhIG5hbWUgZm9yIHlvdXIgbmV3IEN1c3RvbSBUaGVtZSBiZWxvdy4nKQorICAgICAgICAgICAgICAgIG5ld1RoZW1lPXNlbGYuR2V0TmV3VGhlbWVOYW1lKG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgaWYgbm90IG5ld1RoZW1lOiAjdXNlciBjYW5jZWxsZWQgY3VzdG9tIHRoZW1lIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsc2U6ICNjcmVhdGUgbmV3IGN1c3RvbSB0aGVtZSBiYXNlZCBvbiBwcmV2aW91c2x5IGFjdGl2ZSB0aGVtZQorICAgICAgICAgICAgICAgICAgICBzZWxmLkNyZWF0ZU5ld1RoZW1lKG5ld1RoZW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbG91ci5zZXQoY29sb3VyU3RyaW5nKQorICAgICAgICAgICAgZWxzZTogI2N1cnJlbnQgdGhlbWUgaXMgdXNlciBkZWZpbmVkCisgICAgICAgICAgICAgICAgc2VsZi5jb2xvdXIuc2V0KGNvbG91clN0cmluZykKKworICAgIGRlZiBPbk5ld0NvbG91clNldChzZWxmKToKKyAgICAgICAgbmV3Q29sb3VyPXNlbGYuY29sb3VyLmdldCgpCisgICAgICAgIHNlbGYuZnJhbWVDb2xvdXJTZXQuY29uZmlnKGJnPW5ld0NvbG91cikjc2V0IHNhbXBsZQorICAgICAgICBpZiBzZWxmLmZnSGlsaXRlLmdldCgpOiBwbGFuZT0nZm9yZWdyb3VuZCcKKyAgICAgICAgZWxzZTogcGxhbmU9J2JhY2tncm91bmQnCisgICAgICAgIHNhbXBsZUVsZW1lbnQ9c2VsZi50aGVtZUVsZW1lbnRzW3NlbGYuaGlnaGxpZ2h0VGFyZ2V0LmdldCgpXVswXQorICAgICAgICBzZWxmLnRleHRIaWdobGlnaHRTYW1wbGUudGFnX2NvbmZpZyhzYW1wbGVFbGVtZW50LCAqKntwbGFuZTpuZXdDb2xvdXJ9KQorICAgICAgICB0aGVtZT1zZWxmLmN1c3RvbVRoZW1lLmdldCgpCisgICAgICAgIHRoZW1lRWxlbWVudD1zYW1wbGVFbGVtZW50KyctJytwbGFuZQorICAgICAgICBzZWxmLkFkZENoYW5nZWRJdGVtKCdoaWdobGlnaHQnLHRoZW1lLHRoZW1lRWxlbWVudCxuZXdDb2xvdXIpCisKKyAgICBkZWYgR2V0TmV3VGhlbWVOYW1lKHNlbGYsbWVzc2FnZSk6CisgICAgICAgIHVzZWROYW1lcz0oaWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ3VzZXInLCdoaWdobGlnaHQnKSsKKyAgICAgICAgICAgICAgICBpZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsJ2hpZ2hsaWdodCcpKQorICAgICAgICBuZXdUaGVtZT1HZXRDZmdTZWN0aW9uTmFtZURpYWxvZyhzZWxmLCdOZXcgQ3VzdG9tIFRoZW1lJywKKyAgICAgICAgICAgICAgICBtZXNzYWdlLHVzZWROYW1lcykucmVzdWx0CisgICAgICAgIHJldHVybiBuZXdUaGVtZQorCisgICAgZGVmIFNhdmVBc05ld1RoZW1lKHNlbGYpOgorICAgICAgICBuZXdUaGVtZU5hbWU9c2VsZi5HZXROZXdUaGVtZU5hbWUoJ05ldyBUaGVtZSBOYW1lOicpCisgICAgICAgIGlmIG5ld1RoZW1lTmFtZToKKyAgICAgICAgICAgIHNlbGYuQ3JlYXRlTmV3VGhlbWUobmV3VGhlbWVOYW1lKQorCisgICAgZGVmIENyZWF0ZU5ld1RoZW1lKHNlbGYsbmV3VGhlbWVOYW1lKToKKyAgICAgICAgI2NyZWF0ZXMgbmV3IGN1c3RvbSB0aGVtZSBiYXNlZCBvbiB0aGUgcHJldmlvdXNseSBhY3RpdmUgdGhlbWUsCisgICAgICAgICNhbmQgbWFrZXMgdGhlIG5ldyB0aGVtZSBhY3RpdmUKKyAgICAgICAgaWYgc2VsZi50aGVtZUlzQnVpbHRpbi5nZXQoKToKKyAgICAgICAgICAgIHRoZW1lVHlwZT0nZGVmYXVsdCcKKyAgICAgICAgICAgIHRoZW1lTmFtZT1zZWxmLmJ1aWx0aW5UaGVtZS5nZXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGhlbWVUeXBlPSd1c2VyJworICAgICAgICAgICAgdGhlbWVOYW1lPXNlbGYuY3VzdG9tVGhlbWUuZ2V0KCkKKyAgICAgICAgbmV3VGhlbWU9aWRsZUNvbmYuR2V0VGhlbWVEaWN0KHRoZW1lVHlwZSx0aGVtZU5hbWUpCisgICAgICAgICNhcHBseSBhbnkgb2YgdGhlIG9sZCB0aGVtZSdzIHVuc2F2ZWQgY2hhbmdlcyB0byB0aGUgbmV3IHRoZW1lCisgICAgICAgIGlmIHRoZW1lTmFtZSBpbiBzZWxmLmNoYW5nZWRJdGVtc1snaGlnaGxpZ2h0J10ua2V5cygpOgorICAgICAgICAgICAgdGhlbWVDaGFuZ2VzPXNlbGYuY2hhbmdlZEl0ZW1zWydoaWdobGlnaHQnXVt0aGVtZU5hbWVdCisgICAgICAgICAgICBmb3IgZWxlbWVudCBpbiB0aGVtZUNoYW5nZXMua2V5cygpOgorICAgICAgICAgICAgICAgIG5ld1RoZW1lW2VsZW1lbnRdPXRoZW1lQ2hhbmdlc1tlbGVtZW50XQorICAgICAgICAjc2F2ZSB0aGUgbmV3IHRoZW1lCisgICAgICAgIHNlbGYuU2F2ZU5ld1RoZW1lKG5ld1RoZW1lTmFtZSxuZXdUaGVtZSkKKyAgICAgICAgI2NoYW5nZSBndWkgb3ZlciB0byB0aGUgbmV3IHRoZW1lCisgICAgICAgIGN1c3RvbVRoZW1lTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2hpZ2hsaWdodCcpCisgICAgICAgIGN1c3RvbVRoZW1lTGlzdC5zb3J0KCkKKyAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVDdXN0b20uU2V0TWVudShjdXN0b21UaGVtZUxpc3QsbmV3VGhlbWVOYW1lKQorICAgICAgICBzZWxmLnRoZW1lSXNCdWlsdGluLnNldCgwKQorICAgICAgICBzZWxmLlNldFRoZW1lVHlwZSgpCisKKyAgICBkZWYgT25MaXN0Rm9udEJ1dHRvblJlbGVhc2Uoc2VsZixldmVudCk6CisgICAgICAgIGZvbnQgPSBzZWxmLmxpc3RGb250TmFtZS5nZXQoQU5DSE9SKQorICAgICAgICBzZWxmLmZvbnROYW1lLnNldChmb250Lmxvd2VyKCkpCisgICAgICAgIHNlbGYuU2V0Rm9udFNhbXBsZSgpCisKKyAgICBkZWYgU2V0Rm9udFNhbXBsZShzZWxmLGV2ZW50PU5vbmUpOgorICAgICAgICBmb250TmFtZT1zZWxmLmZvbnROYW1lLmdldCgpCisgICAgICAgIGlmIHNlbGYuZm9udEJvbGQuZ2V0KCk6CisgICAgICAgICAgICBmb250V2VpZ2h0PXRrRm9udC5CT0xECisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb250V2VpZ2h0PXRrRm9udC5OT1JNQUwKKyAgICAgICAgbmV3Rm9udCA9IChmb250TmFtZSwgc2VsZi5mb250U2l6ZS5nZXQoKSwgZm9udFdlaWdodCkKKyAgICAgICAgc2VsZi5sYWJlbEZvbnRTYW1wbGUuY29uZmlnKGZvbnQ9bmV3Rm9udCkKKyAgICAgICAgc2VsZi50ZXh0SGlnaGxpZ2h0U2FtcGxlLmNvbmZpZ3VyZShmb250PW5ld0ZvbnQpCisKKyAgICBkZWYgU2V0SGlnaGxpZ2h0VGFyZ2V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhpZ2hsaWdodFRhcmdldC5nZXQoKT09J0N1cnNvcic6ICNiZyBub3QgcG9zc2libGUKKyAgICAgICAgICAgIHNlbGYucmFkaW9GZy5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgICAgICBzZWxmLnJhZGlvQmcuY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgc2VsZi5mZ0hpbGl0ZS5zZXQoMSkKKyAgICAgICAgZWxzZTogI2JvdGggZmcgYW5kIGJnIGNhbiBiZSBzZXQKKyAgICAgICAgICAgIHNlbGYucmFkaW9GZy5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgc2VsZi5yYWRpb0JnLmNvbmZpZyhzdGF0ZT1OT1JNQUwpCisgICAgICAgICAgICBzZWxmLmZnSGlsaXRlLnNldCgxKQorICAgICAgICBzZWxmLlNldENvbG91clNhbXBsZSgpCisKKyAgICBkZWYgU2V0Q29sb3VyU2FtcGxlQmluZGluZyhzZWxmLCphcmdzKToKKyAgICAgICAgc2VsZi5TZXRDb2xvdXJTYW1wbGUoKQorCisgICAgZGVmIFNldENvbG91clNhbXBsZShzZWxmKToKKyAgICAgICAgI3NldCB0aGUgY29sb3VyIHNtYXBsZSBhcmVhCisgICAgICAgIHRhZz1zZWxmLnRoZW1lRWxlbWVudHNbc2VsZi5oaWdobGlnaHRUYXJnZXQuZ2V0KCldWzBdCisgICAgICAgIGlmIHNlbGYuZmdIaWxpdGUuZ2V0KCk6IHBsYW5lPSdmb3JlZ3JvdW5kJworICAgICAgICBlbHNlOiBwbGFuZT0nYmFja2dyb3VuZCcKKyAgICAgICAgY29sb3VyPXNlbGYudGV4dEhpZ2hsaWdodFNhbXBsZS50YWdfY2dldCh0YWcscGxhbmUpCisgICAgICAgIHNlbGYuZnJhbWVDb2xvdXJTZXQuY29uZmlnKGJnPWNvbG91cikKKworICAgIGRlZiBQYWludFRoZW1lU2FtcGxlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnRoZW1lSXNCdWlsdGluLmdldCgpOiAjYSBkZWZhdWx0IHRoZW1lCisgICAgICAgICAgICB0aGVtZT1zZWxmLmJ1aWx0aW5UaGVtZS5nZXQoKQorICAgICAgICBlbHNlOiAjYSB1c2VyIHRoZW1lCisgICAgICAgICAgICB0aGVtZT1zZWxmLmN1c3RvbVRoZW1lLmdldCgpCisgICAgICAgIGZvciBlbGVtZW50VGl0bGUgaW4gc2VsZi50aGVtZUVsZW1lbnRzLmtleXMoKToKKyAgICAgICAgICAgIGVsZW1lbnQ9c2VsZi50aGVtZUVsZW1lbnRzW2VsZW1lbnRUaXRsZV1bMF0KKyAgICAgICAgICAgIGNvbG91cnM9aWRsZUNvbmYuR2V0SGlnaGxpZ2h0KHRoZW1lLGVsZW1lbnQpCisgICAgICAgICAgICBpZiBlbGVtZW50PT0nY3Vyc29yJzogI2N1cnNvciBzYW1wbGUgbmVlZHMgc3BlY2lhbCBwYWludGluZworICAgICAgICAgICAgICAgIGNvbG91cnNbJ2JhY2tncm91bmQnXT1pZGxlQ29uZi5HZXRIaWdobGlnaHQodGhlbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAnbm9ybWFsJywgZmdCZz0nYmcnKQorICAgICAgICAgICAgI2hhbmRsZSBhbnkgdW5zYXZlZCBjaGFuZ2VzIHRvIHRoaXMgdGhlbWUKKyAgICAgICAgICAgIGlmIHRoZW1lIGluIHNlbGYuY2hhbmdlZEl0ZW1zWydoaWdobGlnaHQnXS5rZXlzKCk6CisgICAgICAgICAgICAgICAgdGhlbWVEaWN0PXNlbGYuY2hhbmdlZEl0ZW1zWydoaWdobGlnaHQnXVt0aGVtZV0KKyAgICAgICAgICAgICAgICBpZiBlbGVtZW50KyctZm9yZWdyb3VuZCcgaW4gdGhlbWVEaWN0OgorICAgICAgICAgICAgICAgICAgICBjb2xvdXJzWydmb3JlZ3JvdW5kJ109dGhlbWVEaWN0W2VsZW1lbnQrJy1mb3JlZ3JvdW5kJ10KKyAgICAgICAgICAgICAgICBpZiBlbGVtZW50KyctYmFja2dyb3VuZCcgaW4gdGhlbWVEaWN0OgorICAgICAgICAgICAgICAgICAgICBjb2xvdXJzWydiYWNrZ3JvdW5kJ109dGhlbWVEaWN0W2VsZW1lbnQrJy1iYWNrZ3JvdW5kJ10KKyAgICAgICAgICAgIHNlbGYudGV4dEhpZ2hsaWdodFNhbXBsZS50YWdfY29uZmlnKGVsZW1lbnQsICoqY29sb3VycykKKyAgICAgICAgc2VsZi5TZXRDb2xvdXJTYW1wbGUoKQorCisgICAgZGVmIEhlbHBTb3VyY2VTZWxlY3RlZChzZWxmLGV2ZW50KToKKyAgICAgICAgc2VsZi5TZXRIZWxwTGlzdEJ1dHRvblN0YXRlcygpCisKKyAgICBkZWYgU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYubGlzdEhlbHAuc2l6ZSgpPDE6ICNubyBlbnRyaWVzIGluIGxpc3QKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RFZGl0LmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RSZW1vdmUuY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICBlbHNlOiAjdGhlcmUgYXJlIHNvbWUgZW50cmllcworICAgICAgICAgICAgaWYgc2VsZi5saXN0SGVscC5jdXJzZWxlY3Rpb24oKTogI3RoZXJlIGN1cnJlbnRseSBpcyBhIHNlbGVjdGlvbgorICAgICAgICAgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RFZGl0LmNvbmZpZyhzdGF0ZT1OT1JNQUwpCisgICAgICAgICAgICAgICAgc2VsZi5idXR0b25IZWxwTGlzdFJlbW92ZS5jb25maWcoc3RhdGU9Tk9STUFMKQorICAgICAgICAgICAgZWxzZTogICN0aGVyZSBjdXJyZW50bHkgaXMgbm90IGEgc2VsZWN0aW9uCisgICAgICAgICAgICAgICAgc2VsZi5idXR0b25IZWxwTGlzdEVkaXQuY29uZmlnKHN0YXRlPURJU0FCTEVEKQorICAgICAgICAgICAgICAgIHNlbGYuYnV0dG9uSGVscExpc3RSZW1vdmUuY29uZmlnKHN0YXRlPURJU0FCTEVEKQorCisgICAgZGVmIEhlbHBMaXN0SXRlbUFkZChzZWxmKToKKyAgICAgICAgaGVscFNvdXJjZT1HZXRIZWxwU291cmNlRGlhbG9nKHNlbGYsJ05ldyBIZWxwIFNvdXJjZScpLnJlc3VsdAorICAgICAgICBpZiBoZWxwU291cmNlOgorICAgICAgICAgICAgc2VsZi51c2VySGVscExpc3QuYXBwZW5kKCAoaGVscFNvdXJjZVswXSxoZWxwU291cmNlWzFdKSApCisgICAgICAgICAgICBzZWxmLmxpc3RIZWxwLmluc2VydChFTkQsaGVscFNvdXJjZVswXSkKKyAgICAgICAgICAgIHNlbGYuVXBkYXRlVXNlckhlbHBDaGFuZ2VkSXRlbXMoKQorICAgICAgICBzZWxmLlNldEhlbHBMaXN0QnV0dG9uU3RhdGVzKCkKKworICAgIGRlZiBIZWxwTGlzdEl0ZW1FZGl0KHNlbGYpOgorICAgICAgICBpdGVtSW5kZXg9c2VsZi5saXN0SGVscC5pbmRleChBTkNIT1IpCisgICAgICAgIGhlbHBTb3VyY2U9c2VsZi51c2VySGVscExpc3RbaXRlbUluZGV4XQorICAgICAgICBuZXdIZWxwU291cmNlPUdldEhlbHBTb3VyY2VEaWFsb2coc2VsZiwnRWRpdCBIZWxwIFNvdXJjZScsCisgICAgICAgICAgICAgICAgbWVudUl0ZW09aGVscFNvdXJjZVswXSxmaWxlUGF0aD1oZWxwU291cmNlWzFdKS5yZXN1bHQKKyAgICAgICAgaWYgKG5vdCBuZXdIZWxwU291cmNlKSBvciAobmV3SGVscFNvdXJjZT09aGVscFNvdXJjZSk6CisgICAgICAgICAgICByZXR1cm4gI25vIGNoYW5nZXMKKyAgICAgICAgc2VsZi51c2VySGVscExpc3RbaXRlbUluZGV4XT1uZXdIZWxwU291cmNlCisgICAgICAgIHNlbGYubGlzdEhlbHAuZGVsZXRlKGl0ZW1JbmRleCkKKyAgICAgICAgc2VsZi5saXN0SGVscC5pbnNlcnQoaXRlbUluZGV4LG5ld0hlbHBTb3VyY2VbMF0pCisgICAgICAgIHNlbGYuVXBkYXRlVXNlckhlbHBDaGFuZ2VkSXRlbXMoKQorICAgICAgICBzZWxmLlNldEhlbHBMaXN0QnV0dG9uU3RhdGVzKCkKKworICAgIGRlZiBIZWxwTGlzdEl0ZW1SZW1vdmUoc2VsZik6CisgICAgICAgIGl0ZW1JbmRleD1zZWxmLmxpc3RIZWxwLmluZGV4KEFOQ0hPUikKKyAgICAgICAgZGVsKHNlbGYudXNlckhlbHBMaXN0W2l0ZW1JbmRleF0pCisgICAgICAgIHNlbGYubGlzdEhlbHAuZGVsZXRlKGl0ZW1JbmRleCkKKyAgICAgICAgc2VsZi5VcGRhdGVVc2VySGVscENoYW5nZWRJdGVtcygpCisgICAgICAgIHNlbGYuU2V0SGVscExpc3RCdXR0b25TdGF0ZXMoKQorCisgICAgZGVmIFVwZGF0ZVVzZXJIZWxwQ2hhbmdlZEl0ZW1zKHNlbGYpOgorICAgICAgICAiQ2xlYXIgYW5kIHJlYnVpbGQgdGhlIEhlbHBGaWxlcyBzZWN0aW9uIGluIHNlbGYuY2hhbmdlZEl0ZW1zIgorICAgICAgICBzZWxmLmNoYW5nZWRJdGVtc1snbWFpbiddWydIZWxwRmlsZXMnXSA9IHt9CisgICAgICAgIGZvciBudW0gaW4gcmFuZ2UoMSxsZW4oc2VsZi51c2VySGVscExpc3QpKzEpOgorICAgICAgICAgICAgc2VsZi5BZGRDaGFuZ2VkSXRlbSgnbWFpbicsJ0hlbHBGaWxlcycsc3RyKG51bSksCisgICAgICAgICAgICAgICAgICAgIHN0cmluZy5qb2luKHNlbGYudXNlckhlbHBMaXN0W251bS0xXVs6Ml0sJzsnKSkKKworICAgIGRlZiBMb2FkRm9udENmZyhzZWxmKToKKyAgICAgICAgIyNiYXNlIGVkaXRvciBmb250IHNlbGVjdGlvbiBsaXN0CisgICAgICAgIGZvbnRzPWxpc3QodGtGb250LmZhbWlsaWVzKHNlbGYpKQorICAgICAgICBmb250cy5zb3J0KCkKKyAgICAgICAgZm9yIGZvbnQgaW4gZm9udHM6CisgICAgICAgICAgICBzZWxmLmxpc3RGb250TmFtZS5pbnNlcnQoRU5ELGZvbnQpCisgICAgICAgIGNvbmZpZ3VyZWRGb250PWlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ2ZvbnQnLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ9J2NvdXJpZXInKQorICAgICAgICBsY19jb25maWd1cmVkRm9udCA9IGNvbmZpZ3VyZWRGb250Lmxvd2VyKCkKKyAgICAgICAgc2VsZi5mb250TmFtZS5zZXQobGNfY29uZmlndXJlZEZvbnQpCisgICAgICAgIGxjX2ZvbnRzID0gW3MubG93ZXIoKSBmb3IgcyBpbiBmb250c10KKyAgICAgICAgaWYgbGNfY29uZmlndXJlZEZvbnQgaW4gbGNfZm9udHM6CisgICAgICAgICAgICBjdXJyZW50Rm9udEluZGV4ID0gbGNfZm9udHMuaW5kZXgobGNfY29uZmlndXJlZEZvbnQpCisgICAgICAgICAgICBzZWxmLmxpc3RGb250TmFtZS5zZWUoY3VycmVudEZvbnRJbmRleCkKKyAgICAgICAgICAgIHNlbGYubGlzdEZvbnROYW1lLnNlbGVjdF9zZXQoY3VycmVudEZvbnRJbmRleCkKKyAgICAgICAgICAgIHNlbGYubGlzdEZvbnROYW1lLnNlbGVjdF9hbmNob3IoY3VycmVudEZvbnRJbmRleCkKKyAgICAgICAgIyNmb250IHNpemUgZHJvcGRvd24KKyAgICAgICAgZm9udFNpemU9aWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywnZm9udC1zaXplJywKKyAgICAgICAgICAgICAgICB0eXBlPSdpbnQnLCBkZWZhdWx0PScxMCcpCisgICAgICAgIHNlbGYub3B0TWVudUZvbnRTaXplLlNldE1lbnUoKCc3JywnOCcsJzknLCcxMCcsJzExJywnMTInLCcxMycsJzE0JywKKyAgICAgICAgICAgICAgICAnMTYnLCcxOCcsJzIwJywnMjInKSxmb250U2l6ZSApCisgICAgICAgICMjZm9udFdlaWdodAorICAgICAgICBzZWxmLmZvbnRCb2xkLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdFZGl0b3JXaW5kb3cnLAorICAgICAgICAgICAgICAgICdmb250LWJvbGQnLGRlZmF1bHQ9MCx0eXBlPSdib29sJykpCisgICAgICAgICMjZm9udCBzYW1wbGUKKyAgICAgICAgc2VsZi5TZXRGb250U2FtcGxlKCkKKworICAgIGRlZiBMb2FkVGFiQ2ZnKHNlbGYpOgorICAgICAgICAjI2luZGVudCBzaXplcworICAgICAgICBzcGFjZU51bT1pZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdJbmRlbnQnLCdudW0tc3BhY2VzJywKKyAgICAgICAgICAgICAgICBkZWZhdWx0PTQsdHlwZT0naW50JykKKyAgICAgICAgc2VsZi5zcGFjZU51bS5zZXQoc3BhY2VOdW0pCisKKyAgICBkZWYgTG9hZFRoZW1lQ2ZnKHNlbGYpOgorICAgICAgICAjI2N1cnJlbnQgdGhlbWUgdHlwZSByYWRpb2J1dHRvbgorICAgICAgICBzZWxmLnRoZW1lSXNCdWlsdGluLnNldChpZGxlQ29uZi5HZXRPcHRpb24oJ21haW4nLCdUaGVtZScsJ2RlZmF1bHQnLAorICAgICAgICAgICAgdHlwZT0nYm9vbCcsZGVmYXVsdD0xKSkKKyAgICAgICAgIyNjdXJyZW50bHkgc2V0IHRoZW1lCisgICAgICAgIGN1cnJlbnRPcHRpb249aWRsZUNvbmYuQ3VycmVudFRoZW1lKCkKKyAgICAgICAgIyNsb2FkIGF2YWlsYWJsZSB0aGVtZSBvcHRpb24gbWVudXMKKyAgICAgICAgaWYgc2VsZi50aGVtZUlzQnVpbHRpbi5nZXQoKTogI2RlZmF1bHQgdGhlbWUgc2VsZWN0ZWQKKyAgICAgICAgICAgIGl0ZW1MaXN0PWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0JywnaGlnaGxpZ2h0JykKKyAgICAgICAgICAgIGl0ZW1MaXN0LnNvcnQoKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVCdWlsdGluLlNldE1lbnUoaXRlbUxpc3QsY3VycmVudE9wdGlvbikKKyAgICAgICAgICAgIGl0ZW1MaXN0PWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywnaGlnaGxpZ2h0JykKKyAgICAgICAgICAgIGl0ZW1MaXN0LnNvcnQoKQorICAgICAgICAgICAgaWYgbm90IGl0ZW1MaXN0OgorICAgICAgICAgICAgICAgIHNlbGYucmFkaW9UaGVtZUN1c3RvbS5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgICAgICAgICAgc2VsZi5jdXN0b21UaGVtZS5zZXQoJy0gbm8gY3VzdG9tIHRoZW1lcyAtJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVDdXN0b20uU2V0TWVudShpdGVtTGlzdCxpdGVtTGlzdFswXSkKKyAgICAgICAgZWxzZTogI3VzZXIgdGhlbWUgc2VsZWN0ZWQKKyAgICAgICAgICAgIGl0ZW1MaXN0PWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywnaGlnaGxpZ2h0JykKKyAgICAgICAgICAgIGl0ZW1MaXN0LnNvcnQoKQorICAgICAgICAgICAgc2VsZi5vcHRNZW51VGhlbWVDdXN0b20uU2V0TWVudShpdGVtTGlzdCxjdXJyZW50T3B0aW9uKQorICAgICAgICAgICAgaXRlbUxpc3Q9aWRsZUNvbmYuR2V0U2VjdGlvbkxpc3QoJ2RlZmF1bHQnLCdoaWdobGlnaHQnKQorICAgICAgICAgICAgaXRlbUxpc3Quc29ydCgpCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVUaGVtZUJ1aWx0aW4uU2V0TWVudShpdGVtTGlzdCxpdGVtTGlzdFswXSkKKyAgICAgICAgc2VsZi5TZXRUaGVtZVR5cGUoKQorICAgICAgICAjI2xvYWQgdGhlbWUgZWxlbWVudCBvcHRpb24gbWVudQorICAgICAgICB0aGVtZU5hbWVzPXNlbGYudGhlbWVFbGVtZW50cy5rZXlzKCkKKyAgICAgICAgdGhlbWVOYW1lcy5zb3J0KGtleT1sYW1iZGEgeDogc2VsZi50aGVtZUVsZW1lbnRzW3hdWzFdKQorICAgICAgICBzZWxmLm9wdE1lbnVIaWdobGlnaHRUYXJnZXQuU2V0TWVudSh0aGVtZU5hbWVzLHRoZW1lTmFtZXNbMF0pCisgICAgICAgIHNlbGYuUGFpbnRUaGVtZVNhbXBsZSgpCisgICAgICAgIHNlbGYuU2V0SGlnaGxpZ2h0VGFyZ2V0KCkKKworICAgIGRlZiBMb2FkS2V5Q2ZnKHNlbGYpOgorICAgICAgICAjI2N1cnJlbnQga2V5cyB0eXBlIHJhZGlvYnV0dG9uCisgICAgICAgIHNlbGYua2V5c0FyZUJ1aWx0aW4uc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0tleXMnLCdkZWZhdWx0JywKKyAgICAgICAgICAgIHR5cGU9J2Jvb2wnLGRlZmF1bHQ9MSkpCisgICAgICAgICMjY3VycmVudGx5IHNldCBrZXlzCisgICAgICAgIGN1cnJlbnRPcHRpb249aWRsZUNvbmYuQ3VycmVudEtleXMoKQorICAgICAgICAjI2xvYWQgYXZhaWxhYmxlIGtleXNldCBvcHRpb24gbWVudXMKKyAgICAgICAgaWYgc2VsZi5rZXlzQXJlQnVpbHRpbi5nZXQoKTogI2RlZmF1bHQgdGhlbWUgc2VsZWN0ZWQKKyAgICAgICAgICAgIGl0ZW1MaXN0PWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0Jywna2V5cycpCisgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLlNldE1lbnUoaXRlbUxpc3QsY3VycmVudE9wdGlvbikKKyAgICAgICAgICAgIGl0ZW1MaXN0PWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCd1c2VyJywna2V5cycpCisgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgICAgIGlmIG5vdCBpdGVtTGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLnJhZGlvS2V5c0N1c3RvbS5jb25maWcoc3RhdGU9RElTQUJMRUQpCisgICAgICAgICAgICAgICAgc2VsZi5jdXN0b21LZXlzLnNldCgnLSBubyBjdXN0b20ga2V5cyAtJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vcHRNZW51S2V5c0N1c3RvbS5TZXRNZW51KGl0ZW1MaXN0LGl0ZW1MaXN0WzBdKQorICAgICAgICBlbHNlOiAjdXNlciBrZXkgc2V0IHNlbGVjdGVkCisgICAgICAgICAgICBpdGVtTGlzdD1pZGxlQ29uZi5HZXRTZWN0aW9uTGlzdCgndXNlcicsJ2tleXMnKQorICAgICAgICAgICAgaXRlbUxpc3Quc29ydCgpCisgICAgICAgICAgICBzZWxmLm9wdE1lbnVLZXlzQ3VzdG9tLlNldE1lbnUoaXRlbUxpc3QsY3VycmVudE9wdGlvbikKKyAgICAgICAgICAgIGl0ZW1MaXN0PWlkbGVDb25mLkdldFNlY3Rpb25MaXN0KCdkZWZhdWx0Jywna2V5cycpCisgICAgICAgICAgICBpdGVtTGlzdC5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYub3B0TWVudUtleXNCdWlsdGluLlNldE1lbnUoaXRlbUxpc3QsaXRlbUxpc3RbMF0pCisgICAgICAgIHNlbGYuU2V0S2V5c1R5cGUoKQorICAgICAgICAjI2xvYWQga2V5c2V0IGVsZW1lbnQgbGlzdAorICAgICAgICBrZXlTZXROYW1lPWlkbGVDb25mLkN1cnJlbnRLZXlzKCkKKyAgICAgICAgc2VsZi5Mb2FkS2V5c0xpc3Qoa2V5U2V0TmFtZSkKKworICAgIGRlZiBMb2FkR2VuZXJhbENmZyhzZWxmKToKKyAgICAgICAgI3N0YXJ0dXAgc3RhdGUKKyAgICAgICAgc2VsZi5zdGFydHVwRWRpdC5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnR2VuZXJhbCcsCisgICAgICAgICAgICAgICAgJ2VkaXRvci1vbi1zdGFydHVwJyxkZWZhdWx0PTEsdHlwZT0nYm9vbCcpKQorICAgICAgICAjYXV0b3NhdmUgc3RhdGUKKyAgICAgICAgc2VsZi5hdXRvU2F2ZS5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0dlbmVyYWwnLCAnYXV0b3NhdmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0wLCB0eXBlPSdib29sJykpCisgICAgICAgICNpbml0aWFsIHdpbmRvdyBzaXplCisgICAgICAgIHNlbGYud2luV2lkdGguc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0VkaXRvcldpbmRvdycsJ3dpZHRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9J2ludCcpKQorICAgICAgICBzZWxmLndpbkhlaWdodC5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywnRWRpdG9yV2luZG93JywnaGVpZ2h0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSdpbnQnKSkKKyAgICAgICAgI2luaXRpYWwgcGFyYWdyYXBoIHJlZm9ybWF0IHNpemUKKyAgICAgICAgc2VsZi5wYXJhV2lkdGguc2V0KGlkbGVDb25mLkdldE9wdGlvbignbWFpbicsJ0Zvcm1hdFBhcmFncmFwaCcsJ3BhcmFncmFwaCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0naW50JykpCisgICAgICAgICMgZGVmYXVsdCBzb3VyY2UgZW5jb2RpbmcKKyAgICAgICAgc2VsZi5lbmNvZGluZy5zZXQoaWRsZUNvbmYuR2V0T3B0aW9uKCdtYWluJywgJ0VkaXRvcldpbmRvdycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmcnLCBkZWZhdWx0PSdub25lJykpCisgICAgICAgICMgYWRkaXRpb25hbCBoZWxwIHNvdXJjZXMKKyAgICAgICAgc2VsZi51c2VySGVscExpc3QgPSBpZGxlQ29uZi5HZXRBbGxFeHRyYUhlbHBTb3VyY2VzTGlzdCgpCisgICAgICAgIGZvciBoZWxwSXRlbSBpbiBzZWxmLnVzZXJIZWxwTGlzdDoKKyAgICAgICAgICAgIHNlbGYubGlzdEhlbHAuaW5zZXJ0KEVORCxoZWxwSXRlbVswXSkKKyAgICAgICAgc2VsZi5TZXRIZWxwTGlzdEJ1dHRvblN0YXRlcygpCisKKyAgICBkZWYgTG9hZENvbmZpZ3Moc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBsb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBkZWZhdWx0IGFuZCB1c2VyIGNvbmZpZyBmaWxlcyBhbmQgcG9wdWxhdGUKKyAgICAgICAgdGhlIHdpZGdldHMgb24gdGhlIGNvbmZpZyBkaWFsb2cgcGFnZXMuCisgICAgICAgICIiIgorICAgICAgICAjIyMgZm9udHMgLyB0YWJzIHBhZ2UKKyAgICAgICAgc2VsZi5Mb2FkRm9udENmZygpCisgICAgICAgIHNlbGYuTG9hZFRhYkNmZygpCisgICAgICAgICMjIyBoaWdobGlnaHRpbmcgcGFnZQorICAgICAgICBzZWxmLkxvYWRUaGVtZUNmZygpCisgICAgICAgICMjIyBrZXlzIHBhZ2UKKyAgICAgICAgc2VsZi5Mb2FkS2V5Q2ZnKCkKKyAgICAgICAgIyMjIGdlbmVyYWwgcGFnZQorICAgICAgICBzZWxmLkxvYWRHZW5lcmFsQ2ZnKCkKKworICAgIGRlZiBTYXZlTmV3S2V5U2V0KHNlbGYsa2V5U2V0TmFtZSxrZXlTZXQpOgorICAgICAgICAiIiIKKyAgICAgICAgc2F2ZSBhIG5ld2x5IGNyZWF0ZWQgY29yZSBrZXkgc2V0LgorICAgICAgICBrZXlTZXROYW1lIC0gc3RyaW5nLCB0aGUgbmFtZSBvZiB0aGUgbmV3IGtleSBzZXQKKyAgICAgICAga2V5U2V0IC0gZGljdGlvbmFyeSBjb250YWluaW5nIHRoZSBuZXcga2V5IHNldAorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlkbGVDb25mLnVzZXJDZmdbJ2tleXMnXS5oYXNfc2VjdGlvbihrZXlTZXROYW1lKToKKyAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2tleXMnXS5hZGRfc2VjdGlvbihrZXlTZXROYW1lKQorICAgICAgICBmb3IgZXZlbnQgaW4ga2V5U2V0LmtleXMoKToKKyAgICAgICAgICAgIHZhbHVlPWtleVNldFtldmVudF0KKyAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2tleXMnXS5TZXRPcHRpb24oa2V5U2V0TmFtZSxldmVudCx2YWx1ZSkKKworICAgIGRlZiBTYXZlTmV3VGhlbWUoc2VsZix0aGVtZU5hbWUsdGhlbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgc2F2ZSBhIG5ld2x5IGNyZWF0ZWQgdGhlbWUuCisgICAgICAgIHRoZW1lTmFtZSAtIHN0cmluZywgdGhlIG5hbWUgb2YgdGhlIG5ldyB0aGVtZQorICAgICAgICB0aGVtZSAtIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgbmV3IHRoZW1lCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaWRsZUNvbmYudXNlckNmZ1snaGlnaGxpZ2h0J10uaGFzX3NlY3Rpb24odGhlbWVOYW1lKToKKyAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2hpZ2hsaWdodCddLmFkZF9zZWN0aW9uKHRoZW1lTmFtZSkKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWUua2V5cygpOgorICAgICAgICAgICAgdmFsdWU9dGhlbWVbZWxlbWVudF0KKyAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ2hpZ2hsaWdodCddLlNldE9wdGlvbih0aGVtZU5hbWUsZWxlbWVudCx2YWx1ZSkKKworICAgIGRlZiBTZXRVc2VyVmFsdWUoc2VsZixjb25maWdUeXBlLHNlY3Rpb24saXRlbSx2YWx1ZSk6CisgICAgICAgIGlmIGlkbGVDb25mLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0uaGFzX29wdGlvbihzZWN0aW9uLGl0ZW0pOgorICAgICAgICAgICAgaWYgaWRsZUNvbmYuZGVmYXVsdENmZ1tjb25maWdUeXBlXS5HZXQoc2VjdGlvbixpdGVtKT09dmFsdWU6CisgICAgICAgICAgICAgICAgI3RoZSBzZXR0aW5nIGVxdWFscyBhIGRlZmF1bHQgc2V0dGluZywgcmVtb3ZlIGl0IGZyb20gdXNlciBjZmcKKyAgICAgICAgICAgICAgICByZXR1cm4gaWRsZUNvbmYudXNlckNmZ1tjb25maWdUeXBlXS5SZW1vdmVPcHRpb24oc2VjdGlvbixpdGVtKQorICAgICAgICAjaWYgd2UgZ290IGhlcmUgc2V0IHRoZSBvcHRpb24KKyAgICAgICAgcmV0dXJuIGlkbGVDb25mLnVzZXJDZmdbY29uZmlnVHlwZV0uU2V0T3B0aW9uKHNlY3Rpb24saXRlbSx2YWx1ZSkKKworICAgIGRlZiBTYXZlQWxsQ2hhbmdlZENvbmZpZ3Moc2VsZik6CisgICAgICAgICJTYXZlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byB0aGUgdXNlciBjb25maWcgZmlsZS4iCisgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ21haW4nXS5TYXZlKCkKKyAgICAgICAgZm9yIGNvbmZpZ1R5cGUgaW4gc2VsZi5jaGFuZ2VkSXRlbXMua2V5cygpOgorICAgICAgICAgICAgY2ZnVHlwZUhhc0NoYW5nZXMgPSBGYWxzZQorICAgICAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5jaGFuZ2VkSXRlbXNbY29uZmlnVHlwZV0ua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIHNlY3Rpb24gPT0gJ0hlbHBGaWxlcyc6CisgICAgICAgICAgICAgICAgICAgICN0aGlzIHNlY3Rpb24gZ2V0cyBjb21wbGV0ZWx5IHJlcGxhY2VkCisgICAgICAgICAgICAgICAgICAgIGlkbGVDb25mLnVzZXJDZmdbJ21haW4nXS5yZW1vdmVfc2VjdGlvbignSGVscEZpbGVzJykKKyAgICAgICAgICAgICAgICAgICAgY2ZnVHlwZUhhc0NoYW5nZXMgPSBUcnVlCisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5jaGFuZ2VkSXRlbXNbY29uZmlnVHlwZV1bc2VjdGlvbl0ua2V5cygpOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuY2hhbmdlZEl0ZW1zW2NvbmZpZ1R5cGVdW3NlY3Rpb25dW2l0ZW1dCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuU2V0VXNlclZhbHVlKGNvbmZpZ1R5cGUsc2VjdGlvbixpdGVtLHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNmZ1R5cGVIYXNDaGFuZ2VzID0gVHJ1ZQorICAgICAgICAgICAgaWYgY2ZnVHlwZUhhc0NoYW5nZXM6CisgICAgICAgICAgICAgICAgaWRsZUNvbmYudXNlckNmZ1tjb25maWdUeXBlXS5TYXZlKCkKKyAgICAgICAgZm9yIGNvbmZpZ1R5cGUgaW4gWydrZXlzJywgJ2hpZ2hsaWdodCddOgorICAgICAgICAgICAgIyBzYXZlIHRoZXNlIGV2ZW4gaWYgdW5jaGFuZ2VkIQorICAgICAgICAgICAgaWRsZUNvbmYudXNlckNmZ1tjb25maWdUeXBlXS5TYXZlKCkKKyAgICAgICAgc2VsZi5SZXNldENoYW5nZWRJdGVtcygpICNjbGVhciB0aGUgY2hhbmdlZCBpdGVtcyBkaWN0CisKKyAgICBkZWYgRGVhY3RpdmF0ZUN1cnJlbnRDb25maWcoc2VsZik6CisgICAgICAgICNCZWZvcmUgYSBjb25maWcgaXMgc2F2ZWQsIHNvbWUgY2xlYW51cCBvZiBjdXJyZW50CisgICAgICAgICNjb25maWcgbXVzdCBiZSBkb25lIC0gcmVtb3ZlIHRoZSBwcmV2aW91cyBrZXliaW5kaW5ncworICAgICAgICB3aW5JbnN0YW5jZXM9c2VsZi5wYXJlbnQuaW5zdGFuY2VfZGljdC5rZXlzKCkKKyAgICAgICAgZm9yIGluc3RhbmNlIGluIHdpbkluc3RhbmNlczoKKyAgICAgICAgICAgIGluc3RhbmNlLlJlbW92ZUtleWJpbmRpbmdzKCkKKworICAgIGRlZiBBY3RpdmF0ZUNvbmZpZ0NoYW5nZXMoc2VsZik6CisgICAgICAgICJEeW5hbWljYWxseSBhcHBseSBjb25maWd1cmF0aW9uIGNoYW5nZXMiCisgICAgICAgIHdpbkluc3RhbmNlcz1zZWxmLnBhcmVudC5pbnN0YW5jZV9kaWN0LmtleXMoKQorICAgICAgICBmb3IgaW5zdGFuY2UgaW4gd2luSW5zdGFuY2VzOgorICAgICAgICAgICAgaW5zdGFuY2UuUmVzZXRDb2xvcml6ZXIoKQorICAgICAgICAgICAgaW5zdGFuY2UuUmVzZXRGb250KCkKKyAgICAgICAgICAgIGluc3RhbmNlLnNldF9ub3RhYnNfaW5kZW50d2lkdGgoKQorICAgICAgICAgICAgaW5zdGFuY2UuQXBwbHlLZXliaW5kaW5ncygpCisgICAgICAgICAgICBpbnN0YW5jZS5yZXNldF9oZWxwX21lbnVfZW50cmllcygpCisKKyAgICBkZWYgQ2FuY2VsKHNlbGYpOgorICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisgICAgZGVmIE9rKHNlbGYpOgorICAgICAgICBzZWxmLkFwcGx5KCkKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworICAgIGRlZiBBcHBseShzZWxmKToKKyAgICAgICAgc2VsZi5EZWFjdGl2YXRlQ3VycmVudENvbmZpZygpCisgICAgICAgIHNlbGYuU2F2ZUFsbENoYW5nZWRDb25maWdzKCkKKyAgICAgICAgc2VsZi5BY3RpdmF0ZUNvbmZpZ0NoYW5nZXMoKQorCisgICAgZGVmIEhlbHAoc2VsZik6CisgICAgICAgIHBhc3MKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjdGVzdCB0aGUgZGlhbG9nCisgICAgcm9vdD1UaygpCisgICAgQnV0dG9uKHJvb3QsdGV4dD0nRGlhbG9nJywKKyAgICAgICAgICAgIGNvbW1hbmQ9bGFtYmRhOkNvbmZpZ0RpYWxvZyhyb290LCdTZXR0aW5ncycpKS5wYWNrKCkKKyAgICByb290Lmluc3RhbmNlX2RpY3Q9e30KKyAgICByb290Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3OTgyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0RpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3OTgyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdEaWFsb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyOGQwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CkBAIC0wLDAgKzEsNzE5IEBACisiIiJQcm92aWRlcyBhY2Nlc3MgdG8gc3RvcmVkIElETEUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKworUmVmZXIgdG8gdGhlIGNvbW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgb2YgY29uZmlnLW1haW4uZGVmIGZvciBhIGRlc2NyaXB0aW9uIG9mCit0aGUgYXZhaWxhYmxlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIHRoZSBkZXNpZ24gaW1wbGVtZW50ZWQgdG8gdXBkYXRlIHVzZXIKK2NvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uICBJbiBwYXJ0aWN1bGFyLCB1c2VyIGNvbmZpZ3VyYXRpb24gY2hvaWNlcyB3aGljaAorZHVwbGljYXRlIHRoZSBkZWZhdWx0cyB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24gZmlsZXMsCithbmQgaWYgYSBmaWxlIGJlY29tZXMgZW1wdHksIGl0IHdpbGwgYmUgZGVsZXRlZC4KKworVGhlIGNvbnRlbnRzIG9mIHRoZSB1c2VyIGZpbGVzIG1heSBiZSBhbHRlcmVkIHVzaW5nIHRoZSBPcHRpb25zL0NvbmZpZ3VyZSBJRExFCittZW51IHRvIGFjY2VzcyB0aGUgY29uZmlndXJhdGlvbiBHVUkgKGNvbmZpZ0RpYWxvZy5weSksIG9yIG1hbnVhbGx5LgorCitUaHJvdWdob3V0IHRoaXMgbW9kdWxlIHRoZXJlIGlzIGFuIGVtcGhhc2lzIG9uIHJldHVybmluZyB1c2VhYmxlIGRlZmF1bHRzCit3aGVuIGEgcHJvYmxlbSBvY2N1cnMgaW4gcmV0dXJuaW5nIGEgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24gdmFsdWUgYmFjayB0bworaWRsZS4gVGhpcyBpcyB0byBhbGxvdyBJRExFIHRvIGNvbnRpbnVlIHRvIGZ1bmN0aW9uIGluIHNwaXRlIG9mIGVycm9ycyBpbgordGhlIHJldHJpZXZhbCBvZiBjb25maWcgaW5mb3JtYXRpb24uIFdoZW4gYSBkZWZhdWx0IGlzIHJldHVybmVkIGluc3RlYWQgb2YKK2EgcmVxdWVzdGVkIGNvbmZpZyB2YWx1ZSwgYSBtZXNzYWdlIGlzIHByaW50ZWQgdG8gc3RkZXJyIHRvIGFpZCBpbgorY29uZmlndXJhdGlvbiBwcm9ibGVtIG5vdGlmaWNhdGlvbiBhbmQgcmVzb2x1dGlvbi4KKworIiIiCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJpbmcKK2Zyb20gaWRsZWxpYiBpbXBvcnQgbWFjb3N4U3VwcG9ydAorZnJvbSBDb25maWdQYXJzZXIgaW1wb3J0IENvbmZpZ1BhcnNlciwgTm9PcHRpb25FcnJvciwgTm9TZWN0aW9uRXJyb3IKKworY2xhc3MgSW52YWxpZENvbmZpZ1R5cGUoRXhjZXB0aW9uKTogcGFzcworY2xhc3MgSW52YWxpZENvbmZpZ1NldChFeGNlcHRpb24pOiBwYXNzCitjbGFzcyBJbnZhbGlkRmdCZyhFeGNlcHRpb24pOiBwYXNzCitjbGFzcyBJbnZhbGlkVGhlbWUoRXhjZXB0aW9uKTogcGFzcworCitjbGFzcyBJZGxlQ29uZlBhcnNlcihDb25maWdQYXJzZXIpOgorICAgICIiIgorICAgIEEgQ29uZmlnUGFyc2VyIHNwZWNpYWxpc2VkIGZvciBpZGxlIGNvbmZpZ3VyYXRpb24gZmlsZSBoYW5kbGluZworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjZmdGaWxlLCBjZmdEZWZhdWx0cz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIGNmZ0ZpbGUgLSBzdHJpbmcsIGZ1bGx5IHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGZpbGUgbmFtZQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxlPWNmZ0ZpbGUKKyAgICAgICAgQ29uZmlnUGFyc2VyLl9faW5pdF9fKHNlbGYsZGVmYXVsdHM9Y2ZnRGVmYXVsdHMpCisKKyAgICBkZWYgR2V0KHNlbGYsIHNlY3Rpb24sIG9wdGlvbiwgdHlwZT1Ob25lLCBkZWZhdWx0PU5vbmUsIHJhdz1GYWxzZSk6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYW4gb3B0aW9uIHZhbHVlIGZvciBnaXZlbiBzZWN0aW9uL29wdGlvbiBvciByZXR1cm4gZGVmYXVsdC4KKyAgICAgICAgSWYgdHlwZSBpcyBzcGVjaWZpZWQsIHJldHVybiBhcyB0eXBlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGFzX29wdGlvbihzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgaWYgdHlwZT09J2Jvb2wnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0Ym9vbGVhbihzZWN0aW9uLCBvcHRpb24pCisgICAgICAgIGVsaWYgdHlwZT09J2ludCc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXRpbnQoc2VjdGlvbiwgb3B0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KHNlY3Rpb24sIG9wdGlvbiwgcmF3PXJhdykKKworICAgIGRlZiBHZXRPcHRpb25MaXN0KHNlbGYsc2VjdGlvbik6CisgICAgICAgICIiIgorICAgICAgICBHZXQgYW4gb3B0aW9uIGxpc3QgZm9yIGdpdmVuIHNlY3Rpb24KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaGFzX3NlY3Rpb24oc2VjdGlvbik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcHRpb25zKHNlY3Rpb24pCisgICAgICAgIGVsc2U6ICAjcmV0dXJuIGEgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICBkZWYgTG9hZChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIExvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBmcm9tIGRpc2sKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucmVhZChzZWxmLmZpbGUpCisKK2NsYXNzIElkbGVVc2VyQ29uZlBhcnNlcihJZGxlQ29uZlBhcnNlcik6CisgICAgIiIiCisgICAgSWRsZUNvbmZpZ1BhcnNlciBzcGVjaWFsaXNlZCBmb3IgdXNlciBjb25maWd1cmF0aW9uIGhhbmRsaW5nLgorICAgICIiIgorCisgICAgZGVmIEFkZFNlY3Rpb24oc2VsZixzZWN0aW9uKToKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlY3Rpb24gZG9lc24ndCBleGlzdCwgYWRkIGl0CisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5oYXNfc2VjdGlvbihzZWN0aW9uKToKKyAgICAgICAgICAgIHNlbGYuYWRkX3NlY3Rpb24oc2VjdGlvbikKKworICAgIGRlZiBSZW1vdmVFbXB0eVNlY3Rpb25zKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcmVtb3ZlIGFueSBzZWN0aW9ucyB0aGF0IGhhdmUgbm8gb3B0aW9ucworICAgICAgICAiIiIKKyAgICAgICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5zZWN0aW9ucygpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuR2V0T3B0aW9uTGlzdChzZWN0aW9uKToKKyAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCisKKyAgICBkZWYgSXNFbXB0eShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZSBlbXB0eSBzZWN0aW9ucyBhbmQgdGhlbiByZXR1cm4gMSBpZiBwYXJzZXIgaGFzIG5vIHNlY3Rpb25zCisgICAgICAgIGxlZnQsIGVsc2UgcmV0dXJuIDAuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLlJlbW92ZUVtcHR5U2VjdGlvbnMoKQorICAgICAgICBpZiBzZWxmLnNlY3Rpb25zKCk6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBSZW1vdmVPcHRpb24oc2VsZixzZWN0aW9uLG9wdGlvbik6CisgICAgICAgICIiIgorICAgICAgICBJZiBzZWN0aW9uL29wdGlvbiBleGlzdHMsIHJlbW92ZSBpdC4KKyAgICAgICAgUmV0dXJucyAxIGlmIG9wdGlvbiB3YXMgcmVtb3ZlZCwgMCBvdGhlcndpc2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmhhc19zZWN0aW9uKHNlY3Rpb24pOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVtb3ZlX29wdGlvbihzZWN0aW9uLG9wdGlvbikKKworICAgIGRlZiBTZXRPcHRpb24oc2VsZixzZWN0aW9uLG9wdGlvbix2YWx1ZSk6CisgICAgICAgICIiIgorICAgICAgICBTZXRzIG9wdGlvbiB0byB2YWx1ZSwgYWRkaW5nIHNlY3Rpb24gaWYgcmVxdWlyZWQuCisgICAgICAgIFJldHVybnMgMSBpZiBvcHRpb24gd2FzIGFkZGVkIG9yIGNoYW5nZWQsIG90aGVyd2lzZSAwLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5oYXNfb3B0aW9uKHNlY3Rpb24sb3B0aW9uKToKKyAgICAgICAgICAgIGlmIHNlbGYuZ2V0KHNlY3Rpb24sb3B0aW9uKT09dmFsdWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zZXQoc2VjdGlvbixvcHRpb24sdmFsdWUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmhhc19zZWN0aW9uKHNlY3Rpb24pOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX3NlY3Rpb24oc2VjdGlvbikKKyAgICAgICAgICAgIHNlbGYuc2V0KHNlY3Rpb24sb3B0aW9uLHZhbHVlKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBSZW1vdmVGaWxlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVtb3ZlcyB0aGUgdXNlciBjb25maWcgZmlsZSBmcm9tIGRpc2sgaWYgaXQgZXhpc3RzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlKToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGUpCisKKyAgICBkZWYgU2F2ZShzZWxmKToKKyAgICAgICAgIiIiVXBkYXRlIHVzZXIgY29uZmlndXJhdGlvbiBmaWxlLgorCisgICAgICAgIFJlbW92ZSBlbXB0eSBzZWN0aW9ucy4gSWYgcmVzdWx0aW5nIGNvbmZpZyBpc24ndCBlbXB0eSwgd3JpdGUgdGhlIGZpbGUKKyAgICAgICAgdG8gZGlzay4gSWYgY29uZmlnIGlzIGVtcHR5LCByZW1vdmUgdGhlIGZpbGUgZnJvbSBkaXNrIGlmIGl0IGV4aXN0cy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuSXNFbXB0eSgpOgorICAgICAgICAgICAgZm5hbWUgPSBzZWxmLmZpbGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjZmdGaWxlID0gb3BlbihmbmFtZSwgJ3cnKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuYW1lKQorICAgICAgICAgICAgICAgIGNmZ0ZpbGUgPSBvcGVuKGZuYW1lLCAndycpCisgICAgICAgICAgICBzZWxmLndyaXRlKGNmZ0ZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLlJlbW92ZUZpbGUoKQorCitjbGFzcyBJZGxlQ29uZjoKKyAgICAiIiIKKyAgICBob2xkcyBjb25maWcgcGFyc2VycyBmb3IgYWxsIGlkbGUgY29uZmlnIGZpbGVzOgorICAgIGRlZmF1bHQgY29uZmlnIGZpbGVzCisgICAgICAgIChpZGxlIGluc3RhbGwgZGlyKS9jb25maWctbWFpbi5kZWYKKyAgICAgICAgKGlkbGUgaW5zdGFsbCBkaXIpL2NvbmZpZy1leHRlbnNpb25zLmRlZgorICAgICAgICAoaWRsZSBpbnN0YWxsIGRpcikvY29uZmlnLWhpZ2hsaWdodC5kZWYKKyAgICAgICAgKGlkbGUgaW5zdGFsbCBkaXIpL2NvbmZpZy1rZXlzLmRlZgorICAgIHVzZXIgY29uZmlnICBmaWxlcworICAgICAgICAodXNlciBob21lIGRpcikvLmlkbGVyYy9jb25maWctbWFpbi5jZmcKKyAgICAgICAgKHVzZXIgaG9tZSBkaXIpLy5pZGxlcmMvY29uZmlnLWV4dGVuc2lvbnMuY2ZnCisgICAgICAgICh1c2VyIGhvbWUgZGlyKS8uaWRsZXJjL2NvbmZpZy1oaWdobGlnaHQuY2ZnCisgICAgICAgICh1c2VyIGhvbWUgZGlyKS8uaWRsZXJjL2NvbmZpZy1rZXlzLmNmZworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZhdWx0Q2ZnPXt9CisgICAgICAgIHNlbGYudXNlckNmZz17fQorICAgICAgICBzZWxmLmNmZz17fQorICAgICAgICBzZWxmLkNyZWF0ZUNvbmZpZ0hhbmRsZXJzKCkKKyAgICAgICAgc2VsZi5Mb2FkQ2ZnRmlsZXMoKQorICAgICAgICAjc2VsZi5Mb2FkQ2ZnKCkKKworICAgIGRlZiBDcmVhdGVDb25maWdIYW5kbGVycyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHNldCB1cCBhIGRpY3Rpb25hcnkgb2YgY29uZmlnIHBhcnNlcnMgZm9yIGRlZmF1bHQgYW5kIHVzZXIKKyAgICAgICAgY29uZmlndXJhdGlvbnMgcmVzcGVjdGl2ZWx5CisgICAgICAgICIiIgorICAgICAgICAjYnVpbGQgaWRsZSBpbnN0YWxsIHBhdGgKKyAgICAgICAgaWYgX19uYW1lX18gIT0gJ19fbWFpbl9fJzogIyB3ZSB3ZXJlIGltcG9ydGVkCisgICAgICAgICAgICBpZGxlRGlyPW9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKyAgICAgICAgZWxzZTogIyB3ZSB3ZXJlIGV4ZWMnZWQgKGZvciB0ZXN0aW5nIG9ubHkpCisgICAgICAgICAgICBpZGxlRGlyPW9zLnBhdGguYWJzcGF0aChzeXMucGF0aFswXSkKKyAgICAgICAgdXNlckRpcj1zZWxmLkdldFVzZXJDZmdEaXIoKQorICAgICAgICBjb25maWdUeXBlcz0oJ21haW4nLCdleHRlbnNpb25zJywnaGlnaGxpZ2h0Jywna2V5cycpCisgICAgICAgIGRlZkNmZ0ZpbGVzPXt9CisgICAgICAgIHVzckNmZ0ZpbGVzPXt9CisgICAgICAgIGZvciBjZmdUeXBlIGluIGNvbmZpZ1R5cGVzOiAjYnVpbGQgY29uZmlnIGZpbGUgbmFtZXMKKyAgICAgICAgICAgIGRlZkNmZ0ZpbGVzW2NmZ1R5cGVdPW9zLnBhdGguam9pbihpZGxlRGlyLCdjb25maWctJytjZmdUeXBlKycuZGVmJykKKyAgICAgICAgICAgIHVzckNmZ0ZpbGVzW2NmZ1R5cGVdPW9zLnBhdGguam9pbih1c2VyRGlyLCdjb25maWctJytjZmdUeXBlKycuY2ZnJykKKyAgICAgICAgZm9yIGNmZ1R5cGUgaW4gY29uZmlnVHlwZXM6ICNjcmVhdGUgY29uZmlnIHBhcnNlcnMKKyAgICAgICAgICAgIHNlbGYuZGVmYXVsdENmZ1tjZmdUeXBlXT1JZGxlQ29uZlBhcnNlcihkZWZDZmdGaWxlc1tjZmdUeXBlXSkKKyAgICAgICAgICAgIHNlbGYudXNlckNmZ1tjZmdUeXBlXT1JZGxlVXNlckNvbmZQYXJzZXIodXNyQ2ZnRmlsZXNbY2ZnVHlwZV0pCisKKyAgICBkZWYgR2V0VXNlckNmZ0RpcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENyZWF0ZXMgKGlmIHJlcXVpcmVkKSBhbmQgcmV0dXJucyBhIGZpbGVzeXN0ZW0gZGlyZWN0b3J5IGZvciBzdG9yaW5nCisgICAgICAgIHVzZXIgY29uZmlnIGZpbGVzLgorCisgICAgICAgICIiIgorICAgICAgICBjZmdEaXIgPSAnLmlkbGVyYycKKyAgICAgICAgdXNlckRpciA9IG9zLnBhdGguZXhwYW5kdXNlcignficpCisgICAgICAgIGlmIHVzZXJEaXIgIT0gJ34nOiAjIGV4cGFuZHVzZXIoKSBmb3VuZCB1c2VyIGhvbWUgZGlyCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModXNlckRpcik6CisgICAgICAgICAgICAgICAgd2FybiA9ICgnXG4gV2FybmluZzogb3MucGF0aC5leHBhbmR1c2VyKCJ+IikgcG9pbnRzIHRvXG4gJysKKyAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEaXIrJyxcbiBidXQgdGhlIHBhdGggZG9lcyBub3QgZXhpc3QuXG4nKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSh3YXJuKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgdXNlckRpciA9ICd+JworICAgICAgICBpZiB1c2VyRGlyID09ICJ+IjogIyBzdGlsbCBubyBwYXRoIHRvIGhvbWUhCisgICAgICAgICAgICAjIHRyYWRpdGlvbmFsbHkgSURMRSBoYXMgZGVmYXVsdGVkIHRvIG9zLmdldGN3ZCgpLCBpcyB0aGlzIGFkZXF1YXRlPworICAgICAgICAgICAgdXNlckRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIHVzZXJEaXIgPSBvcy5wYXRoLmpvaW4odXNlckRpciwgY2ZnRGlyKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHModXNlckRpcik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MubWtkaXIodXNlckRpcikKKyAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICAgICAgd2FybiA9ICgnXG4gV2FybmluZzogdW5hYmxlIHRvIGNyZWF0ZSB1c2VyIGNvbmZpZyBkaXJlY3RvcnlcbicrCisgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGlyKydcbiBDaGVjayBwYXRoIGFuZCBwZXJtaXNzaW9ucy5cbiBFeGl0aW5nIVxuXG4nKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUod2FybikKKyAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisgICAgICAgIHJldHVybiB1c2VyRGlyCisKKyAgICBkZWYgR2V0T3B0aW9uKHNlbGYsIGNvbmZpZ1R5cGUsIHNlY3Rpb24sIG9wdGlvbiwgZGVmYXVsdD1Ob25lLCB0eXBlPU5vbmUsCisgICAgICAgICAgICAgICAgICB3YXJuX29uX2RlZmF1bHQ9VHJ1ZSwgcmF3PUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCBhbiBvcHRpb24gdmFsdWUgZm9yIGdpdmVuIGNvbmZpZyB0eXBlIGFuZCBnaXZlbiBnZW5lcmFsCisgICAgICAgIGNvbmZpZ3VyYXRpb24gc2VjdGlvbi9vcHRpb24gb3IgcmV0dXJuIGEgZGVmYXVsdC4gSWYgdHlwZSBpcyBzcGVjaWZpZWQsCisgICAgICAgIHJldHVybiBhcyB0eXBlLiBGaXJzdGx5IHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gaXMgY2hlY2tlZCwgd2l0aCBhCisgICAgICAgIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGFuZCBhIGZpbmFsICdjYXRjaCBhbGwnCisgICAgICAgIGZhbGxiYWNrIHRvIGEgdXNlYWJsZSBwYXNzZWQtaW4gZGVmYXVsdCBpZiB0aGUgb3B0aW9uIGlzbid0IHByZXNlbnQgaW4KKyAgICAgICAgZWl0aGVyIHRoZSB1c2VyIG9yIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCisgICAgICAgIGNvbmZpZ1R5cGUgbXVzdCBiZSBvbmUgb2YgKCdtYWluJywnZXh0ZW5zaW9ucycsJ2hpZ2hsaWdodCcsJ2tleXMnKQorICAgICAgICBJZiBhIGRlZmF1bHQgaXMgcmV0dXJuZWQsIGFuZCB3YXJuX29uX2RlZmF1bHQgaXMgVHJ1ZSwgYSB3YXJuaW5nIGlzCisgICAgICAgIHByaW50ZWQgdG8gc3RkZXJyLgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnVzZXJDZmdbY29uZmlnVHlwZV0uaGFzX29wdGlvbihzZWN0aW9uLG9wdGlvbik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudXNlckNmZ1tjb25maWdUeXBlXS5HZXQoc2VjdGlvbiwgb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9dHlwZSwgcmF3PXJhdykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICB3YXJuaW5nID0gKCdcbiBXYXJuaW5nOiBjb25maWdIYW5kbGVyLnB5IC0gSWRsZUNvbmYuR2V0T3B0aW9uIC1cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyBpbnZhbGlkICVyIHZhbHVlIGZvciBjb25maWd1cmF0aW9uIG9wdGlvbiAlclxuJworICAgICAgICAgICAgICAgICAgICAgICAnIGZyb20gc2VjdGlvbiAlcjogJXJcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAodHlwZSwgb3B0aW9uLCBzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdz1yYXcpKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHdhcm5pbmcpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVmYXVsdENmZ1tjb25maWdUeXBlXS5oYXNfb3B0aW9uKHNlY3Rpb24sb3B0aW9uKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0Q2ZnW2NvbmZpZ1R5cGVdLkdldChzZWN0aW9uLCBvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT10eXBlLCByYXc9cmF3KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgI3JldHVybmluZyBkZWZhdWx0LCBwcmludCB3YXJuaW5nCisgICAgICAgIGlmIHdhcm5fb25fZGVmYXVsdDoKKyAgICAgICAgICAgIHdhcm5pbmcgPSAoJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRPcHRpb24gLVxuJworICAgICAgICAgICAgICAgICAgICAgICAnIHByb2JsZW0gcmV0cmlldmluZyBjb25maWd1cmF0aW9uIG9wdGlvbiAlclxuJworICAgICAgICAgICAgICAgICAgICAgICAnIGZyb20gc2VjdGlvbiAlci5cbicKKyAgICAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZTogJXJcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAob3B0aW9uLCBzZWN0aW9uLCBkZWZhdWx0KSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHdhcm5pbmcpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICBkZWYgU2V0T3B0aW9uKHNlbGYsIGNvbmZpZ1R5cGUsIHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpOgorICAgICAgICAiIiJJbiB1c2VyJ3MgY29uZmlnIGZpbGUsIHNldCBzZWN0aW9uJ3Mgb3B0aW9uIHRvIHZhbHVlLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnVzZXJDZmdbY29uZmlnVHlwZV0uU2V0T3B0aW9uKHNlY3Rpb24sIG9wdGlvbiwgdmFsdWUpCisKKyAgICBkZWYgR2V0U2VjdGlvbkxpc3Qoc2VsZiwgY29uZmlnU2V0LCBjb25maWdUeXBlKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCBhIGxpc3Qgb2Ygc2VjdGlvbnMgZnJvbSBlaXRoZXIgdGhlIHVzZXIgb3IgZGVmYXVsdCBjb25maWcgZm9yCisgICAgICAgIHRoZSBnaXZlbiBjb25maWcgdHlwZS4KKyAgICAgICAgY29uZmlnU2V0IG11c3QgYmUgZWl0aGVyICd1c2VyJyBvciAnZGVmYXVsdCcKKyAgICAgICAgY29uZmlnVHlwZSBtdXN0IGJlIG9uZSBvZiAoJ21haW4nLCdleHRlbnNpb25zJywnaGlnaGxpZ2h0Jywna2V5cycpCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgKGNvbmZpZ1R5cGUgaW4gKCdtYWluJywnZXh0ZW5zaW9ucycsJ2hpZ2hsaWdodCcsJ2tleXMnKSk6CisgICAgICAgICAgICByYWlzZSBJbnZhbGlkQ29uZmlnVHlwZSwgJ0ludmFsaWQgY29uZmlnVHlwZSBzcGVjaWZpZWQnCisgICAgICAgIGlmIGNvbmZpZ1NldCA9PSAndXNlcic6CisgICAgICAgICAgICBjZmdQYXJzZXI9c2VsZi51c2VyQ2ZnW2NvbmZpZ1R5cGVdCisgICAgICAgIGVsaWYgY29uZmlnU2V0ID09ICdkZWZhdWx0JzoKKyAgICAgICAgICAgIGNmZ1BhcnNlcj1zZWxmLmRlZmF1bHRDZmdbY29uZmlnVHlwZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRDb25maWdTZXQsICdJbnZhbGlkIGNvbmZpZ1NldCBzcGVjaWZpZWQnCisgICAgICAgIHJldHVybiBjZmdQYXJzZXIuc2VjdGlvbnMoKQorCisgICAgZGVmIEdldEhpZ2hsaWdodChzZWxmLCB0aGVtZSwgZWxlbWVudCwgZmdCZz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBpbmRpdmlkdWFsIGhpZ2hsaWdodGluZyB0aGVtZSBlbGVtZW50cy4KKyAgICAgICAgZmdCZyAtIHN0cmluZyAoJ2ZnJ29yJ2JnJykgb3IgTm9uZSwgaWYgTm9uZSByZXR1cm4gYSBkaWN0aW9uYXJ5CisgICAgICAgIGNvbnRhaW5pbmcgZmcgYW5kIGJnIGNvbG91cnMgKGFwcHJvcHJpYXRlIGZvciBwYXNzaW5nIHRvIFRraW50ZXIgaW4sCisgICAgICAgIGUuZy4sIGEgdGFnX2NvbmZpZyBjYWxsKSwgb3RoZXJ3aXNlIGZnIG9yIGJnIGNvbG91ciBvbmx5IGFzIHNwZWNpZmllZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZGVmYXVsdENmZ1snaGlnaGxpZ2h0J10uaGFzX3NlY3Rpb24odGhlbWUpOgorICAgICAgICAgICAgdGhlbWVEaWN0PXNlbGYuR2V0VGhlbWVEaWN0KCdkZWZhdWx0Jyx0aGVtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRoZW1lRGljdD1zZWxmLkdldFRoZW1lRGljdCgndXNlcicsdGhlbWUpCisgICAgICAgIGZvcmU9dGhlbWVEaWN0W2VsZW1lbnQrJy1mb3JlZ3JvdW5kJ10KKyAgICAgICAgaWYgZWxlbWVudD09J2N1cnNvcic6ICN0aGVyZSBpcyBubyBjb25maWcgdmFsdWUgZm9yIGN1cnNvciBiZworICAgICAgICAgICAgYmFjaz10aGVtZURpY3RbJ25vcm1hbC1iYWNrZ3JvdW5kJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhY2s9dGhlbWVEaWN0W2VsZW1lbnQrJy1iYWNrZ3JvdW5kJ10KKyAgICAgICAgaGlnaGxpZ2h0PXsiZm9yZWdyb3VuZCI6IGZvcmUsImJhY2tncm91bmQiOiBiYWNrfQorICAgICAgICBpZiBub3QgZmdCZzogI3JldHVybiBkaWN0IG9mIGJvdGggY29sb3VycworICAgICAgICAgICAgcmV0dXJuIGhpZ2hsaWdodAorICAgICAgICBlbHNlOiAjcmV0dXJuIHNwZWNpZmllZCBjb2xvdXIgb25seQorICAgICAgICAgICAgaWYgZmdCZyA9PSAnZmcnOgorICAgICAgICAgICAgICAgIHJldHVybiBoaWdobGlnaHRbImZvcmVncm91bmQiXQorICAgICAgICAgICAgaWYgZmdCZyA9PSAnYmcnOgorICAgICAgICAgICAgICAgIHJldHVybiBoaWdobGlnaHRbImJhY2tncm91bmQiXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBJbnZhbGlkRmdCZywgJ0ludmFsaWQgZmdCZyBzcGVjaWZpZWQnCisKKyAgICBkZWYgR2V0VGhlbWVEaWN0KHNlbGYsdHlwZSx0aGVtZU5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgdHlwZSAtIHN0cmluZywgJ2RlZmF1bHQnIG9yICd1c2VyJyB0aGVtZSB0eXBlCisgICAgICAgIHRoZW1lTmFtZSAtIHN0cmluZywgdGhlbWUgbmFtZQorICAgICAgICBSZXR1cm5zIGEgZGljdGlvbmFyeSB3aGljaCBob2xkcyB7b3B0aW9uOnZhbHVlfSBmb3IgZWFjaCBlbGVtZW50CisgICAgICAgIGluIHRoZSBzcGVjaWZpZWQgdGhlbWUuIFZhbHVlcyBhcmUgbG9hZGVkIG92ZXIgYSBzZXQgb2YgdWx0aW1hdGUgbGFzdAorICAgICAgICBmYWxsYmFjayBkZWZhdWx0cyB0byBndWFyYW50ZWUgdGhhdCBhbGwgdGhlbWUgZWxlbWVudHMgYXJlIHByZXNlbnQgaW4KKyAgICAgICAgYSBuZXdseSBjcmVhdGVkIHRoZW1lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdHlwZSA9PSAndXNlcic6CisgICAgICAgICAgICBjZmdQYXJzZXI9c2VsZi51c2VyQ2ZnWydoaWdobGlnaHQnXQorICAgICAgICBlbGlmIHR5cGUgPT0gJ2RlZmF1bHQnOgorICAgICAgICAgICAgY2ZnUGFyc2VyPXNlbGYuZGVmYXVsdENmZ1snaGlnaGxpZ2h0J10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRUaGVtZSwgJ0ludmFsaWQgdGhlbWUgdHlwZSBzcGVjaWZpZWQnCisgICAgICAgICNmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIHZhbHVlcyBhcmUgcHJvdmRlZCBmb3IgZWFjaCB0aGVtZSBlbGVtZW50CisgICAgICAgICMoYXBhcnQgZnJvbSBjdXJzb3IpIGV2ZW4gdGhvdWdoIGFsbCB0aGVzZSB2YWx1ZXMgYXJlIG5vdCB5ZXQgdXNlZAorICAgICAgICAjYnkgaWRsZSwgdG8gYWxsb3cgZm9yIHRoZWlyIHVzZSBpbiB0aGUgZnV0dXJlLiBEZWZhdWx0IHZhbHVlcyBhcmUKKyAgICAgICAgI2dlbmVyYWxseSBibGFjayBhbmQgd2hpdGUuCisgICAgICAgIHRoZW1lPXsgJ25vcm1hbC1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ25vcm1hbC1iYWNrZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ2tleXdvcmQtZm9yZWdyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdrZXl3b3JkLWJhY2tncm91bmQnOicjZmZmZmZmJywKKyAgICAgICAgICAgICAgICAnYnVpbHRpbi1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ2J1aWx0aW4tYmFja2dyb3VuZCc6JyNmZmZmZmYnLAorICAgICAgICAgICAgICAgICdjb21tZW50LWZvcmVncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAnY29tbWVudC1iYWNrZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ3N0cmluZy1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ3N0cmluZy1iYWNrZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ2RlZmluaXRpb24tZm9yZWdyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICdkZWZpbml0aW9uLWJhY2tncm91bmQnOicjZmZmZmZmJywKKyAgICAgICAgICAgICAgICAnaGlsaXRlLWZvcmVncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAnaGlsaXRlLWJhY2tncm91bmQnOidncmF5JywKKyAgICAgICAgICAgICAgICAnYnJlYWstZm9yZWdyb3VuZCc6JyNmZmZmZmYnLAorICAgICAgICAgICAgICAgICdicmVhay1iYWNrZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ2hpdC1mb3JlZ3JvdW5kJzonI2ZmZmZmZicsCisgICAgICAgICAgICAgICAgJ2hpdC1iYWNrZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ2Vycm9yLWZvcmVncm91bmQnOicjZmZmZmZmJywKKyAgICAgICAgICAgICAgICAnZXJyb3ItYmFja2dyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICNjdXJzb3IgKG9ubHkgZm9yZWdyb3VuZCBjYW4gYmUgc2V0KQorICAgICAgICAgICAgICAgICdjdXJzb3ItZm9yZWdyb3VuZCc6JyMwMDAwMDAnLAorICAgICAgICAgICAgICAgICNzaGVsbCB3aW5kb3cKKyAgICAgICAgICAgICAgICAnc3Rkb3V0LWZvcmVncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAnc3Rkb3V0LWJhY2tncm91bmQnOicjZmZmZmZmJywKKyAgICAgICAgICAgICAgICAnc3RkZXJyLWZvcmVncm91bmQnOicjMDAwMDAwJywKKyAgICAgICAgICAgICAgICAnc3RkZXJyLWJhY2tncm91bmQnOicjZmZmZmZmJywKKyAgICAgICAgICAgICAgICAnY29uc29sZS1mb3JlZ3JvdW5kJzonIzAwMDAwMCcsCisgICAgICAgICAgICAgICAgJ2NvbnNvbGUtYmFja2dyb3VuZCc6JyNmZmZmZmYnIH0KKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gdGhlbWUua2V5cygpOgorICAgICAgICAgICAgaWYgbm90IGNmZ1BhcnNlci5oYXNfb3B0aW9uKHRoZW1lTmFtZSxlbGVtZW50KToKKyAgICAgICAgICAgICAgICAjd2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIGRlZmF1bHQsIHByaW50IHdhcm5pbmcKKyAgICAgICAgICAgICAgICB3YXJuaW5nPSgnXG4gV2FybmluZzogY29uZmlnSGFuZGxlci5weSAtIElkbGVDb25mLkdldFRoZW1lRGljdCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgLVxuIHByb2JsZW0gcmV0cmlldmluZyB0aGVtZSBlbGVtZW50ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuIGZyb20gdGhlbWUgJXIuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHJldHVybmluZyBkZWZhdWx0IHZhbHVlOiAlclxuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWxlbWVudCwgdGhlbWVOYW1lLCB0aGVtZVtlbGVtZW50XSkpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHdhcm5pbmcpCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGNvbG91cj1jZmdQYXJzZXIuR2V0KHRoZW1lTmFtZSxlbGVtZW50LGRlZmF1bHQ9dGhlbWVbZWxlbWVudF0pCisgICAgICAgICAgICB0aGVtZVtlbGVtZW50XT1jb2xvdXIKKyAgICAgICAgcmV0dXJuIHRoZW1lCisKKyAgICBkZWYgQ3VycmVudFRoZW1lKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSB0aGVtZQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuR2V0T3B0aW9uKCdtYWluJywnVGhlbWUnLCduYW1lJyxkZWZhdWx0PScnKQorCisgICAgZGVmIEN1cnJlbnRLZXlzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBrZXkgc2V0CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5HZXRPcHRpb24oJ21haW4nLCdLZXlzJywnbmFtZScsZGVmYXVsdD0nJykKKworICAgIGRlZiBHZXRFeHRlbnNpb25zKHNlbGYsIGFjdGl2ZV9vbmx5PVRydWUsIGVkaXRvcl9vbmx5PUZhbHNlLCBzaGVsbF9vbmx5PUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldHMgYSBsaXN0IG9mIGFsbCBpZGxlIGV4dGVuc2lvbnMgZGVjbGFyZWQgaW4gdGhlIGNvbmZpZyBmaWxlcy4KKyAgICAgICAgYWN0aXZlX29ubHkgLSBib29sZWFuLCBpZiB0cnVlIG9ubHkgcmV0dXJuIGFjdGl2ZSAoZW5hYmxlZCkgZXh0ZW5zaW9ucworICAgICAgICAiIiIKKyAgICAgICAgZXh0bnM9c2VsZi5SZW1vdmVLZXlCaW5kTmFtZXMoCisgICAgICAgICAgICAgICAgc2VsZi5HZXRTZWN0aW9uTGlzdCgnZGVmYXVsdCcsJ2V4dGVuc2lvbnMnKSkKKyAgICAgICAgdXNlckV4dG5zPXNlbGYuUmVtb3ZlS2V5QmluZE5hbWVzKAorICAgICAgICAgICAgICAgIHNlbGYuR2V0U2VjdGlvbkxpc3QoJ3VzZXInLCdleHRlbnNpb25zJykpCisgICAgICAgIGZvciBleHRuIGluIHVzZXJFeHRuczoKKyAgICAgICAgICAgIGlmIGV4dG4gbm90IGluIGV4dG5zOiAjdXNlciBoYXMgYWRkZWQgb3duIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIGV4dG5zLmFwcGVuZChleHRuKQorICAgICAgICBpZiBhY3RpdmVfb25seToKKyAgICAgICAgICAgIGFjdGl2ZUV4dG5zPVtdCisgICAgICAgICAgICBmb3IgZXh0biBpbiBleHRuczoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLkdldE9wdGlvbignZXh0ZW5zaW9ucycsIGV4dG4sICdlbmFibGUnLCBkZWZhdWx0PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0nYm9vbCcpOgorICAgICAgICAgICAgICAgICAgICAjdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgIGlmIGVkaXRvcl9vbmx5IG9yIHNoZWxsX29ubHk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlZGl0b3Jfb25seToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gPSAiZW5hYmxlX2VkaXRvciIKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0gImVuYWJsZV9zaGVsbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuR2V0T3B0aW9uKCdleHRlbnNpb25zJywgZXh0bixvcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVRydWUsIHR5cGU9J2Jvb2wnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Fybl9vbl9kZWZhdWx0PUZhbHNlKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVFeHRucy5hcHBlbmQoZXh0bikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZUV4dG5zLmFwcGVuZChleHRuKQorICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZUV4dG5zCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZXh0bnMKKworICAgIGRlZiBSZW1vdmVLZXlCaW5kTmFtZXMoc2VsZixleHRuTmFtZUxpc3QpOgorICAgICAgICAjZ2V0IHJpZCBvZiBrZXliaW5kaW5nIHNlY3Rpb24gbmFtZXMKKyAgICAgICAgbmFtZXM9ZXh0bk5hbWVMaXN0CisgICAgICAgIGtiTmFtZUluZGljaWVzPVtdCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgoJ19iaW5kaW5ncycsICdfY2ZnQmluZGluZ3MnKSk6CisgICAgICAgICAgICAgICAga2JOYW1lSW5kaWNpZXMuYXBwZW5kKG5hbWVzLmluZGV4KG5hbWUpKQorICAgICAgICBrYk5hbWVJbmRpY2llcy5zb3J0KCkKKyAgICAgICAga2JOYW1lSW5kaWNpZXMucmV2ZXJzZSgpCisgICAgICAgIGZvciBpbmRleCBpbiBrYk5hbWVJbmRpY2llczogI2RlbGV0ZSBlYWNoIGtleWJpbmRpbmcgc2VjdGlvbiBuYW1lCisgICAgICAgICAgICBkZWwobmFtZXNbaW5kZXhdKQorICAgICAgICByZXR1cm4gbmFtZXMKKworICAgIGRlZiBHZXRFeHRuTmFtZUZvckV2ZW50KHNlbGYsdmlydHVhbEV2ZW50KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IHZpcnR1YWxFdmVudCBpcyBib3VuZCBpbiwgb3IKKyAgICAgICAgTm9uZSBpZiBub3QgYm91bmQgaW4gYW55IGV4dGVuc2lvbi4KKyAgICAgICAgdmlydHVhbEV2ZW50IC0gc3RyaW5nLCBuYW1lIG9mIHRoZSB2aXJ0dWFsIGV2ZW50IHRvIHRlc3QgZm9yLCB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbmNsb3NpbmcgJzw8ID4+JworICAgICAgICAiIiIKKyAgICAgICAgZXh0TmFtZT1Ob25lCisgICAgICAgIHZFdmVudD0nPDwnK3ZpcnR1YWxFdmVudCsnPj4nCisgICAgICAgIGZvciBleHRuIGluIHNlbGYuR2V0RXh0ZW5zaW9ucyhhY3RpdmVfb25seT0wKToKKyAgICAgICAgICAgIGZvciBldmVudCBpbiBzZWxmLkdldEV4dGVuc2lvbktleXMoZXh0bikua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIGV2ZW50ID09IHZFdmVudDoKKyAgICAgICAgICAgICAgICAgICAgZXh0TmFtZT1leHRuCisgICAgICAgIHJldHVybiBleHROYW1lCisKKyAgICBkZWYgR2V0RXh0ZW5zaW9uS2V5cyhzZWxmLGV4dGVuc2lvbk5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJucyBhIGRpY3Rpb25hcnkgb2YgdGhlIGNvbmZpZ3VyYWJsZSBrZXliaW5kaW5ncyBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICAgIGV4dGVuc2lvbixhcyB0aGV5IGV4aXN0IGluIHRoZSBkaWN0aW9uYXJ5IHJldHVybmVkIGJ5IEdldEN1cnJlbnRLZXlTZXQ7CisgICAgICAgIHRoYXQgaXMsIHdoZXJlIHByZXZpb3VzbHkgdXNlZCBiaW5kaW5ncyBhcmUgZGlzYWJsZWQuCisgICAgICAgICIiIgorICAgICAgICBrZXlzTmFtZT1leHRlbnNpb25OYW1lKydfY2ZnQmluZGluZ3MnCisgICAgICAgIGFjdGl2ZUtleXM9c2VsZi5HZXRDdXJyZW50S2V5U2V0KCkKKyAgICAgICAgZXh0S2V5cz17fQorICAgICAgICBpZiBzZWxmLmRlZmF1bHRDZmdbJ2V4dGVuc2lvbnMnXS5oYXNfc2VjdGlvbihrZXlzTmFtZSk6CisgICAgICAgICAgICBldmVudE5hbWVzPXNlbGYuZGVmYXVsdENmZ1snZXh0ZW5zaW9ucyddLkdldE9wdGlvbkxpc3Qoa2V5c05hbWUpCisgICAgICAgICAgICBmb3IgZXZlbnROYW1lIGluIGV2ZW50TmFtZXM6CisgICAgICAgICAgICAgICAgZXZlbnQ9Jzw8JytldmVudE5hbWUrJz4+JworICAgICAgICAgICAgICAgIGJpbmRpbmc9YWN0aXZlS2V5c1tldmVudF0KKyAgICAgICAgICAgICAgICBleHRLZXlzW2V2ZW50XT1iaW5kaW5nCisgICAgICAgIHJldHVybiBleHRLZXlzCisKKyAgICBkZWYgX19HZXRSYXdFeHRlbnNpb25LZXlzKHNlbGYsZXh0ZW5zaW9uTmFtZSk6CisgICAgICAgICIiIgorICAgICAgICByZXR1cm5zIGEgZGljdGlvbmFyeSBvZiB0aGUgY29uZmlndXJhYmxlIGtleWJpbmRpbmdzIGZvciBhIHBhcnRpY3VsYXIKKyAgICAgICAgZXh0ZW5zaW9uLCBhcyBkZWZpbmVkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzLCBvciBhbiBlbXB0eSBkaWN0aW9uYXJ5CisgICAgICAgIGlmIG5vIGJpbmRpbmdzIGFyZSBmb3VuZAorICAgICAgICAiIiIKKyAgICAgICAga2V5c05hbWU9ZXh0ZW5zaW9uTmFtZSsnX2NmZ0JpbmRpbmdzJworICAgICAgICBleHRLZXlzPXt9CisgICAgICAgIGlmIHNlbGYuZGVmYXVsdENmZ1snZXh0ZW5zaW9ucyddLmhhc19zZWN0aW9uKGtleXNOYW1lKToKKyAgICAgICAgICAgIGV2ZW50TmFtZXM9c2VsZi5kZWZhdWx0Q2ZnWydleHRlbnNpb25zJ10uR2V0T3B0aW9uTGlzdChrZXlzTmFtZSkKKyAgICAgICAgICAgIGZvciBldmVudE5hbWUgaW4gZXZlbnROYW1lczoKKyAgICAgICAgICAgICAgICBiaW5kaW5nPXNlbGYuR2V0T3B0aW9uKCdleHRlbnNpb25zJyxrZXlzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSxkZWZhdWx0PScnKS5zcGxpdCgpCisgICAgICAgICAgICAgICAgZXZlbnQ9Jzw8JytldmVudE5hbWUrJz4+JworICAgICAgICAgICAgICAgIGV4dEtleXNbZXZlbnRdPWJpbmRpbmcKKyAgICAgICAgcmV0dXJuIGV4dEtleXMKKworICAgIGRlZiBHZXRFeHRlbnNpb25CaW5kaW5ncyhzZWxmLGV4dGVuc2lvbk5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGRpY3Rpb25hcnkgb2YgYWxsIHRoZSBldmVudCBiaW5kaW5ncyBmb3IgYSBwYXJ0aWN1bGFyCisgICAgICAgIGV4dGVuc2lvbi4gVGhlIGNvbmZpZ3VyYWJsZSBrZXliaW5kaW5ncyBhcmUgcmV0dXJuZWQgYXMgdGhleSBleGlzdCBpbgorICAgICAgICB0aGUgZGljdGlvbmFyeSByZXR1cm5lZCBieSBHZXRDdXJyZW50S2V5U2V0OyB0aGF0IGlzLCB3aGVyZSByZS11c2VkCisgICAgICAgIGtleWJpbmRpbmdzIGFyZSBkaXNhYmxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGJpbmRzTmFtZT1leHRlbnNpb25OYW1lKydfYmluZGluZ3MnCisgICAgICAgIGV4dEJpbmRzPXNlbGYuR2V0RXh0ZW5zaW9uS2V5cyhleHRlbnNpb25OYW1lKQorICAgICAgICAjYWRkIHRoZSBub24tY29uZmlndXJhYmxlIGJpbmRpbmdzCisgICAgICAgIGlmIHNlbGYuZGVmYXVsdENmZ1snZXh0ZW5zaW9ucyddLmhhc19zZWN0aW9uKGJpbmRzTmFtZSk6CisgICAgICAgICAgICBldmVudE5hbWVzPXNlbGYuZGVmYXVsdENmZ1snZXh0ZW5zaW9ucyddLkdldE9wdGlvbkxpc3QoYmluZHNOYW1lKQorICAgICAgICAgICAgZm9yIGV2ZW50TmFtZSBpbiBldmVudE5hbWVzOgorICAgICAgICAgICAgICAgIGJpbmRpbmc9c2VsZi5HZXRPcHRpb24oJ2V4dGVuc2lvbnMnLGJpbmRzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSxkZWZhdWx0PScnKS5zcGxpdCgpCisgICAgICAgICAgICAgICAgZXZlbnQ9Jzw8JytldmVudE5hbWUrJz4+JworICAgICAgICAgICAgICAgIGV4dEJpbmRzW2V2ZW50XT1iaW5kaW5nCisKKyAgICAgICAgcmV0dXJuIGV4dEJpbmRzCisKKyAgICBkZWYgR2V0S2V5QmluZGluZyhzZWxmLCBrZXlTZXROYW1lLCBldmVudFN0cik6CisgICAgICAgICIiIgorICAgICAgICByZXR1cm5zIHRoZSBrZXliaW5kaW5nIGZvciBhIHNwZWNpZmljIGV2ZW50LgorICAgICAgICBrZXlTZXROYW1lIC0gc3RyaW5nLCBuYW1lIG9mIGtleSBiaW5kaW5nIHNldAorICAgICAgICBldmVudFN0ciAtIHN0cmluZywgdGhlIHZpcnR1YWwgZXZlbnQgd2Ugd2FudCB0aGUgYmluZGluZyBmb3IsCisgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcsIGVnLiAnPDxldmVudD4+JworICAgICAgICAiIiIKKyAgICAgICAgZXZlbnROYW1lPWV2ZW50U3RyWzI6LTJdICN0cmltIG9mZiB0aGUgYW5nbGUgYnJhY2tldHMKKyAgICAgICAgYmluZGluZz1zZWxmLkdldE9wdGlvbigna2V5cycsa2V5U2V0TmFtZSxldmVudE5hbWUsZGVmYXVsdD0nJykuc3BsaXQoKQorICAgICAgICByZXR1cm4gYmluZGluZworCisgICAgZGVmIEdldEN1cnJlbnRLZXlTZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuR2V0S2V5U2V0KHNlbGYuQ3VycmVudEtleXMoKSkKKworICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgIyBXZSdyZSB1c2luZyBBcXVhVGssIHJlcGxhY2UgYWxsIGtleWJpbmdpbmdzIHRoYXQgdXNlIHRoZQorICAgICAgICAgICAgIyBBbHQga2V5IGJ5IG9uZXMgdGhhdCB1c2UgdGhlIE9wdGlvbiBrZXkgYmVjYXVzZSB0aGUgZm9ybWVyCisgICAgICAgICAgICAjIGRvbid0IHdvcmsgcmVsaWFibHkuCisgICAgICAgICAgICBmb3IgaywgdiBpbiByZXN1bHQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICB2MiA9IFsgeC5yZXBsYWNlKCc8QWx0LScsICc8T3B0aW9uLScpIGZvciB4IGluIHYgXQorICAgICAgICAgICAgICAgIGlmIHYgIT0gdjI6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrXSA9IHYyCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIEdldEtleVNldChzZWxmLGtleVNldE5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGRpY3Rpb25hcnkgb2Y6IGFsbCByZXF1ZXN0ZWQgY29yZSBrZXliaW5kaW5ncywgcGx1cyB0aGUKKyAgICAgICAga2V5YmluZGluZ3MgZm9yIGFsbCBjdXJyZW50bHkgYWN0aXZlIGV4dGVuc2lvbnMuIElmIGEgYmluZGluZyBkZWZpbmVkCisgICAgICAgIGluIGFuIGV4dGVuc2lvbiBpcyBhbHJlYWR5IGluIHVzZSwgdGhhdCBiaW5kaW5nIGlzIGRpc2FibGVkLgorICAgICAgICAiIiIKKyAgICAgICAga2V5U2V0PXNlbGYuR2V0Q29yZUtleXMoa2V5U2V0TmFtZSkKKyAgICAgICAgYWN0aXZlRXh0bnM9c2VsZi5HZXRFeHRlbnNpb25zKGFjdGl2ZV9vbmx5PTEpCisgICAgICAgIGZvciBleHRuIGluIGFjdGl2ZUV4dG5zOgorICAgICAgICAgICAgZXh0S2V5cz1zZWxmLl9fR2V0UmF3RXh0ZW5zaW9uS2V5cyhleHRuKQorICAgICAgICAgICAgaWYgZXh0S2V5czogI3RoZSBleHRlbnNpb24gZGVmaW5lcyBrZXliaW5kaW5ncworICAgICAgICAgICAgICAgIGZvciBldmVudCBpbiBleHRLZXlzLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0S2V5c1tldmVudF0gaW4ga2V5U2V0LnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgI3RoZSBiaW5kaW5nIGlzIGFscmVhZHkgaW4gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICBleHRLZXlzW2V2ZW50XT0nJyAjZGlzYWJsZSB0aGlzIGJpbmRpbmcKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0W2V2ZW50XT1leHRLZXlzW2V2ZW50XSAjYWRkIGJpbmRpbmcKKyAgICAgICAgcmV0dXJuIGtleVNldAorCisgICAgZGVmIElzQ29yZUJpbmRpbmcoc2VsZix2aXJ0dWFsRXZlbnQpOgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJucyB0cnVlIGlmIHRoZSB2aXJ0dWFsIGV2ZW50IGlzIGJvdW5kIGluIHRoZSBjb3JlIGlkbGUga2V5YmluZGluZ3MuCisgICAgICAgIHZpcnR1YWxFdmVudCAtIHN0cmluZywgbmFtZSBvZiB0aGUgdmlydHVhbCBldmVudCB0byB0ZXN0IGZvciwgd2l0aG91dAorICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW5jbG9zaW5nICc8PCA+PicKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAoJzw8Jyt2aXJ0dWFsRXZlbnQrJz4+JykgaW4gc2VsZi5HZXRDb3JlS2V5cygpLmtleXMoKQorCisgICAgZGVmIEdldENvcmVLZXlzKHNlbGYsIGtleVNldE5hbWU9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICByZXR1cm5zIHRoZSByZXF1ZXN0ZWQgc2V0IG9mIGNvcmUga2V5YmluZGluZ3MsIHdpdGggZmFsbGJhY2tzIGlmCisgICAgICAgIHJlcXVpcmVkLgorICAgICAgICBLZXliaW5kaW5ncyBsb2FkZWQgZnJvbSB0aGUgY29uZmlnIGZpbGUocykgYXJlIGxvYWRlZCBfb3Zlcl8gdGhlc2UKKyAgICAgICAgZGVmYXVsdHMsIHNvIGlmIHRoZXJlIGlzIGEgcHJvYmxlbSBnZXR0aW5nIGFueSBjb3JlIGJpbmRpbmcgdGhlcmUgd2lsbAorICAgICAgICBiZSBhbiAndWx0aW1hdGUgbGFzdCByZXNvcnQgZmFsbGJhY2snIHRvIHRoZSBDVUEtaXNoIGJpbmRpbmdzCisgICAgICAgIGRlZmluZWQgaGVyZS4KKyAgICAgICAgIiIiCisgICAgICAgIGtleUJpbmRpbmdzPXsKKyAgICAgICAgICAgICc8PGNvcHk+Pic6IFsnPENvbnRyb2wtYz4nLCAnPENvbnRyb2wtQz4nXSwKKyAgICAgICAgICAgICc8PGN1dD4+JzogWyc8Q29udHJvbC14PicsICc8Q29udHJvbC1YPiddLAorICAgICAgICAgICAgJzw8cGFzdGU+Pic6IFsnPENvbnRyb2wtdj4nLCAnPENvbnRyb2wtVj4nXSwKKyAgICAgICAgICAgICc8PGJlZ2lubmluZy1vZi1saW5lPj4nOiBbJzxDb250cm9sLWE+JywgJzxIb21lPiddLAorICAgICAgICAgICAgJzw8Y2VudGVyLWluc2VydD4+JzogWyc8Q29udHJvbC1sPiddLAorICAgICAgICAgICAgJzw8Y2xvc2UtYWxsLXdpbmRvd3M+Pic6IFsnPENvbnRyb2wtcT4nXSwKKyAgICAgICAgICAgICc8PGNsb3NlLXdpbmRvdz4+JzogWyc8QWx0LUY0PiddLAorICAgICAgICAgICAgJzw8ZG8tbm90aGluZz4+JzogWyc8Q29udHJvbC14PiddLAorICAgICAgICAgICAgJzw8ZW5kLW9mLWZpbGU+Pic6IFsnPENvbnRyb2wtZD4nXSwKKyAgICAgICAgICAgICc8PHB5dGhvbi1kb2NzPj4nOiBbJzxGMT4nXSwKKyAgICAgICAgICAgICc8PHB5dGhvbi1jb250ZXh0LWhlbHA+Pic6IFsnPFNoaWZ0LUYxPiddLAorICAgICAgICAgICAgJzw8aGlzdG9yeS1uZXh0Pj4nOiBbJzxBbHQtbj4nXSwKKyAgICAgICAgICAgICc8PGhpc3RvcnktcHJldmlvdXM+Pic6IFsnPEFsdC1wPiddLAorICAgICAgICAgICAgJzw8aW50ZXJydXB0LWV4ZWN1dGlvbj4+JzogWyc8Q29udHJvbC1jPiddLAorICAgICAgICAgICAgJzw8dmlldy1yZXN0YXJ0Pj4nOiBbJzxGNj4nXSwKKyAgICAgICAgICAgICc8PHJlc3RhcnQtc2hlbGw+Pic6IFsnPENvbnRyb2wtRjY+J10sCisgICAgICAgICAgICAnPDxvcGVuLWNsYXNzLWJyb3dzZXI+Pic6IFsnPEFsdC1jPiddLAorICAgICAgICAgICAgJzw8b3Blbi1tb2R1bGU+Pic6IFsnPEFsdC1tPiddLAorICAgICAgICAgICAgJzw8b3Blbi1uZXctd2luZG93Pj4nOiBbJzxDb250cm9sLW4+J10sCisgICAgICAgICAgICAnPDxvcGVuLXdpbmRvdy1mcm9tLWZpbGU+Pic6IFsnPENvbnRyb2wtbz4nXSwKKyAgICAgICAgICAgICc8PHBsYWluLW5ld2xpbmUtYW5kLWluZGVudD4+JzogWyc8Q29udHJvbC1qPiddLAorICAgICAgICAgICAgJzw8cHJpbnQtd2luZG93Pj4nOiBbJzxDb250cm9sLXA+J10sCisgICAgICAgICAgICAnPDxyZWRvPj4nOiBbJzxDb250cm9sLXk+J10sCisgICAgICAgICAgICAnPDxyZW1vdmUtc2VsZWN0aW9uPj4nOiBbJzxFc2NhcGU+J10sCisgICAgICAgICAgICAnPDxzYXZlLWNvcHktb2Ytd2luZG93LWFzLWZpbGU+Pic6IFsnPEFsdC1TaGlmdC1TPiddLAorICAgICAgICAgICAgJzw8c2F2ZS13aW5kb3ctYXMtZmlsZT4+JzogWyc8QWx0LXM+J10sCisgICAgICAgICAgICAnPDxzYXZlLXdpbmRvdz4+JzogWyc8Q29udHJvbC1zPiddLAorICAgICAgICAgICAgJzw8c2VsZWN0LWFsbD4+JzogWyc8QWx0LWE+J10sCisgICAgICAgICAgICAnPDx0b2dnbGUtYXV0by1jb2xvcmluZz4+JzogWyc8Q29udHJvbC1zbGFzaD4nXSwKKyAgICAgICAgICAgICc8PHVuZG8+Pic6IFsnPENvbnRyb2wtej4nXSwKKyAgICAgICAgICAgICc8PGZpbmQtYWdhaW4+Pic6IFsnPENvbnRyb2wtZz4nLCAnPEYzPiddLAorICAgICAgICAgICAgJzw8ZmluZC1pbi1maWxlcz4+JzogWyc8QWx0LUYzPiddLAorICAgICAgICAgICAgJzw8ZmluZC1zZWxlY3Rpb24+Pic6IFsnPENvbnRyb2wtRjM+J10sCisgICAgICAgICAgICAnPDxmaW5kPj4nOiBbJzxDb250cm9sLWY+J10sCisgICAgICAgICAgICAnPDxyZXBsYWNlPj4nOiBbJzxDb250cm9sLWg+J10sCisgICAgICAgICAgICAnPDxnb3RvLWxpbmU+Pic6IFsnPEFsdC1nPiddLAorICAgICAgICAgICAgJzw8c21hcnQtYmFja3NwYWNlPj4nOiBbJzxLZXktQmFja1NwYWNlPiddLAorICAgICAgICAgICAgJzw8bmV3bGluZS1hbmQtaW5kZW50Pj4nOiBbJzxLZXktUmV0dXJuPicsICc8S2V5LUtQX0VudGVyPiddLAorICAgICAgICAgICAgJzw8c21hcnQtaW5kZW50Pj4nOiBbJzxLZXktVGFiPiddLAorICAgICAgICAgICAgJzw8aW5kZW50LXJlZ2lvbj4+JzogWyc8Q29udHJvbC1LZXktYnJhY2tldHJpZ2h0PiddLAorICAgICAgICAgICAgJzw8ZGVkZW50LXJlZ2lvbj4+JzogWyc8Q29udHJvbC1LZXktYnJhY2tldGxlZnQ+J10sCisgICAgICAgICAgICAnPDxjb21tZW50LXJlZ2lvbj4+JzogWyc8QWx0LUtleS0zPiddLAorICAgICAgICAgICAgJzw8dW5jb21tZW50LXJlZ2lvbj4+JzogWyc8QWx0LUtleS00PiddLAorICAgICAgICAgICAgJzw8dGFiaWZ5LXJlZ2lvbj4+JzogWyc8QWx0LUtleS01PiddLAorICAgICAgICAgICAgJzw8dW50YWJpZnktcmVnaW9uPj4nOiBbJzxBbHQtS2V5LTY+J10sCisgICAgICAgICAgICAnPDx0b2dnbGUtdGFicz4+JzogWyc8QWx0LUtleS10PiddLAorICAgICAgICAgICAgJzw8Y2hhbmdlLWluZGVudHdpZHRoPj4nOiBbJzxBbHQtS2V5LXU+J10sCisgICAgICAgICAgICAnPDxkZWwtd29yZC1sZWZ0Pj4nOiBbJzxDb250cm9sLUtleS1CYWNrU3BhY2U+J10sCisgICAgICAgICAgICAnPDxkZWwtd29yZC1yaWdodD4+JzogWyc8Q29udHJvbC1LZXktRGVsZXRlPiddCisgICAgICAgICAgICB9CisgICAgICAgIGlmIGtleVNldE5hbWU6CisgICAgICAgICAgICBmb3IgZXZlbnQgaW4ga2V5QmluZGluZ3Mua2V5cygpOgorICAgICAgICAgICAgICAgIGJpbmRpbmc9c2VsZi5HZXRLZXlCaW5kaW5nKGtleVNldE5hbWUsZXZlbnQpCisgICAgICAgICAgICAgICAgaWYgYmluZGluZzoKKyAgICAgICAgICAgICAgICAgICAga2V5QmluZGluZ3NbZXZlbnRdPWJpbmRpbmcKKyAgICAgICAgICAgICAgICBlbHNlOiAjd2UgYXJlIGdvaW5nIHRvIHJldHVybiBhIGRlZmF1bHQsIHByaW50IHdhcm5pbmcKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZz0oJ1xuIFdhcm5pbmc6IGNvbmZpZ0hhbmRsZXIucHkgLSBJZGxlQ29uZi5HZXRDb3JlS2V5cycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIC1cbiBwcm9ibGVtIHJldHJpZXZpbmcga2V5IGJpbmRpbmcgZm9yIGV2ZW50ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbiBmcm9tIGtleSBzZXQgJXIuXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5pbmcgZGVmYXVsdCB2YWx1ZTogJXJcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmVudCwga2V5U2V0TmFtZSwga2V5QmluZGluZ3NbZXZlbnRdKSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSh3YXJuaW5nKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIGtleUJpbmRpbmdzCisKKyAgICBkZWYgR2V0RXh0cmFIZWxwU291cmNlTGlzdChzZWxmLGNvbmZpZ1NldCk6CisgICAgICAgICIiIkZldGNoIGxpc3Qgb2YgZXh0cmEgaGVscCBzb3VyY2VzIGZyb20gYSBnaXZlbiBjb25maWdTZXQuCisKKyAgICAgICAgVmFsaWQgY29uZmlnU2V0cyBhcmUgJ3VzZXInIG9yICdkZWZhdWx0Jy4gIFJldHVybiBhIGxpc3Qgb2YgdHVwbGVzIG9mCisgICAgICAgIHRoZSBmb3JtIChtZW51X2l0ZW0gLCBwYXRoX3RvX2hlbHBfZmlsZSAsIG9wdGlvbiksIG9yIHJldHVybiB0aGUgZW1wdHkKKyAgICAgICAgbGlzdC4gICdvcHRpb24nIGlzIHRoZSBzZXF1ZW5jZSBudW1iZXIgb2YgdGhlIGhlbHAgcmVzb3VyY2UuICAnb3B0aW9uJworICAgICAgICB2YWx1ZXMgZGV0ZXJtaW5lIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWVudSBpdGVtcyBvbiB0aGUgSGVscCBtZW51LAorICAgICAgICB0aGVyZWZvcmUgdGhlIHJldHVybmVkIGxpc3QgbXVzdCBiZSBzb3J0ZWQgYnkgJ29wdGlvbicuCisKKyAgICAgICAgIiIiCisgICAgICAgIGhlbHBTb3VyY2VzPVtdCisgICAgICAgIGlmIGNvbmZpZ1NldD09J3VzZXInOgorICAgICAgICAgICAgY2ZnUGFyc2VyPXNlbGYudXNlckNmZ1snbWFpbiddCisgICAgICAgIGVsaWYgY29uZmlnU2V0PT0nZGVmYXVsdCc6CisgICAgICAgICAgICBjZmdQYXJzZXI9c2VsZi5kZWZhdWx0Q2ZnWydtYWluJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEludmFsaWRDb25maWdTZXQsICdJbnZhbGlkIGNvbmZpZ1NldCBzcGVjaWZpZWQnCisgICAgICAgIG9wdGlvbnM9Y2ZnUGFyc2VyLkdldE9wdGlvbkxpc3QoJ0hlbHBGaWxlcycpCisgICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uczoKKyAgICAgICAgICAgIHZhbHVlPWNmZ1BhcnNlci5HZXQoJ0hlbHBGaWxlcycsb3B0aW9uLGRlZmF1bHQ9JzsnKQorICAgICAgICAgICAgaWYgdmFsdWUuZmluZCgnOycpPT0tMTogI21hbGZvcm1lZCBjb25maWcgZW50cnkgd2l0aCBubyAnOycKKyAgICAgICAgICAgICAgICBtZW51SXRlbT0nJyAjbWFrZSB0aGVzZSBlbXB0eQorICAgICAgICAgICAgICAgIGhlbHBQYXRoPScnICNzbyB2YWx1ZSB3b24ndCBiZSBhZGRlZCB0byBsaXN0CisgICAgICAgICAgICBlbHNlOiAjY29uZmlnIGVudHJ5IGNvbnRhaW5zICc7JyBhcyBleHBlY3RlZAorICAgICAgICAgICAgICAgIHZhbHVlPXN0cmluZy5zcGxpdCh2YWx1ZSwnOycpCisgICAgICAgICAgICAgICAgbWVudUl0ZW09dmFsdWVbMF0uc3RyaXAoKQorICAgICAgICAgICAgICAgIGhlbHBQYXRoPXZhbHVlWzFdLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG1lbnVJdGVtIGFuZCBoZWxwUGF0aDogI25laXRoZXIgYXJlIGVtcHR5IHN0cmluZ3MKKyAgICAgICAgICAgICAgICBoZWxwU291cmNlcy5hcHBlbmQoIChtZW51SXRlbSxoZWxwUGF0aCxvcHRpb24pICkKKyAgICAgICAgaGVscFNvdXJjZXMuc29ydChrZXk9bGFtYmRhIHg6IGludCh4WzJdKSkKKyAgICAgICAgcmV0dXJuIGhlbHBTb3VyY2VzCisKKyAgICBkZWYgR2V0QWxsRXh0cmFIZWxwU291cmNlc0xpc3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm5zIGEgbGlzdCBvZiB0dXBsZXMgY29udGFpbmluZyB0aGUgZGV0YWlscyBvZiBhbGwgYWRkaXRpb25hbCBoZWxwCisgICAgICAgIHNvdXJjZXMgY29uZmlndXJlZCwgb3IgYW4gZW1wdHkgbGlzdCBpZiB0aGVyZSBhcmUgbm9uZS4gVHVwbGVzIGFyZSBvZgorICAgICAgICB0aGUgZm9ybWF0IHJldHVybmVkIGJ5IEdldEV4dHJhSGVscFNvdXJjZUxpc3QuCisgICAgICAgICIiIgorICAgICAgICBhbGxIZWxwU291cmNlcz0oIHNlbGYuR2V0RXh0cmFIZWxwU291cmNlTGlzdCgnZGVmYXVsdCcpKworICAgICAgICAgICAgICAgIHNlbGYuR2V0RXh0cmFIZWxwU291cmNlTGlzdCgndXNlcicpICkKKyAgICAgICAgcmV0dXJuIGFsbEhlbHBTb3VyY2VzCisKKyAgICBkZWYgTG9hZENmZ0ZpbGVzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgbG9hZCBhbGwgY29uZmlndXJhdGlvbiBmaWxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5kZWZhdWx0Q2ZnLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuZGVmYXVsdENmZ1trZXldLkxvYWQoKQorICAgICAgICAgICAgc2VsZi51c2VyQ2ZnW2tleV0uTG9hZCgpICNzYW1lIGtleXMKKworICAgIGRlZiBTYXZlVXNlckNmZ0ZpbGVzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgd3JpdGUgYWxsIGxvYWRlZCB1c2VyIGNvbmZpZ3VyYXRpb24gZmlsZXMgYmFjayB0byBkaXNrCisgICAgICAgICIiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYudXNlckNmZy5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLnVzZXJDZmdba2V5XS5TYXZlKCkKKworaWRsZUNvbmY9SWRsZUNvbmYoKQorCisjIyMgbW9kdWxlIHRlc3QKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZGVmIGR1bXBDZmcoY2ZnKToKKyAgICAgICAgcHJpbnQgJ1xuJyxjZmcsJ1xuJworICAgICAgICBmb3Iga2V5IGluIGNmZy5rZXlzKCk6CisgICAgICAgICAgICBzZWN0aW9ucz1jZmdba2V5XS5zZWN0aW9ucygpCisgICAgICAgICAgICBwcmludCBrZXkKKyAgICAgICAgICAgIHByaW50IHNlY3Rpb25zCisgICAgICAgICAgICBmb3Igc2VjdGlvbiBpbiBzZWN0aW9uczoKKyAgICAgICAgICAgICAgICBvcHRpb25zPWNmZ1trZXldLm9wdGlvbnMoc2VjdGlvbikKKyAgICAgICAgICAgICAgICBwcmludCBzZWN0aW9uCisgICAgICAgICAgICAgICAgcHJpbnQgb3B0aW9ucworICAgICAgICAgICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uczoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgb3B0aW9uLCAnPScsIGNmZ1trZXldLkdldChzZWN0aW9uLG9wdGlvbikKKyAgICBkdW1wQ2ZnKGlkbGVDb25mLmRlZmF1bHRDZmcpCisgICAgZHVtcENmZyhpZGxlQ29uZi51c2VyQ2ZnKQorICAgIHByaW50IGlkbGVDb25mLnVzZXJDZmdbJ21haW4nXS5HZXQoJ1RoZW1lJywnbmFtZScpCisgICAgI3ByaW50IGlkbGVDb25mLnVzZXJDZmdbJ2hpZ2hsaWdodCddLkdldERlZkhpZ2hsaWdodCgnRm9vJywnbm9ybWFsJykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQ2MDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzQ2MDE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjExNjIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CkBAIC0wLDAgKzEsMTY5IEBACisiRGlhbG9nIHRvIHNwZWNpZnkgb3IgZWRpdCB0aGUgcGFyYW1ldGVycyBmb3IgYSB1c2VyIGNvbmZpZ3VyZWQgaGVscCBzb3VyY2UuIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCitpbXBvcnQgdGtNZXNzYWdlQm94CitpbXBvcnQgdGtGaWxlRGlhbG9nCisKK2NsYXNzIEdldEhlbHBTb3VyY2VEaWFsb2coVG9wbGV2ZWwpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHRpdGxlLCBtZW51SXRlbT0nJywgZmlsZVBhdGg9JycpOgorICAgICAgICAiIiJHZXQgbWVudSBlbnRyeSBhbmQgdXJsLyBsb2NhbCBmaWxlIGxvY2F0aW9uIGZvciBBZGRpdGlvbmFsIEhlbHAKKworICAgICAgICBVc2VyIHNlbGVjdHMgYSBuYW1lIGZvciB0aGUgSGVscCByZXNvdXJjZSBhbmQgcHJvdmlkZXMgYSB3ZWIgdXJsCisgICAgICAgIG9yIGEgbG9jYWwgZmlsZSBhcyBpdHMgc291cmNlLiAgVGhlIHVzZXIgY2FuIGVudGVyIGEgdXJsIG9yIGJyb3dzZQorICAgICAgICBmb3IgdGhlIGZpbGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKKyAgICAgICAgc2VsZi5yZXNpemFibGUoaGVpZ2h0PUZBTFNFLCB3aWR0aD1GQUxTRSkKKyAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQorICAgICAgICBzZWxmLmdyYWJfc2V0KCkKKyAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuQ2FuY2VsKQorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgc2VsZi5DcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgc2VsZi5tZW51LnNldChtZW51SXRlbSkKKyAgICAgICAgc2VsZi5wYXRoLnNldChmaWxlUGF0aCkKKyAgICAgICAgc2VsZi53aXRoZHJhdygpICNoaWRlIHdoaWxlIHNldHRpbmcgZ2VvbWV0cnkKKyAgICAgICAgI25lZWRzIHRvIGJlIGRvbmUgaGVyZSBzbyB0aGF0IHRoZSB3aW5mb19yZXF3aWR0aCBpcyB2YWxpZAorICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKQorICAgICAgICAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudDoKKyAgICAgICAgc2VsZi5nZW9tZXRyeSgiKyVkKyVkIiAlCisgICAgICAgICAgICAgICAgICAgICAgKChwYXJlbnQud2luZm9fcm9vdHgoKSArICgocGFyZW50LndpbmZvX3dpZHRoKCkvMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKSkpKSkKKyAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKKyAgICAgICAgc2VsZi5iaW5kKCc8UmV0dXJuPicsIHNlbGYuT2spCisgICAgICAgIHNlbGYud2FpdF93aW5kb3coKQorCisgICAgZGVmIENyZWF0ZVdpZGdldHMoc2VsZik6CisgICAgICAgIHNlbGYubWVudSA9IFN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLnBhdGggPSBTdHJpbmdWYXIoc2VsZikKKyAgICAgICAgc2VsZi5mb250U2l6ZSA9IFN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmZyYW1lTWFpbiA9IEZyYW1lKHNlbGYsIGJvcmRlcndpZHRoPTIsIHJlbGllZj1HUk9PVkUpCisgICAgICAgIHNlbGYuZnJhbWVNYWluLnBhY2soc2lkZT1UT1AsIGV4cGFuZD1UUlVFLCBmaWxsPUJPVEgpCisgICAgICAgIGxhYmVsTWVudSA9IExhYmVsKHNlbGYuZnJhbWVNYWluLCBhbmNob3I9VywganVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSdNZW51IEl0ZW06JykKKyAgICAgICAgc2VsZi5lbnRyeU1lbnUgPSBFbnRyeShzZWxmLmZyYW1lTWFpbiwgdGV4dHZhcmlhYmxlPXNlbGYubWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD0zMCkKKyAgICAgICAgc2VsZi5lbnRyeU1lbnUuZm9jdXNfc2V0KCkKKyAgICAgICAgbGFiZWxQYXRoID0gTGFiZWwoc2VsZi5mcmFtZU1haW4sIGFuY2hvcj1XLCBqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9J0hlbHAgRmlsZSBQYXRoOiBFbnRlciBVUkwgb3IgYnJvd3NlIGZvciBmaWxlJykKKyAgICAgICAgc2VsZi5lbnRyeVBhdGggPSBFbnRyeShzZWxmLmZyYW1lTWFpbiwgdGV4dHZhcmlhYmxlPXNlbGYucGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD00MCkKKyAgICAgICAgc2VsZi5lbnRyeU1lbnUuZm9jdXNfc2V0KCkKKyAgICAgICAgbGFiZWxNZW51LnBhY2soYW5jaG9yPVcsIHBhZHg9NSwgcGFkeT0zKQorICAgICAgICBzZWxmLmVudHJ5TWVudS5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKKyAgICAgICAgbGFiZWxQYXRoLnBhY2soYW5jaG9yPVcsIHBhZHg9NSwgcGFkeT0zKQorICAgICAgICBzZWxmLmVudHJ5UGF0aC5wYWNrKGFuY2hvcj1XLCBwYWR4PTUsIHBhZHk9MykKKyAgICAgICAgYnJvd3NlQnV0dG9uID0gQnV0dG9uKHNlbGYuZnJhbWVNYWluLCB0ZXh0PSdCcm93c2UnLCB3aWR0aD04LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1zZWxmLmJyb3dzZUZpbGUpCisgICAgICAgIGJyb3dzZUJ1dHRvbi5wYWNrKHBhZHk9MykKKyAgICAgICAgZnJhbWVCdXR0b25zID0gRnJhbWUoc2VsZikKKyAgICAgICAgZnJhbWVCdXR0b25zLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKyAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J09LJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD04LCBkZWZhdWx0PUFDVElWRSwgIGNvbW1hbmQ9c2VsZi5PaykKKyAgICAgICAgc2VsZi5idXR0b25Pay5ncmlkKHJvdz0wLCBjb2x1bW49MCwgcGFkeD01LHBhZHk9NSkKKyAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVCdXR0b25zLCB0ZXh0PSdDYW5jZWwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD04LCBjb21tYW5kPXNlbGYuQ2FuY2VsKQorICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbC5ncmlkKHJvdz0wLCBjb2x1bW49MSwgcGFkeD01LCBwYWR5PTUpCisKKyAgICBkZWYgYnJvd3NlRmlsZShzZWxmKToKKyAgICAgICAgZmlsZXR5cGVzID0gWworICAgICAgICAgICAgKCJIVE1MIEZpbGVzIiwgIiouaHRtICouaHRtbCIsICJURVhUIiksCisgICAgICAgICAgICAoIlBERiBGaWxlcyIsICIqLnBkZiIsICJURVhUIiksCisgICAgICAgICAgICAoIldpbmRvd3MgSGVscCBGaWxlcyIsICIqLmNobSIpLAorICAgICAgICAgICAgKCJUZXh0IEZpbGVzIiwgIioudHh0IiwgIlRFWFQiKSwKKyAgICAgICAgICAgICgiQWxsIEZpbGVzIiwgIioiKV0KKyAgICAgICAgcGF0aCA9IHNlbGYucGF0aC5nZXQoKQorICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgZGlyLCBiYXNlID0gb3MucGF0aC5zcGxpdChwYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmFzZSA9IE5vbmUKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICAgICAgZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuZXhlY3V0YWJsZSksICdEb2MnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcik6CisgICAgICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9wZW5kaWFsb2cgPSB0a0ZpbGVEaWFsb2cuT3BlbihwYXJlbnQ9c2VsZiwgZmlsZXR5cGVzPWZpbGV0eXBlcykKKyAgICAgICAgZmlsZSA9IG9wZW5kaWFsb2cuc2hvdyhpbml0aWFsZGlyPWRpciwgaW5pdGlhbGZpbGU9YmFzZSkKKyAgICAgICAgaWYgZmlsZToKKyAgICAgICAgICAgIHNlbGYucGF0aC5zZXQoZmlsZSkKKworICAgIGRlZiBNZW51T2soc2VsZik6CisgICAgICAgICJTaW1wbGUgdmFsaWRpdHkgY2hlY2sgZm9yIGEgc2Vuc2libGUgbWVudSBpdGVtIG5hbWUiCisgICAgICAgIG1lbnVPayA9IFRydWUKKyAgICAgICAgbWVudSA9IHNlbGYubWVudS5nZXQoKQorICAgICAgICBtZW51LnN0cmlwKCkKKyAgICAgICAgaWYgbm90IG1lbnU6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdNZW51IEl0ZW0gRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBtZW51IGl0ZW0gc3BlY2lmaWVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCisgICAgICAgICAgICBzZWxmLmVudHJ5TWVudS5mb2N1c19zZXQoKQorICAgICAgICAgICAgbWVudU9rID0gRmFsc2UKKyAgICAgICAgZWxpZiBsZW4obWVudSkgPiAzMDoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J01lbnUgSXRlbSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J01lbnUgaXRlbSB0b28gbG9uZzonCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuTGltaXQgMzAgY2hhcmFjdGVycy4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIHNlbGYuZW50cnlNZW51LmZvY3VzX3NldCgpCisgICAgICAgICAgICBtZW51T2sgPSBGYWxzZQorICAgICAgICByZXR1cm4gbWVudU9rCisKKyAgICBkZWYgUGF0aE9rKHNlbGYpOgorICAgICAgICAiU2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBtZW51IGZpbGUgcGF0aCIKKyAgICAgICAgcGF0aE9rID0gVHJ1ZQorICAgICAgICBwYXRoID0gc2VsZi5wYXRoLmdldCgpCisgICAgICAgIHBhdGguc3RyaXAoKQorICAgICAgICBpZiBub3QgcGF0aDogI25vIHBhdGggc3BlY2lmaWVkCisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdGaWxlIFBhdGggRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBoZWxwIGZpbGUgcGF0aCBzcGVjaWZpZWQuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCisgICAgICAgICAgICBzZWxmLmVudHJ5UGF0aC5mb2N1c19zZXQoKQorICAgICAgICAgICAgcGF0aE9rID0gRmFsc2UKKyAgICAgICAgZWxpZiBwYXRoLnN0YXJ0c3dpdGgoKCd3d3cuJywgJ2h0dHAnKSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwYXRoWzo1XSA9PSAnZmlsZTonOgorICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoWzU6XQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J0ZpbGUgUGF0aCBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdIZWxwIGZpbGUgcGF0aCBkb2VzIG5vdCBleGlzdC4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5lbnRyeVBhdGguZm9jdXNfc2V0KCkKKyAgICAgICAgICAgICAgICBwYXRoT2sgPSBGYWxzZQorICAgICAgICByZXR1cm4gcGF0aE9rCisKKyAgICBkZWYgT2soc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuTWVudU9rKCkgYW5kIHNlbGYuUGF0aE9rKCk6CisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IChzZWxmLm1lbnUuZ2V0KCkuc3RyaXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aC5nZXQoKS5zdHJpcCgpKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnJlc3VsdFsxXQorICAgICAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgoJ3d3dycsICdmaWxlOicsICdodHRwOicpKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgTWFjIFNhZmFyaSBpbnNpc3RzIG9uIHVzaW5nIHRoZSBVUkkgZm9ybSBmb3IgbG9jYWwgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBsaXN0KHNlbGYucmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdFsxXSA9ICJmaWxlOi8vIiArIHBhdGgKKyAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKyAgICBkZWYgQ2FuY2VsKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjdGVzdCB0aGUgZGlhbG9nCisgICAgcm9vdCA9IFRrKCkKKyAgICBkZWYgcnVuKCk6CisgICAgICAgIGtleVNlcSA9ICcnCisgICAgICAgIGRsZyA9IEdldEhlbHBTb3VyY2VEaWFsb2cocm9vdCwgJ0dldCBIZWxwIFNvdXJjZScpCisgICAgICAgIHByaW50IGRsZy5yZXN1bHQKKyAgICBCdXR0b24ocm9vdCx0ZXh0PSdEaWFsb2cnLCBjb21tYW5kPXJ1bikucGFjaygpCisgICAgcm9vdC5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGViYjAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnSGVscFNvdXJjZUVkaXQucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGViYjAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvY29uZmlnU2VjdGlvbk5hbWVEaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxYjAwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weQpAQCAtMCwwICsxLDk3IEBACisiIiIKK0RpYWxvZyB0aGF0IGFsbG93cyB1c2VyIHRvIHNwZWNpZnkgYSBuZXcgY29uZmlnIGZpbGUgc2VjdGlvbiBuYW1lLgorVXNlZCB0byBnZXQgbmV3IGhpZ2hsaWdodCB0aGVtZSBhbmQga2V5YmluZGluZyBzZXQgbmFtZXMuCisiIiIKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgoraW1wb3J0IHRrTWVzc2FnZUJveAorCitjbGFzcyBHZXRDZmdTZWN0aW9uTmFtZURpYWxvZyhUb3BsZXZlbCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYscGFyZW50LHRpdGxlLG1lc3NhZ2UsdXNlZE5hbWVzKToKKyAgICAgICAgIiIiCisgICAgICAgIG1lc3NhZ2UgLSBzdHJpbmcsIGluZm9ybWF0aW9uYWwgbWVzc2FnZSB0byBkaXNwbGF5CisgICAgICAgIHVzZWROYW1lcyAtIGxpc3QsIGxpc3Qgb2YgbmFtZXMgYWxyZWFkeSBpbiB1c2UgZm9yIHZhbGlkaXR5IGNoZWNrCisgICAgICAgICIiIgorICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCisgICAgICAgIHNlbGYuY29uZmlndXJlKGJvcmRlcndpZHRoPTUpCisgICAgICAgIHNlbGYucmVzaXphYmxlKGhlaWdodD1GQUxTRSx3aWR0aD1GQUxTRSkKKyAgICAgICAgc2VsZi50aXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi50cmFuc2llbnQocGFyZW50KQorICAgICAgICBzZWxmLmdyYWJfc2V0KCkKKyAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuQ2FuY2VsKQorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLm1lc3NhZ2U9bWVzc2FnZQorICAgICAgICBzZWxmLnVzZWROYW1lcz11c2VkTmFtZXMKKyAgICAgICAgc2VsZi5yZXN1bHQ9JycKKyAgICAgICAgc2VsZi5DcmVhdGVXaWRnZXRzKCkKKyAgICAgICAgc2VsZi53aXRoZHJhdygpICNoaWRlIHdoaWxlIHNldHRpbmcgZ2VvbWV0cnkKKyAgICAgICAgc2VsZi51cGRhdGVfaWRsZXRhc2tzKCkKKyAgICAgICAgI25lZWRzIHRvIGJlIGRvbmUgaGVyZSBzbyB0aGF0IHRoZSB3aW5mb19yZXF3aWR0aCBpcyB2YWxpZAorICAgICAgICBzZWxmLm1lc3NhZ2VJbmZvLmNvbmZpZyh3aWR0aD1zZWxmLmZyYW1lTWFpbi53aW5mb19yZXF3aWR0aCgpKQorICAgICAgICBzZWxmLmdlb21ldHJ5KCIrJWQrJWQiICUKKyAgICAgICAgICAgICgocGFyZW50LndpbmZvX3Jvb3R4KCkrKChwYXJlbnQud2luZm9fd2lkdGgoKS8yKQorICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXF3aWR0aCgpLzIpKSwKKyAgICAgICAgICAgICAgcGFyZW50LndpbmZvX3Jvb3R5KCkrKChwYXJlbnQud2luZm9faGVpZ2h0KCkvMikKKyAgICAgICAgICAgICAgICAtKHNlbGYud2luZm9fcmVxaGVpZ2h0KCkvMikpICkpICkgI2NlbnRyZSBkaWFsb2cgb3ZlciBwYXJlbnQKKyAgICAgICAgc2VsZi5kZWljb25pZnkoKSAjZ2VvbWV0cnkgc2V0LCB1bmhpZGUKKyAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCisKKyAgICBkZWYgQ3JlYXRlV2lkZ2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi5uYW1lPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmZvbnRTaXplPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmZyYW1lTWFpbiA9IEZyYW1lKHNlbGYsYm9yZGVyd2lkdGg9MixyZWxpZWY9U1VOS0VOKQorICAgICAgICBzZWxmLmZyYW1lTWFpbi5wYWNrKHNpZGU9VE9QLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5tZXNzYWdlSW5mbz1NZXNzYWdlKHNlbGYuZnJhbWVNYWluLGFuY2hvcj1XLGp1c3RpZnk9TEVGVCxwYWR4PTUscGFkeT01LAorICAgICAgICAgICAgICAgIHRleHQ9c2VsZi5tZXNzYWdlKSMsYXNwZWN0PTIwMCkKKyAgICAgICAgZW50cnlOYW1lPUVudHJ5KHNlbGYuZnJhbWVNYWluLHRleHR2YXJpYWJsZT1zZWxmLm5hbWUsd2lkdGg9MzApCisgICAgICAgIGVudHJ5TmFtZS5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLm1lc3NhZ2VJbmZvLnBhY2socGFkeD01LHBhZHk9NSkjLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKyAgICAgICAgZW50cnlOYW1lLnBhY2socGFkeD01LHBhZHk9NSkKKyAgICAgICAgZnJhbWVCdXR0b25zPUZyYW1lKHNlbGYpCisgICAgICAgIGZyYW1lQnV0dG9ucy5wYWNrKHNpZGU9Qk9UVE9NLGZpbGw9WCkKKyAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsdGV4dD0nT2snLAorICAgICAgICAgICAgICAgIHdpZHRoPTgsY29tbWFuZD1zZWxmLk9rKQorICAgICAgICBzZWxmLmJ1dHRvbk9rLmdyaWQocm93PTAsY29sdW1uPTAscGFkeD01LHBhZHk9NSkKKyAgICAgICAgc2VsZi5idXR0b25DYW5jZWwgPSBCdXR0b24oZnJhbWVCdXR0b25zLHRleHQ9J0NhbmNlbCcsCisgICAgICAgICAgICAgICAgd2lkdGg9OCxjb21tYW5kPXNlbGYuQ2FuY2VsKQorICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbC5ncmlkKHJvdz0wLGNvbHVtbj0xLHBhZHg9NSxwYWR5PTUpCisKKyAgICBkZWYgTmFtZU9rKHNlbGYpOgorICAgICAgICAjc2ltcGxlIHZhbGlkaXR5IGNoZWNrIGZvciBhIHNlbnNpYmxlCisgICAgICAgICNDb25maWdQYXJzZXIgZmlsZSBzZWN0aW9uIG5hbWUKKyAgICAgICAgbmFtZU9rPTEKKyAgICAgICAgbmFtZT1zZWxmLm5hbWUuZ2V0KCkKKyAgICAgICAgbmFtZS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBuYW1lOiAjbm8gbmFtZSBzcGVjaWZpZWQKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9J05hbWUgRXJyb3InLAorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBuYW1lIHNwZWNpZmllZC4nLCBwYXJlbnQ9c2VsZikKKyAgICAgICAgICAgIG5hbWVPaz0wCisgICAgICAgIGVsaWYgbGVuKG5hbWUpPjMwOiAjbmFtZSB0b28gbG9uZworICAgICAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nTmFtZSBFcnJvcicsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9J05hbWUgdG9vIGxvbmcuIEl0IHNob3VsZCBiZSBubyBtb3JlIHRoYW4gJysKKyAgICAgICAgICAgICAgICAgICAgJzMwIGNoYXJhY3RlcnMuJywgcGFyZW50PXNlbGYpCisgICAgICAgICAgICBuYW1lT2s9MAorICAgICAgICBlbGlmIG5hbWUgaW4gc2VsZi51c2VkTmFtZXM6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPSdOYW1lIEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nVGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdXNlLicsIHBhcmVudD1zZWxmKQorICAgICAgICAgICAgbmFtZU9rPTAKKyAgICAgICAgcmV0dXJuIG5hbWVPaworCisgICAgZGVmIE9rKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBpZiBzZWxmLk5hbWVPaygpOgorICAgICAgICAgICAgc2VsZi5yZXN1bHQ9c2VsZi5uYW1lLmdldCgpLnN0cmlwKCkKKyAgICAgICAgICAgIHNlbGYuZGVzdHJveSgpCisKKyAgICBkZWYgQ2FuY2VsKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnJlc3VsdD0nJworICAgICAgICBzZWxmLmRlc3Ryb3koKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICN0ZXN0IHRoZSBkaWFsb2cKKyAgICByb290PVRrKCkKKyAgICBkZWYgcnVuKCk6CisgICAgICAgIGtleVNlcT0nJworICAgICAgICBkbGc9R2V0Q2ZnU2VjdGlvbk5hbWVEaWFsb2cocm9vdCwnR2V0IE5hbWUnLAorICAgICAgICAgICAgICAgICdUaGUgaW5mb3JtYXRpb24gaGVyZSBzaG91bGQgbmVlZCB0byBiZSB3b3JkIHdyYXBwZWQuIFRlc3QuJykKKyAgICAgICAgcHJpbnQgZGxnLnJlc3VsdAorICAgIEJ1dHRvbihyb290LHRleHQ9J0RpYWxvZycsY29tbWFuZD1ydW4pLnBhY2soKQorICAgIHJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2NvbmZpZ1NlY3Rpb25OYW1lRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjYTY3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9jb25maWdTZWN0aW9uTmFtZURpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODFmN2JhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2R5bk9wdGlvbk1lbnVXaWRnZXQucHkKQEAgLTAsMCArMSwzNSBAQAorIiIiCitPcHRpb25NZW51IHdpZGdldCBtb2RpZmllZCB0byBhbGxvdyBkeW5hbWljIG1lbnUgcmVjb25maWd1cmF0aW9uCithbmQgc2V0dGluZyBvZiBoaWdobGlnaHR0aGlja25lc3MKKyIiIgorZnJvbSBUa2ludGVyIGltcG9ydCBPcHRpb25NZW51Citmcm9tIFRraW50ZXIgaW1wb3J0IF9zZXRpdAoraW1wb3J0IGNvcHkKKworY2xhc3MgRHluT3B0aW9uTWVudShPcHRpb25NZW51KToKKyAgICAiIiIKKyAgICB1bmxpa2UgT3B0aW9uTWVudSwgb3VyIGt3YXJncyBjYW4gaW5jbHVkZSBoaWdobGlnaHR0aGlja25lc3MKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCB2YXJpYWJsZSwgdmFsdWUsICp2YWx1ZXMsICoqa3dhcmdzKToKKyAgICAgICAgI2dldCBhIGNvcHkgb2Yga3dhcmdzIGJlZm9yZSBPcHRpb25NZW51Ll9faW5pdF9fIG11bmdlcyB0aGVtCisgICAgICAgIGt3YXJnc0NvcHk9Y29weS5jb3B5KGt3YXJncykKKyAgICAgICAgaWYgJ2hpZ2hsaWdodHRoaWNrbmVzcycgaW4ga3dhcmdzLmtleXMoKToKKyAgICAgICAgICAgIGRlbChrd2FyZ3NbJ2hpZ2hsaWdodHRoaWNrbmVzcyddKQorICAgICAgICBPcHRpb25NZW51Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFyaWFibGUsIHZhbHVlLCAqdmFsdWVzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5jb25maWcoaGlnaGxpZ2h0dGhpY2tuZXNzPWt3YXJnc0NvcHkuZ2V0KCdoaWdobGlnaHR0aGlja25lc3MnKSkKKyAgICAgICAgI3NlbGYubWVudT1zZWxmWydtZW51J10KKyAgICAgICAgc2VsZi52YXJpYWJsZT12YXJpYWJsZQorICAgICAgICBzZWxmLmNvbW1hbmQ9a3dhcmdzLmdldCgnY29tbWFuZCcpCisKKyAgICBkZWYgU2V0TWVudShzZWxmLHZhbHVlTGlzdCx2YWx1ZT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIGNsZWFyIGFuZCByZWxvYWQgdGhlIG1lbnUgd2l0aCBhIG5ldyBzZXQgb2Ygb3B0aW9ucy4KKyAgICAgICAgdmFsdWVMaXN0IC0gbGlzdCBvZiBuZXcgb3B0aW9ucworICAgICAgICB2YWx1ZSAtIGluaXRpYWwgdmFsdWUgdG8gc2V0IHRoZSBvcHRpb25tZW51J3MgbWVudWJ1dHRvbiB0bworICAgICAgICAiIiIKKyAgICAgICAgc2VsZlsnbWVudSddLmRlbGV0ZSgwLCdlbmQnKQorICAgICAgICBmb3IgaXRlbSBpbiB2YWx1ZUxpc3Q6CisgICAgICAgICAgICBzZWxmWydtZW51J10uYWRkX2NvbW1hbmQobGFiZWw9aXRlbSwKKyAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1fc2V0aXQoc2VsZi52YXJpYWJsZSxpdGVtLHNlbGYuY29tbWFuZCkpCisgICAgICAgIGlmIHZhbHVlOgorICAgICAgICAgICAgc2VsZi52YXJpYWJsZS5zZXQodmFsdWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjZDcwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvZHluT3B0aW9uTWVudVdpZGdldC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjZDcwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9keW5PcHRpb25NZW51V2lkZ2V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvZXh0ZW5kLnR4dCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9leHRlbmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5Y2IyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvZXh0ZW5kLnR4dApAQCAtMCwwICsxLDgzIEBACitXcml0aW5nIGFuIElETEUgZXh0ZW5zaW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FuIElETEUgZXh0ZW5zaW9uIGNhbiBkZWZpbmUgbmV3IGtleSBiaW5kaW5ncyBhbmQgbWVudSBlbnRyaWVzIGZvciBJRExFCitlZGl0IHdpbmRvd3MuICBUaGVyZSBpcyBhIHNpbXBsZSBtZWNoYW5pc20gdG8gbG9hZCBleHRlbnNpb25zIHdoZW4gSURMRQorc3RhcnRzIHVwIGFuZCB0byBhdHRhY2ggdGhlbSB0byBlYWNoIGVkaXQgd2luZG93LiAoSXQgaXMgYWxzbyBwb3NzaWJsZQordG8gbWFrZSBvdGhlciBjaGFuZ2VzIHRvIElETEUsIGJ1dCB0aGlzIG11c3QgYmUgZG9uZSBieSBlZGl0aW5nIHRoZSBJRExFCitzb3VyY2UgY29kZS4pCisKK1RoZSBsaXN0IG9mIGV4dGVuc2lvbnMgbG9hZGVkIGF0IHN0YXJ0dXAgdGltZSBpcyBjb25maWd1cmVkIGJ5IGVkaXRpbmcKK3RoZSBmaWxlIGNvbmZpZy1leHRlbnNpb25zLmRlZi4gIFNlZSBiZWxvdyBmb3IgZGV0YWlscy4KKworQW4gSURMRSBleHRlbnNpb24gaXMgZGVmaW5lZCBieSBhIGNsYXNzLiAgTWV0aG9kcyBvZiB0aGUgY2xhc3MgZGVmaW5lCithY3Rpb25zIHRoYXQgYXJlIGludm9rZWQgYnkgZXZlbnQgYmluZGluZ3Mgb3IgbWVudSBlbnRyaWVzLiBDbGFzcyAob3IKK2luc3RhbmNlKSB2YXJpYWJsZXMgZGVmaW5lIHRoZSBiaW5kaW5ncyBhbmQgbWVudSBhZGRpdGlvbnM7IHRoZXNlIGFyZQorYXV0b21hdGljYWxseSBhcHBsaWVkIGJ5IElETEUgd2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGxpbmtlZCB0byBhbiBlZGl0Cit3aW5kb3cuCisKK0FuIElETEUgZXh0ZW5zaW9uIGNsYXNzIGlzIGluc3RhbnRpYXRlZCB3aXRoIGEgc2luZ2xlIGFyZ3VtZW50LAorYGVkaXR3aW4nLCBhbiBFZGl0b3JXaW5kb3cgaW5zdGFuY2UuIFRoZSBleHRlbnNpb24gY2Fubm90IGFzc3VtZSBtdWNoCithYm91dCB0aGlzIGFyZ3VtZW50LCBidXQgaXQgaXMgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBmb2xsb3dpbmcgaW5zdGFuY2UKK3ZhcmlhYmxlczoKKworICAgIHRleHQJYSBUZXh0IGluc3RhbmNlIChhIHdpZGdldCkKKyAgICBpbwkJYW4gSU9CaW5kaW5nIGluc3RhbmNlIChtb3JlIGFib3V0IHRoaXMgbGF0ZXIpCisgICAgZmxpc3QJdGhlIEZpbGVMaXN0IGluc3RhbmNlIChzaGFyZWQgYnkgYWxsIGVkaXQgd2luZG93cykKKworKFRoZXJlIGFyZSBhIGZldyBtb3JlLCBidXQgdGhleSBhcmUgcmFyZWx5IHVzZWZ1bC4pCisKK1RoZSBleHRlbnNpb24gY2xhc3MgbXVzdCBub3QgZGlyZWN0bHkgYmluZCBXaW5kb3cgTWFuYWdlciAoZS5nLiBYKSBldmVudHMuCitSYXRoZXIsIGl0IG11c3QgZGVmaW5lIG9uZSBvciBtb3JlIHZpcnR1YWwgZXZlbnRzLCBlLmcuIDw8em9vbS1oZWlnaHQ+PiwgYW5kCitjb3JyZXNwb25kaW5nIG1ldGhvZHMsIGUuZy4gem9vbV9oZWlnaHRfZXZlbnQoKS4gIFRoZSB2aXJ0dWFsIGV2ZW50cyB3aWxsIGJlCitib3VuZCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzLCBhbmQgV2luZG93IE1hbmFnZXIgZXZlbnRzIGNhbiB0aGVuIGJlIGJvdW5kCit0byB0aGUgdmlydHVhbCBldmVudHMuIChUaGlzIGluZGlyZWN0aW9uIGlzIGRvbmUgc28gdGhhdCB0aGUga2V5IGJpbmRpbmdzIGNhbgorZWFzaWx5IGJlIGNoYW5nZWQsIGFuZCBzbyB0aGF0IG90aGVyIHNvdXJjZXMgb2YgdmlydHVhbCBldmVudHMgY2FuIGV4aXN0LCBzdWNoCithcyBtZW51IGVudHJpZXMuKQorCitBbiBleHRlbnNpb24gY2FuIGRlZmluZSBtZW51IGVudHJpZXMuICBUaGlzIGlzIGRvbmUgd2l0aCBhIGNsYXNzIG9yIGluc3RhbmNlCit2YXJpYWJsZSBuYW1lZCBtZW51ZGVmczsgaXQgc2hvdWxkIGJlIGEgbGlzdCBvZiBwYWlycywgd2hlcmUgZWFjaCBwYWlyIGlzIGEKK21lbnUgbmFtZSAobG93ZXJjYXNlKSBhbmQgYSBsaXN0IG9mIG1lbnUgZW50cmllcy4gRWFjaCBtZW51IGVudHJ5IGlzIGVpdGhlcgorTm9uZSAodG8gaW5zZXJ0IGEgc2VwYXJhdG9yIGVudHJ5KSBvciBhIHBhaXIgb2Ygc3RyaW5ncyAobWVudV9sYWJlbCwKK3ZpcnR1YWxfZXZlbnQpLiAgSGVyZSwgbWVudV9sYWJlbCBpcyB0aGUgbGFiZWwgb2YgdGhlIG1lbnUgZW50cnksIGFuZAordmlydHVhbF9ldmVudCBpcyB0aGUgdmlydHVhbCBldmVudCB0byBiZSBnZW5lcmF0ZWQgd2hlbiB0aGUgZW50cnkgaXMgc2VsZWN0ZWQuCitBbiB1bmRlcnNjb3JlIGluIHRoZSBtZW51IGxhYmVsIGlzIHJlbW92ZWQ7IHRoZSBjaGFyYWN0ZXIgZm9sbG93aW5nIHRoZQordW5kZXJzY29yZSBpcyBkaXNwbGF5ZWQgdW5kZXJsaW5lZCwgdG8gaW5kaWNhdGUgdGhlIHNob3J0Y3V0IGNoYXJhY3RlciAoZm9yCitXaW5kb3dzKS4KKworQXQgdGhlIG1vbWVudCwgZXh0ZW5zaW9ucyBjYW5ub3QgZGVmaW5lIHdob2xlIG5ldyBtZW51czsgdGhleSBtdXN0IGRlZmluZQorZW50cmllcyBpbiBleGlzdGluZyBtZW51cy4gIFNvbWUgbWVudXMgYXJlIG5vdCBwcmVzZW50IG9uIHNvbWUgd2luZG93czsgc3VjaAorZW50cnkgZGVmaW5pdGlvbnMgYXJlIHRoZW4gaWdub3JlZCwgYnV0IGtleSBiaW5kaW5ncyBhcmUgc3RpbGwgYXBwbGllZC4gIChUaGlzCitzaG91bGQgcHJvYmFibHkgYmUgcmVmaW5lZCBpbiB0aGUgZnV0dXJlLikKKworRXh0ZW5zaW9ucyBhcmUgbm90IHJlcXVpcmVkIHRvIGRlZmluZSBtZW51IGVudHJpZXMgZm9yIGFsbCB0aGUgZXZlbnRzIHRoZXkKK2ltcGxlbWVudC4gIChUaGV5IGFyZSBhbHNvIG5vdCByZXF1aXJlZCB0byBjcmVhdGUga2V5YmluZGluZ3MsIGJ1dCBpbiB0aGF0CitjYXNlIHRoZXJlIG11c3QgYmUgZW1wdHkgYmluZGluZ3MgaW4gY29maWctZXh0ZW5zaW9ucy5kZWYpCisKK0hlcmUgaXMgYSBjb21wbGV0ZSBleGFtcGxlOgorCitjbGFzcyBab29tSGVpZ2h0OgorCisgICAgbWVudWRlZnMgPSBbCisgICAgICAgICgnZWRpdCcsIFsKKyAgICAgICAgICAgIE5vbmUsICMgU2VwYXJhdG9yCisgICAgICAgICAgICAoJ19ab29tIEhlaWdodCcsICc8PHpvb20taGVpZ2h0Pj4nKSwKKyAgICAgICAgIF0pCisgICAgXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVkaXR3aW4pOgorICAgICAgICBzZWxmLmVkaXR3aW4gPSBlZGl0d2luCisKKyAgICBkZWYgem9vbV9oZWlnaHRfZXZlbnQoc2VsZiwgZXZlbnQpOgorICAgICAgICAiLi4uRG8gd2hhdCB5b3Ugd2FudCBoZXJlLi4uIgorCitUaGUgZmluYWwgcGllY2Ugb2YgdGhlIHB1enpsZSBpcyB0aGUgZmlsZSAiY29uZmlnLWV4dGVuc2lvbnMuZGVmIiwgd2hpY2ggaXMKK3VzZWQgdG8gY29uZmlndXJlIHRoZSBsb2FkaW5nIG9mIGV4dGVuc2lvbnMgYW5kIHRvIGVzdGFibGlzaCBrZXkgKG9yLCBtb3JlCitnZW5lcmFsbHksIGV2ZW50KSBiaW5kaW5ncyB0byB0aGUgdmlydHVhbCBldmVudHMgZGVmaW5lZCBpbiB0aGUgZXh0ZW5zaW9ucy4KKworU2VlIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mIGNvbmZpZy1leHRlbnNpb25zLmRlZiBmb3IgaW5mb3JtYXRpb24uICBJdCdzCitjdXJyZW50bHkgbmVjZXNzYXJ5IHRvIG1hbnVhbGx5IG1vZGlmeSB0aGF0IGZpbGUgdG8gY2hhbmdlIElETEUncyBleHRlbnNpb24KK2xvYWRpbmcgb3IgZXh0ZW5zaW9uIGtleSBiaW5kaW5ncy4KKworRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gYmluZGluZyByZWZlciB0byB0aGUgVGtpbnRlciBSZXNvdXJjZXMgd2ViIHBhZ2UgYXQKK3B5dGhvbi5vcmcgYW5kIHRvIHRoZSBUayBDb21tYW5kICJiaW5kIiBtYW4gcGFnZS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9oZWxwLnR4dCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9oZWxwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQyZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2hlbHAudHh0CkBAIC0wLDAgKzEsMzAyIEBACitbU2VlIHRoZSBlbmQgb2YgdGhpcyBmaWxlIGZvciAqKiBUSVBTICoqIG9uIHVzaW5nIElETEUgISFdCisKK0NsaWNrIG9uIHRoZSBkb3R0ZWQgbGluZSBhdCB0aGUgdG9wIG9mIGEgbWVudSB0byAidGVhciBpdCBvZmYiOiBhCitzZXBhcmF0ZSB3aW5kb3cgY29udGFpbmluZyB0aGUgbWVudSBpcyBjcmVhdGVkLgorCitGaWxlIE1lbnU6CisKKwlOZXcgV2luZG93ICAgICAgIC0tIENyZWF0ZSBhIG5ldyBlZGl0aW5nIHdpbmRvdworCU9wZW4uLi4gICAgICAgICAgLS0gT3BlbiBhbiBleGlzdGluZyBmaWxlCisJUmVjZW50IEZpbGVzLi4uICAtLSBPcGVuIGEgbGlzdCBvZiByZWNlbnQgZmlsZXMKKwlPcGVuIE1vZHVsZS4uLiAgIC0tIE9wZW4gYW4gZXhpc3RpbmcgbW9kdWxlIChzZWFyY2hlcyBzeXMucGF0aCkKKwlDbGFzcyBCcm93c2VyICAgIC0tIFNob3cgY2xhc3NlcyBhbmQgbWV0aG9kcyBpbiBjdXJyZW50IGZpbGUKKwlQYXRoIEJyb3dzZXIgICAgIC0tIFNob3cgc3lzLnBhdGggZGlyZWN0b3JpZXMsIG1vZHVsZXMsIGNsYXNzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbWV0aG9kcworCS0tLQorCVNhdmUgICAgICAgICAgICAgLS0gU2F2ZSBjdXJyZW50IHdpbmRvdyB0byB0aGUgYXNzb2NpYXRlZCBmaWxlICh1bnNhdmVkCisJCSAgICAgICAgICAgIHdpbmRvd3MgaGF2ZSBhICogYmVmb3JlIGFuZCBhZnRlciB0aGUgd2luZG93IHRpdGxlKQorCisJU2F2ZSBBcy4uLiAgICAgICAtLSBTYXZlIGN1cnJlbnQgd2luZG93IHRvIG5ldyBmaWxlLCB3aGljaCBiZWNvbWVzCisJCSAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIGZpbGUKKwlTYXZlIENvcHkgQXMuLi4gIC0tIFNhdmUgY3VycmVudCB3aW5kb3cgdG8gZGlmZmVyZW50IGZpbGUKKwkJICAgICAgICAgICAgd2l0aG91dCBjaGFuZ2luZyB0aGUgYXNzb2NpYXRlZCBmaWxlCisJLS0tCisJUHJpbnQgV2luZG93ICAgICAtLSBQcmludCB0aGUgY3VycmVudCB3aW5kb3cKKwktLS0KKwlDbG9zZSAgICAgICAgICAgIC0tIENsb3NlIGN1cnJlbnQgd2luZG93IChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKKwlFeGl0ICAgICAgICAgICAgIC0tIENsb3NlIGFsbCB3aW5kb3dzLCBxdWl0IChhc2tzIHRvIHNhdmUgaWYgdW5zYXZlZCkKKworRWRpdCBNZW51OgorCisJVW5kbyAgICAgICAgICAgICAtLSBVbmRvIGxhc3QgY2hhbmdlIHRvIGN1cnJlbnQgd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEEgbWF4aW11bSBvZiAxMDAwIGNoYW5nZXMgbWF5IGJlIHVuZG9uZSkKKwlSZWRvICAgICAgICAgICAgIC0tIFJlZG8gbGFzdCB1bmRvbmUgY2hhbmdlIHRvIGN1cnJlbnQgd2luZG93CisJLS0tCisJQ3V0ICAgICAgICAgICAgICAtLSBDb3B5IGEgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVsZXRlIHRoZSBzZWxlY3Rpb24KKwlDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCisJUGFzdGUgICAgICAgICAgICAtLSBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93CisJU2VsZWN0IEFsbCAgICAgICAtLSBTZWxlY3QgdGhlIGVudGlyZSBjb250ZW50cyBvZiB0aGUgZWRpdCBidWZmZXIKKwktLS0KKwlGaW5kLi4uICAgICAgICAgIC0tIE9wZW4gYSBzZWFyY2ggZGlhbG9nIGJveCB3aXRoIG1hbnkgb3B0aW9ucworCUZpbmQgQWdhaW4gICAgICAgLS0gUmVwZWF0IGxhc3Qgc2VhcmNoCisJRmluZCBTZWxlY3Rpb24gICAtLSBTZWFyY2ggZm9yIHRoZSBzdHJpbmcgaW4gdGhlIHNlbGVjdGlvbgorCUZpbmQgaW4gRmlsZXMuLi4gLS0gT3BlbiBhIHNlYXJjaCBkaWFsb2cgYm94IGZvciBzZWFyY2hpbmcgZmlsZXMKKwlSZXBsYWNlLi4uICAgICAgIC0tIE9wZW4gYSBzZWFyY2gtYW5kLXJlcGxhY2UgZGlhbG9nIGJveAorCUdvIHRvIExpbmUgICAgICAgLS0gQXNrIGZvciBhIGxpbmUgbnVtYmVyIGFuZCBzaG93IHRoYXQgbGluZQorCVNob3cgQ2FsbHRpcCAgICAgLS0gT3BlbiBhIHNtYWxsIHdpbmRvdyB3aXRoIGZ1bmN0aW9uIHBhcmFtIGhpbnRzCisJU2hvdyBDb21wbGV0aW9ucyAtLSBPcGVuIGEgc2Nyb2xsIHdpbmRvdyBhbGxvd2luZyBzZWxlY3Rpb24ga2V5d29yZHMKKwkJCSAgICBhbmQgYXR0cmlidXRlcy4gKHNlZSAnKlRJUFMqJywgYmVsb3cpCisJU2hvdyBQYXJlbnMJIC0tIEhpZ2hsaWdodCB0aGUgc3Vycm91bmRpbmcgcGFyZW50aGVzaXMKKwlFeHBhbmQgV29yZCAgICAgIC0tIEV4cGFuZCB0aGUgd29yZCB5b3UgaGF2ZSB0eXBlZCB0byBtYXRjaCBhbm90aGVyCisJCSAgICAgICAgICAgIHdvcmQgaW4gdGhlIHNhbWUgYnVmZmVyOyByZXBlYXQgdG8gZ2V0IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgZXhwYW5zaW9uCisKK0Zvcm1hdCBNZW51IChvbmx5IGluIEVkaXQgd2luZG93KToKKworCUluZGVudCBSZWdpb24gICAgICAgLS0gU2hpZnQgc2VsZWN0ZWQgbGluZXMgcmlnaHQgNCBzcGFjZXMKKwlEZWRlbnQgUmVnaW9uICAgICAgIC0tIFNoaWZ0IHNlbGVjdGVkIGxpbmVzIGxlZnQgNCBzcGFjZXMKKwlDb21tZW50IE91dCBSZWdpb24gIC0tIEluc2VydCAjIyBpbiBmcm9udCBvZiBzZWxlY3RlZCBsaW5lcworCVVuY29tbWVudCBSZWdpb24gICAgLS0gUmVtb3ZlIGxlYWRpbmcgIyBvciAjIyBmcm9tIHNlbGVjdGVkIGxpbmVzCisJVGFiaWZ5IFJlZ2lvbiAgICAgICAtLSBUdXJucyAqbGVhZGluZyogc3RyZXRjaGVzIG9mIHNwYWNlcyBpbnRvIHRhYnMKKwkJKE5vdGU6IFdlIHJlY29tbWVuZCB1c2luZyA0IHNwYWNlIGJsb2NrcyB0byBpbmRlbnQgUHl0aG9uIGNvZGUuKQorCVVudGFiaWZ5IFJlZ2lvbiAgICAgLS0gVHVybiAqYWxsKiB0YWJzIGludG8gdGhlIHJpZ2h0IG51bWJlciBvZiBzcGFjZXMKKwlOZXcgSW5kZW50IFdpZHRoLi4uIC0tIE9wZW4gZGlhbG9nIHRvIGNoYW5nZSBpbmRlbnQgd2lkdGgKKwlGb3JtYXQgUGFyYWdyYXBoICAgIC0tIFJlZm9ybWF0IHRoZSBjdXJyZW50IGJsYW5rLWxpbmUtc2VwYXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYWdyYXBoCisKK1J1biBNZW51IChvbmx5IGluIEVkaXQgd2luZG93KToKKworCVB5dGhvbiBTaGVsbCAtLSBPcGVuIG9yIHdha2UgdXAgdGhlIFB5dGhvbiBzaGVsbCB3aW5kb3cKKwktLS0KKwlDaGVjayBNb2R1bGUgLS0gUnVuIGEgc3ludGF4IGNoZWNrIG9uIHRoZSBtb2R1bGUKKwlSdW4gTW9kdWxlICAgLS0gRXhlY3V0ZSB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBfX21haW5fXyBuYW1lc3BhY2UKKworU2hlbGwgTWVudSAob25seSBpbiBTaGVsbCB3aW5kb3cpOgorCisJVmlldyBMYXN0IFJlc3RhcnQgLS0gU2Nyb2xsIHRoZSBzaGVsbCB3aW5kb3cgdG8gdGhlIGxhc3QgcmVzdGFydAorCVJlc3RhcnQgU2hlbGwgICAgIC0tIFJlc3RhcnQgdGhlIGludGVycHJldGVyIHdpdGggYSBmcmVzaCBlbnZpcm9ubWVudAorCitEZWJ1ZyBNZW51IChvbmx5IGluIFNoZWxsIHdpbmRvdyk6CisKKwlHbyB0byBGaWxlL0xpbmUgICAtLSBsb29rIGFyb3VuZCB0aGUgaW5zZXJ0IHBvaW50IGZvciBhIGZpbGVuYW1lCisJCSAgICAgICAgICAgICBhbmQgbGluZSBudW1iZXIsIG9wZW4gdGhlIGZpbGUsIGFuZCBzaG93IHRoZSBsaW5lCisJRGVidWdnZXIgKHRvZ2dsZSkgLS0gUnVuIGNvbW1hbmRzIGluIHRoZSBzaGVsbCB1bmRlciB0aGUgZGVidWdnZXIKKwlTdGFjayBWaWV3ZXIgICAgICAtLSBTaG93IHRoZSBzdGFjayB0cmFjZWJhY2sgb2YgdGhlIGxhc3QgZXhjZXB0aW9uCisJQXV0by1vcGVuIFN0YWNrIFZpZXdlciAodG9nZ2xlKSAtLSBPcGVuIHN0YWNrIHZpZXdlciBvbiB0cmFjZWJhY2sKKworT3B0aW9ucyBNZW51OgorCisJQ29uZmlndXJlIElETEUgLS0gT3BlbiBhIGNvbmZpZ3VyYXRpb24gZGlhbG9nLiAgRm9udHMsIGluZGVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZXliaW5kaW5ncywgYW5kIGNvbG9yIHRoZW1lcyBtYXkgYmUgYWx0ZXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnR1cCBQcmVmZXJlbmNlcyBtYXkgYmUgc2V0LCBhbmQgQWRkaXRpb25hbCBIZWxwCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZXMgY2FuIGJlIHNwZWNpZmllZC4KKwkJCSAgCisJCQkgIE9uIE9TIFggdGhpcyBtZW51IGlzIG5vdCBwcmVzZW50LCB1c2UKKwkJCSAgbWVudSAnSURMRSAtPiBQcmVmZXJlbmNlcy4uLicgaW5zdGVhZC4KKwktLS0KKwlDb2RlIENvbnRleHQgLS0JICBPcGVuIGEgcGFuZSBhdCB0aGUgdG9wIG9mIHRoZSBlZGl0IHdpbmRvdyB3aGljaAorCQkJICBzaG93cyB0aGUgYmxvY2sgY29udGV4dCBvZiB0aGUgc2VjdGlvbiBvZiBjb2RlCisJCQkgIHdoaWNoIGlzIHNjcm9sbGluZyBvZmYgdGhlIHRvcCBvciB0aGUgd2luZG93LgorCQkJICAoTm90IHByZXNlbnQgaW4gU2hlbGwgd2luZG93LikKKworV2luZG93cyBNZW51OgorCisJWm9vbSBIZWlnaHQgLS0gdG9nZ2xlcyB0aGUgd2luZG93IGJldHdlZW4gY29uZmlndXJlZCBzaXplCisJYW5kIG1heGltdW0gaGVpZ2h0LgorCS0tLQorCVRoZSByZXN0IG9mIHRoaXMgbWVudSBsaXN0cyB0aGUgbmFtZXMgb2YgYWxsIG9wZW4gd2luZG93czsKKwlzZWxlY3Qgb25lIHRvIGJyaW5nIGl0IHRvIHRoZSBmb3JlZ3JvdW5kIChkZWljb25pZnlpbmcgaXQgaWYKKwluZWNlc3NhcnkpLgorCitIZWxwIE1lbnU6CisKKwlBYm91dCBJRExFICAtLSBWZXJzaW9uLCBjb3B5cmlnaHQsIGxpY2Vuc2UsIGNyZWRpdHMKKwlJRExFIFJlYWRtZSAtLSBCYWNrZ3JvdW5kIGRpc2N1c3Npb24gYW5kIGNoYW5nZSBkZXRhaWxzCisJLS0tCisJSURMRSBIZWxwICAgLS0gRGlzcGxheSB0aGlzIGZpbGUKKwlQeXRob24gRG9jcyAtLSBBY2Nlc3MgbG9jYWwgUHl0aG9uIGRvY3VtZW50YXRpb24sIGlmCisJCSAgICAgICBpbnN0YWxsZWQuICBPdGhlcndpc2UsIGFjY2VzcyB3d3cucHl0aG9uLm9yZy4KKwktLS0KKwkoQWRkaXRpb25hbCBIZWxwIFNvdXJjZXMgbWF5IGJlIGFkZGVkIGhlcmUpCisKK0VkaXQgY29udGV4dCBtZW51IChSaWdodC1jbGljayAvIENvbnRyb2wtY2xpY2sgb24gT1MgWCBpbiBFZGl0IHdpbmRvdyk6CisKKyAgICAJQ3V0ICAgICAgICAgICAgICAtLSBDb3B5IGEgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gZGVsZXRlIHRoZSBzZWxlY3Rpb24KKwlDb3B5ICAgICAgICAgICAgIC0tIENvcHkgc2VsZWN0aW9uIGludG8gc3lzdGVtLXdpZGUgY2xpcGJvYXJkCisJUGFzdGUgICAgICAgICAgICAtLSBJbnNlcnQgc3lzdGVtLXdpZGUgY2xpcGJvYXJkIGludG8gd2luZG93CisJU2V0IEJyZWFrcG9pbnQgICAtLSBTZXRzIGEgYnJlYWtwb2ludCAod2hlbiBkZWJ1Z2dlciBvcGVuKQorCUNsZWFyIEJyZWFrcG9pbnQgLS0gQ2xlYXJzIHRoZSBicmVha3BvaW50IG9uIHRoYXQgbGluZQorCitTaGVsbCBjb250ZXh0IG1lbnUgKFJpZ2h0LWNsaWNrIC8gQ29udHJvbC1jbGljayBvbiBPUyBYIGluIFNoZWxsIHdpbmRvdyk6CisKKwlDdXQgICAgICAgICAgICAgIC0tIENvcHkgYSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkZWxldGUgdGhlIHNlbGVjdGlvbgorCUNvcHkgICAgICAgICAgICAgLS0gQ29weSBzZWxlY3Rpb24gaW50byBzeXN0ZW0td2lkZSBjbGlwYm9hcmQKKwlQYXN0ZSAgICAgICAgICAgIC0tIEluc2VydCBzeXN0ZW0td2lkZSBjbGlwYm9hcmQgaW50byB3aW5kb3cKKyAgICAgICAgLS0tCisJR28gdG8gZmlsZS9saW5lICAtLSBTYW1lIGFzIGluIERlYnVnIG1lbnUKKworCisqKiBUSVBTICoqCis9PT09PT09PT09CisKK0FkZGl0aW9uYWwgSGVscCBTb3VyY2VzOgorCisJV2luZG93cyB1c2VycyBjYW4gR29vZ2xlIG9uIHpvcGVzaGVsZi5jaG0gdG8gYWNjZXNzIFpvcGUgaGVscCBmaWxlcyBpbgorCXRoZSBXaW5kb3dzIGhlbHAgZm9ybWF0LiAgVGhlIEFkZGl0aW9uYWwgSGVscCBTb3VyY2VzIGZlYXR1cmUgb2YgdGhlCisJY29uZmlndXJhdGlvbiBHVUkgc3VwcG9ydHMgLmNobSwgYWxvbmcgd2l0aCBhbnkgb3RoZXIgZmlsZXR5cGVzCisJc3VwcG9ydGVkIGJ5IHlvdXIgYnJvd3Nlci4gIFN1cHBseSBhIE1lbnUgSXRlbSB0aXRsZSwgYW5kIGVudGVyIHRoZQorCWxvY2F0aW9uIGluIHRoZSBIZWxwIEZpbGUgUGF0aCBzbG90IG9mIHRoZSBOZXcgSGVscCBTb3VyY2UgZGlhbG9nLiAgVXNlCisJaHR0cDovLyBhbmQvb3Igd3d3LiB0byBpZGVudGlmeSBleHRlcm5hbCBVUkxzLCBvciBkb3dubG9hZCB0aGUgZmlsZSBhbmQKKwlicm93c2UgZm9yIGl0cyBwYXRoIG9uIHlvdXIgbWFjaGluZSB1c2luZyB0aGUgQnJvd3NlIGJ1dHRvbi4KKworCUFsbCB1c2VycyBjYW4gYWNjZXNzIHRoZSBleHRlbnNpdmUgc291cmNlcyBvZiBoZWxwLCBpbmNsdWRpbmcKKwl0dXRvcmlhbHMsIGF2YWlsYWJsZSBhdCB3d3cucHl0aG9uLm9yZy9kb2MuICBTZWxlY3RlZCBVUkxzIGNhbiBiZSBhZGRlZAorCW9yIHJlbW92ZWQgZnJvbSB0aGUgSGVscCBtZW51IGF0IGFueSB0aW1lIHVzaW5nIENvbmZpZ3VyZSBJRExFLgorCitCYXNpYyBlZGl0aW5nIGFuZCBuYXZpZ2F0aW9uOgorCisJQmFja3NwYWNlIGRlbGV0ZXMgY2hhciB0byB0aGUgbGVmdDsgREVMIGRlbGV0ZXMgY2hhciB0byB0aGUgcmlnaHQuCisJQ29udHJvbC1iYWNrc3BhY2UgZGVsZXRlcyB3b3JkIGxlZnQsIENvbnRyb2wtREVMIGRlbGV0ZXMgd29yZCByaWdodC4KKwlBcnJvdyBrZXlzIGFuZCBQYWdlIFVwL0Rvd24gbW92ZSBhcm91bmQuCisJQ29udHJvbC1sZWZ0L3JpZ2h0IEFycm93IG1vdmVzIGJ5IHdvcmRzIGluIGEgc3RyYW5nZSBidXQgdXNlZnVsIHdheS4KKwlIb21lL0VuZCBnbyB0byBiZWdpbi9lbmQgb2YgbGluZS4KKwlDb250cm9sLUhvbWUvRW5kIGdvIHRvIGJlZ2luL2VuZCBvZiBmaWxlLgorCVNvbWUgdXNlZnVsIEVtYWNzIGJpbmRpbmdzIGFyZSBpbmhlcml0ZWQgZnJvbSBUY2wvVGs6CisJCUNvbnRyb2wtYSAgICAgYmVnaW5uaW5nIG9mIGxpbmUKKwkJQ29udHJvbC1lICAgICBlbmQgb2YgbGluZQorCQlDb250cm9sLWsgICAgIGtpbGwgbGluZSAoYnV0IGRvZXNuJ3QgcHV0IGl0IGluIGNsaXBib2FyZCkKKwkJQ29udHJvbC1sICAgICBjZW50ZXIgd2luZG93IGFyb3VuZCB0aGUgaW5zZXJ0aW9uIHBvaW50CisJU3RhbmRhcmQgV2luZG93cyBiaW5kaW5ncyBtYXkgd29yayBvbiB0aGF0IHBsYXRmb3JtLgorCUtleWJpbmRpbmdzIGFyZSBzZWxlY3RlZCBpbiB0aGUgU2V0dGluZ3MgRGlhbG9nLCBsb29rIHRoZXJlLgorCitBdXRvbWF0aWMgaW5kZW50YXRpb246CisKKwlBZnRlciBhIGJsb2NrLW9wZW5pbmcgc3RhdGVtZW50LCB0aGUgbmV4dCBsaW5lIGlzIGluZGVudGVkIGJ5IDQgc3BhY2VzCisJKGluIHRoZSBQeXRob24gU2hlbGwgd2luZG93IGJ5IG9uZSB0YWIpLiAgQWZ0ZXIgY2VydGFpbiBrZXl3b3JkcworCShicmVhaywgcmV0dXJuIGV0Yy4pIHRoZSBuZXh0IGxpbmUgaXMgZGVkZW50ZWQuICBJbiBsZWFkaW5nCisJaW5kZW50YXRpb24sIEJhY2tzcGFjZSBkZWxldGVzIHVwIHRvIDQgc3BhY2VzIGlmIHRoZXkgYXJlIHRoZXJlLiAgVGFiCisJaW5zZXJ0cyBzcGFjZXMgKGluIHRoZSBQeXRob24gU2hlbGwgd2luZG93IG9uZSB0YWIpLCBudW1iZXIgZGVwZW5kcyBvbgorCUluZGVudCBXaWR0aC4gIChOLkIuIEN1cnJlbnRseSB0YWJzIGFyZSByZXN0cmljdGVkIHRvIGZvdXIgc3BhY2VzIGR1ZQorCXRvIFRjbC9UayBpc3N1ZXMuKQorCisgICAgICAgIFNlZSBhbHNvIHRoZSBpbmRlbnQvZGVkZW50IHJlZ2lvbiBjb21tYW5kcyBpbiB0aGUgZWRpdCBtZW51LgorCitDb21wbGV0aW9uczoKKworCUNvbXBsZXRpb25zIGFyZSBzdXBwbGllZCBmb3IgZnVuY3Rpb25zLCBjbGFzc2VzLCBhbmQgYXR0cmlidXRlcyBvZgorCWNsYXNzZXMsIGJvdGggYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZC4gIENvbXBsZXRpb25zIGFyZSBhbHNvIHByb3ZpZGVkCisJZm9yIGZpbGVuYW1lcy4KKworCVRoZSBBdXRvQ29tcGxldGVXaW5kb3cgKEFDVykgd2lsbCBvcGVuIGFmdGVyIGEgcHJlZGVmaW5lZCBkZWxheQorCShkZWZhdWx0IGlzIHR3byBzZWNvbmRzKSBhZnRlciBhICcuJyBvciAoaW4gYSBzdHJpbmcpIGFuIG9zLnNlcCBpcworCXR5cGVkLiAgSWYgYWZ0ZXIgb25lIG9mIHRob3NlIGNoYXJhY3RlcnMgKHBsdXMgemVybyBvciBtb3JlIG90aGVyCisJY2hhcmFjdGVycykgeW91IHR5cGUgYSBUYWIgdGhlIEFDVyB3aWxsIG9wZW4gaW1tZWRpYXRlbHkgaWYgYSBwb3NzaWJsZQorCWNvbnRpbnVhdGlvbiBpcyBmb3VuZC4KKworCUlmIHRoZXJlIGlzIG9ubHkgb25lIHBvc3NpYmxlIGNvbXBsZXRpb24gZm9yIHRoZSBjaGFyYWN0ZXJzIGVudGVyZWQsIGEKKwlUYWIgd2lsbCBzdXBwbHkgdGhhdCBjb21wbGV0aW9uIHdpdGhvdXQgb3BlbmluZyB0aGUgQUNXLgorCisJJ1Nob3cgQ29tcGxldGlvbnMnIHdpbGwgZm9yY2Ugb3BlbiBhIGNvbXBsZXRpb25zIHdpbmRvdy4gIEluIGFuIGVtcHR5CisJc3RyaW5nLCB0aGlzIHdpbGwgY29udGFpbiB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgT24gYQorCWJsYW5rIGxpbmUsIGl0IHdpbGwgY29udGFpbiB0aGUgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMgYW5kCisJY2xhc3NlcyBpbiB0aGUgY3VycmVudCBuYW1lIHNwYWNlcywgcGx1cyBhbnkgbW9kdWxlcyBpbXBvcnRlZC4gIElmIHNvbWUKKwljaGFyYWN0ZXJzIGhhdmUgYmVlbiBlbnRlcmVkLCB0aGUgQUNXIHdpbGwgYXR0ZW1wdCB0byBiZSBtb3JlIHNwZWNpZmljLgorCisJSWYgc3RyaW5nIG9mIGNoYXJhY3RlcnMgaXMgdHlwZWQsIHRoZSBBQ1cgc2VsZWN0aW9uIHdpbGwganVtcCB0byB0aGUKKwllbnRyeSBtb3N0IGNsb3NlbHkgbWF0Y2hpbmcgdGhvc2UgY2hhcmFjdGVycy4gRW50ZXJpbmcgYSBUYWIgd2lsbCBjYXVzZQorCXRoZSBsb25nZXN0IG5vbi1hbWJpZ3VvdXMgbWF0Y2ggdG8gYmUgZW50ZXJlZCBpbiB0aGUgRWRpdCB3aW5kb3cgb3IKKwlTaGVsbC4gIFR3byBUYWJzIGluIGEgcm93IHdpbGwgc3VwcGx5IHRoZSBjdXJyZW50IEFDVyBzZWxlY3Rpb24sIGFzCisJd2lsbCBSZXR1cm4gb3IgYSBkb3VibGUgY2xpY2suICBDdXJzb3Iga2V5cywgUGFnZSBVcC9Eb3duLCBtb3VzZQorCXNlbGVjdGlvbiwgYW5kIHRoZSBzY3JvbGx3aGVlbCBhbGwgb3BlcmF0ZSBvbiB0aGUgQUNXLgorCisJJ0hpZGRlbicgYXR0cmlidXRlcyBjYW4gYmUgYWNjZXNzZWQgYnkgdHlwaW5nIHRoZSBiZWdpbm5pbmcgb2YgaGlkZGVuCisJbmFtZSBhZnRlciBhICcuJy4gIGUuZy4gJ18nLiAgVGhpcyBhbGxvd3MgYWNjZXNzIHRvIG1vZHVsZXMgd2l0aAorCSdfX2FsbF9fJyBzZXQsIG9yIHRvIGNsYXNzLXByaXZhdGUgYXR0cmlidXRlcy4KKworCUNvbXBsZXRpb25zIGFuZCB0aGUgJ0V4cGFuZCBXb3JkJyBmYWNpbGl0eSBjYW4gc2F2ZSBhIGxvdCBvZiB0eXBpbmchCisKKwlDb21wbGV0aW9ucyBhcmUgY3VycmVudGx5IGxpbWl0ZWQgdG8gdGhvc2UgaW4gdGhlIG5hbWVzcGFjZXMuICBOYW1lcyBpbgorCWFuIEVkaXQgd2luZG93IHdoaWNoIGFyZSBub3QgdmlhIF9fbWFpbl9fIG9yIHN5cy5tb2R1bGVzIHdpbGwgbm90IGJlCisJZm91bmQuICBSdW4gdGhlIG1vZHVsZSBvbmNlIHdpdGggeW91ciBpbXBvcnRzIHRvIGNvcnJlY3QgdGhpcworCXNpdHVhdGlvbi4gIE5vdGUgdGhhdCBJRExFIGl0c2VsZiBwbGFjZXMgcXVpdGUgYSBmZXcgbW9kdWxlcyBpbgorCXN5cy5tb2R1bGVzLCBzbyBtdWNoIGNhbiBiZSBmb3VuZCBieSBkZWZhdWx0LCBlLmcuIHRoZSByZSBtb2R1bGUuCisKKwlJZiB5b3UgZG9uJ3QgbGlrZSB0aGUgQUNXIHBvcHBpbmcgdXAgdW5iaWRkZW4sIHNpbXBseSBtYWtlIHRoZSBkZWxheQorCWxvbmdlciBvciBkaXNhYmxlIHRoZSBleHRlbnNpb24uICBPVE9ILCB5b3UgY291bGQgbWFrZSB0aGUgZGVsYXkgemVyby4KKworCVlvdSBjb3VsZCBhbHNvIHN3aXRjaCBvZmYgdGhlIENhbGxUaXBzIGV4dGVuc2lvbi4gIChXZSB3aWxsIGJlIGFkZGluZworCWEgZGVsYXkgdG8gdGhlIGNhbGwgdGlwIHdpbmRvdy4pCisKK1B5dGhvbiBTaGVsbCB3aW5kb3c6CisKKwlDb250cm9sLWMgaW50ZXJydXB0cyBleGVjdXRpbmcgY29tbWFuZC4KKwlDb250cm9sLWQgc2VuZHMgZW5kLW9mLWZpbGU7IGNsb3NlcyB3aW5kb3cgaWYgdHlwZWQgYXQgPj4+IHByb21wdC4KKworICAgIENvbW1hbmQgaGlzdG9yeToKKworCUFsdC1wIHJldHJpZXZlcyBwcmV2aW91cyBjb21tYW5kIG1hdGNoaW5nIHdoYXQgeW91IGhhdmUgdHlwZWQuCisJQWx0LW4gcmV0cmlldmVzIG5leHQuCisJICAgICAgKFRoZXNlIGFyZSBDb250cm9sLXAsIENvbnRyb2wtbiBvbiBPUyBYKQorCVJldHVybiB3aGlsZSBjdXJzb3IgaXMgb24gYSBwcmV2aW91cyBjb21tYW5kIHJldHJpZXZlcyB0aGF0IGNvbW1hbmQuCisJRXhwYW5kIHdvcmQgaXMgYWxzbyB1c2VmdWwgdG8gcmVkdWNlIHR5cGluZy4KKworICAgIFN5bnRheCBjb2xvcnM6CisKKwlUaGUgY29sb3JpbmcgaXMgYXBwbGllZCBpbiBhIGJhY2tncm91bmQgInRocmVhZCIsIHNvIHlvdSBtYXkKKwlvY2Nhc2lvbmFsbHkgc2VlIHVuY29sb3JpemVkIHRleHQuICBUbyBjaGFuZ2UgdGhlIGNvbG9yCisJc2NoZW1lLCB1c2UgdGhlIENvbmZpZ3VyZSBJRExFIC8gSGlnaGxpZ2h0aW5nIGRpYWxvZy4KKworICAgIFB5dGhvbiBkZWZhdWx0IHN5bnRheCBjb2xvcnM6CisKKwlLZXl3b3JkcwlvcmFuZ2UKKwlCdWlsdGlucwlyb3lhbCBwdXJwbGUKKwlTdHJpbmdzCQlncmVlbgorCUNvbW1lbnRzCXJlZAorCURlZmluaXRpb25zCWJsdWUKKworICAgIFNoZWxsIGRlZmF1bHQgY29sb3JzOgorCisJQ29uc29sZSBvdXRwdXQJYnJvd24KKwlzdGRvdXQJCWJsdWUKKwlzdGRlcnIJCXJlZAorCXN0ZGluCQlibGFjaworCitPdGhlciBwcmVmZXJlbmNlczoKKworCVRoZSBmb250IHByZWZlcmVuY2VzLCBrZXliaW5kaW5nLCBhbmQgc3RhcnR1cCBwcmVmZXJlbmNlcyBjYW4KKwliZSBjaGFuZ2VkIHVzaW5nIHRoZSBTZXR0aW5ncyBkaWFsb2cuCisKK0NvbW1hbmQgbGluZSB1c2FnZToKKworCUVudGVyIGlkbGUgLWggYXQgdGhlIGNvbW1hbmQgcHJvbXB0IHRvIGdldCBhIHVzYWdlIG1lc3NhZ2UuCisKK1J1bm5pbmcgd2l0aG91dCBhIHN1YnByb2Nlc3M6CisKKwlJZiBJRExFIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgLW4gY29tbWFuZCBsaW5lIHN3aXRjaCBpdCB3aWxsIHJ1biBpbiBhCisJc2luZ2xlIHByb2Nlc3MgYW5kIHdpbGwgbm90IGNyZWF0ZSB0aGUgc3VicHJvY2VzcyB3aGljaCBydW5zIHRoZSBSUEMKKwlQeXRob24gZXhlY3V0aW9uIHNlcnZlci4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiBQeXRob24gY2Fubm90IGNyZWF0ZQorCXRoZSBzdWJwcm9jZXNzIG9yIHRoZSBSUEMgc29ja2V0IGludGVyZmFjZSBvbiB5b3VyIHBsYXRmb3JtLiAgSG93ZXZlciwKKwlpbiB0aGlzIG1vZGUgdXNlciBjb2RlIGlzIG5vdCBpc29sYXRlZCBmcm9tIElETEUgaXRzZWxmLiAgQWxzbywgdGhlCisJZW52aXJvbm1lbnQgaXMgbm90IHJlc3RhcnRlZCB3aGVuIFJ1bi9SdW4gTW9kdWxlIChGNSkgaXMgc2VsZWN0ZWQuICBJZgorCXlvdXIgY29kZSBoYXMgYmVlbiBtb2RpZmllZCwgeW91IG11c3QgcmVsb2FkKCkgdGhlIGFmZmVjdGVkIG1vZHVsZXMgYW5kCisJcmUtaW1wb3J0IGFueSBzcGVjaWZpYyBpdGVtcyAoZS5nLiBmcm9tIGZvbyBpbXBvcnQgYmF6KSBpZiB0aGUgY2hhbmdlcworCWFyZSB0byB0YWtlIGVmZmVjdC4gIEZvciB0aGVzZSByZWFzb25zLCBpdCBpcyBwcmVmZXJhYmxlIHRvIHJ1biBJRExFCisJd2l0aCB0aGUgZGVmYXVsdCBzdWJwcm9jZXNzIGlmIGF0IGFsbCBwb3NzaWJsZS4KKworRXh0ZW5zaW9uczoKKworCUlETEUgY29udGFpbnMgYW4gZXh0ZW5zaW9uIGZhY2lsaXR5LiAgU2VlIHRoZSBiZWdpbm5pbmcgb2YKKwljb25maWctZXh0ZW5zaW9ucy5kZWYgaW4gdGhlIGlkbGVsaWIgZGlyZWN0b3J5IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgorCVRoZSBkZWZhdWx0IGV4dGVuc2lvbnMgYXJlIGN1cnJlbnRseToKKworCQlGb3JtYXRQYXJhZ3JhcGgKKwkJQXV0b0V4cGFuZAorCQlab29tSGVpZ2h0CisJCVNjcmlwdEJpbmRpbmcKKwkJQ2FsbFRpcHMKKwkJUGFyZW5NYXRjaAorCQlBdXRvQ29tcGxldGUKKwkJQ29kZUNvbnRleHQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLmJhdCBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxlLmJhdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNzdiOTZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUuYmF0CkBAIC0wLDAgKzEsNCBAQAorQGVjaG8gb2ZmCityZW0gU3RhcnQgSURMRSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgUHl0aG9uIGludGVycHJldGVyCitzZXQgQ1VSUkRJUj0lfmRwMAorc3RhcnQgIklETEUiICIlQ1VSUkRJUiUuLlwuLlxweXRob253LmV4ZSIgIiVDVVJSRElSJWlkbGUucHl3IiAlMSAlMiAlMyAlNCAlNSAlNiAlNyAlOCAlOQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjQ5NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHkKQEAgLTAsMCArMSwxMSBAQAoraW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzeXMKKworIyBJZiB3ZSBhcmUgd29ya2luZyBvbiBhIGRldmVsb3BtZW50IHZlcnNpb24gb2YgSURMRSwgd2UgbmVlZCB0byBwcmVwZW5kIHRoZQorIyBwYXJlbnQgb2YgdGhpcyBpZGxlbGliIGRpciB0byBzeXMucGF0aC4gIE90aGVyd2lzZSwgaW1wb3J0aW5nIGlkbGVsaWIgZ2V0cworIyB0aGUgdmVyc2lvbiBpbnN0YWxsZWQgd2l0aCB0aGUgUHl0aG9uIHVzZWQgdG8gY2FsbCB0aGlzIG1vZHVsZToKK2lkbGVsaWJfZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSkKK3N5cy5wYXRoLmluc2VydCgwLCBpZGxlbGliX2RpcikKKworaW1wb3J0IGlkbGVsaWIuUHlTaGVsbAoraWRsZWxpYi5QeVNoZWxsLm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTMwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTMwMGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHl3IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGUucHl3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzN2RkNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvaWRsZS5weXcKQEAgLTAsMCArMSwyMSBAQAordHJ5OgorICAgIGltcG9ydCBpZGxlbGliLlB5U2hlbGwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAjIElETEUgaXMgbm90IGluc3RhbGxlZCwgYnV0IG1heWJlIFB5U2hlbGwgaXMgb24gc3lzLnBhdGg6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgUHlTaGVsbAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcmFpc2UKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWRsZWRpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoUHlTaGVsbC5fX2ZpbGVfXykpCisgICAgICAgIGlmIGlkbGVkaXIgIT0gb3MuZ2V0Y3dkKCk6CisgICAgICAgICAgICAjIFdlJ3JlIG5vdCBpbiB0aGUgSURMRSBkaXJlY3RvcnksIGhlbHAgdGhlIHN1YnByb2Nlc3MgZmluZCBydW4ucHkKKyAgICAgICAgICAgIHB5cGF0aCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywgJycpCisgICAgICAgICAgICBpZiBweXBhdGg6CisgICAgICAgICAgICAgICAgb3MuZW52aXJvblsnUFlUSE9OUEFUSCddID0gcHlwYXRoICsgJzonICsgaWRsZWRpcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWydQWVRIT05QQVRIJ10gPSBpZGxlZGlyCisgICAgICAgIFB5U2hlbGwubWFpbigpCitlbHNlOgorICAgIGlkbGVsaWIuUHlTaGVsbC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGV2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxYWZhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5CkBAIC0wLDAgKzEgQEAKK0lETEVfVkVSU0lPTiA9ICIyLjcuNSIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFiYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGV2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9pZGxldmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFiYTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2lkbGV2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzOWY4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CkBAIC0wLDAgKzEsMjY4IEBACisiIiIKK0RpYWxvZyBmb3IgYnVpbGRpbmcgVGtpbnRlciBhY2NlbGVyYXRvciBrZXkgYmluZGluZ3MKKyIiIgorZnJvbSBUa2ludGVyIGltcG9ydCAqCitpbXBvcnQgdGtNZXNzYWdlQm94CitpbXBvcnQgc3RyaW5nCisKK2NsYXNzIEdldEtleXNEaWFsb2coVG9wbGV2ZWwpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHBhcmVudCx0aXRsZSxhY3Rpb24sY3VycmVudEtleVNlcXVlbmNlcyk6CisgICAgICAgICIiIgorICAgICAgICBhY3Rpb24gLSBzdHJpbmcsIHRoZSBuYW1lIG9mIHRoZSB2aXJ0dWFsIGV2ZW50IHRoZXNlIGtleXMgd2lsbCBiZQorICAgICAgICAgICAgICAgICBtYXBwZWQgdG8KKyAgICAgICAgY3VycmVudEtleXMgLSBsaXN0LCBhIGxpc3Qgb2YgYWxsIGtleSBzZXF1ZW5jZSBsaXN0cyBjdXJyZW50bHkgbWFwcGVkCisgICAgICAgICAgICAgICAgIHRvIHZpcnR1YWwgZXZlbnRzLCBmb3Igb3ZlcmxhcCBjaGVja2luZworICAgICAgICAiIiIKKyAgICAgICAgVG9wbGV2ZWwuX19pbml0X18oc2VsZiwgcGFyZW50KQorICAgICAgICBzZWxmLmNvbmZpZ3VyZShib3JkZXJ3aWR0aD01KQorICAgICAgICBzZWxmLnJlc2l6YWJsZShoZWlnaHQ9RkFMU0Usd2lkdGg9RkFMU0UpCisgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgc2VsZi5ncmFiX3NldCgpCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLkNhbmNlbCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5hY3Rpb249YWN0aW9uCisgICAgICAgIHNlbGYuY3VycmVudEtleVNlcXVlbmNlcz1jdXJyZW50S2V5U2VxdWVuY2VzCisgICAgICAgIHNlbGYucmVzdWx0PScnCisgICAgICAgIHNlbGYua2V5U3RyaW5nPVN0cmluZ1ZhcihzZWxmKQorICAgICAgICBzZWxmLmtleVN0cmluZy5zZXQoJycpCisgICAgICAgIHNlbGYuU2V0TW9kaWZpZXJzRm9yUGxhdGZvcm0oKSAjIHNldCBzZWxmLm1vZGlmaWVycywgc2VsZi5tb2RpZmllcl9sYWJlbAorICAgICAgICBzZWxmLm1vZGlmaWVyX3ZhcnMgPSBbXQorICAgICAgICBmb3IgbW9kaWZpZXIgaW4gc2VsZi5tb2RpZmllcnM6CisgICAgICAgICAgICB2YXJpYWJsZSA9IFN0cmluZ1ZhcihzZWxmKQorICAgICAgICAgICAgdmFyaWFibGUuc2V0KCcnKQorICAgICAgICAgICAgc2VsZi5tb2RpZmllcl92YXJzLmFwcGVuZCh2YXJpYWJsZSkKKyAgICAgICAgc2VsZi5hZHZhbmNlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYuTG9hZEZpbmFsS2V5TGlzdCgpCisgICAgICAgIHNlbGYud2l0aGRyYXcoKSAjaGlkZSB3aGlsZSBzZXR0aW5nIGdlb21ldHJ5CisgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIHNlbGYuZ2VvbWV0cnkoIislZCslZCIgJQorICAgICAgICAgICAgKChwYXJlbnQud2luZm9fcm9vdHgoKSsoKHBhcmVudC53aW5mb193aWR0aCgpLzIpCisgICAgICAgICAgICAgICAgLShzZWxmLndpbmZvX3JlcXdpZHRoKCkvMikpLAorICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHkoKSsoKHBhcmVudC53aW5mb19oZWlnaHQoKS8yKQorICAgICAgICAgICAgICAgIC0oc2VsZi53aW5mb19yZXFoZWlnaHQoKS8yKSkgKSkgKSAjY2VudHJlIGRpYWxvZyBvdmVyIHBhcmVudAorICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICNnZW9tZXRyeSBzZXQsIHVuaGlkZQorICAgICAgICBzZWxmLndhaXRfd2luZG93KCkKKworICAgIGRlZiBDcmVhdGVXaWRnZXRzKHNlbGYpOgorICAgICAgICBmcmFtZU1haW4gPSBGcmFtZShzZWxmLGJvcmRlcndpZHRoPTIscmVsaWVmPVNVTktFTikKKyAgICAgICAgZnJhbWVNYWluLnBhY2soc2lkZT1UT1AsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICBmcmFtZUJ1dHRvbnM9RnJhbWUoc2VsZikKKyAgICAgICAgZnJhbWVCdXR0b25zLnBhY2soc2lkZT1CT1RUT00sZmlsbD1YKQorICAgICAgICBzZWxmLmJ1dHRvbk9LID0gQnV0dG9uKGZyYW1lQnV0dG9ucyx0ZXh0PSdPSycsCisgICAgICAgICAgICAgICAgd2lkdGg9OCxjb21tYW5kPXNlbGYuT0spCisgICAgICAgIHNlbGYuYnV0dG9uT0suZ3JpZChyb3c9MCxjb2x1bW49MCxwYWR4PTUscGFkeT01KQorICAgICAgICBzZWxmLmJ1dHRvbkNhbmNlbCA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsdGV4dD0nQ2FuY2VsJywKKyAgICAgICAgICAgICAgICB3aWR0aD04LGNvbW1hbmQ9c2VsZi5DYW5jZWwpCisgICAgICAgIHNlbGYuYnV0dG9uQ2FuY2VsLmdyaWQocm93PTAsY29sdW1uPTEscGFkeD01LHBhZHk9NSkKKyAgICAgICAgc2VsZi5mcmFtZUtleVNlcUJhc2ljID0gRnJhbWUoZnJhbWVNYWluKQorICAgICAgICBzZWxmLmZyYW1lS2V5U2VxQWR2YW5jZWQgPSBGcmFtZShmcmFtZU1haW4pCisgICAgICAgIHNlbGYuZnJhbWVDb250cm9sc0Jhc2ljID0gRnJhbWUoZnJhbWVNYWluKQorICAgICAgICBzZWxmLmZyYW1lSGVscEFkdmFuY2VkID0gRnJhbWUoZnJhbWVNYWluKQorICAgICAgICBzZWxmLmZyYW1lS2V5U2VxQWR2YW5jZWQuZ3JpZChyb3c9MCxjb2x1bW49MCxzdGlja3k9TlNFVyxwYWR4PTUscGFkeT01KQorICAgICAgICBzZWxmLmZyYW1lS2V5U2VxQmFzaWMuZ3JpZChyb3c9MCxjb2x1bW49MCxzdGlja3k9TlNFVyxwYWR4PTUscGFkeT01KQorICAgICAgICBzZWxmLmZyYW1lS2V5U2VxQmFzaWMubGlmdCgpCisgICAgICAgIHNlbGYuZnJhbWVIZWxwQWR2YW5jZWQuZ3JpZChyb3c9MSxjb2x1bW49MCxzdGlja3k9TlNFVyxwYWR4PTUpCisgICAgICAgIHNlbGYuZnJhbWVDb250cm9sc0Jhc2ljLmdyaWQocm93PTEsY29sdW1uPTAsc3RpY2t5PU5TRVcscGFkeD01KQorICAgICAgICBzZWxmLmZyYW1lQ29udHJvbHNCYXNpYy5saWZ0KCkKKyAgICAgICAgc2VsZi5idXR0b25MZXZlbCA9IEJ1dHRvbihmcmFtZU1haW4sY29tbWFuZD1zZWxmLlRvZ2dsZUxldmVsLAorICAgICAgICAgICAgICAgIHRleHQ9J0FkdmFuY2VkIEtleSBCaW5kaW5nIEVudHJ5ID4+JykKKyAgICAgICAgc2VsZi5idXR0b25MZXZlbC5ncmlkKHJvdz0yLGNvbHVtbj0wLHN0aWNrPUVXLHBhZHg9NSxwYWR5PTUpCisgICAgICAgIGxhYmVsVGl0bGVCYXNpYyA9IExhYmVsKHNlbGYuZnJhbWVLZXlTZXFCYXNpYywKKyAgICAgICAgICAgICAgICB0ZXh0PSJOZXcga2V5cyBmb3IgICciK3NlbGYuYWN0aW9uKyInIDoiKQorICAgICAgICBsYWJlbFRpdGxlQmFzaWMucGFjayhhbmNob3I9VykKKyAgICAgICAgbGFiZWxLZXlzQmFzaWMgPSBMYWJlbChzZWxmLmZyYW1lS2V5U2VxQmFzaWMsanVzdGlmeT1MRUZULAorICAgICAgICAgICAgICAgIHRleHR2YXJpYWJsZT1zZWxmLmtleVN0cmluZyxyZWxpZWY9R1JPT1ZFLGJvcmRlcndpZHRoPTIpCisgICAgICAgIGxhYmVsS2V5c0Jhc2ljLnBhY2soaXBhZHg9NSxpcGFkeT01LGZpbGw9WCkKKyAgICAgICAgc2VsZi5tb2RpZmllcl9jaGVja2J1dHRvbnMgPSB7fQorICAgICAgICBjb2x1bW4gPSAwCisgICAgICAgIGZvciBtb2RpZmllciwgdmFyaWFibGUgaW4gemlwKHNlbGYubW9kaWZpZXJzLCBzZWxmLm1vZGlmaWVyX3ZhcnMpOgorICAgICAgICAgICAgbGFiZWwgPSBzZWxmLm1vZGlmaWVyX2xhYmVsLmdldChtb2RpZmllciwgbW9kaWZpZXIpCisgICAgICAgICAgICBjaGVjaz1DaGVja2J1dHRvbihzZWxmLmZyYW1lQ29udHJvbHNCYXNpYywKKyAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuQnVpbGRLZXlTdHJpbmcsCisgICAgICAgICAgICAgICAgdGV4dD1sYWJlbCx2YXJpYWJsZT12YXJpYWJsZSxvbnZhbHVlPW1vZGlmaWVyLG9mZnZhbHVlPScnKQorICAgICAgICAgICAgY2hlY2suZ3JpZChyb3c9MCxjb2x1bW49Y29sdW1uLHBhZHg9MixzdGlja3k9VykKKyAgICAgICAgICAgIHNlbGYubW9kaWZpZXJfY2hlY2tidXR0b25zW21vZGlmaWVyXSA9IGNoZWNrCisgICAgICAgICAgICBjb2x1bW4gKz0gMQorICAgICAgICBsYWJlbEZuQWR2aWNlPUxhYmVsKHNlbGYuZnJhbWVDb250cm9sc0Jhc2ljLGp1c3RpZnk9TEVGVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PVwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU2VsZWN0IHRoZSBkZXNpcmVkIG1vZGlmaWVyIGtleXNcbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFib3ZlLCBhbmQgdGhlIGZpbmFsIGtleSBmcm9tIHRoZVxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCBvbiB0aGUgcmlnaHQuXG5cbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgdXBwZXIgY2FzZSBTeW1ib2xzIHdoZW4gdXNpbmdcbiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgU2hpZnQgbW9kaWZpZXIuICAoTGV0dGVycyB3aWxsIGJlXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udmVydGVkIGF1dG9tYXRpY2FsbHkuKSIpCisgICAgICAgIGxhYmVsRm5BZHZpY2UuZ3JpZChyb3c9MSxjb2x1bW49MCxjb2x1bW5zcGFuPTQscGFkeD0yLHN0aWNreT1XKQorICAgICAgICBzZWxmLmxpc3RLZXlzRmluYWw9TGlzdGJveChzZWxmLmZyYW1lQ29udHJvbHNCYXNpYyx3aWR0aD0xNSxoZWlnaHQ9MTAsCisgICAgICAgICAgICAgICAgc2VsZWN0bW9kZT1TSU5HTEUpCisgICAgICAgIHNlbGYubGlzdEtleXNGaW5hbC5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsc2VsZi5GaW5hbEtleVNlbGVjdGVkKQorICAgICAgICBzZWxmLmxpc3RLZXlzRmluYWwuZ3JpZChyb3c9MCxjb2x1bW49NCxyb3dzcGFuPTQsc3RpY2t5PU5TKQorICAgICAgICBzY3JvbGxLZXlzRmluYWw9U2Nyb2xsYmFyKHNlbGYuZnJhbWVDb250cm9sc0Jhc2ljLG9yaWVudD1WRVJUSUNBTCwKKyAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYubGlzdEtleXNGaW5hbC55dmlldykKKyAgICAgICAgc2VsZi5saXN0S2V5c0ZpbmFsLmNvbmZpZyh5c2Nyb2xsY29tbWFuZD1zY3JvbGxLZXlzRmluYWwuc2V0KQorICAgICAgICBzY3JvbGxLZXlzRmluYWwuZ3JpZChyb3c9MCxjb2x1bW49NSxyb3dzcGFuPTQsc3RpY2t5PU5TKQorICAgICAgICBzZWxmLmJ1dHRvbkNsZWFyPUJ1dHRvbihzZWxmLmZyYW1lQ29udHJvbHNCYXNpYywKKyAgICAgICAgICAgICAgICB0ZXh0PSdDbGVhciBLZXlzJyxjb21tYW5kPXNlbGYuQ2xlYXJLZXlTZXEpCisgICAgICAgIHNlbGYuYnV0dG9uQ2xlYXIuZ3JpZChyb3c9Mixjb2x1bW49MCxjb2x1bW5zcGFuPTQpCisgICAgICAgIGxhYmVsVGl0bGVBZHZhbmNlZCA9IExhYmVsKHNlbGYuZnJhbWVLZXlTZXFBZHZhbmNlZCxqdXN0aWZ5PUxFRlQsCisgICAgICAgICAgICAgICAgdGV4dD0iRW50ZXIgbmV3IGJpbmRpbmcocykgZm9yICAnIitzZWxmLmFjdGlvbisiJyA6XG4iKworICAgICAgICAgICAgICAgICIoVGhlc2UgYmluZGluZ3Mgd2lsbCBub3QgYmUgY2hlY2tlZCBmb3IgdmFsaWRpdHkhKSIpCisgICAgICAgIGxhYmVsVGl0bGVBZHZhbmNlZC5wYWNrKGFuY2hvcj1XKQorICAgICAgICBzZWxmLmVudHJ5S2V5c0FkdmFuY2VkPUVudHJ5KHNlbGYuZnJhbWVLZXlTZXFBZHZhbmNlZCwKKyAgICAgICAgICAgICAgICB0ZXh0dmFyaWFibGU9c2VsZi5rZXlTdHJpbmcpCisgICAgICAgIHNlbGYuZW50cnlLZXlzQWR2YW5jZWQucGFjayhmaWxsPVgpCisgICAgICAgIGxhYmVsSGVscEFkdmFuY2VkPUxhYmVsKHNlbGYuZnJhbWVIZWxwQWR2YW5jZWQsanVzdGlmeT1MRUZULAorICAgICAgICAgICAgdGV4dD0iS2V5IGJpbmRpbmdzIGFyZSBzcGVjaWZpZWQgdXNpbmcgVGtpbnRlciBrZXlzeW1zIGFzXG4iKworICAgICAgICAgICAgICAgICAiaW4gdGhlc2Ugc2FtcGxlczogPENvbnRyb2wtZj4sIDxTaGlmdC1GMj4sIDxGMTI+LFxuIgorICAgICAgICAgICAgICAgICAiPENvbnRyb2wtc3BhY2U+LCA8TWV0YS1sZXNzPiwgPENvbnRyb2wtQWx0LVNoaWZ0LVg+LlxuIgorICAgICAgICAgICAgICAgICAiVXBwZXIgY2FzZSBpcyB1c2VkIHdoZW4gdGhlIFNoaWZ0IG1vZGlmaWVyIGlzIHByZXNlbnQhXG5cbiIgKworICAgICAgICAgICAgICAgICAiJ0VtYWNzIHN0eWxlJyBtdWx0aS1rZXlzdHJva2UgYmluZGluZ3MgYXJlIHNwZWNpZmllZCBhc1xuIiArCisgICAgICAgICAgICAgICAgICJmb2xsb3dzOiA8Q29udHJvbC14PjxDb250cm9sLXk+LCB3aGVyZSB0aGUgZmlyc3Qga2V5XG4iICsKKyAgICAgICAgICAgICAgICAgImlzIHRoZSAnZG8tbm90aGluZycga2V5YmluZGluZy5cblxuIiArCisgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBzZXBhcmF0ZSBiaW5kaW5ncyBmb3Igb25lIGFjdGlvbiBzaG91bGQgYmVcbiIrCisgICAgICAgICAgICAgICAgICJzZXBhcmF0ZWQgYnkgYSBzcGFjZSwgZWcuLCA8QWx0LXY+IDxNZXRhLXY+LiIgKQorICAgICAgICBsYWJlbEhlbHBBZHZhbmNlZC5ncmlkKHJvdz0wLGNvbHVtbj0wLHN0aWNreT1OU0VXKQorCisgICAgZGVmIFNldE1vZGlmaWVyc0ZvclBsYXRmb3JtKHNlbGYpOgorICAgICAgICAiIiJEZXRlcm1pbmUgbGlzdCBvZiBuYW1lcyBvZiBrZXkgbW9kaWZpZXJzIGZvciB0aGlzIHBsYXRmb3JtLgorCisgICAgICAgIFRoZSBuYW1lcyBhcmUgdXNlZCB0byBidWlsZCBUayBiaW5kaW5ncyAtLSBpdCBkb2Vzbid0IG1hdHRlciBpZiB0aGUKKyAgICAgICAga2V5Ym9hcmQgaGFzIHRoZXNlIGtleXMsIGl0IG1hdHRlcnMgaWYgVGsgdW5kZXJzdGFuZHMgdGhlbS4gVGhlCisgICAgICAgIG9yZGVyIGlzIGFsc28gaW1wb3J0YW50OiBrZXkgYmluZGluZyBlcXVhbGl0eSBkZXBlbmRzIG9uIGl0LCBzbworICAgICAgICBjb25maWcta2V5cy5kZWYgbXVzdCB1c2UgdGhlIHNhbWUgb3JkZXJpbmcuCisgICAgICAgICIiIgorICAgICAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IG1hY29zeFN1cHBvcnQKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgIHNlbGYubW9kaWZpZXJzID0gWydTaGlmdCcsICdDb250cm9sJywgJ09wdGlvbicsICdDb21tYW5kJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubW9kaWZpZXJzID0gWydDb250cm9sJywgJ0FsdCcsICdTaGlmdCddCisgICAgICAgIHNlbGYubW9kaWZpZXJfbGFiZWwgPSB7J0NvbnRyb2wnOiAnQ3RybCd9ICMgc2hvcnQgbmFtZQorCisgICAgZGVmIFRvZ2dsZUxldmVsKHNlbGYpOgorICAgICAgICBpZiAgc2VsZi5idXR0b25MZXZlbC5jZ2V0KCd0ZXh0JylbOjhdPT0nQWR2YW5jZWQnOgorICAgICAgICAgICAgc2VsZi5DbGVhcktleVNlcSgpCisgICAgICAgICAgICBzZWxmLmJ1dHRvbkxldmVsLmNvbmZpZyh0ZXh0PSc8PCBCYXNpYyBLZXkgQmluZGluZyBFbnRyeScpCisgICAgICAgICAgICBzZWxmLmZyYW1lS2V5U2VxQWR2YW5jZWQubGlmdCgpCisgICAgICAgICAgICBzZWxmLmZyYW1lSGVscEFkdmFuY2VkLmxpZnQoKQorICAgICAgICAgICAgc2VsZi5lbnRyeUtleXNBZHZhbmNlZC5mb2N1c19zZXQoKQorICAgICAgICAgICAgc2VsZi5hZHZhbmNlZCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuQ2xlYXJLZXlTZXEoKQorICAgICAgICAgICAgc2VsZi5idXR0b25MZXZlbC5jb25maWcodGV4dD0nQWR2YW5jZWQgS2V5IEJpbmRpbmcgRW50cnkgPj4nKQorICAgICAgICAgICAgc2VsZi5mcmFtZUtleVNlcUJhc2ljLmxpZnQoKQorICAgICAgICAgICAgc2VsZi5mcmFtZUNvbnRyb2xzQmFzaWMubGlmdCgpCisgICAgICAgICAgICBzZWxmLmFkdmFuY2VkID0gRmFsc2UKKworICAgIGRlZiBGaW5hbEtleVNlbGVjdGVkKHNlbGYsZXZlbnQpOgorICAgICAgICBzZWxmLkJ1aWxkS2V5U3RyaW5nKCkKKworICAgIGRlZiBCdWlsZEtleVN0cmluZyhzZWxmKToKKyAgICAgICAga2V5TGlzdCA9IG1vZGlmaWVycyA9IHNlbGYuR2V0TW9kaWZpZXJzKCkKKyAgICAgICAgZmluYWxLZXkgPSBzZWxmLmxpc3RLZXlzRmluYWwuZ2V0KEFOQ0hPUikKKyAgICAgICAgaWYgZmluYWxLZXk6CisgICAgICAgICAgICBmaW5hbEtleSA9IHNlbGYuVHJhbnNsYXRlS2V5KGZpbmFsS2V5LCBtb2RpZmllcnMpCisgICAgICAgICAgICBrZXlMaXN0LmFwcGVuZChmaW5hbEtleSkKKyAgICAgICAgc2VsZi5rZXlTdHJpbmcuc2V0KCc8JyArIHN0cmluZy5qb2luKGtleUxpc3QsJy0nKSArICc+JykKKworICAgIGRlZiBHZXRNb2RpZmllcnMoc2VsZik6CisgICAgICAgIG1vZExpc3QgPSBbdmFyaWFibGUuZ2V0KCkgZm9yIHZhcmlhYmxlIGluIHNlbGYubW9kaWZpZXJfdmFyc10KKyAgICAgICAgcmV0dXJuIFttb2QgZm9yIG1vZCBpbiBtb2RMaXN0IGlmIG1vZF0KKworICAgIGRlZiBDbGVhcktleVNlcShzZWxmKToKKyAgICAgICAgc2VsZi5saXN0S2V5c0ZpbmFsLnNlbGVjdF9jbGVhcigwLEVORCkKKyAgICAgICAgc2VsZi5saXN0S2V5c0ZpbmFsLnl2aWV3KE1PVkVUTywgJzAuMCcpCisgICAgICAgIGZvciB2YXJpYWJsZSBpbiBzZWxmLm1vZGlmaWVyX3ZhcnM6CisgICAgICAgICAgICB2YXJpYWJsZS5zZXQoJycpCisgICAgICAgIHNlbGYua2V5U3RyaW5nLnNldCgnJykKKworICAgIGRlZiBMb2FkRmluYWxLZXlMaXN0KHNlbGYpOgorICAgICAgICAjdGhlc2UgdHVwbGVzIGFyZSBhbHNvIGF2YWlsYWJsZSBmb3IgdXNlIGluIHZhbGlkaXR5IGNoZWNrcworICAgICAgICBzZWxmLmZ1bmN0aW9uS2V5cz0oJ0YxJywnRjInLCdGMicsJ0Y0JywnRjUnLCdGNicsJ0Y3JywnRjgnLCdGOScsCisgICAgICAgICAgICAgICAgJ0YxMCcsJ0YxMScsJ0YxMicpCisgICAgICAgIHNlbGYuYWxwaGFudW1LZXlzPXR1cGxlKHN0cmluZy5hc2NpaV9sb3dlcmNhc2Urc3RyaW5nLmRpZ2l0cykKKyAgICAgICAgc2VsZi5wdW5jdHVhdGlvbktleXM9dHVwbGUoJ34hQCMlXiYqKClfLSs9e31bXXw7OiwuPD4vPycpCisgICAgICAgIHNlbGYud2hpdGVzcGFjZUtleXM9KCdUYWInLCdTcGFjZScsJ1JldHVybicpCisgICAgICAgIHNlbGYuZWRpdEtleXM9KCdCYWNrU3BhY2UnLCdEZWxldGUnLCdJbnNlcnQnKQorICAgICAgICBzZWxmLm1vdmVLZXlzPSgnSG9tZScsJ0VuZCcsJ1BhZ2UgVXAnLCdQYWdlIERvd24nLCdMZWZ0IEFycm93JywKKyAgICAgICAgICAgICAgICAnUmlnaHQgQXJyb3cnLCdVcCBBcnJvdycsJ0Rvd24gQXJyb3cnKQorICAgICAgICAjbWFrZSBhIHR1cGxlIG9mIG1vc3Qgb2YgdGhlIHVzZWZ1bCBjb21tb24gJ2ZpbmFsJyBrZXlzCisgICAgICAgIGtleXM9KHNlbGYuYWxwaGFudW1LZXlzK3NlbGYucHVuY3R1YXRpb25LZXlzK3NlbGYuZnVuY3Rpb25LZXlzKworICAgICAgICAgICAgICAgIHNlbGYud2hpdGVzcGFjZUtleXMrc2VsZi5lZGl0S2V5cytzZWxmLm1vdmVLZXlzKQorICAgICAgICBzZWxmLmxpc3RLZXlzRmluYWwuaW5zZXJ0KEVORCwgKmtleXMpCisKKyAgICBkZWYgVHJhbnNsYXRlS2V5KHNlbGYsIGtleSwgbW9kaWZpZXJzKToKKyAgICAgICAgIlRyYW5zbGF0ZSBmcm9tIGtleWNhcCBzeW1ib2wgdG8gdGhlIFRraW50ZXIga2V5c3ltIgorICAgICAgICB0cmFuc2xhdGVEaWN0ID0geydTcGFjZSc6J3NwYWNlJywKKyAgICAgICAgICAgICAgICAnfic6J2FzY2lpdGlsZGUnLCchJzonZXhjbGFtJywnQCc6J2F0JywnIyc6J251bWJlcnNpZ24nLAorICAgICAgICAgICAgICAgICclJzoncGVyY2VudCcsJ14nOidhc2NpaWNpcmN1bScsJyYnOidhbXBlcnNhbmQnLCcqJzonYXN0ZXJpc2snLAorICAgICAgICAgICAgICAgICcoJzoncGFyZW5sZWZ0JywnKSc6J3BhcmVucmlnaHQnLCdfJzondW5kZXJzY29yZScsJy0nOidtaW51cycsCisgICAgICAgICAgICAgICAgJysnOidwbHVzJywnPSc6J2VxdWFsJywneyc6J2JyYWNlbGVmdCcsJ30nOidicmFjZXJpZ2h0JywKKyAgICAgICAgICAgICAgICAnWyc6J2JyYWNrZXRsZWZ0JywnXSc6J2JyYWNrZXRyaWdodCcsJ3wnOidiYXInLCc7Jzonc2VtaWNvbG9uJywKKyAgICAgICAgICAgICAgICAnOic6J2NvbG9uJywnLCc6J2NvbW1hJywnLic6J3BlcmlvZCcsJzwnOidsZXNzJywnPic6J2dyZWF0ZXInLAorICAgICAgICAgICAgICAgICcvJzonc2xhc2gnLCc/JzoncXVlc3Rpb24nLCdQYWdlIFVwJzonUHJpb3InLCdQYWdlIERvd24nOidOZXh0JywKKyAgICAgICAgICAgICAgICAnTGVmdCBBcnJvdyc6J0xlZnQnLCdSaWdodCBBcnJvdyc6J1JpZ2h0JywnVXAgQXJyb3cnOidVcCcsCisgICAgICAgICAgICAgICAgJ0Rvd24gQXJyb3cnOiAnRG93bicsICdUYWInOidUYWInfQorICAgICAgICBpZiBrZXkgaW4gdHJhbnNsYXRlRGljdC5rZXlzKCk6CisgICAgICAgICAgICBrZXkgPSB0cmFuc2xhdGVEaWN0W2tleV0KKyAgICAgICAgaWYgJ1NoaWZ0JyBpbiBtb2RpZmllcnMgYW5kIGtleSBpbiBzdHJpbmcuYXNjaWlfbG93ZXJjYXNlOgorICAgICAgICAgICAga2V5ID0ga2V5LnVwcGVyKCkKKyAgICAgICAga2V5ID0gJ0tleS0nICsga2V5CisgICAgICAgIHJldHVybiBrZXkKKworICAgIGRlZiBPSyhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgaWYgc2VsZi5hZHZhbmNlZCBvciBzZWxmLktleXNPSygpOiAgIyBkb2Vzbid0IGNoZWNrIGFkdmFuY2VkIHN0cmluZyB5ZXQKKyAgICAgICAgICAgIHNlbGYucmVzdWx0PXNlbGYua2V5U3RyaW5nLmdldCgpCisgICAgICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisgICAgZGVmIENhbmNlbChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi5yZXN1bHQ9JycKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworICAgIGRlZiBLZXlzT0soc2VsZik6CisgICAgICAgICcnJ1ZhbGlkaXR5IGNoZWNrIG9uIHVzZXIncyAnYmFzaWMnIGtleWJpbmRpbmcgc2VsZWN0aW9uLgorCisgICAgICAgIERvZXNuJ3QgY2hlY2sgdGhlIHN0cmluZyBwcm9kdWNlZCBieSB0aGUgYWR2YW5jZWQgZGlhbG9nIGJlY2F1c2UKKyAgICAgICAgJ21vZGlmaWVycycgaXNuJ3Qgc2V0LgorCisgICAgICAgICcnJworICAgICAgICBrZXlzID0gc2VsZi5rZXlTdHJpbmcuZ2V0KCkKKyAgICAgICAga2V5cy5zdHJpcCgpCisgICAgICAgIGZpbmFsS2V5ID0gc2VsZi5saXN0S2V5c0ZpbmFsLmdldChBTkNIT1IpCisgICAgICAgIG1vZGlmaWVycyA9IHNlbGYuR2V0TW9kaWZpZXJzKCkKKyAgICAgICAgIyBjcmVhdGUgYSBrZXkgc2VxdWVuY2UgbGlzdCBmb3Igb3ZlcmxhcCBjaGVjazoKKyAgICAgICAga2V5U2VxdWVuY2UgPSBrZXlzLnNwbGl0KCkKKyAgICAgICAga2V5c09LID0gRmFsc2UKKyAgICAgICAgdGl0bGUgPSAnS2V5IFNlcXVlbmNlIEVycm9yJworICAgICAgICBpZiBub3Qga2V5czoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9dGl0bGUsIHBhcmVudD1zZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdObyBrZXlzIHNwZWNpZmllZC4nKQorICAgICAgICBlbGlmIG5vdCBrZXlzLmVuZHN3aXRoKCc+Jyk6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPXRpdGxlLCBwYXJlbnQ9c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTWlzc2luZyB0aGUgZmluYWwgS2V5JykKKyAgICAgICAgZWxpZiAobm90IG1vZGlmaWVycworICAgICAgICAgICAgICBhbmQgZmluYWxLZXkgbm90IGluIHNlbGYuZnVuY3Rpb25LZXlzICsgc2VsZi5tb3ZlS2V5cyk6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPXRpdGxlLCBwYXJlbnQ9c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0nTm8gbW9kaWZpZXIga2V5KHMpIHNwZWNpZmllZC4nKQorICAgICAgICBlbGlmIChtb2RpZmllcnMgPT0gWydTaGlmdCddKSBcCisgICAgICAgICAgICAgICAgIGFuZCAoZmluYWxLZXkgbm90IGluCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mdW5jdGlvbktleXMgKyBzZWxmLm1vdmVLZXlzICsgKCdUYWInLCAnU3BhY2UnKSk6CisgICAgICAgICAgICBtc2cgPSAnVGhlIHNoaWZ0IG1vZGlmaWVyIGJ5IGl0c2VsZiBtYXkgbm90IGJlIHVzZWQgd2l0aCdcCisgICAgICAgICAgICAgICAgICAnIHRoaXMga2V5IHN5bWJvbC4nCisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd2Vycm9yKHRpdGxlPXRpdGxlLCBwYXJlbnQ9c2VsZiwgbWVzc2FnZT1tc2cpCisgICAgICAgIGVsaWYga2V5U2VxdWVuY2UgaW4gc2VsZi5jdXJyZW50S2V5U2VxdWVuY2VzOgorICAgICAgICAgICAgbXNnID0gJ1RoaXMga2V5IGNvbWJpbmF0aW9uIGlzIGFscmVhZHkgaW4gdXNlLicKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IodGl0bGU9dGl0bGUsIHBhcmVudD1zZWxmLCBtZXNzYWdlPW1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGtleXNPSyA9IFRydWUKKyAgICAgICAgcmV0dXJuIGtleXNPSworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICN0ZXN0IHRoZSBkaWFsb2cKKyAgICByb290PVRrKCkKKyAgICBkZWYgcnVuKCk6CisgICAgICAgIGtleVNlcT0nJworICAgICAgICBkbGc9R2V0S2V5c0RpYWxvZyhyb290LCdHZXQgS2V5cycsJ2ZpbmQtYWdhaW4nLFtdKQorICAgICAgICBwcmludCBkbGcucmVzdWx0CisgICAgQnV0dG9uKHJvb3QsdGV4dD0nRGlhbG9nJyxjb21tYW5kPXJ1bikucGFjaygpCisgICAgcm9vdC5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2YTAxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2YTAxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjY1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weQpAQCAtMCwwICsxLDE3NSBAQAorIiIiCitBIG51bWJlciBvZiBmdW5jdGlvbiB0aGF0IGVuaGFuY2UgSURMRSBvbiBNYWNPU1ggd2hlbiBpdCB1c2VkIGFzIGEgbm9ybWFsCitHVUkgYXBwbGljYXRpb24gKGFzIG9wcG9zZWQgdG8gYW4gWDExIGFwcGxpY2F0aW9uKS4KKyIiIgoraW1wb3J0IHN5cworaW1wb3J0IFRraW50ZXIKK2Zyb20gb3MgaW1wb3J0IHBhdGgKKworCitfYXBwYnVuZGxlID0gTm9uZQorCitkZWYgcnVubmluZ0FzT1NYQXBwKCk6CisgICAgIiIiCisgICAgUmV0dXJucyBUcnVlIGlmIFB5dGhvbiBpcyBydW5uaW5nIGZyb20gd2l0aGluIGFuIGFwcCBvbiBPU1guCisgICAgSWYgc28sIGFzc3VtZSB0aGF0IFB5dGhvbiB3YXMgYnVpbHQgd2l0aCBBcXVhIFRjbC9UayByYXRoZXIgdGhhbgorICAgIFgxMSBUY2wvVGsuCisgICAgIiIiCisgICAgZ2xvYmFsIF9hcHBidW5kbGUKKyAgICBpZiBfYXBwYnVuZGxlIGlzIE5vbmU6CisgICAgICAgIF9hcHBidW5kbGUgPSAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCAnLmFwcCcgaW4gc3lzLmV4ZWN1dGFibGUpCisgICAgcmV0dXJuIF9hcHBidW5kbGUKKworX2NhcmJvbmFxdWF0ayA9IE5vbmUKKworZGVmIGlzQ2FyYm9uQXF1YVRrKHJvb3QpOgorICAgICIiIgorICAgIFJldHVybnMgVHJ1ZSBpZiBJRExFIGlzIHVzaW5nIGEgQ2FyYm9uIEFxdWEgVGsgKGluc3RlYWQgb2YgdGhlCisgICAgbmV3ZXIgQ29jb2EgQXF1YSBUaykuCisgICAgIiIiCisgICAgZ2xvYmFsIF9jYXJib25hcXVhdGsKKyAgICBpZiBfY2FyYm9uYXF1YXRrIGlzIE5vbmU6CisgICAgICAgIF9jYXJib25hcXVhdGsgPSAocnVubmluZ0FzT1NYQXBwKCkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FxdWEnIGluIHJvb3QudGsuY2FsbCgndGsnLCAnd2luZG93aW5nc3lzdGVtJykgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0FwcEtpdCcgbm90IGluIHJvb3QudGsuY2FsbCgnd2luZm8nLCAnc2VydmVyJywgJy4nKSkKKyAgICByZXR1cm4gX2NhcmJvbmFxdWF0aworCitkZWYgdGtWZXJzaW9uV2FybmluZyhyb290KToKKyAgICAiIiIKKyAgICBSZXR1cm5zIGEgc3RyaW5nIHdhcm5pbmcgbWVzc2FnZSBpZiB0aGUgVGsgdmVyc2lvbiBpbiB1c2UgYXBwZWFycyB0bworICAgIGJlIG9uZSBrbm93biB0byBjYXVzZSBwcm9ibGVtcyB3aXRoIElETEUuCisgICAgMS4gQXBwbGUgQ29jb2EtYmFzZWQgVGsgOC41Ljcgc2hpcHBlZCB3aXRoIE1hYyBPUyBYIDEwLjYgaXMgdW51c2FibGUuCisgICAgMi4gQXBwbGUgQ29jb2EtYmFzZWQgVGsgOC41LjkgaW4gT1MgWCAxMC43IGFuZCAxMC44IGlzIGJldHRlciBidXQKKyAgICAgICAgY2FuIHN0aWxsIGNyYXNoIHVuZXhwZWN0ZWRseS4KKyAgICAiIiIKKworICAgIGlmIChydW5uaW5nQXNPU1hBcHAoKSBhbmQKKyAgICAgICAgICAgICgnQXBwS2l0JyBpbiByb290LnRrLmNhbGwoJ3dpbmZvJywgJ3NlcnZlcicsICcuJykpICk6CisgICAgICAgIHBhdGNobGV2ZWwgPSByb290LnRrLmNhbGwoJ2luZm8nLCAncGF0Y2hsZXZlbCcpCisgICAgICAgIGlmIHBhdGNobGV2ZWwgbm90IGluICgnOC41LjcnLCAnOC41LjknKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gKHIiV0FSTklORzogVGhlIHZlcnNpb24gb2YgVGNsL1RrICh7MH0pIGluIHVzZSBtYXkiCisgICAgICAgICAgICAgICAgciIgYmUgdW5zdGFibGUuXG4iCisgICAgICAgICAgICAgICAgciJWaXNpdCBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvbWFjL3RjbHRrLyIKKyAgICAgICAgICAgICAgICByIiBmb3IgY3VycmVudCBpbmZvcm1hdGlvbi4iLmZvcm1hdChwYXRjaGxldmVsKSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIGFkZE9wZW5FdmVudFN1cHBvcnQocm9vdCwgZmxpc3QpOgorICAgICIiIgorICAgIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aWxsIHJlc3BvbmQgdG8gb3BlbiBBcHBsZUV2ZW50cywgd2hpY2gKKyAgICBtYWtlcyBpcyBmZWFzaWJsZSB0byB1c2UgSURMRSBhcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBmb3IgcHl0aG9uIGZpbGVzLgorICAgICIiIgorICAgIGRlZiBkb09wZW5GaWxlKCphcmdzKToKKyAgICAgICAgZm9yIGZuIGluIGFyZ3M6CisgICAgICAgICAgICBmbGlzdC5vcGVuKGZuKQorCisgICAgIyBUaGUgY29tbWFuZCBiZWxvdyBpcyBhIGhvb2sgaW4gYXF1YXRrIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBhcHAKKyAgICAjIHJlY2VpdmVzIGEgZmlsZSBvcGVuIGV2ZW50LiBUaGUgY2FsbGJhY2sgY2FuIGhhdmUgbXVsdGlwbGUgYXJndW1lbnRzLAorICAgICMgb25lIGZvciBldmVyeSBmaWxlIHRoYXQgc2hvdWxkIGJlIG9wZW5lZC4KKyAgICByb290LmNyZWF0ZWNvbW1hbmQoIjo6dGs6Om1hYzo6T3BlbkRvY3VtZW50IiwgZG9PcGVuRmlsZSkKKworZGVmIGhpZGVUa0NvbnNvbGUocm9vdCk6CisgICAgdHJ5OgorICAgICAgICByb290LnRrLmNhbGwoJ2NvbnNvbGUnLCAnaGlkZScpCisgICAgZXhjZXB0IFRraW50ZXIuVGNsRXJyb3I6CisgICAgICAgICMgU29tZSB2ZXJzaW9ucyBvZiB0aGUgVGsgZnJhbWV3b3JrIGRvbid0IGhhdmUgYSBjb25zb2xlIG9iamVjdAorICAgICAgICBwYXNzCisKK2RlZiBvdmVycmlkZVJvb3RNZW51KHJvb3QsIGZsaXN0KToKKyAgICAiIiIKKyAgICBSZXBsYWNlIHRoZSBUayByb290IG1lbnUgYnkgc29tZXRoaW5nIHRoYXQncyBtb3JlIGFwcHJvcHJpYXRlIGZvcgorICAgIElETEUuCisgICAgIiIiCisgICAgIyBUaGUgbWVudSB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSBUayByb290ICgiLiIpIGlzIGFsc28gdXNlZCBieSBBcXVhVGsgZm9yCisgICAgIyBhbGwgd2luZG93cyB0aGF0IGRvbid0IHNwZWNpZnkgYSBtZW51IG9mIHRoZWlyIG93bi4gVGhlIGRlZmF1bHQgbWVudWJhcgorICAgICMgY29udGFpbnMgYSBudW1iZXIgb2YgbWVudXMsIG5vbmUgb2Ygd2hpY2ggYXJlIGFwcHJvcHJpYXRlIGZvciBJRExFLiBUaGUKKyAgICAjIE1vc3QgYW5ub3lpbmcgb2YgdGhvc2UgaXMgYW4gJ0Fib3V0IFRjay9Uay4uLicgbWVudSBpbiB0aGUgYXBwbGljYXRpb24KKyAgICAjIG1lbnUuCisgICAgIworICAgICMgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyB0aGUgZGVmYXVsdCBtZW51YmFyIGJ5IGEgbW9zdGx5IGVtcHR5IG9uZSwgaXQKKyAgICAjIHNob3VsZCBvbmx5IGNvbnRhaW4gdGhlIGNvcnJlY3QgYXBwbGljYXRpb24gbWVudSBhbmQgdGhlIHdpbmRvdyBtZW51LgorICAgICMKKyAgICAjIER1ZSB0byBhIChtaXMtKWZlYXR1cmUgb2YgVGtBcXVhIHRoZSB1c2VyIHdpbGwgYWxzbyBzZWUgYW4gZW1wdHkgSGVscAorICAgICMgbWVudS4KKyAgICBmcm9tIFRraW50ZXIgaW1wb3J0IE1lbnUsIFRleHQsIFRleHQKKyAgICBmcm9tIGlkbGVsaWIuRWRpdG9yV2luZG93IGltcG9ydCBwcmVwc3RyLCBnZXRfYWNjZWxlcmF0b3IKKyAgICBmcm9tIGlkbGVsaWIgaW1wb3J0IEJpbmRpbmdzCisgICAgZnJvbSBpZGxlbGliIGltcG9ydCBXaW5kb3dMaXN0CisgICAgZnJvbSBpZGxlbGliLk11bHRpQ2FsbCBpbXBvcnQgTXVsdGlDYWxsQ3JlYXRvcgorCisgICAgbWVudWJhciA9IE1lbnUocm9vdCkKKyAgICByb290LmNvbmZpZ3VyZShtZW51PW1lbnViYXIpCisgICAgbWVudWRpY3QgPSB7fQorCisgICAgbWVudWRpY3RbJ3dpbmRvd3MnXSA9IG1lbnUgPSBNZW51KG1lbnViYXIsIG5hbWU9J3dpbmRvd3MnKQorICAgIG1lbnViYXIuYWRkX2Nhc2NhZGUobGFiZWw9J1dpbmRvdycsIG1lbnU9bWVudSwgdW5kZXJsaW5lPTApCisKKyAgICBkZWYgcG9zdHdpbmRvd3NtZW51KG1lbnU9bWVudSk6CisgICAgICAgIGVuZCA9IG1lbnUuaW5kZXgoJ2VuZCcpCisgICAgICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgICAgICAgZW5kID0gLTEKKworICAgICAgICBpZiBlbmQgPiAwOgorICAgICAgICAgICAgbWVudS5kZWxldGUoMCwgZW5kKQorICAgICAgICBXaW5kb3dMaXN0LmFkZF93aW5kb3dzX3RvX21lbnUobWVudSkKKyAgICBXaW5kb3dMaXN0LnJlZ2lzdGVyX2NhbGxiYWNrKHBvc3R3aW5kb3dzbWVudSkKKworICAgIGRlZiBhYm91dF9kaWFsb2coZXZlbnQ9Tm9uZSk6CisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgYWJvdXREaWFsb2cKKyAgICAgICAgYWJvdXREaWFsb2cuQWJvdXREaWFsb2cocm9vdCwgJ0Fib3V0IElETEUnKQorCisgICAgZGVmIGNvbmZpZ19kaWFsb2coZXZlbnQ9Tm9uZSk6CisgICAgICAgIGZyb20gaWRsZWxpYiBpbXBvcnQgY29uZmlnRGlhbG9nCisgICAgICAgIHJvb3QuaW5zdGFuY2VfZGljdCA9IGZsaXN0LmludmVyc2VkaWN0CisgICAgICAgIGNvbmZpZ0RpYWxvZy5Db25maWdEaWFsb2cocm9vdCwgJ1NldHRpbmdzJykKKworICAgIGRlZiBoZWxwX2RpYWxvZyhldmVudD1Ob25lKToKKyAgICAgICAgZnJvbSBpZGxlbGliIGltcG9ydCB0ZXh0VmlldworICAgICAgICBmbiA9IHBhdGguam9pbihwYXRoLmFic3BhdGgocGF0aC5kaXJuYW1lKF9fZmlsZV9fKSksICdoZWxwLnR4dCcpCisgICAgICAgIHRleHRWaWV3LnZpZXdfZmlsZShyb290LCAnSGVscCcsIGZuKQorCisgICAgcm9vdC5iaW5kKCc8PGFib3V0LWlkbGU+PicsIGFib3V0X2RpYWxvZykKKyAgICByb290LmJpbmQoJzw8b3Blbi1jb25maWctZGlhbG9nPj4nLCBjb25maWdfZGlhbG9nKQorICAgIHJvb3QuY3JlYXRlY29tbWFuZCgnOjp0azo6bWFjOjpTaG93UHJlZmVyZW5jZXMnLCBjb25maWdfZGlhbG9nKQorICAgIGlmIGZsaXN0OgorICAgICAgICByb290LmJpbmQoJzw8Y2xvc2UtYWxsLXdpbmRvd3M+PicsIGZsaXN0LmNsb3NlX2FsbF9jYWxsYmFjaykKKworICAgICAgICAjIFRoZSBiaW5kaW5nIGFib3ZlIGRvZXNuJ3QgcmVsaWFibHkgd29yayBvbiBhbGwgdmVyc2lvbnMgb2YgVGsKKyAgICAgICAgIyBvbiBNYWNPU1guIEFkZGluZyBjb21tYW5kIGRlZmluaXRpb24gYmVsb3cgZG9lcyBzZWVtIHRvIGRvIHRoZQorICAgICAgICAjIHJpZ2h0IHRoaW5nIGZvciBub3cuCisgICAgICAgIHJvb3QuY3JlYXRlY29tbWFuZCgnZXhpdCcsIGZsaXN0LmNsb3NlX2FsbF9jYWxsYmFjaykKKworICAgIGlmIGlzQ2FyYm9uQXF1YVRrKHJvb3QpOgorICAgICAgICAjIGZvciBDYXJib24gQXF1YVRrLCByZXBsYWNlIHRoZSBkZWZhdWx0IFRrIGFwcGxlIG1lbnUKKyAgICAgICAgbWVudWRpY3RbJ2FwcGxpY2F0aW9uJ10gPSBtZW51ID0gTWVudShtZW51YmFyLCBuYW1lPSdhcHBsZScpCisgICAgICAgIG1lbnViYXIuYWRkX2Nhc2NhZGUobGFiZWw9J0lETEUnLCBtZW51PW1lbnUpCisgICAgICAgIEJpbmRpbmdzLm1lbnVkZWZzLmluc2VydCgwLAorICAgICAgICAgICAgKCdhcHBsaWNhdGlvbicsIFsKKyAgICAgICAgICAgICAgICAoJ0Fib3V0IElETEUnLCAnPDxhYm91dC1pZGxlPj4nKSwKKyAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICBdKSkKKyAgICAgICAgdGt2ZXJzaW9uID0gcm9vdC50ay5ldmFsKCdpbmZvIHBhdGNobGV2ZWwnKQorICAgICAgICBpZiB0dXBsZShtYXAoaW50LCB0a3ZlcnNpb24uc3BsaXQoJy4nKSkpIDwgKDgsIDQsIDE0KToKKyAgICAgICAgICAgICMgZm9yIGVhcmxpZXIgQXF1YVRrIHZlcnNpb25zLCBzdXBwbHkgYSBQcmVmZXJlbmNlcyBtZW51IGl0ZW0KKyAgICAgICAgICAgIEJpbmRpbmdzLm1lbnVkZWZzWzBdWzFdLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgKCdfUHJlZmVyZW5jZXMuLi4uJywgJzw8b3Blbi1jb25maWctZGlhbG9nPj4nKSwKKyAgICAgICAgICAgICAgICApCisgICAgZWxzZToKKyAgICAgICAgIyBhc3N1bWUgQ29jb2EgQXF1YVRrCisgICAgICAgICMgcmVwbGFjZSBkZWZhdWx0IEFib3V0IGRpYWxvZyB3aXRoIEFib3V0IElETEUgb25lCisgICAgICAgIHJvb3QuY3JlYXRlY29tbWFuZCgndGtBYm91dERpYWxvZycsIGFib3V0X2RpYWxvZykKKyAgICAgICAgIyByZXBsYWNlIGRlZmF1bHQgIkhlbHAiIGl0ZW0gaW4gSGVscCBtZW51CisgICAgICAgIHJvb3QuY3JlYXRlY29tbWFuZCgnOjp0azo6bWFjOjpTaG93SGVscCcsIGhlbHBfZGlhbG9nKQorICAgICAgICAjIHJlbW92ZSByZWR1bmRhbnQgIklETEUgSGVscCIgZnJvbSBtZW51CisgICAgICAgIGRlbCBCaW5kaW5ncy5tZW51ZGVmc1stMV1bMV1bMF0KKworZGVmIHNldHVwQXBwKHJvb3QsIGZsaXN0KToKKyAgICAiIiIKKyAgICBQZXJmb3JtIHNldHVwIGZvciB0aGUgT1NYIGFwcGxpY2F0aW9uIGJ1bmRsZS4KKyAgICAiIiIKKyAgICBpZiBub3QgcnVubmluZ0FzT1NYQXBwKCk6IHJldHVybgorCisgICAgaGlkZVRrQ29uc29sZShyb290KQorICAgIG92ZXJyaWRlUm9vdE1lbnUocm9vdCwgZmxpc3QpCisgICAgYWRkT3BlbkV2ZW50U3VwcG9ydChyb290LCBmbGlzdCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY2Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL21hY29zeFN1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGY2Nzg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL21hY29zeFN1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ycGMucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnBjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjExYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnBjLnB5CkBAIC0wLDAgKzEsNjAwIEBACisiIiJSUEMgSW1wbGVtZW50aW9uLCBvcmlnaW5hbGx5IHdyaXR0ZW4gZm9yIHRoZSBQeXRob24gSWRsZSBJREUKKworRm9yIHNlY3VyaXR5IHJlYXNvbnMsIEd2UiByZXF1ZXN0ZWQgdGhhdCBJZGxlJ3MgUHl0aG9uIGV4ZWN1dGlvbiBzZXJ2ZXIgcHJvY2VzcworY29ubmVjdCB0byB0aGUgSWRsZSBwcm9jZXNzLCB3aGljaCBsaXN0ZW5zIGZvciB0aGUgY29ubmVjdGlvbi4gIFNpbmNlIElkbGUgaGFzCitvbmx5IG9uZSBjbGllbnQgcGVyIHNlcnZlciwgdGhpcyB3YXMgbm90IGEgbGltaXRhdGlvbi4KKworICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgKy0tLS0tLS0tLS0tLS0rCisgICB8IFNvY2tldFNlcnZlci5CYXNlUmVxdWVzdEhhbmRsZXIgfCB8IFNvY2tldElPICAgIHwKKyAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICstLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgfCByZWdpc3RlcigpICB8CisgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8IHVucmVnaXN0ZXIoKXwKKyAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICstLS0tLS0tLS0tLS0tKworICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgXiAgXgorICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfCAgfAorICAgICAgICAgICAgICAgICAgIHwgKyAtLS0tLS0tLS0tLS0tLS0tLS0tKyAgfAorICAgICAgICAgICAgICAgICAgIHwgfCAgICAgICAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0rCisgICB8IFJQQ0hhbmRsZXIgICAgICAgICAgICAgIHwgICAgICAgIHwgUlBDQ2xpZW50ICAgICAgIHwKKyAgIHwgW2F0dHJpYnV0ZSBvZiBSUENTZXJ2ZXJdfCAgICAgICAgfCAgICAgICAgICAgICAgICAgfAorICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0rCisKK1RoZSBSUENTZXJ2ZXIgaGFuZGxlciBjbGFzcyBpcyBleHBlY3RlZCB0byBwcm92aWRlIHJlZ2lzdGVyL3VucmVnaXN0ZXIgbWV0aG9kcy4KK1JQQ0hhbmRsZXIgaW5oZXJpdHMgdGhlIG1peC1pbiBjbGFzcyBTb2NrZXRJTywgd2hpY2ggcHJvdmlkZXMgdGhlc2UgbWV0aG9kcy4KKworU2VlIHRoZSBJZGxlIHJ1bi5tYWluKCkgZG9jc3RyaW5nIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGhvdyB0aGlzIHdhcworYWNjb21wbGlzaGVkIGluIElkbGUuCisKKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBTb2NrZXRTZXJ2ZXIKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBjUGlja2xlIGFzIHBpY2tsZQoraW1wb3J0IHRocmVhZGluZworaW1wb3J0IFF1ZXVlCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgY29weV9yZWcKK2ltcG9ydCB0eXBlcworaW1wb3J0IG1hcnNoYWwKKworCitkZWYgdW5waWNrbGVfY29kZShtcyk6CisgICAgY28gPSBtYXJzaGFsLmxvYWRzKG1zKQorICAgIGFzc2VydCBpc2luc3RhbmNlKGNvLCB0eXBlcy5Db2RlVHlwZSkKKyAgICByZXR1cm4gY28KKworZGVmIHBpY2tsZV9jb2RlKGNvKToKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShjbywgdHlwZXMuQ29kZVR5cGUpCisgICAgbXMgPSBtYXJzaGFsLmR1bXBzKGNvKQorICAgIHJldHVybiB1bnBpY2tsZV9jb2RlLCAobXMsKQorCisjIFhYWCBLQksgMjRBdWcwMiBmdW5jdGlvbiBwaWNrbGluZyBjYXBhYmlsaXR5IG5vdCB1c2VkIGluIElkbGUKKyMgIGRlZiB1bnBpY2tsZV9mdW5jdGlvbihtcyk6CisjICAgICAgcmV0dXJuIG1zCisKKyMgIGRlZiBwaWNrbGVfZnVuY3Rpb24oZm4pOgorIyAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZuLCB0eXBlLkZ1bmN0aW9uVHlwZSkKKyMgICAgICByZXR1cm4gcmVwcihmbikKKworY29weV9yZWcucGlja2xlKHR5cGVzLkNvZGVUeXBlLCBwaWNrbGVfY29kZSwgdW5waWNrbGVfY29kZSkKKyMgY29weV9yZWcucGlja2xlKHR5cGVzLkZ1bmN0aW9uVHlwZSwgcGlja2xlX2Z1bmN0aW9uLCB1bnBpY2tsZV9mdW5jdGlvbikKKworQlVGU0laRSA9IDgqMTAyNAorTE9DQUxIT1NUID0gJzEyNy4wLjAuMScKKworY2xhc3MgUlBDU2VydmVyKFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHIsIGhhbmRsZXJjbGFzcz1Ob25lKToKKyAgICAgICAgaWYgaGFuZGxlcmNsYXNzIGlzIE5vbmU6CisgICAgICAgICAgICBoYW5kbGVyY2xhc3MgPSBSUENIYW5kbGVyCisgICAgICAgIFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIuX19pbml0X18oc2VsZiwgYWRkciwgaGFuZGxlcmNsYXNzKQorCisgICAgZGVmIHNlcnZlcl9iaW5kKHNlbGYpOgorICAgICAgICAiT3ZlcnJpZGUgVENQU2VydmVyIG1ldGhvZCwgbm8gYmluZCgpIHBoYXNlIGZvciBjb25uZWN0aW5nIGVudGl0eSIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHNlcnZlcl9hY3RpdmF0ZShzZWxmKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgVENQU2VydmVyIG1ldGhvZCwgY29ubmVjdCgpIGluc3RlYWQgb2YgbGlzdGVuKCkKKworICAgICAgICBEdWUgdG8gdGhlIHJldmVyc2VkIGNvbm5lY3Rpb24sIHNlbGYuc2VydmVyX2FkZHJlc3MgaXMgYWN0dWFsbHkgdGhlCisgICAgICAgIGFkZHJlc3Mgb2YgdGhlIElkbGUgQ2xpZW50IHRvIHdoaWNoIHdlIGFyZSBjb25uZWN0aW5nLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNvY2tldC5jb25uZWN0KHNlbGYuc2VydmVyX2FkZHJlc3MpCisKKyAgICBkZWYgZ2V0X3JlcXVlc3Qoc2VsZik6CisgICAgICAgICJPdmVycmlkZSBUQ1BTZXJ2ZXIgbWV0aG9kLCByZXR1cm4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0IgorICAgICAgICByZXR1cm4gc2VsZi5zb2NrZXQsIHNlbGYuc2VydmVyX2FkZHJlc3MKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAiIiJPdmVycmlkZSBUQ1BTZXJ2ZXIgbWV0aG9kCisKKyAgICAgICAgRXJyb3IgbWVzc2FnZSBnb2VzIHRvIF9fc3RkZXJyX18uICBObyBlcnJvciBtZXNzYWdlIGlmIGV4aXRpbmcKKyAgICAgICAgbm9ybWFsbHkgb3Igc29ja2V0IHJhaXNlZCBFT0YuICBPdGhlciBleGNlcHRpb25zIG5vdCBoYW5kbGVkIGluCisgICAgICAgIHNlcnZlciBjb2RlIHdpbGwgY2F1c2Ugb3MuX2V4aXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXJmID0gc3lzLl9fc3RkZXJyX18KKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdcbicgKyAnLScqNDAKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdVbmhhbmRsZWQgc2VydmVyIGV4Y2VwdGlvbiEnCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnVGhyZWFkOiAlcycgJSB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKQorICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ0NsaWVudCBBZGRyZXNzOiAnLCBjbGllbnRfYWRkcmVzcworICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ1JlcXVlc3Q6ICcsIHJlcHIocmVxdWVzdCkKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoZmlsZT1lcmYpCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnXG4qKiogVW5yZWNvdmVyYWJsZSwgc2VydmVyIGV4aXRpbmchJworICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJy0nKjQwCisgICAgICAgICAgICBvcy5fZXhpdCgwKQorCisjLS0tLS0tLS0tLS0tLS0tLS0gZW5kIGNsYXNzIFJQQ1NlcnZlciAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvYmplY3R0YWJsZSA9IHt9CityZXF1ZXN0X3F1ZXVlID0gUXVldWUuUXVldWUoMCkKK3Jlc3BvbnNlX3F1ZXVlID0gUXVldWUuUXVldWUoMCkKKworCitjbGFzcyBTb2NrZXRJTyhvYmplY3QpOgorCisgICAgbmV4dHNlcSA9IDAKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrLCBvYmp0YWJsZT1Ob25lLCBkZWJ1Z2dpbmc9Tm9uZSk6CisgICAgICAgIHNlbGYuc29ja3RocmVhZCA9IHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCkKKyAgICAgICAgaWYgZGVidWdnaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWJ1Z2dpbmcgPSBkZWJ1Z2dpbmcKKyAgICAgICAgc2VsZi5zb2NrID0gc29jaworICAgICAgICBpZiBvYmp0YWJsZSBpcyBOb25lOgorICAgICAgICAgICAgb2JqdGFibGUgPSBvYmplY3R0YWJsZQorICAgICAgICBzZWxmLm9ianRhYmxlID0gb2JqdGFibGUKKyAgICAgICAgc2VsZi5yZXNwb25zZXMgPSB7fQorICAgICAgICBzZWxmLmN2YXJzID0ge30KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc29jayA9IHNlbGYuc29jaworICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgIGlmIHNvY2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzb2NrLmNsb3NlKCkKKworICAgIGRlZiBleGl0aG9vayhzZWxmKToKKyAgICAgICAgIm92ZXJyaWRlIGZvciBzcGVjaWZpYyBleGl0IGFjdGlvbiIKKyAgICAgICAgb3MuX2V4aXQoMCkKKworICAgIGRlZiBkZWJ1ZyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmRlYnVnZ2luZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzID0gc2VsZi5sb2NhdGlvbiArICIgIiArIHN0cih0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSkKKyAgICAgICAgZm9yIGEgaW4gYXJnczoKKyAgICAgICAgICAgIHMgPSBzICsgIiAiICsgc3RyKGEpCisgICAgICAgIHByaW50Pj5zeXMuX19zdGRlcnJfXywgcworCisgICAgZGVmIHJlZ2lzdGVyKHNlbGYsIG9pZCwgb2JqZWN0KToKKyAgICAgICAgc2VsZi5vYmp0YWJsZVtvaWRdID0gb2JqZWN0CisKKyAgICBkZWYgdW5yZWdpc3RlcihzZWxmLCBvaWQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5vYmp0YWJsZVtvaWRdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBsb2NhbGNhbGwoc2VsZiwgc2VxLCByZXF1ZXN0KToKKyAgICAgICAgc2VsZi5kZWJ1ZygibG9jYWxjYWxsOiIsIHJlcXVlc3QpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhvdywgKG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKSA9IHJlcXVlc3QKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAoIkVSUk9SIiwgIkJhZCByZXF1ZXN0IGZvcm1hdCIpCisgICAgICAgIGlmIG9pZCBub3QgaW4gc2VsZi5vYmp0YWJsZToKKyAgICAgICAgICAgIHJldHVybiAoIkVSUk9SIiwgIlVua25vd24gb2JqZWN0IGlkOiAlciIgJSAob2lkLCkpCisgICAgICAgIG9iaiA9IHNlbGYub2JqdGFibGVbb2lkXQorICAgICAgICBpZiBtZXRob2RuYW1lID09ICJfX21ldGhvZHNfXyI6CisgICAgICAgICAgICBtZXRob2RzID0ge30KKyAgICAgICAgICAgIF9nZXRtZXRob2RzKG9iaiwgbWV0aG9kcykKKyAgICAgICAgICAgIHJldHVybiAoIk9LIiwgbWV0aG9kcykKKyAgICAgICAgaWYgbWV0aG9kbmFtZSA9PSAiX19hdHRyaWJ1dGVzX18iOgorICAgICAgICAgICAgYXR0cmlidXRlcyA9IHt9CisgICAgICAgICAgICBfZ2V0YXR0cmlidXRlcyhvYmosIGF0dHJpYnV0ZXMpCisgICAgICAgICAgICByZXR1cm4gKCJPSyIsIGF0dHJpYnV0ZXMpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9iaiwgbWV0aG9kbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gKCJFUlJPUiIsICJVbnN1cHBvcnRlZCBtZXRob2QgbmFtZTogJXIiICUgKG1ldGhvZG5hbWUsKSkKKyAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihvYmosIG1ldGhvZG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGhvdyA9PSAnQ0FMTCc6CisgICAgICAgICAgICAgICAgcmV0ID0gbWV0aG9kKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJldCwgUmVtb3RlT2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVtb3RlcmVmKHJldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJPSyIsIHJldCkKKyAgICAgICAgICAgIGVsaWYgaG93ID09ICdRVUVVRSc6CisgICAgICAgICAgICAgICAgcmVxdWVzdF9xdWV1ZS5wdXQoKHNlcSwgKG1ldGhvZCwgYXJncywga3dhcmdzKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuKCJRVUVVRUQiLCBOb25lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCJFUlJPUiIsICJVbnN1cHBvcnRlZCBtZXNzYWdlIHR5cGU6ICVzIiAlIGhvdykKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgbXNnID0gIioqKiBJbnRlcm5hbCBFcnJvcjogcnBjLnB5OlNvY2tldElPLmxvY2FsY2FsbCgpXG5cbiJcCisgICAgICAgICAgICAgICAgICAiIE9iamVjdDogJXMgXG4gTWV0aG9kOiAlcyBcbiBBcmdzOiAlc1xuIgorICAgICAgICAgICAgcHJpbnQ+PnN5cy5fX3N0ZGVycl9fLCBtc2cgJSAob2lkLCBtZXRob2QsIGFyZ3MpCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9c3lzLl9fc3RkZXJyX18pCisgICAgICAgICAgICByZXR1cm4gKCJFWENFUFRJT04iLCBOb25lKQorCisgICAgZGVmIHJlbW90ZWNhbGwoc2VsZiwgb2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICBzZWxmLmRlYnVnKCJyZW1vdGVjYWxsOmFzeW5jY2FsbDogIiwgb2lkLCBtZXRob2RuYW1lKQorICAgICAgICBzZXEgPSBzZWxmLmFzeW5jY2FsbChvaWQsIG1ldGhvZG5hbWUsIGFyZ3MsIGt3YXJncykKKyAgICAgICAgcmV0dXJuIHNlbGYuYXN5bmNyZXR1cm4oc2VxKQorCisgICAgZGVmIHJlbW90ZXF1ZXVlKHNlbGYsIG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKToKKyAgICAgICAgc2VsZi5kZWJ1ZygicmVtb3RlcXVldWU6YXN5bmNxdWV1ZTogIiwgb2lkLCBtZXRob2RuYW1lKQorICAgICAgICBzZXEgPSBzZWxmLmFzeW5jcXVldWUob2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpCisgICAgICAgIHJldHVybiBzZWxmLmFzeW5jcmV0dXJuKHNlcSkKKworICAgIGRlZiBhc3luY2NhbGwoc2VsZiwgb2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICByZXF1ZXN0ID0gKCJDQUxMIiwgKG9pZCwgbWV0aG9kbmFtZSwgYXJncywga3dhcmdzKSkKKyAgICAgICAgc2VxID0gc2VsZi5uZXdzZXEoKQorICAgICAgICBpZiB0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpICE9IHNlbGYuc29ja3RocmVhZDoKKyAgICAgICAgICAgIGN2YXIgPSB0aHJlYWRpbmcuQ29uZGl0aW9uKCkKKyAgICAgICAgICAgIHNlbGYuY3ZhcnNbc2VxXSA9IGN2YXIKKyAgICAgICAgc2VsZi5kZWJ1ZygoImFzeW5jY2FsbDolZDoiICUgc2VxKSwgb2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpCisgICAgICAgIHNlbGYucHV0bWVzc2FnZSgoc2VxLCByZXF1ZXN0KSkKKyAgICAgICAgcmV0dXJuIHNlcQorCisgICAgZGVmIGFzeW5jcXVldWUoc2VsZiwgb2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICByZXF1ZXN0ID0gKCJRVUVVRSIsIChvaWQsIG1ldGhvZG5hbWUsIGFyZ3MsIGt3YXJncykpCisgICAgICAgIHNlcSA9IHNlbGYubmV3c2VxKCkKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKSAhPSBzZWxmLnNvY2t0aHJlYWQ6CisgICAgICAgICAgICBjdmFyID0gdGhyZWFkaW5nLkNvbmRpdGlvbigpCisgICAgICAgICAgICBzZWxmLmN2YXJzW3NlcV0gPSBjdmFyCisgICAgICAgIHNlbGYuZGVidWcoKCJhc3luY3F1ZXVlOiVkOiIgJSBzZXEpLCBvaWQsIG1ldGhvZG5hbWUsIGFyZ3MsIGt3YXJncykKKyAgICAgICAgc2VsZi5wdXRtZXNzYWdlKChzZXEsIHJlcXVlc3QpKQorICAgICAgICByZXR1cm4gc2VxCisKKyAgICBkZWYgYXN5bmNyZXR1cm4oc2VsZiwgc2VxKToKKyAgICAgICAgc2VsZi5kZWJ1ZygiYXN5bmNyZXR1cm46JWQ6Y2FsbCBnZXRyZXNwb25zZSgpOiAiICUgc2VxKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuZ2V0cmVzcG9uc2Uoc2VxLCB3YWl0PTAuMDUpCisgICAgICAgIHNlbGYuZGVidWcoKCJhc3luY3JldHVybjolZDpyZXNwb25zZTogIiAlIHNlcSksIHJlc3BvbnNlKQorICAgICAgICByZXR1cm4gc2VsZi5kZWNvZGVyZXNwb25zZShyZXNwb25zZSkKKworICAgIGRlZiBkZWNvZGVyZXNwb25zZShzZWxmLCByZXNwb25zZSk6CisgICAgICAgIGhvdywgd2hhdCA9IHJlc3BvbnNlCisgICAgICAgIGlmIGhvdyA9PSAiT0siOgorICAgICAgICAgICAgcmV0dXJuIHdoYXQKKyAgICAgICAgaWYgaG93ID09ICJRVUVVRUQiOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgaG93ID09ICJFWENFUFRJT04iOgorICAgICAgICAgICAgc2VsZi5kZWJ1ZygiZGVjb2RlcmVzcG9uc2U6IEVYQ0VQVElPTiIpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBob3cgPT0gIkVPRiI6CisgICAgICAgICAgICBzZWxmLmRlYnVnKCJkZWNvZGVyZXNwb25zZTogRU9GIikKKyAgICAgICAgICAgIHNlbGYuZGVjb2RlX2ludGVycnVwdGhvb2soKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgaG93ID09ICJFUlJPUiI6CisgICAgICAgICAgICBzZWxmLmRlYnVnKCJkZWNvZGVyZXNwb25zZTogSW50ZXJuYWwgRVJST1I6Iiwgd2hhdCkKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgd2hhdAorICAgICAgICByYWlzZSBTeXN0ZW1FcnJvciwgKGhvdywgd2hhdCkKKworICAgIGRlZiBkZWNvZGVfaW50ZXJydXB0aG9vayhzZWxmKToKKyAgICAgICAgIiIKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKworICAgIGRlZiBtYWlubG9vcChzZWxmKToKKyAgICAgICAgIiIiTGlzdGVuIG9uIHNvY2tldCB1bnRpbCBJL08gbm90IHJlYWR5IG9yIEVPRgorCisgICAgICAgIHBvbGxyZXNwb25zZSgpIHdpbGwgbG9vcCBsb29raW5nIGZvciBzZXEgbnVtYmVyIE5vbmUsIHdoaWNoCisgICAgICAgIG5ldmVyIGNvbWVzLCBhbmQgZXhpdCBvbiBFT0ZFcnJvci4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5nZXRyZXNwb25zZShteXNlcT1Ob25lLCB3YWl0PTAuMDUpCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZGVidWcoIm1haW5sb29wOnJldHVybiIpCisgICAgICAgICAgICByZXR1cm4KKworICAgIGRlZiBnZXRyZXNwb25zZShzZWxmLCBteXNlcSwgd2FpdCk6CisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5fZ2V0cmVzcG9uc2UobXlzZXEsIHdhaXQpCisgICAgICAgIGlmIHJlc3BvbnNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaG93LCB3aGF0ID0gcmVzcG9uc2UKKyAgICAgICAgICAgIGlmIGhvdyA9PSAiT0siOgorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gaG93LCBzZWxmLl9wcm94aWZ5KHdoYXQpCisgICAgICAgIHJldHVybiByZXNwb25zZQorCisgICAgZGVmIF9wcm94aWZ5KHNlbGYsIG9iaik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBSZW1vdGVQcm94eSk6CisgICAgICAgICAgICByZXR1cm4gUlBDUHJveHkoc2VsZiwgb2JqLm9pZCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIHR5cGVzLkxpc3RUeXBlKToKKyAgICAgICAgICAgIHJldHVybiBtYXAoc2VsZi5fcHJveGlmeSwgb2JqKQorICAgICAgICAjIFhYWCBDaGVjayBmb3Igb3RoZXIgdHlwZXMgLS0gbm90IGN1cnJlbnRseSBuZWVkZWQKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIF9nZXRyZXNwb25zZShzZWxmLCBteXNlcSwgd2FpdCk6CisgICAgICAgIHNlbGYuZGVidWcoIl9nZXRyZXNwb25zZTpteXNlcToiLCBteXNlcSkKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKSBpcyBzZWxmLnNvY2t0aHJlYWQ6CisgICAgICAgICAgICAjIHRoaXMgdGhyZWFkIGRvZXMgYWxsIHJlYWRpbmcgb2YgcmVxdWVzdHMgb3IgcmVzcG9uc2VzCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5wb2xscmVzcG9uc2UobXlzZXEsIHdhaXQpCisgICAgICAgICAgICAgICAgaWYgcmVzcG9uc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyB3YWl0IGZvciBub3RpZmljYXRpb24gZnJvbSBzb2NrZXQgaGFuZGxpbmcgdGhyZWFkCisgICAgICAgICAgICBjdmFyID0gc2VsZi5jdmFyc1tteXNlcV0KKyAgICAgICAgICAgIGN2YXIuYWNxdWlyZSgpCisgICAgICAgICAgICB3aGlsZSBteXNlcSBub3QgaW4gc2VsZi5yZXNwb25zZXM6CisgICAgICAgICAgICAgICAgY3Zhci53YWl0KCkKKyAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXNwb25zZXNbbXlzZXFdCisgICAgICAgICAgICBzZWxmLmRlYnVnKCJfZ2V0cmVzcG9uc2U6JXM6IHRocmVhZCB3b2tlIHVwOiByZXNwb25zZTogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgKG15c2VxLCByZXNwb25zZSkpCisgICAgICAgICAgICBkZWwgc2VsZi5yZXNwb25zZXNbbXlzZXFdCisgICAgICAgICAgICBkZWwgc2VsZi5jdmFyc1tteXNlcV0KKyAgICAgICAgICAgIGN2YXIucmVsZWFzZSgpCisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGRlZiBuZXdzZXEoc2VsZik6CisgICAgICAgIHNlbGYubmV4dHNlcSA9IHNlcSA9IHNlbGYubmV4dHNlcSArIDIKKyAgICAgICAgcmV0dXJuIHNlcQorCisgICAgZGVmIHB1dG1lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIHNlbGYuZGVidWcoInB1dG1lc3NhZ2U6JWQ6IiAlIG1lc3NhZ2VbMF0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMobWVzc2FnZSkKKyAgICAgICAgZXhjZXB0IHBpY2tsZS5QaWNrbGluZ0Vycm9yOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgIkNhbm5vdCBwaWNrbGU6IiwgcmVwcihtZXNzYWdlKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcyA9IHN0cnVjdC5wYWNrKCI8aSIsIGxlbihzKSkgKyBzCisgICAgICAgIHdoaWxlIGxlbihzKSA+IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoW10sIFtzZWxmLnNvY2tdLCBbXSkKKyAgICAgICAgICAgICAgICBuID0gc2VsZi5zb2NrLnNlbmQoc1s6QlVGU0laRV0pCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICJzb2NrZXQgbm8gbG9uZ2VyIGV4aXN0cyIKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcyA9IHNbbjpdCisKKyAgICBidWZmZXIgPSAiIgorICAgIGJ1Zm5lZWQgPSA0CisgICAgYnVmc3RhdGUgPSAwICMgbWVhbmluZzogMCA9PiByZWFkaW5nIGNvdW50OyAxID0+IHJlYWRpbmcgZGF0YQorCisgICAgZGVmIHBvbGxwYWNrZXQoc2VsZiwgd2FpdCk6CisgICAgICAgIHNlbGYuX3N0YWdlMCgpCisgICAgICAgIGlmIGxlbihzZWxmLmJ1ZmZlcikgPCBzZWxmLmJ1Zm5lZWQ6CisgICAgICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdChbc2VsZi5zb2NrLmZpbGVubygpXSwgW10sIFtdLCB3YWl0KQorICAgICAgICAgICAgaWYgbGVuKHIpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi5zb2NrLnJlY3YoQlVGU0laRSkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgICAgIGlmIGxlbihzKSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciArPSBzCisgICAgICAgICAgICBzZWxmLl9zdGFnZTAoKQorICAgICAgICByZXR1cm4gc2VsZi5fc3RhZ2UxKCkKKworICAgIGRlZiBfc3RhZ2UwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJ1ZnN0YXRlID09IDAgYW5kIGxlbihzZWxmLmJ1ZmZlcikgPj0gNDoKKyAgICAgICAgICAgIHMgPSBzZWxmLmJ1ZmZlcls6NF0KKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbNDpdCisgICAgICAgICAgICBzZWxmLmJ1Zm5lZWQgPSBzdHJ1Y3QudW5wYWNrKCI8aSIsIHMpWzBdCisgICAgICAgICAgICBzZWxmLmJ1ZnN0YXRlID0gMQorCisgICAgZGVmIF9zdGFnZTEoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVmc3RhdGUgPT0gMSBhbmQgbGVuKHNlbGYuYnVmZmVyKSA+PSBzZWxmLmJ1Zm5lZWQ6CisgICAgICAgICAgICBwYWNrZXQgPSBzZWxmLmJ1ZmZlcls6c2VsZi5idWZuZWVkXQorICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltzZWxmLmJ1Zm5lZWQ6XQorICAgICAgICAgICAgc2VsZi5idWZuZWVkID0gNAorICAgICAgICAgICAgc2VsZi5idWZzdGF0ZSA9IDAKKyAgICAgICAgICAgIHJldHVybiBwYWNrZXQKKworICAgIGRlZiBwb2xsbWVzc2FnZShzZWxmLCB3YWl0KToKKyAgICAgICAgcGFja2V0ID0gc2VsZi5wb2xscGFja2V0KHdhaXQpCisgICAgICAgIGlmIHBhY2tldCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWVzc2FnZSA9IHBpY2tsZS5sb2FkcyhwYWNrZXQpCisgICAgICAgIGV4Y2VwdCBwaWNrbGUuVW5waWNrbGluZ0Vycm9yOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgImNhbm5vdCB1bnBpY2tsZSBwYWNrZXQ6IiwgcmVwcihwYWNrZXQpCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfc3RhY2soZmlsZT1zeXMuX19zdGRlcnJfXykKKyAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3RkZXJyX18sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBtZXNzYWdlCisKKyAgICBkZWYgcG9sbHJlc3BvbnNlKHNlbGYsIG15c2VxLCB3YWl0KToKKyAgICAgICAgIiIiSGFuZGxlIG1lc3NhZ2VzIHJlY2VpdmVkIG9uIHRoZSBzb2NrZXQuCisKKyAgICAgICAgU29tZSBtZXNzYWdlcyByZWNlaXZlZCBtYXkgYmUgYXN5bmNocm9ub3VzICdjYWxsJyBvciAncXVldWUnIHJlcXVlc3RzLAorICAgICAgICBhbmQgc29tZSBtYXkgYmUgcmVzcG9uc2VzIGZvciBvdGhlciB0aHJlYWRzLgorCisgICAgICAgICdjYWxsJyByZXF1ZXN0cyBhcmUgcGFzc2VkIHRvIHNlbGYubG9jYWxjYWxsKCkgd2l0aCB0aGUgZXhwZWN0YXRpb24gb2YKKyAgICAgICAgaW1tZWRpYXRlIGV4ZWN1dGlvbiwgZHVyaW5nIHdoaWNoIHRpbWUgdGhlIHNvY2tldCBpcyBub3Qgc2VydmljZWQuCisKKyAgICAgICAgJ3F1ZXVlJyByZXF1ZXN0cyBhcmUgdXNlZCBmb3IgdGFza3MgKHdoaWNoIG1heSBibG9jayBvciBoYW5nKSB0byBiZQorICAgICAgICBwcm9jZXNzZWQgaW4gYSBkaWZmZXJlbnQgdGhyZWFkLiAgVGhlc2UgcmVxdWVzdHMgYXJlIGZlZCBpbnRvCisgICAgICAgIHJlcXVlc3RfcXVldWUgYnkgc2VsZi5sb2NhbGNhbGwoKS4gIFJlc3BvbnNlcyB0byBxdWV1ZWQgcmVxdWVzdHMgYXJlCisgICAgICAgIHRha2VuIGZyb20gcmVzcG9uc2VfcXVldWUgYW5kIHNlbnQgYWNyb3NzIHRoZSBsaW5rIHdpdGggdGhlIGFzc29jaWF0ZWQKKyAgICAgICAgc2VxdWVuY2UgbnVtYmVycy4gIE1lc3NhZ2VzIGluIHRoZSBxdWV1ZXMgYXJlIChzZXF1ZW5jZV9udW1iZXIsCisgICAgICAgIHJlcXVlc3QvcmVzcG9uc2UpIHR1cGxlcyBhbmQgY29kZSB1c2luZyB0aGlzIG1vZHVsZSByZW1vdmluZyBtZXNzYWdlcworICAgICAgICBmcm9tIHRoZSByZXF1ZXN0X3F1ZXVlIGlzIHJlc3BvbnNpYmxlIGZvciByZXR1cm5pbmcgdGhlIGNvcnJlY3QKKyAgICAgICAgc2VxdWVuY2UgbnVtYmVyIGluIHRoZSByZXNwb25zZV9xdWV1ZS4KKworICAgICAgICBwb2xscmVzcG9uc2UoKSB3aWxsIGxvb3AgdW50aWwgYSByZXNwb25zZSBtZXNzYWdlIHdpdGggdGhlIG15c2VxCisgICAgICAgIHNlcXVlbmNlIG51bWJlciBpcyByZWNlaXZlZCwgYW5kIHdpbGwgc2F2ZSBvdGhlciByZXNwb25zZXMgaW4KKyAgICAgICAgc2VsZi5yZXNwb25zZXMgYW5kIG5vdGlmeSB0aGUgb3duaW5nIHRocmVhZC4KKworICAgICAgICAiIiIKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICMgc2VuZCBxdWV1ZWQgcmVzcG9uc2UgaWYgdGhlcmUgaXMgb25lIGF2YWlsYWJsZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHFtc2cgPSByZXNwb25zZV9xdWV1ZS5nZXQoMCkKKyAgICAgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlcSwgcmVzcG9uc2UgPSBxbXNnCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IChzZXEsICgnT0snLCByZXNwb25zZSkpCisgICAgICAgICAgICAgICAgc2VsZi5wdXRtZXNzYWdlKG1lc3NhZ2UpCisgICAgICAgICAgICAjIHBvbGwgZm9yIG1lc3NhZ2Ugb24gbGluaworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBzZWxmLnBvbGxtZXNzYWdlKHdhaXQpCisgICAgICAgICAgICAgICAgaWYgbWVzc2FnZSBpcyBOb25lOiAgIyBzb2NrZXQgbm90IHJlYWR5CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfRU9GKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICBzZXEsIHJlc3EgPSBtZXNzYWdlCisgICAgICAgICAgICBob3cgPSByZXNxWzBdCisgICAgICAgICAgICBzZWxmLmRlYnVnKCJwb2xscmVzcG9uc2U6JWQ6bXlzZXE6JXMiICUgKHNlcSwgbXlzZXEpKQorICAgICAgICAgICAgIyBwcm9jZXNzIG9yIHF1ZXVlIGEgcmVxdWVzdAorICAgICAgICAgICAgaWYgaG93IGluICgiQ0FMTCIsICJRVUVVRSIpOgorICAgICAgICAgICAgICAgIHNlbGYuZGVidWcoInBvbGxyZXNwb25zZTolZDpsb2NhbGNhbGw6Y2FsbDoiICUgc2VxKQorICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5sb2NhbGNhbGwoc2VxLCByZXNxKQorICAgICAgICAgICAgICAgIHNlbGYuZGVidWcoInBvbGxyZXNwb25zZTolZDpsb2NhbGNhbGw6cmVzcG9uc2U6JXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZXEsIHJlc3BvbnNlKSkKKyAgICAgICAgICAgICAgICBpZiBob3cgPT0gIkNBTEwiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnB1dG1lc3NhZ2UoKHNlcSwgcmVzcG9uc2UpKQorICAgICAgICAgICAgICAgIGVsaWYgaG93ID09ICJRVUVVRSI6CisgICAgICAgICAgICAgICAgICAgICMgZG9uJ3QgYWNrbm93bGVkZ2UgdGhlICdxdWV1ZScgcmVxdWVzdCEKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAjIHJldHVybiBpZiBjb21wbGV0ZWQgbWVzc2FnZSB0cmFuc2FjdGlvbgorICAgICAgICAgICAgZWxpZiBzZXEgPT0gbXlzZXE6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3EKKyAgICAgICAgICAgICMgbXVzdCBiZSBhIHJlc3BvbnNlIGZvciBhIGRpZmZlcmVudCB0aHJlYWQ6CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGN2ID0gc2VsZi5jdmFycy5nZXQoc2VxLCBOb25lKQorICAgICAgICAgICAgICAgICMgcmVzcG9uc2UgaW52b2x2aW5nIHVua25vd24gc2VxdWVuY2UgbnVtYmVyIGlzIGRpc2NhcmRlZCwKKyAgICAgICAgICAgICAgICAjIHByb2JhYmx5IGludGVuZGVkIGZvciBwcmlvciBpbmNhcm5hdGlvbiBvZiBzZXJ2ZXIKKyAgICAgICAgICAgICAgICBpZiBjdiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY3YuYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzcG9uc2VzW3NlcV0gPSByZXNxCisgICAgICAgICAgICAgICAgICAgIGN2Lm5vdGlmeSgpCisgICAgICAgICAgICAgICAgICAgIGN2LnJlbGVhc2UoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICBkZWYgaGFuZGxlX0VPRihzZWxmKToKKyAgICAgICAgImFjdGlvbiB0YWtlbiB1cG9uIGxpbmsgYmVpbmcgY2xvc2VkIGJ5IHBlZXIiCisgICAgICAgIHNlbGYuRU9GaG9vaygpCisgICAgICAgIHNlbGYuZGVidWcoImhhbmRsZV9FT0YiKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuY3ZhcnM6CisgICAgICAgICAgICBjdiA9IHNlbGYuY3ZhcnNba2V5XQorICAgICAgICAgICAgY3YuYWNxdWlyZSgpCisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlc1trZXldID0gKCdFT0YnLCBOb25lKQorICAgICAgICAgICAgY3Yubm90aWZ5KCkKKyAgICAgICAgICAgIGN2LnJlbGVhc2UoKQorICAgICAgICAjIGNhbGwgb3VyIChwb3NzaWJseSBvdmVycmlkZGVuKSBleGl0IGZ1bmN0aW9uCisgICAgICAgIHNlbGYuZXhpdGhvb2soKQorCisgICAgZGVmIEVPRmhvb2soc2VsZik6CisgICAgICAgICJDbGFzc2VzIHVzaW5nIHJwYyBjbGllbnQvc2VydmVyIGNhbiBvdmVycmlkZSB0byBhdWdtZW50IEVPRiBhY3Rpb24iCisgICAgICAgIHBhc3MKKworIy0tLS0tLS0tLS0tLS0tLS0tIGVuZCBjbGFzcyBTb2NrZXRJTyAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBSZW1vdGVPYmplY3Qob2JqZWN0KToKKyAgICAjIFRva2VuIG1peC1pbiBjbGFzcworICAgIHBhc3MKKworZGVmIHJlbW90ZXJlZihvYmopOgorICAgIG9pZCA9IGlkKG9iaikKKyAgICBvYmplY3R0YWJsZVtvaWRdID0gb2JqCisgICAgcmV0dXJuIFJlbW90ZVByb3h5KG9pZCkKKworY2xhc3MgUmVtb3RlUHJveHkob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvaWQpOgorICAgICAgICBzZWxmLm9pZCA9IG9pZAorCitjbGFzcyBSUENIYW5kbGVyKFNvY2tldFNlcnZlci5CYXNlUmVxdWVzdEhhbmRsZXIsIFNvY2tldElPKToKKworICAgIGRlYnVnZ2luZyA9IEZhbHNlCisgICAgbG9jYXRpb24gPSAiI1MiICAjIFNlcnZlcgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2ssIGFkZHIsIHN2cik6CisgICAgICAgIHN2ci5jdXJyZW50X2hhbmRsZXIgPSBzZWxmICMjIGNndCB4eHgKKyAgICAgICAgU29ja2V0SU8uX19pbml0X18oc2VsZiwgc29jaykKKyAgICAgICAgU29ja2V0U2VydmVyLkJhc2VSZXF1ZXN0SGFuZGxlci5fX2luaXRfXyhzZWxmLCBzb2NrLCBhZGRyLCBzdnIpCisKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAiaGFuZGxlKCkgbWV0aG9kIHJlcXVpcmVkIGJ5IFNvY2tldFNlcnZlciIKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgZ2V0X3JlbW90ZV9wcm94eShzZWxmLCBvaWQpOgorICAgICAgICByZXR1cm4gUlBDUHJveHkoc2VsZiwgb2lkKQorCitjbGFzcyBSUENDbGllbnQoU29ja2V0SU8pOgorCisgICAgZGVidWdnaW5nID0gRmFsc2UKKyAgICBsb2NhdGlvbiA9ICIjQyIgICMgQ2xpZW50CisKKyAgICBuZXh0c2VxID0gMSAjIFJlcXVlc3RzIGNvbWluZyBmcm9tIHRoZSBjbGllbnQgYXJlIG9kZCBudW1iZXJlZAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIGZhbWlseT1zb2NrZXQuQUZfSU5FVCwgdHlwZT1zb2NrZXQuU09DS19TVFJFQU0pOgorICAgICAgICBzZWxmLmxpc3RlbmluZ19zb2NrID0gc29ja2V0LnNvY2tldChmYW1pbHksIHR5cGUpCisgICAgICAgIHNlbGYubGlzdGVuaW5nX3NvY2suYmluZChhZGRyZXNzKQorICAgICAgICBzZWxmLmxpc3RlbmluZ19zb2NrLmxpc3RlbigxKQorCisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgd29ya2luZ19zb2NrLCBhZGRyZXNzID0gc2VsZi5saXN0ZW5pbmdfc29jay5hY2NlcHQoKQorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZzoKKyAgICAgICAgICAgIHByaW50Pj5zeXMuX19zdGRlcnJfXywgIioqKioqKiBDb25uZWN0aW9uIHJlcXVlc3QgZnJvbSAiLCBhZGRyZXNzCisgICAgICAgIGlmIGFkZHJlc3NbMF0gPT0gTE9DQUxIT1NUOgorICAgICAgICAgICAgU29ja2V0SU8uX19pbml0X18oc2VsZiwgd29ya2luZ19zb2NrKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQ+PnN5cy5fX3N0ZGVycl9fLCAiKiogSW52YWxpZCBob3N0OiAiLCBhZGRyZXNzCisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IKKworICAgIGRlZiBnZXRfcmVtb3RlX3Byb3h5KHNlbGYsIG9pZCk6CisgICAgICAgIHJldHVybiBSUENQcm94eShzZWxmLCBvaWQpCisKK2NsYXNzIFJQQ1Byb3h5KG9iamVjdCk6CisKKyAgICBfX21ldGhvZHMgPSBOb25lCisgICAgX19hdHRyaWJ1dGVzID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tpbywgb2lkKToKKyAgICAgICAgc2VsZi5zb2NraW8gPSBzb2NraW8KKyAgICAgICAgc2VsZi5vaWQgPSBvaWQKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgc2VsZi5fX21ldGhvZHMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX19nZXRtZXRob2RzKCkKKyAgICAgICAgaWYgc2VsZi5fX21ldGhvZHMuZ2V0KG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIE1ldGhvZFByb3h5KHNlbGYuc29ja2lvLCBzZWxmLm9pZCwgbmFtZSkKKyAgICAgICAgaWYgc2VsZi5fX2F0dHJpYnV0ZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX19nZXRhdHRyaWJ1dGVzKCkKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLl9fYXR0cmlidXRlczoKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5zb2NraW8ucmVtb3RlY2FsbChzZWxmLm9pZCwgJ19fZ2V0YXR0cmlidXRlX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCksIHt9KQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorCisgICAgZGVmIF9fZ2V0YXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5fX2F0dHJpYnV0ZXMgPSBzZWxmLnNvY2tpby5yZW1vdGVjYWxsKHNlbGYub2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fYXR0cmlidXRlc19fIiwgKCksIHt9KQorCisgICAgZGVmIF9fZ2V0bWV0aG9kcyhzZWxmKToKKyAgICAgICAgc2VsZi5fX21ldGhvZHMgPSBzZWxmLnNvY2tpby5yZW1vdGVjYWxsKHNlbGYub2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fbWV0aG9kc19fIiwgKCksIHt9KQorCitkZWYgX2dldG1ldGhvZHMob2JqLCBtZXRob2RzKToKKyAgICAjIEhlbHBlciB0byBnZXQgYSBsaXN0IG9mIG1ldGhvZHMgZnJvbSBhbiBvYmplY3QKKyAgICAjIEFkZHMgbmFtZXMgdG8gZGljdGlvbmFyeSBhcmd1bWVudCAnbWV0aG9kcycKKyAgICBmb3IgbmFtZSBpbiBkaXIob2JqKToKKyAgICAgICAgYXR0ciA9IGdldGF0dHIob2JqLCBuYW1lKQorICAgICAgICBpZiBoYXNhdHRyKGF0dHIsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgbWV0aG9kc1tuYW1lXSA9IDEKKyAgICBpZiB0eXBlKG9iaikgPT0gdHlwZXMuSW5zdGFuY2VUeXBlOgorICAgICAgICBfZ2V0bWV0aG9kcyhvYmouX19jbGFzc19fLCBtZXRob2RzKQorICAgIGlmIHR5cGUob2JqKSA9PSB0eXBlcy5DbGFzc1R5cGU6CisgICAgICAgIGZvciBzdXBlciBpbiBvYmouX19iYXNlc19fOgorICAgICAgICAgICAgX2dldG1ldGhvZHMoc3VwZXIsIG1ldGhvZHMpCisKK2RlZiBfZ2V0YXR0cmlidXRlcyhvYmosIGF0dHJpYnV0ZXMpOgorICAgIGZvciBuYW1lIGluIGRpcihvYmopOgorICAgICAgICBhdHRyID0gZ2V0YXR0cihvYmosIG5hbWUpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGF0dHIsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgYXR0cmlidXRlc1tuYW1lXSA9IDEKKworY2xhc3MgTWV0aG9kUHJveHkob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NraW8sIG9pZCwgbmFtZSk6CisgICAgICAgIHNlbGYuc29ja2lvID0gc29ja2lvCisgICAgICAgIHNlbGYub2lkID0gb2lkCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICB2YWx1ZSA9IHNlbGYuc29ja2lvLnJlbW90ZWNhbGwoc2VsZi5vaWQsIHNlbGYubmFtZSwgYXJncywga3dhcmdzKQorICAgICAgICByZXR1cm4gdmFsdWUKKworCisjIFhYWCBLQksgMDlTZXAwMyAgV2UgbmVlZCBhIHByb3BlciB1bml0IHRlc3QgZm9yIHRoaXMgbW9kdWxlLiAgUHJldmlvdXNseQorIyAgICAgICAgICAgICAgICAgIGV4aXN0aW5nIHRlc3QgY29kZSB3YXMgcmVtb3ZlZCBhdCBSZXYgMS4yNyAocjM0MDk4KS4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ycGMucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3JwYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4YmU5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ycGMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ycGMucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3JwYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMTAxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ycGMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWRsZWxpYi9ydW4ucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzAwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5CkBAIC0wLDAgKzEsMzU0IEBACitpbXBvcnQgc3lzCitpbXBvcnQgaW8KK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgdGhyZWFkCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgUXVldWUKKworZnJvbSBpZGxlbGliIGltcG9ydCBDYWxsVGlwcworZnJvbSBpZGxlbGliIGltcG9ydCBBdXRvQ29tcGxldGUKKworZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVEZWJ1Z2dlcgorZnJvbSBpZGxlbGliIGltcG9ydCBSZW1vdGVPYmplY3RCcm93c2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IFN0YWNrVmlld2VyCitmcm9tIGlkbGVsaWIgaW1wb3J0IHJwYworZnJvbSBpZGxlbGliIGltcG9ydCBQeVNoZWxsCitmcm9tIGlkbGVsaWIgaW1wb3J0IElPQmluZGluZworCitpbXBvcnQgX19tYWluX18KKworTE9DQUxIT1NUID0gJzEyNy4wLjAuMScKKwordHJ5OgorICAgIGltcG9ydCB3YXJuaW5ncworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgZGVmIGlkbGVfZm9ybWF0d2FybmluZ19zdWJwcm9jKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lPU5vbmUpOgorICAgICAgICAiIiJGb3JtYXQgd2FybmluZ3MgdGhlIElETEUgd2F5IiIiCisgICAgICAgIHMgPSAiXG5XYXJuaW5nIChmcm9tIHdhcm5pbmdzIG1vZHVsZSk6XG4iCisgICAgICAgIHMgKz0gJyAgRmlsZSBcIiVzXCIsIGxpbmUgJXNcbicgJSAoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgaWYgbGluZSBpcyBOb25lOgorICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgIHMgKz0gIiAgICAlc1xuIiAlIGxpbmUKKyAgICAgICAgcyArPSAiJXM6ICVzXG4iICUgKGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQorICAgICAgICByZXR1cm4gcworICAgIHdhcm5pbmdzLmZvcm1hdHdhcm5pbmcgPSBpZGxlX2Zvcm1hdHdhcm5pbmdfc3VicHJvYworCisjIFRocmVhZCBzaGFyZWQgZ2xvYmFsczogRXN0YWJsaXNoIGEgcXVldWUgYmV0d2VlbiBhIHN1YnRocmVhZCAod2hpY2ggaGFuZGxlcworIyB0aGUgc29ja2V0KSBhbmQgdGhlIG1haW4gdGhyZWFkICh3aGljaCBydW5zIHVzZXIgY29kZSksIHBsdXMgZ2xvYmFsCisjIGNvbXBsZXRpb24sIGV4aXQgYW5kIGludGVycnVwdGFibGUgKHRoZSBtYWluIHRocmVhZCkgZmxhZ3M6CisKK2V4aXRfbm93ID0gRmFsc2UKK3F1aXR0aW5nID0gRmFsc2UKK2ludGVycnVwdGFibGUgPSBGYWxzZQorCitkZWYgbWFpbihkZWxfZXhpdGZ1bmM9RmFsc2UpOgorICAgICIiIlN0YXJ0IHRoZSBQeXRob24gZXhlY3V0aW9uIHNlcnZlciBpbiBhIHN1YnByb2Nlc3MKKworICAgIEluIHRoZSBQeXRob24gc3VicHJvY2VzcywgUlBDU2VydmVyIGlzIGluc3RhbnRpYXRlZCB3aXRoIGhhbmRsZXJjbGFzcworICAgIE15SGFuZGxlciwgd2hpY2ggaW5oZXJpdHMgcmVnaXN0ZXIvdW5yZWdpc3RlciBtZXRob2RzIGZyb20gUlBDSGFuZGxlciB2aWEKKyAgICB0aGUgbWl4LWluIGNsYXNzIFNvY2tldElPLgorCisgICAgV2hlbiB0aGUgUlBDU2VydmVyICdzZXJ2ZXInIGlzIGluc3RhbnRpYXRlZCwgdGhlIFRDUFNlcnZlciBpbml0aWFsaXphdGlvbgorICAgIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgcnVuLk15SGFuZGxlciBhbmQgY2FsbHMgaXRzIGhhbmRsZSgpIG1ldGhvZC4KKyAgICBoYW5kbGUoKSBpbnN0YW50aWF0ZXMgYSBydW4uRXhlY3V0aXZlIG9iamVjdCwgcGFzc2luZyBpdCBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICBNeUhhbmRsZXIgb2JqZWN0LiAgVGhhdCByZWZlcmVuY2UgaXMgc2F2ZWQgYXMgYXR0cmlidXRlIHJwY2hhbmRsZXIgb2YgdGhlCisgICAgRXhlY3V0aXZlIGluc3RhbmNlLiAgVGhlIEV4ZWN1dGl2ZSBtZXRob2RzIGhhdmUgYWNjZXNzIHRvIHRoZSByZWZlcmVuY2UgYW5kCisgICAgY2FuIHBhc3MgaXQgb24gdG8gZW50aXRpZXMgdGhhdCB0aGV5IGNvbW1hbmQKKyAgICAoZS5nLiBSZW1vdGVEZWJ1Z2dlci5EZWJ1Z2dlci5zdGFydF9kZWJ1Z2dlcigpKS4gIFRoZSBsYXR0ZXIsIGluIHR1cm4sIGNhbgorICAgIGNhbGwgTXlIYW5kbGVyKFNvY2tldElPKSByZWdpc3Rlci91bnJlZ2lzdGVyIG1ldGhvZHMgdmlhIHRoZSByZWZlcmVuY2UgdG8KKyAgICByZWdpc3RlciBhbmQgdW5yZWdpc3RlciB0aGVtc2VsdmVzLgorCisgICAgIiIiCisgICAgZ2xvYmFsIGV4aXRfbm93CisgICAgZ2xvYmFsIHF1aXR0aW5nCisgICAgZ2xvYmFsIG5vX2V4aXRmdW5jCisgICAgbm9fZXhpdGZ1bmMgPSBkZWxfZXhpdGZ1bmMKKyAgICAjdGltZS5zbGVlcCgxNSkgIyB0ZXN0IHN1YnByb2Nlc3Mgbm90IHJlc3BvbmRpbmcKKyAgICB0cnk6CisgICAgICAgIGFzc2VydChsZW4oc3lzLmFyZ3YpID4gMSkKKyAgICAgICAgcG9ydCA9IGludChzeXMuYXJndlstMV0pCisgICAgZXhjZXB0OgorICAgICAgICBwcmludD4+c3lzLnN0ZGVyciwgIklETEUgU3VicHJvY2Vzczogbm8gSVAgcG9ydCBwYXNzZWQgaW4gc3lzLmFyZ3YuIgorICAgICAgICByZXR1cm4KKyAgICBzeXMuYXJndls6XSA9IFsiIl0KKyAgICBzb2NrdGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bWFuYWdlX3NvY2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSdTb2NrVGhyZWFkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSgoTE9DQUxIT1NULCBwb3J0KSwpKQorICAgIHNvY2t0aHJlYWQuc2V0RGFlbW9uKFRydWUpCisgICAgc29ja3RocmVhZC5zdGFydCgpCisgICAgd2hpbGUgMToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgZXhpdF9ub3c6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBleGl0KCkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgICAgICMgZXhpdGluZyBidXQgZ290IGFuIGV4dHJhIEtCST8gVHJ5IGFnYWluIQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlcSwgcmVxdWVzdCA9IHJwYy5yZXF1ZXN0X3F1ZXVlLmdldChibG9jaz1UcnVlLCB0aW1lb3V0PTAuMDUpCisgICAgICAgICAgICBleGNlcHQgUXVldWUuRW1wdHk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIG1ldGhvZCwgYXJncywga3dhcmdzID0gcmVxdWVzdAorICAgICAgICAgICAgcmV0ID0gbWV0aG9kKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgIHJwYy5yZXNwb25zZV9xdWV1ZS5wdXQoKHNlcSwgcmV0KSkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgaWYgcXVpdHRpbmc6CisgICAgICAgICAgICAgICAgZXhpdF9ub3cgPSBUcnVlCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHR5cGUsIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHJpbnRfZXhjZXB0aW9uKCkKKyAgICAgICAgICAgICAgICBycGMucmVzcG9uc2VfcXVldWUucHV0KChzZXEsIE5vbmUpKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgTGluayBkaWRuJ3Qgd29yaywgcHJpbnQgc2FtZSBleGNlcHRpb24gdG8gX19zdGRlcnJfXworICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGNlcHRpb24odHlwZSwgdmFsdWUsIHRiLCBmaWxlPXN5cy5fX3N0ZGVycl9fKQorICAgICAgICAgICAgICAgIGV4aXQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCitkZWYgbWFuYWdlX3NvY2tldChhZGRyZXNzKToKKyAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgdGltZS5zbGVlcChpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXJ2ZXIgPSBNeVJQQ1NlcnZlcihhZGRyZXNzLCBNeUhhbmRsZXIpCisgICAgICAgICAgICBicmVhaworICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6CisgICAgICAgICAgICBwcmludD4+c3lzLl9fc3RkZXJyX18sIklETEUgU3VicHJvY2Vzczogc29ja2V0IGVycm9yOiAiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZXJyLmFyZ3NbMV0gKyAiLCByZXRyeWluZy4uLi4iCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQ+PnN5cy5fX3N0ZGVycl9fLCAiSURMRSBTdWJwcm9jZXNzOiBDb25uZWN0aW9uIHRvICJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklETEUgR1VJIGZhaWxlZCwgZXhpdGluZy4iCisgICAgICAgIHNob3dfc29ja2V0X2Vycm9yKGVyciwgYWRkcmVzcykKKyAgICAgICAgZ2xvYmFsIGV4aXRfbm93CisgICAgICAgIGV4aXRfbm93ID0gVHJ1ZQorICAgICAgICByZXR1cm4KKyAgICBzZXJ2ZXIuaGFuZGxlX3JlcXVlc3QoKSAjIEEgc2luZ2xlIHJlcXVlc3Qgb25seQorCitkZWYgc2hvd19zb2NrZXRfZXJyb3IoZXJyLCBhZGRyZXNzKToKKyAgICBpbXBvcnQgVGtpbnRlcgorICAgIGltcG9ydCB0a01lc3NhZ2VCb3gKKyAgICByb290ID0gVGtpbnRlci5UaygpCisgICAgcm9vdC53aXRoZHJhdygpCisgICAgaWYgZXJyLmFyZ3NbMF0gPT0gNjE6ICMgY29ubmVjdGlvbiByZWZ1c2VkCisgICAgICAgIG1zZyA9ICJJRExFJ3Mgc3VicHJvY2VzcyBjYW4ndCBjb25uZWN0IHRvICVzOiVkLiAgVGhpcyBtYXkgYmUgZHVlICJcCisgICAgICAgICAgICAgICJ0byB5b3VyIHBlcnNvbmFsIGZpcmV3YWxsIGNvbmZpZ3VyYXRpb24uICBJdCBpcyBzYWZlIHRvICJcCisgICAgICAgICAgICAgICJhbGxvdyB0aGlzIGludGVybmFsIGNvbm5lY3Rpb24gYmVjYXVzZSBubyBkYXRhIGlzIHZpc2libGUgb24gIlwKKyAgICAgICAgICAgICAgImV4dGVybmFsIHBvcnRzLiIgJSBhZGRyZXNzCisgICAgICAgIHRrTWVzc2FnZUJveC5zaG93ZXJyb3IoIklETEUgU3VicHJvY2VzcyBFcnJvciIsIG1zZywgcGFyZW50PXJvb3QpCisgICAgZWxzZToKKyAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcigiSURMRSBTdWJwcm9jZXNzIEVycm9yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU29ja2V0IEVycm9yOiAlcyIgJSBlcnIuYXJnc1sxXSkKKyAgICByb290LmRlc3Ryb3koKQorCitkZWYgcHJpbnRfZXhjZXB0aW9uKCk6CisgICAgaW1wb3J0IGxpbmVjYWNoZQorICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKCkKKyAgICBmbHVzaF9zdGRvdXQoKQorICAgIGVmaWxlID0gc3lzLnN0ZGVycgorICAgIHR5cCwgdmFsLCB0YiA9IGV4Y2luZm8gPSBzeXMuZXhjX2luZm8oKQorICAgIHN5cy5sYXN0X3R5cGUsIHN5cy5sYXN0X3ZhbHVlLCBzeXMubGFzdF90cmFjZWJhY2sgPSBleGNpbmZvCisgICAgdGJlID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCisgICAgcHJpbnQ+PmVmaWxlLCAnXG5UcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6JworICAgIGV4Y2x1ZGUgPSAoInJ1bi5weSIsICJycGMucHkiLCAidGhyZWFkaW5nLnB5IiwgIlF1ZXVlLnB5IiwKKyAgICAgICAgICAgICAgICJSZW1vdGVEZWJ1Z2dlci5weSIsICJiZGIucHkiKQorICAgIGNsZWFudXBfdHJhY2ViYWNrKHRiZSwgZXhjbHVkZSkKKyAgICB0cmFjZWJhY2sucHJpbnRfbGlzdCh0YmUsIGZpbGU9ZWZpbGUpCisgICAgbGluZXMgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHR5cCwgdmFsKQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBwcmludD4+ZWZpbGUsIGxpbmUsCisKK2RlZiBjbGVhbnVwX3RyYWNlYmFjayh0YiwgZXhjbHVkZSk6CisgICAgIlJlbW92ZSBleGNsdWRlZCB0cmFjZXMgZnJvbSBiZWdpbm5pbmcvZW5kIG9mIHRiOyBnZXQgY2FjaGVkIGxpbmVzIgorICAgIG9yaWdfdGIgPSB0Yls6XQorICAgIHdoaWxlIHRiOgorICAgICAgICBmb3IgcnBjZmlsZSBpbiBleGNsdWRlOgorICAgICAgICAgICAgaWYgdGJbMF1bMF0uY291bnQocnBjZmlsZSk6CisgICAgICAgICAgICAgICAgYnJlYWsgICAgIyBmb3VuZCBhbiBleGNsdWRlLCBicmVhayBmb3I6IGFuZCBkZWxldGUgdGJbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrICAgICAgICAjIG5vIGV4Y2x1ZGVzLCBoYXZlIGxlZnQgUlBDIGNvZGUsIGJyZWFrIHdoaWxlOgorICAgICAgICBkZWwgdGJbMF0KKyAgICB3aGlsZSB0YjoKKyAgICAgICAgZm9yIHJwY2ZpbGUgaW4gZXhjbHVkZToKKyAgICAgICAgICAgIGlmIHRiWy0xXVswXS5jb3VudChycGNmaWxlKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZGVsIHRiWy0xXQorICAgIGlmIGxlbih0YikgPT0gMDoKKyAgICAgICAgIyBleGNlcHRpb24gd2FzIGluIElETEUgaW50ZXJuYWxzLCBkb24ndCBwcnVuZSEKKyAgICAgICAgdGJbOl0gPSBvcmlnX3RiWzpdCisgICAgICAgIHByaW50Pj5zeXMuc3RkZXJyLCAiKiogSURMRSBJbnRlcm5hbCBFeGNlcHRpb246ICIKKyAgICBycGNoYW5kbGVyID0gcnBjLm9iamVjdHRhYmxlWydleGVjJ10ucnBjaGFuZGxlcgorICAgIGZvciBpIGluIHJhbmdlKGxlbih0YikpOgorICAgICAgICBmbiwgbG4sIG5tLCBsaW5lID0gdGJbaV0KKyAgICAgICAgaWYgbm0gPT0gJz8nOgorICAgICAgICAgICAgbm0gPSAiLXRvcGxldmVsLSIKKyAgICAgICAgaWYgbm90IGxpbmUgYW5kIGZuLnN0YXJ0c3dpdGgoIjxweXNoZWxsIyIpOgorICAgICAgICAgICAgbGluZSA9IHJwY2hhbmRsZXIucmVtb3RlY2FsbCgnbGluZWNhY2hlJywgJ2dldGxpbmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbiwgbG4pLCB7fSkKKyAgICAgICAgdGJbaV0gPSBmbiwgbG4sIG5tLCBsaW5lCisKK2RlZiBmbHVzaF9zdGRvdXQoKToKKyAgICB0cnk6CisgICAgICAgIGlmIHN5cy5zdGRvdXQuc29mdHNwYWNlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC5zb2Z0c3BhY2UgPSAwCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgRU9GRXJyb3IpOgorICAgICAgICBwYXNzCisKK2RlZiBleGl0KCk6CisgICAgIiIiRXhpdCBzdWJwcm9jZXNzLCBwb3NzaWJseSBhZnRlciBmaXJzdCBkZWxldGluZyBzeXMuZXhpdGZ1bmMKKworICAgIElmIGNvbmZpZy1tYWluLmNmZy8uZGVmICdHZW5lcmFsJyAnZGVsZXRlLWV4aXRmdW5jJyBpcyBUcnVlLCB0aGVuIGFueQorICAgIHN5cy5leGl0ZnVuYyB3aWxsIGJlIHJlbW92ZWQgYmVmb3JlIGV4aXRpbmcuICAoVlB5dGhvbiBzdXBwb3J0KQorCisgICAgIiIiCisgICAgaWYgbm9fZXhpdGZ1bmM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzeXMuZXhpdGZ1bmMKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIHN5cy5leGl0KDApCisKK2NsYXNzIE15UlBDU2VydmVyKHJwYy5SUENTZXJ2ZXIpOgorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmLCByZXF1ZXN0LCBjbGllbnRfYWRkcmVzcyk6CisgICAgICAgICIiIk92ZXJyaWRlIFJQQ1NlcnZlciBtZXRob2QgZm9yIElETEUKKworICAgICAgICBJbnRlcnJ1cHQgdGhlIE1haW5UaHJlYWQgYW5kIGV4aXQgc2VydmVyIGlmIGxpbmsgaXMgZHJvcHBlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgZ2xvYmFsIHF1aXR0aW5nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgZ2xvYmFsIGV4aXRfbm93CisgICAgICAgICAgICBleGl0X25vdyA9IFRydWUKKyAgICAgICAgICAgIHRocmVhZC5pbnRlcnJ1cHRfbWFpbigpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGVyZiA9IHN5cy5fX3N0ZGVycl9fCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnXG4nICsgJy0nKjQwCisgICAgICAgICAgICBwcmludD4+ZXJmLCAnVW5oYW5kbGVkIHNlcnZlciBleGNlcHRpb24hJworICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ1RocmVhZDogJXMnICUgdGhyZWFkaW5nLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdDbGllbnQgQWRkcmVzczogJywgY2xpZW50X2FkZHJlc3MKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICdSZXF1ZXN0OiAnLCByZXByKHJlcXVlc3QpCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKGZpbGU9ZXJmKQorICAgICAgICAgICAgcHJpbnQ+PmVyZiwgJ1xuKioqIFVucmVjb3ZlcmFibGUsIHNlcnZlciBleGl0aW5nIScKKyAgICAgICAgICAgIHByaW50Pj5lcmYsICctJyo0MAorICAgICAgICAgICAgcXVpdHRpbmcgPSBUcnVlCisgICAgICAgICAgICB0aHJlYWQuaW50ZXJydXB0X21haW4oKQorCitjbGFzcyBNeUhhbmRsZXIocnBjLlJQQ0hhbmRsZXIpOgorCisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgYmFzZSBtZXRob2QiIiIKKyAgICAgICAgZXhlY3V0aXZlID0gRXhlY3V0aXZlKHNlbGYpCisgICAgICAgIHNlbGYucmVnaXN0ZXIoImV4ZWMiLCBleGVjdXRpdmUpCisgICAgICAgIHNlbGYuY29uc29sZSA9IHNlbGYuZ2V0X3JlbW90ZV9wcm94eSgiY29uc29sZSIpCisgICAgICAgIHN5cy5zdGRpbiA9IFB5U2hlbGwuUHNldWRvSW5wdXRGaWxlKHNlbGYuY29uc29sZSwgInN0ZGluIiwKKyAgICAgICAgICAgICAgICBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIHN5cy5zdGRvdXQgPSBQeVNoZWxsLlBzZXVkb091dHB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3Rkb3V0IiwKKyAgICAgICAgICAgICAgICBJT0JpbmRpbmcuZW5jb2RpbmcpCisgICAgICAgIHN5cy5zdGRlcnIgPSBQeVNoZWxsLlBzZXVkb091dHB1dEZpbGUoc2VsZi5jb25zb2xlLCAic3RkZXJyIiwKKyAgICAgICAgICAgICAgICBJT0JpbmRpbmcuZW5jb2RpbmcpCisKKyAgICAgICAgIyBLZWVwIGEgcmVmZXJlbmNlIHRvIHN0ZGluIHNvIHRoYXQgaXQgd29uJ3QgdHJ5IHRvIGV4aXQgSURMRSBpZgorICAgICAgICAjIHN5cy5zdGRpbiBnZXRzIGNoYW5nZWQgZnJvbSB3aXRoaW4gSURMRSdzIHNoZWxsLiBTZWUgaXNzdWUxNzgzOC4KKyAgICAgICAgc2VsZi5fa2VlcF9zdGRpbiA9IHN5cy5zdGRpbgorCisgICAgICAgIHNlbGYuaW50ZXJwID0gc2VsZi5nZXRfcmVtb3RlX3Byb3h5KCJpbnRlcnAiKQorICAgICAgICBycGMuUlBDSGFuZGxlci5nZXRyZXNwb25zZShzZWxmLCBteXNlcT1Ob25lLCB3YWl0PTAuMDUpCisKKyAgICBkZWYgZXhpdGhvb2soc2VsZik6CisgICAgICAgICJvdmVycmlkZSBTb2NrZXRJTyBtZXRob2QgLSB3YWl0IGZvciBNYWluVGhyZWFkIHRvIHNodXQgdXMgZG93biIKKyAgICAgICAgdGltZS5zbGVlcCgxMCkKKworICAgIGRlZiBFT0Zob29rKHNlbGYpOgorICAgICAgICAiT3ZlcnJpZGUgU29ja2V0SU8gbWV0aG9kIC0gdGVybWluYXRlIHdhaXQgb24gY2FsbGJhY2sgYW5kIGV4aXQgdGhyZWFkIgorICAgICAgICBnbG9iYWwgcXVpdHRpbmcKKyAgICAgICAgcXVpdHRpbmcgPSBUcnVlCisgICAgICAgIHRocmVhZC5pbnRlcnJ1cHRfbWFpbigpCisKKyAgICBkZWYgZGVjb2RlX2ludGVycnVwdGhvb2soc2VsZik6CisgICAgICAgICJpbnRlcnJ1cHQgYXdha2VuZWQgdGhyZWFkIgorICAgICAgICBnbG9iYWwgcXVpdHRpbmcKKyAgICAgICAgcXVpdHRpbmcgPSBUcnVlCisgICAgICAgIHRocmVhZC5pbnRlcnJ1cHRfbWFpbigpCisKKworY2xhc3MgRXhlY3V0aXZlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcnBjaGFuZGxlcik6CisgICAgICAgIHNlbGYucnBjaGFuZGxlciA9IHJwY2hhbmRsZXIKKyAgICAgICAgc2VsZi5sb2NhbHMgPSBfX21haW5fXy5fX2RpY3RfXworICAgICAgICBzZWxmLmNhbGx0aXAgPSBDYWxsVGlwcy5DYWxsVGlwcygpCisgICAgICAgIHNlbGYuYXV0b2NvbXBsZXRlID0gQXV0b0NvbXBsZXRlLkF1dG9Db21wbGV0ZSgpCisKKyAgICBkZWYgcnVuY29kZShzZWxmLCBjb2RlKToKKyAgICAgICAgZ2xvYmFsIGludGVycnVwdGFibGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi51c3JfZXhjX2luZm8gPSBOb25lCisgICAgICAgICAgICBpbnRlcnJ1cHRhYmxlID0gVHJ1ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBzZWxmLmxvY2FscworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRhYmxlID0gRmFsc2UKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICAgICAjIFNjcmlwdHMgdGhhdCByYWlzZSBTeXN0ZW1FeGl0IHNob3VsZCBqdXN0CisgICAgICAgICAgICAjIHJldHVybiB0byB0aGUgaW50ZXJhY3RpdmUgcHJvbXB0CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYudXNyX2V4Y19pbmZvID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIGlmIHF1aXR0aW5nOgorICAgICAgICAgICAgICAgIGV4aXQoKQorICAgICAgICAgICAgcHJpbnRfZXhjZXB0aW9uKCkKKyAgICAgICAgICAgIGppdCA9IHNlbGYucnBjaGFuZGxlci5jb25zb2xlLmdldHZhcigiPDx0b2dnbGUtaml0LXN0YWNrLXZpZXdlcj4+IikKKyAgICAgICAgICAgIGlmIGppdDoKKyAgICAgICAgICAgICAgICBzZWxmLnJwY2hhbmRsZXIuaW50ZXJwLm9wZW5fcmVtb3RlX3N0YWNrX3ZpZXdlcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbHVzaF9zdGRvdXQoKQorCisgICAgZGVmIGludGVycnVwdF90aGVfc2VydmVyKHNlbGYpOgorICAgICAgICBpZiBpbnRlcnJ1cHRhYmxlOgorICAgICAgICAgICAgdGhyZWFkLmludGVycnVwdF9tYWluKCkKKworICAgIGRlZiBzdGFydF90aGVfZGVidWdnZXIoc2VsZiwgZ3VpX2FkYXBfb2lkKToKKyAgICAgICAgcmV0dXJuIFJlbW90ZURlYnVnZ2VyLnN0YXJ0X2RlYnVnZ2VyKHNlbGYucnBjaGFuZGxlciwgZ3VpX2FkYXBfb2lkKQorCisgICAgZGVmIHN0b3BfdGhlX2RlYnVnZ2VyKHNlbGYsIGlkYl9hZGFwX29pZCk6CisgICAgICAgICJVbnJlZ2lzdGVyIHRoZSBJZGIgQWRhcHRlci4gIExpbmsgb2JqZWN0cyBhbmQgSWRiIHRoZW4gc3ViamVjdCB0byBHQyIKKyAgICAgICAgc2VsZi5ycGNoYW5kbGVyLnVucmVnaXN0ZXIoaWRiX2FkYXBfb2lkKQorCisgICAgZGVmIGdldF90aGVfY2FsbHRpcChzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FsbHRpcC5mZXRjaF90aXAobmFtZSkKKworICAgIGRlZiBnZXRfdGhlX2NvbXBsZXRpb25fbGlzdChzZWxmLCB3aGF0LCBtb2RlKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXV0b2NvbXBsZXRlLmZldGNoX2NvbXBsZXRpb25zKHdoYXQsIG1vZGUpCisKKyAgICBkZWYgc3RhY2t2aWV3ZXIoc2VsZiwgZmxpc3Rfb2lkPU5vbmUpOgorICAgICAgICBpZiBzZWxmLnVzcl9leGNfaW5mbzoKKyAgICAgICAgICAgIHR5cCwgdmFsLCB0YiA9IHNlbGYudXNyX2V4Y19pbmZvCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBmbGlzdCA9IE5vbmUKKyAgICAgICAgaWYgZmxpc3Rfb2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZmxpc3QgPSBzZWxmLnJwY2hhbmRsZXIuZ2V0X3JlbW90ZV9wcm94eShmbGlzdF9vaWQpCisgICAgICAgIHdoaWxlIHRiIGFuZCB0Yi50Yl9mcmFtZS5mX2dsb2JhbHNbIl9fbmFtZV9fIl0gaW4gWyJycGMiLCAicnVuIl06CisgICAgICAgICAgICB0YiA9IHRiLnRiX25leHQKKyAgICAgICAgc3lzLmxhc3RfdHlwZSA9IHR5cAorICAgICAgICBzeXMubGFzdF92YWx1ZSA9IHZhbAorICAgICAgICBpdGVtID0gU3RhY2tWaWV3ZXIuU3RhY2tUcmVlSXRlbShmbGlzdCwgdGIpCisgICAgICAgIHJldHVybiBSZW1vdGVPYmplY3RCcm93c2VyLnJlbW90ZV9vYmplY3RfdHJlZV9pdGVtKGl0ZW0pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ydW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTBmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi9ydW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzdhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvcnVuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGFiYmVkcGFnZXMucHkgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGFiYmVkcGFnZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ3MTEzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90YWJiZWRwYWdlcy5weQpAQCAtMCwwICsxLDQ5MCBAQAorIiIiQW4gaW1wbGVtZW50YXRpb24gb2YgdGFiYmVkIHBhZ2VzIHVzaW5nIG9ubHkgc3RhbmRhcmQgVGtpbnRlci4KKworT3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIHVzZSBpbiBJRExFLiBCYXNlZCBvbiB0YWJwYWdlLnB5LgorCitDbGFzc2VzIGV4cG9ydGVkOgorVGFiYmVkUGFnZVNldCAtLSBBIFRraW50ZXIgaW1wbGVtZW50YXRpb24gb2YgYSB0YWJiZWQtcGFnZSB3aWRnZXQuCitUYWJTZXQgLS0gQSB3aWRnZXQgY29udGFpbmluZyB0YWJzIChidXR0b25zKSBpbiBvbmUgb3IgbW9yZSByb3dzLgorCisiIiIKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorCitjbGFzcyBJbnZhbGlkTmFtZUVycm9yKEV4Y2VwdGlvbik6IHBhc3MKK2NsYXNzIEFscmVhZHlFeGlzdHNFcnJvcihFeGNlcHRpb24pOiBwYXNzCisKKworY2xhc3MgVGFiU2V0KEZyYW1lKToKKyAgICAiIiJBIHdpZGdldCBjb250YWluaW5nIHRhYnMgKGJ1dHRvbnMpIGluIG9uZSBvciBtb3JlIHJvd3MuCisKKyAgICBPbmx5IG9uZSB0YWIgbWF5IGJlIHNlbGVjdGVkIGF0IGEgdGltZS4KKworICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYWdlX3NldCwgc2VsZWN0X2NvbW1hbmQsCisgICAgICAgICAgICAgICAgIHRhYnM9Tm9uZSwgbl9yb3dzPTEsIG1heF90YWJzX3Blcl9yb3c9NSwKKyAgICAgICAgICAgICAgICAgZXhwYW5kX3RhYnM9RmFsc2UsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3RvciBhcmd1bWVudHM6CisKKyAgICAgICAgc2VsZWN0X2NvbW1hbmQgLS0gQSBjYWxsYWJsZSB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgdGFiIGlzCisgICAgICAgIHNlbGVjdGVkLiBJdCBpcyBjYWxsZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgdGFiIGFzIGFuCisgICAgICAgIGFyZ3VtZW50LgorCisgICAgICAgIHRhYnMgLS0gQSBsaXN0IG9mIHN0cmluZ3MsIHRoZSBuYW1lcyBvZiB0aGUgdGFicy4gU2hvdWxkIGJlIHNwZWNpZmllZCBpbgorICAgICAgICB0aGUgZGVzaXJlZCB0YWIgb3JkZXIuIFRoZSBmaXJzdCB0YWIgd2lsbCBiZSB0aGUgZGVmYXVsdCBhbmQgZmlyc3QKKyAgICAgICAgYWN0aXZlIHRhYi4gSWYgdGFicyBpcyBOb25lIG9yIGVtcHR5LCB0aGUgVGFiU2V0IHdpbGwgYmUgaW5pdGlhbGl6ZWQKKyAgICAgICAgZW1wdHkuCisKKyAgICAgICAgbl9yb3dzIC0tIE51bWJlciBvZiByb3dzIG9mIHRhYnMgdG8gYmUgc2hvd24uIElmIG5fcm93cyA8PSAwIG9yIGlzCisgICAgICAgIE5vbmUsIHRoZW4gdGhlIG51bWJlciBvZiByb3dzIHdpbGwgYmUgZGVjaWRlZCBieSBUYWJTZXQuIFNlZQorICAgICAgICBfYXJyYW5nZV90YWJzKCkgZm9yIGRldGFpbHMuCisKKyAgICAgICAgbWF4X3RhYnNfcGVyX3JvdyAtLSBVc2VkIGZvciBkZWNpZGluZyBob3cgbWFueSByb3dzIG9mIHRhYnMgYXJlIG5lZWRlZCwKKyAgICAgICAgd2hlbiB0aGUgbnVtYmVyIG9mIHJvd3MgaXMgbm90IGNvbnN0YW50LiBTZWUgX2FycmFuZ2VfdGFicygpIGZvcgorICAgICAgICBkZXRhaWxzLgorCisgICAgICAgICIiIgorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBwYWdlX3NldCwgKiprdykKKyAgICAgICAgc2VsZi5zZWxlY3RfY29tbWFuZCA9IHNlbGVjdF9jb21tYW5kCisgICAgICAgIHNlbGYubl9yb3dzID0gbl9yb3dzCisgICAgICAgIHNlbGYubWF4X3RhYnNfcGVyX3JvdyA9IG1heF90YWJzX3Blcl9yb3cKKyAgICAgICAgc2VsZi5leHBhbmRfdGFicyA9IGV4cGFuZF90YWJzCisgICAgICAgIHNlbGYucGFnZV9zZXQgPSBwYWdlX3NldAorCisgICAgICAgIHNlbGYuX3RhYnMgPSB7fQorICAgICAgICBzZWxmLl90YWIycm93ID0ge30KKyAgICAgICAgaWYgdGFiczoKKyAgICAgICAgICAgIHNlbGYuX3RhYl9uYW1lcyA9IGxpc3QodGFicykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3RhYl9uYW1lcyA9IFtdCisgICAgICAgIHNlbGYuX3NlbGVjdGVkX3RhYiA9IE5vbmUKKyAgICAgICAgc2VsZi5fdGFiX3Jvd3MgPSBbXQorCisgICAgICAgIHNlbGYucGFkZGluZ19mcmFtZSA9IEZyYW1lKHNlbGYsIGhlaWdodD0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aD0wLCByZWxpZWY9RkxBVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZD1zZWxmLmNnZXQoJ2JhY2tncm91bmQnKSkKKyAgICAgICAgc2VsZi5wYWRkaW5nX2ZyYW1lLnBhY2soc2lkZT1UT1AsIGZpbGw9WCwgZXhwYW5kPUZhbHNlKQorCisgICAgICAgIHNlbGYuX2FycmFuZ2VfdGFicygpCisKKyAgICBkZWYgYWRkX3RhYihzZWxmLCB0YWJfbmFtZSk6CisgICAgICAgICIiIkFkZCBhIG5ldyB0YWIgd2l0aCB0aGUgbmFtZSBnaXZlbiBpbiB0YWJfbmFtZS4iIiIKKyAgICAgICAgaWYgbm90IHRhYl9uYW1lOgorICAgICAgICAgICAgcmFpc2UgSW52YWxpZE5hbWVFcnJvcigiSW52YWxpZCBUYWIgbmFtZTogJyVzJyIgJSB0YWJfbmFtZSkKKyAgICAgICAgaWYgdGFiX25hbWUgaW4gc2VsZi5fdGFiX25hbWVzOgorICAgICAgICAgICAgcmFpc2UgQWxyZWFkeUV4aXN0c0Vycm9yKCJUYWIgbmFtZWQgJyVzJyBhbHJlYWR5IGV4aXN0cyIgJXRhYl9uYW1lKQorCisgICAgICAgIHNlbGYuX3RhYl9uYW1lcy5hcHBlbmQodGFiX25hbWUpCisgICAgICAgIHNlbGYuX2FycmFuZ2VfdGFicygpCisKKyAgICBkZWYgcmVtb3ZlX3RhYihzZWxmLCB0YWJfbmFtZSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUgdGFiIG5hbWVkIDx0YWJfbmFtZT4iIiIKKyAgICAgICAgaWYgbm90IHRhYl9uYW1lIGluIHNlbGYuX3RhYl9uYW1lczoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJObyBzdWNoIFRhYjogJyVzIiAlIHBhZ2VfbmFtZSkKKworICAgICAgICBzZWxmLl90YWJfbmFtZXMucmVtb3ZlKHRhYl9uYW1lKQorICAgICAgICBzZWxmLl9hcnJhbmdlX3RhYnMoKQorCisgICAgZGVmIHNldF9zZWxlY3RlZF90YWIoc2VsZiwgdGFiX25hbWUpOgorICAgICAgICAiIiJTaG93IHRoZSB0YWIgbmFtZWQgPHRhYl9uYW1lPiBhcyB0aGUgc2VsZWN0ZWQgb25lIiIiCisgICAgICAgIGlmIHRhYl9uYW1lID09IHNlbGYuX3NlbGVjdGVkX3RhYjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB0YWJfbmFtZSBpcyBub3QgTm9uZSBhbmQgdGFiX25hbWUgbm90IGluIHNlbGYuX3RhYnM6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gc3VjaCBUYWI6ICclcyIgJSBwYWdlX25hbWUpCisKKyAgICAgICAgIyBkZXNlbGVjdCB0aGUgY3VycmVudCBzZWxlY3RlZCB0YWIKKyAgICAgICAgaWYgc2VsZi5fc2VsZWN0ZWRfdGFiIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fdGFic1tzZWxmLl9zZWxlY3RlZF90YWJdLnNldF9ub3JtYWwoKQorICAgICAgICBzZWxmLl9zZWxlY3RlZF90YWIgPSBOb25lCisKKyAgICAgICAgaWYgdGFiX25hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIGFjdGl2YXRlIHRoZSB0YWIgbmFtZWQgdGFiX25hbWUKKyAgICAgICAgICAgIHNlbGYuX3NlbGVjdGVkX3RhYiA9IHRhYl9uYW1lCisgICAgICAgICAgICB0YWIgPSBzZWxmLl90YWJzW3RhYl9uYW1lXQorICAgICAgICAgICAgdGFiLnNldF9zZWxlY3RlZCgpCisgICAgICAgICAgICAjIG1vdmUgdGhlIHRhYiByb3cgd2l0aCB0aGUgc2VsZWN0ZWQgdGFiIHRvIHRoZSBib3R0b20KKyAgICAgICAgICAgIHRhYl9yb3cgPSBzZWxmLl90YWIycm93W3RhYl0KKyAgICAgICAgICAgIHRhYl9yb3cucGFja19mb3JnZXQoKQorICAgICAgICAgICAgdGFiX3Jvdy5wYWNrKHNpZGU9VE9QLCBmaWxsPVgsIGV4cGFuZD0wKQorCisgICAgZGVmIF9hZGRfdGFiX3JvdyhzZWxmLCB0YWJfbmFtZXMsIGV4cGFuZF90YWJzKToKKyAgICAgICAgaWYgbm90IHRhYl9uYW1lczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRhYl9yb3cgPSBGcmFtZShzZWxmKQorICAgICAgICB0YWJfcm93LnBhY2soc2lkZT1UT1AsIGZpbGw9WCwgZXhwYW5kPTApCisgICAgICAgIHNlbGYuX3RhYl9yb3dzLmFwcGVuZCh0YWJfcm93KQorCisgICAgICAgIGZvciB0YWJfbmFtZSBpbiB0YWJfbmFtZXM6CisgICAgICAgICAgICB0YWIgPSBUYWJTZXQuVGFiQnV0dG9uKHRhYl9uYW1lLCBzZWxmLnNlbGVjdF9jb21tYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJfcm93LCBzZWxmKQorICAgICAgICAgICAgaWYgZXhwYW5kX3RhYnM6CisgICAgICAgICAgICAgICAgdGFiLnBhY2soc2lkZT1MRUZULCBmaWxsPVgsIGV4cGFuZD1UcnVlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0YWIucGFjayhzaWRlPUxFRlQpCisgICAgICAgICAgICBzZWxmLl90YWJzW3RhYl9uYW1lXSA9IHRhYgorICAgICAgICAgICAgc2VsZi5fdGFiMnJvd1t0YWJdID0gdGFiX3JvdworCisgICAgICAgICMgdGFiIGlzIHRoZSBsYXN0IG9uZSBjcmVhdGVkIGluIHRoZSBhYm92ZSBsb29wCisgICAgICAgIHRhYi5pc19sYXN0X2luX3JvdyA9IFRydWUKKworICAgIGRlZiBfcmVzZXRfdGFiX3Jvd3Moc2VsZik6CisgICAgICAgIHdoaWxlIHNlbGYuX3RhYl9yb3dzOgorICAgICAgICAgICAgdGFiX3JvdyA9IHNlbGYuX3RhYl9yb3dzLnBvcCgpCisgICAgICAgICAgICB0YWJfcm93LmRlc3Ryb3koKQorICAgICAgICBzZWxmLl90YWIycm93ID0ge30KKworICAgIGRlZiBfYXJyYW5nZV90YWJzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQXJyYW5nZSB0aGUgdGFicyBpbiByb3dzLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLgorCisgICAgICAgIElmIG5fcm93cyA+PSAxLCB0aGlzIHdpbGwgYmUgdGhlIG51bWJlciBvZiByb3dzIHVzZWQuIE90aGVyd2lzZSB0aGUKKyAgICAgICAgbnVtYmVyIG9mIHJvd3Mgd2lsbCBiZSBjYWxjdWxhdGVkIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIHRhYnMgYW5kCisgICAgICAgIG1heF90YWJzX3Blcl9yb3cuIEluIHRoaXMgY2FzZSwgdGhlIG51bWJlciBvZiByb3dzIG1heSBjaGFuZ2Ugd2hlbgorICAgICAgICBhZGRpbmcvcmVtb3ZpbmcgdGFicy4KKworICAgICAgICAiIiIKKyAgICAgICAgIyByZW1vdmUgYWxsIHRhYnMgYW5kIHJvd3MKKyAgICAgICAgZm9yIHRhYl9uYW1lIGluIHNlbGYuX3RhYnMua2V5cygpOgorICAgICAgICAgICAgc2VsZi5fdGFicy5wb3AodGFiX25hbWUpLmRlc3Ryb3koKQorICAgICAgICBzZWxmLl9yZXNldF90YWJfcm93cygpCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3RhYl9uYW1lczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYubl9yb3dzIGlzIG5vdCBOb25lIGFuZCBzZWxmLm5fcm93cyA+IDA6CisgICAgICAgICAgICBuX3Jvd3MgPSBzZWxmLm5fcm93cworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBjYWxjdWxhdGUgdGhlIHJlcXVpcmVkIG51bWJlciBvZiByb3dzCisgICAgICAgICAgICBuX3Jvd3MgPSAobGVuKHNlbGYuX3RhYl9uYW1lcykgLSAxKSAvLyBzZWxmLm1heF90YWJzX3Blcl9yb3cgKyAxCisKKyAgICAgICAgIyBub3QgZXhwYW5kaW5nIHRoZSB0YWJzIHdpdGggbW9yZSB0aGFuIG9uZSByb3cgaXMgdmVyeSB1Z2x5CisgICAgICAgIGV4cGFuZF90YWJzID0gc2VsZi5leHBhbmRfdGFicyBvciBuX3Jvd3MgPiAxCisgICAgICAgIGkgPSAwICMgaW5kZXggaW4gc2VsZi5fdGFiX25hbWVzCisgICAgICAgIGZvciByb3dfaW5kZXggaW4geHJhbmdlKG5fcm93cyk6CisgICAgICAgICAgICAjIGNhbGN1bGF0ZSByZXF1aXJlZCBudW1iZXIgb2YgdGFicyBpbiB0aGlzIHJvdworICAgICAgICAgICAgbl90YWJzID0gKGxlbihzZWxmLl90YWJfbmFtZXMpIC0gaSAtIDEpIC8vIChuX3Jvd3MgLSByb3dfaW5kZXgpICsgMQorICAgICAgICAgICAgdGFiX25hbWVzID0gc2VsZi5fdGFiX25hbWVzW2k6aSArIG5fdGFic10KKyAgICAgICAgICAgIGkgKz0gbl90YWJzCisgICAgICAgICAgICBzZWxmLl9hZGRfdGFiX3Jvdyh0YWJfbmFtZXMsIGV4cGFuZF90YWJzKQorCisgICAgICAgICMgcmUtc2VsZWN0IHNlbGVjdGVkIHRhYiBzbyBpdCBpcyBwcm9wZXJseSBkaXNwbGF5ZWQKKyAgICAgICAgc2VsZWN0ZWQgPSBzZWxmLl9zZWxlY3RlZF90YWIKKyAgICAgICAgc2VsZi5zZXRfc2VsZWN0ZWRfdGFiKE5vbmUpCisgICAgICAgIGlmIHNlbGVjdGVkIGluIHNlbGYuX3RhYl9uYW1lczoKKyAgICAgICAgICAgIHNlbGYuc2V0X3NlbGVjdGVkX3RhYihzZWxlY3RlZCkKKworICAgIGNsYXNzIFRhYkJ1dHRvbihGcmFtZSk6CisgICAgICAgICIiIkEgc2ltcGxlIHRhYi1saWtlIHdpZGdldC4iIiIKKworICAgICAgICBidyA9IDIgIyBib3JkZXJ3aWR0aAorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBzZWxlY3RfY29tbWFuZCwgdGFiX3JvdywgdGFiX3NldCk6CisgICAgICAgICAgICAiIiJDb25zdHJ1Y3RvciBhcmd1bWVudHM6CisKKyAgICAgICAgICAgIG5hbWUgLS0gVGhlIHRhYidzIG5hbWUsIHdoaWNoIHdpbGwgYXBwZWFyIGluIGl0cyBidXR0b24uCisKKyAgICAgICAgICAgIHNlbGVjdF9jb21tYW5kIC0tIFRoZSBjb21tYW5kIHRvIGJlIGNhbGxlZCB1cG9uIHNlbGVjdGlvbiBvZiB0aGUKKyAgICAgICAgICAgIHRhYi4gSXQgaXMgY2FsbGVkIHdpdGggdGhlIHRhYidzIG5hbWUgYXMgYW4gYXJndW1lbnQuCisKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgdGFiX3JvdywgYm9yZGVyd2lkdGg9c2VsZi5idywgcmVsaWVmPVJBSVNFRCkKKworICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICAgICAgc2VsZi5zZWxlY3RfY29tbWFuZCA9IHNlbGVjdF9jb21tYW5kCisgICAgICAgICAgICBzZWxmLnRhYl9zZXQgPSB0YWJfc2V0CisgICAgICAgICAgICBzZWxmLmlzX2xhc3RfaW5fcm93ID0gRmFsc2UKKworICAgICAgICAgICAgc2VsZi5idXR0b24gPSBSYWRpb2J1dHRvbigKKyAgICAgICAgICAgICAgICBzZWxmLCB0ZXh0PW5hbWUsIGNvbW1hbmQ9c2VsZi5fc2VsZWN0X2V2ZW50LAorICAgICAgICAgICAgICAgIHBhZHg9NSwgcGFkeT0xLCB0YWtlZm9jdXM9RkFMU0UsIGluZGljYXRvcm9uPUZBTFNFLAorICAgICAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcz0wLCBzZWxlY3Rjb2xvcj0nJywgYm9yZGVyd2lkdGg9MCkKKyAgICAgICAgICAgIHNlbGYuYnV0dG9uLnBhY2soc2lkZT1MRUZULCBmaWxsPVgsIGV4cGFuZD1UcnVlKQorCisgICAgICAgICAgICBzZWxmLl9pbml0X21hc2tzKCkKKyAgICAgICAgICAgIHNlbGYuc2V0X25vcm1hbCgpCisKKyAgICAgICAgZGVmIF9zZWxlY3RfZXZlbnQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgIiIiRXZlbnQgaGFuZGxlciBmb3IgdGFiIHNlbGVjdGlvbi4KKworICAgICAgICAgICAgV2l0aCBUYWJiZWRQYWdlU2V0LCB0aGlzIGNhbGxzIFRhYmJlZFBhZ2VTZXQuY2hhbmdlX3BhZ2UsIHNvIHRoYXQKKyAgICAgICAgICAgIHNlbGVjdGluZyBhIHRhYiBjaGFuZ2VzIHRoZSBwYWdlLgorCisgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBkb2VzIC1ub3QtIGNhbGwgc2V0X3NlbGVjdGVkIC0tIGl0IHdpbGwgYmUgY2FsbGVkIGJ5CisgICAgICAgICAgICBUYWJTZXQuc2V0X3NlbGVjdGVkX3RhYiwgd2hpY2ggc2hvdWxkIGJlIGNhbGxlZCB3aGVuIHdoYXRldmVyIHRoZQorICAgICAgICAgICAgdGFicyBhcmUgcmVsYXRlZCB0byBjaGFuZ2VzLgorCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0X2NvbW1hbmQoc2VsZi5uYW1lKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZGVmIHNldF9zZWxlY3RlZChzZWxmKToKKyAgICAgICAgICAgICIiIkFzc3VtZSBzZWxlY3RlZCBsb29rIiIiCisgICAgICAgICAgICBzZWxmLl9wbGFjZV9tYXNrcyhzZWxlY3RlZD1UcnVlKQorCisgICAgICAgIGRlZiBzZXRfbm9ybWFsKHNlbGYpOgorICAgICAgICAgICAgIiIiQXNzdW1lIG5vcm1hbCBsb29rIiIiCisgICAgICAgICAgICBzZWxmLl9wbGFjZV9tYXNrcyhzZWxlY3RlZD1GYWxzZSkKKworICAgICAgICBkZWYgX2luaXRfbWFza3Moc2VsZik6CisgICAgICAgICAgICBwYWdlX3NldCA9IHNlbGYudGFiX3NldC5wYWdlX3NldAorICAgICAgICAgICAgYmFja2dyb3VuZCA9IHBhZ2Vfc2V0LnBhZ2VzX2ZyYW1lLmNnZXQoJ2JhY2tncm91bmQnKQorICAgICAgICAgICAgIyBtYXNrIHJlcGxhY2VzIHRoZSBtaWRkbGUgb2YgdGhlIGJvcmRlciB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG9yCisgICAgICAgICAgICBzZWxmLm1hc2sgPSBGcmFtZShwYWdlX3NldCwgYm9yZGVyd2lkdGg9MCwgcmVsaWVmPUZMQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kPWJhY2tncm91bmQpCisgICAgICAgICAgICAjIG1za2wgcmVwbGFjZXMgdGhlIGJvdHRvbS1sZWZ0IGNvcm5lciBvZiB0aGUgYm9yZGVyIHdpdGggYSBub3JtYWwKKyAgICAgICAgICAgICMgbGVmdCBib3JkZXIKKyAgICAgICAgICAgIHNlbGYubXNrbCA9IEZyYW1lKHBhZ2Vfc2V0LCBib3JkZXJ3aWR0aD0wLCByZWxpZWY9RkxBVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ9YmFja2dyb3VuZCkKKyAgICAgICAgICAgIHNlbGYubXNrbC5tbCA9IEZyYW1lKHNlbGYubXNrbCwgYm9yZGVyd2lkdGg9c2VsZi5idywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGllZj1SQUlTRUQpCisgICAgICAgICAgICBzZWxmLm1za2wubWwucGxhY2UoeD0wLCB5PS1zZWxmLmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTIqc2VsZi5idywgaGVpZ2h0PXNlbGYuYncqNCkKKyAgICAgICAgICAgICMgbXNrciByZXBsYWNlcyB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lciBvZiB0aGUgYm9yZGVyIHdpdGggYSBub3JtYWwKKyAgICAgICAgICAgICMgcmlnaHQgYm9yZGVyCisgICAgICAgICAgICBzZWxmLm1za3IgPSBGcmFtZShwYWdlX3NldCwgYm9yZGVyd2lkdGg9MCwgcmVsaWVmPUZMQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kPWJhY2tncm91bmQpCisgICAgICAgICAgICBzZWxmLm1za3IubXIgPSBGcmFtZShzZWxmLm1za3IsIGJvcmRlcndpZHRoPXNlbGYuYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpZWY9UkFJU0VEKQorCisgICAgICAgIGRlZiBfcGxhY2VfbWFza3Moc2VsZiwgc2VsZWN0ZWQ9RmFsc2UpOgorICAgICAgICAgICAgaGVpZ2h0ID0gc2VsZi5idworICAgICAgICAgICAgaWYgc2VsZWN0ZWQ6CisgICAgICAgICAgICAgICAgaGVpZ2h0ICs9IHNlbGYuYncKKworICAgICAgICAgICAgc2VsZi5tYXNrLnBsYWNlKGluXz1zZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHg9MC4wLCB4PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVseT0xLjAsIHk9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWx3aWR0aD0xLjAsIHdpZHRoPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaGVpZ2h0PTAuMCwgaGVpZ2h0PWhlaWdodCkKKworICAgICAgICAgICAgc2VsZi5tc2tsLnBsYWNlKGluXz1zZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHg9MC4wLCB4PS1zZWxmLmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHk9MS4wLCB5PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsd2lkdGg9MC4wLCB3aWR0aD1zZWxmLmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGhlaWdodD0wLjAsIGhlaWdodD1oZWlnaHQpCisKKyAgICAgICAgICAgIHBhZ2Vfc2V0ID0gc2VsZi50YWJfc2V0LnBhZ2Vfc2V0CisgICAgICAgICAgICBpZiBzZWxlY3RlZCBhbmQgKChub3Qgc2VsZi5pc19sYXN0X2luX3Jvdykgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYud2luZm9fcm9vdHgoKSArIHNlbGYud2luZm9fd2lkdGgoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlX3NldC53aW5mb19yb290eCgpICsgcGFnZV9zZXQud2luZm9fd2lkdGgoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAjIGZvciBhIHNlbGVjdGVkIHRhYiwgaWYgaXRzIHJpZ2h0bW9zdCBlZGdlIGlzbid0IG9uIHRoZQorICAgICAgICAgICAgICAgICMgcmlnaHRtb3N0IGVkZ2Ugb2YgdGhlIHBhZ2Ugc2V0LCB0aGUgcmlnaHQgbWFzayBzaG91bGQgYmUgb25lCisgICAgICAgICAgICAgICAgIyBib3JkZXJ3aWR0aCBzaG9ydGVyICh2ZXJ0aWNhbGx5KQorICAgICAgICAgICAgICAgIGhlaWdodCAtPSBzZWxmLmJ3CisKKyAgICAgICAgICAgIHNlbGYubXNrci5wbGFjZShpbl89c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWx4PTEuMCwgeD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbHk9MS4wLCB5PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsd2lkdGg9MC4wLCB3aWR0aD1zZWxmLmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGhlaWdodD0wLjAsIGhlaWdodD1oZWlnaHQpCisKKyAgICAgICAgICAgIHNlbGYubXNrci5tci5wbGFjZSh4PS1zZWxmLmJ3LCB5PS1zZWxmLmJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPTIqc2VsZi5idywgaGVpZ2h0PWhlaWdodCArIHNlbGYuYncqMikKKworICAgICAgICAgICAgIyBmaW5hbGx5LCBsb3dlciB0aGUgdGFiIHNldCBzbyB0aGF0IGFsbCBvZiB0aGUgZnJhbWVzIHdlIGp1c3QKKyAgICAgICAgICAgICMgcGxhY2VkIGhpZGUgaXQKKyAgICAgICAgICAgIHNlbGYudGFiX3NldC5sb3dlcigpCisKK2NsYXNzIFRhYmJlZFBhZ2VTZXQoRnJhbWUpOgorICAgICIiIkEgVGtpbnRlciB0YWJiZWQtcGFuZSB3aWRnZXQuCisKKyAgICBDb25zdGFpbnMgc2V0IG9mICdwYWdlcycgKG9yICdwYW5lcycpIHdpdGggdGFicyBhYm92ZSBmb3Igc2VsZWN0aW5nIHdoaWNoCisgICAgcGFnZSBpcyBkaXNwbGF5ZWQuIE9ubHkgb25lIHBhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQgYXQgYSB0aW1lLgorCisgICAgUGFnZXMgbWF5IGJlIGFjY2Vzc2VkIHRocm91Z2ggdGhlICdwYWdlcycgYXR0cmlidXRlLCB3aGljaCBpcyBhIGRpY3Rpb25hcnkKKyAgICBvZiBwYWdlcywgdXNpbmcgdGhlIG5hbWUgZ2l2ZW4gYXMgdGhlIGtleS4gQSBwYWdlIGlzIGFuIGluc3RhbmNlIG9mIGEKKyAgICBzdWJjbGFzcyBvZiBUaydzIEZyYW1lIHdpZGdldC4KKworICAgIFRoZSBwYWdlIHdpZGdldHMgd2lsbCBiZSBjcmVhdGVkIChhbmQgZGVzdHJveWVkIHdoZW4gcmVxdWlyZWQpIGJ5IHRoZQorICAgIFRhYmJlZFBhZ2VTZXQuIERvIG5vdCBjYWxsIHRoZSBwYWdlJ3MgcGFjay9wbGFjZS9ncmlkL2Rlc3Ryb3kgbWV0aG9kcy4KKworICAgIFBhZ2VzIG1heSBiZSBhZGRlZCBvciByZW1vdmVkIGF0IGFueSB0aW1lIHVzaW5nIHRoZSBhZGRfcGFnZSgpIGFuZAorICAgIHJlbW92ZV9wYWdlKCkgbWV0aG9kcy4KKworICAgICIiIgorICAgIGNsYXNzIFBhZ2Uob2JqZWN0KToKKyAgICAgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgVGFiYmVkUGFnZVNldCdzIHBhZ2VzLgorCisgICAgICAgIFN1YmNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGUgX3Nob3coKSBhbmQgX2hpZGUoKSBtZXRob2RzLgorCisgICAgICAgICIiIgorICAgICAgICB1c2VzX2dyaWQgPSBGYWxzZQorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYWdlX3NldCk6CisgICAgICAgICAgICBzZWxmLmZyYW1lID0gRnJhbWUocGFnZV9zZXQsIGJvcmRlcndpZHRoPTIsIHJlbGllZj1SQUlTRUQpCisKKyAgICAgICAgZGVmIF9zaG93KHNlbGYpOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgICAgIGRlZiBfaGlkZShzZWxmKToKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGNsYXNzIFBhZ2VSZW1vdmUoUGFnZSk6CisgICAgICAgICIiIlBhZ2UgY2xhc3MgdXNpbmcgdGhlIGdyaWQgcGxhY2VtZW50IG1hbmFnZXIncyAicmVtb3ZlIiBtZWNoYW5pc20uIiIiCisgICAgICAgIHVzZXNfZ3JpZCA9IFRydWUKKworICAgICAgICBkZWYgX3Nob3coc2VsZik6CisgICAgICAgICAgICBzZWxmLmZyYW1lLmdyaWQocm93PTAsIGNvbHVtbj0wLCBzdGlja3k9TlNFVykKKworICAgICAgICBkZWYgX2hpZGUoc2VsZik6CisgICAgICAgICAgICBzZWxmLmZyYW1lLmdyaWRfcmVtb3ZlKCkKKworICAgIGNsYXNzIFBhZ2VMaWZ0KFBhZ2UpOgorICAgICAgICAiIiJQYWdlIGNsYXNzIHVzaW5nIHRoZSBncmlkIHBsYWNlbWVudCBtYW5hZ2VyJ3MgImxpZnQiIG1lY2hhbmlzbS4iIiIKKyAgICAgICAgdXNlc19ncmlkID0gVHJ1ZQorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYWdlX3NldCk6CisgICAgICAgICAgICBzdXBlcihUYWJiZWRQYWdlU2V0LlBhZ2VMaWZ0LCBzZWxmKS5fX2luaXRfXyhwYWdlX3NldCkKKyAgICAgICAgICAgIHNlbGYuZnJhbWUuZ3JpZChyb3c9MCwgY29sdW1uPTAsIHN0aWNreT1OU0VXKQorICAgICAgICAgICAgc2VsZi5mcmFtZS5sb3dlcigpCisKKyAgICAgICAgZGVmIF9zaG93KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5mcmFtZS5saWZ0KCkKKworICAgICAgICBkZWYgX2hpZGUoc2VsZik6CisgICAgICAgICAgICBzZWxmLmZyYW1lLmxvd2VyKCkKKworICAgIGNsYXNzIFBhZ2VQYWNrRm9yZ2V0KFBhZ2UpOgorICAgICAgICAiIiJQYWdlIGNsYXNzIHVzaW5nIHRoZSBwYWNrIHBsYWNlbWVudCBtYW5hZ2VyJ3MgImZvcmdldCIgbWVjaGFuaXNtLiIiIgorICAgICAgICBkZWYgX3Nob3coc2VsZik6CisgICAgICAgICAgICBzZWxmLmZyYW1lLnBhY2soZmlsbD1CT1RILCBleHBhbmQ9VHJ1ZSkKKworICAgICAgICBkZWYgX2hpZGUoc2VsZik6CisgICAgICAgICAgICBzZWxmLmZyYW1lLnBhY2tfZm9yZ2V0KCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQsIHBhZ2VfbmFtZXM9Tm9uZSwgcGFnZV9jbGFzcz1QYWdlTGlmdCwKKyAgICAgICAgICAgICAgICAgbl9yb3dzPTEsIG1heF90YWJzX3Blcl9yb3c9NSwgZXhwYW5kX3RhYnM9RmFsc2UsCisgICAgICAgICAgICAgICAgICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3RvciBhcmd1bWVudHM6CisKKyAgICAgICAgcGFnZV9uYW1lcyAtLSBBIGxpc3Qgb2Ygc3RyaW5ncywgZWFjaCB3aWxsIGJlIHRoZSBkaWN0aW9uYXJ5IGtleSB0byBhCisgICAgICAgIHBhZ2UncyB3aWRnZXQsIGFuZCB0aGUgbmFtZSBkaXNwbGF5ZWQgb24gdGhlIHBhZ2UncyB0YWIuIFNob3VsZCBiZQorICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIGRlc2lyZWQgcGFnZSBvcmRlci4gVGhlIGZpcnN0IHBhZ2Ugd2lsbCBiZSB0aGUgZGVmYXVsdAorICAgICAgICBhbmQgZmlyc3QgYWN0aXZlIHBhZ2UuIElmIHBhZ2VfbmFtZXMgaXMgTm9uZSBvciBlbXB0eSwgdGhlCisgICAgICAgIFRhYmJlZFBhZ2VTZXQgd2lsbCBiZSBpbml0aWFsaXplZCBlbXB0eS4KKworICAgICAgICBuX3Jvd3MsIG1heF90YWJzX3Blcl9yb3cgLS0gUGFyYW1ldGVycyBmb3IgdGhlIFRhYlNldCB3aGljaCB3aWxsCisgICAgICAgIG1hbmFnZSB0aGUgdGFicy4gU2VlIFRhYlNldCdzIGRvY3MgZm9yIGRldGFpbHMuCisKKyAgICAgICAgcGFnZV9jbGFzcyAtLSBQYWdlcyBjYW4gYmUgc2hvd24vaGlkZGVuIHVzaW5nIHRocmVlIG1lY2hhbmlzbXM6CisKKyAgICAgICAgKiBQYWdlTGlmdCAtIEFsbCBwYWdlcyB3aWxsIGJlIHJlbmRlcmVkIG9uZSBvbiB0b3Agb2YgdGhlIG90aGVyLiBXaGVuCisgICAgICAgICAgYSBwYWdlIGlzIHNlbGVjdGVkLCBpdCB3aWxsIGJlIGJyb3VnaHQgdG8gdGhlIHRvcCwgdGh1cyBoaWRpbmcgYWxsCisgICAgICAgICAgb3RoZXIgcGFnZXMuIFVzaW5nIHRoaXMgbWV0aG9kLCB0aGUgVGFiYmVkUGFnZVNldCB3aWxsIG5vdCBiZSByZXNpemVkCisgICAgICAgICAgd2hlbiBwYWdlcyBhcmUgc3dpdGNoZWQuIChJdCBtYXkgc3RpbGwgYmUgcmVzaXplZCB3aGVuIHBhZ2VzIGFyZQorICAgICAgICAgIGFkZGVkL3JlbW92ZWQuKQorCisgICAgICAgICogUGFnZVJlbW92ZSAtIFdoZW4gYSBwYWdlIGlzIHNlbGVjdGVkLCB0aGUgY3VycmVudGx5IHNob3dpbmcgcGFnZSBpcworICAgICAgICAgIGhpZGRlbiwgYW5kIHRoZSBuZXcgcGFnZSBzaG93biBpbiBpdHMgcGxhY2UuIFVzaW5nIHRoaXMgbWV0aG9kLCB0aGUKKyAgICAgICAgICBUYWJiZWRQYWdlU2V0IG1heSByZXNpemUgd2hlbiBwYWdlcyBhcmUgY2hhbmdlZC4KKworICAgICAgICAqIFBhZ2VQYWNrRm9yZ2V0IC0gVGhpcyBtZWNoYW5pc20gdXNlcyB0aGUgcGFjayBwbGFjZW1lbnQgbWFuYWdlci4KKyAgICAgICAgICBXaGVuIGEgcGFnZSBpcyBzaG93biBpdCBpcyBwYWNrZWQsIGFuZCB3aGVuIGl0IGlzIGhpZGRlbiBpdCBpcworICAgICAgICAgIHVucGFja2VkIChpLmUuIHBhY2tfZm9yZ2V0KS4gVGhpcyBtZWNoYW5pc20gbWF5IGFsc28gY2F1c2UgdGhlCisgICAgICAgICAgVGFiYmVkUGFnZVNldCB0byByZXNpemUgd2hlbiB0aGUgcGFnZSBpcyBjaGFuZ2VkLgorCisgICAgICAgICIiIgorICAgICAgICBGcmFtZS5fX2luaXRfXyhzZWxmLCBwYXJlbnQsICoqa3cpCisKKyAgICAgICAgc2VsZi5wYWdlX2NsYXNzID0gcGFnZV9jbGFzcworICAgICAgICBzZWxmLnBhZ2VzID0ge30KKyAgICAgICAgc2VsZi5fcGFnZXNfb3JkZXIgPSBbXQorICAgICAgICBzZWxmLl9jdXJyZW50X3BhZ2UgPSBOb25lCisgICAgICAgIHNlbGYuX2RlZmF1bHRfcGFnZSA9IE5vbmUKKworICAgICAgICBzZWxmLmNvbHVtbmNvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKyAgICAgICAgc2VsZi5yb3djb25maWd1cmUoMSwgd2VpZ2h0PTEpCisKKyAgICAgICAgc2VsZi5wYWdlc19mcmFtZSA9IEZyYW1lKHNlbGYpCisgICAgICAgIHNlbGYucGFnZXNfZnJhbWUuZ3JpZChyb3c9MSwgY29sdW1uPTAsIHN0aWNreT1OU0VXKQorICAgICAgICBpZiBzZWxmLnBhZ2VfY2xhc3MudXNlc19ncmlkOgorICAgICAgICAgICAgc2VsZi5wYWdlc19mcmFtZS5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEpCisgICAgICAgICAgICBzZWxmLnBhZ2VzX2ZyYW1lLnJvd2NvbmZpZ3VyZSgwLCB3ZWlnaHQ9MSkKKworICAgICAgICAjIHRoZSBvcmRlciBvZiB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGlzIGltcG9ydGFudAorICAgICAgICBzZWxmLl90YWJfc2V0ID0gVGFiU2V0KHNlbGYsIHNlbGYuY2hhbmdlX3BhZ2UsIG5fcm93cz1uX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RhYnNfcGVyX3Jvdz1tYXhfdGFic19wZXJfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZF90YWJzPWV4cGFuZF90YWJzKQorICAgICAgICBpZiBwYWdlX25hbWVzOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gcGFnZV9uYW1lczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9wYWdlKG5hbWUpCisgICAgICAgIHNlbGYuX3RhYl9zZXQuZ3JpZChyb3c9MCwgY29sdW1uPTAsIHN0aWNreT1OU0VXKQorCisgICAgICAgIHNlbGYuY2hhbmdlX3BhZ2Uoc2VsZi5fZGVmYXVsdF9wYWdlKQorCisgICAgZGVmIGFkZF9wYWdlKHNlbGYsIHBhZ2VfbmFtZSk6CisgICAgICAgICIiIkFkZCBhIG5ldyBwYWdlIHdpdGggdGhlIG5hbWUgZ2l2ZW4gaW4gcGFnZV9uYW1lLiIiIgorICAgICAgICBpZiBub3QgcGFnZV9uYW1lOgorICAgICAgICAgICAgcmFpc2UgSW52YWxpZE5hbWVFcnJvcigiSW52YWxpZCBUYWJQYWdlIG5hbWU6ICclcyciICUgcGFnZV9uYW1lKQorICAgICAgICBpZiBwYWdlX25hbWUgaW4gc2VsZi5wYWdlczoKKyAgICAgICAgICAgIHJhaXNlIEFscmVhZHlFeGlzdHNFcnJvcigKKyAgICAgICAgICAgICAgICAiVGFiUGFnZSBuYW1lZCAnJXMnIGFscmVhZHkgZXhpc3RzIiAlIHBhZ2VfbmFtZSkKKworICAgICAgICBzZWxmLnBhZ2VzW3BhZ2VfbmFtZV0gPSBzZWxmLnBhZ2VfY2xhc3Moc2VsZi5wYWdlc19mcmFtZSkKKyAgICAgICAgc2VsZi5fcGFnZXNfb3JkZXIuYXBwZW5kKHBhZ2VfbmFtZSkKKyAgICAgICAgc2VsZi5fdGFiX3NldC5hZGRfdGFiKHBhZ2VfbmFtZSkKKworICAgICAgICBpZiBsZW4oc2VsZi5wYWdlcykgPT0gMTogIyBhZGRpbmcgZmlyc3QgcGFnZQorICAgICAgICAgICAgc2VsZi5fZGVmYXVsdF9wYWdlID0gcGFnZV9uYW1lCisgICAgICAgICAgICBzZWxmLmNoYW5nZV9wYWdlKHBhZ2VfbmFtZSkKKworICAgIGRlZiByZW1vdmVfcGFnZShzZWxmLCBwYWdlX25hbWUpOgorICAgICAgICAiIiJEZXN0cm95IHRoZSBwYWdlIHdob3NlIG5hbWUgaXMgZ2l2ZW4gaW4gcGFnZV9uYW1lLiIiIgorICAgICAgICBpZiBub3QgcGFnZV9uYW1lIGluIHNlbGYucGFnZXM6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gc3VjaCBUYWJQYWdlOiAnJXMiICUgcGFnZV9uYW1lKQorCisgICAgICAgIHNlbGYuX3BhZ2VzX29yZGVyLnJlbW92ZShwYWdlX25hbWUpCisKKyAgICAgICAgIyBoYW5kbGUgcmVtb3ZpbmcgbGFzdCByZW1haW5pbmcsIGRlZmF1bHQsIG9yIGN1cnJlbnRseSBzaG93biBwYWdlCisgICAgICAgIGlmIGxlbihzZWxmLl9wYWdlc19vcmRlcikgPiAwOgorICAgICAgICAgICAgaWYgcGFnZV9uYW1lID09IHNlbGYuX2RlZmF1bHRfcGFnZToKKyAgICAgICAgICAgICAgICAjIHNldCBhIG5ldyBkZWZhdWx0IHBhZ2UKKyAgICAgICAgICAgICAgICBzZWxmLl9kZWZhdWx0X3BhZ2UgPSBzZWxmLl9wYWdlc19vcmRlclswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZGVmYXVsdF9wYWdlID0gTm9uZQorCisgICAgICAgIGlmIHBhZ2VfbmFtZSA9PSBzZWxmLl9jdXJyZW50X3BhZ2U6CisgICAgICAgICAgICBzZWxmLmNoYW5nZV9wYWdlKHNlbGYuX2RlZmF1bHRfcGFnZSkKKworICAgICAgICBzZWxmLl90YWJfc2V0LnJlbW92ZV90YWIocGFnZV9uYW1lKQorICAgICAgICBwYWdlID0gc2VsZi5wYWdlcy5wb3AocGFnZV9uYW1lKQorICAgICAgICBwYWdlLmZyYW1lLmRlc3Ryb3koKQorCisgICAgZGVmIGNoYW5nZV9wYWdlKHNlbGYsIHBhZ2VfbmFtZSk6CisgICAgICAgICIiIlNob3cgdGhlIHBhZ2Ugd2hvc2UgbmFtZSBpcyBnaXZlbiBpbiBwYWdlX25hbWUuIiIiCisgICAgICAgIGlmIHNlbGYuX2N1cnJlbnRfcGFnZSA9PSBwYWdlX25hbWU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgcGFnZV9uYW1lIGlzIG5vdCBOb25lIGFuZCBwYWdlX25hbWUgbm90IGluIHNlbGYucGFnZXM6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gc3VjaCBUYWJQYWdlOiAnJXMnIiAlIHBhZ2VfbmFtZSkKKworICAgICAgICBpZiBzZWxmLl9jdXJyZW50X3BhZ2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhZ2VzW3NlbGYuX2N1cnJlbnRfcGFnZV0uX2hpZGUoKQorICAgICAgICBzZWxmLl9jdXJyZW50X3BhZ2UgPSBOb25lCisKKyAgICAgICAgaWYgcGFnZV9uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fY3VycmVudF9wYWdlID0gcGFnZV9uYW1lCisgICAgICAgICAgICBzZWxmLnBhZ2VzW3BhZ2VfbmFtZV0uX3Nob3coKQorCisgICAgICAgIHNlbGYuX3RhYl9zZXQuc2V0X3NlbGVjdGVkX3RhYihwYWdlX25hbWUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyB0ZXN0IGRpYWxvZworICAgIHJvb3Q9VGsoKQorICAgIHRhYlBhZ2U9VGFiYmVkUGFnZVNldChyb290LCBwYWdlX25hbWVzPVsnRm9vYmFyJywnQmF6J10sIG5fcm93cz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRfdGFicz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgIHRhYlBhZ2UucGFjayhzaWRlPVRPUCwgZXhwYW5kPVRSVUUsIGZpbGw9Qk9USCkKKyAgICBMYWJlbCh0YWJQYWdlLnBhZ2VzWydGb29iYXInXS5mcmFtZSwgdGV4dD0nRm9vJywgcGFkeT0yMCkucGFjaygpCisgICAgTGFiZWwodGFiUGFnZS5wYWdlc1snRm9vYmFyJ10uZnJhbWUsIHRleHQ9J0JhcicsIHBhZHk9MjApLnBhY2soKQorICAgIExhYmVsKHRhYlBhZ2UucGFnZXNbJ0JheiddLmZyYW1lLCB0ZXh0PSdCYXonKS5wYWNrKCkKKyAgICBlbnRyeVBnTmFtZT1FbnRyeShyb290KQorICAgIGJ1dHRvbkFkZD1CdXR0b24ocm9vdCwgdGV4dD0nQWRkIFBhZ2UnLAorICAgICAgICAgICAgY29tbWFuZD1sYW1iZGE6dGFiUGFnZS5hZGRfcGFnZShlbnRyeVBnTmFtZS5nZXQoKSkpCisgICAgYnV0dG9uUmVtb3ZlPUJ1dHRvbihyb290LCB0ZXh0PSdSZW1vdmUgUGFnZScsCisgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTp0YWJQYWdlLnJlbW92ZV9wYWdlKGVudHJ5UGdOYW1lLmdldCgpKSkKKyAgICBsYWJlbFBnTmFtZT1MYWJlbChyb290LCB0ZXh0PSduYW1lIG9mIHBhZ2UgdG8gYWRkL3JlbW92ZTonKQorICAgIGJ1dHRvbkFkZC5wYWNrKHBhZHg9NSwgcGFkeT01KQorICAgIGJ1dHRvblJlbW92ZS5wYWNrKHBhZHg9NSwgcGFkeT01KQorICAgIGxhYmVsUGdOYW1lLnBhY2socGFkeD01KQorICAgIGVudHJ5UGdOYW1lLnBhY2socGFkeD01KQorICAgIHJvb3QubWFpbmxvb3AoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90YWJiZWRwYWdlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzNjNlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90YWJiZWRwYWdlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RhYmJlZHBhZ2VzLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90YWJiZWRwYWdlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzNjNlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90YWJiZWRwYWdlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3Rlc3Rjb2RlLnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3Rlc3Rjb2RlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZWFhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGVzdGNvZGUucHkKQEAgLTAsMCArMSwzMSBAQAoraW1wb3J0IHN0cmluZworCitkZWYgZigpOgorICAgIGEgPSAwCisgICAgYiA9IDEKKyAgICBjID0gMgorICAgIGQgPSAzCisgICAgZSA9IDQKKyAgICBnKCkKKworZGVmIGcoKToKKyAgICBoKCkKKworZGVmIGgoKToKKyAgICBpKCkKKworZGVmIGkoKToKKyAgICBqKCkKKworZGVmIGooKToKKyAgICBrKCkKKworZGVmIGsoKToKKyAgICBsKCkKKworbCA9IGxhbWJkYTogdGVzdCgpCisKK2RlZiB0ZXN0KCk6CisgICAgc3RyaW5nLmNhcHdvcmRzKDEpCisKK2YoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3Rlc3Rjb2RlLnB5YyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3Rlc3Rjb2RlLnB5byBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaWRsZWxpYi90ZXN0Y29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5IGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MzdjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGV4dFZpZXcucHkKQEAgLTAsMCArMSw5OSBAQAorIiIiU2ltcGxlIHRleHQgYnJvd3NlciBmb3IgSURMRQorCisiIiIKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCitpbXBvcnQgdGtNZXNzYWdlQm94CisKK2NsYXNzIFRleHRWaWV3ZXIoVG9wbGV2ZWwpOgorICAgICIiIkEgc2ltcGxlIHRleHQgdmlld2VyIGRpYWxvZyBmb3IgSURMRQorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCwgdGl0bGUsIHRleHQsIG1vZGFsPVRydWUpOgorICAgICAgICAiIiJTaG93IHRoZSBnaXZlbiB0ZXh0IGluIGEgc2Nyb2xsYWJsZSB3aW5kb3cgd2l0aCBhICdjbG9zZScgYnV0dG9uCisKKyAgICAgICAgIiIiCisgICAgICAgIFRvcGxldmVsLl9faW5pdF9fKHNlbGYsIHBhcmVudCkKKyAgICAgICAgc2VsZi5jb25maWd1cmUoYm9yZGVyd2lkdGg9NSkKKyAgICAgICAgc2VsZi5nZW9tZXRyeSgiPSVkeCVkKyVkKyVkIiAlICg2MjUsIDUwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQud2luZm9fcm9vdHgoKSArIDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpICsgMTApKQorICAgICAgICAjZWxndWF2YXMgLSBjb25maWcgcGxhY2Vob2xkZXJzIHRpbCBjb25maWcgc3R1ZmYgY29tcGxldGVkCisgICAgICAgIHNlbGYuYmcgPSAnI2ZmZmZmZicKKyAgICAgICAgc2VsZi5mZyA9ICcjMDAwMDAwJworCisgICAgICAgIHNlbGYuQ3JlYXRlV2lkZ2V0cygpCisgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLk9rKQorICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorICAgICAgICBzZWxmLnRleHRWaWV3LmZvY3VzX3NldCgpCisgICAgICAgICNrZXkgYmluZGluZ3MgZm9yIHRoaXMgZGlhbG9nCisgICAgICAgIHNlbGYuYmluZCgnPFJldHVybj4nLHNlbGYuT2spICNkaXNtaXNzIGRpYWxvZworICAgICAgICBzZWxmLmJpbmQoJzxFc2NhcGU+JyxzZWxmLk9rKSAjZGlzbWlzcyBkaWFsb2cKKyAgICAgICAgc2VsZi50ZXh0Vmlldy5pbnNlcnQoMC4wLCB0ZXh0KQorICAgICAgICBzZWxmLnRleHRWaWV3LmNvbmZpZyhzdGF0ZT1ESVNBQkxFRCkKKworICAgICAgICBpZiBtb2RhbDoKKyAgICAgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKyAgICAgICAgICAgIHNlbGYuZ3JhYl9zZXQoKQorICAgICAgICAgICAgc2VsZi53YWl0X3dpbmRvdygpCisKKyAgICBkZWYgQ3JlYXRlV2lkZ2V0cyhzZWxmKToKKyAgICAgICAgZnJhbWVUZXh0ID0gRnJhbWUoc2VsZiwgcmVsaWVmPVNVTktFTiwgaGVpZ2h0PTcwMCkKKyAgICAgICAgZnJhbWVCdXR0b25zID0gRnJhbWUoc2VsZikKKyAgICAgICAgc2VsZi5idXR0b25PayA9IEJ1dHRvbihmcmFtZUJ1dHRvbnMsIHRleHQ9J0Nsb3NlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuT2ssIHRha2Vmb2N1cz1GQUxTRSkKKyAgICAgICAgc2VsZi5zY3JvbGxiYXJWaWV3ID0gU2Nyb2xsYmFyKGZyYW1lVGV4dCwgb3JpZW50PVZFUlRJQ0FMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZWZvY3VzPUZBTFNFLCBoaWdobGlnaHR0aGlja25lc3M9MCkKKyAgICAgICAgc2VsZi50ZXh0VmlldyA9IFRleHQoZnJhbWVUZXh0LCB3cmFwPVdPUkQsIGhpZ2hsaWdodHRoaWNrbmVzcz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZz1zZWxmLmZnLCBiZz1zZWxmLmJnKQorICAgICAgICBzZWxmLnNjcm9sbGJhclZpZXcuY29uZmlnKGNvbW1hbmQ9c2VsZi50ZXh0Vmlldy55dmlldykKKyAgICAgICAgc2VsZi50ZXh0Vmlldy5jb25maWcoeXNjcm9sbGNvbW1hbmQ9c2VsZi5zY3JvbGxiYXJWaWV3LnNldCkKKyAgICAgICAgc2VsZi5idXR0b25Pay5wYWNrKCkKKyAgICAgICAgc2VsZi5zY3JvbGxiYXJWaWV3LnBhY2soc2lkZT1SSUdIVCxmaWxsPVkpCisgICAgICAgIHNlbGYudGV4dFZpZXcucGFjayhzaWRlPUxFRlQsZXhwYW5kPVRSVUUsZmlsbD1CT1RIKQorICAgICAgICBmcmFtZUJ1dHRvbnMucGFjayhzaWRlPUJPVFRPTSxmaWxsPVgpCisgICAgICAgIGZyYW1lVGV4dC5wYWNrKHNpZGU9VE9QLGV4cGFuZD1UUlVFLGZpbGw9Qk9USCkKKworICAgIGRlZiBPayhzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgc2VsZi5kZXN0cm95KCkKKworCitkZWYgdmlld190ZXh0KHBhcmVudCwgdGl0bGUsIHRleHQsIG1vZGFsPVRydWUpOgorICAgIHJldHVybiBUZXh0Vmlld2VyKHBhcmVudCwgdGl0bGUsIHRleHQsIG1vZGFsKQorCitkZWYgdmlld19maWxlKHBhcmVudCwgdGl0bGUsIGZpbGVuYW1lLCBlbmNvZGluZz1Ob25lLCBtb2RhbD1UcnVlKToKKyAgICB0cnk6CisgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgaW1wb3J0IGNvZGVjcworICAgICAgICAgICAgdGV4dEZpbGUgPSBjb2RlY3Mub3BlbihmaWxlbmFtZSwgJ3InKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dEZpbGUgPSBvcGVuKGZpbGVuYW1lLCAncicpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIGltcG9ydCB0a01lc3NhZ2VCb3gKKyAgICAgICAgdGtNZXNzYWdlQm94LnNob3dlcnJvcih0aXRsZT0nRmlsZSBMb2FkIEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlPSdVbmFibGUgdG8gbG9hZCBmaWxlICVyIC4nICUgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXBhcmVudCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gdmlld190ZXh0KHBhcmVudCwgdGl0bGUsIHRleHRGaWxlLnJlYWQoKSwgbW9kYWwpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAjdGVzdCB0aGUgZGlhbG9nCisgICAgcm9vdD1UaygpCisgICAgcm9vdC50aXRsZSgndGV4dFZpZXcgdGVzdCcpCisgICAgZmlsZW5hbWUgPSAnLi90ZXh0Vmlldy5weScKKyAgICB0ZXh0ID0gZmlsZShmaWxlbmFtZSwgJ3InKS5yZWFkKCkKKyAgICBidG4xID0gQnV0dG9uKHJvb3QsIHRleHQ9J3ZpZXdfdGV4dCcsCisgICAgICAgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTp2aWV3X3RleHQocm9vdCwgJ3ZpZXdfdGV4dCcsIHRleHQpKQorICAgIGJ0bjEucGFjayhzaWRlPUxFRlQpCisgICAgYnRuMiA9IEJ1dHRvbihyb290LCB0ZXh0PSd2aWV3X2ZpbGUnLAorICAgICAgICAgICAgICAgICAgY29tbWFuZD1sYW1iZGE6dmlld19maWxlKHJvb3QsICd2aWV3X2ZpbGUnLCBmaWxlbmFtZSkpCisgICAgYnRuMi5wYWNrKHNpZGU9TEVGVCkKKyAgICBidG4zID0gQnV0dG9uKHJvb3QsIHRleHQ9J25vbm1vZGFsIHZpZXdfdGV4dCcsCisgICAgICAgICAgICAgICAgICBjb21tYW5kPWxhbWJkYTp2aWV3X3RleHQocm9vdCwgJ25vbm1vZGFsIHZpZXdfdGV4dCcsIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWw9RmFsc2UpKQorICAgIGJ0bjMucGFjayhzaWRlPUxFRlQpCisgICAgY2xvc2UgPSBCdXR0b24ocm9vdCwgdGV4dD0nQ2xvc2UnLCBjb21tYW5kPXJvb3QuZGVzdHJveSkKKyAgICBjbG9zZS5wYWNrKHNpZGU9UklHSFQpCisgICAgcm9vdC5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGV4dFZpZXcucHljIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDBiYzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lkbGVsaWIvdGV4dFZpZXcucHlvIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDBiYzVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pZGxlbGliL3RleHRWaWV3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lob29rcy5weSBiL2xpYi9weXRob24yLjcvaWhvb2tzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NjFkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2lob29rcy5weQpAQCAtMCwwICsxLDU1NCBAQAorIiIiSW1wb3J0IGhvb2sgc3VwcG9ydC4KKworQ29uc2lzdGVudCB1c2Ugb2YgdGhpcyBtb2R1bGUgd2lsbCBtYWtlIGl0IHBvc3NpYmxlIHRvIGNoYW5nZSB0aGUKK2RpZmZlcmVudCBtZWNoYW5pc21zIGludm9sdmVkIGluIGxvYWRpbmcgbW9kdWxlcyBpbmRlcGVuZGVudGx5LgorCitXaGlsZSB0aGUgYnVpbHQtaW4gbW9kdWxlIGltcCBleHBvcnRzIGludGVyZmFjZXMgdG8gdGhlIGJ1aWx0LWluCittb2R1bGUgc2VhcmNoaW5nIGFuZCBsb2FkaW5nIGFsZ29yaXRobSwgYW5kIGl0IGlzIHBvc3NpYmxlIHRvIHJlcGxhY2UKK3RoZSBidWlsdC1pbiBmdW5jdGlvbiBfX2ltcG9ydF9fIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgc2VtYW50aWNzIG9mCit0aGUgaW1wb3J0IHN0YXRlbWVudCwgdW50aWwgbm93IGl0IGhhcyBiZWVuIGRpZmZpY3VsdCB0byBjb21iaW5lIHRoZQorZWZmZWN0IG9mIGRpZmZlcmVudCBfX2ltcG9ydF9fIGhhY2tzLCBsaWtlIGxvYWRpbmcgbW9kdWxlcyBmcm9tIFVSTHMKK2J5IHJpbXBvcnQucHksIG9yIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIGJ5IHJleGVjLnB5LgorCitUaGlzIG1vZHVsZSBkZWZpbmVzIHRocmVlIG5ldyBjb25jZXB0czoKKworMSkgQSAiZmlsZSBzeXN0ZW0gaG9va3MiIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBhIGZpbGVzeXN0ZW0uCisKK09uZSBob29rcyBjbGFzcyBpcyBkZWZpbmVkIChIb29rcyksIHdoaWNoIHVzZXMgdGhlIGludGVyZmFjZSBwcm92aWRlZAorYnkgc3RhbmRhcmQgbW9kdWxlcyBvcyBhbmQgb3MucGF0aC4gIEl0IHNob3VsZCBiZSB1c2VkIGFzIHRoZSBiYXNlCitjbGFzcyBmb3Igb3RoZXIgaG9va3MgY2xhc3Nlcy4KKworMikgQSAibW9kdWxlIGxvYWRlciIgY2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHNlYXJjaCBmb3IgYQorbW9kdWxlIGluIGEgc2VhcmNoIHBhdGggYW5kIHRvIGxvYWQgaXQuICBJdCBkZWZpbmVzIGEgbWV0aG9kIHdoaWNoCitzZWFyY2hlcyBmb3IgYSBtb2R1bGUgaW4gYSBzaW5nbGUgZGlyZWN0b3J5OyBieSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kCitvbmUgY2FuIHJlZGVmaW5lIHRoZSBkZXRhaWxzIG9mIHRoZSBzZWFyY2guICBJZiB0aGUgZGlyZWN0b3J5IGlzIE5vbmUsCitidWlsdC1pbiBhbmQgZnJvemVuIG1vZHVsZXMgYXJlIHNlYXJjaGVkIGluc3RlYWQuCisKK1R3byBtb2R1bGUgbG9hZGVyIGNsYXNzIGFyZSBkZWZpbmVkLCBib3RoIGltcGxlbWVudGluZyB0aGUgc2VhcmNoCitzdHJhdGVneSB1c2VkIGJ5IHRoZSBidWlsdC1pbiBfX2ltcG9ydF9fIGZ1bmN0aW9uOiBNb2R1bGVMb2FkZXIgdXNlcwordGhlIGltcCBtb2R1bGUncyBmaW5kX21vZHVsZSBpbnRlcmZhY2UsIHdoaWxlIEhvb2thYmxlTW9kdWxlTG9hZGVyCit1c2VzIGEgZmlsZSBzeXN0ZW0gaG9va3MgY2xhc3MgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgZmlsZSBzeXN0ZW0uICBCb3RoCit1c2UgdGhlIGltcCBtb2R1bGUncyBsb2FkXyogaW50ZXJmYWNlcyB0byBhY3R1YWxseSBsb2FkIHRoZSBtb2R1bGUuCisKKzMpIEEgIm1vZHVsZSBpbXBvcnRlciIgY2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGltcG9ydCBhCittb2R1bGUsIGFzIHdlbGwgYXMgaW50ZXJmYWNlcyB0byByZWxvYWQgYW5kIHVubG9hZCBhIG1vZHVsZS4gIEl0IGFsc28KK3Byb3ZpZGVzIGludGVyZmFjZXMgdG8gaW5zdGFsbCBhbmQgdW5pbnN0YWxsIGl0c2VsZiBpbnN0ZWFkIG9mIHRoZQorZGVmYXVsdCBfX2ltcG9ydF9fIGFuZCByZWxvYWQgKGFuZCB1bmxvYWQpIGZ1bmN0aW9ucy4KKworT25lIG1vZHVsZSBpbXBvcnRlciBjbGFzcyBpcyBkZWZpbmVkIChNb2R1bGVJbXBvcnRlciksIHdoaWNoIHVzZXMgYQorbW9kdWxlIGxvYWRlciBpbnN0YW5jZSBwYXNzZWQgaW4gKGJ5IGRlZmF1bHQgSG9va2FibGVNb2R1bGVMb2FkZXIgaXMKK2luc3RhbnRpYXRlZCkuCisKK1RoZSBjbGFzc2VzIGRlZmluZWQgaGVyZSBzaG91bGQgYmUgdXNlZCBhcyBiYXNlIGNsYXNzZXMgZm9yIGV4dGVuZGVkCitmdW5jdGlvbmFsaXR5IGFsb25nIHRob3NlIGxpbmVzLgorCitJZiBhIG1vZHVsZSBpbXBvcnRlciBjbGFzcyBzdXBwb3J0cyBkb3R0ZWQgbmFtZXMsIGl0cyBpbXBvcnRfbW9kdWxlKCkKK211c3QgcmV0dXJuIGEgZGlmZmVyZW50IHZhbHVlIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IGlzIGNhbGxlZCBvbgorYmVoYWxmIG9mIGEgImZyb20gLi4uIGltcG9ydCAuLi4iIHN0YXRlbWVudCBvciBub3QuICAoVGhpcyBpcyBjYXVzZWQKK2J5IHRoZSB3YXkgdGhlIF9faW1wb3J0X18gaG9vayBpcyB1c2VkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuKSAgSXQKK3dvdWxkIGFsc28gZG8gd2lzZSB0byBpbnN0YWxsIGEgZGlmZmVyZW50IHZlcnNpb24gb2YgcmVsb2FkKCkuCisKKyIiIgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2ssIHdhcm4KK3dhcm5weTNrKCJ0aGUgaWhvb2tzIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworaW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgaW1wCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX19hbGxfXyA9IFsiQmFzaWNNb2R1bGVMb2FkZXIiLCJIb29rcyIsIk1vZHVsZUxvYWRlciIsIkZhbmN5TW9kdWxlTG9hZGVyIiwKKyAgICAgICAgICAgIkJhc2ljTW9kdWxlSW1wb3J0ZXIiLCJNb2R1bGVJbXBvcnRlciIsImluc3RhbGwiLCJ1bmluc3RhbGwiXQorCitWRVJCT1NFID0gMAorCisKK2Zyb20gaW1wIGltcG9ydCBDX0VYVEVOU0lPTiwgUFlfU09VUkNFLCBQWV9DT01QSUxFRAorZnJvbSBpbXAgaW1wb3J0IENfQlVJTFRJTiwgUFlfRlJPWkVOLCBQS0dfRElSRUNUT1JZCitCVUlMVElOX01PRFVMRSA9IENfQlVJTFRJTgorRlJPWkVOX01PRFVMRSA9IFBZX0ZST1pFTgorCisKK2NsYXNzIF9WZXJib3NlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2UgPSBWRVJCT1NFKToKKyAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorCisgICAgZGVmIGdldF92ZXJib3NlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52ZXJib3NlCisKKyAgICBkZWYgc2V0X3ZlcmJvc2Uoc2VsZiwgdmVyYm9zZSk6CisgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKworICAgICMgWFhYIFRoZSBmb2xsb3dpbmcgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZQorCisgICAgZGVmIG5vdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBzZWxmLm1lc3NhZ2UoKmFyZ3MpCisKKyAgICBkZWYgbWVzc2FnZShzZWxmLCBmb3JtYXQsICphcmdzKToKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIHByaW50IGZvcm1hdCVhcmdzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBmb3JtYXQKKworCitjbGFzcyBCYXNpY01vZHVsZUxvYWRlcihfVmVyYm9zZSk6CisKKyAgICAiIiJCYXNpYyBtb2R1bGUgbG9hZGVyLgorCisgICAgVGhpcyBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGJ1aWx0LWluIGltcG9ydC4gIEl0CisgICAgZG9lc24ndCBkZWFsIHdpdGggY2hlY2tpbmcgc3lzLm1vZHVsZXMgLS0gYWxsIGl0IHByb3ZpZGVzIGlzCisgICAgZmluZF9tb2R1bGUoKSBhbmQgYSBsb2FkX21vZHVsZSgpLCBhcyB3ZWxsIGFzIGZpbmRfbW9kdWxlX2luX2RpcigpCisgICAgd2hpY2ggc2VhcmNoZXMganVzdCBvbmUgZGlyZWN0b3J5LCBhbmQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgYQorICAgIGRlcml2ZWQgY2xhc3MgdG8gY2hhbmdlIHRoZSBtb2R1bGUgc2VhcmNoIGFsZ29yaXRobSB3aGVuIHRoZSBiYXNpYworICAgIGRlcGVuZGVuY3kgb24gc3lzLnBhdGggaXMgdW5jaGFuZ2VkLgorCisgICAgVGhlIGludGVyZmFjZSBpcyBhIGxpdHRsZSBtb3JlIGNvbnZlbmllbnQgdGhhbiBpbXAnczoKKyAgICBmaW5kX21vZHVsZShuYW1lLCBbcGF0aF0pIHJldHVybnMgTm9uZSBvciAnc3R1ZmYnLCBhbmQKKyAgICBsb2FkX21vZHVsZShuYW1lLCBzdHVmZikgbG9hZHMgdGhlIG1vZHVsZS4KKworICAgICIiIgorCisgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIG5hbWUsIHBhdGggPSBOb25lKToKKyAgICAgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgcGF0aCA9IFtOb25lXSArIHNlbGYuZGVmYXVsdF9wYXRoKCkKKyAgICAgICAgZm9yIGRpciBpbiBwYXRoOgorICAgICAgICAgICAgc3R1ZmYgPSBzZWxmLmZpbmRfbW9kdWxlX2luX2RpcihuYW1lLCBkaXIpCisgICAgICAgICAgICBpZiBzdHVmZjogcmV0dXJuIHN0dWZmCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZGVmYXVsdF9wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnBhdGgKKworICAgIGRlZiBmaW5kX21vZHVsZV9pbl9kaXIoc2VsZiwgbmFtZSwgZGlyKToKKyAgICAgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maW5kX2J1aWx0aW5fbW9kdWxlKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGltcC5maW5kX21vZHVsZShuYW1lLCBbZGlyXSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGZpbmRfYnVpbHRpbl9tb2R1bGUoc2VsZiwgbmFtZSk6CisgICAgICAgICMgWFhYIGZyb3plbiBwYWNrYWdlcz8KKyAgICAgICAgaWYgaW1wLmlzX2J1aWx0aW4obmFtZSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgJycsICgnJywgJycsIEJVSUxUSU5fTU9EVUxFKQorICAgICAgICBpZiBpbXAuaXNfZnJvemVuKG5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsICcnLCAoJycsICcnLCBGUk9aRU5fTU9EVUxFKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIG5hbWUsIHN0dWZmKToKKyAgICAgICAgZmlsZSwgZmlsZW5hbWUsIGluZm8gPSBzdHVmZgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gaW1wLmxvYWRfbW9kdWxlKG5hbWUsIGZpbGUsIGZpbGVuYW1lLCBpbmZvKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgZmlsZTogZmlsZS5jbG9zZSgpCisKKworY2xhc3MgSG9va3MoX1ZlcmJvc2UpOgorCisgICAgIiIiSG9va3MgaW50byB0aGUgZmlsZXN5c3RlbSBhbmQgaW50ZXJwcmV0ZXIuCisKKyAgICBCeSBkZXJpdmluZyBhIHN1YmNsYXNzIHlvdSBjYW4gcmVkZWZpbmUgeW91ciBmaWxlc3lzdGVtIGludGVyZmFjZSwKKyAgICBlLmcuIHRvIG1lcmdlIGl0IHdpdGggdGhlIFVSTCBzcGFjZS4KKworICAgIFRoaXMgYmFzZSBjbGFzcyBiZWhhdmVzIGp1c3QgbGlrZSB0aGUgbmF0aXZlIGZpbGVzeXN0ZW0uCisKKyAgICAiIiIKKworICAgICMgaW1wIGludGVyZmFjZQorICAgIGRlZiBnZXRfc3VmZml4ZXMoc2VsZik6IHJldHVybiBpbXAuZ2V0X3N1ZmZpeGVzKCkKKyAgICBkZWYgbmV3X21vZHVsZShzZWxmLCBuYW1lKTogcmV0dXJuIGltcC5uZXdfbW9kdWxlKG5hbWUpCisgICAgZGVmIGlzX2J1aWx0aW4oc2VsZiwgbmFtZSk6IHJldHVybiBpbXAuaXNfYnVpbHRpbihuYW1lKQorICAgIGRlZiBpbml0X2J1aWx0aW4oc2VsZiwgbmFtZSk6IHJldHVybiBpbXAuaW5pdF9idWlsdGluKG5hbWUpCisgICAgZGVmIGlzX2Zyb3plbihzZWxmLCBuYW1lKTogcmV0dXJuIGltcC5pc19mcm96ZW4obmFtZSkKKyAgICBkZWYgaW5pdF9mcm96ZW4oc2VsZiwgbmFtZSk6IHJldHVybiBpbXAuaW5pdF9mcm96ZW4obmFtZSkKKyAgICBkZWYgZ2V0X2Zyb3plbl9vYmplY3Qoc2VsZiwgbmFtZSk6IHJldHVybiBpbXAuZ2V0X2Zyb3plbl9vYmplY3QobmFtZSkKKyAgICBkZWYgbG9hZF9zb3VyY2Uoc2VsZiwgbmFtZSwgZmlsZW5hbWUsIGZpbGU9Tm9uZSk6CisgICAgICAgIHJldHVybiBpbXAubG9hZF9zb3VyY2UobmFtZSwgZmlsZW5hbWUsIGZpbGUpCisgICAgZGVmIGxvYWRfY29tcGlsZWQoc2VsZiwgbmFtZSwgZmlsZW5hbWUsIGZpbGU9Tm9uZSk6CisgICAgICAgIHJldHVybiBpbXAubG9hZF9jb21waWxlZChuYW1lLCBmaWxlbmFtZSwgZmlsZSkKKyAgICBkZWYgbG9hZF9keW5hbWljKHNlbGYsIG5hbWUsIGZpbGVuYW1lLCBmaWxlPU5vbmUpOgorICAgICAgICByZXR1cm4gaW1wLmxvYWRfZHluYW1pYyhuYW1lLCBmaWxlbmFtZSwgZmlsZSkKKyAgICBkZWYgbG9hZF9wYWNrYWdlKHNlbGYsIG5hbWUsIGZpbGVuYW1lLCBmaWxlPU5vbmUpOgorICAgICAgICByZXR1cm4gaW1wLmxvYWRfbW9kdWxlKG5hbWUsIGZpbGUsIGZpbGVuYW1lLCAoIiIsICIiLCBQS0dfRElSRUNUT1JZKSkKKworICAgIGRlZiBhZGRfbW9kdWxlKHNlbGYsIG5hbWUpOgorICAgICAgICBkID0gc2VsZi5tb2R1bGVzX2RpY3QoKQorICAgICAgICBpZiBuYW1lIGluIGQ6IHJldHVybiBkW25hbWVdCisgICAgICAgIGRbbmFtZV0gPSBtID0gc2VsZi5uZXdfbW9kdWxlKG5hbWUpCisgICAgICAgIHJldHVybiBtCisKKyAgICAjIHN5cyBpbnRlcmZhY2UKKyAgICBkZWYgbW9kdWxlc19kaWN0KHNlbGYpOiByZXR1cm4gc3lzLm1vZHVsZXMKKyAgICBkZWYgZGVmYXVsdF9wYXRoKHNlbGYpOiByZXR1cm4gc3lzLnBhdGgKKworICAgIGRlZiBwYXRoX3NwbGl0KHNlbGYsIHgpOiByZXR1cm4gb3MucGF0aC5zcGxpdCh4KQorICAgIGRlZiBwYXRoX2pvaW4oc2VsZiwgeCwgeSk6IHJldHVybiBvcy5wYXRoLmpvaW4oeCwgeSkKKyAgICBkZWYgcGF0aF9pc2FicyhzZWxmLCB4KTogcmV0dXJuIG9zLnBhdGguaXNhYnMoeCkKKyAgICAjIGV0Yy4KKworICAgIGRlZiBwYXRoX2V4aXN0cyhzZWxmLCB4KTogcmV0dXJuIG9zLnBhdGguZXhpc3RzKHgpCisgICAgZGVmIHBhdGhfaXNkaXIoc2VsZiwgeCk6IHJldHVybiBvcy5wYXRoLmlzZGlyKHgpCisgICAgZGVmIHBhdGhfaXNmaWxlKHNlbGYsIHgpOiByZXR1cm4gb3MucGF0aC5pc2ZpbGUoeCkKKyAgICBkZWYgcGF0aF9pc2xpbmsoc2VsZiwgeCk6IHJldHVybiBvcy5wYXRoLmlzbGluayh4KQorICAgICMgZXRjLgorCisgICAgZGVmIG9wZW5maWxlKHNlbGYsICp4KTogcmV0dXJuIG9wZW4oKngpCisgICAgb3BlbmZpbGVfZXJyb3IgPSBJT0Vycm9yCisgICAgZGVmIGxpc3RkaXIoc2VsZiwgeCk6IHJldHVybiBvcy5saXN0ZGlyKHgpCisgICAgbGlzdGRpcl9lcnJvciA9IG9zLmVycm9yCisgICAgIyBldGMuCisKKworY2xhc3MgTW9kdWxlTG9hZGVyKEJhc2ljTW9kdWxlTG9hZGVyKToKKworICAgICIiIkRlZmF1bHQgbW9kdWxlIGxvYWRlcjsgdXNlcyBmaWxlIHN5c3RlbSBob29rcy4KKworICAgIEJ5IGRlZmluaW5nIHN1aXRhYmxlIGhvb2tzLCB5b3UgbWlnaHQgYmUgYWJsZSB0byBsb2FkIG1vZHVsZXMgZnJvbQorICAgIG90aGVyIHNvdXJjZXMgdGhhbiB0aGUgZmlsZSBzeXN0ZW0sIGUuZy4gZnJvbSBjb21wcmVzc2VkIG9yCisgICAgZW5jcnlwdGVkIGZpbGVzLCB0YXIgZmlsZXMgb3IgKGlmIHlvdSdyZSBicmF2ZSEpIFVSTHMuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob29rcyA9IE5vbmUsIHZlcmJvc2UgPSBWRVJCT1NFKToKKyAgICAgICAgQmFzaWNNb2R1bGVMb2FkZXIuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5ob29rcyA9IGhvb2tzIG9yIEhvb2tzKHZlcmJvc2UpCisKKyAgICBkZWYgZGVmYXVsdF9wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ob29rcy5kZWZhdWx0X3BhdGgoKQorCisgICAgZGVmIG1vZHVsZXNfZGljdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaG9va3MubW9kdWxlc19kaWN0KCkKKworICAgIGRlZiBnZXRfaG9va3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmhvb2tzCisKKyAgICBkZWYgc2V0X2hvb2tzKHNlbGYsIGhvb2tzKToKKyAgICAgICAgc2VsZi5ob29rcyA9IGhvb2tzCisKKyAgICBkZWYgZmluZF9idWlsdGluX21vZHVsZShzZWxmLCBuYW1lKToKKyAgICAgICAgIyBYWFggZnJvemVuIHBhY2thZ2VzPworICAgICAgICBpZiBzZWxmLmhvb2tzLmlzX2J1aWx0aW4obmFtZSk6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgJycsICgnJywgJycsIEJVSUxUSU5fTU9EVUxFKQorICAgICAgICBpZiBzZWxmLmhvb2tzLmlzX2Zyb3plbihuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBOb25lLCAnJywgKCcnLCAnJywgRlJPWkVOX01PRFVMRSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBmaW5kX21vZHVsZV9pbl9kaXIoc2VsZiwgbmFtZSwgZGlyLCBhbGxvd19wYWNrYWdlcz0xKToKKyAgICAgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maW5kX2J1aWx0aW5fbW9kdWxlKG5hbWUpCisgICAgICAgIGlmIGFsbG93X3BhY2thZ2VzOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmhvb2tzLnBhdGhfam9pbihkaXIsIG5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLmhvb2tzLnBhdGhfaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIHN0dWZmID0gc2VsZi5maW5kX21vZHVsZV9pbl9kaXIoIl9faW5pdF9fIiwgZnVsbG5hbWUsIDApCisgICAgICAgICAgICAgICAgaWYgc3R1ZmY6CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBzdHVmZlswXQorICAgICAgICAgICAgICAgICAgICBpZiBmaWxlOiBmaWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUsIGZ1bGxuYW1lLCAoJycsICcnLCBQS0dfRElSRUNUT1JZKQorICAgICAgICBmb3IgaW5mbyBpbiBzZWxmLmhvb2tzLmdldF9zdWZmaXhlcygpOgorICAgICAgICAgICAgc3VmZiwgbW9kZSwgdHlwZSA9IGluZm8KKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5ob29rcy5wYXRoX2pvaW4oZGlyLCBuYW1lK3N1ZmYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBzZWxmLmhvb2tzLm9wZW5maWxlKGZ1bGxuYW1lLCBtb2RlKQorICAgICAgICAgICAgICAgIHJldHVybiBmcCwgZnVsbG5hbWUsIGluZm8KKyAgICAgICAgICAgIGV4Y2VwdCBzZWxmLmhvb2tzLm9wZW5maWxlX2Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBuYW1lLCBzdHVmZik6CisgICAgICAgIGZpbGUsIGZpbGVuYW1lLCBpbmZvID0gc3R1ZmYKKyAgICAgICAgKHN1ZmYsIG1vZGUsIHR5cGUpID0gaW5mbworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB0eXBlID09IEJVSUxUSU5fTU9EVUxFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhvb2tzLmluaXRfYnVpbHRpbihuYW1lKQorICAgICAgICAgICAgaWYgdHlwZSA9PSBGUk9aRU5fTU9EVUxFOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhvb2tzLmluaXRfZnJvemVuKG5hbWUpCisgICAgICAgICAgICBpZiB0eXBlID09IENfRVhURU5TSU9OOgorICAgICAgICAgICAgICAgIG0gPSBzZWxmLmhvb2tzLmxvYWRfZHluYW1pYyhuYW1lLCBmaWxlbmFtZSwgZmlsZSkKKyAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBQWV9TT1VSQ0U6CisgICAgICAgICAgICAgICAgbSA9IHNlbGYuaG9va3MubG9hZF9zb3VyY2UobmFtZSwgZmlsZW5hbWUsIGZpbGUpCisgICAgICAgICAgICBlbGlmIHR5cGUgPT0gUFlfQ09NUElMRUQ6CisgICAgICAgICAgICAgICAgbSA9IHNlbGYuaG9va3MubG9hZF9jb21waWxlZChuYW1lLCBmaWxlbmFtZSwgZmlsZSkKKyAgICAgICAgICAgIGVsaWYgdHlwZSA9PSBQS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgICAgIG0gPSBzZWxmLmhvb2tzLmxvYWRfcGFja2FnZShuYW1lLCBmaWxlbmFtZSwgZmlsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJVbnJlY29nbml6ZWQgbW9kdWxlIHR5cGUgKCVyKSBmb3IgJXMiICUgXAorICAgICAgICAgICAgICAgICAgICAgICh0eXBlLCBuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgZmlsZTogZmlsZS5jbG9zZSgpCisgICAgICAgIG0uX19maWxlX18gPSBmaWxlbmFtZQorICAgICAgICByZXR1cm4gbQorCisKK2NsYXNzIEZhbmN5TW9kdWxlTG9hZGVyKE1vZHVsZUxvYWRlcik6CisKKyAgICAiIiJGYW5jeSBtb2R1bGUgbG9hZGVyIC0tIHBhcnNlcyBhbmQgZXhlY3MgdGhlIGNvZGUgaXRzZWxmLiIiIgorCisgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIG5hbWUsIHN0dWZmKToKKyAgICAgICAgZmlsZSwgZmlsZW5hbWUsIChzdWZmLCBtb2RlLCB0eXBlKSA9IHN0dWZmCisgICAgICAgIHJlYWxmaWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHBhdGggPSBOb25lCisKKyAgICAgICAgaWYgdHlwZSA9PSBQS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgaW5pdHN0dWZmID0gc2VsZi5maW5kX21vZHVsZV9pbl9kaXIoIl9faW5pdF9fIiwgZmlsZW5hbWUsIDApCisgICAgICAgICAgICBpZiBub3QgaW5pdHN0dWZmOgorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gX19pbml0X18gbW9kdWxlIGluIHBhY2thZ2UgJXMiICUgbmFtZQorICAgICAgICAgICAgaW5pdGZpbGUsIGluaXRmaWxlbmFtZSwgaW5pdGluZm8gPSBpbml0c3R1ZmYKKyAgICAgICAgICAgIGluaXRzdWZmLCBpbml0bW9kZSwgaW5pdHR5cGUgPSBpbml0aW5mbworICAgICAgICAgICAgaWYgaW5pdHR5cGUgbm90IGluIChQWV9DT01QSUxFRCwgUFlfU09VUkNFKToKKyAgICAgICAgICAgICAgICBpZiBpbml0ZmlsZTogaW5pdGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICJCYWQgdHlwZSAoJXIpIGZvciBfX2luaXRfXyBtb2R1bGUgaW4gcGFja2FnZSAlcyIgJSAoCisgICAgICAgICAgICAgICAgICAgIGluaXR0eXBlLCBuYW1lKQorICAgICAgICAgICAgcGF0aCA9IFtmaWxlbmFtZV0KKyAgICAgICAgICAgIGZpbGUgPSBpbml0ZmlsZQorICAgICAgICAgICAgcmVhbGZpbGVuYW1lID0gaW5pdGZpbGVuYW1lCisgICAgICAgICAgICB0eXBlID0gaW5pdHR5cGUKKworICAgICAgICBpZiB0eXBlID09IEZST1pFTl9NT0RVTEU6CisgICAgICAgICAgICBjb2RlID0gc2VsZi5ob29rcy5nZXRfZnJvemVuX29iamVjdChuYW1lKQorICAgICAgICBlbGlmIHR5cGUgPT0gUFlfQ09NUElMRUQ6CisgICAgICAgICAgICBpbXBvcnQgbWFyc2hhbAorICAgICAgICAgICAgZmlsZS5zZWVrKDgpCisgICAgICAgICAgICBjb2RlID0gbWFyc2hhbC5sb2FkKGZpbGUpCisgICAgICAgIGVsaWYgdHlwZSA9PSBQWV9TT1VSQ0U6CisgICAgICAgICAgICBkYXRhID0gZmlsZS5yZWFkKCkKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGRhdGEsIHJlYWxmaWxlbmFtZSwgJ2V4ZWMnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE1vZHVsZUxvYWRlci5sb2FkX21vZHVsZShzZWxmLCBuYW1lLCBzdHVmZikKKworICAgICAgICBtID0gc2VsZi5ob29rcy5hZGRfbW9kdWxlKG5hbWUpCisgICAgICAgIGlmIHBhdGg6CisgICAgICAgICAgICBtLl9fcGF0aF9fID0gcGF0aAorICAgICAgICBtLl9fZmlsZV9fID0gZmlsZW5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyBjb2RlIGluIG0uX19kaWN0X18KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZCA9IHNlbGYuaG9va3MubW9kdWxlc19kaWN0KCkKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gZDoKKyAgICAgICAgICAgICAgICBkZWwgZFtuYW1lXQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgcmV0dXJuIG0KKworCitjbGFzcyBCYXNpY01vZHVsZUltcG9ydGVyKF9WZXJib3NlKToKKworICAgICIiIkJhc2ljIG1vZHVsZSBpbXBvcnRlcjsgdXNlcyBtb2R1bGUgbG9hZGVyLgorCisgICAgVGhpcyBwcm92aWRlcyBiYXNpYyBpbXBvcnQgZmFjaWxpdGllcyBidXQgbm8gcGFja2FnZSBpbXBvcnRzLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9hZGVyID0gTm9uZSwgdmVyYm9zZSA9IFZFUkJPU0UpOgorICAgICAgICBfVmVyYm9zZS5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorICAgICAgICBzZWxmLmxvYWRlciA9IGxvYWRlciBvciBNb2R1bGVMb2FkZXIoTm9uZSwgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5tb2R1bGVzID0gc2VsZi5sb2FkZXIubW9kdWxlc19kaWN0KCkKKworICAgIGRlZiBnZXRfbG9hZGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIKKworICAgIGRlZiBzZXRfbG9hZGVyKHNlbGYsIGxvYWRlcik6CisgICAgICAgIHNlbGYubG9hZGVyID0gbG9hZGVyCisKKyAgICBkZWYgZ2V0X2hvb2tzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuZ2V0X2hvb2tzKCkKKworICAgIGRlZiBzZXRfaG9va3Moc2VsZiwgaG9va3MpOgorICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIuc2V0X2hvb2tzKGhvb2tzKQorCisgICAgZGVmIGltcG9ydF9tb2R1bGUoc2VsZiwgbmFtZSwgZ2xvYmFscz17fSwgbG9jYWxzPXt9LCBmcm9tbGlzdD1bXSk6CisgICAgICAgIG5hbWUgPSBzdHIobmFtZSkKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzW25hbWVdICMgRmFzdCBwYXRoCisgICAgICAgIHN0dWZmID0gc2VsZi5sb2FkZXIuZmluZF9tb2R1bGUobmFtZSkKKyAgICAgICAgaWYgbm90IHN0dWZmOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgJXMiICUgbmFtZQorICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIubG9hZF9tb2R1bGUobmFtZSwgc3R1ZmYpCisKKyAgICBkZWYgcmVsb2FkKHNlbGYsIG1vZHVsZSwgcGF0aCA9IE5vbmUpOgorICAgICAgICBuYW1lID0gc3RyKG1vZHVsZS5fX25hbWVfXykKKyAgICAgICAgc3R1ZmYgPSBzZWxmLmxvYWRlci5maW5kX21vZHVsZShuYW1lLCBwYXRoKQorICAgICAgICBpZiBub3Qgc3R1ZmY6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk1vZHVsZSAlcyBub3QgZm91bmQgZm9yIHJlbG9hZCIgJSBuYW1lCisgICAgICAgIHJldHVybiBzZWxmLmxvYWRlci5sb2FkX21vZHVsZShuYW1lLCBzdHVmZikKKworICAgIGRlZiB1bmxvYWQoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgZGVsIHNlbGYubW9kdWxlc1tzdHIobW9kdWxlLl9fbmFtZV9fKV0KKyAgICAgICAgIyBYWFggU2hvdWxkIHRoaXMgdHJ5IHRvIGNsZWFyIHRoZSBtb2R1bGUncyBuYW1lc3BhY2U/CisKKyAgICBkZWYgaW5zdGFsbChzZWxmKToKKyAgICAgICAgc2VsZi5zYXZlX2ltcG9ydF9tb2R1bGUgPSBfX2J1aWx0aW5fXy5fX2ltcG9ydF9fCisgICAgICAgIHNlbGYuc2F2ZV9yZWxvYWQgPSBfX2J1aWx0aW5fXy5yZWxvYWQKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoX19idWlsdGluX18sICd1bmxvYWQnKToKKyAgICAgICAgICAgIF9fYnVpbHRpbl9fLnVubG9hZCA9IE5vbmUKKyAgICAgICAgc2VsZi5zYXZlX3VubG9hZCA9IF9fYnVpbHRpbl9fLnVubG9hZAorICAgICAgICBfX2J1aWx0aW5fXy5fX2ltcG9ydF9fID0gc2VsZi5pbXBvcnRfbW9kdWxlCisgICAgICAgIF9fYnVpbHRpbl9fLnJlbG9hZCA9IHNlbGYucmVsb2FkCisgICAgICAgIF9fYnVpbHRpbl9fLnVubG9hZCA9IHNlbGYudW5sb2FkCisKKyAgICBkZWYgdW5pbnN0YWxsKHNlbGYpOgorICAgICAgICBfX2J1aWx0aW5fXy5fX2ltcG9ydF9fID0gc2VsZi5zYXZlX2ltcG9ydF9tb2R1bGUKKyAgICAgICAgX19idWlsdGluX18ucmVsb2FkID0gc2VsZi5zYXZlX3JlbG9hZAorICAgICAgICBfX2J1aWx0aW5fXy51bmxvYWQgPSBzZWxmLnNhdmVfdW5sb2FkCisgICAgICAgIGlmIG5vdCBfX2J1aWx0aW5fXy51bmxvYWQ6CisgICAgICAgICAgICBkZWwgX19idWlsdGluX18udW5sb2FkCisKKworY2xhc3MgTW9kdWxlSW1wb3J0ZXIoQmFzaWNNb2R1bGVJbXBvcnRlcik6CisKKyAgICAiIiJBIG1vZHVsZSBpbXBvcnRlciB0aGF0IHN1cHBvcnRzIHBhY2thZ2VzLiIiIgorCisgICAgZGVmIGltcG9ydF9tb2R1bGUoc2VsZiwgbmFtZSwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSwgZnJvbWxpc3Q9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBsZXZlbD0tMSk6CisgICAgICAgIHBhcmVudCA9IHNlbGYuZGV0ZXJtaW5lX3BhcmVudChnbG9iYWxzLCBsZXZlbCkKKyAgICAgICAgcSwgdGFpbCA9IHNlbGYuZmluZF9oZWFkX3BhY2thZ2UocGFyZW50LCBzdHIobmFtZSkpCisgICAgICAgIG0gPSBzZWxmLmxvYWRfdGFpbChxLCB0YWlsKQorICAgICAgICBpZiBub3QgZnJvbWxpc3Q6CisgICAgICAgICAgICByZXR1cm4gcQorICAgICAgICBpZiBoYXNhdHRyKG0sICJfX3BhdGhfXyIpOgorICAgICAgICAgICAgc2VsZi5lbnN1cmVfZnJvbWxpc3QobSwgZnJvbWxpc3QpCisgICAgICAgIHJldHVybiBtCisKKyAgICBkZWYgZGV0ZXJtaW5lX3BhcmVudChzZWxmLCBnbG9iYWxzLCBsZXZlbD0tMSk6CisgICAgICAgIGlmIG5vdCBnbG9iYWxzIG9yIG5vdCBsZXZlbDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHBrZ25hbWUgPSBnbG9iYWxzLmdldCgnX19wYWNrYWdlX18nKQorICAgICAgICBpZiBwa2duYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IHBrZ25hbWUgYW5kIGxldmVsID4gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnQXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBpbiBub24tcGFja2FnZScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgX19wYWNrYWdlX18gbm90IHNldCwgZmlndXJlIGl0IG91dCBhbmQgc2V0IGl0CisgICAgICAgICAgICBtb2RuYW1lID0gZ2xvYmFscy5nZXQoJ19fbmFtZV9fJykKKyAgICAgICAgICAgIGlmIG1vZG5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgaWYgIl9fcGF0aF9fIiBpbiBnbG9iYWxzOgorICAgICAgICAgICAgICAgICMgX19wYXRoX18gaXMgc2V0IHNvIG1vZG5hbWUgaXMgYWxyZWFkeSB0aGUgcGFja2FnZSBuYW1lCisgICAgICAgICAgICAgICAgcGtnbmFtZSA9IG1vZG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBub3JtYWwgbW9kdWxlLCB3b3JrIG91dCBwYWNrYWdlIG5hbWUgaWYgYW55CisgICAgICAgICAgICAgICAgaWYgJy4nIG5vdCBpbiBtb2RuYW1lOgorICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAoJ0F0dGVtcHRlZCByZWxhdGl2ZSBpbXBvcnQgaW4gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub24tcGFja2FnZScpCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbHNbJ19fcGFja2FnZV9fJ10gPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgcGtnbmFtZSA9IG1vZG5hbWUucnBhcnRpdGlvbignLicpWzBdCisgICAgICAgICAgICBnbG9iYWxzWydfX3BhY2thZ2VfXyddID0gcGtnbmFtZQorICAgICAgICBpZiBsZXZlbCA+IDA6CisgICAgICAgICAgICBkb3QgPSBsZW4ocGtnbmFtZSkKKyAgICAgICAgICAgIGZvciB4IGluIHJhbmdlKGxldmVsLCAxLCAtMSk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkb3QgPSBwa2duYW1lLnJpbmRleCgnLicsIDAsIGRvdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignYXR0ZW1wdGVkIHJlbGF0aXZlIGltcG9ydCBiZXlvbmQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0b3AtbGV2ZWwgcGFja2FnZScpCisgICAgICAgICAgICBwa2duYW1lID0gcGtnbmFtZVs6ZG90XQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbcGtnbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgbGV2ZWwgPCAxOgorICAgICAgICAgICAgICAgIHdhcm4oIlBhcmVudCBtb2R1bGUgJyVzJyBub3QgZm91bmQgd2hpbGUgaGFuZGxpbmcgIgorICAgICAgICAgICAgICAgICAgICAgImFic29sdXRlIGltcG9ydCIgJSBwa2duYW1lLCBSdW50aW1lV2FybmluZywgMSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FcnJvciwgKCJQYXJlbnQgbW9kdWxlICclcycgbm90IGxvYWRlZCwgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwZXJmb3JtIHJlbGF0aXZlIGltcG9ydCIgJSBwa2duYW1lKQorCisgICAgZGVmIGZpbmRfaGVhZF9wYWNrYWdlKHNlbGYsIHBhcmVudCwgbmFtZSk6CisgICAgICAgIGlmICcuJyBpbiBuYW1lOgorICAgICAgICAgICAgaSA9IG5hbWUuZmluZCgnLicpCisgICAgICAgICAgICBoZWFkID0gbmFtZVs6aV0KKyAgICAgICAgICAgIHRhaWwgPSBuYW1lW2krMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkID0gbmFtZQorICAgICAgICAgICAgdGFpbCA9ICIiCisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHFuYW1lID0gIiVzLiVzIiAlIChwYXJlbnQuX19uYW1lX18sIGhlYWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxbmFtZSA9IGhlYWQKKyAgICAgICAgcSA9IHNlbGYuaW1wb3J0X2l0KGhlYWQsIHFuYW1lLCBwYXJlbnQpCisgICAgICAgIGlmIHE6IHJldHVybiBxLCB0YWlsCisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHFuYW1lID0gaGVhZAorICAgICAgICAgICAgcGFyZW50ID0gTm9uZQorICAgICAgICAgICAgcSA9IHNlbGYuaW1wb3J0X2l0KGhlYWQsIHFuYW1lLCBwYXJlbnQpCisgICAgICAgICAgICBpZiBxOiByZXR1cm4gcSwgdGFpbAorICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIG1vZHVsZSBuYW1lZCAnJXMnIiAlIHFuYW1lCisKKyAgICBkZWYgbG9hZF90YWlsKHNlbGYsIHEsIHRhaWwpOgorICAgICAgICBtID0gcQorICAgICAgICB3aGlsZSB0YWlsOgorICAgICAgICAgICAgaSA9IHRhaWwuZmluZCgnLicpCisgICAgICAgICAgICBpZiBpIDwgMDogaSA9IGxlbih0YWlsKQorICAgICAgICAgICAgaGVhZCwgdGFpbCA9IHRhaWxbOmldLCB0YWlsW2krMTpdCisgICAgICAgICAgICBtbmFtZSA9ICIlcy4lcyIgJSAobS5fX25hbWVfXywgaGVhZCkKKyAgICAgICAgICAgIG0gPSBzZWxmLmltcG9ydF9pdChoZWFkLCBtbmFtZSwgbSkKKyAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gbW9kdWxlIG5hbWVkICclcyciICUgbW5hbWUKKyAgICAgICAgcmV0dXJuIG0KKworICAgIGRlZiBlbnN1cmVfZnJvbWxpc3Qoc2VsZiwgbSwgZnJvbWxpc3QsIHJlY3Vyc2l2ZT0wKToKKyAgICAgICAgZm9yIHN1YiBpbiBmcm9tbGlzdDoKKyAgICAgICAgICAgIGlmIHN1YiA9PSAiKiI6CisgICAgICAgICAgICAgICAgaWYgbm90IHJlY3Vyc2l2ZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgYWxsID0gbS5fX2FsbF9fCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5zdXJlX2Zyb21saXN0KG0sIGFsbCwgMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc3ViICE9ICIqIiBhbmQgbm90IGhhc2F0dHIobSwgc3ViKToKKyAgICAgICAgICAgICAgICBzdWJuYW1lID0gIiVzLiVzIiAlIChtLl9fbmFtZV9fLCBzdWIpCisgICAgICAgICAgICAgICAgc3VibW9kID0gc2VsZi5pbXBvcnRfaXQoc3ViLCBzdWJuYW1lLCBtKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzdWJtb2Q6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiTm8gbW9kdWxlIG5hbWVkICclcyciICUgc3VibmFtZQorCisgICAgZGVmIGltcG9ydF9pdChzZWxmLCBwYXJ0bmFtZSwgZnFuYW1lLCBwYXJlbnQsIGZvcmNlX2xvYWQ9MCk6CisgICAgICAgIGlmIG5vdCBwYXJ0bmFtZToKKyAgICAgICAgICAgICMgY29tcGxldGVseSBlbXB0eSBtb2R1bGUgbmFtZSBzaG91bGQgb25seSBoYXBwZW4gaW4KKyAgICAgICAgICAgICMgJ2Zyb20gLiBpbXBvcnQnIG9yIF9faW1wb3J0X18oIiIpCisgICAgICAgICAgICByZXR1cm4gcGFyZW50CisgICAgICAgIGlmIG5vdCBmb3JjZV9sb2FkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm1vZHVsZXNbZnFuYW1lXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0aCA9IHBhcmVudCBhbmQgcGFyZW50Ll9fcGF0aF9fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHBhcnRuYW1lID0gc3RyKHBhcnRuYW1lKQorICAgICAgICBzdHVmZiA9IHNlbGYubG9hZGVyLmZpbmRfbW9kdWxlKHBhcnRuYW1lLCBwYXRoKQorICAgICAgICBpZiBub3Qgc3R1ZmY6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBmcW5hbWUgPSBzdHIoZnFuYW1lKQorICAgICAgICBtID0gc2VsZi5sb2FkZXIubG9hZF9tb2R1bGUoZnFuYW1lLCBzdHVmZikKKyAgICAgICAgaWYgcGFyZW50OgorICAgICAgICAgICAgc2V0YXR0cihwYXJlbnQsIHBhcnRuYW1lLCBtKQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIHJlbG9hZChzZWxmLCBtb2R1bGUpOgorICAgICAgICBuYW1lID0gc3RyKG1vZHVsZS5fX25hbWVfXykKKyAgICAgICAgaWYgJy4nIG5vdCBpbiBuYW1lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW1wb3J0X2l0KG5hbWUsIG5hbWUsIE5vbmUsIGZvcmNlX2xvYWQ9MSkKKyAgICAgICAgaSA9IG5hbWUucmZpbmQoJy4nKQorICAgICAgICBwbmFtZSA9IG5hbWVbOmldCisgICAgICAgIHBhcmVudCA9IHNlbGYubW9kdWxlc1twbmFtZV0KKyAgICAgICAgcmV0dXJuIHNlbGYuaW1wb3J0X2l0KG5hbWVbaSsxOl0sIG5hbWUsIHBhcmVudCwgZm9yY2VfbG9hZD0xKQorCisKK2RlZmF1bHRfaW1wb3J0ZXIgPSBOb25lCitjdXJyZW50X2ltcG9ydGVyID0gTm9uZQorCitkZWYgaW5zdGFsbChpbXBvcnRlciA9IE5vbmUpOgorICAgIGdsb2JhbCBjdXJyZW50X2ltcG9ydGVyCisgICAgY3VycmVudF9pbXBvcnRlciA9IGltcG9ydGVyIG9yIGRlZmF1bHRfaW1wb3J0ZXIgb3IgTW9kdWxlSW1wb3J0ZXIoKQorICAgIGN1cnJlbnRfaW1wb3J0ZXIuaW5zdGFsbCgpCisKK2RlZiB1bmluc3RhbGwoKToKKyAgICBnbG9iYWwgY3VycmVudF9pbXBvcnRlcgorICAgIGN1cnJlbnRfaW1wb3J0ZXIudW5pbnN0YWxsKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWhvb2tzLnB5YyBiL2xpYi9weXRob24yLjcvaWhvb2tzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI0ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9paG9va3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaWhvb2tzLnB5byBiL2xpYi9weXRob24yLjcvaWhvb2tzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTI0ODY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9paG9va3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaW1hcGxpYi5weSBiL2xpYi9weXRob24yLjcvaW1hcGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTc2OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbWFwbGliLnB5CkBAIC0wLDAgKzEsMTUxOCBAQAorIiIiSU1BUDQgY2xpZW50LgorCitCYXNlZCBvbiBSRkMgMjA2MC4KKworUHVibGljIGNsYXNzOiAgICAgICAgICAgSU1BUDQKK1B1YmxpYyB2YXJpYWJsZTogICAgICAgIERlYnVnCitQdWJsaWMgZnVuY3Rpb25zOiAgICAgICBJbnRlcm5hbGRhdGUydHVwbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIEludDJBUAorICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VGbGFncworICAgICAgICAgICAgICAgICAgICAgICAgVGltZTJJbnRlcm5hbGRhdGUKKyIiIgorCisjIEF1dGhvcjogUGllcnMgTGF1ZGVyIDxwaWVyc0Bjcy5zdS5vei5hdT4gRGVjZW1iZXIgMTk5Ny4KKyMKKyMgQXV0aGVudGljYXRpb24gY29kZSBjb250cmlidXRlZCBieSBEb25uIENhdmUgPGRvbm5AdS53YXNoaW5ndG9uLmVkdT4gSnVuZSAxOTk4LgorIyBTdHJpbmcgbWV0aG9kIGNvbnZlcnNpb24gYnkgRVNSLCBGZWJydWFyeSAyMDAxLgorIyBHRVQvU0VUQUNMIGNvbnRyaWJ1dGVkIGJ5IEFudGhvbnkgQmF4dGVyIDxhbnRob255QGludGVybGluay5jb20uYXU+IEFwcmlsIDIwMDEuCisjIElNQVA0X1NTTCBjb250cmlidXRlZCBieSBUaW5vIExhbmdlIDxUaW5vLkxhbmdlQGlzZy5kZT4gTWFyY2ggMjAwMi4KKyMgR0VUL1NFVFFVT1RBIGNvbnRyaWJ1dGVkIGJ5IEFuZHJlYXMgWmVpZGxlciA8YXpAa3JlYXRpdmtvbWJpbmF0LmRlPiBKdW5lIDIwMDIuCisjIFBST1hZQVVUSCBjb250cmlidXRlZCBieSBSaWNrIEhvbGJlcnQgPGhvbGJlcnQuMTNAb3N1LmVkdT4gTm92ZW1iZXIgMjAwMi4KKyMgR0VUL1NFVEFOTk9UQVRJT04gY29udHJpYnV0ZWQgYnkgVG9tYXMgTGluZHJvb3MgPHNraXR0YUBhYm8uZmk+IEp1bmUgMjAwNS4KKworX192ZXJzaW9uX18gPSAiMi41OCIKKworaW1wb3J0IGJpbmFzY2lpLCBlcnJubywgcmFuZG9tLCByZSwgc29ja2V0LCBzdWJwcm9jZXNzLCBzeXMsIHRpbWUKKworX19hbGxfXyA9IFsiSU1BUDQiLCAiSU1BUDRfc3RyZWFtIiwgIkludGVybmFsZGF0ZTJ0dXBsZSIsCisgICAgICAgICAgICJJbnQyQVAiLCAiUGFyc2VGbGFncyIsICJUaW1lMkludGVybmFsZGF0ZSJdCisKKyMgICAgICAgR2xvYmFscworCitDUkxGID0gJ1xyXG4nCitEZWJ1ZyA9IDAKK0lNQVA0X1BPUlQgPSAxNDMKK0lNQVA0X1NTTF9QT1JUID0gOTkzCitBbGxvd2VkVmVyc2lvbnMgPSAoJ0lNQVA0UkVWMScsICdJTUFQNCcpICAgICAgICAjIE1vc3QgcmVjZW50IGZpcnN0CisKKyMgICAgICAgQ29tbWFuZHMKKworQ29tbWFuZHMgPSB7CisgICAgICAgICMgbmFtZSAgICAgICAgICAgIHZhbGlkIHN0YXRlcworICAgICAgICAnQVBQRU5EJzogICAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdBVVRIRU5USUNBVEUnOiAoJ05PTkFVVEgnLCksCisgICAgICAgICdDQVBBQklMSVRZJzogICAoJ05PTkFVVEgnLCAnQVVUSCcsICdTRUxFQ1RFRCcsICdMT0dPVVQnKSwKKyAgICAgICAgJ0NIRUNLJzogICAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdDTE9TRSc6ICAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnQ09QWSc6ICAgICAgICAgKCdTRUxFQ1RFRCcsKSwKKyAgICAgICAgJ0NSRUFURSc6ICAgICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnREVMRVRFJzogICAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdERUxFVEVBQ0wnOiAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ0VYQU1JTkUnOiAgICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnRVhQVU5HRSc6ICAgICAgKCdTRUxFQ1RFRCcsKSwKKyAgICAgICAgJ0ZFVENIJzogICAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdHRVRBQ0wnOiAgICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ0dFVEFOTk9UQVRJT04nOignQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnR0VUUVVPVEEnOiAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdHRVRRVU9UQVJPT1QnOiAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ01ZUklHSFRTJzogICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnTElTVCc6ICAgICAgICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdMT0dJTic6ICAgICAgICAoJ05PTkFVVEgnLCksCisgICAgICAgICdMT0dPVVQnOiAgICAgICAoJ05PTkFVVEgnLCAnQVVUSCcsICdTRUxFQ1RFRCcsICdMT0dPVVQnKSwKKyAgICAgICAgJ0xTVUInOiAgICAgICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnTkFNRVNQQUNFJzogICAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdOT09QJzogICAgICAgICAoJ05PTkFVVEgnLCAnQVVUSCcsICdTRUxFQ1RFRCcsICdMT0dPVVQnKSwKKyAgICAgICAgJ1BBUlRJQUwnOiAgICAgICgnU0VMRUNURUQnLCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTkI6IG9ic29sZXRlCisgICAgICAgICdQUk9YWUFVVEgnOiAgICAoJ0FVVEgnLCksCisgICAgICAgICdSRU5BTUUnOiAgICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ1NFQVJDSCc6ICAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdTRUxFQ1QnOiAgICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ1NFVEFDTCc6ICAgICAgICgnQVVUSCcsICdTRUxFQ1RFRCcpLAorICAgICAgICAnU0VUQU5OT1RBVElPTic6KCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgICdTRVRRVU9UQSc6ICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ1NPUlQnOiAgICAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdTVEFUVVMnOiAgICAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ1NUT1JFJzogICAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdTVUJTQ1JJQkUnOiAgICAoJ0FVVEgnLCAnU0VMRUNURUQnKSwKKyAgICAgICAgJ1RIUkVBRCc6ICAgICAgICgnU0VMRUNURUQnLCksCisgICAgICAgICdVSUQnOiAgICAgICAgICAoJ1NFTEVDVEVEJywpLAorICAgICAgICAnVU5TVUJTQ1JJQkUnOiAgKCdBVVRIJywgJ1NFTEVDVEVEJyksCisgICAgICAgIH0KKworIyAgICAgICBQYXR0ZXJucyB0byBtYXRjaCBzZXJ2ZXIgcmVzcG9uc2VzCisKK0NvbnRpbnVhdGlvbiA9IHJlLmNvbXBpbGUocidcKyggKD9QPGRhdGE+LiopKT8nKQorRmxhZ3MgPSByZS5jb21waWxlKHInLipGTEFHUyBcKCg/UDxmbGFncz5bXlwpXSopXCknKQorSW50ZXJuYWxEYXRlID0gcmUuY29tcGlsZShyJy4qSU5URVJOQUxEQVRFICInCisgICAgICAgIHInKD9QPGRheT5bIDAxMjNdWzAtOV0pLSg/UDxtb24+W0EtWl1bYS16XVthLXpdKS0oP1A8eWVhcj5bMC05XVswLTldWzAtOV1bMC05XSknCisgICAgICAgIHInICg/UDxob3VyPlswLTldWzAtOV0pOig/UDxtaW4+WzAtOV1bMC05XSk6KD9QPHNlYz5bMC05XVswLTldKScKKyAgICAgICAgcicgKD9QPHpvbmVuPlstK10pKD9QPHpvbmVoPlswLTldWzAtOV0pKD9QPHpvbmVtPlswLTldWzAtOV0pJworICAgICAgICByJyInKQorTGl0ZXJhbCA9IHJlLmNvbXBpbGUocicuKnsoP1A8c2l6ZT5cZCspfSQnKQorTWFwQ1JMRiA9IHJlLmNvbXBpbGUocidcclxufFxyfFxuJykKK1Jlc3BvbnNlX2NvZGUgPSByZS5jb21waWxlKHInXFsoP1A8dHlwZT5bQS1aLV0rKSggKD9QPGRhdGE+W15cXV0qKSk/XF0nKQorVW50YWdnZWRfcmVzcG9uc2UgPSByZS5jb21waWxlKHInXCogKD9QPHR5cGU+W0EtWi1dKykoICg/UDxkYXRhPi4qKSk/JykKK1VudGFnZ2VkX3N0YXR1cyA9IHJlLmNvbXBpbGUocidcKiAoP1A8ZGF0YT5cZCspICg/UDx0eXBlPltBLVotXSspKCAoP1A8ZGF0YTI+LiopKT8nKQorCisKKworY2xhc3MgSU1BUDQ6CisKKyAgICAiIiJJTUFQNCBjbGllbnQgY2xhc3MuCisKKyAgICBJbnN0YW50aWF0ZSB3aXRoOiBJTUFQNChbaG9zdFssIHBvcnRdXSkKKworICAgICAgICAgICAgaG9zdCAtIGhvc3QncyBuYW1lIChkZWZhdWx0OiBsb2NhbGhvc3QpOworICAgICAgICAgICAgcG9ydCAtIHBvcnQgbnVtYmVyIChkZWZhdWx0OiBzdGFuZGFyZCBJTUFQNCBwb3J0KS4KKworICAgIEFsbCBJTUFQNHJldjEgY29tbWFuZHMgYXJlIHN1cHBvcnRlZCBieSBtZXRob2RzIG9mIHRoZSBzYW1lCisgICAgbmFtZSAoaW4gbG93ZXItY2FzZSkuCisKKyAgICBBbGwgYXJndW1lbnRzIHRvIGNvbW1hbmRzIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncywgZXhjZXB0IGZvcgorICAgIEFVVEhFTlRJQ0FURSwgYW5kIHRoZSBsYXN0IGFyZ3VtZW50IHRvIEFQUEVORCB3aGljaCBpcyBwYXNzZWQgYXMKKyAgICBhbiBJTUFQNCBsaXRlcmFsLiAgSWYgbmVjZXNzYXJ5ICh0aGUgc3RyaW5nIGNvbnRhaW5zIGFueQorICAgIG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIG9yIHdoaXRlLXNwYWNlIGFuZCBpc24ndCBlbmNsb3NlZCB3aXRoCisgICAgZWl0aGVyIHBhcmVudGhlc2VzIG9yIGRvdWJsZSBxdW90ZXMpIGVhY2ggc3RyaW5nIGlzIHF1b3RlZC4KKyAgICBIb3dldmVyLCB0aGUgJ3Bhc3N3b3JkJyBhcmd1bWVudCB0byB0aGUgTE9HSU4gY29tbWFuZCBpcyBhbHdheXMKKyAgICBxdW90ZWQuICBJZiB5b3Ugd2FudCB0byBhdm9pZCBoYXZpbmcgYW4gYXJndW1lbnQgc3RyaW5nIHF1b3RlZAorICAgIChlZzogdGhlICdmbGFncycgYXJndW1lbnQgdG8gU1RPUkUpIHRoZW4gZW5jbG9zZSB0aGUgc3RyaW5nIGluCisgICAgcGFyZW50aGVzZXMgKGVnOiAiKFxEZWxldGVkKSIpLgorCisgICAgRWFjaCBjb21tYW5kIHJldHVybnMgYSB0dXBsZTogKHR5cGUsIFtkYXRhLCAuLi5dKSB3aGVyZSAndHlwZScKKyAgICBpcyB1c3VhbGx5ICdPSycgb3IgJ05PJywgYW5kICdkYXRhJyBpcyBlaXRoZXIgdGhlIHRleHQgZnJvbSB0aGUKKyAgICB0YWdnZWQgcmVzcG9uc2UsIG9yIHVudGFnZ2VkIHJlc3VsdHMgZnJvbSBjb21tYW5kLiBFYWNoICdkYXRhJworICAgIGlzIGVpdGhlciBhIHN0cmluZywgb3IgYSB0dXBsZS4gSWYgYSB0dXBsZSwgdGhlbiB0aGUgZmlyc3QgcGFydAorICAgIGlzIHRoZSBoZWFkZXIgb2YgdGhlIHJlc3BvbnNlLCBhbmQgdGhlIHNlY29uZCBwYXJ0IGNvbnRhaW5zCisgICAgdGhlIGRhdGEgKGllOiAnbGl0ZXJhbCcgdmFsdWUpLgorCisgICAgRXJyb3JzIHJhaXNlIHRoZSBleGNlcHRpb24gY2xhc3MgPGluc3RhbmNlPi5lcnJvcigiPHJlYXNvbj4iKS4KKyAgICBJTUFQNCBzZXJ2ZXIgZXJyb3JzIHJhaXNlIDxpbnN0YW5jZT4uYWJvcnQoIjxyZWFzb24+IiksCisgICAgd2hpY2ggaXMgYSBzdWItY2xhc3Mgb2YgJ2Vycm9yJy4gTWFpbGJveCBzdGF0dXMgY2hhbmdlcworICAgIGZyb20gUkVBRC1XUklURSB0byBSRUFELU9OTFkgcmFpc2UgdGhlIGV4Y2VwdGlvbiBjbGFzcworICAgIDxpbnN0YW5jZT4ucmVhZG9ubHkoIjxyZWFzb24+IiksIHdoaWNoIGlzIGEgc3ViLWNsYXNzIG9mICdhYm9ydCcuCisKKyAgICAiZXJyb3IiIGV4Y2VwdGlvbnMgaW1wbHkgYSBwcm9ncmFtIGVycm9yLgorICAgICJhYm9ydCIgZXhjZXB0aW9ucyBpbXBseSB0aGUgY29ubmVjdGlvbiBzaG91bGQgYmUgcmVzZXQsIGFuZAorICAgICAgICAgICAgdGhlIGNvbW1hbmQgcmUtdHJpZWQuCisgICAgInJlYWRvbmx5IiBleGNlcHRpb25zIGltcGx5IHRoZSBjb21tYW5kIHNob3VsZCBiZSByZS10cmllZC4KKworICAgIE5vdGU6IHRvIHVzZSB0aGlzIG1vZHVsZSwgeW91IG11c3QgcmVhZCB0aGUgUkZDcyBwZXJ0YWluaW5nIHRvIHRoZQorICAgIElNQVA0IHByb3RvY29sLCBhcyB0aGUgc2VtYW50aWNzIG9mIHRoZSBhcmd1bWVudHMgdG8gZWFjaCBJTUFQNAorICAgIGNvbW1hbmQgYXJlIGxlZnQgdG8gdGhlIGludm9rZXIsIG5vdCB0byBtZW50aW9uIHRoZSByZXN1bHRzLiBBbHNvLAorICAgIG1vc3QgSU1BUCBzZXJ2ZXJzIGltcGxlbWVudCBhIHN1Yi1zZXQgb2YgdGhlIGNvbW1hbmRzIGF2YWlsYWJsZSBoZXJlLgorICAgICIiIgorCisgICAgY2xhc3MgZXJyb3IoRXhjZXB0aW9uKTogcGFzcyAgICAjIExvZ2ljYWwgZXJyb3JzIC0gZGVidWcgcmVxdWlyZWQKKyAgICBjbGFzcyBhYm9ydChlcnJvcik6IHBhc3MgICAgICAgICMgU2VydmljZSBlcnJvcnMgLSBjbG9zZSBhbmQgcmV0cnkKKyAgICBjbGFzcyByZWFkb25seShhYm9ydCk6IHBhc3MgICAgICMgTWFpbGJveCBzdGF0dXMgY2hhbmdlZCB0byBSRUFELU9OTFkKKworICAgIG11c3RxdW90ZSA9IHJlLmNvbXBpbGUociJbXlx3ISMkJSYnKissLjo7PD0+P15gfH4tXSIpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCA9ICcnLCBwb3J0ID0gSU1BUDRfUE9SVCk6CisgICAgICAgIHNlbGYuZGVidWcgPSBEZWJ1ZworICAgICAgICBzZWxmLnN0YXRlID0gJ0xPR09VVCcKKyAgICAgICAgc2VsZi5saXRlcmFsID0gTm9uZSAgICAgICAgICAgICAjIEEgbGl0ZXJhbCBhcmd1bWVudCB0byBhIGNvbW1hbmQKKyAgICAgICAgc2VsZi50YWdnZWRfY29tbWFuZHMgPSB7fSAgICAgICAjIFRhZ2dlZCBjb21tYW5kcyBhd2FpdGluZyByZXNwb25zZQorICAgICAgICBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlcyA9IHt9ICAgICMge3R5cDogW2RhdGEsIC4uLl0sIC4uLn0KKyAgICAgICAgc2VsZi5jb250aW51YXRpb25fcmVzcG9uc2UgPSAnJyAjIExhc3QgY29udGludWF0aW9uIHJlc3BvbnNlCisgICAgICAgIHNlbGYuaXNfcmVhZG9ubHkgPSBGYWxzZSAgICAgICAgIyBSRUFELU9OTFkgZGVzaXJlZCBzdGF0ZQorICAgICAgICBzZWxmLnRhZ251bSA9IDAKKworICAgICAgICAjIE9wZW4gc29ja2V0IHRvIHNlcnZlci4KKworICAgICAgICBzZWxmLm9wZW4oaG9zdCwgcG9ydCkKKworICAgICAgICAjIENyZWF0ZSB1bmlxdWUgdGFnIGZvciB0aGlzIHNlc3Npb24sCisgICAgICAgICMgYW5kIGNvbXBpbGUgdGFnZ2VkIHJlc3BvbnNlIG1hdGNoZXIuCisKKyAgICAgICAgc2VsZi50YWdwcmUgPSBJbnQyQVAocmFuZG9tLnJhbmRpbnQoNDA5NiwgNjU1MzUpKQorICAgICAgICBzZWxmLnRhZ3JlID0gcmUuY29tcGlsZShyJyg/UDx0YWc+JworICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWxmLnRhZ3ByZQorICAgICAgICAgICAgICAgICAgICAgICAgKyByJ1xkKykgKD9QPHR5cGU+W0EtWl0rKSAoP1A8ZGF0YT4uKiknKQorCisgICAgICAgICMgR2V0IHNlcnZlciB3ZWxjb21lIG1lc3NhZ2UsCisgICAgICAgICMgcmVxdWVzdCBhbmQgc3RvcmUgQ0FQQUJJTElUWSByZXNwb25zZS4KKworICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBzZWxmLl9jbWRfbG9nX2xlbiA9IDEwCisgICAgICAgICAgICBzZWxmLl9jbWRfbG9nX2lkeCA9IDAKKyAgICAgICAgICAgIHNlbGYuX2NtZF9sb2cgPSB7fSAgICAgICAgICAgIyBMYXN0IGBfY21kX2xvZ19sZW4nIGludGVyYWN0aW9ucworICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuX21lc2coJ2ltYXBsaWIgdmVyc2lvbiAlcycgJSBfX3ZlcnNpb25fXykKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCduZXcgSU1BUDQgY29ubmVjdGlvbiwgdGFnPSVzJyAlIHNlbGYudGFncHJlKQorCisgICAgICAgIHNlbGYud2VsY29tZSA9IHNlbGYuX2dldF9yZXNwb25zZSgpCisgICAgICAgIGlmICdQUkVBVVRIJyBpbiBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlczoKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnQVVUSCcKKyAgICAgICAgZWxpZiAnT0snIGluIHNlbGYudW50YWdnZWRfcmVzcG9uc2VzOgorICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICdOT05BVVRIJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5lcnJvcihzZWxmLndlbGNvbWUpCisKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLmNhcGFiaWxpdHkoKQorICAgICAgICBpZiBkYXQgPT0gW05vbmVdOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5lcnJvcignbm8gQ0FQQUJJTElUWSByZXNwb25zZSBmcm9tIHNlcnZlcicpCisgICAgICAgIHNlbGYuY2FwYWJpbGl0aWVzID0gdHVwbGUoZGF0Wy0xXS51cHBlcigpLnNwbGl0KCkpCisKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAzOgorICAgICAgICAgICAgICAgIHNlbGYuX21lc2coJ0NBUEFCSUxJVElFUzogJXInICUgKHNlbGYuY2FwYWJpbGl0aWVzLCkpCisKKyAgICAgICAgZm9yIHZlcnNpb24gaW4gQWxsb3dlZFZlcnNpb25zOgorICAgICAgICAgICAgaWYgbm90IHZlcnNpb24gaW4gc2VsZi5jYXBhYmlsaXRpZXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuUFJPVE9DT0xfVkVSU0lPTiA9IHZlcnNpb24KKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoJ3NlcnZlciBub3QgSU1BUDQgY29tcGxpYW50JykKKworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICAjICAgICAgIEFsbG93IFVQUEVSQ0FTRSB2YXJpYW50cyBvZiBJTUFQNCBjb21tYW5kIG1ldGhvZHMuCisgICAgICAgIGlmIGF0dHIgaW4gQ29tbWFuZHM6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBhdHRyLmxvd2VyKCkpCisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJVbmtub3duIElNQVA0IGNvbW1hbmQ6ICclcyciICUgYXR0cikKKworCisKKyAgICAjICAgICAgIE92ZXJyaWRhYmxlIG1ldGhvZHMKKworCisgICAgZGVmIG9wZW4oc2VsZiwgaG9zdCA9ICcnLCBwb3J0ID0gSU1BUDRfUE9SVCk6CisgICAgICAgICIiIlNldHVwIGNvbm5lY3Rpb24gdG8gcmVtb3RlIHNlcnZlciBvbiAiaG9zdDpwb3J0IgorICAgICAgICAgICAgKGRlZmF1bHQ6IGxvY2FsaG9zdDpzdGFuZGFyZCBJTUFQNCBwb3J0KS4KKyAgICAgICAgVGhpcyBjb25uZWN0aW9uIHdpbGwgYmUgdXNlZCBieSB0aGUgcm91dGluZXM6CisgICAgICAgICAgICByZWFkLCByZWFkbGluZSwgc2VuZCwgc2h1dGRvd24uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChob3N0LCBwb3J0KSkKKyAgICAgICAgc2VsZi5maWxlID0gc2VsZi5zb2NrLm1ha2VmaWxlKCdyYicpCisKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZWFkICdzaXplJyBieXRlcyBmcm9tIHJlbW90ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZS5yZWFkKHNpemUpCisKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgIiIiUmVhZCBsaW5lIGZyb20gcmVtb3RlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWRsaW5lKCkKKworCisgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIlNlbmQgZGF0YSB0byByZW1vdGUuIiIiCisgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKGRhdGEpCisKKworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgSS9PIGVzdGFibGlzaGVkIGluICJvcGVuIi4iIiIKKyAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zb2NrLnNodXRkb3duKHNvY2tldC5TSFVUX1JEV1IpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IgYXMgZToKKyAgICAgICAgICAgICMgVGhlIHNlcnZlciBtaWdodCBhbHJlYWR5IGhhdmUgY2xvc2VkIHRoZSBjb25uZWN0aW9uCisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVOT1RDT05OOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorCisKKyAgICBkZWYgc29ja2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gc29ja2V0IGluc3RhbmNlIHVzZWQgdG8gY29ubmVjdCB0byBJTUFQNCBzZXJ2ZXIuCisKKyAgICAgICAgc29ja2V0ID0gPGluc3RhbmNlPi5zb2NrZXQoKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc29jaworCisKKworICAgICMgICAgICAgVXRpbGl0eSBtZXRob2RzCisKKworICAgIGRlZiByZWNlbnQoc2VsZik6CisgICAgICAgICIiIlJldHVybiBtb3N0IHJlY2VudCAnUkVDRU5UJyByZXNwb25zZXMgaWYgYW55IGV4aXN0LAorICAgICAgICBlbHNlIHByb21wdCBzZXJ2ZXIgZm9yIGFuIHVwZGF0ZSB1c2luZyB0aGUgJ05PT1AnIGNvbW1hbmQuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ucmVjZW50KCkKKworICAgICAgICAnZGF0YScgaXMgTm9uZSBpZiBubyBuZXcgbWVzc2FnZXMsCisgICAgICAgIGVsc2UgbGlzdCBvZiBSRUNFTlQgcmVzcG9uc2VzLCBtb3N0IHJlY2VudCBsYXN0LgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdSRUNFTlQnCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UoJ09LJywgW05vbmVdLCBuYW1lKQorICAgICAgICBpZiBkYXRbLTFdOgorICAgICAgICAgICAgcmV0dXJuIHR5cCwgZGF0CisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5ub29wKCkgICMgUHJvZCBzZXJ2ZXIgZm9yIHJlc3BvbnNlCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIHJlc3BvbnNlKHNlbGYsIGNvZGUpOgorICAgICAgICAiIiJSZXR1cm4gZGF0YSBmb3IgcmVzcG9uc2UgJ2NvZGUnIGlmIHJlY2VpdmVkLCBvciBOb25lLgorCisgICAgICAgIE9sZCB2YWx1ZSBmb3IgcmVzcG9uc2UgJ2NvZGUnIGlzIGNsZWFyZWQuCisKKyAgICAgICAgKGNvZGUsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnJlc3BvbnNlKGNvZGUpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UoY29kZSwgW05vbmVdLCBjb2RlLnVwcGVyKCkpCisKKworCisgICAgIyAgICAgICBJTUFQNCBjb21tYW5kcworCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIG1haWxib3gsIGZsYWdzLCBkYXRlX3RpbWUsIG1lc3NhZ2UpOgorICAgICAgICAiIiJBcHBlbmQgbWVzc2FnZSB0byBuYW1lZCBtYWlsYm94LgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmFwcGVuZChtYWlsYm94LCBmbGFncywgZGF0ZV90aW1lLCBtZXNzYWdlKQorCisgICAgICAgICAgICAgICAgQWxsIGFyZ3MgZXhjZXB0IGBtZXNzYWdlJyBjYW4gYmUgTm9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnQVBQRU5EJworICAgICAgICBpZiBub3QgbWFpbGJveDoKKyAgICAgICAgICAgIG1haWxib3ggPSAnSU5CT1gnCisgICAgICAgIGlmIGZsYWdzOgorICAgICAgICAgICAgaWYgKGZsYWdzWzBdLGZsYWdzWy0xXSkgIT0gKCcoJywnKScpOgorICAgICAgICAgICAgICAgIGZsYWdzID0gJyglcyknICUgZmxhZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZsYWdzID0gTm9uZQorICAgICAgICBpZiBkYXRlX3RpbWU6CisgICAgICAgICAgICBkYXRlX3RpbWUgPSBUaW1lMkludGVybmFsZGF0ZShkYXRlX3RpbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRlX3RpbWUgPSBOb25lCisgICAgICAgIHNlbGYubGl0ZXJhbCA9IE1hcENSTEYuc3ViKENSTEYsIG1lc3NhZ2UpCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCBtYWlsYm94LCBmbGFncywgZGF0ZV90aW1lKQorCisKKyAgICBkZWYgYXV0aGVudGljYXRlKHNlbGYsIG1lY2hhbmlzbSwgYXV0aG9iamVjdCk6CisgICAgICAgICIiIkF1dGhlbnRpY2F0ZSBjb21tYW5kIC0gcmVxdWlyZXMgcmVzcG9uc2UgcHJvY2Vzc2luZy4KKworICAgICAgICAnbWVjaGFuaXNtJyBzcGVjaWZpZXMgd2hpY2ggYXV0aGVudGljYXRpb24gbWVjaGFuaXNtIGlzIHRvCisgICAgICAgIGJlIHVzZWQgLSBpdCBtdXN0IGFwcGVhciBpbiA8aW5zdGFuY2U+LmNhcGFiaWxpdGllcyBpbiB0aGUKKyAgICAgICAgZm9ybSBBVVRIPTxtZWNoYW5pc20+LgorCisgICAgICAgICdhdXRob2JqZWN0JyBtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0OgorCisgICAgICAgICAgICAgICAgZGF0YSA9IGF1dGhvYmplY3QocmVzcG9uc2UpCisKKyAgICAgICAgSXQgd2lsbCBiZSBjYWxsZWQgdG8gcHJvY2VzcyBzZXJ2ZXIgY29udGludWF0aW9uIHJlc3BvbnNlcy4KKyAgICAgICAgSXQgc2hvdWxkIHJldHVybiBkYXRhIHRoYXQgd2lsbCBiZSBlbmNvZGVkIGFuZCBzZW50IHRvIHNlcnZlci4KKyAgICAgICAgSXQgc2hvdWxkIHJldHVybiBOb25lIGlmIHRoZSBjbGllbnQgYWJvcnQgcmVzcG9uc2UgJyonIHNob3VsZAorICAgICAgICBiZSBzZW50IGluc3RlYWQuCisgICAgICAgICIiIgorICAgICAgICBtZWNoID0gbWVjaGFuaXNtLnVwcGVyKCkKKyAgICAgICAgIyBYWFg6IHNob3VsZG4ndCB0aGlzIGNvZGUgYmUgcmVtb3ZlZCwgbm90IGNvbW1lbnRlZCBvdXQ/CisgICAgICAgICNjYXAgPSAnQVVUSD0lcycgJSBtZWNoCisgICAgICAgICNpZiBub3QgY2FwIGluIHNlbGYuY2FwYWJpbGl0aWVzOiAgICAgICAjIExldCB0aGUgc2VydmVyIGRlY2lkZSEKKyAgICAgICAgIyAgICByYWlzZSBzZWxmLmVycm9yKCJTZXJ2ZXIgZG9lc24ndCBhbGxvdyAlcyBhdXRoZW50aWNhdGlvbi4iICUgbWVjaCkKKyAgICAgICAgc2VsZi5saXRlcmFsID0gX0F1dGhlbnRpY2F0b3IoYXV0aG9iamVjdCkucHJvY2VzcworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdBVVRIRU5USUNBVEUnLCBtZWNoKQorICAgICAgICBpZiB0eXAgIT0gJ09LJzoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoZGF0Wy0xXSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9ICdBVVRIJworICAgICAgICByZXR1cm4gdHlwLCBkYXQKKworCisgICAgZGVmIGNhcGFiaWxpdHkoc2VsZik6CisgICAgICAgICIiIih0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmNhcGFiaWxpdHkoKQorICAgICAgICBGZXRjaCBjYXBhYmlsaXRpZXMgbGlzdCBmcm9tIHNlcnZlci4iIiIKKworICAgICAgICBuYW1lID0gJ0NBUEFCSUxJVFknCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisKKyAgICBkZWYgY2hlY2soc2VsZik6CisgICAgICAgICIiIkNoZWNrcG9pbnQgbWFpbGJveCBvbiBzZXJ2ZXIuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uY2hlY2soKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdDSEVDSycpCisKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgY3VycmVudGx5IHNlbGVjdGVkIG1haWxib3guCisKKyAgICAgICAgRGVsZXRlZCBtZXNzYWdlcyBhcmUgcmVtb3ZlZCBmcm9tIHdyaXRhYmxlIG1haWxib3guCisgICAgICAgIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIGNvbW1hbmQgYmVmb3JlICdMT0dPVVQnLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmNsb3NlKCkKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0NMT1NFJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnQVVUSCcKKyAgICAgICAgcmV0dXJuIHR5cCwgZGF0CisKKworICAgIGRlZiBjb3B5KHNlbGYsIG1lc3NhZ2Vfc2V0LCBuZXdfbWFpbGJveCk6CisgICAgICAgICIiIkNvcHkgJ21lc3NhZ2Vfc2V0JyBtZXNzYWdlcyBvbnRvIGVuZCBvZiAnbmV3X21haWxib3gnLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmNvcHkobWVzc2FnZV9zZXQsIG5ld19tYWlsYm94KQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdDT1BZJywgbWVzc2FnZV9zZXQsIG5ld19tYWlsYm94KQorCisKKyAgICBkZWYgY3JlYXRlKHNlbGYsIG1haWxib3gpOgorICAgICAgICAiIiJDcmVhdGUgbmV3IG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uY3JlYXRlKG1haWxib3gpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0NSRUFURScsIG1haWxib3gpCisKKworICAgIGRlZiBkZWxldGUoc2VsZiwgbWFpbGJveCk6CisgICAgICAgICIiIkRlbGV0ZSBvbGQgbWFpbGJveC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5kZWxldGUobWFpbGJveCkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZCgnREVMRVRFJywgbWFpbGJveCkKKworICAgIGRlZiBkZWxldGVhY2woc2VsZiwgbWFpbGJveCwgd2hvKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSBBQ0xzIChyZW1vdmUgYW55IHJpZ2h0cykgc2V0IGZvciB3aG8gb24gbWFpbGJveC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5kZWxldGVhY2wobWFpbGJveCwgd2hvKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdERUxFVEVBQ0wnLCBtYWlsYm94LCB3aG8pCisKKyAgICBkZWYgZXhwdW5nZShzZWxmKToKKyAgICAgICAgIiIiUGVybWFuZW50bHkgcmVtb3ZlIGRlbGV0ZWQgaXRlbXMgZnJvbSBzZWxlY3RlZCBtYWlsYm94LgorCisgICAgICAgIEdlbmVyYXRlcyAnRVhQVU5HRScgcmVzcG9uc2UgZm9yIGVhY2ggZGVsZXRlZCBtZXNzYWdlLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LmV4cHVuZ2UoKQorCisgICAgICAgICdkYXRhJyBpcyBsaXN0IG9mICdFWFBVTkdFJ2QgbWVzc2FnZSBudW1iZXJzIGluIG9yZGVyIHJlY2VpdmVkLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdFWFBVTkdFJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIGZldGNoKHNlbGYsIG1lc3NhZ2Vfc2V0LCBtZXNzYWdlX3BhcnRzKToKKyAgICAgICAgIiIiRmV0Y2ggKHBhcnRzIG9mKSBtZXNzYWdlcy4KKworICAgICAgICAodHlwLCBbZGF0YSwgLi4uXSkgPSA8aW5zdGFuY2U+LmZldGNoKG1lc3NhZ2Vfc2V0LCBtZXNzYWdlX3BhcnRzKQorCisgICAgICAgICdtZXNzYWdlX3BhcnRzJyBzaG91bGQgYmUgYSBzdHJpbmcgb2Ygc2VsZWN0ZWQgcGFydHMKKyAgICAgICAgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMsIGVnOiAiKFVJRCBCT0RZW1RFWFRdKSIuCisKKyAgICAgICAgJ2RhdGEnIGFyZSB0dXBsZXMgb2YgbWVzc2FnZSBwYXJ0IGVudmVsb3BlIGFuZCBkYXRhLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdGRVRDSCcKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCBtZXNzYWdlX3NldCwgbWVzc2FnZV9wYXJ0cykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisKKyAgICBkZWYgZ2V0YWNsKHNlbGYsIG1haWxib3gpOgorICAgICAgICAiIiJHZXQgdGhlIEFDTHMgZm9yIGEgbWFpbGJveC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5nZXRhY2wobWFpbGJveCkKKyAgICAgICAgIiIiCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0dFVEFDTCcsIG1haWxib3gpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ0FDTCcpCisKKworICAgIGRlZiBnZXRhbm5vdGF0aW9uKHNlbGYsIG1haWxib3gsIGVudHJ5LCBhdHRyaWJ1dGUpOgorICAgICAgICAiIiIodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5nZXRhbm5vdGF0aW9uKG1haWxib3gsIGVudHJ5LCBhdHRyaWJ1dGUpCisgICAgICAgIFJldHJpZXZlIEFOTk9UQVRJT05zLiIiIgorCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0dFVEFOTk9UQVRJT04nLCBtYWlsYm94LCBlbnRyeSwgYXR0cmlidXRlKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsICdBTk5PVEFUSU9OJykKKworCisgICAgZGVmIGdldHF1b3RhKHNlbGYsIHJvb3QpOgorICAgICAgICAiIiJHZXQgdGhlIHF1b3RhIHJvb3QncyByZXNvdXJjZSB1c2FnZSBhbmQgbGltaXRzLgorCisgICAgICAgIFBhcnQgb2YgdGhlIElNQVA0IFFVT1RBIGV4dGVuc2lvbiBkZWZpbmVkIGluIHJmYzIwODcuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uZ2V0cXVvdGEocm9vdCkKKyAgICAgICAgIiIiCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0dFVFFVT1RBJywgcm9vdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCAnUVVPVEEnKQorCisKKyAgICBkZWYgZ2V0cXVvdGFyb290KHNlbGYsIG1haWxib3gpOgorICAgICAgICAiIiJHZXQgdGhlIGxpc3Qgb2YgcXVvdGEgcm9vdHMgZm9yIHRoZSBuYW1lZCBtYWlsYm94LgorCisgICAgICAgICh0eXAsIFtbUVVPVEFST09UIHJlc3BvbnNlcy4uLl0sIFtRVU9UQSByZXNwb25zZXNdXSkgPSA8aW5zdGFuY2U+LmdldHF1b3Rhcm9vdChtYWlsYm94KQorICAgICAgICAiIiIKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZCgnR0VUUVVPVEFST09UJywgbWFpbGJveCkKKyAgICAgICAgdHlwLCBxdW90YSA9IHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCAnUVVPVEEnKQorICAgICAgICB0eXAsIHF1b3Rhcm9vdCA9IHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCAnUVVPVEFST09UJykKKyAgICAgICAgcmV0dXJuIHR5cCwgW3F1b3Rhcm9vdCwgcXVvdGFdCisKKworICAgIGRlZiBsaXN0KHNlbGYsIGRpcmVjdG9yeT0nIiInLCBwYXR0ZXJuPScqJyk6CisgICAgICAgICIiIkxpc3QgbWFpbGJveCBuYW1lcyBpbiBkaXJlY3RvcnkgbWF0Y2hpbmcgcGF0dGVybi4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5saXN0KGRpcmVjdG9yeT0nIiInLCBwYXR0ZXJuPScqJykKKworICAgICAgICAnZGF0YScgaXMgbGlzdCBvZiBMSVNUIHJlc3BvbnNlcy4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSAnTElTVCcKKyAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCBkaXJlY3RvcnksIHBhdHRlcm4pCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIGxvZ2luKHNlbGYsIHVzZXIsIHBhc3N3b3JkKToKKyAgICAgICAgIiIiSWRlbnRpZnkgY2xpZW50IHVzaW5nIHBsYWludGV4dCBwYXNzd29yZC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5sb2dpbih1c2VyLCBwYXNzd29yZCkKKworICAgICAgICBOQjogJ3Bhc3N3b3JkJyB3aWxsIGJlIHF1b3RlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0xPR0lOJywgdXNlciwgc2VsZi5fcXVvdGUocGFzc3dvcmQpKQorICAgICAgICBpZiB0eXAgIT0gJ09LJzoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoZGF0Wy0xXSkKKyAgICAgICAgc2VsZi5zdGF0ZSA9ICdBVVRIJworICAgICAgICByZXR1cm4gdHlwLCBkYXQKKworCisgICAgZGVmIGxvZ2luX2NyYW1fbWQ1KHNlbGYsIHVzZXIsIHBhc3N3b3JkKToKKyAgICAgICAgIiIiIEZvcmNlIHVzZSBvZiBDUkFNLU1ENSBhdXRoZW50aWNhdGlvbi4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5sb2dpbl9jcmFtX21kNSh1c2VyLCBwYXNzd29yZCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudXNlciwgc2VsZi5wYXNzd29yZCA9IHVzZXIsIHBhc3N3b3JkCisgICAgICAgIHJldHVybiBzZWxmLmF1dGhlbnRpY2F0ZSgnQ1JBTS1NRDUnLCBzZWxmLl9DUkFNX01ENV9BVVRIKQorCisKKyAgICBkZWYgX0NSQU1fTUQ1X0FVVEgoc2VsZiwgY2hhbGxlbmdlKToKKyAgICAgICAgIiIiIEF1dGhvYmplY3QgdG8gdXNlIHdpdGggQ1JBTS1NRDUgYXV0aGVudGljYXRpb24uICIiIgorICAgICAgICBpbXBvcnQgaG1hYworICAgICAgICByZXR1cm4gc2VsZi51c2VyICsgIiAiICsgaG1hYy5ITUFDKHNlbGYucGFzc3dvcmQsIGNoYWxsZW5nZSkuaGV4ZGlnZXN0KCkKKworCisgICAgZGVmIGxvZ291dChzZWxmKToKKyAgICAgICAgIiIiU2h1dGRvd24gY29ubmVjdGlvbiB0byBzZXJ2ZXIuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ubG9nb3V0KCkKKworICAgICAgICBSZXR1cm5zIHNlcnZlciAnQllFJyByZXNwb25zZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc3RhdGUgPSAnTE9HT1VUJworICAgICAgICB0cnk6IHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ0xPR09VVCcpCisgICAgICAgIGV4Y2VwdDogdHlwLCBkYXQgPSAnTk8nLCBbJyVzOiAlcycgJSBzeXMuZXhjX2luZm8oKVs6Ml1dCisgICAgICAgIHNlbGYuc2h1dGRvd24oKQorICAgICAgICBpZiAnQllFJyBpbiBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlczoKKyAgICAgICAgICAgIHJldHVybiAnQllFJywgc2VsZi51bnRhZ2dlZF9yZXNwb25zZXNbJ0JZRSddCisgICAgICAgIHJldHVybiB0eXAsIGRhdAorCisKKyAgICBkZWYgbHN1YihzZWxmLCBkaXJlY3Rvcnk9JyIiJywgcGF0dGVybj0nKicpOgorICAgICAgICAiIiJMaXN0ICdzdWJzY3JpYmVkJyBtYWlsYm94IG5hbWVzIGluIGRpcmVjdG9yeSBtYXRjaGluZyBwYXR0ZXJuLgorCisgICAgICAgICh0eXAsIFtkYXRhLCAuLi5dKSA9IDxpbnN0YW5jZT4ubHN1YihkaXJlY3Rvcnk9JyIiJywgcGF0dGVybj0nKicpCisKKyAgICAgICAgJ2RhdGEnIGFyZSB0dXBsZXMgb2YgbWVzc2FnZSBwYXJ0IGVudmVsb3BlIGFuZCBkYXRhLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdMU1VCJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsIGRpcmVjdG9yeSwgcGF0dGVybikKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisgICAgZGVmIG15cmlnaHRzKHNlbGYsIG1haWxib3gpOgorICAgICAgICAiIiJTaG93IG15IEFDTHMgZm9yIGEgbWFpbGJveCAoaS5lLiB0aGUgcmlnaHRzIHRoYXQgSSBoYXZlIG9uIG1haWxib3gpLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+Lm15cmlnaHRzKG1haWxib3gpCisgICAgICAgICIiIgorICAgICAgICB0eXAsZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ01ZUklHSFRTJywgbWFpbGJveCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCAnTVlSSUdIVFMnKQorCisgICAgZGVmIG5hbWVzcGFjZShzZWxmKToKKyAgICAgICAgIiIiIFJldHVybnMgSU1BUCBuYW1lc3BhY2VzIGFsYSByZmMyMzQyCisKKyAgICAgICAgKHR5cCwgW2RhdGEsIC4uLl0pID0gPGluc3RhbmNlPi5uYW1lc3BhY2UoKQorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdOQU1FU1BBQ0UnCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisKKyAgICBkZWYgbm9vcChzZWxmKToKKyAgICAgICAgIiIiU2VuZCBOT09QIGNvbW1hbmQuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ubm9vcCgpCisgICAgICAgICIiIgorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDM6CisgICAgICAgICAgICAgICAgc2VsZi5fZHVtcF91cihzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdOT09QJykKKworCisgICAgZGVmIHBhcnRpYWwoc2VsZiwgbWVzc2FnZV9udW0sIG1lc3NhZ2VfcGFydCwgc3RhcnQsIGxlbmd0aCk6CisgICAgICAgICIiIkZldGNoIHRydW5jYXRlZCBwYXJ0IG9mIGEgbWVzc2FnZS4KKworICAgICAgICAodHlwLCBbZGF0YSwgLi4uXSkgPSA8aW5zdGFuY2U+LnBhcnRpYWwobWVzc2FnZV9udW0sIG1lc3NhZ2VfcGFydCwgc3RhcnQsIGxlbmd0aCkKKworICAgICAgICAnZGF0YScgaXMgdHVwbGUgb2YgbWVzc2FnZSBwYXJ0IGVudmVsb3BlIGFuZCBkYXRhLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdQQVJUSUFMJworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsIG1lc3NhZ2VfbnVtLCBtZXNzYWdlX3BhcnQsIHN0YXJ0LCBsZW5ndGgpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ0ZFVENIJykKKworCisgICAgZGVmIHByb3h5YXV0aChzZWxmLCB1c2VyKToKKyAgICAgICAgIiIiQXNzdW1lIGF1dGhlbnRpY2F0aW9uIGFzICJ1c2VyIi4KKworICAgICAgICBBbGxvd3MgYW4gYXV0aG9yaXNlZCBhZG1pbmlzdHJhdG9yIHRvIHByb3h5IGludG8gYW55IHVzZXIncworICAgICAgICBtYWlsYm94LgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnByb3h5YXV0aCh1c2VyKQorICAgICAgICAiIiIKKworICAgICAgICBuYW1lID0gJ1BST1hZQVVUSCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdQUk9YWUFVVEgnLCB1c2VyKQorCisKKyAgICBkZWYgcmVuYW1lKHNlbGYsIG9sZG1haWxib3gsIG5ld21haWxib3gpOgorICAgICAgICAiIiJSZW5hbWUgb2xkIG1haWxib3ggbmFtZSB0byBuZXcuCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4ucmVuYW1lKG9sZG1haWxib3gsIG5ld21haWxib3gpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ1JFTkFNRScsIG9sZG1haWxib3gsIG5ld21haWxib3gpCisKKworICAgIGRlZiBzZWFyY2goc2VsZiwgY2hhcnNldCwgKmNyaXRlcmlhKToKKyAgICAgICAgIiIiU2VhcmNoIG1haWxib3ggZm9yIG1hdGNoaW5nIG1lc3NhZ2VzLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnNlYXJjaChjaGFyc2V0LCBjcml0ZXJpb24sIC4uLikKKworICAgICAgICAnZGF0YScgaXMgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgbWF0Y2hpbmcgbWVzc2FnZSBudW1iZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdTRUFSQ0gnCisgICAgICAgIGlmIGNoYXJzZXQ6CisgICAgICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsICdDSEFSU0VUJywgY2hhcnNldCwgKmNyaXRlcmlhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHlwLCBkYXQgPSBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCAqY3JpdGVyaWEpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgbmFtZSkKKworCisgICAgZGVmIHNlbGVjdChzZWxmLCBtYWlsYm94PSdJTkJPWCcsIHJlYWRvbmx5PUZhbHNlKToKKyAgICAgICAgIiIiU2VsZWN0IGEgbWFpbGJveC4KKworICAgICAgICBGbHVzaCBhbGwgdW50YWdnZWQgcmVzcG9uc2VzLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnNlbGVjdChtYWlsYm94PSdJTkJPWCcsIHJlYWRvbmx5PUZhbHNlKQorCisgICAgICAgICdkYXRhJyBpcyBjb3VudCBvZiBtZXNzYWdlcyBpbiBtYWlsYm94ICgnRVhJU1RTJyByZXNwb25zZSkuCisKKyAgICAgICAgTWFuZGF0ZWQgcmVzcG9uc2VzIGFyZSAoJ0ZMQUdTJywgJ0VYSVNUUycsICdSRUNFTlQnLCAnVUlEVkFMSURJVFknKSwgc28KKyAgICAgICAgb3RoZXIgcmVzcG9uc2VzIHNob3VsZCBiZSBvYnRhaW5lZCB2aWEgPGluc3RhbmNlPi5yZXNwb25zZSgnRkxBR1MnKSBldGMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlcyA9IHt9ICAgICMgRmx1c2ggb2xkIHJlc3BvbnNlcy4KKyAgICAgICAgc2VsZi5pc19yZWFkb25seSA9IHJlYWRvbmx5CisgICAgICAgIGlmIHJlYWRvbmx5OgorICAgICAgICAgICAgbmFtZSA9ICdFWEFNSU5FJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9ICdTRUxFQ1QnCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgbWFpbGJveCkKKyAgICAgICAgaWYgdHlwICE9ICdPSyc6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ0FVVEgnICAgICAjIE1pZ2h0IGhhdmUgYmVlbiAnU0VMRUNURUQnCisgICAgICAgICAgICByZXR1cm4gdHlwLCBkYXQKKyAgICAgICAgc2VsZi5zdGF0ZSA9ICdTRUxFQ1RFRCcKKyAgICAgICAgaWYgJ1JFQUQtT05MWScgaW4gc2VsZi51bnRhZ2dlZF9yZXNwb25zZXMgXAorICAgICAgICAgICAgICAgIGFuZCBub3QgcmVhZG9ubHk6CisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdW1wX3VyKHNlbGYudW50YWdnZWRfcmVzcG9uc2VzKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5yZWFkb25seSgnJXMgaXMgbm90IHdyaXRhYmxlJyAlIG1haWxib3gpCisgICAgICAgIHJldHVybiB0eXAsIHNlbGYudW50YWdnZWRfcmVzcG9uc2VzLmdldCgnRVhJU1RTJywgW05vbmVdKQorCisKKyAgICBkZWYgc2V0YWNsKHNlbGYsIG1haWxib3gsIHdobywgd2hhdCk6CisgICAgICAgICIiIlNldCBhIG1haWxib3ggYWNsLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnNldGFjbChtYWlsYm94LCB3aG8sIHdoYXQpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ1NFVEFDTCcsIG1haWxib3gsIHdobywgd2hhdCkKKworCisgICAgZGVmIHNldGFubm90YXRpb24oc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiIodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5zZXRhbm5vdGF0aW9uKG1haWxib3hbLCBlbnRyeSwgYXR0cmlidXRlXSspCisgICAgICAgIFNldCBBTk5PVEFUSU9Ocy4iIiIKKworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdTRVRBTk5PVEFUSU9OJywgKmFyZ3MpCisgICAgICAgIHJldHVybiBzZWxmLl91bnRhZ2dlZF9yZXNwb25zZSh0eXAsIGRhdCwgJ0FOTk9UQVRJT04nKQorCisKKyAgICBkZWYgc2V0cXVvdGEoc2VsZiwgcm9vdCwgbGltaXRzKToKKyAgICAgICAgIiIiU2V0IHRoZSBxdW90YSByb290J3MgcmVzb3VyY2UgbGltaXRzLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnNldHF1b3RhKHJvb3QsIGxpbWl0cykKKyAgICAgICAgIiIiCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ1NFVFFVT1RBJywgcm9vdCwgbGltaXRzKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsICdRVU9UQScpCisKKworICAgIGRlZiBzb3J0KHNlbGYsIHNvcnRfY3JpdGVyaWEsIGNoYXJzZXQsICpzZWFyY2hfY3JpdGVyaWEpOgorICAgICAgICAiIiJJTUFQNHJldjEgZXh0ZW5zaW9uIFNPUlQgY29tbWFuZC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5zb3J0KHNvcnRfY3JpdGVyaWEsIGNoYXJzZXQsIHNlYXJjaF9jcml0ZXJpYSwgLi4uKQorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdTT1JUJworICAgICAgICAjaWYgbm90IG5hbWUgaW4gc2VsZi5jYXBhYmlsaXRpZXM6ICAgICAgIyBMZXQgdGhlIHNlcnZlciBkZWNpZGUhCisgICAgICAgICMgICAgICAgcmFpc2Ugc2VsZi5lcnJvcigndW5pbXBsZW1lbnRlZCBleHRlbnNpb24gY29tbWFuZDogJXMnICUgbmFtZSkKKyAgICAgICAgaWYgKHNvcnRfY3JpdGVyaWFbMF0sc29ydF9jcml0ZXJpYVstMV0pICE9ICgnKCcsJyknKToKKyAgICAgICAgICAgIHNvcnRfY3JpdGVyaWEgPSAnKCVzKScgJSBzb3J0X2NyaXRlcmlhCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgc29ydF9jcml0ZXJpYSwgY2hhcnNldCwgKnNlYXJjaF9jcml0ZXJpYSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisKKyAgICBkZWYgc3RhdHVzKHNlbGYsIG1haWxib3gsIG5hbWVzKToKKyAgICAgICAgIiIiUmVxdWVzdCBuYW1lZCBzdGF0dXMgY29uZGl0aW9ucyBmb3IgbWFpbGJveC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi5zdGF0dXMobWFpbGJveCwgbmFtZXMpCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gJ1NUQVRVUycKKyAgICAgICAgI2lmIHNlbGYuUFJPVE9DT0xfVkVSU0lPTiA9PSAnSU1BUDQnOiAgICMgTGV0IHRoZSBzZXJ2ZXIgZGVjaWRlIQorICAgICAgICAjICAgIHJhaXNlIHNlbGYuZXJyb3IoJyVzIHVuaW1wbGVtZW50ZWQgaW4gSU1BUDQgKG9idGFpbiBJTUFQNHJldjEgc2VydmVyLCBvciByZS1jb2RlKScgJSBuYW1lKQorICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKG5hbWUsIG1haWxib3gsIG5hbWVzKQorICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsIG5hbWUpCisKKworICAgIGRlZiBzdG9yZShzZWxmLCBtZXNzYWdlX3NldCwgY29tbWFuZCwgZmxhZ3MpOgorICAgICAgICAiIiJBbHRlcnMgZmxhZyBkaXNwb3NpdGlvbnMgZm9yIG1lc3NhZ2VzIGluIG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uc3RvcmUobWVzc2FnZV9zZXQsIGNvbW1hbmQsIGZsYWdzKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgKGZsYWdzWzBdLGZsYWdzWy0xXSkgIT0gKCcoJywnKScpOgorICAgICAgICAgICAgZmxhZ3MgPSAnKCVzKScgJSBmbGFncyAgIyBBdm9pZCBxdW90aW5nIHRoZSBmbGFncworICAgICAgICB0eXAsIGRhdCA9IHNlbGYuX3NpbXBsZV9jb21tYW5kKCdTVE9SRScsIG1lc3NhZ2Vfc2V0LCBjb21tYW5kLCBmbGFncykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCAnRkVUQ0gnKQorCisKKyAgICBkZWYgc3Vic2NyaWJlKHNlbGYsIG1haWxib3gpOgorICAgICAgICAiIiJTdWJzY3JpYmUgdG8gbmV3IG1haWxib3guCisKKyAgICAgICAgKHR5cCwgW2RhdGFdKSA9IDxpbnN0YW5jZT4uc3Vic2NyaWJlKG1haWxib3gpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2ltcGxlX2NvbW1hbmQoJ1NVQlNDUklCRScsIG1haWxib3gpCisKKworICAgIGRlZiB0aHJlYWQoc2VsZiwgdGhyZWFkaW5nX2FsZ29yaXRobSwgY2hhcnNldCwgKnNlYXJjaF9jcml0ZXJpYSk6CisgICAgICAgICIiIklNQVByZXYxIGV4dGVuc2lvbiBUSFJFQUQgY29tbWFuZC4KKworICAgICAgICAodHlwZSwgW2RhdGFdKSA9IDxpbnN0YW5jZT4udGhyZWFkKHRocmVhZGluZ19hbGdvcml0aG0sIGNoYXJzZXQsIHNlYXJjaF9jcml0ZXJpYSwgLi4uKQorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9ICdUSFJFQUQnCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgdGhyZWFkaW5nX2FsZ29yaXRobSwgY2hhcnNldCwgKnNlYXJjaF9jcml0ZXJpYSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VudGFnZ2VkX3Jlc3BvbnNlKHR5cCwgZGF0LCBuYW1lKQorCisKKyAgICBkZWYgdWlkKHNlbGYsIGNvbW1hbmQsICphcmdzKToKKyAgICAgICAgIiIiRXhlY3V0ZSAiY29tbWFuZCBhcmcgLi4uIiB3aXRoIG1lc3NhZ2VzIGlkZW50aWZpZWQgYnkgVUlELAorICAgICAgICAgICAgICAgIHJhdGhlciB0aGFuIG1lc3NhZ2UgbnVtYmVyLgorCisgICAgICAgICh0eXAsIFtkYXRhXSkgPSA8aW5zdGFuY2U+LnVpZChjb21tYW5kLCBhcmcxLCBhcmcyLCAuLi4pCisKKyAgICAgICAgUmV0dXJucyByZXNwb25zZSBhcHByb3ByaWF0ZSB0byAnY29tbWFuZCcuCisgICAgICAgICIiIgorICAgICAgICBjb21tYW5kID0gY29tbWFuZC51cHBlcigpCisgICAgICAgIGlmIG5vdCBjb21tYW5kIGluIENvbW1hbmRzOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5lcnJvcigiVW5rbm93biBJTUFQNCBVSUQgY29tbWFuZDogJXMiICUgY29tbWFuZCkKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSBub3QgaW4gQ29tbWFuZHNbY29tbWFuZF06CisgICAgICAgICAgICByYWlzZSBzZWxmLmVycm9yKCJjb21tYW5kICVzIGlsbGVnYWwgaW4gc3RhdGUgJXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgYWxsb3dlZCBpbiBzdGF0ZXMgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbW1hbmQsIHNlbGYuc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLCAnLmpvaW4oQ29tbWFuZHNbY29tbWFuZF0pKSkKKyAgICAgICAgbmFtZSA9ICdVSUQnCisgICAgICAgIHR5cCwgZGF0ID0gc2VsZi5fc2ltcGxlX2NvbW1hbmQobmFtZSwgY29tbWFuZCwgKmFyZ3MpCisgICAgICAgIGlmIGNvbW1hbmQgaW4gKCdTRUFSQ0gnLCAnU09SVCcsICdUSFJFQUQnKToKKyAgICAgICAgICAgIG5hbWUgPSBjb21tYW5kCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gJ0ZFVENIJworICAgICAgICByZXR1cm4gc2VsZi5fdW50YWdnZWRfcmVzcG9uc2UodHlwLCBkYXQsIG5hbWUpCisKKworICAgIGRlZiB1bnN1YnNjcmliZShzZWxmLCBtYWlsYm94KToKKyAgICAgICAgIiIiVW5zdWJzY3JpYmUgZnJvbSBvbGQgbWFpbGJveC4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi51bnN1YnNjcmliZShtYWlsYm94KQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NpbXBsZV9jb21tYW5kKCdVTlNVQlNDUklCRScsIG1haWxib3gpCisKKworICAgIGRlZiB4YXRvbShzZWxmLCBuYW1lLCAqYXJncyk6CisgICAgICAgICIiIkFsbG93IHNpbXBsZSBleHRlbnNpb24gY29tbWFuZHMKKyAgICAgICAgICAgICAgICBub3RpZmllZCBieSBzZXJ2ZXIgaW4gQ0FQQUJJTElUWSByZXNwb25zZS4KKworICAgICAgICBBc3N1bWVzIGNvbW1hbmQgaXMgbGVnYWwgaW4gY3VycmVudCBzdGF0ZS4KKworICAgICAgICAodHlwLCBbZGF0YV0pID0gPGluc3RhbmNlPi54YXRvbShuYW1lLCBhcmcsIC4uLikKKworICAgICAgICBSZXR1cm5zIHJlc3BvbnNlIGFwcHJvcHJpYXRlIHRvIGV4dGVuc2lvbiBjb21tYW5kIGBuYW1lJy4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLnVwcGVyKCkKKyAgICAgICAgI2lmIG5vdCBuYW1lIGluIHNlbGYuY2FwYWJpbGl0aWVzOiAgICAgICMgTGV0IHRoZSBzZXJ2ZXIgZGVjaWRlIQorICAgICAgICAjICAgIHJhaXNlIHNlbGYuZXJyb3IoJ3Vua25vd24gZXh0ZW5zaW9uIGNvbW1hbmQ6ICVzJyAlIG5hbWUpCisgICAgICAgIGlmIG5vdCBuYW1lIGluIENvbW1hbmRzOgorICAgICAgICAgICAgQ29tbWFuZHNbbmFtZV0gPSAoc2VsZi5zdGF0ZSwpCisgICAgICAgIHJldHVybiBzZWxmLl9zaW1wbGVfY29tbWFuZChuYW1lLCAqYXJncykKKworCisKKyAgICAjICAgICAgIFByaXZhdGUgbWV0aG9kcworCisKKyAgICBkZWYgX2FwcGVuZF91bnRhZ2dlZChzZWxmLCB0eXAsIGRhdCk6CisKKyAgICAgICAgaWYgZGF0IGlzIE5vbmU6IGRhdCA9ICcnCisgICAgICAgIHVyID0gc2VsZi51bnRhZ2dlZF9yZXNwb25zZXMKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSA1OgorICAgICAgICAgICAgICAgIHNlbGYuX21lc2coJ3VudGFnZ2VkX3Jlc3BvbnNlc1slc10gJXMgKz0gWyIlcyJdJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAodHlwLCBsZW4odXIuZ2V0KHR5cCwnJykpLCBkYXQpKQorICAgICAgICBpZiB0eXAgaW4gdXI6CisgICAgICAgICAgICB1clt0eXBdLmFwcGVuZChkYXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1clt0eXBdID0gW2RhdF0KKworCisgICAgZGVmIF9jaGVja19ieWUoc2VsZik6CisgICAgICAgIGJ5ZSA9IHNlbGYudW50YWdnZWRfcmVzcG9uc2VzLmdldCgnQllFJykKKyAgICAgICAgaWYgYnllOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5hYm9ydChieWVbLTFdKQorCisKKyAgICBkZWYgX2NvbW1hbmQoc2VsZiwgbmFtZSwgKmFyZ3MpOgorCisgICAgICAgIGlmIHNlbGYuc3RhdGUgbm90IGluIENvbW1hbmRzW25hbWVdOgorICAgICAgICAgICAgc2VsZi5saXRlcmFsID0gTm9uZQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5lcnJvcigiY29tbWFuZCAlcyBpbGxlZ2FsIGluIHN0YXRlICVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IGFsbG93ZWQgaW4gc3RhdGVzICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBzZWxmLnN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgJy5qb2luKENvbW1hbmRzW25hbWVdKSkpCisKKyAgICAgICAgZm9yIHR5cCBpbiAoJ09LJywgJ05PJywgJ0JBRCcpOgorICAgICAgICAgICAgaWYgdHlwIGluIHNlbGYudW50YWdnZWRfcmVzcG9uc2VzOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlc1t0eXBdCisKKyAgICAgICAgaWYgJ1JFQUQtT05MWScgaW4gc2VsZi51bnRhZ2dlZF9yZXNwb25zZXMgXAorICAgICAgICBhbmQgbm90IHNlbGYuaXNfcmVhZG9ubHk6CisgICAgICAgICAgICByYWlzZSBzZWxmLnJlYWRvbmx5KCdtYWlsYm94IHN0YXR1cyBjaGFuZ2VkIHRvIFJFQUQtT05MWScpCisKKyAgICAgICAgdGFnID0gc2VsZi5fbmV3X3RhZygpCisgICAgICAgIGRhdGEgPSAnJXMgJXMnICUgKHRhZywgbmFtZSkKKyAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgaWYgYXJnIGlzIE5vbmU6IGNvbnRpbnVlCisgICAgICAgICAgICBkYXRhID0gJyVzICVzJyAlIChkYXRhLCBzZWxmLl9jaGVja3F1b3RlKGFyZykpCisKKyAgICAgICAgbGl0ZXJhbCA9IHNlbGYubGl0ZXJhbAorICAgICAgICBpZiBsaXRlcmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5saXRlcmFsID0gTm9uZQorICAgICAgICAgICAgaWYgdHlwZShsaXRlcmFsKSBpcyB0eXBlKHNlbGYuX2NvbW1hbmQpOgorICAgICAgICAgICAgICAgIGxpdGVyYXRvciA9IGxpdGVyYWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGl0ZXJhdG9yID0gTm9uZQorICAgICAgICAgICAgICAgIGRhdGEgPSAnJXMgeyVzfScgJSAoZGF0YSwgbGVuKGxpdGVyYWwpKQorCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gNDoKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCc+ICVzJyAlIGRhdGEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvZygnPiAlcycgJSBkYXRhKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2VuZCgnJXMlcycgJSAoZGF0YSwgQ1JMRikpCisgICAgICAgIGV4Y2VwdCAoc29ja2V0LmVycm9yLCBPU0Vycm9yKSwgdmFsOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5hYm9ydCgnc29ja2V0IGVycm9yOiAlcycgJSB2YWwpCisKKyAgICAgICAgaWYgbGl0ZXJhbCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHRhZworCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIFdhaXQgZm9yIGNvbnRpbnVhdGlvbiByZXNwb25zZQorCisgICAgICAgICAgICB3aGlsZSBzZWxmLl9nZXRfcmVzcG9uc2UoKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRhZ2dlZF9jb21tYW5kc1t0YWddOiAgICMgQkFEL05PPworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFnCisKKyAgICAgICAgICAgICMgU2VuZCBsaXRlcmFsCisKKyAgICAgICAgICAgIGlmIGxpdGVyYXRvcjoKKyAgICAgICAgICAgICAgICBsaXRlcmFsID0gbGl0ZXJhdG9yKHNlbGYuY29udGludWF0aW9uX3Jlc3BvbnNlKQorCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSA0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCd3cml0ZSBsaXRlcmFsIHNpemUgJXMnICUgbGVuKGxpdGVyYWwpKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kKGxpdGVyYWwpCisgICAgICAgICAgICAgICAgc2VsZi5zZW5kKENSTEYpCisgICAgICAgICAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgT1NFcnJvciksIHZhbDoKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLmFib3J0KCdzb2NrZXQgZXJyb3I6ICVzJyAlIHZhbCkKKworICAgICAgICAgICAgaWYgbm90IGxpdGVyYXRvcjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIHJldHVybiB0YWcKKworCisgICAgZGVmIF9jb21tYW5kX2NvbXBsZXRlKHNlbGYsIG5hbWUsIHRhZyk6CisgICAgICAgICMgQllFIGlzIGV4cGVjdGVkIGFmdGVyIExPR09VVAorICAgICAgICBpZiBuYW1lICE9ICdMT0dPVVQnOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfYnllKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHlwLCBkYXRhID0gc2VsZi5fZ2V0X3RhZ2dlZF9yZXNwb25zZSh0YWcpCisgICAgICAgIGV4Y2VwdCBzZWxmLmFib3J0LCB2YWw6CisgICAgICAgICAgICByYWlzZSBzZWxmLmFib3J0KCdjb21tYW5kOiAlcyA9PiAlcycgJSAobmFtZSwgdmFsKSkKKyAgICAgICAgZXhjZXB0IHNlbGYuZXJyb3IsIHZhbDoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZXJyb3IoJ2NvbW1hbmQ6ICVzID0+ICVzJyAlIChuYW1lLCB2YWwpKQorICAgICAgICBpZiBuYW1lICE9ICdMT0dPVVQnOgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfYnllKCkKKyAgICAgICAgaWYgdHlwID09ICdCQUQnOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5lcnJvcignJXMgY29tbWFuZCBlcnJvcjogJXMgJXMnICUgKG5hbWUsIHR5cCwgZGF0YSkpCisgICAgICAgIHJldHVybiB0eXAsIGRhdGEKKworCisgICAgZGVmIF9nZXRfcmVzcG9uc2Uoc2VsZik6CisKKyAgICAgICAgIyBSZWFkIHJlc3BvbnNlIGFuZCBzdG9yZS4KKyAgICAgICAgIworICAgICAgICAjIFJldHVybnMgTm9uZSBmb3IgY29udGludWF0aW9uIHJlc3BvbnNlcywKKyAgICAgICAgIyBvdGhlcndpc2UgZmlyc3QgcmVzcG9uc2UgbGluZSByZWNlaXZlZC4KKworICAgICAgICByZXNwID0gc2VsZi5fZ2V0X2xpbmUoKQorCisgICAgICAgICMgQ29tbWFuZCBjb21wbGV0aW9uIHJlc3BvbnNlPworCisgICAgICAgIGlmIHNlbGYuX21hdGNoKHNlbGYudGFncmUsIHJlc3ApOgorICAgICAgICAgICAgdGFnID0gc2VsZi5tby5ncm91cCgndGFnJykKKyAgICAgICAgICAgIGlmIG5vdCB0YWcgaW4gc2VsZi50YWdnZWRfY29tbWFuZHM6CisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5hYm9ydCgndW5leHBlY3RlZCB0YWdnZWQgcmVzcG9uc2U6ICVzJyAlIHJlc3ApCisKKyAgICAgICAgICAgIHR5cCA9IHNlbGYubW8uZ3JvdXAoJ3R5cGUnKQorICAgICAgICAgICAgZGF0ID0gc2VsZi5tby5ncm91cCgnZGF0YScpCisgICAgICAgICAgICBzZWxmLnRhZ2dlZF9jb21tYW5kc1t0YWddID0gKHR5cCwgW2RhdF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXQyID0gTm9uZQorCisgICAgICAgICAgICAjICcqJyAodW50YWdnZWQpIHJlc3BvbnNlcz8KKworICAgICAgICAgICAgaWYgbm90IHNlbGYuX21hdGNoKFVudGFnZ2VkX3Jlc3BvbnNlLCByZXNwKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9tYXRjaChVbnRhZ2dlZF9zdGF0dXMsIHJlc3ApOgorICAgICAgICAgICAgICAgICAgICBkYXQyID0gc2VsZi5tby5ncm91cCgnZGF0YTInKQorCisgICAgICAgICAgICBpZiBzZWxmLm1vIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBPbmx5IG90aGVyIHBvc3NpYmlsaXR5IGlzICcrJyAoY29udGludWF0aW9uKSByZXNwb25zZS4uLgorCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbWF0Y2goQ29udGludWF0aW9uLCByZXNwKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb250aW51YXRpb25fcmVzcG9uc2UgPSBzZWxmLm1vLmdyb3VwKCdkYXRhJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUgICAgICMgTkI6IGluZGljYXRlcyBjb250aW51YXRpb24KKworICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYuYWJvcnQoInVuZXhwZWN0ZWQgcmVzcG9uc2U6ICclcyciICUgcmVzcCkKKworICAgICAgICAgICAgdHlwID0gc2VsZi5tby5ncm91cCgndHlwZScpCisgICAgICAgICAgICBkYXQgPSBzZWxmLm1vLmdyb3VwKCdkYXRhJykKKyAgICAgICAgICAgIGlmIGRhdCBpcyBOb25lOiBkYXQgPSAnJyAgICAgICAgIyBOdWxsIHVudGFnZ2VkIHJlc3BvbnNlCisgICAgICAgICAgICBpZiBkYXQyOiBkYXQgPSBkYXQgKyAnICcgKyBkYXQyCisKKyAgICAgICAgICAgICMgSXMgdGhlcmUgYSBsaXRlcmFsIHRvIGNvbWU/CisKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuX21hdGNoKExpdGVyYWwsIGRhdCk6CisKKyAgICAgICAgICAgICAgICAjIFJlYWQgbGl0ZXJhbCBkaXJlY3QgZnJvbSBjb25uZWN0aW9uLgorCisgICAgICAgICAgICAgICAgc2l6ZSA9IGludChzZWxmLm1vLmdyb3VwKCdzaXplJykpCisgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID49IDQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCdyZWFkIGxpdGVyYWwgc2l6ZSAlcycgJSBzaXplKQorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlYWQoc2l6ZSkKKworICAgICAgICAgICAgICAgICMgU3RvcmUgcmVzcG9uc2Ugd2l0aCBsaXRlcmFsIGFzIHR1cGxlCisKKyAgICAgICAgICAgICAgICBzZWxmLl9hcHBlbmRfdW50YWdnZWQodHlwLCAoZGF0LCBkYXRhKSkKKworICAgICAgICAgICAgICAgICMgUmVhZCB0cmFpbGVyIC0gcG9zc2libHkgY29udGFpbmluZyBhbm90aGVyIGxpdGVyYWwKKworICAgICAgICAgICAgICAgIGRhdCA9IHNlbGYuX2dldF9saW5lKCkKKworICAgICAgICAgICAgc2VsZi5fYXBwZW5kX3VudGFnZ2VkKHR5cCwgZGF0KQorCisgICAgICAgICMgQnJhY2tldGVkIHJlc3BvbnNlIGluZm9ybWF0aW9uPworCisgICAgICAgIGlmIHR5cCBpbiAoJ09LJywgJ05PJywgJ0JBRCcpIGFuZCBzZWxmLl9tYXRjaChSZXNwb25zZV9jb2RlLCBkYXQpOgorICAgICAgICAgICAgc2VsZi5fYXBwZW5kX3VudGFnZ2VkKHNlbGYubW8uZ3JvdXAoJ3R5cGUnKSwgc2VsZi5tby5ncm91cCgnZGF0YScpKQorCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMSBhbmQgdHlwIGluICgnTk8nLCAnQkFEJywgJ0JZRScpOgorICAgICAgICAgICAgICAgIHNlbGYuX21lc2coJyVzIHJlc3BvbnNlOiAlcycgJSAodHlwLCBkYXQpKQorCisgICAgICAgIHJldHVybiByZXNwCisKKworICAgIGRlZiBfZ2V0X3RhZ2dlZF9yZXNwb25zZShzZWxmLCB0YWcpOgorCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnRhZ2dlZF9jb21tYW5kc1t0YWddCisgICAgICAgICAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYudGFnZ2VkX2NvbW1hbmRzW3RhZ10KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgICMgU29tZSBoYXZlIHJlcG9ydGVkICJ1bmV4cGVjdGVkIHJlc3BvbnNlIiBleGNlcHRpb25zLgorICAgICAgICAgICAgIyBOb3RlIHRoYXQgaWdub3JpbmcgdGhlbSBoZXJlIGNhdXNlcyBsb29wcy4KKyAgICAgICAgICAgICMgSW5zdGVhZCwgc2VuZCBtZSBkZXRhaWxzIG9mIHRoZSB1bmV4cGVjdGVkIHJlc3BvbnNlIGFuZAorICAgICAgICAgICAgIyBJJ2xsIHVwZGF0ZSB0aGUgY29kZSBpbiBgX2dldF9yZXNwb25zZSgpJy4KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2dldF9yZXNwb25zZSgpCisgICAgICAgICAgICBleGNlcHQgc2VsZi5hYm9ydCwgdmFsOgorICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9sb2coKQorICAgICAgICAgICAgICAgIHJhaXNlCisKKworICAgIGRlZiBfZ2V0X2xpbmUoc2VsZik6CisKKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuYWJvcnQoJ3NvY2tldCBlcnJvcjogRU9GJykKKworICAgICAgICAjIFByb3RvY29sIG1hbmRhdGVzIGFsbCBsaW5lcyB0ZXJtaW5hdGVkIGJ5IENSTEYKKyAgICAgICAgaWYgbm90IGxpbmUuZW5kc3dpdGgoJ1xyXG4nKToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuYWJvcnQoJ3NvY2tldCBlcnJvcjogdW50ZXJtaW5hdGVkIGxpbmUnKQorCisgICAgICAgIGxpbmUgPSBsaW5lWzotMl0KKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSA0OgorICAgICAgICAgICAgICAgIHNlbGYuX21lc2coJzwgJXMnICUgbGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fbG9nKCc8ICVzJyAlIGxpbmUpCisgICAgICAgIHJldHVybiBsaW5lCisKKworICAgIGRlZiBfbWF0Y2goc2VsZiwgY3JlLCBzKToKKworICAgICAgICAjIFJ1biBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2ggbWV0aG9kIG9uICdzJy4KKyAgICAgICAgIyBTYXZlIHJlc3VsdCwgcmV0dXJuIHN1Y2Nlc3MuCisKKyAgICAgICAgc2VsZi5tbyA9IGNyZS5tYXRjaChzKQorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBpZiBzZWxmLm1vIGlzIG5vdCBOb25lIGFuZCBzZWxmLmRlYnVnID49IDU6CisgICAgICAgICAgICAgICAgc2VsZi5fbWVzZygiXHRtYXRjaGVkIHInJXMnID0+ICVyIiAlIChjcmUucGF0dGVybiwgc2VsZi5tby5ncm91cHMoKSkpCisgICAgICAgIHJldHVybiBzZWxmLm1vIGlzIG5vdCBOb25lCisKKworICAgIGRlZiBfbmV3X3RhZyhzZWxmKToKKworICAgICAgICB0YWcgPSAnJXMlcycgJSAoc2VsZi50YWdwcmUsIHNlbGYudGFnbnVtKQorICAgICAgICBzZWxmLnRhZ251bSA9IHNlbGYudGFnbnVtICsgMQorICAgICAgICBzZWxmLnRhZ2dlZF9jb21tYW5kc1t0YWddID0gTm9uZQorICAgICAgICByZXR1cm4gdGFnCisKKworICAgIGRlZiBfY2hlY2txdW90ZShzZWxmLCBhcmcpOgorCisgICAgICAgICMgTXVzdCBxdW90ZSBjb21tYW5kIGFyZ3MgaWYgbm9uLWFscGhhbnVtZXJpYyBjaGFycyBwcmVzZW50LAorICAgICAgICAjIGFuZCBub3QgYWxyZWFkeSBxdW90ZWQuCisKKyAgICAgICAgaWYgdHlwZShhcmcpIGlzIG5vdCB0eXBlKCcnKToKKyAgICAgICAgICAgIHJldHVybiBhcmcKKyAgICAgICAgaWYgbGVuKGFyZykgPj0gMiBhbmQgKGFyZ1swXSxhcmdbLTFdKSBpbiAoKCcoJywnKScpLCgnIicsJyInKSk6CisgICAgICAgICAgICByZXR1cm4gYXJnCisgICAgICAgIGlmIGFyZyBhbmQgc2VsZi5tdXN0cXVvdGUuc2VhcmNoKGFyZykgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBhcmcKKyAgICAgICAgcmV0dXJuIHNlbGYuX3F1b3RlKGFyZykKKworCisgICAgZGVmIF9xdW90ZShzZWxmLCBhcmcpOgorCisgICAgICAgIGFyZyA9IGFyZy5yZXBsYWNlKCdcXCcsICdcXFxcJykKKyAgICAgICAgYXJnID0gYXJnLnJlcGxhY2UoJyInLCAnXFwiJykKKworICAgICAgICByZXR1cm4gJyIlcyInICUgYXJnCisKKworICAgIGRlZiBfc2ltcGxlX2NvbW1hbmQoc2VsZiwgbmFtZSwgKmFyZ3MpOgorCisgICAgICAgIHJldHVybiBzZWxmLl9jb21tYW5kX2NvbXBsZXRlKG5hbWUsIHNlbGYuX2NvbW1hbmQobmFtZSwgKmFyZ3MpKQorCisKKyAgICBkZWYgX3VudGFnZ2VkX3Jlc3BvbnNlKHNlbGYsIHR5cCwgZGF0LCBuYW1lKToKKworICAgICAgICBpZiB0eXAgPT0gJ05PJzoKKyAgICAgICAgICAgIHJldHVybiB0eXAsIGRhdAorICAgICAgICBpZiBub3QgbmFtZSBpbiBzZWxmLnVudGFnZ2VkX3Jlc3BvbnNlczoKKyAgICAgICAgICAgIHJldHVybiB0eXAsIFtOb25lXQorICAgICAgICBkYXRhID0gc2VsZi51bnRhZ2dlZF9yZXNwb25zZXMucG9wKG5hbWUpCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gNToKKyAgICAgICAgICAgICAgICBzZWxmLl9tZXNnKCd1bnRhZ2dlZF9yZXNwb25zZXNbJXNdID0+ICVzJyAlIChuYW1lLCBkYXRhKSkKKyAgICAgICAgcmV0dXJuIHR5cCwgZGF0YQorCisKKyAgICBpZiBfX2RlYnVnX186CisKKyAgICAgICAgZGVmIF9tZXNnKHNlbGYsIHMsIHNlY3M9Tm9uZSk6CisgICAgICAgICAgICBpZiBzZWNzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VjcyA9IHRpbWUudGltZSgpCisgICAgICAgICAgICB0bSA9IHRpbWUuc3RyZnRpbWUoJyVNOiVTJywgdGltZS5sb2NhbHRpbWUoc2VjcykpCisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCcgICVzLiUwMmQgJXNcbicgJSAodG0sIChzZWNzKjEwMCklMTAwLCBzKSkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorCisgICAgICAgIGRlZiBfZHVtcF91cihzZWxmLCBkaWN0KToKKyAgICAgICAgICAgICMgRHVtcCB1bnRhZ2dlZCByZXNwb25zZXMgKGluIGBkaWN0JykuCisgICAgICAgICAgICBsID0gZGljdC5pdGVtcygpCisgICAgICAgICAgICBpZiBub3QgbDogcmV0dXJuCisgICAgICAgICAgICB0ID0gJ1xuXHRcdCcKKyAgICAgICAgICAgIGwgPSBtYXAobGFtYmRhIHg6JyVzOiAiJXMiJyAlICh4WzBdLCB4WzFdWzBdIGFuZCAnIiAiJy5qb2luKHhbMV0pIG9yICcnKSwgbCkKKyAgICAgICAgICAgIHNlbGYuX21lc2coJ3VudGFnZ2VkIHJlc3BvbnNlcyBkdW1wOiVzJXMnICUgKHQsIHQuam9pbihsKSkpCisKKyAgICAgICAgZGVmIF9sb2coc2VsZiwgbGluZSk6CisgICAgICAgICAgICAjIEtlZXAgbG9nIG9mIGxhc3QgYF9jbWRfbG9nX2xlbicgaW50ZXJhY3Rpb25zIGZvciBkZWJ1Z2dpbmcuCisgICAgICAgICAgICBzZWxmLl9jbWRfbG9nW3NlbGYuX2NtZF9sb2dfaWR4XSA9IChsaW5lLCB0aW1lLnRpbWUoKSkKKyAgICAgICAgICAgIHNlbGYuX2NtZF9sb2dfaWR4ICs9IDEKKyAgICAgICAgICAgIGlmIHNlbGYuX2NtZF9sb2dfaWR4ID49IHNlbGYuX2NtZF9sb2dfbGVuOgorICAgICAgICAgICAgICAgIHNlbGYuX2NtZF9sb2dfaWR4ID0gMAorCisgICAgICAgIGRlZiBwcmludF9sb2coc2VsZik6CisgICAgICAgICAgICBzZWxmLl9tZXNnKCdsYXN0ICVkIElNQVA0IGludGVyYWN0aW9uczonICUgbGVuKHNlbGYuX2NtZF9sb2cpKQorICAgICAgICAgICAgaSwgbiA9IHNlbGYuX2NtZF9sb2dfaWR4LCBzZWxmLl9jbWRfbG9nX2xlbgorICAgICAgICAgICAgd2hpbGUgbjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX21lc2coKnNlbGYuX2NtZF9sb2dbaV0pCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgaWYgaSA+PSBzZWxmLl9jbWRfbG9nX2xlbjoKKyAgICAgICAgICAgICAgICAgICAgaSA9IDAKKyAgICAgICAgICAgICAgICBuIC09IDEKKworCisKK3RyeToKKyAgICBpbXBvcnQgc3NsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBJTUFQNF9TU0woSU1BUDQpOgorCisgICAgICAgICIiIklNQVA0IGNsaWVudCBjbGFzcyBvdmVyIFNTTCBjb25uZWN0aW9uCisKKyAgICAgICAgSW5zdGFudGlhdGUgd2l0aDogSU1BUDRfU1NMKFtob3N0WywgcG9ydFssIGtleWZpbGVbLCBjZXJ0ZmlsZV1dXV0pCisKKyAgICAgICAgICAgICAgICBob3N0IC0gaG9zdCdzIG5hbWUgKGRlZmF1bHQ6IGxvY2FsaG9zdCk7CisgICAgICAgICAgICAgICAgcG9ydCAtIHBvcnQgbnVtYmVyIChkZWZhdWx0OiBzdGFuZGFyZCBJTUFQNCBTU0wgcG9ydCkuCisgICAgICAgICAgICAgICAga2V5ZmlsZSAtIFBFTSBmb3JtYXR0ZWQgZmlsZSB0aGF0IGNvbnRhaW5zIHlvdXIgcHJpdmF0ZSBrZXkgKGRlZmF1bHQ6IE5vbmUpOworICAgICAgICAgICAgICAgIGNlcnRmaWxlIC0gUEVNIGZvcm1hdHRlZCBjZXJ0aWZpY2F0ZSBjaGFpbiBmaWxlIChkZWZhdWx0OiBOb25lKTsKKworICAgICAgICBmb3IgbW9yZSBkb2N1bWVudGF0aW9uIHNlZSB0aGUgZG9jc3RyaW5nIG9mIHRoZSBwYXJlbnQgY2xhc3MgSU1BUDQuCisgICAgICAgICIiIgorCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QgPSAnJywgcG9ydCA9IElNQVA0X1NTTF9QT1JULCBrZXlmaWxlID0gTm9uZSwgY2VydGZpbGUgPSBOb25lKToKKyAgICAgICAgICAgIHNlbGYua2V5ZmlsZSA9IGtleWZpbGUKKyAgICAgICAgICAgIHNlbGYuY2VydGZpbGUgPSBjZXJ0ZmlsZQorICAgICAgICAgICAgSU1BUDQuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCkKKworCisgICAgICAgIGRlZiBvcGVuKHNlbGYsIGhvc3QgPSAnJywgcG9ydCA9IElNQVA0X1NTTF9QT1JUKToKKyAgICAgICAgICAgICIiIlNldHVwIGNvbm5lY3Rpb24gdG8gcmVtb3RlIHNlcnZlciBvbiAiaG9zdDpwb3J0Ii4KKyAgICAgICAgICAgICAgICAoZGVmYXVsdDogbG9jYWxob3N0OnN0YW5kYXJkIElNQVA0IFNTTCBwb3J0KS4KKyAgICAgICAgICAgIFRoaXMgY29ubmVjdGlvbiB3aWxsIGJlIHVzZWQgYnkgdGhlIHJvdXRpbmVzOgorICAgICAgICAgICAgICAgIHJlYWQsIHJlYWRsaW5lLCBzZW5kLCBzaHV0ZG93bi4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChob3N0LCBwb3J0KSkKKyAgICAgICAgICAgIHNlbGYuc3Nsb2JqID0gc3NsLndyYXBfc29ja2V0KHNlbGYuc29jaywgc2VsZi5rZXlmaWxlLCBzZWxmLmNlcnRmaWxlKQorICAgICAgICAgICAgc2VsZi5maWxlID0gc2VsZi5zc2xvYmoubWFrZWZpbGUoJ3JiJykKKworCisgICAgICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICAgICAgIiIiUmVhZCAnc2l6ZScgYnl0ZXMgZnJvbSByZW1vdGUuIiIiCisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWQoc2l6ZSkKKworCisgICAgICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgICAgICIiIlJlYWQgbGluZSBmcm9tIHJlbW90ZS4iIiIKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGUucmVhZGxpbmUoKQorCisKKyAgICAgICAgZGVmIHNlbmQoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICAiIiJTZW5kIGRhdGEgdG8gcmVtb3RlLiIiIgorICAgICAgICAgICAgYnl0ZXMgPSBsZW4oZGF0YSkKKyAgICAgICAgICAgIHdoaWxlIGJ5dGVzID4gMDoKKyAgICAgICAgICAgICAgICBzZW50ID0gc2VsZi5zc2xvYmoud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICBpZiBzZW50ID09IGJ5dGVzOgorICAgICAgICAgICAgICAgICAgICBicmVhayAgICAjIGF2b2lkIGNvcHkKKyAgICAgICAgICAgICAgICBkYXRhID0gZGF0YVtzZW50Ol0KKyAgICAgICAgICAgICAgICBieXRlcyA9IGJ5dGVzIC0gc2VudAorCisKKyAgICAgICAgZGVmIHNodXRkb3duKHNlbGYpOgorICAgICAgICAgICAgIiIiQ2xvc2UgSS9PIGVzdGFibGlzaGVkIGluICJvcGVuIi4iIiIKKyAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorCisKKyAgICAgICAgZGVmIHNvY2tldChzZWxmKToKKyAgICAgICAgICAgICIiIlJldHVybiBzb2NrZXQgaW5zdGFuY2UgdXNlZCB0byBjb25uZWN0IHRvIElNQVA0IHNlcnZlci4KKworICAgICAgICAgICAgc29ja2V0ID0gPGluc3RhbmNlPi5zb2NrZXQoKQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zb2NrCisKKworICAgICAgICBkZWYgc3NsKHNlbGYpOgorICAgICAgICAgICAgIiIiUmV0dXJuIFNTTE9iamVjdCBpbnN0YW5jZSB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIElNQVA0IHNlcnZlci4KKworICAgICAgICAgICAgc3NsID0gc3NsLndyYXBfc29ja2V0KDxpbnN0YW5jZT4uc29ja2V0KQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xvYmoKKworICAgIF9fYWxsX18uYXBwZW5kKCJJTUFQNF9TU0wiKQorCisKK2NsYXNzIElNQVA0X3N0cmVhbShJTUFQNCk6CisKKyAgICAiIiJJTUFQNCBjbGllbnQgY2xhc3Mgb3ZlciBhIHN0cmVhbQorCisgICAgSW5zdGFudGlhdGUgd2l0aDogSU1BUDRfc3RyZWFtKGNvbW1hbmQpCisKKyAgICAgICAgICAgIHdoZXJlICJjb21tYW5kIiBpcyBhIHN0cmluZyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gc3VicHJvY2Vzcy5Qb3BlbigpCisKKyAgICBmb3IgbW9yZSBkb2N1bWVudGF0aW9uIHNlZSB0aGUgZG9jc3RyaW5nIG9mIHRoZSBwYXJlbnQgY2xhc3MgSU1BUDQuCisgICAgIiIiCisKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21tYW5kKToKKyAgICAgICAgc2VsZi5jb21tYW5kID0gY29tbWFuZAorICAgICAgICBJTUFQNC5fX2luaXRfXyhzZWxmKQorCisKKyAgICBkZWYgb3BlbihzZWxmLCBob3N0ID0gTm9uZSwgcG9ydCA9IE5vbmUpOgorICAgICAgICAiIiJTZXR1cCBhIHN0cmVhbSBjb25uZWN0aW9uLgorICAgICAgICBUaGlzIGNvbm5lY3Rpb24gd2lsbCBiZSB1c2VkIGJ5IHRoZSByb3V0aW5lczoKKyAgICAgICAgICAgIHJlYWQsIHJlYWRsaW5lLCBzZW5kLCBzaHV0ZG93bi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuaG9zdCA9IE5vbmUgICAgICAgICMgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwYXJlbnQgY2xhc3MKKyAgICAgICAgc2VsZi5wb3J0ID0gTm9uZQorICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbihzZWxmLmNvbW1hbmQsCisgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICBzaGVsbD1UcnVlLCBjbG9zZV9mZHM9VHJ1ZSkKKyAgICAgICAgc2VsZi53cml0ZWZpbGUgPSBzZWxmLnByb2Nlc3Muc3RkaW4KKyAgICAgICAgc2VsZi5yZWFkZmlsZSA9IHNlbGYucHJvY2Vzcy5zdGRvdXQKKworCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CisgICAgICAgICIiIlJlYWQgJ3NpemUnIGJ5dGVzIGZyb20gcmVtb3RlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZmlsZS5yZWFkKHNpemUpCisKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgIiIiUmVhZCBsaW5lIGZyb20gcmVtb3RlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5yZWFkZmlsZS5yZWFkbGluZSgpCisKKworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJTZW5kIGRhdGEgdG8gcmVtb3RlLiIiIgorICAgICAgICBzZWxmLndyaXRlZmlsZS53cml0ZShkYXRhKQorICAgICAgICBzZWxmLndyaXRlZmlsZS5mbHVzaCgpCisKKworICAgIGRlZiBzaHV0ZG93bihzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgSS9PIGVzdGFibGlzaGVkIGluICJvcGVuIi4iIiIKKyAgICAgICAgc2VsZi5yZWFkZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYud3JpdGVmaWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5wcm9jZXNzLndhaXQoKQorCisKKworY2xhc3MgX0F1dGhlbnRpY2F0b3I6CisKKyAgICAiIiJQcml2YXRlIGNsYXNzIHRvIHByb3ZpZGUgZW4vZGVjb2RpbmcKKyAgICAgICAgICAgIGZvciBiYXNlNjQtYmFzZWQgYXV0aGVudGljYXRpb24gY29udmVyc2F0aW9uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lY2hpbnN0KToKKyAgICAgICAgc2VsZi5tZWNoID0gbWVjaGluc3QgICAgIyBDYWxsYWJsZSBvYmplY3QgdG8gcHJvdmlkZS9wcm9jZXNzIGRhdGEKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGRhdGEpOgorICAgICAgICByZXQgPSBzZWxmLm1lY2goc2VsZi5kZWNvZGUoZGF0YSkpCisgICAgICAgIGlmIHJldCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICcqJyAgICAgICMgQWJvcnQgY29udmVyc2F0aW9uCisgICAgICAgIHJldHVybiBzZWxmLmVuY29kZShyZXQpCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucCk6CisgICAgICAgICMKKyAgICAgICAgIyAgSW52b2tlIGJpbmFzY2lpLmIyYV9iYXNlNjQgaXRlcmF0aXZlbHkgd2l0aAorICAgICAgICAjICBzaG9ydCBldmVuIGxlbmd0aCBidWZmZXJzLCBzdHJpcCB0aGUgdHJhaWxpbmcKKyAgICAgICAgIyAgbGluZSBmZWVkIGZyb20gdGhlIHJlc3VsdCBhbmQgYXBwZW5kLiAgIkV2ZW4iCisgICAgICAgICMgIG1lYW5zIGEgbnVtYmVyIHRoYXQgZmFjdG9ycyB0byBib3RoIDYgYW5kIDgsCisgICAgICAgICMgIHNvIHdoZW4gaXQgZ2V0cyB0byB0aGUgZW5kIG9mIHRoZSA4LWJpdCBpbnB1dAorICAgICAgICAjICB0aGVyZSdzIG5vIHBhcnRpYWwgNi1iaXQgb3V0cHV0LgorICAgICAgICAjCisgICAgICAgIG91cCA9ICcnCisgICAgICAgIHdoaWxlIGlucDoKKyAgICAgICAgICAgIGlmIGxlbihpbnApID4gNDg6CisgICAgICAgICAgICAgICAgdCA9IGlucFs6NDhdCisgICAgICAgICAgICAgICAgaW5wID0gaW5wWzQ4Ol0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdCA9IGlucAorICAgICAgICAgICAgICAgIGlucCA9ICcnCisgICAgICAgICAgICBlID0gYmluYXNjaWkuYjJhX2Jhc2U2NCh0KQorICAgICAgICAgICAgaWYgZToKKyAgICAgICAgICAgICAgICBvdXAgPSBvdXAgKyBlWzotMV0KKyAgICAgICAgcmV0dXJuIG91cAorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnApOgorICAgICAgICBpZiBub3QgaW5wOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIHJldHVybiBiaW5hc2NpaS5hMmJfYmFzZTY0KGlucCkKKworCisKK01vbjJudW0gPSB7J0phbic6IDEsICdGZWInOiAyLCAnTWFyJzogMywgJ0Fwcic6IDQsICdNYXknOiA1LCAnSnVuJzogNiwKKyAgICAgICAgJ0p1bCc6IDcsICdBdWcnOiA4LCAnU2VwJzogOSwgJ09jdCc6IDEwLCAnTm92JzogMTEsICdEZWMnOiAxMn0KKworZGVmIEludGVybmFsZGF0ZTJ0dXBsZShyZXNwKToKKyAgICAiIiJQYXJzZSBhbiBJTUFQNCBJTlRFUk5BTERBVEUgc3RyaW5nLgorCisgICAgUmV0dXJuIGNvcnJlc3BvbmRpbmcgbG9jYWwgdGltZS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYQorICAgIHRpbWUuc3RydWN0X3RpbWUgaW5zdGFuY2Ugb3IgTm9uZSBpZiB0aGUgc3RyaW5nIGhhcyB3cm9uZyBmb3JtYXQuCisgICAgIiIiCisKKyAgICBtbyA9IEludGVybmFsRGF0ZS5tYXRjaChyZXNwKQorICAgIGlmIG5vdCBtbzoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIG1vbiA9IE1vbjJudW1bbW8uZ3JvdXAoJ21vbicpXQorICAgIHpvbmVuID0gbW8uZ3JvdXAoJ3pvbmVuJykKKworICAgIGRheSA9IGludChtby5ncm91cCgnZGF5JykpCisgICAgeWVhciA9IGludChtby5ncm91cCgneWVhcicpKQorICAgIGhvdXIgPSBpbnQobW8uZ3JvdXAoJ2hvdXInKSkKKyAgICBtaW4gPSBpbnQobW8uZ3JvdXAoJ21pbicpKQorICAgIHNlYyA9IGludChtby5ncm91cCgnc2VjJykpCisgICAgem9uZWggPSBpbnQobW8uZ3JvdXAoJ3pvbmVoJykpCisgICAgem9uZW0gPSBpbnQobW8uZ3JvdXAoJ3pvbmVtJykpCisKKyAgICAjIElOVEVSTkFMREFURSB0aW1lem9uZSBtdXN0IGJlIHN1YnRyYWN0ZWQgdG8gZ2V0IFVUCisKKyAgICB6b25lID0gKHpvbmVoKjYwICsgem9uZW0pKjYwCisgICAgaWYgem9uZW4gPT0gJy0nOgorICAgICAgICB6b25lID0gLXpvbmUKKworICAgIHR0ID0gKHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYywgLTEsIC0xLCAtMSkKKworICAgIHV0YyA9IHRpbWUubWt0aW1lKHR0KQorCisgICAgIyBGb2xsb3dpbmcgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHRpbWUgbW9kdWxlIGhhcyBubyAnbWtnbXRpbWUnLgorICAgICMgJ21rdGltZScgYXNzdW1lcyBhcmcgaW4gbG9jYWwgdGltZXpvbmUsIHNvIGFkZHMgdGltZXpvbmUvYWx0em9uZS4KKworICAgIGx0ID0gdGltZS5sb2NhbHRpbWUodXRjKQorICAgIGlmIHRpbWUuZGF5bGlnaHQgYW5kIGx0Wy0xXToKKyAgICAgICAgem9uZSA9IHpvbmUgKyB0aW1lLmFsdHpvbmUKKyAgICBlbHNlOgorICAgICAgICB6b25lID0gem9uZSArIHRpbWUudGltZXpvbmUKKworICAgIHJldHVybiB0aW1lLmxvY2FsdGltZSh1dGMgLSB6b25lKQorCisKKworZGVmIEludDJBUChudW0pOgorCisgICAgIiIiQ29udmVydCBpbnRlZ2VyIHRvIEEtUCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIiIiCisKKyAgICB2YWwgPSAnJzsgQVAgPSAnQUJDREVGR0hJSktMTU5PUCcKKyAgICBudW0gPSBpbnQoYWJzKG51bSkpCisgICAgd2hpbGUgbnVtOgorICAgICAgICBudW0sIG1vZCA9IGRpdm1vZChudW0sIDE2KQorICAgICAgICB2YWwgPSBBUFttb2RdICsgdmFsCisgICAgcmV0dXJuIHZhbAorCisKKworZGVmIFBhcnNlRmxhZ3MocmVzcCk6CisKKyAgICAiIiJDb252ZXJ0IElNQVA0IGZsYWdzIHJlc3BvbnNlIHRvIHB5dGhvbiB0dXBsZS4iIiIKKworICAgIG1vID0gRmxhZ3MubWF0Y2gocmVzcCkKKyAgICBpZiBub3QgbW86CisgICAgICAgIHJldHVybiAoKQorCisgICAgcmV0dXJuIHR1cGxlKG1vLmdyb3VwKCdmbGFncycpLnNwbGl0KCkpCisKKworZGVmIFRpbWUySW50ZXJuYWxkYXRlKGRhdGVfdGltZSk6CisKKyAgICAiIiJDb252ZXJ0IGRhdGVfdGltZSB0byBJTUFQNCBJTlRFUk5BTERBVEUgcmVwcmVzZW50YXRpb24uCisKKyAgICBSZXR1cm4gc3RyaW5nIGluIGZvcm06ICciREQtTW1tLVlZWVkgSEg6TU06U1MgK0hITU0iJy4gIFRoZQorICAgIGRhdGVfdGltZSBhcmd1bWVudCBjYW4gYmUgYSBudW1iZXIgKGludCBvciBmbG9hdCkgcmVwcmVzZW50aW5nCisgICAgc2Vjb25kcyBzaW5jZSBlcG9jaCAoYXMgcmV0dXJuZWQgYnkgdGltZS50aW1lKCkpLCBhIDktdHVwbGUKKyAgICByZXByZXNlbnRpbmcgbG9jYWwgdGltZSAoYXMgcmV0dXJuZWQgYnkgdGltZS5sb2NhbHRpbWUoKSksIG9yIGEKKyAgICBkb3VibGUtcXVvdGVkIHN0cmluZy4gIEluIHRoZSBsYXN0IGNhc2UsIGl0IGlzIGFzc3VtZWQgdG8gYWxyZWFkeQorICAgIGJlIGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KKyAgICAiIiIKKworICAgIGlmIGlzaW5zdGFuY2UoZGF0ZV90aW1lLCAoaW50LCBmbG9hdCkpOgorICAgICAgICB0dCA9IHRpbWUubG9jYWx0aW1lKGRhdGVfdGltZSkKKyAgICBlbGlmIGlzaW5zdGFuY2UoZGF0ZV90aW1lLCAodHVwbGUsIHRpbWUuc3RydWN0X3RpbWUpKToKKyAgICAgICAgdHQgPSBkYXRlX3RpbWUKKyAgICBlbGlmIGlzaW5zdGFuY2UoZGF0ZV90aW1lLCBzdHIpIGFuZCAoZGF0ZV90aW1lWzBdLGRhdGVfdGltZVstMV0pID09ICgnIicsJyInKToKKyAgICAgICAgcmV0dXJuIGRhdGVfdGltZSAgICAgICAgIyBBc3N1bWUgaW4gY29ycmVjdCBmb3JtYXQKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkYXRlX3RpbWUgbm90IG9mIGEga25vd24gdHlwZSIpCisKKyAgICBkdCA9IHRpbWUuc3RyZnRpbWUoIiVkLSViLSVZICVIOiVNOiVTIiwgdHQpCisgICAgaWYgZHRbMF0gPT0gJzAnOgorICAgICAgICBkdCA9ICcgJyArIGR0WzE6XQorICAgIGlmIHRpbWUuZGF5bGlnaHQgYW5kIHR0Wy0xXToKKyAgICAgICAgem9uZSA9IC10aW1lLmFsdHpvbmUKKyAgICBlbHNlOgorICAgICAgICB6b25lID0gLXRpbWUudGltZXpvbmUKKyAgICByZXR1cm4gJyInICsgZHQgKyAiICUrMDNkJTAyZCIgJSBkaXZtb2Qoem9uZS8vNjAsIDYwKSArICciJworCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKworICAgICMgVG8gdGVzdDogaW52b2tlIGVpdGhlciBhcyAncHl0aG9uIGltYXBsaWIucHkgW0lNQVA0X3NlcnZlcl9ob3N0bmFtZV0nCisgICAgIyBvciAncHl0aG9uIGltYXBsaWIucHkgLXMgInJzaCBJTUFQNF9zZXJ2ZXJfaG9zdG5hbWUgZXhlYyAvZXRjL3JpbWFwZCInCisgICAgIyB0byB0ZXN0IHRoZSBJTUFQNF9zdHJlYW0gY2xhc3MKKworICAgIGltcG9ydCBnZXRvcHQsIGdldHBhc3MKKworICAgIHRyeToKKyAgICAgICAgb3B0bGlzdCwgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnZDpzOicpCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgdmFsOgorICAgICAgICBvcHRsaXN0LCBhcmdzID0gKCksICgpCisKKyAgICBzdHJlYW1fY29tbWFuZCA9IE5vbmUKKyAgICBmb3Igb3B0LHZhbCBpbiBvcHRsaXN0OgorICAgICAgICBpZiBvcHQgPT0gJy1kJzoKKyAgICAgICAgICAgIERlYnVnID0gaW50KHZhbCkKKyAgICAgICAgZWxpZiBvcHQgPT0gJy1zJzoKKyAgICAgICAgICAgIHN0cmVhbV9jb21tYW5kID0gdmFsCisgICAgICAgICAgICBpZiBub3QgYXJnczogYXJncyA9IChzdHJlYW1fY29tbWFuZCwpCisKKyAgICBpZiBub3QgYXJnczogYXJncyA9ICgnJywpCisKKyAgICBob3N0ID0gYXJnc1swXQorCisgICAgVVNFUiA9IGdldHBhc3MuZ2V0dXNlcigpCisgICAgUEFTU1dEID0gZ2V0cGFzcy5nZXRwYXNzKCJJTUFQIHBhc3N3b3JkIGZvciAlcyBvbiAlczogIiAlIChVU0VSLCBob3N0IG9yICJsb2NhbGhvc3QiKSkKKworICAgIHRlc3RfbWVzZyA9ICdGcm9tOiAlKHVzZXIpc0Bsb2NhbGhvc3QlKGxmKXNTdWJqZWN0OiBJTUFQNCB0ZXN0JShsZilzJShsZilzZGF0YS4uLiUobGYpcycgJSB7J3VzZXInOlVTRVIsICdsZic6J1xuJ30KKyAgICB0ZXN0X3NlcTEgPSAoCisgICAgKCdsb2dpbicsIChVU0VSLCBQQVNTV0QpKSwKKyAgICAoJ2NyZWF0ZScsICgnL3RtcC94eHggMScsKSksCisgICAgKCdyZW5hbWUnLCAoJy90bXAveHh4IDEnLCAnL3RtcC95eXknKSksCisgICAgKCdDUkVBVEUnLCAoJy90bXAveXl6IDInLCkpLAorICAgICgnYXBwZW5kJywgKCcvdG1wL3l5eiAyJywgTm9uZSwgTm9uZSwgdGVzdF9tZXNnKSksCisgICAgKCdsaXN0JywgKCcvdG1wJywgJ3l5KicpKSwKKyAgICAoJ3NlbGVjdCcsICgnL3RtcC95eXogMicsKSksCisgICAgKCdzZWFyY2gnLCAoTm9uZSwgJ1NVQkpFQ1QnLCAndGVzdCcpKSwKKyAgICAoJ2ZldGNoJywgKCcxJywgJyhGTEFHUyBJTlRFUk5BTERBVEUgUkZDODIyKScpKSwKKyAgICAoJ3N0b3JlJywgKCcxJywgJ0ZMQUdTJywgJyhcRGVsZXRlZCknKSksCisgICAgKCduYW1lc3BhY2UnLCAoKSksCisgICAgKCdleHB1bmdlJywgKCkpLAorICAgICgncmVjZW50JywgKCkpLAorICAgICgnY2xvc2UnLCAoKSksCisgICAgKQorCisgICAgdGVzdF9zZXEyID0gKAorICAgICgnc2VsZWN0JywgKCkpLAorICAgICgncmVzcG9uc2UnLCgnVUlEVkFMSURJVFknLCkpLAorICAgICgndWlkJywgKCdTRUFSQ0gnLCAnQUxMJykpLAorICAgICgncmVzcG9uc2UnLCAoJ0VYSVNUUycsKSksCisgICAgKCdhcHBlbmQnLCAoTm9uZSwgTm9uZSwgTm9uZSwgdGVzdF9tZXNnKSksCisgICAgKCdyZWNlbnQnLCAoKSksCisgICAgKCdsb2dvdXQnLCAoKSksCisgICAgKQorCisgICAgZGVmIHJ1bihjbWQsIGFyZ3MpOgorICAgICAgICBNLl9tZXNnKCclcyAlcycgJSAoY21kLCBhcmdzKSkKKyAgICAgICAgdHlwLCBkYXQgPSBnZXRhdHRyKE0sIGNtZCkoKmFyZ3MpCisgICAgICAgIE0uX21lc2coJyVzID0+ICVzICVzJyAlIChjbWQsIHR5cCwgZGF0KSkKKyAgICAgICAgaWYgdHlwID09ICdOTyc6IHJhaXNlIGRhdFswXQorICAgICAgICByZXR1cm4gZGF0CisKKyAgICB0cnk6CisgICAgICAgIGlmIHN0cmVhbV9jb21tYW5kOgorICAgICAgICAgICAgTSA9IElNQVA0X3N0cmVhbShzdHJlYW1fY29tbWFuZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIE0gPSBJTUFQNChob3N0KQorICAgICAgICBpZiBNLnN0YXRlID09ICdBVVRIJzoKKyAgICAgICAgICAgIHRlc3Rfc2VxMSA9IHRlc3Rfc2VxMVsxOl0gICAjIExvZ2luIG5vdCBuZWVkZWQKKyAgICAgICAgTS5fbWVzZygnUFJPVE9DT0xfVkVSU0lPTiA9ICVzJyAlIE0uUFJPVE9DT0xfVkVSU0lPTikKKyAgICAgICAgTS5fbWVzZygnQ0FQQUJJTElUSUVTID0gJXInICUgKE0uY2FwYWJpbGl0aWVzLCkpCisKKyAgICAgICAgZm9yIGNtZCxhcmdzIGluIHRlc3Rfc2VxMToKKyAgICAgICAgICAgIHJ1bihjbWQsIGFyZ3MpCisKKyAgICAgICAgZm9yIG1sIGluIHJ1bignbGlzdCcsICgnL3RtcC8nLCAneXklJykpOgorICAgICAgICAgICAgbW8gPSByZS5tYXRjaChyJy4qIihbXiJdKykiJCcsIG1sKQorICAgICAgICAgICAgaWYgbW86IHBhdGggPSBtby5ncm91cCgxKQorICAgICAgICAgICAgZWxzZTogcGF0aCA9IG1sLnNwbGl0KClbLTFdCisgICAgICAgICAgICBydW4oJ2RlbGV0ZScsIChwYXRoLCkpCisKKyAgICAgICAgZm9yIGNtZCxhcmdzIGluIHRlc3Rfc2VxMjoKKyAgICAgICAgICAgIGRhdCA9IHJ1bihjbWQsIGFyZ3MpCisKKyAgICAgICAgICAgIGlmIChjbWQsYXJncykgIT0gKCd1aWQnLCAoJ1NFQVJDSCcsICdBTEwnKSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdWlkID0gZGF0Wy0xXS5zcGxpdCgpCisgICAgICAgICAgICBpZiBub3QgdWlkOiBjb250aW51ZQorICAgICAgICAgICAgcnVuKCd1aWQnLCAoJ0ZFVENIJywgJyVzJyAlIHVpZFstMV0sCisgICAgICAgICAgICAgICAgICAgICcoRkxBR1MgSU5URVJOQUxEQVRFIFJGQzgyMi5TSVpFIFJGQzgyMi5IRUFERVIgUkZDODIyLlRFWFQpJykpCisKKyAgICAgICAgcHJpbnQgJ1xuQWxsIHRlc3RzIE9LLicKKworICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQgJ1xuVGVzdHMgZmFpbGVkLicKKworICAgICAgICBpZiBub3QgRGVidWc6CisgICAgICAgICAgICBwcmludCAnJycKK0lmIHlvdSB3b3VsZCBsaWtlIHRvIHNlZSBkZWJ1Z2dpbmcgb3V0cHV0LAordHJ5OiAlcyAtZDUKKycnJyAlIHN5cy5hcmd2WzBdCisKKyAgICAgICAgcmFpc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaW1hcGxpYi5weWMgYi9saWIvcHl0aG9uMi43L2ltYXBsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMzk2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltYXBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaW1hcGxpYi5weW8gYi9saWIvcHl0aG9uMi43L2ltYXBsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGI1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltYXBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvaW1naGRyLnB5IGIvbGliL3B5dGhvbjIuNy9pbWdoZHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4MzAyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1naGRyLnB5CkBAIC0wLDAgKzEsMTYxIEBACisiIiJSZWNvZ25pemUgaW1hZ2UgZmlsZSBmb3JtYXRzIGJhc2VkIG9uIHRoZWlyIGZpcnN0IGZldyBieXRlcy4iIiIKKworX19hbGxfXyA9IFsid2hhdCJdCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIyBSZWNvZ25pemUgaW1hZ2UgaGVhZGVycyAjCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKworZGVmIHdoYXQoZmlsZSwgaD1Ob25lKToKKyAgICBpZiBoIGlzIE5vbmU6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlsZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlLCAncmInKQorICAgICAgICAgICAgaCA9IGYucmVhZCgzMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvY2F0aW9uID0gZmlsZS50ZWxsKCkKKyAgICAgICAgICAgIGggPSBmaWxlLnJlYWQoMzIpCisgICAgICAgICAgICBmaWxlLnNlZWsobG9jYXRpb24pCisgICAgICAgICAgICBmID0gTm9uZQorICAgIGVsc2U6CisgICAgICAgIGYgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBmb3IgdGYgaW4gdGVzdHM6CisgICAgICAgICAgICByZXMgPSB0ZihoLCBmKQorICAgICAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgICAgIHJldHVybiByZXMKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBmOiBmLmNsb3NlKCkKKyAgICByZXR1cm4gTm9uZQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisjIFN1YnJvdXRpbmVzIHBlciBpbWFnZSBmaWxlIHR5cGUgIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKwordGVzdHMgPSBbXQorCitkZWYgdGVzdF9qcGVnKGgsIGYpOgorICAgICIiIkpQRUcgZGF0YSBpbiBKRklGIGZvcm1hdCIiIgorICAgIGlmIGhbNjoxMF0gPT0gJ0pGSUYnOgorICAgICAgICByZXR1cm4gJ2pwZWcnCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X2pwZWcpCisKK2RlZiB0ZXN0X2V4aWYoaCwgZik6CisgICAgIiIiSlBFRyBkYXRhIGluIEV4aWYgZm9ybWF0IiIiCisgICAgaWYgaFs2OjEwXSA9PSAnRXhpZic6CisgICAgICAgIHJldHVybiAnanBlZycKKwordGVzdHMuYXBwZW5kKHRlc3RfZXhpZikKKworZGVmIHRlc3RfcG5nKGgsIGYpOgorICAgIGlmIGhbOjhdID09ICJcMjExUE5HXHJcblwwMzJcbiI6CisgICAgICAgIHJldHVybiAncG5nJworCit0ZXN0cy5hcHBlbmQodGVzdF9wbmcpCisKK2RlZiB0ZXN0X2dpZihoLCBmKToKKyAgICAiIiJHSUYgKCc4NyBhbmQgJzg5IHZhcmlhbnRzKSIiIgorICAgIGlmIGhbOjZdIGluICgnR0lGODdhJywgJ0dJRjg5YScpOgorICAgICAgICByZXR1cm4gJ2dpZicKKwordGVzdHMuYXBwZW5kKHRlc3RfZ2lmKQorCitkZWYgdGVzdF90aWZmKGgsIGYpOgorICAgICIiIlRJRkYgKGNhbiBiZSBpbiBNb3Rvcm9sYSBvciBJbnRlbCBieXRlIG9yZGVyKSIiIgorICAgIGlmIGhbOjJdIGluICgnTU0nLCAnSUknKToKKyAgICAgICAgcmV0dXJuICd0aWZmJworCit0ZXN0cy5hcHBlbmQodGVzdF90aWZmKQorCitkZWYgdGVzdF9yZ2IoaCwgZik6CisgICAgIiIiU0dJIGltYWdlIGxpYnJhcnkiIiIKKyAgICBpZiBoWzoyXSA9PSAnXDAwMVwzMzInOgorICAgICAgICByZXR1cm4gJ3JnYicKKwordGVzdHMuYXBwZW5kKHRlc3RfcmdiKQorCitkZWYgdGVzdF9wYm0oaCwgZik6CisgICAgIiIiUEJNIChwb3J0YWJsZSBiaXRtYXApIiIiCisgICAgaWYgbGVuKGgpID49IDMgYW5kIFwKKyAgICAgICAgaFswXSA9PSAnUCcgYW5kIGhbMV0gaW4gJzE0JyBhbmQgaFsyXSBpbiAnIFx0XG5ccic6CisgICAgICAgIHJldHVybiAncGJtJworCit0ZXN0cy5hcHBlbmQodGVzdF9wYm0pCisKK2RlZiB0ZXN0X3BnbShoLCBmKToKKyAgICAiIiJQR00gKHBvcnRhYmxlIGdyYXltYXApIiIiCisgICAgaWYgbGVuKGgpID49IDMgYW5kIFwKKyAgICAgICAgaFswXSA9PSAnUCcgYW5kIGhbMV0gaW4gJzI1JyBhbmQgaFsyXSBpbiAnIFx0XG5ccic6CisgICAgICAgIHJldHVybiAncGdtJworCit0ZXN0cy5hcHBlbmQodGVzdF9wZ20pCisKK2RlZiB0ZXN0X3BwbShoLCBmKToKKyAgICAiIiJQUE0gKHBvcnRhYmxlIHBpeG1hcCkiIiIKKyAgICBpZiBsZW4oaCkgPj0gMyBhbmQgXAorICAgICAgICBoWzBdID09ICdQJyBhbmQgaFsxXSBpbiAnMzYnIGFuZCBoWzJdIGluICcgXHRcblxyJzoKKyAgICAgICAgcmV0dXJuICdwcG0nCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3BwbSkKKworZGVmIHRlc3RfcmFzdChoLCBmKToKKyAgICAiIiJTdW4gcmFzdGVyIGZpbGUiIiIKKyAgICBpZiBoWzo0XSA9PSAnXHg1OVx4QTZceDZBXHg5NSc6CisgICAgICAgIHJldHVybiAncmFzdCcKKwordGVzdHMuYXBwZW5kKHRlc3RfcmFzdCkKKworZGVmIHRlc3RfeGJtKGgsIGYpOgorICAgICIiIlggYml0bWFwIChYMTAgb3IgWDExKSIiIgorICAgIHMgPSAnI2RlZmluZSAnCisgICAgaWYgaFs6bGVuKHMpXSA9PSBzOgorICAgICAgICByZXR1cm4gJ3hibScKKwordGVzdHMuYXBwZW5kKHRlc3RfeGJtKQorCitkZWYgdGVzdF9ibXAoaCwgZik6CisgICAgaWYgaFs6Ml0gPT0gJ0JNJzoKKyAgICAgICAgcmV0dXJuICdibXAnCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X2JtcCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tIworIyBTbWFsbCB0ZXN0IHByb2dyYW0gIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitkZWYgdGVzdCgpOgorICAgIGltcG9ydCBzeXMKKyAgICByZWN1cnNpdmUgPSAwCisgICAgaWYgc3lzLmFyZ3ZbMTpdIGFuZCBzeXMuYXJndlsxXSA9PSAnLXInOgorICAgICAgICBkZWwgc3lzLmFyZ3ZbMToyXQorICAgICAgICByZWN1cnNpdmUgPSAxCisgICAgdHJ5OgorICAgICAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICB0ZXN0YWxsKHN5cy5hcmd2WzE6XSwgcmVjdXJzaXZlLCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGVzdGFsbChbJy4nXSwgcmVjdXJzaXZlLCAxKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnXG5bSW50ZXJydXB0ZWRdXG4nKQorICAgICAgICBzeXMuZXhpdCgxKQorCitkZWYgdGVzdGFsbChsaXN0LCByZWN1cnNpdmUsIHRvcGxldmVsKToKKyAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IG9zCisgICAgZm9yIGZpbGVuYW1lIGluIGxpc3Q6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgorICAgICAgICAgICAgcHJpbnQgZmlsZW5hbWUgKyAnLzonLAorICAgICAgICAgICAgaWYgcmVjdXJzaXZlIG9yIHRvcGxldmVsOgorICAgICAgICAgICAgICAgIHByaW50ICdyZWN1cnNpbmcgZG93bjonCisgICAgICAgICAgICAgICAgaW1wb3J0IGdsb2IKKyAgICAgICAgICAgICAgICBuYW1lcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZmlsZW5hbWUsICcqJykpCisgICAgICAgICAgICAgICAgdGVzdGFsbChuYW1lcywgcmVjdXJzaXZlLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnKioqIGRpcmVjdG9yeSAodXNlIC1yKSAqKionCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBmaWxlbmFtZSArICc6JywKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByaW50IHdoYXQoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnKioqIG5vdCBmb3VuZCAqKionCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltZ2hkci5weWMgYi9saWIvcHl0aG9uMi43L2ltZ2hkci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiZGJmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1naGRyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltZ2hkci5weW8gYi9saWIvcHl0aG9uMi43L2ltZ2hkci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiZGJmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1naGRyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvaW1wb3J0bGliL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMzFhMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDM4IEBACisiIiJCYWNrcG9ydCBvZiBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSBmcm9tIDMueC4iIiIKKyMgV2hpbGUgbm90IGNyaXRpY2FsIChhbmQgaW4gbm8gd2F5IGd1YXJhbnRlZWQhKSwgaXQgd291bGQgYmUgbmljZSB0byBrZWVwIHRoaXMKKyMgY29kZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMy4KK2ltcG9ydCBzeXMKKworZGVmIF9yZXNvbHZlX25hbWUobmFtZSwgcGFja2FnZSwgbGV2ZWwpOgorICAgICIiIlJldHVybiB0aGUgYWJzb2x1dGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIGJlIGltcG9ydGVkLiIiIgorICAgIGlmIG5vdCBoYXNhdHRyKHBhY2thZ2UsICdyaW5kZXgnKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJ3BhY2thZ2UnIG5vdCBzZXQgdG8gYSBzdHJpbmciKQorICAgIGRvdCA9IGxlbihwYWNrYWdlKQorICAgIGZvciB4IGluIHhyYW5nZShsZXZlbCwgMSwgLTEpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkb3QgPSBwYWNrYWdlLnJpbmRleCgnLicsIDAsIGRvdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJhdHRlbXB0ZWQgcmVsYXRpdmUgaW1wb3J0IGJleW9uZCB0b3AtbGV2ZWwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UiKQorICAgIHJldHVybiAiJXMuJXMiICUgKHBhY2thZ2VbOmRvdF0sIG5hbWUpCisKKworZGVmIGltcG9ydF9tb2R1bGUobmFtZSwgcGFja2FnZT1Ob25lKToKKyAgICAiIiJJbXBvcnQgYSBtb2R1bGUuCisKKyAgICBUaGUgJ3BhY2thZ2UnIGFyZ3VtZW50IGlzIHJlcXVpcmVkIHdoZW4gcGVyZm9ybWluZyBhIHJlbGF0aXZlIGltcG9ydC4gSXQKKyAgICBzcGVjaWZpZXMgdGhlIHBhY2thZ2UgdG8gdXNlIGFzIHRoZSBhbmNob3IgcG9pbnQgZnJvbSB3aGljaCB0byByZXNvbHZlIHRoZQorICAgIHJlbGF0aXZlIGltcG9ydCB0byBhbiBhYnNvbHV0ZSBpbXBvcnQuCisKKyAgICAiIiIKKyAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJy4nKToKKyAgICAgICAgaWYgbm90IHBhY2thZ2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInJlbGF0aXZlIGltcG9ydHMgcmVxdWlyZSB0aGUgJ3BhY2thZ2UnIGFyZ3VtZW50IikKKyAgICAgICAgbGV2ZWwgPSAwCisgICAgICAgIGZvciBjaGFyYWN0ZXIgaW4gbmFtZToKKyAgICAgICAgICAgIGlmIGNoYXJhY3RlciAhPSAnLic6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGxldmVsICs9IDEKKyAgICAgICAgbmFtZSA9IF9yZXNvbHZlX25hbWUobmFtZVtsZXZlbDpdLCBwYWNrYWdlLCBsZXZlbCkKKyAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzMWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1wb3J0bGliL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2ltcG9ydGxpYi9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzMWM4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1wb3J0bGliL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltcHV0aWwucHkgYi9saWIvcHl0aG9uMi43L2ltcHV0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVmYTZlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW1wdXRpbC5weQpAQCAtMCwwICsxLDcyNSBAQAorIiIiCitJbXBvcnQgdXRpbGl0aWVzCisKK0V4cG9ydGVkIGNsYXNzZXM6CisgICAgSW1wb3J0TWFuYWdlciAgIE1hbmFnZSB0aGUgaW1wb3J0IHByb2Nlc3MKKworICAgIEltcG9ydGVyICAgICAgICBCYXNlIGNsYXNzIGZvciByZXBsYWNpbmcgc3RhbmRhcmQgaW1wb3J0IGZ1bmN0aW9ucworICAgIEJ1aWx0aW5JbXBvcnRlciBFbXVsYXRlIHRoZSBpbXBvcnQgbWVjaGFuaXNtIGZvciBidWlsdGluIGFuZCBmcm96ZW4gbW9kdWxlcworCisgICAgRHluTG9hZFN1ZmZpeEltcG9ydGVyCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIGltcHV0aWwgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCisjIG5vdGU6IGF2b2lkIGltcG9ydGluZyBub24tYnVpbHRpbiBtb2R1bGVzCitpbXBvcnQgaW1wICAgICAgICAgICAgICAgICAgICAgICMjIyBub3QgYXZhaWxhYmxlIGluIEp5dGhvbj8KK2ltcG9ydCBzeXMKK2ltcG9ydCBfX2J1aWx0aW5fXworCisjIGZvciB0aGUgRGlyZWN0b3J5SW1wb3J0ZXIKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBtYXJzaGFsCisKK19fYWxsX18gPSBbIkltcG9ydE1hbmFnZXIiLCJJbXBvcnRlciIsIkJ1aWx0aW5JbXBvcnRlciJdCisKK19TdHJpbmdUeXBlID0gdHlwZSgnJykKK19Nb2R1bGVUeXBlID0gdHlwZShzeXMpICAgICAgICAgIyMjIGRvZXNuJ3Qgd29yayBpbiBKeXRob24uLi4KKworY2xhc3MgSW1wb3J0TWFuYWdlcjoKKyAgICAiTWFuYWdlIHRoZSBpbXBvcnQgcHJvY2Vzcy4iCisKKyAgICBkZWYgaW5zdGFsbChzZWxmLCBuYW1lc3BhY2U9dmFycyhfX2J1aWx0aW5fXykpOgorICAgICAgICAiSW5zdGFsbCB0aGlzIEltcG9ydE1hbmFnZXIgaW50byB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4iCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShuYW1lc3BhY2UsIF9Nb2R1bGVUeXBlKToKKyAgICAgICAgICAgIG5hbWVzcGFjZSA9IHZhcnMobmFtZXNwYWNlKQorCisgICAgICAgICMgTm90ZTogd2UgaGF2ZSBubyBub3Rpb24gb2YgImNoYWluaW5nIgorCisgICAgICAgICMgUmVjb3JkIHRoZSBwcmV2aW91cyBpbXBvcnQgaG9vaywgdGhlbiBpbnN0YWxsIG91ciBvd24uCisgICAgICAgIHNlbGYucHJldmlvdXNfaW1wb3J0ZXIgPSBuYW1lc3BhY2VbJ19faW1wb3J0X18nXQorICAgICAgICBzZWxmLm5hbWVzcGFjZSA9IG5hbWVzcGFjZQorICAgICAgICBuYW1lc3BhY2VbJ19faW1wb3J0X18nXSA9IHNlbGYuX2ltcG9ydF9ob29rCisKKyAgICAgICAgIyMjIGZpeCB0aGlzCisgICAgICAgICNuYW1lc3BhY2VbJ3JlbG9hZCddID0gc2VsZi5fcmVsb2FkX2hvb2sKKworICAgIGRlZiB1bmluc3RhbGwoc2VsZik6CisgICAgICAgICJSZXN0b3JlIHRoZSBwcmV2aW91cyBpbXBvcnQgbWVjaGFuaXNtLiIKKyAgICAgICAgc2VsZi5uYW1lc3BhY2VbJ19faW1wb3J0X18nXSA9IHNlbGYucHJldmlvdXNfaW1wb3J0ZXIKKworICAgIGRlZiBhZGRfc3VmZml4KHNlbGYsIHN1ZmZpeCwgaW1wb3J0RnVuYyk6CisgICAgICAgIGFzc2VydCBoYXNhdHRyKGltcG9ydEZ1bmMsICdfX2NhbGxfXycpCisgICAgICAgIHNlbGYuZnNfaW1wLmFkZF9zdWZmaXgoc3VmZml4LCBpbXBvcnRGdW5jKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMKKyAgICAjIFBSSVZBVEUgTUVUSE9EUworICAgICMKKworICAgIGNsc0ZpbGVzeXN0ZW1JbXBvcnRlciA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmc19pbXA9Tm9uZSk6CisgICAgICAgICMgd2UncmUgZGVmaW5pdGVseSBnb2luZyB0byBiZSBpbXBvcnRpbmcgc29tZXRoaW5nIGluIHRoZSBmdXR1cmUsCisgICAgICAgICMgc28gbGV0J3MganVzdCBsb2FkIHRoZSBPUy1yZWxhdGVkIGZhY2lsaXRpZXMuCisgICAgICAgIGlmIG5vdCBfb3Nfc3RhdDoKKyAgICAgICAgICAgIF9vc19ib290c3RyYXAoKQorCisgICAgICAgICMgVGhpcyBpcyB0aGUgSW1wb3J0ZXIgdGhhdCB3ZSB1c2UgZm9yIGdyYWJiaW5nIHN0dWZmIGZyb20gdGhlCisgICAgICAgICMgZmlsZXN5c3RlbS4gSXQgZGVmaW5lcyBvbmUgbW9yZSBtZXRob2QgKGltcG9ydF9mcm9tX2RpcikgZm9yIG91ciB1c2UuCisgICAgICAgIGlmIGZzX2ltcCBpcyBOb25lOgorICAgICAgICAgICAgY2xzID0gc2VsZi5jbHNGaWxlc3lzdGVtSW1wb3J0ZXIgb3IgX0ZpbGVzeXN0ZW1JbXBvcnRlcgorICAgICAgICAgICAgZnNfaW1wID0gY2xzKCkKKyAgICAgICAgc2VsZi5mc19pbXAgPSBmc19pbXAKKworICAgICAgICAjIEluaXRpYWxpemUgdGhlIHNldCBvZiBzdWZmaXhlcyB0aGF0IHdlIHJlY29nbml6ZSBhbmQgaW1wb3J0LgorICAgICAgICAjIFRoZSBkZWZhdWx0IHdpbGwgaW1wb3J0IGR5bmFtaWMtbG9hZCBtb2R1bGVzIGZpcnN0LCBmb2xsb3dlZCBieQorICAgICAgICAjIC5weSBmaWxlcyAob3IgYSAucHkgZmlsZSdzIGNhY2hlZCBieXRlY29kZSkKKyAgICAgICAgZm9yIGRlc2MgaW4gaW1wLmdldF9zdWZmaXhlcygpOgorICAgICAgICAgICAgaWYgZGVzY1syXSA9PSBpbXAuQ19FWFRFTlNJT046CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfc3VmZml4KGRlc2NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bkxvYWRTdWZmaXhJbXBvcnRlcihkZXNjKS5pbXBvcnRfZmlsZSkKKyAgICAgICAgc2VsZi5hZGRfc3VmZml4KCcucHknLCBweV9zdWZmaXhfaW1wb3J0ZXIpCisKKyAgICBkZWYgX2ltcG9ydF9ob29rKHNlbGYsIGZxbmFtZSwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSwgZnJvbWxpc3Q9Tm9uZSk6CisgICAgICAgICIiIlB5dGhvbiBjYWxscyB0aGlzIGhvb2sgdG8gbG9jYXRlIGFuZCBpbXBvcnQgYSBtb2R1bGUuIiIiCisKKyAgICAgICAgcGFydHMgPSBmcW5hbWUuc3BsaXQoJy4nKQorCisgICAgICAgICMgZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mIHRoaXMgaW1wb3J0CisgICAgICAgIHBhcmVudCA9IHNlbGYuX2RldGVybWluZV9pbXBvcnRfY29udGV4dChnbG9iYWxzKQorCisgICAgICAgICMgaWYgdGhlcmUgaXMgYSBwYXJlbnQsIHRoZW4gaXRzIGltcG9ydGVyIHNob3VsZCBtYW5hZ2UgdGhpcyBpbXBvcnQKKyAgICAgICAgaWYgcGFyZW50OgorICAgICAgICAgICAgbW9kdWxlID0gcGFyZW50Ll9faW1wb3J0ZXJfXy5fZG9faW1wb3J0KHBhcmVudCwgcGFydHMsIGZyb21saXN0KQorICAgICAgICAgICAgaWYgbW9kdWxlOgorICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGUKKworICAgICAgICAjIGhhcyB0aGUgdG9wIG1vZHVsZSBhbHJlYWR5IGJlZW4gaW1wb3J0ZWQ/CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRvcF9tb2R1bGUgPSBzeXMubW9kdWxlc1twYXJ0c1swXV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorCisgICAgICAgICAgICAjIGxvb2sgZm9yIHRoZSB0b3Btb3N0IG1vZHVsZQorICAgICAgICAgICAgdG9wX21vZHVsZSA9IHNlbGYuX2ltcG9ydF90b3BfbW9kdWxlKHBhcnRzWzBdKQorICAgICAgICAgICAgaWYgbm90IHRvcF9tb2R1bGU6CisgICAgICAgICAgICAgICAgIyB0aGUgdG9wbW9zdCBtb2R1bGUgd2Fzbid0IGZvdW5kIGF0IGFsbC4KKyAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgJ05vIG1vZHVsZSBuYW1lZCAnICsgZnFuYW1lCisKKyAgICAgICAgIyBmYXN0LXBhdGggc2ltcGxlIGltcG9ydHMKKyAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAxOgorICAgICAgICAgICAgaWYgbm90IGZyb21saXN0OgorICAgICAgICAgICAgICAgIHJldHVybiB0b3BfbW9kdWxlCisKKyAgICAgICAgICAgIGlmIG5vdCB0b3BfbW9kdWxlLl9fZGljdF9fLmdldCgnX19pc3BrZ19fJyk6CisgICAgICAgICAgICAgICAgIyBfX2lzcGtnX18gaXNuJ3QgZGVmaW5lZCAodGhlIG1vZHVsZSB3YXMgbm90IGltcG9ydGVkIGJ5IHVzKSwKKyAgICAgICAgICAgICAgICAjIG9yIGl0IGlzIHplcm8uCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgSW4gdGhlIGZvcm1lciBjYXNlLCB0aGVyZSBpcyBubyB3YXkgdGhhdCB3ZSBjb3VsZCBpbXBvcnQKKyAgICAgICAgICAgICAgICAjIHN1Yi1tb2R1bGVzIHRoYXQgb2NjdXIgaW4gdGhlIGZyb21saXN0IChidXQgd2UgY2FuJ3QgcmFpc2UgYW4KKyAgICAgICAgICAgICAgICAjIGVycm9yIGJlY2F1c2UgaXQgbWF5IGp1c3QgYmUgbmFtZXMpIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBob3cKKyAgICAgICAgICAgICAgICAjIHRvIGRlYWwgd2l0aCBwYWNrYWdlcyB0aGF0IHdlcmUgaW1wb3J0ZWQgYnkgb3RoZXIgc3lzdGVtcy4KKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyBJbiB0aGUgbGF0dGVyIGNhc2UgKF9faXNwa2dfXyA9PSAwKSwgdGhlcmUgY2FuJ3QgYmUgYW55IHN1Yi0KKyAgICAgICAgICAgICAgICAjIG1vZHVsZXMgcHJlc2VudCwgc28gd2UgY2FuIGp1c3QgcmV0dXJuLgorICAgICAgICAgICAgICAgICMKKyAgICAgICAgICAgICAgICAjIEluIGJvdGggY2FzZXMsIHNpbmNlIGxlbihwYXJ0cykgPT0gMSwgdGhlIHRvcF9tb2R1bGUgaXMgYWxzbworICAgICAgICAgICAgICAgICMgdGhlICJib3R0b20iIHdoaWNoIGlzIHRoZSBkZWZpbmVkIHJldHVybiB3aGVuIGEgZnJvbWxpc3QKKyAgICAgICAgICAgICAgICAjIGV4aXN0cy4KKyAgICAgICAgICAgICAgICByZXR1cm4gdG9wX21vZHVsZQorCisgICAgICAgIGltcG9ydGVyID0gdG9wX21vZHVsZS5fX2RpY3RfXy5nZXQoJ19faW1wb3J0ZXJfXycpCisgICAgICAgIGlmIGltcG9ydGVyOgorICAgICAgICAgICAgcmV0dXJuIGltcG9ydGVyLl9maW5pc2hfaW1wb3J0KHRvcF9tb2R1bGUsIHBhcnRzWzE6XSwgZnJvbWxpc3QpCisKKyAgICAgICAgIyBHcnJyLCBzb21lIHBlb3BsZSAiaW1wb3J0IG9zLnBhdGgiIG9yIGRvICJmcm9tIG9zLnBhdGggaW1wb3J0IC4uLiIKKyAgICAgICAgaWYgbGVuKHBhcnRzKSA9PSAyIGFuZCBoYXNhdHRyKHRvcF9tb2R1bGUsIHBhcnRzWzFdKToKKyAgICAgICAgICAgIGlmIGZyb21saXN0OgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHRvcF9tb2R1bGUsIHBhcnRzWzFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gdG9wX21vZHVsZQorCisgICAgICAgICMgSWYgdGhlIGltcG9ydGVyIGRvZXMgbm90IGV4aXN0LCB0aGVuIHdlIGhhdmUgdG8gYmFpbC4gQSBtaXNzaW5nCisgICAgICAgICMgaW1wb3J0ZXIgbWVhbnMgdGhhdCBzb21ldGhpbmcgZWxzZSBpbXBvcnRlZCB0aGUgbW9kdWxlLCBhbmQgd2UgaGF2ZQorICAgICAgICAjIG5vIGtub3dsZWRnZSBvZiBob3cgdG8gZ2V0IHN1Yi1tb2R1bGVzIG91dCBvZiB0aGUgdGhpbmcuCisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAnTm8gbW9kdWxlIG5hbWVkICcgKyBmcW5hbWUKKworICAgIGRlZiBfZGV0ZXJtaW5lX2ltcG9ydF9jb250ZXh0KHNlbGYsIGdsb2JhbHMpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBjb250ZXh0IGluIHdoaWNoIGEgbW9kdWxlIHNob3VsZCBiZSBpbXBvcnRlZC4KKworICAgICAgICBUaGUgY29udGV4dCBjb3VsZCBiZSBhIGxvYWRlZCAocGFja2FnZSkgbW9kdWxlIGFuZCB0aGUgaW1wb3J0ZWQgbW9kdWxlCisgICAgICAgIHdpbGwgYmUgbG9va2VkIGZvciB3aXRoaW4gdGhhdCBwYWNrYWdlLiBUaGUgY29udGV4dCBjb3VsZCBhbHNvIGJlIE5vbmUsCisgICAgICAgIG1lYW5pbmcgdGhlcmUgaXMgbm8gY29udGV4dCAtLSB0aGUgbW9kdWxlIHNob3VsZCBiZSBsb29rZWQgZm9yIGFzIGEKKyAgICAgICAgInRvcC1sZXZlbCIgbW9kdWxlLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBub3QgZ2xvYmFscyBvciBub3QgZ2xvYmFscy5nZXQoJ19faW1wb3J0ZXJfXycpOgorICAgICAgICAgICAgIyBnbG9iYWxzIGRvZXMgbm90IHJlZmVyIHRvIG9uZSBvZiBvdXIgbW9kdWxlcyBvciBwYWNrYWdlcy4gVGhhdAorICAgICAgICAgICAgIyBpbXBsaWVzIHRoZXJlIGlzIG5vIHJlbGF0aXZlIGltcG9ydCBjb250ZXh0IChhcyBmYXIgYXMgd2UgYXJlCisgICAgICAgICAgICAjIGNvbmNlcm5lZCksIGFuZCBpdCBzaG91bGQganVzdCBwaWNrIGl0IG9mZiB0aGUgc3RhbmRhcmQgcGF0aC4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBUaGUgZ2xvYmFscyByZWZlciB0byBhIG1vZHVsZSBvciBwYWNrYWdlIG9mIG91cnMuIEl0IHdpbGwgZGVmaW5lCisgICAgICAgICMgdGhlIGNvbnRleHQgb2YgdGhlIG5ldyBpbXBvcnQuIEdldCB0aGUgbW9kdWxlL3BhY2thZ2UgZnFuYW1lLgorICAgICAgICBwYXJlbnRfZnFuYW1lID0gZ2xvYmFsc1snX19uYW1lX18nXQorCisgICAgICAgICMgaWYgYSBwYWNrYWdlIGlzIHBlcmZvcm1pbmcgdGhlIGltcG9ydCwgdGhlbiByZXR1cm4gaXRzZWxmIChpbXBvcnRzCisgICAgICAgICMgcmVmZXIgdG8gcGtnIGNvbnRlbnRzKQorICAgICAgICBpZiBnbG9iYWxzWydfX2lzcGtnX18nXToKKyAgICAgICAgICAgIHBhcmVudCA9IHN5cy5tb2R1bGVzW3BhcmVudF9mcW5hbWVdCisgICAgICAgICAgICBhc3NlcnQgZ2xvYmFscyBpcyBwYXJlbnQuX19kaWN0X18KKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQKKworICAgICAgICBpID0gcGFyZW50X2ZxbmFtZS5yZmluZCgnLicpCisKKyAgICAgICAgIyBhIG1vZHVsZSBvdXRzaWRlIG9mIGEgcGFja2FnZSBoYXMgbm8gcGFydGljdWxhciBpbXBvcnQgY29udGV4dAorICAgICAgICBpZiBpID09IC0xOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGlmIGEgbW9kdWxlIGluIGEgcGFja2FnZSBpcyBwZXJmb3JtaW5nIHRoZSBpbXBvcnQsIHRoZW4gcmV0dXJuIHRoZQorICAgICAgICAjIHBhY2thZ2UgKGltcG9ydHMgcmVmZXIgdG8gc2libGluZ3MpCisgICAgICAgIHBhcmVudF9mcW5hbWUgPSBwYXJlbnRfZnFuYW1lWzppXQorICAgICAgICBwYXJlbnQgPSBzeXMubW9kdWxlc1twYXJlbnRfZnFuYW1lXQorICAgICAgICBhc3NlcnQgcGFyZW50Ll9fbmFtZV9fID09IHBhcmVudF9mcW5hbWUKKyAgICAgICAgcmV0dXJuIHBhcmVudAorCisgICAgZGVmIF9pbXBvcnRfdG9wX21vZHVsZShzZWxmLCBuYW1lKToKKyAgICAgICAgIyBzY2FuIHN5cy5wYXRoIGxvb2tpbmcgZm9yIGEgbG9jYXRpb24gaW4gdGhlIGZpbGVzeXN0ZW0gdGhhdCBjb250YWlucworICAgICAgICAjIHRoZSBtb2R1bGUsIG9yIGFuIEltcG9ydGVyIG9iamVjdCB0aGF0IGNhbiBpbXBvcnQgdGhlIG1vZHVsZS4KKyAgICAgICAgZm9yIGl0ZW0gaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIF9TdHJpbmdUeXBlKToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLmZzX2ltcC5pbXBvcnRfZnJvbV9kaXIoaXRlbSwgbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbW9kdWxlID0gaXRlbS5pbXBvcnRfdG9wKG5hbWUpCisgICAgICAgICAgICBpZiBtb2R1bGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9yZWxvYWRfaG9vayhzZWxmLCBtb2R1bGUpOgorICAgICAgICAiUHl0aG9uIGNhbGxzIHRoaXMgaG9vayB0byByZWxvYWQgYSBtb2R1bGUuIgorCisgICAgICAgICMgcmVsb2FkaW5nIG9mIGEgbW9kdWxlIG1heSBvciBtYXkgbm90IGJlIHBvc3NpYmxlIChkZXBlbmRpbmcgb24gdGhlCisgICAgICAgICMgaW1wb3J0ZXIpLCBidXQgYXQgbGVhc3Qgd2UgY2FuIHZhbGlkYXRlIHRoYXQgaXQncyBvdXJzIHRvIHJlbG9hZAorICAgICAgICBpbXBvcnRlciA9IG1vZHVsZS5fX2RpY3RfXy5nZXQoJ19faW1wb3J0ZXJfXycpCisgICAgICAgIGlmIG5vdCBpbXBvcnRlcjoKKyAgICAgICAgICAgICMjIyBvb3BzLiBub3cgd2hhdC4uLgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgb2theS4gaXQgaXMgdXNpbmcgdGhlIGltcHV0aWwgc3lzdGVtLCBhbmQgd2UgbXVzdCBkZWxlZ2F0ZSBpdCwgYnV0CisgICAgICAgICMgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvICh5ZXQpCisgICAgICAgICMjIyB3ZSBzaG91bGQgYmxhc3QgdGhlIG1vZHVsZSBkaWN0IGFuZCBkbyBhbm90aGVyIGdldF9jb2RlKCkuIG5lZWQgdG8KKyAgICAgICAgIyMjIGZsZXNoIHRoaXMgb3V0IGFuZCBhZGQgcHJvcGVyIGRvY2NvLi4uCisgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yLCAicmVsb2FkIG5vdCB5ZXQgaW1wbGVtZW50ZWQiCisKKworY2xhc3MgSW1wb3J0ZXI6CisgICAgIkJhc2UgY2xhc3MgZm9yIHJlcGxhY2luZyBzdGFuZGFyZCBpbXBvcnQgZnVuY3Rpb25zLiIKKworICAgIGRlZiBpbXBvcnRfdG9wKHNlbGYsIG5hbWUpOgorICAgICAgICAiSW1wb3J0IGEgdG9wLWxldmVsIG1vZHVsZS4iCisgICAgICAgIHJldHVybiBzZWxmLl9pbXBvcnRfb25lKE5vbmUsIG5hbWUsIG5hbWUpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIworICAgICMgUFJJVkFURSBNRVRIT0RTCisgICAgIworICAgIGRlZiBfZmluaXNoX2ltcG9ydChzZWxmLCB0b3AsIHBhcnRzLCBmcm9tbGlzdCk6CisgICAgICAgICMgaWYgImEuYi5jIiB3YXMgcHJvdmlkZWQsIHRoZW4gbG9hZCB0aGUgIi5iLmMiIHBvcnRpb24gZG93biBmcm9tCisgICAgICAgICMgYmVsb3cgdGhlIHRvcC1sZXZlbCBtb2R1bGUuCisgICAgICAgIGJvdHRvbSA9IHNlbGYuX2xvYWRfdGFpbCh0b3AsIHBhcnRzKQorCisgICAgICAgICMgaWYgdGhlIGZvcm0gaXMgImltcG9ydCBhLmIuYyIsIHRoZW4gcmV0dXJuICJhIgorICAgICAgICBpZiBub3QgZnJvbWxpc3Q6CisgICAgICAgICAgICAjIG5vIGZyb21saXN0OiByZXR1cm4gdGhlIHRvcCBvZiB0aGUgaW1wb3J0IHRyZWUKKyAgICAgICAgICAgIHJldHVybiB0b3AKKworICAgICAgICAjIHRoZSB0b3AgbW9kdWxlIHdhcyBpbXBvcnRlZCBieSBzZWxmLgorICAgICAgICAjCisgICAgICAgICMgdGhpcyBtZWFucyB0aGF0IHRoZSBib3R0b20gbW9kdWxlIHdhcyBhbHNvIGltcG9ydGVkIGJ5IHNlbGYgKGp1c3QKKyAgICAgICAgIyBub3csIG9yIGluIHRoZSBwYXN0IGFuZCB3ZSBmZXRjaGVkIGl0IGZyb20gc3lzLm1vZHVsZXMpLgorICAgICAgICAjCisgICAgICAgICMgc2luY2Ugd2UgaW1wb3J0ZWQvaGFuZGxlZCB0aGUgYm90dG9tIG1vZHVsZSwgdGhpcyBtZWFucyB0aGF0IHdlIGNhbgorICAgICAgICAjIGFsc28gaGFuZGxlIGl0cyBmcm9tbGlzdCAoYW5kIHJlbGlhYmx5IHVzZSBfX2lzcGtnX18pLgorCisgICAgICAgICMgaWYgdGhlIGJvdHRvbSBub2RlIGlzIGEgcGFja2FnZSwgdGhlbiAocG90ZW50aWFsbHkpIGltcG9ydCBzb21lCisgICAgICAgICMgbW9kdWxlcy4KKyAgICAgICAgIworICAgICAgICAjIG5vdGU6IGlmIGl0IGlzIG5vdCBhIHBhY2thZ2UsIHRoZW4gImZyb21saXN0IiByZWZlcnMgdG8gbmFtZXMgaW4KKyAgICAgICAgIyAgICAgICB0aGUgYm90dG9tIG1vZHVsZSByYXRoZXIgdGhhbiBtb2R1bGVzLgorICAgICAgICAjIG5vdGU6IGZvciBhIG1peCBvZiBuYW1lcyBhbmQgbW9kdWxlcyBpbiB0aGUgZnJvbWxpc3QsIHdlIHdpbGwKKyAgICAgICAgIyAgICAgICBpbXBvcnQgYWxsIG1vZHVsZXMgYW5kIGluc2VydCB0aG9zZSBpbnRvIHRoZSBuYW1lc3BhY2Ugb2YKKyAgICAgICAgIyAgICAgICB0aGUgcGFja2FnZSBtb2R1bGUuIFB5dGhvbiB3aWxsIHBpY2sgdXAgYWxsIGZyb21saXN0IG5hbWVzCisgICAgICAgICMgICAgICAgZnJvbSB0aGUgYm90dG9tIChwYWNrYWdlKSBtb2R1bGU7IHNvbWUgd2lsbCBiZSBtb2R1bGVzIHRoYXQKKyAgICAgICAgIyAgICAgICB3ZSBpbXBvcnRlZCBhbmQgc3RvcmVkIGluIHRoZSBuYW1lc3BhY2UsIG90aGVycyBhcmUgZXhwZWN0ZWQKKyAgICAgICAgIyAgICAgICB0byBiZSBwcmVzZW50IGFscmVhZHkuCisgICAgICAgIGlmIGJvdHRvbS5fX2lzcGtnX186CisgICAgICAgICAgICBzZWxmLl9pbXBvcnRfZnJvbWxpc3QoYm90dG9tLCBmcm9tbGlzdCkKKworICAgICAgICAjIGlmIHRoZSBmb3JtIGlzICJmcm9tIGEuYiBpbXBvcnQgYywgZCIgdGhlbiByZXR1cm4gImIiCisgICAgICAgIHJldHVybiBib3R0b20KKworICAgIGRlZiBfaW1wb3J0X29uZShzZWxmLCBwYXJlbnQsIG1vZG5hbWUsIGZxbmFtZSk6CisgICAgICAgICJJbXBvcnQgYSBzaW5nbGUgbW9kdWxlLiIKKworICAgICAgICAjIGhhcyB0aGUgbW9kdWxlIGFscmVhZHkgYmVlbiBpbXBvcnRlZD8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW2ZxbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgbG9hZCB0aGUgbW9kdWxlJ3MgY29kZSwgb3IgZmV0Y2ggdGhlIG1vZHVsZSBpdHNlbGYKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXRfY29kZShwYXJlbnQsIG1vZG5hbWUsIGZxbmFtZSkKKyAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIG1vZHVsZSA9IHNlbGYuX3Byb2Nlc3NfcmVzdWx0KHJlc3VsdCwgZnFuYW1lKQorCisgICAgICAgICMgaW5zZXJ0IHRoZSBtb2R1bGUgaW50byBpdHMgcGFyZW50CisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHNldGF0dHIocGFyZW50LCBtb2RuYW1lLCBtb2R1bGUpCisgICAgICAgIHJldHVybiBtb2R1bGUKKworICAgIGRlZiBfcHJvY2Vzc19yZXN1bHQoc2VsZiwgcmVzdWx0LCBmcW5hbWUpOgorICAgICAgICBpc3BrZywgY29kZSwgdmFsdWVzID0gcmVzdWx0CisgICAgICAgICMgZGlkIGdldF9jb2RlKCkgcmV0dXJuIGFuIGFjdHVhbCBtb2R1bGU/IChyYXRoZXIgdGhhbiBhIGNvZGUgb2JqZWN0KQorICAgICAgICBpc19tb2R1bGUgPSBpc2luc3RhbmNlKGNvZGUsIF9Nb2R1bGVUeXBlKQorCisgICAgICAgICMgdXNlIHRoZSByZXR1cm5lZCBtb2R1bGUsIG9yIGNyZWF0ZSBhIG5ldyBvbmUgdG8gZXhlYyBjb2RlIGludG8KKyAgICAgICAgaWYgaXNfbW9kdWxlOgorICAgICAgICAgICAgbW9kdWxlID0gY29kZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kdWxlID0gaW1wLm5ld19tb2R1bGUoZnFuYW1lKQorCisgICAgICAgICMjIyByZWNvcmQgcGFja2FnZXMgYSBiaXQgZGlmZmVyZW50bHk/PworICAgICAgICBtb2R1bGUuX19pbXBvcnRlcl9fID0gc2VsZgorICAgICAgICBtb2R1bGUuX19pc3BrZ19fID0gaXNwa2cKKworICAgICAgICAjIGluc2VydCBhZGRpdGlvbmFsIHZhbHVlcyBpbnRvIHRoZSBtb2R1bGUgKGJlZm9yZSBleGVjdXRpbmcgdGhlIGNvZGUpCisgICAgICAgIG1vZHVsZS5fX2RpY3RfXy51cGRhdGUodmFsdWVzKQorCisgICAgICAgICMgdGhlIG1vZHVsZSBpcyBhbG1vc3QgcmVhZHkuLi4gbWFrZSBpdCB2aXNpYmxlCisgICAgICAgIHN5cy5tb2R1bGVzW2ZxbmFtZV0gPSBtb2R1bGUKKworICAgICAgICAjIGV4ZWN1dGUgdGhlIGNvZGUgd2l0aGluIHRoZSBtb2R1bGUncyBuYW1lc3BhY2UKKyAgICAgICAgaWYgbm90IGlzX21vZHVsZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleGVjIGNvZGUgaW4gbW9kdWxlLl9fZGljdF9fCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgaWYgZnFuYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbZnFuYW1lXQorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgIyBmZXRjaCBmcm9tIHN5cy5tb2R1bGVzIGluc3RlYWQgb2YgcmV0dXJuaW5nIG1vZHVsZSBkaXJlY3RseS4KKyAgICAgICAgIyBhbHNvIG1ha2UgbW9kdWxlJ3MgX19uYW1lX18gYWdyZWUgd2l0aCBmcW5hbWUsIGluIGNhc2UKKyAgICAgICAgIyB0aGUgImV4ZWMgY29kZSBpbiBtb2R1bGUuX19kaWN0X18iIHBsYXllZCBnYW1lcyBvbiB1cy4KKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbZnFuYW1lXQorICAgICAgICBtb2R1bGUuX19uYW1lX18gPSBmcW5hbWUKKyAgICAgICAgcmV0dXJuIG1vZHVsZQorCisgICAgZGVmIF9sb2FkX3RhaWwoc2VsZiwgbSwgcGFydHMpOgorICAgICAgICAiIiJJbXBvcnQgdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZXMsIGRvd24gZnJvbSB0aGUgdG9wLWxldmVsIG1vZHVsZS4KKworICAgICAgICBSZXR1cm5zIHRoZSBsYXN0IG1vZHVsZSBpbiB0aGUgZG90dGVkIGxpc3Qgb2YgbW9kdWxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBwYXJ0IGluIHBhcnRzOgorICAgICAgICAgICAgZnFuYW1lID0gIiVzLiVzIiAlIChtLl9fbmFtZV9fLCBwYXJ0KQorICAgICAgICAgICAgbSA9IHNlbGYuX2ltcG9ydF9vbmUobSwgcGFydCwgZnFuYW1lKQorICAgICAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgIiArIGZxbmFtZQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIF9pbXBvcnRfZnJvbWxpc3Qoc2VsZiwgcGFja2FnZSwgZnJvbWxpc3QpOgorICAgICAgICAnSW1wb3J0IGFueSBzdWItbW9kdWxlcyBpbiB0aGUgImZyb20iIGxpc3QuJworCisgICAgICAgICMgaWYgJyonIGlzIHByZXNlbnQgaW4gdGhlIGZyb21saXN0LCB0aGVuIGxvb2sgZm9yIHRoZSAnX19hbGxfXycKKyAgICAgICAgIyB2YXJpYWJsZSB0byBmaW5kIGFkZGl0aW9uYWwgaXRlbXMgKG1vZHVsZXMpIHRvIGltcG9ydC4KKyAgICAgICAgaWYgJyonIGluIGZyb21saXN0OgorICAgICAgICAgICAgZnJvbWxpc3QgPSBsaXN0KGZyb21saXN0KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwYWNrYWdlLl9fZGljdF9fLmdldCgnX19hbGxfXycsIFtdKSkKKworICAgICAgICBmb3Igc3ViIGluIGZyb21saXN0OgorICAgICAgICAgICAgIyBpZiB0aGUgbmFtZSBpcyBhbHJlYWR5IHByZXNlbnQsIHRoZW4gZG9uJ3QgdHJ5IHRvIGltcG9ydCBpdCAoaXQKKyAgICAgICAgICAgICMgbWlnaHQgbm90IGJlIGEgbW9kdWxlISkuCisgICAgICAgICAgICBpZiBzdWIgIT0gJyonIGFuZCBub3QgaGFzYXR0cihwYWNrYWdlLCBzdWIpOgorICAgICAgICAgICAgICAgIHN1Ym5hbWUgPSAiJXMuJXMiICUgKHBhY2thZ2UuX19uYW1lX18sIHN1YikKKyAgICAgICAgICAgICAgICBzdWJtb2QgPSBzZWxmLl9pbXBvcnRfb25lKHBhY2thZ2UsIHN1Yiwgc3VibmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3VibW9kOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgImNhbm5vdCBpbXBvcnQgbmFtZSAiICsgc3VibmFtZQorCisgICAgZGVmIF9kb19pbXBvcnQoc2VsZiwgcGFyZW50LCBwYXJ0cywgZnJvbWxpc3QpOgorICAgICAgICAiIiJBdHRlbXB0IHRvIGltcG9ydCB0aGUgbW9kdWxlIHJlbGF0aXZlIHRvIHBhcmVudC4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gdGhlIGltcG9ydCBjb250ZXh0IHNwZWNpZmllcyB0aGF0IDxzZWxmPgorICAgICAgICBpbXBvcnRlZCB0aGUgcGFyZW50IG1vZHVsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHRvcF9uYW1lID0gcGFydHNbMF0KKyAgICAgICAgdG9wX2ZxbmFtZSA9IHBhcmVudC5fX25hbWVfXyArICcuJyArIHRvcF9uYW1lCisgICAgICAgIHRvcF9tb2R1bGUgPSBzZWxmLl9pbXBvcnRfb25lKHBhcmVudCwgdG9wX25hbWUsIHRvcF9mcW5hbWUpCisgICAgICAgIGlmIG5vdCB0b3BfbW9kdWxlOgorICAgICAgICAgICAgIyB0aGlzIGltcG9ydGVyIGFuZCBwYXJlbnQgY291bGQgbm90IGZpbmQgdGhlIG1vZHVsZSAocmVsYXRpdmVseSkKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbmlzaF9pbXBvcnQodG9wX21vZHVsZSwgcGFydHNbMTpdLCBmcm9tbGlzdCkKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjCisgICAgIyBNRVRIT0RTIFRPIE9WRVJSSURFCisgICAgIworICAgIGRlZiBnZXRfY29kZShzZWxmLCBwYXJlbnQsIG1vZG5hbWUsIGZxbmFtZSk6CisgICAgICAgICIiIkZpbmQgYW5kIHJldHJpZXZlIHRoZSBjb2RlIGZvciB0aGUgZ2l2ZW4gbW9kdWxlLgorCisgICAgICAgIHBhcmVudCBzcGVjaWZpZXMgYSBwYXJlbnQgbW9kdWxlIHRvIGRlZmluZSBhIGNvbnRleHQgZm9yIGltcG9ydGluZy4gSXQKKyAgICAgICAgbWF5IGJlIE5vbmUsIGluZGljYXRpbmcgbm8gcGFydGljdWxhciBjb250ZXh0IGZvciB0aGUgc2VhcmNoLgorCisgICAgICAgIG1vZG5hbWUgc3BlY2lmaWVzIGEgc2luZ2xlIG1vZHVsZSAobm90IGRvdHRlZCkgd2l0aGluIHRoZSBwYXJlbnQuCisKKyAgICAgICAgZnFuYW1lIHNwZWNpZmllcyB0aGUgZnVsbHktcXVhbGlmaWVkIG1vZHVsZSBuYW1lLiBUaGlzIGlzIGEKKyAgICAgICAgKHBvdGVudGlhbGx5KSBkb3R0ZWQgbmFtZSBmcm9tIHRoZSAicm9vdCIgb2YgdGhlIG1vZHVsZSBuYW1lc3BhY2UKKyAgICAgICAgZG93biB0byB0aGUgbW9kbmFtZS4KKyAgICAgICAgSWYgdGhlcmUgaXMgbm8gcGFyZW50LCB0aGVuIG1vZG5hbWU9PWZxbmFtZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIE5vbmUsIG9yIGEgMy10dXBsZS4KKworICAgICAgICAqIElmIHRoZSBtb2R1bGUgd2FzIG5vdCBmb3VuZCwgdGhlbiBOb25lIHNob3VsZCBiZSByZXR1cm5lZC4KKworICAgICAgICAqIFRoZSBmaXJzdCBpdGVtIG9mIHRoZSAyLSBvciAzLXR1cGxlIHNob3VsZCBiZSB0aGUgaW50ZWdlciAwIG9yIDEsCisgICAgICAgICAgICBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG1vZHVsZSB0aGF0IHdhcyBmb3VuZCBpcyBhIHBhY2thZ2Ugb3Igbm90LgorCisgICAgICAgICogVGhlIHNlY29uZCBpdGVtIGlzIHRoZSBjb2RlIG9iamVjdCBmb3IgdGhlIG1vZHVsZSAoaXQgd2lsbCBiZQorICAgICAgICAgICAgZXhlY3V0ZWQgd2l0aGluIHRoZSBuZXcgbW9kdWxlJ3MgbmFtZXNwYWNlKS4gVGhpcyBpdGVtIGNhbiBhbHNvCisgICAgICAgICAgICBiZSBhIGZ1bGx5LWxvYWRlZCBtb2R1bGUgb2JqZWN0IChlLmcuIGxvYWRlZCBmcm9tIGEgc2hhcmVkIGxpYikuCisKKyAgICAgICAgKiBUaGUgdGhpcmQgaXRlbSBpcyBhIGRpY3Rpb25hcnkgb2YgbmFtZS92YWx1ZSBwYWlycyB0aGF0IHdpbGwgYmUKKyAgICAgICAgICAgIGluc2VydGVkIGludG8gbmV3IG1vZHVsZSBiZWZvcmUgdGhlIGNvZGUgb2JqZWN0IGlzIGV4ZWN1dGVkLiBUaGlzCisgICAgICAgICAgICBpcyBwcm92aWRlZCBpbiBjYXNlIHRoZSBtb2R1bGUncyBjb2RlIGV4cGVjdHMgY2VydGFpbiB2YWx1ZXMgKHN1Y2gKKyAgICAgICAgICAgIGFzIHdoZXJlIHRoZSBtb2R1bGUgd2FzIGZvdW5kKS4gV2hlbiB0aGUgc2Vjb25kIGl0ZW0gaXMgYSBtb2R1bGUKKyAgICAgICAgICAgIG9iamVjdCwgdGhlbiB0aGVzZSBuYW1lcy92YWx1ZXMgd2lsbCBiZSBpbnNlcnRlZCAqYWZ0ZXIqIHRoZSBtb2R1bGUKKyAgICAgICAgICAgIGhhcyBiZWVuIGxvYWRlZC9pbml0aWFsaXplZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImdldF9jb2RlIG5vdCBpbXBsZW1lbnRlZCIKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjCisjIFNvbWUgaGFuZHkgc3R1ZmYgZm9yIHRoZSBJbXBvcnRlcnMKKyMKKworIyBieXRlLWNvbXBpbGVkIGZpbGUgc3VmZml4IGNoYXJhY3RlcgorX3N1ZmZpeF9jaGFyID0gX19kZWJ1Z19fIGFuZCAnYycgb3IgJ28nCisKKyMgYnl0ZS1jb21waWxlZCBmaWxlIHN1ZmZpeAorX3N1ZmZpeCA9ICcucHknICsgX3N1ZmZpeF9jaGFyCisKK2RlZiBfY29tcGlsZShwYXRobmFtZSwgdGltZXN0YW1wKToKKyAgICAiIiJDb21waWxlIChhbmQgY2FjaGUpIGEgUHl0aG9uIHNvdXJjZSBmaWxlLgorCisgICAgVGhlIGZpbGUgc3BlY2lmaWVkIGJ5IDxwYXRobmFtZT4gaXMgY29tcGlsZWQgdG8gYSBjb2RlIG9iamVjdCBhbmQKKyAgICByZXR1cm5lZC4KKworICAgIFByZXN1bWluZyB0aGUgYXBwcm9wcmlhdGUgcHJpdmlsZWdlcyBleGlzdCwgdGhlIGJ5dGVjb2RlcyB3aWxsIGJlCisgICAgc2F2ZWQgYmFjayB0byB0aGUgZmlsZXN5c3RlbSBmb3IgZnV0dXJlIGltcG9ydHMuIFRoZSBzb3VyY2UgZmlsZSdzCisgICAgbW9kaWZpY2F0aW9uIHRpbWVzdGFtcCBtdXN0IGJlIHByb3ZpZGVkIGFzIGEgTG9uZyB2YWx1ZS4KKyAgICAiIiIKKyAgICBjb2Rlc3RyaW5nID0gb3BlbihwYXRobmFtZSwgJ3JVJykucmVhZCgpCisgICAgaWYgY29kZXN0cmluZyBhbmQgY29kZXN0cmluZ1stMV0gIT0gJ1xuJzoKKyAgICAgICAgY29kZXN0cmluZyA9IGNvZGVzdHJpbmcgKyAnXG4nCisgICAgY29kZSA9IF9fYnVpbHRpbl9fLmNvbXBpbGUoY29kZXN0cmluZywgcGF0aG5hbWUsICdleGVjJykKKworICAgICMgdHJ5IHRvIGNhY2hlIHRoZSBjb21waWxlZCBjb2RlCisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihwYXRobmFtZSArIF9zdWZmaXhfY2hhciwgJ3diJykKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGYud3JpdGUoJ1wwXDBcMFwwJykKKyAgICAgICAgZi53cml0ZShzdHJ1Y3QucGFjaygnPEknLCB0aW1lc3RhbXApKQorICAgICAgICBtYXJzaGFsLmR1bXAoY29kZSwgZikKKyAgICAgICAgZi5mbHVzaCgpCisgICAgICAgIGYuc2VlaygwLCAwKQorICAgICAgICBmLndyaXRlKGltcC5nZXRfbWFnaWMoKSkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICByZXR1cm4gY29kZQorCitfb3Nfc3RhdCA9IF9vc19wYXRoX2pvaW4gPSBOb25lCitkZWYgX29zX2Jvb3RzdHJhcCgpOgorICAgICJTZXQgdXAgJ29zJyBtb2R1bGUgcmVwbGFjZW1lbnQgZnVuY3Rpb25zIGZvciB1c2UgZHVyaW5nIGltcG9ydCBib290c3RyYXAuIgorCisgICAgbmFtZXMgPSBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMKKworICAgIGpvaW4gPSBOb25lCisgICAgaWYgJ3Bvc2l4JyBpbiBuYW1lczoKKyAgICAgICAgc2VwID0gJy8nCisgICAgICAgIGZyb20gcG9zaXggaW1wb3J0IHN0YXQKKyAgICBlbGlmICdudCcgaW4gbmFtZXM6CisgICAgICAgIHNlcCA9ICdcXCcKKyAgICAgICAgZnJvbSBudCBpbXBvcnQgc3RhdAorICAgIGVsaWYgJ2RvcycgaW4gbmFtZXM6CisgICAgICAgIHNlcCA9ICdcXCcKKyAgICAgICAgZnJvbSBkb3MgaW1wb3J0IHN0YXQKKyAgICBlbGlmICdvczInIGluIG5hbWVzOgorICAgICAgICBzZXAgPSAnXFwnCisgICAgICAgIGZyb20gb3MyIGltcG9ydCBzdGF0CisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICdubyBvcyBzcGVjaWZpYyBtb2R1bGUgZm91bmQnCisKKyAgICBpZiBqb2luIGlzIE5vbmU6CisgICAgICAgIGRlZiBqb2luKGEsIGIsIHNlcD1zZXApOgorICAgICAgICAgICAgaWYgYSA9PSAnJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gYgorICAgICAgICAgICAgbGFzdGNoYXIgPSBhWy0xOl0KKyAgICAgICAgICAgIGlmIGxhc3RjaGFyID09ICcvJyBvciBsYXN0Y2hhciA9PSBzZXA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGEgKyBiCisgICAgICAgICAgICByZXR1cm4gYSArIHNlcCArIGIKKworICAgIGdsb2JhbCBfb3Nfc3RhdAorICAgIF9vc19zdGF0ID0gc3RhdAorCisgICAgZ2xvYmFsIF9vc19wYXRoX2pvaW4KKyAgICBfb3NfcGF0aF9qb2luID0gam9pbgorCitkZWYgX29zX3BhdGhfaXNkaXIocGF0aG5hbWUpOgorICAgICJMb2NhbCByZXBsYWNlbWVudCBmb3Igb3MucGF0aC5pc2RpcigpLiIKKyAgICB0cnk6CisgICAgICAgIHMgPSBfb3Nfc3RhdChwYXRobmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gKHMuc3RfbW9kZSAmIDAxNzAwMDApID09IDAwNDAwMDAKKworZGVmIF90aW1lc3RhbXAocGF0aG5hbWUpOgorICAgICJSZXR1cm4gdGhlIGZpbGUgbW9kaWZpY2F0aW9uIHRpbWUgYXMgYSBMb25nLiIKKyAgICB0cnk6CisgICAgICAgIHMgPSBfb3Nfc3RhdChwYXRobmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gbG9uZyhzLnN0X210aW1lKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgRW11bGF0ZSB0aGUgaW1wb3J0IG1lY2hhbmlzbSBmb3IgYnVpbHRpbiBhbmQgZnJvemVuIG1vZHVsZXMKKyMKK2NsYXNzIEJ1aWx0aW5JbXBvcnRlcihJbXBvcnRlcik6CisgICAgZGVmIGdldF9jb2RlKHNlbGYsIHBhcmVudCwgbW9kbmFtZSwgZnFuYW1lKToKKyAgICAgICAgaWYgcGFyZW50OgorICAgICAgICAgICAgIyB0aGVzZSBtb2R1bGVzIGRlZmluaXRlbHkgZG8gbm90IG9jY3VyIHdpdGhpbiBhIHBhY2thZ2UgY29udGV4dAorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIGxvb2sgZm9yIHRoZSBtb2R1bGUKKyAgICAgICAgaWYgaW1wLmlzX2J1aWx0aW4obW9kbmFtZSk6CisgICAgICAgICAgICB0eXBlID0gaW1wLkNfQlVJTFRJTgorICAgICAgICBlbGlmIGltcC5pc19mcm96ZW4obW9kbmFtZSk6CisgICAgICAgICAgICB0eXBlID0gaW1wLlBZX0ZST1pFTgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBub3QgZm91bmQKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBnb3QgaXQuIG5vdyBsb2FkIGFuZCByZXR1cm4gaXQuCisgICAgICAgIG1vZHVsZSA9IGltcC5sb2FkX21vZHVsZShtb2RuYW1lLCBOb25lLCBtb2RuYW1lLCAoJycsICcnLCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIDAsIG1vZHVsZSwgeyB9CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBJbnRlcm5hbCBpbXBvcnRlciB1c2VkIGZvciBpbXBvcnRpbmcgZnJvbSB0aGUgZmlsZXN5c3RlbQorIworY2xhc3MgX0ZpbGVzeXN0ZW1JbXBvcnRlcihJbXBvcnRlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnN1ZmZpeGVzID0gWyBdCisKKyAgICBkZWYgYWRkX3N1ZmZpeChzZWxmLCBzdWZmaXgsIGltcG9ydEZ1bmMpOgorICAgICAgICBhc3NlcnQgaGFzYXR0cihpbXBvcnRGdW5jLCAnX19jYWxsX18nKQorICAgICAgICBzZWxmLnN1ZmZpeGVzLmFwcGVuZCgoc3VmZml4LCBpbXBvcnRGdW5jKSkKKworICAgIGRlZiBpbXBvcnRfZnJvbV9kaXIoc2VsZiwgZGlyLCBmcW5hbWUpOgorICAgICAgICByZXN1bHQgPSBzZWxmLl9pbXBvcnRfcGF0aG5hbWUoX29zX3BhdGhfam9pbihkaXIsIGZxbmFtZSksIGZxbmFtZSkKKyAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Byb2Nlc3NfcmVzdWx0KHJlc3VsdCwgZnFuYW1lKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGdldF9jb2RlKHNlbGYsIHBhcmVudCwgbW9kbmFtZSwgZnFuYW1lKToKKyAgICAgICAgIyBUaGlzIGltcG9ydGVyIGlzIG5ldmVyIHVzZWQgd2l0aCBhbiBlbXB0eSBwYXJlbnQuIEl0cyBleGlzdGVuY2UgaXMKKyAgICAgICAgIyBwcml2YXRlIHRvIHRoZSBJbXBvcnRNYW5hZ2VyLiBUaGUgSW1wb3J0TWFuYWdlciB1c2VzIHRoZQorICAgICAgICAjIGltcG9ydF9mcm9tX2RpcigpIG1ldGhvZCB0byBpbXBvcnQgdG9wLWxldmVsIG1vZHVsZXMvcGFja2FnZXMuCisgICAgICAgICMgVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIHdoZW4gd2UgbG9vayBmb3IgYSBtb2R1bGUgd2l0aGluIGEgcGFja2FnZS4KKyAgICAgICAgYXNzZXJ0IHBhcmVudAorCisgICAgICAgIGZvciBzdWJtb2R1bGVfcGF0aCBpbiBwYXJlbnQuX19wYXRoX186CisgICAgICAgICAgICBjb2RlID0gc2VsZi5faW1wb3J0X3BhdGhuYW1lKF9vc19wYXRoX2pvaW4oc3VibW9kdWxlX3BhdGgsIG1vZG5hbWUpLCBmcW5hbWUpCisgICAgICAgICAgICBpZiBjb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBjb2RlCisgICAgICAgIHJldHVybiBzZWxmLl9pbXBvcnRfcGF0aG5hbWUoX29zX3BhdGhfam9pbihwYXJlbnQuX19wa2dkaXJfXywgbW9kbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnFuYW1lKQorCisgICAgZGVmIF9pbXBvcnRfcGF0aG5hbWUoc2VsZiwgcGF0aG5hbWUsIGZxbmFtZSk6CisgICAgICAgIGlmIF9vc19wYXRoX2lzZGlyKHBhdGhuYW1lKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuX2ltcG9ydF9wYXRobmFtZShfb3NfcGF0aF9qb2luKHBhdGhuYW1lLCAnX19pbml0X18nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcW5hbWUpCisgICAgICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICAgICAgdmFsdWVzID0gcmVzdWx0WzJdCisgICAgICAgICAgICAgICAgdmFsdWVzWydfX3BrZ2Rpcl9fJ10gPSBwYXRobmFtZQorICAgICAgICAgICAgICAgIHZhbHVlc1snX19wYXRoX18nXSA9IFsgcGF0aG5hbWUgXQorICAgICAgICAgICAgICAgIHJldHVybiAxLCByZXN1bHRbMV0sIHZhbHVlcworICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBmb3Igc3VmZml4LCBpbXBvcnRGdW5jIGluIHNlbGYuc3VmZml4ZXM6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHBhdGhuYW1lICsgc3VmZml4CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmluZm8gPSBfb3Nfc3RhdChmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGltcG9ydEZ1bmMoZmlsZW5hbWUsIGZpbmZvLCBmcW5hbWUpCisgICAgICAgIHJldHVybiBOb25lCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgU1VGRklYLUJBU0VEIElNUE9SVEVSUworIworCitkZWYgcHlfc3VmZml4X2ltcG9ydGVyKGZpbGVuYW1lLCBmaW5mbywgZnFuYW1lKToKKyAgICBmaWxlID0gZmlsZW5hbWVbOi0zXSArIF9zdWZmaXgKKyAgICB0X3B5ID0gbG9uZyhmaW5mb1s4XSkKKyAgICB0X3B5YyA9IF90aW1lc3RhbXAoZmlsZSkKKworICAgIGNvZGUgPSBOb25lCisgICAgaWYgdF9weWMgaXMgbm90IE5vbmUgYW5kIHRfcHljID49IHRfcHk6CisgICAgICAgIGYgPSBvcGVuKGZpbGUsICdyYicpCisgICAgICAgIGlmIGYucmVhZCg0KSA9PSBpbXAuZ2V0X21hZ2ljKCk6CisgICAgICAgICAgICB0ID0gc3RydWN0LnVucGFjaygnPEknLCBmLnJlYWQoNCkpWzBdCisgICAgICAgICAgICBpZiB0ID09IHRfcHk6CisgICAgICAgICAgICAgICAgY29kZSA9IG1hcnNoYWwubG9hZChmKQorICAgICAgICBmLmNsb3NlKCkKKyAgICBpZiBjb2RlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBmaWxlbmFtZQorICAgICAgICBjb2RlID0gX2NvbXBpbGUoZmlsZSwgdF9weSkKKworICAgIHJldHVybiAwLCBjb2RlLCB7ICdfX2ZpbGVfXycgOiBmaWxlIH0KKworY2xhc3MgRHluTG9hZFN1ZmZpeEltcG9ydGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXNjKToKKyAgICAgICAgc2VsZi5kZXNjID0gZGVzYworCisgICAgZGVmIGltcG9ydF9maWxlKHNlbGYsIGZpbGVuYW1lLCBmaW5mbywgZnFuYW1lKToKKyAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lLCBzZWxmLmRlc2NbMV0pCisgICAgICAgIG1vZHVsZSA9IGltcC5sb2FkX21vZHVsZShmcW5hbWUsIGZwLCBmaWxlbmFtZSwgc2VsZi5kZXNjKQorICAgICAgICBtb2R1bGUuX19maWxlX18gPSBmaWxlbmFtZQorICAgICAgICByZXR1cm4gMCwgbW9kdWxlLCB7IH0KKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBfcHJpbnRfaW1wb3J0ZXJzKCk6CisgICAgaXRlbXMgPSBzeXMubW9kdWxlcy5pdGVtcygpCisgICAgaXRlbXMuc29ydCgpCisgICAgZm9yIG5hbWUsIG1vZHVsZSBpbiBpdGVtczoKKyAgICAgICAgaWYgbW9kdWxlOgorICAgICAgICAgICAgcHJpbnQgbmFtZSwgbW9kdWxlLl9fZGljdF9fLmdldCgnX19pbXBvcnRlcl9fJywgJy0tIG5vIGltcG9ydGVyJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50IG5hbWUsICctLSBub24tZXhpc3RlbnQgbW9kdWxlJworCitkZWYgX3Rlc3RfcmV2YW1wKCk6CisgICAgSW1wb3J0TWFuYWdlcigpLmluc3RhbGwoKQorICAgIHN5cy5wYXRoLmluc2VydCgwLCBCdWlsdGluSW1wb3J0ZXIoKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjCisjIFRPRE8KKyMKKyMgZnJvbSBGaW5uIEJvY2s6CisjICAgdHlwZShzeXMpIGlzIG5vdCBhIG1vZHVsZSBpbiBKeXRob24uIHdoYXQgdG8gdXNlIGluc3RlYWQ/CisjICAgaW1wLkNfRVhURU5TSU9OIGlzIG5vdCBpbiBKeXRob24uIHNhbWUgZm9yIGdldF9zdWZmaXhlcyBhbmQgbmV3X21vZHVsZQorIworIyAgIGdpdmVuIGZvby5weSBvZjoKKyMgICAgICBpbXBvcnQgc3lzCisjICAgICAgc3lzLm1vZHVsZXNbJ2ZvbyddID0gc3lzCisjCisjICAgLS0tLSBzdGFuZGFyZCBpbXBvcnQgbWVjaGFuaXNtCisjICAgPj4+IGltcG9ydCBmb28KKyMgICA+Pj4gZm9vCisjICAgPG1vZHVsZSAnc3lzJyAoYnVpbHQtaW4pPgorIworIyAgIC0tLS0gcmV2YW1wZWQgaW1wb3J0IG1lY2hhbmlzbQorIyAgID4+PiBpbXBvcnQgaW1wdXRpbAorIyAgID4+PiBpbXB1dGlsLl90ZXN0X3JldmFtcCgpCisjICAgPj4+IGltcG9ydCBmb28KKyMgICA+Pj4gZm9vCisjICAgPG1vZHVsZSAnZm9vJyBmcm9tICdmb28ucHknPgorIworIworIyBmcm9tIE1BTDoKKyMgICBzaG91bGQgQnVpbHRpbkltcG9ydGVyIGV4aXN0IGluIHN5cy5wYXRoIG9yIGhhcmQtd2lyZWQgaW4gSW1wb3J0TWFuYWdlcj8KKyMgICBuZWVkIF9fcGF0aF9fIHByb2Nlc3NpbmcKKyMgICBwZXJmb3JtYW5jZQorIyAgIG1vdmUgY2hhaW5pbmcgdG8gYSBzdWJjbGFzcyBbZ2pzOiBpdCdzIGJlZW4gbnVrZWRdCisjICAgZGVpbnN0YWxsIHNob3VsZCBiZSBwb3NzaWJsZQorIyAgIHF1ZXJ5IG1lY2hhbmlzbSBuZWVkZWQ6IGlzIGEgc3BlY2lmaWMgSW1wb3J0ZXIgaW5zdGFsbGVkPworIyAgIHB5L3B5Yy9weW8gcGlwaW5nIGhvb2tzIHRvIGZpbHRlci9wcm9jZXNzIHRoZXNlIGZpbGVzCisjICAgd2lzaCBsaXN0OgorIyAgICAgZGlzdHV0aWxzIGltcG9ydGVyIGhvb2tlZCB0byBsaXN0IG9mIHN0YW5kYXJkIEludGVybmV0IHJlcG9zaXRvcmllcworIyAgICAgbW9kdWxlLT5maWxlIGxvY2F0aW9uIG1hcHBlciB0byBzcGVlZCBGUy1iYXNlZCBpbXBvcnRzCisjICAgICByZWxhdGl2ZSBpbXBvcnRzCisjICAgICBrZWVwIGNoYWluaW5nIHNvIHRoYXQgaXQgY2FuIHBsYXkgbmljZSB3aXRoIG90aGVyIGltcG9ydCBob29rcworIworIyBmcm9tIEdvcmRvbjoKKyMgICBwdXNoIE1BTCdzIG1hcHBlciBpbnRvIHN5cy5wYXRoWzBdIGFzIGEgY2FjaGUgKGhhcmQtY29kZWQgZm9yIGFwcHMpCisjCisjIGZyb20gR3VpZG86CisjICAgbmVlZCB0byBjaGFuZ2Ugc3lzLiogcmVmZXJlbmNlcyBmb3IgcmV4ZWMgZW52aXJvbnMKKyMgICBuZWVkIGhvb2sgZm9yIE1BTCdzIHdhbGstbWUtdXAgaW1wb3J0IHN0cmF0ZWd5LCBvciBUaW0ncyBhYnNvbHV0ZSBzdHJhdGVneQorIyAgIHdhdGNoIG91dCBmb3Igc3lzLm1vZHVsZXNbLi4uXSBpcyBOb25lCisjICAgZmxhZyB0byBmb3JjZSBhYnNvbHV0ZSBpbXBvcnRzPyAoc3BlZWRzIF9kZXRlcm1pbmVfaW1wb3J0X2NvbnRleHQgYW5kCisjICAgICAgIGNoZWNraW5nIGZvciBhIHJlbGF0aXZlIG1vZHVsZSkKKyMgICBpbnNlcnQgbmFtZXMgb2YgYXJjaGl2ZXMgaW50byBzeXMucGF0aCAgKHNlZSBxdW90ZSBiZWxvdykKKyMgICBub3RlOiByZWxvYWQgZG9lcyBOT1QgYmxhc3QgbW9kdWxlIGRpY3QKKyMgICBzaGlmdCBpbXBvcnQgbWVjaGFuaXNtcyBhbmQgcG9saWNpZXMgYXJvdW5kOyBwcm92aWRlIGZvciBob29rcywgb3ZlcnJpZGVzCisjICAgICAgIChzZWUgcXVvdGUgYmVsb3cpCisjICAgYWRkIGdldF9zb3VyY2Ugc3R1ZmYKKyMgICBnZXRfdG9wY29kZSBhbmQgZ2V0X3N1YmNvZGUKKyMgICBDUkxGIGhhbmRsaW5nIGluIF9jb21waWxlCisjICAgcmFjZSBjb25kaXRpb24gaW4gX2NvbXBpbGUKKyMgICByZWZhY3RvcmluZyBvZiBvcy5weSB0byBkZWFsIHdpdGggX29zX2Jvb3RzdHJhcCBwcm9ibGVtCisjICAgYW55IHNwZWNpYWwgaGFuZGxpbmcgdG8gZG8gZm9yIGltcG9ydGluZyBhIG1vZHVsZSB3aXRoIGEgU3ludGF4RXJyb3I/CisjICAgICAgIChlLmcuIGNsZWFuIHVwIHRoZSB0cmFjZWJhY2spCisjICAgaW1wbGVtZW50ICJkb21haW4iIGZvciBwYXRoLXR5cGUgZnVuY3Rpb25hbGl0eSB1c2luZyBwa2cgbmFtZXNwYWNlCisjICAgICAgIChyYXRoZXIgdGhhbiBGUy1uYW1lcyBsaWtlIF9fcGF0aF9fKQorIyAgIGRvbid0IHVzZSB0aGUgd29yZCAicHJpdmF0ZSIuLi4gbWF5YmUgImludGVybmFsIgorIworIworIyBHdWlkbydzIGNvbW1lbnRzIG9uIHN5cy5wYXRoIGNhY2hpbmc6CisjCisjIFdlIGNvdWxkIGNhY2hlIHRoaXMgaW4gYSBkaWN0aW9uYXJ5OiB0aGUgSW1wb3J0TWFuYWdlciBjYW4gaGF2ZSBhCisjIGNhY2hlIGRpY3QgbWFwcGluZyBwYXRobmFtZXMgdG8gaW1wb3J0ZXIgb2JqZWN0cywgYW5kIGEgc2VwYXJhdGUKKyMgbWV0aG9kIGZvciBjb21pbmcgdXAgd2l0aCBhbiBpbXBvcnRlciBnaXZlbiBhIHBhdGhuYW1lIHRoYXQncyBub3QgeWV0CisjIGluIHRoZSBjYWNoZS4gIFRoZSBtZXRob2Qgc2hvdWxkIGRvIGEgc3RhdCBhbmQvb3IgbG9vayBhdCB0aGUKKyMgZXh0ZW5zaW9uIHRvIGRlY2lkZSB3aGljaCBpbXBvcnRlciBjbGFzcyB0byB1c2U7IHlvdSBjYW4gcmVnaXN0ZXIgbmV3CisjIGltcG9ydGVyIGNsYXNzZXMgYnkgcmVnaXN0ZXJpbmcgYSBzdWZmaXggb3IgYSBCb29sZWFuIGZ1bmN0aW9uLCBwbHVzIGEKKyMgY2xhc3MuICBJZiB5b3UgcmVnaXN0ZXIgYSBuZXcgaW1wb3J0ZXIgY2xhc3MsIHRoZSBjYWNoZSBpcyB6YXBwZWQuCisjIFRoZSBjYWNoZSBpcyBpbmRlcGVuZGVudCBmcm9tIHN5cy5wYXRoIChidXQgbWFpbnRhaW5lZCBwZXIKKyMgSW1wb3J0TWFuYWdlciBpbnN0YW5jZSkgc28gdGhhdCByZWFycmFuZ2VtZW50cyBvZiBzeXMucGF0aCBkbyB0aGUKKyMgcmlnaHQgdGhpbmcuICBJZiBhIHBhdGggaXMgZHJvcHBlZCBmcm9tIHN5cy5wYXRoIHRoZSBjb3JyZXNwb25kaW5nCisjIGNhY2hlIGVudHJ5IGlzIHNpbXBseSBubyBsb25nZXIgdXNlZC4KKyMKKyMgTXkvR3VpZG8ncyBjb21tZW50cyBvbiBmYWN0b3JpbmcgSW1wb3J0TWFuYWdlciBhbmQgSW1wb3J0ZXI6CisjCisjID4gSG93ZXZlciwgd2Ugc3RpbGwgaGF2ZSBhIHRlbnNpb24gb2NjdXJyaW5nIGhlcmU6CisjID4KKyMgPiAxKSBpbXBsZW1lbnRpbmcgcG9saWN5IGluIEltcG9ydE1hbmFnZXIgYXNzaXN0cyBpbiBzaW5nbGUtcG9pbnQgcG9saWN5CisjID4gICAgY2hhbmdlcyBmb3IgYXBwL3JleGVjIHNpdHVhdGlvbnMKKyMgPiAyKSBpbXBsZW1lbnRpbmcgcG9saWN5IGluIEltcG9ydGVyIGFzc2lzdHMgaW4gcGFja2FnZS1wcml2YXRlIHBvbGljeQorIyA+ICAgIGNoYW5nZXMgZm9yIG5vcm1hbCwgb3BlcmF0aW5nIGNvbmRpdGlvbnMKKyMgPgorIyA+IEknbGwgc2VlIGlmIEkgY2FuIHNvcnQgb3V0IGEgd2F5IHRvIGRvIHRoaXMuIE1heWJlIHRoZSBJbXBvcnRlciBjbGFzcyB3aWxsCisjID4gaW1wbGVtZW50IHRoZSBtZXRob2RzICh3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjaGFuZ2UgcG9saWN5KSBieQorIyA+IGRlbGVnYXRpbmcgdG8gSW1wb3J0TWFuYWdlci4KKyMKKyMgTWF5YmUgYWxzbyB0aGluayBhYm91dCB3aGF0IGtpbmQgb2YgcG9saWNpZXMgYW4gSW1wb3J0ZXIgd291bGQgYmUKKyMgbGlrZWx5IHRvIHdhbnQgdG8gY2hhbmdlLiAgSSBoYXZlIGEgZmVlbGluZyB0aGF0IGEgbG90IG9mIHRoZSBjb2RlCisjIHRoZXJlIGlzIGFjdHVhbGx5IG5vdCBzbyBtdWNoIHBvbGljeSBidXQgYSAqbmVjZXNzaXR5KiB0byBnZXQgdGhpbmdzCisjIHdvcmtpbmcgZ2l2ZW4gdGhlIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIHRoZSBfX2ltcG9ydF9fIGhvb2s6IHdoZXRoZXIKKyMgdG8gcmV0dXJuIHRoZSBoZWFkIG9yIHRhaWwgb2YgYSBkb3R0ZWQgbmFtZSwgb3Igd2hlbiB0byBkbyB0aGUgImZpbmlzaAorIyBmcm9tbGlzdCIgc3R1ZmYuCisjCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltcHV0aWwucHljIGIvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzg1N2QzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2ltcHV0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTRhOWYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbXB1dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2luc3BlY3QucHkgYi9saWIvcHl0aG9uMi43L2luc3BlY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5MjhiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvaW5zcGVjdC5weQpAQCAtMCwwICsxLDEwNTggQEAKKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KKyIiIkdldCB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBsaXZlIFB5dGhvbiBvYmplY3RzLgorCitUaGlzIG1vZHVsZSBlbmNhcHN1bGF0ZXMgdGhlIGludGVyZmFjZSBwcm92aWRlZCBieSB0aGUgaW50ZXJuYWwgc3BlY2lhbAorYXR0cmlidXRlcyAoZnVuY18qLCBjb18qLCBpbV8qLCB0Yl8qLCBldGMuKSBpbiBhIGZyaWVuZGxpZXIgZmFzaGlvbi4KK0l0IGFsc28gcHJvdmlkZXMgc29tZSBoZWxwIGZvciBleGFtaW5pbmcgc291cmNlIGNvZGUgYW5kIGNsYXNzIGxheW91dC4KKworSGVyZSBhcmUgc29tZSBvZiB0aGUgdXNlZnVsIGZ1bmN0aW9ucyBwcm92aWRlZCBieSB0aGlzIG1vZHVsZToKKworICAgIGlzbW9kdWxlKCksIGlzY2xhc3MoKSwgaXNtZXRob2QoKSwgaXNmdW5jdGlvbigpLCBpc2dlbmVyYXRvcmZ1bmN0aW9uKCksCisgICAgICAgIGlzZ2VuZXJhdG9yKCksIGlzdHJhY2ViYWNrKCksIGlzZnJhbWUoKSwgaXNjb2RlKCksIGlzYnVpbHRpbigpLAorICAgICAgICBpc3JvdXRpbmUoKSAtIGNoZWNrIG9iamVjdCB0eXBlcworICAgIGdldG1lbWJlcnMoKSAtIGdldCBtZW1iZXJzIG9mIGFuIG9iamVjdCB0aGF0IHNhdGlzZnkgYSBnaXZlbiBjb25kaXRpb24KKworICAgIGdldGZpbGUoKSwgZ2V0c291cmNlZmlsZSgpLCBnZXRzb3VyY2UoKSAtIGZpbmQgYW4gb2JqZWN0J3Mgc291cmNlIGNvZGUKKyAgICBnZXRkb2MoKSwgZ2V0Y29tbWVudHMoKSAtIGdldCBkb2N1bWVudGF0aW9uIG9uIGFuIG9iamVjdAorICAgIGdldG1vZHVsZSgpIC0gZGV0ZXJtaW5lIHRoZSBtb2R1bGUgdGhhdCBhbiBvYmplY3QgY2FtZSBmcm9tCisgICAgZ2V0Y2xhc3N0cmVlKCkgLSBhcnJhbmdlIGNsYXNzZXMgc28gYXMgdG8gcmVwcmVzZW50IHRoZWlyIGhpZXJhcmNoeQorCisgICAgZ2V0YXJnc3BlYygpLCBnZXRhcmd2YWx1ZXMoKSwgZ2V0Y2FsbGFyZ3MoKSAtIGdldCBpbmZvIGFib3V0IGZ1bmN0aW9uIGFyZ3VtZW50cworICAgIGZvcm1hdGFyZ3NwZWMoKSwgZm9ybWF0YXJndmFsdWVzKCkgLSBmb3JtYXQgYW4gYXJndW1lbnQgc3BlYworICAgIGdldG91dGVyZnJhbWVzKCksIGdldGlubmVyZnJhbWVzKCkgLSBnZXQgaW5mbyBhYm91dCBmcmFtZXMKKyAgICBjdXJyZW50ZnJhbWUoKSAtIGdldCB0aGUgY3VycmVudCBzdGFjayBmcmFtZQorICAgIHN0YWNrKCksIHRyYWNlKCkgLSBnZXQgaW5mbyBhYm91dCBmcmFtZXMgb24gdGhlIHN0YWNrIG9yIGluIGEgdHJhY2ViYWNrCisiIiIKKworIyBUaGlzIG1vZHVsZSBpcyBpbiB0aGUgcHVibGljIGRvbWFpbi4gIE5vIHdhcnJhbnRpZXMuCisKK19fYXV0aG9yX18gPSAnS2EtUGluZyBZZWUgPHBpbmdAbGZ3Lm9yZz4nCitfX2RhdGVfXyA9ICcxIEphbiAyMDAxJworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB0eXBlcworaW1wb3J0IHN0cmluZworaW1wb3J0IHJlCitpbXBvcnQgZGlzCitpbXBvcnQgaW1wCitpbXBvcnQgdG9rZW5pemUKK2ltcG9ydCBsaW5lY2FjaGUKK2Zyb20gb3BlcmF0b3IgaW1wb3J0IGF0dHJnZXR0ZXIKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IG5hbWVkdHVwbGUKKworIyBUaGVzZSBjb25zdGFudHMgYXJlIGZyb20gSW5jbHVkZS9jb2RlLmguCitDT19PUFRJTUlaRUQsIENPX05FV0xPQ0FMUywgQ09fVkFSQVJHUywgQ09fVkFSS0VZV09SRFMgPSAweDEsIDB4MiwgMHg0LCAweDgKK0NPX05FU1RFRCwgQ09fR0VORVJBVE9SLCBDT19OT0ZSRUUgPSAweDEwLCAweDIwLCAweDQwCisjIFNlZSBJbmNsdWRlL29iamVjdC5oCitUUEZMQUdTX0lTX0FCU1RSQUNUID0gMSA8PCAyMAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUtY2hlY2tpbmcKK2RlZiBpc21vZHVsZShvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtb2R1bGUuCisKKyAgICBNb2R1bGUgb2JqZWN0cyBwcm92aWRlIHRoZXNlIGF0dHJpYnV0ZXM6CisgICAgICAgIF9fZG9jX18gICAgICAgICBkb2N1bWVudGF0aW9uIHN0cmluZworICAgICAgICBfX2ZpbGVfXyAgICAgICAgZmlsZW5hbWUgKG1pc3NpbmcgZm9yIGJ1aWx0LWluIG1vZHVsZXMpIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5Nb2R1bGVUeXBlKQorCitkZWYgaXNjbGFzcyhvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBjbGFzcy4KKworICAgIENsYXNzIG9iamVjdHMgcHJvdmlkZSB0aGVzZSBhdHRyaWJ1dGVzOgorICAgICAgICBfX2RvY19fICAgICAgICAgZG9jdW1lbnRhdGlvbiBzdHJpbmcKKyAgICAgICAgX19tb2R1bGVfXyAgICAgIG5hbWUgb2YgbW9kdWxlIGluIHdoaWNoIHRoaXMgY2xhc3Mgd2FzIGRlZmluZWQiIiIKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpKQorCitkZWYgaXNtZXRob2Qob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGFuIGluc3RhbmNlIG1ldGhvZC4KKworICAgIEluc3RhbmNlIG1ldGhvZCBvYmplY3RzIHByb3ZpZGUgdGhlc2UgYXR0cmlidXRlczoKKyAgICAgICAgX19kb2NfXyAgICAgICAgIGRvY3VtZW50YXRpb24gc3RyaW5nCisgICAgICAgIF9fbmFtZV9fICAgICAgICBuYW1lIHdpdGggd2hpY2ggdGhpcyBtZXRob2Qgd2FzIGRlZmluZWQKKyAgICAgICAgaW1fY2xhc3MgICAgICAgIGNsYXNzIG9iamVjdCBpbiB3aGljaCB0aGlzIG1ldGhvZCBiZWxvbmdzCisgICAgICAgIGltX2Z1bmMgICAgICAgICBmdW5jdGlvbiBvYmplY3QgY29udGFpbmluZyBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2QKKyAgICAgICAgaW1fc2VsZiAgICAgICAgIGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgbWV0aG9kIGlzIGJvdW5kLCBvciBOb25lIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5NZXRob2RUeXBlKQorCitkZWYgaXNtZXRob2RkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1ldGhvZCBkZXNjcmlwdG9yLgorCisgICAgQnV0IG5vdCBpZiBpc21ldGhvZCgpIG9yIGlzY2xhc3MoKSBvciBpc2Z1bmN0aW9uKCkgYXJlIHRydWUuCisKKyAgICBUaGlzIGlzIG5ldyBpbiBQeXRob24gMi4yLCBhbmQsIGZvciBleGFtcGxlLCBpcyB0cnVlIG9mIGludC5fX2FkZF9fLgorICAgIEFuIG9iamVjdCBwYXNzaW5nIHRoaXMgdGVzdCBoYXMgYSBfX2dldF9fIGF0dHJpYnV0ZSBidXQgbm90IGEgX19zZXRfXworICAgIGF0dHJpYnV0ZSwgYnV0IGJleW9uZCB0aGF0IHRoZSBzZXQgb2YgYXR0cmlidXRlcyB2YXJpZXMuICBfX25hbWVfXyBpcworICAgIHVzdWFsbHkgc2Vuc2libGUsIGFuZCBfX2RvY19fIG9mdGVuIGlzLgorCisgICAgTWV0aG9kcyBpbXBsZW1lbnRlZCB2aWEgZGVzY3JpcHRvcnMgdGhhdCBhbHNvIHBhc3Mgb25lIG9mIHRoZSBvdGhlcgorICAgIHRlc3RzIHJldHVybiBmYWxzZSBmcm9tIHRoZSBpc21ldGhvZGRlc2NyaXB0b3IoKSB0ZXN0LCBzaW1wbHkgYmVjYXVzZQorICAgIHRoZSBvdGhlciB0ZXN0cyBwcm9taXNlIG1vcmUgLS0geW91IGNhbiwgZS5nLiwgY291bnQgb24gaGF2aW5nIHRoZQorICAgIGltX2Z1bmMgYXR0cmlidXRlIChldGMpIHdoZW4gYW4gb2JqZWN0IHBhc3NlcyBpc21ldGhvZCgpLiIiIgorICAgIHJldHVybiAoaGFzYXR0cihvYmplY3QsICJfX2dldF9fIikKKyAgICAgICAgICAgIGFuZCBub3QgaGFzYXR0cihvYmplY3QsICJfX3NldF9fIikgIyBlbHNlIGl0J3MgYSBkYXRhIGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGFuZCBub3QgaXNtZXRob2Qob2JqZWN0KSAgICAgICAgICAgIyBtdXR1YWwgZXhjbHVzaW9uCisgICAgICAgICAgICBhbmQgbm90IGlzZnVuY3Rpb24ob2JqZWN0KQorICAgICAgICAgICAgYW5kIG5vdCBpc2NsYXNzKG9iamVjdCkpCisKK2RlZiBpc2RhdGFkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGRhdGEgZGVzY3JpcHRvci4KKworICAgIERhdGEgZGVzY3JpcHRvcnMgaGF2ZSBib3RoIGEgX19nZXRfXyBhbmQgYSBfX3NldF9fIGF0dHJpYnV0ZS4gIEV4YW1wbGVzIGFyZQorICAgIHByb3BlcnRpZXMgKGRlZmluZWQgaW4gUHl0aG9uKSBhbmQgZ2V0c2V0cyBhbmQgbWVtYmVycyAoZGVmaW5lZCBpbiBDKS4KKyAgICBUeXBpY2FsbHksIGRhdGEgZGVzY3JpcHRvcnMgd2lsbCBhbHNvIGhhdmUgX19uYW1lX18gYW5kIF9fZG9jX18gYXR0cmlidXRlcworICAgIChwcm9wZXJ0aWVzLCBnZXRzZXRzLCBhbmQgbWVtYmVycyBoYXZlIGJvdGggb2YgdGhlc2UgYXR0cmlidXRlcyksIGJ1dCB0aGlzCisgICAgaXMgbm90IGd1YXJhbnRlZWQuIiIiCisgICAgcmV0dXJuIChoYXNhdHRyKG9iamVjdCwgIl9fc2V0X18iKSBhbmQgaGFzYXR0cihvYmplY3QsICJfX2dldF9fIikpCisKK2lmIGhhc2F0dHIodHlwZXMsICdNZW1iZXJEZXNjcmlwdG9yVHlwZScpOgorICAgICMgQ1B5dGhvbiBhbmQgZXF1aXZhbGVudAorICAgIGRlZiBpc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1lbWJlciBkZXNjcmlwdG9yLgorCisgICAgICAgIE1lbWJlciBkZXNjcmlwdG9ycyBhcmUgc3BlY2lhbGl6ZWQgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiBleHRlbnNpb24KKyAgICAgICAgbW9kdWxlcy4iIiIKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5NZW1iZXJEZXNjcmlwdG9yVHlwZSkKK2Vsc2U6CisgICAgIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMKKyAgICBkZWYgaXNtZW1iZXJkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZW1iZXIgZGVzY3JpcHRvci4KKworICAgICAgICBNZW1iZXIgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCitpZiBoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKToKKyAgICAjIENQeXRob24gYW5kIGVxdWl2YWxlbnQKKyAgICBkZWYgaXNnZXRzZXRkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBnZXRzZXQgZGVzY3JpcHRvci4KKworICAgICAgICBnZXRzZXQgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuR2V0U2V0RGVzY3JpcHRvclR5cGUpCitlbHNlOgorICAgICMgT3RoZXIgaW1wbGVtZW50YXRpb25zCisgICAgZGVmIGlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZ2V0c2V0IGRlc2NyaXB0b3IuCisKKyAgICAgICAgZ2V0c2V0IGRlc2NyaXB0b3JzIGFyZSBzcGVjaWFsaXplZCBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGV4dGVuc2lvbgorICAgICAgICBtb2R1bGVzLiIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIGlzZnVuY3Rpb24ob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uLgorCisgICAgRnVuY3Rpb24gb2JqZWN0cyBwcm92aWRlIHRoZXNlIGF0dHJpYnV0ZXM6CisgICAgICAgIF9fZG9jX18gICAgICAgICBkb2N1bWVudGF0aW9uIHN0cmluZworICAgICAgICBfX25hbWVfXyAgICAgICAgbmFtZSB3aXRoIHdoaWNoIHRoaXMgZnVuY3Rpb24gd2FzIGRlZmluZWQKKyAgICAgICAgZnVuY19jb2RlICAgICAgIGNvZGUgb2JqZWN0IGNvbnRhaW5pbmcgY29tcGlsZWQgZnVuY3Rpb24gYnl0ZWNvZGUKKyAgICAgICAgZnVuY19kZWZhdWx0cyAgIHR1cGxlIG9mIGFueSBkZWZhdWx0IHZhbHVlcyBmb3IgYXJndW1lbnRzCisgICAgICAgIGZ1bmNfZG9jICAgICAgICAoc2FtZSBhcyBfX2RvY19fKQorICAgICAgICBmdW5jX2dsb2JhbHMgICAgZ2xvYmFsIG5hbWVzcGFjZSBpbiB3aGljaCB0aGlzIGZ1bmN0aW9uIHdhcyBkZWZpbmVkCisgICAgICAgIGZ1bmNfbmFtZSAgICAgICAoc2FtZSBhcyBfX25hbWVfXykiIiIKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLkZ1bmN0aW9uVHlwZSkKKworZGVmIGlzZ2VuZXJhdG9yZnVuY3Rpb24ob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgdXNlci1kZWZpbmVkIGdlbmVyYXRvciBmdW5jdGlvbi4KKworICAgIEdlbmVyYXRvciBmdW5jdGlvbiBvYmplY3RzIHByb3ZpZGVzIHNhbWUgYXR0cmlidXRlcyBhcyBmdW5jdGlvbnMuCisKKyAgICBTZWUgaGVscChpc2Z1bmN0aW9uKSBmb3IgYXR0cmlidXRlcyBsaXN0aW5nLiIiIgorICAgIHJldHVybiBib29sKChpc2Z1bmN0aW9uKG9iamVjdCkgb3IgaXNtZXRob2Qob2JqZWN0KSkgYW5kCisgICAgICAgICAgICAgICAgb2JqZWN0LmZ1bmNfY29kZS5jb19mbGFncyAmIENPX0dFTkVSQVRPUikKKworZGVmIGlzZ2VuZXJhdG9yKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGdlbmVyYXRvci4KKworICAgIEdlbmVyYXRvciBvYmplY3RzIHByb3ZpZGUgdGhlc2UgYXR0cmlidXRlczoKKyAgICAgICAgX19pdGVyX18gICAgICAgIGRlZmluZWQgdG8gc3VwcG9ydCBpbnRlcmF0aW9uIG92ZXIgY29udGFpbmVyCisgICAgICAgIGNsb3NlICAgICAgICAgICByYWlzZXMgYSBuZXcgR2VuZXJhdG9yRXhpdCBleGNlcHRpb24gaW5zaWRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yIHRvIHRlcm1pbmF0ZSB0aGUgaXRlcmF0aW9uCisgICAgICAgIGdpX2NvZGUgICAgICAgICBjb2RlIG9iamVjdAorICAgICAgICBnaV9mcmFtZSAgICAgICAgZnJhbWUgb2JqZWN0IG9yIHBvc3NpYmx5IE5vbmUgb25jZSB0aGUgZ2VuZXJhdG9yIGhhcworICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBleGhhdXN0ZWQKKyAgICAgICAgZ2lfcnVubmluZyAgICAgIHNldCB0byAxIHdoZW4gZ2VuZXJhdG9yIGlzIGV4ZWN1dGluZywgMCBvdGhlcndpc2UKKyAgICAgICAgbmV4dCAgICAgICAgICAgIHJldHVybiB0aGUgbmV4dCBpdGVtIGZyb20gdGhlIGNvbnRhaW5lcgorICAgICAgICBzZW5kICAgICAgICAgICAgcmVzdW1lcyB0aGUgZ2VuZXJhdG9yIGFuZCAic2VuZHMiIGEgdmFsdWUgdGhhdCBiZWNvbWVzCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBjdXJyZW50IHlpZWxkLWV4cHJlc3Npb24KKyAgICAgICAgdGhyb3cgICAgICAgICAgIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGluc2lkZSB0aGUgZ2VuZXJhdG9yIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5HZW5lcmF0b3JUeXBlKQorCitkZWYgaXN0cmFjZWJhY2sob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgdHJhY2ViYWNrLgorCisgICAgVHJhY2ViYWNrIG9iamVjdHMgcHJvdmlkZSB0aGVzZSBhdHRyaWJ1dGVzOgorICAgICAgICB0Yl9mcmFtZSAgICAgICAgZnJhbWUgb2JqZWN0IGF0IHRoaXMgbGV2ZWwKKyAgICAgICAgdGJfbGFzdGkgICAgICAgIGluZGV4IG9mIGxhc3QgYXR0ZW1wdGVkIGluc3RydWN0aW9uIGluIGJ5dGVjb2RlCisgICAgICAgIHRiX2xpbmVubyAgICAgICBjdXJyZW50IGxpbmUgbnVtYmVyIGluIFB5dGhvbiBzb3VyY2UgY29kZQorICAgICAgICB0Yl9uZXh0ICAgICAgICAgbmV4dCBpbm5lciB0cmFjZWJhY2sgb2JqZWN0IChjYWxsZWQgYnkgdGhpcyBsZXZlbCkiIiIKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLlRyYWNlYmFja1R5cGUpCisKK2RlZiBpc2ZyYW1lKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGZyYW1lIG9iamVjdC4KKworICAgIEZyYW1lIG9iamVjdHMgcHJvdmlkZSB0aGVzZSBhdHRyaWJ1dGVzOgorICAgICAgICBmX2JhY2sgICAgICAgICAgbmV4dCBvdXRlciBmcmFtZSBvYmplY3QgKHRoaXMgZnJhbWUncyBjYWxsZXIpCisgICAgICAgIGZfYnVpbHRpbnMgICAgICBidWlsdC1pbiBuYW1lc3BhY2Ugc2VlbiBieSB0aGlzIGZyYW1lCisgICAgICAgIGZfY29kZSAgICAgICAgICBjb2RlIG9iamVjdCBiZWluZyBleGVjdXRlZCBpbiB0aGlzIGZyYW1lCisgICAgICAgIGZfZXhjX3RyYWNlYmFjayB0cmFjZWJhY2sgaWYgcmFpc2VkIGluIHRoaXMgZnJhbWUsIG9yIE5vbmUKKyAgICAgICAgZl9leGNfdHlwZSAgICAgIGV4Y2VwdGlvbiB0eXBlIGlmIHJhaXNlZCBpbiB0aGlzIGZyYW1lLCBvciBOb25lCisgICAgICAgIGZfZXhjX3ZhbHVlICAgICBleGNlcHRpb24gdmFsdWUgaWYgcmFpc2VkIGluIHRoaXMgZnJhbWUsIG9yIE5vbmUKKyAgICAgICAgZl9nbG9iYWxzICAgICAgIGdsb2JhbCBuYW1lc3BhY2Ugc2VlbiBieSB0aGlzIGZyYW1lCisgICAgICAgIGZfbGFzdGkgICAgICAgICBpbmRleCBvZiBsYXN0IGF0dGVtcHRlZCBpbnN0cnVjdGlvbiBpbiBieXRlY29kZQorICAgICAgICBmX2xpbmVubyAgICAgICAgY3VycmVudCBsaW5lIG51bWJlciBpbiBQeXRob24gc291cmNlIGNvZGUKKyAgICAgICAgZl9sb2NhbHMgICAgICAgIGxvY2FsIG5hbWVzcGFjZSBzZWVuIGJ5IHRoaXMgZnJhbWUKKyAgICAgICAgZl9yZXN0cmljdGVkICAgIDAgb3IgMSBpZiBmcmFtZSBpcyBpbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlCisgICAgICAgIGZfdHJhY2UgICAgICAgICB0cmFjaW5nIGZ1bmN0aW9uIGZvciB0aGlzIGZyYW1lLCBvciBOb25lIiIiCisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5GcmFtZVR5cGUpCisKK2RlZiBpc2NvZGUob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgY29kZSBvYmplY3QuCisKKyAgICBDb2RlIG9iamVjdHMgcHJvdmlkZSB0aGVzZSBhdHRyaWJ1dGVzOgorICAgICAgICBjb19hcmdjb3VudCAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cyAobm90IGluY2x1ZGluZyAqIG9yICoqIGFyZ3MpCisgICAgICAgIGNvX2NvZGUgICAgICAgICBzdHJpbmcgb2YgcmF3IGNvbXBpbGVkIGJ5dGVjb2RlCisgICAgICAgIGNvX2NvbnN0cyAgICAgICB0dXBsZSBvZiBjb25zdGFudHMgdXNlZCBpbiB0aGUgYnl0ZWNvZGUKKyAgICAgICAgY29fZmlsZW5hbWUgICAgIG5hbWUgb2YgZmlsZSBpbiB3aGljaCB0aGlzIGNvZGUgb2JqZWN0IHdhcyBjcmVhdGVkCisgICAgICAgIGNvX2ZpcnN0bGluZW5vICBudW1iZXIgb2YgZmlyc3QgbGluZSBpbiBQeXRob24gc291cmNlIGNvZGUKKyAgICAgICAgY29fZmxhZ3MgICAgICAgIGJpdG1hcDogMT1vcHRpbWl6ZWQgfCAyPW5ld2xvY2FscyB8IDQ9KmFyZyB8IDg9KiphcmcKKyAgICAgICAgY29fbG5vdGFiICAgICAgIGVuY29kZWQgbWFwcGluZyBvZiBsaW5lIG51bWJlcnMgdG8gYnl0ZWNvZGUgaW5kaWNlcworICAgICAgICBjb19uYW1lICAgICAgICAgbmFtZSB3aXRoIHdoaWNoIHRoaXMgY29kZSBvYmplY3Qgd2FzIGRlZmluZWQKKyAgICAgICAgY29fbmFtZXMgICAgICAgIHR1cGxlIG9mIG5hbWVzIG9mIGxvY2FsIHZhcmlhYmxlcworICAgICAgICBjb19ubG9jYWxzICAgICAgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcworICAgICAgICBjb19zdGFja3NpemUgICAgdmlydHVhbCBtYWNoaW5lIHN0YWNrIHNwYWNlIHJlcXVpcmVkCisgICAgICAgIGNvX3Zhcm5hbWVzICAgICB0dXBsZSBvZiBuYW1lcyBvZiBhcmd1bWVudHMgYW5kIGxvY2FsIHZhcmlhYmxlcyIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuQ29kZVR5cGUpCisKK2RlZiBpc2J1aWx0aW4ob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kLgorCisgICAgQnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzIHByb3ZpZGUgdGhlc2UgYXR0cmlidXRlczoKKyAgICAgICAgX19kb2NfXyAgICAgICAgIGRvY3VtZW50YXRpb24gc3RyaW5nCisgICAgICAgIF9fbmFtZV9fICAgICAgICBvcmlnaW5hbCBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gb3IgbWV0aG9kCisgICAgICAgIF9fc2VsZl9fICAgICAgICBpbnN0YW5jZSB0byB3aGljaCBhIG1ldGhvZCBpcyBib3VuZCwgb3IgTm9uZSIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKG9iamVjdCwgdHlwZXMuQnVpbHRpbkZ1bmN0aW9uVHlwZSkKKworZGVmIGlzcm91dGluZShvYmplY3QpOgorICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYW55IGtpbmQgb2YgZnVuY3Rpb24gb3IgbWV0aG9kLiIiIgorICAgIHJldHVybiAoaXNidWlsdGluKG9iamVjdCkKKyAgICAgICAgICAgIG9yIGlzZnVuY3Rpb24ob2JqZWN0KQorICAgICAgICAgICAgb3IgaXNtZXRob2Qob2JqZWN0KQorICAgICAgICAgICAgb3IgaXNtZXRob2RkZXNjcmlwdG9yKG9iamVjdCkpCisKK2RlZiBpc2Fic3RyYWN0KG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzIChBQkMpLiIiIgorICAgIHJldHVybiBib29sKGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlKSBhbmQgb2JqZWN0Ll9fZmxhZ3NfXyAmIFRQRkxBR1NfSVNfQUJTVFJBQ1QpCisKK2RlZiBnZXRtZW1iZXJzKG9iamVjdCwgcHJlZGljYXRlPU5vbmUpOgorICAgICIiIlJldHVybiBhbGwgbWVtYmVycyBvZiBhbiBvYmplY3QgYXMgKG5hbWUsIHZhbHVlKSBwYWlycyBzb3J0ZWQgYnkgbmFtZS4KKyAgICBPcHRpb25hbGx5LCBvbmx5IHJldHVybiBtZW1iZXJzIHRoYXQgc2F0aXNmeSBhIGdpdmVuIHByZWRpY2F0ZS4iIiIKKyAgICByZXN1bHRzID0gW10KKyAgICBmb3Iga2V5IGluIGRpcihvYmplY3QpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIob2JqZWN0LCBrZXkpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5vdCBwcmVkaWNhdGUgb3IgcHJlZGljYXRlKHZhbHVlKToKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChrZXksIHZhbHVlKSkKKyAgICByZXN1bHRzLnNvcnQoKQorICAgIHJldHVybiByZXN1bHRzCisKK0F0dHJpYnV0ZSA9IG5hbWVkdHVwbGUoJ0F0dHJpYnV0ZScsICduYW1lIGtpbmQgZGVmaW5pbmdfY2xhc3Mgb2JqZWN0JykKKworZGVmIGNsYXNzaWZ5X2NsYXNzX2F0dHJzKGNscyk6CisgICAgIiIiUmV0dXJuIGxpc3Qgb2YgYXR0cmlidXRlLWRlc2NyaXB0b3IgdHVwbGVzLgorCisgICAgRm9yIGVhY2ggbmFtZSBpbiBkaXIoY2xzKSwgdGhlIHJldHVybiBsaXN0IGNvbnRhaW5zIGEgNC10dXBsZQorICAgIHdpdGggdGhlc2UgZWxlbWVudHM6CisKKyAgICAgICAgMC4gVGhlIG5hbWUgKGEgc3RyaW5nKS4KKworICAgICAgICAxLiBUaGUga2luZCBvZiBhdHRyaWJ1dGUgdGhpcyBpcywgb25lIG9mIHRoZXNlIHN0cmluZ3M6CisgICAgICAgICAgICAgICAnY2xhc3MgbWV0aG9kJyAgICBjcmVhdGVkIHZpYSBjbGFzc21ldGhvZCgpCisgICAgICAgICAgICAgICAnc3RhdGljIG1ldGhvZCcgICBjcmVhdGVkIHZpYSBzdGF0aWNtZXRob2QoKQorICAgICAgICAgICAgICAgJ3Byb3BlcnR5JyAgICAgICAgY3JlYXRlZCB2aWEgcHJvcGVydHkoKQorICAgICAgICAgICAgICAgJ21ldGhvZCcgICAgICAgICAgYW55IG90aGVyIGZsYXZvciBvZiBtZXRob2QKKyAgICAgICAgICAgICAgICdkYXRhJyAgICAgICAgICAgIG5vdCBhIG1ldGhvZAorCisgICAgICAgIDIuIFRoZSBjbGFzcyB3aGljaCBkZWZpbmVkIHRoaXMgYXR0cmlidXRlIChhIGNsYXNzKS4KKworICAgICAgICAzLiBUaGUgb2JqZWN0IGFzIG9idGFpbmVkIGRpcmVjdGx5IGZyb20gdGhlIGRlZmluaW5nIGNsYXNzJ3MKKyAgICAgICAgICAgX19kaWN0X18sIG5vdCB2aWEgZ2V0YXR0ci4gIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yCisgICAgICAgICAgIGRhdGEgYXR0cmlidXRlczogIEMuZGF0YSBpcyBqdXN0IGEgZGF0YSBvYmplY3QsIGJ1dAorICAgICAgICAgICBDLl9fZGljdF9fWydkYXRhJ10gbWF5IGJlIGEgZGF0YSBkZXNjcmlwdG9yIHdpdGggYWRkaXRpb25hbAorICAgICAgICAgICBpbmZvLCBsaWtlIGEgX19kb2NfXyBzdHJpbmcuCisgICAgIiIiCisKKyAgICBtcm8gPSBnZXRtcm8oY2xzKQorICAgIG5hbWVzID0gZGlyKGNscykKKyAgICByZXN1bHQgPSBbXQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAjIEdldCB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZSwgYW5kIHdoZXJlIGl0IHdhcyBkZWZpbmVkLgorICAgICAgICAjIEdldHRpbmcgYW4gb2JqIGZyb20gdGhlIF9fZGljdF9fIHNvbWV0aW1lcyByZXZlYWxzIG1vcmUgdGhhbgorICAgICAgICAjIHVzaW5nIGdldGF0dHIuICBTdGF0aWMgYW5kIGNsYXNzIG1ldGhvZHMgYXJlIGRyYW1hdGljIGV4YW1wbGVzLgorICAgICAgICAjIEZ1cnRoZXJtb3JlLCBzb21lIG9iamVjdHMgbWF5IHJhaXNlIGFuIEV4Y2VwdGlvbiB3aGVuIGZldGNoZWQgd2l0aAorICAgICAgICAjIGdldGF0dHIoKS4gVGhpcyBpcyB0aGUgY2FzZSB3aXRoIHNvbWUgZGVzY3JpcHRvcnMgKGJ1ZyAjMTc4NSkuCisgICAgICAgICMgVGh1cywgd2Ugb25seSB1c2UgZ2V0YXR0cigpIGFzIGEgbGFzdCByZXNvcnQuCisgICAgICAgIGhvbWVjbHMgPSBOb25lCisgICAgICAgIGZvciBiYXNlIGluIChjbHMsKSArIG1ybzoKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gYmFzZS5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICBvYmogPSBiYXNlLl9fZGljdF9fW25hbWVdCisgICAgICAgICAgICAgICAgaG9tZWNscyA9IGJhc2UKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihjbHMsIG5hbWUpCisgICAgICAgICAgICBob21lY2xzID0gZ2V0YXR0cihvYmosICJfX29iamNsYXNzX18iLCBob21lY2xzKQorCisgICAgICAgICMgQ2xhc3NpZnkgdGhlIG9iamVjdC4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIHN0YXRpY21ldGhvZCk6CisgICAgICAgICAgICBraW5kID0gInN0YXRpYyBtZXRob2QiCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIGNsYXNzbWV0aG9kKToKKyAgICAgICAgICAgIGtpbmQgPSAiY2xhc3MgbWV0aG9kIgorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBwcm9wZXJ0eSk6CisgICAgICAgICAgICBraW5kID0gInByb3BlcnR5IgorICAgICAgICBlbGlmIGlzbWV0aG9kZGVzY3JpcHRvcihvYmopOgorICAgICAgICAgICAga2luZCA9ICJtZXRob2QiCisgICAgICAgIGVsaWYgaXNkYXRhZGVzY3JpcHRvcihvYmopOgorICAgICAgICAgICAga2luZCA9ICJkYXRhIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2JqX3ZpYV9nZXRhdHRyID0gZ2V0YXR0cihjbHMsIG5hbWUpCisgICAgICAgICAgICBpZiAoaXNtZXRob2Qob2JqX3ZpYV9nZXRhdHRyKSBvcgorICAgICAgICAgICAgICAgIGlzbWV0aG9kZGVzY3JpcHRvcihvYmpfdmlhX2dldGF0dHIpKToKKyAgICAgICAgICAgICAgICBraW5kID0gIm1ldGhvZCIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAga2luZCA9ICJkYXRhIgorICAgICAgICAgICAgb2JqID0gb2JqX3ZpYV9nZXRhdHRyCisKKyAgICAgICAgcmVzdWx0LmFwcGVuZChBdHRyaWJ1dGUobmFtZSwga2luZCwgaG9tZWNscywgb2JqKSkKKworICAgIHJldHVybiByZXN1bHQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjbGFzcyBoZWxwZXJzCitkZWYgX3NlYXJjaGJhc2VzKGNscywgYWNjdW0pOgorICAgICMgU2ltdWxhdGUgdGhlICJjbGFzc2ljIGNsYXNzIiBzZWFyY2ggb3JkZXIuCisgICAgaWYgY2xzIGluIGFjY3VtOgorICAgICAgICByZXR1cm4KKyAgICBhY2N1bS5hcHBlbmQoY2xzKQorICAgIGZvciBiYXNlIGluIGNscy5fX2Jhc2VzX186CisgICAgICAgIF9zZWFyY2hiYXNlcyhiYXNlLCBhY2N1bSkKKworZGVmIGdldG1ybyhjbHMpOgorICAgICJSZXR1cm4gdHVwbGUgb2YgYmFzZSBjbGFzc2VzIChpbmNsdWRpbmcgY2xzKSBpbiBtZXRob2QgcmVzb2x1dGlvbiBvcmRlci4iCisgICAgaWYgaGFzYXR0cihjbHMsICJfX21yb19fIik6CisgICAgICAgIHJldHVybiBjbHMuX19tcm9fXworICAgIGVsc2U6CisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIF9zZWFyY2hiYXNlcyhjbHMsIHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHR1cGxlKHJlc3VsdCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzb3VyY2UgY29kZSBleHRyYWN0aW9uCitkZWYgaW5kZW50c2l6ZShsaW5lKToKKyAgICAiIiJSZXR1cm4gdGhlIGluZGVudCBzaXplLCBpbiBzcGFjZXMsIGF0IHRoZSBzdGFydCBvZiBhIGxpbmUgb2YgdGV4dC4iIiIKKyAgICBleHBsaW5lID0gc3RyaW5nLmV4cGFuZHRhYnMobGluZSkKKyAgICByZXR1cm4gbGVuKGV4cGxpbmUpIC0gbGVuKHN0cmluZy5sc3RyaXAoZXhwbGluZSkpCisKK2RlZiBnZXRkb2Mob2JqZWN0KToKKyAgICAiIiJHZXQgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIGZvciBhbiBvYmplY3QuCisKKyAgICBBbGwgdGFicyBhcmUgZXhwYW5kZWQgdG8gc3BhY2VzLiAgVG8gY2xlYW4gdXAgZG9jc3RyaW5ncyB0aGF0IGFyZQorICAgIGluZGVudGVkIHRvIGxpbmUgdXAgd2l0aCBibG9ja3Mgb2YgY29kZSwgYW55IHdoaXRlc3BhY2UgdGhhbiBjYW4gYmUKKyAgICB1bmlmb3JtbHkgcmVtb3ZlZCBmcm9tIHRoZSBzZWNvbmQgbGluZSBvbndhcmRzIGlzIHJlbW92ZWQuIiIiCisgICAgdHJ5OgorICAgICAgICBkb2MgPSBvYmplY3QuX19kb2NfXworICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiBub3QgaXNpbnN0YW5jZShkb2MsIHR5cGVzLlN0cmluZ1R5cGVzKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gY2xlYW5kb2MoZG9jKQorCitkZWYgY2xlYW5kb2MoZG9jKToKKyAgICAiIiJDbGVhbiB1cCBpbmRlbnRhdGlvbiBmcm9tIGRvY3N0cmluZ3MuCisKKyAgICBBbnkgd2hpdGVzcGFjZSB0aGF0IGNhbiBiZSB1bmlmb3JtbHkgcmVtb3ZlZCBmcm9tIHRoZSBzZWNvbmQgbGluZQorICAgIG9ud2FyZHMgaXMgcmVtb3ZlZC4iIiIKKyAgICB0cnk6CisgICAgICAgIGxpbmVzID0gc3RyaW5nLnNwbGl0KHN0cmluZy5leHBhbmR0YWJzKGRvYyksICdcbicpCisgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBlbHNlOgorICAgICAgICAjIEZpbmQgbWluaW11bSBpbmRlbnRhdGlvbiBvZiBhbnkgbm9uLWJsYW5rIGxpbmVzIGFmdGVyIGZpcnN0IGxpbmUuCisgICAgICAgIG1hcmdpbiA9IHN5cy5tYXhpbnQKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXNbMTpdOgorICAgICAgICAgICAgY29udGVudCA9IGxlbihzdHJpbmcubHN0cmlwKGxpbmUpKQorICAgICAgICAgICAgaWYgY29udGVudDoKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBsZW4obGluZSkgLSBjb250ZW50CisgICAgICAgICAgICAgICAgbWFyZ2luID0gbWluKG1hcmdpbiwgaW5kZW50KQorICAgICAgICAjIFJlbW92ZSBpbmRlbnRhdGlvbi4KKyAgICAgICAgaWYgbGluZXM6CisgICAgICAgICAgICBsaW5lc1swXSA9IGxpbmVzWzBdLmxzdHJpcCgpCisgICAgICAgIGlmIG1hcmdpbiA8IHN5cy5tYXhpbnQ6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obGluZXMpKTogbGluZXNbaV0gPSBsaW5lc1tpXVttYXJnaW46XQorICAgICAgICAjIFJlbW92ZSBhbnkgdHJhaWxpbmcgb3IgbGVhZGluZyBibGFuayBsaW5lcy4KKyAgICAgICAgd2hpbGUgbGluZXMgYW5kIG5vdCBsaW5lc1stMV06CisgICAgICAgICAgICBsaW5lcy5wb3AoKQorICAgICAgICB3aGlsZSBsaW5lcyBhbmQgbm90IGxpbmVzWzBdOgorICAgICAgICAgICAgbGluZXMucG9wKDApCisgICAgICAgIHJldHVybiBzdHJpbmcuam9pbihsaW5lcywgJ1xuJykKKworZGVmIGdldGZpbGUob2JqZWN0KToKKyAgICAiIiJXb3JrIG91dCB3aGljaCBzb3VyY2Ugb3IgY29tcGlsZWQgZmlsZSBhbiBvYmplY3Qgd2FzIGRlZmluZWQgaW4uIiIiCisgICAgaWYgaXNtb2R1bGUob2JqZWN0KToKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2ZpbGVfXycpOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2ZpbGVfXworICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3shcn0gaXMgYSBidWlsdC1pbiBtb2R1bGUnLmZvcm1hdChvYmplY3QpKQorICAgIGlmIGlzY2xhc3Mob2JqZWN0KToKKyAgICAgICAgb2JqZWN0ID0gc3lzLm1vZHVsZXMuZ2V0KG9iamVjdC5fX21vZHVsZV9fKQorICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fZmlsZV9fJyk6CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZmlsZV9fCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigneyFyfSBpcyBhIGJ1aWx0LWluIGNsYXNzJy5mb3JtYXQob2JqZWN0KSkKKyAgICBpZiBpc21ldGhvZChvYmplY3QpOgorICAgICAgICBvYmplY3QgPSBvYmplY3QuaW1fZnVuYworICAgIGlmIGlzZnVuY3Rpb24ob2JqZWN0KToKKyAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmZ1bmNfY29kZQorICAgIGlmIGlzdHJhY2ViYWNrKG9iamVjdCk6CisgICAgICAgIG9iamVjdCA9IG9iamVjdC50Yl9mcmFtZQorICAgIGlmIGlzZnJhbWUob2JqZWN0KToKKyAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmZfY29kZQorICAgIGlmIGlzY29kZShvYmplY3QpOgorICAgICAgICByZXR1cm4gb2JqZWN0LmNvX2ZpbGVuYW1lCisgICAgcmFpc2UgVHlwZUVycm9yKCd7IXJ9IGlzIG5vdCBhIG1vZHVsZSwgY2xhc3MsIG1ldGhvZCwgJworICAgICAgICAgICAgICAgICAgICAnZnVuY3Rpb24sIHRyYWNlYmFjaywgZnJhbWUsIG9yIGNvZGUgb2JqZWN0Jy5mb3JtYXQob2JqZWN0KSkKKworTW9kdWxlSW5mbyA9IG5hbWVkdHVwbGUoJ01vZHVsZUluZm8nLCAnbmFtZSBzdWZmaXggbW9kZSBtb2R1bGVfdHlwZScpCisKK2RlZiBnZXRtb2R1bGVpbmZvKHBhdGgpOgorICAgICIiIkdldCB0aGUgbW9kdWxlIG5hbWUsIHN1ZmZpeCwgbW9kZSwgYW5kIG1vZHVsZSB0eXBlIGZvciBhIGdpdmVuIGZpbGUuIiIiCisgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCisgICAgc3VmZml4ZXMgPSBtYXAobGFtYmRhIGluZm86CisgICAgICAgICAgICAgICAgICAgKC1sZW4oaW5mb1swXSksIGluZm9bMF0sIGluZm9bMV0sIGluZm9bMl0pLAorICAgICAgICAgICAgICAgICAgICBpbXAuZ2V0X3N1ZmZpeGVzKCkpCisgICAgc3VmZml4ZXMuc29ydCgpICMgdHJ5IGxvbmdlc3Qgc3VmZml4ZXMgZmlyc3QsIGluIGNhc2UgdGhleSBvdmVybGFwCisgICAgZm9yIG5lZ2xlbiwgc3VmZml4LCBtb2RlLCBtdHlwZSBpbiBzdWZmaXhlczoKKyAgICAgICAgaWYgZmlsZW5hbWVbbmVnbGVuOl0gPT0gc3VmZml4OgorICAgICAgICAgICAgcmV0dXJuIE1vZHVsZUluZm8oZmlsZW5hbWVbOm5lZ2xlbl0sIHN1ZmZpeCwgbW9kZSwgbXR5cGUpCisKK2RlZiBnZXRtb2R1bGVuYW1lKHBhdGgpOgorICAgICIiIlJldHVybiB0aGUgbW9kdWxlIG5hbWUgZm9yIGEgZ2l2ZW4gZmlsZSwgb3IgTm9uZS4iIiIKKyAgICBpbmZvID0gZ2V0bW9kdWxlaW5mbyhwYXRoKQorICAgIGlmIGluZm86IHJldHVybiBpbmZvWzBdCisKK2RlZiBnZXRzb3VyY2VmaWxlKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIHRoZSBmaWxlbmFtZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvY2F0ZSBhbiBvYmplY3QncyBzb3VyY2UuCisgICAgUmV0dXJuIE5vbmUgaWYgbm8gd2F5IGNhbiBiZSBpZGVudGlmaWVkIHRvIGdldCB0aGUgc291cmNlLgorICAgICIiIgorICAgIGZpbGVuYW1lID0gZ2V0ZmlsZShvYmplY3QpCisgICAgaWYgc3RyaW5nLmxvd2VyKGZpbGVuYW1lWy00Ol0pIGluICgnLnB5YycsICcucHlvJyk6CisgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi00XSArICcucHknCisgICAgZm9yIHN1ZmZpeCwgbW9kZSwga2luZCBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCk6CisgICAgICAgIGlmICdiJyBpbiBtb2RlIGFuZCBzdHJpbmcubG93ZXIoZmlsZW5hbWVbLWxlbihzdWZmaXgpOl0pID09IHN1ZmZpeDoKKyAgICAgICAgICAgICMgTG9va3MgbGlrZSBhIGJpbmFyeSBmaWxlLiAgV2Ugd2FudCB0byBvbmx5IHJldHVybiBhIHRleHQgZmlsZS4KKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKyAgICAjIG9ubHkgcmV0dXJuIGEgbm9uLWV4aXN0ZW50IGZpbGVuYW1lIGlmIHRoZSBtb2R1bGUgaGFzIGEgUEVQIDMwMiBsb2FkZXIKKyAgICBpZiBoYXNhdHRyKGdldG1vZHVsZShvYmplY3QsIGZpbGVuYW1lKSwgJ19fbG9hZGVyX18nKToKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisgICAgIyBvciBpdCBpcyBpbiB0aGUgbGluZWNhY2hlCisgICAgaWYgZmlsZW5hbWUgaW4gbGluZWNhY2hlLmNhY2hlOgorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworZGVmIGdldGFic2ZpbGUob2JqZWN0LCBfZmlsZW5hbWU9Tm9uZSk6CisgICAgIiIiUmV0dXJuIGFuIGFic29sdXRlIHBhdGggdG8gdGhlIHNvdXJjZSBvciBjb21waWxlZCBmaWxlIGZvciBhbiBvYmplY3QuCisKKyAgICBUaGUgaWRlYSBpcyBmb3IgZWFjaCBvYmplY3QgdG8gaGF2ZSBhIHVuaXF1ZSBvcmlnaW4sIHNvIHRoaXMgcm91dGluZQorICAgIG5vcm1hbGl6ZXMgdGhlIHJlc3VsdCBhcyBtdWNoIGFzIHBvc3NpYmxlLiIiIgorICAgIGlmIF9maWxlbmFtZSBpcyBOb25lOgorICAgICAgICBfZmlsZW5hbWUgPSBnZXRzb3VyY2VmaWxlKG9iamVjdCkgb3IgZ2V0ZmlsZShvYmplY3QpCisgICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKF9maWxlbmFtZSkpCisKK21vZHVsZXNieWZpbGUgPSB7fQorX2ZpbGVzYnltb2RuYW1lID0ge30KKworZGVmIGdldG1vZHVsZShvYmplY3QsIF9maWxlbmFtZT1Ob25lKToKKyAgICAiIiJSZXR1cm4gdGhlIG1vZHVsZSBhbiBvYmplY3Qgd2FzIGRlZmluZWQgaW4sIG9yIE5vbmUgaWYgbm90IGZvdW5kLiIiIgorICAgIGlmIGlzbW9kdWxlKG9iamVjdCk6CisgICAgICAgIHJldHVybiBvYmplY3QKKyAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fbW9kdWxlX18nKToKKyAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChvYmplY3QuX19tb2R1bGVfXykKKyAgICAjIFRyeSB0aGUgZmlsZW5hbWUgdG8gbW9kdWxlbmFtZSBjYWNoZQorICAgIGlmIF9maWxlbmFtZSBpcyBub3QgTm9uZSBhbmQgX2ZpbGVuYW1lIGluIG1vZHVsZXNieWZpbGU6CisgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQobW9kdWxlc2J5ZmlsZVtfZmlsZW5hbWVdKQorICAgICMgVHJ5IHRoZSBjYWNoZSBhZ2FpbiB3aXRoIHRoZSBhYnNvbHV0ZSBmaWxlIG5hbWUKKyAgICB0cnk6CisgICAgICAgIGZpbGUgPSBnZXRhYnNmaWxlKG9iamVjdCwgX2ZpbGVuYW1lKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgZmlsZSBpbiBtb2R1bGVzYnlmaWxlOgorICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXMuZ2V0KG1vZHVsZXNieWZpbGVbZmlsZV0pCisgICAgIyBVcGRhdGUgdGhlIGZpbGVuYW1lIHRvIG1vZHVsZSBuYW1lIGNhY2hlIGFuZCBjaGVjayB5ZXQgYWdhaW4KKyAgICAjIENvcHkgc3lzLm1vZHVsZXMgaW4gb3JkZXIgdG8gY29wZSB3aXRoIGNoYW5nZXMgd2hpbGUgaXRlcmF0aW5nCisgICAgZm9yIG1vZG5hbWUsIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5pdGVtcygpOgorICAgICAgICBpZiBpc21vZHVsZShtb2R1bGUpIGFuZCBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6CisgICAgICAgICAgICBmID0gbW9kdWxlLl9fZmlsZV9fCisgICAgICAgICAgICBpZiBmID09IF9maWxlc2J5bW9kbmFtZS5nZXQobW9kbmFtZSwgTm9uZSk6CisgICAgICAgICAgICAgICAgIyBIYXZlIGFscmVhZHkgbWFwcGVkIHRoaXMgbW9kdWxlLCBzbyBza2lwIGl0CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIF9maWxlc2J5bW9kbmFtZVttb2RuYW1lXSA9IGYKKyAgICAgICAgICAgIGYgPSBnZXRhYnNmaWxlKG1vZHVsZSkKKyAgICAgICAgICAgICMgQWx3YXlzIG1hcCB0byB0aGUgbmFtZSB0aGUgbW9kdWxlIGtub3dzIGl0c2VsZiBieQorICAgICAgICAgICAgbW9kdWxlc2J5ZmlsZVtmXSA9IG1vZHVsZXNieWZpbGVbCisgICAgICAgICAgICAgICAgb3MucGF0aC5yZWFscGF0aChmKV0gPSBtb2R1bGUuX19uYW1lX18KKyAgICBpZiBmaWxlIGluIG1vZHVsZXNieWZpbGU6CisgICAgICAgIHJldHVybiBzeXMubW9kdWxlcy5nZXQobW9kdWxlc2J5ZmlsZVtmaWxlXSkKKyAgICAjIENoZWNrIHRoZSBtYWluIG1vZHVsZQorICAgIG1haW4gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQorICAgIGlmIG5vdCBoYXNhdHRyKG9iamVjdCwgJ19fbmFtZV9fJyk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgaGFzYXR0cihtYWluLCBvYmplY3QuX19uYW1lX18pOgorICAgICAgICBtYWlub2JqZWN0ID0gZ2V0YXR0cihtYWluLCBvYmplY3QuX19uYW1lX18pCisgICAgICAgIGlmIG1haW5vYmplY3QgaXMgb2JqZWN0OgorICAgICAgICAgICAgcmV0dXJuIG1haW4KKyAgICAjIENoZWNrIGJ1aWx0aW5zCisgICAgYnVpbHRpbiA9IHN5cy5tb2R1bGVzWydfX2J1aWx0aW5fXyddCisgICAgaWYgaGFzYXR0cihidWlsdGluLCBvYmplY3QuX19uYW1lX18pOgorICAgICAgICBidWlsdGlub2JqZWN0ID0gZ2V0YXR0cihidWlsdGluLCBvYmplY3QuX19uYW1lX18pCisgICAgICAgIGlmIGJ1aWx0aW5vYmplY3QgaXMgb2JqZWN0OgorICAgICAgICAgICAgcmV0dXJuIGJ1aWx0aW4KKworZGVmIGZpbmRzb3VyY2Uob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdGhlIGVudGlyZSBzb3VyY2UgZmlsZSBhbmQgc3RhcnRpbmcgbGluZSBudW1iZXIgZm9yIGFuIG9iamVjdC4KKworICAgIFRoZSBhcmd1bWVudCBtYXkgYmUgYSBtb2R1bGUsIGNsYXNzLCBtZXRob2QsIGZ1bmN0aW9uLCB0cmFjZWJhY2ssIGZyYW1lLAorICAgIG9yIGNvZGUgb2JqZWN0LiAgVGhlIHNvdXJjZSBjb2RlIGlzIHJldHVybmVkIGFzIGEgbGlzdCBvZiBhbGwgdGhlIGxpbmVzCisgICAgaW4gdGhlIGZpbGUgYW5kIHRoZSBsaW5lIG51bWJlciBpbmRleGVzIGEgbGluZSBpbiB0aGF0IGxpc3QuICBBbiBJT0Vycm9yCisgICAgaXMgcmFpc2VkIGlmIHRoZSBzb3VyY2UgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkLiIiIgorCisgICAgZmlsZSA9IGdldGZpbGUob2JqZWN0KQorICAgIHNvdXJjZWZpbGUgPSBnZXRzb3VyY2VmaWxlKG9iamVjdCkKKyAgICBpZiBub3Qgc291cmNlZmlsZSBhbmQgZmlsZVs6MV0gKyBmaWxlWy0xOl0gIT0gJzw+JzoKKyAgICAgICAgcmFpc2UgSU9FcnJvcignc291cmNlIGNvZGUgbm90IGF2YWlsYWJsZScpCisgICAgZmlsZSA9IHNvdXJjZWZpbGUgaWYgc291cmNlZmlsZSBlbHNlIGZpbGUKKworICAgIG1vZHVsZSA9IGdldG1vZHVsZShvYmplY3QsIGZpbGUpCisgICAgaWYgbW9kdWxlOgorICAgICAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlLCBtb2R1bGUuX19kaWN0X18pCisgICAgZWxzZToKKyAgICAgICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZSkKKyAgICBpZiBub3QgbGluZXM6CisgICAgICAgIHJhaXNlIElPRXJyb3IoJ2NvdWxkIG5vdCBnZXQgc291cmNlIGNvZGUnKQorCisgICAgaWYgaXNtb2R1bGUob2JqZWN0KToKKyAgICAgICAgcmV0dXJuIGxpbmVzLCAwCisKKyAgICBpZiBpc2NsYXNzKG9iamVjdCk6CisgICAgICAgIG5hbWUgPSBvYmplY3QuX19uYW1lX18KKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZShyJ14oXHMqKWNsYXNzXHMqJyArIG5hbWUgKyByJ1xiJykKKyAgICAgICAgIyBtYWtlIHNvbWUgZWZmb3J0IHRvIGZpbmQgdGhlIGJlc3QgbWF0Y2hpbmcgY2xhc3MgZGVmaW5pdGlvbjoKKyAgICAgICAgIyB1c2UgdGhlIG9uZSB3aXRoIHRoZSBsZWFzdCBpbmRlbnRhdGlvbiwgd2hpY2ggaXMgdGhlIG9uZQorICAgICAgICAjIHRoYXQncyBtb3N0IHByb2JhYmx5IG5vdCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uLgorICAgICAgICBjYW5kaWRhdGVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBtYXRjaCA9IHBhdC5tYXRjaChsaW5lc1tpXSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICMgaWYgaXQncyBhdCB0b3BsZXZlbCwgaXQncyBhbHJlYWR5IHRoZSBiZXN0IG9uZQorICAgICAgICAgICAgICAgIGlmIGxpbmVzW2ldWzBdID09ICdjJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVzLCBpCisgICAgICAgICAgICAgICAgIyBlbHNlIGFkZCB3aGl0ZXNwYWNlIHRvIGNhbmRpZGF0ZSBsaXN0CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5hcHBlbmQoKG1hdGNoLmdyb3VwKDEpLCBpKSkKKyAgICAgICAgaWYgY2FuZGlkYXRlczoKKyAgICAgICAgICAgICMgdGhpcyB3aWxsIHNvcnQgYnkgd2hpdGVzcGFjZSwgYW5kIGJ5IGxpbmUgbnVtYmVyLAorICAgICAgICAgICAgIyBsZXNzIHdoaXRlc3BhY2UgZmlyc3QKKyAgICAgICAgICAgIGNhbmRpZGF0ZXMuc29ydCgpCisgICAgICAgICAgICByZXR1cm4gbGluZXMsIGNhbmRpZGF0ZXNbMF1bMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIGNsYXNzIGRlZmluaXRpb24nKQorCisgICAgaWYgaXNtZXRob2Qob2JqZWN0KToKKyAgICAgICAgb2JqZWN0ID0gb2JqZWN0LmltX2Z1bmMKKyAgICBpZiBpc2Z1bmN0aW9uKG9iamVjdCk6CisgICAgICAgIG9iamVjdCA9IG9iamVjdC5mdW5jX2NvZGUKKyAgICBpZiBpc3RyYWNlYmFjayhvYmplY3QpOgorICAgICAgICBvYmplY3QgPSBvYmplY3QudGJfZnJhbWUKKyAgICBpZiBpc2ZyYW1lKG9iamVjdCk6CisgICAgICAgIG9iamVjdCA9IG9iamVjdC5mX2NvZGUKKyAgICBpZiBpc2NvZGUob2JqZWN0KToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob2JqZWN0LCAnY29fZmlyc3RsaW5lbm8nKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2NvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uIGRlZmluaXRpb24nKQorICAgICAgICBsbnVtID0gb2JqZWN0LmNvX2ZpcnN0bGluZW5vIC0gMQorICAgICAgICBwYXQgPSByZS5jb21waWxlKHInXihccypkZWZccyl8KC4qKD88IVx3KWxhbWJkYSg6fFxzKSl8XihccypAKScpCisgICAgICAgIHdoaWxlIGxudW0gPiAwOgorICAgICAgICAgICAgaWYgcGF0Lm1hdGNoKGxpbmVzW2xudW1dKTogYnJlYWsKKyAgICAgICAgICAgIGxudW0gPSBsbnVtIC0gMQorICAgICAgICByZXR1cm4gbGluZXMsIGxudW0KKyAgICByYWlzZSBJT0Vycm9yKCdjb3VsZCBub3QgZmluZCBjb2RlIG9iamVjdCcpCisKK2RlZiBnZXRjb21tZW50cyhvYmplY3QpOgorICAgICIiIkdldCBsaW5lcyBvZiBjb21tZW50cyBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYW4gb2JqZWN0J3Mgc291cmNlIGNvZGUuCisKKyAgICBSZXR1cm5zIE5vbmUgd2hlbiBzb3VyY2UgY2FuJ3QgYmUgZm91bmQuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBsaW5lcywgbG51bSA9IGZpbmRzb3VyY2Uob2JqZWN0KQorICAgIGV4Y2VwdCAoSU9FcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGlmIGlzbW9kdWxlKG9iamVjdCk6CisgICAgICAgICMgTG9vayBmb3IgYSBjb21tZW50IGJsb2NrIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuCisgICAgICAgIHN0YXJ0ID0gMAorICAgICAgICBpZiBsaW5lcyBhbmQgbGluZXNbMF1bOjJdID09ICcjISc6IHN0YXJ0ID0gMQorICAgICAgICB3aGlsZSBzdGFydCA8IGxlbihsaW5lcykgYW5kIHN0cmluZy5zdHJpcChsaW5lc1tzdGFydF0pIGluICgnJywgJyMnKToKKyAgICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgKyAxCisgICAgICAgIGlmIHN0YXJ0IDwgbGVuKGxpbmVzKSBhbmQgbGluZXNbc3RhcnRdWzoxXSA9PSAnIyc6CisgICAgICAgICAgICBjb21tZW50cyA9IFtdCisgICAgICAgICAgICBlbmQgPSBzdGFydAorICAgICAgICAgICAgd2hpbGUgZW5kIDwgbGVuKGxpbmVzKSBhbmQgbGluZXNbZW5kXVs6MV0gPT0gJyMnOgorICAgICAgICAgICAgICAgIGNvbW1lbnRzLmFwcGVuZChzdHJpbmcuZXhwYW5kdGFicyhsaW5lc1tlbmRdKSkKKyAgICAgICAgICAgICAgICBlbmQgPSBlbmQgKyAxCisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oY29tbWVudHMsICcnKQorCisgICAgIyBMb29rIGZvciBhIHByZWNlZGluZyBibG9jayBvZiBjb21tZW50cyBhdCB0aGUgc2FtZSBpbmRlbnRhdGlvbi4KKyAgICBlbGlmIGxudW0gPiAwOgorICAgICAgICBpbmRlbnQgPSBpbmRlbnRzaXplKGxpbmVzW2xudW1dKQorICAgICAgICBlbmQgPSBsbnVtIC0gMQorICAgICAgICBpZiBlbmQgPj0gMCBhbmQgc3RyaW5nLmxzdHJpcChsaW5lc1tlbmRdKVs6MV0gPT0gJyMnIGFuZCBcCisgICAgICAgICAgICBpbmRlbnRzaXplKGxpbmVzW2VuZF0pID09IGluZGVudDoKKyAgICAgICAgICAgIGNvbW1lbnRzID0gW3N0cmluZy5sc3RyaXAoc3RyaW5nLmV4cGFuZHRhYnMobGluZXNbZW5kXSkpXQorICAgICAgICAgICAgaWYgZW5kID4gMDoKKyAgICAgICAgICAgICAgICBlbmQgPSBlbmQgLSAxCisgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0cmluZy5sc3RyaXAoc3RyaW5nLmV4cGFuZHRhYnMobGluZXNbZW5kXSkpCisgICAgICAgICAgICAgICAgd2hpbGUgY29tbWVudFs6MV0gPT0gJyMnIGFuZCBpbmRlbnRzaXplKGxpbmVzW2VuZF0pID09IGluZGVudDoKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudHNbOjBdID0gW2NvbW1lbnRdCisgICAgICAgICAgICAgICAgICAgIGVuZCA9IGVuZCAtIDEKKyAgICAgICAgICAgICAgICAgICAgaWYgZW5kIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudCA9IHN0cmluZy5sc3RyaXAoc3RyaW5nLmV4cGFuZHRhYnMobGluZXNbZW5kXSkpCisgICAgICAgICAgICB3aGlsZSBjb21tZW50cyBhbmQgc3RyaW5nLnN0cmlwKGNvbW1lbnRzWzBdKSA9PSAnIyc6CisgICAgICAgICAgICAgICAgY29tbWVudHNbOjFdID0gW10KKyAgICAgICAgICAgIHdoaWxlIGNvbW1lbnRzIGFuZCBzdHJpbmcuc3RyaXAoY29tbWVudHNbLTFdKSA9PSAnIyc6CisgICAgICAgICAgICAgICAgY29tbWVudHNbLTE6XSA9IFtdCisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oY29tbWVudHMsICcnKQorCitjbGFzcyBFbmRPZkJsb2NrKEV4Y2VwdGlvbik6IHBhc3MKKworY2xhc3MgQmxvY2tGaW5kZXI6CisgICAgIiIiUHJvdmlkZSBhIHRva2VuZWF0ZXIoKSBtZXRob2QgdG8gZGV0ZWN0IHRoZSBlbmQgb2YgYSBjb2RlIGJsb2NrLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5pbmRlbnQgPSAwCisgICAgICAgIHNlbGYuaXNsYW1iZGEgPSBGYWxzZQorICAgICAgICBzZWxmLnN0YXJ0ZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnBhc3NsaW5lID0gRmFsc2UKKyAgICAgICAgc2VsZi5sYXN0ID0gMQorCisgICAgZGVmIHRva2VuZWF0ZXIoc2VsZiwgdHlwZSwgdG9rZW4sIHNyb3dfc2NvbCwgZXJvd19lY29sLCBsaW5lKToKKyAgICAgICAgc3Jvdywgc2NvbCA9IHNyb3dfc2NvbAorICAgICAgICBlcm93LCBlY29sID0gZXJvd19lY29sCisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXJ0ZWQ6CisgICAgICAgICAgICAjIGxvb2sgZm9yIHRoZSBmaXJzdCAiZGVmIiwgImNsYXNzIiBvciAibGFtYmRhIgorICAgICAgICAgICAgaWYgdG9rZW4gaW4gKCJkZWYiLCAiY2xhc3MiLCAibGFtYmRhIik6CisgICAgICAgICAgICAgICAgaWYgdG9rZW4gPT0gImxhbWJkYSI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaXNsYW1iZGEgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5zdGFydGVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5wYXNzbGluZSA9IFRydWUgICAgIyBza2lwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUKKyAgICAgICAgZWxpZiB0eXBlID09IHRva2VuaXplLk5FV0xJTkU6CisgICAgICAgICAgICBzZWxmLnBhc3NsaW5lID0gRmFsc2UgICAjIHN0b3Agc2tpcHBpbmcgd2hlbiBhIE5FV0xJTkUgaXMgc2VlbgorICAgICAgICAgICAgc2VsZi5sYXN0ID0gc3JvdworICAgICAgICAgICAgaWYgc2VsZi5pc2xhbWJkYTogICAgICAgIyBsYW1iZGFzIGFsd2F5cyBlbmQgYXQgdGhlIGZpcnN0IE5FV0xJTkUKKyAgICAgICAgICAgICAgICByYWlzZSBFbmRPZkJsb2NrCisgICAgICAgIGVsaWYgc2VsZi5wYXNzbGluZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiB0eXBlID09IHRva2VuaXplLklOREVOVDoKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnQgKyAxCisgICAgICAgICAgICBzZWxmLnBhc3NsaW5lID0gVHJ1ZQorICAgICAgICBlbGlmIHR5cGUgPT0gdG9rZW5pemUuREVERU5UOgorICAgICAgICAgICAgc2VsZi5pbmRlbnQgPSBzZWxmLmluZGVudCAtIDEKKyAgICAgICAgICAgICMgdGhlIGVuZCBvZiBtYXRjaGluZyBpbmRlbnQvZGVkZW50IHBhaXJzIGVuZCBhIGJsb2NrCisgICAgICAgICAgICAjIChub3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIGZvciAiZGVmIi8iY2xhc3MiIGJsb2NrcywKKyAgICAgICAgICAgICMgIG5vdCBlLmcuIGZvciAiaWY6IGVsc2U6IiBvciAidHJ5OiBmaW5hbGx5OiIgYmxvY2tzKQorICAgICAgICAgICAgaWYgc2VsZi5pbmRlbnQgPD0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBFbmRPZkJsb2NrCisgICAgICAgIGVsaWYgc2VsZi5pbmRlbnQgPT0gMCBhbmQgdHlwZSBub3QgaW4gKHRva2VuaXplLkNPTU1FTlQsIHRva2VuaXplLk5MKToKKyAgICAgICAgICAgICMgYW55IG90aGVyIHRva2VuIG9uIHRoZSBzYW1lIGluZGVudGF0aW9uIGxldmVsIGVuZCB0aGUgcHJldmlvdXMKKyAgICAgICAgICAgICMgYmxvY2sgYXMgd2VsbCwgZXhjZXB0IHRoZSBwc2V1ZG8tdG9rZW5zIENPTU1FTlQgYW5kIE5MLgorICAgICAgICAgICAgcmFpc2UgRW5kT2ZCbG9jaworCitkZWYgZ2V0YmxvY2sobGluZXMpOgorICAgICIiIkV4dHJhY3QgdGhlIGJsb2NrIG9mIGNvZGUgYXQgdGhlIHRvcCBvZiB0aGUgZ2l2ZW4gbGlzdCBvZiBsaW5lcy4iIiIKKyAgICBibG9ja2ZpbmRlciA9IEJsb2NrRmluZGVyKCkKKyAgICB0cnk6CisgICAgICAgIHRva2VuaXplLnRva2VuaXplKGl0ZXIobGluZXMpLm5leHQsIGJsb2NrZmluZGVyLnRva2VuZWF0ZXIpCisgICAgZXhjZXB0IChFbmRPZkJsb2NrLCBJbmRlbnRhdGlvbkVycm9yKToKKyAgICAgICAgcGFzcworICAgIHJldHVybiBsaW5lc1s6YmxvY2tmaW5kZXIubGFzdF0KKworZGVmIGdldHNvdXJjZWxpbmVzKG9iamVjdCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzb3VyY2UgbGluZXMgYW5kIHN0YXJ0aW5nIGxpbmUgbnVtYmVyIGZvciBhbiBvYmplY3QuCisKKyAgICBUaGUgYXJndW1lbnQgbWF5IGJlIGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCBmdW5jdGlvbiwgdHJhY2ViYWNrLCBmcmFtZSwKKyAgICBvciBjb2RlIG9iamVjdC4gIFRoZSBzb3VyY2UgY29kZSBpcyByZXR1cm5lZCBhcyBhIGxpc3Qgb2YgdGhlIGxpbmVzCisgICAgY29ycmVzcG9uZGluZyB0byB0aGUgb2JqZWN0IGFuZCB0aGUgbGluZSBudW1iZXIgaW5kaWNhdGVzIHdoZXJlIGluIHRoZQorICAgIG9yaWdpbmFsIHNvdXJjZSBmaWxlIHRoZSBmaXJzdCBsaW5lIG9mIGNvZGUgd2FzIGZvdW5kLiAgQW4gSU9FcnJvciBpcworICAgIHJhaXNlZCBpZiB0aGUgc291cmNlIGNvZGUgY2Fubm90IGJlIHJldHJpZXZlZC4iIiIKKyAgICBsaW5lcywgbG51bSA9IGZpbmRzb3VyY2Uob2JqZWN0KQorCisgICAgaWYgaXNtb2R1bGUob2JqZWN0KTogcmV0dXJuIGxpbmVzLCAwCisgICAgZWxzZTogcmV0dXJuIGdldGJsb2NrKGxpbmVzW2xudW06XSksIGxudW0gKyAxCisKK2RlZiBnZXRzb3VyY2Uob2JqZWN0KToKKyAgICAiIiJSZXR1cm4gdGhlIHRleHQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciBhbiBvYmplY3QuCisKKyAgICBUaGUgYXJndW1lbnQgbWF5IGJlIGEgbW9kdWxlLCBjbGFzcywgbWV0aG9kLCBmdW5jdGlvbiwgdHJhY2ViYWNrLCBmcmFtZSwKKyAgICBvciBjb2RlIG9iamVjdC4gIFRoZSBzb3VyY2UgY29kZSBpcyByZXR1cm5lZCBhcyBhIHNpbmdsZSBzdHJpbmcuICBBbgorICAgIElPRXJyb3IgaXMgcmFpc2VkIGlmIHRoZSBzb3VyY2UgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkLiIiIgorICAgIGxpbmVzLCBsbnVtID0gZ2V0c291cmNlbGluZXMob2JqZWN0KQorICAgIHJldHVybiBzdHJpbmcuam9pbihsaW5lcywgJycpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNsYXNzIHRyZWUgZXh0cmFjdGlvbgorZGVmIHdhbGt0cmVlKGNsYXNzZXMsIGNoaWxkcmVuLCBwYXJlbnQpOgorICAgICIiIlJlY3Vyc2l2ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGdldGNsYXNzdHJlZSgpLiIiIgorICAgIHJlc3VsdHMgPSBbXQorICAgIGNsYXNzZXMuc29ydChrZXk9YXR0cmdldHRlcignX19tb2R1bGVfXycsICdfX25hbWVfXycpKQorICAgIGZvciBjIGluIGNsYXNzZXM6CisgICAgICAgIHJlc3VsdHMuYXBwZW5kKChjLCBjLl9fYmFzZXNfXykpCisgICAgICAgIGlmIGMgaW4gY2hpbGRyZW46CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCh3YWxrdHJlZShjaGlsZHJlbltjXSwgY2hpbGRyZW4sIGMpKQorICAgIHJldHVybiByZXN1bHRzCisKK2RlZiBnZXRjbGFzc3RyZWUoY2xhc3NlcywgdW5pcXVlPTApOgorICAgICIiIkFycmFuZ2UgdGhlIGdpdmVuIGxpc3Qgb2YgY2xhc3NlcyBpbnRvIGEgaGllcmFyY2h5IG9mIG5lc3RlZCBsaXN0cy4KKworICAgIFdoZXJlIGEgbmVzdGVkIGxpc3QgYXBwZWFycywgaXQgY29udGFpbnMgY2xhc3NlcyBkZXJpdmVkIGZyb20gdGhlIGNsYXNzCisgICAgd2hvc2UgZW50cnkgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlIGxpc3QuICBFYWNoIGVudHJ5IGlzIGEgMi10dXBsZQorICAgIGNvbnRhaW5pbmcgYSBjbGFzcyBhbmQgYSB0dXBsZSBvZiBpdHMgYmFzZSBjbGFzc2VzLiAgSWYgdGhlICd1bmlxdWUnCisgICAgYXJndW1lbnQgaXMgdHJ1ZSwgZXhhY3RseSBvbmUgZW50cnkgYXBwZWFycyBpbiB0aGUgcmV0dXJuZWQgc3RydWN0dXJlCisgICAgZm9yIGVhY2ggY2xhc3MgaW4gdGhlIGdpdmVuIGxpc3QuICBPdGhlcndpc2UsIGNsYXNzZXMgdXNpbmcgbXVsdGlwbGUKKyAgICBpbmhlcml0YW5jZSBhbmQgdGhlaXIgZGVzY2VuZGFudHMgd2lsbCBhcHBlYXIgbXVsdGlwbGUgdGltZXMuIiIiCisgICAgY2hpbGRyZW4gPSB7fQorICAgIHJvb3RzID0gW10KKyAgICBmb3IgYyBpbiBjbGFzc2VzOgorICAgICAgICBpZiBjLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIGZvciBwYXJlbnQgaW4gYy5fX2Jhc2VzX186CisgICAgICAgICAgICAgICAgaWYgbm90IHBhcmVudCBpbiBjaGlsZHJlbjoKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5bcGFyZW50XSA9IFtdCisgICAgICAgICAgICAgICAgY2hpbGRyZW5bcGFyZW50XS5hcHBlbmQoYykKKyAgICAgICAgICAgICAgICBpZiB1bmlxdWUgYW5kIHBhcmVudCBpbiBjbGFzc2VzOiBicmVhaworICAgICAgICBlbGlmIGMgbm90IGluIHJvb3RzOgorICAgICAgICAgICAgcm9vdHMuYXBwZW5kKGMpCisgICAgZm9yIHBhcmVudCBpbiBjaGlsZHJlbjoKKyAgICAgICAgaWYgcGFyZW50IG5vdCBpbiBjbGFzc2VzOgorICAgICAgICAgICAgcm9vdHMuYXBwZW5kKHBhcmVudCkKKyAgICByZXR1cm4gd2Fsa3RyZWUocm9vdHMsIGNoaWxkcmVuLCBOb25lKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhcmd1bWVudCBsaXN0IGV4dHJhY3Rpb24KK0FyZ3VtZW50cyA9IG5hbWVkdHVwbGUoJ0FyZ3VtZW50cycsICdhcmdzIHZhcmFyZ3Mga2V5d29yZHMnKQorCitkZWYgZ2V0YXJncyhjbyk6CisgICAgIiIiR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBhcmd1bWVudHMgYWNjZXB0ZWQgYnkgYSBjb2RlIG9iamVjdC4KKworICAgIFRocmVlIHRoaW5ncyBhcmUgcmV0dXJuZWQ6IChhcmdzLCB2YXJhcmdzLCB2YXJrdyksIHdoZXJlICdhcmdzJyBpcworICAgIGEgbGlzdCBvZiBhcmd1bWVudCBuYW1lcyAocG9zc2libHkgY29udGFpbmluZyBuZXN0ZWQgbGlzdHMpLCBhbmQKKyAgICAndmFyYXJncycgYW5kICd2YXJrdycgYXJlIHRoZSBuYW1lcyBvZiB0aGUgKiBhbmQgKiogYXJndW1lbnRzIG9yIE5vbmUuIiIiCisKKyAgICBpZiBub3QgaXNjb2RlKGNvKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd7IXJ9IGlzIG5vdCBhIGNvZGUgb2JqZWN0Jy5mb3JtYXQoY28pKQorCisgICAgbmFyZ3MgPSBjby5jb19hcmdjb3VudAorICAgIG5hbWVzID0gY28uY29fdmFybmFtZXMKKyAgICBhcmdzID0gbGlzdChuYW1lc1s6bmFyZ3NdKQorICAgIHN0ZXAgPSAwCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgYWNyb2JhdGljcyBhcmUgZm9yIGFub255bW91cyAodHVwbGUpIGFyZ3VtZW50cy4KKyAgICBmb3IgaSBpbiByYW5nZShuYXJncyk6CisgICAgICAgIGlmIGFyZ3NbaV1bOjFdIGluICgnJywgJy4nKToKKyAgICAgICAgICAgIHN0YWNrLCByZW1haW4sIGNvdW50ID0gW10sIFtdLCBbXQorICAgICAgICAgICAgd2hpbGUgc3RlcCA8IGxlbihjby5jb19jb2RlKToKKyAgICAgICAgICAgICAgICBvcCA9IG9yZChjby5jb19jb2RlW3N0ZXBdKQorICAgICAgICAgICAgICAgIHN0ZXAgPSBzdGVwICsgMQorICAgICAgICAgICAgICAgIGlmIG9wID49IGRpcy5IQVZFX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgICAgICBvcG5hbWUgPSBkaXMub3BuYW1lW29wXQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG9yZChjby5jb19jb2RlW3N0ZXBdKSArIG9yZChjby5jb19jb2RlW3N0ZXArMV0pKjI1NgorICAgICAgICAgICAgICAgICAgICBzdGVwID0gc3RlcCArIDIKKyAgICAgICAgICAgICAgICAgICAgaWYgb3BuYW1lIGluICgnVU5QQUNLX1RVUExFJywgJ1VOUEFDS19TRVFVRU5DRScpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBvcG5hbWUgPT0gJ1NUT1JFX0ZBU1QnOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKG5hbWVzW3ZhbHVlXSkKKworICAgICAgICAgICAgICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIHN1Ymxpc3RzIG9mIGxlbmd0aCAxOiBkZWYgZm9vKChiYXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb2Vzbid0IGdlbmVyYXRlIHRoZSBVTlBBQ0tfVFVQTEUgYnl0ZWNvZGUsIHNvIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAjIGByZW1haW5gIGlzIGVtcHR5IGhlcmUsIHdlIGhhdmUgc3VjaCBhIHN1Ymxpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVtYWluOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrWzBdID0gW3N0YWNrWzBdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpblstMV0gPSByZW1haW5bLTFdIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHJlbWFpblstMV0gPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluLnBvcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBjb3VudC5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1stc2l6ZTpdID0gW3N0YWNrWy1zaXplOl1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZW1haW46IGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpblstMV0gPSByZW1haW5bLTFdIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZW1haW46IGJyZWFrCisgICAgICAgICAgICBhcmdzW2ldID0gc3RhY2tbMF0KKworICAgIHZhcmFyZ3MgPSBOb25lCisgICAgaWYgY28uY29fZmxhZ3MgJiBDT19WQVJBUkdTOgorICAgICAgICB2YXJhcmdzID0gY28uY29fdmFybmFtZXNbbmFyZ3NdCisgICAgICAgIG5hcmdzID0gbmFyZ3MgKyAxCisgICAgdmFya3cgPSBOb25lCisgICAgaWYgY28uY29fZmxhZ3MgJiBDT19WQVJLRVlXT1JEUzoKKyAgICAgICAgdmFya3cgPSBjby5jb192YXJuYW1lc1tuYXJnc10KKyAgICByZXR1cm4gQXJndW1lbnRzKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3KQorCitBcmdTcGVjID0gbmFtZWR0dXBsZSgnQXJnU3BlYycsICdhcmdzIHZhcmFyZ3Mga2V5d29yZHMgZGVmYXVsdHMnKQorCitkZWYgZ2V0YXJnc3BlYyhmdW5jKToKKyAgICAiIiJHZXQgdGhlIG5hbWVzIGFuZCBkZWZhdWx0IHZhbHVlcyBvZiBhIGZ1bmN0aW9uJ3MgYXJndW1lbnRzLgorCisgICAgQSB0dXBsZSBvZiBmb3VyIHRoaW5ncyBpcyByZXR1cm5lZDogKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cykuCisgICAgJ2FyZ3MnIGlzIGEgbGlzdCBvZiB0aGUgYXJndW1lbnQgbmFtZXMgKGl0IG1heSBjb250YWluIG5lc3RlZCBsaXN0cykuCisgICAgJ3ZhcmFyZ3MnIGFuZCAndmFya3cnIGFyZSB0aGUgbmFtZXMgb2YgdGhlICogYW5kICoqIGFyZ3VtZW50cyBvciBOb25lLgorICAgICdkZWZhdWx0cycgaXMgYW4gbi10dXBsZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZXMgb2YgdGhlIGxhc3QgbiBhcmd1bWVudHMuCisgICAgIiIiCisKKyAgICBpZiBpc21ldGhvZChmdW5jKToKKyAgICAgICAgZnVuYyA9IGZ1bmMuaW1fZnVuYworICAgIGlmIG5vdCBpc2Z1bmN0aW9uKGZ1bmMpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3shcn0gaXMgbm90IGEgUHl0aG9uIGZ1bmN0aW9uJy5mb3JtYXQoZnVuYykpCisgICAgYXJncywgdmFyYXJncywgdmFya3cgPSBnZXRhcmdzKGZ1bmMuZnVuY19jb2RlKQorICAgIHJldHVybiBBcmdTcGVjKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBmdW5jLmZ1bmNfZGVmYXVsdHMpCisKK0FyZ0luZm8gPSBuYW1lZHR1cGxlKCdBcmdJbmZvJywgJ2FyZ3MgdmFyYXJncyBrZXl3b3JkcyBsb2NhbHMnKQorCitkZWYgZ2V0YXJndmFsdWVzKGZyYW1lKToKKyAgICAiIiJHZXQgaW5mb3JtYXRpb24gYWJvdXQgYXJndW1lbnRzIHBhc3NlZCBpbnRvIGEgcGFydGljdWxhciBmcmFtZS4KKworICAgIEEgdHVwbGUgb2YgZm91ciB0aGluZ3MgaXMgcmV0dXJuZWQ6IChhcmdzLCB2YXJhcmdzLCB2YXJrdywgbG9jYWxzKS4KKyAgICAnYXJncycgaXMgYSBsaXN0IG9mIHRoZSBhcmd1bWVudCBuYW1lcyAoaXQgbWF5IGNvbnRhaW4gbmVzdGVkIGxpc3RzKS4KKyAgICAndmFyYXJncycgYW5kICd2YXJrdycgYXJlIHRoZSBuYW1lcyBvZiB0aGUgKiBhbmQgKiogYXJndW1lbnRzIG9yIE5vbmUuCisgICAgJ2xvY2FscycgaXMgdGhlIGxvY2FscyBkaWN0aW9uYXJ5IG9mIHRoZSBnaXZlbiBmcmFtZS4iIiIKKyAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdyA9IGdldGFyZ3MoZnJhbWUuZl9jb2RlKQorICAgIHJldHVybiBBcmdJbmZvKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBmcmFtZS5mX2xvY2FscykKKworZGVmIGpvaW5zZXEoc2VxKToKKyAgICBpZiBsZW4oc2VxKSA9PSAxOgorICAgICAgICByZXR1cm4gJygnICsgc2VxWzBdICsgJywpJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnKCcgKyBzdHJpbmcuam9pbihzZXEsICcsICcpICsgJyknCisKK2RlZiBzdHJzZXEob2JqZWN0LCBjb252ZXJ0LCBqb2luPWpvaW5zZXEpOgorICAgICIiIlJlY3Vyc2l2ZWx5IHdhbGsgYSBzZXF1ZW5jZSwgc3RyaW5naWZ5aW5nIGVhY2ggZWxlbWVudC4iIiIKKyAgICBpZiB0eXBlKG9iamVjdCkgaW4gKGxpc3QsIHR1cGxlKToKKyAgICAgICAgcmV0dXJuIGpvaW4obWFwKGxhbWJkYSBvLCBjPWNvbnZlcnQsIGo9am9pbjogc3Ryc2VxKG8sIGMsIGopLCBvYmplY3QpKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBjb252ZXJ0KG9iamVjdCkKKworZGVmIGZvcm1hdGFyZ3NwZWMoYXJncywgdmFyYXJncz1Ob25lLCB2YXJrdz1Ob25lLCBkZWZhdWx0cz1Ob25lLAorICAgICAgICAgICAgICAgICAgZm9ybWF0YXJnPXN0ciwKKyAgICAgICAgICAgICAgICAgIGZvcm1hdHZhcmFyZ3M9bGFtYmRhIG5hbWU6ICcqJyArIG5hbWUsCisgICAgICAgICAgICAgICAgICBmb3JtYXR2YXJrdz1sYW1iZGEgbmFtZTogJyoqJyArIG5hbWUsCisgICAgICAgICAgICAgICAgICBmb3JtYXR2YWx1ZT1sYW1iZGEgdmFsdWU6ICc9JyArIHJlcHIodmFsdWUpLAorICAgICAgICAgICAgICAgICAgam9pbj1qb2luc2VxKToKKyAgICAiIiJGb3JtYXQgYW4gYXJndW1lbnQgc3BlYyBmcm9tIHRoZSA0IHZhbHVlcyByZXR1cm5lZCBieSBnZXRhcmdzcGVjLgorCisgICAgVGhlIGZpcnN0IGZvdXIgYXJndW1lbnRzIGFyZSAoYXJncywgdmFyYXJncywgdmFya3csIGRlZmF1bHRzKS4gIFRoZQorICAgIG90aGVyIGZvdXIgYXJndW1lbnRzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBvcHRpb25hbCBmb3JtYXR0aW5nIGZ1bmN0aW9ucworICAgIHRoYXQgYXJlIGNhbGxlZCB0byB0dXJuIG5hbWVzIGFuZCB2YWx1ZXMgaW50byBzdHJpbmdzLiAgVGhlIG5pbnRoCisgICAgYXJndW1lbnQgaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSBzZXF1ZW5jZSBvZiBhcmd1bWVudHMuIiIiCisgICAgc3BlY3MgPSBbXQorICAgIGlmIGRlZmF1bHRzOgorICAgICAgICBmaXJzdGRlZmF1bHQgPSBsZW4oYXJncykgLSBsZW4oZGVmYXVsdHMpCisgICAgZm9yIGksIGFyZyBpbiBlbnVtZXJhdGUoYXJncyk6CisgICAgICAgIHNwZWMgPSBzdHJzZXEoYXJnLCBmb3JtYXRhcmcsIGpvaW4pCisgICAgICAgIGlmIGRlZmF1bHRzIGFuZCBpID49IGZpcnN0ZGVmYXVsdDoKKyAgICAgICAgICAgIHNwZWMgPSBzcGVjICsgZm9ybWF0dmFsdWUoZGVmYXVsdHNbaSAtIGZpcnN0ZGVmYXVsdF0pCisgICAgICAgIHNwZWNzLmFwcGVuZChzcGVjKQorICAgIGlmIHZhcmFyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgIHNwZWNzLmFwcGVuZChmb3JtYXR2YXJhcmdzKHZhcmFyZ3MpKQorICAgIGlmIHZhcmt3IGlzIG5vdCBOb25lOgorICAgICAgICBzcGVjcy5hcHBlbmQoZm9ybWF0dmFya3codmFya3cpKQorICAgIHJldHVybiAnKCcgKyBzdHJpbmcuam9pbihzcGVjcywgJywgJykgKyAnKScKKworZGVmIGZvcm1hdGFyZ3ZhbHVlcyhhcmdzLCB2YXJhcmdzLCB2YXJrdywgbG9jYWxzLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXRhcmc9c3RyLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXR2YXJhcmdzPWxhbWJkYSBuYW1lOiAnKicgKyBuYW1lLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXR2YXJrdz1sYW1iZGEgbmFtZTogJyoqJyArIG5hbWUsCisgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZhbHVlPWxhbWJkYSB2YWx1ZTogJz0nICsgcmVwcih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgIGpvaW49am9pbnNlcSk6CisgICAgIiIiRm9ybWF0IGFuIGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgNCB2YWx1ZXMgcmV0dXJuZWQgYnkgZ2V0YXJndmFsdWVzLgorCisgICAgVGhlIGZpcnN0IGZvdXIgYXJndW1lbnRzIGFyZSAoYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscykuICBUaGUKKyAgICBuZXh0IGZvdXIgYXJndW1lbnRzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBvcHRpb25hbCBmb3JtYXR0aW5nIGZ1bmN0aW9ucworICAgIHRoYXQgYXJlIGNhbGxlZCB0byB0dXJuIG5hbWVzIGFuZCB2YWx1ZXMgaW50byBzdHJpbmdzLiAgVGhlIG5pbnRoCisgICAgYXJndW1lbnQgaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSBzZXF1ZW5jZSBvZiBhcmd1bWVudHMuIiIiCisgICAgZGVmIGNvbnZlcnQobmFtZSwgbG9jYWxzPWxvY2FscywKKyAgICAgICAgICAgICAgICBmb3JtYXRhcmc9Zm9ybWF0YXJnLCBmb3JtYXR2YWx1ZT1mb3JtYXR2YWx1ZSk6CisgICAgICAgIHJldHVybiBmb3JtYXRhcmcobmFtZSkgKyBmb3JtYXR2YWx1ZShsb2NhbHNbbmFtZV0pCisgICAgc3BlY3MgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKGxlbihhcmdzKSk6CisgICAgICAgIHNwZWNzLmFwcGVuZChzdHJzZXEoYXJnc1tpXSwgY29udmVydCwgam9pbikpCisgICAgaWYgdmFyYXJnczoKKyAgICAgICAgc3BlY3MuYXBwZW5kKGZvcm1hdHZhcmFyZ3ModmFyYXJncykgKyBmb3JtYXR2YWx1ZShsb2NhbHNbdmFyYXJnc10pKQorICAgIGlmIHZhcmt3OgorICAgICAgICBzcGVjcy5hcHBlbmQoZm9ybWF0dmFya3codmFya3cpICsgZm9ybWF0dmFsdWUobG9jYWxzW3Zhcmt3XSkpCisgICAgcmV0dXJuICcoJyArIHN0cmluZy5qb2luKHNwZWNzLCAnLCAnKSArICcpJworCitkZWYgZ2V0Y2FsbGFyZ3MoZnVuYywgKnBvc2l0aW9uYWwsICoqbmFtZWQpOgorICAgICIiIkdldCB0aGUgbWFwcGluZyBvZiBhcmd1bWVudHMgdG8gdmFsdWVzLgorCisgICAgQSBkaWN0IGlzIHJldHVybmVkLCB3aXRoIGtleXMgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50IG5hbWVzIChpbmNsdWRpbmcgdGhlCisgICAgbmFtZXMgb2YgdGhlICogYW5kICoqIGFyZ3VtZW50cywgaWYgYW55KSwgYW5kIHZhbHVlcyB0aGUgcmVzcGVjdGl2ZSBib3VuZAorICAgIHZhbHVlcyBmcm9tICdwb3NpdGlvbmFsJyBhbmQgJ25hbWVkJy4iIiIKKyAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMgPSBnZXRhcmdzcGVjKGZ1bmMpCisgICAgZl9uYW1lID0gZnVuYy5fX25hbWVfXworICAgIGFyZzJ2YWx1ZSA9IHt9CisKKyAgICAjIFRoZSBmb2xsb3dpbmcgY2xvc3VyZXMgYXJlIGJhc2ljYWxseSBiZWNhdXNlIG9mIHR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcuCisgICAgYXNzaWduZWRfdHVwbGVfcGFyYW1zID0gW10KKyAgICBkZWYgYXNzaWduKGFyZywgdmFsdWUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGFyZywgc3RyKToKKyAgICAgICAgICAgIGFyZzJ2YWx1ZVthcmddID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2lnbmVkX3R1cGxlX3BhcmFtcy5hcHBlbmQoYXJnKQorICAgICAgICAgICAgdmFsdWUgPSBpdGVyKHZhbHVlKQorICAgICAgICAgICAgZm9yIGksIHN1YmFyZyBpbiBlbnVtZXJhdGUoYXJnKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHN1YnZhbHVlID0gbmV4dCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbmVlZCBtb3JlIHRoYW4gJWQgJXMgdG8gdW5wYWNrJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGksICd2YWx1ZXMnIGlmIGkgPiAxIGVsc2UgJ3ZhbHVlJykpCisgICAgICAgICAgICAgICAgYXNzaWduKHN1YmFyZyxzdWJ2YWx1ZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXh0KHZhbHVlKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0b28gbWFueSB2YWx1ZXMgdG8gdW5wYWNrJykKKyAgICBkZWYgaXNfYXNzaWduZWQoYXJnKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsc3RyKToKKyAgICAgICAgICAgIHJldHVybiBhcmcgaW4gYXJnMnZhbHVlCisgICAgICAgIHJldHVybiBhcmcgaW4gYXNzaWduZWRfdHVwbGVfcGFyYW1zCisgICAgaWYgaXNtZXRob2QoZnVuYykgYW5kIGZ1bmMuaW1fc2VsZiBpcyBub3QgTm9uZToKKyAgICAgICAgIyBpbXBsaWNpdCAnc2VsZicgKG9yICdjbHMnIGZvciBjbGFzc21ldGhvZHMpIGFyZ3VtZW50CisgICAgICAgIHBvc2l0aW9uYWwgPSAoZnVuYy5pbV9zZWxmLCkgKyBwb3NpdGlvbmFsCisgICAgbnVtX3BvcyA9IGxlbihwb3NpdGlvbmFsKQorICAgIG51bV90b3RhbCA9IG51bV9wb3MgKyBsZW4obmFtZWQpCisgICAgbnVtX2FyZ3MgPSBsZW4oYXJncykKKyAgICBudW1fZGVmYXVsdHMgPSBsZW4oZGVmYXVsdHMpIGlmIGRlZmF1bHRzIGVsc2UgMAorICAgIGZvciBhcmcsIHZhbHVlIGluIHppcChhcmdzLCBwb3NpdGlvbmFsKToKKyAgICAgICAgYXNzaWduKGFyZywgdmFsdWUpCisgICAgaWYgdmFyYXJnczoKKyAgICAgICAgaWYgbnVtX3BvcyA+IG51bV9hcmdzOgorICAgICAgICAgICAgYXNzaWduKHZhcmFyZ3MsIHBvc2l0aW9uYWxbLShudW1fcG9zLW51bV9hcmdzKTpdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzaWduKHZhcmFyZ3MsICgpKQorICAgIGVsaWYgMCA8IG51bV9hcmdzIDwgbnVtX3BvczoKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcygpIHRha2VzICVzICVkICVzICglZCBnaXZlbiknICUgKAorICAgICAgICAgICAgZl9uYW1lLCAnYXQgbW9zdCcgaWYgZGVmYXVsdHMgZWxzZSAnZXhhY3RseScsIG51bV9hcmdzLAorICAgICAgICAgICAgJ2FyZ3VtZW50cycgaWYgbnVtX2FyZ3MgPiAxIGVsc2UgJ2FyZ3VtZW50JywgbnVtX3RvdGFsKSkKKyAgICBlbGlmIG51bV9hcmdzID09IDAgYW5kIG51bV90b3RhbDoKKyAgICAgICAgaWYgdmFya3c6CisgICAgICAgICAgICBpZiBudW1fcG9zOgorICAgICAgICAgICAgICAgICMgWFhYOiBXZSBzaG91bGQgdXNlIG51bV9wb3MsIGJ1dCBQeXRob24gYWxzbyB1c2VzIG51bV90b3RhbDoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzKCkgdGFrZXMgZXhhY3RseSAwIGFyZ3VtZW50cyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoJWQgZ2l2ZW4pJyAlIChmX25hbWUsIG51bV90b3RhbCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJyVzKCkgdGFrZXMgbm8gYXJndW1lbnRzICglZCBnaXZlbiknICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZl9uYW1lLCBudW1fdG90YWwpKQorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHN0cikgYW5kIGFyZyBpbiBuYW1lZDoKKyAgICAgICAgICAgIGlmIGlzX2Fzc2lnbmVkKGFyZyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcygpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJndW1lbnQgJyVzJyIgJSAoZl9uYW1lLCBhcmcpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NpZ24oYXJnLCBuYW1lZC5wb3AoYXJnKSkKKyAgICBpZiBkZWZhdWx0czogICAgIyBmaWxsIGluIGFueSBtaXNzaW5nIHZhbHVlcyB3aXRoIHRoZSBkZWZhdWx0cworICAgICAgICBmb3IgYXJnLCB2YWx1ZSBpbiB6aXAoYXJnc1stbnVtX2RlZmF1bHRzOl0sIGRlZmF1bHRzKToKKyAgICAgICAgICAgIGlmIG5vdCBpc19hc3NpZ25lZChhcmcpOgorICAgICAgICAgICAgICAgIGFzc2lnbihhcmcsIHZhbHVlKQorICAgIGlmIHZhcmt3OgorICAgICAgICBhc3NpZ24odmFya3csIG5hbWVkKQorICAgIGVsaWYgbmFtZWQ6CisgICAgICAgIHVuZXhwZWN0ZWQgPSBuZXh0KGl0ZXIobmFtZWQpKQorICAgICAgICBpZiBpc2luc3RhbmNlKHVuZXhwZWN0ZWQsIHVuaWNvZGUpOgorICAgICAgICAgICAgdW5leHBlY3RlZCA9IHVuZXhwZWN0ZWQuZW5jb2RlKHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSwgJ3JlcGxhY2UnKQorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAoZl9uYW1lLCB1bmV4cGVjdGVkKSkKKyAgICB1bmFzc2lnbmVkID0gbnVtX2FyZ3MgLSBsZW4oW2FyZyBmb3IgYXJnIGluIGFyZ3MgaWYgaXNfYXNzaWduZWQoYXJnKV0pCisgICAgaWYgdW5hc3NpZ25lZDoKKyAgICAgICAgbnVtX3JlcXVpcmVkID0gbnVtX2FyZ3MgLSBudW1fZGVmYXVsdHMKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCclcygpIHRha2VzICVzICVkICVzICglZCBnaXZlbiknICUgKAorICAgICAgICAgICAgZl9uYW1lLCAnYXQgbGVhc3QnIGlmIGRlZmF1bHRzIGVsc2UgJ2V4YWN0bHknLCBudW1fcmVxdWlyZWQsCisgICAgICAgICAgICAnYXJndW1lbnRzJyBpZiBudW1fcmVxdWlyZWQgPiAxIGVsc2UgJ2FyZ3VtZW50JywgbnVtX3RvdGFsKSkKKyAgICByZXR1cm4gYXJnMnZhbHVlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc3RhY2sgZnJhbWUgZXh0cmFjdGlvbgorCitUcmFjZWJhY2sgPSBuYW1lZHR1cGxlKCdUcmFjZWJhY2snLCAnZmlsZW5hbWUgbGluZW5vIGZ1bmN0aW9uIGNvZGVfY29udGV4dCBpbmRleCcpCisKK2RlZiBnZXRmcmFtZWluZm8oZnJhbWUsIGNvbnRleHQ9MSk6CisgICAgIiIiR2V0IGluZm9ybWF0aW9uIGFib3V0IGEgZnJhbWUgb3IgdHJhY2ViYWNrIG9iamVjdC4KKworICAgIEEgdHVwbGUgb2YgZml2ZSB0aGluZ3MgaXMgcmV0dXJuZWQ6IHRoZSBmaWxlbmFtZSwgdGhlIGxpbmUgbnVtYmVyIG9mCisgICAgdGhlIGN1cnJlbnQgbGluZSwgdGhlIGZ1bmN0aW9uIG5hbWUsIGEgbGlzdCBvZiBsaW5lcyBvZiBjb250ZXh0IGZyb20KKyAgICB0aGUgc291cmNlIGNvZGUsIGFuZCB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgbGluZSB3aXRoaW4gdGhhdCBsaXN0LgorICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgbGluZXMgb2YgY29udGV4dAorICAgIHRvIHJldHVybiwgd2hpY2ggYXJlIGNlbnRlcmVkIGFyb3VuZCB0aGUgY3VycmVudCBsaW5lLiIiIgorICAgIGlmIGlzdHJhY2ViYWNrKGZyYW1lKToKKyAgICAgICAgbGluZW5vID0gZnJhbWUudGJfbGluZW5vCisgICAgICAgIGZyYW1lID0gZnJhbWUudGJfZnJhbWUKKyAgICBlbHNlOgorICAgICAgICBsaW5lbm8gPSBmcmFtZS5mX2xpbmVubworICAgIGlmIG5vdCBpc2ZyYW1lKGZyYW1lKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCd7IXJ9IGlzIG5vdCBhIGZyYW1lIG9yIHRyYWNlYmFjayBvYmplY3QnLmZvcm1hdChmcmFtZSkpCisKKyAgICBmaWxlbmFtZSA9IGdldHNvdXJjZWZpbGUoZnJhbWUpIG9yIGdldGZpbGUoZnJhbWUpCisgICAgaWYgY29udGV4dCA+IDA6CisgICAgICAgIHN0YXJ0ID0gbGluZW5vIC0gMSAtIGNvbnRleHQvLzIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZXMsIGxudW0gPSBmaW5kc291cmNlKGZyYW1lKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIGxpbmVzID0gaW5kZXggPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGFydCA9IG1heChzdGFydCwgMSkKKyAgICAgICAgICAgIHN0YXJ0ID0gbWF4KDAsIG1pbihzdGFydCwgbGVuKGxpbmVzKSAtIGNvbnRleHQpKQorICAgICAgICAgICAgbGluZXMgPSBsaW5lc1tzdGFydDpzdGFydCtjb250ZXh0XQorICAgICAgICAgICAgaW5kZXggPSBsaW5lbm8gLSAxIC0gc3RhcnQKKyAgICBlbHNlOgorICAgICAgICBsaW5lcyA9IGluZGV4ID0gTm9uZQorCisgICAgcmV0dXJuIFRyYWNlYmFjayhmaWxlbmFtZSwgbGluZW5vLCBmcmFtZS5mX2NvZGUuY29fbmFtZSwgbGluZXMsIGluZGV4KQorCitkZWYgZ2V0bGluZW5vKGZyYW1lKToKKyAgICAiIiJHZXQgdGhlIGxpbmUgbnVtYmVyIGZyb20gYSBmcmFtZSBvYmplY3QsIGFsbG93aW5nIGZvciBvcHRpbWl6YXRpb24uIiIiCisgICAgIyBGcmFtZVR5cGUuZl9saW5lbm8gaXMgbm93IGEgZGVzY3JpcHRvciB0aGF0IGdyb3ZlbHMgY29fbG5vdGFiCisgICAgcmV0dXJuIGZyYW1lLmZfbGluZW5vCisKK2RlZiBnZXRvdXRlcmZyYW1lcyhmcmFtZSwgY29udGV4dD0xKToKKyAgICAiIiJHZXQgYSBsaXN0IG9mIHJlY29yZHMgZm9yIGEgZnJhbWUgYW5kIGFsbCBoaWdoZXIgKGNhbGxpbmcpIGZyYW1lcy4KKworICAgIEVhY2ggcmVjb3JkIGNvbnRhaW5zIGEgZnJhbWUgb2JqZWN0LCBmaWxlbmFtZSwgbGluZSBudW1iZXIsIGZ1bmN0aW9uCisgICAgbmFtZSwgYSBsaXN0IG9mIGxpbmVzIG9mIGNvbnRleHQsIGFuZCBpbmRleCB3aXRoaW4gdGhlIGNvbnRleHQuIiIiCisgICAgZnJhbWVsaXN0ID0gW10KKyAgICB3aGlsZSBmcmFtZToKKyAgICAgICAgZnJhbWVsaXN0LmFwcGVuZCgoZnJhbWUsKSArIGdldGZyYW1laW5mbyhmcmFtZSwgY29udGV4dCkpCisgICAgICAgIGZyYW1lID0gZnJhbWUuZl9iYWNrCisgICAgcmV0dXJuIGZyYW1lbGlzdAorCitkZWYgZ2V0aW5uZXJmcmFtZXModGIsIGNvbnRleHQ9MSk6CisgICAgIiIiR2V0IGEgbGlzdCBvZiByZWNvcmRzIGZvciBhIHRyYWNlYmFjaydzIGZyYW1lIGFuZCBhbGwgbG93ZXIgZnJhbWVzLgorCisgICAgRWFjaCByZWNvcmQgY29udGFpbnMgYSBmcmFtZSBvYmplY3QsIGZpbGVuYW1lLCBsaW5lIG51bWJlciwgZnVuY3Rpb24KKyAgICBuYW1lLCBhIGxpc3Qgb2YgbGluZXMgb2YgY29udGV4dCwgYW5kIGluZGV4IHdpdGhpbiB0aGUgY29udGV4dC4iIiIKKyAgICBmcmFtZWxpc3QgPSBbXQorICAgIHdoaWxlIHRiOgorICAgICAgICBmcmFtZWxpc3QuYXBwZW5kKCh0Yi50Yl9mcmFtZSwpICsgZ2V0ZnJhbWVpbmZvKHRiLCBjb250ZXh0KSkKKyAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgcmV0dXJuIGZyYW1lbGlzdAorCitpZiBoYXNhdHRyKHN5cywgJ19nZXRmcmFtZScpOgorICAgIGN1cnJlbnRmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUKK2Vsc2U6CisgICAgY3VycmVudGZyYW1lID0gbGFtYmRhIF89Tm9uZTogTm9uZQorCitkZWYgc3RhY2soY29udGV4dD0xKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHJlY29yZHMgZm9yIHRoZSBzdGFjayBhYm92ZSB0aGUgY2FsbGVyJ3MgZnJhbWUuIiIiCisgICAgcmV0dXJuIGdldG91dGVyZnJhbWVzKHN5cy5fZ2V0ZnJhbWUoMSksIGNvbnRleHQpCisKK2RlZiB0cmFjZShjb250ZXh0PTEpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcmVjb3JkcyBmb3IgdGhlIHN0YWNrIGJlbG93IHRoZSBjdXJyZW50IGV4Y2VwdGlvbi4iIiIKKyAgICByZXR1cm4gZ2V0aW5uZXJmcmFtZXMoc3lzLmV4Y19pbmZvKClbMl0sIGNvbnRleHQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2luc3BlY3QucHljIGIvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2RlZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2luc3BlY3QucHlvIGIvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2RlZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pbnNwZWN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2lvLnB5IGIvbGliL3B5dGhvbjIuNy9pby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjgzMjc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pby5weQpAQCAtMCwwICsxLDg5IEBACisiIiJUaGUgaW8gbW9kdWxlIHByb3ZpZGVzIHRoZSBQeXRob24gaW50ZXJmYWNlcyB0byBzdHJlYW0gaGFuZGxpbmcuIFRoZQorYnVpbHRpbiBvcGVuIGZ1bmN0aW9uIGlzIGRlZmluZWQgaW4gdGhpcyBtb2R1bGUuCisKK0F0IHRoZSB0b3Agb2YgdGhlIEkvTyBoaWVyYXJjaHkgaXMgdGhlIGFic3RyYWN0IGJhc2UgY2xhc3MgSU9CYXNlLiBJdAorZGVmaW5lcyB0aGUgYmFzaWMgaW50ZXJmYWNlIHRvIGEgc3RyZWFtLiBOb3RlLCBob3dldmVyLCB0aGF0IHRoZXJlIGlzIG5vCitzZXBhcmF0aW9uIGJldHdlZW4gcmVhZGluZyBhbmQgd3JpdGluZyB0byBzdHJlYW1zOyBpbXBsZW1lbnRhdGlvbnMgYXJlCithbGxvd2VkIHRvIHJhaXNlIGFuIElPRXJyb3IgaWYgdGhleSBkbyBub3Qgc3VwcG9ydCBhIGdpdmVuIG9wZXJhdGlvbi4KKworRXh0ZW5kaW5nIElPQmFzZSBpcyBSYXdJT0Jhc2Ugd2hpY2ggZGVhbHMgc2ltcGx5IHdpdGggdGhlIHJlYWRpbmcgYW5kCit3cml0aW5nIG9mIHJhdyBieXRlcyB0byBhIHN0cmVhbS4gRmlsZUlPIHN1YmNsYXNzZXMgUmF3SU9CYXNlIHRvIHByb3ZpZGUKK2FuIGludGVyZmFjZSB0byBPUyBmaWxlcy4KKworQnVmZmVyZWRJT0Jhc2UgZGVhbHMgd2l0aCBidWZmZXJpbmcgb24gYSByYXcgYnl0ZSBzdHJlYW0gKFJhd0lPQmFzZSkuIEl0cworc3ViY2xhc3NlcywgQnVmZmVyZWRXcml0ZXIsIEJ1ZmZlcmVkUmVhZGVyLCBhbmQgQnVmZmVyZWRSV1BhaXIgYnVmZmVyCitzdHJlYW1zIHRoYXQgYXJlIHJlYWRhYmxlLCB3cml0YWJsZSwgYW5kIGJvdGggcmVzcGVjdGl2ZWx5LgorQnVmZmVyZWRSYW5kb20gcHJvdmlkZXMgYSBidWZmZXJlZCBpbnRlcmZhY2UgdG8gcmFuZG9tIGFjY2Vzcworc3RyZWFtcy4gQnl0ZXNJTyBpcyBhIHNpbXBsZSBzdHJlYW0gb2YgaW4tbWVtb3J5IGJ5dGVzLgorCitBbm90aGVyIElPQmFzZSBzdWJjbGFzcywgVGV4dElPQmFzZSwgZGVhbHMgd2l0aCB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nCitvZiBzdHJlYW1zIGludG8gdGV4dC4gVGV4dElPV3JhcHBlciwgd2hpY2ggZXh0ZW5kcyBpdCwgaXMgYSBidWZmZXJlZCB0ZXh0CitpbnRlcmZhY2UgdG8gYSBidWZmZXJlZCByYXcgc3RyZWFtIChgQnVmZmVyZWRJT0Jhc2VgKS4gRmluYWxseSwgU3RyaW5nSU8KK2lzIGEgaW4tbWVtb3J5IHN0cmVhbSBmb3IgdGV4dC4KKworQXJndW1lbnQgbmFtZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzcGVjaWZpY2F0aW9uLCBhbmQgb25seSB0aGUgYXJndW1lbnRzCitvZiBvcGVuKCkgYXJlIGludGVuZGVkIHRvIGJlIHVzZWQgYXMga2V5d29yZCBhcmd1bWVudHMuCisKK2RhdGE6CisKK0RFRkFVTFRfQlVGRkVSX1NJWkUKKworICAgQW4gaW50IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgYnVmZmVyIHNpemUgdXNlZCBieSB0aGUgbW9kdWxlJ3MgYnVmZmVyZWQKKyAgIEkvTyBjbGFzc2VzLiBvcGVuKCkgdXNlcyB0aGUgZmlsZSdzIGJsa3NpemUgKGFzIG9idGFpbmVkIGJ5IG9zLnN0YXQpIGlmCisgICBwb3NzaWJsZS4KKyIiIgorIyBOZXcgSS9PIGxpYnJhcnkgY29uZm9ybWluZyB0byBQRVAgMzExNi4KKworX19hdXRob3JfXyA9ICgiR3VpZG8gdmFuIFJvc3N1bSA8Z3VpZG9AcHl0aG9uLm9yZz4sICIKKyAgICAgICAgICAgICAgIk1pa2UgVmVyZG9uZSA8bWlrZS52ZXJkb25lQGdtYWlsLmNvbT4sICIKKyAgICAgICAgICAgICAgIk1hcmsgUnVzc2VsbCA8bWFyay5ydXNzZWxsQHplbi5jby51az4sICIKKyAgICAgICAgICAgICAgIkFudG9pbmUgUGl0cm91IDxzb2xpcHNpc0BwaXRyb3UubmV0PiwgIgorICAgICAgICAgICAgICAiQW1hdXJ5IEZvcmdlb3QgZCdBcmMgPGFtYXVyeWZhQGdtYWlsLmNvbT4sICIKKyAgICAgICAgICAgICAgIkJlbmphbWluIFBldGVyc29uIDxiZW5qYW1pbkBweXRob24ub3JnPiIpCisKK19fYWxsX18gPSBbIkJsb2NraW5nSU9FcnJvciIsICJvcGVuIiwgIklPQmFzZSIsICJSYXdJT0Jhc2UiLCAiRmlsZUlPIiwKKyAgICAgICAgICAgIkJ5dGVzSU8iLCAiU3RyaW5nSU8iLCAiQnVmZmVyZWRJT0Jhc2UiLAorICAgICAgICAgICAiQnVmZmVyZWRSZWFkZXIiLCAiQnVmZmVyZWRXcml0ZXIiLCAiQnVmZmVyZWRSV1BhaXIiLAorICAgICAgICAgICAiQnVmZmVyZWRSYW5kb20iLCAiVGV4dElPQmFzZSIsICJUZXh0SU9XcmFwcGVyIiwKKyAgICAgICAgICAgIlVuc3VwcG9ydGVkT3BlcmF0aW9uIiwgIlNFRUtfU0VUIiwgIlNFRUtfQ1VSIiwgIlNFRUtfRU5EIl0KKworCitpbXBvcnQgX2lvCitpbXBvcnQgYWJjCisKK2Zyb20gX2lvIGltcG9ydCAoREVGQVVMVF9CVUZGRVJfU0laRSwgQmxvY2tpbmdJT0Vycm9yLCBVbnN1cHBvcnRlZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgb3BlbiwgRmlsZUlPLCBCeXRlc0lPLCBTdHJpbmdJTywgQnVmZmVyZWRSZWFkZXIsCisgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkV3JpdGVyLCBCdWZmZXJlZFJXUGFpciwgQnVmZmVyZWRSYW5kb20sCisgICAgICAgICAgICAgICAgIEluY3JlbWVudGFsTmV3bGluZURlY29kZXIsIFRleHRJT1dyYXBwZXIpCisKK09wZW5XcmFwcGVyID0gX2lvLm9wZW4gIyBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIF9weWlvCisKKyMgZm9yIHNlZWsoKQorU0VFS19TRVQgPSAwCitTRUVLX0NVUiA9IDEKK1NFRUtfRU5EID0gMgorCisjIERlY2xhcmluZyBBQkNzIGluIEMgaXMgdHJpY2t5IHNvIHdlIGRvIGl0IGhlcmUuCisjIE1ldGhvZCBkZXNjcmlwdGlvbnMgYW5kIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGFyZSBpbmhlcml0ZWQgZnJvbSB0aGUgQworIyB2ZXJzaW9uIGhvd2V2ZXIuCitjbGFzcyBJT0Jhc2UoX2lvLl9JT0Jhc2UpOgorICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorCitjbGFzcyBSYXdJT0Jhc2UoX2lvLl9SYXdJT0Jhc2UsIElPQmFzZSk6CisgICAgcGFzcworCitjbGFzcyBCdWZmZXJlZElPQmFzZShfaW8uX0J1ZmZlcmVkSU9CYXNlLCBJT0Jhc2UpOgorICAgIHBhc3MKKworY2xhc3MgVGV4dElPQmFzZShfaW8uX1RleHRJT0Jhc2UsIElPQmFzZSk6CisgICAgcGFzcworCitSYXdJT0Jhc2UucmVnaXN0ZXIoRmlsZUlPKQorCitmb3Iga2xhc3MgaW4gKEJ5dGVzSU8sIEJ1ZmZlcmVkUmVhZGVyLCBCdWZmZXJlZFdyaXRlciwgQnVmZmVyZWRSYW5kb20sCisgICAgICAgICAgICAgIEJ1ZmZlcmVkUldQYWlyKToKKyAgICBCdWZmZXJlZElPQmFzZS5yZWdpc3RlcihrbGFzcykKKworZm9yIGtsYXNzIGluIChTdHJpbmdJTywgVGV4dElPV3JhcHBlcik6CisgICAgVGV4dElPQmFzZS5yZWdpc3RlcihrbGFzcykKK2RlbCBrbGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pby5weWMgYi9saWIvcHl0aG9uMi43L2lvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDYwNmNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9pby5weW8gYi9saWIvcHl0aG9uMi43L2lvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDYwNmNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9pby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZTg1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vX19pbml0X18ucHkKQEAgLTAsMCArMSwzNTEgQEAKK3IiIiJKU09OIChKYXZhU2NyaXB0IE9iamVjdCBOb3RhdGlvbikgPGh0dHA6Ly9qc29uLm9yZz4gaXMgYSBzdWJzZXQgb2YKK0phdmFTY3JpcHQgc3ludGF4IChFQ01BLTI2MiAzcmQgZWRpdGlvbikgdXNlZCBhcyBhIGxpZ2h0d2VpZ2h0IGRhdGEKK2ludGVyY2hhbmdlIGZvcm1hdC4KKworOm1vZDpganNvbmAgZXhwb3NlcyBhbiBBUEkgZmFtaWxpYXIgdG8gdXNlcnMgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkKKzptb2Q6YG1hcnNoYWxgIGFuZCA6bW9kOmBwaWNrbGVgIG1vZHVsZXMuIEl0IGlzIHRoZSBleHRlcm5hbGx5IG1haW50YWluZWQKK3ZlcnNpb24gb2YgdGhlIDptb2Q6YGpzb25gIGxpYnJhcnkgY29udGFpbmVkIGluIFB5dGhvbiAyLjYsIGJ1dCBtYWludGFpbnMKK2NvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi40IGFuZCBQeXRob24gMi41IGFuZCAoY3VycmVudGx5KSBoYXMKK3NpZ25pZmljYW50IHBlcmZvcm1hbmNlIGFkdmFudGFnZXMsIGV2ZW4gd2l0aG91dCB1c2luZyB0aGUgb3B0aW9uYWwgQworZXh0ZW5zaW9uIGZvciBzcGVlZHVwcy4KKworRW5jb2RpbmcgYmFzaWMgUHl0aG9uIG9iamVjdCBoaWVyYXJjaGllczo6CisKKyAgICA+Pj4gaW1wb3J0IGpzb24KKyAgICA+Pj4ganNvbi5kdW1wcyhbJ2ZvbycsIHsnYmFyJzogKCdiYXonLCBOb25lLCAxLjAsIDIpfV0pCisgICAgJ1siZm9vIiwgeyJiYXIiOiBbImJheiIsIG51bGwsIDEuMCwgMl19XScKKyAgICA+Pj4gcHJpbnQganNvbi5kdW1wcygiXCJmb29cYmFyIikKKyAgICAiXCJmb29cYmFyIgorICAgID4+PiBwcmludCBqc29uLmR1bXBzKHUnXHUxMjM0JykKKyAgICAiXHUxMjM0IgorICAgID4+PiBwcmludCBqc29uLmR1bXBzKCdcXCcpCisgICAgIlxcIgorICAgID4+PiBwcmludCBqc29uLmR1bXBzKHsiYyI6IDAsICJiIjogMCwgImEiOiAwfSwgc29ydF9rZXlzPVRydWUpCisgICAgeyJhIjogMCwgImIiOiAwLCAiYyI6IDB9CisgICAgPj4+IGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IGlvID0gU3RyaW5nSU8oKQorICAgID4+PiBqc29uLmR1bXAoWydzdHJlYW1pbmcgQVBJJ10sIGlvKQorICAgID4+PiBpby5nZXR2YWx1ZSgpCisgICAgJ1sic3RyZWFtaW5nIEFQSSJdJworCitDb21wYWN0IGVuY29kaW5nOjoKKworICAgID4+PiBpbXBvcnQganNvbgorICAgID4+PiBqc29uLmR1bXBzKFsxLDIsMyx7JzQnOiA1LCAnNic6IDd9XSwgc29ydF9rZXlzPVRydWUsIHNlcGFyYXRvcnM9KCcsJywnOicpKQorICAgICdbMSwyLDMseyI0Ijo1LCI2Ijo3fV0nCisKK1ByZXR0eSBwcmludGluZzo6CisKKyAgICA+Pj4gaW1wb3J0IGpzb24KKyAgICA+Pj4gcHJpbnQganNvbi5kdW1wcyh7JzQnOiA1LCAnNic6IDd9LCBzb3J0X2tleXM9VHJ1ZSwKKyAgICAuLi4gICAgICAgICAgICAgICAgICBpbmRlbnQ9NCwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKKyAgICB7CisgICAgICAgICI0IjogNSwKKyAgICAgICAgIjYiOiA3CisgICAgfQorCitEZWNvZGluZyBKU09OOjoKKworICAgID4+PiBpbXBvcnQganNvbgorICAgID4+PiBvYmogPSBbdSdmb28nLCB7dSdiYXInOiBbdSdiYXonLCBOb25lLCAxLjAsIDJdfV0KKyAgICA+Pj4ganNvbi5sb2FkcygnWyJmb28iLCB7ImJhciI6WyJiYXoiLCBudWxsLCAxLjAsIDJdfV0nKSA9PSBvYmoKKyAgICBUcnVlCisgICAgPj4+IGpzb24ubG9hZHMoJyJcXCJmb29cXGJhciInKSA9PSB1JyJmb29ceDA4YXInCisgICAgVHJ1ZQorICAgID4+PiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgID4+PiBpbyA9IFN0cmluZ0lPKCdbInN0cmVhbWluZyBBUEkiXScpCisgICAgPj4+IGpzb24ubG9hZChpbylbMF0gPT0gJ3N0cmVhbWluZyBBUEknCisgICAgVHJ1ZQorCitTcGVjaWFsaXppbmcgSlNPTiBvYmplY3QgZGVjb2Rpbmc6OgorCisgICAgPj4+IGltcG9ydCBqc29uCisgICAgPj4+IGRlZiBhc19jb21wbGV4KGRjdCk6CisgICAgLi4uICAgICBpZiAnX19jb21wbGV4X18nIGluIGRjdDoKKyAgICAuLi4gICAgICAgICByZXR1cm4gY29tcGxleChkY3RbJ3JlYWwnXSwgZGN0WydpbWFnJ10pCisgICAgLi4uICAgICByZXR1cm4gZGN0CisgICAgLi4uCisgICAgPj4+IGpzb24ubG9hZHMoJ3siX19jb21wbGV4X18iOiB0cnVlLCAicmVhbCI6IDEsICJpbWFnIjogMn0nLAorICAgIC4uLiAgICAgb2JqZWN0X2hvb2s9YXNfY29tcGxleCkKKyAgICAoMSsyaikKKyAgICA+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCisgICAgPj4+IGpzb24ubG9hZHMoJzEuMScsIHBhcnNlX2Zsb2F0PURlY2ltYWwpID09IERlY2ltYWwoJzEuMScpCisgICAgVHJ1ZQorCitTcGVjaWFsaXppbmcgSlNPTiBvYmplY3QgZW5jb2Rpbmc6OgorCisgICAgPj4+IGltcG9ydCBqc29uCisgICAgPj4+IGRlZiBlbmNvZGVfY29tcGxleChvYmopOgorICAgIC4uLiAgICAgaWYgaXNpbnN0YW5jZShvYmosIGNvbXBsZXgpOgorICAgIC4uLiAgICAgICAgIHJldHVybiBbb2JqLnJlYWwsIG9iai5pbWFnXQorICAgIC4uLiAgICAgcmFpc2UgVHlwZUVycm9yKHJlcHIobykgKyAiIGlzIG5vdCBKU09OIHNlcmlhbGl6YWJsZSIpCisgICAgLi4uCisgICAgPj4+IGpzb24uZHVtcHMoMiArIDFqLCBkZWZhdWx0PWVuY29kZV9jb21wbGV4KQorICAgICdbMi4wLCAxLjBdJworICAgID4+PiBqc29uLkpTT05FbmNvZGVyKGRlZmF1bHQ9ZW5jb2RlX2NvbXBsZXgpLmVuY29kZSgyICsgMWopCisgICAgJ1syLjAsIDEuMF0nCisgICAgPj4+ICcnLmpvaW4oanNvbi5KU09ORW5jb2RlcihkZWZhdWx0PWVuY29kZV9jb21wbGV4KS5pdGVyZW5jb2RlKDIgKyAxaikpCisgICAgJ1syLjAsIDEuMF0nCisKKworVXNpbmcganNvbi50b29sIGZyb20gdGhlIHNoZWxsIHRvIHZhbGlkYXRlIGFuZCBwcmV0dHktcHJpbnQ6OgorCisgICAgJCBlY2hvICd7Impzb24iOiJvYmoifScgfCBweXRob24gLW0ganNvbi50b29sCisgICAgeworICAgICAgICAianNvbiI6ICJvYmoiCisgICAgfQorICAgICQgZWNobyAneyAxLjI6My40fScgfCBweXRob24gLW0ganNvbi50b29sCisgICAgRXhwZWN0aW5nIHByb3BlcnR5IG5hbWUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlczogbGluZSAxIGNvbHVtbiAzIChjaGFyIDIpCisiIiIKK19fdmVyc2lvbl9fID0gJzIuMC45JworX19hbGxfXyA9IFsKKyAgICAnZHVtcCcsICdkdW1wcycsICdsb2FkJywgJ2xvYWRzJywKKyAgICAnSlNPTkRlY29kZXInLCAnSlNPTkVuY29kZXInLAorXQorCitfX2F1dGhvcl9fID0gJ0JvYiBJcHBvbGl0byA8Ym9iQHJlZGl2aS5jb20+JworCitmcm9tIC5kZWNvZGVyIGltcG9ydCBKU09ORGVjb2RlcgorZnJvbSAuZW5jb2RlciBpbXBvcnQgSlNPTkVuY29kZXIKKworX2RlZmF1bHRfZW5jb2RlciA9IEpTT05FbmNvZGVyKAorICAgIHNraXBrZXlzPUZhbHNlLAorICAgIGVuc3VyZV9hc2NpaT1UcnVlLAorICAgIGNoZWNrX2NpcmN1bGFyPVRydWUsCisgICAgYWxsb3dfbmFuPVRydWUsCisgICAgaW5kZW50PU5vbmUsCisgICAgc2VwYXJhdG9ycz1Ob25lLAorICAgIGVuY29kaW5nPSd1dGYtOCcsCisgICAgZGVmYXVsdD1Ob25lLAorKQorCitkZWYgZHVtcChvYmosIGZwLCBza2lwa2V5cz1GYWxzZSwgZW5zdXJlX2FzY2lpPVRydWUsIGNoZWNrX2NpcmN1bGFyPVRydWUsCisgICAgICAgIGFsbG93X25hbj1UcnVlLCBjbHM9Tm9uZSwgaW5kZW50PU5vbmUsIHNlcGFyYXRvcnM9Tm9uZSwKKyAgICAgICAgZW5jb2Rpbmc9J3V0Zi04JywgZGVmYXVsdD1Ob25lLCBzb3J0X2tleXM9RmFsc2UsICoqa3cpOgorICAgICIiIlNlcmlhbGl6ZSBgYG9iamBgIGFzIGEgSlNPTiBmb3JtYXR0ZWQgc3RyZWFtIHRvIGBgZnBgYCAoYQorICAgIGBgLndyaXRlKClgYC1zdXBwb3J0aW5nIGZpbGUtbGlrZSBvYmplY3QpLgorCisgICAgSWYgYGBza2lwa2V5c2BgIGlzIHRydWUgdGhlbiBgYGRpY3RgYCBrZXlzIHRoYXQgYXJlIG5vdCBiYXNpYyB0eXBlcworICAgIChgYHN0cmBgLCBgYHVuaWNvZGVgYCwgYGBpbnRgYCwgYGBsb25nYGAsIGBgZmxvYXRgYCwgYGBib29sYGAsIGBgTm9uZWBgKQorICAgIHdpbGwgYmUgc2tpcHBlZCBpbnN0ZWFkIG9mIHJhaXNpbmcgYSBgYFR5cGVFcnJvcmBgLgorCisgICAgSWYgYGBlbnN1cmVfYXNjaWlgYCBpcyB0cnVlICh0aGUgZGVmYXVsdCksIGFsbCBub24tQVNDSUkgY2hhcmFjdGVycyBpbiB0aGUKKyAgICBvdXRwdXQgYXJlIGVzY2FwZWQgd2l0aCBgYFx1WFhYWGBgIHNlcXVlbmNlcywgYW5kIHRoZSByZXN1bHQgaXMgYSBgYHN0cmBgCisgICAgaW5zdGFuY2UgY29uc2lzdGluZyBvZiBBU0NJSSBjaGFyYWN0ZXJzIG9ubHkuICBJZiBgYGVuc3VyZV9hc2NpaWBgIGlzCisgICAgYGBGYWxzZWBgLCBzb21lIGNodW5rcyB3cml0dGVuIHRvIGBgZnBgYCBtYXkgYmUgYGB1bmljb2RlYGAgaW5zdGFuY2VzLgorICAgIFRoaXMgdXN1YWxseSBoYXBwZW5zIGJlY2F1c2UgdGhlIGlucHV0IGNvbnRhaW5zIHVuaWNvZGUgc3RyaW5ncyBvciB0aGUKKyAgICBgYGVuY29kaW5nYGAgcGFyYW1ldGVyIGlzIHVzZWQuIFVubGVzcyBgYGZwLndyaXRlKClgYCBleHBsaWNpdGx5CisgICAgdW5kZXJzdGFuZHMgYGB1bmljb2RlYGAgKGFzIGluIGBgY29kZWNzLmdldHdyaXRlcmBgKSB0aGlzIGlzIGxpa2VseSB0bworICAgIGNhdXNlIGFuIGVycm9yLgorCisgICAgSWYgYGBjaGVja19jaXJjdWxhcmBgIGlzIGZhbHNlLCB0aGVuIHRoZSBjaXJjdWxhciByZWZlcmVuY2UgY2hlY2sKKyAgICBmb3IgY29udGFpbmVyIHR5cGVzIHdpbGwgYmUgc2tpcHBlZCBhbmQgYSBjaXJjdWxhciByZWZlcmVuY2Ugd2lsbAorICAgIHJlc3VsdCBpbiBhbiBgYE92ZXJmbG93RXJyb3JgYCAob3Igd29yc2UpLgorCisgICAgSWYgYGBhbGxvd19uYW5gYCBpcyBmYWxzZSwgdGhlbiBpdCB3aWxsIGJlIGEgYGBWYWx1ZUVycm9yYGAgdG8KKyAgICBzZXJpYWxpemUgb3V0IG9mIHJhbmdlIGBgZmxvYXRgYCB2YWx1ZXMgKGBgbmFuYGAsIGBgaW5mYGAsIGBgLWluZmBgKQorICAgIGluIHN0cmljdCBjb21wbGlhbmNlIG9mIHRoZSBKU09OIHNwZWNpZmljYXRpb24sIGluc3RlYWQgb2YgdXNpbmcgdGhlCisgICAgSmF2YVNjcmlwdCBlcXVpdmFsZW50cyAoYGBOYU5gYCwgYGBJbmZpbml0eWBgLCBgYC1JbmZpbml0eWBgKS4KKworICAgIElmIGBgaW5kZW50YGAgaXMgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgdGhlbiBKU09OIGFycmF5IGVsZW1lbnRzIGFuZAorICAgIG9iamVjdCBtZW1iZXJzIHdpbGwgYmUgcHJldHR5LXByaW50ZWQgd2l0aCB0aGF0IGluZGVudCBsZXZlbC4gQW4gaW5kZW50CisgICAgbGV2ZWwgb2YgMCB3aWxsIG9ubHkgaW5zZXJ0IG5ld2xpbmVzLiBgYE5vbmVgYCBpcyB0aGUgbW9zdCBjb21wYWN0CisgICAgcmVwcmVzZW50YXRpb24uICBTaW5jZSB0aGUgZGVmYXVsdCBpdGVtIHNlcGFyYXRvciBpcyBgYCcsICdgYCwgIHRoZQorICAgIG91dHB1dCBtaWdodCBpbmNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugd2hlbiBgYGluZGVudGBgIGlzIHNwZWNpZmllZC4KKyAgICBZb3UgY2FuIHVzZSBgYHNlcGFyYXRvcnM9KCcsJywgJzogJylgYCB0byBhdm9pZCB0aGlzLgorCisgICAgSWYgYGBzZXBhcmF0b3JzYGAgaXMgYW4gYGAoaXRlbV9zZXBhcmF0b3IsIGRpY3Rfc2VwYXJhdG9yKWBgIHR1cGxlCisgICAgdGhlbiBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBgYCgnLCAnLCAnOiAnKWBgIHNlcGFyYXRvcnMuCisgICAgYGAoJywnLCAnOicpYGAgaXMgdGhlIG1vc3QgY29tcGFjdCBKU09OIHJlcHJlc2VudGF0aW9uLgorCisgICAgYGBlbmNvZGluZ2BgIGlzIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIHN0ciBpbnN0YW5jZXMsIGRlZmF1bHQgaXMgVVRGLTguCisKKyAgICBgYGRlZmF1bHQob2JqKWBgIGlzIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgcmV0dXJuIGEgc2VyaWFsaXphYmxlIHZlcnNpb24KKyAgICBvZiBvYmogb3IgcmFpc2UgVHlwZUVycm9yLiBUaGUgZGVmYXVsdCBzaW1wbHkgcmFpc2VzIFR5cGVFcnJvci4KKworICAgIElmICpzb3J0X2tleXMqIGlzIGBgVHJ1ZWBgIChkZWZhdWx0OiBgYEZhbHNlYGApLCB0aGVuIHRoZSBvdXRwdXQgb2YKKyAgICBkaWN0aW9uYXJpZXMgd2lsbCBiZSBzb3J0ZWQgYnkga2V5LgorCisgICAgVG8gdXNlIGEgY3VzdG9tIGBgSlNPTkVuY29kZXJgYCBzdWJjbGFzcyAoZS5nLiBvbmUgdGhhdCBvdmVycmlkZXMgdGhlCisgICAgYGAuZGVmYXVsdCgpYGAgbWV0aG9kIHRvIHNlcmlhbGl6ZSBhZGRpdGlvbmFsIHR5cGVzKSwgc3BlY2lmeSBpdCB3aXRoCisgICAgdGhlIGBgY2xzYGAga3dhcmc7IG90aGVyd2lzZSBgYEpTT05FbmNvZGVyYGAgaXMgdXNlZC4KKworICAgICIiIgorICAgICMgY2FjaGVkIGVuY29kZXIKKyAgICBpZiAobm90IHNraXBrZXlzIGFuZCBlbnN1cmVfYXNjaWkgYW5kCisgICAgICAgIGNoZWNrX2NpcmN1bGFyIGFuZCBhbGxvd19uYW4gYW5kCisgICAgICAgIGNscyBpcyBOb25lIGFuZCBpbmRlbnQgaXMgTm9uZSBhbmQgc2VwYXJhdG9ycyBpcyBOb25lIGFuZAorICAgICAgICBlbmNvZGluZyA9PSAndXRmLTgnIGFuZCBkZWZhdWx0IGlzIE5vbmUgYW5kIG5vdCBzb3J0X2tleXMgYW5kIG5vdCBrdyk6CisgICAgICAgIGl0ZXJhYmxlID0gX2RlZmF1bHRfZW5jb2Rlci5pdGVyZW5jb2RlKG9iaikKKyAgICBlbHNlOgorICAgICAgICBpZiBjbHMgaXMgTm9uZToKKyAgICAgICAgICAgIGNscyA9IEpTT05FbmNvZGVyCisgICAgICAgIGl0ZXJhYmxlID0gY2xzKHNraXBrZXlzPXNraXBrZXlzLCBlbnN1cmVfYXNjaWk9ZW5zdXJlX2FzY2lpLAorICAgICAgICAgICAgY2hlY2tfY2lyY3VsYXI9Y2hlY2tfY2lyY3VsYXIsIGFsbG93X25hbj1hbGxvd19uYW4sIGluZGVudD1pbmRlbnQsCisgICAgICAgICAgICBzZXBhcmF0b3JzPXNlcGFyYXRvcnMsIGVuY29kaW5nPWVuY29kaW5nLAorICAgICAgICAgICAgZGVmYXVsdD1kZWZhdWx0LCBzb3J0X2tleXM9c29ydF9rZXlzLCAqKmt3KS5pdGVyZW5jb2RlKG9iaikKKyAgICAjIGNvdWxkIGFjY2VsZXJhdGUgd2l0aCB3cml0ZWxpbmVzIGluIHNvbWUgdmVyc2lvbnMgb2YgUHl0aG9uLCBhdAorICAgICMgYSBkZWJ1Z2dhYmlsaXR5IGNvc3QKKyAgICBmb3IgY2h1bmsgaW4gaXRlcmFibGU6CisgICAgICAgIGZwLndyaXRlKGNodW5rKQorCisKK2RlZiBkdW1wcyhvYmosIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwgY2hlY2tfY2lyY3VsYXI9VHJ1ZSwKKyAgICAgICAgYWxsb3dfbmFuPVRydWUsIGNscz1Ob25lLCBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLAorICAgICAgICBlbmNvZGluZz0ndXRmLTgnLCBkZWZhdWx0PU5vbmUsIHNvcnRfa2V5cz1GYWxzZSwgKiprdyk6CisgICAgIiIiU2VyaWFsaXplIGBgb2JqYGAgdG8gYSBKU09OIGZvcm1hdHRlZCBgYHN0cmBgLgorCisgICAgSWYgYGBza2lwa2V5c2BgIGlzIGZhbHNlIHRoZW4gYGBkaWN0YGAga2V5cyB0aGF0IGFyZSBub3QgYmFzaWMgdHlwZXMKKyAgICAoYGBzdHJgYCwgYGB1bmljb2RlYGAsIGBgaW50YGAsIGBgbG9uZ2BgLCBgYGZsb2F0YGAsIGBgYm9vbGBgLCBgYE5vbmVgYCkKKyAgICB3aWxsIGJlIHNraXBwZWQgaW5zdGVhZCBvZiByYWlzaW5nIGEgYGBUeXBlRXJyb3JgYC4KKworICAgIElmIGBgZW5zdXJlX2FzY2lpYGAgaXMgZmFsc2UsIGFsbCBub24tQVNDSUkgY2hhcmFjdGVycyBhcmUgbm90IGVzY2FwZWQsIGFuZAorICAgIHRoZSByZXR1cm4gdmFsdWUgbWF5IGJlIGEgYGB1bmljb2RlYGAgaW5zdGFuY2UuIFNlZSBgYGR1bXBgYCBmb3IgZGV0YWlscy4KKworICAgIElmIGBgY2hlY2tfY2lyY3VsYXJgYCBpcyBmYWxzZSwgdGhlbiB0aGUgY2lyY3VsYXIgcmVmZXJlbmNlIGNoZWNrCisgICAgZm9yIGNvbnRhaW5lciB0eXBlcyB3aWxsIGJlIHNraXBwZWQgYW5kIGEgY2lyY3VsYXIgcmVmZXJlbmNlIHdpbGwKKyAgICByZXN1bHQgaW4gYW4gYGBPdmVyZmxvd0Vycm9yYGAgKG9yIHdvcnNlKS4KKworICAgIElmIGBgYWxsb3dfbmFuYGAgaXMgZmFsc2UsIHRoZW4gaXQgd2lsbCBiZSBhIGBgVmFsdWVFcnJvcmBgIHRvCisgICAgc2VyaWFsaXplIG91dCBvZiByYW5nZSBgYGZsb2F0YGAgdmFsdWVzIChgYG5hbmBgLCBgYGluZmBgLCBgYC1pbmZgYCkgaW4KKyAgICBzdHJpY3QgY29tcGxpYW5jZSBvZiB0aGUgSlNPTiBzcGVjaWZpY2F0aW9uLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZQorICAgIEphdmFTY3JpcHQgZXF1aXZhbGVudHMgKGBgTmFOYGAsIGBgSW5maW5pdHlgYCwgYGAtSW5maW5pdHlgYCkuCisKKyAgICBJZiBgYGluZGVudGBgIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIHRoZW4gSlNPTiBhcnJheSBlbGVtZW50cyBhbmQKKyAgICBvYmplY3QgbWVtYmVycyB3aWxsIGJlIHByZXR0eS1wcmludGVkIHdpdGggdGhhdCBpbmRlbnQgbGV2ZWwuIEFuIGluZGVudAorICAgIGxldmVsIG9mIDAgd2lsbCBvbmx5IGluc2VydCBuZXdsaW5lcy4gYGBOb25lYGAgaXMgdGhlIG1vc3QgY29tcGFjdAorICAgIHJlcHJlc2VudGF0aW9uLiAgU2luY2UgdGhlIGRlZmF1bHQgaXRlbSBzZXBhcmF0b3IgaXMgYGAnLCAnYGAsICB0aGUKKyAgICBvdXRwdXQgbWlnaHQgaW5jbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlIHdoZW4gYGBpbmRlbnRgYCBpcyBzcGVjaWZpZWQuCisgICAgWW91IGNhbiB1c2UgYGBzZXBhcmF0b3JzPSgnLCcsICc6ICcpYGAgdG8gYXZvaWQgdGhpcy4KKworICAgIElmIGBgc2VwYXJhdG9yc2BgIGlzIGFuIGBgKGl0ZW1fc2VwYXJhdG9yLCBkaWN0X3NlcGFyYXRvcilgYCB0dXBsZQorICAgIHRoZW4gaXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgYGAoJywgJywgJzogJylgYCBzZXBhcmF0b3JzLgorICAgIGBgKCcsJywgJzonKWBgIGlzIHRoZSBtb3N0IGNvbXBhY3QgSlNPTiByZXByZXNlbnRhdGlvbi4KKworICAgIGBgZW5jb2RpbmdgYCBpcyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciBzdHIgaW5zdGFuY2VzLCBkZWZhdWx0IGlzIFVURi04LgorCisgICAgYGBkZWZhdWx0KG9iailgYCBpcyBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIHJldHVybiBhIHNlcmlhbGl6YWJsZSB2ZXJzaW9uCisgICAgb2Ygb2JqIG9yIHJhaXNlIFR5cGVFcnJvci4gVGhlIGRlZmF1bHQgc2ltcGx5IHJhaXNlcyBUeXBlRXJyb3IuCisKKyAgICBJZiAqc29ydF9rZXlzKiBpcyBgYFRydWVgYCAoZGVmYXVsdDogYGBGYWxzZWBgKSwgdGhlbiB0aGUgb3V0cHV0IG9mCisgICAgZGljdGlvbmFyaWVzIHdpbGwgYmUgc29ydGVkIGJ5IGtleS4KKworICAgIFRvIHVzZSBhIGN1c3RvbSBgYEpTT05FbmNvZGVyYGAgc3ViY2xhc3MgKGUuZy4gb25lIHRoYXQgb3ZlcnJpZGVzIHRoZQorICAgIGBgLmRlZmF1bHQoKWBgIG1ldGhvZCB0byBzZXJpYWxpemUgYWRkaXRpb25hbCB0eXBlcyksIHNwZWNpZnkgaXQgd2l0aAorICAgIHRoZSBgYGNsc2BgIGt3YXJnOyBvdGhlcndpc2UgYGBKU09ORW5jb2RlcmBgIGlzIHVzZWQuCisKKyAgICAiIiIKKyAgICAjIGNhY2hlZCBlbmNvZGVyCisgICAgaWYgKG5vdCBza2lwa2V5cyBhbmQgZW5zdXJlX2FzY2lpIGFuZAorICAgICAgICBjaGVja19jaXJjdWxhciBhbmQgYWxsb3dfbmFuIGFuZAorICAgICAgICBjbHMgaXMgTm9uZSBhbmQgaW5kZW50IGlzIE5vbmUgYW5kIHNlcGFyYXRvcnMgaXMgTm9uZSBhbmQKKyAgICAgICAgZW5jb2RpbmcgPT0gJ3V0Zi04JyBhbmQgZGVmYXVsdCBpcyBOb25lIGFuZCBub3Qgc29ydF9rZXlzIGFuZCBub3Qga3cpOgorICAgICAgICByZXR1cm4gX2RlZmF1bHRfZW5jb2Rlci5lbmNvZGUob2JqKQorICAgIGlmIGNscyBpcyBOb25lOgorICAgICAgICBjbHMgPSBKU09ORW5jb2RlcgorICAgIHJldHVybiBjbHMoCisgICAgICAgIHNraXBrZXlzPXNraXBrZXlzLCBlbnN1cmVfYXNjaWk9ZW5zdXJlX2FzY2lpLAorICAgICAgICBjaGVja19jaXJjdWxhcj1jaGVja19jaXJjdWxhciwgYWxsb3dfbmFuPWFsbG93X25hbiwgaW5kZW50PWluZGVudCwKKyAgICAgICAgc2VwYXJhdG9ycz1zZXBhcmF0b3JzLCBlbmNvZGluZz1lbmNvZGluZywgZGVmYXVsdD1kZWZhdWx0LAorICAgICAgICBzb3J0X2tleXM9c29ydF9rZXlzLCAqKmt3KS5lbmNvZGUob2JqKQorCisKK19kZWZhdWx0X2RlY29kZXIgPSBKU09ORGVjb2RlcihlbmNvZGluZz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wYWlyc19ob29rPU5vbmUpCisKKworZGVmIGxvYWQoZnAsIGVuY29kaW5nPU5vbmUsIGNscz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAorICAgICAgICBwYXJzZV9pbnQ9Tm9uZSwgcGFyc2VfY29uc3RhbnQ9Tm9uZSwgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSwgKiprdyk6CisgICAgIiIiRGVzZXJpYWxpemUgYGBmcGBgIChhIGBgLnJlYWQoKWBgLXN1cHBvcnRpbmcgZmlsZS1saWtlIG9iamVjdCBjb250YWluaW5nCisgICAgYSBKU09OIGRvY3VtZW50KSB0byBhIFB5dGhvbiBvYmplY3QuCisKKyAgICBJZiB0aGUgY29udGVudHMgb2YgYGBmcGBgIGlzIGVuY29kZWQgd2l0aCBhbiBBU0NJSSBiYXNlZCBlbmNvZGluZyBvdGhlcgorICAgIHRoYW4gdXRmLTggKGUuZy4gbGF0aW4tMSksIHRoZW4gYW4gYXBwcm9wcmlhdGUgYGBlbmNvZGluZ2BgIG5hbWUgbXVzdAorICAgIGJlIHNwZWNpZmllZC4gRW5jb2RpbmdzIHRoYXQgYXJlIG5vdCBBU0NJSSBiYXNlZCAoc3VjaCBhcyBVQ1MtMikgYXJlCisgICAgbm90IGFsbG93ZWQsIGFuZCBzaG91bGQgYmUgd3JhcHBlZCB3aXRoCisgICAgYGBjb2RlY3MuZ2V0cmVhZGVyKGZwKShlbmNvZGluZylgYCwgb3Igc2ltcGx5IGRlY29kZWQgdG8gYSBgYHVuaWNvZGVgYAorICAgIG9iamVjdCBhbmQgcGFzc2VkIHRvIGBgbG9hZHMoKWBgCisKKyAgICBgYG9iamVjdF9ob29rYGAgaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQorICAgIHJlc3VsdCBvZiBhbnkgb2JqZWN0IGxpdGVyYWwgZGVjb2RlIChhIGBgZGljdGBgKS4gVGhlIHJldHVybiB2YWx1ZSBvZgorICAgIGBgb2JqZWN0X2hvb2tgYCB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYGBkaWN0YGAuIFRoaXMgZmVhdHVyZQorICAgIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBjdXN0b20gZGVjb2RlcnMgKGUuZy4gSlNPTi1SUEMgY2xhc3MgaGludGluZykuCisKKyAgICBgYG9iamVjdF9wYWlyc19ob29rYGAgaXMgYW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQorICAgIHJlc3VsdCBvZiBhbnkgb2JqZWN0IGxpdGVyYWwgZGVjb2RlZCB3aXRoIGFuIG9yZGVyZWQgbGlzdCBvZiBwYWlycy4gIFRoZQorICAgIHJldHVybiB2YWx1ZSBvZiBgYG9iamVjdF9wYWlyc19ob29rYGAgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBgZGljdGBgLgorICAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgY3VzdG9tIGRlY29kZXJzIHRoYXQgcmVseSBvbiB0aGUKKyAgICBvcmRlciB0aGF0IHRoZSBrZXkgYW5kIHZhbHVlIHBhaXJzIGFyZSBkZWNvZGVkIChmb3IgZXhhbXBsZSwKKyAgICBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCB3aWxsIHJlbWVtYmVyIHRoZSBvcmRlciBvZiBpbnNlcnRpb24pLiBJZgorICAgIGBgb2JqZWN0X2hvb2tgYCBpcyBhbHNvIGRlZmluZWQsIHRoZSBgYG9iamVjdF9wYWlyc19ob29rYGAgdGFrZXMgcHJpb3JpdHkuCisKKyAgICBUbyB1c2UgYSBjdXN0b20gYGBKU09ORGVjb2RlcmBgIHN1YmNsYXNzLCBzcGVjaWZ5IGl0IHdpdGggdGhlIGBgY2xzYGAKKyAgICBrd2FyZzsgb3RoZXJ3aXNlIGBgSlNPTkRlY29kZXJgYCBpcyB1c2VkLgorCisgICAgIiIiCisgICAgcmV0dXJuIGxvYWRzKGZwLnJlYWQoKSwKKyAgICAgICAgZW5jb2Rpbmc9ZW5jb2RpbmcsIGNscz1jbHMsIG9iamVjdF9ob29rPW9iamVjdF9ob29rLAorICAgICAgICBwYXJzZV9mbG9hdD1wYXJzZV9mbG9hdCwgcGFyc2VfaW50PXBhcnNlX2ludCwKKyAgICAgICAgcGFyc2VfY29uc3RhbnQ9cGFyc2VfY29uc3RhbnQsIG9iamVjdF9wYWlyc19ob29rPW9iamVjdF9wYWlyc19ob29rLAorICAgICAgICAqKmt3KQorCisKK2RlZiBsb2FkcyhzLCBlbmNvZGluZz1Ob25lLCBjbHM9Tm9uZSwgb2JqZWN0X2hvb2s9Tm9uZSwgcGFyc2VfZmxvYXQ9Tm9uZSwKKyAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIG9iamVjdF9wYWlyc19ob29rPU5vbmUsICoqa3cpOgorICAgICIiIkRlc2VyaWFsaXplIGBgc2BgIChhIGBgc3RyYGAgb3IgYGB1bmljb2RlYGAgaW5zdGFuY2UgY29udGFpbmluZyBhIEpTT04KKyAgICBkb2N1bWVudCkgdG8gYSBQeXRob24gb2JqZWN0LgorCisgICAgSWYgYGBzYGAgaXMgYSBgYHN0cmBgIGluc3RhbmNlIGFuZCBpcyBlbmNvZGVkIHdpdGggYW4gQVNDSUkgYmFzZWQgZW5jb2RpbmcKKyAgICBvdGhlciB0aGFuIHV0Zi04IChlLmcuIGxhdGluLTEpIHRoZW4gYW4gYXBwcm9wcmlhdGUgYGBlbmNvZGluZ2BgIG5hbWUKKyAgICBtdXN0IGJlIHNwZWNpZmllZC4gRW5jb2RpbmdzIHRoYXQgYXJlIG5vdCBBU0NJSSBiYXNlZCAoc3VjaCBhcyBVQ1MtMikKKyAgICBhcmUgbm90IGFsbG93ZWQgYW5kIHNob3VsZCBiZSBkZWNvZGVkIHRvIGBgdW5pY29kZWBgIGZpcnN0LgorCisgICAgYGBvYmplY3RfaG9va2BgIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAgICByZXN1bHQgb2YgYW55IG9iamVjdCBsaXRlcmFsIGRlY29kZSAoYSBgYGRpY3RgYCkuIFRoZSByZXR1cm4gdmFsdWUgb2YKKyAgICBgYG9iamVjdF9ob29rYGAgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBgZGljdGBgLiBUaGlzIGZlYXR1cmUKKyAgICBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgY3VzdG9tIGRlY29kZXJzIChlLmcuIEpTT04tUlBDIGNsYXNzIGhpbnRpbmcpLgorCisgICAgYGBvYmplY3RfcGFpcnNfaG9va2BgIGlzIGFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAgICByZXN1bHQgb2YgYW55IG9iamVjdCBsaXRlcmFsIGRlY29kZWQgd2l0aCBhbiBvcmRlcmVkIGxpc3Qgb2YgcGFpcnMuICBUaGUKKyAgICByZXR1cm4gdmFsdWUgb2YgYGBvYmplY3RfcGFpcnNfaG9va2BgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBgYGRpY3RgYC4KKyAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBkZWNvZGVycyB0aGF0IHJlbHkgb24gdGhlCisgICAgb3JkZXIgdGhhdCB0aGUga2V5IGFuZCB2YWx1ZSBwYWlycyBhcmUgZGVjb2RlZCAoZm9yIGV4YW1wbGUsCisgICAgY29sbGVjdGlvbnMuT3JkZXJlZERpY3Qgd2lsbCByZW1lbWJlciB0aGUgb3JkZXIgb2YgaW5zZXJ0aW9uKS4gSWYKKyAgICBgYG9iamVjdF9ob29rYGAgaXMgYWxzbyBkZWZpbmVkLCB0aGUgYGBvYmplY3RfcGFpcnNfaG9va2BgIHRha2VzIHByaW9yaXR5LgorCisgICAgYGBwYXJzZV9mbG9hdGBgLCBpZiBzcGVjaWZpZWQsIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHN0cmluZworICAgIG9mIGV2ZXJ5IEpTT04gZmxvYXQgdG8gYmUgZGVjb2RlZC4gQnkgZGVmYXVsdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICBmbG9hdChudW1fc3RyKS4gVGhpcyBjYW4gYmUgdXNlZCB0byB1c2UgYW5vdGhlciBkYXRhdHlwZSBvciBwYXJzZXIKKyAgICBmb3IgSlNPTiBmbG9hdHMgKGUuZy4gZGVjaW1hbC5EZWNpbWFsKS4KKworICAgIGBgcGFyc2VfaW50YGAsIGlmIHNwZWNpZmllZCwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgc3RyaW5nCisgICAgb2YgZXZlcnkgSlNPTiBpbnQgdG8gYmUgZGVjb2RlZC4gQnkgZGVmYXVsdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICBpbnQobnVtX3N0cikuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdXNlIGFub3RoZXIgZGF0YXR5cGUgb3IgcGFyc2VyCisgICAgZm9yIEpTT04gaW50ZWdlcnMgKGUuZy4gZmxvYXQpLgorCisgICAgYGBwYXJzZV9jb25zdGFudGBgLCBpZiBzcGVjaWZpZWQsIHdpbGwgYmUgY2FsbGVkIHdpdGggb25lIG9mIHRoZQorICAgIGZvbGxvd2luZyBzdHJpbmdzOiAtSW5maW5pdHksIEluZmluaXR5LCBOYU4sIG51bGwsIHRydWUsIGZhbHNlLgorICAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGludmFsaWQgSlNPTiBudW1iZXJzCisgICAgYXJlIGVuY291bnRlcmVkLgorCisgICAgVG8gdXNlIGEgY3VzdG9tIGBgSlNPTkRlY29kZXJgYCBzdWJjbGFzcywgc3BlY2lmeSBpdCB3aXRoIHRoZSBgYGNsc2BgCisgICAga3dhcmc7IG90aGVyd2lzZSBgYEpTT05EZWNvZGVyYGAgaXMgdXNlZC4KKworICAgICIiIgorICAgIGlmIChjbHMgaXMgTm9uZSBhbmQgZW5jb2RpbmcgaXMgTm9uZSBhbmQgb2JqZWN0X2hvb2sgaXMgTm9uZSBhbmQKKyAgICAgICAgICAgIHBhcnNlX2ludCBpcyBOb25lIGFuZCBwYXJzZV9mbG9hdCBpcyBOb25lIGFuZAorICAgICAgICAgICAgcGFyc2VfY29uc3RhbnQgaXMgTm9uZSBhbmQgb2JqZWN0X3BhaXJzX2hvb2sgaXMgTm9uZSBhbmQgbm90IGt3KToKKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0X2RlY29kZXIuZGVjb2RlKHMpCisgICAgaWYgY2xzIGlzIE5vbmU6CisgICAgICAgIGNscyA9IEpTT05EZWNvZGVyCisgICAgaWYgb2JqZWN0X2hvb2sgaXMgbm90IE5vbmU6CisgICAgICAgIGt3WydvYmplY3RfaG9vayddID0gb2JqZWN0X2hvb2sKKyAgICBpZiBvYmplY3RfcGFpcnNfaG9vayBpcyBub3QgTm9uZToKKyAgICAgICAga3dbJ29iamVjdF9wYWlyc19ob29rJ10gPSBvYmplY3RfcGFpcnNfaG9vaworICAgIGlmIHBhcnNlX2Zsb2F0IGlzIG5vdCBOb25lOgorICAgICAgICBrd1sncGFyc2VfZmxvYXQnXSA9IHBhcnNlX2Zsb2F0CisgICAgaWYgcGFyc2VfaW50IGlzIG5vdCBOb25lOgorICAgICAgICBrd1sncGFyc2VfaW50J10gPSBwYXJzZV9pbnQKKyAgICBpZiBwYXJzZV9jb25zdGFudCBpcyBub3QgTm9uZToKKyAgICAgICAga3dbJ3BhcnNlX2NvbnN0YW50J10gPSBwYXJzZV9jb25zdGFudAorICAgIHJldHVybiBjbHMoZW5jb2Rpbmc9ZW5jb2RpbmcsICoqa3cpLmRlY29kZShzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjMDdlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjMDdlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL2RlY29kZXIucHkgYi9saWIvcHl0aG9uMi43L2pzb24vZGVjb2Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmNjNjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL2RlY29kZXIucHkKQEAgLTAsMCArMSwzODQgQEAKKyIiIkltcGxlbWVudGF0aW9uIG9mIEpTT05EZWNvZGVyCisiIiIKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHN0cnVjdAorCitmcm9tIGpzb24gaW1wb3J0IHNjYW5uZXIKK3RyeToKKyAgICBmcm9tIF9qc29uIGltcG9ydCBzY2Fuc3RyaW5nIGFzIGNfc2NhbnN0cmluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGNfc2NhbnN0cmluZyA9IE5vbmUKKworX19hbGxfXyA9IFsnSlNPTkRlY29kZXInXQorCitGTEFHUyA9IHJlLlZFUkJPU0UgfCByZS5NVUxUSUxJTkUgfCByZS5ET1RBTEwKKworZGVmIF9mbG9hdGNvbnN0YW50cygpOgorICAgIF9CWVRFUyA9ICc3RkY4MDAwMDAwMDAwMDAwN0ZGMDAwMDAwMDAwMDAwMCcuZGVjb2RlKCdoZXgnKQorICAgIGlmIHN5cy5ieXRlb3JkZXIgIT0gJ2JpZyc6CisgICAgICAgIF9CWVRFUyA9IF9CWVRFU1s6OF1bOjotMV0gKyBfQllURVNbODpdWzo6LTFdCisgICAgbmFuLCBpbmYgPSBzdHJ1Y3QudW5wYWNrKCdkZCcsIF9CWVRFUykKKyAgICByZXR1cm4gbmFuLCBpbmYsIC1pbmYKKworTmFOLCBQb3NJbmYsIE5lZ0luZiA9IF9mbG9hdGNvbnN0YW50cygpCisKKworZGVmIGxpbmVjb2woZG9jLCBwb3MpOgorICAgIGxpbmVubyA9IGRvYy5jb3VudCgnXG4nLCAwLCBwb3MpICsgMQorICAgIGlmIGxpbmVubyA9PSAxOgorICAgICAgICBjb2xubyA9IHBvcyArIDEKKyAgICBlbHNlOgorICAgICAgICBjb2xubyA9IHBvcyAtIGRvYy5yaW5kZXgoJ1xuJywgMCwgcG9zKQorICAgIHJldHVybiBsaW5lbm8sIGNvbG5vCisKKworZGVmIGVycm1zZyhtc2csIGRvYywgcG9zLCBlbmQ9Tm9uZSk6CisgICAgIyBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSBfanNvbgorICAgIGxpbmVubywgY29sbm8gPSBsaW5lY29sKGRvYywgcG9zKQorICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgICBmbXQgPSAnezB9OiBsaW5lIHsxfSBjb2x1bW4gezJ9IChjaGFyIHszfSknCisgICAgICAgIHJldHVybiBmbXQuZm9ybWF0KG1zZywgbGluZW5vLCBjb2xubywgcG9zKQorICAgICAgICAjZm10ID0gJyVzOiBsaW5lICVkIGNvbHVtbiAlZCAoY2hhciAlZCknCisgICAgICAgICNyZXR1cm4gZm10ICUgKG1zZywgbGluZW5vLCBjb2xubywgcG9zKQorICAgIGVuZGxpbmVubywgZW5kY29sbm8gPSBsaW5lY29sKGRvYywgZW5kKQorICAgIGZtdCA9ICd7MH06IGxpbmUgezF9IGNvbHVtbiB7Mn0gLSBsaW5lIHszfSBjb2x1bW4gezR9IChjaGFyIHs1fSAtIHs2fSknCisgICAgcmV0dXJuIGZtdC5mb3JtYXQobXNnLCBsaW5lbm8sIGNvbG5vLCBlbmRsaW5lbm8sIGVuZGNvbG5vLCBwb3MsIGVuZCkKKyAgICAjZm10ID0gJyVzOiBsaW5lICVkIGNvbHVtbiAlZCAtIGxpbmUgJWQgY29sdW1uICVkIChjaGFyICVkIC0gJWQpJworICAgICNyZXR1cm4gZm10ICUgKG1zZywgbGluZW5vLCBjb2xubywgZW5kbGluZW5vLCBlbmRjb2xubywgcG9zLCBlbmQpCisKKworX0NPTlNUQU5UUyA9IHsKKyAgICAnLUluZmluaXR5JzogTmVnSW5mLAorICAgICdJbmZpbml0eSc6IFBvc0luZiwKKyAgICAnTmFOJzogTmFOLAorfQorCitTVFJJTkdDSFVOSyA9IHJlLmNvbXBpbGUocicoLio/KShbIlxcXHgwMC1ceDFmXSknLCBGTEFHUykKK0JBQ0tTTEFTSCA9IHsKKyAgICAnIic6IHUnIicsICdcXCc6IHUnXFwnLCAnLyc6IHUnLycsCisgICAgJ2InOiB1J1xiJywgJ2YnOiB1J1xmJywgJ24nOiB1J1xuJywgJ3InOiB1J1xyJywgJ3QnOiB1J1x0JywKK30KKworREVGQVVMVF9FTkNPRElORyA9ICJ1dGYtOCIKKworZGVmIHB5X3NjYW5zdHJpbmcocywgZW5kLCBlbmNvZGluZz1Ob25lLCBzdHJpY3Q9VHJ1ZSwKKyAgICAgICAgX2I9QkFDS1NMQVNILCBfbT1TVFJJTkdDSFVOSy5tYXRjaCk6CisgICAgIiIiU2NhbiB0aGUgc3RyaW5nIHMgZm9yIGEgSlNPTiBzdHJpbmcuIEVuZCBpcyB0aGUgaW5kZXggb2YgdGhlCisgICAgY2hhcmFjdGVyIGluIHMgYWZ0ZXIgdGhlIHF1b3RlIHRoYXQgc3RhcnRlZCB0aGUgSlNPTiBzdHJpbmcuCisgICAgVW5lc2NhcGVzIGFsbCB2YWxpZCBKU09OIHN0cmluZyBlc2NhcGUgc2VxdWVuY2VzIGFuZCByYWlzZXMgVmFsdWVFcnJvcgorICAgIG9uIGF0dGVtcHQgdG8gZGVjb2RlIGFuIGludmFsaWQgc3RyaW5nLiBJZiBzdHJpY3QgaXMgRmFsc2UgdGhlbiBsaXRlcmFsCisgICAgY29udHJvbCBjaGFyYWN0ZXJzIGFyZSBhbGxvd2VkIGluIHRoZSBzdHJpbmcuCisKKyAgICBSZXR1cm5zIGEgdHVwbGUgb2YgdGhlIGRlY29kZWQgc3RyaW5nIGFuZCB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciBpbiBzCisgICAgYWZ0ZXIgdGhlIGVuZCBxdW90ZS4iIiIKKyAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICBlbmNvZGluZyA9IERFRkFVTFRfRU5DT0RJTkcKKyAgICBjaHVua3MgPSBbXQorICAgIF9hcHBlbmQgPSBjaHVua3MuYXBwZW5kCisgICAgYmVnaW4gPSBlbmQgLSAxCisgICAgd2hpbGUgMToKKyAgICAgICAgY2h1bmsgPSBfbShzLCBlbmQpCisgICAgICAgIGlmIGNodW5rIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgIGVycm1zZygiVW50ZXJtaW5hdGVkIHN0cmluZyBzdGFydGluZyBhdCIsIHMsIGJlZ2luKSkKKyAgICAgICAgZW5kID0gY2h1bmsuZW5kKCkKKyAgICAgICAgY29udGVudCwgdGVybWluYXRvciA9IGNodW5rLmdyb3VwcygpCisgICAgICAgICMgQ29udGVudCBpcyBjb250YWlucyB6ZXJvIG9yIG1vcmUgdW5lc2NhcGVkIHN0cmluZyBjaGFyYWN0ZXJzCisgICAgICAgIGlmIGNvbnRlbnQ6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjb250ZW50LCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICBjb250ZW50ID0gdW5pY29kZShjb250ZW50LCBlbmNvZGluZykKKyAgICAgICAgICAgIF9hcHBlbmQoY29udGVudCkKKyAgICAgICAgIyBUZXJtaW5hdG9yIGlzIHRoZSBlbmQgb2Ygc3RyaW5nLCBhIGxpdGVyYWwgY29udHJvbCBjaGFyYWN0ZXIsCisgICAgICAgICMgb3IgYSBiYWNrc2xhc2ggZGVub3RpbmcgdGhhdCBhbiBlc2NhcGUgc2VxdWVuY2UgZm9sbG93cworICAgICAgICBpZiB0ZXJtaW5hdG9yID09ICciJzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsaWYgdGVybWluYXRvciAhPSAnXFwnOgorICAgICAgICAgICAgaWYgc3RyaWN0OgorICAgICAgICAgICAgICAgICNtc2cgPSAiSW52YWxpZCBjb250cm9sIGNoYXJhY3RlciAlciBhdCIgJSAodGVybWluYXRvciwpCisgICAgICAgICAgICAgICAgbXNnID0gIkludmFsaWQgY29udHJvbCBjaGFyYWN0ZXIgezAhcn0gYXQiLmZvcm1hdCh0ZXJtaW5hdG9yKQorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKG1zZywgcywgZW5kKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgX2FwcGVuZCh0ZXJtaW5hdG9yKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVzYyA9IHNbZW5kXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgZXJybXNnKCJVbnRlcm1pbmF0ZWQgc3RyaW5nIHN0YXJ0aW5nIGF0IiwgcywgYmVnaW4pKQorICAgICAgICAjIElmIG5vdCBhIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLCBtdXN0IGJlIGluIHRoZSBsb29rdXAgdGFibGUKKyAgICAgICAgaWYgZXNjICE9ICd1JzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjaGFyID0gX2JbZXNjXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIG1zZyA9ICJJbnZhbGlkIFxcZXNjYXBlOiAiICsgcmVwcihlc2MpCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2cobXNnLCBzLCBlbmQpKQorICAgICAgICAgICAgZW5kICs9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UKKyAgICAgICAgICAgIGVzYyA9IHNbZW5kICsgMTplbmQgKyA1XQorICAgICAgICAgICAgbmV4dF9lbmQgPSBlbmQgKyA1CisgICAgICAgICAgICBpZiBsZW4oZXNjKSAhPSA0OgorICAgICAgICAgICAgICAgIG1zZyA9ICJJbnZhbGlkIFxcdVhYWFggZXNjYXBlIgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKG1zZywgcywgZW5kKSkKKyAgICAgICAgICAgIHVuaSA9IGludChlc2MsIDE2KQorICAgICAgICAgICAgIyBDaGVjayBmb3Igc3Vycm9nYXRlIHBhaXIgb24gVUNTLTQgc3lzdGVtcworICAgICAgICAgICAgaWYgMHhkODAwIDw9IHVuaSA8PSAweGRiZmYgYW5kIHN5cy5tYXh1bmljb2RlID4gNjU1MzU6CisgICAgICAgICAgICAgICAgbXNnID0gIkludmFsaWQgXFx1WFhYWFxcdVhYWFggc3Vycm9nYXRlIHBhaXIiCisgICAgICAgICAgICAgICAgaWYgbm90IHNbZW5kICsgNTplbmQgKyA3XSA9PSAnXFx1JzoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2cobXNnLCBzLCBlbmQpKQorICAgICAgICAgICAgICAgIGVzYzIgPSBzW2VuZCArIDc6ZW5kICsgMTFdCisgICAgICAgICAgICAgICAgaWYgbGVuKGVzYzIpICE9IDQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKG1zZywgcywgZW5kKSkKKyAgICAgICAgICAgICAgICB1bmkyID0gaW50KGVzYzIsIDE2KQorICAgICAgICAgICAgICAgIHVuaSA9IDB4MTAwMDAgKyAoKCh1bmkgLSAweGQ4MDApIDw8IDEwKSB8ICh1bmkyIC0gMHhkYzAwKSkKKyAgICAgICAgICAgICAgICBuZXh0X2VuZCArPSA2CisgICAgICAgICAgICBjaGFyID0gdW5pY2hyKHVuaSkKKyAgICAgICAgICAgIGVuZCA9IG5leHRfZW5kCisgICAgICAgICMgQXBwZW5kIHRoZSB1bmVzY2FwZWQgY2hhcmFjdGVyCisgICAgICAgIF9hcHBlbmQoY2hhcikKKyAgICByZXR1cm4gdScnLmpvaW4oY2h1bmtzKSwgZW5kCisKKworIyBVc2Ugc3BlZWR1cCBpZiBhdmFpbGFibGUKK3NjYW5zdHJpbmcgPSBjX3NjYW5zdHJpbmcgb3IgcHlfc2NhbnN0cmluZworCitXSElURVNQQUNFID0gcmUuY29tcGlsZShyJ1sgXHRcblxyXSonLCBGTEFHUykKK1dISVRFU1BBQ0VfU1RSID0gJyBcdFxuXHInCisKK2RlZiBKU09OT2JqZWN0KHNfYW5kX2VuZCwgZW5jb2RpbmcsIHN0cmljdCwgc2Nhbl9vbmNlLCBvYmplY3RfaG9vaywKKyAgICAgICAgICAgICAgIG9iamVjdF9wYWlyc19ob29rLCBfdz1XSElURVNQQUNFLm1hdGNoLCBfd3M9V0hJVEVTUEFDRV9TVFIpOgorICAgIHMsIGVuZCA9IHNfYW5kX2VuZAorICAgIHBhaXJzID0gW10KKyAgICBwYWlyc19hcHBlbmQgPSBwYWlycy5hcHBlbmQKKyAgICAjIFVzZSBhIHNsaWNlIHRvIHByZXZlbnQgSW5kZXhFcnJvciBmcm9tIGJlaW5nIHJhaXNlZCwgdGhlIGZvbGxvd2luZworICAgICMgY2hlY2sgd2lsbCByYWlzZSBhIG1vcmUgc3BlY2lmaWMgVmFsdWVFcnJvciBpZiB0aGUgc3RyaW5nIGlzIGVtcHR5CisgICAgbmV4dGNoYXIgPSBzW2VuZDplbmQgKyAxXQorICAgICMgTm9ybWFsbHkgd2UgZXhwZWN0IG5leHRjaGFyID09ICciJworICAgIGlmIG5leHRjaGFyICE9ICciJzoKKyAgICAgICAgaWYgbmV4dGNoYXIgaW4gX3dzOgorICAgICAgICAgICAgZW5kID0gX3cocywgZW5kKS5lbmQoKQorICAgICAgICAgICAgbmV4dGNoYXIgPSBzW2VuZDplbmQgKyAxXQorICAgICAgICAjIFRyaXZpYWwgZW1wdHkgb2JqZWN0CisgICAgICAgIGlmIG5leHRjaGFyID09ICd9JzoKKyAgICAgICAgICAgIGlmIG9iamVjdF9wYWlyc19ob29rIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iamVjdF9wYWlyc19ob29rKHBhaXJzKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQsIGVuZCArIDEKKyAgICAgICAgICAgIHBhaXJzID0ge30KKyAgICAgICAgICAgIGlmIG9iamVjdF9ob29rIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHBhaXJzID0gb2JqZWN0X2hvb2socGFpcnMpCisgICAgICAgICAgICByZXR1cm4gcGFpcnMsIGVuZCArIDEKKyAgICAgICAgZWxpZiBuZXh0Y2hhciAhPSAnIic6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygKKyAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIHByb3BlcnR5IG5hbWUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIsIHMsIGVuZCkpCisgICAgZW5kICs9IDEKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBrZXksIGVuZCA9IHNjYW5zdHJpbmcocywgZW5kLCBlbmNvZGluZywgc3RyaWN0KQorCisgICAgICAgICMgVG8gc2tpcCBzb21lIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQgd2Ugb3B0aW1pemUgdGhlIGZhc3QgcGF0aHMgd2hlcmUKKyAgICAgICAgIyB0aGUgSlNPTiBrZXkgc2VwYXJhdG9yIGlzICI6ICIgb3IganVzdCAiOiIuCisgICAgICAgIGlmIHNbZW5kOmVuZCArIDFdICE9ICc6JzoKKyAgICAgICAgICAgIGVuZCA9IF93KHMsIGVuZCkuZW5kKCkKKyAgICAgICAgICAgIGlmIHNbZW5kOmVuZCArIDFdICE9ICc6JzoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygiRXhwZWN0aW5nICc6JyBkZWxpbWl0ZXIiLCBzLCBlbmQpKQorICAgICAgICBlbmQgKz0gMQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNbZW5kXSBpbiBfd3M6CisgICAgICAgICAgICAgICAgZW5kICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzW2VuZF0gaW4gX3dzOgorICAgICAgICAgICAgICAgICAgICBlbmQgPSBfdyhzLCBlbmQgKyAxKS5lbmQoKQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSwgZW5kID0gc2Nhbl9vbmNlKHMsIGVuZCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygiRXhwZWN0aW5nIG9iamVjdCIsIHMsIGVuZCkpCisgICAgICAgIHBhaXJzX2FwcGVuZCgoa2V5LCB2YWx1ZSkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dGNoYXIgPSBzW2VuZF0KKyAgICAgICAgICAgIGlmIG5leHRjaGFyIGluIF93czoKKyAgICAgICAgICAgICAgICBlbmQgPSBfdyhzLCBlbmQgKyAxKS5lbmQoKQorICAgICAgICAgICAgICAgIG5leHRjaGFyID0gc1tlbmRdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgbmV4dGNoYXIgPSAnJworICAgICAgICBlbmQgKz0gMQorCisgICAgICAgIGlmIG5leHRjaGFyID09ICd9JzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsaWYgbmV4dGNoYXIgIT0gJywnOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJtc2coIkV4cGVjdGluZyAnLCcgZGVsaW1pdGVyIiwgcywgZW5kIC0gMSkpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dGNoYXIgPSBzW2VuZF0KKyAgICAgICAgICAgIGlmIG5leHRjaGFyIGluIF93czoKKyAgICAgICAgICAgICAgICBlbmQgKz0gMQorICAgICAgICAgICAgICAgIG5leHRjaGFyID0gc1tlbmRdCisgICAgICAgICAgICAgICAgaWYgbmV4dGNoYXIgaW4gX3dzOgorICAgICAgICAgICAgICAgICAgICBlbmQgPSBfdyhzLCBlbmQgKyAxKS5lbmQoKQorICAgICAgICAgICAgICAgICAgICBuZXh0Y2hhciA9IHNbZW5kXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIG5leHRjaGFyID0gJycKKworICAgICAgICBlbmQgKz0gMQorICAgICAgICBpZiBuZXh0Y2hhciAhPSAnIic6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygKKyAgICAgICAgICAgICAgICAiRXhwZWN0aW5nIHByb3BlcnR5IG5hbWUgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RlcyIsIHMsIGVuZCAtIDEpKQorICAgIGlmIG9iamVjdF9wYWlyc19ob29rIGlzIG5vdCBOb25lOgorICAgICAgICByZXN1bHQgPSBvYmplY3RfcGFpcnNfaG9vayhwYWlycykKKyAgICAgICAgcmV0dXJuIHJlc3VsdCwgZW5kCisgICAgcGFpcnMgPSBkaWN0KHBhaXJzKQorICAgIGlmIG9iamVjdF9ob29rIGlzIG5vdCBOb25lOgorICAgICAgICBwYWlycyA9IG9iamVjdF9ob29rKHBhaXJzKQorICAgIHJldHVybiBwYWlycywgZW5kCisKK2RlZiBKU09OQXJyYXkoc19hbmRfZW5kLCBzY2FuX29uY2UsIF93PVdISVRFU1BBQ0UubWF0Y2gsIF93cz1XSElURVNQQUNFX1NUUik6CisgICAgcywgZW5kID0gc19hbmRfZW5kCisgICAgdmFsdWVzID0gW10KKyAgICBuZXh0Y2hhciA9IHNbZW5kOmVuZCArIDFdCisgICAgaWYgbmV4dGNoYXIgaW4gX3dzOgorICAgICAgICBlbmQgPSBfdyhzLCBlbmQgKyAxKS5lbmQoKQorICAgICAgICBuZXh0Y2hhciA9IHNbZW5kOmVuZCArIDFdCisgICAgIyBMb29rLWFoZWFkIGZvciB0cml2aWFsIGVtcHR5IGFycmF5CisgICAgaWYgbmV4dGNoYXIgPT0gJ10nOgorICAgICAgICByZXR1cm4gdmFsdWVzLCBlbmQgKyAxCisgICAgX2FwcGVuZCA9IHZhbHVlcy5hcHBlbmQKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSwgZW5kID0gc2Nhbl9vbmNlKHMsIGVuZCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygiRXhwZWN0aW5nIG9iamVjdCIsIHMsIGVuZCkpCisgICAgICAgIF9hcHBlbmQodmFsdWUpCisgICAgICAgIG5leHRjaGFyID0gc1tlbmQ6ZW5kICsgMV0KKyAgICAgICAgaWYgbmV4dGNoYXIgaW4gX3dzOgorICAgICAgICAgICAgZW5kID0gX3cocywgZW5kICsgMSkuZW5kKCkKKyAgICAgICAgICAgIG5leHRjaGFyID0gc1tlbmQ6ZW5kICsgMV0KKyAgICAgICAgZW5kICs9IDEKKyAgICAgICAgaWYgbmV4dGNoYXIgPT0gJ10nOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBuZXh0Y2hhciAhPSAnLCc6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKGVycm1zZygiRXhwZWN0aW5nICcsJyBkZWxpbWl0ZXIiLCBzLCBlbmQpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzW2VuZF0gaW4gX3dzOgorICAgICAgICAgICAgICAgIGVuZCArPSAxCisgICAgICAgICAgICAgICAgaWYgc1tlbmRdIGluIF93czoKKyAgICAgICAgICAgICAgICAgICAgZW5kID0gX3cocywgZW5kICsgMSkuZW5kKCkKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gdmFsdWVzLCBlbmQKKworY2xhc3MgSlNPTkRlY29kZXIob2JqZWN0KToKKyAgICAiIiJTaW1wbGUgSlNPTiA8aHR0cDovL2pzb24ub3JnPiBkZWNvZGVyCisKKyAgICBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIHRyYW5zbGF0aW9ucyBpbiBkZWNvZGluZyBieSBkZWZhdWx0OgorCisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgSlNPTiAgICAgICAgICB8IFB5dGhvbiAgICAgICAgICAgIHwKKyAgICArPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT0rCisgICAgfCBvYmplY3QgICAgICAgIHwgZGljdCAgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IGFycmF5ICAgICAgICAgfCBsaXN0ICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgc3RyaW5nICAgICAgICB8IHVuaWNvZGUgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBudW1iZXIgKGludCkgIHwgaW50LCBsb25nICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IG51bWJlciAocmVhbCkgfCBmbG9hdCAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworICAgIHwgdHJ1ZSAgICAgICAgICB8IFRydWUgICAgICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgfCBmYWxzZSAgICAgICAgIHwgRmFsc2UgICAgICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IG51bGwgICAgICAgICAgfCBOb25lICAgICAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tKworCisgICAgSXQgYWxzbyB1bmRlcnN0YW5kcyBgYE5hTmBgLCBgYEluZmluaXR5YGAsIGFuZCBgYC1JbmZpbml0eWBgIGFzCisgICAgdGhlaXIgY29ycmVzcG9uZGluZyBgYGZsb2F0YGAgdmFsdWVzLCB3aGljaCBpcyBvdXRzaWRlIHRoZSBKU09OIHNwZWMuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlbmNvZGluZz1Ob25lLCBvYmplY3RfaG9vaz1Ob25lLCBwYXJzZV9mbG9hdD1Ob25lLAorICAgICAgICAgICAgcGFyc2VfaW50PU5vbmUsIHBhcnNlX2NvbnN0YW50PU5vbmUsIHN0cmljdD1UcnVlLAorICAgICAgICAgICAgb2JqZWN0X3BhaXJzX2hvb2s9Tm9uZSk6CisgICAgICAgICIiImBgZW5jb2RpbmdgYCBkZXRlcm1pbmVzIHRoZSBlbmNvZGluZyB1c2VkIHRvIGludGVycHJldCBhbnkgYGBzdHJgYAorICAgICAgICBvYmplY3RzIGRlY29kZWQgYnkgdGhpcyBpbnN0YW5jZSAodXRmLTggYnkgZGVmYXVsdCkuICBJdCBoYXMgbm8KKyAgICAgICAgZWZmZWN0IHdoZW4gZGVjb2RpbmcgYGB1bmljb2RlYGAgb2JqZWN0cy4KKworICAgICAgICBOb3RlIHRoYXQgY3VycmVudGx5IG9ubHkgZW5jb2RpbmdzIHRoYXQgYXJlIGEgc3VwZXJzZXQgb2YgQVNDSUkgd29yaywKKyAgICAgICAgc3RyaW5ncyBvZiBvdGhlciBlbmNvZGluZ3Mgc2hvdWxkIGJlIHBhc3NlZCBpbiBhcyBgYHVuaWNvZGVgYC4KKworICAgICAgICBgYG9iamVjdF9ob29rYGAsIGlmIHNwZWNpZmllZCwgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzdWx0CisgICAgICAgIG9mIGV2ZXJ5IEpTT04gb2JqZWN0IGRlY29kZWQgYW5kIGl0cyByZXR1cm4gdmFsdWUgd2lsbCBiZSB1c2VkIGluCisgICAgICAgIHBsYWNlIG9mIHRoZSBnaXZlbiBgYGRpY3RgYC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBjdXN0b20KKyAgICAgICAgZGVzZXJpYWxpemF0aW9ucyAoZS5nLiB0byBzdXBwb3J0IEpTT04tUlBDIGNsYXNzIGhpbnRpbmcpLgorCisgICAgICAgIGBgb2JqZWN0X3BhaXJzX2hvb2tgYCwgaWYgc3BlY2lmaWVkIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIHJlc3VsdCBvZgorICAgICAgICBldmVyeSBKU09OIG9iamVjdCBkZWNvZGVkIHdpdGggYW4gb3JkZXJlZCBsaXN0IG9mIHBhaXJzLiAgVGhlIHJldHVybgorICAgICAgICB2YWx1ZSBvZiBgYG9iamVjdF9wYWlyc19ob29rYGAgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGBgZGljdGBgLgorICAgICAgICBUaGlzIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBkZWNvZGVycyB0aGF0IHJlbHkgb24gdGhlCisgICAgICAgIG9yZGVyIHRoYXQgdGhlIGtleSBhbmQgdmFsdWUgcGFpcnMgYXJlIGRlY29kZWQgKGZvciBleGFtcGxlLAorICAgICAgICBjb2xsZWN0aW9ucy5PcmRlcmVkRGljdCB3aWxsIHJlbWVtYmVyIHRoZSBvcmRlciBvZiBpbnNlcnRpb24pLiBJZgorICAgICAgICBgYG9iamVjdF9ob29rYGAgaXMgYWxzbyBkZWZpbmVkLCB0aGUgYGBvYmplY3RfcGFpcnNfaG9va2BgIHRha2VzCisgICAgICAgIHByaW9yaXR5LgorCisgICAgICAgIGBgcGFyc2VfZmxvYXRgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBzdHJpbmcKKyAgICAgICAgb2YgZXZlcnkgSlNPTiBmbG9hdCB0byBiZSBkZWNvZGVkLiBCeSBkZWZhdWx0IHRoaXMgaXMgZXF1aXZhbGVudCB0bworICAgICAgICBmbG9hdChudW1fc3RyKS4gVGhpcyBjYW4gYmUgdXNlZCB0byB1c2UgYW5vdGhlciBkYXRhdHlwZSBvciBwYXJzZXIKKyAgICAgICAgZm9yIEpTT04gZmxvYXRzIChlLmcuIGRlY2ltYWwuRGVjaW1hbCkuCisKKyAgICAgICAgYGBwYXJzZV9pbnRgYCwgaWYgc3BlY2lmaWVkLCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBzdHJpbmcKKyAgICAgICAgb2YgZXZlcnkgSlNPTiBpbnQgdG8gYmUgZGVjb2RlZC4gQnkgZGVmYXVsdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgICAgaW50KG51bV9zdHIpLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHVzZSBhbm90aGVyIGRhdGF0eXBlIG9yIHBhcnNlcgorICAgICAgICBmb3IgSlNPTiBpbnRlZ2VycyAoZS5nLiBmbG9hdCkuCisKKyAgICAgICAgYGBwYXJzZV9jb25zdGFudGBgLCBpZiBzcGVjaWZpZWQsIHdpbGwgYmUgY2FsbGVkIHdpdGggb25lIG9mIHRoZQorICAgICAgICBmb2xsb3dpbmcgc3RyaW5nczogLUluZmluaXR5LCBJbmZpbml0eSwgTmFOLgorICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBpbnZhbGlkIEpTT04gbnVtYmVycworICAgICAgICBhcmUgZW5jb3VudGVyZWQuCisKKyAgICAgICAgSWYgYGBzdHJpY3RgYCBpcyBmYWxzZSAodHJ1ZSBpcyB0aGUgZGVmYXVsdCksIHRoZW4gY29udHJvbAorICAgICAgICBjaGFyYWN0ZXJzIHdpbGwgYmUgYWxsb3dlZCBpbnNpZGUgc3RyaW5ncy4gIENvbnRyb2wgY2hhcmFjdGVycyBpbgorICAgICAgICB0aGlzIGNvbnRleHQgYXJlIHRob3NlIHdpdGggY2hhcmFjdGVyIGNvZGVzIGluIHRoZSAwLTMxIHJhbmdlLAorICAgICAgICBpbmNsdWRpbmcgYGAnXFx0J2BgICh0YWIpLCBgYCdcXG4nYGAsIGBgJ1xccidgYCBhbmQgYGAnXFwwJ2BgLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgc2VsZi5vYmplY3RfaG9vayA9IG9iamVjdF9ob29rCisgICAgICAgIHNlbGYub2JqZWN0X3BhaXJzX2hvb2sgPSBvYmplY3RfcGFpcnNfaG9vaworICAgICAgICBzZWxmLnBhcnNlX2Zsb2F0ID0gcGFyc2VfZmxvYXQgb3IgZmxvYXQKKyAgICAgICAgc2VsZi5wYXJzZV9pbnQgPSBwYXJzZV9pbnQgb3IgaW50CisgICAgICAgIHNlbGYucGFyc2VfY29uc3RhbnQgPSBwYXJzZV9jb25zdGFudCBvciBfQ09OU1RBTlRTLl9fZ2V0aXRlbV9fCisgICAgICAgIHNlbGYuc3RyaWN0ID0gc3RyaWN0CisgICAgICAgIHNlbGYucGFyc2Vfb2JqZWN0ID0gSlNPTk9iamVjdAorICAgICAgICBzZWxmLnBhcnNlX2FycmF5ID0gSlNPTkFycmF5CisgICAgICAgIHNlbGYucGFyc2Vfc3RyaW5nID0gc2NhbnN0cmluZworICAgICAgICBzZWxmLnNjYW5fb25jZSA9IHNjYW5uZXIubWFrZV9zY2FubmVyKHNlbGYpCisKKyAgICBkZWYgZGVjb2RlKHNlbGYsIHMsIF93PVdISVRFU1BBQ0UubWF0Y2gpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIFB5dGhvbiByZXByZXNlbnRhdGlvbiBvZiBgYHNgYCAoYSBgYHN0cmBgIG9yIGBgdW5pY29kZWBgCisgICAgICAgIGluc3RhbmNlIGNvbnRhaW5pbmcgYSBKU09OIGRvY3VtZW50KQorCisgICAgICAgICIiIgorICAgICAgICBvYmosIGVuZCA9IHNlbGYucmF3X2RlY29kZShzLCBpZHg9X3cocywgMCkuZW5kKCkpCisgICAgICAgIGVuZCA9IF93KHMsIGVuZCkuZW5kKCkKKyAgICAgICAgaWYgZW5kICE9IGxlbihzKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJybXNnKCJFeHRyYSBkYXRhIiwgcywgZW5kLCBsZW4ocykpKQorICAgICAgICByZXR1cm4gb2JqCisKKyAgICBkZWYgcmF3X2RlY29kZShzZWxmLCBzLCBpZHg9MCk6CisgICAgICAgICIiIkRlY29kZSBhIEpTT04gZG9jdW1lbnQgZnJvbSBgYHNgYCAoYSBgYHN0cmBgIG9yIGBgdW5pY29kZWBgCisgICAgICAgIGJlZ2lubmluZyB3aXRoIGEgSlNPTiBkb2N1bWVudCkgYW5kIHJldHVybiBhIDItdHVwbGUgb2YgdGhlIFB5dGhvbgorICAgICAgICByZXByZXNlbnRhdGlvbiBhbmQgdGhlIGluZGV4IGluIGBgc2BgIHdoZXJlIHRoZSBkb2N1bWVudCBlbmRlZC4KKworICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGRlY29kZSBhIEpTT04gZG9jdW1lbnQgZnJvbSBhIHN0cmluZyB0aGF0IG1heQorICAgICAgICBoYXZlIGV4dHJhbmVvdXMgZGF0YSBhdCB0aGUgZW5kLgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvYmosIGVuZCA9IHNlbGYuc2Nhbl9vbmNlKHMsIGlkeCkKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyBKU09OIG9iamVjdCBjb3VsZCBiZSBkZWNvZGVkIikKKyAgICAgICAgcmV0dXJuIG9iaiwgZW5kCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vZGVjb2Rlci5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vZGVjb2Rlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkNjc3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9kZWNvZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vZGVjb2Rlci5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vZGVjb2Rlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkNjc3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9kZWNvZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vZW5jb2Rlci5weSBiL2xpYi9weXRob24yLjcvanNvbi9lbmNvZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZWVlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vZW5jb2Rlci5weQpAQCAtMCwwICsxLDQ0OCBAQAorIiIiSW1wbGVtZW50YXRpb24gb2YgSlNPTkVuY29kZXIKKyIiIgoraW1wb3J0IHJlCisKK3RyeToKKyAgICBmcm9tIF9qc29uIGltcG9ydCBlbmNvZGVfYmFzZXN0cmluZ19hc2NpaSBhcyBjX2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY19lbmNvZGVfYmFzZXN0cmluZ19hc2NpaSA9IE5vbmUKK3RyeToKKyAgICBmcm9tIF9qc29uIGltcG9ydCBtYWtlX2VuY29kZXIgYXMgY19tYWtlX2VuY29kZXIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjX21ha2VfZW5jb2RlciA9IE5vbmUKKworRVNDQVBFID0gcmUuY29tcGlsZShyJ1tceDAwLVx4MWZcXCJcYlxmXG5cclx0XScpCitFU0NBUEVfQVNDSUkgPSByZS5jb21waWxlKHInKFtcXCJdfFteXCAtfl0pJykKK0hBU19VVEY4ID0gcmUuY29tcGlsZShyJ1tceDgwLVx4ZmZdJykKK0VTQ0FQRV9EQ1QgPSB7CisgICAgJ1xcJzogJ1xcXFwnLAorICAgICciJzogJ1xcIicsCisgICAgJ1xiJzogJ1xcYicsCisgICAgJ1xmJzogJ1xcZicsCisgICAgJ1xuJzogJ1xcbicsCisgICAgJ1xyJzogJ1xccicsCisgICAgJ1x0JzogJ1xcdCcsCit9Citmb3IgaSBpbiByYW5nZSgweDIwKToKKyAgICBFU0NBUEVfRENULnNldGRlZmF1bHQoY2hyKGkpLCAnXFx1ezA6MDR4fScuZm9ybWF0KGkpKQorICAgICNFU0NBUEVfRENULnNldGRlZmF1bHQoY2hyKGkpLCAnXFx1JTA0eCcgJSAoaSwpKQorCitJTkZJTklUWSA9IGZsb2F0KCdpbmYnKQorRkxPQVRfUkVQUiA9IHJlcHIKKworZGVmIGVuY29kZV9iYXNlc3RyaW5nKHMpOgorICAgICIiIlJldHVybiBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gc3RyaW5nCisKKyAgICAiIiIKKyAgICBkZWYgcmVwbGFjZShtYXRjaCk6CisgICAgICAgIHJldHVybiBFU0NBUEVfRENUW21hdGNoLmdyb3VwKDApXQorICAgIHJldHVybiAnIicgKyBFU0NBUEUuc3ViKHJlcGxhY2UsIHMpICsgJyInCisKKworZGVmIHB5X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpKHMpOgorICAgICIiIlJldHVybiBhbiBBU0NJSS1vbmx5IEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gc3RyaW5nCisKKyAgICAiIiIKKyAgICBpZiBpc2luc3RhbmNlKHMsIHN0cikgYW5kIEhBU19VVEY4LnNlYXJjaChzKSBpcyBub3QgTm9uZToKKyAgICAgICAgcyA9IHMuZGVjb2RlKCd1dGYtOCcpCisgICAgZGVmIHJlcGxhY2UobWF0Y2gpOgorICAgICAgICBzID0gbWF0Y2guZ3JvdXAoMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIEVTQ0FQRV9EQ1Rbc10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgbiA9IG9yZChzKQorICAgICAgICAgICAgaWYgbiA8IDB4MTAwMDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcXHV7MDowNHh9Jy5mb3JtYXQobikKKyAgICAgICAgICAgICAgICAjcmV0dXJuICdcXHUlMDR4JyAlIChuLCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBzdXJyb2dhdGUgcGFpcgorICAgICAgICAgICAgICAgIG4gLT0gMHgxMDAwMAorICAgICAgICAgICAgICAgIHMxID0gMHhkODAwIHwgKChuID4+IDEwKSAmIDB4M2ZmKQorICAgICAgICAgICAgICAgIHMyID0gMHhkYzAwIHwgKG4gJiAweDNmZikKKyAgICAgICAgICAgICAgICByZXR1cm4gJ1xcdXswOjA0eH1cXHV7MTowNHh9Jy5mb3JtYXQoczEsIHMyKQorICAgICAgICAgICAgICAgICNyZXR1cm4gJ1xcdSUwNHhcXHUlMDR4JyAlIChzMSwgczIpCisgICAgcmV0dXJuICciJyArIHN0cihFU0NBUEVfQVNDSUkuc3ViKHJlcGxhY2UsIHMpKSArICciJworCisKK2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpID0gKAorICAgIGNfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkgb3IgcHlfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkpCisKK2NsYXNzIEpTT05FbmNvZGVyKG9iamVjdCk6CisgICAgIiIiRXh0ZW5zaWJsZSBKU09OIDxodHRwOi8vanNvbi5vcmc+IGVuY29kZXIgZm9yIFB5dGhvbiBkYXRhIHN0cnVjdHVyZXMuCisKKyAgICBTdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9iamVjdHMgYW5kIHR5cGVzIGJ5IGRlZmF1bHQ6CisKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisgICAgfCBQeXRob24gICAgICAgICAgICB8IEpTT04gICAgICAgICAgfAorICAgICs9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PSsKKyAgICB8IGRpY3QgICAgICAgICAgICAgIHwgb2JqZWN0ICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgIHwgbGlzdCwgdHVwbGUgICAgICAgfCBhcnJheSAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisgICAgfCBzdHIsIHVuaWNvZGUgICAgICB8IHN0cmluZyAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IGludCwgbG9uZywgZmxvYXQgIHwgbnVtYmVyICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworICAgIHwgVHJ1ZSAgICAgICAgICAgICAgfCB0cnVlICAgICAgICAgIHwKKyAgICArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rCisgICAgfCBGYWxzZSAgICAgICAgICAgICB8IGZhbHNlICAgICAgICAgfAorICAgICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKyAgICB8IE5vbmUgICAgICAgICAgICAgIHwgbnVsbCAgICAgICAgICB8CisgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworCisgICAgVG8gZXh0ZW5kIHRoaXMgdG8gcmVjb2duaXplIG90aGVyIG9iamVjdHMsIHN1YmNsYXNzIGFuZCBpbXBsZW1lbnQgYQorICAgIGBgLmRlZmF1bHQoKWBgIG1ldGhvZCB3aXRoIGFub3RoZXIgbWV0aG9kIHRoYXQgcmV0dXJucyBhIHNlcmlhbGl6YWJsZQorICAgIG9iamVjdCBmb3IgYGBvYGAgaWYgcG9zc2libGUsIG90aGVyd2lzZSBpdCBzaG91bGQgY2FsbCB0aGUgc3VwZXJjbGFzcworICAgIGltcGxlbWVudGF0aW9uICh0byByYWlzZSBgYFR5cGVFcnJvcmBgKS4KKworICAgICIiIgorICAgIGl0ZW1fc2VwYXJhdG9yID0gJywgJworICAgIGtleV9zZXBhcmF0b3IgPSAnOiAnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNraXBrZXlzPUZhbHNlLCBlbnN1cmVfYXNjaWk9VHJ1ZSwKKyAgICAgICAgICAgIGNoZWNrX2NpcmN1bGFyPVRydWUsIGFsbG93X25hbj1UcnVlLCBzb3J0X2tleXM9RmFsc2UsCisgICAgICAgICAgICBpbmRlbnQ9Tm9uZSwgc2VwYXJhdG9ycz1Ob25lLCBlbmNvZGluZz0ndXRmLTgnLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3RvciBmb3IgSlNPTkVuY29kZXIsIHdpdGggc2Vuc2libGUgZGVmYXVsdHMuCisKKyAgICAgICAgSWYgc2tpcGtleXMgaXMgZmFsc2UsIHRoZW4gaXQgaXMgYSBUeXBlRXJyb3IgdG8gYXR0ZW1wdAorICAgICAgICBlbmNvZGluZyBvZiBrZXlzIHRoYXQgYXJlIG5vdCBzdHIsIGludCwgbG9uZywgZmxvYXQgb3IgTm9uZS4gIElmCisgICAgICAgIHNraXBrZXlzIGlzIFRydWUsIHN1Y2ggaXRlbXMgYXJlIHNpbXBseSBza2lwcGVkLgorCisgICAgICAgIElmICplbnN1cmVfYXNjaWkqIGlzIHRydWUgKHRoZSBkZWZhdWx0KSwgYWxsIG5vbi1BU0NJSQorICAgICAgICBjaGFyYWN0ZXJzIGluIHRoZSBvdXRwdXQgYXJlIGVzY2FwZWQgd2l0aCBcdVhYWFggc2VxdWVuY2VzLAorICAgICAgICBhbmQgdGhlIHJlc3VsdHMgYXJlIHN0ciBpbnN0YW5jZXMgY29uc2lzdGluZyBvZiBBU0NJSQorICAgICAgICBjaGFyYWN0ZXJzIG9ubHkuICBJZiBlbnN1cmVfYXNjaWkgaXMgRmFsc2UsIGEgcmVzdWx0IG1heSBiZSBhCisgICAgICAgIHVuaWNvZGUgaW5zdGFuY2UuICBUaGlzIHVzdWFsbHkgaGFwcGVucyBpZiB0aGUgaW5wdXQgY29udGFpbnMKKyAgICAgICAgdW5pY29kZSBzdHJpbmdzIG9yIHRoZSAqZW5jb2RpbmcqIHBhcmFtZXRlciBpcyB1c2VkLgorCisgICAgICAgIElmIGNoZWNrX2NpcmN1bGFyIGlzIHRydWUsIHRoZW4gbGlzdHMsIGRpY3RzLCBhbmQgY3VzdG9tIGVuY29kZWQKKyAgICAgICAgb2JqZWN0cyB3aWxsIGJlIGNoZWNrZWQgZm9yIGNpcmN1bGFyIHJlZmVyZW5jZXMgZHVyaW5nIGVuY29kaW5nIHRvCisgICAgICAgIHByZXZlbnQgYW4gaW5maW5pdGUgcmVjdXJzaW9uICh3aGljaCB3b3VsZCBjYXVzZSBhbiBPdmVyZmxvd0Vycm9yKS4KKyAgICAgICAgT3RoZXJ3aXNlLCBubyBzdWNoIGNoZWNrIHRha2VzIHBsYWNlLgorCisgICAgICAgIElmIGFsbG93X25hbiBpcyB0cnVlLCB0aGVuIE5hTiwgSW5maW5pdHksIGFuZCAtSW5maW5pdHkgd2lsbCBiZQorICAgICAgICBlbmNvZGVkIGFzIHN1Y2guICBUaGlzIGJlaGF2aW9yIGlzIG5vdCBKU09OIHNwZWNpZmljYXRpb24gY29tcGxpYW50LAorICAgICAgICBidXQgaXMgY29uc2lzdGVudCB3aXRoIG1vc3QgSmF2YVNjcmlwdCBiYXNlZCBlbmNvZGVycyBhbmQgZGVjb2RlcnMuCisgICAgICAgIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBhIFZhbHVlRXJyb3IgdG8gZW5jb2RlIHN1Y2ggZmxvYXRzLgorCisgICAgICAgIElmIHNvcnRfa2V5cyBpcyB0cnVlLCB0aGVuIHRoZSBvdXRwdXQgb2YgZGljdGlvbmFyaWVzIHdpbGwgYmUKKyAgICAgICAgc29ydGVkIGJ5IGtleTsgdGhpcyBpcyB1c2VmdWwgZm9yIHJlZ3Jlc3Npb24gdGVzdHMgdG8gZW5zdXJlCisgICAgICAgIHRoYXQgSlNPTiBzZXJpYWxpemF0aW9ucyBjYW4gYmUgY29tcGFyZWQgb24gYSBkYXktdG8tZGF5IGJhc2lzLgorCisgICAgICAgIElmIGluZGVudCBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCB0aGVuIEpTT04gYXJyYXkKKyAgICAgICAgZWxlbWVudHMgYW5kIG9iamVjdCBtZW1iZXJzIHdpbGwgYmUgcHJldHR5LXByaW50ZWQgd2l0aCB0aGF0CisgICAgICAgIGluZGVudCBsZXZlbC4gIEFuIGluZGVudCBsZXZlbCBvZiAwIHdpbGwgb25seSBpbnNlcnQgbmV3bGluZXMuCisgICAgICAgIE5vbmUgaXMgdGhlIG1vc3QgY29tcGFjdCByZXByZXNlbnRhdGlvbi4gIFNpbmNlIHRoZSBkZWZhdWx0CisgICAgICAgIGl0ZW0gc2VwYXJhdG9yIGlzICcsICcsICB0aGUgb3V0cHV0IG1pZ2h0IGluY2x1ZGUgdHJhaWxpbmcKKyAgICAgICAgd2hpdGVzcGFjZSB3aGVuIGluZGVudCBpcyBzcGVjaWZpZWQuICBZb3UgY2FuIHVzZQorICAgICAgICBzZXBhcmF0b3JzPSgnLCcsICc6ICcpIHRvIGF2b2lkIHRoaXMuCisKKyAgICAgICAgSWYgc3BlY2lmaWVkLCBzZXBhcmF0b3JzIHNob3VsZCBiZSBhIChpdGVtX3NlcGFyYXRvciwga2V5X3NlcGFyYXRvcikKKyAgICAgICAgdHVwbGUuICBUaGUgZGVmYXVsdCBpcyAoJywgJywgJzogJykuICBUbyBnZXQgdGhlIG1vc3QgY29tcGFjdCBKU09OCisgICAgICAgIHJlcHJlc2VudGF0aW9uIHlvdSBzaG91bGQgc3BlY2lmeSAoJywnLCAnOicpIHRvIGVsaW1pbmF0ZSB3aGl0ZXNwYWNlLgorCisgICAgICAgIElmIHNwZWNpZmllZCwgZGVmYXVsdCBpcyBhIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgZm9yIG9iamVjdHMKKyAgICAgICAgdGhhdCBjYW4ndCBvdGhlcndpc2UgYmUgc2VyaWFsaXplZC4gIEl0IHNob3VsZCByZXR1cm4gYSBKU09OIGVuY29kYWJsZQorICAgICAgICB2ZXJzaW9uIG9mIHRoZSBvYmplY3Qgb3IgcmFpc2UgYSBgYFR5cGVFcnJvcmBgLgorCisgICAgICAgIElmIGVuY29kaW5nIGlzIG5vdCBOb25lLCB0aGVuIGFsbCBpbnB1dCBzdHJpbmdzIHdpbGwgYmUKKyAgICAgICAgdHJhbnNmb3JtZWQgaW50byB1bmljb2RlIHVzaW5nIHRoYXQgZW5jb2RpbmcgcHJpb3IgdG8gSlNPTi1lbmNvZGluZy4KKyAgICAgICAgVGhlIGRlZmF1bHQgaXMgVVRGLTguCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgc2VsZi5za2lwa2V5cyA9IHNraXBrZXlzCisgICAgICAgIHNlbGYuZW5zdXJlX2FzY2lpID0gZW5zdXJlX2FzY2lpCisgICAgICAgIHNlbGYuY2hlY2tfY2lyY3VsYXIgPSBjaGVja19jaXJjdWxhcgorICAgICAgICBzZWxmLmFsbG93X25hbiA9IGFsbG93X25hbgorICAgICAgICBzZWxmLnNvcnRfa2V5cyA9IHNvcnRfa2V5cworICAgICAgICBzZWxmLmluZGVudCA9IGluZGVudAorICAgICAgICBpZiBzZXBhcmF0b3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5pdGVtX3NlcGFyYXRvciwgc2VsZi5rZXlfc2VwYXJhdG9yID0gc2VwYXJhdG9ycworICAgICAgICBpZiBkZWZhdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kZWZhdWx0ID0gZGVmYXVsdAorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKworICAgIGRlZiBkZWZhdWx0KHNlbGYsIG8pOgorICAgICAgICAiIiJJbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gYSBzdWJjbGFzcyBzdWNoIHRoYXQgaXQgcmV0dXJucworICAgICAgICBhIHNlcmlhbGl6YWJsZSBvYmplY3QgZm9yIGBgb2BgLCBvciBjYWxscyB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICAodG8gcmFpc2UgYSBgYFR5cGVFcnJvcmBgKS4KKworICAgICAgICBGb3IgZXhhbXBsZSwgdG8gc3VwcG9ydCBhcmJpdHJhcnkgaXRlcmF0b3JzLCB5b3UgY291bGQKKyAgICAgICAgaW1wbGVtZW50IGRlZmF1bHQgbGlrZSB0aGlzOjoKKworICAgICAgICAgICAgZGVmIGRlZmF1bHQoc2VsZiwgbyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpdGVyYWJsZSA9IGl0ZXIobykKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QoaXRlcmFibGUpCisgICAgICAgICAgICAgICAgIyBMZXQgdGhlIGJhc2UgY2xhc3MgZGVmYXVsdCBtZXRob2QgcmFpc2UgdGhlIFR5cGVFcnJvcgorICAgICAgICAgICAgICAgIHJldHVybiBKU09ORW5jb2Rlci5kZWZhdWx0KHNlbGYsIG8pCisKKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcihyZXByKG8pICsgIiBpcyBub3QgSlNPTiBzZXJpYWxpemFibGUiKQorCisgICAgZGVmIGVuY29kZShzZWxmLCBvKToKKyAgICAgICAgIiIiUmV0dXJuIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBQeXRob24gZGF0YSBzdHJ1Y3R1cmUuCisKKyAgICAgICAgPj4+IEpTT05FbmNvZGVyKCkuZW5jb2RlKHsiZm9vIjogWyJiYXIiLCAiYmF6Il19KQorICAgICAgICAneyJmb28iOiBbImJhciIsICJiYXoiXX0nCisKKyAgICAgICAgIiIiCisgICAgICAgICMgVGhpcyBpcyBmb3IgZXh0cmVtZWx5IHNpbXBsZSBjYXNlcyBhbmQgYmVuY2htYXJrcy4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShvLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uobywgc3RyKToKKyAgICAgICAgICAgICAgICBfZW5jb2RpbmcgPSBzZWxmLmVuY29kaW5nCisgICAgICAgICAgICAgICAgaWYgKF9lbmNvZGluZyBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCAoX2VuY29kaW5nID09ICd1dGYtOCcpKToKKyAgICAgICAgICAgICAgICAgICAgbyA9IG8uZGVjb2RlKF9lbmNvZGluZykKKyAgICAgICAgICAgIGlmIHNlbGYuZW5zdXJlX2FzY2lpOgorICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVfYmFzZXN0cmluZ19hc2NpaShvKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlX2Jhc2VzdHJpbmcobykKKyAgICAgICAgIyBUaGlzIGRvZXNuJ3QgcGFzcyB0aGUgaXRlcmF0b3IgZGlyZWN0bHkgdG8gJycuam9pbigpIGJlY2F1c2UgdGhlCisgICAgICAgICMgZXhjZXB0aW9ucyBhcmVuJ3QgYXMgZGV0YWlsZWQuICBUaGUgbGlzdCBjYWxsIHNob3VsZCBiZSByb3VnaGx5CisgICAgICAgICMgZXF1aXZhbGVudCB0byB0aGUgUHlTZXF1ZW5jZV9GYXN0IHRoYXQgJycuam9pbigpIHdvdWxkIGRvLgorICAgICAgICBjaHVua3MgPSBzZWxmLml0ZXJlbmNvZGUobywgX29uZV9zaG90PVRydWUpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNodW5rcywgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICBjaHVua3MgPSBsaXN0KGNodW5rcykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oY2h1bmtzKQorCisgICAgZGVmIGl0ZXJlbmNvZGUoc2VsZiwgbywgX29uZV9zaG90PUZhbHNlKToKKyAgICAgICAgIiIiRW5jb2RlIHRoZSBnaXZlbiBvYmplY3QgYW5kIHlpZWxkIGVhY2ggc3RyaW5nCisgICAgICAgIHJlcHJlc2VudGF0aW9uIGFzIGF2YWlsYWJsZS4KKworICAgICAgICBGb3IgZXhhbXBsZTo6CisKKyAgICAgICAgICAgIGZvciBjaHVuayBpbiBKU09ORW5jb2RlcigpLml0ZXJlbmNvZGUoYmlnb2JqZWN0KToKKyAgICAgICAgICAgICAgICBteXNvY2tldC53cml0ZShjaHVuaykKKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jaGVja19jaXJjdWxhcjoKKyAgICAgICAgICAgIG1hcmtlcnMgPSB7fQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbWFya2VycyA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5lbnN1cmVfYXNjaWk6CisgICAgICAgICAgICBfZW5jb2RlciA9IGVuY29kZV9iYXNlc3RyaW5nX2FzY2lpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfZW5jb2RlciA9IGVuY29kZV9iYXNlc3RyaW5nCisgICAgICAgIGlmIHNlbGYuZW5jb2RpbmcgIT0gJ3V0Zi04JzoKKyAgICAgICAgICAgIGRlZiBfZW5jb2RlcihvLCBfb3JpZ19lbmNvZGVyPV9lbmNvZGVyLCBfZW5jb2Rpbmc9c2VsZi5lbmNvZGluZyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvLCBzdHIpOgorICAgICAgICAgICAgICAgICAgICBvID0gby5kZWNvZGUoX2VuY29kaW5nKQorICAgICAgICAgICAgICAgIHJldHVybiBfb3JpZ19lbmNvZGVyKG8pCisKKyAgICAgICAgZGVmIGZsb2F0c3RyKG8sIGFsbG93X25hbj1zZWxmLmFsbG93X25hbiwKKyAgICAgICAgICAgICAgICBfcmVwcj1GTE9BVF9SRVBSLCBfaW5mPUlORklOSVRZLCBfbmVnaW5mPS1JTkZJTklUWSk6CisgICAgICAgICAgICAjIENoZWNrIGZvciBzcGVjaWFscy4gIE5vdGUgdGhhdCB0aGlzIHR5cGUgb2YgdGVzdCBpcyBwcm9jZXNzb3IKKyAgICAgICAgICAgICMgYW5kL29yIHBsYXRmb3JtLXNwZWNpZmljLCBzbyBkbyB0ZXN0cyB3aGljaCBkb24ndCBkZXBlbmQgb24gdGhlCisgICAgICAgICAgICAjIGludGVybmFscy4KKworICAgICAgICAgICAgaWYgbyAhPSBvOgorICAgICAgICAgICAgICAgIHRleHQgPSAnTmFOJworICAgICAgICAgICAgZWxpZiBvID09IF9pbmY6CisgICAgICAgICAgICAgICAgdGV4dCA9ICdJbmZpbml0eScKKyAgICAgICAgICAgIGVsaWYgbyA9PSBfbmVnaW5mOgorICAgICAgICAgICAgICAgIHRleHQgPSAnLUluZmluaXR5JworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX3JlcHIobykKKworICAgICAgICAgICAgaWYgbm90IGFsbG93X25hbjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAiT3V0IG9mIHJhbmdlIGZsb2F0IHZhbHVlcyBhcmUgbm90IEpTT04gY29tcGxpYW50OiAiICsKKyAgICAgICAgICAgICAgICAgICAgcmVwcihvKSkKKworICAgICAgICAgICAgcmV0dXJuIHRleHQKKworCisgICAgICAgIGlmIChfb25lX3Nob3QgYW5kIGNfbWFrZV9lbmNvZGVyIGlzIG5vdCBOb25lCisgICAgICAgICAgICAgICAgYW5kIHNlbGYuaW5kZW50IGlzIE5vbmUgYW5kIG5vdCBzZWxmLnNvcnRfa2V5cyk6CisgICAgICAgICAgICBfaXRlcmVuY29kZSA9IGNfbWFrZV9lbmNvZGVyKAorICAgICAgICAgICAgICAgIG1hcmtlcnMsIHNlbGYuZGVmYXVsdCwgX2VuY29kZXIsIHNlbGYuaW5kZW50LAorICAgICAgICAgICAgICAgIHNlbGYua2V5X3NlcGFyYXRvciwgc2VsZi5pdGVtX3NlcGFyYXRvciwgc2VsZi5zb3J0X2tleXMsCisgICAgICAgICAgICAgICAgc2VsZi5za2lwa2V5cywgc2VsZi5hbGxvd19uYW4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfaXRlcmVuY29kZSA9IF9tYWtlX2l0ZXJlbmNvZGUoCisgICAgICAgICAgICAgICAgbWFya2Vycywgc2VsZi5kZWZhdWx0LCBfZW5jb2Rlciwgc2VsZi5pbmRlbnQsIGZsb2F0c3RyLAorICAgICAgICAgICAgICAgIHNlbGYua2V5X3NlcGFyYXRvciwgc2VsZi5pdGVtX3NlcGFyYXRvciwgc2VsZi5zb3J0X2tleXMsCisgICAgICAgICAgICAgICAgc2VsZi5za2lwa2V5cywgX29uZV9zaG90KQorICAgICAgICByZXR1cm4gX2l0ZXJlbmNvZGUobywgMCkKKworZGVmIF9tYWtlX2l0ZXJlbmNvZGUobWFya2VycywgX2RlZmF1bHQsIF9lbmNvZGVyLCBfaW5kZW50LCBfZmxvYXRzdHIsCisgICAgICAgIF9rZXlfc2VwYXJhdG9yLCBfaXRlbV9zZXBhcmF0b3IsIF9zb3J0X2tleXMsIF9za2lwa2V5cywgX29uZV9zaG90LAorICAgICAgICAjIyBIQUNLOiBoYW5kLW9wdGltaXplZCBieXRlY29kZTsgdHVybiBnbG9iYWxzIGludG8gbG9jYWxzCisgICAgICAgIFZhbHVlRXJyb3I9VmFsdWVFcnJvciwKKyAgICAgICAgYmFzZXN0cmluZz1iYXNlc3RyaW5nLAorICAgICAgICBkaWN0PWRpY3QsCisgICAgICAgIGZsb2F0PWZsb2F0LAorICAgICAgICBpZD1pZCwKKyAgICAgICAgaW50PWludCwKKyAgICAgICAgaXNpbnN0YW5jZT1pc2luc3RhbmNlLAorICAgICAgICBsaXN0PWxpc3QsCisgICAgICAgIGxvbmc9bG9uZywKKyAgICAgICAgc3RyPXN0ciwKKyAgICAgICAgdHVwbGU9dHVwbGUsCisgICAgKToKKworICAgIGRlZiBfaXRlcmVuY29kZV9saXN0KGxzdCwgX2N1cnJlbnRfaW5kZW50X2xldmVsKToKKyAgICAgICAgaWYgbm90IGxzdDoKKyAgICAgICAgICAgIHlpZWxkICdbXScKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBtYXJrZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbWFya2VyaWQgPSBpZChsc3QpCisgICAgICAgICAgICBpZiBtYXJrZXJpZCBpbiBtYXJrZXJzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCIpCisgICAgICAgICAgICBtYXJrZXJzW21hcmtlcmlkXSA9IGxzdAorICAgICAgICBidWYgPSAnWycKKyAgICAgICAgaWYgX2luZGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jdXJyZW50X2luZGVudF9sZXZlbCArPSAxCisgICAgICAgICAgICBuZXdsaW5lX2luZGVudCA9ICdcbicgKyAoJyAnICogKF9pbmRlbnQgKiBfY3VycmVudF9pbmRlbnRfbGV2ZWwpKQorICAgICAgICAgICAgc2VwYXJhdG9yID0gX2l0ZW1fc2VwYXJhdG9yICsgbmV3bGluZV9pbmRlbnQKKyAgICAgICAgICAgIGJ1ZiArPSBuZXdsaW5lX2luZGVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3bGluZV9pbmRlbnQgPSBOb25lCisgICAgICAgICAgICBzZXBhcmF0b3IgPSBfaXRlbV9zZXBhcmF0b3IKKyAgICAgICAgZmlyc3QgPSBUcnVlCisgICAgICAgIGZvciB2YWx1ZSBpbiBsc3Q6CisgICAgICAgICAgICBpZiBmaXJzdDoKKyAgICAgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlcGFyYXRvcgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgeWllbGQgYnVmICsgX2VuY29kZXIodmFsdWUpCisgICAgICAgICAgICBlbGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgYnVmICsgJ251bGwnCisgICAgICAgICAgICBlbGlmIHZhbHVlIGlzIFRydWU6CisgICAgICAgICAgICAgICAgeWllbGQgYnVmICsgJ3RydWUnCisgICAgICAgICAgICBlbGlmIHZhbHVlIGlzIEZhbHNlOgorICAgICAgICAgICAgICAgIHlpZWxkIGJ1ZiArICdmYWxzZScKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgICAgIHlpZWxkIGJ1ZiArIHN0cih2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZmxvYXQpOgorICAgICAgICAgICAgICAgIHlpZWxkIGJ1ZiArIF9mbG9hdHN0cih2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgYnVmCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgKGxpc3QsIHR1cGxlKSk6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IF9pdGVyZW5jb2RlX2xpc3QodmFsdWUsIF9jdXJyZW50X2luZGVudF9sZXZlbCkKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MgPSBfaXRlcmVuY29kZV9kaWN0KHZhbHVlLCBfY3VycmVudF9pbmRlbnRfbGV2ZWwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzID0gX2l0ZXJlbmNvZGUodmFsdWUsIF9jdXJyZW50X2luZGVudF9sZXZlbCkKKyAgICAgICAgICAgICAgICBmb3IgY2h1bmsgaW4gY2h1bmtzOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBjaHVuaworICAgICAgICBpZiBuZXdsaW5lX2luZGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jdXJyZW50X2luZGVudF9sZXZlbCAtPSAxCisgICAgICAgICAgICB5aWVsZCAnXG4nICsgKCcgJyAqIChfaW5kZW50ICogX2N1cnJlbnRfaW5kZW50X2xldmVsKSkKKyAgICAgICAgeWllbGQgJ10nCisgICAgICAgIGlmIG1hcmtlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkZWwgbWFya2Vyc1ttYXJrZXJpZF0KKworICAgIGRlZiBfaXRlcmVuY29kZV9kaWN0KGRjdCwgX2N1cnJlbnRfaW5kZW50X2xldmVsKToKKyAgICAgICAgaWYgbm90IGRjdDoKKyAgICAgICAgICAgIHlpZWxkICd7fScKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBtYXJrZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbWFya2VyaWQgPSBpZChkY3QpCisgICAgICAgICAgICBpZiBtYXJrZXJpZCBpbiBtYXJrZXJzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNpcmN1bGFyIHJlZmVyZW5jZSBkZXRlY3RlZCIpCisgICAgICAgICAgICBtYXJrZXJzW21hcmtlcmlkXSA9IGRjdAorICAgICAgICB5aWVsZCAneycKKyAgICAgICAgaWYgX2luZGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jdXJyZW50X2luZGVudF9sZXZlbCArPSAxCisgICAgICAgICAgICBuZXdsaW5lX2luZGVudCA9ICdcbicgKyAoJyAnICogKF9pbmRlbnQgKiBfY3VycmVudF9pbmRlbnRfbGV2ZWwpKQorICAgICAgICAgICAgaXRlbV9zZXBhcmF0b3IgPSBfaXRlbV9zZXBhcmF0b3IgKyBuZXdsaW5lX2luZGVudAorICAgICAgICAgICAgeWllbGQgbmV3bGluZV9pbmRlbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld2xpbmVfaW5kZW50ID0gTm9uZQorICAgICAgICAgICAgaXRlbV9zZXBhcmF0b3IgPSBfaXRlbV9zZXBhcmF0b3IKKyAgICAgICAgZmlyc3QgPSBUcnVlCisgICAgICAgIGlmIF9zb3J0X2tleXM6CisgICAgICAgICAgICBpdGVtcyA9IHNvcnRlZChkY3QuaXRlbXMoKSwga2V5PWxhbWJkYSBrdjoga3ZbMF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpdGVtcyA9IGRjdC5pdGVyaXRlbXMoKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpdGVtczoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIEphdmFTY3JpcHQgaXMgd2Vha2x5IHR5cGVkIGZvciB0aGVzZSwgc28gaXQgbWFrZXMgc2Vuc2UgdG8KKyAgICAgICAgICAgICMgYWxzbyBhbGxvdyB0aGVtLiAgTWFueSBlbmNvZGVycyBzZWVtIHRvIGRvIHNvbWV0aGluZyBsaWtlIHRoaXMuCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoa2V5LCBmbG9hdCk6CisgICAgICAgICAgICAgICAga2V5ID0gX2Zsb2F0c3RyKGtleSkKKyAgICAgICAgICAgIGVsaWYga2V5IGlzIFRydWU6CisgICAgICAgICAgICAgICAga2V5ID0gJ3RydWUnCisgICAgICAgICAgICBlbGlmIGtleSBpcyBGYWxzZToKKyAgICAgICAgICAgICAgICBrZXkgPSAnZmFsc2UnCisgICAgICAgICAgICBlbGlmIGtleSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGtleSA9ICdudWxsJworICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGtleSwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgICAgIGtleSA9IHN0cihrZXkpCisgICAgICAgICAgICBlbGlmIF9za2lwa2V5czoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImtleSAiICsgcmVwcihrZXkpICsgIiBpcyBub3QgYSBzdHJpbmciKQorICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgZmlyc3QgPSBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCBpdGVtX3NlcGFyYXRvcgorICAgICAgICAgICAgeWllbGQgX2VuY29kZXIoa2V5KQorICAgICAgICAgICAgeWllbGQgX2tleV9zZXBhcmF0b3IKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHlpZWxkIF9lbmNvZGVyKHZhbHVlKQorICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHlpZWxkICdudWxsJworICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBUcnVlOgorICAgICAgICAgICAgICAgIHlpZWxkICd0cnVlJworICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBGYWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCAnZmFsc2UnCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICAgICB5aWVsZCBzdHIodmFsdWUpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICAgICAgICAgICAgICB5aWVsZCBfZmxvYXRzdHIodmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgICAgICAgICBjaHVua3MgPSBfaXRlcmVuY29kZV9saXN0KHZhbHVlLCBfY3VycmVudF9pbmRlbnRfbGV2ZWwpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKKyAgICAgICAgICAgICAgICAgICAgY2h1bmtzID0gX2l0ZXJlbmNvZGVfZGljdCh2YWx1ZSwgX2N1cnJlbnRfaW5kZW50X2xldmVsKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNodW5rcyA9IF9pdGVyZW5jb2RlKHZhbHVlLCBfY3VycmVudF9pbmRlbnRfbGV2ZWwpCisgICAgICAgICAgICAgICAgZm9yIGNodW5rIGluIGNodW5rczoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKKyAgICAgICAgaWYgbmV3bGluZV9pbmRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY3VycmVudF9pbmRlbnRfbGV2ZWwgLT0gMQorICAgICAgICAgICAgeWllbGQgJ1xuJyArICgnICcgKiAoX2luZGVudCAqIF9jdXJyZW50X2luZGVudF9sZXZlbCkpCisgICAgICAgIHlpZWxkICd9JworICAgICAgICBpZiBtYXJrZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGVsIG1hcmtlcnNbbWFya2VyaWRdCisKKyAgICBkZWYgX2l0ZXJlbmNvZGUobywgX2N1cnJlbnRfaW5kZW50X2xldmVsKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHlpZWxkIF9lbmNvZGVyKG8pCisgICAgICAgIGVsaWYgbyBpcyBOb25lOgorICAgICAgICAgICAgeWllbGQgJ251bGwnCisgICAgICAgIGVsaWYgbyBpcyBUcnVlOgorICAgICAgICAgICAgeWllbGQgJ3RydWUnCisgICAgICAgIGVsaWYgbyBpcyBGYWxzZToKKyAgICAgICAgICAgIHlpZWxkICdmYWxzZScKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG8sIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgIHlpZWxkIHN0cihvKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobywgZmxvYXQpOgorICAgICAgICAgICAgeWllbGQgX2Zsb2F0c3RyKG8pCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIGZvciBjaHVuayBpbiBfaXRlcmVuY29kZV9saXN0KG8sIF9jdXJyZW50X2luZGVudF9sZXZlbCk6CisgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG8sIGRpY3QpOgorICAgICAgICAgICAgZm9yIGNodW5rIGluIF9pdGVyZW5jb2RlX2RpY3QobywgX2N1cnJlbnRfaW5kZW50X2xldmVsKToKKyAgICAgICAgICAgICAgICB5aWVsZCBjaHVuaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbWFya2VycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBtYXJrZXJpZCA9IGlkKG8pCisgICAgICAgICAgICAgICAgaWYgbWFya2VyaWQgaW4gbWFya2VyczoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIikKKyAgICAgICAgICAgICAgICBtYXJrZXJzW21hcmtlcmlkXSA9IG8KKyAgICAgICAgICAgIG8gPSBfZGVmYXVsdChvKQorICAgICAgICAgICAgZm9yIGNodW5rIGluIF9pdGVyZW5jb2RlKG8sIF9jdXJyZW50X2luZGVudF9sZXZlbCk6CisgICAgICAgICAgICAgICAgeWllbGQgY2h1bmsKKyAgICAgICAgICAgIGlmIG1hcmtlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIG1hcmtlcnNbbWFya2VyaWRdCisKKyAgICByZXR1cm4gX2l0ZXJlbmNvZGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9lbmNvZGVyLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi9lbmNvZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIwMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL2VuY29kZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9lbmNvZGVyLnB5byBiL2xpYi9weXRob24yLjcvanNvbi9lbmNvZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmIwMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL2VuY29kZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3NjYW5uZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRlNjgwNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5CkBAIC0wLDAgKzEsNjcgQEAKKyIiIkpTT04gdG9rZW4gc2Nhbm5lcgorIiIiCitpbXBvcnQgcmUKK3RyeToKKyAgICBmcm9tIF9qc29uIGltcG9ydCBtYWtlX3NjYW5uZXIgYXMgY19tYWtlX3NjYW5uZXIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBjX21ha2Vfc2Nhbm5lciA9IE5vbmUKKworX19hbGxfXyA9IFsnbWFrZV9zY2FubmVyJ10KKworTlVNQkVSX1JFID0gcmUuY29tcGlsZSgKKyAgICByJygtPyg/OjB8WzEtOV1cZCopKShcLlxkKyk/KFtlRV1bLStdP1xkKyk/JywKKyAgICAocmUuVkVSQk9TRSB8IHJlLk1VTFRJTElORSB8IHJlLkRPVEFMTCkpCisKK2RlZiBweV9tYWtlX3NjYW5uZXIoY29udGV4dCk6CisgICAgcGFyc2Vfb2JqZWN0ID0gY29udGV4dC5wYXJzZV9vYmplY3QKKyAgICBwYXJzZV9hcnJheSA9IGNvbnRleHQucGFyc2VfYXJyYXkKKyAgICBwYXJzZV9zdHJpbmcgPSBjb250ZXh0LnBhcnNlX3N0cmluZworICAgIG1hdGNoX251bWJlciA9IE5VTUJFUl9SRS5tYXRjaAorICAgIGVuY29kaW5nID0gY29udGV4dC5lbmNvZGluZworICAgIHN0cmljdCA9IGNvbnRleHQuc3RyaWN0CisgICAgcGFyc2VfZmxvYXQgPSBjb250ZXh0LnBhcnNlX2Zsb2F0CisgICAgcGFyc2VfaW50ID0gY29udGV4dC5wYXJzZV9pbnQKKyAgICBwYXJzZV9jb25zdGFudCA9IGNvbnRleHQucGFyc2VfY29uc3RhbnQKKyAgICBvYmplY3RfaG9vayA9IGNvbnRleHQub2JqZWN0X2hvb2sKKyAgICBvYmplY3RfcGFpcnNfaG9vayA9IGNvbnRleHQub2JqZWN0X3BhaXJzX2hvb2sKKworICAgIGRlZiBfc2Nhbl9vbmNlKHN0cmluZywgaWR4KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV4dGNoYXIgPSBzdHJpbmdbaWR4XQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICBpZiBuZXh0Y2hhciA9PSAnIic6CisgICAgICAgICAgICByZXR1cm4gcGFyc2Vfc3RyaW5nKHN0cmluZywgaWR4ICsgMSwgZW5jb2RpbmcsIHN0cmljdCkKKyAgICAgICAgZWxpZiBuZXh0Y2hhciA9PSAneyc6CisgICAgICAgICAgICByZXR1cm4gcGFyc2Vfb2JqZWN0KChzdHJpbmcsIGlkeCArIDEpLCBlbmNvZGluZywgc3RyaWN0LAorICAgICAgICAgICAgICAgIF9zY2FuX29uY2UsIG9iamVjdF9ob29rLCBvYmplY3RfcGFpcnNfaG9vaykKKyAgICAgICAgZWxpZiBuZXh0Y2hhciA9PSAnWyc6CisgICAgICAgICAgICByZXR1cm4gcGFyc2VfYXJyYXkoKHN0cmluZywgaWR4ICsgMSksIF9zY2FuX29uY2UpCisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJ24nIGFuZCBzdHJpbmdbaWR4OmlkeCArIDRdID09ICdudWxsJzoKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBpZHggKyA0CisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJ3QnIGFuZCBzdHJpbmdbaWR4OmlkeCArIDRdID09ICd0cnVlJzoKKyAgICAgICAgICAgIHJldHVybiBUcnVlLCBpZHggKyA0CisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJ2YnIGFuZCBzdHJpbmdbaWR4OmlkeCArIDVdID09ICdmYWxzZSc6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UsIGlkeCArIDUKKworICAgICAgICBtID0gbWF0Y2hfbnVtYmVyKHN0cmluZywgaWR4KQorICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaW50ZWdlciwgZnJhYywgZXhwID0gbS5ncm91cHMoKQorICAgICAgICAgICAgaWYgZnJhYyBvciBleHA6CisgICAgICAgICAgICAgICAgcmVzID0gcGFyc2VfZmxvYXQoaW50ZWdlciArIChmcmFjIG9yICcnKSArIChleHAgb3IgJycpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXMgPSBwYXJzZV9pbnQoaW50ZWdlcikKKyAgICAgICAgICAgIHJldHVybiByZXMsIG0uZW5kKCkKKyAgICAgICAgZWxpZiBuZXh0Y2hhciA9PSAnTicgYW5kIHN0cmluZ1tpZHg6aWR4ICsgM10gPT0gJ05hTic6CisgICAgICAgICAgICByZXR1cm4gcGFyc2VfY29uc3RhbnQoJ05hTicpLCBpZHggKyAzCisgICAgICAgIGVsaWYgbmV4dGNoYXIgPT0gJ0knIGFuZCBzdHJpbmdbaWR4OmlkeCArIDhdID09ICdJbmZpbml0eSc6CisgICAgICAgICAgICByZXR1cm4gcGFyc2VfY29uc3RhbnQoJ0luZmluaXR5JyksIGlkeCArIDgKKyAgICAgICAgZWxpZiBuZXh0Y2hhciA9PSAnLScgYW5kIHN0cmluZ1tpZHg6aWR4ICsgOV0gPT0gJy1JbmZpbml0eSc6CisgICAgICAgICAgICByZXR1cm4gcGFyc2VfY29uc3RhbnQoJy1JbmZpbml0eScpLCBpZHggKyA5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKKyAgICByZXR1cm4gX3NjYW5fb25jZQorCittYWtlX3NjYW5uZXIgPSBjX21ha2Vfc2Nhbm5lciBvciBweV9tYWtlX3NjYW5uZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YThlNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3NjYW5uZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5byBiL2xpYi9weXRob24yLjcvanNvbi9zY2FubmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YThlNjg3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3NjYW5uZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGNiMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNzMgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGpzb24KK2ltcG9ydCBkb2N0ZXN0CitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBpbXBvcnQganNvbiB3aXRoIGFuZCB3aXRob3V0IGFjY2VsZXJhdGlvbnMKK2Nqc29uID0gdGVzdF9zdXBwb3J0LmltcG9ydF9mcmVzaF9tb2R1bGUoJ2pzb24nLCBmcmVzaD1bJ19qc29uJ10pCitweWpzb24gPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X2ZyZXNoX21vZHVsZSgnanNvbicsIGJsb2NrZWQ9WydfanNvbiddKQorCisjIGNyZWF0ZSB0d28gYmFzZSBjbGFzc2VzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBvdGhlciB0ZXN0cworY2xhc3MgUHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBqc29uID0gcHlqc29uCisgICAgbG9hZHMgPSBzdGF0aWNtZXRob2QocHlqc29uLmxvYWRzKQorICAgIGR1bXBzID0gc3RhdGljbWV0aG9kKHB5anNvbi5kdW1wcykKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoY2pzb24sICdyZXF1aXJlcyBfanNvbicpCitjbGFzcyBDVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaWYgY2pzb24gaXMgbm90IE5vbmU6CisgICAgICAgIGpzb24gPSBjanNvbgorICAgICAgICBsb2FkcyA9IHN0YXRpY21ldGhvZChjanNvbi5sb2FkcykKKyAgICAgICAgZHVtcHMgPSBzdGF0aWNtZXRob2QoY2pzb24uZHVtcHMpCisKKyMgdGVzdCBQeVRlc3QgYW5kIENUZXN0IGNoZWNraW5nIGlmIHRoZSBmdW5jdGlvbnMgY29tZSBmcm9tIHRoZSByaWdodCBtb2R1bGUKK2NsYXNzIFRlc3RQeVRlc3QoUHlUZXN0KToKKyAgICBkZWYgdGVzdF9weWpzb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLnNjYW5uZXIubWFrZV9zY2FubmVyLl9fbW9kdWxlX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2pzb24uc2Nhbm5lcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLmRlY29kZXIuc2NhbnN0cmluZy5fX21vZHVsZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICdqc29uLmRlY29kZXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nX2FzY2lpLl9fbW9kdWxlX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2pzb24uZW5jb2RlcicpCisKK2NsYXNzIFRlc3RDVGVzdChDVGVzdCk6CisgICAgZGVmIHRlc3RfY2pzb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLnNjYW5uZXIubWFrZV9zY2FubmVyLl9fbW9kdWxlX18sICdfanNvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLmRlY29kZXIuc2NhbnN0cmluZy5fX21vZHVsZV9fLCAnX2pzb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuanNvbi5lbmNvZGVyLmNfbWFrZV9lbmNvZGVyLl9fbW9kdWxlX18sICdfanNvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLmVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkuX19tb2R1bGVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnX2pzb24nKQorCisKK2hlcmUgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgc3VpdGUgPSBhZGRpdGlvbmFsX3Rlc3RzKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBmb3IgZm4gaW4gb3MubGlzdGRpcihoZXJlKToKKyAgICAgICAgaWYgZm4uc3RhcnRzd2l0aCgidGVzdCIpIGFuZCBmbi5lbmRzd2l0aCgiLnB5Iik6CisgICAgICAgICAgICBtb2RuYW1lID0gImpzb24udGVzdHMuIiArIGZuWzotM10KKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kbmFtZSkKKyAgICAgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0cyhsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtb2R1bGUpKQorICAgIHJldHVybiBzdWl0ZQorCitkZWYgYWRkaXRpb25hbF90ZXN0cygpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgbW9kIGluIChqc29uLCBqc29uLmVuY29kZXIsIGpzb24uZGVjb2Rlcik6CisgICAgICAgIHN1aXRlLmFkZFRlc3QoZG9jdGVzdC5Eb2NUZXN0U3VpdGUobW9kKSkKKyAgICBzdWl0ZS5hZGRUZXN0KFRlc3RQeVRlc3QoJ3Rlc3RfcHlqc29uJykpCisgICAgc3VpdGUuYWRkVGVzdChUZXN0Q1Rlc3QoJ3Rlc3RfY2pzb24nKSkKKyAgICByZXR1cm4gc3VpdGUKKworZGVmIG1haW4oKToKKyAgICBzdWl0ZSA9IHRlc3Rfc3VpdGUoKQorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKSkpKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0OTFmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0OTFmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfY2hlY2tfY2lyY3VsYXIucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9jaGVja19jaXJjdWxhci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQzZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfY2hlY2tfY2lyY3VsYXIucHkKQEAgLTAsMCArMSwzNCBAQAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworZGVmIGRlZmF1bHRfaXRlcmFibGUob2JqKToKKyAgICByZXR1cm4gbGlzdChvYmopCisKK2NsYXNzIFRlc3RDaGVja0NpcmN1bGFyKG9iamVjdCk6CisgICAgZGVmIHRlc3RfY2lyY3VsYXJfZGljdChzZWxmKToKKyAgICAgICAgZGN0ID0ge30KKyAgICAgICAgZGN0WydhJ10gPSBkY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kdW1wcywgZGN0KQorCisgICAgZGVmIHRlc3RfY2lyY3VsYXJfbGlzdChzZWxmKToKKyAgICAgICAgbHN0ID0gW10KKyAgICAgICAgbHN0LmFwcGVuZChsc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZHVtcHMsIGxzdCkKKworICAgIGRlZiB0ZXN0X2NpcmN1bGFyX2NvbXBvc2l0ZShzZWxmKToKKyAgICAgICAgZGN0MiA9IHt9CisgICAgICAgIGRjdDJbJ2EnXSA9IFtdCisgICAgICAgIGRjdDJbJ2EnXS5hcHBlbmQoZGN0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kdW1wcywgZGN0MikKKworICAgIGRlZiB0ZXN0X2NpcmN1bGFyX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuZHVtcHMoW3NldCgpXSwgZGVmYXVsdD1kZWZhdWx0X2l0ZXJhYmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZHVtcHMsIFtzZXQoKV0pCisKKyAgICBkZWYgdGVzdF9jaXJjdWxhcl9vZmZfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5kdW1wcyhbc2V0KCldLCBkZWZhdWx0PWRlZmF1bHRfaXRlcmFibGUsIGNoZWNrX2NpcmN1bGFyPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZHVtcHMsIFtzZXQoKV0sIGNoZWNrX2NpcmN1bGFyPUZhbHNlKQorCisKK2NsYXNzIFRlc3RQeUNoZWNrQ2lyY3VsYXIoVGVzdENoZWNrQ2lyY3VsYXIsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDQ2hlY2tDaXJjdWxhcihUZXN0Q2hlY2tDaXJjdWxhciwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9jaGVja19jaXJjdWxhci5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9jaGVja19jaXJjdWxhci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjODBkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2NoZWNrX2NpcmN1bGFyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9jaGVja19jaXJjdWxhci5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9jaGVja19jaXJjdWxhci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjODBkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2NoZWNrX2NpcmN1bGFyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkMWFhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlY29kZS5weQpAQCAtMCwwICsxLDY0IEBACitpbXBvcnQgZGVjaW1hbAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Citmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCitjbGFzcyBUZXN0RGVjb2RlKG9iamVjdCk6CisgICAgZGVmIHRlc3RfZGVjaW1hbChzZWxmKToKKyAgICAgICAgcnZhbCA9IHNlbGYubG9hZHMoJzEuMScsIHBhcnNlX2Zsb2F0PWRlY2ltYWwuRGVjaW1hbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocnZhbCwgZGVjaW1hbC5EZWNpbWFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydmFsLCBkZWNpbWFsLkRlY2ltYWwoJzEuMScpKQorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIHJ2YWwgPSBzZWxmLmxvYWRzKCcxJywgcGFyc2VfaW50PWZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShydmFsLCBmbG9hdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnZhbCwgMS4wKQorCisgICAgZGVmIHRlc3RfZGVjb2Rlcl9vcHRpbWl6YXRpb25zKHNlbGYpOgorICAgICAgICAjIFNldmVyYWwgb3B0aW1pemF0aW9ucyB3ZXJlIG1hZGUgdGhhdCBza2lwIG92ZXIgY2FsbHMgdG8KKyAgICAgICAgIyB0aGUgd2hpdGVzcGFjZSByZWdleCwgc28gdGhpcyB0ZXN0IGlzIGRlc2lnbmVkIHRvIHRyeSBhbmQKKyAgICAgICAgIyBleGVyY2lzZSB0aGUgdW5jb21tb24gY2FzZXMuIFRoZSBhcnJheSBjYXNlcyBhcmUgYWxyZWFkeSBjb3ZlcmVkLgorICAgICAgICBydmFsID0gc2VsZi5sb2FkcygneyAgICJrZXkiICAgIDogICAgInZhbHVlIiAgICAsICAiayI6InYiICAgIH0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ2YWwsIHsia2V5IjoidmFsdWUiLCAiayI6InYifSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X29iamVjdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2Fkcygne30nKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygnW10nKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygnIiInKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5sb2FkcygnIiInKSwgdW5pY29kZSkKKworICAgIGRlZiB0ZXN0X29iamVjdF9wYWlyc19ob29rKHNlbGYpOgorICAgICAgICBzID0gJ3sieGtkIjoxLCAia2N3IjoyLCAiYXJ0IjozLCAiaHhtIjo0LCAicXJ0Ijo1LCAicGFkIjo2LCAiaG95Ijo3fScKKyAgICAgICAgcCA9IFsoInhrZCIsIDEpLCAoImtjdyIsIDIpLCAoImFydCIsIDMpLCAoImh4bSIsIDQpLAorICAgICAgICAgICAgICgicXJ0IiwgNSksICgicGFkIiwgNiksICgiaG95IiwgNyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzKSwgZXZhbChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHMsIG9iamVjdF9wYWlyc19ob29rPWxhbWJkYSB4OiB4KSwgcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmpzb24ubG9hZChTdHJpbmdJTyhzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfcGFpcnNfaG9vaz1sYW1iZGEgeDogeCksIHApCisgICAgICAgIG9kID0gc2VsZi5sb2FkcyhzLCBvYmplY3RfcGFpcnNfaG9vaz1PcmRlcmVkRGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZCwgT3JkZXJlZERpY3QocCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShvZCksIE9yZGVyZWREaWN0KQorICAgICAgICAjIHRoZSBvYmplY3RfcGFpcnNfaG9vayB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZSBvYmplY3RfaG9vaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMocywgb2JqZWN0X3BhaXJzX2hvb2s9T3JkZXJlZERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfaG9vaz1sYW1iZGEgeDogTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3QocCkpCisgICAgICAgICMgY2hlY2sgdGhhdCBlbXB0eSBvYmplY3RzIGxpdGVyYWxzIHdvcmsgKHNlZSAjMTczNjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2Fkcygne30nLCBvYmplY3RfcGFpcnNfaG9vaz1PcmRlcmVkRGljdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKCd7ImVtcHR5Ijoge319JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wYWlyc19ob29rPU9yZGVyZWREaWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmVkRGljdChbKCdlbXB0eScsIE9yZGVyZWREaWN0KCkpXSkpCisKKyAgICBkZWYgdGVzdF9leHRyYV9kYXRhKHNlbGYpOgorICAgICAgICBzID0gJ1sxLCAyLCAzXTUnCisgICAgICAgIG1zZyA9ICdFeHRyYSBkYXRhJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChWYWx1ZUVycm9yLCBtc2csIHNlbGYubG9hZHMsIHMpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2VzY2FwZShzZWxmKToKKyAgICAgICAgcyA9ICdbImFiY1xceSJdJworICAgICAgICBtc2cgPSAnZXNjYXBlJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChWYWx1ZUVycm9yLCBtc2csIHNlbGYubG9hZHMsIHMpCisKK2NsYXNzIFRlc3RQeURlY29kZShUZXN0RGVjb2RlLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q0RlY29kZShUZXN0RGVjb2RlLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlY29kZS5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzBkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlY29kZS5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzBkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlZmF1bHQucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWZhdWx0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyYTA3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kZWZhdWx0LnB5CkBAIC0wLDAgKzEsMTIgQEAKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisKK2NsYXNzIFRlc3REZWZhdWx0KG9iamVjdCk6CisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZHVtcHModHlwZSwgZGVmYXVsdD1yZXByKSwKKyAgICAgICAgICAgIHNlbGYuZHVtcHMocmVwcih0eXBlKSkpCisKKworY2xhc3MgVGVzdFB5RGVmYXVsdChUZXN0RGVmYXVsdCwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENEZWZhdWx0KFRlc3REZWZhdWx0LCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlZmF1bHQucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVmYXVsdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhODcyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlZmF1bHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlZmF1bHQucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZGVmYXVsdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhODcyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2RlZmF1bHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2R1bXAucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTI1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9kdW1wLnB5CkBAIC0wLDAgKzEsMzIgQEAKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgVGVzdER1bXAob2JqZWN0KToKKyAgICBkZWYgdGVzdF9kdW1wKHNlbGYpOgorICAgICAgICBzaW8gPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuanNvbi5kdW1wKHt9LCBzaW8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lvLmdldHZhbHVlKCksICd7fScpCisKKyAgICBkZWYgdGVzdF9kdW1wcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmR1bXBzKHt9KSwgJ3t9JykKKworICAgIGRlZiB0ZXN0X2VuY29kZV90cnVlZmFsc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcygKKyAgICAgICAgICAgICAgICAge1RydWU6IEZhbHNlLCBGYWxzZTogVHJ1ZX0sIHNvcnRfa2V5cz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgJ3siZmFsc2UiOiB0cnVlLCAidHJ1ZSI6IGZhbHNlfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcygKKyAgICAgICAgICAgICAgICB7MjogMy4wLCA0LjA6IDVMLCBGYWxzZTogMSwgNkw6IFRydWV9LCBzb3J0X2tleXM9VHJ1ZSksCisgICAgICAgICAgICAgICAgJ3siZmFsc2UiOiAxLCAiMiI6IDMuMCwgIjQuMCI6IDUsICI2IjogdHJ1ZX0nKQorCisgICAgIyBJc3N1ZSAxNjIyODogQ3Jhc2ggb24gZW5jb2RpbmcgcmVzaXplZCBsaXN0CisgICAgZGVmIHRlc3RfZW5jb2RlX211dGF0ZWQoc2VsZik6CisgICAgICAgIGEgPSBbb2JqZWN0KCldICogMTAKKyAgICAgICAgZGVmIGNyYXNoZXIob2JqKToKKyAgICAgICAgICAgIGRlbCBhWy0xXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZHVtcHMoYSwgZGVmYXVsdD1jcmFzaGVyKSwKKyAgICAgICAgICAgICAgICAgJ1tudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsXScpCisKKworY2xhc3MgVGVzdFB5RHVtcChUZXN0RHVtcCwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENEdW1wKFRlc3REdW1wLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2R1bXAucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZHVtcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiNGQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2R1bXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2R1bXAucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZHVtcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFiNGQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2R1bXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5ZDVhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpLnB5CkBAIC0wLDAgKzEsNDEgQEAKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Citmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCitDQVNFUyA9IFsKKyAgICAodScvXFwiXHVjYWZlXHViYWJlXHVhYjk4XHVmY2RlXHViY2RhXHVlZjRhXHgwOFx4MGNcblxyXHRgMX4hQCMkJV4mKigpXystPVtde318OzpcJywuLzw+PycsICciL1xcXFxcXCJcXHVjYWZlXFx1YmFiZVxcdWFiOThcXHVmY2RlXFx1YmNkYVxcdWVmNGFcXGJcXGZcXG5cXHJcXHRgMX4hQCMkJV4mKigpXystPVtde318OzpcJywuLzw+PyInKSwKKyAgICAodSdcdTAxMjNcdTQ1NjdcdTg5YWJcdWNkZWZcdWFiY2RcdWVmNGEnLCAnIlxcdTAxMjNcXHU0NTY3XFx1ODlhYlxcdWNkZWZcXHVhYmNkXFx1ZWY0YSInKSwKKyAgICAodSdjb250cm9scycsICciY29udHJvbHMiJyksCisgICAgKHUnXHgwOFx4MGNcblxyXHQnLCAnIlxcYlxcZlxcblxcclxcdCInKSwKKyAgICAodSd7Im9iamVjdCB3aXRoIDEgbWVtYmVyIjpbImFycmF5IHdpdGggMSBlbGVtZW50Il19JywgJyJ7XFwib2JqZWN0IHdpdGggMSBtZW1iZXJcXCI6W1xcImFycmF5IHdpdGggMSBlbGVtZW50XFwiXX0iJyksCisgICAgKHUnIHMgcCBhIGMgZSBkICcsICciIHMgcCBhIGMgZSBkICInKSwKKyAgICAodSdcVTAwMDFkMTIwJywgJyJcXHVkODM0XFx1ZGQyMCInKSwKKyAgICAodSdcdTAzYjFcdTAzYTknLCAnIlxcdTAzYjFcXHUwM2E5IicpLAorICAgICgnXHhjZVx4YjFceGNlXHhhOScsICciXFx1MDNiMVxcdTAzYTkiJyksCisgICAgKHUnXHUwM2IxXHUwM2E5JywgJyJcXHUwM2IxXFx1MDNhOSInKSwKKyAgICAoJ1x4Y2VceGIxXHhjZVx4YTknLCAnIlxcdTAzYjFcXHUwM2E5IicpLAorICAgICh1J1x1MDNiMVx1MDNhOScsICciXFx1MDNiMVxcdTAzYTkiJyksCisgICAgKHUnXHUwM2IxXHUwM2E5JywgJyJcXHUwM2IxXFx1MDNhOSInKSwKKyAgICAodSJgMX4hQCMkJV4mKigpXystPXsnOlssXX18Oy48Lz4/IiwgJyJgMX4hQCMkJV4mKigpXystPXtcJzpbLF19fDsuPC8+PyInKSwKKyAgICAodSdceDA4XHgwY1xuXHJcdCcsICciXFxiXFxmXFxuXFxyXFx0IicpLAorICAgICh1J1x1MDEyM1x1NDU2N1x1ODlhYlx1Y2RlZlx1YWJjZFx1ZWY0YScsICciXFx1MDEyM1xcdTQ1NjdcXHU4OWFiXFx1Y2RlZlxcdWFiY2RcXHVlZjRhIicpLAorXQorCitjbGFzcyBUZXN0RW5jb2RlQmFzZXN0cmluZ0FzY2lpKG9iamVjdCk6CisgICAgZGVmIHRlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkoc2VsZik6CisgICAgICAgIGZuYW1lID0gc2VsZi5qc29uLmVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkuX19uYW1lX18KKyAgICAgICAgZm9yIGlucHV0X3N0cmluZywgZXhwZWN0IGluIENBU0VTOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5qc29uLmVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkoaW5wdXRfc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdCwKKyAgICAgICAgICAgICAgICAnezAhcn0gIT0gezEhcn0gZm9yIHsyfSh7MyFyfSknLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBleHBlY3QsIGZuYW1lLCBpbnB1dF9zdHJpbmcpKQorCisgICAgZGVmIHRlc3Rfb3JkZXJlZF9kaWN0KHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSA2MTA1CisgICAgICAgIGl0ZW1zID0gWygnb25lJywgMSksICgndHdvJywgMiksICgndGhyZWUnLCAzKSwgKCdmb3VyJywgNCksICgnZml2ZScsIDUpXQorICAgICAgICBzID0gc2VsZi5kdW1wcyhPcmRlcmVkRGljdChpdGVtcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgJ3sib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDMsICJmb3VyIjogNCwgImZpdmUiOiA1fScpCisKKworY2xhc3MgVGVzdFB5RW5jb2RlQmFzZXN0cmluZ0FzY2lpKFRlc3RFbmNvZGVCYXNlc3RyaW5nQXNjaWksIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDRW5jb2RlQmFzZXN0cmluZ0FzY2lpKFRlc3RFbmNvZGVCYXNlc3RyaW5nQXNjaWksIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9lbmNvZGVfYmFzZXN0cmluZ19hc2NpaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9lbmNvZGVfYmFzZXN0cmluZ19hc2NpaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmFpbC5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMxYjM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHkKQEAgLTAsMCArMSwxMDUgQEAKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisjIDIwMDctMTAtMDUKK0pTT05ET0NTID0gWworICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxLmpzb24KKyAgICAnIkEgSlNPTiBwYXlsb2FkIHNob3VsZCBiZSBhbiBvYmplY3Qgb3IgYXJyYXksIG5vdCBhIHN0cmluZy4iJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMi5qc29uCisgICAgJ1siVW5jbG9zZWQgYXJyYXkiJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMy5qc29uCisgICAgJ3t1bnF1b3RlZF9rZXk6ICJrZXlzIG11c3QgYmUgcXVvdGVkIn0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWw0Lmpzb24KKyAgICAnWyJleHRyYSBjb21tYSIsXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDUuanNvbgorICAgICdbImRvdWJsZSBleHRyYSBjb21tYSIsLF0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWw2Lmpzb24KKyAgICAnWyAgICwgIjwtLSBtaXNzaW5nIHZhbHVlIl0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWw3Lmpzb24KKyAgICAnWyJDb21tYSBhZnRlciB0aGUgY2xvc2UiXSwnLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWw4Lmpzb24KKyAgICAnWyJFeHRyYSBjbG9zZSJdXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDkuanNvbgorICAgICd7IkV4dHJhIGNvbW1hIjogdHJ1ZSx9JywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMTAuanNvbgorICAgICd7IkV4dHJhIHZhbHVlIGFmdGVyIGNsb3NlIjogdHJ1ZX0gIm1pc3BsYWNlZCBxdW90ZWQgdmFsdWUiJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMTEuanNvbgorICAgICd7IklsbGVnYWwgZXhwcmVzc2lvbiI6IDEgKyAyfScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDEyLmpzb24KKyAgICAneyJJbGxlZ2FsIGludm9jYXRpb24iOiBhbGVydCgpfScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDEzLmpzb24KKyAgICAneyJOdW1iZXJzIGNhbm5vdCBoYXZlIGxlYWRpbmcgemVyb2VzIjogMDEzfScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDE0Lmpzb24KKyAgICAneyJOdW1iZXJzIGNhbm5vdCBiZSBoZXgiOiAweDE0fScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDE1Lmpzb24KKyAgICAnWyJJbGxlZ2FsIGJhY2tzbGFzaCBlc2NhcGU6IFxceDE1Il0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxNi5qc29uCisgICAgJ1tcXG5ha2VkXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDE3Lmpzb24KKyAgICAnWyJJbGxlZ2FsIGJhY2tzbGFzaCBlc2NhcGU6IFxcMDE3Il0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwxOC5qc29uCisgICAgJ1tbW1tbW1tbW1tbW1tbW1tbW1tbIlRvbyBkZWVwIl1dXV1dXV1dXV1dXV1dXV1dXV1dJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMTkuanNvbgorICAgICd7Ik1pc3NpbmcgY29sb24iIG51bGx9JywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjAuanNvbgorICAgICd7IkRvdWJsZSBjb2xvbiI6OiBudWxsfScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDIxLmpzb24KKyAgICAneyJDb21tYSBpbnN0ZWFkIG9mIGNvbG9uIiwgbnVsbH0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyMi5qc29uCisgICAgJ1siQ29sb24gaW5zdGVhZCBvZiBjb21tYSI6IGZhbHNlXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDIzLmpzb24KKyAgICAnWyJCYWQgdmFsdWUiLCB0cnV0aF0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyNC5qc29uCisgICAgIlsnc2luZ2xlIHF1b3RlJ10iLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyNS5qc29uCisgICAgJ1siXHR0YWJcdGNoYXJhY3Rlclx0aW5cdHN0cmluZ1x0Il0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwyNi5qc29uCisgICAgJ1sidGFiXFwgICBjaGFyYWN0ZXJcXCAgIGluXFwgIHN0cmluZ1xcICAiXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDI3Lmpzb24KKyAgICAnWyJsaW5lXG5icmVhayJdJywKKyAgICAjIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9mYWlsMjguanNvbgorICAgICdbImxpbmVcXFxuYnJlYWsiXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDI5Lmpzb24KKyAgICAnWzBlXScsCisgICAgIyBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvZmFpbDMwLmpzb24KKyAgICAnWzBlK10nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwzMS5qc29uCisgICAgJ1swZSstMV0nLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwzMi5qc29uCisgICAgJ3siQ29tbWEgaW5zdGVhZCBpZiBjbG9zaW5nIGJyYWNlIjogdHJ1ZSwnLAorICAgICMgaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L2ZhaWwzMy5qc29uCisgICAgJ1sibWlzbWF0Y2gifScsCisgICAgIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3Avc2ltcGxlanNvbi9pc3N1ZXMvZGV0YWlsP2lkPTMKKyAgICB1J1siQVx1MDAxRlogY29udHJvbCBjaGFyYWN0ZXJzIGluIHN0cmluZyJdJywKK10KKworU0tJUFMgPSB7CisgICAgMTogIndoeSBub3QgaGF2ZSBhIHN0cmluZyBwYXlsb2FkPyIsCisgICAgMTg6ICJzcGVjIGRvZXNuJ3Qgc3BlY2lmeSBhbnkgbmVzdGluZyBsaW1pdGF0aW9ucyIsCit9CisKK2NsYXNzIFRlc3RGYWlsKG9iamVjdCk6CisgICAgZGVmIHRlc3RfZmFpbHVyZXMoc2VsZik6CisgICAgICAgIGZvciBpZHgsIGRvYyBpbiBlbnVtZXJhdGUoSlNPTkRPQ1MpOgorICAgICAgICAgICAgaWR4ID0gaWR4ICsgMQorICAgICAgICAgICAgaWYgaWR4IGluIFNLSVBTOgorICAgICAgICAgICAgICAgIHNlbGYubG9hZHMoZG9jKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5sb2Fkcyhkb2MpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgZmFpbHVyZSBmb3IgZmFpbHswfS5qc29uOiB7MSFyfSIuZm9ybWF0KGlkeCwgZG9jKSkKKworICAgIGRlZiB0ZXN0X25vbl9zdHJpbmdfa2V5c19kaWN0KHNlbGYpOgorICAgICAgICBkYXRhID0geydhJyA6IDEsICgxLCAyKSA6IDJ9CisKKyAgICAgICAgI1RoaXMgaXMgZm9yIGMgZW5jb2RlcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZHVtcHMsIGRhdGEpCisKKyAgICAgICAgI1RoaXMgaXMgZm9yIHB5dGhvbiBlbmNvZGVyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kdW1wcywgZGF0YSwgaW5kZW50PVRydWUpCisKKworY2xhc3MgVGVzdFB5RmFpbChUZXN0RmFpbCwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENGYWlsKFRlc3RGYWlsLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmFpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxZTJhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmFpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUxZTJhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2ZhaWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2Zsb2F0LnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfZmxvYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5ZjlhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2Zsb2F0LnB5CkBAIC0wLDAgKzEsMzcgQEAKK2ltcG9ydCBtYXRoCitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCitjbGFzcyBUZXN0RmxvYXQob2JqZWN0KToKKyAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6CisgICAgICAgIGZvciBudW0gaW4gWzE2MTcxNjE3NzEuNzY1MDAwMSwgbWF0aC5waSwgbWF0aC5waSoqMTAwLAorICAgICAgICAgICAgICAgICAgICBtYXRoLnBpKiotMTAwLCAzLjFdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChzZWxmLmR1bXBzKG51bSkpLCBudW0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoc2VsZi5kdW1wcyhudW0pKSwgbnVtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHVuaWNvZGUoc2VsZi5kdW1wcyhudW0pKSksIG51bSkKKworICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6CisgICAgICAgIGZvciBudW0gaW4gWzEsIDFMLCAxPDwzMiwgMTw8NjRdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmR1bXBzKG51bSksIHN0cihudW0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoc2VsZi5kdW1wcyhudW0pKSwgbnVtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMobnVtKSksIG51bSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2Fkcyh1bmljb2RlKHNlbGYuZHVtcHMobnVtKSkpLCBudW0pCisKKyAgICBkZWYgdGVzdF9vdXRfb2ZfcmFuZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygnWzIzNDU2Nzg5MDEyRTY2Nl0nKSwgW2Zsb2F0KCdpbmYnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygnWy0yMzQ1Njc4OTAxMkU2NjZdJyksIFtmbG9hdCgnLWluZicpXSkKKworICAgIGRlZiB0ZXN0X2FsbG93X25hbihzZWxmKToKKyAgICAgICAgZm9yIHZhbCBpbiAoZmxvYXQoJ2luZicpLCBmbG9hdCgnLWluZicpLCBmbG9hdCgnbmFuJykpOgorICAgICAgICAgICAgb3V0ID0gc2VsZi5kdW1wcyhbdmFsXSkKKyAgICAgICAgICAgIGlmIHZhbCA9PSB2YWw6ICAjIGluZgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhvdXQpLCBbdmFsXSkKKyAgICAgICAgICAgIGVsc2U6ICAjIG5hbgorICAgICAgICAgICAgICAgIHJlcyA9IHNlbGYubG9hZHMob3V0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZXNbMF0sIHJlc1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZHVtcHMsIFt2YWxdLCBhbGxvd19uYW49RmFsc2UpCisKKworY2xhc3MgVGVzdFB5RmxvYXQoVGVzdEZsb2F0LCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q0Zsb2F0KFRlc3RGbG9hdCwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1MjhhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2Zsb2F0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9mbG9hdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM1MjhhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2Zsb2F0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxODc2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2luZGVudC5weQpAQCAtMCwwICsxLDYwIEBACitpbXBvcnQgdGV4dHdyYXAKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCitjbGFzcyBUZXN0SW5kZW50KG9iamVjdCk6CisgICAgZGVmIHRlc3RfaW5kZW50KHNlbGYpOgorICAgICAgICBoID0gW1snYmxvcnBpZSddLCBbJ3dob29wcyddLCBbXSwgJ2Qtc2h0YWVvdScsICdkLW50aGlvdWgnLCAnaS12aGJqa2hudGgnLAorICAgICAgICAgICAgIHsnbmlmdHknOiA4N30sIHsnZmllbGQnOiAneWVzJywgJ21vcmVmaWVsZCc6IEZhbHNlfSBdCisKKyAgICAgICAgZXhwZWN0ID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgWworICAgICAgICAgIFsKKyAgICAgICAgICAgICJibG9ycGllIgorICAgICAgICAgIF0sCisgICAgICAgICAgWworICAgICAgICAgICAgIndob29wcyIKKyAgICAgICAgICBdLAorICAgICAgICAgIFtdLAorICAgICAgICAgICJkLXNodGFlb3UiLAorICAgICAgICAgICJkLW50aGlvdWgiLAorICAgICAgICAgICJpLXZoYmpraG50aCIsCisgICAgICAgICAgeworICAgICAgICAgICAgIm5pZnR5IjogODcKKyAgICAgICAgICB9LAorICAgICAgICAgIHsKKyAgICAgICAgICAgICJmaWVsZCI6ICJ5ZXMiLAorICAgICAgICAgICAgIm1vcmVmaWVsZCI6IGZhbHNlCisgICAgICAgICAgfQorICAgICAgICBdIiIiKQorCisKKyAgICAgICAgZDEgPSBzZWxmLmR1bXBzKGgpCisgICAgICAgIGQyID0gc2VsZi5kdW1wcyhoLCBpbmRlbnQ9Miwgc29ydF9rZXlzPVRydWUsIHNlcGFyYXRvcnM9KCcsJywgJzogJykpCisKKyAgICAgICAgaDEgPSBzZWxmLmxvYWRzKGQxKQorICAgICAgICBoMiA9IHNlbGYubG9hZHMoZDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoMSwgaCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoMiwgaCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZXhwZWN0KQorCisgICAgZGVmIHRlc3RfaW5kZW50MChzZWxmKToKKyAgICAgICAgaCA9IHszOiAxfQorICAgICAgICBkZWYgY2hlY2soaW5kZW50LCBleHBlY3RlZCk6CisgICAgICAgICAgICBkMSA9IHNlbGYuZHVtcHMoaCwgaW5kZW50PWluZGVudCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIGV4cGVjdGVkKQorCisgICAgICAgICAgICBzaW8gPSBTdHJpbmdJTygpCisgICAgICAgICAgICBzZWxmLmpzb24uZHVtcChoLCBzaW8sIGluZGVudD1pbmRlbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpby5nZXR2YWx1ZSgpLCBleHBlY3RlZCkKKworICAgICAgICAjIGluZGVudD0wIHNob3VsZCBlbWl0IG5ld2xpbmVzCisgICAgICAgIGNoZWNrKDAsICd7XG4iMyI6IDFcbn0nKQorICAgICAgICAjIGluZGVudD1Ob25lIGlzIG1vcmUgY29tcGFjdAorICAgICAgICBjaGVjayhOb25lLCAneyIzIjogMX0nKQorCisKK2NsYXNzIFRlc3RQeUluZGVudChUZXN0SW5kZW50LCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q0luZGVudChUZXN0SW5kZW50LCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2luZGVudC5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjFhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X2luZGVudC5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NjFhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9pbmRlbnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY4MjU5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MxLnB5CkBAIC0wLDAgKzEsNzUgQEAKK2Zyb20ganNvbi50ZXN0cyBpbXBvcnQgUHlUZXN0LCBDVGVzdAorCisKKyMgZnJvbSBodHRwOi8vanNvbi5vcmcvSlNPTl9jaGVja2VyL3Rlc3QvcGFzczEuanNvbgorSlNPTiA9IHInJycKK1sKKyAgICAiSlNPTiBUZXN0IFBhdHRlcm4gcGFzczEiLAorICAgIHsib2JqZWN0IHdpdGggMSBtZW1iZXIiOlsiYXJyYXkgd2l0aCAxIGVsZW1lbnQiXX0sCisgICAge30sCisgICAgW10sCisgICAgLTQyLAorICAgIHRydWUsCisgICAgZmFsc2UsCisgICAgbnVsbCwKKyAgICB7CisgICAgICAgICJpbnRlZ2VyIjogMTIzNDU2Nzg5MCwKKyAgICAgICAgInJlYWwiOiAtOTg3Ni41NDMyMTAsCisgICAgICAgICJlIjogMC4xMjM0NTY3ODllLTEyLAorICAgICAgICAiRSI6IDEuMjM0NTY3ODkwRSszNCwKKyAgICAgICAgIiI6ICAyMzQ1Njc4OTAxMkU2NiwKKyAgICAgICAgInplcm8iOiAwLAorICAgICAgICAib25lIjogMSwKKyAgICAgICAgInNwYWNlIjogIiAiLAorICAgICAgICAicXVvdGUiOiAiXCIiLAorICAgICAgICAiYmFja3NsYXNoIjogIlxcIiwKKyAgICAgICAgImNvbnRyb2xzIjogIlxiXGZcblxyXHQiLAorICAgICAgICAic2xhc2giOiAiLyAmIFwvIiwKKyAgICAgICAgImFscGhhIjogImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eXoiLAorICAgICAgICAiQUxQSEEiOiAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldZWiIsCisgICAgICAgICJkaWdpdCI6ICIwMTIzNDU2Nzg5IiwKKyAgICAgICAgIjAxMjM0NTY3ODkiOiAiZGlnaXQiLAorICAgICAgICAic3BlY2lhbCI6ICJgMX4hQCMkJV4mKigpXystPXsnOlssXX18Oy48Lz4/IiwKKyAgICAgICAgImhleCI6ICJcdTAxMjNcdTQ1NjdcdTg5QUJcdUNERUZcdWFiY2RcdWVmNEEiLAorICAgICAgICAidHJ1ZSI6IHRydWUsCisgICAgICAgICJmYWxzZSI6IGZhbHNlLAorICAgICAgICAibnVsbCI6IG51bGwsCisgICAgICAgICJhcnJheSI6WyAgXSwKKyAgICAgICAgIm9iamVjdCI6eyAgfSwKKyAgICAgICAgImFkZHJlc3MiOiAiNTAgU3QuIEphbWVzIFN0cmVldCIsCisgICAgICAgICJ1cmwiOiAiaHR0cDovL3d3dy5KU09OLm9yZy8iLAorICAgICAgICAiY29tbWVudCI6ICIvLyAvKiA8IS0tIC0tIiwKKyAgICAgICAgIiMgLS0gLS0+ICovIjogIiAiLAorICAgICAgICAiIHMgcCBhIGMgZSBkICIgOlsxLDIgLCAzCisKKywKKworNCAsIDUgICAgICAgICwgICAgICAgICAgNiAgICAgICAgICAgLDcgICAgICAgIF0sImNvbXBhY3QiOlsxLDIsMyw0LDUsNiw3XSwKKyAgICAgICAgImpzb250ZXh0IjogIntcIm9iamVjdCB3aXRoIDEgbWVtYmVyXCI6W1wiYXJyYXkgd2l0aCAxIGVsZW1lbnRcIl19IiwKKyAgICAgICAgInF1b3RlcyI6ICImIzM0OyBcdTAwMjIgJTIyIDB4MjIgMDM0ICYjeDIyOyIsCisgICAgICAgICJcL1xcXCJcdUNBRkVcdUJBQkVcdUFCOThcdUZDREVcdWJjZGFcdWVmNEFcYlxmXG5cclx0YDF+IUAjJCVeJiooKV8rLT1bXXt9fDs6JywuLzw+PyIKKzogIkEga2V5IGNhbiBiZSBhbnkgc3RyaW5nIgorICAgIH0sCisgICAgMC41ICw5OC42CissCis5OS40NAorLAorCisxMDY2LAorMWUxLAorMC4xZTEsCisxZS0xLAorMWUwMCwyZSswMCwyZS0wMAorLCJyb3NlYnVkIl0KKycnJworCitjbGFzcyBUZXN0UGFzczEob2JqZWN0KToKKyAgICBkZWYgdGVzdF9wYXJzZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IGluL291dCBlcXVpdmFsZW5jZSBhbmQgcGFyc2luZworICAgICAgICByZXMgPSBzZWxmLmxvYWRzKEpTT04pCisgICAgICAgIG91dCA9IHNlbGYuZHVtcHMocmVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgc2VsZi5sb2FkcyhvdXQpKQorCisKK2NsYXNzIFRlc3RQeVBhc3MxKFRlc3RQYXNzMSwgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENQYXNzMShUZXN0UGFzczEsIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjk5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjk5NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczIucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmJiNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczIucHkKQEAgLTAsMCArMSwxOCBAQAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworIyBmcm9tIGh0dHA6Ly9qc29uLm9yZy9KU09OX2NoZWNrZXIvdGVzdC9wYXNzMi5qc29uCitKU09OID0gcicnJworW1tbW1tbW1tbW1tbW1tbW1tbWyJOb3QgdG9vIGRlZXAiXV1dXV1dXV1dXV1dXV1dXV1dXQorJycnCisKK2NsYXNzIFRlc3RQYXNzMihvYmplY3QpOgorICAgIGRlZiB0ZXN0X3BhcnNlKHNlbGYpOgorICAgICAgICAjIHRlc3QgaW4vb3V0IGVxdWl2YWxlbmNlIGFuZCBwYXJzaW5nCisgICAgICAgIHJlcyA9IHNlbGYubG9hZHMoSlNPTikKKyAgICAgICAgb3V0ID0gc2VsZi5kdW1wcyhyZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzZWxmLmxvYWRzKG91dCkpCisKKworY2xhc3MgVGVzdFB5UGFzczIoVGVzdFBhc3MyLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q1Bhc3MyKFRlc3RQYXNzMiwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMi5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwOTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMi5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwOTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMy5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMWY5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9wYXNzMy5weQpAQCAtMCwwICsxLDI0IEBACitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCisjIGZyb20gaHR0cDovL2pzb24ub3JnL0pTT05fY2hlY2tlci90ZXN0L3Bhc3MzLmpzb24KK0pTT04gPSByJycnCit7CisgICAgIkpTT04gVGVzdCBQYXR0ZXJuIHBhc3MzIjogeworICAgICAgICAiVGhlIG91dGVybW9zdCB2YWx1ZSI6ICJtdXN0IGJlIGFuIG9iamVjdCBvciBhcnJheS4iLAorICAgICAgICAiSW4gdGhpcyB0ZXN0IjogIkl0IGlzIGFuIG9iamVjdC4iCisgICAgfQorfQorJycnCisKKworY2xhc3MgVGVzdFBhc3MzKG9iamVjdCk6CisgICAgZGVmIHRlc3RfcGFyc2Uoc2VsZik6CisgICAgICAgICMgdGVzdCBpbi9vdXQgZXF1aXZhbGVuY2UgYW5kIHBhcnNpbmcKKyAgICAgICAgcmVzID0gc2VsZi5sb2FkcyhKU09OKQorICAgICAgICBvdXQgPSBzZWxmLmR1bXBzKHJlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYubG9hZHMob3V0KSkKKworCitjbGFzcyBUZXN0UHlQYXNzMyhUZXN0UGFzczMsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDUGFzczMoVGVzdFBhc3MzLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MzLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU4Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MzLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Bhc3MzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjU4Zjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcGFzczMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3JlY3Vyc2lvbi5weSBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3JlY3Vyc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTIyMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfcmVjdXJzaW9uLnB5CkBAIC0wLDAgKzEsMTA4IEBACitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCitjbGFzcyBKU09OVGVzdE9iamVjdDoKKyAgICBwYXNzCisKKworY2xhc3MgVGVzdFJlY3Vyc2lvbihvYmplY3QpOgorICAgIGRlZiB0ZXN0X2xpc3RyZWN1cnNpb24oc2VsZik6CisgICAgICAgIHggPSBbXQorICAgICAgICB4LmFwcGVuZCh4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmR1bXBzKHgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciBvbiBsaXN0IHJlY3Vyc2lvbiIpCisgICAgICAgIHggPSBbXQorICAgICAgICB5ID0gW3hdCisgICAgICAgIHguYXBwZW5kKHkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZHVtcHMoeCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZG4ndCByYWlzZSBWYWx1ZUVycm9yIG9uIGFsdGVybmF0aW5nIGxpc3QgcmVjdXJzaW9uIikKKyAgICAgICAgeSA9IFtdCisgICAgICAgIHggPSBbeSwgeV0KKyAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgbWFya2VyIGlzIGNsZWFyZWQKKyAgICAgICAgc2VsZi5kdW1wcyh4KQorCisgICAgZGVmIHRlc3RfZGljdHJlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgeCA9IHt9CisgICAgICAgIHhbInRlc3QiXSA9IHgKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kdW1wcyh4KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IHJhaXNlIFZhbHVlRXJyb3Igb24gZGljdCByZWN1cnNpb24iKQorICAgICAgICB4ID0ge30KKyAgICAgICAgeSA9IHsiYSI6IHgsICJiIjogeH0KKyAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgbWFya2VyIGlzIGNsZWFyZWQKKyAgICAgICAgc2VsZi5kdW1wcyh4KQorCisgICAgZGVmIHRlc3RfZGVmYXVsdHJlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgY2xhc3MgUmVjdXJzaXZlSlNPTkVuY29kZXIoc2VsZi5qc29uLkpTT05FbmNvZGVyKToKKyAgICAgICAgICAgIHJlY3Vyc2UgPSBGYWxzZQorICAgICAgICAgICAgZGVmIGRlZmF1bHQoc2VsZiwgbyk6CisgICAgICAgICAgICAgICAgaWYgbyBpcyBKU09OVGVzdE9iamVjdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5yZWN1cnNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtKU09OVGVzdE9iamVjdF0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnSlNPTlRlc3RPYmplY3QnCisgICAgICAgICAgICAgICAgcmV0dXJuIHB5anNvbi5KU09ORW5jb2Rlci5kZWZhdWx0KG8pCisKKyAgICAgICAgZW5jID0gUmVjdXJzaXZlSlNPTkVuY29kZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuYy5lbmNvZGUoSlNPTlRlc3RPYmplY3QpLCAnIkpTT05UZXN0T2JqZWN0IicpCisgICAgICAgIGVuYy5yZWN1cnNlID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbmMuZW5jb2RlKEpTT05UZXN0T2JqZWN0KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IHJhaXNlIFZhbHVlRXJyb3Igb24gZGVmYXVsdCByZWN1cnNpb24iKQorCisKKyAgICBkZWYgdGVzdF9oaWdobHlfbmVzdGVkX29iamVjdHNfZGVjb2Rpbmcoc2VsZik6CisgICAgICAgICMgdGVzdCB0aGF0IGxvYWRpbmcgaGlnaGx5LW5lc3RlZCBvYmplY3RzIGRvZXNuJ3Qgc2VnZmF1bHQgd2hlbiBDCisgICAgICAgICMgYWNjZWxlcmF0aW9ucyBhcmUgdXNlZC4gU2VlICMxMjAxNworICAgICAgICAjIHN0cgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmxvYWRzKCd7ImEiOicgKiAxMDAwMDAgKyAnMScgKyAnfScgKiAxMDAwMDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYubG9hZHMoJ3siYSI6JyAqIDEwMDAwMCArICdbMV0nICsgJ30nICogMTAwMDAwKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmxvYWRzKCdbJyAqIDEwMDAwMCArICcxJyArICddJyAqIDEwMDAwMCkKKyAgICAgICAgIyB1bmljb2RlCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYubG9hZHModSd7ImEiOicgKiAxMDAwMDAgKyB1JzEnICsgdSd9JyAqIDEwMDAwMCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5sb2Fkcyh1J3siYSI6JyAqIDEwMDAwMCArIHUnWzFdJyArIHUnfScgKiAxMDAwMDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYubG9hZHModSdbJyAqIDEwMDAwMCArIHUnMScgKyB1J10nICogMTAwMDAwKQorCisgICAgZGVmIHRlc3RfaGlnaGx5X25lc3RlZF9vYmplY3RzX2VuY29kaW5nKHNlbGYpOgorICAgICAgICAjIFNlZSAjMTIwNTEKKyAgICAgICAgbCwgZCA9IFtdLCB7fQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoMTAwMDAwKToKKyAgICAgICAgICAgIGwsIGQgPSBbbF0sIHsnayc6ZH0KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5kdW1wcyhsKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmR1bXBzKGQpCisKKyAgICBkZWYgdGVzdF9lbmRsZXNzX3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgIyBTZWUgIzEyMDUxCisgICAgICAgIGNsYXNzIEVuZGxlc3NKU09ORW5jb2RlcihzZWxmLmpzb24uSlNPTkVuY29kZXIpOgorICAgICAgICAgICAgZGVmIGRlZmF1bHQoc2VsZiwgbyk6CisgICAgICAgICAgICAgICAgIiIiSWYgY2hlY2tfY2lyY3VsYXIgaXMgRmFsc2UsIHRoaXMgd2lsbCBrZWVwIGFkZGluZyBhbm90aGVyIGxpc3QuIiIiCisgICAgICAgICAgICAgICAgcmV0dXJuIFtvXQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKKyAgICAgICAgICAgIEVuZGxlc3NKU09ORW5jb2RlcihjaGVja19jaXJjdWxhcj1GYWxzZSkuZW5jb2RlKDVqKQorCisKK2NsYXNzIFRlc3RQeVJlY3Vyc2lvbihUZXN0UmVjdXJzaW9uLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q1JlY3Vyc2lvbihUZXN0UmVjdXJzaW9uLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3JlY3Vyc2lvbi5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjViZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3JlY3Vyc2lvbi5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMjViZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9yZWN1cnNpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZWY4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zY2Fuc3RyaW5nLnB5CkBAIC0wLDAgKzEsMTA5IEBACitpbXBvcnQgc3lzCitmcm9tIGpzb24udGVzdHMgaW1wb3J0IFB5VGVzdCwgQ1Rlc3QKKworCitjbGFzcyBUZXN0U2NhbnN0cmluZyhvYmplY3QpOgorICAgIGRlZiB0ZXN0X3NjYW5zdHJpbmcoc2VsZik6CisgICAgICAgIHNjYW5zdHJpbmcgPSBzZWxmLmpzb24uZGVjb2Rlci5zY2Fuc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCcielxcdWQ4MzRcXHVkZDIweCInLCAxLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J3pcVTAwMDFkMTIweCcsIDE2KSkKKworICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA9PSA2NTUzNToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgc2NhbnN0cmluZyh1JyJ6XFUwMDAxZDEyMHgiJywgMSwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAgICAgKHUnelxVMDAwMWQxMjB4JywgNikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIHNjYW5zdHJpbmcodScielxVMDAwMWQxMjB4IicsIDEsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgICAgICh1J3pcVTAwMDFkMTIweCcsIDUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCciXFx1MDA3YiInLCAxLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J3snLCA4KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnIkEgSlNPTiBwYXlsb2FkIHNob3VsZCBiZSBhbiBvYmplY3Qgb3IgYXJyYXksIG5vdCBhIHN0cmluZy4iJywgMSwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdBIEpTT04gcGF5bG9hZCBzaG91bGQgYmUgYW4gb2JqZWN0IG9yIGFycmF5LCBub3QgYSBzdHJpbmcuJywgNjApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCdbIlVuY2xvc2VkIGFycmF5IicsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnVW5jbG9zZWQgYXJyYXknLCAxNykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ1siZXh0cmEgY29tbWEiLF0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J2V4dHJhIGNvbW1hJywgMTQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCdbImRvdWJsZSBleHRyYSBjb21tYSIsLF0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J2RvdWJsZSBleHRyYSBjb21tYScsIDIxKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnWyJDb21tYSBhZnRlciB0aGUgY2xvc2UiXSwnLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J0NvbW1hIGFmdGVyIHRoZSBjbG9zZScsIDI0KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygnWyJFeHRyYSBjbG9zZSJdXScsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnRXh0cmEgY2xvc2UnLCAxNCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ3siRXh0cmEgY29tbWEiOiB0cnVlLH0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J0V4dHJhIGNvbW1hJywgMTQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCd7IkV4dHJhIHZhbHVlIGFmdGVyIGNsb3NlIjogdHJ1ZX0gIm1pc3BsYWNlZCBxdW90ZWQgdmFsdWUiJywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdFeHRyYSB2YWx1ZSBhZnRlciBjbG9zZScsIDI2KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygneyJJbGxlZ2FsIGV4cHJlc3Npb24iOiAxICsgMn0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J0lsbGVnYWwgZXhwcmVzc2lvbicsIDIxKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2NhbnN0cmluZygneyJJbGxlZ2FsIGludm9jYXRpb24iOiBhbGVydCgpfScsIDIsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnSWxsZWdhbCBpbnZvY2F0aW9uJywgMjEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCd7Ik51bWJlcnMgY2Fubm90IGhhdmUgbGVhZGluZyB6ZXJvZXMiOiAwMTN9JywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdOdW1iZXJzIGNhbm5vdCBoYXZlIGxlYWRpbmcgemVyb2VzJywgMzcpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCd7Ik51bWJlcnMgY2Fubm90IGJlIGhleCI6IDB4MTR9JywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdOdW1iZXJzIGNhbm5vdCBiZSBoZXgnLCAyNCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ1tbW1tbW1tbW1tbW1tbW1tbW1tbIlRvbyBkZWVwIl1dXV1dXV1dXV1dXV1dXV1dXV1dJywgMjEsIE5vbmUsIFRydWUpLAorICAgICAgICAgICAgKHUnVG9vIGRlZXAnLCAzMCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ3siTWlzc2luZyBjb2xvbiIgbnVsbH0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J01pc3NpbmcgY29sb24nLCAxNikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ3siRG91YmxlIGNvbG9uIjo6IG51bGx9JywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdEb3VibGUgY29sb24nLCAxNSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ3siQ29tbWEgaW5zdGVhZCBvZiBjb2xvbiIsIG51bGx9JywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdDb21tYSBpbnN0ZWFkIG9mIGNvbG9uJywgMjUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzY2Fuc3RyaW5nKCdbIkNvbG9uIGluc3RlYWQgb2YgY29tbWEiOiBmYWxzZV0nLCAyLCBOb25lLCBUcnVlKSwKKyAgICAgICAgICAgICh1J0NvbG9uIGluc3RlYWQgb2YgY29tbWEnLCAyNSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNjYW5zdHJpbmcoJ1siQmFkIHZhbHVlIiwgdHJ1dGhdJywgMiwgTm9uZSwgVHJ1ZSksCisgICAgICAgICAgICAodSdCYWQgdmFsdWUnLCAxMikpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTM2MjMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuanNvbi5kZWNvZGVyLnNjYW5zdHJpbmcsIGIieHh4IiwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInh4eCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5qc29uLmVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWksIGIieHhceGZmIikKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgc2VsZi5qc29uLmRlY29kZXIuc2NhbnN0cmluZyhiInh4eCIsIHN5cy5tYXhzaXplKzEpCisKKworY2xhc3MgVGVzdFB5U2NhbnN0cmluZyhUZXN0U2NhbnN0cmluZywgUHlUZXN0KTogcGFzcworY2xhc3MgVGVzdENTY2Fuc3RyaW5nKFRlc3RTY2Fuc3RyaW5nLCBDVGVzdCk6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHljIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2NhbnN0cmluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjMmNjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHlvIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2NhbnN0cmluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJjMmNjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NjYW5zdHJpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NlcGFyYXRvcnMucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zZXBhcmF0b3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjQ2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zZXBhcmF0b3JzLnB5CkBAIC0wLDAgKzEsNDQgQEAKK2ltcG9ydCB0ZXh0d3JhcAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgVGVzdFNlcGFyYXRvcnMob2JqZWN0KToKKyAgICBkZWYgdGVzdF9zZXBhcmF0b3JzKHNlbGYpOgorICAgICAgICBoID0gW1snYmxvcnBpZSddLCBbJ3dob29wcyddLCBbXSwgJ2Qtc2h0YWVvdScsICdkLW50aGlvdWgnLCAnaS12aGJqa2hudGgnLAorICAgICAgICAgICAgIHsnbmlmdHknOiA4N30sIHsnZmllbGQnOiAneWVzJywgJ21vcmVmaWVsZCc6IEZhbHNlfSBdCisKKyAgICAgICAgZXhwZWN0ID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgWworICAgICAgICAgIFsKKyAgICAgICAgICAgICJibG9ycGllIgorICAgICAgICAgIF0gLAorICAgICAgICAgIFsKKyAgICAgICAgICAgICJ3aG9vcHMiCisgICAgICAgICAgXSAsCisgICAgICAgICAgW10gLAorICAgICAgICAgICJkLXNodGFlb3UiICwKKyAgICAgICAgICAiZC1udGhpb3VoIiAsCisgICAgICAgICAgImktdmhiamtobnRoIiAsCisgICAgICAgICAgeworICAgICAgICAgICAgIm5pZnR5IiA6IDg3CisgICAgICAgICAgfSAsCisgICAgICAgICAgeworICAgICAgICAgICAgImZpZWxkIiA6ICJ5ZXMiICwKKyAgICAgICAgICAgICJtb3JlZmllbGQiIDogZmFsc2UKKyAgICAgICAgICB9CisgICAgICAgIF0iIiIpCisKKworICAgICAgICBkMSA9IHNlbGYuZHVtcHMoaCkKKyAgICAgICAgZDIgPSBzZWxmLmR1bXBzKGgsIGluZGVudD0yLCBzb3J0X2tleXM9VHJ1ZSwgc2VwYXJhdG9ycz0oJyAsJywgJyA6ICcpKQorCisgICAgICAgIGgxID0gc2VsZi5sb2FkcyhkMSkKKyAgICAgICAgaDIgPSBzZWxmLmxvYWRzKGQyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDEsIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDIsIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGV4cGVjdCkKKworCitjbGFzcyBUZXN0UHlTZXBhcmF0b3JzKFRlc3RTZXBhcmF0b3JzLCBQeVRlc3QpOiBwYXNzCitjbGFzcyBUZXN0Q1NlcGFyYXRvcnMoVGVzdFNlcGFyYXRvcnMsIENUZXN0KTogcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zZXBhcmF0b3JzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBkYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zZXBhcmF0b3JzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjBkYzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc2VwYXJhdG9ycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHkgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTg2YTQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHkKQEAgLTAsMCArMSwyMyBAQAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBDVGVzdAorCisKK2NsYXNzIFRlc3RTcGVlZHVwcyhDVGVzdCk6CisgICAgZGVmIHRlc3Rfc2NhbnN0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmpzb24uZGVjb2Rlci5zY2Fuc3RyaW5nLl9fbW9kdWxlX18sICJfanNvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5qc29uLmRlY29kZXIuc2NhbnN0cmluZywgc2VsZi5qc29uLmRlY29kZXIuY19zY2Fuc3RyaW5nKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5qc29uLmVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkuX19tb2R1bGVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX2pzb24iKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuanNvbi5lbmNvZGVyLmVuY29kZV9iYXNlc3RyaW5nX2FzY2lpLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuanNvbi5lbmNvZGVyLmNfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkpCisKK2NsYXNzIFRlc3REZWNvZGUoQ1Rlc3QpOgorICAgIGRlZiB0ZXN0X21ha2Vfc2Nhbm5lcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNlbGYuanNvbi5zY2FubmVyLmNfbWFrZV9zY2FubmVyLCAxKQorCisgICAgZGVmIHRlc3RfbWFrZV9lbmNvZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuanNvbi5lbmNvZGVyLmNfbWFrZV9lbmNvZGVyLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICJceENEXHg3RFx4M0RceDRFXHgxMlx4NENceEY5XHg3OVx4RDdceDUyXHhCQVx4ODJceEYyXHgyN1x4NEFceDdEXHhBMFx4Q0FceDc1IiwKKyAgICAgICAgICAgIE5vbmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weWMgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3ZjRhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weW8gYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ3ZjRhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF90b29sLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2RmYjg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdG9vbC5weQpAQCAtMCwwICsxLDY5IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3VicHJvY2VzcworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rCisKK2NsYXNzIFRlc3RUb29sKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkYXRhID0gIiIiCisKKyAgICAgICAgW1siYmxvcnBpZSJdLFsgIndob29wcyIgXSAsIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXHQiZC1zaHRhZW91IixcciJkLW50aGlvdWgiLAorICAgICAgICAiaS12aGJqa2hudGgiLCB7Im5pZnR5Ijo4N30sIHsibW9yZWZpZWxkIiA6XHRmYWxzZSwiZmllbGQiCisgICAgICAgICAgICA6InllcyJ9ICBdCisgICAgICAgICAgICIiIgorCisgICAgZXhwZWN0ID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICBbCisgICAgICAgIFsKKyAgICAgICAgICAgICJibG9ycGllIgorICAgICAgICBdLAorICAgICAgICBbCisgICAgICAgICAgICAid2hvb3BzIgorICAgICAgICBdLAorICAgICAgICBbXSwKKyAgICAgICAgImQtc2h0YWVvdSIsCisgICAgICAgICJkLW50aGlvdWgiLAorICAgICAgICAiaS12aGJqa2hudGgiLAorICAgICAgICB7CisgICAgICAgICAgICAibmlmdHkiOiA4NworICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgICAiZmllbGQiOiAieWVzIiwKKyAgICAgICAgICAgICJtb3JlZmllbGQiOiBmYWxzZQorICAgICAgICB9CisgICAgXQorICAgICIiIikKKworICAgIGRlZiB0ZXN0X3N0ZGluX3N0ZG91dChzZWxmKToKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oCisgICAgICAgICAgICAgICAgKHN5cy5leGVjdXRhYmxlLCAnLW0nLCAnanNvbi50b29sJyksCisgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBvdXQsIGVyciA9IHByb2MuY29tbXVuaWNhdGUoc2VsZi5kYXRhLmVuY29kZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zcGxpdGxpbmVzKCksIHNlbGYuZXhwZWN0LmVuY29kZSgpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIE5vbmUpCisKKyAgICBkZWYgX2NyZWF0ZV9pbmZpbGUoc2VsZik6CisgICAgICAgIGluZmlsZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgd2l0aCBvcGVuKGluZmlsZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIGluZmlsZSkKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKyAgICAgICAgcmV0dXJuIGluZmlsZQorCisgICAgZGVmIHRlc3RfaW5maWxlX3N0ZG91dChzZWxmKToKKyAgICAgICAgaW5maWxlID0gc2VsZi5fY3JlYXRlX2luZmlsZSgpCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soJy1tJywgJ2pzb24udG9vbCcsIGluZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuc3BsaXRsaW5lcygpLCBzZWxmLmV4cGVjdC5lbmNvZGUoKS5zcGxpdGxpbmVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCisKKyAgICBkZWYgdGVzdF9pbmZpbGVfb3V0ZmlsZShzZWxmKToKKyAgICAgICAgaW5maWxlID0gc2VsZi5fY3JlYXRlX2luZmlsZSgpCisgICAgICAgIG91dGZpbGUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgJy5vdXQnCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soJy1tJywgJ2pzb24udG9vbCcsIGluZmlsZSwgb3V0ZmlsZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgb3V0ZmlsZSkKKyAgICAgICAgd2l0aCBvcGVuKG91dGZpbGUsICJyIikgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWQoKSwgc2VsZi5leHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF90b29sLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Rvb2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDY3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF90b29sLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF90b29sLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3Rvb2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDY3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF90b29sLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5IGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTBmMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rlc3RzL3Rlc3RfdW5pY29kZS5weQpAQCAtMCwwICsxLDg5IEBACitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorZnJvbSBqc29uLnRlc3RzIGltcG9ydCBQeVRlc3QsIENUZXN0CisKKworY2xhc3MgVGVzdFVuaWNvZGUob2JqZWN0KToKKyAgICBkZWYgdGVzdF9lbmNvZGluZzEoc2VsZik6CisgICAgICAgIGVuY29kZXIgPSBzZWxmLmpzb24uSlNPTkVuY29kZXIoZW5jb2Rpbmc9J3V0Zi04JykKKyAgICAgICAgdSA9IHUnXE57R1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBfVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBfScKKyAgICAgICAgcyA9IHUuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGp1ID0gZW5jb2Rlci5lbmNvZGUodSkKKyAgICAgICAganMgPSBlbmNvZGVyLmVuY29kZShzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGp1LCBqcykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nMihzZWxmKToKKyAgICAgICAgdSA9IHUnXE57R1JFRUsgU01BTEwgTEVUVEVSIEFMUEhBfVxOe0dSRUVLIENBUElUQUwgTEVUVEVSIE9NRUdBfScKKyAgICAgICAgcyA9IHUuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIGp1ID0gc2VsZi5kdW1wcyh1LCBlbmNvZGluZz0ndXRmLTgnKQorICAgICAgICBqcyA9IHNlbGYuZHVtcHMocywgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqdSwganMpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZzMoc2VsZik6CisgICAgICAgIHUgPSB1J1xOe0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQX1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQX0nCisgICAgICAgIGogPSBzZWxmLmR1bXBzKHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaiwgJyJcXHUwM2IxXFx1MDNhOSInKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmc0KHNlbGYpOgorICAgICAgICB1ID0gdSdcTntHUkVFSyBTTUFMTCBMRVRURVIgQUxQSEF9XE57R1JFRUsgQ0FQSVRBTCBMRVRURVIgT01FR0F9JworICAgICAgICBqID0gc2VsZi5kdW1wcyhbdV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaiwgJ1siXFx1MDNiMVxcdTAzYTkiXScpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZzUoc2VsZik6CisgICAgICAgIHUgPSB1J1xOe0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQX1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQX0nCisgICAgICAgIGogPSBzZWxmLmR1bXBzKHUsIGVuc3VyZV9hc2NpaT1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqLCB1JyJ7MH0iJy5mb3JtYXQodSkpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZzYoc2VsZik6CisgICAgICAgIHUgPSB1J1xOe0dSRUVLIFNNQUxMIExFVFRFUiBBTFBIQX1cTntHUkVFSyBDQVBJVEFMIExFVFRFUiBPTUVHQX0nCisgICAgICAgIGogPSBzZWxmLmR1bXBzKFt1XSwgZW5zdXJlX2FzY2lpPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGosIHUnWyJ7MH0iXScuZm9ybWF0KHUpKQorCisgICAgZGVmIHRlc3RfYmlnX3VuaWNvZGVfZW5jb2RlKHNlbGYpOgorICAgICAgICB1ID0gdSdcVTAwMDFkMTIwJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZHVtcHModSksICciXFx1ZDgzNFxcdWRkMjAiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmR1bXBzKHUsIGVuc3VyZV9hc2NpaT1GYWxzZSksIHUnIlxVMDAwMWQxMjAiJykKKworICAgIGRlZiB0ZXN0X2JpZ191bmljb2RlX2RlY29kZShzZWxmKToKKyAgICAgICAgdSA9IHUnelxVMDAwMWQxMjB4JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMoJyInICsgdSArICciJyksIHUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcygnInpcXHVkODM0XFx1ZGQyMHgiJyksIHUpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2RlY29kZShzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgMHhkN2ZmKToKKyAgICAgICAgICAgIHUgPSB1bmljaHIoaSkKKyAgICAgICAgICAgIHMgPSAnIlxcdXswOjA0eH0iJy5mb3JtYXQoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzKSwgdSkKKworICAgIGRlZiB0ZXN0X29iamVjdF9wYWlyc19ob29rX3dpdGhfdW5pY29kZShzZWxmKToKKyAgICAgICAgcyA9IHUneyJ4a2QiOjEsICJrY3ciOjIsICJhcnQiOjMsICJoeG0iOjQsICJxcnQiOjUsICJwYWQiOjYsICJob3kiOjd9JworICAgICAgICBwID0gWyh1InhrZCIsIDEpLCAodSJrY3ciLCAyKSwgKHUiYXJ0IiwgMyksICh1Imh4bSIsIDQpLAorICAgICAgICAgICAgICh1InFydCIsIDUpLCAodSJwYWQiLCA2KSwgKHUiaG95IiwgNyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkcyhzKSwgZXZhbChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHMsIG9iamVjdF9wYWlyc19ob29rID0gbGFtYmRhIHg6IHgpLCBwKQorICAgICAgICBvZCA9IHNlbGYubG9hZHMocywgb2JqZWN0X3BhaXJzX2hvb2sgPSBPcmRlcmVkRGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZCwgT3JkZXJlZERpY3QocCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShvZCksIE9yZGVyZWREaWN0KQorICAgICAgICAjIHRoZSBvYmplY3RfcGFpcnNfaG9vayB0YWtlcyBwcmlvcml0eSBvdmVyIHRoZSBvYmplY3RfaG9vaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubG9hZHMocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9wYWlyc19ob29rID0gT3JkZXJlZERpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RfaG9vayA9IGxhbWJkYSB4OiBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmVkRGljdChwKSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2Fkcyh1J3siYSI6ICJceGU5In0nLmVuY29kZSgndXRmLTgnKSksCisgICAgICAgICAgICB7J2EnOiB1J1x4ZTknfSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc2VsZi5sb2Fkcyh1JyIiJykpLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc2VsZi5sb2Fkcyh1JyJhIicpKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNlbGYubG9hZHModSdbImEiXScpWzBdKSwgdW5pY29kZSkKKyAgICAgICAgIyBJc3N1ZSAxMDAzOC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNlbGYubG9hZHMoJyJmb28iJykpLCB1bmljb2RlKQorCisgICAgZGVmIHRlc3RfYmFkX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHNlbGYubG9hZHMsICciYSInLCB1InJhdFx4ZTkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubG9hZHMsICciYSInLCAxKQorCisKK2NsYXNzIFRlc3RQeVVuaWNvZGUoVGVzdFVuaWNvZGUsIFB5VGVzdCk6IHBhc3MKK2NsYXNzIFRlc3RDVW5pY29kZShUZXN0VW5pY29kZSwgQ1Rlc3QpOiBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3VuaWNvZGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YThiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90ZXN0cy90ZXN0X3VuaWNvZGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YThiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdGVzdHMvdGVzdF91bmljb2RlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2pzb24vdG9vbC5weSBiL2xpYi9weXRob24yLjcvanNvbi90b29sLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNWQ3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2pzb24vdG9vbC5weQpAQCAtMCwwICsxLDQwIEBACityIiIiQ29tbWFuZC1saW5lIHRvb2wgdG8gdmFsaWRhdGUgYW5kIHByZXR0eS1wcmludCBKU09OCisKK1VzYWdlOjoKKworICAgICQgZWNobyAneyJqc29uIjoib2JqIn0nIHwgcHl0aG9uIC1tIGpzb24udG9vbAorICAgIHsKKyAgICAgICAgImpzb24iOiAib2JqIgorICAgIH0KKyAgICAkIGVjaG8gJ3sgMS4yOjMuNH0nIHwgcHl0aG9uIC1tIGpzb24udG9vbAorICAgIEV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXM6IGxpbmUgMSBjb2x1bW4gMyAoY2hhciAyKQorCisiIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCBqc29uCisKK2RlZiBtYWluKCk6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA9PSAxOgorICAgICAgICBpbmZpbGUgPSBzeXMuc3RkaW4KKyAgICAgICAgb3V0ZmlsZSA9IHN5cy5zdGRvdXQKKyAgICBlbGlmIGxlbihzeXMuYXJndikgPT0gMjoKKyAgICAgICAgaW5maWxlID0gb3BlbihzeXMuYXJndlsxXSwgJ3JiJykKKyAgICAgICAgb3V0ZmlsZSA9IHN5cy5zdGRvdXQKKyAgICBlbGlmIGxlbihzeXMuYXJndikgPT0gMzoKKyAgICAgICAgaW5maWxlID0gb3BlbihzeXMuYXJndlsxXSwgJ3JiJykKKyAgICAgICAgb3V0ZmlsZSA9IG9wZW4oc3lzLmFyZ3ZbMl0sICd3YicpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgU3lzdGVtRXhpdChzeXMuYXJndlswXSArICIgW2luZmlsZSBbb3V0ZmlsZV1dIikKKyAgICB3aXRoIGluZmlsZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqID0ganNvbi5sb2FkKGluZmlsZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0KGUpCisgICAgd2l0aCBvdXRmaWxlOgorICAgICAgICBqc29uLmR1bXAob2JqLCBvdXRmaWxlLCBzb3J0X2tleXM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgIGluZGVudD00LCBzZXBhcmF0b3JzPSgnLCcsICc6ICcpKQorICAgICAgICBvdXRmaWxlLndyaXRlKCdcbicpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90b29sLnB5YyBiL2xpYi9weXRob24yLjcvanNvbi90b29sLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU5MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rvb2wucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvanNvbi90b29sLnB5byBiL2xpYi9weXRob24yLjcvanNvbi90b29sLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU5MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9qc29uL3Rvb2wucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcva2V5d29yZC5weSBiL2xpYi9weXRob24yLjcva2V5d29yZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OTc5NGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9rZXl3b3JkLnB5CkBAIC0wLDAgKzEsOTMgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiS2V5d29yZHMgKGZyb20gImdyYW1pbml0LmMiKQorCitUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQ7IHBsZWFzZSBkb24ndCBtdWNrIGl0IHVwIQorCitUbyB1cGRhdGUgdGhlIHN5bWJvbHMgaW4gdGhpcyBmaWxlLCAnY2QnIHRvIHRoZSB0b3AgZGlyZWN0b3J5IG9mCit0aGUgcHl0aG9uIHNvdXJjZSB0cmVlIGFmdGVyIGJ1aWxkaW5nIHRoZSBpbnRlcnByZXRlciBhbmQgcnVuOgorCisgICAgLi9weXRob24gTGliL2tleXdvcmQucHkKKyIiIgorCitfX2FsbF9fID0gWyJpc2tleXdvcmQiLCAia3dsaXN0Il0KKwora3dsaXN0ID0gWworIy0tc3RhcnQga2V5d29yZHMtLQorICAgICAgICAnYW5kJywKKyAgICAgICAgJ2FzJywKKyAgICAgICAgJ2Fzc2VydCcsCisgICAgICAgICdicmVhaycsCisgICAgICAgICdjbGFzcycsCisgICAgICAgICdjb250aW51ZScsCisgICAgICAgICdkZWYnLAorICAgICAgICAnZGVsJywKKyAgICAgICAgJ2VsaWYnLAorICAgICAgICAnZWxzZScsCisgICAgICAgICdleGNlcHQnLAorICAgICAgICAnZXhlYycsCisgICAgICAgICdmaW5hbGx5JywKKyAgICAgICAgJ2ZvcicsCisgICAgICAgICdmcm9tJywKKyAgICAgICAgJ2dsb2JhbCcsCisgICAgICAgICdpZicsCisgICAgICAgICdpbXBvcnQnLAorICAgICAgICAnaW4nLAorICAgICAgICAnaXMnLAorICAgICAgICAnbGFtYmRhJywKKyAgICAgICAgJ25vdCcsCisgICAgICAgICdvcicsCisgICAgICAgICdwYXNzJywKKyAgICAgICAgJ3ByaW50JywKKyAgICAgICAgJ3JhaXNlJywKKyAgICAgICAgJ3JldHVybicsCisgICAgICAgICd0cnknLAorICAgICAgICAnd2hpbGUnLAorICAgICAgICAnd2l0aCcsCisgICAgICAgICd5aWVsZCcsCisjLS1lbmQga2V5d29yZHMtLQorICAgICAgICBdCisKK2lza2V5d29yZCA9IGZyb3plbnNldChrd2xpc3QpLl9fY29udGFpbnNfXworCitkZWYgbWFpbigpOgorICAgIGltcG9ydCBzeXMsIHJlCisKKyAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisgICAgaXB0ZmlsZSA9IGFyZ3MgYW5kIGFyZ3NbMF0gb3IgIlB5dGhvbi9ncmFtaW5pdC5jIgorICAgIGlmIGxlbihhcmdzKSA+IDE6IG9wdGZpbGUgPSBhcmdzWzFdCisgICAgZWxzZTogb3B0ZmlsZSA9ICJMaWIva2V5d29yZC5weSIKKworICAgICMgc2NhbiB0aGUgc291cmNlIGZpbGUgZm9yIGtleXdvcmRzCisgICAgZnAgPSBvcGVuKGlwdGZpbGUpCisgICAgc3RycHJvZyA9IHJlLmNvbXBpbGUoJyIoW14iXSspIicpCisgICAgbGluZXMgPSBbXQorICAgIGZvciBsaW5lIGluIGZwOgorICAgICAgICBpZiAnezEsICInIGluIGxpbmU6CisgICAgICAgICAgICBtYXRjaCA9IHN0cnByb2cuc2VhcmNoKGxpbmUpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBsaW5lcy5hcHBlbmQoIiAgICAgICAgJyIgKyBtYXRjaC5ncm91cCgxKSArICInLFxuIikKKyAgICBmcC5jbG9zZSgpCisgICAgbGluZXMuc29ydCgpCisKKyAgICAjIGxvYWQgdGhlIG91dHB1dCBza2VsZXRvbiBmcm9tIHRoZSB0YXJnZXQKKyAgICBmcCA9IG9wZW4ob3B0ZmlsZSkKKyAgICBmb3JtYXQgPSBmcC5yZWFkbGluZXMoKQorICAgIGZwLmNsb3NlKCkKKworICAgICMgaW5zZXJ0IHRoZSBsaW5lcyBvZiBrZXl3b3JkcworICAgIHRyeToKKyAgICAgICAgc3RhcnQgPSBmb3JtYXQuaW5kZXgoIiMtLXN0YXJ0IGtleXdvcmRzLS1cbiIpICsgMQorICAgICAgICBlbmQgPSBmb3JtYXQuaW5kZXgoIiMtLWVuZCBrZXl3b3Jkcy0tXG4iKQorICAgICAgICBmb3JtYXRbc3RhcnQ6ZW5kXSA9IGxpbmVzCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInRhcmdldCBkb2VzIG5vdCBjb250YWluIGZvcm1hdCBtYXJrZXJzXG4iKQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgIyB3cml0ZSB0aGUgb3V0cHV0IGZpbGUKKyAgICBmcCA9IG9wZW4ob3B0ZmlsZSwgJ3cnKQorICAgIGZwLndyaXRlKCcnLmpvaW4oZm9ybWF0KSkKKyAgICBmcC5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2tleXdvcmQucHljIGIvbGliL3B5dGhvbjIuNy9rZXl3b3JkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNlYzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9rZXl3b3JkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2tleXdvcmQucHlvIGIvbGliL3B5dGhvbjIuNy9rZXl3b3JkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjNlYzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9rZXl3b3JkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL1B5dGhvbi0yLjcuNS1weTIuNy5lZ2ctaW5mbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvUHl0aG9uLTIuNy41LXB5Mi43LmVnZy1pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YmUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL1B5dGhvbi0yLjcuNS1weTIuNy5lZ2ctaW5mbwpAQCAtMCwwICsxLDMxIEBACitNZXRhZGF0YS1WZXJzaW9uOiAxLjEKK05hbWU6IFB5dGhvbgorVmVyc2lvbjogMi43LjUKK1N1bW1hcnk6IEEgaGlnaC1sZXZlbCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UKK0hvbWUtcGFnZTogaHR0cDovL3d3dy5weXRob24ub3JnLzIuNworQXV0aG9yOiBHdWlkbyB2YW4gUm9zc3VtIGFuZCB0aGUgUHl0aG9uIGNvbW11bml0eQorQXV0aG9yLWVtYWlsOiBweXRob24tZGV2QHB5dGhvbi5vcmcKK0xpY2Vuc2U6IFBTRiBsaWNlbnNlCitEZXNjcmlwdGlvbjogUHl0aG9uIGlzIGFuIGludGVycHJldGVkLCBpbnRlcmFjdGl2ZSwgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nCisgICAgICAgIGxhbmd1YWdlLiBJdCBpcyBvZnRlbiBjb21wYXJlZCB0byBUY2wsIFBlcmwsIFNjaGVtZSBvciBKYXZhLgorICAgICAgICAKKyAgICAgICAgUHl0aG9uIGNvbWJpbmVzIHJlbWFya2FibGUgcG93ZXIgd2l0aCB2ZXJ5IGNsZWFyIHN5bnRheC4gSXQgaGFzCisgICAgICAgIG1vZHVsZXMsIGNsYXNzZXMsIGV4Y2VwdGlvbnMsIHZlcnkgaGlnaCBsZXZlbCBkeW5hbWljIGRhdGEgdHlwZXMsIGFuZAorICAgICAgICBkeW5hbWljIHR5cGluZy4gVGhlcmUgYXJlIGludGVyZmFjZXMgdG8gbWFueSBzeXN0ZW0gY2FsbHMgYW5kCisgICAgICAgIGxpYnJhcmllcywgYXMgd2VsbCBhcyB0byB2YXJpb3VzIHdpbmRvd2luZyBzeXN0ZW1zIChYMTEsIE1vdGlmLCBUaywKKyAgICAgICAgTWFjLCBNRkMpLiBOZXcgYnVpbHQtaW4gbW9kdWxlcyBhcmUgZWFzaWx5IHdyaXR0ZW4gaW4gQyBvciBDKysuIFB5dGhvbgorICAgICAgICBpcyBhbHNvIHVzYWJsZSBhcyBhbiBleHRlbnNpb24gbGFuZ3VhZ2UgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgYQorICAgICAgICBwcm9ncmFtbWFibGUgaW50ZXJmYWNlLgorICAgICAgICAKKyAgICAgICAgVGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBpcyBwb3J0YWJsZTogaXQgcnVucyBvbiBtYW55IGJyYW5kcyBvZiBVTklYLAorICAgICAgICBvbiBXaW5kb3dzLCBET1MsIE9TLzIsIE1hYywgQW1pZ2EuLi4gSWYgeW91ciBmYXZvcml0ZSBzeXN0ZW0gaXNuJ3QKKyAgICAgICAgbGlzdGVkIGhlcmUsIGl0IG1heSBzdGlsbCBiZSBzdXBwb3J0ZWQsIGlmIHRoZXJlJ3MgYSBDIGNvbXBpbGVyIGZvcgorICAgICAgICBpdC4gQXNrIGFyb3VuZCBvbiBjb21wLmxhbmcucHl0aG9uIC0tIG9yIGp1c3QgdHJ5IGNvbXBpbGluZyBQeXRob24KKyAgICAgICAgeW91cnNlbGYuCitQbGF0Zm9ybTogTWFueQorQ2xhc3NpZmllcjogRGV2ZWxvcG1lbnQgU3RhdHVzIDo6IDYgLSBNYXR1cmUKK0NsYXNzaWZpZXI6IExpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UKK0NsYXNzaWZpZXI6IE5hdHVyYWwgTGFuZ3VhZ2UgOjogRW5nbGlzaAorQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogQworQ2xhc3NpZmllcjogUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uCitDbGFzc2lmaWVyOiBUb3BpYyA6OiBTb2Z0d2FyZSBEZXZlbG9wbWVudApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fYmlzZWN0LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fYmlzZWN0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlMDhhODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19iaXNlY3Quc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2NuLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2NuLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3ZDhjMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jb2RlY3NfY24uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2hrLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2hrLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQzYjk1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jb2RlY3NfaGsuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2lzbzIwMjIuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jb2RlY3NfaXNvMjAyMi5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZWVkNmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2lzbzIwMjIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2pwLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2pwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcyZDQxNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jb2RlY3NfanAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2tyLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX2tyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEwZDcwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jb2RlY3Nfa3Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX3R3LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29kZWNzX3R3LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ4ODNmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jb2RlY3NfdHcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29sbGVjdGlvbnMuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jb2xsZWN0aW9ucy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZTk0N2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY29sbGVjdGlvbnMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3N2LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3N2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFhYTYzY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jc3Yuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3R5cGVzLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3R5cGVzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQxYTk2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jdHlwZXMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3R5cGVzX3Rlc3Quc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19jdHlwZXNfdGVzdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YTViYWNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fY3R5cGVzX3Rlc3Quc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fZWxlbWVudHRyZWUuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19lbGVtZW50dHJlZS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzM0MmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fZWxlbWVudHRyZWUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fZnVuY3Rvb2xzLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fZnVuY3Rvb2xzLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5MDM5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19mdW5jdG9vbHMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9faGVhcHEuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19oZWFwcS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZDJjYzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9faGVhcHEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9faG90c2hvdC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2hvdHNob3Quc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGI4NGU4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2hvdHNob3Quc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9faW8uc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19pby5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jOTc1NWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9faW8uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fanNvbi5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2pzb24uc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzVkYmUxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvX2pzb24uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbG9jYWxlLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbG9jYWxlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzYmY3NDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19sb2NhbGUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbHNwcm9mLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbHNwcm9mLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJlMmJjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19sc3Byb2Yuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbWQ1LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbWQ1LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM1NjUwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19tZDUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbXVsdGlieXRlY29kZWMuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19tdWx0aWJ5dGVjb2RlYy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40YmZhN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbXVsdGlieXRlY29kZWMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbXVsdGlwcm9jZXNzaW5nLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fbXVsdGlwcm9jZXNzaW5nLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM0ZTVjNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19tdWx0aXByb2Nlc3Npbmcuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fcmFuZG9tLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fcmFuZG9tLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJhNTIwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19yYW5kb20uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc2hhLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc2hhLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRiYzAxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zaGEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc2hhMjU2LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc2hhMjU2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMzZGFiOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zaGEyNTYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc2hhNTEyLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc2hhNTEyLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFlNjc1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zaGE1MTIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc29ja2V0LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc29ja2V0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2NzhhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zb2NrZXQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc3RydWN0LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fc3RydWN0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM2MDE4NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL19zdHJ1Y3Quc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fdGVzdGNhcGkuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL190ZXN0Y2FwaS5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTVlYzhjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9fdGVzdGNhcGkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9hcnJheS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYXJyYXkuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjlhYjg1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYXJyYXkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9hdWRpb29wLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9hdWRpb29wLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5ZjgwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2F1ZGlvb3Auc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9iaW5hc2NpaS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYmluYXNjaWkuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTkwOGJkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvYmluYXNjaWkuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jUGlja2xlLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jUGlja2xlLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ4MjBkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2NQaWNrbGUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jU3RyaW5nSU8uc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2NTdHJpbmdJTy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMTMxODYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jU3RyaW5nSU8uc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jbWF0aC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY21hdGguc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjM3YTE2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvY21hdGguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jcnlwdF9mYWlsZWQuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2NyeXB0X2ZhaWxlZC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMDczNGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9jcnlwdF9mYWlsZWQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9kYXRldGltZS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZGF0ZXRpbWUuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFjNWEwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZGF0ZXRpbWUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9mY250bC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZmNudGwuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmZkNjdhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvZmNudGwuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9mdXR1cmVfYnVpbHRpbnMuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2Z1dHVyZV9idWlsdGlucy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43NjFkYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9mdXR1cmVfYnVpbHRpbnMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9ncnAuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2dycC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMTQ0ODExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9ncnAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9pdGVydG9vbHMuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2l0ZXJ0b29scy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDVjNmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9pdGVydG9vbHMuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9saW51eGF1ZGlvZGV2LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9saW51eGF1ZGlvZGV2LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBjMmI0MzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL2xpbnV4YXVkaW9kZXYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9tYXRoLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9tYXRoLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjljN2YxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL21hdGguc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9tbWFwLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9tbWFwLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRlNDM0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL21tYXAuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9vcGVyYXRvci5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvb3BlcmF0b3Iuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmIxODllYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvb3BlcmF0b3Iuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9vc3NhdWRpb2Rldi5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvb3NzYXVkaW9kZXYuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTRiNDBiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvb3NzYXVkaW9kZXYuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9wYXJzZXIuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3BhcnNlci5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOThkNDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9wYXJzZXIuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9wd2Quc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3B3ZC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMzUyM2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9wd2Quc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9weWV4cGF0LnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9weWV4cGF0LnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1YmZmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3B5ZXhwYXQuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9yZXNvdXJjZS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcmVzb3VyY2Uuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2YxODNlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvcmVzb3VyY2Uuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zZWxlY3Quc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3NlbGVjdC5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44ZGRmNjMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zZWxlY3Quc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zcHdkLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zcHdkLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwMDMyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3Nwd2Quc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zdHJvcC5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvc3Ryb3Auc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNmIzYjMxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvc3Ryb3Auc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zeXNsb2cuc28gYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3N5c2xvZy5zbwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMTJkODI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC9zeXNsb2cuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC90ZXJtaW9zLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC90ZXJtaW9zLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcxOTQ5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3Rlcm1pb3Muc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC90aW1lLnNvIGIvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC90aW1lLnNvCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwZTFkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi1keW5sb2FkL3RpbWUuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItZHlubG9hZC91bmljb2RlZGF0YS5zbyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvdW5pY29kZWRhdGEuc28KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjYyNjBlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLWR5bmxvYWQvdW5pY29kZWRhdGEuc28KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDY0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9DYW52YXMucHkKQEAgLTAsMCArMSwxOTQgQEAKKyMgVGhpcyBtb2R1bGUgZXhwb3J0cyBjbGFzc2VzIGZvciB0aGUgdmFyaW91cyBjYW52YXMgaXRlbSB0eXBlcworCisjIE5PVEU6IFRoaXMgbW9kdWxlIHdhcyBhbiBleHBlcmltZW50IGFuZCBpcyBub3cgb2Jzb2xldGUuCisjIEl0J3MgYmVzdCB0byB1c2UgdGhlIFRraW50ZXIuQ2FudmFzIGNsYXNzIGRpcmVjdGx5LgorCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBDYW52YXMgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCitmcm9tIFRraW50ZXIgaW1wb3J0IENhbnZhcywgX2NuZm1lcmdlLCBfZmxhdHRlbgorCisKK2NsYXNzIENhbnZhc0l0ZW06CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcywgaXRlbVR5cGUsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjYW52YXMKKyAgICAgICAgc2VsZi5pZCA9IGNhbnZhcy5fY3JlYXRlKGl0ZW1UeXBlLCBhcmdzLCBrdykKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoY2FudmFzLCAnaXRlbXMnKToKKyAgICAgICAgICAgIGNhbnZhcy5pdGVtcyA9IHt9CisgICAgICAgIGNhbnZhcy5pdGVtc1tzZWxmLmlkXSA9IHNlbGYKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLmlkKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXMsIGlkPSVkPicgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuaWQpCisgICAgZGVmIGRlbGV0ZShzZWxmKToKKyAgICAgICAgZGVsIHNlbGYuY2FudmFzLml0ZW1zW3NlbGYuaWRdCisgICAgICAgIHNlbGYuY2FudmFzLmRlbGV0ZShzZWxmLmlkKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB2ID0gc2VsZi5jYW52YXMudGsuc3BsaXQoc2VsZi5jYW52YXMudGsuY2FsbCgKKyAgICAgICAgICAgICAgICBzZWxmLmNhbnZhcy5fdywgJ2l0ZW1jb25maWd1cmUnLAorICAgICAgICAgICAgICAgIHNlbGYuaWQsICctJyArIGtleSkpCisgICAgICAgIHJldHVybiB2WzRdCisgICAgY2dldCA9IF9fZ2V0aXRlbV9fCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLmNhbnZhcy5pdGVtY29uZmlnKHNlbGYuaWQsIHtrZXk6IHZhbHVlfSkKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ19rZXlzJyk6CisgICAgICAgICAgICBzZWxmLl9rZXlzID0gbWFwKGxhbWJkYSB4LCB0az1zZWxmLmNhbnZhcy50azoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGsuc3BsaXRsaXN0KHgpWzBdWzE6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYW52YXMudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FudmFzLl9kbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdGVtY29uZmlndXJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLmlkLCkpKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2tleXMKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYua2V5cygpCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYua2V5cygpCisgICAgZGVmIGFkZHRhZyhzZWxmLCB0YWcsIG9wdGlvbj0nd2l0aHRhZycpOgorICAgICAgICBzZWxmLmNhbnZhcy5hZGR0YWcodGFnLCBvcHRpb24sIHNlbGYuaWQpCisgICAgZGVmIGJib3goc2VsZik6CisgICAgICAgIHgxLCB5MSwgeDIsIHkyID0gc2VsZi5jYW52YXMuYmJveChzZWxmLmlkKQorICAgICAgICByZXR1cm4gKHgxLCB5MSksICh4MiwgeTIpCisgICAgZGVmIGJpbmQoc2VsZiwgc2VxdWVuY2U9Tm9uZSwgY29tbWFuZD1Ob25lLCBhZGQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy50YWdfYmluZChzZWxmLmlkLCBzZXF1ZW5jZSwgY29tbWFuZCwgYWRkKQorICAgIGRlZiB1bmJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmNpZD1Ob25lKToKKyAgICAgICAgc2VsZi5jYW52YXMudGFnX3VuYmluZChzZWxmLmlkLCBzZXF1ZW5jZSwgZnVuY2lkKQorICAgIGRlZiBjb25maWcoc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLml0ZW1jb25maWcoc2VsZi5pZCwgX2NuZm1lcmdlKChjbmYsIGt3KSkpCisgICAgZGVmIGNvb3JkcyhzZWxmLCBwdHMgPSAoKSk6CisgICAgICAgIGZsYXQgPSAoKQorICAgICAgICBmb3IgeCwgeSBpbiBwdHM6IGZsYXQgPSBmbGF0ICsgKHgsIHkpCisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy5jb29yZHMoc2VsZi5pZCwgKmZsYXQpCisgICAgZGVmIGRjaGFycyhzZWxmLCBmaXJzdCwgbGFzdD1Ob25lKToKKyAgICAgICAgc2VsZi5jYW52YXMuZGNoYXJzKHNlbGYuaWQsIGZpcnN0LCBsYXN0KQorICAgIGRlZiBkdGFnKHNlbGYsIHR0ZCk6CisgICAgICAgIHNlbGYuY2FudmFzLmR0YWcoc2VsZi5pZCwgdHRkKQorICAgIGRlZiBmb2N1cyhzZWxmKToKKyAgICAgICAgc2VsZi5jYW52YXMuZm9jdXMoc2VsZi5pZCkKKyAgICBkZWYgZ2V0dGFncyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLmdldHRhZ3Moc2VsZi5pZCkKKyAgICBkZWYgaWN1cnNvcihzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYuY2FudmFzLmljdXJzb3Ioc2VsZi5pZCwgaW5kZXgpCisgICAgZGVmIGluZGV4KHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLmluZGV4KHNlbGYuaWQsIGluZGV4KQorICAgIGRlZiBpbnNlcnQoc2VsZiwgYmVmb3JldGhpcywgc3RyaW5nKToKKyAgICAgICAgc2VsZi5jYW52YXMuaW5zZXJ0KHNlbGYuaWQsIGJlZm9yZXRoaXMsIHN0cmluZykKKyAgICBkZWYgbG93ZXIoc2VsZiwgYmVsb3d0aGlzPU5vbmUpOgorICAgICAgICBzZWxmLmNhbnZhcy50YWdfbG93ZXIoc2VsZi5pZCwgYmVsb3d0aGlzKQorICAgIGRlZiBtb3ZlKHNlbGYsIHhhbW91bnQsIHlhbW91bnQpOgorICAgICAgICBzZWxmLmNhbnZhcy5tb3ZlKHNlbGYuaWQsIHhhbW91bnQsIHlhbW91bnQpCisgICAgZGVmIHRrcmFpc2Uoc2VsZiwgYWJvdmV0aGlzPU5vbmUpOgorICAgICAgICBzZWxmLmNhbnZhcy50YWdfcmFpc2Uoc2VsZi5pZCwgYWJvdmV0aGlzKQorICAgIHJhaXNlXyA9IHRrcmFpc2UgIyBCVyBjb21wYXQKKyAgICBkZWYgc2NhbGUoc2VsZiwgeG9yaWdpbiwgeW9yaWdpbiwgeHNjYWxlLCB5c2NhbGUpOgorICAgICAgICBzZWxmLmNhbnZhcy5zY2FsZShzZWxmLmlkLCB4b3JpZ2luLCB5b3JpZ2luLCB4c2NhbGUsIHlzY2FsZSkKKyAgICBkZWYgdHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLnR5cGUoc2VsZi5pZCkKKworY2xhc3MgQXJjKENhbnZhc0l0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgQ2FudmFzSXRlbS5fX2luaXRfXyhzZWxmLCBjYW52YXMsICdhcmMnLCAqYXJncywgKiprdykKKworY2xhc3MgQml0bWFwKENhbnZhc0l0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgQ2FudmFzSXRlbS5fX2luaXRfXyhzZWxmLCBjYW52YXMsICdiaXRtYXAnLCAqYXJncywgKiprdykKKworY2xhc3MgSW1hZ2VJdGVtKENhbnZhc0l0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgQ2FudmFzSXRlbS5fX2luaXRfXyhzZWxmLCBjYW52YXMsICdpbWFnZScsICphcmdzLCAqKmt3KQorCitjbGFzcyBMaW5lKENhbnZhc0l0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgQ2FudmFzSXRlbS5fX2luaXRfXyhzZWxmLCBjYW52YXMsICdsaW5lJywgKmFyZ3MsICoqa3cpCisKK2NsYXNzIE92YWwoQ2FudmFzSXRlbSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcywgKmFyZ3MsICoqa3cpOgorICAgICAgICBDYW52YXNJdGVtLl9faW5pdF9fKHNlbGYsIGNhbnZhcywgJ292YWwnLCAqYXJncywgKiprdykKKworY2xhc3MgUG9seWdvbihDYW52YXNJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCAqYXJncywgKiprdyk6CisgICAgICAgIENhbnZhc0l0ZW0uX19pbml0X18oc2VsZiwgY2FudmFzLCAncG9seWdvbicsICphcmdzLCAqKmt3KQorCitjbGFzcyBSZWN0YW5nbGUoQ2FudmFzSXRlbSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbnZhcywgKmFyZ3MsICoqa3cpOgorICAgICAgICBDYW52YXNJdGVtLl9faW5pdF9fKHNlbGYsIGNhbnZhcywgJ3JlY3RhbmdsZScsICphcmdzLCAqKmt3KQorCisjIFhYWCAiVGV4dCIgaXMgdGFrZW4gYnkgdGhlIFRleHQgd2lkZ2V0Li4uCitjbGFzcyBDYW52YXNUZXh0KENhbnZhc0l0ZW0pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsICphcmdzLCAqKmt3KToKKyAgICAgICAgQ2FudmFzSXRlbS5fX2luaXRfXyhzZWxmLCBjYW52YXMsICd0ZXh0JywgKmFyZ3MsICoqa3cpCisKK2NsYXNzIFdpbmRvdyhDYW52YXNJdGVtKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzLCAqYXJncywgKiprdyk6CisgICAgICAgIENhbnZhc0l0ZW0uX19pbml0X18oc2VsZiwgY2FudmFzLCAnd2luZG93JywgKmFyZ3MsICoqa3cpCisKK2NsYXNzIEdyb3VwOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYW52YXMsIHRhZz1Ob25lKToKKyAgICAgICAgaWYgbm90IHRhZzoKKyAgICAgICAgICAgIHRhZyA9ICdHcm91cCVkJyAlIGlkKHNlbGYpCisgICAgICAgIHNlbGYudGFnID0gc2VsZi5pZCA9IHRhZworICAgICAgICBzZWxmLmNhbnZhcyA9IGNhbnZhcworICAgICAgICBzZWxmLmNhbnZhcy5kdGFnKHNlbGYudGFnKQorICAgIGRlZiBzdHIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRhZworICAgIF9fc3RyX18gPSBzdHIKKyAgICBkZWYgX2RvKHNlbGYsIGNtZCwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5jYW52YXMuX2RvKGNtZCwgKHNlbGYudGFnLCkgKyBfZmxhdHRlbihhcmdzKSkKKyAgICBkZWYgYWRkdGFnX2Fib3ZlKHNlbGYsIHRhZ09ySWQpOgorICAgICAgICBzZWxmLl9kbygnYWRkdGFnJywgJ2Fib3ZlJywgdGFnT3JJZCkKKyAgICBkZWYgYWRkdGFnX2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5fZG8oJ2FkZHRhZycsICdhbGwnKQorICAgIGRlZiBhZGR0YWdfYmVsb3coc2VsZiwgdGFnT3JJZCk6CisgICAgICAgIHNlbGYuX2RvKCdhZGR0YWcnLCAnYmVsb3cnLCB0YWdPcklkKQorICAgIGRlZiBhZGR0YWdfY2xvc2VzdChzZWxmLCB4LCB5LCBoYWxvPU5vbmUsIHN0YXJ0PU5vbmUpOgorICAgICAgICBzZWxmLl9kbygnYWRkdGFnJywgJ2Nsb3Nlc3QnLCB4LCB5LCBoYWxvLCBzdGFydCkKKyAgICBkZWYgYWRkdGFnX2VuY2xvc2VkKHNlbGYsIHgxLCB5MSwgeDIsIHkyKToKKyAgICAgICAgc2VsZi5fZG8oJ2FkZHRhZycsICdlbmNsb3NlZCcsIHgxLCB5MSwgeDIsIHkyKQorICAgIGRlZiBhZGR0YWdfb3ZlcmxhcHBpbmcoc2VsZiwgeDEsIHkxLCB4MiwgeTIpOgorICAgICAgICBzZWxmLl9kbygnYWRkdGFnJywgJ292ZXJsYXBwaW5nJywgeDEsIHkxLCB4MiwgeTIpCisgICAgZGVmIGFkZHRhZ193aXRodGFnKHNlbGYsIHRhZ09ySWQpOgorICAgICAgICBzZWxmLl9kbygnYWRkdGFnJywgJ3dpdGh0YWcnLCB0YWdPcklkKQorICAgIGRlZiBiYm94KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5jYW52YXMuX2dldGludHMoc2VsZi5fZG8oJ2Jib3gnKSkKKyAgICBkZWYgYmluZChzZWxmLCBzZXF1ZW5jZT1Ob25lLCBjb21tYW5kPU5vbmUsIGFkZD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLnRhZ19iaW5kKHNlbGYuaWQsIHNlcXVlbmNlLCBjb21tYW5kLCBhZGQpCisgICAgZGVmIHVuYmluZChzZWxmLCBzZXF1ZW5jZSwgZnVuY2lkPU5vbmUpOgorICAgICAgICBzZWxmLmNhbnZhcy50YWdfdW5iaW5kKHNlbGYuaWQsIHNlcXVlbmNlLCBmdW5jaWQpCisgICAgZGVmIGNvb3JkcyhzZWxmLCAqcHRzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvKCdjb29yZHMnLCBwdHMpCisgICAgZGVmIGRjaGFycyhzZWxmLCBmaXJzdCwgbGFzdD1Ob25lKToKKyAgICAgICAgc2VsZi5fZG8oJ2RjaGFycycsIGZpcnN0LCBsYXN0KQorICAgIGRlZiBkZWxldGUoc2VsZik6CisgICAgICAgIHNlbGYuX2RvKCdkZWxldGUnKQorICAgIGRlZiBkdGFnKHNlbGYsIHRhZ1RvRGVsZXRlPU5vbmUpOgorICAgICAgICBzZWxmLl9kbygnZHRhZycsIHRhZ1RvRGVsZXRlKQorICAgIGRlZiBmb2N1cyhzZWxmKToKKyAgICAgICAgc2VsZi5fZG8oJ2ZvY3VzJykKKyAgICBkZWYgZ2V0dGFncyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2FudmFzLnRrLnNwbGl0bGlzdChzZWxmLl9kbygnZ2V0dGFncycsIHNlbGYudGFnKSkKKyAgICBkZWYgaWN1cnNvcihzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLl9kbygnaWN1cnNvcicsIGluZGV4KQorICAgIGRlZiBpbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy50ay5nZXRpbnQoc2VsZi5fZG8oJ2luZGV4JywgaW5kZXgpKQorICAgIGRlZiBpbnNlcnQoc2VsZiwgYmVmb3JlVGhpcywgc3RyaW5nKToKKyAgICAgICAgc2VsZi5fZG8oJ2luc2VydCcsIGJlZm9yZVRoaXMsIHN0cmluZykKKyAgICBkZWYgY29uZmlnKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHJldHVybiBzZWxmLmNhbnZhcy5pdGVtY29uZmlndXJlKHNlbGYudGFnLCBfY25mbWVyZ2UoKGNuZixrdykpKQorICAgIGRlZiBsb3dlcihzZWxmLCBiZWxvd1RoaXM9Tm9uZSk6CisgICAgICAgIHNlbGYuX2RvKCdsb3dlcicsIGJlbG93VGhpcykKKyAgICBkZWYgbW92ZShzZWxmLCB4QW1vdW50LCB5QW1vdW50KToKKyAgICAgICAgc2VsZi5fZG8oJ21vdmUnLCB4QW1vdW50LCB5QW1vdW50KQorICAgIGRlZiB0a3JhaXNlKHNlbGYsIGFib3ZlVGhpcz1Ob25lKToKKyAgICAgICAgc2VsZi5fZG8oJ3JhaXNlJywgYWJvdmVUaGlzKQorICAgIGxpZnQgPSB0a3JhaXNlCisgICAgZGVmIHNjYWxlKHNlbGYsIHhPcmlnaW4sIHlPcmlnaW4sIHhTY2FsZSwgeVNjYWxlKToKKyAgICAgICAgc2VsZi5fZG8oJ3NjYWxlJywgeE9yaWdpbiwgeU9yaWdpbiwgeFNjYWxlLCB5U2NhbGUpCisgICAgZGVmIHNlbGVjdF9hZGp1c3Qoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLmNhbnZhcy5fZG8oJ3NlbGVjdCcsICgnYWRqdXN0Jywgc2VsZi50YWcsIGluZGV4KSkKKyAgICBkZWYgc2VsZWN0X2Zyb20oc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLmNhbnZhcy5fZG8oJ3NlbGVjdCcsICgnZnJvbScsIHNlbGYudGFnLCBpbmRleCkpCisgICAgZGVmIHNlbGVjdF90byhzZWxmLCBpbmRleCk6CisgICAgICAgIHNlbGYuY2FudmFzLl9kbygnc2VsZWN0JywgKCd0bycsIHNlbGYudGFnLCBpbmRleCkpCisgICAgZGVmIHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9kbygndHlwZScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9DYW52YXMucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUwNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9DYW52YXMucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTUwNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvQ2FudmFzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwODk1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL0RpYWxvZy5weQpAQCAtMCwwICsxLDQ5IEBACisjIGRpYWxvZy5weSAtLSBUa2ludGVyIGludGVyZmFjZSB0byB0aGUgdGtfZGlhbG9nIHNjcmlwdC4KKworZnJvbSBUa2ludGVyIGltcG9ydCAqCitmcm9tIFRraW50ZXIgaW1wb3J0IF9jbmZtZXJnZQorCitpZiBUa1ZlcnNpb24gPD0gMy42OgorICAgIERJQUxPR19JQ09OID0gJ3dhcm5pbmcnCitlbHNlOgorICAgIERJQUxPR19JQ09OID0gJ3F1ZXN0aGVhZCcKKworCitjbGFzcyBEaWFsb2coV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCisgICAgICAgIHNlbGYud2lkZ2V0TmFtZSA9ICdfX2RpYWxvZ19fJworICAgICAgICBXaWRnZXQuX3NldHVwKHNlbGYsIG1hc3RlciwgY25mKQorICAgICAgICBzZWxmLm51bSA9IHNlbGYudGsuZ2V0aW50KAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgICAgICAgICAndGtfZGlhbG9nJywgc2VsZi5fdywKKyAgICAgICAgICAgICAgICAgICAgICBjbmZbJ3RpdGxlJ10sIGNuZlsndGV4dCddLAorICAgICAgICAgICAgICAgICAgICAgIGNuZlsnYml0bWFwJ10sIGNuZlsnZGVmYXVsdCddLAorICAgICAgICAgICAgICAgICAgICAgICpjbmZbJ3N0cmluZ3MnXSkpCisgICAgICAgIHRyeTogV2lkZ2V0LmRlc3Ryb3koc2VsZikKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOiBwYXNzCisgICAgZGVmIGRlc3Ryb3koc2VsZik6IHBhc3MKKworZGVmIF90ZXN0KCk6CisgICAgZCA9IERpYWxvZyhOb25lLCB7J3RpdGxlJzogJ0ZpbGUgTW9kaWZpZWQnLAorICAgICAgICAgICAgICAgICAgICAgICd0ZXh0JzoKKyAgICAgICAgICAgICAgICAgICAgICAnRmlsZSAiUHl0aG9uLmgiIGhhcyBiZWVuIG1vZGlmaWVkJworICAgICAgICAgICAgICAgICAgICAgICcgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgc2F2ZWQuJworICAgICAgICAgICAgICAgICAgICAgICcgRG8geW91IHdhbnQgdG8gc2F2ZSBpdCBiZWZvcmUnCisgICAgICAgICAgICAgICAgICAgICAgJyBleGl0aW5nIHRoZSBhcHBsaWNhdGlvbi4nLAorICAgICAgICAgICAgICAgICAgICAgICdiaXRtYXAnOiBESUFMT0dfSUNPTiwKKyAgICAgICAgICAgICAgICAgICAgICAnZGVmYXVsdCc6IDAsCisgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZ3MnOiAoJ1NhdmUgRmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Rpc2NhcmQgQ2hhbmdlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1JldHVybiB0byBFZGl0b3InKX0pCisgICAgcHJpbnQgZC5udW0KKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHQgPSBCdXR0b24oTm9uZSwgeyd0ZXh0JzogJ1Rlc3QnLAorICAgICAgICAgICAgICAgICAgICAgICdjb21tYW5kJzogX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgUGFjazoge319KQorICAgIHEgPSBCdXR0b24oTm9uZSwgeyd0ZXh0JzogJ1F1aXQnLAorICAgICAgICAgICAgICAgICAgICAgICdjb21tYW5kJzogdC5xdWl0LAorICAgICAgICAgICAgICAgICAgICAgIFBhY2s6IHt9fSkKKyAgICB0Lm1haW5sb29wKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL0RpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmEwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL0RpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmEwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9EaWFsb2cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL0ZpbGVEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Y2UyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5CkBAIC0wLDAgKzEsMjc0IEBACisiIiJGaWxlIHNlbGVjdGlvbiBkaWFsb2cgY2xhc3Nlcy4KKworQ2xhc3NlczoKKworLSBGaWxlRGlhbG9nCistIExvYWRGaWxlRGlhbG9nCistIFNhdmVGaWxlRGlhbG9nCisKKyIiIgorCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gRGlhbG9nIGltcG9ydCBEaWFsb2cKKworaW1wb3J0IG9zCitpbXBvcnQgZm5tYXRjaAorCisKK2RpYWxvZ3N0YXRlcyA9IHt9CisKKworY2xhc3MgRmlsZURpYWxvZzoKKworICAgICIiIlN0YW5kYXJkIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyAtLSBubyBjaGVja3Mgb24gc2VsZWN0ZWQgZmlsZS4KKworICAgIFVzYWdlOgorCisgICAgICAgIGQgPSBGaWxlRGlhbG9nKG1hc3RlcikKKyAgICAgICAgZm5hbWUgPSBkLmdvKGRpcl9vcl9maWxlLCBwYXR0ZXJuLCBkZWZhdWx0LCBrZXkpCisgICAgICAgIGlmIGZuYW1lIGlzIE5vbmU6IC4uLmNhbmNlbGVkLi4uCisgICAgICAgIGVsc2U6IC4uLm9wZW4gZmlsZS4uLgorCisgICAgQWxsIGFyZ3VtZW50cyB0byBnbygpIGFyZSBvcHRpb25hbC4KKworICAgIFRoZSAna2V5JyBhcmd1bWVudCBzcGVjaWZpZXMgYSBrZXkgaW4gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5CisgICAgJ2RpYWxvZ3N0YXRlcycsIHdoaWNoIGtlZXBzIHRyYWNrIG9mIHRoZSB2YWx1ZXMgZm9yIHRoZSBkaXJlY3RvcnkKKyAgICBhbmQgcGF0dGVybiBhcmd1bWVudHMsIG92ZXJyaWRpbmcgdGhlIHZhbHVlcyBwYXNzZWQgaW4gKGl0IGRvZXMKKyAgICBub3Qga2VlcCB0cmFjayBvZiB0aGUgZGVmYXVsdCBhcmd1bWVudCEpLiAgSWYgbm8ga2V5IGlzIHNwZWNpZmllZCwKKyAgICB0aGUgZGlhbG9nIGtlZXBzIG5vIG1lbW9yeSBvZiBwcmV2aW91cyBzdGF0ZS4gIE5vdGUgdGhhdCBtZW1vcnkgaXMKKyAgICBrZXB0IGV2ZW4gd2hlbiB0aGUgZGlhbG9nIGlzIGNhbmNlbGVkLiAgKEFsbCB0aGlzIGVtdWxhdGVzIHRoZQorICAgIGJlaGF2aW9yIG9mIHRoZSBNYWNpbnRvc2ggZmlsZSBzZWxlY3Rpb24gZGlhbG9ncy4pCisKKyAgICAiIiIKKworICAgIHRpdGxlID0gIkZpbGUgU2VsZWN0aW9uIERpYWxvZyIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHRpdGxlPU5vbmUpOgorICAgICAgICBpZiB0aXRsZSBpcyBOb25lOiB0aXRsZSA9IHNlbGYudGl0bGUKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSBOb25lCisKKyAgICAgICAgc2VsZi50b3AgPSBUb3BsZXZlbChtYXN0ZXIpCisgICAgICAgIHNlbGYudG9wLnRpdGxlKHRpdGxlKQorICAgICAgICBzZWxmLnRvcC5pY29ubmFtZSh0aXRsZSkKKworICAgICAgICBzZWxmLmJvdGZyYW1lID0gRnJhbWUoc2VsZi50b3ApCisgICAgICAgIHNlbGYuYm90ZnJhbWUucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQorCisgICAgICAgIHNlbGYuc2VsZWN0aW9uID0gRW50cnkoc2VsZi50b3ApCisgICAgICAgIHNlbGYuc2VsZWN0aW9uLnBhY2soc2lkZT1CT1RUT00sIGZpbGw9WCkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb24uYmluZCgnPFJldHVybj4nLCBzZWxmLm9rX2V2ZW50KQorCisgICAgICAgIHNlbGYuZmlsdGVyID0gRW50cnkoc2VsZi50b3ApCisgICAgICAgIHNlbGYuZmlsdGVyLnBhY2soc2lkZT1UT1AsIGZpbGw9WCkKKyAgICAgICAgc2VsZi5maWx0ZXIuYmluZCgnPFJldHVybj4nLCBzZWxmLmZpbHRlcl9jb21tYW5kKQorCisgICAgICAgIHNlbGYubWlkZnJhbWUgPSBGcmFtZShzZWxmLnRvcCkKKyAgICAgICAgc2VsZi5taWRmcmFtZS5wYWNrKGV4cGFuZD1ZRVMsIGZpbGw9Qk9USCkKKworICAgICAgICBzZWxmLmZpbGVzYmFyID0gU2Nyb2xsYmFyKHNlbGYubWlkZnJhbWUpCisgICAgICAgIHNlbGYuZmlsZXNiYXIucGFjayhzaWRlPVJJR0hULCBmaWxsPVkpCisgICAgICAgIHNlbGYuZmlsZXMgPSBMaXN0Ym94KHNlbGYubWlkZnJhbWUsIGV4cG9ydHNlbGVjdGlvbj0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5c2Nyb2xsY29tbWFuZD0oc2VsZi5maWxlc2JhciwgJ3NldCcpKQorICAgICAgICBzZWxmLmZpbGVzLnBhY2soc2lkZT1SSUdIVCwgZXhwYW5kPVlFUywgZmlsbD1CT1RIKQorICAgICAgICBidGFncyA9IHNlbGYuZmlsZXMuYmluZHRhZ3MoKQorICAgICAgICBzZWxmLmZpbGVzLmJpbmR0YWdzKGJ0YWdzWzE6XSArIGJ0YWdzWzoxXSkKKyAgICAgICAgc2VsZi5maWxlcy5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsIHNlbGYuZmlsZXNfc2VsZWN0X2V2ZW50KQorICAgICAgICBzZWxmLmZpbGVzLmJpbmQoJzxEb3VibGUtQnV0dG9uUmVsZWFzZS0xPicsIHNlbGYuZmlsZXNfZG91YmxlX2V2ZW50KQorICAgICAgICBzZWxmLmZpbGVzYmFyLmNvbmZpZyhjb21tYW5kPShzZWxmLmZpbGVzLCAneXZpZXcnKSkKKworICAgICAgICBzZWxmLmRpcnNiYXIgPSBTY3JvbGxiYXIoc2VsZi5taWRmcmFtZSkKKyAgICAgICAgc2VsZi5kaXJzYmFyLnBhY2soc2lkZT1MRUZULCBmaWxsPVkpCisgICAgICAgIHNlbGYuZGlycyA9IExpc3Rib3goc2VsZi5taWRmcmFtZSwgZXhwb3J0c2VsZWN0aW9uPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXNjcm9sbGNvbW1hbmQ9KHNlbGYuZGlyc2JhciwgJ3NldCcpKQorICAgICAgICBzZWxmLmRpcnMucGFjayhzaWRlPUxFRlQsIGV4cGFuZD1ZRVMsIGZpbGw9Qk9USCkKKyAgICAgICAgc2VsZi5kaXJzYmFyLmNvbmZpZyhjb21tYW5kPShzZWxmLmRpcnMsICd5dmlldycpKQorICAgICAgICBidGFncyA9IHNlbGYuZGlycy5iaW5kdGFncygpCisgICAgICAgIHNlbGYuZGlycy5iaW5kdGFncyhidGFnc1sxOl0gKyBidGFnc1s6MV0pCisgICAgICAgIHNlbGYuZGlycy5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsIHNlbGYuZGlyc19zZWxlY3RfZXZlbnQpCisgICAgICAgIHNlbGYuZGlycy5iaW5kKCc8RG91YmxlLUJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLmRpcnNfZG91YmxlX2V2ZW50KQorCisgICAgICAgIHNlbGYub2tfYnV0dG9uID0gQnV0dG9uKHNlbGYuYm90ZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0PSJPSyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYub2tfY29tbWFuZCkKKyAgICAgICAgc2VsZi5va19idXR0b24ucGFjayhzaWRlPUxFRlQpCisgICAgICAgIHNlbGYuZmlsdGVyX2J1dHRvbiA9IEJ1dHRvbihzZWxmLmJvdGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iRmlsdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9c2VsZi5maWx0ZXJfY29tbWFuZCkKKyAgICAgICAgc2VsZi5maWx0ZXJfYnV0dG9uLnBhY2soc2lkZT1MRUZULCBleHBhbmQ9WUVTKQorICAgICAgICBzZWxmLmNhbmNlbF9idXR0b24gPSBCdXR0b24oc2VsZi5ib3RmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9IkNhbmNlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kPXNlbGYuY2FuY2VsX2NvbW1hbmQpCisgICAgICAgIHNlbGYuY2FuY2VsX2J1dHRvbi5wYWNrKHNpZGU9UklHSFQpCisKKyAgICAgICAgc2VsZi50b3AucHJvdG9jb2woJ1dNX0RFTEVURV9XSU5ET1cnLCBzZWxmLmNhbmNlbF9jb21tYW5kKQorICAgICAgICAjIFhYWCBBcmUgdGhlIGZvbGxvd2luZyBva2F5IGZvciBhIGdlbmVyYWwgYXVkaWVuY2U/CisgICAgICAgIHNlbGYudG9wLmJpbmQoJzxBbHQtdz4nLCBzZWxmLmNhbmNlbF9jb21tYW5kKQorICAgICAgICBzZWxmLnRvcC5iaW5kKCc8QWx0LVc+Jywgc2VsZi5jYW5jZWxfY29tbWFuZCkKKworICAgIGRlZiBnbyhzZWxmLCBkaXJfb3JfZmlsZT1vcy5jdXJkaXIsIHBhdHRlcm49IioiLCBkZWZhdWx0PSIiLCBrZXk9Tm9uZSk6CisgICAgICAgIGlmIGtleSBhbmQga2V5IGluIGRpYWxvZ3N0YXRlczoKKyAgICAgICAgICAgIHNlbGYuZGlyZWN0b3J5LCBwYXR0ZXJuID0gZGlhbG9nc3RhdGVzW2tleV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpcl9vcl9maWxlID0gb3MucGF0aC5leHBhbmR1c2VyKGRpcl9vcl9maWxlKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJfb3JfZmlsZSk6CisgICAgICAgICAgICAgICAgc2VsZi5kaXJlY3RvcnkgPSBkaXJfb3JfZmlsZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmRpcmVjdG9yeSwgZGVmYXVsdCA9IG9zLnBhdGguc3BsaXQoZGlyX29yX2ZpbGUpCisgICAgICAgIHNlbGYuc2V0X2ZpbHRlcihzZWxmLmRpcmVjdG9yeSwgcGF0dGVybikKKyAgICAgICAgc2VsZi5zZXRfc2VsZWN0aW9uKGRlZmF1bHQpCisgICAgICAgIHNlbGYuZmlsdGVyX2NvbW1hbmQoKQorICAgICAgICBzZWxmLnNlbGVjdGlvbi5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLnRvcC53YWl0X3Zpc2liaWxpdHkoKSAjIHdpbmRvdyBuZWVkcyB0byBiZSB2aXNpYmxlIGZvciB0aGUgZ3JhYgorICAgICAgICBzZWxmLnRvcC5ncmFiX3NldCgpCisgICAgICAgIHNlbGYuaG93ID0gTm9uZQorICAgICAgICBzZWxmLm1hc3Rlci5tYWlubG9vcCgpICAgICAgICAgICMgRXhpdGVkIGJ5IHNlbGYucXVpdChob3cpCisgICAgICAgIGlmIGtleToKKyAgICAgICAgICAgIGRpcmVjdG9yeSwgcGF0dGVybiA9IHNlbGYuZ2V0X2ZpbHRlcigpCisgICAgICAgICAgICBpZiBzZWxmLmhvdzoKKyAgICAgICAgICAgICAgICBkaXJlY3RvcnkgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5ob3cpCisgICAgICAgICAgICBkaWFsb2dzdGF0ZXNba2V5XSA9IGRpcmVjdG9yeSwgcGF0dGVybgorICAgICAgICBzZWxmLnRvcC5kZXN0cm95KCkKKyAgICAgICAgcmV0dXJuIHNlbGYuaG93CisKKyAgICBkZWYgcXVpdChzZWxmLCBob3c9Tm9uZSk6CisgICAgICAgIHNlbGYuaG93ID0gaG93CisgICAgICAgIHNlbGYubWFzdGVyLnF1aXQoKSAgICAgICAgICAgICAgIyBFeGl0IG1haW5sb29wKCkKKworICAgIGRlZiBkaXJzX2RvdWJsZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuZmlsdGVyX2NvbW1hbmQoKQorCisgICAgZGVmIGRpcnNfc2VsZWN0X2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgZGlyLCBwYXQgPSBzZWxmLmdldF9maWx0ZXIoKQorICAgICAgICBzdWJkaXIgPSBzZWxmLmRpcnMuZ2V0KCdhY3RpdmUnKQorICAgICAgICBkaXIgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgc3ViZGlyKSkKKyAgICAgICAgc2VsZi5zZXRfZmlsdGVyKGRpciwgcGF0KQorCisgICAgZGVmIGZpbGVzX2RvdWJsZV9ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYub2tfY29tbWFuZCgpCisKKyAgICBkZWYgZmlsZXNfc2VsZWN0X2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgZmlsZSA9IHNlbGYuZmlsZXMuZ2V0KCdhY3RpdmUnKQorICAgICAgICBzZWxmLnNldF9zZWxlY3Rpb24oZmlsZSkKKworICAgIGRlZiBva19ldmVudChzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYub2tfY29tbWFuZCgpCisKKyAgICBkZWYgb2tfY29tbWFuZChzZWxmKToKKyAgICAgICAgc2VsZi5xdWl0KHNlbGYuZ2V0X3NlbGVjdGlvbigpKQorCisgICAgZGVmIGZpbHRlcl9jb21tYW5kKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBkaXIsIHBhdCA9IHNlbGYuZ2V0X2ZpbHRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLmJlbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gZGlyCisgICAgICAgIHNlbGYuc2V0X2ZpbHRlcihkaXIsIHBhdCkKKyAgICAgICAgbmFtZXMuc29ydCgpCisgICAgICAgIHN1YmRpcnMgPSBbb3MucGFyZGlyXQorICAgICAgICBtYXRjaGluZ2ZpbGVzID0gW10KKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXIsIG5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKToKKyAgICAgICAgICAgICAgICBzdWJkaXJzLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgZWxpZiBmbm1hdGNoLmZubWF0Y2gobmFtZSwgcGF0KToKKyAgICAgICAgICAgICAgICBtYXRjaGluZ2ZpbGVzLmFwcGVuZChuYW1lKQorICAgICAgICBzZWxmLmRpcnMuZGVsZXRlKDAsIEVORCkKKyAgICAgICAgZm9yIG5hbWUgaW4gc3ViZGlyczoKKyAgICAgICAgICAgIHNlbGYuZGlycy5pbnNlcnQoRU5ELCBuYW1lKQorICAgICAgICBzZWxmLmZpbGVzLmRlbGV0ZSgwLCBFTkQpCisgICAgICAgIGZvciBuYW1lIGluIG1hdGNoaW5nZmlsZXM6CisgICAgICAgICAgICBzZWxmLmZpbGVzLmluc2VydChFTkQsIG5hbWUpCisgICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHNlbGYuZ2V0X3NlbGVjdGlvbigpKQorICAgICAgICBpZiB0YWlsID09IG9zLmN1cmRpcjogdGFpbCA9ICcnCisgICAgICAgIHNlbGYuc2V0X3NlbGVjdGlvbih0YWlsKQorCisgICAgZGVmIGdldF9maWx0ZXIoc2VsZik6CisgICAgICAgIGZpbHRlciA9IHNlbGYuZmlsdGVyLmdldCgpCisgICAgICAgIGZpbHRlciA9IG9zLnBhdGguZXhwYW5kdXNlcihmaWx0ZXIpCisgICAgICAgIGlmIGZpbHRlclstMTpdID09IG9zLnNlcCBvciBvcy5wYXRoLmlzZGlyKGZpbHRlcik6CisgICAgICAgICAgICBmaWx0ZXIgPSBvcy5wYXRoLmpvaW4oZmlsdGVyLCAiKiIpCisgICAgICAgIHJldHVybiBvcy5wYXRoLnNwbGl0KGZpbHRlcikKKworICAgIGRlZiBnZXRfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBmaWxlID0gc2VsZi5zZWxlY3Rpb24uZ2V0KCkKKyAgICAgICAgZmlsZSA9IG9zLnBhdGguZXhwYW5kdXNlcihmaWxlKQorICAgICAgICByZXR1cm4gZmlsZQorCisgICAgZGVmIGNhbmNlbF9jb21tYW5kKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICBzZWxmLnF1aXQoKQorCisgICAgZGVmIHNldF9maWx0ZXIoc2VsZiwgZGlyLCBwYXQpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhkaXIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHB3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcHdkID0gTm9uZQorICAgICAgICAgICAgaWYgcHdkOgorICAgICAgICAgICAgICAgIGRpciA9IG9zLnBhdGguam9pbihwd2QsIGRpcikKKyAgICAgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLm5vcm1wYXRoKGRpcikKKyAgICAgICAgc2VsZi5maWx0ZXIuZGVsZXRlKDAsIEVORCkKKyAgICAgICAgc2VsZi5maWx0ZXIuaW5zZXJ0KEVORCwgb3MucGF0aC5qb2luKGRpciBvciBvcy5jdXJkaXIsIHBhdCBvciAiKiIpKQorCisgICAgZGVmIHNldF9zZWxlY3Rpb24oc2VsZiwgZmlsZSk6CisgICAgICAgIHNlbGYuc2VsZWN0aW9uLmRlbGV0ZSgwLCBFTkQpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uLmluc2VydChFTkQsIG9zLnBhdGguam9pbihzZWxmLmRpcmVjdG9yeSwgZmlsZSkpCisKKworY2xhc3MgTG9hZEZpbGVEaWFsb2coRmlsZURpYWxvZyk6CisKKyAgICAiIiJGaWxlIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIGZpbGUgZXhpc3RzLiIiIgorCisgICAgdGl0bGUgPSAiTG9hZCBGaWxlIFNlbGVjdGlvbiBEaWFsb2ciCisKKyAgICBkZWYgb2tfY29tbWFuZChzZWxmKToKKyAgICAgICAgZmlsZSA9IHNlbGYuZ2V0X3NlbGVjdGlvbigpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShmaWxlKToKKyAgICAgICAgICAgIHNlbGYubWFzdGVyLmJlbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5xdWl0KGZpbGUpCisKKworY2xhc3MgU2F2ZUZpbGVEaWFsb2coRmlsZURpYWxvZyk6CisKKyAgICAiIiJGaWxlIHNlbGVjdGlvbiBkaWFsb2cgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIGZpbGUgbWF5IGJlIGNyZWF0ZWQuIiIiCisKKyAgICB0aXRsZSA9ICJTYXZlIEZpbGUgU2VsZWN0aW9uIERpYWxvZyIKKworICAgIGRlZiBva19jb21tYW5kKHNlbGYpOgorICAgICAgICBmaWxlID0gc2VsZi5nZXRfc2VsZWN0aW9uKCkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZSk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYubWFzdGVyLmJlbGwoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZCA9IERpYWxvZyhzZWxmLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9Ik92ZXJ3cml0ZSBFeGlzdGluZyBGaWxlIFF1ZXN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iT3ZlcndyaXRlIGV4aXN0aW5nIGZpbGUgJXI/IiAlIChmaWxlLCksCisgICAgICAgICAgICAgICAgICAgICAgIGJpdG1hcD0ncXVlc3RoZWFkJywKKyAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0xLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzPSgiWWVzIiwgIkNhbmNlbCIpKQorICAgICAgICAgICAgaWYgZC5udW0gIT0gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KGZpbGUpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihoZWFkKToKKyAgICAgICAgICAgICAgICBzZWxmLm1hc3Rlci5iZWxsKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5xdWl0KGZpbGUpCisKKworZGVmIHRlc3QoKToKKyAgICAiIiJTaW1wbGUgdGVzdCBwcm9ncmFtLiIiIgorICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC53aXRoZHJhdygpCisgICAgZmQgPSBMb2FkRmlsZURpYWxvZyhyb290KQorICAgIGxvYWRmaWxlID0gZmQuZ28oa2V5PSJ0ZXN0IikKKyAgICBmZCA9IFNhdmVGaWxlRGlhbG9nKHJvb3QpCisgICAgc2F2ZWZpbGUgPSBmZC5nbyhrZXk9InRlc3QiKQorICAgIHByaW50IGxvYWRmaWxlLCBzYXZlZmlsZQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL0ZpbGVEaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTg0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL0ZpbGVEaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTg0YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaWxlRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9GaXhUay5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL0ZpeFRrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTYwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaXhUay5weQpAQCAtMCwwICsxLDc4IEBACitpbXBvcnQgc3lzLCBvcworCisjIERlbGF5IGltcG9ydCBfdGtpbnRlciB1bnRpbCB3ZSBoYXZlIHNldCBUQ0xfTElCUkFSWSwKKyMgc28gdGhhdCBUY2xfRmluZEV4ZWN1dGFibGUgaGFzIGEgY2hhbmNlIHRvIGxvY2F0ZSBpdHMKKyMgZW5jb2RpbmcgZGlyZWN0b3J5LgorCisjIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCBrbm93IHRoZSBUQ0xfTElCUkFSWSBkaXJlY3RvcnkKKyMgaWYgd2UgZG9uJ3Qga25vdyB0aGUgdGNsIHZlcnNpb24sIHdoaWNoIHdlIGNhbm5vdCBmaW5kIG91dAorIyB3aXRob3V0IGltcG9ydCBUY2wuIEZvcnR1bmF0ZWx5LCBUY2wgd2lsbCBpdHNlbGYgbG9vayBpbgorIyA8VENMX0xJQlJBUlk+XC4uXHRjbDxUQ0xfVkVSU0lPTj4sIHNvIGFueXRoaW5nIGNsb3NlIHRvCisjIHRoZSByZWFsIFRjbCBsaWJyYXJ5IHdpbGwgZG8uCisKKyMgRXhwYW5kIHN5bWJvbGljIGxpbmtzIG9uIFZpc3RhCit0cnk6CisgICAgaW1wb3J0IGN0eXBlcworICAgIGN0eXBlcy53aW5kbGwua2VybmVsMzIuR2V0RmluYWxQYXRoTmFtZUJ5SGFuZGxlVworZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgIGRlZiBjb252ZXJ0X3BhdGgocyk6CisgICAgICAgIHJldHVybiBzCitlbHNlOgorICAgIGRlZiBjb252ZXJ0X3BhdGgocyk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHMsIHN0cikgICAjIHN5cy5wcmVmaXggY29udGFpbnMgb25seSBieXRlcworICAgICAgICB1ZGlyID0gcy5kZWNvZGUoIm1iY3MiKQorICAgICAgICBoZGlyID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5cCisgICAgICAgICAgICBDcmVhdGVGaWxlVyh1ZGlyLCAweDgwLCAjIEZJTEVfUkVBRF9BVFRSSUJVVEVTCisgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAjIEZJTEVfU0hBUkVfUkVBRAorICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgMywgICAgIyBPUEVOX0VYSVNUSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwLCAjIEZJTEVfRkxBR19CQUNLVVBfU0VNQU5USUNTCisgICAgICAgICAgICAgICAgICAgICAgICBOb25lKQorICAgICAgICBpZiBoZGlyID09IC0xOgorICAgICAgICAgICAgIyBDYW5ub3Qgb3BlbiBkaXJlY3RvcnksIGdpdmUgdXAKKyAgICAgICAgICAgIHJldHVybiBzCisgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIodSIiLCAzMjc2OCkKKyAgICAgICAgcmVzID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5cCisgICAgICAgICAgICBHZXRGaW5hbFBhdGhOYW1lQnlIYW5kbGVXKGhkaXIsIGJ1ZiwgbGVuKGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApICMgVk9MVU1FX05BTUVfRE9TCisgICAgICAgIGN0eXBlcy53aW5kbGwua2VybmVsMzIuQ2xvc2VIYW5kbGUoaGRpcikKKyAgICAgICAgaWYgcmVzID09IDA6CisgICAgICAgICAgICAjIENvbnZlcnNpb24gZmFpbGVkIChlLmcuIG5ldHdvcmsgbG9jYXRpb24pCisgICAgICAgICAgICByZXR1cm4gcworICAgICAgICBzID0gYnVmWzpyZXNdLmVuY29kZSgibWJjcyIpCisgICAgICAgICMgSWdub3JlIGxlYWRpbmcgXFw/XAorICAgICAgICBpZiBzLnN0YXJ0c3dpdGgoIlxcXFw/XFwiKToKKyAgICAgICAgICAgIHMgPSBzWzQ6XQorICAgICAgICBpZiBzLnN0YXJ0c3dpdGgoIlVOQyIpOgorICAgICAgICAgICAgcyA9ICJcXCIgKyBzWzM6XQorICAgICAgICByZXR1cm4gcworCitwcmVmaXggPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwidGNsIikKK2lmIG5vdCBvcy5wYXRoLmV4aXN0cyhwcmVmaXgpOgorICAgICMgZGV2ZGlyLy4uL3RjbHRrL2xpYgorICAgIHByZWZpeCA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCBvcy5wYXRoLnBhcmRpciwgInRjbHRrIiwgImxpYiIpCisgICAgcHJlZml4ID0gb3MucGF0aC5hYnNwYXRoKHByZWZpeCkKKyMgaWYgdGhpcyBkb2VzIG5vdCBleGlzdCwgbm8gZnVydGhlciBzZWFyY2ggaXMgbmVlZGVkCitpZiBvcy5wYXRoLmV4aXN0cyhwcmVmaXgpOgorICAgIHByZWZpeCA9IGNvbnZlcnRfcGF0aChwcmVmaXgpCisgICAgaWYgIlRDTF9MSUJSQVJZIiBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihwcmVmaXgpOgorICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJ0Y2wiKToKKyAgICAgICAgICAgICAgICB0Y2xkaXIgPSBvcy5wYXRoLmpvaW4ocHJlZml4LG5hbWUpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0Y2xkaXIpOgorICAgICAgICAgICAgICAgICAgICBvcy5lbnZpcm9uWyJUQ0xfTElCUkFSWSJdID0gdGNsZGlyCisgICAgIyBDb21wdXRlIFRLX0xJQlJBUlksIGtub3dpbmcgdGhhdCBpdCBoYXMgdGhlIHNhbWUgdmVyc2lvbgorICAgICMgYXMgVGNsCisgICAgaW1wb3J0IF90a2ludGVyCisgICAgdmVyID0gc3RyKF90a2ludGVyLlRDTF9WRVJTSU9OKQorICAgIGlmICJUS19MSUJSQVJZIiBub3QgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgdiA9IG9zLnBhdGguam9pbihwcmVmaXgsICd0aycrdmVyKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4odiwgInRjbEluZGV4IikpOgorICAgICAgICAgICAgb3MuZW52aXJvblsnVEtfTElCUkFSWSddID0gdgorICAgICMgV2UgZG9uJ3Qga25vdyB0aGUgVGl4IHZlcnNpb24sIHNvIHdlIG11c3Qgc2VhcmNoIHRoZSBlbnRpcmUKKyAgICAjIGRpcmVjdG9yeQorICAgIGlmICJUSVhfTElCUkFSWSIgbm90IGluIG9zLmVudmlyb246CisgICAgICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIocHJlZml4KToKKyAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgidGl4Iik6CisgICAgICAgICAgICAgICAgdGl4ZGlyID0gb3MucGF0aC5qb2luKHByZWZpeCxuYW1lKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodGl4ZGlyKToKKyAgICAgICAgICAgICAgICAgICAgb3MuZW52aXJvblsiVElYX0xJQlJBUlkiXSA9IHRpeGRpcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNzk2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaXhUay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvRml4VGsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MDgyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9GaXhUay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvU2Nyb2xsZWRUZXh0LnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2Nyb2xsZWRUZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZWY3OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9TY3JvbGxlZFRleHQucHkKQEAgLTAsMCArMSw1NSBAQAorIiIiQSBTY3JvbGxlZFRleHQgd2lkZ2V0IGZlZWxzIGxpa2UgYSB0ZXh0IHdpZGdldCBidXQgYWxzbyBoYXMgYQordmVydGljYWwgc2Nyb2xsIGJhciBvbiBpdHMgcmlnaHQuICAoTGF0ZXIsIG9wdGlvbnMgbWF5IGJlIGFkZGVkIHRvCithZGQgYSBob3Jpem9udGFsIGJhciBhcyB3ZWxsLCB0byBtYWtlIHRoZSBiYXJzIGRpc2FwcGVhcgorYXV0b21hdGljYWxseSB3aGVuIG5vdCBuZWVkZWQsIHRvIG1vdmUgdGhlbSB0byB0aGUgb3RoZXIgc2lkZSBvZiB0aGUKK3dpbmRvdywgZXRjLikKKworQ29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIFRleHQgd2lkZ2V0LgorQSBGcmFtZSB3aWRnZXQgaXMgaW5zZXJ0ZWQgYmV0d2VlbiB0aGUgbWFzdGVyIGFuZCB0aGUgdGV4dCwgdG8gaG9sZAordGhlIFNjcm9sbGJhciB3aWRnZXQuCitNb3N0IG1ldGhvZHMgY2FsbHMgYXJlIGluaGVyaXRlZCBmcm9tIHRoZSBUZXh0IHdpZGdldDsgUGFjaywgR3JpZCBhbmQKK1BsYWNlIG1ldGhvZHMgYXJlIHJlZGlyZWN0ZWQgdG8gdGhlIEZyYW1lIHdpZGdldCBob3dldmVyLgorIiIiCisKK19fYWxsX18gPSBbJ1Njcm9sbGVkVGV4dCddCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgRnJhbWUsIFRleHQsIFNjcm9sbGJhciwgUGFjaywgR3JpZCwgUGxhY2UKK2Zyb20gVGtjb25zdGFudHMgaW1wb3J0IFJJR0hULCBMRUZULCBZLCBCT1RICisKK2NsYXNzIFNjcm9sbGVkVGV4dChUZXh0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICBzZWxmLmZyYW1lID0gRnJhbWUobWFzdGVyKQorICAgICAgICBzZWxmLnZiYXIgPSBTY3JvbGxiYXIoc2VsZi5mcmFtZSkKKyAgICAgICAgc2VsZi52YmFyLnBhY2soc2lkZT1SSUdIVCwgZmlsbD1ZKQorCisgICAgICAgIGt3LnVwZGF0ZSh7J3lzY3JvbGxjb21tYW5kJzogc2VsZi52YmFyLnNldH0pCisgICAgICAgIFRleHQuX19pbml0X18oc2VsZiwgc2VsZi5mcmFtZSwgKiprdykKKyAgICAgICAgc2VsZi5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9VHJ1ZSkKKyAgICAgICAgc2VsZi52YmFyWydjb21tYW5kJ10gPSBzZWxmLnl2aWV3CisKKyAgICAgICAgIyBDb3B5IGdlb21ldHJ5IG1ldGhvZHMgb2Ygc2VsZi5mcmFtZSB3aXRob3V0IG92ZXJyaWRpbmcgVGV4dAorICAgICAgICAjIG1ldGhvZHMgLS0gaGFjayEKKyAgICAgICAgdGV4dF9tZXRocyA9IHZhcnMoVGV4dCkua2V5cygpCisgICAgICAgIG1ldGhvZHMgPSB2YXJzKFBhY2spLmtleXMoKSArIHZhcnMoR3JpZCkua2V5cygpICsgdmFycyhQbGFjZSkua2V5cygpCisgICAgICAgIG1ldGhvZHMgPSBzZXQobWV0aG9kcykuZGlmZmVyZW5jZSh0ZXh0X21ldGhzKQorCisgICAgICAgIGZvciBtIGluIG1ldGhvZHM6CisgICAgICAgICAgICBpZiBtWzBdICE9ICdfJyBhbmQgbSAhPSAnY29uZmlnJyBhbmQgbSAhPSAnY29uZmlndXJlJzoKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG0sIGdldGF0dHIoc2VsZi5mcmFtZSwgbSkpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLmZyYW1lKQorCisKK2RlZiBleGFtcGxlKCk6CisgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgRU5ECisKKyAgICBzdGV4dCA9IFNjcm9sbGVkVGV4dChiZz0nd2hpdGUnLCBoZWlnaHQ9MTApCisgICAgc3RleHQuaW5zZXJ0KEVORCwgX19tYWluX18uX19kb2NfXykKKyAgICBzdGV4dC5wYWNrKGZpbGw9Qk9USCwgc2lkZT1MRUZULCBleHBhbmQ9VHJ1ZSkKKyAgICBzdGV4dC5mb2N1c19zZXQoKQorICAgIHN0ZXh0Lm1haW5sb29wKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBleGFtcGxlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1Njcm9sbGVkVGV4dC5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay9TY3JvbGxlZFRleHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzhkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9TY3JvbGxlZFRleHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1Njcm9sbGVkVGV4dC5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay9TY3JvbGxlZFRleHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMzhkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9TY3JvbGxlZFRleHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1NpbXBsZURpYWxvZy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL1NpbXBsZURpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjA4MzE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2ltcGxlRGlhbG9nLnB5CkBAIC0wLDAgKzEsMTEyIEBACisiIiJBIHNpbXBsZSBidXQgZmxleGlibGUgbW9kYWwgZGlhbG9nIGJveC4iIiIKKworCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKKworCitjbGFzcyBTaW1wbGVEaWFsb2c6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLAorICAgICAgICAgICAgICAgICB0ZXh0PScnLCBidXR0b25zPVtdLCBkZWZhdWx0PU5vbmUsIGNhbmNlbD1Ob25lLAorICAgICAgICAgICAgICAgICB0aXRsZT1Ob25lLCBjbGFzc189Tm9uZSk6CisgICAgICAgIGlmIGNsYXNzXzoKKyAgICAgICAgICAgIHNlbGYucm9vdCA9IFRvcGxldmVsKG1hc3RlciwgY2xhc3NfPWNsYXNzXykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucm9vdCA9IFRvcGxldmVsKG1hc3RlcikKKyAgICAgICAgaWYgdGl0bGU6CisgICAgICAgICAgICBzZWxmLnJvb3QudGl0bGUodGl0bGUpCisgICAgICAgICAgICBzZWxmLnJvb3QuaWNvbm5hbWUodGl0bGUpCisgICAgICAgIHNlbGYubWVzc2FnZSA9IE1lc3NhZ2Uoc2VsZi5yb290LCB0ZXh0PXRleHQsIGFzcGVjdD00MDApCisgICAgICAgIHNlbGYubWVzc2FnZS5wYWNrKGV4cGFuZD0xLCBmaWxsPUJPVEgpCisgICAgICAgIHNlbGYuZnJhbWUgPSBGcmFtZShzZWxmLnJvb3QpCisgICAgICAgIHNlbGYuZnJhbWUucGFjaygpCisgICAgICAgIHNlbGYubnVtID0gZGVmYXVsdAorICAgICAgICBzZWxmLmNhbmNlbCA9IGNhbmNlbAorICAgICAgICBzZWxmLmRlZmF1bHQgPSBkZWZhdWx0CisgICAgICAgIHNlbGYucm9vdC5iaW5kKCc8UmV0dXJuPicsIHNlbGYucmV0dXJuX2V2ZW50KQorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKGxlbihidXR0b25zKSk6CisgICAgICAgICAgICBzID0gYnV0dG9uc1tudW1dCisgICAgICAgICAgICBiID0gQnV0dG9uKHNlbGYuZnJhbWUsIHRleHQ9cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD0obGFtYmRhIHNlbGY9c2VsZiwgbnVtPW51bTogc2VsZi5kb25lKG51bSkpKQorICAgICAgICAgICAgaWYgbnVtID09IGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYi5jb25maWcocmVsaWVmPVJJREdFLCBib3JkZXJ3aWR0aD04KQorICAgICAgICAgICAgYi5wYWNrKHNpZGU9TEVGVCwgZmlsbD1CT1RILCBleHBhbmQ9MSkKKyAgICAgICAgc2VsZi5yb290LnByb3RvY29sKCdXTV9ERUxFVEVfV0lORE9XJywgc2VsZi53bV9kZWxldGVfd2luZG93KQorICAgICAgICBzZWxmLl9zZXRfdHJhbnNpZW50KG1hc3RlcikKKworICAgIGRlZiBfc2V0X3RyYW5zaWVudChzZWxmLCBtYXN0ZXIsIHJlbHg9MC41LCByZWx5PTAuMyk6CisgICAgICAgIHdpZGdldCA9IHNlbGYucm9vdAorICAgICAgICB3aWRnZXQud2l0aGRyYXcoKSAjIFJlbWFpbiBpbnZpc2libGUgd2hpbGUgd2UgZmlndXJlIG91dCB0aGUgZ2VvbWV0cnkKKyAgICAgICAgd2lkZ2V0LnRyYW5zaWVudChtYXN0ZXIpCisgICAgICAgIHdpZGdldC51cGRhdGVfaWRsZXRhc2tzKCkgIyBBY3R1YWxpemUgZ2VvbWV0cnkgaW5mb3JtYXRpb24KKyAgICAgICAgaWYgbWFzdGVyLndpbmZvX2lzbWFwcGVkKCk6CisgICAgICAgICAgICBtX3dpZHRoID0gbWFzdGVyLndpbmZvX3dpZHRoKCkKKyAgICAgICAgICAgIG1faGVpZ2h0ID0gbWFzdGVyLndpbmZvX2hlaWdodCgpCisgICAgICAgICAgICBtX3ggPSBtYXN0ZXIud2luZm9fcm9vdHgoKQorICAgICAgICAgICAgbV95ID0gbWFzdGVyLndpbmZvX3Jvb3R5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1fd2lkdGggPSBtYXN0ZXIud2luZm9fc2NyZWVud2lkdGgoKQorICAgICAgICAgICAgbV9oZWlnaHQgPSBtYXN0ZXIud2luZm9fc2NyZWVuaGVpZ2h0KCkKKyAgICAgICAgICAgIG1feCA9IG1feSA9IDAKKyAgICAgICAgd193aWR0aCA9IHdpZGdldC53aW5mb19yZXF3aWR0aCgpCisgICAgICAgIHdfaGVpZ2h0ID0gd2lkZ2V0LndpbmZvX3JlcWhlaWdodCgpCisgICAgICAgIHggPSBtX3ggKyAobV93aWR0aCAtIHdfd2lkdGgpICogcmVseAorICAgICAgICB5ID0gbV95ICsgKG1faGVpZ2h0IC0gd19oZWlnaHQpICogcmVseQorICAgICAgICBpZiB4K3dfd2lkdGggPiBtYXN0ZXIud2luZm9fc2NyZWVud2lkdGgoKToKKyAgICAgICAgICAgIHggPSBtYXN0ZXIud2luZm9fc2NyZWVud2lkdGgoKSAtIHdfd2lkdGgKKyAgICAgICAgZWxpZiB4IDwgMDoKKyAgICAgICAgICAgIHggPSAwCisgICAgICAgIGlmIHkrd19oZWlnaHQgPiBtYXN0ZXIud2luZm9fc2NyZWVuaGVpZ2h0KCk6CisgICAgICAgICAgICB5ID0gbWFzdGVyLndpbmZvX3NjcmVlbmhlaWdodCgpIC0gd19oZWlnaHQKKyAgICAgICAgZWxpZiB5IDwgMDoKKyAgICAgICAgICAgIHkgPSAwCisgICAgICAgIHdpZGdldC5nZW9tZXRyeSgiKyVkKyVkIiAlICh4LCB5KSkKKyAgICAgICAgd2lkZ2V0LmRlaWNvbmlmeSgpICMgQmVjb21lIHZpc2libGUgYXQgdGhlIGRlc2lyZWQgbG9jYXRpb24KKworICAgIGRlZiBnbyhzZWxmKToKKyAgICAgICAgc2VsZi5yb290LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIHNlbGYucm9vdC5ncmFiX3NldCgpCisgICAgICAgIHNlbGYucm9vdC5tYWlubG9vcCgpCisgICAgICAgIHNlbGYucm9vdC5kZXN0cm95KCkKKyAgICAgICAgcmV0dXJuIHNlbGYubnVtCisKKyAgICBkZWYgcmV0dXJuX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgaWYgc2VsZi5kZWZhdWx0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJvb3QuYmVsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRvbmUoc2VsZi5kZWZhdWx0KQorCisgICAgZGVmIHdtX2RlbGV0ZV93aW5kb3coc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2FuY2VsIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnJvb3QuYmVsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRvbmUoc2VsZi5jYW5jZWwpCisKKyAgICBkZWYgZG9uZShzZWxmLCBudW0pOgorICAgICAgICBzZWxmLm51bSA9IG51bQorICAgICAgICBzZWxmLnJvb3QucXVpdCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKworICAgIGRlZiB0ZXN0KCk6CisgICAgICAgIHJvb3QgPSBUaygpCisgICAgICAgIGRlZiBkb2l0KHJvb3Q9cm9vdCk6CisgICAgICAgICAgICBkID0gU2ltcGxlRGlhbG9nKHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dD0iVGhpcyBpcyBhIHRlc3QgZGlhbG9nLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldvdWxkIHRoaXMgaGF2ZSBiZWVuIGFuIGFjdHVhbCBkaWFsb2csICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgYnV0dG9ucyBiZWxvdyB3b3VsZCBoYXZlIGJlZW4gZ2xvd2luZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW4gc29mdCBwaW5rIGxpZ2h0LlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRvIHlvdSBiZWxpZXZlIHRoaXM/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b25zPVsiWWVzIiwgIk5vIiwgIkNhbmNlbCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWw9MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iVGVzdCBEaWFsb2ciKQorICAgICAgICAgICAgcHJpbnQgZC5nbygpCisgICAgICAgIHQgPSBCdXR0b24ocm9vdCwgdGV4dD0nVGVzdCcsIGNvbW1hbmQ9ZG9pdCkKKyAgICAgICAgdC5wYWNrKCkKKyAgICAgICAgcSA9IEJ1dHRvbihyb290LCB0ZXh0PSdRdWl0JywgY29tbWFuZD10LnF1aXQpCisgICAgICAgIHEucGFjaygpCisgICAgICAgIHQubWFpbmxvb3AoKQorCisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9TaW1wbGVEaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2ltcGxlRGlhbG9nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRlY2MyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2ltcGxlRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9TaW1wbGVEaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2ltcGxlRGlhbG9nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDRlY2MyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvU2ltcGxlRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9UaXgucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay9UaXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlkNzU3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RpeC5weQpAQCAtMCwwICsxLDE5NjcgQEAKKyMgLSotbW9kZTogcHl0aG9uOyBmaWxsLWNvbHVtbjogNzU7IHRhYi13aWR0aDogODsgY29kaW5nOiBpc28tbGF0aW4tMS11bml4IC0qLQorIworIyAkSWQkCisjCisjIFRpeC5weSAtLSBUaXggd2lkZ2V0IHdyYXBwZXJzLgorIworIyAgICAgICBGb3IgVGl4LCBzZWUgaHR0cDovL3RpeC5zb3VyY2Vmb3JnZS5uZXQKKyMKKyMgICAgICAgLSBTdWRoaXIgU2hlbm95IChzc2hlbm95QGdvbC5jb20pLCBEZWMuIDE5OTUuCisjICAgICAgICAgYmFzZWQgb24gYW4gaWRlYSBvZiBKZWFuLU1hcmMgTHVncmluIChsdWdyaW5AbXMuY29tKQorIworIyBOT1RFOiBJbiBvcmRlciB0byBtaW5pbWl6ZSBjaGFuZ2VzIHRvIFRraW50ZXIucHksIHNvbWUgb2YgdGhlIGNvZGUgaGVyZQorIyAgICAgICAoVGl4V2lkZ2V0Ll9faW5pdF9fKSBoYXMgYmVlbiB0YWtlbiBmcm9tIFRraW50ZXIgKFdpZGdldC5fX2luaXRfXykKKyMgICAgICAgYW5kIHdpbGwgYnJlYWsgaWYgdGhlcmUgYXJlIG1ham9yIGNoYW5nZXMgaW4gVGtpbnRlci4KKyMKKyMgVGhlIFRpeCB3aWRnZXRzIGFyZSByZXByZXNlbnRlZCBieSBhIGNsYXNzIGhpZXJhcmNoeSBpbiBweXRob24gd2l0aCBwcm9wZXIKKyMgaW5oZXJpdGFuY2Ugb2YgYmFzZSBjbGFzc2VzLgorIworIyBBcyBhIHJlc3VsdCBhZnRlciBjcmVhdGluZyBhICd3ID0gU3RkQnV0dG9uQm94JywgSSBjYW4gd3JpdGUKKyMgICAgICAgICAgICAgIHcub2tbJ3RleHQnXSA9ICdXaG8gQ2FyZXMnCisjICAgIG9yICAgICAgICAgICAgICB3Lm9rWydiZyddID0gd1snYmcnXQorIyBvciBldmVuICAgICAgIHcub2suaW52b2tlKCkKKyMgZXRjLgorIworIyBDb21wYXJlIHRoZSBkZW1vIHRpeHdpZGdldHMucHkgdG8gdGhlIG9yaWdpbmFsIFRjbCBwcm9ncmFtIGFuZCB5b3Ugd2lsbAorIyBhcHByZWNpYXRlIHRoZSBhZHZhbnRhZ2VzLgorIworCitmcm9tIFRraW50ZXIgaW1wb3J0ICoKK2Zyb20gVGtpbnRlciBpbXBvcnQgX2ZsYXR0ZW4sIF9jbmZtZXJnZSwgX2RlZmF1bHRfcm9vdAorCisjIFdBUk5JTkcgLSBUa1ZlcnNpb24gaXMgYSBsaW1pdGVkIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXIKK2lmIFRrVmVyc2lvbiA8IDMuOTk5OgorICAgIHJhaXNlIEltcG9ydEVycm9yLCAiVGhpcyB2ZXJzaW9uIG9mIFRpeC5weSByZXF1aXJlcyBUayA0LjAgb3IgaGlnaGVyIgorCitpbXBvcnQgX3RraW50ZXIgIyBJZiB0aGlzIGZhaWxzIHlvdXIgUHl0aG9uIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgVGsKKworIyBTb21lIG1vcmUgY29uc3RhbnRzIChmb3IgY29uc2lzdGVuY3kgd2l0aCBUa2ludGVyKQorV0lORE9XID0gJ3dpbmRvdycKK1RFWFQgPSAndGV4dCcKK1NUQVRVUyA9ICdzdGF0dXMnCitJTU1FRElBVEUgPSAnaW1tZWRpYXRlJworSU1BR0UgPSAnaW1hZ2UnCitJTUFHRVRFWFQgPSAnaW1hZ2V0ZXh0JworQkFMTE9PTiA9ICdiYWxsb29uJworQVVUTyA9ICdhdXRvJworQUNST1NTVE9QID0gJ2Fjcm9zc3RvcCcKKworIyBBIGZldyB1c2VmdWwgY29uc3RhbnRzIGZvciB0aGUgR3JpZCB3aWRnZXQKK0FTQ0lJID0gJ2FzY2lpJworQ0VMTCA9ICdjZWxsJworQ09MVU1OID0gJ2NvbHVtbicKK0RFQ1JFQVNJTkcgPSAnZGVjcmVhc2luZycKK0lOQ1JFQVNJTkcgPSAnaW5jcmVhc2luZycKK0lOVEVHRVIgPSAnaW50ZWdlcicKK01BSU4gPSAnbWFpbicKK01BWCA9ICdtYXgnCitSRUFMID0gJ3JlYWwnCitST1cgPSAncm93JworU19SRUdJT04gPSAncy1yZWdpb24nCitYX1JFR0lPTiA9ICd4LXJlZ2lvbicKK1lfUkVHSU9OID0gJ3ktcmVnaW9uJworCisjIFNvbWUgY29uc3RhbnRzIHVzZWQgYnkgVGtpbnRlciBkb29uZWV2ZW50KCkKK1RDTF9ET05UX1dBSVQgICAgID0gMSA8PCAxCitUQ0xfV0lORE9XX0VWRU5UUyA9IDEgPDwgMgorVENMX0ZJTEVfRVZFTlRTICAgPSAxIDw8IDMKK1RDTF9USU1FUl9FVkVOVFMgID0gMSA8PCA0CitUQ0xfSURMRV9FVkVOVFMgICA9IDEgPDwgNQorVENMX0FMTF9FVkVOVFMgICAgPSAwCisKKyMgQkVXQVJFIC0gdGhpcyBpcyBpbXBsZW1lbnRlZCBieSBjb3B5aW5nIHNvbWUgY29kZSBmcm9tIHRoZSBXaWRnZXQgY2xhc3MKKyMgICAgICAgICAgaW4gVGtpbnRlciAodG8gb3ZlcnJpZGUgV2lkZ2V0IGluaXRpYWxpemF0aW9uKSBhbmQgaXMgdGhlcmVmb3JlCisjICAgICAgICAgIGxpYWJsZSB0byBicmVhay4KK2ltcG9ydCBUa2ludGVyLCBvcworCisjIENvdWxkIHByb2JhYmx5IGFkZCB0aGlzIHRvIFRraW50ZXIuTWlzYworY2xhc3MgdGl4Q29tbWFuZDoKKyAgICAiIiJUaGUgdGl4IGNvbW1hbmRzIHByb3ZpZGUgYWNjZXNzIHRvIG1pc2NlbGxhbmVvdXMgIGVsZW1lbnRzCisgICAgb2YgIFRpeCdzICBpbnRlcm5hbCBzdGF0ZSBhbmQgdGhlIFRpeCBhcHBsaWNhdGlvbiBjb250ZXh0LgorICAgIE1vc3Qgb2YgdGhlIGluZm9ybWF0aW9uIG1hbmlwdWxhdGVkIGJ5IHRoZXNlICBjb21tYW5kcyBwZXJ0YWlucworICAgIHRvICB0aGUgIGFwcGxpY2F0aW9uICBhcyBhIHdob2xlLCBvciB0byBhIHNjcmVlbiBvcgorICAgIGRpc3BsYXksIHJhdGhlciB0aGFuIHRvIGEgcGFydGljdWxhciB3aW5kb3cuCisKKyAgICBUaGlzIGlzIGEgbWl4aW4gY2xhc3MsIGFzc3VtZWQgdG8gYmUgbWl4ZWQgdG8gVGtpbnRlci5UaworICAgIHRoYXQgc3VwcG9ydHMgdGhlIHNlbGYudGsuY2FsbCBtZXRob2QuCisgICAgIiIiCisKKyAgICBkZWYgdGl4X2FkZGJpdG1hcGRpcihzZWxmLCBkaXJlY3RvcnkpOgorICAgICAgICAiIiJUaXggbWFpbnRhaW5zIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB1bmRlciB3aGljaAorICAgICAgICB0aGUgIHRpeF9nZXRpbWFnZSAgYW5kIHRpeF9nZXRiaXRtYXAgY29tbWFuZHMgd2lsbAorICAgICAgICBzZWFyY2ggZm9yIGltYWdlIGZpbGVzLiBUaGUgc3RhbmRhcmQgYml0bWFwICBkaXJlY3RvcnkKKyAgICAgICAgaXMgJFRJWF9MSUJSQVJZL2JpdG1hcHMuIFRoZSBhZGRiaXRtYXBkaXIgY29tbWFuZAorICAgICAgICBhZGRzIGRpcmVjdG9yeSBpbnRvIHRoaXMgbGlzdC4gQnkgIHVzaW5nICB0aGlzCisgICAgICAgIGNvbW1hbmQsIHRoZSAgaW1hZ2UgIGZpbGVzICBvZiBhbiBhcHBsaWNhdGlvbnMgY2FuCisgICAgICAgIGFsc28gYmUgbG9jYXRlZCB1c2luZyB0aGUgdGl4X2dldGltYWdlIG9yIHRpeF9nZXRiaXRtYXAKKyAgICAgICAgY29tbWFuZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeCcsICdhZGRiaXRtYXBkaXInLCBkaXJlY3RvcnkpCisKKyAgICBkZWYgdGl4X2NnZXQoc2VsZiwgb3B0aW9uKToKKyAgICAgICAgIiIiUmV0dXJucyAgdGhlICBjdXJyZW50ICB2YWx1ZSAgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgb3B0aW9uIGdpdmVuIGJ5IG9wdGlvbi4gT3B0aW9uIG1heSBiZSAgYW55ICBvZiAgdGhlCisgICAgICAgIG9wdGlvbnMgZGVzY3JpYmVkIGluIHRoZSBDT05GSUdVUkFUSU9OIE9QVElPTlMgc2VjdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeCcsICdjZ2V0Jywgb3B0aW9uKQorCisgICAgZGVmIHRpeF9jb25maWd1cmUoc2VsZiwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJRdWVyeSBvciBtb2RpZnkgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvZiB0aGUgVGl4IGFwcGxpY2F0aW9uCisgICAgICAgIGNvbnRleHQuIElmIG5vIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHJldHVybnMgYSBkaWN0aW9uYXJ5IGFsbCBvZiB0aGUKKyAgICAgICAgYXZhaWxhYmxlIG9wdGlvbnMuICBJZiBvcHRpb24gaXMgc3BlY2lmaWVkIHdpdGggbm8gdmFsdWUsIHRoZW4gdGhlCisgICAgICAgIGNvbW1hbmQgcmV0dXJucyBhIGxpc3QgZGVzY3JpYmluZyB0aGUgb25lIG5hbWVkIG9wdGlvbiAodGhpcyBsaXN0CisgICAgICAgIHdpbGwgYmUgaWRlbnRpY2FsIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN1Ymxpc3Qgb2YgdGhlIHZhbHVlCisgICAgICAgIHJldHVybmVkIGlmIG5vIG9wdGlvbiBpcyBzcGVjaWZpZWQpLiAgSWYgb25lIG9yIG1vcmUgb3B0aW9uLXZhbHVlCisgICAgICAgIHBhaXJzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdGhlIGNvbW1hbmQgbW9kaWZpZXMgdGhlIGdpdmVuIG9wdGlvbihzKQorICAgICAgICB0byBoYXZlIHRoZSBnaXZlbiB2YWx1ZShzKTsgaW4gdGhpcyBjYXNlIHRoZSBjb21tYW5kIHJldHVybnMgYW4KKyAgICAgICAgZW1wdHkgc3RyaW5nLiBPcHRpb24gbWF5IGJlIGFueSBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgIyBDb3BpZWQgZnJvbSBUa2ludGVyLnB5CisgICAgICAgIGlmIGt3OgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKChjbmYsIGt3KSkKKyAgICAgICAgZWxpZiBjbmY6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoY25mKQorICAgICAgICBpZiBjbmYgaXMgTm9uZToKKyAgICAgICAgICAgIGNuZiA9IHt9CisgICAgICAgICAgICBmb3IgeCBpbiBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbCgndGl4JywgJ2NvbmZpZ3VyZScpKToKKyAgICAgICAgICAgICAgICBjbmZbeFswXVsxOl1dID0gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICAgICAgcmV0dXJuIGNuZgorICAgICAgICBpZiBpc2luc3RhbmNlKGNuZiwgU3RyaW5nVHlwZSk6CisgICAgICAgICAgICB4ID0gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoJ3RpeCcsICdjb25maWd1cmUnLCAnLScrY25mKSkKKyAgICAgICAgICAgIHJldHVybiAoeFswXVsxOl0sKSArIHhbMTpdCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoKCd0aXgnLCAnY29uZmlndXJlJykgKyBzZWxmLl9vcHRpb25zKGNuZikpCisKKyAgICBkZWYgdGl4X2ZpbGVkaWFsb2coc2VsZiwgZGxnY2xhc3M9Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB0aGF0IG1heSBiZSBzaGFyZWQgYW1vbmcKKyAgICAgICAgZGlmZmVyZW50IGNhbGxzIGZyb20gdGhpcyBhcHBsaWNhdGlvbi4gIFRoaXMgY29tbWFuZCB3aWxsIGNyZWF0ZSBhCisgICAgICAgIGZpbGUgc2VsZWN0aW9uIGRpYWxvZyB3aWRnZXQgd2hlbiBpdCBpcyBjYWxsZWQgdGhlIGZpcnN0IHRpbWUuIFRoaXMKKyAgICAgICAgZGlhbG9nIHdpbGwgYmUgcmV0dXJuZWQgYnkgYWxsIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGl4X2ZpbGVkaWFsb2cuCisgICAgICAgIEFuIG9wdGlvbmFsIGRsZ2NsYXNzIHBhcmFtZXRlciBjYW4gYmUgcGFzc2VkIHRvIHNwZWNpZmllZCB3aGF0IHR5cGUKKyAgICAgICAgb2YgZmlsZSBzZWxlY3Rpb24gZGlhbG9nIHdpZGdldCBpcyBkZXNpcmVkLiBQb3NzaWJsZSBvcHRpb25zIGFyZQorICAgICAgICB0aXggRmlsZVNlbGVjdERpYWxvZyBvciB0aXhFeEZpbGVTZWxlY3REaWFsb2cuCisgICAgICAgICIiIgorICAgICAgICBpZiBkbGdjbGFzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeCcsICdmaWxlZGlhbG9nJywgZGxnY2xhc3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXgnLCAnZmlsZWRpYWxvZycpCisKKyAgICBkZWYgdGl4X2dldGJpdG1hcChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiTG9jYXRlcyBhIGJpdG1hcCBmaWxlIG9mIHRoZSBuYW1lIG5hbWUueHBtIG9yIG5hbWUgaW4gb25lIG9mIHRoZQorICAgICAgICBiaXRtYXAgZGlyZWN0b3JpZXMgKHNlZSB0aGUgdGl4X2FkZGJpdG1hcGRpciBjb21tYW5kIGFib3ZlKS4gIEJ5CisgICAgICAgIHVzaW5nIHRpeF9nZXRiaXRtYXAsIHlvdSBjYW4gYXZvaWQgaGFyZCBjb2RpbmcgdGhlIHBhdGhuYW1lcyBvZiB0aGUKKyAgICAgICAgYml0bWFwIGZpbGVzIGluIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gc3VjY2Vzc2Z1bCwgaXQgcmV0dXJucyB0aGUKKyAgICAgICAgY29tcGxldGUgcGF0aG5hbWUgb2YgdGhlIGJpdG1hcCBmaWxlLCBwcmVmaXhlZCB3aXRoIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgJ0AnLiAgVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgLWJpdG1hcAorICAgICAgICBvcHRpb24gb2YgdGhlIFRLIGFuZCBUaXggd2lkZ2V0cy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeCcsICdnZXRiaXRtYXAnLCBuYW1lKQorCisgICAgZGVmIHRpeF9nZXRpbWFnZShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiTG9jYXRlcyBhbiBpbWFnZSBmaWxlIG9mIHRoZSBuYW1lIG5hbWUueHBtLCBuYW1lLnhibSBvciBuYW1lLnBwbQorICAgICAgICBpbiBvbmUgb2YgdGhlIGJpdG1hcCBkaXJlY3RvcmllcyAoc2VlIHRoZSBhZGRiaXRtYXBkaXIgY29tbWFuZAorICAgICAgICBhYm92ZSkuIElmIG1vcmUgdGhhbiBvbmUgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKGJ1dCBkaWZmZXJlbnQKKyAgICAgICAgZXh0ZW5zaW9ucykgZXhpc3QsIHRoZW4gdGhlIGltYWdlIHR5cGUgaXMgY2hvc2VuIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgZGVwdGggb2YgdGhlIFggZGlzcGxheTogeGJtIGltYWdlcyBhcmUgY2hvc2VuIG9uIG1vbm9jaHJvbWUKKyAgICAgICAgZGlzcGxheXMgYW5kIGNvbG9yIGltYWdlcyBhcmUgY2hvc2VuIG9uIGNvbG9yIGRpc3BsYXlzLiBCeSB1c2luZworICAgICAgICB0aXhfIGdldGltYWdlLCB5b3UgY2FuIGF2b2lkIGhhcmQgY29kaW5nIHRoZSBwYXRobmFtZXMgb2YgdGhlCisgICAgICAgIGltYWdlIGZpbGVzIGluIHlvdXIgYXBwbGljYXRpb24uIFdoZW4gc3VjY2Vzc2Z1bCwgdGhpcyBjb21tYW5kCisgICAgICAgIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgaW1hZ2UsIHdoaWNoIGNhbiBiZSB1c2VkIHRvCisgICAgICAgIGNvbmZpZ3VyZSB0aGUgLWltYWdlIG9wdGlvbiBvZiB0aGUgVGsgYW5kIFRpeCB3aWRnZXRzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGl4JywgJ2dldGltYWdlJywgbmFtZSkKKworICAgIGRlZiB0aXhfb3B0aW9uX2dldChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiR2V0cyAgdGhlIG9wdGlvbnMgIG1haW50YWluZWQgIGJ5ICB0aGUgIFRpeAorICAgICAgICBzY2hlbWUgbWVjaGFuaXNtLiBBdmFpbGFibGUgb3B0aW9ucyBpbmNsdWRlOgorCisgICAgICAgICAgICBhY3RpdmVfYmcgICAgICAgYWN0aXZlX2ZnICAgICAgYmcKKyAgICAgICAgICAgIGJvbGRfZm9udCAgICAgICBkYXJrMV9iZyAgICAgICBkYXJrMV9mZworICAgICAgICAgICAgZGFyazJfYmcgICAgICAgIGRhcmsyX2ZnICAgICAgIGRpc2FibGVkX2ZnCisgICAgICAgICAgICBmZyAgICAgICAgICAgICAgZml4ZWRfZm9udCAgICAgZm9udAorICAgICAgICAgICAgaW5hY3RpdmVfYmcgICAgIGluYWN0aXZlX2ZnICAgIGlucHV0MV9iZworICAgICAgICAgICAgaW5wdXQyX2JnICAgICAgIGl0YWxpY19mb250ICAgIGxpZ2h0MV9iZworICAgICAgICAgICAgbGlnaHQxX2ZnICAgICAgIGxpZ2h0Ml9iZyAgICAgIGxpZ2h0Ml9mZworICAgICAgICAgICAgbWVudV9mb250ICAgICAgIG91dHB1dDFfYmcgICAgIG91dHB1dDJfYmcKKyAgICAgICAgICAgIHNlbGVjdF9iZyAgICAgICBzZWxlY3RfZmcgICAgICBzZWxlY3RvcgorICAgICAgICAgICAgIiIiCisgICAgICAgICMgY291bGQgdXNlIHNlbGYudGsuZ2xvYmFsZ2V0dmFyKCd0aXhPcHRpb24nLCBuYW1lKQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXgnLCAnb3B0aW9uJywgJ2dldCcsIG5hbWUpCisKKyAgICBkZWYgdGl4X3Jlc2V0b3B0aW9ucyhzZWxmLCBuZXdTY2hlbWUsIG5ld0ZvbnRTZXQsIG5ld1NjbVByaW89Tm9uZSk6CisgICAgICAgICIiIlJlc2V0cyB0aGUgc2NoZW1lIGFuZCBmb250c2V0IG9mIHRoZSBUaXggYXBwbGljYXRpb24gdG8KKyAgICAgICAgbmV3U2NoZW1lIGFuZCBuZXdGb250U2V0LCByZXNwZWN0aXZlbHkuICBUaGlzIGFmZmVjdHMgb25seSB0aG9zZQorICAgICAgICB3aWRnZXRzIGNyZWF0ZWQgYWZ0ZXIgdGhpcyBjYWxsLiBUaGVyZWZvcmUsIGl0IGlzIGJlc3QgdG8gY2FsbCB0aGUKKyAgICAgICAgcmVzZXRvcHRpb25zIGNvbW1hbmQgYmVmb3JlIHRoZSBjcmVhdGlvbiBvZiBhbnkgd2lkZ2V0cyBpbiBhIFRpeAorICAgICAgICBhcHBsaWNhdGlvbi4KKworICAgICAgICBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG5ld1NjbVByaW8gY2FuIGJlIGdpdmVuIHRvIHJlc2V0IHRoZQorICAgICAgICBwcmlvcml0eSBsZXZlbCBvZiB0aGUgVGsgb3B0aW9ucyBzZXQgYnkgdGhlIFRpeCBzY2hlbWVzLgorCisgICAgICAgIEJlY2F1c2Ugb2YgdGhlIHdheSBUayBoYW5kbGVzIHRoZSBYIG9wdGlvbiBkYXRhYmFzZSwgYWZ0ZXIgVGl4IGhhcworICAgICAgICBiZWVuIGhhcyBpbXBvcnRlZCBhbmQgaW5pdGVkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVzZXQgdGhlIGNvbG9yCisgICAgICAgIHNjaGVtZXMgYW5kIGZvbnQgc2V0cyB1c2luZyB0aGUgdGl4IGNvbmZpZyBjb21tYW5kLiAgSW5zdGVhZCwgdGhlCisgICAgICAgIHRpeF9yZXNldG9wdGlvbnMgY29tbWFuZCBtdXN0IGJlIHVzZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBuZXdTY21QcmlvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGl4JywgJ3Jlc2V0b3B0aW9ucycsIG5ld1NjaGVtZSwgbmV3Rm9udFNldCwgbmV3U2NtUHJpbykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeCcsICdyZXNldG9wdGlvbnMnLCBuZXdTY2hlbWUsIG5ld0ZvbnRTZXQpCisKK2NsYXNzIFRrKFRraW50ZXIuVGssIHRpeENvbW1hbmQpOgorICAgICIiIlRvcGxldmVsIHdpZGdldCBvZiBUaXggd2hpY2ggcmVwcmVzZW50cyBtb3N0bHkgdGhlIG1haW4gd2luZG93CisgICAgb2YgYW4gYXBwbGljYXRpb24uIEl0IGhhcyBhbiBhc3NvY2lhdGVkIFRjbCBpbnRlcnByZXRlci4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2NyZWVuTmFtZT1Ob25lLCBiYXNlTmFtZT1Ob25lLCBjbGFzc05hbWU9J1RpeCcpOgorICAgICAgICBUa2ludGVyLlRrLl9faW5pdF9fKHNlbGYsIHNjcmVlbk5hbWUsIGJhc2VOYW1lLCBjbGFzc05hbWUpCisgICAgICAgIHRpeGxpYiA9IG9zLmVudmlyb24uZ2V0KCdUSVhfTElCUkFSWScpCisgICAgICAgIHNlbGYudGsuZXZhbCgnZ2xvYmFsIGF1dG9fcGF0aDsgbGFwcGVuZCBhdXRvX3BhdGggW2ZpbGUgZGlyIFtpbmZvIG5hbWVvZl1dJykKKyAgICAgICAgaWYgdGl4bGliIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50ay5ldmFsKCdnbG9iYWwgYXV0b19wYXRoOyBsYXBwZW5kIGF1dG9fcGF0aCB7JXN9JyAlIHRpeGxpYikKKyAgICAgICAgICAgIHNlbGYudGsuZXZhbCgnZ2xvYmFsIHRjbF9wa2dQYXRoOyBsYXBwZW5kIHRjbF9wa2dQYXRoIHslc30nICUgdGl4bGliKQorICAgICAgICAjIExvYWQgVGl4IC0gdGhpcyBzaG91bGQgd29yayBkeW5hbWljYWxseSBvciBzdGF0aWNhbGx5CisgICAgICAgICMgSWYgaXQncyBzdGF0aWMsIHRjbC90aXg4LjEvcGtnSW5kZXgudGNsIHNob3VsZCBoYXZlCisgICAgICAgICMgICAgICAgICAgICAgICAnbG9hZCB7fSBUaXgnCisgICAgICAgICMgSWYgaXQncyBkeW5hbWljIHVuZGVyIFVuaXgsIHRjbC90aXg4LjEvcGtnSW5kZXgudGNsIHNob3VsZCBoYXZlCisgICAgICAgICMgICAgICAgICAgICAgICAnbG9hZCBsaWJ0aXg4LjEuOC4zLnNvIFRpeCcKKyAgICAgICAgc2VsZi50ay5ldmFsKCdwYWNrYWdlIHJlcXVpcmUgVGl4JykKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAjIEZvciBzYWZldHksIHJlbW92ZSBhbiBkZWxldGVfd2luZG93IGJpbmRpbmcgYmVmb3JlIGRlc3Ryb3kKKyAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsICIiKQorICAgICAgICBUa2ludGVyLlRrLmRlc3Ryb3koc2VsZikKKworIyBUaGUgVGl4ICd0aXhGb3JtJyBnZW9tZXRyeSBtYW5hZ2VyCitjbGFzcyBGb3JtOgorICAgICIiIlRoZSBUaXggRm9ybSBnZW9tZXRyeSBtYW5hZ2VyCisKKyAgICBXaWRnZXRzIGNhbiBiZSBhcnJhbmdlZCBieSBzcGVjaWZ5aW5nIGF0dGFjaG1lbnRzIHRvIG90aGVyIHdpZGdldHMuCisgICAgU2VlIFRpeCBkb2N1bWVudGF0aW9uIGZvciBjb21wbGV0ZSBkZXRhaWxzIiIiCisKKyAgICBkZWYgY29uZmlnKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGl4Rm9ybScsIHNlbGYuX3csICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZm9ybSA9IGNvbmZpZworCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBGb3JtLmZvcm0oc2VsZiwge2tleTogdmFsdWV9KQorCisgICAgZGVmIGNoZWNrKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXhGb3JtJywgJ2NoZWNrJywgc2VsZi5fdykKKworICAgIGRlZiBmb3JnZXQoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGl4Rm9ybScsICdmb3JnZXQnLCBzZWxmLl93KQorCisgICAgZGVmIGdyaWQoc2VsZiwgeHNpemU9MCwgeXNpemU9MCk6CisgICAgICAgIGlmIChub3QgeHNpemUpIGFuZCAobm90IHlzaXplKToKKyAgICAgICAgICAgIHggPSBzZWxmLnRrLmNhbGwoJ3RpeEZvcm0nLCAnZ3JpZCcsIHNlbGYuX3cpCisgICAgICAgICAgICB5ID0gc2VsZi50ay5zcGxpdGxpc3QoeCkKKyAgICAgICAgICAgIHogPSAoKQorICAgICAgICAgICAgZm9yIHggaW4geToKKyAgICAgICAgICAgICAgICB6ID0geiArIChzZWxmLnRrLmdldGludCh4KSwpCisgICAgICAgICAgICByZXR1cm4gegorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXhGb3JtJywgJ2dyaWQnLCBzZWxmLl93LCB4c2l6ZSwgeXNpemUpCisKKyAgICBkZWYgaW5mbyhzZWxmLCBvcHRpb249Tm9uZSk6CisgICAgICAgIGlmIG5vdCBvcHRpb246CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd0aXhGb3JtJywgJ2luZm8nLCBzZWxmLl93KQorICAgICAgICBpZiBvcHRpb25bMF0gIT0gJy0nOgorICAgICAgICAgICAgb3B0aW9uID0gJy0nICsgb3B0aW9uCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RpeEZvcm0nLCAnaW5mbycsIHNlbGYuX3csIG9wdGlvbikKKworICAgIGRlZiBzbGF2ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBtYXAoc2VsZi5fbmFtZXRvd2lkZ2V0LAorICAgICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICAgICAgICd0aXhGb3JtJywgJ3NsYXZlcycsIHNlbGYuX3cpKSkKKworCisKK1RraW50ZXIuV2lkZ2V0Ll9fYmFzZXNfXyA9IFRraW50ZXIuV2lkZ2V0Ll9fYmFzZXNfXyArIChGb3JtLCkKKworY2xhc3MgVGl4V2lkZ2V0KFRraW50ZXIuV2lkZ2V0KToKKyAgICAiIiJBIFRpeFdpZGdldCBjbGFzcyBpcyB1c2VkIHRvIHBhY2thZ2UgYWxsIChvciBtb3N0KSBUaXggd2lkZ2V0cy4KKworICAgIFdpZGdldCBpbml0aWFsaXphdGlvbiBpcyBleHRlbmRlZCBpbiB0d28gd2F5czoKKyAgICAgICAxKSBJdCBpcyBwb3NzaWJsZSB0byBnaXZlIGEgbGlzdCBvZiBvcHRpb25zIHdoaWNoIG11c3QgYmUgcGFydCBvZgorICAgICAgIHRoZSBjcmVhdGlvbiBjb21tYW5kIChzbyBjYWxsZWQgVGl4ICdzdGF0aWMnIG9wdGlvbnMpLiBUaGVzZSBjYW5ub3QgYmUKKyAgICAgICBnaXZlbiBhcyBhICdjb25maWcnIGNvbW1hbmQgbGF0ZXIuCisgICAgICAgMikgSXQgaXMgcG9zc2libGUgdG8gZ2l2ZSB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBUSyB3aWRnZXQuIFRoZXNlIGFyZQorICAgICAgIGNoaWxkIHdpZGdldHMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgVGl4IG1lZ2Etd2lkZ2V0LiBUaGUgVGsgY2FsbAorICAgICAgIHRvIGNyZWF0ZSB0aGVzZSB3aWRnZXRzIGlzIHRoZXJlZm9yZSBieXBhc3NlZCBpbiBUaXhXaWRnZXQuX19pbml0X18KKworICAgIEJvdGggb3B0aW9ucyBhcmUgZm9yIHVzZSBieSBzdWJjbGFzc2VzIG9ubHkuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCBtYXN0ZXI9Tm9uZSwgd2lkZ2V0TmFtZT1Ob25lLAorICAgICAgICAgICAgICAgIHN0YXRpY19vcHRpb25zPU5vbmUsIGNuZj17fSwga3c9e30pOgorICAgICAgICAjIE1lcmdlIGtleXdvcmRzIGFuZCBkaWN0aW9uYXJ5IGFyZ3VtZW50cworICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoY25mKQorCisgICAgICAgICMgTW92ZSBzdGF0aWMgb3B0aW9ucyBpbnRvIGV4dHJhLiBzdGF0aWNfb3B0aW9ucyBtdXN0IGJlCisgICAgICAgICMgYSBsaXN0IG9mIGtleXdvcmRzIChvciBOb25lKS4KKyAgICAgICAgZXh0cmE9KCkKKworICAgICAgICAjICdvcHRpb25zJyBpcyBhbHdheXMgYSBzdGF0aWMgb3B0aW9uCisgICAgICAgIGlmIHN0YXRpY19vcHRpb25zOgorICAgICAgICAgICAgc3RhdGljX29wdGlvbnMuYXBwZW5kKCdvcHRpb25zJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXRpY19vcHRpb25zID0gWydvcHRpb25zJ10KKworICAgICAgICBmb3Igayx2IGluIGNuZi5pdGVtcygpWzpdOgorICAgICAgICAgICAgaWYgayBpbiBzdGF0aWNfb3B0aW9uczoKKyAgICAgICAgICAgICAgICBleHRyYSA9IGV4dHJhICsgKCctJyArIGssIHYpCisgICAgICAgICAgICAgICAgZGVsIGNuZltrXQorCisgICAgICAgIHNlbGYud2lkZ2V0TmFtZSA9IHdpZGdldE5hbWUKKyAgICAgICAgV2lkZ2V0Ll9zZXR1cChzZWxmLCBtYXN0ZXIsIGNuZikKKworICAgICAgICAjIElmIHdpZGdldE5hbWUgaXMgTm9uZSwgdGhpcyBpcyBhIGR1bW15IGNyZWF0aW9uIGNhbGwgd2hlcmUgdGhlCisgICAgICAgICMgY29ycmVzcG9uZGluZyBUayB3aWRnZXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGJ5IFRpeAorICAgICAgICBpZiB3aWRnZXROYW1lOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHdpZGdldE5hbWUsIHNlbGYuX3csICpleHRyYSkKKworICAgICAgICAjIE5vbi1zdGF0aWMgb3B0aW9ucyAtIHRvIGJlIGRvbmUgdmlhIGEgJ2NvbmZpZycgY29tbWFuZAorICAgICAgICBpZiBjbmY6CisgICAgICAgICAgICBXaWRnZXQuY29uZmlnKHNlbGYsIGNuZikKKworICAgICAgICAjIERpY3Rpb25hcnkgdG8gaG9sZCBzdWJ3aWRnZXQgbmFtZXMgZm9yIGVhc2llciBhY2Nlc3MuIFdlIGNhbid0CisgICAgICAgICMgdXNlIHRoZSBjaGlsZHJlbiBsaXN0IGJlY2F1c2UgdGhlIHB1YmxpYyBUaXggbmFtZXMgbWF5IG5vdCBiZSB0aGUKKyAgICAgICAgIyBzYW1lIGFzIHRoZSBwYXRobmFtZSBjb21wb25lbnQKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdCA9IHt9CisKKyAgICAjIFdlIHNldCB1cCBhbiBhdHRyaWJ1dGUgYWNjZXNzIGZ1bmN0aW9uIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KKyAgICAjIGRvIHcub2tbJ3RleHQnXSA9ICdIZWxsbycgcmF0aGVyIHRoYW4gdy5zdWJ3aWRnZXQoJ29rJylbJ3RleHQnXSA9ICdIZWxsbycKKyAgICAjIHdoZW4gdyBpcyBhIFN0ZEJ1dHRvbkJveC4KKyAgICAjIFdlIGNhbiBldmVuIGRvIHcub2suaW52b2tlKCkgYmVjYXVzZSB3Lm9rIGlzIHN1YmNsYXNzZWQgZnJvbSB0aGUKKyAgICAjIEJ1dHRvbiBjbGFzcyBpZiB5b3UgZ28gdGhyb3VnaCB0aGUgcHJvcGVyIGNvbnN0cnVjdG9ycworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnN1YndpZGdldF9saXN0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0KKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKworICAgIGRlZiBzZXRfc2lsZW50KHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiU2V0IGEgdmFyaWFibGUgd2l0aG91dCBjYWxsaW5nIGl0cyBhY3Rpb24gcm91dGluZSIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RpeFNldFNpbGVudCcsIHNlbGYuX3csIHZhbHVlKQorCisgICAgZGVmIHN1YndpZGdldChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lZCBzdWJ3aWRnZXQgKHdoaWNoIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgYnkKKyAgICAgICAgdGhlIHN1Yi1jbGFzcykuIiIiCisgICAgICAgIG4gPSBzZWxmLl9zdWJ3aWRnZXRfbmFtZShuYW1lKQorICAgICAgICBpZiBub3QgbjoKKyAgICAgICAgICAgIHJhaXNlIFRjbEVycm9yLCAiU3Vid2lkZ2V0ICIgKyBuYW1lICsgIiBub3QgY2hpbGQgb2YgIiArIHNlbGYuX25hbWUKKyAgICAgICAgIyBSZW1vdmUgaGVhZGVyIG9mIG5hbWUgYW5kIGxlYWRpbmcgZG90CisgICAgICAgIG4gPSBuW2xlbihzZWxmLl93KSsxOl0KKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWV0b3dpZGdldChuKQorCisgICAgZGVmIHN1YndpZGdldHNfYWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIHN1YndpZGdldHMuIiIiCisgICAgICAgIG5hbWVzID0gc2VsZi5fc3Vid2lkZ2V0X25hbWVzKCkKKyAgICAgICAgaWYgbm90IG5hbWVzOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHJldGxpc3QgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lW2xlbihzZWxmLl93KSsxOl0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXRsaXN0LmFwcGVuZChzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBzb21lIG9mIHRoZSB3aWRnZXRzIGFyZSB1bmtub3duIGUuZy4gYm9yZGVyIGluIExhYmVsRnJhbWUKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiByZXRsaXN0CisKKyAgICBkZWYgX3N1YndpZGdldF9uYW1lKHNlbGYsbmFtZSk6CisgICAgICAgICIiIkdldCBhIHN1YndpZGdldCBuYW1lIChyZXR1cm5zIGEgU3RyaW5nLCBub3QgYSBXaWRnZXQgISkiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc3Vid2lkZ2V0JywgbmFtZSkKKyAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfc3Vid2lkZ2V0X25hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgYWxsIHN1YndpZGdldHMuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggPSBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3N1YndpZGdldHMnLCAnLWFsbCcpCisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdCh4KQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGNvbmZpZ19hbGwoc2VsZiwgb3B0aW9uLCB2YWx1ZSk6CisgICAgICAgICIiIlNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGFsbCBzdWJ3aWRnZXRzIChhbmQgc2VsZikuIiIiCisgICAgICAgIGlmIG9wdGlvbiA9PSAnJzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKG9wdGlvbiwgU3RyaW5nVHlwZSk6CisgICAgICAgICAgICBvcHRpb24gPSByZXByKG9wdGlvbikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgdmFsdWUgPSByZXByKHZhbHVlKQorICAgICAgICBuYW1lcyA9IHNlbGYuX3N1YndpZGdldF9uYW1lcygpCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKG5hbWUsICdjb25maWd1cmUnLCAnLScgKyBvcHRpb24sIHZhbHVlKQorICAgICMgVGhlc2UgYXJlIG1pc3NpbmcgZnJvbSBUa2ludGVyCisgICAgZGVmIGltYWdlX2NyZWF0ZShzZWxmLCBpbWd0eXBlLCBjbmY9e30sIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgaWYgbm90IG1hc3RlcjoKKyAgICAgICAgICAgIG1hc3RlciA9IFRraW50ZXIuX2RlZmF1bHRfcm9vdAorICAgICAgICAgICAgaWYgbm90IG1hc3RlcjoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdUb28gZWFybHkgdG8gY3JlYXRlIGltYWdlJworICAgICAgICBpZiBrdyBhbmQgY25mOiBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBlbGlmIGt3OiBjbmYgPSBrdworICAgICAgICBvcHRpb25zID0gKCkKKyAgICAgICAgZm9yIGssIHYgaW4gY25mLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHYsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgICAgIHYgPSBzZWxmLl9yZWdpc3Rlcih2KQorICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgKyAoJy0nK2ssIHYpCisgICAgICAgIHJldHVybiBtYXN0ZXIudGsuY2FsbCgoJ2ltYWdlJywgJ2NyZWF0ZScsIGltZ3R5cGUsKSArIG9wdGlvbnMpCisgICAgZGVmIGltYWdlX2RlbGV0ZShzZWxmLCBpbWduYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdpbWFnZScsICdkZWxldGUnLCBpbWduYW1lKQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAjIE1heSBoYXBwZW4gaWYgdGhlIHJvb3Qgd2FzIGRlc3Ryb3llZAorICAgICAgICAgICAgcGFzcworCisjIFN1YndpZGdldHMgYXJlIGNoaWxkIHdpZGdldHMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1lZ2Etd2lkZ2V0cy4KKyMgSW4gcHl0aG9uLCB3ZSBoYXZlIHRvIGNyZWF0ZSB0aGVzZSBzdWJ3aWRnZXRzIG1hbnVhbGx5IHRvIG1pcnJvciB0aGVpcgorIyBleGlzdGVuY2UgaW4gVGsvVGl4LgorY2xhc3MgVGl4U3ViV2lkZ2V0KFRpeFdpZGdldCk6CisgICAgIiIiU3Vid2lkZ2V0IGNsYXNzLgorCisgICAgVGhpcyBpcyB1c2VkIHRvIG1pcnJvciBjaGlsZCB3aWRnZXRzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZAorICAgIGJ5IFRpeC9UayBhcyBwYXJ0IG9mIGEgbWVnYS13aWRnZXQgaW4gUHl0aG9uICh3aGljaCBpcyBub3QgaW5mb3JtZWQKKyAgICBvZiB0aGlzKSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwKKyAgICAgICAgICAgICAgIGRlc3Ryb3lfcGh5c2ljYWxseT0xLCBjaGVja19pbnRlcm1lZGlhdGU9MSk6CisgICAgICAgIGlmIGNoZWNrX2ludGVybWVkaWF0ZToKKyAgICAgICAgICAgIHBhdGggPSBtYXN0ZXIuX3N1YndpZGdldF9uYW1lKG5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbbGVuKG1hc3Rlci5fdykrMTpdCisgICAgICAgICAgICAgICAgcGxpc3QgPSBwYXRoLnNwbGl0KCcuJykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwbGlzdCA9IFtdCisKKyAgICAgICAgaWYgbm90IGNoZWNrX2ludGVybWVkaWF0ZToKKyAgICAgICAgICAgICMgaW1tZWRpYXRlIGRlc2NlbmRhbnQKKyAgICAgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIE5vbmUsIE5vbmUsIHsnbmFtZScgOiBuYW1lfSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIGludGVybWVkaWF0ZSB3aWRnZXRzIGV4aXN0CisgICAgICAgICAgICBwYXJlbnQgPSBtYXN0ZXIKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihwbGlzdCkgLSAxKToKKyAgICAgICAgICAgICAgICBuID0gJy4nLmpvaW4ocGxpc3RbOmkrMV0pCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB3ID0gbWFzdGVyLl9uYW1ldG93aWRnZXQobikKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gdworICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBDcmVhdGUgdGhlIGludGVybWVkaWF0ZSB3aWRnZXQKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gVGl4U3ViV2lkZ2V0KHBhcmVudCwgcGxpc3RbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3BoeXNpY2FsbHk9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX2ludGVybWVkaWF0ZT0wKQorICAgICAgICAgICAgIyBUaGUgVGsgd2lkZ2V0IG5hbWUgaXMgaW4gcGxpc3QsIG5vdCBpbiBuYW1lCisgICAgICAgICAgICBpZiBwbGlzdDoKKyAgICAgICAgICAgICAgICBuYW1lID0gcGxpc3RbLTFdCisgICAgICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgcGFyZW50LCBOb25lLCBOb25lLCB7J25hbWUnIDogbmFtZX0pCisgICAgICAgIHNlbGYuZGVzdHJveV9waHlzaWNhbGx5ID0gZGVzdHJveV9waHlzaWNhbGx5CisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgIyBGb3Igc29tZSB3aWRnZXRzIGUuZy4sIGEgTm90ZUJvb2ssIHdoZW4gd2UgY2FsbCBkZXN0cnVjdG9ycywKKyAgICAgICAgIyB3ZSBtdXN0IGJlIGNhcmVmdWwgbm90IHRvIGRlc3Ryb3kgdGhlIGZyYW1lIHdpZGdldCBzaW5jZSB0aGlzCisgICAgICAgICMgYWxzbyBkZXN0cm95cyB0aGUgcGFyZW50IE5vdGVCb29rIHRodXMgbGVhZGluZyB0byBhbiBleGNlcHRpb24KKyAgICAgICAgIyBpbiBUa2ludGVyIHdoZW4gaXQgZmluYWxseSBjYWxscyBUY2wgdG8gZGVzdHJveSB0aGUgTm90ZUJvb2sKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5jaGlsZHJlbi52YWx1ZXMoKTogYy5kZXN0cm95KCkKKyAgICAgICAgaWYgc2VsZi5fbmFtZSBpbiBzZWxmLm1hc3Rlci5jaGlsZHJlbjoKKyAgICAgICAgICAgIGRlbCBzZWxmLm1hc3Rlci5jaGlsZHJlbltzZWxmLl9uYW1lXQorICAgICAgICBpZiBzZWxmLl9uYW1lIGluIHNlbGYubWFzdGVyLnN1YndpZGdldF9saXN0OgorICAgICAgICAgICAgZGVsIHNlbGYubWFzdGVyLnN1YndpZGdldF9saXN0W3NlbGYuX25hbWVdCisgICAgICAgIGlmIHNlbGYuZGVzdHJveV9waHlzaWNhbGx5OgorICAgICAgICAgICAgIyBUaGlzIGlzIGJ5cGFzc2VkIG9ubHkgZm9yIGEgZmV3IHdpZGdldHMKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnZGVzdHJveScsIHNlbGYuX3cpCisKKworIyBVc2VmdWwgZnVuYy4gdG8gc3BsaXQgVGNsIGxpc3RzIGFuZCByZXR1cm4gYXMgYSBkaWN0LiBGcm9tIFRraW50ZXIucHkKK2RlZiBfbHN0MmRpY3QobHN0KToKKyAgICBkaWN0ID0ge30KKyAgICBmb3IgeCBpbiBsc3Q6CisgICAgICAgIGRpY3RbeFswXVsxOl1dID0gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgIHJldHVybiBkaWN0CisKKyMgVXNlZnVsIGNsYXNzIHRvIGNyZWF0ZSBhIGRpc3BsYXkgc3R5bGUgLSBsYXRlciBzaGFyZWQgYnkgbWFueSBpdGVtcy4KKyMgQ29udHJpYnV0ZWQgYnkgU3RlZmZlbiBLcmVtc2VyCitjbGFzcyBEaXNwbGF5U3R5bGU6CisgICAgIiIiRGlzcGxheVN0eWxlIC0gaGFuZGxlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBzaGFyZWQgYnkKKyAgICAobXVsdGlwbGUpIERpc3BsYXkgSXRlbXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVtdHlwZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgbWFzdGVyID0gX2RlZmF1bHRfcm9vdCAgICAgICAgICAgICAgIyBnbG9iYWwgZnJvbSBUa2ludGVyCisgICAgICAgIGlmIG5vdCBtYXN0ZXIgYW5kICdyZWZ3aW5kb3cnIGluIGNuZjogbWFzdGVyPWNuZlsncmVmd2luZG93J10KKyAgICAgICAgZWxpZiBub3QgbWFzdGVyIGFuZCAncmVmd2luZG93JyBpbiBrdzogIG1hc3Rlcj0ga3dbJ3JlZndpbmRvdyddCisgICAgICAgIGVsaWYgbm90IG1hc3RlcjogcmFpc2UgUnVudGltZUVycm9yLCAiVG9vIGVhcmx5IHRvIGNyZWF0ZSBkaXNwbGF5IHN0eWxlOiBubyByb290IHdpbmRvdyIKKyAgICAgICAgc2VsZi50ayA9IG1hc3Rlci50aworICAgICAgICBzZWxmLnN0eWxlbmFtZSA9IHNlbGYudGsuY2FsbCgndGl4RGlzcGxheVN0eWxlJywgaXRlbXR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoY25mLGt3KSApCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3R5bGVuYW1lCisKKyAgICBkZWYgX29wdGlvbnMoc2VsZiwgY25mLCBrdyk6CisgICAgICAgIGlmIGt3IGFuZCBjbmY6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBlbGlmIGt3OgorICAgICAgICAgICAgY25mID0ga3cKKyAgICAgICAgb3B0cyA9ICgpCisgICAgICAgIGZvciBrLCB2IGluIGNuZi5pdGVtcygpOgorICAgICAgICAgICAgb3B0cyA9IG9wdHMgKyAoJy0nK2ssIHYpCisgICAgICAgIHJldHVybiBvcHRzCisKKyAgICBkZWYgZGVsZXRlKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5zdHlsZW5hbWUsICdkZWxldGUnKQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsa2V5LHZhbHVlKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuc3R5bGVuYW1lLCAnY29uZmlndXJlJywgJy0lcycla2V5LCB2YWx1ZSkKKworICAgIGRlZiBjb25maWcoc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgcmV0dXJuIF9sc3QyZGljdCgKKyAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICBzZWxmLnN0eWxlbmFtZSwgJ2NvbmZpZ3VyZScsICpzZWxmLl9vcHRpb25zKGNuZixrdykpKSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5zdHlsZW5hbWUsICdjZ2V0JywgJy0lcycla2V5KQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFRoZSBUaXggV2lkZ2V0IGNsYXNzZXMgLSBpbiBhbHBoYWJldGljYWwgb3JkZXIgIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgQmFsbG9vbihUaXhXaWRnZXQpOgorICAgICIiIkJhbGxvb24gaGVscCB3aWRnZXQuCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBsYWJlbCAgICAgICAgICAgTGFiZWwKKyAgICBtZXNzYWdlICAgICAgICAgTWVzc2FnZSIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2hlbGwKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICMgc3RhdGljIHNlZW0gdG8gYmUgLWluc3RhbGxjb2xvcm1hcCAtaW5pdHdhaXQgLXN0YXR1c2JhciAtY3Vyc29yCisgICAgICAgIHN0YXRpYyA9IFsnb3B0aW9ucycsICdpbnN0YWxsY29sb3JtYXAnLCAnaW5pdHdhaXQnLCAnc3RhdHVzYmFyJywKKyAgICAgICAgICAgICAgICAgICdjdXJzb3InXQorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4QmFsbG9vbicsIHN0YXRpYywgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGFiZWwnXSA9IF9kdW1teUxhYmVsKHNlbGYsICdsYWJlbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3BoeXNpY2FsbHk9MCkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbWVzc2FnZSddID0gX2R1bW15TGFiZWwoc2VsZiwgJ21lc3NhZ2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0cm95X3BoeXNpY2FsbHk9MCkKKworICAgIGRlZiBiaW5kX3dpZGdldChzZWxmLCB3aWRnZXQsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkJpbmQgYmFsbG9vbiB3aWRnZXQgdG8gYW5vdGhlci4KKyAgICAgICAgT25lIGJhbGxvb24gd2lkZ2V0IG1heSBiZSBib3VuZCB0byBzZXZlcmFsIHdpZGdldHMgYXQgdGhlIHNhbWUgdGltZSIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2JpbmQnLCB3aWRnZXQuX3csICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIHVuYmluZF93aWRnZXQoc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd1bmJpbmQnLCB3aWRnZXQuX3cpCisKK2NsYXNzIEJ1dHRvbkJveChUaXhXaWRnZXQpOgorICAgICIiIkJ1dHRvbkJveCAtIEEgY29udGFpbmVyIGZvciBwdXNoYnV0dG9ucy4KKyAgICBTdWJ3aWRnZXRzIGFyZSB0aGUgYnV0dG9ucyBhZGRlZCB3aXRoIHRoZSBhZGQgbWV0aG9kLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeEJ1dHRvbkJveCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ29yaWVudGF0aW9uJywgJ29wdGlvbnMnXSwgY25mLCBrdykKKworICAgIGRlZiBhZGQoc2VsZiwgbmFtZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQWRkIGEgYnV0dG9uIHdpdGggZ2l2ZW4gbmFtZSB0byBib3guIiIiCisKKyAgICAgICAgYnRuID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICdhZGQnLCBuYW1lLCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFtuYW1lXSA9IF9kdW1teUJ1dHRvbihzZWxmLCBuYW1lKQorICAgICAgICByZXR1cm4gYnRuCisKKyAgICBkZWYgaW52b2tlKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lIGluIHNlbGYuc3Vid2lkZ2V0X2xpc3Q6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScsIG5hbWUpCisKK2NsYXNzIENvbWJvQm94KFRpeFdpZGdldCk6CisgICAgIiIiQ29tYm9Cb3ggLSBhbiBFbnRyeSBmaWVsZCB3aXRoIGEgZHJvcGRvd24gbWVudS4gVGhlIHVzZXIgY2FuIHNlbGVjdCBhCisgICAgY2hvaWNlIGJ5IGVpdGhlciB0eXBpbmcgaW4gdGhlIGVudHJ5IHN1YndpZGdldCBvciBzZWxlY3RpbmcgZnJvbSB0aGUKKyAgICBsaXN0Ym94IHN1YndpZGdldC4KKworICAgIFN1YndpZGdldCAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGVudHJ5ICAgICAgIEVudHJ5CisgICAgYXJyb3cgICAgICAgQnV0dG9uCisgICAgc2xpc3Rib3ggICAgU2Nyb2xsZWRMaXN0Qm94CisgICAgdGljayAgICAgICAgQnV0dG9uCisgICAgY3Jvc3MgICAgICAgQnV0dG9uIDogcHJlc2VudCBpZiBjcmVhdGVkIHdpdGggdGhlIGZhbmN5IG9wdGlvbiIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4TGFiZWxXaWRnZXQKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4Q29tYm9Cb3gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydlZGl0YWJsZScsICdkcm9wZG93bicsICdmYW5jeScsICdvcHRpb25zJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydsYWJlbCddID0gX2R1bW15TGFiZWwoc2VsZiwgJ2xhYmVsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZW50cnknXSA9IF9kdW1teUVudHJ5KHNlbGYsICdlbnRyeScpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2Fycm93J10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2Fycm93JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnc2xpc3Rib3gnXSA9IF9kdW1teVNjcm9sbGVkTGlzdEJveChzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbGlzdGJveCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3RpY2snXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAndGljaycpCisgICAgICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydjcm9zcyddID0gX2R1bW15QnV0dG9uKHNlbGYsICdjcm9zcycpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAjIHVuYXZhaWxhYmxlIHdoZW4gLWZhbmN5IG5vdCBzcGVjaWZpZWQKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgYWxpZ24KKworICAgIGRlZiBhZGRfaGlzdG9yeShzZWxmLCBzdHIpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZGhpc3RvcnknLCBzdHIpCisKKyAgICBkZWYgYXBwZW5kX2hpc3Rvcnkoc2VsZiwgc3RyKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhcHBlbmRoaXN0b3J5Jywgc3RyKQorCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgc3RyKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnNlcnQnLCBpbmRleCwgc3RyKQorCisgICAgZGVmIHBpY2soc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BpY2snLCBpbmRleCkKKworY2xhc3MgQ29udHJvbChUaXhXaWRnZXQpOgorICAgICIiIkNvbnRyb2wgLSBBbiBlbnRyeSBmaWVsZCB3aXRoIHZhbHVlIGNoYW5nZSBhcnJvd3MuICBUaGUgdXNlciBjYW4KKyAgICBhZGp1c3QgdGhlIHZhbHVlIGJ5IHByZXNzaW5nIHRoZSB0d28gYXJyb3cgYnV0dG9ucyBvciBieSBlbnRlcmluZworICAgIHRoZSB2YWx1ZSBkaXJlY3RseSBpbnRvIHRoZSBlbnRyeS4gVGhlIG5ldyB2YWx1ZSB3aWxsIGJlIGNoZWNrZWQKKyAgICBhZ2FpbnN0IHRoZSB1c2VyLWRlZmluZWQgdXBwZXIgYW5kIGxvd2VyIGxpbWl0cy4KKworICAgIFN1YndpZGdldCAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGluY3IgICAgICAgQnV0dG9uCisgICAgZGVjciAgICAgICBCdXR0b24KKyAgICBlbnRyeSAgICAgICBFbnRyeQorICAgIGxhYmVsICAgICAgIExhYmVsIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhMYWJlbFdpZGdldAorICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhDb250cm9sJywgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2luY3InXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnaW5jcicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2RlY3InXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnZGVjcicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2xhYmVsJ10gPSBfZHVtbXlMYWJlbChzZWxmLCAnbGFiZWwnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydlbnRyeSddID0gX2R1bW15RW50cnkoc2VsZiwgJ2VudHJ5JykKKworICAgIGRlZiBkZWNyZW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVjcicpCisKKyAgICBkZWYgaW5jcmVtZW50KHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luY3InKQorCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnKQorCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd1cGRhdGUnKQorCitjbGFzcyBEaXJMaXN0KFRpeFdpZGdldCk6CisgICAgIiIiRGlyTGlzdCAtIGRpc3BsYXlzIGEgbGlzdCB2aWV3IG9mIGEgZGlyZWN0b3J5LCBpdHMgcHJldmlvdXMKKyAgICBkaXJlY3RvcmllcyBhbmQgaXRzIHN1Yi1kaXJlY3Rvcmllcy4gVGhlIHVzZXIgY2FuIGNob29zZSBvbmUgb2YKKyAgICB0aGUgZGlyZWN0b3JpZXMgZGlzcGxheWVkIGluIHRoZSBsaXN0IG9yIGNoYW5nZSB0byBhbm90aGVyIGRpcmVjdG9yeS4KKworICAgIFN1YndpZGdldCAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGhsaXN0ICAgICAgIEhMaXN0CisgICAgaHNiICAgICAgICAgICAgICBTY3JvbGxiYXIKKyAgICB2c2IgICAgICAgICAgICAgIFNjcm9sbGJhciIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRITGlzdAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhEaXJMaXN0JywgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hsaXN0J10gPSBfZHVtbXlITGlzdChzZWxmLCAnaGxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd2c2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAndnNiJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaHNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ2hzYicpCisKKyAgICBkZWYgY2hkaXIoc2VsZiwgZGlyKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdjaGRpcicsIGRpcikKKworY2xhc3MgRGlyVHJlZShUaXhXaWRnZXQpOgorICAgICIiIkRpclRyZWUgLSBEaXJlY3RvcnkgTGlzdGluZyBpbiBhIGhpZXJhcmNoaWNhbCB2aWV3LgorICAgIERpc3BsYXlzIGEgdHJlZSB2aWV3IG9mIGEgZGlyZWN0b3J5LCBpdHMgcHJldmlvdXMgZGlyZWN0b3JpZXMgYW5kIGl0cworICAgIHN1Yi1kaXJlY3Rvcmllcy4gVGhlIHVzZXIgY2FuIGNob29zZSBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIGRpc3BsYXllZAorICAgIGluIHRoZSBsaXN0IG9yIGNoYW5nZSB0byBhbm90aGVyIGRpcmVjdG9yeS4KKworICAgIFN1YndpZGdldCAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIGhsaXN0ICAgICAgICAgICBITGlzdAorICAgIGhzYiAgICAgICAgICAgICBTY3JvbGxiYXIKKyAgICB2c2IgICAgICAgICAgICAgU2Nyb2xsYmFyIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZEhMaXN0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeERpclRyZWUnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaGxpc3QnXSA9IF9kdW1teUhMaXN0KHNlbGYsICdobGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworICAgIGRlZiBjaGRpcihzZWxmLCBkaXIpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2NoZGlyJywgZGlyKQorCitjbGFzcyBEaXJTZWxlY3RCb3goVGl4V2lkZ2V0KToKKyAgICAiIiJEaXJTZWxlY3RCb3ggLSBNb3RpZiBzdHlsZSBmaWxlIHNlbGVjdCBib3guCisgICAgSXQgaXMgZ2VuZXJhbGx5IHVzZWQgZm9yCisgICAgdGhlIHVzZXIgdG8gY2hvb3NlIGEgZmlsZS4gRmlsZVNlbGVjdEJveCBzdG9yZXMgdGhlIGZpbGVzIG1vc3RseQorICAgIHJlY2VudGx5IHNlbGVjdGVkIGludG8gYSBDb21ib0JveCB3aWRnZXQgc28gdGhhdCB0aGV5IGNhbiBiZSBxdWlja2x5CisgICAgc2VsZWN0ZWQgYWdhaW4uCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBzZWxlY3Rpb24gICAgICAgQ29tYm9Cb3gKKyAgICBmaWx0ZXIgICAgICAgICAgQ29tYm9Cb3gKKyAgICBkaXJsaXN0ICAgICAgICAgU2Nyb2xsZWRMaXN0Qm94CisgICAgZmlsZWxpc3QgICAgICAgIFNjcm9sbGVkTGlzdEJveCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeERpclNlbGVjdEJveCcsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkaXJsaXN0J10gPSBfZHVtbXlEaXJMaXN0KHNlbGYsICdkaXJsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlyY2J4J10gPSBfZHVtbXlGaWxlQ29tYm9Cb3goc2VsZiwgJ2RpcmNieCcpCisKK2NsYXNzIEV4RmlsZVNlbGVjdEJveChUaXhXaWRnZXQpOgorICAgICIiIkV4RmlsZVNlbGVjdEJveCAtIE1TIFdpbmRvd3Mgc3R5bGUgZmlsZSBzZWxlY3QgYm94LgorICAgIEl0IHByb3ZpZGVzIGFuIGNvbnZlbmllbnQgbWV0aG9kIGZvciB0aGUgdXNlciB0byBzZWxlY3QgZmlsZXMuCisKKyAgICBTdWJ3aWRnZXQgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBjYW5jZWwgICAgICAgQnV0dG9uCisgICAgb2sgICAgICAgICAgICAgIEJ1dHRvbgorICAgIGhpZGRlbiAgICAgICBDaGVja2J1dHRvbgorICAgIHR5cGVzICAgICAgIENvbWJvQm94CisgICAgZGlyICAgICAgICAgICAgICBDb21ib0JveAorICAgIGZpbGUgICAgICAgQ29tYm9Cb3gKKyAgICBkaXJsaXN0ICAgICAgIFNjcm9sbGVkTGlzdEJveAorICAgIGZpbGVsaXN0ICAgICAgIFNjcm9sbGVkTGlzdEJveCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeEV4RmlsZVNlbGVjdEJveCcsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydjYW5jZWwnXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnY2FuY2VsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnb2snXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnb2snKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydoaWRkZW4nXSA9IF9kdW1teUNoZWNrYnV0dG9uKHNlbGYsICdoaWRkZW4nKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd0eXBlcyddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ3R5cGVzJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlyJ10gPSBfZHVtbXlDb21ib0JveChzZWxmLCAnZGlyJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlybGlzdCddID0gX2R1bW15RGlyTGlzdChzZWxmLCAnZGlybGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZpbGUnXSA9IF9kdW1teUNvbWJvQm94KHNlbGYsICdmaWxlJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZmlsZWxpc3QnXSA9IF9kdW1teVNjcm9sbGVkTGlzdEJveChzZWxmLCAnZmlsZWxpc3QnKQorCisgICAgZGVmIGZpbHRlcihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdmaWx0ZXInKQorCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnKQorCisKKyMgU2hvdWxkIGluaGVyaXQgZnJvbSBhIERpYWxvZyBjbGFzcworY2xhc3MgRGlyU2VsZWN0RGlhbG9nKFRpeFdpZGdldCk6CisgICAgIiIiVGhlIERpclNlbGVjdERpYWxvZyB3aWRnZXQgcHJlc2VudHMgdGhlIGRpcmVjdG9yaWVzIGluIHRoZSBmaWxlCisgICAgc3lzdGVtIGluIGEgZGlhbG9nIHdpbmRvdy4gVGhlIHVzZXIgY2FuIHVzZSB0aGlzIGRpYWxvZyB3aW5kb3cgdG8KKyAgICBuYXZpZ2F0ZSB0aHJvdWdoIHRoZSBmaWxlIHN5c3RlbSB0byBzZWxlY3QgdGhlIGRlc2lyZWQgZGlyZWN0b3J5LgorCisgICAgU3Vid2lkZ2V0cyAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBkaXJib3ggICAgICAgRGlyU2VsZWN0RGlhbG9nIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhEaWFsb2dTaGVsbAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhEaXJTZWxlY3REaWFsb2cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2RpcmJveCddID0gX2R1bW15RGlyU2VsZWN0Qm94KHNlbGYsICdkaXJib3gnKQorICAgICAgICAjIGNhbmNlbCBhbmQgb2sgYnV0dG9ucyBhcmUgbWlzc2luZworCisgICAgZGVmIHBvcHVwKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BvcHVwJykKKworICAgIGRlZiBwb3Bkb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BvcGRvd24nKQorCisKKyMgU2hvdWxkIGluaGVyaXQgZnJvbSBhIERpYWxvZyBjbGFzcworY2xhc3MgRXhGaWxlU2VsZWN0RGlhbG9nKFRpeFdpZGdldCk6CisgICAgIiIiRXhGaWxlU2VsZWN0RGlhbG9nIC0gTVMgV2luZG93cyBzdHlsZSBmaWxlIHNlbGVjdCBkaWFsb2cuCisgICAgSXQgcHJvdmlkZXMgYW4gY29udmVuaWVudCBtZXRob2QgZm9yIHRoZSB1c2VyIHRvIHNlbGVjdCBmaWxlcy4KKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgZnNib3ggICAgICAgRXhGaWxlU2VsZWN0Qm94IiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhEaWFsb2dTaGVsbAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhFeEZpbGVTZWxlY3REaWFsb2cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZzYm94J10gPSBfZHVtbXlFeEZpbGVTZWxlY3RCb3goc2VsZiwgJ2ZzYm94JykKKworICAgIGRlZiBwb3B1cChzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwb3B1cCcpCisKKyAgICBkZWYgcG9wZG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwb3Bkb3duJykKKworY2xhc3MgRmlsZVNlbGVjdEJveChUaXhXaWRnZXQpOgorICAgICIiIkV4RmlsZVNlbGVjdEJveCAtIE1vdGlmIHN0eWxlIGZpbGUgc2VsZWN0IGJveC4KKyAgICBJdCBpcyBnZW5lcmFsbHkgdXNlZCBmb3IKKyAgICB0aGUgdXNlciB0byBjaG9vc2UgYSBmaWxlLiBGaWxlU2VsZWN0Qm94IHN0b3JlcyB0aGUgZmlsZXMgbW9zdGx5CisgICAgcmVjZW50bHkgc2VsZWN0ZWQgaW50byBhIENvbWJvQm94IHdpZGdldCBzbyB0aGF0IHRoZXkgY2FuIGJlIHF1aWNrbHkKKyAgICBzZWxlY3RlZCBhZ2Fpbi4KKworICAgIFN1YndpZGdldCAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIHNlbGVjdGlvbiAgICAgICBDb21ib0JveAorICAgIGZpbHRlciAgICAgICAgICBDb21ib0JveAorICAgIGRpcmxpc3QgICAgICAgICBTY3JvbGxlZExpc3RCb3gKKyAgICBmaWxlbGlzdCAgICAgICAgU2Nyb2xsZWRMaXN0Qm94IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4RmlsZVNlbGVjdEJveCcsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkaXJsaXN0J10gPSBfZHVtbXlTY3JvbGxlZExpc3RCb3goc2VsZiwgJ2Rpcmxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydmaWxlbGlzdCddID0gX2R1bW15U2Nyb2xsZWRMaXN0Qm94KHNlbGYsICdmaWxlbGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZpbHRlciddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ2ZpbHRlcicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3NlbGVjdGlvbiddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ3NlbGVjdGlvbicpCisKKyAgICBkZWYgYXBwbHlfZmlsdGVyKHNlbGYpOiAgICAgICAgICAgICAgIyBuYW1lIG9mIHN1YndpZGdldCBpcyBzYW1lIGFzIGNvbW1hbmQKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdmaWx0ZXInKQorCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnKQorCisjIFNob3VsZCBpbmhlcml0IGZyb20gYSBEaWFsb2cgY2xhc3MKK2NsYXNzIEZpbGVTZWxlY3REaWFsb2coVGl4V2lkZ2V0KToKKyAgICAiIiJGaWxlU2VsZWN0RGlhbG9nIC0gTW90aWYgc3R5bGUgZmlsZSBzZWxlY3QgZGlhbG9nLgorCisgICAgU3Vid2lkZ2V0cyAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBidG5zICAgICAgIFN0ZEJ1dHRvbkJveAorICAgIGZzYm94ICAgICAgIEZpbGVTZWxlY3RCb3giIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFN0ZERpYWxvZ1NoZWxsCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeEZpbGVTZWxlY3REaWFsb2cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2J0bnMnXSA9IF9kdW1teVN0ZEJ1dHRvbkJveChzZWxmLCAnYnRucycpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZzYm94J10gPSBfZHVtbXlGaWxlU2VsZWN0Qm94KHNlbGYsICdmc2JveCcpCisKKyAgICBkZWYgcG9wdXAoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9wdXAnKQorCisgICAgZGVmIHBvcGRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9wZG93bicpCisKK2NsYXNzIEZpbGVFbnRyeShUaXhXaWRnZXQpOgorICAgICIiIkZpbGVFbnRyeSAtIEVudHJ5IGZpZWxkIHdpdGggYnV0dG9uIHRoYXQgaW52b2tlcyBhIEZpbGVTZWxlY3REaWFsb2cuCisgICAgVGhlIHVzZXIgY2FuIHR5cGUgaW4gdGhlIGZpbGVuYW1lIG1hbnVhbGx5LiBBbHRlcm5hdGl2ZWx5LCB0aGUgdXNlciBjYW4KKyAgICBwcmVzcyB0aGUgYnV0dG9uIHdpZGdldCB0aGF0IHNpdHMgbmV4dCB0byB0aGUgZW50cnksIHdoaWNoIHdpbGwgYnJpbmcKKyAgICB1cCBhIGZpbGUgc2VsZWN0aW9uIGRpYWxvZy4KKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgYnV0dG9uICAgICAgIEJ1dHRvbgorICAgIGVudHJ5ICAgICAgIEVudHJ5IiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhMYWJlbFdpZGdldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhGaWxlRW50cnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydkaWFsb2d0eXBlJywgJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnYnV0dG9uJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2J1dHRvbicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2VudHJ5J10gPSBfZHVtbXlFbnRyeShzZWxmLCAnZW50cnknKQorCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnKQorCisgICAgZGVmIGZpbGVfZGlhbG9nKHNlbGYpOgorICAgICAgICAjIEZJWE1FOiByZXR1cm4gcHl0aG9uIG9iamVjdAorICAgICAgICBwYXNzCisKK2NsYXNzIEhMaXN0KFRpeFdpZGdldCwgWFZpZXcsIFlWaWV3KToKKyAgICAiIiJITGlzdCAtIEhpZXJhcmNoeSBkaXNwbGF5ICB3aWRnZXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhbnkgZGF0YQorICAgIHRoYXQgaGF2ZSBhIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUsIGZvciBleGFtcGxlLCBmaWxlIHN5c3RlbSBkaXJlY3RvcnkKKyAgICB0cmVlcy4gVGhlIGxpc3QgZW50cmllcyBhcmUgaW5kZW50ZWQgYW5kIGNvbm5lY3RlZCBieSBicmFuY2ggbGluZXMKKyAgICBhY2NvcmRpbmcgdG8gdGhlaXIgcGxhY2VzIGluIHRoZSBoaWVyYXJjaHkuCisKKyAgICBTdWJ3aWRnZXRzIC0gTm9uZSIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLG1hc3Rlcj1Ob25lLGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhITGlzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2NvbHVtbnMnLCAnb3B0aW9ucyddLCBjbmYsIGt3KQorCisgICAgZGVmIGFkZChzZWxmLCBlbnRyeSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWRkJywgZW50cnksICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIGFkZF9jaGlsZChzZWxmLCBwYXJlbnQ9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgaWYgbm90IHBhcmVudDoKKyAgICAgICAgICAgIHBhcmVudCA9ICcnCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl93LCAnYWRkY2hpbGQnLCBwYXJlbnQsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIGFuY2hvcl9zZXQoc2VsZiwgZW50cnkpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FuY2hvcicsICdzZXQnLCBlbnRyeSkKKworICAgIGRlZiBhbmNob3JfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYW5jaG9yJywgJ2NsZWFyJykKKworICAgIGRlZiBjb2x1bW5fd2lkdGgoc2VsZiwgY29sPTAsIHdpZHRoPU5vbmUsIGNoYXJzPU5vbmUpOgorICAgICAgICBpZiBub3QgY2hhcnM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdjb2x1bW4nLCAnd2lkdGgnLCBjb2wsIHdpZHRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnY29sdW1uJywgJ3dpZHRoJywgY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWNoYXInLCBjaGFycykKKworICAgIGRlZiBkZWxldGVfYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsICdhbGwnKQorCisgICAgZGVmIGRlbGV0ZV9lbnRyeShzZWxmLCBlbnRyeSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVsZXRlJywgJ2VudHJ5JywgZW50cnkpCisKKyAgICBkZWYgZGVsZXRlX29mZnNwcmluZ3Moc2VsZiwgZW50cnkpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsICdvZmZzcHJpbmdzJywgZW50cnkpCisKKyAgICBkZWYgZGVsZXRlX3NpYmxpbmdzKHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCAnc2libGluZ3MnLCBlbnRyeSkKKworICAgIGRlZiBkcmFnc2l0ZV9zZXQoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RyYWdzaXRlJywgJ3NldCcsIGluZGV4KQorCisgICAgZGVmIGRyYWdzaXRlX2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RyYWdzaXRlJywgJ2NsZWFyJykKKworICAgIGRlZiBkcm9wc2l0ZV9zZXQoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Ryb3BzaXRlJywgJ3NldCcsIGluZGV4KQorCisgICAgZGVmIGRyb3BzaXRlX2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Ryb3BzaXRlJywgJ2NsZWFyJykKKworICAgIGRlZiBoZWFkZXJfY3JlYXRlKHNlbGYsIGNvbCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdoZWFkZXInLCAnY3JlYXRlJywgY29sLCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBoZWFkZXJfY29uZmlndXJlKHNlbGYsIGNvbCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgaWYgY25mIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX2xzdDJkaWN0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdoZWFkZXInLCAnY29uZmlndXJlJywgY29sKSkpCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGVhZGVyJywgJ2NvbmZpZ3VyZScsIGNvbCwKKyAgICAgICAgICAgICAgICAgICAgICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIGhlYWRlcl9jZ2V0KHNlbGYsICBjb2wsIG9wdCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2hlYWRlcicsICdjZ2V0JywgY29sLCBvcHQpCisKKyAgICBkZWYgaGVhZGVyX2V4aXN0cyhzZWxmLCAgY29sKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGVhZGVyJywgJ2V4aXN0cycsIGNvbCkKKworICAgIGRlZiBoZWFkZXJfZGVsZXRlKHNlbGYsIGNvbCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaGVhZGVyJywgJ2RlbGV0ZScsIGNvbCkKKworICAgIGRlZiBoZWFkZXJfc2l6ZShzZWxmLCBjb2wpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdoZWFkZXInLCAnc2l6ZScsIGNvbCkKKworICAgIGRlZiBoaWRlX2VudHJ5KHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdoaWRlJywgJ2VudHJ5JywgZW50cnkpCisKKyAgICBkZWYgaW5kaWNhdG9yX2NyZWF0ZShzZWxmLCBlbnRyeSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgICBzZWxmLl93LCAnaW5kaWNhdG9yJywgJ2NyZWF0ZScsIGVudHJ5LCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBpbmRpY2F0b3JfY29uZmlndXJlKHNlbGYsIGVudHJ5LCBjbmY9e30sICoqa3cpOgorICAgICAgICBpZiBjbmYgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfbHN0MmRpY3QoCisgICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdCgKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZGljYXRvcicsICdjb25maWd1cmUnLCBlbnRyeSkpKQorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgIHNlbGYuX3csICdpbmRpY2F0b3InLCAnY29uZmlndXJlJywgZW50cnksICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIGluZGljYXRvcl9jZ2V0KHNlbGYsICBlbnRyeSwgb3B0KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5kaWNhdG9yJywgJ2NnZXQnLCBlbnRyeSwgb3B0KQorCisgICAgZGVmIGluZGljYXRvcl9leGlzdHMoc2VsZiwgIGVudHJ5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCAoc2VsZi5fdywgJ2luZGljYXRvcicsICdleGlzdHMnLCBlbnRyeSkKKworICAgIGRlZiBpbmRpY2F0b3JfZGVsZXRlKHNlbGYsIGVudHJ5KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmRpY2F0b3InLCAnZGVsZXRlJywgZW50cnkpCisKKyAgICBkZWYgaW5kaWNhdG9yX3NpemUoc2VsZiwgZW50cnkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmRpY2F0b3InLCAnc2l6ZScsIGVudHJ5KQorCisgICAgZGVmIGluZm9fYW5jaG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2FuY2hvcicpCisKKyAgICBkZWYgaW5mb19iYm94KHNlbGYsIGVudHJ5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2Jib3gnLCBlbnRyeSkpIG9yIE5vbmUKKworICAgIGRlZiBpbmZvX2NoaWxkcmVuKHNlbGYsIGVudHJ5PU5vbmUpOgorICAgICAgICBjID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2NoaWxkcmVuJywgZW50cnkpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChjKQorCisgICAgZGVmIGluZm9fZGF0YShzZWxmLCBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnZGF0YScsIGVudHJ5KQorCisgICAgZGVmIGluZm9fZHJhZ3NpdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnZHJhZ3NpdGUnKQorCisgICAgZGVmIGluZm9fZHJvcHNpdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnZHJvcHNpdGUnKQorCisgICAgZGVmIGluZm9fZXhpc3RzKHNlbGYsIGVudHJ5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdleGlzdHMnLCBlbnRyeSkKKworICAgIGRlZiBpbmZvX2hpZGRlbihzZWxmLCBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnaGlkZGVuJywgZW50cnkpCisKKyAgICBkZWYgaW5mb19uZXh0KHNlbGYsIGVudHJ5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICduZXh0JywgZW50cnkpCisKKyAgICBkZWYgaW5mb19wYXJlbnQoc2VsZiwgZW50cnkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ3BhcmVudCcsIGVudHJ5KQorCisgICAgZGVmIGluZm9fcHJldihzZWxmLCBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAncHJldicsIGVudHJ5KQorCisgICAgZGVmIGluZm9fc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBjID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ3NlbGVjdGlvbicpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChjKQorCisgICAgZGVmIGl0ZW1fY2dldChzZWxmLCBlbnRyeSwgY29sLCBvcHQpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpdGVtJywgJ2NnZXQnLCBlbnRyeSwgY29sLCBvcHQpCisKKyAgICBkZWYgaXRlbV9jb25maWd1cmUoc2VsZiwgZW50cnksIGNvbCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgaWYgY25mIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX2xzdDJkaWN0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXQoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpdGVtJywgJ2NvbmZpZ3VyZScsIGVudHJ5LCBjb2wpKSkKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpdGVtJywgJ2NvbmZpZ3VyZScsIGVudHJ5LCBjb2wsCisgICAgICAgICAgICAgICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIGl0ZW1fY3JlYXRlKHNlbGYsIGVudHJ5LCBjb2wsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgc2VsZi5fdywgJ2l0ZW0nLCAnY3JlYXRlJywgZW50cnksIGNvbCwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisKKyAgICBkZWYgaXRlbV9leGlzdHMoc2VsZiwgZW50cnksIGNvbCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2l0ZW0nLCAnZXhpc3RzJywgZW50cnksIGNvbCkKKworICAgIGRlZiBpdGVtX2RlbGV0ZShzZWxmLCBlbnRyeSwgY29sKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpdGVtJywgJ2RlbGV0ZScsIGVudHJ5LCBjb2wpCisKKyAgICBkZWYgZW50cnljZ2V0KHNlbGYsIGVudHJ5LCBvcHQpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdlbnRyeWNnZXQnLCBlbnRyeSwgb3B0KQorCisgICAgZGVmIGVudHJ5Y29uZmlndXJlKHNlbGYsIGVudHJ5LCBjbmY9e30sICoqa3cpOgorICAgICAgICBpZiBjbmYgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfbHN0MmRpY3QoCisgICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdCgKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2VudHJ5Y29uZmlndXJlJywgZW50cnkpKSkKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdlbnRyeWNvbmZpZ3VyZScsIGVudHJ5LAorICAgICAgICAgICAgICAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBuZWFyZXN0KHNlbGYsIHkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICduZWFyZXN0JywgeSkKKworICAgIGRlZiBzZWUoc2VsZiwgZW50cnkpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlZScsIGVudHJ5KQorCisgICAgZGVmIHNlbGVjdGlvbl9jbGVhcihzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdjbGVhcicsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIHNlbGVjdGlvbl9pbmNsdWRlcyhzZWxmLCBlbnRyeSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdpbmNsdWRlcycsIGVudHJ5KQorCisgICAgZGVmIHNlbGVjdGlvbl9zZXQoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0aW9uJywgJ3NldCcsIGZpcnN0LCBsYXN0KQorCisgICAgZGVmIHNob3dfZW50cnkoc2VsZiwgZW50cnkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaG93JywgJ2VudHJ5JywgZW50cnkpCisKK2NsYXNzIElucHV0T25seShUaXhXaWRnZXQpOgorICAgICIiIklucHV0T25seSAtIEludmlzaWJsZSB3aWRnZXQuIFVuaXggb25seS4KKworICAgIFN1YndpZGdldHMgLSBOb25lIiIiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsbWFzdGVyPU5vbmUsY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeElucHV0T25seScsIE5vbmUsIGNuZiwga3cpCisKK2NsYXNzIExhYmVsRW50cnkoVGl4V2lkZ2V0KToKKyAgICAiIiJMYWJlbEVudHJ5IC0gRW50cnkgZmllbGQgd2l0aCBsYWJlbC4gUGFja2FnZXMgYW4gZW50cnkgd2lkZ2V0CisgICAgYW5kIGEgbGFiZWwgaW50byBvbmUgbWVnYSB3aWRnZXQuIEl0IGNhbiBiZXVzZWQgYmUgdXNlZCB0byBzaW1wbGlmeQorICAgIHRoZSBjcmVhdGlvbiBvZiBgYGVudHJ5LWZvcm0nJyB0eXBlIG9mIGludGVyZmFjZS4KKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgbGFiZWwgICAgICAgTGFiZWwKKyAgICBlbnRyeSAgICAgICBFbnRyeSIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLG1hc3Rlcj1Ob25lLGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhMYWJlbEVudHJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbGFiZWxzaWRlJywnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydsYWJlbCddID0gX2R1bW15TGFiZWwoc2VsZiwgJ2xhYmVsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZW50cnknXSA9IF9kdW1teUVudHJ5KHNlbGYsICdlbnRyeScpCisKK2NsYXNzIExhYmVsRnJhbWUoVGl4V2lkZ2V0KToKKyAgICAiIiJMYWJlbEZyYW1lIC0gTGFiZWxsZWQgRnJhbWUgY29udGFpbmVyLiBQYWNrYWdlcyBhIGZyYW1lIHdpZGdldAorICAgIGFuZCBhIGxhYmVsIGludG8gb25lIG1lZ2Egd2lkZ2V0LiBUbyBjcmVhdGUgd2lkZ2V0cyBpbnNpZGUgYQorICAgIExhYmVsRnJhbWUgd2lkZ2V0LCBvbmUgY3JlYXRlcyB0aGUgbmV3IHdpZGdldHMgcmVsYXRpdmUgdG8gdGhlCisgICAgZnJhbWUgc3Vid2lkZ2V0IGFuZCBtYW5hZ2UgdGhlbSBpbnNpZGUgdGhlIGZyYW1lIHN1YndpZGdldC4KKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgbGFiZWwgICAgICAgTGFiZWwKKyAgICBmcmFtZSAgICAgICBGcmFtZSIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLG1hc3Rlcj1Ob25lLGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhMYWJlbEZyYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnbGFiZWxzaWRlJywnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydsYWJlbCddID0gX2R1bW15TGFiZWwoc2VsZiwgJ2xhYmVsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZnJhbWUnXSA9IF9kdW1teUZyYW1lKHNlbGYsICdmcmFtZScpCisKKworY2xhc3MgTGlzdE5vdGVCb29rKFRpeFdpZGdldCk6CisgICAgIiIiQSBMaXN0Tm90ZUJvb2sgd2lkZ2V0IGlzIHZlcnkgc2ltaWxhciB0byB0aGUgVGl4Tm90ZUJvb2sgd2lkZ2V0OgorICAgIGl0IGNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgbWFueSB3aW5kb3dzIGluIGEgbGltaXRlZCBzcGFjZSB1c2luZyBhCisgICAgbm90ZWJvb2sgbWV0YXBob3IuIFRoZSBub3RlYm9vayBpcyBkaXZpZGVkIGludG8gYSBzdGFjayBvZiBwYWdlcworICAgICh3aW5kb3dzKS4gQXQgb25lIHRpbWUgb25seSBvbmUgb2YgdGhlc2UgcGFnZXMgY2FuIGJlIHNob3duLgorICAgIFRoZSB1c2VyIGNhbiBuYXZpZ2F0ZSB0aHJvdWdoIHRoZXNlIHBhZ2VzIGJ5CisgICAgY2hvb3NpbmcgdGhlIG5hbWUgb2YgdGhlIGRlc2lyZWQgcGFnZSBpbiB0aGUgaGxpc3Qgc3Vid2lkZ2V0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeExpc3ROb3RlQm9vaycsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICAjIElzIHRoaXMgbmVjZXNzYXJ5PyBJdCdzIG5vdCBhbiBleHBvc2VkIHN1YndpZGdldCBpbiBUaXguCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3BhbmUnXSA9IF9kdW1teVBhbmVkV2luZG93KHNlbGYsICdwYW5lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdHJveV9waHlzaWNhbGx5PTApCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hsaXN0J10gPSBfZHVtbXlITGlzdChzZWxmLCAnaGxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydzaGxpc3QnXSA9IF9kdW1teVNjcm9sbGVkSExpc3Qoc2VsZiwgJ3NobGlzdCcpCisKKyAgICBkZWYgYWRkKHNlbGYsIG5hbWUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWRkJywgbmFtZSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0gPSBUaXhTdWJXaWRnZXQoc2VsZiwgbmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0KKworICAgIGRlZiBwYWdlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5zdWJ3aWRnZXQobmFtZSkKKworICAgIGRlZiBwYWdlcyhzZWxmKToKKyAgICAgICAgIyBDYW4ndCBjYWxsIHN1YndpZGdldHNfYWxsIGRpcmVjdGx5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCAubmJmcmFtZQorICAgICAgICBuYW1lcyA9IHNlbGYudGsuc3BsaXQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYWdlcycpKQorICAgICAgICByZXQgPSBbXQorICAgICAgICBmb3IgeCBpbiBuYW1lczoKKyAgICAgICAgICAgIHJldC5hcHBlbmQoc2VsZi5zdWJ3aWRnZXQoeCkpCisgICAgICAgIHJldHVybiByZXQKKworICAgIGRlZiByYWlzZV9wYWdlKHNlbGYsIG5hbWUpOiAgICAgICAgICAgICAgIyByYWlzZSBpcyBhIHB5dGhvbiBrZXl3b3JkCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncmFpc2UnLCBuYW1lKQorCitjbGFzcyBNZXRlcihUaXhXaWRnZXQpOgorICAgICIiIlRoZSBNZXRlciB3aWRnZXQgY2FuIGJlIHVzZWQgdG8gc2hvdyB0aGUgcHJvZ3Jlc3Mgb2YgYSBiYWNrZ3JvdW5kCisgICAgam9iIHdoaWNoIG1heSB0YWtlIGEgbG9uZyB0aW1lIHRvIGV4ZWN1dGUuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhNZXRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ29wdGlvbnMnXSwgY25mLCBrdykKKworY2xhc3MgTm90ZUJvb2soVGl4V2lkZ2V0KToKKyAgICAiIiJOb3RlQm9vayAtIE11bHRpLXBhZ2UgY29udGFpbmVyIHdpZGdldCAodGFiYmVkIG5vdGVib29rIG1ldGFwaG9yKS4KKworICAgIFN1YndpZGdldHMgICAgICAgQ2xhc3MKKyAgICAtLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgbmJmcmFtZSAgICAgICBOb3RlQm9va0ZyYW1lCisgICAgPHBhZ2VzPiAgICAgICBwYWdlIHdpZGdldHMgYWRkZWQgZHluYW1pY2FsbHkgd2l0aCB0aGUgYWRkIG1ldGhvZCIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLG1hc3Rlcj1Ob25lLGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLG1hc3RlciwndGl4Tm90ZUJvb2snLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbmJmcmFtZSddID0gVGl4U3ViV2lkZ2V0KHNlbGYsICduYmZyYW1lJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Ryb3lfcGh5c2ljYWxseT0wKQorCisgICAgZGVmIGFkZChzZWxmLCBuYW1lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FkZCcsIG5hbWUsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdID0gVGl4U3ViV2lkZ2V0KHNlbGYsIG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIG5hbWUpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0uZGVzdHJveSgpCisgICAgICAgIGRlbCBzZWxmLnN1YndpZGdldF9saXN0W25hbWVdCisKKyAgICBkZWYgcGFnZShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3Vid2lkZ2V0KG5hbWUpCisKKyAgICBkZWYgcGFnZXMoc2VsZik6CisgICAgICAgICMgQ2FuJ3QgY2FsbCBzdWJ3aWRnZXRzX2FsbCBkaXJlY3RseSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgLm5iZnJhbWUKKyAgICAgICAgbmFtZXMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAncGFnZXMnKSkKKyAgICAgICAgcmV0ID0gW10KKyAgICAgICAgZm9yIHggaW4gbmFtZXM6CisgICAgICAgICAgICByZXQuYXBwZW5kKHNlbGYuc3Vid2lkZ2V0KHgpKQorICAgICAgICByZXR1cm4gcmV0CisKKyAgICBkZWYgcmFpc2VfcGFnZShzZWxmLCBuYW1lKTogICAgICAgICAgICAgICMgcmFpc2UgaXMgYSBweXRob24ga2V5d29yZAorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3JhaXNlJywgbmFtZSkKKworICAgIGRlZiByYWlzZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3JhaXNlZCcpCisKK2NsYXNzIE5vdGVCb29rRnJhbWUoVGl4V2lkZ2V0KToKKyAgICAjIEZJWE1FOiBUaGlzIGlzIGRhbmdlcm91cyB0byBleHBvc2UgdG8gYmUgY2FsbGVkIG9uIGl0cyBvd24uCisgICAgcGFzcworCitjbGFzcyBPcHRpb25NZW51KFRpeFdpZGdldCk6CisgICAgIiIiT3B0aW9uTWVudSAtIGNyZWF0ZXMgYSBtZW51IGJ1dHRvbiBvZiBvcHRpb25zLgorCisgICAgU3Vid2lkZ2V0ICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tCisgICAgbWVudWJ1dHRvbiAgICAgIE1lbnVidXR0b24KKyAgICBtZW51ICAgICAgICAgICAgTWVudSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeE9wdGlvbk1lbnUnLAorICAgICAgICAgICAgICAgIFsnbGFiZWxzaWRlJywgJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbWVudWJ1dHRvbiddID0gX2R1bW15TWVudWJ1dHRvbihzZWxmLCAnbWVudWJ1dHRvbicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ21lbnUnXSA9IF9kdW1teU1lbnUoc2VsZiwgJ21lbnUnKQorCisgICAgZGVmIGFkZF9jb21tYW5kKHNlbGYsIG5hbWUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWRkJywgJ2NvbW1hbmQnLCBuYW1lLCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBhZGRfc2VwYXJhdG9yKHNlbGYsIG5hbWUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWRkJywgJ3NlcGFyYXRvcicsIG5hbWUsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIGRlbGV0ZShzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBuYW1lKQorCisgICAgZGVmIGRpc2FibGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGlzYWJsZScsIG5hbWUpCisKKyAgICBkZWYgZW5hYmxlKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2VuYWJsZScsIG5hbWUpCisKK2NsYXNzIFBhbmVkV2luZG93KFRpeFdpZGdldCk6CisgICAgIiIiUGFuZWRXaW5kb3cgLSBNdWx0aS1wYW5lIGNvbnRhaW5lciB3aWRnZXQKKyAgICBhbGxvd3MgdGhlIHVzZXIgdG8gaW50ZXJhY3RpdmVseSBtYW5pcHVsYXRlIHRoZSBzaXplcyBvZiBzZXZlcmFsCisgICAgcGFuZXMuIFRoZSBwYW5lcyBjYW4gYmUgYXJyYW5nZWQgZWl0aGVyIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5LlRoZQorICAgIHVzZXIgY2hhbmdlcyB0aGUgc2l6ZXMgb2YgdGhlIHBhbmVzIGJ5IGRyYWdnaW5nIHRoZSByZXNpemUgaGFuZGxlCisgICAgYmV0d2VlbiB0d28gcGFuZXMuCisKKyAgICBTdWJ3aWRnZXRzICAgICAgIENsYXNzCisgICAgLS0tLS0tLS0tLSAgICAgICAtLS0tLQorICAgIDxwYW5lcz4gICAgICAgZy9wIHdpZGdldHMgYWRkZWQgZHluYW1pY2FsbHkgd2l0aCB0aGUgYWRkIG1ldGhvZC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhQYW5lZFdpbmRvdycsIFsnb3JpZW50YXRpb24nLCAnb3B0aW9ucyddLCBjbmYsIGt3KQorCisgICAgIyBhZGQgZGVsZXRlIGZvcmdldCBwYW5lY2dldCBwYW5lY29uZmlndXJlIHBhbmVzIHNldHNpemUKKyAgICBkZWYgYWRkKHNlbGYsIG5hbWUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWRkJywgbmFtZSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0gPSBUaXhTdWJXaWRnZXQoc2VsZiwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja19pbnRlcm1lZGlhdGU9MCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0KKworICAgIGRlZiBkZWxldGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVsZXRlJywgbmFtZSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFtuYW1lXS5kZXN0cm95KCkKKyAgICAgICAgZGVsIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0KKworICAgIGRlZiBmb3JnZXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZm9yZ2V0JywgbmFtZSkKKworICAgIGRlZiBwYW5lY2dldChzZWxmLCAgZW50cnksIG9wdCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhbmVjZ2V0JywgZW50cnksIG9wdCkKKworICAgIGRlZiBwYW5lY29uZmlndXJlKHNlbGYsIGVudHJ5LCBjbmY9e30sICoqa3cpOgorICAgICAgICBpZiBjbmYgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfbHN0MmRpY3QoCisgICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdCgKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCBlbnRyeSkpKQorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCBlbnRyeSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisKKyAgICBkZWYgcGFuZXMoc2VsZik6CisgICAgICAgIG5hbWVzID0gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lcycpKQorICAgICAgICByZXR1cm4gW3NlbGYuc3Vid2lkZ2V0KHgpIGZvciB4IGluIG5hbWVzXQorCitjbGFzcyBQb3B1cE1lbnUoVGl4V2lkZ2V0KToKKyAgICAiIiJQb3B1cE1lbnUgd2lkZ2V0IGNhbiBiZSB1c2VkIGFzIGEgcmVwbGFjZW1lbnQgb2YgdGhlIHRrX3BvcHVwIGNvbW1hbmQuCisgICAgVGhlIGFkdmFudGFnZSBvZiB0aGUgVGl4IFBvcHVwTWVudSB3aWRnZXQgaXMgaXQgcmVxdWlyZXMgbGVzcyBhcHBsaWNhdGlvbgorICAgIGNvZGUgdG8gbWFuaXB1bGF0ZS4KKworCisgICAgU3Vid2lkZ2V0cyAgICAgICBDbGFzcworICAgIC0tLS0tLS0tLS0gICAgICAgLS0tLS0KKyAgICBtZW51YnV0dG9uICAgICAgIE1lbnVidXR0b24KKyAgICBtZW51ICAgICAgIE1lbnUiIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNoZWxsCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFBvcHVwTWVudScsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydtZW51YnV0dG9uJ10gPSBfZHVtbXlNZW51YnV0dG9uKHNlbGYsICdtZW51YnV0dG9uJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbWVudSddID0gX2R1bW15TWVudShzZWxmLCAnbWVudScpCisKKyAgICBkZWYgYmluZF93aWRnZXQoc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdiaW5kJywgd2lkZ2V0Ll93KQorCisgICAgZGVmIHVuYmluZF93aWRnZXQoc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd1bmJpbmQnLCB3aWRnZXQuX3cpCisKKyAgICBkZWYgcG9zdF93aWRnZXQoc2VsZiwgd2lkZ2V0LCB4LCB5KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwb3N0Jywgd2lkZ2V0Ll93LCB4LCB5KQorCitjbGFzcyBSZXNpemVIYW5kbGUoVGl4V2lkZ2V0KToKKyAgICAiIiJJbnRlcm5hbCB3aWRnZXQgdG8gZHJhdyByZXNpemUgaGFuZGxlcyBvbiBTY3JvbGxlZCB3aWRnZXRzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgICMgVGhlcmUgc2VlbXMgdG8gYmUgYSBUaXggYnVnIHJlamVjdGluZyB0aGUgY29uZmlndXJlIG1ldGhvZAorICAgICAgICAjIExldCdzIHRyeSBtYWtpbmcgdGhlIGZsYWdzIC1zdGF0aWMKKyAgICAgICAgZmxhZ3MgPSBbJ29wdGlvbnMnLCAnY29tbWFuZCcsICdjdXJzb3JmZycsICdjdXJzb3JiZycsCisgICAgICAgICAgICAgICAgICdoYW5kbGVzaXplJywgJ2hpbnRjb2xvcicsICdoaW50d2lkdGgnLAorICAgICAgICAgICAgICAgICAneCcsICd5J10KKyAgICAgICAgIyBJbiBmYWN0LCB4IHkgaGVpZ2h0IHdpZHRoIGFyZSBjb25maWd1cmFibGUKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFJlc2l6ZUhhbmRsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgY25mLCBrdykKKworICAgIGRlZiBhdHRhY2hfd2lkZ2V0KHNlbGYsIHdpZGdldCk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYXR0YWNod2lkZ2V0Jywgd2lkZ2V0Ll93KQorCisgICAgZGVmIGRldGFjaF93aWRnZXQoc2VsZiwgd2lkZ2V0KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZXRhY2h3aWRnZXQnLCB3aWRnZXQuX3cpCisKKyAgICBkZWYgaGlkZShzZWxmLCB3aWRnZXQpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2hpZGUnLCB3aWRnZXQuX3cpCisKKyAgICBkZWYgc2hvdyhzZWxmLCB3aWRnZXQpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3Nob3cnLCB3aWRnZXQuX3cpCisKK2NsYXNzIFNjcm9sbGVkSExpc3QoVGl4V2lkZ2V0KToKKyAgICAiIiJTY3JvbGxlZEhMaXN0IC0gSExpc3Qgd2l0aCBhdXRvbWF0aWMgc2Nyb2xsYmFycy4iIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNjcm9sbGVkV2lkZ2V0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFNjcm9sbGVkSExpc3QnLCBbJ29wdGlvbnMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hsaXN0J10gPSBfZHVtbXlITGlzdChzZWxmLCAnaGxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd2c2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAndnNiJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaHNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ2hzYicpCisKK2NsYXNzIFNjcm9sbGVkTGlzdEJveChUaXhXaWRnZXQpOgorICAgICIiIlNjcm9sbGVkTGlzdEJveCAtIExpc3Rib3ggd2l0aCBhdXRvbWF0aWMgc2Nyb2xsYmFycy4iIiIKKworICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNjcm9sbGVkV2lkZ2V0CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFNjcm9sbGVkTGlzdEJveCcsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydsaXN0Ym94J10gPSBfZHVtbXlMaXN0Ym94KHNlbGYsICdsaXN0Ym94JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCitjbGFzcyBTY3JvbGxlZFRleHQoVGl4V2lkZ2V0KToKKyAgICAiIiJTY3JvbGxlZFRleHQgLSBUZXh0IHdpdGggYXV0b21hdGljIHNjcm9sbGJhcnMuIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTY3JvbGxlZFRleHQnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndGV4dCddID0gX2R1bW15VGV4dChzZWxmLCAndGV4dCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworY2xhc3MgU2Nyb2xsZWRUTGlzdChUaXhXaWRnZXQpOgorICAgICIiIlNjcm9sbGVkVExpc3QgLSBUTGlzdCB3aXRoIGF1dG9tYXRpYyBzY3JvbGxiYXJzLiIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRXaWRnZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2Nyb2xsZWRUTGlzdCcsIFsnb3B0aW9ucyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndGxpc3QnXSA9IF9kdW1teVRMaXN0KHNlbGYsICd0bGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworY2xhc3MgU2Nyb2xsZWRXaW5kb3coVGl4V2lkZ2V0KToKKyAgICAiIiJTY3JvbGxlZFdpbmRvdyAtIFdpbmRvdyB3aXRoIGF1dG9tYXRpYyBzY3JvbGxiYXJzLiIiIgorCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4U2Nyb2xsZWRXaWRnZXQKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAndGl4U2Nyb2xsZWRXaW5kb3cnLCBbJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnd2luZG93J10gPSBfZHVtbXlGcmFtZShzZWxmLCAnd2luZG93JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCitjbGFzcyBTZWxlY3QoVGl4V2lkZ2V0KToKKyAgICAiIiJTZWxlY3QgLSBDb250YWluZXIgb2YgYnV0dG9uIHN1YndpZGdldHMuIEl0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUKKyAgICByYWRpby1ib3ggb3IgY2hlY2stYm94IHN0eWxlIG9mIHNlbGVjdGlvbiBvcHRpb25zIGZvciB0aGUgdXNlci4KKworICAgIFN1YndpZGdldHMgYXJlIGJ1dHRvbnMgYWRkZWQgZHluYW1pY2FsbHkgdXNpbmcgdGhlIGFkZCBtZXRob2QuIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhMYWJlbFdpZGdldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTZWxlY3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydhbGxvd3plcm8nLCAncmFkaW8nLCAnb3JpZW50YXRpb24nLCAnbGFiZWxzaWRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9ucyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnbGFiZWwnXSA9IF9kdW1teUxhYmVsKHNlbGYsICdsYWJlbCcpCisKKyAgICBkZWYgYWRkKHNlbGYsIG5hbWUsIGNuZj17fSwgKiprdyk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWRkJywgbmFtZSwgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0gPSBfZHVtbXlCdXR0b24oc2VsZiwgbmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3Vid2lkZ2V0X2xpc3RbbmFtZV0KKworICAgIGRlZiBpbnZva2Uoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJywgbmFtZSkKKworY2xhc3MgU2hlbGwoVGl4V2lkZ2V0KToKKyAgICAiIiJUb3BsZXZlbCB3aW5kb3cuCisKKyAgICBTdWJ3aWRnZXRzIC0gTm9uZSIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLG1hc3Rlcj1Ob25lLGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTaGVsbCcsIFsnb3B0aW9ucycsICd0aXRsZSddLCBjbmYsIGt3KQorCitjbGFzcyBEaWFsb2dTaGVsbChUaXhXaWRnZXQpOgorICAgICIiIlRvcGxldmVsIHdpbmRvdywgd2l0aCBwb3B1cCBwb3Bkb3duIGFuZCBjZW50ZXIgbWV0aG9kcy4KKyAgICBJdCB0ZWxscyB0aGUgd2luZG93IG1hbmFnZXIgdGhhdCBpdCBpcyBhIGRpYWxvZyB3aW5kb3cgYW5kIHNob3VsZCBiZQorICAgIHRyZWF0ZWQgc3BlY2lhbGx5LiBUaGUgZXhhY3QgdHJlYXRtZW50IGRlcGVuZHMgb24gdGhlIHRyZWF0bWVudCBvZgorICAgIHRoZSB3aW5kb3cgbWFuYWdlci4KKworICAgIFN1YndpZGdldHMgLSBOb25lIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCBmcm9tICBTaGVsbAorICAgIGRlZiBfX2luaXRfXyAoc2VsZixtYXN0ZXI9Tm9uZSxjbmY9e30sICoqa3cpOgorICAgICAgICBUaXhXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpeERpYWxvZ1NoZWxsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnb3B0aW9ucycsICd0aXRsZScsICdtYXBwZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtaW5oZWlnaHQnLCAnbWlud2lkdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJlbnQnLCAndHJhbnNpZW50J10sIGNuZiwga3cpCisKKyAgICBkZWYgcG9wZG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwb3Bkb3duJykKKworICAgIGRlZiBwb3B1cChzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdwb3B1cCcpCisKKyAgICBkZWYgY2VudGVyKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2NlbnRlcicpCisKK2NsYXNzIFN0ZEJ1dHRvbkJveChUaXhXaWRnZXQpOgorICAgICIiIlN0ZEJ1dHRvbkJveCAtIFN0YW5kYXJkIEJ1dHRvbiBCb3ggKE9LLCBBcHBseSwgQ2FuY2VsIGFuZCBIZWxwKSAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFN0ZEJ1dHRvbkJveCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ29yaWVudGF0aW9uJywgJ29wdGlvbnMnXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnb2snXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnb2snKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydhcHBseSddID0gX2R1bW15QnV0dG9uKHNlbGYsICdhcHBseScpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2NhbmNlbCddID0gX2R1bW15QnV0dG9uKHNlbGYsICdjYW5jZWwnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydoZWxwJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2hlbHAnKQorCisgICAgZGVmIGludm9rZShzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSBpbiBzZWxmLnN1YndpZGdldF9saXN0OgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbnZva2UnLCBuYW1lKQorCitjbGFzcyBUTGlzdChUaXhXaWRnZXQsIFhWaWV3LCBZVmlldyk6CisgICAgIiIiVExpc3QgLSBIaWVyYXJjaHkgZGlzcGxheSB3aWRnZXQgd2hpY2ggY2FuIGJlCisgICAgdXNlZCB0byBkaXNwbGF5IGRhdGEgaW4gYSB0YWJ1bGFyIGZvcm1hdC4gVGhlIGxpc3QgZW50cmllcyBvZiBhIFRMaXN0CisgICAgd2lkZ2V0IGFyZSBzaW1pbGFyIHRvIHRoZSBlbnRyaWVzIGluIHRoZSBUayBsaXN0Ym94IHdpZGdldC4gVGhlIG1haW4KKyAgICBkaWZmZXJlbmNlcyBhcmUgKDEpIHRoZSBUTGlzdCB3aWRnZXQgY2FuIGRpc3BsYXkgdGhlIGxpc3QgZW50cmllcyBpbiBhCisgICAgdHdvIGRpbWVuc2lvbmFsIGZvcm1hdCBhbmQgKDIpIHlvdSBjYW4gdXNlIGdyYXBoaWNhbCBpbWFnZXMgYXMgd2VsbCBhcworICAgIG11bHRpcGxlIGNvbG9ycyBhbmQgZm9udHMgZm9yIHRoZSBsaXN0IGVudHJpZXMuCisKKyAgICBTdWJ3aWRnZXRzIC0gTm9uZSIiIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLG1hc3Rlcj1Ob25lLGNuZj17fSwgKiprdyk6CisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhUTGlzdCcsIFsnb3B0aW9ucyddLCBjbmYsIGt3KQorCisgICAgZGVmIGFjdGl2ZV9zZXQoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FjdGl2ZScsICdzZXQnLCBpbmRleCkKKworICAgIGRlZiBhY3RpdmVfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWN0aXZlJywgJ2NsZWFyJykKKworICAgIGRlZiBhbmNob3Jfc2V0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhbmNob3InLCAnc2V0JywgaW5kZXgpCisKKyAgICBkZWYgYW5jaG9yX2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FuY2hvcicsICdjbGVhcicpCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGZyb21fLCB0bz1Ob25lKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZWxldGUnLCBmcm9tXywgdG8pCisKKyAgICBkZWYgZHJhZ3NpdGVfc2V0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcmFnc2l0ZScsICdzZXQnLCBpbmRleCkKKworICAgIGRlZiBkcmFnc2l0ZV9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcmFnc2l0ZScsICdjbGVhcicpCisKKyAgICBkZWYgZHJvcHNpdGVfc2V0KHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcm9wc2l0ZScsICdzZXQnLCBpbmRleCkKKworICAgIGRlZiBkcm9wc2l0ZV9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkcm9wc2l0ZScsICdjbGVhcicpCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luc2VydCcsIGluZGV4LCAqc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKworICAgIGRlZiBpbmZvX2FjdGl2ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdhY3RpdmUnKQorCisgICAgZGVmIGluZm9fYW5jaG9yKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmZvJywgJ2FuY2hvcicpCisKKyAgICBkZWYgaW5mb19kb3duKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdkb3duJywgaW5kZXgpCisKKyAgICBkZWYgaW5mb19sZWZ0KHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdsZWZ0JywgaW5kZXgpCisKKyAgICBkZWYgaW5mb19yaWdodChzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAncmlnaHQnLCBpbmRleCkKKworICAgIGRlZiBpbmZvX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgYyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5mbycsICdzZWxlY3Rpb24nKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoYykKKworICAgIGRlZiBpbmZvX3NpemUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAnc2l6ZScpCisKKyAgICBkZWYgaW5mb191cChzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZm8nLCAndXAnLCBpbmRleCkKKworICAgIGRlZiBuZWFyZXN0KHNlbGYsIHgsIHkpOgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICduZWFyZXN0JywgeCwgeSkKKworICAgIGRlZiBzZWUoc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlZScsIGluZGV4KQorCisgICAgZGVmIHNlbGVjdGlvbl9jbGVhcihzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdjbGVhcicsICpzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorCisgICAgZGVmIHNlbGVjdGlvbl9pbmNsdWRlcyhzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdpbmNsdWRlcycsIGluZGV4KQorCisgICAgZGVmIHNlbGVjdGlvbl9zZXQoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0aW9uJywgJ3NldCcsIGZpcnN0LCBsYXN0KQorCitjbGFzcyBUcmVlKFRpeFdpZGdldCk6CisgICAgIiIiVHJlZSAtIFRoZSB0aXhUcmVlIHdpZGdldCBjYW4gYmUgdXNlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbAorICAgIGRhdGEgaW4gYSB0cmVlIGZvcm0uIFRoZSB1c2VyIGNhbiBhZGp1c3QKKyAgICB0aGUgdmlldyBvZiB0aGUgdHJlZSBieSBvcGVuaW5nIG9yIGNsb3NpbmcgcGFydHMgb2YgdGhlIHRyZWUuIiIiCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeFRyZWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWydvcHRpb25zJ10sIGNuZiwga3cpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hsaXN0J10gPSBfZHVtbXlITGlzdChzZWxmLCAnaGxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wyd2c2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAndnNiJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaHNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ2hzYicpCisKKyAgICBkZWYgYXV0b3NldG1vZGUoc2VsZik6CisgICAgICAgICcnJ1RoaXMgY29tbWFuZCBjYWxscyB0aGUgc2V0bW9kZSBtZXRob2QgZm9yIGFsbCB0aGUgZW50cmllcyBpbiB0aGlzCisgICAgIFRyZWUgd2lkZ2V0OiBpZiBhbiBlbnRyeSBoYXMgbm8gY2hpbGQgZW50cmllcywgaXRzIG1vZGUgaXMgc2V0IHRvCisgICAgIG5vbmUuIE90aGVyd2lzZSwgaWYgdGhlIGVudHJ5IGhhcyBhbnkgaGlkZGVuIGNoaWxkIGVudHJpZXMsIGl0cyBtb2RlIGlzCisgICAgIHNldCB0byBvcGVuOyBvdGhlcndpc2UgaXRzIG1vZGUgaXMgc2V0IHRvIGNsb3NlLicnJworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2F1dG9zZXRtb2RlJykKKworICAgIGRlZiBjbG9zZShzZWxmLCBlbnRyeXBhdGgpOgorICAgICAgICAnJydDbG9zZSB0aGUgZW50cnkgZ2l2ZW4gYnkgZW50cnlQYXRoIGlmIGl0cyBtb2RlIGlzIGNsb3NlLicnJworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Nsb3NlJywgZW50cnlwYXRoKQorCisgICAgZGVmIGdldG1vZGUoc2VsZiwgZW50cnlwYXRoKToKKyAgICAgICAgJycnUmV0dXJucyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBlbnRyeSBnaXZlbiBieSBlbnRyeVBhdGguJycnCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldG1vZGUnLCBlbnRyeXBhdGgpCisKKyAgICBkZWYgb3BlbihzZWxmLCBlbnRyeXBhdGgpOgorICAgICAgICAnJydPcGVuIHRoZSBlbnRyeSBnaXZlbiBieSBlbnRyeVBhdGggaWYgaXRzIG1vZGUgaXMgb3Blbi4nJycKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdvcGVuJywgZW50cnlwYXRoKQorCisgICAgZGVmIHNldG1vZGUoc2VsZiwgZW50cnlwYXRoLCBtb2RlPSdub25lJyk6CisgICAgICAgICcnJ1RoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGVudHJ5IGdpdmVuIGJ5CisgICAgIGVudHJ5UGF0aCBoYXMgY2hpbGRyZW4gZW50cmllcyBhbmQgd2hldGhlciB0aGUgY2hpbGRyZW4gYXJlIHZpc2libGUuIG1vZGUKKyAgICAgbXVzdCBiZSBvbmUgb2Ygb3BlbiwgY2xvc2Ugb3Igbm9uZS4gSWYgbW9kZSBpcyBzZXQgdG8gb3BlbiwgYSAoKykKKyAgICAgaW5kaWNhdG9yIGlzIGRyYXduIG5leHQgdG8gdGhlIGVudHJ5LiBJZiBtb2RlIGlzIHNldCB0byBjbG9zZSwgYSAoLSkKKyAgICAgaW5kaWNhdG9yIGlzIGRyYXduIG5leHQgdG8gdGhlIGVudHJ5LiBJZiBtb2RlIGlzIHNldCB0byBub25lLCBubworICAgICBpbmRpY2F0b3JzIHdpbGwgYmUgZHJhd24gZm9yIHRoaXMgZW50cnkuIFRoZSBkZWZhdWx0IG1vZGUgaXMgbm9uZS4gVGhlCisgICAgIG9wZW4gbW9kZSBpbmRpY2F0ZXMgdGhlIGVudHJ5IGhhcyBoaWRkZW4gY2hpbGRyZW4gYW5kIHRoaXMgZW50cnkgY2FuIGJlCisgICAgIG9wZW5lZCBieSB0aGUgdXNlci4gVGhlIGNsb3NlIG1vZGUgaW5kaWNhdGVzIHRoYXQgYWxsIHRoZSBjaGlsZHJlbiBvZiB0aGUKKyAgICAgZW50cnkgYXJlIG5vdyB2aXNpYmxlIGFuZCB0aGUgZW50cnkgY2FuIGJlIGNsb3NlZCBieSB0aGUgdXNlci4nJycKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZXRtb2RlJywgZW50cnlwYXRoLCBtb2RlKQorCisKKyMgQ291bGQgdHJ5IHN1YmNsYXNzaW5nIFRyZWUgZm9yIENoZWNrTGlzdCAtIHdvdWxkIG5lZWQgYW5vdGhlciBhcmcgdG8gaW5pdAorY2xhc3MgQ2hlY2tMaXN0KFRpeFdpZGdldCk6CisgICAgIiIiVGhlIENoZWNrTGlzdCB3aWRnZXQKKyAgICBkaXNwbGF5cyBhIGxpc3Qgb2YgaXRlbXMgdG8gYmUgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIENoZWNrTGlzdCBhY3RzCisgICAgc2ltaWxhcmx5IHRvIHRoZSBUayBjaGVja2J1dHRvbiBvciByYWRpb2J1dHRvbiB3aWRnZXRzLCBleGNlcHQgaXQgaXMKKyAgICBjYXBhYmxlIG9mIGhhbmRsaW5nIG1hbnkgbW9yZSBpdGVtcyB0aGFuIGNoZWNrYnV0dG9ucyBvciByYWRpb2J1dHRvbnMuCisgICAgIiIiCisgICAgIyBGSVhNRTogSXQgc2hvdWxkIGluaGVyaXQgLXN1cGVyY2xhc3MgdGl4VHJlZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeENoZWNrTGlzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ29wdGlvbnMnLCAncmFkaW8nXSwgY25mLCBrdykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnaGxpc3QnXSA9IF9kdW1teUhMaXN0KHNlbGYsICdobGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3ZzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICd2c2InKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydoc2InXSA9IF9kdW1teVNjcm9sbGJhcihzZWxmLCAnaHNiJykKKworICAgIGRlZiBhdXRvc2V0bW9kZShzZWxmKToKKyAgICAgICAgJycnVGhpcyBjb21tYW5kIGNhbGxzIHRoZSBzZXRtb2RlIG1ldGhvZCBmb3IgYWxsIHRoZSBlbnRyaWVzIGluIHRoaXMKKyAgICAgVHJlZSB3aWRnZXQ6IGlmIGFuIGVudHJ5IGhhcyBubyBjaGlsZCBlbnRyaWVzLCBpdHMgbW9kZSBpcyBzZXQgdG8KKyAgICAgbm9uZS4gT3RoZXJ3aXNlLCBpZiB0aGUgZW50cnkgaGFzIGFueSBoaWRkZW4gY2hpbGQgZW50cmllcywgaXRzIG1vZGUgaXMKKyAgICAgc2V0IHRvIG9wZW47IG90aGVyd2lzZSBpdHMgbW9kZSBpcyBzZXQgdG8gY2xvc2UuJycnCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYXV0b3NldG1vZGUnKQorCisgICAgZGVmIGNsb3NlKHNlbGYsIGVudHJ5cGF0aCk6CisgICAgICAgICcnJ0Nsb3NlIHRoZSBlbnRyeSBnaXZlbiBieSBlbnRyeVBhdGggaWYgaXRzIG1vZGUgaXMgY2xvc2UuJycnCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnY2xvc2UnLCBlbnRyeXBhdGgpCisKKyAgICBkZWYgZ2V0bW9kZShzZWxmLCBlbnRyeXBhdGgpOgorICAgICAgICAnJydSZXR1cm5zIHRoZSBjdXJyZW50IG1vZGUgb2YgdGhlIGVudHJ5IGdpdmVuIGJ5IGVudHJ5UGF0aC4nJycKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0bW9kZScsIGVudHJ5cGF0aCkKKworICAgIGRlZiBvcGVuKHNlbGYsIGVudHJ5cGF0aCk6CisgICAgICAgICcnJ09wZW4gdGhlIGVudHJ5IGdpdmVuIGJ5IGVudHJ5UGF0aCBpZiBpdHMgbW9kZSBpcyBvcGVuLicnJworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ29wZW4nLCBlbnRyeXBhdGgpCisKKyAgICBkZWYgZ2V0c2VsZWN0aW9uKHNlbGYsIG1vZGU9J29uJyk6CisgICAgICAgICcnJ1JldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdob3NlIHN0YXR1cyBtYXRjaGVzIHN0YXR1cy4gSWYgc3RhdHVzIGlzCisgICAgIG5vdCBzcGVjaWZpZWQsIHRoZSBsaXN0IG9mIGl0ZW1zIGluIHRoZSAib24iIHN0YXR1cyB3aWxsIGJlIHJldHVybmVkLgorICAgICBNb2RlIGNhbiBiZSBvbiwgb2ZmLCBkZWZhdWx0JycnCisgICAgICAgIGMgPSBzZWxmLnRrLnNwbGl0KHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0c2VsZWN0aW9uJywgbW9kZSkpCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChjKQorCisgICAgZGVmIGdldHN0YXR1cyhzZWxmLCBlbnRyeXBhdGgpOgorICAgICAgICAnJydSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBlbnRyeVBhdGguJycnCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldHN0YXR1cycsIGVudHJ5cGF0aCkKKworICAgIGRlZiBzZXRzdGF0dXMoc2VsZiwgZW50cnlwYXRoLCBtb2RlPSdvbicpOgorICAgICAgICAnJydTZXRzIHRoZSBzdGF0dXMgb2YgZW50cnlQYXRoIHRvIGJlIHN0YXR1cy4gQSBiaXRtYXAgd2lsbCBiZQorICAgICBkaXNwbGF5ZWQgbmV4dCB0byB0aGUgZW50cnkgaXRzIHN0YXR1cyBpcyBvbiwgb2ZmIG9yIGRlZmF1bHQuJycnCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2V0c3RhdHVzJywgZW50cnlwYXRoLCBtb2RlKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIFRoZSBzdWJjbGFzc2luZyBiZWxvdyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIHRoZSBzdWJ3aWRnZXRzIGluIGVhY2ggIyMjCisjIyMgbWVnYSB3aWRnZXQuIFRoaXMgYWxsb3dzIHVzIHRvIGFjY2VzcyB0aGVpciBtZXRob2RzIGRpcmVjdGx5LiAgICAgICAjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBfZHVtbXlCdXR0b24oQnV0dG9uLCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCitjbGFzcyBfZHVtbXlDaGVja2J1dHRvbihDaGVja2J1dHRvbiwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15RW50cnkoRW50cnksIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teUZyYW1lKEZyYW1lLCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCitjbGFzcyBfZHVtbXlMYWJlbChMYWJlbCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15TGlzdGJveChMaXN0Ym94LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCitjbGFzcyBfZHVtbXlNZW51KE1lbnUsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teU1lbnVidXR0b24oTWVudWJ1dHRvbiwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15U2Nyb2xsYmFyKFNjcm9sbGJhciwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15VGV4dChUZXh0LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCitjbGFzcyBfZHVtbXlTY3JvbGxlZExpc3RCb3goU2Nyb2xsZWRMaXN0Qm94LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydsaXN0Ym94J10gPSBfZHVtbXlMaXN0Ym94KHNlbGYsICdsaXN0Ym94JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCitjbGFzcyBfZHVtbXlITGlzdChITGlzdCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15U2Nyb2xsZWRITGlzdChTY3JvbGxlZEhMaXN0LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydobGlzdCddID0gX2R1bW15SExpc3Qoc2VsZiwgJ2hsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCitjbGFzcyBfZHVtbXlUTGlzdChUTGlzdCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKworY2xhc3MgX2R1bW15Q29tYm9Cb3goQ29tYm9Cb3gsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBbJ2ZhbmN5JyxkZXN0cm95X3BoeXNpY2FsbHldKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydsYWJlbCddID0gX2R1bW15TGFiZWwoc2VsZiwgJ2xhYmVsJykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZW50cnknXSA9IF9kdW1teUVudHJ5KHNlbGYsICdlbnRyeScpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2Fycm93J10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2Fycm93JykKKworICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydzbGlzdGJveCddID0gX2R1bW15U2Nyb2xsZWRMaXN0Qm94KHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NsaXN0Ym94JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndGljayddID0gX2R1bW15QnV0dG9uKHNlbGYsICd0aWNrJykKKyAgICAgICAgICAgICNjcm9zcyBCdXR0b24gOiBwcmVzZW50IGlmIGNyZWF0ZWQgd2l0aCB0aGUgZmFuY3kgb3B0aW9uCisgICAgICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0Wydjcm9zcyddID0gX2R1bW15QnV0dG9uKHNlbGYsICdjcm9zcycpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAjIHVuYXZhaWxhYmxlIHdoZW4gLWZhbmN5IG5vdCBzcGVjaWZpZWQKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgX2R1bW15RGlyTGlzdChEaXJMaXN0LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydobGlzdCddID0gX2R1bW15SExpc3Qoc2VsZiwgJ2hsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsndnNiJ10gPSBfZHVtbXlTY3JvbGxiYXIoc2VsZiwgJ3ZzYicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hzYiddID0gX2R1bW15U2Nyb2xsYmFyKHNlbGYsICdoc2InKQorCitjbGFzcyBfZHVtbXlEaXJTZWxlY3RCb3goRGlyU2VsZWN0Qm94LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkaXJsaXN0J10gPSBfZHVtbXlEaXJMaXN0KHNlbGYsICdkaXJsaXN0JykKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlyY2J4J10gPSBfZHVtbXlGaWxlQ29tYm9Cb3goc2VsZiwgJ2RpcmNieCcpCisKK2NsYXNzIF9kdW1teUV4RmlsZVNlbGVjdEJveChFeEZpbGVTZWxlY3RCb3gsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTEpOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2NhbmNlbCddID0gX2R1bW15QnV0dG9uKHNlbGYsICdjYW5jZWwnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydvayddID0gX2R1bW15QnV0dG9uKHNlbGYsICdvaycpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2hpZGRlbiddID0gX2R1bW15Q2hlY2tidXR0b24oc2VsZiwgJ2hpZGRlbicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3R5cGVzJ10gPSBfZHVtbXlDb21ib0JveChzZWxmLCAndHlwZXMnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkaXInXSA9IF9kdW1teUNvbWJvQm94KHNlbGYsICdkaXInKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkaXJsaXN0J10gPSBfZHVtbXlTY3JvbGxlZExpc3RCb3goc2VsZiwgJ2Rpcmxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydmaWxlJ10gPSBfZHVtbXlDb21ib0JveChzZWxmLCAnZmlsZScpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZpbGVsaXN0J10gPSBfZHVtbXlTY3JvbGxlZExpc3RCb3goc2VsZiwgJ2ZpbGVsaXN0JykKKworY2xhc3MgX2R1bW15RmlsZVNlbGVjdEJveChGaWxlU2VsZWN0Qm94LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydkaXJsaXN0J10gPSBfZHVtbXlTY3JvbGxlZExpc3RCb3goc2VsZiwgJ2Rpcmxpc3QnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydmaWxlbGlzdCddID0gX2R1bW15U2Nyb2xsZWRMaXN0Qm94KHNlbGYsICdmaWxlbGlzdCcpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2ZpbHRlciddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ2ZpbHRlcicpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ3NlbGVjdGlvbiddID0gX2R1bW15Q29tYm9Cb3goc2VsZiwgJ3NlbGVjdGlvbicpCisKK2NsYXNzIF9kdW1teUZpbGVDb21ib0JveChDb21ib0JveCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnZGlyY2J4J10gPSBfZHVtbXlDb21ib0JveChzZWxmLCAnZGlyY2J4JykKKworY2xhc3MgX2R1bW15U3RkQnV0dG9uQm94KFN0ZEJ1dHRvbkJveCwgVGl4U3ViV2lkZ2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHk9MSk6CisgICAgICAgIFRpeFN1YldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseSkKKyAgICAgICAgc2VsZi5zdWJ3aWRnZXRfbGlzdFsnb2snXSA9IF9kdW1teUJ1dHRvbihzZWxmLCAnb2snKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydhcHBseSddID0gX2R1bW15QnV0dG9uKHNlbGYsICdhcHBseScpCisgICAgICAgIHNlbGYuc3Vid2lkZ2V0X2xpc3RbJ2NhbmNlbCddID0gX2R1bW15QnV0dG9uKHNlbGYsICdjYW5jZWwnKQorICAgICAgICBzZWxmLnN1YndpZGdldF9saXN0WydoZWxwJ10gPSBfZHVtbXlCdXR0b24oc2VsZiwgJ2hlbHAnKQorCitjbGFzcyBfZHVtbXlOb3RlQm9va0ZyYW1lKE5vdGVCb29rRnJhbWUsIFRpeFN1YldpZGdldCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5PTApOgorICAgICAgICBUaXhTdWJXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCBuYW1lLCBkZXN0cm95X3BoeXNpY2FsbHkpCisKK2NsYXNzIF9kdW1teVBhbmVkV2luZG93KFBhbmVkV2luZG93LCBUaXhTdWJXaWRnZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIG5hbWUsIGRlc3Ryb3lfcGh5c2ljYWxseT0xKToKKyAgICAgICAgVGl4U3ViV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgbmFtZSwgZGVzdHJveV9waHlzaWNhbGx5KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBVdGlsaXR5IFJvdXRpbmVzICMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyNtaWtlIFNob3VsZCB0aXhEZXN0cm95IGJlIGV4cG9zZWQgYXMgYSB3cmFwcGVyPyAtIGJ1dCBub3QgZm9yIHdpZGdldHMuCisKK2RlZiBPcHRpb25OYW1lKHdpZGdldCk6CisgICAgJycnUmV0dXJucyB0aGUgcXVhbGlmaWVkIHBhdGggbmFtZSBmb3IgdGhlIHdpZGdldC4gTm9ybWFsbHkgdXNlZCB0byBzZXQKKyAgICBkZWZhdWx0IG9wdGlvbnMgZm9yIHN1YndpZGdldHMuIFNlZSB0aXh3aWRnZXRzLnB5JycnCisgICAgcmV0dXJuIHdpZGdldC50ay5jYWxsKCd0aXhPcHRpb25OYW1lJywgd2lkZ2V0Ll93KQorCisjIENhbGxlZCB3aXRoIGEgZGljdGlvbmFyeSBhcmd1bWVudCBvZiB0aGUgZm9ybQorIyB7JyouYyc6J0Mgc291cmNlIGZpbGVzJywgJyoudHh0JzonVGV4dCBGaWxlcycsICcqJzonQWxsIGZpbGVzJ30KKyMgcmV0dXJucyBhIHN0cmluZyB3aGljaCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIGZzYm94IGZpbGUgdHlwZXMKKyMgaW4gYW4gRXhGaWxlU2VsZWN0Qm94LiBpLmUuLAorIyAne3sqfSB7KiAtIEFsbCBmaWxlc319IHt7Ki5jfSB7Ki5jIC0gQyBzb3VyY2UgZmlsZXN9fSB7eyoudHh0fSB7Ki50eHQgLSBUZXh0IEZpbGVzfX0nCitkZWYgRmlsZVR5cGVMaXN0KGRpY3QpOgorICAgIHMgPSAnJworICAgIGZvciB0eXBlIGluIGRpY3Qua2V5cygpOgorICAgICAgICBzID0gcyArICd7eycgKyB0eXBlICsgJ30geycgKyB0eXBlICsgJyAtICcgKyBkaWN0W3R5cGVdICsgJ319ICcKKyAgICByZXR1cm4gcworCisjIFN0aWxsIHRvIGJlIGRvbmU6CisjIHRpeEljb25WaWV3CitjbGFzcyBDT2JqVmlldyhUaXhXaWRnZXQpOgorICAgICIiIlRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBDYW52YXMgT2JqZWN0IFZpZXcgd2lkZ2V0LiBUaGlzIGlzIGEgYmFzZQorICAgIGNsYXNzIG9mIEljb25WaWV3LiBJdCBpbXBsZW1lbnRzIGF1dG9tYXRpYyBwbGFjZW1lbnQvYWRqdXN0bWVudCBvZiB0aGUKKyAgICBzY3JvbGxiYXJzIGFjY29yZGluZyB0byB0aGUgY2FudmFzIG9iamVjdHMgaW5zaWRlIHRoZSBjYW52YXMgc3Vid2lkZ2V0LgorICAgIFRoZSBzY3JvbGxiYXJzIGFyZSBhZGp1c3RlZCBzbyB0aGF0IHRoZSBjYW52YXMgaXMganVzdCBsYXJnZSBlbm91Z2gKKyAgICB0byBzZWUgYWxsIHRoZSBvYmplY3RzLgorICAgICIiIgorICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNjcm9sbGVkV2lkZ2V0CisgICAgcGFzcworCisKK2NsYXNzIEdyaWQoVGl4V2lkZ2V0LCBYVmlldywgWVZpZXcpOgorICAgICcnJ1RoZSBUaXggR3JpZCBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgd2luZG93ICBhbmQgbWFrZXMgaXQgaW50byBhCisgICAgdGl4R3JpZCB3aWRnZXQuIEFkZGl0aW9uYWwgb3B0aW9ucywgbWF5IGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZAorICAgIGxpbmUgb3IgaW4gdGhlIG9wdGlvbiBkYXRhYmFzZSB0byBjb25maWd1cmUgYXNwZWN0cyBzdWNoIGFzIGl0cyBjdXJzb3IKKyAgICBhbmQgcmVsaWVmLgorCisgICAgQSBHcmlkIHdpZGdldCBkaXNwbGF5cyBpdHMgY29udGVudHMgaW4gYSB0d28gZGltZW5zaW9uYWwgZ3JpZCBvZiBjZWxscy4KKyAgICBFYWNoIGNlbGwgbWF5IGNvbnRhaW4gb25lIFRpeCBkaXNwbGF5IGl0ZW0sIHdoaWNoIG1heSBiZSBpbiB0ZXh0LAorICAgIGdyYXBoaWNzIG9yIG90aGVyIGZvcm1hdHMuIFNlZSB0aGUgRGlzcGxheVN0eWxlIGNsYXNzIGZvciBtb3JlIGluZm9ybWF0aW9uCisgICAgYWJvdXQgVGl4IGRpc3BsYXkgaXRlbXMuIEluZGl2aWR1YWwgY2VsbHMsIG9yIGdyb3VwcyBvZiBjZWxscywgY2FuIGJlCisgICAgZm9ybWF0dGVkIHdpdGggYSB3aWRlIHJhbmdlIG9mIGF0dHJpYnV0ZXMsIHN1Y2ggYXMgaXRzIGNvbG9yLCByZWxpZWYgYW5kCisgICAgYm9yZGVyLgorCisgICAgU3Vid2lkZ2V0cyAtIE5vbmUnJycKKyAgICAjIHZhbGlkIHNwZWNpZmljIHJlc291cmNlcyBhcyBvZiBUayA4LjQKKyAgICAjIGVkaXRkb25lY21kLCBlZGl0bm90aWZ5Y21kLCBmbG9hdGluZ2NvbHMsIGZsb2F0aW5ncm93cywgZm9ybWF0Y21kLAorICAgICMgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsIGxlZnRtYXJnaW4sIGl0ZW10eXBlLCBzZWxlY3Rtb2RlLAorICAgICMgc2VsZWN0dW5pdCwgdG9wbWFyZ2luLAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc3RhdGljPSBbXQorICAgICAgICBzZWxmLmNuZj0gY25mCisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhHcmlkJywgc3RhdGljLCBjbmYsIGt3KQorCisgICAgIyB2YWxpZCBvcHRpb25zIGFzIG9mIFRrIDguNAorICAgICMgYW5jaG9yLCBiZHR5cGUsIGNnZXQsIGNvbmZpZ3VyZSwgZGVsZXRlLCBkcmFnc2l0ZSwgZHJvcHNpdGUsIGVudHJ5Y2dldCwKKyAgICAjIGVkaXQsIGVudHJ5Y29uZmlndXJlLCBmb3JtYXQsIGdlb21ldHJ5aW5mbywgaW5mbywgaW5kZXgsIG1vdmUsIG5lYXJlc3QsCisgICAgIyBzZWxlY3Rpb24sIHNldCwgc2l6ZSwgdW5zZXQsIHh2aWV3LCB5dmlldworICAgIGRlZiBhbmNob3JfY2xlYXIoc2VsZik6CisgICAgICAgICIiIlJlbW92ZXMgdGhlIHNlbGVjdGlvbiBhbmNob3IuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnYW5jaG9yJywgJ2NsZWFyJykKKworICAgIGRlZiBhbmNob3JfZ2V0KHNlbGYpOgorICAgICAgICAiR2V0IHRoZSAoeCx5KSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50IGFuY2hvciBjZWxsIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoc2VsZiwgJ2FuY2hvcicsICdnZXQnKSkKKworICAgIGRlZiBhbmNob3Jfc2V0KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJTZXQgdGhlIHNlbGVjdGlvbiBhbmNob3IgdG8gdGhlIGNlbGwgYXQgKHgsIHkpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2FuY2hvcicsICdzZXQnLCB4LCB5KQorCisgICAgZGVmIGRlbGV0ZV9yb3coc2VsZiwgZnJvbV8sIHRvPU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgcm93cyBiZXR3ZWVuIGZyb21fIGFuZCB0byBpbmNsdXNpdmUuCisgICAgICAgIElmIHRvIGlzIG5vdCBwcm92aWRlZCwgIGRlbGV0ZSBvbmx5IHJvdyBhdCBmcm9tXyIiIgorICAgICAgICBpZiB0byBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAncm93JywgZnJvbV8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2RlbGV0ZScsICdyb3cnLCBmcm9tXywgdG8pCisKKyAgICBkZWYgZGVsZXRlX2NvbHVtbihzZWxmLCBmcm9tXywgdG89Tm9uZSk6CisgICAgICAgICIiIkRlbGV0ZSBjb2x1bW5zIGJldHdlZW4gZnJvbV8gYW5kIHRvIGluY2x1c2l2ZS4KKyAgICAgICAgSWYgdG8gaXMgbm90IHByb3ZpZGVkLCAgZGVsZXRlIG9ubHkgY29sdW1uIGF0IGZyb21fIiIiCisgICAgICAgIGlmIHRvIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2RlbGV0ZScsICdjb2x1bW4nLCBmcm9tXykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnZGVsZXRlJywgJ2NvbHVtbicsIGZyb21fLCB0bykKKworICAgIGRlZiBlZGl0X2FwcGx5KHNlbGYpOgorICAgICAgICAiIiJJZiBhbnkgY2VsbCBpcyBiZWluZyBlZGl0ZWQsIGRlLWhpZ2hsaWdodCB0aGUgY2VsbCAgYW5kICBhcHBsaWVzCisgICAgICAgIHRoZSBjaGFuZ2VzLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2VkaXQnLCAnYXBwbHknKQorCisgICAgZGVmIGVkaXRfc2V0KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJIaWdobGlnaHRzICB0aGUgIGNlbGwgIGF0ICAoeCwgeSkgZm9yIGVkaXRpbmcsIGlmIHRoZSAtZWRpdG5vdGlmeQorICAgICAgICBjb21tYW5kIHJldHVybnMgVHJ1ZSBmb3IgdGhpcyBjZWxsLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2VkaXQnLCAnc2V0JywgeCwgeSkKKworICAgIGRlZiBlbnRyeWNnZXQoc2VsZiwgeCwgeSwgb3B0aW9uKToKKyAgICAgICAgIkdldCB0aGUgb3B0aW9uIHZhbHVlIGZvciBjZWxsIGF0ICh4LHkpIgorICAgICAgICBpZiBvcHRpb24gYW5kIG9wdGlvblswXSAhPSAnLSc6CisgICAgICAgICAgICBvcHRpb24gPSAnLScgKyBvcHRpb24KKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLCAnZW50cnljZ2V0JywgeCwgeSwgb3B0aW9uKQorCisgICAgZGVmIGVudHJ5Y29uZmlndXJlKHNlbGYsIHgsIHksIGNuZj1Ob25lLCAqKmt3KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgoJ2VudHJ5Y29uZmlndXJlJywgeCwgeSksIGNuZiwga3cpCisKKyAgICAjIGRlZiBmb3JtYXQKKyAgICAjIGRlZiBpbmRleAorCisgICAgZGVmIGluZm9fZXhpc3RzKHNlbGYsIHgsIHkpOgorICAgICAgICAiUmV0dXJuIFRydWUgaWYgZGlzcGxheSBpdGVtIGV4aXN0cyBhdCAoeCx5KSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGJvb2xlYW4oc2VsZi50ay5jYWxsKHNlbGYsICdpbmZvJywgJ2V4aXN0cycsIHgsIHkpKQorCisgICAgZGVmIGluZm9fYmJveChzZWxmLCB4LCB5KToKKyAgICAgICAgIyBUaGlzIHNlZW1zIHRvIGFsd2F5cyByZXR1cm4gJycsIGF0IGxlYXN0IGZvciAndGV4dCcgZGlzcGxheWl0ZW1zCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZiwgJ2luZm8nLCAnYmJveCcsIHgsIHkpCisKKyAgICBkZWYgbW92ZV9jb2x1bW4oc2VsZiwgZnJvbV8sIHRvLCBvZmZzZXQpOgorICAgICAgICAiIiJNb3ZlcyB0aGUgcmFuZ2Ugb2YgY29sdW1ucyBmcm9tIHBvc2l0aW9uIEZST00gdGhyb3VnaCBUTyBieQorICAgICAgICB0aGUgZGlzdGFuY2UgaW5kaWNhdGVkIGJ5IE9GRlNFVC4gRm9yIGV4YW1wbGUsIG1vdmVfY29sdW1uKDIsIDQsIDEpCisgICAgICAgIG1vdmVzIHRoZSBjb2x1bW5zIDIsMyw0IHRvIGNvbHVtbnMgMyw0LDUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAnbW92ZScsICdjb2x1bW4nLCBmcm9tXywgdG8sIG9mZnNldCkKKworICAgIGRlZiBtb3ZlX3JvdyhzZWxmLCBmcm9tXywgdG8sIG9mZnNldCk6CisgICAgICAgICIiIk1vdmVzIHRoZSByYW5nZSBvZiByb3dzIGZyb20gcG9zaXRpb24gRlJPTSB0aHJvdWdoIFRPIGJ5CisgICAgICAgIHRoZSBkaXN0YW5jZSBpbmRpY2F0ZWQgYnkgT0ZGU0VULgorICAgICAgICBGb3IgZXhhbXBsZSwgbW92ZV9yb3coMiwgNCwgMSkgbW92ZXMgdGhlIHJvd3MgMiwzLDQgdG8gcm93cyAzLDQsNS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdtb3ZlJywgJ3JvdycsIGZyb21fLCB0bywgb2Zmc2V0KQorCisgICAgZGVmIG5lYXJlc3Qoc2VsZiwgeCwgeSk6CisgICAgICAgICJSZXR1cm4gY29vcmRpbmF0ZSBvZiBjZWxsIG5lYXJlc3QgcGl4ZWwgY29vcmRpbmF0ZSAoeCx5KSIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKHNlbGYsICduZWFyZXN0JywgeCwgeSkpCisKKyAgICAjIGRlZiBzZWxlY3Rpb24gYWRqdXN0CisgICAgIyBkZWYgc2VsZWN0aW9uIGNsZWFyCisgICAgIyBkZWYgc2VsZWN0aW9uIGluY2x1ZGVzCisgICAgIyBkZWYgc2VsZWN0aW9uIHNldAorICAgICMgZGVmIHNlbGVjdGlvbiB0b2dnbGUKKworICAgIGRlZiBzZXQoc2VsZiwgeCwgeSwgaXRlbXR5cGU9Tm9uZSwgKiprdyk6CisgICAgICAgIGFyZ3M9IHNlbGYuX29wdGlvbnMoc2VsZi5jbmYsIGt3KQorICAgICAgICBpZiBpdGVtdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFyZ3M9ICgnLWl0ZW10eXBlJywgaXRlbXR5cGUpICsgYXJncworICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ3NldCcsIHgsIHksICphcmdzKQorCisgICAgZGVmIHNpemVfY29sdW1uKHNlbGYsIGluZGV4LCAqKmt3KToKKyAgICAgICAgIiIiUXVlcmllcyBvciBzZXRzIHRoZSBzaXplIG9mIHRoZSBjb2x1bW4gZ2l2ZW4gYnkKKyAgICAgICAgSU5ERVguICBJTkRFWCBtYXkgYmUgYW55IG5vbi1uZWdhdGl2ZQorICAgICAgICBpbnRlZ2VyIHRoYXQgZ2l2ZXMgdGhlIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gY29sdW1uLgorICAgICAgICBJTkRFWCBjYW4gYWxzbyBiZSB0aGUgc3RyaW5nICJkZWZhdWx0IjsgaW4gdGhpcyBjYXNlLCB0aGlzIGNvbW1hbmQKKyAgICAgICAgcXVlcmllcyBvciBzZXRzIHRoZSBkZWZhdWx0IHNpemUgb2YgYWxsIGNvbHVtbnMuCisgICAgICAgIFdoZW4gbm8gb3B0aW9uLXZhbHVlIHBhaXIgaXMgZ2l2ZW4sIHRoaXMgY29tbWFuZCByZXR1cm5zIGEgdHVwbGUKKyAgICAgICAgY29udGFpbmluZyB0aGUgY3VycmVudCBzaXplIHNldHRpbmcgb2YgdGhlIGdpdmVuIGNvbHVtbi4gIFdoZW4KKyAgICAgICAgb3B0aW9uLXZhbHVlIHBhaXJzIGFyZSBnaXZlbiwgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW9ucyBvZiB0aGUKKyAgICAgICAgc2l6ZSBzZXR0aW5nIG9mIHRoZSBnaXZlbiBjb2x1bW4gYXJlIGNoYW5nZWQuIE9wdGlvbnMgbWF5IGJlIG9uZQorICAgICAgICBvZiB0aGUgZm9sbHdpbmc6CisgICAgICAgICAgICAgIHBhZDAgcGl4ZWxzCisgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHBhZGRpbmdzIHRvIHRoZSBsZWZ0IG9mIGEgY29sdW1uLgorICAgICAgICAgICAgICBwYWQxIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYWRkaW5ncyB0byB0aGUgcmlnaHQgb2YgYSBjb2x1bW4uCisgICAgICAgICAgICAgIHNpemUgdmFsCisgICAgICAgICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHdpZHRoIG9mIGEgY29sdW1uLiAgVmFsIG1heSBiZToKKyAgICAgICAgICAgICAgICAgICAgICJhdXRvIiAtLSB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbiBpcyBzZXQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICB3aWR0aCBvZiB0aGUgd2lkZXN0IGNlbGwgaW4gdGhlIGNvbHVtbjsKKyAgICAgICAgICAgICAgICAgICAgIGEgdmFsaWQgVGsgc2NyZWVuIGRpc3RhbmNlIHVuaXQ7CisgICAgICAgICAgICAgICAgICAgICBvciBhIHJlYWwgbnVtYmVyIGZvbGxvd2luZyBieSB0aGUgd29yZCBjaGFycworICAgICAgICAgICAgICAgICAgICAgKGUuZy4gMy40Y2hhcnMpIHRoYXQgc2V0cyB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbiB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBjaGFyYWN0ZXJzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NpemUnLCAnY29sdW1uJywgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWxmLl9vcHRpb25zKHt9LCBrdykpKQorCisgICAgZGVmIHNpemVfcm93KHNlbGYsIGluZGV4LCAqKmt3KToKKyAgICAgICAgIiIiUXVlcmllcyBvciBzZXRzIHRoZSBzaXplIG9mIHRoZSByb3cgZ2l2ZW4gYnkKKyAgICAgICAgSU5ERVguIElOREVYIG1heSBiZSBhbnkgbm9uLW5lZ2F0aXZlCisgICAgICAgIGludGVnZXIgdGhhdCBnaXZlcyB0aGUgcG9zaXRpb24gb2YgYSBnaXZlbiByb3cgLgorICAgICAgICBJTkRFWCBjYW4gYWxzbyBiZSB0aGUgc3RyaW5nICJkZWZhdWx0IjsgaW4gdGhpcyBjYXNlLCB0aGlzIGNvbW1hbmQKKyAgICAgICAgcXVlcmllcyBvciBzZXRzIHRoZSBkZWZhdWx0IHNpemUgb2YgYWxsIHJvd3MuCisgICAgICAgIFdoZW4gbm8gb3B0aW9uLXZhbHVlIHBhaXIgaXMgZ2l2ZW4sIHRoaXMgY29tbWFuZCByZXR1cm5zIGEgbGlzdCBjb24tCisgICAgICAgIHRhaW5pbmcgdGhlIGN1cnJlbnQgc2l6ZSBzZXR0aW5nIG9mIHRoZSBnaXZlbiByb3cgLiBXaGVuIG9wdGlvbi12YWx1ZQorICAgICAgICBwYWlycyBhcmUgZ2l2ZW4sIHRoZSBjb3JyZXNwb25kaW5nIG9wdGlvbnMgb2YgdGhlIHNpemUgc2V0dGluZyBvZiB0aGUKKyAgICAgICAgZ2l2ZW4gcm93IGFyZSBjaGFuZ2VkLiBPcHRpb25zIG1heSBiZSBvbmUgb2YgdGhlIGZvbGx3aW5nOgorICAgICAgICAgICAgICBwYWQwIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYWRkaW5ncyB0byB0aGUgdG9wIG9mIGEgcm93LgorICAgICAgICAgICAgICBwYWQxIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwYWRkaW5ncyB0byB0aGUgYm90dG9tIG9mIGEgcm93LgorICAgICAgICAgICAgICBzaXplIHZhbAorICAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgYSByb3cuICBWYWwgbWF5IGJlOgorICAgICAgICAgICAgICAgICAgICAgImF1dG8iIC0tIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyBpcyBzZXQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgb2YgdGhlIGhpZ2hlc3QgY2VsbCBpbiB0aGUgcm93OworICAgICAgICAgICAgICAgICAgICAgYSB2YWxpZCBUayBzY3JlZW4gZGlzdGFuY2UgdW5pdDsKKyAgICAgICAgICAgICAgICAgICAgIG9yIGEgcmVhbCBudW1iZXIgZm9sbG93aW5nIGJ5IHRoZSB3b3JkIGNoYXJzCisgICAgICAgICAgICAgICAgICAgICAoZS5nLiAzLjRjaGFycykgdGhhdCBzZXRzIHRoZSBoZWlnaHQgb2YgdGhlIHJvdyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBjaGFyYWN0ZXJzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICAgIHNlbGYsICdzaXplJywgJ3JvdycsIGluZGV4LCAqc2VsZi5fb3B0aW9ucyh7fSwga3cpKSkKKworICAgIGRlZiB1bnNldChzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiQ2xlYXJzIHRoZSBjZWxsIGF0ICh4LCB5KSBieSByZW1vdmluZyBpdHMgZGlzcGxheSBpdGVtLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3Vuc2V0JywgeCwgeSkKKworCitjbGFzcyBTY3JvbGxlZEdyaWQoR3JpZCk6CisgICAgJycnU2Nyb2xsZWQgR3JpZCB3aWRnZXRzJycnCisKKyAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc3RhdGljPSBbXQorICAgICAgICBzZWxmLmNuZj0gY25mCisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTY3JvbGxlZEdyaWQnLCBzdGF0aWMsIGNuZiwga3cpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9UaXgucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJlN2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9UaXgucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDJlN2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGl4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2NvbnN0YW50cy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrY29uc3RhbnRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWVlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2NvbnN0YW50cy5weQpAQCAtMCwwICsxLDExMCBAQAorIyBTeW1ib2xpYyBjb25zdGFudHMgZm9yIFRrCisKKyMgQm9vbGVhbnMKK05PPUZBTFNFPU9GRj0wCitZRVM9VFJVRT1PTj0xCisKKyMgLWFuY2hvciBhbmQgLXN0aWNreQorTj0nbicKK1M9J3MnCitXPSd3JworRT0nZScKK05XPSdudycKK1NXPSdzdycKK05FPSduZScKK1NFPSdzZScKK05TPSducycKK0VXPSdldycKK05TRVc9J25zZXcnCitDRU5URVI9J2NlbnRlcicKKworIyAtZmlsbAorTk9ORT0nbm9uZScKK1g9J3gnCitZPSd5JworQk9USD0nYm90aCcKKworIyAtc2lkZQorTEVGVD0nbGVmdCcKK1RPUD0ndG9wJworUklHSFQ9J3JpZ2h0JworQk9UVE9NPSdib3R0b20nCisKKyMgLXJlbGllZgorUkFJU0VEPSdyYWlzZWQnCitTVU5LRU49J3N1bmtlbicKK0ZMQVQ9J2ZsYXQnCitSSURHRT0ncmlkZ2UnCitHUk9PVkU9J2dyb292ZScKK1NPTElEID0gJ3NvbGlkJworCisjIC1vcmllbnQKK0hPUklaT05UQUw9J2hvcml6b250YWwnCitWRVJUSUNBTD0ndmVydGljYWwnCisKKyMgLXRhYnMKK05VTUVSSUM9J251bWVyaWMnCisKKyMgLXdyYXAKK0NIQVI9J2NoYXInCitXT1JEPSd3b3JkJworCisjIC1hbGlnbgorQkFTRUxJTkU9J2Jhc2VsaW5lJworCisjIC1ib3JkZXJtb2RlCitJTlNJREU9J2luc2lkZScKK09VVFNJREU9J291dHNpZGUnCisKKyMgU3BlY2lhbCB0YWdzLCBtYXJrcyBhbmQgaW5zZXJ0IHBvc2l0aW9ucworU0VMPSdzZWwnCitTRUxfRklSU1Q9J3NlbC5maXJzdCcKK1NFTF9MQVNUPSdzZWwubGFzdCcKK0VORD0nZW5kJworSU5TRVJUPSdpbnNlcnQnCitDVVJSRU5UPSdjdXJyZW50JworQU5DSE9SPSdhbmNob3InCitBTEw9J2FsbCcgIyBlLmcuIENhbnZhcy5kZWxldGUoQUxMKQorCisjIFRleHQgd2lkZ2V0IGFuZCBidXR0b24gc3RhdGVzCitOT1JNQUw9J25vcm1hbCcKK0RJU0FCTEVEPSdkaXNhYmxlZCcKK0FDVElWRT0nYWN0aXZlJworIyBDYW52YXMgc3RhdGUKK0hJRERFTj0naGlkZGVuJworCisjIE1lbnUgaXRlbSB0eXBlcworQ0FTQ0FERT0nY2FzY2FkZScKK0NIRUNLQlVUVE9OPSdjaGVja2J1dHRvbicKK0NPTU1BTkQ9J2NvbW1hbmQnCitSQURJT0JVVFRPTj0ncmFkaW9idXR0b24nCitTRVBBUkFUT1I9J3NlcGFyYXRvcicKKworIyBTZWxlY3Rpb24gbW9kZXMgZm9yIGxpc3QgYm94ZXMKK1NJTkdMRT0nc2luZ2xlJworQlJPV1NFPSdicm93c2UnCitNVUxUSVBMRT0nbXVsdGlwbGUnCitFWFRFTkRFRD0nZXh0ZW5kZWQnCisKKyMgQWN0aXZlc3R5bGUgZm9yIGxpc3QgYm94ZXMKKyMgTk9ORT0nbm9uZScgaXMgYWxzbyB2YWxpZAorRE9UQk9YPSdkb3Rib3gnCitVTkRFUkxJTkU9J3VuZGVybGluZScKKworIyBWYXJpb3VzIGNhbnZhcyBzdHlsZXMKK1BJRVNMSUNFPSdwaWVzbGljZScKK0NIT1JEPSdjaG9yZCcKK0FSQz0nYXJjJworRklSU1Q9J2ZpcnN0JworTEFTVD0nbGFzdCcKK0JVVFQ9J2J1dHQnCitQUk9KRUNUSU5HPSdwcm9qZWN0aW5nJworUk9VTkQ9J3JvdW5kJworQkVWRUw9J2JldmVsJworTUlURVI9J21pdGVyJworCisjIEFyZ3VtZW50cyB0byB4dmlldy95dmlldworTU9WRVRPPSdtb3ZldG8nCitTQ1JPTEw9J3Njcm9sbCcKK1VOSVRTPSd1bml0cycKK1BBR0VTPSdwYWdlcycKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RrY29uc3RhbnRzLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrY29uc3RhbnRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmYxOGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtjb25zdGFudHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RrY29uc3RhbnRzLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrY29uc3RhbnRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmYxOGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtjb25zdGFudHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL1RrZG5kLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtkbmQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUzN2Q5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RrZG5kLnB5CkBAIC0wLDAgKzEsMzIxIEBACisiIiJEcmFnLWFuZC1kcm9wIHN1cHBvcnQgZm9yIFRraW50ZXIuCisKK1RoaXMgaXMgdmVyeSBwcmVsaW1pbmFyeS4gIEkgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBkbmQgKndpdGhpbiogb25lCithcHBsaWNhdGlvbiwgYmV0d2VlbiBkaWZmZXJlbnQgd2luZG93cyAob3Igd2l0aGluIHRoZSBzYW1lIHdpbmRvdykuCisKK0kgYW4gdHJ5aW5nIHRvIG1ha2UgdGhpcyBhcyBnZW5lcmljIGFzIHBvc3NpYmxlIC0tIG5vdCBkZXBlbmRlbnQgb24KK3RoZSB1c2Ugb2YgYSBwYXJ0aWN1bGFyIHdpZGdldCBvciBpY29uIHR5cGUsIGV0Yy4gIEkgYWxzbyBob3BlIHRoYXQKK3RoaXMgd2lsbCB3b3JrIHdpdGggUG13LgorCitUbyBlbmFibGUgYW4gb2JqZWN0IHRvIGJlIGRyYWdnZWQsIHlvdSBtdXN0IGNyZWF0ZSBhbiBldmVudCBiaW5kaW5nCitmb3IgaXQgdGhhdCBzdGFydHMgdGhlIGRyYWctYW5kLWRyb3AgcHJvY2Vzcy4gVHlwaWNhbGx5LCB5b3Ugc2hvdWxkCitiaW5kIDxCdXR0b25QcmVzcz4gdG8gYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHlvdSB3cml0ZS4gVGhlIGZ1bmN0aW9uCitzaG91bGQgY2FsbCBUa2RuZC5kbmRfc3RhcnQoc291cmNlLCBldmVudCksIHdoZXJlICdzb3VyY2UnIGlzIHRoZQorb2JqZWN0IHRvIGJlIGRyYWdnZWQsIGFuZCAnZXZlbnQnIGlzIHRoZSBldmVudCB0aGF0IGludm9rZWQgdGhlIGNhbGwKKyh0aGUgYXJndW1lbnQgdG8geW91ciBjYWxsYmFjayBmdW5jdGlvbikuICBFdmVuIHRob3VnaCB0aGlzIGlzIGEgY2xhc3MKK2luc3RhbnRpYXRpb24sIHRoZSByZXR1cm5lZCBpbnN0YW5jZSBzaG91bGQgbm90IGJlIHN0b3JlZCAtLSBpdCB3aWxsCitiZSBrZXB0IGFsaXZlIGF1dG9tYXRpY2FsbHkgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZy1hbmQtZHJvcC4KKworV2hlbiBhIGRyYWctYW5kLWRyb3AgaXMgYWxyZWFkeSBpbiBwcm9jZXNzIGZvciB0aGUgVGsgaW50ZXJwcmV0ZXIsIHRoZQorY2FsbCBpcyAqaWdub3JlZCo7IHRoaXMgbm9ybWFsbHkgYXZlcnRzIHN0YXJ0aW5nIG11bHRpcGxlIHNpbXVsdGFuZW91cworZG5kIHByb2Nlc3NlcywgZS5nLiBiZWNhdXNlIGRpZmZlcmVudCBidXR0b24gY2FsbGJhY2tzIGFsbAorZG5kX3N0YXJ0KCkuCisKK1RoZSBvYmplY3QgaXMgKm5vdCogbmVjZXNzYXJpbHkgYSB3aWRnZXQgLS0gaXQgY2FuIGJlIGFueQorYXBwbGljYXRpb24tc3BlY2lmaWMgb2JqZWN0IHRoYXQgaXMgbWVhbmluZ2Z1bCB0byBwb3RlbnRpYWwKK2RyYWctYW5kLWRyb3AgdGFyZ2V0cy4KKworUG90ZW50aWFsIGRyYWctYW5kLWRyb3AgdGFyZ2V0cyBhcmUgZGlzY292ZXJlZCBhcyBmb2xsb3dzLiAgV2hlbmV2ZXIKK3RoZSBtb3VzZSBtb3ZlcywgYW5kIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIGEgZHJhZy1hbmQtZHJvcCBtb3ZlLCB0aGUKK1RrIHdpZGdldCBkaXJlY3RseSB1bmRlciB0aGUgbW91c2UgaXMgaW5zcGVjdGVkLiAgVGhpcyBpcyB0aGUgdGFyZ2V0Cit3aWRnZXQgKG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIHRoZSB0YXJnZXQgb2JqZWN0LCB5ZXQgdG8gYmUKK2RldGVybWluZWQpLiAgSWYgdGhlcmUgaXMgbm8gdGFyZ2V0IHdpZGdldCwgdGhlcmUgaXMgbm8gZG5kIHRhcmdldAorb2JqZWN0LiAgSWYgdGhlcmUgaXMgYSB0YXJnZXQgd2lkZ2V0LCBhbmQgaXQgaGFzIGFuIGF0dHJpYnV0ZQorZG5kX2FjY2VwdCwgdGhpcyBzaG91bGQgYmUgYSBmdW5jdGlvbiAob3IgYW55IGNhbGxhYmxlIG9iamVjdCkuICBUaGUKK2Z1bmN0aW9uIGlzIGNhbGxlZCBhcyBkbmRfYWNjZXB0KHNvdXJjZSwgZXZlbnQpLCB3aGVyZSAnc291cmNlJyBpcyB0aGUKK29iamVjdCBiZWluZyBkcmFnZ2VkICh0aGUgb2JqZWN0IHBhc3NlZCB0byBkbmRfc3RhcnQoKSBhYm92ZSksIGFuZAorJ2V2ZW50JyBpcyB0aGUgbW9zdCByZWNlbnQgZXZlbnQgb2JqZWN0IChnZW5lcmFsbHkgYSA8TW90aW9uPiBldmVudDsKK2l0IGNhbiBhbHNvIGJlIDxCdXR0b25QcmVzcz4gb3IgPEJ1dHRvblJlbGVhc2U+KS4gIElmIHRoZSBkbmRfYWNjZXB0KCkKK2Z1bmN0aW9uIHJldHVybnMgc29tZXRoaW5nIG90aGVyIHRoYW4gTm9uZSwgdGhpcyBpcyB0aGUgbmV3IGRuZCB0YXJnZXQKK29iamVjdC4gIElmIGRuZF9hY2NlcHQoKSByZXR1cm5zIE5vbmUsIG9yIGlmIHRoZSB0YXJnZXQgd2lkZ2V0IGhhcyBubworZG5kX2FjY2VwdCBhdHRyaWJ1dGUsIHRoZSB0YXJnZXQgd2lkZ2V0J3MgcGFyZW50IGlzIGNvbnNpZGVyZWQgYXMgdGhlCit0YXJnZXQgd2lkZ2V0LCBhbmQgdGhlIHNlYXJjaCBmb3IgYSB0YXJnZXQgb2JqZWN0IGlzIHJlcGVhdGVkIGZyb20KK3RoZXJlLiAgSWYgbmVjZXNzYXJ5LCB0aGUgc2VhcmNoIGlzIHJlcGVhdGVkIGFsbCB0aGUgd2F5IHVwIHRvIHRoZQorcm9vdCB3aWRnZXQuICBJZiBub25lIG9mIHRoZSB0YXJnZXQgd2lkZ2V0cyBjYW4gcHJvZHVjZSBhIHRhcmdldAorb2JqZWN0LCB0aGVyZSBpcyBubyB0YXJnZXQgb2JqZWN0ICh0aGUgdGFyZ2V0IG9iamVjdCBpcyBOb25lKS4KKworVGhlIHRhcmdldCBvYmplY3QgdGh1cyBwcm9kdWNlZCwgaWYgYW55LCBpcyBjYWxsZWQgdGhlIG5ldyB0YXJnZXQKK29iamVjdC4gIEl0IGlzIGNvbXBhcmVkIHdpdGggdGhlIG9sZCB0YXJnZXQgb2JqZWN0IChvciBOb25lLCBpZiB0aGVyZQord2FzIG5vIG9sZCB0YXJnZXQgd2lkZ2V0KS4gIFRoZXJlIGFyZSBzZXZlcmFsIGNhc2VzICgnc291cmNlJyBpcyB0aGUKK3NvdXJjZSBvYmplY3QsIGFuZCAnZXZlbnQnIGlzIHRoZSBtb3N0IHJlY2VudCBldmVudCBvYmplY3QpOgorCistIEJvdGggdGhlIG9sZCBhbmQgbmV3IHRhcmdldCBvYmplY3RzIGFyZSBOb25lLiAgTm90aGluZyBoYXBwZW5zLgorCistIFRoZSBvbGQgYW5kIG5ldyB0YXJnZXQgb2JqZWN0cyBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgSXRzIG1ldGhvZAorZG5kX21vdGlvbihzb3VyY2UsIGV2ZW50KSBpcyBjYWxsZWQuCisKKy0gVGhlIG9sZCB0YXJnZXQgb2JqZWN0IHdhcyBOb25lLCBhbmQgdGhlIG5ldyB0YXJnZXQgb2JqZWN0IGlzIG5vdAorTm9uZS4gIFRoZSBuZXcgdGFyZ2V0IG9iamVjdCdzIG1ldGhvZCBkbmRfZW50ZXIoc291cmNlLCBldmVudCkgaXMKK2NhbGxlZC4KKworLSBUaGUgbmV3IHRhcmdldCBvYmplY3QgaXMgTm9uZSwgYW5kIHRoZSBvbGQgdGFyZ2V0IG9iamVjdCBpcyBub3QKK05vbmUuICBUaGUgb2xkIHRhcmdldCBvYmplY3QncyBtZXRob2QgZG5kX2xlYXZlKHNvdXJjZSwgZXZlbnQpIGlzCitjYWxsZWQuCisKKy0gVGhlIG9sZCBhbmQgbmV3IHRhcmdldCBvYmplY3RzIGRpZmZlciBhbmQgbmVpdGhlciBpcyBOb25lLiAgVGhlIG9sZAordGFyZ2V0IG9iamVjdCdzIG1ldGhvZCBkbmRfbGVhdmUoc291cmNlLCBldmVudCksIGFuZCB0aGVuIHRoZSBuZXcKK3RhcmdldCBvYmplY3QncyBtZXRob2QgZG5kX2VudGVyKHNvdXJjZSwgZXZlbnQpIGlzIGNhbGxlZC4KKworT25jZSB0aGlzIGlzIGRvbmUsIHRoZSBuZXcgdGFyZ2V0IG9iamVjdCByZXBsYWNlcyB0aGUgb2xkIG9uZSwgYW5kIHRoZQorVGsgbWFpbmxvb3AgcHJvY2VlZHMuICBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBtZXRob2RzIG1lbnRpb25lZCBhYm92ZQoraXMgaWdub3JlZDsgaWYgdGhleSByYWlzZSBhbiBleGNlcHRpb24sIHRoZSBub3JtYWwgZXhjZXB0aW9uIGhhbmRsaW5nCittZWNoYW5pc21zIHRha2Ugb3Zlci4KKworVGhlIGRyYWctYW5kLWRyb3AgcHJvY2Vzc2VzIGNhbiBlbmQgaW4gdHdvIHdheXM6IGEgZmluYWwgdGFyZ2V0IG9iamVjdAoraXMgc2VsZWN0ZWQsIG9yIG5vIGZpbmFsIHRhcmdldCBvYmplY3QgaXMgc2VsZWN0ZWQuICBXaGVuIGEgZmluYWwKK3RhcmdldCBvYmplY3QgaXMgc2VsZWN0ZWQsIGl0IHdpbGwgYWx3YXlzIGhhdmUgYmVlbiBub3RpZmllZCBvZiB0aGUKK3BvdGVudGlhbCBkcm9wIGJ5IGEgY2FsbCB0byBpdHMgZG5kX2VudGVyKCkgbWV0aG9kLCBhcyBkZXNjcmliZWQKK2Fib3ZlLCBhbmQgcG9zc2libHkgb25lIG9yIG1vcmUgY2FsbHMgdG8gaXRzIGRuZF9tb3Rpb24oKSBtZXRob2Q7IGl0cworZG5kX2xlYXZlKCkgbWV0aG9kIGhhcyBub3QgYmVlbiBjYWxsZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0bworZG5kX2VudGVyKCkuICBUaGUgdGFyZ2V0IGlzIG5vdGlmaWVkIG9mIHRoZSBkcm9wIGJ5IGEgY2FsbCB0byBpdHMKK21ldGhvZCBkbmRfY29tbWl0KHNvdXJjZSwgZXZlbnQpLgorCitJZiBubyBmaW5hbCB0YXJnZXQgb2JqZWN0IGlzIHNlbGVjdGVkLCBhbmQgdGhlcmUgd2FzIGFuIG9sZCB0YXJnZXQKK29iamVjdCwgaXRzIGRuZF9sZWF2ZShzb3VyY2UsIGV2ZW50KSBtZXRob2QgaXMgY2FsbGVkIHRvIGNvbXBsZXRlIHRoZQorZG5kIHNlcXVlbmNlLgorCitGaW5hbGx5LCB0aGUgc291cmNlIG9iamVjdCBpcyBub3RpZmllZCB0aGF0IHRoZSBkcmFnLWFuZC1kcm9wIHByb2Nlc3MKK2lzIG92ZXIsIGJ5IGEgY2FsbCB0byBzb3VyY2UuZG5kX2VuZCh0YXJnZXQsIGV2ZW50KSwgc3BlY2lmeWluZyBlaXRoZXIKK3RoZSBzZWxlY3RlZCB0YXJnZXQgb2JqZWN0LCBvciBOb25lIGlmIG5vIHRhcmdldCBvYmplY3Qgd2FzIHNlbGVjdGVkLgorVGhlIHNvdXJjZSBvYmplY3QgY2FuIHVzZSB0aGlzIHRvIGltcGxlbWVudCB0aGUgY29tbWl0IGFjdGlvbjsgdGhpcyBpcworc29tZXRpbWVzIHNpbXBsZXIgdGhhbiB0byBkbyBpdCBpbiB0aGUgdGFyZ2V0J3MgZG5kX2NvbW1pdCgpLiAgVGhlCit0YXJnZXQncyBkbmRfY29tbWl0KCkgbWV0aG9kIGNvdWxkIHRoZW4gc2ltcGx5IGJlIGFsaWFzZWQgdG8KK2RuZF9sZWF2ZSgpLgorCitBdCBhbnkgdGltZSBkdXJpbmcgYSBkbmQgc2VxdWVuY2UsIHRoZSBhcHBsaWNhdGlvbiBjYW4gY2FuY2VsIHRoZQorc2VxdWVuY2UgYnkgY2FsbGluZyB0aGUgY2FuY2VsKCkgbWV0aG9kIG9uIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkKK2RuZF9zdGFydCgpLiAgVGhpcyB3aWxsIGNhbGwgZG5kX2xlYXZlKCkgaWYgYSB0YXJnZXQgaXMgY3VycmVudGx5CithY3RpdmU7IGl0IHdpbGwgbmV2ZXIgY2FsbCBkbmRfY29tbWl0KCkuCisKKyIiIgorCisKK2ltcG9ydCBUa2ludGVyCisKKworIyBUaGUgZmFjdG9yeSBmdW5jdGlvbgorCitkZWYgZG5kX3N0YXJ0KHNvdXJjZSwgZXZlbnQpOgorICAgIGggPSBEbmRIYW5kbGVyKHNvdXJjZSwgZXZlbnQpCisgICAgaWYgaC5yb290OgorICAgICAgICByZXR1cm4gaAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisKKworIyBUaGUgY2xhc3MgdGhhdCBkb2VzIHRoZSB3b3JrCisKK2NsYXNzIERuZEhhbmRsZXI6CisKKyAgICByb290ID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvdXJjZSwgZXZlbnQpOgorICAgICAgICBpZiBldmVudC5udW0gPiA1OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJvb3QgPSBldmVudC53aWRnZXQuX3Jvb3QoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByb290Ll9fZG5kCisgICAgICAgICAgICByZXR1cm4gIyBEb24ndCBzdGFydCByZWN1cnNpdmUgZG5kCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJvb3QuX19kbmQgPSBzZWxmCisgICAgICAgICAgICBzZWxmLnJvb3QgPSByb290CisgICAgICAgIHNlbGYuc291cmNlID0gc291cmNlCisgICAgICAgIHNlbGYudGFyZ2V0ID0gTm9uZQorICAgICAgICBzZWxmLmluaXRpYWxfYnV0dG9uID0gYnV0dG9uID0gZXZlbnQubnVtCisgICAgICAgIHNlbGYuaW5pdGlhbF93aWRnZXQgPSB3aWRnZXQgPSBldmVudC53aWRnZXQKKyAgICAgICAgc2VsZi5yZWxlYXNlX3BhdHRlcm4gPSAiPEIlZC1CdXR0b25SZWxlYXNlLSVkPiIgJSAoYnV0dG9uLCBidXR0b24pCisgICAgICAgIHNlbGYuc2F2ZV9jdXJzb3IgPSB3aWRnZXRbJ2N1cnNvciddIG9yICIiCisgICAgICAgIHdpZGdldC5iaW5kKHNlbGYucmVsZWFzZV9wYXR0ZXJuLCBzZWxmLm9uX3JlbGVhc2UpCisgICAgICAgIHdpZGdldC5iaW5kKCI8TW90aW9uPiIsIHNlbGYub25fbW90aW9uKQorICAgICAgICB3aWRnZXRbJ2N1cnNvciddID0gImhhbmQyIgorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHJvb3QgPSBzZWxmLnJvb3QKKyAgICAgICAgc2VsZi5yb290ID0gTm9uZQorICAgICAgICBpZiByb290OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCByb290Ll9fZG5kCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIG9uX21vdGlvbihzZWxmLCBldmVudCk6CisgICAgICAgIHgsIHkgPSBldmVudC54X3Jvb3QsIGV2ZW50Lnlfcm9vdAorICAgICAgICB0YXJnZXRfd2lkZ2V0ID0gc2VsZi5pbml0aWFsX3dpZGdldC53aW5mb19jb250YWluaW5nKHgsIHkpCisgICAgICAgIHNvdXJjZSA9IHNlbGYuc291cmNlCisgICAgICAgIG5ld190YXJnZXQgPSBOb25lCisgICAgICAgIHdoaWxlIHRhcmdldF93aWRnZXQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYXR0ciA9IHRhcmdldF93aWRnZXQuZG5kX2FjY2VwdAorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3X3RhcmdldCA9IGF0dHIoc291cmNlLCBldmVudCkKKyAgICAgICAgICAgICAgICBpZiBuZXdfdGFyZ2V0OgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGFyZ2V0X3dpZGdldCA9IHRhcmdldF93aWRnZXQubWFzdGVyCisgICAgICAgIG9sZF90YXJnZXQgPSBzZWxmLnRhcmdldAorICAgICAgICBpZiBvbGRfdGFyZ2V0IGlzIG5ld190YXJnZXQ6CisgICAgICAgICAgICBpZiBvbGRfdGFyZ2V0OgorICAgICAgICAgICAgICAgIG9sZF90YXJnZXQuZG5kX21vdGlvbihzb3VyY2UsIGV2ZW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb2xkX3RhcmdldDoKKyAgICAgICAgICAgICAgICBzZWxmLnRhcmdldCA9IE5vbmUKKyAgICAgICAgICAgICAgICBvbGRfdGFyZ2V0LmRuZF9sZWF2ZShzb3VyY2UsIGV2ZW50KQorICAgICAgICAgICAgaWYgbmV3X3RhcmdldDoKKyAgICAgICAgICAgICAgICBuZXdfdGFyZ2V0LmRuZF9lbnRlcihzb3VyY2UsIGV2ZW50KQorICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0ID0gbmV3X3RhcmdldAorCisgICAgZGVmIG9uX3JlbGVhc2Uoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLmZpbmlzaChldmVudCwgMSkKKworICAgIGRlZiBjYW5jZWwoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgIHNlbGYuZmluaXNoKGV2ZW50LCAwKQorCisgICAgZGVmIGZpbmlzaChzZWxmLCBldmVudCwgY29tbWl0PTApOgorICAgICAgICB0YXJnZXQgPSBzZWxmLnRhcmdldAorICAgICAgICBzb3VyY2UgPSBzZWxmLnNvdXJjZQorICAgICAgICB3aWRnZXQgPSBzZWxmLmluaXRpYWxfd2lkZ2V0CisgICAgICAgIHJvb3QgPSBzZWxmLnJvb3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHJvb3QuX19kbmQKKyAgICAgICAgICAgIHNlbGYuaW5pdGlhbF93aWRnZXQudW5iaW5kKHNlbGYucmVsZWFzZV9wYXR0ZXJuKQorICAgICAgICAgICAgc2VsZi5pbml0aWFsX3dpZGdldC51bmJpbmQoIjxNb3Rpb24+IikKKyAgICAgICAgICAgIHdpZGdldFsnY3Vyc29yJ10gPSBzZWxmLnNhdmVfY3Vyc29yCisgICAgICAgICAgICBzZWxmLnRhcmdldCA9IHNlbGYuc291cmNlID0gc2VsZi5pbml0aWFsX3dpZGdldCA9IHNlbGYucm9vdCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHRhcmdldDoKKyAgICAgICAgICAgICAgICBpZiBjb21taXQ6CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5kbmRfY29tbWl0KHNvdXJjZSwgZXZlbnQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmRuZF9sZWF2ZShzb3VyY2UsIGV2ZW50KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc291cmNlLmRuZF9lbmQodGFyZ2V0LCBldmVudCkKKworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgcmVzdCBpcyBoZXJlIGZvciB0ZXN0aW5nIGFuZCBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIG9ubHkhCisKK2NsYXNzIEljb246CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5jYW52YXMgPSBzZWxmLmxhYmVsID0gc2VsZi5pZCA9IE5vbmUKKworICAgIGRlZiBhdHRhY2goc2VsZiwgY2FudmFzLCB4PTEwLCB5PTEwKToKKyAgICAgICAgaWYgY2FudmFzIGlzIHNlbGYuY2FudmFzOgorICAgICAgICAgICAgc2VsZi5jYW52YXMuY29vcmRzKHNlbGYuaWQsIHgsIHkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5jYW52YXM6CisgICAgICAgICAgICBzZWxmLmRldGFjaCgpCisgICAgICAgIGlmIG5vdCBjYW52YXM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbGFiZWwgPSBUa2ludGVyLkxhYmVsKGNhbnZhcywgdGV4dD1zZWxmLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJ3aWR0aD0yLCByZWxpZWY9InJhaXNlZCIpCisgICAgICAgIGlkID0gY2FudmFzLmNyZWF0ZV93aW5kb3coeCwgeSwgd2luZG93PWxhYmVsLCBhbmNob3I9Im53IikKKyAgICAgICAgc2VsZi5jYW52YXMgPSBjYW52YXMKKyAgICAgICAgc2VsZi5sYWJlbCA9IGxhYmVsCisgICAgICAgIHNlbGYuaWQgPSBpZAorICAgICAgICBsYWJlbC5iaW5kKCI8QnV0dG9uUHJlc3M+Iiwgc2VsZi5wcmVzcykKKworICAgIGRlZiBkZXRhY2goc2VsZik6CisgICAgICAgIGNhbnZhcyA9IHNlbGYuY2FudmFzCisgICAgICAgIGlmIG5vdCBjYW52YXM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWQgPSBzZWxmLmlkCisgICAgICAgIGxhYmVsID0gc2VsZi5sYWJlbAorICAgICAgICBzZWxmLmNhbnZhcyA9IHNlbGYubGFiZWwgPSBzZWxmLmlkID0gTm9uZQorICAgICAgICBjYW52YXMuZGVsZXRlKGlkKQorICAgICAgICBsYWJlbC5kZXN0cm95KCkKKworICAgIGRlZiBwcmVzcyhzZWxmLCBldmVudCk6CisgICAgICAgIGlmIGRuZF9zdGFydChzZWxmLCBldmVudCk6CisgICAgICAgICAgICAjIHdoZXJlIHRoZSBwb2ludGVyIGlzIHJlbGF0aXZlIHRvIHRoZSBsYWJlbCB3aWRnZXQ6CisgICAgICAgICAgICBzZWxmLnhfb2ZmID0gZXZlbnQueAorICAgICAgICAgICAgc2VsZi55X29mZiA9IGV2ZW50LnkKKyAgICAgICAgICAgICMgd2hlcmUgdGhlIHdpZGdldCBpcyByZWxhdGl2ZSB0byB0aGUgY2FudmFzOgorICAgICAgICAgICAgc2VsZi54X29yaWcsIHNlbGYueV9vcmlnID0gc2VsZi5jYW52YXMuY29vcmRzKHNlbGYuaWQpCisKKyAgICBkZWYgbW92ZShzZWxmLCBldmVudCk6CisgICAgICAgIHgsIHkgPSBzZWxmLndoZXJlKHNlbGYuY2FudmFzLCBldmVudCkKKyAgICAgICAgc2VsZi5jYW52YXMuY29vcmRzKHNlbGYuaWQsIHgsIHkpCisKKyAgICBkZWYgcHV0YmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jYW52YXMuY29vcmRzKHNlbGYuaWQsIHNlbGYueF9vcmlnLCBzZWxmLnlfb3JpZykKKworICAgIGRlZiB3aGVyZShzZWxmLCBjYW52YXMsIGV2ZW50KToKKyAgICAgICAgIyB3aGVyZSB0aGUgY29ybmVyIG9mIHRoZSBjYW52YXMgaXMgcmVsYXRpdmUgdG8gdGhlIHNjcmVlbjoKKyAgICAgICAgeF9vcmcgPSBjYW52YXMud2luZm9fcm9vdHgoKQorICAgICAgICB5X29yZyA9IGNhbnZhcy53aW5mb19yb290eSgpCisgICAgICAgICMgd2hlcmUgdGhlIHBvaW50ZXIgaXMgcmVsYXRpdmUgdG8gdGhlIGNhbnZhcyB3aWRnZXQ6CisgICAgICAgIHggPSBldmVudC54X3Jvb3QgLSB4X29yZworICAgICAgICB5ID0gZXZlbnQueV9yb290IC0geV9vcmcKKyAgICAgICAgIyBjb21wZW5zYXRlIGZvciBpbml0aWFsIHBvaW50ZXIgb2Zmc2V0CisgICAgICAgIHJldHVybiB4IC0gc2VsZi54X29mZiwgeSAtIHNlbGYueV9vZmYKKworICAgIGRlZiBkbmRfZW5kKHNlbGYsIHRhcmdldCwgZXZlbnQpOgorICAgICAgICBwYXNzCisKK2NsYXNzIFRlc3RlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290KToKKyAgICAgICAgc2VsZi50b3AgPSBUa2ludGVyLlRvcGxldmVsKHJvb3QpCisgICAgICAgIHNlbGYuY2FudmFzID0gVGtpbnRlci5DYW52YXMoc2VsZi50b3AsIHdpZHRoPTEwMCwgaGVpZ2h0PTEwMCkKKyAgICAgICAgc2VsZi5jYW52YXMucGFjayhmaWxsPSJib3RoIiwgZXhwYW5kPTEpCisgICAgICAgIHNlbGYuY2FudmFzLmRuZF9hY2NlcHQgPSBzZWxmLmRuZF9hY2NlcHQKKworICAgIGRlZiBkbmRfYWNjZXB0KHNlbGYsIHNvdXJjZSwgZXZlbnQpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIGRuZF9lbnRlcihzZWxmLCBzb3VyY2UsIGV2ZW50KToKKyAgICAgICAgc2VsZi5jYW52YXMuZm9jdXNfc2V0KCkgIyBTaG93IGhpZ2hsaWdodCBib3JkZXIKKyAgICAgICAgeCwgeSA9IHNvdXJjZS53aGVyZShzZWxmLmNhbnZhcywgZXZlbnQpCisgICAgICAgIHgxLCB5MSwgeDIsIHkyID0gc291cmNlLmNhbnZhcy5iYm94KHNvdXJjZS5pZCkKKyAgICAgICAgZHgsIGR5ID0geDIteDEsIHkyLXkxCisgICAgICAgIHNlbGYuZG5kaWQgPSBzZWxmLmNhbnZhcy5jcmVhdGVfcmVjdGFuZ2xlKHgsIHksIHgrZHgsIHkrZHkpCisgICAgICAgIHNlbGYuZG5kX21vdGlvbihzb3VyY2UsIGV2ZW50KQorCisgICAgZGVmIGRuZF9tb3Rpb24oc2VsZiwgc291cmNlLCBldmVudCk6CisgICAgICAgIHgsIHkgPSBzb3VyY2Uud2hlcmUoc2VsZi5jYW52YXMsIGV2ZW50KQorICAgICAgICB4MSwgeTEsIHgyLCB5MiA9IHNlbGYuY2FudmFzLmJib3goc2VsZi5kbmRpZCkKKyAgICAgICAgc2VsZi5jYW52YXMubW92ZShzZWxmLmRuZGlkLCB4LXgxLCB5LXkxKQorCisgICAgZGVmIGRuZF9sZWF2ZShzZWxmLCBzb3VyY2UsIGV2ZW50KToKKyAgICAgICAgc2VsZi50b3AuZm9jdXNfc2V0KCkgIyBIaWRlIGhpZ2hsaWdodCBib3JkZXIKKyAgICAgICAgc2VsZi5jYW52YXMuZGVsZXRlKHNlbGYuZG5kaWQpCisgICAgICAgIHNlbGYuZG5kaWQgPSBOb25lCisKKyAgICBkZWYgZG5kX2NvbW1pdChzZWxmLCBzb3VyY2UsIGV2ZW50KToKKyAgICAgICAgc2VsZi5kbmRfbGVhdmUoc291cmNlLCBldmVudCkKKyAgICAgICAgeCwgeSA9IHNvdXJjZS53aGVyZShzZWxmLmNhbnZhcywgZXZlbnQpCisgICAgICAgIHNvdXJjZS5hdHRhY2goc2VsZi5jYW52YXMsIHgsIHkpCisKK2RlZiB0ZXN0KCk6CisgICAgcm9vdCA9IFRraW50ZXIuVGsoKQorICAgIHJvb3QuZ2VvbWV0cnkoIisxKzEiKQorICAgIFRraW50ZXIuQnV0dG9uKGNvbW1hbmQ9cm9vdC5xdWl0LCB0ZXh0PSJRdWl0IikucGFjaygpCisgICAgdDEgPSBUZXN0ZXIocm9vdCkKKyAgICB0MS50b3AuZ2VvbWV0cnkoIisxKzYwIikKKyAgICB0MiA9IFRlc3Rlcihyb290KQorICAgIHQyLnRvcC5nZW9tZXRyeSgiKzEyMCs2MCIpCisgICAgdDMgPSBUZXN0ZXIocm9vdCkKKyAgICB0My50b3AuZ2VvbWV0cnkoIisyNDArNjAiKQorICAgIGkxID0gSWNvbigiSUNPTjEiKQorICAgIGkyID0gSWNvbigiSUNPTjIiKQorICAgIGkzID0gSWNvbigiSUNPTjMiKQorICAgIGkxLmF0dGFjaCh0MS5jYW52YXMpCisgICAgaTIuYXR0YWNoKHQyLmNhbnZhcykKKyAgICBpMy5hdHRhY2godDMuY2FudmFzKQorICAgIHJvb3QubWFpbmxvb3AoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGtkbmQucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtkbmQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OGQ1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2RuZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGtkbmQucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtkbmQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OGQ1N2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2RuZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGtpbnRlci5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL1RraW50ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiMzIwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL1RraW50ZXIucHkKQEAgLTAsMCArMSwzNzk1IEBACisiIiJXcmFwcGVyIGZ1bmN0aW9ucyBmb3IgVGNsL1RrLgorCitUa2ludGVyIHByb3ZpZGVzIGNsYXNzZXMgd2hpY2ggYWxsb3cgdGhlIGRpc3BsYXksIHBvc2l0aW9uaW5nIGFuZAorY29udHJvbCBvZiB3aWRnZXRzLiBUb3BsZXZlbCB3aWRnZXRzIGFyZSBUayBhbmQgVG9wbGV2ZWwuIE90aGVyCit3aWRnZXRzIGFyZSBGcmFtZSwgTGFiZWwsIEVudHJ5LCBUZXh0LCBDYW52YXMsIEJ1dHRvbiwgUmFkaW9idXR0b24sCitDaGVja2J1dHRvbiwgU2NhbGUsIExpc3Rib3gsIFNjcm9sbGJhciwgT3B0aW9uTWVudSwgU3BpbmJveAorTGFiZWxGcmFtZSBhbmQgUGFuZWRXaW5kb3cuCisKK1Byb3BlcnRpZXMgb2YgdGhlIHdpZGdldHMgYXJlIHNwZWNpZmllZCB3aXRoIGtleXdvcmQgYXJndW1lbnRzLgorS2V5d29yZCBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlCit1bmRlciBUay4KKworV2lkZ2V0cyBhcmUgcG9zaXRpb25lZCB3aXRoIG9uZSBvZiB0aGUgZ2VvbWV0cnkgbWFuYWdlcnMgUGxhY2UsIFBhY2sKK29yIEdyaWQuIFRoZXNlIG1hbmFnZXJzIGNhbiBiZSBjYWxsZWQgd2l0aCBtZXRob2RzIHBsYWNlLCBwYWNrLCBncmlkCithdmFpbGFibGUgaW4gZXZlcnkgV2lkZ2V0LgorCitBY3Rpb25zIGFyZSBib3VuZCB0byBldmVudHMgYnkgcmVzb3VyY2VzIChlLmcuIGtleXdvcmQgYXJndW1lbnQKK2NvbW1hbmQpIG9yIHdpdGggdGhlIG1ldGhvZCBiaW5kLgorCitFeGFtcGxlIChIZWxsbywgV29ybGQpOgoraW1wb3J0IFRraW50ZXIKK2Zyb20gVGtjb25zdGFudHMgaW1wb3J0ICoKK3RrID0gVGtpbnRlci5UaygpCitmcmFtZSA9IFRraW50ZXIuRnJhbWUodGssIHJlbGllZj1SSURHRSwgYm9yZGVyd2lkdGg9MikKK2ZyYW1lLnBhY2soZmlsbD1CT1RILGV4cGFuZD0xKQorbGFiZWwgPSBUa2ludGVyLkxhYmVsKGZyYW1lLCB0ZXh0PSJIZWxsbywgV29ybGQiKQorbGFiZWwucGFjayhmaWxsPVgsIGV4cGFuZD0xKQorYnV0dG9uID0gVGtpbnRlci5CdXR0b24oZnJhbWUsdGV4dD0iRXhpdCIsY29tbWFuZD10ay5kZXN0cm95KQorYnV0dG9uLnBhY2soc2lkZT1CT1RUT00pCit0ay5tYWlubG9vcCgpCisiIiIKKworX192ZXJzaW9uX18gPSAiJFJldmlzaW9uOiA4MTAwOCAkIgorCitpbXBvcnQgc3lzCitpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAjIEF0dGVtcHQgdG8gY29uZmlndXJlIFRjbC9UayB3aXRob3V0IHJlcXVpcmluZyBQQVRICisgICAgaW1wb3J0IEZpeFRrCitpbXBvcnQgX3RraW50ZXIgIyBJZiB0aGlzIGZhaWxzIHlvdXIgUHl0aG9uIG1heSBub3QgYmUgY29uZmlndXJlZCBmb3IgVGsKK3RraW50ZXIgPSBfdGtpbnRlciAjIGIvdyBjb21wYXQgZm9yIGV4cG9ydAorVGNsRXJyb3IgPSBfdGtpbnRlci5UY2xFcnJvcgorZnJvbSB0eXBlcyBpbXBvcnQgKgorZnJvbSBUa2NvbnN0YW50cyBpbXBvcnQgKgoraW1wb3J0IHJlCisKK3dhbnRvYmplY3RzID0gMQorCitUa1ZlcnNpb24gPSBmbG9hdChfdGtpbnRlci5US19WRVJTSU9OKQorVGNsVmVyc2lvbiA9IGZsb2F0KF90a2ludGVyLlRDTF9WRVJTSU9OKQorCitSRUFEQUJMRSA9IF90a2ludGVyLlJFQURBQkxFCitXUklUQUJMRSA9IF90a2ludGVyLldSSVRBQkxFCitFWENFUFRJT04gPSBfdGtpbnRlci5FWENFUFRJT04KKworIyBUaGVzZSBhcmUgbm90IGFsd2F5cyBkZWZpbmVkLCBlLmcuIG5vdCBvbiBXaW4zMiB3aXRoIFRrIDguMCA6LSgKK3RyeTogX3RraW50ZXIuY3JlYXRlZmlsZWhhbmRsZXIKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogX3RraW50ZXIuY3JlYXRlZmlsZWhhbmRsZXIgPSBOb25lCit0cnk6IF90a2ludGVyLmRlbGV0ZWZpbGVoYW5kbGVyCitleGNlcHQgQXR0cmlidXRlRXJyb3I6IF90a2ludGVyLmRlbGV0ZWZpbGVoYW5kbGVyID0gTm9uZQorCisKK19tYWdpY19yZSA9IHJlLmNvbXBpbGUocicoW1xce31dKScpCitfc3BhY2VfcmUgPSByZS5jb21waWxlKHInKFtcc10pJykKKworZGVmIF9qb2luKHZhbHVlKToKKyAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICByZXR1cm4gJyAnLmpvaW4obWFwKF9zdHJpbmdpZnksIHZhbHVlKSkKKworZGVmIF9zdHJpbmdpZnkodmFsdWUpOgorICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICBpZiBsZW4odmFsdWUpID09IDE6CisgICAgICAgICAgICB2YWx1ZSA9IF9zdHJpbmdpZnkodmFsdWVbMF0pCisgICAgICAgICAgICBpZiB2YWx1ZVswXSA9PSAneyc6CisgICAgICAgICAgICAgICAgdmFsdWUgPSAneyVzfScgJSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsdWUgPSAneyVzfScgJSBfam9pbih2YWx1ZSkKKyAgICBlbHNlOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHZhbHVlID0gdW5pY29kZSh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlID0gc3RyKHZhbHVlKQorICAgICAgICBpZiBub3QgdmFsdWU6CisgICAgICAgICAgICB2YWx1ZSA9ICd7fScKKyAgICAgICAgZWxpZiBfbWFnaWNfcmUuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgICMgYWRkICdcJyBiZWZvcmUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFuZCBzcGFjZXMKKyAgICAgICAgICAgIHZhbHVlID0gX21hZ2ljX3JlLnN1YihyJ1xcXDEnLCB2YWx1ZSkKKyAgICAgICAgICAgIHZhbHVlID0gX3NwYWNlX3JlLnN1YihyJ1xcXDEnLCB2YWx1ZSkKKyAgICAgICAgZWxpZiB2YWx1ZVswXSA9PSAnIicgb3IgX3NwYWNlX3JlLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICB2YWx1ZSA9ICd7JXN9JyAlIHZhbHVlCisgICAgcmV0dXJuIHZhbHVlCisKK2RlZiBfZmxhdHRlbih0dXBsZSk6CisgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgcmVzID0gKCkKKyAgICBmb3IgaXRlbSBpbiB0dXBsZToKKyAgICAgICAgaWYgdHlwZShpdGVtKSBpbiAoVHVwbGVUeXBlLCBMaXN0VHlwZSk6CisgICAgICAgICAgICByZXMgPSByZXMgKyBfZmxhdHRlbihpdGVtKQorICAgICAgICBlbGlmIGl0ZW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXMgPSByZXMgKyAoaXRlbSwpCisgICAgcmV0dXJuIHJlcworCit0cnk6IF9mbGF0dGVuID0gX3RraW50ZXIuX2ZsYXR0ZW4KK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogcGFzcworCitkZWYgX2NuZm1lcmdlKGNuZnMpOgorICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgIGlmIHR5cGUoY25mcykgaXMgRGljdGlvbmFyeVR5cGU6CisgICAgICAgIHJldHVybiBjbmZzCisgICAgZWxpZiB0eXBlKGNuZnMpIGluIChOb25lVHlwZSwgU3RyaW5nVHlwZSk6CisgICAgICAgIHJldHVybiBjbmZzCisgICAgZWxzZToKKyAgICAgICAgY25mID0ge30KKyAgICAgICAgZm9yIGMgaW4gX2ZsYXR0ZW4oY25mcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY25mLnVwZGF0ZShjKQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKSwgbXNnOgorICAgICAgICAgICAgICAgIHByaW50ICJfY25mbWVyZ2U6IGZhbGxiYWNrIGR1ZSB0bzoiLCBtc2cKKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBjLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIGNuZltrXSA9IHYKKyAgICAgICAgcmV0dXJuIGNuZgorCit0cnk6IF9jbmZtZXJnZSA9IF90a2ludGVyLl9jbmZtZXJnZQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOiBwYXNzCisKK2NsYXNzIEV2ZW50OgorICAgICIiIkNvbnRhaW5lciBmb3IgdGhlIHByb3BlcnRpZXMgb2YgYW4gZXZlbnQuCisKKyAgICBJbnN0YW5jZXMgb2YgdGhpcyB0eXBlIGFyZSBnZW5lcmF0ZWQgaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgZXZlbnRzIG9jY3VyczoKKworICAgIEtleVByZXNzLCBLZXlSZWxlYXNlIC0gZm9yIGtleWJvYXJkIGV2ZW50cworICAgIEJ1dHRvblByZXNzLCBCdXR0b25SZWxlYXNlLCBNb3Rpb24sIEVudGVyLCBMZWF2ZSwgTW91c2VXaGVlbCAtIGZvciBtb3VzZSBldmVudHMKKyAgICBWaXNpYmlsaXR5LCBVbm1hcCwgTWFwLCBFeHBvc2UsIEZvY3VzSW4sIEZvY3VzT3V0LCBDaXJjdWxhdGUsCisgICAgQ29sb3JtYXAsIEdyYXZpdHksIFJlcGFyZW50LCBQcm9wZXJ0eSwgRGVzdHJveSwgQWN0aXZhdGUsCisgICAgRGVhY3RpdmF0ZSAtIGZvciB3aW5kb3cgZXZlbnRzLgorCisgICAgSWYgYSBjYWxsYmFjayBmdW5jdGlvbiBmb3Igb25lIG9mIHRoZXNlIGV2ZW50cyBpcyByZWdpc3RlcmVkCisgICAgdXNpbmcgYmluZCwgYmluZF9hbGwsIGJpbmRfY2xhc3MsIG9yIHRhZ19iaW5kLCB0aGUgY2FsbGJhY2sgaXMKKyAgICBjYWxsZWQgd2l0aCBhbiBFdmVudCBhcyBmaXJzdCBhcmd1bWVudC4gSXQgd2lsbCBoYXZlIHRoZQorICAgIGZvbGxvd2luZyBhdHRyaWJ1dGVzIChpbiBicmFjZXMgYXJlIHRoZSBldmVudCB0eXBlcyBmb3Igd2hpY2gKKyAgICB0aGUgYXR0cmlidXRlIGlzIHZhbGlkKToKKworICAgICAgICBzZXJpYWwgLSBzZXJpYWwgbnVtYmVyIG9mIGV2ZW50CisgICAgbnVtIC0gbW91c2UgYnV0dG9uIHByZXNzZWQgKEJ1dHRvblByZXNzLCBCdXR0b25SZWxlYXNlKQorICAgIGZvY3VzIC0gd2hldGhlciB0aGUgd2luZG93IGhhcyB0aGUgZm9jdXMgKEVudGVyLCBMZWF2ZSkKKyAgICBoZWlnaHQgLSBoZWlnaHQgb2YgdGhlIGV4cG9zZWQgd2luZG93IChDb25maWd1cmUsIEV4cG9zZSkKKyAgICB3aWR0aCAtIHdpZHRoIG9mIHRoZSBleHBvc2VkIHdpbmRvdyAoQ29uZmlndXJlLCBFeHBvc2UpCisgICAga2V5Y29kZSAtIGtleWNvZGUgb2YgdGhlIHByZXNzZWQga2V5IChLZXlQcmVzcywgS2V5UmVsZWFzZSkKKyAgICBzdGF0ZSAtIHN0YXRlIG9mIHRoZSBldmVudCBhcyBhIG51bWJlciAoQnV0dG9uUHJlc3MsIEJ1dHRvblJlbGVhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50ZXIsIEtleVByZXNzLCBLZXlSZWxlYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlYXZlLCBNb3Rpb24pCisgICAgc3RhdGUgLSBzdGF0ZSBhcyBhIHN0cmluZyAoVmlzaWJpbGl0eSkKKyAgICB0aW1lIC0gd2hlbiB0aGUgZXZlbnQgb2NjdXJyZWQKKyAgICB4IC0geC1wb3NpdGlvbiBvZiB0aGUgbW91c2UKKyAgICB5IC0geS1wb3NpdGlvbiBvZiB0aGUgbW91c2UKKyAgICB4X3Jvb3QgLSB4LXBvc2l0aW9uIG9mIHRoZSBtb3VzZSBvbiB0aGUgc2NyZWVuCisgICAgICAgICAgICAgKEJ1dHRvblByZXNzLCBCdXR0b25SZWxlYXNlLCBLZXlQcmVzcywgS2V5UmVsZWFzZSwgTW90aW9uKQorICAgIHlfcm9vdCAtIHktcG9zaXRpb24gb2YgdGhlIG1vdXNlIG9uIHRoZSBzY3JlZW4KKyAgICAgICAgICAgICAoQnV0dG9uUHJlc3MsIEJ1dHRvblJlbGVhc2UsIEtleVByZXNzLCBLZXlSZWxlYXNlLCBNb3Rpb24pCisgICAgY2hhciAtIHByZXNzZWQgY2hhcmFjdGVyIChLZXlQcmVzcywgS2V5UmVsZWFzZSkKKyAgICBzZW5kX2V2ZW50IC0gc2VlIFgvV2luZG93cyBkb2N1bWVudGF0aW9uCisgICAga2V5c3ltIC0ga2V5c3ltIG9mIHRoZSBldmVudCBhcyBhIHN0cmluZyAoS2V5UHJlc3MsIEtleVJlbGVhc2UpCisgICAga2V5c3ltX251bSAtIGtleXN5bSBvZiB0aGUgZXZlbnQgYXMgYSBudW1iZXIgKEtleVByZXNzLCBLZXlSZWxlYXNlKQorICAgIHR5cGUgLSB0eXBlIG9mIHRoZSBldmVudCBhcyBhIG51bWJlcgorICAgIHdpZGdldCAtIHdpZGdldCBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQKKyAgICBkZWx0YSAtIGRlbHRhIG9mIHdoZWVsIG1vdmVtZW50IChNb3VzZVdoZWVsKQorICAgICIiIgorICAgIHBhc3MKKworX3N1cHBvcnRfZGVmYXVsdF9yb290ID0gMQorX2RlZmF1bHRfcm9vdCA9IE5vbmUKKworZGVmIE5vRGVmYXVsdFJvb3QoKToKKyAgICAiIiJJbmhpYml0IHNldHRpbmcgb2YgZGVmYXVsdCByb290IHdpbmRvdy4KKworICAgIENhbGwgdGhpcyBmdW5jdGlvbiB0byBpbmhpYml0IHRoYXQgdGhlIGZpcnN0IGluc3RhbmNlIG9mCisgICAgVGsgaXMgdXNlZCBmb3Igd2luZG93cyB3aXRob3V0IGFuIGV4cGxpY2l0IHBhcmVudCB3aW5kb3cuCisgICAgIiIiCisgICAgZ2xvYmFsIF9zdXBwb3J0X2RlZmF1bHRfcm9vdAorICAgIF9zdXBwb3J0X2RlZmF1bHRfcm9vdCA9IDAKKyAgICBnbG9iYWwgX2RlZmF1bHRfcm9vdAorICAgIF9kZWZhdWx0X3Jvb3QgPSBOb25lCisgICAgZGVsIF9kZWZhdWx0X3Jvb3QKKworZGVmIF90a2Vycm9yKGVycik6CisgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgcGFzcworCitkZWYgX2V4aXQoY29kZT0wKToKKyAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4gQ2FsbGluZyBpdCB3aWxsIHJhaXNlIHRoZSBleGNlcHRpb24gU3lzdGVtRXhpdC4iIiIKKyAgICB0cnk6CisgICAgICAgIGNvZGUgPSBpbnQoY29kZSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJhaXNlIFN5c3RlbUV4aXQsIGNvZGUKKworX3Zhcm51bSA9IDAKK2NsYXNzIFZhcmlhYmxlOgorICAgICIiIkNsYXNzIHRvIGRlZmluZSB2YWx1ZSBob2xkZXJzIGZvciBlLmcuIGJ1dHRvbnMuCisKKyAgICBTdWJjbGFzc2VzIFN0cmluZ1ZhciwgSW50VmFyLCBEb3VibGVWYXIsIEJvb2xlYW5WYXIgYXJlIHNwZWNpYWxpemF0aW9ucworICAgIHRoYXQgY29uc3RyYWluIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGdldCgpLiIiIgorICAgIF9kZWZhdWx0ID0gIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHZhcmlhYmxlCisKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gIiIpCisgICAgICAgIE5BTUUgaXMgYW4gb3B0aW9uYWwgVGNsIG5hbWUgKGRlZmF1bHRzIHRvIFBZX1ZBUm51bSkuCisKKyAgICAgICAgSWYgTkFNRSBtYXRjaGVzIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGFuZCBWQUxVRSBpcyBvbWl0dGVkCisgICAgICAgIHRoZW4gdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHJldGFpbmVkLgorICAgICAgICAiIiIKKyAgICAgICAgZ2xvYmFsIF92YXJudW0KKyAgICAgICAgaWYgbm90IG1hc3RlcjoKKyAgICAgICAgICAgIG1hc3RlciA9IF9kZWZhdWx0X3Jvb3QKKyAgICAgICAgc2VsZi5fbWFzdGVyID0gbWFzdGVyCisgICAgICAgIHNlbGYuX3RrID0gbWFzdGVyLnRrCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbmFtZSA9ICdQWV9WQVInICsgcmVwcihfdmFybnVtKQorICAgICAgICAgICAgX3Zhcm51bSArPSAxCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zZXQodmFsdWUpCisgICAgICAgIGVsaWYgbm90IHNlbGYuX3RrLmNhbGwoImluZm8iLCAiZXhpc3RzIiwgc2VsZi5fbmFtZSk6CisgICAgICAgICAgICBzZWxmLnNldChzZWxmLl9kZWZhdWx0KQorICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAiIiJVbnNldCB0aGUgdmFyaWFibGUgaW4gVGNsLiIiIgorICAgICAgICBzZWxmLl90ay5nbG9iYWx1bnNldHZhcihzZWxmLl9uYW1lKQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGluIFRjbC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKyAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiU2V0IHRoZSB2YXJpYWJsZSB0byBWQUxVRS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RrLmdsb2JhbHNldHZhcihzZWxmLl9uYW1lLCB2YWx1ZSkKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdmFsdWUgb2YgdmFyaWFibGUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl90ay5nbG9iYWxnZXR2YXIoc2VsZi5fbmFtZSkKKyAgICBkZWYgdHJhY2VfdmFyaWFibGUoc2VsZiwgbW9kZSwgY2FsbGJhY2spOgorICAgICAgICAiIiJEZWZpbmUgYSB0cmFjZSBjYWxsYmFjayBmb3IgdGhlIHZhcmlhYmxlLgorCisgICAgICAgIE1PREUgaXMgb25lIG9mICJyIiwgInciLCAidSIgZm9yIHJlYWQsIHdyaXRlLCB1bmRlZmluZS4KKyAgICAgICAgQ0FMTEJBQ0sgbXVzdCBiZSBhIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aGVuCisgICAgICAgIHRoZSB2YXJpYWJsZSBpcyByZWFkLCB3cml0dGVuIG9yIHVuZGVmaW5lZC4KKworICAgICAgICBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNhbGxiYWNrLgorICAgICAgICAiIiIKKyAgICAgICAgY2JuYW1lID0gc2VsZi5fbWFzdGVyLl9yZWdpc3RlcihjYWxsYmFjaykKKyAgICAgICAgc2VsZi5fdGsuY2FsbCgidHJhY2UiLCAidmFyaWFibGUiLCBzZWxmLl9uYW1lLCBtb2RlLCBjYm5hbWUpCisgICAgICAgIHJldHVybiBjYm5hbWUKKyAgICB0cmFjZSA9IHRyYWNlX3ZhcmlhYmxlCisgICAgZGVmIHRyYWNlX3ZkZWxldGUoc2VsZiwgbW9kZSwgY2JuYW1lKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSB0cmFjZSBjYWxsYmFjayBmb3IgYSB2YXJpYWJsZS4KKworICAgICAgICBNT0RFIGlzIG9uZSBvZiAiciIsICJ3IiwgInUiIGZvciByZWFkLCB3cml0ZSwgdW5kZWZpbmUuCisgICAgICAgIENCTkFNRSBpcyB0aGUgbmFtZSBvZiB0aGUgY2FsbGJhY2sgcmV0dXJuZWQgZnJvbSB0cmFjZV92YXJpYWJsZSBvciB0cmFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZkZWxldGUiLCBzZWxmLl9uYW1lLCBtb2RlLCBjYm5hbWUpCisgICAgICAgIHNlbGYuX21hc3Rlci5kZWxldGVjb21tYW5kKGNibmFtZSkKKyAgICBkZWYgdHJhY2VfdmluZm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbGwgdHJhY2UgY2FsbGJhY2sgaW5mb3JtYXRpb24uIiIiCisgICAgICAgIHJldHVybiBtYXAoc2VsZi5fdGsuc3BsaXQsIHNlbGYuX3RrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZpbmZvIiwgc2VsZi5fbmFtZSkpKQorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJpc29uIGZvciBlcXVhbGl0eSAoPT0pLgorCisgICAgICAgIE5vdGU6IGlmIHRoZSBWYXJpYWJsZSdzIG1hc3RlciBtYXR0ZXJzIHRvIGJlaGF2aW9yCisgICAgICAgIGFsc28gY29tcGFyZSBzZWxmLl9tYXN0ZXIgPT0gb3RoZXIuX21hc3RlcgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fID09IG90aGVyLl9fY2xhc3NfXy5fX25hbWVfXyBcCisgICAgICAgICAgICBhbmQgc2VsZi5fbmFtZSA9PSBvdGhlci5fbmFtZQorCitjbGFzcyBTdHJpbmdWYXIoVmFyaWFibGUpOgorICAgICIiIlZhbHVlIGhvbGRlciBmb3Igc3RyaW5ncyB2YXJpYWJsZXMuIiIiCisgICAgX2RlZmF1bHQgPSAiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgc3RyaW5nIHZhcmlhYmxlLgorCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvICIiKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdmFsdWUgb2YgdmFyaWFibGUgYXMgc3RyaW5nLiIiIgorICAgICAgICB2YWx1ZSA9IHNlbGYuX3RrLmdsb2JhbGdldHZhcihzZWxmLl9uYW1lKQorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICByZXR1cm4gc3RyKHZhbHVlKQorCitjbGFzcyBJbnRWYXIoVmFyaWFibGUpOgorICAgICIiIlZhbHVlIGhvbGRlciBmb3IgaW50ZWdlciB2YXJpYWJsZXMuIiIiCisgICAgX2RlZmF1bHQgPSAwCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB2YWx1ZT1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gaW50ZWdlciB2YXJpYWJsZS4KKworICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAwKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCisKKyAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiU2V0IHRoZSB2YXJpYWJsZSB0byB2YWx1ZSwgY29udmVydGluZyBib29sZWFucyB0byBpbnRlZ2Vycy4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6CisgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIFZhcmlhYmxlLnNldChzZWxmLCB2YWx1ZSkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGFzIGFuIGludGVnZXIuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoc2VsZi5fdGsuZ2xvYmFsZ2V0dmFyKHNlbGYuX25hbWUpKQorCitjbGFzcyBEb3VibGVWYXIoVmFyaWFibGUpOgorICAgICIiIlZhbHVlIGhvbGRlciBmb3IgZmxvYXQgdmFyaWFibGVzLiIiIgorICAgIF9kZWZhdWx0ID0gMC4wCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB2YWx1ZT1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBmbG9hdCB2YXJpYWJsZS4KKworICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAwLjApCisgICAgICAgIE5BTUUgaXMgYW4gb3B0aW9uYWwgVGNsIG5hbWUgKGRlZmF1bHRzIHRvIFBZX1ZBUm51bSkuCisKKyAgICAgICAgSWYgTkFNRSBtYXRjaGVzIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGFuZCBWQUxVRSBpcyBvbWl0dGVkCisgICAgICAgIHRoZW4gdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHJldGFpbmVkLgorICAgICAgICAiIiIKKyAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyLCB2YWx1ZSwgbmFtZSkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGFzIGEgZmxvYXQuIiIiCisgICAgICAgIHJldHVybiBnZXRkb3VibGUoc2VsZi5fdGsuZ2xvYmFsZ2V0dmFyKHNlbGYuX25hbWUpKQorCitjbGFzcyBCb29sZWFuVmFyKFZhcmlhYmxlKToKKyAgICAiIiJWYWx1ZSBob2xkZXIgZm9yIGJvb2xlYW4gdmFyaWFibGVzLiIiIgorICAgIF9kZWZhdWx0ID0gRmFsc2UKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIGJvb2xlYW4gdmFyaWFibGUuCisKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gRmFsc2UpCisgICAgICAgIE5BTUUgaXMgYW4gb3B0aW9uYWwgVGNsIG5hbWUgKGRlZmF1bHRzIHRvIFBZX1ZBUm51bSkuCisKKyAgICAgICAgSWYgTkFNRSBtYXRjaGVzIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGFuZCBWQUxVRSBpcyBvbWl0dGVkCisgICAgICAgIHRoZW4gdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHJldGFpbmVkLgorICAgICAgICAiIiIKKyAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyLCB2YWx1ZSwgbmFtZSkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGFzIGEgYm9vbC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3RrLmdldGJvb2xlYW4oc2VsZi5fdGsuZ2xvYmFsZ2V0dmFyKHNlbGYuX25hbWUpKQorCitkZWYgbWFpbmxvb3Aobj0wKToKKyAgICAiIiJSdW4gdGhlIG1haW4gbG9vcCBvZiBUY2wuIiIiCisgICAgX2RlZmF1bHRfcm9vdC50ay5tYWlubG9vcChuKQorCitnZXRpbnQgPSBpbnQKKworZ2V0ZG91YmxlID0gZmxvYXQKKworZGVmIGdldGJvb2xlYW4ocyk6CisgICAgIiIiQ29udmVydCB0cnVlIGFuZCBmYWxzZSB0byBpbnRlZ2VyIHZhbHVlcyAxIGFuZCAwLiIiIgorICAgIHJldHVybiBfZGVmYXVsdF9yb290LnRrLmdldGJvb2xlYW4ocykKKworIyBNZXRob2RzIGRlZmluZWQgb24gYm90aCB0b3BsZXZlbCBhbmQgaW50ZXJpb3Igd2lkZ2V0cworY2xhc3MgTWlzYzoKKyAgICAiIiJJbnRlcm5hbCBjbGFzcy4KKworICAgIEJhc2UgY2xhc3Mgd2hpY2ggZGVmaW5lcyBtZXRob2RzIGNvbW1vbiBmb3IgaW50ZXJpb3Igd2lkZ2V0cy4iIiIKKworICAgICMgWFhYIGZvbnQgY29tbWFuZD8KKyAgICBfdGNsQ29tbWFuZHMgPSBOb25lCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLgorCisgICAgICAgIERlbGV0ZSBhbGwgVGNsIGNvbW1hbmRzIGNyZWF0ZWQgZm9yCisgICAgICAgIHRoaXMgd2lkZ2V0IGluIHRoZSBUY2wgaW50ZXJwcmV0ZXIuIiIiCisgICAgICAgIGlmIHNlbGYuX3RjbENvbW1hbmRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5fdGNsQ29tbWFuZHM6CisgICAgICAgICAgICAgICAgI3ByaW50ICctIFRraW50ZXI6IGRlbGV0ZWQgY29tbWFuZCcsIG5hbWUKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmRlbGV0ZWNvbW1hbmQobmFtZSkKKyAgICAgICAgICAgIHNlbGYuX3RjbENvbW1hbmRzID0gTm9uZQorICAgIGRlZiBkZWxldGVjb21tYW5kKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4KKworICAgICAgICBEZWxldGUgdGhlIFRjbCBjb21tYW5kIHByb3ZpZGVkIGluIE5BTUUuIiIiCisgICAgICAgICNwcmludCAnLSBUa2ludGVyOiBkZWxldGVkIGNvbW1hbmQnLCBuYW1lCisgICAgICAgIHNlbGYudGsuZGVsZXRlY29tbWFuZChuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcy5yZW1vdmUobmFtZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgZGVmIHRrX3N0cmljdE1vdGlmKHNlbGYsIGJvb2xlYW49Tm9uZSk6CisgICAgICAgICIiIlNldCBUY2wgaW50ZXJuYWwgdmFyaWFibGUsIHdoZXRoZXIgdGhlIGxvb2sgYW5kIGZlZWwKKyAgICAgICAgc2hvdWxkIGFkaGVyZSB0byBNb3RpZi4KKworICAgICAgICBBIHBhcmFtZXRlciBvZiAxIG1lYW5zIGFkaGVyZSB0byBNb3RpZiAoZS5nLiBubyBjb2xvcgorICAgICAgICBjaGFuZ2UgaWYgbW91c2UgcGFzc2VzIG92ZXIgc2xpZGVyKS4KKyAgICAgICAgUmV0dXJucyB0aGUgc2V0IHZhbHVlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXRib29sZWFuKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICdzZXQnLCAndGtfc3RyaWN0TW90aWYnLCBib29sZWFuKSkKKyAgICBkZWYgdGtfYmlzcXVlKHNlbGYpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIGNvbG9yIHNjaGVtZSB0byBsaWdodCBicm93biBhcyB1c2VkIGluIFRrIDMuNiBhbmQgYmVmb3JlLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX2Jpc3F1ZScpCisgICAgZGVmIHRrX3NldFBhbGV0dGUoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJTZXQgYSBuZXcgY29sb3Igc2NoZW1lIGZvciBhbGwgd2lkZ2V0IGVsZW1lbnRzLgorCisgICAgICAgIEEgc2luZ2xlIGNvbG9yIGFzIGFyZ3VtZW50IHdpbGwgY2F1c2UgdGhhdCBhbGwgY29sb3JzIG9mIFRrCisgICAgICAgIHdpZGdldCBlbGVtZW50cyBhcmUgZGVyaXZlZCBmcm9tIHRoaXMuCisgICAgICAgIEFsdGVybmF0aXZlbHkgc2V2ZXJhbCBrZXl3b3JkIHBhcmFtZXRlcnMgYW5kIGl0cyBhc3NvY2lhdGVkCisgICAgICAgIGNvbG9ycyBjYW4gYmUgZ2l2ZW4uIFRoZSBmb2xsb3dpbmcga2V5d29yZHMgYXJlIHZhbGlkOgorICAgICAgICBhY3RpdmVCYWNrZ3JvdW5kLCBmb3JlZ3JvdW5kLCBzZWxlY3RDb2xvciwKKyAgICAgICAgYWN0aXZlRm9yZWdyb3VuZCwgaGlnaGxpZ2h0QmFja2dyb3VuZCwgc2VsZWN0QmFja2dyb3VuZCwKKyAgICAgICAgYmFja2dyb3VuZCwgaGlnaGxpZ2h0Q29sb3IsIHNlbGVjdEZvcmVncm91bmQsCisgICAgICAgIGRpc2FibGVkRm9yZWdyb3VuZCwgaW5zZXJ0QmFja2dyb3VuZCwgdHJvdWdoQ29sb3IuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoJ3RrX3NldFBhbGV0dGUnLCkKKyAgICAgICAgICAgICAgKyBfZmxhdHRlbihhcmdzKSArIF9mbGF0dGVuKGt3Lml0ZW1zKCkpKQorICAgIGRlZiB0a19tZW51QmFyKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiRG8gbm90IHVzZS4gTmVlZGVkIGluIFRrIDMuNiBhbmQgZWFybGllci4iIiIKKyAgICAgICAgcGFzcyAjIG9ic29sZXRlIHNpbmNlIFRrIDQuMAorICAgIGRlZiB3YWl0X3ZhcmlhYmxlKHNlbGYsIG5hbWU9J1BZX1ZBUicpOgorICAgICAgICAiIiJXYWl0IHVudGlsIHRoZSB2YXJpYWJsZSBpcyBtb2RpZmllZC4KKworICAgICAgICBBIHBhcmFtZXRlciBvZiB0eXBlIEludFZhciwgU3RyaW5nVmFyLCBEb3VibGVWYXIgb3IKKyAgICAgICAgQm9vbGVhblZhciBtdXN0IGJlIGdpdmVuLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3Rrd2FpdCcsICd2YXJpYWJsZScsIG5hbWUpCisgICAgd2FpdHZhciA9IHdhaXRfdmFyaWFibGUgIyBYWFggYi93IGNvbXBhdAorICAgIGRlZiB3YWl0X3dpbmRvdyhzZWxmLCB3aW5kb3c9Tm9uZSk6CisgICAgICAgICIiIldhaXQgdW50aWwgYSBXSURHRVQgaXMgZGVzdHJveWVkLgorCisgICAgICAgIElmIG5vIHBhcmFtZXRlciBpcyBnaXZlbiBzZWxmIGlzIHVzZWQuIiIiCisgICAgICAgIGlmIHdpbmRvdyBpcyBOb25lOgorICAgICAgICAgICAgd2luZG93ID0gc2VsZgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3Rrd2FpdCcsICd3aW5kb3cnLCB3aW5kb3cuX3cpCisgICAgZGVmIHdhaXRfdmlzaWJpbGl0eShzZWxmLCB3aW5kb3c9Tm9uZSk6CisgICAgICAgICIiIldhaXQgdW50aWwgdGhlIHZpc2liaWxpdHkgb2YgYSBXSURHRVQgY2hhbmdlcworICAgICAgICAoZS5nLiBpdCBhcHBlYXJzKS4KKworICAgICAgICBJZiBubyBwYXJhbWV0ZXIgaXMgZ2l2ZW4gc2VsZiBpcyB1c2VkLiIiIgorICAgICAgICBpZiB3aW5kb3cgaXMgTm9uZToKKyAgICAgICAgICAgIHdpbmRvdyA9IHNlbGYKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a3dhaXQnLCAndmlzaWJpbGl0eScsIHdpbmRvdy5fdykKKyAgICBkZWYgc2V0dmFyKHNlbGYsIG5hbWU9J1BZX1ZBUicsIHZhbHVlPScxJyk6CisgICAgICAgICIiIlNldCBUY2wgdmFyaWFibGUgTkFNRSB0byBWQUxVRS4iIiIKKyAgICAgICAgc2VsZi50ay5zZXR2YXIobmFtZSwgdmFsdWUpCisgICAgZGVmIGdldHZhcihzZWxmLCBuYW1lPSdQWV9WQVInKToKKyAgICAgICAgIiIiUmV0dXJuIHZhbHVlIG9mIFRjbCB2YXJpYWJsZSBOQU1FLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXR2YXIobmFtZSkKKyAgICBnZXRpbnQgPSBpbnQKKyAgICBnZXRkb3VibGUgPSBmbG9hdAorICAgIGRlZiBnZXRib29sZWFuKHNlbGYsIHMpOgorICAgICAgICAiIiJSZXR1cm4gYSBib29sZWFuIHZhbHVlIGZvciBUY2wgYm9vbGVhbiB2YWx1ZXMgdHJ1ZSBhbmQgZmFsc2UgZ2l2ZW4gYXMgcGFyYW1ldGVyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5nZXRib29sZWFuKHMpCisgICAgZGVmIGZvY3VzX3NldChzZWxmKToKKyAgICAgICAgIiIiRGlyZWN0IGlucHV0IGZvY3VzIHRvIHRoaXMgd2lkZ2V0LgorCisgICAgICAgIElmIHRoZSBhcHBsaWNhdGlvbiBjdXJyZW50bHkgZG9lcyBub3QgaGF2ZSB0aGUgZm9jdXMKKyAgICAgICAgdGhpcyB3aWRnZXQgd2lsbCBnZXQgdGhlIGZvY3VzIGlmIHRoZSBhcHBsaWNhdGlvbiBnZXRzCisgICAgICAgIHRoZSBmb2N1cyB0aHJvdWdoIHRoZSB3aW5kb3cgbWFuYWdlci4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdmb2N1cycsIHNlbGYuX3cpCisgICAgZm9jdXMgPSBmb2N1c19zZXQgIyBYWFggYi93IGNvbXBhdD8KKyAgICBkZWYgZm9jdXNfZm9yY2Uoc2VsZik6CisgICAgICAgICIiIkRpcmVjdCBpbnB1dCBmb2N1cyB0byB0aGlzIHdpZGdldCBldmVuIGlmIHRoZQorICAgICAgICBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlIHRoZSBmb2N1cy4gVXNlIHdpdGgKKyAgICAgICAgY2F1dGlvbiEiIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdmb2N1cycsICctZm9yY2UnLCBzZWxmLl93KQorICAgIGRlZiBmb2N1c19nZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgd2lkZ2V0IHdoaWNoIGhhcyBjdXJyZW50bHkgdGhlIGZvY3VzIGluIHRoZQorICAgICAgICBhcHBsaWNhdGlvbi4KKworICAgICAgICBVc2UgZm9jdXNfZGlzcGxheW9mIHRvIGFsbG93IHdvcmtpbmcgd2l0aCBzZXZlcmFsCisgICAgICAgIGRpc3BsYXlzLiBSZXR1cm4gTm9uZSBpZiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBoYXZlCisgICAgICAgIHRoZSBmb2N1cy4iIiIKKyAgICAgICAgbmFtZSA9IHNlbGYudGsuY2FsbCgnZm9jdXMnKQorICAgICAgICBpZiBuYW1lID09ICdub25lJyBvciBub3QgbmFtZTogcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWV0b3dpZGdldChuYW1lKQorICAgIGRlZiBmb2N1c19kaXNwbGF5b2Yoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgd2lkZ2V0IHdoaWNoIGhhcyBjdXJyZW50bHkgdGhlIGZvY3VzIG9uIHRoZQorICAgICAgICBkaXNwbGF5IHdoZXJlIHRoaXMgd2lkZ2V0IGlzIGxvY2F0ZWQuCisKKyAgICAgICAgUmV0dXJuIE5vbmUgaWYgdGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgdGhlIGZvY3VzLiIiIgorICAgICAgICBuYW1lID0gc2VsZi50ay5jYWxsKCdmb2N1cycsICctZGlzcGxheW9mJywgc2VsZi5fdykKKyAgICAgICAgaWYgbmFtZSA9PSAnbm9uZScgb3Igbm90IG5hbWU6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkKKyAgICBkZWYgZm9jdXNfbGFzdGZvcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB3aWRnZXQgd2hpY2ggd291bGQgaGF2ZSB0aGUgZm9jdXMgaWYgdG9wIGxldmVsCisgICAgICAgIGZvciB0aGlzIHdpZGdldCBnZXRzIHRoZSBmb2N1cyBmcm9tIHRoZSB3aW5kb3cgbWFuYWdlci4iIiIKKyAgICAgICAgbmFtZSA9IHNlbGYudGsuY2FsbCgnZm9jdXMnLCAnLWxhc3Rmb3InLCBzZWxmLl93KQorICAgICAgICBpZiBuYW1lID09ICdub25lJyBvciBub3QgbmFtZTogcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWV0b3dpZGdldChuYW1lKQorICAgIGRlZiB0a19mb2N1c0ZvbGxvd3NNb3VzZShzZWxmKToKKyAgICAgICAgIiIiVGhlIHdpZGdldCB1bmRlciBtb3VzZSB3aWxsIGdldCBhdXRvbWF0aWNhbGx5IGZvY3VzLiBDYW4gbm90CisgICAgICAgIGJlIGRpc2FibGVkIGVhc2lseS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19mb2N1c0ZvbGxvd3NNb3VzZScpCisgICAgZGVmIHRrX2ZvY3VzTmV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IHdpZGdldCBpbiB0aGUgZm9jdXMgb3JkZXIgd2hpY2ggZm9sbG93cworICAgICAgICB3aWRnZXQgd2hpY2ggaGFzIGN1cnJlbnRseSB0aGUgZm9jdXMuCisKKyAgICAgICAgVGhlIGZvY3VzIG9yZGVyIGZpcnN0IGdvZXMgdG8gdGhlIG5leHQgY2hpbGQsIHRoZW4gdG8KKyAgICAgICAgdGhlIGNoaWxkcmVuIG9mIHRoZSBjaGlsZCByZWN1cnNpdmVseSBhbmQgdGhlbiB0byB0aGUKKyAgICAgICAgbmV4dCBzaWJsaW5nIHdoaWNoIGlzIGhpZ2hlciBpbiB0aGUgc3RhY2tpbmcgb3JkZXIuICBBCisgICAgICAgIHdpZGdldCBpcyBvbWl0dGVkIGlmIGl0IGhhcyB0aGUgdGFrZWZvY3VzIHJlc291cmNlIHNldAorICAgICAgICB0byAwLiIiIgorICAgICAgICBuYW1lID0gc2VsZi50ay5jYWxsKCd0a19mb2N1c05leHQnLCBzZWxmLl93KQorICAgICAgICBpZiBub3QgbmFtZTogcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWV0b3dpZGdldChuYW1lKQorICAgIGRlZiB0a19mb2N1c1ByZXYoc2VsZik6CisgICAgICAgICIiIlJldHVybiBwcmV2aW91cyB3aWRnZXQgaW4gdGhlIGZvY3VzIG9yZGVyLiBTZWUgdGtfZm9jdXNOZXh0IGZvciBkZXRhaWxzLiIiIgorICAgICAgICBuYW1lID0gc2VsZi50ay5jYWxsKCd0a19mb2N1c1ByZXYnLCBzZWxmLl93KQorICAgICAgICBpZiBub3QgbmFtZTogcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWV0b3dpZGdldChuYW1lKQorICAgIGRlZiBhZnRlcihzZWxmLCBtcywgZnVuYz1Ob25lLCAqYXJncyk6CisgICAgICAgICIiIkNhbGwgZnVuY3Rpb24gb25jZSBhZnRlciBnaXZlbiB0aW1lLgorCisgICAgICAgIE1TIHNwZWNpZmllcyB0aGUgdGltZSBpbiBtaWxsaXNlY29uZHMuIEZVTkMgZ2l2ZXMgdGhlCisgICAgICAgIGZ1bmN0aW9uIHdoaWNoIHNoYWxsIGJlIGNhbGxlZC4gQWRkaXRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBmdW5jdGlvbiBjYWxsLiAgUmV0dXJuCisgICAgICAgIGlkZW50aWZpZXIgdG8gY2FuY2VsIHNjaGVkdWxpbmcgd2l0aCBhZnRlcl9jYW5jZWwuIiIiCisgICAgICAgIGlmIG5vdCBmdW5jOgorICAgICAgICAgICAgIyBJJ2QgcmF0aGVyIHVzZSB0aW1lLnNsZWVwKG1zKjAuMDAxKQorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdhZnRlcicsIG1zKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmIGNhbGxpdCgpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYygqYXJncykKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZWNvbW1hbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFRjbEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbmFtZSA9IHNlbGYuX3JlZ2lzdGVyKGNhbGxpdCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ2FmdGVyJywgbXMsIG5hbWUpCisgICAgZGVmIGFmdGVyX2lkbGUoc2VsZiwgZnVuYywgKmFyZ3MpOgorICAgICAgICAiIiJDYWxsIEZVTkMgb25jZSBpZiB0aGUgVGNsIG1haW4gbG9vcCBoYXMgbm8gZXZlbnQgdG8KKyAgICAgICAgcHJvY2Vzcy4KKworICAgICAgICBSZXR1cm4gYW4gaWRlbnRpZmllciB0byBjYW5jZWwgdGhlIHNjaGVkdWxpbmcgd2l0aAorICAgICAgICBhZnRlcl9jYW5jZWwuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmFmdGVyKCdpZGxlJywgZnVuYywgKmFyZ3MpCisgICAgZGVmIGFmdGVyX2NhbmNlbChzZWxmLCBpZCk6CisgICAgICAgICIiIkNhbmNlbCBzY2hlZHVsaW5nIG9mIGZ1bmN0aW9uIGlkZW50aWZpZWQgd2l0aCBJRC4KKworICAgICAgICBJZGVudGlmaWVyIHJldHVybmVkIGJ5IGFmdGVyIG9yIGFmdGVyX2lkbGUgbXVzdCBiZQorICAgICAgICBnaXZlbiBhcyBmaXJzdCBwYXJhbWV0ZXIuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLnRrLmNhbGwoJ2FmdGVyJywgJ2luZm8nLCBpZCkKKyAgICAgICAgICAgICMgSW4gVGsgOC4zLCBzcGxpdGxpc3QgcmV0dXJuczogKHNjcmlwdCwgdHlwZSkKKyAgICAgICAgICAgICMgSW4gVGsgOC40LCBzcGxpdGxpc3QgbWF5IHJldHVybiAoc2NyaXB0LCB0eXBlKSBvciAoc2NyaXB0LCkKKyAgICAgICAgICAgIHNjcmlwdCA9IHNlbGYudGsuc3BsaXRsaXN0KGRhdGEpWzBdCisgICAgICAgICAgICBzZWxmLmRlbGV0ZWNvbW1hbmQoc2NyaXB0KQorICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGsuY2FsbCgnYWZ0ZXInLCAnY2FuY2VsJywgaWQpCisgICAgZGVmIGJlbGwoc2VsZiwgZGlzcGxheW9mPTApOgorICAgICAgICAiIiJSaW5nIGEgZGlzcGxheSdzIGJlbGwuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoJ2JlbGwnLCkgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKSkKKworICAgICMgQ2xpcGJvYXJkIGhhbmRsaW5nOgorICAgIGRlZiBjbGlwYm9hcmRfZ2V0KHNlbGYsICoqa3cpOgorICAgICAgICAiIiJSZXRyaWV2ZSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCBvbiB3aW5kb3cncyBkaXNwbGF5LgorCisgICAgICAgIFRoZSB3aW5kb3cga2V5d29yZCBkZWZhdWx0cyB0byB0aGUgcm9vdCB3aW5kb3cgb2YgdGhlIFRraW50ZXIKKyAgICAgICAgYXBwbGljYXRpb24uCisKKyAgICAgICAgVGhlIHR5cGUga2V5d29yZCBzcGVjaWZpZXMgdGhlIGZvcm0gaW4gd2hpY2ggdGhlIGRhdGEgaXMKKyAgICAgICAgdG8gYmUgcmV0dXJuZWQgYW5kIHNob3VsZCBiZSBhbiBhdG9tIG5hbWUgc3VjaCBhcyBTVFJJTkcKKyAgICAgICAgb3IgRklMRV9OQU1FLiAgVHlwZSBkZWZhdWx0cyB0byBTVFJJTkcsIGV4Y2VwdCBvbiBYMTEsIHdoZXJlIHRoZSBkZWZhdWx0CisgICAgICAgIGlzIHRvIHRyeSBVVEY4X1NUUklORyBhbmQgZmFsbCBiYWNrIHRvIFNUUklORy4KKworICAgICAgICBUaGlzIGNvbW1hbmQgaXMgZXF1aXZhbGVudCB0bzoKKworICAgICAgICBzZWxlY3Rpb25fZ2V0KENMSVBCT0FSRCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmICd0eXBlJyBub3QgaW4ga3cgYW5kIHNlbGYuX3dpbmRvd2luZ3N5c3RlbSA9PSAneDExJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBrd1sndHlwZSddID0gJ1VURjhfU1RSSU5HJworICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoKCdjbGlwYm9hcmQnLCAnZ2V0JykgKyBzZWxmLl9vcHRpb25zKGt3KSkKKyAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgICAgICBkZWwga3dbJ3R5cGUnXQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgnY2xpcGJvYXJkJywgJ2dldCcpICsgc2VsZi5fb3B0aW9ucyhrdykpCisKKyAgICBkZWYgY2xpcGJvYXJkX2NsZWFyKHNlbGYsICoqa3cpOgorICAgICAgICAiIiJDbGVhciB0aGUgZGF0YSBpbiB0aGUgVGsgY2xpcGJvYXJkLgorCisgICAgICAgIEEgd2lkZ2V0IHNwZWNpZmllZCBmb3IgdGhlIG9wdGlvbmFsIGRpc3BsYXlvZiBrZXl3b3JkCisgICAgICAgIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGRpc3BsYXkuIiIiCisgICAgICAgIGlmICdkaXNwbGF5b2YnIG5vdCBpbiBrdzoga3dbJ2Rpc3BsYXlvZiddID0gc2VsZi5fdworICAgICAgICBzZWxmLnRrLmNhbGwoKCdjbGlwYm9hcmQnLCAnY2xlYXInKSArIHNlbGYuX29wdGlvbnMoa3cpKQorICAgIGRlZiBjbGlwYm9hcmRfYXBwZW5kKHNlbGYsIHN0cmluZywgKiprdyk6CisgICAgICAgICIiIkFwcGVuZCBTVFJJTkcgdG8gdGhlIFRrIGNsaXBib2FyZC4KKworICAgICAgICBBIHdpZGdldCBzcGVjaWZpZWQgYXQgdGhlIG9wdGlvbmFsIGRpc3BsYXlvZiBrZXl3b3JkCisgICAgICAgIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGRpc3BsYXkuIFRoZSBjbGlwYm9hcmQKKyAgICAgICAgY2FuIGJlIHJldHJpZXZlZCB3aXRoIHNlbGVjdGlvbl9nZXQuIiIiCisgICAgICAgIGlmICdkaXNwbGF5b2YnIG5vdCBpbiBrdzoga3dbJ2Rpc3BsYXlvZiddID0gc2VsZi5fdworICAgICAgICBzZWxmLnRrLmNhbGwoKCdjbGlwYm9hcmQnLCAnYXBwZW5kJykgKyBzZWxmLl9vcHRpb25zKGt3KQorICAgICAgICAgICAgICArICgnLS0nLCBzdHJpbmcpKQorICAgICMgWFhYIGdyYWIgY3VycmVudCB3L28gd2luZG93IGFyZ3VtZW50CisgICAgZGVmIGdyYWJfY3VycmVudChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHdpZGdldCB3aGljaCBoYXMgY3VycmVudGx5IHRoZSBncmFiIGluIHRoaXMgYXBwbGljYXRpb24KKyAgICAgICAgb3IgTm9uZS4iIiIKKyAgICAgICAgbmFtZSA9IHNlbGYudGsuY2FsbCgnZ3JhYicsICdjdXJyZW50Jywgc2VsZi5fdykKKyAgICAgICAgaWYgbm90IG5hbWU6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkKKyAgICBkZWYgZ3JhYl9yZWxlYXNlKHNlbGYpOgorICAgICAgICAiIiJSZWxlYXNlIGdyYWIgZm9yIHRoaXMgd2lkZ2V0IGlmIGN1cnJlbnRseSBzZXQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnZ3JhYicsICdyZWxlYXNlJywgc2VsZi5fdykKKyAgICBkZWYgZ3JhYl9zZXQoc2VsZik6CisgICAgICAgICIiIlNldCBncmFiIGZvciB0aGlzIHdpZGdldC4KKworICAgICAgICBBIGdyYWIgZGlyZWN0cyBhbGwgZXZlbnRzIHRvIHRoaXMgYW5kIGRlc2NlbmRhbnQKKyAgICAgICAgd2lkZ2V0cyBpbiB0aGUgYXBwbGljYXRpb24uIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnZ3JhYicsICdzZXQnLCBzZWxmLl93KQorICAgIGRlZiBncmFiX3NldF9nbG9iYWwoc2VsZik6CisgICAgICAgICIiIlNldCBnbG9iYWwgZ3JhYiBmb3IgdGhpcyB3aWRnZXQuCisKKyAgICAgICAgQSBnbG9iYWwgZ3JhYiBkaXJlY3RzIGFsbCBldmVudHMgdG8gdGhpcyBhbmQKKyAgICAgICAgZGVzY2VuZGFudCB3aWRnZXRzIG9uIHRoZSBkaXNwbGF5LiBVc2Ugd2l0aCBjYXV0aW9uIC0KKyAgICAgICAgb3RoZXIgYXBwbGljYXRpb25zIGRvIG5vdCBnZXQgZXZlbnRzIGFueW1vcmUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnZ3JhYicsICdzZXQnLCAnLWdsb2JhbCcsIHNlbGYuX3cpCisgICAgZGVmIGdyYWJfc3RhdHVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gTm9uZSwgImxvY2FsIiBvciAiZ2xvYmFsIiBpZiB0aGlzIHdpZGdldCBoYXMKKyAgICAgICAgbm8sIGEgbG9jYWwgb3IgYSBnbG9iYWwgZ3JhYi4iIiIKKyAgICAgICAgc3RhdHVzID0gc2VsZi50ay5jYWxsKCdncmFiJywgJ3N0YXR1cycsIHNlbGYuX3cpCisgICAgICAgIGlmIHN0YXR1cyA9PSAnbm9uZSc6IHN0YXR1cyA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHN0YXR1cworICAgIGRlZiBvcHRpb25fYWRkKHNlbGYsIHBhdHRlcm4sIHZhbHVlLCBwcmlvcml0eSA9IE5vbmUpOgorICAgICAgICAiIiJTZXQgYSBWQUxVRSAoc2Vjb25kIHBhcmFtZXRlcikgZm9yIGFuIG9wdGlvbgorICAgICAgICBQQVRURVJOIChmaXJzdCBwYXJhbWV0ZXIpLgorCisgICAgICAgIEFuIG9wdGlvbmFsIHRoaXJkIHBhcmFtZXRlciBnaXZlcyB0aGUgbnVtZXJpYyBwcmlvcml0eQorICAgICAgICAoZGVmYXVsdHMgdG8gODApLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ29wdGlvbicsICdhZGQnLCBwYXR0ZXJuLCB2YWx1ZSwgcHJpb3JpdHkpCisgICAgZGVmIG9wdGlvbl9jbGVhcihzZWxmKToKKyAgICAgICAgIiIiQ2xlYXIgdGhlIG9wdGlvbiBkYXRhYmFzZS4KKworICAgICAgICBJdCB3aWxsIGJlIHJlbG9hZGVkIGlmIG9wdGlvbl9hZGQgaXMgY2FsbGVkLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ29wdGlvbicsICdjbGVhcicpCisgICAgZGVmIG9wdGlvbl9nZXQoc2VsZiwgbmFtZSwgY2xhc3NOYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBmb3IgYW4gb3B0aW9uIE5BTUUgZm9yIHRoaXMgd2lkZ2V0CisgICAgICAgIHdpdGggQ0xBU1NOQU1FLgorCisgICAgICAgIFZhbHVlcyB3aXRoIGhpZ2hlciBwcmlvcml0eSBvdmVycmlkZSBsb3dlciB2YWx1ZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ29wdGlvbicsICdnZXQnLCBzZWxmLl93LCBuYW1lLCBjbGFzc05hbWUpCisgICAgZGVmIG9wdGlvbl9yZWFkZmlsZShzZWxmLCBmaWxlTmFtZSwgcHJpb3JpdHkgPSBOb25lKToKKyAgICAgICAgIiIiUmVhZCBmaWxlIEZJTEVOQU1FIGludG8gdGhlIG9wdGlvbiBkYXRhYmFzZS4KKworICAgICAgICBBbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyIGdpdmVzIHRoZSBudW1lcmljCisgICAgICAgIHByaW9yaXR5LiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ29wdGlvbicsICdyZWFkZmlsZScsIGZpbGVOYW1lLCBwcmlvcml0eSkKKyAgICBkZWYgc2VsZWN0aW9uX2NsZWFyKHNlbGYsICoqa3cpOgorICAgICAgICAiIiJDbGVhciB0aGUgY3VycmVudCBYIHNlbGVjdGlvbi4iIiIKKyAgICAgICAgaWYgJ2Rpc3BsYXlvZicgbm90IGluIGt3OiBrd1snZGlzcGxheW9mJ10gPSBzZWxmLl93CisgICAgICAgIHNlbGYudGsuY2FsbCgoJ3NlbGVjdGlvbicsICdjbGVhcicpICsgc2VsZi5fb3B0aW9ucyhrdykpCisgICAgZGVmIHNlbGVjdGlvbl9nZXQoc2VsZiwgKiprdyk6CisgICAgICAgICIiIlJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIGN1cnJlbnQgWCBzZWxlY3Rpb24uCisKKyAgICAgICAgQSBrZXl3b3JkIHBhcmFtZXRlciBzZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBuYW1lIG9mCisgICAgICAgIHRoZSBzZWxlY3Rpb24gYW5kIGRlZmF1bHRzIHRvIFBSSU1BUlkuICBBIGtleXdvcmQKKyAgICAgICAgcGFyYW1ldGVyIGRpc3BsYXlvZiBzcGVjaWZpZXMgYSB3aWRnZXQgb24gdGhlIGRpc3BsYXkKKyAgICAgICAgdG8gdXNlLiBBIGtleXdvcmQgcGFyYW1ldGVyIHR5cGUgc3BlY2lmaWVzIHRoZSBmb3JtIG9mIGRhdGEgdG8gYmUKKyAgICAgICAgZmV0Y2hlZCwgZGVmYXVsdGluZyB0byBTVFJJTkcgZXhjZXB0IG9uIFgxMSwgd2hlcmUgVVRGOF9TVFJJTkcgaXMgdHJpZWQKKyAgICAgICAgYmVmb3JlIFNUUklORy4iIiIKKyAgICAgICAgaWYgJ2Rpc3BsYXlvZicgbm90IGluIGt3OiBrd1snZGlzcGxheW9mJ10gPSBzZWxmLl93CisgICAgICAgIGlmICd0eXBlJyBub3QgaW4ga3cgYW5kIHNlbGYuX3dpbmRvd2luZ3N5c3RlbSA9PSAneDExJzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBrd1sndHlwZSddID0gJ1VURjhfU1RSSU5HJworICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoKCdzZWxlY3Rpb24nLCAnZ2V0JykgKyBzZWxmLl9vcHRpb25zKGt3KSkKKyAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKKyAgICAgICAgICAgICAgICBkZWwga3dbJ3R5cGUnXQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgnc2VsZWN0aW9uJywgJ2dldCcpICsgc2VsZi5fb3B0aW9ucyhrdykpCisgICAgZGVmIHNlbGVjdGlvbl9oYW5kbGUoc2VsZiwgY29tbWFuZCwgKiprdyk6CisgICAgICAgICIiIlNwZWNpZnkgYSBmdW5jdGlvbiBDT01NQU5EIHRvIGNhbGwgaWYgdGhlIFgKKyAgICAgICAgc2VsZWN0aW9uIG93bmVkIGJ5IHRoaXMgd2lkZ2V0IGlzIHF1ZXJpZWQgYnkgYW5vdGhlcgorICAgICAgICBhcHBsaWNhdGlvbi4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIHRoZSBjb250ZW50cyBvZiB0aGUKKyAgICAgICAgc2VsZWN0aW9uLiBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKKyAgICAgICAgYXJndW1lbnRzIE9GRlNFVCBhbmQgTEVOR1RIIHdoaWNoIGFsbG93cyB0aGUgY2h1bmtpbmcKKyAgICAgICAgb2YgdmVyeSBsb25nIHNlbGVjdGlvbnMuIFRoZSBmb2xsb3dpbmcga2V5d29yZAorICAgICAgICBwYXJhbWV0ZXJzIGNhbiBiZSBwcm92aWRlZDoKKyAgICAgICAgc2VsZWN0aW9uIC0gbmFtZSBvZiB0aGUgc2VsZWN0aW9uIChkZWZhdWx0IFBSSU1BUlkpLAorICAgICAgICB0eXBlIC0gdHlwZSBvZiB0aGUgc2VsZWN0aW9uIChlLmcuIFNUUklORywgRklMRV9OQU1FKS4iIiIKKyAgICAgICAgbmFtZSA9IHNlbGYuX3JlZ2lzdGVyKGNvbW1hbmQpCisgICAgICAgIHNlbGYudGsuY2FsbCgoJ3NlbGVjdGlvbicsICdoYW5kbGUnKSArIHNlbGYuX29wdGlvbnMoa3cpCisgICAgICAgICAgICAgICsgKHNlbGYuX3csIG5hbWUpKQorICAgIGRlZiBzZWxlY3Rpb25fb3duKHNlbGYsICoqa3cpOgorICAgICAgICAiIiJCZWNvbWUgb3duZXIgb2YgWCBzZWxlY3Rpb24uCisKKyAgICAgICAgQSBrZXl3b3JkIHBhcmFtZXRlciBzZWxlY3Rpb24gc3BlY2lmaWVzIHRoZSBuYW1lIG9mCisgICAgICAgIHRoZSBzZWxlY3Rpb24gKGRlZmF1bHQgUFJJTUFSWSkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoJ3NlbGVjdGlvbicsICdvd24nKSArCisgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMoa3cpICsgKHNlbGYuX3csKSkKKyAgICBkZWYgc2VsZWN0aW9uX293bl9nZXQoc2VsZiwgKiprdyk6CisgICAgICAgICIiIlJldHVybiBvd25lciBvZiBYIHNlbGVjdGlvbi4KKworICAgICAgICBUaGUgZm9sbG93aW5nIGtleXdvcmQgcGFyYW1ldGVyIGNhbgorICAgICAgICBiZSBwcm92aWRlZDoKKyAgICAgICAgc2VsZWN0aW9uIC0gbmFtZSBvZiB0aGUgc2VsZWN0aW9uIChkZWZhdWx0IFBSSU1BUlkpLAorICAgICAgICB0eXBlIC0gdHlwZSBvZiB0aGUgc2VsZWN0aW9uIChlLmcuIFNUUklORywgRklMRV9OQU1FKS4iIiIKKyAgICAgICAgaWYgJ2Rpc3BsYXlvZicgbm90IGluIGt3OiBrd1snZGlzcGxheW9mJ10gPSBzZWxmLl93CisgICAgICAgIG5hbWUgPSBzZWxmLnRrLmNhbGwoKCdzZWxlY3Rpb24nLCAnb3duJykgKyBzZWxmLl9vcHRpb25zKGt3KSkKKyAgICAgICAgaWYgbm90IG5hbWU6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBzZWxmLl9uYW1ldG93aWRnZXQobmFtZSkKKyAgICBkZWYgc2VuZChzZWxmLCBpbnRlcnAsIGNtZCwgKmFyZ3MpOgorICAgICAgICAiIiJTZW5kIFRjbCBjb21tYW5kIENNRCB0byBkaWZmZXJlbnQgaW50ZXJwcmV0ZXIgSU5URVJQIHRvIGJlIGV4ZWN1dGVkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgnc2VuZCcsIGludGVycCwgY21kKSArIGFyZ3MpCisgICAgZGVmIGxvd2VyKHNlbGYsIGJlbG93VGhpcz1Ob25lKToKKyAgICAgICAgIiIiTG93ZXIgdGhpcyB3aWRnZXQgaW4gdGhlIHN0YWNraW5nIG9yZGVyLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ2xvd2VyJywgc2VsZi5fdywgYmVsb3dUaGlzKQorICAgIGRlZiB0a3JhaXNlKHNlbGYsIGFib3ZlVGhpcz1Ob25lKToKKyAgICAgICAgIiIiUmFpc2UgdGhpcyB3aWRnZXQgaW4gdGhlIHN0YWNraW5nIG9yZGVyLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3JhaXNlJywgc2VsZi5fdywgYWJvdmVUaGlzKQorICAgIGxpZnQgPSB0a3JhaXNlCisgICAgZGVmIGNvbG9ybW9kZWwoc2VsZiwgdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIlVzZWxlc3MuIE5vdCBpbXBsZW1lbnRlZCBpbiBUay4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgndGsnLCAnY29sb3Jtb2RlbCcsIHNlbGYuX3csIHZhbHVlKQorICAgIGRlZiB3aW5mb19hdG9tKHNlbGYsIG5hbWUsIGRpc3BsYXlvZj0wKToKKyAgICAgICAgIiIiUmV0dXJuIGludGVnZXIgd2hpY2ggcmVwcmVzZW50cyBhdG9tIE5BTUUuIiIiCisgICAgICAgIGFyZ3MgPSAoJ3dpbmZvJywgJ2F0b20nKSArIHNlbGYuX2Rpc3BsYXlvZihkaXNwbGF5b2YpICsgKG5hbWUsKQorICAgICAgICByZXR1cm4gZ2V0aW50KHNlbGYudGsuY2FsbChhcmdzKSkKKyAgICBkZWYgd2luZm9fYXRvbW5hbWUoc2VsZiwgaWQsIGRpc3BsYXlvZj0wKToKKyAgICAgICAgIiIiUmV0dXJuIG5hbWUgb2YgYXRvbSB3aXRoIGlkZW50aWZpZXIgSUQuIiIiCisgICAgICAgIGFyZ3MgPSAoJ3dpbmZvJywgJ2F0b21uYW1lJykgXAorICAgICAgICAgICAgICAgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKSArIChpZCwpCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoYXJncykKKyAgICBkZWYgd2luZm9fY2VsbHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIGNvbG9ybWFwIGZvciB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnY2VsbHMnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fY2hpbGRyZW4oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHdpZGdldHMgd2hpY2ggYXJlIGNoaWxkcmVuIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2NoaWxkcmVuJywgc2VsZi5fdykpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgVGNsIHNvbWV0aW1lcyByZXR1cm5zIGV4dHJhIHdpbmRvd3MsIGUuZy4gZm9yCisgICAgICAgICAgICAgICAgIyBtZW51czsgdGhvc2UgbmVlZCB0byBiZSBza2lwcGVkCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLl9uYW1ldG93aWRnZXQoY2hpbGQpKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHdpbmZvX2NsYXNzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2luZG93IGNsYXNzIG5hbWUgb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2NsYXNzJywgc2VsZi5fdykKKyAgICBkZWYgd2luZm9fY29sb3JtYXBmdWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBhdCB0aGUgbGFzdCBjb2xvciByZXF1ZXN0IHRoZSBjb2xvcm1hcCB3YXMgZnVsbC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0Ym9vbGVhbigKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnY29sb3JtYXBmdWxsJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX2NvbnRhaW5pbmcoc2VsZiwgcm9vdFgsIHJvb3RZLCBkaXNwbGF5b2Y9MCk6CisgICAgICAgICIiIlJldHVybiB0aGUgd2lkZ2V0IHdoaWNoIGlzIGF0IHRoZSByb290IGNvb3JkaW5hdGVzIFJPT1RYLCBST09UWS4iIiIKKyAgICAgICAgYXJncyA9ICgnd2luZm8nLCAnY29udGFpbmluZycpIFwKKyAgICAgICAgICAgICAgICsgc2VsZi5fZGlzcGxheW9mKGRpc3BsYXlvZikgKyAocm9vdFgsIHJvb3RZKQorICAgICAgICBuYW1lID0gc2VsZi50ay5jYWxsKGFyZ3MpCisgICAgICAgIGlmIG5vdCBuYW1lOiByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZXRvd2lkZ2V0KG5hbWUpCisgICAgZGVmIHdpbmZvX2RlcHRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHBlciBwaXhlbC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludChzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ2RlcHRoJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX2V4aXN0cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhpcyB3aWRnZXQgZXhpc3RzLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdleGlzdHMnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fZnBpeGVscyhzZWxmLCBudW1iZXIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMgZm9yIHRoZSBnaXZlbiBkaXN0YW5jZSBOVU1CRVIKKyAgICAgICAgKGUuZy4gIjNjIikgYXMgZmxvYXQuIiIiCisgICAgICAgIHJldHVybiBnZXRkb3VibGUoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgJ3dpbmZvJywgJ2ZwaXhlbHMnLCBzZWxmLl93LCBudW1iZXIpKQorICAgIGRlZiB3aW5mb19nZW9tZXRyeShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGdlb21ldHJ5IHN0cmluZyBmb3IgdGhpcyB3aWRnZXQgaW4gdGhlIGZvcm0gIndpZHRoeGhlaWdodCtYK1kiLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICdnZW9tZXRyeScsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX2hlaWdodChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGhlaWdodCBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaGVpZ2h0Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX2lkKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaWRlbnRpZmllciBJRCBmb3IgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnaWQnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9faW50ZXJwcyhzZWxmLCBkaXNwbGF5b2Y9MCk6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiBhbGwgVGNsIGludGVycHJldGVycyBmb3IgdGhpcyBkaXNwbGF5LiIiIgorICAgICAgICBhcmdzID0gKCd3aW5mbycsICdpbnRlcnBzJykgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKQorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKGFyZ3MpKQorICAgIGRlZiB3aW5mb19pc21hcHBlZChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhpcyB3aWRnZXQgaXMgbWFwcGVkLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdpc21hcHBlZCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19tYW5hZ2VyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHdpbmRvdyBtYW5hbmdlciBuYW1lIGZvciB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnbWFuYWdlcicsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX25hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnbmFtZScsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX3BhcmVudChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwYXJlbnQgb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3BhcmVudCcsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX3BhdGhuYW1lKHNlbGYsIGlkLCBkaXNwbGF5b2Y9MCk6CisgICAgICAgICIiIlJldHVybiB0aGUgcGF0aG5hbWUgb2YgdGhlIHdpZGdldCBnaXZlbiBieSBJRC4iIiIKKyAgICAgICAgYXJncyA9ICgnd2luZm8nLCAncGF0aG5hbWUnKSBcCisgICAgICAgICAgICAgICArIHNlbGYuX2Rpc3BsYXlvZihkaXNwbGF5b2YpICsgKGlkLCkKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChhcmdzKQorICAgIGRlZiB3aW5mb19waXhlbHMoc2VsZiwgbnVtYmVyKToKKyAgICAgICAgIiIiUm91bmRlZCBpbnRlZ2VyIHZhbHVlIG9mIHdpbmZvX2ZwaXhlbHMuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3BpeGVscycsIHNlbGYuX3csIG51bWJlcikpCisgICAgZGVmIHdpbmZvX3BvaW50ZXJ4KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgcG9pbnRlciBvbiB0aGUgcm9vdCB3aW5kb3cuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3BvaW50ZXJ4Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3BvaW50ZXJ4eShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgb2YgeCBhbmQgeSBjb29yZGluYXRlcyBvZiB0aGUgcG9pbnRlciBvbiB0aGUgcm9vdCB3aW5kb3cuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdwb2ludGVyeHknLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fcG9pbnRlcnkoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSBwb2ludGVyIG9uIHRoZSByb290IHdpbmRvdy4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAncG9pbnRlcnknLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fcmVxaGVpZ2h0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gcmVxdWVzdGVkIGhlaWdodCBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAncmVxaGVpZ2h0Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3JlcXdpZHRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gcmVxdWVzdGVkIHdpZHRoIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdyZXF3aWR0aCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19yZ2Ioc2VsZiwgY29sb3IpOgorICAgICAgICAiIiJSZXR1cm4gdHVwbGUgb2YgZGVjaW1hbCB2YWx1ZXMgZm9yIHJlZCwgZ3JlZW4sIGJsdWUgZm9yCisgICAgICAgIENPTE9SIGluIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAncmdiJywgc2VsZi5fdywgY29sb3IpKQorICAgIGRlZiB3aW5mb19yb290eChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHggY29vcmRpbmF0ZSBvZiB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGlzIHdpZGdldCBvbiB0aGUKKyAgICAgICAgcm9vdCB3aW5kb3cuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Jvb3R4Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3Jvb3R5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4geSBjb29yZGluYXRlIG9mIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoaXMgd2lkZ2V0IG9uIHRoZQorICAgICAgICByb290IHdpbmRvdy4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAncm9vdHknLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fc2NyZWVuKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHNjcmVlbiBuYW1lIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICdzY3JlZW4nLCBzZWxmLl93KQorICAgIGRlZiB3aW5mb19zY3JlZW5jZWxscyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgdGhlIGNlbGxzIGluIHRoZSBjb2xvcm1hcCBvZiB0aGUgc2NyZWVuCisgICAgICAgIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdzY3JlZW5jZWxscycsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19zY3JlZW5kZXB0aChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBwZXIgcGl4ZWwgb2YgdGhlIHJvb3Qgd2luZG93IG9mIHRoZQorICAgICAgICBzY3JlZW4gb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3NjcmVlbmRlcHRoJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3NjcmVlbmhlaWdodChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzIG9mIHRoZSBoZWlnaHQgb2YgdGhlIHNjcmVlbiBvZiB0aGlzIHdpZGdldAorICAgICAgICBpbiBwaXhlbC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnc2NyZWVuaGVpZ2h0Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3NjcmVlbm1taGVpZ2h0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMgb2YgdGhlIGhlaWdodCBvZiB0aGUgc2NyZWVuIG9mCisgICAgICAgIHRoaXMgd2lkZ2V0IGluIG1tLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdzY3JlZW5tbWhlaWdodCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19zY3JlZW5tbXdpZHRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG51bWJlciBvZiBwaXhlbHMgb2YgdGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4gb2YKKyAgICAgICAgdGhpcyB3aWRnZXQgaW4gbW0uIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3NjcmVlbm1td2lkdGgnLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fc2NyZWVudmlzdWFsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gb25lIG9mIHRoZSBzdHJpbmdzIGRpcmVjdGNvbG9yLCBncmF5c2NhbGUsIHBzZXVkb2NvbG9yLAorICAgICAgICBzdGF0aWNjb2xvciwgc3RhdGljZ3JheSwgb3IgdHJ1ZWNvbG9yIGZvciB0aGUgZGVmYXVsdAorICAgICAgICBjb2xvcm1vZGVsIG9mIHRoaXMgc2NyZWVuLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3aW5mbycsICdzY3JlZW52aXN1YWwnLCBzZWxmLl93KQorICAgIGRlZiB3aW5mb19zY3JlZW53aWR0aChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgcGl4ZWxzIG9mIHRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuIG9mCisgICAgICAgIHRoaXMgd2lkZ2V0IGluIHBpeGVsLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICdzY3JlZW53aWR0aCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb19zZXJ2ZXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiBpbmZvcm1hdGlvbiBvZiB0aGUgWC1TZXJ2ZXIgb2YgdGhlIHNjcmVlbiBvZiB0aGlzIHdpZGdldCBpbgorICAgICAgICB0aGUgZm9ybSAiWG1ham9yUm1pbm9yIHZlbmRvciB2ZW5kb3JWZXJzaW9uIi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd2luZm8nLCAnc2VydmVyJywgc2VsZi5fdykKKyAgICBkZWYgd2luZm9fdG9wbGV2ZWwoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdG9wbGV2ZWwgd2lkZ2V0IG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fbmFtZXRvd2lkZ2V0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICd3aW5mbycsICd0b3BsZXZlbCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb192aWV3YWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIHdpZGdldCBhbmQgYWxsIGl0cyBoaWdoZXIgYW5jZXN0b3JzIGFyZSBtYXBwZWQuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3ZpZXdhYmxlJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3Zpc3VhbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIG9uZSBvZiB0aGUgc3RyaW5ncyBkaXJlY3Rjb2xvciwgZ3JheXNjYWxlLCBwc2V1ZG9jb2xvciwKKyAgICAgICAgc3RhdGljY29sb3IsIHN0YXRpY2dyYXksIG9yIHRydWVjb2xvciBmb3IgdGhlCisgICAgICAgIGNvbG9ybW9kZWwgb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Zpc3VhbCcsIHNlbGYuX3cpCisgICAgZGVmIHdpbmZvX3Zpc3VhbGlkKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIFggaWRlbnRpZmllciBmb3IgdGhlIHZpc3VhbCBmb3IgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Zpc3VhbGlkJywgc2VsZi5fdykKKyAgICBkZWYgd2luZm9fdmlzdWFsc2F2YWlsYWJsZShzZWxmLCBpbmNsdWRlaWRzPTApOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB2aXN1YWxzIGF2YWlsYWJsZSBmb3IgdGhlIHNjcmVlbgorICAgICAgICBvZiB0aGlzIHdpZGdldC4KKworICAgICAgICBFYWNoIGl0ZW0gaW4gdGhlIGxpc3QgY29uc2lzdHMgb2YgYSB2aXN1YWwgbmFtZSAoc2VlIHdpbmZvX3Zpc3VhbCksIGEKKyAgICAgICAgZGVwdGggYW5kIGlmIElOQ0xVREVJRFM9MSBpcyBnaXZlbiBhbHNvIHRoZSBYIGlkZW50aWZpZXIuIiIiCisgICAgICAgIGRhdGEgPSBzZWxmLnRrLnNwbGl0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd2aXN1YWxzYXZhaWxhYmxlJywgc2VsZi5fdywKKyAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVpZHMgYW5kICdpbmNsdWRlaWRzJyBvciBOb25lKSkKKyAgICAgICAgaWYgdHlwZShkYXRhKSBpcyBTdHJpbmdUeXBlOgorICAgICAgICAgICAgZGF0YSA9IFtzZWxmLnRrLnNwbGl0KGRhdGEpXQorICAgICAgICByZXR1cm4gbWFwKHNlbGYuX193aW5mb19wYXJzZWl0ZW0sIGRhdGEpCisgICAgZGVmIF9fd2luZm9fcGFyc2VpdGVtKHNlbGYsIHQpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHRbOjFdICsgdHVwbGUobWFwKHNlbGYuX193aW5mb19nZXRpbnQsIHRbMTpdKSkKKyAgICBkZWYgX193aW5mb19nZXRpbnQoc2VsZiwgeCk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICByZXR1cm4gaW50KHgsIDApCisgICAgZGVmIHdpbmZvX3Zyb290aGVpZ2h0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdmlydHVhbCByb290IHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAgICB3aWRnZXQgaW4gcGl4ZWxzLiBJZiB0aGVyZSBpcyBubyB2aXJ0dWFsIHJvb3Qgd2luZG93IHJldHVybiB0aGUKKyAgICAgICAgaGVpZ2h0IG9mIHRoZSBzY3JlZW4uIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3Zyb290aGVpZ2h0Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3Zyb290d2lkdGgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgd2lkdGggb2YgdGhlIHZpcnR1YWwgcm9vdCB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAgICAgd2lkZ2V0IGluIHBpeGVsLiBJZiB0aGVyZSBpcyBubyB2aXJ0dWFsIHJvb3Qgd2luZG93IHJldHVybiB0aGUKKyAgICAgICAgd2lkdGggb2YgdGhlIHNjcmVlbi4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAndnJvb3R3aWR0aCcsIHNlbGYuX3cpKQorICAgIGRlZiB3aW5mb192cm9vdHgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgeCBvZmZzZXQgb2YgdGhlIHZpcnR1YWwgcm9vdCByZWxhdGl2ZSB0byB0aGUgcm9vdAorICAgICAgICB3aW5kb3cgb2YgdGhlIHNjcmVlbiBvZiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd2luZm8nLCAndnJvb3R4Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3Zyb290eShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB5IG9mZnNldCBvZiB0aGUgdmlydHVhbCByb290IHJlbGF0aXZlIHRvIHRoZSByb290CisgICAgICAgIHdpbmRvdyBvZiB0aGUgc2NyZWVuIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd2cm9vdHknLCBzZWxmLl93KSkKKyAgICBkZWYgd2luZm9fd2lkdGgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgd2lkdGggb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3dpbmZvJywgJ3dpZHRoJywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3goc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgeCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGlzIHdpZGdldAorICAgICAgICBpbiB0aGUgcGFyZW50LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd4Jywgc2VsZi5fdykpCisgICAgZGVmIHdpbmZvX3koc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGlzIHdpZGdldAorICAgICAgICBpbiB0aGUgcGFyZW50LiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCd3aW5mbycsICd5Jywgc2VsZi5fdykpCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgIiIiRW50ZXIgZXZlbnQgbG9vcCB1bnRpbCBhbGwgcGVuZGluZyBldmVudHMgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSBUY2wuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgndXBkYXRlJykKKyAgICBkZWYgdXBkYXRlX2lkbGV0YXNrcyhzZWxmKToKKyAgICAgICAgIiIiRW50ZXIgZXZlbnQgbG9vcCB1bnRpbCBhbGwgaWRsZSBjYWxsYmFja3MgaGF2ZSBiZWVuIGNhbGxlZC4gVGhpcworICAgICAgICB3aWxsIHVwZGF0ZSB0aGUgZGlzcGxheSBvZiB3aW5kb3dzIGJ1dCBub3QgcHJvY2VzcyBldmVudHMgY2F1c2VkIGJ5CisgICAgICAgIHRoZSB1c2VyLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3VwZGF0ZScsICdpZGxldGFza3MnKQorICAgIGRlZiBiaW5kdGFncyhzZWxmLCB0YWdMaXN0PU5vbmUpOgorICAgICAgICAiIiJTZXQgb3IgZ2V0IHRoZSBsaXN0IG9mIGJpbmR0YWdzIGZvciB0aGlzIHdpZGdldC4KKworICAgICAgICBXaXRoIG5vIGFyZ3VtZW50IHJldHVybiB0aGUgbGlzdCBvZiBhbGwgYmluZHRhZ3MgYXNzb2NpYXRlZCB3aXRoCisgICAgICAgIHRoaXMgd2lkZ2V0LiBXaXRoIGEgbGlzdCBvZiBzdHJpbmdzIGFzIGFyZ3VtZW50IHRoZSBiaW5kdGFncyBhcmUKKyAgICAgICAgc2V0IHRvIHRoaXMgbGlzdC4gVGhlIGJpbmR0YWdzIGRldGVybWluZSBpbiB3aGljaCBvcmRlciBldmVudHMgYXJlCisgICAgICAgIHByb2Nlc3NlZCAoc2VlIGJpbmQpLiIiIgorICAgICAgICBpZiB0YWdMaXN0IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdiaW5kdGFncycsIHNlbGYuX3cpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdiaW5kdGFncycsIHNlbGYuX3csIHRhZ0xpc3QpCisgICAgZGVmIF9iaW5kKHNlbGYsIHdoYXQsIHNlcXVlbmNlLCBmdW5jLCBhZGQsIG5lZWRjbGVhbnVwPTEpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYgdHlwZShmdW5jKSBpcyBTdHJpbmdUeXBlOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHdoYXQgKyAoc2VxdWVuY2UsIGZ1bmMpKQorICAgICAgICBlbGlmIGZ1bmM6CisgICAgICAgICAgICBmdW5jaWQgPSBzZWxmLl9yZWdpc3RlcihmdW5jLCBzZWxmLl9zdWJzdGl0dXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGNsZWFudXApCisgICAgICAgICAgICBjbWQgPSAoJyVzaWYgeyJbJXMgJXNdIiA9PSAiYnJlYWsifSBicmVha1xuJworICAgICAgICAgICAgICAgICAgICUKKyAgICAgICAgICAgICAgICAgICAoYWRkIGFuZCAnKycgb3IgJycsCisgICAgICAgICAgICAgICAgZnVuY2lkLCBzZWxmLl9zdWJzdF9mb3JtYXRfc3RyKSkKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCh3aGF0ICsgKHNlcXVlbmNlLCBjbWQpKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmNpZAorICAgICAgICBlbGlmIHNlcXVlbmNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCh3aGF0ICsgKHNlcXVlbmNlLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKHdoYXQpKQorICAgIGRlZiBiaW5kKHNlbGYsIHNlcXVlbmNlPU5vbmUsIGZ1bmM9Tm9uZSwgYWRkPU5vbmUpOgorICAgICAgICAiIiJCaW5kIHRvIHRoaXMgd2lkZ2V0IGF0IGV2ZW50IFNFUVVFTkNFIGEgY2FsbCB0byBmdW5jdGlvbiBGVU5DLgorCisgICAgICAgIFNFUVVFTkNFIGlzIGEgc3RyaW5nIG9mIGNvbmNhdGVuYXRlZCBldmVudAorICAgICAgICBwYXR0ZXJucy4gQW4gZXZlbnQgcGF0dGVybiBpcyBvZiB0aGUgZm9ybQorICAgICAgICA8TU9ESUZJRVItTU9ESUZJRVItVFlQRS1ERVRBSUw+IHdoZXJlIE1PRElGSUVSIGlzIG9uZQorICAgICAgICBvZiBDb250cm9sLCBNb2QyLCBNMiwgU2hpZnQsIE1vZDMsIE0zLCBMb2NrLCBNb2Q0LCBNNCwKKyAgICAgICAgQnV0dG9uMSwgQjEsIE1vZDUsIE01IEJ1dHRvbjIsIEIyLCBNZXRhLCBNLCBCdXR0b24zLAorICAgICAgICBCMywgQWx0LCBCdXR0b240LCBCNCwgRG91YmxlLCBCdXR0b241LCBCNSBUcmlwbGUsCisgICAgICAgIE1vZDEsIE0xLiBUWVBFIGlzIG9uZSBvZiBBY3RpdmF0ZSwgRW50ZXIsIE1hcCwKKyAgICAgICAgQnV0dG9uUHJlc3MsIEJ1dHRvbiwgRXhwb3NlLCBNb3Rpb24sIEJ1dHRvblJlbGVhc2UKKyAgICAgICAgRm9jdXNJbiwgTW91c2VXaGVlbCwgQ2lyY3VsYXRlLCBGb2N1c091dCwgUHJvcGVydHksCisgICAgICAgIENvbG9ybWFwLCBHcmF2aXR5IFJlcGFyZW50LCBDb25maWd1cmUsIEtleVByZXNzLCBLZXksCisgICAgICAgIFVubWFwLCBEZWFjdGl2YXRlLCBLZXlSZWxlYXNlIFZpc2liaWxpdHksIERlc3Ryb3ksCisgICAgICAgIExlYXZlIGFuZCBERVRBSUwgaXMgdGhlIGJ1dHRvbiBudW1iZXIgZm9yIEJ1dHRvblByZXNzLAorICAgICAgICBCdXR0b25SZWxlYXNlIGFuZCBERVRBSUwgaXMgdGhlIEtleXN5bSBmb3IgS2V5UHJlc3MgYW5kCisgICAgICAgIEtleVJlbGVhc2UuIEV4YW1wbGVzIGFyZQorICAgICAgICA8Q29udHJvbC1CdXR0b24tMT4gZm9yIHByZXNzaW5nIENvbnRyb2wgYW5kIG1vdXNlIGJ1dHRvbiAxIG9yCisgICAgICAgIDxBbHQtQT4gZm9yIHByZXNzaW5nIEEgYW5kIHRoZSBBbHQga2V5IChLZXlQcmVzcyBjYW4gYmUgb21pdHRlZCkuCisgICAgICAgIEFuIGV2ZW50IHBhdHRlcm4gY2FuIGFsc28gYmUgYSB2aXJ0dWFsIGV2ZW50IG9mIHRoZSBmb3JtCisgICAgICAgIDw8QVN0cmluZz4+IHdoZXJlIEFTdHJpbmcgY2FuIGJlIGFyYml0cmFyeS4gVGhpcworICAgICAgICBldmVudCBjYW4gYmUgZ2VuZXJhdGVkIGJ5IGV2ZW50X2dlbmVyYXRlLgorICAgICAgICBJZiBldmVudHMgYXJlIGNvbmNhdGVuYXRlZCB0aGV5IG11c3QgYXBwZWFyIHNob3J0bHkKKyAgICAgICAgYWZ0ZXIgZWFjaCBvdGhlci4KKworICAgICAgICBGVU5DIHdpbGwgYmUgY2FsbGVkIGlmIHRoZSBldmVudCBzZXF1ZW5jZSBvY2N1cnMgd2l0aCBhbgorICAgICAgICBpbnN0YW5jZSBvZiBFdmVudCBhcyBhcmd1bWVudC4gSWYgdGhlIHJldHVybiB2YWx1ZSBvZiBGVU5DIGlzCisgICAgICAgICJicmVhayIgbm8gZnVydGhlciBib3VuZCBmdW5jdGlvbiBpcyBpbnZva2VkLgorCisgICAgICAgIEFuIGFkZGl0aW9uYWwgYm9vbGVhbiBwYXJhbWV0ZXIgQUREIHNwZWNpZmllcyB3aGV0aGVyIEZVTkMgd2lsbAorICAgICAgICBiZSBjYWxsZWQgYWRkaXRpb25hbGx5IHRvIHRoZSBvdGhlciBib3VuZCBmdW5jdGlvbiBvciB3aGV0aGVyCisgICAgICAgIGl0IHdpbGwgcmVwbGFjZSB0aGUgcHJldmlvdXMgZnVuY3Rpb24uCisKKyAgICAgICAgQmluZCB3aWxsIHJldHVybiBhbiBpZGVudGlmaWVyIHRvIGFsbG93IGRlbGV0aW9uIG9mIHRoZSBib3VuZCBmdW5jdGlvbiB3aXRoCisgICAgICAgIHVuYmluZCB3aXRob3V0IG1lbW9yeSBsZWFrLgorCisgICAgICAgIElmIEZVTkMgb3IgU0VRVUVOQ0UgaXMgb21pdHRlZCB0aGUgYm91bmQgZnVuY3Rpb24gb3IgbGlzdAorICAgICAgICBvZiBib3VuZCBldmVudHMgYXJlIHJldHVybmVkLiIiIgorCisgICAgICAgIHJldHVybiBzZWxmLl9iaW5kKCgnYmluZCcsIHNlbGYuX3cpLCBzZXF1ZW5jZSwgZnVuYywgYWRkKQorICAgIGRlZiB1bmJpbmQoc2VsZiwgc2VxdWVuY2UsIGZ1bmNpZD1Ob25lKToKKyAgICAgICAgIiIiVW5iaW5kIGZvciB0aGlzIHdpZGdldCBmb3IgZXZlbnQgU0VRVUVOQ0UgIHRoZQorICAgICAgICBmdW5jdGlvbiBpZGVudGlmaWVkIHdpdGggRlVOQ0lELiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ2JpbmQnLCBzZWxmLl93LCBzZXF1ZW5jZSwgJycpCisgICAgICAgIGlmIGZ1bmNpZDoKKyAgICAgICAgICAgIHNlbGYuZGVsZXRlY29tbWFuZChmdW5jaWQpCisgICAgZGVmIGJpbmRfYWxsKHNlbGYsIHNlcXVlbmNlPU5vbmUsIGZ1bmM9Tm9uZSwgYWRkPU5vbmUpOgorICAgICAgICAiIiJCaW5kIHRvIGFsbCB3aWRnZXRzIGF0IGFuIGV2ZW50IFNFUVVFTkNFIGEgY2FsbCB0byBmdW5jdGlvbiBGVU5DLgorICAgICAgICBBbiBhZGRpdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIEFERCBzcGVjaWZpZXMgd2hldGhlciBGVU5DIHdpbGwKKyAgICAgICAgYmUgY2FsbGVkIGFkZGl0aW9uYWxseSB0byB0aGUgb3RoZXIgYm91bmQgZnVuY3Rpb24gb3Igd2hldGhlcgorICAgICAgICBpdCB3aWxsIHJlcGxhY2UgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLiBTZWUgYmluZCBmb3IgdGhlIHJldHVybiB2YWx1ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2JpbmQoKCdiaW5kJywgJ2FsbCcpLCBzZXF1ZW5jZSwgZnVuYywgYWRkLCAwKQorICAgIGRlZiB1bmJpbmRfYWxsKHNlbGYsIHNlcXVlbmNlKToKKyAgICAgICAgIiIiVW5iaW5kIGZvciBhbGwgd2lkZ2V0cyBmb3IgZXZlbnQgU0VRVUVOQ0UgYWxsIGZ1bmN0aW9ucy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdiaW5kJywgJ2FsbCcgLCBzZXF1ZW5jZSwgJycpCisgICAgZGVmIGJpbmRfY2xhc3Moc2VsZiwgY2xhc3NOYW1lLCBzZXF1ZW5jZT1Ob25lLCBmdW5jPU5vbmUsIGFkZD1Ob25lKToKKworICAgICAgICAiIiJCaW5kIHRvIHdpZGdldHMgd2l0aCBiaW5kdGFnIENMQVNTTkFNRSBhdCBldmVudAorICAgICAgICBTRVFVRU5DRSBhIGNhbGwgb2YgZnVuY3Rpb24gRlVOQy4gQW4gYWRkaXRpb25hbAorICAgICAgICBib29sZWFuIHBhcmFtZXRlciBBREQgc3BlY2lmaWVzIHdoZXRoZXIgRlVOQyB3aWxsIGJlCisgICAgICAgIGNhbGxlZCBhZGRpdGlvbmFsbHkgdG8gdGhlIG90aGVyIGJvdW5kIGZ1bmN0aW9uIG9yCisgICAgICAgIHdoZXRoZXIgaXQgd2lsbCByZXBsYWNlIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4gU2VlIGJpbmQgZm9yCisgICAgICAgIHRoZSByZXR1cm4gdmFsdWUuIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2JpbmQoKCdiaW5kJywgY2xhc3NOYW1lKSwgc2VxdWVuY2UsIGZ1bmMsIGFkZCwgMCkKKyAgICBkZWYgdW5iaW5kX2NsYXNzKHNlbGYsIGNsYXNzTmFtZSwgc2VxdWVuY2UpOgorICAgICAgICAiIiJVbmJpbmQgZm9yIGEgYWxsIHdpZGdldHMgd2l0aCBiaW5kdGFnIENMQVNTTkFNRSBmb3IgZXZlbnQgU0VRVUVOQ0UKKyAgICAgICAgYWxsIGZ1bmN0aW9ucy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdiaW5kJywgY2xhc3NOYW1lICwgc2VxdWVuY2UsICcnKQorICAgIGRlZiBtYWlubG9vcChzZWxmLCBuPTApOgorICAgICAgICAiIiJDYWxsIHRoZSBtYWlubG9vcCBvZiBUay4iIiIKKyAgICAgICAgc2VsZi50ay5tYWlubG9vcChuKQorICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICAiIiJRdWl0IHRoZSBUY2wgaW50ZXJwcmV0ZXIuIEFsbCB3aWRnZXRzIHdpbGwgYmUgZGVzdHJveWVkLiIiIgorICAgICAgICBzZWxmLnRrLnF1aXQoKQorICAgIGRlZiBfZ2V0aW50cyhzZWxmLCBzdHJpbmcpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYgc3RyaW5nOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKG1hcChnZXRpbnQsIHNlbGYudGsuc3BsaXRsaXN0KHN0cmluZykpKQorICAgIGRlZiBfZ2V0ZG91YmxlcyhzZWxmLCBzdHJpbmcpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYgc3RyaW5nOgorICAgICAgICAgICAgcmV0dXJuIHR1cGxlKG1hcChnZXRkb3VibGUsIHNlbGYudGsuc3BsaXRsaXN0KHN0cmluZykpKQorICAgIGRlZiBfZ2V0Ym9vbGVhbihzZWxmLCBzdHJpbmcpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYgc3RyaW5nOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0Ym9vbGVhbihzdHJpbmcpCisgICAgZGVmIF9kaXNwbGF5b2Yoc2VsZiwgZGlzcGxheW9mKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGlmIGRpc3BsYXlvZjoKKyAgICAgICAgICAgIHJldHVybiAoJy1kaXNwbGF5b2YnLCBkaXNwbGF5b2YpCisgICAgICAgIGlmIGRpc3BsYXlvZiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICgnLWRpc3BsYXlvZicsIHNlbGYuX3cpCisgICAgICAgIHJldHVybiAoKQorICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfd2luZG93aW5nc3lzdGVtKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QoKS5fd2luZG93aW5nc3lzdGVtX2NhY2hlZAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB3cyA9IHNlbGYuX3Jvb3QoKS5fd2luZG93aW5nc3lzdGVtX2NhY2hlZCA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgndGsnLCAnd2luZG93aW5nc3lzdGVtJykKKyAgICAgICAgICAgIHJldHVybiB3cworICAgIGRlZiBfb3B0aW9ucyhzZWxmLCBjbmYsIGt3ID0gTm9uZSk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoY25mKQorICAgICAgICByZXMgPSAoKQorICAgICAgICBmb3IgaywgdiBpbiBjbmYuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYga1stMV0gPT0gJ18nOiBrID0ga1s6LTFdCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cih2LCAnX19jYWxsX18nKToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHNlbGYuX3JlZ2lzdGVyKHYpCisgICAgICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHYsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICAgICAgICAgICAgICBudiA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHY6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCAoYmFzZXN0cmluZywgaW50KSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShpdGVtLCBpbnQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG52LmFwcGVuZCgnJWQnICUgaXRlbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3JtYXQgaXQgdG8gcHJvcGVyIFRjbCBjb2RlIGlmIGl0IGNvbnRhaW5zIHNwYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnYuYXBwZW5kKF9zdHJpbmdpZnkoaXRlbSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gJyAnLmpvaW4obnYpCisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgKCctJytrLCB2KQorICAgICAgICByZXR1cm4gcmVzCisgICAgZGVmIG5hbWV0b3dpZGdldChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBUa2ludGVyIGluc3RhbmNlIG9mIGEgd2lkZ2V0IGlkZW50aWZpZWQgYnkKKyAgICAgICAgaXRzIFRjbCBuYW1lIE5BTUUuIiIiCisgICAgICAgIG5hbWUgPSBzdHIobmFtZSkuc3BsaXQoJy4nKQorICAgICAgICB3ID0gc2VsZgorCisgICAgICAgIGlmIG5vdCBuYW1lWzBdOgorICAgICAgICAgICAgdyA9IHcuX3Jvb3QoKQorICAgICAgICAgICAgbmFtZSA9IG5hbWVbMTpdCisKKyAgICAgICAgZm9yIG4gaW4gbmFtZToKKyAgICAgICAgICAgIGlmIG5vdCBuOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB3ID0gdy5jaGlsZHJlbltuXQorCisgICAgICAgIHJldHVybiB3CisgICAgX25hbWV0b3dpZGdldCA9IG5hbWV0b3dpZGdldAorICAgIGRlZiBfcmVnaXN0ZXIoc2VsZiwgZnVuYywgc3Vic3Q9Tm9uZSwgbmVlZGNsZWFudXA9MSk6CisgICAgICAgICIiIlJldHVybiBhIG5ld2x5IGNyZWF0ZWQgVGNsIGZ1bmN0aW9uLiBJZiB0aGlzCisgICAgICAgIGZ1bmN0aW9uIGlzIGNhbGxlZCwgdGhlIFB5dGhvbiBmdW5jdGlvbiBGVU5DIHdpbGwKKyAgICAgICAgYmUgZXhlY3V0ZWQuIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIFNVQlNUIGNhbgorICAgICAgICBiZSBnaXZlbiB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZSBGVU5DLiIiIgorICAgICAgICBmID0gQ2FsbFdyYXBwZXIoZnVuYywgc3Vic3QsIHNlbGYpLl9fY2FsbF9fCisgICAgICAgIG5hbWUgPSByZXByKGlkKGYpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdW5jID0gZnVuYy5pbV9mdW5jCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9IG5hbWUgKyBmdW5jLl9fbmFtZV9fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi50ay5jcmVhdGVjb21tYW5kKG5hbWUsIGYpCisgICAgICAgIGlmIG5lZWRjbGVhbnVwOgorICAgICAgICAgICAgaWYgc2VsZi5fdGNsQ29tbWFuZHMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcyA9IFtdCisgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcy5hcHBlbmQobmFtZSkKKyAgICAgICAgcmV0dXJuIG5hbWUKKyAgICByZWdpc3RlciA9IF9yZWdpc3RlcgorICAgIGRlZiBfcm9vdChzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHcgPSBzZWxmCisgICAgICAgIHdoaWxlIHcubWFzdGVyOiB3ID0gdy5tYXN0ZXIKKyAgICAgICAgcmV0dXJuIHcKKyAgICBfc3Vic3RfZm9ybWF0ID0gKCclIycsICclYicsICclZicsICclaCcsICclaycsCisgICAgICAgICAgICAgJyVzJywgJyV0JywgJyV3JywgJyV4JywgJyV5JywKKyAgICAgICAgICAgICAnJUEnLCAnJUUnLCAnJUsnLCAnJU4nLCAnJVcnLCAnJVQnLCAnJVgnLCAnJVknLCAnJUQnKQorICAgIF9zdWJzdF9mb3JtYXRfc3RyID0gIiAiLmpvaW4oX3N1YnN0X2Zvcm1hdCkKKyAgICBkZWYgX3N1YnN0aXR1dGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgaWYgbGVuKGFyZ3MpICE9IGxlbihzZWxmLl9zdWJzdF9mb3JtYXQpOiByZXR1cm4gYXJncworICAgICAgICBnZXRib29sZWFuID0gc2VsZi50ay5nZXRib29sZWFuCisKKyAgICAgICAgZ2V0aW50ID0gaW50CisgICAgICAgIGRlZiBnZXRpbnRfZXZlbnQocyk6CisgICAgICAgICAgICAiIiJUayBjaGFuZ2VkIGJlaGF2aW9yIGluIDguNC4yLCByZXR1cm5pbmcgIj8/IiByYXRoZXIgbW9yZSBvZnRlbi4iIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KHMpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcworCisgICAgICAgIG5zaWduLCBiLCBmLCBoLCBrLCBzLCB0LCB3LCB4LCB5LCBBLCBFLCBLLCBOLCBXLCBULCBYLCBZLCBEID0gYXJncworICAgICAgICAjIE1pc3Npbmc6IChhLCBjLCBkLCBtLCBvLCB2LCBCLCBSKQorICAgICAgICBlID0gRXZlbnQoKQorICAgICAgICAjIHNlcmlhbCBmaWVsZDogdmFsaWQgdm9yIGFsbCBldmVudHMKKyAgICAgICAgIyBudW1iZXIgb2YgYnV0dG9uOiBCdXR0b25QcmVzcyBhbmQgQnV0dG9uUmVsZWFzZSBldmVudHMgb25seQorICAgICAgICAjIGhlaWdodCBmaWVsZDogQ29uZmlndXJlLCBDb25maWd1cmVSZXF1ZXN0LCBDcmVhdGUsCisgICAgICAgICMgUmVzaXplUmVxdWVzdCwgYW5kIEV4cG9zZSBldmVudHMgb25seQorICAgICAgICAjIGtleWNvZGUgZmllbGQ6IEtleVByZXNzIGFuZCBLZXlSZWxlYXNlIGV2ZW50cyBvbmx5CisgICAgICAgICMgdGltZSBmaWVsZDogInZhbGlkIGZvciBldmVudHMgdGhhdCBjb250YWluIGEgdGltZSBmaWVsZCIKKyAgICAgICAgIyB3aWR0aCBmaWVsZDogQ29uZmlndXJlLCBDb25maWd1cmVSZXF1ZXN0LCBDcmVhdGUsIFJlc2l6ZVJlcXVlc3QsCisgICAgICAgICMgYW5kIEV4cG9zZSBldmVudHMgb25seQorICAgICAgICAjIHggZmllbGQ6ICJ2YWxpZCBmb3IgZXZlbnRzIHRoYXQgY29udGFpbiBhIHggZmllbGQiCisgICAgICAgICMgeSBmaWVsZDogInZhbGlkIGZvciBldmVudHMgdGhhdCBjb250YWluIGEgeSBmaWVsZCIKKyAgICAgICAgIyBrZXlzeW0gYXMgZGVjaW1hbDogS2V5UHJlc3MgYW5kIEtleVJlbGVhc2UgZXZlbnRzIG9ubHkKKyAgICAgICAgIyB4X3Jvb3QsIHlfcm9vdCBmaWVsZHM6IEJ1dHRvblByZXNzLCBCdXR0b25SZWxlYXNlLCBLZXlQcmVzcywKKyAgICAgICAgIyBLZXlSZWxlYXNlLGFuZCBNb3Rpb24gZXZlbnRzCisgICAgICAgIGUuc2VyaWFsID0gZ2V0aW50KG5zaWduKQorICAgICAgICBlLm51bSA9IGdldGludF9ldmVudChiKQorICAgICAgICB0cnk6IGUuZm9jdXMgPSBnZXRib29sZWFuKGYpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjogcGFzcworICAgICAgICBlLmhlaWdodCA9IGdldGludF9ldmVudChoKQorICAgICAgICBlLmtleWNvZGUgPSBnZXRpbnRfZXZlbnQoaykKKyAgICAgICAgZS5zdGF0ZSA9IGdldGludF9ldmVudChzKQorICAgICAgICBlLnRpbWUgPSBnZXRpbnRfZXZlbnQodCkKKyAgICAgICAgZS53aWR0aCA9IGdldGludF9ldmVudCh3KQorICAgICAgICBlLnggPSBnZXRpbnRfZXZlbnQoeCkKKyAgICAgICAgZS55ID0gZ2V0aW50X2V2ZW50KHkpCisgICAgICAgIGUuY2hhciA9IEEKKyAgICAgICAgdHJ5OiBlLnNlbmRfZXZlbnQgPSBnZXRib29sZWFuKEUpCisgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjogcGFzcworICAgICAgICBlLmtleXN5bSA9IEsKKyAgICAgICAgZS5rZXlzeW1fbnVtID0gZ2V0aW50X2V2ZW50KE4pCisgICAgICAgIGUudHlwZSA9IFQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZS53aWRnZXQgPSBzZWxmLl9uYW1ldG93aWRnZXQoVykKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgZS53aWRnZXQgPSBXCisgICAgICAgIGUueF9yb290ID0gZ2V0aW50X2V2ZW50KFgpCisgICAgICAgIGUueV9yb290ID0gZ2V0aW50X2V2ZW50KFkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGUuZGVsdGEgPSBnZXRpbnQoRCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBlLmRlbHRhID0gMAorICAgICAgICByZXR1cm4gKGUsKQorICAgIGRlZiBfcmVwb3J0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgZXhjLCB2YWwsIHRiID0gc3lzLmV4Y190eXBlLCBzeXMuZXhjX3ZhbHVlLCBzeXMuZXhjX3RyYWNlYmFjaworICAgICAgICByb290ID0gc2VsZi5fcm9vdCgpCisgICAgICAgIHJvb3QucmVwb3J0X2NhbGxiYWNrX2V4Y2VwdGlvbihleGMsIHZhbCwgdGIpCisgICAgZGVmIF9jb25maWd1cmUoc2VsZiwgY21kLCBjbmYsIGt3KToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIGlmIGt3OgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKChjbmYsIGt3KSkKKyAgICAgICAgZWxpZiBjbmY6CisgICAgICAgICAgICBjbmYgPSBfY25mbWVyZ2UoY25mKQorICAgICAgICBpZiBjbmYgaXMgTm9uZToKKyAgICAgICAgICAgIGNuZiA9IHt9CisgICAgICAgICAgICBmb3IgeCBpbiBzZWxmLnRrLnNwbGl0KAorICAgICAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoX2ZsYXR0ZW4oKHNlbGYuX3csIGNtZCkpKSk6CisgICAgICAgICAgICAgICAgY25mW3hbMF1bMTpdXSA9ICh4WzBdWzE6XSwpICsgeFsxOl0KKyAgICAgICAgICAgIHJldHVybiBjbmYKKyAgICAgICAgaWYgdHlwZShjbmYpIGlzIFN0cmluZ1R5cGU6CisgICAgICAgICAgICB4ID0gc2VsZi50ay5zcGxpdCgKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKF9mbGF0dGVuKChzZWxmLl93LCBjbWQsICctJytjbmYpKSkpCisgICAgICAgICAgICByZXR1cm4gKHhbMF1bMTpdLCkgKyB4WzE6XQorICAgICAgICBzZWxmLnRrLmNhbGwoX2ZsYXR0ZW4oKHNlbGYuX3csIGNtZCkpICsgc2VsZi5fb3B0aW9ucyhjbmYpKQorICAgICMgVGhlc2UgdXNlZCB0byBiZSBkZWZpbmVkIGluIFdpZGdldDoKKyAgICBkZWYgY29uZmlndXJlKHNlbGYsIGNuZj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uZmlndXJlIHJlc291cmNlcyBvZiBhIHdpZGdldC4KKworICAgICAgICBUaGUgdmFsdWVzIGZvciByZXNvdXJjZXMgYXJlIHNwZWNpZmllZCBhcyBrZXl3b3JkCisgICAgICAgIGFyZ3VtZW50cy4gVG8gZ2V0IGFuIG92ZXJ2aWV3IGFib3V0CisgICAgICAgIHRoZSBhbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzIGNhbGwgdGhlIG1ldGhvZCBrZXlzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgnY29uZmlndXJlJywgY25mLCBrdykKKyAgICBjb25maWcgPSBjb25maWd1cmUKKyAgICBkZWYgY2dldChzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHJlc291cmNlIHZhbHVlIGZvciBhIEtFWSBnaXZlbiBhcyBzdHJpbmcuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2NnZXQnLCAnLScgKyBrZXkpCisgICAgX19nZXRpdGVtX18gPSBjZ2V0CisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLmNvbmZpZ3VyZSh7a2V5OiB2YWx1ZX0pCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBrZXkpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIlRraW50ZXIgb2JqZWN0cyBkb24ndCBzdXBwb3J0ICdpbicgdGVzdHMuIikKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgcmVzb3VyY2UgbmFtZXMgb2YgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBtYXAobGFtYmRhIHg6IHhbMF1bMTpdLAorICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2NvbmZpZ3VyZScpKSkKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB3aW5kb3cgcGF0aCBuYW1lIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdworICAgICMgUGFjayBtZXRob2RzIHRoYXQgYXBwbHkgdG8gdGhlIG1hc3RlcgorICAgIF9ub2FyZ18gPSBbJ19ub2FyZ18nXQorICAgIGRlZiBwYWNrX3Byb3BhZ2F0ZShzZWxmLCBmbGFnPV9ub2FyZ18pOgorICAgICAgICAiIiJTZXQgb3IgZ2V0IHRoZSBzdGF0dXMgZm9yIHByb3BhZ2F0aW9uIG9mIGdlb21ldHJ5IGluZm9ybWF0aW9uLgorCisgICAgICAgIEEgYm9vbGVhbiBhcmd1bWVudCBzcGVjaWZpZXMgd2hldGhlciB0aGUgZ2VvbWV0cnkgaW5mb3JtYXRpb24KKyAgICAgICAgb2YgdGhlIHNsYXZlcyB3aWxsIGRldGVybWluZSB0aGUgc2l6ZSBvZiB0aGlzIHdpZGdldC4gSWYgbm8gYXJndW1lbnQKKyAgICAgICAgaXMgZ2l2ZW4gdGhlIGN1cnJlbnQgc2V0dGluZyB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZmxhZyBpcyBNaXNjLl9ub2FyZ186CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0Ym9vbGVhbihzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgJ3BhY2snLCAncHJvcGFnYXRlJywgc2VsZi5fdykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3BhY2snLCAncHJvcGFnYXRlJywgc2VsZi5fdywgZmxhZykKKyAgICBwcm9wYWdhdGUgPSBwYWNrX3Byb3BhZ2F0ZQorICAgIGRlZiBwYWNrX3NsYXZlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgc2xhdmVzIG9mIHRoaXMgd2lkZ2V0CisgICAgICAgIGluIGl0cyBwYWNraW5nIG9yZGVyLiIiIgorICAgICAgICByZXR1cm4gbWFwKHNlbGYuX25hbWV0b3dpZGdldCwKKyAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgncGFjaycsICdzbGF2ZXMnLCBzZWxmLl93KSkpCisgICAgc2xhdmVzID0gcGFja19zbGF2ZXMKKyAgICAjIFBsYWNlIG1ldGhvZCB0aGF0IGFwcGxpZXMgdG8gdGhlIG1hc3RlcgorICAgIGRlZiBwbGFjZV9zbGF2ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHNsYXZlcyBvZiB0aGlzIHdpZGdldAorICAgICAgICBpbiBpdHMgcGFja2luZyBvcmRlci4iIiIKKyAgICAgICAgcmV0dXJuIG1hcChzZWxmLl9uYW1ldG93aWRnZXQsCisgICAgICAgICAgICAgICBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICAgICAgICdwbGFjZScsICdzbGF2ZXMnLCBzZWxmLl93KSkpCisgICAgIyBHcmlkIG1ldGhvZHMgdGhhdCBhcHBseSB0byB0aGUgbWFzdGVyCisgICAgZGVmIGdyaWRfYmJveChzZWxmLCBjb2x1bW49Tm9uZSwgcm93PU5vbmUsIGNvbDI9Tm9uZSwgcm93Mj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgb2YgaW50ZWdlciBjb29yZGluYXRlcyBmb3IgdGhlIGJvdW5kaW5nCisgICAgICAgIGJveCBvZiB0aGlzIHdpZGdldCBjb250cm9sbGVkIGJ5IHRoZSBnZW9tZXRyeSBtYW5hZ2VyIGdyaWQuCisKKyAgICAgICAgSWYgQ09MVU1OLCBST1cgaXMgZ2l2ZW4gdGhlIGJvdW5kaW5nIGJveCBhcHBsaWVzIGZyb20KKyAgICAgICAgdGhlIGNlbGwgd2l0aCByb3cgYW5kIGNvbHVtbiAwIHRvIHRoZSBzcGVjaWZpZWQKKyAgICAgICAgY2VsbC4gSWYgQ09MMiBhbmQgUk9XMiBhcmUgZ2l2ZW4gdGhlIGJvdW5kaW5nIGJveAorICAgICAgICBzdGFydHMgYXQgdGhhdCBjZWxsLgorCisgICAgICAgIFRoZSByZXR1cm5lZCBpbnRlZ2VycyBzcGVjaWZ5IHRoZSBvZmZzZXQgb2YgdGhlIHVwcGVyIGxlZnQKKyAgICAgICAgY29ybmVyIGluIHRoZSBtYXN0ZXIgd2lkZ2V0IGFuZCB0aGUgd2lkdGggYW5kIGhlaWdodC4KKyAgICAgICAgIiIiCisgICAgICAgIGFyZ3MgPSAoJ2dyaWQnLCAnYmJveCcsIHNlbGYuX3cpCisgICAgICAgIGlmIGNvbHVtbiBpcyBub3QgTm9uZSBhbmQgcm93IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncyA9IGFyZ3MgKyAoY29sdW1uLCByb3cpCisgICAgICAgIGlmIGNvbDIgaXMgbm90IE5vbmUgYW5kIHJvdzIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzID0gYXJncyArIChjb2wyLCByb3cyKQorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoKmFyZ3MpKSBvciBOb25lCisKKyAgICBiYm94ID0gZ3JpZF9iYm94CisgICAgZGVmIF9ncmlkX2NvbmZpZ3VyZShzZWxmLCBjb21tYW5kLCBpbmRleCwgY25mLCBrdyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBpZiB0eXBlKGNuZikgaXMgU3RyaW5nVHlwZSBhbmQgbm90IGt3OgorICAgICAgICAgICAgaWYgY25mWy0xOl0gPT0gJ18nOgorICAgICAgICAgICAgICAgIGNuZiA9IGNuZls6LTFdCisgICAgICAgICAgICBpZiBjbmZbOjFdICE9ICctJzoKKyAgICAgICAgICAgICAgICBjbmYgPSAnLScrY25mCisgICAgICAgICAgICBvcHRpb25zID0gKGNuZiwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHRpb25zID0gc2VsZi5fb3B0aW9ucyhjbmYsIGt3KQorICAgICAgICBpZiBub3Qgb3B0aW9uczoKKyAgICAgICAgICAgIHJlcyA9IHNlbGYudGsuY2FsbCgnZ3JpZCcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQsIHNlbGYuX3csIGluZGV4KQorICAgICAgICAgICAgd29yZHMgPSBzZWxmLnRrLnNwbGl0bGlzdChyZXMpCisgICAgICAgICAgICBkaWN0ID0ge30KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgorICAgICAgICAgICAgICAgIGtleSA9IHdvcmRzW2ldWzE6XQorICAgICAgICAgICAgICAgIHZhbHVlID0gd29yZHNbaSsxXQorICAgICAgICAgICAgICAgIGlmIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBOb25lCisgICAgICAgICAgICAgICAgZWxpZiAnLicgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0ZG91YmxlKHZhbHVlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0aW50KHZhbHVlKQorICAgICAgICAgICAgICAgIGRpY3Rba2V5XSA9IHZhbHVlCisgICAgICAgICAgICByZXR1cm4gZGljdAorICAgICAgICByZXMgPSBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgICAoJ2dyaWQnLCBjb21tYW5kLCBzZWxmLl93LCBpbmRleCkKKyAgICAgICAgICAgICAgICAgICsgb3B0aW9ucykKKyAgICAgICAgaWYgbGVuKG9wdGlvbnMpID09IDE6CisgICAgICAgICAgICBpZiBub3QgcmVzOiByZXR1cm4gTm9uZQorICAgICAgICAgICAgIyBJbiBUayA3LjUsIC13aWR0aCBjYW4gYmUgYSBmbG9hdAorICAgICAgICAgICAgaWYgJy4nIGluIHJlczogcmV0dXJuIGdldGRvdWJsZShyZXMpCisgICAgICAgICAgICByZXR1cm4gZ2V0aW50KHJlcykKKyAgICBkZWYgZ3JpZF9jb2x1bW5jb25maWd1cmUoc2VsZiwgaW5kZXgsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBjb2x1bW4gSU5ERVggb2YgYSBncmlkLgorCisgICAgICAgIFZhbGlkIHJlc291cmNlcyBhcmUgbWluc2l6ZSAobWluaW11bSBzaXplIG9mIHRoZSBjb2x1bW4pLAorICAgICAgICB3ZWlnaHQgKGhvdyBtdWNoIGRvZXMgYWRkaXRpb25hbCBzcGFjZSBwcm9wYWdhdGUgdG8gdGhpcyBjb2x1bW4pCisgICAgICAgIGFuZCBwYWQgKGhvdyBtdWNoIHNwYWNlIHRvIGxldCBhZGRpdGlvbmFsbHkpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ3JpZF9jb25maWd1cmUoJ2NvbHVtbmNvbmZpZ3VyZScsIGluZGV4LCBjbmYsIGt3KQorICAgIGNvbHVtbmNvbmZpZ3VyZSA9IGdyaWRfY29sdW1uY29uZmlndXJlCisgICAgZGVmIGdyaWRfbG9jYXRpb24oc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIG9mIGNvbHVtbiBhbmQgcm93IHdoaWNoIGlkZW50aWZ5IHRoZSBjZWxsCisgICAgICAgIGF0IHdoaWNoIHRoZSBwaXhlbCBhdCBwb3NpdGlvbiBYIGFuZCBZIGluc2lkZSB0aGUgbWFzdGVyCisgICAgICAgIHdpZGdldCBpcyBsb2NhdGVkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgICAnZ3JpZCcsICdsb2NhdGlvbicsIHNlbGYuX3csIHgsIHkpKSBvciBOb25lCisgICAgZGVmIGdyaWRfcHJvcGFnYXRlKHNlbGYsIGZsYWc9X25vYXJnXyk6CisgICAgICAgICIiIlNldCBvciBnZXQgdGhlIHN0YXR1cyBmb3IgcHJvcGFnYXRpb24gb2YgZ2VvbWV0cnkgaW5mb3JtYXRpb24uCisKKyAgICAgICAgQSBib29sZWFuIGFyZ3VtZW50IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBnZW9tZXRyeSBpbmZvcm1hdGlvbgorICAgICAgICBvZiB0aGUgc2xhdmVzIHdpbGwgZGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoaXMgd2lkZ2V0LiBJZiBubyBhcmd1bWVudAorICAgICAgICBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgc2V0dGluZyB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZmxhZyBpcyBNaXNjLl9ub2FyZ186CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0Ym9vbGVhbihzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgJ2dyaWQnLCAncHJvcGFnYXRlJywgc2VsZi5fdykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ2dyaWQnLCAncHJvcGFnYXRlJywgc2VsZi5fdywgZmxhZykKKyAgICBkZWYgZ3JpZF9yb3djb25maWd1cmUoc2VsZiwgaW5kZXgsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSByb3cgSU5ERVggb2YgYSBncmlkLgorCisgICAgICAgIFZhbGlkIHJlc291cmNlcyBhcmUgbWluc2l6ZSAobWluaW11bSBzaXplIG9mIHRoZSByb3cpLAorICAgICAgICB3ZWlnaHQgKGhvdyBtdWNoIGRvZXMgYWRkaXRpb25hbCBzcGFjZSBwcm9wYWdhdGUgdG8gdGhpcyByb3cpCisgICAgICAgIGFuZCBwYWQgKGhvdyBtdWNoIHNwYWNlIHRvIGxldCBhZGRpdGlvbmFsbHkpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ3JpZF9jb25maWd1cmUoJ3Jvd2NvbmZpZ3VyZScsIGluZGV4LCBjbmYsIGt3KQorICAgIHJvd2NvbmZpZ3VyZSA9IGdyaWRfcm93Y29uZmlndXJlCisgICAgZGVmIGdyaWRfc2l6ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgb2YgdGhlIG51bWJlciBvZiBjb2x1bW4gYW5kIHJvd3MgaW4gdGhlIGdyaWQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdncmlkJywgJ3NpemUnLCBzZWxmLl93KSkgb3IgTm9uZQorICAgIHNpemUgPSBncmlkX3NpemUKKyAgICBkZWYgZ3JpZF9zbGF2ZXMoc2VsZiwgcm93PU5vbmUsIGNvbHVtbj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgc2xhdmVzIG9mIHRoaXMgd2lkZ2V0CisgICAgICAgIGluIGl0cyBwYWNraW5nIG9yZGVyLiIiIgorICAgICAgICBhcmdzID0gKCkKKyAgICAgICAgaWYgcm93IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJncyA9IGFyZ3MgKyAoJy1yb3cnLCByb3cpCisgICAgICAgIGlmIGNvbHVtbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzICsgKCctY29sdW1uJywgY29sdW1uKQorICAgICAgICByZXR1cm4gbWFwKHNlbGYuX25hbWV0b3dpZGdldCwKKyAgICAgICAgICAgICAgIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgICAgICAoJ2dyaWQnLCAnc2xhdmVzJywgc2VsZi5fdykgKyBhcmdzKSkpCisKKyAgICAjIFN1cHBvcnQgZm9yIHRoZSAiZXZlbnQiIGNvbW1hbmQsIG5ldyBpbiBUayA0LjIuCisgICAgIyBCeSBDYXNlIFJvb2xlLgorCisgICAgZGVmIGV2ZW50X2FkZChzZWxmLCB2aXJ0dWFsLCAqc2VxdWVuY2VzKToKKyAgICAgICAgIiIiQmluZCBhIHZpcnR1YWwgZXZlbnQgVklSVFVBTCAob2YgdGhlIGZvcm0gPDxOYW1lPj4pCisgICAgICAgIHRvIGFuIGV2ZW50IFNFUVVFTkNFIHN1Y2ggdGhhdCB0aGUgdmlydHVhbCBldmVudCBpcyB0cmlnZ2VyZWQKKyAgICAgICAgd2hlbmV2ZXIgU0VRVUVOQ0Ugb2NjdXJzLiIiIgorICAgICAgICBhcmdzID0gKCdldmVudCcsICdhZGQnLCB2aXJ0dWFsKSArIHNlcXVlbmNlcworICAgICAgICBzZWxmLnRrLmNhbGwoYXJncykKKworICAgIGRlZiBldmVudF9kZWxldGUoc2VsZiwgdmlydHVhbCwgKnNlcXVlbmNlcyk6CisgICAgICAgICIiIlVuYmluZCBhIHZpcnR1YWwgZXZlbnQgVklSVFVBTCBmcm9tIFNFUVVFTkNFLiIiIgorICAgICAgICBhcmdzID0gKCdldmVudCcsICdkZWxldGUnLCB2aXJ0dWFsKSArIHNlcXVlbmNlcworICAgICAgICBzZWxmLnRrLmNhbGwoYXJncykKKworICAgIGRlZiBldmVudF9nZW5lcmF0ZShzZWxmLCBzZXF1ZW5jZSwgKiprdyk6CisgICAgICAgICIiIkdlbmVyYXRlIGFuIGV2ZW50IFNFUVVFTkNFLiBBZGRpdGlvbmFsCisgICAgICAgIGtleXdvcmQgYXJndW1lbnRzIHNwZWNpZnkgcGFyYW1ldGVyIG9mIHRoZSBldmVudAorICAgICAgICAoZS5nLiB4LCB5LCByb290eCwgcm9vdHkpLiIiIgorICAgICAgICBhcmdzID0gKCdldmVudCcsICdnZW5lcmF0ZScsIHNlbGYuX3csIHNlcXVlbmNlKQorICAgICAgICBmb3IgaywgdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgYXJncyA9IGFyZ3MgKyAoJy0lcycgJSBrLCBzdHIodikpCisgICAgICAgIHNlbGYudGsuY2FsbChhcmdzKQorCisgICAgZGVmIGV2ZW50X2luZm8oc2VsZiwgdmlydHVhbD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdmlydHVhbCBldmVudHMgb3IgdGhlIGluZm9ybWF0aW9uCisgICAgICAgIGFib3V0IHRoZSBTRVFVRU5DRSBib3VuZCB0byB0aGUgdmlydHVhbCBldmVudCBWSVJUVUFMLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ2V2ZW50JywgJ2luZm8nLCB2aXJ0dWFsKSkKKworICAgICMgSW1hZ2UgcmVsYXRlZCBjb21tYW5kcworCisgICAgZGVmIGltYWdlX25hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBleGlzdGluZyBpbWFnZSBuYW1lcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnaW1hZ2UnLCAnbmFtZXMnKQorCisgICAgZGVmIGltYWdlX3R5cGVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBhdmFpbGFibGUgaW1hZ2UgdHlwZXMgKGUuZy4gcGhvdGUgYml0bWFwKS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnaW1hZ2UnLCAndHlwZXMnKQorCisKK2NsYXNzIENhbGxXcmFwcGVyOgorICAgICIiIkludGVybmFsIGNsYXNzLiBTdG9yZXMgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHNvbWUgdXNlcgorICAgIGRlZmluZWQgVGNsIGZ1bmN0aW9uIGlzIGNhbGxlZCBlLmcuIGFmdGVyIGFuIGV2ZW50IG9jY3VycmVkLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jLCBzdWJzdCwgd2lkZ2V0KToKKyAgICAgICAgIiIiU3RvcmUgRlVOQywgU1VCU1QgYW5kIFdJREdFVCBhcyBtZW1iZXJzLiIiIgorICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCisgICAgICAgIHNlbGYuc3Vic3QgPSBzdWJzdAorICAgICAgICBzZWxmLndpZGdldCA9IHdpZGdldAorICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkFwcGx5IGZpcnN0IGZ1bmN0aW9uIFNVQlNUIHRvIGFyZ3VtZW50cywgdGhhbiBGVU5DLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLnN1YnN0OgorICAgICAgICAgICAgICAgIGFyZ3MgPSBzZWxmLnN1YnN0KCphcmdzKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZnVuYygqYXJncykKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQsIG1zZworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLndpZGdldC5fcmVwb3J0X2V4Y2VwdGlvbigpCisKKworY2xhc3MgWFZpZXc6CisgICAgIiIiTWl4LWluIGNsYXNzIGZvciBxdWVyeWluZyBhbmQgY2hhbmdpbmcgdGhlIGhvcml6b250YWwgcG9zaXRpb24KKyAgICBvZiBhIHdpZGdldCdzIHdpbmRvdy4iIiIKKworICAgIGRlZiB4dmlldyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlF1ZXJ5IGFuZCBjaGFuZ2UgdGhlIGhvcml6b250YWwgcG9zaXRpb24gb2YgdGhlIHZpZXcuIiIiCisgICAgICAgIHJlcyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAneHZpZXcnLCAqYXJncykKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0ZG91YmxlcyhyZXMpCisKKyAgICBkZWYgeHZpZXdfbW92ZXRvKHNlbGYsIGZyYWN0aW9uKToKKyAgICAgICAgIiIiQWRqdXN0cyB0aGUgdmlldyBpbiB0aGUgd2luZG93IHNvIHRoYXQgRlJBQ1RJT04gb2YgdGhlCisgICAgICAgIHRvdGFsIHdpZHRoIG9mIHRoZSBjYW52YXMgaXMgb2ZmLXNjcmVlbiB0byB0aGUgbGVmdC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd4dmlldycsICdtb3ZldG8nLCBmcmFjdGlvbikKKworICAgIGRlZiB4dmlld19zY3JvbGwoc2VsZiwgbnVtYmVyLCB3aGF0KToKKyAgICAgICAgIiIiU2hpZnQgdGhlIHgtdmlldyBhY2NvcmRpbmcgdG8gTlVNQkVSIHdoaWNoIGlzIG1lYXN1cmVkIGluICJ1bml0cyIKKyAgICAgICAgb3IgInBhZ2VzIiAoV0hBVCkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAneHZpZXcnLCAnc2Nyb2xsJywgbnVtYmVyLCB3aGF0KQorCisKK2NsYXNzIFlWaWV3OgorICAgICIiIk1peC1pbiBjbGFzcyBmb3IgcXVlcnlpbmcgYW5kIGNoYW5naW5nIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbgorICAgIG9mIGEgd2lkZ2V0J3Mgd2luZG93LiIiIgorCisgICAgZGVmIHl2aWV3KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUXVlcnkgYW5kIGNoYW5nZSB0aGUgdmVydGljYWwgcG9zaXRpb24gb2YgdGhlIHZpZXcuIiIiCisgICAgICAgIHJlcyA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAneXZpZXcnLCAqYXJncykKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0ZG91YmxlcyhyZXMpCisKKyAgICBkZWYgeXZpZXdfbW92ZXRvKHNlbGYsIGZyYWN0aW9uKToKKyAgICAgICAgIiIiQWRqdXN0cyB0aGUgdmlldyBpbiB0aGUgd2luZG93IHNvIHRoYXQgRlJBQ1RJT04gb2YgdGhlCisgICAgICAgIHRvdGFsIGhlaWdodCBvZiB0aGUgY2FudmFzIGlzIG9mZi1zY3JlZW4gdG8gdGhlIHRvcC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd5dmlldycsICdtb3ZldG8nLCBmcmFjdGlvbikKKworICAgIGRlZiB5dmlld19zY3JvbGwoc2VsZiwgbnVtYmVyLCB3aGF0KToKKyAgICAgICAgIiIiU2hpZnQgdGhlIHktdmlldyBhY2NvcmRpbmcgdG8gTlVNQkVSIHdoaWNoIGlzIG1lYXN1cmVkIGluCisgICAgICAgICJ1bml0cyIgb3IgInBhZ2VzIiAoV0hBVCkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAneXZpZXcnLCAnc2Nyb2xsJywgbnVtYmVyLCB3aGF0KQorCisKK2NsYXNzIFdtOgorICAgICIiIlByb3ZpZGVzIGZ1bmN0aW9ucyBmb3IgdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUgd2luZG93IG1hbmFnZXIuIiIiCisKKyAgICBkZWYgd21fYXNwZWN0KHNlbGYsCisgICAgICAgICAgICAgIG1pbk51bWVyPU5vbmUsIG1pbkRlbm9tPU5vbmUsCisgICAgICAgICAgICAgIG1heE51bWVyPU5vbmUsIG1heERlbm9tPU5vbmUpOgorICAgICAgICAiIiJJbnN0cnVjdCB0aGUgd2luZG93IG1hbmFnZXIgdG8gc2V0IHRoZSBhc3BlY3QgcmF0aW8gKHdpZHRoL2hlaWdodCkKKyAgICAgICAgb2YgdGhpcyB3aWRnZXQgdG8gYmUgYmV0d2VlbiBNSU5OVU1FUi9NSU5ERU5PTSBhbmQgTUFYTlVNRVIvTUFYREVOT00uIFJldHVybiBhIHR1cGxlCisgICAgICAgIG9mIHRoZSBhY3R1YWwgdmFsdWVzIGlmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnd20nLCAnYXNwZWN0Jywgc2VsZi5fdywKKyAgICAgICAgICAgICAgICAgICAgIG1pbk51bWVyLCBtaW5EZW5vbSwKKyAgICAgICAgICAgICAgICAgICAgIG1heE51bWVyLCBtYXhEZW5vbSkpCisgICAgYXNwZWN0ID0gd21fYXNwZWN0CisKKyAgICBkZWYgd21fYXR0cmlidXRlcyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlRoaXMgc3ViY29tbWFuZCByZXR1cm5zIG9yIHNldHMgcGxhdGZvcm0gc3BlY2lmaWMgYXR0cmlidXRlcworCisgICAgICAgIFRoZSBmaXJzdCBmb3JtIHJldHVybnMgYSBsaXN0IG9mIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyBmbGFncyBhbmQKKyAgICAgICAgdGhlaXIgdmFsdWVzLiBUaGUgc2Vjb25kIGZvcm0gcmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBzcGVjaWZpYworICAgICAgICBvcHRpb24uIFRoZSB0aGlyZCBmb3JtIHNldHMgb25lIG9yIG1vcmUgb2YgdGhlIHZhbHVlcy4gVGhlIHZhbHVlcworICAgICAgICBhcmUgYXMgZm9sbG93czoKKworICAgICAgICBPbiBXaW5kb3dzLCAtZGlzYWJsZWQgZ2V0cyBvciBzZXRzIHdoZXRoZXIgdGhlIHdpbmRvdyBpcyBpbiBhCisgICAgICAgIGRpc2FibGVkIHN0YXRlLiAtdG9vbHdpbmRvdyBnZXRzIG9yIHNldHMgdGhlIHN0eWxlIG9mIHRoZSB3aW5kb3cKKyAgICAgICAgdG8gdG9vbHdpbmRvdyAoYXMgZGVmaW5lZCBpbiB0aGUgTVNETikuIC10b3Btb3N0IGdldHMgb3Igc2V0cworICAgICAgICB3aGV0aGVyIHRoaXMgaXMgYSB0b3Btb3N0IHdpbmRvdyAoZGlzcGxheXMgYWJvdmUgYWxsIG90aGVyCisgICAgICAgIHdpbmRvd3MpLgorCisgICAgICAgIE9uIE1hY2ludG9zaCwgWFhYWFgKKworICAgICAgICBPbiBVbml4LCB0aGVyZSBhcmUgY3VycmVudGx5IG5vIHNwZWNpYWwgYXR0cmlidXRlIHZhbHVlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGFyZ3MgPSAoJ3dtJywgJ2F0dHJpYnV0ZXMnLCBzZWxmLl93KSArIGFyZ3MKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChhcmdzKQorICAgIGF0dHJpYnV0ZXM9d21fYXR0cmlidXRlcworCisgICAgZGVmIHdtX2NsaWVudChzZWxmLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJTdG9yZSBOQU1FIGluIFdNX0NMSUVOVF9NQUNISU5FIHByb3BlcnR5IG9mIHRoaXMgd2lkZ2V0LiBSZXR1cm4KKyAgICAgICAgY3VycmVudCB2YWx1ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnY2xpZW50Jywgc2VsZi5fdywgbmFtZSkKKyAgICBjbGllbnQgPSB3bV9jbGllbnQKKyAgICBkZWYgd21fY29sb3JtYXB3aW5kb3dzKHNlbGYsICp3bGlzdCk6CisgICAgICAgICIiIlN0b3JlIGxpc3Qgb2Ygd2luZG93IG5hbWVzIChXTElTVCkgaW50byBXTV9DT0xPUk1BUFdJTkRPV1MgcHJvcGVydHkKKyAgICAgICAgb2YgdGhpcyB3aWRnZXQuIFRoaXMgbGlzdCBjb250YWlucyB3aW5kb3dzIHdob3NlIGNvbG9ybWFwcyBkaWZmZXIgZnJvbSB0aGVpcgorICAgICAgICBwYXJlbnRzLiBSZXR1cm4gY3VycmVudCBsaXN0IG9mIHdpZGdldHMgaWYgV0xJU1QgaXMgZW1wdHkuIiIiCisgICAgICAgIGlmIGxlbih3bGlzdCkgPiAxOgorICAgICAgICAgICAgd2xpc3QgPSAod2xpc3QsKSAjIFRrIG5lZWRzIGEgbGlzdCBvZiB3aW5kb3dzIGhlcmUKKyAgICAgICAgYXJncyA9ICgnd20nLCAnY29sb3JtYXB3aW5kb3dzJywgc2VsZi5fdykgKyB3bGlzdAorICAgICAgICByZXR1cm4gbWFwKHNlbGYuX25hbWV0b3dpZGdldCwgc2VsZi50ay5jYWxsKGFyZ3MpKQorICAgIGNvbG9ybWFwd2luZG93cyA9IHdtX2NvbG9ybWFwd2luZG93cworICAgIGRlZiB3bV9jb21tYW5kKHNlbGYsIHZhbHVlPU5vbmUpOgorICAgICAgICAiIiJTdG9yZSBWQUxVRSBpbiBXTV9DT01NQU5EIHByb3BlcnR5LiBJdCBpcyB0aGUgY29tbWFuZAorICAgICAgICB3aGljaCBzaGFsbCBiZSB1c2VkIHRvIGludm9rZSB0aGUgYXBwbGljYXRpb24uIFJldHVybiBjdXJyZW50CisgICAgICAgIGNvbW1hbmQgaWYgVkFMVUUgaXMgTm9uZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnY29tbWFuZCcsIHNlbGYuX3csIHZhbHVlKQorICAgIGNvbW1hbmQgPSB3bV9jb21tYW5kCisgICAgZGVmIHdtX2RlaWNvbmlmeShzZWxmKToKKyAgICAgICAgIiIiRGVpY29uaWZ5IHRoaXMgd2lkZ2V0LiBJZiBpdCB3YXMgbmV2ZXIgbWFwcGVkIGl0IHdpbGwgbm90IGJlIG1hcHBlZC4KKyAgICAgICAgT24gV2luZG93cyBpdCB3aWxsIHJhaXNlIHRoaXMgd2lkZ2V0IGFuZCBnaXZlIGl0IHRoZSBmb2N1cy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnZGVpY29uaWZ5Jywgc2VsZi5fdykKKyAgICBkZWljb25pZnkgPSB3bV9kZWljb25pZnkKKyAgICBkZWYgd21fZm9jdXNtb2RlbChzZWxmLCBtb2RlbD1Ob25lKToKKyAgICAgICAgIiIiU2V0IGZvY3VzIG1vZGVsIHRvIE1PREVMLiAiYWN0aXZlIiBtZWFucyB0aGF0IHRoaXMgd2lkZ2V0IHdpbGwgY2xhaW0KKyAgICAgICAgdGhlIGZvY3VzIGl0c2VsZiwgInBhc3NpdmUiIG1lYW5zIHRoYXQgdGhlIHdpbmRvdyBtYW5hZ2VyIHNoYWxsIGdpdmUKKyAgICAgICAgdGhlIGZvY3VzLiBSZXR1cm4gY3VycmVudCBmb2N1cyBtb2RlbCBpZiBNT0RFTCBpcyBOb25lLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdmb2N1c21vZGVsJywgc2VsZi5fdywgbW9kZWwpCisgICAgZm9jdXNtb2RlbCA9IHdtX2ZvY3VzbW9kZWwKKyAgICBkZWYgd21fZnJhbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBpZGVudGlmaWVyIGZvciBkZWNvcmF0aXZlIGZyYW1lIG9mIHRoaXMgd2lkZ2V0IGlmIHByZXNlbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ZyYW1lJywgc2VsZi5fdykKKyAgICBmcmFtZSA9IHdtX2ZyYW1lCisgICAgZGVmIHdtX2dlb21ldHJ5KHNlbGYsIG5ld0dlb21ldHJ5PU5vbmUpOgorICAgICAgICAiIiJTZXQgZ2VvbWV0cnkgdG8gTkVXR0VPTUVUUlkgb2YgdGhlIGZvcm0gPXdpZHRoeGhlaWdodCt4K3kuIFJldHVybgorICAgICAgICBjdXJyZW50IHZhbHVlIGlmIE5vbmUgaXMgZ2l2ZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2dlb21ldHJ5Jywgc2VsZi5fdywgbmV3R2VvbWV0cnkpCisgICAgZ2VvbWV0cnkgPSB3bV9nZW9tZXRyeQorICAgIGRlZiB3bV9ncmlkKHNlbGYsCisgICAgICAgICBiYXNlV2lkdGg9Tm9uZSwgYmFzZUhlaWdodD1Ob25lLAorICAgICAgICAgd2lkdGhJbmM9Tm9uZSwgaGVpZ2h0SW5jPU5vbmUpOgorICAgICAgICAiIiJJbnN0cnVjdCB0aGUgd2luZG93IG1hbmFnZXIgdGhhdCB0aGlzIHdpZGdldCBzaGFsbCBvbmx5IGJlCisgICAgICAgIHJlc2l6ZWQgb24gZ3JpZCBib3VuZGFyaWVzLiBXSURUSElOQyBhbmQgSEVJR0hUSU5DIGFyZSB0aGUgd2lkdGggYW5kCisgICAgICAgIGhlaWdodCBvZiBhIGdyaWQgdW5pdCBpbiBwaXhlbHMuIEJBU0VXSURUSCBhbmQgQkFTRUhFSUdIVCBhcmUgdGhlCisgICAgICAgIG51bWJlciBvZiBncmlkIHVuaXRzIHJlcXVlc3RlZCBpbiBUa19HZW9tZXRyeVJlcXVlc3QuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICd3bScsICdncmlkJywgc2VsZi5fdywKKyAgICAgICAgICAgIGJhc2VXaWR0aCwgYmFzZUhlaWdodCwgd2lkdGhJbmMsIGhlaWdodEluYykpCisgICAgZ3JpZCA9IHdtX2dyaWQKKyAgICBkZWYgd21fZ3JvdXAoc2VsZiwgcGF0aE5hbWU9Tm9uZSk6CisgICAgICAgICIiIlNldCB0aGUgZ3JvdXAgbGVhZGVyIHdpZGdldHMgZm9yIHJlbGF0ZWQgd2lkZ2V0cyB0byBQQVRITkFNRS4gUmV0dXJuCisgICAgICAgIHRoZSBncm91cCBsZWFkZXIgb2YgdGhpcyB3aWRnZXQgaWYgTm9uZSBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnZ3JvdXAnLCBzZWxmLl93LCBwYXRoTmFtZSkKKyAgICBncm91cCA9IHdtX2dyb3VwCisgICAgZGVmIHdtX2ljb25iaXRtYXAoc2VsZiwgYml0bWFwPU5vbmUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIlNldCBiaXRtYXAgZm9yIHRoZSBpY29uaWZpZWQgd2lkZ2V0IHRvIEJJVE1BUC4gUmV0dXJuCisgICAgICAgIHRoZSBiaXRtYXAgaWYgTm9uZSBpcyBnaXZlbi4KKworICAgICAgICBVbmRlciBXaW5kb3dzLCB0aGUgREVGQVVMVCBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpY29uCisgICAgICAgIGZvciB0aGUgd2lkZ2V0IGFuZCBhbnkgZGVzY2VuZGVudHMgdGhhdCBkb24ndCBoYXZlIGFuIGljb24gc2V0CisgICAgICAgIGV4cGxpY2l0bHkuICBERUZBVUxUIGNhbiBiZSB0aGUgcmVsYXRpdmUgcGF0aCB0byBhIC5pY28gZmlsZQorICAgICAgICAoZXhhbXBsZTogcm9vdC5pY29uYml0bWFwKGRlZmF1bHQ9J215aWNvbi5pY28nKSApLiAgU2VlIFRrCisgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24uIiIiCisgICAgICAgIGlmIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdpY29uYml0bWFwJywgc2VsZi5fdywgJy1kZWZhdWx0JywgZGVmYXVsdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25iaXRtYXAnLCBzZWxmLl93LCBiaXRtYXApCisgICAgaWNvbmJpdG1hcCA9IHdtX2ljb25iaXRtYXAKKyAgICBkZWYgd21faWNvbmlmeShzZWxmKToKKyAgICAgICAgIiIiRGlzcGxheSB3aWRnZXQgYXMgaWNvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnaWNvbmlmeScsIHNlbGYuX3cpCisgICAgaWNvbmlmeSA9IHdtX2ljb25pZnkKKyAgICBkZWYgd21faWNvbm1hc2soc2VsZiwgYml0bWFwPU5vbmUpOgorICAgICAgICAiIiJTZXQgbWFzayBmb3IgdGhlIGljb24gYml0bWFwIG9mIHRoaXMgd2lkZ2V0LiBSZXR1cm4gdGhlCisgICAgICAgIG1hc2sgaWYgTm9uZSBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnaWNvbm1hc2snLCBzZWxmLl93LCBiaXRtYXApCisgICAgaWNvbm1hc2sgPSB3bV9pY29ubWFzaworICAgIGRlZiB3bV9pY29ubmFtZShzZWxmLCBuZXdOYW1lPU5vbmUpOgorICAgICAgICAiIiJTZXQgdGhlIG5hbWUgb2YgdGhlIGljb24gZm9yIHRoaXMgd2lkZ2V0LiBSZXR1cm4gdGhlIG5hbWUgaWYKKyAgICAgICAgTm9uZSBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnaWNvbm5hbWUnLCBzZWxmLl93LCBuZXdOYW1lKQorICAgIGljb25uYW1lID0gd21faWNvbm5hbWUKKyAgICBkZWYgd21faWNvbnBvc2l0aW9uKHNlbGYsIHg9Tm9uZSwgeT1Ob25lKToKKyAgICAgICAgIiIiU2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgaWNvbiBvZiB0aGlzIHdpZGdldCB0byBYIGFuZCBZLiBSZXR1cm4KKyAgICAgICAgYSB0dXBsZSBvZiB0aGUgY3VycmVudCB2YWx1ZXMgb2YgWCBhbmQgWCBpZiBOb25lIGlzIGdpdmVuLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAnd20nLCAnaWNvbnBvc2l0aW9uJywgc2VsZi5fdywgeCwgeSkpCisgICAgaWNvbnBvc2l0aW9uID0gd21faWNvbnBvc2l0aW9uCisgICAgZGVmIHdtX2ljb253aW5kb3coc2VsZiwgcGF0aE5hbWU9Tm9uZSk6CisgICAgICAgICIiIlNldCB3aWRnZXQgUEFUSE5BTUUgdG8gYmUgZGlzcGxheWVkIGluc3RlYWQgb2YgaWNvbi4gUmV0dXJuIHRoZSBjdXJyZW50CisgICAgICAgIHZhbHVlIGlmIE5vbmUgaXMgZ2l2ZW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb253aW5kb3cnLCBzZWxmLl93LCBwYXRoTmFtZSkKKyAgICBpY29ud2luZG93ID0gd21faWNvbndpbmRvdworICAgIGRlZiB3bV9tYXhzaXplKHNlbGYsIHdpZHRoPU5vbmUsIGhlaWdodD1Ob25lKToKKyAgICAgICAgIiIiU2V0IG1heCBXSURUSCBhbmQgSEVJR0hUIGZvciB0aGlzIHdpZGdldC4gSWYgdGhlIHdpbmRvdyBpcyBncmlkZGVkCisgICAgICAgIHRoZSB2YWx1ZXMgYXJlIGdpdmVuIGluIGdyaWQgdW5pdHMuIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZXMgaWYgTm9uZQorICAgICAgICBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgJ3dtJywgJ21heHNpemUnLCBzZWxmLl93LCB3aWR0aCwgaGVpZ2h0KSkKKyAgICBtYXhzaXplID0gd21fbWF4c2l6ZQorICAgIGRlZiB3bV9taW5zaXplKHNlbGYsIHdpZHRoPU5vbmUsIGhlaWdodD1Ob25lKToKKyAgICAgICAgIiIiU2V0IG1pbiBXSURUSCBhbmQgSEVJR0hUIGZvciB0aGlzIHdpZGdldC4gSWYgdGhlIHdpbmRvdyBpcyBncmlkZGVkCisgICAgICAgIHRoZSB2YWx1ZXMgYXJlIGdpdmVuIGluIGdyaWQgdW5pdHMuIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZXMgaWYgTm9uZQorICAgICAgICBpcyBnaXZlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgJ3dtJywgJ21pbnNpemUnLCBzZWxmLl93LCB3aWR0aCwgaGVpZ2h0KSkKKyAgICBtaW5zaXplID0gd21fbWluc2l6ZQorICAgIGRlZiB3bV9vdmVycmlkZXJlZGlyZWN0KHNlbGYsIGJvb2xlYW49Tm9uZSk6CisgICAgICAgICIiIkluc3RydWN0IHRoZSB3aW5kb3cgbWFuYWdlciB0byBpZ25vcmUgdGhpcyB3aWRnZXQKKyAgICAgICAgaWYgQk9PTEVBTiBpcyBnaXZlbiB3aXRoIDEuIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpZiBOb25lCisgICAgICAgIGlzIGdpdmVuLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0Ym9vbGVhbihzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAnd20nLCAnb3ZlcnJpZGVyZWRpcmVjdCcsIHNlbGYuX3csIGJvb2xlYW4pKQorICAgIG92ZXJyaWRlcmVkaXJlY3QgPSB3bV9vdmVycmlkZXJlZGlyZWN0CisgICAgZGVmIHdtX3Bvc2l0aW9uZnJvbShzZWxmLCB3aG89Tm9uZSk6CisgICAgICAgICIiIkluc3RydWN0IHRoZSB3aW5kb3cgbWFuYWdlciB0aGF0IHRoZSBwb3NpdGlvbiBvZiB0aGlzIHdpZGdldCBzaGFsbAorICAgICAgICBiZSBkZWZpbmVkIGJ5IHRoZSB1c2VyIGlmIFdITyBpcyAidXNlciIsIGFuZCBieSBpdHMgb3duIHBvbGljeSBpZiBXSE8gaXMKKyAgICAgICAgInByb2dyYW0iLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdwb3NpdGlvbmZyb20nLCBzZWxmLl93LCB3aG8pCisgICAgcG9zaXRpb25mcm9tID0gd21fcG9zaXRpb25mcm9tCisgICAgZGVmIHdtX3Byb3RvY29sKHNlbGYsIG5hbWU9Tm9uZSwgZnVuYz1Ob25lKToKKyAgICAgICAgIiIiQmluZCBmdW5jdGlvbiBGVU5DIHRvIGNvbW1hbmQgTkFNRSBmb3IgdGhpcyB3aWRnZXQuCisgICAgICAgIFJldHVybiB0aGUgZnVuY3Rpb24gYm91bmQgdG8gTkFNRSBpZiBOb25lIGlzIGdpdmVuLiBOQU1FIGNvdWxkIGJlCisgICAgICAgIGUuZy4gIldNX1NBVkVfWU9VUlNFTEYiIG9yICJXTV9ERUxFVEVfV0lORE9XIi4iIiIKKyAgICAgICAgaWYgaGFzYXR0cihmdW5jLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIGNvbW1hbmQgPSBzZWxmLl9yZWdpc3RlcihmdW5jKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29tbWFuZCA9IGZ1bmMKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICd3bScsICdwcm90b2NvbCcsIHNlbGYuX3csIG5hbWUsIGNvbW1hbmQpCisgICAgcHJvdG9jb2wgPSB3bV9wcm90b2NvbAorICAgIGRlZiB3bV9yZXNpemFibGUoc2VsZiwgd2lkdGg9Tm9uZSwgaGVpZ2h0PU5vbmUpOgorICAgICAgICAiIiJJbnN0cnVjdCB0aGUgd2luZG93IG1hbmFnZXIgd2hldGhlciB0aGlzIHdpZHRoIGNhbiBiZSByZXNpemVkCisgICAgICAgIGluIFdJRFRIIG9yIEhFSUdIVC4gQm90aCB2YWx1ZXMgYXJlIGJvb2xlYW4gdmFsdWVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdyZXNpemFibGUnLCBzZWxmLl93LCB3aWR0aCwgaGVpZ2h0KQorICAgIHJlc2l6YWJsZSA9IHdtX3Jlc2l6YWJsZQorICAgIGRlZiB3bV9zaXplZnJvbShzZWxmLCB3aG89Tm9uZSk6CisgICAgICAgICIiIkluc3RydWN0IHRoZSB3aW5kb3cgbWFuYWdlciB0aGF0IHRoZSBzaXplIG9mIHRoaXMgd2lkZ2V0IHNoYWxsCisgICAgICAgIGJlIGRlZmluZWQgYnkgdGhlIHVzZXIgaWYgV0hPIGlzICJ1c2VyIiwgYW5kIGJ5IGl0cyBvd24gcG9saWN5IGlmIFdITyBpcworICAgICAgICAicHJvZ3JhbSIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ3NpemVmcm9tJywgc2VsZi5fdywgd2hvKQorICAgIHNpemVmcm9tID0gd21fc2l6ZWZyb20KKyAgICBkZWYgd21fc3RhdGUoc2VsZiwgbmV3c3RhdGU9Tm9uZSk6CisgICAgICAgICIiIlF1ZXJ5IG9yIHNldCB0aGUgc3RhdGUgb2YgdGhpcyB3aWRnZXQgYXMgb25lIG9mIG5vcm1hbCwgaWNvbiwKKyAgICAgICAgaWNvbmljIChzZWUgd21faWNvbndpbmRvdyksIHdpdGhkcmF3biwgb3Igem9vbWVkIChXaW5kb3dzIG9ubHkpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdzdGF0ZScsIHNlbGYuX3csIG5ld3N0YXRlKQorICAgIHN0YXRlID0gd21fc3RhdGUKKyAgICBkZWYgd21fdGl0bGUoc2VsZiwgc3RyaW5nPU5vbmUpOgorICAgICAgICAiIiJTZXQgdGhlIHRpdGxlIG9mIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICd0aXRsZScsIHNlbGYuX3csIHN0cmluZykKKyAgICB0aXRsZSA9IHdtX3RpdGxlCisgICAgZGVmIHdtX3RyYW5zaWVudChzZWxmLCBtYXN0ZXI9Tm9uZSk6CisgICAgICAgICIiIkluc3RydWN0IHRoZSB3aW5kb3cgbWFuYWdlciB0aGF0IHRoaXMgd2lkZ2V0IGlzIHRyYW5zaWVudAorICAgICAgICB3aXRoIHJlZ2FyZCB0byB3aWRnZXQgTUFTVEVSLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICd0cmFuc2llbnQnLCBzZWxmLl93LCBtYXN0ZXIpCisgICAgdHJhbnNpZW50ID0gd21fdHJhbnNpZW50CisgICAgZGVmIHdtX3dpdGhkcmF3KHNlbGYpOgorICAgICAgICAiIiJXaXRoZHJhdyB0aGlzIHdpZGdldCBmcm9tIHRoZSBzY3JlZW4gc3VjaCB0aGF0IGl0IGlzIHVubWFwcGVkCisgICAgICAgIGFuZCBmb3Jnb3R0ZW4gYnkgdGhlIHdpbmRvdyBtYW5hZ2VyLiBSZS1kcmF3IGl0IHdpdGggd21fZGVpY29uaWZ5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICd3aXRoZHJhdycsIHNlbGYuX3cpCisgICAgd2l0aGRyYXcgPSB3bV93aXRoZHJhdworCisKK2NsYXNzIFRrKE1pc2MsIFdtKToKKyAgICAiIiJUb3BsZXZlbCB3aWRnZXQgb2YgVGsgd2hpY2ggcmVwcmVzZW50cyBtb3N0bHkgdGhlIG1haW4gd2luZG93CisgICAgb2YgYW4gYXBwbGljYXRpb24uIEl0IGhhcyBhbiBhc3NvY2lhdGVkIFRjbCBpbnRlcnByZXRlci4iIiIKKyAgICBfdyA9ICcuJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY3JlZW5OYW1lPU5vbmUsIGJhc2VOYW1lPU5vbmUsIGNsYXNzTmFtZT0nVGsnLAorICAgICAgICAgICAgICAgICB1c2VUaz0xLCBzeW5jPTAsIHVzZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbmV3IFRvcGxldmVsIHdpZGdldCBvbiBzY3JlZW4gU0NSRUVOTkFNRS4gQSBuZXcgVGNsIGludGVycHJldGVyIHdpbGwKKyAgICAgICAgYmUgY3JlYXRlZC4gQkFTRU5BTUUgd2lsbCBiZSB1c2VkIGZvciB0aGUgaWRlbnRpZmljYXRpb24gb2YgdGhlIHByb2ZpbGUgZmlsZSAoc2VlCisgICAgICAgIHJlYWRwcm9maWxlKS4KKyAgICAgICAgSXQgaXMgY29uc3RydWN0ZWQgZnJvbSBzeXMuYXJndlswXSB3aXRob3V0IGV4dGVuc2lvbnMgaWYgTm9uZSBpcyBnaXZlbi4gQ0xBU1NOQU1FCisgICAgICAgIGlzIHRoZSBuYW1lIG9mIHRoZSB3aWRnZXQgY2xhc3MuIiIiCisgICAgICAgIHNlbGYubWFzdGVyID0gTm9uZQorICAgICAgICBzZWxmLmNoaWxkcmVuID0ge30KKyAgICAgICAgc2VsZi5fdGtsb2FkZWQgPSAwCisgICAgICAgICMgdG8gYXZvaWQgcmVjdXJzaW9ucyBpbiB0aGUgZ2V0YXR0ciBjb2RlIGluIGNhc2Ugb2YgZmFpbHVyZSwgd2UKKyAgICAgICAgIyBlbnN1cmUgdGhhdCBzZWxmLnRrIGlzIGFsd2F5cyBfc29tZXRoaW5nXy4KKyAgICAgICAgc2VsZi50ayA9IE5vbmUKKyAgICAgICAgaWYgYmFzZU5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCBzeXMsIG9zCisgICAgICAgICAgICBiYXNlTmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgICAgICBiYXNlTmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlTmFtZSkKKyAgICAgICAgICAgIGlmIGV4dCBub3QgaW4gKCcucHknLCAnLnB5YycsICcucHlvJyk6CisgICAgICAgICAgICAgICAgYmFzZU5hbWUgPSBiYXNlTmFtZSArIGV4dAorICAgICAgICBpbnRlcmFjdGl2ZSA9IDAKKyAgICAgICAgc2VsZi50ayA9IF90a2ludGVyLmNyZWF0ZShzY3JlZW5OYW1lLCBiYXNlTmFtZSwgY2xhc3NOYW1lLCBpbnRlcmFjdGl2ZSwgd2FudG9iamVjdHMsIHVzZVRrLCBzeW5jLCB1c2UpCisgICAgICAgIGlmIHVzZVRrOgorICAgICAgICAgICAgc2VsZi5fbG9hZHRrKCkKKyAgICAgICAgaWYgbm90IHN5cy5mbGFncy5pZ25vcmVfZW52aXJvbm1lbnQ6CisgICAgICAgICAgICAjIElzc3VlICMxNjI0ODogSG9ub3IgdGhlIC1FIGZsYWcgdG8gYXZvaWQgY29kZSBpbmplY3Rpb24uCisgICAgICAgICAgICBzZWxmLnJlYWRwcm9maWxlKGJhc2VOYW1lLCBjbGFzc05hbWUpCisgICAgZGVmIGxvYWR0ayhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3RrbG9hZGVkOgorICAgICAgICAgICAgc2VsZi50ay5sb2FkdGsoKQorICAgICAgICAgICAgc2VsZi5fbG9hZHRrKCkKKyAgICBkZWYgX2xvYWR0ayhzZWxmKToKKyAgICAgICAgc2VsZi5fdGtsb2FkZWQgPSAxCisgICAgICAgIGdsb2JhbCBfZGVmYXVsdF9yb290CisgICAgICAgICMgVmVyc2lvbiBzYW5pdHkgY2hlY2tzCisgICAgICAgIHRrX3ZlcnNpb24gPSBzZWxmLnRrLmdldHZhcigndGtfdmVyc2lvbicpCisgICAgICAgIGlmIHRrX3ZlcnNpb24gIT0gX3RraW50ZXIuVEtfVkVSU0lPTjoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgInRrLmggdmVyc2lvbiAoJXMpIGRvZXNuJ3QgbWF0Y2ggbGlidGsuYSB2ZXJzaW9uICglcykiIFwKKyAgICAgICAgICAgICUgKF90a2ludGVyLlRLX1ZFUlNJT04sIHRrX3ZlcnNpb24pCisgICAgICAgICMgVW5kZXIgdW5rbm93biBjaXJjdW1zdGFuY2VzLCB0Y2xfdmVyc2lvbiBnZXRzIGNvZXJjZWQgdG8gZmxvYXQKKyAgICAgICAgdGNsX3ZlcnNpb24gPSBzdHIoc2VsZi50ay5nZXR2YXIoJ3RjbF92ZXJzaW9uJykpCisgICAgICAgIGlmIHRjbF92ZXJzaW9uICE9IF90a2ludGVyLlRDTF9WRVJTSU9OOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAidGNsLmggdmVyc2lvbiAoJXMpIGRvZXNuJ3QgbWF0Y2ggbGlidGNsLmEgdmVyc2lvbiAoJXMpIiBcCisgICAgICAgICAgICAlIChfdGtpbnRlci5UQ0xfVkVSU0lPTiwgdGNsX3ZlcnNpb24pCisgICAgICAgIGlmIFRrVmVyc2lvbiA8IDQuMDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgIlRrIDQuMCBvciBoaWdoZXIgaXMgcmVxdWlyZWQ7IGZvdW5kIFRrICVzIiBcCisgICAgICAgICAgICAlIHN0cihUa1ZlcnNpb24pCisgICAgICAgICMgQ3JlYXRlIGFuZCByZWdpc3RlciB0aGUgdGtlcnJvciBhbmQgZXhpdCBjb21tYW5kcworICAgICAgICAjIFdlIG5lZWQgdG8gaW5saW5lIHBhcnRzIG9mIF9yZWdpc3RlciBoZXJlLCBfIHJlZ2lzdGVyCisgICAgICAgICMgd291bGQgcmVnaXN0ZXIgZGlmZmVyZW50bHktbmFtZWQgY29tbWFuZHMuCisgICAgICAgIGlmIHNlbGYuX3RjbENvbW1hbmRzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcyA9IFtdCisgICAgICAgIHNlbGYudGsuY3JlYXRlY29tbWFuZCgndGtlcnJvcicsIF90a2Vycm9yKQorICAgICAgICBzZWxmLnRrLmNyZWF0ZWNvbW1hbmQoJ2V4aXQnLCBfZXhpdCkKKyAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMuYXBwZW5kKCd0a2Vycm9yJykKKyAgICAgICAgc2VsZi5fdGNsQ29tbWFuZHMuYXBwZW5kKCdleGl0JykKKyAgICAgICAgaWYgX3N1cHBvcnRfZGVmYXVsdF9yb290IGFuZCBub3QgX2RlZmF1bHRfcm9vdDoKKyAgICAgICAgICAgIF9kZWZhdWx0X3Jvb3QgPSBzZWxmCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmRlc3Ryb3kpCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICIiIkRlc3Ryb3kgdGhpcyBhbmQgYWxsIGRlc2NlbmRhbnRzIHdpZGdldHMuIFRoaXMgd2lsbAorICAgICAgICBlbmQgdGhlIGFwcGxpY2F0aW9uIG9mIHRoaXMgVGNsIGludGVycHJldGVyLiIiIgorICAgICAgICBmb3IgYyBpbiBzZWxmLmNoaWxkcmVuLnZhbHVlcygpOiBjLmRlc3Ryb3koKQorICAgICAgICBzZWxmLnRrLmNhbGwoJ2Rlc3Ryb3knLCBzZWxmLl93KQorICAgICAgICBNaXNjLmRlc3Ryb3koc2VsZikKKyAgICAgICAgZ2xvYmFsIF9kZWZhdWx0X3Jvb3QKKyAgICAgICAgaWYgX3N1cHBvcnRfZGVmYXVsdF9yb290IGFuZCBfZGVmYXVsdF9yb290IGlzIHNlbGY6CisgICAgICAgICAgICBfZGVmYXVsdF9yb290ID0gTm9uZQorICAgIGRlZiByZWFkcHJvZmlsZShzZWxmLCBiYXNlTmFtZSwgY2xhc3NOYW1lKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIEl0IHJlYWRzIEJBU0VOQU1FLnRjbCBhbmQgQ0xBU1NOQU1FLnRjbCBpbnRvCisgICAgICAgIHRoZSBUY2wgSW50ZXJwcmV0ZXIgYW5kIGNhbGxzIGV4ZWNmaWxlIG9uIEJBU0VOQU1FLnB5IGFuZCBDTEFTU05BTUUucHkgaWYKKyAgICAgICAgc3VjaCBhIGZpbGUgZXhpc3RzIGluIHRoZSBob21lIGRpcmVjdG9yeS4iIiIKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmICdIT01FJyBpbiBvcy5lbnZpcm9uOiBob21lID0gb3MuZW52aXJvblsnSE9NRSddCisgICAgICAgIGVsc2U6IGhvbWUgPSBvcy5jdXJkaXIKKyAgICAgICAgY2xhc3NfdGNsID0gb3MucGF0aC5qb2luKGhvbWUsICcuJXMudGNsJyAlIGNsYXNzTmFtZSkKKyAgICAgICAgY2xhc3NfcHkgPSBvcy5wYXRoLmpvaW4oaG9tZSwgJy4lcy5weScgJSBjbGFzc05hbWUpCisgICAgICAgIGJhc2VfdGNsID0gb3MucGF0aC5qb2luKGhvbWUsICcuJXMudGNsJyAlIGJhc2VOYW1lKQorICAgICAgICBiYXNlX3B5ID0gb3MucGF0aC5qb2luKGhvbWUsICcuJXMucHknICUgYmFzZU5hbWUpCisgICAgICAgIGRpciA9IHsnc2VsZic6IHNlbGZ9CisgICAgICAgIGV4ZWMgJ2Zyb20gVGtpbnRlciBpbXBvcnQgKicgaW4gZGlyCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNsYXNzX3RjbCk6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3NvdXJjZScsIGNsYXNzX3RjbCkKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY2xhc3NfcHkpOgorICAgICAgICAgICAgZXhlY2ZpbGUoY2xhc3NfcHksIGRpcikKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoYmFzZV90Y2wpOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdzb3VyY2UnLCBiYXNlX3RjbCkKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoYmFzZV9weSk6CisgICAgICAgICAgICBleGVjZmlsZShiYXNlX3B5LCBkaXIpCisgICAgZGVmIHJlcG9ydF9jYWxsYmFja19leGNlcHRpb24oc2VsZiwgZXhjLCB2YWwsIHRiKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIEl0IHJlcG9ydHMgZXhjZXB0aW9uIG9uIHN5cy5zdGRlcnIuIiIiCisgICAgICAgIGltcG9ydCB0cmFjZWJhY2ssIHN5cworICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFeGNlcHRpb24gaW4gVGtpbnRlciBjYWxsYmFja1xuIikKKyAgICAgICAgc3lzLmxhc3RfdHlwZSA9IGV4YworICAgICAgICBzeXMubGFzdF92YWx1ZSA9IHZhbAorICAgICAgICBzeXMubGFzdF90cmFjZWJhY2sgPSB0YgorICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKGV4YywgdmFsLCB0YikKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgICJEZWxlZ2F0ZSBhdHRyaWJ1dGUgYWNjZXNzIHRvIHRoZSBpbnRlcnByZXRlciBvYmplY3QiCisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYudGssIGF0dHIpCisKKyMgSWRlYWxseSwgdGhlIGNsYXNzZXMgUGFjaywgUGxhY2UgYW5kIEdyaWQgZGlzYXBwZWFyLCB0aGUKKyMgcGFjay9wbGFjZS9ncmlkIG1ldGhvZHMgYXJlIGRlZmluZWQgb24gdGhlIFdpZGdldCBjbGFzcywgYW5kCisjIGV2ZXJ5Ym9keSB1c2VzIHcucGFja193aGF0ZXZlciguLi4pIGluc3RlYWQgb2YgUGFjay53aGF0ZXZlcih3LAorIyAuLi4pLCB3aXRoIHBhY2soKSwgcGxhY2UoKSBhbmQgZ3JpZCgpIGJlaW5nIHNob3J0IGZvcgorIyBwYWNrX2NvbmZpZ3VyZSgpLCBwbGFjZV9jb25maWd1cmUoKSBhbmQgZ3JpZF9jb2x1bW5jb25maWd1cmUoKSwgYW5kCisjIGZvcmdldCgpIGJlaW5nIHNob3J0IGZvciBwYWNrX2ZvcmdldCgpLiAgQXMgYSBwcmFjdGljYWwgbWF0dGVyLCBJJ20KKyMgYWZyYWlkIHRoYXQgdGhlcmUgaXMgdG9vIG11Y2ggY29kZSBvdXQgdGhlcmUgdGhhdCBtYXkgYmUgdXNpbmcgdGhlCisjIFBhY2ssIFBsYWNlIG9yIEdyaWQgY2xhc3MsIHNvIEkgbGVhdmUgdGhlbSBpbnRhY3QgLS0gYnV0IG9ubHkgYXMKKyMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZmVhdHVyZXMuICBBbHNvIG5vdGUgdGhhdCB0aG9zZSBtZXRob2RzIHRoYXQKKyMgdGFrZSBhIG1hc3RlciBhcyBhcmd1bWVudCAoZS5nLiBwYWNrX3Byb3BhZ2F0ZSkgaGF2ZSBiZWVuIG1vdmVkIHRvCisjIHRoZSBNaXNjIGNsYXNzICh3aGljaCBub3cgaW5jb3Jwb3JhdGVzIGFsbCBtZXRob2RzIGNvbW1vbiBiZXR3ZWVuCisjIHRvcGxldmVsIGFuZCBpbnRlcmlvciB3aWRnZXRzKS4gIEFnYWluLCBmb3IgY29tcGF0aWJpbGl0eSwgdGhlc2UgYXJlCisjIGNvcGllZCBpbnRvIHRoZSBQYWNrLCBQbGFjZSBvciBHcmlkIGNsYXNzLgorCisKK2RlZiBUY2woc2NyZWVuTmFtZT1Ob25lLCBiYXNlTmFtZT1Ob25lLCBjbGFzc05hbWU9J1RrJywgdXNlVGs9MCk6CisgICAgcmV0dXJuIFRrKHNjcmVlbk5hbWUsIGJhc2VOYW1lLCBjbGFzc05hbWUsIHVzZVRrKQorCitjbGFzcyBQYWNrOgorICAgICIiIkdlb21ldHJ5IG1hbmFnZXIgUGFjay4KKworICAgIEJhc2UgY2xhc3MgdG8gdXNlIHRoZSBtZXRob2RzIHBhY2tfKiBpbiBldmVyeSB3aWRnZXQuIiIiCisgICAgZGVmIHBhY2tfY29uZmlndXJlKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIlBhY2sgYSB3aWRnZXQgaW4gdGhlIHBhcmVudCB3aWRnZXQuIFVzZSBhcyBvcHRpb25zOgorICAgICAgICBhZnRlcj13aWRnZXQgLSBwYWNrIGl0IGFmdGVyIHlvdSBoYXZlIHBhY2tlZCB3aWRnZXQKKyAgICAgICAgYW5jaG9yPU5TRVcgKG9yIHN1YnNldCkgLSBwb3NpdGlvbiB3aWRnZXQgYWNjb3JkaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gZGlyZWN0aW9uCisgICAgICAgIGJlZm9yZT13aWRnZXQgLSBwYWNrIGl0IGJlZm9yZSB5b3Ugd2lsbCBwYWNrIHdpZGdldAorICAgICAgICBleHBhbmQ9Ym9vbCAtIGV4cGFuZCB3aWRnZXQgaWYgcGFyZW50IHNpemUgZ3Jvd3MKKyAgICAgICAgZmlsbD1OT05FIG9yIFggb3IgWSBvciBCT1RIIC0gZmlsbCB3aWRnZXQgaWYgd2lkZ2V0IGdyb3dzCisgICAgICAgIGluPW1hc3RlciAtIHVzZSBtYXN0ZXIgdG8gY29udGFpbiB0aGlzIHdpZGdldAorICAgICAgICBpbl89bWFzdGVyIC0gc2VlICdpbicgb3B0aW9uIGRlc2NyaXB0aW9uCisgICAgICAgIGlwYWR4PWFtb3VudCAtIGFkZCBpbnRlcm5hbCBwYWRkaW5nIGluIHggZGlyZWN0aW9uCisgICAgICAgIGlwYWR5PWFtb3VudCAtIGFkZCBpbnRlcm5hbCBwYWRkaW5nIGluIHkgZGlyZWN0aW9uCisgICAgICAgIHBhZHg9YW1vdW50IC0gYWRkIHBhZGRpbmcgaW4geCBkaXJlY3Rpb24KKyAgICAgICAgcGFkeT1hbW91bnQgLSBhZGQgcGFkZGluZyBpbiB5IGRpcmVjdGlvbgorICAgICAgICBzaWRlPVRPUCBvciBCT1RUT00gb3IgTEVGVCBvciBSSUdIVCAtICB3aGVyZSB0byBhZGQgdGhpcyB3aWRnZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICgncGFjaycsICdjb25maWd1cmUnLCBzZWxmLl93KQorICAgICAgICAgICAgICArIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgcGFjayA9IGNvbmZpZ3VyZSA9IGNvbmZpZyA9IHBhY2tfY29uZmlndXJlCisgICAgZGVmIHBhY2tfZm9yZ2V0KHNlbGYpOgorICAgICAgICAiIiJVbm1hcCB0aGlzIHdpZGdldCBhbmQgZG8gbm90IHVzZSBpdCBmb3IgdGhlIHBhY2tpbmcgb3JkZXIuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgncGFjaycsICdmb3JnZXQnLCBzZWxmLl93KQorICAgIGZvcmdldCA9IHBhY2tfZm9yZ2V0CisgICAgZGVmIHBhY2tfaW5mbyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNraW5nIG9wdGlvbnMKKyAgICAgICAgZm9yIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICB3b3JkcyA9IHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdwYWNrJywgJ2luZm8nLCBzZWxmLl93KSkKKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgorICAgICAgICAgICAga2V5ID0gd29yZHNbaV1bMTpdCisgICAgICAgICAgICB2YWx1ZSA9IHdvcmRzW2krMV0KKyAgICAgICAgICAgIGlmIHZhbHVlWzoxXSA9PSAnLic6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9uYW1ldG93aWRnZXQodmFsdWUpCisgICAgICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gZGljdAorICAgIGluZm8gPSBwYWNrX2luZm8KKyAgICBwcm9wYWdhdGUgPSBwYWNrX3Byb3BhZ2F0ZSA9IE1pc2MucGFja19wcm9wYWdhdGUKKyAgICBzbGF2ZXMgPSBwYWNrX3NsYXZlcyA9IE1pc2MucGFja19zbGF2ZXMKKworY2xhc3MgUGxhY2U6CisgICAgIiIiR2VvbWV0cnkgbWFuYWdlciBQbGFjZS4KKworICAgIEJhc2UgY2xhc3MgdG8gdXNlIHRoZSBtZXRob2RzIHBsYWNlXyogaW4gZXZlcnkgd2lkZ2V0LiIiIgorICAgIGRlZiBwbGFjZV9jb25maWd1cmUoc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiUGxhY2UgYSB3aWRnZXQgaW4gdGhlIHBhcmVudCB3aWRnZXQuIFVzZSBhcyBvcHRpb25zOgorICAgICAgICBpbj1tYXN0ZXIgLSBtYXN0ZXIgcmVsYXRpdmUgdG8gd2hpY2ggdGhlIHdpZGdldCBpcyBwbGFjZWQKKyAgICAgICAgaW5fPW1hc3RlciAtIHNlZSAnaW4nIG9wdGlvbiBkZXNjcmlwdGlvbgorICAgICAgICB4PWFtb3VudCAtIGxvY2F0ZSBhbmNob3Igb2YgdGhpcyB3aWRnZXQgYXQgcG9zaXRpb24geCBvZiBtYXN0ZXIKKyAgICAgICAgeT1hbW91bnQgLSBsb2NhdGUgYW5jaG9yIG9mIHRoaXMgd2lkZ2V0IGF0IHBvc2l0aW9uIHkgb2YgbWFzdGVyCisgICAgICAgIHJlbHg9YW1vdW50IC0gbG9jYXRlIGFuY2hvciBvZiB0aGlzIHdpZGdldCBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gd2lkdGggb2YgbWFzdGVyICgxLjAgaXMgcmlnaHQgZWRnZSkKKyAgICAgICAgcmVseT1hbW91bnQgLSBsb2NhdGUgYW5jaG9yIG9mIHRoaXMgd2lkZ2V0IGJldHdlZW4gMC4wIGFuZCAxLjAKKyAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byBoZWlnaHQgb2YgbWFzdGVyICgxLjAgaXMgYm90dG9tIGVkZ2UpCisgICAgICAgIGFuY2hvcj1OU0VXIChvciBzdWJzZXQpIC0gcG9zaXRpb24gYW5jaG9yIGFjY29yZGluZyB0byBnaXZlbiBkaXJlY3Rpb24KKyAgICAgICAgd2lkdGg9YW1vdW50IC0gd2lkdGggb2YgdGhpcyB3aWRnZXQgaW4gcGl4ZWwKKyAgICAgICAgaGVpZ2h0PWFtb3VudCAtIGhlaWdodCBvZiB0aGlzIHdpZGdldCBpbiBwaXhlbAorICAgICAgICByZWx3aWR0aD1hbW91bnQgLSB3aWR0aCBvZiB0aGlzIHdpZGdldCBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHdpZHRoIG9mIG1hc3RlciAoMS4wIGlzIHRoZSBzYW1lIHdpZHRoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSBtYXN0ZXIpCisgICAgICAgIHJlbGhlaWdodD1hbW91bnQgLSBoZWlnaHQgb2YgdGhpcyB3aWRnZXQgYmV0d2VlbiAwLjAgYW5kIDEuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gaGVpZ2h0IG9mIG1hc3RlciAoMS4wIGlzIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgYXMgdGhlIG1hc3RlcikKKyAgICAgICAgYm9yZGVybW9kZT0iaW5zaWRlIiBvciAib3V0c2lkZSIgLSB3aGV0aGVyIHRvIHRha2UgYm9yZGVyIHdpZHRoIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzdGVyIHdpZGdldCBpbnRvIGFjY291bnQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgKCdwbGFjZScsICdjb25maWd1cmUnLCBzZWxmLl93KQorICAgICAgICAgICAgICArIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgcGxhY2UgPSBjb25maWd1cmUgPSBjb25maWcgPSBwbGFjZV9jb25maWd1cmUKKyAgICBkZWYgcGxhY2VfZm9yZ2V0KHNlbGYpOgorICAgICAgICAiIiJVbm1hcCB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKCdwbGFjZScsICdmb3JnZXQnLCBzZWxmLl93KQorICAgIGZvcmdldCA9IHBsYWNlX2ZvcmdldAorICAgIGRlZiBwbGFjZV9pbmZvKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBsYWNpbmcgb3B0aW9ucworICAgICAgICBmb3IgdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHdvcmRzID0gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ3BsYWNlJywgJ2luZm8nLCBzZWxmLl93KSkKKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgorICAgICAgICAgICAga2V5ID0gd29yZHNbaV1bMTpdCisgICAgICAgICAgICB2YWx1ZSA9IHdvcmRzW2krMV0KKyAgICAgICAgICAgIGlmIHZhbHVlWzoxXSA9PSAnLic6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9uYW1ldG93aWRnZXQodmFsdWUpCisgICAgICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gZGljdAorICAgIGluZm8gPSBwbGFjZV9pbmZvCisgICAgc2xhdmVzID0gcGxhY2Vfc2xhdmVzID0gTWlzYy5wbGFjZV9zbGF2ZXMKKworY2xhc3MgR3JpZDoKKyAgICAiIiJHZW9tZXRyeSBtYW5hZ2VyIEdyaWQuCisKKyAgICBCYXNlIGNsYXNzIHRvIHVzZSB0aGUgbWV0aG9kcyBncmlkXyogaW4gZXZlcnkgd2lkZ2V0LiIiIgorICAgICMgVGhhbmtzIHRvIE1hc2F6dW1pIFlvc2hpa2F3YSAoeW9zaWthd2FAaXNpLmVkdSkKKyAgICBkZWYgZ3JpZF9jb25maWd1cmUoc2VsZiwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiUG9zaXRpb24gYSB3aWRnZXQgaW4gdGhlIHBhcmVudCB3aWRnZXQgaW4gYSBncmlkLiBVc2UgYXMgb3B0aW9uczoKKyAgICAgICAgY29sdW1uPW51bWJlciAtIHVzZSBjZWxsIGlkZW50aWZpZWQgd2l0aCBnaXZlbiBjb2x1bW4gKHN0YXJ0aW5nIHdpdGggMCkKKyAgICAgICAgY29sdW1uc3Bhbj1udW1iZXIgLSB0aGlzIHdpZGdldCB3aWxsIHNwYW4gc2V2ZXJhbCBjb2x1bW5zCisgICAgICAgIGluPW1hc3RlciAtIHVzZSBtYXN0ZXIgdG8gY29udGFpbiB0aGlzIHdpZGdldAorICAgICAgICBpbl89bWFzdGVyIC0gc2VlICdpbicgb3B0aW9uIGRlc2NyaXB0aW9uCisgICAgICAgIGlwYWR4PWFtb3VudCAtIGFkZCBpbnRlcm5hbCBwYWRkaW5nIGluIHggZGlyZWN0aW9uCisgICAgICAgIGlwYWR5PWFtb3VudCAtIGFkZCBpbnRlcm5hbCBwYWRkaW5nIGluIHkgZGlyZWN0aW9uCisgICAgICAgIHBhZHg9YW1vdW50IC0gYWRkIHBhZGRpbmcgaW4geCBkaXJlY3Rpb24KKyAgICAgICAgcGFkeT1hbW91bnQgLSBhZGQgcGFkZGluZyBpbiB5IGRpcmVjdGlvbgorICAgICAgICByb3c9bnVtYmVyIC0gdXNlIGNlbGwgaWRlbnRpZmllZCB3aXRoIGdpdmVuIHJvdyAoc3RhcnRpbmcgd2l0aCAwKQorICAgICAgICByb3dzcGFuPW51bWJlciAtIHRoaXMgd2lkZ2V0IHdpbGwgc3BhbiBzZXZlcmFsIHJvd3MKKyAgICAgICAgc3RpY2t5PU5TRVcgLSBpZiBjZWxsIGlzIGxhcmdlciBvbiB3aGljaCBzaWRlcyB3aWxsIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQgc3RpY2sgdG8gdGhlIGNlbGwgYm91bmRhcnkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgKCdncmlkJywgJ2NvbmZpZ3VyZScsIHNlbGYuX3cpCisgICAgICAgICAgICAgICsgc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKyAgICBncmlkID0gY29uZmlndXJlID0gY29uZmlnID0gZ3JpZF9jb25maWd1cmUKKyAgICBiYm94ID0gZ3JpZF9iYm94ID0gTWlzYy5ncmlkX2Jib3gKKyAgICBjb2x1bW5jb25maWd1cmUgPSBncmlkX2NvbHVtbmNvbmZpZ3VyZSA9IE1pc2MuZ3JpZF9jb2x1bW5jb25maWd1cmUKKyAgICBkZWYgZ3JpZF9mb3JnZXQoc2VsZik6CisgICAgICAgICIiIlVubWFwIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoJ2dyaWQnLCAnZm9yZ2V0Jywgc2VsZi5fdykKKyAgICBmb3JnZXQgPSBncmlkX2ZvcmdldAorICAgIGRlZiBncmlkX3JlbW92ZShzZWxmKToKKyAgICAgICAgIiIiVW5tYXAgdGhpcyB3aWRnZXQgYnV0IHJlbWVtYmVyIHRoZSBncmlkIG9wdGlvbnMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgnZ3JpZCcsICdyZW1vdmUnLCBzZWxmLl93KQorICAgIGRlZiBncmlkX2luZm8oc2VsZik6CisgICAgICAgICIiIlJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3B0aW9ucworICAgICAgICBmb3IgcG9zaXRpb25pbmcgdGhpcyB3aWRnZXQgaW4gYSBncmlkLiIiIgorICAgICAgICB3b3JkcyA9IHNlbGYudGsuc3BsaXRsaXN0KAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdncmlkJywgJ2luZm8nLCBzZWxmLl93KSkKKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgorICAgICAgICAgICAga2V5ID0gd29yZHNbaV1bMTpdCisgICAgICAgICAgICB2YWx1ZSA9IHdvcmRzW2krMV0KKyAgICAgICAgICAgIGlmIHZhbHVlWzoxXSA9PSAnLic6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9uYW1ldG93aWRnZXQodmFsdWUpCisgICAgICAgICAgICBkaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gZGljdAorICAgIGluZm8gPSBncmlkX2luZm8KKyAgICBsb2NhdGlvbiA9IGdyaWRfbG9jYXRpb24gPSBNaXNjLmdyaWRfbG9jYXRpb24KKyAgICBwcm9wYWdhdGUgPSBncmlkX3Byb3BhZ2F0ZSA9IE1pc2MuZ3JpZF9wcm9wYWdhdGUKKyAgICByb3djb25maWd1cmUgPSBncmlkX3Jvd2NvbmZpZ3VyZSA9IE1pc2MuZ3JpZF9yb3djb25maWd1cmUKKyAgICBzaXplID0gZ3JpZF9zaXplID0gTWlzYy5ncmlkX3NpemUKKyAgICBzbGF2ZXMgPSBncmlkX3NsYXZlcyA9IE1pc2MuZ3JpZF9zbGF2ZXMKKworY2xhc3MgQmFzZVdpZGdldChNaXNjKToKKyAgICAiIiJJbnRlcm5hbCBjbGFzcy4iIiIKKyAgICBkZWYgX3NldHVwKHNlbGYsIG1hc3RlciwgY25mKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIFNldHMgdXAgaW5mb3JtYXRpb24gYWJvdXQgY2hpbGRyZW4uIiIiCisgICAgICAgIGlmIF9zdXBwb3J0X2RlZmF1bHRfcm9vdDoKKyAgICAgICAgICAgIGdsb2JhbCBfZGVmYXVsdF9yb290CisgICAgICAgICAgICBpZiBub3QgbWFzdGVyOgorICAgICAgICAgICAgICAgIGlmIG5vdCBfZGVmYXVsdF9yb290OgorICAgICAgICAgICAgICAgICAgICBfZGVmYXVsdF9yb290ID0gVGsoKQorICAgICAgICAgICAgICAgIG1hc3RlciA9IF9kZWZhdWx0X3Jvb3QKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi50ayA9IG1hc3Rlci50aworICAgICAgICBuYW1lID0gTm9uZQorICAgICAgICBpZiAnbmFtZScgaW4gY25mOgorICAgICAgICAgICAgbmFtZSA9IGNuZlsnbmFtZSddCisgICAgICAgICAgICBkZWwgY25mWyduYW1lJ10KKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBuYW1lID0gcmVwcihpZChzZWxmKSkKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAgICAgICAgaWYgbWFzdGVyLl93PT0nLic6CisgICAgICAgICAgICBzZWxmLl93ID0gJy4nICsgbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdyA9IG1hc3Rlci5fdyArICcuJyArIG5hbWUKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IHt9CisgICAgICAgIGlmIHNlbGYuX25hbWUgaW4gc2VsZi5tYXN0ZXIuY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLm1hc3Rlci5jaGlsZHJlbltzZWxmLl9uYW1lXS5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5tYXN0ZXIuY2hpbGRyZW5bc2VsZi5fbmFtZV0gPSBzZWxmCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlciwgd2lkZ2V0TmFtZSwgY25mPXt9LCBrdz17fSwgZXh0cmE9KCkpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IHdpZGdldCBNQVNURVIsIGEgbmFtZSBXSURHRVROQU1FCisgICAgICAgIGFuZCBhcHByb3ByaWF0ZSBvcHRpb25zLiIiIgorICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgIGNuZiA9IF9jbmZtZXJnZSgoY25mLCBrdykpCisgICAgICAgIHNlbGYud2lkZ2V0TmFtZSA9IHdpZGdldE5hbWUKKyAgICAgICAgQmFzZVdpZGdldC5fc2V0dXAoc2VsZiwgbWFzdGVyLCBjbmYpCisgICAgICAgIGlmIHNlbGYuX3RjbENvbW1hbmRzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl90Y2xDb21tYW5kcyA9IFtdCisgICAgICAgIGNsYXNzZXMgPSBbXQorICAgICAgICBmb3IgayBpbiBjbmYua2V5cygpOgorICAgICAgICAgICAgaWYgdHlwZShrKSBpcyBDbGFzc1R5cGU6CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hcHBlbmQoKGssIGNuZltrXSkpCisgICAgICAgICAgICAgICAgZGVsIGNuZltrXQorICAgICAgICBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAod2lkZ2V0TmFtZSwgc2VsZi5fdykgKyBleHRyYSArIHNlbGYuX29wdGlvbnMoY25mKSkKKyAgICAgICAgZm9yIGssIHYgaW4gY2xhc3NlczoKKyAgICAgICAgICAgIGsuY29uZmlndXJlKHNlbGYsIHYpCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICIiIkRlc3Ryb3kgdGhpcyBhbmQgYWxsIGRlc2NlbmRhbnRzIHdpZGdldHMuIiIiCisgICAgICAgIGZvciBjIGluIHNlbGYuY2hpbGRyZW4udmFsdWVzKCk6IGMuZGVzdHJveSgpCisgICAgICAgIHNlbGYudGsuY2FsbCgnZGVzdHJveScsIHNlbGYuX3cpCisgICAgICAgIGlmIHNlbGYuX25hbWUgaW4gc2VsZi5tYXN0ZXIuY2hpbGRyZW46CisgICAgICAgICAgICBkZWwgc2VsZi5tYXN0ZXIuY2hpbGRyZW5bc2VsZi5fbmFtZV0KKyAgICAgICAgTWlzYy5kZXN0cm95KHNlbGYpCisgICAgZGVmIF9kbyhzZWxmLCBuYW1lLCBhcmdzPSgpKToKKyAgICAgICAgIyBYWFggT2Jzb2xldGUgLS0gYmV0dGVyIHVzZSBzZWxmLnRrLmNhbGwgZGlyZWN0bHkhCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoKHNlbGYuX3csIG5hbWUpICsgYXJncykKKworY2xhc3MgV2lkZ2V0KEJhc2VXaWRnZXQsIFBhY2ssIFBsYWNlLCBHcmlkKToKKyAgICAiIiJJbnRlcm5hbCBjbGFzcy4KKworICAgIEJhc2UgY2xhc3MgZm9yIGEgd2lkZ2V0IHdoaWNoIGNhbiBiZSBwb3NpdGlvbmVkIHdpdGggdGhlIGdlb21ldHJ5IG1hbmFnZXJzCisgICAgUGFjaywgUGxhY2Ugb3IgR3JpZC4iIiIKKyAgICBwYXNzCisKK2NsYXNzIFRvcGxldmVsKEJhc2VXaWRnZXQsIFdtKToKKyAgICAiIiJUb3BsZXZlbCB3aWRnZXQsIGUuZy4gZm9yIGRpYWxvZ3MuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSB0b3BsZXZlbCB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYmFja2dyb3VuZCwgYmQsIGJnLCBib3JkZXJ3aWR0aCwgY2xhc3MsCisgICAgICAgIGNvbG9ybWFwLCBjb250YWluZXIsIGN1cnNvciwgaGVpZ2h0LCBoaWdobGlnaHRiYWNrZ3JvdW5kLAorICAgICAgICBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCBtZW51LCByZWxpZWYsIHNjcmVlbiwgdGFrZWZvY3VzLAorICAgICAgICB1c2UsIHZpc3VhbCwgd2lkdGguIiIiCisgICAgICAgIGlmIGt3OgorICAgICAgICAgICAgY25mID0gX2NuZm1lcmdlKChjbmYsIGt3KSkKKyAgICAgICAgZXh0cmEgPSAoKQorICAgICAgICBmb3Igd21rZXkgaW4gWydzY3JlZW4nLCAnY2xhc3NfJywgJ2NsYXNzJywgJ3Zpc3VhbCcsCisgICAgICAgICAgICAgICAgICAnY29sb3JtYXAnXToKKyAgICAgICAgICAgIGlmIHdta2V5IGluIGNuZjoKKyAgICAgICAgICAgICAgICB2YWwgPSBjbmZbd21rZXldCisgICAgICAgICAgICAgICAgIyBUQkQ6IGEgaGFjayBuZWVkZWQgYmVjYXVzZSBzb21lIGtleXMKKyAgICAgICAgICAgICAgICAjIGFyZSBub3QgdmFsaWQgYXMga2V5d29yZCBhcmd1bWVudHMKKyAgICAgICAgICAgICAgICBpZiB3bWtleVstMV0gPT0gJ18nOiBvcHQgPSAnLScrd21rZXlbOi0xXQorICAgICAgICAgICAgICAgIGVsc2U6IG9wdCA9ICctJyt3bWtleQorICAgICAgICAgICAgICAgIGV4dHJhID0gZXh0cmEgKyAob3B0LCB2YWwpCisgICAgICAgICAgICAgICAgZGVsIGNuZlt3bWtleV0KKyAgICAgICAgQmFzZVdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0b3BsZXZlbCcsIGNuZiwge30sIGV4dHJhKQorICAgICAgICByb290ID0gc2VsZi5fcm9vdCgpCisgICAgICAgIHNlbGYuaWNvbm5hbWUocm9vdC5pY29ubmFtZSgpKQorICAgICAgICBzZWxmLnRpdGxlKHJvb3QudGl0bGUoKSkKKyAgICAgICAgc2VsZi5wcm90b2NvbCgiV01fREVMRVRFX1dJTkRPVyIsIHNlbGYuZGVzdHJveSkKKworY2xhc3MgQnV0dG9uKFdpZGdldCk6CisgICAgIiIiQnV0dG9uIHdpZGdldC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIGJ1dHRvbiB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGFjdGl2ZWJhY2tncm91bmQsIGFjdGl2ZWZvcmVncm91bmQsIGFuY2hvciwKKyAgICAgICAgICAgIGJhY2tncm91bmQsIGJpdG1hcCwgYm9yZGVyd2lkdGgsIGN1cnNvciwKKyAgICAgICAgICAgIGRpc2FibGVkZm9yZWdyb3VuZCwgZm9udCwgZm9yZWdyb3VuZAorICAgICAgICAgICAgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsCisgICAgICAgICAgICBoaWdobGlnaHR0aGlja25lc3MsIGltYWdlLCBqdXN0aWZ5LAorICAgICAgICAgICAgcGFkeCwgcGFkeSwgcmVsaWVmLCByZXBlYXRkZWxheSwKKyAgICAgICAgICAgIHJlcGVhdGludGVydmFsLCB0YWtlZm9jdXMsIHRleHQsCisgICAgICAgICAgICB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgd3JhcGxlbmd0aAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGNvbW1hbmQsIGNvbXBvdW5kLCBkZWZhdWx0LCBoZWlnaHQsCisgICAgICAgICAgICBvdmVycmVsaWVmLCBzdGF0ZSwgd2lkdGgKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdidXR0b24nLCBjbmYsIGt3KQorCisgICAgZGVmIHRrQnV0dG9uRW50ZXIoc2VsZiwgKmR1bW15KToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a0J1dHRvbkVudGVyJywgc2VsZi5fdykKKworICAgIGRlZiB0a0J1dHRvbkxlYXZlKHNlbGYsICpkdW1teSk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtCdXR0b25MZWF2ZScsIHNlbGYuX3cpCisKKyAgICBkZWYgdGtCdXR0b25Eb3duKHNlbGYsICpkdW1teSk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtCdXR0b25Eb3duJywgc2VsZi5fdykKKworICAgIGRlZiB0a0J1dHRvblVwKHNlbGYsICpkdW1teSk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtCdXR0b25VcCcsIHNlbGYuX3cpCisKKyAgICBkZWYgdGtCdXR0b25JbnZva2Uoc2VsZiwgKmR1bW15KToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a0J1dHRvbkludm9rZScsIHNlbGYuX3cpCisKKyAgICBkZWYgZmxhc2goc2VsZik6CisgICAgICAgICIiIkZsYXNoIHRoZSBidXR0b24uCisKKyAgICAgICAgVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgcmVkaXNwbGF5aW5nCisgICAgICAgIHRoZSBidXR0b24gc2V2ZXJhbCB0aW1lcywgYWx0ZXJuYXRpbmcgYmV0d2VlbiBhY3RpdmUgYW5kCisgICAgICAgIG5vcm1hbCBjb2xvcnMuIEF0IHRoZSBlbmQgb2YgdGhlIGZsYXNoIHRoZSBidXR0b24gaXMgbGVmdAorICAgICAgICBpbiB0aGUgc2FtZSBub3JtYWwvYWN0aXZlIHN0YXRlIGFzIHdoZW4gdGhlIGNvbW1hbmQgd2FzCisgICAgICAgIGludm9rZWQuIFRoaXMgY29tbWFuZCBpcyBpZ25vcmVkIGlmIHRoZSBidXR0b24ncyBzdGF0ZSBpcworICAgICAgICBkaXNhYmxlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZmxhc2gnKQorCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgIiIiSW52b2tlIHRoZSBjb21tYW5kIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnV0dG9uLgorCisgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kLAorICAgICAgICBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgaXMgbm8gY29tbWFuZCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgdGhlIGJ1dHRvbi4gVGhpcyBjb21tYW5kIGlzIGlnbm9yZWQgaWYgdGhlIGJ1dHRvbidzIHN0YXRlCisgICAgICAgIGlzIGRpc2FibGVkLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJykKKworIyBJbmRpY2VzOgorIyBYWFggSSBkb24ndCBsaWtlIHRoZXNlIC0tIHRha2UgdGhlbSBhd2F5CitkZWYgQXRFbmQoKToKKyAgICByZXR1cm4gJ2VuZCcKK2RlZiBBdEluc2VydCgqYXJncyk6CisgICAgcyA9ICdpbnNlcnQnCisgICAgZm9yIGEgaW4gYXJnczoKKyAgICAgICAgaWYgYTogcyA9IHMgKyAoJyAnICsgYSkKKyAgICByZXR1cm4gcworZGVmIEF0U2VsRmlyc3QoKToKKyAgICByZXR1cm4gJ3NlbC5maXJzdCcKK2RlZiBBdFNlbExhc3QoKToKKyAgICByZXR1cm4gJ3NlbC5sYXN0JworZGVmIEF0KHgsIHk9Tm9uZSk6CisgICAgaWYgeSBpcyBOb25lOgorICAgICAgICByZXR1cm4gJ0AlcicgJSAoeCwpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICdAJXIsJXInICUgKHgsIHkpCisKK2NsYXNzIENhbnZhcyhXaWRnZXQsIFhWaWV3LCBZVmlldyk6CisgICAgIiIiQ2FudmFzIHdpZGdldCB0byBkaXNwbGF5IGdyYXBoaWNhbCBlbGVtZW50cyBsaWtlIGxpbmVzIG9yIHRleHQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBjYW52YXMgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGJhY2tncm91bmQsIGJkLCBiZywgYm9yZGVyd2lkdGgsIGNsb3NlZW5vdWdoLAorICAgICAgICBjb25maW5lLCBjdXJzb3IsIGhlaWdodCwgaGlnaGxpZ2h0YmFja2dyb3VuZCwgaGlnaGxpZ2h0Y29sb3IsCisgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcywgaW5zZXJ0YmFja2dyb3VuZCwgaW5zZXJ0Ym9yZGVyd2lkdGgsCisgICAgICAgIGluc2VydG9mZnRpbWUsIGluc2VydG9udGltZSwgaW5zZXJ0d2lkdGgsIG9mZnNldCwgcmVsaWVmLAorICAgICAgICBzY3JvbGxyZWdpb24sIHNlbGVjdGJhY2tncm91bmQsIHNlbGVjdGJvcmRlcndpZHRoLCBzZWxlY3Rmb3JlZ3JvdW5kLAorICAgICAgICBzdGF0ZSwgdGFrZWZvY3VzLCB3aWR0aCwgeHNjcm9sbGNvbW1hbmQsIHhzY3JvbGxpbmNyZW1lbnQsCisgICAgICAgIHlzY3JvbGxjb21tYW5kLCB5c2Nyb2xsaW5jcmVtZW50LiIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnY2FudmFzJywgY25mLCBrdykKKyAgICBkZWYgYWRkdGFnKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2FkZHRhZycpICsgYXJncykKKyAgICBkZWYgYWRkdGFnX2Fib3ZlKHNlbGYsIG5ld3RhZywgdGFnT3JJZCk6CisgICAgICAgICIiIkFkZCB0YWcgTkVXVEFHIHRvIGFsbCBpdGVtcyBhYm92ZSBUQUdPUklELiIiIgorICAgICAgICBzZWxmLmFkZHRhZyhuZXd0YWcsICdhYm92ZScsIHRhZ09ySWQpCisgICAgZGVmIGFkZHRhZ19hbGwoc2VsZiwgbmV3dGFnKToKKyAgICAgICAgIiIiQWRkIHRhZyBORVdUQUcgdG8gYWxsIGl0ZW1zLiIiIgorICAgICAgICBzZWxmLmFkZHRhZyhuZXd0YWcsICdhbGwnKQorICAgIGRlZiBhZGR0YWdfYmVsb3coc2VsZiwgbmV3dGFnLCB0YWdPcklkKToKKyAgICAgICAgIiIiQWRkIHRhZyBORVdUQUcgdG8gYWxsIGl0ZW1zIGJlbG93IFRBR09SSUQuIiIiCisgICAgICAgIHNlbGYuYWRkdGFnKG5ld3RhZywgJ2JlbG93JywgdGFnT3JJZCkKKyAgICBkZWYgYWRkdGFnX2Nsb3Nlc3Qoc2VsZiwgbmV3dGFnLCB4LCB5LCBoYWxvPU5vbmUsIHN0YXJ0PU5vbmUpOgorICAgICAgICAiIiJBZGQgdGFnIE5FV1RBRyB0byBpdGVtIHdoaWNoIGlzIGNsb3Nlc3QgdG8gcGl4ZWwgYXQgWCwgWS4KKyAgICAgICAgSWYgc2V2ZXJhbCBtYXRjaCB0YWtlIHRoZSB0b3AtbW9zdC4KKyAgICAgICAgQWxsIGl0ZW1zIGNsb3NlciB0aGFuIEhBTE8gYXJlIGNvbnNpZGVyZWQgb3ZlcmxhcHBpbmcgKGFsbCBhcmUKKyAgICAgICAgY2xvc2VzdHMpLiBJZiBTVEFSVCBpcyBzcGVjaWZpZWQgdGhlIG5leHQgYmVsb3cgdGhpcyB0YWcgaXMgdGFrZW4uIiIiCisgICAgICAgIHNlbGYuYWRkdGFnKG5ld3RhZywgJ2Nsb3Nlc3QnLCB4LCB5LCBoYWxvLCBzdGFydCkKKyAgICBkZWYgYWRkdGFnX2VuY2xvc2VkKHNlbGYsIG5ld3RhZywgeDEsIHkxLCB4MiwgeTIpOgorICAgICAgICAiIiJBZGQgdGFnIE5FV1RBRyB0byBhbGwgaXRlbXMgaW4gdGhlIHJlY3RhbmdsZSBkZWZpbmVkCisgICAgICAgIGJ5IFgxLFkxLFgyLFkyLiIiIgorICAgICAgICBzZWxmLmFkZHRhZyhuZXd0YWcsICdlbmNsb3NlZCcsIHgxLCB5MSwgeDIsIHkyKQorICAgIGRlZiBhZGR0YWdfb3ZlcmxhcHBpbmcoc2VsZiwgbmV3dGFnLCB4MSwgeTEsIHgyLCB5Mik6CisgICAgICAgICIiIkFkZCB0YWcgTkVXVEFHIHRvIGFsbCBpdGVtcyB3aGljaCBvdmVybGFwIHRoZSByZWN0YW5nbGUKKyAgICAgICAgZGVmaW5lZCBieSBYMSxZMSxYMixZMi4iIiIKKyAgICAgICAgc2VsZi5hZGR0YWcobmV3dGFnLCAnb3ZlcmxhcHBpbmcnLCB4MSwgeTEsIHgyLCB5MikKKyAgICBkZWYgYWRkdGFnX3dpdGh0YWcoc2VsZiwgbmV3dGFnLCB0YWdPcklkKToKKyAgICAgICAgIiIiQWRkIHRhZyBORVdUQUcgdG8gYWxsIGl0ZW1zIHdpdGggVEFHT1JJRC4iIiIKKyAgICAgICAgc2VsZi5hZGR0YWcobmV3dGFnLCAnd2l0aHRhZycsIHRhZ09ySWQpCisgICAgZGVmIGJib3goc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiBYMSxZMSxYMixZMiBjb29yZGluYXRlcyBmb3IgYSByZWN0YW5nbGUKKyAgICAgICAgd2hpY2ggZW5jbG9zZXMgYWxsIGl0ZW1zIHdpdGggdGFncyBzcGVjaWZpZWQgYXMgYXJndW1lbnRzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2Jib3gnKSArIGFyZ3MpKSBvciBOb25lCisgICAgZGVmIHRhZ191bmJpbmQoc2VsZiwgdGFnT3JJZCwgc2VxdWVuY2UsIGZ1bmNpZD1Ob25lKToKKyAgICAgICAgIiIiVW5iaW5kIGZvciBhbGwgaXRlbXMgd2l0aCBUQUdPUklEIGZvciBldmVudCBTRVFVRU5DRSAgdGhlCisgICAgICAgIGZ1bmN0aW9uIGlkZW50aWZpZWQgd2l0aCBGVU5DSUQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYmluZCcsIHRhZ09ySWQsIHNlcXVlbmNlLCAnJykKKyAgICAgICAgaWYgZnVuY2lkOgorICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKGZ1bmNpZCkKKyAgICBkZWYgdGFnX2JpbmQoc2VsZiwgdGFnT3JJZCwgc2VxdWVuY2U9Tm9uZSwgZnVuYz1Ob25lLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgdG8gYWxsIGl0ZW1zIHdpdGggVEFHT1JJRCBhdCBldmVudCBTRVFVRU5DRSBhIGNhbGwgdG8gZnVuY3Rpb24gRlVOQy4KKworICAgICAgICBBbiBhZGRpdGlvbmFsIGJvb2xlYW4gcGFyYW1ldGVyIEFERCBzcGVjaWZpZXMgd2hldGhlciBGVU5DIHdpbGwgYmUKKyAgICAgICAgY2FsbGVkIGFkZGl0aW9uYWxseSB0byB0aGUgb3RoZXIgYm91bmQgZnVuY3Rpb24gb3Igd2hldGhlciBpdCB3aWxsCisgICAgICAgIHJlcGxhY2UgdGhlIHByZXZpb3VzIGZ1bmN0aW9uLiBTZWUgYmluZCBmb3IgdGhlIHJldHVybiB2YWx1ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2JpbmQoKHNlbGYuX3csICdiaW5kJywgdGFnT3JJZCksCisgICAgICAgICAgICAgICAgICBzZXF1ZW5jZSwgZnVuYywgYWRkKQorICAgIGRlZiBjYW52YXN4KHNlbGYsIHNjcmVlbngsIGdyaWRzcGFjaW5nPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNhbnZhcyB4IGNvb3JkaW5hdGUgb2YgcGl4ZWwgcG9zaXRpb24gU0NSRUVOWCByb3VuZGVkCisgICAgICAgIHRvIG5lYXJlc3QgbXVsdGlwbGUgb2YgR1JJRFNQQUNJTkcgdW5pdHMuIiIiCisgICAgICAgIHJldHVybiBnZXRkb3VibGUoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ2NhbnZhc3gnLCBzY3JlZW54LCBncmlkc3BhY2luZykpCisgICAgZGVmIGNhbnZhc3koc2VsZiwgc2NyZWVueSwgZ3JpZHNwYWNpbmc9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgY2FudmFzIHkgY29vcmRpbmF0ZSBvZiBwaXhlbCBwb3NpdGlvbiBTQ1JFRU5ZIHJvdW5kZWQKKyAgICAgICAgdG8gbmVhcmVzdCBtdWx0aXBsZSBvZiBHUklEU1BBQ0lORyB1bml0cy4iIiIKKyAgICAgICAgcmV0dXJuIGdldGRvdWJsZShzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAnY2FudmFzeScsIHNjcmVlbnksIGdyaWRzcGFjaW5nKSkKKyAgICBkZWYgY29vcmRzKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb29yZGluYXRlcyBmb3IgdGhlIGl0ZW0gZ2l2ZW4gaW4gQVJHUy4iIiIKKyAgICAgICAgIyBYWFggU2hvdWxkIHVzZSBfZmxhdHRlbiBvbiBhcmdzCisgICAgICAgIHJldHVybiBtYXAoZ2V0ZG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnY29vcmRzJykgKyBhcmdzKSkpCisgICAgZGVmIF9jcmVhdGUoc2VsZiwgaXRlbVR5cGUsIGFyZ3MsIGt3KTogIyBBcmdzOiAodmFsLCB2YWwsIC4uLiwgY25mPXt9KQorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgYXJncyA9IF9mbGF0dGVuKGFyZ3MpCisgICAgICAgIGNuZiA9IGFyZ3NbLTFdCisgICAgICAgIGlmIHR5cGUoY25mKSBpbiAoRGljdGlvbmFyeVR5cGUsIFR1cGxlVHlwZSk6CisgICAgICAgICAgICBhcmdzID0gYXJnc1s6LTFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbmYgPSB7fQorICAgICAgICByZXR1cm4gZ2V0aW50KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICdjcmVhdGUnLCBpdGVtVHlwZSwKKyAgICAgICAgICAgICooYXJncyArIHNlbGYuX29wdGlvbnMoY25mLCBrdykpKSkKKyAgICBkZWYgY3JlYXRlX2FyYyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSBhcmMgc2hhcGVkIHJlZ2lvbiB3aXRoIGNvb3JkaW5hdGVzIHgxLHkxLHgyLHkyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlKCdhcmMnLCBhcmdzLCBrdykKKyAgICBkZWYgY3JlYXRlX2JpdG1hcChzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSBiaXRtYXAgd2l0aCBjb29yZGluYXRlcyB4MSx5MS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZSgnYml0bWFwJywgYXJncywga3cpCisgICAgZGVmIGNyZWF0ZV9pbWFnZShzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSBpbWFnZSBpdGVtIHdpdGggY29vcmRpbmF0ZXMgeDEseTEuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGUoJ2ltYWdlJywgYXJncywga3cpCisgICAgZGVmIGNyZWF0ZV9saW5lKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIGxpbmUgd2l0aCBjb29yZGluYXRlcyB4MSx5MSwuLi4seG4seW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGUoJ2xpbmUnLCBhcmdzLCBrdykKKyAgICBkZWYgY3JlYXRlX292YWwoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgb3ZhbCB3aXRoIGNvb3JkaW5hdGVzIHgxLHkxLHgyLHkyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlKCdvdmFsJywgYXJncywga3cpCisgICAgZGVmIGNyZWF0ZV9wb2x5Z29uKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIHBvbHlnb24gd2l0aCBjb29yZGluYXRlcyB4MSx5MSwuLi4seG4seW4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jcmVhdGUoJ3BvbHlnb24nLCBhcmdzLCBrdykKKyAgICBkZWYgY3JlYXRlX3JlY3RhbmdsZShzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgICIiIkNyZWF0ZSByZWN0YW5nbGUgd2l0aCBjb29yZGluYXRlcyB4MSx5MSx4Mix5Mi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZSgncmVjdGFuZ2xlJywgYXJncywga3cpCisgICAgZGVmIGNyZWF0ZV90ZXh0KHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIHRleHQgd2l0aCBjb29yZGluYXRlcyB4MSx5MS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NyZWF0ZSgndGV4dCcsIGFyZ3MsIGt3KQorICAgIGRlZiBjcmVhdGVfd2luZG93KHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIHdpbmRvdyB3aXRoIGNvb3JkaW5hdGVzIHgxLHkxLHgyLHkyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlKCd3aW5kb3cnLCBhcmdzLCBrdykKKyAgICBkZWYgZGNoYXJzKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiRGVsZXRlIGNoYXJhY3RlcnMgb2YgdGV4dCBpdGVtcyBpZGVudGlmaWVkIGJ5IHRhZyBvciBpZCBpbiBBUkdTIChwb3NzaWJseQorICAgICAgICBzZXZlcmFsIHRpbWVzKSBmcm9tIEZJUlNUIHRvIExBU1QgY2hhcmFjdGVyIChpbmNsdWRpbmcpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdkY2hhcnMnKSArIGFyZ3MpCisgICAgZGVmIGRlbGV0ZShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkRlbGV0ZSBpdGVtcyBpZGVudGlmaWVkIGJ5IGFsbCB0YWcgb3IgaWRzIGNvbnRhaW5lZCBpbiBBUkdTLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdkZWxldGUnKSArIGFyZ3MpCisgICAgZGVmIGR0YWcoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJEZWxldGUgdGFnIG9yIGlkIGdpdmVuIGFzIGxhc3QgYXJndW1lbnRzIGluIEFSR1MgZnJvbSBpdGVtcworICAgICAgICBpZGVudGlmaWVkIGJ5IGZpcnN0IGFyZ3VtZW50IGluIEFSR1MuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2R0YWcnKSArIGFyZ3MpCisgICAgZGVmIGZpbmQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbnRlcm5hbCBmdW5jdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdmaW5kJykgKyBhcmdzKSkgb3IgKCkKKyAgICBkZWYgZmluZF9hYm92ZShzZWxmLCB0YWdPcklkKToKKyAgICAgICAgIiIiUmV0dXJuIGl0ZW1zIGFib3ZlIFRBR09SSUQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbmQoJ2Fib3ZlJywgdGFnT3JJZCkKKyAgICBkZWYgZmluZF9hbGwoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbGwgaXRlbXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbmQoJ2FsbCcpCisgICAgZGVmIGZpbmRfYmVsb3coc2VsZiwgdGFnT3JJZCk6CisgICAgICAgICIiIlJldHVybiBhbGwgaXRlbXMgYmVsb3cgVEFHT1JJRC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmluZCgnYmVsb3cnLCB0YWdPcklkKQorICAgIGRlZiBmaW5kX2Nsb3Nlc3Qoc2VsZiwgeCwgeSwgaGFsbz1Ob25lLCBzdGFydD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGl0ZW0gd2hpY2ggaXMgY2xvc2VzdCB0byBwaXhlbCBhdCBYLCBZLgorICAgICAgICBJZiBzZXZlcmFsIG1hdGNoIHRha2UgdGhlIHRvcC1tb3N0LgorICAgICAgICBBbGwgaXRlbXMgY2xvc2VyIHRoYW4gSEFMTyBhcmUgY29uc2lkZXJlZCBvdmVybGFwcGluZyAoYWxsIGFyZQorICAgICAgICBjbG9zZXN0cykuIElmIFNUQVJUIGlzIHNwZWNpZmllZCB0aGUgbmV4dCBiZWxvdyB0aGlzIHRhZyBpcyB0YWtlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmluZCgnY2xvc2VzdCcsIHgsIHksIGhhbG8sIHN0YXJ0KQorICAgIGRlZiBmaW5kX2VuY2xvc2VkKHNlbGYsIHgxLCB5MSwgeDIsIHkyKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCBpdGVtcyBpbiByZWN0YW5nbGUgZGVmaW5lZAorICAgICAgICBieSBYMSxZMSxYMixZMi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmluZCgnZW5jbG9zZWQnLCB4MSwgeTEsIHgyLCB5MikKKyAgICBkZWYgZmluZF9vdmVybGFwcGluZyhzZWxmLCB4MSwgeTEsIHgyLCB5Mik6CisgICAgICAgICIiIlJldHVybiBhbGwgaXRlbXMgd2hpY2ggb3ZlcmxhcCB0aGUgcmVjdGFuZ2xlCisgICAgICAgIGRlZmluZWQgYnkgWDEsWTEsWDIsWTIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbmQoJ292ZXJsYXBwaW5nJywgeDEsIHkxLCB4MiwgeTIpCisgICAgZGVmIGZpbmRfd2l0aHRhZyhzZWxmLCB0YWdPcklkKToKKyAgICAgICAgIiIiUmV0dXJuIGFsbCBpdGVtcyB3aXRoIFRBR09SSUQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmZpbmQoJ3dpdGh0YWcnLCB0YWdPcklkKQorICAgIGRlZiBmb2N1cyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlNldCBmb2N1cyB0byB0aGUgZmlyc3QgaXRlbSBzcGVjaWZpZWQgaW4gQVJHUy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2ZvY3VzJykgKyBhcmdzKQorICAgIGRlZiBnZXR0YWdzKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmV0dXJuIHRhZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCBpdGVtIHNwZWNpZmllZCBpbiBBUkdTLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdnZXR0YWdzJykgKyBhcmdzKSkKKyAgICBkZWYgaWN1cnNvcihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlNldCBjdXJzb3IgYXQgcG9zaXRpb24gUE9TIGluIHRoZSBpdGVtIGlkZW50aWZpZWQgYnkgVEFHT1JJRC4KKyAgICAgICAgSW4gQVJHUyBUQUdPUklEIG11c3QgYmUgZmlyc3QuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2ljdXJzb3InKSArIGFyZ3MpCisgICAgZGVmIGluZGV4KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmV0dXJuIHBvc2l0aW9uIG9mIGN1cnNvciBhcyBpbnRlZ2VyIGluIGl0ZW0gc3BlY2lmaWVkIGluIEFSR1MuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoc2VsZi50ay5jYWxsKChzZWxmLl93LCAnaW5kZXgnKSArIGFyZ3MpKQorICAgIGRlZiBpbnNlcnQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbnNlcnQgVEVYVCBpbiBpdGVtIFRBR09SSUQgYXQgcG9zaXRpb24gUE9TLiBBUkdTIG11c3QKKyAgICAgICAgYmUgVEFHT1JJRCBQT1MgVEVYVC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnaW5zZXJ0JykgKyBhcmdzKQorICAgIGRlZiBpdGVtY2dldChzZWxmLCB0YWdPcklkLCBvcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHJlc291cmNlIHZhbHVlIGZvciBhbiBPUFRJT04gZm9yIGl0ZW0gVEFHT1JJRC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIChzZWxmLl93LCAnaXRlbWNnZXQnKSArICh0YWdPcklkLCAnLScrb3B0aW9uKSkKKyAgICBkZWYgaXRlbWNvbmZpZ3VyZShzZWxmLCB0YWdPcklkLCBjbmY9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSByZXNvdXJjZXMgb2YgYW4gaXRlbSBUQUdPUklELgorCisgICAgICAgIFRoZSB2YWx1ZXMgZm9yIHJlc291cmNlcyBhcmUgc3BlY2lmaWVkIGFzIGtleXdvcmQKKyAgICAgICAgYXJndW1lbnRzLiBUbyBnZXQgYW4gb3ZlcnZpZXcgYWJvdXQKKyAgICAgICAgdGhlIGFsbG93ZWQga2V5d29yZCBhcmd1bWVudHMgY2FsbCB0aGUgbWV0aG9kIHdpdGhvdXQgYXJndW1lbnRzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgoJ2l0ZW1jb25maWd1cmUnLCB0YWdPcklkKSwgY25mLCBrdykKKyAgICBpdGVtY29uZmlnID0gaXRlbWNvbmZpZ3VyZQorICAgICMgbG93ZXIsIHRrcmFpc2UvbGlmdCBoaWRlIE1pc2MubG93ZXIsIE1pc2MudGtyYWlzZS9saWZ0LAorICAgICMgc28gdGhlIHByZWZlcnJlZCBuYW1lIGZvciB0aGVtIGlzIHRhZ19sb3dlciwgdGFnX3JhaXNlCisgICAgIyAoc2ltaWxhciB0byB0YWdfYmluZCwgYW5kIHNpbWlsYXIgdG8gdGhlIFRleHQgd2lkZ2V0KTsKKyAgICAjIHVuZm9ydHVuYXRlbHkgY2FuJ3QgZGVsZXRlIHRoZSBvbGQgb25lcyB5ZXQgKG1heWJlIGluIDEuNikKKyAgICBkZWYgdGFnX2xvd2VyKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiTG93ZXIgYW4gaXRlbSBUQUdPUklEIGdpdmVuIGluIEFSR1MKKyAgICAgICAgKG9wdGlvbmFsIGJlbG93IGFub3RoZXIgaXRlbSkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2xvd2VyJykgKyBhcmdzKQorICAgIGxvd2VyID0gdGFnX2xvd2VyCisgICAgZGVmIG1vdmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJNb3ZlIGFuIGl0ZW0gVEFHT1JJRCBnaXZlbiBpbiBBUkdTLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdtb3ZlJykgKyBhcmdzKQorICAgIGRlZiBwb3N0c2NyaXB0KHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIlByaW50IHRoZSBjb250ZW50cyBvZiB0aGUgY2FudmFzIHRvIGEgcG9zdHNjcmlwdAorICAgICAgICBmaWxlLiBWYWxpZCBvcHRpb25zOiBjb2xvcm1hcCwgY29sb3Jtb2RlLCBmaWxlLCBmb250bWFwLAorICAgICAgICBoZWlnaHQsIHBhZ2VhbmNob3IsIHBhZ2VoZWlnaHQsIHBhZ2V3aWR0aCwgcGFnZXgsIHBhZ2V5LAorICAgICAgICByb3RhdGUsIHdpdGRoLCB4LCB5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKChzZWxmLl93LCAncG9zdHNjcmlwdCcpICsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKyAgICBkZWYgdGFnX3JhaXNlKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmFpc2UgYW4gaXRlbSBUQUdPUklEIGdpdmVuIGluIEFSR1MKKyAgICAgICAgKG9wdGlvbmFsIGFib3ZlIGFub3RoZXIgaXRlbSkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3JhaXNlJykgKyBhcmdzKQorICAgIGxpZnQgPSB0a3JhaXNlID0gdGFnX3JhaXNlCisgICAgZGVmIHNjYWxlKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiU2NhbGUgaXRlbSBUQUdPUklEIHdpdGggWE9SSUdJTiwgWU9SSUdJTiwgWFNDQUxFLCBZU0NBTEUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3NjYWxlJykgKyBhcmdzKQorICAgIGRlZiBzY2FuX21hcmsoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJlbWVtYmVyIHRoZSBjdXJyZW50IFgsIFkgY29vcmRpbmF0ZXMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2NhbicsICdtYXJrJywgeCwgeSkKKyAgICBkZWYgc2Nhbl9kcmFndG8oc2VsZiwgeCwgeSwgZ2Fpbj0xMCk6CisgICAgICAgICIiIkFkanVzdCB0aGUgdmlldyBvZiB0aGUgY2FudmFzIHRvIEdBSU4gdGltZXMgdGhlCisgICAgICAgIGRpZmZlcmVuY2UgYmV0d2VlbiBYIGFuZCBZIGFuZCB0aGUgY29vcmRpbmF0ZXMgZ2l2ZW4gaW4KKyAgICAgICAgc2Nhbl9tYXJrLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NjYW4nLCAnZHJhZ3RvJywgeCwgeSwgZ2FpbikKKyAgICBkZWYgc2VsZWN0X2FkanVzdChzZWxmLCB0YWdPcklkLCBpbmRleCk6CisgICAgICAgICIiIkFkanVzdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24gbmVhciB0aGUgY3Vyc29yIG9mIGFuIGl0ZW0gVEFHT1JJRCB0byBpbmRleC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3QnLCAnYWRqdXN0JywgdGFnT3JJZCwgaW5kZXgpCisgICAgZGVmIHNlbGVjdF9jbGVhcihzZWxmKToKKyAgICAgICAgIiIiQ2xlYXIgdGhlIHNlbGVjdGlvbiBpZiBpdCBpcyBpbiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3QnLCAnY2xlYXInKQorICAgIGRlZiBzZWxlY3RfZnJvbShzZWxmLCB0YWdPcklkLCBpbmRleCk6CisgICAgICAgICIiIlNldCB0aGUgZml4ZWQgZW5kIG9mIGEgc2VsZWN0aW9uIGluIGl0ZW0gVEFHT1JJRCB0byBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3QnLCAnZnJvbScsIHRhZ09ySWQsIGluZGV4KQorICAgIGRlZiBzZWxlY3RfaXRlbShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBpdGVtIHdoaWNoIGhhcyB0aGUgc2VsZWN0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3QnLCAnaXRlbScpIG9yIE5vbmUKKyAgICBkZWYgc2VsZWN0X3RvKHNlbGYsIHRhZ09ySWQsIGluZGV4KToKKyAgICAgICAgIiIiU2V0IHRoZSB2YXJpYWJsZSBlbmQgb2YgYSBzZWxlY3Rpb24gaW4gaXRlbSBUQUdPUklEIHRvIElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdCcsICd0bycsIHRhZ09ySWQsIGluZGV4KQorICAgIGRlZiB0eXBlKHNlbGYsIHRhZ09ySWQpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGl0ZW0gVEFHT1JJRC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAndHlwZScsIHRhZ09ySWQpIG9yIE5vbmUKKworY2xhc3MgQ2hlY2tidXR0b24oV2lkZ2V0KToKKyAgICAiIiJDaGVja2J1dHRvbiB3aWRnZXQgd2hpY2ggaXMgZWl0aGVyIGluIG9uLSBvciBvZmYtc3RhdGUuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBjaGVja2J1dHRvbiB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYWN0aXZlYmFja2dyb3VuZCwgYWN0aXZlZm9yZWdyb3VuZCwgYW5jaG9yLAorICAgICAgICBiYWNrZ3JvdW5kLCBiZCwgYmcsIGJpdG1hcCwgYm9yZGVyd2lkdGgsIGNvbW1hbmQsIGN1cnNvciwKKyAgICAgICAgZGlzYWJsZWRmb3JlZ3JvdW5kLCBmZywgZm9udCwgZm9yZWdyb3VuZCwgaGVpZ2h0LAorICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbWFnZSwKKyAgICAgICAgaW5kaWNhdG9yb24sIGp1c3RpZnksIG9mZnZhbHVlLCBvbnZhbHVlLCBwYWR4LCBwYWR5LCByZWxpZWYsCisgICAgICAgIHNlbGVjdGNvbG9yLCBzZWxlY3RpbWFnZSwgc3RhdGUsIHRha2Vmb2N1cywgdGV4dCwgdGV4dHZhcmlhYmxlLAorICAgICAgICB1bmRlcmxpbmUsIHZhcmlhYmxlLCB3aWR0aCwgd3JhcGxlbmd0aC4iIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ2NoZWNrYnV0dG9uJywgY25mLCBrdykKKyAgICBkZWYgZGVzZWxlY3Qoc2VsZik6CisgICAgICAgICIiIlB1dCB0aGUgYnV0dG9uIGluIG9mZi1zdGF0ZS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdkZXNlbGVjdCcpCisgICAgZGVmIGZsYXNoKHNlbGYpOgorICAgICAgICAiIiJGbGFzaCB0aGUgYnV0dG9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ZsYXNoJykKKyAgICBkZWYgaW52b2tlKHNlbGYpOgorICAgICAgICAiIiJUb2dnbGUgdGhlIGJ1dHRvbiBhbmQgaW52b2tlIGEgY29tbWFuZCBpZiBnaXZlbiBhcyByZXNvdXJjZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJykKKyAgICBkZWYgc2VsZWN0KHNlbGYpOgorICAgICAgICAiIiJQdXQgdGhlIGJ1dHRvbiBpbiBvbi1zdGF0ZS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3QnKQorICAgIGRlZiB0b2dnbGUoc2VsZik6CisgICAgICAgICIiIlRvZ2dsZSB0aGUgYnV0dG9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3RvZ2dsZScpCisKK2NsYXNzIEVudHJ5KFdpZGdldCwgWFZpZXcpOgorICAgICIiIkVudHJ5IHdpZGdldCB3aGljaCBhbGxvd3MgdG8gZGlzcGxheSBzaW1wbGUgdGV4dC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhbiBlbnRyeSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYmFja2dyb3VuZCwgYmQsIGJnLCBib3JkZXJ3aWR0aCwgY3Vyc29yLAorICAgICAgICBleHBvcnRzZWxlY3Rpb24sIGZnLCBmb250LCBmb3JlZ3JvdW5kLCBoaWdobGlnaHRiYWNrZ3JvdW5kLAorICAgICAgICBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbnNlcnRiYWNrZ3JvdW5kLAorICAgICAgICBpbnNlcnRib3JkZXJ3aWR0aCwgaW5zZXJ0b2ZmdGltZSwgaW5zZXJ0b250aW1lLCBpbnNlcnR3aWR0aCwKKyAgICAgICAgaW52YWxpZGNvbW1hbmQsIGludmNtZCwganVzdGlmeSwgcmVsaWVmLCBzZWxlY3RiYWNrZ3JvdW5kLAorICAgICAgICBzZWxlY3Rib3JkZXJ3aWR0aCwgc2VsZWN0Zm9yZWdyb3VuZCwgc2hvdywgc3RhdGUsIHRha2Vmb2N1cywKKyAgICAgICAgdGV4dHZhcmlhYmxlLCB2YWxpZGF0ZSwgdmFsaWRhdGVjb21tYW5kLCB2Y21kLCB3aWR0aCwKKyAgICAgICAgeHNjcm9sbGNvbW1hbmQuIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdlbnRyeScsIGNuZiwga3cpCisgICAgZGVmIGRlbGV0ZShzZWxmLCBmaXJzdCwgbGFzdD1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIHRleHQgZnJvbSBGSVJTVCB0byBMQVNUIChub3QgaW5jbHVkZWQpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIGZpcnN0LCBsYXN0KQorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdGV4dC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0JykKKyAgICBkZWYgaWN1cnNvcihzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkluc2VydCBjdXJzb3IgYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaWN1cnNvcicsIGluZGV4KQorICAgIGRlZiBpbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJldHVybiBwb3NpdGlvbiBvZiBjdXJzb3IuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ2luZGV4JywgaW5kZXgpKQorICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIHN0cmluZyk6CisgICAgICAgICIiIkluc2VydCBTVFJJTkcgYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5zZXJ0JywgaW5kZXgsIHN0cmluZykKKyAgICBkZWYgc2Nhbl9tYXJrKHNlbGYsIHgpOgorICAgICAgICAiIiJSZW1lbWJlciB0aGUgY3VycmVudCBYLCBZIGNvb3JkaW5hdGVzLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NjYW4nLCAnbWFyaycsIHgpCisgICAgZGVmIHNjYW5fZHJhZ3RvKHNlbGYsIHgpOgorICAgICAgICAiIiJBZGp1c3QgdGhlIHZpZXcgb2YgdGhlIGNhbnZhcyB0byAxMCB0aW1lcyB0aGUKKyAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIFggYW5kIFkgYW5kIHRoZSBjb29yZGluYXRlcyBnaXZlbiBpbgorICAgICAgICBzY2FuX21hcmsuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2NhbicsICdkcmFndG8nLCB4KQorICAgIGRlZiBzZWxlY3Rpb25fYWRqdXN0KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiQWRqdXN0IHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiBuZWFyIHRoZSBjdXJzb3IgdG8gSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0aW9uJywgJ2FkanVzdCcsIGluZGV4KQorICAgIHNlbGVjdF9hZGp1c3QgPSBzZWxlY3Rpb25fYWRqdXN0CisgICAgZGVmIHNlbGVjdGlvbl9jbGVhcihzZWxmKToKKyAgICAgICAgIiIiQ2xlYXIgdGhlIHNlbGVjdGlvbiBpZiBpdCBpcyBpbiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnY2xlYXInKQorICAgIHNlbGVjdF9jbGVhciA9IHNlbGVjdGlvbl9jbGVhcgorICAgIGRlZiBzZWxlY3Rpb25fZnJvbShzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlNldCB0aGUgZml4ZWQgZW5kIG9mIGEgc2VsZWN0aW9uIHRvIElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdmcm9tJywgaW5kZXgpCisgICAgc2VsZWN0X2Zyb20gPSBzZWxlY3Rpb25fZnJvbQorICAgIGRlZiBzZWxlY3Rpb25fcHJlc2VudChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIGNoYXJhY3RlcnMgc2VsZWN0ZWQgaW4gdGhlIGVudHJ5LCBGYWxzZQorICAgICAgICBvdGhlcndpc2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdwcmVzZW50JykpCisgICAgc2VsZWN0X3ByZXNlbnQgPSBzZWxlY3Rpb25fcHJlc2VudAorICAgIGRlZiBzZWxlY3Rpb25fcmFuZ2Uoc2VsZiwgc3RhcnQsIGVuZCk6CisgICAgICAgICIiIlNldCB0aGUgc2VsZWN0aW9uIGZyb20gU1RBUlQgdG8gRU5EIChub3QgaW5jbHVkZWQpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdyYW5nZScsIHN0YXJ0LCBlbmQpCisgICAgc2VsZWN0X3JhbmdlID0gc2VsZWN0aW9uX3JhbmdlCisgICAgZGVmIHNlbGVjdGlvbl90byhzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlNldCB0aGUgdmFyaWFibGUgZW5kIG9mIGEgc2VsZWN0aW9uIHRvIElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICd0bycsIGluZGV4KQorICAgIHNlbGVjdF90byA9IHNlbGVjdGlvbl90bworCitjbGFzcyBGcmFtZShXaWRnZXQpOgorICAgICIiIkZyYW1lIHdpZGdldCB3aGljaCBtYXkgY29udGFpbiBvdGhlciB3aWRnZXRzIGFuZCBjYW4gaGF2ZSBhIDNEIGJvcmRlci4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIGZyYW1lIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBiYWNrZ3JvdW5kLCBiZCwgYmcsIGJvcmRlcndpZHRoLCBjbGFzcywKKyAgICAgICAgY29sb3JtYXAsIGNvbnRhaW5lciwgY3Vyc29yLCBoZWlnaHQsIGhpZ2hsaWdodGJhY2tncm91bmQsCisgICAgICAgIGhpZ2hsaWdodGNvbG9yLCBoaWdobGlnaHR0aGlja25lc3MsIHJlbGllZiwgdGFrZWZvY3VzLCB2aXN1YWwsIHdpZHRoLiIiIgorICAgICAgICBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBleHRyYSA9ICgpCisgICAgICAgIGlmICdjbGFzc18nIGluIGNuZjoKKyAgICAgICAgICAgIGV4dHJhID0gKCctY2xhc3MnLCBjbmZbJ2NsYXNzXyddKQorICAgICAgICAgICAgZGVsIGNuZlsnY2xhc3NfJ10KKyAgICAgICAgZWxpZiAnY2xhc3MnIGluIGNuZjoKKyAgICAgICAgICAgIGV4dHJhID0gKCctY2xhc3MnLCBjbmZbJ2NsYXNzJ10pCisgICAgICAgICAgICBkZWwgY25mWydjbGFzcyddCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdmcmFtZScsIGNuZiwge30sIGV4dHJhKQorCitjbGFzcyBMYWJlbChXaWRnZXQpOgorICAgICIiIkxhYmVsIHdpZGdldCB3aGljaCBjYW4gZGlzcGxheSB0ZXh0IGFuZCBiaXRtYXBzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgbGFiZWwgd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBNQVNURVIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBhY3RpdmViYWNrZ3JvdW5kLCBhY3RpdmVmb3JlZ3JvdW5kLCBhbmNob3IsCisgICAgICAgICAgICBiYWNrZ3JvdW5kLCBiaXRtYXAsIGJvcmRlcndpZHRoLCBjdXJzb3IsCisgICAgICAgICAgICBkaXNhYmxlZGZvcmVncm91bmQsIGZvbnQsIGZvcmVncm91bmQsCisgICAgICAgICAgICBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwKKyAgICAgICAgICAgIGhpZ2hsaWdodHRoaWNrbmVzcywgaW1hZ2UsIGp1c3RpZnksCisgICAgICAgICAgICBwYWR4LCBwYWR5LCByZWxpZWYsIHRha2Vmb2N1cywgdGV4dCwKKyAgICAgICAgICAgIHRleHR2YXJpYWJsZSwgdW5kZXJsaW5lLCB3cmFwbGVuZ3RoCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgaGVpZ2h0LCBzdGF0ZSwgd2lkdGgKKworICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ2xhYmVsJywgY25mLCBrdykKKworY2xhc3MgTGlzdGJveChXaWRnZXQsIFhWaWV3LCBZVmlldyk6CisgICAgIiIiTGlzdGJveCB3aWRnZXQgd2hpY2ggY2FuIGRpc3BsYXkgYSBsaXN0IG9mIHN0cmluZ3MuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBsaXN0Ym94IHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBiYWNrZ3JvdW5kLCBiZCwgYmcsIGJvcmRlcndpZHRoLCBjdXJzb3IsCisgICAgICAgIGV4cG9ydHNlbGVjdGlvbiwgZmcsIGZvbnQsIGZvcmVncm91bmQsIGhlaWdodCwgaGlnaGxpZ2h0YmFja2dyb3VuZCwKKyAgICAgICAgaGlnaGxpZ2h0Y29sb3IsIGhpZ2hsaWdodHRoaWNrbmVzcywgcmVsaWVmLCBzZWxlY3RiYWNrZ3JvdW5kLAorICAgICAgICBzZWxlY3Rib3JkZXJ3aWR0aCwgc2VsZWN0Zm9yZWdyb3VuZCwgc2VsZWN0bW9kZSwgc2V0Z3JpZCwgdGFrZWZvY3VzLAorICAgICAgICB3aWR0aCwgeHNjcm9sbGNvbW1hbmQsIHlzY3JvbGxjb21tYW5kLCBsaXN0dmFyaWFibGUuIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdsaXN0Ym94JywgY25mLCBrdykKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJBY3RpdmF0ZSBpdGVtIGlkZW50aWZpZWQgYnkgSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnYWN0aXZhdGUnLCBpbmRleCkKKyAgICBkZWYgYmJveChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIG9mIFgxLFkxLFgyLFkyIGNvb3JkaW5hdGVzIGZvciBhIHJlY3RhbmdsZQorICAgICAgICB3aGljaCBlbmNsb3NlcyB0aGUgaXRlbSBpZGVudGlmaWVkIGJ5IGluZGV4IGluIEFSR1MuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnYmJveCcpICsgYXJncykpIG9yIE5vbmUKKyAgICBkZWYgY3Vyc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBpbmRpY2VzIG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLiIiIgorICAgICAgICAjIFhYWCBPdWdodCB0byBhcHBseSBzZWxmLl9nZXRpbnRzKCkuLi4KKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICdjdXJzZWxlY3Rpb24nKSkKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGZpcnN0LCBsYXN0PU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgaXRlbXMgZnJvbSBGSVJTVCB0byBMQVNUIChub3QgaW5jbHVkZWQpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIGZpcnN0LCBsYXN0KQorICAgIGRlZiBnZXQoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgICIiIkdldCBsaXN0IG9mIGl0ZW1zIGZyb20gRklSU1QgdG8gTEFTVCAobm90IGluY2x1ZGVkKS4iIiIKKyAgICAgICAgaWYgbGFzdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgc2VsZi5fdywgJ2dldCcsIGZpcnN0LCBsYXN0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2dldCcsIGZpcnN0KQorICAgIGRlZiBpbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJldHVybiBpbmRleCBvZiBpdGVtIGlkZW50aWZpZWQgd2l0aCBJTkRFWC4iIiIKKyAgICAgICAgaSA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW5kZXgnLCBpbmRleCkKKyAgICAgICAgaWYgaSA9PSAnbm9uZSc6IHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBnZXRpbnQoaSkKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCAqZWxlbWVudHMpOgorICAgICAgICAiIiJJbnNlcnQgRUxFTUVOVFMgYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ2luc2VydCcsIGluZGV4KSArIGVsZW1lbnRzKQorICAgIGRlZiBuZWFyZXN0KHNlbGYsIHkpOgorICAgICAgICAiIiJHZXQgaW5kZXggb2YgaXRlbSB3aGljaCBpcyBuZWFyZXN0IHRvIHkgY29vcmRpbmF0ZSBZLiIiIgorICAgICAgICByZXR1cm4gZ2V0aW50KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICduZWFyZXN0JywgeSkpCisgICAgZGVmIHNjYW5fbWFyayhzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmVtZW1iZXIgdGhlIGN1cnJlbnQgWCwgWSBjb29yZGluYXRlcy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzY2FuJywgJ21hcmsnLCB4LCB5KQorICAgIGRlZiBzY2FuX2RyYWd0byhzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiQWRqdXN0IHRoZSB2aWV3IG9mIHRoZSBsaXN0Ym94IHRvIDEwIHRpbWVzIHRoZQorICAgICAgICBkaWZmZXJlbmNlIGJldHdlZW4gWCBhbmQgWSBhbmQgdGhlIGNvb3JkaW5hdGVzIGdpdmVuIGluCisgICAgICAgIHNjYW5fbWFyay4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzY2FuJywgJ2RyYWd0bycsIHgsIHkpCisgICAgZGVmIHNlZShzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlNjcm9sbCBzdWNoIHRoYXQgSU5ERVggaXMgdmlzaWJsZS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWUnLCBpbmRleCkKKyAgICBkZWYgc2VsZWN0aW9uX2FuY2hvcihzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlNldCB0aGUgZml4ZWQgZW5kIG9mdCB0aGUgc2VsZWN0aW9uIHRvIElOREVYLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NlbGVjdGlvbicsICdhbmNob3InLCBpbmRleCkKKyAgICBzZWxlY3RfYW5jaG9yID0gc2VsZWN0aW9uX2FuY2hvcgorICAgIGRlZiBzZWxlY3Rpb25fY2xlYXIoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgICIiIkNsZWFyIHRoZSBzZWxlY3Rpb24gZnJvbSBGSVJTVCB0byBMQVNUIChub3QgaW5jbHVkZWQpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywKKyAgICAgICAgICAgICAgICAgJ3NlbGVjdGlvbicsICdjbGVhcicsIGZpcnN0LCBsYXN0KQorICAgIHNlbGVjdF9jbGVhciA9IHNlbGVjdGlvbl9jbGVhcgorICAgIGRlZiBzZWxlY3Rpb25faW5jbHVkZXMoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gMSBpZiBJTkRFWCBpcyBwYXJ0IG9mIHRoZSBzZWxlY3Rpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ3NlbGVjdGlvbicsICdpbmNsdWRlcycsIGluZGV4KSkKKyAgICBzZWxlY3RfaW5jbHVkZXMgPSBzZWxlY3Rpb25faW5jbHVkZXMKKyAgICBkZWYgc2VsZWN0aW9uX3NldChzZWxmLCBmaXJzdCwgbGFzdD1Ob25lKToKKyAgICAgICAgIiIiU2V0IHRoZSBzZWxlY3Rpb24gZnJvbSBGSVJTVCB0byBMQVNUIChub3QgaW5jbHVkZWQpIHdpdGhvdXQKKyAgICAgICAgY2hhbmdpbmcgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWxlY3Rpb24nLCAnc2V0JywgZmlyc3QsIGxhc3QpCisgICAgc2VsZWN0X3NldCA9IHNlbGVjdGlvbl9zZXQKKyAgICBkZWYgc2l6ZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGxpc3Rib3guIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoc2VsZi50ay5jYWxsKHNlbGYuX3csICdzaXplJykpCisgICAgZGVmIGl0ZW1jZ2V0KHNlbGYsIGluZGV4LCBvcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHJlc291cmNlIHZhbHVlIGZvciBhbiBJVEVNIGFuZCBhbiBPUFRJT04uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAoc2VsZi5fdywgJ2l0ZW1jZ2V0JykgKyAoaW5kZXgsICctJytvcHRpb24pKQorICAgIGRlZiBpdGVtY29uZmlndXJlKHNlbGYsIGluZGV4LCBjbmY9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSByZXNvdXJjZXMgb2YgYW4gSVRFTS4KKworICAgICAgICBUaGUgdmFsdWVzIGZvciByZXNvdXJjZXMgYXJlIHNwZWNpZmllZCBhcyBrZXl3b3JkIGFyZ3VtZW50cy4KKyAgICAgICAgVG8gZ2V0IGFuIG92ZXJ2aWV3IGFib3V0IHRoZSBhbGxvd2VkIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIGNhbGwgdGhlIG1ldGhvZCB3aXRob3V0IGFyZ3VtZW50cy4KKyAgICAgICAgVmFsaWQgcmVzb3VyY2UgbmFtZXM6IGJhY2tncm91bmQsIGJnLCBmb3JlZ3JvdW5kLCBmZywKKyAgICAgICAgc2VsZWN0YmFja2dyb3VuZCwgc2VsZWN0Zm9yZWdyb3VuZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgoJ2l0ZW1jb25maWd1cmUnLCBpbmRleCksIGNuZiwga3cpCisgICAgaXRlbWNvbmZpZyA9IGl0ZW1jb25maWd1cmUKKworY2xhc3MgTWVudShXaWRnZXQpOgorICAgICIiIk1lbnUgd2lkZ2V0IHdoaWNoIGFsbG93cyB0byBkaXNwbGF5IG1lbnUgYmFycywgcHVsbC1kb3duIG1lbnVzIGFuZCBwb3AtdXAgbWVudXMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgbWVudSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYWN0aXZlYmFja2dyb3VuZCwgYWN0aXZlYm9yZGVyd2lkdGgsCisgICAgICAgIGFjdGl2ZWZvcmVncm91bmQsIGJhY2tncm91bmQsIGJkLCBiZywgYm9yZGVyd2lkdGgsIGN1cnNvciwKKyAgICAgICAgZGlzYWJsZWRmb3JlZ3JvdW5kLCBmZywgZm9udCwgZm9yZWdyb3VuZCwgcG9zdGNvbW1hbmQsIHJlbGllZiwKKyAgICAgICAgc2VsZWN0Y29sb3IsIHRha2Vmb2N1cywgdGVhcm9mZiwgdGVhcm9mZmNvbW1hbmQsIHRpdGxlLCB0eXBlLiIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnbWVudScsIGNuZiwga3cpCisgICAgZGVmIHRrX2JpbmRGb3JUcmF2ZXJzYWwoc2VsZik6CisgICAgICAgIHBhc3MgIyBvYnNvbGV0ZSBzaW5jZSBUayA0LjAKKyAgICBkZWYgdGtfbWJQb3N0KHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX21iUG9zdCcsIHNlbGYuX3cpCisgICAgZGVmIHRrX21iVW5wb3N0KHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX21iVW5wb3N0JykKKyAgICBkZWYgdGtfdHJhdmVyc2VUb01lbnUoc2VsZiwgY2hhcik6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfdHJhdmVyc2VUb01lbnUnLCBzZWxmLl93LCBjaGFyKQorICAgIGRlZiB0a190cmF2ZXJzZVdpdGhpbk1lbnUoc2VsZiwgY2hhcik6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfdHJhdmVyc2VXaXRoaW5NZW51Jywgc2VsZi5fdywgY2hhcikKKyAgICBkZWYgdGtfZ2V0TWVudUJ1dHRvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3RrX2dldE1lbnVCdXR0b25zJywgc2VsZi5fdykKKyAgICBkZWYgdGtfbmV4dE1lbnUoc2VsZiwgY291bnQpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX25leHRNZW51JywgY291bnQpCisgICAgZGVmIHRrX25leHRNZW51RW50cnkoc2VsZiwgY291bnQpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX25leHRNZW51RW50cnknLCBjb3VudCkKKyAgICBkZWYgdGtfaW52b2tlTWVudShzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19pbnZva2VNZW51Jywgc2VsZi5fdykKKyAgICBkZWYgdGtfZmlyc3RNZW51KHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX2ZpcnN0TWVudScsIHNlbGYuX3cpCisgICAgZGVmIHRrX21iQnV0dG9uRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a19tYkJ1dHRvbkRvd24nLCBzZWxmLl93KQorICAgIGRlZiB0a19wb3B1cChzZWxmLCB4LCB5LCBlbnRyeT0iIik6CisgICAgICAgICIiIlBvc3QgdGhlIG1lbnUgYXQgcG9zaXRpb24gWCxZIHdpdGggZW50cnkgRU5UUlkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfcG9wdXAnLCBzZWxmLl93LCB4LCB5LCBlbnRyeSkKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJBY3RpdmF0ZSBlbnRyeSBhdCBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdhY3RpdmF0ZScsIGluZGV4KQorICAgIGRlZiBhZGQoc2VsZiwgaXRlbVR5cGUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdhZGQnLCBpdGVtVHlwZSkgKworICAgICAgICAgICAgICAgICBzZWxmLl9vcHRpb25zKGNuZiwga3cpKQorICAgIGRlZiBhZGRfY2FzY2FkZShzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGQgaGllcmFyY2hpY2FsIG1lbnUgaXRlbS4iIiIKKyAgICAgICAgc2VsZi5hZGQoJ2Nhc2NhZGUnLCBjbmYgb3Iga3cpCisgICAgZGVmIGFkZF9jaGVja2J1dHRvbihzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGQgY2hlY2tidXR0b24gbWVudSBpdGVtLiIiIgorICAgICAgICBzZWxmLmFkZCgnY2hlY2tidXR0b24nLCBjbmYgb3Iga3cpCisgICAgZGVmIGFkZF9jb21tYW5kKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkFkZCBjb21tYW5kIG1lbnUgaXRlbS4iIiIKKyAgICAgICAgc2VsZi5hZGQoJ2NvbW1hbmQnLCBjbmYgb3Iga3cpCisgICAgZGVmIGFkZF9yYWRpb2J1dHRvbihzZWxmLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGRkIHJhZGlvIG1lbnUgaXRlbS4iIiIKKyAgICAgICAgc2VsZi5hZGQoJ3JhZGlvYnV0dG9uJywgY25mIG9yIGt3KQorICAgIGRlZiBhZGRfc2VwYXJhdG9yKHNlbGYsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkFkZCBzZXBhcmF0b3IuIiIiCisgICAgICAgIHNlbGYuYWRkKCdzZXBhcmF0b3InLCBjbmYgb3Iga3cpCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgaXRlbVR5cGUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdpbnNlcnQnLCBpbmRleCwgaXRlbVR5cGUpICsKKyAgICAgICAgICAgICAgICAgc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKyAgICBkZWYgaW5zZXJ0X2Nhc2NhZGUoc2VsZiwgaW5kZXgsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkFkZCBoaWVyYXJjaGljYWwgbWVudSBpdGVtIGF0IElOREVYLiIiIgorICAgICAgICBzZWxmLmluc2VydChpbmRleCwgJ2Nhc2NhZGUnLCBjbmYgb3Iga3cpCisgICAgZGVmIGluc2VydF9jaGVja2J1dHRvbihzZWxmLCBpbmRleCwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQWRkIGNoZWNrYnV0dG9uIG1lbnUgaXRlbSBhdCBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi5pbnNlcnQoaW5kZXgsICdjaGVja2J1dHRvbicsIGNuZiBvciBrdykKKyAgICBkZWYgaW5zZXJ0X2NvbW1hbmQoc2VsZiwgaW5kZXgsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkFkZCBjb21tYW5kIG1lbnUgaXRlbSBhdCBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi5pbnNlcnQoaW5kZXgsICdjb21tYW5kJywgY25mIG9yIGt3KQorICAgIGRlZiBpbnNlcnRfcmFkaW9idXR0b24oc2VsZiwgaW5kZXgsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkFkZGQgcmFkaW8gbWVudSBpdGVtIGF0IElOREVYLiIiIgorICAgICAgICBzZWxmLmluc2VydChpbmRleCwgJ3JhZGlvYnV0dG9uJywgY25mIG9yIGt3KQorICAgIGRlZiBpbnNlcnRfc2VwYXJhdG9yKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJBZGQgc2VwYXJhdG9yIGF0IElOREVYLiIiIgorICAgICAgICBzZWxmLmluc2VydChpbmRleCwgJ3NlcGFyYXRvcicsIGNuZiBvciBrdykKKyAgICBkZWYgZGVsZXRlKHNlbGYsIGluZGV4MSwgaW5kZXgyPU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgbWVudSBpdGVtcyBiZXR3ZWVuIElOREVYMSBhbmQgSU5ERVgyIChpbmNsdWRlZCkuIiIiCisgICAgICAgIGlmIGluZGV4MiBpcyBOb25lOgorICAgICAgICAgICAgaW5kZXgyID0gaW5kZXgxCisKKyAgICAgICAgbnVtX2luZGV4MSwgbnVtX2luZGV4MiA9IHNlbGYuaW5kZXgoaW5kZXgxKSwgc2VsZi5pbmRleChpbmRleDIpCisgICAgICAgIGlmIChudW1faW5kZXgxIGlzIE5vbmUpIG9yIChudW1faW5kZXgyIGlzIE5vbmUpOgorICAgICAgICAgICAgbnVtX2luZGV4MSwgbnVtX2luZGV4MiA9IDAsIC0xCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtX2luZGV4MSwgbnVtX2luZGV4MiArIDEpOgorICAgICAgICAgICAgaWYgJ2NvbW1hbmQnIGluIHNlbGYuZW50cnljb25maWcoaSk6CisgICAgICAgICAgICAgICAgYyA9IHN0cihzZWxmLmVudHJ5Y2dldChpLCAnY29tbWFuZCcpKQorICAgICAgICAgICAgICAgIGlmIGM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlY29tbWFuZChjKQorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIGluZGV4MSwgaW5kZXgyKQorICAgIGRlZiBlbnRyeWNnZXQoc2VsZiwgaW5kZXgsIG9wdGlvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgcmVzb3VyY2UgdmFsdWUgb2YgYW4gbWVudSBpdGVtIGZvciBPUFRJT04gYXQgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2VudHJ5Y2dldCcsIGluZGV4LCAnLScgKyBvcHRpb24pCisgICAgZGVmIGVudHJ5Y29uZmlndXJlKHNlbGYsIGluZGV4LCBjbmY9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBhIG1lbnUgaXRlbSBhdCBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgoJ2VudHJ5Y29uZmlndXJlJywgaW5kZXgpLCBjbmYsIGt3KQorICAgIGVudHJ5Y29uZmlnID0gZW50cnljb25maWd1cmUKKyAgICBkZWYgaW5kZXgoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGluZGV4IG9mIGEgbWVudSBpdGVtIGlkZW50aWZpZWQgYnkgSU5ERVguIiIiCisgICAgICAgIGkgPSBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZGV4JywgaW5kZXgpCisgICAgICAgIGlmIGkgPT0gJ25vbmUnOiByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gZ2V0aW50KGkpCisgICAgZGVmIGludm9rZShzZWxmLCBpbmRleCk6CisgICAgICAgICIiIkludm9rZSBhIG1lbnUgaXRlbSBpZGVudGlmaWVkIGJ5IElOREVYIGFuZCBleGVjdXRlCisgICAgICAgIHRoZSBhc3NvY2lhdGVkIGNvbW1hbmQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScsIGluZGV4KQorICAgIGRlZiBwb3N0KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJEaXNwbGF5IGEgbWVudSBhdCBwb3NpdGlvbiBYLFkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAncG9zdCcsIHgsIHkpCisgICAgZGVmIHR5cGUoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIG1lbnUgaXRlbSBhdCBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAndHlwZScsIGluZGV4KQorICAgIGRlZiB1bnBvc3Qoc2VsZik6CisgICAgICAgICIiIlVubWFwIGEgbWVudS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd1bnBvc3QnKQorICAgIGRlZiB5cG9zaXRpb24oc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHktcG9zaXRpb24gb2YgdGhlIHRvcG1vc3QgcGl4ZWwgb2YgdGhlIG1lbnUgaXRlbSBhdCBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAneXBvc2l0aW9uJywgaW5kZXgpKQorCitjbGFzcyBNZW51YnV0dG9uKFdpZGdldCk6CisgICAgIiIiTWVudWJ1dHRvbiB3aWRnZXQsIG9ic29sZXRlIHNpbmNlIFRrOC4wLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ21lbnVidXR0b24nLCBjbmYsIGt3KQorCitjbGFzcyBNZXNzYWdlKFdpZGdldCk6CisgICAgIiIiTWVzc2FnZSB3aWRnZXQgdG8gZGlzcGxheSBtdWx0aWxpbmUgdGV4dC4gT2Jzb2xldGUgc2luY2UgTGFiZWwgZG9lcyBpdCB0b28uIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAnbWVzc2FnZScsIGNuZiwga3cpCisKK2NsYXNzIFJhZGlvYnV0dG9uKFdpZGdldCk6CisgICAgIiIiUmFkaW9idXR0b24gd2lkZ2V0IHdoaWNoIHNob3dzIG9ubHkgb25lIG9mIHNldmVyYWwgYnV0dG9ucyBpbiBvbi1zdGF0ZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIGNuZj17fSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIHJhZGlvYnV0dG9uIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBhY3RpdmViYWNrZ3JvdW5kLCBhY3RpdmVmb3JlZ3JvdW5kLCBhbmNob3IsCisgICAgICAgIGJhY2tncm91bmQsIGJkLCBiZywgYml0bWFwLCBib3JkZXJ3aWR0aCwgY29tbWFuZCwgY3Vyc29yLAorICAgICAgICBkaXNhYmxlZGZvcmVncm91bmQsIGZnLCBmb250LCBmb3JlZ3JvdW5kLCBoZWlnaHQsCisgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLCBoaWdobGlnaHR0aGlja25lc3MsIGltYWdlLAorICAgICAgICBpbmRpY2F0b3JvbiwganVzdGlmeSwgcGFkeCwgcGFkeSwgcmVsaWVmLCBzZWxlY3Rjb2xvciwgc2VsZWN0aW1hZ2UsCisgICAgICAgIHN0YXRlLCB0YWtlZm9jdXMsIHRleHQsIHRleHR2YXJpYWJsZSwgdW5kZXJsaW5lLCB2YWx1ZSwgdmFyaWFibGUsCisgICAgICAgIHdpZHRoLCB3cmFwbGVuZ3RoLiIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAncmFkaW9idXR0b24nLCBjbmYsIGt3KQorICAgIGRlZiBkZXNlbGVjdChzZWxmKToKKyAgICAgICAgIiIiUHV0IHRoZSBidXR0b24gaW4gb2ZmLXN0YXRlLiIiIgorCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVzZWxlY3QnKQorICAgIGRlZiBmbGFzaChzZWxmKToKKyAgICAgICAgIiIiRmxhc2ggdGhlIGJ1dHRvbi4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdmbGFzaCcpCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgIiIiVG9nZ2xlIHRoZSBidXR0b24gYW5kIGludm9rZSBhIGNvbW1hbmQgaWYgZ2l2ZW4gYXMgcmVzb3VyY2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ludm9rZScpCisgICAgZGVmIHNlbGVjdChzZWxmKToKKyAgICAgICAgIiIiUHV0IHRoZSBidXR0b24gaW4gb24tc3RhdGUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2VsZWN0JykKKworY2xhc3MgU2NhbGUoV2lkZ2V0KToKKyAgICAiIiJTY2FsZSB3aWRnZXQgd2hpY2ggY2FuIGRpc3BsYXkgYSBudW1lcmljYWwgc2NhbGUuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBzY2FsZSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYWN0aXZlYmFja2dyb3VuZCwgYmFja2dyb3VuZCwgYmlnaW5jcmVtZW50LCBiZCwKKyAgICAgICAgYmcsIGJvcmRlcndpZHRoLCBjb21tYW5kLCBjdXJzb3IsIGRpZ2l0cywgZmcsIGZvbnQsIGZvcmVncm91bmQsIGZyb20sCisgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLCBoaWdobGlnaHR0aGlja25lc3MsIGxhYmVsLAorICAgICAgICBsZW5ndGgsIG9yaWVudCwgcmVsaWVmLCByZXBlYXRkZWxheSwgcmVwZWF0aW50ZXJ2YWwsIHJlc29sdXRpb24sCisgICAgICAgIHNob3d2YWx1ZSwgc2xpZGVybGVuZ3RoLCBzbGlkZXJyZWxpZWYsIHN0YXRlLCB0YWtlZm9jdXMsCisgICAgICAgIHRpY2tpbnRlcnZhbCwgdG8sIHRyb3VnaGNvbG9yLCB2YXJpYWJsZSwgd2lkdGguIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdzY2FsZScsIGNuZiwga3cpCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IHZhbHVlIGFzIGludGVnZXIgb3IgZmxvYXQuIiIiCisgICAgICAgIHZhbHVlID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZ2V0aW50KHZhbHVlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBnZXRkb3VibGUodmFsdWUpCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWUgdG8gVkFMVUUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnc2V0JywgdmFsdWUpCisgICAgZGVmIGNvb3JkcyhzZWxmLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHVwbGUgKFgsWSkgb2YgdGhlIHBvaW50IGFsb25nIHRoZSBjZW50ZXJsaW5lIG9mIHRoZQorICAgICAgICB0cm91Z2ggdGhhdCBjb3JyZXNwb25kcyB0byBWQUxVRSBvciB0aGUgY3VycmVudCB2YWx1ZSBpZiBOb25lIGlzCisgICAgICAgIGdpdmVuLiIiIgorCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKHNlbGYudGsuY2FsbChzZWxmLl93LCAnY29vcmRzJywgdmFsdWUpKQorICAgIGRlZiBpZGVudGlmeShzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJuIHdoZXJlIHRoZSBwb2ludCBYLFkgbGllcy4gVmFsaWQgcmV0dXJuIHZhbHVlcyBhcmUgInNsaWRlciIsCisgICAgICAgICJ0aG91Z2gxIiBhbmQgInRob3VnaDIiLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpZGVudGlmeScsIHgsIHkpCisKK2NsYXNzIFNjcm9sbGJhcihXaWRnZXQpOgorICAgICIiIlNjcm9sbGJhciB3aWRnZXQgd2hpY2ggZGlzcGxheXMgYSBzbGlkZXIgYXQgYSBjZXJ0YWluIHBvc2l0aW9uLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgc2Nyb2xsYmFyIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFZhbGlkIHJlc291cmNlIG5hbWVzOiBhY3RpdmViYWNrZ3JvdW5kLCBhY3RpdmVyZWxpZWYsCisgICAgICAgIGJhY2tncm91bmQsIGJkLCBiZywgYm9yZGVyd2lkdGgsIGNvbW1hbmQsIGN1cnNvciwKKyAgICAgICAgZWxlbWVudGJvcmRlcndpZHRoLCBoaWdobGlnaHRiYWNrZ3JvdW5kLAorICAgICAgICBoaWdobGlnaHRjb2xvciwgaGlnaGxpZ2h0dGhpY2tuZXNzLCBqdW1wLCBvcmllbnQsCisgICAgICAgIHJlbGllZiwgcmVwZWF0ZGVsYXksIHJlcGVhdGludGVydmFsLCB0YWtlZm9jdXMsCisgICAgICAgIHRyb3VnaGNvbG9yLCB3aWR0aC4iIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3Njcm9sbGJhcicsIGNuZiwga3cpCisgICAgZGVmIGFjdGl2YXRlKHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiRGlzcGxheSB0aGUgZWxlbWVudCBhdCBJTkRFWCB3aXRoIGFjdGl2ZWJhY2tncm91bmQgYW5kIGFjdGl2ZXJlbGllZi4KKyAgICAgICAgSU5ERVggY2FuIGJlICJhcnJvdzEiLCJzbGlkZXIiIG9yICJhcnJvdzIiLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2FjdGl2YXRlJywgaW5kZXgpCisgICAgZGVmIGRlbHRhKHNlbGYsIGRlbHRheCwgZGVsdGF5KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmcmFjdGlvbmFsIGNoYW5nZSBvZiB0aGUgc2Nyb2xsYmFyIHNldHRpbmcgaWYgaXQKKyAgICAgICAgd291bGQgYmUgbW92ZWQgYnkgREVMVEFYIG9yIERFTFRBWSBwaXhlbHMuIiIiCisgICAgICAgIHJldHVybiBnZXRkb3VibGUoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbHRhJywgZGVsdGF4LCBkZWx0YXkpKQorICAgIGRlZiBmcmFjdGlvbihzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmcmFjdGlvbmFsIHZhbHVlIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEgc2xpZGVyCisgICAgICAgIHBvc2l0aW9uIG9mIFgsWS4iIiIKKyAgICAgICAgcmV0dXJuIGdldGRvdWJsZShzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ZyYWN0aW9uJywgeCwgeSkpCisgICAgZGVmIGlkZW50aWZ5KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGVsZW1lbnQgdW5kZXIgcG9zaXRpb24gWCxZIGFzIG9uZSBvZgorICAgICAgICAiYXJyb3cxIiwic2xpZGVyIiwiYXJyb3cyIiBvciAiIi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaWRlbnRpZnknLCB4LCB5KQorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgY3VycmVudCBmcmFjdGlvbmFsIHZhbHVlcyAodXBwZXIgYW5kIGxvd2VyIGVuZCkKKyAgICAgICAgb2YgdGhlIHNsaWRlciBwb3NpdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGRvdWJsZXMoc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXQnKSkKKyAgICBkZWYgc2V0KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiU2V0IHRoZSBmcmFjdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2xpZGVyIHBvc2l0aW9uICh1cHBlciBhbmQKKyAgICAgICAgbG93ZXIgZW5kcyBhcyB2YWx1ZSBiZXR3ZWVuIDAgYW5kIDEpLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdzZXQnKSArIGFyZ3MpCisKKworCitjbGFzcyBUZXh0KFdpZGdldCwgWFZpZXcsIFlWaWV3KToKKyAgICAiIiJUZXh0IHdpZGdldCB3aGljaCBjYW4gZGlzcGxheSB0ZXh0IGluIHZhcmlvdXMgZm9ybXMuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSB0ZXh0IHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgYmFja2dyb3VuZCwgYm9yZGVyd2lkdGgsIGN1cnNvciwKKyAgICAgICAgICAgIGV4cG9ydHNlbGVjdGlvbiwgZm9udCwgZm9yZWdyb3VuZCwKKyAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLAorICAgICAgICAgICAgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbnNlcnRiYWNrZ3JvdW5kLAorICAgICAgICAgICAgaW5zZXJ0Ym9yZGVyd2lkdGgsIGluc2VydG9mZnRpbWUsCisgICAgICAgICAgICBpbnNlcnRvbnRpbWUsIGluc2VydHdpZHRoLCBwYWR4LCBwYWR5LAorICAgICAgICAgICAgcmVsaWVmLCBzZWxlY3RiYWNrZ3JvdW5kLAorICAgICAgICAgICAgc2VsZWN0Ym9yZGVyd2lkdGgsIHNlbGVjdGZvcmVncm91bmQsCisgICAgICAgICAgICBzZXRncmlkLCB0YWtlZm9jdXMsCisgICAgICAgICAgICB4c2Nyb2xsY29tbWFuZCwgeXNjcm9sbGNvbW1hbmQsCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgYXV0b3NlcGFyYXRvcnMsIGhlaWdodCwgbWF4dW5kbywKKyAgICAgICAgICAgIHNwYWNpbmcxLCBzcGFjaW5nMiwgc3BhY2luZzMsCisgICAgICAgICAgICBzdGF0ZSwgdGFicywgdW5kbywgd2lkdGgsIHdyYXAsCisKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0ZXh0JywgY25mLCBrdykKKyAgICBkZWYgYmJveChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJldHVybiBhIHR1cGxlIG9mICh4LHksd2lkdGgsaGVpZ2h0KSB3aGljaCBnaXZlcyB0aGUgYm91bmRpbmcKKyAgICAgICAgYm94IG9mIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIGNoYXJhY3RlciBhdCB0aGUgaW5kZXggaW4gQVJHUy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldGludHMoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICdiYm94JykgKyBhcmdzKSkgb3IgTm9uZQorICAgIGRlZiB0a190ZXh0U2VsZWN0VG8oc2VsZiwgaW5kZXgpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3RleHRTZWxlY3RUbycsIHNlbGYuX3csIGluZGV4KQorICAgIGRlZiB0a190ZXh0QmFja3NwYWNlKHNlbGYpOgorICAgICAgICBzZWxmLnRrLmNhbGwoJ3RrX3RleHRCYWNrc3BhY2UnLCBzZWxmLl93KQorICAgIGRlZiB0a190ZXh0SW5kZXhDbG9zZXIoc2VsZiwgYSwgYiwgYyk6CisgICAgICAgIHNlbGYudGsuY2FsbCgndGtfdGV4dEluZGV4Q2xvc2VyJywgc2VsZi5fdywgYSwgYiwgYykKKyAgICBkZWYgdGtfdGV4dFJlc2V0QW5jaG9yKHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi50ay5jYWxsKCd0a190ZXh0UmVzZXRBbmNob3InLCBzZWxmLl93LCBpbmRleCkKKyAgICBkZWYgY29tcGFyZShzZWxmLCBpbmRleDEsIG9wLCBpbmRleDIpOgorICAgICAgICAiIiJSZXR1cm4gd2hldGhlciBiZXR3ZWVuIGluZGV4IElOREVYMSBhbmQgaW5kZXggSU5ERVgyIHRoZQorICAgICAgICByZWxhdGlvbiBPUCBpcyBzYXRpc2ZpZWQuIE9QIGlzIG9uZSBvZiA8LCA8PSwgPT0sID49LCA+LCBvciAhPS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuZ2V0Ym9vbGVhbihzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAnY29tcGFyZScsIGluZGV4MSwgb3AsIGluZGV4MikpCisgICAgZGVmIGRlYnVnKHNlbGYsIGJvb2xlYW49Tm9uZSk6CisgICAgICAgICIiIlR1cm4gb24gdGhlIGludGVybmFsIGNvbnNpc3RlbmN5IGNoZWNrcyBvZiB0aGUgQi1UcmVlIGluc2lkZSB0aGUgdGV4dAorICAgICAgICB3aWRnZXQgYWNjb3JkaW5nIHRvIEJPT0xFQU4uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmdldGJvb2xlYW4oc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ2RlYnVnJywgYm9vbGVhbikpCisgICAgZGVmIGRlbGV0ZShzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gSU5ERVgxIGFuZCBJTkRFWDIgKG5vdCBpbmNsdWRlZCkuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZGVsZXRlJywgaW5kZXgxLCBpbmRleDIpCisgICAgZGVmIGRsaW5laW5mbyhzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJldHVybiB0dXBsZSAoeCx5LHdpZHRoLGhlaWdodCxiYXNlbGluZSkgZ2l2aW5nIHRoZSBib3VuZGluZyBib3gKKyAgICAgICAgYW5kIGJhc2VsaW5lIHBvc2l0aW9uIG9mIHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIGxpbmUgY29udGFpbmluZworICAgICAgICB0aGUgY2hhcmFjdGVyIGF0IElOREVYLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RsaW5laW5mbycsIGluZGV4KSkKKyAgICBkZWYgZHVtcChzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lLCBjb21tYW5kPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSB3aWRnZXQgYmV0d2VlbiBpbmRleDEgYW5kIGluZGV4Mi4KKworICAgICAgICBUaGUgdHlwZSBvZiBjb250ZW50cyByZXR1cm5lZCBpbiBmaWx0ZXJlZCBiYXNlZCBvbiB0aGUga2V5d29yZAorICAgICAgICBwYXJhbWV0ZXJzOyBpZiAnYWxsJywgJ2ltYWdlJywgJ21hcmsnLCAndGFnJywgJ3RleHQnLCBvciAnd2luZG93JyBhcmUKKyAgICAgICAgZ2l2ZW4gYW5kIHRydWUsIHRoZW4gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbXMgYXJlIHJldHVybmVkLiBUaGUgcmVzdWx0CisgICAgICAgIGlzIGEgbGlzdCBvZiB0cmlwbGVzIG9mIHRoZSBmb3JtIChrZXksIHZhbHVlLCBpbmRleCkuIElmIG5vbmUgb2YgdGhlCisgICAgICAgIGtleXdvcmRzIGFyZSB0cnVlIHRoZW4gJ2FsbCcgaXMgdXNlZCBieSBkZWZhdWx0LgorCisgICAgICAgIElmIHRoZSAnY29tbWFuZCcgYXJndW1lbnQgaXMgZ2l2ZW4sIGl0IGlzIGNhbGxlZCBvbmNlIGZvciBlYWNoIGVsZW1lbnQKKyAgICAgICAgb2YgdGhlIGxpc3Qgb2YgdHJpcGxlcywgd2l0aCB0aGUgdmFsdWVzIG9mIGVhY2ggdHJpcGxlIHNlcnZpbmcgYXMgdGhlCisgICAgICAgIGFyZ3VtZW50cyB0byB0aGUgZnVuY3Rpb24uIEluIHRoaXMgY2FzZSB0aGUgbGlzdCBpcyBub3QgcmV0dXJuZWQuIiIiCisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBmdW5jX25hbWUgPSBOb25lCisgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICAgICAgaWYgbm90IGNvbW1hbmQ6CisgICAgICAgICAgICAjIE5ldmVyIGNhbGwgdGhlIGR1bXAgY29tbWFuZCB3aXRob3V0IHRoZSAtY29tbWFuZCBmbGFnLCBzaW5jZSB0aGUKKyAgICAgICAgICAgICMgb3V0cHV0IGNvdWxkIGludm9sdmUgVGNsIHF1b3RpbmcgYW5kIHdvdWxkIGJlIGEgcGFpbiB0byBwYXJzZQorICAgICAgICAgICAgIyByaWdodC4gSW5zdGVhZCBqdXN0IHNldCB0aGUgY29tbWFuZCB0byBidWlsZCBhIGxpc3Qgb2YgdHJpcGxlcworICAgICAgICAgICAgIyBhcyBpZiB3ZSBoYWQgZG9uZSB0aGUgcGFyc2luZy4KKyAgICAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgICAgICBkZWYgYXBwZW5kX3RyaXBsZShrZXksIHZhbHVlLCBpbmRleCwgcmVzdWx0PXJlc3VsdCk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoa2V5LCB2YWx1ZSwgaW5kZXgpKQorICAgICAgICAgICAgY29tbWFuZCA9IGFwcGVuZF90cmlwbGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY29tbWFuZCwgc3RyKToKKyAgICAgICAgICAgICAgICBmdW5jX25hbWUgPSBjb21tYW5kID0gc2VsZi5fcmVnaXN0ZXIoY29tbWFuZCkKKyAgICAgICAgICAgIGFyZ3MgKz0gWyItY29tbWFuZCIsIGNvbW1hbmRdCisgICAgICAgICAgICBmb3Iga2V5IGluIGt3OgorICAgICAgICAgICAgICAgIGlmIGt3W2tleV06IGFyZ3MuYXBwZW5kKCItIiArIGtleSkKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGluZGV4MSkKKyAgICAgICAgICAgIGlmIGluZGV4MjoKKyAgICAgICAgICAgICAgICBhcmdzLmFwcGVuZChpbmRleDIpCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImR1bXAiLCAqYXJncykKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGZ1bmNfbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZWNvbW1hbmQoZnVuY19uYW1lKQorCisgICAgIyMgbmV3IGluIHRrOC40CisgICAgZGVmIGVkaXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJJbnRlcm5hbCBtZXRob2QKKworICAgICAgICBUaGlzIG1ldGhvZCBjb250cm9scyB0aGUgdW5kbyBtZWNoYW5pc20gYW5kCisgICAgICAgIHRoZSBtb2RpZmllZCBmbGFnLiBUaGUgZXhhY3QgYmVoYXZpb3Igb2YgdGhlCisgICAgICAgIGNvbW1hbmQgZGVwZW5kcyBvbiB0aGUgb3B0aW9uIGFyZ3VtZW50IHRoYXQKKyAgICAgICAgZm9sbG93cyB0aGUgZWRpdCBhcmd1bWVudC4gVGhlIGZvbGxvd2luZyBmb3JtcworICAgICAgICBvZiB0aGUgY29tbWFuZCBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDoKKworICAgICAgICBlZGl0X21vZGlmaWVkLCBlZGl0X3JlZG8sIGVkaXRfcmVzZXQsIGVkaXRfc2VwYXJhdG9yCisgICAgICAgIGFuZCBlZGl0X3VuZG8KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZWRpdCcsICphcmdzKQorCisgICAgZGVmIGVkaXRfbW9kaWZpZWQoc2VsZiwgYXJnPU5vbmUpOgorICAgICAgICAiIiJHZXQgb3IgU2V0IHRoZSBtb2RpZmllZCBmbGFnCisKKyAgICAgICAgSWYgYXJnIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgdGhlIG1vZGlmaWVkCisgICAgICAgIGZsYWcgb2YgdGhlIHdpZGdldC4gVGhlIGluc2VydCwgZGVsZXRlLCBlZGl0IHVuZG8gYW5kCisgICAgICAgIGVkaXQgcmVkbyBjb21tYW5kcyBvciB0aGUgdXNlciBjYW4gc2V0IG9yIGNsZWFyIHRoZQorICAgICAgICBtb2RpZmllZCBmbGFnLiBJZiBib29sZWFuIGlzIHNwZWNpZmllZCwgc2V0cyB0aGUKKyAgICAgICAgbW9kaWZpZWQgZmxhZyBvZiB0aGUgd2lkZ2V0IHRvIGFyZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVkaXQoIm1vZGlmaWVkIiwgYXJnKQorCisgICAgZGVmIGVkaXRfcmVkbyhzZWxmKToKKyAgICAgICAgIiIiUmVkbyB0aGUgbGFzdCB1bmRvbmUgZWRpdAorCisgICAgICAgIFdoZW4gdGhlIHVuZG8gb3B0aW9uIGlzIHRydWUsIHJlYXBwbGllcyB0aGUgbGFzdAorICAgICAgICB1bmRvbmUgZWRpdHMgcHJvdmlkZWQgbm8gb3RoZXIgZWRpdHMgd2VyZSBkb25lIHNpbmNlCisgICAgICAgIHRoZW4uIEdlbmVyYXRlcyBhbiBlcnJvciB3aGVuIHRoZSByZWRvIHN0YWNrIGlzIGVtcHR5LgorICAgICAgICBEb2VzIG5vdGhpbmcgd2hlbiB0aGUgdW5kbyBvcHRpb24gaXMgZmFsc2UuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0KCJyZWRvIikKKworICAgIGRlZiBlZGl0X3Jlc2V0KHNlbGYpOgorICAgICAgICAiIiJDbGVhcnMgdGhlIHVuZG8gYW5kIHJlZG8gc3RhY2tzCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5lZGl0KCJyZXNldCIpCisKKyAgICBkZWYgZWRpdF9zZXBhcmF0b3Ioc2VsZik6CisgICAgICAgICIiIkluc2VydHMgYSBzZXBhcmF0b3IgKGJvdW5kYXJ5KSBvbiB0aGUgdW5kbyBzdGFjay4KKworICAgICAgICBEb2VzIG5vdGhpbmcgd2hlbiB0aGUgdW5kbyBvcHRpb24gaXMgZmFsc2UKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVkaXQoInNlcGFyYXRvciIpCisKKyAgICBkZWYgZWRpdF91bmRvKHNlbGYpOgorICAgICAgICAiIiJVbmRvZXMgdGhlIGxhc3QgZWRpdCBhY3Rpb24KKworICAgICAgICBJZiB0aGUgdW5kbyBvcHRpb24gaXMgdHJ1ZS4gQW4gZWRpdCBhY3Rpb24gaXMgZGVmaW5lZAorICAgICAgICBhcyBhbGwgdGhlIGluc2VydCBhbmQgZGVsZXRlIGNvbW1hbmRzIHRoYXQgYXJlIHJlY29yZGVkCisgICAgICAgIG9uIHRoZSB1bmRvIHN0YWNrIGluIGJldHdlZW4gdHdvIHNlcGFyYXRvcnMuIEdlbmVyYXRlcworICAgICAgICBhbiBlcnJvciB3aGVuIHRoZSB1bmRvIHN0YWNrIGlzIGVtcHR5LiBEb2VzIG5vdGhpbmcKKyAgICAgICAgd2hlbiB0aGUgdW5kbyBvcHRpb24gaXMgZmFsc2UKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVkaXQoInVuZG8iKQorCisgICAgZGVmIGdldChzZWxmLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0ZXh0IGZyb20gSU5ERVgxIHRvIElOREVYMiAobm90IGluY2x1ZGVkKS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZ2V0JywgaW5kZXgxLCBpbmRleDIpCisgICAgIyAoSW1hZ2UgY29tbWFuZHMgYXJlIG5ldyBpbiA4LjApCisgICAgZGVmIGltYWdlX2NnZXQoc2VsZiwgaW5kZXgsIG9wdGlvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgT1BUSU9OIG9mIGFuIGVtYmVkZGVkIGltYWdlIGF0IElOREVYLiIiIgorICAgICAgICBpZiBvcHRpb25bOjFdICE9ICItIjoKKyAgICAgICAgICAgIG9wdGlvbiA9ICItIiArIG9wdGlvbgorICAgICAgICBpZiBvcHRpb25bLTE6XSA9PSAiXyI6CisgICAgICAgICAgICBvcHRpb24gPSBvcHRpb25bOi0xXQorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbWFnZSIsICJjZ2V0IiwgaW5kZXgsIG9wdGlvbikKKyAgICBkZWYgaW1hZ2VfY29uZmlndXJlKHNlbGYsIGluZGV4LCBjbmY9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBhbiBlbWJlZGRlZCBpbWFnZSBhdCBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgoJ2ltYWdlJywgJ2NvbmZpZ3VyZScsIGluZGV4KSwgY25mLCBrdykKKyAgICBkZWYgaW1hZ2VfY3JlYXRlKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgYW4gZW1iZWRkZWQgaW1hZ2UgYXQgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgIHNlbGYuX3csICJpbWFnZSIsICJjcmVhdGUiLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgKnNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgZGVmIGltYWdlX25hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIG5hbWVzIG9mIGVtYmVkZGVkIGltYWdlcyBpbiB0aGlzIHdpZGdldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW1hZ2UiLCAibmFtZXMiKQorICAgIGRlZiBpbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJldHVybiB0aGUgaW5kZXggaW4gdGhlIGZvcm0gbGluZS5jaGFyIGZvciBJTkRFWC4iIiIKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luZGV4JywgaW5kZXgpKQorICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGNoYXJzLCAqYXJncyk6CisgICAgICAgICIiIkluc2VydCBDSEFSUyBiZWZvcmUgdGhlIGNoYXJhY3RlcnMgYXQgSU5ERVguIEFuIGFkZGl0aW9uYWwKKyAgICAgICAgdGFnIGNhbiBiZSBnaXZlbiBpbiBBUkdTLiBBZGRpdGlvbmFsIENIQVJTIGFuZCB0YWdzIGNhbiBmb2xsb3cgaW4gQVJHUy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnaW5zZXJ0JywgaW5kZXgsIGNoYXJzKSArIGFyZ3MpCisgICAgZGVmIG1hcmtfZ3Jhdml0eShzZWxmLCBtYXJrTmFtZSwgZGlyZWN0aW9uPU5vbmUpOgorICAgICAgICAiIiJDaGFuZ2UgdGhlIGdyYXZpdHkgb2YgYSBtYXJrIE1BUktOQU1FIHRvIERJUkVDVElPTiAoTEVGVCBvciBSSUdIVCkuCisgICAgICAgIFJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBpZiBOb25lIGlzIGdpdmVuIGZvciBESVJFQ1RJT04uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAoc2VsZi5fdywgJ21hcmsnLCAnZ3Jhdml0eScsIG1hcmtOYW1lLCBkaXJlY3Rpb24pKQorICAgIGRlZiBtYXJrX25hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIG1hcmsgbmFtZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICBzZWxmLl93LCAnbWFyaycsICduYW1lcycpKQorICAgIGRlZiBtYXJrX3NldChzZWxmLCBtYXJrTmFtZSwgaW5kZXgpOgorICAgICAgICAiIiJTZXQgbWFyayBNQVJLTkFNRSBiZWZvcmUgdGhlIGNoYXJhY3RlciBhdCBJTkRFWC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdtYXJrJywgJ3NldCcsIG1hcmtOYW1lLCBpbmRleCkKKyAgICBkZWYgbWFya191bnNldChzZWxmLCAqbWFya05hbWVzKToKKyAgICAgICAgIiIiRGVsZXRlIGFsbCBtYXJrcyBpbiBNQVJLTkFNRVMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ21hcmsnLCAndW5zZXQnKSArIG1hcmtOYW1lcykKKyAgICBkZWYgbWFya19uZXh0KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBuZXh0IG1hcmsgYWZ0ZXIgSU5ERVguIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ21hcmsnLCAnbmV4dCcsIGluZGV4KSBvciBOb25lCisgICAgZGVmIG1hcmtfcHJldmlvdXMoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByZXZpb3VzIG1hcmsgYmVmb3JlIElOREVYLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdtYXJrJywgJ3ByZXZpb3VzJywgaW5kZXgpIG9yIE5vbmUKKyAgICBkZWYgc2Nhbl9tYXJrKHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJSZW1lbWJlciB0aGUgY3VycmVudCBYLCBZIGNvb3JkaW5hdGVzLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NjYW4nLCAnbWFyaycsIHgsIHkpCisgICAgZGVmIHNjYW5fZHJhZ3RvKHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJBZGp1c3QgdGhlIHZpZXcgb2YgdGhlIHRleHQgdG8gMTAgdGltZXMgdGhlCisgICAgICAgIGRpZmZlcmVuY2UgYmV0d2VlbiBYIGFuZCBZIGFuZCB0aGUgY29vcmRpbmF0ZXMgZ2l2ZW4gaW4KKyAgICAgICAgc2Nhbl9tYXJrLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3NjYW4nLCAnZHJhZ3RvJywgeCwgeSkKKyAgICBkZWYgc2VhcmNoKHNlbGYsIHBhdHRlcm4sIGluZGV4LCBzdG9waW5kZXg9Tm9uZSwKKyAgICAgICAgICAgZm9yd2FyZHM9Tm9uZSwgYmFja3dhcmRzPU5vbmUsIGV4YWN0PU5vbmUsCisgICAgICAgICAgIHJlZ2V4cD1Ob25lLCBub2Nhc2U9Tm9uZSwgY291bnQ9Tm9uZSwgZWxpZGU9Tm9uZSk6CisgICAgICAgICIiIlNlYXJjaCBQQVRURVJOIGJlZ2lubmluZyBmcm9tIElOREVYIHVudGlsIFNUT1BJTkRFWC4KKyAgICAgICAgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgbWF0Y2ggb3IgYW4KKyAgICAgICAgZW1wdHkgc3RyaW5nLiIiIgorICAgICAgICBhcmdzID0gW3NlbGYuX3csICdzZWFyY2gnXQorICAgICAgICBpZiBmb3J3YXJkczogYXJncy5hcHBlbmQoJy1mb3J3YXJkcycpCisgICAgICAgIGlmIGJhY2t3YXJkczogYXJncy5hcHBlbmQoJy1iYWNrd2FyZHMnKQorICAgICAgICBpZiBleGFjdDogYXJncy5hcHBlbmQoJy1leGFjdCcpCisgICAgICAgIGlmIHJlZ2V4cDogYXJncy5hcHBlbmQoJy1yZWdleHAnKQorICAgICAgICBpZiBub2Nhc2U6IGFyZ3MuYXBwZW5kKCctbm9jYXNlJykKKyAgICAgICAgaWYgZWxpZGU6IGFyZ3MuYXBwZW5kKCctZWxpZGUnKQorICAgICAgICBpZiBjb3VudDogYXJncy5hcHBlbmQoJy1jb3VudCcpOyBhcmdzLmFwcGVuZChjb3VudCkKKyAgICAgICAgaWYgcGF0dGVybiBhbmQgcGF0dGVyblswXSA9PSAnLSc6IGFyZ3MuYXBwZW5kKCctLScpCisgICAgICAgIGFyZ3MuYXBwZW5kKHBhdHRlcm4pCisgICAgICAgIGFyZ3MuYXBwZW5kKGluZGV4KQorICAgICAgICBpZiBzdG9waW5kZXg6IGFyZ3MuYXBwZW5kKHN0b3BpbmRleCkKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLnRrLmNhbGwodHVwbGUoYXJncykpKQorICAgIGRlZiBzZWUoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJTY3JvbGwgc3VjaCB0aGF0IHRoZSBjaGFyYWN0ZXIgYXQgSU5ERVggaXMgdmlzaWJsZS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICdzZWUnLCBpbmRleCkKKyAgICBkZWYgdGFnX2FkZChzZWxmLCB0YWdOYW1lLCBpbmRleDEsICphcmdzKToKKyAgICAgICAgIiIiQWRkIHRhZyBUQUdOQU1FIHRvIGFsbCBjaGFyYWN0ZXJzIGJldHdlZW4gSU5ERVgxIGFuZCBpbmRleDIgaW4gQVJHUy4KKyAgICAgICAgQWRkaXRpb25hbCBwYWlycyBvZiBpbmRpY2VzIG1heSBmb2xsb3cgaW4gQVJHUy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgKHNlbGYuX3csICd0YWcnLCAnYWRkJywgdGFnTmFtZSwgaW5kZXgxKSArIGFyZ3MpCisgICAgZGVmIHRhZ191bmJpbmQoc2VsZiwgdGFnTmFtZSwgc2VxdWVuY2UsIGZ1bmNpZD1Ob25lKToKKyAgICAgICAgIiIiVW5iaW5kIGZvciBhbGwgY2hhcmFjdGVycyB3aXRoIFRBR05BTUUgZm9yIGV2ZW50IFNFUVVFTkNFICB0aGUKKyAgICAgICAgZnVuY3Rpb24gaWRlbnRpZmllZCB3aXRoIEZVTkNJRC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd0YWcnLCAnYmluZCcsIHRhZ05hbWUsIHNlcXVlbmNlLCAnJykKKyAgICAgICAgaWYgZnVuY2lkOgorICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKGZ1bmNpZCkKKyAgICBkZWYgdGFnX2JpbmQoc2VsZiwgdGFnTmFtZSwgc2VxdWVuY2UsIGZ1bmMsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCB0byBhbGwgY2hhcmFjdGVycyB3aXRoIFRBR05BTUUgYXQgZXZlbnQgU0VRVUVOQ0UgYSBjYWxsIHRvIGZ1bmN0aW9uIEZVTkMuCisKKyAgICAgICAgQW4gYWRkaXRpb25hbCBib29sZWFuIHBhcmFtZXRlciBBREQgc3BlY2lmaWVzIHdoZXRoZXIgRlVOQyB3aWxsIGJlCisgICAgICAgIGNhbGxlZCBhZGRpdGlvbmFsbHkgdG8gdGhlIG90aGVyIGJvdW5kIGZ1bmN0aW9uIG9yIHdoZXRoZXIgaXQgd2lsbAorICAgICAgICByZXBsYWNlIHRoZSBwcmV2aW91cyBmdW5jdGlvbi4gU2VlIGJpbmQgZm9yIHRoZSByZXR1cm4gdmFsdWUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9iaW5kKChzZWxmLl93LCAndGFnJywgJ2JpbmQnLCB0YWdOYW1lKSwKKyAgICAgICAgICAgICAgICAgIHNlcXVlbmNlLCBmdW5jLCBhZGQpCisgICAgZGVmIHRhZ19jZ2V0KHNlbGYsIHRhZ05hbWUsIG9wdGlvbik6CisgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgT1BUSU9OIGZvciB0YWcgVEFHTkFNRS4iIiIKKyAgICAgICAgaWYgb3B0aW9uWzoxXSAhPSAnLSc6CisgICAgICAgICAgICBvcHRpb24gPSAnLScgKyBvcHRpb24KKyAgICAgICAgaWYgb3B0aW9uWy0xOl0gPT0gJ18nOgorICAgICAgICAgICAgb3B0aW9uID0gb3B0aW9uWzotMV0KKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAndGFnJywgJ2NnZXQnLCB0YWdOYW1lLCBvcHRpb24pCisgICAgZGVmIHRhZ19jb25maWd1cmUoc2VsZiwgdGFnTmFtZSwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgYSB0YWcgVEFHTkFNRS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbmZpZ3VyZSgoJ3RhZycsICdjb25maWd1cmUnLCB0YWdOYW1lKSwgY25mLCBrdykKKyAgICB0YWdfY29uZmlnID0gdGFnX2NvbmZpZ3VyZQorICAgIGRlZiB0YWdfZGVsZXRlKHNlbGYsICp0YWdOYW1lcyk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgdGFncyBpbiBUQUdOQU1FUy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAndGFnJywgJ2RlbGV0ZScpICsgdGFnTmFtZXMpCisgICAgZGVmIHRhZ19sb3dlcihzZWxmLCB0YWdOYW1lLCBiZWxvd1RoaXM9Tm9uZSk6CisgICAgICAgICIiIkNoYW5nZSB0aGUgcHJpb3JpdHkgb2YgdGFnIFRBR05BTUUgc3VjaCB0aGF0IGl0IGlzIGxvd2VyCisgICAgICAgIHRoYW4gdGhlIHByaW9yaXR5IG9mIEJFTE9XVEhJUy4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICd0YWcnLCAnbG93ZXInLCB0YWdOYW1lLCBiZWxvd1RoaXMpCisgICAgZGVmIHRhZ19uYW1lcyhzZWxmLCBpbmRleD1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGFnIG5hbWVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3QoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3RhZycsICduYW1lcycsIGluZGV4KSkKKyAgICBkZWYgdGFnX25leHRyYW5nZShzZWxmLCB0YWdOYW1lLCBpbmRleDEsIGluZGV4Mj1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBzdGFydCBhbmQgZW5kIGluZGV4IGZvciB0aGUgZmlyc3Qgc2VxdWVuY2Ugb2YKKyAgICAgICAgY2hhcmFjdGVycyBiZXR3ZWVuIElOREVYMSBhbmQgSU5ERVgyIHdoaWNoIGFsbCBoYXZlIHRhZyBUQUdOQU1FLgorICAgICAgICBUaGUgdGV4dCBpcyBzZWFyY2hlZCBmb3J3YXJkIGZyb20gSU5ERVgxLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ3RhZycsICduZXh0cmFuZ2UnLCB0YWdOYW1lLCBpbmRleDEsIGluZGV4MikpCisgICAgZGVmIHRhZ19wcmV2cmFuZ2Uoc2VsZiwgdGFnTmFtZSwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc3RhcnQgYW5kIGVuZCBpbmRleCBmb3IgdGhlIGZpcnN0IHNlcXVlbmNlIG9mCisgICAgICAgIGNoYXJhY3RlcnMgYmV0d2VlbiBJTkRFWDEgYW5kIElOREVYMiB3aGljaCBhbGwgaGF2ZSB0YWcgVEFHTkFNRS4KKyAgICAgICAgVGhlIHRleHQgaXMgc2VhcmNoZWQgYmFja3dhcmRzIGZyb20gSU5ERVgxLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5zcGxpdGxpc3Qoc2VsZi50ay5jYWxsKAorICAgICAgICAgICAgc2VsZi5fdywgJ3RhZycsICdwcmV2cmFuZ2UnLCB0YWdOYW1lLCBpbmRleDEsIGluZGV4MikpCisgICAgZGVmIHRhZ19yYWlzZShzZWxmLCB0YWdOYW1lLCBhYm92ZVRoaXM9Tm9uZSk6CisgICAgICAgICIiIkNoYW5nZSB0aGUgcHJpb3JpdHkgb2YgdGFnIFRBR05BTUUgc3VjaCB0aGF0IGl0IGlzIGhpZ2hlcgorICAgICAgICB0aGFuIHRoZSBwcmlvcml0eSBvZiBBQk9WRVRISVMuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICd0YWcnLCAncmFpc2UnLCB0YWdOYW1lLCBhYm92ZVRoaXMpCisgICAgZGVmIHRhZ19yYW5nZXMoc2VsZiwgdGFnTmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgcmFuZ2VzIG9mIHRleHQgd2hpY2ggaGF2ZSB0YWcgVEFHTkFNRS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICd0YWcnLCAncmFuZ2VzJywgdGFnTmFtZSkpCisgICAgZGVmIHRhZ19yZW1vdmUoc2VsZiwgdGFnTmFtZSwgaW5kZXgxLCBpbmRleDI9Tm9uZSk6CisgICAgICAgICIiIlJlbW92ZSB0YWcgVEFHTkFNRSBmcm9tIGFsbCBjaGFyYWN0ZXJzIGJldHdlZW4gSU5ERVgxIGFuZCBJTkRFWDIuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgIHNlbGYuX3csICd0YWcnLCAncmVtb3ZlJywgdGFnTmFtZSwgaW5kZXgxLCBpbmRleDIpCisgICAgZGVmIHdpbmRvd19jZ2V0KHNlbGYsIGluZGV4LCBvcHRpb24pOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIE9QVElPTiBvZiBhbiBlbWJlZGRlZCB3aW5kb3cgYXQgSU5ERVguIiIiCisgICAgICAgIGlmIG9wdGlvbls6MV0gIT0gJy0nOgorICAgICAgICAgICAgb3B0aW9uID0gJy0nICsgb3B0aW9uCisgICAgICAgIGlmIG9wdGlvblstMTpdID09ICdfJzoKKyAgICAgICAgICAgIG9wdGlvbiA9IG9wdGlvbls6LTFdCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ3dpbmRvdycsICdjZ2V0JywgaW5kZXgsIG9wdGlvbikKKyAgICBkZWYgd2luZG93X2NvbmZpZ3VyZShzZWxmLCBpbmRleCwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgYW4gZW1iZWRkZWQgd2luZG93IGF0IElOREVYLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fY29uZmlndXJlKCgnd2luZG93JywgJ2NvbmZpZ3VyZScsIGluZGV4KSwgY25mLCBrdykKKyAgICB3aW5kb3dfY29uZmlnID0gd2luZG93X2NvbmZpZ3VyZQorICAgIGRlZiB3aW5kb3dfY3JlYXRlKHNlbGYsIGluZGV4LCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgYSB3aW5kb3cgYXQgSU5ERVguIiIiCisgICAgICAgIHNlbGYudGsuY2FsbCgKKyAgICAgICAgICAgICAgKHNlbGYuX3csICd3aW5kb3cnLCAnY3JlYXRlJywgaW5kZXgpCisgICAgICAgICAgICAgICsgc2VsZi5fb3B0aW9ucyhjbmYsIGt3KSkKKyAgICBkZWYgd2luZG93X25hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYWxsIG5hbWVzIG9mIGVtYmVkZGVkIHdpbmRvd3MgaW4gdGhpcyB3aWRnZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLnNwbGl0bGlzdCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnd2luZG93JywgJ25hbWVzJykpCisgICAgZGVmIHl2aWV3X3BpY2twbGFjZShzZWxmLCAqd2hhdCk6CisgICAgICAgICIiIk9ic29sZXRlIGZ1bmN0aW9uLCB1c2Ugc2VlLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoKHNlbGYuX3csICd5dmlldycsICctcGlja3BsYWNlJykgKyB3aGF0KQorCisKK2NsYXNzIF9zZXRpdDoKKyAgICAiIiJJbnRlcm5hbCBjbGFzcy4gSXQgd3JhcHMgdGhlIGNvbW1hbmQgaW4gdGhlIHdpZGdldCBPcHRpb25NZW51LiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YXIsIHZhbHVlLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgc2VsZi5fX3ZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5fX3ZhciA9IHZhcgorICAgICAgICBzZWxmLl9fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX192YXIuc2V0KHNlbGYuX192YWx1ZSkKKyAgICAgICAgaWYgc2VsZi5fX2NhbGxiYWNrOgorICAgICAgICAgICAgc2VsZi5fX2NhbGxiYWNrKHNlbGYuX192YWx1ZSwgKmFyZ3MpCisKK2NsYXNzIE9wdGlvbk1lbnUoTWVudWJ1dHRvbik6CisgICAgIiIiT3B0aW9uTWVudSB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IGEgdmFsdWUgZnJvbSBhIG1lbnUuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFyaWFibGUsIHZhbHVlLCAqdmFsdWVzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhbiBvcHRpb25tZW51IHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLCB3aXRoCisgICAgICAgIHRoZSByZXNvdXJjZSB0ZXh0dmFyaWFibGUgc2V0IHRvIFZBUklBQkxFLCB0aGUgaW5pdGlhbGx5IHNlbGVjdGVkCisgICAgICAgIHZhbHVlIFZBTFVFLCB0aGUgb3RoZXIgbWVudSB2YWx1ZXMgVkFMVUVTIGFuZCBhbiBhZGRpdGlvbmFsCisgICAgICAgIGtleXdvcmQgYXJndW1lbnQgY29tbWFuZC4iIiIKKyAgICAgICAga3cgPSB7ImJvcmRlcndpZHRoIjogMiwgInRleHR2YXJpYWJsZSI6IHZhcmlhYmxlLAorICAgICAgICAgICAgICAiaW5kaWNhdG9yb24iOiAxLCAicmVsaWVmIjogUkFJU0VELCAiYW5jaG9yIjogImMiLAorICAgICAgICAgICAgICAiaGlnaGxpZ2h0dGhpY2tuZXNzIjogMn0KKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgIm1lbnVidXR0b24iLCBrdykKKyAgICAgICAgc2VsZi53aWRnZXROYW1lID0gJ3RrX29wdGlvbk1lbnUnCisgICAgICAgIG1lbnUgPSBzZWxmLl9fbWVudSA9IE1lbnUoc2VsZiwgbmFtZT0ibWVudSIsIHRlYXJvZmY9MCkKKyAgICAgICAgc2VsZi5tZW51bmFtZSA9IG1lbnUuX3cKKyAgICAgICAgIyAnY29tbWFuZCcgaXMgdGhlIG9ubHkgc3VwcG9ydGVkIGtleXdvcmQKKyAgICAgICAgY2FsbGJhY2sgPSBrd2FyZ3MuZ2V0KCdjb21tYW5kJykKKyAgICAgICAgaWYgJ2NvbW1hbmQnIGluIGt3YXJnczoKKyAgICAgICAgICAgIGRlbCBrd2FyZ3NbJ2NvbW1hbmQnXQorICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICByYWlzZSBUY2xFcnJvciwgJ3Vua25vd24gb3B0aW9uIC0nK2t3YXJncy5rZXlzKClbMF0KKyAgICAgICAgbWVudS5hZGRfY29tbWFuZChsYWJlbD12YWx1ZSwKKyAgICAgICAgICAgICAgICAgY29tbWFuZD1fc2V0aXQodmFyaWFibGUsIHZhbHVlLCBjYWxsYmFjaykpCisgICAgICAgIGZvciB2IGluIHZhbHVlczoKKyAgICAgICAgICAgIG1lbnUuYWRkX2NvbW1hbmQobGFiZWw9diwKKyAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ9X3NldGl0KHZhcmlhYmxlLCB2LCBjYWxsYmFjaykpCisgICAgICAgIHNlbGZbIm1lbnUiXSA9IG1lbnUKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKKyAgICAgICAgaWYgbmFtZSA9PSAnbWVudSc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX21lbnUKKyAgICAgICAgcmV0dXJuIFdpZGdldC5fX2dldGl0ZW1fXyhzZWxmLCBuYW1lKQorCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICIiIkRlc3Ryb3kgdGhpcyB3aWRnZXQgYW5kIHRoZSBhc3NvY2lhdGVkIG1lbnUuIiIiCisgICAgICAgIE1lbnVidXR0b24uZGVzdHJveShzZWxmKQorICAgICAgICBzZWxmLl9fbWVudSA9IE5vbmUKKworY2xhc3MgSW1hZ2U6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgaW1hZ2VzLiIiIgorICAgIF9sYXN0X2lkID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpbWd0eXBlLCBuYW1lPU5vbmUsIGNuZj17fSwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICBzZWxmLm5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBtYXN0ZXI6CisgICAgICAgICAgICBtYXN0ZXIgPSBfZGVmYXVsdF9yb290CisgICAgICAgICAgICBpZiBub3QgbWFzdGVyOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ1RvbyBlYXJseSB0byBjcmVhdGUgaW1hZ2UnCisgICAgICAgIHNlbGYudGsgPSBtYXN0ZXIudGsKKyAgICAgICAgaWYgbm90IG5hbWU6CisgICAgICAgICAgICBJbWFnZS5fbGFzdF9pZCArPSAxCisgICAgICAgICAgICBuYW1lID0gInB5aW1hZ2UlciIgJSAoSW1hZ2UuX2xhc3RfaWQsKSAjIHRrIGl0c2VsZiB3b3VsZCB1c2UgaW1hZ2U8eD4KKyAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBpcyBuZWVkZWQgZm9yIHN5c3RlbXMgd2hlcmUgaWQoeCkKKyAgICAgICAgICAgICMgY2FuIHJldHVybiBhIG5lZ2F0aXZlIG51bWJlciwgc3VjaCBhcyBMaW51eC9tNjhrOgorICAgICAgICAgICAgaWYgbmFtZVswXSA9PSAnLSc6IG5hbWUgPSAnXycgKyBuYW1lWzE6XQorICAgICAgICBpZiBrdyBhbmQgY25mOiBjbmYgPSBfY25mbWVyZ2UoKGNuZiwga3cpKQorICAgICAgICBlbGlmIGt3OiBjbmYgPSBrdworICAgICAgICBvcHRpb25zID0gKCkKKyAgICAgICAgZm9yIGssIHYgaW4gY25mLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHYsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgICAgIHYgPSBzZWxmLl9yZWdpc3Rlcih2KQorICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgKyAoJy0nK2ssIHYpCisgICAgICAgIHNlbGYudGsuY2FsbCgoJ2ltYWdlJywgJ2NyZWF0ZScsIGltZ3R5cGUsIG5hbWUsKSArIG9wdGlvbnMpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICBkZWYgX19zdHJfXyhzZWxmKTogcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm5hbWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi50ay5jYWxsKCdpbWFnZScsICdkZWxldGUnLCBzZWxmLm5hbWUpCisgICAgICAgICAgICBleGNlcHQgVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgIyBNYXkgaGFwcGVuIGlmIHRoZSByb290IHdhcyBkZXN0cm95ZWQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5uYW1lLCAnY29uZmlndXJlJywgJy0nK2tleSwgdmFsdWUpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5uYW1lLCAnY29uZmlndXJlJywgJy0nK2tleSkKKyAgICBkZWYgY29uZmlndXJlKHNlbGYsICoqa3cpOgorICAgICAgICAiIiJDb25maWd1cmUgdGhlIGltYWdlLiIiIgorICAgICAgICByZXMgPSAoKQorICAgICAgICBmb3IgaywgdiBpbiBfY25mbWVyZ2Uoa3cpLml0ZW1zKCk6CisgICAgICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIGtbLTFdID09ICdfJzogayA9IGtbOi0xXQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIodiwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICAgICAgICAgIHYgPSBzZWxmLl9yZWdpc3Rlcih2KQorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICgnLScraywgdikKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLm5hbWUsICdjb25maWcnKSArIHJlcykKKyAgICBjb25maWcgPSBjb25maWd1cmUKKyAgICBkZWYgaGVpZ2h0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UuIiIiCisgICAgICAgIHJldHVybiBnZXRpbnQoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoJ2ltYWdlJywgJ2hlaWdodCcsIHNlbGYubmFtZSkpCisgICAgZGVmIHR5cGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdHlwZSBvZiB0aGUgaW1nYWdlLCBlLmcuICJwaG90byIgb3IgImJpdG1hcCIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ2ltYWdlJywgJ3R5cGUnLCBzZWxmLm5hbWUpCisgICAgZGVmIHdpZHRoKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZS4iIiIKKyAgICAgICAgcmV0dXJuIGdldGludCgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnaW1hZ2UnLCAnd2lkdGgnLCBzZWxmLm5hbWUpKQorCitjbGFzcyBQaG90b0ltYWdlKEltYWdlKToKKyAgICAiIiJXaWRnZXQgd2hpY2ggY2FuIGRpc3BsYXkgY29sb3JlZCBpbWFnZXMgaW4gR0lGLCBQUE0vUEdNIGZvcm1hdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBjbmY9e30sIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIGFuIGltYWdlIHdpdGggTkFNRS4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogZGF0YSwgZm9ybWF0LCBmaWxlLCBnYW1tYSwgaGVpZ2h0LCBwYWxldHRlLAorICAgICAgICB3aWR0aC4iIiIKKyAgICAgICAgSW1hZ2UuX19pbml0X18oc2VsZiwgJ3Bob3RvJywgbmFtZSwgY25mLCBtYXN0ZXIsICoqa3cpCisgICAgZGVmIGJsYW5rKHNlbGYpOgorICAgICAgICAiIiJEaXNwbGF5IGEgdHJhbnNwYXJlbnQgaW1hZ2UuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLm5hbWUsICdibGFuaycpCisgICAgZGVmIGNnZXQoc2VsZiwgb3B0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB2YWx1ZSBvZiBPUFRJT04uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5uYW1lLCAnY2dldCcsICctJyArIG9wdGlvbikKKyAgICAjIFhYWCBjb25maWcKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLm5hbWUsICdjZ2V0JywgJy0nICsga2V5KQorICAgICMgWFhYIGNvcHkgLWZyb20sIC10bywgLi4uPworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBuZXcgUGhvdG9JbWFnZSB3aXRoIHRoZSBzYW1lIGltYWdlIGFzIHRoaXMgd2lkZ2V0LiIiIgorICAgICAgICBkZXN0SW1hZ2UgPSBQaG90b0ltYWdlKCkKKyAgICAgICAgc2VsZi50ay5jYWxsKGRlc3RJbWFnZSwgJ2NvcHknLCBzZWxmLm5hbWUpCisgICAgICAgIHJldHVybiBkZXN0SW1hZ2UKKyAgICBkZWYgem9vbShzZWxmLHgseT0nJyk6CisgICAgICAgICIiIlJldHVybiBhIG5ldyBQaG90b0ltYWdlIHdpdGggdGhlIHNhbWUgaW1hZ2UgYXMgdGhpcyB3aWRnZXQKKyAgICAgICAgYnV0IHpvb20gaXQgd2l0aCBYIGFuZCBZLiIiIgorICAgICAgICBkZXN0SW1hZ2UgPSBQaG90b0ltYWdlKCkKKyAgICAgICAgaWYgeT09Jyc6IHk9eAorICAgICAgICBzZWxmLnRrLmNhbGwoZGVzdEltYWdlLCAnY29weScsIHNlbGYubmFtZSwgJy16b29tJyx4LHkpCisgICAgICAgIHJldHVybiBkZXN0SW1hZ2UKKyAgICBkZWYgc3Vic2FtcGxlKHNlbGYseCx5PScnKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbmV3IFBob3RvSW1hZ2UgYmFzZWQgb24gdGhlIHNhbWUgaW1hZ2UgYXMgdGhpcyB3aWRnZXQKKyAgICAgICAgYnV0IHVzZSBvbmx5IGV2ZXJ5IFh0aCBvciBZdGggcGl4ZWwuIiIiCisgICAgICAgIGRlc3RJbWFnZSA9IFBob3RvSW1hZ2UoKQorICAgICAgICBpZiB5PT0nJzogeT14CisgICAgICAgIHNlbGYudGsuY2FsbChkZXN0SW1hZ2UsICdjb3B5Jywgc2VsZi5uYW1lLCAnLXN1YnNhbXBsZScseCx5KQorICAgICAgICByZXR1cm4gZGVzdEltYWdlCisgICAgZGVmIGdldChzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjb2xvciAocmVkLCBncmVlbiwgYmx1ZSkgb2YgdGhlIHBpeGVsIGF0IFgsWS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLm5hbWUsICdnZXQnLCB4LCB5KQorICAgIGRlZiBwdXQoc2VsZiwgZGF0YSwgdG89Tm9uZSk6CisgICAgICAgICIiIlB1dCByb3cgZm9ybWF0dGVkIGNvbG9ycyB0byBpbWFnZSBzdGFydGluZyBmcm9tCisgICAgICAgIHBvc2l0aW9uIFRPLCBlLmcuIGltYWdlLnB1dCgie3JlZCBncmVlbn0ge2JsdWUgeWVsbG93fSIsIHRvPSg0LDYpKSIiIgorICAgICAgICBhcmdzID0gKHNlbGYubmFtZSwgJ3B1dCcsIGRhdGEpCisgICAgICAgIGlmIHRvOgorICAgICAgICAgICAgaWYgdG9bMF0gPT0gJy10byc6CisgICAgICAgICAgICAgICAgdG8gPSB0b1sxOl0KKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzICsgKCctdG8nLCkgKyB0dXBsZSh0bykKKyAgICAgICAgc2VsZi50ay5jYWxsKGFyZ3MpCisgICAgIyBYWFggcmVhZAorICAgIGRlZiB3cml0ZShzZWxmLCBmaWxlbmFtZSwgZm9ybWF0PU5vbmUsIGZyb21fY29vcmRzPU5vbmUpOgorICAgICAgICAiIiJXcml0ZSBpbWFnZSB0byBmaWxlIEZJTEVOQU1FIGluIEZPUk1BVCBzdGFydGluZyBmcm9tCisgICAgICAgIHBvc2l0aW9uIEZST01fQ09PUkRTLiIiIgorICAgICAgICBhcmdzID0gKHNlbGYubmFtZSwgJ3dyaXRlJywgZmlsZW5hbWUpCisgICAgICAgIGlmIGZvcm1hdDoKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzICsgKCctZm9ybWF0JywgZm9ybWF0KQorICAgICAgICBpZiBmcm9tX2Nvb3JkczoKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzICsgKCctZnJvbScsKSArIHR1cGxlKGZyb21fY29vcmRzKQorICAgICAgICBzZWxmLnRrLmNhbGwoYXJncykKKworY2xhc3MgQml0bWFwSW1hZ2UoSW1hZ2UpOgorICAgICIiIldpZGdldCB3aGljaCBjYW4gZGlzcGxheSBhIGJpdG1hcC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBjbmY9e30sIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ3JlYXRlIGEgYml0bWFwIHdpdGggTkFNRS4KKworICAgICAgICBWYWxpZCByZXNvdXJjZSBuYW1lczogYmFja2dyb3VuZCwgZGF0YSwgZmlsZSwgZm9yZWdyb3VuZCwgbWFza2RhdGEsIG1hc2tmaWxlLiIiIgorICAgICAgICBJbWFnZS5fX2luaXRfXyhzZWxmLCAnYml0bWFwJywgbmFtZSwgY25mLCBtYXN0ZXIsICoqa3cpCisKK2RlZiBpbWFnZV9uYW1lcygpOiByZXR1cm4gX2RlZmF1bHRfcm9vdC50ay5jYWxsKCdpbWFnZScsICduYW1lcycpCitkZWYgaW1hZ2VfdHlwZXMoKTogcmV0dXJuIF9kZWZhdWx0X3Jvb3QudGsuY2FsbCgnaW1hZ2UnLCAndHlwZXMnKQorCisKK2NsYXNzIFNwaW5ib3goV2lkZ2V0LCBYVmlldyk6CisgICAgIiIic3BpbmJveCB3aWRnZXQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBzcGluYm94IHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgYWN0aXZlYmFja2dyb3VuZCwgYmFja2dyb3VuZCwgYm9yZGVyd2lkdGgsCisgICAgICAgICAgICBjdXJzb3IsIGV4cG9ydHNlbGVjdGlvbiwgZm9udCwgZm9yZWdyb3VuZCwKKyAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLAorICAgICAgICAgICAgaGlnaGxpZ2h0dGhpY2tuZXNzLCBpbnNlcnRiYWNrZ3JvdW5kLAorICAgICAgICAgICAgaW5zZXJ0Ym9yZGVyd2lkdGgsIGluc2VydG9mZnRpbWUsCisgICAgICAgICAgICBpbnNlcnRvbnRpbWUsIGluc2VydHdpZHRoLCBqdXN0aWZ5LCByZWxpZWYsCisgICAgICAgICAgICByZXBlYXRkZWxheSwgcmVwZWF0aW50ZXJ2YWwsCisgICAgICAgICAgICBzZWxlY3RiYWNrZ3JvdW5kLCBzZWxlY3Rib3JkZXJ3aWR0aAorICAgICAgICAgICAgc2VsZWN0Zm9yZWdyb3VuZCwgdGFrZWZvY3VzLCB0ZXh0dmFyaWFibGUKKyAgICAgICAgICAgIHhzY3JvbGxjb21tYW5kLgorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGJ1dHRvbmJhY2tncm91bmQsIGJ1dHRvbmN1cnNvciwKKyAgICAgICAgICAgIGJ1dHRvbmRvd25yZWxpZWYsIGJ1dHRvbnVwcmVsaWVmLAorICAgICAgICAgICAgY29tbWFuZCwgZGlzYWJsZWRiYWNrZ3JvdW5kLAorICAgICAgICAgICAgZGlzYWJsZWRmb3JlZ3JvdW5kLCBmb3JtYXQsIGZyb20sCisgICAgICAgICAgICBpbnZhbGlkY29tbWFuZCwgaW5jcmVtZW50LAorICAgICAgICAgICAgcmVhZG9ubHliYWNrZ3JvdW5kLCBzdGF0ZSwgdG8sCisgICAgICAgICAgICB2YWxpZGF0ZSwgdmFsaWRhdGVjb21tYW5kIHZhbHVlcywKKyAgICAgICAgICAgIHdpZHRoLCB3cmFwLAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3NwaW5ib3gnLCBjbmYsIGt3KQorCisgICAgZGVmIGJib3goc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiBYMSxZMSxYMixZMiBjb29yZGluYXRlcyBmb3IgYQorICAgICAgICByZWN0YW5nbGUgd2hpY2ggZW5jbG9zZXMgdGhlIGNoYXJhY3RlciBnaXZlbiBieSBpbmRleC4KKworICAgICAgICBUaGUgZmlyc3QgdHdvIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGdpdmUgdGhlIHggYW5kIHkKKyAgICAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIHVwcGVyLWxlZnQgY29ybmVyIG9mIHRoZSBzY3JlZW4KKyAgICAgICAgYXJlYSBjb3ZlcmVkIGJ5IHRoZSBjaGFyYWN0ZXIgKGluIHBpeGVscyByZWxhdGl2ZQorICAgICAgICB0byB0aGUgd2lkZ2V0KSBhbmQgdGhlIGxhc3QgdHdvIGVsZW1lbnRzIGdpdmUgdGhlCisgICAgICAgIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGNoYXJhY3RlciwgaW4gcGl4ZWxzLiBUaGUKKyAgICAgICAgYm91bmRpbmcgYm94IG1heSByZWZlciB0byBhIHJlZ2lvbiBvdXRzaWRlIHRoZQorICAgICAgICB2aXNpYmxlIGFyZWEgb2YgdGhlIHdpbmRvdy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2Jib3gnLCBpbmRleCkKKworICAgIGRlZiBkZWxldGUoc2VsZiwgZmlyc3QsIGxhc3Q9Tm9uZSk6CisgICAgICAgICIiIkRlbGV0ZSBvbmUgb3IgbW9yZSBlbGVtZW50cyBvZiB0aGUgc3BpbmJveC4KKworICAgICAgICBGaXJzdCBpcyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciB0byBkZWxldGUsCisgICAgICAgIGFuZCBsYXN0IGlzIHRoZSBpbmRleCBvZiB0aGUgY2hhcmFjdGVyIGp1c3QgYWZ0ZXIKKyAgICAgICAgdGhlIGxhc3Qgb25lIHRvIGRlbGV0ZS4gSWYgbGFzdCBpc24ndCBzcGVjaWZpZWQgaXQKKyAgICAgICAgZGVmYXVsdHMgdG8gZmlyc3QrMSwgaS5lLiBhIHNpbmdsZSBjaGFyYWN0ZXIgaXMKKyAgICAgICAgZGVsZXRlZC4gIFRoaXMgY29tbWFuZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2RlbGV0ZScsIGZpcnN0LCBsYXN0KQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc3BpbmJveCdzIHN0cmluZyIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXQnKQorCisgICAgZGVmIGljdXJzb3Ioc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJBbHRlciB0aGUgcG9zaXRpb24gb2YgdGhlIGluc2VydGlvbiBjdXJzb3IuCisKKyAgICAgICAgVGhlIGluc2VydGlvbiBjdXJzb3Igd2lsbCBiZSBkaXNwbGF5ZWQganVzdCBiZWZvcmUKKyAgICAgICAgdGhlIGNoYXJhY3RlciBnaXZlbiBieSBpbmRleC4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2ljdXJzb3InLCBpbmRleCkKKworICAgIGRlZiBpZGVudGlmeShzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgd2lkZ2V0IGF0IHBvc2l0aW9uIHgsIHkKKworICAgICAgICBSZXR1cm4gdmFsdWUgaXMgb25lIG9mOiBub25lLCBidXR0b25kb3duLCBidXR0b251cCwgZW50cnkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2lkZW50aWZ5JywgeCwgeSkKKworICAgIGRlZiBpbmRleChzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJldHVybnMgdGhlIG51bWVyaWNhbCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIGluZGV4CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdpbmRleCcsIGluZGV4KQorCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgcyk6CisgICAgICAgICIiIkluc2VydCBzdHJpbmcgcyBhdCBpbmRleAorCisgICAgICAgICBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2luc2VydCcsIGluZGV4LCBzKQorCisgICAgZGVmIGludm9rZShzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIiIiQ2F1c2VzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byBiZSBpbnZva2VkCisKKyAgICAgICAgVGhlIGVsZW1lbnQgY291bGQgYmUgYnV0dG9uZG93biBvciBidXR0b251cAorICAgICAgICB0cmlnZ2VyaW5nIHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAnaW52b2tlJywgZWxlbWVudCkKKworICAgIGRlZiBzY2FuKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnc2NhbicpICsgYXJncykpIG9yICgpCisKKyAgICBkZWYgc2Nhbl9tYXJrKHNlbGYsIHgpOgorICAgICAgICAiIiJSZWNvcmRzIHggYW5kIHRoZSBjdXJyZW50IHZpZXcgaW4gdGhlIHNwaW5ib3ggd2luZG93OworCisgICAgICAgIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBsYXRlciBzY2FuIGRyYWd0byBjb21tYW5kcy4KKyAgICAgICAgVHlwaWNhbGx5IHRoaXMgY29tbWFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYSBtb3VzZSBidXR0b24KKyAgICAgICAgcHJlc3MgaW4gdGhlIHdpZGdldC4gSXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zY2FuKCJtYXJrIiwgeCkKKworICAgIGRlZiBzY2FuX2RyYWd0byhzZWxmLCB4KToKKyAgICAgICAgIiIiQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiB4IGFyZ3VtZW50CisgICAgICAgIGFuZCB0aGUgeCBhcmd1bWVudCB0byB0aGUgbGFzdCBzY2FuIG1hcmsgY29tbWFuZAorCisgICAgICAgIEl0IHRoZW4gYWRqdXN0cyB0aGUgdmlldyBsZWZ0IG9yIHJpZ2h0IGJ5IDEwIHRpbWVzIHRoZQorICAgICAgICBkaWZmZXJlbmNlIGluIHgtY29vcmRpbmF0ZXMuIFRoaXMgY29tbWFuZCBpcyB0eXBpY2FsbHkKKyAgICAgICAgYXNzb2NpYXRlZCB3aXRoIG1vdXNlIG1vdGlvbiBldmVudHMgaW4gdGhlIHdpZGdldCwgdG8KKyAgICAgICAgcHJvZHVjZSB0aGUgZWZmZWN0IG9mIGRyYWdnaW5nIHRoZSBzcGluYm94IGF0IGhpZ2ggc3BlZWQKKyAgICAgICAgdGhyb3VnaCB0aGUgd2luZG93LiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNjYW4oImRyYWd0byIsIHgpCisKKyAgICBkZWYgc2VsZWN0aW9uKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW50ZXJuYWwgZnVuY3Rpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRpbnRzKAorICAgICAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnc2VsZWN0aW9uJykgKyBhcmdzKSkgb3IgKCkKKworICAgIGRlZiBzZWxlY3Rpb25fYWRqdXN0KHNlbGYsIGluZGV4KToKKyAgICAgICAgIiIiTG9jYXRlIHRoZSBlbmQgb2YgdGhlIHNlbGVjdGlvbiBuZWFyZXN0IHRvIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgZ2l2ZW4gYnkgaW5kZXgsCisKKyAgICAgICAgVGhlbiBhZGp1c3QgdGhhdCBlbmQgb2YgdGhlIHNlbGVjdGlvbiB0byBiZSBhdCBpbmRleAorICAgICAgICAoaS5lIGluY2x1ZGluZyBidXQgbm90IGdvaW5nIGJleW9uZCBpbmRleCkuIFRoZSBvdGhlcgorICAgICAgICBlbmQgb2YgdGhlIHNlbGVjdGlvbiBpcyBtYWRlIHRoZSBhbmNob3IgcG9pbnQgZm9yIGZ1dHVyZQorICAgICAgICBzZWxlY3QgdG8gY29tbWFuZHMuIElmIHRoZSBzZWxlY3Rpb24gaXNuJ3QgY3VycmVudGx5IGluCisgICAgICAgIHRoZSBzcGluYm94LCB0aGVuIGEgbmV3IHNlbGVjdGlvbiBpcyBjcmVhdGVkIHRvIGluY2x1ZGUKKyAgICAgICAgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBpbmRleCBhbmQgdGhlIG1vc3QgcmVjZW50IHNlbGVjdGlvbgorICAgICAgICBhbmNob3IgcG9pbnQsIGluY2x1c2l2ZS4gUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3Rpb24oImFkanVzdCIsIGluZGV4KQorCisgICAgZGVmIHNlbGVjdGlvbl9jbGVhcihzZWxmKToKKyAgICAgICAgIiIiQ2xlYXIgdGhlIHNlbGVjdGlvbgorCisgICAgICAgIElmIHRoZSBzZWxlY3Rpb24gaXNuJ3QgaW4gdGhpcyB3aWRnZXQgdGhlbiB0aGUKKyAgICAgICAgY29tbWFuZCBoYXMgbm8gZWZmZWN0LiBSZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNlbGVjdGlvbigiY2xlYXIiKQorCisgICAgZGVmIHNlbGVjdGlvbl9lbGVtZW50KHNlbGYsIGVsZW1lbnQ9Tm9uZSk6CisgICAgICAgICIiIlNldHMgb3IgZ2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQuCisKKyAgICAgICAgSWYgYSBzcGluYnV0dG9uIGVsZW1lbnQgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlCisgICAgICAgIGRpc3BsYXllZCBkZXByZXNzZWQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNlbGVjdGlvbigiZWxlbWVudCIsIGVsZW1lbnQpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBMYWJlbEZyYW1lKFdpZGdldCk6CisgICAgIiIibGFiZWxmcmFtZSB3aWRnZXQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBsYWJlbGZyYW1lIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgTUFTVEVSLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgYm9yZGVyd2lkdGgsIGN1cnNvciwgZm9udCwgZm9yZWdyb3VuZCwKKyAgICAgICAgICAgIGhpZ2hsaWdodGJhY2tncm91bmQsIGhpZ2hsaWdodGNvbG9yLAorICAgICAgICAgICAgaGlnaGxpZ2h0dGhpY2tuZXNzLCBwYWR4LCBwYWR5LCByZWxpZWYsCisgICAgICAgICAgICB0YWtlZm9jdXMsIHRleHQKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBiYWNrZ3JvdW5kLCBjbGFzcywgY29sb3JtYXAsIGNvbnRhaW5lciwKKyAgICAgICAgICAgIGhlaWdodCwgbGFiZWxhbmNob3IsIGxhYmVsd2lkZ2V0LAorICAgICAgICAgICAgdmlzdWFsLCB3aWR0aAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ2xhYmVsZnJhbWUnLCBjbmYsIGt3KQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgUGFuZWRXaW5kb3coV2lkZ2V0KToKKyAgICAiIiJwYW5lZHdpbmRvdyB3aWRnZXQuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBwYW5lZHdpbmRvdyB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IE1BU1RFUi4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGJhY2tncm91bmQsIGJvcmRlcndpZHRoLCBjdXJzb3IsIGhlaWdodCwKKyAgICAgICAgICAgIG9yaWVudCwgcmVsaWVmLCB3aWR0aAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGhhbmRsZXBhZCwgaGFuZGxlc2l6ZSwgb3BhcXVlcmVzaXplLAorICAgICAgICAgICAgc2FzaGN1cnNvciwgc2FzaHBhZCwgc2FzaHJlbGllZiwKKyAgICAgICAgICAgIHNhc2h3aWR0aCwgc2hvd2hhbmRsZSwKKyAgICAgICAgIiIiCisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICdwYW5lZHdpbmRvdycsIGNuZiwga3cpCisKKyAgICBkZWYgYWRkKHNlbGYsIGNoaWxkLCAqKmt3KToKKyAgICAgICAgIiIiQWRkIGEgY2hpbGQgd2lkZ2V0IHRvIHRoZSBwYW5lZHdpbmRvdyBpbiBhIG5ldyBwYW5lLgorCisgICAgICAgIFRoZSBjaGlsZCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiB0aGUgY2hpbGQgd2lkZ2V0CisgICAgICAgIGZvbGxvd2VkIGJ5IHBhaXJzIG9mIGFyZ3VtZW50cyB0aGF0IHNwZWNpZnkgaG93IHRvCisgICAgICAgIG1hbmFnZSB0aGUgd2luZG93cy4gVGhlIHBvc3NpYmxlIG9wdGlvbnMgYW5kIHZhbHVlcworICAgICAgICBhcmUgdGhlIG9uZXMgYWNjZXB0ZWQgYnkgdGhlIHBhbmVjb25maWd1cmUgbWV0aG9kLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKChzZWxmLl93LCAnYWRkJywgY2hpbGQpICsgc2VsZi5fb3B0aW9ucyhrdykpCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGNoaWxkKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBwYW5lIGNvbnRhaW5pbmcgY2hpbGQgZnJvbSB0aGUgcGFuZWR3aW5kb3cKKworICAgICAgICBBbGwgZ2VvbWV0cnkgbWFuYWdlbWVudCBvcHRpb25zIGZvciBjaGlsZCB3aWxsIGJlIGZvcmdvdHRlbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAnZm9yZ2V0JywgY2hpbGQpCisgICAgZm9yZ2V0PXJlbW92ZQorCisgICAgZGVmIGlkZW50aWZ5KHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJJZGVudGlmeSB0aGUgcGFuZWR3aW5kb3cgY29tcG9uZW50IGF0IHBvaW50IHgsIHkKKworICAgICAgICBJZiB0aGUgcG9pbnQgaXMgb3ZlciBhIHNhc2ggb3IgYSBzYXNoIGhhbmRsZSwgdGhlIHJlc3VsdAorICAgICAgICBpcyBhIHR3byBlbGVtZW50IGxpc3QgY29udGFpbmluZyB0aGUgaW5kZXggb2YgdGhlIHNhc2ggb3IKKyAgICAgICAgaGFuZGxlLCBhbmQgYSB3b3JkIGluZGljYXRpbmcgd2hldGhlciBpdCBpcyBvdmVyIGEgc2FzaAorICAgICAgICBvciBhIGhhbmRsZSwgc3VjaCBhcyB7MCBzYXNofSBvciB7MiBoYW5kbGV9LiBJZiB0aGUgcG9pbnQKKyAgICAgICAgaXMgb3ZlciBhbnkgb3RoZXIgcGFydCBvZiB0aGUgcGFuZWR3aW5kb3csIHRoZSByZXN1bHQgaXMKKyAgICAgICAgYW4gZW1wdHkgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgJ2lkZW50aWZ5JywgeCwgeSkKKworICAgIGRlZiBwcm94eShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3Byb3h5JykgKyBhcmdzKSkgb3IgKCkKKworICAgIGRlZiBwcm94eV9jb29yZChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB4IGFuZCB5IHBhaXIgb2YgdGhlIG1vc3QgcmVjZW50IHByb3h5IGxvY2F0aW9uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wcm94eSgiY29vcmQiKQorCisgICAgZGVmIHByb3h5X2ZvcmdldChzZWxmKToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBwcm94eSBmcm9tIHRoZSBkaXNwbGF5LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHJveHkoImZvcmdldCIpCisKKyAgICBkZWYgcHJveHlfcGxhY2Uoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlBsYWNlIHRoZSBwcm94eSBhdCB0aGUgZ2l2ZW4geCBhbmQgeSBjb29yZGluYXRlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnByb3h5KCJwbGFjZSIsIHgsIHkpCisKKyAgICBkZWYgc2FzaChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cygKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3Nhc2gnKSArIGFyZ3MpKSBvciAoKQorCisgICAgZGVmIHNhc2hfY29vcmQoc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgeCBhbmQgeSBwYWlyIGZvciB0aGUgc2FzaCBnaXZlbiBieSBpbmRleC4KKworICAgICAgICBJbmRleCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCAxIGxlc3MgdGhhbiB0aGUKKyAgICAgICAgbnVtYmVyIG9mIHBhbmVzIGluIHRoZSBwYW5lZHdpbmRvdy4gVGhlIGNvb3JkaW5hdGVzIGdpdmVuIGFyZQorICAgICAgICB0aG9zZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWdpb24gY29udGFpbmluZyB0aGUgc2FzaC4KKyAgICAgICAgcGF0aE5hbWUgc2FzaCBkcmFndG8gaW5kZXggeCB5IFRoaXMgY29tbWFuZCBjb21wdXRlcyB0aGUKKyAgICAgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBnaXZlbiBjb29yZGluYXRlcyBhbmQgdGhlIGNvb3JkaW5hdGVzCisgICAgICAgIGdpdmVuIHRvIHRoZSBsYXN0IHNhc2ggY29vcmQgY29tbWFuZCBmb3IgdGhlIGdpdmVuIHNhc2guIEl0IHRoZW4KKyAgICAgICAgbW92ZXMgdGhhdCBzYXNoIHRoZSBjb21wdXRlZCBkaWZmZXJlbmNlLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZQorICAgICAgICBlbXB0eSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zYXNoKCJjb29yZCIsIGluZGV4KQorCisgICAgZGVmIHNhc2hfbWFyayhzZWxmLCBpbmRleCk6CisgICAgICAgICIiIlJlY29yZHMgeCBhbmQgeSBmb3IgdGhlIHNhc2ggZ2l2ZW4gYnkgaW5kZXg7CisKKyAgICAgICAgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGxhdGVyIGRyYWd0byBjb21tYW5kcyB0byBtb3ZlIHRoZSBzYXNoLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2FzaCgibWFyayIsIGluZGV4KQorCisgICAgZGVmIHNhc2hfcGxhY2Uoc2VsZiwgaW5kZXgsIHgsIHkpOgorICAgICAgICAiIiJQbGFjZSB0aGUgc2FzaCBnaXZlbiBieSBpbmRleCBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNhc2goInBsYWNlIiwgaW5kZXgsIHgsIHkpCisKKyAgICBkZWYgcGFuZWNnZXQoc2VsZiwgY2hpbGQsIG9wdGlvbik6CisgICAgICAgICIiIlF1ZXJ5IGEgbWFuYWdlbWVudCBvcHRpb24gZm9yIHdpbmRvdy4KKworICAgICAgICBPcHRpb24gbWF5IGJlIGFueSB2YWx1ZSBhbGxvd2VkIGJ5IHRoZSBwYW5lY29uZmlndXJlIHN1YmNvbW1hbmQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAoc2VsZi5fdywgJ3BhbmVjZ2V0JykgKyAoY2hpbGQsICctJytvcHRpb24pKQorCisgICAgZGVmIHBhbmVjb25maWd1cmUoc2VsZiwgdGFnT3JJZCwgY25mPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJRdWVyeSBvciBtb2RpZnkgdGhlIG1hbmFnZW1lbnQgb3B0aW9ucyBmb3Igd2luZG93LgorCisgICAgICAgIElmIG5vIG9wdGlvbiBpcyBzcGVjaWZpZWQsIHJldHVybnMgYSBsaXN0IGRlc2NyaWJpbmcgYWxsCisgICAgICAgIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucyBmb3IgcGF0aE5hbWUuICBJZiBvcHRpb24gaXMKKyAgICAgICAgc3BlY2lmaWVkIHdpdGggbm8gdmFsdWUsIHRoZW4gdGhlIGNvbW1hbmQgcmV0dXJucyBhIGxpc3QKKyAgICAgICAgZGVzY3JpYmluZyB0aGUgb25lIG5hbWVkIG9wdGlvbiAodGhpcyBsaXN0IHdpbGwgYmUgaWRlbnRpY2FsCisgICAgICAgIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN1Ymxpc3Qgb2YgdGhlIHZhbHVlIHJldHVybmVkIGlmIG5vCisgICAgICAgIG9wdGlvbiBpcyBzcGVjaWZpZWQpLiBJZiBvbmUgb3IgbW9yZSBvcHRpb24tdmFsdWUgcGFpcnMgYXJlCisgICAgICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgY29tbWFuZCBtb2RpZmllcyB0aGUgZ2l2ZW4gd2lkZ2V0CisgICAgICAgIG9wdGlvbihzKSB0byBoYXZlIHRoZSBnaXZlbiB2YWx1ZShzKTsgaW4gdGhpcyBjYXNlIHRoZQorICAgICAgICBjb21tYW5kIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiBUaGUgZm9sbG93aW5nIG9wdGlvbnMKKyAgICAgICAgYXJlIHN1cHBvcnRlZDoKKworICAgICAgICBhZnRlciB3aW5kb3cKKyAgICAgICAgICAgIEluc2VydCB0aGUgd2luZG93IGFmdGVyIHRoZSB3aW5kb3cgc3BlY2lmaWVkLiB3aW5kb3cKKyAgICAgICAgICAgIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhIHdpbmRvdyBhbHJlYWR5IG1hbmFnZWQgYnkgcGF0aE5hbWUuCisgICAgICAgIGJlZm9yZSB3aW5kb3cKKyAgICAgICAgICAgIEluc2VydCB0aGUgd2luZG93IGJlZm9yZSB0aGUgd2luZG93IHNwZWNpZmllZC4gd2luZG93CisgICAgICAgICAgICBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSB3aW5kb3cgYWxyZWFkeSBtYW5hZ2VkIGJ5IHBhdGhOYW1lLgorICAgICAgICBoZWlnaHQgc2l6ZQorICAgICAgICAgICAgU3BlY2lmeSBhIGhlaWdodCBmb3IgdGhlIHdpbmRvdy4gVGhlIGhlaWdodCB3aWxsIGJlIHRoZQorICAgICAgICAgICAgb3V0ZXIgZGltZW5zaW9uIG9mIHRoZSB3aW5kb3cgaW5jbHVkaW5nIGl0cyBib3JkZXIsIGlmCisgICAgICAgICAgICBhbnkuIElmIHNpemUgaXMgYW4gZW1wdHkgc3RyaW5nLCBvciBpZiAtaGVpZ2h0IGlzIG5vdAorICAgICAgICAgICAgc3BlY2lmaWVkLCB0aGVuIHRoZSBoZWlnaHQgcmVxdWVzdGVkIGludGVybmFsbHkgYnkgdGhlCisgICAgICAgICAgICB3aW5kb3cgd2lsbCBiZSB1c2VkIGluaXRpYWxseTsgdGhlIGhlaWdodCBtYXkgbGF0ZXIgYmUKKyAgICAgICAgICAgIGFkanVzdGVkIGJ5IHRoZSBtb3ZlbWVudCBvZiBzYXNoZXMgaW4gdGhlIHBhbmVkd2luZG93LgorICAgICAgICAgICAgU2l6ZSBtYXkgYmUgYW55IHZhbHVlIGFjY2VwdGVkIGJ5IFRrX0dldFBpeGVscy4KKyAgICAgICAgbWluc2l6ZSBuCisgICAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IGNhbm5vdCBiZSBtYWRlCisgICAgICAgICAgICBsZXNzIHRoYW4gbi4gVGhpcyBjb25zdHJhaW50IG9ubHkgYWZmZWN0cyB0aGUgc2l6ZSBvZgorICAgICAgICAgICAgdGhlIHdpZGdldCBpbiB0aGUgcGFuZWQgZGltZW5zaW9uIC0tIHRoZSB4IGRpbWVuc2lvbgorICAgICAgICAgICAgZm9yIGhvcml6b250YWwgcGFuZWR3aW5kb3dzLCB0aGUgeSBkaW1lbnNpb24gZm9yCisgICAgICAgICAgICB2ZXJ0aWNhbCBwYW5lZHdpbmRvd3MuIE1heSBiZSBhbnkgdmFsdWUgYWNjZXB0ZWQgYnkKKyAgICAgICAgICAgIFRrX0dldFBpeGVscy4KKyAgICAgICAgcGFkeCBuCisgICAgICAgICAgICBTcGVjaWZpZXMgYSBub24tbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGluZyBob3cgbXVjaAorICAgICAgICAgICAgZXh0cmEgc3BhY2UgdG8gbGVhdmUgb24gZWFjaCBzaWRlIG9mIHRoZSB3aW5kb3cgaW4KKyAgICAgICAgICAgIHRoZSBYLWRpcmVjdGlvbi4gVGhlIHZhbHVlIG1heSBoYXZlIGFueSBvZiB0aGUgZm9ybXMKKyAgICAgICAgICAgIGFjY2VwdGVkIGJ5IFRrX0dldFBpeGVscy4KKyAgICAgICAgcGFkeSBuCisgICAgICAgICAgICBTcGVjaWZpZXMgYSBub24tbmVnYXRpdmUgdmFsdWUgaW5kaWNhdGluZyBob3cgbXVjaAorICAgICAgICAgICAgZXh0cmEgc3BhY2UgdG8gbGVhdmUgb24gZWFjaCBzaWRlIG9mIHRoZSB3aW5kb3cgaW4KKyAgICAgICAgICAgIHRoZSBZLWRpcmVjdGlvbi4gVGhlIHZhbHVlIG1heSBoYXZlIGFueSBvZiB0aGUgZm9ybXMKKyAgICAgICAgICAgIGFjY2VwdGVkIGJ5IFRrX0dldFBpeGVscy4KKyAgICAgICAgc3RpY2t5IHN0eWxlCisgICAgICAgICAgICBJZiBhIHdpbmRvdydzIHBhbmUgaXMgbGFyZ2VyIHRoYW4gdGhlIHJlcXVlc3RlZAorICAgICAgICAgICAgZGltZW5zaW9ucyBvZiB0aGUgd2luZG93LCB0aGlzIG9wdGlvbiBtYXkgYmUgdXNlZAorICAgICAgICAgICAgdG8gcG9zaXRpb24gKG9yIHN0cmV0Y2gpIHRoZSB3aW5kb3cgd2l0aGluIGl0cyBwYW5lLgorICAgICAgICAgICAgU3R5bGUgaXMgYSBzdHJpbmcgdGhhdCBjb250YWlucyB6ZXJvIG9yIG1vcmUgb2YgdGhlCisgICAgICAgICAgICBjaGFyYWN0ZXJzIG4sIHMsIGUgb3Igdy4gVGhlIHN0cmluZyBjYW4gb3B0aW9uYWxseQorICAgICAgICAgICAgY29udGFpbnMgc3BhY2VzIG9yIGNvbW1hcywgYnV0IHRoZXkgYXJlIGlnbm9yZWQuIEVhY2gKKyAgICAgICAgICAgIGxldHRlciByZWZlcnMgdG8gYSBzaWRlIChub3J0aCwgc291dGgsIGVhc3QsIG9yIHdlc3QpCisgICAgICAgICAgICB0aGF0IHRoZSB3aW5kb3cgd2lsbCAic3RpY2siIHRvLiBJZiBib3RoIG4gYW5kIHMKKyAgICAgICAgICAgIChvciBlIGFuZCB3KSBhcmUgc3BlY2lmaWVkLCB0aGUgd2luZG93IHdpbGwgYmUKKyAgICAgICAgICAgIHN0cmV0Y2hlZCB0byBmaWxsIHRoZSBlbnRpcmUgaGVpZ2h0IChvciB3aWR0aCkgb2YKKyAgICAgICAgICAgIGl0cyBjYXZpdHkuCisgICAgICAgIHdpZHRoIHNpemUKKyAgICAgICAgICAgIFNwZWNpZnkgYSB3aWR0aCBmb3IgdGhlIHdpbmRvdy4gVGhlIHdpZHRoIHdpbGwgYmUKKyAgICAgICAgICAgIHRoZSBvdXRlciBkaW1lbnNpb24gb2YgdGhlIHdpbmRvdyBpbmNsdWRpbmcgaXRzCisgICAgICAgICAgICBib3JkZXIsIGlmIGFueS4gSWYgc2l6ZSBpcyBhbiBlbXB0eSBzdHJpbmcsIG9yCisgICAgICAgICAgICBpZiAtd2lkdGggaXMgbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgd2lkdGggcmVxdWVzdGVkCisgICAgICAgICAgICBpbnRlcm5hbGx5IGJ5IHRoZSB3aW5kb3cgd2lsbCBiZSB1c2VkIGluaXRpYWxseTsgdGhlCisgICAgICAgICAgICB3aWR0aCBtYXkgbGF0ZXIgYmUgYWRqdXN0ZWQgYnkgdGhlIG1vdmVtZW50IG9mIHNhc2hlcworICAgICAgICAgICAgaW4gdGhlIHBhbmVkd2luZG93LiBTaXplIG1heSBiZSBhbnkgdmFsdWUgYWNjZXB0ZWQgYnkKKyAgICAgICAgICAgIFRrX0dldFBpeGVscy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgY25mIGlzIE5vbmUgYW5kIG5vdCBrdzoKKyAgICAgICAgICAgIGNuZiA9IHt9CisgICAgICAgICAgICBmb3IgeCBpbiBzZWxmLnRrLnNwbGl0KAorICAgICAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LAorICAgICAgICAgICAgICAgICAgICAgICAgICdwYW5lY29uZmlndXJlJywgdGFnT3JJZCkpOgorICAgICAgICAgICAgICAgIGNuZlt4WzBdWzE6XV0gPSAoeFswXVsxOl0sKSArIHhbMTpdCisgICAgICAgICAgICByZXR1cm4gY25mCisgICAgICAgIGlmIHR5cGUoY25mKSA9PSBTdHJpbmdUeXBlIGFuZCBub3Qga3c6CisgICAgICAgICAgICB4ID0gc2VsZi50ay5zcGxpdChzZWxmLnRrLmNhbGwoCisgICAgICAgICAgICAgICAgc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCB0YWdPcklkLCAnLScrY25mKSkKKyAgICAgICAgICAgIHJldHVybiAoeFswXVsxOl0sKSArIHhbMTpdCisgICAgICAgIHNlbGYudGsuY2FsbCgoc2VsZi5fdywgJ3BhbmVjb25maWd1cmUnLCB0YWdPcklkKSArCisgICAgICAgICAgICAgICAgIHNlbGYuX29wdGlvbnMoY25mLCBrdykpCisgICAgcGFuZWNvbmZpZyA9IHBhbmVjb25maWd1cmUKKworICAgIGRlZiBwYW5lcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBhbiBvcmRlcmVkIGxpc3Qgb2YgdGhlIGNoaWxkIHBhbmVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdwYW5lcycpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgRXh0ZW5zaW9uczoKKworY2xhc3MgU3R1ZGJ1dHRvbihCdXR0b24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3N0dWRidXR0b24nLCBjbmYsIGt3KQorICAgICAgICBzZWxmLmJpbmQoJzxBbnktRW50ZXI+JywgICAgICAgc2VsZi50a0J1dHRvbkVudGVyKQorICAgICAgICBzZWxmLmJpbmQoJzxBbnktTGVhdmU+JywgICAgICAgc2VsZi50a0J1dHRvbkxlYXZlKQorICAgICAgICBzZWxmLmJpbmQoJzwxPicsICAgICAgICAgICAgICAgc2VsZi50a0J1dHRvbkRvd24pCisgICAgICAgIHNlbGYuYmluZCgnPEJ1dHRvblJlbGVhc2UtMT4nLCBzZWxmLnRrQnV0dG9uVXApCisKK2NsYXNzIFRyaWJ1dHRvbihCdXR0b24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RyaWJ1dHRvbicsIGNuZiwga3cpCisgICAgICAgIHNlbGYuYmluZCgnPEFueS1FbnRlcj4nLCAgICAgICBzZWxmLnRrQnV0dG9uRW50ZXIpCisgICAgICAgIHNlbGYuYmluZCgnPEFueS1MZWF2ZT4nLCAgICAgICBzZWxmLnRrQnV0dG9uTGVhdmUpCisgICAgICAgIHNlbGYuYmluZCgnPDE+JywgICAgICAgICAgICAgICBzZWxmLnRrQnV0dG9uRG93bikKKyAgICAgICAgc2VsZi5iaW5kKCc8QnV0dG9uUmVsZWFzZS0xPicsIHNlbGYudGtCdXR0b25VcCkKKyAgICAgICAgc2VsZlsnZmcnXSAgICAgICAgICAgICAgID0gc2VsZlsnYmcnXQorICAgICAgICBzZWxmWydhY3RpdmViYWNrZ3JvdW5kJ10gPSBzZWxmWydiZyddCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgVGVzdDoKKworZGVmIF90ZXN0KCk6CisgICAgcm9vdCA9IFRrKCkKKyAgICB0ZXh0ID0gIlRoaXMgaXMgVGNsL1RrIHZlcnNpb24gJXMiICUgVGNsVmVyc2lvbgorICAgIGlmIFRjbFZlcnNpb24gPj0gOC4xOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dCArIHVuaWNvZGUoIlxuVGhpcyBzaG91bGQgYmUgYSBjZWRpbGxhOiBcMzQ3IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNvLTg4NTktMSIpCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzICMgbm8gdW5pY29kZSBzdXBwb3J0CisgICAgbGFiZWwgPSBMYWJlbChyb290LCB0ZXh0PXRleHQpCisgICAgbGFiZWwucGFjaygpCisgICAgdGVzdCA9IEJ1dHRvbihyb290LCB0ZXh0PSJDbGljayBtZSEiLAorICAgICAgICAgICAgICBjb21tYW5kPWxhbWJkYSByb290PXJvb3Q6IHJvb3QudGVzdC5jb25maWd1cmUoCisgICAgICAgICAgICAgICAgICB0ZXh0PSJbJXNdIiAlIHJvb3QudGVzdFsndGV4dCddKSkKKyAgICB0ZXN0LnBhY2soKQorICAgIHJvb3QudGVzdCA9IHRlc3QKKyAgICBxdWl0ID0gQnV0dG9uKHJvb3QsIHRleHQ9IlFVSVQiLCBjb21tYW5kPXJvb3QuZGVzdHJveSkKKyAgICBxdWl0LnBhY2soKQorICAgICMgVGhlIGZvbGxvd2luZyB0aHJlZSBjb21tYW5kcyBhcmUgbmVlZGVkIHNvIHRoZSB3aW5kb3cgcG9wcworICAgICMgdXAgb24gdG9wIG9uIFdpbmRvd3MuLi4KKyAgICByb290Lmljb25pZnkoKQorICAgIHJvb3QudXBkYXRlKCkKKyAgICByb290LmRlaWNvbmlmeSgpCisgICAgcm9vdC5tYWlubG9vcCgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGtpbnRlci5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2ludGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQxZjlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtpbnRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvVGtpbnRlci5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay9Ua2ludGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQxZjlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvVGtpbnRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9SRUFETUUgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWNkMTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9SRUFETUUKQEAgLTAsMCArMSwxNCBAQAorV3JpdGluZyBuZXcgdGVzdHMKKz09PT09PT09PT09PT09PT09CisKK1ByZWNhdXRpb24KKy0tLS0tLS0tLS0KKworICAgIE5ldyB0ZXN0cyBzaG91bGQgYWx3YXlzIHVzZSBvbmx5IG9uZSBUayB3aW5kb3cgYXQgb25jZSwgbGlrZSBhbGwgdGhlCisgICAgY3VycmVudCB0ZXN0cyBkby4gVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlIHRvIGRlc3Ryb3kgdGhlIGN1cnJlbnQgd2luZG93CisgICAgYmVmb3JlIGNyZWF0aW5nIGFub3RoZXIgb25lLCBhbmQgY2xlYW4gdXAgYWZ0ZXIgdGhlIHRlc3QuIFRoZSBtb3RpdmF0aW9uCisgICAgYmVoaW5kIHRoaXMgaXMgdGhhdCBzb21lIHRlc3RzIG1heSBkZXBlbmQgb24gaGF2aW5nIGl0cyB3aW5kb3cgZm9jdXNlZAorICAgIHdoaWxlIGl0IGlzIHJ1bm5pbmcgdG8gd29yayBwcm9wZXJseSwgYW5kIGl0IG1heSBiZSBoYXJkIHRvIGZvcmNlIGZvY3VzCisgICAgb24geW91ciB3aW5kb3cgYWNyb3NzIHBsYXRmb3JtcyAocmlnaHQgbm93IG9ubHkgdGVzdF90cmF2ZXJzYWwgYXQKKyAgICB0ZXN0X3R0ay50ZXN0X3dpZGdldHMuTm90ZWJvb2tUZXN0IGRlcGVuZHMgb24gdGhpcykuCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvcnVudGt0ZXN0cy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvcnVudGt0ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWUxNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC9ydW50a3Rlc3RzLnB5CkBAIC0wLDAgKzEsMTE0IEBACisiIiIKK1VzZSB0aGlzIG1vZHVsZSB0byBnZXQgYW5kIHJ1biBhbGwgdGsgdGVzdHMuCisKK1RraW50ZXIgdGVzdHMgc2hvdWxkIGxpdmUgaW4gYSBwYWNrYWdlIGluc2lkZSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoaXMgZmlsZQorbGl2ZXMsIGxpa2UgdGVzdF90a2ludGVyLgorRXh0ZW5zaW9ucyBhbHNvIHNob3VsZCBsaXZlIGluIHBhY2thZ2VzIGZvbGxvd2luZyB0aGUgc2FtZSBydWxlIGFzIGFib3ZlLgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgaW1wb3J0bGliCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKKwordGhpc19kaXJfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorCitfdGtfdW5hdmFpbGFibGUgPSBOb25lCisKK2RlZiBjaGVja190a19hdmFpbGFiaWxpdHkoKToKKyAgICAiIiJDaGVjayB0aGF0IFRrIGlzIGluc3RhbGxlZCBhbmQgYXZhaWxhYmxlLiIiIgorICAgIGdsb2JhbCBfdGtfdW5hdmFpbGFibGUKKworICAgIGlmIF90a191bmF2YWlsYWJsZSBpcyBOb25lOgorICAgICAgICBfdGtfdW5hdmFpbGFibGUgPSBGYWxzZQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAjIFRoZSBBcXVhIFRrIGltcGxlbWVudGF0aW9ucyBvbiBPUyBYIGNhbiBhYm9ydCB0aGUgcHJvY2VzcyBpZgorICAgICAgICAgICAgIyBiZWluZyBjYWxsZWQgaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgYSB3aW5kb3cgc2VydmVyIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICMgY2Fubm90IGJlIG1hZGUsIGZvciBpbnN0YW5jZSB3aGVuIGludm9rZWQgYnkgYSBidWlsZGJvdCBvciBzc2gKKyAgICAgICAgICAgICMgcHJvY2VzcyBub3QgcnVubmluZyB1bmRlciB0aGUgc2FtZSB1c2VyIGlkIGFzIHRoZSBjdXJyZW50IGNvbnNvbGUKKyAgICAgICAgICAgICMgdXNlci4gIFRvIGF2b2lkIHRoYXQsIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgd2luZG93IG1hbmFnZXIKKyAgICAgICAgICAgICMgY29ubmVjdGlvbiBpcyBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNkbGwsIGNfaW50LCBwb2ludGVyLCBTdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZyb20gY3R5cGVzLnV0aWwgaW1wb3J0IGZpbmRfbGlicmFyeQorCisgICAgICAgICAgICBhcHBfc2VydmljZXMgPSBjZGxsLkxvYWRMaWJyYXJ5KGZpbmRfbGlicmFyeSgiQXBwbGljYXRpb25TZXJ2aWNlcyIpKQorCisgICAgICAgICAgICBpZiBhcHBfc2VydmljZXMuQ0dNYWluRGlzcGxheUlEKCkgPT0gMDoKKyAgICAgICAgICAgICAgICBfdGtfdW5hdmFpbGFibGUgPSAiY2Fubm90IHJ1biB3aXRob3V0IE9TIFggd2luZG93IG1hbmFnZXIiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNsYXNzIFByb2Nlc3NTZXJpYWxOdW1iZXIoU3RydWN0dXJlKToKKyAgICAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJoaWdoTG9uZ09mUFNOIiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvd0xvbmdPZlBTTiIsIGNfaW50KV0KKyAgICAgICAgICAgICAgICBwc24gPSBQcm9jZXNzU2VyaWFsTnVtYmVyKCkKKyAgICAgICAgICAgICAgICBwc25fcCA9IHBvaW50ZXIocHNuKQorICAgICAgICAgICAgICAgIGlmICggIChhcHBfc2VydmljZXMuR2V0Q3VycmVudFByb2Nlc3MocHNuX3ApIDwgMCkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAoYXBwX3NlcnZpY2VzLlNldEZyb250UHJvY2Vzcyhwc25fcCkgPCAwKSApOgorICAgICAgICAgICAgICAgICAgICBfdGtfdW5hdmFpbGFibGUgPSAiY2Fubm90IHJ1biB3aXRob3V0IE9TIFggZ3VpIHByb2Nlc3MiCisgICAgICAgIGVsc2U6ICAgIyBub3QgT1MgWAorICAgICAgICAgICAgaW1wb3J0IFRraW50ZXIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBUa2ludGVyLkJ1dHRvbigpCisgICAgICAgICAgICBleGNlcHQgVGtpbnRlci5UY2xFcnJvciBhcyBtc2c6CisgICAgICAgICAgICAgICAgIyBhc3N1bWluZyB0ayBpcyBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgX3RrX3VuYXZhaWxhYmxlID0gInRrIG5vdCBhdmFpbGFibGU6ICVzIiAlIG1zZworCisgICAgaWYgX3RrX3VuYXZhaWxhYmxlOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdChfdGtfdW5hdmFpbGFibGUpCisgICAgcmV0dXJuCisKK2RlZiBpc19wYWNrYWdlKHBhdGgpOgorICAgIGZvciBuYW1lIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgIGlmIG5hbWUgaW4gKCdfX2luaXRfXy5weScsICdfX2luaXRfXy5weWMnLCAnX19pbml0LnB5bycpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIGdldF90ZXN0c19tb2R1bGVzKGJhc2VwYXRoPXRoaXNfZGlyX3BhdGgsIGd1aT1UcnVlLCBwYWNrYWdlcz1Ob25lKToKKyAgICAiIiJUaGlzIHdpbGwgaW1wb3J0IGFuZCB5aWVsZCBtb2R1bGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggdGVzdF8KKyAgICBhbmQgYXJlIGluc2lkZSBwYWNrYWdlcyBmb3VuZCBpbiB0aGUgcGF0aCBzdGFydGluZyBhdCBiYXNlcGF0aC4KKworICAgIElmIHBhY2thZ2VzIGlzIHNwZWNpZmllZCBpdCBzaG91bGQgY29udGFpbiBwYWNrYWdlIG5hbWVzIHRoYXQgd2FudAorICAgIHRoZWlyIHRlc3RzIGNvbGxldGVkLgorICAgICIiIgorICAgIHB5X2V4dCA9ICcucHknCisKKyAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGJhc2VwYXRoKToKKyAgICAgICAgZm9yIGRpcm5hbWUgaW4gbGlzdChkaXJuYW1lcyk6CisgICAgICAgICAgICBpZiBkaXJuYW1lWzBdID09ICcuJzoKKyAgICAgICAgICAgICAgICBkaXJuYW1lcy5yZW1vdmUoZGlybmFtZSkKKworICAgICAgICBpZiBpc19wYWNrYWdlKGRpcnBhdGgpIGFuZCBmaWxlbmFtZXM6CisgICAgICAgICAgICBwa2dfbmFtZSA9IGRpcnBhdGhbbGVuKGJhc2VwYXRoKSArIGxlbihvcy5zZXApOl0ucmVwbGFjZSgnLycsICcuJykKKyAgICAgICAgICAgIGlmIHBhY2thZ2VzIGFuZCBwa2dfbmFtZSBub3QgaW4gcGFja2FnZXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZmlsZW5hbWVzID0gZmlsdGVyKAorICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogeC5zdGFydHN3aXRoKCd0ZXN0XycpIGFuZCB4LmVuZHN3aXRoKHB5X2V4dCksCisgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lcykKKworICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4lcyIgJSBuYW1lWzotbGVuKHB5X2V4dCldLCBwa2dfbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgdGVzdC50ZXN0X3N1cHBvcnQuUmVzb3VyY2VEZW5pZWQ6CisgICAgICAgICAgICAgICAgICAgIGlmIGd1aToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKK2RlZiBnZXRfdGVzdHModGV4dD1UcnVlLCBndWk9VHJ1ZSwgcGFja2FnZXM9Tm9uZSk6CisgICAgIiIiWWllbGQgYWxsIHRoZSB0ZXN0cyBpbiB0aGUgbW9kdWxlcyBmb3VuZCBieSBnZXRfdGVzdHNfbW9kdWxlcy4KKworICAgIElmIG5vZ3VpIGlzIFRydWUsIG9ubHkgdGVzdHMgdGhhdCBkbyBub3QgcmVxdWlyZSBhIEdVSSB3aWxsIGJlCisgICAgcmV0dXJuZWQuIiIiCisgICAgYXR0cnMgPSBbXQorICAgIGlmIHRleHQ6CisgICAgICAgIGF0dHJzLmFwcGVuZCgndGVzdHNfbm9ndWknKQorICAgIGlmIGd1aToKKyAgICAgICAgYXR0cnMuYXBwZW5kKCd0ZXN0c19ndWknKQorICAgIGZvciBtb2R1bGUgaW4gZ2V0X3Rlc3RzX21vZHVsZXMoZ3VpPWd1aSwgcGFja2FnZXM9cGFja2FnZXMpOgorICAgICAgICBmb3IgYXR0ciBpbiBhdHRyczoKKyAgICAgICAgICAgIGZvciB0ZXN0IGluIGdldGF0dHIobW9kdWxlLCBhdHRyLCAoKSk6CisgICAgICAgICAgICAgICAgeWllbGQgdGVzdAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBbJ2d1aSddCisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCpnZXRfdGVzdHMoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvcnVudGt0ZXN0cy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDgyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvcnVudGt0ZXN0cy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMDgyNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3J1bnRrdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3RraW50ZXIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4YWIyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4YWIyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbG9hZHRrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYzY0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weQpAQCAtMCwwICsxLDQ1IEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gVGtpbnRlciBpbXBvcnQgVGNsLCBUY2xFcnJvcgorCit0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ2d1aScpCisKK2NsYXNzIFRrTG9hZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHVuaXR0ZXN0LnNraXBJZignRElTUExBWScgbm90IGluIG9zLmVudmlyb24sICdObyAkRElTUExBWSBzZXQuJykKKyAgICBkZWYgdGVzdExvYWRUayhzZWxmKToKKyAgICAgICAgdGNsID0gVGNsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLndpbmZvX2dlb21ldHJ5KQorICAgICAgICB0Y2wubG9hZHRrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMXgxKzArMCcsIHRjbC53aW5mb19nZW9tZXRyeSgpKQorICAgICAgICB0Y2wuZGVzdHJveSgpCisKKyAgICBkZWYgdGVzdExvYWRUa0ZhaWx1cmUoc2VsZik6CisgICAgICAgIG9sZF9kaXNwbGF5ID0gTm9uZQorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgoJ3dpbicsICdkYXJ3aW4nLCAnY3lnd2luJykpOgorICAgICAgICAgICAgIyBubyBmYWlsdXJlIHBvc3NpYmxlIG9uIHdpbmRvd3M/CisKKyAgICAgICAgICAgICMgWFhYIE1heWJlIG9uIHRrIG9sZGVyIHRoYW4gOC40LjEzIGl0IHdvdWxkIGJlIHBvc3NpYmxlLAorICAgICAgICAgICAgIyBzZWUgdGtpbnRlci5oLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBpZiAnRElTUExBWScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICBkZWwgZW52WydESVNQTEFZJ10KKyAgICAgICAgICAgICAgICAjIG9uIHNvbWUgcGxhdGZvcm1zLCBkZWxldGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICAgICAgICAgICAgICAjIGRvZXNuJ3QgYWN0dWFsbHkgY2FycnkgdGhyb3VnaCB0byB0aGUgcHJvY2VzcyBsZXZlbAorICAgICAgICAgICAgICAgICMgYmVjYXVzZSB0aGV5IGRvbid0IHN1cHBvcnQgdW5zZXRlbnYKKyAgICAgICAgICAgICAgICAjIElmIHRoYXQncyB0aGUgY2FzZSwgYWJvcnQuCisgICAgICAgICAgICAgICAgZGlzcGxheSA9IG9zLnBvcGVuKCdlY2hvICRESVNQTEFZJykucmVhZCgpLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBkaXNwbGF5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgdGNsID0gVGNsKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLCB0Y2wud2luZm9fZ2VvbWV0cnkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUY2xFcnJvciwgdGNsLmxvYWR0aykKKwordGVzdHNfZ3VpID0gKFRrTG9hZFRlc3QsICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0c19ndWkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZWU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbG9hZHRrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X2xvYWR0ay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZWU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfbG9hZHRrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjMDhiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weQpAQCAtMCwwICsxLDM5IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBUa2ludGVyCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCByZXF1aXJlcywgcnVuX3VuaXR0ZXN0Citmcm9tIHR0ayBpbXBvcnQgc2V0dXBfbWFzdGVyCisKK3JlcXVpcmVzKCdndWknKQorCitjbGFzcyBUZXh0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucm9vdCA9IHNldHVwX21hc3RlcigpCisgICAgICAgIHNlbGYudGV4dCA9IFRraW50ZXIuVGV4dChzZWxmLnJvb3QpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGV4dC5kZXN0cm95KCkKKworCisgICAgZGVmIHRlc3Rfc2VhcmNoKHNlbGYpOgorICAgICAgICB0ZXh0ID0gc2VsZi50ZXh0CisKKyAgICAgICAgIyBwYXR0ZXJuIGFuZCBpbmRleCBhcmUgb2JsaWdhdG9yeSBhcmd1bWVudHMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCBOb25lLCAnMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdGV4dC5zZWFyY2gsICdhJywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdGV4dC5zZWFyY2gsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgIyBJbnZhbGlkIHRleHQgaW5kZXguCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCAnJywgMCkKKworICAgICAgICAjIENoZWNrIGlmIHdlIGFyZSBnZXR0aW5nIHRoZSBpbmRpY2VzIGFzIHN0cmluZ3MgLS0geW91IGFyZSBsaWtlbHkKKyAgICAgICAgIyB0byBnZXQgVGNsX09iaiB1bmRlciBUayA4LjUgaWYgVGtpbnRlciBkb2Vzbid0IGNvbnZlcnQgaXQuCisgICAgICAgIHRleHQuaW5zZXJ0KCcxLjAnLCAnaGktdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zZWFyY2goJy10ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zZWFyY2goJ3Rlc3QnLCAnMS4wJywgJ2VuZCcpLCAnMS4zJykKKworCit0ZXN0c19ndWkgPSAoVGV4dFRlc3QsICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QoKnRlc3RzX2d1aSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTIwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTIwMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmE3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZmE3NGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3N1cHBvcnQucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlNzgwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weQpAQCAtMCwwICsxLDMzIEBACitpbXBvcnQgVGtpbnRlcgorCitkZWYgZ2V0X3RrX3Jvb3QoKToKKyAgICB0cnk6CisgICAgICAgIHJvb3QgPSBUa2ludGVyLl9kZWZhdWx0X3Jvb3QKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICMgaXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZSBkZWZhdWx0IHJvb3QgaW4gVGtpbnRlciwgYWx0aG91Z2gKKyAgICAgICAgIyBJIGhhdmVuJ3Qgc2VlbiBwZW9wbGUgZG9pbmcgaXQgKGJ1dCBhcHBhcmVudGx5IHNvbWVvbmUgZGlkIGl0CisgICAgICAgICMgaGVyZSkuCisgICAgICAgIHJvb3QgPSBOb25lCisKKyAgICBpZiByb290IGlzIE5vbmU6CisgICAgICAgICMgY3JlYXRlIGEgbmV3IG1hc3RlciBvbmx5IGlmIHRoZXJlIGlzbid0IG9uZSBhbHJlYWR5CisgICAgICAgIHJvb3QgPSBUa2ludGVyLlRrKCkKKworICAgIHJldHVybiByb290CisKK2RlZiByb290X2RlaWNvbmlmeSgpOgorICAgIHJvb3QgPSBnZXRfdGtfcm9vdCgpCisgICAgcm9vdC5kZWljb25pZnkoKQorCitkZWYgcm9vdF93aXRoZHJhdygpOgorICAgIHJvb3QgPSBnZXRfdGtfcm9vdCgpCisgICAgcm9vdC53aXRoZHJhdygpCisKKworZGVmIHNpbXVsYXRlX21vdXNlX2NsaWNrKHdpZGdldCwgeCwgeSk6CisgICAgIiIiR2VuZXJhdGUgcHJvcGVyIGV2ZW50cyB0byBjbGljayBhdCB0aGUgeCwgeSBwb3NpdGlvbiAodHJpZXMgdG8gYWN0CisgICAgbGlrZSBhbiBYIHNlcnZlcikuIiIiCisgICAgd2lkZ2V0LmV2ZW50X2dlbmVyYXRlKCc8RW50ZXI+JywgeD0wLCB5PTApCisgICAgd2lkZ2V0LmV2ZW50X2dlbmVyYXRlKCc8TW90aW9uPicsIHg9eCwgeT15KQorICAgIHdpZGdldC5ldmVudF9nZW5lcmF0ZSgnPEJ1dHRvblByZXNzLTE+JywgeD14LCB5PXkpCisgICAgd2lkZ2V0LmV2ZW50X2dlbmVyYXRlKCc8QnV0dG9uUmVsZWFzZS0xPicsIHg9eCwgeT15KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9zdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5YWVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay9zdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y5YWVkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvc3VwcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ2Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkKQEAgLTAsMCArMSwyNzQgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFRraW50ZXIKK2ltcG9ydCB0dGsKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzLCBydW5fdW5pdHRlc3QKKworaW1wb3J0IHN1cHBvcnQKKworcmVxdWlyZXMoJ2d1aScpCisKK2NsYXNzIExhYmVsZWRTY2FsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X3dpdGhkcmF3KCkKKworCisgICAgZGVmIHRlc3Rfd2lkZ2V0X2Rlc3Ryb3koc2VsZik6CisgICAgICAgICMgYXV0b21hdGljYWxseSBjcmVhdGVkIHZhcmlhYmxlCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKCkKKyAgICAgICAgdmFyID0geC5fdmFyaWFibGUuX25hbWUKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgeC50ay5nbG9iYWxnZXR2YXIsIHZhcikKKworICAgICAgICAjIG1hbnVhbGx5IGNyZWF0ZWQgdmFyaWFibGUKKyAgICAgICAgbXl2YXIgPSBUa2ludGVyLkRvdWJsZVZhcigpCisgICAgICAgIG5hbWUgPSBteXZhci5fbmFtZQorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhcikKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnRrLmdsb2JhbGdldHZhcihuYW1lKSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIGRlbCBteXZhcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB4LnRrLmdsb2JhbGdldHZhciwgbmFtZSkKKworICAgICAgICAjIGNoZWNraW5nIHRoYXQgdGhlIHRyYWNpbmcgY2FsbGJhY2sgaXMgcHJvcGVybHkgcmVtb3ZlZAorICAgICAgICBteXZhciA9IFRraW50ZXIuSW50VmFyKCkKKyAgICAgICAgIyBMYWJlbGVkU2NhbGUgd2lsbCBzdGFydCB0cmFjaW5nIG15dmFyCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKHZhcmlhYmxlPW15dmFyKQorICAgICAgICB4LmRlc3Ryb3koKQorICAgICAgICAjIFVubGVzcyB0aGUgdHJhY2luZyBjYWxsYmFjayB3YXMgcmVtb3ZlZCwgY3JlYXRpbmcgYSBuZXcKKyAgICAgICAgIyBMYWJlbGVkU2NhbGUgd2l0aCB0aGUgc2FtZSB2YXIgd2lsbCBjYXVzZSBhbiBlcnJvciBub3cuIFRoaXMKKyAgICAgICAgIyBoYXBwZW5zIGJlY2F1c2UgdGhlIHZhcmlhYmxlIHdpbGwgYmUgc2V0IHRvIChwb3NzaWJseSkgYSBuZXcKKyAgICAgICAgIyB2YWx1ZSB3aGljaCBjYXVzZXMgdGhlIHRyYWNpbmcgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGFuZCB0aGVuCisgICAgICAgICMgaXQgdHJpZXMgY2FsbGluZyBpbnN0YW5jZSBhdHRyaWJ1dGVzIG5vdCB5ZXQgZGVmaW5lZC4KKyAgICAgICAgdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhcikKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICdsYXN0X3R5cGUnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3lzLmxhc3RfdHlwZSA9PSBUa2ludGVyLlRjbEVycm9yKQorCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXphdGlvbihzZWxmKToKKyAgICAgICAgIyBtYXN0ZXIgcGFzc2luZworICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tYXN0ZXIsIFRraW50ZXIuX2RlZmF1bHRfcm9vdCkKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgbWFzdGVyID0gVGtpbnRlci5GcmFtZSgpCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKG1hc3RlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm1hc3RlciwgbWFzdGVyKQorICAgICAgICB4LmRlc3Ryb3koKQorCisgICAgICAgICMgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24vcGFzc2luZworICAgICAgICBwYXNzZWRfZXhwZWN0ZWQgPSAoKDIuNSwgMiksICgnMCcsIDApLCAoMCwgMCksICgxMCwgMTApLAorICAgICAgICAgICAgKC0xLCAtMSksIChzeXMubWF4aW50ICsgMSwgc3lzLm1heGludCArIDEpKQorICAgICAgICBmb3IgcGFpciBpbiBwYXNzZWRfZXhwZWN0ZWQ6CisgICAgICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZShmcm9tXz1wYWlyWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbHVlLCBwYWlyWzFdKQorICAgICAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89JzIuNScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHguX3ZhcmlhYmxlLmdldCkKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgeC5fdmFyaWFibGUuZ2V0KQorICAgICAgICB4LmRlc3Ryb3koKQorICAgICAgICAjIHZhcmlhYmxlIHNob3VsZCBoYXZlIGl0cyBkZWZhdWx0IHZhbHVlIHNldCB0byB0aGUgZnJvbV8gdmFsdWUKKyAgICAgICAgbXl2YXIgPSBUa2ludGVyLkRvdWJsZVZhcih2YWx1ZT0yMCkKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWx1ZSwgMCkKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgIyBjaGVjayB0aGF0IGl0IGlzIHJlYWxseSB1c2luZyBhIERvdWJsZVZhcgorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhciwgZnJvbV89MC41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudmFsdWUsIDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll92YXJpYWJsZS5fbmFtZSwgbXl2YXIuX25hbWUpCisgICAgICAgIHguZGVzdHJveSgpCisKKyAgICAgICAgIyB3aWRnZXQgcG9zaXRpb25tZW50CisgICAgICAgIGRlZiBjaGVja19wb3NpdGlvbnMoc2NhbGUsIHNjYWxlX3BvcywgbGFiZWwsIGxhYmVsX3Bvcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNjYWxlLnBhY2tfaW5mbygpWydzaWRlJ10sIHNjYWxlX3BvcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGFiZWwucGxhY2VfaW5mbygpWydhbmNob3InXSwgbGFiZWxfcG9zKQorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZShjb21wb3VuZD0ndG9wJykKKyAgICAgICAgY2hlY2tfcG9zaXRpb25zKHguc2NhbGUsICdib3R0b20nLCB4LmxhYmVsLCAnbicpCisgICAgICAgIHguZGVzdHJveSgpCisgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKGNvbXBvdW5kPSdib3R0b20nKQorICAgICAgICBjaGVja19wb3NpdGlvbnMoeC5zY2FsZSwgJ3RvcCcsIHgubGFiZWwsICdzJykKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoY29tcG91bmQ9J3Vua25vd24nKSAjIGludmVydCBkZWZhdWx0IHBvc2l0aW9ucworICAgICAgICBjaGVja19wb3NpdGlvbnMoeC5zY2FsZSwgJ3RvcCcsIHgubGFiZWwsICdzJykKKyAgICAgICAgeC5kZXN0cm95KCkKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoKSAjIHRha2UgZGVmYXVsdCBwb3NpdGlvbnMKKyAgICAgICAgY2hlY2tfcG9zaXRpb25zKHguc2NhbGUsICdib3R0b20nLCB4LmxhYmVsLCAnbicpCisgICAgICAgIHguZGVzdHJveSgpCisKKyAgICAgICAgIyBleHRyYSwgYW5kIGludmFsaWQsIGt3YXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0dGsuTGFiZWxlZFNjYWxlLCBhPSdiJykKKworCisgICAgZGVmIHRlc3RfaG9yaXpvbnRhbF9yYW5nZShzZWxmKToKKyAgICAgICAgbHNjYWxlID0gdHRrLkxhYmVsZWRTY2FsZShmcm9tXz0wLCB0bz0xMCkKKyAgICAgICAgbHNjYWxlLnBhY2soKQorICAgICAgICBsc2NhbGUud2FpdF92aXNpYmlsaXR5KCkKKyAgICAgICAgbHNjYWxlLnVwZGF0ZSgpCisKKyAgICAgICAgbGluZm9fMSA9IGxzY2FsZS5sYWJlbC5wbGFjZV9pbmZvKCkKKyAgICAgICAgcHJldl94Y29vcmQgPSBsc2NhbGUuc2NhbGUuY29vcmRzKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcmV2X3hjb29yZCwgaW50KGxpbmZvXzFbJ3gnXSkpCisgICAgICAgICMgY2hhbmdlIHJhbmdlIHRvOiBmcm9tIC01IHRvIDUuIFRoaXMgc2hvdWxkIGNoYW5nZSB0aGUgeCBjb29yZCBvZgorICAgICAgICAjIHRoZSBzY2FsZSB3aWRnZXQsIHNpbmNlIDAgaXMgYXQgdGhlIG1pZGRsZSBvZiB0aGUgbmV3CisgICAgICAgICMgcmFuZ2UuCisgICAgICAgIGxzY2FsZS5zY2FsZS5jb25maWd1cmUoZnJvbV89LTUsIHRvPTUpCisgICAgICAgICMgVGhlIGZvbGxvd2luZyB1cGRhdGUgaXMgbmVlZGVkIHNpbmNlIHRoZSB0ZXN0IGRvZXNuJ3QgdXNlIG1haW5sb29wLAorICAgICAgICAjIGF0IHRoZSBzYW1lIHRpbWUgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IHRlc3Qgb3V0Y29tZQorICAgICAgICBsc2NhbGUudXBkYXRlKCkKKyAgICAgICAgY3Vycl94Y29vcmQgPSBsc2NhbGUuc2NhbGUuY29vcmRzKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByZXZfeGNvb3JkICE9IGN1cnJfeGNvb3JkKQorICAgICAgICAjIHRoZSBsYWJlbCB3aWRnZXQgc2hvdWxkIGhhdmUgYmVlbiByZXBvc2l0aW9uZWQgdG9vCisgICAgICAgIGxpbmZvXzIgPSBsc2NhbGUubGFiZWwucGxhY2VfaW5mbygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHNjYWxlLmxhYmVsWyd0ZXh0J10sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3Vycl94Y29vcmQsIGludChsaW5mb18yWyd4J10pKQorICAgICAgICAjIGNoYW5nZSB0aGUgcmFuZ2UgYmFjaworICAgICAgICBsc2NhbGUuc2NhbGUuY29uZmlndXJlKGZyb21fPTAsIHRvPTEwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJldl94Y29vcmQgIT0gY3Vycl94Y29vcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJldl94Y29vcmQsIGludChsaW5mb18xWyd4J10pKQorCisgICAgICAgIGxzY2FsZS5kZXN0cm95KCkKKworCisgICAgZGVmIHRlc3RfdmFyaWFibGVfY2hhbmdlKHNlbGYpOgorICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSgpCisgICAgICAgIHgucGFjaygpCisgICAgICAgIHgud2FpdF92aXNpYmlsaXR5KCkKKyAgICAgICAgeC51cGRhdGUoKQorCisgICAgICAgIGN1cnJfeGNvb3JkID0geC5zY2FsZS5jb29yZHMoKVswXQorICAgICAgICBuZXd2YWwgPSB4LnZhbHVlICsgMQorICAgICAgICB4LnZhbHVlID0gbmV3dmFsCisgICAgICAgICMgVGhlIGZvbGxvd2luZyB1cGRhdGUgaXMgbmVlZGVkIHNpbmNlIHRoZSB0ZXN0IGRvZXNuJ3QgdXNlIG1haW5sb29wLAorICAgICAgICAjIGF0IHRoZSBzYW1lIHRpbWUgdGhpcyBzaG91bGRuJ3QgYWZmZWN0IHRlc3Qgb3V0Y29tZQorICAgICAgICB4LnVwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5sYWJlbFsndGV4dCddLCBuZXd2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LnNjYWxlLmNvb3JkcygpWzBdID4gY3Vycl94Y29vcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zY2FsZS5jb29yZHMoKVswXSwKKyAgICAgICAgICAgIGludCh4LmxhYmVsLnBsYWNlX2luZm8oKVsneCddKSkKKworICAgICAgICAjIHZhbHVlIG91dHNpZGUgcmFuZ2UKKyAgICAgICAgeC52YWx1ZSA9IHguc2NhbGVbJ3RvJ10gKyAxICMgbm8gY2hhbmdlcyBzaG91bGRuJ3QgaGFwcGVuCisgICAgICAgIHgudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNjYWxlLmNvb3JkcygpWzBdLAorICAgICAgICAgICAgaW50KHgubGFiZWwucGxhY2VfaW5mbygpWyd4J10pKQorCisgICAgICAgIHguZGVzdHJveSgpCisKKworICAgIGRlZiB0ZXN0X3Jlc2l6ZShzZWxmKToKKyAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoKQorICAgICAgICB4LnBhY2soZXhwYW5kPVRydWUsIGZpbGw9J2JvdGgnKQorICAgICAgICB4LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIHgudXBkYXRlKCkKKworICAgICAgICB3aWR0aCwgaGVpZ2h0ID0geC5tYXN0ZXIud2luZm9fd2lkdGgoKSwgeC5tYXN0ZXIud2luZm9faGVpZ2h0KCkKKyAgICAgICAgd2lkdGhfbmV3LCBoZWlnaHRfbmV3ID0gd2lkdGggKiAyLCBoZWlnaHQgKiAyCisKKyAgICAgICAgeC52YWx1ZSA9IDMKKyAgICAgICAgeC51cGRhdGUoKQorICAgICAgICB4Lm1hc3Rlci53bV9nZW9tZXRyeSgiJWR4JWQiICUgKHdpZHRoX25ldywgaGVpZ2h0X25ldykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHgubGFiZWwucGxhY2VfaW5mbygpWyd4J10pLAorICAgICAgICAgICAgeC5zY2FsZS5jb29yZHMoKVswXSkKKworICAgICAgICAjIFJlc2V0IGdlb21ldHJ5CisgICAgICAgIHgubWFzdGVyLndtX2dlb21ldHJ5KCIlZHglZCIgJSAod2lkdGgsIGhlaWdodCkpCisgICAgICAgIHguZGVzdHJveSgpCisKKworY2xhc3MgT3B0aW9uTWVudVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKyAgICAgICAgc2VsZi50ZXh0dmFyID0gVGtpbnRlci5TdHJpbmdWYXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi50ZXh0dmFyCisgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisKKworICAgIGRlZiB0ZXN0X3dpZGdldF9kZXN0cm95KHNlbGYpOgorICAgICAgICB2YXIgPSBUa2ludGVyLlN0cmluZ1ZhcigpCisgICAgICAgIG9wdG1lbnUgPSB0dGsuT3B0aW9uTWVudShOb25lLCB2YXIpCisgICAgICAgIG5hbWUgPSB2YXIuX25hbWUKKyAgICAgICAgb3B0bWVudS51cGRhdGVfaWRsZXRhc2tzKCkKKyAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRtZW51LnRrLmdsb2JhbGdldHZhcihuYW1lKSwgdmFyLmdldCgpKQorICAgICAgICBkZWwgdmFyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIG9wdG1lbnUudGsuZ2xvYmFsZ2V0dmFyLCBuYW1lKQorCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXphdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgICAgIHR0ay5PcHRpb25NZW51LCBOb25lLCBzZWxmLnRleHR2YXIsIGludmFsaWQ9J3RoaW5nJykKKworICAgICAgICBvcHRtZW51ID0gdHRrLk9wdGlvbk1lbnUoTm9uZSwgc2VsZi50ZXh0dmFyLCAnYicsICdhJywgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdG1lbnUuX3ZhcmlhYmxlLmdldCgpLCAnYicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdG1lbnVbJ21lbnUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdG1lbnVbJ3RleHR2YXJpYWJsZSddKQorCisgICAgICAgIG9wdG1lbnUuZGVzdHJveSgpCisKKworICAgIGRlZiB0ZXN0X21lbnUoc2VsZik6CisgICAgICAgIGl0ZW1zID0gKCdhJywgJ2InLCAnYycpCisgICAgICAgIGRlZmF1bHQgPSAnYScKKyAgICAgICAgb3B0bWVudSA9IHR0ay5PcHRpb25NZW51KE5vbmUsIHNlbGYudGV4dHZhciwgZGVmYXVsdCwgKml0ZW1zKQorICAgICAgICBmb3VuZF9kZWZhdWx0ID0gRmFsc2UKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGl0ZW1zKSk6CisgICAgICAgICAgICB2YWx1ZSA9IG9wdG1lbnVbJ21lbnUnXS5lbnRyeWNnZXQoaSwgJ3ZhbHVlJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIGl0ZW1zW2ldKQorICAgICAgICAgICAgaWYgdmFsdWUgPT0gZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmb3VuZF9kZWZhdWx0ID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmRfZGVmYXVsdCkKKyAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKKworICAgICAgICAjIGRlZmF1bHQgc2hvdWxkbid0IGJlIGluIG1lbnUgaWYgaXQgaXMgbm90IHBhcnQgb2YgdmFsdWVzCisgICAgICAgIGRlZmF1bHQgPSAnZCcKKyAgICAgICAgb3B0bWVudSA9IHR0ay5PcHRpb25NZW51KE5vbmUsIHNlbGYudGV4dHZhciwgZGVmYXVsdCwgKml0ZW1zKQorICAgICAgICBjdXJyID0gTm9uZQorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGFzdCwgY3VyciA9IGN1cnIsIG9wdG1lbnVbJ21lbnUnXS5lbnRyeWNvbmZpZ3VyZShpLCAndmFsdWUnKQorICAgICAgICAgICAgaWYgbGFzdCA9PSBjdXJyOgorICAgICAgICAgICAgICAgICMgbm8gbW9yZSBtZW51IGVudHJpZXMKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjdXJyID09IGRlZmF1bHQpCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLCBsZW4oaXRlbXMpKQorCisgICAgICAgICMgY2hlY2sgdGhhdCB2YXJpYWJsZSBpcyB1cGRhdGVkIGNvcnJlY3RseQorICAgICAgICBvcHRtZW51LnBhY2soKQorICAgICAgICBvcHRtZW51LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIG9wdG1lbnVbJ21lbnUnXS5pbnZva2UoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRtZW51Ll92YXJpYWJsZS5nZXQoKSwgaXRlbXNbMF0pCisKKyAgICAgICAgIyBjaGFuZ2luZyB0byBhbiBpbnZhbGlkIGluZGV4IHNob3VsZG4ndCBjaGFuZ2UgdGhlIHZhcmlhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIG9wdG1lbnVbJ21lbnUnXS5pbnZva2UsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdG1lbnUuX3ZhcmlhYmxlLmdldCgpLCBpdGVtc1swXSkKKworICAgICAgICBvcHRtZW51LmRlc3Ryb3koKQorCisgICAgICAgICMgc3BlY2lmeWluZyBhIGNhbGxiYWNrCisgICAgICAgIHN1Y2Nlc3MgPSBbXQorICAgICAgICBkZWYgY2JfdGVzdChpdGVtKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgaXRlbXNbMV0pCisgICAgICAgICAgICBzdWNjZXNzLmFwcGVuZChUcnVlKQorICAgICAgICBvcHRtZW51ID0gdHRrLk9wdGlvbk1lbnUoTm9uZSwgc2VsZi50ZXh0dmFyLCAnYScsIGNvbW1hbmQ9Y2JfdGVzdCwKKyAgICAgICAgICAgICppdGVtcykKKyAgICAgICAgb3B0bWVudVsnbWVudSddLmludm9rZSgxKQorICAgICAgICBpZiBub3Qgc3VjY2VzczoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTWVudSBjYWxsYmFjayBub3QgaW52b2tlZCIpCisKKyAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKKworCit0ZXN0c19ndWkgPSAoTGFiZWxlZFNjYWxlVGVzdCwgT3B0aW9uTWVudVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0c19ndWkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0M2Q4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0M2Q4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGYwOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQpAQCAtMCwwICsxLDQ1OCBAQAorIyAtKi0gZW5jb2Rpbmc6IHV0Zi04IC0qLQoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdHRrCisKK2NsYXNzIE1vY2tUY2xPYmoob2JqZWN0KToKKyAgICB0eXBlbmFtZSA9ICd0ZXN0JworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHVuaWNvZGUoc2VsZi52YWwpCisKKworY2xhc3MgTW9ja1N0YXRlU3BlYyhvYmplY3QpOgorICAgIHR5cGVuYW1lID0gJ1N0YXRlU3BlYycKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYudmFsID0gYXJncworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLnZhbCkKKworCitjbGFzcyBJbnRlcm5hbEZ1bmN0aW9uc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZm9ybWF0X29wdGRpY3Qoc2VsZik6CisgICAgICAgIGRlZiBjaGVja19hZ2FpbnN0KGZtdF9vcHRzLCByZXN1bHQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGZtdF9vcHRzKSwgMik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQucG9wKGZtdF9vcHRzW2ldKSwgZm10X29wdHNbaSArIDFdKQorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVzdWx0IHN0aWxsIGdvdCBlbGVtZW50czogJXMiICUgcmVzdWx0KQorCisgICAgICAgICMgcGFzc2luZyBhbiBlbXB0eSBkaWN0IHNob3VsZCByZXR1cm4gYW4gZW1wdHkgb2JqZWN0ICh0dXBsZSBoZXJlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHR0ay5fZm9ybWF0X29wdGRpY3Qoe30pKQorCisgICAgICAgICMgY2hlY2sgbGlzdCBmb3JtYXR0aW5nCisgICAgICAgIGNoZWNrX2FnYWluc3QoCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9vcHRkaWN0KHsnZmcnOiAnYmx1ZScsICdwYWRkaW5nJzogWzEsIDIsIDMsIDRdfSksCisgICAgICAgICAgICB7Jy1mZyc6ICdibHVlJywgJy1wYWRkaW5nJzogJzEgMiAzIDQnfSkKKworICAgICAgICAjIGNoZWNrIHR1cGxlIGZvcm1hdHRpbmcgKHNhbWUgYXMgbGlzdCkKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3Qoeyd0ZXN0JzogKDEsIDIsICcnLCAwKX0pLAorICAgICAgICAgICAgeyctdGVzdCc6ICcxIDIge30gMCd9KQorCisgICAgICAgICMgY2hlY2sgdW50b3VjaGVkIHZhbHVlcworICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCh7J3Rlc3QnOiB7J2xlZnQnOiAnYXMgaXMnfX0pLAorICAgICAgICAgICAgeyctdGVzdCc6IHsnbGVmdCc6ICdhcyBpcyd9fSkKKworICAgICAgICAjIGNoZWNrIHNjcmlwdCBmb3JtYXR0aW5nCisgICAgICAgIGNoZWNrX2FnYWluc3QoCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9vcHRkaWN0KAorICAgICAgICAgICAgICAgIHsndGVzdCc6IFsxLCAtMSwgJycsICcybScsIDBdLCAndGVzdDInOiAzLAorICAgICAgICAgICAgICAgICAndGVzdDMnOiAnJywgJ3Rlc3Q0JzogJ2FiYyBkZWYnLAorICAgICAgICAgICAgICAgICAndGVzdDUnOiAnImFiYyInLCAndGVzdDYnOiAne30nLAorICAgICAgICAgICAgICAgICAndGVzdDcnOiAnfSAtc3BhbSB7J30sIHNjcmlwdD1UcnVlKSwKKyAgICAgICAgICAgIHsnLXRlc3QnOiAnezEgLTEge30gMm0gMH0nLCAnLXRlc3QyJzogJzMnLAorICAgICAgICAgICAgICctdGVzdDMnOiAne30nLCAnLXRlc3Q0JzogJ3thYmMgZGVmfScsCisgICAgICAgICAgICAgJy10ZXN0NSc6ICd7ImFiYyJ9JywgJy10ZXN0Nic6IHInXHtcfScsCisgICAgICAgICAgICAgJy10ZXN0Nyc6IHInXH1cIC1zcGFtXCBceyd9KQorCisgICAgICAgIG9wdHMgPSB7dSfOsc6yzrMnOiBUcnVlLCB1J8OhJzogRmFsc2V9CisgICAgICAgIG9yaWdfb3B0cyA9IG9wdHMuY29weSgpCisgICAgICAgICMgY2hlY2sgaWYgZ2l2aW5nIHVuaWNvZGUga2V5cyBpcyBmaW5lCisgICAgICAgIGNoZWNrX2FnYWluc3QodHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzKSwge3UnLc6xzrLOsyc6IFRydWUsIHUnLcOhJzogRmFsc2V9KQorICAgICAgICAjIG9wdHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBvcmlnX29wdHMpCisKKyAgICAgICAgIyBwYXNzaW5nIHZhbHVlcyB3aXRoIHNwYWNlcyBpbnNpZGUgYSB0dXBsZS9saXN0CisgICAgICAgIGNoZWNrX2FnYWluc3QoCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9vcHRkaWN0KAorICAgICAgICAgICAgICAgIHsnb3B0aW9uJzogKCdvbmUgdHdvJywgJ3RocmVlJyl9KSwKKyAgICAgICAgICAgIHsnLW9wdGlvbic6ICd7b25lIHR3b30gdGhyZWUnfSkKKyAgICAgICAgY2hlY2tfYWdhaW5zdCgKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X29wdGRpY3QoCisgICAgICAgICAgICAgICAgeydvcHRpb24nOiAoJ29uZVx0dHdvJywgJ3RocmVlJyl9KSwKKyAgICAgICAgICAgIHsnLW9wdGlvbic6ICd7b25lXHR0d299IHRocmVlJ30pCisKKyAgICAgICAgIyBwYXNzaW5nIGVtcHR5IHN0cmluZ3MgaW5zaWRlIGEgdHVwbGUvbGlzdAorICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKKyAgICAgICAgICAgICAgICB7J29wdGlvbic6ICgnJywgJ29uZScpfSksCisgICAgICAgICAgICB7Jy1vcHRpb24nOiAne30gb25lJ30pCisKKyAgICAgICAgIyBwYXNzaW5nIHZhbHVlcyB3aXRoIGJyYWNlcyBpbnNpZGUgYSB0dXBsZS9saXN0CisgICAgICAgIGNoZWNrX2FnYWluc3QoCisgICAgICAgICAgICB0dGsuX2Zvcm1hdF9vcHRkaWN0KAorICAgICAgICAgICAgICAgIHsnb3B0aW9uJzogKCdvbmV9IHt0d28nLCAndGhyZWUnKX0pLAorICAgICAgICAgICAgeyctb3B0aW9uJzogcidvbmVcfVwgXHt0d28gdGhyZWUnfSkKKworICAgICAgICAjIHBhc3NpbmcgcXVvdGVkIHN0cmluZ3MgaW5zaWRlIGEgdHVwbGUvbGlzdAorICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKKyAgICAgICAgICAgICAgICB7J29wdGlvbic6ICgnIm9uZSInLCAndHdvJyl9KSwKKyAgICAgICAgICAgIHsnLW9wdGlvbic6ICd7Im9uZSJ9IHR3byd9KQorICAgICAgICBjaGVja19hZ2FpbnN0KAorICAgICAgICAgICAgdHRrLl9mb3JtYXRfb3B0ZGljdCgKKyAgICAgICAgICAgICAgICB7J29wdGlvbic6ICgne29uZX0nLCAndHdvJyl9KSwKKyAgICAgICAgICAgIHsnLW9wdGlvbic6IHInXHtvbmVcfSB0d28nfSkKKworICAgICAgICAjIGlnbm9yZSBhbiBvcHRpb24KKyAgICAgICAgYW1vdW50X29wdHMgPSBsZW4odHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzLCBpZ25vcmU9KHUnw6EnKSkpIC8vIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbW91bnRfb3B0cywgbGVuKG9wdHMpIC0gMSkKKworICAgICAgICAjIGlnbm9yZSBub24tZXhpc3Rpbmcgb3B0aW9ucworICAgICAgICBhbW91bnRfb3B0cyA9IGxlbih0dGsuX2Zvcm1hdF9vcHRkaWN0KG9wdHMsIGlnbm9yZT0odSfDoScsICdiJykpKSAvLyAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW1vdW50X29wdHMsIGxlbihvcHRzKSAtIDEpCisKKyAgICAgICAgIyBpZ25vcmUgZXZlcnkgb3B0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzLCBpZ25vcmU9b3B0cy5rZXlzKCkpKQorCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfbWFwZGljdChzZWxmKToKKyAgICAgICAgb3B0cyA9IHsnYSc6IFsoJ2InLCAnYycsICd2YWwnKSwgKCdkJywgJ290aGVydmFsJyksICgnJywgJ3NpbmdsZScpXX0KKyAgICAgICAgcmVzdWx0ID0gdHRrLl9mb3JtYXRfbWFwZGljdChvcHRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCBsZW4ob3B0cy5rZXlzKCkpICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICgnLWEnLCAne2IgY30gdmFsIGQgb3RoZXJ2YWwge30gc2luZ2xlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdChvcHRzLCBzY3JpcHQ9VHJ1ZSksCisgICAgICAgICAgICAoJy1hJywgJ3t7YiBjfSB2YWwgZCBvdGhlcnZhbCB7fSBzaW5nbGV9JykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9tYXBkaWN0KHsyOiBbXX0pLCAoJy0yJywgJycpKQorCisgICAgICAgIG9wdHMgPSB7dSfDvMOxw63Eh8OzZMOoJzogWyh1J8OhJywgdSd2w6NsJyldfQorICAgICAgICByZXN1bHQgPSB0dGsuX2Zvcm1hdF9tYXBkaWN0KG9wdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAodSctw7zDscOtxIfDs2TDqCcsIHUnw6EgdsOjbCcpKQorCisgICAgICAgICMgZW1wdHkgc3RhdGVzCisgICAgICAgIHZhbGlkID0geydvcHQnOiBbKCcnLCB1JycsICdoaScpXX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9tYXBkaWN0KHZhbGlkKSwgKCctb3B0JywgJ3sgfSBoaScpKQorCisgICAgICAgICMgd2hlbiBwYXNzaW5nIG11bHRpcGxlIHN0YXRlcywgdGhleSBhbGwgbXVzdCBiZSBzdHJpbmdzCisgICAgICAgIGludmFsaWQgPSB7J29wdCc6IFsoMSwgMiwgJ3ZhbGlkIHZhbCcpXX0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LCBpbnZhbGlkKQorICAgICAgICBpbnZhbGlkID0geydvcHQnOiBbKFsxXSwgJzInLCAndmFsaWQgdmFsJyldfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR0ay5fZm9ybWF0X21hcGRpY3QsIGludmFsaWQpCisgICAgICAgICMgYnV0IHdoZW4gcGFzc2luZyBhIHNpbmdsZSBzdGF0ZSwgaXQgY2FuIGJlIGFueXRoaW5nCisgICAgICAgIHZhbGlkID0geydvcHQnOiBbWzEsICd2YWx1ZSddXX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9tYXBkaWN0KHZhbGlkKSwgKCctb3B0JywgJzEgdmFsdWUnKSkKKyAgICAgICAgIyBzcGVjaWFsIGF0dGVudGlvbiB0byBzaW5nbGUgc3RhdGVzIHdoaWNoIGV2YWx1dGUgdG8gRmFsc2UKKyAgICAgICAgZm9yIHN0YXRldmFsIGluIChOb25lLCAwLCBGYWxzZSwgJycsIHNldCgpKTogIyBqdXN0IHNvbWUgc2FtcGxlcworICAgICAgICAgICAgdmFsaWQgPSB7J29wdCc6IFsoc3RhdGV2YWwsICd2YWx1ZScpXX0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh2YWxpZCksCisgICAgICAgICAgICAgICAgKCctb3B0JywgJ3t9IHZhbHVlJykpCisKKyAgICAgICAgIyB2YWx1ZXMgbXVzdCBiZSBpdGVyYWJsZQorICAgICAgICBvcHRzID0geydhJzogTm9uZX0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LCBvcHRzKQorCisgICAgICAgICMgaXRlbXMgaW4gdGhlIHZhbHVlIG11c3QgaGF2ZSBzaXplID49IDIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwKKyAgICAgICAgICAgIHsnYSc6IFsoJ2ludmFsaWQnLCApXX0pCisKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9lbGVtY3JlYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZShOb25lKSwgKE5vbmUsICgpKSkKKworICAgICAgICAjIyBUZXN0aW5nIHR5cGUgPSBpbWFnZQorICAgICAgICAjIGltYWdlIHR5cGUgZXhwZWN0cyBhdCBsZWFzdCBhbiBpbWFnZSBuYW1lLCBzbyB0aGlzIHNob3VsZCByYWlzZQorICAgICAgICAjIEluZGV4RXJyb3Igc2luY2UgaXQgdHJpZXMgdG8gYWNjZXNzIHRoZSBpbmRleCAwIG9mIGFuIGVtcHR5IHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUsICdpbWFnZScpCisKKyAgICAgICAgIyBkb24ndCBmb3JtYXQgcmV0dXJuZWQgdmFsdWVzIGFzIGEgdGNsIHNjcmlwdAorICAgICAgICAjIG1pbmltdW0gYWNjZXB0YWJsZSBmb3IgaW1hZ2UgdHlwZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgRmFsc2UsICd0ZXN0JyksCisgICAgICAgICAgICAoInRlc3QgIiwgKCkpKQorICAgICAgICAjIHNwZWNpZnlpbmcgYSBzdGF0ZSBzcGVjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAorICAgICAgICAgICAgKCcnLCAnYScpKSwgKCJ0ZXN0IHt9IGEiLCAoKSkpCisgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgRmFsc2UsICd0ZXN0JywKKyAgICAgICAgICAgICgnYScsICdiJywgJ2MnKSksICgidGVzdCB7YSBifSBjIiwgKCkpKQorICAgICAgICAjIHN0YXRlIHNwZWMgYW5kIG9wdGlvbnMKKyAgICAgICAgcmVzID0gdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsICdiJyksIGE9J3gnLCBiPSd5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF0sICJ0ZXN0IGEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHJlc1sxXSksIHsiLWEiLCAieCIsICItYiIsICJ5In0pCisgICAgICAgICMgZm9ybWF0IHJldHVybmVkIHZhbHVlcyBhcyBhIHRjbCBzY3JpcHQKKyAgICAgICAgIyBzdGF0ZSBzcGVjIHdpdGggbXVsdGlwbGUgc3RhdGVzIGFuZCBhbiBvcHRpb24gd2l0aCBhIG11bHRpdmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIFRydWUsICd0ZXN0JywKKyAgICAgICAgICAgICgnYScsICdiJywgJ2MnLCAnZCcpLCB4PVsyLCAzXSksICgie3Rlc3Qge2EgYiBjfSBkfSIsICIteCB7MiAzfSIpKQorCisgICAgICAgICMjIFRlc3RpbmcgdHlwZSA9IHZzYXBpCisgICAgICAgICMgdnNhcGkgdHlwZSBleHBlY3RzIGF0IGxlYXN0IGEgY2xhc3MgbmFtZSBhbmQgYSBwYXJ0X2lkLCBzbyB0aGlzCisgICAgICAgICMgc2hvdWxkIHJhaXNlIGFuIFZhbHVlRXJyb3Igc2luY2UgaXQgdHJpZXMgdG8gZ2V0IHR3byBlbGVtZW50cyBmcm9tCisgICAgICAgICMgYW4gZW1wdHkgdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ3ZzYXBpJykKKworICAgICAgICAjIGRvbid0IGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CisgICAgICAgICMgbWluaW11bSBhY2NlcHRhYmxlIGZvciB2c2FwaQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgRmFsc2UsICdhJywgJ2InKSwKKyAgICAgICAgICAgICgiYSBiICIsICgpKSkKKyAgICAgICAgIyBub3cgd2l0aCBhIHN0YXRlIHNwZWMgd2l0aCBtdWx0aXBsZSBzdGF0ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJywKKyAgICAgICAgICAgICgnYScsICdiJywgJ2MnKSksICgiYSBiIHthIGJ9IGMiLCAoKSkpCisgICAgICAgICMgc3RhdGUgc3BlYyBhbmQgb3B0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgndnNhcGknLCBGYWxzZSwgJ2EnLCAnYicsCisgICAgICAgICAgICAoJ2EnLCAnYicpLCBvcHQ9J3gnKSwgKCJhIGIgYSBiIiwgKCItb3B0IiwgIngiKSkpCisgICAgICAgICMgZm9ybWF0IHJldHVybmVkIHZhbHVlcyBhcyBhIHRjbCBzY3JpcHQKKyAgICAgICAgIyBzdGF0ZSBzcGVjIHdpdGggYSBtdWx0aXZhbHVlIGFuZCBhbiBvcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIFRydWUsICdhJywgJ2InLAorICAgICAgICAgICAgKCdhJywgJ2InLCBbMSwgMl0pLCBvcHQ9J3gnKSwgKCJ7YSBiIHthIGJ9IHsxIDJ9fSIsICItb3B0IHgiKSkKKworICAgICAgICAjIFRlc3RpbmcgdHlwZSA9IGZyb20KKyAgICAgICAgIyBmcm9tIHR5cGUgZXhwZWN0cyBhdCBsZWFzdCBhIHR5cGUgbmFtZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlLCAnZnJvbScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdmcm9tJywgRmFsc2UsICdhJyksCisgICAgICAgICAgICAoJ2EnLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnZnJvbScsIEZhbHNlLCAnYScsICdiJyksCisgICAgICAgICAgICAoJ2EnLCAoJ2InLCApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdmcm9tJywgVHJ1ZSwgJ2EnLCAnYicpLAorICAgICAgICAgICAgKCd7YX0nLCAnYicpKQorCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfbGF5b3V0bGlzdChzZWxmKToKKyAgICAgICAgZGVmIHNhbXBsZShpbmRlbnQ9MCwgaW5kZW50X3NpemU9Mik6CisgICAgICAgICAgICByZXR1cm4gdHRrLl9mb3JtYXRfbGF5b3V0bGlzdCgKKyAgICAgICAgICAgIFsoJ2EnLCB7J290aGVyJzogWzEsIDIsIDNdLCAnY2hpbGRyZW4nOgorICAgICAgICAgICAgICAgIFsoJ2InLCB7J2NoaWxkcmVuJzoKKyAgICAgICAgICAgICAgICAgICAgWygnYycsIHsnY2hpbGRyZW4nOgorICAgICAgICAgICAgICAgICAgICAgICAgWygnZCcsIHsnbmljZSc6ICdvcHQnfSldLCAnc29tZXRoaW5nJzogKDEsIDIpCisgICAgICAgICAgICAgICAgICAgIH0pXQorICAgICAgICAgICAgICAgIH0pXQorICAgICAgICAgICAgfSldLCBpbmRlbnQ9aW5kZW50LCBpbmRlbnRfc2l6ZT1pbmRlbnRfc2l6ZSlbMF0KKworICAgICAgICBkZWYgc2FtcGxlX2V4cGVjdGVkKGluZGVudD0wLCBpbmRlbnRfc2l6ZT0yKToKKyAgICAgICAgICAgIHNwYWNlcyA9IGxhbWJkYSBhbW91bnQ9MDogJyAnICogKGFtb3VudCArIGluZGVudCkKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgIiVzYSAtb3RoZXIgezEgMiAzfSAtY2hpbGRyZW4ge1xuIgorICAgICAgICAgICAgICAgICIlc2IgLWNoaWxkcmVuIHtcbiIKKyAgICAgICAgICAgICAgICAiJXNjIC1zb21ldGhpbmcgezEgMn0gLWNoaWxkcmVuIHtcbiIKKyAgICAgICAgICAgICAgICAiJXNkIC1uaWNlIG9wdFxuIgorICAgICAgICAgICAgICAgICIlc31cbiIKKyAgICAgICAgICAgICAgICAiJXN9XG4iCisgICAgICAgICAgICAgICAgIiVzfSIgJSAoc3BhY2VzKCksIHNwYWNlcyhpbmRlbnRfc2l6ZSksCisgICAgICAgICAgICAgICAgICAgIHNwYWNlcygyICogaW5kZW50X3NpemUpLCBzcGFjZXMoMyAqIGluZGVudF9zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgc3BhY2VzKDIgKiBpbmRlbnRfc2l6ZSksIHNwYWNlcyhpbmRlbnRfc2l6ZSksIHNwYWNlcygpKSkKKworICAgICAgICAjIGVtcHR5IGxheW91dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2xheW91dGxpc3QoW10pWzBdLCAnJykKKworICAgICAgICAjIHNtYWxsZXN0IChhZnRlciBhbiBlbXB0eSBvbmUpIGFjY2VwdGFibGUgbGF5b3V0CisgICAgICAgIHNtYWxsZXN0ID0gdHRrLl9mb3JtYXRfbGF5b3V0bGlzdChbKCdhJywgTm9uZSldLCBpbmRlbnQ9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbWFsbGVzdCwKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X2xheW91dGxpc3QoWygnYScsICcnKV0sIGluZGVudD0wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbWFsbGVzdFswXSwgJ2EnKQorCisgICAgICAgICMgdGVzdGluZyBpbmRlbnRhdGlvbiBsZXZlbHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wbGUoKSwgc2FtcGxlX2V4cGVjdGVkKCkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wbGUoaSksIHNhbXBsZV9leHBlY3RlZChpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcGxlKGksIGkpLCBzYW1wbGVfZXhwZWN0ZWQoaSwgaSkpCisKKyAgICAgICAgIyBpbnZhbGlkIGxheW91dCBmb3JtYXQsIGRpZmZlcmVudCBraW5kIG9mIGV4Y2VwdGlvbnMgd2lsbCBiZQorICAgICAgICAjIHJhaXNlZAorCisgICAgICAgICMgcGxhaW4gd3JvbmcgZm9ybWF0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fZm9ybWF0X2xheW91dGxpc3QsCisgICAgICAgICAgICBbJ2JhZCcsICdmb3JtYXQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LCBOb25lKQorICAgICAgICAjIF9mb3JtYXRfbGF5b3V0bGlzdCBhbHdheXMgZXhwZWN0cyB0aGUgc2Vjb25kIGl0ZW0gKGluIGV2ZXJ5IGl0ZW0pCisgICAgICAgICMgdG8gYWN0IGxpa2UgYSBkaWN0IChleGNlcHQgd2hlbiB0aGUgdmFsdWUgZXZhbHV0ZXMgdG8gRmFsc2UpLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgIHR0ay5fZm9ybWF0X2xheW91dGxpc3QsIFsoJ2EnLCAnYicpXSkKKyAgICAgICAgIyBiYWQgY2hpbGRyZW4gZm9ybWF0dGluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LAorICAgICAgICAgICAgWygnbmFtZScsIHsnY2hpbGRyZW4nOiB7J2EnOiBOb25lfX0pXSkKKworCisgICAgZGVmIHRlc3Rfc2NyaXB0X2Zyb21fc2V0dGluZ3Moc2VsZik6CisgICAgICAgICMgZW1wdHkgb3B0aW9ucworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzoKKyAgICAgICAgICAgIHsnY29uZmlndXJlJzogTm9uZSwgJ21hcCc6IE5vbmUsICdlbGVtZW50IGNyZWF0ZSc6IE5vbmV9fSkpCisKKyAgICAgICAgIyBlbXB0eSBsYXlvdXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzogeydsYXlvdXQnOiBOb25lfX0pLAorICAgICAgICAgICAgInR0azo6c3R5bGUgbGF5b3V0IG5hbWUge1xubnVsbFxufSIpCisKKyAgICAgICAgY29uZmlnZGljdCA9IHt1J86xzrLOsyc6IFRydWUsIHUnw6EnOiBGYWxzZX0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgdHRrLl9zY3JpcHRfZnJvbV9zZXR0aW5ncyh7J25hbWUnOiB7J2NvbmZpZ3VyZSc6IGNvbmZpZ2RpY3R9fSkpCisKKyAgICAgICAgbWFwZGljdCA9IHt1J8O8w7HDrcSHw7Nkw6gnOiBbKHUnw6EnLCB1J3bDo2wnKV19CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzogeydtYXAnOiBtYXBkaWN0fX0pKQorCisgICAgICAgICMgaW52YWxpZCBpbWFnZSBlbGVtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsCisgICAgICAgICAgICB0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzLCB7J25hbWUnOiB7J2VsZW1lbnQgY3JlYXRlJzogWydpbWFnZSddfX0pCisKKyAgICAgICAgIyBtaW5pbWFsIHZhbGlkIGltYWdlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6CisgICAgICAgICAgICB7J2VsZW1lbnQgY3JlYXRlJzogWydpbWFnZScsICduYW1lJ119fSkpCisKKyAgICAgICAgaW1hZ2UgPSB7J3RoaW5nJzogeydlbGVtZW50IGNyZWF0ZSc6CisgICAgICAgICAgICBbJ2ltYWdlJywgJ25hbWUnLCAoJ3N0YXRlMScsICdzdGF0ZTInLCAndmFsJyldfX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIpCisKKyAgICAgICAgaW1hZ2VbJ3RoaW5nJ11bJ2VsZW1lbnQgY3JlYXRlJ10uYXBwZW5kKHsnb3B0JzogMzB9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoaW1hZ2UpLAorICAgICAgICAgICAgInR0azo6c3R5bGUgZWxlbWVudCBjcmVhdGUgdGhpbmcgaW1hZ2Uge25hbWUge3N0YXRlMSBzdGF0ZTJ9IHZhbH0gIgorICAgICAgICAgICAgIi1vcHQgMzAiKQorCisgICAgICAgIGltYWdlWyd0aGluZyddWydlbGVtZW50IGNyZWF0ZSddWy0xXVsnb3B0J10gPSBbTW9ja1RjbE9iaigzKSwKKyAgICAgICAgICAgIE1vY2tUY2xPYmooJzJtJyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9zY3JpcHRfZnJvbV9zZXR0aW5ncyhpbWFnZSksCisgICAgICAgICAgICAidHRrOjpzdHlsZSBlbGVtZW50IGNyZWF0ZSB0aGluZyBpbWFnZSB7bmFtZSB7c3RhdGUxIHN0YXRlMn0gdmFsfSAiCisgICAgICAgICAgICAiLW9wdCB7MyAybX0iKQorCisKKyAgICBkZWYgdGVzdF9kaWN0X2Zyb21fdGNsdHVwbGUoc2VsZik6CisgICAgICAgIGZha2V0dHVwbGUgPSAoJy1hJywgJ3sxIDIgM30nLCAnLXNvbWV0aGluZycsICdmb28nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSwgRmFsc2UpLAorICAgICAgICAgICAgeyctYSc6ICd7MSAyIDN9JywgJy1zb21ldGhpbmcnOiAnZm9vJ30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2RpY3RfZnJvbV90Y2x0dXBsZShmYWtldHR1cGxlKSwKKyAgICAgICAgICAgIHsnYSc6ICd7MSAyIDN9JywgJ3NvbWV0aGluZyc6ICdmb28nfSkKKworICAgICAgICAjIHBhc3NpbmcgYSB0dXBsZSB3aXRoIGEgc2luZ2xlIGl0ZW0gc2hvdWxkIHJldHVybiBhbiBlbXB0eSBkaWN0LAorICAgICAgICAjIHNpbmNlIGl0IHRyaWVzIHRvIGJyZWFrIHRoZSB0dXBsZSBieSBwYWlycy4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0dGsuX2RpY3RfZnJvbV90Y2x0dXBsZSgoJ3NpbmdsZScsICkpKQorCisgICAgICAgIHNzcGVjID0gTW9ja1N0YXRlU3BlYygnYScsICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2RpY3RfZnJvbV90Y2x0dXBsZSgoJy1hJywgKHNzcGVjLCAndmFsJykpKSwKKyAgICAgICAgICAgIHsnYSc6IFsoJ2EnLCAnYicsICd2YWwnKV19KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKE1vY2tUY2xPYmooJy1wYWRkaW5nJyksCisgICAgICAgICAgICBbTW9ja1RjbE9iaignMScpLCAyLCBNb2NrVGNsT2JqKCczbScpXSkpLAorICAgICAgICAgICAgeydwYWRkaW5nJzogWzEsIDIsICczbSddfSkKKworCisgICAgZGVmIHRlc3RfbGlzdF9mcm9tX3N0YXRlc3BlYyhzZWxmKToKKyAgICAgICAgZGVmIHRlc3RfaXQoc3NwZWMsIHZhbHVlLCByZXNfdmFsdWUsIHN0YXRlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX3N0YXRlc3BlYygKKyAgICAgICAgICAgICAgICAoc3NwZWMsIHZhbHVlKSksIFtzdGF0ZXMgKyAocmVzX3ZhbHVlLCApXSkKKworICAgICAgICBzdGF0ZXNfZXZlbiA9IHR1cGxlKCdzdGF0ZSVkJyAlIGkgZm9yIGkgaW4gcmFuZ2UoNikpCisgICAgICAgIHN0YXRlc3BlYyA9IE1vY2tTdGF0ZVNwZWMoKnN0YXRlc19ldmVuKQorICAgICAgICB0ZXN0X2l0KHN0YXRlc3BlYywgJ3ZhbCcsICd2YWwnLCBzdGF0ZXNfZXZlbikKKyAgICAgICAgdGVzdF9pdChzdGF0ZXNwZWMsIE1vY2tUY2xPYmooJ3ZhbCcpLCAndmFsJywgc3RhdGVzX2V2ZW4pCisKKyAgICAgICAgc3RhdGVzX29kZCA9IHR1cGxlKCdzdGF0ZSVkJyAlIGkgZm9yIGkgaW4gcmFuZ2UoNSkpCisgICAgICAgIHN0YXRlc3BlYyA9IE1vY2tTdGF0ZVNwZWMoKnN0YXRlc19vZGQpCisgICAgICAgIHRlc3RfaXQoc3RhdGVzcGVjLCAndmFsJywgJ3ZhbCcsIHN0YXRlc19vZGQpCisKKyAgICAgICAgdGVzdF9pdCgoJ2EnLCAnYicsICdjJyksIE1vY2tUY2xPYmooJ3ZhbCcpLCAndmFsJywgKCdhJywgJ2InLCAnYycpKQorCisKKyAgICBkZWYgdGVzdF9saXN0X2Zyb21fbGF5b3V0dHVwbGUoc2VsZik6CisgICAgICAgICMgZW1wdHkgbGF5b3V0IHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUoKCkpKQorCisgICAgICAgICMgc2hvcnRlc3QgbGF5b3V0IHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUoKCduYW1lJywgKSksCisgICAgICAgICAgICBbKCduYW1lJywge30pXSkKKworICAgICAgICAjIG5vdCBzbyBpbnRlcmVzdGluZyBsdHVwbGUKKyAgICAgICAgc2FtcGxlX2x0dXBsZSA9ICgnbmFtZScsICctb3B0aW9uJywgJ3ZhbHVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZShzYW1wbGVfbHR1cGxlKSwKKyAgICAgICAgICAgIFsoJ25hbWUnLCB7J29wdGlvbic6ICd2YWx1ZSd9KV0pCisKKyAgICAgICAgIyBlbXB0eSBjaGlsZHJlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKAorICAgICAgICAgICAgKCdzb21ldGhpbmcnLCAnLWNoaWxkcmVuJywgKCkpKSwKKyAgICAgICAgICAgIFsoJ3NvbWV0aGluZycsIHsnY2hpbGRyZW4nOiBbXX0pXQorICAgICAgICApCisKKyAgICAgICAgIyBtb3JlIGludGVyZXN0aW5nIGx0dXBsZQorICAgICAgICBsdHVwbGUgPSAoCisgICAgICAgICAgICAnbmFtZScsICctb3B0aW9uJywgJ25pY2VvbmUnLCAnLWNoaWxkcmVuJywgKAorICAgICAgICAgICAgICAgICgnb3RoZXJvbmUnLCAnLWNoaWxkcmVuJywgKAorICAgICAgICAgICAgICAgICAgICAoJ2NoaWxkJywgKSksICctb3RoZXJvcHQnLCAnb3RoZXJ2YWx1ZScKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZShsdHVwbGUpLAorICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ25pY2VvbmUnLCAnY2hpbGRyZW4nOgorICAgICAgICAgICAgICAgIFsoJ290aGVyb25lJywgeydvdGhlcm9wdCc6ICdvdGhlcnZhbHVlJywgJ2NoaWxkcmVuJzoKKyAgICAgICAgICAgICAgICAgICAgWygnY2hpbGQnLCB7fSldCisgICAgICAgICAgICAgICAgfSldCisgICAgICAgICAgICB9KV0KKyAgICAgICAgKQorCisgICAgICAgICMgYmFkIHR1cGxlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKKyAgICAgICAgICAgICgnbmFtZScsICdub19taW51cycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKKyAgICAgICAgICAgICgnbmFtZScsICdub19taW51cycsICd2YWx1ZScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKKyAgICAgICAgICAgICgnc29tZXRoaW5nJywgJy1jaGlsZHJlbicpKSAjIG5vIGNoaWxkcmVuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAorICAgICAgICAgICAgKCdzb21ldGhpbmcnLCAnLWNoaWxkcmVuJywgJ3ZhbHVlJykpICMgaW52YWxpZCBjaGlsZHJlbgorCisKKyAgICBkZWYgdGVzdF92YWxfb3JfZGljdChzZWxmKToKKyAgICAgICAgZGVmIGZ1bmMob3B0LCB2YWw9Tm9uZSk6CisgICAgICAgICAgICBpZiB2YWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gInRlc3QgdmFsIgorICAgICAgICAgICAgcmV0dXJuIChvcHQsIHZhbCkKKworICAgICAgICBvcHRpb25zID0geyd0ZXN0JzogTm9uZX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMpLCAidGVzdCB2YWwiKQorCisgICAgICAgIG9wdGlvbnMgPSB7J3Rlc3QnOiAzfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fdmFsX29yX2RpY3Qob3B0aW9ucywgZnVuYyksIG9wdGlvbnMpCisKKworICAgIGRlZiB0ZXN0X2NvbnZlcnRfc3RyaW5ndmFsKHNlbGYpOgorICAgICAgICB0ZXN0cyA9ICgKKyAgICAgICAgICAgICgwLCAwKSwgKCcwOScsIDkpLCAoJ2EnLCAnYScpLCAodSfDocOaJywgdSfDocOaJyksIChbXSwgJ1tdJyksCisgICAgICAgICAgICAoTm9uZSwgJ05vbmUnKQorICAgICAgICApCisgICAgICAgIGZvciBvcmlnLCBleHBlY3RlZCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9jb252ZXJ0X3N0cmluZ3ZhbChvcmlnKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgaWYgc3lzLmdldGRlZmF1bHRlbmNvZGluZygpID09ICdhc2NpaSc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgdHRrLl9jb252ZXJ0X3N0cmluZ3ZhbCwgJ8OhJykKKworCitjbGFzcyBUY2xPYmpzVG9QeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgYWRpY3QgPSB7J29wdCc6IHUndsOkbMO6w6gnfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiB1J3bDpGzDusOoJ30pCisKKyAgICAgICAgYWRpY3RbJ29wdCddID0gTW9ja1RjbE9iaihhZGljdFsnb3B0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLCB7J29wdCc6IHUndsOkbMO6w6gnfSkKKworICAgIGRlZiB0ZXN0X211bHRpdmFsdWVzKHNlbGYpOgorICAgICAgICBhZGljdCA9IHsnb3B0JzogWzEsIDIsIDMsIDRdfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiBbMSwgMiwgMywgNF19KQorCisgICAgICAgIGFkaWN0WydvcHQnXSA9IFsxLCAneG0nLCAzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiBbMSwgJ3htJywgM119KQorCisgICAgICAgIGFkaWN0WydvcHQnXSA9IChNb2NrU3RhdGVTcGVjKCdhJywgJ2InKSwgdSd2w6FsxanDqCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLAorICAgICAgICAgICAgeydvcHQnOiBbKCdhJywgJ2InLCB1J3bDoWzFqcOoJyldfSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KHsneCc6IFsneSB6J119KSwKKyAgICAgICAgICAgIHsneCc6IFsneSB6J119KQorCisgICAgZGVmIHRlc3Rfbm9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weSh7J3RleHQnOiAnc29tZSB0ZXh0J30pLAorICAgICAgICAgICAgeyd0ZXh0JzogJ3NvbWUgdGV4dCd9KQorCit0ZXN0c19ub2d1aSA9IChJbnRlcm5hbEZ1bmN0aW9uc1Rlc3QsIFRjbE9ianNUb1B5VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKyAgICBydW5fdW5pdHRlc3QoKnRlc3RzX25vZ3VpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY0MTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmY0MTcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3N0eWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGUwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHkKQEAgLTAsMCArMSw5MSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVGtpbnRlcgoraW1wb3J0IHR0aworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMsIHJ1bl91bml0dGVzdAorCitpbXBvcnQgc3VwcG9ydAorCityZXF1aXJlcygnZ3VpJykKKworY2xhc3MgU3R5bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zdHlsZSA9IHR0ay5TdHlsZSgpCisKKworICAgIGRlZiB0ZXN0X2NvbmZpZ3VyZShzZWxmKToKKyAgICAgICAgc3R5bGUgPSBzZWxmLnN0eWxlCisgICAgICAgIHN0eWxlLmNvbmZpZ3VyZSgnVEJ1dHRvbicsIGJhY2tncm91bmQ9J3llbGxvdycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwKKyAgICAgICAgICAgICd5ZWxsb3cnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdHlsZS5jb25maWd1cmUoJ1RCdXR0b24nKSwgZGljdCkpCisKKworICAgIGRlZiB0ZXN0X21hcChzZWxmKToKKyAgICAgICAgc3R5bGUgPSBzZWxmLnN0eWxlCisgICAgICAgIHN0eWxlLm1hcCgnVEJ1dHRvbicsIGJhY2tncm91bmQ9WygnYWN0aXZlJywgJ2JhY2tncm91bmQnLCAnYmx1ZScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5tYXAoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcpLAorICAgICAgICAgICAgWygnYWN0aXZlJywgJ2JhY2tncm91bmQnLCAnYmx1ZScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUubWFwKCdUQnV0dG9uJyksIGRpY3QpKQorCisKKyAgICBkZWYgdGVzdF9sb29rdXAoc2VsZik6CisgICAgICAgIHN0eWxlID0gc2VsZi5zdHlsZQorICAgICAgICBzdHlsZS5jb25maWd1cmUoJ1RCdXR0b24nLCBiYWNrZ3JvdW5kPSd5ZWxsb3cnKQorICAgICAgICBzdHlsZS5tYXAoJ1RCdXR0b24nLCBiYWNrZ3JvdW5kPVsoJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5sb29rdXAoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcpLCAneWVsbG93JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5sb29rdXAoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcsCisgICAgICAgICAgICBbJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJ10pLCAnYmx1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ29wdGlvbm5vdGRlZmluZWQnLAorICAgICAgICAgICAgZGVmYXVsdD0naWtuZXdpdCcpLCAnaWtuZXdpdCcpCisKKworICAgIGRlZiB0ZXN0X2xheW91dChzZWxmKToKKyAgICAgICAgc3R5bGUgPSBzZWxmLnN0eWxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHN0eWxlLmxheW91dCwgJ05vdEFMYXlvdXQnKQorICAgICAgICB0dl9zdHlsZSA9IHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKQorCisgICAgICAgICMgImVyYXNlIiBUcmVldmlldyBsYXlvdXQKKyAgICAgICAgc3R5bGUubGF5b3V0KCdUcmVldmlldycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKSwKKyAgICAgICAgICAgIFsoJ251bGwnLCB7J3N0aWNreSc6ICduc3dlJ30pXQorICAgICAgICApCisKKyAgICAgICAgIyByZXN0b3JlIGxheW91dAorICAgICAgICBzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JywgdHZfc3R5bGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubGF5b3V0KCdUcmVldmlldycpLCB0dl9zdHlsZSkKKworICAgICAgICAjIHNob3VsZCByZXR1cm4gYSBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN0eWxlLmxheW91dCgnVEJ1dHRvbicpLCBsaXN0KSkKKworICAgICAgICAjIGNvcnJlY3QgbGF5b3V0LCBidXQgIm9wdGlvbiIgZG9lc24ndCBleGlzdCBhcyBvcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc3R5bGUubGF5b3V0LCAnVHJlZXZpZXcnLAorICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ2luZXhpc3RlbnQnfSldKQorCisKKyAgICBkZWYgdGVzdF90aGVtZV91c2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc3R5bGUudGhlbWVfdXNlLAorICAgICAgICAgICAgJ25vbmV4aXN0aW5nbmFtZScpCisKKyAgICAgICAgY3Vycl90aGVtZSA9IHNlbGYuc3R5bGUudGhlbWVfdXNlKCkKKyAgICAgICAgbmV3X3RoZW1lID0gTm9uZQorICAgICAgICBmb3IgdGhlbWUgaW4gc2VsZi5zdHlsZS50aGVtZV9uYW1lcygpOgorICAgICAgICAgICAgaWYgdGhlbWUgIT0gY3Vycl90aGVtZToKKyAgICAgICAgICAgICAgICBuZXdfdGhlbWUgPSB0aGVtZQorICAgICAgICAgICAgICAgIHNlbGYuc3R5bGUudGhlbWVfdXNlKHRoZW1lKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGp1c3Qgb25lIHRoZW1lIGF2YWlsYWJsZSwgY2FuJ3QgZ28gb24gd2l0aCB0ZXN0cworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjdXJyX3RoZW1lID09IG5ld190aGVtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdfdGhlbWUgIT0gc2VsZi5zdHlsZS50aGVtZV91c2UoKSkKKworICAgICAgICBzZWxmLnN0eWxlLnRoZW1lX3VzZShjdXJyX3RoZW1lKQorCisKK3Rlc3RzX2d1aSA9IChTdHlsZVRlc3QsICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBydW5fdW5pdHRlc3QoKnRlc3RzX2d1aSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDNiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDNiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQwNmE3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CkBAIC0wLDAgKzEsMTE1OCBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgVGtpbnRlcgoraW1wb3J0IHR0aworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcmVxdWlyZXMsIHJ1bl91bml0dGVzdAoraW1wb3J0IHN5cworCitpbXBvcnQgc3VwcG9ydAorZnJvbSB0ZXN0X2Z1bmN0aW9ucyBpbXBvcnQgTW9ja1RjbE9iaiwgTW9ja1N0YXRlU3BlYworCityZXF1aXJlcygnZ3VpJykKKworY2xhc3MgV2lkZ2V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgbWV0aG9kcyBhdmFpbGFibGUgaW4gZXZlcnkgdHRrIHdpZGdldC4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC5yb290X2RlaWNvbmlmeSgpCisgICAgICAgIHNlbGYud2lkZ2V0ID0gdHRrLkJ1dHRvbih3aWR0aD0wLCB0ZXh0PSJUZXh0IikKKyAgICAgICAgc2VsZi53aWRnZXQucGFjaygpCisgICAgICAgIHNlbGYud2lkZ2V0LndhaXRfdmlzaWJpbGl0eSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYud2lkZ2V0LmRlc3Ryb3koKQorICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorCisKKyAgICBkZWYgdGVzdF9pZGVudGlmeShzZWxmKToKKyAgICAgICAgc2VsZi53aWRnZXQudXBkYXRlX2lkbGV0YXNrcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoCisgICAgICAgICAgICBpbnQoc2VsZi53aWRnZXQud2luZm9fd2lkdGgoKSAvIDIpLAorICAgICAgICAgICAgaW50KHNlbGYud2lkZ2V0LndpbmZvX2hlaWdodCgpIC8gMikKKyAgICAgICAgICAgICksICJsYWJlbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaWRlbnRpZnksIE5vbmUsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0LmlkZW50aWZ5LCA1LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pZGVudGlmeSwgNSwgJycpCisKKworICAgIGRlZiB0ZXN0X3dpZGdldF9zdGF0ZShzZWxmKToKKyAgICAgICAgIyBYWFggbm90IHN1cmUgYWJvdXQgdGhlIHBvcnRhYmlsaXR5IG9mIGFsbCB0aGVzZSB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0Lmluc3RhdGUoWychZGlzYWJsZWQnXSksIFRydWUpCisKKyAgICAgICAgIyBjaGFuZ2luZyBmcm9tICFkaXNhYmxlZCB0byBkaXNhYmxlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnZGlzYWJsZWQnXSksICgnIWRpc2FibGVkJywgKSkKKyAgICAgICAgIyBubyBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJ2Rpc2FibGVkJ10pLCAoKSkKKyAgICAgICAgIyBjaGFuZ2UgYmFjayB0byAhZGlzYWJsZSBidXQgYWxzbyBhY3RpdmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJyFkaXNhYmxlZCcsICdhY3RpdmUnXSksCisgICAgICAgICAgICAoJyFhY3RpdmUnLCAnZGlzYWJsZWQnKSkKKyAgICAgICAgIyBubyBzdGF0ZSBjaGFuZ2VzLCBhZ2FpbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnIWRpc2FibGVkJywgJ2FjdGl2ZSddKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWydhY3RpdmUnLCAnIWRpc2FibGVkJ10pLCAoKSkKKworICAgICAgICBkZWYgdGVzdF9jYihhcmcxLCAqKmt3KToKKyAgICAgICAgICAgIHJldHVybiBhcmcxLCBrdworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0Lmluc3RhdGUoWychZGlzYWJsZWQnXSwKKyAgICAgICAgICAgIHRlc3RfY2IsICJoaSIsICoqeyJtc2ciOiAidGhlcmUifSksCisgICAgICAgICAgICAoJ2hpJywgeydtc2cnOiAndGhlcmUnfSkpCisKKyAgICAgICAgIyBhdHRlbXB0IHRvIHNldCBpbnZhbGlkIHN0YXRlc3BlYworICAgICAgICBjdXJyc3RhdGUgPSBzZWxmLndpZGdldC5zdGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0Lmluc3RhdGUsCisgICAgICAgICAgICBbJ2JhZHN0YXRlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0Lmluc3RhdGUsCisgICAgICAgICAgICBbJ2Rpc2FibGVkJywgJ2JhZHN0YXRlJ10pCisgICAgICAgICMgdmVyaWZ5IHRoYXQgd2lkZ2V0IGRpZG4ndCBjaGFuZ2UgaXRzIHN0YXRlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VycnN0YXRlLCBzZWxmLndpZGdldC5zdGF0ZSgpKQorCisgICAgICAgICMgZW5zdXJpbmcgdGhhdCBwYXNzaW5nIE5vbmUgYXMgc3RhdGUgZG9lc24ndCBtb2RpZnkgY3VycmVudCBzdGF0ZQorICAgICAgICBzZWxmLndpZGdldC5zdGF0ZShbJ2FjdGl2ZScsICchZGlzYWJsZWQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZSgpLCAoJ2FjdGl2ZScsICkpCisKKworY2xhc3MgQnV0dG9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9pbnZva2Uoc2VsZik6CisgICAgICAgIHN1Y2Nlc3MgPSBbXQorICAgICAgICBidG4gPSB0dGsuQnV0dG9uKGNvbW1hbmQ9bGFtYmRhOiBzdWNjZXNzLmFwcGVuZCgxKSkKKyAgICAgICAgYnRuLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQorCisKK2NsYXNzIENoZWNrYnV0dG9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9pbnZva2Uoc2VsZik6CisgICAgICAgIHN1Y2Nlc3MgPSBbXQorICAgICAgICBkZWYgY2JfdGVzdCgpOgorICAgICAgICAgICAgc3VjY2Vzcy5hcHBlbmQoMSkKKyAgICAgICAgICAgIHJldHVybiAiY2IgdGVzdCBjYWxsZWQiCisKKyAgICAgICAgY2J0biA9IHR0ay5DaGVja2J1dHRvbihjb21tYW5kPWNiX3Rlc3QpCisgICAgICAgICMgdGhlIHZhcmlhYmxlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB0dGsuQ2hlY2tidXR0b24gaXMgYWN0dWFsbHkKKyAgICAgICAgIyB1bmRlZmluZWQgdGlsbCB3ZSBpbnZva2UgdGhlIENoZWNrYnV0dG9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0bi5zdGF0ZSgpLCAoJ2FsdGVybmF0ZScsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIGNidG4udGsuZ2xvYmFsZ2V0dmFyLAorICAgICAgICAgICAgY2J0blsndmFyaWFibGUnXSkKKworICAgICAgICByZXMgPSBjYnRuLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCAiY2IgdGVzdCBjYWxsZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG5bJ29udmFsdWUnXSwKKyAgICAgICAgICAgIGNidG4udGsuZ2xvYmFsZ2V0dmFyKGNidG5bJ3ZhcmlhYmxlJ10pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKKworICAgICAgICBjYnRuWydjb21tYW5kJ10gPSAnJworICAgICAgICByZXMgPSBjYnRuLmludm9rZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oc3VjY2VzcykgPiAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG5bJ29mZnZhbHVlJ10sCisgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKKworCitjbGFzcyBDb21ib2JveFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKyAgICAgICAgc2VsZi5jb21ibyA9IHR0ay5Db21ib2JveCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29tYm8uZGVzdHJveSgpCisgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisKKyAgICBkZWYgX3Nob3dfZHJvcF9kb3duX2xpc3Rib3goc2VsZik6CisgICAgICAgIHdpZHRoID0gc2VsZi5jb21iby53aW5mb193aWR0aCgpCisgICAgICAgIHNlbGYuY29tYm8uZXZlbnRfZ2VuZXJhdGUoJzxCdXR0b25QcmVzcy0xPicsIHg9d2lkdGggLSA1LCB5PTUpCisgICAgICAgIHNlbGYuY29tYm8uZXZlbnRfZ2VuZXJhdGUoJzxCdXR0b25SZWxlYXNlLTE+JywgeD13aWR0aCAtIDUsIHk9NSkKKyAgICAgICAgc2VsZi5jb21iby51cGRhdGVfaWRsZXRhc2tzKCkKKworCisgICAgZGVmIHRlc3RfdmlydHVhbF9ldmVudChzZWxmKToKKyAgICAgICAgc3VjY2VzcyA9IFtdCisKKyAgICAgICAgc2VsZi5jb21ib1sndmFsdWVzJ10gPSBbMV0KKyAgICAgICAgc2VsZi5jb21iby5iaW5kKCc8PENvbWJvYm94U2VsZWN0ZWQ+PicsCisgICAgICAgICAgICBsYW1iZGEgZXZ0OiBzdWNjZXNzLmFwcGVuZChUcnVlKSkKKyAgICAgICAgc2VsZi5jb21iby5wYWNrKCkKKyAgICAgICAgc2VsZi5jb21iby53YWl0X3Zpc2liaWxpdHkoKQorCisgICAgICAgIGhlaWdodCA9IHNlbGYuY29tYm8ud2luZm9faGVpZ2h0KCkKKyAgICAgICAgc2VsZi5fc2hvd19kcm9wX2Rvd25fbGlzdGJveCgpCisgICAgICAgIHNlbGYuY29tYm8udXBkYXRlKCkKKyAgICAgICAgc2VsZi5jb21iby5ldmVudF9nZW5lcmF0ZSgnPFJldHVybj4nKQorICAgICAgICBzZWxmLmNvbWJvLnVwZGF0ZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCisKKworICAgIGRlZiB0ZXN0X3Bvc3Rjb21tYW5kKHNlbGYpOgorICAgICAgICBzdWNjZXNzID0gW10KKworICAgICAgICBzZWxmLmNvbWJvWydwb3N0Y29tbWFuZCddID0gbGFtYmRhOiBzdWNjZXNzLmFwcGVuZChUcnVlKQorICAgICAgICBzZWxmLmNvbWJvLnBhY2soKQorICAgICAgICBzZWxmLmNvbWJvLndhaXRfdmlzaWJpbGl0eSgpCisKKyAgICAgICAgc2VsZi5fc2hvd19kcm9wX2Rvd25fbGlzdGJveCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQorCisgICAgICAgICMgdGVzdGluZyBwb3N0Y29tbWFuZCByZW1vdmFsCisgICAgICAgIHNlbGYuY29tYm9bJ3Bvc3Rjb21tYW5kJ10gPSAnJworICAgICAgICBzZWxmLl9zaG93X2Ryb3BfZG93bl9saXN0Ym94KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3VjY2VzcyksIDEpCisKKworICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZGVmIGNoZWNrX2dldF9jdXJyZW50KGdldHZhbCwgY3VycnZhbCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm8uZ2V0KCksIGdldHZhbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21iby5jdXJyZW50KCksIGN1cnJ2YWwpCisKKyAgICAgICAgY2hlY2tfZ2V0X2N1cnJlbnQoJycsIC0xKQorCisgICAgICAgIHNlbGYuY29tYm9bJ3ZhbHVlcyddID0gWydhJywgMSwgJ2MnXQorCisgICAgICAgIHNlbGYuY29tYm8uc2V0KCdjJykKKyAgICAgICAgY2hlY2tfZ2V0X2N1cnJlbnQoJ2MnLCAyKQorCisgICAgICAgIHNlbGYuY29tYm8uY3VycmVudCgwKQorICAgICAgICBjaGVja19nZXRfY3VycmVudCgnYScsIDApCisKKyAgICAgICAgc2VsZi5jb21iby5zZXQoJ2QnKQorICAgICAgICBjaGVja19nZXRfY3VycmVudCgnZCcsIC0xKQorCisgICAgICAgICMgdGVzdGluZyB2YWx1ZXMgd2l0aCBlbXB0eSBzdHJpbmcKKyAgICAgICAgc2VsZi5jb21iby5zZXQoJycpCisgICAgICAgIHNlbGYuY29tYm9bJ3ZhbHVlcyddID0gKDEsIDIsICcnLCAzKQorICAgICAgICBjaGVja19nZXRfY3VycmVudCgnJywgMikKKworICAgICAgICAjIHRlc3RpbmcgdmFsdWVzIHdpdGggZW1wdHkgc3RyaW5nIHNldCB0aHJvdWdoIGNvbmZpZ3VyZQorICAgICAgICBzZWxmLmNvbWJvLmNvbmZpZ3VyZSh2YWx1ZXM9WzEsICcnLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbWJvWyd2YWx1ZXMnXSwgKCcxJywgJycsICcyJykpCisKKyAgICAgICAgIyB0ZXN0aW5nIHZhbHVlcyB3aXRoIHNwYWNlcworICAgICAgICBzZWxmLmNvbWJvWyd2YWx1ZXMnXSA9IFsnYSBiJywgJ2FcdGInLCAnYVxuYiddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb21ib1sndmFsdWVzJ10sICgnYSBiJywgJ2FcdGInLCAnYVxuYicpKQorCisgICAgICAgICMgdGVzdGluZyB2YWx1ZXMgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMKKyAgICAgICAgc2VsZi5jb21ib1sndmFsdWVzJ10gPSBbcidhXHRiJywgJyJhIicsICd9IHsnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm9bJ3ZhbHVlcyddLCAocidhXHRiJywgJyJhIicsICd9IHsnKSkKKworICAgICAgICAjIG91dCBvZiByYW5nZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsCisgICAgICAgICAgICBsZW4oc2VsZi5jb21ib1sndmFsdWVzJ10pKQorICAgICAgICAjIGl0IGV4cGVjdHMgYW4gaW50ZWdlciAob3Igc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuY29tYm8uY3VycmVudCwgJycpCisKKyAgICAgICAgIyB0ZXN0aW5nIGNyZWF0aW5nIGNvbWJvYm94IHdpdGggZW1wdHkgc3RyaW5nIGluIHZhbHVlcworICAgICAgICBjb21ibzIgPSB0dGsuQ29tYm9ib3godmFsdWVzPVsxLCAyLCAnJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tYm8yWyd2YWx1ZXMnXSwgKCcxJywgJzInLCAnJykpCisgICAgICAgIGNvbWJvMi5kZXN0cm95KCkKKworCitjbGFzcyBFbnRyeVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKyAgICAgICAgc2VsZi5lbnRyeSA9IHR0ay5FbnRyeSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZW50cnkuZGVzdHJveSgpCisgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisKKworICAgIGRlZiB0ZXN0X2Jib3goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuZW50cnkuYmJveCgwKSksIDQpCisgICAgICAgIGZvciBpdGVtIGluIHNlbGYuZW50cnkuYmJveCgwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGl0ZW0sIGludCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5iYm94LCAnbm9pbmRleCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkuYmJveCwgTm9uZSkKKworCisgICAgZGVmIHRlc3RfaWRlbnRpZnkoc2VsZik6CisgICAgICAgIHNlbGYuZW50cnkucGFjaygpCisgICAgICAgIHNlbGYuZW50cnkud2FpdF92aXNpYmlsaXR5KCkKKyAgICAgICAgc2VsZi5lbnRyeS51cGRhdGVfaWRsZXRhc2tzKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuaWRlbnRpZnkoNSwgNSksICJ0ZXh0YXJlYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5pZGVudGlmeSgtMSwgLTEpLCAiIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCBOb25lLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCA1LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCA1LCAnJykKKworCisgICAgZGVmIHRlc3RfdmFsaWRhdGlvbl9vcHRpb25zKHNlbGYpOgorICAgICAgICBzdWNjZXNzID0gW10KKyAgICAgICAgdGVzdF9pbnZhbGlkID0gbGFtYmRhOiBzdWNjZXNzLmFwcGVuZChUcnVlKQorCisgICAgICAgIHNlbGYuZW50cnlbJ3ZhbGlkYXRlJ10gPSAnbm9uZScKKyAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSBsYW1iZGE6IEZhbHNlCisKKyAgICAgICAgc2VsZi5lbnRyeVsnaW52YWxpZGNvbW1hbmQnXSA9IHRlc3RfaW52YWxpZAorICAgICAgICBzZWxmLmVudHJ5LnZhbGlkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCisKKyAgICAgICAgc2VsZi5lbnRyeVsnaW52YWxpZGNvbW1hbmQnXSA9ICcnCisgICAgICAgIHNlbGYuZW50cnkudmFsaWRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWNjZXNzKSwgMSkKKworICAgICAgICBzZWxmLmVudHJ5WydpbnZhbGlkY29tbWFuZCddID0gdGVzdF9pbnZhbGlkCisgICAgICAgIHNlbGYuZW50cnlbJ3ZhbGlkYXRlY29tbWFuZCddID0gbGFtYmRhOiBUcnVlCisgICAgICAgIHNlbGYuZW50cnkudmFsaWRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWNjZXNzKSwgMSkKKworICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9ICcnCisgICAgICAgIHNlbGYuZW50cnkudmFsaWRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWNjZXNzKSwgMSkKKworICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS52YWxpZGF0ZSkKKworCisgICAgZGVmIHRlc3RfdmFsaWRhdGlvbihzZWxmKToKKyAgICAgICAgdmFsaWRhdGlvbiA9IFtdCisgICAgICAgIGRlZiB2YWxpZGF0ZSh0b19pbnNlcnQpOgorICAgICAgICAgICAgaWYgbm90ICdhJyA8PSB0b19pbnNlcnQubG93ZXIoKSA8PSAneic6CisgICAgICAgICAgICAgICAgdmFsaWRhdGlvbi5hcHBlbmQoRmFsc2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICB2YWxpZGF0aW9uLmFwcGVuZChUcnVlKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZSddID0gJ2tleScKKyAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSBzZWxmLmVudHJ5LnJlZ2lzdGVyKHZhbGlkYXRlKSwgJyVTJworCisgICAgICAgIHNlbGYuZW50cnkuaW5zZXJ0KCdlbmQnLCAxKQorICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbGlkYXRpb24sIFtGYWxzZSwgVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5nZXQoKSwgJ2EnKQorCisKKyAgICBkZWYgdGVzdF9yZXZhbGlkYXRpb24oc2VsZik6CisgICAgICAgIGRlZiB2YWxpZGF0ZShjb250ZW50KToKKyAgICAgICAgICAgIGZvciBsZXR0ZXIgaW4gY29udGVudDoKKyAgICAgICAgICAgICAgICBpZiBub3QgJ2EnIDw9IGxldHRlci5sb3dlcigpIDw9ICd6JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHNlbGYuZW50cnlbJ3ZhbGlkYXRlY29tbWFuZCddID0gc2VsZi5lbnRyeS5yZWdpc3Rlcih2YWxpZGF0ZSksICclUCcKKworICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgJ2F2b2NhZG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkudmFsaWRhdGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnN0YXRlKCksICgpKQorCisgICAgICAgIHNlbGYuZW50cnkuZGVsZXRlKDAsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuZ2V0KCksICcnKQorCisgICAgICAgIHNlbGYuZW50cnkuaW5zZXJ0KCdlbmQnLCAnYTFiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnZhbGlkYXRlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCdpbnZhbGlkJywgKSkKKworICAgICAgICBzZWxmLmVudHJ5LmRlbGV0ZSgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkudmFsaWRhdGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnN0YXRlKCksICgpKQorCisKK2NsYXNzIFBhbmVkd2luZG93VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cHBvcnQucm9vdF9kZWljb25pZnkoKQorICAgICAgICBzZWxmLnBhbmVkID0gdHRrLlBhbmVkd2luZG93KCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5wYW5lZC5kZXN0cm95KCkKKyAgICAgICAgc3VwcG9ydC5yb290X3dpdGhkcmF3KCkKKworCisgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgorICAgICAgICAjIGF0dGVtcHQgdG8gYWRkIGEgY2hpbGQgdGhhdCBpcyBub3QgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIHBhbmVkIHdpbmRvdworICAgICAgICBsYWJlbCA9IHR0ay5MYWJlbChzZWxmLnBhbmVkKQorICAgICAgICBjaGlsZCA9IHR0ay5MYWJlbChsYWJlbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5hZGQsIGNoaWxkKQorICAgICAgICBsYWJlbC5kZXN0cm95KCkKKyAgICAgICAgY2hpbGQuZGVzdHJveSgpCisgICAgICAgICMgYW5vdGhlciBhdHRlbXB0CisgICAgICAgIGxhYmVsID0gdHRrLkxhYmVsKCkKKyAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwobGFiZWwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuYWRkLCBjaGlsZCkKKyAgICAgICAgY2hpbGQuZGVzdHJveSgpCisgICAgICAgIGxhYmVsLmRlc3Ryb3koKQorCisgICAgICAgIGdvb2RfY2hpbGQgPSB0dGsuTGFiZWwoKQorICAgICAgICBzZWxmLnBhbmVkLmFkZChnb29kX2NoaWxkKQorICAgICAgICAjIHJlLWFkZGluZyBhIGNoaWxkIGlzIG5vdCBhY2NlcHRlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgZ29vZF9jaGlsZCkKKworICAgICAgICBvdGhlcl9jaGlsZCA9IHR0ay5MYWJlbChzZWxmLnBhbmVkKQorICAgICAgICBzZWxmLnBhbmVkLmFkZChvdGhlcl9jaGlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhbmVkLnBhbmUoMCksIHNlbGYucGFuZWQucGFuZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5wYW5lLCAyKQorICAgICAgICBnb29kX2NoaWxkLmRlc3Ryb3koKQorICAgICAgICBvdGhlcl9jaGlsZC5kZXN0cm95KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5wYW5lLCAwKQorCisKKyAgICBkZWYgdGVzdF9mb3JnZXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuZm9yZ2V0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmZvcmdldCwgMCkKKworICAgICAgICBzZWxmLnBhbmVkLmFkZCh0dGsuTGFiZWwoKSkKKyAgICAgICAgc2VsZi5wYW5lZC5mb3JnZXQoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIDApCisKKworICAgIGRlZiB0ZXN0X2luc2VydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5pbnNlcnQsIE5vbmUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCAwLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgMCwgMCkKKworICAgICAgICBjaGlsZCA9IHR0ay5MYWJlbCgpCisgICAgICAgIGNoaWxkMiA9IHR0ay5MYWJlbCgpCisgICAgICAgIGNoaWxkMyA9IHR0ay5MYWJlbCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5pbnNlcnQsIDAsIGNoaWxkKQorCisgICAgICAgIHNlbGYucGFuZWQuaW5zZXJ0KCdlbmQnLCBjaGlsZDIpCisgICAgICAgIHNlbGYucGFuZWQuaW5zZXJ0KDAsIGNoaWxkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwgKHN0cihjaGlsZCksIHN0cihjaGlsZDIpKSkKKworICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgwLCBjaGlsZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLCAoc3RyKGNoaWxkMiksIHN0cihjaGlsZCkpKQorCisgICAgICAgIHNlbGYucGFuZWQuaW5zZXJ0KCdlbmQnLCBjaGlsZDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLAorICAgICAgICAgICAgKHN0cihjaGlsZDIpLCBzdHIoY2hpbGQpLCBzdHIoY2hpbGQzKSkpCisKKyAgICAgICAgIyByZWluc2VydGluZyBhIGNoaWxkIHNob3VsZCBtb3ZlIGl0IHRvIGl0cyBjdXJyZW50IHBvc2l0aW9uCisgICAgICAgIHBhbmVzID0gc2VsZi5wYW5lZC5wYW5lcygpCisgICAgICAgIHNlbGYucGFuZWQuaW5zZXJ0KCdlbmQnLCBjaGlsZDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFuZXMsIHNlbGYucGFuZWQucGFuZXMoKSkKKworICAgICAgICAjIG1vdmluZyBjaGlsZDMgdG8gY2hpbGQyIHBvc2l0aW9uIHNob3VsZCByZXN1bHQgaW4gY2hpbGQyIGVuZGluZyB1cAorICAgICAgICAjIGluIHByZXZpb3VzIGNoaWxkIHBvc2l0aW9uIGFuZCBjaGlsZCBlbmRpbmcgdXAgaW4gcHJldmlvdXMgY2hpbGQzCisgICAgICAgICMgcG9zaXRpb24KKyAgICAgICAgc2VsZi5wYW5lZC5pbnNlcnQoY2hpbGQyLCBjaGlsZDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLAorICAgICAgICAgICAgKHN0cihjaGlsZDMpLCBzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSkpCisKKworICAgIGRlZiB0ZXN0X3BhbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCkKKworICAgICAgICBjaGlsZCA9IHR0ay5MYWJlbCgpCisgICAgICAgIHNlbGYucGFuZWQuYWRkKGNoaWxkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnBhbmUoMCksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCB3ZWlnaHQ9Tm9uZSksIDApCisgICAgICAgICMgbmV3ZXIgZm9ybSBmb3IgcXVlcnlpbmcgYSBzaW5nbGUgb3B0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDAsICd3ZWlnaHQnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhbmVkLnBhbmUoMCksIHNlbGYucGFuZWQucGFuZShzdHIoY2hpbGQpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDAsCisgICAgICAgICAgICBiYWRvcHRpb249J3NvbWV2YWx1ZScpCisKKworICAgIGRlZiB0ZXN0X3Nhc2hwb3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAwKQorCisgICAgICAgIGNoaWxkID0gdHRrLkxhYmVsKHNlbGYucGFuZWQsIHRleHQ9J2EnKQorICAgICAgICBzZWxmLnBhbmVkLmFkZChjaGlsZCwgd2VpZ2h0PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMCkKKyAgICAgICAgY2hpbGQyID0gdHRrLkxhYmVsKHNlbGYucGFuZWQsIHRleHQ9J2InKQorICAgICAgICBzZWxmLnBhbmVkLmFkZChjaGlsZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMSkKKworICAgICAgICBzZWxmLnBhbmVkLnBhY2soZXhwYW5kPVRydWUsIGZpbGw9J2JvdGgnKQorICAgICAgICBzZWxmLnBhbmVkLndhaXRfdmlzaWJpbGl0eSgpCisKKyAgICAgICAgY3Vycl9wb3MgPSBzZWxmLnBhbmVkLnNhc2hwb3MoMCkKKyAgICAgICAgc2VsZi5wYW5lZC5zYXNocG9zKDAsIDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjdXJyX3BvcyAhPSBzZWxmLnBhbmVkLnNhc2hwb3MoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYucGFuZWQuc2FzaHBvcygwKSwgaW50KSkKKworCitjbGFzcyBSYWRpb2J1dHRvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW52b2tlKHNlbGYpOgorICAgICAgICBzdWNjZXNzID0gW10KKyAgICAgICAgZGVmIGNiX3Rlc3QoKToKKyAgICAgICAgICAgIHN1Y2Nlc3MuYXBwZW5kKDEpCisgICAgICAgICAgICByZXR1cm4gImNiIHRlc3QgY2FsbGVkIgorCisgICAgICAgIG15dmFyID0gVGtpbnRlci5JbnRWYXIoKQorICAgICAgICBjYnRuID0gdHRrLlJhZGlvYnV0dG9uKGNvbW1hbmQ9Y2JfdGVzdCwgdmFyaWFibGU9bXl2YXIsIHZhbHVlPTApCisgICAgICAgIGNidG4yID0gdHRrLlJhZGlvYnV0dG9uKGNvbW1hbmQ9Y2JfdGVzdCwgdmFyaWFibGU9bXl2YXIsIHZhbHVlPTEpCisKKyAgICAgICAgcmVzID0gY2J0bi5pbnZva2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgImNiIHRlc3QgY2FsbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYnRuWyd2YWx1ZSddLCBteXZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChteXZhci5nZXQoKSwKKyAgICAgICAgICAgIGNidG4udGsuZ2xvYmFsZ2V0dmFyKGNidG5bJ3ZhcmlhYmxlJ10pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKKworICAgICAgICBjYnRuMlsnY29tbWFuZCddID0gJycKKyAgICAgICAgcmVzID0gY2J0bjIuaW52b2tlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICcnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihzdWNjZXNzKSA+IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0bjJbJ3ZhbHVlJ10sIG15dmFyLmdldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG15dmFyLmdldCgpLAorICAgICAgICAgICAgY2J0bi50ay5nbG9iYWxnZXR2YXIoY2J0blsndmFyaWFibGUnXSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY2J0blsndmFyaWFibGUnXSksIHN0cihjYnRuMlsndmFyaWFibGUnXSkpCisKKworCitjbGFzcyBTY2FsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKyAgICAgICAgc2VsZi5zY2FsZSA9IHR0ay5TY2FsZSgpCisgICAgICAgIHNlbGYuc2NhbGUucGFjaygpCisgICAgICAgIHNlbGYuc2NhbGUudXBkYXRlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zY2FsZS5kZXN0cm95KCkKKyAgICAgICAgc3VwcG9ydC5yb290X3dpdGhkcmF3KCkKKworCisgICAgZGVmIHRlc3RfY3VzdG9tX2V2ZW50KHNlbGYpOgorICAgICAgICBmYWlsdXJlID0gWzEsIDEsIDFdICMgd2lsbCBuZWVkIHRvIGJlIGVtcHR5CisKKyAgICAgICAgZnVuY2lkID0gc2VsZi5zY2FsZS5iaW5kKCc8PFJhbmdlQ2hhbmdlZD4+JywgbGFtYmRhIGV2dDogZmFpbHVyZS5wb3AoKSkKKworICAgICAgICBzZWxmLnNjYWxlWydmcm9tJ10gPSAxMAorICAgICAgICBzZWxmLnNjYWxlWydmcm9tXyddID0gMTAKKyAgICAgICAgc2VsZi5zY2FsZVsndG8nXSA9IDMKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZhaWx1cmUpCisKKyAgICAgICAgZmFpbHVyZSA9IFsxLCAxLCAxXQorICAgICAgICBzZWxmLnNjYWxlLmNvbmZpZ3VyZShmcm9tXz0yLCB0bz01KQorICAgICAgICBzZWxmLnNjYWxlLmNvbmZpZ3VyZShmcm9tXz0wLCB0bz0tMikKKyAgICAgICAgc2VsZi5zY2FsZS5jb25maWd1cmUodG89MTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmYWlsdXJlKQorCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgIHNjYWxlX3dpZHRoID0gc2VsZi5zY2FsZS53aW5mb193aWR0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoc2NhbGVfd2lkdGgsIDApLCBzZWxmLnNjYWxlWyd0byddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoMCwgMCksIHNlbGYuc2NhbGVbJ2Zyb20nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQorICAgICAgICBzZWxmLnNjYWxlWyd2YWx1ZSddID0gMzAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc2NhbGUuZ2V0LCAnJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5zY2FsZS5nZXQsIDAsICcnKQorCisKKyAgICBkZWYgdGVzdF9zZXQoc2VsZik6CisgICAgICAgICMgc2V0IHJlc3RyaWN0cyB0aGUgbWF4L21pbiB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJhbmdlCisgICAgICAgIG1heCA9IHNlbGYuc2NhbGVbJ3RvJ10KKyAgICAgICAgbmV3X21heCA9IG1heCArIDEwCisgICAgICAgIHNlbGYuc2NhbGUuc2V0KG5ld19tYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4KQorICAgICAgICBtaW4gPSBzZWxmLnNjYWxlWydmcm9tJ10KKyAgICAgICAgc2VsZi5zY2FsZS5zZXQobWluIC0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBtaW4pCisKKyAgICAgICAgIyBjaGFuZ2luZyBkaXJlY3RseSB0aGUgdmFyaWFibGUgZG9lc24ndCBpbXBvc2UgdGhpcyBsaW1pdGF0aW9uIHRobworICAgICAgICB2YXIgPSBUa2ludGVyLkRvdWJsZVZhcigpCisgICAgICAgIHNlbGYuc2NhbGVbJ3ZhcmlhYmxlJ10gPSB2YXIKKyAgICAgICAgdmFyLnNldChtYXggKyA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBtYXggKyA1KQorICAgICAgICBkZWwgdmFyCisKKyAgICAgICAgIyB0aGUgc2FtZSBoYXBwZW5zIHdpdGggdGhlIHZhbHVlIG9wdGlvbgorICAgICAgICBzZWxmLnNjYWxlWyd2YWx1ZSddID0gbWF4ICsgMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBtYXggKyAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQorCisgICAgICAgICMgbmV2ZXJ0aGVsZXNzLCBub3RlIHRoYXQgdGhlIG1heC9taW4gdmFsdWVzIHdlIGNhbiBnZXQgc3BlY2lmeWluZworICAgICAgICAjIHgsIHkgY29vcmRzIGFyZSB0aGUgb25lcyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgcmFuZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgwLCAwKSwgbWluKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KHNlbGYuc2NhbGUud2luZm9fd2lkdGgoKSwgMCksIG1heCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLnNldCwgTm9uZSkKKworCitjbGFzcyBOb3RlYm9va1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKyAgICAgICAgc2VsZi5uYiA9IHR0ay5Ob3RlYm9vayhwYWRkaW5nPTApCisgICAgICAgIHNlbGYuY2hpbGQxID0gdHRrLkxhYmVsKCkKKyAgICAgICAgc2VsZi5jaGlsZDIgPSB0dGsuTGFiZWwoKQorICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMSwgdGV4dD0nYScpCisgICAgICAgIHNlbGYubmIuYWRkKHNlbGYuY2hpbGQyLCB0ZXh0PSdiJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jaGlsZDEuZGVzdHJveSgpCisgICAgICAgIHNlbGYuY2hpbGQyLmRlc3Ryb3koKQorICAgICAgICBzZWxmLm5iLmRlc3Ryb3koKQorICAgICAgICBzdXBwb3J0LnJvb3Rfd2l0aGRyYXcoKQorCisKKyAgICBkZWYgdGVzdF90YWJfaWRlbnRpZmllcnMoc2VsZik6CisgICAgICAgIHNlbGYubmIuZm9yZ2V0KDApCisgICAgICAgIHNlbGYubmIuaGlkZShzZWxmLmNoaWxkMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi50YWIsIHNlbGYuY2hpbGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAxKQorICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KCdlbmQnKSwgMSkKKyAgICAgICAgc2VsZi5uYi5zZWxlY3Qoc2VsZi5jaGlsZDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubmIudGFiKCdjdXJyZW50JykpCisgICAgICAgIHNlbGYubmIuYWRkKHNlbGYuY2hpbGQxLCB0ZXh0PSdhJykKKworICAgICAgICBzZWxmLm5iLnBhY2soKQorICAgICAgICBzZWxmLm5iLndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIHRiX2lkeCA9ICJAMjAsNSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRiX2lkeCA9ICJANSw1IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFiKHRiX2lkeCksIHNlbGYubmIudGFiKCdjdXJyZW50JykpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSwgMTAwLCA1KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm5iLnRhYignQCVkLCA1JyAlIGksIHRleHQ9Tm9uZSkgPT0gJ2EnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IFRraW50ZXIuVGNsRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRhYiB3aXRoIHRleHQgJ2EnIG5vdCBmb3VuZCIpCisKKworICAgIGRlZiB0ZXN0X2FkZF9hbmRfaGlkZGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmhpZGUsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmhpZGUsICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaGlkZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5hZGQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuYWRkLCB0dGsuTGFiZWwoKSwKKyAgICAgICAgICAgIHVua25vd249J29wdGlvbicpCisKKyAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCisgICAgICAgIHNlbGYubmIuaGlkZShzZWxmLmNoaWxkMSkKKyAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksIHRhYnMpCisKKyAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoKQorICAgICAgICBzZWxmLm5iLmFkZChjaGlsZCwgdGV4dD0nYycpCisgICAgICAgIHRhYnMgPSBzZWxmLm5iLnRhYnMoKQorCisgICAgICAgIGN1cnIgPSBzZWxmLm5iLmluZGV4KCdjdXJyZW50JykKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCB0aGUgdGFiIGdldHMgcmVhZGRlZCBhdCBpdHMgcHJldmlvdXMgcG9zaXRpb24KKyAgICAgICAgY2hpbGQyX2luZGV4ID0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMikKKyAgICAgICAgc2VsZi5uYi5oaWRlKHNlbGYuY2hpbGQyKQorICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQyKSwgY2hpbGQyX2luZGV4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKHNlbGYuY2hpbGQyKSA9PSBzZWxmLm5iLnRhYnMoKVtjaGlsZDJfaW5kZXhdKQorICAgICAgICAjIGJ1dCB0aGUgdGFiIG5leHQgdG8gaXQgKG5vdCBoaWRkZW4pIGlzIHRoZSBvbmUgc2VsZWN0ZWQgbm93CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5pbmRleCgnY3VycmVudCcpLCBjdXJyICsgMSkKKworCisgICAgZGVmIHRlc3RfZm9yZ2V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmZvcmdldCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCAnaGknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmZvcmdldCwgTm9uZSkKKworICAgICAgICB0YWJzID0gc2VsZi5uYi50YWJzKCkKKyAgICAgICAgY2hpbGQxX2luZGV4ID0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMSkKKyAgICAgICAgc2VsZi5uYi5mb3JnZXQoc2VsZi5jaGlsZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3RyKHNlbGYuY2hpbGQxKSBpbiBzZWxmLm5iLnRhYnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGFicykgLSAxLCBsZW4oc2VsZi5uYi50YWJzKCkpKQorCisgICAgICAgIHNlbGYubmIuYWRkKHNlbGYuY2hpbGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNoaWxkMV9pbmRleCA9PSBzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKSkKKworCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5kZXgsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluZGV4LCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAyKQorCisKKyAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CisgICAgICAgICMgbW92aW5nIHRhYnMKKyAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0KDEsIHRhYnNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksICh0YWJzWzFdLCB0YWJzWzBdKSkKKyAgICAgICAgc2VsZi5uYi5pbnNlcnQoc2VsZi5jaGlsZDEsIHNlbGYuY2hpbGQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorICAgICAgICBzZWxmLm5iLmluc2VydCgnZW5kJywgc2VsZi5jaGlsZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksICh0YWJzWzFdLCB0YWJzWzBdKSkKKyAgICAgICAgc2VsZi5uYi5pbnNlcnQoJ2VuZCcsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksIHRhYnMpCisgICAgICAgICMgYmFkIG1vdmVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAyLCB0YWJzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgLTEsIHRhYnNbMF0pCisKKyAgICAgICAgIyBuZXcgdGFiCisgICAgICAgIGNoaWxkMyA9IHR0ay5MYWJlbCgpCisgICAgICAgIHNlbGYubmIuaW5zZXJ0KDEsIGNoaWxkMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHRhYnNbMF0sIHN0cihjaGlsZDMpLCB0YWJzWzFdKSkKKyAgICAgICAgc2VsZi5uYi5mb3JnZXQoY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorICAgICAgICBzZWxmLm5iLmluc2VydChzZWxmLmNoaWxkMSwgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAoc3RyKGNoaWxkMyksICkgKyB0YWJzKQorICAgICAgICBzZWxmLm5iLmZvcmdldChjaGlsZDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAyLCBjaGlsZDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAtMSwgY2hpbGQzKQorCisgICAgICAgICMgYmFkIGluc2VydHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsICdlbmQnLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgTm9uZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIE5vbmUsIE5vbmUpCisKKworICAgIGRlZiB0ZXN0X3NlbGVjdChzZWxmKToKKyAgICAgICAgc2VsZi5uYi5wYWNrKCkKKyAgICAgICAgc2VsZi5uYi53YWl0X3Zpc2liaWxpdHkoKQorCisgICAgICAgIHN1Y2Nlc3MgPSBbXQorICAgICAgICB0YWJfY2hhbmdlZCA9IFtdCisKKyAgICAgICAgc2VsZi5jaGlsZDEuYmluZCgnPFVubWFwPicsIGxhbWJkYSBldnQ6IHN1Y2Nlc3MuYXBwZW5kKFRydWUpKQorICAgICAgICBzZWxmLm5iLmJpbmQoJzw8Tm90ZWJvb2tUYWJDaGFuZ2VkPj4nLAorICAgICAgICAgICAgbGFtYmRhIGV2dDogdGFiX2NoYW5nZWQuYXBwZW5kKFRydWUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQxKSkKKyAgICAgICAgc2VsZi5uYi5zZWxlY3Qoc2VsZi5jaGlsZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMikpCisKKyAgICAgICAgc2VsZi5uYi51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFiX2NoYW5nZWQpCisKKworICAgIGRlZiB0ZXN0X3RhYihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi50YWIsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgJ25vdGFiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi50YWIsIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgdGV4dD1Ob25lKSwgJ2EnKQorICAgICAgICAjIG5ld2VyIGZvcm0gZm9yIHF1ZXJ5aW5nIGEgc2luZ2xlIG9wdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCAndGV4dCcpLCAnYScpCisgICAgICAgIHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PU5vbmUpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgJ3RleHQnKSwgJ2FiYycpCisKKworICAgIGRlZiB0ZXN0X3RhYnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYubmIudGFicygpKSwgMikKKworICAgICAgICBzZWxmLm5iLmZvcmdldChzZWxmLmNoaWxkMSkKKyAgICAgICAgc2VsZi5uYi5mb3JnZXQoc2VsZi5jaGlsZDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgKCkpCisKKworICAgIGRlZiB0ZXN0X3RyYXZlcnNhbChzZWxmKToKKyAgICAgICAgc2VsZi5uYi5wYWNrKCkKKyAgICAgICAgc2VsZi5uYi53YWl0X3Zpc2liaWxpdHkoKQorCisgICAgICAgIHNlbGYubmIuc2VsZWN0KDApCisKKyAgICAgICAgc3VwcG9ydC5zaW11bGF0ZV9tb3VzZV9jbGljayhzZWxmLm5iLCA1LCA1KQorICAgICAgICBzZWxmLm5iLmZvY3VzX2ZvcmNlKCkKKyAgICAgICAgc2VsZi5uYi5ldmVudF9nZW5lcmF0ZSgnPENvbnRyb2wtVGFiPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQyKSkKKyAgICAgICAgc2VsZi5uYi5mb2N1c19mb3JjZSgpCisgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxTaGlmdC1Db250cm9sLVRhYj4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCisgICAgICAgIHNlbGYubmIuZm9jdXNfZm9yY2UoKQorICAgICAgICBzZWxmLm5iLmV2ZW50X2dlbmVyYXRlKCc8U2hpZnQtQ29udHJvbC1UYWI+JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDIpKQorCisgICAgICAgIHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PSdhJywgdW5kZXJsaW5lPTApCisgICAgICAgIHNlbGYubmIuZW5hYmxlX3RyYXZlcnNhbCgpCisgICAgICAgIHNlbGYubmIuZm9jdXNfZm9yY2UoKQorICAgICAgICBzdXBwb3J0LnNpbXVsYXRlX21vdXNlX2NsaWNrKHNlbGYubmIsIDUsIDUpCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxPcHRpb24tYT4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5uYi5ldmVudF9nZW5lcmF0ZSgnPEFsdC1hPicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQxKSkKKworCitjbGFzcyBUcmVldmlld1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBwb3J0LnJvb3RfZGVpY29uaWZ5KCkKKyAgICAgICAgc2VsZi50diA9IHR0ay5UcmVldmlldyhwYWRkaW5nPTApCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudHYuZGVzdHJveSgpCisgICAgICAgIHN1cHBvcnQucm9vdF93aXRoZHJhdygpCisKKworICAgIGRlZiB0ZXN0X2Jib3goc2VsZik6CisgICAgICAgIHNlbGYudHYucGFjaygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5iYm94KCcnKSwgJycpCisgICAgICAgIHNlbGYudHYud2FpdF92aXNpYmlsaXR5KCkKKyAgICAgICAgc2VsZi50di51cGRhdGUoKQorCisgICAgICAgIGl0ZW1faWQgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIGNoaWxkcmVuID0gc2VsZi50di5nZXRfY2hpbGRyZW4oKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hpbGRyZW4pCisKKyAgICAgICAgYmJveCA9IHNlbGYudHYuYmJveChjaGlsZHJlblswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmJveCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGJib3gsIHR1cGxlKSkKKyAgICAgICAgZm9yIGl0ZW0gaW4gYmJveDoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGl0ZW0sIGludCk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJJbnZhbGlkIGJvdW5kaW5nIGJveDogJXMiICUgYmJveCkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgY29tcGFyZSB3aWR0aCBpbiBiYm94ZXMKKyAgICAgICAgc2VsZi50dlsnY29sdW1ucyddID0gWyd0ZXN0J10KKyAgICAgICAgc2VsZi50di5jb2x1bW4oJ3Rlc3QnLCB3aWR0aD01MCkKKyAgICAgICAgYmJveF9jb2x1bW4wID0gc2VsZi50di5iYm94KGNoaWxkcmVuWzBdLCAwKQorICAgICAgICByb290X3dpZHRoID0gc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYm94X2NvbHVtbjBbMF0sIGJib3hbMF0gKyByb290X3dpZHRoKQorCisgICAgICAgICMgdmVyaWZ5IHRoYXQgYmJveCBvZiBhIGNsb3NlZCBpdGVtIGlzIHRoZSBlbXB0eSBzdHJpbmcKKyAgICAgICAgY2hpbGQxID0gc2VsZi50di5pbnNlcnQoaXRlbV9pZCwgJ2VuZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5iYm94KGNoaWxkMSksICcnKQorCisKKyAgICBkZWYgdGVzdF9jaGlsZHJlbihzZWxmKToKKyAgICAgICAgIyBubyBjaGlsZHJlbiB5ZXQsIHNob3VsZCBnZXQgYW4gZW1wdHkgdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoKSkKKworICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnR2LmdldF9jaGlsZHJlbigpLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKVswXSwgaXRlbV9pZCkKKworICAgICAgICAjIGFkZCBpdGVtX2lkIGFuZCBjaGlsZDMgYXMgY2hpbGRyZW4gb2YgY2hpbGQyCisgICAgICAgIGNoaWxkMiA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKKyAgICAgICAgY2hpbGQzID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQorICAgICAgICBzZWxmLnR2LnNldF9jaGlsZHJlbihjaGlsZDIsIGl0ZW1faWQsIGNoaWxkMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihjaGlsZDIpLCAoaXRlbV9pZCwgY2hpbGQzKSkKKworICAgICAgICAjIGNoaWxkMyBoYXMgY2hpbGQyIGFzIHBhcmVudCwgdGh1cyB0cnlpbmcgdG8gc2V0IGNoaWxkMiBhcyBhIGNoaWxkcmVuCisgICAgICAgICMgb2YgY2hpbGQzIHNob3VsZCByZXN1bHQgaW4gYW4gZXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgICAgIHNlbGYudHYuc2V0X2NoaWxkcmVuLCBjaGlsZDMsIGNoaWxkMikKKworICAgICAgICAjIHJlbW92ZSBjaGlsZDIgY2hpbGRyZW4KKyAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oY2hpbGQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGNoaWxkMiksICgpKQorCisgICAgICAgICMgcmVtb3ZlIHJvb3QncyBjaGlsZHJlbgorICAgICAgICBzZWxmLnR2LnNldF9jaGlsZHJlbignJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoKSkKKworCisgICAgZGVmIHRlc3RfY29sdW1uKHNlbGYpOgorICAgICAgICAjIHJldHVybiBhIGRpY3Qgd2l0aCBhbGwgb3B0aW9ucy92YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5jb2x1bW4oJyMwJyksIGRpY3QpKQorICAgICAgICAjIHJldHVybiBhIHNpbmdsZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb3B0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpLCBpbnQpKQorICAgICAgICAjIHNldCBhIG5ldyB2YWx1ZSBmb3IgYW4gb3B0aW9uCisgICAgICAgIHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPTEwKQorICAgICAgICAjIHRlc3RpbmcgbmV3IHdheSB0byBnZXQgb3B0aW9uIHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5jb2x1bW4oJyMwJywgJ3dpZHRoJyksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpLCAxMCkKKyAgICAgICAgIyBjaGVjayByZWFkLW9ubHkgb3B0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuY29sdW1uLCAnIzAnLCBpZD0nWCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5jb2x1bW4sICdpbnZhbGlkJykKKyAgICAgICAgaW52YWxpZF9rd3MgPSBbCisgICAgICAgICAgICB7J3Vua25vd25fb3B0aW9uJzogJ3NvbWUgdmFsdWUnfSwgIHsnc3RyZXRjaCc6ICd3cm9uZyd9LAorICAgICAgICAgICAgeydhbmNob3InOiAnd3JvbmcnfSwgeyd3aWR0aCc6ICd3cm9uZyd9LCB7J21pbndpZHRoJzogJ3dyb25nJ30KKyAgICAgICAgXQorICAgICAgICBmb3Iga3cgaW4gaW52YWxpZF9rd3M6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywKKyAgICAgICAgICAgICAgICAqKmt3KQorCisKKyAgICBkZWYgdGVzdF9kZWxldGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuZGVsZXRlLCAnIzAnKQorCisgICAgICAgIGl0ZW1faWQgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIGl0ZW0yID0gc2VsZi50di5pbnNlcnQoaXRlbV9pZCwgJ2VuZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKKworICAgICAgICBzZWxmLnR2LmRlbGV0ZShpdGVtX2lkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCisKKyAgICAgICAgIyByZWF0dGFjaCBzaG91bGQgZmFpbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLAorICAgICAgICAgICAgc2VsZi50di5yZWF0dGFjaCwgaXRlbV9pZCwgJycsICdlbmQnKQorCisgICAgICAgICMgdGVzdCBtdWx0aXBsZSBpdGVtIGRlbGV0ZQorICAgICAgICBpdGVtMSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKKyAgICAgICAgaXRlbTIgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW0xLCBpdGVtMikpCisKKyAgICAgICAgc2VsZi50di5kZWxldGUoaXRlbTEsIGl0ZW0yKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCisKKworICAgIGRlZiB0ZXN0X2RldGFjaF9yZWF0dGFjaChzZWxmKToKKyAgICAgICAgaXRlbV9pZCA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKKyAgICAgICAgaXRlbTIgPSBzZWxmLnR2Lmluc2VydChpdGVtX2lkLCAnZW5kJykKKworICAgICAgICAjIGNhbGxpbmcgZGV0YWNoIHdpdGhvdXQgaXRlbXMgaXMgdmFsaWQsIGFsdGhvdWdoIGl0IGRvZXMgbm90aGluZworICAgICAgICBwcmV2ID0gc2VsZi50di5nZXRfY2hpbGRyZW4oKQorICAgICAgICBzZWxmLnR2LmRldGFjaCgpICMgdGhpcyBzaG91bGQgZG8gbm90aGluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZXYsIHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKGl0ZW0yLCApKQorCisgICAgICAgICMgZGV0YWNoIGl0ZW0gd2l0aCBjaGlsZHJlbgorICAgICAgICBzZWxmLnR2LmRldGFjaChpdGVtX2lkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCisKKyAgICAgICAgIyByZWF0dGFjaCBpdGVtIHdpdGggY2hpbGRyZW4KKyAgICAgICAgc2VsZi50di5yZWF0dGFjaChpdGVtX2lkLCAnJywgJ2VuZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKKworICAgICAgICAjIG1vdmUgYSBjaGlsZHJlbiB0byB0aGUgcm9vdAorICAgICAgICBzZWxmLnR2Lm1vdmUoaXRlbTIsICcnLCAnZW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgaXRlbTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoKSkKKworICAgICAgICAjIGJhZCB2YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgICAgIHNlbGYudHYucmVhdHRhY2gsICdub25leGlzdGVudCcsICcnLCAnZW5kJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgICAgIHNlbGYudHYuZGV0YWNoLCAnbm9uZXhpc3RlbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLAorICAgICAgICAgICAgc2VsZi50di5yZWF0dGFjaCwgaXRlbTIsICdvdGhlcnBhcmVudCcsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLAorICAgICAgICAgICAgc2VsZi50di5yZWF0dGFjaCwgaXRlbTIsICcnLCAnaW52YWxpZCcpCisKKyAgICAgICAgIyBtdWx0aXBsZSBkZXRhY2gKKyAgICAgICAgc2VsZi50di5kZXRhY2goaXRlbV9pZCwgaXRlbTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksICgpKQorCisKKyAgICBkZWYgdGVzdF9leGlzdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5leGlzdHMoJ3NvbWV0aGluZycpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmV4aXN0cygnJyksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5leGlzdHMoe30pLCBGYWxzZSkKKworICAgICAgICAjIHRoZSBmb2xsb3dpbmcgd2lsbCBtYWtlIGEgdGsuY2FsbCBlcXVpdmFsZW50IHRvCisgICAgICAgICMgdGsuY2FsbCh0cmVldmlldywgImV4aXN0cyIpIHdoaWNoIHNob3VsZCByZXN1bHQgaW4gYW4gZXJyb3IKKyAgICAgICAgIyBpbiB0aGUgdGNsIGludGVycHJldGVyIHNpbmNlIHRrIHJlcXVpcmVzIGFuIGl0ZW0uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuZXhpc3RzLCBOb25lKQorCisKKyAgICBkZWYgdGVzdF9mb2N1cyhzZWxmKToKKyAgICAgICAgIyBub3RoaW5nIGlzIGZvY3VzZWQgcmlnaHQgbm93CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5mb2N1cygpLCAnJykKKworICAgICAgICBpdGVtMSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKKyAgICAgICAgc2VsZi50di5mb2N1cyhpdGVtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmZvY3VzKCksIGl0ZW0xKQorCisgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZm9jdXMoKSwgJycpCisKKyAgICAgICAgIyB0cnkgZm9jdXNpbmcgaW5leGlzdGVudCBpdGVtCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuZm9jdXMsICdoaScpCisKKworICAgIGRlZiB0ZXN0X2hlYWRpbmcoc2VsZik6CisgICAgICAgICMgY2hlY2sgYSBkaWN0IGlzIHJldHVybmVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuaGVhZGluZygnIzAnKSwgZGljdCkpCisKKyAgICAgICAgIyBjaGVjayBhIHZhbHVlIGlzIHJldHVybmVkCisgICAgICAgIHNlbGYudHYuaGVhZGluZygnIzAnLCB0ZXh0PSdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsICd0ZXh0JyksICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsIHRleHQ9Tm9uZSksICdoaScpCisKKyAgICAgICAgIyBpbnZhbGlkIG9wdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmhlYWRpbmcsICcjMCcsCisgICAgICAgICAgICBiYWNrZ3JvdW5kPU5vbmUpCisgICAgICAgICMgaW52YWxpZCB2YWx1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmhlYWRpbmcsICcjMCcsCisgICAgICAgICAgICBhbmNob3I9MSkKKworICAgICMgWFhYIHNraXBwaW5nIGZvciBub3c7IHNob3VsZCBiZSBmaXhlZCB0byB3b3JrIHdpdGggbmV3ZXIgdHRrCisgICAgQHVuaXR0ZXN0LnNraXAoInNraXBwaW5nIHBlbmRpbmcgcmVzb2x1dGlvbiBvZiBJc3N1ZSAjMTA3MzQiKQorICAgIGRlZiB0ZXN0X2hlYWRpbmdfY2FsbGJhY2soc2VsZik6CisgICAgICAgIGRlZiBzaW11bGF0ZV9oZWFkaW5nX2NsaWNrKHgsIHkpOgorICAgICAgICAgICAgc3VwcG9ydC5zaW11bGF0ZV9tb3VzZV9jbGljayhzZWxmLnR2LCB4LCB5KQorICAgICAgICAgICAgc2VsZi50di51cGRhdGVfaWRsZXRhc2tzKCkKKworICAgICAgICBzdWNjZXNzID0gW10gIyBubyBzdWNjZXNzIGZvciBub3cKKworICAgICAgICBzZWxmLnR2LnBhY2soKQorICAgICAgICBzZWxmLnR2LndhaXRfdmlzaWJpbGl0eSgpCisgICAgICAgIHNlbGYudHYuaGVhZGluZygnIzAnLCBjb21tYW5kPWxhbWJkYTogc3VjY2Vzcy5hcHBlbmQoVHJ1ZSkpCisgICAgICAgIHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPTEwMCkKKyAgICAgICAgc2VsZi50di51cGRhdGUoKQorCisgICAgICAgICMgYXNzdW1pbmcgdGhhdCB0aGUgY29vcmRzICg1LCA1KSBmYWxsIGludG8gaGVhZGluZyAjMAorICAgICAgICBzaW11bGF0ZV9oZWFkaW5nX2NsaWNrKDUsIDUpCisgICAgICAgIGlmIG5vdCBzdWNjZXNzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgY29tbWFuZCBhc3NvY2lhdGVkIHRvIHRoZSB0cmVldmlldyBoZWFkaW5nIHdhc24ndCAiCisgICAgICAgICAgICAgICAgImludm9rZWQuIikKKworICAgICAgICBzdWNjZXNzID0gW10KKyAgICAgICAgY29tbWFuZHMgPSBzZWxmLnR2Lm1hc3Rlci5fdGNsQ29tbWFuZHMKKyAgICAgICAgc2VsZi50di5oZWFkaW5nKCcjMCcsIGNvbW1hbmQ9c3RyKHNlbGYudHYuaGVhZGluZygnIzAnLCBjb21tYW5kPU5vbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tYW5kcywgc2VsZi50di5tYXN0ZXIuX3RjbENvbW1hbmRzKQorICAgICAgICBzaW11bGF0ZV9oZWFkaW5nX2NsaWNrKDUsIDUpCisgICAgICAgIGlmIG5vdCBzdWNjZXNzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgY29tbWFuZCBhc3NvY2lhdGVkIHRvIHRoZSB0cmVldmlldyBoZWFkaW5nIHdhc24ndCAiCisgICAgICAgICAgICAgICAgImludm9rZWQuIikKKworICAgICAgICAjIFhYWCBUaGUgZm9sbG93aW5nIHJhaXNlcyBhbiBlcnJvciBpbiBhIHRjbCBpbnRlcnByZXRlciwgYnV0IG5vdCBpbgorICAgICAgICAjIFB5dGhvbgorICAgICAgICAjc2VsZi50di5oZWFkaW5nKCcjMCcsIGNvbW1hbmQ9J0kgZG9udCBleGlzdCcpCisgICAgICAgICNzaW11bGF0ZV9oZWFkaW5nX2NsaWNrKDUsIDUpCisKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICAjIGl0ZW0gJ3doYXQnIGRvZXNuJ3QgZXhpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbmRleCwgJ3doYXQnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleCgnJyksIDApCisKKyAgICAgICAgaXRlbTEgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCisgICAgICAgIGl0ZW0yID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQorICAgICAgICBjMSA9IHNlbGYudHYuaW5zZXJ0KGl0ZW0xLCAnZW5kJykKKyAgICAgICAgYzIgPSBzZWxmLnR2Lmluc2VydChpdGVtMSwgJ2VuZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChjMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChjMiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMiksIDEpCisKKyAgICAgICAgc2VsZi50di5tb3ZlKGl0ZW0yLCAnJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0yKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0xKSwgMSkKKworICAgICAgICAjIGNoZWNrIHRoYXQgaW5kZXggc3RpbGwgd29ya3MgZXZlbiBhZnRlciBpdHMgcGFyZW50IGFuZCBzaWJsaW5ncworICAgICAgICAjIGhhdmUgYmVlbiBkZXRhY2hlZAorICAgICAgICBzZWxmLnR2LmRldGFjaChpdGVtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGMyKSwgMSkKKyAgICAgICAgc2VsZi50di5kZXRhY2goYzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChjMiksIDApCisKKyAgICAgICAgIyBidXQgaXQgZmFpbHMgYWZ0ZXIgaXRlbSBoYXMgYmVlbiBkZWxldGVkCisgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmluZGV4LCBjMikKKworCisgICAgZGVmIHRlc3RfaW5zZXJ0X2l0ZW0oc2VsZik6CisgICAgICAgICMgcGFyZW50ICdub25lJyBkb2Vzbid0IGV4aXN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnbm9uZScsICdlbmQnKQorCisgICAgICAgICMgb3BlbiB2YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbnNlcnQsICcnLCAnZW5kJywKKyAgICAgICAgICAgIG9wZW49JycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgICAgICBvcGVuPSdwbGVhc2UnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuZGVsZXRlKHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgb3Blbj1UcnVlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50di5kZWxldGUoc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCBvcGVuPUZhbHNlKSkpCisKKyAgICAgICAgIyBpbnZhbGlkIGluZGV4CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ21pZGRsZScpCisKKyAgICAgICAgIyB0cnlpbmcgdG8gZHVwbGljYXRlIGl0ZW0gaWQgaXMgaW52YWxpZAorICAgICAgICBpdGVtaWQgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsICdmaXJzdC1pdGVtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtaWQsICdmaXJzdC1pdGVtJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbnNlcnQsICcnLCAnZW5kJywKKyAgICAgICAgICAgICdmaXJzdC1pdGVtJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbnNlcnQsICcnLCAnZW5kJywKKyAgICAgICAgICAgIE1vY2tUY2xPYmooJ2ZpcnN0LWl0ZW0nKSkKKworICAgICAgICAjIHVuaWNvZGUgdmFsdWVzCisgICAgICAgIHZhbHVlID0gdSdceGUxYmEnCisgICAgICAgIGl0ZW0gPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHZhbHVlcz0odmFsdWUsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sICd2YWx1ZXMnKSwgKHZhbHVlLCApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICh2YWx1ZSwgKSkKKworICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPWxpc3Qoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwgKHZhbHVlLCApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuaXRlbShpdGVtKSwgZGljdCkpCisKKyAgICAgICAgIyBlcmFzZSBpdGVtIHZhbHVlcworICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPScnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSkpCisKKyAgICAgICAgIyBpdGVtIHRhZ3MKKyAgICAgICAgaXRlbSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdGFncz1bMSwgMiwgdmFsdWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPU5vbmUpLCAoJzEnLCAnMicsIHZhbHVlKSkKKyAgICAgICAgc2VsZi50di5pdGVtKGl0ZW0sIHRhZ3M9W10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50di5pdGVtKGl0ZW0sIHRhZ3M9Tm9uZSkpCisgICAgICAgIHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInKSkKKworICAgICAgICAjIHZhbHVlcyB3aXRoIHNwYWNlcworICAgICAgICBpdGVtID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB2YWx1ZXM9KCdhIGIgYycsCisgICAgICAgICAgICAnJXMgJXMnICUgKHZhbHVlLCB2YWx1ZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksCisgICAgICAgICAgICAoJ2EgYiBjJywgJyVzICVzJyAlICh2YWx1ZSwgdmFsdWUpKSkKKworICAgICAgICAjIHRleHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oCisgICAgICAgICAgICBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHRleHQ9IkxhYmVsIGhlcmUiKSwgdGV4dD1Ob25lKSwKKyAgICAgICAgICAgICJMYWJlbCBoZXJlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oCisgICAgICAgICAgICBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHRleHQ9dmFsdWUpLCB0ZXh0PU5vbmUpLAorICAgICAgICAgICAgdmFsdWUpCisKKworICAgIGRlZiB0ZXN0X3NldChzZWxmKToKKyAgICAgICAgc2VsZi50dlsnY29sdW1ucyddID0gWydBJywgJ0InXQorICAgICAgICBpdGVtID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB2YWx1ZXM9WydhJywgJ2InXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNldChpdGVtKSwgeydBJzogJ2EnLCAnQic6ICdiJ30pCisKKyAgICAgICAgc2VsZi50di5zZXQoaXRlbSwgJ0InLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwgKCdhJywgJ2EnKSkKKworICAgICAgICBzZWxmLnR2Wydjb2x1bW5zJ10gPSBbJ0InXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2V0KGl0ZW0pLCB7J0InOiAnYSd9KQorCisgICAgICAgIHNlbGYudHYuc2V0KGl0ZW0sICdCJywgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2V0KGl0ZW0sIGNvbHVtbj0nQicpLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwgKCdiJywgJ2EnKSkKKworICAgICAgICBzZWxmLnR2LnNldChpdGVtLCAnQicsIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNldChpdGVtLCAnQicpLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSwgKDEyMywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnNldChpdGVtKSwgeydCJzogMTIzfSkKKworICAgICAgICAjIGluZXhpc3RlbnQgY29sdW1uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScsICdiJykKKworICAgICAgICAjIGluZXhpc3RlbnQgaXRlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNldCwgJ25vdG1lJykKKworCisgICAgZGVmIHRlc3RfdGFnX2JpbmQoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIGl0ZW0xID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB0YWdzPVsnY2FsbCddKQorICAgICAgICBpdGVtMiA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdGFncz1bJ2NhbGwnXSkKKyAgICAgICAgc2VsZi50di50YWdfYmluZCgnY2FsbCcsICc8QnV0dG9uUHJlc3MtMT4nLAorICAgICAgICAgICAgbGFtYmRhIGV2dDogZXZlbnRzLmFwcGVuZCgxKSkKKyAgICAgICAgc2VsZi50di50YWdfYmluZCgnY2FsbCcsICc8QnV0dG9uUmVsZWFzZS0xPicsCisgICAgICAgICAgICBsYW1iZGEgZXZ0OiBldmVudHMuYXBwZW5kKDIpKQorCisgICAgICAgIHNlbGYudHYucGFjaygpCisgICAgICAgIHNlbGYudHYud2FpdF92aXNpYmlsaXR5KCkKKyAgICAgICAgc2VsZi50di51cGRhdGUoKQorCisgICAgICAgIHBvc195ID0gc2V0KCkKKyAgICAgICAgZm91bmQgPSBzZXQoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCAxMDAsIDEwKToKKyAgICAgICAgICAgIGlmIGxlbihmb3VuZCkgPT0gMjogIyBpdGVtMSBhbmQgaXRlbTIgYWxyZWFkeSBmb3VuZAorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pZGVudGlmeV9yb3coaSkKKyAgICAgICAgICAgIGlmIGl0ZW1faWQgYW5kIGl0ZW1faWQgbm90IGluIGZvdW5kOgorICAgICAgICAgICAgICAgIHBvc195LmFkZChpKQorICAgICAgICAgICAgICAgIGZvdW5kLmFkZChpdGVtX2lkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvc195KSwgMikgIyBpdGVtMSBhbmQgaXRlbTIgeSBwb3MKKyAgICAgICAgZm9yIHkgaW4gcG9zX3k6CisgICAgICAgICAgICBzdXBwb3J0LnNpbXVsYXRlX21vdXNlX2NsaWNrKHNlbGYudHYsIDAsIHkpCisKKyAgICAgICAgIyBieSBub3cgdGhlcmUgc2hvdWxkIGJlIDQgdGhpbmdzIGluIHRoZSBldmVudHMgbGlzdCwgc2luY2UgZWFjaAorICAgICAgICAjIGl0ZW0gaGFkIGEgYmluZCBmb3IgdHdvIGV2ZW50cyB0aGF0IHdlcmUgc2ltdWxhdGVkIGFib3ZlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV2ZW50cyksIDQpCisgICAgICAgIGZvciBldnQgaW4gemlwKGV2ZW50c1s6OjJdLCBldmVudHNbMTo6Ml0pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldnQsICgxLCAyKSkKKworCisgICAgZGVmIHRlc3RfdGFnX2NvbmZpZ3VyZShzZWxmKToKKyAgICAgICAgIyBKdXN0IHRlc3RpbmcgcGFyYW1ldGVyIHBhc3NpbmcgZm9yIG5vdworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHYudGFnX2NvbmZpZ3VyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di50YWdfY29uZmlndXJlLAorICAgICAgICAgICAgJ3Rlc3QnLCBza3k9J2JsdWUnKQorICAgICAgICBzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCBmb3JlZ3JvdW5kPSdibHVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JywgJ2ZvcmVncm91bmQnKSksCisgICAgICAgICAgICAnYmx1ZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNlbGYudHYudGFnX2NvbmZpZ3VyZSgndGVzdCcsIGZvcmVncm91bmQ9Tm9uZSkpLAorICAgICAgICAgICAgJ2JsdWUnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnKSwgZGljdCkpCisKKwordGVzdHNfZ3VpID0gKAorICAgICAgICBXaWRnZXRUZXN0LCBCdXR0b25UZXN0LCBDaGVja2J1dHRvblRlc3QsIFJhZGlvYnV0dG9uVGVzdCwKKyAgICAgICAgQ29tYm9ib3hUZXN0LCBFbnRyeVRlc3QsIFBhbmVkd2luZG93VGVzdCwgU2NhbGVUZXN0LCBOb3RlYm9va1Rlc3QsCisgICAgICAgIFRyZWV2aWV3VGVzdAorICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0c19ndWkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiNmE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiNmE3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbG9yQ2hvb3Nlci5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29sb3JDaG9vc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjI4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbG9yQ2hvb3Nlci5weQpAQCAtMCwwICsxLDcyIEBACisjIHRrIGNvbW1vbiBjb2xvdXIgY2hvb3NlciBkaWFsb2d1ZQorIworIyB0aGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIG5hdGl2ZSBjb2xvciBkaWFsb2d1ZQorIyBhdmFpbGFibGUgaW4gVGsgNC4yIGFuZCBuZXdlci4KKyMKKyMgd3JpdHRlbiBieSBGcmVkcmlrIEx1bmRoLCBNYXkgMTk5NworIworIyBmaXhlZCBpbml0aWFsY29sb3IgaGFuZGxpbmcgaW4gQXVndXN0IDE5OTgKKyMKKworIworIyBvcHRpb25zIChhbGwgaGF2ZSBkZWZhdWx0IHZhbHVlcyk6CisjCisjIC0gaW5pdGlhbGNvbG9yOiBjb2xvdXIgdG8gbWFyayBhcyBzZWxlY3RlZCB3aGVuIGRpYWxvZyBpcyBkaXNwbGF5ZWQKKyMgICAoZ2l2ZW4gYXMgYW4gUkdCIHRyaXBsZXQgb3IgYSBUayBjb2xvciBzdHJpbmcpCisjCisjIC0gcGFyZW50OiB3aGljaCB3aW5kb3cgdG8gcGxhY2UgdGhlIGRpYWxvZyBvbiB0b3Agb2YKKyMKKyMgLSB0aXRsZTogZGlhbG9nIHRpdGxlCisjCisKK2Zyb20gdGtDb21tb25EaWFsb2cgaW1wb3J0IERpYWxvZworCisKKyMKKyMgY29sb3IgY2hvb3NlciBjbGFzcworCitjbGFzcyBDaG9vc2VyKERpYWxvZyk6CisgICAgIkFzayBmb3IgYSBjb2xvciIKKworICAgIGNvbW1hbmQgPSAidGtfY2hvb3NlQ29sb3IiCisKKyAgICBkZWYgX2ZpeG9wdGlvbnMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbWFrZSBzdXJlIGluaXRpYWxjb2xvciBpcyBhIHRrIGNvbG9yIHN0cmluZworICAgICAgICAgICAgY29sb3IgPSBzZWxmLm9wdGlvbnNbImluaXRpYWxjb2xvciJdCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbG9yLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgIyBhc3N1bWUgYW4gUkdCIHRyaXBsZXQKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnNbImluaXRpYWxjb2xvciJdID0gIiMlMDJ4JTAyeCUwMngiICUgY29sb3IKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9maXhyZXN1bHQoc2VsZiwgd2lkZ2V0LCByZXN1bHQpOgorICAgICAgICAjIHJlc3VsdCBjYW4gYmUgc29tZXRoaW5nczogYW4gZW1wdHkgdHVwbGUsIGFuIGVtcHR5IHN0cmluZyBvcgorICAgICAgICAjIGEgVGNsX09iaiwgc28gdGhpcyBzb21ld2hhdCB3ZWlyZCBjaGVjayBoYW5kbGVzIHRoYXQKKyAgICAgICAgaWYgbm90IHJlc3VsdCBvciBub3Qgc3RyKHJlc3VsdCk6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZSAjIGNhbmNlbGVkCisKKyAgICAgICAgIyB0byBzaW1wbGlmeSBhcHBsaWNhdGlvbiBjb2RlLCB0aGUgY29sb3IgY2hvb3NlciByZXR1cm5zCisgICAgICAgICMgYW4gUkdCIHR1cGxlIHRvZ2V0aGVyIHdpdGggdGhlIFRrIGNvbG9yIHN0cmluZworICAgICAgICByLCBnLCBiID0gd2lkZ2V0LndpbmZvX3JnYihyZXN1bHQpCisgICAgICAgIHJldHVybiAoci8yNTYsIGcvMjU2LCBiLzI1NiksIHN0cihyZXN1bHQpCisKKworIworIyBjb252ZW5pZW5jZSBzdHVmZgorCitkZWYgYXNrY29sb3IoY29sb3IgPSBOb25lLCAqKm9wdGlvbnMpOgorICAgICJBc2sgZm9yIGEgY29sb3IiCisKKyAgICBpZiBjb2xvcjoKKyAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMuY29weSgpCisgICAgICAgIG9wdGlvbnNbImluaXRpYWxjb2xvciJdID0gY29sb3IKKworICAgIHJldHVybiBDaG9vc2VyKCoqb3B0aW9ucykuc2hvdygpCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0ZXN0IHN0dWZmCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgcHJpbnQgImNvbG9yIiwgYXNrY29sb3IoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZmI4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbG9yQ2hvb3Nlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb2xvckNob29zZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZmI4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbG9yQ2hvb3Nlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb21tb25EaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbW1vbkRpYWxvZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Q5YmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtDb21tb25EaWFsb2cucHkKQEAgLTAsMCArMSw2MCBAQAorIyBiYXNlIGNsYXNzIGZvciB0ayBjb21tb24gZGlhbG9ndWVzCisjCisjIHRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgYmFzZSBjbGFzcyBmb3IgYWNjZXNzaW5nIHRoZSBjb21tb24KKyMgZGlhbG9ndWVzIGF2YWlsYWJsZSBpbiBUayA0LjIgYW5kIG5ld2VyLiAgdXNlIHRrRmlsZURpYWxvZywKKyMgdGtDb2xvckNob29zZXIsIGFuZCB0a01lc3NhZ2VCb3ggdG8gYWNjZXNzIHRoZSBpbmRpdmlkdWFsCisjIGRpYWxvZ3MuCisjCisjIHdyaXR0ZW4gYnkgRnJlZHJpayBMdW5kaCwgTWF5IDE5OTcKKyMKKworZnJvbSBUa2ludGVyIGltcG9ydCAqCisKK2NsYXNzIERpYWxvZzoKKworICAgIGNvbW1hbmQgID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKm9wdGlvbnMpOgorCisgICAgICAgICMgRklYTUU6IHNob3VsZCB0aGlzIGJlIHBsYWNlZCBvbiB0aGUgbW9kdWxlIGxldmVsIGluc3RlYWQ/CisgICAgICAgIGlmIFRrVmVyc2lvbiA8IDQuMjoKKyAgICAgICAgICAgIHJhaXNlIFRjbEVycm9yLCAidGhpcyBtb2R1bGUgcmVxdWlyZXMgVGsgNC4yIG9yIG5ld2VyIgorCisgICAgICAgIHNlbGYubWFzdGVyICA9IG1hc3RlcgorICAgICAgICBzZWxmLm9wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIGlmIG5vdCBtYXN0ZXIgYW5kIG9wdGlvbnMuZ2V0KCdwYXJlbnQnKToKKyAgICAgICAgICAgIHNlbGYubWFzdGVyID0gb3B0aW9uc1sncGFyZW50J10KKworICAgIGRlZiBfZml4b3B0aW9ucyhzZWxmKToKKyAgICAgICAgcGFzcyAjIGhvb2sKKworICAgIGRlZiBfZml4cmVzdWx0KHNlbGYsIHdpZGdldCwgcmVzdWx0KToKKyAgICAgICAgcmV0dXJuIHJlc3VsdCAjIGhvb2sKKworICAgIGRlZiBzaG93KHNlbGYsICoqb3B0aW9ucyk6CisKKyAgICAgICAgIyB1cGRhdGUgaW5zdGFuY2Ugb3B0aW9ucworICAgICAgICBmb3IgaywgdiBpbiBvcHRpb25zLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLm9wdGlvbnNba10gPSB2CisKKyAgICAgICAgc2VsZi5fZml4b3B0aW9ucygpCisKKyAgICAgICAgIyB3ZSBuZWVkIGEgZHVtbXkgd2lkZ2V0IHRvIHByb3Blcmx5IHByb2Nlc3MgdGhlIG9wdGlvbnMKKyAgICAgICAgIyAoYXQgbGVhc3QgYXMgbG9uZyBhcyB3ZSB1c2UgVGtpbnRlciAxLjYzKQorICAgICAgICB3ID0gRnJhbWUoc2VsZi5tYXN0ZXIpCisKKyAgICAgICAgdHJ5OgorCisgICAgICAgICAgICBzID0gdy50ay5jYWxsKHNlbGYuY29tbWFuZCwgKncuX29wdGlvbnMoc2VsZi5vcHRpb25zKSkKKworICAgICAgICAgICAgcyA9IHNlbGYuX2ZpeHJlc3VsdCh3LCBzKQorCisgICAgICAgIGZpbmFsbHk6CisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIGdldCByaWQgb2YgdGhlIHdpZGdldAorICAgICAgICAgICAgICAgIHcuZGVzdHJveSgpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJldHVybiBzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbW1vbkRpYWxvZy5weWMgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbW1vbkRpYWxvZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlZGQzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29tbW9uRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbW1vbkRpYWxvZy5weW8gYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0NvbW1vbkRpYWxvZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlZGQzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrQ29tbW9uRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZpbGVEaWFsb2cucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZpbGVEaWFsb2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVjN2Q1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRmlsZURpYWxvZy5weQpAQCAtMCwwICsxLDIxNSBAQAorIworIyBJbnN0YW50IFB5dGhvbgorIyAkSWQ6IHRrRmlsZURpYWxvZy5weSAzNjU2MCAyMDA0LTA3LTE4IDA2OjE2OjA4WiB0aW1fb25lICQKKyMKKyMgdGsgY29tbW9uIGZpbGUgZGlhbG9ndWVzCisjCisjIHRoaXMgbW9kdWxlIHByb3ZpZGVzIGludGVyZmFjZXMgdG8gdGhlIG5hdGl2ZSBmaWxlIGRpYWxvZ3VlcworIyBhdmFpbGFibGUgaW4gVGsgNC4yIGFuZCBuZXdlciwgYW5kIHRoZSBkaXJlY3RvcnkgZGlhbG9ndWUgYXZhaWxhYmxlCisjIGluIFRrIDguMyBhbmQgbmV3ZXIuCisjCisjIHdyaXR0ZW4gYnkgRnJlZHJpayBMdW5kaCwgTWF5IDE5OTcuCisjCisKKyMKKyMgb3B0aW9ucyAoYWxsIGhhdmUgZGVmYXVsdCB2YWx1ZXMpOgorIworIyAtIGRlZmF1bHRleHRlbnNpb246IGFkZGVkIHRvIGZpbGVuYW1lIGlmIG5vdCBleHBsaWNpdGx5IGdpdmVuCisjCisjIC0gZmlsZXR5cGVzOiBzZXF1ZW5jZSBvZiAobGFiZWwsIHBhdHRlcm4pIHR1cGxlcy4gIHRoZSBzYW1lIHBhdHRlcm4KKyMgICBtYXkgb2NjdXIgd2l0aCBzZXZlcmFsIHBhdHRlcm5zLiAgdXNlICIqIiBhcyBwYXR0ZXJuIHRvIGluZGljYXRlCisjICAgYWxsIGZpbGVzLgorIworIyAtIGluaXRpYWxkaXI6IGluaXRpYWwgZGlyZWN0b3J5LiAgcHJlc2VydmVkIGJ5IGRpYWxvZyBpbnN0YW5jZS4KKyMKKyMgLSBpbml0aWFsZmlsZTogaW5pdGlhbCBmaWxlIChpZ25vcmVkIGJ5IHRoZSBvcGVuIGRpYWxvZykuICBwcmVzZXJ2ZWQKKyMgICBieSBkaWFsb2cgaW5zdGFuY2UuCisjCisjIC0gcGFyZW50OiB3aGljaCB3aW5kb3cgdG8gcGxhY2UgdGhlIGRpYWxvZyBvbiB0b3Agb2YKKyMKKyMgLSB0aXRsZTogZGlhbG9nIHRpdGxlCisjCisjIC0gbXVsdGlwbGU6IGlmIHRydWUgdXNlciBtYXkgc2VsZWN0IG1vcmUgdGhhbiBvbmUgZmlsZQorIworIyBvcHRpb25zIGZvciB0aGUgZGlyZWN0b3J5IGNob29zZXI6CisjCisjIC0gaW5pdGlhbGRpciwgcGFyZW50LCB0aXRsZTogc2VlIGFib3ZlCisjCisjIC0gbXVzdGV4aXN0OiBpZiB0cnVlLCB1c2VyIG11c3QgcGljayBhbiBleGlzdGluZyBkaXJlY3RvcnkKKyMKKyMKKworCitmcm9tIHRrQ29tbW9uRGlhbG9nIGltcG9ydCBEaWFsb2cKKworY2xhc3MgX0RpYWxvZyhEaWFsb2cpOgorCisgICAgZGVmIF9maXhvcHRpb25zKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIG1ha2Ugc3VyZSAiZmlsZXR5cGVzIiBpcyBhIHR1cGxlCisgICAgICAgICAgICBzZWxmLm9wdGlvbnNbImZpbGV0eXBlcyJdID0gdHVwbGUoc2VsZi5vcHRpb25zWyJmaWxldHlwZXMiXSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9maXhyZXN1bHQoc2VsZiwgd2lkZ2V0LCByZXN1bHQpOgorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICAjIGtlZXAgZGlyZWN0b3J5IGFuZCBmaWxlbmFtZSB1bnRpbCBuZXh0IHRpbWUKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgIyBjb252ZXJ0IFRjbCBwYXRoIG9iamVjdHMgdG8gc3RyaW5ncworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdHJpbmcKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGl0IGFscmVhZHkgaXMgYSBzdHJpbmcKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBwYXRoLCBmaWxlID0gb3MucGF0aC5zcGxpdChyZXN1bHQpCisgICAgICAgICAgICBzZWxmLm9wdGlvbnNbImluaXRpYWxkaXIiXSA9IHBhdGgKKyAgICAgICAgICAgIHNlbGYub3B0aW9uc1siaW5pdGlhbGZpbGUiXSA9IGZpbGUKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHJlc3VsdCAjIGNvbXBhdGliaWxpdHkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKKyMKKyMgZmlsZSBkaWFsb2dzCisKK2NsYXNzIE9wZW4oX0RpYWxvZyk6CisgICAgIkFzayBmb3IgYSBmaWxlbmFtZSB0byBvcGVuIgorCisgICAgY29tbWFuZCA9ICJ0a19nZXRPcGVuRmlsZSIKKworICAgIGRlZiBfZml4cmVzdWx0KHNlbGYsIHdpZGdldCwgcmVzdWx0KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIHR1cGxlKToKKyAgICAgICAgICAgICMgbXVsdGlwbGUgcmVzdWx0czoKKyAgICAgICAgICAgIHJlc3VsdCA9IHR1cGxlKFtnZXRhdHRyKHIsICJzdHJpbmciLCByKSBmb3IgciBpbiByZXN1bHRdKQorICAgICAgICAgICAgaWYgcmVzdWx0OgorICAgICAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgICAgIHBhdGgsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KHJlc3VsdFswXSkKKyAgICAgICAgICAgICAgICBzZWxmLm9wdGlvbnNbImluaXRpYWxkaXIiXSA9IHBhdGgKKyAgICAgICAgICAgICAgICAjIGRvbid0IHNldCBpbml0aWFsZmlsZSBvciBmaWxlbmFtZSwgYXMgd2UgaGF2ZSBtdWx0aXBsZSBvZiB0aGVzZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBpZiBub3Qgd2lkZ2V0LnRrLndhbnRvYmplY3RzKCkgYW5kICJtdWx0aXBsZSIgaW4gc2VsZi5vcHRpb25zOgorICAgICAgICAgICAgIyBOZWVkIHRvIHNwbGl0IHJlc3VsdCBleHBsaWNpdGx5CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZml4cmVzdWx0KHdpZGdldCwgd2lkZ2V0LnRrLnNwbGl0bGlzdChyZXN1bHQpKQorICAgICAgICByZXR1cm4gX0RpYWxvZy5fZml4cmVzdWx0KHNlbGYsIHdpZGdldCwgcmVzdWx0KQorCitjbGFzcyBTYXZlQXMoX0RpYWxvZyk6CisgICAgIkFzayBmb3IgYSBmaWxlbmFtZSB0byBzYXZlIGFzIgorCisgICAgY29tbWFuZCA9ICJ0a19nZXRTYXZlRmlsZSIKKworCisjIHRoZSBkaXJlY3RvcnkgZGlhbG9nIGhhcyBpdHMgb3duIF9maXggcm91dGluZXMuCitjbGFzcyBEaXJlY3RvcnkoRGlhbG9nKToKKyAgICAiQXNrIGZvciBhIGRpcmVjdG9yeSIKKworICAgIGNvbW1hbmQgPSAidGtfY2hvb3NlRGlyZWN0b3J5IgorCisgICAgZGVmIF9maXhyZXN1bHQoc2VsZiwgd2lkZ2V0LCByZXN1bHQpOgorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICAjIGNvbnZlcnQgVGNsIHBhdGggb2JqZWN0cyB0byBzdHJpbmdzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnN0cmluZworICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgaXQgYWxyZWFkeSBpcyBhIHN0cmluZworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMga2VlcCBkaXJlY3RvcnkgdW50aWwgbmV4dCB0aW1lCisgICAgICAgICAgICBzZWxmLm9wdGlvbnNbImluaXRpYWxkaXIiXSA9IHJlc3VsdAorICAgICAgICBzZWxmLmRpcmVjdG9yeSA9IHJlc3VsdCAjIGNvbXBhdGliaWxpdHkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisjCisjIGNvbnZlbmllbmNlIHN0dWZmCisKK2RlZiBhc2tvcGVuZmlsZW5hbWUoKipvcHRpb25zKToKKyAgICAiQXNrIGZvciBhIGZpbGVuYW1lIHRvIG9wZW4iCisKKyAgICByZXR1cm4gT3BlbigqKm9wdGlvbnMpLnNob3coKQorCitkZWYgYXNrc2F2ZWFzZmlsZW5hbWUoKipvcHRpb25zKToKKyAgICAiQXNrIGZvciBhIGZpbGVuYW1lIHRvIHNhdmUgYXMiCisKKyAgICByZXR1cm4gU2F2ZUFzKCoqb3B0aW9ucykuc2hvdygpCisKK2RlZiBhc2tvcGVuZmlsZW5hbWVzKCoqb3B0aW9ucyk6CisgICAgIiIiQXNrIGZvciBtdWx0aXBsZSBmaWxlbmFtZXMgdG8gb3BlbgorCisgICAgUmV0dXJucyBhIGxpc3Qgb2YgZmlsZW5hbWVzIG9yIGVtcHR5IGxpc3QgaWYKKyAgICBjYW5jZWwgYnV0dG9uIHNlbGVjdGVkCisgICAgIiIiCisgICAgb3B0aW9uc1sibXVsdGlwbGUiXT0xCisgICAgcmV0dXJuIE9wZW4oKipvcHRpb25zKS5zaG93KCkKKworIyBGSVhNRTogYXJlIHRoZSBmb2xsb3dpbmcgIHBlcmhhcHMgYSBiaXQgdG9vIGNvbnZlbmllbnQ/CisKK2RlZiBhc2tvcGVuZmlsZShtb2RlID0gInIiLCAqKm9wdGlvbnMpOgorICAgICJBc2sgZm9yIGEgZmlsZW5hbWUgdG8gb3BlbiwgYW5kIHJldHVybmVkIHRoZSBvcGVuZWQgZmlsZSIKKworICAgIGZpbGVuYW1lID0gT3BlbigqKm9wdGlvbnMpLnNob3coKQorICAgIGlmIGZpbGVuYW1lOgorICAgICAgICByZXR1cm4gb3BlbihmaWxlbmFtZSwgbW9kZSkKKyAgICByZXR1cm4gTm9uZQorCitkZWYgYXNrb3BlbmZpbGVzKG1vZGUgPSAiciIsICoqb3B0aW9ucyk6CisgICAgIiIiQXNrIGZvciBtdWx0aXBsZSBmaWxlbmFtZXMgYW5kIHJldHVybiB0aGUgb3BlbiBmaWxlCisgICAgb2JqZWN0cworCisgICAgcmV0dXJucyBhIGxpc3Qgb2Ygb3BlbiBmaWxlIG9iamVjdHMgb3IgYW4gZW1wdHkgbGlzdCBpZgorICAgIGNhbmNlbCBzZWxlY3RlZAorICAgICIiIgorCisgICAgZmlsZXMgPSBhc2tvcGVuZmlsZW5hbWVzKCoqb3B0aW9ucykKKyAgICBpZiBmaWxlczoKKyAgICAgICAgb2ZpbGVzPVtdCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgIG9maWxlcy5hcHBlbmQob3BlbihmaWxlbmFtZSwgbW9kZSkpCisgICAgICAgIGZpbGVzPW9maWxlcworICAgIHJldHVybiBmaWxlcworCisKK2RlZiBhc2tzYXZlYXNmaWxlKG1vZGUgPSAidyIsICoqb3B0aW9ucyk6CisgICAgIkFzayBmb3IgYSBmaWxlbmFtZSB0byBzYXZlIGFzLCBhbmQgcmV0dXJuZWQgdGhlIG9wZW5lZCBmaWxlIgorCisgICAgZmlsZW5hbWUgPSBTYXZlQXMoKipvcHRpb25zKS5zaG93KCkKKyAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgcmV0dXJuIG9wZW4oZmlsZW5hbWUsIG1vZGUpCisgICAgcmV0dXJuIE5vbmUKKworZGVmIGFza2RpcmVjdG9yeSAoKipvcHRpb25zKToKKyAgICAiQXNrIGZvciBhIGRpcmVjdG9yeSwgYW5kIHJldHVybiB0aGUgZmlsZSBuYW1lIgorICAgIHJldHVybiBEaXJlY3RvcnkoKipvcHRpb25zKS5zaG93KCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0ZXN0IHN0dWZmCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgIyBTaW5jZSB0aGUgZmlsZSBuYW1lIG1heSBjb250YWluIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCB3ZSBuZWVkCisgICAgIyB0byBmaW5kIGFuIGVuY29kaW5nIHRoYXQgbGlrZWx5IHN1cHBvcnRzIHRoZSBmaWxlIG5hbWUsIGFuZAorICAgICMgZGlzcGxheXMgY29ycmVjdGx5IG9uIHRoZSB0ZXJtaW5hbC4KKworICAgICMgU3RhcnQgb2ZmIHdpdGggVVRGLTgKKyAgICBlbmMgPSAidXRmLTgiCisgICAgaW1wb3J0IHN5cworCisgICAgIyBTZWUgd2hldGhlciBDT0RFU0VUIGlzIGRlZmluZWQKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBsb2NhbGUKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQUxMLCcnKQorICAgICAgICBlbmMgPSBsb2NhbGUubmxfbGFuZ2luZm8obG9jYWxlLkNPREVTRVQpCisgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBwYXNzCisKKyAgICAjIGRpYWxvZyBmb3Igb3BlbmVuaW5nIGZpbGVzCisKKyAgICBvcGVuZmlsZW5hbWU9YXNrb3BlbmZpbGVuYW1lKGZpbGV0eXBlcz1bKCJhbGwgZmlsZXMiLCAiKiIpXSkKKyAgICB0cnk6CisgICAgICAgIGZwPW9wZW4ob3BlbmZpbGVuYW1lLCJyIikKKyAgICAgICAgZnAuY2xvc2UoKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQgIkNvdWxkIG5vdCBvcGVuIEZpbGU6ICIKKyAgICAgICAgcHJpbnQgc3lzLmV4Y19pbmZvKClbMV0KKworICAgIHByaW50ICJvcGVuIiwgb3BlbmZpbGVuYW1lLmVuY29kZShlbmMpCisKKyAgICAjIGRpYWxvZyBmb3Igc2F2aW5nIGZpbGVzCisKKyAgICBzYXZlYXNmaWxlbmFtZT1hc2tzYXZlYXNmaWxlbmFtZSgpCisgICAgcHJpbnQgInNhdmVhcyIsIHNhdmVhc2ZpbGVuYW1lLmVuY29kZShlbmMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZpbGVEaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhhZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZpbGVEaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhhZTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGaWxlRGlhbG9nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZvbnQucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZvbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI5ZjI1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrRm9udC5weQpAQCAtMCwwICsxLDIxNiBAQAorIyBUa2ludGVyIGZvbnQgd3JhcHBlcgorIworIyB3cml0dGVuIGJ5IEZyZWRyaWsgTHVuZGgsIEZlYnJ1YXJ5IDE5OTgKKyMKKyMgRklYTUU6IHNob3VsZCBhZGQgJ2Rpc3BsYXlvZicgb3B0aW9uIHdoZXJlIHJlbGV2YW50IChhY3R1YWwsIGZhbWlsaWVzLAorIyAgICAgICAgbWVhc3VyZSwgYW5kIG1ldHJpY3MpCisjCisKK19fdmVyc2lvbl9fID0gIjAuOSIKKworaW1wb3J0IFRraW50ZXIKKworIyB3ZWlnaHQvc2xhbnQKK05PUk1BTCA9ICJub3JtYWwiCitST01BTiA9ICJyb21hbiIKK0JPTEQgICA9ICJib2xkIgorSVRBTElDID0gIml0YWxpYyIKKworZGVmIG5hbWV0b2ZvbnQobmFtZSk6CisgICAgIiIiR2l2ZW4gdGhlIG5hbWUgb2YgYSB0ayBuYW1lZCBmb250LCByZXR1cm5zIGEgRm9udCByZXByZXNlbnRhdGlvbi4KKyAgICAiIiIKKyAgICByZXR1cm4gRm9udChuYW1lPW5hbWUsIGV4aXN0cz1UcnVlKQorCitjbGFzcyBGb250OgorCisgICAgIiIiUmVwcmVzZW50cyBhIG5hbWVkIGZvbnQuCisKKyAgICBDb25zdHJ1Y3RvciBvcHRpb25zIGFyZToKKworICAgIGZvbnQgLS0gZm9udCBzcGVjaWZpZXIgKG5hbWUsIHN5c3RlbSBmb250LCBvciAoZmFtaWx5LCBzaXplLCBzdHlsZSktdHVwbGUpCisgICAgbmFtZSAtLSBuYW1lIHRvIHVzZSBmb3IgdGhpcyBmb250IGNvbmZpZ3VyYXRpb24gKGRlZmF1bHRzIHRvIGEgdW5pcXVlIG5hbWUpCisgICAgZXhpc3RzIC0tIGRvZXMgYSBuYW1lZCBmb250IGJ5IHRoaXMgbmFtZSBhbHJlYWR5IGV4aXN0PworICAgICAgIENyZWF0ZXMgYSBuZXcgbmFtZWQgZm9udCBpZiBGYWxzZSwgcG9pbnRzIHRvIHRoZSBleGlzdGluZyBmb250IGlmIFRydWUuCisgICAgICAgUmFpc2VzIF9Ua2ludGVyLlRjbEVycm9yIGlmIHRoZSBhc3NlcnRpb24gaXMgZmFsc2UuCisKKyAgICAgICB0aGUgZm9sbG93aW5nIGFyZSBpZ25vcmVkIGlmIGZvbnQgaXMgc3BlY2lmaWVkOgorCisgICAgZmFtaWx5IC0tIGZvbnQgJ2ZhbWlseScsIGUuZy4gQ291cmllciwgVGltZXMsIEhlbHZldGljYQorICAgIHNpemUgLS0gZm9udCBzaXplIGluIHBvaW50cworICAgIHdlaWdodCAtLSBmb250IHRoaWNrbmVzczogTk9STUFMLCBCT0xECisgICAgc2xhbnQgLS0gZm9udCBzbGFudDogUk9NQU4sIElUQUxJQworICAgIHVuZGVybGluZSAtLSBmb250IHVuZGVybGluaW5nOiBmYWxzZSAoMCksIHRydWUgKDEpCisgICAgb3ZlcnN0cmlrZSAtLSBmb250IHN0cmlrZW91dDogZmFsc2UgKDApLCB0cnVlICgxKQorCisgICAgIiIiCisKKyAgICBkZWYgX3NldChzZWxmLCBrdyk6CisgICAgICAgIG9wdGlvbnMgPSBbXQorICAgICAgICBmb3IgaywgdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi0iK2spCisgICAgICAgICAgICBvcHRpb25zLmFwcGVuZChzdHIodikpCisgICAgICAgIHJldHVybiB0dXBsZShvcHRpb25zKQorCisgICAgZGVmIF9nZXQoc2VsZiwgYXJncyk6CisgICAgICAgIG9wdGlvbnMgPSBbXQorICAgICAgICBmb3IgayBpbiBhcmdzOgorICAgICAgICAgICAgb3B0aW9ucy5hcHBlbmQoIi0iK2spCisgICAgICAgIHJldHVybiB0dXBsZShvcHRpb25zKQorCisgICAgZGVmIF9ta2RpY3Qoc2VsZiwgYXJncyk6CisgICAgICAgIG9wdGlvbnMgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oYXJncyksIDIpOgorICAgICAgICAgICAgb3B0aW9uc1thcmdzW2ldWzE6XV0gPSBhcmdzW2krMV0KKyAgICAgICAgcmV0dXJuIG9wdGlvbnMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290PU5vbmUsIGZvbnQ9Tm9uZSwgbmFtZT1Ob25lLCBleGlzdHM9RmFsc2UsICoqb3B0aW9ucyk6CisgICAgICAgIGlmIG5vdCByb290OgorICAgICAgICAgICAgcm9vdCA9IFRraW50ZXIuX2RlZmF1bHRfcm9vdAorICAgICAgICBpZiBmb250OgorICAgICAgICAgICAgIyBnZXQgYWN0dWFsIHNldHRpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGZvbnQKKyAgICAgICAgICAgIGZvbnQgPSByb290LnRrLnNwbGl0bGlzdChyb290LnRrLmNhbGwoImZvbnQiLCAiYWN0dWFsIiwgZm9udCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb250ID0gc2VsZi5fc2V0KG9wdGlvbnMpCisgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgbmFtZSA9ICJmb250IiArIHN0cihpZChzZWxmKSkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCisgICAgICAgIGlmIGV4aXN0czoKKyAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZvbnQgPSBGYWxzZQorICAgICAgICAgICAgIyBjb25maXJtIGZvbnQgZXhpc3RzCisgICAgICAgICAgICBpZiBzZWxmLm5hbWUgbm90IGluIHJvb3QudGsuY2FsbCgiZm9udCIsICJuYW1lcyIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFRraW50ZXIuX3RraW50ZXIuVGNsRXJyb3IsICJuYW1lZCBmb250ICVzIGRvZXMgbm90IGFscmVhZHkgZXhpc3QiICUgKHNlbGYubmFtZSwpCisgICAgICAgICAgICAjIGlmIGZvbnQgY29uZmlnIGluZm8gc3VwcGxpZWQsIGFwcGx5IGl0CisgICAgICAgICAgICBpZiBmb250OgorICAgICAgICAgICAgICAgIHJvb3QudGsuY2FsbCgiZm9udCIsICJjb25maWd1cmUiLCBzZWxmLm5hbWUsICpmb250KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBjcmVhdGUgbmV3IGZvbnQgKHJhaXNlcyBUY2xFcnJvciBpZiB0aGUgZm9udCBleGlzdHMpCisgICAgICAgICAgICByb290LnRrLmNhbGwoImZvbnQiLCAiY3JlYXRlIiwgc2VsZi5uYW1lLCAqZm9udCkKKyAgICAgICAgICAgIHNlbGYuZGVsZXRlX2ZvbnQgPSBUcnVlCisgICAgICAgICMgYmFja2xpbmtzIQorICAgICAgICBzZWxmLl9yb290ICA9IHJvb3QKKyAgICAgICAgc2VsZi5fc3BsaXQgPSByb290LnRrLnNwbGl0bGlzdAorICAgICAgICBzZWxmLl9jYWxsICA9IHJvb3QudGsuY2FsbAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lID09IG90aGVyLm5hbWUgYW5kIGlzaW5zdGFuY2Uob3RoZXIsIEZvbnQpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuY2dldChrZXkpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYuY29uZmlndXJlKCoqe2tleTogdmFsdWV9KQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuZGVsZXRlX2ZvbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5fY2FsbCgiZm9udCIsICJkZWxldGUiLCBzZWxmLm5hbWUpCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAiUmV0dXJuIGEgZGlzdGluY3QgY29weSBvZiB0aGUgY3VycmVudCBmb250IgorICAgICAgICByZXR1cm4gRm9udChzZWxmLl9yb290LCAqKnNlbGYuYWN0dWFsKCkpCisKKyAgICBkZWYgYWN0dWFsKHNlbGYsIG9wdGlvbj1Ob25lKToKKyAgICAgICAgIlJldHVybiBhY3R1YWwgZm9udCBhdHRyaWJ1dGVzIgorICAgICAgICBpZiBvcHRpb246CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2FsbCgiZm9udCIsICJhY3R1YWwiLCBzZWxmLm5hbWUsICItIitvcHRpb24pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbWtkaWN0KAorICAgICAgICAgICAgICAgIHNlbGYuX3NwbGl0KHNlbGYuX2NhbGwoImZvbnQiLCAiYWN0dWFsIiwgc2VsZi5uYW1lKSkKKyAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgY2dldChzZWxmLCBvcHRpb24pOgorICAgICAgICAiR2V0IGZvbnQgYXR0cmlidXRlIgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbCgiZm9udCIsICJjb25maWciLCBzZWxmLm5hbWUsICItIitvcHRpb24pCisKKyAgICBkZWYgY29uZmlnKHNlbGYsICoqb3B0aW9ucyk6CisgICAgICAgICJNb2RpZnkgZm9udCBhdHRyaWJ1dGVzIgorICAgICAgICBpZiBvcHRpb25zOgorICAgICAgICAgICAgc2VsZi5fY2FsbCgiZm9udCIsICJjb25maWciLCBzZWxmLm5hbWUsCisgICAgICAgICAgICAgICAgICAqc2VsZi5fc2V0KG9wdGlvbnMpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21rZGljdCgKKyAgICAgICAgICAgICAgICBzZWxmLl9zcGxpdChzZWxmLl9jYWxsKCJmb250IiwgImNvbmZpZyIsIHNlbGYubmFtZSkpCisgICAgICAgICAgICAgICAgKQorCisgICAgY29uZmlndXJlID0gY29uZmlnCisKKyAgICBkZWYgbWVhc3VyZShzZWxmLCB0ZXh0KToKKyAgICAgICAgIlJldHVybiB0ZXh0IHdpZHRoIgorICAgICAgICByZXR1cm4gaW50KHNlbGYuX2NhbGwoImZvbnQiLCAibWVhc3VyZSIsIHNlbGYubmFtZSwgdGV4dCkpCisKKyAgICBkZWYgbWV0cmljcyhzZWxmLCAqb3B0aW9ucyk6CisgICAgICAgICIiIlJldHVybiBmb250IG1ldHJpY3MuCisKKyAgICAgICAgRm9yIGJlc3QgcGVyZm9ybWFuY2UsIGNyZWF0ZSBhIGR1bW15IHdpZGdldAorICAgICAgICB1c2luZyB0aGlzIGZvbnQgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuIiIiCisKKyAgICAgICAgaWYgb3B0aW9uczoKKyAgICAgICAgICAgIHJldHVybiBpbnQoCisgICAgICAgICAgICAgICAgc2VsZi5fY2FsbCgiZm9udCIsICJtZXRyaWNzIiwgc2VsZi5uYW1lLCBzZWxmLl9nZXQob3B0aW9ucykpCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzID0gc2VsZi5fc3BsaXQoc2VsZi5fY2FsbCgiZm9udCIsICJtZXRyaWNzIiwgc2VsZi5uYW1lKSkKKyAgICAgICAgICAgIG9wdGlvbnMgPSB7fQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKHJlcyksIDIpOgorICAgICAgICAgICAgICAgIG9wdGlvbnNbcmVzW2ldWzE6XV0gPSBpbnQocmVzW2krMV0pCisgICAgICAgICAgICByZXR1cm4gb3B0aW9ucworCitkZWYgZmFtaWxpZXMocm9vdD1Ob25lKToKKyAgICAiR2V0IGZvbnQgZmFtaWxpZXMgKGFzIGEgdHVwbGUpIgorICAgIGlmIG5vdCByb290OgorICAgICAgICByb290ID0gVGtpbnRlci5fZGVmYXVsdF9yb290CisgICAgcmV0dXJuIHJvb3QudGsuc3BsaXRsaXN0KHJvb3QudGsuY2FsbCgiZm9udCIsICJmYW1pbGllcyIpKQorCitkZWYgbmFtZXMocm9vdD1Ob25lKToKKyAgICAiR2V0IG5hbWVzIG9mIGRlZmluZWQgZm9udHMgKGFzIGEgdHVwbGUpIgorICAgIGlmIG5vdCByb290OgorICAgICAgICByb290ID0gVGtpbnRlci5fZGVmYXVsdF9yb290CisgICAgcmV0dXJuIHJvb3QudGsuc3BsaXRsaXN0KHJvb3QudGsuY2FsbCgiZm9udCIsICJuYW1lcyIpKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRlc3Qgc3R1ZmYKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKworICAgIHJvb3QgPSBUa2ludGVyLlRrKCkKKworICAgICMgY3JlYXRlIGEgZm9udAorICAgIGYgPSBGb250KGZhbWlseT0idGltZXMiLCBzaXplPTMwLCB3ZWlnaHQ9Tk9STUFMKQorCisgICAgcHJpbnQgZi5hY3R1YWwoKQorICAgIHByaW50IGYuYWN0dWFsKCJmYW1pbHkiKQorICAgIHByaW50IGYuYWN0dWFsKCJ3ZWlnaHQiKQorCisgICAgcHJpbnQgZi5jb25maWcoKQorICAgIHByaW50IGYuY2dldCgiZmFtaWx5IikKKyAgICBwcmludCBmLmNnZXQoIndlaWdodCIpCisKKyAgICBwcmludCBuYW1lcygpCisKKyAgICBwcmludCBmLm1lYXN1cmUoImhlbGxvIiksIGYubWV0cmljcygibGluZXNwYWNlIikKKworICAgIHByaW50IGYubWV0cmljcygpCisKKyAgICBmID0gRm9udChmb250PSgiQ291cmllciIsIDIwLCAiYm9sZCIpKQorICAgIHByaW50IGYubWVhc3VyZSgiaGVsbG8iKSwgZi5tZXRyaWNzKCJsaW5lc3BhY2UiKQorCisgICAgdyA9IFRraW50ZXIuTGFiZWwocm9vdCwgdGV4dD0iSGVsbG8sIHdvcmxkIiwgZm9udD1mKQorICAgIHcucGFjaygpCisKKyAgICB3ID0gVGtpbnRlci5CdXR0b24ocm9vdCwgdGV4dD0iUXVpdCEiLCBjb21tYW5kPXJvb3QuZGVzdHJveSkKKyAgICB3LnBhY2soKQorCisgICAgZmIgPSBGb250KGZvbnQ9d1siZm9udCJdKS5jb3B5KCkKKyAgICBmYi5jb25maWcod2VpZ2h0PUJPTEQpCisKKyAgICB3LmNvbmZpZyhmb250PWZiKQorCisgICAgVGtpbnRlci5tYWlubG9vcCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZvbnQucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI4NzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a0ZvbnQucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTI4NzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtGb250LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a01lc3NhZ2VCb3gucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a01lc3NhZ2VCb3gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlOTIzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrTWVzc2FnZUJveC5weQpAQCAtMCwwICsxLDEzNCBAQAorIyB0ayBjb21tb24gbWVzc2FnZSBib3hlcworIworIyB0aGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGhlIG5hdGl2ZSBtZXNzYWdlIGJveGVzCisjIGF2YWlsYWJsZSBpbiBUayA0LjIgYW5kIG5ld2VyLgorIworIyB3cml0dGVuIGJ5IEZyZWRyaWsgTHVuZGgsIE1heSAxOTk3CisjCisKKyMKKyMgb3B0aW9ucyAoYWxsIGhhdmUgZGVmYXVsdCB2YWx1ZXMpOgorIworIyAtIGRlZmF1bHQ6IHdoaWNoIGJ1dHRvbiB0byBtYWtlIGRlZmF1bHQgKG9uZSBvZiB0aGUgcmVwbHkgY29kZXMpCisjCisjIC0gaWNvbjogd2hpY2ggaWNvbiB0byBkaXNwbGF5IChzZWUgYmVsb3cpCisjCisjIC0gbWVzc2FnZTogdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQorIworIyAtIHBhcmVudDogd2hpY2ggd2luZG93IHRvIHBsYWNlIHRoZSBkaWFsb2cgb24gdG9wIG9mCisjCisjIC0gdGl0bGU6IGRpYWxvZyB0aXRsZQorIworIyAtIHR5cGU6IGRpYWxvZyB0eXBlOyB0aGF0IGlzLCB3aGljaCBidXR0b25zIHRvIGRpc3BsYXkgKHNlZSBiZWxvdykKKyMKKworZnJvbSB0a0NvbW1vbkRpYWxvZyBpbXBvcnQgRGlhbG9nCisKKyMKKyMgY29uc3RhbnRzCisKKyMgaWNvbnMKK0VSUk9SID0gImVycm9yIgorSU5GTyA9ICJpbmZvIgorUVVFU1RJT04gPSAicXVlc3Rpb24iCitXQVJOSU5HID0gIndhcm5pbmciCisKKyMgdHlwZXMKK0FCT1JUUkVUUllJR05PUkUgPSAiYWJvcnRyZXRyeWlnbm9yZSIKK09LID0gIm9rIgorT0tDQU5DRUwgPSAib2tjYW5jZWwiCitSRVRSWUNBTkNFTCA9ICJyZXRyeWNhbmNlbCIKK1lFU05PID0gInllc25vIgorWUVTTk9DQU5DRUwgPSAieWVzbm9jYW5jZWwiCisKKyMgcmVwbGllcworQUJPUlQgPSAiYWJvcnQiCitSRVRSWSA9ICJyZXRyeSIKK0lHTk9SRSA9ICJpZ25vcmUiCitPSyA9ICJvayIKK0NBTkNFTCA9ICJjYW5jZWwiCitZRVMgPSAieWVzIgorTk8gPSAibm8iCisKKworIworIyBtZXNzYWdlIGRpYWxvZyBjbGFzcworCitjbGFzcyBNZXNzYWdlKERpYWxvZyk6CisgICAgIkEgbWVzc2FnZSBib3giCisKKyAgICBjb21tYW5kICA9ICJ0a19tZXNzYWdlQm94IgorCisKKyMKKyMgY29udmVuaWVuY2Ugc3R1ZmYKKworIyBSZW5hbWUgX2ljb24gYW5kIF90eXBlIG9wdGlvbnMgdG8gYWxsb3cgb3ZlcnJpZGluZyB0aGVtIGluIG9wdGlvbnMKK2RlZiBfc2hvdyh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsIF9pY29uPU5vbmUsIF90eXBlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgaWYgX2ljb24gYW5kICJpY29uIiBub3QgaW4gb3B0aW9uczogICAgb3B0aW9uc1siaWNvbiJdID0gX2ljb24KKyAgICBpZiBfdHlwZSBhbmQgInR5cGUiIG5vdCBpbiBvcHRpb25zOiAgICBvcHRpb25zWyJ0eXBlIl0gPSBfdHlwZQorICAgIGlmIHRpdGxlOiAgIG9wdGlvbnNbInRpdGxlIl0gPSB0aXRsZQorICAgIGlmIG1lc3NhZ2U6IG9wdGlvbnNbIm1lc3NhZ2UiXSA9IG1lc3NhZ2UKKyAgICByZXMgPSBNZXNzYWdlKCoqb3B0aW9ucykuc2hvdygpCisgICAgIyBJbiBzb21lIFRjbCBpbnN0YWxsYXRpb25zLCB5ZXMvbm8gaXMgY29udmVydGVkIGludG8gYSBib29sZWFuLgorICAgIGlmIGlzaW5zdGFuY2UocmVzLCBib29sKToKKyAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgcmV0dXJuIFlFUworICAgICAgICByZXR1cm4gTk8KKyAgICAjIEluIG90aGVycyB3ZSBnZXQgYSBUY2xfT2JqLgorICAgIHJldHVybiBzdHIocmVzKQorCitkZWYgc2hvd2luZm8odGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICJTaG93IGFuIGluZm8gbWVzc2FnZSIKKyAgICByZXR1cm4gX3Nob3codGl0bGUsIG1lc3NhZ2UsIElORk8sIE9LLCAqKm9wdGlvbnMpCisKK2RlZiBzaG93d2FybmluZyh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgIlNob3cgYSB3YXJuaW5nIG1lc3NhZ2UiCisgICAgcmV0dXJuIF9zaG93KHRpdGxlLCBtZXNzYWdlLCBXQVJOSU5HLCBPSywgKipvcHRpb25zKQorCitkZWYgc2hvd2Vycm9yKHRpdGxlPU5vbmUsIG1lc3NhZ2U9Tm9uZSwgKipvcHRpb25zKToKKyAgICAiU2hvdyBhbiBlcnJvciBtZXNzYWdlIgorICAgIHJldHVybiBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgRVJST1IsIE9LLCAqKm9wdGlvbnMpCisKK2RlZiBhc2txdWVzdGlvbih0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgIkFzayBhIHF1ZXN0aW9uIgorICAgIHJldHVybiBfc2hvdyh0aXRsZSwgbWVzc2FnZSwgUVVFU1RJT04sIFlFU05PLCAqKm9wdGlvbnMpCisKK2RlZiBhc2tva2NhbmNlbCh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsICoqb3B0aW9ucyk6CisgICAgIkFzayBpZiBvcGVyYXRpb24gc2hvdWxkIHByb2NlZWQ7IHJldHVybiB0cnVlIGlmIHRoZSBhbnN3ZXIgaXMgb2siCisgICAgcyA9IF9zaG93KHRpdGxlLCBtZXNzYWdlLCBRVUVTVElPTiwgT0tDQU5DRUwsICoqb3B0aW9ucykKKyAgICByZXR1cm4gcyA9PSBPSworCitkZWYgYXNreWVzbm8odGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICJBc2sgYSBxdWVzdGlvbjsgcmV0dXJuIHRydWUgaWYgdGhlIGFuc3dlciBpcyB5ZXMiCisgICAgcyA9IF9zaG93KHRpdGxlLCBtZXNzYWdlLCBRVUVTVElPTiwgWUVTTk8sICoqb3B0aW9ucykKKyAgICByZXR1cm4gcyA9PSBZRVMKKworZGVmIGFza3llc25vY2FuY2VsKHRpdGxlPU5vbmUsIG1lc3NhZ2U9Tm9uZSwgKipvcHRpb25zKToKKyAgICAiQXNrIGEgcXVlc3Rpb247IHJldHVybiB0cnVlIGlmIHRoZSBhbnN3ZXIgaXMgeWVzLCBOb25lIGlmIGNhbmNlbGxlZC4iCisgICAgcyA9IF9zaG93KHRpdGxlLCBtZXNzYWdlLCBRVUVTVElPTiwgWUVTTk9DQU5DRUwsICoqb3B0aW9ucykKKyAgICAjIHMgbWlnaHQgYmUgYSBUY2wgaW5kZXggb2JqZWN0LCBzbyBjb252ZXJ0IGl0IHRvIGEgc3RyaW5nCisgICAgcyA9IHN0cihzKQorICAgIGlmIHMgPT0gQ0FOQ0VMOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBzID09IFlFUworCitkZWYgYXNrcmV0cnljYW5jZWwodGl0bGU9Tm9uZSwgbWVzc2FnZT1Ob25lLCAqKm9wdGlvbnMpOgorICAgICJBc2sgaWYgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkOyByZXR1cm4gdHJ1ZSBpZiB0aGUgYW5zd2VyIGlzIHllcyIKKyAgICBzID0gX3Nob3codGl0bGUsIG1lc3NhZ2UsIFdBUk5JTkcsIFJFVFJZQ0FOQ0VMLCAqKm9wdGlvbnMpCisgICAgcmV0dXJuIHMgPT0gUkVUUlkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRlc3Qgc3R1ZmYKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKworICAgIHByaW50ICJpbmZvIiwgc2hvd2luZm8oIlNwYW0iLCAiRWdnIEluZm9ybWF0aW9uIikKKyAgICBwcmludCAid2FybmluZyIsIHNob3d3YXJuaW5nKCJTcGFtIiwgIkVnZyBXYXJuaW5nIikKKyAgICBwcmludCAiZXJyb3IiLCBzaG93ZXJyb3IoIlNwYW0iLCAiRWdnIEFsZXJ0IikKKyAgICBwcmludCAicXVlc3Rpb24iLCBhc2txdWVzdGlvbigiU3BhbSIsICJRdWVzdGlvbj8iKQorICAgIHByaW50ICJwcm9jZWVkIiwgYXNrb2tjYW5jZWwoIlNwYW0iLCAiUHJvY2VlZD8iKQorICAgIHByaW50ICJ5ZXMvbm8iLCBhc2t5ZXNubygiU3BhbSIsICJHb3QgaXQ/IikKKyAgICBwcmludCAieWVzL25vL2NhbmNlbCIsIGFza3llc25vY2FuY2VsKCJTcGFtIiwgIldhbnQgaXQ/IikKKyAgICBwcmludCAidHJ5IGFnYWluIiwgYXNrcmV0cnljYW5jZWwoIlNwYW0iLCAiVHJ5IGFnYWluPyIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a01lc3NhZ2VCb3gucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzUzODU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a01lc3NhZ2VCb3gucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzUzODU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtNZXNzYWdlQm94LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90a1NpbXBsZURpYWxvZy5weSBiL2xpYi9weXRob24yLjcvbGliLXRrL3RrU2ltcGxlRGlhbG9nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMzQ3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a1NpbXBsZURpYWxvZy5weQpAQCAtMCwwICsxLDMyMyBAQAorIworIyBBbiBJbnRyb2R1Y3Rpb24gdG8gVGtpbnRlcgorIyB0a1NpbXBsZURpYWxvZy5weQorIworIyBDb3B5cmlnaHQgKGMpIDE5OTcgYnkgRnJlZHJpayBMdW5kaAorIworIyBmcmVkcmlrQHB5dGhvbndhcmUuY29tCisjIGh0dHA6Ly93d3cucHl0aG9ud2FyZS5jb20KKyMKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBkaWFsb2cgYmFzZSBjbGFzcworCisnJydEaWFsb2cgYm94ZXMKKworVGhpcyBtb2R1bGUgaGFuZGxlcyBkaWFsb2cgYm94ZXMuIEl0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcKK3B1YmxpYyBzeW1ib2xzOgorCitEaWFsb2cgLS0gYSBiYXNlIGNsYXNzIGZvciBkaWFsb2dzCisKK2Fza2ludGVnZXIgLS0gZ2V0IGFuIGludGVnZXIgZnJvbSB0aGUgdXNlcgorCithc2tmbG9hdCAtLSBnZXQgYSBmbG9hdCBmcm9tIHRoZSB1c2VyCisKK2Fza3N0cmluZyAtLSBnZXQgYSBzdHJpbmcgZnJvbSB0aGUgdXNlcgorJycnCisKK2Zyb20gVGtpbnRlciBpbXBvcnQgKgorCitjbGFzcyBEaWFsb2coVG9wbGV2ZWwpOgorCisgICAgJycnQ2xhc3MgdG8gb3BlbiBkaWFsb2dzLgorCisgICAgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIGN1c3RvbSBkaWFsb2dzCisgICAgJycnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSA9IE5vbmUpOgorCisgICAgICAgICcnJ0luaXRpYWxpemUgYSBkaWFsb2cuCisKKyAgICAgICAgQXJndW1lbnRzOgorCisgICAgICAgICAgICBwYXJlbnQgLS0gYSBwYXJlbnQgd2luZG93ICh0aGUgYXBwbGljYXRpb24gd2luZG93KQorCisgICAgICAgICAgICB0aXRsZSAtLSB0aGUgZGlhbG9nIHRpdGxlCisgICAgICAgICcnJworICAgICAgICBUb3BsZXZlbC5fX2luaXRfXyhzZWxmLCBwYXJlbnQpCisKKyAgICAgICAgc2VsZi53aXRoZHJhdygpICMgcmVtYWluIGludmlzaWJsZSBmb3Igbm93CisgICAgICAgICMgSWYgdGhlIG1hc3RlciBpcyBub3Qgdmlld2FibGUsIGRvbid0CisgICAgICAgICMgbWFrZSB0aGUgY2hpbGQgdHJhbnNpZW50LCBvciBlbHNlIGl0CisgICAgICAgICMgd291bGQgYmUgb3BlbmVkIHdpdGhkcmF3bgorICAgICAgICBpZiBwYXJlbnQud2luZm9fdmlld2FibGUoKToKKyAgICAgICAgICAgIHNlbGYudHJhbnNpZW50KHBhcmVudCkKKworICAgICAgICBpZiB0aXRsZToKKyAgICAgICAgICAgIHNlbGYudGl0bGUodGl0bGUpCisKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKworICAgICAgICBzZWxmLnJlc3VsdCA9IE5vbmUKKworICAgICAgICBib2R5ID0gRnJhbWUoc2VsZikKKyAgICAgICAgc2VsZi5pbml0aWFsX2ZvY3VzID0gc2VsZi5ib2R5KGJvZHkpCisgICAgICAgIGJvZHkucGFjayhwYWR4PTUsIHBhZHk9NSkKKworICAgICAgICBzZWxmLmJ1dHRvbmJveCgpCisKKworICAgICAgICBpZiBub3Qgc2VsZi5pbml0aWFsX2ZvY3VzOgorICAgICAgICAgICAgc2VsZi5pbml0aWFsX2ZvY3VzID0gc2VsZgorCisgICAgICAgIHNlbGYucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmNhbmNlbCkKKworICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZ2VvbWV0cnkoIislZCslZCIgJSAocGFyZW50LndpbmZvX3Jvb3R4KCkrNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC53aW5mb19yb290eSgpKzUwKSkKKworICAgICAgICBzZWxmLmRlaWNvbmlmeSgpICMgYmVjb21lIHZpc2liaWxlIG5vdworCisgICAgICAgIHNlbGYuaW5pdGlhbF9mb2N1cy5mb2N1c19zZXQoKQorCisgICAgICAgICMgd2FpdCBmb3Igd2luZG93IHRvIGFwcGVhciBvbiBzY3JlZW4gYmVmb3JlIGNhbGxpbmcgZ3JhYl9zZXQKKyAgICAgICAgc2VsZi53YWl0X3Zpc2liaWxpdHkoKQorICAgICAgICBzZWxmLmdyYWJfc2V0KCkKKyAgICAgICAgc2VsZi53YWl0X3dpbmRvdyhzZWxmKQorCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICcnJ0Rlc3Ryb3kgdGhlIHdpbmRvdycnJworICAgICAgICBzZWxmLmluaXRpYWxfZm9jdXMgPSBOb25lCisgICAgICAgIFRvcGxldmVsLmRlc3Ryb3koc2VsZikKKworICAgICMKKyAgICAjIGNvbnN0cnVjdGlvbiBob29rcworCisgICAgZGVmIGJvZHkoc2VsZiwgbWFzdGVyKToKKyAgICAgICAgJycnY3JlYXRlIGRpYWxvZyBib2R5LgorCisgICAgICAgIHJldHVybiB3aWRnZXQgdGhhdCBzaG91bGQgaGF2ZSBpbml0aWFsIGZvY3VzLgorICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiwgYW5kIGlzIGNhbGxlZAorICAgICAgICBieSB0aGUgX19pbml0X18gbWV0aG9kLgorICAgICAgICAnJycKKyAgICAgICAgcGFzcworCisgICAgZGVmIGJ1dHRvbmJveChzZWxmKToKKyAgICAgICAgJycnYWRkIHN0YW5kYXJkIGJ1dHRvbiBib3guCisKKyAgICAgICAgb3ZlcnJpZGUgaWYgeW91IGRvIG5vdCB3YW50IHRoZSBzdGFuZGFyZCBidXR0b25zCisgICAgICAgICcnJworCisgICAgICAgIGJveCA9IEZyYW1lKHNlbGYpCisKKyAgICAgICAgdyA9IEJ1dHRvbihib3gsIHRleHQ9Ik9LIiwgd2lkdGg9MTAsIGNvbW1hbmQ9c2VsZi5vaywgZGVmYXVsdD1BQ1RJVkUpCisgICAgICAgIHcucGFjayhzaWRlPUxFRlQsIHBhZHg9NSwgcGFkeT01KQorICAgICAgICB3ID0gQnV0dG9uKGJveCwgdGV4dD0iQ2FuY2VsIiwgd2lkdGg9MTAsIGNvbW1hbmQ9c2VsZi5jYW5jZWwpCisgICAgICAgIHcucGFjayhzaWRlPUxFRlQsIHBhZHg9NSwgcGFkeT01KQorCisgICAgICAgIHNlbGYuYmluZCgiPFJldHVybj4iLCBzZWxmLm9rKQorICAgICAgICBzZWxmLmJpbmQoIjxFc2NhcGU+Iiwgc2VsZi5jYW5jZWwpCisKKyAgICAgICAgYm94LnBhY2soKQorCisgICAgIworICAgICMgc3RhbmRhcmQgYnV0dG9uIHNlbWFudGljcworCisgICAgZGVmIG9rKHNlbGYsIGV2ZW50PU5vbmUpOgorCisgICAgICAgIGlmIG5vdCBzZWxmLnZhbGlkYXRlKCk6CisgICAgICAgICAgICBzZWxmLmluaXRpYWxfZm9jdXMuZm9jdXNfc2V0KCkgIyBwdXQgZm9jdXMgYmFjaworICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi53aXRoZHJhdygpCisgICAgICAgIHNlbGYudXBkYXRlX2lkbGV0YXNrcygpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hcHBseSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNhbmNlbCgpCisKKyAgICBkZWYgY2FuY2VsKHNlbGYsIGV2ZW50PU5vbmUpOgorCisgICAgICAgICMgcHV0IGZvY3VzIGJhY2sgdG8gdGhlIHBhcmVudCB3aW5kb3cKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5mb2N1c19zZXQoKQorICAgICAgICBzZWxmLmRlc3Ryb3koKQorCisgICAgIworICAgICMgY29tbWFuZCBob29rcworCisgICAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgICAgICAnJyd2YWxpZGF0ZSB0aGUgZGF0YQorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHRvIHZhbGlkYXRlIHRoZSBkYXRhIGJlZm9yZSB0aGUKKyAgICAgICAgZGlhbG9nIGlzIGRlc3Ryb3llZC4gQnkgZGVmYXVsdCwgaXQgYWx3YXlzIHZhbGlkYXRlcyBPSy4KKyAgICAgICAgJycnCisKKyAgICAgICAgcmV0dXJuIDEgIyBvdmVycmlkZQorCisgICAgZGVmIGFwcGx5KHNlbGYpOgorICAgICAgICAnJydwcm9jZXNzIHRoZSBkYXRhCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgdG8gcHJvY2VzcyB0aGUgZGF0YSwgKmFmdGVyKgorICAgICAgICB0aGUgZGlhbG9nIGlzIGRlc3Ryb3llZC4gQnkgZGVmYXVsdCwgaXQgZG9lcyBub3RoaW5nLgorICAgICAgICAnJycKKworICAgICAgICBwYXNzICMgb3ZlcnJpZGUKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIGNvbnZlbmllbmNlIGRpYWxvZ3VlcworCitjbGFzcyBfUXVlcnlEaWFsb2coRGlhbG9nKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSwgcHJvbXB0LAorICAgICAgICAgICAgICAgICBpbml0aWFsdmFsdWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbWludmFsdWUgPSBOb25lLCBtYXh2YWx1ZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgIHBhcmVudCA9IE5vbmUpOgorCisgICAgICAgIGlmIG5vdCBwYXJlbnQ6CisgICAgICAgICAgICBpbXBvcnQgVGtpbnRlcgorICAgICAgICAgICAgcGFyZW50ID0gVGtpbnRlci5fZGVmYXVsdF9yb290CisKKyAgICAgICAgc2VsZi5wcm9tcHQgICA9IHByb21wdAorICAgICAgICBzZWxmLm1pbnZhbHVlID0gbWludmFsdWUKKyAgICAgICAgc2VsZi5tYXh2YWx1ZSA9IG1heHZhbHVlCisKKyAgICAgICAgc2VsZi5pbml0aWFsdmFsdWUgPSBpbml0aWFsdmFsdWUKKworICAgICAgICBEaWFsb2cuX19pbml0X18oc2VsZiwgcGFyZW50LCB0aXRsZSkKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICBzZWxmLmVudHJ5ID0gTm9uZQorICAgICAgICBEaWFsb2cuZGVzdHJveShzZWxmKQorCisgICAgZGVmIGJvZHkoc2VsZiwgbWFzdGVyKToKKworICAgICAgICB3ID0gTGFiZWwobWFzdGVyLCB0ZXh0PXNlbGYucHJvbXB0LCBqdXN0aWZ5PUxFRlQpCisgICAgICAgIHcuZ3JpZChyb3c9MCwgcGFkeD01LCBzdGlja3k9VykKKworICAgICAgICBzZWxmLmVudHJ5ID0gRW50cnkobWFzdGVyLCBuYW1lPSJlbnRyeSIpCisgICAgICAgIHNlbGYuZW50cnkuZ3JpZChyb3c9MSwgcGFkeD01LCBzdGlja3k9VytFKQorCisgICAgICAgIGlmIHNlbGYuaW5pdGlhbHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5lbnRyeS5pbnNlcnQoMCwgc2VsZi5pbml0aWFsdmFsdWUpCisgICAgICAgICAgICBzZWxmLmVudHJ5LnNlbGVjdF9yYW5nZSgwLCBFTkQpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuZW50cnkKKworICAgIGRlZiB2YWxpZGF0ZShzZWxmKToKKworICAgICAgICBpbXBvcnQgdGtNZXNzYWdlQm94CisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXRyZXN1bHQoKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHRrTWVzc2FnZUJveC5zaG93d2FybmluZygKKyAgICAgICAgICAgICAgICAiSWxsZWdhbCB2YWx1ZSIsCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcm1lc3NhZ2UgKyAiXG5QbGVhc2UgdHJ5IGFnYWluIiwKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmCisgICAgICAgICAgICApCisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGlmIHNlbGYubWludmFsdWUgaXMgbm90IE5vbmUgYW5kIHJlc3VsdCA8IHNlbGYubWludmFsdWU6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd3dhcm5pbmcoCisgICAgICAgICAgICAgICAgIlRvbyBzbWFsbCIsCisgICAgICAgICAgICAgICAgIlRoZSBhbGxvd2VkIG1pbmltdW0gdmFsdWUgaXMgJXMuICIKKyAgICAgICAgICAgICAgICAiUGxlYXNlIHRyeSBhZ2Fpbi4iICUgc2VsZi5taW52YWx1ZSwKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmCisgICAgICAgICAgICApCisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGlmIHNlbGYubWF4dmFsdWUgaXMgbm90IE5vbmUgYW5kIHJlc3VsdCA+IHNlbGYubWF4dmFsdWU6CisgICAgICAgICAgICB0a01lc3NhZ2VCb3guc2hvd3dhcm5pbmcoCisgICAgICAgICAgICAgICAgIlRvbyBsYXJnZSIsCisgICAgICAgICAgICAgICAgIlRoZSBhbGxvd2VkIG1heGltdW0gdmFsdWUgaXMgJXMuICIKKyAgICAgICAgICAgICAgICAiUGxlYXNlIHRyeSBhZ2Fpbi4iICUgc2VsZi5tYXh2YWx1ZSwKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmCisgICAgICAgICAgICApCisgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIHNlbGYucmVzdWx0ID0gcmVzdWx0CisKKyAgICAgICAgcmV0dXJuIDEKKworCitjbGFzcyBfUXVlcnlJbnRlZ2VyKF9RdWVyeURpYWxvZyk6CisgICAgZXJyb3JtZXNzYWdlID0gIk5vdCBhbiBpbnRlZ2VyLiIKKyAgICBkZWYgZ2V0cmVzdWx0KHNlbGYpOgorICAgICAgICByZXR1cm4gaW50KHNlbGYuZW50cnkuZ2V0KCkpCisKK2RlZiBhc2tpbnRlZ2VyKHRpdGxlLCBwcm9tcHQsICoqa3cpOgorICAgICcnJ2dldCBhbiBpbnRlZ2VyIGZyb20gdGhlIHVzZXIKKworICAgIEFyZ3VtZW50czoKKworICAgICAgICB0aXRsZSAtLSB0aGUgZGlhbG9nIHRpdGxlCisgICAgICAgIHByb21wdCAtLSB0aGUgbGFiZWwgdGV4dAorICAgICAgICAqKmt3IC0tIHNlZSBTaW1wbGVEaWFsb2cgY2xhc3MKKworICAgIFJldHVybiB2YWx1ZSBpcyBhbiBpbnRlZ2VyCisgICAgJycnCisgICAgZCA9IF9RdWVyeUludGVnZXIodGl0bGUsIHByb21wdCwgKiprdykKKyAgICByZXR1cm4gZC5yZXN1bHQKKworY2xhc3MgX1F1ZXJ5RmxvYXQoX1F1ZXJ5RGlhbG9nKToKKyAgICBlcnJvcm1lc3NhZ2UgPSAiTm90IGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuIgorICAgIGRlZiBnZXRyZXN1bHQoc2VsZik6CisgICAgICAgIHJldHVybiBmbG9hdChzZWxmLmVudHJ5LmdldCgpKQorCitkZWYgYXNrZmxvYXQodGl0bGUsIHByb21wdCwgKiprdyk6CisgICAgJycnZ2V0IGEgZmxvYXQgZnJvbSB0aGUgdXNlcgorCisgICAgQXJndW1lbnRzOgorCisgICAgICAgIHRpdGxlIC0tIHRoZSBkaWFsb2cgdGl0bGUKKyAgICAgICAgcHJvbXB0IC0tIHRoZSBsYWJlbCB0ZXh0CisgICAgICAgICoqa3cgLS0gc2VlIFNpbXBsZURpYWxvZyBjbGFzcworCisgICAgUmV0dXJuIHZhbHVlIGlzIGEgZmxvYXQKKyAgICAnJycKKyAgICBkID0gX1F1ZXJ5RmxvYXQodGl0bGUsIHByb21wdCwgKiprdykKKyAgICByZXR1cm4gZC5yZXN1bHQKKworY2xhc3MgX1F1ZXJ5U3RyaW5nKF9RdWVyeURpYWxvZyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgaWYgInNob3ciIGluIGt3OgorICAgICAgICAgICAgc2VsZi5fX3Nob3cgPSBrd1sic2hvdyJdCisgICAgICAgICAgICBkZWwga3dbInNob3ciXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX3Nob3cgPSBOb25lCisgICAgICAgIF9RdWVyeURpYWxvZy5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKworICAgIGRlZiBib2R5KHNlbGYsIG1hc3Rlcik6CisgICAgICAgIGVudHJ5ID0gX1F1ZXJ5RGlhbG9nLmJvZHkoc2VsZiwgbWFzdGVyKQorICAgICAgICBpZiBzZWxmLl9fc2hvdyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVudHJ5LmNvbmZpZ3VyZShzaG93PXNlbGYuX19zaG93KQorICAgICAgICByZXR1cm4gZW50cnkKKworICAgIGRlZiBnZXRyZXN1bHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVudHJ5LmdldCgpCisKK2RlZiBhc2tzdHJpbmcodGl0bGUsIHByb21wdCwgKiprdyk6CisgICAgJycnZ2V0IGEgc3RyaW5nIGZyb20gdGhlIHVzZXIKKworICAgIEFyZ3VtZW50czoKKworICAgICAgICB0aXRsZSAtLSB0aGUgZGlhbG9nIHRpdGxlCisgICAgICAgIHByb21wdCAtLSB0aGUgbGFiZWwgdGV4dAorICAgICAgICAqKmt3IC0tIHNlZSBTaW1wbGVEaWFsb2cgY2xhc3MKKworICAgIFJldHVybiB2YWx1ZSBpcyBhIHN0cmluZworICAgICcnJworICAgIGQgPSBfUXVlcnlTdHJpbmcodGl0bGUsIHByb21wdCwgKiprdykKKyAgICByZXR1cm4gZC5yZXN1bHQKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKworICAgIHJvb3QgPSBUaygpCisgICAgcm9vdC51cGRhdGUoKQorCisgICAgcHJpbnQgYXNraW50ZWdlcigiU3BhbSIsICJFZ2cgY291bnQiLCBpbml0aWFsdmFsdWU9MTIqMTIpCisgICAgcHJpbnQgYXNrZmxvYXQoIlNwYW0iLCAiRWdnIHdlaWdodFxuKGluIHRvbnMpIiwgbWludmFsdWU9MSwgbWF4dmFsdWU9MTAwKQorICAgIHByaW50IGFza3N0cmluZygiU3BhbSIsICJFZ2cgbGFiZWwiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGZlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a1NpbXBsZURpYWxvZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdGtTaW1wbGVEaWFsb2cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGZlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90a1NpbXBsZURpYWxvZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5IGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjczNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYi10ay90dGsucHkKQEAgLTAsMCArMSwxNjA5IEBACisiIiJUdGsgd3JhcHBlci4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgY2xhc3NlcyB0byBhbGxvdyB1c2luZyBUayB0aGVtZWQgd2lkZ2V0IHNldC4KKworVHRrIGlzIGJhc2VkIG9uIGEgcmV2aXNlZCBhbmQgZW5oYW5jZWQgdmVyc2lvbiBvZgorVElQICM0OCAoaHR0cDovL3RpcC50Y2wudGsvNDgpIHNwZWNpZmllZCBzdHlsZSBlbmdpbmUuCisKK0l0cyBiYXNpYyBpZGVhIGlzIHRvIHNlcGFyYXRlLCB0byB0aGUgZXh0ZW50IHBvc3NpYmxlLCB0aGUgY29kZQoraW1wbGVtZW50aW5nIGEgd2lkZ2V0J3MgYmVoYXZpb3IgZnJvbSB0aGUgY29kZSBpbXBsZW1lbnRpbmcgaXRzCithcHBlYXJhbmNlLiBXaWRnZXQgY2xhc3MgYmluZGluZ3MgYXJlIHByaW1hcmlseSByZXNwb25zaWJsZSBmb3IKK21haW50YWluaW5nIHRoZSB3aWRnZXQgc3RhdGUgYW5kIGludm9raW5nIGNhbGxiYWNrcywgYWxsIGFzcGVjdHMKK29mIHRoZSB3aWRnZXRzIGFwcGVhcmFuY2UgbGllcyBhdCBUaGVtZXMuCisiIiIKKworX192ZXJzaW9uX18gPSAiMC4zLjEiCisKK19fYXV0aG9yX18gPSAiR3VpbGhlcm1lIFBvbG8gPGdncG9sb0BnbWFpbC5jb20+IgorCitfX2FsbF9fID0gWyJCdXR0b24iLCAiQ2hlY2tidXR0b24iLCAiQ29tYm9ib3giLCAiRW50cnkiLCAiRnJhbWUiLCAiTGFiZWwiLAorICAgICAgICAgICAiTGFiZWxmcmFtZSIsICJMYWJlbEZyYW1lIiwgIk1lbnVidXR0b24iLCAiTm90ZWJvb2siLCAiUGFuZWR3aW5kb3ciLAorICAgICAgICAgICAiUGFuZWRXaW5kb3ciLCAiUHJvZ3Jlc3NiYXIiLCAiUmFkaW9idXR0b24iLCAiU2NhbGUiLCAiU2Nyb2xsYmFyIiwKKyAgICAgICAgICAgIlNlcGFyYXRvciIsICJTaXplZ3JpcCIsICJTdHlsZSIsICJUcmVldmlldyIsCisgICAgICAgICAgICMgRXh0ZW5zaW9ucworICAgICAgICAgICAiTGFiZWxlZFNjYWxlIiwgIk9wdGlvbk1lbnUiLAorICAgICAgICAgICAjIGZ1bmN0aW9ucworICAgICAgICAgICAidGNsb2Jqc190b19weSIsICJzZXR1cF9tYXN0ZXIiXQorCitpbXBvcnQgVGtpbnRlcgorZnJvbSBUa2ludGVyIGltcG9ydCBfZmxhdHRlbiwgX2pvaW4sIF9zdHJpbmdpZnkKKworIyBWZXJpZnkgaWYgVGsgaXMgbmV3IGVub3VnaCB0byBub3QgbmVlZCB0aGUgVGlsZSBwYWNrYWdlCitfUkVRVUlSRV9USUxFID0gVHJ1ZSBpZiBUa2ludGVyLlRrVmVyc2lvbiA8IDguNSBlbHNlIEZhbHNlCisKK2RlZiBfbG9hZF90aWxlKG1hc3Rlcik6CisgICAgaWYgX1JFUVVJUkVfVElMRToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIHRpbGVsaWIgPSBvcy5lbnZpcm9uLmdldCgnVElMRV9MSUJSQVJZJykKKyAgICAgICAgaWYgdGlsZWxpYjoKKyAgICAgICAgICAgICMgYXBwZW5kIGN1c3RvbSB0aWxlIHBhdGggdG8gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdAorICAgICAgICAgICAgIyBUY2wgdXNlcyB3aGVuIGF0dGVtcHRpbmcgdG8gcmVzb2x2ZSBwYWNrYWdlcyB3aXRoIHRoZSBwYWNrYWdlCisgICAgICAgICAgICAjIGNvbW1hbmQKKyAgICAgICAgICAgIG1hc3Rlci50ay5ldmFsKAorICAgICAgICAgICAgICAgICAgICAnZ2xvYmFsIGF1dG9fcGF0aDsgJworICAgICAgICAgICAgICAgICAgICAnbGFwcGVuZCBhdXRvX3BhdGggeyVzfScgJSB0aWxlbGliKQorCisgICAgICAgIG1hc3Rlci50ay5ldmFsKCdwYWNrYWdlIHJlcXVpcmUgdGlsZScpICMgVGNsRXJyb3IgbWF5IGJlIHJhaXNlZCBoZXJlCisgICAgICAgIG1hc3Rlci5fdGlsZV9sb2FkZWQgPSBUcnVlCisKK2RlZiBfZm9ybWF0X29wdHZhbHVlKHZhbHVlLCBzY3JpcHQ9RmFsc2UpOgorICAgICIiIkludGVybmFsIGZ1bmN0aW9uLiIiIgorICAgIGlmIHNjcmlwdDoKKyAgICAgICAgIyBpZiBjYWxsZXIgcGFzc2VzIGEgVGNsIHNjcmlwdCB0byB0ay5jYWxsLCBhbGwgdGhlIHZhbHVlcyBuZWVkIHRvCisgICAgICAgICMgYmUgZ3JvdXBlZCBpbnRvIHdvcmRzIChhcmd1bWVudHMgdG8gYSBjb21tYW5kIGluIFRjbCBkaWFsZWN0KQorICAgICAgICB2YWx1ZSA9IF9zdHJpbmdpZnkodmFsdWUpCisgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgdmFsdWUgPSBfam9pbih2YWx1ZSkKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIF9mb3JtYXRfb3B0ZGljdChvcHRkaWN0LCBzY3JpcHQ9RmFsc2UsIGlnbm9yZT1Ob25lKToKKyAgICAiIiJGb3JtYXRzIG9wdGRpY3QgdG8gYSB0dXBsZSB0byBwYXNzIGl0IHRvIHRrLmNhbGwuCisKKyAgICBFLmcuIChzY3JpcHQ9RmFsc2UpOgorICAgICAgeydmb3JlZ3JvdW5kJzogJ2JsdWUnLCAncGFkZGluZyc6IFsxLCAyLCAzLCA0XX0gcmV0dXJuczoKKyAgICAgICgnLWZvcmVncm91bmQnLCAnYmx1ZScsICctcGFkZGluZycsICcxIDIgMyA0JykiIiIKKworICAgIG9wdHMgPSBbXQorICAgIGZvciBvcHQsIHZhbHVlIGluIG9wdGRpY3QuaXRlcml0ZW1zKCk6CisgICAgICAgIGlmIG5vdCBpZ25vcmUgb3Igb3B0IG5vdCBpbiBpZ25vcmU6CisgICAgICAgICAgICBvcHRzLmFwcGVuZCgiLSVzIiAlIG9wdCkKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG9wdHMuYXBwZW5kKF9mb3JtYXRfb3B0dmFsdWUodmFsdWUsIHNjcmlwdCkpCisKKyAgICByZXR1cm4gX2ZsYXR0ZW4ob3B0cykKKworZGVmIF9tYXBkaWN0X3ZhbHVlcyhpdGVtcyk6CisgICAgIyBlYWNoIHZhbHVlIGluIG1hcGRpY3QgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzZXF1ZW5jZSwgd2hlcmUgZWFjaCBpdGVtCisgICAgIyBpcyBhbm90aGVyIHNlcXVlbmNlIGNvbnRhaW5pbmcgYSBzdGF0ZSAob3Igc2V2ZXJhbCkgYW5kIGEgdmFsdWUKKyAgICAjIEUuZy4gKHNjcmlwdD1GYWxzZSk6CisgICAgIyAgIFsoJ2FjdGl2ZScsICdzZWxlY3RlZCcsICdncmV5JyksICgnZm9jdXMnLCBbMSwgMiwgMywgNF0pXQorICAgICMgICByZXR1cm5zOgorICAgICMgICBbJ2FjdGl2ZSBzZWxlY3RlZCcsICdncmV5JywgJ2ZvY3VzJywgWzEsIDIsIDMsIDRdXQorICAgIG9wdF92YWwgPSBbXQorICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICBzdGF0ZSA9IGl0ZW1bOi0xXQorICAgICAgICB2YWwgPSBpdGVtWy0xXQorICAgICAgICAjIGhhY2tzIGZvciBiYWt3YXJkIGNvbXBhdGliaWxpdHkKKyAgICAgICAgc3RhdGVbMF0gIyByYWlzZSBJbmRleEVycm9yIGlmIGVtcHR5CisgICAgICAgIGlmIGxlbihzdGF0ZSkgPT0gMToKKyAgICAgICAgICAgICMgaWYgaXQgaXMgZW1wdHkgKHNvbWV0aGluZyB0aGF0IGV2YWx1YXRlcyB0byBGYWxzZSksIHRoZW4KKyAgICAgICAgICAgICMgZm9ybWF0IGl0IHRvIFRjbCBjb2RlIHRvIGRlbm90ZSB0aGUgIm5vcm1hbCIgc3RhdGUKKyAgICAgICAgICAgIHN0YXRlID0gc3RhdGVbMF0gb3IgJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZ3JvdXAgbXVsdGlwbGUgc3RhdGVzCisgICAgICAgICAgICBzdGF0ZSA9ICcgJy5qb2luKHN0YXRlKSAjIHJhaXNlIFR5cGVFcnJvciBpZiBub3Qgc3RyCisgICAgICAgIG9wdF92YWwuYXBwZW5kKHN0YXRlKQorICAgICAgICBpZiB2YWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvcHRfdmFsLmFwcGVuZCh2YWwpCisgICAgcmV0dXJuIG9wdF92YWwKKworZGVmIF9mb3JtYXRfbWFwZGljdChtYXBkaWN0LCBzY3JpcHQ9RmFsc2UpOgorICAgICIiIkZvcm1hdHMgbWFwZGljdCB0byBwYXNzIGl0IHRvIHRrLmNhbGwuCisKKyAgICBFLmcuIChzY3JpcHQ9RmFsc2UpOgorICAgICAgeydleHBhbmQnOiBbKCdhY3RpdmUnLCAnc2VsZWN0ZWQnLCAnZ3JleScpLCAoJ2ZvY3VzJywgWzEsIDIsIDMsIDRdKV19CisKKyAgICAgIHJldHVybnM6CisKKyAgICAgICgnLWV4cGFuZCcsICd7YWN0aXZlIHNlbGVjdGVkfSBncmV5IGZvY3VzIHsxLCAyLCAzLCA0fScpIiIiCisKKyAgICBvcHRzID0gW10KKyAgICBmb3Igb3B0LCB2YWx1ZSBpbiBtYXBkaWN0Lml0ZXJpdGVtcygpOgorICAgICAgICBvcHRzLmV4dGVuZCgoIi0lcyIgJSBvcHQsCisgICAgICAgICAgICAgICAgICAgICBfZm9ybWF0X29wdHZhbHVlKF9tYXBkaWN0X3ZhbHVlcyh2YWx1ZSksIHNjcmlwdCkpKQorCisgICAgcmV0dXJuIF9mbGF0dGVuKG9wdHMpCisKK2RlZiBfZm9ybWF0X2VsZW1jcmVhdGUoZXR5cGUsIHNjcmlwdD1GYWxzZSwgKmFyZ3MsICoqa3cpOgorICAgICIiIkZvcm1hdHMgYXJncyBhbmQga3cgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBlbGVtZW50IGZhY3RvcnkgZXR5cGUuIiIiCisgICAgc3BlYyA9IE5vbmUKKyAgICBvcHRzID0gKCkKKyAgICBpZiBldHlwZSBpbiAoImltYWdlIiwgInZzYXBpIik6CisgICAgICAgIGlmIGV0eXBlID09ICJpbWFnZSI6ICMgZGVmaW5lIGFuIGVsZW1lbnQgYmFzZWQgb24gYW4gaW1hZ2UKKyAgICAgICAgICAgICMgZmlyc3QgYXJnIHNob3VsZCBiZSB0aGUgZGVmYXVsdCBpbWFnZSBuYW1lCisgICAgICAgICAgICBpbmFtZSA9IGFyZ3NbMF0KKyAgICAgICAgICAgICMgbmV4dCBhcmdzLCBpZiBhbnksIGFyZSBzdGF0ZXNwZWMvdmFsdWUgcGFpcnMgd2hpY2ggaXMgYWxtb3N0CisgICAgICAgICAgICAjIGEgbWFwZGljdCwgYnV0IHdlIGp1c3QgbmVlZCB0aGUgdmFsdWUKKyAgICAgICAgICAgIGltYWdlc3BlYyA9IF9qb2luKF9tYXBkaWN0X3ZhbHVlcyhhcmdzWzE6XSkpCisgICAgICAgICAgICBzcGVjID0gIiVzICVzIiAlIChpbmFtZSwgaW1hZ2VzcGVjKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGRlZmluZSBhbiBlbGVtZW50IHdob3NlIHZpc3VhbCBhcHBlYXJhbmNlIGlzIGRyYXduIHVzaW5nIHRoZQorICAgICAgICAgICAgIyBNaWNyb3NvZnQgVmlzdWFsIFN0eWxlcyBBUEkgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yIHRoZQorICAgICAgICAgICAgIyB0aGVtZWQgc3R5bGVzIG9uIFdpbmRvd3MgWFAgYW5kIFZpc3RhLgorICAgICAgICAgICAgIyBBdmFpbGFiaWxpdHk6IFRrIDguNiwgV2luZG93cyBYUCBhbmQgVmlzdGEuCisgICAgICAgICAgICBjbGFzc19uYW1lLCBwYXJ0X2lkID0gYXJnc1s6Ml0KKyAgICAgICAgICAgIHN0YXRlbWFwID0gX2pvaW4oX21hcGRpY3RfdmFsdWVzKGFyZ3NbMjpdKSkKKyAgICAgICAgICAgIHNwZWMgPSAiJXMgJXMgJXMiICUgKGNsYXNzX25hbWUsIHBhcnRfaWQsIHN0YXRlbWFwKQorCisgICAgICAgIG9wdHMgPSBfZm9ybWF0X29wdGRpY3Qoa3csIHNjcmlwdCkKKworICAgIGVsaWYgZXR5cGUgPT0gImZyb20iOiAjIGNsb25lIGFuIGVsZW1lbnQKKyAgICAgICAgIyBpdCBleHBlY3RzIGEgdGhlbWVuYW1lIGFuZCBvcHRpb25hbGx5IGFuIGVsZW1lbnQgdG8gY2xvbmUgZnJvbSwKKyAgICAgICAgIyBvdGhlcndpc2UgaXQgd2lsbCBjbG9uZSB7fSAoZW1wdHkgZWxlbWVudCkKKyAgICAgICAgc3BlYyA9IGFyZ3NbMF0gIyB0aGVtZSBuYW1lCisgICAgICAgIGlmIGxlbihhcmdzKSA+IDE6ICMgZWxlbWVudGZyb20gc3BlY2lmaWVkCisgICAgICAgICAgICBvcHRzID0gKF9mb3JtYXRfb3B0dmFsdWUoYXJnc1sxXSwgc2NyaXB0KSwpCisKKyAgICBpZiBzY3JpcHQ6CisgICAgICAgIHNwZWMgPSAneyVzfScgJSBzcGVjCisgICAgICAgIG9wdHMgPSAnICcuam9pbihvcHRzKQorCisgICAgcmV0dXJuIHNwZWMsIG9wdHMKKworZGVmIF9mb3JtYXRfbGF5b3V0bGlzdChsYXlvdXQsIGluZGVudD0wLCBpbmRlbnRfc2l6ZT0yKToKKyAgICAiIiJGb3JtYXRzIGEgbGF5b3V0IGxpc3Qgc28gd2UgY2FuIHBhc3MgdGhlIHJlc3VsdCB0byB0dGs6OnN0eWxlCisgICAgbGF5b3V0IGFuZCB0dGs6OnN0eWxlIHNldHRpbmdzLiBOb3RlIHRoYXQgdGhlIGxheW91dCBkb2Vzbid0IGhhcyB0bworICAgIGJlIGEgbGlzdCBuZWNlc3NhcmlseS4KKworICAgIEUuZy46CisgICAgICBbKCJNZW51YnV0dG9uLmJhY2tncm91bmQiLCBOb25lKSwKKyAgICAgICAoIk1lbnVidXR0b24uYnV0dG9uIiwgeyJjaGlsZHJlbiI6CisgICAgICAgICAgIFsoIk1lbnVidXR0b24uZm9jdXMiLCB7ImNoaWxkcmVuIjoKKyAgICAgICAgICAgICAgIFsoIk1lbnVidXR0b24ucGFkZGluZyIsIHsiY2hpbGRyZW4iOgorICAgICAgICAgICAgICAgIFsoIk1lbnVidXR0b24ubGFiZWwiLCB7InNpZGUiOiAibGVmdCIsICJleHBhbmQiOiAxfSldCisgICAgICAgICAgICAgICB9KV0KKyAgICAgICAgICAgfSldCisgICAgICAgfSksCisgICAgICAgKCJNZW51YnV0dG9uLmluZGljYXRvciIsIHsic2lkZSI6ICJyaWdodCJ9KQorICAgICAgXQorCisgICAgICByZXR1cm5zOgorCisgICAgICBNZW51YnV0dG9uLmJhY2tncm91bmQKKyAgICAgIE1lbnVidXR0b24uYnV0dG9uIC1jaGlsZHJlbiB7CisgICAgICAgIE1lbnVidXR0b24uZm9jdXMgLWNoaWxkcmVuIHsKKyAgICAgICAgICBNZW51YnV0dG9uLnBhZGRpbmcgLWNoaWxkcmVuIHsKKyAgICAgICAgICAgIE1lbnVidXR0b24ubGFiZWwgLXNpZGUgbGVmdCAtZXhwYW5kIDEKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIE1lbnVidXR0b24uaW5kaWNhdG9yIC1zaWRlIHJpZ2h0IiIiCisgICAgc2NyaXB0ID0gW10KKworICAgIGZvciBsYXlvdXRfZWxlbSBpbiBsYXlvdXQ6CisgICAgICAgIGVsZW0sIG9wdHMgPSBsYXlvdXRfZWxlbQorICAgICAgICBvcHRzID0gb3B0cyBvciB7fQorICAgICAgICBmb3B0cyA9ICcgJy5qb2luKF9mb3JtYXRfb3B0ZGljdChvcHRzLCBUcnVlLCAoImNoaWxkcmVuIiwpKSkKKyAgICAgICAgaGVhZCA9ICIlcyVzJXMiICUgKCcgJyAqIGluZGVudCwgZWxlbSwgKCIgJXMiICUgZm9wdHMpIGlmIGZvcHRzIGVsc2UgJycpCisKKyAgICAgICAgaWYgImNoaWxkcmVuIiBpbiBvcHRzOgorICAgICAgICAgICAgc2NyaXB0LmFwcGVuZChoZWFkICsgIiAtY2hpbGRyZW4geyIpCisgICAgICAgICAgICBpbmRlbnQgKz0gaW5kZW50X3NpemUKKyAgICAgICAgICAgIG5ld3NjcmlwdCwgaW5kZW50ID0gX2Zvcm1hdF9sYXlvdXRsaXN0KG9wdHNbJ2NoaWxkcmVuJ10sIGluZGVudCwKKyAgICAgICAgICAgICAgICBpbmRlbnRfc2l6ZSkKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQobmV3c2NyaXB0KQorICAgICAgICAgICAgaW5kZW50IC09IGluZGVudF9zaXplCisgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKCclc30nICUgKCcgJyAqIGluZGVudCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzY3JpcHQuYXBwZW5kKGhlYWQpCisKKyAgICByZXR1cm4gJ1xuJy5qb2luKHNjcmlwdCksIGluZGVudAorCitkZWYgX3NjcmlwdF9mcm9tX3NldHRpbmdzKHNldHRpbmdzKToKKyAgICAiIiJSZXR1cm5zIGFuIGFwcHJvcHJpYXRlIHNjcmlwdCwgYmFzZWQgb24gc2V0dGluZ3MsIGFjY29yZGluZyB0bworICAgIHRoZW1lX3NldHRpbmdzIGRlZmluaXRpb24gdG8gYmUgdXNlZCBieSB0aGVtZV9zZXR0aW5ncyBhbmQKKyAgICB0aGVtZV9jcmVhdGUuIiIiCisgICAgc2NyaXB0ID0gW10KKyAgICAjIGEgc2NyaXB0IHdpbGwgYmUgZ2VuZXJhdGVkIGFjY29yZGluZyB0byBzZXR0aW5ncyBwYXNzZWQsIHdoaWNoCisgICAgIyB3aWxsIHRoZW4gYmUgZXZhbHVhdGVkIGJ5IFRjbAorICAgIGZvciBuYW1lLCBvcHRzIGluIHNldHRpbmdzLml0ZXJpdGVtcygpOgorICAgICAgICAjIHdpbGwgZm9ybWF0IHNwZWNpZmljIGtleXMgYWNjb3JkaW5nIHRvIFRjbCBjb2RlCisgICAgICAgIGlmIG9wdHMuZ2V0KCdjb25maWd1cmUnKTogIyBmb3JtYXQgJ2NvbmZpZ3VyZScKKyAgICAgICAgICAgIHMgPSAnICcuam9pbihfZm9ybWF0X29wdGRpY3Qob3B0c1snY29uZmlndXJlJ10sIFRydWUpKQorICAgICAgICAgICAgc2NyaXB0LmFwcGVuZCgidHRrOjpzdHlsZSBjb25maWd1cmUgJXMgJXM7IiAlIChuYW1lLCBzKSkKKworICAgICAgICBpZiBvcHRzLmdldCgnbWFwJyk6ICMgZm9ybWF0ICdtYXAnCisgICAgICAgICAgICBzID0gJyAnLmpvaW4oX2Zvcm1hdF9tYXBkaWN0KG9wdHNbJ21hcCddLCBUcnVlKSkKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoInR0azo6c3R5bGUgbWFwICVzICVzOyIgJSAobmFtZSwgcykpCisKKyAgICAgICAgaWYgJ2xheW91dCcgaW4gb3B0czogIyBmb3JtYXQgJ2xheW91dCcgd2hpY2ggbWF5IGJlIGVtcHR5CisgICAgICAgICAgICBpZiBub3Qgb3B0c1snbGF5b3V0J106CisgICAgICAgICAgICAgICAgcyA9ICdudWxsJyAjIGNvdWxkIGJlIGFueSBvdGhlciB3b3JkLCBidXQgdGhpcyBvbmUgbWFrZXMgc2Vuc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcywgXyA9IF9mb3JtYXRfbGF5b3V0bGlzdChvcHRzWydsYXlvdXQnXSkKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoInR0azo6c3R5bGUgbGF5b3V0ICVzIHtcbiVzXG59IiAlIChuYW1lLCBzKSkKKworICAgICAgICBpZiBvcHRzLmdldCgnZWxlbWVudCBjcmVhdGUnKTogIyBmb3JtYXQgJ2VsZW1lbnQgY3JlYXRlJworICAgICAgICAgICAgZW9wdHMgPSBvcHRzWydlbGVtZW50IGNyZWF0ZSddCisgICAgICAgICAgICBldHlwZSA9IGVvcHRzWzBdCisKKyAgICAgICAgICAgICMgZmluZCB3aGVyZSBhcmdzIGVuZCwgYW5kIHdoZXJlIGt3YXJncyBzdGFydAorICAgICAgICAgICAgYXJnYyA9IDEgIyBldHlwZSB3YXMgdGhlIGZpcnN0IG9uZQorICAgICAgICAgICAgd2hpbGUgYXJnYyA8IGxlbihlb3B0cykgYW5kIG5vdCBoYXNhdHRyKGVvcHRzW2FyZ2NdLCAnaXRlcml0ZW1zJyk6CisgICAgICAgICAgICAgICAgYXJnYyArPSAxCisKKyAgICAgICAgICAgIGVsZW1hcmdzID0gZW9wdHNbMTphcmdjXQorICAgICAgICAgICAgZWxlbWt3ID0gZW9wdHNbYXJnY10gaWYgYXJnYyA8IGxlbihlb3B0cykgYW5kIGVvcHRzW2FyZ2NdIGVsc2Uge30KKyAgICAgICAgICAgIHNwZWMsIG9wdHMgPSBfZm9ybWF0X2VsZW1jcmVhdGUoZXR5cGUsIFRydWUsICplbGVtYXJncywgKiplbGVta3cpCisKKyAgICAgICAgICAgIHNjcmlwdC5hcHBlbmQoInR0azo6c3R5bGUgZWxlbWVudCBjcmVhdGUgJXMgJXMgJXMgJXMiICUgKAorICAgICAgICAgICAgICAgIG5hbWUsIGV0eXBlLCBzcGVjLCBvcHRzKSkKKworICAgIHJldHVybiAnXG4nLmpvaW4oc2NyaXB0KQorCitkZWYgX2RpY3RfZnJvbV90Y2x0dXBsZSh0dHVwbGUsIGN1dF9taW51cz1UcnVlKToKKyAgICAiIiJCcmVhayB0dXBsZSBpbiBwYWlycywgZm9ybWF0IGl0IHByb3Blcmx5LCB0aGVuIGJ1aWxkIHRoZSByZXR1cm4KKyAgICBkaWN0LiBJZiBjdXRfbWludXMgaXMgVHJ1ZSwgdGhlIHN1cHBvc2VkICctJyBwcmVmaXhpbmcgb3B0aW9ucyB3aWxsCisgICAgYmUgcmVtb3ZlZC4KKworICAgIHR0dXBsZSBpcyBleHBlY3RlZCB0byBjb250YWluIGFuIGV2ZW4gbnVtYmVyIG9mIGVsZW1lbnRzLiIiIgorICAgIG9wdF9zdGFydCA9IDEgaWYgY3V0X21pbnVzIGVsc2UgMAorCisgICAgcmV0ZGljdCA9IHt9CisgICAgaXQgPSBpdGVyKHR0dXBsZSkKKyAgICBmb3Igb3B0LCB2YWwgaW4gemlwKGl0LCBpdCk6CisgICAgICAgIHJldGRpY3Rbc3RyKG9wdClbb3B0X3N0YXJ0Ol1dID0gdmFsCisKKyAgICByZXR1cm4gdGNsb2Jqc190b19weShyZXRkaWN0KQorCitkZWYgX2xpc3RfZnJvbV9zdGF0ZXNwZWMoc3R1cGxlKToKKyAgICAiIiJDb25zdHJ1Y3QgYSBsaXN0IGZyb20gdGhlIGdpdmVuIHN0YXRlc3BlYyB0dXBsZSBhY2NvcmRpbmcgdG8gdGhlCisgICAgYWNjZXB0ZWQgc3RhdGVzcGVjIGFjY2VwdGVkIGJ5IF9mb3JtYXRfbWFwZGljdC4iIiIKKyAgICBudmFsID0gW10KKyAgICBmb3IgdmFsIGluIHN0dXBsZToKKyAgICAgICAgdHlwZW5hbWUgPSBnZXRhdHRyKHZhbCwgJ3R5cGVuYW1lJywgTm9uZSkKKyAgICAgICAgaWYgdHlwZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIG52YWwuYXBwZW5kKHZhbCkKKyAgICAgICAgZWxzZTogIyB0aGlzIGlzIGEgVGNsIG9iamVjdAorICAgICAgICAgICAgdmFsID0gc3RyKHZhbCkKKyAgICAgICAgICAgIGlmIHR5cGVuYW1lID09ICdTdGF0ZVNwZWMnOgorICAgICAgICAgICAgICAgIHZhbCA9IHZhbC5zcGxpdCgpCisgICAgICAgICAgICBudmFsLmFwcGVuZCh2YWwpCisKKyAgICBpdCA9IGl0ZXIobnZhbCkKKyAgICByZXR1cm4gW19mbGF0dGVuKHNwZWMpIGZvciBzcGVjIGluIHppcChpdCwgaXQpXQorCitkZWYgX2xpc3RfZnJvbV9sYXlvdXR0dXBsZShsdHVwbGUpOgorICAgICIiIkNvbnN0cnVjdCBhIGxpc3QgZnJvbSB0aGUgdHVwbGUgcmV0dXJuZWQgYnkgdHRrOjpsYXlvdXQsIHRoaXMgaXMKKyAgICBzb21ld2hhdCB0aGUgcmV2ZXJzZSBvZiBfZm9ybWF0X2xheW91dGxpc3QuIiIiCisgICAgcmVzID0gW10KKworICAgIGluZHggPSAwCisgICAgd2hpbGUgaW5keCA8IGxlbihsdHVwbGUpOgorICAgICAgICBuYW1lID0gbHR1cGxlW2luZHhdCisgICAgICAgIG9wdHMgPSB7fQorICAgICAgICByZXMuYXBwZW5kKChuYW1lLCBvcHRzKSkKKyAgICAgICAgaW5keCArPSAxCisKKyAgICAgICAgd2hpbGUgaW5keCA8IGxlbihsdHVwbGUpOiAjIGdyYWIgbmFtZSdzIG9wdGlvbnMKKyAgICAgICAgICAgIG9wdCwgdmFsID0gbHR1cGxlW2luZHg6aW5keCArIDJdCisgICAgICAgICAgICBpZiBub3Qgb3B0LnN0YXJ0c3dpdGgoJy0nKTogIyBmb3VuZCBuZXh0IG5hbWUKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBvcHQgPSBvcHRbMTpdICMgcmVtb3ZlIHRoZSAnLScgZnJvbSB0aGUgb3B0aW9uCisgICAgICAgICAgICBpbmR4ICs9IDIKKworICAgICAgICAgICAgaWYgb3B0ID09ICdjaGlsZHJlbic6CisgICAgICAgICAgICAgICAgdmFsID0gX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSh2YWwpCisKKyAgICAgICAgICAgIG9wdHNbb3B0XSA9IHZhbAorCisgICAgcmV0dXJuIHJlcworCitkZWYgX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMsICphcmdzKToKKyAgICAiIiJGb3JtYXQgb3B0aW9ucyB0aGVuIGNhbGwgZnVuYyB3aXRoIGFyZ3MgYW5kIG9wdGlvbnMgYW5kIHJldHVybgorICAgIHRoZSBhcHByb3ByaWF0ZSByZXN1bHQuCisKKyAgICBJZiBubyBvcHRpb24gaXMgc3BlY2lmaWVkLCBhIGRpY3QgaXMgcmV0dXJuZWQuIElmIGEgb3B0aW9uIGlzCisgICAgc3BlY2lmaWVkIHdpdGggdGhlIE5vbmUgdmFsdWUsIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24gaXMgcmV0dXJuZWQuCisgICAgT3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24ganVzdCBzZXRzIHRoZSBwYXNzZWQgb3B0aW9ucyBhbmQgdGhlIGNhbGxlcgorICAgIHNob3VsZG4ndCBiZSBleHBlY3RpbmcgYSByZXR1cm4gdmFsdWUgYW55d2F5LiIiIgorICAgIG9wdGlvbnMgPSBfZm9ybWF0X29wdGRpY3Qob3B0aW9ucykKKyAgICByZXMgPSBmdW5jKCooYXJncyArIG9wdGlvbnMpKQorCisgICAgaWYgbGVuKG9wdGlvbnMpICUgMjogIyBvcHRpb24gc3BlY2lmaWVkIHdpdGhvdXQgYSB2YWx1ZSwgcmV0dXJuIGl0cyB2YWx1ZQorICAgICAgICByZXR1cm4gcmVzCisKKyAgICByZXR1cm4gX2RpY3RfZnJvbV90Y2x0dXBsZShyZXMpCisKK2RlZiBfY29udmVydF9zdHJpbmd2YWwodmFsdWUpOgorICAgICIiIkNvbnZlcnRzIGEgdmFsdWUgdG8sIGhvcGVmdWxseSwgYSBtb3JlIGFwcHJvcHJpYXRlIFB5dGhvbiBvYmplY3QuIiIiCisgICAgdmFsdWUgPSB1bmljb2RlKHZhbHVlKQorICAgIHRyeToKKyAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUpCisgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gdmFsdWUKKworZGVmIHRjbG9ianNfdG9fcHkoYWRpY3QpOgorICAgICIiIlJldHVybnMgYWRpY3Qgd2l0aCBpdHMgdmFsdWVzIGNvbnZlcnRlZCBmcm9tIFRjbCBvYmplY3RzIHRvIFB5dGhvbgorICAgIG9iamVjdHMuIiIiCisgICAgZm9yIG9wdCwgdmFsIGluIGFkaWN0Lml0ZXJpdGVtcygpOgorICAgICAgICBpZiB2YWwgYW5kIGhhc2F0dHIodmFsLCAnX19sZW5fXycpIGFuZCBub3QgaXNpbnN0YW5jZSh2YWwsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgaWYgZ2V0YXR0cih2YWxbMF0sICd0eXBlbmFtZScsIE5vbmUpID09ICdTdGF0ZVNwZWMnOgorICAgICAgICAgICAgICAgIHZhbCA9IF9saXN0X2Zyb21fc3RhdGVzcGVjKHZhbCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsID0gbWFwKF9jb252ZXJ0X3N0cmluZ3ZhbCwgdmFsKQorCisgICAgICAgIGVsaWYgaGFzYXR0cih2YWwsICd0eXBlbmFtZScpOiAjIHNvbWUgb3RoZXIgKHNpbmdsZSkgVGNsIG9iamVjdAorICAgICAgICAgICAgdmFsID0gX2NvbnZlcnRfc3RyaW5ndmFsKHZhbCkKKworICAgICAgICBhZGljdFtvcHRdID0gdmFsCisKKyAgICByZXR1cm4gYWRpY3QKKworZGVmIHNldHVwX21hc3RlcihtYXN0ZXI9Tm9uZSk6CisgICAgIiIiSWYgbWFzdGVyIGlzIG5vdCBOb25lLCBpdHNlbGYgaXMgcmV0dXJuZWQuIElmIG1hc3RlciBpcyBOb25lLAorICAgIHRoZSBkZWZhdWx0IG1hc3RlciBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSBhIG5ldworICAgIG1hc3RlciBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4KKworICAgIElmIGl0IGlzIG5vdCBhbGxvd2VkIHRvIHVzZSB0aGUgZGVmYXVsdCByb290IGFuZCBtYXN0ZXIgaXMgTm9uZSwKKyAgICBSdW50aW1lRXJyb3IgaXMgcmFpc2VkLiIiIgorICAgIGlmIG1hc3RlciBpcyBOb25lOgorICAgICAgICBpZiBUa2ludGVyLl9zdXBwb3J0X2RlZmF1bHRfcm9vdDoKKyAgICAgICAgICAgIG1hc3RlciA9IFRraW50ZXIuX2RlZmF1bHRfcm9vdCBvciBUa2ludGVyLlRrKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIk5vIG1hc3RlciBzcGVjaWZpZWQgYW5kIFRraW50ZXIgaXMgIgorICAgICAgICAgICAgICAgICAgICAiY29uZmlndXJlZCB0byBub3Qgc3VwcG9ydCBkZWZhdWx0IHJvb3QiKQorICAgIHJldHVybiBtYXN0ZXIKKworCitjbGFzcyBTdHlsZShvYmplY3QpOgorICAgICIiIk1hbmlwdWxhdGUgc3R5bGUgZGF0YWJhc2UuIiIiCisKKyAgICBfbmFtZSA9ICJ0dGs6OnN0eWxlIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKKyAgICAgICAgbWFzdGVyID0gc2V0dXBfbWFzdGVyKG1hc3RlcikKKworICAgICAgICBpZiBub3QgZ2V0YXR0cihtYXN0ZXIsICdfdGlsZV9sb2FkZWQnLCBGYWxzZSk6CisgICAgICAgICAgICAjIExvYWQgdGlsZSBub3csIGlmIG5lZWRlZAorICAgICAgICAgICAgX2xvYWRfdGlsZShtYXN0ZXIpCisKKyAgICAgICAgc2VsZi5tYXN0ZXIgPSBtYXN0ZXIKKyAgICAgICAgc2VsZi50ayA9IHNlbGYubWFzdGVyLnRrCisKKworICAgIGRlZiBjb25maWd1cmUoc2VsZiwgc3R5bGUsIHF1ZXJ5X29wdD1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3Igc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIG9wdGlvbihzKSBpbgorICAgICAgICBzdHlsZS4KKworICAgICAgICBFYWNoIGtleSBpbiBrdyBpcyBhbiBvcHRpb24gYW5kIGVhY2ggdmFsdWUgaXMgZWl0aGVyIGEgc3RyaW5nIG9yCisgICAgICAgIGEgc2VxdWVuY2UgaWRlbnRpZnlpbmcgdGhlIHZhbHVlIGZvciB0aGF0IG9wdGlvbi4iIiIKKyAgICAgICAgaWYgcXVlcnlfb3B0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAga3dbcXVlcnlfb3B0XSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl9uYW1lLCAiY29uZmlndXJlIiwgc3R5bGUpCisKKworICAgIGRlZiBtYXAoc2VsZiwgc3R5bGUsIHF1ZXJ5X29wdD1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3Igc2V0cyBkeW5hbWljIHZhbHVlcyBvZiB0aGUgc3BlY2lmaWVkIG9wdGlvbihzKSBpbgorICAgICAgICBzdHlsZS4KKworICAgICAgICBFYWNoIGtleSBpbiBrdyBpcyBhbiBvcHRpb24gYW5kIGVhY2ggdmFsdWUgc2hvdWxkIGJlIGEgbGlzdCBvciBhCisgICAgICAgIHR1cGxlICh1c3VhbGx5KSBjb250YWluaW5nIHN0YXRlc3BlY3MgZ3JvdXBlZCBpbiB0dXBsZXMsIG9yIGxpc3QsCisgICAgICAgIG9yIHNvbWV0aGluZyBlbHNlIG9mIHlvdXIgcHJlZmVyZW5jZS4gQSBzdGF0ZXNwZWMgaXMgY29tcG91bmQgb2YKKyAgICAgICAgb25lIG9yIG1vcmUgc3RhdGVzIGFuZCB0aGVuIGEgdmFsdWUuIiIiCisgICAgICAgIGlmIHF1ZXJ5X29wdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfbGlzdF9mcm9tX3N0YXRlc3BlYygKKyAgICAgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgIm1hcCIsIHN0eWxlLCAnLSVzJyAlIHF1ZXJ5X29wdCkpCisKKyAgICAgICAgcmV0dXJuIF9kaWN0X2Zyb21fdGNsdHVwbGUoCisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgIm1hcCIsIHN0eWxlLCAqKF9mb3JtYXRfbWFwZGljdChrdykpKSkKKworCisgICAgZGVmIGxvb2t1cChzZWxmLCBzdHlsZSwgb3B0aW9uLCBzdGF0ZT1Ob25lLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBzcGVjaWZpZWQgZm9yIG9wdGlvbiBpbiBzdHlsZS4KKworICAgICAgICBJZiBzdGF0ZSBpcyBzcGVjaWZpZWQgaXQgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzZXF1ZW5jZSBvZiBvbmUKKyAgICAgICAgb3IgbW9yZSBzdGF0ZXMuIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIHNldCwgaXQgaXMgdXNlZCBhcworICAgICAgICBhIGZhbGxiYWNrIHZhbHVlIGluIGNhc2Ugbm8gc3BlY2lmaWNhdGlvbiBmb3Igb3B0aW9uIGlzIGZvdW5kLiIiIgorICAgICAgICBzdGF0ZSA9ICcgJy5qb2luKHN0YXRlKSBpZiBzdGF0ZSBlbHNlICcnCisKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAibG9va3VwIiwgc3R5bGUsICctJXMnICUgb3B0aW9uLAorICAgICAgICAgICAgc3RhdGUsIGRlZmF1bHQpCisKKworICAgIGRlZiBsYXlvdXQoc2VsZiwgc3R5bGUsIGxheW91dHNwZWM9Tm9uZSk6CisgICAgICAgICIiIkRlZmluZSB0aGUgd2lkZ2V0IGxheW91dCBmb3IgZ2l2ZW4gc3R5bGUuIElmIGxheW91dHNwZWMgaXMKKyAgICAgICAgb21pdHRlZCwgcmV0dXJuIHRoZSBsYXlvdXQgc3BlY2lmaWNhdGlvbiBmb3IgZ2l2ZW4gc3R5bGUuCisKKyAgICAgICAgbGF5b3V0c3BlYyBpcyBleHBlY3RlZCB0byBiZSBhIGxpc3Qgb3IgYW4gb2JqZWN0IGRpZmZlcmVudCB0aGFuCisgICAgICAgIE5vbmUgdGhhdCBldmFsdWF0ZXMgdG8gRmFsc2UgaWYgeW91IHdhbnQgdG8gInR1cm4gb2ZmIiB0aGF0IHN0eWxlLgorICAgICAgICBJZiBpdCBpcyBhIGxpc3QgKG9yIHR1cGxlLCBvciBzb21ldGhpbmcgZWxzZSksIGVhY2ggaXRlbSBzaG91bGQgYmUKKyAgICAgICAgYSB0dXBsZSB3aGVyZSB0aGUgZmlyc3QgaXRlbSBpcyB0aGUgbGF5b3V0IG5hbWUgYW5kIHRoZSBzZWNvbmQgaXRlbQorICAgICAgICBzaG91bGQgaGF2ZSB0aGUgZm9ybWF0IGRlc2NyaWJlZCBiZWxvdzoKKworICAgICAgICBMQVlPVVRTCisKKyAgICAgICAgICAgIEEgbGF5b3V0IGNhbiBjb250YWluIHRoZSB2YWx1ZSBOb25lLCBpZiB0YWtlcyBubyBvcHRpb25zLCBvcgorICAgICAgICAgICAgYSBkaWN0IG9mIG9wdGlvbnMgc3BlY2lmeWluZyBob3cgdG8gYXJyYW5nZSB0aGUgZWxlbWVudC4KKyAgICAgICAgICAgIFRoZSBsYXlvdXQgbWVjaGFuaXNtIHVzZXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIHBhY2sKKyAgICAgICAgICAgIGdlb21ldHJ5IG1hbmFnZXI6IGdpdmVuIGFuIGluaXRpYWwgY2F2aXR5LCBlYWNoIGVsZW1lbnQgaXMKKyAgICAgICAgICAgIGFsbG9jYXRlZCBhIHBhcmNlbC4gVmFsaWQgb3B0aW9ucy92YWx1ZXMgYXJlOgorCisgICAgICAgICAgICAgICAgc2lkZTogd2hpY2hzaWRlCisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBzaWRlIG9mIHRoZSBjYXZpdHkgdG8gcGxhY2UgdGhlCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ7IG9uZSBvZiB0b3AsIHJpZ2h0LCBib3R0b20gb3IgbGVmdC4gSWYKKyAgICAgICAgICAgICAgICAgICAgb21pdHRlZCwgdGhlIGVsZW1lbnQgb2NjdXBpZXMgdGhlIGVudGlyZSBjYXZpdHkuCisKKyAgICAgICAgICAgICAgICBzdGlja3k6IG5zd2UKKyAgICAgICAgICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXJlIHRoZSBlbGVtZW50IGlzIHBsYWNlZCBpbnNpZGUgaXRzCisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBwYXJjZWwuCisKKyAgICAgICAgICAgICAgICBjaGlsZHJlbjogW3N1YmxheW91dC4uLiBdCisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhIGxpc3Qgb2YgZWxlbWVudHMgdG8gcGxhY2UgaW5zaWRlIHRoZQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50LiBFYWNoIGVsZW1lbnQgaXMgYSB0dXBsZSAob3Igb3RoZXIgc2VxdWVuY2UpCisgICAgICAgICAgICAgICAgICAgIHdoZXJlIHRoZSBmaXJzdCBpdGVtIGlzIHRoZSBsYXlvdXQgbmFtZSwgYW5kIHRoZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICBpcyBhIExBWU9VVC4iIiIKKyAgICAgICAgbHNwZWMgPSBOb25lCisgICAgICAgIGlmIGxheW91dHNwZWM6CisgICAgICAgICAgICBsc3BlYyA9IF9mb3JtYXRfbGF5b3V0bGlzdChsYXlvdXRzcGVjKVswXQorICAgICAgICBlbGlmIGxheW91dHNwZWMgaXMgbm90IE5vbmU6ICMgd2lsbCBkaXNhYmxlIHRoZSBsYXlvdXQgKHt9LCAnJywgZXRjKQorICAgICAgICAgICAgbHNwZWMgPSAibnVsbCIgIyBjb3VsZCBiZSBhbnkgb3RoZXIgd29yZCwgYnV0IHRoaXMgbWF5IG1ha2Ugc2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgd2hlbiBjYWxsaW5nIGxheW91dChzdHlsZSkgbGF0ZXIKKworICAgICAgICByZXR1cm4gX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSgKKyAgICAgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAibGF5b3V0Iiwgc3R5bGUsIGxzcGVjKSkKKworCisgICAgZGVmIGVsZW1lbnRfY3JlYXRlKHNlbGYsIGVsZW1lbnRuYW1lLCBldHlwZSwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgZWxlbWVudCBpbiB0aGUgY3VycmVudCB0aGVtZSBvZiBnaXZlbiBldHlwZS4iIiIKKyAgICAgICAgc3BlYywgb3B0cyA9IF9mb3JtYXRfZWxlbWNyZWF0ZShldHlwZSwgRmFsc2UsICphcmdzLCAqKmt3KQorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAiY3JlYXRlIiwgZWxlbWVudG5hbWUsIGV0eXBlLAorICAgICAgICAgICAgc3BlYywgKm9wdHMpCisKKworICAgIGRlZiBlbGVtZW50X25hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBsaXN0IG9mIGVsZW1lbnRzIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgdGhlbWUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgImVsZW1lbnQiLCAibmFtZXMiKQorCisKKyAgICBkZWYgZWxlbWVudF9vcHRpb25zKHNlbGYsIGVsZW1lbnRuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIGVsZW1lbnRuYW1lJ3Mgb3B0aW9ucy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAiZWxlbWVudCIsICJvcHRpb25zIiwgZWxlbWVudG5hbWUpCisKKworICAgIGRlZiB0aGVtZV9jcmVhdGUoc2VsZiwgdGhlbWVuYW1lLCBwYXJlbnQ9Tm9uZSwgc2V0dGluZ3M9Tm9uZSk6CisgICAgICAgICIiIkNyZWF0ZXMgYSBuZXcgdGhlbWUuCisKKyAgICAgICAgSXQgaXMgYW4gZXJyb3IgaWYgdGhlbWVuYW1lIGFscmVhZHkgZXhpc3RzLiBJZiBwYXJlbnQgaXMKKyAgICAgICAgc3BlY2lmaWVkLCB0aGUgbmV3IHRoZW1lIHdpbGwgaW5oZXJpdCBzdHlsZXMsIGVsZW1lbnRzIGFuZAorICAgICAgICBsYXlvdXRzIGZyb20gdGhlIHNwZWNpZmllZCBwYXJlbnQgdGhlbWUuIElmIHNldHRpbmdzIGFyZSBwcmVzZW50LAorICAgICAgICB0aGV5IGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBzYW1lIHN5bnRheCB1c2VkIGZvciB0aGVtZV9zZXR0aW5ncy4iIiIKKyAgICAgICAgc2NyaXB0ID0gX3NjcmlwdF9mcm9tX3NldHRpbmdzKHNldHRpbmdzKSBpZiBzZXR0aW5ncyBlbHNlICcnCisKKyAgICAgICAgaWYgcGFyZW50OgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJ0aGVtZSIsICJjcmVhdGUiLCB0aGVtZW5hbWUsCisgICAgICAgICAgICAgICAgIi1wYXJlbnQiLCBwYXJlbnQsICItc2V0dGluZ3MiLCBzY3JpcHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgInRoZW1lIiwgImNyZWF0ZSIsIHRoZW1lbmFtZSwKKyAgICAgICAgICAgICAgICAiLXNldHRpbmdzIiwgc2NyaXB0KQorCisKKyAgICBkZWYgdGhlbWVfc2V0dGluZ3Moc2VsZiwgdGhlbWVuYW1lLCBzZXR0aW5ncyk6CisgICAgICAgICIiIlRlbXBvcmFyaWx5IHNldHMgdGhlIGN1cnJlbnQgdGhlbWUgdG8gdGhlbWVuYW1lLCBhcHBseSBzcGVjaWZpZWQKKyAgICAgICAgc2V0dGluZ3MgYW5kIHRoZW4gcmVzdG9yZSB0aGUgcHJldmlvdXMgdGhlbWUuCisKKyAgICAgICAgRWFjaCBrZXkgaW4gc2V0dGluZ3MgaXMgYSBzdHlsZSBhbmQgZWFjaCB2YWx1ZSBtYXkgY29udGFpbiB0aGUKKyAgICAgICAga2V5cyAnY29uZmlndXJlJywgJ21hcCcsICdsYXlvdXQnIGFuZCAnZWxlbWVudCBjcmVhdGUnIGFuZCB0aGV5CisgICAgICAgIGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyBzcGVjaWZpZWQgYnkgdGhlIG1ldGhvZHMKKyAgICAgICAgY29uZmlndXJlLCBtYXAsIGxheW91dCBhbmQgZWxlbWVudF9jcmVhdGUgcmVzcGVjdGl2ZWx5LiIiIgorICAgICAgICBzY3JpcHQgPSBfc2NyaXB0X2Zyb21fc2V0dGluZ3Moc2V0dGluZ3MpCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl9uYW1lLCAidGhlbWUiLCAic2V0dGluZ3MiLCB0aGVtZW5hbWUsIHNjcmlwdCkKKworCisgICAgZGVmIHRoZW1lX25hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBhbGwga25vd24gdGhlbWVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX25hbWUsICJ0aGVtZSIsICJuYW1lcyIpCisKKworICAgIGRlZiB0aGVtZV91c2Uoc2VsZiwgdGhlbWVuYW1lPU5vbmUpOgorICAgICAgICAiIiJJZiB0aGVtZW5hbWUgaXMgTm9uZSwgcmV0dXJucyB0aGUgdGhlbWUgaW4gdXNlLCBvdGhlcndpc2UsIHNldAorICAgICAgICB0aGUgY3VycmVudCB0aGVtZSB0byB0aGVtZW5hbWUsIHJlZnJlc2hlcyBhbGwgd2lkZ2V0cyBhbmQgZW1pdHMKKyAgICAgICAgYSA8PFRoZW1lQ2hhbmdlZD4+IGV2ZW50LiIiIgorICAgICAgICBpZiB0aGVtZW5hbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgU3RhcnRpbmcgb24gVGsgOC42LCBjaGVja2luZyB0aGlzIGdsb2JhbCBpcyBubyBsb25nZXIgbmVlZGVkCisgICAgICAgICAgICAjIHNpbmNlIGl0IGFsbG93cyBkb2luZyBzZWxmLnRrLmNhbGwoc2VsZi5fbmFtZSwgInRoZW1lIiwgInVzZSIpCisgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5ldmFsKCJyZXR1cm4gJHR0azo6Y3VycmVudFRoZW1lIikKKworICAgICAgICAjIHVzaW5nICJ0dGs6OnNldFRoZW1lIiBpbnN0ZWFkIG9mICJ0dGs6OnN0eWxlIHRoZW1lIHVzZSIgY2F1c2VzCisgICAgICAgICMgdGhlIHZhcmlhYmxlIGN1cnJlbnRUaGVtZSB0byBiZSB1cGRhdGVkLCBhbHNvLCB0dGs6OnNldFRoZW1lIGNhbGxzCisgICAgICAgICMgInR0azo6c3R5bGUgdGhlbWUgdXNlIiBpbiBvcmRlciB0byBjaGFuZ2UgdGhlbWUuCisgICAgICAgIHNlbGYudGsuY2FsbCgidHRrOjpzZXRUaGVtZSIsIHRoZW1lbmFtZSkKKworCitjbGFzcyBXaWRnZXQoVGtpbnRlci5XaWRnZXQpOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIFRrIHRoZW1lZCB3aWRnZXRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlciwgd2lkZ2V0bmFtZSwga3c9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdHMgYSBUdGsgV2lkZ2V0IHdpdGggdGhlIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCB0YWtlZm9jdXMsIHN0eWxlCisKKyAgICAgICAgU0NST0xMQUJMRSBXSURHRVQgT1BUSU9OUworCisgICAgICAgICAgICB4c2Nyb2xsY29tbWFuZCwgeXNjcm9sbGNvbW1hbmQKKworICAgICAgICBMQUJFTCBXSURHRVQgT1BUSU9OUworCisgICAgICAgICAgICB0ZXh0LCB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgaW1hZ2UsIGNvbXBvdW5kLCB3aWR0aAorCisgICAgICAgIFdJREdFVCBTVEFURVMKKworICAgICAgICAgICAgYWN0aXZlLCBkaXNhYmxlZCwgZm9jdXMsIHByZXNzZWQsIHNlbGVjdGVkLCBiYWNrZ3JvdW5kLAorICAgICAgICAgICAgcmVhZG9ubHksIGFsdGVybmF0ZSwgaW52YWxpZAorICAgICAgICAiIiIKKyAgICAgICAgbWFzdGVyID0gc2V0dXBfbWFzdGVyKG1hc3RlcikKKyAgICAgICAgaWYgbm90IGdldGF0dHIobWFzdGVyLCAnX3RpbGVfbG9hZGVkJywgRmFsc2UpOgorICAgICAgICAgICAgIyBMb2FkIHRpbGUgbm93LCBpZiBuZWVkZWQKKyAgICAgICAgICAgIF9sb2FkX3RpbGUobWFzdGVyKQorICAgICAgICBUa2ludGVyLldpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZGdldG5hbWUsIGt3PWt3KQorCisKKyAgICBkZWYgaWRlbnRpZnkoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24geCwgeSwgb3IgdGhlIGVtcHR5CisgICAgICAgIHN0cmluZyBpZiB0aGUgcG9pbnQgZG9lcyBub3QgbGllIHdpdGhpbiBhbnkgZWxlbWVudC4KKworICAgICAgICB4IGFuZCB5IGFyZSBwaXhlbCBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgd2lkZ2V0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpZGVudGlmeSIsIHgsIHkpCisKKworICAgIGRlZiBpbnN0YXRlKHNlbGYsIHN0YXRlc3BlYywgY2FsbGJhY2s9Tm9uZSwgKmFyZ3MsICoqa3cpOgorICAgICAgICAiIiJUZXN0IHRoZSB3aWRnZXQncyBzdGF0ZS4KKworICAgICAgICBJZiBjYWxsYmFjayBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIFRydWUgaWYgdGhlIHdpZGdldCBzdGF0ZQorICAgICAgICBtYXRjaGVzIHN0YXRlc3BlYyBhbmQgRmFsc2Ugb3RoZXJ3aXNlLiBJZiBjYWxsYmFjayBpcyBzcGVjaWZpZWQsCisgICAgICAgIHRoZW4gaXQgd2lsbCBiZSBpbnZva2VkIHdpdGggKmFyZ3MsICoqa3cgaWYgdGhlIHdpZGdldCBzdGF0ZQorICAgICAgICBtYXRjaGVzIHN0YXRlc3BlYy4gc3RhdGVzcGVjIGlzIGV4cGVjdGVkIHRvIGJlIGEgc2VxdWVuY2UuIiIiCisgICAgICAgIHJldCA9IHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5zdGF0ZSIsICcgJy5qb2luKHN0YXRlc3BlYykpCisgICAgICAgIGlmIHJldCBhbmQgY2FsbGJhY2s6CisgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKmFyZ3MsICoqa3cpCisKKyAgICAgICAgcmV0dXJuIGJvb2wocmV0KQorCisKKyAgICBkZWYgc3RhdGUoc2VsZiwgc3RhdGVzcGVjPU5vbmUpOgorICAgICAgICAiIiJNb2RpZnkgb3IgaW5xdWlyZSB3aWRnZXQgc3RhdGUuCisKKyAgICAgICAgV2lkZ2V0IHN0YXRlIGlzIHJldHVybmVkIGlmIHN0YXRlc3BlYyBpcyBOb25lLCBvdGhlcndpc2UgaXQgaXMKKyAgICAgICAgc2V0IGFjY29yZGluZyB0byB0aGUgc3RhdGVzcGVjIGZsYWdzIGFuZCB0aGVuIGEgbmV3IHN0YXRlIHNwZWMKKyAgICAgICAgaXMgcmV0dXJuZWQgaW5kaWNhdGluZyB3aGljaCBmbGFncyB3ZXJlIGNoYW5nZWQuIHN0YXRlc3BlYyBpcworICAgICAgICBleHBlY3RlZCB0byBiZSBhIHNlcXVlbmNlLiIiIgorICAgICAgICBpZiBzdGF0ZXNwZWMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdGF0ZXNwZWMgPSAnICcuam9pbihzdGF0ZXNwZWMpCisKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuc3BsaXRsaXN0KHN0cihzZWxmLnRrLmNhbGwoc2VsZi5fdywgInN0YXRlIiwgc3RhdGVzcGVjKSkpCisKKworY2xhc3MgQnV0dG9uKFdpZGdldCk6CisgICAgIiIiVHRrIEJ1dHRvbiB3aWRnZXQsIGRpc3BsYXlzIGEgdGV4dHVhbCBsYWJlbCBhbmQvb3IgaW1hZ2UsIGFuZAorICAgIGV2YWx1YXRlcyBhIGNvbW1hbmQgd2hlbiBwcmVzc2VkLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIEJ1dHRvbiB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjb21wb3VuZCwgY3Vyc29yLCBpbWFnZSwgc3RhdGUsIHN0eWxlLCB0YWtlZm9jdXMsCisgICAgICAgICAgICB0ZXh0LCB0ZXh0dmFyaWFibGUsIHVuZGVybGluZSwgd2lkdGgKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBjb21tYW5kLCBkZWZhdWx0LCB3aWR0aAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6YnV0dG9uIiwga3cpCisKKworICAgIGRlZiBpbnZva2Uoc2VsZik6CisgICAgICAgICIiIkludm9rZXMgdGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB3aXRoIHRoZSBidXR0b24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImludm9rZSIpCisKKworY2xhc3MgQ2hlY2tidXR0b24oV2lkZ2V0KToKKyAgICAiIiJUdGsgQ2hlY2tidXR0b24gd2lkZ2V0IHdoaWNoIGlzIGVpdGhlciBpbiBvbi0gb3Igb2ZmLXN0YXRlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIENoZWNrYnV0dG9uIHdpZGdldCB3aXRoIHRoZSBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGNvbXBvdW5kLCBjdXJzb3IsIGltYWdlLCBzdGF0ZSwgc3R5bGUsIHRha2Vmb2N1cywKKyAgICAgICAgICAgIHRleHQsIHRleHR2YXJpYWJsZSwgdW5kZXJsaW5lLCB3aWR0aAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGNvbW1hbmQsIG9mZnZhbHVlLCBvbnZhbHVlLCB2YXJpYWJsZQorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6Y2hlY2tidXR0b24iLCBrdykKKworCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgIiIiVG9nZ2xlcyBiZXR3ZWVuIHRoZSBzZWxlY3RlZCBhbmQgZGVzZWxlY3RlZCBzdGF0ZXMgYW5kCisgICAgICAgIGludm9rZXMgdGhlIGFzc29jaWF0ZWQgY29tbWFuZC4gSWYgdGhlIHdpZGdldCBpcyBjdXJyZW50bHkKKyAgICAgICAgc2VsZWN0ZWQsIHNldHMgdGhlIG9wdGlvbiB2YXJpYWJsZSB0byB0aGUgb2ZmdmFsdWUgb3B0aW9uCisgICAgICAgIGFuZCBkZXNlbGVjdHMgdGhlIHdpZGdldDsgb3RoZXJ3aXNlLCBzZXRzIHRoZSBvcHRpb24gdmFyaWFibGUKKyAgICAgICAgdG8gdGhlIG9wdGlvbiBvbnZhbHVlLgorCisgICAgICAgIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgYXNzb2NpYXRlZCBjb21tYW5kLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbnZva2UiKQorCisKK2NsYXNzIEVudHJ5KFdpZGdldCwgVGtpbnRlci5FbnRyeSk6CisgICAgIiIiVHRrIEVudHJ5IHdpZGdldCBkaXNwbGF5cyBhIG9uZS1saW5lIHRleHQgc3RyaW5nIGFuZCBhbGxvd3MgdGhhdAorICAgIHN0cmluZyB0byBiZSBlZGl0ZWQgYnkgdGhlIHVzZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHdpZGdldD1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0cyBhIFR0ayBFbnRyeSB3aWRnZXQgd2l0aCB0aGUgcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjdXJzb3IsIHN0eWxlLCB0YWtlZm9jdXMsIHhzY3JvbGxjb21tYW5kCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgZXhwb3J0c2VsZWN0aW9uLCBpbnZhbGlkY29tbWFuZCwganVzdGlmeSwgc2hvdywgc3RhdGUsCisgICAgICAgICAgICB0ZXh0dmFyaWFibGUsIHZhbGlkYXRlLCB2YWxpZGF0ZWNvbW1hbmQsIHdpZHRoCisKKyAgICAgICAgVkFMSURBVElPTiBNT0RFUworCisgICAgICAgICAgICBub25lLCBrZXksIGZvY3VzLCBmb2N1c2luLCBmb2N1c291dCwgYWxsCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCB3aWRnZXQgb3IgInR0azo6ZW50cnkiLCBrdykKKworCisgICAgZGVmIGJib3goc2VsZiwgaW5kZXgpOgorICAgICAgICAiIiJSZXR1cm4gYSB0dXBsZSBvZiAoeCwgeSwgd2lkdGgsIGhlaWdodCkgd2hpY2ggZGVzY3JpYmVzIHRoZQorICAgICAgICBib3VuZGluZyBib3ggb2YgdGhlIGNoYXJhY3RlciBnaXZlbiBieSBpbmRleC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiYmJveCIsIGluZGV4KQorCisKKyAgICBkZWYgaWRlbnRpZnkoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24geCwgeSwgb3IgdGhlCisgICAgICAgIGVtcHR5IHN0cmluZyBpZiB0aGUgY29vcmRpbmF0ZXMgYXJlIG91dHNpZGUgdGhlIHdpbmRvdy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaWRlbnRpZnkiLCB4LCB5KQorCisKKyAgICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgICAgICIiIkZvcmNlIHJldmFsaWRhdGlvbiwgaW5kZXBlbmRlbnQgb2YgdGhlIGNvbmRpdGlvbnMgc3BlY2lmaWVkCisgICAgICAgIGJ5IHRoZSB2YWxpZGF0ZSBvcHRpb24uIFJldHVybnMgRmFsc2UgaWYgdmFsaWRhdGlvbiBmYWlscywgVHJ1ZQorICAgICAgICBpZiBpdCBzdWNjZWVkcy4gU2V0cyBvciBjbGVhcnMgdGhlIGludmFsaWQgc3RhdGUgYWNjb3JkaW5nbHkuIiIiCisgICAgICAgIHJldHVybiBib29sKHNlbGYudGsuY2FsbChzZWxmLl93LCAidmFsaWRhdGUiKSkKKworCitjbGFzcyBDb21ib2JveChFbnRyeSk6CisgICAgIiIiVHRrIENvbWJvYm94IHdpZGdldCBjb21iaW5lcyBhIHRleHQgZmllbGQgd2l0aCBhIHBvcC1kb3duIGxpc3Qgb2YKKyAgICB2YWx1ZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgQ29tYm9ib3ggd2lkZ2V0IHdpdGggdGhlIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdHlsZSwgdGFrZWZvY3VzCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgZXhwb3J0c2VsZWN0aW9uLCBqdXN0aWZ5LCBoZWlnaHQsIHBvc3Rjb21tYW5kLCBzdGF0ZSwKKyAgICAgICAgICAgIHRleHR2YXJpYWJsZSwgdmFsdWVzLCB3aWR0aAorICAgICAgICAiIiIKKyAgICAgICAgRW50cnkuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpjb21ib2JveCIsICoqa3cpCisKKworICAgIGRlZiBjdXJyZW50KHNlbGYsIG5ld2luZGV4PU5vbmUpOgorICAgICAgICAiIiJJZiBuZXdpbmRleCBpcyBzdXBwbGllZCwgc2V0cyB0aGUgY29tYm9ib3ggdmFsdWUgdG8gdGhlCisgICAgICAgIGVsZW1lbnQgYXQgcG9zaXRpb24gbmV3aW5kZXggaW4gdGhlIGxpc3Qgb2YgdmFsdWVzLiBPdGhlcndpc2UsCisgICAgICAgIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IHZhbHVlIGluIHRoZSBsaXN0IG9mIHZhbHVlcworICAgICAgICBvciAtMSBpZiB0aGUgY3VycmVudCB2YWx1ZSBkb2VzIG5vdCBhcHBlYXIgaW4gdGhlIGxpc3QuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImN1cnJlbnQiLCBuZXdpbmRleCkKKworCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIlNldHMgdGhlIHZhbHVlIG9mIHRoZSBjb21ib2JveCB0byB2YWx1ZS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZXQiLCB2YWx1ZSkKKworCitjbGFzcyBGcmFtZShXaWRnZXQpOgorICAgICIiIlR0ayBGcmFtZSB3aWRnZXQgaXMgYSBjb250YWluZXIsIHVzZWQgdG8gZ3JvdXAgb3RoZXIgd2lkZ2V0cworICAgIHRvZ2V0aGVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIEZyYW1lIHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjdXJzb3IsIHN0eWxlLCB0YWtlZm9jdXMKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBib3JkZXJ3aWR0aCwgcmVsaWVmLCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0CisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpmcmFtZSIsIGt3KQorCisKK2NsYXNzIExhYmVsKFdpZGdldCk6CisgICAgIiIiVHRrIExhYmVsIHdpZGdldCBkaXNwbGF5cyBhIHRleHR1YWwgbGFiZWwgYW5kL29yIGltYWdlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIExhYmVsIHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjb21wb3VuZCwgY3Vyc29yLCBpbWFnZSwgc3R5bGUsIHRha2Vmb2N1cywgdGV4dCwKKyAgICAgICAgICAgIHRleHR2YXJpYWJsZSwgdW5kZXJsaW5lLCB3aWR0aAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGFuY2hvciwgYmFja2dyb3VuZCwgZm9udCwgZm9yZWdyb3VuZCwganVzdGlmeSwgcGFkZGluZywKKyAgICAgICAgICAgIHJlbGllZiwgdGV4dCwgd3JhcGxlbmd0aAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6bGFiZWwiLCBrdykKKworCitjbGFzcyBMYWJlbGZyYW1lKFdpZGdldCk6CisgICAgIiIiVHRrIExhYmVsZnJhbWUgd2lkZ2V0IGlzIGEgY29udGFpbmVyIHVzZWQgdG8gZ3JvdXAgb3RoZXIgd2lkZ2V0cworICAgIHRvZ2V0aGVyLiBJdCBoYXMgYW4gb3B0aW9uYWwgbGFiZWwsIHdoaWNoIG1heSBiZSBhIHBsYWluIHRleHQgc3RyaW5nCisgICAgb3IgYW5vdGhlciB3aWRnZXQuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgTGFiZWxmcmFtZSB3aXRoIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdHlsZSwgdGFrZWZvY3VzCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKyAgICAgICAgICAgIGxhYmVsYW5jaG9yLCB0ZXh0LCB1bmRlcmxpbmUsIHBhZGRpbmcsIGxhYmVsd2lkZ2V0LCB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodAorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6bGFiZWxmcmFtZSIsIGt3KQorCitMYWJlbEZyYW1lID0gTGFiZWxmcmFtZSAjIFRraW50ZXIgbmFtZSBjb21wYXRpYmlsaXR5CisKKworY2xhc3MgTWVudWJ1dHRvbihXaWRnZXQpOgorICAgICIiIlR0ayBNZW51YnV0dG9uIHdpZGdldCBkaXNwbGF5cyBhIHRleHR1YWwgbGFiZWwgYW5kL29yIGltYWdlLCBhbmQKKyAgICBkaXNwbGF5cyBhIG1lbnUgd2hlbiBwcmVzc2VkLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIE1lbnVidXR0b24gd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGNvbXBvdW5kLCBjdXJzb3IsIGltYWdlLCBzdGF0ZSwgc3R5bGUsIHRha2Vmb2N1cywKKyAgICAgICAgICAgIHRleHQsIHRleHR2YXJpYWJsZSwgdW5kZXJsaW5lLCB3aWR0aAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGRpcmVjdGlvbiwgbWVudQorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6bWVudWJ1dHRvbiIsIGt3KQorCisKK2NsYXNzIE5vdGVib29rKFdpZGdldCk6CisgICAgIiIiVHRrIE5vdGVib29rIHdpZGdldCBtYW5hZ2VzIGEgY29sbGVjdGlvbiBvZiB3aW5kb3dzIGFuZCBkaXNwbGF5cworICAgIGEgc2luZ2xlIG9uZSBhdCBhIHRpbWUuIEVhY2ggY2hpbGQgd2luZG93IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHRhYiwKKyAgICB3aGljaCB0aGUgdXNlciBtYXkgc2VsZWN0IHRvIGNoYW5nZSB0aGUgY3VycmVudGx5LWRpc3BsYXllZCB3aW5kb3cuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgTm90ZWJvb2sgd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cworCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGhlaWdodCwgcGFkZGluZywgd2lkdGgKKworICAgICAgICBUQUIgT1BUSU9OUworCisgICAgICAgICAgICBzdGF0ZSwgc3RpY2t5LCBwYWRkaW5nLCB0ZXh0LCBpbWFnZSwgY29tcG91bmQsIHVuZGVybGluZQorCisgICAgICAgIFRBQiBJREVOVElGSUVSUyAodGFiX2lkKQorCisgICAgICAgICAgICBUaGUgdGFiX2lkIGFyZ3VtZW50IGZvdW5kIGluIHNldmVyYWwgbWV0aG9kcyBtYXkgdGFrZSBhbnkgb2YKKyAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZm9ybXM6CisKKyAgICAgICAgICAgICAgICAqIEFuIGludGVnZXIgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgbnVtYmVyIG9mIHRhYnMKKyAgICAgICAgICAgICAgICAqIFRoZSBuYW1lIG9mIGEgY2hpbGQgd2luZG93CisgICAgICAgICAgICAgICAgKiBBIHBvc2l0aW9uYWwgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZm9ybSAiQHgseSIsIHdoaWNoCisgICAgICAgICAgICAgICAgICBkZWZpbmVzIHRoZSB0YWIKKyAgICAgICAgICAgICAgICAqIFRoZSBzdHJpbmcgImN1cnJlbnQiLCB3aGljaCBpZGVudGlmaWVzIHRoZQorICAgICAgICAgICAgICAgICAgY3VycmVudGx5LXNlbGVjdGVkIHRhYgorICAgICAgICAgICAgICAgICogVGhlIHN0cmluZyAiZW5kIiwgd2hpY2ggcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRhYnMgKG9ubHkKKyAgICAgICAgICAgICAgICAgIHZhbGlkIGZvciBtZXRob2QgaW5kZXgpCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpub3RlYm9vayIsIGt3KQorCisKKyAgICBkZWYgYWRkKHNlbGYsIGNoaWxkLCAqKmt3KToKKyAgICAgICAgIiIiQWRkcyBhIG5ldyB0YWIgdG8gdGhlIG5vdGVib29rLgorCisgICAgICAgIElmIHdpbmRvdyBpcyBjdXJyZW50bHkgbWFuYWdlZCBieSB0aGUgbm90ZWJvb2sgYnV0IGhpZGRlbiwgaXQgaXMKKyAgICAgICAgcmVzdG9yZWQgdG8gaXRzIHByZXZpb3VzIHBvc2l0aW9uLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImFkZCIsIGNoaWxkLCAqKF9mb3JtYXRfb3B0ZGljdChrdykpKQorCisKKyAgICBkZWYgZm9yZ2V0KHNlbGYsIHRhYl9pZCk6CisgICAgICAgICIiIlJlbW92ZXMgdGhlIHRhYiBzcGVjaWZpZWQgYnkgdGFiX2lkLCB1bm1hcHMgYW5kIHVubWFuYWdlcyB0aGUKKyAgICAgICAgYXNzb2NpYXRlZCB3aW5kb3cuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAiZm9yZ2V0IiwgdGFiX2lkKQorCisKKyAgICBkZWYgaGlkZShzZWxmLCB0YWJfaWQpOgorICAgICAgICAiIiJIaWRlcyB0aGUgdGFiIHNwZWNpZmllZCBieSB0YWJfaWQuCisKKyAgICAgICAgVGhlIHRhYiB3aWxsIG5vdCBiZSBkaXNwbGF5ZWQsIGJ1dCB0aGUgYXNzb2NpYXRlZCB3aW5kb3cgcmVtYWlucworICAgICAgICBtYW5hZ2VkIGJ5IHRoZSBub3RlYm9vayBhbmQgaXRzIGNvbmZpZ3VyYXRpb24gcmVtZW1iZXJlZC4gSGlkZGVuCisgICAgICAgIHRhYnMgbWF5IGJlIHJlc3RvcmVkIHdpdGggdGhlIGFkZCBjb21tYW5kLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImhpZGUiLCB0YWJfaWQpCisKKworICAgIGRlZiBpZGVudGlmeShzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgdGFiIGVsZW1lbnQgYXQgcG9zaXRpb24geCwgeSwgb3IgdGhlCisgICAgICAgIGVtcHR5IHN0cmluZyBpZiBub25lLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpZGVudGlmeSIsIHgsIHkpCisKKworICAgIGRlZiBpbmRleChzZWxmLCB0YWJfaWQpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBudW1lcmljIGluZGV4IG9mIHRoZSB0YWIgc3BlY2lmaWVkIGJ5IHRhYl9pZCwgb3IKKyAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiB0YWJzIGlmIHRhYl9pZCBpcyB0aGUgc3RyaW5nICJlbmQiLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbmRleCIsIHRhYl9pZCkKKworCisgICAgZGVmIGluc2VydChzZWxmLCBwb3MsIGNoaWxkLCAqKmt3KToKKyAgICAgICAgIiIiSW5zZXJ0cyBhIHBhbmUgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4KKworICAgICAgICBwb3MgaXMgZWl0aGVyIHRoZSBzdHJpbmcgZW5kLCBhbiBpbnRlZ2VyIGluZGV4LCBvciB0aGUgbmFtZSBvZgorICAgICAgICBhIG1hbmFnZWQgY2hpbGQuIElmIGNoaWxkIGlzIGFscmVhZHkgbWFuYWdlZCBieSB0aGUgbm90ZWJvb2ssCisgICAgICAgIG1vdmVzIGl0IHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5zZXJ0IiwgcG9zLCBjaGlsZCwgKihfZm9ybWF0X29wdGRpY3Qoa3cpKSkKKworCisgICAgZGVmIHNlbGVjdChzZWxmLCB0YWJfaWQ9Tm9uZSk6CisgICAgICAgICIiIlNlbGVjdHMgdGhlIHNwZWNpZmllZCB0YWIuCisKKyAgICAgICAgVGhlIGFzc29jaWF0ZWQgY2hpbGQgd2luZG93IHdpbGwgYmUgZGlzcGxheWVkLCBhbmQgdGhlCisgICAgICAgIHByZXZpb3VzbHktc2VsZWN0ZWQgd2luZG93IChpZiBkaWZmZXJlbnQpIGlzIHVubWFwcGVkLiBJZiB0YWJfaWQKKyAgICAgICAgaXMgb21pdHRlZCwgcmV0dXJucyB0aGUgd2lkZ2V0IG5hbWUgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAorICAgICAgICBwYW5lLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZWxlY3QiLCB0YWJfaWQpCisKKworICAgIGRlZiB0YWIoc2VsZiwgdGFiX2lkLCBvcHRpb249Tm9uZSwgKiprdyk6CisgICAgICAgICIiIlF1ZXJ5IG9yIG1vZGlmeSB0aGUgb3B0aW9ucyBvZiB0aGUgc3BlY2lmaWMgdGFiX2lkLgorCisgICAgICAgIElmIGt3IGlzIG5vdCBnaXZlbiwgcmV0dXJucyBhIGRpY3Qgb2YgdGhlIHRhYiBvcHRpb24gdmFsdWVzLiBJZiBvcHRpb24KKyAgICAgICAgaXMgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGF0IG9wdGlvbi4gT3RoZXJ3aXNlLCBzZXRzIHRoZQorICAgICAgICBvcHRpb25zIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4iIiIKKyAgICAgICAgaWYgb3B0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAga3dbb3B0aW9uXSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl93LCAidGFiIiwgdGFiX2lkKQorCisKKyAgICBkZWYgdGFicyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyBhIGxpc3Qgb2Ygd2luZG93cyBtYW5hZ2VkIGJ5IHRoZSBub3RlYm9vay4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAidGFicyIpIG9yICgpCisKKworICAgIGRlZiBlbmFibGVfdHJhdmVyc2FsKHNlbGYpOgorICAgICAgICAiIiJFbmFibGUga2V5Ym9hcmQgdHJhdmVyc2FsIGZvciBhIHRvcGxldmVsIHdpbmRvdyBjb250YWluaW5nCisgICAgICAgIHRoaXMgbm90ZWJvb2suCisKKyAgICAgICAgVGhpcyB3aWxsIGV4dGVuZCB0aGUgYmluZGluZ3MgZm9yIHRoZSB0b3BsZXZlbCB3aW5kb3cgY29udGFpbmluZworICAgICAgICB0aGlzIG5vdGVib29rIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgIENvbnRyb2wtVGFiOiBzZWxlY3RzIHRoZSB0YWIgZm9sbG93aW5nIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBvbmUKKworICAgICAgICAgICAgU2hpZnQtQ29udHJvbC1UYWI6IHNlbGVjdHMgdGhlIHRhYiBwcmVjZWRpbmcgdGhlIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIG9uZQorCisgICAgICAgICAgICBBbHQtSzogd2hlcmUgSyBpcyB0aGUgbW5lbW9uaWMgKHVuZGVybGluZWQpIGNoYXJhY3RlciBvZiBhbnkKKyAgICAgICAgICAgICAgICAgICB0YWIsIHdpbGwgc2VsZWN0IHRoYXQgdGFiLgorCisgICAgICAgIE11bHRpcGxlIG5vdGVib29rcyBpbiBhIHNpbmdsZSB0b3BsZXZlbCBtYXkgYmUgZW5hYmxlZCBmb3IKKyAgICAgICAgdHJhdmVyc2FsLCBpbmNsdWRpbmcgbmVzdGVkIG5vdGVib29rcy4gSG93ZXZlciwgbm90ZWJvb2sgdHJhdmVyc2FsCisgICAgICAgIG9ubHkgd29ya3MgcHJvcGVybHkgaWYgYWxsIHBhbmVzIGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlCisgICAgICAgIG5vdGVib29rLiIiIgorICAgICAgICAjIFRoZSBvbmx5LCBhbmQgZ29vZCwgZGlmZmVyZW5jZSBJIHNlZSBpcyBhYm91dCBtbmVtb25pY3MsIHdoaWNoIHdvcmtzCisgICAgICAgICMgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4gQ29udHJvbC1UYWIgYW5kIFNoaWZ0LUNvbnRyb2wtVGFiIGFsd2F5cworICAgICAgICAjIHdvcmtzIChoZXJlIGF0IGxlYXN0KS4KKyAgICAgICAgc2VsZi50ay5jYWxsKCJ0dGs6Om5vdGVib29rOjplbmFibGVUcmF2ZXJzYWwiLCBzZWxmLl93KQorCisKK2NsYXNzIFBhbmVkd2luZG93KFdpZGdldCwgVGtpbnRlci5QYW5lZFdpbmRvdyk6CisgICAgIiIiVHRrIFBhbmVkd2luZG93IHdpZGdldCBkaXNwbGF5cyBhIG51bWJlciBvZiBzdWJ3aW5kb3dzLCBzdGFja2VkCisgICAgZWl0aGVyIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIFBhbmVkd2luZG93IHdpdGggcGFyZW50IG1hc3Rlci4KKworICAgICAgICBTVEFOREFSRCBPUFRJT05TCisKKyAgICAgICAgICAgIGNsYXNzLCBjdXJzb3IsIHN0eWxlLCB0YWtlZm9jdXMKKworICAgICAgICBXSURHRVQtU1BFQ0lGSUMgT1BUSU9OUworCisgICAgICAgICAgICBvcmllbnQsIHdpZHRoLCBoZWlnaHQKKworICAgICAgICBQQU5FIE9QVElPTlMKKworICAgICAgICAgICAgd2VpZ2h0CisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpwYW5lZHdpbmRvdyIsIGt3KQorCisKKyAgICBmb3JnZXQgPSBUa2ludGVyLlBhbmVkV2luZG93LmZvcmdldCAjIG92ZXJyaWRlcyBQYWNrLmZvcmdldAorCisKKyAgICBkZWYgaW5zZXJ0KHNlbGYsIHBvcywgY2hpbGQsICoqa3cpOgorICAgICAgICAiIiJJbnNlcnRzIGEgcGFuZSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9ucy4KKworICAgICAgICBwb3MgaXMgZWl0aGVyIHRoZSBzdHJpbmcgZW5kLCBhbmQgaW50ZWdlciBpbmRleCwgb3IgdGhlIG5hbWUKKyAgICAgICAgb2YgYSBjaGlsZC4gSWYgY2hpbGQgaXMgYWxyZWFkeSBtYW5hZ2VkIGJ5IHRoZSBwYW5lZCB3aW5kb3csCisgICAgICAgIG1vdmVzIGl0IHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW5zZXJ0IiwgcG9zLCBjaGlsZCwgKihfZm9ybWF0X29wdGRpY3Qoa3cpKSkKKworCisgICAgZGVmIHBhbmUoc2VsZiwgcGFuZSwgb3B0aW9uPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJRdWVyeSBvciBtb2RpZnkgdGhlIG9wdGlvbnMgb2YgdGhlIHNwZWNpZmllZCBwYW5lLgorCisgICAgICAgIHBhbmUgaXMgZWl0aGVyIGFuIGludGVnZXIgaW5kZXggb3IgdGhlIG5hbWUgb2YgYSBtYW5hZ2VkIHN1YndpbmRvdy4KKyAgICAgICAgSWYga3cgaXMgbm90IGdpdmVuLCByZXR1cm5zIGEgZGljdCBvZiB0aGUgcGFuZSBvcHRpb24gdmFsdWVzLiBJZgorICAgICAgICBvcHRpb24gaXMgc3BlY2lmaWVkIHRoZW4gdGhlIHZhbHVlIGZvciB0aGF0IG9wdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgICAgT3RoZXJ3aXNlLCBzZXRzIHRoZSBvcHRpb25zIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4iIiIKKyAgICAgICAgaWYgb3B0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAga3dbb3B0aW9uXSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl93LCAicGFuZSIsIHBhbmUpCisKKworICAgIGRlZiBzYXNocG9zKHNlbGYsIGluZGV4LCBuZXdwb3M9Tm9uZSk6CisgICAgICAgICIiIklmIG5ld3BvcyBpcyBzcGVjaWZpZWQsIHNldHMgdGhlIHBvc2l0aW9uIG9mIHNhc2ggbnVtYmVyIGluZGV4LgorCisgICAgICAgIE1heSBhZGp1c3QgdGhlIHBvc2l0aW9ucyBvZiBhZGphY2VudCBzYXNoZXMgdG8gZW5zdXJlIHRoYXQKKyAgICAgICAgcG9zaXRpb25zIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuIFNhc2ggcG9zaXRpb25zIGFyZSBmdXJ0aGVyCisgICAgICAgIGNvbnN0cmFpbmVkIHRvIGJlIGJldHdlZW4gMCBhbmQgdGhlIHRvdGFsIHNpemUgb2YgdGhlIHdpZGdldC4KKworICAgICAgICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24gb2Ygc2FzaCBudW1iZXIgaW5kZXguIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInNhc2hwb3MiLCBpbmRleCwgbmV3cG9zKQorCitQYW5lZFdpbmRvdyA9IFBhbmVkd2luZG93ICMgVGtpbnRlciBuYW1lIGNvbXBhdGliaWxpdHkKKworCitjbGFzcyBQcm9ncmVzc2JhcihXaWRnZXQpOgorICAgICIiIlR0ayBQcm9ncmVzc2JhciB3aWRnZXQgc2hvd3MgdGhlIHN0YXR1cyBvZiBhIGxvbmctcnVubmluZworICAgIG9wZXJhdGlvbi4gVGhleSBjYW4gb3BlcmF0ZSBpbiB0d28gbW9kZXM6IGRldGVybWluYXRlIG1vZGUgc2hvd3MgdGhlCisgICAgYW1vdW50IGNvbXBsZXRlZCByZWxhdGl2ZSB0byB0aGUgdG90YWwgYW1vdW50IG9mIHdvcmsgdG8gYmUgZG9uZSwgYW5kCisgICAgaW5kZXRlcm1pbmF0ZSBtb2RlIHByb3ZpZGVzIGFuIGFuaW1hdGVkIGRpc3BsYXkgdG8gbGV0IHRoZSB1c2VyIGtub3cKKyAgICB0aGF0IHNvbWV0aGluZyBpcyBoYXBwZW5pbmcuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgUHJvZ3Jlc3NiYXIgd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cworCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIG9yaWVudCwgbGVuZ3RoLCBtb2RlLCBtYXhpbXVtLCB2YWx1ZSwgdmFyaWFibGUsIHBoYXNlCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpwcm9ncmVzc2JhciIsIGt3KQorCisKKyAgICBkZWYgc3RhcnQoc2VsZiwgaW50ZXJ2YWw9Tm9uZSk6CisgICAgICAgICIiIkJlZ2luIGF1dG9pbmNyZW1lbnQgbW9kZTogc2NoZWR1bGVzIGEgcmVjdXJyaW5nIHRpbWVyIGV2ZW50CisgICAgICAgIHRoYXQgY2FsbHMgbWV0aG9kIHN0ZXAgZXZlcnkgaW50ZXJ2YWwgbWlsbGlzZWNvbmRzLgorCisgICAgICAgIGludGVydmFsIGRlZmF1bHRzIHRvIDUwIG1pbGxpc2Vjb25kcyAoMjAgc3RlcHMvc2Vjb25kKSBpZiBvbW1pdGVkLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInN0YXJ0IiwgaW50ZXJ2YWwpCisKKworICAgIGRlZiBzdGVwKHNlbGYsIGFtb3VudD1Ob25lKToKKyAgICAgICAgIiIiSW5jcmVtZW50cyB0aGUgdmFsdWUgb3B0aW9uIGJ5IGFtb3VudC4KKworICAgICAgICBhbW91bnQgZGVmYXVsdHMgdG8gMS4wIGlmIG9taXR0ZWQuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAic3RlcCIsIGFtb3VudCkKKworCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICIiIlN0b3AgYXV0b2luY3JlbWVudCBtb2RlOiBjYW5jZWxzIGFueSByZWN1cnJpbmcgdGltZXIgZXZlbnQKKyAgICAgICAgaW5pdGlhdGVkIGJ5IHN0YXJ0LiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInN0b3AiKQorCisKK2NsYXNzIFJhZGlvYnV0dG9uKFdpZGdldCk6CisgICAgIiIiVHRrIFJhZGlvYnV0dG9uIHdpZGdldHMgYXJlIHVzZWQgaW4gZ3JvdXBzIHRvIHNob3cgb3IgY2hhbmdlIGEKKyAgICBzZXQgb2YgbXV0dWFsbHktZXhjbHVzaXZlIG9wdGlvbnMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgUmFkaW9idXR0b24gd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGNvbXBvdW5kLCBjdXJzb3IsIGltYWdlLCBzdGF0ZSwgc3R5bGUsIHRha2Vmb2N1cywKKyAgICAgICAgICAgIHRleHQsIHRleHR2YXJpYWJsZSwgdW5kZXJsaW5lLCB3aWR0aAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGNvbW1hbmQsIHZhbHVlLCB2YXJpYWJsZQorICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6cmFkaW9idXR0b24iLCBrdykKKworCisgICAgZGVmIGludm9rZShzZWxmKToKKyAgICAgICAgIiIiU2V0cyB0aGUgb3B0aW9uIHZhcmlhYmxlIHRvIHRoZSBvcHRpb24gdmFsdWUsIHNlbGVjdHMgdGhlCisgICAgICAgIHdpZGdldCwgYW5kIGludm9rZXMgdGhlIGFzc29jaWF0ZWQgY29tbWFuZC4KKworICAgICAgICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGNvbW1hbmQsIG9yIGFuIGVtcHR5IHN0cmluZyBpZgorICAgICAgICBubyBjb21tYW5kIGlzIHNwZWNpZmllZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaW52b2tlIikKKworCitjbGFzcyBTY2FsZShXaWRnZXQsIFRraW50ZXIuU2NhbGUpOgorICAgICIiIlR0ayBTY2FsZSB3aWRnZXQgaXMgdHlwaWNhbGx5IHVzZWQgdG8gY29udHJvbCB0aGUgbnVtZXJpYyB2YWx1ZSBvZgorICAgIGEgbGlua2VkIHZhcmlhYmxlIHRoYXQgdmFyaWVzIHVuaWZvcm1seSBvdmVyIHNvbWUgcmFuZ2UuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgU2NhbGUgd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cworCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGNvbW1hbmQsIGZyb20sIGxlbmd0aCwgb3JpZW50LCB0bywgdmFsdWUsIHZhcmlhYmxlCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpzY2FsZSIsIGt3KQorCisKKyAgICBkZWYgY29uZmlndXJlKHNlbGYsIGNuZj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiTW9kaWZ5IG9yIHF1ZXJ5IHNjYWxlIG9wdGlvbnMuCisKKyAgICAgICAgU2V0dGluZyBhIHZhbHVlIGZvciBhbnkgb2YgdGhlICJmcm9tIiwgImZyb21fIiBvciAidG8iIG9wdGlvbnMKKyAgICAgICAgZ2VuZXJhdGVzIGEgPDxSYW5nZUNoYW5nZWQ+PiBldmVudC4iIiIKKyAgICAgICAgaWYgY25mOgorICAgICAgICAgICAga3cudXBkYXRlKGNuZikKKyAgICAgICAgV2lkZ2V0LmNvbmZpZ3VyZShzZWxmLCAqKmt3KQorICAgICAgICBpZiBhbnkoWydmcm9tJyBpbiBrdywgJ2Zyb21fJyBpbiBrdywgJ3RvJyBpbiBrd10pOgorICAgICAgICAgICAgc2VsZi5ldmVudF9nZW5lcmF0ZSgnPDxSYW5nZUNoYW5nZWQ+PicpCisKKworICAgIGRlZiBnZXQoc2VsZiwgeD1Ob25lLCB5PU5vbmUpOgorICAgICAgICAiIiJHZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHZhbHVlIG9wdGlvbiwgb3IgdGhlIHZhbHVlCisgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNvb3JkaW5hdGVzIHgsIHkgaWYgdGhleSBhcmUgc3BlY2lmaWVkLgorCisgICAgICAgIHggYW5kIHkgYXJlIHBpeGVsIGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSBzY2FsZSB3aWRnZXQKKyAgICAgICAgb3JpZ2luLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICdnZXQnLCB4LCB5KQorCisKK2NsYXNzIFNjcm9sbGJhcihXaWRnZXQsIFRraW50ZXIuU2Nyb2xsYmFyKToKKyAgICAiIiJUdGsgU2Nyb2xsYmFyIGNvbnRyb2xzIHRoZSB2aWV3cG9ydCBvZiBhIHNjcm9sbGFibGUgd2lkZ2V0LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIFNjcm9sbGJhciB3aXRoIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdHlsZSwgdGFrZWZvY3VzCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgY29tbWFuZCwgb3JpZW50CisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpzY3JvbGxiYXIiLCBrdykKKworCitjbGFzcyBTZXBhcmF0b3IoV2lkZ2V0KToKKyAgICAiIiJUdGsgU2VwYXJhdG9yIHdpZGdldCBkaXNwbGF5cyBhIGhvcml6b250YWwgb3IgdmVydGljYWwgc2VwYXJhdG9yCisgICAgYmFyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgVHRrIFNlcGFyYXRvciB3aXRoIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdHlsZSwgdGFrZWZvY3VzCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgb3JpZW50CisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjpzZXBhcmF0b3IiLCBrdykKKworCitjbGFzcyBTaXplZ3JpcChXaWRnZXQpOgorICAgICIiIlR0ayBTaXplZ3JpcCBhbGxvd3MgdGhlIHVzZXIgdG8gcmVzaXplIHRoZSBjb250YWluaW5nIHRvcGxldmVsCisgICAgd2luZG93IGJ5IHByZXNzaW5nIGFuZCBkcmFnZ2luZyB0aGUgZ3JpcC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgKiprdyk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFR0ayBTaXplZ3JpcCB3aXRoIHBhcmVudCBtYXN0ZXIuCisKKyAgICAgICAgU1RBTkRBUkQgT1BUSU9OUworCisgICAgICAgICAgICBjbGFzcywgY3Vyc29yLCBzdGF0ZSwgc3R5bGUsIHRha2Vmb2N1cworICAgICAgICAiIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgInR0azo6c2l6ZWdyaXAiLCBrdykKKworCitjbGFzcyBUcmVldmlldyhXaWRnZXQsIFRraW50ZXIuWFZpZXcsIFRraW50ZXIuWVZpZXcpOgorICAgICIiIlR0ayBUcmVldmlldyB3aWRnZXQgZGlzcGxheXMgYSBoaWVyYXJjaGljYWwgY29sbGVjdGlvbiBvZiBpdGVtcy4KKworICAgIEVhY2ggaXRlbSBoYXMgYSB0ZXh0dWFsIGxhYmVsLCBhbiBvcHRpb25hbCBpbWFnZSwgYW5kIGFuIG9wdGlvbmFsIGxpc3QKKyAgICBvZiBkYXRhIHZhbHVlcy4gVGhlIGRhdGEgdmFsdWVzIGFyZSBkaXNwbGF5ZWQgaW4gc3VjY2Vzc2l2ZSBjb2x1bW5zCisgICAgYWZ0ZXIgdGhlIHRyZWUgbGFiZWwuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUdGsgVHJlZXZpZXcgd2l0aCBwYXJlbnQgbWFzdGVyLgorCisgICAgICAgIFNUQU5EQVJEIE9QVElPTlMKKworICAgICAgICAgICAgY2xhc3MsIGN1cnNvciwgc3R5bGUsIHRha2Vmb2N1cywgeHNjcm9sbGNvbW1hbmQsCisgICAgICAgICAgICB5c2Nyb2xsY29tbWFuZAorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIGNvbHVtbnMsIGRpc3BsYXljb2x1bW5zLCBoZWlnaHQsIHBhZGRpbmcsIHNlbGVjdG1vZGUsIHNob3cKKworICAgICAgICBJVEVNIE9QVElPTlMKKworICAgICAgICAgICAgdGV4dCwgaW1hZ2UsIHZhbHVlcywgb3BlbiwgdGFncworCisgICAgICAgIFRBRyBPUFRJT05TCisKKyAgICAgICAgICAgIGZvcmVncm91bmQsIGJhY2tncm91bmQsIGZvbnQsIGltYWdlCisgICAgICAgICIiIgorICAgICAgICBXaWRnZXQuX19pbml0X18oc2VsZiwgbWFzdGVyLCAidHRrOjp0cmVldmlldyIsIGt3KQorCisKKyAgICBkZWYgYmJveChzZWxmLCBpdGVtLCBjb2x1bW49Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGJvdW5kaW5nIGJveCAocmVsYXRpdmUgdG8gdGhlIHRyZWV2aWV3IHdpZGdldCdzCisgICAgICAgIHdpbmRvdykgb2YgdGhlIHNwZWNpZmllZCBpdGVtIGluIHRoZSBmb3JtIHggeSB3aWR0aCBoZWlnaHQuCisKKyAgICAgICAgSWYgY29sdW1uIGlzIHNwZWNpZmllZCwgcmV0dXJucyB0aGUgYm91bmRpbmcgYm94IG9mIHRoYXQgY2VsbC4KKyAgICAgICAgSWYgdGhlIGl0ZW0gaXMgbm90IHZpc2libGUgKGkuZS4sIGlmIGl0IGlzIGEgZGVzY2VuZGFudCBvZiBhCisgICAgICAgIGNsb3NlZCBpdGVtIG9yIGlzIHNjcm9sbGVkIG9mZnNjcmVlbiksIHJldHVybnMgYW4gZW1wdHkgc3RyaW5nLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJiYm94IiwgaXRlbSwgY29sdW1uKQorCisKKyAgICBkZWYgZ2V0X2NoaWxkcmVuKHNlbGYsIGl0ZW09Tm9uZSk6CisgICAgICAgICIiIlJldHVybnMgYSB0dXBsZSBvZiBjaGlsZHJlbiBiZWxvbmdpbmcgdG8gaXRlbS4KKworICAgICAgICBJZiBpdGVtIGlzIG5vdCBzcGVjaWZpZWQsIHJldHVybnMgcm9vdCBjaGlsZHJlbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiY2hpbGRyZW4iLCBpdGVtIG9yICcnKSBvciAoKQorCisKKyAgICBkZWYgc2V0X2NoaWxkcmVuKHNlbGYsIGl0ZW0sICpuZXdjaGlsZHJlbik6CisgICAgICAgICIiIlJlcGxhY2VzIGl0ZW0ncyBjaGlsZCB3aXRoIG5ld2NoaWxkcmVuLgorCisgICAgICAgIENoaWxkcmVuIHByZXNlbnQgaW4gaXRlbSB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiBuZXdjaGlsZHJlbgorICAgICAgICBhcmUgZGV0YWNoZWQgZnJvbSB0cmVlLiBObyBpdGVtcyBpbiBuZXdjaGlsZHJlbiBtYXkgYmUgYW4KKyAgICAgICAgYW5jZXN0b3Igb2YgaXRlbS4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJjaGlsZHJlbiIsIGl0ZW0sIG5ld2NoaWxkcmVuKQorCisKKyAgICBkZWYgY29sdW1uKHNlbGYsIGNvbHVtbiwgb3B0aW9uPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJRdWVyeSBvciBtb2RpZnkgdGhlIG9wdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgorCisgICAgICAgIElmIGt3IGlzIG5vdCBnaXZlbiwgcmV0dXJucyBhIGRpY3Qgb2YgdGhlIGNvbHVtbiBvcHRpb24gdmFsdWVzLiBJZgorICAgICAgICBvcHRpb24gaXMgc3BlY2lmaWVkIHRoZW4gdGhlIHZhbHVlIGZvciB0aGF0IG9wdGlvbiBpcyByZXR1cm5lZC4KKyAgICAgICAgT3RoZXJ3aXNlLCBzZXRzIHRoZSBvcHRpb25zIHRvIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcy4iIiIKKyAgICAgICAgaWYgb3B0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAga3dbb3B0aW9uXSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIF92YWxfb3JfZGljdChrdywgc2VsZi50ay5jYWxsLCBzZWxmLl93LCAiY29sdW1uIiwgY29sdW1uKQorCisKKyAgICBkZWYgZGVsZXRlKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgc3BlY2lmaWVkIGl0ZW1zIGFuZCBhbGwgdGhlaXIgZGVzY2VuZGFudHMuIFRoZSByb290CisgICAgICAgIGl0ZW0gbWF5IG5vdCBiZSBkZWxldGVkLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgImRlbGV0ZSIsIGl0ZW1zKQorCisKKyAgICBkZWYgZGV0YWNoKHNlbGYsICppdGVtcyk6CisgICAgICAgICIiIlVubGlua3MgYWxsIG9mIHRoZSBzcGVjaWZpZWQgaXRlbXMgZnJvbSB0aGUgdHJlZS4KKworICAgICAgICBUaGUgaXRlbXMgYW5kIGFsbCBvZiB0aGVpciBkZXNjZW5kYW50cyBhcmUgc3RpbGwgcHJlc2VudCwgYW5kIG1heQorICAgICAgICBiZSByZWluc2VydGVkIGF0IGFub3RoZXIgcG9pbnQgaW4gdGhlIHRyZWUsIGJ1dCB3aWxsIG5vdCBiZQorICAgICAgICBkaXNwbGF5ZWQuIFRoZSByb290IGl0ZW0gbWF5IG5vdCBiZSBkZXRhY2hlZC4iIiIKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYuX3csICJkZXRhY2giLCBpdGVtcykKKworCisgICAgZGVmIGV4aXN0cyhzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiUmV0dXJucyBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgaXRlbSBpcyBwcmVzZW50IGluIHRoZSB0cmVlLAorICAgICAgICBGYWxzZSBvdGhlcndpc2UuIiIiCisgICAgICAgIHJldHVybiBib29sKHNlbGYudGsuY2FsbChzZWxmLl93LCAiZXhpc3RzIiwgaXRlbSkpCisKKworICAgIGRlZiBmb2N1cyhzZWxmLCBpdGVtPU5vbmUpOgorICAgICAgICAiIiJJZiBpdGVtIGlzIHNwZWNpZmllZCwgc2V0cyB0aGUgZm9jdXMgaXRlbSB0byBpdGVtLiBPdGhlcndpc2UsCisgICAgICAgIHJldHVybnMgdGhlIGN1cnJlbnQgZm9jdXMgaXRlbSwgb3IgJycgaWYgdGhlcmUgaXMgbm9uZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiZm9jdXMiLCBpdGVtKQorCisKKyAgICBkZWYgaGVhZGluZyhzZWxmLCBjb2x1bW4sIG9wdGlvbj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3IgbW9kaWZ5IHRoZSBoZWFkaW5nIG9wdGlvbnMgZm9yIHRoZSBzcGVjaWZpZWQgY29sdW1uLgorCisgICAgICAgIElmIGt3IGlzIG5vdCBnaXZlbiwgcmV0dXJucyBhIGRpY3Qgb2YgdGhlIGhlYWRpbmcgb3B0aW9uIHZhbHVlcy4gSWYKKyAgICAgICAgb3B0aW9uIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24gaXMgcmV0dXJuZWQuCisgICAgICAgIE90aGVyd2lzZSwgc2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuCisKKyAgICAgICAgVmFsaWQgb3B0aW9ucy92YWx1ZXMgYXJlOgorICAgICAgICAgICAgdGV4dDogdGV4dAorICAgICAgICAgICAgICAgIFRoZSB0ZXh0IHRvIGRpc3BsYXkgaW4gdGhlIGNvbHVtbiBoZWFkaW5nCisgICAgICAgICAgICBpbWFnZTogaW1hZ2VfbmFtZQorICAgICAgICAgICAgICAgIFNwZWNpZmllcyBhbiBpbWFnZSB0byBkaXNwbGF5IHRvIHRoZSByaWdodCBvZiB0aGUgY29sdW1uCisgICAgICAgICAgICAgICAgaGVhZGluZworICAgICAgICAgICAgYW5jaG9yOiBhbmNob3IKKyAgICAgICAgICAgICAgICBTcGVjaWZpZXMgaG93IHRoZSBoZWFkaW5nIHRleHQgc2hvdWxkIGJlIGFsaWduZWQuIE9uZSBvZgorICAgICAgICAgICAgICAgIHRoZSBzdGFuZGFyZCBUayBhbmNob3IgdmFsdWVzCisgICAgICAgICAgICBjb21tYW5kOiBjYWxsYmFjaworICAgICAgICAgICAgICAgIEEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIHRoZSBoZWFkaW5nIGxhYmVsIGlzCisgICAgICAgICAgICAgICAgcHJlc3NlZC4KKworICAgICAgICBUbyBjb25maWd1cmUgdGhlIHRyZWUgY29sdW1uIGhlYWRpbmcsIGNhbGwgdGhpcyB3aXRoIGNvbHVtbiA9ICIjMCIgIiIiCisgICAgICAgIGNtZCA9IGt3LmdldCgnY29tbWFuZCcpCisgICAgICAgIGlmIGNtZCBhbmQgbm90IGlzaW5zdGFuY2UoY21kLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICMgY2FsbGJhY2sgbm90IHJlZ2lzdGVyZWQgeWV0LCBkbyBpdCBub3cKKyAgICAgICAgICAgIGt3Wydjb21tYW5kJ10gPSBzZWxmLm1hc3Rlci5yZWdpc3RlcihjbWQsIHNlbGYuX3N1YnN0aXR1dGUpCisKKyAgICAgICAgaWYgb3B0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAga3dbb3B0aW9uXSA9IE5vbmUKKworICAgICAgICByZXR1cm4gX3ZhbF9vcl9kaWN0KGt3LCBzZWxmLnRrLmNhbGwsIHNlbGYuX3csICdoZWFkaW5nJywgY29sdW1uKQorCisKKyAgICBkZWYgaWRlbnRpZnkoc2VsZiwgY29tcG9uZW50LCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJucyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzcGVjaWZpZWQgY29tcG9uZW50IHVuZGVyIHRoZQorICAgICAgICBwb2ludCBnaXZlbiBieSB4IGFuZCB5LCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIG5vIHN1Y2ggY29tcG9uZW50CisgICAgICAgIGlzIHByZXNlbnQgYXQgdGhhdCBwb3NpdGlvbi4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAiaWRlbnRpZnkiLCBjb21wb25lbnQsIHgsIHkpCisKKworICAgIGRlZiBpZGVudGlmeV9yb3coc2VsZiwgeSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGl0ZW0gSUQgb2YgdGhlIGl0ZW0gYXQgcG9zaXRpb24geS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaWRlbnRpZnkoInJvdyIsIDAsIHkpCisKKworICAgIGRlZiBpZGVudGlmeV9jb2x1bW4oc2VsZiwgeCk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGRhdGEgY29sdW1uIGlkZW50aWZpZXIgb2YgdGhlIGNlbGwgYXQgcG9zaXRpb24geC4KKworICAgICAgICBUaGUgdHJlZSBjb2x1bW4gaGFzIElEICMwLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5pZGVudGlmeSgiY29sdW1uIiwgeCwgMCkKKworCisgICAgZGVmIGlkZW50aWZ5X3JlZ2lvbihzZWxmLCB4LCB5KToKKyAgICAgICAgIiIiUmV0dXJucyBvbmUgb2Y6CisKKyAgICAgICAgaGVhZGluZzogVHJlZSBoZWFkaW5nIGFyZWEuCisgICAgICAgIHNlcGFyYXRvcjogU3BhY2UgYmV0d2VlbiB0d28gY29sdW1ucyBoZWFkaW5nczsKKyAgICAgICAgdHJlZTogVGhlIHRyZWUgYXJlYS4KKyAgICAgICAgY2VsbDogQSBkYXRhIGNlbGwuCisKKyAgICAgICAgKiBBdmFpbGFiaWxpdHk6IFRrIDguNiIiIgorICAgICAgICByZXR1cm4gc2VsZi5pZGVudGlmeSgicmVnaW9uIiwgeCwgeSkKKworCisgICAgZGVmIGlkZW50aWZ5X2VsZW1lbnQoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGVsZW1lbnQgYXQgcG9zaXRpb24geCwgeS4KKworICAgICAgICAqIEF2YWlsYWJpbGl0eTogVGsgOC42IiIiCisgICAgICAgIHJldHVybiBzZWxmLmlkZW50aWZ5KCJlbGVtZW50IiwgeCwgeSkKKworCisgICAgZGVmIGluZGV4KHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpbnRlZ2VyIGluZGV4IG9mIGl0ZW0gd2l0aGluIGl0cyBwYXJlbnQncyBsaXN0CisgICAgICAgIG9mIGNoaWxkcmVuLiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbmRleCIsIGl0ZW0pCisKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgcGFyZW50LCBpbmRleCwgaWlkPU5vbmUsICoqa3cpOgorICAgICAgICAiIiJDcmVhdGVzIGEgbmV3IGl0ZW0gYW5kIHJldHVybiB0aGUgaXRlbSBpZGVudGlmaWVyIG9mIHRoZSBuZXdseQorICAgICAgICBjcmVhdGVkIGl0ZW0uCisKKyAgICAgICAgcGFyZW50IGlzIHRoZSBpdGVtIElEIG9mIHRoZSBwYXJlbnQgaXRlbSwgb3IgdGhlIGVtcHR5IHN0cmluZworICAgICAgICB0byBjcmVhdGUgYSBuZXcgdG9wLWxldmVsIGl0ZW0uIGluZGV4IGlzIGFuIGludGVnZXIsIG9yIHRoZSB2YWx1ZQorICAgICAgICBlbmQsIHNwZWNpZnlpbmcgd2hlcmUgaW4gdGhlIGxpc3Qgb2YgcGFyZW50J3MgY2hpbGRyZW4gdG8gaW5zZXJ0CisgICAgICAgIHRoZSBuZXcgaXRlbS4gSWYgaW5kZXggaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIHRoZSBuZXcgbm9kZQorICAgICAgICBpcyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nLCBpZiBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KKyAgICAgICAgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGNoaWxkcmVuLCBpdCBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kLiBJZiBpaWQKKyAgICAgICAgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHRoZSBpdGVtIGlkZW50aWZpZXIsIGlpZCBtdXN0IG5vdAorICAgICAgICBhbHJlYWR5IGV4aXN0IGluIHRoZSB0cmVlLiBPdGhlcndpc2UsIGEgbmV3IHVuaXF1ZSBpZGVudGlmaWVyCisgICAgICAgIGlzIGdlbmVyYXRlZC4iIiIKKyAgICAgICAgb3B0cyA9IF9mb3JtYXRfb3B0ZGljdChrdykKKyAgICAgICAgaWYgaWlkOgorICAgICAgICAgICAgcmVzID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbnNlcnQiLCBwYXJlbnQsIGluZGV4LAorICAgICAgICAgICAgICAgICItaWQiLCBpaWQsICpvcHRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICJpbnNlcnQiLCBwYXJlbnQsIGluZGV4LCAqb3B0cykKKworICAgICAgICByZXR1cm4gcmVzCisKKworICAgIGRlZiBpdGVtKHNlbGYsIGl0ZW0sIG9wdGlvbj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3IgbW9kaWZ5IHRoZSBvcHRpb25zIGZvciB0aGUgc3BlY2lmaWVkIGl0ZW0uCisKKyAgICAgICAgSWYgbm8gb3B0aW9ucyBhcmUgZ2l2ZW4sIGEgZGljdCB3aXRoIG9wdGlvbnMvdmFsdWVzIGZvciB0aGUgaXRlbQorICAgICAgICBpcyByZXR1cm5lZC4gSWYgb3B0aW9uIGlzIHNwZWNpZmllZCB0aGVuIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24KKyAgICAgICAgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgc2V0cyB0aGUgb3B0aW9ucyB0byB0aGUgY29ycmVzcG9uZGluZworICAgICAgICB2YWx1ZXMgYXMgZ2l2ZW4gYnkga3cuIiIiCisgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCisgICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgIml0ZW0iLCBpdGVtKQorCisKKyAgICBkZWYgbW92ZShzZWxmLCBpdGVtLCBwYXJlbnQsIGluZGV4KToKKyAgICAgICAgIiIiTW92ZXMgaXRlbSB0byBwb3NpdGlvbiBpbmRleCBpbiBwYXJlbnQncyBsaXN0IG9mIGNoaWxkcmVuLgorCisgICAgICAgIEl0IGlzIGlsbGVnYWwgdG8gbW92ZSBhbiBpdGVtIHVuZGVyIG9uZSBvZiBpdHMgZGVzY2VuZGFudHMuIElmCisgICAgICAgIGluZGV4IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB6ZXJvLCBpdGVtIGlzIG1vdmVkIHRvIHRoZQorICAgICAgICBiZWdpbm5pbmcsIGlmIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuLAorICAgICAgICBpdCBpcyBtb3ZlZCB0byB0aGUgZW5kLiBJZiBpdGVtIHdhcyBkZXRhY2hlZCBpdCBpcyByZWF0dGFjaGVkLiIiIgorICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZi5fdywgIm1vdmUiLCBpdGVtLCBwYXJlbnQsIGluZGV4KQorCisgICAgcmVhdHRhY2ggPSBtb3ZlICMgQSBzZW5zaWJsZSBtZXRob2QgbmFtZSBmb3IgcmVhdHRhY2hpbmcgZGV0YWNoZWQgaXRlbXMKKworCisgICAgZGVmIG5leHQoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgaXRlbSdzIG5leHQgc2libGluZywgb3IgJycgaWYgaXRlbQorICAgICAgICBpcyB0aGUgbGFzdCBjaGlsZCBvZiBpdHMgcGFyZW50LiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJuZXh0IiwgaXRlbSkKKworCisgICAgZGVmIHBhcmVudChzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgSUQgb2YgdGhlIHBhcmVudCBvZiBpdGVtLCBvciAnJyBpZiBpdGVtIGlzIGF0IHRoZQorICAgICAgICB0b3AgbGV2ZWwgb2YgdGhlIGhpZXJhcmNoeS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAicGFyZW50IiwgaXRlbSkKKworCisgICAgZGVmIHByZXYoc2VsZiwgaXRlbSk6CisgICAgICAgICIiIlJldHVybnMgdGhlIGlkZW50aWZpZXIgb2YgaXRlbSdzIHByZXZpb3VzIHNpYmxpbmcsIG9yICcnIGlmCisgICAgICAgIGl0ZW0gaXMgdGhlIGZpcnN0IGNoaWxkIG9mIGl0cyBwYXJlbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZi5fdywgInByZXYiLCBpdGVtKQorCisKKyAgICBkZWYgc2VlKHNlbGYsIGl0ZW0pOgorICAgICAgICAiIiJFbnN1cmUgdGhhdCBpdGVtIGlzIHZpc2libGUuCisKKyAgICAgICAgU2V0cyBhbGwgb2YgaXRlbSdzIGFuY2VzdG9ycyBvcGVuIG9wdGlvbiB0byBUcnVlLCBhbmQgc2Nyb2xscworICAgICAgICB0aGUgd2lkZ2V0IGlmIG5lY2Vzc2FyeSBzbyB0aGF0IGl0ZW0gaXMgd2l0aGluIHRoZSB2aXNpYmxlCisgICAgICAgIHBvcnRpb24gb2YgdGhlIHRyZWUuIiIiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLl93LCAic2VlIiwgaXRlbSkKKworCisgICAgZGVmIHNlbGVjdGlvbihzZWxmLCBzZWxvcD1Ob25lLCBpdGVtcz1Ob25lKToKKyAgICAgICAgIiIiSWYgc2Vsb3AgaXMgbm90IHNwZWNpZmllZCwgcmV0dXJucyBzZWxlY3RlZCBpdGVtcy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLl93LCAic2VsZWN0aW9uIiwgc2Vsb3AsIGl0ZW1zKQorCisKKyAgICBkZWYgc2VsZWN0aW9uX3NldChzZWxmLCBpdGVtcyk6CisgICAgICAgICIiIml0ZW1zIGJlY29tZXMgdGhlIG5ldyBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuc2VsZWN0aW9uKCJzZXQiLCBpdGVtcykKKworCisgICAgZGVmIHNlbGVjdGlvbl9hZGQoc2VsZiwgaXRlbXMpOgorICAgICAgICAiIiJBZGQgaXRlbXMgdG8gdGhlIHNlbGVjdGlvbi4iIiIKKyAgICAgICAgc2VsZi5zZWxlY3Rpb24oImFkZCIsIGl0ZW1zKQorCisKKyAgICBkZWYgc2VsZWN0aW9uX3JlbW92ZShzZWxmLCBpdGVtcyk6CisgICAgICAgICIiIlJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzZWxlY3Rpb24uIiIiCisgICAgICAgIHNlbGYuc2VsZWN0aW9uKCJyZW1vdmUiLCBpdGVtcykKKworCisgICAgZGVmIHNlbGVjdGlvbl90b2dnbGUoc2VsZiwgaXRlbXMpOgorICAgICAgICAiIiJUb2dnbGUgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBlYWNoIGl0ZW0gaW4gaXRlbXMuIiIiCisgICAgICAgIHNlbGYuc2VsZWN0aW9uKCJ0b2dnbGUiLCBpdGVtcykKKworCisgICAgZGVmIHNldChzZWxmLCBpdGVtLCBjb2x1bW49Tm9uZSwgdmFsdWU9Tm9uZSk6CisgICAgICAgICIiIldpdGggb25lIGFyZ3VtZW50LCByZXR1cm5zIGEgZGljdGlvbmFyeSBvZiBjb2x1bW4vdmFsdWUgcGFpcnMKKyAgICAgICAgZm9yIHRoZSBzcGVjaWZpZWQgaXRlbS4gV2l0aCB0d28gYXJndW1lbnRzLCByZXR1cm5zIHRoZSBjdXJyZW50CisgICAgICAgIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY29sdW1uLiBXaXRoIHRocmVlIGFyZ3VtZW50cywgc2V0cyB0aGUKKyAgICAgICAgdmFsdWUgb2YgZ2l2ZW4gY29sdW1uIGluIGdpdmVuIGl0ZW0gdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4iIiIKKyAgICAgICAgcmVzID0gc2VsZi50ay5jYWxsKHNlbGYuX3csICJzZXQiLCBpdGVtLCBjb2x1bW4sIHZhbHVlKQorICAgICAgICBpZiBjb2x1bW4gaXMgTm9uZSBhbmQgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfZGljdF9mcm9tX3RjbHR1cGxlKHJlcywgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcmVzCisKKworICAgIGRlZiB0YWdfYmluZChzZWxmLCB0YWduYW1lLCBzZXF1ZW5jZT1Ob25lLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgIiIiQmluZCBhIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gZXZlbnQgc2VxdWVuY2UgdG8gdGhlIHRhZyB0YWduYW1lLgorICAgICAgICBXaGVuIGFuIGV2ZW50IGlzIGRlbGl2ZXJlZCB0byBhbiBpdGVtLCB0aGUgY2FsbGJhY2tzIGZvciBlYWNoCisgICAgICAgIG9mIHRoZSBpdGVtJ3MgdGFncyBvcHRpb24gYXJlIGNhbGxlZC4iIiIKKyAgICAgICAgc2VsZi5fYmluZCgoc2VsZi5fdywgInRhZyIsICJiaW5kIiwgdGFnbmFtZSksIHNlcXVlbmNlLCBjYWxsYmFjaywgYWRkPTApCisKKworICAgIGRlZiB0YWdfY29uZmlndXJlKHNlbGYsIHRhZ25hbWUsIG9wdGlvbj1Ob25lLCAqKmt3KToKKyAgICAgICAgIiIiUXVlcnkgb3IgbW9kaWZ5IHRoZSBvcHRpb25zIGZvciB0aGUgc3BlY2lmaWVkIHRhZ25hbWUuCisKKyAgICAgICAgSWYga3cgaXMgbm90IGdpdmVuLCByZXR1cm5zIGEgZGljdCBvZiB0aGUgb3B0aW9uIHNldHRpbmdzIGZvciB0YWduYW1lLgorICAgICAgICBJZiBvcHRpb24gaXMgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhhdCBvcHRpb24gZm9yIHRoZQorICAgICAgICBzcGVjaWZpZWQgdGFnbmFtZS4gT3RoZXJ3aXNlLCBzZXRzIHRoZSBvcHRpb25zIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIHZhbHVlcyBmb3IgdGhlIGdpdmVuIHRhZ25hbWUuIiIiCisgICAgICAgIGlmIG9wdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGt3W29wdGlvbl0gPSBOb25lCisgICAgICAgIHJldHVybiBfdmFsX29yX2RpY3Qoa3csIHNlbGYudGsuY2FsbCwgc2VsZi5fdywgInRhZyIsICJjb25maWd1cmUiLAorICAgICAgICAgICAgdGFnbmFtZSkKKworCisgICAgZGVmIHRhZ19oYXMoc2VsZiwgdGFnbmFtZSwgaXRlbT1Ob25lKToKKyAgICAgICAgIiIiSWYgaXRlbSBpcyBzcGVjaWZpZWQsIHJldHVybnMgMSBvciAwIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQorICAgICAgICBzcGVjaWZpZWQgaXRlbSBoYXMgdGhlIGdpdmVuIHRhZ25hbWUuIE90aGVyd2lzZSwgcmV0dXJucyBhIGxpc3Qgb2YKKyAgICAgICAgYWxsIGl0ZW1zIHdoaWNoIGhhdmUgdGhlIHNwZWNpZmllZCB0YWcuCisKKyAgICAgICAgKiBBdmFpbGFiaWxpdHk6IFRrIDguNiIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKHNlbGYuX3csICJ0YWciLCAiaGFzIiwgdGFnbmFtZSwgaXRlbSkKKworCisjIEV4dGVuc2lvbnMKKworY2xhc3MgTGFiZWxlZFNjYWxlKEZyYW1lLCBvYmplY3QpOgorICAgICIiIkEgVHRrIFNjYWxlIHdpZGdldCB3aXRoIGEgVHRrIExhYmVsIHdpZGdldCBpbmRpY2F0aW5nIGl0cworICAgIGN1cnJlbnQgdmFsdWUuCisKKyAgICBUaGUgVHRrIFNjYWxlIGNhbiBiZSBhY2Nlc3NlZCB0aHJvdWdoIGluc3RhbmNlLnNjYWxlLCBhbmQgVHRrIExhYmVsCisgICAgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggaW5zdGFuY2UubGFiZWwiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFyaWFibGU9Tm9uZSwgZnJvbV89MCwgdG89MTAsICoqa3cpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYW4gaG9yaXpvbnRhbCBMYWJlbGVkU2NhbGUgd2l0aCBwYXJlbnQgbWFzdGVyLCBhCisgICAgICAgIHZhcmlhYmxlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgVHRrIFNjYWxlIHdpZGdldCBhbmQgaXRzIHJhbmdlLgorICAgICAgICBJZiB2YXJpYWJsZSBpcyBub3Qgc3BlY2lmaWVkLCBhIFRraW50ZXIuSW50VmFyIGlzIGNyZWF0ZWQuCisKKyAgICAgICAgV0lER0VULVNQRUNJRklDIE9QVElPTlMKKworICAgICAgICAgICAgY29tcG91bmQ6ICd0b3AnIG9yICdib3R0b20nCisgICAgICAgICAgICAgICAgU3BlY2lmaWVzIGhvdyB0byBkaXNwbGF5IHRoZSBsYWJlbCByZWxhdGl2ZSB0byB0aGUgc2NhbGUuCisgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gJ3RvcCcuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9sYWJlbF90b3AgPSBrdy5wb3AoJ2NvbXBvdW5kJywgJ3RvcCcpID09ICd0b3AnCisKKyAgICAgICAgRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCAqKmt3KQorICAgICAgICBzZWxmLl92YXJpYWJsZSA9IHZhcmlhYmxlIG9yIFRraW50ZXIuSW50VmFyKG1hc3RlcikKKyAgICAgICAgc2VsZi5fdmFyaWFibGUuc2V0KGZyb21fKQorICAgICAgICBzZWxmLl9sYXN0X3ZhbGlkID0gZnJvbV8KKworICAgICAgICBzZWxmLmxhYmVsID0gTGFiZWwoc2VsZikKKyAgICAgICAgc2VsZi5zY2FsZSA9IFNjYWxlKHNlbGYsIHZhcmlhYmxlPXNlbGYuX3ZhcmlhYmxlLCBmcm9tXz1mcm9tXywgdG89dG8pCisgICAgICAgIHNlbGYuc2NhbGUuYmluZCgnPDxSYW5nZUNoYW5nZWQ+PicsIHNlbGYuX2FkanVzdCkKKworICAgICAgICAjIHBvc2l0aW9uIHNjYWxlIGFuZCBsYWJlbCBhY2NvcmRpbmcgdG8gdGhlIGNvbXBvdW5kIG9wdGlvbgorICAgICAgICBzY2FsZV9zaWRlID0gJ2JvdHRvbScgaWYgc2VsZi5fbGFiZWxfdG9wIGVsc2UgJ3RvcCcKKyAgICAgICAgbGFiZWxfc2lkZSA9ICd0b3AnIGlmIHNjYWxlX3NpZGUgPT0gJ2JvdHRvbScgZWxzZSAnYm90dG9tJworICAgICAgICBzZWxmLnNjYWxlLnBhY2soc2lkZT1zY2FsZV9zaWRlLCBmaWxsPSd4JykKKyAgICAgICAgdG1wID0gTGFiZWwoc2VsZikucGFjayhzaWRlPWxhYmVsX3NpZGUpICMgcGxhY2UgaG9sZGVyCisgICAgICAgIHNlbGYubGFiZWwucGxhY2UoYW5jaG9yPSduJyBpZiBsYWJlbF9zaWRlID09ICd0b3AnIGVsc2UgJ3MnKQorCisgICAgICAgICMgdXBkYXRlIHRoZSBsYWJlbCBhcyBzY2FsZSBvciB2YXJpYWJsZSBjaGFuZ2VzCisgICAgICAgIHNlbGYuX190cmFjZWNiID0gc2VsZi5fdmFyaWFibGUudHJhY2VfdmFyaWFibGUoJ3cnLCBzZWxmLl9hZGp1c3QpCisgICAgICAgIHNlbGYuYmluZCgnPENvbmZpZ3VyZT4nLCBzZWxmLl9hZGp1c3QpCisgICAgICAgIHNlbGYuYmluZCgnPE1hcD4nLCBzZWxmLl9hZGp1c3QpCisKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJEZXN0cm95IHRoaXMgd2lkZ2V0IGFuZCBwb3NzaWJseSBpdHMgYXNzb2NpYXRlZCB2YXJpYWJsZS4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fdmFyaWFibGUudHJhY2VfdmRlbGV0ZSgndycsIHNlbGYuX190cmFjZWNiKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIHdpZGdldCBoYXMgYmVlbiBkZXN0cm95ZWQgYWxyZWFkeQorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVsIHNlbGYuX3ZhcmlhYmxlCisgICAgICAgICAgICBGcmFtZS5kZXN0cm95KHNlbGYpCisKKworICAgIGRlZiBfYWRqdXN0KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiQWRqdXN0IHRoZSBsYWJlbCBwb3NpdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHNjYWxlLiIiIgorICAgICAgICBkZWYgYWRqdXN0X2xhYmVsKCk6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9pZGxldGFza3MoKSAjICJmb3JjZSIgc2NhbGUgcmVkcmF3CisKKyAgICAgICAgICAgIHgsIHkgPSBzZWxmLnNjYWxlLmNvb3JkcygpCisgICAgICAgICAgICBpZiBzZWxmLl9sYWJlbF90b3A6CisgICAgICAgICAgICAgICAgeSA9IHNlbGYuc2NhbGUud2luZm9feSgpIC0gc2VsZi5sYWJlbC53aW5mb19yZXFoZWlnaHQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5ID0gc2VsZi5zY2FsZS53aW5mb19yZXFoZWlnaHQoKSArIHNlbGYubGFiZWwud2luZm9fcmVxaGVpZ2h0KCkKKworICAgICAgICAgICAgc2VsZi5sYWJlbC5wbGFjZV9jb25maWd1cmUoeD14LCB5PXkpCisKKyAgICAgICAgZnJvbV8sIHRvID0gc2VsZi5zY2FsZVsnZnJvbSddLCBzZWxmLnNjYWxlWyd0byddCisgICAgICAgIGlmIHRvIDwgZnJvbV86CisgICAgICAgICAgICBmcm9tXywgdG8gPSB0bywgZnJvbV8KKyAgICAgICAgbmV3dmFsID0gc2VsZi5fdmFyaWFibGUuZ2V0KCkKKyAgICAgICAgaWYgbm90IGZyb21fIDw9IG5ld3ZhbCA8PSB0bzoKKyAgICAgICAgICAgICMgdmFsdWUgb3V0c2lkZSByYW5nZSwgc2V0IHZhbHVlIGJhY2sgdG8gdGhlIGxhc3QgdmFsaWQgb25lCisgICAgICAgICAgICBzZWxmLnZhbHVlID0gc2VsZi5fbGFzdF92YWxpZAorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5fbGFzdF92YWxpZCA9IG5ld3ZhbAorICAgICAgICBzZWxmLmxhYmVsWyd0ZXh0J10gPSBuZXd2YWwKKyAgICAgICAgc2VsZi5hZnRlcl9pZGxlKGFkanVzdF9sYWJlbCkKKworCisgICAgZGVmIF9nZXRfdmFsdWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBjdXJyZW50IHNjYWxlIHZhbHVlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdmFyaWFibGUuZ2V0KCkKKworCisgICAgZGVmIF9zZXRfdmFsdWUoc2VsZiwgdmFsKToKKyAgICAgICAgIiIiU2V0IG5ldyBzY2FsZSB2YWx1ZS4iIiIKKyAgICAgICAgc2VsZi5fdmFyaWFibGUuc2V0KHZhbCkKKworCisgICAgdmFsdWUgPSBwcm9wZXJ0eShfZ2V0X3ZhbHVlLCBfc2V0X3ZhbHVlKQorCisKK2NsYXNzIE9wdGlvbk1lbnUoTWVudWJ1dHRvbik6CisgICAgIiIiVGhlbWVkIE9wdGlvbk1lbnUsIGJhc2VkIGFmdGVyIFRraW50ZXIncyBPcHRpb25NZW51LCB3aGljaCBhbGxvd3MKKyAgICB0aGUgdXNlciB0byBzZWxlY3QgYSB2YWx1ZSBmcm9tIGEgbWVudS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHZhcmlhYmxlLCBkZWZhdWx0PU5vbmUsICp2YWx1ZXMsICoqa3dhcmdzKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgdGhlbWVkIE9wdGlvbk1lbnUgd2lkZ2V0IHdpdGggbWFzdGVyIGFzIHRoZSBwYXJlbnQsCisgICAgICAgIHRoZSByZXNvdXJjZSB0ZXh0dmFyaWFibGUgc2V0IHRvIHZhcmlhYmxlLCB0aGUgaW5pdGlhbGx5IHNlbGVjdGVkCisgICAgICAgIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIsIHRoZSBtZW51IHZhbHVlcyBnaXZlbiBieQorICAgICAgICAqdmFsdWVzIGFuZCBhZGRpdGlvbmFsIGtleXdvcmRzLgorCisgICAgICAgIFdJREdFVC1TUEVDSUZJQyBPUFRJT05TCisKKyAgICAgICAgICAgIHN0eWxlOiBzdHlsZW5hbWUKKyAgICAgICAgICAgICAgICBNZW51YnV0dG9uIHN0eWxlLgorICAgICAgICAgICAgZGlyZWN0aW9uOiAnYWJvdmUnLCAnYmVsb3cnLCAnbGVmdCcsICdyaWdodCcsIG9yICdmbHVzaCcKKyAgICAgICAgICAgICAgICBNZW51YnV0dG9uIGRpcmVjdGlvbi4KKyAgICAgICAgICAgIGNvbW1hbmQ6IGNhbGxiYWNrCisgICAgICAgICAgICAgICAgQSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBhZnRlciBzZWxlY3RpbmcgYW4gaXRlbS4KKyAgICAgICAgIiIiCisgICAgICAgIGt3ID0geyd0ZXh0dmFyaWFibGUnOiB2YXJpYWJsZSwgJ3N0eWxlJzoga3dhcmdzLnBvcCgnc3R5bGUnLCBOb25lKSwKKyAgICAgICAgICAgICAgJ2RpcmVjdGlvbic6IGt3YXJncy5wb3AoJ2RpcmVjdGlvbicsIE5vbmUpfQorICAgICAgICBNZW51YnV0dG9uLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgKiprdykKKyAgICAgICAgc2VsZlsnbWVudSddID0gVGtpbnRlci5NZW51KHNlbGYsIHRlYXJvZmY9RmFsc2UpCisKKyAgICAgICAgc2VsZi5fdmFyaWFibGUgPSB2YXJpYWJsZQorICAgICAgICBzZWxmLl9jYWxsYmFjayA9IGt3YXJncy5wb3AoJ2NvbW1hbmQnLCBOb25lKQorICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICByYWlzZSBUa2ludGVyLlRjbEVycm9yKCd1bmtub3duIG9wdGlvbiAtJXMnICUgKAorICAgICAgICAgICAgICAgIGt3YXJncy5pdGVya2V5cygpLm5leHQoKSkpCisKKyAgICAgICAgc2VsZi5zZXRfbWVudShkZWZhdWx0LCAqdmFsdWVzKQorCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaXRlbSk6CisgICAgICAgIGlmIGl0ZW0gPT0gJ21lbnUnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZXRvd2lkZ2V0KE1lbnVidXR0b24uX19nZXRpdGVtX18oc2VsZiwgaXRlbSkpCisKKyAgICAgICAgcmV0dXJuIE1lbnVidXR0b24uX19nZXRpdGVtX18oc2VsZiwgaXRlbSkKKworCisgICAgZGVmIHNldF9tZW51KHNlbGYsIGRlZmF1bHQ9Tm9uZSwgKnZhbHVlcyk6CisgICAgICAgICIiIkJ1aWxkIGEgbmV3IG1lbnUgb2YgcmFkaW9idXR0b25zIHdpdGggKnZhbHVlcyBhbmQgb3B0aW9uYWxseQorICAgICAgICBhIGRlZmF1bHQgdmFsdWUuIiIiCisgICAgICAgIG1lbnUgPSBzZWxmWydtZW51J10KKyAgICAgICAgbWVudS5kZWxldGUoMCwgJ2VuZCcpCisgICAgICAgIGZvciB2YWwgaW4gdmFsdWVzOgorICAgICAgICAgICAgbWVudS5hZGRfcmFkaW9idXR0b24obGFiZWw9dmFsLAorICAgICAgICAgICAgICAgIGNvbW1hbmQ9VGtpbnRlci5fc2V0aXQoc2VsZi5fdmFyaWFibGUsIHZhbCwgc2VsZi5fY2FsbGJhY2spKQorCisgICAgICAgIGlmIGRlZmF1bHQ6CisgICAgICAgICAgICBzZWxmLl92YXJpYWJsZS5zZXQoZGVmYXVsdCkKKworCisgICAgZGVmIGRlc3Ryb3koc2VsZik6CisgICAgICAgICIiIkRlc3Ryb3kgdGhpcyB3aWRnZXQgYW5kIGl0cyBhc3NvY2lhdGVkIHZhcmlhYmxlLiIiIgorICAgICAgICBkZWwgc2VsZi5fdmFyaWFibGUKKyAgICAgICAgTWVudWJ1dHRvbi5kZXN0cm95KHNlbGYpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90dGsucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFjMzJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90dGsucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFjMzJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHRrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90dXJ0bGUucHkgYi9saWIvcHl0aG9uMi43L2xpYi10ay90dXJ0bGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk1NDA1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliLXRrL3R1cnRsZS5weQpAQCAtMCwwICsxLDQwMzUgQEAKKyMKKyMgdHVydGxlLnB5OiBhIFRraW50ZXIgYmFzZWQgdHVydGxlIGdyYXBoaWNzIG1vZHVsZSBmb3IgUHl0aG9uCisjIFZlcnNpb24gMS4wLjEgLSAyNC4gOS4gMjAwOQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgLSAyMDEwICBHcmVnb3IgTGluZ2wKKyMgZW1haWw6IGdsaW5nbEBhb24uYXQKKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKKworIiIiCitUdXJ0bGUgZ3JhcGhpY3MgaXMgYSBwb3B1bGFyIHdheSBmb3IgaW50cm9kdWNpbmcgcHJvZ3JhbW1pbmcgdG8KK2tpZHMuIEl0IHdhcyBwYXJ0IG9mIHRoZSBvcmlnaW5hbCBMb2dvIHByb2dyYW1taW5nIGxhbmd1YWdlIGRldmVsb3BlZAorYnkgV2FsbHkgRmV1cnppZyBhbmQgU2V5bW91ciBQYXBlcnQgaW4gMTk2Ni4KKworSW1hZ2luZSBhIHJvYm90aWMgdHVydGxlIHN0YXJ0aW5nIGF0ICgwLCAwKSBpbiB0aGUgeC15IHBsYW5lLiBBZnRlciBhbiBgYGltcG9ydCB0dXJ0bGVgYCwgZ2l2ZSBpdAordGhlIGNvbW1hbmQgdHVydGxlLmZvcndhcmQoMTUpLCBhbmQgaXQgbW92ZXMgKG9uLXNjcmVlbiEpIDE1IHBpeGVscyBpbgordGhlIGRpcmVjdGlvbiBpdCBpcyBmYWNpbmcsIGRyYXdpbmcgYSBsaW5lIGFzIGl0IG1vdmVzLiBHaXZlIGl0IHRoZQorY29tbWFuZCB0dXJ0bGUucmlnaHQoMjUpLCBhbmQgaXQgcm90YXRlcyBpbi1wbGFjZSAyNSBkZWdyZWVzIGNsb2Nrd2lzZS4KKworQnkgY29tYmluaW5nIHRvZ2V0aGVyIHRoZXNlIGFuZCBzaW1pbGFyIGNvbW1hbmRzLCBpbnRyaWNhdGUgc2hhcGVzIGFuZAorcGljdHVyZXMgY2FuIGVhc2lseSBiZSBkcmF3bi4KKworLS0tLS0gdHVydGxlLnB5CisKK1RoaXMgbW9kdWxlIGlzIGFuIGV4dGVuZGVkIHJlaW1wbGVtZW50YXRpb24gb2YgdHVydGxlLnB5IGZyb20gdGhlCitQeXRob24gc3RhbmRhcmQgZGlzdHJpYnV0aW9uIHVwIHRvIFB5dGhvbiAyLjUuIChTZWU6IGh0dHA6Ly93d3cucHl0aG9uLm9yZykKKworSXQgdHJpZXMgdG8ga2VlcCB0aGUgbWVyaXRzIG9mIHR1cnRsZS5weSBhbmQgdG8gYmUgKG5lYXJseSkgMTAwJQorY29tcGF0aWJsZSB3aXRoIGl0LiBUaGlzIG1lYW5zIGluIHRoZSBmaXJzdCBwbGFjZSB0byBlbmFibGUgdGhlCitsZWFybmluZyBwcm9ncmFtbWVyIHRvIHVzZSBhbGwgdGhlIGNvbW1hbmRzLCBjbGFzc2VzIGFuZCBtZXRob2RzCitpbnRlcmFjdGl2ZWx5IHdoZW4gdXNpbmcgdGhlIG1vZHVsZSBmcm9tIHdpdGhpbiBJRExFIHJ1biB3aXRoCit0aGUgLW4gc3dpdGNoLgorCitSb3VnaGx5IGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzIGFkZGVkOgorCistIEJldHRlciBhbmltYXRpb24gb2YgdGhlIHR1cnRsZSBtb3ZlbWVudHMsIGVzcGVjaWFsbHkgb2YgdHVybmluZyB0aGUKKyAgdHVydGxlLiBTbyB0aGUgdHVydGxlcyBjYW4gbW9yZSBlYXNpbHkgYmUgdXNlZCBhcyBhIHZpc3VhbCBmZWVkYmFjaworICBpbnN0cnVtZW50IGJ5IHRoZSAoYmVnaW5uaW5nKSBwcm9ncmFtbWVyLgorCistIERpZmZlcmVudCB0dXJ0bGUgc2hhcGVzLCBnaWYtaW1hZ2VzIGFzIHR1cnRsZSBzaGFwZXMsIHVzZXIgZGVmaW5lZAorICBhbmQgdXNlciBjb250cm9sbGFibGUgdHVydGxlIHNoYXBlcywgYW1vbmcgdGhlbSBjb21wb3VuZAorICAobXVsdGljb2xvcmVkKSBzaGFwZXMuIFR1cnRsZSBzaGFwZXMgY2FuIGJlIHN0cmV0Y2hlZCBhbmQgdGlsdGVkLCB3aGljaAorICBtYWtlcyB0dXJ0bGVzIHZlcnkgdmVyc2F0aWxlIGdlb21ldHJpY2FsIG9iamVjdHMuCisKKy0gRmluZSBjb250cm9sIG92ZXIgdHVydGxlIG1vdmVtZW50IGFuZCBzY3JlZW4gdXBkYXRlcyB2aWEgZGVsYXkoKSwKKyAgYW5kIGVuaGFuY2VkIHRyYWNlcigpIGFuZCBzcGVlZCgpIG1ldGhvZHMuCisKKy0gQWxpYXNlcyBmb3IgdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBjb21tYW5kcywgbGlrZSBmZCBmb3IgZm9yd2FyZCBldGMuLAorICBmb2xsb3dpbmcgdGhlIGVhcmx5IExvZ28gdHJhZGl0aW9ucy4gVGhpcyByZWR1Y2VzIHRoZSBib3Jpbmcgd29yayBvZgorICB0eXBpbmcgbG9uZyBzZXF1ZW5jZXMgb2YgY29tbWFuZHMsIHdoaWNoIG9mdGVuIG9jY3VyIGluIGEgbmF0dXJhbCB3YXkKKyAgd2hlbiBraWRzIHRyeSB0byBwcm9ncmFtIGZhbmN5IHBpY3R1cmVzIG9uIHRoZWlyIGZpcnN0IGVuY291bnRlciB3aXRoCisgIHR1cnRsZSBncmFwaGljcy4KKworLSBUdXJ0bGVzIG5vdyBoYXZlIGFuIHVuZG8oKS1tZXRob2Qgd2l0aCBjb25maWd1cmFibGUgdW5kby1idWZmZXIuCisKKy0gU29tZSBzaW1wbGUgY29tbWFuZHMvbWV0aG9kcyBmb3IgY3JlYXRpbmcgZXZlbnQgZHJpdmVuIHByb2dyYW1zCisgIChtb3VzZS0sIGtleS0sIHRpbWVyLWV2ZW50cykuIEVzcGVjaWFsbHkgdXNlZnVsIGZvciBwcm9ncmFtbWluZyBnYW1lcy4KKworLSBBIHNjcm9sbGFibGUgQ2FudmFzIGNsYXNzLiBUaGUgZGVmYXVsdCBzY3JvbGxhYmxlIENhbnZhcyBjYW4gYmUKKyAgZXh0ZW5kZWQgaW50ZXJhY3RpdmVseSBhcyBuZWVkZWQgd2hpbGUgcGxheWluZyBhcm91bmQgd2l0aCB0aGUgdHVydGxlKHMpLgorCistIEEgVHVydGxlU2NyZWVuIGNsYXNzIHdpdGggbWV0aG9kcyBjb250cm9sbGluZyBiYWNrZ3JvdW5kIGNvbG9yIG9yCisgIGJhY2tncm91bmQgaW1hZ2UsIHdpbmRvdyBhbmQgY2FudmFzIHNpemUgYW5kIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlCisgIFR1cnRsZVNjcmVlbi4KKworLSBUaGVyZSBpcyBhIG1ldGhvZCwgc2V0d29ybGRjb29yZGluYXRlcygpLCB0byBpbnN0YWxsIGEgdXNlciBkZWZpbmVkCisgIGNvb3JkaW5hdGUtc3lzdGVtIGZvciB0aGUgVHVydGxlU2NyZWVuLgorCistIFRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgMi12ZWN0b3IgY2xhc3MgbmFtZWQgVmVjMkQsIGRlcml2ZWQgZnJvbSB0dXBsZS4KKyAgVGhpcyBjbGFzcyBpcyBwdWJsaWMsIHNvIGl0IGNhbiBiZSBpbXBvcnRlZCBieSB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbW1lciwKKyAgd2hpY2ggbWFrZXMgY2VydGFpbiB0eXBlcyBvZiBjb21wdXRhdGlvbnMgdmVyeSBuYXR1cmFsIGFuZCBjb21wYWN0LgorCistIEFwcGVhcmFuY2Ugb2YgdGhlIFR1cnRsZVNjcmVlbiBhbmQgdGhlIFR1cnRsZXMgYXQgc3RhcnR1cC9pbXBvcnQgY2FuIGJlCisgIGNvbmZpZ3VyZWQgYnkgbWVhbnMgb2YgYSB0dXJ0bGUuY2ZnIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBtaW1pY3MgdGhlIGFwcGVhcmFuY2Ugb2YgdGhlIG9sZCB0dXJ0bGUgbW9kdWxlLgorCistIElmIGNvbmZpZ3VyZWQgYXBwcm9wcmlhdGVseSB0aGUgbW9kdWxlIHJlYWRzIGluIGRvY3N0cmluZ3MgZnJvbSBhIGRvY3N0cmluZworICBkaWN0aW9uYXJ5IGluIHNvbWUgZGlmZmVyZW50IGxhbmd1YWdlLCBzdXBwbGllZCBzZXBhcmF0ZWx5ICBhbmQgcmVwbGFjZXMKKyAgdGhlIEVuZ2xpc2ggb25lcyBieSB0aG9zZSByZWFkIGluLiBUaGVyZSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24KKyAgd3JpdGVfZG9jc3RyaW5nZGljdCgpIHRvIHdyaXRlIGEgZGljdGlvbmFyeSB3aXRoIHRoZSBvcmlnaW5hbCAoRW5nbGlzaCkKKyAgZG9jc3RyaW5ncyB0byBkaXNjLCBzbyBpdCBjYW4gc2VydmUgYXMgYSB0ZW1wbGF0ZSBmb3IgdHJhbnNsYXRpb25zLgorCitCZWhpbmQgdGhlIHNjZW5lcyB0aGVyZSBhcmUgc29tZSBmZWF0dXJlcyBpbmNsdWRlZCB3aXRoIHBvc3NpYmxlCitleHRlbnNpb25zIGluIG1pbmQuIFRoZXNlIHdpbGwgYmUgY29tbWVudGVkIGFuZCBkb2N1bWVudGVkIGVsc2V3aGVyZS4KKworIiIiCisKK192ZXIgPSAidHVydGxlIDEuMGIxIC0gZm9yIFB5dGhvbiAyLjYgICAtICAzMC4gNS4gMjAwOCwgMTg6MDgiCisKKyNwcmludCBfdmVyCisKK2ltcG9ydCBUa2ludGVyIGFzIFRLCitpbXBvcnQgdHlwZXMKK2ltcG9ydCBtYXRoCitpbXBvcnQgdGltZQoraW1wb3J0IG9zCisKK2Zyb20gb3MucGF0aCBpbXBvcnQgaXNmaWxlLCBzcGxpdCwgam9pbgorZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorCitmcm9tIG1hdGggaW1wb3J0ICogICAgIyMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgdHVydGxlIG1vZHVsZQorCitfdGdfY2xhc3NlcyA9IFsnU2Nyb2xsZWRDYW52YXMnLCAnVHVydGxlU2NyZWVuJywgJ1NjcmVlbicsCisgICAgICAgICAgICAgICAnUmF3VHVydGxlJywgJ1R1cnRsZScsICdSYXdQZW4nLCAnUGVuJywgJ1NoYXBlJywgJ1ZlYzJEJ10KK190Z19zY3JlZW5fZnVuY3Rpb25zID0gWydhZGRzaGFwZScsICdiZ2NvbG9yJywgJ2JncGljJywgJ2J5ZScsCisgICAgICAgICdjbGVhcnNjcmVlbicsICdjb2xvcm1vZGUnLCAnZGVsYXknLCAnZXhpdG9uY2xpY2snLCAnZ2V0Y2FudmFzJywKKyAgICAgICAgJ2dldHNoYXBlcycsICdsaXN0ZW4nLCAnbW9kZScsICdvbmtleScsICdvbnNjcmVlbmNsaWNrJywgJ29udGltZXInLAorICAgICAgICAncmVnaXN0ZXJfc2hhcGUnLCAncmVzZXRzY3JlZW4nLCAnc2NyZWVuc2l6ZScsICdzZXR1cCcsCisgICAgICAgICdzZXR3b3JsZGNvb3JkaW5hdGVzJywgJ3RpdGxlJywgJ3RyYWNlcicsICd0dXJ0bGVzJywgJ3VwZGF0ZScsCisgICAgICAgICd3aW5kb3dfaGVpZ2h0JywgJ3dpbmRvd193aWR0aCddCitfdGdfdHVydGxlX2Z1bmN0aW9ucyA9IFsnYmFjaycsICdiYWNrd2FyZCcsICdiZWdpbl9maWxsJywgJ2JlZ2luX3BvbHknLCAnYmsnLAorICAgICAgICAnY2lyY2xlJywgJ2NsZWFyJywgJ2NsZWFyc3RhbXAnLCAnY2xlYXJzdGFtcHMnLCAnY2xvbmUnLCAnY29sb3InLAorICAgICAgICAnZGVncmVlcycsICdkaXN0YW5jZScsICdkb3QnLCAnZG93bicsICdlbmRfZmlsbCcsICdlbmRfcG9seScsICdmZCcsCisgICAgICAgICdmaWxsJywgJ2ZpbGxjb2xvcicsICdmb3J3YXJkJywgJ2dldF9wb2x5JywgJ2dldHBlbicsICdnZXRzY3JlZW4nLAorICAgICAgICAnZ2V0dHVydGxlJywgJ2dvdG8nLCAnaGVhZGluZycsICdoaWRldHVydGxlJywgJ2hvbWUnLCAnaHQnLCAnaXNkb3duJywKKyAgICAgICAgJ2lzdmlzaWJsZScsICdsZWZ0JywgJ2x0JywgJ29uY2xpY2snLCAnb25kcmFnJywgJ29ucmVsZWFzZScsICdwZCcsCisgICAgICAgICdwZW4nLCAncGVuY29sb3InLCAncGVuZG93bicsICdwZW5zaXplJywgJ3BlbnVwJywgJ3BvcycsICdwb3NpdGlvbicsCisgICAgICAgICdwdScsICdyYWRpYW5zJywgJ3JpZ2h0JywgJ3Jlc2V0JywgJ3Jlc2l6ZW1vZGUnLCAncnQnLAorICAgICAgICAnc2V0aCcsICdzZXRoZWFkaW5nJywgJ3NldHBvcycsICdzZXRwb3NpdGlvbicsICdzZXR0aWx0YW5nbGUnLAorICAgICAgICAnc2V0dW5kb2J1ZmZlcicsICdzZXR4JywgJ3NldHknLCAnc2hhcGUnLCAnc2hhcGVzaXplJywgJ3Nob3d0dXJ0bGUnLAorICAgICAgICAnc3BlZWQnLCAnc3QnLCAnc3RhbXAnLCAndGlsdCcsICd0aWx0YW5nbGUnLCAndG93YXJkcycsICd0cmFjZXInLAorICAgICAgICAndHVydGxlc2l6ZScsICd1bmRvJywgJ3VuZG9idWZmZXJlbnRyaWVzJywgJ3VwJywgJ3dpZHRoJywKKyAgICAgICAgJ3dpbmRvd19oZWlnaHQnLCAnd2luZG93X3dpZHRoJywgJ3dyaXRlJywgJ3hjb3InLCAneWNvciddCitfdGdfdXRpbGl0aWVzID0gWyd3cml0ZV9kb2NzdHJpbmdkaWN0JywgJ2RvbmUnLCAnbWFpbmxvb3AnXQorX21hdGhfZnVuY3Rpb25zID0gWydhY29zJywgJ2FzaW4nLCAnYXRhbicsICdhdGFuMicsICdjZWlsJywgJ2NvcycsICdjb3NoJywKKyAgICAgICAgJ2UnLCAnZXhwJywgJ2ZhYnMnLCAnZmxvb3InLCAnZm1vZCcsICdmcmV4cCcsICdoeXBvdCcsICdsZGV4cCcsICdsb2cnLAorICAgICAgICAnbG9nMTAnLCAnbW9kZicsICdwaScsICdwb3cnLCAnc2luJywgJ3NpbmgnLCAnc3FydCcsICd0YW4nLCAndGFuaCddCisKK19fYWxsX18gPSAoX3RnX2NsYXNzZXMgKyBfdGdfc2NyZWVuX2Z1bmN0aW9ucyArIF90Z190dXJ0bGVfZnVuY3Rpb25zICsKKyAgICAgICAgICAgX3RnX3V0aWxpdGllcyArIF9tYXRoX2Z1bmN0aW9ucykKKworX2FsaWFzX2xpc3QgPSBbJ2FkZHNoYXBlJywgJ2JhY2t3YXJkJywgJ2JrJywgJ2ZkJywgJ2h0JywgJ2x0JywgJ3BkJywgJ3BvcycsCisgICAgICAgICAgICAgICAncHUnLCAncnQnLCAnc2V0aCcsICdzZXRwb3MnLCAnc2V0cG9zaXRpb24nLCAnc3QnLAorICAgICAgICAgICAgICAgJ3R1cnRsZXNpemUnLCAndXAnLCAnd2lkdGgnXQorCitfQ0ZHID0geyJ3aWR0aCIgOiAwLjUsICAgICAgICAgICAgICAgIyBTY3JlZW4KKyAgICAgICAgImhlaWdodCIgOiAwLjc1LAorICAgICAgICAiY2FudndpZHRoIiA6IDQwMCwKKyAgICAgICAgImNhbnZoZWlnaHQiOiAzMDAsCisgICAgICAgICJsZWZ0cmlnaHQiOiBOb25lLAorICAgICAgICAidG9wYm90dG9tIjogTm9uZSwKKyAgICAgICAgIm1vZGUiOiAic3RhbmRhcmQiLCAgICAgICAgICAjIFR1cnRsZVNjcmVlbgorICAgICAgICAiY29sb3Jtb2RlIjogMS4wLAorICAgICAgICAiZGVsYXkiOiAxMCwKKyAgICAgICAgInVuZG9idWZmZXJzaXplIjogMTAwMCwgICAgICAjIFJhd1R1cnRsZQorICAgICAgICAic2hhcGUiOiAiY2xhc3NpYyIsCisgICAgICAgICJwZW5jb2xvciIgOiAiYmxhY2siLAorICAgICAgICAiZmlsbGNvbG9yIiA6ICJibGFjayIsCisgICAgICAgICJyZXNpemVtb2RlIiA6ICJub3Jlc2l6ZSIsCisgICAgICAgICJ2aXNpYmxlIiA6IFRydWUsCisgICAgICAgICJsYW5ndWFnZSI6ICJlbmdsaXNoIiwgICAgICAgICMgZG9jc3RyaW5ncworICAgICAgICAiZXhhbXBsZXR1cnRsZSI6ICJ0dXJ0bGUiLAorICAgICAgICAiZXhhbXBsZXNjcmVlbiI6ICJzY3JlZW4iLAorICAgICAgICAidGl0bGUiOiAiUHl0aG9uIFR1cnRsZSBHcmFwaGljcyIsCisgICAgICAgICJ1c2luZ19JRExFIjogRmFsc2UKKyAgICAgICB9CisKKyMjcHJpbnQgImN3ZDoiLCBvcy5nZXRjd2QoKQorIyNwcmludCAiX19maWxlX186IiwgX19maWxlX18KKyMjCisjI2RlZiBzaG93KGRpY3Rpb25hcnkpOgorIyMgICAgcHJpbnQgIj09PT09PT09PT09PT09PT09PT09PT09PT09IgorIyMgICAgZm9yIGtleSBpbiBzb3J0ZWQoZGljdGlvbmFyeS5rZXlzKCkpOgorIyMgICAgICAgIHByaW50IGtleSwgIjoiLCBkaWN0aW9uYXJ5W2tleV0KKyMjICAgIHByaW50ICI9PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyMjICAgIHByaW50CisKK2RlZiBjb25maWdfZGljdChmaWxlbmFtZSk6CisgICAgIiIiQ29udmVydCBjb250ZW50IG9mIGNvbmZpZy1maWxlIGludG8gZGljdGlvbmFyeS4iIiIKKyAgICBmID0gb3BlbihmaWxlbmFtZSwgInIiKQorICAgIGNmZ2xpbmVzID0gZi5yZWFkbGluZXMoKQorICAgIGYuY2xvc2UoKQorICAgIGNmZ2RpY3QgPSB7fQorICAgIGZvciBsaW5lIGluIGNmZ2xpbmVzOgorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgiIyIpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGxpbmUuc3BsaXQoIj0iKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwcmludCAiQmFkIGxpbmUgaW4gY29uZmlnLWZpbGUgJXM6XG4lcyIgJSAoZmlsZW5hbWUsbGluZSkKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGtleSA9IGtleS5zdHJpcCgpCisgICAgICAgIHZhbHVlID0gdmFsdWUuc3RyaXAoKQorICAgICAgICBpZiB2YWx1ZSBpbiBbIlRydWUiLCAiRmFsc2UiLCAiTm9uZSIsICInJyIsICciIiddOgorICAgICAgICAgICAgdmFsdWUgPSBldmFsKHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmICIuIiBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmbG9hdCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzICMgdmFsdWUgbmVlZCBub3QgYmUgY29udmVydGVkCisgICAgICAgIGNmZ2RpY3Rba2V5XSA9IHZhbHVlCisgICAgcmV0dXJuIGNmZ2RpY3QKKworZGVmIHJlYWRjb25maWcoY2ZnZGljdCk6CisgICAgIiIiUmVhZCBjb25maWctZmlsZXMsIGNoYW5nZSBjb25maWd1cmF0aW9uLWRpY3QgYWNjb3JkaW5nbHkuCisKKyAgICBJZiB0aGVyZSBpcyBhIHR1cnRsZS5jZmcgZmlsZSBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwKKyAgICByZWFkIGl0IGZyb20gdGhlcmUuIElmIHRoaXMgY29udGFpbnMgYW4gaW1wb3J0Y29uZmlnLXZhbHVlLAorICAgIHNheSAnbXl3YXknLCBjb25zdHJ1Y3QgZmlsZW5hbWUgdHVydGxlX21heXdheS5jZmcgZWxzZSB1c2UKKyAgICB0dXJ0bGUuY2ZnIGFuZCByZWFkIGl0IGZyb20gdGhlIGltcG9ydC1kaXJlY3RvcnksIHdoZXJlCisgICAgdHVydGxlLnB5IGlzIGxvY2F0ZWQuCisgICAgVXBkYXRlIGNvbmZpZ3VyYXRpb24gZGljdGlvbmFyeSBmaXJzdCBhY2NvcmRpbmcgdG8gY29uZmlnLWZpbGUsCisgICAgaW4gdGhlIGltcG9ydCBkaXJlY3RvcnksIHRoZW4gYWNjb3JkaW5nIHRvIGNvbmZpZy1maWxlIGluIHRoZQorICAgIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgICAgSWYgbm8gY29uZmlnLWZpbGUgaXMgZm91bmQsIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgdXNlZC4KKyAgICAiIiIKKyAgICBkZWZhdWx0X2NmZyA9ICJ0dXJ0bGUuY2ZnIgorICAgIGNmZ2RpY3QxID0ge30KKyAgICBjZmdkaWN0MiA9IHt9CisgICAgaWYgaXNmaWxlKGRlZmF1bHRfY2ZnKToKKyAgICAgICAgY2ZnZGljdDEgPSBjb25maWdfZGljdChkZWZhdWx0X2NmZykKKyAgICAgICAgI3ByaW50ICIxLiBMb2FkaW5nIGNvbmZpZy1maWxlICVzIGZyb206ICVzIiAlIChkZWZhdWx0X2NmZywgb3MuZ2V0Y3dkKCkpCisgICAgaWYgImltcG9ydGNvbmZpZyIgaW4gY2ZnZGljdDE6CisgICAgICAgIGRlZmF1bHRfY2ZnID0gInR1cnRsZV8lcy5jZmciICUgY2ZnZGljdDFbImltcG9ydGNvbmZpZyJdCisgICAgdHJ5OgorICAgICAgICBoZWFkLCB0YWlsID0gc3BsaXQoX19maWxlX18pCisgICAgICAgIGNmZ19maWxlMiA9IGpvaW4oaGVhZCwgZGVmYXVsdF9jZmcpCisgICAgZXhjZXB0OgorICAgICAgICBjZmdfZmlsZTIgPSAiIgorICAgIGlmIGlzZmlsZShjZmdfZmlsZTIpOgorICAgICAgICAjcHJpbnQgIjIuIExvYWRpbmcgY29uZmlnLWZpbGUgJXM6IiAlIGNmZ19maWxlMgorICAgICAgICBjZmdkaWN0MiA9IGNvbmZpZ19kaWN0KGNmZ19maWxlMikKKyMjICAgIHNob3coX0NGRykKKyMjICAgIHNob3coY2ZnZGljdDIpCisgICAgX0NGRy51cGRhdGUoY2ZnZGljdDIpCisjIyAgICBzaG93KF9DRkcpCisjIyAgICBzaG93KGNmZ2RpY3QxKQorICAgIF9DRkcudXBkYXRlKGNmZ2RpY3QxKQorIyMgICAgc2hvdyhfQ0ZHKQorCit0cnk6CisgICAgcmVhZGNvbmZpZyhfQ0ZHKQorZXhjZXB0OgorICAgIHByaW50ICJObyBjb25maWdmaWxlIHJlYWQsIHJlYXNvbiB1bmtub3duIgorCisKK2NsYXNzIFZlYzJEKHR1cGxlKToKKyAgICAiIiJBIDIgZGltZW5zaW9uYWwgdmVjdG9yIGNsYXNzLCB1c2VkIGFzIGEgaGVscGVyIGNsYXNzCisgICAgZm9yIGltcGxlbWVudGluZyB0dXJ0bGUgZ3JhcGhpY3MuCisgICAgTWF5IGJlIHVzZWZ1bCBmb3IgdHVydGxlIGdyYXBoaWNzIHByb2dyYW1zIGFsc28uCisgICAgRGVyaXZlZCBmcm9tIHR1cGxlLCBzbyBhIHZlY3RvciBpcyBhIHR1cGxlIQorCisgICAgUHJvdmlkZXMgKGZvciBhLCBiIHZlY3RvcnMsIGsgbnVtYmVyKToKKyAgICAgICBhK2IgdmVjdG9yIGFkZGl0aW9uCisgICAgICAgYS1iIHZlY3RvciBzdWJ0cmFjdGlvbgorICAgICAgIGEqYiBpbm5lciBwcm9kdWN0CisgICAgICAgayphIGFuZCBhKmsgbXVsdGlwbGljYXRpb24gd2l0aCBzY2FsYXIKKyAgICAgICB8YXwgYWJzb2x1dGUgdmFsdWUgb2YgYQorICAgICAgIGEucm90YXRlKGFuZ2xlKSByb3RhdGlvbgorICAgICIiIgorICAgIGRlZiBfX25ld19fKGNscywgeCwgeSk6CisgICAgICAgIHJldHVybiB0dXBsZS5fX25ld19fKGNscywgKHgsIHkpKQorICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFZlYzJEKHNlbGZbMF0rb3RoZXJbMF0sIHNlbGZbMV0rb3RoZXJbMV0pCisgICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBWZWMyRCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZlswXSpvdGhlclswXStzZWxmWzFdKm90aGVyWzFdCisgICAgICAgIHJldHVybiBWZWMyRChzZWxmWzBdKm90aGVyLCBzZWxmWzFdKm90aGVyKQorICAgIGRlZiBfX3JtdWxfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGludCkgb3IgaXNpbnN0YW5jZShvdGhlciwgZmxvYXQpOgorICAgICAgICAgICAgcmV0dXJuIFZlYzJEKHNlbGZbMF0qb3RoZXIsIHNlbGZbMV0qb3RoZXIpCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVmVjMkQoc2VsZlswXS1vdGhlclswXSwgc2VsZlsxXS1vdGhlclsxXSkKKyAgICBkZWYgX19uZWdfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFZlYzJEKC1zZWxmWzBdLCAtc2VsZlsxXSkKKyAgICBkZWYgX19hYnNfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmWzBdKioyICsgc2VsZlsxXSoqMikqKjAuNQorICAgIGRlZiByb3RhdGUoc2VsZiwgYW5nbGUpOgorICAgICAgICAiIiJyb3RhdGUgc2VsZiBjb3VudGVyY2xvY2t3aXNlIGJ5IGFuZ2xlCisgICAgICAgICIiIgorICAgICAgICBwZXJwID0gVmVjMkQoLXNlbGZbMV0sIHNlbGZbMF0pCisgICAgICAgIGFuZ2xlID0gYW5nbGUgKiBtYXRoLnBpIC8gMTgwLjAKKyAgICAgICAgYywgcyA9IG1hdGguY29zKGFuZ2xlKSwgbWF0aC5zaW4oYW5nbGUpCisgICAgICAgIHJldHVybiBWZWMyRChzZWxmWzBdKmMrcGVycFswXSpzLCBzZWxmWzFdKmMrcGVycFsxXSpzKQorICAgIGRlZiBfX2dldG5ld2FyZ3NfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmWzBdLCBzZWxmWzFdKQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIoJS4yZiwlLjJmKSIgJSBzZWxmCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgRnJvbSBoZXJlIHVwIHRvIGxpbmUgICAgOiBUa2ludGVyIC0gSW50ZXJmYWNlIGZvciB0dXJ0bGUucHkgICAgICAgICAgICAjIyMKKyMjIyBNYXkgYmUgcmVwbGFjZWQgYnkgYW4gaW50ZXJmYWNlIHRvIHNvbWUgZGlmZmVyZW50IGdyYXBoaWNzIHRvb2xraXQgICAgICMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMjIGhlbHBlciBmdW5jdGlvbnMgZm9yIFNjcm9sbGVkIENhbnZhcywgdG8gZm9yd2FyZCBDYW52YXMtbWV0aG9kcworIyMgdG8gU2Nyb2xsZWRDYW52YXMgY2xhc3MKKworZGVmIF9fbWV0aG9kRGljdChjbHMsIF9kaWN0KToKKyAgICAiIiJoZWxwZXIgZnVuY3Rpb24gZm9yIFNjcm9sbGVkIENhbnZhcyIiIgorICAgIGJhc2VMaXN0ID0gbGlzdChjbHMuX19iYXNlc19fKQorICAgIGJhc2VMaXN0LnJldmVyc2UoKQorICAgIGZvciBfc3VwZXIgaW4gYmFzZUxpc3Q6CisgICAgICAgIF9fbWV0aG9kRGljdChfc3VwZXIsIF9kaWN0KQorICAgIGZvciBrZXksIHZhbHVlIGluIGNscy5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICBpZiB0eXBlKHZhbHVlKSA9PSB0eXBlcy5GdW5jdGlvblR5cGU6CisgICAgICAgICAgICBfZGljdFtrZXldID0gdmFsdWUKKworZGVmIF9fbWV0aG9kcyhjbHMpOgorICAgICIiImhlbHBlciBmdW5jdGlvbiBmb3IgU2Nyb2xsZWQgQ2FudmFzIiIiCisgICAgX2RpY3QgPSB7fQorICAgIF9fbWV0aG9kRGljdChjbHMsIF9kaWN0KQorICAgIHJldHVybiBfZGljdC5rZXlzKCkKKworX19zdHJpbmdCb2R5ID0gKAorICAgICdkZWYgJShtZXRob2QpcyhzZWxmLCAqYXJncywgKiprdyk6IHJldHVybiAnICsKKyAgICAnc2VsZi4lKGF0dHJpYnV0ZSlzLiUobWV0aG9kKXMoKmFyZ3MsICoqa3cpJykKKworZGVmIF9fZm9yd2FyZG1ldGhvZHMoZnJvbUNsYXNzLCB0b0NsYXNzLCB0b1BhcnQsIGV4Y2x1ZGUgPSAoKSk6CisgICAgIiIiSGVscGVyIGZ1bmN0aW9ucyBmb3IgU2Nyb2xsZWQgQ2FudmFzLCB1c2VkIHRvIGZvcndhcmQKKyAgICBTY3JvbGxlZENhbnZhcy1tZXRob2RzIHRvIFRraW50ZXIuQ2FudmFzIGNsYXNzLgorICAgICIiIgorICAgIF9kaWN0ID0ge30KKyAgICBfX21ldGhvZERpY3QodG9DbGFzcywgX2RpY3QpCisgICAgZm9yIGV4IGluIF9kaWN0LmtleXMoKToKKyAgICAgICAgaWYgZXhbOjFdID09ICdfJyBvciBleFstMTpdID09ICdfJzoKKyAgICAgICAgICAgIGRlbCBfZGljdFtleF0KKyAgICBmb3IgZXggaW4gZXhjbHVkZToKKyAgICAgICAgaWYgZXggaW4gX2RpY3Q6CisgICAgICAgICAgICBkZWwgX2RpY3RbZXhdCisgICAgZm9yIGV4IGluIF9fbWV0aG9kcyhmcm9tQ2xhc3MpOgorICAgICAgICBpZiBleCBpbiBfZGljdDoKKyAgICAgICAgICAgIGRlbCBfZGljdFtleF0KKworICAgIGZvciBtZXRob2QsIGZ1bmMgaW4gX2RpY3QuaXRlbXMoKToKKyAgICAgICAgZCA9IHsnbWV0aG9kJzogbWV0aG9kLCAnZnVuYyc6IGZ1bmN9CisgICAgICAgIGlmIHR5cGUodG9QYXJ0KSA9PSB0eXBlcy5TdHJpbmdUeXBlOgorICAgICAgICAgICAgZXhlY1N0cmluZyA9IFwKKyAgICAgICAgICAgICAgICBfX3N0cmluZ0JvZHkgJSB7J21ldGhvZCcgOiBtZXRob2QsICdhdHRyaWJ1dGUnIDogdG9QYXJ0fQorICAgICAgICBleGVjIGV4ZWNTdHJpbmcgaW4gZAorICAgICAgICBmcm9tQ2xhc3MuX19kaWN0X19bbWV0aG9kXSA9IGRbbWV0aG9kXQorCisKK2NsYXNzIFNjcm9sbGVkQ2FudmFzKFRLLkZyYW1lKToKKyAgICAiIiJNb2RlbGVkIGFmdGVyIHRoZSBzY3JvbGxlZCBjYW52YXMgY2xhc3MgZnJvbSBHcmF5b25zJ3MgVGtpbnRlciBib29rLgorCisgICAgVXNlZCBhcyB0aGUgZGVmYXVsdCBjYW52YXMsIHdoaWNoIHBvcHMgdXAgYXV0b21hdGljYWxseSB3aGVuCisgICAgdXNpbmcgdHVydGxlIGdyYXBoaWNzIGZ1bmN0aW9ucyBvciB0aGUgVHVydGxlIGNsYXNzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZHRoPTUwMCwgaGVpZ2h0PTM1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZ3aWR0aD02MDAsIGNhbnZoZWlnaHQ9NTAwKToKKyAgICAgICAgVEsuRnJhbWUuX19pbml0X18oc2VsZiwgbWFzdGVyLCB3aWR0aD13aWR0aCwgaGVpZ2h0PWhlaWdodCkKKyAgICAgICAgc2VsZi5fcm9vdHdpbmRvdyA9IHNlbGYud2luZm9fdG9wbGV2ZWwoKQorICAgICAgICBzZWxmLndpZHRoLCBzZWxmLmhlaWdodCA9IHdpZHRoLCBoZWlnaHQKKyAgICAgICAgc2VsZi5jYW52d2lkdGgsIHNlbGYuY2FudmhlaWdodCA9IGNhbnZ3aWR0aCwgY2FudmhlaWdodAorICAgICAgICBzZWxmLmJnID0gIndoaXRlIgorICAgICAgICBzZWxmLl9jYW52YXMgPSBUSy5DYW52YXMobWFzdGVyLCB3aWR0aD13aWR0aCwgaGVpZ2h0PWhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJnPXNlbGYuYmcsIHJlbGllZj1USy5TVU5LRU4sIGJvcmRlcndpZHRoPTIpCisgICAgICAgIHNlbGYuaHNjcm9sbCA9IFRLLlNjcm9sbGJhcihtYXN0ZXIsIGNvbW1hbmQ9c2VsZi5fY2FudmFzLnh2aWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50PVRLLkhPUklaT05UQUwpCisgICAgICAgIHNlbGYudnNjcm9sbCA9IFRLLlNjcm9sbGJhcihtYXN0ZXIsIGNvbW1hbmQ9c2VsZi5fY2FudmFzLnl2aWV3KQorICAgICAgICBzZWxmLl9jYW52YXMuY29uZmlndXJlKHhzY3JvbGxjb21tYW5kPXNlbGYuaHNjcm9sbC5zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXNjcm9sbGNvbW1hbmQ9c2VsZi52c2Nyb2xsLnNldCkKKyAgICAgICAgc2VsZi5yb3djb25maWd1cmUoMCwgd2VpZ2h0PTEsIG1pbnNpemU9MCkKKyAgICAgICAgc2VsZi5jb2x1bW5jb25maWd1cmUoMCwgd2VpZ2h0PTEsIG1pbnNpemU9MCkKKyAgICAgICAgc2VsZi5fY2FudmFzLmdyaWQocGFkeD0xLCBpbl8gPSBzZWxmLCBwYWR5PTEsIHJvdz0wLAorICAgICAgICAgICAgICAgIGNvbHVtbj0wLCByb3dzcGFuPTEsIGNvbHVtbnNwYW49MSwgc3RpY2t5PSduZXdzJykKKyAgICAgICAgc2VsZi52c2Nyb2xsLmdyaWQocGFkeD0xLCBpbl8gPSBzZWxmLCBwYWR5PTEsIHJvdz0wLAorICAgICAgICAgICAgICAgIGNvbHVtbj0xLCByb3dzcGFuPTEsIGNvbHVtbnNwYW49MSwgc3RpY2t5PSduZXdzJykKKyAgICAgICAgc2VsZi5oc2Nyb2xsLmdyaWQocGFkeD0xLCBpbl8gPSBzZWxmLCBwYWR5PTEsIHJvdz0xLAorICAgICAgICAgICAgICAgIGNvbHVtbj0wLCByb3dzcGFuPTEsIGNvbHVtbnNwYW49MSwgc3RpY2t5PSduZXdzJykKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIHNlbGYuX3Jvb3R3aW5kb3cuYmluZCgnPENvbmZpZ3VyZT4nLCBzZWxmLm9uUmVzaXplKQorCisgICAgZGVmIHJlc2V0KHNlbGYsIGNhbnZ3aWR0aD1Ob25lLCBjYW52aGVpZ2h0PU5vbmUsIGJnID0gTm9uZSk6CisgICAgICAgICIiIkFkanVzdCBjYW52YXMgYW5kIHNjcm9sbGJhcnMgYWNjb3JkaW5nIHRvIGdpdmVuIGNhbnZhcyBzaXplLiIiIgorICAgICAgICBpZiBjYW52d2lkdGg6CisgICAgICAgICAgICBzZWxmLmNhbnZ3aWR0aCA9IGNhbnZ3aWR0aAorICAgICAgICBpZiBjYW52aGVpZ2h0OgorICAgICAgICAgICAgc2VsZi5jYW52aGVpZ2h0ID0gY2FudmhlaWdodAorICAgICAgICBpZiBiZzoKKyAgICAgICAgICAgIHNlbGYuYmcgPSBiZworICAgICAgICBzZWxmLl9jYW52YXMuY29uZmlnKGJnPWJnLAorICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xscmVnaW9uPSgtc2VsZi5jYW52d2lkdGgvLzIsIC1zZWxmLmNhbnZoZWlnaHQvLzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbnZ3aWR0aC8vMiwgc2VsZi5jYW52aGVpZ2h0Ly8yKSkKKyAgICAgICAgc2VsZi5fY2FudmFzLnh2aWV3X21vdmV0bygwLjUqKHNlbGYuY2FudndpZHRoIC0gc2VsZi53aWR0aCArIDMwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbnZ3aWR0aCkKKyAgICAgICAgc2VsZi5fY2FudmFzLnl2aWV3X21vdmV0bygwLjUqKHNlbGYuY2FudmhlaWdodC0gc2VsZi5oZWlnaHQgKyAzMCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbnZoZWlnaHQpCisgICAgICAgIHNlbGYuYWRqdXN0U2Nyb2xscygpCisKKworICAgIGRlZiBhZGp1c3RTY3JvbGxzKHNlbGYpOgorICAgICAgICAiIiIgQWRqdXN0IHNjcm9sbGJhcnMgYWNjb3JkaW5nIHRvIHdpbmRvdy0gYW5kIGNhbnZhcy1zaXplLgorICAgICAgICAiIiIKKyAgICAgICAgY3dpZHRoID0gc2VsZi5fY2FudmFzLndpbmZvX3dpZHRoKCkKKyAgICAgICAgY2hlaWdodCA9IHNlbGYuX2NhbnZhcy53aW5mb19oZWlnaHQoKQorICAgICAgICBzZWxmLl9jYW52YXMueHZpZXdfbW92ZXRvKDAuNSooc2VsZi5jYW52d2lkdGgtY3dpZHRoKS9zZWxmLmNhbnZ3aWR0aCkKKyAgICAgICAgc2VsZi5fY2FudmFzLnl2aWV3X21vdmV0bygwLjUqKHNlbGYuY2FudmhlaWdodC1jaGVpZ2h0KS9zZWxmLmNhbnZoZWlnaHQpCisgICAgICAgIGlmIGN3aWR0aCA8IHNlbGYuY2FudndpZHRoIG9yIGNoZWlnaHQgPCBzZWxmLmNhbnZoZWlnaHQ6CisgICAgICAgICAgICBzZWxmLmhzY3JvbGwuZ3JpZChwYWR4PTEsIGluXyA9IHNlbGYsIHBhZHk9MSwgcm93PTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW49MCwgcm93c3Bhbj0xLCBjb2x1bW5zcGFuPTEsIHN0aWNreT0nbmV3cycpCisgICAgICAgICAgICBzZWxmLnZzY3JvbGwuZ3JpZChwYWR4PTEsIGluXyA9IHNlbGYsIHBhZHk9MSwgcm93PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW49MSwgcm93c3Bhbj0xLCBjb2x1bW5zcGFuPTEsIHN0aWNreT0nbmV3cycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhzY3JvbGwuZ3JpZF9mb3JnZXQoKQorICAgICAgICAgICAgc2VsZi52c2Nyb2xsLmdyaWRfZm9yZ2V0KCkKKworICAgIGRlZiBvblJlc2l6ZShzZWxmLCBldmVudCk6CisgICAgICAgICIiInNlbGYtZXhwbGFuYXRvcnkiIiIKKyAgICAgICAgc2VsZi5hZGp1c3RTY3JvbGxzKCkKKworICAgIGRlZiBiYm94KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiICdmb3J3YXJkJyBtZXRob2QsIHdoaWNoIGNhbnZhcyBpdHNlbGYgaGFzIGluaGVyaXRlZC4uLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbnZhcy5iYm94KCphcmdzKQorCisgICAgZGVmIGNnZXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiICdmb3J3YXJkJyBtZXRob2QsIHdoaWNoIGNhbnZhcyBpdHNlbGYgaGFzIGluaGVyaXRlZC4uLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbnZhcy5jZ2V0KCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBjb25maWcoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiICdmb3J3YXJkJyBtZXRob2QsIHdoaWNoIGNhbnZhcyBpdHNlbGYgaGFzIGluaGVyaXRlZC4uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2FudmFzLmNvbmZpZygqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgYmluZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIgJ2ZvcndhcmQnIG1ldGhvZCwgd2hpY2ggY2FudmFzIGl0c2VsZiBoYXMgaW5oZXJpdGVkLi4uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jYW52YXMuYmluZCgqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgdW5iaW5kKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIiAnZm9yd2FyZCcgbWV0aG9kLCB3aGljaCBjYW52YXMgaXRzZWxmIGhhcyBpbmhlcml0ZWQuLi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NhbnZhcy51bmJpbmQoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGZvY3VzX2ZvcmNlKHNlbGYpOgorICAgICAgICAiIiIgJ2ZvcndhcmQnIG1ldGhvZCwgd2hpY2ggY2FudmFzIGl0c2VsZiBoYXMgaW5oZXJpdGVkLi4uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jYW52YXMuZm9jdXNfZm9yY2UoKQorCitfX2ZvcndhcmRtZXRob2RzKFNjcm9sbGVkQ2FudmFzLCBUSy5DYW52YXMsICdfY2FudmFzJykKKworCitjbGFzcyBfUm9vdChUSy5Uayk6CisgICAgIiIiUm9vdCBjbGFzcyBmb3IgU2NyZWVuIGJhc2VkIG9uIFRraW50ZXIuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBUSy5Uay5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIHNldHVwY2FudmFzKHNlbGYsIHdpZHRoLCBoZWlnaHQsIGN3aWR0aCwgY2hlaWdodCk6CisgICAgICAgIHNlbGYuX2NhbnZhcyA9IFNjcm9sbGVkQ2FudmFzKHNlbGYsIHdpZHRoLCBoZWlnaHQsIGN3aWR0aCwgY2hlaWdodCkKKyAgICAgICAgc2VsZi5fY2FudmFzLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQorCisgICAgZGVmIF9nZXRjYW52YXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYW52YXMKKworICAgIGRlZiBzZXRfZ2VvbWV0cnkoc2VsZiwgd2lkdGgsIGhlaWdodCwgc3RhcnR4LCBzdGFydHkpOgorICAgICAgICBzZWxmLmdlb21ldHJ5KCIlZHglZCUrZCUrZCIlKHdpZHRoLCBoZWlnaHQsIHN0YXJ0eCwgc3RhcnR5KSkKKworICAgIGRlZiBvbmRlc3Ryb3koc2VsZiwgZGVzdHJveSk6CisgICAgICAgIHNlbGYud21fcHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBkZXN0cm95KQorCisgICAgZGVmIHdpbl93aWR0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYud2luZm9fc2NyZWVud2lkdGgoKQorCisgICAgZGVmIHdpbl9oZWlnaHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLndpbmZvX3NjcmVlbmhlaWdodCgpCisKK0NhbnZhcyA9IFRLLkNhbnZhcworCisKK2NsYXNzIFR1cnRsZVNjcmVlbkJhc2Uob2JqZWN0KToKKyAgICAiIiJQcm92aWRlIHRoZSBiYXNpYyBncmFwaGljcyBmdW5jdGlvbmFsaXR5LgorICAgICAgIEludGVyZmFjZSBiZXR3ZWVuIFRraW50ZXIgYW5kIHR1cnRsZS5weS4KKworICAgICAgIFRvIHBvcnQgdHVydGxlLnB5IHRvIHNvbWUgZGlmZmVyZW50IGdyYXBoaWNzIHRvb2xraXQKKyAgICAgICBhIGNvcnJlc3BvbmRpbmcgVHVydGxlU2NyZWVuQmFzZSBjbGFzcyBoYXMgdG8gYmUgaW1wbGVtZW50ZWQuCisgICAgIiIiCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9ibGFua2ltYWdlKCk6CisgICAgICAgICIiInJldHVybiBhIGJsYW5rIGltYWdlIG9iamVjdAorICAgICAgICAiIiIKKyAgICAgICAgaW1nID0gVEsuUGhvdG9JbWFnZSh3aWR0aD0xLCBoZWlnaHQ9MSkKKyAgICAgICAgaW1nLmJsYW5rKCkKKyAgICAgICAgcmV0dXJuIGltZworCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaW1hZ2UoZmlsZW5hbWUpOgorICAgICAgICAiIiJyZXR1cm4gYW4gaW1hZ2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlCisgICAgICAgIGltYWdlZGF0YSBmcm9tIGEgZ2lmLWZpbGUgbmFtZWQgZmlsZW5hbWUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gVEsuUGhvdG9JbWFnZShmaWxlPWZpbGVuYW1lKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGN2KToKKyAgICAgICAgc2VsZi5jdiA9IGN2CisgICAgICAgIGlmIGlzaW5zdGFuY2UoY3YsIFNjcm9sbGVkQ2FudmFzKToKKyAgICAgICAgICAgIHcgPSBzZWxmLmN2LmNhbnZ3aWR0aAorICAgICAgICAgICAgaCA9IHNlbGYuY3YuY2FudmhlaWdodAorICAgICAgICBlbHNlOiAgIyBleHBlY3RlZDogb3JkaW5hcnkgVEsuQ2FudmFzCisgICAgICAgICAgICB3ID0gaW50KHNlbGYuY3YuY2dldCgid2lkdGgiKSkKKyAgICAgICAgICAgIGggPSBpbnQoc2VsZi5jdi5jZ2V0KCJoZWlnaHQiKSkKKyAgICAgICAgICAgIHNlbGYuY3YuY29uZmlnKHNjcm9sbHJlZ2lvbiA9ICgtdy8vMiwgLWgvLzIsIHcvLzIsIGgvLzIgKSkKKyAgICAgICAgc2VsZi5jYW52d2lkdGggPSB3CisgICAgICAgIHNlbGYuY2FudmhlaWdodCA9IGgKKyAgICAgICAgc2VsZi54c2NhbGUgPSBzZWxmLnlzY2FsZSA9IDEuMAorCisgICAgZGVmIF9jcmVhdGVwb2x5KHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYW4gaW52aXNpYmxlIHBvbHlnb24gaXRlbSBvbiBjYW52YXMgc2VsZi5jdikKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmN2LmNyZWF0ZV9wb2x5Z29uKCgwLCAwLCAwLCAwLCAwLCAwKSwgZmlsbD0iIiwgb3V0bGluZT0iIikKKworICAgIGRlZiBfZHJhd3BvbHkoc2VsZiwgcG9seWl0ZW0sIGNvb3JkbGlzdCwgZmlsbD1Ob25lLAorICAgICAgICAgICAgICAgICAgb3V0bGluZT1Ob25lLCB3aWR0aD1Ob25lLCB0b3A9RmFsc2UpOgorICAgICAgICAiIiJDb25maWd1cmUgcG9seWdvbml0ZW0gcG9seWl0ZW0gYWNjb3JkaW5nIHRvIHByb3ZpZGVkCisgICAgICAgIGFyZ3VtZW50czoKKyAgICAgICAgY29vcmRsaXN0IGlzIHNlcXVlbmNlIG9mIGNvb3JkaW5hdGVzCisgICAgICAgIGZpbGwgaXMgZmlsbGluZyBjb2xvcgorICAgICAgICBvdXRsaW5lIGlzIG91dGxpbmUgY29sb3IKKyAgICAgICAgdG9wIGlzIGEgYm9vbGVhbiB2YWx1ZSwgd2hpY2ggc3BlY2lmaWVzIGlmIHBvbHlpdGVtCisgICAgICAgIHdpbGwgYmUgcHV0IG9uIHRvcCBvZiB0aGUgY2FudmFzJyBkaXNwbGF5bGlzdCBzbyBpdAorICAgICAgICB3aWxsIG5vdCBiZSBjb3ZlcmVkIGJ5IG90aGVyIGl0ZW1zLgorICAgICAgICAiIiIKKyAgICAgICAgY2wgPSBbXQorICAgICAgICBmb3IgeCwgeSBpbiBjb29yZGxpc3Q6CisgICAgICAgICAgICBjbC5hcHBlbmQoeCAqIHNlbGYueHNjYWxlKQorICAgICAgICAgICAgY2wuYXBwZW5kKC15ICogc2VsZi55c2NhbGUpCisgICAgICAgIHNlbGYuY3YuY29vcmRzKHBvbHlpdGVtLCAqY2wpCisgICAgICAgIGlmIGZpbGwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmN2Lml0ZW1jb25maWd1cmUocG9seWl0ZW0sIGZpbGw9ZmlsbCkKKyAgICAgICAgaWYgb3V0bGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YuaXRlbWNvbmZpZ3VyZShwb2x5aXRlbSwgb3V0bGluZT1vdXRsaW5lKQorICAgICAgICBpZiB3aWR0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YuaXRlbWNvbmZpZ3VyZShwb2x5aXRlbSwgd2lkdGg9d2lkdGgpCisgICAgICAgIGlmIHRvcDoKKyAgICAgICAgICAgIHNlbGYuY3YudGFnX3JhaXNlKHBvbHlpdGVtKQorCisgICAgZGVmIF9jcmVhdGVsaW5lKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYW4gaW52aXNpYmxlIGxpbmUgaXRlbSBvbiBjYW52YXMgc2VsZi5jdikKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmN2LmNyZWF0ZV9saW5lKDAsIDAsIDAsIDAsIGZpbGw9IiIsIHdpZHRoPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHN0eWxlID0gVEsuUk9VTkQpCisKKyAgICBkZWYgX2RyYXdsaW5lKHNlbGYsIGxpbmVpdGVtLCBjb29yZGxpc3Q9Tm9uZSwKKyAgICAgICAgICAgICAgICAgIGZpbGw9Tm9uZSwgd2lkdGg9Tm9uZSwgdG9wPUZhbHNlKToKKyAgICAgICAgIiIiQ29uZmlndXJlIGxpbmVpdGVtIGFjY29yZGluZyB0byBwcm92aWRlZCBhcmd1bWVudHM6CisgICAgICAgIGNvb3JkbGlzdCBpcyBzZXF1ZW5jZSBvZiBjb29yZGluYXRlcworICAgICAgICBmaWxsIGlzIGRyYXdpbmcgY29sb3IKKyAgICAgICAgd2lkdGggaXMgd2lkdGggb2YgZHJhd24gbGluZS4KKyAgICAgICAgdG9wIGlzIGEgYm9vbGVhbiB2YWx1ZSwgd2hpY2ggc3BlY2lmaWVzIGlmIHBvbHlpdGVtCisgICAgICAgIHdpbGwgYmUgcHV0IG9uIHRvcCBvZiB0aGUgY2FudmFzJyBkaXNwbGF5bGlzdCBzbyBpdAorICAgICAgICB3aWxsIG5vdCBiZSBjb3ZlcmVkIGJ5IG90aGVyIGl0ZW1zLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgY29vcmRsaXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2wgPSBbXQorICAgICAgICAgICAgZm9yIHgsIHkgaW4gY29vcmRsaXN0OgorICAgICAgICAgICAgICAgIGNsLmFwcGVuZCh4ICogc2VsZi54c2NhbGUpCisgICAgICAgICAgICAgICAgY2wuYXBwZW5kKC15ICogc2VsZi55c2NhbGUpCisgICAgICAgICAgICBzZWxmLmN2LmNvb3JkcyhsaW5laXRlbSwgKmNsKQorICAgICAgICBpZiBmaWxsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi5pdGVtY29uZmlndXJlKGxpbmVpdGVtLCBmaWxsPWZpbGwpCisgICAgICAgIGlmIHdpZHRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi5pdGVtY29uZmlndXJlKGxpbmVpdGVtLCB3aWR0aD13aWR0aCkKKyAgICAgICAgaWYgdG9wOgorICAgICAgICAgICAgc2VsZi5jdi50YWdfcmFpc2UobGluZWl0ZW0pCisKKyAgICBkZWYgX2RlbGV0ZShzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiRGVsZXRlIGdyYXBoaWNzIGl0ZW0gZnJvbSBjYW52YXMuCisgICAgICAgIElmIGl0ZW0gaXMiYWxsIiBkZWxldGUgYWxsIGdyYXBoaWNzIGl0ZW1zLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jdi5kZWxldGUoaXRlbSkKKworICAgIGRlZiBfdXBkYXRlKHNlbGYpOgorICAgICAgICAiIiJSZWRyYXcgZ3JhcGhpY3MgaXRlbXMgb24gY2FudmFzCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmN2LnVwZGF0ZSgpCisKKyAgICBkZWYgX2RlbGF5KHNlbGYsIGRlbGF5KToKKyAgICAgICAgIiIiRGVsYXkgc3Vic2VxdWVudCBjYW52YXMgYWN0aW9ucyBmb3IgZGVsYXkgbXMuIiIiCisgICAgICAgIHNlbGYuY3YuYWZ0ZXIoZGVsYXkpCisKKyAgICBkZWYgX2lzY29sb3JzdHJpbmcoc2VsZiwgY29sb3IpOgorICAgICAgICAiIiJDaGVjayBpZiB0aGUgc3RyaW5nIGNvbG9yIGlzIGEgbGVnYWwgVGtpbnRlciBjb2xvciBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZ2IgPSBzZWxmLmN2LndpbmZvX3JnYihjb2xvcikKKyAgICAgICAgICAgIG9rID0gVHJ1ZQorICAgICAgICBleGNlcHQgVEsuVGNsRXJyb3I6CisgICAgICAgICAgICBvayA9IEZhbHNlCisgICAgICAgIHJldHVybiBvaworCisgICAgZGVmIF9iZ2NvbG9yKHNlbGYsIGNvbG9yPU5vbmUpOgorICAgICAgICAiIiJTZXQgY2FudmFzJyBiYWNrZ3JvdW5kY29sb3IgaWYgY29sb3IgaXMgbm90IE5vbmUsCisgICAgICAgIGVsc2UgcmV0dXJuIGJhY2tncm91bmRjb2xvci4iIiIKKyAgICAgICAgaWYgY29sb3IgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmN2LmNvbmZpZyhiZyA9IGNvbG9yKQorICAgICAgICAgICAgc2VsZi5fdXBkYXRlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmN2LmNnZXQoImJnIikKKworICAgIGRlZiBfd3JpdGUoc2VsZiwgcG9zLCB0eHQsIGFsaWduLCBmb250LCBwZW5jb2xvcik6CisgICAgICAgICIiIldyaXRlIHR4dCBhdCBwb3MgaW4gY2FudmFzIHdpdGggc3BlY2lmaWVkIGZvbnQKKyAgICAgICAgYW5kIGNvbG9yLgorICAgICAgICBSZXR1cm4gdGV4dCBpdGVtIGFuZCB4LWNvb3JkIG9mIHJpZ2h0IGJvdHRvbSBjb3JuZXIKKyAgICAgICAgb2YgdGV4dCdzIGJvdW5kaW5nIGJveC4iIiIKKyAgICAgICAgeCwgeSA9IHBvcworICAgICAgICB4ID0geCAqIHNlbGYueHNjYWxlCisgICAgICAgIHkgPSB5ICogc2VsZi55c2NhbGUKKyAgICAgICAgYW5jaG9yID0geyJsZWZ0Ijoic3ciLCAiY2VudGVyIjoicyIsICJyaWdodCI6InNlIiB9CisgICAgICAgIGl0ZW0gPSBzZWxmLmN2LmNyZWF0ZV90ZXh0KHgtMSwgLXksIHRleHQgPSB0eHQsIGFuY2hvciA9IGFuY2hvclthbGlnbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IHBlbmNvbG9yLCBmb250ID0gZm9udCkKKyAgICAgICAgeDAsIHkwLCB4MSwgeTEgPSBzZWxmLmN2LmJib3goaXRlbSkKKyAgICAgICAgc2VsZi5jdi51cGRhdGUoKQorICAgICAgICByZXR1cm4gaXRlbSwgeDEtMQorCisjIyAgICBkZWYgX2RvdChzZWxmLCBwb3MsIHNpemUsIGNvbG9yKToKKyMjICAgICAgICAiIiJtYXkgYmUgaW1wbGVtZW50ZWQgZm9yIHNvbWUgb3RoZXIgZ3JhcGhpY3MgdG9vbGtpdCIiIgorCisgICAgZGVmIF9vbmNsaWNrKHNlbGYsIGl0ZW0sIGZ1biwgbnVtPTEsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCBmdW4gdG8gbW91c2UtY2xpY2sgZXZlbnQgb24gdHVydGxlLgorICAgICAgICBmdW4gbXVzdCBiZSBhIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIGNvb3JkaW5hdGVzCisgICAgICAgIG9mIHRoZSBjbGlja2VkIHBvaW50IG9uIHRoZSBjYW52YXMuCisgICAgICAgIG51bSwgdGhlIG51bWJlciBvZiB0aGUgbW91c2UtYnV0dG9uIGRlZmF1bHRzIHRvIDEKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZ1biBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi50YWdfdW5iaW5kKGl0ZW0sICI8QnV0dG9uLSVzPiIgJSBudW0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWYgZXZlbnRmdW4oZXZlbnQpOgorICAgICAgICAgICAgICAgIHgsIHkgPSAoc2VsZi5jdi5jYW52YXN4KGV2ZW50LngpL3NlbGYueHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgLXNlbGYuY3YuY2FudmFzeShldmVudC55KS9zZWxmLnlzY2FsZSkKKyAgICAgICAgICAgICAgICBmdW4oeCwgeSkKKyAgICAgICAgICAgIHNlbGYuY3YudGFnX2JpbmQoaXRlbSwgIjxCdXR0b24tJXM+IiAlIG51bSwgZXZlbnRmdW4sIGFkZCkKKworICAgIGRlZiBfb25yZWxlYXNlKHNlbGYsIGl0ZW0sIGZ1biwgbnVtPTEsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCBmdW4gdG8gbW91c2UtYnV0dG9uLXJlbGVhc2UgZXZlbnQgb24gdHVydGxlLgorICAgICAgICBmdW4gbXVzdCBiZSBhIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIGNvb3JkaW5hdGVzCisgICAgICAgIG9mIHRoZSBwb2ludCBvbiB0aGUgY2FudmFzIHdoZXJlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZC4KKyAgICAgICAgbnVtLCB0aGUgbnVtYmVyIG9mIHRoZSBtb3VzZS1idXR0b24gZGVmYXVsdHMgdG8gMQorCisgICAgICAgIElmIGEgdHVydGxlIGlzIGNsaWNrZWQsIGZpcnN0IF9vbmNsaWNrLWV2ZW50IHdpbGwgYmUgcGVyZm9ybWVkLAorICAgICAgICB0aGVuIF9vbnNjcmVlbnNjbGljay1ldmVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZ1biBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi50YWdfdW5iaW5kKGl0ZW0sICI8QnV0dG9uJXMtQnV0dG9uUmVsZWFzZT4iICUgbnVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmIGV2ZW50ZnVuKGV2ZW50KToKKyAgICAgICAgICAgICAgICB4LCB5ID0gKHNlbGYuY3YuY2FudmFzeChldmVudC54KS9zZWxmLnhzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLmN2LmNhbnZhc3koZXZlbnQueSkvc2VsZi55c2NhbGUpCisgICAgICAgICAgICAgICAgZnVuKHgsIHkpCisgICAgICAgICAgICBzZWxmLmN2LnRhZ19iaW5kKGl0ZW0sICI8QnV0dG9uJXMtQnV0dG9uUmVsZWFzZT4iICUgbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudGZ1biwgYWRkKQorCisgICAgZGVmIF9vbmRyYWcoc2VsZiwgaXRlbSwgZnVuLCBudW09MSwgYWRkPU5vbmUpOgorICAgICAgICAiIiJCaW5kIGZ1biB0byBtb3VzZS1tb3ZlLWV2ZW50ICh3aXRoIHByZXNzZWQgbW91c2UgYnV0dG9uKSBvbiB0dXJ0bGUuCisgICAgICAgIGZ1biBtdXN0IGJlIGEgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlCisgICAgICAgIGFjdHVhbCBtb3VzZSBwb3NpdGlvbiBvbiB0aGUgY2FudmFzLgorICAgICAgICBudW0sIHRoZSBudW1iZXIgb2YgdGhlIG1vdXNlLWJ1dHRvbiBkZWZhdWx0cyB0byAxCisKKyAgICAgICAgRXZlcnkgc2VxdWVuY2Ugb2YgbW91c2UtbW92ZS1ldmVudHMgb24gYSB0dXJ0bGUgaXMgcHJlY2VkZWQgYnkgYQorICAgICAgICBtb3VzZS1jbGljayBldmVudCBvbiB0aGF0IHR1cnRsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZ1biBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jdi50YWdfdW5iaW5kKGl0ZW0sICI8QnV0dG9uJXMtTW90aW9uPiIgJSBudW0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWYgZXZlbnRmdW4oZXZlbnQpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgeCwgeSA9IChzZWxmLmN2LmNhbnZhc3goZXZlbnQueCkvc2VsZi54c2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2VsZi5jdi5jYW52YXN5KGV2ZW50LnkpL3NlbGYueXNjYWxlKQorICAgICAgICAgICAgICAgICAgICBmdW4oeCwgeSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuY3YudGFnX2JpbmQoaXRlbSwgIjxCdXR0b24lcy1Nb3Rpb24+IiAlIG51bSwgZXZlbnRmdW4sIGFkZCkKKworICAgIGRlZiBfb25zY3JlZW5jbGljayhzZWxmLCBmdW4sIG51bT0xLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIG1vdXNlLWNsaWNrIGV2ZW50IG9uIGNhbnZhcy4KKyAgICAgICAgZnVuIG11c3QgYmUgYSBmdW5jdGlvbiB3aXRoIHR3byBhcmd1bWVudHMsIHRoZSBjb29yZGluYXRlcworICAgICAgICBvZiB0aGUgY2xpY2tlZCBwb2ludCBvbiB0aGUgY2FudmFzLgorICAgICAgICBudW0sIHRoZSBudW1iZXIgb2YgdGhlIG1vdXNlLWJ1dHRvbiBkZWZhdWx0cyB0byAxCisKKyAgICAgICAgSWYgYSB0dXJ0bGUgaXMgY2xpY2tlZCwgZmlyc3QgX29uY2xpY2stZXZlbnQgd2lsbCBiZSBwZXJmb3JtZWQsCisgICAgICAgIHRoZW4gX29uc2NyZWVuc2NsaWNrLWV2ZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZnVuIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmN2LnVuYmluZCgiPEJ1dHRvbi0lcz4iICUgbnVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmIGV2ZW50ZnVuKGV2ZW50KToKKyAgICAgICAgICAgICAgICB4LCB5ID0gKHNlbGYuY3YuY2FudmFzeChldmVudC54KS9zZWxmLnhzY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1zZWxmLmN2LmNhbnZhc3koZXZlbnQueSkvc2VsZi55c2NhbGUpCisgICAgICAgICAgICAgICAgZnVuKHgsIHkpCisgICAgICAgICAgICBzZWxmLmN2LmJpbmQoIjxCdXR0b24tJXM+IiAlIG51bSwgZXZlbnRmdW4sIGFkZCkKKworICAgIGRlZiBfb25rZXkoc2VsZiwgZnVuLCBrZXkpOgorICAgICAgICAiIiJCaW5kIGZ1biB0byBrZXktcmVsZWFzZSBldmVudCBvZiBrZXkuCisgICAgICAgIENhbnZhcyBtdXN0IGhhdmUgZm9jdXMuIFNlZSBtZXRob2QgbGlzdGVuCisgICAgICAgICIiIgorICAgICAgICBpZiBmdW4gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY3YudW5iaW5kKCI8S2V5UmVsZWFzZS0lcz4iICUga2V5LCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVmIGV2ZW50ZnVuKGV2ZW50KToKKyAgICAgICAgICAgICAgICBmdW4oKQorICAgICAgICAgICAgc2VsZi5jdi5iaW5kKCI8S2V5UmVsZWFzZS0lcz4iICUga2V5LCBldmVudGZ1bikKKworICAgIGRlZiBfbGlzdGVuKHNlbGYpOgorICAgICAgICAiIiJTZXQgZm9jdXMgb24gY2FudmFzIChpbiBvcmRlciB0byBjb2xsZWN0IGtleS1ldmVudHMpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmN2LmZvY3VzX2ZvcmNlKCkKKworICAgIGRlZiBfb250aW1lcihzZWxmLCBmdW4sIHQpOgorICAgICAgICAiIiJJbnN0YWxsIGEgdGltZXIsIHdoaWNoIGNhbGxzIGZ1biBhZnRlciB0IG1pbGxpc2Vjb25kcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHQgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuY3YuYWZ0ZXJfaWRsZShmdW4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmN2LmFmdGVyKHQsIGZ1bikKKworICAgIGRlZiBfY3JlYXRlaW1hZ2Uoc2VsZiwgaW1hZ2UpOgorICAgICAgICAiIiJDcmVhdGUgYW5kIHJldHVybiBpbWFnZSBpdGVtIG9uIGNhbnZhcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmN2LmNyZWF0ZV9pbWFnZSgwLCAwLCBpbWFnZT1pbWFnZSkKKworICAgIGRlZiBfZHJhd2ltYWdlKHNlbGYsIGl0ZW0sICh4LCB5KSwgaW1hZ2UpOgorICAgICAgICAiIiJDb25maWd1cmUgaW1hZ2UgaXRlbSBhcyB0byBkcmF3IGltYWdlIG9iamVjdAorICAgICAgICBhdCBwb3NpdGlvbiAoeCx5KSBvbiBjYW52YXMpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmN2LmNvb3JkcyhpdGVtLCAoeCAqIHNlbGYueHNjYWxlLCAteSAqIHNlbGYueXNjYWxlKSkKKyAgICAgICAgc2VsZi5jdi5pdGVtY29uZmlnKGl0ZW0sIGltYWdlPWltYWdlKQorCisgICAgZGVmIF9zZXRiZ3BpYyhzZWxmLCBpdGVtLCBpbWFnZSk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBpbWFnZSBpdGVtIGFzIHRvIGRyYXcgaW1hZ2Ugb2JqZWN0CisgICAgICAgIGF0IGNlbnRlciBvZiBjYW52YXMuIFNldCBpdGVtIHRvIHRoZSBmaXJzdCBpdGVtCisgICAgICAgIGluIHRoZSBkaXNwbGF5bGlzdCwgc28gaXQgd2lsbCBiZSBkcmF3biBiZWxvdworICAgICAgICBhbnkgb3RoZXIgaXRlbSAuIiIiCisgICAgICAgIHNlbGYuY3YuaXRlbWNvbmZpZyhpdGVtLCBpbWFnZT1pbWFnZSkKKyAgICAgICAgc2VsZi5jdi50YWdfbG93ZXIoaXRlbSkKKworICAgIGRlZiBfdHlwZShzZWxmLCBpdGVtKToKKyAgICAgICAgIiIiUmV0dXJuICdsaW5lJyBvciAncG9seWdvbicgb3IgJ2ltYWdlJyBkZXBlbmRpbmcgb24KKyAgICAgICAgdHlwZSBvZiBpdGVtLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY3YudHlwZShpdGVtKQorCisgICAgZGVmIF9wb2ludGxpc3Qoc2VsZiwgaXRlbSk6CisgICAgICAgICIiInJldHVybnMgbGlzdCBvZiBjb29yZGluYXRlLXBhaXJzIG9mIHBvaW50cyBvZiBpdGVtCisgICAgICAgIEV4YW1wbGUgKGZvciBpbnNpZGVycyk6CisgICAgICAgID4+PiBmcm9tIHR1cnRsZSBpbXBvcnQgKgorICAgICAgICA+Pj4gZ2V0c2NyZWVuKCkuX3BvaW50bGlzdChnZXR0dXJ0bGUoKS50dXJ0bGUuX2l0ZW0pCisgICAgICAgIFsoMC4wLCA5Ljk5OTk5OTk5OTk5OTk5ODIpLCAoMC4wLCAtOS45OTk5OTk5OTk5OTk5OTgyKSwKKyAgICAgICAgKDkuOTk5OTk5OTk5OTk5OTk4MiwgMC4wKV0KKyAgICAgICAgPj4+ICIiIgorICAgICAgICBjbCA9IHNlbGYuY3YuY29vcmRzKGl0ZW0pCisgICAgICAgIHBsID0gWyhjbFtpXSwgLWNsW2krMV0pIGZvciBpIGluIHJhbmdlKDAsIGxlbihjbCksIDIpXQorICAgICAgICByZXR1cm4gIHBsCisKKyAgICBkZWYgX3NldHNjcm9sbHJlZ2lvbihzZWxmLCBzcngxLCBzcnkxLCBzcngyLCBzcnkyKToKKyAgICAgICAgc2VsZi5jdi5jb25maWcoc2Nyb2xscmVnaW9uPShzcngxLCBzcnkxLCBzcngyLCBzcnkyKSkKKworICAgIGRlZiBfcmVzY2FsZShzZWxmLCB4c2NhbGVmYWN0b3IsIHlzY2FsZWZhY3Rvcik6CisgICAgICAgIGl0ZW1zID0gc2VsZi5jdi5maW5kX2FsbCgpCisgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgY29vcmRpbmF0ZXMgPSBzZWxmLmN2LmNvb3JkcyhpdGVtKQorICAgICAgICAgICAgbmV3Y29vcmRsaXN0ID0gW10KKyAgICAgICAgICAgIHdoaWxlIGNvb3JkaW5hdGVzOgorICAgICAgICAgICAgICAgIHgsIHkgPSBjb29yZGluYXRlc1s6Ml0KKyAgICAgICAgICAgICAgICBuZXdjb29yZGxpc3QuYXBwZW5kKHggKiB4c2NhbGVmYWN0b3IpCisgICAgICAgICAgICAgICAgbmV3Y29vcmRsaXN0LmFwcGVuZCh5ICogeXNjYWxlZmFjdG9yKQorICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXNbMjpdCisgICAgICAgICAgICBzZWxmLmN2LmNvb3JkcyhpdGVtLCAqbmV3Y29vcmRsaXN0KQorCisgICAgZGVmIF9yZXNpemUoc2VsZiwgY2FudndpZHRoPU5vbmUsIGNhbnZoZWlnaHQ9Tm9uZSwgYmc9Tm9uZSk6CisgICAgICAgICIiIlJlc2l6ZSB0aGUgY2FudmFzIHRoZSB0dXJ0bGVzIGFyZSBkcmF3aW5nIG9uLiBEb2VzCisgICAgICAgIG5vdCBhbHRlciB0aGUgZHJhd2luZyB3aW5kb3cuCisgICAgICAgICIiIgorICAgICAgICAjIG5lZWRzIGFtZW5kbWVudAorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZWxmLmN2LCBTY3JvbGxlZENhbnZhcyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW52d2lkdGgsIHNlbGYuY2FudmhlaWdodAorICAgICAgICBpZiBjYW52d2lkdGggaXMgY2FudmhlaWdodCBpcyBiZyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY3YuY2FudndpZHRoLCBzZWxmLmN2LmNhbnZoZWlnaHQKKyAgICAgICAgaWYgY2FudndpZHRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jYW52d2lkdGggPSBjYW52d2lkdGgKKyAgICAgICAgaWYgY2FudmhlaWdodCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2FudmhlaWdodCA9IGNhbnZoZWlnaHQKKyAgICAgICAgc2VsZi5jdi5yZXNldChjYW52d2lkdGgsIGNhbnZoZWlnaHQsIGJnKQorCisgICAgZGVmIF93aW5kb3dfc2l6ZShzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgdHVydGxlIHdpbmRvdy4KKyAgICAgICAgIiIiCisgICAgICAgIHdpZHRoID0gc2VsZi5jdi53aW5mb193aWR0aCgpCisgICAgICAgIGlmIHdpZHRoIDw9IDE6ICAjIHRoZSB3aW5kb3cgaXNuJ3QgbWFuYWdlZCBieSBhIGdlb21ldHJ5IG1hbmFnZXIKKyAgICAgICAgICAgIHdpZHRoID0gc2VsZi5jdlsnd2lkdGgnXQorICAgICAgICBoZWlnaHQgPSBzZWxmLmN2LndpbmZvX2hlaWdodCgpCisgICAgICAgIGlmIGhlaWdodCA8PSAxOiAjIHRoZSB3aW5kb3cgaXNuJ3QgbWFuYWdlZCBieSBhIGdlb21ldHJ5IG1hbmFnZXIKKyAgICAgICAgICAgIGhlaWdodCA9IHNlbGYuY3ZbJ2hlaWdodCddCisgICAgICAgIHJldHVybiB3aWR0aCwgaGVpZ2h0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMgICAgICAgICAgICAgICAgICBFbmQgb2YgVGtpbnRlciAtIGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2NsYXNzIFRlcm1pbmF0b3IgKEV4Y2VwdGlvbik6CisgICAgIiIiV2lsbCBiZSByYWlzZWQgaW4gVHVydGxlU2NyZWVuLnVwZGF0ZSwgaWYgX1JVTk5JTkcgYmVjb21lcyBGYWxzZS4KKworICAgIFRoaXMgc3RvcHMgZXhlY3V0aW9uIG9mIGEgdHVydGxlIGdyYXBoaWNzIHNjcmlwdC4KKyAgICBNYWluIHB1cnBvc2U6IHVzZSBpbiB0aGUgRGVtby1WaWV3ZXIgdHVydGxlLkRlbW8ucHkuCisgICAgIiIiCisgICAgcGFzcworCisKK2NsYXNzIFR1cnRsZUdyYXBoaWNzRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJTb21lIFR1cnRsZUdyYXBoaWNzIEVycm9yCisgICAgIiIiCisKKworY2xhc3MgU2hhcGUob2JqZWN0KToKKyAgICAiIiJEYXRhIHN0cnVjdHVyZSBtb2RlbGluZyBzaGFwZXMuCisKKyAgICBhdHRyaWJ1dGUgX3R5cGUgaXMgb25lIG9mICJwb2x5Z29uIiwgImltYWdlIiwgImNvbXBvdW5kIgorICAgIGF0dHJpYnV0ZSBfZGF0YSBpcyAtIGRlcGVuZGluZyBvbiBfdHlwZSBhIHBveWdvbi10dXBsZSwKKyAgICBhbiBpbWFnZSBvciBhIGxpc3QgY29uc3RydWN0ZWQgdXNpbmcgdGhlIGFkZGNvbXBvbmVudCBtZXRob2QuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVfLCBkYXRhPU5vbmUpOgorICAgICAgICBzZWxmLl90eXBlID0gdHlwZV8KKyAgICAgICAgaWYgdHlwZV8gPT0gInBvbHlnb24iOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBsaXN0KToKKyAgICAgICAgICAgICAgICBkYXRhID0gdHVwbGUoZGF0YSkKKyAgICAgICAgZWxpZiB0eXBlXyA9PSAiaW1hZ2UiOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkYXRhLCBzdHIpOgorICAgICAgICAgICAgICAgIGlmIGRhdGEubG93ZXIoKS5lbmRzd2l0aCgiLmdpZiIpIGFuZCBpc2ZpbGUoZGF0YSk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBUdXJ0bGVTY3JlZW4uX2ltYWdlKGRhdGEpCisgICAgICAgICAgICAgICAgIyBlbHNlIGRhdGEgYXNzdW1lZCB0byBiZSBQaG90b2ltYWdlCisgICAgICAgIGVsaWYgdHlwZV8gPT0gImNvbXBvdW5kIjoKKyAgICAgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiVGhlcmUgaXMgbm8gc2hhcGUgdHlwZSAlcyIgJSB0eXBlXykKKyAgICAgICAgc2VsZi5fZGF0YSA9IGRhdGEKKworICAgIGRlZiBhZGRjb21wb25lbnQoc2VsZiwgcG9seSwgZmlsbCwgb3V0bGluZT1Ob25lKToKKyAgICAgICAgIiIiQWRkIGNvbXBvbmVudCB0byBhIHNoYXBlIG9mIHR5cGUgY29tcG91bmQuCisKKyAgICAgICAgQXJndW1lbnRzOiBwb2x5IGlzIGEgcG9seWdvbiwgaS4gZS4gYSB0dXBsZSBvZiBudW1iZXIgcGFpcnMuCisgICAgICAgIGZpbGwgaXMgdGhlIGZpbGxjb2xvciBvZiB0aGUgY29tcG9uZW50LAorICAgICAgICBvdXRsaW5lIGlzIHRoZSBvdXRsaW5lIGNvbG9yIG9mIHRoZSBjb21wb25lbnQuCisKKyAgICAgICAgY2FsbCAoZm9yIGEgU2hhcGVvYmplY3QgbmFtZW5kIHMpOgorICAgICAgICAtLSAgIHMuYWRkY29tcG9uZW50KCgoMCwwKSwgKDEwLDEwKSwgKC0xMCwxMCkpLCAicmVkIiwgImJsdWUiKQorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiBwb2x5ID0gKCgwLDApLCgxMCwtNSksKDAsMTApLCgtMTAsLTUpKQorICAgICAgICA+Pj4gcyA9IFNoYXBlKCJjb21wb3VuZCIpCisgICAgICAgID4+PiBzLmFkZGNvbXBvbmVudChwb2x5LCAicmVkIiwgImJsdWUiKQorICAgICAgICA+Pj4gIyAuLiBhZGQgbW9yZSBjb21wb25lbnRzIGFuZCB0aGVuIHVzZSByZWdpc3Rlcl9zaGFwZSgpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl90eXBlICE9ICJjb21wb3VuZCI6CisgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJDYW5ub3QgYWRkIGNvbXBvbmVudCB0byAlcyBTaGFwZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHNlbGYuX3R5cGUpCisgICAgICAgIGlmIG91dGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIG91dGxpbmUgPSBmaWxsCisgICAgICAgIHNlbGYuX2RhdGEuYXBwZW5kKFtwb2x5LCBmaWxsLCBvdXRsaW5lXSkKKworCitjbGFzcyBUYnVmZmVyKG9iamVjdCk6CisgICAgIiIiUmluZyBidWZmZXIgdXNlZCBhcyB1bmRvYnVmZmVyIGZvciBSYXdUdXJ0bGUgb2JqZWN0cy4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVmc2l6ZT0xMCk6CisgICAgICAgIHNlbGYuYnVmc2l6ZSA9IGJ1ZnNpemUKKyAgICAgICAgc2VsZi5idWZmZXIgPSBbW05vbmVdXSAqIGJ1ZnNpemUKKyAgICAgICAgc2VsZi5wdHIgPSAtMQorICAgICAgICBzZWxmLmN1bXVsYXRlID0gRmFsc2UKKyAgICBkZWYgcmVzZXQoc2VsZiwgYnVmc2l6ZT1Ob25lKToKKyAgICAgICAgaWYgYnVmc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5idWZzaXplKToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcltpXSA9IFtOb25lXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWZzaXplID0gYnVmc2l6ZQorICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBbW05vbmVdXSAqIGJ1ZnNpemUKKyAgICAgICAgc2VsZi5wdHIgPSAtMQorICAgIGRlZiBwdXNoKHNlbGYsIGl0ZW0pOgorICAgICAgICBpZiBzZWxmLmJ1ZnNpemUgPiAwOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY3VtdWxhdGU6CisgICAgICAgICAgICAgICAgc2VsZi5wdHIgPSAoc2VsZi5wdHIgKyAxKSAlIHNlbGYuYnVmc2l6ZQorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyW3NlbGYucHRyXSA9IGl0ZW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJbc2VsZi5wdHJdLmFwcGVuZChpdGVtKQorICAgIGRlZiBwb3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVmc2l6ZSA+IDA6CisgICAgICAgICAgICBpdGVtID0gc2VsZi5idWZmZXJbc2VsZi5wdHJdCisgICAgICAgICAgICBpZiBpdGVtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJbc2VsZi5wdHJdID0gW05vbmVdCisgICAgICAgICAgICAgICAgc2VsZi5wdHIgPSAoc2VsZi5wdHIgLSAxKSAlIHNlbGYuYnVmc2l6ZQorICAgICAgICAgICAgICAgIHJldHVybiAoaXRlbSkKKyAgICBkZWYgbnJfb2ZfaXRlbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJ1ZnNpemUgLSBzZWxmLmJ1ZmZlci5jb3VudChbTm9uZV0pCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYuYnVmZmVyKSArICIgIiArIHN0cihzZWxmLnB0cikKKworCisKK2NsYXNzIFR1cnRsZVNjcmVlbihUdXJ0bGVTY3JlZW5CYXNlKToKKyAgICAiIiJQcm92aWRlcyBzY3JlZW4gb3JpZW50ZWQgbWV0aG9kcyBsaWtlIHNldGJnIGV0Yy4KKworICAgIE9ubHkgcmVsaWVzIHVwb24gdGhlIG1ldGhvZHMgb2YgVHVydGxlU2NyZWVuQmFzZSBhbmQgTk9UCisgICAgdXBvbiBjb21wb25lbnRzIG9mIHRoZSB1bmRlcmx5aW5nIGdyYXBoaWNzIHRvb2xraXQgLQorICAgIHdoaWNoIGlzIFRraW50ZXIgaW4gdGhpcyBjYXNlLgorICAgICIiIgorIyAgICBfU1RBTkRBUkRfREVMQVkgPSA1CisgICAgX1JVTk5JTkcgPSBUcnVlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3YsIG1vZGU9X0NGR1sibW9kZSJdLAorICAgICAgICAgICAgICAgICBjb2xvcm1vZGU9X0NGR1siY29sb3Jtb2RlIl0sIGRlbGF5PV9DRkdbImRlbGF5Il0pOgorICAgICAgICBzZWxmLl9zaGFwZXMgPSB7CisgICAgICAgICAgICAgICAgICAgImFycm93IiA6IFNoYXBlKCJwb2x5Z29uIiwgKCgtMTAsMCksICgxMCwwKSwgKDAsMTApKSksCisgICAgICAgICAgICAgICAgICAidHVydGxlIiA6IFNoYXBlKCJwb2x5Z29uIiwgKCgwLDE2KSwgKC0yLDE0KSwgKC0xLDEwKSwgKC00LDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC03LDkpLCAoLTksOCksICgtNiw1KSwgKC03LDEpLCAoLTUsLTMpLCAoLTgsLTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC02LC04KSwgKC00LC01KSwgKDAsLTcpLCAoNCwtNSksICg2LC04KSwgKDgsLTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsLTMpLCAoNywxKSwgKDYsNSksICg5LDgpLCAoNyw5KSwgKDQsNyksICgxLDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLDE0KSkpLAorICAgICAgICAgICAgICAgICAgImNpcmNsZSIgOiBTaGFwZSgicG9seWdvbiIsICgoMTAsMCksICg5LjUxLDMuMDkpLCAoOC4wOSw1Ljg4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1Ljg4LDguMDkpLCAoMy4wOSw5LjUxKSwgKDAsMTApLCAoLTMuMDksOS41MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTUuODgsOC4wOSksICgtOC4wOSw1Ljg4KSwgKC05LjUxLDMuMDkpLCAoLTEwLDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC05LjUxLC0zLjA5KSwgKC04LjA5LC01Ljg4KSwgKC01Ljg4LC04LjA5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4wOSwtOS41MSksICgtMC4wMCwtMTAuMDApLCAoMy4wOSwtOS41MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNS44OCwtOC4wOSksICg4LjA5LC01Ljg4KSwgKDkuNTEsLTMuMDkpKSksCisgICAgICAgICAgICAgICAgICAic3F1YXJlIiA6IFNoYXBlKCJwb2x5Z29uIiwgKCgxMCwtMTApLCAoMTAsMTApLCAoLTEwLDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTAsLTEwKSkpLAorICAgICAgICAgICAgICAgICJ0cmlhbmdsZSIgOiBTaGFwZSgicG9seWdvbiIsICgoMTAsLTUuNzcpLCAoMCwxMS41NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEwLC01Ljc3KSkpLAorICAgICAgICAgICAgICAgICAgImNsYXNzaWMiOiBTaGFwZSgicG9seWdvbiIsICgoMCwwKSwoLTUsLTkpLCgwLC03KSwoNSwtOSkpKSwKKyAgICAgICAgICAgICAgICAgICAiYmxhbmsiIDogU2hhcGUoImltYWdlIiwgc2VsZi5fYmxhbmtpbWFnZSgpKQorICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgIHNlbGYuX2JncGljcyA9IHsibm9waWMiIDogIiJ9CisKKyAgICAgICAgVHVydGxlU2NyZWVuQmFzZS5fX2luaXRfXyhzZWxmLCBjdikKKyAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5fZGVsYXl2YWx1ZSA9IGRlbGF5CisgICAgICAgIHNlbGYuX2NvbG9ybW9kZSA9IF9DRkdbImNvbG9ybW9kZSJdCisgICAgICAgIHNlbGYuX2tleXMgPSBbXQorICAgICAgICBzZWxmLmNsZWFyKCkKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlIGFsbCBkcmF3aW5ncyBhbmQgYWxsIHR1cnRsZXMgZnJvbSB0aGUgVHVydGxlU2NyZWVuLgorCisgICAgICAgIFJlc2V0IGVtcHR5IFR1cnRsZVNjcmVlbiB0byBpdHMgaW5pdGlhbCBzdGF0ZTogd2hpdGUgYmFja2dyb3VuZCwKKyAgICAgICAgbm8gYmFja2dyb3VuZGltYWdlLCBubyBldmVudGJpbmRpbmdzIGFuZCB0cmFjaW5nIG9uLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLmNsZWFyKCkKKworICAgICAgICBOb3RlOiB0aGlzIG1ldGhvZCBpcyBub3QgYXZhaWxhYmxlIGFzIGZ1bmN0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZGVsYXl2YWx1ZSA9IF9DRkdbImRlbGF5Il0KKyAgICAgICAgc2VsZi5fY29sb3Jtb2RlID0gX0NGR1siY29sb3Jtb2RlIl0KKyAgICAgICAgc2VsZi5fZGVsZXRlKCJhbGwiKQorICAgICAgICBzZWxmLl9iZ3BpYyA9IHNlbGYuX2NyZWF0ZWltYWdlKCIiKQorICAgICAgICBzZWxmLl9iZ3BpY25hbWUgPSAibm9waWMiCisgICAgICAgIHNlbGYuX3RyYWNpbmcgPSAxCisgICAgICAgIHNlbGYuX3VwZGF0ZWNvdW50ZXIgPSAwCisgICAgICAgIHNlbGYuX3R1cnRsZXMgPSBbXQorICAgICAgICBzZWxmLmJnY29sb3IoIndoaXRlIikKKyAgICAgICAgZm9yIGJ0biBpbiAxLCAyLCAzOgorICAgICAgICAgICAgc2VsZi5vbmNsaWNrKE5vbmUsIGJ0bikKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9rZXlzWzpdOgorICAgICAgICAgICAgc2VsZi5vbmtleShOb25lLCBrZXkpCisgICAgICAgIFR1cnRsZS5fcGVuID0gTm9uZQorCisgICAgZGVmIG1vZGUoc2VsZiwgbW9kZT1Ob25lKToKKyAgICAgICAgIiIiU2V0IHR1cnRsZS1tb2RlICgnc3RhbmRhcmQnLCAnbG9nbycgb3IgJ3dvcmxkJykgYW5kIHBlcmZvcm0gcmVzZXQuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIG1vZGUgLS0gb24gb2YgdGhlIHN0cmluZ3MgJ3N0YW5kYXJkJywgJ2xvZ28nIG9yICd3b3JsZCcKKworICAgICAgICBNb2RlICdzdGFuZGFyZCcgaXMgY29tcGF0aWJsZSB3aXRoIHR1cnRsZS5weS4KKyAgICAgICAgTW9kZSAnbG9nbycgaXMgY29tcGF0aWJsZSB3aXRoIG1vc3QgTG9nby1UdXJ0bGUtR3JhcGhpY3MuCisgICAgICAgIE1vZGUgJ3dvcmxkJyB1c2VzIHVzZXJkZWZpbmVkICd3b3JsZGNvb3JkaW5hdGVzJy4gKkF0dGVudGlvbio6IGluCisgICAgICAgIHRoaXMgbW9kZSBhbmdsZXMgYXBwZWFyIGRpc3RvcnRlZCBpZiB4L3kgdW5pdC1yYXRpbyBkb2Vzbid0IGVxdWFsIDEuCisgICAgICAgIElmIG1vZGUgaXMgbm90IGdpdmVuLCByZXR1cm4gdGhlIGN1cnJlbnQgbW9kZS4KKworICAgICAgICAgICAgIE1vZGUgICAgICBJbml0aWFsIHR1cnRsZSBoZWFkaW5nICAgICBwb3NpdGl2ZSBhbmdsZXMKKyAgICAgICAgIC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAnc3RhbmRhcmQnICAgIHRvIHRoZSByaWdodCAoZWFzdCkgICAgICAgY291bnRlcmNsb2Nrd2lzZQorICAgICAgICAgICAgJ2xvZ28nICAgICAgICB1cHdhcmQgICAgKG5vcnRoKSAgICAgICAgIGNsb2Nrd2lzZQorCisgICAgICAgIEV4YW1wbGVzOgorICAgICAgICA+Pj4gbW9kZSgnbG9nbycpICAgIyByZXNldHMgdHVydGxlIGhlYWRpbmcgdG8gbm9ydGgKKyAgICAgICAgPj4+IG1vZGUoKQorICAgICAgICAnbG9nbycKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2RlCisgICAgICAgIG1vZGUgPSBtb2RlLmxvd2VyKCkKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gWyJzdGFuZGFyZCIsICJsb2dvIiwgIndvcmxkIl06CisgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJObyB0dXJ0bGUtZ3JhcGhpY3MtbW9kZSAlcyIgJSBtb2RlKQorICAgICAgICBzZWxmLl9tb2RlID0gbW9kZQorICAgICAgICBpZiBtb2RlIGluIFsic3RhbmRhcmQiLCAibG9nbyJdOgorICAgICAgICAgICAgc2VsZi5fc2V0c2Nyb2xscmVnaW9uKC1zZWxmLmNhbnZ3aWR0aC8vMiwgLXNlbGYuY2FudmhlaWdodC8vMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FudndpZHRoLy8yLCBzZWxmLmNhbnZoZWlnaHQvLzIpCisgICAgICAgICAgICBzZWxmLnhzY2FsZSA9IHNlbGYueXNjYWxlID0gMS4wCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIHNldHdvcmxkY29vcmRpbmF0ZXMoc2VsZiwgbGx4LCBsbHksIHVyeCwgdXJ5KToKKyAgICAgICAgIiIiU2V0IHVwIGEgdXNlciBkZWZpbmVkIGNvb3JkaW5hdGUtc3lzdGVtLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgbGx4IC0tIGEgbnVtYmVyLCB4LWNvb3JkaW5hdGUgb2YgbG93ZXIgbGVmdCBjb3JuZXIgb2YgY2FudmFzCisgICAgICAgIGxseSAtLSBhIG51bWJlciwgeS1jb29yZGluYXRlIG9mIGxvd2VyIGxlZnQgY29ybmVyIG9mIGNhbnZhcworICAgICAgICB1cnggLS0gYSBudW1iZXIsIHgtY29vcmRpbmF0ZSBvZiB1cHBlciByaWdodCBjb3JuZXIgb2YgY2FudmFzCisgICAgICAgIHVyeSAtLSBhIG51bWJlciwgeS1jb29yZGluYXRlIG9mIHVwcGVyIHJpZ2h0IGNvcm5lciBvZiBjYW52YXMKKworICAgICAgICBTZXQgdXAgdXNlciBjb29kaW5hdC1zeXN0ZW0gYW5kIHN3aXRjaCB0byBtb2RlICd3b3JsZCcgaWYgbmVjZXNzYXJ5LgorICAgICAgICBUaGlzIHBlcmZvcm1zIGEgc2NyZWVuLnJlc2V0LiBJZiBtb2RlICd3b3JsZCcgaXMgYWxyZWFkeSBhY3RpdmUsCisgICAgICAgIGFsbCBkcmF3aW5ncyBhcmUgcmVkcmF3biBhY2NvcmRpbmcgdG8gdGhlIG5ldyBjb29yZGluYXRlcy4KKworICAgICAgICBCdXQgQVRURU5USU9OOiBpbiB1c2VyLWRlZmluZWQgY29vcmRpbmF0ZXN5c3RlbXMgYW5nbGVzIG1heSBhcHBlYXIKKyAgICAgICAgZGlzdG9ydGVkLiAoc2VlIFNjcmVlbi5tb2RlKCkpCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4uc2V0d29ybGRjb29yZGluYXRlcygtMTAsLTAuNSw1MCwxLjUpCisgICAgICAgID4+PiBmb3IgXyBpbiByYW5nZSgzNik6CisgICAgICAgIC4uLiAgICAgbGVmdCgxMCkKKyAgICAgICAgLi4uICAgICBmb3J3YXJkKDAuNSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYubW9kZSgpICE9ICJ3b3JsZCI6CisgICAgICAgICAgICBzZWxmLm1vZGUoIndvcmxkIikKKyAgICAgICAgeHNwYW4gPSBmbG9hdCh1cnggLSBsbHgpCisgICAgICAgIHlzcGFuID0gZmxvYXQodXJ5IC0gbGx5KQorICAgICAgICB3eCwgd3kgPSBzZWxmLl93aW5kb3dfc2l6ZSgpCisgICAgICAgIHNlbGYuc2NyZWVuc2l6ZSh3eC0yMCwgd3ktMjApCisgICAgICAgIG9sZHhzY2FsZSwgb2xkeXNjYWxlID0gc2VsZi54c2NhbGUsIHNlbGYueXNjYWxlCisgICAgICAgIHNlbGYueHNjYWxlID0gc2VsZi5jYW52d2lkdGggLyB4c3BhbgorICAgICAgICBzZWxmLnlzY2FsZSA9IHNlbGYuY2FudmhlaWdodCAvIHlzcGFuCisgICAgICAgIHNyeDEgPSBsbHggKiBzZWxmLnhzY2FsZQorICAgICAgICBzcnkxID0gLXVyeSAqIHNlbGYueXNjYWxlCisgICAgICAgIHNyeDIgPSBzZWxmLmNhbnZ3aWR0aCArIHNyeDEKKyAgICAgICAgc3J5MiA9IHNlbGYuY2FudmhlaWdodCArIHNyeTEKKyAgICAgICAgc2VsZi5fc2V0c2Nyb2xscmVnaW9uKHNyeDEsIHNyeTEsIHNyeDIsIHNyeTIpCisgICAgICAgIHNlbGYuX3Jlc2NhbGUoc2VsZi54c2NhbGUvb2xkeHNjYWxlLCBzZWxmLnlzY2FsZS9vbGR5c2NhbGUpCisgICAgICAgIHNlbGYudXBkYXRlKCkKKworICAgIGRlZiByZWdpc3Rlcl9zaGFwZShzZWxmLCBuYW1lLCBzaGFwZT1Ob25lKToKKyAgICAgICAgIiIiQWRkcyBhIHR1cnRsZSBzaGFwZSB0byBUdXJ0bGVTY3JlZW4ncyBzaGFwZWxpc3QuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICAoMSkgbmFtZSBpcyB0aGUgbmFtZSBvZiBhIGdpZi1maWxlIGFuZCBzaGFwZSBpcyBOb25lLgorICAgICAgICAgICAgSW5zdGFsbHMgdGhlIGNvcnJlc3BvbmRpbmcgaW1hZ2Ugc2hhcGUuCisgICAgICAgICAgICAhISBJbWFnZS1zaGFwZXMgRE8gTk9UIHJvdGF0ZSB3aGVuIHR1cm5pbmcgdGhlIHR1cnRsZSwKKyAgICAgICAgICAgICEhIHNvIHRoZXkgZG8gbm90IGRpc3BsYXkgdGhlIGhlYWRpbmcgb2YgdGhlIHR1cnRsZSEKKyAgICAgICAgKDIpIG5hbWUgaXMgYW4gYXJiaXRyYXJ5IHN0cmluZyBhbmQgc2hhcGUgaXMgYSB0dXBsZQorICAgICAgICAgICAgb2YgcGFpcnMgb2YgY29vcmRpbmF0ZXMuIEluc3RhbGxzIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgICAgICBwb2x5Z29uIHNoYXBlCisgICAgICAgICgzKSBuYW1lIGlzIGFuIGFyYml0cmFyeSBzdHJpbmcgYW5kIHNoYXBlIGlzIGEKKyAgICAgICAgICAgIChjb21wb3VuZCkgU2hhcGUgb2JqZWN0LiBJbnN0YWxscyB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAgICAgY29tcG91bmQgc2hhcGUuCisgICAgICAgIFRvIHVzZSBhIHNoYXBlLCB5b3UgaGF2ZSB0byBpc3N1ZSB0aGUgY29tbWFuZCBzaGFwZShzaGFwZW5hbWUpLgorCisgICAgICAgIGNhbGw6IHJlZ2lzdGVyX3NoYXBlKCJ0dXJ0bGUuZ2lmIikKKyAgICAgICAgLS1vcjogcmVnaXN0ZXJfc2hhcGUoInRyaSIsICgoMCwwKSwgKDEwLDEwKSwgKC0xMCwxMCkpKQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLnJlZ2lzdGVyX3NoYXBlKCJ0cmlhbmdsZSIsICgoNSwtMyksKDAsNSksKC01LC0zKSkpCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNoYXBlIGlzIE5vbmU6CisgICAgICAgICAgICAjIGltYWdlCisgICAgICAgICAgICBpZiBuYW1lLmxvd2VyKCkuZW5kc3dpdGgoIi5naWYiKToKKyAgICAgICAgICAgICAgICBzaGFwZSA9IFNoYXBlKCJpbWFnZSIsIHNlbGYuX2ltYWdlKG5hbWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJCYWQgYXJndW1lbnRzIGZvciByZWdpc3Rlcl9zaGFwZS5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlVzZSAgaGVscChyZWdpc3Rlcl9zaGFwZSkiICkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHNoYXBlLCB0dXBsZSk6CisgICAgICAgICAgICBzaGFwZSA9IFNoYXBlKCJwb2x5Z29uIiwgc2hhcGUpCisgICAgICAgICMjIGVsc2Ugc2hhcGUgYXNzdW1lZCB0byBiZSBTaGFwZS1pbnN0YW5jZQorICAgICAgICBzZWxmLl9zaGFwZXNbbmFtZV0gPSBzaGFwZQorICAgICAgICAjIHByaW50ICJzaGFwZSBhZGRlZDoiICwgc2VsZi5fc2hhcGVzCisKKyAgICBkZWYgX2NvbG9yc3RyKHNlbGYsIGNvbG9yKToKKyAgICAgICAgIiIiUmV0dXJuIGNvbG9yIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIGFyZ3MuCisKKyAgICAgICAgQXJndW1lbnQgbWF5IGJlIGEgc3RyaW5nIG9yIGEgdHVwbGUgb2YgdGhyZWUKKyAgICAgICAgbnVtYmVycyBjb3JyZXNwb25kaW5nIHRvIGFjdHVhbCBjb2xvcm1vZGUsCisgICAgICAgIGkuZS4gaW4gdGhlIHJhbmdlIDA8PW48PWNvbG9ybW9kZS4KKworICAgICAgICBJZiB0aGUgYXJndW1lbnQgZG9lc24ndCByZXByZXNlbnQgYSBjb2xvciwKKyAgICAgICAgYW4gZXJyb3IgaXMgcmFpc2VkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKGNvbG9yKSA9PSAxOgorICAgICAgICAgICAgY29sb3IgPSBjb2xvclswXQorICAgICAgICBpZiBpc2luc3RhbmNlKGNvbG9yLCBzdHIpOgorICAgICAgICAgICAgaWYgc2VsZi5faXNjb2xvcnN0cmluZyhjb2xvcikgb3IgY29sb3IgPT0gIiI6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFR1cnRsZUdyYXBoaWNzRXJyb3IoImJhZCBjb2xvciBzdHJpbmc6ICVzIiAlIHN0cihjb2xvcikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHIsIGcsIGIgPSBjb2xvcgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJiYWQgY29sb3IgYXJndW1lbnRzOiAlcyIgJSBzdHIoY29sb3IpKQorICAgICAgICBpZiBzZWxmLl9jb2xvcm1vZGUgPT0gMS4wOgorICAgICAgICAgICAgciwgZywgYiA9IFtyb3VuZCgyNTUuMCp4KSBmb3IgeCBpbiAociwgZywgYildCisgICAgICAgIGlmIG5vdCAoKDAgPD0gciA8PSAyNTUpIGFuZCAoMCA8PSBnIDw9IDI1NSkgYW5kICgwIDw9IGIgPD0gMjU1KSk6CisgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJiYWQgY29sb3Igc2VxdWVuY2U6ICVzIiAlIHN0cihjb2xvcikpCisgICAgICAgIHJldHVybiAiIyUwMnglMDJ4JTAyeCIgJSAociwgZywgYikKKworICAgIGRlZiBfY29sb3Ioc2VsZiwgY3N0cik6CisgICAgICAgIGlmIG5vdCBjc3RyLnN0YXJ0c3dpdGgoIiMiKToKKyAgICAgICAgICAgIHJldHVybiBjc3RyCisgICAgICAgIGlmIGxlbihjc3RyKSA9PSA3OgorICAgICAgICAgICAgY2wgPSBbaW50KGNzdHJbaTppKzJdLCAxNikgZm9yIGkgaW4gKDEsIDMsIDUpXQorICAgICAgICBlbGlmIGxlbihjc3RyKSA9PSA0OgorICAgICAgICAgICAgY2wgPSBbMTYqaW50KGNzdHJbaF0sIDE2KSBmb3IgaCBpbiBjc3RyWzE6XV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR1cnRsZUdyYXBoaWNzRXJyb3IoImJhZCBjb2xvcnN0cmluZzogJXMiICUgY3N0cikKKyAgICAgICAgcmV0dXJuIHR1cGxlKFtjICogc2VsZi5fY29sb3Jtb2RlLzI1NSBmb3IgYyBpbiBjbF0pCisKKyAgICBkZWYgY29sb3Jtb2RlKHNlbGYsIGNtb2RlPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGNvbG9ybW9kZSBvciBzZXQgaXQgdG8gMS4wIG9yIDI1NS4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgICAgY21vZGUgLS0gb25lIG9mIHRoZSB2YWx1ZXMgMS4wIG9yIDI1NQorCisgICAgICAgIHIsIGcsIGIgdmFsdWVzIG9mIGNvbG9ydHJpcGxlcyBoYXZlIHRvIGJlIGluIHJhbmdlIDAuLmNtb2RlLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLmNvbG9ybW9kZSgpCisgICAgICAgIDEuMAorICAgICAgICA+Pj4gc2NyZWVuLmNvbG9ybW9kZSgyNTUpCisgICAgICAgID4+PiBwZW5jb2xvcigyNDAsMTYwLDgwKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgY21vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb2xvcm1vZGUKKyAgICAgICAgaWYgY21vZGUgPT0gMS4wOgorICAgICAgICAgICAgc2VsZi5fY29sb3Jtb2RlID0gZmxvYXQoY21vZGUpCisgICAgICAgIGVsaWYgY21vZGUgPT0gMjU1OgorICAgICAgICAgICAgc2VsZi5fY29sb3Jtb2RlID0gaW50KGNtb2RlKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiJSZXNldCBhbGwgVHVydGxlcyBvbiB0aGUgU2NyZWVuIHRvIHRoZWlyIGluaXRpYWwgc3RhdGUuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4ucmVzZXQoKQorICAgICAgICAiIiIKKyAgICAgICAgZm9yIHR1cnRsZSBpbiBzZWxmLl90dXJ0bGVzOgorICAgICAgICAgICAgdHVydGxlLl9zZXRtb2RlKHNlbGYuX21vZGUpCisgICAgICAgICAgICB0dXJ0bGUucmVzZXQoKQorCisgICAgZGVmIHR1cnRsZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgbGlzdCBvZiB0dXJ0bGVzIG9uIHRoZSBzY3JlZW4uCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4udHVydGxlcygpCisgICAgICAgIFs8dHVydGxlLlR1cnRsZSBvYmplY3QgYXQgMHgwMEUxMUZCMD5dCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdHVydGxlcworCisgICAgZGVmIGJnY29sb3Ioc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJTZXQgb3IgcmV0dXJuIGJhY2tncm91bmRjb2xvciBvZiB0aGUgVHVydGxlU2NyZWVuLgorCisgICAgICAgIEFyZ3VtZW50cyAoaWYgZ2l2ZW4pOiBhIGNvbG9yIHN0cmluZyBvciB0aHJlZSBudW1iZXJzCisgICAgICAgIGluIHRoZSByYW5nZSAwLi5jb2xvcm1vZGUgb3IgYSAzLXR1cGxlIG9mIHN1Y2ggbnVtYmVycy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5iZ2NvbG9yKCJvcmFuZ2UiKQorICAgICAgICA+Pj4gc2NyZWVuLmJnY29sb3IoKQorICAgICAgICAnb3JhbmdlJworICAgICAgICA+Pj4gc2NyZWVuLmJnY29sb3IoMC41LDAsMC41KQorICAgICAgICA+Pj4gc2NyZWVuLmJnY29sb3IoKQorICAgICAgICAnIzgwMDA4MCcKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBjb2xvciA9IHNlbGYuX2NvbG9yc3RyKGFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb2xvciA9IE5vbmUKKyAgICAgICAgY29sb3IgPSBzZWxmLl9iZ2NvbG9yKGNvbG9yKQorICAgICAgICBpZiBjb2xvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbG9yID0gc2VsZi5fY29sb3IoY29sb3IpCisgICAgICAgIHJldHVybiBjb2xvcgorCisgICAgZGVmIHRyYWNlcihzZWxmLCBuPU5vbmUsIGRlbGF5PU5vbmUpOgorICAgICAgICAiIiJUdXJucyB0dXJ0bGUgYW5pbWF0aW9uIG9uL29mZiBhbmQgc2V0IGRlbGF5IGZvciB1cGRhdGUgZHJhd2luZ3MuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICBuIC0tIG5vbm5lZ2F0aXZlICBpbnRlZ2VyCisgICAgICAgIGRlbGF5IC0tIG5vbm5lZ2F0aXZlICBpbnRlZ2VyCisKKyAgICAgICAgSWYgbiBpcyBnaXZlbiwgb25seSBlYWNoIG4tdGggcmVndWxhciBzY3JlZW4gdXBkYXRlIGlzIHJlYWxseSBwZXJmb3JtZWQuCisgICAgICAgIChDYW4gYmUgdXNlZCB0byBhY2NlbGVyYXRlIHRoZSBkcmF3aW5nIG9mIGNvbXBsZXggZ3JhcGhpY3MuKQorICAgICAgICBTZWNvbmQgYXJndW1lbnRzIHNldHMgZGVsYXkgdmFsdWUgKHNlZSBSYXdUdXJ0bGUuZGVsYXkoKSkKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi50cmFjZXIoOCwgMjUpCisgICAgICAgID4+PiBkaXN0ID0gMgorICAgICAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMjAwKToKKyAgICAgICAgLi4uICAgICBmZChkaXN0KQorICAgICAgICAuLi4gICAgIHJ0KDkwKQorICAgICAgICAuLi4gICAgIGRpc3QgKz0gMgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RyYWNpbmcKKyAgICAgICAgc2VsZi5fdHJhY2luZyA9IGludChuKQorICAgICAgICBzZWxmLl91cGRhdGVjb3VudGVyID0gMAorICAgICAgICBpZiBkZWxheSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2RlbGF5dmFsdWUgPSBpbnQoZGVsYXkpCisgICAgICAgIGlmIHNlbGYuX3RyYWNpbmc6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZSgpCisKKyAgICBkZWYgZGVsYXkoc2VsZiwgZGVsYXk9Tm9uZSk6CisgICAgICAgICIiIiBSZXR1cm4gb3Igc2V0IHRoZSBkcmF3aW5nIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgICAgZGVsYXkgLS0gcG9zaXRpdmUgaW50ZWdlcgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLmRlbGF5KDE1KQorICAgICAgICA+Pj4gc2NyZWVuLmRlbGF5KCkKKyAgICAgICAgMTUKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGRlbGF5IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGVsYXl2YWx1ZQorICAgICAgICBzZWxmLl9kZWxheXZhbHVlID0gaW50KGRlbGF5KQorCisgICAgZGVmIF9pbmNyZW1lbnR1ZGMoc2VsZik6CisgICAgICAgICIiIkluY3JlbWVudCB1cGFkYXRlIGNvdW50ZXIuIiIiCisgICAgICAgIGlmIG5vdCBUdXJ0bGVTY3JlZW4uX1JVTk5JTkc6CisgICAgICAgICAgICBUdXJ0bGVTY3JlZW4uX1JVTk5OSU5HID0gVHJ1ZQorICAgICAgICAgICAgcmFpc2UgVGVybWluYXRvcgorICAgICAgICBpZiBzZWxmLl90cmFjaW5nID4gMDoKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZWNvdW50ZXIgKz0gMQorICAgICAgICAgICAgc2VsZi5fdXBkYXRlY291bnRlciAlPSBzZWxmLl90cmFjaW5nCisKKyAgICBkZWYgdXBkYXRlKHNlbGYpOgorICAgICAgICAiIiJQZXJmb3JtIGEgVHVydGxlU2NyZWVuIHVwZGF0ZS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyYWNpbmcgPSBzZWxmLl90cmFjaW5nCisgICAgICAgIHNlbGYuX3RyYWNpbmcgPSBUcnVlCisgICAgICAgIGZvciB0IGluIHNlbGYudHVydGxlcygpOgorICAgICAgICAgICAgdC5fdXBkYXRlX2RhdGEoKQorICAgICAgICAgICAgdC5fZHJhd3R1cnRsZSgpCisgICAgICAgIHNlbGYuX3RyYWNpbmcgPSB0cmFjaW5nCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisKKyAgICBkZWYgd2luZG93X3dpZHRoKHNlbGYpOgorICAgICAgICAiIiIgUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgdHVydGxlIHdpbmRvdy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi53aW5kb3dfd2lkdGgoKQorICAgICAgICA2NDAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl93aW5kb3dfc2l6ZSgpWzBdCisKKyAgICBkZWYgd2luZG93X2hlaWdodChzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSB0dXJ0bGUgd2luZG93LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLndpbmRvd19oZWlnaHQoKQorICAgICAgICA0ODAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl93aW5kb3dfc2l6ZSgpWzFdCisKKyAgICBkZWYgZ2V0Y2FudmFzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIENhbnZhcyBvZiB0aGlzIFR1cnRsZVNjcmVlbi4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IGN2ID0gc2NyZWVuLmdldGNhbnZhcygpCisgICAgICAgID4+PiBjdgorICAgICAgICA8dHVydGxlLlNjcm9sbGVkQ2FudmFzIGluc3RhbmNlIGF0IDB4MDEwNzQyRDg+CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5jdgorCisgICAgZGVmIGdldHNoYXBlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBuYW1lcyBvZiBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSB0dXJ0bGUgc2hhcGVzLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLmdldHNoYXBlcygpCisgICAgICAgIFsnYXJyb3cnLCAnYmxhbmsnLCAnY2lyY2xlJywgLi4uICwgJ3R1cnRsZSddCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc29ydGVkKHNlbGYuX3NoYXBlcy5rZXlzKCkpCisKKyAgICBkZWYgb25jbGljayhzZWxmLCBmdW4sIGJ0bj0xLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIG1vdXNlLWNsaWNrIGV2ZW50IG9uIGNhbnZhcy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZ1biAtLSBhIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZQorICAgICAgICAgICAgICAgY2xpY2tlZCBwb2ludCBvbiB0aGUgY2FudmFzLgorICAgICAgICBudW0gLS0gdGhlIG51bWJlciBvZiB0aGUgbW91c2UtYnV0dG9uLCBkZWZhdWx0cyB0byAxCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbgorICAgICAgICBhbmQgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKworICAgICAgICA+Pj4gc2NyZWVuLm9uY2xpY2soZ290bykKKyAgICAgICAgPj4+ICMgU3Vic2VxdWVudGx5IGNsaWNraW5nIGludG8gdGhlIFR1cnRsZVNjcmVlbiB3aWxsCisgICAgICAgID4+PiAjIG1ha2UgdGhlIHR1cnRsZSBtb3ZlIHRvIHRoZSBjbGlja2VkIHBvaW50LgorICAgICAgICA+Pj4gc2NyZWVuLm9uY2xpY2soTm9uZSkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX29uc2NyZWVuY2xpY2soZnVuLCBidG4sIGFkZCkKKworICAgIGRlZiBvbmtleShzZWxmLCBmdW4sIGtleSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIGtleS1yZWxlYXNlIGV2ZW50IG9mIGtleS4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZ1biAtLSBhIGZ1bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzCisgICAgICAgIGtleSAtLSBhIHN0cmluZzoga2V5IChlLmcuICJhIikgb3Iga2V5LXN5bWJvbCAoZS5nLiAic3BhY2UiKQorCisgICAgICAgIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gcmVnaXN0ZXIga2V5LWV2ZW50cywgVHVydGxlU2NyZWVuCisgICAgICAgIG11c3QgaGF2ZSBmb2N1cy4gKFNlZSBtZXRob2QgbGlzdGVuLikKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKworICAgICAgICA+Pj4gZGVmIGYoKToKKyAgICAgICAgLi4uICAgICBmZCg1MCkKKyAgICAgICAgLi4uICAgICBsdCg2MCkKKyAgICAgICAgLi4uCisgICAgICAgID4+PiBzY3JlZW4ub25rZXkoZiwgIlVwIikKKyAgICAgICAgPj4+IHNjcmVlbi5saXN0ZW4oKQorCisgICAgICAgIFN1YnNlcXVlbnRseSB0aGUgdHVydGxlIGNhbiBiZSBtb3ZlZCBieSByZXBlYXRlZGx5IHByZXNzaW5nCisgICAgICAgIHRoZSB1cC1hcnJvdyBrZXksIGNvbnNlcXVlbnRseSBkcmF3aW5nIGEgaGV4YWdvbgorCisgICAgICAgICIiIgorICAgICAgICBpZiBmdW4gaXMgTm9uZToKKyAgICAgICAgICAgIGlmIGtleSBpbiBzZWxmLl9rZXlzOgorICAgICAgICAgICAgICAgIHNlbGYuX2tleXMucmVtb3ZlKGtleSkKKyAgICAgICAgZWxpZiBrZXkgbm90IGluIHNlbGYuX2tleXM6CisgICAgICAgICAgICBzZWxmLl9rZXlzLmFwcGVuZChrZXkpCisgICAgICAgIHNlbGYuX29ua2V5KGZ1biwga2V5KQorCisgICAgZGVmIGxpc3RlbihzZWxmLCB4ZHVtbXk9Tm9uZSwgeWR1bW15PU5vbmUpOgorICAgICAgICAiIiJTZXQgZm9jdXMgb24gVHVydGxlU2NyZWVuIChpbiBvcmRlciB0byBjb2xsZWN0IGtleS1ldmVudHMpCisKKyAgICAgICAgTm8gYXJndW1lbnRzLgorICAgICAgICBEdW1teSBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIGluIG9yZGVyCisgICAgICAgIHRvIGJlIGFibGUgdG8gcGFzcyBsaXN0ZW4gdG8gdGhlIG9uY2xpY2sgbWV0aG9kLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLmxpc3RlbigpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9saXN0ZW4oKQorCisgICAgZGVmIG9udGltZXIoc2VsZiwgZnVuLCB0PTApOgorICAgICAgICAiIiJJbnN0YWxsIGEgdGltZXIsIHdoaWNoIGNhbGxzIGZ1biBhZnRlciB0IG1pbGxpc2Vjb25kcy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIGZ1biAtLSBhIGZ1bmN0aW9uIHdpdGggbm8gYXJndW1lbnRzLgorICAgICAgICB0IC0tIGEgbnVtYmVyID49IDAKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGVTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKworICAgICAgICA+Pj4gcnVubmluZyA9IFRydWUKKyAgICAgICAgPj4+IGRlZiBmKCk6CisgICAgICAgIC4uLiAgICAgaWYgcnVubmluZzoKKyAgICAgICAgLi4uICAgICAgICAgICAgIGZkKDUwKQorICAgICAgICAuLi4gICAgICAgICAgICAgbHQoNjApCisgICAgICAgIC4uLiAgICAgICAgICAgICBzY3JlZW4ub250aW1lcihmLCAyNTApCisgICAgICAgIC4uLgorICAgICAgICA+Pj4gZigpICAgIyBtYWtlcyB0aGUgdHVydGxlIG1hcmNoaW5nIGFyb3VuZAorICAgICAgICA+Pj4gcnVubmluZyA9IEZhbHNlCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9vbnRpbWVyKGZ1biwgdCkKKworICAgIGRlZiBiZ3BpYyhzZWxmLCBwaWNuYW1lPU5vbmUpOgorICAgICAgICAiIiJTZXQgYmFja2dyb3VuZCBpbWFnZSBvciByZXR1cm4gbmFtZSBvZiBjdXJyZW50IGJhY2tncm91bmRpbWFnZS4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgICAgcGljbmFtZSAtLSBhIHN0cmluZywgbmFtZSBvZiBhIGdpZi1maWxlIG9yICJub3BpYyIuCisKKyAgICAgICAgSWYgcGljbmFtZSBpcyBhIGZpbGVuYW1lLCBzZXQgdGhlIGNvcnJlc3BvbmRpbmcgaW1hZ2UgYXMgYmFja2dyb3VuZC4KKyAgICAgICAgSWYgcGljbmFtZSBpcyAibm9waWMiLCBkZWxldGUgYmFja2dyb3VuZGltYWdlLCBpZiBwcmVzZW50LgorICAgICAgICBJZiBwaWNuYW1lIGlzIE5vbmUsIHJldHVybiB0aGUgZmlsZW5hbWUgb2YgdGhlIGN1cnJlbnQgYmFja2dyb3VuZGltYWdlLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLmJncGljKCkKKyAgICAgICAgJ25vcGljJworICAgICAgICA+Pj4gc2NyZWVuLmJncGljKCJsYW5kc2NhcGUuZ2lmIikKKyAgICAgICAgPj4+IHNjcmVlbi5iZ3BpYygpCisgICAgICAgICdsYW5kc2NhcGUuZ2lmJworICAgICAgICAiIiIKKyAgICAgICAgaWYgcGljbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2JncGljbmFtZQorICAgICAgICBpZiBwaWNuYW1lIG5vdCBpbiBzZWxmLl9iZ3BpY3M6CisgICAgICAgICAgICBzZWxmLl9iZ3BpY3NbcGljbmFtZV0gPSBzZWxmLl9pbWFnZShwaWNuYW1lKQorICAgICAgICBzZWxmLl9zZXRiZ3BpYyhzZWxmLl9iZ3BpYywgc2VsZi5fYmdwaWNzW3BpY25hbWVdKQorICAgICAgICBzZWxmLl9iZ3BpY25hbWUgPSBwaWNuYW1lCisKKyAgICBkZWYgc2NyZWVuc2l6ZShzZWxmLCBjYW52d2lkdGg9Tm9uZSwgY2FudmhlaWdodD1Ob25lLCBiZz1Ob25lKToKKyAgICAgICAgIiIiUmVzaXplIHRoZSBjYW52YXMgdGhlIHR1cnRsZXMgYXJlIGRyYXdpbmcgb24uCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICBjYW52d2lkdGggLS0gcG9zaXRpdmUgaW50ZWdlciwgbmV3IHdpZHRoIG9mIGNhbnZhcyBpbiBwaXhlbHMKKyAgICAgICAgY2FudmhlaWdodCAtLSAgcG9zaXRpdmUgaW50ZWdlciwgbmV3IGhlaWdodCBvZiBjYW52YXMgaW4gcGl4ZWxzCisgICAgICAgIGJnIC0tIGNvbG9yc3RyaW5nIG9yIGNvbG9yLXR1cGxlLCBuZXcgYmFja2dyb3VuZGNvbG9yCisgICAgICAgIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIHJldHVybiBjdXJyZW50IChjYW52YXN3aWR0aCwgY2FudmFzaGVpZ2h0KQorCisgICAgICAgIERvIG5vdCBhbHRlciB0aGUgZHJhd2luZyB3aW5kb3cuIFRvIG9ic2VydmUgaGlkZGVuIHBhcnRzIG9mCisgICAgICAgIHRoZSBjYW52YXMgdXNlIHRoZSBzY3JvbGxiYXJzLiAoQ2FuIG1ha2UgdmlzaWJsZSB0aG9zZSBwYXJ0cworICAgICAgICBvZiBhIGRyYXdpbmcsIHdoaWNoIHdlcmUgb3V0c2lkZSB0aGUgY2FudmFzIGJlZm9yZSEpCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuc2NyZWVuc2l6ZSgyMDAwLDE1MDApCisgICAgICAgID4+PiAjIGUuIGcuIHRvIHNlYXJjaCBmb3IgYW4gZXJyb25lb3VzbHkgZXNjYXBlZCB0dXJ0bGUgOy0pCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcmVzaXplKGNhbnZ3aWR0aCwgY2FudmhlaWdodCwgYmcpCisKKyAgICBvbnNjcmVlbmNsaWNrID0gb25jbGljaworICAgIHJlc2V0c2NyZWVuID0gcmVzZXQKKyAgICBjbGVhcnNjcmVlbiA9IGNsZWFyCisgICAgYWRkc2hhcGUgPSByZWdpc3Rlcl9zaGFwZQorCitjbGFzcyBUTmF2aWdhdG9yKG9iamVjdCk6CisgICAgIiIiTmF2aWdhdGlvbiBwYXJ0IG9mIHRoZSBSYXdUdXJ0bGUuCisgICAgSW1wbGVtZW50cyBtZXRob2RzIGZvciB0dXJ0bGUgbW92ZW1lbnQuCisgICAgIiIiCisgICAgU1RBUlRfT1JJRU5UQVRJT04gPSB7CisgICAgICAgICJzdGFuZGFyZCI6IFZlYzJEKDEuMCwgMC4wKSwKKyAgICAgICAgIndvcmxkIiAgIDogVmVjMkQoMS4wLCAwLjApLAorICAgICAgICAibG9nbyIgICAgOiBWZWMyRCgwLjAsIDEuMCkgIH0KKyAgICBERUZBVUxUX01PREUgPSAic3RhbmRhcmQiCisgICAgREVGQVVMVF9BTkdMRU9GRlNFVCA9IDAKKyAgICBERUZBVUxUX0FOR0xFT1JJRU5UID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZGU9REVGQVVMVF9NT0RFKToKKyAgICAgICAgc2VsZi5fYW5nbGVPZmZzZXQgPSBzZWxmLkRFRkFVTFRfQU5HTEVPRkZTRVQKKyAgICAgICAgc2VsZi5fYW5nbGVPcmllbnQgPSBzZWxmLkRFRkFVTFRfQU5HTEVPUklFTlQKKyAgICAgICAgc2VsZi5fbW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi51bmRvYnVmZmVyID0gTm9uZQorICAgICAgICBzZWxmLmRlZ3JlZXMoKQorICAgICAgICBzZWxmLl9tb2RlID0gTm9uZQorICAgICAgICBzZWxmLl9zZXRtb2RlKG1vZGUpCisgICAgICAgIFROYXZpZ2F0b3IucmVzZXQoc2VsZikKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIicmVzZXQgdHVydGxlIHRvIGl0cyBpbml0aWFsIHZhbHVlcworCisgICAgICAgIFdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgcGFyZW50IGNsYXNzCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IFZlYzJEKDAuMCwgMC4wKQorICAgICAgICBzZWxmLl9vcmllbnQgPSAgVE5hdmlnYXRvci5TVEFSVF9PUklFTlRBVElPTltzZWxmLl9tb2RlXQorCisgICAgZGVmIF9zZXRtb2RlKHNlbGYsIG1vZGU9Tm9uZSk6CisgICAgICAgICIiIlNldCB0dXJ0bGUtbW9kZSB0byAnc3RhbmRhcmQnLCAnd29ybGQnIG9yICdsb2dvJy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9tb2RlCisgICAgICAgIGlmIG1vZGUgbm90IGluIFsic3RhbmRhcmQiLCAibG9nbyIsICJ3b3JsZCJdOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX21vZGUgPSBtb2RlCisgICAgICAgIGlmIG1vZGUgaW4gWyJzdGFuZGFyZCIsICJ3b3JsZCJdOgorICAgICAgICAgICAgc2VsZi5fYW5nbGVPZmZzZXQgPSAwCisgICAgICAgICAgICBzZWxmLl9hbmdsZU9yaWVudCA9IDEKKyAgICAgICAgZWxzZTogIyBtb2RlID09ICJsb2dvIjoKKyAgICAgICAgICAgIHNlbGYuX2FuZ2xlT2Zmc2V0ID0gc2VsZi5fZnVsbGNpcmNsZS80LgorICAgICAgICAgICAgc2VsZi5fYW5nbGVPcmllbnQgPSAtMQorCisgICAgZGVmIF9zZXREZWdyZWVzUGVyQVUoc2VsZiwgZnVsbGNpcmNsZSk6CisgICAgICAgICIiIkhlbHBlciBmdW5jdGlvbiBmb3IgZGVncmVlcygpIGFuZCByYWRpYW5zKCkiIiIKKyAgICAgICAgc2VsZi5fZnVsbGNpcmNsZSA9IGZ1bGxjaXJjbGUKKyAgICAgICAgc2VsZi5fZGVncmVlc1BlckFVID0gMzYwL2Z1bGxjaXJjbGUKKyAgICAgICAgaWYgc2VsZi5fbW9kZSA9PSAic3RhbmRhcmQiOgorICAgICAgICAgICAgc2VsZi5fYW5nbGVPZmZzZXQgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9hbmdsZU9mZnNldCA9IGZ1bGxjaXJjbGUvNC4KKworICAgIGRlZiBkZWdyZWVzKHNlbGYsIGZ1bGxjaXJjbGU9MzYwLjApOgorICAgICAgICAiIiIgU2V0IGFuZ2xlIG1lYXN1cmVtZW50IHVuaXRzIHRvIGRlZ3JlZXMuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIGZ1bGxjaXJjbGUgLSAgYSBudW1iZXIKKworICAgICAgICBTZXQgYW5nbGUgbWVhc3VyZW1lbnQgdW5pdHMsIGkuIGUuIHNldCBudW1iZXIKKyAgICAgICAgb2YgJ2RlZ3JlZXMnIGZvciBhIGZ1bGwgY2lyY2xlLiBEYWZhdWx0IHZhbHVlIGlzCisgICAgICAgIDM2MCBkZWdyZWVzLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDkwCisKKyAgICAgICAgQ2hhbmdlIGFuZ2xlIG1lYXN1cmVtZW50IHVuaXQgdG8gZ3JhZCAoYWxzbyBrbm93biBhcyBnb24sCisgICAgICAgIGdyYWRlLCBvciBncmFkaWFuIGFuZCBlcXVhbHMgMS8xMDAtdGggb2YgdGhlIHJpZ2h0IGFuZ2xlLikKKyAgICAgICAgPj4+IHR1cnRsZS5kZWdyZWVzKDQwMC4wKQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAxMDAKKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fc2V0RGVncmVlc1BlckFVKGZ1bGxjaXJjbGUpCisKKyAgICBkZWYgcmFkaWFucyhzZWxmKToKKyAgICAgICAgIiIiIFNldCB0aGUgYW5nbGUgbWVhc3VyZW1lbnQgdW5pdHMgdG8gcmFkaWFucy4KKworICAgICAgICBObyBhcmd1bWVudHMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDkwCisgICAgICAgID4+PiB0dXJ0bGUucmFkaWFucygpCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDEuNTcwNzk2MzI2Nzk0ODk2NgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fc2V0RGVncmVlc1BlckFVKDIqbWF0aC5waSkKKworICAgIGRlZiBfZ28oc2VsZiwgZGlzdGFuY2UpOgorICAgICAgICAiIiJtb3ZlIHR1cnRsZSBmb3J3YXJkIGJ5IHNwZWNpZmllZCBkaXN0YW5jZSIiIgorICAgICAgICBlbmRlID0gc2VsZi5fcG9zaXRpb24gKyBzZWxmLl9vcmllbnQgKiBkaXN0YW5jZQorICAgICAgICBzZWxmLl9nb3RvKGVuZGUpCisKKyAgICBkZWYgX3JvdGF0ZShzZWxmLCBhbmdsZSk6CisgICAgICAgICIiIlR1cm4gdHVydGxlIGNvdW50ZXJjbG9ja3dpc2UgYnkgc3BlY2lmaWVkIGFuZ2xlIGlmIGFuZ2xlID4gMC4iIiIKKyAgICAgICAgYW5nbGUgKj0gc2VsZi5fZGVncmVlc1BlckFVCisgICAgICAgIHNlbGYuX29yaWVudCA9IHNlbGYuX29yaWVudC5yb3RhdGUoYW5nbGUpCisKKyAgICBkZWYgX2dvdG8oc2VsZiwgZW5kKToKKyAgICAgICAgIiIibW92ZSB0dXJ0bGUgdG8gcG9zaXRpb24gZW5kLiIiIgorICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IGVuZAorCisgICAgZGVmIGZvcndhcmQoc2VsZiwgZGlzdGFuY2UpOgorICAgICAgICAiIiJNb3ZlIHRoZSB0dXJ0bGUgZm9yd2FyZCBieSB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLgorCisgICAgICAgIEFsaWFzZXM6IGZvcndhcmQgfCBmZAorCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICBkaXN0YW5jZSAtLSBhIG51bWJlciAoaW50ZWdlciBvciBmbG9hdCkKKworICAgICAgICBNb3ZlIHRoZSB0dXJ0bGUgZm9yd2FyZCBieSB0aGUgc3BlY2lmaWVkIGRpc3RhbmNlLCBpbiB0aGUgZGlyZWN0aW9uCisgICAgICAgIHRoZSB0dXJ0bGUgaXMgaGVhZGVkLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgKDAuMDAsIDAuMDApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgyNSkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgyNS4wMCwwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoLTc1KQorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgKC01MC4wMCwwLjAwKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZ28oZGlzdGFuY2UpCisKKyAgICBkZWYgYmFjayhzZWxmLCBkaXN0YW5jZSk6CisgICAgICAgICIiIk1vdmUgdGhlIHR1cnRsZSBiYWNrd2FyZCBieSBkaXN0YW5jZS4KKworICAgICAgICBBbGlhc2VzOiBiYWNrIHwgYmFja3dhcmQgfCBiaworCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICBkaXN0YW5jZSAtLSBhIG51bWJlcgorCisgICAgICAgIE1vdmUgdGhlIHR1cnRsZSBiYWNrd2FyZCBieSBkaXN0YW5jZSAsb3Bwb3NpdGUgdG8gdGhlIGRpcmVjdGlvbiB0aGUKKyAgICAgICAgdHVydGxlIGlzIGhlYWRlZC4gRG8gbm90IGNoYW5nZSB0aGUgdHVydGxlJ3MgaGVhZGluZy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgwLjAwLCAwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLmJhY2t3YXJkKDMwKQorICAgICAgICA+Pj4gdHVydGxlLnBvc2l0aW9uKCkKKyAgICAgICAgKC0zMC4wMCwgMC4wMCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2dvKC1kaXN0YW5jZSkKKworICAgIGRlZiByaWdodChzZWxmLCBhbmdsZSk6CisgICAgICAgICIiIlR1cm4gdHVydGxlIHJpZ2h0IGJ5IGFuZ2xlIHVuaXRzLgorCisgICAgICAgIEFsaWFzZXM6IHJpZ2h0IHwgcnQKKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgYW5nbGUgLS0gYSBudW1iZXIgKGludGVnZXIgb3IgZmxvYXQpCisKKyAgICAgICAgVHVybiB0dXJ0bGUgcmlnaHQgYnkgYW5nbGUgdW5pdHMuIChVbml0cyBhcmUgYnkgZGVmYXVsdCBkZWdyZWVzLAorICAgICAgICBidXQgY2FuIGJlIHNldCB2aWEgdGhlIGRlZ3JlZXMoKSBhbmQgcmFkaWFucygpIGZ1bmN0aW9ucy4pCisgICAgICAgIEFuZ2xlIG9yaWVudGF0aW9uIGRlcGVuZHMgb24gbW9kZS4gKFNlZSB0aGlzLikKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgMjIuMAorICAgICAgICA+Pj4gdHVydGxlLnJpZ2h0KDQ1KQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAzMzcuMAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcm90YXRlKC1hbmdsZSkKKworICAgIGRlZiBsZWZ0KHNlbGYsIGFuZ2xlKToKKyAgICAgICAgIiIiVHVybiB0dXJ0bGUgbGVmdCBieSBhbmdsZSB1bml0cy4KKworICAgICAgICBBbGlhc2VzOiBsZWZ0IHwgbHQKKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgYW5nbGUgLS0gYSBudW1iZXIgKGludGVnZXIgb3IgZmxvYXQpCisKKyAgICAgICAgVHVybiB0dXJ0bGUgbGVmdCBieSBhbmdsZSB1bml0cy4gKFVuaXRzIGFyZSBieSBkZWZhdWx0IGRlZ3JlZXMsCisgICAgICAgIGJ1dCBjYW4gYmUgc2V0IHZpYSB0aGUgZGVncmVlcygpIGFuZCByYWRpYW5zKCkgZnVuY3Rpb25zLikKKyAgICAgICAgQW5nbGUgb3JpZW50YXRpb24gZGVwZW5kcyBvbiBtb2RlLiAoU2VlIHRoaXMuKQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAyMi4wCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg0NSkKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgNjcuMAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcm90YXRlKGFuZ2xlKQorCisgICAgZGVmIHBvcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0dXJ0bGUncyBjdXJyZW50IGxvY2F0aW9uICh4LHkpLCBhcyBhIFZlYzJELXZlY3Rvci4KKworICAgICAgICBBbGlhc2VzOiBwb3MgfCBwb3NpdGlvbgorCisgICAgICAgIE5vIGFyZ3VtZW50cy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3MoKQorICAgICAgICAoMC4wMCwgMjQwLjAwKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Bvc2l0aW9uCisKKyAgICBkZWYgeGNvcihzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgdHVydGxlJ3MgeCBjb29yZGluYXRlLgorCisgICAgICAgIE5vIGFyZ3VtZW50cy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHJlc2V0KCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDYwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gcHJpbnQgdHVydGxlLnhjb3IoKQorICAgICAgICA1MC4wCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcG9zaXRpb25bMF0KKworICAgIGRlZiB5Y29yKHNlbGYpOgorICAgICAgICAiIiIgUmV0dXJuIHRoZSB0dXJ0bGUncyB5IGNvb3JkaW5hdGUKKyAgICAgICAgLS0tCisgICAgICAgIE5vIGFyZ3VtZW50cy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHJlc2V0KCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDYwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gcHJpbnQgdHVydGxlLnljb3IoKQorICAgICAgICA4Ni42MDI1NDAzNzg0CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcG9zaXRpb25bMV0KKworCisgICAgZGVmIGdvdG8oc2VsZiwgeCwgeT1Ob25lKToKKyAgICAgICAgIiIiTW92ZSB0dXJ0bGUgdG8gYW4gYWJzb2x1dGUgcG9zaXRpb24uCisKKyAgICAgICAgQWxpYXNlczogc2V0cG9zIHwgc2V0cG9zaXRpb24gfCBnb3RvOgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgeCAtLSBhIG51bWJlciAgICAgIG9yICAgICBhIHBhaXIvdmVjdG9yIG9mIG51bWJlcnMKKyAgICAgICAgeSAtLSBhIG51bWJlciAgICAgICAgICAgICBOb25lCisKKyAgICAgICAgY2FsbDogZ290byh4LCB5KSAgICAgICAgICMgdHdvIGNvb3JkaW5hdGVzCisgICAgICAgIC0tb3I6IGdvdG8oKHgsIHkpKSAgICAgICAjIGEgcGFpciAodHVwbGUpIG9mIGNvb3JkaW5hdGVzCisgICAgICAgIC0tb3I6IGdvdG8odmVjKSAgICAgICAgICAjIGUuZy4gYXMgcmV0dXJuZWQgYnkgcG9zKCkKKworICAgICAgICBNb3ZlIHR1cnRsZSB0byBhbiBhYnNvbHV0ZSBwb3NpdGlvbi4gSWYgdGhlIHBlbiBpcyBkb3duLAorICAgICAgICBhIGxpbmUgd2lsbCBiZSBkcmF3bi4gVGhlIHR1cnRsZSdzIG9yaWVudGF0aW9uIGRvZXMgbm90IGNoYW5nZS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHRwID0gdHVydGxlLnBvcygpCisgICAgICAgID4+PiB0cAorICAgICAgICAoMC4wMCwgMC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5zZXRwb3MoNjAsMzApCisgICAgICAgID4+PiB0dXJ0bGUucG9zKCkKKyAgICAgICAgKDYwLjAwLDMwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLnNldHBvcygoMjAsODApKQorICAgICAgICA+Pj4gdHVydGxlLnBvcygpCisgICAgICAgICgyMC4wMCw4MC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5zZXRwb3ModHApCisgICAgICAgID4+PiB0dXJ0bGUucG9zKCkKKyAgICAgICAgKDAuMDAsMC4wMCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHkgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2dvdG8oVmVjMkQoKngpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZ290byhWZWMyRCh4LCB5KSkKKworICAgIGRlZiBob21lKHNlbGYpOgorICAgICAgICAiIiJNb3ZlIHR1cnRsZSB0byB0aGUgb3JpZ2luIC0gY29vcmRpbmF0ZXMgKDAsMCkuCisKKyAgICAgICAgTm8gYXJndW1lbnRzLgorCisgICAgICAgIE1vdmUgdHVydGxlIHRvIHRoZSBvcmlnaW4gLSBjb29yZGluYXRlcyAoMCwwKSBhbmQgc2V0IGl0cworICAgICAgICBoZWFkaW5nIHRvIGl0cyBzdGFydC1vcmllbnRhdGlvbiAod2hpY2ggZGVwZW5kcyBvbiBtb2RlKS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5ob21lKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZ290bygwLCAwKQorICAgICAgICBzZWxmLnNldGhlYWRpbmcoMCkKKworICAgIGRlZiBzZXR4KHNlbGYsIHgpOgorICAgICAgICAiIiJTZXQgdGhlIHR1cnRsZSdzIGZpcnN0IGNvb3JkaW5hdGUgdG8geAorCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICB4IC0tIGEgbnVtYmVyIChpbnRlZ2VyIG9yIGZsb2F0KQorCisgICAgICAgIFNldCB0aGUgdHVydGxlJ3MgZmlyc3QgY29vcmRpbmF0ZSB0byB4LCBsZWF2ZSBzZWNvbmQgY29vcmRpbmF0ZQorICAgICAgICB1bmNoYW5nZWQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMC4wMCwgMjQwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLnNldHgoMTApCisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMTAuMDAsIDI0MC4wMCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2dvdG8oVmVjMkQoeCwgc2VsZi5fcG9zaXRpb25bMV0pKQorCisgICAgZGVmIHNldHkoc2VsZiwgeSk6CisgICAgICAgICIiIlNldCB0aGUgdHVydGxlJ3Mgc2Vjb25kIGNvb3JkaW5hdGUgdG8geQorCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICB5IC0tIGEgbnVtYmVyIChpbnRlZ2VyIG9yIGZsb2F0KQorCisgICAgICAgIFNldCB0aGUgdHVydGxlJ3MgZmlyc3QgY29vcmRpbmF0ZSB0byB4LCBzZWNvbmQgY29vcmRpbmF0ZSByZW1haW5zCisgICAgICAgIHVuY2hhbmdlZC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgwLjAwLCA0MC4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5zZXR5KC0xMCkKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgwLjAwLCAtMTAuMDApCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9nb3RvKFZlYzJEKHNlbGYuX3Bvc2l0aW9uWzBdLCB5KSkKKworICAgIGRlZiBkaXN0YW5jZShzZWxmLCB4LCB5PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGRpc3RhbmNlIGZyb20gdGhlIHR1cnRsZSB0byAoeCx5KSBpbiB0dXJ0bGUgc3RlcCB1bml0cy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIHggLS0gYSBudW1iZXIgICBvciAgYSBwYWlyL3ZlY3RvciBvZiBudW1iZXJzICAgb3IgICBhIHR1cnRsZSBpbnN0YW5jZQorICAgICAgICB5IC0tIGEgbnVtYmVyICAgICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZQorCisgICAgICAgIGNhbGw6IGRpc3RhbmNlKHgsIHkpICAgICAgICAgIyB0d28gY29vcmRpbmF0ZXMKKyAgICAgICAgLS1vcjogZGlzdGFuY2UoKHgsIHkpKSAgICAgICAjIGEgcGFpciAodHVwbGUpIG9mIGNvb3JkaW5hdGVzCisgICAgICAgIC0tb3I6IGRpc3RhbmNlKHZlYykgICAgICAgICAgIyBlLmcuIGFzIHJldHVybmVkIGJ5IHBvcygpCisgICAgICAgIC0tb3I6IGRpc3RhbmNlKG15cGVuKSAgICAgICAgIyB3aGVyZSBteXBlbiBpcyBhbm90aGVyIHR1cnRsZQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnBvcygpCisgICAgICAgICgwLjAwLCAwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLmRpc3RhbmNlKDMwLDQwKQorICAgICAgICA1MC4wCisgICAgICAgID4+PiBwZW4gPSBUdXJ0bGUoKQorICAgICAgICA+Pj4gcGVuLmZvcndhcmQoNzcpCisgICAgICAgID4+PiB0dXJ0bGUuZGlzdGFuY2UocGVuKQorICAgICAgICA3Ny4wCisgICAgICAgICIiIgorICAgICAgICBpZiB5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcG9zID0gVmVjMkQoeCwgeSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBWZWMyRCk6CisgICAgICAgICAgICBwb3MgPSB4CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh4LCB0dXBsZSk6CisgICAgICAgICAgICBwb3MgPSBWZWMyRCgqeCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHgsIFROYXZpZ2F0b3IpOgorICAgICAgICAgICAgcG9zID0geC5fcG9zaXRpb24KKyAgICAgICAgcmV0dXJuIGFicyhwb3MgLSBzZWxmLl9wb3NpdGlvbikKKworICAgIGRlZiB0b3dhcmRzKHNlbGYsIHgsIHk9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgYW5nbGUgb2YgdGhlIGxpbmUgZnJvbSB0aGUgdHVydGxlJ3MgcG9zaXRpb24gdG8gKHgsIHkpLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgeCAtLSBhIG51bWJlciAgIG9yICBhIHBhaXIvdmVjdG9yIG9mIG51bWJlcnMgICBvciAgIGEgdHVydGxlIGluc3RhbmNlCisgICAgICAgIHkgLS0gYSBudW1iZXIgICAgICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lCisKKyAgICAgICAgY2FsbDogZGlzdGFuY2UoeCwgeSkgICAgICAgICAjIHR3byBjb29yZGluYXRlcworICAgICAgICAtLW9yOiBkaXN0YW5jZSgoeCwgeSkpICAgICAgICMgYSBwYWlyICh0dXBsZSkgb2YgY29vcmRpbmF0ZXMKKyAgICAgICAgLS1vcjogZGlzdGFuY2UodmVjKSAgICAgICAgICAjIGUuZy4gYXMgcmV0dXJuZWQgYnkgcG9zKCkKKyAgICAgICAgLS1vcjogZGlzdGFuY2UobXlwZW4pICAgICAgICAjIHdoZXJlIG15cGVuIGlzIGFub3RoZXIgdHVydGxlCisKKyAgICAgICAgUmV0dXJuIHRoZSBhbmdsZSwgYmV0d2VlbiB0aGUgbGluZSBmcm9tIHR1cnRsZS1wb3NpdGlvbiB0byBwb3NpdGlvbgorICAgICAgICBzcGVjaWZpZWQgYnkgeCwgeSBhbmQgdGhlIHR1cnRsZSdzIHN0YXJ0IG9yaWVudGF0aW9uLiAoRGVwZW5kcyBvbgorICAgICAgICBtb2RlcyAtICJzdGFuZGFyZCIgb3IgImxvZ28iKQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnBvcygpCisgICAgICAgICgxMC4wMCwgMTAuMDApCisgICAgICAgID4+PiB0dXJ0bGUudG93YXJkcygwLDApCisgICAgICAgIDIyNS4wCisgICAgICAgICIiIgorICAgICAgICBpZiB5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcG9zID0gVmVjMkQoeCwgeSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBWZWMyRCk6CisgICAgICAgICAgICBwb3MgPSB4CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh4LCB0dXBsZSk6CisgICAgICAgICAgICBwb3MgPSBWZWMyRCgqeCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHgsIFROYXZpZ2F0b3IpOgorICAgICAgICAgICAgcG9zID0geC5fcG9zaXRpb24KKyAgICAgICAgeCwgeSA9IHBvcyAtIHNlbGYuX3Bvc2l0aW9uCisgICAgICAgIHJlc3VsdCA9IHJvdW5kKG1hdGguYXRhbjIoeSwgeCkqMTgwLjAvbWF0aC5waSwgMTApICUgMzYwLjAKKyAgICAgICAgcmVzdWx0IC89IHNlbGYuX2RlZ3JlZXNQZXJBVQorICAgICAgICByZXR1cm4gKHNlbGYuX2FuZ2xlT2Zmc2V0ICsgc2VsZi5fYW5nbGVPcmllbnQqcmVzdWx0KSAlIHNlbGYuX2Z1bGxjaXJjbGUKKworICAgIGRlZiBoZWFkaW5nKHNlbGYpOgorICAgICAgICAiIiIgUmV0dXJuIHRoZSB0dXJ0bGUncyBjdXJyZW50IGhlYWRpbmcuCisKKyAgICAgICAgTm8gYXJndW1lbnRzLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoNjcpCisgICAgICAgID4+PiB0dXJ0bGUuaGVhZGluZygpCisgICAgICAgIDY3LjAKKyAgICAgICAgIiIiCisgICAgICAgIHgsIHkgPSBzZWxmLl9vcmllbnQKKyAgICAgICAgcmVzdWx0ID0gcm91bmQobWF0aC5hdGFuMih5LCB4KSoxODAuMC9tYXRoLnBpLCAxMCkgJSAzNjAuMAorICAgICAgICByZXN1bHQgLz0gc2VsZi5fZGVncmVlc1BlckFVCisgICAgICAgIHJldHVybiAoc2VsZi5fYW5nbGVPZmZzZXQgKyBzZWxmLl9hbmdsZU9yaWVudCpyZXN1bHQpICUgc2VsZi5fZnVsbGNpcmNsZQorCisgICAgZGVmIHNldGhlYWRpbmcoc2VsZiwgdG9fYW5nbGUpOgorICAgICAgICAiIiJTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSB0dXJ0bGUgdG8gdG9fYW5nbGUuCisKKyAgICAgICAgQWxpYXNlczogIHNldGhlYWRpbmcgfCBzZXRoCisKKyAgICAgICAgQXJndW1lbnQ6CisgICAgICAgIHRvX2FuZ2xlIC0tIGEgbnVtYmVyIChpbnRlZ2VyIG9yIGZsb2F0KQorCisgICAgICAgIFNldCB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHR1cnRsZSB0byB0b19hbmdsZS4KKyAgICAgICAgSGVyZSBhcmUgc29tZSBjb21tb24gZGlyZWN0aW9ucyBpbiBkZWdyZWVzOgorCisgICAgICAgICBzdGFuZGFyZCAtIG1vZGU6ICAgICAgICAgIGxvZ28tbW9kZToKKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAwIC0gZWFzdCAgICAgICAgICAgICAgICAwIC0gbm9ydGgKKyAgICAgICAgICA5MCAtIG5vcnRoICAgICAgICAgICAgICA5MCAtIGVhc3QKKyAgICAgICAgIDE4MCAtIHdlc3QgICAgICAgICAgICAgIDE4MCAtIHNvdXRoCisgICAgICAgICAyNzAgLSBzb3V0aCAgICAgICAgICAgICAyNzAgLSB3ZXN0CisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuc2V0aGVhZGluZyg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgOTAKKyAgICAgICAgIiIiCisgICAgICAgIGFuZ2xlID0gKHRvX2FuZ2xlIC0gc2VsZi5oZWFkaW5nKCkpKnNlbGYuX2FuZ2xlT3JpZW50CisgICAgICAgIGZ1bGwgPSBzZWxmLl9mdWxsY2lyY2xlCisgICAgICAgIGFuZ2xlID0gKGFuZ2xlK2Z1bGwvMi4pJWZ1bGwgLSBmdWxsLzIuCisgICAgICAgIHNlbGYuX3JvdGF0ZShhbmdsZSkKKworICAgIGRlZiBjaXJjbGUoc2VsZiwgcmFkaXVzLCBleHRlbnQgPSBOb25lLCBzdGVwcyA9IE5vbmUpOgorICAgICAgICAiIiIgRHJhdyBhIGNpcmNsZSB3aXRoIGdpdmVuIHJhZGl1cy4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIHJhZGl1cyAtLSBhIG51bWJlcgorICAgICAgICBleHRlbnQgKG9wdGlvbmFsKSAtLSBhIG51bWJlcgorICAgICAgICBzdGVwcyAob3B0aW9uYWwpIC0tIGFuIGludGVnZXIKKworICAgICAgICBEcmF3IGEgY2lyY2xlIHdpdGggZ2l2ZW4gcmFkaXVzLiBUaGUgY2VudGVyIGlzIHJhZGl1cyB1bml0cyBsZWZ0CisgICAgICAgIG9mIHRoZSB0dXJ0bGU7IGV4dGVudCAtIGFuIGFuZ2xlIC0gZGV0ZXJtaW5lcyB3aGljaCBwYXJ0IG9mIHRoZQorICAgICAgICBjaXJjbGUgaXMgZHJhd24uIElmIGV4dGVudCBpcyBub3QgZ2l2ZW4sIGRyYXcgdGhlIGVudGlyZSBjaXJjbGUuCisgICAgICAgIElmIGV4dGVudCBpcyBub3QgYSBmdWxsIGNpcmNsZSwgb25lIGVuZHBvaW50IG9mIHRoZSBhcmMgaXMgdGhlCisgICAgICAgIGN1cnJlbnQgcGVuIHBvc2l0aW9uLiBEcmF3IHRoZSBhcmMgaW4gY291bnRlcmNsb2Nrd2lzZSBkaXJlY3Rpb24KKyAgICAgICAgaWYgcmFkaXVzIGlzIHBvc2l0aXZlLCBvdGhlcndpc2UgaW4gY2xvY2t3aXNlIGRpcmVjdGlvbi4gRmluYWxseQorICAgICAgICB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0dXJ0bGUgaXMgY2hhbmdlZCBieSB0aGUgYW1vdW50IG9mIGV4dGVudC4KKworICAgICAgICBBcyB0aGUgY2lyY2xlIGlzIGFwcHJveGltYXRlZCBieSBhbiBpbnNjcmliZWQgcmVndWxhciBwb2x5Z29uLAorICAgICAgICBzdGVwcyBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2Ygc3RlcHMgdG8gdXNlLiBJZiBub3QgZ2l2ZW4sCisgICAgICAgIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBhdXRvbWF0aWNhbGx5LiBNYXliZSB1c2VkIHRvIGRyYXcgcmVndWxhcgorICAgICAgICBwb2x5Z29ucy4KKworICAgICAgICBjYWxsOiBjaXJjbGUocmFkaXVzKSAgICAgICAgICAgICAgICAgICMgZnVsbCBjaXJjbGUKKyAgICAgICAgLS1vcjogY2lyY2xlKHJhZGl1cywgZXh0ZW50KSAgICAgICAgICAjIGFyYworICAgICAgICAtLW9yOiBjaXJjbGUocmFkaXVzLCBleHRlbnQsIHN0ZXBzKQorICAgICAgICAtLW9yOiBjaXJjbGUocmFkaXVzLCBzdGVwcz02KSAgICAgICAgICMgNi1zaWRlZCBwb2x5Z29uCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuY2lyY2xlKDUwKQorICAgICAgICA+Pj4gdHVydGxlLmNpcmNsZSgxMjAsIDE4MCkgICMgc2VtaWNpcmNsZQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2goWyJzZXEiXSkKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5jdW11bGF0ZSA9IFRydWUKKyAgICAgICAgc3BlZWQgPSBzZWxmLnNwZWVkKCkKKyAgICAgICAgaWYgZXh0ZW50IGlzIE5vbmU6CisgICAgICAgICAgICBleHRlbnQgPSBzZWxmLl9mdWxsY2lyY2xlCisgICAgICAgIGlmIHN0ZXBzIGlzIE5vbmU6CisgICAgICAgICAgICBmcmFjID0gYWJzKGV4dGVudCkvc2VsZi5fZnVsbGNpcmNsZQorICAgICAgICAgICAgc3RlcHMgPSAxK2ludChtaW4oMTErYWJzKHJhZGl1cykvNi4wLCA1OS4wKSpmcmFjKQorICAgICAgICB3ID0gMS4wICogZXh0ZW50IC8gc3RlcHMKKyAgICAgICAgdzIgPSAwLjUgKiB3CisgICAgICAgIGwgPSAyLjAgKiByYWRpdXMgKiBtYXRoLnNpbih3MiptYXRoLnBpLzE4MC4wKnNlbGYuX2RlZ3JlZXNQZXJBVSkKKyAgICAgICAgaWYgcmFkaXVzIDwgMDoKKyAgICAgICAgICAgIGwsIHcsIHcyID0gLWwsIC13LCAtdzIKKyAgICAgICAgdHIgPSBzZWxmLnRyYWNlcigpCisgICAgICAgIGRsID0gc2VsZi5fZGVsYXkoKQorICAgICAgICBpZiBzcGVlZCA9PSAwOgorICAgICAgICAgICAgc2VsZi50cmFjZXIoMCwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3BlZWQoMCkKKyAgICAgICAgc2VsZi5fcm90YXRlKHcyKQorICAgICAgICBmb3IgaSBpbiByYW5nZShzdGVwcyk6CisgICAgICAgICAgICBzZWxmLnNwZWVkKHNwZWVkKQorICAgICAgICAgICAgc2VsZi5fZ28obCkKKyAgICAgICAgICAgIHNlbGYuc3BlZWQoMCkKKyAgICAgICAgICAgIHNlbGYuX3JvdGF0ZSh3KQorICAgICAgICBzZWxmLl9yb3RhdGUoLXcyKQorICAgICAgICBpZiBzcGVlZCA9PSAwOgorICAgICAgICAgICAgc2VsZi50cmFjZXIodHIsIGRsKQorICAgICAgICBzZWxmLnNwZWVkKHNwZWVkKQorICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIuY3VtdWxhdGUgPSBGYWxzZQorCisjIyB0aHJlZSBkdW1teSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzOgorCisgICAgZGVmIHNwZWVkKHNlbGYsIHM9MCk6CisgICAgICAgICIiImR1bW15IG1ldGhvZCAtIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IGNoaWxkIGNsYXNzIiIiCisgICAgZGVmIHRyYWNlcihzZWxmLCBhPU5vbmUsIGI9Tm9uZSk6CisgICAgICAgICIiImR1bW15IG1ldGhvZCAtIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IGNoaWxkIGNsYXNzIiIiCisgICAgZGVmIF9kZWxheShzZWxmLCBuPU5vbmUpOgorICAgICAgICAiIiJkdW1teSBtZXRob2QgLSB0byBiZSBvdmVyd3JpdHRlbiBieSBjaGlsZCBjbGFzcyIiIgorCisgICAgZmQgPSBmb3J3YXJkCisgICAgYmsgPSBiYWNrCisgICAgYmFja3dhcmQgPSBiYWNrCisgICAgcnQgPSByaWdodAorICAgIGx0ID0gbGVmdAorICAgIHBvc2l0aW9uID0gcG9zCisgICAgc2V0cG9zID0gZ290bworICAgIHNldHBvc2l0aW9uID0gZ290bworICAgIHNldGggPSBzZXRoZWFkaW5nCisKKworY2xhc3MgVFBlbihvYmplY3QpOgorICAgICIiIkRyYXdpbmcgcGFydCBvZiB0aGUgUmF3VHVydGxlLgorICAgIEltcGxlbWVudHMgZHJhd2luZyBwcm9wZXJ0aWVzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXNpemVtb2RlPV9DRkdbInJlc2l6ZW1vZGUiXSk6CisgICAgICAgIHNlbGYuX3Jlc2l6ZW1vZGUgPSByZXNpemVtb2RlICMgb3IgInVzZXIiIG9yICJub3Jlc2l6ZSIKKyAgICAgICAgc2VsZi51bmRvYnVmZmVyID0gTm9uZQorICAgICAgICBUUGVuLl9yZXNldChzZWxmKQorCisgICAgZGVmIF9yZXNldChzZWxmLCBwZW5jb2xvcj1fQ0ZHWyJwZW5jb2xvciJdLAorICAgICAgICAgICAgICAgICAgICAgZmlsbGNvbG9yPV9DRkdbImZpbGxjb2xvciJdKToKKyAgICAgICAgc2VsZi5fcGVuc2l6ZSA9IDEKKyAgICAgICAgc2VsZi5fc2hvd24gPSBUcnVlCisgICAgICAgIHNlbGYuX3BlbmNvbG9yID0gcGVuY29sb3IKKyAgICAgICAgc2VsZi5fZmlsbGNvbG9yID0gZmlsbGNvbG9yCisgICAgICAgIHNlbGYuX2RyYXdpbmcgPSBUcnVlCisgICAgICAgIHNlbGYuX3NwZWVkID0gMworICAgICAgICBzZWxmLl9zdHJldGNoZmFjdG9yID0gKDEsIDEpCisgICAgICAgIHNlbGYuX3RpbHQgPSAwCisgICAgICAgIHNlbGYuX291dGxpbmV3aWR0aCA9IDEKKyAgICAgICAgIyMjIHNlbGYuc2NyZWVuID0gTm9uZSAgIyB0byBvdmVycmlkZSBieSBjaGlsZCBjbGFzcworCisgICAgZGVmIHJlc2l6ZW1vZGUoc2VsZiwgcm1vZGU9Tm9uZSk6CisgICAgICAgICIiIlNldCByZXNpemVtb2RlIHRvIG9uZSBvZiB0aGUgdmFsdWVzOiAiYXV0byIsICJ1c2VyIiwgIm5vcmVzaXplIi4KKworICAgICAgICAoT3B0aW9uYWwpIEFyZ3VtZW50OgorICAgICAgICBybW9kZSAtLSBvbmUgb2YgdGhlIHN0cmluZ3MgImF1dG8iLCAidXNlciIsICJub3Jlc2l6ZSIKKworICAgICAgICBEaWZmZXJlbnQgcmVzaXplbW9kZXMgaGF2ZSB0aGUgZm9sbG93aW5nIGVmZmVjdHM6CisgICAgICAgICAgLSAiYXV0byIgYWRhcHRzIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSB0dXJ0bGUKKyAgICAgICAgICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZSBvZiBwZW5zaXplLgorICAgICAgICAgIC0gInVzZXIiIGFkYXB0cyB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgdHVydGxlIGFjY29yZGluZyB0byB0aGUKKyAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2Ygc3RyZXRjaGZhY3RvciBhbmQgb3V0bGluZXdpZHRoIChvdXRsaW5lKSwKKyAgICAgICAgICAgICAgICAgICB3aGljaCBhcmUgc2V0IGJ5IHNoYXBlc2l6ZSgpCisgICAgICAgICAgLSAibm9yZXNpemUiIG5vIGFkYXB0aW9uIG9mIHRoZSB0dXJ0bGUncyBhcHBlYXJhbmNlIHRha2VzIHBsYWNlLgorICAgICAgICBJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgcmV0dXJuIGN1cnJlbnQgcmVzaXplbW9kZS4KKyAgICAgICAgcmVzaXplbW9kZSgidXNlciIpIGlzIGNhbGxlZCBieSBhIGNhbGwgb2Ygc2hhcGVzaXplIHdpdGggYXJndW1lbnRzLgorCisKKyAgICAgICAgRXhhbXBsZXMgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnJlc2l6ZW1vZGUoIm5vcmVzaXplIikKKyAgICAgICAgPj4+IHR1cnRsZS5yZXNpemVtb2RlKCkKKyAgICAgICAgJ25vcmVzaXplJworICAgICAgICAiIiIKKyAgICAgICAgaWYgcm1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXNpemVtb2RlCisgICAgICAgIHJtb2RlID0gcm1vZGUubG93ZXIoKQorICAgICAgICBpZiBybW9kZSBpbiBbImF1dG8iLCAidXNlciIsICJub3Jlc2l6ZSJdOgorICAgICAgICAgICAgc2VsZi5wZW4ocmVzaXplbW9kZT1ybW9kZSkKKworICAgIGRlZiBwZW5zaXplKHNlbGYsIHdpZHRoPU5vbmUpOgorICAgICAgICAiIiJTZXQgb3IgcmV0dXJuIHRoZSBsaW5lIHRoaWNrbmVzcy4KKworICAgICAgICBBbGlhc2VzOiAgcGVuc2l6ZSB8IHdpZHRoCisKKyAgICAgICAgQXJndW1lbnQ6CisgICAgICAgIHdpZHRoIC0tIHBvc2l0aXZlIG51bWJlcgorCisgICAgICAgIFNldCB0aGUgbGluZSB0aGlja25lc3MgdG8gd2lkdGggb3IgcmV0dXJuIGl0LiBJZiByZXNpemVtb2RlIGlzIHNldAorICAgICAgICB0byAiYXV0byIgYW5kIHR1cnRsZXNoYXBlIGlzIGEgcG9seWdvbiwgdGhhdCBwb2x5Z29uIGlzIGRyYXduIHdpdGgKKyAgICAgICAgdGhlIHNhbWUgbGluZSB0aGlja25lc3MuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCBjdXJyZW50IHBlbnNpemUKKyAgICAgICAgaXMgcmV0dXJuZWQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUucGVuc2l6ZSgpCisgICAgICAgIDEKKyAgICAgICAgPj4+IHR1cnRsZS5wZW5zaXplKDEwKSAgICMgZnJvbSBoZXJlIG9uIGxpbmVzIG9mIHdpZHRoIDEwIGFyZSBkcmF3bgorICAgICAgICAiIiIKKyAgICAgICAgaWYgd2lkdGggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wZW5zaXplCisgICAgICAgIHNlbGYucGVuKHBlbnNpemU9d2lkdGgpCisKKworICAgIGRlZiBwZW51cChzZWxmKToKKyAgICAgICAgIiIiUHVsbCB0aGUgcGVuIHVwIC0tIG5vIGRyYXdpbmcgd2hlbiBtb3ZpbmcuCisKKyAgICAgICAgQWxpYXNlczogcGVudXAgfCBwdSB8IHVwCisKKyAgICAgICAgTm8gYXJndW1lbnQKKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wZW51cCgpCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fZHJhd2luZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnBlbihwZW5kb3duPUZhbHNlKQorCisgICAgZGVmIHBlbmRvd24oc2VsZik6CisgICAgICAgICIiIlB1bGwgdGhlIHBlbiBkb3duIC0tIGRyYXdpbmcgd2hlbiBtb3ZpbmcuCisKKyAgICAgICAgQWxpYXNlczogcGVuZG93biB8IHBkIHwgZG93bgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnBlbmRvd24oKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fZHJhd2luZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnBlbihwZW5kb3duPVRydWUpCisKKyAgICBkZWYgaXNkb3duKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBwZW4gaXMgZG93biwgRmFsc2UgaWYgaXQncyB1cC4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wZW51cCgpCisgICAgICAgID4+PiB0dXJ0bGUuaXNkb3duKCkKKyAgICAgICAgRmFsc2UKKyAgICAgICAgPj4+IHR1cnRsZS5wZW5kb3duKCkKKyAgICAgICAgPj4+IHR1cnRsZS5pc2Rvd24oKQorICAgICAgICBUcnVlCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZHJhd2luZworCisgICAgZGVmIHNwZWVkKHNlbGYsIHNwZWVkPU5vbmUpOgorICAgICAgICAiIiIgUmV0dXJuIG9yIHNldCB0aGUgdHVydGxlJ3Mgc3BlZWQuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIHNwZWVkIC0tIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIDAuLjEwIG9yIGEgc3BlZWRzdHJpbmcgKHNlZSBiZWxvdykKKworICAgICAgICBTZXQgdGhlIHR1cnRsZSdzIHNwZWVkIHRvIGFuIGludGVnZXIgdmFsdWUgaW4gdGhlIHJhbmdlIDAgLi4gMTAuCisgICAgICAgIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuOiByZXR1cm4gY3VycmVudCBzcGVlZC4KKworICAgICAgICBJZiBpbnB1dCBpcyBhIG51bWJlciBncmVhdGVyIHRoYW4gMTAgb3Igc21hbGxlciB0aGFuIDAuNSwKKyAgICAgICAgc3BlZWQgaXMgc2V0IHRvIDAuCisgICAgICAgIFNwZWVkc3RyaW5ncyAgYXJlIG1hcHBlZCB0byBzcGVlZHZhbHVlcyBpbiB0aGUgZm9sbG93aW5nIHdheToKKyAgICAgICAgICAgICdmYXN0ZXN0JyA6ICAwCisgICAgICAgICAgICAnZmFzdCcgICAgOiAgMTAKKyAgICAgICAgICAgICdub3JtYWwnICA6ICA2CisgICAgICAgICAgICAnc2xvdycgICAgOiAgMworICAgICAgICAgICAgJ3Nsb3dlc3QnIDogIDEKKyAgICAgICAgc3BlZWRzIGZyb20gMSB0byAxMCBlbmZvcmNlIGluY3JlYXNpbmdseSBmYXN0ZXIgYW5pbWF0aW9uIG9mCisgICAgICAgIGxpbmUgZHJhd2luZyBhbmQgdHVydGxlIHR1cm5pbmcuCisKKyAgICAgICAgQXR0ZW50aW9uOgorICAgICAgICBzcGVlZCA9IDAgOiAqbm8qIGFuaW1hdGlvbiB0YWtlcyBwbGFjZS4gZm9yd2FyZC9iYWNrIG1ha2VzIHR1cnRsZSBqdW1wCisgICAgICAgIGFuZCBsaWtld2lzZSBsZWZ0L3JpZ2h0IG1ha2UgdGhlIHR1cnRsZSB0dXJuIGluc3RhbnRseS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5zcGVlZCgzKQorICAgICAgICAiIiIKKyAgICAgICAgc3BlZWRzID0geydmYXN0ZXN0JzowLCAnZmFzdCc6MTAsICdub3JtYWwnOjYsICdzbG93JzozLCAnc2xvd2VzdCc6MSB9CisgICAgICAgIGlmIHNwZWVkIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3BlZWQKKyAgICAgICAgaWYgc3BlZWQgaW4gc3BlZWRzOgorICAgICAgICAgICAgc3BlZWQgPSBzcGVlZHNbc3BlZWRdCisgICAgICAgIGVsaWYgMC41IDwgc3BlZWQgPCAxMC41OgorICAgICAgICAgICAgc3BlZWQgPSBpbnQocm91bmQoc3BlZWQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3BlZWQgPSAwCisgICAgICAgIHNlbGYucGVuKHNwZWVkPXNwZWVkKQorCisgICAgZGVmIGNvbG9yKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmV0dXJuIG9yIHNldCB0aGUgcGVuY29sb3IgYW5kIGZpbGxjb2xvci4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIFNldmVyYWwgaW5wdXQgZm9ybWF0cyBhcmUgYWxsb3dlZC4KKyAgICAgICAgVGhleSB1c2UgMCwgMSwgMiwgb3IgMyBhcmd1bWVudHMgYXMgZm9sbG93czoKKworICAgICAgICBjb2xvcigpCisgICAgICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgcGVuY29sb3IgYW5kIHRoZSBjdXJyZW50IGZpbGxjb2xvcgorICAgICAgICAgICAgYXMgYSBwYWlyIG9mIGNvbG9yIHNwZWNpZmljYXRpb24gc3RyaW5ncyBhcyBhcmUgcmV0dXJuZWQKKyAgICAgICAgICAgIGJ5IHBlbmNvbG9yIGFuZCBmaWxsY29sb3IuCisgICAgICAgIGNvbG9yKGNvbG9yc3RyaW5nKSwgY29sb3IoKHIsZyxiKSksIGNvbG9yKHIsZyxiKQorICAgICAgICAgICAgaW5wdXRzIGFzIGluIHBlbmNvbG9yLCBzZXQgYm90aCwgZmlsbGNvbG9yIGFuZCBwZW5jb2xvciwKKyAgICAgICAgICAgIHRvIHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgICAgY29sb3IoY29sb3JzdHJpbmcxLCBjb2xvcnN0cmluZzIpLAorICAgICAgICBjb2xvcigocjEsZzEsYjEpLCAocjIsZzIsYjIpKQorICAgICAgICAgICAgZXF1aXZhbGVudCB0byBwZW5jb2xvcihjb2xvcnN0cmluZzEpIGFuZCBmaWxsY29sb3IoY29sb3JzdHJpbmcyKQorICAgICAgICAgICAgYW5kIGFuYWxvZ291c2x5LCBpZiB0aGUgb3RoZXIgaW5wdXQgZm9ybWF0IGlzIHVzZWQuCisKKyAgICAgICAgSWYgdHVydGxlc2hhcGUgaXMgYSBwb2x5Z29uLCBvdXRsaW5lIGFuZCBpbnRlcmlvciBvZiB0aGF0IHBvbHlnb24KKyAgICAgICAgaXMgZHJhd24gd2l0aCB0aGUgbmV3bHkgc2V0IGNvbG9ycy4KKyAgICAgICAgRm9yIG1vciBpbmZvIHNlZTogcGVuY29sb3IsIGZpbGxjb2xvcgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmNvbG9yKCdyZWQnLCAnZ3JlZW4nKQorICAgICAgICA+Pj4gdHVydGxlLmNvbG9yKCkKKyAgICAgICAgKCdyZWQnLCAnZ3JlZW4nKQorICAgICAgICA+Pj4gY29sb3Jtb2RlKDI1NSkKKyAgICAgICAgPj4+IGNvbG9yKCg0MCwgODAsIDEyMCksICgxNjAsIDIwMCwgMjQwKSkKKyAgICAgICAgPj4+IGNvbG9yKCkKKyAgICAgICAgKCcjMjg1MDc4JywgJyNhMGM4ZjAnKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIGwgPSBsZW4oYXJncykKKyAgICAgICAgICAgIGlmIGwgPT0gMToKKyAgICAgICAgICAgICAgICBwY29sb3IgPSBmY29sb3IgPSBhcmdzWzBdCisgICAgICAgICAgICBlbGlmIGwgPT0gMjoKKyAgICAgICAgICAgICAgICBwY29sb3IsIGZjb2xvciA9IGFyZ3MKKyAgICAgICAgICAgIGVsaWYgbCA9PSAzOgorICAgICAgICAgICAgICAgIHBjb2xvciA9IGZjb2xvciA9IGFyZ3MKKyAgICAgICAgICAgIHBjb2xvciA9IHNlbGYuX2NvbG9yc3RyKHBjb2xvcikKKyAgICAgICAgICAgIGZjb2xvciA9IHNlbGYuX2NvbG9yc3RyKGZjb2xvcikKKyAgICAgICAgICAgIHNlbGYucGVuKHBlbmNvbG9yPXBjb2xvciwgZmlsbGNvbG9yPWZjb2xvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb2xvcihzZWxmLl9wZW5jb2xvciksIHNlbGYuX2NvbG9yKHNlbGYuX2ZpbGxjb2xvcikKKworICAgIGRlZiBwZW5jb2xvcihzZWxmLCAqYXJncyk6CisgICAgICAgICIiIiBSZXR1cm4gb3Igc2V0IHRoZSBwZW5jb2xvci4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIEZvdXIgaW5wdXQgZm9ybWF0cyBhcmUgYWxsb3dlZDoKKyAgICAgICAgICAtIHBlbmNvbG9yKCkKKyAgICAgICAgICAgIFJldHVybiB0aGUgY3VycmVudCBwZW5jb2xvciBhcyBjb2xvciBzcGVjaWZpY2F0aW9uIHN0cmluZywKKyAgICAgICAgICAgIHBvc3NpYmx5IGluIGhleC1udW1iZXIgZm9ybWF0IChzZWUgZXhhbXBsZSkuCisgICAgICAgICAgICBNYXkgYmUgdXNlZCBhcyBpbnB1dCB0byBhbm90aGVyIGNvbG9yL3BlbmNvbG9yL2ZpbGxjb2xvciBjYWxsLgorICAgICAgICAgIC0gcGVuY29sb3IoY29sb3JzdHJpbmcpCisgICAgICAgICAgICBzIGlzIGEgVGsgY29sb3Igc3BlY2lmaWNhdGlvbiBzdHJpbmcsIHN1Y2ggYXMgInJlZCIgb3IgInllbGxvdyIKKyAgICAgICAgICAtIHBlbmNvbG9yKChyLCBnLCBiKSkKKyAgICAgICAgICAgICphIHR1cGxlKiBvZiByLCBnLCBhbmQgYiwgd2hpY2ggcmVwcmVzZW50LCBhbiBSR0IgY29sb3IsCisgICAgICAgICAgICBhbmQgZWFjaCBvZiByLCBnLCBhbmQgYiBhcmUgaW4gdGhlIHJhbmdlIDAuLmNvbG9ybW9kZSwKKyAgICAgICAgICAgIHdoZXJlIGNvbG9ybW9kZSBpcyBlaXRoZXIgMS4wIG9yIDI1NQorICAgICAgICAgIC0gcGVuY29sb3IociwgZywgYikKKyAgICAgICAgICAgIHIsIGcsIGFuZCBiIHJlcHJlc2VudCBhbiBSR0IgY29sb3IsIGFuZCBlYWNoIG9mIHIsIGcsIGFuZCBiCisgICAgICAgICAgICBhcmUgaW4gdGhlIHJhbmdlIDAuLmNvbG9ybW9kZQorCisgICAgICAgIElmIHR1cnRsZXNoYXBlIGlzIGEgcG9seWdvbiwgdGhlIG91dGxpbmUgb2YgdGhhdCBwb2x5Z29uIGlzIGRyYXduCisgICAgICAgIHdpdGggdGhlIG5ld2x5IHNldCBwZW5jb2xvci4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wZW5jb2xvcignYnJvd24nKQorICAgICAgICA+Pj4gdHVwID0gKDAuMiwgMC44LCAwLjU1KQorICAgICAgICA+Pj4gdHVydGxlLnBlbmNvbG9yKHR1cCkKKyAgICAgICAgPj4+IHR1cnRsZS5wZW5jb2xvcigpCisgICAgICAgICcjMzNjYzhjJworICAgICAgICAiIiIKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIGNvbG9yID0gc2VsZi5fY29sb3JzdHIoYXJncykKKyAgICAgICAgICAgIGlmIGNvbG9yID09IHNlbGYuX3BlbmNvbG9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5wZW4ocGVuY29sb3I9Y29sb3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29sb3Ioc2VsZi5fcGVuY29sb3IpCisKKyAgICBkZWYgZmlsbGNvbG9yKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiIFJldHVybiBvciBzZXQgdGhlIGZpbGxjb2xvci4KKworICAgICAgICBBcmd1bWVudHM6CisgICAgICAgIEZvdXIgaW5wdXQgZm9ybWF0cyBhcmUgYWxsb3dlZDoKKyAgICAgICAgICAtIGZpbGxjb2xvcigpCisgICAgICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgZmlsbGNvbG9yIGFzIGNvbG9yIHNwZWNpZmljYXRpb24gc3RyaW5nLAorICAgICAgICAgICAgcG9zc2libHkgaW4gaGV4LW51bWJlciBmb3JtYXQgKHNlZSBleGFtcGxlKS4KKyAgICAgICAgICAgIE1heSBiZSB1c2VkIGFzIGlucHV0IHRvIGFub3RoZXIgY29sb3IvcGVuY29sb3IvZmlsbGNvbG9yIGNhbGwuCisgICAgICAgICAgLSBmaWxsY29sb3IoY29sb3JzdHJpbmcpCisgICAgICAgICAgICBzIGlzIGEgVGsgY29sb3Igc3BlY2lmaWNhdGlvbiBzdHJpbmcsIHN1Y2ggYXMgInJlZCIgb3IgInllbGxvdyIKKyAgICAgICAgICAtIGZpbGxjb2xvcigociwgZywgYikpCisgICAgICAgICAgICAqYSB0dXBsZSogb2YgciwgZywgYW5kIGIsIHdoaWNoIHJlcHJlc2VudCwgYW4gUkdCIGNvbG9yLAorICAgICAgICAgICAgYW5kIGVhY2ggb2YgciwgZywgYW5kIGIgYXJlIGluIHRoZSByYW5nZSAwLi5jb2xvcm1vZGUsCisgICAgICAgICAgICB3aGVyZSBjb2xvcm1vZGUgaXMgZWl0aGVyIDEuMCBvciAyNTUKKyAgICAgICAgICAtIGZpbGxjb2xvcihyLCBnLCBiKQorICAgICAgICAgICAgciwgZywgYW5kIGIgcmVwcmVzZW50IGFuIFJHQiBjb2xvciwgYW5kIGVhY2ggb2YgciwgZywgYW5kIGIKKyAgICAgICAgICAgIGFyZSBpbiB0aGUgcmFuZ2UgMC4uY29sb3Jtb2RlCisKKyAgICAgICAgSWYgdHVydGxlc2hhcGUgaXMgYSBwb2x5Z29uLCB0aGUgaW50ZXJpb3Igb2YgdGhhdCBwb2x5Z29uIGlzIGRyYXduCisgICAgICAgIHdpdGggdGhlIG5ld2x5IHNldCBmaWxsY29sb3IuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuZmlsbGNvbG9yKCd2aW9sZXQnKQorICAgICAgICA+Pj4gY29sID0gdHVydGxlLnBlbmNvbG9yKCkKKyAgICAgICAgPj4+IHR1cnRsZS5maWxsY29sb3IoY29sKQorICAgICAgICA+Pj4gdHVydGxlLmZpbGxjb2xvcigwLCAuNSwgMCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBjb2xvciA9IHNlbGYuX2NvbG9yc3RyKGFyZ3MpCisgICAgICAgICAgICBpZiBjb2xvciA9PSBzZWxmLl9maWxsY29sb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLnBlbihmaWxsY29sb3I9Y29sb3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29sb3Ioc2VsZi5fZmlsbGNvbG9yKQorCisgICAgZGVmIHNob3d0dXJ0bGUoc2VsZik6CisgICAgICAgICIiIk1ha2VzIHRoZSB0dXJ0bGUgdmlzaWJsZS4KKworICAgICAgICBBbGlhc2VzOiBzaG93dHVydGxlIHwgc3QKKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5oaWRldHVydGxlKCkKKyAgICAgICAgPj4+IHR1cnRsZS5zaG93dHVydGxlKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucGVuKHNob3duPVRydWUpCisKKyAgICBkZWYgaGlkZXR1cnRsZShzZWxmKToKKyAgICAgICAgIiIiTWFrZXMgdGhlIHR1cnRsZSBpbnZpc2libGUuCisKKyAgICAgICAgQWxpYXNlczogaGlkZXR1cnRsZSB8IGh0CisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgSXQncyBhIGdvb2QgaWRlYSB0byBkbyB0aGlzIHdoaWxlIHlvdSdyZSBpbiB0aGUKKyAgICAgICAgbWlkZGxlIG9mIGEgY29tcGxpY2F0ZWQgZHJhd2luZywgYmVjYXVzZSBoaWRpbmcKKyAgICAgICAgdGhlIHR1cnRsZSBzcGVlZHMgdXAgdGhlIGRyYXdpbmcgb2JzZXJ2YWJseS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5oaWRldHVydGxlKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucGVuKHNob3duPUZhbHNlKQorCisgICAgZGVmIGlzdmlzaWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIFR1cnRsZSBpcyBzaG93biwgRmFsc2UgaWYgaXQncyBoaWRkZW4uCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuaGlkZXR1cnRsZSgpCisgICAgICAgID4+PiBwcmludCB0dXJ0bGUuaXN2aXNpYmxlKCk6CisgICAgICAgIEZhbHNlCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2hvd24KKworICAgIGRlZiBwZW4oc2VsZiwgcGVuPU5vbmUsICoqcGVuZGljdCk6CisgICAgICAgICIiIlJldHVybiBvciBzZXQgdGhlIHBlbidzIGF0dHJpYnV0ZXMuCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICAgICAgcGVuIC0tIGEgZGljdGlvbmFyeSB3aXRoIHNvbWUgb3IgYWxsIG9mIHRoZSBiZWxvdyBsaXN0ZWQga2V5cy4KKyAgICAgICAgICAgICoqcGVuZGljdCAtLSBvbmUgb3IgbW9yZSBrZXl3b3JkLWFyZ3VtZW50cyB3aXRoIHRoZSBiZWxvdworICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlZCBrZXlzIGFzIGtleXdvcmRzLgorCisgICAgICAgIFJldHVybiBvciBzZXQgdGhlIHBlbidzIGF0dHJpYnV0ZXMgaW4gYSAncGVuLWRpY3Rpb25hcnknCisgICAgICAgIHdpdGggdGhlIGZvbGxvd2luZyBrZXkvdmFsdWUgcGFpcnM6CisgICAgICAgICAgICJzaG93biIgICAgICA6ICAgVHJ1ZS9GYWxzZQorICAgICAgICAgICAicGVuZG93biIgICAgOiAgIFRydWUvRmFsc2UKKyAgICAgICAgICAgInBlbmNvbG9yIiAgIDogICBjb2xvci1zdHJpbmcgb3IgY29sb3ItdHVwbGUKKyAgICAgICAgICAgImZpbGxjb2xvciIgIDogICBjb2xvci1zdHJpbmcgb3IgY29sb3ItdHVwbGUKKyAgICAgICAgICAgInBlbnNpemUiICAgIDogICBwb3NpdGl2ZSBudW1iZXIKKyAgICAgICAgICAgInNwZWVkIiAgICAgIDogICBudW1iZXIgaW4gcmFuZ2UgMC4uMTAKKyAgICAgICAgICAgInJlc2l6ZW1vZGUiIDogICAiYXV0byIgb3IgInVzZXIiIG9yICJub3Jlc2l6ZSIKKyAgICAgICAgICAgInN0cmV0Y2hmYWN0b3IiOiAocG9zaXRpdmUgbnVtYmVyLCBwb3NpdGl2ZSBudW1iZXIpCisgICAgICAgICAgICJvdXRsaW5lIiAgICA6ICAgcG9zaXRpdmUgbnVtYmVyCisgICAgICAgICAgICJ0aWx0IiAgICAgICA6ICAgbnVtYmVyCisKKyAgICAgICAgVGhpcyBkaWN0aW9uYXJ5IGNhbiBiZSB1c2VkIGFzIGFyZ3VtZW50IGZvciBhIHN1YnNlcXVlbnQKKyAgICAgICAgcGVuKCktY2FsbCB0byByZXN0b3JlIHRoZSBmb3JtZXIgcGVuLXN0YXRlLiBNb3Jlb3ZlciBvbmUKKyAgICAgICAgb3IgbW9yZSBvZiB0aGVzZSBhdHRyaWJ1dGVzIGNhbiBiZSBwcm92aWRlZCBhcyBrZXl3b3JkLWFyZ3VtZW50cy4KKyAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBzZXQgc2V2ZXJhbCBwZW4gYXR0cmlidXRlcyBpbiBvbmUgc3RhdGVtZW50LgorCisKKyAgICAgICAgRXhhbXBsZXMgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnBlbihmaWxsY29sb3I9ImJsYWNrIiwgcGVuY29sb3I9InJlZCIsIHBlbnNpemU9MTApCisgICAgICAgID4+PiB0dXJ0bGUucGVuKCkKKyAgICAgICAgeydwZW5zaXplJzogMTAsICdzaG93bic6IFRydWUsICdyZXNpemVtb2RlJzogJ2F1dG8nLCAnb3V0bGluZSc6IDEsCisgICAgICAgICdwZW5jb2xvcic6ICdyZWQnLCAncGVuZG93bic6IFRydWUsICdmaWxsY29sb3InOiAnYmxhY2snLAorICAgICAgICAnc3RyZXRjaGZhY3Rvcic6ICgxLDEpLCAnc3BlZWQnOiAzfQorICAgICAgICA+Pj4gcGVuc3RhdGU9dHVydGxlLnBlbigpCisgICAgICAgID4+PiB0dXJ0bGUuY29sb3IoInllbGxvdyIsIiIpCisgICAgICAgID4+PiB0dXJ0bGUucGVudXAoKQorICAgICAgICA+Pj4gdHVydGxlLnBlbigpCisgICAgICAgIHsncGVuc2l6ZSc6IDEwLCAnc2hvd24nOiBUcnVlLCAncmVzaXplbW9kZSc6ICdhdXRvJywgJ291dGxpbmUnOiAxLAorICAgICAgICAncGVuY29sb3InOiAneWVsbG93JywgJ3BlbmRvd24nOiBGYWxzZSwgJ2ZpbGxjb2xvcic6ICcnLAorICAgICAgICAnc3RyZXRjaGZhY3Rvcic6ICgxLDEpLCAnc3BlZWQnOiAzfQorICAgICAgICA+Pj4gcC5wZW4ocGVuc3RhdGUsIGZpbGxjb2xvcj0iZ3JlZW4iKQorICAgICAgICA+Pj4gcC5wZW4oKQorICAgICAgICB7J3BlbnNpemUnOiAxMCwgJ3Nob3duJzogVHJ1ZSwgJ3Jlc2l6ZW1vZGUnOiAnYXV0bycsICdvdXRsaW5lJzogMSwKKyAgICAgICAgJ3BlbmNvbG9yJzogJ3JlZCcsICdwZW5kb3duJzogVHJ1ZSwgJ2ZpbGxjb2xvcic6ICdncmVlbicsCisgICAgICAgICdzdHJldGNoZmFjdG9yJzogKDEsMSksICdzcGVlZCc6IDN9CisgICAgICAgICIiIgorICAgICAgICBfcGQgPSAgeyJzaG93biIgICAgICAgICA6IHNlbGYuX3Nob3duLAorICAgICAgICAgICAgICAgICJwZW5kb3duIiAgICAgICA6IHNlbGYuX2RyYXdpbmcsCisgICAgICAgICAgICAgICAgInBlbmNvbG9yIiAgICAgIDogc2VsZi5fcGVuY29sb3IsCisgICAgICAgICAgICAgICAgImZpbGxjb2xvciIgICAgIDogc2VsZi5fZmlsbGNvbG9yLAorICAgICAgICAgICAgICAgICJwZW5zaXplIiAgICAgICA6IHNlbGYuX3BlbnNpemUsCisgICAgICAgICAgICAgICAgInNwZWVkIiAgICAgICAgIDogc2VsZi5fc3BlZWQsCisgICAgICAgICAgICAgICAgInJlc2l6ZW1vZGUiICAgIDogc2VsZi5fcmVzaXplbW9kZSwKKyAgICAgICAgICAgICAgICAic3RyZXRjaGZhY3RvciIgOiBzZWxmLl9zdHJldGNoZmFjdG9yLAorICAgICAgICAgICAgICAgICJvdXRsaW5lIiAgICAgICA6IHNlbGYuX291dGxpbmV3aWR0aCwKKyAgICAgICAgICAgICAgICAidGlsdCIgICAgICAgICAgOiBzZWxmLl90aWx0CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgaWYgbm90IChwZW4gb3IgcGVuZGljdCk6CisgICAgICAgICAgICByZXR1cm4gX3BkCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShwZW4sIGRpY3QpOgorICAgICAgICAgICAgcCA9IHBlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcCA9IHt9CisgICAgICAgIHAudXBkYXRlKHBlbmRpY3QpCisKKyAgICAgICAgX3BfYnVmID0ge30KKyAgICAgICAgZm9yIGtleSBpbiBwOgorICAgICAgICAgICAgX3BfYnVmW2tleV0gPSBfcGRba2V5XQorCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlcjoKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKCgicGVuIiwgX3BfYnVmKSkKKworICAgICAgICBuZXdMaW5lID0gRmFsc2UKKyAgICAgICAgaWYgInBlbmRvd24iIGluIHA6CisgICAgICAgICAgICBpZiBzZWxmLl9kcmF3aW5nICE9IHBbInBlbmRvd24iXToKKyAgICAgICAgICAgICAgICBuZXdMaW5lID0gVHJ1ZQorICAgICAgICBpZiAicGVuY29sb3IiIGluIHA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBbInBlbmNvbG9yIl0sIHR1cGxlKToKKyAgICAgICAgICAgICAgICBwWyJwZW5jb2xvciJdID0gc2VsZi5fY29sb3JzdHIoKHBbInBlbmNvbG9yIl0sKSkKKyAgICAgICAgICAgIGlmIHNlbGYuX3BlbmNvbG9yICE9IHBbInBlbmNvbG9yIl06CisgICAgICAgICAgICAgICAgbmV3TGluZSA9IFRydWUKKyAgICAgICAgaWYgInBlbnNpemUiIGluIHA6CisgICAgICAgICAgICBpZiBzZWxmLl9wZW5zaXplICE9IHBbInBlbnNpemUiXToKKyAgICAgICAgICAgICAgICBuZXdMaW5lID0gVHJ1ZQorICAgICAgICBpZiBuZXdMaW5lOgorICAgICAgICAgICAgc2VsZi5fbmV3TGluZSgpCisgICAgICAgIGlmICJwZW5kb3duIiBpbiBwOgorICAgICAgICAgICAgc2VsZi5fZHJhd2luZyA9IHBbInBlbmRvd24iXQorICAgICAgICBpZiAicGVuY29sb3IiIGluIHA6CisgICAgICAgICAgICBzZWxmLl9wZW5jb2xvciA9IHBbInBlbmNvbG9yIl0KKyAgICAgICAgaWYgInBlbnNpemUiIGluIHA6CisgICAgICAgICAgICBzZWxmLl9wZW5zaXplID0gcFsicGVuc2l6ZSJdCisgICAgICAgIGlmICJmaWxsY29sb3IiIGluIHA6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBbImZpbGxjb2xvciJdLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgcFsiZmlsbGNvbG9yIl0gPSBzZWxmLl9jb2xvcnN0cigocFsiZmlsbGNvbG9yIl0sKSkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGxjb2xvciA9IHBbImZpbGxjb2xvciJdCisgICAgICAgIGlmICJzcGVlZCIgaW4gcDoKKyAgICAgICAgICAgIHNlbGYuX3NwZWVkID0gcFsic3BlZWQiXQorICAgICAgICBpZiAicmVzaXplbW9kZSIgaW4gcDoKKyAgICAgICAgICAgIHNlbGYuX3Jlc2l6ZW1vZGUgPSBwWyJyZXNpemVtb2RlIl0KKyAgICAgICAgaWYgInN0cmV0Y2hmYWN0b3IiIGluIHA6CisgICAgICAgICAgICBzZiA9IHBbInN0cmV0Y2hmYWN0b3IiXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZiwgKGludCwgZmxvYXQpKToKKyAgICAgICAgICAgICAgICBzZiA9IChzZiwgc2YpCisgICAgICAgICAgICBzZWxmLl9zdHJldGNoZmFjdG9yID0gc2YKKyAgICAgICAgaWYgIm91dGxpbmUiIGluIHA6CisgICAgICAgICAgICBzZWxmLl9vdXRsaW5ld2lkdGggPSBwWyJvdXRsaW5lIl0KKyAgICAgICAgaWYgInNob3duIiBpbiBwOgorICAgICAgICAgICAgc2VsZi5fc2hvd24gPSBwWyJzaG93biJdCisgICAgICAgIGlmICJ0aWx0IiBpbiBwOgorICAgICAgICAgICAgc2VsZi5fdGlsdCA9IHBbInRpbHQiXQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisjIyB0aHJlZSBkdW1teSBtZXRob2RzIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzOgorCisgICAgZGVmIF9uZXdMaW5lKHNlbGYsIHVzZVBvcyA9IFRydWUpOgorICAgICAgICAiIiJkdW1teSBtZXRob2QgLSB0byBiZSBvdmVyd3JpdHRlbiBieSBjaGlsZCBjbGFzcyIiIgorICAgIGRlZiBfdXBkYXRlKHNlbGYsIGNvdW50PVRydWUsIGZvcmNlZD1GYWxzZSk6CisgICAgICAgICIiImR1bW15IG1ldGhvZCAtIHRvIGJlIG92ZXJ3cml0dGVuIGJ5IGNoaWxkIGNsYXNzIiIiCisgICAgZGVmIF9jb2xvcihzZWxmLCBhcmdzKToKKyAgICAgICAgIiIiZHVtbXkgbWV0aG9kIC0gdG8gYmUgb3ZlcndyaXR0ZW4gYnkgY2hpbGQgY2xhc3MiIiIKKyAgICBkZWYgX2NvbG9yc3RyKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJkdW1teSBtZXRob2QgLSB0byBiZSBvdmVyd3JpdHRlbiBieSBjaGlsZCBjbGFzcyIiIgorCisgICAgd2lkdGggPSBwZW5zaXplCisgICAgdXAgPSBwZW51cAorICAgIHB1ID0gcGVudXAKKyAgICBwZCA9IHBlbmRvd24KKyAgICBkb3duID0gcGVuZG93bgorICAgIHN0ID0gc2hvd3R1cnRsZQorICAgIGh0ID0gaGlkZXR1cnRsZQorCisKK2NsYXNzIF9UdXJ0bGVJbWFnZShvYmplY3QpOgorICAgICIiIkhlbHBlciBjbGFzczogRGF0YXR5cGUgdG8gc3RvcmUgVHVydGxlIGF0dHJpYnV0ZXMKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzY3JlZW4sIHNoYXBlSW5kZXgpOgorICAgICAgICBzZWxmLnNjcmVlbiA9IHNjcmVlbgorICAgICAgICBzZWxmLl90eXBlID0gTm9uZQorICAgICAgICBzZWxmLl9zZXRzaGFwZShzaGFwZUluZGV4KQorCisgICAgZGVmIF9zZXRzaGFwZShzZWxmLCBzaGFwZUluZGV4KToKKyAgICAgICAgc2NyZWVuID0gc2VsZi5zY3JlZW4gIyBSYXdUdXJ0bGUuc2NyZWVuc1tzZWxmLnNjcmVlbkluZGV4XQorICAgICAgICBzZWxmLnNoYXBlSW5kZXggPSBzaGFwZUluZGV4CisgICAgICAgIGlmIHNlbGYuX3R5cGUgPT0gInBvbHlnb24iID09IHNjcmVlbi5fc2hhcGVzW3NoYXBlSW5kZXhdLl90eXBlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuX3R5cGUgPT0gImltYWdlIiA9PSBzY3JlZW4uX3NoYXBlc1tzaGFwZUluZGV4XS5fdHlwZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl90eXBlIGluIFsiaW1hZ2UiLCAicG9seWdvbiJdOgorICAgICAgICAgICAgc2NyZWVuLl9kZWxldGUoc2VsZi5faXRlbSkKKyAgICAgICAgZWxpZiBzZWxmLl90eXBlID09ICJjb21wb3VuZCI6CisgICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl9pdGVtOgorICAgICAgICAgICAgICAgIHNjcmVlbi5fZGVsZXRlKGl0ZW0pCisgICAgICAgIHNlbGYuX3R5cGUgPSBzY3JlZW4uX3NoYXBlc1tzaGFwZUluZGV4XS5fdHlwZQorICAgICAgICBpZiBzZWxmLl90eXBlID09ICJwb2x5Z29uIjoKKyAgICAgICAgICAgIHNlbGYuX2l0ZW0gPSBzY3JlZW4uX2NyZWF0ZXBvbHkoKQorICAgICAgICBlbGlmIHNlbGYuX3R5cGUgPT0gImltYWdlIjoKKyAgICAgICAgICAgIHNlbGYuX2l0ZW0gPSBzY3JlZW4uX2NyZWF0ZWltYWdlKHNjcmVlbi5fc2hhcGVzWyJibGFuayJdLl9kYXRhKQorICAgICAgICBlbGlmIHNlbGYuX3R5cGUgPT0gImNvbXBvdW5kIjoKKyAgICAgICAgICAgIHNlbGYuX2l0ZW0gPSBbc2NyZWVuLl9jcmVhdGVwb2x5KCkgZm9yIGl0ZW0gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5fc2hhcGVzW3NoYXBlSW5kZXhdLl9kYXRhXQorCisKK2NsYXNzIFJhd1R1cnRsZShUUGVuLCBUTmF2aWdhdG9yKToKKyAgICAiIiJBbmltYXRpb24gcGFydCBvZiB0aGUgUmF3VHVydGxlLgorICAgIFB1dHMgUmF3VHVydGxlIHVwb24gYSBUdXJ0bGVTY3JlZW4gYW5kIHByb3ZpZGVzIHRvb2xzIGZvcgorICAgIGl0cyBhbmltYXRpb24uCisgICAgIiIiCisgICAgc2NyZWVucyA9IFtdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY2FudmFzPU5vbmUsCisgICAgICAgICAgICAgICAgIHNoYXBlPV9DRkdbInNoYXBlIl0sCisgICAgICAgICAgICAgICAgIHVuZG9idWZmZXJzaXplPV9DRkdbInVuZG9idWZmZXJzaXplIl0sCisgICAgICAgICAgICAgICAgIHZpc2libGU9X0NGR1sidmlzaWJsZSJdKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjYW52YXMsIF9TY3JlZW4pOgorICAgICAgICAgICAgc2VsZi5zY3JlZW4gPSBjYW52YXMKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNhbnZhcywgVHVydGxlU2NyZWVuKToKKyAgICAgICAgICAgIGlmIGNhbnZhcyBub3QgaW4gUmF3VHVydGxlLnNjcmVlbnM6CisgICAgICAgICAgICAgICAgUmF3VHVydGxlLnNjcmVlbnMuYXBwZW5kKGNhbnZhcykKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuID0gY2FudmFzCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShjYW52YXMsIChTY3JvbGxlZENhbnZhcywgQ2FudmFzKSk6CisgICAgICAgICAgICBmb3Igc2NyZWVuIGluIFJhd1R1cnRsZS5zY3JlZW5zOgorICAgICAgICAgICAgICAgIGlmIHNjcmVlbi5jdiA9PSBjYW52YXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NyZWVuID0gc2NyZWVuCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2NyZWVuID0gVHVydGxlU2NyZWVuKGNhbnZhcykKKyAgICAgICAgICAgICAgICBSYXdUdXJ0bGUuc2NyZWVucy5hcHBlbmQoc2VsZi5zY3JlZW4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJiYWQgY2F2YXMgYXJndW1lbnQgJXMiICUgY2FudmFzKQorCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIFROYXZpZ2F0b3IuX19pbml0X18oc2VsZiwgc2NyZWVuLm1vZGUoKSkKKyAgICAgICAgVFBlbi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzY3JlZW4uX3R1cnRsZXMuYXBwZW5kKHNlbGYpCisgICAgICAgIHNlbGYuZHJhd2luZ0xpbmVJdGVtID0gc2NyZWVuLl9jcmVhdGVsaW5lKCkKKyAgICAgICAgc2VsZi50dXJ0bGUgPSBfVHVydGxlSW1hZ2Uoc2NyZWVuLCBzaGFwZSkKKyAgICAgICAgc2VsZi5fcG9seSA9IE5vbmUKKyAgICAgICAgc2VsZi5fY3JlYXRpbmdQb2x5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5fZmlsbGl0ZW0gPSBzZWxmLl9maWxscGF0aCA9IE5vbmUKKyAgICAgICAgc2VsZi5fc2hvd24gPSB2aXNpYmxlCisgICAgICAgIHNlbGYuX2hpZGRlbl9mcm9tX3NjcmVlbiA9IEZhbHNlCisgICAgICAgIHNlbGYuY3VycmVudExpbmVJdGVtID0gc2NyZWVuLl9jcmVhdGVsaW5lKCkKKyAgICAgICAgc2VsZi5jdXJyZW50TGluZSA9IFtzZWxmLl9wb3NpdGlvbl0KKyAgICAgICAgc2VsZi5pdGVtcyA9IFtzZWxmLmN1cnJlbnRMaW5lSXRlbV0KKyAgICAgICAgc2VsZi5zdGFtcEl0ZW1zID0gW10KKyAgICAgICAgc2VsZi5fdW5kb2J1ZmZlcnNpemUgPSB1bmRvYnVmZmVyc2l6ZQorICAgICAgICBzZWxmLnVuZG9idWZmZXIgPSBUYnVmZmVyKHVuZG9idWZmZXJzaXplKQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiJEZWxldGUgdGhlIHR1cnRsZSdzIGRyYXdpbmdzIGFuZCByZXN0b3JlIGl0cyBkZWZhdWx0IHZhbHVlcy4KKworICAgICAgICBObyBhcmd1bWVudC4KKywKKyAgICAgICAgRGVsZXRlIHRoZSB0dXJ0bGUncyBkcmF3aW5ncyBmcm9tIHRoZSBzY3JlZW4sIHJlLWNlbnRlciB0aGUgdHVydGxlCisgICAgICAgIGFuZCBzZXQgdmFyaWFibGVzIHRvIHRoZSBkZWZhdWx0IHZhbHVlcy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5wb3NpdGlvbigpCisgICAgICAgICgwLjAwLC0yMi4wMCkKKyAgICAgICAgPj4+IHR1cnRsZS5oZWFkaW5nKCkKKyAgICAgICAgMTAwLjAKKyAgICAgICAgPj4+IHR1cnRsZS5yZXNldCgpCisgICAgICAgID4+PiB0dXJ0bGUucG9zaXRpb24oKQorICAgICAgICAoMC4wMCwwLjAwKQorICAgICAgICA+Pj4gdHVydGxlLmhlYWRpbmcoKQorICAgICAgICAwLjAKKyAgICAgICAgIiIiCisgICAgICAgIFROYXZpZ2F0b3IucmVzZXQoc2VsZikKKyAgICAgICAgVFBlbi5fcmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5fY2xlYXIoKQorICAgICAgICBzZWxmLl9kcmF3dHVydGxlKCkKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiBzZXR1bmRvYnVmZmVyKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJTZXQgb3IgZGlzYWJsZSB1bmRvYnVmZmVyLgorCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICBzaXplIC0tIGFuIGludGVnZXIgb3IgTm9uZQorCisgICAgICAgIElmIHNpemUgaXMgYW4gaW50ZWdlciBhbiBlbXB0eSB1bmRvYnVmZmVyIG9mIGdpdmVuIHNpemUgaXMgaW5zdGFsbGVkLgorICAgICAgICBTaXplIGdpdmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0dXJ0bGUtYWN0aW9ucyB0aGF0IGNhbiBiZSB1bmRvbmUKKyAgICAgICAgYnkgdGhlIHVuZG8oKSBmdW5jdGlvbi4KKyAgICAgICAgSWYgc2l6ZSBpcyBOb25lLCBubyB1bmRvYnVmZmVyIGlzIHByZXNlbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuc2V0dW5kb2J1ZmZlcig0MikKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlciA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlciA9IFRidWZmZXIoc2l6ZSkKKworICAgIGRlZiB1bmRvYnVmZmVyZW50cmllcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGNvdW50IG9mIGVudHJpZXMgaW4gdGhlIHVuZG9idWZmZXIuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB3aGlsZSB1bmRvYnVmZmVyZW50cmllcygpOgorICAgICAgICAuLi4gICAgIHVuZG8oKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gc2VsZi51bmRvYnVmZmVyLm5yX29mX2l0ZW1zKCkKKworICAgIGRlZiBfY2xlYXIoc2VsZik6CisgICAgICAgICIiIkRlbGV0ZSBhbGwgb2YgcGVuJ3MgZHJhd2luZ3MiIiIKKyAgICAgICAgc2VsZi5fZmlsbGl0ZW0gPSBzZWxmLl9maWxscGF0aCA9IE5vbmUKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5pdGVtczoKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kZWxldGUoaXRlbSkKKyAgICAgICAgc2VsZi5jdXJyZW50TGluZUl0ZW0gPSBzZWxmLnNjcmVlbi5fY3JlYXRlbGluZSgpCisgICAgICAgIHNlbGYuY3VycmVudExpbmUgPSBbXQorICAgICAgICBpZiBzZWxmLl9kcmF3aW5nOgorICAgICAgICAgICAgc2VsZi5jdXJyZW50TGluZS5hcHBlbmQoc2VsZi5fcG9zaXRpb24pCisgICAgICAgIHNlbGYuaXRlbXMgPSBbc2VsZi5jdXJyZW50TGluZUl0ZW1dCisgICAgICAgIHNlbGYuY2xlYXJzdGFtcHMoKQorICAgICAgICBzZWxmLnNldHVuZG9idWZmZXIoc2VsZi5fdW5kb2J1ZmZlcnNpemUpCisKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSB0dXJ0bGUncyBkcmF3aW5ncyBmcm9tIHRoZSBzY3JlZW4uIERvIG5vdCBtb3ZlIHR1cnRsZS4KKworICAgICAgICBObyBhcmd1bWVudHMuCisKKyAgICAgICAgRGVsZXRlIHRoZSB0dXJ0bGUncyBkcmF3aW5ncyBmcm9tIHRoZSBzY3JlZW4uIERvIG5vdCBtb3ZlIHR1cnRsZS4KKyAgICAgICAgU3RhdGUgYW5kIHBvc2l0aW9uIG9mIHRoZSB0dXJ0bGUgYXMgd2VsbCBhcyBkcmF3aW5ncyBvZiBvdGhlcgorICAgICAgICB0dXJ0bGVzIGFyZSBub3QgYWZmZWN0ZWQuCisKKyAgICAgICAgRXhhbXBsZXMgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmNsZWFyKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NsZWFyKCkKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiBfdXBkYXRlX2RhdGEoc2VsZik6CisgICAgICAgIHNlbGYuc2NyZWVuLl9pbmNyZW1lbnR1ZGMoKQorICAgICAgICBpZiBzZWxmLnNjcmVlbi5fdXBkYXRlY291bnRlciAhPSAwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGxlbihzZWxmLmN1cnJlbnRMaW5lKT4xOgorICAgICAgICAgICAgc2VsZi5zY3JlZW4uX2RyYXdsaW5lKHNlbGYuY3VycmVudExpbmVJdGVtLCBzZWxmLmN1cnJlbnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BlbmNvbG9yLCBzZWxmLl9wZW5zaXplKQorCisgICAgZGVmIF91cGRhdGUoc2VsZik6CisgICAgICAgICIiIlBlcmZvcm0gYSBUdXJ0bGUtZGF0YSB1cGRhdGUuCisgICAgICAgICIiIgorICAgICAgICBzY3JlZW4gPSBzZWxmLnNjcmVlbgorICAgICAgICBpZiBzY3JlZW4uX3RyYWNpbmcgPT0gMDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHNjcmVlbi5fdHJhY2luZyA9PSAxOgorICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2RhdGEoKQorICAgICAgICAgICAgc2VsZi5fZHJhd3R1cnRsZSgpCisgICAgICAgICAgICBzY3JlZW4uX3VwZGF0ZSgpICAgICAgICAgICAgICAgICAgIyBUdXJ0bGVTY3JlZW5CYXNlCisgICAgICAgICAgICBzY3JlZW4uX2RlbGF5KHNjcmVlbi5fZGVsYXl2YWx1ZSkgIyBUdXJ0bGVTY3JlZW5CYXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl91cGRhdGVfZGF0YSgpCisgICAgICAgICAgICBpZiBzY3JlZW4uX3VwZGF0ZWNvdW50ZXIgPT0gMDoKKyAgICAgICAgICAgICAgICBmb3IgdCBpbiBzY3JlZW4udHVydGxlcygpOgorICAgICAgICAgICAgICAgICAgICB0Ll9kcmF3dHVydGxlKCkKKyAgICAgICAgICAgICAgICBzY3JlZW4uX3VwZGF0ZSgpCisKKyAgICBkZWYgdHJhY2VyKHNlbGYsIGZsYWc9Tm9uZSwgZGVsYXk9Tm9uZSk6CisgICAgICAgICIiIlR1cm5zIHR1cnRsZSBhbmltYXRpb24gb24vb2ZmIGFuZCBzZXQgZGVsYXkgZm9yIHVwZGF0ZSBkcmF3aW5ncy4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgIG4gLS0gbm9ubmVnYXRpdmUgIGludGVnZXIKKyAgICAgICAgZGVsYXkgLS0gbm9ubmVnYXRpdmUgIGludGVnZXIKKworICAgICAgICBJZiBuIGlzIGdpdmVuLCBvbmx5IGVhY2ggbi10aCByZWd1bGFyIHNjcmVlbiB1cGRhdGUgaXMgcmVhbGx5IHBlcmZvcm1lZC4KKyAgICAgICAgKENhbiBiZSB1c2VkIHRvIGFjY2VsZXJhdGUgdGhlIGRyYXdpbmcgb2YgY29tcGxleCBncmFwaGljcy4pCisgICAgICAgIFNlY29uZCBhcmd1bWVudHMgc2V0cyBkZWxheSB2YWx1ZSAoc2VlIFJhd1R1cnRsZS5kZWxheSgpKQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnRyYWNlcig4LCAyNSkKKyAgICAgICAgPj4+IGRpc3QgPSAyCisgICAgICAgID4+PiBmb3IgaSBpbiByYW5nZSgyMDApOgorICAgICAgICAuLi4gICAgIHR1cnRsZS5mZChkaXN0KQorICAgICAgICAuLi4gICAgIHR1cnRsZS5ydCg5MCkKKyAgICAgICAgLi4uICAgICBkaXN0ICs9IDIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNjcmVlbi50cmFjZXIoZmxhZywgZGVsYXkpCisKKyAgICBkZWYgX2NvbG9yKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5zY3JlZW4uX2NvbG9yKGFyZ3MpCisKKyAgICBkZWYgX2NvbG9yc3RyKHNlbGYsIGFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5zY3JlZW4uX2NvbG9yc3RyKGFyZ3MpCisKKyAgICBkZWYgX2NjKHNlbGYsIGFyZ3MpOgorICAgICAgICAiIiJDb252ZXJ0IGNvbG9ydHJpcGxlcyB0byBoZXhzdHJpbmdzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShhcmdzLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIGFyZ3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgciwgZywgYiA9IGFyZ3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiYmFkIGNvbG9yIGFyZ3VtZW50czogJXMiICUgc3RyKGFyZ3MpKQorICAgICAgICBpZiBzZWxmLnNjcmVlbi5fY29sb3Jtb2RlID09IDEuMDoKKyAgICAgICAgICAgIHIsIGcsIGIgPSBbcm91bmQoMjU1LjAqeCkgZm9yIHggaW4gKHIsIGcsIGIpXQorICAgICAgICBpZiBub3QgKCgwIDw9IHIgPD0gMjU1KSBhbmQgKDAgPD0gZyA8PSAyNTUpIGFuZCAoMCA8PSBiIDw9IDI1NSkpOgorICAgICAgICAgICAgcmFpc2UgVHVydGxlR3JhcGhpY3NFcnJvcigiYmFkIGNvbG9yIHNlcXVlbmNlOiAlcyIgJSBzdHIoYXJncykpCisgICAgICAgIHJldHVybiAiIyUwMnglMDJ4JTAyeCIgJSAociwgZywgYikKKworICAgIGRlZiBjbG9uZShzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuZCByZXR1cm4gYSBjbG9uZSBvZiB0aGUgdHVydGxlLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIENyZWF0ZSBhbmQgcmV0dXJuIGEgY2xvbmUgb2YgdGhlIHR1cnRsZSB3aXRoIHNhbWUgcG9zaXRpb24sIGhlYWRpbmcKKyAgICAgICAgYW5kIHR1cnRsZSBwcm9wZXJ0aWVzLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCBtaWNrKToKKyAgICAgICAgbWljayA9IFR1cnRsZSgpCisgICAgICAgIGpvZSA9IG1pY2suY2xvbmUoKQorICAgICAgICAiIiIKKyAgICAgICAgc2NyZWVuID0gc2VsZi5zY3JlZW4KKyAgICAgICAgc2VsZi5fbmV3TGluZShzZWxmLl9kcmF3aW5nKQorCisgICAgICAgIHR1cnRsZSA9IHNlbGYudHVydGxlCisgICAgICAgIHNlbGYuc2NyZWVuID0gTm9uZQorICAgICAgICBzZWxmLnR1cnRsZSA9IE5vbmUgICMgdG9vIG1ha2Ugc2VsZiBkZWVwY29weS1hYmxlCisKKyAgICAgICAgcSA9IGRlZXBjb3B5KHNlbGYpCisKKyAgICAgICAgc2VsZi5zY3JlZW4gPSBzY3JlZW4KKyAgICAgICAgc2VsZi50dXJ0bGUgPSB0dXJ0bGUKKworICAgICAgICBxLnNjcmVlbiA9IHNjcmVlbgorICAgICAgICBxLnR1cnRsZSA9IF9UdXJ0bGVJbWFnZShzY3JlZW4sIHNlbGYudHVydGxlLnNoYXBlSW5kZXgpCisKKyAgICAgICAgc2NyZWVuLl90dXJ0bGVzLmFwcGVuZChxKQorICAgICAgICB0dHlwZSA9IHNjcmVlbi5fc2hhcGVzW3NlbGYudHVydGxlLnNoYXBlSW5kZXhdLl90eXBlCisgICAgICAgIGlmIHR0eXBlID09ICJwb2x5Z29uIjoKKyAgICAgICAgICAgIHEudHVydGxlLl9pdGVtID0gc2NyZWVuLl9jcmVhdGVwb2x5KCkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSAiaW1hZ2UiOgorICAgICAgICAgICAgcS50dXJ0bGUuX2l0ZW0gPSBzY3JlZW4uX2NyZWF0ZWltYWdlKHNjcmVlbi5fc2hhcGVzWyJibGFuayJdLl9kYXRhKQorICAgICAgICBlbGlmIHR0eXBlID09ICJjb21wb3VuZCI6CisgICAgICAgICAgICBxLnR1cnRsZS5faXRlbSA9IFtzY3JlZW4uX2NyZWF0ZXBvbHkoKSBmb3IgaXRlbSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLl9zaGFwZXNbc2VsZi50dXJ0bGUuc2hhcGVJbmRleF0uX2RhdGFdCisgICAgICAgIHEuY3VycmVudExpbmVJdGVtID0gc2NyZWVuLl9jcmVhdGVsaW5lKCkKKyAgICAgICAgcS5fdXBkYXRlKCkKKyAgICAgICAgcmV0dXJuIHEKKworICAgIGRlZiBzaGFwZShzZWxmLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJTZXQgdHVydGxlIHNoYXBlIHRvIHNoYXBlIHdpdGggZ2l2ZW4gbmFtZSAvIHJldHVybiBjdXJyZW50IHNoYXBlbmFtZS4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgICAgbmFtZSAtLSBhIHN0cmluZywgd2hpY2ggaXMgYSB2YWxpZCBzaGFwZW5hbWUKKworICAgICAgICBTZXQgdHVydGxlIHNoYXBlIHRvIHNoYXBlIHdpdGggZ2l2ZW4gbmFtZSBvciwgaWYgbmFtZSBpcyBub3QgZ2l2ZW4sCisgICAgICAgIHJldHVybiBuYW1lIG9mIGN1cnJlbnQgc2hhcGUuCisgICAgICAgIFNoYXBlIHdpdGggbmFtZSBtdXN0IGV4aXN0IGluIHRoZSBUdXJ0bGVTY3JlZW4ncyBzaGFwZSBkaWN0aW9uYXJ5LgorICAgICAgICBJbml0aWFsbHkgdGhlcmUgYXJlIHRoZSBmb2xsb3dpbmcgcG9seWdvbiBzaGFwZXM6CisgICAgICAgICdhcnJvdycsICd0dXJ0bGUnLCAnY2lyY2xlJywgJ3NxdWFyZScsICd0cmlhbmdsZScsICdjbGFzc2ljJy4KKyAgICAgICAgVG8gbGVhcm4gYWJvdXQgaG93IHRvIGRlYWwgd2l0aCBzaGFwZXMgc2VlIFNjcmVlbi1tZXRob2QgcmVnaXN0ZXJfc2hhcGUuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuc2hhcGUoKQorICAgICAgICAnYXJyb3cnCisgICAgICAgID4+PiB0dXJ0bGUuc2hhcGUoInR1cnRsZSIpCisgICAgICAgID4+PiB0dXJ0bGUuc2hhcGUoKQorICAgICAgICAndHVydGxlJworICAgICAgICAiIiIKKyAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHVydGxlLnNoYXBlSW5kZXgKKyAgICAgICAgaWYgbm90IG5hbWUgaW4gc2VsZi5zY3JlZW4uZ2V0c2hhcGVzKCk6CisgICAgICAgICAgICByYWlzZSBUdXJ0bGVHcmFwaGljc0Vycm9yKCJUaGVyZSBpcyBubyBzaGFwZSBuYW1lZCAlcyIgJSBuYW1lKQorICAgICAgICBzZWxmLnR1cnRsZS5fc2V0c2hhcGUobmFtZSkKKyAgICAgICAgc2VsZi5fdXBkYXRlKCkKKworICAgIGRlZiBzaGFwZXNpemUoc2VsZiwgc3RyZXRjaF93aWQ9Tm9uZSwgc3RyZXRjaF9sZW49Tm9uZSwgb3V0bGluZT1Ob25lKToKKyAgICAgICAgIiIiU2V0L3JldHVybiB0dXJ0bGUncyBzdHJldGNoZmFjdG9ycy9vdXRsaW5lLiBTZXQgcmVzaXplbW9kZSB0byAidXNlciIuCisKKyAgICAgICAgT3B0aW5vbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgc3RyZXRjaF93aWQgOiBwb3NpdGl2ZSBudW1iZXIKKyAgICAgICAgICAgc3RyZXRjaF9sZW4gOiBwb3NpdGl2ZSBudW1iZXIKKyAgICAgICAgICAgb3V0bGluZSAgOiBwb3NpdGl2ZSBudW1iZXIKKworICAgICAgICBSZXR1cm4gb3Igc2V0IHRoZSBwZW4ncyBhdHRyaWJ1dGVzIHgveS1zdHJldGNoZmFjdG9ycyBhbmQvb3Igb3V0bGluZS4KKyAgICAgICAgU2V0IHJlc2l6ZW1vZGUgdG8gInVzZXIiLgorICAgICAgICBJZiBhbmQgb25seSBpZiByZXNpemVtb2RlIGlzIHNldCB0byAidXNlciIsIHRoZSB0dXJ0bGUgd2lsbCBiZSBkaXNwbGF5ZWQKKyAgICAgICAgc3RyZXRjaGVkIGFjY29yZGluZyB0byBpdHMgc3RyZXRjaGZhY3RvcnM6CisgICAgICAgIHN0cmV0Y2hfd2lkIGlzIHN0cmV0Y2hmYWN0b3IgcGVycGVuZGljdWxhciB0byBvcmllbnRhdGlvbgorICAgICAgICBzdHJldGNoX2xlbiBpcyBzdHJldGNoZmFjdG9yIGluIGRpcmVjdGlvbiBvZiB0dXJ0bGVzIG9yaWVudGF0aW9uLgorICAgICAgICBvdXRsaW5lIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIHRoZSBzaGFwZXMncyBvdXRsaW5lLgorCisgICAgICAgIEV4YW1wbGVzIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5yZXNpemVtb2RlKCJ1c2VyIikKKyAgICAgICAgPj4+IHR1cnRsZS5zaGFwZXNpemUoNSwgNSwgMTIpCisgICAgICAgID4+PiB0dXJ0bGUuc2hhcGVzaXplKG91dGxpbmU9OCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHN0cmV0Y2hfd2lkIGlzIHN0cmV0Y2hfbGVuIGlzIG91dGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIHN0cmV0Y2hfd2lkLCBzdHJldGNoX2xlbiA9IHNlbGYuX3N0cmV0Y2hmYWN0b3IKKyAgICAgICAgICAgIHJldHVybiBzdHJldGNoX3dpZCwgc3RyZXRjaF9sZW4sIHNlbGYuX291dGxpbmV3aWR0aAorICAgICAgICBpZiBzdHJldGNoX3dpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHN0cmV0Y2hfbGVuIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RyZXRjaGZhY3RvciA9IHN0cmV0Y2hfd2lkLCBzdHJldGNoX3dpZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdHJldGNoZmFjdG9yID0gc3RyZXRjaF93aWQsIHN0cmV0Y2hfbGVuCisgICAgICAgIGVsaWYgc3RyZXRjaF9sZW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdHJldGNoZmFjdG9yID0gc2VsZi5fc3RyZXRjaGZhY3RvclswXSwgc3RyZXRjaF9sZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0cmV0Y2hmYWN0b3IgPSBzZWxmLl9zdHJldGNoZmFjdG9yCisgICAgICAgIGlmIG91dGxpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIG91dGxpbmUgPSBzZWxmLl9vdXRsaW5ld2lkdGgKKyAgICAgICAgc2VsZi5wZW4ocmVzaXplbW9kZT0idXNlciIsCisgICAgICAgICAgICAgICAgIHN0cmV0Y2hmYWN0b3I9c3RyZXRjaGZhY3Rvciwgb3V0bGluZT1vdXRsaW5lKQorCisgICAgZGVmIHNldHRpbHRhbmdsZShzZWxmLCBhbmdsZSk6CisgICAgICAgICIiIlJvdGF0ZSB0aGUgdHVydGxlc2hhcGUgdG8gcG9pbnQgaW4gdGhlIHNwZWNpZmllZCBkaXJlY3Rpb24KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgICAgYW5nbGUgLS0gbnVtYmVyCisKKyAgICAgICAgUm90YXRlIHRoZSB0dXJ0bGVzaGFwZSB0byBwb2ludCBpbiB0aGUgZGlyZWN0aW9uIHNwZWNpZmllZCBieSBhbmdsZSwKKyAgICAgICAgcmVnYXJkbGVzcyBvZiBpdHMgY3VycmVudCB0aWx0LWFuZ2xlLiBETyBOT1QgY2hhbmdlIHRoZSB0dXJ0bGUncworICAgICAgICBoZWFkaW5nIChkaXJlY3Rpb24gb2YgbW92ZW1lbnQpLgorCisKKyAgICAgICAgRXhhbXBsZXMgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlKCJjaXJjbGUiKQorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlc2l6ZSg1LDIpCisgICAgICAgID4+PiB0dXJ0bGUuc2V0dGlsdGFuZ2xlKDQ1KQorICAgICAgICA+Pj4gc3RhbXAoKQorICAgICAgICA+Pj4gdHVydGxlLmZkKDUwKQorICAgICAgICA+Pj4gdHVydGxlLnNldHRpbHRhbmdsZSgtNDUpCisgICAgICAgID4+PiBzdGFtcCgpCisgICAgICAgID4+PiB0dXJ0bGUuZmQoNTApCisgICAgICAgICIiIgorICAgICAgICB0aWx0ID0gLWFuZ2xlICogc2VsZi5fZGVncmVlc1BlckFVICogc2VsZi5fYW5nbGVPcmllbnQKKyAgICAgICAgdGlsdCA9ICh0aWx0ICogbWF0aC5waSAvIDE4MC4wKSAlICgyKm1hdGgucGkpCisgICAgICAgIHNlbGYucGVuKHJlc2l6ZW1vZGU9InVzZXIiLCB0aWx0PXRpbHQpCisKKyAgICBkZWYgdGlsdGFuZ2xlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGN1cnJlbnQgdGlsdC1hbmdsZS4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBSZXR1cm4gdGhlIGN1cnJlbnQgdGlsdC1hbmdsZSwgaS4gZS4gdGhlIGFuZ2xlIGJldHdlZW4gdGhlCisgICAgICAgIG9yaWVudGF0aW9uIG9mIHRoZSB0dXJ0bGVzaGFwZSBhbmQgdGhlIGhlYWRpbmcgb2YgdGhlIHR1cnRsZQorICAgICAgICAoaXRzIGRpcmVjdGlvbiBvZiBtb3ZlbWVudCkuCisKKyAgICAgICAgRXhhbXBsZXMgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlKCJjaXJjbGUiKQorICAgICAgICA+Pj4gdHVydGxlLnNoYXBlc2l6ZSg1LDIpCisgICAgICAgID4+PiB0dXJ0bGUudGlsdCg0NSkKKyAgICAgICAgPj4+IHR1cnRsZS50aWx0YW5nbGUoKQorICAgICAgICAiIiIKKyAgICAgICAgdGlsdCA9IC1zZWxmLl90aWx0ICogKDE4MC4wL21hdGgucGkpICogc2VsZi5fYW5nbGVPcmllbnQKKyAgICAgICAgcmV0dXJuICh0aWx0IC8gc2VsZi5fZGVncmVlc1BlckFVKSAlIHNlbGYuX2Z1bGxjaXJjbGUKKworICAgIGRlZiB0aWx0KHNlbGYsIGFuZ2xlKToKKyAgICAgICAgIiIiUm90YXRlIHRoZSB0dXJ0bGVzaGFwZSBieSBhbmdsZS4KKworICAgICAgICBBcmd1bWVudDoKKyAgICAgICAgYW5nbGUgLSBhIG51bWJlcgorCisgICAgICAgIFJvdGF0ZSB0aGUgdHVydGxlc2hhcGUgYnkgYW5nbGUgZnJvbSBpdHMgY3VycmVudCB0aWx0LWFuZ2xlLAorICAgICAgICBidXQgZG8gTk9UIGNoYW5nZSB0aGUgdHVydGxlJ3MgaGVhZGluZyAoZGlyZWN0aW9uIG9mIG1vdmVtZW50KS4KKworICAgICAgICBFeGFtcGxlcyAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuc2hhcGUoImNpcmNsZSIpCisgICAgICAgID4+PiB0dXJ0bGUuc2hhcGVzaXplKDUsMikKKyAgICAgICAgPj4+IHR1cnRsZS50aWx0KDMwKQorICAgICAgICA+Pj4gdHVydGxlLmZkKDUwKQorICAgICAgICA+Pj4gdHVydGxlLnRpbHQoMzApCisgICAgICAgID4+PiB0dXJ0bGUuZmQoNTApCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNldHRpbHRhbmdsZShhbmdsZSArIHNlbGYudGlsdGFuZ2xlKCkpCisKKyAgICBkZWYgX3BvbHl0cmFmbyhzZWxmLCBwb2x5KToKKyAgICAgICAgIiIiQ29tcHV0ZXMgdHJhbnNmb3JtZWQgcG9seWdvbiBzaGFwZXMgZnJvbSBhIHNoYXBlCisgICAgICAgIGFjY29yZGluZyB0byBjdXJyZW50IHBvc2l0aW9uIGFuZCBoZWFkaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgc2NyZWVuID0gc2VsZi5zY3JlZW4KKyAgICAgICAgcDAsIHAxID0gc2VsZi5fcG9zaXRpb24KKyAgICAgICAgZTAsIGUxID0gc2VsZi5fb3JpZW50CisgICAgICAgIGUgPSBWZWMyRChlMCwgZTEgKiBzY3JlZW4ueXNjYWxlIC8gc2NyZWVuLnhzY2FsZSkKKyAgICAgICAgZTAsIGUxID0gKDEuMCAvIGFicyhlKSkgKiBlCisgICAgICAgIHJldHVybiBbKHAwKyhlMSp4K2UwKnkpL3NjcmVlbi54c2NhbGUsIHAxKygtZTAqeCtlMSp5KS9zY3JlZW4ueXNjYWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHgsIHkpIGluIHBvbHldCisKKyAgICBkZWYgX2RyYXd0dXJ0bGUoc2VsZik6CisgICAgICAgICIiIk1hbmFnZXMgdGhlIGNvcnJlY3QgcmVuZGVyaW5nIG9mIHRoZSB0dXJ0bGUgd2l0aCByZXNwZWN0IHRvCisgICAgICAgIGl0cyBzaGFwZSwgcmVzaXplbW9kZSwgc3RyZXRjaCBhbmQgdGlsdCBldGMuIiIiCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIHNoYXBlID0gc2NyZWVuLl9zaGFwZXNbc2VsZi50dXJ0bGUuc2hhcGVJbmRleF0KKyAgICAgICAgdHR5cGUgPSBzaGFwZS5fdHlwZQorICAgICAgICB0aXRlbSA9IHNlbGYudHVydGxlLl9pdGVtCisgICAgICAgIGlmIHNlbGYuX3Nob3duIGFuZCBzY3JlZW4uX3VwZGF0ZWNvdW50ZXIgPT0gMCBhbmQgc2NyZWVuLl90cmFjaW5nID4gMDoKKyAgICAgICAgICAgIHNlbGYuX2hpZGRlbl9mcm9tX3NjcmVlbiA9IEZhbHNlCisgICAgICAgICAgICB0c2hhcGUgPSBzaGFwZS5fZGF0YQorICAgICAgICAgICAgaWYgdHR5cGUgPT0gInBvbHlnb24iOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Jlc2l6ZW1vZGUgPT0gIm5vcmVzaXplIjoKKyAgICAgICAgICAgICAgICAgICAgdyA9IDEKKyAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSB0c2hhcGUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLl9yZXNpemVtb2RlID09ICJhdXRvIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGx4ID0gbHkgPSBtYXgoMSwgc2VsZi5fcGVuc2l6ZS81LjApCisgICAgICAgICAgICAgICAgICAgICAgICB3ID0gc2VsZi5fcGVuc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgdGlsdGFuZ2xlID0gMAorICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX3Jlc2l6ZW1vZGUgPT0gInVzZXIiOgorICAgICAgICAgICAgICAgICAgICAgICAgbHgsIGx5ID0gc2VsZi5fc3RyZXRjaGZhY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgdyA9IHNlbGYuX291dGxpbmV3aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgdGlsdGFuZ2xlID0gc2VsZi5fdGlsdAorICAgICAgICAgICAgICAgICAgICBzaGFwZSA9IFsobHgqeCwgbHkqeSkgZm9yICh4LCB5KSBpbiB0c2hhcGVdCisgICAgICAgICAgICAgICAgICAgIHQwLCB0MSA9IG1hdGguc2luKHRpbHRhbmdsZSksIG1hdGguY29zKHRpbHRhbmdsZSkKKyAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBbKHQxKngrdDAqeSwgLXQwKngrdDEqeSkgZm9yICh4LCB5KSBpbiBzaGFwZV0KKyAgICAgICAgICAgICAgICBzaGFwZSA9IHNlbGYuX3BvbHl0cmFmbyhzaGFwZSkKKyAgICAgICAgICAgICAgICBmYywgb2MgPSBzZWxmLl9maWxsY29sb3IsIHNlbGYuX3BlbmNvbG9yCisgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3cG9seSh0aXRlbSwgc2hhcGUsIGZpbGw9ZmMsIG91dGxpbmU9b2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD13LCB0b3A9VHJ1ZSkKKyAgICAgICAgICAgIGVsaWYgdHR5cGUgPT0gImltYWdlIjoKKyAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdpbWFnZSh0aXRlbSwgc2VsZi5fcG9zaXRpb24sIHRzaGFwZSkKKyAgICAgICAgICAgIGVsaWYgdHR5cGUgPT0gImNvbXBvdW5kIjoKKyAgICAgICAgICAgICAgICBseCwgbHkgPSBzZWxmLl9zdHJldGNoZmFjdG9yCisgICAgICAgICAgICAgICAgdyA9IHNlbGYuX291dGxpbmV3aWR0aAorICAgICAgICAgICAgICAgIGZvciBpdGVtLCAocG9seSwgZmMsIG9jKSBpbiB6aXAodGl0ZW0sIHRzaGFwZSk6CisgICAgICAgICAgICAgICAgICAgIHBvbHkgPSBbKGx4KngsIGx5KnkpIGZvciAoeCwgeSkgaW4gcG9seV0KKyAgICAgICAgICAgICAgICAgICAgcG9seSA9IHNlbGYuX3BvbHl0cmFmbyhwb2x5KQorICAgICAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdwb2x5KGl0ZW0sIHBvbHksIGZpbGw9c2VsZi5fY2MoZmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9c2VsZi5fY2Mob2MpLCB3aWR0aD13LCB0b3A9VHJ1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuX2hpZGRlbl9mcm9tX3NjcmVlbjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHR0eXBlID09ICJwb2x5Z29uIjoKKyAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdwb2x5KHRpdGVtLCAoKDAsIDApLCAoMCwgMCksICgwLCAwKSksICIiLCAiIikKKyAgICAgICAgICAgIGVsaWYgdHR5cGUgPT0gImltYWdlIjoKKyAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdpbWFnZSh0aXRlbSwgc2VsZi5fcG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4uX3NoYXBlc1siYmxhbmsiXS5fZGF0YSkKKyAgICAgICAgICAgIGVsaWYgdHR5cGUgPT0gImNvbXBvdW5kIjoKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiB0aXRlbToKKyAgICAgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3cG9seShpdGVtLCAoKDAsIDApLCAoMCwgMCksICgwLCAwKSksICIiLCAiIikKKyAgICAgICAgICAgIHNlbGYuX2hpZGRlbl9mcm9tX3NjcmVlbiA9IFRydWUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICBzdGFtcCBzdHVmZiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgZGVmIHN0YW1wKHNlbGYpOgorICAgICAgICAiIiJTdGFtcCBhIGNvcHkgb2YgdGhlIHR1cnRsZXNoYXBlIG9udG8gdGhlIGNhbnZhcyBhbmQgcmV0dXJuIGl0cyBpZC4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBTdGFtcCBhIGNvcHkgb2YgdGhlIHR1cnRsZSBzaGFwZSBvbnRvIHRoZSBjYW52YXMgYXQgdGhlIGN1cnJlbnQKKyAgICAgICAgdHVydGxlIHBvc2l0aW9uLiBSZXR1cm4gYSBzdGFtcF9pZCBmb3IgdGhhdCBzdGFtcCwgd2hpY2ggY2FuIGJlCisgICAgICAgIHVzZWQgdG8gZGVsZXRlIGl0IGJ5IGNhbGxpbmcgY2xlYXJzdGFtcChzdGFtcF9pZCkuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuY29sb3IoImJsdWUiKQorICAgICAgICA+Pj4gdHVydGxlLnN0YW1wKCkKKyAgICAgICAgMTMKKyAgICAgICAgPj4+IHR1cnRsZS5mZCg1MCkKKyAgICAgICAgIiIiCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIHNoYXBlID0gc2NyZWVuLl9zaGFwZXNbc2VsZi50dXJ0bGUuc2hhcGVJbmRleF0KKyAgICAgICAgdHR5cGUgPSBzaGFwZS5fdHlwZQorICAgICAgICB0c2hhcGUgPSBzaGFwZS5fZGF0YQorICAgICAgICBpZiB0dHlwZSA9PSAicG9seWdvbiI6CisgICAgICAgICAgICBzdGl0ZW0gPSBzY3JlZW4uX2NyZWF0ZXBvbHkoKQorICAgICAgICAgICAgaWYgc2VsZi5fcmVzaXplbW9kZSA9PSAibm9yZXNpemUiOgorICAgICAgICAgICAgICAgIHcgPSAxCisgICAgICAgICAgICAgICAgc2hhcGUgPSB0c2hhcGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmVzaXplbW9kZSA9PSAiYXV0byI6CisgICAgICAgICAgICAgICAgICAgIGx4ID0gbHkgPSBtYXgoMSwgc2VsZi5fcGVuc2l6ZS81LjApCisgICAgICAgICAgICAgICAgICAgIHcgPSBzZWxmLl9wZW5zaXplCisgICAgICAgICAgICAgICAgICAgIHRpbHRhbmdsZSA9IDAKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuX3Jlc2l6ZW1vZGUgPT0gInVzZXIiOgorICAgICAgICAgICAgICAgICAgICBseCwgbHkgPSBzZWxmLl9zdHJldGNoZmFjdG9yCisgICAgICAgICAgICAgICAgICAgIHcgPSBzZWxmLl9vdXRsaW5ld2lkdGgKKyAgICAgICAgICAgICAgICAgICAgdGlsdGFuZ2xlID0gc2VsZi5fdGlsdAorICAgICAgICAgICAgICAgIHNoYXBlID0gWyhseCp4LCBseSp5KSBmb3IgKHgsIHkpIGluIHRzaGFwZV0KKyAgICAgICAgICAgICAgICB0MCwgdDEgPSBtYXRoLnNpbih0aWx0YW5nbGUpLCBtYXRoLmNvcyh0aWx0YW5nbGUpCisgICAgICAgICAgICAgICAgc2hhcGUgPSBbKHQxKngrdDAqeSwgLXQwKngrdDEqeSkgZm9yICh4LCB5KSBpbiBzaGFwZV0KKyAgICAgICAgICAgIHNoYXBlID0gc2VsZi5fcG9seXRyYWZvKHNoYXBlKQorICAgICAgICAgICAgZmMsIG9jID0gc2VsZi5fZmlsbGNvbG9yLCBzZWxmLl9wZW5jb2xvcgorICAgICAgICAgICAgc2NyZWVuLl9kcmF3cG9seShzdGl0ZW0sIHNoYXBlLCBmaWxsPWZjLCBvdXRsaW5lPW9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aD13LCB0b3A9VHJ1ZSkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSAiaW1hZ2UiOgorICAgICAgICAgICAgc3RpdGVtID0gc2NyZWVuLl9jcmVhdGVpbWFnZSgiIikKKyAgICAgICAgICAgIHNjcmVlbi5fZHJhd2ltYWdlKHN0aXRlbSwgc2VsZi5fcG9zaXRpb24sIHRzaGFwZSkKKyAgICAgICAgZWxpZiB0dHlwZSA9PSAiY29tcG91bmQiOgorICAgICAgICAgICAgc3RpdGVtID0gW10KKyAgICAgICAgICAgIGZvciBlbGVtZW50IGluIHRzaGFwZToKKyAgICAgICAgICAgICAgICBpdGVtID0gc2NyZWVuLl9jcmVhdGVwb2x5KCkKKyAgICAgICAgICAgICAgICBzdGl0ZW0uYXBwZW5kKGl0ZW0pCisgICAgICAgICAgICBzdGl0ZW0gPSB0dXBsZShzdGl0ZW0pCisgICAgICAgICAgICBseCwgbHkgPSBzZWxmLl9zdHJldGNoZmFjdG9yCisgICAgICAgICAgICB3ID0gc2VsZi5fb3V0bGluZXdpZHRoCisgICAgICAgICAgICBmb3IgaXRlbSwgKHBvbHksIGZjLCBvYykgaW4gemlwKHN0aXRlbSwgdHNoYXBlKToKKyAgICAgICAgICAgICAgICBwb2x5ID0gWyhseCp4LCBseSp5KSBmb3IgKHgsIHkpIGluIHBvbHldCisgICAgICAgICAgICAgICAgcG9seSA9IHNlbGYuX3BvbHl0cmFmbyhwb2x5KQorICAgICAgICAgICAgICAgIHNjcmVlbi5fZHJhd3BvbHkoaXRlbSwgcG9seSwgZmlsbD1zZWxmLl9jYyhmYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRsaW5lPXNlbGYuX2NjKG9jKSwgd2lkdGg9dywgdG9wPVRydWUpCisgICAgICAgIHNlbGYuc3RhbXBJdGVtcy5hcHBlbmQoc3RpdGVtKQorICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaCgoInN0YW1wIiwgc3RpdGVtKSkKKyAgICAgICAgcmV0dXJuIHN0aXRlbQorCisgICAgZGVmIF9jbGVhcnN0YW1wKHNlbGYsIHN0YW1waWQpOgorICAgICAgICAiIiJkb2VzIHRoZSB3b3JrIGZvciBjbGVhcnN0YW1wKCkgYW5kIGNsZWFyc3RhbXBzKCkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHN0YW1waWQgaW4gc2VsZi5zdGFtcEl0ZW1zOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzdGFtcGlkLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgZm9yIHN1Yml0ZW0gaW4gc3RhbXBpZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zY3JlZW4uX2RlbGV0ZShzdWJpdGVtKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNjcmVlbi5fZGVsZXRlKHN0YW1waWQpCisgICAgICAgICAgICBzZWxmLnN0YW1wSXRlbXMucmVtb3ZlKHN0YW1waWQpCisgICAgICAgICMgRGVsZXRlIHN0YW1waXRlbSBmcm9tIHVuZG9idWZmZXIgaWYgbmVjZXNzYXJ5CisgICAgICAgICMgaWYgY2xlYXJzdGFtcCBpcyBjYWxsZWQgZGlyZWN0bHkuCisgICAgICAgIGl0ZW0gPSAoInN0YW1wIiwgc3RhbXBpZCkKKyAgICAgICAgYnVmID0gc2VsZi51bmRvYnVmZmVyCisgICAgICAgIGlmIGl0ZW0gbm90IGluIGJ1Zi5idWZmZXI6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW5kZXggPSBidWYuYnVmZmVyLmluZGV4KGl0ZW0pCisgICAgICAgIGJ1Zi5idWZmZXIucmVtb3ZlKGl0ZW0pCisgICAgICAgIGlmIGluZGV4IDw9IGJ1Zi5wdHI6CisgICAgICAgICAgICBidWYucHRyID0gKGJ1Zi5wdHIgLSAxKSAlIGJ1Zi5idWZzaXplCisgICAgICAgIGJ1Zi5idWZmZXIuaW5zZXJ0KChidWYucHRyKzEpJWJ1Zi5idWZzaXplLCBbTm9uZV0pCisKKyAgICBkZWYgY2xlYXJzdGFtcChzZWxmLCBzdGFtcGlkKToKKyAgICAgICAgIiIiRGVsZXRlIHN0YW1wIHdpdGggZ2l2ZW4gc3RhbXBpZAorCisgICAgICAgIEFyZ3VtZW50OgorICAgICAgICBzdGFtcGlkIC0gYW4gaW50ZWdlciwgbXVzdCBiZSByZXR1cm4gdmFsdWUgb2YgcHJldmlvdXMgc3RhbXAoKSBjYWxsLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmNvbG9yKCJibHVlIikKKyAgICAgICAgPj4+IGFzdGFtcCA9IHR1cnRsZS5zdGFtcCgpCisgICAgICAgID4+PiB0dXJ0bGUuZmQoNTApCisgICAgICAgID4+PiB0dXJ0bGUuY2xlYXJzdGFtcChhc3RhbXApCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jbGVhcnN0YW1wKHN0YW1waWQpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisKKyAgICBkZWYgY2xlYXJzdGFtcHMoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgIiIiRGVsZXRlIGFsbCBvciBmaXJzdC9sYXN0IG4gb2YgdHVydGxlJ3Mgc3RhbXBzLgorCisgICAgICAgIE9wdGlvbmFsIGFyZ3VtZW50OgorICAgICAgICBuIC0tIGFuIGludGVnZXIKKworICAgICAgICBJZiBuIGlzIE5vbmUsIGRlbGV0ZSBhbGwgb2YgcGVuJ3Mgc3RhbXBzLAorICAgICAgICBlbHNlIGlmIG4gPiAwIGRlbGV0ZSBmaXJzdCBuIHN0YW1wcworICAgICAgICBlbHNlIGlmIG4gPCAwIGRlbGV0ZSBsYXN0IG4gc3RhbXBzLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoOCk6CisgICAgICAgIC4uLiAgICAgdHVydGxlLnN0YW1wKCk7IHR1cnRsZS5mZCgzMCkKKyAgICAgICAgLi4uCisgICAgICAgID4+PiB0dXJ0bGUuY2xlYXJzdGFtcHMoMikKKyAgICAgICAgPj4+IHR1cnRsZS5jbGVhcnN0YW1wcygtMikKKyAgICAgICAgPj4+IHR1cnRsZS5jbGVhcnN0YW1wcygpCisgICAgICAgICIiIgorICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICB0b0RlbGV0ZSA9IHNlbGYuc3RhbXBJdGVtc1s6XQorICAgICAgICBlbGlmIG4gPj0gMDoKKyAgICAgICAgICAgIHRvRGVsZXRlID0gc2VsZi5zdGFtcEl0ZW1zWzpuXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdG9EZWxldGUgPSBzZWxmLnN0YW1wSXRlbXNbbjpdCisgICAgICAgIGZvciBpdGVtIGluIHRvRGVsZXRlOgorICAgICAgICAgICAgc2VsZi5fY2xlYXJzdGFtcChpdGVtKQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIF9nb3RvKHNlbGYsIGVuZCk6CisgICAgICAgICIiIk1vdmUgdGhlIHBlbiB0byB0aGUgcG9pbnQgZW5kLCB0aGVyZWJ5IGRyYXdpbmcgYSBsaW5lCisgICAgICAgIGlmIHBlbiBpcyBkb3duLiBBbGwgb3RoZXIgbWV0aG9kZXMgZm9yIHR1cnRsZSBtb3ZlbWVudCBkZXBlbmQKKyAgICAgICAgb24gdGhpcyBvbmUuCisgICAgICAgICIiIgorICAgICAgICAjIyBWZXJzaW9uIG1pdCB1bmRvLXN0dWZmCisgICAgICAgIGdvX21vZGVzID0gKCBzZWxmLl9kcmF3aW5nLAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGVuY29sb3IsCisgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wZW5zaXplLAorICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShzZWxmLl9maWxscGF0aCwgbGlzdCkpCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIHVuZG9fZW50cnkgPSAoImdvIiwgc2VsZi5fcG9zaXRpb24sIGVuZCwgZ29fbW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuY3VycmVudExpbmVJdGVtLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudExpbmVbOl0sCisgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuLl9wb2ludGxpc3Qoc2VsZi5jdXJyZW50TGluZUl0ZW0pLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXRlbXNbOl0pCisgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaCh1bmRvX2VudHJ5KQorICAgICAgICBzdGFydCA9IHNlbGYuX3Bvc2l0aW9uCisgICAgICAgIGlmIHNlbGYuX3NwZWVkIGFuZCBzY3JlZW4uX3RyYWNpbmcgPT0gMToKKyAgICAgICAgICAgIGRpZmYgPSAoZW5kLXN0YXJ0KQorICAgICAgICAgICAgZGlmZnNxID0gKGRpZmZbMF0qc2NyZWVuLnhzY2FsZSkqKjIgKyAoZGlmZlsxXSpzY3JlZW4ueXNjYWxlKSoqMgorICAgICAgICAgICAgbmhvcHMgPSAxK2ludCgoZGlmZnNxKiowLjUpLygzKigxLjEqKnNlbGYuX3NwZWVkKSpzZWxmLl9zcGVlZCkpCisgICAgICAgICAgICBkZWx0YSA9IGRpZmYgKiAoMS4wL25ob3BzKQorICAgICAgICAgICAgZm9yIG4gaW4gcmFuZ2UoMSwgbmhvcHMpOgorICAgICAgICAgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgdG9wID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRvcCA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBzdGFydCArIGRlbHRhICogbgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2RyYXdpbmc6CisgICAgICAgICAgICAgICAgICAgIHNjcmVlbi5fZHJhd2xpbmUoc2VsZi5kcmF3aW5nTGluZUl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXJ0LCBzZWxmLl9wb3NpdGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGVuY29sb3IsIHNlbGYuX3BlbnNpemUsIHRvcCkKKyAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGUoKQorICAgICAgICAgICAgaWYgc2VsZi5fZHJhd2luZzoKKyAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdsaW5lKHNlbGYuZHJhd2luZ0xpbmVJdGVtLCAoKDAsIDApLCAoMCwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIiLCB3aWR0aD1zZWxmLl9wZW5zaXplKQorICAgICAgICAjIFR1cnRsZSBub3cgYXQgZW5kLAorICAgICAgICBpZiBzZWxmLl9kcmF3aW5nOiAjIG5vdyB1cGRhdGUgY3VycmVudExpbmUKKyAgICAgICAgICAgIHNlbGYuY3VycmVudExpbmUuYXBwZW5kKGVuZCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLl9maWxscGF0aCwgbGlzdCk6CisgICAgICAgICAgICBzZWxmLl9maWxscGF0aC5hcHBlbmQoZW5kKQorICAgICAgICAjIyMjIyMgICAgdmVyZXJidW5nISEhISEhISEhISEhISEhISEhISEhIQorICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IGVuZAorICAgICAgICBpZiBzZWxmLl9jcmVhdGluZ1BvbHk6CisgICAgICAgICAgICBzZWxmLl9wb2x5LmFwcGVuZChlbmQpCisgICAgICAgIGlmIGxlbihzZWxmLmN1cnJlbnRMaW5lKSA+IDQyOiAjIDQyISBhbnN3ZXIgdG8gdGhlIHVsdGltYXRlIHF1ZXN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIGxpZmUsIHRoZSB1bml2ZXJzZSBhbmQgZXZlcnl0aGluZworICAgICAgICAgICAgc2VsZi5fbmV3TGluZSgpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpICNjb3VudD1UcnVlKQorCisgICAgZGVmIF91bmRvZ290byhzZWxmLCBlbnRyeSk6CisgICAgICAgICIiIlJldmVyc2UgYSBfZ290by4gVXNlZCBmb3IgdW5kbygpCisgICAgICAgICIiIgorICAgICAgICBvbGQsIG5ldywgZ29fbW9kZXMsIGNvb2RhdGEgPSBlbnRyeQorICAgICAgICBkcmF3aW5nLCBwYywgcHMsIGZpbGxpbmcgPSBnb19tb2RlcworICAgICAgICBjTEksIGNMLCBwbCwgaXRlbXMgPSBjb29kYXRhCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIGlmIGFicyhzZWxmLl9wb3NpdGlvbiAtIG5ldykgPiAwLjU6CisgICAgICAgICAgICBwcmludCAidW5kb2dvdG86IEhBTExPLURBLVNUSU1NVC1XQVMtTklDSFQhIgorICAgICAgICAjIHJlc3RvcmUgZm9ybWVyIHNpdHVhdGlvbgorICAgICAgICBzZWxmLmN1cnJlbnRMaW5lSXRlbSA9IGNMSQorICAgICAgICBzZWxmLmN1cnJlbnRMaW5lID0gY0wKKworICAgICAgICBpZiBwbCA9PSBbKDAsIDApLCAoMCwgMCldOgorICAgICAgICAgICAgdXNlcGMgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXNlcGMgPSBwYworICAgICAgICBzY3JlZW4uX2RyYXdsaW5lKGNMSSwgcGwsIGZpbGw9dXNlcGMsIHdpZHRoPXBzKQorCisgICAgICAgIHRvZGVsZXRlID0gW2kgZm9yIGkgaW4gc2VsZi5pdGVtcyBpZiAoaSBub3QgaW4gaXRlbXMpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNjcmVlbi5fdHlwZShpKSA9PSAibGluZSIpXQorICAgICAgICBmb3IgaSBpbiB0b2RlbGV0ZToKKyAgICAgICAgICAgIHNjcmVlbi5fZGVsZXRlKGkpCisgICAgICAgICAgICBzZWxmLml0ZW1zLnJlbW92ZShpKQorCisgICAgICAgIHN0YXJ0ID0gb2xkCisgICAgICAgIGlmIHNlbGYuX3NwZWVkIGFuZCBzY3JlZW4uX3RyYWNpbmcgPT0gMToKKyAgICAgICAgICAgIGRpZmYgPSBvbGQgLSBuZXcKKyAgICAgICAgICAgIGRpZmZzcSA9IChkaWZmWzBdKnNjcmVlbi54c2NhbGUpKioyICsgKGRpZmZbMV0qc2NyZWVuLnlzY2FsZSkqKjIKKyAgICAgICAgICAgIG5ob3BzID0gMStpbnQoKGRpZmZzcSoqMC41KS8oMyooMS4xKipzZWxmLl9zcGVlZCkqc2VsZi5fc3BlZWQpKQorICAgICAgICAgICAgZGVsdGEgPSBkaWZmICogKDEuMC9uaG9wcykKKyAgICAgICAgICAgIGZvciBuIGluIHJhbmdlKDEsIG5ob3BzKToKKyAgICAgICAgICAgICAgICBpZiBuID09IDE6CisgICAgICAgICAgICAgICAgICAgIHRvcCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0b3AgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuX3Bvc2l0aW9uID0gbmV3ICsgZGVsdGEgKiBuCisgICAgICAgICAgICAgICAgaWYgZHJhd2luZzoKKyAgICAgICAgICAgICAgICAgICAgc2NyZWVuLl9kcmF3bGluZShzZWxmLmRyYXdpbmdMaW5lSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhcnQsIHNlbGYuX3Bvc2l0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYywgcHMsIHRvcCkKKyAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGUoKQorICAgICAgICAgICAgaWYgZHJhd2luZzoKKyAgICAgICAgICAgICAgICBzY3JlZW4uX2RyYXdsaW5lKHNlbGYuZHJhd2luZ0xpbmVJdGVtLCAoKDAsIDApLCAoMCwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIiLCB3aWR0aD1wcykKKyAgICAgICAgIyBUdXJ0bGUgbm93IGF0IHBvc2l0aW9uIG9sZCwKKyAgICAgICAgc2VsZi5fcG9zaXRpb24gPSBvbGQKKyAgICAgICAgIyMgIGlmIHVuZG8gaXMgZG9uZSBkdXJpbmcgY3JlYXRpbmcgYSBwb2x5Z29uLCB0aGUgbGFzdCB2ZXJ0ZXgKKyAgICAgICAgIyMgIHdpbGwgYmUgZGVsZXRlZC4gaWYgdGhlIHBvbHlnb24gaXMgZW50aXJlbHkgZGVsZXRlZCwKKyAgICAgICAgIyMgIGNyZWF0aW5nUG9seSB3aWxsIGJlIHNldCB0byBGYWxzZS4KKyAgICAgICAgIyMgIFBvbHlnb25zIGNyZWF0ZWQgYmVmb3JlIHRoZSBsYXN0IG9uZSB3aWxsIG5vdCBiZSBhZmZlY3RlZCBieSB1bmRvKCkKKyAgICAgICAgaWYgc2VsZi5fY3JlYXRpbmdQb2x5OgorICAgICAgICAgICAgaWYgbGVuKHNlbGYuX3BvbHkpID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLl9wb2x5LnBvcCgpCisgICAgICAgICAgICBpZiBzZWxmLl9wb2x5ID09IFtdOgorICAgICAgICAgICAgICAgIHNlbGYuX2NyZWF0aW5nUG9seSA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5fcG9seSA9IE5vbmUKKyAgICAgICAgaWYgZmlsbGluZzoKKyAgICAgICAgICAgIGlmIHNlbGYuX2ZpbGxwYXRoID09IFtdOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGxwYXRoID0gTm9uZQorICAgICAgICAgICAgICAgIHByaW50ICJVbndhaHJzY2hlaW5saWNoIGluIF91bmRvZ290byEiCisgICAgICAgICAgICBlbGlmIHNlbGYuX2ZpbGxwYXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGxwYXRoLnBvcCgpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpICNjb3VudD1UcnVlKQorCisgICAgZGVmIF9yb3RhdGUoc2VsZiwgYW5nbGUpOgorICAgICAgICAiIiJUdXJucyBwZW4gY2xvY2t3aXNlIGJ5IGFuZ2xlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2goKCJyb3QiLCBhbmdsZSwgc2VsZi5fZGVncmVlc1BlckFVKSkKKyAgICAgICAgYW5nbGUgKj0gc2VsZi5fZGVncmVlc1BlckFVCisgICAgICAgIG5ld29yaWVudCA9IHNlbGYuX29yaWVudC5yb3RhdGUoYW5nbGUpCisgICAgICAgIHRyYWNpbmcgPSBzZWxmLnNjcmVlbi5fdHJhY2luZworICAgICAgICBpZiB0cmFjaW5nID09IDEgYW5kIHNlbGYuX3NwZWVkID4gMDoKKyAgICAgICAgICAgIGFuZ2xldmVsID0gMy4wICogc2VsZi5fc3BlZWQKKyAgICAgICAgICAgIHN0ZXBzID0gMSArIGludChhYnMoYW5nbGUpL2FuZ2xldmVsKQorICAgICAgICAgICAgZGVsdGEgPSAxLjAqYW5nbGUvc3RlcHMKKyAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKHN0ZXBzKToKKyAgICAgICAgICAgICAgICBzZWxmLl9vcmllbnQgPSBzZWxmLl9vcmllbnQucm90YXRlKGRlbHRhKQorICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisgICAgICAgIHNlbGYuX29yaWVudCA9IG5ld29yaWVudAorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIF9uZXdMaW5lKHNlbGYsIHVzZVBvcz1UcnVlKToKKyAgICAgICAgIiIiQ2xvc2VzIGN1cnJlbnQgbGluZSBpdGVtIGFuZCBzdGFydHMgYSBuZXcgb25lLgorICAgICAgICAgICBSZW1hcms6IGlmIGN1cnJlbnQgbGluZSBiZWNhbWUgdG9vIGxvbmcsIGFuaW1hdGlvbgorICAgICAgICAgICBwZXJmb3JtYW5jZSAodmlhIF9kcmF3bGluZSkgc2xvd2VkIGRvd24gY29uc2lkZXJhYmx5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbGVuKHNlbGYuY3VycmVudExpbmUpID4gMToKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kcmF3bGluZShzZWxmLmN1cnJlbnRMaW5lSXRlbSwgc2VsZi5jdXJyZW50TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGVuY29sb3IsIHNlbGYuX3BlbnNpemUpCisgICAgICAgICAgICBzZWxmLmN1cnJlbnRMaW5lSXRlbSA9IHNlbGYuc2NyZWVuLl9jcmVhdGVsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKHNlbGYuY3VycmVudExpbmVJdGVtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zY3JlZW4uX2RyYXdsaW5lKHNlbGYuY3VycmVudExpbmVJdGVtLCB0b3A9VHJ1ZSkKKyAgICAgICAgc2VsZi5jdXJyZW50TGluZSA9IFtdCisgICAgICAgIGlmIHVzZVBvczoKKyAgICAgICAgICAgIHNlbGYuY3VycmVudExpbmUgPSBbc2VsZi5fcG9zaXRpb25dCisKKyAgICBkZWYgZmlsbChzZWxmLCBmbGFnPU5vbmUpOgorICAgICAgICAiIiJDYWxsIGZpbGwoVHJ1ZSkgYmVmb3JlIGRyYXdpbmcgYSBzaGFwZSB0byBmaWxsLCBmaWxsKEZhbHNlKSB3aGVuIGRvbmUuCisKKyAgICAgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgICAgIGZsYWcgLS0gVHJ1ZS9GYWxzZSAob3IgMS8wIHJlc3BlY3RpdmVseSkKKworICAgICAgICBDYWxsIGZpbGwoVHJ1ZSkgYmVmb3JlIGRyYXdpbmcgdGhlIHNoYXBlIHlvdSB3YW50IHRvIGZpbGwsCisgICAgICAgIGFuZCAgZmlsbChGYWxzZSkgd2hlbiBkb25lLgorICAgICAgICBXaGVuIHVzZWQgd2l0aG91dCBhcmd1bWVudDogcmV0dXJuIGZpbGxzdGF0ZSAoVHJ1ZSBpZiBmaWxsaW5nLAorICAgICAgICBGYWxzZSBlbHNlKQorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmZpbGwoVHJ1ZSkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5maWxsKEZhbHNlKQorICAgICAgICAiIiIKKyAgICAgICAgZmlsbGluZyA9IGlzaW5zdGFuY2Uoc2VsZi5fZmlsbHBhdGgsIGxpc3QpCisgICAgICAgIGlmIGZsYWcgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBmaWxsaW5nCisgICAgICAgIHNjcmVlbiA9IHNlbGYuc2NyZWVuCisgICAgICAgIGVudHJ5MSA9IGVudHJ5MiA9ICgpCisgICAgICAgIGlmIGZpbGxpbmc6CisgICAgICAgICAgICBpZiBsZW4oc2VsZi5fZmlsbHBhdGgpID4gMjoKKyAgICAgICAgICAgICAgICBzZWxmLnNjcmVlbi5fZHJhd3BvbHkoc2VsZi5fZmlsbGl0ZW0sIHNlbGYuX2ZpbGxwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsPXNlbGYuX2ZpbGxjb2xvcikKKyAgICAgICAgICAgICAgICBlbnRyeTEgPSAoImRvZmlsbCIsIHNlbGYuX2ZpbGxpdGVtKQorICAgICAgICBpZiBmbGFnOgorICAgICAgICAgICAgc2VsZi5fZmlsbGl0ZW0gPSBzZWxmLnNjcmVlbi5fY3JlYXRlcG9seSgpCisgICAgICAgICAgICBzZWxmLml0ZW1zLmFwcGVuZChzZWxmLl9maWxsaXRlbSkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGxwYXRoID0gW3NlbGYuX3Bvc2l0aW9uXQorICAgICAgICAgICAgZW50cnkyID0gKCJiZWdpbmZpbGwiLCBzZWxmLl9maWxsaXRlbSkgIyAsIHNlbGYuX2ZpbGxwYXRoKQorICAgICAgICAgICAgc2VsZi5fbmV3TGluZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9maWxsaXRlbSA9IHNlbGYuX2ZpbGxwYXRoID0gTm9uZQorICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICBpZiBlbnRyeTEgPT0gKCk6CisgICAgICAgICAgICAgICAgaWYgZW50cnkyICE9ICgpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaChlbnRyeTIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGVudHJ5MiA9PSAoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2goZW50cnkxKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKFsic2VxIiwgZW50cnkxLCBlbnRyeTJdKQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIGJlZ2luX2ZpbGwoc2VsZik6CisgICAgICAgICIiIkNhbGxlZCBqdXN0IGJlZm9yZSBkcmF3aW5nIGEgc2hhcGUgdG8gYmUgZmlsbGVkLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmJlZ2luX2ZpbGwoKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmVuZF9maWxsKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmlsbChUcnVlKQorCisgICAgZGVmIGVuZF9maWxsKHNlbGYpOgorICAgICAgICAiIiJGaWxsIHRoZSBzaGFwZSBkcmF3biBhZnRlciB0aGUgY2FsbCBiZWdpbl9maWxsKCkuCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlIGluc3RhbmNlIG5hbWVkIHR1cnRsZSk6CisgICAgICAgID4+PiB0dXJ0bGUuYmVnaW5fZmlsbCgpCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgPj4+IHR1cnRsZS5mb3J3YXJkKDEwMCkKKyAgICAgICAgPj4+IHR1cnRsZS5sZWZ0KDkwKQorICAgICAgICA+Pj4gdHVydGxlLmZvcndhcmQoMTAwKQorICAgICAgICA+Pj4gdHVydGxlLmxlZnQoOTApCisgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCisgICAgICAgID4+PiB0dXJ0bGUuZW5kX2ZpbGwoKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxsKEZhbHNlKQorCisgICAgZGVmIGRvdChzZWxmLCBzaXplPU5vbmUsICpjb2xvcik6CisgICAgICAgICIiIkRyYXcgYSBkb3Qgd2l0aCBkaWFtZXRlciBzaXplLCB1c2luZyBjb2xvci4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgIHNpemUgLS0gYW4gaW50ZWdlciA+PSAxIChpZiBnaXZlbikKKyAgICAgICAgY29sb3IgLS0gYSBjb2xvcnN0cmluZyBvciBhIG51bWVyaWMgY29sb3IgdHVwbGUKKworICAgICAgICBEcmF3IGEgY2lyY3VsYXIgZG90IHdpdGggZGlhbWV0ZXIgc2l6ZSwgdXNpbmcgY29sb3IuCisgICAgICAgIElmIHNpemUgaXMgbm90IGdpdmVuLCB0aGUgbWF4aW11bSBvZiBwZW5zaXplKzQgYW5kIDIqcGVuc2l6ZSBpcyB1c2VkLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmRvdCgpCisgICAgICAgID4+PiB0dXJ0bGUuZmQoNTApOyB0dXJ0bGUuZG90KDIwLCAiYmx1ZSIpOyB0dXJ0bGUuZmQoNTApCisgICAgICAgICIiIgorICAgICAgICAjcHJpbnQgImRvdC0xOiIsIHNpemUsIGNvbG9yCisgICAgICAgIGlmIG5vdCBjb2xvcjoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2l6ZSwgKHN0ciwgdHVwbGUpKToKKyAgICAgICAgICAgICAgICBjb2xvciA9IHNlbGYuX2NvbG9yc3RyKHNpemUpCisgICAgICAgICAgICAgICAgc2l6ZSA9IHNlbGYuX3BlbnNpemUgKyBtYXgoc2VsZi5fcGVuc2l6ZSwgNCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29sb3IgPSBzZWxmLl9wZW5jb2xvcgorICAgICAgICAgICAgICAgIGlmIG5vdCBzaXplOgorICAgICAgICAgICAgICAgICAgICBzaXplID0gc2VsZi5fcGVuc2l6ZSArIG1heChzZWxmLl9wZW5zaXplLCA0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNpemUgPSBzZWxmLl9wZW5zaXplICsgbWF4KHNlbGYuX3BlbnNpemUsIDQpCisgICAgICAgICAgICBjb2xvciA9IHNlbGYuX2NvbG9yc3RyKGNvbG9yKQorICAgICAgICAjcHJpbnQgImRvdC0yOiIsIHNpemUsIGNvbG9yCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5zY3JlZW4sICJfZG90Iik6CisgICAgICAgICAgICBpdGVtID0gc2VsZi5zY3JlZW4uX2RvdChzZWxmLl9wb3NpdGlvbiwgc2l6ZSwgY29sb3IpCisgICAgICAgICAgICAjcHJpbnQgImRvdDoiLCBzaXplLCBjb2xvciwgIml0ZW06IiwgaXRlbQorICAgICAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlcjoKKyAgICAgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIucHVzaCgoImRvdCIsIGl0ZW0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGVuID0gc2VsZi5wZW4oKQorICAgICAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKFsic2VxIl0pCisgICAgICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLmN1bXVsYXRlID0gVHJ1ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYucmVzaXplbW9kZSgpID09ICdhdXRvJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5odCgpCisgICAgICAgICAgICAgICAgc2VsZi5wZW5kb3duKCkKKyAgICAgICAgICAgICAgICBzZWxmLnBlbnNpemUoc2l6ZSkKKyAgICAgICAgICAgICAgICBzZWxmLnBlbmNvbG9yKGNvbG9yKQorICAgICAgICAgICAgICAgIHNlbGYuZm9yd2FyZCgwKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLnBlbihwZW4pCisgICAgICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLmN1bXVsYXRlID0gRmFsc2UKKworICAgIGRlZiBfd3JpdGUoc2VsZiwgdHh0LCBhbGlnbiwgZm9udCk6CisgICAgICAgICIiIlBlcmZvcm1zIHRoZSB3cml0aW5nIGZvciB3cml0ZSgpCisgICAgICAgICIiIgorICAgICAgICBpdGVtLCBlbmQgPSBzZWxmLnNjcmVlbi5fd3JpdGUoc2VsZi5fcG9zaXRpb24sIHR4dCwgYWxpZ24sIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGVuY29sb3IpCisgICAgICAgIHNlbGYuaXRlbXMuYXBwZW5kKGl0ZW0pCisgICAgICAgIGlmIHNlbGYudW5kb2J1ZmZlcjoKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wdXNoKCgid3JpIiwgaXRlbSkpCisgICAgICAgIHJldHVybiBlbmQKKworICAgIGRlZiB3cml0ZShzZWxmLCBhcmcsIG1vdmU9RmFsc2UsIGFsaWduPSJsZWZ0IiwgZm9udD0oIkFyaWFsIiwgOCwgIm5vcm1hbCIpKToKKyAgICAgICAgIiIiV3JpdGUgdGV4dCBhdCB0aGUgY3VycmVudCB0dXJ0bGUgcG9zaXRpb24uCisKKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICBhcmcgLS0gaW5mbywgd2hpY2ggaXMgdG8gYmUgd3JpdHRlbiB0byB0aGUgVHVydGxlU2NyZWVuCisgICAgICAgIG1vdmUgKG9wdGlvbmFsKSAtLSBUcnVlL0ZhbHNlCisgICAgICAgIGFsaWduIChvcHRpb25hbCkgLS0gb25lIG9mIHRoZSBzdHJpbmdzICJsZWZ0IiwgImNlbnRlciIgb3IgcmlnaHQiCisgICAgICAgIGZvbnQgKG9wdGlvbmFsKSAtLSBhIHRyaXBsZSAoZm9udG5hbWUsIGZvbnRzaXplLCBmb250dHlwZSkKKworICAgICAgICBXcml0ZSB0ZXh0IC0gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhcmcgLSBhdCB0aGUgY3VycmVudAorICAgICAgICB0dXJ0bGUgcG9zaXRpb24gYWNjb3JkaW5nIHRvIGFsaWduICgibGVmdCIsICJjZW50ZXIiIG9yIHJpZ2h0IikKKyAgICAgICAgYW5kIHdpdGggdGhlIGdpdmVuIGZvbnQuCisgICAgICAgIElmIG1vdmUgaXMgVHJ1ZSwgdGhlIHBlbiBpcyBtb3ZlZCB0byB0aGUgYm90dG9tLXJpZ2h0IGNvcm5lcgorICAgICAgICBvZiB0aGUgdGV4dC4gQnkgZGVmYXVsdCwgbW92ZSBpcyBGYWxzZS4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS53cml0ZSgnSG9tZSA9ICcsIFRydWUsIGFsaWduPSJjZW50ZXIiKQorICAgICAgICA+Pj4gdHVydGxlLndyaXRlKCgwLDApLCBUcnVlKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyOgorICAgICAgICAgICAgc2VsZi51bmRvYnVmZmVyLnB1c2goWyJzZXEiXSkKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5jdW11bGF0ZSA9IFRydWUKKyAgICAgICAgZW5kID0gc2VsZi5fd3JpdGUoc3RyKGFyZyksIGFsaWduLmxvd2VyKCksIGZvbnQpCisgICAgICAgIGlmIG1vdmU6CisgICAgICAgICAgICB4LCB5ID0gc2VsZi5wb3MoKQorICAgICAgICAgICAgc2VsZi5zZXRwb3MoZW5kLCB5KQorICAgICAgICBpZiBzZWxmLnVuZG9idWZmZXI6CisgICAgICAgICAgICBzZWxmLnVuZG9idWZmZXIuY3VtdWxhdGUgPSBGYWxzZQorCisgICAgZGVmIGJlZ2luX3BvbHkoc2VsZik6CisgICAgICAgICIiIlN0YXJ0IHJlY29yZGluZyB0aGUgdmVydGljZXMgb2YgYSBwb2x5Z29uLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIFN0YXJ0IHJlY29yZGluZyB0aGUgdmVydGljZXMgb2YgYSBwb2x5Z29uLiBDdXJyZW50IHR1cnRsZSBwb3NpdGlvbgorICAgICAgICBpcyBmaXJzdCBwb2ludCBvZiBwb2x5Z29uLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLmJlZ2luX3BvbHkoKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcG9seSA9IFtzZWxmLl9wb3NpdGlvbl0KKyAgICAgICAgc2VsZi5fY3JlYXRpbmdQb2x5ID0gVHJ1ZQorCisgICAgZGVmIGVuZF9wb2x5KHNlbGYpOgorICAgICAgICAiIiJTdG9wIHJlY29yZGluZyB0aGUgdmVydGljZXMgb2YgYSBwb2x5Z29uLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIFN0b3AgcmVjb3JkaW5nIHRoZSB2ZXJ0aWNlcyBvZiBhIHBvbHlnb24uIEN1cnJlbnQgdHVydGxlIHBvc2l0aW9uIGlzCisgICAgICAgIGxhc3QgcG9pbnQgb2YgcG9seWdvbi4gVGhpcyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIHRoZSBmaXJzdCBwb2ludC4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IHR1cnRsZS5lbmRfcG9seSgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jcmVhdGluZ1BvbHkgPSBGYWxzZQorCisgICAgZGVmIGdldF9wb2x5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxhc3RseSByZWNvcmRlZCBwb2x5Z29uLgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gcCA9IHR1cnRsZS5nZXRfcG9seSgpCisgICAgICAgID4+PiB0dXJ0bGUucmVnaXN0ZXJfc2hhcGUoIm15RmF2b3VyaXRlU2hhcGUiLCBwKQorICAgICAgICAiIiIKKyAgICAgICAgIyMgY2hlY2sgaWYgdGhlcmUgaXMgYW55IHBvbHk/ICAtLSAxc3Qgc29sdXRpb246CisgICAgICAgIGlmIHNlbGYuX3BvbHkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdHVwbGUoc2VsZi5fcG9seSkKKworICAgIGRlZiBnZXRzY3JlZW4oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgVHVydGxlU2NyZWVuIG9iamVjdCwgdGhlIHR1cnRsZSBpcyBkcmF3aW5nICBvbi4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBSZXR1cm4gdGhlIFR1cnRsZVNjcmVlbiBvYmplY3QsIHRoZSB0dXJ0bGUgaXMgZHJhd2luZyAgb24uCisgICAgICAgIFNvIFR1cnRsZVNjcmVlbi1tZXRob2RzIGNhbiBiZSBjYWxsZWQgZm9yIHRoYXQgb2JqZWN0LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHMgPSB0dXJ0bGUuZ2V0c2NyZWVuKCkKKyAgICAgICAgPj4+IHRzCisgICAgICAgIDx0dXJ0bGUuVHVydGxlU2NyZWVuIG9iamVjdCBhdCAweDAxMDZCNzcwPgorICAgICAgICA+Pj4gdHMuYmdjb2xvcigicGluayIpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5zY3JlZW4KKworICAgIGRlZiBnZXR0dXJ0bGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgVHVydGxlb2JqZWN0IGl0c2VsZi4KKworICAgICAgICBObyBhcmd1bWVudC4KKworICAgICAgICBPbmx5IHJlYXNvbmFibGUgdXNlOiBhcyBhIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgJ2Fub255bW91cyB0dXJ0bGUnOgorCisgICAgICAgIEV4YW1wbGU6CisgICAgICAgID4+PiBwZXQgPSBnZXR0dXJ0bGUoKQorICAgICAgICA+Pj4gcGV0LmZkKDUwKQorICAgICAgICA+Pj4gcGV0CisgICAgICAgIDx0dXJ0bGUuVHVydGxlIG9iamVjdCBhdCAweDAxODdEODEwPgorICAgICAgICA+Pj4gdHVydGxlcygpCisgICAgICAgIFs8dHVydGxlLlR1cnRsZSBvYmplY3QgYXQgMHgwMTg3RDgxMD5dCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZ2V0cGVuID0gZ2V0dHVydGxlCisKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgc2NyZWVuIG9yaWVudGVkIG1ldGhvZHMgcmVjdXJyaW5nIHRvIG1ldGhvZHMgb2YgVHVydGxlU2NyZWVuCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgZGVmIHdpbmRvd193aWR0aChzZWxmKToKKyAgICAgICAgIiIiIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSB0dXJ0bGUgd2luZG93LgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLndpbmRvd193aWR0aCgpCisgICAgICAgIDY0MAorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc2NyZWVuLl93aW5kb3dfc2l6ZSgpWzBdCisKKyAgICBkZWYgd2luZG93X2hlaWdodChzZWxmKToKKyAgICAgICAgIiIiIFJldHVybiB0aGUgaGVpZ2h0IG9mIHRoZSB0dXJ0bGUgd2luZG93LgorCisgICAgICAgIE5vIGFyZ3VtZW50LgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZVNjcmVlbiBpbnN0YW5jZSBuYW1lZCBzY3JlZW4pOgorICAgICAgICA+Pj4gc2NyZWVuLndpbmRvd19oZWlnaHQoKQorICAgICAgICA0ODAKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNjcmVlbi5fd2luZG93X3NpemUoKVsxXQorCisgICAgZGVmIF9kZWxheShzZWxmLCBkZWxheT1Ob25lKToKKyAgICAgICAgIiIiU2V0IGRlbGF5IHZhbHVlIHdoaWNoIGRldGVybWluZXMgc3BlZWQgb2YgdHVydGxlIGFuaW1hdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNjcmVlbi5kZWxheShkZWxheSkKKworICAgICMjIyMjICAgZXZlbnQgYmluZGluZyBtZXRob2RzICAgIyMjIyMKKworICAgIGRlZiBvbmNsaWNrKHNlbGYsIGZ1biwgYnRuPTEsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCBmdW4gdG8gbW91c2UtY2xpY2sgZXZlbnQgb24gdGhpcyB0dXJ0bGUgb24gY2FudmFzLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgZnVuIC0tICBhIGZ1bmN0aW9uIHdpdGggdHdvIGFyZ3VtZW50cywgdG8gd2hpY2ggd2lsbCBiZSBhc3NpZ25lZAorICAgICAgICAgICAgICAgIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgY2xpY2tlZCBwb2ludCBvbiB0aGUgY2FudmFzLgorICAgICAgICBudW0gLS0gIG51bWJlciBvZiB0aGUgbW91c2UtYnV0dG9uIGRlZmF1bHRzIHRvIDEgKGxlZnQgbW91c2UgYnV0dG9uKS4KKyAgICAgICAgYWRkIC0tICBUcnVlIG9yIEZhbHNlLiBJZiBUcnVlLCBuZXcgYmluZGluZyB3aWxsIGJlIGFkZGVkLCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICBpdCB3aWxsIHJlcGxhY2UgYSBmb3JtZXIgYmluZGluZy4KKworICAgICAgICBFeGFtcGxlIGZvciB0aGUgYW5vbnltb3VzIHR1cnRsZSwgaS4gZS4gdGhlIHByb2NlZHVyYWwgd2F5OgorCisgICAgICAgID4+PiBkZWYgdHVybih4LCB5KToKKyAgICAgICAgLi4uICAgICBsZWZ0KDM2MCkKKyAgICAgICAgLi4uCisgICAgICAgID4+PiBvbmNsaWNrKHR1cm4pICAjIE5vdyBjbGlja2luZyBpbnRvIHRoZSB0dXJ0bGUgd2lsbCB0dXJuIGl0LgorICAgICAgICA+Pj4gb25jbGljayhOb25lKSAgIyBldmVudC1iaW5kaW5nIHdpbGwgYmUgcmVtb3ZlZAorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zY3JlZW4uX29uY2xpY2soc2VsZi50dXJ0bGUuX2l0ZW0sIGZ1biwgYnRuLCBhZGQpCisgICAgICAgIHNlbGYuX3VwZGF0ZSgpCisKKyAgICBkZWYgb25yZWxlYXNlKHNlbGYsIGZ1biwgYnRuPTEsIGFkZD1Ob25lKToKKyAgICAgICAgIiIiQmluZCBmdW4gdG8gbW91c2UtYnV0dG9uLXJlbGVhc2UgZXZlbnQgb24gdGhpcyB0dXJ0bGUgb24gY2FudmFzLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgZnVuIC0tIGEgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzLCB0byB3aGljaCB3aWxsIGJlIGFzc2lnbmVkCisgICAgICAgICAgICAgICAgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjbGlja2VkIHBvaW50IG9uIHRoZSBjYW52YXMuCisgICAgICAgIG51bSAtLSAgbnVtYmVyIG9mIHRoZSBtb3VzZS1idXR0b24gZGVmYXVsdHMgdG8gMSAobGVmdCBtb3VzZSBidXR0b24pLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIE15VHVydGxlIGluc3RhbmNlIG5hbWVkIGpvZSk6CisgICAgICAgID4+PiBjbGFzcyBNeVR1cnRsZShUdXJ0bGUpOgorICAgICAgICAuLi4gICAgIGRlZiBnbG93KHNlbGYseCx5KToKKyAgICAgICAgLi4uICAgICAgICAgICAgIHNlbGYuZmlsbGNvbG9yKCJyZWQiKQorICAgICAgICAuLi4gICAgIGRlZiB1bmdsb3coc2VsZix4LHkpOgorICAgICAgICAuLi4gICAgICAgICAgICAgc2VsZi5maWxsY29sb3IoIiIpCisgICAgICAgIC4uLgorICAgICAgICA+Pj4gam9lID0gTXlUdXJ0bGUoKQorICAgICAgICA+Pj4gam9lLm9uY2xpY2soam9lLmdsb3cpCisgICAgICAgID4+PiBqb2Uub25yZWxlYXNlKGpvZS51bmdsb3cpCisKKyAgICAgICAgQ2xpY2tpbmcgb24gam9lIHR1cm5zIGZpbGxjb2xvciByZWQsIHVuY2xpY2tpbmcgdHVybnMgaXQgdG8KKyAgICAgICAgdHJhbnNwYXJlbnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnNjcmVlbi5fb25yZWxlYXNlKHNlbGYudHVydGxlLl9pdGVtLCBmdW4sIGJ0biwgYWRkKQorICAgICAgICBzZWxmLl91cGRhdGUoKQorCisgICAgZGVmIG9uZHJhZyhzZWxmLCBmdW4sIGJ0bj0xLCBhZGQ9Tm9uZSk6CisgICAgICAgICIiIkJpbmQgZnVuIHRvIG1vdXNlLW1vdmUgZXZlbnQgb24gdGhpcyB0dXJ0bGUgb24gY2FudmFzLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgZnVuIC0tIGEgZnVuY3Rpb24gd2l0aCB0d28gYXJndW1lbnRzLCB0byB3aGljaCB3aWxsIGJlIGFzc2lnbmVkCisgICAgICAgICAgICAgICB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIGNsaWNrZWQgcG9pbnQgb24gdGhlIGNhbnZhcy4KKyAgICAgICAgbnVtIC0tIG51bWJlciBvZiB0aGUgbW91c2UtYnV0dG9uIGRlZmF1bHRzIHRvIDEgKGxlZnQgbW91c2UgYnV0dG9uKS4KKworICAgICAgICBFdmVyeSBzZXF1ZW5jZSBvZiBtb3VzZS1tb3ZlLWV2ZW50cyBvbiBhIHR1cnRsZSBpcyBwcmVjZWRlZCBieSBhCisgICAgICAgIG1vdXNlLWNsaWNrIGV2ZW50IG9uIHRoYXQgdHVydGxlLgorCisgICAgICAgIEV4YW1wbGUgKGZvciBhIFR1cnRsZSBpbnN0YW5jZSBuYW1lZCB0dXJ0bGUpOgorICAgICAgICA+Pj4gdHVydGxlLm9uZHJhZyh0dXJ0bGUuZ290bykKKworICAgICAgICBTdWJzZXF1ZW50bHkgY2xpY2tpbmcgYW5kIGRyYWdnaW5nIGEgVHVydGxlIHdpbGwgbW92ZSBpdAorICAgICAgICBhY3Jvc3MgdGhlIHNjcmVlbiB0aGVyZWJ5IHByb2R1Y2luZyBoYW5kZHJhd2luZ3MgKGlmIHBlbiBpcworICAgICAgICBkb3duKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuc2NyZWVuLl9vbmRyYWcoc2VsZi50dXJ0bGUuX2l0ZW0sIGZ1biwgYnRuLCBhZGQpCisKKworICAgIGRlZiBfdW5kbyhzZWxmLCBhY3Rpb24sIGRhdGEpOgorICAgICAgICAiIiJEb2VzIHRoZSBtYWluIHBhcnQgb2YgdGhlIHdvcmsgZm9yIHVuZG8oKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgYWN0aW9uID09ICJyb3QiOgorICAgICAgICAgICAgYW5nbGUsIGRlZ1BBVSA9IGRhdGEKKyAgICAgICAgICAgIHNlbGYuX3JvdGF0ZSgtYW5nbGUqZGVnUEFVL3NlbGYuX2RlZ3JlZXNQZXJBVSkKKyAgICAgICAgICAgIGR1bW15ID0gc2VsZi51bmRvYnVmZmVyLnBvcCgpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJzdGFtcCI6CisgICAgICAgICAgICBzdGl0ZW0gPSBkYXRhWzBdCisgICAgICAgICAgICBzZWxmLmNsZWFyc3RhbXAoc3RpdGVtKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAiZ28iOgorICAgICAgICAgICAgc2VsZi5fdW5kb2dvdG8oZGF0YSkKKyAgICAgICAgZWxpZiBhY3Rpb24gaW4gWyJ3cmkiLCAiZG90Il06CisgICAgICAgICAgICBpdGVtID0gZGF0YVswXQorICAgICAgICAgICAgc2VsZi5zY3JlZW4uX2RlbGV0ZShpdGVtKQorICAgICAgICAgICAgc2VsZi5pdGVtcy5yZW1vdmUoaXRlbSkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gImRvZmlsbCI6CisgICAgICAgICAgICBpdGVtID0gZGF0YVswXQorICAgICAgICAgICAgc2VsZi5zY3JlZW4uX2RyYXdwb2x5KGl0ZW0sICgoMCwgMCksKDAsIDApLCgwLCAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD0iIiwgb3V0bGluZT0iIikKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gImJlZ2luZmlsbCI6CisgICAgICAgICAgICBpdGVtID0gZGF0YVswXQorICAgICAgICAgICAgc2VsZi5fZmlsbGl0ZW0gPSBzZWxmLl9maWxscGF0aCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc2NyZWVuLl9kZWxldGUoaXRlbSkKKyAgICAgICAgICAgIHNlbGYuaXRlbXMucmVtb3ZlKGl0ZW0pCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJwZW4iOgorICAgICAgICAgICAgVFBlbi5wZW4oc2VsZiwgZGF0YVswXSkKKyAgICAgICAgICAgIHNlbGYudW5kb2J1ZmZlci5wb3AoKQorCisgICAgZGVmIHVuZG8oc2VsZik6CisgICAgICAgICIiInVuZG8gKHJlcGVhdGVkbHkpIHRoZSBsYXN0IHR1cnRsZSBhY3Rpb24uCisKKyAgICAgICAgTm8gYXJndW1lbnQuCisKKyAgICAgICAgdW5kbyAocmVwZWF0ZWRseSkgdGhlIGxhc3QgdHVydGxlIGFjdGlvbi4KKyAgICAgICAgTnVtYmVyIG9mIGF2YWlsYWJsZSB1bmRvIGFjdGlvbnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2l6ZSBvZgorICAgICAgICB0aGUgdW5kb2J1ZmZlci4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBUdXJ0bGUgaW5zdGFuY2UgbmFtZWQgdHVydGxlKToKKyAgICAgICAgPj4+IGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICAuLi4gICAgIHR1cnRsZS5mZCg1MCk7IHR1cnRsZS5sdCg4MCkKKyAgICAgICAgLi4uCisgICAgICAgID4+PiBmb3IgaSBpbiByYW5nZSg4KToKKyAgICAgICAgLi4uICAgICB0dXJ0bGUudW5kbygpCisgICAgICAgIC4uLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51bmRvYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaXRlbSA9IHNlbGYudW5kb2J1ZmZlci5wb3AoKQorICAgICAgICBhY3Rpb24gPSBpdGVtWzBdCisgICAgICAgIGRhdGEgPSBpdGVtWzE6XQorICAgICAgICBpZiBhY3Rpb24gPT0gInNlcSI6CisgICAgICAgICAgICB3aGlsZSBkYXRhOgorICAgICAgICAgICAgICAgIGl0ZW0gPSBkYXRhLnBvcCgpCisgICAgICAgICAgICAgICAgc2VsZi5fdW5kbyhpdGVtWzBdLCBpdGVtWzE6XSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3VuZG8oYWN0aW9uLCBkYXRhKQorCisgICAgdHVydGxlc2l6ZSA9IHNoYXBlc2l6ZQorCitSYXdQZW4gPSBSYXdUdXJ0bGUKKworIyMjICBTY3JlZW4gLSBTaW5nbGV0b24gICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgU2NyZWVuKCk6CisgICAgIiIiUmV0dXJuIHRoZSBzaW5nbGV0b24gc2NyZWVuIG9iamVjdC4KKyAgICBJZiBub25lIGV4aXN0cyBhdCB0aGUgbW9tZW50LCBjcmVhdGUgYSBuZXcgb25lIGFuZCByZXR1cm4gaXQsCisgICAgZWxzZSByZXR1cm4gdGhlIGV4aXN0aW5nIG9uZS4iIiIKKyAgICBpZiBUdXJ0bGUuX3NjcmVlbiBpcyBOb25lOgorICAgICAgICBUdXJ0bGUuX3NjcmVlbiA9IF9TY3JlZW4oKQorICAgIHJldHVybiBUdXJ0bGUuX3NjcmVlbgorCitjbGFzcyBfU2NyZWVuKFR1cnRsZVNjcmVlbik6CisKKyAgICBfcm9vdCA9IE5vbmUKKyAgICBfY2FudmFzID0gTm9uZQorICAgIF90aXRsZSA9IF9DRkdbInRpdGxlIl0KKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBYWFggdGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhpcyBjb2RlIHRvIGJlIGNvbmRpdGlvbmFsLAorICAgICAgICAjIGFzIHRoZXJlIHdpbGwgYmUgb25seSBhIHNpbmdsZSBfU2NyZWVuIGluc3RhbmNlLCBhbnl3YXkKKyAgICAgICAgIyBYWFggYWN0dWFsbHksIHRoZSB0dXJ0bGUgZGVtbyBpcyBpbmplY3Rpbmcgcm9vdCB3aW5kb3csCisgICAgICAgICMgc28gcGVyaGFwcyB0aGUgY29uZGl0aW9uYWwgY3JlYXRpb24gb2YgYSByb290IHNob3VsZCBiZQorICAgICAgICAjIHByZXNlcnZlZCAocGVyaGFwcyBieSBwYXNzaW5nIGl0IGFzIGFuIG9wdGlvbmFsIHBhcmFtZXRlcikKKyAgICAgICAgaWYgX1NjcmVlbi5fcm9vdCBpcyBOb25lOgorICAgICAgICAgICAgX1NjcmVlbi5fcm9vdCA9IHNlbGYuX3Jvb3QgPSBfUm9vdCgpCisgICAgICAgICAgICBzZWxmLl9yb290LnRpdGxlKF9TY3JlZW4uX3RpdGxlKQorICAgICAgICAgICAgc2VsZi5fcm9vdC5vbmRlc3Ryb3koc2VsZi5fZGVzdHJveSkKKyAgICAgICAgaWYgX1NjcmVlbi5fY2FudmFzIGlzIE5vbmU6CisgICAgICAgICAgICB3aWR0aCA9IF9DRkdbIndpZHRoIl0KKyAgICAgICAgICAgIGhlaWdodCA9IF9DRkdbImhlaWdodCJdCisgICAgICAgICAgICBjYW52d2lkdGggPSBfQ0ZHWyJjYW52d2lkdGgiXQorICAgICAgICAgICAgY2FudmhlaWdodCA9IF9DRkdbImNhbnZoZWlnaHQiXQorICAgICAgICAgICAgbGVmdHJpZ2h0ID0gX0NGR1sibGVmdHJpZ2h0Il0KKyAgICAgICAgICAgIHRvcGJvdHRvbSA9IF9DRkdbInRvcGJvdHRvbSJdCisgICAgICAgICAgICBzZWxmLl9yb290LnNldHVwY2FudmFzKHdpZHRoLCBoZWlnaHQsIGNhbnZ3aWR0aCwgY2FudmhlaWdodCkKKyAgICAgICAgICAgIF9TY3JlZW4uX2NhbnZhcyA9IHNlbGYuX3Jvb3QuX2dldGNhbnZhcygpCisgICAgICAgICAgICBUdXJ0bGVTY3JlZW4uX19pbml0X18oc2VsZiwgX1NjcmVlbi5fY2FudmFzKQorICAgICAgICAgICAgc2VsZi5zZXR1cCh3aWR0aCwgaGVpZ2h0LCBsZWZ0cmlnaHQsIHRvcGJvdHRvbSkKKworICAgIGRlZiBzZXR1cChzZWxmLCB3aWR0aD1fQ0ZHWyJ3aWR0aCJdLCBoZWlnaHQ9X0NGR1siaGVpZ2h0Il0sCisgICAgICAgICAgICAgIHN0YXJ0eD1fQ0ZHWyJsZWZ0cmlnaHQiXSwgc3RhcnR5PV9DRkdbInRvcGJvdHRvbSJdKToKKyAgICAgICAgIiIiIFNldCB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIG1haW4gd2luZG93LgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgd2lkdGg6IGFzIGludGVnZXIgYSBzaXplIGluIHBpeGVscywgYXMgZmxvYXQgYSBmcmFjdGlvbiBvZiB0aGUgc2NyZWVuLgorICAgICAgICAgIERlZmF1bHQgaXMgNTAlIG9mIHNjcmVlbi4KKyAgICAgICAgaGVpZ2h0OiBhcyBpbnRlZ2VyIHRoZSBoZWlnaHQgaW4gcGl4ZWxzLCBhcyBmbG9hdCBhIGZyYWN0aW9uIG9mIHRoZQorICAgICAgICAgIHNjcmVlbi4gRGVmYXVsdCBpcyA3NSUgb2Ygc2NyZWVuLgorICAgICAgICBzdGFydHg6IGlmIHBvc2l0aXZlLCBzdGFydGluZyBwb3NpdGlvbiBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdAorICAgICAgICAgIGVkZ2Ugb2YgdGhlIHNjcmVlbiwgaWYgbmVnYXRpdmUgZnJvbSB0aGUgcmlnaHQgZWRnZQorICAgICAgICAgIERlZmF1bHQsIHN0YXJ0eD1Ob25lIGlzIHRvIGNlbnRlciB3aW5kb3cgaG9yaXpvbnRhbGx5LgorICAgICAgICBzdGFydHk6IGlmIHBvc2l0aXZlLCBzdGFydGluZyBwb3NpdGlvbiBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wCisgICAgICAgICAgZWRnZSBvZiB0aGUgc2NyZWVuLCBpZiBuZWdhdGl2ZSBmcm9tIHRoZSBib3R0b20gZWRnZQorICAgICAgICAgIERlZmF1bHQsIHN0YXJ0eT1Ob25lIGlzIHRvIGNlbnRlciB3aW5kb3cgdmVydGljYWxseS4KKworICAgICAgICBFeGFtcGxlcyAoZm9yIGEgU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4uc2V0dXAgKHdpZHRoPTIwMCwgaGVpZ2h0PTIwMCwgc3RhcnR4PTAsIHN0YXJ0eT0wKQorCisgICAgICAgIHNldHMgd2luZG93IHRvIDIwMHgyMDAgcGl4ZWxzLCBpbiB1cHBlciBsZWZ0IG9mIHNjcmVlbgorCisgICAgICAgID4+PiBzY3JlZW4uc2V0dXAod2lkdGg9Ljc1LCBoZWlnaHQ9MC41LCBzdGFydHg9Tm9uZSwgc3RhcnR5PU5vbmUpCisKKyAgICAgICAgc2V0cyB3aW5kb3cgdG8gNzUlIG9mIHNjcmVlbiBieSA1MCUgb2Ygc2NyZWVuIGFuZCBjZW50ZXJzCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLl9yb290LCAic2V0X2dlb21ldHJ5Iik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc3cgPSBzZWxmLl9yb290Lndpbl93aWR0aCgpCisgICAgICAgIHNoID0gc2VsZi5fcm9vdC53aW5faGVpZ2h0KCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh3aWR0aCwgZmxvYXQpIGFuZCAwIDw9IHdpZHRoIDw9IDE6CisgICAgICAgICAgICB3aWR0aCA9IHN3KndpZHRoCisgICAgICAgIGlmIHN0YXJ0eCBpcyBOb25lOgorICAgICAgICAgICAgc3RhcnR4ID0gKHN3IC0gd2lkdGgpIC8gMgorICAgICAgICBpZiBpc2luc3RhbmNlKGhlaWdodCwgZmxvYXQpIGFuZCAwIDw9IGhlaWdodCA8PSAxOgorICAgICAgICAgICAgaGVpZ2h0ID0gc2gqaGVpZ2h0CisgICAgICAgIGlmIHN0YXJ0eSBpcyBOb25lOgorICAgICAgICAgICAgc3RhcnR5ID0gKHNoIC0gaGVpZ2h0KSAvIDIKKyAgICAgICAgc2VsZi5fcm9vdC5zZXRfZ2VvbWV0cnkod2lkdGgsIGhlaWdodCwgc3RhcnR4LCBzdGFydHkpCisgICAgICAgIHNlbGYudXBkYXRlKCkKKworICAgIGRlZiB0aXRsZShzZWxmLCB0aXRsZXN0cmluZyk6CisgICAgICAgICIiIlNldCB0aXRsZSBvZiB0dXJ0bGUtd2luZG93CisKKyAgICAgICAgQXJndW1lbnQ6CisgICAgICAgIHRpdGxlc3RyaW5nIC0tIGEgc3RyaW5nLCB0byBhcHBlYXIgaW4gdGhlIHRpdGxlYmFyIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICB0dXJ0bGUgZ3JhcGhpY3Mgd2luZG93LgorCisgICAgICAgIFRoaXMgaXMgYSBtZXRob2Qgb2YgU2NyZWVuLWNsYXNzLiBOb3QgYXZhaWxhYmxlIGZvciBUdXJ0bGVTY3JlZW4tCisgICAgICAgIG9iamVjdHMuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4udGl0bGUoIldlbGNvbWUgdG8gdGhlIHR1cnRsZS16b28hIikKKyAgICAgICAgIiIiCisgICAgICAgIGlmIF9TY3JlZW4uX3Jvb3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfU2NyZWVuLl9yb290LnRpdGxlKHRpdGxlc3RyaW5nKQorICAgICAgICBfU2NyZWVuLl90aXRsZSA9IHRpdGxlc3RyaW5nCisKKyAgICBkZWYgX2Rlc3Ryb3koc2VsZik6CisgICAgICAgIHJvb3QgPSBzZWxmLl9yb290CisgICAgICAgIGlmIHJvb3QgaXMgX1NjcmVlbi5fcm9vdDoKKyAgICAgICAgICAgIFR1cnRsZS5fcGVuID0gTm9uZQorICAgICAgICAgICAgVHVydGxlLl9zY3JlZW4gPSBOb25lCisgICAgICAgICAgICBfU2NyZWVuLl9yb290ID0gTm9uZQorICAgICAgICAgICAgX1NjcmVlbi5fY2FudmFzID0gTm9uZQorICAgICAgICBUdXJ0bGVTY3JlZW4uX1JVTk5JTkcgPSBUcnVlCisgICAgICAgIHJvb3QuZGVzdHJveSgpCisKKyAgICBkZWYgYnllKHNlbGYpOgorICAgICAgICAiIiJTaHV0IHRoZSB0dXJ0bGVncmFwaGljcyB3aW5kb3cuCisKKyAgICAgICAgRXhhbXBsZSAoZm9yIGEgVHVydGxlU2NyZWVuIGluc3RhbmNlIG5hbWVkIHNjcmVlbik6CisgICAgICAgID4+PiBzY3JlZW4uYnllKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2Rlc3Ryb3koKQorCisgICAgZGVmIGV4aXRvbmNsaWNrKHNlbGYpOgorICAgICAgICAiIiJHbyBpbnRvIG1haW5sb29wIHVudGlsIHRoZSBtb3VzZSBpcyBjbGlja2VkLgorCisgICAgICAgIE5vIGFyZ3VtZW50cy4KKworICAgICAgICBCaW5kIGJ5ZSgpIG1ldGhvZCB0byBtb3VzZWNsaWNrIG9uIFR1cnRsZVNjcmVlbi4KKyAgICAgICAgSWYgInVzaW5nX0lETEUiIC0gdmFsdWUgaW4gY29uZmlndXJhdGlvbiBkaWN0aW9uYXJ5IGlzIEZhbHNlCisgICAgICAgIChkZWZhdWx0IHZhbHVlKSwgZW50ZXIgbWFpbmxvb3AuCisgICAgICAgIElmIElETEUgd2l0aCAtbiBzd2l0Y2ggKG5vIHN1YnByb2Nlc3MpIGlzIHVzZWQsIHRoaXMgdmFsdWUgc2hvdWxkIGJlCisgICAgICAgIHNldCB0byBUcnVlIGluIHR1cnRsZS5jZmcuIEluIHRoaXMgY2FzZSBJRExFJ3MgbWFpbmxvb3AKKyAgICAgICAgaXMgYWN0aXZlIGFsc28gZm9yIHRoZSBjbGllbnQgc2NyaXB0LgorCisgICAgICAgIFRoaXMgaXMgYSBtZXRob2Qgb2YgdGhlIFNjcmVlbi1jbGFzcyBhbmQgbm90IGF2YWlsYWJsZSBmb3IKKyAgICAgICAgVHVydGxlU2NyZWVuIGluc3RhbmNlcy4KKworICAgICAgICBFeGFtcGxlIChmb3IgYSBTY3JlZW4gaW5zdGFuY2UgbmFtZWQgc2NyZWVuKToKKyAgICAgICAgPj4+IHNjcmVlbi5leGl0b25jbGljaygpCisKKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBleGl0R3JhY2VmdWxseSh4LCB5KToKKyAgICAgICAgICAgICIiIlNjcmVlbi5ieWUoKSB3aXRoIHR3byBkdW1teS1wYXJhbWV0ZXJzIiIiCisgICAgICAgICAgICBzZWxmLmJ5ZSgpCisgICAgICAgIHNlbGYub25jbGljayhleGl0R3JhY2VmdWxseSkKKyAgICAgICAgaWYgX0NGR1sidXNpbmdfSURMRSJdOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1haW5sb29wKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZXhpdCgwKQorCisKK2NsYXNzIFR1cnRsZShSYXdUdXJ0bGUpOgorICAgICIiIlJhd1R1cnRsZSBhdXRvLWNyZWF0aW5nIChzY3JvbGxlZCkgY2FudmFzLgorCisgICAgV2hlbiBhIFR1cnRsZSBvYmplY3QgaXMgY3JlYXRlZCBvciBhIGZ1bmN0aW9uIGRlcml2ZWQgZnJvbSBzb21lCisgICAgVHVydGxlIG1ldGhvZCBpcyBjYWxsZWQgYSBUdXJ0bGVTY3JlZW4gb2JqZWN0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZC4KKyAgICAiIiIKKyAgICBfcGVuID0gTm9uZQorICAgIF9zY3JlZW4gPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgc2hhcGU9X0NGR1sic2hhcGUiXSwKKyAgICAgICAgICAgICAgICAgdW5kb2J1ZmZlcnNpemU9X0NGR1sidW5kb2J1ZmZlcnNpemUiXSwKKyAgICAgICAgICAgICAgICAgdmlzaWJsZT1fQ0ZHWyJ2aXNpYmxlIl0pOgorICAgICAgICBpZiBUdXJ0bGUuX3NjcmVlbiBpcyBOb25lOgorICAgICAgICAgICAgVHVydGxlLl9zY3JlZW4gPSBTY3JlZW4oKQorICAgICAgICBSYXdUdXJ0bGUuX19pbml0X18oc2VsZiwgVHVydGxlLl9zY3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFwZT1zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZG9idWZmZXJzaXplPXVuZG9idWZmZXJzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZT12aXNpYmxlKQorCitQZW4gPSBUdXJ0bGUKKworZGVmIF9nZXRwZW4oKToKKyAgICAiIiJDcmVhdGUgdGhlICdhbm9ueW1vdXMnIHR1cnRsZSBpZiBub3QgYWxyZWFkeSBwcmVzZW50LiIiIgorICAgIGlmIFR1cnRsZS5fcGVuIGlzIE5vbmU6CisgICAgICAgIFR1cnRsZS5fcGVuID0gVHVydGxlKCkKKyAgICByZXR1cm4gVHVydGxlLl9wZW4KKworZGVmIF9nZXRzY3JlZW4oKToKKyAgICAiIiJDcmVhdGUgYSBUdXJ0bGVTY3JlZW4gaWYgbm90IGFscmVhZHkgcHJlc2VudC4iIiIKKyAgICBpZiBUdXJ0bGUuX3NjcmVlbiBpcyBOb25lOgorICAgICAgICBUdXJ0bGUuX3NjcmVlbiA9IFNjcmVlbigpCisgICAgcmV0dXJuIFR1cnRsZS5fc2NyZWVuCisKK2RlZiB3cml0ZV9kb2NzdHJpbmdkaWN0KGZpbGVuYW1lPSJ0dXJ0bGVfZG9jc3RyaW5nZGljdCIpOgorICAgICIiIkNyZWF0ZSBhbmQgd3JpdGUgZG9jc3RyaW5nLWRpY3Rpb25hcnkgdG8gZmlsZS4KKworICAgIE9wdGlvbmFsIGFyZ3VtZW50OgorICAgIGZpbGVuYW1lIC0tIGEgc3RyaW5nLCB1c2VkIGFzIGZpbGVuYW1lCisgICAgICAgICAgICAgICAgZGVmYXVsdCB2YWx1ZSBpcyB0dXJ0bGVfZG9jc3RyaW5nZGljdAorCisgICAgSGFzIHRvIGJlIGNhbGxlZCBleHBsaWNpdGx5LCAobm90IHVzZWQgYnkgdGhlIHR1cnRsZS1ncmFwaGljcyBjbGFzc2VzKQorICAgIFRoZSBkb2NzdHJpbmcgZGljdGlvbmFyeSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIFB5dGhvbiBzY3JpcHQgPGZpbG5hbWU+LnB5CisgICAgSXQgaXMgaW50ZW5kZWQgdG8gc2VydmUgYXMgYSB0ZW1wbGF0ZSBmb3IgdHJhbnNsYXRpb24gb2YgdGhlIGRvY3N0cmluZ3MKKyAgICBpbnRvIGRpZmZlcmVudCBsYW5ndWFnZXMuCisgICAgIiIiCisgICAgZG9jc2RpY3QgPSB7fQorCisgICAgZm9yIG1ldGhvZG5hbWUgaW4gX3RnX3NjcmVlbl9mdW5jdGlvbnM6CisgICAgICAgIGtleSA9ICJfU2NyZWVuLiIrbWV0aG9kbmFtZQorICAgICAgICBkb2NzZGljdFtrZXldID0gZXZhbChrZXkpLl9fZG9jX18KKyAgICBmb3IgbWV0aG9kbmFtZSBpbiBfdGdfdHVydGxlX2Z1bmN0aW9uczoKKyAgICAgICAga2V5ID0gIlR1cnRsZS4iK21ldGhvZG5hbWUKKyAgICAgICAgZG9jc2RpY3Rba2V5XSA9IGV2YWwoa2V5KS5fX2RvY19fCisKKyAgICBmID0gb3BlbigiJXMucHkiICUgZmlsZW5hbWUsInciKQorICAgIGtleXMgPSBzb3J0ZWQoW3ggZm9yIHggaW4gZG9jc2RpY3Qua2V5cygpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnNwbGl0KCcuJylbMV0gbm90IGluIF9hbGlhc19saXN0XSkKKyAgICBmLndyaXRlKCdkb2NzZGljdCA9IHtcblxuJykKKyAgICBmb3Iga2V5IGluIGtleXNbOi0xXToKKyAgICAgICAgZi53cml0ZSgnJXMgOlxuJyAlIHJlcHIoa2V5KSkKKyAgICAgICAgZi53cml0ZSgnICAgICAgICAiIiIlc1xuIiIiLFxuXG4nICUgZG9jc2RpY3Rba2V5XSkKKyAgICBrZXkgPSBrZXlzWy0xXQorICAgIGYud3JpdGUoJyVzIDpcbicgJSByZXByKGtleSkpCisgICAgZi53cml0ZSgnICAgICAgICAiIiIlc1xuIiIiXG5cbicgJSBkb2NzZGljdFtrZXldKQorICAgIGYud3JpdGUoIn1cbiIpCisgICAgZi5jbG9zZSgpCisKK2RlZiByZWFkX2RvY3N0cmluZ3MobGFuZyk6CisgICAgIiIiUmVhZCBpbiBkb2NzdHJpbmdzIGZyb20gbGFuZy1zcGVjaWZpYyBkb2NzdHJpbmcgZGljdGlvbmFyeS4KKworICAgIFRyYW5zZmVyIGRvY3N0cmluZ3MsIHRyYW5zbGF0ZWQgdG8gbGFuZywgZnJvbSBhIGRpY3Rpb25hcnktZmlsZQorICAgIHRvIHRoZSBtZXRob2RzIG9mIGNsYXNzZXMgU2NyZWVuIGFuZCBUdXJ0bGUgYW5kIC0gaW4gcmV2aXNlZCBmb3JtIC0KKyAgICB0byB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbnMuCisgICAgIiIiCisgICAgbW9kbmFtZSA9ICJ0dXJ0bGVfZG9jc3RyaW5nZGljdF8lKGxhbmd1YWdlKXMiICUgeydsYW5ndWFnZSc6bGFuZy5sb3dlcigpfQorICAgIG1vZHVsZSA9IF9faW1wb3J0X18obW9kbmFtZSkKKyAgICBkb2NzZGljdCA9IG1vZHVsZS5kb2NzZGljdAorICAgIGZvciBrZXkgaW4gZG9jc2RpY3Q6CisgICAgICAgICNwcmludCBrZXkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXZhbChrZXkpLmltX2Z1bmMuX19kb2NfXyA9IGRvY3NkaWN0W2tleV0KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcHJpbnQgIkJhZCBkb2NzdHJpbmctZW50cnk6ICVzIiAlIGtleQorCitfTEFOR1VBR0UgPSBfQ0ZHWyJsYW5ndWFnZSJdCisKK3RyeToKKyAgICBpZiBfTEFOR1VBR0UgIT0gImVuZ2xpc2giOgorICAgICAgICByZWFkX2RvY3N0cmluZ3MoX0xBTkdVQUdFKQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHByaW50ICJDYW5ub3QgZmluZCBkb2NzZGljdCBmb3IiLCBfTEFOR1VBR0UKK2V4Y2VwdDoKKyAgICBwcmludCAoIlVua25vd24gRXJyb3Igd2hlbiB0cnlpbmcgdG8gaW1wb3J0ICVzLWRvY3N0cmluZy1kaWN0aW9uYXJ5IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTEFOR1VBR0UpCisKKworZGVmIGdldG1ldGhwYXJsaXN0KG9iKToKKyAgICAiR2V0IHN0cmluZ3MgZGVzY3JpYmluZyB0aGUgYXJndW1lbnRzIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IgorICAgIGFyZ1RleHQxID0gYXJnVGV4dDIgPSAiIgorICAgICMgYml0IG9mIGEgaGFjayBmb3IgbWV0aG9kcyAtIHR1cm4gaXQgaW50byBhIGZ1bmN0aW9uCisgICAgIyBidXQgd2UgZHJvcCB0aGUgInNlbGYiIHBhcmFtLgorICAgIGlmIHR5cGUob2IpPT10eXBlcy5NZXRob2RUeXBlOgorICAgICAgICBmb2IgPSBvYi5pbV9mdW5jCisgICAgICAgIGFyZ09mZnNldCA9IDEKKyAgICBlbHNlOgorICAgICAgICBmb2IgPSBvYgorICAgICAgICBhcmdPZmZzZXQgPSAwCisgICAgIyBUcnkgYW5kIGJ1aWxkIG9uZSBmb3IgUHl0aG9uIGRlZmluZWQgZnVuY3Rpb25zCisgICAgaWYgdHlwZShmb2IpIGluIFt0eXBlcy5GdW5jdGlvblR5cGUsIHR5cGVzLkxhbWJkYVR5cGVdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb3VudGVyID0gZm9iLmZ1bmNfY29kZS5jb19hcmdjb3VudAorICAgICAgICAgICAgaXRlbXMyID0gbGlzdChmb2IuZnVuY19jb2RlLmNvX3Zhcm5hbWVzW2FyZ09mZnNldDpjb3VudGVyXSkKKyAgICAgICAgICAgIHJlYWxBcmdzID0gZm9iLmZ1bmNfY29kZS5jb192YXJuYW1lc1thcmdPZmZzZXQ6Y291bnRlcl0KKyAgICAgICAgICAgIGRlZmF1bHRzID0gZm9iLmZ1bmNfZGVmYXVsdHMgb3IgW10KKyAgICAgICAgICAgIGRlZmF1bHRzID0gbGlzdChtYXAobGFtYmRhIG5hbWU6ICI9JXMiICUgcmVwcihuYW1lKSwgZGVmYXVsdHMpKQorICAgICAgICAgICAgZGVmYXVsdHMgPSBbIiJdICogKGxlbihyZWFsQXJncyktbGVuKGRlZmF1bHRzKSkgKyBkZWZhdWx0cworICAgICAgICAgICAgaXRlbXMxID0gbWFwKGxhbWJkYSBhcmcsIGRmbHQ6IGFyZytkZmx0LCByZWFsQXJncywgZGVmYXVsdHMpCisgICAgICAgICAgICBpZiBmb2IuZnVuY19jb2RlLmNvX2ZsYWdzICYgMHg0OgorICAgICAgICAgICAgICAgIGl0ZW1zMS5hcHBlbmQoIioiK2ZvYi5mdW5jX2NvZGUuY29fdmFybmFtZXNbY291bnRlcl0pCisgICAgICAgICAgICAgICAgaXRlbXMyLmFwcGVuZCgiKiIrZm9iLmZ1bmNfY29kZS5jb192YXJuYW1lc1tjb3VudGVyXSkKKyAgICAgICAgICAgICAgICBjb3VudGVyICs9IDEKKyAgICAgICAgICAgIGlmIGZvYi5mdW5jX2NvZGUuY29fZmxhZ3MgJiAweDg6CisgICAgICAgICAgICAgICAgaXRlbXMxLmFwcGVuZCgiKioiK2ZvYi5mdW5jX2NvZGUuY29fdmFybmFtZXNbY291bnRlcl0pCisgICAgICAgICAgICAgICAgaXRlbXMyLmFwcGVuZCgiKioiK2ZvYi5mdW5jX2NvZGUuY29fdmFybmFtZXNbY291bnRlcl0pCisgICAgICAgICAgICBhcmdUZXh0MSA9ICIsICIuam9pbihpdGVtczEpCisgICAgICAgICAgICBhcmdUZXh0MSA9ICIoJXMpIiAlIGFyZ1RleHQxCisgICAgICAgICAgICBhcmdUZXh0MiA9ICIsICIuam9pbihpdGVtczIpCisgICAgICAgICAgICBhcmdUZXh0MiA9ICIoJXMpIiAlIGFyZ1RleHQyCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gYXJnVGV4dDEsIGFyZ1RleHQyCisKK2RlZiBfdHVydGxlX2RvY3JldmlzZShkb2NzdHIpOgorICAgICIiIlRvIHJlZHVjZSBkb2NzdHJpbmdzIGZyb20gUmF3VHVydGxlIGNsYXNzIGZvciBmdW5jdGlvbnMKKyAgICAiIiIKKyAgICBpbXBvcnQgcmUKKyAgICBpZiBkb2NzdHIgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0dXJ0bGVuYW1lID0gX0NGR1siZXhhbXBsZXR1cnRsZSJdCisgICAgbmV3ZG9jc3RyID0gZG9jc3RyLnJlcGxhY2UoIiVzLiIgJSB0dXJ0bGVuYW1lLCIiKQorICAgIHBhcmV4cCA9IHJlLmNvbXBpbGUocicgXCguKyAlc1wpOicgJSB0dXJ0bGVuYW1lKQorICAgIG5ld2RvY3N0ciA9IHBhcmV4cC5zdWIoIjoiLCBuZXdkb2NzdHIpCisgICAgcmV0dXJuIG5ld2RvY3N0cgorCitkZWYgX3NjcmVlbl9kb2NyZXZpc2UoZG9jc3RyKToKKyAgICAiIiJUbyByZWR1Y2UgZG9jc3RyaW5ncyBmcm9tIFR1cnRsZVNjcmVlbiBjbGFzcyBmb3IgZnVuY3Rpb25zCisgICAgIiIiCisgICAgaW1wb3J0IHJlCisgICAgaWYgZG9jc3RyIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgc2NyZWVubmFtZSA9IF9DRkdbImV4YW1wbGVzY3JlZW4iXQorICAgIG5ld2RvY3N0ciA9IGRvY3N0ci5yZXBsYWNlKCIlcy4iICUgc2NyZWVubmFtZSwiIikKKyAgICBwYXJleHAgPSByZS5jb21waWxlKHInIFwoLisgJXNcKTonICUgc2NyZWVubmFtZSkKKyAgICBuZXdkb2NzdHIgPSBwYXJleHAuc3ViKCI6IiwgbmV3ZG9jc3RyKQorICAgIHJldHVybiBuZXdkb2NzdHIKKworIyMgVGhlIGZvbGxvd2luZyBtZWNoYW5pc20gbWFrZXMgYWxsIG1ldGhvZHMgb2YgUmF3VHVydGxlIGFuZCBUdXJ0bGUgYXZhaWxhYmxlCisjIyBhcyBmdW5jdGlvbnMuIFNvIHdlIGNhbiBlbmhhbmNlLCBjaGFuZ2UsIGFkZCwgZGVsZXRlIG1ldGhvZHMgdG8gdGhlc2UKKyMjIGNsYXNzZXMgYW5kIGRvIG5vdCBuZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBoZXJlLgorCisKK2ZvciBtZXRob2RuYW1lIGluIF90Z19zY3JlZW5fZnVuY3Rpb25zOgorICAgIHBsMSwgcGwyID0gZ2V0bWV0aHBhcmxpc3QoZXZhbCgnX1NjcmVlbi4nICsgbWV0aG9kbmFtZSkpCisgICAgaWYgcGwxID09ICIiOgorICAgICAgICBwcmludCAiPj4+Pj4+IiwgcGwxLCBwbDIKKyAgICAgICAgY29udGludWUKKyAgICBkZWZzdHIgPSAoImRlZiAlKGtleSlzJShwbDEpczogcmV0dXJuIF9nZXRzY3JlZW4oKS4lKGtleSlzJShwbDIpcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2tleSc6bWV0aG9kbmFtZSwgJ3BsMSc6cGwxLCAncGwyJzpwbDJ9KQorICAgIGV4ZWMgZGVmc3RyCisgICAgZXZhbChtZXRob2RuYW1lKS5fX2RvY19fID0gX3NjcmVlbl9kb2NyZXZpc2UoZXZhbCgnX1NjcmVlbi4nK21ldGhvZG5hbWUpLl9fZG9jX18pCisKK2ZvciBtZXRob2RuYW1lIGluIF90Z190dXJ0bGVfZnVuY3Rpb25zOgorICAgIHBsMSwgcGwyID0gZ2V0bWV0aHBhcmxpc3QoZXZhbCgnVHVydGxlLicgKyBtZXRob2RuYW1lKSkKKyAgICBpZiBwbDEgPT0gIiI6CisgICAgICAgIHByaW50ICI+Pj4+Pj4iLCBwbDEsIHBsMgorICAgICAgICBjb250aW51ZQorICAgIGRlZnN0ciA9ICgiZGVmICUoa2V5KXMlKHBsMSlzOiByZXR1cm4gX2dldHBlbigpLiUoa2V5KXMlKHBsMilzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsna2V5JzptZXRob2RuYW1lLCAncGwxJzpwbDEsICdwbDInOnBsMn0pCisgICAgZXhlYyBkZWZzdHIKKyAgICBldmFsKG1ldGhvZG5hbWUpLl9fZG9jX18gPSBfdHVydGxlX2RvY3JldmlzZShldmFsKCdUdXJ0bGUuJyttZXRob2RuYW1lKS5fX2RvY19fKQorCisKK2RvbmUgPSBtYWlubG9vcCA9IFRLLm1haW5sb29wCitkZWwgcGwxLCBwbDIsIGRlZnN0cgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGRlZiBzd2l0Y2hwZW4oKToKKyAgICAgICAgaWYgaXNkb3duKCk6CisgICAgICAgICAgICBwdSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwZCgpCisKKyAgICBkZWYgZGVtbzEoKToKKyAgICAgICAgIiIiRGVtbyBvZiBvbGQgdHVydGxlLnB5IC0gbW9kdWxlIiIiCisgICAgICAgIHJlc2V0KCkKKyAgICAgICAgdHJhY2VyKFRydWUpCisgICAgICAgIHVwKCkKKyAgICAgICAgYmFja3dhcmQoMTAwKQorICAgICAgICBkb3duKCkKKyAgICAgICAgIyBkcmF3IDMgc3F1YXJlczsgdGhlIGxhc3QgZmlsbGVkCisgICAgICAgIHdpZHRoKDMpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgaWYgaSA9PSAyOgorICAgICAgICAgICAgICAgIGZpbGwoMSkKKyAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgICAgIGZvcndhcmQoMjApCisgICAgICAgICAgICAgICAgbGVmdCg5MCkKKyAgICAgICAgICAgIGlmIGkgPT0gMjoKKyAgICAgICAgICAgICAgICBjb2xvcigibWFyb29uIikKKyAgICAgICAgICAgICAgICBmaWxsKDApCisgICAgICAgICAgICB1cCgpCisgICAgICAgICAgICBmb3J3YXJkKDMwKQorICAgICAgICAgICAgZG93bigpCisgICAgICAgIHdpZHRoKDEpCisgICAgICAgIGNvbG9yKCJibGFjayIpCisgICAgICAgICMgbW92ZSBvdXQgb2YgdGhlIHdheQorICAgICAgICB0cmFjZXIoRmFsc2UpCisgICAgICAgIHVwKCkKKyAgICAgICAgcmlnaHQoOTApCisgICAgICAgIGZvcndhcmQoMTAwKQorICAgICAgICByaWdodCg5MCkKKyAgICAgICAgZm9yd2FyZCgxMDApCisgICAgICAgIHJpZ2h0KDE4MCkKKyAgICAgICAgZG93bigpCisgICAgICAgICMgc29tZSB0ZXh0CisgICAgICAgIHdyaXRlKCJzdGFydHN0YXJ0IiwgMSkKKyAgICAgICAgd3JpdGUoInN0YXJ0IiwgMSkKKyAgICAgICAgY29sb3IoInJlZCIpCisgICAgICAgICMgc3RhaXJjYXNlCisgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgZm9yd2FyZCgyMCkKKyAgICAgICAgICAgIGxlZnQoOTApCisgICAgICAgICAgICBmb3J3YXJkKDIwKQorICAgICAgICAgICAgcmlnaHQoOTApCisgICAgICAgICMgZmlsbGVkIHN0YWlyY2FzZQorICAgICAgICB0cmFjZXIoVHJ1ZSkKKyAgICAgICAgZmlsbCgxKQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgIGZvcndhcmQoMjApCisgICAgICAgICAgICBsZWZ0KDkwKQorICAgICAgICAgICAgZm9yd2FyZCgyMCkKKyAgICAgICAgICAgIHJpZ2h0KDkwKQorICAgICAgICBmaWxsKDApCisgICAgICAgICMgbW9yZSB0ZXh0CisKKyAgICBkZWYgZGVtbzIoKToKKyAgICAgICAgIiIiRGVtbyBvZiBzb21lIG5ldyBmZWF0dXJlcy4iIiIKKyAgICAgICAgc3BlZWQoMSkKKyAgICAgICAgc3QoKQorICAgICAgICBwZW5zaXplKDMpCisgICAgICAgIHNldGhlYWRpbmcodG93YXJkcygwLCAwKSkKKyAgICAgICAgcmFkaXVzID0gZGlzdGFuY2UoMCwgMCkvMi4wCisgICAgICAgIHJ0KDkwKQorICAgICAgICBmb3IgXyBpbiByYW5nZSgxOCk6CisgICAgICAgICAgICBzd2l0Y2hwZW4oKQorICAgICAgICAgICAgY2lyY2xlKHJhZGl1cywgMTApCisgICAgICAgIHdyaXRlKCJ3YWl0IGEgbW9tZW50Li4uIikKKyAgICAgICAgd2hpbGUgdW5kb2J1ZmZlcmVudHJpZXMoKToKKyAgICAgICAgICAgIHVuZG8oKQorICAgICAgICByZXNldCgpCisgICAgICAgIGx0KDkwKQorICAgICAgICBjb2xvcm1vZGUoMjU1KQorICAgICAgICBsYWVuZ2UgPSAxMAorICAgICAgICBwZW5jb2xvcigiZ3JlZW4iKQorICAgICAgICBwZW5zaXplKDMpCisgICAgICAgIGx0KDE4MCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTIsIDE2KToKKyAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgIGJlZ2luX2ZpbGwoKQorICAgICAgICAgICAgICAgIGZpbGxjb2xvcigyNTUtMTUqaSwgMCwgMTUqaSkKKyAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgICAgIGZkKGxhZW5nZSkKKyAgICAgICAgICAgICAgICBsdCgxMjApCisgICAgICAgICAgICBsYWVuZ2UgKz0gMTAKKyAgICAgICAgICAgIGx0KDE1KQorICAgICAgICAgICAgc3BlZWQoKHNwZWVkKCkrMSklMTIpCisgICAgICAgIGVuZF9maWxsKCkKKworICAgICAgICBsdCgxMjApCisgICAgICAgIHB1KCkKKyAgICAgICAgZmQoNzApCisgICAgICAgIHJ0KDMwKQorICAgICAgICBwZCgpCisgICAgICAgIGNvbG9yKCJyZWQiLCJ5ZWxsb3ciKQorICAgICAgICBzcGVlZCgwKQorICAgICAgICBmaWxsKDEpCisgICAgICAgIGZvciBfIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgY2lyY2xlKDUwLCA5MCkKKyAgICAgICAgICAgIHJ0KDkwKQorICAgICAgICAgICAgZmQoMzApCisgICAgICAgICAgICBydCg5MCkKKyAgICAgICAgZmlsbCgwKQorICAgICAgICBsdCg5MCkKKyAgICAgICAgcHUoKQorICAgICAgICBmZCgzMCkKKyAgICAgICAgcGQoKQorICAgICAgICBzaGFwZSgidHVydGxlIikKKworICAgICAgICB0cmkgPSBnZXR0dXJ0bGUoKQorICAgICAgICB0cmkucmVzaXplbW9kZSgiYXV0byIpCisgICAgICAgIHR1cnRsZSA9IFR1cnRsZSgpCisgICAgICAgIHR1cnRsZS5yZXNpemVtb2RlKCJhdXRvIikKKyAgICAgICAgdHVydGxlLnNoYXBlKCJ0dXJ0bGUiKQorICAgICAgICB0dXJ0bGUucmVzZXQoKQorICAgICAgICB0dXJ0bGUubGVmdCg5MCkKKyAgICAgICAgdHVydGxlLnNwZWVkKDApCisgICAgICAgIHR1cnRsZS51cCgpCisgICAgICAgIHR1cnRsZS5nb3RvKDI4MCwgNDApCisgICAgICAgIHR1cnRsZS5sdCgzMCkKKyAgICAgICAgdHVydGxlLmRvd24oKQorICAgICAgICB0dXJ0bGUuc3BlZWQoNikKKyAgICAgICAgdHVydGxlLmNvbG9yKCJibHVlIiwib3JhbmdlIikKKyAgICAgICAgdHVydGxlLnBlbnNpemUoMikKKyAgICAgICAgdHJpLnNwZWVkKDYpCisgICAgICAgIHNldGhlYWRpbmcodG93YXJkcyh0dXJ0bGUpKQorICAgICAgICBjb3VudCA9IDEKKyAgICAgICAgd2hpbGUgdHJpLmRpc3RhbmNlKHR1cnRsZSkgPiA0OgorICAgICAgICAgICAgdHVydGxlLmZkKDMuNSkKKyAgICAgICAgICAgIHR1cnRsZS5sdCgwLjYpCisgICAgICAgICAgICB0cmkuc2V0aGVhZGluZyh0cmkudG93YXJkcyh0dXJ0bGUpKQorICAgICAgICAgICAgdHJpLmZkKDQpCisgICAgICAgICAgICBpZiBjb3VudCAlIDIwID09IDA6CisgICAgICAgICAgICAgICAgdHVydGxlLnN0YW1wKCkKKyAgICAgICAgICAgICAgICB0cmkuc3RhbXAoKQorICAgICAgICAgICAgICAgIHN3aXRjaHBlbigpCisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgIHRyaS53cml0ZSgiQ0FVR0hUISAiLCBmb250PSgiQXJpYWwiLCAxNiwgImJvbGQiKSwgYWxpZ249InJpZ2h0IikKKyAgICAgICAgdHJpLnBlbmNvbG9yKCJibGFjayIpCisgICAgICAgIHRyaS5wZW5jb2xvcigicmVkIikKKworICAgICAgICBkZWYgYmFiYSh4ZHVtbXksIHlkdW1teSk6CisgICAgICAgICAgICBjbGVhcnNjcmVlbigpCisgICAgICAgICAgICBieWUoKQorCisgICAgICAgIHRpbWUuc2xlZXAoMikKKworICAgICAgICB3aGlsZSB1bmRvYnVmZmVyZW50cmllcygpOgorICAgICAgICAgICAgdHJpLnVuZG8oKQorICAgICAgICAgICAgdHVydGxlLnVuZG8oKQorICAgICAgICB0cmkuZmQoNTApCisgICAgICAgIHRyaS53cml0ZSgiICBDbGljayBtZSEiLCBmb250ID0gKCJDb3VyaWVyIiwgMTIsICJib2xkIikgKQorICAgICAgICB0cmkub25jbGljayhiYWJhLCAxKQorCisgICAgZGVtbzEoKQorICAgIGRlbW8yKCkKKyAgICBleGl0b25jbGljaygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90dXJ0bGUucHljIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzA1YWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYi10ay90dXJ0bGUucHlvIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzA1YWY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWItdGsvdHVydGxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvR3JhbW1hci50eHQgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvR3JhbW1hci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxZjI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9HcmFtbWFyLnR4dApAQCAtMCwwICsxLDE1OCBAQAorIyBHcmFtbWFyIGZvciAydG8zLiBUaGlzIGdyYW1tYXIgc3VwcG9ydHMgUHl0aG9uIDIueCBhbmQgMy54LgorCisjIE5vdGU6ICBDaGFuZ2luZyB0aGUgZ3JhbW1hciBzcGVjaWZpZWQgaW4gdGhpcyBmaWxlIHdpbGwgbW9zdCBsaWtlbHkKKyMgICAgICAgIHJlcXVpcmUgY29ycmVzcG9uZGluZyBjaGFuZ2VzIGluIHRoZSBwYXJzZXIgbW9kdWxlCisjICAgICAgICAoLi4vTW9kdWxlcy9wYXJzZXJtb2R1bGUuYykuICBJZiB5b3UgY2FuJ3QgbWFrZSB0aGUgY2hhbmdlcyB0bworIyAgICAgICAgdGhhdCBtb2R1bGUgeW91cnNlbGYsIHBsZWFzZSBjby1vcmRpbmF0ZSB0aGUgcmVxdWlyZWQgY2hhbmdlcworIyAgICAgICAgd2l0aCBzb21lb25lIHdobyBjYW47IGFzayBhcm91bmQgb24gcHl0aG9uLWRldiBmb3IgaGVscC4gIEZyZWQKKyMgICAgICAgIERyYWtlIDxmZHJha2VAYWNtLm9yZz4gd2lsbCBwcm9iYWJseSBiZSBsaXN0ZW5pbmcgdGhlcmUuCisKKyMgTk9URSBXRUxMOiBZb3Ugc2hvdWxkIGFsc28gZm9sbG93IGFsbCB0aGUgc3RlcHMgbGlzdGVkIGluIFBFUCAzMDYsCisjICJIb3cgdG8gQ2hhbmdlIFB5dGhvbidzIEdyYW1tYXIiCisKKyMgQ29tbWFuZHMgZm9yIEtlZXMgQmxvbSdzIHJhaWxyb2FkIHByb2dyYW0KKyNkaWFncmFtOnRva2VuIE5BTUUKKyNkaWFncmFtOnRva2VuIE5VTUJFUgorI2RpYWdyYW06dG9rZW4gU1RSSU5HCisjZGlhZ3JhbTp0b2tlbiBORVdMSU5FCisjZGlhZ3JhbTp0b2tlbiBFTkRNQVJLRVIKKyNkaWFncmFtOnRva2VuIElOREVOVAorI2RpYWdyYW06b3V0cHV0XGlucHV0IHB5dGhvbi5ibGEKKyNkaWFncmFtOnRva2VuIERFREVOVAorI2RpYWdyYW06b3V0cHV0XHRleHR3aWR0aCAyMC4wNGNtXG9kZHNpZGVtYXJnaW4gIDAuMGNtXGV2ZW5zaWRlbWFyZ2luIDAuMGNtCisjZGlhZ3JhbTpydWxlcworCisjIFN0YXJ0IHN5bWJvbHMgZm9yIHRoZSBncmFtbWFyOgorIwlmaWxlX2lucHV0IGlzIGEgbW9kdWxlIG9yIHNlcXVlbmNlIG9mIGNvbW1hbmRzIHJlYWQgZnJvbSBhbiBpbnB1dCBmaWxlOworIwlzaW5nbGVfaW5wdXQgaXMgYSBzaW5nbGUgaW50ZXJhY3RpdmUgc3RhdGVtZW50OworIwlldmFsX2lucHV0IGlzIHRoZSBpbnB1dCBmb3IgdGhlIGV2YWwoKSBhbmQgaW5wdXQoKSBmdW5jdGlvbnMuCisjIE5COiBjb21wb3VuZF9zdG10IGluIHNpbmdsZV9pbnB1dCBpcyBmb2xsb3dlZCBieSBleHRyYSBORVdMSU5FIQorZmlsZV9pbnB1dDogKE5FV0xJTkUgfCBzdG10KSogRU5ETUFSS0VSCitzaW5nbGVfaW5wdXQ6IE5FV0xJTkUgfCBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQgTkVXTElORQorZXZhbF9pbnB1dDogdGVzdGxpc3QgTkVXTElORSogRU5ETUFSS0VSCisKK2RlY29yYXRvcjogJ0AnIGRvdHRlZF9uYW1lIFsgJygnIFthcmdsaXN0XSAnKScgXSBORVdMSU5FCitkZWNvcmF0b3JzOiBkZWNvcmF0b3IrCitkZWNvcmF0ZWQ6IGRlY29yYXRvcnMgKGNsYXNzZGVmIHwgZnVuY2RlZikKK2Z1bmNkZWY6ICdkZWYnIE5BTUUgcGFyYW1ldGVycyBbJy0+JyB0ZXN0XSAnOicgc3VpdGUKK3BhcmFtZXRlcnM6ICcoJyBbdHlwZWRhcmdzbGlzdF0gJyknCit0eXBlZGFyZ3NsaXN0OiAoKHRmcGRlZiBbJz0nIHRlc3RdICcsJykqCisgICAgICAgICAgICAgICAgKCcqJyBbdG5hbWVdICgnLCcgdG5hbWUgWyc9JyB0ZXN0XSkqIFsnLCcgJyoqJyB0bmFtZV0gfCAnKionIHRuYW1lKQorICAgICAgICAgICAgICAgIHwgdGZwZGVmIFsnPScgdGVzdF0gKCcsJyB0ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQordG5hbWU6IE5BTUUgWyc6JyB0ZXN0XQordGZwZGVmOiB0bmFtZSB8ICcoJyB0ZnBsaXN0ICcpJwordGZwbGlzdDogdGZwZGVmICgnLCcgdGZwZGVmKSogWycsJ10KK3ZhcmFyZ3NsaXN0OiAoKHZmcGRlZiBbJz0nIHRlc3RdICcsJykqCisgICAgICAgICAgICAgICgnKicgW3ZuYW1lXSAoJywnIHZuYW1lIFsnPScgdGVzdF0pKiAgWycsJyAnKionIHZuYW1lXSB8ICcqKicgdm5hbWUpCisgICAgICAgICAgICAgIHwgdmZwZGVmIFsnPScgdGVzdF0gKCcsJyB2ZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddKQordm5hbWU6IE5BTUUKK3ZmcGRlZjogdm5hbWUgfCAnKCcgdmZwbGlzdCAnKScKK3ZmcGxpc3Q6IHZmcGRlZiAoJywnIHZmcGRlZikqIFsnLCddCisKK3N0bXQ6IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdAorc2ltcGxlX3N0bXQ6IHNtYWxsX3N0bXQgKCc7JyBzbWFsbF9zdG10KSogWyc7J10gTkVXTElORQorc21hbGxfc3RtdDogKGV4cHJfc3RtdCB8IHByaW50X3N0bXQgIHwgZGVsX3N0bXQgfCBwYXNzX3N0bXQgfCBmbG93X3N0bXQgfAorICAgICAgICAgICAgIGltcG9ydF9zdG10IHwgZ2xvYmFsX3N0bXQgfCBleGVjX3N0bXQgfCBhc3NlcnRfc3RtdCkKK2V4cHJfc3RtdDogdGVzdGxpc3Rfc3Rhcl9leHByIChhdWdhc3NpZ24gKHlpZWxkX2V4cHJ8dGVzdGxpc3QpIHwKKyAgICAgICAgICAgICAgICAgICAgICgnPScgKHlpZWxkX2V4cHJ8dGVzdGxpc3Rfc3Rhcl9leHByKSkqKQordGVzdGxpc3Rfc3Rhcl9leHByOiAodGVzdHxzdGFyX2V4cHIpICgnLCcgKHRlc3R8c3Rhcl9leHByKSkqIFsnLCddCithdWdhc3NpZ246ICgnKz0nIHwgJy09JyB8ICcqPScgfCAnLz0nIHwgJyU9JyB8ICcmPScgfCAnfD0nIHwgJ149JyB8CisgICAgICAgICAgICAnPDw9JyB8ICc+Pj0nIHwgJyoqPScgfCAnLy89JykKKyMgRm9yIG5vcm1hbCBhc3NpZ25tZW50cywgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgZW5mb3JjZWQgYnkgdGhlIGludGVycHJldGVyCitwcmludF9zdG10OiAncHJpbnQnICggWyB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddIF0gfAorICAgICAgICAgICAgICAgICAgICAgICc+PicgdGVzdCBbICgnLCcgdGVzdCkrIFsnLCddIF0gKQorZGVsX3N0bXQ6ICdkZWwnIGV4cHJsaXN0CitwYXNzX3N0bXQ6ICdwYXNzJworZmxvd19zdG10OiBicmVha19zdG10IHwgY29udGludWVfc3RtdCB8IHJldHVybl9zdG10IHwgcmFpc2Vfc3RtdCB8IHlpZWxkX3N0bXQKK2JyZWFrX3N0bXQ6ICdicmVhaycKK2NvbnRpbnVlX3N0bXQ6ICdjb250aW51ZScKK3JldHVybl9zdG10OiAncmV0dXJuJyBbdGVzdGxpc3RdCit5aWVsZF9zdG10OiB5aWVsZF9leHByCityYWlzZV9zdG10OiAncmFpc2UnIFt0ZXN0IFsnZnJvbScgdGVzdCB8ICcsJyB0ZXN0IFsnLCcgdGVzdF1dXQoraW1wb3J0X3N0bXQ6IGltcG9ydF9uYW1lIHwgaW1wb3J0X2Zyb20KK2ltcG9ydF9uYW1lOiAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMKK2ltcG9ydF9mcm9tOiAoJ2Zyb20nICgnLicqIGRvdHRlZF9uYW1lIHwgJy4nKykKKyAgICAgICAgICAgICAgJ2ltcG9ydCcgKCcqJyB8ICcoJyBpbXBvcnRfYXNfbmFtZXMgJyknIHwgaW1wb3J0X2FzX25hbWVzKSkKK2ltcG9ydF9hc19uYW1lOiBOQU1FIFsnYXMnIE5BTUVdCitkb3R0ZWRfYXNfbmFtZTogZG90dGVkX25hbWUgWydhcycgTkFNRV0KK2ltcG9ydF9hc19uYW1lczogaW1wb3J0X2FzX25hbWUgKCcsJyBpbXBvcnRfYXNfbmFtZSkqIFsnLCddCitkb3R0ZWRfYXNfbmFtZXM6IGRvdHRlZF9hc19uYW1lICgnLCcgZG90dGVkX2FzX25hbWUpKgorZG90dGVkX25hbWU6IE5BTUUgKCcuJyBOQU1FKSoKK2dsb2JhbF9zdG10OiAoJ2dsb2JhbCcgfCAnbm9ubG9jYWwnKSBOQU1FICgnLCcgTkFNRSkqCitleGVjX3N0bXQ6ICdleGVjJyBleHByIFsnaW4nIHRlc3QgWycsJyB0ZXN0XV0KK2Fzc2VydF9zdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KKworY29tcG91bmRfc3RtdDogaWZfc3RtdCB8IHdoaWxlX3N0bXQgfCBmb3Jfc3RtdCB8IHRyeV9zdG10IHwgd2l0aF9zdG10IHwgZnVuY2RlZiB8IGNsYXNzZGVmIHwgZGVjb3JhdGVkCitpZl9zdG10OiAnaWYnIHRlc3QgJzonIHN1aXRlICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKiBbJ2Vsc2UnICc6JyBzdWl0ZV0KK3doaWxlX3N0bXQ6ICd3aGlsZScgdGVzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCitmb3Jfc3RtdDogJ2ZvcicgZXhwcmxpc3QgJ2luJyB0ZXN0bGlzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCit0cnlfc3RtdDogKCd0cnknICc6JyBzdWl0ZQorICAgICAgICAgICAoKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsKKwkgICAgWydlbHNlJyAnOicgc3VpdGVdCisJICAgIFsnZmluYWxseScgJzonIHN1aXRlXSB8CisJICAgJ2ZpbmFsbHknICc6JyBzdWl0ZSkpCit3aXRoX3N0bXQ6ICd3aXRoJyB3aXRoX2l0ZW0gKCcsJyB3aXRoX2l0ZW0pKiAgJzonIHN1aXRlCit3aXRoX2l0ZW06IHRlc3QgWydhcycgZXhwcl0KK3dpdGhfdmFyOiAnYXMnIGV4cHIKKyMgTkIgY29tcGlsZS5jIG1ha2VzIHN1cmUgdGhhdCB0aGUgZGVmYXVsdCBleGNlcHQgY2xhdXNlIGlzIGxhc3QKK2V4Y2VwdF9jbGF1c2U6ICdleGNlcHQnIFt0ZXN0IFsoJywnIHwgJ2FzJykgdGVzdF1dCitzdWl0ZTogc2ltcGxlX3N0bXQgfCBORVdMSU5FIElOREVOVCBzdG10KyBERURFTlQKKworIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGNydWZ0IHRvIHN1cHBvcnQ6CisjIFsgeCBmb3IgeCBpbiBsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UgaWYgeCgpIF0KKyMgZXZlbiB3aGlsZSBhbHNvIGFsbG93aW5nOgorIyBsYW1iZGEgeDogNSBpZiB4IGVsc2UgMgorIyAoQnV0IG5vdCBhIG1peCBvZiB0aGUgdHdvKQordGVzdGxpc3Rfc2FmZTogb2xkX3Rlc3QgWygnLCcgb2xkX3Rlc3QpKyBbJywnXV0KK29sZF90ZXN0OiBvcl90ZXN0IHwgb2xkX2xhbWJkZWYKK29sZF9sYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyBvbGRfdGVzdAorCit0ZXN0OiBvcl90ZXN0IFsnaWYnIG9yX3Rlc3QgJ2Vsc2UnIHRlc3RdIHwgbGFtYmRlZgorb3JfdGVzdDogYW5kX3Rlc3QgKCdvcicgYW5kX3Rlc3QpKgorYW5kX3Rlc3Q6IG5vdF90ZXN0ICgnYW5kJyBub3RfdGVzdCkqCitub3RfdGVzdDogJ25vdCcgbm90X3Rlc3QgfCBjb21wYXJpc29uCitjb21wYXJpc29uOiBleHByIChjb21wX29wIGV4cHIpKgorY29tcF9vcDogJzwnfCc+J3wnPT0nfCc+PSd8Jzw9J3wnPD4nfCchPSd8J2luJ3wnbm90JyAnaW4nfCdpcyd8J2lzJyAnbm90Jworc3Rhcl9leHByOiAnKicgZXhwcgorZXhwcjogeG9yX2V4cHIgKCd8JyB4b3JfZXhwcikqCit4b3JfZXhwcjogYW5kX2V4cHIgKCdeJyBhbmRfZXhwcikqCithbmRfZXhwcjogc2hpZnRfZXhwciAoJyYnIHNoaWZ0X2V4cHIpKgorc2hpZnRfZXhwcjogYXJpdGhfZXhwciAoKCc8PCd8Jz4+JykgYXJpdGhfZXhwcikqCithcml0aF9leHByOiB0ZXJtICgoJysnfCctJykgdGVybSkqCit0ZXJtOiBmYWN0b3IgKCgnKid8Jy8nfCclJ3wnLy8nKSBmYWN0b3IpKgorZmFjdG9yOiAoJysnfCctJ3wnficpIGZhY3RvciB8IHBvd2VyCitwb3dlcjogYXRvbSB0cmFpbGVyKiBbJyoqJyBmYWN0b3JdCithdG9tOiAoJygnIFt5aWVsZF9leHByfHRlc3RsaXN0X2dleHBdICcpJyB8CisgICAgICAgJ1snIFtsaXN0bWFrZXJdICddJyB8CisgICAgICAgJ3snIFtkaWN0c2V0bWFrZXJdICd9JyB8CisgICAgICAgJ2AnIHRlc3RsaXN0MSAnYCcgfAorICAgICAgIE5BTUUgfCBOVU1CRVIgfCBTVFJJTkcrIHwgJy4nICcuJyAnLicpCitsaXN0bWFrZXI6ICh0ZXN0fHN0YXJfZXhwcikgKCBjb21wX2ZvciB8ICgnLCcgKHRlc3R8c3Rhcl9leHByKSkqIFsnLCddICkKK3Rlc3RsaXN0X2dleHA6ICh0ZXN0fHN0YXJfZXhwcikgKCBjb21wX2ZvciB8ICgnLCcgKHRlc3R8c3Rhcl9leHByKSkqIFsnLCddICkKK2xhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKK3RyYWlsZXI6ICcoJyBbYXJnbGlzdF0gJyknIHwgJ1snIHN1YnNjcmlwdGxpc3QgJ10nIHwgJy4nIE5BTUUKK3N1YnNjcmlwdGxpc3Q6IHN1YnNjcmlwdCAoJywnIHN1YnNjcmlwdCkqIFsnLCddCitzdWJzY3JpcHQ6IHRlc3QgfCBbdGVzdF0gJzonIFt0ZXN0XSBbc2xpY2VvcF0KK3NsaWNlb3A6ICc6JyBbdGVzdF0KK2V4cHJsaXN0OiAoZXhwcnxzdGFyX2V4cHIpICgnLCcgKGV4cHJ8c3Rhcl9leHByKSkqIFsnLCddCit0ZXN0bGlzdDogdGVzdCAoJywnIHRlc3QpKiBbJywnXQorZGljdHNldG1ha2VyOiAoICh0ZXN0ICc6JyB0ZXN0IChjb21wX2ZvciB8ICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSkgfAorICAgICAgICAgICAgICAgICh0ZXN0IChjb21wX2ZvciB8ICgnLCcgdGVzdCkqIFsnLCddKSkgKQorCitjbGFzc2RlZjogJ2NsYXNzJyBOQU1FIFsnKCcgW2FyZ2xpc3RdICcpJ10gJzonIHN1aXRlCisKK2FyZ2xpc3Q6IChhcmd1bWVudCAnLCcpKiAoYXJndW1lbnQgWycsJ10KKyAgICAgICAgICAgICAgICAgICAgICAgICB8JyonIHRlc3QgKCcsJyBhcmd1bWVudCkqIFsnLCcgJyoqJyB0ZXN0XSAKKyAgICAgICAgICAgICAgICAgICAgICAgICB8JyoqJyB0ZXN0KQorYXJndW1lbnQ6IHRlc3QgW2NvbXBfZm9yXSB8IHRlc3QgJz0nIHRlc3QgICMgUmVhbGx5IFtrZXl3b3JkICc9J10gdGVzdAorCitjb21wX2l0ZXI6IGNvbXBfZm9yIHwgY29tcF9pZgorY29tcF9mb3I6ICdmb3InIGV4cHJsaXN0ICdpbicgdGVzdGxpc3Rfc2FmZSBbY29tcF9pdGVyXQorY29tcF9pZjogJ2lmJyBvbGRfdGVzdCBbY29tcF9pdGVyXQorCit0ZXN0bGlzdDE6IHRlc3QgKCcsJyB0ZXN0KSoKKworIyBub3QgdXNlZCBpbiBncmFtbWFyLCBidXQgbWF5IGFwcGVhciBpbiAibm9kZSIgcGFzc2VkIGZyb20gUGFyc2VyIHRvIENvbXBpbGVyCitlbmNvZGluZ19kZWNsOiBOQU1FCisKK3lpZWxkX2V4cHI6ICd5aWVsZCcgW3Rlc3RsaXN0XQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL0dyYW1tYXIyLjcuNS5maW5hbC4wLnBpY2tsZSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9HcmFtbWFyMi43LjUuZmluYWwuMC5waWNrbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU4MDNkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9HcmFtbWFyMi43LjUuZmluYWwuMC5waWNrbGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL1BhdHRlcm5HcmFtbWFyLnR4dCBiL2xpYi9weXRob24yLjcvbGliMnRvMy9QYXR0ZXJuR3JhbW1hci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZiZjgxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9QYXR0ZXJuR3JhbW1hci50eHQKQEAgLTAsMCArMSwyOCBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisjIEEgZ3JhbW1hciB0byBkZXNjcmliZSB0cmVlIG1hdGNoaW5nIHBhdHRlcm5zLgorIyBOb3Qgc2hvd24gaGVyZToKKyMgLSAnVE9LRU4nIHN0YW5kcyBmb3IgYW55IHRva2VuIChsZWFmIG5vZGUpCisjIC0gJ2FueScgc3RhbmRzIGZvciBhbnkgbm9kZSAobGVhZiBvciBpbnRlcmlvcikKKyMgV2l0aCAnYW55JyB3ZSBjYW4gc3RpbGwgc3BlY2lmeSB0aGUgc3ViLXN0cnVjdHVyZS4KKworIyBUaGUgc3RhcnQgc3ltYm9sIGlzICdNYXRjaGVyJy4KKworTWF0Y2hlcjogQWx0ZXJuYXRpdmVzIEVORE1BUktFUgorCitBbHRlcm5hdGl2ZXM6IEFsdGVybmF0aXZlICgnfCcgQWx0ZXJuYXRpdmUpKgorCitBbHRlcm5hdGl2ZTogKFVuaXQgfCBOZWdhdGVkVW5pdCkrCisKK1VuaXQ6IFtOQU1FICc9J10gKCBTVFJJTkcgW1JlcGVhdGVyXQorICAgICAgICAgICAgICAgICB8IE5BTUUgW0RldGFpbHNdIFtSZXBlYXRlcl0KKyAgICAgICAgICAgICAgICAgfCAnKCcgQWx0ZXJuYXRpdmVzICcpJyBbUmVwZWF0ZXJdCisgICAgICAgICAgICAgICAgIHwgJ1snIEFsdGVybmF0aXZlcyAnXScKKwkJICkKKworTmVnYXRlZFVuaXQ6ICdub3QnIChTVFJJTkcgfCBOQU1FIFtEZXRhaWxzXSB8ICcoJyBBbHRlcm5hdGl2ZXMgJyknKQorCitSZXBlYXRlcjogJyonIHwgJysnIHwgJ3snIE5VTUJFUiBbJywnIE5VTUJFUl0gJ30nCisKK0RldGFpbHM6ICc8JyBBbHRlcm5hdGl2ZXMgJz4nCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvUGF0dGVybkdyYW1tYXIyLjcuNS5maW5hbC4wLnBpY2tsZSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9QYXR0ZXJuR3JhbW1hcjIuNy41LmZpbmFsLjAucGlja2xlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2U3MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvUGF0dGVybkdyYW1tYXIyLjcuNS5maW5hbC4wLnBpY2tsZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEzMDU2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisjZW1wdHkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWY4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNWY4MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9fX21haW5fXy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9fX21haW5fXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDY4OGJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19fbWFpbl9fLnB5CkBAIC0wLDAgKzEsNCBAQAoraW1wb3J0IHN5cworZnJvbSAubWFpbiBpbXBvcnQgbWFpbgorCitzeXMuZXhpdChtYWluKCJsaWIydG8zLmZpeGVzIikpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19tYWluX18ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19fbWFpbl9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY4OThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19fbWFpbl9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvX19tYWluX18ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19fbWFpbl9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjY4OThhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL19fbWFpbl9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX21hdGNoZXIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX21hdGNoZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2YmEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fbWF0Y2hlci5weQpAQCAtMCwwICsxLDE2OCBAQAorIiIiQSBib3R0b20tdXAgdHJlZSBtYXRjaGluZyBhbGdvcml0aG0gaW1wbGVtZW50YXRpb24gbWVhbnQgdG8gc3BlZWQKK3VwIDJ0bzMncyBtYXRjaGluZyBwcm9jZXNzLiBBZnRlciB0aGUgdHJlZSBwYXR0ZXJucyBhcmUgcmVkdWNlZCB0bwordGhlaXIgcmFyZXN0IGxpbmVhciBwYXRoLCBhIGxpbmVhciBBaG8tQ29yYXNpY2sgYXV0b21hdG9uIGlzCitjcmVhdGVkLiBUaGUgbGluZWFyIGF1dG9tYXRvbiB0cmF2ZXJzZXMgdGhlIGxpbmVhciBwYXRocyBmcm9tIHRoZQorbGVhdmVzIHRvIHRoZSByb290IG9mIHRoZSBBU1QgYW5kIHJldHVybnMgYSBzZXQgb2Ygbm9kZXMgZm9yIGZ1cnRoZXIKK21hdGNoaW5nLiBUaGlzIHJlZHVjZXMgc2lnbmlmaWNhbnRseSB0aGUgbnVtYmVyIG9mIGNhbmRpZGF0ZSBub2Rlcy4iIiIKKworX19hdXRob3JfXyA9ICJHZW9yZ2UgQm91dHNpb3VraXMgPGdib3V0c2lvdWtpc0BnbWFpbC5jb20+IgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGl0ZXJ0b29scworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVmYXVsdGRpY3QKKworZnJvbSAuIGltcG9ydCBweXRyZWUKK2Zyb20gLmJ0bV91dGlscyBpbXBvcnQgcmVkdWNlX3RyZWUKKworY2xhc3MgQk1Ob2RlKG9iamVjdCk6CisgICAgIiIiQ2xhc3MgZm9yIGEgbm9kZSBvZiB0aGUgQWhvLUNvcmFzaWNrIGF1dG9tYXRvbiB1c2VkIGluIG1hdGNoaW5nIiIiCisgICAgY291bnQgPSBpdGVydG9vbHMuY291bnQoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi50cmFuc2l0aW9uX3RhYmxlID0ge30KKyAgICAgICAgc2VsZi5maXhlcnMgPSBbXQorICAgICAgICBzZWxmLmlkID0gbmV4dChCTU5vZGUuY291bnQpCisgICAgICAgIHNlbGYuY29udGVudCA9ICcnCisKK2NsYXNzIEJvdHRvbU1hdGNoZXIob2JqZWN0KToKKyAgICAiIiJUaGUgbWFpbiBtYXRjaGVyIGNsYXNzLiBBZnRlciBpbnN0YW50aWF0aW5nIHRoZSBwYXR0ZXJucyBzaG91bGQKKyAgICBiZSBhZGRlZCB1c2luZyB0aGUgYWRkX2ZpeGVyIG1ldGhvZCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm1hdGNoID0gc2V0KCkKKyAgICAgICAgc2VsZi5yb290ID0gQk1Ob2RlKCkKKyAgICAgICAgc2VsZi5ub2RlcyA9IFtzZWxmLnJvb3RdCisgICAgICAgIHNlbGYuZml4ZXJzID0gW10KKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiUmVmYWN0b3JpbmdUb29sIikKKworICAgIGRlZiBhZGRfZml4ZXIoc2VsZiwgZml4ZXIpOgorICAgICAgICAiIiJSZWR1Y2VzIGEgZml4ZXIncyBwYXR0ZXJuIHRyZWUgdG8gYSBsaW5lYXIgcGF0aCBhbmQgYWRkcyBpdAorICAgICAgICB0byB0aGUgbWF0Y2hlcihhIGNvbW1vbiBBaG8tQ29yYXNpY2sgYXV0b21hdG9uKS4gVGhlIGZpeGVyIGlzCisgICAgICAgIGFwcGVuZGVkIG9uIHRoZSBtYXRjaGluZyBzdGF0ZXMgYW5kIGNhbGxlZCB3aGVuIHRoZXkgYXJlCisgICAgICAgIHJlYWNoZWQiIiIKKyAgICAgICAgc2VsZi5maXhlcnMuYXBwZW5kKGZpeGVyKQorICAgICAgICB0cmVlID0gcmVkdWNlX3RyZWUoZml4ZXIucGF0dGVybl90cmVlKQorICAgICAgICBsaW5lYXIgPSB0cmVlLmdldF9saW5lYXJfc3VicGF0dGVybigpCisgICAgICAgIG1hdGNoX25vZGVzID0gc2VsZi5hZGQobGluZWFyLCBzdGFydD1zZWxmLnJvb3QpCisgICAgICAgIGZvciBtYXRjaF9ub2RlIGluIG1hdGNoX25vZGVzOgorICAgICAgICAgICAgbWF0Y2hfbm9kZS5maXhlcnMuYXBwZW5kKGZpeGVyKQorCisgICAgZGVmIGFkZChzZWxmLCBwYXR0ZXJuLCBzdGFydCk6CisgICAgICAgICJSZWN1cnNpdmVseSBhZGRzIGEgbGluZWFyIHBhdHRlcm4gdG8gdGhlIEFDIGF1dG9tYXRvbiIKKyAgICAgICAgI3ByaW50KCJhZGRpbmcgcGF0dGVybiIsIHBhdHRlcm4sICJ0byIsIHN0YXJ0KQorICAgICAgICBpZiBub3QgcGF0dGVybjoKKyAgICAgICAgICAgICNwcmludCgiZW1wdHkgcGF0dGVybiIpCisgICAgICAgICAgICByZXR1cm4gW3N0YXJ0XQorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdHRlcm5bMF0sIHR1cGxlKToKKyAgICAgICAgICAgICNhbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgICNwcmludCgiYWx0ZXJuYXRpdmVzIikKKyAgICAgICAgICAgIG1hdGNoX25vZGVzID0gW10KKyAgICAgICAgICAgIGZvciBhbHRlcm5hdGl2ZSBpbiBwYXR0ZXJuWzBdOgorICAgICAgICAgICAgICAgICNhZGQgYWxsIGFsdGVybmF0aXZlcywgYW5kIGFkZCB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybgorICAgICAgICAgICAgICAgICN0byBlYWNoIGVuZCBub2RlCisgICAgICAgICAgICAgICAgZW5kX25vZGVzID0gc2VsZi5hZGQoYWx0ZXJuYXRpdmUsIHN0YXJ0PXN0YXJ0KQorICAgICAgICAgICAgICAgIGZvciBlbmQgaW4gZW5kX25vZGVzOgorICAgICAgICAgICAgICAgICAgICBtYXRjaF9ub2Rlcy5leHRlbmQoc2VsZi5hZGQocGF0dGVyblsxOl0sIGVuZCkpCisgICAgICAgICAgICByZXR1cm4gbWF0Y2hfbm9kZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICNzaW5nbGUgdG9rZW4KKyAgICAgICAgICAgICNub3QgbGFzdAorICAgICAgICAgICAgaWYgcGF0dGVyblswXSBub3QgaW4gc3RhcnQudHJhbnNpdGlvbl90YWJsZToKKyAgICAgICAgICAgICAgICAjdHJhbnNpdGlvbiBkaWQgbm90IGV4aXN0LCBjcmVhdGUgbmV3CisgICAgICAgICAgICAgICAgbmV4dF9ub2RlID0gQk1Ob2RlKCkKKyAgICAgICAgICAgICAgICBzdGFydC50cmFuc2l0aW9uX3RhYmxlW3BhdHRlcm5bMF1dID0gbmV4dF9ub2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICN0cmFuc2l0aW9uIGV4aXN0cyBhbHJlYWR5LCBmb2xsb3cKKyAgICAgICAgICAgICAgICBuZXh0X25vZGUgPSBzdGFydC50cmFuc2l0aW9uX3RhYmxlW3BhdHRlcm5bMF1dCisKKyAgICAgICAgICAgIGlmIHBhdHRlcm5bMTpdOgorICAgICAgICAgICAgICAgIGVuZF9ub2RlcyA9IHNlbGYuYWRkKHBhdHRlcm5bMTpdLCBzdGFydD1uZXh0X25vZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuZF9ub2RlcyA9IFtuZXh0X25vZGVdCisgICAgICAgICAgICByZXR1cm4gZW5kX25vZGVzCisKKyAgICBkZWYgcnVuKHNlbGYsIGxlYXZlcyk6CisgICAgICAgICIiIlRoZSBtYWluIGludGVyZmFjZSB3aXRoIHRoZSBib3R0b20gbWF0Y2hlci4gVGhlIHRyZWUgaXMKKyAgICAgICAgdHJhdmVyc2VkIGZyb20gdGhlIGJvdHRvbSB1c2luZyB0aGUgY29uc3RydWN0ZWQKKyAgICAgICAgYXV0b21hdG9uLiBOb2RlcyBhcmUgb25seSBjaGVja2VkIG9uY2UgYXMgdGhlIHRyZWUgaXMKKyAgICAgICAgcmV0cmF2ZXJzZWQuIFdoZW4gdGhlIGF1dG9tYXRvbiBmYWlscywgd2UgZ2l2ZSBpdCBvbmUgbW9yZQorICAgICAgICBzaG90KGluIGNhc2UgdGhlIGFib3ZlIHRyZWUgbWF0Y2hlcyBhcyBhIHdob2xlIHdpdGggdGhlCisgICAgICAgIHJlamVjdGVkIGxlYWYpLCB0aGVuIHdlIGJyZWFrIGZvciB0aGUgbmV4dCBsZWFmLiBUaGVyZSBpcyB0aGUKKyAgICAgICAgc3BlY2lhbCBjYXNlIG9mIG11bHRpcGxlIGFyZ3VtZW50cyhzZWUgY29kZSBjb21tZW50cykgd2hlcmUgd2UKKyAgICAgICAgcmVjaGVjayB0aGUgbm9kZXMKKworICAgICAgICBBcmdzOgorICAgICAgICAgICBUaGUgbGVhdmVzIG9mIHRoZSBBU1QgdHJlZSB0byBiZSBtYXRjaGVkCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgQSBkaWN0aW9uYXJ5IG9mIG5vZGUgbWF0Y2hlcyB3aXRoIGZpeGVycyBhcyB0aGUga2V5cworICAgICAgICAiIiIKKyAgICAgICAgY3VycmVudF9hY19ub2RlID0gc2VsZi5yb290CisgICAgICAgIHJlc3VsdHMgPSBkZWZhdWx0ZGljdChsaXN0KQorICAgICAgICBmb3IgbGVhZiBpbiBsZWF2ZXM6CisgICAgICAgICAgICBjdXJyZW50X2FzdF9ub2RlID0gbGVhZgorICAgICAgICAgICAgd2hpbGUgY3VycmVudF9hc3Rfbm9kZToKKyAgICAgICAgICAgICAgICBjdXJyZW50X2FzdF9ub2RlLndhc19jaGVja2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGZvciBjaGlsZCBpbiBjdXJyZW50X2FzdF9ub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgICAgICAjIG11bHRpcGxlIHN0YXRlbWVudHMsIHJlY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGlsZCwgcHl0cmVlLkxlYWYpIGFuZCBjaGlsZC52YWx1ZSA9PSB1IjsiOgorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudF9hc3Rfbm9kZS53YXNfY2hlY2tlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfYXN0X25vZGUudHlwZSA9PSAxOgorICAgICAgICAgICAgICAgICAgICAjbmFtZQorICAgICAgICAgICAgICAgICAgICBub2RlX3Rva2VuID0gY3VycmVudF9hc3Rfbm9kZS52YWx1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5vZGVfdG9rZW4gPSBjdXJyZW50X2FzdF9ub2RlLnR5cGUKKworICAgICAgICAgICAgICAgIGlmIG5vZGVfdG9rZW4gaW4gY3VycmVudF9hY19ub2RlLnRyYW5zaXRpb25fdGFibGU6CisgICAgICAgICAgICAgICAgICAgICN0b2tlbiBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfYWNfbm9kZSA9IGN1cnJlbnRfYWNfbm9kZS50cmFuc2l0aW9uX3RhYmxlW25vZGVfdG9rZW5dCisgICAgICAgICAgICAgICAgICAgIGZvciBmaXhlciBpbiBjdXJyZW50X2FjX25vZGUuZml4ZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpeGVyIGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tmaXhlcl0gPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tmaXhlcl0uYXBwZW5kKGN1cnJlbnRfYXN0X25vZGUpCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjbWF0Y2hpbmcgZmFpbGVkLCByZXNldCBhdXRvbWF0b24KKyAgICAgICAgICAgICAgICAgICAgY3VycmVudF9hY19ub2RlID0gc2VsZi5yb290CisgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X2FzdF9ub2RlLnBhcmVudCBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGN1cnJlbnRfYXN0X25vZGUucGFyZW50Lndhc19jaGVja2VkKToKKyAgICAgICAgICAgICAgICAgICAgICAgICN0aGUgcmVzdCBvZiB0aGUgdHJlZSB1cHdhcmRzIGhhcyBiZWVuIGNoZWNrZWQsIG5leHQgbGVhZgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgICAgICAjcmVjaGVjayB0aGUgcmVqZWN0ZWQgbm9kZSBvbmNlIGZyb20gdGhlIHJvb3QKKyAgICAgICAgICAgICAgICAgICAgaWYgbm9kZV90b2tlbiBpbiBjdXJyZW50X2FjX25vZGUudHJhbnNpdGlvbl90YWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICN0b2tlbiBtYXRjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2FjX25vZGUgPSBjdXJyZW50X2FjX25vZGUudHJhbnNpdGlvbl90YWJsZVtub2RlX3Rva2VuXQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZpeGVyIGluIGN1cnJlbnRfYWNfbm9kZS5maXhlcnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGZpeGVyIGluIHJlc3VsdHMua2V5cygpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ZpeGVyXSA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1tmaXhlcl0uYXBwZW5kKGN1cnJlbnRfYXN0X25vZGUpCisKKyAgICAgICAgICAgICAgICBjdXJyZW50X2FzdF9ub2RlID0gY3VycmVudF9hc3Rfbm9kZS5wYXJlbnQKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiBwcmludF9hYyhzZWxmKToKKyAgICAgICAgIlByaW50cyBhIGdyYXBodml6IGRpYWdyYW0gb2YgdGhlIEJNIGF1dG9tYXRvbihmb3IgZGVidWdnaW5nKSIKKyAgICAgICAgcHJpbnQoImRpZ3JhcGggZ3siKQorICAgICAgICBkZWYgcHJpbnRfbm9kZShub2RlKToKKyAgICAgICAgICAgIGZvciBzdWJub2RlX2tleSBpbiBub2RlLnRyYW5zaXRpb25fdGFibGUua2V5cygpOgorICAgICAgICAgICAgICAgIHN1Ym5vZGUgPSBub2RlLnRyYW5zaXRpb25fdGFibGVbc3Vibm9kZV9rZXldCisgICAgICAgICAgICAgICAgcHJpbnQoIiVkIC0+ICVkIFtsYWJlbD0lc10gLy8lcyIgJQorICAgICAgICAgICAgICAgICAgICAgIChub2RlLmlkLCBzdWJub2RlLmlkLCB0eXBlX3JlcHIoc3Vibm9kZV9rZXkpLCBzdHIoc3Vibm9kZS5maXhlcnMpKSkKKyAgICAgICAgICAgICAgICBpZiBzdWJub2RlX2tleSA9PSAxOgorICAgICAgICAgICAgICAgICAgICBwcmludChzdWJub2RlLmNvbnRlbnQpCisgICAgICAgICAgICAgICAgcHJpbnRfbm9kZShzdWJub2RlKQorICAgICAgICBwcmludF9ub2RlKHNlbGYucm9vdCkKKyAgICAgICAgcHJpbnQoIn0iKQorCisjIHRha2VuIGZyb20gcHl0cmVlLnB5IGZvciBkZWJ1Z2dpbmc7IG9ubHkgdXNlZCBieSBwcmludF9hYworX3R5cGVfcmVwcnMgPSB7fQorZGVmIHR5cGVfcmVwcih0eXBlX251bSk6CisgICAgZ2xvYmFsIF90eXBlX3JlcHJzCisgICAgaWYgbm90IF90eXBlX3JlcHJzOgorICAgICAgICBmcm9tIC5weWdyYW0gaW1wb3J0IHB5dGhvbl9zeW1ib2xzCisgICAgICAgICMgcHJpbnRpbmcgdG9rZW5zIGlzIHBvc3NpYmxlIGJ1dCBub3QgYXMgdXNlZnVsCisgICAgICAgICMgZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuIC8vIHRva2VuLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgIGZvciBuYW1lLCB2YWwgaW4gcHl0aG9uX3N5bWJvbHMuX19kaWN0X18uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUodmFsKSA9PSBpbnQ6IF90eXBlX3JlcHJzW3ZhbF0gPSBuYW1lCisgICAgcmV0dXJuIF90eXBlX3JlcHJzLnNldGRlZmF1bHQodHlwZV9udW0sIHR5cGVfbnVtKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV9tYXRjaGVyLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fbWF0Y2hlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YWQxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fbWF0Y2hlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV9tYXRjaGVyLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fbWF0Y2hlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YWQxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fbWF0Y2hlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2J0bV91dGlscy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3NmRjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fdXRpbHMucHkKQEAgLTAsMCArMSwyODMgQEAKKyJVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBidG1fbWF0Y2hlciBtb2R1bGUiCisKK2Zyb20gLiBpbXBvcnQgcHl0cmVlCitmcm9tIC5wZ2VuMiBpbXBvcnQgZ3JhbW1hciwgdG9rZW4KK2Zyb20gLnB5Z3JhbSBpbXBvcnQgcGF0dGVybl9zeW1ib2xzLCBweXRob25fc3ltYm9scworCitzeW1zID0gcGF0dGVybl9zeW1ib2xzCitweXN5bXMgPSBweXRob25fc3ltYm9scwordG9rZW5zID0gZ3JhbW1hci5vcG1hcAordG9rZW5fbGFiZWxzID0gdG9rZW4KKworVFlQRV9BTlkgPSAtMQorVFlQRV9BTFRFUk5BVElWRVMgPSAtMgorVFlQRV9HUk9VUCA9IC0zCisKK2NsYXNzIE1pbk5vZGUob2JqZWN0KToKKyAgICAiIiJUaGlzIGNsYXNzIHNlcnZlcyBhcyBhbiBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gb2YgdGhlCisgICAgcGF0dGVybiB0cmVlIGR1cmluZyB0aGUgY29udmVyc2lvbiB0byBzZXRzIG9mIGxlYWYtdG8tcm9vdAorICAgIHN1YnBhdHRlcm5zIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCisgICAgICAgIHNlbGYubGVhZiA9IEZhbHNlCisgICAgICAgIHNlbGYucGFyZW50ID0gTm9uZQorICAgICAgICBzZWxmLmFsdGVybmF0aXZlcyA9IFtdCisgICAgICAgIHNlbGYuZ3JvdXAgPSBbXQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYudHlwZSkgKyAnICcgKyBzdHIoc2VsZi5uYW1lKQorCisgICAgZGVmIGxlYWZfdG9fcm9vdChzZWxmKToKKyAgICAgICAgIiIiSW50ZXJuYWwgbWV0aG9kLiBSZXR1cm5zIGEgY2hhcmFjdGVyaXN0aWMgcGF0aCBvZiB0aGUKKyAgICAgICAgcGF0dGVybiB0cmVlLiBUaGlzIG1ldGhvZCBtdXN0IGJlIHJ1biBmb3IgYWxsIGxlYXZlcyB1bnRpbCB0aGUKKyAgICAgICAgbGluZWFyIHN1YnBhdHRlcm5zIGFyZSBtZXJnZWQgaW50byBhIHNpbmdsZSIiIgorICAgICAgICBub2RlID0gc2VsZgorICAgICAgICBzdWJwID0gW10KKyAgICAgICAgd2hpbGUgbm9kZToKKyAgICAgICAgICAgIGlmIG5vZGUudHlwZSA9PSBUWVBFX0FMVEVSTkFUSVZFUzoKKyAgICAgICAgICAgICAgICBub2RlLmFsdGVybmF0aXZlcy5hcHBlbmQoc3VicCkKKyAgICAgICAgICAgICAgICBpZiBsZW4obm9kZS5hbHRlcm5hdGl2ZXMpID09IGxlbihub2RlLmNoaWxkcmVuKToKKyAgICAgICAgICAgICAgICAgICAgI2xhc3QgYWx0ZXJuYXRpdmUKKyAgICAgICAgICAgICAgICAgICAgc3VicCA9IFt0dXBsZShub2RlLmFsdGVybmF0aXZlcyldCisgICAgICAgICAgICAgICAgICAgIG5vZGUuYWx0ZXJuYXRpdmVzID0gW10KKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgICAgICAgICAgICAgICAgIHN1YnAgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIG5vZGUudHlwZSA9PSBUWVBFX0dST1VQOgorICAgICAgICAgICAgICAgIG5vZGUuZ3JvdXAuYXBwZW5kKHN1YnApCisgICAgICAgICAgICAgICAgI3Byb2JhYmx5IHNob3VsZCBjaGVjayB0aGUgbnVtYmVyIG9mIGxlYXZlcworICAgICAgICAgICAgICAgIGlmIGxlbihub2RlLmdyb3VwKSA9PSBsZW4obm9kZS5jaGlsZHJlbik6CisgICAgICAgICAgICAgICAgICAgIHN1YnAgPSBnZXRfY2hhcmFjdGVyaXN0aWNfc3VicGF0dGVybihub2RlLmdyb3VwKQorICAgICAgICAgICAgICAgICAgICBub2RlLmdyb3VwID0gW10KKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgICAgICAgICAgICAgICAgIHN1YnAgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIG5vZGUudHlwZSA9PSB0b2tlbl9sYWJlbHMuTkFNRSBhbmQgbm9kZS5uYW1lOgorICAgICAgICAgICAgICAgICNpbiBjYXNlIG9mIHR5cGU9bmFtZSwgdXNlIHRoZSBuYW1lIGluc3RlYWQKKyAgICAgICAgICAgICAgICBzdWJwLmFwcGVuZChub2RlLm5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1YnAuYXBwZW5kKG5vZGUudHlwZSkKKworICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50CisgICAgICAgIHJldHVybiBzdWJwCisKKyAgICBkZWYgZ2V0X2xpbmVhcl9zdWJwYXR0ZXJuKHNlbGYpOgorICAgICAgICAiIiJEcml2ZXMgdGhlIGxlYWZfdG9fcm9vdCBtZXRob2QuIFRoZSByZWFzb24gdGhhdAorICAgICAgICBsZWFmX3RvX3Jvb3QgbXVzdCBiZSBydW4gbXVsdGlwbGUgdGltZXMgaXMgYmVjYXVzZSB3ZSBuZWVkIHRvCisgICAgICAgIHJlamVjdCAnZ3JvdXAnIG1hdGNoZXM7IGZvciBleGFtcGxlIHRoZSBhbHRlcm5hdGl2ZSBmb3JtCisgICAgICAgIChhIHwgYiBjKSBjcmVhdGVzIGEgZ3JvdXAgW2IgY10gdGhhdCBuZWVkcyB0byBiZSBtYXRjaGVkLiBTaW5jZQorICAgICAgICBtYXRjaGluZyBtdWx0aXBsZSBsaW5lYXIgcGF0dGVybnMgb3ZlcmNvbWVzIHRoZSBhdXRvbWF0b24ncworICAgICAgICBjYXBhYmlsaXRpZXMsIGxlYWZfdG9fcm9vdCBtZXJnZXMgZWFjaCBncm91cCBpbnRvIGEgc2luZ2xlCisgICAgICAgIGNob2ljZSBiYXNlZCBvbiAnY2hhcmFjdGVyaXN0aWMnaXR5LAorCisgICAgICAgIGkuZS4gKGF8YiBjKSAtPiAoYXxiKSBpZiBiIG1vcmUgY2hhcmFjdGVyaXN0aWMgdGhhbiBjCisKKyAgICAgICAgUmV0dXJuczogVGhlIG1vc3QgJ2NoYXJhY3RlcmlzdGljJyhhcyBkZWZpbmVkIGJ5CisgICAgICAgICAgZ2V0X2NoYXJhY3RlcmlzdGljX3N1YnBhdHRlcm4pIHBhdGggZm9yIHRoZSBjb21waWxlZCBwYXR0ZXJuCisgICAgICAgICAgdHJlZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZm9yIGwgaW4gc2VsZi5sZWF2ZXMoKToKKyAgICAgICAgICAgIHN1YnAgPSBsLmxlYWZfdG9fcm9vdCgpCisgICAgICAgICAgICBpZiBzdWJwOgorICAgICAgICAgICAgICAgIHJldHVybiBzdWJwCisKKyAgICBkZWYgbGVhdmVzKHNlbGYpOgorICAgICAgICAiR2VuZXJhdG9yIHRoYXQgcmV0dXJucyB0aGUgbGVhdmVzIG9mIHRoZSB0cmVlIgorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIGZvciB4IGluIGNoaWxkLmxlYXZlcygpOgorICAgICAgICAgICAgICAgIHlpZWxkIHgKKyAgICAgICAgaWYgbm90IHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICB5aWVsZCBzZWxmCisKK2RlZiByZWR1Y2VfdHJlZShub2RlLCBwYXJlbnQ9Tm9uZSk6CisgICAgIiIiCisgICAgSW50ZXJuYWwgZnVuY3Rpb24uIFJlZHVjZXMgYSBjb21waWxlZCBwYXR0ZXJuIHRyZWUgdG8gYW4KKyAgICBpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24gc3VpdGFibGUgZm9yIGZlZWRpbmcgdGhlCisgICAgYXV0b21hdG9uLiBUaGlzIGFsc28gdHJpbXMgb2ZmIGFueSBvcHRpb25hbCBwYXR0ZXJuIGVsZW1lbnRzKGxpa2UKKyAgICBbYV0sIGEqKS4KKyAgICAiIiIKKworICAgIG5ld19ub2RlID0gTm9uZQorICAgICNzd2l0Y2ggb24gdGhlIG5vZGUgdHlwZQorICAgIGlmIG5vZGUudHlwZSA9PSBzeW1zLk1hdGNoZXI6CisgICAgICAgICNza2lwCisgICAgICAgIG5vZGUgPSBub2RlLmNoaWxkcmVuWzBdCisKKyAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5BbHRlcm5hdGl2ZXMgIDoKKyAgICAgICAgIzIgY2FzZXMKKyAgICAgICAgaWYgbGVuKG5vZGUuY2hpbGRyZW4pIDw9IDI6CisgICAgICAgICAgICAjanVzdCBhIHNpbmdsZSAnQWx0ZXJuYXRpdmUnLCBza2lwIHRoaXMgbm9kZQorICAgICAgICAgICAgbmV3X25vZGUgPSByZWR1Y2VfdHJlZShub2RlLmNoaWxkcmVuWzBdLCBwYXJlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjcmVhbCBhbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIG5ld19ub2RlID0gTWluTm9kZSh0eXBlPVRZUEVfQUxURVJOQVRJVkVTKQorICAgICAgICAgICAgI3NraXAgb2RkIGNoaWxkcmVuKCd8JyB0b2tlbnMpCisgICAgICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgICAgICAgICBpZiBub2RlLmNoaWxkcmVuLmluZGV4KGNoaWxkKSUyOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlZHVjZWQgPSByZWR1Y2VfdHJlZShjaGlsZCwgbmV3X25vZGUpCisgICAgICAgICAgICAgICAgaWYgcmVkdWNlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbmV3X25vZGUuY2hpbGRyZW4uYXBwZW5kKHJlZHVjZWQpCisgICAgZWxpZiBub2RlLnR5cGUgPT0gc3ltcy5BbHRlcm5hdGl2ZToKKyAgICAgICAgaWYgbGVuKG5vZGUuY2hpbGRyZW4pID4gMToKKworICAgICAgICAgICAgbmV3X25vZGUgPSBNaW5Ob2RlKHR5cGU9VFlQRV9HUk9VUCkKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIHJlZHVjZWQgPSByZWR1Y2VfdHJlZShjaGlsZCwgbmV3X25vZGUpCisgICAgICAgICAgICAgICAgaWYgcmVkdWNlZDoKKyAgICAgICAgICAgICAgICAgICAgbmV3X25vZGUuY2hpbGRyZW4uYXBwZW5kKHJlZHVjZWQpCisgICAgICAgICAgICBpZiBub3QgbmV3X25vZGUuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIGdyb3VwIGlmIGFsbCBvZiB0aGUgY2hpbGRyZW4gd2VyZSByZWR1Y2VkIHRvIE5vbmUKKyAgICAgICAgICAgICAgICBuZXdfbm9kZSA9IE5vbmUKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmV3X25vZGUgPSByZWR1Y2VfdHJlZShub2RlLmNoaWxkcmVuWzBdLCBwYXJlbnQpCisKKyAgICBlbGlmIG5vZGUudHlwZSA9PSBzeW1zLlVuaXQ6CisgICAgICAgIGlmIChpc2luc3RhbmNlKG5vZGUuY2hpbGRyZW5bMF0sIHB5dHJlZS5MZWFmKSBhbmQKKyAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5bMF0udmFsdWUgPT0gJygnKToKKyAgICAgICAgICAgICNza2lwIHBhcmVudGhlc2VzCisgICAgICAgICAgICByZXR1cm4gcmVkdWNlX3RyZWUobm9kZS5jaGlsZHJlblsxXSwgcGFyZW50KQorICAgICAgICBpZiAoKGlzaW5zdGFuY2Uobm9kZS5jaGlsZHJlblswXSwgcHl0cmVlLkxlYWYpIGFuZAorICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlblswXS52YWx1ZSA9PSAnWycpCisgICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgICAgKGxlbihub2RlLmNoaWxkcmVuKT4xIGFuZAorICAgICAgICAgICAgICAgaGFzYXR0cihub2RlLmNoaWxkcmVuWzFdLCAidmFsdWUiKSBhbmQKKyAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW5bMV0udmFsdWUgPT0gJ1snKSk6CisgICAgICAgICAgICAjc2tpcCB3aG9sZSB1bml0IGlmIGl0cyBvcHRpb25hbAorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBsZWFmID0gVHJ1ZQorICAgICAgICBkZXRhaWxzX25vZGUgPSBOb25lCisgICAgICAgIGFsdGVybmF0aXZlc19ub2RlID0gTm9uZQorICAgICAgICBoYXNfcmVwZWF0ZXIgPSBGYWxzZQorICAgICAgICByZXBlYXRlcl9ub2RlID0gTm9uZQorICAgICAgICBoYXNfdmFyaWFibGVfbmFtZSA9IEZhbHNlCisKKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGRyZW46CisgICAgICAgICAgICBpZiBjaGlsZC50eXBlID09IHN5bXMuRGV0YWlsczoKKyAgICAgICAgICAgICAgICBsZWFmID0gRmFsc2UKKyAgICAgICAgICAgICAgICBkZXRhaWxzX25vZGUgPSBjaGlsZAorICAgICAgICAgICAgZWxpZiBjaGlsZC50eXBlID09IHN5bXMuUmVwZWF0ZXI6CisgICAgICAgICAgICAgICAgaGFzX3JlcGVhdGVyID0gVHJ1ZQorICAgICAgICAgICAgICAgIHJlcGVhdGVyX25vZGUgPSBjaGlsZAorICAgICAgICAgICAgZWxpZiBjaGlsZC50eXBlID09IHN5bXMuQWx0ZXJuYXRpdmVzOgorICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlc19ub2RlID0gY2hpbGQKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoY2hpbGQsICd2YWx1ZScpIGFuZCBjaGlsZC52YWx1ZSA9PSAnPSc6ICMgdmFyaWFibGUgbmFtZQorICAgICAgICAgICAgICAgIGhhc192YXJpYWJsZV9uYW1lID0gVHJ1ZQorCisgICAgICAgICNza2lwIHZhcmlhYmxlIG5hbWUKKyAgICAgICAgaWYgaGFzX3ZhcmlhYmxlX25hbWU6CisgICAgICAgICAgICAjc2tpcCB2YXJpYWJsZSBuYW1lLCAnPScKKyAgICAgICAgICAgIG5hbWVfbGVhZiA9IG5vZGUuY2hpbGRyZW5bMl0KKyAgICAgICAgICAgIGlmIGhhc2F0dHIobmFtZV9sZWFmLCAndmFsdWUnKSBhbmQgbmFtZV9sZWFmLnZhbHVlID09ICcoJzoKKyAgICAgICAgICAgICAgICAjIHNraXAgcGFyZW50aGVzaXMKKyAgICAgICAgICAgICAgICBuYW1lX2xlYWYgPSBub2RlLmNoaWxkcmVuWzNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lX2xlYWYgPSBub2RlLmNoaWxkcmVuWzBdCisKKyAgICAgICAgI3NldCBub2RlIHR5cGUKKyAgICAgICAgaWYgbmFtZV9sZWFmLnR5cGUgPT0gdG9rZW5fbGFiZWxzLk5BTUU6CisgICAgICAgICAgICAjKHB5dGhvbikgbm9uLW5hbWUgb3Igd2lsZGNhcmQKKyAgICAgICAgICAgIGlmIG5hbWVfbGVhZi52YWx1ZSA9PSAnYW55JzoKKyAgICAgICAgICAgICAgICBuZXdfbm9kZSA9IE1pbk5vZGUodHlwZT1UWVBFX0FOWSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cih0b2tlbl9sYWJlbHMsIG5hbWVfbGVhZi52YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIG5ld19ub2RlID0gTWluTm9kZSh0eXBlPWdldGF0dHIodG9rZW5fbGFiZWxzLCBuYW1lX2xlYWYudmFsdWUpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5ld19ub2RlID0gTWluTm9kZSh0eXBlPWdldGF0dHIocHlzeW1zLCBuYW1lX2xlYWYudmFsdWUpKQorCisgICAgICAgIGVsaWYgbmFtZV9sZWFmLnR5cGUgPT0gdG9rZW5fbGFiZWxzLlNUUklORzoKKyAgICAgICAgICAgICMocHl0aG9uKSBuYW1lIG9yIGNoYXJhY3RlcjsgcmVtb3ZlIHRoZSBhcG9zdHJvcGhlcyBmcm9tCisgICAgICAgICAgICAjdGhlIHN0cmluZyB2YWx1ZQorICAgICAgICAgICAgbmFtZSA9IG5hbWVfbGVhZi52YWx1ZS5zdHJpcCgiJyIpCisgICAgICAgICAgICBpZiBuYW1lIGluIHRva2VuczoKKyAgICAgICAgICAgICAgICBuZXdfbm9kZSA9IE1pbk5vZGUodHlwZT10b2tlbnNbbmFtZV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld19ub2RlID0gTWluTm9kZSh0eXBlPXRva2VuX2xhYmVscy5OQU1FLCBuYW1lPW5hbWUpCisgICAgICAgIGVsaWYgbmFtZV9sZWFmLnR5cGUgPT0gc3ltcy5BbHRlcm5hdGl2ZXM6CisgICAgICAgICAgICBuZXdfbm9kZSA9IHJlZHVjZV90cmVlKGFsdGVybmF0aXZlc19ub2RlLCBwYXJlbnQpCisKKyAgICAgICAgI2hhbmRsZSByZXBlYXRlcnMKKyAgICAgICAgaWYgaGFzX3JlcGVhdGVyOgorICAgICAgICAgICAgaWYgcmVwZWF0ZXJfbm9kZS5jaGlsZHJlblswXS52YWx1ZSA9PSAnKic6CisgICAgICAgICAgICAgICAgI3JlZHVjZSB0byBOb25lCisgICAgICAgICAgICAgICAgbmV3X25vZGUgPSBOb25lCisgICAgICAgICAgICBlbGlmIHJlcGVhdGVyX25vZGUuY2hpbGRyZW5bMF0udmFsdWUgPT0gJysnOgorICAgICAgICAgICAgICAgICNyZWR1Y2UgdG8gYSBzaW5nbGUgb2NjdXJlbmNlIGkuZS4gZG8gbm90aGluZworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgI1RPRE86IGhhbmRsZSB7bWluLCBtYXh9IHJlcGVhdGVycworICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgI2FkZCBjaGlsZHJlbgorICAgICAgICBpZiBkZXRhaWxzX25vZGUgYW5kIG5ld19ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGNoaWxkIGluIGRldGFpbHNfbm9kZS5jaGlsZHJlblsxOi0xXToKKyAgICAgICAgICAgICAgICAjc2tpcCAnPCcsICc+JyBtYXJrZXJzCisgICAgICAgICAgICAgICAgcmVkdWNlZCA9IHJlZHVjZV90cmVlKGNoaWxkLCBuZXdfbm9kZSkKKyAgICAgICAgICAgICAgICBpZiByZWR1Y2VkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBuZXdfbm9kZS5jaGlsZHJlbi5hcHBlbmQocmVkdWNlZCkKKyAgICBpZiBuZXdfbm9kZToKKyAgICAgICAgbmV3X25vZGUucGFyZW50ID0gcGFyZW50CisgICAgcmV0dXJuIG5ld19ub2RlCisKKworZGVmIGdldF9jaGFyYWN0ZXJpc3RpY19zdWJwYXR0ZXJuKHN1YnBhdHRlcm5zKToKKyAgICAiIiJQaWNrcyB0aGUgbW9zdCBjaGFyYWN0ZXJpc3RpYyBmcm9tIGEgbGlzdCBvZiBsaW5lYXIgcGF0dGVybnMKKyAgICBDdXJyZW50IG9yZGVyIHVzZWQgaXM6CisgICAgbmFtZXMgPiBjb21tb25fbmFtZXMgPiBjb21tb25fY2hhcnMKKyAgICAiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZShzdWJwYXR0ZXJucywgbGlzdCk6CisgICAgICAgIHJldHVybiBzdWJwYXR0ZXJucworICAgIGlmIGxlbihzdWJwYXR0ZXJucyk9PTE6CisgICAgICAgIHJldHVybiBzdWJwYXR0ZXJuc1swXQorCisgICAgIyBmaXJzdCBwaWNrIG91dCB0aGUgb25lcyBjb250YWluaW5nIHZhcmlhYmxlIG5hbWVzCisgICAgc3VicGF0dGVybnNfd2l0aF9uYW1lcyA9IFtdCisgICAgc3VicGF0dGVybnNfd2l0aF9jb21tb25fbmFtZXMgPSBbXQorICAgIGNvbW1vbl9uYW1lcyA9IFsnaW4nLCAnZm9yJywgJ2lmJyAsICdub3QnLCAnTm9uZSddCisgICAgc3VicGF0dGVybnNfd2l0aF9jb21tb25fY2hhcnMgPSBbXQorICAgIGNvbW1vbl9jaGFycyA9ICJbXSgpLiw6IgorICAgIGZvciBzdWJwYXR0ZXJuIGluIHN1YnBhdHRlcm5zOgorICAgICAgICBpZiBhbnkocmVjX3Rlc3Qoc3VicGF0dGVybiwgbGFtYmRhIHg6IHR5cGUoeCkgaXMgc3RyKSk6CisgICAgICAgICAgICBpZiBhbnkocmVjX3Rlc3Qoc3VicGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgeDogaXNpbnN0YW5jZSh4LCBzdHIpIGFuZCB4IGluIGNvbW1vbl9jaGFycykpOgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX2NoYXJzLmFwcGVuZChzdWJwYXR0ZXJuKQorICAgICAgICAgICAgZWxpZiBhbnkocmVjX3Rlc3Qoc3VicGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB4OiBpc2luc3RhbmNlKHgsIHN0cikgYW5kIHggaW4gY29tbW9uX25hbWVzKSk6CisgICAgICAgICAgICAgICAgc3VicGF0dGVybnNfd2l0aF9jb21tb25fbmFtZXMuYXBwZW5kKHN1YnBhdHRlcm4pCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3VicGF0dGVybnNfd2l0aF9uYW1lcy5hcHBlbmQoc3VicGF0dGVybikKKworICAgIGlmIHN1YnBhdHRlcm5zX3dpdGhfbmFtZXM6CisgICAgICAgIHN1YnBhdHRlcm5zID0gc3VicGF0dGVybnNfd2l0aF9uYW1lcworICAgIGVsaWYgc3VicGF0dGVybnNfd2l0aF9jb21tb25fbmFtZXM6CisgICAgICAgIHN1YnBhdHRlcm5zID0gc3VicGF0dGVybnNfd2l0aF9jb21tb25fbmFtZXMKKyAgICBlbGlmIHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX2NoYXJzOgorICAgICAgICBzdWJwYXR0ZXJucyA9IHN1YnBhdHRlcm5zX3dpdGhfY29tbW9uX2NoYXJzCisgICAgIyBvZiB0aGUgcmVtYWluaW5nIHN1YnBhdHRlcm5zIHBpY2sgb3V0IHRoZSBsb25nZXN0IG9uZQorICAgIHJldHVybiBtYXgoc3VicGF0dGVybnMsIGtleT1sZW4pCisKK2RlZiByZWNfdGVzdChzZXF1ZW5jZSwgdGVzdF9mdW5jKToKKyAgICAiIiJUZXN0cyB0ZXN0X2Z1bmMgb24gYWxsIGl0ZW1zIG9mIHNlcXVlbmNlIGFuZCBpdGVtcyBvZiBpbmNsdWRlZAorICAgIHN1Yi1pdGVyYWJsZXMiIiIKKyAgICBmb3IgeCBpbiBzZXF1ZW5jZToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCAobGlzdCwgdHVwbGUpKToKKyAgICAgICAgICAgIGZvciB5IGluIHJlY190ZXN0KHgsIHRlc3RfZnVuYyk6CisgICAgICAgICAgICAgICAgeWllbGQgeQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeWllbGQgdGVzdF9mdW5jKHgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fdXRpbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmY3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9idG1fdXRpbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYmY3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvYnRtX3V0aWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfYmFzZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcl9iYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NDIxYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfYmFzZS5weQpAQCAtMCwwICsxLDE4OSBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJCYXNlIGNsYXNzIGZvciBmaXhlcnMgKG9wdGlvbmFsLCBidXQgcmVjb21tZW5kZWQpLiIiIgorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IGl0ZXJ0b29scworCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLnBhdGNvbXAgaW1wb3J0IFBhdHRlcm5Db21waWxlcgorZnJvbSAuIGltcG9ydCBweWdyYW0KK2Zyb20gLmZpeGVyX3V0aWwgaW1wb3J0IGRvZXNfdHJlZV9pbXBvcnQKKworY2xhc3MgQmFzZUZpeChvYmplY3QpOgorCisgICAgIiIiT3B0aW9uYWwgYmFzZSBjbGFzcyBmb3IgZml4ZXJzLgorCisgICAgVGhlIHN1YmNsYXNzIG5hbWUgbXVzdCBiZSBGaXhGb29CYXIgd2hlcmUgRm9vQmFyIGlzIHRoZSByZXN1bHQgb2YKKyAgICByZW1vdmluZyB1bmRlcnNjb3JlcyBhbmQgY2FwaXRhbGl6aW5nIHRoZSB3b3JkcyBvZiB0aGUgZml4IG5hbWUuCisgICAgRm9yIGV4YW1wbGUsIHRoZSBjbGFzcyBuYW1lIGZvciBhIGZpeGVyIG5hbWVkICdoYXNfa2V5JyBzaG91bGQgYmUKKyAgICBGaXhIYXNLZXkuCisgICAgIiIiCisKKyAgICBQQVRURVJOID0gTm9uZSAgIyBNb3N0IHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHdpdGggYSBzdHJpbmcgbGl0ZXJhbAorICAgIHBhdHRlcm4gPSBOb25lICAjIENvbXBpbGVkIHBhdHRlcm4sIHNldCBieSBjb21waWxlX3BhdHRlcm4oKQorICAgIHBhdHRlcm5fdHJlZSA9IE5vbmUgIyBUcmVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwYXR0ZXJuCisgICAgb3B0aW9ucyA9IE5vbmUgICMgT3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIGluaXRpYWxpemVyCisgICAgZmlsZW5hbWUgPSBOb25lICMgVGhlIGZpbGVuYW1lIChzZXQgYnkgc2V0X2ZpbGVuYW1lKQorICAgIGxvZ2dlciA9IE5vbmUgICAjIEEgbG9nZ2VyIChzZXQgYnkgc2V0X2ZpbGVuYW1lKQorICAgIG51bWJlcnMgPSBpdGVydG9vbHMuY291bnQoMSkgIyBGb3IgbmV3X25hbWUoKQorICAgIHVzZWRfbmFtZXMgPSBzZXQoKSAjIEEgc2V0IG9mIGFsbCB1c2VkIE5BTUVzCisgICAgb3JkZXIgPSAicG9zdCIgIyBEb2VzIHRoZSBmaXhlciBwcmVmZXIgcHJlLSBvciBwb3N0LW9yZGVyIHRyYXZlcnNhbAorICAgIGV4cGxpY2l0ID0gRmFsc2UgIyBJcyB0aGlzIGlnbm9yZWQgYnkgcmVmYWN0b3IucHkgLWYgYWxsPworICAgIHJ1bl9vcmRlciA9IDUgICAjIEZpeGVycyB3aWxsIGJlIHNvcnRlZCBieSBydW4gb3JkZXIgYmVmb3JlIGV4ZWN1dGlvbgorICAgICAgICAgICAgICAgICAgICAjIExvd2VyIG51bWJlcnMgd2lsbCBiZSBydW4gZmlyc3QuCisgICAgX2FjY2VwdF90eXBlID0gTm9uZSAjIFtBZHZhbmNlZCBhbmQgbm90IHB1YmxpY10gVGhpcyB0ZWxscyBSZWZhY3RvcmluZ1Rvb2wKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2hpY2ggbm9kZSB0eXBlIHRvIGFjY2VwdCB3aGVuIHRoZXJlJ3Mgbm90IGEgcGF0dGVybi4KKworICAgIGtlZXBfbGluZV9vcmRlciA9IEZhbHNlICMgRm9yIHRoZSBib3R0b20gbWF0Y2hlcjogbWF0Y2ggd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yaWdpbmFsIGxpbmUgb3JkZXIKKyAgICBCTV9jb21wYXRpYmxlID0gRmFsc2UgIyBDb21wYXRpYmlsaXR5IHdpdGggdGhlIGJvdHRvbSBtYXRjaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1vZHVsZTsgZXZlcnkgZml4ZXIgc2hvdWxkIHNldCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWFudWFsbHkKKworICAgICMgU2hvcnRjdXQgZm9yIGFjY2VzcyB0byBQeXRob24gZ3JhbW1hciBzeW1ib2xzCisgICAgc3ltcyA9IHB5Z3JhbS5weXRob25fc3ltYm9scworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMsIGxvZyk6CisgICAgICAgICIiIkluaXRpYWxpemVyLiAgU3ViY2xhc3MgbWF5IG92ZXJyaWRlLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBvcHRpb25zOiBhbiBkaWN0IGNvbnRhaW5pbmcgdGhlIG9wdGlvbnMgcGFzc2VkIHRvIFJlZmFjdG9yaW5nVG9vbAorICAgICAgICAgICAgdGhhdCBjb3VsZCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgZml4ZXIgdGhyb3VnaCB0aGUgY29tbWFuZCBsaW5lLgorICAgICAgICAgICAgbG9nOiBhIGxpc3QgdG8gYXBwZW5kIHdhcm5pbmdzIGFuZCBvdGhlciBtZXNzYWdlcyB0by4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYub3B0aW9ucyA9IG9wdGlvbnMKKyAgICAgICAgc2VsZi5sb2cgPSBsb2cKKyAgICAgICAgc2VsZi5jb21waWxlX3BhdHRlcm4oKQorCisgICAgZGVmIGNvbXBpbGVfcGF0dGVybihzZWxmKToKKyAgICAgICAgIiIiQ29tcGlsZXMgc2VsZi5QQVRURVJOIGludG8gc2VsZi5wYXR0ZXJuLgorCisgICAgICAgIFN1YmNsYXNzIG1heSBvdmVycmlkZSBpZiBpdCBkb2Vzbid0IHdhbnQgdG8gdXNlCisgICAgICAgIHNlbGYue3BhdHRlcm4sUEFUVEVSTn0gaW4gLm1hdGNoKCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLlBBVFRFUk4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBQQyA9IFBhdHRlcm5Db21waWxlcigpCisgICAgICAgICAgICBzZWxmLnBhdHRlcm4sIHNlbGYucGF0dGVybl90cmVlID0gUEMuY29tcGlsZV9wYXR0ZXJuKHNlbGYuUEFUVEVSTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aF90cmVlPVRydWUpCisKKyAgICBkZWYgc2V0X2ZpbGVuYW1lKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiU2V0IHRoZSBmaWxlbmFtZSwgYW5kIGEgbG9nZ2VyIGRlcml2ZWQgZnJvbSBpdC4KKworICAgICAgICBUaGUgbWFpbiByZWZhY3RvcmluZyB0b29sIHNob3VsZCBjYWxsIHRoaXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihmaWxlbmFtZSkKKworICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKKyAgICAgICAgIiIiUmV0dXJucyBtYXRjaCBmb3IgYSBnaXZlbiBwYXJzZSB0cmVlIG5vZGUuCisKKyAgICAgICAgU2hvdWxkIHJldHVybiBhIHRydWUgb3IgZmFsc2Ugb2JqZWN0IChub3QgbmVjZXNzYXJpbHkgYSBib29sKS4KKyAgICAgICAgSXQgbWF5IHJldHVybiBhIG5vbi1lbXB0eSBkaWN0IG9mIG1hdGNoaW5nIHN1Yi1ub2RlcyBhcworICAgICAgICByZXR1cm5lZCBieSBhIG1hdGNoaW5nIHBhdHRlcm4uCisKKyAgICAgICAgU3ViY2xhc3MgbWF5IG92ZXJyaWRlLgorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0cyA9IHsibm9kZSI6IG5vZGV9CisgICAgICAgIHJldHVybiBzZWxmLnBhdHRlcm4ubWF0Y2gobm9kZSwgcmVzdWx0cykgYW5kIHJlc3VsdHMKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgICIiIlJldHVybnMgdGhlIHRyYW5zZm9ybWF0aW9uIGZvciBhIGdpdmVuIHBhcnNlIHRyZWUgbm9kZS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgIG5vZGU6IHRoZSByb290IG9mIHRoZSBwYXJzZSB0cmVlIHRoYXQgbWF0Y2hlZCB0aGUgZml4ZXIuCisgICAgICAgICAgcmVzdWx0czogYSBkaWN0IG1hcHBpbmcgc3ltYm9saWMgbmFtZXMgdG8gcGFydCBvZiB0aGUgbWF0Y2guCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICBOb25lLCBvciBhIG5vZGUgdGhhdCBpcyBhIG1vZGlmaWVkIGNvcHkgb2YgdGhlCisgICAgICAgICAgYXJndW1lbnQgbm9kZS4gIFRoZSBub2RlIGFyZ3VtZW50IG1heSBhbHNvIGJlIG1vZGlmaWVkIGluLXBsYWNlIHRvCisgICAgICAgICAgZWZmZWN0IHRoZSBzYW1lIGNoYW5nZS4KKworICAgICAgICBTdWJjbGFzcyAqbXVzdCogb3ZlcnJpZGUuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCkKKworICAgIGRlZiBuZXdfbmFtZShzZWxmLCB0ZW1wbGF0ZT11Inh4eF90b2RvX2NoYW5nZW1lIik6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIGlkZW50aWZpZXIKKworICAgICAgICBUaGUgbmV3IG5hbWUgaXMgZ3VhcmFudGVlZCBub3QgdG8gY29uZmxpY3Qgd2l0aCBvdGhlciBpZGVudGlmaWVycy4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSB0ZW1wbGF0ZQorICAgICAgICB3aGlsZSBuYW1lIGluIHNlbGYudXNlZF9uYW1lczoKKyAgICAgICAgICAgIG5hbWUgPSB0ZW1wbGF0ZSArIHVuaWNvZGUoc2VsZi5udW1iZXJzLm5leHQoKSkKKyAgICAgICAgc2VsZi51c2VkX25hbWVzLmFkZChuYW1lKQorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBpZiBzZWxmLmZpcnN0X2xvZzoKKyAgICAgICAgICAgIHNlbGYuZmlyc3RfbG9nID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYubG9nLmFwcGVuZCgiIyMjIEluIGZpbGUgJXMgIyMjIiAlIHNlbGYuZmlsZW5hbWUpCisgICAgICAgIHNlbGYubG9nLmFwcGVuZChtZXNzYWdlKQorCisgICAgZGVmIGNhbm5vdF9jb252ZXJ0KHNlbGYsIG5vZGUsIHJlYXNvbj1Ob25lKToKKyAgICAgICAgIiIiV2FybiB0aGUgdXNlciB0aGF0IGEgZ2l2ZW4gY2h1bmsgb2YgY29kZSBpcyBub3QgdmFsaWQgUHl0aG9uIDMsCisgICAgICAgIGJ1dCB0aGF0IGl0IGNhbm5vdCBiZSBjb252ZXJ0ZWQgYXV0b21hdGljYWxseS4KKworICAgICAgICBGaXJzdCBhcmd1bWVudCBpcyB0aGUgdG9wLWxldmVsIG5vZGUgZm9yIHRoZSBjb2RlIGluIHF1ZXN0aW9uLgorICAgICAgICBPcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgd2h5IGl0IGNhbid0IGJlIGNvbnZlcnRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVubyA9IG5vZGUuZ2V0X2xpbmVubygpCisgICAgICAgIGZvcl9vdXRwdXQgPSBub2RlLmNsb25lKCkKKyAgICAgICAgZm9yX291dHB1dC5wcmVmaXggPSB1IiIKKyAgICAgICAgbXNnID0gIkxpbmUgJWQ6IGNvdWxkIG5vdCBjb252ZXJ0OiAlcyIKKyAgICAgICAgc2VsZi5sb2dfbWVzc2FnZShtc2cgJSAobGluZW5vLCBmb3Jfb3V0cHV0KSkKKyAgICAgICAgaWYgcmVhc29uOgorICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZShyZWFzb24pCisKKyAgICBkZWYgd2FybmluZyhzZWxmLCBub2RlLCByZWFzb24pOgorICAgICAgICAiIiJVc2VkIGZvciB3YXJuaW5nIHRoZSB1c2VyIGFib3V0IHBvc3NpYmxlIHVuY2VydGFpbnR5IGluIHRoZQorICAgICAgICB0cmFuc2xhdGlvbi4KKworICAgICAgICBGaXJzdCBhcmd1bWVudCBpcyB0aGUgdG9wLWxldmVsIG5vZGUgZm9yIHRoZSBjb2RlIGluIHF1ZXN0aW9uLgorICAgICAgICBPcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgd2h5IGl0IGNhbid0IGJlIGNvbnZlcnRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVubyA9IG5vZGUuZ2V0X2xpbmVubygpCisgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIkxpbmUgJWQ6ICVzIiAlIChsaW5lbm8sIHJlYXNvbikpCisKKyAgICBkZWYgc3RhcnRfdHJlZShzZWxmLCB0cmVlLCBmaWxlbmFtZSk6CisgICAgICAgICIiIlNvbWUgZml4ZXJzIG5lZWQgdG8gbWFpbnRhaW4gdHJlZS13aWRlIHN0YXRlLgorICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSwgYXQgdGhlIHN0YXJ0IG9mIHRyZWUgZml4LXVwLgorCisgICAgICAgIHRyZWUgLSB0aGUgcm9vdCBub2RlIG9mIHRoZSB0cmVlIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgZmlsZW5hbWUgLSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0aGUgdHJlZSBjYW1lIGZyb20uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnVzZWRfbmFtZXMgPSB0cmVlLnVzZWRfbmFtZXMKKyAgICAgICAgc2VsZi5zZXRfZmlsZW5hbWUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYubnVtYmVycyA9IGl0ZXJ0b29scy5jb3VudCgxKQorICAgICAgICBzZWxmLmZpcnN0X2xvZyA9IFRydWUKKworICAgIGRlZiBmaW5pc2hfdHJlZShzZWxmLCB0cmVlLCBmaWxlbmFtZSk6CisgICAgICAgICIiIlNvbWUgZml4ZXJzIG5lZWQgdG8gbWFpbnRhaW4gdHJlZS13aWRlIHN0YXRlLgorICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSwgYXQgdGhlIGNvbmNsdXNpb24gb2YgdHJlZSBmaXgtdXAuCisKKyAgICAgICAgdHJlZSAtIHRoZSByb290IG5vZGUgb2YgdGhlIHRyZWUgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAgICBmaWxlbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoZSB0cmVlIGNhbWUgZnJvbS4KKyAgICAgICAgIiIiCisgICAgICAgIHBhc3MKKworCitjbGFzcyBDb25kaXRpb25hbEZpeChCYXNlRml4KToKKyAgICAiIiIgQmFzZSBjbGFzcyBmb3IgZml4ZXJzIHdoaWNoIG5vdCBleGVjdXRlIGlmIGFuIGltcG9ydCBpcyBmb3VuZC4gIiIiCisKKyAgICAjIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGltcG9ydCB3aGljaCwgaWYgZm91bmQsIHdpbGwgY2F1c2UgdGhlIHRlc3QgdG8gYmUgc2tpcHBlZAorICAgIHNraXBfb24gPSBOb25lCisKKyAgICBkZWYgc3RhcnRfdHJlZShzZWxmLCAqYXJncyk6CisgICAgICAgIHN1cGVyKENvbmRpdGlvbmFsRml4LCBzZWxmKS5zdGFydF90cmVlKCphcmdzKQorICAgICAgICBzZWxmLl9zaG91bGRfc2tpcCA9IE5vbmUKKworICAgIGRlZiBzaG91bGRfc2tpcChzZWxmLCBub2RlKToKKyAgICAgICAgaWYgc2VsZi5fc2hvdWxkX3NraXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2hvdWxkX3NraXAKKyAgICAgICAgcGtnID0gc2VsZi5za2lwX29uLnNwbGl0KCIuIikKKyAgICAgICAgbmFtZSA9IHBrZ1stMV0KKyAgICAgICAgcGtnID0gIi4iLmpvaW4ocGtnWzotMV0pCisgICAgICAgIHNlbGYuX3Nob3VsZF9za2lwID0gZG9lc190cmVlX2ltcG9ydChwa2csIG5hbWUsIG5vZGUpCisgICAgICAgIHJldHVybiBzZWxmLl9zaG91bGRfc2tpcApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGNjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfYmFzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX2Jhc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OGNjNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfYmFzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfdXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZkZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHkKQEAgLTAsMCArMSw0MzIgQEAKKyIiIlV0aWxpdHkgZnVuY3Rpb25zLCBub2RlIGNvbnN0cnVjdGlvbiBtYWNyb3MsIGV0Yy4iIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLnB5dHJlZSBpbXBvcnQgTGVhZiwgTm9kZQorZnJvbSAucHlncmFtIGltcG9ydCBweXRob25fc3ltYm9scyBhcyBzeW1zCitmcm9tIC4gaW1wb3J0IHBhdGNvbXAKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIENvbW1vbiBub2RlLWNvbnN0cnVjdGlvbiAibWFjcm9zIgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworZGVmIEtleXdvcmRBcmcoa2V5d29yZCwgdmFsdWUpOgorICAgIHJldHVybiBOb2RlKHN5bXMuYXJndW1lbnQsCisgICAgICAgICAgICAgICAgW2tleXdvcmQsIExlYWYodG9rZW4uRVFVQUwsIHUiPSIpLCB2YWx1ZV0pCisKK2RlZiBMUGFyZW4oKToKKyAgICByZXR1cm4gTGVhZih0b2tlbi5MUEFSLCB1IigiKQorCitkZWYgUlBhcmVuKCk6CisgICAgcmV0dXJuIExlYWYodG9rZW4uUlBBUiwgdSIpIikKKworZGVmIEFzc2lnbih0YXJnZXQsIHNvdXJjZSk6CisgICAgIiIiQnVpbGQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQiIiIKKyAgICBpZiBub3QgaXNpbnN0YW5jZSh0YXJnZXQsIGxpc3QpOgorICAgICAgICB0YXJnZXQgPSBbdGFyZ2V0XQorICAgIGlmIG5vdCBpc2luc3RhbmNlKHNvdXJjZSwgbGlzdCk6CisgICAgICAgIHNvdXJjZS5wcmVmaXggPSB1IiAiCisgICAgICAgIHNvdXJjZSA9IFtzb3VyY2VdCisKKyAgICByZXR1cm4gTm9kZShzeW1zLmF0b20sCisgICAgICAgICAgICAgICAgdGFyZ2V0ICsgW0xlYWYodG9rZW4uRVFVQUwsIHUiPSIsIHByZWZpeD11IiAiKV0gKyBzb3VyY2UpCisKK2RlZiBOYW1lKG5hbWUsIHByZWZpeD1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBOQU1FIGxlYWYiIiIKKyAgICByZXR1cm4gTGVhZih0b2tlbi5OQU1FLCBuYW1lLCBwcmVmaXg9cHJlZml4KQorCitkZWYgQXR0cihvYmosIGF0dHIpOgorICAgICIiIkEgbm9kZSB0dXBsZSBmb3Igb2JqLmF0dHIiIiIKKyAgICByZXR1cm4gW29iaiwgTm9kZShzeW1zLnRyYWlsZXIsIFtEb3QoKSwgYXR0cl0pXQorCitkZWYgQ29tbWEoKToKKyAgICAiIiJBIGNvbW1hIGxlYWYiIiIKKyAgICByZXR1cm4gTGVhZih0b2tlbi5DT01NQSwgdSIsIikKKworZGVmIERvdCgpOgorICAgICIiIkEgcGVyaW9kICguKSBsZWFmIiIiCisgICAgcmV0dXJuIExlYWYodG9rZW4uRE9ULCB1Ii4iKQorCitkZWYgQXJnTGlzdChhcmdzLCBscGFyZW49TFBhcmVuKCksIHJwYXJlbj1SUGFyZW4oKSk6CisgICAgIiIiQSBwYXJlbnRoZXNpc2VkIGFyZ3VtZW50IGxpc3QsIHVzZWQgYnkgQ2FsbCgpIiIiCisgICAgbm9kZSA9IE5vZGUoc3ltcy50cmFpbGVyLCBbbHBhcmVuLmNsb25lKCksIHJwYXJlbi5jbG9uZSgpXSkKKyAgICBpZiBhcmdzOgorICAgICAgICBub2RlLmluc2VydF9jaGlsZCgxLCBOb2RlKHN5bXMuYXJnbGlzdCwgYXJncykpCisgICAgcmV0dXJuIG5vZGUKKworZGVmIENhbGwoZnVuY19uYW1lLCBhcmdzPU5vbmUsIHByZWZpeD1Ob25lKToKKyAgICAiIiJBIGZ1bmN0aW9uIGNhbGwiIiIKKyAgICBub2RlID0gTm9kZShzeW1zLnBvd2VyLCBbZnVuY19uYW1lLCBBcmdMaXN0KGFyZ3MpXSkKKyAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgIG5vZGUucHJlZml4ID0gcHJlZml4CisgICAgcmV0dXJuIG5vZGUKKworZGVmIE5ld2xpbmUoKToKKyAgICAiIiJBIG5ld2xpbmUgbGl0ZXJhbCIiIgorICAgIHJldHVybiBMZWFmKHRva2VuLk5FV0xJTkUsIHUiXG4iKQorCitkZWYgQmxhbmtMaW5lKCk6CisgICAgIiIiQSBibGFuayBsaW5lIiIiCisgICAgcmV0dXJuIExlYWYodG9rZW4uTkVXTElORSwgdSIiKQorCitkZWYgTnVtYmVyKG4sIHByZWZpeD1Ob25lKToKKyAgICByZXR1cm4gTGVhZih0b2tlbi5OVU1CRVIsIG4sIHByZWZpeD1wcmVmaXgpCisKK2RlZiBTdWJzY3JpcHQoaW5kZXhfbm9kZSk6CisgICAgIiIiQSBudW1lcmljIG9yIHN0cmluZyBzdWJzY3JpcHQiIiIKKyAgICByZXR1cm4gTm9kZShzeW1zLnRyYWlsZXIsIFtMZWFmKHRva2VuLkxCUkFDRSwgdSJbIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWFmKHRva2VuLlJCUkFDRSwgdSJdIildKQorCitkZWYgU3RyaW5nKHN0cmluZywgcHJlZml4PU5vbmUpOgorICAgICIiIkEgc3RyaW5nIGxlYWYiIiIKKyAgICByZXR1cm4gTGVhZih0b2tlbi5TVFJJTkcsIHN0cmluZywgcHJlZml4PXByZWZpeCkKKworZGVmIExpc3RDb21wKHhwLCBmcCwgaXQsIHRlc3Q9Tm9uZSk6CisgICAgIiIiQSBsaXN0IGNvbXByZWhlbnNpb24gb2YgdGhlIGZvcm0gW3hwIGZvciBmcCBpbiBpdCBpZiB0ZXN0XS4KKworICAgIElmIHRlc3QgaXMgTm9uZSwgdGhlICJpZiB0ZXN0IiBwYXJ0IGlzIG9taXR0ZWQuCisgICAgIiIiCisgICAgeHAucHJlZml4ID0gdSIiCisgICAgZnAucHJlZml4ID0gdSIgIgorICAgIGl0LnByZWZpeCA9IHUiICIKKyAgICBmb3JfbGVhZiA9IExlYWYodG9rZW4uTkFNRSwgdSJmb3IiKQorICAgIGZvcl9sZWFmLnByZWZpeCA9IHUiICIKKyAgICBpbl9sZWFmID0gTGVhZih0b2tlbi5OQU1FLCB1ImluIikKKyAgICBpbl9sZWFmLnByZWZpeCA9IHUiICIKKyAgICBpbm5lcl9hcmdzID0gW2Zvcl9sZWFmLCBmcCwgaW5fbGVhZiwgaXRdCisgICAgaWYgdGVzdDoKKyAgICAgICAgdGVzdC5wcmVmaXggPSB1IiAiCisgICAgICAgIGlmX2xlYWYgPSBMZWFmKHRva2VuLk5BTUUsIHUiaWYiKQorICAgICAgICBpZl9sZWFmLnByZWZpeCA9IHUiICIKKyAgICAgICAgaW5uZXJfYXJncy5hcHBlbmQoTm9kZShzeW1zLmNvbXBfaWYsIFtpZl9sZWFmLCB0ZXN0XSkpCisgICAgaW5uZXIgPSBOb2RlKHN5bXMubGlzdG1ha2VyLCBbeHAsIE5vZGUoc3ltcy5jb21wX2ZvciwgaW5uZXJfYXJncyldKQorICAgIHJldHVybiBOb2RlKHN5bXMuYXRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgW0xlYWYodG9rZW4uTEJSQUNFLCB1IlsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgTGVhZih0b2tlbi5SQlJBQ0UsIHUiXSIpXSkKKworZGVmIEZyb21JbXBvcnQocGFja2FnZV9uYW1lLCBuYW1lX2xlYWZzKToKKyAgICAiIiIgUmV0dXJuIGFuIGltcG9ydCBzdGF0ZW1lbnQgaW4gdGhlIGZvcm06CisgICAgICAgIGZyb20gcGFja2FnZSBpbXBvcnQgbmFtZV9sZWFmcyIiIgorICAgICMgWFhYOiBNYXkgbm90IGhhbmRsZSBkb3R0ZWQgaW1wb3J0cyBwcm9wZXJseSAoZWcsIHBhY2thZ2VfbmFtZT0nZm9vLmJhcicpCisgICAgI2Fzc2VydCBwYWNrYWdlX25hbWUgPT0gJy4nIG9yICcuJyBub3QgaW4gcGFja2FnZV9uYW1lLCAiRnJvbUltcG9ydCBoYXMgIlwKKyAgICAjICAgICAgICJub3QgYmVlbiB0ZXN0ZWQgd2l0aCBkb3R0ZWQgcGFja2FnZSBuYW1lcyAtLSB1c2UgYXQgeW91ciBvd24gIlwKKyAgICAjICAgICAgICJwZXJpbCEiCisKKyAgICBmb3IgbGVhZiBpbiBuYW1lX2xlYWZzOgorICAgICAgICAjIFB1bGwgdGhlIGxlYXZlcyBvdXQgb2YgdGhlaXIgb2xkIHRyZWUKKyAgICAgICAgbGVhZi5yZW1vdmUoKQorCisgICAgY2hpbGRyZW4gPSBbTGVhZih0b2tlbi5OQU1FLCB1ImZyb20iKSwKKyAgICAgICAgICAgICAgICBMZWFmKHRva2VuLk5BTUUsIHBhY2thZ2VfbmFtZSwgcHJlZml4PXUiICIpLAorICAgICAgICAgICAgICAgIExlYWYodG9rZW4uTkFNRSwgdSJpbXBvcnQiLCBwcmVmaXg9dSIgIiksCisgICAgICAgICAgICAgICAgTm9kZShzeW1zLmltcG9ydF9hc19uYW1lcywgbmFtZV9sZWFmcyldCisgICAgaW1wID0gTm9kZShzeW1zLmltcG9ydF9mcm9tLCBjaGlsZHJlbikKKyAgICByZXR1cm4gaW1wCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBEZXRlcm1pbmUgd2hldGhlciBhIG5vZGUgcmVwcmVzZW50cyBhIGdpdmVuIGxpdGVyYWwKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2RlZiBpc190dXBsZShub2RlKToKKyAgICAiIiJEb2VzIHRoZSBub2RlIHJlcHJlc2VudCBhIHR1cGxlIGxpdGVyYWw/IiIiCisgICAgaWYgaXNpbnN0YW5jZShub2RlLCBOb2RlKSBhbmQgbm9kZS5jaGlsZHJlbiA9PSBbTFBhcmVuKCksIFJQYXJlbigpXToKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gKGlzaW5zdGFuY2Uobm9kZSwgTm9kZSkKKyAgICAgICAgICAgIGFuZCBsZW4obm9kZS5jaGlsZHJlbikgPT0gMworICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5jaGlsZHJlblswXSwgTGVhZikKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUuY2hpbGRyZW5bMV0sIE5vZGUpCisgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShub2RlLmNoaWxkcmVuWzJdLCBMZWFmKQorICAgICAgICAgICAgYW5kIG5vZGUuY2hpbGRyZW5bMF0udmFsdWUgPT0gdSIoIgorICAgICAgICAgICAgYW5kIG5vZGUuY2hpbGRyZW5bMl0udmFsdWUgPT0gdSIpIikKKworZGVmIGlzX2xpc3Qobm9kZSk6CisgICAgIiIiRG9lcyB0aGUgbm9kZSByZXByZXNlbnQgYSBsaXN0IGxpdGVyYWw/IiIiCisgICAgcmV0dXJuIChpc2luc3RhbmNlKG5vZGUsIE5vZGUpCisgICAgICAgICAgICBhbmQgbGVuKG5vZGUuY2hpbGRyZW4pID4gMQorICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uobm9kZS5jaGlsZHJlblswXSwgTGVhZikKKyAgICAgICAgICAgIGFuZCBpc2luc3RhbmNlKG5vZGUuY2hpbGRyZW5bLTFdLCBMZWFmKQorICAgICAgICAgICAgYW5kIG5vZGUuY2hpbGRyZW5bMF0udmFsdWUgPT0gdSJbIgorICAgICAgICAgICAgYW5kIG5vZGUuY2hpbGRyZW5bLTFdLnZhbHVlID09IHUiXSIpCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBNaXNjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgcGFyZW50aGVzaXplKG5vZGUpOgorICAgIHJldHVybiBOb2RlKHN5bXMuYXRvbSwgW0xQYXJlbigpLCBub2RlLCBSUGFyZW4oKV0pCisKKworY29uc3VtaW5nX2NhbGxzID0gc2V0KFsic29ydGVkIiwgImxpc3QiLCAic2V0IiwgImFueSIsICJhbGwiLCAidHVwbGUiLCAic3VtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm1pbiIsICJtYXgiLCAiZW51bWVyYXRlIl0pCisKK2RlZiBhdHRyX2NoYWluKG9iaiwgYXR0cik6CisgICAgIiIiRm9sbG93IGFuIGF0dHJpYnV0ZSBjaGFpbi4KKworICAgIElmIHlvdSBoYXZlIGEgY2hhaW4gb2Ygb2JqZWN0cyB3aGVyZSBhLmZvbyAtPiBiLCBiLmZvby0+IGMsIGV0YywKKyAgICB1c2UgdGhpcyB0byBpdGVyYXRlIG92ZXIgYWxsIG9iamVjdHMgaW4gdGhlIGNoYWluLiBJdGVyYXRpb24gaXMKKyAgICB0ZXJtaW5hdGVkIGJ5IGdldGF0dHIoeCwgYXR0cikgaXMgTm9uZS4KKworICAgIEFyZ3M6CisgICAgICAgIG9iajogdGhlIHN0YXJ0aW5nIG9iamVjdAorICAgICAgICBhdHRyOiB0aGUgbmFtZSBvZiB0aGUgY2hhaW5pbmcgYXR0cmlidXRlCisKKyAgICBZaWVsZHM6CisgICAgICAgIEVhY2ggc3VjY2Vzc2l2ZSBvYmplY3QgaW4gdGhlIGNoYWluLgorICAgICIiIgorICAgIG5leHQgPSBnZXRhdHRyKG9iaiwgYXR0cikKKyAgICB3aGlsZSBuZXh0OgorICAgICAgICB5aWVsZCBuZXh0CisgICAgICAgIG5leHQgPSBnZXRhdHRyKG5leHQsIGF0dHIpCisKK3AwID0gIiIiZm9yX3N0bXQ8ICdmb3InIGFueSAnaW4nIG5vZGU9YW55ICc6JyBhbnkqID4KKyAgICAgICAgfCBjb21wX2ZvcjwgJ2ZvcicgYW55ICdpbicgbm9kZT1hbnkgYW55KiA+CisgICAgICIiIgorcDEgPSAiIiIKK3Bvd2VyPAorICAgICggJ2l0ZXInIHwgJ2xpc3QnIHwgJ3R1cGxlJyB8ICdzb3J0ZWQnIHwgJ3NldCcgfCAnc3VtJyB8CisgICAgICAnYW55JyB8ICdhbGwnIHwgJ2VudW1lcmF0ZScgfCAoYW55KiB0cmFpbGVyPCAnLicgJ2pvaW4nID4pICkKKyAgICB0cmFpbGVyPCAnKCcgbm9kZT1hbnkgJyknID4KKyAgICBhbnkqCis+CisiIiIKK3AyID0gIiIiCitwb3dlcjwKKyAgICAoICdzb3J0ZWQnIHwgJ2VudW1lcmF0ZScgKQorICAgIHRyYWlsZXI8ICcoJyBhcmdsaXN0PG5vZGU9YW55IGFueSo+ICcpJyA+CisgICAgYW55KgorPgorIiIiCitwYXRzX2J1aWx0ID0gRmFsc2UKK2RlZiBpbl9zcGVjaWFsX2NvbnRleHQobm9kZSk6CisgICAgIiIiIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGluIGFuIGVudmlyb25tZW50IHdoZXJlIGFsbCB0aGF0IGlzIHJlcXVpcmVkCisgICAgICAgIG9mIGl0IGlzIGJlaW5nIGl0ZXJhYmxlIChpZSwgaXQgZG9lc24ndCBtYXR0ZXIgaWYgaXQgcmV0dXJucyBhIGxpc3QKKyAgICAgICAgb3IgYW4gaXRlcmF0b3IpLgorICAgICAgICBTZWUgdGVzdF9tYXBfbm9jaGFuZ2UgaW4gdGVzdF9maXhlcnMucHkgZm9yIHNvbWUgZXhhbXBsZXMgYW5kIHRlc3RzLgorICAgICAgICAiIiIKKyAgICBnbG9iYWwgcDAsIHAxLCBwMiwgcGF0c19idWlsdAorICAgIGlmIG5vdCBwYXRzX2J1aWx0OgorICAgICAgICBwMCA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKHAwKQorICAgICAgICBwMSA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKHAxKQorICAgICAgICBwMiA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKHAyKQorICAgICAgICBwYXRzX2J1aWx0ID0gVHJ1ZQorICAgIHBhdHRlcm5zID0gW3AwLCBwMSwgcDJdCisgICAgZm9yIHBhdHRlcm4sIHBhcmVudCBpbiB6aXAocGF0dGVybnMsIGF0dHJfY2hhaW4obm9kZSwgInBhcmVudCIpKToKKyAgICAgICAgcmVzdWx0cyA9IHt9CisgICAgICAgIGlmIHBhdHRlcm4ubWF0Y2gocGFyZW50LCByZXN1bHRzKSBhbmQgcmVzdWx0c1sibm9kZSJdIGlzIG5vZGU6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCitkZWYgaXNfcHJvYmFibHlfYnVpbHRpbihub2RlKToKKyAgICAiIiIKKyAgICBDaGVjayB0aGF0IHNvbWV0aGluZyBpc24ndCBhbiBhdHRyaWJ1dGUgb3IgZnVuY3Rpb24gbmFtZSBldGMuCisgICAgIiIiCisgICAgcHJldiA9IG5vZGUucHJldl9zaWJsaW5nCisgICAgaWYgcHJldiBpcyBub3QgTm9uZSBhbmQgcHJldi50eXBlID09IHRva2VuLkRPVDoKKyAgICAgICAgIyBBdHRyaWJ1dGUgbG9va3VwLgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBwYXJlbnQgPSBub2RlLnBhcmVudAorICAgIGlmIHBhcmVudC50eXBlIGluIChzeW1zLmZ1bmNkZWYsIHN5bXMuY2xhc3NkZWYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBwYXJlbnQudHlwZSA9PSBzeW1zLmV4cHJfc3RtdCBhbmQgcGFyZW50LmNoaWxkcmVuWzBdIGlzIG5vZGU6CisgICAgICAgICMgQXNzaWdubWVudC4KKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgcGFyZW50LnR5cGUgPT0gc3ltcy5wYXJhbWV0ZXJzIG9yIFwKKyAgICAgICAgICAgIChwYXJlbnQudHlwZSA9PSBzeW1zLnR5cGVkYXJnc2xpc3QgYW5kICgKKyAgICAgICAgICAgIChwcmV2IGlzIG5vdCBOb25lIGFuZCBwcmV2LnR5cGUgPT0gdG9rZW4uQ09NTUEpIG9yCisgICAgICAgICAgICBwYXJlbnQuY2hpbGRyZW5bMF0gaXMgbm9kZQorICAgICAgICAgICAgKSk6CisgICAgICAgICMgVGhlIG5hbWUgb2YgYW4gYXJndW1lbnQuCisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHJldHVybiBUcnVlCisKK2RlZiBmaW5kX2luZGVudGF0aW9uKG5vZGUpOgorICAgICIiIkZpbmQgdGhlIGluZGVudGF0aW9uIG9mICpub2RlKi4iIiIKKyAgICB3aGlsZSBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5zdWl0ZSBhbmQgbGVuKG5vZGUuY2hpbGRyZW4pID4gMjoKKyAgICAgICAgICAgIGluZGVudCA9IG5vZGUuY2hpbGRyZW5bMV0KKyAgICAgICAgICAgIGlmIGluZGVudC50eXBlID09IHRva2VuLklOREVOVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5kZW50LnZhbHVlCisgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudAorICAgIHJldHVybiB1IiIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdG8gZmluZCBiaW5kaW5ncyBpbiBhIHN1aXRlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgbWFrZV9zdWl0ZShub2RlKToKKyAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5zdWl0ZToKKyAgICAgICAgcmV0dXJuIG5vZGUKKyAgICBub2RlID0gbm9kZS5jbG9uZSgpCisgICAgcGFyZW50LCBub2RlLnBhcmVudCA9IG5vZGUucGFyZW50LCBOb25lCisgICAgc3VpdGUgPSBOb2RlKHN5bXMuc3VpdGUsIFtub2RlXSkKKyAgICBzdWl0ZS5wYXJlbnQgPSBwYXJlbnQKKyAgICByZXR1cm4gc3VpdGUKKworZGVmIGZpbmRfcm9vdChub2RlKToKKyAgICAiIiJGaW5kIHRoZSB0b3AgbGV2ZWwgbmFtZXNwYWNlLiIiIgorICAgICMgU2NhbXBlciB1cCB0byB0aGUgdG9wIGxldmVsIG5hbWVzcGFjZQorICAgIHdoaWxlIG5vZGUudHlwZSAhPSBzeW1zLmZpbGVfaW5wdXQ6CisgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudAorICAgICAgICBpZiBub3Qgbm9kZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJvb3QgZm91bmQgYmVmb3JlIGZpbGVfaW5wdXQgbm9kZSB3YXMgZm91bmQuIikKKyAgICByZXR1cm4gbm9kZQorCitkZWYgZG9lc190cmVlX2ltcG9ydChwYWNrYWdlLCBuYW1lLCBub2RlKToKKyAgICAiIiIgUmV0dXJucyB0cnVlIGlmIG5hbWUgaXMgaW1wb3J0ZWQgZnJvbSBwYWNrYWdlIGF0IHRoZQorICAgICAgICB0b3AgbGV2ZWwgb2YgdGhlIHRyZWUgd2hpY2ggbm9kZSBiZWxvbmdzIHRvLgorICAgICAgICBUbyBjb3ZlciB0aGUgY2FzZSBvZiBhbiBpbXBvcnQgbGlrZSAnaW1wb3J0IGZvbycsIHVzZQorICAgICAgICBOb25lIGZvciB0aGUgcGFja2FnZSBhbmQgJ2ZvbycgZm9yIHRoZSBuYW1lLiAiIiIKKyAgICBiaW5kaW5nID0gZmluZF9iaW5kaW5nKG5hbWUsIGZpbmRfcm9vdChub2RlKSwgcGFja2FnZSkKKyAgICByZXR1cm4gYm9vbChiaW5kaW5nKQorCitkZWYgaXNfaW1wb3J0KG5vZGUpOgorICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhbiBpbXBvcnQgc3RhdGVtZW50LiIiIgorICAgIHJldHVybiBub2RlLnR5cGUgaW4gKHN5bXMuaW1wb3J0X25hbWUsIHN5bXMuaW1wb3J0X2Zyb20pCisKK2RlZiB0b3VjaF9pbXBvcnQocGFja2FnZSwgbmFtZSwgbm9kZSk6CisgICAgIiIiIFdvcmtzIGxpa2UgYGRvZXNfdHJlZV9pbXBvcnRgIGJ1dCBhZGRzIGFuIGltcG9ydCBzdGF0ZW1lbnQKKyAgICAgICAgaWYgaXQgd2FzIG5vdCBpbXBvcnRlZC4gIiIiCisgICAgZGVmIGlzX2ltcG9ydF9zdG10KG5vZGUpOgorICAgICAgICByZXR1cm4gKG5vZGUudHlwZSA9PSBzeW1zLnNpbXBsZV9zdG10IGFuZCBub2RlLmNoaWxkcmVuIGFuZAorICAgICAgICAgICAgICAgIGlzX2ltcG9ydChub2RlLmNoaWxkcmVuWzBdKSkKKworICAgIHJvb3QgPSBmaW5kX3Jvb3Qobm9kZSkKKworICAgIGlmIGRvZXNfdHJlZV9pbXBvcnQocGFja2FnZSwgbmFtZSwgcm9vdCk6CisgICAgICAgIHJldHVybgorCisgICAgIyBmaWd1cmUgb3V0IHdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGltcG9ydC4gIEZpcnN0IHRyeSB0byBmaW5kCisgICAgIyB0aGUgZmlyc3QgaW1wb3J0IGFuZCB0aGVuIHNraXAgdG8gdGhlIGxhc3Qgb25lLgorICAgIGluc2VydF9wb3MgPSBvZmZzZXQgPSAwCisgICAgZm9yIGlkeCwgbm9kZSBpbiBlbnVtZXJhdGUocm9vdC5jaGlsZHJlbik6CisgICAgICAgIGlmIG5vdCBpc19pbXBvcnRfc3RtdChub2RlKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBvZmZzZXQsIG5vZGUyIGluIGVudW1lcmF0ZShyb290LmNoaWxkcmVuW2lkeDpdKToKKyAgICAgICAgICAgIGlmIG5vdCBpc19pbXBvcnRfc3RtdChub2RlMik6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaW5zZXJ0X3BvcyA9IGlkeCArIG9mZnNldAorICAgICAgICBicmVhaworCisgICAgIyBpZiB0aGVyZSBhcmUgbm8gaW1wb3J0cyB3aGVyZSB3ZSBjYW4gaW5zZXJ0LCBmaW5kIHRoZSBkb2NzdHJpbmcuCisgICAgIyBpZiB0aGF0IGFsc28gZmFpbHMsIHdlIHN0aWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUKKyAgICBpZiBpbnNlcnRfcG9zID09IDA6CisgICAgICAgIGZvciBpZHgsIG5vZGUgaW4gZW51bWVyYXRlKHJvb3QuY2hpbGRyZW4pOgorICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PSBzeW1zLnNpbXBsZV9zdG10IGFuZCBub2RlLmNoaWxkcmVuIGFuZAorICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlblswXS50eXBlID09IHRva2VuLlNUUklORyk6CisgICAgICAgICAgICAgICAgaW5zZXJ0X3BvcyA9IGlkeCArIDEKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgaWYgcGFja2FnZSBpcyBOb25lOgorICAgICAgICBpbXBvcnRfID0gTm9kZShzeW1zLmltcG9ydF9uYW1lLCBbCisgICAgICAgICAgICBMZWFmKHRva2VuLk5BTUUsIHUiaW1wb3J0IiksCisgICAgICAgICAgICBMZWFmKHRva2VuLk5BTUUsIG5hbWUsIHByZWZpeD11IiAiKQorICAgICAgICBdKQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydF8gPSBGcm9tSW1wb3J0KHBhY2thZ2UsIFtMZWFmKHRva2VuLk5BTUUsIG5hbWUsIHByZWZpeD11IiAiKV0pCisKKyAgICBjaGlsZHJlbiA9IFtpbXBvcnRfLCBOZXdsaW5lKCldCisgICAgcm9vdC5pbnNlcnRfY2hpbGQoaW5zZXJ0X3BvcywgTm9kZShzeW1zLnNpbXBsZV9zdG10LCBjaGlsZHJlbikpCisKKworX2RlZl9zeW1zID0gc2V0KFtzeW1zLmNsYXNzZGVmLCBzeW1zLmZ1bmNkZWZdKQorZGVmIGZpbmRfYmluZGluZyhuYW1lLCBub2RlLCBwYWNrYWdlPU5vbmUpOgorICAgICIiIiBSZXR1cm5zIHRoZSBub2RlIHdoaWNoIGJpbmRzIHZhcmlhYmxlIG5hbWUsIG90aGVyd2lzZSBOb25lLgorICAgICAgICBJZiBvcHRpb25hbCBhcmd1bWVudCBwYWNrYWdlIGlzIHN1cHBsaWVkLCBvbmx5IGltcG9ydHMgd2lsbAorICAgICAgICBiZSByZXR1cm5lZC4KKyAgICAgICAgU2VlIHRlc3QgY2FzZXMgZm9yIGV4YW1wbGVzLiIiIgorICAgIGZvciBjaGlsZCBpbiBub2RlLmNoaWxkcmVuOgorICAgICAgICByZXQgPSBOb25lCisgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gc3ltcy5mb3Jfc3RtdDoKKyAgICAgICAgICAgIGlmIF9maW5kKG5hbWUsIGNoaWxkLmNoaWxkcmVuWzFdKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQKKyAgICAgICAgICAgIG4gPSBmaW5kX2JpbmRpbmcobmFtZSwgbWFrZV9zdWl0ZShjaGlsZC5jaGlsZHJlblstMV0pLCBwYWNrYWdlKQorICAgICAgICAgICAgaWYgbjogcmV0ID0gbgorICAgICAgICBlbGlmIGNoaWxkLnR5cGUgaW4gKHN5bXMuaWZfc3RtdCwgc3ltcy53aGlsZV9zdG10KToKKyAgICAgICAgICAgIG4gPSBmaW5kX2JpbmRpbmcobmFtZSwgbWFrZV9zdWl0ZShjaGlsZC5jaGlsZHJlblstMV0pLCBwYWNrYWdlKQorICAgICAgICAgICAgaWYgbjogcmV0ID0gbgorICAgICAgICBlbGlmIGNoaWxkLnR5cGUgPT0gc3ltcy50cnlfc3RtdDoKKyAgICAgICAgICAgIG4gPSBmaW5kX2JpbmRpbmcobmFtZSwgbWFrZV9zdWl0ZShjaGlsZC5jaGlsZHJlblsyXSksIHBhY2thZ2UpCisgICAgICAgICAgICBpZiBuOgorICAgICAgICAgICAgICAgIHJldCA9IG4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIGksIGtpZCBpbiBlbnVtZXJhdGUoY2hpbGQuY2hpbGRyZW5bMzpdKToKKyAgICAgICAgICAgICAgICAgICAgaWYga2lkLnR5cGUgPT0gdG9rZW4uQ09MT04gYW5kIGtpZC52YWx1ZSA9PSAiOiI6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGkrMyBpcyB0aGUgY29sb24sIGkrNCBpcyB0aGUgc3VpdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBmaW5kX2JpbmRpbmcobmFtZSwgbWFrZV9zdWl0ZShjaGlsZC5jaGlsZHJlbltpKzRdKSwgcGFja2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG46IHJldCA9IG4KKyAgICAgICAgZWxpZiBjaGlsZC50eXBlIGluIF9kZWZfc3ltcyBhbmQgY2hpbGQuY2hpbGRyZW5bMV0udmFsdWUgPT0gbmFtZToKKyAgICAgICAgICAgIHJldCA9IGNoaWxkCisgICAgICAgIGVsaWYgX2lzX2ltcG9ydF9iaW5kaW5nKGNoaWxkLCBuYW1lLCBwYWNrYWdlKToKKyAgICAgICAgICAgIHJldCA9IGNoaWxkCisgICAgICAgIGVsaWYgY2hpbGQudHlwZSA9PSBzeW1zLnNpbXBsZV9zdG10OgorICAgICAgICAgICAgcmV0ID0gZmluZF9iaW5kaW5nKG5hbWUsIGNoaWxkLCBwYWNrYWdlKQorICAgICAgICBlbGlmIGNoaWxkLnR5cGUgPT0gc3ltcy5leHByX3N0bXQ6CisgICAgICAgICAgICBpZiBfZmluZChuYW1lLCBjaGlsZC5jaGlsZHJlblswXSk6CisgICAgICAgICAgICAgICAgcmV0ID0gY2hpbGQKKworICAgICAgICBpZiByZXQ6CisgICAgICAgICAgICBpZiBub3QgcGFja2FnZToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgICAgICAgICBpZiBpc19pbXBvcnQocmV0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0CisgICAgcmV0dXJuIE5vbmUKKworX2Jsb2NrX3N5bXMgPSBzZXQoW3N5bXMuZnVuY2RlZiwgc3ltcy5jbGFzc2RlZiwgc3ltcy50cmFpbGVyXSkKK2RlZiBfZmluZChuYW1lLCBub2RlKToKKyAgICBub2RlcyA9IFtub2RlXQorICAgIHdoaWxlIG5vZGVzOgorICAgICAgICBub2RlID0gbm9kZXMucG9wKCkKKyAgICAgICAgaWYgbm9kZS50eXBlID4gMjU2IGFuZCBub2RlLnR5cGUgbm90IGluIF9ibG9ja19zeW1zOgorICAgICAgICAgICAgbm9kZXMuZXh0ZW5kKG5vZGUuY2hpbGRyZW4pCisgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHRva2VuLk5BTUUgYW5kIG5vZGUudmFsdWUgPT0gbmFtZToKKyAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgcmV0dXJuIE5vbmUKKworZGVmIF9pc19pbXBvcnRfYmluZGluZyhub2RlLCBuYW1lLCBwYWNrYWdlPU5vbmUpOgorICAgICIiIiBXaWxsIHJldXR1cm4gbm9kZSBpZiBub2RlIHdpbGwgaW1wb3J0IG5hbWUsIG9yIG5vZGUKKyAgICAgICAgd2lsbCBpbXBvcnQgKiBmcm9tIHBhY2thZ2UuICBOb25lIGlzIHJldHVybmVkIG90aGVyd2lzZS4KKyAgICAgICAgU2VlIHRlc3QgY2FzZXMgZm9yIGV4YW1wbGVzLiAiIiIKKworICAgIGlmIG5vZGUudHlwZSA9PSBzeW1zLmltcG9ydF9uYW1lIGFuZCBub3QgcGFja2FnZToKKyAgICAgICAgaW1wID0gbm9kZS5jaGlsZHJlblsxXQorICAgICAgICBpZiBpbXAudHlwZSA9PSBzeW1zLmRvdHRlZF9hc19uYW1lczoKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBpbXAuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSBzeW1zLmRvdHRlZF9hc19uYW1lOgorICAgICAgICAgICAgICAgICAgICBpZiBjaGlsZC5jaGlsZHJlblsyXS52YWx1ZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgICAgICAgICAgICBlbGlmIGNoaWxkLnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgY2hpbGQudmFsdWUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgICAgZWxpZiBpbXAudHlwZSA9PSBzeW1zLmRvdHRlZF9hc19uYW1lOgorICAgICAgICAgICAgbGFzdCA9IGltcC5jaGlsZHJlblstMV0KKyAgICAgICAgICAgIGlmIGxhc3QudHlwZSA9PSB0b2tlbi5OQU1FIGFuZCBsYXN0LnZhbHVlID09IG5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgICAgZWxpZiBpbXAudHlwZSA9PSB0b2tlbi5OQU1FIGFuZCBpbXAudmFsdWUgPT0gbmFtZToKKyAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgZWxpZiBub2RlLnR5cGUgPT0gc3ltcy5pbXBvcnRfZnJvbToKKyAgICAgICAgIyB1bmljb2RlKC4uLikgaXMgdXNlZCB0byBtYWtlIGxpZmUgZWFzaWVyIGhlcmUsIGJlY2F1c2UKKyAgICAgICAgIyBmcm9tIGEuYiBpbXBvcnQgcGFyc2VzIHRvIFsnaW1wb3J0JywgWydhJywgJy4nLCAnYiddLCAuLi5dCisgICAgICAgIGlmIHBhY2thZ2UgYW5kIHVuaWNvZGUobm9kZS5jaGlsZHJlblsxXSkuc3RyaXAoKSAhPSBwYWNrYWdlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgbiA9IG5vZGUuY2hpbGRyZW5bM10KKyAgICAgICAgaWYgcGFja2FnZSBhbmQgX2ZpbmQodSJhcyIsIG4pOgorICAgICAgICAgICAgIyBTZWUgdGVzdF9mcm9tX2ltcG9ydF9hcyBmb3IgZXhwbGFuYXRpb24KKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsaWYgbi50eXBlID09IHN5bXMuaW1wb3J0X2FzX25hbWVzIGFuZCBfZmluZChuYW1lLCBuKToKKyAgICAgICAgICAgIHJldHVybiBub2RlCisgICAgICAgIGVsaWYgbi50eXBlID09IHN5bXMuaW1wb3J0X2FzX25hbWU6CisgICAgICAgICAgICBjaGlsZCA9IG4uY2hpbGRyZW5bMl0KKyAgICAgICAgICAgIGlmIGNoaWxkLnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgY2hpbGQudmFsdWUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZQorICAgICAgICBlbGlmIG4udHlwZSA9PSB0b2tlbi5OQU1FIGFuZCBuLnZhbHVlID09IG5hbWU6CisgICAgICAgICAgICByZXR1cm4gbm9kZQorICAgICAgICBlbGlmIHBhY2thZ2UgYW5kIG4udHlwZSA9PSB0b2tlbi5TVEFSOgorICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjAxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfdXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVyX3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYjAxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXJfdXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzA1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorIyBEdW1teSBmaWxlIHRvIG1ha2UgdGhpcyBkaXJlY3RvcnkgYSBwYWNrYWdlLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlOTE2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlOTE2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9hcHBseS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdkYzNhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHkKQEAgLTAsMCArMSw1OSBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciBmb3IgYXBwbHkoKS4KKworVGhpcyBjb252ZXJ0cyBhcHBseShmdW5jLCB2LCBrKSBpbnRvIChmdW5jKSgqdiwgKiprKS4iIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBDYWxsLCBDb21tYSwgcGFyZW50aGVzaXplCisKK2NsYXNzIEZpeEFwcGx5KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwgJ2FwcGx5JworICAgICAgICB0cmFpbGVyPAorICAgICAgICAgICAgJygnCisgICAgICAgICAgICBhcmdsaXN0PAorICAgICAgICAgICAgICAgIChub3QgYXJndW1lbnQ8TkFNRSAnPScgYW55PikgZnVuYz1hbnkgJywnCisgICAgICAgICAgICAgICAgKG5vdCBhcmd1bWVudDxOQU1FICc9JyBhbnk+KSBhcmdzPWFueSBbJywnCisgICAgICAgICAgICAgICAgKG5vdCBhcmd1bWVudDxOQU1FICc9JyBhbnk+KSBrd2RzPWFueV0gWycsJ10KKyAgICAgICAgICAgID4KKyAgICAgICAgICAgICcpJworICAgICAgICA+CisgICAgPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgc3ltcyA9IHNlbGYuc3ltcworICAgICAgICBhc3NlcnQgcmVzdWx0cworICAgICAgICBmdW5jID0gcmVzdWx0c1siZnVuYyJdCisgICAgICAgIGFyZ3MgPSByZXN1bHRzWyJhcmdzIl0KKyAgICAgICAga3dkcyA9IHJlc3VsdHMuZ2V0KCJrd2RzIikKKyAgICAgICAgcHJlZml4ID0gbm9kZS5wcmVmaXgKKyAgICAgICAgZnVuYyA9IGZ1bmMuY2xvbmUoKQorICAgICAgICBpZiAoZnVuYy50eXBlIG5vdCBpbiAodG9rZW4uTkFNRSwgc3ltcy5hdG9tKSBhbmQKKyAgICAgICAgICAgIChmdW5jLnR5cGUgIT0gc3ltcy5wb3dlciBvcgorICAgICAgICAgICAgIGZ1bmMuY2hpbGRyZW5bLTJdLnR5cGUgPT0gdG9rZW4uRE9VQkxFU1RBUikpOgorICAgICAgICAgICAgIyBOZWVkIHRvIHBhcmVudGhlc2l6ZQorICAgICAgICAgICAgZnVuYyA9IHBhcmVudGhlc2l6ZShmdW5jKQorICAgICAgICBmdW5jLnByZWZpeCA9ICIiCisgICAgICAgIGFyZ3MgPSBhcmdzLmNsb25lKCkKKyAgICAgICAgYXJncy5wcmVmaXggPSAiIgorICAgICAgICBpZiBrd2RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAga3dkcyA9IGt3ZHMuY2xvbmUoKQorICAgICAgICAgICAga3dkcy5wcmVmaXggPSAiIgorICAgICAgICBsX25ld2FyZ3MgPSBbcHl0cmVlLkxlYWYodG9rZW4uU1RBUiwgdSIqIiksIGFyZ3NdCisgICAgICAgIGlmIGt3ZHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsX25ld2FyZ3MuZXh0ZW5kKFtDb21tYSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0cmVlLkxlYWYodG9rZW4uRE9VQkxFU1RBUiwgdSIqKiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3dkc10pCisgICAgICAgICAgICBsX25ld2FyZ3NbLTJdLnByZWZpeCA9IHUiICIgIyB0aGF0J3MgdGhlICoqIHRva2VuCisgICAgICAgICMgWFhYIFNvbWV0aW1lcyB3ZSBjb3VsZCBiZSBjbGV2ZXJlciwgZS5nLiBhcHBseShmLCAoeCwgeSkgKyB0KQorICAgICAgICAjIGNhbiBiZSB0cmFuc2xhdGVkIGludG8gZih4LCB5LCAqdCkgaW5zdGVhZCBvZiBmKCooeCwgeSkgKyB0KQorICAgICAgICAjbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwgKGZ1bmMsIEFyZ0xpc3QobF9uZXdhcmdzKSkpCisgICAgICAgIHJldHVybiBDYWxsKGZ1bmMsIGxfbmV3YXJncywgcHJlZml4PXByZWZpeCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9hcHBseS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM0YmFkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9hcHBseS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYxYzBmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYXBwbHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M5YTQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9iYXNlc3RyaW5nLnB5CkBAIC0wLDAgKzEsMTQgQEAKKyIiIkZpeGVyIGZvciBiYXNlc3RyaW5nIC0+IHN0ci4iIiIKKyMgQXV0aG9yOiBDaHJpc3RpYW4gSGVpbWVzCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworY2xhc3MgRml4QmFzZXN0cmluZyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIidiYXNlc3RyaW5nJyIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHJldHVybiBOYW1lKHUic3RyIiwgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9iYXNlc3RyaW5nLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4YjBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9iYXNlc3RyaW5nLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4YjBlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYmFzZXN0cmluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9idWZmZXIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2J1ZmZlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmIwOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9idWZmZXIucHkKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciB0aGF0IGNoYW5nZXMgYnVmZmVyKC4uLikgaW50byBtZW1vcnl2aWV3KC4uLikuIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworCitjbGFzcyBGaXhCdWZmZXIoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgZXhwbGljaXQgPSBUcnVlICMgVGhlIHVzZXIgbXVzdCBhc2sgZm9yIHRoaXMgZml4ZXIKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8IG5hbWU9J2J1ZmZlcicgdHJhaWxlcjwgJygnIFthbnldICcpJyA+IGFueSogPgorICAgICAgICAgICAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KKyAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUodSJtZW1vcnl2aWV3IiwgcHJlZml4PW5hbWUucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNiMzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9idWZmZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfYnVmZmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzNiMzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9idWZmZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfY2FsbGFibGUucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2NhbGxhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMzNkNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2NhbGxhYmxlLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIGNhbGxhYmxlKCkuCisKK1RoaXMgY29udmVydHMgY2FsbGFibGUob2JqKSBpbnRvIGlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSksIGFkZGluZyBhCitjb2xsZWN0aW9ucyBpbXBvcnQgaWYgbmVlZGVkLiIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IENhbGwsIE5hbWUsIFN0cmluZywgQXR0ciwgdG91Y2hfaW1wb3J0CisKK2NsYXNzIEZpeENhbGxhYmxlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIG9yZGVyID0gInByZSIKKworICAgICMgSWdub3JlIGNhbGxhYmxlKCphcmdzKSBvciB1c2Ugb2Yga2V5d29yZHMuCisgICAgIyBFaXRoZXIgY291bGQgYmUgYSBoaW50IHRoYXQgdGhlIGJ1aWx0aW4gY2FsbGFibGUoKSBpcyBub3QgYmVpbmcgdXNlZC4KKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8ICdjYWxsYWJsZScKKyAgICAgICAgICAgdHJhaWxlcjwgbHBhcj0nKCcKKyAgICAgICAgICAgICAgICAgICAgKCBub3QoYXJnbGlzdCB8IGFyZ3VtZW50PGFueSAnPScgYW55PikgZnVuYz1hbnkKKyAgICAgICAgICAgICAgICAgICAgICB8IGZ1bmM9YXJnbGlzdDwobm90IGFyZ3VtZW50PGFueSAnPScgYW55PikgYW55ICcsJz4gKQorICAgICAgICAgICAgICAgICAgICBycGFyPScpJyA+CisgICAgICAgICAgIGFmdGVyPWFueSoKKyAgICA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBmdW5jID0gcmVzdWx0c1snZnVuYyddCisKKyAgICAgICAgdG91Y2hfaW1wb3J0KE5vbmUsIHUnY29sbGVjdGlvbnMnLCBub2RlPW5vZGUpCisKKyAgICAgICAgYXJncyA9IFtmdW5jLmNsb25lKCksIFN0cmluZyh1JywgJyldCisgICAgICAgIGFyZ3MuZXh0ZW5kKEF0dHIoTmFtZSh1J2NvbGxlY3Rpb25zJyksIE5hbWUodSdDYWxsYWJsZScpKSkKKyAgICAgICAgcmV0dXJuIENhbGwoTmFtZSh1J2lzaW5zdGFuY2UnKSwgYXJncywgcHJlZml4PW5vZGUucHJlZml4KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2NhbGxhYmxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U4ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2NhbGxhYmxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U4ZmIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9jYWxsYWJsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ODFlNGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHkKQEAgLTAsMCArMSwxMDcgQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIGRpY3QgbWV0aG9kcy4KKworZC5rZXlzKCkgLT4gbGlzdChkLmtleXMoKSkKK2QuaXRlbXMoKSAtPiBsaXN0KGQuaXRlbXMoKSkKK2QudmFsdWVzKCkgLT4gbGlzdChkLnZhbHVlcygpKQorCitkLml0ZXJrZXlzKCkgLT4gaXRlcihkLmtleXMoKSkKK2QuaXRlcml0ZW1zKCkgLT4gaXRlcihkLml0ZW1zKCkpCitkLml0ZXJ2YWx1ZXMoKSAtPiBpdGVyKGQudmFsdWVzKCkpCisKK2Qudmlld2tleXMoKSAtPiBkLmtleXMoKQorZC52aWV3aXRlbXMoKSAtPiBkLml0ZW1zKCkKK2Qudmlld3ZhbHVlcygpIC0+IGQudmFsdWVzKCkKKworRXhjZXB0IGluIGNlcnRhaW4gdmVyeSBzcGVjaWZpYyBjb250ZXh0czogdGhlIGl0ZXIoKSBjYW4gYmUgZHJvcHBlZAord2hlbiB0aGUgY29udGV4dCBpcyBsaXN0KCksIHNvcnRlZCgpLCBpdGVyKCkgb3IgZm9yLi4uaW47IHRoZSBsaXN0KCkKK2NhbiBiZSBkcm9wcGVkIHdoZW4gdGhlIGNvbnRleHQgaXMgbGlzdCgpIG9yIHNvcnRlZCgpIChidXQgbm90IGl0ZXIoKQorb3IgZm9yLi4uaW4hKS4gU3BlY2lhbCBjb250ZXh0cyB0aGF0IGFwcGx5IHRvIGJvdGg6IGxpc3QoKSwgc29ydGVkKCksIHR1cGxlKCkKK3NldCgpLCBhbnkoKSwgYWxsKCksIHN1bSgpLgorCitOb3RlOiBpdGVyKGQua2V5cygpKSBjb3VsZCBiZSB3cml0dGVuIGFzIGl0ZXIoZCkgYnV0IHNpbmNlIHRoZQorb3JpZ2luYWwgZC5pdGVya2V5cygpIHdhcyBhbHNvIHJlZHVuZGFudCB3ZSBkb24ndCBmaXggdGhpcy4gIEFuZCB0aGVyZQorYXJlIChyYXJlKSBjb250ZXh0cyB3aGVyZSBpdCBtYWtlcyBhIGRpZmZlcmVuY2UgKGUuZy4gd2hlbiBwYXNzaW5nIGl0CithcyBhbiBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIHRoYXQgaW50cm9zcGVjdHMgdGhlIGFyZ3VtZW50KS4KKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLiBpbXBvcnQgcGF0Y29tcAorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIExQYXJlbiwgUlBhcmVuLCBBcmdMaXN0LCBEb3QKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX3V0aWwKKworCitpdGVyX2V4ZW1wdCA9IGZpeGVyX3V0aWwuY29uc3VtaW5nX2NhbGxzIHwgc2V0KFsiaXRlciJdKQorCisKK2NsYXNzIEZpeERpY3QoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCBoZWFkPWFueSsKKyAgICAgICAgIHRyYWlsZXI8ICcuJyBtZXRob2Q9KCdrZXlzJ3wnaXRlbXMnfCd2YWx1ZXMnfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0ZXJrZXlzJ3wnaXRlcml0ZW1zJ3wnaXRlcnZhbHVlcyd8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmlld2tleXMnfCd2aWV3aXRlbXMnfCd2aWV3dmFsdWVzJykgPgorICAgICAgICAgcGFyZW5zPXRyYWlsZXI8ICcoJyAnKScgPgorICAgICAgICAgdGFpbD1hbnkqCisgICAgPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaGVhZCA9IHJlc3VsdHNbImhlYWQiXQorICAgICAgICBtZXRob2QgPSByZXN1bHRzWyJtZXRob2QiXVswXSAjIEV4dHJhY3Qgbm9kZSBmb3IgbWV0aG9kIG5hbWUKKyAgICAgICAgdGFpbCA9IHJlc3VsdHNbInRhaWwiXQorICAgICAgICBzeW1zID0gc2VsZi5zeW1zCisgICAgICAgIG1ldGhvZF9uYW1lID0gbWV0aG9kLnZhbHVlCisgICAgICAgIGlzaXRlciA9IG1ldGhvZF9uYW1lLnN0YXJ0c3dpdGgodSJpdGVyIikKKyAgICAgICAgaXN2aWV3ID0gbWV0aG9kX25hbWUuc3RhcnRzd2l0aCh1InZpZXciKQorICAgICAgICBpZiBpc2l0ZXIgb3IgaXN2aWV3OgorICAgICAgICAgICAgbWV0aG9kX25hbWUgPSBtZXRob2RfbmFtZVs0Ol0KKyAgICAgICAgYXNzZXJ0IG1ldGhvZF9uYW1lIGluICh1ImtleXMiLCB1Iml0ZW1zIiwgdSJ2YWx1ZXMiKSwgcmVwcihtZXRob2QpCisgICAgICAgIGhlYWQgPSBbbi5jbG9uZSgpIGZvciBuIGluIGhlYWRdCisgICAgICAgIHRhaWwgPSBbbi5jbG9uZSgpIGZvciBuIGluIHRhaWxdCisgICAgICAgIHNwZWNpYWwgPSBub3QgdGFpbCBhbmQgc2VsZi5pbl9zcGVjaWFsX2NvbnRleHQobm9kZSwgaXNpdGVyKQorICAgICAgICBhcmdzID0gaGVhZCArIFtweXRyZWUuTm9kZShzeW1zLnRyYWlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEb3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUobWV0aG9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1tZXRob2QucHJlZml4KV0pLAorICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWyJwYXJlbnMiXS5jbG9uZSgpXQorICAgICAgICBuZXcgPSBweXRyZWUuTm9kZShzeW1zLnBvd2VyLCBhcmdzKQorICAgICAgICBpZiBub3QgKHNwZWNpYWwgb3IgaXN2aWV3KToKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgIG5ldyA9IENhbGwoTmFtZSh1Iml0ZXIiIGlmIGlzaXRlciBlbHNlIHUibGlzdCIpLCBbbmV3XSkKKyAgICAgICAgaWYgdGFpbDoKKyAgICAgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMucG93ZXIsIFtuZXddICsgdGFpbCkKKyAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHJldHVybiBuZXcKKworICAgIFAxID0gInBvd2VyPCBmdW5jPU5BTUUgdHJhaWxlcjwgJygnIG5vZGU9YW55ICcpJyA+IGFueSogPiIKKyAgICBwMSA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKFAxKQorCisgICAgUDIgPSAiIiJmb3Jfc3RtdDwgJ2ZvcicgYW55ICdpbicgbm9kZT1hbnkgJzonIGFueSogPgorICAgICAgICAgICAgfCBjb21wX2ZvcjwgJ2ZvcicgYW55ICdpbicgbm9kZT1hbnkgYW55KiA+CisgICAgICAgICAiIiIKKyAgICBwMiA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKFAyKQorCisgICAgZGVmIGluX3NwZWNpYWxfY29udGV4dChzZWxmLCBub2RlLCBpc2l0ZXIpOgorICAgICAgICBpZiBub2RlLnBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJlc3VsdHMgPSB7fQorICAgICAgICBpZiAobm9kZS5wYXJlbnQucGFyZW50IGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgc2VsZi5wMS5tYXRjaChub2RlLnBhcmVudC5wYXJlbnQsIHJlc3VsdHMpIGFuZAorICAgICAgICAgICAgICAgcmVzdWx0c1sibm9kZSJdIGlzIG5vZGUpOgorICAgICAgICAgICAgaWYgaXNpdGVyOgorICAgICAgICAgICAgICAgICMgaXRlcihkLml0ZXJrZXlzKCkpIC0+IGl0ZXIoZC5rZXlzKCkpLCBldGMuCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNbImZ1bmMiXS52YWx1ZSBpbiBpdGVyX2V4ZW1wdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGxpc3QoZC5rZXlzKCkpIC0+IGxpc3QoZC5rZXlzKCkpLCBldGMuCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNbImZ1bmMiXS52YWx1ZSBpbiBmaXhlcl91dGlsLmNvbnN1bWluZ19jYWxscworICAgICAgICBpZiBub3QgaXNpdGVyOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICMgZm9yIC4uLiBpbiBkLml0ZXJrZXlzKCkgLT4gZm9yIC4uLiBpbiBkLmtleXMoKSwgZXRjLgorICAgICAgICByZXR1cm4gc2VsZi5wMi5tYXRjaChub2RlLnBhcmVudCwgcmVzdWx0cykgYW5kIHJlc3VsdHNbIm5vZGUiXSBpcyBub2RlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODVlZTQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2RpY3QucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGI2Y2FkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9kaWN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4Y2VwdC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhjZXB0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMjQ3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4Y2VwdC5weQpAQCAtMCwwICsxLDkzIEBACisiIiJGaXhlciBmb3IgZXhjZXB0IHN0YXRlbWVudHMgd2l0aCBuYW1lZCBleGNlcHRpb25zLgorCitUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgY29udmVydGVkOgorCistICJleGNlcHQgRSwgVDoiIHdoZXJlIFQgaXMgYSBuYW1lOgorCisgICAgZXhjZXB0IEUgYXMgVDoKKworLSAiZXhjZXB0IEUsIFQ6IiB3aGVyZSBUIGlzIG5vdCBhIG5hbWUsIHR1cGxlIG9yIGxpc3Q6CisKKyAgICAgICAgZXhjZXB0IEUgYXMgdDoKKyAgICAgICAgICAgIFQgPSB0CisKKyAgICBUaGlzIGlzIGRvbmUgYmVjYXVzZSB0aGUgdGFyZ2V0IG9mIGFuICJleGNlcHQiIGNsYXVzZSBtdXN0IGJlIGEKKyAgICBuYW1lLgorCistICJleGNlcHQgRSwgVDoiIHdoZXJlIFQgaXMgYSB0dXBsZSBvciBsaXN0IGxpdGVyYWw6CisKKyAgICAgICAgZXhjZXB0IEUgYXMgdDoKKyAgICAgICAgICAgIFQgPSB0LmFyZ3MKKyIiIgorIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBBc3NpZ24sIEF0dHIsIE5hbWUsIGlzX3R1cGxlLCBpc19saXN0LCBzeW1zCisKK2RlZiBmaW5kX2V4Y2VwdHMobm9kZXMpOgorICAgIGZvciBpLCBuIGluIGVudW1lcmF0ZShub2Rlcyk6CisgICAgICAgIGlmIG4udHlwZSA9PSBzeW1zLmV4Y2VwdF9jbGF1c2U6CisgICAgICAgICAgICBpZiBuLmNoaWxkcmVuWzBdLnZhbHVlID09IHUnZXhjZXB0JzoKKyAgICAgICAgICAgICAgICB5aWVsZCAobiwgbm9kZXNbaSsyXSkKKworY2xhc3MgRml4RXhjZXB0KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICB0cnlfc3RtdDwgJ3RyeScgJzonIChzaW1wbGVfc3RtdCB8IHN1aXRlKQorICAgICAgICAgICAgICAgICAgY2xlYW51cD0oZXhjZXB0X2NsYXVzZSAnOicgKHNpbXBsZV9zdG10IHwgc3VpdGUpKSsKKyAgICAgICAgICAgICAgICAgIHRhaWw9KFsnZXhjZXB0JyAnOicgKHNpbXBsZV9zdG10IHwgc3VpdGUpXQorICAgICAgICAgICAgICAgICAgICAgICAgWydlbHNlJyAnOicgKHNpbXBsZV9zdG10IHwgc3VpdGUpXQorICAgICAgICAgICAgICAgICAgICAgICAgWydmaW5hbGx5JyAnOicgKHNpbXBsZV9zdG10IHwgc3VpdGUpXSkgPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgc3ltcyA9IHNlbGYuc3ltcworCisgICAgICAgIHRhaWwgPSBbbi5jbG9uZSgpIGZvciBuIGluIHJlc3VsdHNbInRhaWwiXV0KKworICAgICAgICB0cnlfY2xlYW51cCA9IFtjaC5jbG9uZSgpIGZvciBjaCBpbiByZXN1bHRzWyJjbGVhbnVwIl1dCisgICAgICAgIGZvciBleGNlcHRfY2xhdXNlLCBlX3N1aXRlIGluIGZpbmRfZXhjZXB0cyh0cnlfY2xlYW51cCk6CisgICAgICAgICAgICBpZiBsZW4oZXhjZXB0X2NsYXVzZS5jaGlsZHJlbikgPT0gNDoKKyAgICAgICAgICAgICAgICAoRSwgY29tbWEsIE4pID0gZXhjZXB0X2NsYXVzZS5jaGlsZHJlblsxOjRdCisgICAgICAgICAgICAgICAgY29tbWEucmVwbGFjZShOYW1lKHUiYXMiLCBwcmVmaXg9dSIgIikpCisKKyAgICAgICAgICAgICAgICBpZiBOLnR5cGUgIT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICAgICAgICAgIyBHZW5lcmF0ZSBhIG5ldyBOIGZvciB0aGUgZXhjZXB0IGNsYXVzZQorICAgICAgICAgICAgICAgICAgICBuZXdfTiA9IE5hbWUoc2VsZi5uZXdfbmFtZSgpLCBwcmVmaXg9dSIgIikKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gTi5jbG9uZSgpCisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgICAgICAgICAgTi5yZXBsYWNlKG5ld19OKQorICAgICAgICAgICAgICAgICAgICBuZXdfTiA9IG5ld19OLmNsb25lKCkKKworICAgICAgICAgICAgICAgICAgICAjIEluc2VydCAib2xkX04gPSBuZXdfTiIgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbgorICAgICAgICAgICAgICAgICAgICAjICB0aGUgZXhjZXB0IGJvZHkuIFRoaXMgbG9vcCBza2lwcyBsZWFkaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgIyAgYW5kIGluZGVudHMKKyAgICAgICAgICAgICAgICAgICAgI1RPRE8oY3dpbnRlcikgc3VpdGUtY2xlYW51cAorICAgICAgICAgICAgICAgICAgICBzdWl0ZV9zdG10cyA9IGVfc3VpdGUuY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgICAgZm9yIGksIHN0bXQgaW4gZW51bWVyYXRlKHN1aXRlX3N0bXRzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RtdCwgcHl0cmVlLk5vZGUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgYXNzaWdubWVudCBpcyBkaWZmZXJlbnQgaWYgb2xkX04gaXMgYSB0dXBsZSBvciBsaXN0CisgICAgICAgICAgICAgICAgICAgICMgSW4gdGhhdCBjYXNlLCB0aGUgYXNzaWdubWVudCBpcyBvbGRfTiA9IG5ld19OLmFyZ3MKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNfdHVwbGUoTikgb3IgaXNfbGlzdChOKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiA9IEFzc2lnbih0YXJnZXQsIEF0dHIobmV3X04sIE5hbWUodSdhcmdzJykpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduID0gQXNzaWduKHRhcmdldCwgbmV3X04pCisKKyAgICAgICAgICAgICAgICAgICAgI1RPRE8oY3dpbnRlcikgc3RvcGdhcCB1bnRpbCBjaGlsZHJlbiBiZWNvbWVzIGEgc21hcnQgbGlzdAorICAgICAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gcmV2ZXJzZWQoc3VpdGVfc3RtdHNbOmldKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVfc3VpdGUuaW5zZXJ0X2NoaWxkKDAsIGNoaWxkKQorICAgICAgICAgICAgICAgICAgICBlX3N1aXRlLmluc2VydF9jaGlsZChpLCBhc3NpZ24pCisgICAgICAgICAgICAgICAgZWxpZiBOLnByZWZpeCA9PSB1IiI6CisgICAgICAgICAgICAgICAgICAgICMgTm8gc3BhY2UgYWZ0ZXIgYSBjb21tYSBpcyBsZWdhbDsgbm8gc3BhY2UgYWZ0ZXIgImFzIiwKKyAgICAgICAgICAgICAgICAgICAgIyBub3Qgc28gbXVjaC4KKyAgICAgICAgICAgICAgICAgICAgTi5wcmVmaXggPSB1IiAiCisKKyAgICAgICAgI1RPRE8oY3dpbnRlcikgZml4IHRoaXMgd2hlbiBjaGlsZHJlbiBiZWNvbWVzIGEgc21hcnQgbGlzdAorICAgICAgICBjaGlsZHJlbiA9IFtjLmNsb25lKCkgZm9yIGMgaW4gbm9kZS5jaGlsZHJlbls6M11dICsgdHJ5X2NsZWFudXAgKyB0YWlsCisgICAgICAgIHJldHVybiBweXRyZWUuTm9kZShub2RlLnR5cGUsIGNoaWxkcmVuKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjI3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4Y2VwdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGNlcHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1ZjI3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4Y2VwdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGVjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTE4NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHkKQEAgLTAsMCArMSw0MCBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciBmb3IgZXhlYy4KKworVGhpcyBjb252ZXJ0cyB1c2FnZXMgb2YgdGhlIGV4ZWMgc3RhdGVtZW50IGludG8gY2FsbHMgdG8gYSBidWlsdC1pbgorZXhlYygpIGZ1bmN0aW9uLgorCitleGVjIGNvZGUgaW4gbnMxLCBuczIgLT4gZXhlYyhjb2RlLCBuczEsIG5zMikKKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IENvbW1hLCBOYW1lLCBDYWxsCisKKworY2xhc3MgRml4RXhlYyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgZXhlY19zdG10PCAnZXhlYycgYT1hbnkgJ2luJyBiPWFueSBbJywnIGM9YW55XSA+CisgICAgfAorICAgIGV4ZWNfc3RtdDwgJ2V4ZWMnIChub3QgYXRvbTwnKCcgW2FueV0gJyknPikgYT1hbnkgPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgc3ltcyA9IHNlbGYuc3ltcworICAgICAgICBhID0gcmVzdWx0c1siYSJdCisgICAgICAgIGIgPSByZXN1bHRzLmdldCgiYiIpCisgICAgICAgIGMgPSByZXN1bHRzLmdldCgiYyIpCisgICAgICAgIGFyZ3MgPSBbYS5jbG9uZSgpXQorICAgICAgICBhcmdzWzBdLnByZWZpeCA9ICIiCisgICAgICAgIGlmIGIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzLmV4dGVuZChbQ29tbWEoKSwgYi5jbG9uZSgpXSkKKyAgICAgICAgaWYgYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFyZ3MuZXh0ZW5kKFtDb21tYSgpLCBjLmNsb25lKCldKQorCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJleGVjIiksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhlYy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMzQ3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhlYy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMjFhNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhlY2ZpbGUucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjlkM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5CkBAIC0wLDAgKzEsNTIgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIGV4ZWNmaWxlLgorCitUaGlzIGNvbnZlcnRzIHVzYWdlcyBvZiB0aGUgZXhlY2ZpbGUgZnVuY3Rpb24gaW50byBjYWxscyB0byB0aGUgYnVpbHQtaW4KK2V4ZWMoKSBmdW5jdGlvbi4KKyIiIgorCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgKENvbW1hLCBOYW1lLCBDYWxsLCBMUGFyZW4sIFJQYXJlbiwgRG90LCBOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdMaXN0LCBTdHJpbmcsIHN5bXMpCisKKworY2xhc3MgRml4RXhlY2ZpbGUoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCAnZXhlY2ZpbGUnIHRyYWlsZXI8ICcoJyBhcmdsaXN0PCBmaWxlbmFtZT1hbnkgWycsJyBnbG9iYWxzPWFueSBbJywnIGxvY2Fscz1hbnkgXSBdID4gJyknID4gPgorICAgIHwKKyAgICBwb3dlcjwgJ2V4ZWNmaWxlJyB0cmFpbGVyPCAnKCcgZmlsZW5hbWU9YW55ICcpJyA+ID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGFzc2VydCByZXN1bHRzCisgICAgICAgIGZpbGVuYW1lID0gcmVzdWx0c1siZmlsZW5hbWUiXQorICAgICAgICBnbG9iYWxzID0gcmVzdWx0cy5nZXQoImdsb2JhbHMiKQorICAgICAgICBsb2NhbHMgPSByZXN1bHRzLmdldCgibG9jYWxzIikKKworICAgICAgICAjIENvcHkgb3ZlciB0aGUgcHJlZml4IGZyb20gdGhlIHJpZ2h0IHBhcmVudGhlc2VzIGVuZCBvZiB0aGUgZXhlY2ZpbGUKKyAgICAgICAgIyBjYWxsLgorICAgICAgICBleGVjZmlsZV9wYXJlbiA9IG5vZGUuY2hpbGRyZW5bLTFdLmNoaWxkcmVuWy0xXS5jbG9uZSgpCisgICAgICAgICMgQ29uc3RydWN0IG9wZW4oKS5yZWFkKCkuCisgICAgICAgIG9wZW5fYXJncyA9IEFyZ0xpc3QoW2ZpbGVuYW1lLmNsb25lKCldLCBycGFyZW49ZXhlY2ZpbGVfcGFyZW4pCisgICAgICAgIG9wZW5fY2FsbCA9IE5vZGUoc3ltcy5wb3dlciwgW05hbWUodSJvcGVuIiksIG9wZW5fYXJnc10pCisgICAgICAgIHJlYWQgPSBbTm9kZShzeW1zLnRyYWlsZXIsIFtEb3QoKSwgTmFtZSh1J3JlYWQnKV0pLAorICAgICAgICAgICAgICAgIE5vZGUoc3ltcy50cmFpbGVyLCBbTFBhcmVuKCksIFJQYXJlbigpXSldCisgICAgICAgIG9wZW5fZXhwciA9IFtvcGVuX2NhbGxdICsgcmVhZAorICAgICAgICAjIFdyYXAgdGhlIG9wZW4gY2FsbCBpbiBhIGNvbXBpbGUgY2FsbC4gVGhpcyBpcyBzbyB0aGUgZmlsZW5hbWUgd2lsbCBiZQorICAgICAgICAjIHByZXNlcnZlZCBpbiB0aGUgZXhlY2VkIGNvZGUuCisgICAgICAgIGZpbGVuYW1lX2FyZyA9IGZpbGVuYW1lLmNsb25lKCkKKyAgICAgICAgZmlsZW5hbWVfYXJnLnByZWZpeCA9IHUiICIKKyAgICAgICAgZXhlY19zdHIgPSBTdHJpbmcodSInZXhlYyciLCB1IiAiKQorICAgICAgICBjb21waWxlX2FyZ3MgPSBvcGVuX2V4cHIgKyBbQ29tbWEoKSwgZmlsZW5hbWVfYXJnLCBDb21tYSgpLCBleGVjX3N0cl0KKyAgICAgICAgY29tcGlsZV9jYWxsID0gQ2FsbChOYW1lKHUiY29tcGlsZSIpLCBjb21waWxlX2FyZ3MsIHUiIikKKyAgICAgICAgIyBGaW5hbGx5LCByZXBsYWNlIHRoZSBleGVjZmlsZSBjYWxsIHdpdGggYW4gZXhlYyBjYWxsLgorICAgICAgICBhcmdzID0gW2NvbXBpbGVfY2FsbF0KKyAgICAgICAgaWYgZ2xvYmFscyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFyZ3MuZXh0ZW5kKFtDb21tYSgpLCBnbG9iYWxzLmNsb25lKCldKQorICAgICAgICBpZiBsb2NhbHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzLmV4dGVuZChbQ29tbWEoKSwgbG9jYWxzLmNsb25lKCldKQorICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUiZXhlYyIpLCBhcmdzLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhlY2ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTM0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhlY2ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YzgxM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4ZWNmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4aXRmdW5jLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGl0ZnVuYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWZiM2RiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9leGl0ZnVuYy5weQpAQCAtMCwwICsxLDcyIEBACisiIiIKK0NvbnZlcnQgdXNlIG9mIHN5cy5leGl0ZnVuYyB0byB1c2UgdGhlIGF0ZXhpdCBtb2R1bGUuCisiIiIKKworIyBBdXRob3I6IEJlbmphbWluIFBldGVyc29uCisKK2Zyb20gbGliMnRvMyBpbXBvcnQgcHl0cmVlLCBmaXhlcl9iYXNlCitmcm9tIGxpYjJ0bzMuZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQXR0ciwgQ2FsbCwgQ29tbWEsIE5ld2xpbmUsIHN5bXMKKworCitjbGFzcyBGaXhFeGl0ZnVuYyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIGtlZXBfbGluZV9vcmRlciA9IFRydWUKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgICBzeXNfaW1wb3J0PWltcG9ydF9uYW1lPCdpbXBvcnQnCisgICAgICAgICAgICAgICAgICAgICAgKCdzeXMnCisgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICAgICAgICAgIGRvdHRlZF9hc19uYW1lczwgKGFueSAnLCcpKiAnc3lzJyAoJywnIGFueSkqID4KKyAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgIGV4cHJfc3RtdDwKKyAgICAgICAgICAgICAgICAgICAgICBwb3dlcjwgJ3N5cycgdHJhaWxlcjwgJy4nICdleGl0ZnVuYycgPiA+CisgICAgICAgICAgICAgICAgICAnPScgZnVuYz1hbnkgPgorICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgc3VwZXIoRml4RXhpdGZ1bmMsIHNlbGYpLl9faW5pdF9fKCphcmdzKQorCisgICAgZGVmIHN0YXJ0X3RyZWUoc2VsZiwgdHJlZSwgZmlsZW5hbWUpOgorICAgICAgICBzdXBlcihGaXhFeGl0ZnVuYywgc2VsZikuc3RhcnRfdHJlZSh0cmVlLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5zeXNfaW1wb3J0ID0gTm9uZQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgIyBGaXJzdCwgZmluZCBhIHRoZSBzeXMgaW1wb3J0LiBXZSdsbCBqdXN0IGhvcGUgaXQncyBnbG9iYWwgc2NvcGUuCisgICAgICAgIGlmICJzeXNfaW1wb3J0IiBpbiByZXN1bHRzOgorICAgICAgICAgICAgaWYgc2VsZi5zeXNfaW1wb3J0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zeXNfaW1wb3J0ID0gcmVzdWx0c1sic3lzX2ltcG9ydCJdCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmdW5jID0gcmVzdWx0c1siZnVuYyJdLmNsb25lKCkKKyAgICAgICAgZnVuYy5wcmVmaXggPSB1IiIKKyAgICAgICAgcmVnaXN0ZXIgPSBweXRyZWUuTm9kZShzeW1zLnBvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHIoTmFtZSh1ImF0ZXhpdCIpLCBOYW1lKHUicmVnaXN0ZXIiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIGNhbGwgPSBDYWxsKHJlZ2lzdGVyLCBbZnVuY10sIG5vZGUucHJlZml4KQorICAgICAgICBub2RlLnJlcGxhY2UoY2FsbCkKKworICAgICAgICBpZiBzZWxmLnN5c19pbXBvcnQgaXMgTm9uZToKKyAgICAgICAgICAgICMgVGhhdCdzIGludGVyZXN0aW5nLgorICAgICAgICAgICAgc2VsZi53YXJuaW5nKG5vZGUsICJDYW4ndCBmaW5kIHN5cyBpbXBvcnQ7IFBsZWFzZSBhZGQgYW4gYXRleGl0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBhdCB0aGUgdG9wIG9mIHlvdXIgZmlsZS4iKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBOb3cgYWRkIGFuIGF0ZXhpdCBpbXBvcnQgYWZ0ZXIgdGhlIHN5cyBpbXBvcnQuCisgICAgICAgIG5hbWVzID0gc2VsZi5zeXNfaW1wb3J0LmNoaWxkcmVuWzFdCisgICAgICAgIGlmIG5hbWVzLnR5cGUgPT0gc3ltcy5kb3R0ZWRfYXNfbmFtZXM6CisgICAgICAgICAgICBuYW1lcy5hcHBlbmRfY2hpbGQoQ29tbWEoKSkKKyAgICAgICAgICAgIG5hbWVzLmFwcGVuZF9jaGlsZChOYW1lKHUiYXRleGl0IiwgdSIgIikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb250YWluaW5nX3N0bXQgPSBzZWxmLnN5c19pbXBvcnQucGFyZW50CisgICAgICAgICAgICBwb3NpdGlvbiA9IGNvbnRhaW5pbmdfc3RtdC5jaGlsZHJlbi5pbmRleChzZWxmLnN5c19pbXBvcnQpCisgICAgICAgICAgICBzdG10X2NvbnRhaW5lciA9IGNvbnRhaW5pbmdfc3RtdC5wYXJlbnQKKyAgICAgICAgICAgIG5ld19pbXBvcnQgPSBweXRyZWUuTm9kZShzeW1zLmltcG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05hbWUodSJpbXBvcnQiKSwgTmFtZSh1ImF0ZXhpdCIsIHUiICIpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5zaW1wbGVfc3RtdCwgW25ld19pbXBvcnRdKQorICAgICAgICAgICAgY29udGFpbmluZ19zdG10Lmluc2VydF9jaGlsZChwb3NpdGlvbiArIDEsIE5ld2xpbmUoKSkKKyAgICAgICAgICAgIGNvbnRhaW5pbmdfc3RtdC5pbnNlcnRfY2hpbGQocG9zaXRpb24gKyAyLCBuZXcpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4aXRmdW5jLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhpdGZ1bmMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2M1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4aXRmdW5jLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4aXRmdW5jLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZXhpdGZ1bmMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2M1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2V4aXRmdW5jLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZWUyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ZpbHRlci5weQpAQCAtMCwwICsxLDc2IEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIHRoYXQgY2hhbmdlcyBmaWx0ZXIoRiwgWCkgaW50byBsaXN0KGZpbHRlcihGLCBYKSkuCisKK1dlIGF2b2lkIHRoZSB0cmFuc2Zvcm1hdGlvbiBpZiB0aGUgZmlsdGVyKCkgY2FsbCBpcyBkaXJlY3RseSBjb250YWluZWQKK2luIGl0ZXIoPD4pLCBsaXN0KDw+KSwgdHVwbGUoPD4pLCBzb3J0ZWQoPD4pLCAuLi5qb2luKDw+KSwgb3IKK2ZvciBWIGluIDw+Oi4KKworTk9URTogVGhpcyBpcyBzdGlsbCBub3QgY29ycmVjdCBpZiB0aGUgb3JpZ2luYWwgY29kZSB3YXMgZGVwZW5kaW5nIG9uCitmaWx0ZXIoRiwgWCkgdG8gcmV0dXJuIGEgc3RyaW5nIGlmIFggaXMgYSBzdHJpbmcgYW5kIGEgdHVwbGUgaWYgWCBpcyBhCit0dXBsZS4gIFRoYXQgd291bGQgcmVxdWlyZSB0eXBlIGluZmVyZW5jZSwgd2hpY2ggd2UgZG9uJ3QgZG8uICBMZXQKK1B5dGhvbiAyLjYgZmlndXJlIGl0IG91dC4KKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBMaXN0Q29tcCwgaW5fc3BlY2lhbF9jb250ZXh0CisKK2NsYXNzIEZpeEZpbHRlcihmaXhlcl9iYXNlLkNvbmRpdGlvbmFsRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIGZpbHRlcl9sYW1iZGE9cG93ZXI8CisgICAgICAgICdmaWx0ZXInCisgICAgICAgIHRyYWlsZXI8CisgICAgICAgICAgICAnKCcKKyAgICAgICAgICAgIGFyZ2xpc3Q8CisgICAgICAgICAgICAgICAgbGFtYmRlZjwgJ2xhbWJkYScKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZnA9TkFNRSB8IHZmcGRlZjwgJygnIGZwPU5BTUUgJyknPiApICc6JyB4cD1hbnkKKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgJywnCisgICAgICAgICAgICAgICAgaXQ9YW55CisgICAgICAgICAgICA+CisgICAgICAgICAgICAnKScKKyAgICAgICAgPgorICAgID4KKyAgICB8CisgICAgcG93ZXI8CisgICAgICAgICdmaWx0ZXInCisgICAgICAgIHRyYWlsZXI8ICcoJyBhcmdsaXN0PCBub25lPSdOb25lJyAnLCcgc2VxPWFueSA+ICcpJyA+CisgICAgPgorICAgIHwKKyAgICBwb3dlcjwKKyAgICAgICAgJ2ZpbHRlcicKKyAgICAgICAgYXJncz10cmFpbGVyPCAnKCcgW2FueV0gJyknID4KKyAgICA+CisgICAgIiIiCisKKyAgICBza2lwX29uID0gImZ1dHVyZV9idWlsdGlucy5maWx0ZXIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiBzZWxmLnNob3VsZF9za2lwKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgImZpbHRlcl9sYW1iZGEiIGluIHJlc3VsdHM6CisgICAgICAgICAgICBuZXcgPSBMaXN0Q29tcChyZXN1bHRzLmdldCgiZnAiKS5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5nZXQoImZwIikuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuZ2V0KCJpdCIpLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLmdldCgieHAiKS5jbG9uZSgpKQorCisgICAgICAgIGVsaWYgIm5vbmUiIGluIHJlc3VsdHM6CisgICAgICAgICAgICBuZXcgPSBMaXN0Q29tcChOYW1lKHUiX2YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUodSJfZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1sic2VxIl0uY2xvbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUodSJfZiIpKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBpbl9zcGVjaWFsX2NvbnRleHQobm9kZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IHUiIgorICAgICAgICAgICAgbmV3ID0gQ2FsbChOYW1lKHUibGlzdCIpLCBbbmV3XSkKKyAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzlhYTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZmlsdGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzlhYTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9maWx0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdW5jYXR0cnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0NWMwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5CkBAIC0wLDAgKzEsMjEgQEAKKyIiIkZpeCBmdW5jdGlvbiBhdHRyaWJ1dGUgbmFtZXMgKGYuZnVuY194IC0+IGYuX194X18pLiIiIgorIyBBdXRob3I6IENvbGxpbiBXaW50ZXIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQorCisKK2NsYXNzIEZpeEZ1bmNhdHRycyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8IGFueSsgdHJhaWxlcjwgJy4nIGF0dHI9KCdmdW5jX2Nsb3N1cmUnIHwgJ2Z1bmNfZG9jJyB8ICdmdW5jX2dsb2JhbHMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnZnVuY19uYW1lJyB8ICdmdW5jX2RlZmF1bHRzJyB8ICdmdW5jX2NvZGUnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAnZnVuY19kaWN0JykgPiBhbnkqID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGF0dHIgPSByZXN1bHRzWyJhdHRyIl1bMF0KKyAgICAgICAgYXR0ci5yZXBsYWNlKE5hbWUoKHUiX18lc19fIiAlIGF0dHIudmFsdWVbNTpdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PWF0dHIucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc1MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdW5jYXR0cnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnVuY2F0dHJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDc1MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdW5jYXR0cnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjYjg2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZnV0dXJlLnB5CkBAIC0wLDAgKzEsMjIgQEAKKyIiIlJlbW92ZSBfX2Z1dHVyZV9fIGltcG9ydHMKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBmb28gaXMgcmVwbGFjZWQgd2l0aCBhbiBlbXB0eSBsaW5lLgorIiIiCisjIEF1dGhvcjogQ2hyaXN0aWFuIEhlaW1lcworCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBCbGFua0xpbmUKKworY2xhc3MgRml4RnV0dXJlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiJpbXBvcnRfZnJvbTwgJ2Zyb20nIG1vZHVsZV9uYW1lPSJfX2Z1dHVyZV9fIiAnaW1wb3J0JyBhbnkgPiIiIgorCisgICAgIyBUaGlzIHNob3VsZCBiZSBydW4gbGFzdCAtLSBzb21lIHRoaW5ncyBjaGVjayBmb3IgdGhlIGltcG9ydAorICAgIHJ1bl9vcmRlciA9IDEwCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuZXcgPSBCbGFua0xpbmUoKQorICAgICAgICBuZXcucHJlZml4ID0gbm9kZS5wcmVmaXgKKyAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDllNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1dHVyZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9mdXR1cmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDllNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2Z1dHVyZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9nZXRjd2R1LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9nZXRjd2R1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjMzYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2dldGN3ZHUucHkKQEAgLTAsMCArMSwxOSBAQAorIiIiCitGaXhlciB0aGF0IGNoYW5nZXMgb3MuZ2V0Y3dkdSgpIHRvIG9zLmdldGN3ZCgpLgorIiIiCisjIEF1dGhvcjogVmljdG9yIFN0aW5uZXIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQorCitjbGFzcyBGaXhHZXRjd2R1KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8ICdvcycgdHJhaWxlcjwgZG90PScuJyBuYW1lPSdnZXRjd2R1JyA+IGFueSogPgorICAgICAgICAgICAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KKyAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUodSJnZXRjd2QiLCBwcmVmaXg9bmFtZS5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9nZXRjd2R1LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwNjk4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9nZXRjd2R1LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwNjk4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfZ2V0Y3dkdS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYWQ0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHkKQEAgLTAsMCArMSwxMTAgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIGhhc19rZXkoKS4KKworQ2FsbHMgdG8gLmhhc19rZXkoKSBtZXRob2RzIGFyZSBleHByZXNzZWQgaW4gdGVybXMgb2YgdGhlICdpbicKK29wZXJhdG9yOgorCisgICAgZC5oYXNfa2V5KGspIC0+IGsgaW4gZAorCitDQVZFQVRTOgorMSkgV2hpbGUgdGhlIHByaW1hcnkgdGFyZ2V0IG9mIHRoaXMgZml4ZXIgaXMgZGljdC5oYXNfa2V5KCksIHRoZQorICAgZml4ZXIgd2lsbCBjaGFuZ2UgYW55IGhhc19rZXkoKSBtZXRob2QgY2FsbCwgcmVnYXJkbGVzcyBvZiBpdHMKKyAgIGNsYXNzLgorCisyKSBDYXNlcyBsaWtlIHRoaXMgd2lsbCBub3QgYmUgY29udmVydGVkOgorCisgICAgbSA9IGQuaGFzX2tleQorICAgIGlmIG0oayk6CisgICAgICAgIC4uLgorCisgICBPbmx5ICpjYWxscyogdG8gaGFzX2tleSgpIGFyZSBjb252ZXJ0ZWQuIFdoaWxlIGl0IGlzIHBvc3NpYmxlIHRvCisgICBjb252ZXJ0IHRoZSBhYm92ZSB0byBzb21ldGhpbmcgbGlrZQorCisgICAgbSA9IGQuX19jb250YWluc19fCisgICAgaWYgbShrKToKKyAgICAgICAgLi4uCisKKyAgIHRoaXMgaXMgY3VycmVudGx5IG5vdCBkb25lLgorIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgcGFyZW50aGVzaXplCisKKworY2xhc3MgRml4SGFzS2V5KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBhbmNob3I9cG93ZXI8CisgICAgICAgIGJlZm9yZT1hbnkrCisgICAgICAgIHRyYWlsZXI8ICcuJyAnaGFzX2tleScgPgorICAgICAgICB0cmFpbGVyPAorICAgICAgICAgICAgJygnCisgICAgICAgICAgICAoIG5vdChhcmdsaXN0IHwgYXJndW1lbnQ8YW55ICc9JyBhbnk+KSBhcmc9YW55CisgICAgICAgICAgICB8IGFyZ2xpc3Q8KG5vdCBhcmd1bWVudDxhbnkgJz0nIGFueT4pIGFyZz1hbnkgJywnPgorICAgICAgICAgICAgKQorICAgICAgICAgICAgJyknCisgICAgICAgID4KKyAgICAgICAgYWZ0ZXI9YW55KgorICAgID4KKyAgICB8CisgICAgbmVnYXRpb249bm90X3Rlc3Q8CisgICAgICAgICdub3QnCisgICAgICAgIGFuY2hvcj1wb3dlcjwKKyAgICAgICAgICAgIGJlZm9yZT1hbnkrCisgICAgICAgICAgICB0cmFpbGVyPCAnLicgJ2hhc19rZXknID4KKyAgICAgICAgICAgIHRyYWlsZXI8CisgICAgICAgICAgICAgICAgJygnCisgICAgICAgICAgICAgICAgKCBub3QoYXJnbGlzdCB8IGFyZ3VtZW50PGFueSAnPScgYW55PikgYXJnPWFueQorICAgICAgICAgICAgICAgIHwgYXJnbGlzdDwobm90IGFyZ3VtZW50PGFueSAnPScgYW55PikgYXJnPWFueSAnLCc+CisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICcpJworICAgICAgICAgICAgPgorICAgICAgICA+CisgICAgPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgYXNzZXJ0IHJlc3VsdHMKKyAgICAgICAgc3ltcyA9IHNlbGYuc3ltcworICAgICAgICBpZiAobm9kZS5wYXJlbnQudHlwZSA9PSBzeW1zLm5vdF90ZXN0IGFuZAorICAgICAgICAgICAgc2VsZi5wYXR0ZXJuLm1hdGNoKG5vZGUucGFyZW50KSk6CisgICAgICAgICAgICAjIERvbid0IHRyYW5zZm9ybSBhIG5vZGUgbWF0Y2hpbmcgdGhlIGZpcnN0IGFsdGVybmF0aXZlIG9mIHRoZQorICAgICAgICAgICAgIyBwYXR0ZXJuIHdoZW4gaXRzIHBhcmVudCBtYXRjaGVzIHRoZSBzZWNvbmQgYWx0ZXJuYXRpdmUKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIG5lZ2F0aW9uID0gcmVzdWx0cy5nZXQoIm5lZ2F0aW9uIikKKyAgICAgICAgYW5jaG9yID0gcmVzdWx0c1siYW5jaG9yIl0KKyAgICAgICAgcHJlZml4ID0gbm9kZS5wcmVmaXgKKyAgICAgICAgYmVmb3JlID0gW24uY2xvbmUoKSBmb3IgbiBpbiByZXN1bHRzWyJiZWZvcmUiXV0KKyAgICAgICAgYXJnID0gcmVzdWx0c1siYXJnIl0uY2xvbmUoKQorICAgICAgICBhZnRlciA9IHJlc3VsdHMuZ2V0KCJhZnRlciIpCisgICAgICAgIGlmIGFmdGVyOgorICAgICAgICAgICAgYWZ0ZXIgPSBbbi5jbG9uZSgpIGZvciBuIGluIGFmdGVyXQorICAgICAgICBpZiBhcmcudHlwZSBpbiAoc3ltcy5jb21wYXJpc29uLCBzeW1zLm5vdF90ZXN0LCBzeW1zLmFuZF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5vcl90ZXN0LCBzeW1zLnRlc3QsIHN5bXMubGFtYmRlZiwgc3ltcy5hcmd1bWVudCk6CisgICAgICAgICAgICBhcmcgPSBwYXJlbnRoZXNpemUoYXJnKQorICAgICAgICBpZiBsZW4oYmVmb3JlKSA9PSAxOgorICAgICAgICAgICAgYmVmb3JlID0gYmVmb3JlWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiZWZvcmUgPSBweXRyZWUuTm9kZShzeW1zLnBvd2VyLCBiZWZvcmUpCisgICAgICAgIGJlZm9yZS5wcmVmaXggPSB1IiAiCisgICAgICAgIG5fb3AgPSBOYW1lKHUiaW4iLCBwcmVmaXg9dSIgIikKKyAgICAgICAgaWYgbmVnYXRpb246CisgICAgICAgICAgICBuX25vdCA9IE5hbWUodSJub3QiLCBwcmVmaXg9dSIgIikKKyAgICAgICAgICAgIG5fb3AgPSBweXRyZWUuTm9kZShzeW1zLmNvbXBfb3AsIChuX25vdCwgbl9vcCkpCisgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMuY29tcGFyaXNvbiwgKGFyZywgbl9vcCwgYmVmb3JlKSkKKyAgICAgICAgaWYgYWZ0ZXI6CisgICAgICAgICAgICBuZXcgPSBwYXJlbnRoZXNpemUobmV3KQorICAgICAgICAgICAgbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwgKG5ldywpICsgdHVwbGUoYWZ0ZXIpKQorICAgICAgICBpZiBub2RlLnBhcmVudC50eXBlIGluIChzeW1zLmNvbXBhcmlzb24sIHN5bXMuZXhwciwgc3ltcy54b3JfZXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5hbmRfZXhwciwgc3ltcy5zaGlmdF9leHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1zLmFyaXRoX2V4cHIsIHN5bXMudGVybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5mYWN0b3IsIHN5bXMucG93ZXIpOgorICAgICAgICAgICAgbmV3ID0gcGFyZW50aGVzaXplKG5ldykKKyAgICAgICAgbmV3LnByZWZpeCA9IHByZWZpeAorICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFlMzIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2hhc19rZXkucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDRmMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9oYXNfa2V5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YjZlZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lkaW9tcy5weQpAQCAtMCwwICsxLDE1MiBAQAorIiIiQWRqdXN0IHNvbWUgb2xkIFB5dGhvbiAyIGlkaW9tcyB0byB0aGVpciBtb2Rlcm4gY291bnRlcnBhcnRzLgorCisqIENoYW5nZSBzb21lIHR5cGUgY29tcGFyaXNvbnMgdG8gaXNpbnN0YW5jZSgpIGNhbGxzOgorICAgIHR5cGUoeCkgPT0gVCAtPiBpc2luc3RhbmNlKHgsIFQpCisgICAgdHlwZSh4KSBpcyBUIC0+IGlzaW5zdGFuY2UoeCwgVCkKKyAgICB0eXBlKHgpICE9IFQgLT4gbm90IGlzaW5zdGFuY2UoeCwgVCkKKyAgICB0eXBlKHgpIGlzIG5vdCBUIC0+IG5vdCBpc2luc3RhbmNlKHgsIFQpCisKKyogQ2hhbmdlICJ3aGlsZSAxOiIgaW50byAid2hpbGUgVHJ1ZToiLgorCisqIENoYW5nZSBib3RoCisKKyAgICB2ID0gbGlzdChFWFBSKQorICAgIHYuc29ydCgpCisgICAgZm9vKHYpCisKK2FuZCB0aGUgbW9yZSBnZW5lcmFsCisKKyAgICB2ID0gRVhQUgorICAgIHYuc29ydCgpCisgICAgZm9vKHYpCisKK2ludG8KKworICAgIHYgPSBzb3J0ZWQoRVhQUikKKyAgICBmb28odikKKyIiIgorIyBBdXRob3I6IEphY3F1ZXMgRnJlY2hldCwgQ29sbGluIFdpbnRlcgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBDYWxsLCBDb21tYSwgTmFtZSwgTm9kZSwgQmxhbmtMaW5lLCBzeW1zCisKK0NNUCA9ICIobj0nIT0nIHwgJz09JyB8ICdpcycgfCBuPWNvbXBfb3A8ICdpcycgJ25vdCcgPikiCitUWVBFID0gInBvd2VyPCAndHlwZScgdHJhaWxlcjwgJygnIHg9YW55ICcpJyA+ID4iCisKK2NsYXNzIEZpeElkaW9tcyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIGV4cGxpY2l0ID0gVHJ1ZSAjIFRoZSB1c2VyIG11c3QgYXNrIGZvciB0aGlzIGZpeGVyCisKKyAgICBQQVRURVJOID0gciIiIgorICAgICAgICBpc2luc3RhbmNlPWNvbXBhcmlzb248ICVzICVzIFQ9YW55ID4KKyAgICAgICAgfAorICAgICAgICBpc2luc3RhbmNlPWNvbXBhcmlzb248IFQ9YW55ICVzICVzID4KKyAgICAgICAgfAorICAgICAgICB3aGlsZV9zdG10PCAnd2hpbGUnIHdoaWxlPScxJyAnOicgYW55KyA+CisgICAgICAgIHwKKyAgICAgICAgc29ydGVkPWFueTwKKyAgICAgICAgICAgIGFueSoKKyAgICAgICAgICAgIHNpbXBsZV9zdG10PAorICAgICAgICAgICAgICBleHByX3N0bXQ8IGlkMT1hbnkgJz0nCisgICAgICAgICAgICAgICAgICAgICAgICAgcG93ZXI8IGxpc3Q9J2xpc3QnIHRyYWlsZXI8ICcoJyAobm90IGFyZ2xpc3Q8YW55Kz4pIGFueSAnKScgPiA+CisgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgPgorICAgICAgICAgICAgc29ydD0KKyAgICAgICAgICAgIHNpbXBsZV9zdG10PAorICAgICAgICAgICAgICBwb3dlcjwgaWQyPWFueQorICAgICAgICAgICAgICAgICAgICAgdHJhaWxlcjwgJy4nICdzb3J0JyA+IHRyYWlsZXI8ICcoJyAnKScgPgorICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgID4KKyAgICAgICAgICAgIG5leHQ9YW55KgorICAgICAgICA+CisgICAgICAgIHwKKyAgICAgICAgc29ydGVkPWFueTwKKyAgICAgICAgICAgIGFueSoKKyAgICAgICAgICAgIHNpbXBsZV9zdG10PCBleHByX3N0bXQ8IGlkMT1hbnkgJz0nIGV4cHI9YW55ID4gJ1xuJyA+CisgICAgICAgICAgICBzb3J0PQorICAgICAgICAgICAgc2ltcGxlX3N0bXQ8CisgICAgICAgICAgICAgIHBvd2VyPCBpZDI9YW55CisgICAgICAgICAgICAgICAgICAgICB0cmFpbGVyPCAnLicgJ3NvcnQnID4gdHJhaWxlcjwgJygnICcpJyA+CisgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgPgorICAgICAgICAgICAgbmV4dD1hbnkqCisgICAgICAgID4KKyAgICAiIiIgJSAoVFlQRSwgQ01QLCBDTVAsIFRZUEUpCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6CisgICAgICAgIHIgPSBzdXBlcihGaXhJZGlvbXMsIHNlbGYpLm1hdGNoKG5vZGUpCisgICAgICAgICMgSWYgd2UndmUgbWF0Y2hlZCBvbmUgb2YgdGhlIHNvcnQvc29ydGVkIHN1YnBhdHRlcm5zIGFib3ZlLCB3ZQorICAgICAgICAjIHdhbnQgdG8gcmVqZWN0IG1hdGNoZXMgd2hlcmUgdGhlIGluaXRpYWwgYXNzaWdubWVudCBhbmQgdGhlCisgICAgICAgICMgc3Vic2VxdWVudCAuc29ydCgpIGNhbGwgaW52b2x2ZSBkaWZmZXJlbnQgaWRlbnRpZmllcnMuCisgICAgICAgIGlmIHIgYW5kICJzb3J0ZWQiIGluIHI6CisgICAgICAgICAgICBpZiByWyJpZDEiXSA9PSByWyJpZDIiXToKKyAgICAgICAgICAgICAgICByZXR1cm4gcgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGlmICJpc2luc3RhbmNlIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhbnNmb3JtX2lzaW5zdGFuY2Uobm9kZSwgcmVzdWx0cykKKyAgICAgICAgZWxpZiAid2hpbGUiIGluIHJlc3VsdHM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFuc2Zvcm1fd2hpbGUobm9kZSwgcmVzdWx0cykKKyAgICAgICAgZWxpZiAic29ydGVkIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhbnNmb3JtX3NvcnQobm9kZSwgcmVzdWx0cykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiSW52YWxpZCBtYXRjaCIpCisKKyAgICBkZWYgdHJhbnNmb3JtX2lzaW5zdGFuY2Uoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHggPSByZXN1bHRzWyJ4Il0uY2xvbmUoKSAjIFRoZSB0aGluZyBpbnNpZGUgb2YgdHlwZSgpCisgICAgICAgIFQgPSByZXN1bHRzWyJUIl0uY2xvbmUoKSAjIFRoZSB0eXBlIGJlaW5nIGNvbXBhcmVkIGFnYWluc3QKKyAgICAgICAgeC5wcmVmaXggPSB1IiIKKyAgICAgICAgVC5wcmVmaXggPSB1IiAiCisgICAgICAgIHRlc3QgPSBDYWxsKE5hbWUodSJpc2luc3RhbmNlIiksIFt4LCBDb21tYSgpLCBUXSkKKyAgICAgICAgaWYgIm4iIGluIHJlc3VsdHM6CisgICAgICAgICAgICB0ZXN0LnByZWZpeCA9IHUiICIKKyAgICAgICAgICAgIHRlc3QgPSBOb2RlKHN5bXMubm90X3Rlc3QsIFtOYW1lKHUibm90IiksIHRlc3RdKQorICAgICAgICB0ZXN0LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHJldHVybiB0ZXN0CisKKyAgICBkZWYgdHJhbnNmb3JtX3doaWxlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBvbmUgPSByZXN1bHRzWyJ3aGlsZSJdCisgICAgICAgIG9uZS5yZXBsYWNlKE5hbWUodSJUcnVlIiwgcHJlZml4PW9uZS5wcmVmaXgpKQorCisgICAgZGVmIHRyYW5zZm9ybV9zb3J0KHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBzb3J0X3N0bXQgPSByZXN1bHRzWyJzb3J0Il0KKyAgICAgICAgbmV4dF9zdG10ID0gcmVzdWx0c1sibmV4dCJdCisgICAgICAgIGxpc3RfY2FsbCA9IHJlc3VsdHMuZ2V0KCJsaXN0IikKKyAgICAgICAgc2ltcGxlX2V4cHIgPSByZXN1bHRzLmdldCgiZXhwciIpCisKKyAgICAgICAgaWYgbGlzdF9jYWxsOgorICAgICAgICAgICAgbGlzdF9jYWxsLnJlcGxhY2UoTmFtZSh1InNvcnRlZCIsIHByZWZpeD1saXN0X2NhbGwucHJlZml4KSkKKyAgICAgICAgZWxpZiBzaW1wbGVfZXhwcjoKKyAgICAgICAgICAgIG5ldyA9IHNpbXBsZV9leHByLmNsb25lKCkKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgIHNpbXBsZV9leHByLnJlcGxhY2UoQ2FsbChOYW1lKHUic29ydGVkIiksIFtuZXddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1zaW1wbGVfZXhwci5wcmVmaXgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJzaG91bGQgbm90IGhhdmUgcmVhY2hlZCBoZXJlIikKKyAgICAgICAgc29ydF9zdG10LnJlbW92ZSgpCisKKyAgICAgICAgYnR3biA9IHNvcnRfc3RtdC5wcmVmaXgKKyAgICAgICAgIyBLZWVwIGFueSBwcmVmaXggbGluZXMgYmV0d2VlbiB0aGUgc29ydF9zdG10IGFuZCB0aGUgbGlzdF9jYWxsIGFuZAorICAgICAgICAjIHNob3ZlIHRoZW0gcmlnaHQgYWZ0ZXIgdGhlIHNvcnRlZCgpIGNhbGwuCisgICAgICAgIGlmIHUiXG4iIGluIGJ0d246CisgICAgICAgICAgICBpZiBuZXh0X3N0bXQ6CisgICAgICAgICAgICAgICAgIyBUaGUgbmV3IHByZWZpeCBzaG91bGQgYmUgZXZlcnl0aGluZyBmcm9tIHRoZSBzb3J0X3N0bXQncworICAgICAgICAgICAgICAgICMgcHJlZml4IHVwIHRvIHRoZSBsYXN0IG5ld2xpbmUsIHRoZW4gdGhlIG9sZCBwcmVmaXggYWZ0ZXIgYSBuZXcKKyAgICAgICAgICAgICAgICAjIGxpbmUuCisgICAgICAgICAgICAgICAgcHJlZml4X2xpbmVzID0gKGJ0d24ucnBhcnRpdGlvbih1IlxuIilbMF0sIG5leHRfc3RtdFswXS5wcmVmaXgpCisgICAgICAgICAgICAgICAgbmV4dF9zdG10WzBdLnByZWZpeCA9IHUiXG4iLmpvaW4ocHJlZml4X2xpbmVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGlzdF9jYWxsLnBhcmVudAorICAgICAgICAgICAgICAgIGFzc2VydCBsaXN0X2NhbGwubmV4dF9zaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICAjIFB1dCBhIGJsYW5rIGxpbmUgYWZ0ZXIgbGlzdF9jYWxsIGFuZCBzZXQgaXRzIHByZWZpeC4KKyAgICAgICAgICAgICAgICBlbmRfbGluZSA9IEJsYW5rTGluZSgpCisgICAgICAgICAgICAgICAgbGlzdF9jYWxsLnBhcmVudC5hcHBlbmRfY2hpbGQoZW5kX2xpbmUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IGxpc3RfY2FsbC5uZXh0X3NpYmxpbmcgaXMgZW5kX2xpbmUKKyAgICAgICAgICAgICAgICAjIFRoZSBuZXcgcHJlZml4IHNob3VsZCBiZSBldmVyeXRoaW5nIHVwIHRvIHRoZSBmaXJzdCBuZXcgbGluZQorICAgICAgICAgICAgICAgICMgb2Ygc29ydF9zdG10J3MgcHJlZml4LgorICAgICAgICAgICAgICAgIGVuZF9saW5lLnByZWZpeCA9IGJ0d24ucnBhcnRpdGlvbih1IlxuIilbMF0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzM5ZDk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pZGlvbXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaWRpb21zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODBiYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pZGlvbXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxZTgxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5CkBAIC0wLDAgKzEsOTkgQEAKKyIiIkZpeGVyIGZvciBpbXBvcnQgc3RhdGVtZW50cy4KK0lmIHNwYW0gaXMgYmVpbmcgaW1wb3J0ZWQgZnJvbSB0aGUgbG9jYWwgZGlyZWN0b3J5LCB0aGlzIGltcG9ydDoKKyAgICBmcm9tIHNwYW0gaW1wb3J0IGVnZ3MKK0JlY29tZXM6CisgICAgZnJvbSAuc3BhbSBpbXBvcnQgZWdncworCitBbmQgdGhpcyBpbXBvcnQ6CisgICAgaW1wb3J0IHNwYW0KK0JlY29tZXM6CisgICAgZnJvbSAuIGltcG9ydCBzcGFtCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIG9zLnBhdGggaW1wb3J0IGRpcm5hbWUsIGpvaW4sIGV4aXN0cywgc2VwCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgRnJvbUltcG9ydCwgc3ltcywgdG9rZW4KKworCitkZWYgdHJhdmVyc2VfaW1wb3J0cyhuYW1lcyk6CisgICAgIiIiCisgICAgV2Fsa3Mgb3ZlciBhbGwgdGhlIG5hbWVzIGltcG9ydGVkIGluIGEgZG90dGVkX2FzX25hbWVzIG5vZGUuCisgICAgIiIiCisgICAgcGVuZGluZyA9IFtuYW1lc10KKyAgICB3aGlsZSBwZW5kaW5nOgorICAgICAgICBub2RlID0gcGVuZGluZy5wb3AoKQorICAgICAgICBpZiBub2RlLnR5cGUgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgIHlpZWxkIG5vZGUudmFsdWUKKyAgICAgICAgZWxpZiBub2RlLnR5cGUgPT0gc3ltcy5kb3R0ZWRfbmFtZToKKyAgICAgICAgICAgIHlpZWxkICIiLmpvaW4oW2NoLnZhbHVlIGZvciBjaCBpbiBub2RlLmNoaWxkcmVuXSkKKyAgICAgICAgZWxpZiBub2RlLnR5cGUgPT0gc3ltcy5kb3R0ZWRfYXNfbmFtZToKKyAgICAgICAgICAgIHBlbmRpbmcuYXBwZW5kKG5vZGUuY2hpbGRyZW5bMF0pCisgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMuZG90dGVkX2FzX25hbWVzOgorICAgICAgICAgICAgcGVuZGluZy5leHRlbmQobm9kZS5jaGlsZHJlbls6Oi0yXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ1bmtvd24gbm9kZSB0eXBlIikKKworCitjbGFzcyBGaXhJbXBvcnQoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIGltcG9ydF9mcm9tPCAnZnJvbScgaW1wPWFueSAnaW1wb3J0JyBbJygnXSBhbnkgWycpJ10gPgorICAgIHwKKyAgICBpbXBvcnRfbmFtZTwgJ2ltcG9ydCcgaW1wPWFueSA+CisgICAgIiIiCisKKyAgICBkZWYgc3RhcnRfdHJlZShzZWxmLCB0cmVlLCBuYW1lKToKKyAgICAgICAgc3VwZXIoRml4SW1wb3J0LCBzZWxmKS5zdGFydF90cmVlKHRyZWUsIG5hbWUpCisgICAgICAgIHNlbGYuc2tpcCA9ICJhYnNvbHV0ZV9pbXBvcnQiIGluIHRyZWUuZnV0dXJlX2ZlYXR1cmVzCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiBzZWxmLnNraXA6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW1wID0gcmVzdWx0c1snaW1wJ10KKworICAgICAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5pbXBvcnRfZnJvbToKKyAgICAgICAgICAgICMgU29tZSBpbXBzIGFyZSB0b3AtbGV2ZWwgKGVnOiAnaW1wb3J0IGhhbScpCisgICAgICAgICAgICAjIHNvbWUgYXJlIGZpcnN0IGxldmVsIChlZzogJ2ltcG9ydCBoYW0uZWdncycpCisgICAgICAgICAgICAjIHNvbWUgYXJlIHRoaXJkIGxldmVsIChlZzogJ2ltcG9ydCBoYW0uZWdncyBhcyBzcGFtJykKKyAgICAgICAgICAgICMgSGVuY2UsIHRoZSBsb29wCisgICAgICAgICAgICB3aGlsZSBub3QgaGFzYXR0cihpbXAsICd2YWx1ZScpOgorICAgICAgICAgICAgICAgIGltcCA9IGltcC5jaGlsZHJlblswXQorICAgICAgICAgICAgaWYgc2VsZi5wcm9iYWJseV9hX2xvY2FsX2ltcG9ydChpbXAudmFsdWUpOgorICAgICAgICAgICAgICAgIGltcC52YWx1ZSA9IHUiLiIgKyBpbXAudmFsdWUKKyAgICAgICAgICAgICAgICBpbXAuY2hhbmdlZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoYXZlX2xvY2FsID0gRmFsc2UKKyAgICAgICAgICAgIGhhdmVfYWJzb2x1dGUgPSBGYWxzZQorICAgICAgICAgICAgZm9yIG1vZF9uYW1lIGluIHRyYXZlcnNlX2ltcG9ydHMoaW1wKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnByb2JhYmx5X2FfbG9jYWxfaW1wb3J0KG1vZF9uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgaGF2ZV9sb2NhbCA9IFRydWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoYXZlX2Fic29sdXRlID0gVHJ1ZQorICAgICAgICAgICAgaWYgaGF2ZV9hYnNvbHV0ZToKKyAgICAgICAgICAgICAgICBpZiBoYXZlX2xvY2FsOgorICAgICAgICAgICAgICAgICAgICAjIFdlIHdvbid0IGhhbmRsZSBib3RoIHNpYmxpbmcgYW5kIGFic29sdXRlIGltcG9ydHMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICMgc2FtZSBzdGF0ZW1lbnQgYXQgdGhlIG1vbWVudC4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKG5vZGUsICJhYnNvbHV0ZSBhbmQgbG9jYWwgaW1wb3J0cyB0b2dldGhlciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIG5ldyA9IEZyb21JbXBvcnQodSIuIiwgW2ltcF0pCisgICAgICAgICAgICBuZXcucHJlZml4ID0gbm9kZS5wcmVmaXgKKyAgICAgICAgICAgIHJldHVybiBuZXcKKworICAgIGRlZiBwcm9iYWJseV9hX2xvY2FsX2ltcG9ydChzZWxmLCBpbXBfbmFtZSk6CisgICAgICAgIGlmIGltcF9uYW1lLnN0YXJ0c3dpdGgodSIuIik6CisgICAgICAgICAgICAjIFJlbGF0aXZlIGltcG9ydHMgYXJlIGNlcnRhaW5seSBub3QgbG9jYWwgaW1wb3J0cy4KKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpbXBfbmFtZSA9IGltcF9uYW1lLnNwbGl0KHUiLiIsIDEpWzBdCisgICAgICAgIGJhc2VfcGF0aCA9IGRpcm5hbWUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgYmFzZV9wYXRoID0gam9pbihiYXNlX3BhdGgsIGltcF9uYW1lKQorICAgICAgICAjIElmIHRoZXJlIGlzIG5vIF9faW5pdF9fLnB5IG5leHQgdG8gdGhlIGZpbGUgaXRzIG5vdCBpbiBhIHBhY2thZ2UKKyAgICAgICAgIyBzbyBjYW4ndCBiZSBhIHJlbGF0aXZlIGltcG9ydC4KKyAgICAgICAgaWYgbm90IGV4aXN0cyhqb2luKGRpcm5hbWUoYmFzZV9wYXRoKSwgIl9faW5pdF9fLnB5IikpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGZvciBleHQgaW4gWyIucHkiLCBzZXAsICIucHljIiwgIi5zbyIsICIuc2wiLCAiLnB5ZCJdOgorICAgICAgICAgICAgaWYgZXhpc3RzKGJhc2VfcGF0aCArIGV4dCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2NTM3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2NTM3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjOWU2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weQpAQCAtMCwwICsxLDE0NSBAQAorIiIiRml4IGluY29tcGF0aWJsZSBpbXBvcnRzIGFuZCBtb2R1bGUgcmVmZXJlbmNlcy4iIiIKKyMgQXV0aG9yczogQ29sbGluIFdpbnRlciwgTmljayBFZGRzCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIGF0dHJfY2hhaW4KKworTUFQUElORyA9IHsnU3RyaW5nSU8nOiAgJ2lvJywKKyAgICAgICAgICAgJ2NTdHJpbmdJTyc6ICdpbycsCisgICAgICAgICAgICdjUGlja2xlJzogJ3BpY2tsZScsCisgICAgICAgICAgICdfX2J1aWx0aW5fXycgOiAnYnVpbHRpbnMnLAorICAgICAgICAgICAnY29weV9yZWcnOiAnY29weXJlZycsCisgICAgICAgICAgICdRdWV1ZSc6ICdxdWV1ZScsCisgICAgICAgICAgICdTb2NrZXRTZXJ2ZXInOiAnc29ja2V0c2VydmVyJywKKyAgICAgICAgICAgJ0NvbmZpZ1BhcnNlcic6ICdjb25maWdwYXJzZXInLAorICAgICAgICAgICAncmVwcic6ICdyZXBybGliJywKKyAgICAgICAgICAgJ0ZpbGVEaWFsb2cnOiAndGtpbnRlci5maWxlZGlhbG9nJywKKyAgICAgICAgICAgJ3RrRmlsZURpYWxvZyc6ICd0a2ludGVyLmZpbGVkaWFsb2cnLAorICAgICAgICAgICAnU2ltcGxlRGlhbG9nJzogJ3RraW50ZXIuc2ltcGxlZGlhbG9nJywKKyAgICAgICAgICAgJ3RrU2ltcGxlRGlhbG9nJzogJ3RraW50ZXIuc2ltcGxlZGlhbG9nJywKKyAgICAgICAgICAgJ3RrQ29sb3JDaG9vc2VyJzogJ3RraW50ZXIuY29sb3JjaG9vc2VyJywKKyAgICAgICAgICAgJ3RrQ29tbW9uRGlhbG9nJzogJ3RraW50ZXIuY29tbW9uZGlhbG9nJywKKyAgICAgICAgICAgJ0RpYWxvZyc6ICd0a2ludGVyLmRpYWxvZycsCisgICAgICAgICAgICdUa2RuZCc6ICd0a2ludGVyLmRuZCcsCisgICAgICAgICAgICd0a0ZvbnQnOiAndGtpbnRlci5mb250JywKKyAgICAgICAgICAgJ3RrTWVzc2FnZUJveCc6ICd0a2ludGVyLm1lc3NhZ2Vib3gnLAorICAgICAgICAgICAnU2Nyb2xsZWRUZXh0JzogJ3RraW50ZXIuc2Nyb2xsZWR0ZXh0JywKKyAgICAgICAgICAgJ1RrY29uc3RhbnRzJzogJ3RraW50ZXIuY29uc3RhbnRzJywKKyAgICAgICAgICAgJ1RpeCc6ICd0a2ludGVyLnRpeCcsCisgICAgICAgICAgICd0dGsnOiAndGtpbnRlci50dGsnLAorICAgICAgICAgICAnVGtpbnRlcic6ICd0a2ludGVyJywKKyAgICAgICAgICAgJ21hcmt1cGJhc2UnOiAnX21hcmt1cGJhc2UnLAorICAgICAgICAgICAnX3dpbnJlZyc6ICd3aW5yZWcnLAorICAgICAgICAgICAndGhyZWFkJzogJ190aHJlYWQnLAorICAgICAgICAgICAnZHVtbXlfdGhyZWFkJzogJ19kdW1teV90aHJlYWQnLAorICAgICAgICAgICAjIGFueWRibSBhbmQgd2hpY2hkYiBhcmUgaGFuZGxlZCBieSBmaXhfaW1wb3J0czIKKyAgICAgICAgICAgJ2RiaGFzaCc6ICdkYm0uYnNkJywKKyAgICAgICAgICAgJ2R1bWJkYm0nOiAnZGJtLmR1bWInLAorICAgICAgICAgICAnZGJtJzogJ2RibS5uZGJtJywKKyAgICAgICAgICAgJ2dkYm0nOiAnZGJtLmdudScsCisgICAgICAgICAgICd4bWxycGNsaWInOiAneG1scnBjLmNsaWVudCcsCisgICAgICAgICAgICdEb2NYTUxSUENTZXJ2ZXInOiAneG1scnBjLnNlcnZlcicsCisgICAgICAgICAgICdTaW1wbGVYTUxSUENTZXJ2ZXInOiAneG1scnBjLnNlcnZlcicsCisgICAgICAgICAgICdodHRwbGliJzogJ2h0dHAuY2xpZW50JywKKyAgICAgICAgICAgJ2h0bWxlbnRpdHlkZWZzJyA6ICdodG1sLmVudGl0aWVzJywKKyAgICAgICAgICAgJ0hUTUxQYXJzZXInIDogJ2h0bWwucGFyc2VyJywKKyAgICAgICAgICAgJ0Nvb2tpZSc6ICdodHRwLmNvb2tpZXMnLAorICAgICAgICAgICAnY29va2llbGliJzogJ2h0dHAuY29va2llamFyJywKKyAgICAgICAgICAgJ0Jhc2VIVFRQU2VydmVyJzogJ2h0dHAuc2VydmVyJywKKyAgICAgICAgICAgJ1NpbXBsZUhUVFBTZXJ2ZXInOiAnaHR0cC5zZXJ2ZXInLAorICAgICAgICAgICAnQ0dJSFRUUFNlcnZlcic6ICdodHRwLnNlcnZlcicsCisgICAgICAgICAgICMndGVzdC50ZXN0X3N1cHBvcnQnOiAndGVzdC5zdXBwb3J0JywKKyAgICAgICAgICAgJ2NvbW1hbmRzJzogJ3N1YnByb2Nlc3MnLAorICAgICAgICAgICAnVXNlclN0cmluZycgOiAnY29sbGVjdGlvbnMnLAorICAgICAgICAgICAnVXNlckxpc3QnIDogJ2NvbGxlY3Rpb25zJywKKyAgICAgICAgICAgJ3VybHBhcnNlJyA6ICd1cmxsaWIucGFyc2UnLAorICAgICAgICAgICAncm9ib3RwYXJzZXInIDogJ3VybGxpYi5yb2JvdHBhcnNlcicsCit9CisKKworZGVmIGFsdGVybmF0ZXMobWVtYmVycyk6CisgICAgcmV0dXJuICIoIiArICJ8Ii5qb2luKG1hcChyZXByLCBtZW1iZXJzKSkgKyAiKSIKKworCitkZWYgYnVpbGRfcGF0dGVybihtYXBwaW5nPU1BUFBJTkcpOgorICAgIG1vZF9saXN0ID0gJyB8ICcuam9pbihbIm1vZHVsZV9uYW1lPSclcyciICUga2V5IGZvciBrZXkgaW4gbWFwcGluZ10pCisgICAgYmFyZV9uYW1lcyA9IGFsdGVybmF0ZXMobWFwcGluZy5rZXlzKCkpCisKKyAgICB5aWVsZCAiIiJuYW1lX2ltcG9ydD1pbXBvcnRfbmFtZTwgJ2ltcG9ydCcgKCglcykgfAorICAgICAgICAgICAgICAgbXVsdGlwbGVfaW1wb3J0cz1kb3R0ZWRfYXNfbmFtZXM8IGFueSogKCVzKSBhbnkqID4pID4KKyAgICAgICAgICAiIiIgJSAobW9kX2xpc3QsIG1vZF9saXN0KQorICAgIHlpZWxkICIiImltcG9ydF9mcm9tPCAnZnJvbScgKCVzKSAnaW1wb3J0JyBbJygnXQorICAgICAgICAgICAgICAoIGFueSB8IGltcG9ydF9hc19uYW1lPCBhbnkgJ2FzJyBhbnkgPiB8CisgICAgICAgICAgICAgICAgaW1wb3J0X2FzX25hbWVzPCBhbnkqID4pICBbJyknXSA+CisgICAgICAgICAgIiIiICUgbW9kX2xpc3QKKyAgICB5aWVsZCAiIiJpbXBvcnRfbmFtZTwgJ2ltcG9ydCcgKGRvdHRlZF9hc19uYW1lPCAoJXMpICdhcycgYW55ID4gfAorICAgICAgICAgICAgICAgbXVsdGlwbGVfaW1wb3J0cz1kb3R0ZWRfYXNfbmFtZXM8CisgICAgICAgICAgICAgICAgIGFueSogZG90dGVkX2FzX25hbWU8ICglcykgJ2FzJyBhbnkgPiBhbnkqID4pID4KKyAgICAgICAgICAiIiIgJSAobW9kX2xpc3QsIG1vZF9saXN0KQorCisgICAgIyBGaW5kIHVzYWdlcyBvZiBtb2R1bGUgbWVtYmVycyBpbiBjb2RlIGUuZy4gdGhyZWFkLmZvbyhiYXIpCisgICAgeWllbGQgInBvd2VyPCBiYXJlX3dpdGhfYXR0cj0oJXMpIHRyYWlsZXI8Jy4nIGFueSA+IGFueSogPiIgJSBiYXJlX25hbWVzCisKKworY2xhc3MgRml4SW1wb3J0cyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBrZWVwX2xpbmVfb3JkZXIgPSBUcnVlCisgICAgIyBUaGlzIGlzIG92ZXJyaWRkZW4gaW4gZml4X2ltcG9ydHMyLgorICAgIG1hcHBpbmcgPSBNQVBQSU5HCisKKyAgICAjIFdlIHdhbnQgdG8gcnVuIHRoaXMgZml4ZXIgbGF0ZSwgc28gZml4X2ltcG9ydCBkb2Vzbid0IHRyeSB0byBtYWtlIHN0ZGxpYgorICAgICMgcmVuYW1lcyBpbnRvIHJlbGF0aXZlIGltcG9ydHMuCisgICAgcnVuX29yZGVyID0gNgorCisgICAgZGVmIGJ1aWxkX3BhdHRlcm4oc2VsZik6CisgICAgICAgIHJldHVybiAifCIuam9pbihidWlsZF9wYXR0ZXJuKHNlbGYubWFwcGluZykpCisKKyAgICBkZWYgY29tcGlsZV9wYXR0ZXJuKHNlbGYpOgorICAgICAgICAjIFdlIG92ZXJyaWRlIHRoaXMsIHNvIE1BUFBJTkcgY2FuIGJlIHByYWdtYXRpY2FsbHkgYWx0ZXJlZCBhbmQgdGhlCisgICAgICAgICMgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiBQQVRURVJOLgorICAgICAgICBzZWxmLlBBVFRFUk4gPSBzZWxmLmJ1aWxkX3BhdHRlcm4oKQorICAgICAgICBzdXBlcihGaXhJbXBvcnRzLCBzZWxmKS5jb21waWxlX3BhdHRlcm4oKQorCisgICAgIyBEb24ndCBtYXRjaCB0aGUgbm9kZSBpZiBpdCdzIHdpdGhpbiBhbm90aGVyIG1hdGNoLgorICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKKyAgICAgICAgbWF0Y2ggPSBzdXBlcihGaXhJbXBvcnRzLCBzZWxmKS5tYXRjaAorICAgICAgICByZXN1bHRzID0gbWF0Y2gobm9kZSkKKyAgICAgICAgaWYgcmVzdWx0czoKKyAgICAgICAgICAgICMgTW9kdWxlIHVzYWdlIGNvdWxkIGJlIGluIHRoZSB0cmFpbGVyIG9mIGFuIGF0dHJpYnV0ZSBsb29rdXAsIHNvIHdlCisgICAgICAgICAgICAjIG1pZ2h0IGhhdmUgbmVzdGVkIG1hdGNoZXMgd2hlbiAiYmFyZV93aXRoX2F0dHIiIGlzIHByZXNlbnQuCisgICAgICAgICAgICBpZiAiYmFyZV93aXRoX2F0dHIiIG5vdCBpbiByZXN1bHRzIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIGFueShtYXRjaChvYmopIGZvciBvYmogaW4gYXR0cl9jaGFpbihub2RlLCAicGFyZW50IikpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHMKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgc3RhcnRfdHJlZShzZWxmLCB0cmVlLCBmaWxlbmFtZSk6CisgICAgICAgIHN1cGVyKEZpeEltcG9ydHMsIHNlbGYpLnN0YXJ0X3RyZWUodHJlZSwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYucmVwbGFjZSA9IHt9CisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpbXBvcnRfbW9kID0gcmVzdWx0cy5nZXQoIm1vZHVsZV9uYW1lIikKKyAgICAgICAgaWYgaW1wb3J0X21vZDoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gaW1wb3J0X21vZC52YWx1ZQorICAgICAgICAgICAgbmV3X25hbWUgPSB1bmljb2RlKHNlbGYubWFwcGluZ1ttb2RfbmFtZV0pCisgICAgICAgICAgICBpbXBvcnRfbW9kLnJlcGxhY2UoTmFtZShuZXdfbmFtZSwgcHJlZml4PWltcG9ydF9tb2QucHJlZml4KSkKKyAgICAgICAgICAgIGlmICJuYW1lX2ltcG9ydCIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgICAgICAjIElmIGl0J3Mgbm90IGEgImZyb20geCBpbXBvcnQgeCwgeSIgb3IgImltcG9ydCB4IGFzIHkiIGltcG9ydCwKKyAgICAgICAgICAgICAgICAjIG1hcmtlZCBpdHMgdXNhZ2UgdG8gYmUgcmVwbGFjZWQuCisgICAgICAgICAgICAgICAgc2VsZi5yZXBsYWNlW21vZF9uYW1lXSA9IG5ld19uYW1lCisgICAgICAgICAgICBpZiAibXVsdGlwbGVfaW1wb3J0cyIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSBuYXN0eSBoYWNrIHRvIGZpeCBtdWx0aXBsZSBpbXBvcnRzIG9uIGEgbGluZSAoZS5nLiwKKyAgICAgICAgICAgICAgICAjICJpbXBvcnQgU3RyaW5nSU8sIHVybHBhcnNlIikuIFRoZSBwcm9ibGVtIGlzIHRoYXQgSSBjYW4ndAorICAgICAgICAgICAgICAgICMgZmlndXJlIG91dCBhbiBlYXN5IHdheSB0byBtYWtlIGEgcGF0dGVybiByZWNvZ25pemUgdGhlIGtleXMgb2YKKyAgICAgICAgICAgICAgICAjIE1BUFBJTkcgcmFuZG9tbHkgc3ByaW5rbGVkIGluIGFuIGltcG9ydCBzdGF0ZW1lbnQuCisgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHNlbGYubWF0Y2gobm9kZSkKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRyYW5zZm9ybShub2RlLCByZXN1bHRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSZXBsYWNlIHVzYWdlIG9mIHRoZSBtb2R1bGUuCisgICAgICAgICAgICBiYXJlX25hbWUgPSByZXN1bHRzWyJiYXJlX3dpdGhfYXR0ciJdWzBdCisgICAgICAgICAgICBuZXdfbmFtZSA9IHNlbGYucmVwbGFjZS5nZXQoYmFyZV9uYW1lLnZhbHVlKQorICAgICAgICAgICAgaWYgbmV3X25hbWU6CisgICAgICAgICAgICAgICAgYmFyZV9uYW1lLnJlcGxhY2UoTmFtZShuZXdfbmFtZSwgcHJlZml4PWJhcmVfbmFtZS5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1ZDAyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1ZDAyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbXBvcnRzMi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0czIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzM2M2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0czIucHkKQEAgLTAsMCArMSwxNiBAQAorIiIiRml4IGluY29tcGF0aWJsZSBpbXBvcnRzIGFuZCBtb2R1bGUgcmVmZXJlbmNlcyB0aGF0IG11c3QgYmUgZml4ZWQgYWZ0ZXIKK2ZpeF9pbXBvcnRzLiIiIgorZnJvbSAuIGltcG9ydCBmaXhfaW1wb3J0cworCisKK01BUFBJTkcgPSB7CisgICAgICAgICAgICAnd2hpY2hkYic6ICdkYm0nLAorICAgICAgICAgICAgJ2FueWRibSc6ICdkYm0nLAorICAgICAgICAgIH0KKworCitjbGFzcyBGaXhJbXBvcnRzMihmaXhfaW1wb3J0cy5GaXhJbXBvcnRzKToKKworICAgIHJ1bl9vcmRlciA9IDcKKworICAgIG1hcHBpbmcgPSBNQVBQSU5HCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0czIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW1wb3J0czIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZDQ1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ltcG9ydHMyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmY0YzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnB1dC5weQpAQCAtMCwwICsxLDI2IEBACisiIiJGaXhlciB0aGF0IGNoYW5nZXMgaW5wdXQoLi4uKSBpbnRvIGV2YWwoaW5wdXQoLi4uKSkuIiIiCisjIEF1dGhvcjogQW5kcmUgUm9iZXJnZQorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBDYWxsLCBOYW1lCitmcm9tIC4uIGltcG9ydCBwYXRjb21wCisKKworY29udGV4dCA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKCJwb3dlcjwgJ2V2YWwnIHRyYWlsZXI8ICcoJyBhbnkgJyknID4gPiIpCisKKworY2xhc3MgRml4SW5wdXQoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8ICdpbnB1dCcgYXJncz10cmFpbGVyPCAnKCcgW2FueV0gJyknID4gPgorICAgICAgICAgICAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgICMgSWYgd2UncmUgYWxyZWFkeSB3cmFwcGVkIGluIGEgZXZhbCgpIGNhbGwsIHdlJ3JlIGRvbmUuCisgICAgICAgIGlmIGNvbnRleHQubWF0Y2gobm9kZS5wYXJlbnQucGFyZW50KToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQorICAgICAgICBuZXcucHJlZml4ID0gdSIiCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJldmFsIiksIFtuZXddLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW5wdXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDFjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW5wdXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDFjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2lucHV0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YmI1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2ludGVybi5weQpAQCAtMCwwICsxLDQ2IEBACisjIENvcHlyaWdodCAyMDA2IEdlb3JnIEJyYW5kbC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciBmb3IgaW50ZXJuKCkuCisKK2ludGVybihzKSAtPiBzeXMuaW50ZXJuKHMpIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQXR0ciwgdG91Y2hfaW1wb3J0CisKKworY2xhc3MgRml4SW50ZXJuKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBvcmRlciA9ICJwcmUiCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8ICdpbnRlcm4nCisgICAgICAgICAgIHRyYWlsZXI8IGxwYXI9JygnCisgICAgICAgICAgICAgICAgICAgICggbm90KGFyZ2xpc3QgfCBhcmd1bWVudDxhbnkgJz0nIGFueT4pIG9iaj1hbnkKKyAgICAgICAgICAgICAgICAgICAgICB8IG9iaj1hcmdsaXN0PChub3QgYXJndW1lbnQ8YW55ICc9JyBhbnk+KSBhbnkgJywnPiApCisgICAgICAgICAgICAgICAgICAgIHJwYXI9JyknID4KKyAgICAgICAgICAgYWZ0ZXI9YW55KgorICAgID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHN5bXMgPSBzZWxmLnN5bXMKKyAgICAgICAgb2JqID0gcmVzdWx0c1sib2JqIl0uY2xvbmUoKQorICAgICAgICBpZiBvYmoudHlwZSA9PSBzeW1zLmFyZ2xpc3Q6CisgICAgICAgICAgICBuZXdhcmdsaXN0ID0gb2JqLmNsb25lKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld2FyZ2xpc3QgPSBweXRyZWUuTm9kZShzeW1zLmFyZ2xpc3QsIFtvYmouY2xvbmUoKV0pCisgICAgICAgIGFmdGVyID0gcmVzdWx0c1siYWZ0ZXIiXQorICAgICAgICBpZiBhZnRlcjoKKyAgICAgICAgICAgIGFmdGVyID0gW24uY2xvbmUoKSBmb3IgbiBpbiBhZnRlcl0KKyAgICAgICAgbmV3ID0gcHl0cmVlLk5vZGUoc3ltcy5wb3dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cihOYW1lKHUic3lzIiksIE5hbWUodSJpbnRlcm4iKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICBbcHl0cmVlLk5vZGUoc3ltcy50cmFpbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jlc3VsdHNbImxwYXIiXS5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2FyZ2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1sicnBhciJdLmNsb25lKCldKV0gKyBhZnRlcikKKyAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHRvdWNoX2ltcG9ydChOb25lLCB1J3N5cycsIG5vZGUpCisgICAgICAgIHJldHVybiBuZXcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE2MzkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnRlcm4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaW50ZXJuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE2MzkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pbnRlcm4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjA0YzhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pc2luc3RhbmNlLnB5CkBAIC0wLDAgKzEsNTIgQEAKKyMgQ29weXJpZ2h0IDIwMDggQXJtaW4gUm9uYWNoZXIuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgdGhhdCBjbGVhbnMgdXAgYSB0dXBsZSBhcmd1bWVudCB0byBpc2luc3RhbmNlIGFmdGVyIHRoZSB0b2tlbnMKK2luIGl0IHdlcmUgZml4ZWQuICBUaGlzIGlzIG1haW5seSB1c2VkIHRvIHJlbW92ZSBkb3VibGUgb2NjdXJyZW5jZXMgb2YKK3Rva2VucyBhcyBhIGxlZnRvdmVyIG9mIHRoZSBsb25nIC0+IGludCAvIHVuaWNvZGUgLT4gc3RyIGNvbnZlcnNpb24uCisKK2VnLiAgaXNpbnN0YW5jZSh4LCAoaW50LCBsb25nKSkgLT4gaXNpbnN0YW5jZSh4LCAoaW50LCBpbnQpKQorICAgICAgIC0+IGlzaW5zdGFuY2UoeCwgaW50KQorIiIiCisKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCB0b2tlbgorCisKK2NsYXNzIEZpeElzaW5zdGFuY2UoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwKKyAgICAgICAgJ2lzaW5zdGFuY2UnCisgICAgICAgIHRyYWlsZXI8ICcoJyBhcmdsaXN0PCBhbnkgJywnIGF0b208ICcoJworICAgICAgICAgICAgYXJncz10ZXN0bGlzdF9nZXhwPCBhbnkrID4KKyAgICAgICAgJyknID4gPiAnKScgPgorICAgID4KKyAgICAiIiIKKworICAgIHJ1bl9vcmRlciA9IDYKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5hbWVzX2luc2VydGVkID0gc2V0KCkKKyAgICAgICAgdGVzdGxpc3QgPSByZXN1bHRzWyJhcmdzIl0KKyAgICAgICAgYXJncyA9IHRlc3RsaXN0LmNoaWxkcmVuCisgICAgICAgIG5ld19hcmdzID0gW10KKyAgICAgICAgaXRlcmF0b3IgPSBlbnVtZXJhdGUoYXJncykKKyAgICAgICAgZm9yIGlkeCwgYXJnIGluIGl0ZXJhdG9yOgorICAgICAgICAgICAgaWYgYXJnLnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgYXJnLnZhbHVlIGluIG5hbWVzX2luc2VydGVkOgorICAgICAgICAgICAgICAgIGlmIGlkeCA8IGxlbihhcmdzKSAtIDEgYW5kIGFyZ3NbaWR4ICsgMV0udHlwZSA9PSB0b2tlbi5DT01NQToKKyAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld19hcmdzLmFwcGVuZChhcmcpCisgICAgICAgICAgICAgICAgaWYgYXJnLnR5cGUgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICAgICAgICAgbmFtZXNfaW5zZXJ0ZWQuYWRkKGFyZy52YWx1ZSkKKyAgICAgICAgaWYgbmV3X2FyZ3MgYW5kIG5ld19hcmdzWy0xXS50eXBlID09IHRva2VuLkNPTU1BOgorICAgICAgICAgICAgZGVsIG5ld19hcmdzWy0xXQorICAgICAgICBpZiBsZW4obmV3X2FyZ3MpID09IDE6CisgICAgICAgICAgICBhdG9tID0gdGVzdGxpc3QucGFyZW50CisgICAgICAgICAgICBuZXdfYXJnc1swXS5wcmVmaXggPSBhdG9tLnByZWZpeAorICAgICAgICAgICAgYXRvbS5yZXBsYWNlKG5ld19hcmdzWzBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnc1s6XSA9IG5ld19hcmdzCisgICAgICAgICAgICBub2RlLmNoYW5nZWQoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pc2luc3RhbmNlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlM2IyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pc2luc3RhbmNlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlM2IyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXNpbnN0YW5jZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Y4YTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHMucHkKQEAgLTAsMCArMSw0MyBAQAorIiIiIEZpeGVyIGZvciBpdGVydG9vbHMuKGltYXB8aWZpbHRlcnxpemlwKSAtLT4gKG1hcHxmaWx0ZXJ8emlwKSBhbmQKKyAgICBpdGVydG9vbHMuaWZpbHRlcmZhbHNlIC0tPiBpdGVydG9vbHMuZmlsdGVyZmFsc2UgKGJ1Z3MgMjM2MC0yMzYzKQorCisgICAgaW1wb3J0cyBmcm9tIGl0ZXJ0b29scyBhcmUgZml4ZWQgaW4gZml4X2l0ZXJ0b29sc19pbXBvcnQucHkKKworICAgIElmIGl0ZXJ0b29scyBpcyBpbXBvcnRlZCBhcyBzb21ldGhpbmcgZWxzZSAoaWU6IGltcG9ydCBpdGVydG9vbHMgYXMgaXQ7CisgICAgaXQuaXppcChzcGFtLCBlZ2dzKSkgbWV0aG9kIGNhbGxzIHdpbGwgbm90IGdldCBmaXhlZC4KKyAgICAiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQorCitjbGFzcyBGaXhJdGVydG9vbHMoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIGl0X2Z1bmNzID0gIignaW1hcCd8J2lmaWx0ZXInfCdpemlwJ3wnaXppcF9sb25nZXN0J3wnaWZpbHRlcmZhbHNlJykiCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICBwb3dlcjwgaXQ9J2l0ZXJ0b29scycKKyAgICAgICAgICAgICAgICAgIHRyYWlsZXI8CisgICAgICAgICAgICAgICAgICAgICBkb3Q9Jy4nIGZ1bmM9JShpdF9mdW5jcylzID4gdHJhaWxlcjwgJygnIFthbnldICcpJyA+ID4KKyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICBwb3dlcjwgZnVuYz0lKGl0X2Z1bmNzKXMgdHJhaWxlcjwgJygnIFthbnldICcpJyA+ID4KKyAgICAgICAgICAgICAgIiIiICUobG9jYWxzKCkpCisKKyAgICAjIE5lZWRzIHRvIGJlIHJ1biBhZnRlciBmaXhfKG1hcHx6aXB8ZmlsdGVyKQorICAgIHJ1bl9vcmRlciA9IDYKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHByZWZpeCA9IE5vbmUKKyAgICAgICAgZnVuYyA9IHJlc3VsdHNbJ2Z1bmMnXVswXQorICAgICAgICBpZiAoJ2l0JyBpbiByZXN1bHRzIGFuZAorICAgICAgICAgICAgZnVuYy52YWx1ZSBub3QgaW4gKHUnaWZpbHRlcmZhbHNlJywgdSdpemlwX2xvbmdlc3QnKSk6CisgICAgICAgICAgICBkb3QsIGl0ID0gKHJlc3VsdHNbJ2RvdCddLCByZXN1bHRzWydpdCddKQorICAgICAgICAgICAgIyBSZW1vdmUgdGhlICdpdGVydG9vbHMnCisgICAgICAgICAgICBwcmVmaXggPSBpdC5wcmVmaXgKKyAgICAgICAgICAgIGl0LnJlbW92ZSgpCisgICAgICAgICAgICAjIFJlcGxhY2UgdGhlIG5vZGUgd2ljaCBjb250YWlucyAoJy4nLCAnZnVuY3Rpb24nKSB3aXRoIHRoZQorICAgICAgICAgICAgIyBmdW5jdGlvbiAodG8gYmUgY29uc2lzdGFudCB3aXRoIHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgcGF0dGVybikKKyAgICAgICAgICAgIGRvdC5yZW1vdmUoKQorICAgICAgICAgICAgZnVuYy5wYXJlbnQucmVwbGFjZShmdW5jKQorCisgICAgICAgIHByZWZpeCA9IHByZWZpeCBvciBmdW5jLnByZWZpeAorICAgICAgICBmdW5jLnJlcGxhY2UoTmFtZShmdW5jLnZhbHVlWzE6XSwgcHJlZml4PXByZWZpeCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNWI4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29scy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNWI4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODYxMGNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9pdGVydG9vbHNfaW1wb3J0cy5weQpAQCAtMCwwICsxLDU3IEBACisiIiIgRml4ZXIgZm9yIGltcG9ydHMgb2YgaXRlcnRvb2xzLihpbWFwfGlmaWx0ZXJ8aXppcHxpZmlsdGVyZmFsc2UpICIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IEJsYW5rTGluZSwgc3ltcywgdG9rZW4KKworCitjbGFzcyBGaXhJdGVydG9vbHNJbXBvcnRzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIGltcG9ydF9mcm9tPCAnZnJvbScgJ2l0ZXJ0b29scycgJ2ltcG9ydCcgaW1wb3J0cz1hbnkgPgorICAgICAgICAgICAgICAiIiIgJShsb2NhbHMoKSkKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGltcG9ydHMgPSByZXN1bHRzWydpbXBvcnRzJ10KKyAgICAgICAgaWYgaW1wb3J0cy50eXBlID09IHN5bXMuaW1wb3J0X2FzX25hbWUgb3Igbm90IGltcG9ydHMuY2hpbGRyZW46CisgICAgICAgICAgICBjaGlsZHJlbiA9IFtpbXBvcnRzXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hpbGRyZW4gPSBpbXBvcnRzLmNoaWxkcmVuCisgICAgICAgIGZvciBjaGlsZCBpbiBjaGlsZHJlbls6OjJdOgorICAgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgICAgIG1lbWJlciA9IGNoaWxkLnZhbHVlCisgICAgICAgICAgICAgICAgbmFtZV9ub2RlID0gY2hpbGQKKyAgICAgICAgICAgIGVsaWYgY2hpbGQudHlwZSA9PSB0b2tlbi5TVEFSOgorICAgICAgICAgICAgICAgICMgSnVzdCBsZWF2ZSB0aGUgaW1wb3J0IGFzIGlzLgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgY2hpbGQudHlwZSA9PSBzeW1zLmltcG9ydF9hc19uYW1lCisgICAgICAgICAgICAgICAgbmFtZV9ub2RlID0gY2hpbGQuY2hpbGRyZW5bMF0KKyAgICAgICAgICAgIG1lbWJlcl9uYW1lID0gbmFtZV9ub2RlLnZhbHVlCisgICAgICAgICAgICBpZiBtZW1iZXJfbmFtZSBpbiAodSdpbWFwJywgdSdpemlwJywgdSdpZmlsdGVyJyk6CisgICAgICAgICAgICAgICAgY2hpbGQudmFsdWUgPSBOb25lCisgICAgICAgICAgICAgICAgY2hpbGQucmVtb3ZlKCkKKyAgICAgICAgICAgIGVsaWYgbWVtYmVyX25hbWUgaW4gKHUnaWZpbHRlcmZhbHNlJywgdSdpemlwX2xvbmdlc3QnKToKKyAgICAgICAgICAgICAgICBub2RlLmNoYW5nZWQoKQorICAgICAgICAgICAgICAgIG5hbWVfbm9kZS52YWx1ZSA9ICh1J2ZpbHRlcmZhbHNlJyBpZiBtZW1iZXJfbmFtZVsxXSA9PSB1J2YnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgdSd6aXBfbG9uZ2VzdCcpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaXMgc3RpbGwgc2FuZQorICAgICAgICBjaGlsZHJlbiA9IGltcG9ydHMuY2hpbGRyZW5bOl0gb3IgW2ltcG9ydHNdCisgICAgICAgIHJlbW92ZV9jb21tYSA9IFRydWUKKyAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgaWYgcmVtb3ZlX2NvbW1hIGFuZCBjaGlsZC50eXBlID09IHRva2VuLkNPTU1BOgorICAgICAgICAgICAgICAgIGNoaWxkLnJlbW92ZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlbW92ZV9jb21tYSBePSBUcnVlCisKKyAgICAgICAgd2hpbGUgY2hpbGRyZW4gYW5kIGNoaWxkcmVuWy0xXS50eXBlID09IHRva2VuLkNPTU1BOgorICAgICAgICAgICAgY2hpbGRyZW4ucG9wKCkucmVtb3ZlKCkKKworICAgICAgICAjIElmIHRoZXJlIGFyZSBubyBpbXBvcnRzIGxlZnQsIGp1c3QgZ2V0IHJpZCBvZiB0aGUgZW50aXJlIHN0YXRlbWVudAorICAgICAgICBpZiAobm90IChpbXBvcnRzLmNoaWxkcmVuIG9yIGdldGF0dHIoaW1wb3J0cywgJ3ZhbHVlJywgTm9uZSkpIG9yCisgICAgICAgICAgICBpbXBvcnRzLnBhcmVudCBpcyBOb25lKToKKyAgICAgICAgICAgIHAgPSBub2RlLnByZWZpeAorICAgICAgICAgICAgbm9kZSA9IEJsYW5rTGluZSgpCisgICAgICAgICAgICBub2RlLnByZWZpeCA9IHAKKyAgICAgICAgICAgIHJldHVybiBub2RlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzX2ltcG9ydHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Mjg3YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfaXRlcnRvb2xzX2ltcG9ydHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDdhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2l0ZXJ0b29sc19pbXBvcnRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X2xvbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkZGRlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weQpAQCAtMCwwICsxLDE5IEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIHRoYXQgdHVybnMgJ2xvbmcnIGludG8gJ2ludCcgZXZlcnl3aGVyZS4KKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IGlzX3Byb2JhYmx5X2J1aWx0aW4KKworCitjbGFzcyBGaXhMb25nKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIidsb25nJyIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGlmIGlzX3Byb2JhYmx5X2J1aWx0aW4obm9kZSk6CisgICAgICAgICAgICBub2RlLnZhbHVlID0gdSJpbnQiCisgICAgICAgICAgICBub2RlLmNoYW5nZWQoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkNDhjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9sb25nLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkNDhjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbG9uZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21hcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTdkMGRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHkKQEAgLTAsMCArMSw5MSBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciB0aGF0IGNoYW5nZXMgbWFwKEYsIC4uLikgaW50byBsaXN0KG1hcChGLCAuLi4pKSB1bmxlc3MgdGhlcmUKK2V4aXN0cyBhICdmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgbWFwJyBzdGF0ZW1lbnQgaW4gdGhlIHRvcC1sZXZlbAorbmFtZXNwYWNlLgorCitBcyBhIHNwZWNpYWwgY2FzZSwgbWFwKE5vbmUsIFgpIGlzIGNoYW5nZWQgaW50byBsaXN0KFgpLiAgKFRoaXMgaXMKK25lY2Vzc2FyeSBiZWNhdXNlIHRoZSBzZW1hbnRpY3MgYXJlIGNoYW5nZWQgaW4gdGhpcyBjYXNlIC0tIHRoZSBuZXcKK21hcChOb25lLCBYKSBpcyBlcXVpdmFsZW50IHRvIFsoeCwpIGZvciB4IGluIFhdLikKKworV2UgYXZvaWQgdGhlIHRyYW5zZm9ybWF0aW9uIChleGNlcHQgZm9yIHRoZSBzcGVjaWFsIGNhc2UgbWVudGlvbmVkCithYm92ZSkgaWYgdGhlIG1hcCgpIGNhbGwgaXMgZGlyZWN0bHkgY29udGFpbmVkIGluIGl0ZXIoPD4pLCBsaXN0KDw+KSwKK3R1cGxlKDw+KSwgc29ydGVkKDw+KSwgLi4uam9pbig8PiksIG9yIGZvciBWIGluIDw+Oi4KKworTk9URTogVGhpcyBpcyBzdGlsbCBub3QgY29ycmVjdCBpZiB0aGUgb3JpZ2luYWwgY29kZSB3YXMgZGVwZW5kaW5nIG9uCittYXAoRiwgWCwgWSwgLi4uKSB0byBnbyBvbiB1bnRpbCB0aGUgbG9uZ2VzdCBhcmd1bWVudCBpcyBleGhhdXN0ZWQsCitzdWJzdGl0dXRpbmcgTm9uZSBmb3IgbWlzc2luZyB2YWx1ZXMgLS0gbGlrZSB6aXAoKSwgaXQgbm93IHN0b3BzIGFzCitzb29uIGFzIHRoZSBzaG9ydGVzdCBhcmd1bWVudCBpcyBleGhhdXN0ZWQuCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgTGlzdENvbXAsIGluX3NwZWNpYWxfY29udGV4dAorZnJvbSAuLnB5Z3JhbSBpbXBvcnQgcHl0aG9uX3N5bWJvbHMgYXMgc3ltcworCitjbGFzcyBGaXhNYXAoZml4ZXJfYmFzZS5Db25kaXRpb25hbEZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICBtYXBfbm9uZT1wb3dlcjwKKyAgICAgICAgJ21hcCcKKyAgICAgICAgdHJhaWxlcjwgJygnIGFyZ2xpc3Q8ICdOb25lJyAnLCcgYXJnPWFueSBbJywnXSA+ICcpJyA+CisgICAgPgorICAgIHwKKyAgICBtYXBfbGFtYmRhPXBvd2VyPAorICAgICAgICAnbWFwJworICAgICAgICB0cmFpbGVyPAorICAgICAgICAgICAgJygnCisgICAgICAgICAgICBhcmdsaXN0PAorICAgICAgICAgICAgICAgIGxhbWJkZWY8ICdsYW1iZGEnCisgICAgICAgICAgICAgICAgICAgICAgICAgKGZwPU5BTUUgfCB2ZnBkZWY8ICcoJyBmcD1OQU1FICcpJz4gKSAnOicgeHA9YW55CisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAgICcsJworICAgICAgICAgICAgICAgIGl0PWFueQorICAgICAgICAgICAgPgorICAgICAgICAgICAgJyknCisgICAgICAgID4KKyAgICA+CisgICAgfAorICAgIHBvd2VyPAorICAgICAgICAnbWFwJyB0cmFpbGVyPCAnKCcgW2FyZ2xpc3Q9YW55XSAnKScgPgorICAgID4KKyAgICAiIiIKKworICAgIHNraXBfb24gPSAnZnV0dXJlX2J1aWx0aW5zLm1hcCcKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGlmIHNlbGYuc2hvdWxkX3NraXAobm9kZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub2RlLnBhcmVudC50eXBlID09IHN5bXMuc2ltcGxlX3N0bXQ6CisgICAgICAgICAgICBzZWxmLndhcm5pbmcobm9kZSwgIllvdSBzaG91bGQgdXNlIGEgZm9yIGxvb3AgaGVyZSIpCisgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgICAgIG5ldy5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgIG5ldyA9IENhbGwoTmFtZSh1Imxpc3QiKSwgW25ld10pCisgICAgICAgIGVsaWYgIm1hcF9sYW1iZGEiIGluIHJlc3VsdHM6CisgICAgICAgICAgICBuZXcgPSBMaXN0Q29tcChyZXN1bHRzWyJ4cCJdLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWyJmcCJdLmNsb25lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzWyJpdCJdLmNsb25lKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAibWFwX25vbmUiIGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgbmV3ID0gcmVzdWx0c1siYXJnIl0uY2xvbmUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiAiYXJnbGlzdCIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgICAgICAgICAgYXJncyA9IHJlc3VsdHNbImFyZ2xpc3QiXQorICAgICAgICAgICAgICAgICAgICBpZiBhcmdzLnR5cGUgPT0gc3ltcy5hcmdsaXN0IGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuY2hpbGRyZW5bMF0udHlwZSA9PSB0b2tlbi5OQU1FIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuY2hpbGRyZW5bMF0udmFsdWUgPT0gIk5vbmUiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53YXJuaW5nKG5vZGUsICJjYW5ub3QgY29udmVydCBtYXAoTm9uZSwgLi4uKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggbXVsdGlwbGUgYXJndW1lbnRzIGJlY2F1c2UgbWFwKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3cgdHJ1bmNhdGVzIHRvIHRoZSBzaG9ydGVzdCBzZXF1ZW5jZSIpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiBpbl9zcGVjaWFsX2NvbnRleHQobm9kZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgbmV3ID0gbm9kZS5jbG9uZSgpCisgICAgICAgICAgICBuZXcucHJlZml4ID0gdSIiCisgICAgICAgICAgICBuZXcgPSBDYWxsKE5hbWUodSJsaXN0IiksIFtuZXddKQorICAgICAgICBuZXcucHJlZml4ID0gbm9kZS5wcmVmaXgKKyAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNmVmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21hcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tYXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNmVmYmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21hcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGFjbGFzcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODZmYmVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHkKQEAgLTAsMCArMSwyMjggQEAKKyIiIkZpeGVyIGZvciBfX21ldGFjbGFzc19fID0gWCAtPiAobWV0YWNsYXNzPVgpIG1ldGhvZHMuCisKKyAgIFRoZSB2YXJpb3VzIGZvcm1zIG9mIGNsYXNzZWYgKGluaGVyaXRzIG5vdGhpbmcsIGluaGVyaXRzIG9uY2UsIGluaGVyaW50cworICAgbWFueSkgZG9uJ3QgcGFyc2UgdGhlIHNhbWUgaW4gdGhlIENTVCBzbyB3ZSBsb29rIGF0IEFMTCBjbGFzc2VzIGZvcgorICAgYSBfX21ldGFjbGFzc19fIGFuZCBpZiB3ZSBmaW5kIG9uZSBub3JtYWxpemUgdGhlIGluaGVyaXRzIHRvIGFsbCBiZQorICAgYW4gYXJnbGlzdC4KKworICAgRm9yIG9uZS1saW5lciBjbGFzc2VzICgnY2xhc3MgWDogcGFzcycpIHRoZXJlIGlzIG5vIGluZGVudC9kZWRlbnQgc28KKyAgIHdlIG5vcm1hbGl6ZSB0aG9zZSBpbnRvIGhhdmluZyBhIHN1aXRlLgorCisgICBNb3ZpbmcgdGhlIF9fbWV0YWNsYXNzX18gaW50byB0aGUgY2xhc3NkZWYgY2FuIGFsc28gY2F1c2UgdGhlIGNsYXNzCisgICBib2R5IHRvIGJlIGVtcHR5IHNvIHRoZXJlIGlzIHNvbWUgc3BlY2lhbCBjYXNpbmcgZm9yIHRoYXQgYXMgd2VsbC4KKworICAgVGhpcyBmaXhlciBhbHNvIHRyaWVzIHZlcnkgaGFyZCB0byBrZWVwIG9yaWdpbmFsIGluZGVudGluZyBhbmQgc3BhY2luZworICAgaW4gYWxsIHRob3NlIGNvcm5lciBjYXNlcy4KKworIiIiCisjIEF1dGhvcjogSmFjayBEaWVkZXJpY2gKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4ucHlncmFtIGltcG9ydCB0b2tlbgorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIHN5bXMsIE5vZGUsIExlYWYKKworCitkZWYgaGFzX21ldGFjbGFzcyhwYXJlbnQpOgorICAgICIiIiB3ZSBoYXZlIHRvIGNoZWNrIHRoZSBjbHNfbm9kZSB3aXRob3V0IGNoYW5naW5nIGl0LgorICAgICAgICBUaGVyZSBhcmUgdHdvIHBvc3NpYmxpdGllczoKKyAgICAgICAgICAxKSAgY2xzZGVmID0+IHN1aXRlID0+IHNpbXBsZV9zdG10ID0+IGV4cHJfc3RtdCA9PiBMZWFmKCdfX21ldGEnKQorICAgICAgICAgIDIpICBjbHNkZWYgPT4gc2ltcGxlX3N0bXQgPT4gZXhwcl9zdG10ID0+IExlYWYoJ19fbWV0YScpCisgICAgIiIiCisgICAgZm9yIG5vZGUgaW4gcGFyZW50LmNoaWxkcmVuOgorICAgICAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5zdWl0ZToKKyAgICAgICAgICAgIHJldHVybiBoYXNfbWV0YWNsYXNzKG5vZGUpCisgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHN5bXMuc2ltcGxlX3N0bXQgYW5kIG5vZGUuY2hpbGRyZW46CisgICAgICAgICAgICBleHByX25vZGUgPSBub2RlLmNoaWxkcmVuWzBdCisgICAgICAgICAgICBpZiBleHByX25vZGUudHlwZSA9PSBzeW1zLmV4cHJfc3RtdCBhbmQgZXhwcl9ub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIGxlZnRfc2lkZSA9IGV4cHJfbm9kZS5jaGlsZHJlblswXQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobGVmdF9zaWRlLCBMZWFmKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9zaWRlLnZhbHVlID09ICdfX21ldGFjbGFzc19fJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgZml4dXBfcGFyc2VfdHJlZShjbHNfbm9kZSk6CisgICAgIiIiIG9uZS1saW5lIGNsYXNzZXMgZG9uJ3QgZ2V0IGEgc3VpdGUgaW4gdGhlIHBhcnNlIHRyZWUgc28gd2UgYWRkCisgICAgICAgIG9uZSB0byBub3JtYWxpemUgdGhlIHRyZWUKKyAgICAiIiIKKyAgICBmb3Igbm9kZSBpbiBjbHNfbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHN5bXMuc3VpdGU6CisgICAgICAgICAgICAjIGFscmVhZHkgaW4gdGhlIHByZWZlcnJlZCBmb3JtYXQsIGRvIG5vdGhpbmcKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyAhJUAjISBvbmVsaW5lcnMgaGF2ZSBubyBzdWl0ZSBub2RlLCB3ZSBoYXZlIHRvIGZha2Ugb25lIHVwCisgICAgZm9yIGksIG5vZGUgaW4gZW51bWVyYXRlKGNsc19ub2RlLmNoaWxkcmVuKToKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLkNPTE9OOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyBjbGFzcyBzdWl0ZSBhbmQgbm8gJzonISIpCisKKyAgICAjIG1vdmUgZXZlcnl0aGluZyBpbnRvIGEgc3VpdGUgbm9kZQorICAgIHN1aXRlID0gTm9kZShzeW1zLnN1aXRlLCBbXSkKKyAgICB3aGlsZSBjbHNfbm9kZS5jaGlsZHJlbltpKzE6XToKKyAgICAgICAgbW92ZV9ub2RlID0gY2xzX25vZGUuY2hpbGRyZW5baSsxXQorICAgICAgICBzdWl0ZS5hcHBlbmRfY2hpbGQobW92ZV9ub2RlLmNsb25lKCkpCisgICAgICAgIG1vdmVfbm9kZS5yZW1vdmUoKQorICAgIGNsc19ub2RlLmFwcGVuZF9jaGlsZChzdWl0ZSkKKyAgICBub2RlID0gc3VpdGUKKworCitkZWYgZml4dXBfc2ltcGxlX3N0bXQocGFyZW50LCBpLCBzdG10X25vZGUpOgorICAgICIiIiBpZiB0aGVyZSBpcyBhIHNlbWktY29sb24gYWxsIHRoZSBwYXJ0cyBjb3VudCBhcyBwYXJ0IG9mIHRoZSBzYW1lCisgICAgICAgIHNpbXBsZV9zdG10LiAgV2UganVzdCB3YW50IHRoZSBfX21ldGFjbGFzc19fIHBhcnQgc28gd2UgbW92ZQorICAgICAgICBldmVyeXRoaW5nIGVmdGVyIHRoZSBzZW1pLWNvbG9uIGludG8gaXRzIG93biBzaW1wbGVfc3RtdCBub2RlCisgICAgIiIiCisgICAgZm9yIHNlbWlfaW5kLCBub2RlIGluIGVudW1lcmF0ZShzdG10X25vZGUuY2hpbGRyZW4pOgorICAgICAgICBpZiBub2RlLnR5cGUgPT0gdG9rZW4uU0VNSTogIyAqc2lnaCoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisKKyAgICBub2RlLnJlbW92ZSgpICMga2lsbCB0aGUgc2VtaWNvbG9uCisgICAgbmV3X2V4cHIgPSBOb2RlKHN5bXMuZXhwcl9zdG10LCBbXSkKKyAgICBuZXdfc3RtdCA9IE5vZGUoc3ltcy5zaW1wbGVfc3RtdCwgW25ld19leHByXSkKKyAgICB3aGlsZSBzdG10X25vZGUuY2hpbGRyZW5bc2VtaV9pbmQ6XToKKyAgICAgICAgbW92ZV9ub2RlID0gc3RtdF9ub2RlLmNoaWxkcmVuW3NlbWlfaW5kXQorICAgICAgICBuZXdfZXhwci5hcHBlbmRfY2hpbGQobW92ZV9ub2RlLmNsb25lKCkpCisgICAgICAgIG1vdmVfbm9kZS5yZW1vdmUoKQorICAgIHBhcmVudC5pbnNlcnRfY2hpbGQoaSwgbmV3X3N0bXQpCisgICAgbmV3X2xlYWYxID0gbmV3X3N0bXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0KKyAgICBvbGRfbGVhZjEgPSBzdG10X25vZGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0KKyAgICBuZXdfbGVhZjEucHJlZml4ID0gb2xkX2xlYWYxLnByZWZpeAorCisKK2RlZiByZW1vdmVfdHJhaWxpbmdfbmV3bGluZShub2RlKToKKyAgICBpZiBub2RlLmNoaWxkcmVuIGFuZCBub2RlLmNoaWxkcmVuWy0xXS50eXBlID09IHRva2VuLk5FV0xJTkU6CisgICAgICAgIG5vZGUuY2hpbGRyZW5bLTFdLnJlbW92ZSgpCisKKworZGVmIGZpbmRfbWV0YXMoY2xzX25vZGUpOgorICAgICMgZmluZCB0aGUgc3VpdGUgbm9kZSAoTW1tLCBzd2VldCBub2RlcykKKyAgICBmb3Igbm9kZSBpbiBjbHNfbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHN5bXMuc3VpdGU6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIGNsYXNzIHN1aXRlISIpCisKKyAgICAjIGxvb2sgZm9yIHNpbXBsZV9zdG10WyBleHByX3N0bXRbIExlYWYoJ19fbWV0YWNsYXNzX18nKSBdIF0KKyAgICBmb3IgaSwgc2ltcGxlX25vZGUgaW4gbGlzdChlbnVtZXJhdGUobm9kZS5jaGlsZHJlbikpOgorICAgICAgICBpZiBzaW1wbGVfbm9kZS50eXBlID09IHN5bXMuc2ltcGxlX3N0bXQgYW5kIHNpbXBsZV9ub2RlLmNoaWxkcmVuOgorICAgICAgICAgICAgZXhwcl9ub2RlID0gc2ltcGxlX25vZGUuY2hpbGRyZW5bMF0KKyAgICAgICAgICAgIGlmIGV4cHJfbm9kZS50eXBlID09IHN5bXMuZXhwcl9zdG10IGFuZCBleHByX25vZGUuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgZXhwcl9ub2RlIGlzIGEgc2ltcGxlIGFzc2lnbm1lbnQuCisgICAgICAgICAgICAgICAgbGVmdF9ub2RlID0gZXhwcl9ub2RlLmNoaWxkcmVuWzBdCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShsZWZ0X25vZGUsIExlYWYpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X25vZGUudmFsdWUgPT0gdSdfX21ldGFjbGFzc19fJzoKKyAgICAgICAgICAgICAgICAgICAgIyBXZSBmb3VuZCBhIGFzc2lnbm1lbnQgdG8gX19tZXRhY2xhc3NfXy4KKyAgICAgICAgICAgICAgICAgICAgZml4dXBfc2ltcGxlX3N0bXQobm9kZSwgaSwgc2ltcGxlX25vZGUpCisgICAgICAgICAgICAgICAgICAgIHJlbW92ZV90cmFpbGluZ19uZXdsaW5lKHNpbXBsZV9ub2RlKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAobm9kZSwgaSwgc2ltcGxlX25vZGUpCisKKworZGVmIGZpeHVwX2luZGVudChzdWl0ZSk6CisgICAgIiIiIElmIGFuIElOREVOVCBpcyBmb2xsb3dlZCBieSBhIHRoaW5nIHdpdGggYSBwcmVmaXggdGhlbiBudWtlIHRoZSBwcmVmaXgKKyAgICAgICAgT3RoZXJ3aXNlIHdlIGdldCBpbiB0cm91YmxlIHdoZW4gcmVtb3ZpbmcgX19tZXRhY2xhc3NfXyBhdCBzdWl0ZSBzdGFydAorICAgICIiIgorICAgIGtpZHMgPSBzdWl0ZS5jaGlsZHJlbls6Oi0xXQorICAgICMgZmluZCB0aGUgZmlyc3QgaW5kZW50CisgICAgd2hpbGUga2lkczoKKyAgICAgICAgbm9kZSA9IGtpZHMucG9wKCkKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLklOREVOVDoKKyAgICAgICAgICAgIGJyZWFrCisKKyAgICAjIGZpbmQgdGhlIGZpcnN0IExlYWYKKyAgICB3aGlsZSBraWRzOgorICAgICAgICBub2RlID0ga2lkcy5wb3AoKQorICAgICAgICBpZiBpc2luc3RhbmNlKG5vZGUsIExlYWYpIGFuZCBub2RlLnR5cGUgIT0gdG9rZW4uREVERU5UOgorICAgICAgICAgICAgaWYgbm9kZS5wcmVmaXg6CisgICAgICAgICAgICAgICAgbm9kZS5wcmVmaXggPSB1JycKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAga2lkcy5leHRlbmQobm9kZS5jaGlsZHJlbls6Oi0xXSkKKworCitjbGFzcyBGaXhNZXRhY2xhc3MoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIGNsYXNzZGVmPGFueSo+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiBub3QgaGFzX21ldGFjbGFzcyhub2RlKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZpeHVwX3BhcnNlX3RyZWUobm9kZSkKKworICAgICAgICAjIGZpbmQgbWV0YWNsYXNzZXMsIGtlZXAgdGhlIGxhc3Qgb25lCisgICAgICAgIGxhc3RfbWV0YWNsYXNzID0gTm9uZQorICAgICAgICBmb3Igc3VpdGUsIGksIHN0bXQgaW4gZmluZF9tZXRhcyhub2RlKToKKyAgICAgICAgICAgIGxhc3RfbWV0YWNsYXNzID0gc3RtdAorICAgICAgICAgICAgc3RtdC5yZW1vdmUoKQorCisgICAgICAgIHRleHRfdHlwZSA9IG5vZGUuY2hpbGRyZW5bMF0udHlwZSAjIGFsd2F5cyBMZWFmKG5ubiwgJ2NsYXNzJykKKworICAgICAgICAjIGZpZ3VyZSBvdXQgd2hhdCBraW5kIG9mIGNsYXNzZGVmIHdlIGhhdmUKKyAgICAgICAgaWYgbGVuKG5vZGUuY2hpbGRyZW4pID09IDc6CisgICAgICAgICAgICAjIE5vZGUoY2xhc3NkZWYsIFsnY2xhc3MnLCAnbmFtZScsICcoJywgYXJnbGlzdCwgJyknLCAnOicsIHN1aXRlXSkKKyAgICAgICAgICAgICMgICAgICAgICAgICAgICAgIDAgICAgICAgIDEgICAgICAgMiAgICAzICAgICAgICA0ICAgIDUgICAgNgorICAgICAgICAgICAgaWYgbm9kZS5jaGlsZHJlblszXS50eXBlID09IHN5bXMuYXJnbGlzdDoKKyAgICAgICAgICAgICAgICBhcmdsaXN0ID0gbm9kZS5jaGlsZHJlblszXQorICAgICAgICAgICAgIyBOb2RlKGNsYXNzZGVmLCBbJ2NsYXNzJywgJ25hbWUnLCAnKCcsICdQYXJlbnQnLCAnKScsICc6Jywgc3VpdGVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBub2RlLmNoaWxkcmVuWzNdLmNsb25lKCkKKyAgICAgICAgICAgICAgICBhcmdsaXN0ID0gTm9kZShzeW1zLmFyZ2xpc3QsIFtwYXJlbnRdKQorICAgICAgICAgICAgICAgIG5vZGUuc2V0X2NoaWxkKDMsIGFyZ2xpc3QpCisgICAgICAgIGVsaWYgbGVuKG5vZGUuY2hpbGRyZW4pID09IDY6CisgICAgICAgICAgICAjIE5vZGUoY2xhc3NkZWYsIFsnY2xhc3MnLCAnbmFtZScsICcoJywgICcpJywgJzonLCBzdWl0ZV0pCisgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAwICAgICAgICAxICAgICAgIDIgICAgIDMgICAgNCAgICA1CisgICAgICAgICAgICBhcmdsaXN0ID0gTm9kZShzeW1zLmFyZ2xpc3QsIFtdKQorICAgICAgICAgICAgbm9kZS5pbnNlcnRfY2hpbGQoMywgYXJnbGlzdCkKKyAgICAgICAgZWxpZiBsZW4obm9kZS5jaGlsZHJlbikgPT0gNDoKKyAgICAgICAgICAgICMgTm9kZShjbGFzc2RlZiwgWydjbGFzcycsICduYW1lJywgJzonLCBzdWl0ZV0pCisgICAgICAgICAgICAjICAgICAgICAgICAgICAgICAwICAgICAgICAxICAgICAgIDIgICAgMworICAgICAgICAgICAgYXJnbGlzdCA9IE5vZGUoc3ltcy5hcmdsaXN0LCBbXSkKKyAgICAgICAgICAgIG5vZGUuaW5zZXJ0X2NoaWxkKDIsIExlYWYodG9rZW4uUlBBUiwgdScpJykpCisgICAgICAgICAgICBub2RlLmluc2VydF9jaGlsZCgyLCBhcmdsaXN0KQorICAgICAgICAgICAgbm9kZS5pbnNlcnRfY2hpbGQoMiwgTGVhZih0b2tlbi5MUEFSLCB1JygnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVuZXhwZWN0ZWQgY2xhc3MgZGVmaW5pdGlvbiIpCisKKyAgICAgICAgIyBub3cgc3RpY2sgdGhlIG1ldGFjbGFzcyBpbiB0aGUgYXJnbGlzdAorICAgICAgICBtZXRhX3R4dCA9IGxhc3RfbWV0YWNsYXNzLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzBdCisgICAgICAgIG1ldGFfdHh0LnZhbHVlID0gJ21ldGFjbGFzcycKKyAgICAgICAgb3JpZ19tZXRhX3ByZWZpeCA9IG1ldGFfdHh0LnByZWZpeAorCisgICAgICAgIGlmIGFyZ2xpc3QuY2hpbGRyZW46CisgICAgICAgICAgICBhcmdsaXN0LmFwcGVuZF9jaGlsZChMZWFmKHRva2VuLkNPTU1BLCB1JywnKSkKKyAgICAgICAgICAgIG1ldGFfdHh0LnByZWZpeCA9IHUnICcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1ldGFfdHh0LnByZWZpeCA9IHUnJworCisgICAgICAgICMgY29tcGFjdCB0aGUgZXhwcmVzc2lvbiAibWV0YWNsYXNzID0gTWV0YSIgLT4gIm1ldGFjbGFzcz1NZXRhIgorICAgICAgICBleHByX3N0bXQgPSBsYXN0X21ldGFjbGFzcy5jaGlsZHJlblswXQorICAgICAgICBhc3NlcnQgZXhwcl9zdG10LnR5cGUgPT0gc3ltcy5leHByX3N0bXQKKyAgICAgICAgZXhwcl9zdG10LmNoaWxkcmVuWzFdLnByZWZpeCA9IHUnJworICAgICAgICBleHByX3N0bXQuY2hpbGRyZW5bMl0ucHJlZml4ID0gdScnCisKKyAgICAgICAgYXJnbGlzdC5hcHBlbmRfY2hpbGQobGFzdF9tZXRhY2xhc3MpCisKKyAgICAgICAgZml4dXBfaW5kZW50KHN1aXRlKQorCisgICAgICAgICMgY2hlY2sgZm9yIGVtcHR5IHN1aXRlCisgICAgICAgIGlmIG5vdCBzdWl0ZS5jaGlsZHJlbjoKKyAgICAgICAgICAgICMgb25lLWxpbmVyIHRoYXQgd2FzIGp1c3QgX19tZXRhY2xhc3NfCisgICAgICAgICAgICBzdWl0ZS5yZW1vdmUoKQorICAgICAgICAgICAgcGFzc19sZWFmID0gTGVhZih0ZXh0X3R5cGUsIHUncGFzcycpCisgICAgICAgICAgICBwYXNzX2xlYWYucHJlZml4ID0gb3JpZ19tZXRhX3ByZWZpeAorICAgICAgICAgICAgbm9kZS5hcHBlbmRfY2hpbGQocGFzc19sZWFmKQorICAgICAgICAgICAgbm9kZS5hcHBlbmRfY2hpbGQoTGVhZih0b2tlbi5ORVdMSU5FLCB1J1xuJykpCisKKyAgICAgICAgZWxpZiBsZW4oc3VpdGUuY2hpbGRyZW4pID4gMSBhbmQgXAorICAgICAgICAgICAgICAgICAoc3VpdGUuY2hpbGRyZW5bLTJdLnR5cGUgPT0gdG9rZW4uSU5ERU5UIGFuZAorICAgICAgICAgICAgICAgICAgc3VpdGUuY2hpbGRyZW5bLTFdLnR5cGUgPT0gdG9rZW4uREVERU5UKToKKyAgICAgICAgICAgICMgdGhlcmUgd2FzIG9ubHkgb25lIGxpbmUgaW4gdGhlIGNsYXNzIGJvZHkgYW5kIGl0IHdhcyBfX21ldGFjbGFzc19fCisgICAgICAgICAgICBwYXNzX2xlYWYgPSBMZWFmKHRleHRfdHlwZSwgdSdwYXNzJykKKyAgICAgICAgICAgIHN1aXRlLmluc2VydF9jaGlsZCgtMSwgcGFzc19sZWFmKQorICAgICAgICAgICAgc3VpdGUuaW5zZXJ0X2NoaWxkKC0xLCBMZWFmKHRva2VuLk5FV0xJTkUsIHUnXG4nKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBjMTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0YWNsYXNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTNjYjFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRhY2xhc3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzFlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X21ldGhvZGF0dHJzLnB5CkBAIC0wLDAgKzEsMjQgQEAKKyIiIkZpeCBib3VuZCBtZXRob2QgYXR0cmlidXRlcyAobWV0aG9kLmltXz8gLT4gbWV0aG9kLl9fP19fKS4KKyIiIgorIyBBdXRob3I6IENocmlzdGlhbiBIZWltZXMKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQorCitNQVAgPSB7CisgICAgImltX2Z1bmMiIDogIl9fZnVuY19fIiwKKyAgICAiaW1fc2VsZiIgOiAiX19zZWxmX18iLAorICAgICJpbV9jbGFzcyIgOiAiX19zZWxmX18uX19jbGFzc19fIgorICAgIH0KKworY2xhc3MgRml4TWV0aG9kYXR0cnMoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwgYW55KyB0cmFpbGVyPCAnLicgYXR0cj0oJ2ltX2Z1bmMnIHwgJ2ltX3NlbGYnIHwgJ2ltX2NsYXNzJykgPiBhbnkqID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGF0dHIgPSByZXN1bHRzWyJhdHRyIl1bMF0KKyAgICAgICAgbmV3ID0gdW5pY29kZShNQVBbYXR0ci52YWx1ZV0pCisgICAgICAgIGF0dHIucmVwbGFjZShOYW1lKG5ldywgcHJlZml4PWF0dHIucHJlZml4KSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRob2RhdHRycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiNDYzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9tZXRob2RhdHRycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiNDYzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbWV0aG9kYXR0cnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmUucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjU5ODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5CkBAIC0wLDAgKzEsMjMgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgdGhhdCB0dXJucyA8PiBpbnRvICE9LiIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorCisKK2NsYXNzIEZpeE5lKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgIyBUaGlzIGlzIHNvIHNpbXBsZSB0aGF0IHdlIGRvbid0IG5lZWQgdGhlIHBhdHRlcm4gY29tcGlsZXIuCisKKyAgICBfYWNjZXB0X3R5cGUgPSB0b2tlbi5OT1RFUVVBTAorCisgICAgZGVmIG1hdGNoKHNlbGYsIG5vZGUpOgorICAgICAgICAjIE92ZXJyaWRlCisgICAgICAgIHJldHVybiBub2RlLnZhbHVlID09IHUiPD4iCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuZXcgPSBweXRyZWUuTGVhZih0b2tlbi5OT1RFUVVBTCwgdSIhPSIsIHByZWZpeD1ub2RlLnByZWZpeCkKKyAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDNmYWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDNmYWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZXh0LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZXh0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjFhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25leHQucHkKQEAgLTAsMCArMSwxMDMgQEAKKyIiIkZpeGVyIGZvciBpdC5uZXh0KCkgLT4gbmV4dChpdCksIHBlciBQRVAgMzExNC4iIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKKyMgVGhpbmdzIHRoYXQgY3VycmVudGx5IGFyZW4ndCBjb3ZlcmVkOgorIyAgIC0gbGlzdGNvbXAgIm5leHQiIG5hbWVzIGFyZW4ndCB3YXJuZWQKKyMgICAtICJ3aXRoIiBzdGF0ZW1lbnQgdGFyZ2V0cyBhcmVuJ3QgY2hlY2tlZAorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi5weWdyYW0gaW1wb3J0IHB5dGhvbl9zeW1ib2xzIGFzIHN5bXMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBmaW5kX2JpbmRpbmcKKworYmluZF93YXJuaW5nID0gIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIGJ5IGdsb2JhbCBiaW5kaW5nIgorCisKK2NsYXNzIEZpeE5leHQoZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwgYmFzZT1hbnkrIHRyYWlsZXI8ICcuJyBhdHRyPSduZXh0JyA+IHRyYWlsZXI8ICcoJyAnKScgPiA+CisgICAgfAorICAgIHBvd2VyPCBoZWFkPWFueSsgdHJhaWxlcjwgJy4nIGF0dHI9J25leHQnID4gbm90IHRyYWlsZXI8ICcoJyAnKScgPiA+CisgICAgfAorICAgIGNsYXNzZGVmPCAnY2xhc3MnIGFueSsgJzonCisgICAgICAgICAgICAgIHN1aXRlPCBhbnkqCisgICAgICAgICAgICAgICAgICAgICBmdW5jZGVmPCAnZGVmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0nbmV4dCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM8ICcoJyBOQU1FICcpJyA+IGFueSsgPgorICAgICAgICAgICAgICAgICAgICAgYW55KiA+ID4KKyAgICB8CisgICAgZ2xvYmFsPWdsb2JhbF9zdG10PCAnZ2xvYmFsJyBhbnkqICduZXh0JyBhbnkqID4KKyAgICAiIiIKKworICAgIG9yZGVyID0gInByZSIgIyBQcmUtb3JkZXIgdHJlZSB0cmF2ZXJzYWwKKworICAgIGRlZiBzdGFydF90cmVlKHNlbGYsIHRyZWUsIGZpbGVuYW1lKToKKyAgICAgICAgc3VwZXIoRml4TmV4dCwgc2VsZikuc3RhcnRfdHJlZSh0cmVlLCBmaWxlbmFtZSkKKworICAgICAgICBuID0gZmluZF9iaW5kaW5nKHUnbmV4dCcsIHRyZWUpCisgICAgICAgIGlmIG46CisgICAgICAgICAgICBzZWxmLndhcm5pbmcobiwgYmluZF93YXJuaW5nKQorICAgICAgICAgICAgc2VsZi5zaGFkb3dlZF9uZXh0ID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zaGFkb3dlZF9uZXh0ID0gRmFsc2UKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGFzc2VydCByZXN1bHRzCisKKyAgICAgICAgYmFzZSA9IHJlc3VsdHMuZ2V0KCJiYXNlIikKKyAgICAgICAgYXR0ciA9IHJlc3VsdHMuZ2V0KCJhdHRyIikKKyAgICAgICAgbmFtZSA9IHJlc3VsdHMuZ2V0KCJuYW1lIikKKworICAgICAgICBpZiBiYXNlOgorICAgICAgICAgICAgaWYgc2VsZi5zaGFkb3dlZF9uZXh0OgorICAgICAgICAgICAgICAgIGF0dHIucmVwbGFjZShOYW1lKHUiX19uZXh0X18iLCBwcmVmaXg9YXR0ci5wcmVmaXgpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiYXNlID0gW24uY2xvbmUoKSBmb3IgbiBpbiBiYXNlXQorICAgICAgICAgICAgICAgIGJhc2VbMF0ucHJlZml4ID0gdSIiCisgICAgICAgICAgICAgICAgbm9kZS5yZXBsYWNlKENhbGwoTmFtZSh1Im5leHQiLCBwcmVmaXg9bm9kZS5wcmVmaXgpLCBiYXNlKSkKKyAgICAgICAgZWxpZiBuYW1lOgorICAgICAgICAgICAgbiA9IE5hbWUodSJfX25leHRfXyIsIHByZWZpeD1uYW1lLnByZWZpeCkKKyAgICAgICAgICAgIG5hbWUucmVwbGFjZShuKQorICAgICAgICBlbGlmIGF0dHI6CisgICAgICAgICAgICAjIFdlIGRvbid0IGRvIHRoaXMgdHJhbnNmb3JtYXRpb24gaWYgd2UncmUgYXNzaWduaW5nIHRvICJ4Lm5leHQiLgorICAgICAgICAgICAgIyBVbmZvcnR1bmF0ZWx5LCBpdCBkb2Vzbid0IHNlZW0gcG9zc2libGUgdG8gZG8gdGhpcyBpbiBQQVRURVJOLAorICAgICAgICAgICAgIyAgc28gaXQncyBiZWluZyBkb25lIGhlcmUuCisgICAgICAgICAgICBpZiBpc19hc3NpZ25fdGFyZ2V0KG5vZGUpOgorICAgICAgICAgICAgICAgIGhlYWQgPSByZXN1bHRzWyJoZWFkIl0KKyAgICAgICAgICAgICAgICBpZiAiIi5qb2luKFtzdHIobikgZm9yIG4gaW4gaGVhZF0pLnN0cmlwKCkgPT0gdSdfX2J1aWx0aW5fXyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybmluZyhub2RlLCBiaW5kX3dhcm5pbmcpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhdHRyLnJlcGxhY2UoTmFtZSh1Il9fbmV4dF9fIikpCisgICAgICAgIGVsaWYgImdsb2JhbCIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIHNlbGYud2FybmluZyhub2RlLCBiaW5kX3dhcm5pbmcpCisgICAgICAgICAgICBzZWxmLnNoYWRvd2VkX25leHQgPSBUcnVlCisKKworIyMjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGhlbHAgdGVzdCBpZiBub2RlIGlzIHBhcnQgb2YgYW4gYXNzaWdubWVudAorIyMjICB0YXJnZXQuCisKK2RlZiBpc19hc3NpZ25fdGFyZ2V0KG5vZGUpOgorICAgIGFzc2lnbiA9IGZpbmRfYXNzaWduKG5vZGUpCisgICAgaWYgYXNzaWduIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZm9yIGNoaWxkIGluIGFzc2lnbi5jaGlsZHJlbjoKKyAgICAgICAgaWYgY2hpbGQudHlwZSA9PSB0b2tlbi5FUVVBTDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbGlmIGlzX3N1YnRyZWUoY2hpbGQsIG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIGZpbmRfYXNzaWduKG5vZGUpOgorICAgIGlmIG5vZGUudHlwZSA9PSBzeW1zLmV4cHJfc3RtdDoKKyAgICAgICAgcmV0dXJuIG5vZGUKKyAgICBpZiBub2RlLnR5cGUgPT0gc3ltcy5zaW1wbGVfc3RtdCBvciBub2RlLnBhcmVudCBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiBmaW5kX2Fzc2lnbihub2RlLnBhcmVudCkKKworZGVmIGlzX3N1YnRyZWUocm9vdCwgbm9kZSk6CisgICAgaWYgcm9vdCA9PSBub2RlOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBhbnkoaXNfc3VidHJlZShjLCBub2RlKSBmb3IgYyBpbiByb290LmNoaWxkcmVuKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZXh0LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRhOGUwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9uZXh0LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxNjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbmV4dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9ub256ZXJvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODM0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHkKQEAgLTAsMCArMSwyMSBAQAorIiIiRml4ZXIgZm9yIF9fbm9uemVyb19fIC0+IF9fYm9vbF9fIG1ldGhvZHMuIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBzeW1zCisKK2NsYXNzIEZpeE5vbnplcm8oZml4ZXJfYmFzZS5CYXNlRml4KToKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICBjbGFzc2RlZjwgJ2NsYXNzJyBhbnkrICc6JworICAgICAgICAgICAgICBzdWl0ZTwgYW55KgorICAgICAgICAgICAgICAgICAgICAgZnVuY2RlZjwgJ2RlZicgbmFtZT0nX19ub256ZXJvX18nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzPCAnKCcgTkFNRSAnKScgPiBhbnkrID4KKyAgICAgICAgICAgICAgICAgICAgIGFueSogPiA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuYW1lID0gcmVzdWx0c1sibmFtZSJdCisgICAgICAgIG5ldyA9IE5hbWUodSJfX2Jvb2xfXyIsIHByZWZpeD1uYW1lLnByZWZpeCkKKyAgICAgICAgbmFtZS5yZXBsYWNlKG5ldykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGQ4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbm9uemVyby5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNGQ4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X25vbnplcm8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzIzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X251bWxpdGVyYWxzLnB5CkBAIC0wLDAgKzEsMjggQEAKKyIiIkZpeGVyIHRoYXQgdHVybnMgMUwgaW50byAxLCAwNzU1IGludG8gMG83NTUuCisiIiIKKyMgQ29weXJpZ2h0IDIwMDcgR2VvcmcgQnJhbmRsLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE51bWJlcgorCisKK2NsYXNzIEZpeE51bWxpdGVyYWxzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgIyBUaGlzIGlzIHNvIHNpbXBsZSB0aGF0IHdlIGRvbid0IG5lZWQgdGhlIHBhdHRlcm4gY29tcGlsZXIuCisKKyAgICBfYWNjZXB0X3R5cGUgPSB0b2tlbi5OVU1CRVIKKworICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKKyAgICAgICAgIyBPdmVycmlkZQorICAgICAgICByZXR1cm4gKG5vZGUudmFsdWUuc3RhcnRzd2l0aCh1IjAiKSBvciBub2RlLnZhbHVlWy0xXSBpbiB1IkxsIikKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHZhbCA9IG5vZGUudmFsdWUKKyAgICAgICAgaWYgdmFsWy0xXSBpbiB1J0xsJzoKKyAgICAgICAgICAgIHZhbCA9IHZhbFs6LTFdCisgICAgICAgIGVsaWYgdmFsLnN0YXJ0c3dpdGgodScwJykgYW5kIHZhbC5pc2RpZ2l0KCkgYW5kIGxlbihzZXQodmFsKSkgPiAxOgorICAgICAgICAgICAgdmFsID0gdSIwbyIgKyB2YWxbMTpdCisKKyAgICAgICAgcmV0dXJuIE51bWJlcih2YWwsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmMWM1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9udW1saXRlcmFscy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmMWM1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfbnVtbGl0ZXJhbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfb3BlcmF0b3IucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjJjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5CkBAIC0wLDAgKzEsOTYgQEAKKyIiIkZpeGVyIGZvciBvcGVyYXRvciBmdW5jdGlvbnMuCisKK29wZXJhdG9yLmlzQ2FsbGFibGUob2JqKSAgICAgICAtPiBoYXNhdHRyKG9iaiwgJ19fY2FsbF9fJykKK29wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMob2JqKSAtPiBvcGVyYXRvci5jb250YWlucyhvYmopCitvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShvYmopICAgLT4gaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLlNlcXVlbmNlKQorb3BlcmF0b3IuaXNNYXBwaW5nVHlwZShvYmopICAgIC0+IGlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5NYXBwaW5nKQorb3BlcmF0b3IuaXNOdW1iZXJUeXBlKG9iaikgICAgIC0+IGlzaW5zdGFuY2Uob2JqLCBudW1iZXJzLk51bWJlcikKK29wZXJhdG9yLnJlcGVhdChvYmosIG4pICAgICAgICAtPiBvcGVyYXRvci5tdWwob2JqLCBuKQorb3BlcmF0b3IuaXJlcGVhdChvYmosIG4pICAgICAgIC0+IG9wZXJhdG9yLmltdWwob2JqLCBuKQorIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSBsaWIydG8zIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIGxpYjJ0bzMuZml4ZXJfdXRpbCBpbXBvcnQgQ2FsbCwgTmFtZSwgU3RyaW5nLCB0b3VjaF9pbXBvcnQKKworCitkZWYgaW52b2NhdGlvbihzKToKKyAgICBkZWYgZGVjKGYpOgorICAgICAgICBmLmludm9jYXRpb24gPSBzCisgICAgICAgIHJldHVybiBmCisgICAgcmV0dXJuIGRlYworCisKK2NsYXNzIEZpeE9wZXJhdG9yKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBvcmRlciA9ICJwcmUiCisKKyAgICBtZXRob2RzID0gIiIiCisgICAgICAgICAgICAgIG1ldGhvZD0oJ2lzQ2FsbGFibGUnfCdzZXF1ZW5jZUluY2x1ZGVzJworICAgICAgICAgICAgICAgICAgICAgfCdpc1NlcXVlbmNlVHlwZSd8J2lzTWFwcGluZ1R5cGUnfCdpc051bWJlclR5cGUnCisgICAgICAgICAgICAgICAgICAgICB8J3JlcGVhdCd8J2lyZXBlYXQnKQorICAgICAgICAgICAgICAiIiIKKyAgICBvYmogPSAiJygnIG9iaj1hbnkgJyknIgorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgcG93ZXI8IG1vZHVsZT0nb3BlcmF0b3InCisgICAgICAgICAgICAgICAgdHJhaWxlcjwgJy4nICUobWV0aG9kcylzID4gdHJhaWxlcjwgJShvYmopcyA+ID4KKyAgICAgICAgICAgICAgfAorICAgICAgICAgICAgICBwb3dlcjwgJShtZXRob2RzKXMgdHJhaWxlcjwgJShvYmopcyA+ID4KKyAgICAgICAgICAgICAgIiIiICUgZGljdChtZXRob2RzPW1ldGhvZHMsIG9iaj1vYmopCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBtZXRob2QgPSBzZWxmLl9jaGVja19tZXRob2Qobm9kZSwgcmVzdWx0cykKKyAgICAgICAgaWYgbWV0aG9kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG1ldGhvZChub2RlLCByZXN1bHRzKQorCisgICAgQGludm9jYXRpb24oIm9wZXJhdG9yLmNvbnRhaW5zKCVzKSIpCisgICAgZGVmIF9zZXF1ZW5jZUluY2x1ZGVzKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICByZXR1cm4gc2VsZi5faGFuZGxlX3JlbmFtZShub2RlLCByZXN1bHRzLCB1ImNvbnRhaW5zIikKKworICAgIEBpbnZvY2F0aW9uKCJoYXNhdHRyKCVzLCAnX19jYWxsX18nKSIpCisgICAgZGVmIF9pc0NhbGxhYmxlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBvYmogPSByZXN1bHRzWyJvYmoiXQorICAgICAgICBhcmdzID0gW29iai5jbG9uZSgpLCBTdHJpbmcodSIsICIpLCBTdHJpbmcodSInX19jYWxsX18nIildCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUodSJoYXNhdHRyIiksIGFyZ3MsIHByZWZpeD1ub2RlLnByZWZpeCkKKworICAgIEBpbnZvY2F0aW9uKCJvcGVyYXRvci5tdWwoJXMpIikKKyAgICBkZWYgX3JlcGVhdChzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hhbmRsZV9yZW5hbWUobm9kZSwgcmVzdWx0cywgdSJtdWwiKQorCisgICAgQGludm9jYXRpb24oIm9wZXJhdG9yLmltdWwoJXMpIikKKyAgICBkZWYgX2lyZXBlYXQoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHJldHVybiBzZWxmLl9oYW5kbGVfcmVuYW1lKG5vZGUsIHJlc3VsdHMsIHUiaW11bCIpCisKKyAgICBAaW52b2NhdGlvbigiaXNpbnN0YW5jZSglcywgY29sbGVjdGlvbnMuU2VxdWVuY2UpIikKKyAgICBkZWYgX2lzU2VxdWVuY2VUeXBlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICByZXR1cm4gc2VsZi5faGFuZGxlX3R5cGUyYWJjKG5vZGUsIHJlc3VsdHMsIHUiY29sbGVjdGlvbnMiLCB1IlNlcXVlbmNlIikKKworICAgIEBpbnZvY2F0aW9uKCJpc2luc3RhbmNlKCVzLCBjb2xsZWN0aW9ucy5NYXBwaW5nKSIpCisgICAgZGVmIF9pc01hcHBpbmdUeXBlKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICByZXR1cm4gc2VsZi5faGFuZGxlX3R5cGUyYWJjKG5vZGUsIHJlc3VsdHMsIHUiY29sbGVjdGlvbnMiLCB1Ik1hcHBpbmciKQorCisgICAgQGludm9jYXRpb24oImlzaW5zdGFuY2UoJXMsIG51bWJlcnMuTnVtYmVyKSIpCisgICAgZGVmIF9pc051bWJlclR5cGUoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHJldHVybiBzZWxmLl9oYW5kbGVfdHlwZTJhYmMobm9kZSwgcmVzdWx0cywgdSJudW1iZXJzIiwgdSJOdW1iZXIiKQorCisgICAgZGVmIF9oYW5kbGVfcmVuYW1lKHNlbGYsIG5vZGUsIHJlc3VsdHMsIG5hbWUpOgorICAgICAgICBtZXRob2QgPSByZXN1bHRzWyJtZXRob2QiXVswXQorICAgICAgICBtZXRob2QudmFsdWUgPSBuYW1lCisgICAgICAgIG1ldGhvZC5jaGFuZ2VkKCkKKworICAgIGRlZiBfaGFuZGxlX3R5cGUyYWJjKHNlbGYsIG5vZGUsIHJlc3VsdHMsIG1vZHVsZSwgYWJjKToKKyAgICAgICAgdG91Y2hfaW1wb3J0KE5vbmUsIG1vZHVsZSwgbm9kZSkKKyAgICAgICAgb2JqID0gcmVzdWx0c1sib2JqIl0KKyAgICAgICAgYXJncyA9IFtvYmouY2xvbmUoKSwgU3RyaW5nKHUiLCAiICsgdSIuIi5qb2luKFttb2R1bGUsIGFiY10pKV0KKyAgICAgICAgcmV0dXJuIENhbGwoTmFtZSh1ImlzaW5zdGFuY2UiKSwgYXJncywgcHJlZml4PW5vZGUucHJlZml4KQorCisgICAgZGVmIF9jaGVja19tZXRob2Qoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgIl8iICsgcmVzdWx0c1sibWV0aG9kIl1bMF0udmFsdWUuZW5jb2RlKCJhc2NpaSIpKQorICAgICAgICBpZiBjYWxsYWJsZShtZXRob2QpOgorICAgICAgICAgICAgaWYgIm1vZHVsZSIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1YiA9ICh1bmljb2RlKHJlc3VsdHNbIm9iaiJdKSwpCisgICAgICAgICAgICAgICAgaW52b2NhdGlvbl9zdHIgPSB1bmljb2RlKG1ldGhvZC5pbnZvY2F0aW9uKSAlIHN1YgorICAgICAgICAgICAgICAgIHNlbGYud2FybmluZyhub2RlLCB1IllvdSBzaG91bGQgdXNlICclcycgaGVyZS4iICUgaW52b2NhdGlvbl9zdHIpCisgICAgICAgIHJldHVybiBOb25lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfb3BlcmF0b3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzRjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfb3BlcmF0b3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YzRjMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X29wZXJhdG9yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjUwY2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wYXJlbi5weQpAQCAtMCwwICsxLDQ0IEBACisiIiJGaXhlciB0aGF0IGFkZGVzIHBhcmVudGhlc2VzIHdoZXJlIHRoZXkgYXJlIHJlcXVpcmVkCisKK1RoaXMgY29udmVydHMgYGBbeCBmb3IgeCBpbiAxLCAyXWBgIHRvIGBgW3ggZm9yIHggaW4gKDEsIDIpXWBgLiIiIgorCisjIEJ5IFRhZWsgSm9vIEtpbSBhbmQgQmVuamFtaW4gUGV0ZXJzb24KKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTFBhcmVuLCBSUGFyZW4KKworIyBYWFggVGhpcyBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIGZvciBsb29wcyBsaWtlIFt4IGZvciB4IGluIDEsIDIgZm9yIHggaW4gMSwgMl0KK2NsYXNzIEZpeFBhcmVuKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgYXRvbTwgKCdbJyB8ICcoJykKKyAgICAgICAgICAgIChsaXN0bWFrZXI8IGFueQorICAgICAgICAgICAgICAgIGNvbXBfZm9yPAorICAgICAgICAgICAgICAgICAgICAnZm9yJyBOQU1FICdpbicKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0PXRlc3RsaXN0X3NhZmU8IGFueSAoJywnIGFueSkrIFsnLCddCisgICAgICAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICAgICAgICAgIFthbnldCisgICAgICAgICAgICAgICAgPgorICAgICAgICAgICAgPgorICAgICAgICAgICAgfAorICAgICAgICAgICAgdGVzdGxpc3RfZ2V4cDwgYW55CisgICAgICAgICAgICAgICAgY29tcF9mb3I8CisgICAgICAgICAgICAgICAgICAgICdmb3InIE5BTUUgJ2luJworICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9dGVzdGxpc3Rfc2FmZTwgYW55ICgnLCcgYW55KSsgWycsJ10KKyAgICAgICAgICAgICAgICAgICAgID4KKyAgICAgICAgICAgICAgICAgICAgW2FueV0KKyAgICAgICAgICAgICAgICA+CisgICAgICAgICAgICA+KQorICAgICAgICAoJ10nIHwgJyknKSA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICB0YXJnZXQgPSByZXN1bHRzWyJ0YXJnZXQiXQorCisgICAgICAgIGxwYXJlbiA9IExQYXJlbigpCisgICAgICAgIGxwYXJlbi5wcmVmaXggPSB0YXJnZXQucHJlZml4CisgICAgICAgIHRhcmdldC5wcmVmaXggPSB1IiIgIyBNYWtlIGl0IGh1ZyB0aGUgcGFyZW50aGVzZXMKKyAgICAgICAgdGFyZ2V0Lmluc2VydF9jaGlsZCgwLCBscGFyZW4pCisgICAgICAgIHRhcmdldC5hcHBlbmRfY2hpbGQoUlBhcmVuKCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcGFyZW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjlhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcGFyZW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YjlhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3BhcmVuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODc4NmIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9wcmludC5weQpAQCAtMCwwICsxLDg3IEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIGZvciBwcmludC4KKworQ2hhbmdlOgorICAgICdwcmludCcgICAgICAgICAgaW50byAncHJpbnQoKScKKyAgICAncHJpbnQgLi4uJyAgICAgIGludG8gJ3ByaW50KC4uLiknCisgICAgJ3ByaW50IC4uLiAsJyAgICBpbnRvICdwcmludCguLi4sIGVuZD0iICIpJworICAgICdwcmludCA+PngsIC4uLicgaW50byAncHJpbnQoLi4uLCBmaWxlPXgpJworCitObyBjaGFuZ2VzIGFyZSBhcHBsaWVkIGlmIHByaW50X2Z1bmN0aW9uIGlzIGltcG9ydGVkIGZyb20gX19mdXR1cmVfXworCisiIiIKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBwYXRjb21wCitmcm9tIC4uIGltcG9ydCBweXRyZWUKK2Zyb20gLi5wZ2VuMiBpbXBvcnQgdG9rZW4KK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lLCBDYWxsLCBDb21tYSwgU3RyaW5nLCBpc190dXBsZQorCisKK3BhcmVuZF9leHByID0gcGF0Y29tcC5jb21waWxlX3BhdHRlcm4oCisgICAgICAgICAgICAgICIiImF0b208ICcoJyBbYXRvbXxTVFJJTkd8TkFNRV0gJyknID4iIiIKKyAgICAgICAgICAgICAgKQorCisKK2NsYXNzIEZpeFByaW50KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICBzaW1wbGVfc3RtdDwgYW55KiBiYXJlPSdwcmludCcgYW55KiA+IHwgcHJpbnRfc3RtdAorICAgICAgICAgICAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGFzc2VydCByZXN1bHRzCisKKyAgICAgICAgYmFyZV9wcmludCA9IHJlc3VsdHMuZ2V0KCJiYXJlIikKKworICAgICAgICBpZiBiYXJlX3ByaW50OgorICAgICAgICAgICAgIyBTcGVjaWFsLWNhc2UgcHJpbnQgYWxsIGJ5IGl0c2VsZgorICAgICAgICAgICAgYmFyZV9wcmludC5yZXBsYWNlKENhbGwoTmFtZSh1InByaW50IiksIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1iYXJlX3ByaW50LnByZWZpeCkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYXNzZXJ0IG5vZGUuY2hpbGRyZW5bMF0gPT0gTmFtZSh1InByaW50IikKKyAgICAgICAgYXJncyA9IG5vZGUuY2hpbGRyZW5bMTpdCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxIGFuZCBwYXJlbmRfZXhwci5tYXRjaChhcmdzWzBdKToKKyAgICAgICAgICAgICMgV2UgZG9uJ3Qgd2FudCB0byBrZWVwIHN0aWNraW5nIHBhcmVucyBhcm91bmQgYW4KKyAgICAgICAgICAgICMgYWxyZWFkeS1wYXJlbnRoZXNpc2VkIGV4cHJlc3Npb24uCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZXAgPSBlbmQgPSBmaWxlID0gTm9uZQorICAgICAgICBpZiBhcmdzIGFuZCBhcmdzWy0xXSA9PSBDb21tYSgpOgorICAgICAgICAgICAgYXJncyA9IGFyZ3NbOi0xXQorICAgICAgICAgICAgZW5kID0gIiAiCisgICAgICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF0gPT0gcHl0cmVlLkxlYWYodG9rZW4uUklHSFRTSElGVCwgdSI+PiIpOgorICAgICAgICAgICAgYXNzZXJ0IGxlbihhcmdzKSA+PSAyCisgICAgICAgICAgICBmaWxlID0gYXJnc1sxXS5jbG9uZSgpCisgICAgICAgICAgICBhcmdzID0gYXJnc1szOl0gIyBTdHJpcCBhIHBvc3NpYmxlIGNvbW1hIGFmdGVyIHRoZSBmaWxlIGV4cHJlc3Npb24KKyAgICAgICAgIyBOb3cgc3ludGhlc2l6ZSBhIHByaW50KGFyZ3MsIHNlcD0uLi4sIGVuZD0uLi4sIGZpbGU9Li4uKSBub2RlLgorICAgICAgICBsX2FyZ3MgPSBbYXJnLmNsb25lKCkgZm9yIGFyZyBpbiBhcmdzXQorICAgICAgICBpZiBsX2FyZ3M6CisgICAgICAgICAgICBsX2FyZ3NbMF0ucHJlZml4ID0gdSIiCisgICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZSBvciBlbmQgaXMgbm90IE5vbmUgb3IgZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHNlcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9rd2FyZyhsX2FyZ3MsIHUic2VwIiwgU3RyaW5nKHJlcHIoc2VwKSkpCisgICAgICAgICAgICBpZiBlbmQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRfa3dhcmcobF9hcmdzLCB1ImVuZCIsIFN0cmluZyhyZXByKGVuZCkpKQorICAgICAgICAgICAgaWYgZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF9rd2FyZyhsX2FyZ3MsIHUiZmlsZSIsIGZpbGUpCisgICAgICAgIG5fc3RtdCA9IENhbGwoTmFtZSh1InByaW50IiksIGxfYXJncykKKyAgICAgICAgbl9zdG10LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgIHJldHVybiBuX3N0bXQKKworICAgIGRlZiBhZGRfa3dhcmcoc2VsZiwgbF9ub2Rlcywgc19rd2QsIG5fZXhwcik6CisgICAgICAgICMgWFhYIEFsbCB0aGlzIHByZWZpeC1zZXR0aW5nIG1heSBsb3NlIGNvbW1lbnRzICh0aG91Z2ggcmFyZWx5KQorICAgICAgICBuX2V4cHIucHJlZml4ID0gdSIiCisgICAgICAgIG5fYXJndW1lbnQgPSBweXRyZWUuTm9kZShzZWxmLnN5bXMuYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTmFtZShzX2t3ZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0cmVlLkxlYWYodG9rZW4uRVFVQUwsIHUiPSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fZXhwcikpCisgICAgICAgIGlmIGxfbm9kZXM6CisgICAgICAgICAgICBsX25vZGVzLmFwcGVuZChDb21tYSgpKQorICAgICAgICAgICAgbl9hcmd1bWVudC5wcmVmaXggPSB1IiAiCisgICAgICAgIGxfbm9kZXMuYXBwZW5kKG5fYXJndW1lbnQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDA2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcHJpbnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MzM1ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ByaW50LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTU4YmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYWlzZS5weQpAQCAtMCwwICsxLDkwIEBACisiIiJGaXhlciBmb3IgJ3JhaXNlIEUsIFYsIFQnCisKK3JhaXNlICAgICAgICAgLT4gcmFpc2UKK3JhaXNlIEUgICAgICAgLT4gcmFpc2UgRQorcmFpc2UgRSwgViAgICAtPiByYWlzZSBFKFYpCityYWlzZSBFLCBWLCBUIC0+IHJhaXNlIEUoVikud2l0aF90cmFjZWJhY2soVCkKK3JhaXNlIEUsIE5vbmUsIFQgLT4gcmFpc2UgRS53aXRoX3RyYWNlYmFjayhUKQorCityYWlzZSAoKChFLCBFJyksIEUnJyksIEUnJycpLCBWIC0+IHJhaXNlIEUoVikKK3JhaXNlICJmb28iLCBWLCBUICAgICAgICAgICAgICAgLT4gd2FybnMgYWJvdXQgc3RyaW5nIGV4Y2VwdGlvbnMKKworCitDQVZFQVRTOgorMSkgInJhaXNlIEUsIFYiIHdpbGwgYmUgaW5jb3JyZWN0bHkgdHJhbnNsYXRlZCBpZiBWIGlzIGFuIGV4Y2VwdGlvbgorICAgaW5zdGFuY2UuIFRoZSBjb3JyZWN0IFB5dGhvbiAzIGlkaW9tIGlzCisKKyAgICAgICAgcmFpc2UgRSBmcm9tIFYKKworICAgYnV0IHNpbmNlIHdlIGNhbid0IGRldGVjdCBpbnN0YW5jZS1ob29kIGJ5IHN5bnRheCBhbG9uZSBhbmQgc2luY2UKKyAgIGFueSBjbGllbnQgY29kZSB3b3VsZCBoYXZlIHRvIGJlIGNoYW5nZWQgYXMgd2VsbCwgd2UgZG9uJ3QgYXV0b21hdGUKKyAgIHRoaXMuCisiIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZSwgQ2FsbCwgQXR0ciwgQXJnTGlzdCwgaXNfdHVwbGUKKworY2xhc3MgRml4UmFpc2UoZml4ZXJfYmFzZS5CYXNlRml4KToKKworICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHJhaXNlX3N0bXQ8ICdyYWlzZScgZXhjPWFueSBbJywnIHZhbD1hbnkgWycsJyB0Yj1hbnldXSA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBzeW1zID0gc2VsZi5zeW1zCisKKyAgICAgICAgZXhjID0gcmVzdWx0c1siZXhjIl0uY2xvbmUoKQorICAgICAgICBpZiBleGMudHlwZSA9PSB0b2tlbi5TVFJJTkc6CisgICAgICAgICAgICBtc2cgPSAiUHl0aG9uIDMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgZXhjZXB0aW9ucyIKKyAgICAgICAgICAgIHNlbGYuY2Fubm90X2NvbnZlcnQobm9kZSwgbXNnKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBQeXRob24gMiBzdXBwb3J0cworICAgICAgICAjICByYWlzZSAoKCgoRTEsIEUyKSwgRTMpLCBFNCksIEU1KSwgVgorICAgICAgICAjIGFzIGEgc3lub255bSBmb3IKKyAgICAgICAgIyAgcmFpc2UgRTEsIFYKKyAgICAgICAgIyBTaW5jZSBQeXRob24gMyB3aWxsIG5vdCBzdXBwb3J0IHRoaXMsIHdlIHJlY3Vyc2UgZG93biBhbnkgdHVwbGUKKyAgICAgICAgIyBsaXRlcmFscywgYWx3YXlzIHRha2luZyB0aGUgZmlyc3QgZWxlbWVudC4KKyAgICAgICAgaWYgaXNfdHVwbGUoZXhjKToKKyAgICAgICAgICAgIHdoaWxlIGlzX3R1cGxlKGV4Yyk6CisgICAgICAgICAgICAgICAgIyBleGMuY2hpbGRyZW5bMTotMV0gaXMgdGhlIHVucGFyZW50aGVzaXplZCB0dXBsZQorICAgICAgICAgICAgICAgICMgZXhjLmNoaWxkcmVuWzFdLmNoaWxkcmVuWzBdIGlzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB0dXBsZQorICAgICAgICAgICAgICAgIGV4YyA9IGV4Yy5jaGlsZHJlblsxXS5jaGlsZHJlblswXS5jbG9uZSgpCisgICAgICAgICAgICBleGMucHJlZml4ID0gdSIgIgorCisgICAgICAgIGlmICJ2YWwiIG5vdCBpbiByZXN1bHRzOgorICAgICAgICAgICAgIyBPbmUtYXJndW1lbnQgcmFpc2UKKyAgICAgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMucmFpc2Vfc3RtdCwgW05hbWUodSJyYWlzZSIpLCBleGNdKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgICAgICByZXR1cm4gbmV3CisKKyAgICAgICAgdmFsID0gcmVzdWx0c1sidmFsIl0uY2xvbmUoKQorICAgICAgICBpZiBpc190dXBsZSh2YWwpOgorICAgICAgICAgICAgYXJncyA9IFtjLmNsb25lKCkgZm9yIGMgaW4gdmFsLmNoaWxkcmVuWzE6LTFdXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsLnByZWZpeCA9IHUiIgorICAgICAgICAgICAgYXJncyA9IFt2YWxdCisKKyAgICAgICAgaWYgInRiIiBpbiByZXN1bHRzOgorICAgICAgICAgICAgdGIgPSByZXN1bHRzWyJ0YiJdLmNsb25lKCkKKyAgICAgICAgICAgIHRiLnByZWZpeCA9IHUiIgorCisgICAgICAgICAgICBlID0gZXhjCisgICAgICAgICAgICAjIElmIHRoZXJlJ3MgYSB0cmFjZWJhY2sgYW5kIE5vbmUgaXMgcGFzc2VkIGFzIHRoZSB2YWx1ZSwgdGhlbiBkb24ndAorICAgICAgICAgICAgIyBhZGQgYSBjYWxsLCBzaW5jZSB0aGUgdXNlciBwcm9iYWJseSBqdXN0IHdhbnRzIHRvIGFkZCBhCisgICAgICAgICAgICAjIHRyYWNlYmFjay4gU2VlIGlzc3VlICM5NjYxLgorICAgICAgICAgICAgaWYgdmFsLnR5cGUgIT0gdG9rZW4uTkFNRSBvciB2YWwudmFsdWUgIT0gdSJOb25lIjoKKyAgICAgICAgICAgICAgICBlID0gQ2FsbChleGMsIGFyZ3MpCisgICAgICAgICAgICB3aXRoX3RiID0gQXR0cihlLCBOYW1lKHUnd2l0aF90cmFjZWJhY2snKSkgKyBbQXJnTGlzdChbdGJdKV0KKyAgICAgICAgICAgIG5ldyA9IHB5dHJlZS5Ob2RlKHN5bXMuc2ltcGxlX3N0bXQsIFtOYW1lKHUicmFpc2UiKV0gKyB3aXRoX3RiKQorICAgICAgICAgICAgbmV3LnByZWZpeCA9IG5vZGUucHJlZml4CisgICAgICAgICAgICByZXR1cm4gbmV3CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcHl0cmVlLk5vZGUoc3ltcy5yYWlzZV9zdG10LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOYW1lKHUicmFpc2UiKSwgQ2FsbChleGMsIGFyZ3MpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmFpc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNWJjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmFpc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNWJjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JhaXNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Jhd19pbnB1dC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmF3X2lucHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzNiODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Jhd19pbnB1dC5weQpAQCAtMCwwICsxLDE3IEBACisiIiJGaXhlciB0aGF0IGNoYW5nZXMgcmF3X2lucHV0KC4uLikgaW50byBpbnB1dCguLi4pLiIiIgorIyBBdXRob3I6IEFuZHJlIFJvYmVyZ2UKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgTmFtZQorCitjbGFzcyBGaXhSYXdJbnB1dChmaXhlcl9iYXNlLkJhc2VGaXgpOgorCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIHBvd2VyPCBuYW1lPSdyYXdfaW5wdXQnIHRyYWlsZXI8ICcoJyBbYW55XSAnKScgPiBhbnkqID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuYW1lID0gcmVzdWx0c1sibmFtZSJdCisgICAgICAgIG5hbWUucmVwbGFjZShOYW1lKHUiaW5wdXQiLCBwcmVmaXg9bmFtZS5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTQxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Jhd19pbnB1dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yYXdfaW5wdXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOTQxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Jhd19pbnB1dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZWR1Y2UucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlZHVjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQ3ODVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZWR1Y2UucHkKQEAgLTAsMCArMSwzNSBAQAorIyBDb3B5cmlnaHQgMjAwOCBBcm1pbiBSb25hY2hlci4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciBmb3IgcmVkdWNlKCkuCisKK01ha2VzIHN1cmUgcmVkdWNlKCkgaXMgaW1wb3J0ZWQgZnJvbSB0aGUgZnVuY3Rvb2xzIG1vZHVsZSBpZiByZWR1Y2UgaXMKK3VzZWQgaW4gdGhhdCBtb2R1bGUuCisiIiIKKworZnJvbSBsaWIydG8zIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIGxpYjJ0bzMuZml4ZXJfdXRpbCBpbXBvcnQgdG91Y2hfaW1wb3J0CisKKworCitjbGFzcyBGaXhSZWR1Y2UoZml4ZXJfYmFzZS5CYXNlRml4KToKKworICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgb3JkZXIgPSAicHJlIgorCisgICAgUEFUVEVSTiA9ICIiIgorICAgIHBvd2VyPCAncmVkdWNlJworICAgICAgICB0cmFpbGVyPCAnKCcKKyAgICAgICAgICAgIGFyZ2xpc3Q8ICgKKyAgICAgICAgICAgICAgICAobm90KGFyZ3VtZW50PGFueSAnPScgYW55PikgYW55ICcsJworICAgICAgICAgICAgICAgICBub3QoYXJndW1lbnQ8YW55ICc9JyBhbnk+KSBhbnkpIHwKKyAgICAgICAgICAgICAgICAobm90KGFyZ3VtZW50PGFueSAnPScgYW55PikgYW55ICcsJworICAgICAgICAgICAgICAgICBub3QoYXJndW1lbnQ8YW55ICc9JyBhbnk+KSBhbnkgJywnCisgICAgICAgICAgICAgICAgIG5vdChhcmd1bWVudDxhbnkgJz0nIGFueT4pIGFueSkKKyAgICAgICAgICAgICkgPgorICAgICAgICAnKScgPgorICAgID4KKyAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIHRvdWNoX2ltcG9ydCh1J2Z1bmN0b29scycsIHUncmVkdWNlJywgbm9kZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA2NDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZWR1Y2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVkdWNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjA2NDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZWR1Y2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNjZThjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZW5hbWVzLnB5CkBAIC0wLDAgKzEsNzAgQEAKKyIiIkZpeCBpbmNvbXBhdGlibGUgcmVuYW1lcworCitGaXhlczoKKyAgKiBzeXMubWF4aW50IC0+IHN5cy5tYXhzaXplCisiIiIKKyMgQXV0aG9yOiBDaHJpc3RpYW4gSGVpbWVzCisjIGJhc2VkIG9uIENvbGxpbiBXaW50ZXIncyBmaXhfaW1wb3J0CisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIGF0dHJfY2hhaW4KKworTUFQUElORyA9IHsic3lzIjogIHsibWF4aW50IiA6ICJtYXhzaXplIn0sCisgICAgICAgICAgfQorTE9PS1VQID0ge30KKworZGVmIGFsdGVybmF0ZXMobWVtYmVycyk6CisgICAgcmV0dXJuICIoIiArICJ8Ii5qb2luKG1hcChyZXByLCBtZW1iZXJzKSkgKyAiKSIKKworCitkZWYgYnVpbGRfcGF0dGVybigpOgorICAgICNiYXJlID0gc2V0KCkKKyAgICBmb3IgbW9kdWxlLCByZXBsYWNlIGluIE1BUFBJTkcuaXRlbXMoKToKKyAgICAgICAgZm9yIG9sZF9hdHRyLCBuZXdfYXR0ciBpbiByZXBsYWNlLml0ZW1zKCk6CisgICAgICAgICAgICBMT09LVVBbKG1vZHVsZSwgb2xkX2F0dHIpXSA9IG5ld19hdHRyCisgICAgICAgICAgICAjYmFyZS5hZGQobW9kdWxlKQorICAgICAgICAgICAgI2JhcmUuYWRkKG9sZF9hdHRyKQorICAgICAgICAgICAgI3lpZWxkICIiIgorICAgICAgICAgICAgIyAgICAgIGltcG9ydF9uYW1lPCAnaW1wb3J0JyAobW9kdWxlPSVyCisgICAgICAgICAgICAjICAgICAgICAgIHwgZG90dGVkX2FzX25hbWVzPCBhbnkqIG1vZHVsZT0lciBhbnkqID4pID4KKyAgICAgICAgICAgICMgICAgICAiIiIgJSAobW9kdWxlLCBtb2R1bGUpCisgICAgICAgICAgICB5aWVsZCAiIiIKKyAgICAgICAgICAgICAgICAgIGltcG9ydF9mcm9tPCAnZnJvbScgbW9kdWxlX25hbWU9JXIgJ2ltcG9ydCcKKyAgICAgICAgICAgICAgICAgICAgICAoIGF0dHJfbmFtZT0lciB8IGltcG9ydF9hc19uYW1lPCBhdHRyX25hbWU9JXIgJ2FzJyBhbnkgPikgPgorICAgICAgICAgICAgICAgICAgIiIiICUgKG1vZHVsZSwgb2xkX2F0dHIsIG9sZF9hdHRyKQorICAgICAgICAgICAgeWllbGQgIiIiCisgICAgICAgICAgICAgICAgICBwb3dlcjwgbW9kdWxlX25hbWU9JXIgdHJhaWxlcjwgJy4nIGF0dHJfbmFtZT0lciA+IGFueSogPgorICAgICAgICAgICAgICAgICAgIiIiICUgKG1vZHVsZSwgb2xkX2F0dHIpCisgICAgI3lpZWxkICIiImJhcmVfbmFtZT0lcyIiIiAlIGFsdGVybmF0ZXMoYmFyZSkKKworCitjbGFzcyBGaXhSZW5hbWVzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gInwiLmpvaW4oYnVpbGRfcGF0dGVybigpKQorCisgICAgb3JkZXIgPSAicHJlIiAjIFByZS1vcmRlciB0cmVlIHRyYXZlcnNhbAorCisgICAgIyBEb24ndCBtYXRjaCB0aGUgbm9kZSBpZiBpdCdzIHdpdGhpbiBhbm90aGVyIG1hdGNoCisgICAgZGVmIG1hdGNoKHNlbGYsIG5vZGUpOgorICAgICAgICBtYXRjaCA9IHN1cGVyKEZpeFJlbmFtZXMsIHNlbGYpLm1hdGNoCisgICAgICAgIHJlc3VsdHMgPSBtYXRjaChub2RlKQorICAgICAgICBpZiByZXN1bHRzOgorICAgICAgICAgICAgaWYgYW55KG1hdGNoKG9iaikgZm9yIG9iaiBpbiBhdHRyX2NoYWluKG5vZGUsICJwYXJlbnQiKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0cworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICNkZWYgc3RhcnRfdHJlZShzZWxmLCB0cmVlLCBmaWxlbmFtZSk6CisgICAgIyAgICBzdXBlcihGaXhSZW5hbWVzLCBzZWxmKS5zdGFydF90cmVlKHRyZWUsIGZpbGVuYW1lKQorICAgICMgICAgc2VsZi5yZXBsYWNlID0ge30KKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG1vZF9uYW1lID0gcmVzdWx0cy5nZXQoIm1vZHVsZV9uYW1lIikKKyAgICAgICAgYXR0cl9uYW1lID0gcmVzdWx0cy5nZXQoImF0dHJfbmFtZSIpCisgICAgICAgICNiYXJlX25hbWUgPSByZXN1bHRzLmdldCgiYmFyZV9uYW1lIikKKyAgICAgICAgI2ltcG9ydF9tb2QgPSByZXN1bHRzLmdldCgibW9kdWxlIikKKworICAgICAgICBpZiBtb2RfbmFtZSBhbmQgYXR0cl9uYW1lOgorICAgICAgICAgICAgbmV3X2F0dHIgPSB1bmljb2RlKExPT0tVUFsobW9kX25hbWUudmFsdWUsIGF0dHJfbmFtZS52YWx1ZSldKQorICAgICAgICAgICAgYXR0cl9uYW1lLnJlcGxhY2UoTmFtZShuZXdfYXR0ciwgcHJlZml4PWF0dHJfbmFtZS5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZW5hbWVzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmMjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZW5hbWVzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdmMjBhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVuYW1lcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9yZXByLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDM2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlcHIucHkKQEAgLTAsMCArMSwyMyBAQAorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJGaXhlciB0aGF0IHRyYW5zZm9ybXMgYHh5enp5YCBpbnRvIHJlcHIoeHl6enkpLiIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBDYWxsLCBOYW1lLCBwYXJlbnRoZXNpemUKKworCitjbGFzcyBGaXhSZXByKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICAgICAgICAgICAgYXRvbSA8ICdgJyBleHByPWFueSAnYCcgPgorICAgICAgICAgICAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGV4cHIgPSByZXN1bHRzWyJleHByIl0uY2xvbmUoKQorCisgICAgICAgIGlmIGV4cHIudHlwZSA9PSBzZWxmLnN5bXMudGVzdGxpc3QxOgorICAgICAgICAgICAgZXhwciA9IHBhcmVudGhlc2l6ZShleHByKQorICAgICAgICByZXR1cm4gQ2FsbChOYW1lKHUicmVwciIpLCBbZXhwcl0sIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVwci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlcHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTc4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlcHIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfcmVwci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlcHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTc4ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3JlcHIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZDM4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3NldF9saXRlcmFsLnB5CkBAIC0wLDAgKzEsNTMgQEAKKyIiIgorT3B0aW9uYWwgZml4ZXIgdG8gdHJhbnNmb3JtIHNldCgpIGNhbGxzIHRvIHNldCBsaXRlcmFscy4KKyIiIgorCisjIEF1dGhvcjogQmVuamFtaW4gUGV0ZXJzb24KKworZnJvbSBsaWIydG8zIGltcG9ydCBmaXhlcl9iYXNlLCBweXRyZWUKK2Zyb20gbGliMnRvMy5maXhlcl91dGlsIGltcG9ydCB0b2tlbiwgc3ltcworCisKKworY2xhc3MgRml4U2V0TGl0ZXJhbChmaXhlcl9iYXNlLkJhc2VGaXgpOgorCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBleHBsaWNpdCA9IFRydWUKKworICAgIFBBVFRFUk4gPSAiIiJwb3dlcjwgJ3NldCcgdHJhaWxlcjwgJygnCisgICAgICAgICAgICAgICAgICAgICAoYXRvbT1hdG9tPCAnWycgKGl0ZW1zPWxpc3RtYWtlcjwgYW55ICgoJywnIGFueSkqIFsnLCddKSA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlPWFueSkgJ10nID4KKyAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgICAgICAgIGF0b208ICcoJyBpdGVtcz10ZXN0bGlzdF9nZXhwPCBhbnkgKCgnLCcgYW55KSogWycsJ10pID4gJyknID4KKyAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICcpJyA+ID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBzaW5nbGUgPSByZXN1bHRzLmdldCgic2luZ2xlIikKKyAgICAgICAgaWYgc2luZ2xlOgorICAgICAgICAgICAgIyBNYWtlIGEgZmFrZSBsaXN0bWFrZXIKKyAgICAgICAgICAgIGZha2UgPSBweXRyZWUuTm9kZShzeW1zLmxpc3RtYWtlciwgW3NpbmdsZS5jbG9uZSgpXSkKKyAgICAgICAgICAgIHNpbmdsZS5yZXBsYWNlKGZha2UpCisgICAgICAgICAgICBpdGVtcyA9IGZha2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGl0ZW1zID0gcmVzdWx0c1siaXRlbXMiXQorCisgICAgICAgICMgQnVpbGQgdGhlIGNvbnRlbnRzIG9mIHRoZSBsaXRlcmFsCisgICAgICAgIGxpdGVyYWwgPSBbcHl0cmVlLkxlYWYodG9rZW4uTEJSQUNFLCB1InsiKV0KKyAgICAgICAgbGl0ZXJhbC5leHRlbmQobi5jbG9uZSgpIGZvciBuIGluIGl0ZW1zLmNoaWxkcmVuKQorICAgICAgICBsaXRlcmFsLmFwcGVuZChweXRyZWUuTGVhZih0b2tlbi5SQlJBQ0UsIHUifSIpKQorICAgICAgICAjIFNldCB0aGUgcHJlZml4IG9mIHRoZSByaWdodCBicmFjZSB0byB0aGF0IG9mIHRoZSAnKScgb3IgJ10nCisgICAgICAgIGxpdGVyYWxbLTFdLnByZWZpeCA9IGl0ZW1zLm5leHRfc2libGluZy5wcmVmaXgKKyAgICAgICAgbWFrZXIgPSBweXRyZWUuTm9kZShzeW1zLmRpY3RzZXRtYWtlciwgbGl0ZXJhbCkKKyAgICAgICAgbWFrZXIucHJlZml4ID0gbm9kZS5wcmVmaXgKKworICAgICAgICAjIElmIHRoZSBvcmlnaW5hbCB3YXMgYSBvbmUgdHVwbGUsIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBleHRyYSBjb21tYS4KKyAgICAgICAgaWYgbGVuKG1ha2VyLmNoaWxkcmVuKSA9PSA0OgorICAgICAgICAgICAgbiA9IG1ha2VyLmNoaWxkcmVuWzJdCisgICAgICAgICAgICBuLnJlbW92ZSgpCisgICAgICAgICAgICBtYWtlci5jaGlsZHJlblstMV0ucHJlZml4ID0gbi5wcmVmaXgKKworICAgICAgICAjIEZpbmFsbHksIHJlcGxhY2UgdGhlIHNldCBjYWxsIHdpdGggb3VyIHNoaW55IG5ldyBsaXRlcmFsLgorICAgICAgICByZXR1cm4gbWFrZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zZXRfbGl0ZXJhbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkNmUyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zZXRfbGl0ZXJhbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkNmUyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc2V0X2xpdGVyYWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3RhbmRhcmRlcnJvci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3RhbmRhcmRlcnJvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2FkNTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zdGFuZGFyZGVycm9yLnB5CkBAIC0wLDAgKzEsMTggQEAKKyMgQ29weXJpZ2h0IDIwMDcgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRml4ZXIgZm9yIFN0YW5kYXJkRXJyb3IgLT4gRXhjZXB0aW9uLiIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IGZpeGVyX2Jhc2UKK2Zyb20gLi5maXhlcl91dGlsIGltcG9ydCBOYW1lCisKKworY2xhc3MgRml4U3RhbmRhcmRlcnJvcihmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICAnU3RhbmRhcmRFcnJvcicKKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICByZXR1cm4gTmFtZSh1IkV4Y2VwdGlvbiIsIHByZWZpeD1ub2RlLnByZWZpeCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3RhbmRhcmRlcnJvci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZGU1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3RhbmRhcmRlcnJvci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZGU1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N0YW5kYXJkZXJyb3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfc3lzX2V4Yy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNjYTJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zeXNfZXhjLnB5CkBAIC0wLDAgKzEsMzAgQEAKKyIiIkZpeGVyIGZvciBzeXMuZXhjX3t0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrfQorCitzeXMuZXhjX3R5cGUgLT4gc3lzLmV4Y19pbmZvKClbMF0KK3N5cy5leGNfdmFsdWUgLT4gc3lzLmV4Y19pbmZvKClbMV0KK3N5cy5leGNfdHJhY2ViYWNrIC0+IHN5cy5leGNfaW5mbygpWzJdCisiIiIKKworIyBCeSBKZWZmIEJhbG9naCBhbmQgQmVuamFtaW4gUGV0ZXJzb24KKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQXR0ciwgQ2FsbCwgTmFtZSwgTnVtYmVyLCBTdWJzY3JpcHQsIE5vZGUsIHN5bXMKKworY2xhc3MgRml4U3lzRXhjKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgIyBUaGlzIG9yZGVyIG1hdGNoZXMgdGhlIG9yZGVyaW5nIG9mIHN5cy5leGNfaW5mbygpLgorICAgIGV4Y19pbmZvID0gW3UiZXhjX3R5cGUiLCB1ImV4Y192YWx1ZSIsIHUiZXhjX3RyYWNlYmFjayJdCisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIHBvd2VyPCAnc3lzJyB0cmFpbGVyPCBkb3Q9Jy4nIGF0dHJpYnV0ZT0oJXMpID4gPgorICAgICAgICAgICAgICAiIiIgJSAnfCcuam9pbigiJyVzJyIgJSBlIGZvciBlIGluIGV4Y19pbmZvKQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgc3lzX2F0dHIgPSByZXN1bHRzWyJhdHRyaWJ1dGUiXVswXQorICAgICAgICBpbmRleCA9IE51bWJlcihzZWxmLmV4Y19pbmZvLmluZGV4KHN5c19hdHRyLnZhbHVlKSkKKworICAgICAgICBjYWxsID0gQ2FsbChOYW1lKHUiZXhjX2luZm8iKSwgcHJlZml4PXN5c19hdHRyLnByZWZpeCkKKyAgICAgICAgYXR0ciA9IEF0dHIoTmFtZSh1InN5cyIpLCBjYWxsKQorICAgICAgICBhdHRyWzFdLmNoaWxkcmVuWzBdLnByZWZpeCA9IHJlc3VsdHNbImRvdCJdLnByZWZpeAorICAgICAgICBhdHRyLmFwcGVuZChTdWJzY3JpcHQoaW5kZXgpKQorICAgICAgICByZXR1cm4gTm9kZShzeW1zLnBvd2VyLCBhdHRyLCBwcmVmaXg9bm9kZS5wcmVmaXgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N5c19leGMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zeXNfZXhjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRlMzBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zeXNfZXhjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3N5c19leGMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zeXNfZXhjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRlMzBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF9zeXNfZXhjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Rocm93LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDY4ZDg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weQpAQCAtMCwwICsxLDU2IEBACisiIiJGaXhlciBmb3IgZ2VuZXJhdG9yLnRocm93KEUsIFYsIFQpLgorCitnLnRocm93KEUpICAgICAgIC0+IGcudGhyb3coRSkKK2cudGhyb3coRSwgVikgICAgLT4gZy50aHJvdyhFKFYpKQorZy50aHJvdyhFLCBWLCBUKSAtPiBnLnRocm93KEUoVikud2l0aF90cmFjZWJhY2soVCkpCisKK2cudGhyb3coImZvbyJbLCBWWywgVF1dKSB3aWxsIHdhcm4gYWJvdXQgc3RyaW5nIGV4Y2VwdGlvbnMuIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQorZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIEFyZ0xpc3QsIEF0dHIsIGlzX3R1cGxlCisKK2NsYXNzIEZpeFRocm93KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8IGFueSB0cmFpbGVyPCAnLicgJ3Rocm93JyA+CisgICAgICAgICAgIHRyYWlsZXI8ICcoJyBhcmdzPWFyZ2xpc3Q8IGV4Yz1hbnkgJywnIHZhbD1hbnkgWycsJyB0Yj1hbnldID4gJyknID4KKyAgICA+CisgICAgfAorICAgIHBvd2VyPCBhbnkgdHJhaWxlcjwgJy4nICd0aHJvdycgPiB0cmFpbGVyPCAnKCcgZXhjPWFueSAnKScgPiA+CisgICAgIiIiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBzeW1zID0gc2VsZi5zeW1zCisKKyAgICAgICAgZXhjID0gcmVzdWx0c1siZXhjIl0uY2xvbmUoKQorICAgICAgICBpZiBleGMudHlwZSBpcyB0b2tlbi5TVFJJTkc6CisgICAgICAgICAgICBzZWxmLmNhbm5vdF9jb252ZXJ0KG5vZGUsICJQeXRob24gMyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBleGNlcHRpb25zIikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgTGVhdmUgImcudGhyb3coRSkiIGFsb25lCisgICAgICAgIHZhbCA9IHJlc3VsdHMuZ2V0KHUidmFsIikKKyAgICAgICAgaWYgdmFsIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB2YWwgPSB2YWwuY2xvbmUoKQorICAgICAgICBpZiBpc190dXBsZSh2YWwpOgorICAgICAgICAgICAgYXJncyA9IFtjLmNsb25lKCkgZm9yIGMgaW4gdmFsLmNoaWxkcmVuWzE6LTFdXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmFsLnByZWZpeCA9IHUiIgorICAgICAgICAgICAgYXJncyA9IFt2YWxdCisKKyAgICAgICAgdGhyb3dfYXJncyA9IHJlc3VsdHNbImFyZ3MiXQorCisgICAgICAgIGlmICJ0YiIgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIHRiID0gcmVzdWx0c1sidGIiXS5jbG9uZSgpCisgICAgICAgICAgICB0Yi5wcmVmaXggPSB1IiIKKworICAgICAgICAgICAgZSA9IENhbGwoZXhjLCBhcmdzKQorICAgICAgICAgICAgd2l0aF90YiA9IEF0dHIoZSwgTmFtZSh1J3dpdGhfdHJhY2ViYWNrJykpICsgW0FyZ0xpc3QoW3RiXSldCisgICAgICAgICAgICB0aHJvd19hcmdzLnJlcGxhY2UocHl0cmVlLk5vZGUoc3ltcy5wb3dlciwgd2l0aF90YikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aHJvd19hcmdzLnJlcGxhY2UoQ2FsbChleGMsIGFyZ3MpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Rocm93LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFmODE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3Rocm93LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTFmODE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90aHJvdy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzYxNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90dXBsZV9wYXJhbXMucHkKQEAgLTAsMCArMSwxNzUgQEAKKyIiIkZpeGVyIGZvciBmdW5jdGlvbiBkZWZpbml0aW9ucyB3aXRoIHR1cGxlIHBhcmFtZXRlcnMuCisKK2RlZiBmdW5jKCgoYSwgYiksIGMpLCBkKToKKyAgICAuLi4KKworICAgIC0+CisKK2RlZiBmdW5jKHgsIGQpOgorICAgICgoYSwgYiksIGMpID0geAorICAgIC4uLgorCitJdCB3aWxsIGFsc28gc3VwcG9ydCBsYW1iZGFzOgorCisgICAgbGFtYmRhICh4LCB5KTogeCArIHkgLT4gbGFtYmRhIHQ6IHRbMF0gKyB0WzFdCisKKyAgICAjIFRoZSBwYXJlbnMgYXJlIGEgc3ludGF4IGVycm9yIGluIFB5dGhvbiAzCisgICAgbGFtYmRhICh4KTogeCArIHkgLT4gbGFtYmRhIHg6IHggKyB5CisiIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIC4uZml4ZXJfdXRpbCBpbXBvcnQgQXNzaWduLCBOYW1lLCBOZXdsaW5lLCBOdW1iZXIsIFN1YnNjcmlwdCwgc3ltcworCitkZWYgaXNfZG9jc3RyaW5nKHN0bXQpOgorICAgIHJldHVybiBpc2luc3RhbmNlKHN0bXQsIHB5dHJlZS5Ob2RlKSBhbmQgXAorICAgICAgICAgICBzdG10LmNoaWxkcmVuWzBdLnR5cGUgPT0gdG9rZW4uU1RSSU5HCisKK2NsYXNzIEZpeFR1cGxlUGFyYW1zKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgcnVuX29yZGVyID0gNCAjdXNlIGEgbG93ZXIgb3JkZXIgc2luY2UgbGFtYmRhIGlzIHBhcnQgb2Ygb3RoZXIKKyAgICAgICAgICAgICAgICAgICNwYXR0ZXJucworICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisKKyAgICBQQVRURVJOID0gIiIiCisgICAgICAgICAgICAgIGZ1bmNkZWY8ICdkZWYnIGFueSBwYXJhbWV0ZXJzPCAnKCcgYXJncz1hbnkgJyknID4KKyAgICAgICAgICAgICAgICAgICAgICAgWyctPicgYW55XSAnOicgc3VpdGU9YW55KyA+CisgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICAgbGFtYmRhPQorICAgICAgICAgICAgICBsYW1iZGVmPCAnbGFtYmRhJyBhcmdzPXZmcGRlZjwgJygnIGlubmVyPWFueSAnKScgPgorICAgICAgICAgICAgICAgICAgICAgICAnOicgYm9keT1hbnkKKyAgICAgICAgICAgICAgPgorICAgICAgICAgICAgICAiIiIKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGlmICJsYW1iZGEiIGluIHJlc3VsdHM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFuc2Zvcm1fbGFtYmRhKG5vZGUsIHJlc3VsdHMpCisKKyAgICAgICAgbmV3X2xpbmVzID0gW10KKyAgICAgICAgc3VpdGUgPSByZXN1bHRzWyJzdWl0ZSJdCisgICAgICAgIGFyZ3MgPSByZXN1bHRzWyJhcmdzIl0KKyAgICAgICAgIyBUaGlzIGNyYXAgaXMgc28gImRlZiBmb28oLi4uKTogeCA9IDU7IHkgPSA3IiBpcyBoYW5kbGVkIGNvcnJlY3RseS4KKyAgICAgICAgIyBUT0RPKGN3aW50ZXIpOiBzdWl0ZS1jbGVhbnVwCisgICAgICAgIGlmIHN1aXRlWzBdLmNoaWxkcmVuWzFdLnR5cGUgPT0gdG9rZW4uSU5ERU5UOgorICAgICAgICAgICAgc3RhcnQgPSAyCisgICAgICAgICAgICBpbmRlbnQgPSBzdWl0ZVswXS5jaGlsZHJlblsxXS52YWx1ZQorICAgICAgICAgICAgZW5kID0gTmV3bGluZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGFydCA9IDAKKyAgICAgICAgICAgIGluZGVudCA9IHUiOyAiCisgICAgICAgICAgICBlbmQgPSBweXRyZWUuTGVhZih0b2tlbi5JTkRFTlQsIHUiIikKKworICAgICAgICAjIFdlIG5lZWQgYWNjZXNzIHRvIHNlbGYgZm9yIG5ld19uYW1lKCksIGFuZCBtYWtpbmcgdGhpcyBhIG1ldGhvZAorICAgICAgICAjICBkb2Vzbid0IGZlZWwgcmlnaHQuIENsb3Npbmcgb3ZlciBzZWxmIGFuZCBuZXdfbGluZXMgbWFrZXMgdGhlCisgICAgICAgICMgIGNvZGUgYmVsb3cgY2xlYW5lci4KKyAgICAgICAgZGVmIGhhbmRsZV90dXBsZSh0dXBsZV9hcmcsIGFkZF9wcmVmaXg9RmFsc2UpOgorICAgICAgICAgICAgbiA9IE5hbWUoc2VsZi5uZXdfbmFtZSgpKQorICAgICAgICAgICAgYXJnID0gdHVwbGVfYXJnLmNsb25lKCkKKyAgICAgICAgICAgIGFyZy5wcmVmaXggPSB1IiIKKyAgICAgICAgICAgIHN0bXQgPSBBc3NpZ24oYXJnLCBuLmNsb25lKCkpCisgICAgICAgICAgICBpZiBhZGRfcHJlZml4OgorICAgICAgICAgICAgICAgIG4ucHJlZml4ID0gdSIgIgorICAgICAgICAgICAgdHVwbGVfYXJnLnJlcGxhY2UobikKKyAgICAgICAgICAgIG5ld19saW5lcy5hcHBlbmQocHl0cmVlLk5vZGUoc3ltcy5zaW1wbGVfc3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0bXQsIGVuZC5jbG9uZSgpXSkpCisKKyAgICAgICAgaWYgYXJncy50eXBlID09IHN5bXMudGZwZGVmOgorICAgICAgICAgICAgaGFuZGxlX3R1cGxlKGFyZ3MpCisgICAgICAgIGVsaWYgYXJncy50eXBlID09IHN5bXMudHlwZWRhcmdzbGlzdDoKKyAgICAgICAgICAgIGZvciBpLCBhcmcgaW4gZW51bWVyYXRlKGFyZ3MuY2hpbGRyZW4pOgorICAgICAgICAgICAgICAgIGlmIGFyZy50eXBlID09IHN5bXMudGZwZGVmOgorICAgICAgICAgICAgICAgICAgICAjIFdpdGhvdXQgYWRkX3ByZWZpeCwgdGhlIGVtaXR0ZWQgY29kZSBpcyBjb3JyZWN0LAorICAgICAgICAgICAgICAgICAgICAjICBqdXN0IHVnbHkuCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZV90dXBsZShhcmcsIGFkZF9wcmVmaXg9KGkgPiAwKSkKKworICAgICAgICBpZiBub3QgbmV3X2xpbmVzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBUaGlzIGlzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGl0IHBsYXlzIG5pY2VseSB3aXRoIG90aGVyIGZpeGVycy4KKyAgICAgICAgIyBUT0RPKGN3aW50ZXIpIGdldCByaWQgb2YgdGhpcyB3aGVuIGNoaWxkcmVuIGJlY29tZXMgYSBzbWFydCBsaXN0CisgICAgICAgIGZvciBsaW5lIGluIG5ld19saW5lczoKKyAgICAgICAgICAgIGxpbmUucGFyZW50ID0gc3VpdGVbMF0KKworICAgICAgICAjIFRPRE8oY3dpbnRlcikgc3VpdGUtY2xlYW51cAorICAgICAgICBhZnRlciA9IHN0YXJ0CisgICAgICAgIGlmIHN0YXJ0ID09IDA6CisgICAgICAgICAgICBuZXdfbGluZXNbMF0ucHJlZml4ID0gdSIgIgorICAgICAgICBlbGlmIGlzX2RvY3N0cmluZyhzdWl0ZVswXS5jaGlsZHJlbltzdGFydF0pOgorICAgICAgICAgICAgbmV3X2xpbmVzWzBdLnByZWZpeCA9IGluZGVudAorICAgICAgICAgICAgYWZ0ZXIgPSBzdGFydCArIDEKKworICAgICAgICBmb3IgbGluZSBpbiBuZXdfbGluZXM6CisgICAgICAgICAgICBsaW5lLnBhcmVudCA9IHN1aXRlWzBdCisgICAgICAgIHN1aXRlWzBdLmNoaWxkcmVuW2FmdGVyOmFmdGVyXSA9IG5ld19saW5lcworICAgICAgICBmb3IgaSBpbiByYW5nZShhZnRlcisxLCBhZnRlcitsZW4obmV3X2xpbmVzKSsxKToKKyAgICAgICAgICAgIHN1aXRlWzBdLmNoaWxkcmVuW2ldLnByZWZpeCA9IGluZGVudAorICAgICAgICBzdWl0ZVswXS5jaGFuZ2VkKCkKKworICAgIGRlZiB0cmFuc2Zvcm1fbGFtYmRhKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBhcmdzID0gcmVzdWx0c1siYXJncyJdCisgICAgICAgIGJvZHkgPSByZXN1bHRzWyJib2R5Il0KKyAgICAgICAgaW5uZXIgPSBzaW1wbGlmeV9hcmdzKHJlc3VsdHNbImlubmVyIl0pCisKKyAgICAgICAgIyBSZXBsYWNlIGxhbWJkYSAoKCgoeCkpKSk6IHggIHdpdGggbGFtYmRhIHg6IHgKKyAgICAgICAgaWYgaW5uZXIudHlwZSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgaW5uZXIgPSBpbm5lci5jbG9uZSgpCisgICAgICAgICAgICBpbm5lci5wcmVmaXggPSB1IiAiCisgICAgICAgICAgICBhcmdzLnJlcGxhY2UoaW5uZXIpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBwYXJhbXMgPSBmaW5kX3BhcmFtcyhhcmdzKQorICAgICAgICB0b19pbmRleCA9IG1hcF90b19pbmRleChwYXJhbXMpCisgICAgICAgIHR1cF9uYW1lID0gc2VsZi5uZXdfbmFtZSh0dXBsZV9uYW1lKHBhcmFtcykpCisKKyAgICAgICAgbmV3X3BhcmFtID0gTmFtZSh0dXBfbmFtZSwgcHJlZml4PXUiICIpCisgICAgICAgIGFyZ3MucmVwbGFjZShuZXdfcGFyYW0uY2xvbmUoKSkKKyAgICAgICAgZm9yIG4gaW4gYm9keS5wb3N0X29yZGVyKCk6CisgICAgICAgICAgICBpZiBuLnR5cGUgPT0gdG9rZW4uTkFNRSBhbmQgbi52YWx1ZSBpbiB0b19pbmRleDoKKyAgICAgICAgICAgICAgICBzdWJzY3JpcHRzID0gW2MuY2xvbmUoKSBmb3IgYyBpbiB0b19pbmRleFtuLnZhbHVlXV0KKyAgICAgICAgICAgICAgICBuZXcgPSBweXRyZWUuTm9kZShzeW1zLnBvd2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZXdfcGFyYW0uY2xvbmUoKV0gKyBzdWJzY3JpcHRzKQorICAgICAgICAgICAgICAgIG5ldy5wcmVmaXggPSBuLnByZWZpeAorICAgICAgICAgICAgICAgIG4ucmVwbGFjZShuZXcpCisKKworIyMjIEhlbHBlciBmdW5jdGlvbnMgZm9yIHRyYW5zZm9ybV9sYW1iZGEoKQorCitkZWYgc2ltcGxpZnlfYXJncyhub2RlKToKKyAgICBpZiBub2RlLnR5cGUgaW4gKHN5bXMudmZwbGlzdCwgdG9rZW4uTkFNRSk6CisgICAgICAgIHJldHVybiBub2RlCisgICAgZWxpZiBub2RlLnR5cGUgPT0gc3ltcy52ZnBkZWY6CisgICAgICAgICMgVGhlc2UgbG9vayBsaWtlIHZmcGRlZjwgJygnIHggJyknID4gd2hlcmUgeCBpcyBOQU1FCisgICAgICAgICMgb3IgYW5vdGhlciB2ZnBkZWYgaW5zdGFuY2UgKGxlYWRpbmcgdG8gcmVjdXJzaW9uKS4KKyAgICAgICAgd2hpbGUgbm9kZS50eXBlID09IHN5bXMudmZwZGVmOgorICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGRyZW5bMV0KKyAgICAgICAgcmV0dXJuIG5vZGUKKyAgICByYWlzZSBSdW50aW1lRXJyb3IoIlJlY2VpdmVkIHVuZXhwZWN0ZWQgbm9kZSAlcyIgJSBub2RlKQorCitkZWYgZmluZF9wYXJhbXMobm9kZSk6CisgICAgaWYgbm9kZS50eXBlID09IHN5bXMudmZwZGVmOgorICAgICAgICByZXR1cm4gZmluZF9wYXJhbXMobm9kZS5jaGlsZHJlblsxXSkKKyAgICBlbGlmIG5vZGUudHlwZSA9PSB0b2tlbi5OQU1FOgorICAgICAgICByZXR1cm4gbm9kZS52YWx1ZQorICAgIHJldHVybiBbZmluZF9wYXJhbXMoYykgZm9yIGMgaW4gbm9kZS5jaGlsZHJlbiBpZiBjLnR5cGUgIT0gdG9rZW4uQ09NTUFdCisKK2RlZiBtYXBfdG9faW5kZXgocGFyYW1fbGlzdCwgcHJlZml4PVtdLCBkPU5vbmUpOgorICAgIGlmIGQgaXMgTm9uZToKKyAgICAgICAgZCA9IHt9CisgICAgZm9yIGksIG9iaiBpbiBlbnVtZXJhdGUocGFyYW1fbGlzdCk6CisgICAgICAgIHRyYWlsZXIgPSBbU3Vic2NyaXB0KE51bWJlcih1bmljb2RlKGkpKSldCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBsaXN0KToKKyAgICAgICAgICAgIG1hcF90b19pbmRleChvYmosIHRyYWlsZXIsIGQ9ZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRbb2JqXSA9IHByZWZpeCArIHRyYWlsZXIKKyAgICByZXR1cm4gZAorCitkZWYgdHVwbGVfbmFtZShwYXJhbV9saXN0KToKKyAgICBsID0gW10KKyAgICBmb3Igb2JqIGluIHBhcmFtX2xpc3Q6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBsaXN0KToKKyAgICAgICAgICAgIGwuYXBwZW5kKHR1cGxlX25hbWUob2JqKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGwuYXBwZW5kKG9iaikKKyAgICByZXR1cm4gdSJfIi5qb2luKGwpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0OGY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHVwbGVfcGFyYW1zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R1cGxlX3BhcmFtcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0OGY1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHVwbGVfcGFyYW1zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3R5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzlkNDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weQpAQCAtMCwwICsxLDYyIEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIGZvciByZW1vdmluZyB1c2VzIG9mIHRoZSB0eXBlcyBtb2R1bGUuCisKK1RoZXNlIHdvcmsgZm9yIG9ubHkgdGhlIGtub3duIG5hbWVzIGluIHRoZSB0eXBlcyBtb2R1bGUuICBUaGUgZm9ybXMgYWJvdmUKK2NhbiBpbmNsdWRlIHR5cGVzLiBvciBub3QuICBpZSwgSXQgaXMgYXNzdW1lZCB0aGUgbW9kdWxlIGlzIGltcG9ydGVkIGVpdGhlciBhczoKKworICAgIGltcG9ydCB0eXBlcworICAgIGZyb20gdHlwZXMgaW1wb3J0IC4uLiAjIGVpdGhlciAqIG9yIHNwZWNpZmljIHR5cGVzCisKK1RoZSBpbXBvcnQgc3RhdGVtZW50cyBhcmUgbm90IG1vZGlmaWVkLgorCitUaGVyZSBzaG91bGQgYmUgYW5vdGhlciBmaXhlciB0aGF0IGhhbmRsZXMgYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBjb25zdGFudHM6CisKKyAgIHR5cGUoW10pIC0+IGxpc3QKKyAgIHR5cGUoKCkpIC0+IHR1cGxlCisgICB0eXBlKCcnKSAtPiBzdHIKKworIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLnBnZW4yIGltcG9ydCB0b2tlbgorZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworX1RZUEVfTUFQUElORyA9IHsKKyAgICAgICAgJ0Jvb2xlYW5UeXBlJyA6ICdib29sJywKKyAgICAgICAgJ0J1ZmZlclR5cGUnIDogJ21lbW9yeXZpZXcnLAorICAgICAgICAnQ2xhc3NUeXBlJyA6ICd0eXBlJywKKyAgICAgICAgJ0NvbXBsZXhUeXBlJyA6ICdjb21wbGV4JywKKyAgICAgICAgJ0RpY3RUeXBlJzogJ2RpY3QnLAorICAgICAgICAnRGljdGlvbmFyeVR5cGUnIDogJ2RpY3QnLAorICAgICAgICAnRWxsaXBzaXNUeXBlJyA6ICd0eXBlKEVsbGlwc2lzKScsCisgICAgICAgICMnRmlsZVR5cGUnIDogJ2lvLklPQmFzZScsCisgICAgICAgICdGbG9hdFR5cGUnOiAnZmxvYXQnLAorICAgICAgICAnSW50VHlwZSc6ICdpbnQnLAorICAgICAgICAnTGlzdFR5cGUnOiAnbGlzdCcsCisgICAgICAgICdMb25nVHlwZSc6ICdpbnQnLAorICAgICAgICAnT2JqZWN0VHlwZScgOiAnb2JqZWN0JywKKyAgICAgICAgJ05vbmVUeXBlJzogJ3R5cGUoTm9uZSknLAorICAgICAgICAnTm90SW1wbGVtZW50ZWRUeXBlJyA6ICd0eXBlKE5vdEltcGxlbWVudGVkKScsCisgICAgICAgICdTbGljZVR5cGUnIDogJ3NsaWNlJywKKyAgICAgICAgJ1N0cmluZ1R5cGUnOiAnYnl0ZXMnLCAjIFhYWCA/CisgICAgICAgICdTdHJpbmdUeXBlcycgOiAnc3RyJywgIyBYWFggPworICAgICAgICAnVHVwbGVUeXBlJzogJ3R1cGxlJywKKyAgICAgICAgJ1R5cGVUeXBlJyA6ICd0eXBlJywKKyAgICAgICAgJ1VuaWNvZGVUeXBlJzogJ3N0cicsCisgICAgICAgICdYUmFuZ2VUeXBlJyA6ICdyYW5nZScsCisgICAgfQorCitfcGF0cyA9IFsicG93ZXI8ICd0eXBlcycgdHJhaWxlcjwgJy4nIG5hbWU9JyVzJyA+ID4iICUgdCBmb3IgdCBpbiBfVFlQRV9NQVBQSU5HXQorCitjbGFzcyBGaXhUeXBlcyhmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICd8Jy5qb2luKF9wYXRzKQorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbmV3X3ZhbHVlID0gdW5pY29kZShfVFlQRV9NQVBQSU5HLmdldChyZXN1bHRzWyJuYW1lIl0udmFsdWUpKQorICAgICAgICBpZiBuZXdfdmFsdWU6CisgICAgICAgICAgICByZXR1cm4gTmFtZShuZXdfdmFsdWUsIHByZWZpeD1ub2RlLnByZWZpeCkKKyAgICAgICAgcmV0dXJuIE5vbmUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwNjFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF90eXBlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwNjFiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdW5pY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzg5NTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5CkBAIC0wLDAgKzEsMjUgQEAKKyIiIkZpeGVyIHRoYXQgY2hhbmdlcyB1bmljb2RlIHRvIHN0ciwgdW5pY2hyIHRvIGNociwgYW5kIHUiLi4uIiBpbnRvICIuLi4iLgorCisiIiIKKworaW1wb3J0IHJlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCisKK19tYXBwaW5nID0ge3UidW5pY2hyIiA6IHUiY2hyIiwgdSJ1bmljb2RlIiA6IHUic3RyIn0KK19saXRlcmFsX3JlID0gcmUuY29tcGlsZSh1ciJbdVVdW3JSXT9bXCdcIl0iKQorCitjbGFzcyBGaXhVbmljb2RlKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIlNUUklORyB8ICd1bmljb2RlJyB8ICd1bmljaHInIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHRva2VuLk5BTUU6CisgICAgICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgICAgIG5ldy52YWx1ZSA9IF9tYXBwaW5nW25vZGUudmFsdWVdCisgICAgICAgICAgICByZXR1cm4gbmV3CisgICAgICAgIGVsaWYgbm9kZS50eXBlID09IHRva2VuLlNUUklORzoKKyAgICAgICAgICAgIGlmIF9saXRlcmFsX3JlLm1hdGNoKG5vZGUudmFsdWUpOgorICAgICAgICAgICAgICAgIG5ldyA9IG5vZGUuY2xvbmUoKQorICAgICAgICAgICAgICAgIG5ldy52YWx1ZSA9IG5ldy52YWx1ZVsxOl0KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VuaWNvZGUucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTVjMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VuaWNvZGUucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTVjMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF91bmljb2RlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZTFiMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weQpAQCAtMCwwICsxLDE5NyBAQAorIiIiRml4IGNoYW5nZXMgaW1wb3J0cyBvZiB1cmxsaWIgd2hpY2ggYXJlIG5vdyBpbmNvbXBhdGlibGUuCisgICBUaGlzIGlzIHJhdGhlciBzaW1pbGFyIHRvIGZpeF9pbXBvcnRzLCBidXQgYmVjYXVzZSBvZiB0aGUgbW9yZQorICAgY29tcGxleCBuYXR1cmUgb2YgdGhlIGZpeGluZyBmb3IgdXJsbGliLCBpdCBoYXMgaXRzIG93biBmaXhlci4KKyIiIgorIyBBdXRob3I6IE5pY2sgRWRkcworCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMy5maXhlcy5maXhfaW1wb3J0cyBpbXBvcnQgYWx0ZXJuYXRlcywgRml4SW1wb3J0cworZnJvbSBsaWIydG8zIGltcG9ydCBmaXhlcl9iYXNlCitmcm9tIGxpYjJ0bzMuZml4ZXJfdXRpbCBpbXBvcnQgKE5hbWUsIENvbW1hLCBGcm9tSW1wb3J0LCBOZXdsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kX2luZGVudGF0aW9uLCBOb2RlLCBzeW1zKQorCitNQVBQSU5HID0geyJ1cmxsaWIiOiAgWworICAgICAgICAgICAgICAgICgidXJsbGliLnJlcXVlc3QiLAorICAgICAgICAgICAgICAgICAgICBbIlVSTG9wZW5lciIsICJGYW5jeVVSTG9wZW5lciIsICJ1cmxyZXRyaWV2ZSIsCisgICAgICAgICAgICAgICAgICAgICAiX3VybG9wZW5lciIsICJ1cmxvcGVuIiwgInVybGNsZWFudXAiLAorICAgICAgICAgICAgICAgICAgICAgInBhdGhuYW1lMnVybCIsICJ1cmwycGF0aG5hbWUiXSksCisgICAgICAgICAgICAgICAgKCJ1cmxsaWIucGFyc2UiLAorICAgICAgICAgICAgICAgICAgICBbInF1b3RlIiwgInF1b3RlX3BsdXMiLCAidW5xdW90ZSIsICJ1bnF1b3RlX3BsdXMiLAorICAgICAgICAgICAgICAgICAgICAgInVybGVuY29kZSIsICJzcGxpdGF0dHIiLCAic3BsaXRob3N0IiwgInNwbGl0bnBvcnQiLAorICAgICAgICAgICAgICAgICAgICAgInNwbGl0cGFzc3dkIiwgInNwbGl0cG9ydCIsICJzcGxpdHF1ZXJ5IiwgInNwbGl0dGFnIiwKKyAgICAgICAgICAgICAgICAgICAgICJzcGxpdHR5cGUiLCAic3BsaXR1c2VyIiwgInNwbGl0dmFsdWUiLCBdKSwKKyAgICAgICAgICAgICAgICAoInVybGxpYi5lcnJvciIsCisgICAgICAgICAgICAgICAgICAgIFsiQ29udGVudFRvb1Nob3J0RXJyb3IiXSldLAorICAgICAgICAgICAidXJsbGliMiIgOiBbCisgICAgICAgICAgICAgICAgKCJ1cmxsaWIucmVxdWVzdCIsCisgICAgICAgICAgICAgICAgICAgIFsidXJsb3BlbiIsICJpbnN0YWxsX29wZW5lciIsICJidWlsZF9vcGVuZXIiLAorICAgICAgICAgICAgICAgICAgICAgIlJlcXVlc3QiLCAiT3BlbmVyRGlyZWN0b3IiLCAiQmFzZUhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyIiwgIkhUVFBSZWRpcmVjdEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIkhUVFBDb29raWVQcm9jZXNzb3IiLCAiUHJveHlIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJIVFRQUGFzc3dvcmRNZ3IiLAorICAgICAgICAgICAgICAgICAgICAgIkhUVFBQYXNzd29yZE1ncldpdGhEZWZhdWx0UmVhbG0iLAorICAgICAgICAgICAgICAgICAgICAgIkFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiSFRUUEJhc2ljQXV0aEhhbmRsZXIiLCAiUHJveHlCYXNpY0F1dGhIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJBYnN0cmFjdERpZ2VzdEF1dGhIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJIVFRQRGlnZXN0QXV0aEhhbmRsZXIiLCAiUHJveHlEaWdlc3RBdXRoSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiSFRUUEhhbmRsZXIiLCAiSFRUUFNIYW5kbGVyIiwgIkZpbGVIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJGVFBIYW5kbGVyIiwgIkNhY2hlRlRQSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiVW5rbm93bkhhbmRsZXIiXSksCisgICAgICAgICAgICAgICAgKCJ1cmxsaWIuZXJyb3IiLAorICAgICAgICAgICAgICAgICAgICBbIlVSTEVycm9yIiwgIkhUVFBFcnJvciJdKSwKKyAgICAgICAgICAgXQorfQorCisjIER1cGxpY2F0ZSB0aGUgdXJsIHBhcnNpbmcgZnVuY3Rpb25zIGZvciB1cmxsaWIyLgorTUFQUElOR1sidXJsbGliMiJdLmFwcGVuZChNQVBQSU5HWyJ1cmxsaWIiXVsxXSkKKworCitkZWYgYnVpbGRfcGF0dGVybigpOgorICAgIGJhcmUgPSBzZXQoKQorICAgIGZvciBvbGRfbW9kdWxlLCBjaGFuZ2VzIGluIE1BUFBJTkcuaXRlbXMoKToKKyAgICAgICAgZm9yIGNoYW5nZSBpbiBjaGFuZ2VzOgorICAgICAgICAgICAgbmV3X21vZHVsZSwgbWVtYmVycyA9IGNoYW5nZQorICAgICAgICAgICAgbWVtYmVycyA9IGFsdGVybmF0ZXMobWVtYmVycykKKyAgICAgICAgICAgIHlpZWxkICIiImltcG9ydF9uYW1lPCAnaW1wb3J0JyAobW9kdWxlPSVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBkb3R0ZWRfYXNfbmFtZXM8IGFueSogbW9kdWxlPSVyIGFueSogPikgPgorICAgICAgICAgICAgICAgICAgIiIiICUgKG9sZF9tb2R1bGUsIG9sZF9tb2R1bGUpCisgICAgICAgICAgICB5aWVsZCAiIiJpbXBvcnRfZnJvbTwgJ2Zyb20nIG1vZF9tZW1iZXI9JXIgJ2ltcG9ydCcKKyAgICAgICAgICAgICAgICAgICAgICAgKCBtZW1iZXI9JXMgfCBpbXBvcnRfYXNfbmFtZTwgbWVtYmVyPSVzICdhcycgYW55ID4gfAorICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9hc19uYW1lczwgbWVtYmVycz1hbnkqICA+KSA+CisgICAgICAgICAgICAgICAgICAiIiIgJSAob2xkX21vZHVsZSwgbWVtYmVycywgbWVtYmVycykKKyAgICAgICAgICAgIHlpZWxkICIiImltcG9ydF9mcm9tPCAnZnJvbScgbW9kdWxlX3N0YXI9JXIgJ2ltcG9ydCcgc3Rhcj0nKicgPgorICAgICAgICAgICAgICAgICAgIiIiICUgb2xkX21vZHVsZQorICAgICAgICAgICAgeWllbGQgIiIiaW1wb3J0X25hbWU8ICdpbXBvcnQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG90dGVkX2FzX25hbWU8IG1vZHVsZV9hcz0lciAnYXMnIGFueSA+ID4KKyAgICAgICAgICAgICAgICAgICIiIiAlIG9sZF9tb2R1bGUKKyAgICAgICAgICAgICMgYmFyZV93aXRoX2F0dHIgaGFzIGEgc3BlY2lhbCBzaWduaWZpY2FuY2UgZm9yIEZpeEltcG9ydHMubWF0Y2goKS4KKyAgICAgICAgICAgIHlpZWxkICIiInBvd2VyPCBiYXJlX3dpdGhfYXR0cj0lciB0cmFpbGVyPCAnLicgbWVtYmVyPSVzID4gYW55KiA+CisgICAgICAgICAgICAgICAgICAiIiIgJSAob2xkX21vZHVsZSwgbWVtYmVycykKKworCitjbGFzcyBGaXhVcmxsaWIoRml4SW1wb3J0cyk6CisKKyAgICBkZWYgYnVpbGRfcGF0dGVybihzZWxmKToKKyAgICAgICAgcmV0dXJuICJ8Ii5qb2luKGJ1aWxkX3BhdHRlcm4oKSkKKworICAgIGRlZiB0cmFuc2Zvcm1faW1wb3J0KHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICAiIiJUcmFuc2Zvcm0gZm9yIHRoZSBiYXNpYyBpbXBvcnQgY2FzZS4gUmVwbGFjZXMgdGhlIG9sZAorICAgICAgICAgICBpbXBvcnQgbmFtZSB3aXRoIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaXRzCisgICAgICAgICAgIHJlcGxhY2VtZW50cy4KKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydF9tb2QgPSByZXN1bHRzLmdldCgibW9kdWxlIikKKyAgICAgICAgcHJlZiA9IGltcG9ydF9tb2QucHJlZml4CisKKyAgICAgICAgbmFtZXMgPSBbXQorCisgICAgICAgICMgY3JlYXRlIGEgTm9kZSBsaXN0IG9mIHRoZSByZXBsYWNlbWVudCBtb2R1bGVzCisgICAgICAgIGZvciBuYW1lIGluIE1BUFBJTkdbaW1wb3J0X21vZC52YWx1ZV1bOi0xXToKKyAgICAgICAgICAgIG5hbWVzLmV4dGVuZChbTmFtZShuYW1lWzBdLCBwcmVmaXg9cHJlZiksIENvbW1hKCldKQorICAgICAgICBuYW1lcy5hcHBlbmQoTmFtZShNQVBQSU5HW2ltcG9ydF9tb2QudmFsdWVdWy0xXVswXSwgcHJlZml4PXByZWYpKQorICAgICAgICBpbXBvcnRfbW9kLnJlcGxhY2UobmFtZXMpCisKKyAgICBkZWYgdHJhbnNmb3JtX21lbWJlcihzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgIiIiVHJhbnNmb3JtIGZvciBpbXBvcnRzIG9mIHNwZWNpZmljIG1vZHVsZSBlbGVtZW50cy4gUmVwbGFjZXMKKyAgICAgICAgICAgdGhlIG1vZHVsZSB0byBiZSBpbXBvcnRlZCBmcm9tIHdpdGggdGhlIGFwcHJvcHJpYXRlIG5ldworICAgICAgICAgICBtb2R1bGUuCisgICAgICAgICIiIgorICAgICAgICBtb2RfbWVtYmVyID0gcmVzdWx0cy5nZXQoIm1vZF9tZW1iZXIiKQorICAgICAgICBwcmVmID0gbW9kX21lbWJlci5wcmVmaXgKKyAgICAgICAgbWVtYmVyID0gcmVzdWx0cy5nZXQoIm1lbWJlciIpCisKKyAgICAgICAgIyBTaW1wbGUgY2FzZSB3aXRoIG9ubHkgYSBzaW5nbGUgbWVtYmVyIGJlaW5nIGltcG9ydGVkCisgICAgICAgIGlmIG1lbWJlcjoKKyAgICAgICAgICAgICMgdGhpcyBtYXkgYmUgYSBsaXN0IG9mIGxlbmd0aCBvbmUsIG9yIGp1c3QgYSBub2RlCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgbGlzdCk6CisgICAgICAgICAgICAgICAgbWVtYmVyID0gbWVtYmVyWzBdCisgICAgICAgICAgICBuZXdfbmFtZSA9IE5vbmUKKyAgICAgICAgICAgIGZvciBjaGFuZ2UgaW4gTUFQUElOR1ttb2RfbWVtYmVyLnZhbHVlXToKKyAgICAgICAgICAgICAgICBpZiBtZW1iZXIudmFsdWUgaW4gY2hhbmdlWzFdOgorICAgICAgICAgICAgICAgICAgICBuZXdfbmFtZSA9IGNoYW5nZVswXQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbmV3X25hbWU6CisgICAgICAgICAgICAgICAgbW9kX21lbWJlci5yZXBsYWNlKE5hbWUobmV3X25hbWUsIHByZWZpeD1wcmVmKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jYW5ub3RfY29udmVydChub2RlLCAiVGhpcyBpcyBhbiBpbnZhbGlkIG1vZHVsZSBlbGVtZW50IikKKworICAgICAgICAjIE11bHRpcGxlIG1lbWJlcnMgYmVpbmcgaW1wb3J0ZWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgYSBkaWN0aW9uYXJ5IGZvciByZXBsYWNlbWVudHMsIG9yZGVyIG1hdHRlcnMKKyAgICAgICAgICAgIG1vZHVsZXMgPSBbXQorICAgICAgICAgICAgbW9kX2RpY3QgPSB7fQorICAgICAgICAgICAgbWVtYmVycyA9IHJlc3VsdHNbIm1lbWJlcnMiXQorICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgICAgICMgd2Ugb25seSBjYXJlIGFib3V0IHRoZSBhY3R1YWwgbWVtYmVycworICAgICAgICAgICAgICAgIGlmIG1lbWJlci50eXBlID09IHN5bXMuaW1wb3J0X2FzX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGFzX25hbWUgPSBtZW1iZXIuY2hpbGRyZW5bMl0udmFsdWUKKyAgICAgICAgICAgICAgICAgICAgbWVtYmVyX25hbWUgPSBtZW1iZXIuY2hpbGRyZW5bMF0udmFsdWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtZW1iZXJfbmFtZSA9IG1lbWJlci52YWx1ZQorICAgICAgICAgICAgICAgICAgICBhc19uYW1lID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIG1lbWJlcl9uYW1lICE9IHUiLCI6CisgICAgICAgICAgICAgICAgICAgIGZvciBjaGFuZ2UgaW4gTUFQUElOR1ttb2RfbWVtYmVyLnZhbHVlXToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1lbWJlcl9uYW1lIGluIGNoYW5nZVsxXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFuZ2VbMF0gbm90IGluIG1vZF9kaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFwcGVuZChjaGFuZ2VbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kX2RpY3Quc2V0ZGVmYXVsdChjaGFuZ2VbMF0sIFtdKS5hcHBlbmQobWVtYmVyKQorCisgICAgICAgICAgICBuZXdfbm9kZXMgPSBbXQorICAgICAgICAgICAgaW5kZW50YXRpb24gPSBmaW5kX2luZGVudGF0aW9uKG5vZGUpCisgICAgICAgICAgICBmaXJzdCA9IFRydWUKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfbmFtZShuYW1lLCBwcmVmaXgpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUudHlwZSA9PSBzeW1zLmltcG9ydF9hc19uYW1lOgorICAgICAgICAgICAgICAgICAgICBraWRzID0gW05hbWUobmFtZS5jaGlsZHJlblswXS52YWx1ZSwgcHJlZml4PXByZWZpeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jaGlsZHJlblsxXS5jbG9uZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY2hpbGRyZW5bMl0uY2xvbmUoKV0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtOb2RlKHN5bXMuaW1wb3J0X2FzX25hbWUsIGtpZHMpXQorICAgICAgICAgICAgICAgIHJldHVybiBbTmFtZShuYW1lLnZhbHVlLCBwcmVmaXg9cHJlZml4KV0KKyAgICAgICAgICAgIGZvciBtb2R1bGUgaW4gbW9kdWxlczoKKyAgICAgICAgICAgICAgICBlbHRzID0gbW9kX2RpY3RbbW9kdWxlXQorICAgICAgICAgICAgICAgIG5hbWVzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZWx0IGluIGVsdHNbOi0xXToKKyAgICAgICAgICAgICAgICAgICAgbmFtZXMuZXh0ZW5kKGhhbmRsZV9uYW1lKGVsdCwgcHJlZikpCisgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChDb21tYSgpKQorICAgICAgICAgICAgICAgIG5hbWVzLmV4dGVuZChoYW5kbGVfbmFtZShlbHRzWy0xXSwgcHJlZikpCisgICAgICAgICAgICAgICAgbmV3ID0gRnJvbUltcG9ydChtb2R1bGUsIG5hbWVzKQorICAgICAgICAgICAgICAgIGlmIG5vdCBmaXJzdCBvciBub2RlLnBhcmVudC5wcmVmaXguZW5kc3dpdGgoaW5kZW50YXRpb24pOgorICAgICAgICAgICAgICAgICAgICBuZXcucHJlZml4ID0gaW5kZW50YXRpb24KKyAgICAgICAgICAgICAgICBuZXdfbm9kZXMuYXBwZW5kKG5ldykKKyAgICAgICAgICAgICAgICBmaXJzdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBuZXdfbm9kZXM6CisgICAgICAgICAgICAgICAgbm9kZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBuZXdfbm9kZSBpbiBuZXdfbm9kZXNbOi0xXToKKyAgICAgICAgICAgICAgICAgICAgbm9kZXMuZXh0ZW5kKFtuZXdfbm9kZSwgTmV3bGluZSgpXSkKKyAgICAgICAgICAgICAgICBub2Rlcy5hcHBlbmQobmV3X25vZGVzWy0xXSkKKyAgICAgICAgICAgICAgICBub2RlLnJlcGxhY2Uobm9kZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY2Fubm90X2NvbnZlcnQobm9kZSwgIkFsbCBtb2R1bGUgZWxlbWVudHMgYXJlIGludmFsaWQiKQorCisgICAgZGVmIHRyYW5zZm9ybV9kb3Qoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgICIiIlRyYW5zZm9ybSBmb3IgY2FsbHMgdG8gbW9kdWxlIG1lbWJlcnMgaW4gY29kZS4iIiIKKyAgICAgICAgbW9kdWxlX2RvdCA9IHJlc3VsdHMuZ2V0KCJiYXJlX3dpdGhfYXR0ciIpCisgICAgICAgIG1lbWJlciA9IHJlc3VsdHMuZ2V0KCJtZW1iZXIiKQorICAgICAgICBuZXdfbmFtZSA9IE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIGxpc3QpOgorICAgICAgICAgICAgbWVtYmVyID0gbWVtYmVyWzBdCisgICAgICAgIGZvciBjaGFuZ2UgaW4gTUFQUElOR1ttb2R1bGVfZG90LnZhbHVlXToKKyAgICAgICAgICAgIGlmIG1lbWJlci52YWx1ZSBpbiBjaGFuZ2VbMV06CisgICAgICAgICAgICAgICAgbmV3X25hbWUgPSBjaGFuZ2VbMF0KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBuZXdfbmFtZToKKyAgICAgICAgICAgIG1vZHVsZV9kb3QucmVwbGFjZShOYW1lKG5ld19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PW1vZHVsZV9kb3QucHJlZml4KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2Fubm90X2NvbnZlcnQobm9kZSwgIlRoaXMgaXMgYW4gaW52YWxpZCBtb2R1bGUgZWxlbWVudCIpCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiByZXN1bHRzLmdldCgibW9kdWxlIik6CisgICAgICAgICAgICBzZWxmLnRyYW5zZm9ybV9pbXBvcnQobm9kZSwgcmVzdWx0cykKKyAgICAgICAgZWxpZiByZXN1bHRzLmdldCgibW9kX21lbWJlciIpOgorICAgICAgICAgICAgc2VsZi50cmFuc2Zvcm1fbWVtYmVyKG5vZGUsIHJlc3VsdHMpCisgICAgICAgIGVsaWYgcmVzdWx0cy5nZXQoImJhcmVfd2l0aF9hdHRyIik6CisgICAgICAgICAgICBzZWxmLnRyYW5zZm9ybV9kb3Qobm9kZSwgcmVzdWx0cykKKyAgICAgICAgIyBSZW5hbWluZyBhbmQgc3RhciBpbXBvcnRzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciB0aGVzZSBtb2R1bGVzLgorICAgICAgICBlbGlmIHJlc3VsdHMuZ2V0KCJtb2R1bGVfc3RhciIpOgorICAgICAgICAgICAgc2VsZi5jYW5ub3RfY29udmVydChub2RlLCAiQ2Fubm90IGhhbmRsZSBzdGFyIGltcG9ydHMuIikKKyAgICAgICAgZWxpZiByZXN1bHRzLmdldCgibW9kdWxlX2FzIik6CisgICAgICAgICAgICBzZWxmLmNhbm5vdF9jb252ZXJ0KG5vZGUsICJUaGlzIG1vZHVsZSBpcyBub3cgbXVsdGlwbGUgbW9kdWxlcyIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwNjI2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3VybGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgwNjI2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfdXJsbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2ZmNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF93c19jb21tYS5weQpAQCAtMCwwICsxLDM5IEBACisiIiJGaXhlciB0aGF0IGNoYW5nZXMgJ2EgLGInIGludG8gJ2EsIGInLgorCitUaGlzIGFsc28gY2hhbmdlcyAne2EgOmJ9JyBpbnRvICd7YTogYn0nLCBidXQgZG9lcyBub3QgdG91Y2ggb3RoZXIKK3VzZXMgb2YgY29sb25zLiAgSXQgZG9lcyBub3QgdG91Y2ggb3RoZXIgdXNlcyBvZiB3aGl0ZXNwYWNlLgorCisiIiIKKworZnJvbSAuLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4ucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC4uIGltcG9ydCBmaXhlcl9iYXNlCisKK2NsYXNzIEZpeFdzQ29tbWEoZml4ZXJfYmFzZS5CYXNlRml4KToKKworICAgIGV4cGxpY2l0ID0gVHJ1ZSAjIFRoZSB1c2VyIG11c3QgYXNrIGZvciB0aGlzIGZpeGVycworCisgICAgUEFUVEVSTiA9ICIiIgorICAgIGFueTwobm90KCcsJykgYW55KSsgJywnICgobm90KCcsJykgYW55KSsgJywnKSogW25vdCgnLCcpIGFueV0+CisgICAgIiIiCisKKyAgICBDT01NQSA9IHB5dHJlZS5MZWFmKHRva2VuLkNPTU1BLCB1IiwiKQorICAgIENPTE9OID0gcHl0cmVlLkxlYWYodG9rZW4uQ09MT04sIHUiOiIpCisgICAgU0VQUyA9IChDT01NQSwgQ09MT04pCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgY29tbWEgPSBGYWxzZQorICAgICAgICBmb3IgY2hpbGQgaW4gbmV3LmNoaWxkcmVuOgorICAgICAgICAgICAgaWYgY2hpbGQgaW4gc2VsZi5TRVBTOgorICAgICAgICAgICAgICAgIHByZWZpeCA9IGNoaWxkLnByZWZpeAorICAgICAgICAgICAgICAgIGlmIHByZWZpeC5pc3NwYWNlKCkgYW5kIHUiXG4iIG5vdCBpbiBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLnByZWZpeCA9IHUiIgorICAgICAgICAgICAgICAgIGNvbW1hID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBjb21tYToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gY2hpbGQucHJlZml4CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5wcmVmaXggPSB1IiAiCisgICAgICAgICAgICAgICAgY29tbWEgPSBGYWxzZQorICAgICAgICByZXR1cm4gbmV3CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfd3NfY29tbWEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMTQ2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfd3NfY29tbWEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMTQ2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3dzX2NvbW1hLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJhbmdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNDM2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIkZpeGVyIHRoYXQgY2hhbmdlcyB4cmFuZ2UoLi4uKSBpbnRvIHJhbmdlKC4uLikuIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIGNvbnN1bWluZ19jYWxscworZnJvbSAuLiBpbXBvcnQgcGF0Y29tcAorCisKK2NsYXNzIEZpeFhyYW5nZShmaXhlcl9iYXNlLkJhc2VGaXgpOgorICAgIEJNX2NvbXBhdGlibGUgPSBUcnVlCisgICAgUEFUVEVSTiA9ICIiIgorICAgICAgICAgICAgICBwb3dlcjwKKyAgICAgICAgICAgICAgICAgKG5hbWU9J3JhbmdlJ3xuYW1lPSd4cmFuZ2UnKSB0cmFpbGVyPCAnKCcgYXJncz1hbnkgJyknID4KKyAgICAgICAgICAgICAgcmVzdD1hbnkqID4KKyAgICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgc3RhcnRfdHJlZShzZWxmLCB0cmVlLCBmaWxlbmFtZSk6CisgICAgICAgIHN1cGVyKEZpeFhyYW5nZSwgc2VsZikuc3RhcnRfdHJlZSh0cmVlLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi50cmFuc2Zvcm1lZF94cmFuZ2VzID0gc2V0KCkKKworICAgIGRlZiBmaW5pc2hfdHJlZShzZWxmLCB0cmVlLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYudHJhbnNmb3JtZWRfeHJhbmdlcyA9IE5vbmUKKworICAgIGRlZiB0cmFuc2Zvcm0oc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KKyAgICAgICAgaWYgbmFtZS52YWx1ZSA9PSB1InhyYW5nZSI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFuc2Zvcm1feHJhbmdlKG5vZGUsIHJlc3VsdHMpCisgICAgICAgIGVsaWYgbmFtZS52YWx1ZSA9PSB1InJhbmdlIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYW5zZm9ybV9yYW5nZShub2RlLCByZXN1bHRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihyZXByKG5hbWUpKQorCisgICAgZGVmIHRyYW5zZm9ybV94cmFuZ2Uoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIG5hbWUgPSByZXN1bHRzWyJuYW1lIl0KKyAgICAgICAgbmFtZS5yZXBsYWNlKE5hbWUodSJyYW5nZSIsIHByZWZpeD1uYW1lLnByZWZpeCkpCisgICAgICAgICMgVGhpcyBwcmV2ZW50cyB0aGUgbmV3IHJhbmdlIGNhbGwgZnJvbSBiZWluZyB3cmFwcGVkIGluIGEgbGlzdCBsYXRlci4KKyAgICAgICAgc2VsZi50cmFuc2Zvcm1lZF94cmFuZ2VzLmFkZChpZChub2RlKSkKKworICAgIGRlZiB0cmFuc2Zvcm1fcmFuZ2Uoc2VsZiwgbm9kZSwgcmVzdWx0cyk6CisgICAgICAgIGlmIChpZChub2RlKSBub3QgaW4gc2VsZi50cmFuc2Zvcm1lZF94cmFuZ2VzIGFuZAorICAgICAgICAgICAgbm90IHNlbGYuaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUpKToKKyAgICAgICAgICAgIHJhbmdlX2NhbGwgPSBDYWxsKE5hbWUodSJyYW5nZSIpLCBbcmVzdWx0c1siYXJncyJdLmNsb25lKCldKQorICAgICAgICAgICAgIyBFbmNhc2UgdGhlIHJhbmdlIGNhbGwgaW4gbGlzdCgpLgorICAgICAgICAgICAgbGlzdF9jYWxsID0gQ2FsbChOYW1lKHUibGlzdCIpLCBbcmFuZ2VfY2FsbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD1ub2RlLnByZWZpeCkKKyAgICAgICAgICAgICMgUHV0IHRoaW5ncyB0aGF0IHdlcmUgYWZ0ZXIgdGhlIHJhbmdlKCkgY2FsbCBhZnRlciB0aGUgbGlzdCBjYWxsLgorICAgICAgICAgICAgZm9yIG4gaW4gcmVzdWx0c1sicmVzdCJdOgorICAgICAgICAgICAgICAgIGxpc3RfY2FsbC5hcHBlbmRfY2hpbGQobikKKyAgICAgICAgICAgIHJldHVybiBsaXN0X2NhbGwKKworICAgIFAxID0gInBvd2VyPCBmdW5jPU5BTUUgdHJhaWxlcjwgJygnIG5vZGU9YW55ICcpJyA+IGFueSogPiIKKyAgICBwMSA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKFAxKQorCisgICAgUDIgPSAiIiJmb3Jfc3RtdDwgJ2ZvcicgYW55ICdpbicgbm9kZT1hbnkgJzonIGFueSogPgorICAgICAgICAgICAgfCBjb21wX2ZvcjwgJ2ZvcicgYW55ICdpbicgbm9kZT1hbnkgYW55KiA+CisgICAgICAgICAgICB8IGNvbXBhcmlzb248IGFueSAnaW4nIG5vZGU9YW55IGFueSo+CisgICAgICAgICAiIiIKKyAgICBwMiA9IHBhdGNvbXAuY29tcGlsZV9wYXR0ZXJuKFAyKQorCisgICAgZGVmIGluX3NwZWNpYWxfY29udGV4dChzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm9kZS5wYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXN1bHRzID0ge30KKyAgICAgICAgaWYgKG5vZGUucGFyZW50LnBhcmVudCBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgIHNlbGYucDEubWF0Y2gobm9kZS5wYXJlbnQucGFyZW50LCByZXN1bHRzKSBhbmQKKyAgICAgICAgICAgICAgIHJlc3VsdHNbIm5vZGUiXSBpcyBub2RlKToKKyAgICAgICAgICAgICMgbGlzdChkLmtleXMoKSkgLT4gbGlzdChkLmtleXMoKSksIGV0Yy4KKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzWyJmdW5jIl0udmFsdWUgaW4gY29uc3VtaW5nX2NhbGxzCisgICAgICAgICMgZm9yIC4uLiBpbiBkLml0ZXJrZXlzKCkgLT4gZm9yIC4uLiBpbiBkLmtleXMoKSwgZXRjLgorICAgICAgICByZXR1cm4gc2VsZi5wMi5tYXRjaChub2RlLnBhcmVudCwgcmVzdWx0cykgYW5kIHJlc3VsdHNbIm5vZGUiXSBpcyBub2RlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyOTZiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJhbmdlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyYW5nZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyOTZiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJhbmdlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3hyZWFkbGluZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwYjlhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJlYWRsaW5lcy5weQpAQCAtMCwwICsxLDI1IEBACisiIiJGaXggImZvciB4IGluIGYueHJlYWRsaW5lcygpIiAtPiAiZm9yIHggaW4gZiIuCisKK1RoaXMgZml4ZXIgd2lsbCBhbHNvIGNvbnZlcnQgZyhmLnhyZWFkbGluZXMpIGludG8gZyhmLl9faXRlcl9fKS4iIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUKKworCitjbGFzcyBGaXhYcmVhZGxpbmVzKGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgQk1fY29tcGF0aWJsZSA9IFRydWUKKyAgICBQQVRURVJOID0gIiIiCisgICAgcG93ZXI8IGNhbGw9YW55KyB0cmFpbGVyPCAnLicgJ3hyZWFkbGluZXMnID4gdHJhaWxlcjwgJygnICcpJyA+ID4KKyAgICB8CisgICAgcG93ZXI8IGFueSsgdHJhaWxlcjwgJy4nIG5vX2NhbGw9J3hyZWFkbGluZXMnID4gPgorICAgICIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbm9fY2FsbCA9IHJlc3VsdHMuZ2V0KCJub19jYWxsIikKKworICAgICAgICBpZiBub19jYWxsOgorICAgICAgICAgICAgbm9fY2FsbC5yZXBsYWNlKE5hbWUodSJfX2l0ZXJfXyIsIHByZWZpeD1ub19jYWxsLnByZWZpeCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBub2RlLnJlcGxhY2UoW3guY2xvbmUoKSBmb3IgeCBpbiByZXN1bHRzWyJjYWxsIl1dKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmVhZGxpbmVzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJlYWRsaW5lcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1YjY0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJlYWRsaW5lcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF94cmVhZGxpbmVzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJlYWRsaW5lcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1YjY0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9maXhlcy9maXhfeHJlYWRsaW5lcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ppcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWQ3YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHkKQEAgLTAsMCArMSwzNSBAQAorIiIiCitGaXhlciB0aGF0IGNoYW5nZXMgemlwKHNlcTAsIHNlcTEsIC4uLikgaW50byBsaXN0KHppcChzZXEwLCBzZXExLCAuLi4pCit1bmxlc3MgdGhlcmUgZXhpc3RzIGEgJ2Zyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCB6aXAnIHN0YXRlbWVudCBpbiB0aGUKK3RvcC1sZXZlbCBuYW1lc3BhY2UuCisKK1dlIGF2b2lkIHRoZSB0cmFuc2Zvcm1hdGlvbiBpZiB0aGUgemlwKCkgY2FsbCBpcyBkaXJlY3RseSBjb250YWluZWQgaW4KK2l0ZXIoPD4pLCBsaXN0KDw+KSwgdHVwbGUoPD4pLCBzb3J0ZWQoPD4pLCAuLi5qb2luKDw+KSwgb3IgZm9yIFYgaW4gPD46LgorIiIiCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuLiBpbXBvcnQgZml4ZXJfYmFzZQorZnJvbSAuLmZpeGVyX3V0aWwgaW1wb3J0IE5hbWUsIENhbGwsIGluX3NwZWNpYWxfY29udGV4dAorCitjbGFzcyBGaXhaaXAoZml4ZXJfYmFzZS5Db25kaXRpb25hbEZpeCk6CisKKyAgICBCTV9jb21wYXRpYmxlID0gVHJ1ZQorICAgIFBBVFRFUk4gPSAiIiIKKyAgICBwb3dlcjwgJ3ppcCcgYXJncz10cmFpbGVyPCAnKCcgW2FueV0gJyknID4KKyAgICA+CisgICAgIiIiCisKKyAgICBza2lwX29uID0gImZ1dHVyZV9idWlsdGlucy56aXAiCisKKyAgICBkZWYgdHJhbnNmb3JtKHNlbGYsIG5vZGUsIHJlc3VsdHMpOgorICAgICAgICBpZiBzZWxmLnNob3VsZF9za2lwKG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgaW5fc3BlY2lhbF9jb250ZXh0KG5vZGUpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBuZXcgPSBub2RlLmNsb25lKCkKKyAgICAgICAgbmV3LnByZWZpeCA9IHUiIgorICAgICAgICBuZXcgPSBDYWxsKE5hbWUodSJsaXN0IiksIFtuZXddKQorICAgICAgICBuZXcucHJlZml4ID0gbm9kZS5wcmVmaXgKKyAgICAgICAgcmV0dXJuIG5ldwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTE1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ppcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL2ZpeGVzL2ZpeF96aXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YTE1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvZml4ZXMvZml4X3ppcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL21haW4ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDA2MjVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL21haW4ucHkKQEAgLTAsMCArMSwyNjkgQEAKKyIiIgorTWFpbiBwcm9ncmFtIGZvciAydG8zLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBvcHRwYXJzZQorCitmcm9tIC4gaW1wb3J0IHJlZmFjdG9yCisKKworZGVmIGRpZmZfdGV4dHMoYSwgYiwgZmlsZW5hbWUpOgorICAgICIiIlJldHVybiBhIHVuaWZpZWQgZGlmZiBvZiB0d28gc3RyaW5ncy4iIiIKKyAgICBhID0gYS5zcGxpdGxpbmVzKCkKKyAgICBiID0gYi5zcGxpdGxpbmVzKCkKKyAgICByZXR1cm4gZGlmZmxpYi51bmlmaWVkX2RpZmYoYSwgYiwgZmlsZW5hbWUsIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKG9yaWdpbmFsKSIsICIocmVmYWN0b3JlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5ldGVybT0iIikKKworCitjbGFzcyBTdGRvdXRSZWZhY3RvcmluZ1Rvb2wocmVmYWN0b3IuTXVsdGlwcm9jZXNzUmVmYWN0b3JpbmdUb29sKToKKyAgICAiIiIKKyAgICBBIHJlZmFjdG9yaW5nIHRvb2wgdGhhdCBjYW4gYXZvaWQgb3ZlcndyaXRpbmcgaXRzIGlucHV0IGZpbGVzLgorICAgIFByaW50cyBvdXRwdXQgdG8gc3Rkb3V0LgorCisgICAgT3V0cHV0IGZpbGVzIGNhbiBvcHRpb25hbGx5IGJlIHdyaXR0ZW4gdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5IGFuZCBvcgorICAgIGhhdmUgYW4gZXh0cmEgZmlsZSBzdWZmaXggYXBwZW5kZWQgdG8gdGhlaXIgbmFtZSBmb3IgdXNlIGluIHNpdHVhdGlvbnMKKyAgICB3aGVyZSB5b3UgZG8gbm90IHdhbnQgdG8gcmVwbGFjZSB0aGUgaW5wdXQgZmlsZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZml4ZXJzLCBvcHRpb25zLCBleHBsaWNpdCwgbm9iYWNrdXBzLCBzaG93X2RpZmZzLAorICAgICAgICAgICAgICAgICBpbnB1dF9iYXNlX2Rpcj0nJywgb3V0cHV0X2Rpcj0nJywgYXBwZW5kX3N1ZmZpeD0nJyk6CisgICAgICAgICIiIgorICAgICAgICBBcmdzOgorICAgICAgICAgICAgZml4ZXJzOiBBIGxpc3Qgb2YgZml4ZXJzIHRvIGltcG9ydC4KKyAgICAgICAgICAgIG9wdGlvbnM6IEEgZGljdCB3aXRoIFJlZmFjdG9yaW5nVG9vbCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgZXhwbGljaXQ6IEEgbGlzdCBvZiBmaXhlcnMgdG8gcnVuIGV2ZW4gaWYgdGhleSBhcmUgZXhwbGljaXQuCisgICAgICAgICAgICBub2JhY2t1cHM6IElmIHRydWUgbm8gYmFja3VwICcuYmFrJyBmaWxlcyB3aWxsIGJlIGNyZWF0ZWQgZm9yIHRob3NlCisgICAgICAgICAgICAgICAgZmlsZXMgdGhhdCBhcmUgYmVpbmcgcmVmYWN0b3JlZC4KKyAgICAgICAgICAgIHNob3dfZGlmZnM6IFNob3VsZCBkaWZmcyBvZiB0aGUgcmVmYWN0b3JpbmcgYmUgcHJpbnRlZCB0byBzdGRvdXQ/CisgICAgICAgICAgICBpbnB1dF9iYXNlX2RpcjogVGhlIGJhc2UgZGlyZWN0b3J5IGZvciBhbGwgaW5wdXQgZmlsZXMuICBUaGlzIGNsYXNzCisgICAgICAgICAgICAgICAgd2lsbCBzdHJpcCB0aGlzIHBhdGggcHJlZml4IG9mZiBvZiBmaWxlbmFtZXMgYmVmb3JlIHN1YnN0aXR1dGluZworICAgICAgICAgICAgICAgIGl0IHdpdGggb3V0cHV0X2Rpci4gIE9ubHkgbWVhbmluZ2Z1bCBpZiBvdXRwdXRfZGlyIGlzIHN1cHBsaWVkLgorICAgICAgICAgICAgICAgIEFsbCBmaWxlcyBwcm9jZXNzZWQgYnkgcmVmYWN0b3IoKSBtdXN0IHN0YXJ0IHdpdGggdGhpcyBwYXRoLgorICAgICAgICAgICAgb3V0cHV0X2RpcjogSWYgc3VwcGxpZWQsIGFsbCBjb252ZXJ0ZWQgZmlsZXMgd2lsbCBiZSB3cml0dGVuIGludG8KKyAgICAgICAgICAgICAgICB0aGlzIGRpcmVjdG9yeSB0cmVlIGluc3RlYWQgb2YgaW5wdXRfYmFzZV9kaXIuCisgICAgICAgICAgICBhcHBlbmRfc3VmZml4OiBJZiBzdXBwbGllZCwgYWxsIGZpbGVzIG91dHB1dCBieSB0aGlzIHRvb2wgd2lsbCBoYXZlCisgICAgICAgICAgICAgICAgdGhpcyBhcHBlbmRlZCB0byB0aGVpciBmaWxlbmFtZS4gIFVzZWZ1bCBmb3IgY2hhbmdpbmcgLnB5IHRvCisgICAgICAgICAgICAgICAgLnB5MyBmb3IgZXhhbXBsZSBieSBwYXNzaW5nIGFwcGVuZF9zdWZmaXg9JzMnLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ub2JhY2t1cHMgPSBub2JhY2t1cHMKKyAgICAgICAgc2VsZi5zaG93X2RpZmZzID0gc2hvd19kaWZmcworICAgICAgICBpZiBpbnB1dF9iYXNlX2RpciBhbmQgbm90IGlucHV0X2Jhc2VfZGlyLmVuZHN3aXRoKG9zLnNlcCk6CisgICAgICAgICAgICBpbnB1dF9iYXNlX2RpciArPSBvcy5zZXAKKyAgICAgICAgc2VsZi5faW5wdXRfYmFzZV9kaXIgPSBpbnB1dF9iYXNlX2RpcgorICAgICAgICBzZWxmLl9vdXRwdXRfZGlyID0gb3V0cHV0X2RpcgorICAgICAgICBzZWxmLl9hcHBlbmRfc3VmZml4ID0gYXBwZW5kX3N1ZmZpeAorICAgICAgICBzdXBlcihTdGRvdXRSZWZhY3RvcmluZ1Rvb2wsIHNlbGYpLl9faW5pdF9fKGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQpCisKKyAgICBkZWYgbG9nX2Vycm9yKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKChtc2csIGFyZ3MsIGt3YXJncykpCisgICAgICAgIHNlbGYubG9nZ2VyLmVycm9yKG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgbmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dCwgZW5jb2RpbmcpOgorICAgICAgICBvcmlnX2ZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgaWYgc2VsZi5fb3V0cHV0X2RpcjoKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lLnN0YXJ0c3dpdGgoc2VsZi5faW5wdXRfYmFzZV9kaXIpOgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX291dHB1dF9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVbbGVuKHNlbGYuX2lucHV0X2Jhc2VfZGlyKTpdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWxlbmFtZSAlcyBkb2VzIG5vdCBzdGFydCB3aXRoIHRoZSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW5wdXRfYmFzZV9kaXIgJXMnICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgc2VsZi5faW5wdXRfYmFzZV9kaXIpKQorICAgICAgICBpZiBzZWxmLl9hcHBlbmRfc3VmZml4OgorICAgICAgICAgICAgZmlsZW5hbWUgKz0gc2VsZi5fYXBwZW5kX3N1ZmZpeAorICAgICAgICBpZiBvcmlnX2ZpbGVuYW1lICE9IGZpbGVuYW1lOgorICAgICAgICAgICAgb3V0cHV0X2RpciA9IG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKG91dHB1dF9kaXIpOgorICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKG91dHB1dF9kaXIpCisgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKCdXcml0aW5nIGNvbnZlcnRlZCAlcyB0byAlcy4nLCBvcmlnX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSkKKyAgICAgICAgaWYgbm90IHNlbGYubm9iYWNrdXBzOgorICAgICAgICAgICAgIyBNYWtlIGJhY2t1cAorICAgICAgICAgICAgYmFja3VwID0gZmlsZW5hbWUgKyAiLmJhayIKKyAgICAgICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhiYWNrdXApOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGJhY2t1cCkKKyAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgiQ2FuJ3QgcmVtb3ZlIGJhY2t1cCAlcyIsIGJhY2t1cCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW5hbWUoZmlsZW5hbWUsIGJhY2t1cCkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIkNhbid0IHJlbmFtZSAlcyB0byAlcyIsIGZpbGVuYW1lLCBiYWNrdXApCisgICAgICAgICMgQWN0dWFsbHkgd3JpdGUgdGhlIG5ldyBmaWxlCisgICAgICAgIHdyaXRlID0gc3VwZXIoU3Rkb3V0UmVmYWN0b3JpbmdUb29sLCBzZWxmKS53cml0ZV9maWxlCisgICAgICAgIHdyaXRlKG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQsIGVuY29kaW5nKQorICAgICAgICBpZiBub3Qgc2VsZi5ub2JhY2t1cHM6CisgICAgICAgICAgICBzaHV0aWwuY29weW1vZGUoYmFja3VwLCBmaWxlbmFtZSkKKyAgICAgICAgaWYgb3JpZ19maWxlbmFtZSAhPSBmaWxlbmFtZToKKyAgICAgICAgICAgICMgUHJlc2VydmUgdGhlIGZpbGUgbW9kZSBpbiB0aGUgbmV3IG91dHB1dCBkaXJlY3RvcnkuCisgICAgICAgICAgICBzaHV0aWwuY29weW1vZGUob3JpZ19maWxlbmFtZSwgZmlsZW5hbWUpCisKKyAgICBkZWYgcHJpbnRfb3V0cHV0KHNlbGYsIG9sZCwgbmV3LCBmaWxlbmFtZSwgZXF1YWwpOgorICAgICAgICBpZiBlcXVhbDoKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIk5vIGNoYW5nZXMgdG8gJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIlJlZmFjdG9yZWQgJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIHNlbGYuc2hvd19kaWZmczoKKyAgICAgICAgICAgICAgICBkaWZmX2xpbmVzID0gZGlmZl90ZXh0cyhvbGQsIG5ldywgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm91dHB1dF9sb2NrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLm91dHB1dF9sb2NrOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGRpZmZfbGluZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGRpZmZfbGluZXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgbGluZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHdhcm4oImNvdWxkbid0IGVuY29kZSAlcydzIGRpZmYgZm9yIHlvdXIgdGVybWluYWwiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsZW5hbWUsKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKworZGVmIHdhcm4obXNnKToKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiV0FSTklORzogJXMiICUgKG1zZywpCisKKworZGVmIG1haW4oZml4ZXJfcGtnLCBhcmdzPU5vbmUpOgorICAgICIiIk1haW4gcHJvZ3JhbS4KKworICAgIEFyZ3M6CisgICAgICAgIGZpeGVyX3BrZzogdGhlIG5hbWUgb2YgYSBwYWNrYWdlIHdoZXJlIHRoZSBmaXhlcnMgYXJlIGxvY2F0ZWQuCisgICAgICAgIGFyZ3M6IG9wdGlvbmFsOyBhIGxpc3Qgb2YgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4gSWYgb21pdHRlZCwKKyAgICAgICAgICAgICAgc3lzLmFyZ3ZbMTpdIGlzIHVzZWQuCisKKyAgICBSZXR1cm5zIGEgc3VnZ2VzdGVkIGV4aXQgc3RhdHVzICgwLCAxLCAyKS4KKyAgICAiIiIKKyAgICAjIFNldCB1cCBvcHRpb24gcGFyc2VyCisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSIydG8zIFtvcHRpb25zXSBmaWxlfGRpciAuLi4iKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCItZCIsICItLWRvY3Rlc3RzX29ubHkiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkZpeCB1cCBkb2N0ZXN0cyBvbmx5IikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maXgiLCBhY3Rpb249ImFwcGVuZCIsIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRWFjaCBGSVggc3BlY2lmaWVzIGEgdHJhbnNmb3JtYXRpb247IGRlZmF1bHQ6IGFsbCIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1qIiwgIi0tcHJvY2Vzc2VzIiwgYWN0aW9uPSJzdG9yZSIsIGRlZmF1bHQ9MSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJpbnQiLCBoZWxwPSJSdW4gMnRvMyBjb25jdXJyZW50bHkiKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCIteCIsICItLW5vZml4IiwgYWN0aW9uPSJhcHBlbmQiLCBkZWZhdWx0PVtdLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IlByZXZlbnQgYSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGJlaW5nIHJ1biIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1sIiwgIi0tbGlzdC1maXhlcyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTGlzdCBhdmFpbGFibGUgdHJhbnNmb3JtYXRpb25zIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXAiLCAiLS1wcmludC1mdW5jdGlvbiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTW9kaWZ5IHRoZSBncmFtbWFyIHNvIHRoYXQgcHJpbnQoKSBpcyBhIGZ1bmN0aW9uIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJNb3JlIHZlcmJvc2UgbG9nZ2luZyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi0tbm8tZGlmZnMiLCBhY3Rpb249InN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRvbid0IHNob3cgZGlmZnMgb2YgdGhlIHJlZmFjdG9yaW5nIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLXciLCAiLS13cml0ZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iV3JpdGUgYmFjayBtb2RpZmllZCBmaWxlcyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1uIiwgIi0tbm9iYWNrdXBzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJEb24ndCB3cml0ZSBiYWNrdXBzIGZvciBtb2RpZmllZCBmaWxlcyIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1vIiwgIi0tb3V0cHV0LWRpciIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJzdHIiLAorICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IiIsIGhlbHA9IlB1dCBvdXRwdXQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgIgorICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nIHRoZSBpbnB1dCBmaWxlcy4gIFJlcXVpcmVzIC1uLiIpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1XIiwgIi0td3JpdGUtdW5jaGFuZ2VkLWZpbGVzIiwgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBbHNvIHdyaXRlIGZpbGVzIGV2ZW4gaWYgbm8gY2hhbmdlcyB3ZXJlIHJlcXVpcmVkIgorICAgICAgICAgICAgICAgICAgICAgICIgKHVzZWZ1bCB3aXRoIC0tb3V0cHV0LWRpcik7IGltcGxpZXMgLXcuIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigiLS1hZGQtc3VmZml4IiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9InN0ciIsIGRlZmF1bHQ9IiIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQXBwZW5kIHRoaXMgc3RyaW5nIHRvIGFsbCBvdXRwdXQgZmlsZW5hbWVzLiIKKyAgICAgICAgICAgICAgICAgICAgICAiIFJlcXVpcmVzIC1uIGlmIG5vbi1lbXB0eS4gICIKKyAgICAgICAgICAgICAgICAgICAgICAiZXg6IC0tYWRkLXN1ZmZpeD0nMycgd2lsbCBnZW5lcmF0ZSAucHkzIGZpbGVzLiIpCisKKyAgICAjIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICByZWZhY3Rvcl9zdGRpbiA9IEZhbHNlCisgICAgZmxhZ3MgPSB7fQorICAgIG9wdGlvbnMsIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQorICAgIGlmIG9wdGlvbnMud3JpdGVfdW5jaGFuZ2VkX2ZpbGVzOgorICAgICAgICBmbGFnc1sid3JpdGVfdW5jaGFuZ2VkX2ZpbGVzIl0gPSBUcnVlCisgICAgICAgIGlmIG5vdCBvcHRpb25zLndyaXRlOgorICAgICAgICAgICAgd2FybigiLS13cml0ZS11bmNoYW5nZWQtZmlsZXMvLVcgaW1wbGllcyAtdy4iKQorICAgICAgICBvcHRpb25zLndyaXRlID0gVHJ1ZQorICAgICMgSWYgd2UgYWxsb3dlZCB0aGVzZSwgdGhlIG9yaWdpbmFsIGZpbGVzIHdvdWxkIGJlIHJlbmFtZWQgdG8gYmFja3VwIG5hbWVzCisgICAgIyBidXQgbm90IHJlcGxhY2VkLgorICAgIGlmIG9wdGlvbnMub3V0cHV0X2RpciBhbmQgbm90IG9wdGlvbnMubm9iYWNrdXBzOgorICAgICAgICBwYXJzZXIuZXJyb3IoIkNhbid0IHVzZSAtLW91dHB1dC1kaXIvLW8gd2l0aG91dCAtbi4iKQorICAgIGlmIG9wdGlvbnMuYWRkX3N1ZmZpeCBhbmQgbm90IG9wdGlvbnMubm9iYWNrdXBzOgorICAgICAgICBwYXJzZXIuZXJyb3IoIkNhbid0IHVzZSAtLWFkZC1zdWZmaXggd2l0aG91dCAtbi4iKQorCisgICAgaWYgbm90IG9wdGlvbnMud3JpdGUgYW5kIG9wdGlvbnMubm9fZGlmZnM6CisgICAgICAgIHdhcm4oIm5vdCB3cml0aW5nIGZpbGVzIGFuZCBub3QgcHJpbnRpbmcgZGlmZnM7IHRoYXQncyBub3QgdmVyeSB1c2VmdWwiKQorICAgIGlmIG5vdCBvcHRpb25zLndyaXRlIGFuZCBvcHRpb25zLm5vYmFja3VwczoKKyAgICAgICAgcGFyc2VyLmVycm9yKCJDYW4ndCB1c2UgLW4gd2l0aG91dCAtdyIpCisgICAgaWYgb3B0aW9ucy5saXN0X2ZpeGVzOgorICAgICAgICBwcmludCAiQXZhaWxhYmxlIHRyYW5zZm9ybWF0aW9ucyBmb3IgdGhlIC1mLy0tZml4IG9wdGlvbjoiCisgICAgICAgIGZvciBmaXhuYW1lIGluIHJlZmFjdG9yLmdldF9hbGxfZml4X25hbWVzKGZpeGVyX3BrZyk6CisgICAgICAgICAgICBwcmludCBmaXhuYW1lCisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgIkF0IGxlYXN0IG9uZSBmaWxlIG9yIGRpcmVjdG9yeSBhcmd1bWVudCByZXF1aXJlZC4iCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJVc2UgLS1oZWxwIHRvIHNob3cgdXNhZ2UuIgorICAgICAgICByZXR1cm4gMgorICAgIGlmICItIiBpbiBhcmdzOgorICAgICAgICByZWZhY3Rvcl9zdGRpbiA9IFRydWUKKyAgICAgICAgaWYgb3B0aW9ucy53cml0ZToKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJDYW4ndCB3cml0ZSB0byBzdGRpbi4iCisgICAgICAgICAgICByZXR1cm4gMgorICAgIGlmIG9wdGlvbnMucHJpbnRfZnVuY3Rpb246CisgICAgICAgIGZsYWdzWyJwcmludF9mdW5jdGlvbiJdID0gVHJ1ZQorCisgICAgIyBTZXQgdXAgbG9nZ2luZyBoYW5kbGVyCisgICAgbGV2ZWwgPSBsb2dnaW5nLkRFQlVHIGlmIG9wdGlvbnMudmVyYm9zZSBlbHNlIGxvZ2dpbmcuSU5GTworICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoZm9ybWF0PSclKG5hbWUpczogJShtZXNzYWdlKXMnLCBsZXZlbD1sZXZlbCkKKyAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignbGliMnRvMy5tYWluJykKKworICAgICMgSW5pdGlhbGl6ZSB0aGUgcmVmYWN0b3JpbmcgdG9vbAorICAgIGF2YWlsX2ZpeGVzID0gc2V0KHJlZmFjdG9yLmdldF9maXhlcnNfZnJvbV9wYWNrYWdlKGZpeGVyX3BrZykpCisgICAgdW53YW50ZWRfZml4ZXMgPSBzZXQoZml4ZXJfcGtnICsgIi5maXhfIiArIGZpeCBmb3IgZml4IGluIG9wdGlvbnMubm9maXgpCisgICAgZXhwbGljaXQgPSBzZXQoKQorICAgIGlmIG9wdGlvbnMuZml4OgorICAgICAgICBhbGxfcHJlc2VudCA9IEZhbHNlCisgICAgICAgIGZvciBmaXggaW4gb3B0aW9ucy5maXg6CisgICAgICAgICAgICBpZiBmaXggPT0gImFsbCI6CisgICAgICAgICAgICAgICAgYWxsX3ByZXNlbnQgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4cGxpY2l0LmFkZChmaXhlcl9wa2cgKyAiLmZpeF8iICsgZml4KQorICAgICAgICByZXF1ZXN0ZWQgPSBhdmFpbF9maXhlcy51bmlvbihleHBsaWNpdCkgaWYgYWxsX3ByZXNlbnQgZWxzZSBleHBsaWNpdAorICAgIGVsc2U6CisgICAgICAgIHJlcXVlc3RlZCA9IGF2YWlsX2ZpeGVzLnVuaW9uKGV4cGxpY2l0KQorICAgIGZpeGVyX25hbWVzID0gcmVxdWVzdGVkLmRpZmZlcmVuY2UodW53YW50ZWRfZml4ZXMpCisgICAgaW5wdXRfYmFzZV9kaXIgPSBvcy5wYXRoLmNvbW1vbnByZWZpeChhcmdzKQorICAgIGlmIChpbnB1dF9iYXNlX2RpciBhbmQgbm90IGlucHV0X2Jhc2VfZGlyLmVuZHN3aXRoKG9zLnNlcCkKKyAgICAgICAgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKGlucHV0X2Jhc2VfZGlyKSk6CisgICAgICAgICMgT25lIG9yIG1vcmUgc2ltaWxhciBuYW1lcyB3ZXJlIHBhc3NlZCwgdGhlaXIgZGlyZWN0b3J5IGlzIHRoZSBiYXNlLgorICAgICAgICAjIG9zLnBhdGguY29tbW9ucHJlZml4KCkgaXMgaWdub3JhbnQgb2YgcGF0aCBlbGVtZW50cywgdGhpcyBjb3JyZWN0cworICAgICAgICAjIGZvciB0aGF0IHdlaXJkIEFQSS4KKyAgICAgICAgaW5wdXRfYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoaW5wdXRfYmFzZV9kaXIpCisgICAgaWYgb3B0aW9ucy5vdXRwdXRfZGlyOgorICAgICAgICBpbnB1dF9iYXNlX2RpciA9IGlucHV0X2Jhc2VfZGlyLnJzdHJpcChvcy5zZXApCisgICAgICAgIGxvZ2dlci5pbmZvKCdPdXRwdXQgaW4gJXIgd2lsbCBtaXJyb3IgdGhlIGlucHV0IGRpcmVjdG9yeSAlciBsYXlvdXQuJywKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5vdXRwdXRfZGlyLCBpbnB1dF9iYXNlX2RpcikKKyAgICBydCA9IFN0ZG91dFJlZmFjdG9yaW5nVG9vbCgKKyAgICAgICAgICAgIHNvcnRlZChmaXhlcl9uYW1lcyksIGZsYWdzLCBzb3J0ZWQoZXhwbGljaXQpLAorICAgICAgICAgICAgb3B0aW9ucy5ub2JhY2t1cHMsIG5vdCBvcHRpb25zLm5vX2RpZmZzLAorICAgICAgICAgICAgaW5wdXRfYmFzZV9kaXI9aW5wdXRfYmFzZV9kaXIsCisgICAgICAgICAgICBvdXRwdXRfZGlyPW9wdGlvbnMub3V0cHV0X2RpciwKKyAgICAgICAgICAgIGFwcGVuZF9zdWZmaXg9b3B0aW9ucy5hZGRfc3VmZml4KQorCisgICAgIyBSZWZhY3RvciBhbGwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHBhc3NlZCBhcyBhcmd1bWVudHMKKyAgICBpZiBub3QgcnQuZXJyb3JzOgorICAgICAgICBpZiByZWZhY3Rvcl9zdGRpbjoKKyAgICAgICAgICAgIHJ0LnJlZmFjdG9yX3N0ZGluKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBydC5yZWZhY3RvcihhcmdzLCBvcHRpb25zLndyaXRlLCBvcHRpb25zLmRvY3Rlc3RzX29ubHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5wcm9jZXNzZXMpCisgICAgICAgICAgICBleGNlcHQgcmVmYWN0b3IuTXVsdGlwcm9jZXNzaW5nVW5zdXBwb3J0ZWQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0IG9wdGlvbnMucHJvY2Vzc2VzID4gMQorICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICJTb3JyeSwgLWogaXNuJ3QgIiBcCisgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4iCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcnQuc3VtbWFyaXplKCkKKworICAgICMgUmV0dXJuIGVycm9yIHN0YXR1cyAoMCBpZiBydC5lcnJvcnMgaXMgemVybykKKyAgICByZXR1cm4gaW50KGJvb2wocnQuZXJyb3JzKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODZmYmQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL21haW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9tYWluLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzc2NjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL21haW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wYXRjb21wLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BhdGNvbXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzZTVmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wYXRjb21wLnB5CkBAIC0wLDAgKzEsMjA1IEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIlBhdHRlcm4gY29tcGlsZXIuCisKK1RoZSBncmFtbWVyIGlzIHRha2VuIGZyb20gUGF0dGVybkdyYW1tYXIudHh0LgorCitUaGUgY29tcGlsZXIgY29tcGlsZXMgYSBwYXR0ZXJuIHRvIGEgcHl0cmVlLipQYXR0ZXJuIGluc3RhbmNlLgorIiIiCisKK19fYXV0aG9yX18gPSAiR3VpZG8gdmFuIFJvc3N1bSA8Z3VpZG9AcHl0aG9uLm9yZz4iCisKKyMgUHl0aG9uIGltcG9ydHMKK2ltcG9ydCBvcworaW1wb3J0IFN0cmluZ0lPCisKKyMgRmFpcmx5IGxvY2FsIGltcG9ydHMKK2Zyb20gLnBnZW4yIGltcG9ydCBkcml2ZXIsIGxpdGVyYWxzLCB0b2tlbiwgdG9rZW5pemUsIHBhcnNlLCBncmFtbWFyCisKKyMgUmVhbGx5IGxvY2FsIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgcHl0cmVlCitmcm9tIC4gaW1wb3J0IHB5Z3JhbQorCisjIFRoZSBwYXR0ZXJuIGdyYW1tYXIgZmlsZQorX1BBVFRFUk5fR1JBTU1BUl9GSUxFID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBhdHRlcm5HcmFtbWFyLnR4dCIpCisKKworY2xhc3MgUGF0dGVyblN5bnRheEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2RlZiB0b2tlbml6ZV93cmFwcGVyKGlucHV0KToKKyAgICAiIiJUb2tlbml6ZXMgYSBzdHJpbmcgc3VwcHJlc3Npbmcgc2lnbmlmaWNhbnQgd2hpdGVzcGFjZS4iIiIKKyAgICBza2lwID0gc2V0KCh0b2tlbi5ORVdMSU5FLCB0b2tlbi5JTkRFTlQsIHRva2VuLkRFREVOVCkpCisgICAgdG9rZW5zID0gdG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKFN0cmluZ0lPLlN0cmluZ0lPKGlucHV0KS5yZWFkbGluZSkKKyAgICBmb3IgcXVpbnR1cGxlIGluIHRva2VuczoKKyAgICAgICAgdHlwZSwgdmFsdWUsIHN0YXJ0LCBlbmQsIGxpbmVfdGV4dCA9IHF1aW50dXBsZQorICAgICAgICBpZiB0eXBlIG5vdCBpbiBza2lwOgorICAgICAgICAgICAgeWllbGQgcXVpbnR1cGxlCisKKworY2xhc3MgUGF0dGVybkNvbXBpbGVyKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JhbW1hcl9maWxlPV9QQVRURVJOX0dSQU1NQVJfRklMRSk6CisgICAgICAgICIiIkluaXRpYWxpemVyLgorCisgICAgICAgIFRha2VzIGFuIG9wdGlvbmFsIGFsdGVybmF0aXZlIGZpbGVuYW1lIGZvciB0aGUgcGF0dGVybiBncmFtbWFyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ncmFtbWFyID0gZHJpdmVyLmxvYWRfZ3JhbW1hcihncmFtbWFyX2ZpbGUpCisgICAgICAgIHNlbGYuc3ltcyA9IHB5Z3JhbS5TeW1ib2xzKHNlbGYuZ3JhbW1hcikKKyAgICAgICAgc2VsZi5weWdyYW1tYXIgPSBweWdyYW0ucHl0aG9uX2dyYW1tYXIKKyAgICAgICAgc2VsZi5weXN5bXMgPSBweWdyYW0ucHl0aG9uX3N5bWJvbHMKKyAgICAgICAgc2VsZi5kcml2ZXIgPSBkcml2ZXIuRHJpdmVyKHNlbGYuZ3JhbW1hciwgY29udmVydD1wYXR0ZXJuX2NvbnZlcnQpCisKKyAgICBkZWYgY29tcGlsZV9wYXR0ZXJuKHNlbGYsIGlucHV0LCBkZWJ1Zz1GYWxzZSwgd2l0aF90cmVlPUZhbHNlKToKKyAgICAgICAgIiIiQ29tcGlsZXMgYSBwYXR0ZXJuIHN0cmluZyB0byBhIG5lc3RlZCBweXRyZWUuKlBhdHRlcm4gb2JqZWN0LiIiIgorICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZV93cmFwcGVyKGlucHV0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICByb290ID0gc2VsZi5kcml2ZXIucGFyc2VfdG9rZW5zKHRva2VucywgZGVidWc9ZGVidWcpCisgICAgICAgIGV4Y2VwdCBwYXJzZS5QYXJzZUVycm9yIGFzIGU6CisgICAgICAgICAgICByYWlzZSBQYXR0ZXJuU3ludGF4RXJyb3Ioc3RyKGUpKQorICAgICAgICBpZiB3aXRoX3RyZWU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb21waWxlX25vZGUocm9vdCksIHJvb3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXBpbGVfbm9kZShyb290KQorCisgICAgZGVmIGNvbXBpbGVfbm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgIiIiQ29tcGlsZXMgYSBub2RlLCByZWN1cnNpdmVseS4KKworICAgICAgICBUaGlzIGlzIG9uZSBiaWcgc3dpdGNoIG9uIHRoZSBub2RlIHR5cGUuCisgICAgICAgICIiIgorICAgICAgICAjIFhYWCBPcHRpbWl6ZSBjZXJ0YWluIFdpbGRjYXJkLWNvbnRhaW5pbmctV2lsZGNhcmQgcGF0dGVybnMKKyAgICAgICAgIyB0aGF0IGNhbiBiZSBtZXJnZWQKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHNlbGYuc3ltcy5NYXRjaGVyOgorICAgICAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGRyZW5bMF0gIyBBdm9pZCB1bm5lZWRlZCByZWN1cnNpb24KKworICAgICAgICBpZiBub2RlLnR5cGUgPT0gc2VsZi5zeW1zLkFsdGVybmF0aXZlczoKKyAgICAgICAgICAgICMgU2tpcCB0aGUgb2RkIGNoaWxkcmVuIHNpbmNlIHRoZXkgYXJlIGp1c3QgJ3wnIHRva2VucworICAgICAgICAgICAgYWx0cyA9IFtzZWxmLmNvbXBpbGVfbm9kZShjaCkgZm9yIGNoIGluIG5vZGUuY2hpbGRyZW5bOjoyXV0KKyAgICAgICAgICAgIGlmIGxlbihhbHRzKSA9PSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBhbHRzWzBdCisgICAgICAgICAgICBwID0gcHl0cmVlLldpbGRjYXJkUGF0dGVybihbW2FdIGZvciBhIGluIGFsdHNdLCBtaW49MSwgbWF4PTEpCisgICAgICAgICAgICByZXR1cm4gcC5vcHRpbWl6ZSgpCisKKyAgICAgICAgaWYgbm9kZS50eXBlID09IHNlbGYuc3ltcy5BbHRlcm5hdGl2ZToKKyAgICAgICAgICAgIHVuaXRzID0gW3NlbGYuY29tcGlsZV9ub2RlKGNoKSBmb3IgY2ggaW4gbm9kZS5jaGlsZHJlbl0KKyAgICAgICAgICAgIGlmIGxlbih1bml0cykgPT0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pdHNbMF0KKyAgICAgICAgICAgIHAgPSBweXRyZWUuV2lsZGNhcmRQYXR0ZXJuKFt1bml0c10sIG1pbj0xLCBtYXg9MSkKKyAgICAgICAgICAgIHJldHVybiBwLm9wdGltaXplKCkKKworICAgICAgICBpZiBub2RlLnR5cGUgPT0gc2VsZi5zeW1zLk5lZ2F0ZWRVbml0OgorICAgICAgICAgICAgcGF0dGVybiA9IHNlbGYuY29tcGlsZV9iYXNpYyhub2RlLmNoaWxkcmVuWzE6XSkKKyAgICAgICAgICAgIHAgPSBweXRyZWUuTmVnYXRlZFBhdHRlcm4ocGF0dGVybikKKyAgICAgICAgICAgIHJldHVybiBwLm9wdGltaXplKCkKKworICAgICAgICBhc3NlcnQgbm9kZS50eXBlID09IHNlbGYuc3ltcy5Vbml0CisKKyAgICAgICAgbmFtZSA9IE5vbmUKKyAgICAgICAgbm9kZXMgPSBub2RlLmNoaWxkcmVuCisgICAgICAgIGlmIGxlbihub2RlcykgPj0gMyBhbmQgbm9kZXNbMV0udHlwZSA9PSB0b2tlbi5FUVVBTDoKKyAgICAgICAgICAgIG5hbWUgPSBub2Rlc1swXS52YWx1ZQorICAgICAgICAgICAgbm9kZXMgPSBub2Rlc1syOl0KKyAgICAgICAgcmVwZWF0ID0gTm9uZQorICAgICAgICBpZiBsZW4obm9kZXMpID49IDIgYW5kIG5vZGVzWy0xXS50eXBlID09IHNlbGYuc3ltcy5SZXBlYXRlcjoKKyAgICAgICAgICAgIHJlcGVhdCA9IG5vZGVzWy0xXQorICAgICAgICAgICAgbm9kZXMgPSBub2Rlc1s6LTFdCisKKyAgICAgICAgIyBOb3cgd2UndmUgcmVkdWNlZCBpdCB0bzogU1RSSU5HIHwgTkFNRSBbRGV0YWlsc10gfCAoLi4uKSB8IFsuLi5dCisgICAgICAgIHBhdHRlcm4gPSBzZWxmLmNvbXBpbGVfYmFzaWMobm9kZXMsIHJlcGVhdCkKKworICAgICAgICBpZiByZXBlYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhc3NlcnQgcmVwZWF0LnR5cGUgPT0gc2VsZi5zeW1zLlJlcGVhdGVyCisgICAgICAgICAgICBjaGlsZHJlbiA9IHJlcGVhdC5jaGlsZHJlbgorICAgICAgICAgICAgY2hpbGQgPSBjaGlsZHJlblswXQorICAgICAgICAgICAgaWYgY2hpbGQudHlwZSA9PSB0b2tlbi5TVEFSOgorICAgICAgICAgICAgICAgIG1pbiA9IDAKKyAgICAgICAgICAgICAgICBtYXggPSBweXRyZWUuSFVHRQorICAgICAgICAgICAgZWxpZiBjaGlsZC50eXBlID09IHRva2VuLlBMVVM6CisgICAgICAgICAgICAgICAgbWluID0gMQorICAgICAgICAgICAgICAgIG1heCA9IHB5dHJlZS5IVUdFCisgICAgICAgICAgICBlbGlmIGNoaWxkLnR5cGUgPT0gdG9rZW4uTEJSQUNFOgorICAgICAgICAgICAgICAgIGFzc2VydCBjaGlsZHJlblstMV0udHlwZSA9PSB0b2tlbi5SQlJBQ0UKKyAgICAgICAgICAgICAgICBhc3NlcnQgIGxlbihjaGlsZHJlbikgaW4gKDMsIDUpCisgICAgICAgICAgICAgICAgbWluID0gbWF4ID0gc2VsZi5nZXRfaW50KGNoaWxkcmVuWzFdKQorICAgICAgICAgICAgICAgIGlmIGxlbihjaGlsZHJlbikgPT0gNToKKyAgICAgICAgICAgICAgICAgICAgbWF4ID0gc2VsZi5nZXRfaW50KGNoaWxkcmVuWzNdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgRmFsc2UKKyAgICAgICAgICAgIGlmIG1pbiAhPSAxIG9yIG1heCAhPSAxOgorICAgICAgICAgICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLm9wdGltaXplKCkKKyAgICAgICAgICAgICAgICBwYXR0ZXJuID0gcHl0cmVlLldpbGRjYXJkUGF0dGVybihbW3BhdHRlcm5dXSwgbWluPW1pbiwgbWF4PW1heCkKKworICAgICAgICBpZiBuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGF0dGVybi5uYW1lID0gbmFtZQorICAgICAgICByZXR1cm4gcGF0dGVybi5vcHRpbWl6ZSgpCisKKyAgICBkZWYgY29tcGlsZV9iYXNpYyhzZWxmLCBub2RlcywgcmVwZWF0PU5vbmUpOgorICAgICAgICAjIENvbXBpbGUgU1RSSU5HIHwgTkFNRSBbRGV0YWlsc10gfCAoLi4uKSB8IFsuLi5dCisgICAgICAgIGFzc2VydCBsZW4obm9kZXMpID49IDEKKyAgICAgICAgbm9kZSA9IG5vZGVzWzBdCisgICAgICAgIGlmIG5vZGUudHlwZSA9PSB0b2tlbi5TVFJJTkc6CisgICAgICAgICAgICB2YWx1ZSA9IHVuaWNvZGUobGl0ZXJhbHMuZXZhbFN0cmluZyhub2RlLnZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBweXRyZWUuTGVhZlBhdHRlcm4oX3R5cGVfb2ZfbGl0ZXJhbCh2YWx1ZSksIHZhbHVlKQorICAgICAgICBlbGlmIG5vZGUudHlwZSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgdmFsdWUgPSBub2RlLnZhbHVlCisgICAgICAgICAgICBpZiB2YWx1ZS5pc3VwcGVyKCk6CisgICAgICAgICAgICAgICAgaWYgdmFsdWUgbm90IGluIFRPS0VOX01BUDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGF0dGVyblN5bnRheEVycm9yKCJJbnZhbGlkIHRva2VuOiAlciIgJSB2YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiBub2Rlc1sxOl06CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhdHRlcm5TeW50YXhFcnJvcigiQ2FuJ3QgaGF2ZSBkZXRhaWxzIGZvciB0b2tlbiIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHB5dHJlZS5MZWFmUGF0dGVybihUT0tFTl9NQVBbdmFsdWVdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSAiYW55IjoKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbGlmIG5vdCB2YWx1ZS5zdGFydHN3aXRoKCJfIik6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBnZXRhdHRyKHNlbGYucHlzeW1zLCB2YWx1ZSwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUGF0dGVyblN5bnRheEVycm9yKCJJbnZhbGlkIHN5bWJvbDogJXIiICUgdmFsdWUpCisgICAgICAgICAgICAgICAgaWYgbm9kZXNbMTpdOiAjIERldGFpbHMgcHJlc2VudAorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gW3NlbGYuY29tcGlsZV9ub2RlKG5vZGVzWzFdLmNoaWxkcmVuWzFdKV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiBweXRyZWUuTm9kZVBhdHRlcm4odHlwZSwgY29udGVudCkKKyAgICAgICAgZWxpZiBub2RlLnZhbHVlID09ICIoIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbXBpbGVfbm9kZShub2Rlc1sxXSkKKyAgICAgICAgZWxpZiBub2RlLnZhbHVlID09ICJbIjoKKyAgICAgICAgICAgIGFzc2VydCByZXBlYXQgaXMgTm9uZQorICAgICAgICAgICAgc3VicGF0dGVybiA9IHNlbGYuY29tcGlsZV9ub2RlKG5vZGVzWzFdKQorICAgICAgICAgICAgcmV0dXJuIHB5dHJlZS5XaWxkY2FyZFBhdHRlcm4oW1tzdWJwYXR0ZXJuXV0sIG1pbj0wLCBtYXg9MSkKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCBub2RlCisKKyAgICBkZWYgZ2V0X2ludChzZWxmLCBub2RlKToKKyAgICAgICAgYXNzZXJ0IG5vZGUudHlwZSA9PSB0b2tlbi5OVU1CRVIKKyAgICAgICAgcmV0dXJuIGludChub2RlLnZhbHVlKQorCisKKyMgTWFwIG5hbWVkIHRva2VucyB0byB0aGUgdHlwZSB2YWx1ZSBmb3IgYSBMZWFmUGF0dGVybgorVE9LRU5fTUFQID0geyJOQU1FIjogdG9rZW4uTkFNRSwKKyAgICAgICAgICAgICAiU1RSSU5HIjogdG9rZW4uU1RSSU5HLAorICAgICAgICAgICAgICJOVU1CRVIiOiB0b2tlbi5OVU1CRVIsCisgICAgICAgICAgICAgIlRPS0VOIjogTm9uZX0KKworCitkZWYgX3R5cGVfb2ZfbGl0ZXJhbCh2YWx1ZSk6CisgICAgaWYgdmFsdWVbMF0uaXNhbHBoYSgpOgorICAgICAgICByZXR1cm4gdG9rZW4uTkFNRQorICAgIGVsaWYgdmFsdWUgaW4gZ3JhbW1hci5vcG1hcDoKKyAgICAgICAgcmV0dXJuIGdyYW1tYXIub3BtYXBbdmFsdWVdCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitkZWYgcGF0dGVybl9jb252ZXJ0KGdyYW1tYXIsIHJhd19ub2RlX2luZm8pOgorICAgICIiIkNvbnZlcnRzIHJhdyBub2RlIGluZm9ybWF0aW9uIHRvIGEgTm9kZSBvciBMZWFmIGluc3RhbmNlLiIiIgorICAgIHR5cGUsIHZhbHVlLCBjb250ZXh0LCBjaGlsZHJlbiA9IHJhd19ub2RlX2luZm8KKyAgICBpZiBjaGlsZHJlbiBvciB0eXBlIGluIGdyYW1tYXIubnVtYmVyMnN5bWJvbDoKKyAgICAgICAgcmV0dXJuIHB5dHJlZS5Ob2RlKHR5cGUsIGNoaWxkcmVuLCBjb250ZXh0PWNvbnRleHQpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHB5dHJlZS5MZWFmKHR5cGUsIHZhbHVlLCBjb250ZXh0PWNvbnRleHQpCisKKworZGVmIGNvbXBpbGVfcGF0dGVybihwYXR0ZXJuKToKKyAgICByZXR1cm4gUGF0dGVybkNvbXBpbGVyKCkuY29tcGlsZV9wYXR0ZXJuKHBhdHRlcm4pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5NWVlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wYXRjb21wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGF0Y29tcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5OTBhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wYXRjb21wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYzOTA0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weQpAQCAtMCwwICsxLDQgQEAKKyMgQ29weXJpZ2h0IDIwMDQtMjAwNSBFbGVtZW50YWwgU2VjdXJpdHksIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJUaGUgcGdlbjIgcGFja2FnZS4iIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjc3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjYjc3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2NvbnYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhmYmIwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5CkBAIC0wLDAgKzEsMjU3IEBACisjIENvcHlyaWdodCAyMDA0LTIwMDUgRWxlbWVudGFsIFNlY3VyaXR5LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiQ29udmVydCBncmFtaW5pdC5bY2hdIHNwaXQgb3V0IGJ5IHBnZW4gdG8gUHl0aG9uIGNvZGUuCisKK1BnZW4gaXMgdGhlIFB5dGhvbiBwYXJzZXIgZ2VuZXJhdG9yLiAgSXQgaXMgdXNlZnVsIHRvIHF1aWNrbHkgY3JlYXRlIGEKK3BhcnNlciBmcm9tIGEgZ3JhbW1hciBmaWxlIGluIFB5dGhvbidzIGdyYW1tYXIgbm90YXRpb24uICBCdXQgSSBkb24ndAord2FudCBteSBwYXJzZXJzIHRvIGJlIHdyaXR0ZW4gaW4gQyAoeWV0KSwgc28gSSdtIHRyYW5zbGF0aW5nIHRoZQorcGFyc2luZyB0YWJsZXMgdG8gUHl0aG9uIGRhdGEgc3RydWN0dXJlcyBhbmQgd3JpdGluZyBhIFB5dGhvbiBwYXJzZQorZW5naW5lLgorCitOb3RlIHRoYXQgdGhlIHRva2VuIG51bWJlcnMgYXJlIGNvbnN0YW50cyBkZXRlcm1pbmVkIGJ5IHRoZSBzdGFuZGFyZAorUHl0aG9uIHRva2VuaXplci4gIFRoZSBzdGFuZGFyZCB0b2tlbiBtb2R1bGUgZGVmaW5lcyB0aGVzZSBudW1iZXJzIGFuZAordGhlaXIgbmFtZXMgKHRoZSBuYW1lcyBhcmUgbm90IHVzZWQgbXVjaCkuICBUaGUgdG9rZW4gbnVtYmVycyBhcmUKK2hhcmRjb2RlZCBpbnRvIHRoZSBQeXRob24gdG9rZW5pemVyIGFuZCBpbnRvIHBnZW4uICBBIFB5dGhvbgoraW1wbGVtZW50YXRpb24gb2YgdGhlIFB5dGhvbiB0b2tlbml6ZXIgaXMgYWxzbyBhdmFpbGFibGUsIGluIHRoZQorc3RhbmRhcmQgdG9rZW5pemUgbW9kdWxlLgorCitPbiB0aGUgb3RoZXIgaGFuZCwgc3ltYm9sIG51bWJlcnMgKHJlcHJlc2VudGluZyB0aGUgZ3JhbW1hcidzCitub24tdGVybWluYWxzKSBhcmUgYXNzaWduZWQgYnkgcGdlbiBiYXNlZCBvbiB0aGUgYWN0dWFsIGdyYW1tYXIKK2lucHV0LgorCitOb3RlOiB0aGlzIG1vZHVsZSBpcyBwcmV0dHkgbXVjaCBvYnNvbGV0ZTsgdGhlIHBnZW4gbW9kdWxlIGdlbmVyYXRlcworZXF1aXZhbGVudCBncmFtbWFyIHRhYmxlcyBkaXJlY3RseSBmcm9tIHRoZSBHcmFtbWFyLnR4dCBpbnB1dCBmaWxlCit3aXRob3V0IGhhdmluZyB0byBpbnZva2UgdGhlIFB5dGhvbiBwZ2VuIEMgcHJvZ3JhbS4KKworIiIiCisKKyMgUHl0aG9uIGltcG9ydHMKK2ltcG9ydCByZQorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gcGdlbjIgaW1wb3J0IGdyYW1tYXIsIHRva2VuCisKKworY2xhc3MgQ29udmVydGVyKGdyYW1tYXIuR3JhbW1hcik6CisgICAgIiIiR3JhbW1hciBzdWJjbGFzcyB0aGF0IHJlYWRzIGNsYXNzaWMgcGdlbiBvdXRwdXQgZmlsZXMuCisKKyAgICBUaGUgcnVuKCkgbWV0aG9kIHJlYWRzIHRoZSB0YWJsZXMgYXMgcHJvZHVjZWQgYnkgdGhlIHBnZW4gcGFyc2VyCisgICAgZ2VuZXJhdG9yLCB0eXBpY2FsbHkgY29udGFpbmVkIGluIHR3byBDIGZpbGVzLCBncmFtaW5pdC5oIGFuZAorICAgIGdyYW1pbml0LmMuICBUaGUgb3RoZXIgbWV0aG9kcyBhcmUgZm9yIGludGVybmFsIHVzZSBvbmx5LgorCisgICAgU2VlIHRoZSBiYXNlIGNsYXNzIGZvciBtb3JlIGRvY3VtZW50YXRpb24uCisKKyAgICAiIiIKKworICAgIGRlZiBydW4oc2VsZiwgZ3JhbWluaXRfaCwgZ3JhbWluaXRfYyk6CisgICAgICAgICIiIkxvYWQgdGhlIGdyYW1tYXIgdGFibGVzIGZyb20gdGhlIHRleHQgZmlsZXMgd3JpdHRlbiBieSBwZ2VuLiIiIgorICAgICAgICBzZWxmLnBhcnNlX2dyYW1pbml0X2goZ3JhbWluaXRfaCkKKyAgICAgICAgc2VsZi5wYXJzZV9ncmFtaW5pdF9jKGdyYW1pbml0X2MpCisgICAgICAgIHNlbGYuZmluaXNoX29mZigpCisKKyAgICBkZWYgcGFyc2VfZ3JhbWluaXRfaChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIlBhcnNlIHRoZSAuaCBmaWxlIHdyaXR0ZW4gYnkgcGdlbi4gIChJbnRlcm5hbCkKKworICAgICAgICBUaGlzIGZpbGUgaXMgYSBzZXF1ZW5jZSBvZiAjZGVmaW5lIHN0YXRlbWVudHMgZGVmaW5pbmcgdGhlCisgICAgICAgIG5vbnRlcm1pbmFscyBvZiB0aGUgZ3JhbW1hciBhcyBudW1iZXJzLiAgV2UgYnVpbGQgdHdvIHRhYmxlcworICAgICAgICBtYXBwaW5nIHRoZSBudW1iZXJzIHRvIG5hbWVzIGFuZCBiYWNrLgorCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHByaW50ICJDYW4ndCBvcGVuICVzOiAlcyIgJSAoZmlsZW5hbWUsIGVycikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzZWxmLnN5bWJvbDJudW1iZXIgPSB7fQorICAgICAgICBzZWxmLm51bWJlcjJzeW1ib2wgPSB7fQorICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBsaW5lbm8gKz0gMQorICAgICAgICAgICAgbW8gPSByZS5tYXRjaChyIl4jZGVmaW5lXHMrKFx3KylccysoXGQrKSQiLCBsaW5lKQorICAgICAgICAgICAgaWYgbm90IG1vIGFuZCBsaW5lLnN0cmlwKCk6CisgICAgICAgICAgICAgICAgcHJpbnQgIiVzKCVzKTogY2FuJ3QgcGFyc2UgJXMiICUgKGZpbGVuYW1lLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3ltYm9sLCBudW1iZXIgPSBtby5ncm91cHMoKQorICAgICAgICAgICAgICAgIG51bWJlciA9IGludChudW1iZXIpCisgICAgICAgICAgICAgICAgYXNzZXJ0IHN5bWJvbCBub3QgaW4gc2VsZi5zeW1ib2wybnVtYmVyCisgICAgICAgICAgICAgICAgYXNzZXJ0IG51bWJlciBub3QgaW4gc2VsZi5udW1iZXIyc3ltYm9sCisgICAgICAgICAgICAgICAgc2VsZi5zeW1ib2wybnVtYmVyW3N5bWJvbF0gPSBudW1iZXIKKyAgICAgICAgICAgICAgICBzZWxmLm51bWJlcjJzeW1ib2xbbnVtYmVyXSA9IHN5bWJvbAorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHBhcnNlX2dyYW1pbml0X2Moc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJQYXJzZSB0aGUgLmMgZmlsZSB3cml0dGVuIGJ5IHBnZW4uICAoSW50ZXJuYWwpCisKKyAgICAgICAgVGhlIGZpbGUgbG9va3MgYXMgZm9sbG93cy4gIFRoZSBmaXJzdCB0d28gbGluZXMgYXJlIGFsd2F5cyB0aGlzOgorCisgICAgICAgICNpbmNsdWRlICJwZ2VuaGVhZGVycy5oIgorICAgICAgICAjaW5jbHVkZSAiZ3JhbW1hci5oIgorCisgICAgICAgIEFmdGVyIHRoYXQgY29tZSBmb3VyIGJsb2NrczoKKworICAgICAgICAxKSBvbmUgb3IgbW9yZSBzdGF0ZSBkZWZpbml0aW9ucworICAgICAgICAyKSBhIHRhYmxlIGRlZmluaW5nIGRmYXMKKyAgICAgICAgMykgYSB0YWJsZSBkZWZpbmluZyBsYWJlbHMKKyAgICAgICAgNCkgYSBzdHJ1Y3QgZGVmaW5pbmcgdGhlIGdyYW1tYXIKKworICAgICAgICBBIHN0YXRlIGRlZmluaXRpb24gaGFzIHRoZSBmb2xsb3dpbmcgZm9ybToKKyAgICAgICAgLSBvbmUgb3IgbW9yZSBhcmMgYXJyYXlzLCBlYWNoIG9mIHRoZSBmb3JtOgorICAgICAgICAgIHN0YXRpYyBhcmMgYXJjc188bj5fPG0+WzxrPl0gPSB7CisgICAgICAgICAgICAgICAgICB7PGk+LCA8aj59LAorICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgfTsKKyAgICAgICAgLSBmb2xsb3dlZCBieSBhIHN0YXRlIGFycmF5LCBvZiB0aGUgZm9ybToKKyAgICAgICAgICBzdGF0aWMgc3RhdGUgc3RhdGVzXzxzPls8dD5dID0geworICAgICAgICAgICAgICAgICAgezxrPiwgYXJjc188bj5fPG0+fSwKKyAgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgIH07CisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICAgICAgcHJpbnQgIkNhbid0IG9wZW4gJXM6ICVzIiAlIChmaWxlbmFtZSwgZXJyKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICMgVGhlIGNvZGUgYmVsb3cgZXNzZW50aWFsbHkgdXNlcyBmJ3MgaXRlcmF0b3ItbmVzcyEKKyAgICAgICAgbGluZW5vID0gMAorCisgICAgICAgICMgRXhwZWN0IHRoZSB0d28gI2luY2x1ZGUgbGluZXMKKyAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgIGFzc2VydCBsaW5lID09ICcjaW5jbHVkZSAicGdlbmhlYWRlcnMuaCJcbicsIChsaW5lbm8sIGxpbmUpCisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBhc3NlcnQgbGluZSA9PSAnI2luY2x1ZGUgImdyYW1tYXIuaCJcbicsIChsaW5lbm8sIGxpbmUpCisKKyAgICAgICAgIyBQYXJzZSB0aGUgc3RhdGUgZGVmaW5pdGlvbnMKKyAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgIGFsbGFyY3MgPSB7fQorICAgICAgICBzdGF0ZXMgPSBbXQorICAgICAgICB3aGlsZSBsaW5lLnN0YXJ0c3dpdGgoInN0YXRpYyBhcmMgIik6CisgICAgICAgICAgICB3aGlsZSBsaW5lLnN0YXJ0c3dpdGgoInN0YXRpYyBhcmMgIik6CisgICAgICAgICAgICAgICAgbW8gPSByZS5tYXRjaChyInN0YXRpYyBhcmMgYXJjc18oXGQrKV8oXGQrKVxbKFxkKylcXSA9IHskIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgICAgIG4sIG0sIGsgPSBtYXAoaW50LCBtby5ncm91cHMoKSkKKyAgICAgICAgICAgICAgICBhcmNzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZShrKToKKyAgICAgICAgICAgICAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgICAgICAgICAgICAgIG1vID0gcmUubWF0Y2gociJccyt7KFxkKyksIChcZCspfSwkIiwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICBpLCBqID0gbWFwKGludCwgbW8uZ3JvdXBzKCkpCisgICAgICAgICAgICAgICAgICAgIGFyY3MuYXBwZW5kKChpLCBqKSkKKyAgICAgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGluZSA9PSAifTtcbiIsIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICAgICAgYWxsYXJjc1sobiwgbSldID0gYXJjcworICAgICAgICAgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICAgICAgbW8gPSByZS5tYXRjaChyInN0YXRpYyBzdGF0ZSBzdGF0ZXNfKFxkKylcWyhcZCspXF0gPSB7JCIsIGxpbmUpCisgICAgICAgICAgICBhc3NlcnQgbW8sIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICBzLCB0ID0gbWFwKGludCwgbW8uZ3JvdXBzKCkpCisgICAgICAgICAgICBhc3NlcnQgcyA9PSBsZW4oc3RhdGVzKSwgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgIHN0YXRlID0gW10KKyAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKHQpOgorICAgICAgICAgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICAgICAgICAgIG1vID0gcmUubWF0Y2gociJccyt7KFxkKyksIGFyY3NfKFxkKylfKFxkKyl9LCQiLCBsaW5lKQorICAgICAgICAgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgICAgICBrLCBuLCBtID0gbWFwKGludCwgbW8uZ3JvdXBzKCkpCisgICAgICAgICAgICAgICAgYXJjcyA9IGFsbGFyY3NbbiwgbV0KKyAgICAgICAgICAgICAgICBhc3NlcnQgayA9PSBsZW4oYXJjcyksIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICAgICAgc3RhdGUuYXBwZW5kKGFyY3MpCisgICAgICAgICAgICBzdGF0ZXMuYXBwZW5kKHN0YXRlKQorICAgICAgICAgICAgbGluZW5vLCBsaW5lID0gbGluZW5vKzEsIGYubmV4dCgpCisgICAgICAgICAgICBhc3NlcnQgbGluZSA9PSAifTtcbiIsIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgc2VsZi5zdGF0ZXMgPSBzdGF0ZXMKKworICAgICAgICAjIFBhcnNlIHRoZSBkZmFzCisgICAgICAgIGRmYXMgPSB7fQorICAgICAgICBtbyA9IHJlLm1hdGNoKHIic3RhdGljIGRmYSBkZmFzXFsoXGQrKVxdID0geyQiLCBsaW5lKQorICAgICAgICBhc3NlcnQgbW8sIChsaW5lbm8sIGxpbmUpCisgICAgICAgIG5kZmFzID0gaW50KG1vLmdyb3VwKDEpKQorICAgICAgICBmb3IgaSBpbiByYW5nZShuZGZhcyk6CisgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgICAgIG1vID0gcmUubWF0Y2gocidccyt7KFxkKyksICIoXHcrKSIsIChcZCspLCAoXGQrKSwgc3RhdGVzXyhcZCspLCQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQorICAgICAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgc3ltYm9sID0gbW8uZ3JvdXAoMikKKyAgICAgICAgICAgIG51bWJlciwgeCwgeSwgeiA9IG1hcChpbnQsIG1vLmdyb3VwKDEsIDMsIDQsIDUpKQorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuc3ltYm9sMm51bWJlcltzeW1ib2xdID09IG51bWJlciwgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLm51bWJlcjJzeW1ib2xbbnVtYmVyXSA9PSBzeW1ib2wsIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICBhc3NlcnQgeCA9PSAwLCAobGluZW5vLCBsaW5lKQorICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZXNbel0KKyAgICAgICAgICAgIGFzc2VydCB5ID09IGxlbihzdGF0ZSksIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgICAgIG1vID0gcmUubWF0Y2gocidccysoIig/OlxcXGRcZFxkKSoiKX0sJCcsIGxpbmUpCisgICAgICAgICAgICBhc3NlcnQgbW8sIChsaW5lbm8sIGxpbmUpCisgICAgICAgICAgICBmaXJzdCA9IHt9CisgICAgICAgICAgICByYXdiaXRzZXQgPSBldmFsKG1vLmdyb3VwKDEpKQorICAgICAgICAgICAgZm9yIGksIGMgaW4gZW51bWVyYXRlKHJhd2JpdHNldCk6CisgICAgICAgICAgICAgICAgYnl0ZSA9IG9yZChjKQorICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDgpOgorICAgICAgICAgICAgICAgICAgICBpZiBieXRlICYgKDE8PGopOgorICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RbaSo4ICsgal0gPSAxCisgICAgICAgICAgICBkZmFzW251bWJlcl0gPSAoc3RhdGUsIGZpcnN0KQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIn07XG4iLCAobGluZW5vLCBsaW5lKQorICAgICAgICBzZWxmLmRmYXMgPSBkZmFzCisKKyAgICAgICAgIyBQYXJzZSB0aGUgbGFiZWxzCisgICAgICAgIGxhYmVscyA9IFtdCisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBtbyA9IHJlLm1hdGNoKHIic3RhdGljIGxhYmVsIGxhYmVsc1xbKFxkKylcXSA9IHskIiwgbGluZSkKKyAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICBubGFiZWxzID0gaW50KG1vLmdyb3VwKDEpKQorICAgICAgICBmb3IgaSBpbiByYW5nZShubGFiZWxzKToKKyAgICAgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICAgICAgbW8gPSByZS5tYXRjaChyJ1xzK3soXGQrKSwgKDB8Ilx3KyIpfSwkJywgbGluZSkKKyAgICAgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgICAgIHgsIHkgPSBtby5ncm91cHMoKQorICAgICAgICAgICAgeCA9IGludCh4KQorICAgICAgICAgICAgaWYgeSA9PSAiMCI6CisgICAgICAgICAgICAgICAgeSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeSA9IGV2YWwoeSkKKyAgICAgICAgICAgIGxhYmVscy5hcHBlbmQoKHgsIHkpKQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIn07XG4iLCAobGluZW5vLCBsaW5lKQorICAgICAgICBzZWxmLmxhYmVscyA9IGxhYmVscworCisgICAgICAgICMgUGFyc2UgdGhlIGdyYW1tYXIgc3RydWN0CisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBhc3NlcnQgbGluZSA9PSAiZ3JhbW1hciBfUHlQYXJzZXJfR3JhbW1hciA9IHtcbiIsIChsaW5lbm8sIGxpbmUpCisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBtbyA9IHJlLm1hdGNoKHIiXHMrKFxkKyksJCIsIGxpbmUpCisgICAgICAgIGFzc2VydCBtbywgKGxpbmVubywgbGluZSkKKyAgICAgICAgbmRmYXMgPSBpbnQobW8uZ3JvdXAoMSkpCisgICAgICAgIGFzc2VydCBuZGZhcyA9PSBsZW4oc2VsZi5kZmFzKQorICAgICAgICBsaW5lbm8sIGxpbmUgPSBsaW5lbm8rMSwgZi5uZXh0KCkKKyAgICAgICAgYXNzZXJ0IGxpbmUgPT0gIlx0ZGZhcyxcbiIsIChsaW5lbm8sIGxpbmUpCisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBtbyA9IHJlLm1hdGNoKHIiXHMreyhcZCspLCBsYWJlbHN9LCQiLCBsaW5lKQorICAgICAgICBhc3NlcnQgbW8sIChsaW5lbm8sIGxpbmUpCisgICAgICAgIG5sYWJlbHMgPSBpbnQobW8uZ3JvdXAoMSkpCisgICAgICAgIGFzc2VydCBubGFiZWxzID09IGxlbihzZWxmLmxhYmVscyksIChsaW5lbm8sIGxpbmUpCisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBtbyA9IHJlLm1hdGNoKHIiXHMrKFxkKykkIiwgbGluZSkKKyAgICAgICAgYXNzZXJ0IG1vLCAobGluZW5vLCBsaW5lKQorICAgICAgICBzdGFydCA9IGludChtby5ncm91cCgxKSkKKyAgICAgICAgYXNzZXJ0IHN0YXJ0IGluIHNlbGYubnVtYmVyMnN5bWJvbCwgKGxpbmVubywgbGluZSkKKyAgICAgICAgc2VsZi5zdGFydCA9IHN0YXJ0CisgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBhc3NlcnQgbGluZSA9PSAifTtcbiIsIChsaW5lbm8sIGxpbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVubywgbGluZSA9IGxpbmVubysxLCBmLm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCAwLCAobGluZW5vLCBsaW5lKQorCisgICAgZGVmIGZpbmlzaF9vZmYoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBhZGRpdGlvbmFsIHVzZWZ1bCBzdHJ1Y3R1cmVzLiAgKEludGVybmFsKS4iIiIKKyAgICAgICAgc2VsZi5rZXl3b3JkcyA9IHt9ICMgbWFwIGZyb20ga2V5d29yZCBzdHJpbmdzIHRvIGFyYyBsYWJlbHMKKyAgICAgICAgc2VsZi50b2tlbnMgPSB7fSAgICMgbWFwIGZyb20gbnVtZXJpYyB0b2tlbiB2YWx1ZXMgdG8gYXJjIGxhYmVscworICAgICAgICBmb3IgaWxhYmVsLCAodHlwZSwgdmFsdWUpIGluIGVudW1lcmF0ZShzZWxmLmxhYmVscyk6CisgICAgICAgICAgICBpZiB0eXBlID09IHRva2VuLk5BTUUgYW5kIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYua2V5d29yZHNbdmFsdWVdID0gaWxhYmVsCisgICAgICAgICAgICBlbGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi50b2tlbnNbdHlwZV0gPSBpbGFiZWwKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2VmYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2NvbnYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9jb252LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTk3ODNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2NvbnYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZGFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZHJpdmVyLnB5CkBAIC0wLDAgKzEsMTU3IEBACisjIENvcHlyaWdodCAyMDA0LTIwMDUgRWxlbWVudGFsIFNlY3VyaXR5LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIyBNb2RpZmljYXRpb25zOgorIyBDb3B5cmlnaHQgMjAwNiBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJQYXJzZXIgZHJpdmVyLgorCitUaGlzIHByb3ZpZGVzIGEgaGlnaC1sZXZlbCBpbnRlcmZhY2UgdG8gcGFyc2UgYSBmaWxlIGludG8gYSBzeW50YXggdHJlZS4KKworIiIiCisKK19fYXV0aG9yX18gPSAiR3VpZG8gdmFuIFJvc3N1bSA8Z3VpZG9AcHl0aG9uLm9yZz4iCisKK19fYWxsX18gPSBbIkRyaXZlciIsICJsb2FkX2dyYW1tYXIiXQorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgY29kZWNzCitpbXBvcnQgb3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBzeXMKKworIyBQZ2VuIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgZ3JhbW1hciwgcGFyc2UsIHRva2VuLCB0b2tlbml6ZSwgcGdlbgorCisKK2NsYXNzIERyaXZlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdyYW1tYXIsIGNvbnZlcnQ9Tm9uZSwgbG9nZ2VyPU5vbmUpOgorICAgICAgICBzZWxmLmdyYW1tYXIgPSBncmFtbWFyCisgICAgICAgIGlmIGxvZ2dlciBpcyBOb25lOgorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorICAgICAgICBzZWxmLmxvZ2dlciA9IGxvZ2dlcgorICAgICAgICBzZWxmLmNvbnZlcnQgPSBjb252ZXJ0CisKKyAgICBkZWYgcGFyc2VfdG9rZW5zKHNlbGYsIHRva2VucywgZGVidWc9RmFsc2UpOgorICAgICAgICAiIiJQYXJzZSBhIHNlcmllcyBvZiB0b2tlbnMgYW5kIHJldHVybiB0aGUgc3ludGF4IHRyZWUuIiIiCisgICAgICAgICMgWFhYIE1vdmUgdGhlIHByZWZpeCBjb21wdXRhdGlvbiBpbnRvIGEgd3JhcHBlciBhcm91bmQgdG9rZW5pemUuCisgICAgICAgIHAgPSBwYXJzZS5QYXJzZXIoc2VsZi5ncmFtbWFyLCBzZWxmLmNvbnZlcnQpCisgICAgICAgIHAuc2V0dXAoKQorICAgICAgICBsaW5lbm8gPSAxCisgICAgICAgIGNvbHVtbiA9IDAKKyAgICAgICAgdHlwZSA9IHZhbHVlID0gc3RhcnQgPSBlbmQgPSBsaW5lX3RleHQgPSBOb25lCisgICAgICAgIHByZWZpeCA9IHUiIgorICAgICAgICBmb3IgcXVpbnR1cGxlIGluIHRva2VuczoKKyAgICAgICAgICAgIHR5cGUsIHZhbHVlLCBzdGFydCwgZW5kLCBsaW5lX3RleHQgPSBxdWludHVwbGUKKyAgICAgICAgICAgIGlmIHN0YXJ0ICE9IChsaW5lbm8sIGNvbHVtbik6CisgICAgICAgICAgICAgICAgYXNzZXJ0IChsaW5lbm8sIGNvbHVtbikgPD0gc3RhcnQsICgobGluZW5vLCBjb2x1bW4pLCBzdGFydCkKKyAgICAgICAgICAgICAgICBzX2xpbmVubywgc19jb2x1bW4gPSBzdGFydAorICAgICAgICAgICAgICAgIGlmIGxpbmVubyA8IHNfbGluZW5vOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXggKz0gIlxuIiAqIChzX2xpbmVubyAtIGxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgbGluZW5vID0gc19saW5lbm8KKyAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gMAorICAgICAgICAgICAgICAgIGlmIGNvbHVtbiA8IHNfY29sdW1uOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXggKz0gbGluZV90ZXh0W2NvbHVtbjpzX2NvbHVtbl0KKyAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gc19jb2x1bW4KKyAgICAgICAgICAgIGlmIHR5cGUgaW4gKHRva2VuaXplLkNPTU1FTlQsIHRva2VuaXplLk5MKToKKyAgICAgICAgICAgICAgICBwcmVmaXggKz0gdmFsdWUKKyAgICAgICAgICAgICAgICBsaW5lbm8sIGNvbHVtbiA9IGVuZAorICAgICAgICAgICAgICAgIGlmIHZhbHVlLmVuZHN3aXRoKCJcbiIpOgorICAgICAgICAgICAgICAgICAgICBsaW5lbm8gKz0gMQorICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAwCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHR5cGUgPT0gdG9rZW4uT1A6CisgICAgICAgICAgICAgICAgdHlwZSA9IGdyYW1tYXIub3BtYXBbdmFsdWVdCisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ2dlci5kZWJ1ZygiJXMgJXIgKHByZWZpeD0lcikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnRva19uYW1lW3R5cGVdLCB2YWx1ZSwgcHJlZml4KQorICAgICAgICAgICAgaWYgcC5hZGR0b2tlbih0eXBlLCB2YWx1ZSwgKHByZWZpeCwgc3RhcnQpKToKKyAgICAgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcoIlN0b3AuIikKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcHJlZml4ID0gIiIKKyAgICAgICAgICAgIGxpbmVubywgY29sdW1uID0gZW5kCisgICAgICAgICAgICBpZiB2YWx1ZS5lbmRzd2l0aCgiXG4iKToKKyAgICAgICAgICAgICAgICBsaW5lbm8gKz0gMQorICAgICAgICAgICAgICAgIGNvbHVtbiA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2UgbmV2ZXIgYnJva2Ugb3V0IC0tIEVPRiBpcyB0b28gc29vbiAoaG93IGNhbiB0aGlzIGhhcHBlbj8/PykKKyAgICAgICAgICAgIHJhaXNlIHBhcnNlLlBhcnNlRXJyb3IoImluY29tcGxldGUgaW5wdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCB2YWx1ZSwgKHByZWZpeCwgc3RhcnQpKQorICAgICAgICByZXR1cm4gcC5yb290bm9kZQorCisgICAgZGVmIHBhcnNlX3N0cmVhbV9yYXcoc2VsZiwgc3RyZWFtLCBkZWJ1Zz1GYWxzZSk6CisgICAgICAgICIiIlBhcnNlIGEgc3RyZWFtIGFuZCByZXR1cm4gdGhlIHN5bnRheCB0cmVlLiIiIgorICAgICAgICB0b2tlbnMgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoc3RyZWFtLnJlYWRsaW5lKQorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV90b2tlbnModG9rZW5zLCBkZWJ1ZykKKworICAgIGRlZiBwYXJzZV9zdHJlYW0oc2VsZiwgc3RyZWFtLCBkZWJ1Zz1GYWxzZSk6CisgICAgICAgICIiIlBhcnNlIGEgc3RyZWFtIGFuZCByZXR1cm4gdGhlIHN5bnRheCB0cmVlLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9zdHJlYW1fcmF3KHN0cmVhbSwgZGVidWcpCisKKyAgICBkZWYgcGFyc2VfZmlsZShzZWxmLCBmaWxlbmFtZSwgZW5jb2Rpbmc9Tm9uZSwgZGVidWc9RmFsc2UpOgorICAgICAgICAiIiJQYXJzZSBhIGZpbGUgYW5kIHJldHVybiB0aGUgc3ludGF4IHRyZWUuIiIiCisgICAgICAgIHN0cmVhbSA9IGNvZGVjcy5vcGVuKGZpbGVuYW1lLCAiciIsIGVuY29kaW5nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9zdHJlYW0oc3RyZWFtLCBkZWJ1ZykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCisKKyAgICBkZWYgcGFyc2Vfc3RyaW5nKHNlbGYsIHRleHQsIGRlYnVnPUZhbHNlKToKKyAgICAgICAgIiIiUGFyc2UgYSBzdHJpbmcgYW5kIHJldHVybiB0aGUgc3ludGF4IHRyZWUuIiIiCisgICAgICAgIHRva2VucyA9IHRva2VuaXplLmdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTy5TdHJpbmdJTyh0ZXh0KS5yZWFkbGluZSkKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfdG9rZW5zKHRva2VucywgZGVidWcpCisKKworZGVmIGxvYWRfZ3JhbW1hcihndD0iR3JhbW1hci50eHQiLCBncD1Ob25lLAorICAgICAgICAgICAgICAgICBzYXZlPVRydWUsIGZvcmNlPUZhbHNlLCBsb2dnZXI9Tm9uZSk6CisgICAgIiIiTG9hZCB0aGUgZ3JhbW1hciAobWF5YmUgZnJvbSBhIHBpY2tsZSkuIiIiCisgICAgaWYgbG9nZ2VyIGlzIE5vbmU6CisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKKyAgICBpZiBncCBpcyBOb25lOgorICAgICAgICBoZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdGV4dChndCkKKyAgICAgICAgaWYgdGFpbCA9PSAiLnR4dCI6CisgICAgICAgICAgICB0YWlsID0gIiIKKyAgICAgICAgZ3AgPSBoZWFkICsgdGFpbCArICIuIi5qb2luKG1hcChzdHIsIHN5cy52ZXJzaW9uX2luZm8pKSArICIucGlja2xlIgorICAgIGlmIGZvcmNlIG9yIG5vdCBfbmV3ZXIoZ3AsIGd0KToKKyAgICAgICAgbG9nZ2VyLmluZm8oIkdlbmVyYXRpbmcgZ3JhbW1hciB0YWJsZXMgZnJvbSAlcyIsIGd0KQorICAgICAgICBnID0gcGdlbi5nZW5lcmF0ZV9ncmFtbWFyKGd0KQorICAgICAgICBpZiBzYXZlOgorICAgICAgICAgICAgbG9nZ2VyLmluZm8oIldyaXRpbmcgZ3JhbW1hciB0YWJsZXMgdG8gJXMiLCBncCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBnLmR1bXAoZ3ApCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiV3JpdGluZyBmYWlsZWQ6IitzdHIoZSkpCisgICAgZWxzZToKKyAgICAgICAgZyA9IGdyYW1tYXIuR3JhbW1hcigpCisgICAgICAgIGcubG9hZChncCkKKyAgICByZXR1cm4gZworCisKK2RlZiBfbmV3ZXIoYSwgYik6CisgICAgIiIiSW5xdWlyZSB3aGV0aGVyIGZpbGUgYSB3YXMgd3JpdHRlbiBzaW5jZSBmaWxlIGIuIiIiCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGEpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYik6CisgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIG9zLnBhdGguZ2V0bXRpbWUoYSkgPj0gb3MucGF0aC5nZXRtdGltZShiKQorCisKK2RlZiBtYWluKCphcmdzKToKKyAgICAiIiJNYWluIHByb2dyYW0sIHdoZW4gcnVuIGFzIGEgc2NyaXB0OiBwcm9kdWNlIGdyYW1tYXIgcGlja2xlIGZpbGVzLgorCisgICAgQ2FsbHMgbG9hZF9ncmFtbWFyIGZvciBlYWNoIGFyZ3VtZW50LCBhIHBhdGggdG8gYSBncmFtbWFyIHRleHQgZmlsZS4KKyAgICAiIiIKKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgYXJncyA9IHN5cy5hcmd2WzE6XQorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcobGV2ZWw9bG9nZ2luZy5JTkZPLCBzdHJlYW09c3lzLnN0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdD0nJShtZXNzYWdlKXMnKQorICAgIGZvciBndCBpbiBhcmdzOgorICAgICAgICBsb2FkX2dyYW1tYXIoZ3QsIHNhdmU9VHJ1ZSwgZm9yY2U9VHJ1ZSkKKyAgICByZXR1cm4gVHJ1ZQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KGludChub3QgbWFpbigpKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2RyaXZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiMjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2RyaXZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1ZGE5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9kcml2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2dyYW1tYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhNWM0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5CkBAIC0wLDAgKzEsMTg0IEBACisjIENvcHlyaWdodCAyMDA0LTIwMDUgRWxlbWVudGFsIFNlY3VyaXR5LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiVGhpcyBtb2R1bGUgZGVmaW5lcyB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgdG8gcmVwcmVzZW50IGEgZ3JhbW1hci4KKworVGhlc2UgYXJlIGEgYml0IGFyY2FuZSBiZWNhdXNlIHRoZXkgYXJlIGRlcml2ZWQgZnJvbSB0aGUgZGF0YQorc3RydWN0dXJlcyB1c2VkIGJ5IFB5dGhvbidzICdwZ2VuJyBwYXJzZXIgZ2VuZXJhdG9yLgorCitUaGVyZSdzIGFsc28gYSB0YWJsZSBoZXJlIG1hcHBpbmcgb3BlcmF0b3JzIHRvIHRoZWlyIG5hbWVzIGluIHRoZQordG9rZW4gbW9kdWxlOyB0aGUgUHl0aG9uIHRva2VuaXplIG1vZHVsZSByZXBvcnRzIGFsbCBvcGVyYXRvcnMgYXMgdGhlCitmYWxsYmFjayB0b2tlbiBjb2RlIE9QLCBidXQgdGhlIHBhcnNlciBuZWVkcyB0aGUgYWN0dWFsIHRva2VuIGNvZGUuCisKKyIiIgorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgcGlja2xlCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAuIGltcG9ydCB0b2tlbiwgdG9rZW5pemUKKworCitjbGFzcyBHcmFtbWFyKG9iamVjdCk6CisgICAgIiIiUGdlbiBwYXJzaW5nIHRhYmxlcyBjb252ZXJzaW9uIGNsYXNzLgorCisgICAgT25jZSBpbml0aWFsaXplZCwgdGhpcyBjbGFzcyBzdXBwbGllcyB0aGUgZ3JhbW1hciB0YWJsZXMgZm9yIHRoZQorICAgIHBhcnNpbmcgZW5naW5lIGltcGxlbWVudGVkIGJ5IHBhcnNlLnB5LiAgVGhlIHBhcnNpbmcgZW5naW5lCisgICAgYWNjZXNzZXMgdGhlIGluc3RhbmNlIHZhcmlhYmxlcyBkaXJlY3RseS4gIFRoZSBjbGFzcyBoZXJlIGRvZXMgbm90CisgICAgcHJvdmlkZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGFibGVzOyBzZXZlcmFsIHN1YmNsYXNzZXMgZXhpc3QgdG8KKyAgICBkbyB0aGlzIChzZWUgdGhlIGNvbnYgYW5kIHBnZW4gbW9kdWxlcykuCisKKyAgICBUaGUgbG9hZCgpIG1ldGhvZCByZWFkcyB0aGUgdGFibGVzIGZyb20gYSBwaWNrbGUgZmlsZSwgd2hpY2ggaXMKKyAgICBtdWNoIGZhc3RlciB0aGFuIHRoZSBvdGhlciB3YXlzIG9mZmVyZWQgYnkgc3ViY2xhc3Nlcy4gIFRoZSBwaWNrbGUKKyAgICBmaWxlIGlzIHdyaXR0ZW4gYnkgY2FsbGluZyBkdW1wKCkgKGFmdGVyIGxvYWRpbmcgdGhlIGdyYW1tYXIKKyAgICB0YWJsZXMgdXNpbmcgYSBzdWJjbGFzcykuICBUaGUgcmVwb3J0KCkgbWV0aG9kIHByaW50cyBhIHJlYWRhYmxlCisgICAgcmVwcmVzZW50YXRpb24gb2YgdGhlIHRhYmxlcyB0byBzdGRvdXQsIGZvciBkZWJ1Z2dpbmcuCisKKyAgICBUaGUgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhcyBmb2xsb3dzOgorCisgICAgc3ltYm9sMm51bWJlciAtLSBhIGRpY3QgbWFwcGluZyBzeW1ib2wgbmFtZXMgdG8gbnVtYmVycy4gIFN5bWJvbAorICAgICAgICAgICAgICAgICAgICAgbnVtYmVycyBhcmUgYWx3YXlzIDI1NiBvciBoaWdoZXIsIHRvIGRpc3Rpbmd1aXNoCisgICAgICAgICAgICAgICAgICAgICB0aGVtIGZyb20gdG9rZW4gbnVtYmVycywgd2hpY2ggYXJlIGJldHdlZW4gMCBhbmQKKyAgICAgICAgICAgICAgICAgICAgIDI1NSAoaW5jbHVzaXZlKS4KKworICAgIG51bWJlcjJzeW1ib2wgLS0gYSBkaWN0IG1hcHBpbmcgbnVtYmVycyB0byBzeW1ib2wgbmFtZXM7CisgICAgICAgICAgICAgICAgICAgICB0aGVzZSB0d28gYXJlIGVhY2ggb3RoZXIncyBpbnZlcnNlLgorCisgICAgc3RhdGVzICAgICAgICAtLSBhIGxpc3Qgb2YgREZBcywgd2hlcmUgZWFjaCBERkEgaXMgYSBsaXN0IG9mCisgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMsIGVhY2ggc3RhdGUgaXMgYSBsaXN0IG9mIGFyY3MsIGFuZCBlYWNoCisgICAgICAgICAgICAgICAgICAgICBhcmMgaXMgYSAoaSwgaikgcGFpciB3aGVyZSBpIGlzIGEgbGFiZWwgYW5kIGogaXMKKyAgICAgICAgICAgICAgICAgICAgIGEgc3RhdGUgbnVtYmVyLiAgVGhlIERGQSBudW1iZXIgaXMgdGhlIGluZGV4IGludG8KKyAgICAgICAgICAgICAgICAgICAgIHRoaXMgbGlzdC4gIChUaGlzIG5hbWUgaXMgc2xpZ2h0bHkgY29uZnVzaW5nLikKKyAgICAgICAgICAgICAgICAgICAgIEZpbmFsIHN0YXRlcyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBzcGVjaWFsIGFyYyBvZgorICAgICAgICAgICAgICAgICAgICAgdGhlIGZvcm0gKDAsIGopIHdoZXJlIGogaXMgaXRzIG93biBzdGF0ZSBudW1iZXIuCisKKyAgICBkZmFzICAgICAgICAgIC0tIGEgZGljdCBtYXBwaW5nIHN5bWJvbCBudW1iZXJzIHRvIChERkEsIGZpcnN0KQorICAgICAgICAgICAgICAgICAgICAgcGFpcnMsIHdoZXJlIERGQSBpcyBhbiBpdGVtIGZyb20gdGhlIHN0YXRlcyBsaXN0CisgICAgICAgICAgICAgICAgICAgICBhYm92ZSwgYW5kIGZpcnN0IGlzIGEgc2V0IG9mIHRva2VucyB0aGF0IGNhbgorICAgICAgICAgICAgICAgICAgICAgYmVnaW4gdGhpcyBncmFtbWFyIHJ1bGUgKHJlcHJlc2VudGVkIGJ5IGEgZGljdAorICAgICAgICAgICAgICAgICAgICAgd2hvc2UgdmFsdWVzIGFyZSBhbHdheXMgMSkuCisKKyAgICBsYWJlbHMgICAgICAgIC0tIGEgbGlzdCBvZiAoeCwgeSkgcGFpcnMgd2hlcmUgeCBpcyBlaXRoZXIgYSB0b2tlbgorICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9yIGEgc3ltYm9sIG51bWJlciwgYW5kIHkgaXMgZWl0aGVyIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgIG9yIGEgc3RyaW5nOyB0aGUgc3RyaW5ncyBhcmUga2V5d29yZHMuICBUaGUgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgIG51bWJlciBpcyB0aGUgaW5kZXggaW4gdGhpcyBsaXN0OyBsYWJlbCBudW1iZXJzCisgICAgICAgICAgICAgICAgICAgICBhcmUgdXNlZCB0byBtYXJrIHN0YXRlIHRyYW5zaXRpb25zIChhcmNzKSBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgIERGQXMuCisKKyAgICBzdGFydCAgICAgICAgIC0tIHRoZSBudW1iZXIgb2YgdGhlIGdyYW1tYXIncyBzdGFydCBzeW1ib2wuCisKKyAgICBrZXl3b3JkcyAgICAgIC0tIGEgZGljdCBtYXBwaW5nIGtleXdvcmQgc3RyaW5ncyB0byBhcmMgbGFiZWxzLgorCisgICAgdG9rZW5zICAgICAgICAtLSBhIGRpY3QgbWFwcGluZyB0b2tlbiBudW1iZXJzIHRvIGFyYyBsYWJlbHMuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zeW1ib2wybnVtYmVyID0ge30KKyAgICAgICAgc2VsZi5udW1iZXIyc3ltYm9sID0ge30KKyAgICAgICAgc2VsZi5zdGF0ZXMgPSBbXQorICAgICAgICBzZWxmLmRmYXMgPSB7fQorICAgICAgICBzZWxmLmxhYmVscyA9IFsoMCwgIkVNUFRZIildCisgICAgICAgIHNlbGYua2V5d29yZHMgPSB7fQorICAgICAgICBzZWxmLnRva2VucyA9IHt9CisgICAgICAgIHNlbGYuc3ltYm9sMmxhYmVsID0ge30KKyAgICAgICAgc2VsZi5zdGFydCA9IDI1NgorCisgICAgZGVmIGR1bXAoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJEdW1wIHRoZSBncmFtbWFyIHRhYmxlcyB0byBhIHBpY2tsZSBmaWxlLiIiIgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgIndiIikKKyAgICAgICAgcGlja2xlLmR1bXAoc2VsZi5fX2RpY3RfXywgZiwgMikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgbG9hZChzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIkxvYWQgdGhlIGdyYW1tYXIgdGFibGVzIGZyb20gYSBwaWNrbGUgZmlsZS4iIiIKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJyYiIpCisgICAgICAgIGQgPSBwaWNrbGUubG9hZChmKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoZCkKKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29weSB0aGUgZ3JhbW1hci4KKyAgICAgICAgIiIiCisgICAgICAgIG5ldyA9IHNlbGYuX19jbGFzc19fKCkKKyAgICAgICAgZm9yIGRpY3RfYXR0ciBpbiAoInN5bWJvbDJudW1iZXIiLCAibnVtYmVyMnN5bWJvbCIsICJkZmFzIiwgImtleXdvcmRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VucyIsICJzeW1ib2wybGFiZWwiKToKKyAgICAgICAgICAgIHNldGF0dHIobmV3LCBkaWN0X2F0dHIsIGdldGF0dHIoc2VsZiwgZGljdF9hdHRyKS5jb3B5KCkpCisgICAgICAgIG5ldy5sYWJlbHMgPSBzZWxmLmxhYmVsc1s6XQorICAgICAgICBuZXcuc3RhdGVzID0gc2VsZi5zdGF0ZXNbOl0KKyAgICAgICAgbmV3LnN0YXJ0ID0gc2VsZi5zdGFydAorICAgICAgICByZXR1cm4gbmV3CisKKyAgICBkZWYgcmVwb3J0KHNlbGYpOgorICAgICAgICAiIiJEdW1wIHRoZSBncmFtbWFyIHRhYmxlcyB0byBzdGFuZGFyZCBvdXRwdXQsIGZvciBkZWJ1Z2dpbmcuIiIiCisgICAgICAgIGZyb20gcHByaW50IGltcG9ydCBwcHJpbnQKKyAgICAgICAgcHJpbnQgInMybiIKKyAgICAgICAgcHByaW50KHNlbGYuc3ltYm9sMm51bWJlcikKKyAgICAgICAgcHJpbnQgIm4ycyIKKyAgICAgICAgcHByaW50KHNlbGYubnVtYmVyMnN5bWJvbCkKKyAgICAgICAgcHJpbnQgInN0YXRlcyIKKyAgICAgICAgcHByaW50KHNlbGYuc3RhdGVzKQorICAgICAgICBwcmludCAiZGZhcyIKKyAgICAgICAgcHByaW50KHNlbGYuZGZhcykKKyAgICAgICAgcHJpbnQgImxhYmVscyIKKyAgICAgICAgcHByaW50KHNlbGYubGFiZWxzKQorICAgICAgICBwcmludCAic3RhcnQiLCBzZWxmLnN0YXJ0CisKKworIyBNYXAgZnJvbSBvcGVyYXRvciB0byBudW1iZXIgKHNpbmNlIHRva2VuaXplIGRvZXNuJ3QgZG8gdGhpcykKKworb3BtYXBfcmF3ID0gIiIiCisoIExQQVIKKykgUlBBUgorWyBMU1FCCitdIFJTUUIKKzogQ09MT04KKywgQ09NTUEKKzsgU0VNSQorKyBQTFVTCistIE1JTlVTCisqIFNUQVIKKy8gU0xBU0gKK3wgVkJBUgorJiBBTVBFUgorPCBMRVNTCis+IEdSRUFURVIKKz0gRVFVQUwKKy4gRE9UCislIFBFUkNFTlQKK2AgQkFDS1FVT1RFCit7IExCUkFDRQorfSBSQlJBQ0UKK0AgQVQKKz09IEVRRVFVQUwKKyE9IE5PVEVRVUFMCis8PiBOT1RFUVVBTAorPD0gTEVTU0VRVUFMCis+PSBHUkVBVEVSRVFVQUwKK34gVElMREUKK14gQ0lSQ1VNRkxFWAorPDwgTEVGVFNISUZUCis+PiBSSUdIVFNISUZUCisqKiBET1VCTEVTVEFSCisrPSBQTFVTRVFVQUwKKy09IE1JTkVRVUFMCisqPSBTVEFSRVFVQUwKKy89IFNMQVNIRVFVQUwKKyU9IFBFUkNFTlRFUVVBTAorJj0gQU1QRVJFUVVBTAorfD0gVkJBUkVRVUFMCitePSBDSVJDVU1GTEVYRVFVQUwKKzw8PSBMRUZUU0hJRlRFUVVBTAorPj49IFJJR0hUU0hJRlRFUVVBTAorKio9IERPVUJMRVNUQVJFUVVBTAorLy8gRE9VQkxFU0xBU0gKKy8vPSBET1VCTEVTTEFTSEVRVUFMCistPiBSQVJST1cKKyIiIgorCitvcG1hcCA9IHt9Citmb3IgbGluZSBpbiBvcG1hcF9yYXcuc3BsaXRsaW5lcygpOgorICAgIGlmIGxpbmU6CisgICAgICAgIG9wLCBuYW1lID0gbGluZS5zcGxpdCgpCisgICAgICAgIG9wbWFwW29wXSA9IGdldGF0dHIodG9rZW4sIG5hbWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkN2E4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvZ3JhbW1hci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkN2E4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9ncmFtbWFyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvbGl0ZXJhbHMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvbGl0ZXJhbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzOTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9saXRlcmFscy5weQpAQCAtMCwwICsxLDYwIEBACisjIENvcHlyaWdodCAyMDA0LTIwMDUgRWxlbWVudGFsIFNlY3VyaXR5LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiU2FmZWx5IGV2YWx1YXRlIFB5dGhvbiBzdHJpbmcgbGl0ZXJhbHMgd2l0aG91dCB1c2luZyBldmFsKCkuIiIiCisKK2ltcG9ydCByZQorCitzaW1wbGVfZXNjYXBlcyA9IHsiYSI6ICJcYSIsCisgICAgICAgICAgICAgICAgICAiYiI6ICJcYiIsCisgICAgICAgICAgICAgICAgICAiZiI6ICJcZiIsCisgICAgICAgICAgICAgICAgICAibiI6ICJcbiIsCisgICAgICAgICAgICAgICAgICAiciI6ICJcciIsCisgICAgICAgICAgICAgICAgICAidCI6ICJcdCIsCisgICAgICAgICAgICAgICAgICAidiI6ICJcdiIsCisgICAgICAgICAgICAgICAgICAiJyI6ICInIiwKKyAgICAgICAgICAgICAgICAgICciJzogJyInLAorICAgICAgICAgICAgICAgICAgIlxcIjogIlxcIn0KKworZGVmIGVzY2FwZShtKToKKyAgICBhbGwsIHRhaWwgPSBtLmdyb3VwKDAsIDEpCisgICAgYXNzZXJ0IGFsbC5zdGFydHN3aXRoKCJcXCIpCisgICAgZXNjID0gc2ltcGxlX2VzY2FwZXMuZ2V0KHRhaWwpCisgICAgaWYgZXNjIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gZXNjCisgICAgaWYgdGFpbC5zdGFydHN3aXRoKCJ4Iik6CisgICAgICAgIGhleGVzID0gdGFpbFsxOl0KKyAgICAgICAgaWYgbGVuKGhleGVzKSA8IDI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJpbnZhbGlkIGhleCBzdHJpbmcgZXNjYXBlICgnXFwlcycpIiAlIHRhaWwpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGkgPSBpbnQoaGV4ZXMsIDE2KQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImludmFsaWQgaGV4IHN0cmluZyBlc2NhcGUgKCdcXCVzJykiICUgdGFpbCkKKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpID0gaW50KHRhaWwsIDgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBvY3RhbCBzdHJpbmcgZXNjYXBlICgnXFwlcycpIiAlIHRhaWwpCisgICAgcmV0dXJuIGNocihpKQorCitkZWYgZXZhbFN0cmluZyhzKToKKyAgICBhc3NlcnQgcy5zdGFydHN3aXRoKCInIikgb3Igcy5zdGFydHN3aXRoKCciJyksIHJlcHIoc1s6MV0pCisgICAgcSA9IHNbMF0KKyAgICBpZiBzWzozXSA9PSBxKjM6CisgICAgICAgIHEgPSBxKjMKKyAgICBhc3NlcnQgcy5lbmRzd2l0aChxKSwgcmVwcihzWy1sZW4ocSk6XSkKKyAgICBhc3NlcnQgbGVuKHMpID49IDIqbGVuKHEpCisgICAgcyA9IHNbbGVuKHEpOi1sZW4ocSldCisgICAgcmV0dXJuIHJlLnN1YihyIlxcKFwnfFwifFxcfFthYmZucnR2XXx4LnswLDJ9fFswLTddezEsM30pIiwgZXNjYXBlLCBzKQorCitkZWYgdGVzdCgpOgorICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgIGMgPSBjaHIoaSkKKyAgICAgICAgcyA9IHJlcHIoYykKKyAgICAgICAgZSA9IGV2YWxTdHJpbmcocykKKyAgICAgICAgaWYgZSAhPSBjOgorICAgICAgICAgICAgcHJpbnQgaSwgYywgcywgZQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvbGl0ZXJhbHMucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDlmNWVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvbGl0ZXJhbHMucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDQ4ZjZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL2xpdGVyYWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlYmRiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wYXJzZS5weQpAQCAtMCwwICsxLDIwMSBAQAorIyBDb3B5cmlnaHQgMjAwNC0yMDA1IEVsZW1lbnRhbCBTZWN1cml0eSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIlBhcnNlciBlbmdpbmUgZm9yIHRoZSBncmFtbWFyIHRhYmxlcyBnZW5lcmF0ZWQgYnkgcGdlbi4KKworVGhlIGdyYW1tYXIgdGFibGUgbXVzdCBiZSBsb2FkZWQgZmlyc3QuCisKK1NlZSBQYXJzZXIvcGFyc2VyLmMgaW4gdGhlIFB5dGhvbiBkaXN0cmlidXRpb24gZm9yIGFkZGl0aW9uYWwgaW5mbyBvbgoraG93IHRoaXMgcGFyc2luZyBlbmdpbmUgd29ya3MuCisKKyIiIgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgdG9rZW4KKworY2xhc3MgUGFyc2VFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiB0byBzaWduYWwgdGhlIHBhcnNlciBpcyBzdHVjay4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIHR5cGUsIHZhbHVlLCBjb250ZXh0KToKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsICIlczogdHlwZT0lciwgdmFsdWU9JXIsIGNvbnRleHQ9JXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChtc2csIHR5cGUsIHZhbHVlLCBjb250ZXh0KSkKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5jb250ZXh0ID0gY29udGV4dAorCitjbGFzcyBQYXJzZXIob2JqZWN0KToKKyAgICAiIiJQYXJzZXIgZW5naW5lLgorCisgICAgVGhlIHByb3BlciB1c2FnZSBzZXF1ZW5jZSBpczoKKworICAgIHAgPSBQYXJzZXIoZ3JhbW1hciwgW2NvbnZlcnRlcl0pICAjIGNyZWF0ZSBpbnN0YW5jZQorICAgIHAuc2V0dXAoW3N0YXJ0XSkgICAgICAgICAgICAgICAgICAjIHByZXBhcmUgZm9yIHBhcnNpbmcKKyAgICA8Zm9yIGVhY2ggaW5wdXQgdG9rZW4+OgorICAgICAgICBpZiBwLmFkZHRva2VuKC4uLik6ICAgICAgICAgICAjIHBhcnNlIGEgdG9rZW47IG1heSByYWlzZSBQYXJzZUVycm9yCisgICAgICAgICAgICBicmVhaworICAgIHJvb3QgPSBwLnJvb3Rub2RlICAgICAgICAgICAgICAgICAjIHJvb3Qgb2YgYWJzdHJhY3Qgc3ludGF4IHRyZWUKKworICAgIEEgUGFyc2VyIGluc3RhbmNlIG1heSBiZSByZXVzZWQgYnkgY2FsbGluZyBzZXR1cCgpIHJlcGVhdGVkbHkuCisKKyAgICBBIFBhcnNlciBpbnN0YW5jZSBjb250YWlucyBzdGF0ZSBwZXJ0YWluaW5nIHRvIHRoZSBjdXJyZW50IHRva2VuCisgICAgc2VxdWVuY2UsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgY29uY3VycmVudGx5IGJ5IGRpZmZlcmVudCB0aHJlYWRzCisgICAgdG8gcGFyc2Ugc2VwYXJhdGUgdG9rZW4gc2VxdWVuY2VzLgorCisgICAgU2VlIGRyaXZlci5weSBmb3IgaG93IHRvIGdldCBpbnB1dCB0b2tlbnMgYnkgdG9rZW5pemluZyBhIGZpbGUgb3IKKyAgICBzdHJpbmcuCisKKyAgICBQYXJzaW5nIGlzIGNvbXBsZXRlIHdoZW4gYWRkdG9rZW4oKSByZXR1cm5zIFRydWU7IHRoZSByb290IG9mIHRoZQorICAgIGFic3RyYWN0IHN5bnRheCB0cmVlIGNhbiB0aGVuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByb290bm9kZQorICAgIGluc3RhbmNlIHZhcmlhYmxlLiAgV2hlbiBhIHN5bnRheCBlcnJvciBvY2N1cnMsIGFkZHRva2VuKCkgcmFpc2VzCisgICAgdGhlIFBhcnNlRXJyb3IgZXhjZXB0aW9uLiAgVGhlcmUgaXMgbm8gZXJyb3IgcmVjb3Zlcnk7IHRoZSBwYXJzZXIKKyAgICBjYW5ub3QgYmUgdXNlZCBhZnRlciBhIHN5bnRheCBlcnJvciB3YXMgcmVwb3J0ZWQgKGJ1dCBpdCBjYW4gYmUKKyAgICByZWluaXRpYWxpemVkIGJ5IGNhbGxpbmcgc2V0dXAoKSkuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmFtbWFyLCBjb252ZXJ0PU5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4KKworICAgICAgICBUaGUgZ3JhbW1hciBhcmd1bWVudCBpcyBhIGdyYW1tYXIuR3JhbW1hciBpbnN0YW5jZTsgc2VlIHRoZQorICAgICAgICBncmFtbWFyIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworICAgICAgICBUaGUgcGFyc2VyIGlzIG5vdCByZWFkeSB5ZXQgZm9yIHBhcnNpbmc7IHlvdSBtdXN0IGNhbGwgdGhlCisgICAgICAgIHNldHVwKCkgbWV0aG9kIHRvIGdldCBpdCBzdGFydGVkLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBjb252ZXJ0IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gbWFwcGluZyBjb25jcmV0ZQorICAgICAgICBzeW50YXggdHJlZSBub2RlcyB0byBhYnN0cmFjdCBzeW50YXggdHJlZSBub2Rlcy4gIElmIG5vdAorICAgICAgICBnaXZlbiwgbm8gY29udmVyc2lvbiBpcyBkb25lIGFuZCB0aGUgc3ludGF4IHRyZWUgcHJvZHVjZWQgaXMKKyAgICAgICAgdGhlIGNvbmNyZXRlIHN5bnRheCB0cmVlLiAgSWYgZ2l2ZW4sIGl0IG11c3QgYmUgYSBmdW5jdGlvbiBvZgorICAgICAgICB0d28gYXJndW1lbnRzLCB0aGUgZmlyc3QgYmVpbmcgdGhlIGdyYW1tYXIgKGEgZ3JhbW1hci5HcmFtbWFyCisgICAgICAgIGluc3RhbmNlKSwgYW5kIHRoZSBzZWNvbmQgYmVpbmcgdGhlIGNvbmNyZXRlIHN5bnRheCB0cmVlIG5vZGUKKyAgICAgICAgdG8gYmUgY29udmVydGVkLiAgVGhlIHN5bnRheCB0cmVlIGlzIGNvbnZlcnRlZCBmcm9tIHRoZSBib3R0b20KKyAgICAgICAgdXAuCisKKyAgICAgICAgQSBjb25jcmV0ZSBzeW50YXggdHJlZSBub2RlIGlzIGEgKHR5cGUsIHZhbHVlLCBjb250ZXh0LCBub2RlcykKKyAgICAgICAgdHVwbGUsIHdoZXJlIHR5cGUgaXMgdGhlIG5vZGUgdHlwZSAoYSB0b2tlbiBvciBzeW1ib2wgbnVtYmVyKSwKKyAgICAgICAgdmFsdWUgaXMgTm9uZSBmb3Igc3ltYm9scyBhbmQgYSBzdHJpbmcgZm9yIHRva2VucywgY29udGV4dCBpcworICAgICAgICBOb25lIG9yIGFuIG9wYXF1ZSB2YWx1ZSB1c2VkIGZvciBlcnJvciByZXBvcnRpbmcgKHR5cGljYWxseSBhCisgICAgICAgIChsaW5lbm8sIG9mZnNldCkgcGFpciksIGFuZCBub2RlcyBpcyBhIGxpc3Qgb2YgY2hpbGRyZW4gZm9yCisgICAgICAgIHN5bWJvbHMsIGFuZCBOb25lIGZvciB0b2tlbnMuCisKKyAgICAgICAgQW4gYWJzdHJhY3Qgc3ludGF4IHRyZWUgbm9kZSBtYXkgYmUgYW55dGhpbmc7IHRoaXMgaXMgZW50aXJlbHkKKyAgICAgICAgdXAgdG8gdGhlIGNvbnZlcnRlciBmdW5jdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ncmFtbWFyID0gZ3JhbW1hcgorICAgICAgICBzZWxmLmNvbnZlcnQgPSBjb252ZXJ0IG9yIChsYW1iZGEgZ3JhbW1hciwgbm9kZTogbm9kZSkKKworICAgIGRlZiBzZXR1cChzZWxmLCBzdGFydD1Ob25lKToKKyAgICAgICAgIiIiUHJlcGFyZSBmb3IgcGFyc2luZy4KKworICAgICAgICBUaGlzICptdXN0KiBiZSBjYWxsZWQgYmVmb3JlIHN0YXJ0aW5nIHRvIHBhcnNlLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBhcmd1bWVudCBpcyBhbiBhbHRlcm5hdGl2ZSBzdGFydCBzeW1ib2w7IGl0CisgICAgICAgIGRlZmF1bHRzIHRvIHRoZSBncmFtbWFyJ3Mgc3RhcnQgc3ltYm9sLgorCisgICAgICAgIFlvdSBjYW4gdXNlIGEgUGFyc2VyIGluc3RhbmNlIHRvIHBhcnNlIGFueSBudW1iZXIgb2YgcHJvZ3JhbXM7CisgICAgICAgIGVhY2ggdGltZSB5b3UgY2FsbCBzZXR1cCgpIHRoZSBwYXJzZXIgaXMgcmVzZXQgdG8gYW4gaW5pdGlhbAorICAgICAgICBzdGF0ZSBkZXRlcm1pbmVkIGJ5IHRoZSAoaW1wbGljaXQgb3IgZXhwbGljaXQpIHN0YXJ0IHN5bWJvbC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc3RhcnQgaXMgTm9uZToKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5ncmFtbWFyLnN0YXJ0CisgICAgICAgICMgRWFjaCBzdGFjayBlbnRyeSBpcyBhIHR1cGxlOiAoZGZhLCBzdGF0ZSwgbm9kZSkuCisgICAgICAgICMgQSBub2RlIGlzIGEgdHVwbGU6ICh0eXBlLCB2YWx1ZSwgY29udGV4dCwgY2hpbGRyZW4pLAorICAgICAgICAjIHdoZXJlIGNoaWxkcmVuIGlzIGEgbGlzdCBvZiBub2RlcyBvciBOb25lLCBhbmQgY29udGV4dCBtYXkgYmUgTm9uZS4KKyAgICAgICAgbmV3bm9kZSA9IChzdGFydCwgTm9uZSwgTm9uZSwgW10pCisgICAgICAgIHN0YWNrZW50cnkgPSAoc2VsZi5ncmFtbWFyLmRmYXNbc3RhcnRdLCAwLCBuZXdub2RlKQorICAgICAgICBzZWxmLnN0YWNrID0gW3N0YWNrZW50cnldCisgICAgICAgIHNlbGYucm9vdG5vZGUgPSBOb25lCisgICAgICAgIHNlbGYudXNlZF9uYW1lcyA9IHNldCgpICMgQWxpYXNlZCB0byBzZWxmLnJvb3Rub2RlLnVzZWRfbmFtZXMgaW4gcG9wKCkKKworICAgIGRlZiBhZGR0b2tlbihzZWxmLCB0eXBlLCB2YWx1ZSwgY29udGV4dCk6CisgICAgICAgICIiIkFkZCBhIHRva2VuOyByZXR1cm4gVHJ1ZSBpZmYgdGhpcyBpcyB0aGUgZW5kIG9mIHRoZSBwcm9ncmFtLiIiIgorICAgICAgICAjIE1hcCBmcm9tIHRva2VuIHRvIGxhYmVsCisgICAgICAgIGlsYWJlbCA9IHNlbGYuY2xhc3NpZnkodHlwZSwgdmFsdWUsIGNvbnRleHQpCisgICAgICAgICMgTG9vcCB1bnRpbCB0aGUgdG9rZW4gaXMgc2hpZnRlZDsgbWF5IHJhaXNlIGV4Y2VwdGlvbnMKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGRmYSwgc3RhdGUsIG5vZGUgPSBzZWxmLnN0YWNrWy0xXQorICAgICAgICAgICAgc3RhdGVzLCBmaXJzdCA9IGRmYQorICAgICAgICAgICAgYXJjcyA9IHN0YXRlc1tzdGF0ZV0KKyAgICAgICAgICAgICMgTG9vayBmb3IgYSBzdGF0ZSB3aXRoIHRoaXMgbGFiZWwKKyAgICAgICAgICAgIGZvciBpLCBuZXdzdGF0ZSBpbiBhcmNzOgorICAgICAgICAgICAgICAgIHQsIHYgPSBzZWxmLmdyYW1tYXIubGFiZWxzW2ldCisgICAgICAgICAgICAgICAgaWYgaWxhYmVsID09IGk6CisgICAgICAgICAgICAgICAgICAgICMgTG9vayBpdCB1cCBpbiB0aGUgbGlzdCBvZiBsYWJlbHMKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHQgPCAyNTYKKyAgICAgICAgICAgICAgICAgICAgIyBTaGlmdCBhIHRva2VuOyB3ZSdyZSBkb25lIHdpdGggaXQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGlmdCh0eXBlLCB2YWx1ZSwgbmV3c3RhdGUsIGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICMgUG9wIHdoaWxlIHdlIGFyZSBpbiBhbiBhY2NlcHQtb25seSBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IG5ld3N0YXRlCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHN0YXRlc1tzdGF0ZV0gPT0gWygwLCBzdGF0ZSldOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3AoKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEb25lIHBhcnNpbmchCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRmYSwgc3RhdGUsIG5vZGUgPSBzZWxmLnN0YWNrWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzLCBmaXJzdCA9IGRmYQorICAgICAgICAgICAgICAgICAgICAjIERvbmUgd2l0aCB0aGlzIHRva2VuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgICAgIGVsaWYgdCA+PSAyNTY6CisgICAgICAgICAgICAgICAgICAgICMgU2VlIGlmIGl0J3MgYSBzeW1ib2wgYW5kIGlmIHdlJ3JlIGluIGl0cyBmaXJzdCBzZXQKKyAgICAgICAgICAgICAgICAgICAgaXRzZGZhID0gc2VsZi5ncmFtbWFyLmRmYXNbdF0KKyAgICAgICAgICAgICAgICAgICAgaXRzc3RhdGVzLCBpdHNmaXJzdCA9IGl0c2RmYQorICAgICAgICAgICAgICAgICAgICBpZiBpbGFiZWwgaW4gaXRzZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFB1c2ggYSBzeW1ib2wKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaCh0LCBzZWxmLmdyYW1tYXIuZGZhc1t0XSwgbmV3c3RhdGUsIGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAjIFRvIGNvbnRpbnVlIHRoZSBvdXRlciB3aGlsZSBsb29wCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmICgwLCBzdGF0ZSkgaW4gYXJjczoKKyAgICAgICAgICAgICAgICAgICAgIyBBbiBhY2NlcHRpbmcgc3RhdGUsIHBvcCBpdCBhbmQgdHJ5IHNvbWV0aGluZyBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNlbGYucG9wKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAjIERvbmUgcGFyc2luZywgYnV0IGFub3RoZXIgdG9rZW4gaXMgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoInRvbyBtdWNoIGlucHV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgdmFsdWUsIGNvbnRleHQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBObyBzdWNjZXNzIGZpbmRpbmcgYSB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoImJhZCBpbnB1dCIsIHR5cGUsIHZhbHVlLCBjb250ZXh0KQorCisgICAgZGVmIGNsYXNzaWZ5KHNlbGYsIHR5cGUsIHZhbHVlLCBjb250ZXh0KToKKyAgICAgICAgIiIiVHVybiBhIHRva2VuIGludG8gYSBsYWJlbC4gIChJbnRlcm5hbCkiIiIKKyAgICAgICAgaWYgdHlwZSA9PSB0b2tlbi5OQU1FOgorICAgICAgICAgICAgIyBLZWVwIGEgbGlzdGluZyBvZiBhbGwgdXNlZCBuYW1lcworICAgICAgICAgICAgc2VsZi51c2VkX25hbWVzLmFkZCh2YWx1ZSkKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIHJlc2VydmVkIHdvcmRzCisgICAgICAgICAgICBpbGFiZWwgPSBzZWxmLmdyYW1tYXIua2V5d29yZHMuZ2V0KHZhbHVlKQorICAgICAgICAgICAgaWYgaWxhYmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBpbGFiZWwKKyAgICAgICAgaWxhYmVsID0gc2VsZi5ncmFtbWFyLnRva2Vucy5nZXQodHlwZSkKKyAgICAgICAgaWYgaWxhYmVsIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCJiYWQgdG9rZW4iLCB0eXBlLCB2YWx1ZSwgY29udGV4dCkKKyAgICAgICAgcmV0dXJuIGlsYWJlbAorCisgICAgZGVmIHNoaWZ0KHNlbGYsIHR5cGUsIHZhbHVlLCBuZXdzdGF0ZSwgY29udGV4dCk6CisgICAgICAgICIiIlNoaWZ0IGEgdG9rZW4uICAoSW50ZXJuYWwpIiIiCisgICAgICAgIGRmYSwgc3RhdGUsIG5vZGUgPSBzZWxmLnN0YWNrWy0xXQorICAgICAgICBuZXdub2RlID0gKHR5cGUsIHZhbHVlLCBjb250ZXh0LCBOb25lKQorICAgICAgICBuZXdub2RlID0gc2VsZi5jb252ZXJ0KHNlbGYuZ3JhbW1hciwgbmV3bm9kZSkKKyAgICAgICAgaWYgbmV3bm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5vZGVbLTFdLmFwcGVuZChuZXdub2RlKQorICAgICAgICBzZWxmLnN0YWNrWy0xXSA9IChkZmEsIG5ld3N0YXRlLCBub2RlKQorCisgICAgZGVmIHB1c2goc2VsZiwgdHlwZSwgbmV3ZGZhLCBuZXdzdGF0ZSwgY29udGV4dCk6CisgICAgICAgICIiIlB1c2ggYSBub250ZXJtaW5hbC4gIChJbnRlcm5hbCkiIiIKKyAgICAgICAgZGZhLCBzdGF0ZSwgbm9kZSA9IHNlbGYuc3RhY2tbLTFdCisgICAgICAgIG5ld25vZGUgPSAodHlwZSwgTm9uZSwgY29udGV4dCwgW10pCisgICAgICAgIHNlbGYuc3RhY2tbLTFdID0gKGRmYSwgbmV3c3RhdGUsIG5vZGUpCisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKChuZXdkZmEsIDAsIG5ld25vZGUpKQorCisgICAgZGVmIHBvcChzZWxmKToKKyAgICAgICAgIiIiUG9wIGEgbm9udGVybWluYWwuICAoSW50ZXJuYWwpIiIiCisgICAgICAgIHBvcGRmYSwgcG9wc3RhdGUsIHBvcG5vZGUgPSBzZWxmLnN0YWNrLnBvcCgpCisgICAgICAgIG5ld25vZGUgPSBzZWxmLmNvbnZlcnQoc2VsZi5ncmFtbWFyLCBwb3Bub2RlKQorICAgICAgICBpZiBuZXdub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5zdGFjazoKKyAgICAgICAgICAgICAgICBkZmEsIHN0YXRlLCBub2RlID0gc2VsZi5zdGFja1stMV0KKyAgICAgICAgICAgICAgICBub2RlWy0xXS5hcHBlbmQobmV3bm9kZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5yb290bm9kZSA9IG5ld25vZGUKKyAgICAgICAgICAgICAgICBzZWxmLnJvb3Rub2RlLnVzZWRfbmFtZXMgPSBzZWxmLnVzZWRfbmFtZXMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wYXJzZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZTc4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wYXJzZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZGU3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wZ2VuLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3BnZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwODRhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wZ2VuLnB5CkBAIC0wLDAgKzEsMzg2IEBACisjIENvcHlyaWdodCAyMDA0LTIwMDUgRWxlbWVudGFsIFNlY3VyaXR5LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIyBQZ2VuIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgZ3JhbW1hciwgdG9rZW4sIHRva2VuaXplCisKK2NsYXNzIFBnZW5HcmFtbWFyKGdyYW1tYXIuR3JhbW1hcik6CisgICAgcGFzcworCitjbGFzcyBQYXJzZXJHZW5lcmF0b3Iob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgc3RyZWFtPU5vbmUpOgorICAgICAgICBjbG9zZV9zdHJlYW0gPSBOb25lCisgICAgICAgIGlmIHN0cmVhbSBpcyBOb25lOgorICAgICAgICAgICAgc3RyZWFtID0gb3BlbihmaWxlbmFtZSkKKyAgICAgICAgICAgIGNsb3NlX3N0cmVhbSA9IHN0cmVhbS5jbG9zZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKyAgICAgICAgc2VsZi5nZW5lcmF0b3IgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoc3RyZWFtLnJlYWRsaW5lKQorICAgICAgICBzZWxmLmdldHRva2VuKCkgIyBJbml0aWFsaXplIGxvb2thaGVhZAorICAgICAgICBzZWxmLmRmYXMsIHNlbGYuc3RhcnRzeW1ib2wgPSBzZWxmLnBhcnNlKCkKKyAgICAgICAgaWYgY2xvc2Vfc3RyZWFtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY2xvc2Vfc3RyZWFtKCkKKyAgICAgICAgc2VsZi5maXJzdCA9IHt9ICMgbWFwIGZyb20gc3ltYm9sIG5hbWUgdG8gc2V0IG9mIHRva2VucworICAgICAgICBzZWxmLmFkZGZpcnN0c2V0cygpCisKKyAgICBkZWYgbWFrZV9ncmFtbWFyKHNlbGYpOgorICAgICAgICBjID0gUGdlbkdyYW1tYXIoKQorICAgICAgICBuYW1lcyA9IHNlbGYuZGZhcy5rZXlzKCkKKyAgICAgICAgbmFtZXMuc29ydCgpCisgICAgICAgIG5hbWVzLnJlbW92ZShzZWxmLnN0YXJ0c3ltYm9sKQorICAgICAgICBuYW1lcy5pbnNlcnQoMCwgc2VsZi5zdGFydHN5bWJvbCkKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBpID0gMjU2ICsgbGVuKGMuc3ltYm9sMm51bWJlcikKKyAgICAgICAgICAgIGMuc3ltYm9sMm51bWJlcltuYW1lXSA9IGkKKyAgICAgICAgICAgIGMubnVtYmVyMnN5bWJvbFtpXSA9IG5hbWUKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBkZmEgPSBzZWxmLmRmYXNbbmFtZV0KKyAgICAgICAgICAgIHN0YXRlcyA9IFtdCisgICAgICAgICAgICBmb3Igc3RhdGUgaW4gZGZhOgorICAgICAgICAgICAgICAgIGFyY3MgPSBbXQorICAgICAgICAgICAgICAgIGZvciBsYWJlbCwgbmV4dCBpbiBzdGF0ZS5hcmNzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBhcmNzLmFwcGVuZCgoc2VsZi5tYWtlX2xhYmVsKGMsIGxhYmVsKSwgZGZhLmluZGV4KG5leHQpKSkKKyAgICAgICAgICAgICAgICBpZiBzdGF0ZS5pc2ZpbmFsOgorICAgICAgICAgICAgICAgICAgICBhcmNzLmFwcGVuZCgoMCwgZGZhLmluZGV4KHN0YXRlKSkpCisgICAgICAgICAgICAgICAgc3RhdGVzLmFwcGVuZChhcmNzKQorICAgICAgICAgICAgYy5zdGF0ZXMuYXBwZW5kKHN0YXRlcykKKyAgICAgICAgICAgIGMuZGZhc1tjLnN5bWJvbDJudW1iZXJbbmFtZV1dID0gKHN0YXRlcywgc2VsZi5tYWtlX2ZpcnN0KGMsIG5hbWUpKQorICAgICAgICBjLnN0YXJ0ID0gYy5zeW1ib2wybnVtYmVyW3NlbGYuc3RhcnRzeW1ib2xdCisgICAgICAgIHJldHVybiBjCisKKyAgICBkZWYgbWFrZV9maXJzdChzZWxmLCBjLCBuYW1lKToKKyAgICAgICAgcmF3Zmlyc3QgPSBzZWxmLmZpcnN0W25hbWVdCisgICAgICAgIGZpcnN0ID0ge30KKyAgICAgICAgZm9yIGxhYmVsIGluIHJhd2ZpcnN0OgorICAgICAgICAgICAgaWxhYmVsID0gc2VsZi5tYWtlX2xhYmVsKGMsIGxhYmVsKQorICAgICAgICAgICAgIyNhc3NlcnQgaWxhYmVsIG5vdCBpbiBmaXJzdCAjIFhYWCBmYWlsZWQgb24gPD4gLi4uICE9CisgICAgICAgICAgICBmaXJzdFtpbGFiZWxdID0gMQorICAgICAgICByZXR1cm4gZmlyc3QKKworICAgIGRlZiBtYWtlX2xhYmVsKHNlbGYsIGMsIGxhYmVsKToKKyAgICAgICAgIyBYWFggTWF5YmUgdGhpcyBzaG91bGQgYmUgYSBtZXRob2Qgb24gYSBzdWJjbGFzcyBvZiBjb252ZXJ0ZXI/CisgICAgICAgIGlsYWJlbCA9IGxlbihjLmxhYmVscykKKyAgICAgICAgaWYgbGFiZWxbMF0uaXNhbHBoYSgpOgorICAgICAgICAgICAgIyBFaXRoZXIgYSBzeW1ib2wgbmFtZSBvciBhIG5hbWVkIHRva2VuCisgICAgICAgICAgICBpZiBsYWJlbCBpbiBjLnN5bWJvbDJudW1iZXI6CisgICAgICAgICAgICAgICAgIyBBIHN5bWJvbCBuYW1lIChhIG5vbi10ZXJtaW5hbCkKKyAgICAgICAgICAgICAgICBpZiBsYWJlbCBpbiBjLnN5bWJvbDJsYWJlbDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuc3ltYm9sMmxhYmVsW2xhYmVsXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGMubGFiZWxzLmFwcGVuZCgoYy5zeW1ib2wybnVtYmVyW2xhYmVsXSwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgIGMuc3ltYm9sMmxhYmVsW2xhYmVsXSA9IGlsYWJlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWxhYmVsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQSBuYW1lZCB0b2tlbiAoTkFNRSwgTlVNQkVSLCBTVFJJTkcpCisgICAgICAgICAgICAgICAgaXRva2VuID0gZ2V0YXR0cih0b2tlbiwgbGFiZWwsIE5vbmUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoaXRva2VuLCBpbnQpLCBsYWJlbAorICAgICAgICAgICAgICAgIGFzc2VydCBpdG9rZW4gaW4gdG9rZW4udG9rX25hbWUsIGxhYmVsCisgICAgICAgICAgICAgICAgaWYgaXRva2VuIGluIGMudG9rZW5zOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy50b2tlbnNbaXRva2VuXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGMubGFiZWxzLmFwcGVuZCgoaXRva2VuLCBOb25lKSkKKyAgICAgICAgICAgICAgICAgICAgYy50b2tlbnNbaXRva2VuXSA9IGlsYWJlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWxhYmVsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEVpdGhlciBhIGtleXdvcmQgb3IgYW4gb3BlcmF0b3IKKyAgICAgICAgICAgIGFzc2VydCBsYWJlbFswXSBpbiAoJyInLCAiJyIpLCBsYWJlbAorICAgICAgICAgICAgdmFsdWUgPSBldmFsKGxhYmVsKQorICAgICAgICAgICAgaWYgdmFsdWVbMF0uaXNhbHBoYSgpOgorICAgICAgICAgICAgICAgICMgQSBrZXl3b3JkCisgICAgICAgICAgICAgICAgaWYgdmFsdWUgaW4gYy5rZXl3b3JkczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMua2V5d29yZHNbdmFsdWVdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYy5sYWJlbHMuYXBwZW5kKCh0b2tlbi5OQU1FLCB2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIGMua2V5d29yZHNbdmFsdWVdID0gaWxhYmVsCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbGFiZWwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBbiBvcGVyYXRvciAoYW55IG5vbi1udW1lcmljIHRva2VuKQorICAgICAgICAgICAgICAgIGl0b2tlbiA9IGdyYW1tYXIub3BtYXBbdmFsdWVdICMgRmFpbHMgaWYgdW5rbm93biB0b2tlbgorICAgICAgICAgICAgICAgIGlmIGl0b2tlbiBpbiBjLnRva2VuczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMudG9rZW5zW2l0b2tlbl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjLmxhYmVscy5hcHBlbmQoKGl0b2tlbiwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgIGMudG9rZW5zW2l0b2tlbl0gPSBpbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlsYWJlbAorCisgICAgZGVmIGFkZGZpcnN0c2V0cyhzZWxmKToKKyAgICAgICAgbmFtZXMgPSBzZWxmLmRmYXMua2V5cygpCisgICAgICAgIG5hbWVzLnNvcnQoKQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuZmlyc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxjZmlyc3QobmFtZSkKKyAgICAgICAgICAgICNwcmludCBuYW1lLCBzZWxmLmZpcnN0W25hbWVdLmtleXMoKQorCisgICAgZGVmIGNhbGNmaXJzdChzZWxmLCBuYW1lKToKKyAgICAgICAgZGZhID0gc2VsZi5kZmFzW25hbWVdCisgICAgICAgIHNlbGYuZmlyc3RbbmFtZV0gPSBOb25lICMgZHVtbXkgdG8gZGV0ZWN0IGxlZnQgcmVjdXJzaW9uCisgICAgICAgIHN0YXRlID0gZGZhWzBdCisgICAgICAgIHRvdGFsc2V0ID0ge30KKyAgICAgICAgb3ZlcmxhcGNoZWNrID0ge30KKyAgICAgICAgZm9yIGxhYmVsLCBuZXh0IGluIHN0YXRlLmFyY3MuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBsYWJlbCBpbiBzZWxmLmRmYXM6CisgICAgICAgICAgICAgICAgaWYgbGFiZWwgaW4gc2VsZi5maXJzdDoKKyAgICAgICAgICAgICAgICAgICAgZnNldCA9IHNlbGYuZmlyc3RbbGFiZWxdCisgICAgICAgICAgICAgICAgICAgIGlmIGZzZXQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlY3Vyc2lvbiBmb3IgcnVsZSAlciIgJSBuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2FsY2ZpcnN0KGxhYmVsKQorICAgICAgICAgICAgICAgICAgICBmc2V0ID0gc2VsZi5maXJzdFtsYWJlbF0KKyAgICAgICAgICAgICAgICB0b3RhbHNldC51cGRhdGUoZnNldCkKKyAgICAgICAgICAgICAgICBvdmVybGFwY2hlY2tbbGFiZWxdID0gZnNldAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0b3RhbHNldFtsYWJlbF0gPSAxCisgICAgICAgICAgICAgICAgb3ZlcmxhcGNoZWNrW2xhYmVsXSA9IHtsYWJlbDogMX0KKyAgICAgICAgaW52ZXJzZSA9IHt9CisgICAgICAgIGZvciBsYWJlbCwgaXRzZmlyc3QgaW4gb3ZlcmxhcGNoZWNrLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgZm9yIHN5bWJvbCBpbiBpdHNmaXJzdDoKKyAgICAgICAgICAgICAgICBpZiBzeW1ib2wgaW4gaW52ZXJzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicnVsZSAlcyBpcyBhbWJpZ3VvdXM7ICVzIGlzIGluIHRoZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZpcnN0IHNldHMgb2YgJXMgYXMgd2VsbCBhcyAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCBzeW1ib2wsIGxhYmVsLCBpbnZlcnNlW3N5bWJvbF0pKQorICAgICAgICAgICAgICAgIGludmVyc2Vbc3ltYm9sXSA9IGxhYmVsCisgICAgICAgIHNlbGYuZmlyc3RbbmFtZV0gPSB0b3RhbHNldAorCisgICAgZGVmIHBhcnNlKHNlbGYpOgorICAgICAgICBkZmFzID0ge30KKyAgICAgICAgc3RhcnRzeW1ib2wgPSBOb25lCisgICAgICAgICMgTVNUQVJUOiAoTkVXTElORSB8IFJVTEUpKiBFTkRNQVJLRVIKKyAgICAgICAgd2hpbGUgc2VsZi50eXBlICE9IHRva2VuLkVORE1BUktFUjoKKyAgICAgICAgICAgIHdoaWxlIHNlbGYudHlwZSA9PSB0b2tlbi5ORVdMSU5FOgorICAgICAgICAgICAgICAgIHNlbGYuZ2V0dG9rZW4oKQorICAgICAgICAgICAgIyBSVUxFOiBOQU1FICc6JyBSSFMgTkVXTElORQorICAgICAgICAgICAgbmFtZSA9IHNlbGYuZXhwZWN0KHRva2VuLk5BTUUpCisgICAgICAgICAgICBzZWxmLmV4cGVjdCh0b2tlbi5PUCwgIjoiKQorICAgICAgICAgICAgYSwgeiA9IHNlbGYucGFyc2VfcmhzKCkKKyAgICAgICAgICAgIHNlbGYuZXhwZWN0KHRva2VuLk5FV0xJTkUpCisgICAgICAgICAgICAjc2VsZi5kdW1wX25mYShuYW1lLCBhLCB6KQorICAgICAgICAgICAgZGZhID0gc2VsZi5tYWtlX2RmYShhLCB6KQorICAgICAgICAgICAgI3NlbGYuZHVtcF9kZmEobmFtZSwgZGZhKQorICAgICAgICAgICAgb2xkbGVuID0gbGVuKGRmYSkKKyAgICAgICAgICAgIHNlbGYuc2ltcGxpZnlfZGZhKGRmYSkKKyAgICAgICAgICAgIG5ld2xlbiA9IGxlbihkZmEpCisgICAgICAgICAgICBkZmFzW25hbWVdID0gZGZhCisgICAgICAgICAgICAjcHJpbnQgbmFtZSwgb2xkbGVuLCBuZXdsZW4KKyAgICAgICAgICAgIGlmIHN0YXJ0c3ltYm9sIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc3RhcnRzeW1ib2wgPSBuYW1lCisgICAgICAgIHJldHVybiBkZmFzLCBzdGFydHN5bWJvbAorCisgICAgZGVmIG1ha2VfZGZhKHNlbGYsIHN0YXJ0LCBmaW5pc2gpOgorICAgICAgICAjIFRvIHR1cm4gYW4gTkZBIGludG8gYSBERkEsIHdlIGRlZmluZSB0aGUgc3RhdGVzIG9mIHRoZSBERkEKKyAgICAgICAgIyB0byBjb3JyZXNwb25kIHRvICpzZXRzKiBvZiBzdGF0ZXMgb2YgdGhlIE5GQS4gIFRoZW4gZG8gc29tZQorICAgICAgICAjIHN0YXRlIHJlZHVjdGlvbi4gIExldCdzIHJlcHJlc2VudCBzZXRzIGFzIGRpY3RzIHdpdGggMSBmb3IKKyAgICAgICAgIyB2YWx1ZXMuCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHN0YXJ0LCBORkFTdGF0ZSkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZmluaXNoLCBORkFTdGF0ZSkKKyAgICAgICAgZGVmIGNsb3N1cmUoc3RhdGUpOgorICAgICAgICAgICAgYmFzZSA9IHt9CisgICAgICAgICAgICBhZGRjbG9zdXJlKHN0YXRlLCBiYXNlKQorICAgICAgICAgICAgcmV0dXJuIGJhc2UKKyAgICAgICAgZGVmIGFkZGNsb3N1cmUoc3RhdGUsIGJhc2UpOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uoc3RhdGUsIE5GQVN0YXRlKQorICAgICAgICAgICAgaWYgc3RhdGUgaW4gYmFzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGJhc2Vbc3RhdGVdID0gMQorICAgICAgICAgICAgZm9yIGxhYmVsLCBuZXh0IGluIHN0YXRlLmFyY3M6CisgICAgICAgICAgICAgICAgaWYgbGFiZWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgYWRkY2xvc3VyZShuZXh0LCBiYXNlKQorICAgICAgICBzdGF0ZXMgPSBbREZBU3RhdGUoY2xvc3VyZShzdGFydCksIGZpbmlzaCldCisgICAgICAgIGZvciBzdGF0ZSBpbiBzdGF0ZXM6ICMgTkIgc3RhdGVzIGdyb3dzIHdoaWxlIHdlJ3JlIGl0ZXJhdGluZworICAgICAgICAgICAgYXJjcyA9IHt9CisgICAgICAgICAgICBmb3IgbmZhc3RhdGUgaW4gc3RhdGUubmZhc2V0OgorICAgICAgICAgICAgICAgIGZvciBsYWJlbCwgbmV4dCBpbiBuZmFzdGF0ZS5hcmNzOgorICAgICAgICAgICAgICAgICAgICBpZiBsYWJlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZGNsb3N1cmUobmV4dCwgYXJjcy5zZXRkZWZhdWx0KGxhYmVsLCB7fSkpCisgICAgICAgICAgICBmb3IgbGFiZWwsIG5mYXNldCBpbiBhcmNzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGZvciBzdCBpbiBzdGF0ZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHN0Lm5mYXNldCA9PSBuZmFzZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0ID0gREZBU3RhdGUobmZhc2V0LCBmaW5pc2gpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlcy5hcHBlbmQoc3QpCisgICAgICAgICAgICAgICAgc3RhdGUuYWRkYXJjKHN0LCBsYWJlbCkKKyAgICAgICAgcmV0dXJuIHN0YXRlcyAjIExpc3Qgb2YgREZBU3RhdGUgaW5zdGFuY2VzOyBmaXJzdCBvbmUgaXMgc3RhcnQKKworICAgIGRlZiBkdW1wX25mYShzZWxmLCBuYW1lLCBzdGFydCwgZmluaXNoKToKKyAgICAgICAgcHJpbnQgIkR1bXAgb2YgTkZBIGZvciIsIG5hbWUKKyAgICAgICAgdG9kbyA9IFtzdGFydF0KKyAgICAgICAgZm9yIGksIHN0YXRlIGluIGVudW1lcmF0ZSh0b2RvKToKKyAgICAgICAgICAgIHByaW50ICIgIFN0YXRlIiwgaSwgc3RhdGUgaXMgZmluaXNoIGFuZCAiKGZpbmFsKSIgb3IgIiIKKyAgICAgICAgICAgIGZvciBsYWJlbCwgbmV4dCBpbiBzdGF0ZS5hcmNzOgorICAgICAgICAgICAgICAgIGlmIG5leHQgaW4gdG9kbzoKKyAgICAgICAgICAgICAgICAgICAgaiA9IHRvZG8uaW5kZXgobmV4dCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBqID0gbGVuKHRvZG8pCisgICAgICAgICAgICAgICAgICAgIHRvZG8uYXBwZW5kKG5leHQpCisgICAgICAgICAgICAgICAgaWYgbGFiZWwgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiAgICAtPiAlZCIgJSBqCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiAgICAlcyAtPiAlZCIgJSAobGFiZWwsIGopCisKKyAgICBkZWYgZHVtcF9kZmEoc2VsZiwgbmFtZSwgZGZhKToKKyAgICAgICAgcHJpbnQgIkR1bXAgb2YgREZBIGZvciIsIG5hbWUKKyAgICAgICAgZm9yIGksIHN0YXRlIGluIGVudW1lcmF0ZShkZmEpOgorICAgICAgICAgICAgcHJpbnQgIiAgU3RhdGUiLCBpLCBzdGF0ZS5pc2ZpbmFsIGFuZCAiKGZpbmFsKSIgb3IgIiIKKyAgICAgICAgICAgIGZvciBsYWJlbCwgbmV4dCBpbiBzdGF0ZS5hcmNzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHByaW50ICIgICAgJXMgLT4gJWQiICUgKGxhYmVsLCBkZmEuaW5kZXgobmV4dCkpCisKKyAgICBkZWYgc2ltcGxpZnlfZGZhKHNlbGYsIGRmYSk6CisgICAgICAgICMgVGhpcyBpcyBub3QgdGhlb3JldGljYWxseSBvcHRpbWFsLCBidXQgd29ya3Mgd2VsbCBlbm91Z2guCisgICAgICAgICMgQWxnb3JpdGhtOiByZXBlYXRlZGx5IGxvb2sgZm9yIHR3byBzdGF0ZXMgdGhhdCBoYXZlIHRoZSBzYW1lCisgICAgICAgICMgc2V0IG9mIGFyY3MgKHNhbWUgbGFiZWxzIHBvaW50aW5nIHRvIHRoZSBzYW1lIG5vZGVzKSBhbmQKKyAgICAgICAgIyB1bmlmeSB0aGVtLCB1bnRpbCB0aGluZ3Mgc3RvcCBjaGFuZ2luZy4KKworICAgICAgICAjIGRmYSBpcyBhIGxpc3Qgb2YgREZBU3RhdGUgaW5zdGFuY2VzCisgICAgICAgIGNoYW5nZXMgPSBUcnVlCisgICAgICAgIHdoaWxlIGNoYW5nZXM6CisgICAgICAgICAgICBjaGFuZ2VzID0gRmFsc2UKKyAgICAgICAgICAgIGZvciBpLCBzdGF0ZV9pIGluIGVudW1lcmF0ZShkZmEpOgorICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGkrMSwgbGVuKGRmYSkpOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZV9qID0gZGZhW2pdCisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXRlX2kgPT0gc3RhdGVfajoKKyAgICAgICAgICAgICAgICAgICAgICAgICNwcmludCAiICB1bmlmeSIsIGksIGoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBkZmFbal0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdGF0ZSBpbiBkZmE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudW5pZnlzdGF0ZShzdGF0ZV9qLCBzdGF0ZV9pKQorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgcGFyc2VfcmhzKHNlbGYpOgorICAgICAgICAjIFJIUzogQUxUICgnfCcgQUxUKSoKKyAgICAgICAgYSwgeiA9IHNlbGYucGFyc2VfYWx0KCkKKyAgICAgICAgaWYgc2VsZi52YWx1ZSAhPSAifCI6CisgICAgICAgICAgICByZXR1cm4gYSwgegorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWEgPSBORkFTdGF0ZSgpCisgICAgICAgICAgICB6eiA9IE5GQVN0YXRlKCkKKyAgICAgICAgICAgIGFhLmFkZGFyYyhhKQorICAgICAgICAgICAgei5hZGRhcmMoenopCisgICAgICAgICAgICB3aGlsZSBzZWxmLnZhbHVlID09ICJ8IjoKKyAgICAgICAgICAgICAgICBzZWxmLmdldHRva2VuKCkKKyAgICAgICAgICAgICAgICBhLCB6ID0gc2VsZi5wYXJzZV9hbHQoKQorICAgICAgICAgICAgICAgIGFhLmFkZGFyYyhhKQorICAgICAgICAgICAgICAgIHouYWRkYXJjKHp6KQorICAgICAgICAgICAgcmV0dXJuIGFhLCB6egorCisgICAgZGVmIHBhcnNlX2FsdChzZWxmKToKKyAgICAgICAgIyBBTFQ6IElURU0rCisgICAgICAgIGEsIGIgPSBzZWxmLnBhcnNlX2l0ZW0oKQorICAgICAgICB3aGlsZSAoc2VsZi52YWx1ZSBpbiAoIigiLCAiWyIpIG9yCisgICAgICAgICAgICAgICBzZWxmLnR5cGUgaW4gKHRva2VuLk5BTUUsIHRva2VuLlNUUklORykpOgorICAgICAgICAgICAgYywgZCA9IHNlbGYucGFyc2VfaXRlbSgpCisgICAgICAgICAgICBiLmFkZGFyYyhjKQorICAgICAgICAgICAgYiA9IGQKKyAgICAgICAgcmV0dXJuIGEsIGIKKworICAgIGRlZiBwYXJzZV9pdGVtKHNlbGYpOgorICAgICAgICAjIElURU06ICdbJyBSSFMgJ10nIHwgQVRPTSBbJysnIHwgJyonXQorICAgICAgICBpZiBzZWxmLnZhbHVlID09ICJbIjoKKyAgICAgICAgICAgIHNlbGYuZ2V0dG9rZW4oKQorICAgICAgICAgICAgYSwgeiA9IHNlbGYucGFyc2VfcmhzKCkKKyAgICAgICAgICAgIHNlbGYuZXhwZWN0KHRva2VuLk9QLCAiXSIpCisgICAgICAgICAgICBhLmFkZGFyYyh6KQorICAgICAgICAgICAgcmV0dXJuIGEsIHoKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGEsIHogPSBzZWxmLnBhcnNlX2F0b20oKQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlCisgICAgICAgICAgICBpZiB2YWx1ZSBub3QgaW4gKCIrIiwgIioiKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYSwgegorICAgICAgICAgICAgc2VsZi5nZXR0b2tlbigpCisgICAgICAgICAgICB6LmFkZGFyYyhhKQorICAgICAgICAgICAgaWYgdmFsdWUgPT0gIisiOgorICAgICAgICAgICAgICAgIHJldHVybiBhLCB6CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBhLCBhCisKKyAgICBkZWYgcGFyc2VfYXRvbShzZWxmKToKKyAgICAgICAgIyBBVE9NOiAnKCcgUkhTICcpJyB8IE5BTUUgfCBTVFJJTkcKKyAgICAgICAgaWYgc2VsZi52YWx1ZSA9PSAiKCI6CisgICAgICAgICAgICBzZWxmLmdldHRva2VuKCkKKyAgICAgICAgICAgIGEsIHogPSBzZWxmLnBhcnNlX3JocygpCisgICAgICAgICAgICBzZWxmLmV4cGVjdCh0b2tlbi5PUCwgIikiKQorICAgICAgICAgICAgcmV0dXJuIGEsIHoKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgaW4gKHRva2VuLk5BTUUsIHRva2VuLlNUUklORyk6CisgICAgICAgICAgICBhID0gTkZBU3RhdGUoKQorICAgICAgICAgICAgeiA9IE5GQVN0YXRlKCkKKyAgICAgICAgICAgIGEuYWRkYXJjKHosIHNlbGYudmFsdWUpCisgICAgICAgICAgICBzZWxmLmdldHRva2VuKCkKKyAgICAgICAgICAgIHJldHVybiBhLCB6CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJhaXNlX2Vycm9yKCJleHBlY3RlZCAoLi4uKSBvciBOQU1FIG9yIFNUUklORywgZ290ICVzLyVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlLCBzZWxmLnZhbHVlKQorCisgICAgZGVmIGV4cGVjdChzZWxmLCB0eXBlLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgaWYgc2VsZi50eXBlICE9IHR5cGUgb3IgKHZhbHVlIGlzIG5vdCBOb25lIGFuZCBzZWxmLnZhbHVlICE9IHZhbHVlKToKKyAgICAgICAgICAgIHNlbGYucmFpc2VfZXJyb3IoImV4cGVjdGVkICVzLyVzLCBnb3QgJXMvJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCB2YWx1ZSwgc2VsZi50eXBlLCBzZWxmLnZhbHVlKQorICAgICAgICB2YWx1ZSA9IHNlbGYudmFsdWUKKyAgICAgICAgc2VsZi5nZXR0b2tlbigpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIGdldHRva2VuKHNlbGYpOgorICAgICAgICB0dXAgPSBzZWxmLmdlbmVyYXRvci5uZXh0KCkKKyAgICAgICAgd2hpbGUgdHVwWzBdIGluICh0b2tlbml6ZS5DT01NRU5ULCB0b2tlbml6ZS5OTCk6CisgICAgICAgICAgICB0dXAgPSBzZWxmLmdlbmVyYXRvci5uZXh0KCkKKyAgICAgICAgc2VsZi50eXBlLCBzZWxmLnZhbHVlLCBzZWxmLmJlZ2luLCBzZWxmLmVuZCwgc2VsZi5saW5lID0gdHVwCisgICAgICAgICNwcmludCB0b2tlbi50b2tfbmFtZVtzZWxmLnR5cGVdLCByZXByKHNlbGYudmFsdWUpCisKKyAgICBkZWYgcmFpc2VfZXJyb3Ioc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbXNnID0gbXNnICUgYXJncworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG1zZyA9ICIgIi5qb2luKFttc2ddICsgbWFwKHN0ciwgYXJncykpCisgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKG1zZywgKHNlbGYuZmlsZW5hbWUsIHNlbGYuZW5kWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVuZFsxXSwgc2VsZi5saW5lKSkKKworY2xhc3MgTkZBU3RhdGUob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5hcmNzID0gW10gIyBsaXN0IG9mIChsYWJlbCwgTkZBU3RhdGUpIHBhaXJzCisKKyAgICBkZWYgYWRkYXJjKHNlbGYsIG5leHQsIGxhYmVsPU5vbmUpOgorICAgICAgICBhc3NlcnQgbGFiZWwgaXMgTm9uZSBvciBpc2luc3RhbmNlKGxhYmVsLCBzdHIpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5leHQsIE5GQVN0YXRlKQorICAgICAgICBzZWxmLmFyY3MuYXBwZW5kKChsYWJlbCwgbmV4dCkpCisKK2NsYXNzIERGQVN0YXRlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmZhc2V0LCBmaW5hbCk6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG5mYXNldCwgZGljdCkKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoaXRlcihuZmFzZXQpLm5leHQoKSwgTkZBU3RhdGUpCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGZpbmFsLCBORkFTdGF0ZSkKKyAgICAgICAgc2VsZi5uZmFzZXQgPSBuZmFzZXQKKyAgICAgICAgc2VsZi5pc2ZpbmFsID0gZmluYWwgaW4gbmZhc2V0CisgICAgICAgIHNlbGYuYXJjcyA9IHt9ICMgbWFwIGZyb20gbGFiZWwgdG8gREZBU3RhdGUKKworICAgIGRlZiBhZGRhcmMoc2VsZiwgbmV4dCwgbGFiZWwpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShsYWJlbCwgc3RyKQorICAgICAgICBhc3NlcnQgbGFiZWwgbm90IGluIHNlbGYuYXJjcworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuZXh0LCBERkFTdGF0ZSkKKyAgICAgICAgc2VsZi5hcmNzW2xhYmVsXSA9IG5leHQKKworICAgIGRlZiB1bmlmeXN0YXRlKHNlbGYsIG9sZCwgbmV3KToKKyAgICAgICAgZm9yIGxhYmVsLCBuZXh0IGluIHNlbGYuYXJjcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5leHQgaXMgb2xkOgorICAgICAgICAgICAgICAgIHNlbGYuYXJjc1tsYWJlbF0gPSBuZXcKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIEVxdWFsaXR5IHRlc3QgLS0gaWdub3JlIHRoZSBuZmFzZXQgaW5zdGFuY2UgdmFyaWFibGUKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uob3RoZXIsIERGQVN0YXRlKQorICAgICAgICBpZiBzZWxmLmlzZmluYWwgIT0gb3RoZXIuaXNmaW5hbDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAjIENhbid0IGp1c3QgcmV0dXJuIHNlbGYuYXJjcyA9PSBvdGhlci5hcmNzLCBiZWNhdXNlIHRoYXQKKyAgICAgICAgIyB3b3VsZCBpbnZva2UgdGhpcyBtZXRob2QgcmVjdXJzaXZlbHksIHdpdGggY3ljbGVzLi4uCisgICAgICAgIGlmIGxlbihzZWxmLmFyY3MpICE9IGxlbihvdGhlci5hcmNzKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgbGFiZWwsIG5leHQgaW4gc2VsZi5hcmNzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgbmV4dCBpcyBub3Qgb3RoZXIuYXJjcy5nZXQobGFiZWwpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgX19oYXNoX18gPSBOb25lICMgRm9yIFB5MyBjb21wYXRpYmlsaXR5LgorCitkZWYgZ2VuZXJhdGVfZ3JhbW1hcihmaWxlbmFtZT0iR3JhbW1hci50eHQiKToKKyAgICBwID0gUGFyc2VyR2VuZXJhdG9yKGZpbGVuYW1lKQorICAgIHJldHVybiBwLm1ha2VfZ3JhbW1hcigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzMDZlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wZ2VuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvcGdlbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlNjk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi9wZ2VuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW4ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjE0NjhiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbi5weQpAQCAtMCwwICsxLDgyIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlRva2VuIGNvbnN0YW50cyAoZnJvbSAidG9rZW4uaCIpLiIiIgorCisjICBUYWtlbiBmcm9tIFB5dGhvbiAocjUzNzU3KSBhbmQgbW9kaWZpZWQgdG8gaW5jbHVkZSBzb21lIHRva2VucworIyAgIG9yaWdpbmFsbHkgbW9ua2V5cGF0Y2hlZCBpbiBieSBwZ2VuMi50b2tlbml6ZQorCisjLS1zdGFydCBjb25zdGFudHMtLQorRU5ETUFSS0VSID0gMAorTkFNRSA9IDEKK05VTUJFUiA9IDIKK1NUUklORyA9IDMKK05FV0xJTkUgPSA0CitJTkRFTlQgPSA1CitERURFTlQgPSA2CitMUEFSID0gNworUlBBUiA9IDgKK0xTUUIgPSA5CitSU1FCID0gMTAKK0NPTE9OID0gMTEKK0NPTU1BID0gMTIKK1NFTUkgPSAxMworUExVUyA9IDE0CitNSU5VUyA9IDE1CitTVEFSID0gMTYKK1NMQVNIID0gMTcKK1ZCQVIgPSAxOAorQU1QRVIgPSAxOQorTEVTUyA9IDIwCitHUkVBVEVSID0gMjEKK0VRVUFMID0gMjIKK0RPVCA9IDIzCitQRVJDRU5UID0gMjQKK0JBQ0tRVU9URSA9IDI1CitMQlJBQ0UgPSAyNgorUkJSQUNFID0gMjcKK0VRRVFVQUwgPSAyOAorTk9URVFVQUwgPSAyOQorTEVTU0VRVUFMID0gMzAKK0dSRUFURVJFUVVBTCA9IDMxCitUSUxERSA9IDMyCitDSVJDVU1GTEVYID0gMzMKK0xFRlRTSElGVCA9IDM0CitSSUdIVFNISUZUID0gMzUKK0RPVUJMRVNUQVIgPSAzNgorUExVU0VRVUFMID0gMzcKK01JTkVRVUFMID0gMzgKK1NUQVJFUVVBTCA9IDM5CitTTEFTSEVRVUFMID0gNDAKK1BFUkNFTlRFUVVBTCA9IDQxCitBTVBFUkVRVUFMID0gNDIKK1ZCQVJFUVVBTCA9IDQzCitDSVJDVU1GTEVYRVFVQUwgPSA0NAorTEVGVFNISUZURVFVQUwgPSA0NQorUklHSFRTSElGVEVRVUFMID0gNDYKK0RPVUJMRVNUQVJFUVVBTCA9IDQ3CitET1VCTEVTTEFTSCA9IDQ4CitET1VCTEVTTEFTSEVRVUFMID0gNDkKK0FUID0gNTAKK09QID0gNTEKK0NPTU1FTlQgPSA1MgorTkwgPSA1MworUkFSUk9XID0gNTQKK0VSUk9SVE9LRU4gPSA1NQorTl9UT0tFTlMgPSA1NgorTlRfT0ZGU0VUID0gMjU2CisjLS1lbmQgY29uc3RhbnRzLS0KKwordG9rX25hbWUgPSB7fQorZm9yIF9uYW1lLCBfdmFsdWUgaW4gZ2xvYmFscygpLml0ZW1zKCk6CisgICAgaWYgdHlwZShfdmFsdWUpIGlzIHR5cGUoMCk6CisgICAgICAgIHRva19uYW1lW192YWx1ZV0gPSBfbmFtZQorCisKK2RlZiBJU1RFUk1JTkFMKHgpOgorICAgIHJldHVybiB4IDwgTlRfT0ZGU0VUCisKK2RlZiBJU05PTlRFUk1JTkFMKHgpOgorICAgIHJldHVybiB4ID49IE5UX09GRlNFVAorCitkZWYgSVNFT0YoeCk6CisgICAgcmV0dXJuIHggPT0gRU5ETUFSS0VSCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW4ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZkZjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW4ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ZkZjRiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3BnZW4yL3Rva2VuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5MGFhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weQpAQCAtMCwwICsxLDUwMCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyIiIlRva2VuaXphdGlvbiBoZWxwIGZvciBQeXRob24gcHJvZ3JhbXMuCisKK2dlbmVyYXRlX3Rva2VucyhyZWFkbGluZSkgaXMgYSBnZW5lcmF0b3IgdGhhdCBicmVha3MgYSBzdHJlYW0gb2YKK3RleHQgaW50byBQeXRob24gdG9rZW5zLiAgSXQgYWNjZXB0cyBhIHJlYWRsaW5lLWxpa2UgbWV0aG9kIHdoaWNoIGlzIGNhbGxlZAorcmVwZWF0ZWRseSB0byBnZXQgdGhlIG5leHQgbGluZSBvZiBpbnB1dCAob3IgIiIgZm9yIEVPRikuICBJdCBnZW5lcmF0ZXMKKzUtdHVwbGVzIHdpdGggdGhlc2UgbWVtYmVyczoKKworICAgIHRoZSB0b2tlbiB0eXBlIChzZWUgdG9rZW4ucHkpCisgICAgdGhlIHRva2VuIChhIHN0cmluZykKKyAgICB0aGUgc3RhcnRpbmcgKHJvdywgY29sdW1uKSBpbmRpY2VzIG9mIHRoZSB0b2tlbiAoYSAyLXR1cGxlIG9mIGludHMpCisgICAgdGhlIGVuZGluZyAocm93LCBjb2x1bW4pIGluZGljZXMgb2YgdGhlIHRva2VuIChhIDItdHVwbGUgb2YgaW50cykKKyAgICB0aGUgb3JpZ2luYWwgbGluZSAoc3RyaW5nKQorCitJdCBpcyBkZXNpZ25lZCB0byBtYXRjaCB0aGUgd29ya2luZyBvZiB0aGUgUHl0aG9uIHRva2VuaXplciBleGFjdGx5LCBleGNlcHQKK3RoYXQgaXQgcHJvZHVjZXMgQ09NTUVOVCB0b2tlbnMgZm9yIGNvbW1lbnRzIGFuZCBnaXZlcyB0eXBlIE9QIGZvciBhbGwKK29wZXJhdG9ycworCitPbGRlciBlbnRyeSBwb2ludHMKKyAgICB0b2tlbml6ZV9sb29wKHJlYWRsaW5lLCB0b2tlbmVhdGVyKQorICAgIHRva2VuaXplKHJlYWRsaW5lLCB0b2tlbmVhdGVyPXByaW50dG9rZW4pCithcmUgdGhlIHNhbWUsIGV4Y2VwdCBpbnN0ZWFkIG9mIGdlbmVyYXRpbmcgdG9rZW5zLCB0b2tlbmVhdGVyIGlzIGEgY2FsbGJhY2sKK2Z1bmN0aW9uIHRvIHdoaWNoIHRoZSA1IGZpZWxkcyBkZXNjcmliZWQgYWJvdmUgYXJlIHBhc3NlZCBhcyA1IGFyZ3VtZW50cywKK2VhY2ggdGltZSBhIG5ldyB0b2tlbiBpcyBmb3VuZC4iIiIKKworX19hdXRob3JfXyA9ICdLYS1QaW5nIFllZSA8cGluZ0BsZncub3JnPicKK19fY3JlZGl0c19fID0gXAorICAgICdHdlIsIEVTUiwgVGltIFBldGVycywgVGhvbWFzIFdvdXRlcnMsIEZyZWQgRHJha2UsIFNraXAgTW9udGFuYXJvJworCitpbXBvcnQgc3RyaW5nLCByZQorZnJvbSBjb2RlY3MgaW1wb3J0IEJPTV9VVEY4LCBsb29rdXAKK2Zyb20gbGliMnRvMy5wZ2VuMi50b2tlbiBpbXBvcnQgKgorCitmcm9tIC4gaW1wb3J0IHRva2VuCitfX2FsbF9fID0gW3ggZm9yIHggaW4gZGlyKHRva2VuKSBpZiB4WzBdICE9ICdfJ10gKyBbInRva2VuaXplIiwKKyAgICAgICAgICAgImdlbmVyYXRlX3Rva2VucyIsICJ1bnRva2VuaXplIl0KK2RlbCB0b2tlbgorCit0cnk6CisgICAgYnl0ZXMKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgIyBTdXBwb3J0IGJ5dGVzIHR5cGUgaW4gUHl0aG9uIDw9IDIuNSwgc28gMnRvMyB0dXJucyBpdHNlbGYgaW50bworICAgICMgdmFsaWQgUHl0aG9uIDMgY29kZS4KKyAgICBieXRlcyA9IHN0cgorCitkZWYgZ3JvdXAoKmNob2ljZXMpOiByZXR1cm4gJygnICsgJ3wnLmpvaW4oY2hvaWNlcykgKyAnKScKK2RlZiBhbnkoKmNob2ljZXMpOiByZXR1cm4gZ3JvdXAoKmNob2ljZXMpICsgJyonCitkZWYgbWF5YmUoKmNob2ljZXMpOiByZXR1cm4gZ3JvdXAoKmNob2ljZXMpICsgJz8nCisKK1doaXRlc3BhY2UgPSByJ1sgXGZcdF0qJworQ29tbWVudCA9IHInI1teXHJcbl0qJworSWdub3JlID0gV2hpdGVzcGFjZSArIGFueShyJ1xcXHI/XG4nICsgV2hpdGVzcGFjZSkgKyBtYXliZShDb21tZW50KQorTmFtZSA9IHInW2EtekEtWl9dXHcqJworCitCaW5udW1iZXIgPSByJzBbYkJdWzAxXSonCitIZXhudW1iZXIgPSByJzBbeFhdW1xkYS1mQS1GXSpbbExdPycKK09jdG51bWJlciA9IHInMFtvT10/WzAtN10qW2xMXT8nCitEZWNudW1iZXIgPSByJ1sxLTldXGQqW2xMXT8nCitJbnRudW1iZXIgPSBncm91cChCaW5udW1iZXIsIEhleG51bWJlciwgT2N0bnVtYmVyLCBEZWNudW1iZXIpCitFeHBvbmVudCA9IHInW2VFXVstK10/XGQrJworUG9pbnRmbG9hdCA9IGdyb3VwKHInXGQrXC5cZConLCByJ1wuXGQrJykgKyBtYXliZShFeHBvbmVudCkKK0V4cGZsb2F0ID0gcidcZCsnICsgRXhwb25lbnQKK0Zsb2F0bnVtYmVyID0gZ3JvdXAoUG9pbnRmbG9hdCwgRXhwZmxvYXQpCitJbWFnbnVtYmVyID0gZ3JvdXAocidcZCtbakpdJywgRmxvYXRudW1iZXIgKyByJ1tqSl0nKQorTnVtYmVyID0gZ3JvdXAoSW1hZ251bWJlciwgRmxvYXRudW1iZXIsIEludG51bWJlcikKKworIyBUYWlsIGVuZCBvZiAnIHN0cmluZy4KK1NpbmdsZSA9IHIiW14nXFxdKig/OlxcLlteJ1xcXSopKiciCisjIFRhaWwgZW5kIG9mICIgc3RyaW5nLgorRG91YmxlID0gcidbXiJcXF0qKD86XFwuW14iXFxdKikqIicKKyMgVGFpbCBlbmQgb2YgJycnIHN0cmluZy4KK1NpbmdsZTMgPSByIlteJ1xcXSooPzooPzpcXC58Jyg/IScnKSlbXidcXF0qKSonJyciCisjIFRhaWwgZW5kIG9mICIiIiBzdHJpbmcuCitEb3VibGUzID0gcidbXiJcXF0qKD86KD86XFwufCIoPyEiIikpW14iXFxdKikqIiIiJworVHJpcGxlID0gZ3JvdXAoIlt1YlVCXT9bclJdPycnJyIsICdbdWJVQl0/W3JSXT8iIiInKQorIyBTaW5nbGUtbGluZSAnIG9yICIgc3RyaW5nLgorU3RyaW5nID0gZ3JvdXAociJbdVVdP1tyUl0/J1teXG4nXFxdKig/OlxcLlteXG4nXFxdKikqJyIsCisgICAgICAgICAgICAgICByJ1t1VV0/W3JSXT8iW15cbiJcXF0qKD86XFwuW15cbiJcXF0qKSoiJykKKworIyBCZWNhdXNlIG9mIGxlZnRtb3N0LXRoZW4tbG9uZ2VzdCBtYXRjaCBzZW1hbnRpY3MsIGJlIHN1cmUgdG8gcHV0IHRoZQorIyBsb25nZXN0IG9wZXJhdG9ycyBmaXJzdCAoZS5nLiwgaWYgPSBjYW1lIGJlZm9yZSA9PSwgPT0gd291bGQgZ2V0CisjIHJlY29nbml6ZWQgYXMgdHdvIGluc3RhbmNlcyBvZiA9KS4KK09wZXJhdG9yID0gZ3JvdXAociJcKlwqPT8iLCByIj4+PT8iLCByIjw8PT8iLCByIjw+IiwgciIhPSIsCisgICAgICAgICAgICAgICAgIHIiLy89PyIsIHIiLT4iLAorICAgICAgICAgICAgICAgICByIlsrXC0qLyUmfF49PD5dPT8iLAorICAgICAgICAgICAgICAgICByIn4iKQorCitCcmFja2V0ID0gJ1tdWygpe31dJworU3BlY2lhbCA9IGdyb3VwKHInXHI/XG4nLCByJ1s6Oy4sYEBdJykKK0Z1bm55ID0gZ3JvdXAoT3BlcmF0b3IsIEJyYWNrZXQsIFNwZWNpYWwpCisKK1BsYWluVG9rZW4gPSBncm91cChOdW1iZXIsIEZ1bm55LCBTdHJpbmcsIE5hbWUpCitUb2tlbiA9IElnbm9yZSArIFBsYWluVG9rZW4KKworIyBGaXJzdCAob3Igb25seSkgbGluZSBvZiAnIG9yICIgc3RyaW5nLgorQ29udFN0ciA9IGdyb3VwKHIiW3VVYkJdP1tyUl0/J1teXG4nXFxdKig/OlxcLlteXG4nXFxdKikqIiArCisgICAgICAgICAgICAgICAgZ3JvdXAoIiciLCByJ1xcXHI/XG4nKSwKKyAgICAgICAgICAgICAgICByJ1t1VWJCXT9bclJdPyJbXlxuIlxcXSooPzpcXC5bXlxuIlxcXSopKicgKworICAgICAgICAgICAgICAgIGdyb3VwKCciJywgcidcXFxyP1xuJykpCitQc2V1ZG9FeHRyYXMgPSBncm91cChyJ1xcXHI/XG4nLCBDb21tZW50LCBUcmlwbGUpCitQc2V1ZG9Ub2tlbiA9IFdoaXRlc3BhY2UgKyBncm91cChQc2V1ZG9FeHRyYXMsIE51bWJlciwgRnVubnksIENvbnRTdHIsIE5hbWUpCisKK3Rva2VucHJvZywgcHNldWRvcHJvZywgc2luZ2xlM3Byb2csIGRvdWJsZTNwcm9nID0gbWFwKAorICAgIHJlLmNvbXBpbGUsIChUb2tlbiwgUHNldWRvVG9rZW4sIFNpbmdsZTMsIERvdWJsZTMpKQorZW5kcHJvZ3MgPSB7IiciOiByZS5jb21waWxlKFNpbmdsZSksICciJzogcmUuY29tcGlsZShEb3VibGUpLAorICAgICAgICAgICAgIicnJyI6IHNpbmdsZTNwcm9nLCAnIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAicicnJyI6IHNpbmdsZTNwcm9nLCAnciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgInUnJyciOiBzaW5nbGUzcHJvZywgJ3UiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJiJycnIjogc2luZ2xlM3Byb2csICdiIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAidXInJyciOiBzaW5nbGUzcHJvZywgJ3VyIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiYnInJyciOiBzaW5nbGUzcHJvZywgJ2JyIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiUicnJyI6IHNpbmdsZTNwcm9nLCAnUiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIlUnJyciOiBzaW5nbGUzcHJvZywgJ1UiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJCJycnIjogc2luZ2xlM3Byb2csICdCIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAidVInJyciOiBzaW5nbGUzcHJvZywgJ3VSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiVXInJyciOiBzaW5nbGUzcHJvZywgJ1VyIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiVVInJyciOiBzaW5nbGUzcHJvZywgJ1VSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiYlInJyciOiBzaW5nbGUzcHJvZywgJ2JSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiQnInJyciOiBzaW5nbGUzcHJvZywgJ0JyIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiQlInJyciOiBzaW5nbGUzcHJvZywgJ0JSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAncic6IE5vbmUsICdSJzogTm9uZSwKKyAgICAgICAgICAgICd1JzogTm9uZSwgJ1UnOiBOb25lLAorICAgICAgICAgICAgJ2InOiBOb25lLCAnQic6IE5vbmV9CisKK3RyaXBsZV9xdW90ZWQgPSB7fQorZm9yIHQgaW4gKCInJyciLCAnIiIiJywKKyAgICAgICAgICAicicnJyIsICdyIiIiJywgIlInJyciLCAnUiIiIicsCisgICAgICAgICAgInUnJyciLCAndSIiIicsICJVJycnIiwgJ1UiIiInLAorICAgICAgICAgICJiJycnIiwgJ2IiIiInLCAiQicnJyIsICdCIiIiJywKKyAgICAgICAgICAidXInJyciLCAndXIiIiInLCAiVXInJyciLCAnVXIiIiInLAorICAgICAgICAgICJ1UicnJyIsICd1UiIiIicsICJVUicnJyIsICdVUiIiIicsCisgICAgICAgICAgImJyJycnIiwgJ2JyIiIiJywgIkJyJycnIiwgJ0JyIiIiJywKKyAgICAgICAgICAiYlInJyciLCAnYlIiIiInLCAiQlInJyciLCAnQlIiIiInLCk6CisgICAgdHJpcGxlX3F1b3RlZFt0XSA9IHQKK3NpbmdsZV9xdW90ZWQgPSB7fQorZm9yIHQgaW4gKCInIiwgJyInLAorICAgICAgICAgICJyJyIsICdyIicsICJSJyIsICdSIicsCisgICAgICAgICAgInUnIiwgJ3UiJywgIlUnIiwgJ1UiJywKKyAgICAgICAgICAiYiciLCAnYiInLCAiQiciLCAnQiInLAorICAgICAgICAgICJ1ciciLCAndXIiJywgIlVyJyIsICdVciInLAorICAgICAgICAgICJ1UiciLCAndVIiJywgIlVSJyIsICdVUiInLAorICAgICAgICAgICJiciciLCAnYnIiJywgIkJyJyIsICdCciInLAorICAgICAgICAgICJiUiciLCAnYlIiJywgIkJSJyIsICdCUiInLCApOgorICAgIHNpbmdsZV9xdW90ZWRbdF0gPSB0CisKK3RhYnNpemUgPSA4CisKK2NsYXNzIFRva2VuRXJyb3IoRXhjZXB0aW9uKTogcGFzcworCitjbGFzcyBTdG9wVG9rZW5pemluZyhFeGNlcHRpb24pOiBwYXNzCisKK2RlZiBwcmludHRva2VuKHR5cGUsIHRva2VuLCBzdGFydCwgZW5kLCBsaW5lKTogIyBmb3IgdGVzdGluZworICAgIChzcm93LCBzY29sKSA9IHN0YXJ0CisgICAgKGVyb3csIGVjb2wpID0gZW5kCisgICAgcHJpbnQgIiVkLCVkLSVkLCVkOlx0JXNcdCVzIiAlIFwKKyAgICAgICAgKHNyb3csIHNjb2wsIGVyb3csIGVjb2wsIHRva19uYW1lW3R5cGVdLCByZXByKHRva2VuKSkKKworZGVmIHRva2VuaXplKHJlYWRsaW5lLCB0b2tlbmVhdGVyPXByaW50dG9rZW4pOgorICAgICIiIgorICAgIFRoZSB0b2tlbml6ZSgpIGZ1bmN0aW9uIGFjY2VwdHMgdHdvIHBhcmFtZXRlcnM6IG9uZSByZXByZXNlbnRpbmcgdGhlCisgICAgaW5wdXQgc3RyZWFtLCBhbmQgb25lIHByb3ZpZGluZyBhbiBvdXRwdXQgbWVjaGFuaXNtIGZvciB0b2tlbml6ZSgpLgorCisgICAgVGhlIGZpcnN0IHBhcmFtZXRlciwgcmVhZGxpbmUsIG11c3QgYmUgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMKKyAgICB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlIHJlYWRsaW5lKCkgbWV0aG9kIG9mIGJ1aWx0LWluIGZpbGUgb2JqZWN0cy4KKyAgICBFYWNoIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gb25lIGxpbmUgb2YgaW5wdXQgYXMgYSBzdHJpbmcuCisKKyAgICBUaGUgc2Vjb25kIHBhcmFtZXRlciwgdG9rZW5lYXRlciwgbXVzdCBhbHNvIGJlIGEgY2FsbGFibGUgb2JqZWN0LiBJdCBpcworICAgIGNhbGxlZCBvbmNlIGZvciBlYWNoIHRva2VuLCB3aXRoIGZpdmUgYXJndW1lbnRzLCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIHR1cGxlcyBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGVfdG9rZW5zKCkuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICB0b2tlbml6ZV9sb29wKHJlYWRsaW5lLCB0b2tlbmVhdGVyKQorICAgIGV4Y2VwdCBTdG9wVG9rZW5pemluZzoKKyAgICAgICAgcGFzcworCisjIGJhY2t3YXJkcyBjb21wYXRpYmxlIGludGVyZmFjZQorZGVmIHRva2VuaXplX2xvb3AocmVhZGxpbmUsIHRva2VuZWF0ZXIpOgorICAgIGZvciB0b2tlbl9pbmZvIGluIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSk6CisgICAgICAgIHRva2VuZWF0ZXIoKnRva2VuX2luZm8pCisKK2NsYXNzIFVudG9rZW5pemVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnRva2VucyA9IFtdCisgICAgICAgIHNlbGYucHJldl9yb3cgPSAxCisgICAgICAgIHNlbGYucHJldl9jb2wgPSAwCisKKyAgICBkZWYgYWRkX3doaXRlc3BhY2Uoc2VsZiwgc3RhcnQpOgorICAgICAgICByb3csIGNvbCA9IHN0YXJ0CisgICAgICAgIGFzc2VydCByb3cgPD0gc2VsZi5wcmV2X3JvdworICAgICAgICBjb2xfb2Zmc2V0ID0gY29sIC0gc2VsZi5wcmV2X2NvbAorICAgICAgICBpZiBjb2xfb2Zmc2V0OgorICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKCIgIiAqIGNvbF9vZmZzZXQpCisKKyAgICBkZWYgdW50b2tlbml6ZShzZWxmLCBpdGVyYWJsZSk6CisgICAgICAgIGZvciB0IGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgaWYgbGVuKHQpID09IDI6CisgICAgICAgICAgICAgICAgc2VsZi5jb21wYXQodCwgaXRlcmFibGUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRva190eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSA9IHQKKyAgICAgICAgICAgIHNlbGYuYWRkX3doaXRlc3BhY2Uoc3RhcnQpCisgICAgICAgICAgICBzZWxmLnRva2Vucy5hcHBlbmQodG9rZW4pCisgICAgICAgICAgICBzZWxmLnByZXZfcm93LCBzZWxmLnByZXZfY29sID0gZW5kCisgICAgICAgICAgICBpZiB0b2tfdHlwZSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgICAgIHNlbGYucHJldl9yb3cgKz0gMQorICAgICAgICAgICAgICAgIHNlbGYucHJldl9jb2wgPSAwCisgICAgICAgIHJldHVybiAiIi5qb2luKHNlbGYudG9rZW5zKQorCisgICAgZGVmIGNvbXBhdChzZWxmLCB0b2tlbiwgaXRlcmFibGUpOgorICAgICAgICBzdGFydGxpbmUgPSBGYWxzZQorICAgICAgICBpbmRlbnRzID0gW10KKyAgICAgICAgdG9rc19hcHBlbmQgPSBzZWxmLnRva2Vucy5hcHBlbmQKKyAgICAgICAgdG9rbnVtLCB0b2t2YWwgPSB0b2tlbgorICAgICAgICBpZiB0b2tudW0gaW4gKE5BTUUsIE5VTUJFUik6CisgICAgICAgICAgICB0b2t2YWwgKz0gJyAnCisgICAgICAgIGlmIHRva251bSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgc3RhcnRsaW5lID0gVHJ1ZQorICAgICAgICBmb3IgdG9rIGluIGl0ZXJhYmxlOgorICAgICAgICAgICAgdG9rbnVtLCB0b2t2YWwgPSB0b2tbOjJdCisKKyAgICAgICAgICAgIGlmIHRva251bSBpbiAoTkFNRSwgTlVNQkVSKToKKyAgICAgICAgICAgICAgICB0b2t2YWwgKz0gJyAnCisKKyAgICAgICAgICAgIGlmIHRva251bSA9PSBJTkRFTlQ6CisgICAgICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQodG9rdmFsKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRva251bSA9PSBERURFTlQ6CisgICAgICAgICAgICAgICAgaW5kZW50cy5wb3AoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRva251bSBpbiAoTkVXTElORSwgTkwpOgorICAgICAgICAgICAgICAgIHN0YXJ0bGluZSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYgc3RhcnRsaW5lIGFuZCBpbmRlbnRzOgorICAgICAgICAgICAgICAgIHRva3NfYXBwZW5kKGluZGVudHNbLTFdKQorICAgICAgICAgICAgICAgIHN0YXJ0bGluZSA9IEZhbHNlCisgICAgICAgICAgICB0b2tzX2FwcGVuZCh0b2t2YWwpCisKK2Nvb2tpZV9yZSA9IHJlLmNvbXBpbGUoImNvZGluZ1s6PV1ccyooWy1cdy5dKykiKQorCitkZWYgX2dldF9ub3JtYWxfbmFtZShvcmlnX2VuYyk6CisgICAgIiIiSW1pdGF0ZXMgZ2V0X25vcm1hbF9uYW1lIGluIHRva2VuaXplci5jLiIiIgorICAgICMgT25seSBjYXJlIGFib3V0IHRoZSBmaXJzdCAxMiBjaGFyYWN0ZXJzLgorICAgIGVuYyA9IG9yaWdfZW5jWzoxMl0ubG93ZXIoKS5yZXBsYWNlKCJfIiwgIi0iKQorICAgIGlmIGVuYyA9PSAidXRmLTgiIG9yIGVuYy5zdGFydHN3aXRoKCJ1dGYtOC0iKToKKyAgICAgICAgcmV0dXJuICJ1dGYtOCIKKyAgICBpZiBlbmMgaW4gKCJsYXRpbi0xIiwgImlzby04ODU5LTEiLCAiaXNvLWxhdGluLTEiKSBvciBcCisgICAgICAgZW5jLnN0YXJ0c3dpdGgoKCJsYXRpbi0xLSIsICJpc28tODg1OS0xLSIsICJpc28tbGF0aW4tMS0iKSk6CisgICAgICAgIHJldHVybiAiaXNvLTg4NTktMSIKKyAgICByZXR1cm4gb3JpZ19lbmMKKworZGVmIGRldGVjdF9lbmNvZGluZyhyZWFkbGluZSk6CisgICAgIiIiCisgICAgVGhlIGRldGVjdF9lbmNvZGluZygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZWN0IHRoZSBlbmNvZGluZyB0aGF0IHNob3VsZAorICAgIGJlIHVzZWQgdG8gZGVjb2RlIGEgUHl0aG9uIHNvdXJjZSBmaWxlLiBJdCByZXF1aXJlcyBvbmUgYXJnbWVudCwgcmVhZGxpbmUsCisgICAgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSB0b2tlbml6ZSgpIGdlbmVyYXRvci4KKworICAgIEl0IHdpbGwgY2FsbCByZWFkbGluZSBhIG1heGltdW0gb2YgdHdpY2UsIGFuZCByZXR1cm4gdGhlIGVuY29kaW5nIHVzZWQKKyAgICAoYXMgYSBzdHJpbmcpIGFuZCBhIGxpc3Qgb2YgYW55IGxpbmVzIChsZWZ0IGFzIGJ5dGVzKSBpdCBoYXMgcmVhZAorICAgIGluLgorCisgICAgSXQgZGV0ZWN0cyB0aGUgZW5jb2RpbmcgZnJvbSB0aGUgcHJlc2VuY2Ugb2YgYSB1dGYtOCBib20gb3IgYW4gZW5jb2RpbmcKKyAgICBjb29raWUgYXMgc3BlY2lmaWVkIGluIHBlcC0wMjYzLiBJZiBib3RoIGEgYm9tIGFuZCBhIGNvb2tpZSBhcmUgcHJlc2VudCwgYnV0CisgICAgZGlzYWdyZWUsIGEgU3ludGF4RXJyb3Igd2lsbCBiZSByYWlzZWQuIElmIHRoZSBlbmNvZGluZyBjb29raWUgaXMgYW4gaW52YWxpZAorICAgIGNoYXJzZXQsIHJhaXNlIGEgU3ludGF4RXJyb3IuICBOb3RlIHRoYXQgaWYgYSB1dGYtOCBib20gaXMgZm91bmQsCisgICAgJ3V0Zi04LXNpZycgaXMgcmV0dXJuZWQuCisKKyAgICBJZiBubyBlbmNvZGluZyBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIGRlZmF1bHQgb2YgJ3V0Zi04JyB3aWxsIGJlIHJldHVybmVkLgorICAgICIiIgorICAgIGJvbV9mb3VuZCA9IEZhbHNlCisgICAgZW5jb2RpbmcgPSBOb25lCisgICAgZGVmYXVsdCA9ICd1dGYtOCcKKyAgICBkZWYgcmVhZF9vcl9zdG9wKCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiByZWFkbGluZSgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzKCkKKworICAgIGRlZiBmaW5kX2Nvb2tpZShsaW5lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGluZV9zdHJpbmcgPSBsaW5lLmRlY29kZSgnYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBtYXRjaGVzID0gY29va2llX3JlLmZpbmRhbGwobGluZV9zdHJpbmcpCisgICAgICAgIGlmIG5vdCBtYXRjaGVzOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZW5jb2RpbmcgPSBfZ2V0X25vcm1hbF9uYW1lKG1hdGNoZXNbMF0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvZGVjID0gbG9va3VwKGVuY29kaW5nKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICAjIFRoaXMgYmVoYXZpb3VyIG1pbWljcyB0aGUgUHl0aG9uIGludGVycHJldGVyCisgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigidW5rbm93biBlbmNvZGluZzogIiArIGVuY29kaW5nKQorCisgICAgICAgIGlmIGJvbV9mb3VuZDoKKyAgICAgICAgICAgIGlmIGNvZGVjLm5hbWUgIT0gJ3V0Zi04JzoKKyAgICAgICAgICAgICAgICAjIFRoaXMgYmVoYXZpb3VyIG1pbWljcyB0aGUgUHl0aG9uIGludGVycHJldGVyCisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoJ2VuY29kaW5nIHByb2JsZW06IHV0Zi04JykKKyAgICAgICAgICAgIGVuY29kaW5nICs9ICctc2lnJworICAgICAgICByZXR1cm4gZW5jb2RpbmcKKworICAgIGZpcnN0ID0gcmVhZF9vcl9zdG9wKCkKKyAgICBpZiBmaXJzdC5zdGFydHN3aXRoKEJPTV9VVEY4KToKKyAgICAgICAgYm9tX2ZvdW5kID0gVHJ1ZQorICAgICAgICBmaXJzdCA9IGZpcnN0WzM6XQorICAgICAgICBkZWZhdWx0ID0gJ3V0Zi04LXNpZycKKyAgICBpZiBub3QgZmlyc3Q6CisgICAgICAgIHJldHVybiBkZWZhdWx0LCBbXQorCisgICAgZW5jb2RpbmcgPSBmaW5kX2Nvb2tpZShmaXJzdCkKKyAgICBpZiBlbmNvZGluZzoKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nLCBbZmlyc3RdCisKKyAgICBzZWNvbmQgPSByZWFkX29yX3N0b3AoKQorICAgIGlmIG5vdCBzZWNvbmQ6CisgICAgICAgIHJldHVybiBkZWZhdWx0LCBbZmlyc3RdCisKKyAgICBlbmNvZGluZyA9IGZpbmRfY29va2llKHNlY29uZCkKKyAgICBpZiBlbmNvZGluZzoKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nLCBbZmlyc3QsIHNlY29uZF0KKworICAgIHJldHVybiBkZWZhdWx0LCBbZmlyc3QsIHNlY29uZF0KKworZGVmIHVudG9rZW5pemUoaXRlcmFibGUpOgorICAgICIiIlRyYW5zZm9ybSB0b2tlbnMgYmFjayBpbnRvIFB5dGhvbiBzb3VyY2UgY29kZS4KKworICAgIEVhY2ggZWxlbWVudCByZXR1cm5lZCBieSB0aGUgaXRlcmFibGUgbXVzdCBiZSBhIHRva2VuIHNlcXVlbmNlCisgICAgd2l0aCBhdCBsZWFzdCB0d28gZWxlbWVudHMsIGEgdG9rZW4gbnVtYmVyIGFuZCB0b2tlbiB2YWx1ZS4gIElmCisgICAgb25seSB0d28gdG9rZW5zIGFyZSBwYXNzZWQsIHRoZSByZXN1bHRpbmcgb3V0cHV0IGlzIHBvb3IuCisKKyAgICBSb3VuZC10cmlwIGludmFyaWFudCBmb3IgZnVsbCBpbnB1dDoKKyAgICAgICAgVW50b2tlbml6ZWQgc291cmNlIHdpbGwgbWF0Y2ggaW5wdXQgc291cmNlIGV4YWN0bHkKKworICAgIFJvdW5kLXRyaXAgaW52YXJpYW50IGZvciBsaW1pdGVkIGludHB1dDoKKyAgICAgICAgIyBPdXRwdXQgdGV4dCB3aWxsIHRva2VuaXplIHRoZSBiYWNrIHRvIHRoZSBpbnB1dAorICAgICAgICB0MSA9IFt0b2tbOjJdIGZvciB0b2sgaW4gZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpXQorICAgICAgICBuZXdjb2RlID0gdW50b2tlbml6ZSh0MSkKKyAgICAgICAgcmVhZGxpbmUgPSBpdGVyKG5ld2NvZGUuc3BsaXRsaW5lcygxKSkubmV4dAorICAgICAgICB0MiA9IFt0b2tbOjJdIGZvciB0b2tpbiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpXQorICAgICAgICBhc3NlcnQgdDEgPT0gdDIKKyAgICAiIiIKKyAgICB1dCA9IFVudG9rZW5pemVyKCkKKyAgICByZXR1cm4gdXQudW50b2tlbml6ZShpdGVyYWJsZSkKKworZGVmIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSk6CisgICAgIiIiCisgICAgVGhlIGdlbmVyYXRlX3Rva2VucygpIGdlbmVyYXRvciByZXF1aXJlcyBvbmUgYXJnbWVudCwgcmVhZGxpbmUsIHdoaWNoCisgICAgbXVzdCBiZSBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlCisgICAgcmVhZGxpbmUoKSBtZXRob2Qgb2YgYnVpbHQtaW4gZmlsZSBvYmplY3RzLiBFYWNoIGNhbGwgdG8gdGhlIGZ1bmN0aW9uCisgICAgc2hvdWxkIHJldHVybiBvbmUgbGluZSBvZiBpbnB1dCBhcyBhIHN0cmluZy4gIEFsdGVybmF0ZWx5LCByZWFkbGluZQorICAgIGNhbiBiZSBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRlcm1pbmF0aW5nIHdpdGggU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcmVhZGxpbmUgPSBvcGVuKG15ZmlsZSkubmV4dCAgICAjIEV4YW1wbGUgb2YgYWx0ZXJuYXRlIHJlYWRsaW5lCisKKyAgICBUaGUgZ2VuZXJhdG9yIHByb2R1Y2VzIDUtdHVwbGVzIHdpdGggdGhlc2UgbWVtYmVyczogdGhlIHRva2VuIHR5cGU7IHRoZQorICAgIHRva2VuIHN0cmluZzsgYSAyLXR1cGxlIChzcm93LCBzY29sKSBvZiBpbnRzIHNwZWNpZnlpbmcgdGhlIHJvdyBhbmQKKyAgICBjb2x1bW4gd2hlcmUgdGhlIHRva2VuIGJlZ2lucyBpbiB0aGUgc291cmNlOyBhIDItdHVwbGUgKGVyb3csIGVjb2wpIG9mCisgICAgaW50cyBzcGVjaWZ5aW5nIHRoZSByb3cgYW5kIGNvbHVtbiB3aGVyZSB0aGUgdG9rZW4gZW5kcyBpbiB0aGUgc291cmNlOworICAgIGFuZCB0aGUgbGluZSBvbiB3aGljaCB0aGUgdG9rZW4gd2FzIGZvdW5kLiBUaGUgbGluZSBwYXNzZWQgaXMgdGhlCisgICAgbG9naWNhbCBsaW5lOyBjb250aW51YXRpb24gbGluZXMgYXJlIGluY2x1ZGVkLgorICAgICIiIgorICAgIGxudW0gPSBwYXJlbmxldiA9IGNvbnRpbnVlZCA9IDAKKyAgICBuYW1lY2hhcnMsIG51bWNoYXJzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyAnXycsICcwMTIzNDU2Nzg5JworICAgIGNvbnRzdHIsIG5lZWRjb250ID0gJycsIDAKKyAgICBjb250bGluZSA9IE5vbmUKKyAgICBpbmRlbnRzID0gWzBdCisKKyAgICB3aGlsZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb29wIG92ZXIgbGluZXMgaW4gc3RyZWFtCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmUgPSByZWFkbGluZSgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgbGluZSA9ICcnCisgICAgICAgIGxudW0gPSBsbnVtICsgMQorICAgICAgICBwb3MsIG1heCA9IDAsIGxlbihsaW5lKQorCisgICAgICAgIGlmIGNvbnRzdHI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVkIHN0cmluZworICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVG9rZW5FcnJvciwgKCJFT0YgaW4gbXVsdGktbGluZSBzdHJpbmciLCBzdHJzdGFydCkKKyAgICAgICAgICAgIGVuZG1hdGNoID0gZW5kcHJvZy5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgZW5kbWF0Y2g6CisgICAgICAgICAgICAgICAgcG9zID0gZW5kID0gZW5kbWF0Y2guZW5kKDApCisgICAgICAgICAgICAgICAgeWllbGQgKFNUUklORywgY29udHN0ciArIGxpbmVbOmVuZF0sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0LCAobG51bSwgZW5kKSwgY29udGxpbmUgKyBsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRzdHIsIG5lZWRjb250ID0gJycsIDAKKyAgICAgICAgICAgICAgICBjb250bGluZSA9IE5vbmUKKyAgICAgICAgICAgIGVsaWYgbmVlZGNvbnQgYW5kIGxpbmVbLTI6XSAhPSAnXFxcbicgYW5kIGxpbmVbLTM6XSAhPSAnXFxcclxuJzoKKyAgICAgICAgICAgICAgICB5aWVsZCAoRVJST1JUT0tFTiwgY29udHN0ciArIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCwgKGxudW0sIGxlbihsaW5lKSksIGNvbnRsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRzdHIgPSAnJworICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gTm9uZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbnRzdHIgPSBjb250c3RyICsgbGluZQorICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gY29udGxpbmUgKyBsaW5lCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBlbGlmIHBhcmVubGV2ID09IDAgYW5kIG5vdCBjb250aW51ZWQ6ICAjIG5ldyBzdGF0ZW1lbnQKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAgICAgY29sdW1uID0gMAorICAgICAgICAgICAgd2hpbGUgcG9zIDwgbWF4OiAgICAgICAgICAgICAgICAgICAjIG1lYXN1cmUgbGVhZGluZyB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgaWYgbGluZVtwb3NdID09ICcgJzogY29sdW1uID0gY29sdW1uICsgMQorICAgICAgICAgICAgICAgIGVsaWYgbGluZVtwb3NdID09ICdcdCc6IGNvbHVtbiA9IChjb2x1bW4vL3RhYnNpemUgKyAxKSp0YWJzaXplCisgICAgICAgICAgICAgICAgZWxpZiBsaW5lW3Bvc10gPT0gJ1xmJzogY29sdW1uID0gMAorICAgICAgICAgICAgICAgIGVsc2U6IGJyZWFrCisgICAgICAgICAgICAgICAgcG9zID0gcG9zICsgMQorICAgICAgICAgICAgaWYgcG9zID09IG1heDogYnJlYWsKKworICAgICAgICAgICAgaWYgbGluZVtwb3NdIGluICcjXHJcbic6ICAgICAgICAgICAjIHNraXAgY29tbWVudHMgb3IgYmxhbmsgbGluZXMKKyAgICAgICAgICAgICAgICBpZiBsaW5lW3Bvc10gPT0gJyMnOgorICAgICAgICAgICAgICAgICAgICBjb21tZW50X3Rva2VuID0gbGluZVtwb3M6XS5yc3RyaXAoJ1xyXG4nKQorICAgICAgICAgICAgICAgICAgICBubF9wb3MgPSBwb3MgKyBsZW4oY29tbWVudF90b2tlbikKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKENPTU1FTlQsIGNvbW1lbnRfdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgcG9zKSwgKGxudW0sIHBvcyArIGxlbihjb21tZW50X3Rva2VuKSksIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOTCwgbGluZVtubF9wb3M6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBubF9wb3MpLCAobG51bSwgbGVuKGxpbmUpKSwgbGluZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoKE5MLCBDT01NRU5UKVtsaW5lW3Bvc10gPT0gJyMnXSwgbGluZVtwb3M6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsbnVtLCBwb3MpLCAobG51bSwgbGVuKGxpbmUpKSwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBjb2x1bW4gPiBpbmRlbnRzWy0xXTogICAgICAgICAgICMgY291bnQgaW5kZW50cyBvciBkZWRlbnRzCisgICAgICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQoY29sdW1uKQorICAgICAgICAgICAgICAgIHlpZWxkIChJTkRFTlQsIGxpbmVbOnBvc10sIChsbnVtLCAwKSwgKGxudW0sIHBvcyksIGxpbmUpCisgICAgICAgICAgICB3aGlsZSBjb2x1bW4gPCBpbmRlbnRzWy0xXToKKyAgICAgICAgICAgICAgICBpZiBjb2x1bW4gbm90IGluIGluZGVudHM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGVudGF0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggYW55IG91dGVyIGluZGVudGF0aW9uIGxldmVsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiPHRva2VuaXplPiIsIGxudW0sIHBvcywgbGluZSkpCisgICAgICAgICAgICAgICAgaW5kZW50cyA9IGluZGVudHNbOi0xXQorICAgICAgICAgICAgICAgIHlpZWxkIChERURFTlQsICcnLCAobG51bSwgcG9zKSwgKGxudW0sIHBvcyksIGxpbmUpCisKKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RhdGVtZW50CisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByYWlzZSBUb2tlbkVycm9yLCAoIkVPRiBpbiBtdWx0aS1saW5lIHN0YXRlbWVudCIsIChsbnVtLCAwKSkKKyAgICAgICAgICAgIGNvbnRpbnVlZCA9IDAKKworICAgICAgICB3aGlsZSBwb3MgPCBtYXg6CisgICAgICAgICAgICBwc2V1ZG9tYXRjaCA9IHBzZXVkb3Byb2cubWF0Y2gobGluZSwgcG9zKQorICAgICAgICAgICAgaWYgcHNldWRvbWF0Y2g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNjYW4gZm9yIHRva2VucworICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBwc2V1ZG9tYXRjaC5zcGFuKDEpCisgICAgICAgICAgICAgICAgc3BvcywgZXBvcywgcG9zID0gKGxudW0sIHN0YXJ0KSwgKGxudW0sIGVuZCksIGVuZAorICAgICAgICAgICAgICAgIHRva2VuLCBpbml0aWFsID0gbGluZVtzdGFydDplbmRdLCBsaW5lW3N0YXJ0XQorCisgICAgICAgICAgICAgICAgaWYgaW5pdGlhbCBpbiBudW1jaGFycyBvciBcCisgICAgICAgICAgICAgICAgICAgKGluaXRpYWwgPT0gJy4nIGFuZCB0b2tlbiAhPSAnLicpOiAgICAgICMgb3JkaW5hcnkgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOVU1CRVIsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiAnXHJcbic6CisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmUgPSBORVdMSU5FCisgICAgICAgICAgICAgICAgICAgIGlmIHBhcmVubGV2ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmUgPSBOTAorICAgICAgICAgICAgICAgICAgICB5aWVsZCAobmV3bGluZSwgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCisgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsID09ICcjJzoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCB0b2tlbi5lbmRzd2l0aCgiXG4iKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoQ09NTUVOVCwgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCisgICAgICAgICAgICAgICAgZWxpZiB0b2tlbiBpbiB0cmlwbGVfcXVvdGVkOgorICAgICAgICAgICAgICAgICAgICBlbmRwcm9nID0gZW5kcHJvZ3NbdG9rZW5dCisgICAgICAgICAgICAgICAgICAgIGVuZG1hdGNoID0gZW5kcHJvZy5tYXRjaChsaW5lLCBwb3MpCisgICAgICAgICAgICAgICAgICAgIGlmIGVuZG1hdGNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWxsIG9uIG9uZSBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBlbmRtYXRjaC5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuID0gbGluZVtzdGFydDpwb3NdCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCAoU1RSSU5HLCB0b2tlbiwgc3BvcywgKGxudW0sIHBvcyksIGxpbmUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCA9IChsbnVtLCBzdGFydCkgICAgICAgICAgICMgbXVsdGlwbGUgbGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIgPSBsaW5lW3N0YXJ0Ol0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gc2luZ2xlX3F1b3RlZCBvciBcCisgICAgICAgICAgICAgICAgICAgIHRva2VuWzoyXSBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjNdIGluIHNpbmdsZV9xdW90ZWQ6CisgICAgICAgICAgICAgICAgICAgIGlmIHRva2VuWy0xXSA9PSAnXG4nOiAgICAgICAgICAgICAgICAgICMgY29udGludWVkIHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RhcnQgPSAobG51bSwgc3RhcnQpCisgICAgICAgICAgICAgICAgICAgICAgICBlbmRwcm9nID0gKGVuZHByb2dzW2luaXRpYWxdIG9yIGVuZHByb2dzW3Rva2VuWzFdXSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwcm9nc1t0b2tlblsyXV0pCisgICAgICAgICAgICAgICAgICAgICAgICBjb250c3RyLCBuZWVkY29udCA9IGxpbmVbc3RhcnQ6XSwgMQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGxpbmUgPSBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9yZGluYXJ5IHN0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgKFNUUklORywgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCisgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsIGluIG5hbWVjaGFyczogICAgICAgICAgICAgICAgICMgb3JkaW5hcnkgbmFtZQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoTkFNRSwgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCisgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsID09ICdcXCc6ICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVkIHN0bXQKKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIHlpZWxkIGlzIG5ldzsgbmVlZGVkIGZvciBiZXR0ZXIgaWRlbXBvdGVuY3k6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOTCwgdG9rZW4sIHNwb3MsIChsbnVtLCBwb3MpLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZWQgPSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgaW5pdGlhbCBpbiAnKFt7JzogcGFyZW5sZXYgPSBwYXJlbmxldiArIDEKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsIGluICcpXX0nOiBwYXJlbmxldiA9IHBhcmVubGV2IC0gMQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoT1AsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCAoRVJST1JUT0tFTiwgbGluZVtwb3NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxudW0sIHBvcyksIChsbnVtLCBwb3MrMSksIGxpbmUpCisgICAgICAgICAgICAgICAgcG9zID0gcG9zICsgMQorCisgICAgZm9yIGluZGVudCBpbiBpbmRlbnRzWzE6XTogICAgICAgICAgICAgICAgICMgcG9wIHJlbWFpbmluZyBpbmRlbnQgbGV2ZWxzCisgICAgICAgIHlpZWxkIChERURFTlQsICcnLCAobG51bSwgMCksIChsbnVtLCAwKSwgJycpCisgICAgeWllbGQgKEVORE1BUktFUiwgJycsIChsbnVtLCAwKSwgKGxudW0sIDApLCAnJykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzogICAgICAgICAgICAgICAgICAgICAjIHRlc3RpbmcKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6IHRva2VuaXplKG9wZW4oc3lzLmFyZ3ZbMV0pLnJlYWRsaW5lKQorICAgIGVsc2U6IHRva2VuaXplKHN5cy5zdGRpbi5yZWFkbGluZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDZlODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9wZ2VuMi90b2tlbml6ZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODIxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcGdlbjIvdG9rZW5pemUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9weWdyYW0ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHlncmFtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMWZmMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHlncmFtLnB5CkBAIC0wLDAgKzEsNDAgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiRXhwb3J0IHRoZSBQeXRob24gZ3JhbW1hciBhbmQgc3ltYm9scy4iIiIKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IG9zCisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuCitmcm9tIC5wZ2VuMiBpbXBvcnQgZHJpdmVyCitmcm9tIC4gaW1wb3J0IHB5dHJlZQorCisjIFRoZSBncmFtbWFyIGZpbGUKK19HUkFNTUFSX0ZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgIkdyYW1tYXIudHh0IikKK19QQVRURVJOX0dSQU1NQVJfRklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQYXR0ZXJuR3JhbW1hci50eHQiKQorCisKK2NsYXNzIFN5bWJvbHMob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBncmFtbWFyKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZXIuCisKKyAgICAgICAgQ3JlYXRlcyBhbiBhdHRyaWJ1dGUgZm9yIGVhY2ggZ3JhbW1hciBzeW1ib2wgKG5vbnRlcm1pbmFsKSwKKyAgICAgICAgd2hvc2UgdmFsdWUgaXMgdGhlIHN5bWJvbCdzIHR5cGUgKGFuIGludCA+PSAyNTYpLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIG5hbWUsIHN5bWJvbCBpbiBncmFtbWFyLnN5bWJvbDJudW1iZXIuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIHN5bWJvbCkKKworCitweXRob25fZ3JhbW1hciA9IGRyaXZlci5sb2FkX2dyYW1tYXIoX0dSQU1NQVJfRklMRSkKKworcHl0aG9uX3N5bWJvbHMgPSBTeW1ib2xzKHB5dGhvbl9ncmFtbWFyKQorCitweXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQgPSBweXRob25fZ3JhbW1hci5jb3B5KCkKK2RlbCBweXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQua2V5d29yZHNbInByaW50Il0KKworcGF0dGVybl9ncmFtbWFyID0gZHJpdmVyLmxvYWRfZ3JhbW1hcihfUEFUVEVSTl9HUkFNTUFSX0ZJTEUpCitwYXR0ZXJuX3N5bWJvbHMgPSBTeW1ib2xzKHBhdHRlcm5fZ3JhbW1hcikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9weWdyYW0ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5Z3JhbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiM2FkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9weWdyYW0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9weWdyYW0ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5Z3JhbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiM2FkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy9weWdyYW0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9weXRyZWUucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHl0cmVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWNhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHl0cmVlLnB5CkBAIC0wLDAgKzEsODg3IEBACisjIENvcHlyaWdodCAyMDA2IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIgorUHl0aG9uIHBhcnNlIHRyZWUgZGVmaW5pdGlvbnMuCisKK1RoaXMgaXMgYSB2ZXJ5IGNvbmNyZXRlIHBhcnNlIHRyZWU7IHdlIG5lZWQgdG8ga2VlcCBldmVyeSB0b2tlbiBhbmQKK2V2ZW4gdGhlIGNvbW1lbnRzIGFuZCB3aGl0ZXNwYWNlIGJldHdlZW4gdG9rZW5zLgorCitUaGVyZSdzIGFsc28gYSBwYXR0ZXJuIG1hdGNoaW5nIGltcGxlbWVudGF0aW9uIGhlcmUuCisiIiIKKworX19hdXRob3JfXyA9ICJHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BweXRob24ub3JnPiIKKworaW1wb3J0IHN5cworaW1wb3J0IHdhcm5pbmdzCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitIVUdFID0gMHg3RkZGRkZGRiAgIyBtYXhpbXVtIHJlcGVhdCBjb3VudCwgZGVmYXVsdCBtYXgKKworX3R5cGVfcmVwcnMgPSB7fQorZGVmIHR5cGVfcmVwcih0eXBlX251bSk6CisgICAgZ2xvYmFsIF90eXBlX3JlcHJzCisgICAgaWYgbm90IF90eXBlX3JlcHJzOgorICAgICAgICBmcm9tIC5weWdyYW0gaW1wb3J0IHB5dGhvbl9zeW1ib2xzCisgICAgICAgICMgcHJpbnRpbmcgdG9rZW5zIGlzIHBvc3NpYmxlIGJ1dCBub3QgYXMgdXNlZnVsCisgICAgICAgICMgZnJvbSAucGdlbjIgaW1wb3J0IHRva2VuIC8vIHRva2VuLl9fZGljdF9fLml0ZW1zKCk6CisgICAgICAgIGZvciBuYW1lLCB2YWwgaW4gcHl0aG9uX3N5bWJvbHMuX19kaWN0X18uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHR5cGUodmFsKSA9PSBpbnQ6IF90eXBlX3JlcHJzW3ZhbF0gPSBuYW1lCisgICAgcmV0dXJuIF90eXBlX3JlcHJzLnNldGRlZmF1bHQodHlwZV9udW0sIHR5cGVfbnVtKQorCitjbGFzcyBCYXNlKG9iamVjdCk6CisKKyAgICAiIiIKKyAgICBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBOb2RlIGFuZCBMZWFmLgorCisgICAgVGhpcyBwcm92aWRlcyBzb21lIGRlZmF1bHQgZnVuY3Rpb25hbGl0eSBhbmQgYm9pbGVycGxhdGUgdXNpbmcgdGhlCisgICAgdGVtcGxhdGUgcGF0dGVybi4KKworICAgIEEgbm9kZSBtYXkgYmUgYSBzdWJub2RlIG9mIGF0IG1vc3Qgb25lIHBhcmVudC4KKyAgICAiIiIKKworICAgICMgRGVmYXVsdCB2YWx1ZXMgZm9yIGluc3RhbmNlIHZhcmlhYmxlcworICAgIHR5cGUgPSBOb25lICAgICMgaW50OiB0b2tlbiBudW1iZXIgKDwgMjU2KSBvciBzeW1ib2wgbnVtYmVyICg+PSAyNTYpCisgICAgcGFyZW50ID0gTm9uZSAgIyBQYXJlbnQgbm9kZSBwb2ludGVyLCBvciBOb25lCisgICAgY2hpbGRyZW4gPSAoKSAgIyBUdXBsZSBvZiBzdWJub2RlcworICAgIHdhc19jaGFuZ2VkID0gRmFsc2UKKyAgICB3YXNfY2hlY2tlZCA9IEZhbHNlCisKKyAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAiIiJDb25zdHJ1Y3RvciB0aGF0IHByZXZlbnRzIEJhc2UgZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIiIiCisgICAgICAgIGFzc2VydCBjbHMgaXMgbm90IEJhc2UsICJDYW5ub3QgaW5zdGFudGlhdGUgQmFzZSIKKyAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGNscykKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29tcGFyZSB0d28gbm9kZXMgZm9yIGVxdWFsaXR5LgorCisgICAgICAgIFRoaXMgY2FsbHMgdGhlIG1ldGhvZCBfZXEoKS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX19jbGFzc19fIGlzIG5vdCBvdGhlci5fX2NsYXNzX186CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VxKG90aGVyKQorCisgICAgX19oYXNoX18gPSBOb25lICMgRm9yIFB5MyBjb21wYXRpYmlsaXR5LgorCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIgorICAgICAgICBDb21wYXJlIHR3byBub2RlcyBmb3IgaW5lcXVhbGl0eS4KKworICAgICAgICBUaGlzIGNhbGxzIHRoZSBtZXRob2QgX2VxKCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBub3Qgb3RoZXIuX19jbGFzc19fOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fZXEob3RoZXIpCisKKyAgICBkZWYgX2VxKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiCisgICAgICAgIENvbXBhcmUgdHdvIG5vZGVzIGZvciBlcXVhbGl0eS4KKworICAgICAgICBUaGlzIGlzIGNhbGxlZCBieSBfX2VxX18gYW5kIF9fbmVfXy4gIEl0IGlzIG9ubHkgY2FsbGVkIGlmIHRoZSB0d28gbm9kZXMKKyAgICAgICAgaGF2ZSB0aGUgc2FtZSB0eXBlLiAgVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjb25jcmV0ZSBzdWJjbGFzcy4KKyAgICAgICAgTm9kZXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIHN0cnVjdHVyZSwKKyAgICAgICAgaWdub3JpbmcgdGhlIHByZWZpeCBzdHJpbmcgYW5kIG90aGVyIGNvbnRleHQgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgY2xvbmUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBjbG9uZWQgKGRlZXApIGNvcHkgb2Ygc2VsZi4KKworICAgICAgICBUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbmNyZXRlIHN1YmNsYXNzLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHBvc3Rfb3JkZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBwb3N0LW9yZGVyIGl0ZXJhdG9yIGZvciB0aGUgdHJlZS4KKworICAgICAgICBUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvbmNyZXRlIHN1YmNsYXNzLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIHByZV9vcmRlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIHByZS1vcmRlciBpdGVyYXRvciBmb3IgdGhlIHRyZWUuCisKKyAgICAgICAgVGhpcyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBjb25jcmV0ZSBzdWJjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBzZXRfcHJlZml4KHNlbGYsIHByZWZpeCk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIHByZWZpeCBmb3IgdGhlIG5vZGUgKHNlZSBMZWFmIGNsYXNzKS4KKworICAgICAgICBERVBSRUNBVEVEOyB1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSBkaXJlY3RseS4KKyAgICAgICAgIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oInNldF9wcmVmaXgoKSBpcyBkZXByZWNhdGVkOyB1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisgICAgICAgIHNlbGYucHJlZml4ID0gcHJlZml4CisKKyAgICBkZWYgZ2V0X3ByZWZpeChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgcHJlZml4IGZvciB0aGUgbm9kZSAoc2VlIExlYWYgY2xhc3MpLgorCisgICAgICAgIERFUFJFQ0FURUQ7IHVzZSB0aGUgcHJlZml4IHByb3BlcnR5IGRpcmVjdGx5LgorICAgICAgICAiIiIKKyAgICAgICAgd2FybmluZ3Mud2FybigiZ2V0X3ByZWZpeCgpIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgcHJlZml4IHByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgcmV0dXJuIHNlbGYucHJlZml4CisKKyAgICBkZWYgcmVwbGFjZShzZWxmLCBuZXcpOgorICAgICAgICAiIiJSZXBsYWNlIHRoaXMgbm9kZSB3aXRoIGEgbmV3IG9uZSBpbiB0aGUgcGFyZW50LiIiIgorICAgICAgICBhc3NlcnQgc2VsZi5wYXJlbnQgaXMgbm90IE5vbmUsIHN0cihzZWxmKQorICAgICAgICBhc3NlcnQgbmV3IGlzIG5vdCBOb25lCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5ldywgbGlzdCk6CisgICAgICAgICAgICBuZXcgPSBbbmV3XQorICAgICAgICBsX2NoaWxkcmVuID0gW10KKyAgICAgICAgZm91bmQgPSBGYWxzZQorICAgICAgICBmb3IgY2ggaW4gc2VsZi5wYXJlbnQuY2hpbGRyZW46CisgICAgICAgICAgICBpZiBjaCBpcyBzZWxmOgorICAgICAgICAgICAgICAgIGFzc2VydCBub3QgZm91bmQsIChzZWxmLnBhcmVudC5jaGlsZHJlbiwgc2VsZiwgbmV3KQorICAgICAgICAgICAgICAgIGlmIG5ldyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbF9jaGlsZHJlbi5leHRlbmQobmV3KQorICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsX2NoaWxkcmVuLmFwcGVuZChjaCkKKyAgICAgICAgYXNzZXJ0IGZvdW5kLCAoc2VsZi5jaGlsZHJlbiwgc2VsZiwgbmV3KQorICAgICAgICBzZWxmLnBhcmVudC5jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi5wYXJlbnQuY2hpbGRyZW4gPSBsX2NoaWxkcmVuCisgICAgICAgIGZvciB4IGluIG5ldzoKKyAgICAgICAgICAgIHgucGFyZW50ID0gc2VsZi5wYXJlbnQKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisKKyAgICBkZWYgZ2V0X2xpbmVubyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsaW5lIG51bWJlciB3aGljaCBnZW5lcmF0ZWQgdGhlIGludm9jYW50IG5vZGUuIiIiCisgICAgICAgIG5vZGUgPSBzZWxmCisgICAgICAgIHdoaWxlIG5vdCBpc2luc3RhbmNlKG5vZGUsIExlYWYpOgorICAgICAgICAgICAgaWYgbm90IG5vZGUuY2hpbGRyZW46CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBub2RlID0gbm9kZS5jaGlsZHJlblswXQorICAgICAgICByZXR1cm4gbm9kZS5saW5lbm8KKworICAgIGRlZiBjaGFuZ2VkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBhcmVudDoKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmNoYW5nZWQoKQorICAgICAgICBzZWxmLndhc19jaGFuZ2VkID0gVHJ1ZQorCisgICAgZGVmIHJlbW92ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlbW92ZSB0aGUgbm9kZSBmcm9tIHRoZSB0cmVlLiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbm9kZSBpbiBpdHMKKyAgICAgICAgcGFyZW50J3MgY2hpbGRyZW4gYmVmb3JlIGl0IHdhcyByZW1vdmVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQ6CisgICAgICAgICAgICBmb3IgaSwgbm9kZSBpbiBlbnVtZXJhdGUoc2VsZi5wYXJlbnQuY2hpbGRyZW4pOgorICAgICAgICAgICAgICAgIGlmIG5vZGUgaXMgc2VsZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnQuY2hhbmdlZCgpCisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLnBhcmVudC5jaGlsZHJlbltpXQorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuZXh0X3NpYmxpbmcoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgbm9kZSBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGludm9jYW50IGluIHRoZWlyIHBhcmVudCdzIGNoaWxkcmVuCisgICAgICAgIGxpc3QuIElmIHRoZSBpbnZvY2FudCBkb2VzIG5vdCBoYXZlIGEgbmV4dCBzaWJsaW5nLCBpdCBpcyBOb25lCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnBhcmVudCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAjIENhbid0IHVzZSBpbmRleCgpOyB3ZSBuZWVkIHRvIHRlc3QgYnkgaWRlbnRpdHkKKyAgICAgICAgZm9yIGksIGNoaWxkIGluIGVudW1lcmF0ZShzZWxmLnBhcmVudC5jaGlsZHJlbik6CisgICAgICAgICAgICBpZiBjaGlsZCBpcyBzZWxmOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50LmNoaWxkcmVuW2krMV0KKyAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwcmV2X3NpYmxpbmcoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgbm9kZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgdGhlIGludm9jYW50IGluIHRoZWlyIHBhcmVudCdzIGNoaWxkcmVuCisgICAgICAgIGxpc3QuIElmIHRoZSBpbnZvY2FudCBkb2VzIG5vdCBoYXZlIGEgcHJldmlvdXMgc2libGluZywgaXQgaXMgTm9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYucGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgQ2FuJ3QgdXNlIGluZGV4KCk7IHdlIG5lZWQgdG8gdGVzdCBieSBpZGVudGl0eQorICAgICAgICBmb3IgaSwgY2hpbGQgaW4gZW51bWVyYXRlKHNlbGYucGFyZW50LmNoaWxkcmVuKToKKyAgICAgICAgICAgIGlmIGNoaWxkIGlzIHNlbGY6CisgICAgICAgICAgICAgICAgaWYgaSA9PSAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5jaGlsZHJlbltpLTFdCisKKyAgICBkZWYgbGVhdmVzKHNlbGYpOgorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIGZvciB4IGluIGNoaWxkLmxlYXZlcygpOgorICAgICAgICAgICAgICAgIHlpZWxkIHgKKworICAgIGRlZiBkZXB0aChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wYXJlbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiAxICsgc2VsZi5wYXJlbnQuZGVwdGgoKQorCisgICAgZGVmIGdldF9zdWZmaXgoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIHN0cmluZyBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIGludm9jYW50IG5vZGUuIFRoaXMgaXMKKyAgICAgICAgZWZmZWN0aXZlbHkgZXF1aXZhbGVudCB0byBub2RlLm5leHRfc2libGluZy5wcmVmaXgKKyAgICAgICAgIiIiCisgICAgICAgIG5leHRfc2liID0gc2VsZi5uZXh0X3NpYmxpbmcKKyAgICAgICAgaWYgbmV4dF9zaWIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiB1IiIKKyAgICAgICAgcmV0dXJuIG5leHRfc2liLnByZWZpeAorCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gdW5pY29kZShzZWxmKS5lbmNvZGUoImFzY2lpIikKKworY2xhc3MgTm9kZShCYXNlKToKKworICAgICIiIkNvbmNyZXRlIGltcGxlbWVudGF0aW9uIGZvciBpbnRlcmlvciBub2Rlcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLHR5cGUsIGNoaWxkcmVuLAorICAgICAgICAgICAgICAgICBjb250ZXh0PU5vbmUsCisgICAgICAgICAgICAgICAgIHByZWZpeD1Ob25lLAorICAgICAgICAgICAgICAgICBmaXhlcnNfYXBwbGllZD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemVyLgorCisgICAgICAgIFRha2VzIGEgdHlwZSBjb25zdGFudCAoYSBzeW1ib2wgbnVtYmVyID49IDI1NiksIGEgc2VxdWVuY2Ugb2YKKyAgICAgICAgY2hpbGQgbm9kZXMsIGFuZCBhbiBvcHRpb25hbCBjb250ZXh0IGtleXdvcmQgYXJndW1lbnQuCisKKyAgICAgICAgQXMgYSBzaWRlIGVmZmVjdCwgdGhlIHBhcmVudCBwb2ludGVycyBvZiB0aGUgY2hpbGRyZW4gYXJlIHVwZGF0ZWQuCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgdHlwZSA+PSAyNTYsIHR5cGUKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gbGlzdChjaGlsZHJlbikKKyAgICAgICAgZm9yIGNoIGluIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICBhc3NlcnQgY2gucGFyZW50IGlzIE5vbmUsIHJlcHIoY2gpCisgICAgICAgICAgICBjaC5wYXJlbnQgPSBzZWxmCisgICAgICAgIGlmIHByZWZpeCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJlZml4ID0gcHJlZml4CisgICAgICAgIGlmIGZpeGVyc19hcHBsaWVkOgorICAgICAgICAgICAgc2VsZi5maXhlcnNfYXBwbGllZCA9IGZpeGVyc19hcHBsaWVkWzpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZpeGVyc19hcHBsaWVkID0gTm9uZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjYW5vbmljYWwgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiIiIgorICAgICAgICByZXR1cm4gIiVzKCVzLCAlcikiICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfcmVwcihzZWxmLnR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4pCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCisgICAgICAgIFRoaXMgcmVwcm9kdWNlcyB0aGUgaW5wdXQgc291cmNlIGV4YWN0bHkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gdSIiLmpvaW4obWFwKHVuaWNvZGUsIHNlbGYuY2hpbGRyZW4pKQorCisgICAgaWYgc3lzLnZlcnNpb25faW5mbyA+ICgzLCAwKToKKyAgICAgICAgX19zdHJfXyA9IF9fdW5pY29kZV9fCisKKyAgICBkZWYgX2VxKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyZSB0d28gbm9kZXMgZm9yIGVxdWFsaXR5LiIiIgorICAgICAgICByZXR1cm4gKHNlbGYudHlwZSwgc2VsZi5jaGlsZHJlbikgPT0gKG90aGVyLnR5cGUsIG90aGVyLmNoaWxkcmVuKQorCisgICAgZGVmIGNsb25lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBjbG9uZWQgKGRlZXApIGNvcHkgb2Ygc2VsZi4iIiIKKyAgICAgICAgcmV0dXJuIE5vZGUoc2VsZi50eXBlLCBbY2guY2xvbmUoKSBmb3IgY2ggaW4gc2VsZi5jaGlsZHJlbl0sCisgICAgICAgICAgICAgICAgICAgIGZpeGVyc19hcHBsaWVkPXNlbGYuZml4ZXJzX2FwcGxpZWQpCisKKyAgICBkZWYgcG9zdF9vcmRlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcG9zdC1vcmRlciBpdGVyYXRvciBmb3IgdGhlIHRyZWUuIiIiCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgZm9yIG5vZGUgaW4gY2hpbGQucG9zdF9vcmRlcigpOgorICAgICAgICAgICAgICAgIHlpZWxkIG5vZGUKKyAgICAgICAgeWllbGQgc2VsZgorCisgICAgZGVmIHByZV9vcmRlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcHJlLW9yZGVyIGl0ZXJhdG9yIGZvciB0aGUgdHJlZS4iIiIKKyAgICAgICAgeWllbGQgc2VsZgorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5jaGlsZHJlbjoKKyAgICAgICAgICAgIGZvciBub2RlIGluIGNoaWxkLnByZV9vcmRlcigpOgorICAgICAgICAgICAgICAgIHlpZWxkIG5vZGUKKworICAgIGRlZiBfcHJlZml4X2dldHRlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBwcmVjZWRpbmcgdGhpcyBub2RlIGluIHRoZSBpbnB1dC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIHJldHVybiBzZWxmLmNoaWxkcmVuWzBdLnByZWZpeAorCisgICAgZGVmIF9wcmVmaXhfc2V0dGVyKHNlbGYsIHByZWZpeCk6CisgICAgICAgIGlmIHNlbGYuY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLmNoaWxkcmVuWzBdLnByZWZpeCA9IHByZWZpeAorCisgICAgcHJlZml4ID0gcHJvcGVydHkoX3ByZWZpeF9nZXR0ZXIsIF9wcmVmaXhfc2V0dGVyKQorCisgICAgZGVmIHNldF9jaGlsZChzZWxmLCBpLCBjaGlsZCk6CisgICAgICAgICIiIgorICAgICAgICBFcXVpdmFsZW50IHRvICdub2RlLmNoaWxkcmVuW2ldID0gY2hpbGQnLiBUaGlzIG1ldGhvZCBhbHNvIHNldHMgdGhlCisgICAgICAgIGNoaWxkJ3MgcGFyZW50IGF0dHJpYnV0ZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAiIiIKKyAgICAgICAgY2hpbGQucGFyZW50ID0gc2VsZgorICAgICAgICBzZWxmLmNoaWxkcmVuW2ldLnBhcmVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5jaGlsZHJlbltpXSA9IGNoaWxkCisgICAgICAgIHNlbGYuY2hhbmdlZCgpCisKKyAgICBkZWYgaW5zZXJ0X2NoaWxkKHNlbGYsIGksIGNoaWxkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVxdWl2YWxlbnQgdG8gJ25vZGUuY2hpbGRyZW4uaW5zZXJ0KGksIGNoaWxkKScuIFRoaXMgbWV0aG9kIGFsc28gc2V0cworICAgICAgICB0aGUgY2hpbGQncyBwYXJlbnQgYXR0cmlidXRlIGFwcHJvcHJpYXRlbHkuCisgICAgICAgICIiIgorICAgICAgICBjaGlsZC5wYXJlbnQgPSBzZWxmCisgICAgICAgIHNlbGYuY2hpbGRyZW4uaW5zZXJ0KGksIGNoaWxkKQorICAgICAgICBzZWxmLmNoYW5nZWQoKQorCisgICAgZGVmIGFwcGVuZF9jaGlsZChzZWxmLCBjaGlsZCk6CisgICAgICAgICIiIgorICAgICAgICBFcXVpdmFsZW50IHRvICdub2RlLmNoaWxkcmVuLmFwcGVuZChjaGlsZCknLiBUaGlzIG1ldGhvZCBhbHNvIHNldHMgdGhlCisgICAgICAgIGNoaWxkJ3MgcGFyZW50IGF0dHJpYnV0ZSBhcHByb3ByaWF0ZWx5LgorICAgICAgICAiIiIKKyAgICAgICAgY2hpbGQucGFyZW50ID0gc2VsZgorICAgICAgICBzZWxmLmNoaWxkcmVuLmFwcGVuZChjaGlsZCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkKCkKKworCitjbGFzcyBMZWFmKEJhc2UpOgorCisgICAgIiIiQ29uY3JldGUgaW1wbGVtZW50YXRpb24gZm9yIGxlYWYgbm9kZXMuIiIiCisKKyAgICAjIERlZmF1bHQgdmFsdWVzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICBfcHJlZml4ID0gIiIgICMgV2hpdGVzcGFjZSBhbmQgY29tbWVudHMgcHJlY2VkaW5nIHRoaXMgdG9rZW4gaW4gdGhlIGlucHV0CisgICAgbGluZW5vID0gMCAgICAjIExpbmUgd2hlcmUgdGhpcyB0b2tlbiBzdGFydHMgaW4gdGhlIGlucHV0CisgICAgY29sdW1uID0gMCAgICAjIENvbHVtbiB3aGVyZSB0aGlzIHRva2VuIHRhcnRzIGluIHRoZSBpbnB1dAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGUsIHZhbHVlLAorICAgICAgICAgICAgICAgICBjb250ZXh0PU5vbmUsCisgICAgICAgICAgICAgICAgIHByZWZpeD1Ob25lLAorICAgICAgICAgICAgICAgICBmaXhlcnNfYXBwbGllZD1bXSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplci4KKworICAgICAgICBUYWtlcyBhIHR5cGUgY29uc3RhbnQgKGEgdG9rZW4gbnVtYmVyIDwgMjU2KSwgYSBzdHJpbmcgdmFsdWUsIGFuZCBhbgorICAgICAgICBvcHRpb25hbCBjb250ZXh0IGtleXdvcmQgYXJndW1lbnQuCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgMCA8PSB0eXBlIDwgMjU2LCB0eXBlCisgICAgICAgIGlmIGNvbnRleHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9wcmVmaXgsIChzZWxmLmxpbmVubywgc2VsZi5jb2x1bW4pID0gY29udGV4dAorICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBpZiBwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9wcmVmaXggPSBwcmVmaXgKKyAgICAgICAgc2VsZi5maXhlcnNfYXBwbGllZCA9IGZpeGVyc19hcHBsaWVkWzpdCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50YXRpb24uIiIiCisgICAgICAgIHJldHVybiAiJXMoJXIsICVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWUpCisKKyAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCisgICAgICAgIFRoaXMgcmVwcm9kdWNlcyB0aGUgaW5wdXQgc291cmNlIGV4YWN0bHkuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wcmVmaXggKyB1bmljb2RlKHNlbGYudmFsdWUpCisKKyAgICBpZiBzeXMudmVyc2lvbl9pbmZvID4gKDMsIDApOgorICAgICAgICBfX3N0cl9fID0gX191bmljb2RlX18KKworICAgIGRlZiBfZXEoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJlIHR3byBub2RlcyBmb3IgZXF1YWxpdHkuIiIiCisgICAgICAgIHJldHVybiAoc2VsZi50eXBlLCBzZWxmLnZhbHVlKSA9PSAob3RoZXIudHlwZSwgb3RoZXIudmFsdWUpCisKKyAgICBkZWYgY2xvbmUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGNsb25lZCAoZGVlcCkgY29weSBvZiBzZWxmLiIiIgorICAgICAgICByZXR1cm4gTGVhZihzZWxmLnR5cGUsIHNlbGYudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIChzZWxmLnByZWZpeCwgKHNlbGYubGluZW5vLCBzZWxmLmNvbHVtbikpLAorICAgICAgICAgICAgICAgICAgICBmaXhlcnNfYXBwbGllZD1zZWxmLmZpeGVyc19hcHBsaWVkKQorCisgICAgZGVmIGxlYXZlcyhzZWxmKToKKyAgICAgICAgeWllbGQgc2VsZgorCisgICAgZGVmIHBvc3Rfb3JkZXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHBvc3Qtb3JkZXIgaXRlcmF0b3IgZm9yIHRoZSB0cmVlLiIiIgorICAgICAgICB5aWVsZCBzZWxmCisKKyAgICBkZWYgcHJlX29yZGVyKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBwcmUtb3JkZXIgaXRlcmF0b3IgZm9yIHRoZSB0cmVlLiIiIgorICAgICAgICB5aWVsZCBzZWxmCisKKyAgICBkZWYgX3ByZWZpeF9nZXR0ZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUaGUgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMgcHJlY2VkaW5nIHRoaXMgdG9rZW4gaW4gdGhlIGlucHV0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ByZWZpeAorCisgICAgZGVmIF9wcmVmaXhfc2V0dGVyKHNlbGYsIHByZWZpeCk6CisgICAgICAgIHNlbGYuY2hhbmdlZCgpCisgICAgICAgIHNlbGYuX3ByZWZpeCA9IHByZWZpeAorCisgICAgcHJlZml4ID0gcHJvcGVydHkoX3ByZWZpeF9nZXR0ZXIsIF9wcmVmaXhfc2V0dGVyKQorCitkZWYgY29udmVydChnciwgcmF3X25vZGUpOgorICAgICIiIgorICAgIENvbnZlcnQgcmF3IG5vZGUgaW5mb3JtYXRpb24gdG8gYSBOb2RlIG9yIExlYWYgaW5zdGFuY2UuCisKKyAgICBUaGlzIGlzIHBhc3NlZCB0byB0aGUgcGFyc2VyIGRyaXZlciB3aGljaCBjYWxscyBpdCB3aGVuZXZlciBhIHJlZHVjdGlvbiBvZiBhCisgICAgZ3JhbW1hciBydWxlIHByb2R1Y2VzIGEgbmV3IGNvbXBsZXRlIG5vZGUsIHNvIHRoYXQgdGhlIHRyZWUgaXMgYnVpbGQKKyAgICBzdHJpY3RseSBib3R0b20tdXAuCisgICAgIiIiCisgICAgdHlwZSwgdmFsdWUsIGNvbnRleHQsIGNoaWxkcmVuID0gcmF3X25vZGUKKyAgICBpZiBjaGlsZHJlbiBvciB0eXBlIGluIGdyLm51bWJlcjJzeW1ib2w6CisgICAgICAgICMgSWYgdGhlcmUncyBleGFjdGx5IG9uZSBjaGlsZCwgcmV0dXJuIHRoYXQgY2hpbGQgaW5zdGVhZCBvZgorICAgICAgICAjIGNyZWF0aW5nIGEgbmV3IG5vZGUuCisgICAgICAgIGlmIGxlbihjaGlsZHJlbikgPT0gMToKKyAgICAgICAgICAgIHJldHVybiBjaGlsZHJlblswXQorICAgICAgICByZXR1cm4gTm9kZSh0eXBlLCBjaGlsZHJlbiwgY29udGV4dD1jb250ZXh0KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBMZWFmKHR5cGUsIHZhbHVlLCBjb250ZXh0PWNvbnRleHQpCisKKworY2xhc3MgQmFzZVBhdHRlcm4ob2JqZWN0KToKKworICAgICIiIgorICAgIEEgcGF0dGVybiBpcyBhIHRyZWUgbWF0Y2hpbmcgcGF0dGVybi4KKworICAgIEl0IGxvb2tzIGZvciBhIHNwZWNpZmljIG5vZGUgdHlwZSAodG9rZW4gb3Igc3ltYm9sKSwgYW5kCisgICAgb3B0aW9uYWxseSBmb3IgYSBzcGVjaWZpYyBjb250ZW50LgorCisgICAgVGhpcyBpcyBhbiBhYnN0cmFjdCBiYXNlIGNsYXNzLiAgVGhlcmUgYXJlIHRocmVlIGNvbmNyZXRlCisgICAgc3ViY2xhc3NlczoKKworICAgIC0gTGVhZlBhdHRlcm4gbWF0Y2hlcyBhIHNpbmdsZSBsZWFmIG5vZGU7CisgICAgLSBOb2RlUGF0dGVybiBtYXRjaGVzIGEgc2luZ2xlIG5vZGUgKHVzdWFsbHkgbm9uLWxlYWYpOworICAgIC0gV2lsZGNhcmRQYXR0ZXJuIG1hdGNoZXMgYSBzZXF1ZW5jZSBvZiBub2RlcyBvZiB2YXJpYWJsZSBsZW5ndGguCisgICAgIiIiCisKKyAgICAjIERlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMKKyAgICB0eXBlID0gTm9uZSAgICAgIyBOb2RlIHR5cGUgKHRva2VuIGlmIDwgMjU2LCBzeW1ib2wgaWYgPj0gMjU2KQorICAgIGNvbnRlbnQgPSBOb25lICAjIE9wdGlvbmFsIGNvbnRlbnQgbWF0Y2hpbmcgcGF0dGVybgorICAgIG5hbWUgPSBOb25lICAgICAjIE9wdGlvbmFsIG5hbWUgdXNlZCB0byBzdG9yZSBtYXRjaCBpbiByZXN1bHRzIGRpY3QKKworICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yIHRoYXQgcHJldmVudHMgQmFzZVBhdHRlcm4gZnJvbSBiZWluZyBpbnN0YW50aWF0ZWQuIiIiCisgICAgICAgIGFzc2VydCBjbHMgaXMgbm90IEJhc2VQYXR0ZXJuLCAiQ2Fubm90IGluc3RhbnRpYXRlIEJhc2VQYXR0ZXJuIgorICAgICAgICByZXR1cm4gb2JqZWN0Ll9fbmV3X18oY2xzKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhcmdzID0gW3R5cGVfcmVwcihzZWxmLnR5cGUpLCBzZWxmLmNvbnRlbnQsIHNlbGYubmFtZV0KKyAgICAgICAgd2hpbGUgYXJncyBhbmQgYXJnc1stMV0gaXMgTm9uZToKKyAgICAgICAgICAgIGRlbCBhcmdzWy0xXQorICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICIsICIuam9pbihtYXAocmVwciwgYXJncykpKQorCisgICAgZGVmIG9wdGltaXplKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBzdWJjbGFzcyBjYW4gZGVmaW5lIHRoaXMgYXMgYSBob29rIGZvciBvcHRpbWl6YXRpb25zLgorCisgICAgICAgIFJldHVybnMgZWl0aGVyIHNlbGYgb3IgYW5vdGhlciBub2RlIHdpdGggdGhlIHNhbWUgZWZmZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBtYXRjaChzZWxmLCBub2RlLCByZXN1bHRzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgRG9lcyB0aGlzIHBhdHRlcm4gZXhhY3RseSBtYXRjaCBhIG5vZGU/CisKKyAgICAgICAgUmV0dXJucyBUcnVlIGlmIGl0IG1hdGNoZXMsIEZhbHNlIGlmIG5vdC4KKworICAgICAgICBJZiByZXN1bHRzIGlzIG5vdCBOb25lLCBpdCBtdXN0IGJlIGEgZGljdCB3aGljaCB3aWxsIGJlCisgICAgICAgIHVwZGF0ZWQgd2l0aCB0aGUgbm9kZXMgbWF0Y2hpbmcgbmFtZWQgc3VicGF0dGVybnMuCisKKyAgICAgICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3Igbm9uLXdpbGRjYXJkIHBhdHRlcm5zLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi50eXBlIGlzIG5vdCBOb25lIGFuZCBub2RlLnR5cGUgIT0gc2VsZi50eXBlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGlmIHNlbGYuY29udGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHIgPSBOb25lCisgICAgICAgICAgICBpZiByZXN1bHRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHIgPSB7fQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX3N1Ym1hdGNoKG5vZGUsIHIpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgaWYgcjoKKyAgICAgICAgICAgICAgICByZXN1bHRzLnVwZGF0ZShyKQorICAgICAgICBpZiByZXN1bHRzIGlzIG5vdCBOb25lIGFuZCBzZWxmLm5hbWU6CisgICAgICAgICAgICByZXN1bHRzW3NlbGYubmFtZV0gPSBub2RlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgbWF0Y2hfc2VxKHNlbGYsIG5vZGVzLCByZXN1bHRzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgRG9lcyB0aGlzIHBhdHRlcm4gZXhhY3RseSBtYXRjaCBhIHNlcXVlbmNlIG9mIG5vZGVzPworCisgICAgICAgIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIG5vbi13aWxkY2FyZCBwYXR0ZXJucy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihub2RlcykgIT0gMToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gc2VsZi5tYXRjaChub2Rlc1swXSwgcmVzdWx0cykKKworICAgIGRlZiBnZW5lcmF0ZV9tYXRjaGVzKHNlbGYsIG5vZGVzKToKKyAgICAgICAgIiIiCisgICAgICAgIEdlbmVyYXRvciB5aWVsZGluZyBhbGwgbWF0Y2hlcyBmb3IgdGhpcyBwYXR0ZXJuLgorCisgICAgICAgIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIG5vbi13aWxkY2FyZCBwYXR0ZXJucy4KKyAgICAgICAgIiIiCisgICAgICAgIHIgPSB7fQorICAgICAgICBpZiBub2RlcyBhbmQgc2VsZi5tYXRjaChub2Rlc1swXSwgcik6CisgICAgICAgICAgICB5aWVsZCAxLCByCisKKworY2xhc3MgTGVhZlBhdHRlcm4oQmFzZVBhdHRlcm4pOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGU9Tm9uZSwgY29udGVudD1Ob25lLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZXIuICBUYWtlcyBvcHRpb25hbCB0eXBlLCBjb250ZW50LCBhbmQgbmFtZS4KKworICAgICAgICBUaGUgdHlwZSwgaWYgZ2l2ZW4gbXVzdCBiZSBhIHRva2VuIHR5cGUgKDwgMjU2KS4gIElmIG5vdCBnaXZlbiwKKyAgICAgICAgdGhpcyBtYXRjaGVzIGFueSAqbGVhZiogbm9kZTsgdGhlIGNvbnRlbnQgbWF5IHN0aWxsIGJlIHJlcXVpcmVkLgorCisgICAgICAgIFRoZSBjb250ZW50LCBpZiBnaXZlbiwgbXVzdCBiZSBhIHN0cmluZy4KKworICAgICAgICBJZiBhIG5hbWUgaXMgZ2l2ZW4sIHRoZSBtYXRjaGluZyBub2RlIGlzIHN0b3JlZCBpbiB0aGUgcmVzdWx0cworICAgICAgICBkaWN0IHVuZGVyIHRoYXQga2V5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzc2VydCAwIDw9IHR5cGUgPCAyNTYsIHR5cGUKKyAgICAgICAgaWYgY29udGVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvbnRlbnQsIGJhc2VzdHJpbmcpLCByZXByKGNvbnRlbnQpCisgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5jb250ZW50ID0gY29udGVudAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSwgcmVzdWx0cz1Ob25lKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgbWF0Y2goKSB0byBpbnNpc3Qgb24gYSBsZWFmIG5vZGUuIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5vZGUsIExlYWYpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBCYXNlUGF0dGVybi5tYXRjaChzZWxmLCBub2RlLCByZXN1bHRzKQorCisgICAgZGVmIF9zdWJtYXRjaChzZWxmLCBub2RlLCByZXN1bHRzPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgTWF0Y2ggdGhlIHBhdHRlcm4ncyBjb250ZW50IHRvIHRoZSBub2RlJ3MgY2hpbGRyZW4uCisKKyAgICAgICAgVGhpcyBhc3N1bWVzIHRoZSBub2RlIHR5cGUgbWF0Y2hlcyBhbmQgc2VsZi5jb250ZW50IGlzIG5vdCBOb25lLgorCisgICAgICAgIFJldHVybnMgVHJ1ZSBpZiBpdCBtYXRjaGVzLCBGYWxzZSBpZiBub3QuCisKKyAgICAgICAgSWYgcmVzdWx0cyBpcyBub3QgTm9uZSwgaXQgbXVzdCBiZSBhIGRpY3Qgd2hpY2ggd2lsbCBiZQorICAgICAgICB1cGRhdGVkIHdpdGggdGhlIG5vZGVzIG1hdGNoaW5nIG5hbWVkIHN1YnBhdHRlcm5zLgorCisgICAgICAgIFdoZW4gcmV0dXJuaW5nIEZhbHNlLCB0aGUgcmVzdWx0cyBkaWN0IG1heSBzdGlsbCBiZSB1cGRhdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuY29udGVudCA9PSBub2RlLnZhbHVlCisKKworY2xhc3MgTm9kZVBhdHRlcm4oQmFzZVBhdHRlcm4pOgorCisgICAgd2lsZGNhcmRzID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlPU5vbmUsIGNvbnRlbnQ9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemVyLiAgVGFrZXMgb3B0aW9uYWwgdHlwZSwgY29udGVudCwgYW5kIG5hbWUuCisKKyAgICAgICAgVGhlIHR5cGUsIGlmIGdpdmVuLCBtdXN0IGJlIGEgc3ltYm9sIHR5cGUgKD49IDI1NikuICBJZiB0aGUKKyAgICAgICAgdHlwZSBpcyBOb25lIHRoaXMgbWF0Y2hlcyAqYW55KiBzaW5nbGUgbm9kZSAobGVhZiBvciBub3QpLAorICAgICAgICBleGNlcHQgaWYgY29udGVudCBpcyBub3QgTm9uZSwgaW4gd2hpY2ggaXQgb25seSBtYXRjaGVzCisgICAgICAgIG5vbi1sZWFmIG5vZGVzIHRoYXQgYWxzbyBtYXRjaCB0aGUgY29udGVudCBwYXR0ZXJuLgorCisgICAgICAgIFRoZSBjb250ZW50LCBpZiBub3QgTm9uZSwgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIFBhdHRlcm5zIHRoYXQKKyAgICAgICAgbXVzdCBtYXRjaCB0aGUgbm9kZSdzIGNoaWxkcmVuIGV4YWN0bHkuICBJZiB0aGUgY29udGVudCBpcworICAgICAgICBnaXZlbiwgdGhlIHR5cGUgbXVzdCBub3QgYmUgTm9uZS4KKworICAgICAgICBJZiBhIG5hbWUgaXMgZ2l2ZW4sIHRoZSBtYXRjaGluZyBub2RlIGlzIHN0b3JlZCBpbiB0aGUgcmVzdWx0cworICAgICAgICBkaWN0IHVuZGVyIHRoYXQga2V5LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzc2VydCB0eXBlID49IDI1NiwgdHlwZQorICAgICAgICBpZiBjb250ZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXNzZXJ0IG5vdCBpc2luc3RhbmNlKGNvbnRlbnQsIGJhc2VzdHJpbmcpLCByZXByKGNvbnRlbnQpCisgICAgICAgICAgICBjb250ZW50ID0gbGlzdChjb250ZW50KQorICAgICAgICAgICAgZm9yIGksIGl0ZW0gaW4gZW51bWVyYXRlKGNvbnRlbnQpOgorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGl0ZW0sIEJhc2VQYXR0ZXJuKSwgKGksIGl0ZW0pCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpdGVtLCBXaWxkY2FyZFBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndpbGRjYXJkcyA9IFRydWUKKyAgICAgICAgc2VsZi50eXBlID0gdHlwZQorICAgICAgICBzZWxmLmNvbnRlbnQgPSBjb250ZW50CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgIGRlZiBfc3VibWF0Y2goc2VsZiwgbm9kZSwgcmVzdWx0cz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIE1hdGNoIHRoZSBwYXR0ZXJuJ3MgY29udGVudCB0byB0aGUgbm9kZSdzIGNoaWxkcmVuLgorCisgICAgICAgIFRoaXMgYXNzdW1lcyB0aGUgbm9kZSB0eXBlIG1hdGNoZXMgYW5kIHNlbGYuY29udGVudCBpcyBub3QgTm9uZS4KKworICAgICAgICBSZXR1cm5zIFRydWUgaWYgaXQgbWF0Y2hlcywgRmFsc2UgaWYgbm90LgorCisgICAgICAgIElmIHJlc3VsdHMgaXMgbm90IE5vbmUsIGl0IG11c3QgYmUgYSBkaWN0IHdoaWNoIHdpbGwgYmUKKyAgICAgICAgdXBkYXRlZCB3aXRoIHRoZSBub2RlcyBtYXRjaGluZyBuYW1lZCBzdWJwYXR0ZXJucy4KKworICAgICAgICBXaGVuIHJldHVybmluZyBGYWxzZSwgdGhlIHJlc3VsdHMgZGljdCBtYXkgc3RpbGwgYmUgdXBkYXRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYud2lsZGNhcmRzOgorICAgICAgICAgICAgZm9yIGMsIHIgaW4gZ2VuZXJhdGVfbWF0Y2hlcyhzZWxmLmNvbnRlbnQsIG5vZGUuY2hpbGRyZW4pOgorICAgICAgICAgICAgICAgIGlmIGMgPT0gbGVuKG5vZGUuY2hpbGRyZW4pOgorICAgICAgICAgICAgICAgICAgICBpZiByZXN1bHRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy51cGRhdGUocikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBsZW4oc2VsZi5jb250ZW50KSAhPSBsZW4obm9kZS5jaGlsZHJlbik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIHN1YnBhdHRlcm4sIGNoaWxkIGluIHppcChzZWxmLmNvbnRlbnQsIG5vZGUuY2hpbGRyZW4pOgorICAgICAgICAgICAgaWYgbm90IHN1YnBhdHRlcm4ubWF0Y2goY2hpbGQsIHJlc3VsdHMpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIFdpbGRjYXJkUGF0dGVybihCYXNlUGF0dGVybik6CisKKyAgICAiIiIKKyAgICBBIHdpbGRjYXJkIHBhdHRlcm4gY2FuIG1hdGNoIHplcm8gb3IgbW9yZSBub2Rlcy4KKworICAgIFRoaXMgaGFzIGFsbCB0aGUgZmxleGliaWxpdHkgbmVlZGVkIHRvIGltcGxlbWVudCBwYXR0ZXJucyBsaWtlOgorCisgICAgLiogICAgICAuKyAgICAgIC4/ICAgICAgLnttLG59CisgICAgKGEgYiBjIHwgZCBlIHwgZikKKyAgICAoLi4uKSogICguLi4pKyAgKC4uLik/ICAoLi4uKXttLG59CisKKyAgICBleGNlcHQgaXQgYWx3YXlzIHVzZXMgbm9uLWdyZWVkeSBtYXRjaGluZy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZW50PU5vbmUsIG1pbj0wLCBtYXg9SFVHRSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemVyLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBjb250ZW50OiBvcHRpb25hbCBzZXF1ZW5jZSBvZiBzdWJzZXF1ZW5jZXMgb2YgcGF0dGVybnM7CisgICAgICAgICAgICAgICAgICAgICBpZiBhYnNlbnQsIG1hdGNoZXMgb25lIG5vZGU7CisgICAgICAgICAgICAgICAgICAgICBpZiBwcmVzZW50LCBlYWNoIHN1YnNlcXVlbmNlIGlzIGFuIGFsdGVybmF0aXZlIFsqXQorICAgICAgICAgICAgbWluOiBvcHRpb25hbCBtaW5pbXVtIG51bWJlciBvZiB0aW1lcyB0byBtYXRjaCwgZGVmYXVsdCAwCisgICAgICAgICAgICBtYXg6IG9wdGlvbmFsIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRvIG1hdGNoLCBkZWZhdWx0IEhVR0UKKyAgICAgICAgICAgIG5hbWU6IG9wdGlvbmFsIG5hbWUgYXNzaWduZWQgdG8gdGhpcyBtYXRjaAorCisgICAgICAgIFsqXSBUaHVzLCBpZiBjb250ZW50IGlzIFtbYSwgYiwgY10sIFtkLCBlXSwgW2YsIGcsIGhdXSB0aGlzIGlzCisgICAgICAgICAgICBlcXVpdmFsZW50IHRvIChhIGIgYyB8IGQgZSB8IGYgZyBoKTsgaWYgY29udGVudCBpcyBOb25lLAorICAgICAgICAgICAgdGhpcyBpcyBlcXVpdmFsZW50IHRvICcuJyBpbiByZWd1bGFyIGV4cHJlc3Npb24gdGVybXMuCisgICAgICAgICAgICBUaGUgbWluIGFuZCBtYXggcGFyYW1ldGVycyB3b3JrIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgICAgbWluPTAsIG1heD1tYXhpbnQ6IC4qCisgICAgICAgICAgICAgICAgbWluPTEsIG1heD1tYXhpbnQ6IC4rCisgICAgICAgICAgICAgICAgbWluPTAsIG1heD0xOiAuPworICAgICAgICAgICAgICAgIG1pbj0xLCBtYXg9MTogLgorICAgICAgICAgICAgSWYgY29udGVudCBpcyBub3QgTm9uZSwgcmVwbGFjZSB0aGUgZG90IHdpdGggdGhlIHBhcmVudGhlc2l6ZWQKKyAgICAgICAgICAgIGxpc3Qgb2YgYWx0ZXJuYXRpdmVzLCBlLmcuIChhIGIgYyB8IGQgZSB8IGYgZyBoKSoKKyAgICAgICAgIiIiCisgICAgICAgIGFzc2VydCAwIDw9IG1pbiA8PSBtYXggPD0gSFVHRSwgKG1pbiwgbWF4KQorICAgICAgICBpZiBjb250ZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29udGVudCA9IHR1cGxlKG1hcCh0dXBsZSwgY29udGVudCkpICAjIFByb3RlY3QgYWdhaW5zdCBhbHRlcmF0aW9ucworICAgICAgICAgICAgIyBDaGVjayBzYW5pdHkgb2YgYWx0ZXJuYXRpdmVzCisgICAgICAgICAgICBhc3NlcnQgbGVuKGNvbnRlbnQpLCByZXByKGNvbnRlbnQpICAjIENhbid0IGhhdmUgemVybyBhbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIGZvciBhbHQgaW4gY29udGVudDoKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGVuKGFsdCksIHJlcHIoYWx0KSAjIENhbiBoYXZlIGVtcHR5IGFsdGVybmF0aXZlcworICAgICAgICBzZWxmLmNvbnRlbnQgPSBjb250ZW50CisgICAgICAgIHNlbGYubWluID0gbWluCisgICAgICAgIHNlbGYubWF4ID0gbWF4CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgIGRlZiBvcHRpbWl6ZShzZWxmKToKKyAgICAgICAgIiIiT3B0aW1pemUgY2VydGFpbiBzdGFja2VkIHdpbGRjYXJkIHBhdHRlcm5zLiIiIgorICAgICAgICBzdWJwYXR0ZXJuID0gTm9uZQorICAgICAgICBpZiAoc2VsZi5jb250ZW50IGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgbGVuKHNlbGYuY29udGVudCkgPT0gMSBhbmQgbGVuKHNlbGYuY29udGVudFswXSkgPT0gMSk6CisgICAgICAgICAgICBzdWJwYXR0ZXJuID0gc2VsZi5jb250ZW50WzBdWzBdCisgICAgICAgIGlmIHNlbGYubWluID09IDEgYW5kIHNlbGYubWF4ID09IDE6CisgICAgICAgICAgICBpZiBzZWxmLmNvbnRlbnQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9kZVBhdHRlcm4obmFtZT1zZWxmLm5hbWUpCisgICAgICAgICAgICBpZiBzdWJwYXR0ZXJuIGlzIG5vdCBOb25lIGFuZCAgc2VsZi5uYW1lID09IHN1YnBhdHRlcm4ubmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VicGF0dGVybi5vcHRpbWl6ZSgpCisgICAgICAgIGlmIChzZWxmLm1pbiA8PSAxIGFuZCBpc2luc3RhbmNlKHN1YnBhdHRlcm4sIFdpbGRjYXJkUGF0dGVybikgYW5kCisgICAgICAgICAgICBzdWJwYXR0ZXJuLm1pbiA8PSAxIGFuZCBzZWxmLm5hbWUgPT0gc3VicGF0dGVybi5uYW1lKToKKyAgICAgICAgICAgIHJldHVybiBXaWxkY2FyZFBhdHRlcm4oc3VicGF0dGVybi5jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1pbipzdWJwYXR0ZXJuLm1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXgqc3VicGF0dGVybi5tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm4ubmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBtYXRjaChzZWxmLCBub2RlLCByZXN1bHRzPU5vbmUpOgorICAgICAgICAiIiJEb2VzIHRoaXMgcGF0dGVybiBleGFjdGx5IG1hdGNoIGEgbm9kZT8iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hfc2VxKFtub2RlXSwgcmVzdWx0cykKKworICAgIGRlZiBtYXRjaF9zZXEoc2VsZiwgbm9kZXMsIHJlc3VsdHM9Tm9uZSk6CisgICAgICAgICIiIkRvZXMgdGhpcyBwYXR0ZXJuIGV4YWN0bHkgbWF0Y2ggYSBzZXF1ZW5jZSBvZiBub2Rlcz8iIiIKKyAgICAgICAgZm9yIGMsIHIgaW4gc2VsZi5nZW5lcmF0ZV9tYXRjaGVzKG5vZGVzKToKKyAgICAgICAgICAgIGlmIGMgPT0gbGVuKG5vZGVzKToKKyAgICAgICAgICAgICAgICBpZiByZXN1bHRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnVwZGF0ZShyKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW3NlbGYubmFtZV0gPSBsaXN0KG5vZGVzKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGdlbmVyYXRlX21hdGNoZXMoc2VsZiwgbm9kZXMpOgorICAgICAgICAiIiIKKyAgICAgICAgR2VuZXJhdG9yIHlpZWxkaW5nIG1hdGNoZXMgZm9yIGEgc2VxdWVuY2Ugb2Ygbm9kZXMuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIG5vZGVzOiBzZXF1ZW5jZSBvZiBub2RlcworCisgICAgICAgIFlpZWxkczoKKyAgICAgICAgICAgIChjb3VudCwgcmVzdWx0cykgdHVwbGVzIHdoZXJlOgorICAgICAgICAgICAgY291bnQ6IHRoZSBtYXRjaCBjb21wcmlzZXMgbm9kZXNbOmNvdW50XTsKKyAgICAgICAgICAgIHJlc3VsdHM6IGRpY3QgY29udGFpbmluZyBuYW1lZCBzdWJtYXRjaGVzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jb250ZW50IGlzIE5vbmU6CisgICAgICAgICAgICAjIFNob3J0Y3V0IGZvciBzcGVjaWFsIGNhc2UgKHNlZSBfX2luaXRfXy5fX2RvY19fKQorICAgICAgICAgICAgZm9yIGNvdW50IGluIHhyYW5nZShzZWxmLm1pbiwgMSArIG1pbihsZW4obm9kZXMpLCBzZWxmLm1heCkpOgorICAgICAgICAgICAgICAgIHIgPSB7fQorICAgICAgICAgICAgICAgIGlmIHNlbGYubmFtZToKKyAgICAgICAgICAgICAgICAgICAgcltzZWxmLm5hbWVdID0gbm9kZXNbOmNvdW50XQorICAgICAgICAgICAgICAgIHlpZWxkIGNvdW50LCByCisgICAgICAgIGVsaWYgc2VsZi5uYW1lID09ICJiYXJlX25hbWUiOgorICAgICAgICAgICAgeWllbGQgc2VsZi5fYmFyZV9uYW1lX21hdGNoZXMobm9kZXMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCBoaXR0aW5nIHRoZSByZWN1cnNpb24gbGltaXQgdXN1YWxseQorICAgICAgICAgICAgIyByZXN1bHRzIGluIHNvbWUgdWdseSBtZXNzYWdlcyBhYm91dCBob3cgUnVudGltZUVycm9ycyBhcmUgYmVpbmcKKyAgICAgICAgICAgICMgaWdub3JlZC4gV2UgZG9uJ3QgZG8gdGhpcyBvbiBub24tQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBiZWNhdXNlCisgICAgICAgICAgICAjIHRoZXkgZG9uJ3QgaGF2ZSB0aGlzIHByb2JsZW0uCisgICAgICAgICAgICBpZiBoYXNhdHRyKHN5cywgImdldHJlZmNvdW50Iik6CisgICAgICAgICAgICAgICAgc2F2ZV9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb3IgY291bnQsIHIgaW4gc2VsZi5fcmVjdXJzaXZlX21hdGNoZXMobm9kZXMsIDApOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByW3NlbGYubmFtZV0gPSBub2Rlc1s6Y291bnRdCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNvdW50LCByCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgICMgV2UgZmFsbCBiYWNrIHRvIHRoZSBpdGVyYXRpdmUgcGF0dGVybiBtYXRjaGluZyBzY2hlbWUgaWYgdGhlIHJlY3Vyc2l2ZQorICAgICAgICAgICAgICAgICMgc2NoZW1lIGhpdHMgdGhlIHJlY3Vyc2lvbiBsaW1pdC4KKyAgICAgICAgICAgICAgICBmb3IgY291bnQsIHIgaW4gc2VsZi5faXRlcmF0aXZlX21hdGNoZXMobm9kZXMpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLm5hbWU6CisgICAgICAgICAgICAgICAgICAgICAgICByW3NlbGYubmFtZV0gPSBub2Rlc1s6Y291bnRdCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGNvdW50LCByCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0cmVmY291bnQiKToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVfc3RkZXJyCisKKyAgICBkZWYgX2l0ZXJhdGl2ZV9tYXRjaGVzKHNlbGYsIG5vZGVzKToKKyAgICAgICAgIiIiSGVscGVyIHRvIGl0ZXJhdGl2ZWx5IHlpZWxkIHRoZSBtYXRjaGVzLiIiIgorICAgICAgICBub2RlbGVuID0gbGVuKG5vZGVzKQorICAgICAgICBpZiAwID49IHNlbGYubWluOgorICAgICAgICAgICAgeWllbGQgMCwge30KKworICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgIyBnZW5lcmF0ZSBtYXRjaGVzIHRoYXQgdXNlIGp1c3Qgb25lIGFsdCBmcm9tIHNlbGYuY29udGVudAorICAgICAgICBmb3IgYWx0IGluIHNlbGYuY29udGVudDoKKyAgICAgICAgICAgIGZvciBjLCByIGluIGdlbmVyYXRlX21hdGNoZXMoYWx0LCBub2Rlcyk6CisgICAgICAgICAgICAgICAgeWllbGQgYywgcgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKChjLCByKSkKKworICAgICAgICAjIGZvciBlYWNoIG1hdGNoLCBpdGVyYXRlIGRvd24gdGhlIG5vZGVzCisgICAgICAgIHdoaWxlIHJlc3VsdHM6CisgICAgICAgICAgICBuZXdfcmVzdWx0cyA9IFtdCisgICAgICAgICAgICBmb3IgYzAsIHIwIGluIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgIyBzdG9wIGlmIHRoZSBlbnRpcmUgc2V0IG9mIG5vZGVzIGhhcyBiZWVuIG1hdGNoZWQKKyAgICAgICAgICAgICAgICBpZiBjMCA8IG5vZGVsZW4gYW5kIGMwIDw9IHNlbGYubWF4OgorICAgICAgICAgICAgICAgICAgICBmb3IgYWx0IGluIHNlbGYuY29udGVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjMSwgcjEgaW4gZ2VuZXJhdGVfbWF0Y2hlcyhhbHQsIG5vZGVzW2MwOl0pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGMxID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudXBkYXRlKHIwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnVwZGF0ZShyMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgYzAgKyBjMSwgcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfcmVzdWx0cy5hcHBlbmQoKGMwICsgYzEsIHIpKQorICAgICAgICAgICAgcmVzdWx0cyA9IG5ld19yZXN1bHRzCisKKyAgICBkZWYgX2JhcmVfbmFtZV9tYXRjaGVzKHNlbGYsIG5vZGVzKToKKyAgICAgICAgIiIiU3BlY2lhbCBvcHRpbWl6ZWQgbWF0Y2hlciBmb3IgYmFyZV9uYW1lLiIiIgorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgciA9IHt9CisgICAgICAgIGRvbmUgPSBGYWxzZQorICAgICAgICBtYXggPSBsZW4obm9kZXMpCisgICAgICAgIHdoaWxlIG5vdCBkb25lIGFuZCBjb3VudCA8IG1heDoKKyAgICAgICAgICAgIGRvbmUgPSBUcnVlCisgICAgICAgICAgICBmb3IgbGVhZiBpbiBzZWxmLmNvbnRlbnQ6CisgICAgICAgICAgICAgICAgaWYgbGVhZlswXS5tYXRjaChub2Rlc1tjb3VudF0sIHIpOgorICAgICAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICAgICAgICAgIGRvbmUgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByW3NlbGYubmFtZV0gPSBub2Rlc1s6Y291bnRdCisgICAgICAgIHJldHVybiBjb3VudCwgcgorCisgICAgZGVmIF9yZWN1cnNpdmVfbWF0Y2hlcyhzZWxmLCBub2RlcywgY291bnQpOgorICAgICAgICAiIiJIZWxwZXIgdG8gcmVjdXJzaXZlbHkgeWllbGQgdGhlIG1hdGNoZXMuIiIiCisgICAgICAgIGFzc2VydCBzZWxmLmNvbnRlbnQgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgY291bnQgPj0gc2VsZi5taW46CisgICAgICAgICAgICB5aWVsZCAwLCB7fQorICAgICAgICBpZiBjb3VudCA8IHNlbGYubWF4OgorICAgICAgICAgICAgZm9yIGFsdCBpbiBzZWxmLmNvbnRlbnQ6CisgICAgICAgICAgICAgICAgZm9yIGMwLCByMCBpbiBnZW5lcmF0ZV9tYXRjaGVzKGFsdCwgbm9kZXMpOgorICAgICAgICAgICAgICAgICAgICBmb3IgYzEsIHIxIGluIHNlbGYuX3JlY3Vyc2l2ZV9tYXRjaGVzKG5vZGVzW2MwOl0sIGNvdW50KzEpOgorICAgICAgICAgICAgICAgICAgICAgICAgciA9IHt9CisgICAgICAgICAgICAgICAgICAgICAgICByLnVwZGF0ZShyMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHIudXBkYXRlKHIxKQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgYzAgKyBjMSwgcgorCisKK2NsYXNzIE5lZ2F0ZWRQYXR0ZXJuKEJhc2VQYXR0ZXJuKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb250ZW50PU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZXIuCisKKyAgICAgICAgVGhlIGFyZ3VtZW50IGlzIGVpdGhlciBhIHBhdHRlcm4gb3IgTm9uZS4gIElmIGl0IGlzIE5vbmUsIHRoaXMKKyAgICAgICAgb25seSBtYXRjaGVzIGFuIGVtcHR5IHNlcXVlbmNlIChlZmZlY3RpdmVseSAnJCcgaW4gcmVnZXgKKyAgICAgICAgbGluZ28pLiAgSWYgaXQgaXMgbm90IE5vbmUsIHRoaXMgbWF0Y2hlcyB3aGVuZXZlciB0aGUgYXJndW1lbnQKKyAgICAgICAgcGF0dGVybiBkb2Vzbid0IGhhdmUgYW55IG1hdGNoZXMuCisgICAgICAgICIiIgorICAgICAgICBpZiBjb250ZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29udGVudCwgQmFzZVBhdHRlcm4pLCByZXByKGNvbnRlbnQpCisgICAgICAgIHNlbGYuY29udGVudCA9IGNvbnRlbnQKKworICAgIGRlZiBtYXRjaChzZWxmLCBub2RlKToKKyAgICAgICAgIyBXZSBuZXZlciBtYXRjaCBhIG5vZGUgaW4gaXRzIGVudGlyZXR5CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIG1hdGNoX3NlcShzZWxmLCBub2Rlcyk6CisgICAgICAgICMgV2Ugb25seSBtYXRjaCBhbiBlbXB0eSBzZXF1ZW5jZSBvZiBub2RlcyBpbiBpdHMgZW50aXJldHkKKyAgICAgICAgcmV0dXJuIGxlbihub2RlcykgPT0gMAorCisgICAgZGVmIGdlbmVyYXRlX21hdGNoZXMoc2VsZiwgbm9kZXMpOgorICAgICAgICBpZiBzZWxmLmNvbnRlbnQgaXMgTm9uZToKKyAgICAgICAgICAgICMgUmV0dXJuIGEgbWF0Y2ggaWYgdGhlcmUgaXMgYW4gZW1wdHkgc2VxdWVuY2UKKyAgICAgICAgICAgIGlmIGxlbihub2RlcykgPT0gMDoKKyAgICAgICAgICAgICAgICB5aWVsZCAwLCB7fQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSZXR1cm4gYSBtYXRjaCBpZiB0aGUgYXJndW1lbnQgcGF0dGVybiBoYXMgbm8gbWF0Y2hlcworICAgICAgICAgICAgZm9yIGMsIHIgaW4gc2VsZi5jb250ZW50LmdlbmVyYXRlX21hdGNoZXMobm9kZXMpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgeWllbGQgMCwge30KKworCitkZWYgZ2VuZXJhdGVfbWF0Y2hlcyhwYXR0ZXJucywgbm9kZXMpOgorICAgICIiIgorICAgIEdlbmVyYXRvciB5aWVsZGluZyBtYXRjaGVzIGZvciBhIHNlcXVlbmNlIG9mIHBhdHRlcm5zIGFuZCBub2Rlcy4KKworICAgIEFyZ3M6CisgICAgICAgIHBhdHRlcm5zOiBhIHNlcXVlbmNlIG9mIHBhdHRlcm5zCisgICAgICAgIG5vZGVzOiBhIHNlcXVlbmNlIG9mIG5vZGVzCisKKyAgICBZaWVsZHM6CisgICAgICAgIChjb3VudCwgcmVzdWx0cykgdHVwbGVzIHdoZXJlOgorICAgICAgICBjb3VudDogdGhlIGVudGlyZSBzZXF1ZW5jZSBvZiBwYXR0ZXJucyBtYXRjaGVzIG5vZGVzWzpjb3VudF07CisgICAgICAgIHJlc3VsdHM6IGRpY3QgY29udGFpbmluZyBuYW1lZCBzdWJtYXRjaGVzLgorICAgICAgICAiIiIKKyAgICBpZiBub3QgcGF0dGVybnM6CisgICAgICAgIHlpZWxkIDAsIHt9CisgICAgZWxzZToKKyAgICAgICAgcCwgcmVzdCA9IHBhdHRlcm5zWzBdLCBwYXR0ZXJuc1sxOl0KKyAgICAgICAgZm9yIGMwLCByMCBpbiBwLmdlbmVyYXRlX21hdGNoZXMobm9kZXMpOgorICAgICAgICAgICAgaWYgbm90IHJlc3Q6CisgICAgICAgICAgICAgICAgeWllbGQgYzAsIHIwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBjMSwgcjEgaW4gZ2VuZXJhdGVfbWF0Y2hlcyhyZXN0LCBub2Rlc1tjMDpdKToKKyAgICAgICAgICAgICAgICAgICAgciA9IHt9CisgICAgICAgICAgICAgICAgICAgIHIudXBkYXRlKHIwKQorICAgICAgICAgICAgICAgICAgICByLnVwZGF0ZShyMSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgYzAgKyBjMSwgcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHl0cmVlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjIyNzJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcHl0cmVlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRhZTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3B5dHJlZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3JlZmFjdG9yLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3JlZmFjdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzE2OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcmVmYWN0b3IucHkKQEAgLTAsMCArMSw3NDcgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiUmVmYWN0b3JpbmcgZnJhbWV3b3JrLgorCitVc2VkIGFzIGEgbWFpbiBwcm9ncmFtLCB0aGlzIGNhbiByZWZhY3RvciBhbnkgbnVtYmVyIG9mIGZpbGVzIGFuZC9vcgorcmVjdXJzaXZlbHkgZGVzY2VuZCBkb3duIGRpcmVjdG9yaWVzLiAgSW1wb3J0ZWQgYXMgYSBtb2R1bGUsIHRoaXMKK3Byb3ZpZGVzIGluZnJhc3RydWN0dXJlIHRvIHdyaXRlIHlvdXIgb3duIHJlZmFjdG9yaW5nIHRvb2wuCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCitfX2F1dGhvcl9fID0gIkd1aWRvIHZhbiBSb3NzdW0gPGd1aWRvQHB5dGhvbi5vcmc+IgorCisKKyMgUHl0aG9uIGltcG9ydHMKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgU3RyaW5nSU8KK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLnBnZW4yIGltcG9ydCBkcml2ZXIsIHRva2VuaXplLCB0b2tlbgorZnJvbSAuZml4ZXJfdXRpbCBpbXBvcnQgZmluZF9yb290Citmcm9tIC4gaW1wb3J0IHB5dHJlZSwgcHlncmFtCitmcm9tIC4gaW1wb3J0IGJ0bV91dGlscyBhcyBidQorZnJvbSAuIGltcG9ydCBidG1fbWF0Y2hlciBhcyBibQorCisKK2RlZiBnZXRfYWxsX2ZpeF9uYW1lcyhmaXhlcl9wa2csIHJlbW92ZV9wcmVmaXg9VHJ1ZSk6CisgICAgIiIiUmV0dXJuIGEgc29ydGVkIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBmaXggbmFtZXMgaW4gdGhlIGdpdmVuIHBhY2thZ2UuIiIiCisgICAgcGtnID0gX19pbXBvcnRfXyhmaXhlcl9wa2csIFtdLCBbXSwgWyIqIl0pCisgICAgZml4ZXJfZGlyID0gb3MucGF0aC5kaXJuYW1lKHBrZy5fX2ZpbGVfXykKKyAgICBmaXhfbmFtZXMgPSBbXQorICAgIGZvciBuYW1lIGluIHNvcnRlZChvcy5saXN0ZGlyKGZpeGVyX2RpcikpOgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoImZpeF8iKSBhbmQgbmFtZS5lbmRzd2l0aCgiLnB5Iik6CisgICAgICAgICAgICBpZiByZW1vdmVfcHJlZml4OgorICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzQ6XQorICAgICAgICAgICAgZml4X25hbWVzLmFwcGVuZChuYW1lWzotM10pCisgICAgcmV0dXJuIGZpeF9uYW1lcworCisKK2NsYXNzIF9FdmVyeU5vZGUoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworZGVmIF9nZXRfaGVhZF90eXBlcyhwYXQpOgorICAgICIiIiBBY2NlcHRzIGEgcHl0cmVlIFBhdHRlcm4gTm9kZSBhbmQgcmV0dXJucyBhIHNldAorICAgICAgICBvZiB0aGUgcGF0dGVybiB0eXBlcyB3aGljaCB3aWxsIG1hdGNoIGZpcnN0LiAiIiIKKworICAgIGlmIGlzaW5zdGFuY2UocGF0LCAocHl0cmVlLk5vZGVQYXR0ZXJuLCBweXRyZWUuTGVhZlBhdHRlcm4pKToKKyAgICAgICAgIyBOb2RlUGF0dGVycyBtdXN0IGVpdGhlciBoYXZlIG5vIHR5cGUgYW5kIG5vIGNvbnRlbnQKKyAgICAgICAgIyAgIG9yIGEgdHlwZSBhbmQgY29udGVudCAtLSBzbyB0aGV5IGRvbid0IGdldCBhbnkgZmFydGhlcgorICAgICAgICAjIEFsd2F5cyByZXR1cm4gbGVhZnMKKyAgICAgICAgaWYgcGF0LnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIF9FdmVyeU5vZGUKKyAgICAgICAgcmV0dXJuIHNldChbcGF0LnR5cGVdKQorCisgICAgaWYgaXNpbnN0YW5jZShwYXQsIHB5dHJlZS5OZWdhdGVkUGF0dGVybik6CisgICAgICAgIGlmIHBhdC5jb250ZW50OgorICAgICAgICAgICAgcmV0dXJuIF9nZXRfaGVhZF90eXBlcyhwYXQuY29udGVudCkKKyAgICAgICAgcmFpc2UgX0V2ZXJ5Tm9kZSAjIE5lZ2F0ZWQgUGF0dGVybnMgZG9uJ3QgaGF2ZSBhIHR5cGUKKworICAgIGlmIGlzaW5zdGFuY2UocGF0LCBweXRyZWUuV2lsZGNhcmRQYXR0ZXJuKToKKyAgICAgICAgIyBSZWN1cnNlIG9uIGVhY2ggbm9kZSBpbiBjb250ZW50CisgICAgICAgIHIgPSBzZXQoKQorICAgICAgICBmb3IgcCBpbiBwYXQuY29udGVudDoKKyAgICAgICAgICAgIGZvciB4IGluIHA6CisgICAgICAgICAgICAgICAgci51cGRhdGUoX2dldF9oZWFkX3R5cGVzKHgpKQorICAgICAgICByZXR1cm4gcgorCisgICAgcmFpc2UgRXhjZXB0aW9uKCJPaCBubyEgSSBkb24ndCB1bmRlcnN0YW5kIHBhdHRlcm4gJXMiICUocGF0KSkKKworCitkZWYgX2dldF9oZWFkbm9kZV9kaWN0KGZpeGVyX2xpc3QpOgorICAgICIiIiBBY2NlcHRzIGEgbGlzdCBvZiBmaXhlcnMgYW5kIHJldHVybnMgYSBkaWN0aW9uYXJ5CisgICAgICAgIG9mIGhlYWQgbm9kZSB0eXBlIC0tPiBmaXhlciBsaXN0LiAgIiIiCisgICAgaGVhZF9ub2RlcyA9IGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0KGxpc3QpCisgICAgZXZlcnkgPSBbXQorICAgIGZvciBmaXhlciBpbiBmaXhlcl9saXN0OgorICAgICAgICBpZiBmaXhlci5wYXR0ZXJuOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGhlYWRzID0gX2dldF9oZWFkX3R5cGVzKGZpeGVyLnBhdHRlcm4pCisgICAgICAgICAgICBleGNlcHQgX0V2ZXJ5Tm9kZToKKyAgICAgICAgICAgICAgICBldmVyeS5hcHBlbmQoZml4ZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBub2RlX3R5cGUgaW4gaGVhZHM6CisgICAgICAgICAgICAgICAgICAgIGhlYWRfbm9kZXNbbm9kZV90eXBlXS5hcHBlbmQoZml4ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBmaXhlci5fYWNjZXB0X3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaGVhZF9ub2Rlc1tmaXhlci5fYWNjZXB0X3R5cGVdLmFwcGVuZChmaXhlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXZlcnkuYXBwZW5kKGZpeGVyKQorICAgIGZvciBub2RlX3R5cGUgaW4gY2hhaW4ocHlncmFtLnB5dGhvbl9ncmFtbWFyLnN5bWJvbDJudW1iZXIuaXRlcnZhbHVlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlncmFtLnB5dGhvbl9ncmFtbWFyLnRva2Vucyk6CisgICAgICAgIGhlYWRfbm9kZXNbbm9kZV90eXBlXS5leHRlbmQoZXZlcnkpCisgICAgcmV0dXJuIGRpY3QoaGVhZF9ub2RlcykKKworCitkZWYgZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UocGtnX25hbWUpOgorICAgICIiIgorICAgIFJldHVybiB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIGZvciBmaXhlcnMgaW4gdGhlIHBhY2thZ2UgcGtnX25hbWUuCisgICAgIiIiCisgICAgcmV0dXJuIFtwa2dfbmFtZSArICIuIiArIGZpeF9uYW1lCisgICAgICAgICAgICBmb3IgZml4X25hbWUgaW4gZ2V0X2FsbF9maXhfbmFtZXMocGtnX25hbWUsIEZhbHNlKV0KKworZGVmIF9pZGVudGl0eShvYmopOgorICAgIHJldHVybiBvYmoKKworaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCAwKToKKyAgICBpbXBvcnQgY29kZWNzCisgICAgX29wZW5fd2l0aF9lbmNvZGluZyA9IGNvZGVjcy5vcGVuCisgICAgIyBjb2RlY3Mub3BlbiBkb2Vzbid0IHRyYW5zbGF0ZSBuZXdsaW5lcyBzYWRseS4KKyAgICBkZWYgX2Zyb21fc3lzdGVtX25ld2xpbmVzKGlucHV0KToKKyAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UodSJcclxuIiwgdSJcbiIpCisgICAgZGVmIF90b19zeXN0ZW1fbmV3bGluZXMoaW5wdXQpOgorICAgICAgICBpZiBvcy5saW5lc2VwICE9ICJcbiI6CisgICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSh1IlxuIiwgb3MubGluZXNlcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpbnB1dAorZWxzZToKKyAgICBfb3Blbl93aXRoX2VuY29kaW5nID0gb3BlbgorICAgIF9mcm9tX3N5c3RlbV9uZXdsaW5lcyA9IF9pZGVudGl0eQorICAgIF90b19zeXN0ZW1fbmV3bGluZXMgPSBfaWRlbnRpdHkKKworCitkZWYgX2RldGVjdF9mdXR1cmVfZmVhdHVyZXMoc291cmNlKToKKyAgICBoYXZlX2RvY3N0cmluZyA9IEZhbHNlCisgICAgZ2VuID0gdG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKFN0cmluZ0lPLlN0cmluZ0lPKHNvdXJjZSkucmVhZGxpbmUpCisgICAgZGVmIGFkdmFuY2UoKToKKyAgICAgICAgdG9rID0gZ2VuLm5leHQoKQorICAgICAgICByZXR1cm4gdG9rWzBdLCB0b2tbMV0KKyAgICBpZ25vcmUgPSBmcm96ZW5zZXQoKHRva2VuLk5FV0xJTkUsIHRva2VuaXplLk5MLCB0b2tlbi5DT01NRU5UKSkKKyAgICBmZWF0dXJlcyA9IHNldCgpCisgICAgdHJ5OgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICBpZiB0cCBpbiBpZ25vcmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdHAgPT0gdG9rZW4uU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmIGhhdmVfZG9jc3RyaW5nOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGhhdmVfZG9jc3RyaW5nID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiB0cCA9PSB0b2tlbi5OQU1FIGFuZCB2YWx1ZSA9PSB1ImZyb20iOgorICAgICAgICAgICAgICAgIHRwLCB2YWx1ZSA9IGFkdmFuY2UoKQorICAgICAgICAgICAgICAgIGlmIHRwICE9IHRva2VuLk5BTUUgb3IgdmFsdWUgIT0gdSJfX2Z1dHVyZV9fIjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgICAgICBpZiB0cCAhPSB0b2tlbi5OQU1FIG9yIHZhbHVlICE9IHUiaW1wb3J0IjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgICAgICBpZiB0cCA9PSB0b2tlbi5PUCBhbmQgdmFsdWUgPT0gdSIoIjoKKyAgICAgICAgICAgICAgICAgICAgdHAsIHZhbHVlID0gYWR2YW5jZSgpCisgICAgICAgICAgICAgICAgd2hpbGUgdHAgPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMuYWRkKHZhbHVlKQorICAgICAgICAgICAgICAgICAgICB0cCwgdmFsdWUgPSBhZHZhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHAgIT0gdG9rZW4uT1Agb3IgdmFsdWUgIT0gdSIsIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHRwLCB2YWx1ZSA9IGFkdmFuY2UoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIGZyb3plbnNldChmZWF0dXJlcykKKworCitjbGFzcyBGaXhlckVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiQSBmaXhlciBjb3VsZCBub3QgYmUgbG9hZGVkLiIiIgorCisKK2NsYXNzIFJlZmFjdG9yaW5nVG9vbChvYmplY3QpOgorCisgICAgX2RlZmF1bHRfb3B0aW9ucyA9IHsicHJpbnRfZnVuY3Rpb24iIDogRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAid3JpdGVfdW5jaGFuZ2VkX2ZpbGVzIiA6IEZhbHNlfQorCisgICAgQ0xBU1NfUFJFRklYID0gIkZpeCIgIyBUaGUgcHJlZml4IGZvciBmaXhlciBjbGFzc2VzCisgICAgRklMRV9QUkVGSVggPSAiZml4XyIgIyBUaGUgcHJlZml4IGZvciBtb2R1bGVzIHdpdGggYSBmaXhlciB3aXRoaW4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaXhlcl9uYW1lcywgb3B0aW9ucz1Ob25lLCBleHBsaWNpdD1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZXIuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIGZpeGVyX25hbWVzOiBhIGxpc3Qgb2YgZml4ZXJzIHRvIGltcG9ydAorICAgICAgICAgICAgb3B0aW9uczogYW4gZGljdCB3aXRoIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICBleHBsaWNpdDogYSBsaXN0IG9mIGZpeGVycyB0byBydW4gZXZlbiBpZiB0aGV5IGFyZSBleHBsaWNpdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZml4ZXJzID0gZml4ZXJfbmFtZXMKKyAgICAgICAgc2VsZi5leHBsaWNpdCA9IGV4cGxpY2l0IG9yIFtdCisgICAgICAgIHNlbGYub3B0aW9ucyA9IHNlbGYuX2RlZmF1bHRfb3B0aW9ucy5jb3B5KCkKKyAgICAgICAgaWYgb3B0aW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYub3B0aW9ucy51cGRhdGUob3B0aW9ucykKKyAgICAgICAgaWYgc2VsZi5vcHRpb25zWyJwcmludF9mdW5jdGlvbiJdOgorICAgICAgICAgICAgc2VsZi5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyX25vX3ByaW50X3N0YXRlbWVudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyCisgICAgICAgICMgV2hlbiB0aGlzIGlzIFRydWUsIHRoZSByZWZhY3RvciooKSBtZXRob2RzIHdpbGwgY2FsbCB3cml0ZV9maWxlKCkgZm9yCisgICAgICAgICMgZmlsZXMgcHJvY2Vzc2VkIGV2ZW4gaWYgdGhleSB3ZXJlIG5vdCBjaGFuZ2VkIGR1cmluZyByZWZhY3RvcmluZy4gSWYKKyAgICAgICAgIyBhbmQgb25seSBpZiB0aGUgcmVmYWN0b3IgbWV0aG9kJ3Mgd3JpdGUgcGFyYW1ldGVyIHdhcyBUcnVlLgorICAgICAgICBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyA9IHNlbGYub3B0aW9ucy5nZXQoIndyaXRlX3VuY2hhbmdlZF9maWxlcyIpCisgICAgICAgIHNlbGYuZXJyb3JzID0gW10KKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiUmVmYWN0b3JpbmdUb29sIikKKyAgICAgICAgc2VsZi5maXhlcl9sb2cgPSBbXQorICAgICAgICBzZWxmLndyb3RlID0gRmFsc2UKKyAgICAgICAgc2VsZi5kcml2ZXIgPSBkcml2ZXIuRHJpdmVyKHNlbGYuZ3JhbW1hciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnQ9cHl0cmVlLmNvbnZlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXI9c2VsZi5sb2dnZXIpCisgICAgICAgIHNlbGYucHJlX29yZGVyLCBzZWxmLnBvc3Rfb3JkZXIgPSBzZWxmLmdldF9maXhlcnMoKQorCisKKyAgICAgICAgc2VsZi5maWxlcyA9IFtdICAjIExpc3Qgb2YgZmlsZXMgdGhhdCB3ZXJlIG9yIHNob3VsZCBiZSBtb2RpZmllZAorCisgICAgICAgIHNlbGYuQk0gPSBibS5Cb3R0b21NYXRjaGVyKCkKKyAgICAgICAgc2VsZi5ibWlfcHJlX29yZGVyID0gW10gIyBCb3R0b20gTWF0Y2hlciBpbmNvbXBhdGlibGUgZml4ZXJzCisgICAgICAgIHNlbGYuYm1pX3Bvc3Rfb3JkZXIgPSBbXQorCisgICAgICAgIGZvciBmaXhlciBpbiBjaGFpbihzZWxmLnBvc3Rfb3JkZXIsIHNlbGYucHJlX29yZGVyKToKKyAgICAgICAgICAgIGlmIGZpeGVyLkJNX2NvbXBhdGlibGU6CisgICAgICAgICAgICAgICAgc2VsZi5CTS5hZGRfZml4ZXIoZml4ZXIpCisgICAgICAgICAgICAgICAgIyByZW1vdmUgZml4ZXJzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBib3R0b20tdXAKKyAgICAgICAgICAgICAgICAjIG1hdGNoZXIKKyAgICAgICAgICAgIGVsaWYgZml4ZXIgaW4gc2VsZi5wcmVfb3JkZXI6CisgICAgICAgICAgICAgICAgc2VsZi5ibWlfcHJlX29yZGVyLmFwcGVuZChmaXhlcikKKyAgICAgICAgICAgIGVsaWYgZml4ZXIgaW4gc2VsZi5wb3N0X29yZGVyOgorICAgICAgICAgICAgICAgIHNlbGYuYm1pX3Bvc3Rfb3JkZXIuYXBwZW5kKGZpeGVyKQorCisgICAgICAgIHNlbGYuYm1pX3ByZV9vcmRlcl9oZWFkcyA9IF9nZXRfaGVhZG5vZGVfZGljdChzZWxmLmJtaV9wcmVfb3JkZXIpCisgICAgICAgIHNlbGYuYm1pX3Bvc3Rfb3JkZXJfaGVhZHMgPSBfZ2V0X2hlYWRub2RlX2RpY3Qoc2VsZi5ibWlfcG9zdF9vcmRlcikKKworCisKKyAgICBkZWYgZ2V0X2ZpeGVycyhzZWxmKToKKyAgICAgICAgIiIiSW5zcGVjdHMgdGhlIG9wdGlvbnMgdG8gbG9hZCB0aGUgcmVxdWVzdGVkIHBhdHRlcm5zIGFuZCBoYW5kbGVycy4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgIChwcmVfb3JkZXIsIHBvc3Rfb3JkZXIpLCB3aGVyZSBwcmVfb3JkZXIgaXMgdGhlIGxpc3Qgb2YgZml4ZXJzIHRoYXQKKyAgICAgICAgICB3YW50IGEgcHJlLW9yZGVyIEFTVCB0cmF2ZXJzYWwsIGFuZCBwb3N0X29yZGVyIGlzIHRoZSBsaXN0IHRoYXQgd2FudAorICAgICAgICAgIHBvc3Qtb3JkZXIgdHJhdmVyc2FsLgorICAgICAgICAiIiIKKyAgICAgICAgcHJlX29yZGVyX2ZpeGVycyA9IFtdCisgICAgICAgIHBvc3Rfb3JkZXJfZml4ZXJzID0gW10KKyAgICAgICAgZm9yIGZpeF9tb2RfcGF0aCBpbiBzZWxmLmZpeGVyczoKKyAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oZml4X21vZF9wYXRoLCB7fSwge30sIFsiKiJdKQorICAgICAgICAgICAgZml4X25hbWUgPSBmaXhfbW9kX3BhdGgucnNwbGl0KCIuIiwgMSlbLTFdCisgICAgICAgICAgICBpZiBmaXhfbmFtZS5zdGFydHN3aXRoKHNlbGYuRklMRV9QUkVGSVgpOgorICAgICAgICAgICAgICAgIGZpeF9uYW1lID0gZml4X25hbWVbbGVuKHNlbGYuRklMRV9QUkVGSVgpOl0KKyAgICAgICAgICAgIHBhcnRzID0gZml4X25hbWUuc3BsaXQoIl8iKQorICAgICAgICAgICAgY2xhc3NfbmFtZSA9IHNlbGYuQ0xBU1NfUFJFRklYICsgIiIuam9pbihbcC50aXRsZSgpIGZvciBwIGluIHBhcnRzXSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaXhfY2xhc3MgPSBnZXRhdHRyKG1vZCwgY2xhc3NfbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBGaXhlckVycm9yKCJDYW4ndCBmaW5kICVzLiVzIiAlIChmaXhfbmFtZSwgY2xhc3NfbmFtZSkpCisgICAgICAgICAgICBmaXhlciA9IGZpeF9jbGFzcyhzZWxmLm9wdGlvbnMsIHNlbGYuZml4ZXJfbG9nKQorICAgICAgICAgICAgaWYgZml4ZXIuZXhwbGljaXQgYW5kIHNlbGYuZXhwbGljaXQgaXMgbm90IFRydWUgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgZml4X21vZF9wYXRoIG5vdCBpbiBzZWxmLmV4cGxpY2l0OgorICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIlNraXBwaW5nIGltcGxpY2l0IGZpeGVyOiAlcyIsIGZpeF9uYW1lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJBZGRpbmcgdHJhbnNmb3JtYXRpb246ICVzIiwgZml4X25hbWUpCisgICAgICAgICAgICBpZiBmaXhlci5vcmRlciA9PSAicHJlIjoKKyAgICAgICAgICAgICAgICBwcmVfb3JkZXJfZml4ZXJzLmFwcGVuZChmaXhlcikKKyAgICAgICAgICAgIGVsaWYgZml4ZXIub3JkZXIgPT0gInBvc3QiOgorICAgICAgICAgICAgICAgIHBvc3Rfb3JkZXJfZml4ZXJzLmFwcGVuZChmaXhlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRml4ZXJFcnJvcigiSWxsZWdhbCBmaXhlciBvcmRlcjogJXIiICUgZml4ZXIub3JkZXIpCisKKyAgICAgICAga2V5X2Z1bmMgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKCJydW5fb3JkZXIiKQorICAgICAgICBwcmVfb3JkZXJfZml4ZXJzLnNvcnQoa2V5PWtleV9mdW5jKQorICAgICAgICBwb3N0X29yZGVyX2ZpeGVycy5zb3J0KGtleT1rZXlfZnVuYykKKyAgICAgICAgcmV0dXJuIChwcmVfb3JkZXJfZml4ZXJzLCBwb3N0X29yZGVyX2ZpeGVycykKKworICAgIGRlZiBsb2dfZXJyb3Ioc2VsZiwgbXNnLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgIiIiQ2FsbGVkIHdoZW4gYW4gZXJyb3Igb2NjdXJzLiIiIgorICAgICAgICByYWlzZQorCisgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICAiIiJIb29rIHRvIGxvZyBhIG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICBtc2cgPSBtc2cgJSBhcmdzCisgICAgICAgIHNlbGYubG9nZ2VyLmluZm8obXNnKQorCisgICAgZGVmIGxvZ19kZWJ1ZyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIG1zZyA9IG1zZyAlIGFyZ3MKKyAgICAgICAgc2VsZi5sb2dnZXIuZGVidWcobXNnKQorCisgICAgZGVmIHByaW50X291dHB1dChzZWxmLCBvbGRfdGV4dCwgbmV3X3RleHQsIGZpbGVuYW1lLCBlcXVhbCk6CisgICAgICAgICIiIkNhbGxlZCB3aXRoIHRoZSBvbGQgdmVyc2lvbiwgbmV3IHZlcnNpb24sIGFuZCBmaWxlbmFtZSBvZiBhCisgICAgICAgIHJlZmFjdG9yZWQgZmlsZS4iIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJlZmFjdG9yKHNlbGYsIGl0ZW1zLCB3cml0ZT1GYWxzZSwgZG9jdGVzdHNfb25seT1GYWxzZSk6CisgICAgICAgICIiIlJlZmFjdG9yIGEgbGlzdCBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMuIiIiCisKKyAgICAgICAgZm9yIGRpcl9vcl9maWxlIGluIGl0ZW1zOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXJfb3JfZmlsZSk6CisgICAgICAgICAgICAgICAgc2VsZi5yZWZhY3Rvcl9kaXIoZGlyX29yX2ZpbGUsIHdyaXRlLCBkb2N0ZXN0c19vbmx5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJlZmFjdG9yX2ZpbGUoZGlyX29yX2ZpbGUsIHdyaXRlLCBkb2N0ZXN0c19vbmx5KQorCisgICAgZGVmIHJlZmFjdG9yX2RpcihzZWxmLCBkaXJfbmFtZSwgd3JpdGU9RmFsc2UsIGRvY3Rlc3RzX29ubHk9RmFsc2UpOgorICAgICAgICAiIiJEZXNjZW5kcyBkb3duIGEgZGlyZWN0b3J5IGFuZCByZWZhY3RvciBldmVyeSBQeXRob24gZmlsZSBmb3VuZC4KKworICAgICAgICBQeXRob24gZmlsZXMgYXJlIGFzc3VtZWQgdG8gaGF2ZSBhIC5weSBleHRlbnNpb24uCisKKyAgICAgICAgRmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHN0YXJ0aW5nIHdpdGggJy4nIGFyZSBza2lwcGVkLgorICAgICAgICAiIiIKKyAgICAgICAgcHlfZXh0ID0gb3MuZXh0c2VwICsgInB5IgorICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGRpcl9uYW1lKToKKyAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJEZXNjZW5kaW5nIGludG8gJXMiLCBkaXJwYXRoKQorICAgICAgICAgICAgZGlybmFtZXMuc29ydCgpCisgICAgICAgICAgICBmaWxlbmFtZXMuc29ydCgpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgaWYgKG5vdCBuYW1lLnN0YXJ0c3dpdGgoIi4iKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5zcGxpdGV4dChuYW1lKVsxXSA9PSBweV9leHQpOgorICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZmFjdG9yX2ZpbGUoZnVsbG5hbWUsIHdyaXRlLCBkb2N0ZXN0c19vbmx5KQorICAgICAgICAgICAgIyBNb2RpZnkgZGlybmFtZXMgaW4tcGxhY2UgdG8gcmVtb3ZlIHN1YmRpcnMgd2l0aCBsZWFkaW5nIGRvdHMKKyAgICAgICAgICAgIGRpcm5hbWVzWzpdID0gW2RuIGZvciBkbiBpbiBkaXJuYW1lcyBpZiBub3QgZG4uc3RhcnRzd2l0aCgiLiIpXQorCisgICAgZGVmIF9yZWFkX3B5dGhvbl9zb3VyY2Uoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgRG8gb3VyIGJlc3QgdG8gZGVjb2RlIGEgUHl0aG9uIHNvdXJjZSBmaWxlIGNvcnJlY3RseS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAicmIiKQorICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnI6CisgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiQ2FuJ3Qgb3BlbiAlczogJXMiLCBmaWxlbmFtZSwgZXJyKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jb2RpbmcgPSB0b2tlbml6ZS5kZXRlY3RfZW5jb2RpbmcoZi5yZWFkbGluZSlbMF0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB3aXRoIF9vcGVuX3dpdGhfZW5jb2RpbmcoZmlsZW5hbWUsICJyIiwgZW5jb2Rpbmc9ZW5jb2RpbmcpIGFzIGY6CisgICAgICAgICAgICByZXR1cm4gX2Zyb21fc3lzdGVtX25ld2xpbmVzKGYucmVhZCgpKSwgZW5jb2RpbmcKKworICAgIGRlZiByZWZhY3Rvcl9maWxlKHNlbGYsIGZpbGVuYW1lLCB3cml0ZT1GYWxzZSwgZG9jdGVzdHNfb25seT1GYWxzZSk6CisgICAgICAgICIiIlJlZmFjdG9ycyBhIGZpbGUuIiIiCisgICAgICAgIGlucHV0LCBlbmNvZGluZyA9IHNlbGYuX3JlYWRfcHl0aG9uX3NvdXJjZShmaWxlbmFtZSkKKyAgICAgICAgaWYgaW5wdXQgaXMgTm9uZToKKyAgICAgICAgICAgICMgUmVhZGluZyB0aGUgZmlsZSBmYWlsZWQuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW5wdXQgKz0gdSJcbiIgIyBTaWxlbmNlIGNlcnRhaW4gcGFyc2UgZXJyb3JzCisgICAgICAgIGlmIGRvY3Rlc3RzX29ubHk6CisgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiUmVmYWN0b3JpbmcgZG9jdGVzdHMgaW4gJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIG91dHB1dCA9IHNlbGYucmVmYWN0b3JfZG9jc3RyaW5nKGlucHV0LCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIHNlbGYud3JpdGVfdW5jaGFuZ2VkX2ZpbGVzIG9yIG91dHB1dCAhPSBpbnB1dDoKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NlZF9maWxlKG91dHB1dCwgZmlsZW5hbWUsIGlucHV0LCB3cml0ZSwgZW5jb2RpbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJObyBkb2N0ZXN0IGNoYW5nZXMgaW4gJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyZWUgPSBzZWxmLnJlZmFjdG9yX3N0cmluZyhpbnB1dCwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyBvciAodHJlZSBhbmQgdHJlZS53YXNfY2hhbmdlZCk6CisgICAgICAgICAgICAgICAgIyBUaGUgWzotMV0gaXMgdG8gdGFrZSBvZmYgdGhlIFxuIHdlIGFkZGVkIGVhcmxpZXIKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NlZF9maWxlKHVuaWNvZGUodHJlZSlbOi0xXSwgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZT13cml0ZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJObyBjaGFuZ2VzIGluICVzIiwgZmlsZW5hbWUpCisKKyAgICBkZWYgcmVmYWN0b3Jfc3RyaW5nKHNlbGYsIGRhdGEsIG5hbWUpOgorICAgICAgICAiIiJSZWZhY3RvciBhIGdpdmVuIGlucHV0IHN0cmluZy4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgZGF0YTogYSBzdHJpbmcgaG9sZGluZyB0aGUgY29kZSB0byBiZSByZWZhY3RvcmVkLgorICAgICAgICAgICAgbmFtZTogYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB1c2UgaW4gZXJyb3IvbG9nIG1lc3NhZ2VzLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBBbiBBU1QgY29ycmVzcG9uZGluZyB0byB0aGUgcmVmYWN0b3JlZCBpbnB1dCBzdHJlYW07IE5vbmUgaWYKKyAgICAgICAgICAgIHRoZXJlIHdlcmUgZXJyb3JzIGR1cmluZyB0aGUgcGFyc2UuCisgICAgICAgICIiIgorICAgICAgICBmZWF0dXJlcyA9IF9kZXRlY3RfZnV0dXJlX2ZlYXR1cmVzKGRhdGEpCisgICAgICAgIGlmICJwcmludF9mdW5jdGlvbiIgaW4gZmVhdHVyZXM6CisgICAgICAgICAgICBzZWxmLmRyaXZlci5ncmFtbWFyID0gcHlncmFtLnB5dGhvbl9ncmFtbWFyX25vX3ByaW50X3N0YXRlbWVudAorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cmVlID0gc2VsZi5kcml2ZXIucGFyc2Vfc3RyaW5nKGRhdGEpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXJyOgorICAgICAgICAgICAgc2VsZi5sb2dfZXJyb3IoIkNhbid0IHBhcnNlICVzOiAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgZXJyLl9fY2xhc3NfXy5fX25hbWVfXywgZXJyKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmRyaXZlci5ncmFtbWFyID0gc2VsZi5ncmFtbWFyCisgICAgICAgIHRyZWUuZnV0dXJlX2ZlYXR1cmVzID0gZmVhdHVyZXMKKyAgICAgICAgc2VsZi5sb2dfZGVidWcoIlJlZmFjdG9yaW5nICVzIiwgbmFtZSkKKyAgICAgICAgc2VsZi5yZWZhY3Rvcl90cmVlKHRyZWUsIG5hbWUpCisgICAgICAgIHJldHVybiB0cmVlCisKKyAgICBkZWYgcmVmYWN0b3Jfc3RkaW4oc2VsZiwgZG9jdGVzdHNfb25seT1GYWxzZSk6CisgICAgICAgIGlucHV0ID0gc3lzLnN0ZGluLnJlYWQoKQorICAgICAgICBpZiBkb2N0ZXN0c19vbmx5OgorICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIlJlZmFjdG9yaW5nIGRvY3Rlc3RzIGluIHN0ZGluIikKKyAgICAgICAgICAgIG91dHB1dCA9IHNlbGYucmVmYWN0b3JfZG9jc3RyaW5nKGlucHV0LCAiPHN0ZGluPiIpCisgICAgICAgICAgICBpZiBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyBvciBvdXRwdXQgIT0gaW5wdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZShvdXRwdXQsICI8c3RkaW4+IiwgaW5wdXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX2RlYnVnKCJObyBkb2N0ZXN0IGNoYW5nZXMgaW4gc3RkaW4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJlZSA9IHNlbGYucmVmYWN0b3Jfc3RyaW5nKGlucHV0LCAiPHN0ZGluPiIpCisgICAgICAgICAgICBpZiBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlcyBvciAodHJlZSBhbmQgdHJlZS53YXNfY2hhbmdlZCk6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzZWRfZmlsZSh1bmljb2RlKHRyZWUpLCAiPHN0ZGluPiIsIGlucHV0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm8gY2hhbmdlcyBpbiBzdGRpbiIpCisKKyAgICBkZWYgcmVmYWN0b3JfdHJlZShzZWxmLCB0cmVlLCBuYW1lKToKKyAgICAgICAgIiIiUmVmYWN0b3JzIGEgcGFyc2UgdHJlZSAobW9kaWZ5aW5nIHRoZSB0cmVlIGluIHBsYWNlKS4KKworICAgICAgICBGb3IgY29tcGF0aWJsZSBwYXR0ZXJucyB0aGUgYm90dG9tIG1hdGNoZXIgbW9kdWxlIGlzCisgICAgICAgIHVzZWQuIE90aGVyd2lzZSB0aGUgdHJlZSBpcyB0cmF2ZXJzZWQgbm9kZS10by1ub2RlIGZvcgorICAgICAgICBtYXRjaGVzLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICB0cmVlOiBhIHB5dHJlZS5Ob2RlIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgcm9vdCBvZiB0aGUgdHJlZQorICAgICAgICAgICAgICAgICAgdG8gYmUgcmVmYWN0b3JlZC4KKyAgICAgICAgICAgIG5hbWU6IGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgdGhpcyB0cmVlLgorCisgICAgICAgIFJldHVybnM6CisgICAgICAgICAgICBUcnVlIGlmIHRoZSB0cmVlIHdhcyBtb2RpZmllZCwgRmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAiIiIKKworICAgICAgICBmb3IgZml4ZXIgaW4gY2hhaW4oc2VsZi5wcmVfb3JkZXIsIHNlbGYucG9zdF9vcmRlcik6CisgICAgICAgICAgICBmaXhlci5zdGFydF90cmVlKHRyZWUsIG5hbWUpCisKKyAgICAgICAgI3VzZSB0cmFkaXRpb25hbCBtYXRjaGluZyBmb3IgdGhlIGluY29tcGF0aWJsZSBmaXhlcnMKKyAgICAgICAgc2VsZi50cmF2ZXJzZV9ieShzZWxmLmJtaV9wcmVfb3JkZXJfaGVhZHMsIHRyZWUucHJlX29yZGVyKCkpCisgICAgICAgIHNlbGYudHJhdmVyc2VfYnkoc2VsZi5ibWlfcG9zdF9vcmRlcl9oZWFkcywgdHJlZS5wb3N0X29yZGVyKCkpCisKKyAgICAgICAgIyBvYnRhaW4gYSBzZXQgb2YgY2FuZGlkYXRlIG5vZGVzCisgICAgICAgIG1hdGNoX3NldCA9IHNlbGYuQk0ucnVuKHRyZWUubGVhdmVzKCkpCisKKyAgICAgICAgd2hpbGUgYW55KG1hdGNoX3NldC52YWx1ZXMoKSk6CisgICAgICAgICAgICBmb3IgZml4ZXIgaW4gc2VsZi5CTS5maXhlcnM6CisgICAgICAgICAgICAgICAgaWYgZml4ZXIgaW4gbWF0Y2hfc2V0IGFuZCBtYXRjaF9zZXRbZml4ZXJdOgorICAgICAgICAgICAgICAgICAgICAjc29ydCBieSBkZXB0aDsgYXBwbHkgZml4ZXJzIGZyb20gYm90dG9tKG9mIHRoZSBBU1QpIHRvIHRvcAorICAgICAgICAgICAgICAgICAgICBtYXRjaF9zZXRbZml4ZXJdLnNvcnQoa2V5PXB5dHJlZS5CYXNlLmRlcHRoLCByZXZlcnNlPVRydWUpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgZml4ZXIua2VlcF9saW5lX29yZGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgI3NvbWUgZml4ZXJzKGVnIGZpeF9pbXBvcnRzKSBtdXN0IGJlIGFwcGxpZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICN3aXRoIHRoZSBvcmlnaW5hbCBmaWxlJ3MgbGluZSBvcmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfc2V0W2ZpeGVyXS5zb3J0KGtleT1weXRyZWUuQmFzZS5nZXRfbGluZW5vKQorCisgICAgICAgICAgICAgICAgICAgIGZvciBub2RlIGluIGxpc3QobWF0Y2hfc2V0W2ZpeGVyXSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub2RlIGluIG1hdGNoX3NldFtmaXhlcl06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hfc2V0W2ZpeGVyXS5yZW1vdmUobm9kZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfcm9vdChub2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGlzIG5vZGUgaGFzIGJlZW4gY3V0IG9mZiBmcm9tIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHByZXZpb3VzIHRyYW5zZm9ybWF0aW9uIDsgc2tpcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vZGUuZml4ZXJzX2FwcGxpZWQgYW5kIGZpeGVyIGluIG5vZGUuZml4ZXJzX2FwcGxpZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkbyBub3QgYXBwbHkgdGhlIHNhbWUgZml4ZXIgYWdhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gZml4ZXIubWF0Y2gobm9kZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0czoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgPSBmaXhlci50cmFuc2Zvcm0obm9kZSwgcmVzdWx0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuZXcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUucmVwbGFjZShuZXcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNuZXcuZml4ZXJzX2FwcGxpZWQuYXBwZW5kKGZpeGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igbm9kZSBpbiBuZXcucG9zdF9vcmRlcigpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkbyBub3QgYXBwbHkgdGhlIGZpeGVyIGFnYWluIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRoaXMgb3IgYW55IHN1Ym5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBub2RlLmZpeGVyc19hcHBsaWVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZml4ZXJzX2FwcGxpZWQgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5maXhlcnNfYXBwbGllZC5hcHBlbmQoZml4ZXIpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cGRhdGUgdGhlIG9yaWdpbmFsIG1hdGNoIHNldCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgYWRkZWQgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfbWF0Y2hlcyA9IHNlbGYuQk0ucnVuKG5ldy5sZWF2ZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZ4ciBpbiBuZXdfbWF0Y2hlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmeHIgaW4gbWF0Y2hfc2V0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3NldFtmeHJdPVtdCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoX3NldFtmeHJdLmV4dGVuZChuZXdfbWF0Y2hlc1tmeHJdKQorCisgICAgICAgIGZvciBmaXhlciBpbiBjaGFpbihzZWxmLnByZV9vcmRlciwgc2VsZi5wb3N0X29yZGVyKToKKyAgICAgICAgICAgIGZpeGVyLmZpbmlzaF90cmVlKHRyZWUsIG5hbWUpCisgICAgICAgIHJldHVybiB0cmVlLndhc19jaGFuZ2VkCisKKyAgICBkZWYgdHJhdmVyc2VfYnkoc2VsZiwgZml4ZXJzLCB0cmF2ZXJzYWwpOgorICAgICAgICAiIiJUcmF2ZXJzZSBhbiBBU1QsIGFwcGx5aW5nIGEgc2V0IG9mIGZpeGVycyB0byBlYWNoIG5vZGUuCisKKyAgICAgICAgVGhpcyBpcyBhIGhlbHBlciBtZXRob2QgZm9yIHJlZmFjdG9yX3RyZWUoKS4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgZml4ZXJzOiBhIGxpc3Qgb2YgZml4ZXIgaW5zdGFuY2VzLgorICAgICAgICAgICAgdHJhdmVyc2FsOiBhIGdlbmVyYXRvciB0aGF0IHlpZWxkcyBBU1Qgbm9kZXMuCisKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgICAgIE5vbmUKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBmaXhlcnM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIG5vZGUgaW4gdHJhdmVyc2FsOgorICAgICAgICAgICAgZm9yIGZpeGVyIGluIGZpeGVyc1tub2RlLnR5cGVdOgorICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBmaXhlci5tYXRjaChub2RlKQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdHM6CisgICAgICAgICAgICAgICAgICAgIG5ldyA9IGZpeGVyLnRyYW5zZm9ybShub2RlLCByZXN1bHRzKQorICAgICAgICAgICAgICAgICAgICBpZiBuZXcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnJlcGxhY2UobmV3KQorICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ldworCisgICAgZGVmIHByb2Nlc3NlZF9maWxlKHNlbGYsIG5ld190ZXh0LCBmaWxlbmFtZSwgb2xkX3RleHQ9Tm9uZSwgd3JpdGU9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2FsbGVkIHdoZW4gYSBmaWxlIGhhcyBiZWVuIHJlZmFjdG9yZWQgYW5kIHRoZXJlIG1heSBiZSBjaGFuZ2VzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxlcy5hcHBlbmQoZmlsZW5hbWUpCisgICAgICAgIGlmIG9sZF90ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICBvbGRfdGV4dCA9IHNlbGYuX3JlYWRfcHl0aG9uX3NvdXJjZShmaWxlbmFtZSlbMF0KKyAgICAgICAgICAgIGlmIG9sZF90ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVxdWFsID0gb2xkX3RleHQgPT0gbmV3X3RleHQKKyAgICAgICAgc2VsZi5wcmludF9vdXRwdXQob2xkX3RleHQsIG5ld190ZXh0LCBmaWxlbmFtZSwgZXF1YWwpCisgICAgICAgIGlmIGVxdWFsOgorICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIk5vIGNoYW5nZXMgdG8gJXMiLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLndyaXRlX3VuY2hhbmdlZF9maWxlczoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgd3JpdGU6CisgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUobmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dCwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvZ19kZWJ1ZygiTm90IHdyaXRpbmcgY2hhbmdlcyB0byAlcyIsIGZpbGVuYW1lKQorCisgICAgZGVmIHdyaXRlX2ZpbGUoc2VsZiwgbmV3X3RleHQsIGZpbGVuYW1lLCBvbGRfdGV4dCwgZW5jb2Rpbmc9Tm9uZSk6CisgICAgICAgICIiIldyaXRlcyBhIHN0cmluZyB0byBhIGZpbGUuCisKKyAgICAgICAgSXQgZmlyc3Qgc2hvd3MgYSB1bmlmaWVkIGRpZmYgYmV0d2VlbiB0aGUgb2xkIHRleHQgYW5kIHRoZSBuZXcgdGV4dCwgYW5kCisgICAgICAgIHRoZW4gcmV3cml0ZXMgdGhlIGZpbGU7IHRoZSBsYXR0ZXIgaXMgb25seSBkb25lIGlmIHRoZSB3cml0ZSBvcHRpb24gaXMKKyAgICAgICAgc2V0LgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IF9vcGVuX3dpdGhfZW5jb2RpbmcoZmlsZW5hbWUsICJ3IiwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvciBhcyBlcnI6CisgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiQ2FuJ3QgY3JlYXRlICVzOiAlcyIsIGZpbGVuYW1lLCBlcnIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZShfdG9fc3lzdGVtX25ld2xpbmVzKG5ld190ZXh0KSkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yIGFzIGVycjoKKyAgICAgICAgICAgIHNlbGYubG9nX2Vycm9yKCJDYW4ndCB3cml0ZSAlczogJXMiLCBmaWxlbmFtZSwgZXJyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYubG9nX2RlYnVnKCJXcm90ZSBjaGFuZ2VzIHRvICVzIiwgZmlsZW5hbWUpCisgICAgICAgIHNlbGYud3JvdGUgPSBUcnVlCisKKyAgICBQUzEgPSAiPj4+ICIKKyAgICBQUzIgPSAiLi4uICIKKworICAgIGRlZiByZWZhY3Rvcl9kb2NzdHJpbmcoc2VsZiwgaW5wdXQsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiUmVmYWN0b3JzIGEgZG9jc3RyaW5nLCBsb29raW5nIGZvciBkb2N0ZXN0cy4KKworICAgICAgICBUaGlzIHJldHVybnMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dCBzdHJpbmcuICBJdCBsb29rcworICAgICAgICBmb3IgZG9jdGVzdHMsIHdoaWNoIHN0YXJ0IHdpdGggYSAiPj4+IiBwcm9tcHQsIGFuZCBtYXkgYmUKKyAgICAgICAgY29udGludWVkIHdpdGggIi4uLiIgcHJvbXB0cywgYXMgbG9uZyBhcyB0aGUgIi4uLiIgaXMgaW5kZW50ZWQKKyAgICAgICAgdGhlIHNhbWUgYXMgdGhlICI+Pj4iLgorCisgICAgICAgIChVbmZvcnR1bmF0ZWx5IHdlIGNhbid0IHVzZSB0aGUgZG9jdGVzdCBtb2R1bGUncyBwYXJzZXIsCisgICAgICAgIHNpbmNlLCBsaWtlIG1vc3QgcGFyc2VycywgaXQgaXMgbm90IGdlYXJlZCB0b3dhcmRzIHByZXNlcnZpbmcKKyAgICAgICAgdGhlIG9yaWdpbmFsIHNvdXJjZS4pCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBibG9jayA9IE5vbmUKKyAgICAgICAgYmxvY2tfbGluZW5vID0gTm9uZQorICAgICAgICBpbmRlbnQgPSBOb25lCisgICAgICAgIGxpbmVubyA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQuc3BsaXRsaW5lcyhUcnVlKToKKyAgICAgICAgICAgIGxpbmVubyArPSAxCisgICAgICAgICAgICBpZiBsaW5lLmxzdHJpcCgpLnN0YXJ0c3dpdGgoc2VsZi5QUzEpOgorICAgICAgICAgICAgICAgIGlmIGJsb2NrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKHNlbGYucmVmYWN0b3JfZG9jdGVzdChibG9jaywgYmxvY2tfbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQsIGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICBibG9ja19saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgICAgICAgICBibG9jayA9IFtsaW5lXQorICAgICAgICAgICAgICAgIGkgPSBsaW5lLmZpbmQoc2VsZi5QUzEpCisgICAgICAgICAgICAgICAgaW5kZW50ID0gbGluZVs6aV0KKyAgICAgICAgICAgIGVsaWYgKGluZGVudCBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICAgIChsaW5lLnN0YXJ0c3dpdGgoaW5kZW50ICsgc2VsZi5QUzIpIG9yCisgICAgICAgICAgICAgICAgICAgbGluZSA9PSBpbmRlbnQgKyBzZWxmLlBTMi5yc3RyaXAoKSArIHUiXG4iKSk6CisgICAgICAgICAgICAgICAgYmxvY2suYXBwZW5kKGxpbmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGJsb2NrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKHNlbGYucmVmYWN0b3JfZG9jdGVzdChibG9jaywgYmxvY2tfbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQsIGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICBibG9jayA9IE5vbmUKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBOb25lCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKQorICAgICAgICBpZiBibG9jayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoc2VsZi5yZWZhY3Rvcl9kb2N0ZXN0KGJsb2NrLCBibG9ja19saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRlbnQsIGZpbGVuYW1lKSkKKyAgICAgICAgcmV0dXJuIHUiIi5qb2luKHJlc3VsdCkKKworICAgIGRlZiByZWZhY3Rvcl9kb2N0ZXN0KHNlbGYsIGJsb2NrLCBsaW5lbm8sIGluZGVudCwgZmlsZW5hbWUpOgorICAgICAgICAiIiJSZWZhY3RvcnMgb25lIGRvY3Rlc3QuCisKKyAgICAgICAgQSBkb2N0ZXN0IGlzIGdpdmVuIGFzIGEgYmxvY2sgb2YgbGluZXMsIHRoZSBmaXJzdCBvZiB3aGljaCBzdGFydHMKKyAgICAgICAgd2l0aCAiPj4+IiAocG9zc2libHkgaW5kZW50ZWQpLCB3aGlsZSB0aGUgcmVtYWluaW5nIGxpbmVzIHN0YXJ0CisgICAgICAgIHdpdGggIi4uLiIgKGlkZW50aWNhbGx5IGluZGVudGVkKS4KKworICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJlZSA9IHNlbGYucGFyc2VfYmxvY2soYmxvY2ssIGxpbmVubywgaW5kZW50KQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgICAgICAgIGlmIHNlbGYubG9nZ2VyLmlzRW5hYmxlZEZvcihsb2dnaW5nLkRFQlVHKToKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBibG9jazoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dfZGVidWcoIlNvdXJjZTogJXMiLCBsaW5lLnJzdHJpcCh1IlxuIikpCisgICAgICAgICAgICBzZWxmLmxvZ19lcnJvcigiQ2FuJ3QgcGFyc2UgZG9jc3RyaW5nIGluICVzIGxpbmUgJXM6ICVzOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBlcnIuX19jbGFzc19fLl9fbmFtZV9fLCBlcnIpCisgICAgICAgICAgICByZXR1cm4gYmxvY2sKKyAgICAgICAgaWYgc2VsZi5yZWZhY3Rvcl90cmVlKHRyZWUsIGZpbGVuYW1lKToKKyAgICAgICAgICAgIG5ldyA9IHVuaWNvZGUodHJlZSkuc3BsaXRsaW5lcyhUcnVlKQorICAgICAgICAgICAgIyBVbmRvIHRoZSBhZGp1c3RtZW50IG9mIHRoZSBsaW5lIG51bWJlcnMgaW4gd3JhcF90b2tzKCkgYmVsb3cuCisgICAgICAgICAgICBjbGlwcGVkLCBuZXcgPSBuZXdbOmxpbmVuby0xXSwgbmV3W2xpbmVuby0xOl0KKyAgICAgICAgICAgIGFzc2VydCBjbGlwcGVkID09IFt1IlxuIl0gKiAobGluZW5vLTEpLCBjbGlwcGVkCisgICAgICAgICAgICBpZiBub3QgbmV3Wy0xXS5lbmRzd2l0aCh1IlxuIik6CisgICAgICAgICAgICAgICAgbmV3Wy0xXSArPSB1IlxuIgorICAgICAgICAgICAgYmxvY2sgPSBbaW5kZW50ICsgc2VsZi5QUzEgKyBuZXcucG9wKDApXQorICAgICAgICAgICAgaWYgbmV3OgorICAgICAgICAgICAgICAgIGJsb2NrICs9IFtpbmRlbnQgKyBzZWxmLlBTMiArIGxpbmUgZm9yIGxpbmUgaW4gbmV3XQorICAgICAgICByZXR1cm4gYmxvY2sKKworICAgIGRlZiBzdW1tYXJpemUoc2VsZik6CisgICAgICAgIGlmIHNlbGYud3JvdGU6CisgICAgICAgICAgICB3ZXJlID0gIndlcmUiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3ZXJlID0gIm5lZWQgdG8gYmUiCisgICAgICAgIGlmIG5vdCBzZWxmLmZpbGVzOgorICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZSgiTm8gZmlsZXMgJXMgbW9kaWZpZWQuIiwgd2VyZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIkZpbGVzIHRoYXQgJXMgbW9kaWZpZWQ6Iiwgd2VyZSkKKyAgICAgICAgICAgIGZvciBmaWxlIGluIHNlbGYuZmlsZXM6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dfbWVzc2FnZShmaWxlKQorICAgICAgICBpZiBzZWxmLmZpeGVyX2xvZzoKKyAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIldhcm5pbmdzL21lc3NhZ2VzIHdoaWxlIHJlZmFjdG9yaW5nOiIpCisgICAgICAgICAgICBmb3IgbWVzc2FnZSBpbiBzZWxmLmZpeGVyX2xvZzoKKyAgICAgICAgICAgICAgICBzZWxmLmxvZ19tZXNzYWdlKG1lc3NhZ2UpCisgICAgICAgIGlmIHNlbGYuZXJyb3JzOgorICAgICAgICAgICAgaWYgbGVuKHNlbGYuZXJyb3JzKSA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIlRoZXJlIHdhcyAxIGVycm9yOiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UoIlRoZXJlIHdlcmUgJWQgZXJyb3JzOiIsIGxlbihzZWxmLmVycm9ycykpCisgICAgICAgICAgICBmb3IgbXNnLCBhcmdzLCBrd2RzIGluIHNlbGYuZXJyb3JzOgorICAgICAgICAgICAgICAgIHNlbGYubG9nX21lc3NhZ2UobXNnLCAqYXJncywgKiprd2RzKQorCisgICAgZGVmIHBhcnNlX2Jsb2NrKHNlbGYsIGJsb2NrLCBsaW5lbm8sIGluZGVudCk6CisgICAgICAgICIiIlBhcnNlcyBhIGJsb2NrIGludG8gYSB0cmVlLgorCisgICAgICAgIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIGdldCBjb3JyZWN0IGxpbmUgbnVtYmVyIC8gb2Zmc2V0IGluZm9ybWF0aW9uCisgICAgICAgIGluIHRoZSBwYXJzZXIgZGlhZ25vc3RpY3MgYW5kIGVtYmVkZGVkIGludG8gdGhlIHBhcnNlIHRyZWUuCisgICAgICAgICIiIgorICAgICAgICB0cmVlID0gc2VsZi5kcml2ZXIucGFyc2VfdG9rZW5zKHNlbGYud3JhcF90b2tzKGJsb2NrLCBsaW5lbm8sIGluZGVudCkpCisgICAgICAgIHRyZWUuZnV0dXJlX2ZlYXR1cmVzID0gZnJvemVuc2V0KCkKKyAgICAgICAgcmV0dXJuIHRyZWUKKworICAgIGRlZiB3cmFwX3Rva3Moc2VsZiwgYmxvY2ssIGxpbmVubywgaW5kZW50KToKKyAgICAgICAgIiIiV3JhcHMgYSB0b2tlbml6ZSBzdHJlYW0gdG8gc3lzdGVtYXRpY2FsbHkgbW9kaWZ5IHN0YXJ0L2VuZC4iIiIKKyAgICAgICAgdG9rZW5zID0gdG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKHNlbGYuZ2VuX2xpbmVzKGJsb2NrLCBpbmRlbnQpLm5leHQpCisgICAgICAgIGZvciB0eXBlLCB2YWx1ZSwgKGxpbmUwLCBjb2wwKSwgKGxpbmUxLCBjb2wxKSwgbGluZV90ZXh0IGluIHRva2VuczoKKyAgICAgICAgICAgIGxpbmUwICs9IGxpbmVubyAtIDEKKyAgICAgICAgICAgIGxpbmUxICs9IGxpbmVubyAtIDEKKyAgICAgICAgICAgICMgRG9uJ3QgYm90aGVyIHVwZGF0aW5nIHRoZSBjb2x1bW5zOyB0aGlzIGlzIHRvbyBjb21wbGljYXRlZAorICAgICAgICAgICAgIyBzaW5jZSBsaW5lX3RleHQgd291bGQgYWxzbyBoYXZlIHRvIGJlIHVwZGF0ZWQgYW5kIGl0IHdvdWxkCisgICAgICAgICAgICAjIHN0aWxsIGJyZWFrIGZvciB0b2tlbnMgc3Bhbm5pbmcgbGluZXMuICBMZXQgdGhlIHVzZXIgZ3Vlc3MKKyAgICAgICAgICAgICMgdGhhdCB0aGUgY29sdW1uIG51bWJlcnMgZm9yIGRvY3Rlc3RzIGFyZSByZWxhdGl2ZSB0byB0aGUKKyAgICAgICAgICAgICMgZW5kIG9mIHRoZSBwcm9tcHQgc3RyaW5nIChQUzEgb3IgUFMyKS4KKyAgICAgICAgICAgIHlpZWxkIHR5cGUsIHZhbHVlLCAobGluZTAsIGNvbDApLCAobGluZTEsIGNvbDEpLCBsaW5lX3RleHQKKworCisgICAgZGVmIGdlbl9saW5lcyhzZWxmLCBibG9jaywgaW5kZW50KToKKyAgICAgICAgIiIiR2VuZXJhdGVzIGxpbmVzIGFzIGV4cGVjdGVkIGJ5IHRva2VuaXplIGZyb20gYSBsaXN0IG9mIGxpbmVzLgorCisgICAgICAgIFRoaXMgc3RyaXBzIHRoZSBmaXJzdCBsZW4oaW5kZW50ICsgc2VsZi5QUzEpIGNoYXJhY3RlcnMgb2ZmIGVhY2ggbGluZS4KKyAgICAgICAgIiIiCisgICAgICAgIHByZWZpeDEgPSBpbmRlbnQgKyBzZWxmLlBTMQorICAgICAgICBwcmVmaXgyID0gaW5kZW50ICsgc2VsZi5QUzIKKyAgICAgICAgcHJlZml4ID0gcHJlZml4MQorICAgICAgICBmb3IgbGluZSBpbiBibG9jazoKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aChwcmVmaXgpOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmVbbGVuKHByZWZpeCk6XQorICAgICAgICAgICAgZWxpZiBsaW5lID09IHByZWZpeC5yc3RyaXAoKSArIHUiXG4iOgorICAgICAgICAgICAgICAgIHlpZWxkIHUiXG4iCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJsaW5lPSVyLCBwcmVmaXg9JXIiICUgKGxpbmUsIHByZWZpeCkpCisgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXgyCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB5aWVsZCAiIgorCisKK2NsYXNzIE11bHRpcHJvY2Vzc2luZ1Vuc3VwcG9ydGVkKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIE11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbChSZWZhY3RvcmluZ1Rvb2wpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHN1cGVyKE11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbCwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLnF1ZXVlID0gTm9uZQorICAgICAgICBzZWxmLm91dHB1dF9sb2NrID0gTm9uZQorCisgICAgZGVmIHJlZmFjdG9yKHNlbGYsIGl0ZW1zLCB3cml0ZT1GYWxzZSwgZG9jdGVzdHNfb25seT1GYWxzZSwKKyAgICAgICAgICAgICAgICAgbnVtX3Byb2Nlc3Nlcz0xKToKKyAgICAgICAgaWYgbnVtX3Byb2Nlc3NlcyA9PSAxOgorICAgICAgICAgICAgcmV0dXJuIHN1cGVyKE11bHRpcHJvY2Vzc1JlZmFjdG9yaW5nVG9vbCwgc2VsZikucmVmYWN0b3IoCisgICAgICAgICAgICAgICAgaXRlbXMsIHdyaXRlLCBkb2N0ZXN0c19vbmx5KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIE11bHRpcHJvY2Vzc2luZ1Vuc3VwcG9ydGVkCisgICAgICAgIGlmIHNlbGYucXVldWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImFscmVhZHkgZG9pbmcgbXVsdGlwbGUgcHJvY2Vzc2VzIikKKyAgICAgICAgc2VsZi5xdWV1ZSA9IG11bHRpcHJvY2Vzc2luZy5Kb2luYWJsZVF1ZXVlKCkKKyAgICAgICAgc2VsZi5vdXRwdXRfbG9jayA9IG11bHRpcHJvY2Vzc2luZy5Mb2NrKCkKKyAgICAgICAgcHJvY2Vzc2VzID0gW211bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1zZWxmLl9jaGlsZCkKKyAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShudW1fcHJvY2Vzc2VzKV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHAgaW4gcHJvY2Vzc2VzOgorICAgICAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgc3VwZXIoTXVsdGlwcm9jZXNzUmVmYWN0b3JpbmdUb29sLCBzZWxmKS5yZWZhY3RvcihpdGVtcywgd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3Rlc3RzX29ubHkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnF1ZXVlLmpvaW4oKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKG51bV9wcm9jZXNzZXMpOgorICAgICAgICAgICAgICAgIHNlbGYucXVldWUucHV0KE5vbmUpCisgICAgICAgICAgICBmb3IgcCBpbiBwcm9jZXNzZXM6CisgICAgICAgICAgICAgICAgaWYgcC5pc19hbGl2ZSgpOgorICAgICAgICAgICAgICAgICAgICBwLmpvaW4oKQorICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IE5vbmUKKworICAgIGRlZiBfY2hpbGQoc2VsZik6CisgICAgICAgIHRhc2sgPSBzZWxmLnF1ZXVlLmdldCgpCisgICAgICAgIHdoaWxlIHRhc2sgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzLCBrd2FyZ3MgPSB0YXNrCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3VwZXIoTXVsdGlwcm9jZXNzUmVmYWN0b3JpbmdUb29sLCBzZWxmKS5yZWZhY3Rvcl9maWxlKAorICAgICAgICAgICAgICAgICAgICAqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYucXVldWUudGFza19kb25lKCkKKyAgICAgICAgICAgIHRhc2sgPSBzZWxmLnF1ZXVlLmdldCgpCisKKyAgICBkZWYgcmVmYWN0b3JfZmlsZShzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBpZiBzZWxmLnF1ZXVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5xdWV1ZS5wdXQoKGFyZ3MsIGt3YXJncykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc3VwZXIoTXVsdGlwcm9jZXNzUmVmYWN0b3JpbmdUb29sLCBzZWxmKS5yZWZhY3Rvcl9maWxlKAorICAgICAgICAgICAgICAgICphcmdzLCAqKmt3YXJncykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9yZWZhY3Rvci5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcmVmYWN0b3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjVlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcmVmYWN0b3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy9yZWZhY3Rvci5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcmVmYWN0b3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2JjMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvcmVmYWN0b3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmFlYTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjQgQEAKKyIiIk1ha2UgdGVzdHMvIGludG8gYSBwYWNrYWdlLiBUaGlzIGFsbG93cyB1cyB0byAiaW1wb3J0IHRlc3RzIiBhbmQKK2hhdmUgdGVzdHMuYWxsX3Rlc3RzIGJlIGEgVGVzdFN1aXRlIHJlcHJlc2VudGluZyBhbGwgdGVzdCBjYXNlcworZnJvbSBhbGwgdGVzdF8qLnB5IGZpbGVzIGluIHRlc3RzLy4iIiIKKyMgQXV0aG9yOiBDb2xsaW4gV2ludGVyCisKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHR5cGVzCisKK2Zyb20gLiBpbXBvcnQgc3VwcG9ydAorCithbGxfdGVzdHMgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCit0ZXN0c19kaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJy4uJywgJ3Rlc3RzJykKK3Rlc3RzID0gW3RbMDotM10gZm9yIHQgaW4gb3MubGlzdGRpcih0ZXN0c19kaXIpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0LnN0YXJ0c3dpdGgoJ3Rlc3RfJykgYW5kIHQuZW5kc3dpdGgoJy5weScpXQorCitsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworZm9yIHQgaW4gdGVzdHM6CisgICAgX19pbXBvcnRfXygiIixnbG9iYWxzKCksbG9jYWxzKCksW3RdLGxldmVsPTEpCisgICAgbW9kID0gZ2xvYmFscygpW3RdCisgICAgYWxsX3Rlc3RzLmFkZFRlc3RzKGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG1vZCkpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2MwMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2MwMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9SRUFETUUgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FhNDdlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL1JFQURNRQpAQCAtMCwwICsxLDYgQEAKK0luIHRoaXMgZGlyZWN0b3J5OgorLSBweTJfdGVzdF9ncmFtbWFyLnB5IC0tIHRlc3QgZmlsZSB0aGF0IGV4ZXJjaXNlcyBtb3N0L2FsbCBvZiBQeXRob24gMi54J3MgZ3JhbW1hci4KKy0gcHkzX3Rlc3RfZ3JhbW1hci5weSAtLSB0ZXN0IGZpbGUgdGhhdCBleGVyY2lzZXMgbW9zdC9hbGwgb2YgUHl0aG9uIDMueCdzIGdyYW1tYXIuCistIGluZmluaXRlX3JlY3Vyc2lvbi5weSAtLSB0ZXN0IGZpbGUgdGhhdCBjYXVzZXMgbGliMnRvMydzIGZhc3RlciByZWN1cnNpdmUgcGF0dGVybiBtYXRjaGluZworICBzY2hlbWUgdG8gZmFpbCwgYnV0IHBhc3NlcyB3aGVuIGxpYjJ0bzMgZmFsbHMgYmFjayB0byBpdGVyYXRpdmUgcGF0dGVybiBtYXRjaGluZy4KKy0gZml4ZXMvIC0tIGZvciB1c2UgYnkgdGVzdF9yZWZhY3Rvci5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvYm9tLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvYm9tLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliYzM5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9ib20ucHkKQEAgLTAsMCArMSwyIEBACivvu78jIGNvZGluZzogdXRmLTgKK3ByaW50ICJCT00gQk9PTSEiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9jcmxmLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvY3JsZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmUyZDdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvY3JsZi5weQpAQCAtMCwwICsxLDMgQEAKK3ByaW50ICJoaSIKKworcHJpbnQgIkxpa2UgYmFkIFdpbmRvd3MgbmV3bGluZXM/IgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZGlmZmVyZW50X2VuY29kaW5nLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZGlmZmVyZW50X2VuY29kaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmMzJiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9kaWZmZXJlbnRfZW5jb2RpbmcucHkKQEAgLTAsMCArMSw2IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogdXRmLTggLSotCitwcmludCB1J8Ofw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO4w7nDusO7w7zDvcO+w7/DgMOBw4LDg8OEw4XDhsOHw4jDicOKw4vDjMONw47Dj8OQw5HDksOTw5TDlcOWw5jDmcOaw5vDnMOdw54nCisKK2RlZiBmKHgpOgorICAgIHByaW50ICclc1x0LT4gIM6xKCUyaSk6JXMgIM6yKCVzKScKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9iYWRfb3JkZXIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvYmFkX29yZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MWJiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvYmFkX29yZGVyLnB5CkBAIC0wLDAgKzEsNSBAQAorZnJvbSBsaWIydG8zLmZpeGVyX2Jhc2UgaW1wb3J0IEJhc2VGaXgKKworY2xhc3MgRml4QmFkT3JkZXIoQmFzZUZpeCk6CisKKyAgICBvcmRlciA9ICJjcmF6eSIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL19faW5pdF9fLnB5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfZXhwbGljaXQucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfZXhwbGljaXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlMTZmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9leHBsaWNpdC5weQpAQCAtMCwwICsxLDYgQEAKK2Zyb20gbGliMnRvMy5maXhlcl9iYXNlIGltcG9ydCBCYXNlRml4CisKK2NsYXNzIEZpeEV4cGxpY2l0KEJhc2VGaXgpOgorICAgIGV4cGxpY2l0ID0gVHJ1ZQorCisgICAgZGVmIG1hdGNoKHNlbGYpOiByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9maXJzdC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9maXJzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg4MjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X2ZpcnN0LnB5CkBAIC0wLDAgKzEsNiBAQAorZnJvbSBsaWIydG8zLmZpeGVyX2Jhc2UgaW1wb3J0IEJhc2VGaXgKKworY2xhc3MgRml4Rmlyc3QoQmFzZUZpeCk6CisgICAgcnVuX29yZGVyID0gMQorCisgICAgZGVmIG1hdGNoKHNlbGYsIG5vZGUpOiByZXR1cm4gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9sYXN0LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X2xhc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwNzdkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9sYXN0LnB5CkBAIC0wLDAgKzEsNyBAQAorZnJvbSBsaWIydG8zLmZpeGVyX2Jhc2UgaW1wb3J0IEJhc2VGaXgKKworY2xhc3MgRml4TGFzdChCYXNlRml4KToKKworICAgIHJ1bl9vcmRlciA9IDEwCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6IHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X3BhcnJvdC5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9wYXJyb3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRiNzlhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9teWZpeGVzL2ZpeF9wYXJyb3QucHkKQEAgLTAsMCArMSwxMyBAQAorZnJvbSBsaWIydG8zLmZpeGVyX2Jhc2UgaW1wb3J0IEJhc2VGaXgKK2Zyb20gbGliMnRvMy5maXhlcl91dGlsIGltcG9ydCBOYW1lCisKK2NsYXNzIEZpeFBhcnJvdChCYXNlRml4KToKKyAgICAiIiIKKyAgICBDaGFuZ2UgZnVuY3Rpb25zIG5hbWVkICdwYXJyb3QnIHRvICdjaGVlc2UnLgorICAgICIiIgorCisgICAgUEFUVEVSTiA9ICIiImZ1bmNkZWYgPCAnZGVmJyBuYW1lPSdwYXJyb3QnIGFueSogPiIiIgorCisgICAgZGVmIHRyYW5zZm9ybShzZWxmLCBub2RlLCByZXN1bHRzKToKKyAgICAgICAgbmFtZSA9IHJlc3VsdHNbIm5hbWUiXQorICAgICAgICBuYW1lLnJlcGxhY2UoTmFtZSgiY2hlZXNlIiwgbmFtZS5wcmVmaXgpKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X3ByZW9yZGVyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL215Zml4ZXMvZml4X3ByZW9yZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YmZiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9maXhlcnMvbXlmaXhlcy9maXhfcHJlb3JkZXIucHkKQEAgLTAsMCArMSw2IEBACitmcm9tIGxpYjJ0bzMuZml4ZXJfYmFzZSBpbXBvcnQgQmFzZUZpeAorCitjbGFzcyBGaXhQcmVvcmRlcihCYXNlRml4KToKKyAgICBvcmRlciA9ICJwcmUiCisKKyAgICBkZWYgbWF0Y2goc2VsZiwgbm9kZSk6IHJldHVybiBGYWxzZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL25vX2ZpeGVyX2Nscy5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9ub19maXhlcl9jbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA2Zjc5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9ub19maXhlcl9jbHMucHkKQEAgLTAsMCArMSBAQAorIyBUaGlzIGlzIGVtcHR5IHNvIHRyeWluZyB0byBmZXRjaCB0aGUgZml4ZXIgY2xhc3MgZ2l2ZXMgYW4gQXR0cmlidXRlRXJyb3IKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9wYXJyb3RfZXhhbXBsZS5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2ZpeGVycy9wYXJyb3RfZXhhbXBsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODUyOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvZml4ZXJzL3BhcnJvdF9leGFtcGxlLnB5CkBAIC0wLDAgKzEsMiBAQAorZGVmIHBhcnJvdCgpOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2luZmluaXRlX3JlY3Vyc2lvbi5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL2luZmluaXRlX3JlY3Vyc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcxNWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvaW5maW5pdGVfcmVjdXJzaW9uLnB5CkBAIC0wLDAgKzEsMjY2OSBAQAorIyBUaGlzIGZpbGUgaXMgdXNlZCB0byB2ZXJpZnkgdGhhdCAydG8zIGZhbGxzIGJhY2sgdG8gYSBzbG93ZXIsIGl0ZXJhdGl2ZSBwYXR0ZXJuIG1hdGNoaW5nCisjIHNjaGVtZSBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgZmFzdGVyIHJlY3Vyc2l2ZSBzeXN0ZW0gZmFpbHMgZHVlIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4KK2Zyb20gY3R5cGVzIGltcG9ydCAqCitTVFJJTkcgPSBjX2NoYXJfcAorCisKK09TVW5rbm93bkJ5dGVPcmRlciA9IDAKK1VJVF9QUk9NUFQgPSAxCitQX1BHSUQgPSAyCitQX1BJRCA9IDEKK1VJVF9FUlJPUiA9IDUKK1VJVF9JTkZPID0gNAorVUlUX05PTkUgPSAwCitQX0FMTCA9IDAKK1VJVF9WRVJJRlkgPSAyCitPU0JpZ0VuZGlhbiA9IDIKK1VJVF9CT09MRUFOID0gMworT1NMaXR0bGVFbmRpYW4gPSAxCitfX2Rhcndpbl9ubF9pdGVtID0gY19pbnQKK19fZGFyd2luX3djdHJhbnNfdCA9IGNfaW50CitfX2Rhcndpbl93Y3R5cGVfdCA9IGNfdWxvbmcKK19faW50OF90ID0gY19ieXRlCitfX3VpbnQ4X3QgPSBjX3VieXRlCitfX2ludDE2X3QgPSBjX3Nob3J0CitfX3VpbnQxNl90ID0gY191c2hvcnQKK19faW50MzJfdCA9IGNfaW50CitfX3VpbnQzMl90ID0gY191aW50CitfX2ludDY0X3QgPSBjX2xvbmdsb25nCitfX3VpbnQ2NF90ID0gY191bG9uZ2xvbmcKK19fZGFyd2luX2ludHB0cl90ID0gY19sb25nCitfX2Rhcndpbl9uYXR1cmFsX3QgPSBjX3VpbnQKK19fZGFyd2luX2N0X3J1bmVfdCA9IGNfaW50CitjbGFzcyBfX21ic3RhdGVfdChVbmlvbik6CisgICAgcGFzcworX19tYnN0YXRlX3QuX3BhY2tfID0gNAorX19tYnN0YXRlX3QuX2ZpZWxkc18gPSBbCisgICAgKCdfX21ic3RhdGU4JywgY19jaGFyICogMTI4KSwKKyAgICAoJ19tYnN0YXRlTCcsIGNfbG9uZ2xvbmcpLAorXQorYXNzZXJ0IHNpemVvZihfX21ic3RhdGVfdCkgPT0gMTI4LCBzaXplb2YoX19tYnN0YXRlX3QpCithc3NlcnQgYWxpZ25tZW50KF9fbWJzdGF0ZV90KSA9PSA0LCBhbGlnbm1lbnQoX19tYnN0YXRlX3QpCitfX2Rhcndpbl9tYnN0YXRlX3QgPSBfX21ic3RhdGVfdAorX19kYXJ3aW5fcHRyZGlmZl90ID0gY19pbnQKK19fZGFyd2luX3NpemVfdCA9IGNfdWxvbmcKK19fZGFyd2luX3ZhX2xpc3QgPSBTVFJJTkcKK19fZGFyd2luX3djaGFyX3QgPSBjX2ludAorX19kYXJ3aW5fcnVuZV90ID0gX19kYXJ3aW5fd2NoYXJfdAorX19kYXJ3aW5fd2ludF90ID0gY19pbnQKK19fZGFyd2luX2Nsb2NrX3QgPSBjX3Vsb25nCitfX2Rhcndpbl9zb2NrbGVuX3QgPSBfX3VpbnQzMl90CitfX2Rhcndpbl9zc2l6ZV90ID0gY19sb25nCitfX2Rhcndpbl90aW1lX3QgPSBjX2xvbmcKK3NpZ19hdG9taWNfdCA9IGNfaW50CitjbGFzcyBzaWdjb250ZXh0KFN0cnVjdHVyZSk6CisgICAgcGFzcworc2lnY29udGV4dC5fZmllbGRzXyA9IFsKKyAgICAoJ3NjX29uc3RhY2snLCBjX2ludCksCisgICAgKCdzY19tYXNrJywgY19pbnQpLAorICAgICgnc2NfZWF4JywgY191aW50KSwKKyAgICAoJ3NjX2VieCcsIGNfdWludCksCisgICAgKCdzY19lY3gnLCBjX3VpbnQpLAorICAgICgnc2NfZWR4JywgY191aW50KSwKKyAgICAoJ3NjX2VkaScsIGNfdWludCksCisgICAgKCdzY19lc2knLCBjX3VpbnQpLAorICAgICgnc2NfZWJwJywgY191aW50KSwKKyAgICAoJ3NjX2VzcCcsIGNfdWludCksCisgICAgKCdzY19zcycsIGNfdWludCksCisgICAgKCdzY19lZmxhZ3MnLCBjX3VpbnQpLAorICAgICgnc2NfZWlwJywgY191aW50KSwKKyAgICAoJ3NjX2NzJywgY191aW50KSwKKyAgICAoJ3NjX2RzJywgY191aW50KSwKKyAgICAoJ3NjX2VzJywgY191aW50KSwKKyAgICAoJ3NjX2ZzJywgY191aW50KSwKKyAgICAoJ3NjX2dzJywgY191aW50KSwKK10KK2Fzc2VydCBzaXplb2Yoc2lnY29udGV4dCkgPT0gNzIsIHNpemVvZihzaWdjb250ZXh0KQorYXNzZXJ0IGFsaWdubWVudChzaWdjb250ZXh0KSA9PSA0LCBhbGlnbm1lbnQoc2lnY29udGV4dCkKK3VfaW50OF90ID0gY191Ynl0ZQordV9pbnQxNl90ID0gY191c2hvcnQKK3VfaW50MzJfdCA9IGNfdWludAordV9pbnQ2NF90ID0gY191bG9uZ2xvbmcKK2ludDMyX3QgPSBjX2ludAorcmVnaXN0ZXJfdCA9IGludDMyX3QKK3VzZXJfYWRkcl90ID0gdV9pbnQ2NF90Cit1c2VyX3NpemVfdCA9IHVfaW50NjRfdAoraW50NjRfdCA9IGNfbG9uZ2xvbmcKK3VzZXJfc3NpemVfdCA9IGludDY0X3QKK3VzZXJfbG9uZ190ID0gaW50NjRfdAordXNlcl91bG9uZ190ID0gdV9pbnQ2NF90Cit1c2VyX3RpbWVfdCA9IGludDY0X3QKK3N5c2NhbGxfYXJnX3QgPSB1X2ludDY0X3QKKworIyB2YWx1ZXMgZm9yIHVubmFtZWQgZW51bWVyYXRpb24KK2NsYXNzIGFlc19rZXlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCithZXNfa2V5X3N0Ll9maWVsZHNfID0gWworICAgICgncmRfa2V5JywgY191bG9uZyAqIDYwKSwKKyAgICAoJ3JvdW5kcycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoYWVzX2tleV9zdCkgPT0gMjQ0LCBzaXplb2YoYWVzX2tleV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYWVzX2tleV9zdCkgPT0gNCwgYWxpZ25tZW50KGFlc19rZXlfc3QpCitBRVNfS0VZID0gYWVzX2tleV9zdAorY2xhc3MgYXNuMV9jdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCithc24xX2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3AnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2VvcycsIGNfaW50KSwKKyAgICAoJ2Vycm9yJywgY19pbnQpLAorICAgICgnaW5mJywgY19pbnQpLAorICAgICgndGFnJywgY19pbnQpLAorICAgICgneGNsYXNzJywgY19pbnQpLAorICAgICgnc2xlbicsIGNfbG9uZyksCisgICAgKCdtYXgnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ3EnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ3BwJywgUE9JTlRFUihQT0lOVEVSKGNfdWJ5dGUpKSksCisgICAgKCdsaW5lJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihhc24xX2N0eF9zdCkgPT0gNDQsIHNpemVvZihhc24xX2N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYXNuMV9jdHhfc3QpID09IDQsIGFsaWdubWVudChhc24xX2N0eF9zdCkKK0FTTjFfQ1RYID0gYXNuMV9jdHhfc3QKK2NsYXNzIGFzbjFfb2JqZWN0X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYXNuMV9vYmplY3Rfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdzbicsIFNUUklORyksCisgICAgKCdsbicsIFNUUklORyksCisgICAgKCduaWQnLCBjX2ludCksCisgICAgKCdsZW5ndGgnLCBjX2ludCksCisgICAgKCdkYXRhJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdmbGFncycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoYXNuMV9vYmplY3Rfc3QpID09IDI0LCBzaXplb2YoYXNuMV9vYmplY3Rfc3QpCithc3NlcnQgYWxpZ25tZW50KGFzbjFfb2JqZWN0X3N0KSA9PSA0LCBhbGlnbm1lbnQoYXNuMV9vYmplY3Rfc3QpCitBU04xX09CSkVDVCA9IGFzbjFfb2JqZWN0X3N0CitjbGFzcyBhc24xX3N0cmluZ19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2FzbjFfc3RyaW5nX3N0Ll9maWVsZHNfID0gWworICAgICgnbGVuZ3RoJywgY19pbnQpLAorICAgICgndHlwZScsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2ZsYWdzJywgY19sb25nKSwKK10KK2Fzc2VydCBzaXplb2YoYXNuMV9zdHJpbmdfc3QpID09IDE2LCBzaXplb2YoYXNuMV9zdHJpbmdfc3QpCithc3NlcnQgYWxpZ25tZW50KGFzbjFfc3RyaW5nX3N0KSA9PSA0LCBhbGlnbm1lbnQoYXNuMV9zdHJpbmdfc3QpCitBU04xX1NUUklORyA9IGFzbjFfc3RyaW5nX3N0CitjbGFzcyBBU04xX0VOQ09ESU5HX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworQVNOMV9FTkNPRElOR19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2VuYycsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnbGVuJywgY19sb25nKSwKKyAgICAoJ21vZGlmaWVkJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihBU04xX0VOQ09ESU5HX3N0KSA9PSAxMiwgc2l6ZW9mKEFTTjFfRU5DT0RJTkdfc3QpCithc3NlcnQgYWxpZ25tZW50KEFTTjFfRU5DT0RJTkdfc3QpID09IDQsIGFsaWdubWVudChBU04xX0VOQ09ESU5HX3N0KQorQVNOMV9FTkNPRElORyA9IEFTTjFfRU5DT0RJTkdfc3QKK2NsYXNzIGFzbjFfc3RyaW5nX3RhYmxlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYXNuMV9zdHJpbmdfdGFibGVfc3QuX2ZpZWxkc18gPSBbCisgICAgKCduaWQnLCBjX2ludCksCisgICAgKCdtaW5zaXplJywgY19sb25nKSwKKyAgICAoJ21heHNpemUnLCBjX2xvbmcpLAorICAgICgnbWFzaycsIGNfdWxvbmcpLAorICAgICgnZmxhZ3MnLCBjX3Vsb25nKSwKK10KK2Fzc2VydCBzaXplb2YoYXNuMV9zdHJpbmdfdGFibGVfc3QpID09IDIwLCBzaXplb2YoYXNuMV9zdHJpbmdfdGFibGVfc3QpCithc3NlcnQgYWxpZ25tZW50KGFzbjFfc3RyaW5nX3RhYmxlX3N0KSA9PSA0LCBhbGlnbm1lbnQoYXNuMV9zdHJpbmdfdGFibGVfc3QpCitBU04xX1NUUklOR19UQUJMRSA9IGFzbjFfc3RyaW5nX3RhYmxlX3N0CitjbGFzcyBBU04xX1RFTVBMQVRFX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworQVNOMV9URU1QTEFURV9zdC5fZmllbGRzXyA9IFsKK10KK0FTTjFfVEVNUExBVEUgPSBBU04xX1RFTVBMQVRFX3N0CitjbGFzcyBBU04xX0lURU1fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitBU04xX0lURU0gPSBBU04xX0lURU1fc3QKK0FTTjFfSVRFTV9zdC5fZmllbGRzXyA9IFsKK10KK2NsYXNzIEFTTjFfVExDX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworQVNOMV9UTEMgPSBBU04xX1RMQ19zdAorQVNOMV9UTENfc3QuX2ZpZWxkc18gPSBbCitdCitjbGFzcyBBU04xX1ZBTFVFX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworQVNOMV9WQUxVRV9zdC5fZmllbGRzXyA9IFsKK10KK0FTTjFfVkFMVUUgPSBBU04xX1ZBTFVFX3N0CitBU04xX0lURU1fRVhQID0gQVNOMV9JVEVNCitjbGFzcyBhc24xX3R5cGVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBOMTJhc24xX3R5cGVfc3Q0RE9MTEFSXzExRShVbmlvbik6CisgICAgcGFzcworQVNOMV9CT09MRUFOID0gY19pbnQKK0FTTjFfSU5URUdFUiA9IGFzbjFfc3RyaW5nX3N0CitBU04xX0VOVU1FUkFURUQgPSBhc24xX3N0cmluZ19zdAorQVNOMV9CSVRfU1RSSU5HID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfT0NURVRfU1RSSU5HID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfUFJJTlRBQkxFU1RSSU5HID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfVDYxU1RSSU5HID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfSUE1U1RSSU5HID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfR0VORVJBTFNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX0JNUFNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX1VOSVZFUlNBTFNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitBU04xX1VUQ1RJTUUgPSBhc24xX3N0cmluZ19zdAorQVNOMV9HRU5FUkFMSVpFRFRJTUUgPSBhc24xX3N0cmluZ19zdAorQVNOMV9WSVNJQkxFU1RSSU5HID0gYXNuMV9zdHJpbmdfc3QKK0FTTjFfVVRGOFNUUklORyA9IGFzbjFfc3RyaW5nX3N0CitOMTJhc24xX3R5cGVfc3Q0RE9MTEFSXzExRS5fZmllbGRzXyA9IFsKKyAgICAoJ3B0cicsIFNUUklORyksCisgICAgKCdib29sZWFuJywgQVNOMV9CT09MRUFOKSwKKyAgICAoJ2FzbjFfc3RyaW5nJywgUE9JTlRFUihBU04xX1NUUklORykpLAorICAgICgnb2JqZWN0JywgUE9JTlRFUihBU04xX09CSkVDVCkpLAorICAgICgnaW50ZWdlcicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdlbnVtZXJhdGVkJywgUE9JTlRFUihBU04xX0VOVU1FUkFURUQpKSwKKyAgICAoJ2JpdF9zdHJpbmcnLCBQT0lOVEVSKEFTTjFfQklUX1NUUklORykpLAorICAgICgnb2N0ZXRfc3RyaW5nJywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorICAgICgncHJpbnRhYmxlc3RyaW5nJywgUE9JTlRFUihBU04xX1BSSU5UQUJMRVNUUklORykpLAorICAgICgndDYxc3RyaW5nJywgUE9JTlRFUihBU04xX1Q2MVNUUklORykpLAorICAgICgnaWE1c3RyaW5nJywgUE9JTlRFUihBU04xX0lBNVNUUklORykpLAorICAgICgnZ2VuZXJhbHN0cmluZycsIFBPSU5URVIoQVNOMV9HRU5FUkFMU1RSSU5HKSksCisgICAgKCdibXBzdHJpbmcnLCBQT0lOVEVSKEFTTjFfQk1QU1RSSU5HKSksCisgICAgKCd1bml2ZXJzYWxzdHJpbmcnLCBQT0lOVEVSKEFTTjFfVU5JVkVSU0FMU1RSSU5HKSksCisgICAgKCd1dGN0aW1lJywgUE9JTlRFUihBU04xX1VUQ1RJTUUpKSwKKyAgICAoJ2dlbmVyYWxpemVkdGltZScsIFBPSU5URVIoQVNOMV9HRU5FUkFMSVpFRFRJTUUpKSwKKyAgICAoJ3Zpc2libGVzdHJpbmcnLCBQT0lOVEVSKEFTTjFfVklTSUJMRVNUUklORykpLAorICAgICgndXRmOHN0cmluZycsIFBPSU5URVIoQVNOMV9VVEY4U1RSSU5HKSksCisgICAgKCdzZXQnLCBQT0lOVEVSKEFTTjFfU1RSSU5HKSksCisgICAgKCdzZXF1ZW5jZScsIFBPSU5URVIoQVNOMV9TVFJJTkcpKSwKK10KK2Fzc2VydCBzaXplb2YoTjEyYXNuMV90eXBlX3N0NERPTExBUl8xMUUpID09IDQsIHNpemVvZihOMTJhc24xX3R5cGVfc3Q0RE9MTEFSXzExRSkKK2Fzc2VydCBhbGlnbm1lbnQoTjEyYXNuMV90eXBlX3N0NERPTExBUl8xMUUpID09IDQsIGFsaWdubWVudChOMTJhc24xX3R5cGVfc3Q0RE9MTEFSXzExRSkKK2FzbjFfdHlwZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCd2YWx1ZScsIE4xMmFzbjFfdHlwZV9zdDRET0xMQVJfMTFFKSwKK10KK2Fzc2VydCBzaXplb2YoYXNuMV90eXBlX3N0KSA9PSA4LCBzaXplb2YoYXNuMV90eXBlX3N0KQorYXNzZXJ0IGFsaWdubWVudChhc24xX3R5cGVfc3QpID09IDQsIGFsaWdubWVudChhc24xX3R5cGVfc3QpCitBU04xX1RZUEUgPSBhc24xX3R5cGVfc3QKK2NsYXNzIGFzbjFfbWV0aG9kX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYXNuMV9tZXRob2Rfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdpMmQnLCBDRlVOQ1RZUEUoY19pbnQpKSwKKyAgICAoJ2QyaScsIENGVU5DVFlQRShTVFJJTkcpKSwKKyAgICAoJ2NyZWF0ZScsIENGVU5DVFlQRShTVFJJTkcpKSwKKyAgICAoJ2Rlc3Ryb3knLCBDRlVOQ1RZUEUoTm9uZSkpLAorXQorYXNzZXJ0IHNpemVvZihhc24xX21ldGhvZF9zdCkgPT0gMTYsIHNpemVvZihhc24xX21ldGhvZF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYXNuMV9tZXRob2Rfc3QpID09IDQsIGFsaWdubWVudChhc24xX21ldGhvZF9zdCkKK0FTTjFfTUVUSE9EID0gYXNuMV9tZXRob2Rfc3QKK2NsYXNzIGFzbjFfaGVhZGVyX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYXNuMV9oZWFkZXJfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdoZWFkZXInLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCisgICAgKCdkYXRhJywgU1RSSU5HKSwKKyAgICAoJ21ldGgnLCBQT0lOVEVSKEFTTjFfTUVUSE9EKSksCitdCithc3NlcnQgc2l6ZW9mKGFzbjFfaGVhZGVyX3N0KSA9PSAxMiwgc2l6ZW9mKGFzbjFfaGVhZGVyX3N0KQorYXNzZXJ0IGFsaWdubWVudChhc24xX2hlYWRlcl9zdCkgPT0gNCwgYWxpZ25tZW50KGFzbjFfaGVhZGVyX3N0KQorQVNOMV9IRUFERVIgPSBhc24xX2hlYWRlcl9zdAorY2xhc3MgQklUX1NUUklOR19CSVROQU1FX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworQklUX1NUUklOR19CSVROQU1FX3N0Ll9maWVsZHNfID0gWworICAgICgnYml0bnVtJywgY19pbnQpLAorICAgICgnbG5hbWUnLCBTVFJJTkcpLAorICAgICgnc25hbWUnLCBTVFJJTkcpLAorXQorYXNzZXJ0IHNpemVvZihCSVRfU1RSSU5HX0JJVE5BTUVfc3QpID09IDEyLCBzaXplb2YoQklUX1NUUklOR19CSVROQU1FX3N0KQorYXNzZXJ0IGFsaWdubWVudChCSVRfU1RSSU5HX0JJVE5BTUVfc3QpID09IDQsIGFsaWdubWVudChCSVRfU1RSSU5HX0JJVE5BTUVfc3QpCitCSVRfU1RSSU5HX0JJVE5BTUUgPSBCSVRfU1RSSU5HX0JJVE5BTUVfc3QKK2NsYXNzIGJpb19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0JJTyA9IGJpb19zdAorYmlvX2luZm9fY2IgPSBDRlVOQ1RZUEUoTm9uZSwgUE9JTlRFUihiaW9fc3QpLCBjX2ludCwgU1RSSU5HLCBjX2ludCwgY19sb25nLCBjX2xvbmcpCitjbGFzcyBiaW9fbWV0aG9kX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYmlvX21ldGhvZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2J3cml0ZScsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihCSU8pLCBTVFJJTkcsIGNfaW50KSksCisgICAgKCdicmVhZCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihCSU8pLCBTVFJJTkcsIGNfaW50KSksCisgICAgKCdicHV0cycsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihCSU8pLCBTVFJJTkcpKSwKKyAgICAoJ2JnZXRzJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEJJTyksIFNUUklORywgY19pbnQpKSwKKyAgICAoJ2N0cmwnLCBDRlVOQ1RZUEUoY19sb25nLCBQT0lOVEVSKEJJTyksIGNfaW50LCBjX2xvbmcsIGNfdm9pZF9wKSksCisgICAgKCdjcmVhdGUnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoQklPKSkpLAorICAgICgnZGVzdHJveScsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihCSU8pKSksCisgICAgKCdjYWxsYmFja19jdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZywgUE9JTlRFUihCSU8pLCBjX2ludCwgUE9JTlRFUihiaW9faW5mb19jYikpKSwKK10KK2Fzc2VydCBzaXplb2YoYmlvX21ldGhvZF9zdCkgPT0gNDAsIHNpemVvZihiaW9fbWV0aG9kX3N0KQorYXNzZXJ0IGFsaWdubWVudChiaW9fbWV0aG9kX3N0KSA9PSA0LCBhbGlnbm1lbnQoYmlvX21ldGhvZF9zdCkKK0JJT19NRVRIT0QgPSBiaW9fbWV0aG9kX3N0CitjbGFzcyBjcnlwdG9fZXhfZGF0YV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIHN0YWNrX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworU1RBQ0sgPSBzdGFja19zdAorY3J5cHRvX2V4X2RhdGFfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdzaycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2R1bW15JywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihjcnlwdG9fZXhfZGF0YV9zdCkgPT0gOCwgc2l6ZW9mKGNyeXB0b19leF9kYXRhX3N0KQorYXNzZXJ0IGFsaWdubWVudChjcnlwdG9fZXhfZGF0YV9zdCkgPT0gNCwgYWxpZ25tZW50KGNyeXB0b19leF9kYXRhX3N0KQorQ1JZUFRPX0VYX0RBVEEgPSBjcnlwdG9fZXhfZGF0YV9zdAorYmlvX3N0Ll9maWVsZHNfID0gWworICAgICgnbWV0aG9kJywgUE9JTlRFUihCSU9fTUVUSE9EKSksCisgICAgKCdjYWxsYmFjaycsIENGVU5DVFlQRShjX2xvbmcsIFBPSU5URVIoYmlvX3N0KSwgY19pbnQsIFNUUklORywgY19pbnQsIGNfbG9uZywgY19sb25nKSksCisgICAgKCdjYl9hcmcnLCBTVFJJTkcpLAorICAgICgnaW5pdCcsIGNfaW50KSwKKyAgICAoJ3NodXRkb3duJywgY19pbnQpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCisgICAgKCdyZXRyeV9yZWFzb24nLCBjX2ludCksCisgICAgKCdudW0nLCBjX2ludCksCisgICAgKCdwdHInLCBjX3ZvaWRfcCksCisgICAgKCduZXh0X2JpbycsIFBPSU5URVIoYmlvX3N0KSksCisgICAgKCdwcmV2X2JpbycsIFBPSU5URVIoYmlvX3N0KSksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgnbnVtX3JlYWQnLCBjX3Vsb25nKSwKKyAgICAoJ251bV93cml0ZScsIGNfdWxvbmcpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKK10KK2Fzc2VydCBzaXplb2YoYmlvX3N0KSA9PSA2NCwgc2l6ZW9mKGJpb19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYmlvX3N0KSA9PSA0LCBhbGlnbm1lbnQoYmlvX3N0KQorY2xhc3MgYmlvX2ZfYnVmZmVyX2N0eF9zdHJ1Y3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitiaW9fZl9idWZmZXJfY3R4X3N0cnVjdC5fZmllbGRzXyA9IFsKKyAgICAoJ2lidWZfc2l6ZScsIGNfaW50KSwKKyAgICAoJ29idWZfc2l6ZScsIGNfaW50KSwKKyAgICAoJ2lidWYnLCBTVFJJTkcpLAorICAgICgnaWJ1Zl9sZW4nLCBjX2ludCksCisgICAgKCdpYnVmX29mZicsIGNfaW50KSwKKyAgICAoJ29idWYnLCBTVFJJTkcpLAorICAgICgnb2J1Zl9sZW4nLCBjX2ludCksCisgICAgKCdvYnVmX29mZicsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoYmlvX2ZfYnVmZmVyX2N0eF9zdHJ1Y3QpID09IDMyLCBzaXplb2YoYmlvX2ZfYnVmZmVyX2N0eF9zdHJ1Y3QpCithc3NlcnQgYWxpZ25tZW50KGJpb19mX2J1ZmZlcl9jdHhfc3RydWN0KSA9PSA0LCBhbGlnbm1lbnQoYmlvX2ZfYnVmZmVyX2N0eF9zdHJ1Y3QpCitCSU9fRl9CVUZGRVJfQ1RYID0gYmlvX2ZfYnVmZmVyX2N0eF9zdHJ1Y3QKK2NsYXNzIGhvc3RlbnQoU3RydWN0dXJlKToKKyAgICBwYXNzCitob3N0ZW50Ll9maWVsZHNfID0gWworXQorY2xhc3MgYmZfa2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYmZfa2V5X3N0Ll9maWVsZHNfID0gWworICAgICgnUCcsIGNfdWludCAqIDE4KSwKKyAgICAoJ1MnLCBjX3VpbnQgKiAxMDI0KSwKK10KK2Fzc2VydCBzaXplb2YoYmZfa2V5X3N0KSA9PSA0MTY4LCBzaXplb2YoYmZfa2V5X3N0KQorYXNzZXJ0IGFsaWdubWVudChiZl9rZXlfc3QpID09IDQsIGFsaWdubWVudChiZl9rZXlfc3QpCitCRl9LRVkgPSBiZl9rZXlfc3QKK2NsYXNzIGJpZ251bV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2JpZ251bV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2QnLCBQT0lOVEVSKGNfdWxvbmcpKSwKKyAgICAoJ3RvcCcsIGNfaW50KSwKKyAgICAoJ2RtYXgnLCBjX2ludCksCisgICAgKCduZWcnLCBjX2ludCksCisgICAgKCdmbGFncycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoYmlnbnVtX3N0KSA9PSAyMCwgc2l6ZW9mKGJpZ251bV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYmlnbnVtX3N0KSA9PSA0LCBhbGlnbm1lbnQoYmlnbnVtX3N0KQorQklHTlVNID0gYmlnbnVtX3N0CitjbGFzcyBiaWdudW1fY3R4KFN0cnVjdHVyZSk6CisgICAgcGFzcworYmlnbnVtX2N0eC5fZmllbGRzXyA9IFsKK10KK0JOX0NUWCA9IGJpZ251bV9jdHgKK2NsYXNzIGJuX2JsaW5kaW5nX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworYm5fYmxpbmRpbmdfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdpbml0JywgY19pbnQpLAorICAgICgnQScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdBaScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdtb2QnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgndGhyZWFkX2lkJywgY191bG9uZyksCitdCithc3NlcnQgc2l6ZW9mKGJuX2JsaW5kaW5nX3N0KSA9PSAyMCwgc2l6ZW9mKGJuX2JsaW5kaW5nX3N0KQorYXNzZXJ0IGFsaWdubWVudChibl9ibGluZGluZ19zdCkgPT0gNCwgYWxpZ25tZW50KGJuX2JsaW5kaW5nX3N0KQorQk5fQkxJTkRJTkcgPSBibl9ibGluZGluZ19zdAorY2xhc3MgYm5fbW9udF9jdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitibl9tb250X2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3JpJywgY19pbnQpLAorICAgICgnUlInLCBCSUdOVU0pLAorICAgICgnTicsIEJJR05VTSksCisgICAgKCdOaScsIEJJR05VTSksCisgICAgKCduMCcsIGNfdWxvbmcpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGJuX21vbnRfY3R4X3N0KSA9PSA3Miwgc2l6ZW9mKGJuX21vbnRfY3R4X3N0KQorYXNzZXJ0IGFsaWdubWVudChibl9tb250X2N0eF9zdCkgPT0gNCwgYWxpZ25tZW50KGJuX21vbnRfY3R4X3N0KQorQk5fTU9OVF9DVFggPSBibl9tb250X2N0eF9zdAorY2xhc3MgYm5fcmVjcF9jdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitibl9yZWNwX2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ04nLCBCSUdOVU0pLAorICAgICgnTnInLCBCSUdOVU0pLAorICAgICgnbnVtX2JpdHMnLCBjX2ludCksCisgICAgKCdzaGlmdCcsIGNfaW50KSwKKyAgICAoJ2ZsYWdzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihibl9yZWNwX2N0eF9zdCkgPT0gNTIsIHNpemVvZihibl9yZWNwX2N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYm5fcmVjcF9jdHhfc3QpID09IDQsIGFsaWdubWVudChibl9yZWNwX2N0eF9zdCkKK0JOX1JFQ1BfQ1RYID0gYm5fcmVjcF9jdHhfc3QKK2NsYXNzIGJ1Zl9tZW1fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitidWZfbWVtX3N0Ll9maWVsZHNfID0gWworICAgICgnbGVuZ3RoJywgY19pbnQpLAorICAgICgnZGF0YScsIFNUUklORyksCisgICAgKCdtYXgnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGJ1Zl9tZW1fc3QpID09IDEyLCBzaXplb2YoYnVmX21lbV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoYnVmX21lbV9zdCkgPT0gNCwgYWxpZ25tZW50KGJ1Zl9tZW1fc3QpCitCVUZfTUVNID0gYnVmX21lbV9zdAorY2xhc3MgY2FzdF9rZXlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjYXN0X2tleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2RhdGEnLCBjX3Vsb25nICogMzIpLAorICAgICgnc2hvcnRfa2V5JywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihjYXN0X2tleV9zdCkgPT0gMTMyLCBzaXplb2YoY2FzdF9rZXlfc3QpCithc3NlcnQgYWxpZ25tZW50KGNhc3Rfa2V5X3N0KSA9PSA0LCBhbGlnbm1lbnQoY2FzdF9rZXlfc3QpCitDQVNUX0tFWSA9IGNhc3Rfa2V5X3N0CitjbGFzcyBjb21wX21ldGhvZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NvbXBfbWV0aG9kX3N0Ll9maWVsZHNfID0gWworICAgICgndHlwZScsIGNfaW50KSwKKyAgICAoJ25hbWUnLCBTVFJJTkcpLAorICAgICgnaW5pdCcsIENGVU5DVFlQRShjX2ludCkpLAorICAgICgnZmluaXNoJywgQ0ZVTkNUWVBFKE5vbmUpKSwKKyAgICAoJ2NvbXByZXNzJywgQ0ZVTkNUWVBFKGNfaW50KSksCisgICAgKCdleHBhbmQnLCBDRlVOQ1RZUEUoY19pbnQpKSwKKyAgICAoJ2N0cmwnLCBDRlVOQ1RZUEUoY19sb25nKSksCisgICAgKCdjYWxsYmFja19jdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZykpLAorXQorYXNzZXJ0IHNpemVvZihjb21wX21ldGhvZF9zdCkgPT0gMzIsIHNpemVvZihjb21wX21ldGhvZF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoY29tcF9tZXRob2Rfc3QpID09IDQsIGFsaWdubWVudChjb21wX21ldGhvZF9zdCkKK0NPTVBfTUVUSE9EID0gY29tcF9tZXRob2Rfc3QKK2NsYXNzIGNvbXBfY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY29tcF9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdtZXRoJywgUE9JTlRFUihDT01QX01FVEhPRCkpLAorICAgICgnY29tcHJlc3NfaW4nLCBjX3Vsb25nKSwKKyAgICAoJ2NvbXByZXNzX291dCcsIGNfdWxvbmcpLAorICAgICgnZXhwYW5kX2luJywgY191bG9uZyksCisgICAgKCdleHBhbmRfb3V0JywgY191bG9uZyksCisgICAgKCdleF9kYXRhJywgQ1JZUFRPX0VYX0RBVEEpLAorXQorYXNzZXJ0IHNpemVvZihjb21wX2N0eF9zdCkgPT0gMjgsIHNpemVvZihjb21wX2N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoY29tcF9jdHhfc3QpID09IDQsIGFsaWdubWVudChjb21wX2N0eF9zdCkKK0NPTVBfQ1RYID0gY29tcF9jdHhfc3QKK2NsYXNzIENSWVBUT19keW5sb2NrX3ZhbHVlKFN0cnVjdHVyZSk6CisgICAgcGFzcworQ1JZUFRPX2R5bmxvY2tfdmFsdWUuX2ZpZWxkc18gPSBbCitdCitjbGFzcyBDUllQVE9fZHlubG9jayhTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0NSWVBUT19keW5sb2NrLl9maWVsZHNfID0gWworICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBQT0lOVEVSKENSWVBUT19keW5sb2NrX3ZhbHVlKSksCitdCithc3NlcnQgc2l6ZW9mKENSWVBUT19keW5sb2NrKSA9PSA4LCBzaXplb2YoQ1JZUFRPX2R5bmxvY2spCithc3NlcnQgYWxpZ25tZW50KENSWVBUT19keW5sb2NrKSA9PSA0LCBhbGlnbm1lbnQoQ1JZUFRPX2R5bmxvY2spCitCSU9fZHVtbXkgPSBiaW9fc3QKK0NSWVBUT19FWF9uZXcgPSBDRlVOQ1RZUEUoY19pbnQsIGNfdm9pZF9wLCBjX3ZvaWRfcCwgUE9JTlRFUihDUllQVE9fRVhfREFUQSksIGNfaW50LCBjX2xvbmcsIGNfdm9pZF9wKQorQ1JZUFRPX0VYX2ZyZWUgPSBDRlVOQ1RZUEUoTm9uZSwgY192b2lkX3AsIGNfdm9pZF9wLCBQT0lOVEVSKENSWVBUT19FWF9EQVRBKSwgY19pbnQsIGNfbG9uZywgY192b2lkX3ApCitDUllQVE9fRVhfZHVwID0gQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKENSWVBUT19FWF9EQVRBKSwgUE9JTlRFUihDUllQVE9fRVhfREFUQSksIGNfdm9pZF9wLCBjX2ludCwgY19sb25nLCBjX3ZvaWRfcCkKK2NsYXNzIGNyeXB0b19leF9kYXRhX2Z1bmNfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjcnlwdG9fZXhfZGF0YV9mdW5jX3N0Ll9maWVsZHNfID0gWworICAgICgnYXJnbCcsIGNfbG9uZyksCisgICAgKCdhcmdwJywgY192b2lkX3ApLAorICAgICgnbmV3X2Z1bmMnLCBQT0lOVEVSKENSWVBUT19FWF9uZXcpKSwKKyAgICAoJ2ZyZWVfZnVuYycsIFBPSU5URVIoQ1JZUFRPX0VYX2ZyZWUpKSwKKyAgICAoJ2R1cF9mdW5jJywgUE9JTlRFUihDUllQVE9fRVhfZHVwKSksCitdCithc3NlcnQgc2l6ZW9mKGNyeXB0b19leF9kYXRhX2Z1bmNfc3QpID09IDIwLCBzaXplb2YoY3J5cHRvX2V4X2RhdGFfZnVuY19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoY3J5cHRvX2V4X2RhdGFfZnVuY19zdCkgPT0gNCwgYWxpZ25tZW50KGNyeXB0b19leF9kYXRhX2Z1bmNfc3QpCitDUllQVE9fRVhfREFUQV9GVU5DUyA9IGNyeXB0b19leF9kYXRhX2Z1bmNfc3QKK2NsYXNzIHN0X0NSWVBUT19FWF9EQVRBX0lNUEwoU3RydWN0dXJlKToKKyAgICBwYXNzCitDUllQVE9fRVhfREFUQV9JTVBMID0gc3RfQ1JZUFRPX0VYX0RBVEFfSU1QTAorc3RfQ1JZUFRPX0VYX0RBVEFfSU1QTC5fZmllbGRzXyA9IFsKK10KK0NSWVBUT19NRU1fTEVBS19DQiA9IENGVU5DVFlQRShjX3ZvaWRfcCwgY191bG9uZywgU1RSSU5HLCBjX2ludCwgY19pbnQsIGNfdm9pZF9wKQorREVTX2NibG9jayA9IGNfdWJ5dGUgKiA4Citjb25zdF9ERVNfY2Jsb2NrID0gY191Ynl0ZSAqIDgKK2NsYXNzIERFU19rcyhTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIE42REVTX2tzM0RPTExBUl85RShVbmlvbik6CisgICAgcGFzcworTjZERVNfa3MzRE9MTEFSXzlFLl9maWVsZHNfID0gWworICAgICgnY2Jsb2NrJywgREVTX2NibG9jayksCisgICAgKCdkZXNsb25nJywgY191bG9uZyAqIDIpLAorXQorYXNzZXJ0IHNpemVvZihONkRFU19rczNET0xMQVJfOUUpID09IDgsIHNpemVvZihONkRFU19rczNET0xMQVJfOUUpCithc3NlcnQgYWxpZ25tZW50KE42REVTX2tzM0RPTExBUl85RSkgPT0gNCwgYWxpZ25tZW50KE42REVTX2tzM0RPTExBUl85RSkKK0RFU19rcy5fZmllbGRzXyA9IFsKKyAgICAoJ2tzJywgTjZERVNfa3MzRE9MTEFSXzlFICogMTYpLAorXQorYXNzZXJ0IHNpemVvZihERVNfa3MpID09IDEyOCwgc2l6ZW9mKERFU19rcykKK2Fzc2VydCBhbGlnbm1lbnQoREVTX2tzKSA9PSA0LCBhbGlnbm1lbnQoREVTX2tzKQorREVTX2tleV9zY2hlZHVsZSA9IERFU19rcworX29zc2xfb2xkX2Rlc19jYmxvY2sgPSBjX3VieXRlICogOAorY2xhc3MgX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBOMjNfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdDRET0xMQVJfMTBFKFVuaW9uKToKKyAgICBwYXNzCitOMjNfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdDRET0xMQVJfMTBFLl9maWVsZHNfID0gWworICAgICgnXycsIF9vc3NsX29sZF9kZXNfY2Jsb2NrKSwKKyAgICAoJ3BhZCcsIGNfdWxvbmcgKiAyKSwKK10KK2Fzc2VydCBzaXplb2YoTjIzX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3Q0RE9MTEFSXzEwRSkgPT0gOCwgc2l6ZW9mKE4yM19vc3NsX29sZF9kZXNfa3Nfc3RydWN0NERPTExBUl8xMEUpCithc3NlcnQgYWxpZ25tZW50KE4yM19vc3NsX29sZF9kZXNfa3Nfc3RydWN0NERPTExBUl8xMEUpID09IDQsIGFsaWdubWVudChOMjNfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdDRET0xMQVJfMTBFKQorX29zc2xfb2xkX2Rlc19rc19zdHJ1Y3QuX2ZpZWxkc18gPSBbCisgICAgKCdrcycsIE4yM19vc3NsX29sZF9kZXNfa3Nfc3RydWN0NERPTExBUl8xMEUpLAorXQorYXNzZXJ0IHNpemVvZihfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdCkgPT0gOCwgc2l6ZW9mKF9vc3NsX29sZF9kZXNfa3Nfc3RydWN0KQorYXNzZXJ0IGFsaWdubWVudChfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdCkgPT0gNCwgYWxpZ25tZW50KF9vc3NsX29sZF9kZXNfa3Nfc3RydWN0KQorX29zc2xfb2xkX2Rlc19rZXlfc2NoZWR1bGUgPSBfb3NzbF9vbGRfZGVzX2tzX3N0cnVjdCAqIDE2CitjbGFzcyBkaF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0RIID0gZGhfc3QKK2NsYXNzIGRoX21ldGhvZChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2RoX21ldGhvZC5fZmllbGRzXyA9IFsKKyAgICAoJ25hbWUnLCBTVFJJTkcpLAorICAgICgnZ2VuZXJhdGVfa2V5JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERIKSkpLAorICAgICgnY29tcHV0ZV9rZXknLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihESCkpKSwKKyAgICAoJ2JuX21vZF9leHAnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoREgpLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQk5fQ1RYKSwgUE9JTlRFUihCTl9NT05UX0NUWCkpKSwKKyAgICAoJ2luaXQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoREgpKSksCisgICAgKCdmaW5pc2gnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoREgpKSksCisgICAgKCdmbGFncycsIGNfaW50KSwKKyAgICAoJ2FwcF9kYXRhJywgU1RSSU5HKSwKK10KK2Fzc2VydCBzaXplb2YoZGhfbWV0aG9kKSA9PSAzMiwgc2l6ZW9mKGRoX21ldGhvZCkKK2Fzc2VydCBhbGlnbm1lbnQoZGhfbWV0aG9kKSA9PSA0LCBhbGlnbm1lbnQoZGhfbWV0aG9kKQorREhfTUVUSE9EID0gZGhfbWV0aG9kCitjbGFzcyBlbmdpbmVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitFTkdJTkUgPSBlbmdpbmVfc3QKK2RoX3N0Ll9maWVsZHNfID0gWworICAgICgncGFkJywgY19pbnQpLAorICAgICgndmVyc2lvbicsIGNfaW50KSwKKyAgICAoJ3AnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnZycsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdsZW5ndGgnLCBjX2xvbmcpLAorICAgICgncHViX2tleScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdwcml2X2tleScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdmbGFncycsIGNfaW50KSwKKyAgICAoJ21ldGhvZF9tb250X3AnLCBTVFJJTkcpLAorICAgICgncScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdqJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3NlZWQnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ3NlZWRsZW4nLCBjX2ludCksCisgICAgKCdjb3VudGVyJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCisgICAgKCdleF9kYXRhJywgQ1JZUFRPX0VYX0RBVEEpLAorICAgICgnbWV0aCcsIFBPSU5URVIoREhfTUVUSE9EKSksCisgICAgKCdlbmdpbmUnLCBQT0lOVEVSKEVOR0lORSkpLAorXQorYXNzZXJ0IHNpemVvZihkaF9zdCkgPT0gNzYsIHNpemVvZihkaF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoZGhfc3QpID09IDQsIGFsaWdubWVudChkaF9zdCkKK2NsYXNzIGRzYV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0RTQSA9IGRzYV9zdAorY2xhc3MgRFNBX1NJR19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0RTQV9TSUdfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdyJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3MnLCBQT0lOVEVSKEJJR05VTSkpLAorXQorYXNzZXJ0IHNpemVvZihEU0FfU0lHX3N0KSA9PSA4LCBzaXplb2YoRFNBX1NJR19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoRFNBX1NJR19zdCkgPT0gNCwgYWxpZ25tZW50KERTQV9TSUdfc3QpCitEU0FfU0lHID0gRFNBX1NJR19zdAorY2xhc3MgZHNhX21ldGhvZChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2RzYV9tZXRob2QuX2ZpZWxkc18gPSBbCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2RzYV9kb19zaWduJywgQ0ZVTkNUWVBFKFBPSU5URVIoRFNBX1NJRyksIFBPSU5URVIoY191Ynl0ZSksIGNfaW50LCBQT0lOVEVSKERTQSkpKSwKKyAgICAoJ2RzYV9zaWduX3NldHVwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERTQSksIFBPSU5URVIoQk5fQ1RYKSwgUE9JTlRFUihQT0lOVEVSKEJJR05VTSkpLCBQT0lOVEVSKFBPSU5URVIoQklHTlVNKSkpKSwKKyAgICAoJ2RzYV9kb192ZXJpZnknLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoY191Ynl0ZSksIGNfaW50LCBQT0lOVEVSKERTQV9TSUcpLCBQT0lOVEVSKERTQSkpKSwKKyAgICAoJ2RzYV9tb2RfZXhwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERTQSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQk5fQ1RYKSwgUE9JTlRFUihCTl9NT05UX0NUWCkpKSwKKyAgICAoJ2JuX21vZF9leHAnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRFNBKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJOX0NUWCksIFBPSU5URVIoQk5fTU9OVF9DVFgpKSksCisgICAgKCdpbml0JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKERTQSkpKSwKKyAgICAoJ2ZpbmlzaCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihEU0EpKSksCisgICAgKCdmbGFncycsIGNfaW50KSwKKyAgICAoJ2FwcF9kYXRhJywgU1RSSU5HKSwKK10KK2Fzc2VydCBzaXplb2YoZHNhX21ldGhvZCkgPT0gNDAsIHNpemVvZihkc2FfbWV0aG9kKQorYXNzZXJ0IGFsaWdubWVudChkc2FfbWV0aG9kKSA9PSA0LCBhbGlnbm1lbnQoZHNhX21ldGhvZCkKK0RTQV9NRVRIT0QgPSBkc2FfbWV0aG9kCitkc2Ffc3QuX2ZpZWxkc18gPSBbCisgICAgKCdwYWQnLCBjX2ludCksCisgICAgKCd2ZXJzaW9uJywgY19sb25nKSwKKyAgICAoJ3dyaXRlX3BhcmFtcycsIGNfaW50KSwKKyAgICAoJ3AnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgncScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdnJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ3B1Yl9rZXknLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgncHJpdl9rZXknLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgna2ludicsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdyJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ2ZsYWdzJywgY19pbnQpLAorICAgICgnbWV0aG9kX21vbnRfcCcsIFNUUklORyksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKKyAgICAoJ21ldGgnLCBQT0lOVEVSKERTQV9NRVRIT0QpKSwKKyAgICAoJ2VuZ2luZScsIFBPSU5URVIoRU5HSU5FKSksCitdCithc3NlcnQgc2l6ZW9mKGRzYV9zdCkgPT0gNjgsIHNpemVvZihkc2Ffc3QpCithc3NlcnQgYWxpZ25tZW50KGRzYV9zdCkgPT0gNCwgYWxpZ25tZW50KGRzYV9zdCkKK2NsYXNzIGV2cF9wa2V5X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgTjExZXZwX3BrZXlfc3Q0RE9MTEFSXzEyRShVbmlvbik6CisgICAgcGFzcworY2xhc3MgcnNhX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworTjExZXZwX3BrZXlfc3Q0RE9MTEFSXzEyRS5fZmllbGRzXyA9IFsKKyAgICAoJ3B0cicsIFNUUklORyksCisgICAgKCdyc2EnLCBQT0lOVEVSKHJzYV9zdCkpLAorICAgICgnZHNhJywgUE9JTlRFUihkc2Ffc3QpKSwKKyAgICAoJ2RoJywgUE9JTlRFUihkaF9zdCkpLAorXQorYXNzZXJ0IHNpemVvZihOMTFldnBfcGtleV9zdDRET0xMQVJfMTJFKSA9PSA0LCBzaXplb2YoTjExZXZwX3BrZXlfc3Q0RE9MTEFSXzEyRSkKK2Fzc2VydCBhbGlnbm1lbnQoTjExZXZwX3BrZXlfc3Q0RE9MTEFSXzEyRSkgPT0gNCwgYWxpZ25tZW50KE4xMWV2cF9wa2V5X3N0NERPTExBUl8xMkUpCitldnBfcGtleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCdzYXZlX3R5cGUnLCBjX2ludCksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgncGtleScsIE4xMWV2cF9wa2V5X3N0NERPTExBUl8xMkUpLAorICAgICgnc2F2ZV9wYXJhbWV0ZXJzJywgY19pbnQpLAorICAgICgnYXR0cmlidXRlcycsIFBPSU5URVIoU1RBQ0spKSwKK10KK2Fzc2VydCBzaXplb2YoZXZwX3BrZXlfc3QpID09IDI0LCBzaXplb2YoZXZwX3BrZXlfc3QpCithc3NlcnQgYWxpZ25tZW50KGV2cF9wa2V5X3N0KSA9PSA0LCBhbGlnbm1lbnQoZXZwX3BrZXlfc3QpCitjbGFzcyBlbnZfbWRfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBlbnZfbWRfY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworRVZQX01EX0NUWCA9IGVudl9tZF9jdHhfc3QKK2Vudl9tZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCdwa2V5X3R5cGUnLCBjX2ludCksCisgICAgKCdtZF9zaXplJywgY19pbnQpLAorICAgICgnZmxhZ3MnLCBjX3Vsb25nKSwKKyAgICAoJ2luaXQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX01EX0NUWCkpKSwKKyAgICAoJ3VwZGF0ZScsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihFVlBfTURfQ1RYKSwgY192b2lkX3AsIGNfdWxvbmcpKSwKKyAgICAoJ2ZpbmFsJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9NRF9DVFgpLCBQT0lOVEVSKGNfdWJ5dGUpKSksCisgICAgKCdjb3B5JywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9NRF9DVFgpLCBQT0lOVEVSKEVWUF9NRF9DVFgpKSksCisgICAgKCdjbGVhbnVwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9NRF9DVFgpKSksCisgICAgKCdzaWduJywgQ0ZVTkNUWVBFKGNfaW50KSksCisgICAgKCd2ZXJpZnknLCBDRlVOQ1RZUEUoY19pbnQpKSwKKyAgICAoJ3JlcXVpcmVkX3BrZXlfdHlwZScsIGNfaW50ICogNSksCisgICAgKCdibG9ja19zaXplJywgY19pbnQpLAorICAgICgnY3R4X3NpemUnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKGVudl9tZF9zdCkgPT0gNzIsIHNpemVvZihlbnZfbWRfc3QpCithc3NlcnQgYWxpZ25tZW50KGVudl9tZF9zdCkgPT0gNCwgYWxpZ25tZW50KGVudl9tZF9zdCkKK0VWUF9NRCA9IGVudl9tZF9zdAorZW52X21kX2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2RpZ2VzdCcsIFBPSU5URVIoRVZQX01EKSksCisgICAgKCdlbmdpbmUnLCBQT0lOVEVSKEVOR0lORSkpLAorICAgICgnZmxhZ3MnLCBjX3Vsb25nKSwKKyAgICAoJ21kX2RhdGEnLCBjX3ZvaWRfcCksCitdCithc3NlcnQgc2l6ZW9mKGVudl9tZF9jdHhfc3QpID09IDE2LCBzaXplb2YoZW52X21kX2N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoZW52X21kX2N0eF9zdCkgPT0gNCwgYWxpZ25tZW50KGVudl9tZF9jdHhfc3QpCitjbGFzcyBldnBfY2lwaGVyX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgZXZwX2NpcGhlcl9jdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitFVlBfQ0lQSEVSX0NUWCA9IGV2cF9jaXBoZXJfY3R4X3N0CitldnBfY2lwaGVyX3N0Ll9maWVsZHNfID0gWworICAgICgnbmlkJywgY19pbnQpLAorICAgICgnYmxvY2tfc2l6ZScsIGNfaW50KSwKKyAgICAoJ2tleV9sZW4nLCBjX2ludCksCisgICAgKCdpdl9sZW4nLCBjX2ludCksCisgICAgKCdmbGFncycsIGNfdWxvbmcpLAorICAgICgnaW5pdCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihFVlBfQ0lQSEVSX0NUWCksIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoY191Ynl0ZSksIGNfaW50KSksCisgICAgKCdkb19jaXBoZXInLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX0NJUEhFUl9DVFgpLCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKGNfdWJ5dGUpLCBjX3VpbnQpKSwKKyAgICAoJ2NsZWFudXAnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX0NJUEhFUl9DVFgpKSksCisgICAgKCdjdHhfc2l6ZScsIGNfaW50KSwKKyAgICAoJ3NldF9hc24xX3BhcmFtZXRlcnMnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX0NJUEhFUl9DVFgpLCBQT0lOVEVSKEFTTjFfVFlQRSkpKSwKKyAgICAoJ2dldF9hc24xX3BhcmFtZXRlcnMnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX0NJUEhFUl9DVFgpLCBQT0lOVEVSKEFTTjFfVFlQRSkpKSwKKyAgICAoJ2N0cmwnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoRVZQX0NJUEhFUl9DVFgpLCBjX2ludCwgY19pbnQsIGNfdm9pZF9wKSksCisgICAgKCdhcHBfZGF0YScsIGNfdm9pZF9wKSwKK10KK2Fzc2VydCBzaXplb2YoZXZwX2NpcGhlcl9zdCkgPT0gNTIsIHNpemVvZihldnBfY2lwaGVyX3N0KQorYXNzZXJ0IGFsaWdubWVudChldnBfY2lwaGVyX3N0KSA9PSA0LCBhbGlnbm1lbnQoZXZwX2NpcGhlcl9zdCkKK2NsYXNzIGV2cF9jaXBoZXJfaW5mb19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK0VWUF9DSVBIRVIgPSBldnBfY2lwaGVyX3N0CitldnBfY2lwaGVyX2luZm9fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdjaXBoZXInLCBQT0lOVEVSKEVWUF9DSVBIRVIpKSwKKyAgICAoJ2l2JywgY191Ynl0ZSAqIDE2KSwKK10KK2Fzc2VydCBzaXplb2YoZXZwX2NpcGhlcl9pbmZvX3N0KSA9PSAyMCwgc2l6ZW9mKGV2cF9jaXBoZXJfaW5mb19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoZXZwX2NpcGhlcl9pbmZvX3N0KSA9PSA0LCBhbGlnbm1lbnQoZXZwX2NpcGhlcl9pbmZvX3N0KQorRVZQX0NJUEhFUl9JTkZPID0gZXZwX2NpcGhlcl9pbmZvX3N0CitldnBfY2lwaGVyX2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2NpcGhlcicsIFBPSU5URVIoRVZQX0NJUEhFUikpLAorICAgICgnZW5naW5lJywgUE9JTlRFUihFTkdJTkUpKSwKKyAgICAoJ2VuY3J5cHQnLCBjX2ludCksCisgICAgKCdidWZfbGVuJywgY19pbnQpLAorICAgICgnb2l2JywgY191Ynl0ZSAqIDE2KSwKKyAgICAoJ2l2JywgY191Ynl0ZSAqIDE2KSwKKyAgICAoJ2J1ZicsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdudW0nLCBjX2ludCksCisgICAgKCdhcHBfZGF0YScsIGNfdm9pZF9wKSwKKyAgICAoJ2tleV9sZW4nLCBjX2ludCksCisgICAgKCdmbGFncycsIGNfdWxvbmcpLAorICAgICgnY2lwaGVyX2RhdGEnLCBjX3ZvaWRfcCksCisgICAgKCdmaW5hbF91c2VkJywgY19pbnQpLAorICAgICgnYmxvY2tfbWFzaycsIGNfaW50KSwKKyAgICAoJ2ZpbmFsJywgY191Ynl0ZSAqIDMyKSwKK10KK2Fzc2VydCBzaXplb2YoZXZwX2NpcGhlcl9jdHhfc3QpID09IDE0MCwgc2l6ZW9mKGV2cF9jaXBoZXJfY3R4X3N0KQorYXNzZXJ0IGFsaWdubWVudChldnBfY2lwaGVyX2N0eF9zdCkgPT0gNCwgYWxpZ25tZW50KGV2cF9jaXBoZXJfY3R4X3N0KQorY2xhc3MgZXZwX0VuY29kZV9DdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitldnBfRW5jb2RlX0N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ251bScsIGNfaW50KSwKKyAgICAoJ2xlbmd0aCcsIGNfaW50KSwKKyAgICAoJ2VuY19kYXRhJywgY191Ynl0ZSAqIDgwKSwKKyAgICAoJ2xpbmVfbnVtJywgY19pbnQpLAorICAgICgnZXhwZWN0X25sJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihldnBfRW5jb2RlX0N0eF9zdCkgPT0gOTYsIHNpemVvZihldnBfRW5jb2RlX0N0eF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoZXZwX0VuY29kZV9DdHhfc3QpID09IDQsIGFsaWdubWVudChldnBfRW5jb2RlX0N0eF9zdCkKK0VWUF9FTkNPREVfQ1RYID0gZXZwX0VuY29kZV9DdHhfc3QKK0VWUF9QQkVfS0VZR0VOID0gQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSwgU1RSSU5HLCBjX2ludCwgUE9JTlRFUihBU04xX1RZUEUpLCBQT0lOVEVSKEVWUF9DSVBIRVIpLCBQT0lOVEVSKEVWUF9NRCksIGNfaW50KQorY2xhc3MgbGhhc2hfbm9kZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2xoYXNoX25vZGVfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdkYXRhJywgY192b2lkX3ApLAorICAgICgnbmV4dCcsIFBPSU5URVIobGhhc2hfbm9kZV9zdCkpLAorICAgICgnaGFzaCcsIGNfdWxvbmcpLAorXQorYXNzZXJ0IHNpemVvZihsaGFzaF9ub2RlX3N0KSA9PSAxMiwgc2l6ZW9mKGxoYXNoX25vZGVfc3QpCithc3NlcnQgYWxpZ25tZW50KGxoYXNoX25vZGVfc3QpID09IDQsIGFsaWdubWVudChsaGFzaF9ub2RlX3N0KQorTEhBU0hfTk9ERSA9IGxoYXNoX25vZGVfc3QKK0xIQVNIX0NPTVBfRk5fVFlQRSA9IENGVU5DVFlQRShjX2ludCwgY192b2lkX3AsIGNfdm9pZF9wKQorTEhBU0hfSEFTSF9GTl9UWVBFID0gQ0ZVTkNUWVBFKGNfdWxvbmcsIGNfdm9pZF9wKQorTEhBU0hfRE9BTExfRk5fVFlQRSA9IENGVU5DVFlQRShOb25lLCBjX3ZvaWRfcCkKK0xIQVNIX0RPQUxMX0FSR19GTl9UWVBFID0gQ0ZVTkNUWVBFKE5vbmUsIGNfdm9pZF9wLCBjX3ZvaWRfcCkKK2NsYXNzIGxoYXNoX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworbGhhc2hfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdiJywgUE9JTlRFUihQT0lOVEVSKExIQVNIX05PREUpKSksCisgICAgKCdjb21wJywgTEhBU0hfQ09NUF9GTl9UWVBFKSwKKyAgICAoJ2hhc2gnLCBMSEFTSF9IQVNIX0ZOX1RZUEUpLAorICAgICgnbnVtX25vZGVzJywgY191aW50KSwKKyAgICAoJ251bV9hbGxvY19ub2RlcycsIGNfdWludCksCisgICAgKCdwJywgY191aW50KSwKKyAgICAoJ3BtYXgnLCBjX3VpbnQpLAorICAgICgndXBfbG9hZCcsIGNfdWxvbmcpLAorICAgICgnZG93bl9sb2FkJywgY191bG9uZyksCisgICAgKCdudW1faXRlbXMnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9leHBhbmRzJywgY191bG9uZyksCisgICAgKCdudW1fZXhwYW5kX3JlYWxsb2NzJywgY191bG9uZyksCisgICAgKCdudW1fY29udHJhY3RzJywgY191bG9uZyksCisgICAgKCdudW1fY29udHJhY3RfcmVhbGxvY3MnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9oYXNoX2NhbGxzJywgY191bG9uZyksCisgICAgKCdudW1fY29tcF9jYWxscycsIGNfdWxvbmcpLAorICAgICgnbnVtX2luc2VydCcsIGNfdWxvbmcpLAorICAgICgnbnVtX3JlcGxhY2UnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9kZWxldGUnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9ub19kZWxldGUnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9yZXRyaWV2ZScsIGNfdWxvbmcpLAorICAgICgnbnVtX3JldHJpZXZlX21pc3MnLCBjX3Vsb25nKSwKKyAgICAoJ251bV9oYXNoX2NvbXBzJywgY191bG9uZyksCisgICAgKCdlcnJvcicsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YobGhhc2hfc3QpID09IDk2LCBzaXplb2YobGhhc2hfc3QpCithc3NlcnQgYWxpZ25tZW50KGxoYXNoX3N0KSA9PSA0LCBhbGlnbm1lbnQobGhhc2hfc3QpCitMSEFTSCA9IGxoYXNoX3N0CitjbGFzcyBNRDJzdGF0ZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK01EMnN0YXRlX3N0Ll9maWVsZHNfID0gWworICAgICgnbnVtJywgY19pbnQpLAorICAgICgnZGF0YScsIGNfdWJ5dGUgKiAxNiksCisgICAgKCdja3NtJywgY191aW50ICogMTYpLAorICAgICgnc3RhdGUnLCBjX3VpbnQgKiAxNiksCitdCithc3NlcnQgc2l6ZW9mKE1EMnN0YXRlX3N0KSA9PSAxNDgsIHNpemVvZihNRDJzdGF0ZV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoTUQyc3RhdGVfc3QpID09IDQsIGFsaWdubWVudChNRDJzdGF0ZV9zdCkKK01EMl9DVFggPSBNRDJzdGF0ZV9zdAorY2xhc3MgTUQ0c3RhdGVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitNRDRzdGF0ZV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ0EnLCBjX3VpbnQpLAorICAgICgnQicsIGNfdWludCksCisgICAgKCdDJywgY191aW50KSwKKyAgICAoJ0QnLCBjX3VpbnQpLAorICAgICgnTmwnLCBjX3VpbnQpLAorICAgICgnTmgnLCBjX3VpbnQpLAorICAgICgnZGF0YScsIGNfdWludCAqIDE2KSwKKyAgICAoJ251bScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoTUQ0c3RhdGVfc3QpID09IDkyLCBzaXplb2YoTUQ0c3RhdGVfc3QpCithc3NlcnQgYWxpZ25tZW50KE1ENHN0YXRlX3N0KSA9PSA0LCBhbGlnbm1lbnQoTUQ0c3RhdGVfc3QpCitNRDRfQ1RYID0gTUQ0c3RhdGVfc3QKK2NsYXNzIE1ENXN0YXRlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworTUQ1c3RhdGVfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdBJywgY191aW50KSwKKyAgICAoJ0InLCBjX3VpbnQpLAorICAgICgnQycsIGNfdWludCksCisgICAgKCdEJywgY191aW50KSwKKyAgICAoJ05sJywgY191aW50KSwKKyAgICAoJ05oJywgY191aW50KSwKKyAgICAoJ2RhdGEnLCBjX3VpbnQgKiAxNiksCisgICAgKCdudW0nLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKE1ENXN0YXRlX3N0KSA9PSA5Miwgc2l6ZW9mKE1ENXN0YXRlX3N0KQorYXNzZXJ0IGFsaWdubWVudChNRDVzdGF0ZV9zdCkgPT0gNCwgYWxpZ25tZW50KE1ENXN0YXRlX3N0KQorTUQ1X0NUWCA9IE1ENXN0YXRlX3N0CitjbGFzcyBtZGMyX2N0eF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK21kYzJfY3R4X3N0Ll9maWVsZHNfID0gWworICAgICgnbnVtJywgY19pbnQpLAorICAgICgnZGF0YScsIGNfdWJ5dGUgKiA4KSwKKyAgICAoJ2gnLCBERVNfY2Jsb2NrKSwKKyAgICAoJ2hoJywgREVTX2NibG9jayksCisgICAgKCdwYWRfdHlwZScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YobWRjMl9jdHhfc3QpID09IDMyLCBzaXplb2YobWRjMl9jdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KG1kYzJfY3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQobWRjMl9jdHhfc3QpCitNREMyX0NUWCA9IG1kYzJfY3R4X3N0CitjbGFzcyBvYmpfbmFtZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK29ial9uYW1lX3N0Ll9maWVsZHNfID0gWworICAgICgndHlwZScsIGNfaW50KSwKKyAgICAoJ2FsaWFzJywgY19pbnQpLAorICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCdkYXRhJywgU1RSSU5HKSwKK10KK2Fzc2VydCBzaXplb2Yob2JqX25hbWVfc3QpID09IDE2LCBzaXplb2Yob2JqX25hbWVfc3QpCithc3NlcnQgYWxpZ25tZW50KG9ial9uYW1lX3N0KSA9PSA0LCBhbGlnbm1lbnQob2JqX25hbWVfc3QpCitPQkpfTkFNRSA9IG9ial9uYW1lX3N0CitBU04xX1RJTUUgPSBhc24xX3N0cmluZ19zdAorQVNOMV9OVUxMID0gY19pbnQKK0VWUF9QS0VZID0gZXZwX3BrZXlfc3QKK2NsYXNzIHg1MDlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5ID0geDUwOV9zdAorY2xhc3MgWDUwOV9hbGdvcl9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfQUxHT1IgPSBYNTA5X2FsZ29yX3N0CitjbGFzcyBYNTA5X2NybF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfQ1JMID0gWDUwOV9jcmxfc3QKK2NsYXNzIFg1MDlfbmFtZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfTkFNRSA9IFg1MDlfbmFtZV9zdAorY2xhc3MgeDUwOV9zdG9yZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfU1RPUkUgPSB4NTA5X3N0b3JlX3N0CitjbGFzcyB4NTA5X3N0b3JlX2N0eF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfU1RPUkVfQ1RYID0geDUwOV9zdG9yZV9jdHhfc3QKK2VuZ2luZV9zdC5fZmllbGRzXyA9IFsKK10KK2NsYXNzIFBFTV9FbmNvZGVfU2VhbF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1BFTV9FbmNvZGVfU2VhbF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2VuY29kZScsIEVWUF9FTkNPREVfQ1RYKSwKKyAgICAoJ21kJywgRVZQX01EX0NUWCksCisgICAgKCdjaXBoZXInLCBFVlBfQ0lQSEVSX0NUWCksCitdCithc3NlcnQgc2l6ZW9mKFBFTV9FbmNvZGVfU2VhbF9zdCkgPT0gMjUyLCBzaXplb2YoUEVNX0VuY29kZV9TZWFsX3N0KQorYXNzZXJ0IGFsaWdubWVudChQRU1fRW5jb2RlX1NlYWxfc3QpID09IDQsIGFsaWdubWVudChQRU1fRW5jb2RlX1NlYWxfc3QpCitQRU1fRU5DT0RFX1NFQUxfQ1RYID0gUEVNX0VuY29kZV9TZWFsX3N0CitjbGFzcyBwZW1fcmVjaXBfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwZW1fcmVjaXBfc3QuX2ZpZWxkc18gPSBbCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2RuJywgUE9JTlRFUihYNTA5X05BTUUpKSwKKyAgICAoJ2NpcGhlcicsIGNfaW50KSwKKyAgICAoJ2tleV9lbmMnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKHBlbV9yZWNpcF9zdCkgPT0gMTYsIHNpemVvZihwZW1fcmVjaXBfc3QpCithc3NlcnQgYWxpZ25tZW50KHBlbV9yZWNpcF9zdCkgPT0gNCwgYWxpZ25tZW50KHBlbV9yZWNpcF9zdCkKK1BFTV9VU0VSID0gcGVtX3JlY2lwX3N0CitjbGFzcyBwZW1fY3R4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3MgTjEwcGVtX2N0eF9zdDRET0xMQVJfMTZFKFN0cnVjdHVyZSk6CisgICAgcGFzcworTjEwcGVtX2N0eF9zdDRET0xMQVJfMTZFLl9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIGNfaW50KSwKKyAgICAoJ21vZGUnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RSkgPT0gOCwgc2l6ZW9mKE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RSkKK2Fzc2VydCBhbGlnbm1lbnQoTjEwcGVtX2N0eF9zdDRET0xMQVJfMTZFKSA9PSA0LCBhbGlnbm1lbnQoTjEwcGVtX2N0eF9zdDRET0xMQVJfMTZFKQorY2xhc3MgTjEwcGVtX2N0eF9zdDRET0xMQVJfMTdFKFN0cnVjdHVyZSk6CisgICAgcGFzcworTjEwcGVtX2N0eF9zdDRET0xMQVJfMTdFLl9maWVsZHNfID0gWworICAgICgnY2lwaGVyJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihOMTBwZW1fY3R4X3N0NERPTExBUl8xN0UpID09IDQsIHNpemVvZihOMTBwZW1fY3R4X3N0NERPTExBUl8xN0UpCithc3NlcnQgYWxpZ25tZW50KE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE3RSkgPT0gNCwgYWxpZ25tZW50KE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE3RSkKK3BlbV9jdHhfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd0eXBlJywgY19pbnQpLAorICAgICgncHJvY190eXBlJywgTjEwcGVtX2N0eF9zdDRET0xMQVJfMTZFKSwKKyAgICAoJ2RvbWFpbicsIFNUUklORyksCisgICAgKCdERUtfaW5mbycsIE4xMHBlbV9jdHhfc3Q0RE9MTEFSXzE3RSksCisgICAgKCdvcmlnaW5hdG9yJywgUE9JTlRFUihQRU1fVVNFUikpLAorICAgICgnbnVtX3JlY2lwaWVudCcsIGNfaW50KSwKKyAgICAoJ3JlY2lwaWVudCcsIFBPSU5URVIoUE9JTlRFUihQRU1fVVNFUikpKSwKKyAgICAoJ3g1MDlfY2hhaW4nLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdtZCcsIFBPSU5URVIoRVZQX01EKSksCisgICAgKCdtZF9lbmMnLCBjX2ludCksCisgICAgKCdtZF9sZW4nLCBjX2ludCksCisgICAgKCdtZF9kYXRhJywgU1RSSU5HKSwKKyAgICAoJ2RlYycsIFBPSU5URVIoRVZQX0NJUEhFUikpLAorICAgICgna2V5X2xlbicsIGNfaW50KSwKKyAgICAoJ2tleScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnZGF0YV9lbmMnLCBjX2ludCksCisgICAgKCdkYXRhX2xlbicsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKK10KK2Fzc2VydCBzaXplb2YocGVtX2N0eF9zdCkgPT0gNzYsIHNpemVvZihwZW1fY3R4X3N0KQorYXNzZXJ0IGFsaWdubWVudChwZW1fY3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQocGVtX2N0eF9zdCkKK1BFTV9DVFggPSBwZW1fY3R4X3N0CitwZW1fcGFzc3dvcmRfY2IgPSBDRlVOQ1RZUEUoY19pbnQsIFNUUklORywgY19pbnQsIGNfaW50LCBjX3ZvaWRfcCkKK2NsYXNzIHBrY3M3X2lzc3Vlcl9hbmRfc2VyaWFsX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdpc3N1ZXInLCBQT0lOVEVSKFg1MDlfTkFNRSkpLAorICAgICgnc2VyaWFsJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKK10KK2Fzc2VydCBzaXplb2YocGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QpID09IDgsIHNpemVvZihwa2NzN19pc3N1ZXJfYW5kX3NlcmlhbF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QpID09IDQsIGFsaWdubWVudChwa2NzN19pc3N1ZXJfYW5kX3NlcmlhbF9zdCkKK1BLQ1M3X0lTU1VFUl9BTkRfU0VSSUFMID0gcGtjczdfaXNzdWVyX2FuZF9zZXJpYWxfc3QKK2NsYXNzIHBrY3M3X3NpZ25lcl9pbmZvX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcGtjczdfc2lnbmVyX2luZm9fc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ2lzc3Vlcl9hbmRfc2VyaWFsJywgUE9JTlRFUihQS0NTN19JU1NVRVJfQU5EX1NFUklBTCkpLAorICAgICgnZGlnZXN0X2FsZycsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorICAgICgnYXV0aF9hdHRyJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnZGlnZXN0X2VuY19hbGcnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2VuY19kaWdlc3QnLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCisgICAgKCd1bmF1dGhfYXR0cicsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ3BrZXknLCBQT0lOVEVSKEVWUF9QS0VZKSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M3X3NpZ25lcl9pbmZvX3N0KSA9PSAzMiwgc2l6ZW9mKHBrY3M3X3NpZ25lcl9pbmZvX3N0KQorYXNzZXJ0IGFsaWdubWVudChwa2NzN19zaWduZXJfaW5mb19zdCkgPT0gNCwgYWxpZ25tZW50KHBrY3M3X3NpZ25lcl9pbmZvX3N0KQorUEtDUzdfU0lHTkVSX0lORk8gPSBwa2NzN19zaWduZXJfaW5mb19zdAorY2xhc3MgcGtjczdfcmVjaXBfaW5mb19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X3JlY2lwX2luZm9fc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ2lzc3Vlcl9hbmRfc2VyaWFsJywgUE9JTlRFUihQS0NTN19JU1NVRVJfQU5EX1NFUklBTCkpLAorICAgICgna2V5X2VuY19hbGdvcicsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorICAgICgnZW5jX2tleScsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKKyAgICAoJ2NlcnQnLCBQT0lOVEVSKFg1MDkpKSwKK10KK2Fzc2VydCBzaXplb2YocGtjczdfcmVjaXBfaW5mb19zdCkgPT0gMjAsIHNpemVvZihwa2NzN19yZWNpcF9pbmZvX3N0KQorYXNzZXJ0IGFsaWdubWVudChwa2NzN19yZWNpcF9pbmZvX3N0KSA9PSA0LCBhbGlnbm1lbnQocGtjczdfcmVjaXBfaW5mb19zdCkKK1BLQ1M3X1JFQ0lQX0lORk8gPSBwa2NzN19yZWNpcF9pbmZvX3N0CitjbGFzcyBwa2NzN19zaWduZWRfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBwa2NzN19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X3NpZ25lZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3ZlcnNpb24nLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgnbWRfYWxncycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2NlcnQnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdjcmwnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdzaWduZXJfaW5mbycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2NvbnRlbnRzJywgUE9JTlRFUihwa2NzN19zdCkpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19zaWduZWRfc3QpID09IDI0LCBzaXplb2YocGtjczdfc2lnbmVkX3N0KQorYXNzZXJ0IGFsaWdubWVudChwa2NzN19zaWduZWRfc3QpID09IDQsIGFsaWdubWVudChwa2NzN19zaWduZWRfc3QpCitQS0NTN19TSUdORUQgPSBwa2NzN19zaWduZWRfc3QKK2NsYXNzIHBrY3M3X2VuY19jb250ZW50X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcGtjczdfZW5jX2NvbnRlbnRfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdjb250ZW50X3R5cGUnLCBQT0lOVEVSKEFTTjFfT0JKRUNUKSksCisgICAgKCdhbGdvcml0aG0nLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2VuY19kYXRhJywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorICAgICgnY2lwaGVyJywgUE9JTlRFUihFVlBfQ0lQSEVSKSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M3X2VuY19jb250ZW50X3N0KSA9PSAxNiwgc2l6ZW9mKHBrY3M3X2VuY19jb250ZW50X3N0KQorYXNzZXJ0IGFsaWdubWVudChwa2NzN19lbmNfY29udGVudF9zdCkgPT0gNCwgYWxpZ25tZW50KHBrY3M3X2VuY19jb250ZW50X3N0KQorUEtDUzdfRU5DX0NPTlRFTlQgPSBwa2NzN19lbmNfY29udGVudF9zdAorY2xhc3MgcGtjczdfZW52ZWxvcGVkX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworcGtjczdfZW52ZWxvcGVkX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdyZWNpcGllbnRpbmZvJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnZW5jX2RhdGEnLCBQT0lOVEVSKFBLQ1M3X0VOQ19DT05URU5UKSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M3X2VudmVsb3BlZF9zdCkgPT0gMTIsIHNpemVvZihwa2NzN19lbnZlbG9wZWRfc3QpCithc3NlcnQgYWxpZ25tZW50KHBrY3M3X2VudmVsb3BlZF9zdCkgPT0gNCwgYWxpZ25tZW50KHBrY3M3X2VudmVsb3BlZF9zdCkKK1BLQ1M3X0VOVkVMT1BFID0gcGtjczdfZW52ZWxvcGVkX3N0CitjbGFzcyBwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ21kX2FsZ3MnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdjZXJ0JywgUE9JTlRFUihTVEFDSykpLAorICAgICgnY3JsJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnc2lnbmVyX2luZm8nLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdlbmNfZGF0YScsIFBPSU5URVIoUEtDUzdfRU5DX0NPTlRFTlQpKSwKKyAgICAoJ3JlY2lwaWVudGluZm8nLCBQT0lOVEVSKFNUQUNLKSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M3X3NpZ25lZGFuZGVudmVsb3BlZF9zdCkgPT0gMjgsIHNpemVvZihwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QpCithc3NlcnQgYWxpZ25tZW50KHBrY3M3X3NpZ25lZGFuZGVudmVsb3BlZF9zdCkgPT0gNCwgYWxpZ25tZW50KHBrY3M3X3NpZ25lZGFuZGVudmVsb3BlZF9zdCkKK1BLQ1M3X1NJR05fRU5WRUxPUEUgPSBwa2NzN19zaWduZWRhbmRlbnZlbG9wZWRfc3QKK2NsYXNzIHBrY3M3X2RpZ2VzdF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X2RpZ2VzdF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3ZlcnNpb24nLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgnbWQnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2NvbnRlbnRzJywgUE9JTlRFUihwa2NzN19zdCkpLAorICAgICgnZGlnZXN0JywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19kaWdlc3Rfc3QpID09IDE2LCBzaXplb2YocGtjczdfZGlnZXN0X3N0KQorYXNzZXJ0IGFsaWdubWVudChwa2NzN19kaWdlc3Rfc3QpID09IDQsIGFsaWdubWVudChwa2NzN19kaWdlc3Rfc3QpCitQS0NTN19ESUdFU1QgPSBwa2NzN19kaWdlc3Rfc3QKK2NsYXNzIHBrY3M3X2VuY3J5cHRlZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BrY3M3X2VuY3J5cHRlZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3ZlcnNpb24nLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgnZW5jX2RhdGEnLCBQT0lOVEVSKFBLQ1M3X0VOQ19DT05URU5UKSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M3X2VuY3J5cHRlZF9zdCkgPT0gOCwgc2l6ZW9mKHBrY3M3X2VuY3J5cHRlZF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfZW5jcnlwdGVkX3N0KSA9PSA0LCBhbGlnbm1lbnQocGtjczdfZW5jcnlwdGVkX3N0KQorUEtDUzdfRU5DUllQVCA9IHBrY3M3X2VuY3J5cHRlZF9zdAorY2xhc3MgTjhwa2NzN19zdDRET0xMQVJfMTVFKFVuaW9uKToKKyAgICBwYXNzCitOOHBrY3M3X3N0NERPTExBUl8xNUUuX2ZpZWxkc18gPSBbCisgICAgKCdwdHInLCBTVFJJTkcpLAorICAgICgnZGF0YScsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKKyAgICAoJ3NpZ24nLCBQT0lOVEVSKFBLQ1M3X1NJR05FRCkpLAorICAgICgnZW52ZWxvcGVkJywgUE9JTlRFUihQS0NTN19FTlZFTE9QRSkpLAorICAgICgnc2lnbmVkX2FuZF9lbnZlbG9wZWQnLCBQT0lOVEVSKFBLQ1M3X1NJR05fRU5WRUxPUEUpKSwKKyAgICAoJ2RpZ2VzdCcsIFBPSU5URVIoUEtDUzdfRElHRVNUKSksCisgICAgKCdlbmNyeXB0ZWQnLCBQT0lOVEVSKFBLQ1M3X0VOQ1JZUFQpKSwKKyAgICAoJ290aGVyJywgUE9JTlRFUihBU04xX1RZUEUpKSwKK10KK2Fzc2VydCBzaXplb2YoTjhwa2NzN19zdDRET0xMQVJfMTVFKSA9PSA0LCBzaXplb2YoTjhwa2NzN19zdDRET0xMQVJfMTVFKQorYXNzZXJ0IGFsaWdubWVudChOOHBrY3M3X3N0NERPTExBUl8xNUUpID09IDQsIGFsaWdubWVudChOOHBrY3M3X3N0NERPTExBUl8xNUUpCitwa2NzN19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2FzbjEnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2xlbmd0aCcsIGNfbG9uZyksCisgICAgKCdzdGF0ZScsIGNfaW50KSwKKyAgICAoJ2RldGFjaGVkJywgY19pbnQpLAorICAgICgndHlwZScsIFBPSU5URVIoQVNOMV9PQkpFQ1QpKSwKKyAgICAoJ2QnLCBOOHBrY3M3X3N0NERPTExBUl8xNUUpLAorXQorYXNzZXJ0IHNpemVvZihwa2NzN19zdCkgPT0gMjQsIHNpemVvZihwa2NzN19zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczdfc3QpID09IDQsIGFsaWdubWVudChwa2NzN19zdCkKK1BLQ1M3ID0gcGtjczdfc3QKK2NsYXNzIHJjMl9rZXlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCityYzJfa2V5X3N0Ll9maWVsZHNfID0gWworICAgICgnZGF0YScsIGNfdWludCAqIDY0KSwKK10KK2Fzc2VydCBzaXplb2YocmMyX2tleV9zdCkgPT0gMjU2LCBzaXplb2YocmMyX2tleV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocmMyX2tleV9zdCkgPT0gNCwgYWxpZ25tZW50KHJjMl9rZXlfc3QpCitSQzJfS0VZID0gcmMyX2tleV9zdAorY2xhc3MgcmM0X2tleV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3JjNF9rZXlfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd4JywgY191Ynl0ZSksCisgICAgKCd5JywgY191Ynl0ZSksCisgICAgKCdkYXRhJywgY191Ynl0ZSAqIDI1NiksCitdCithc3NlcnQgc2l6ZW9mKHJjNF9rZXlfc3QpID09IDI1OCwgc2l6ZW9mKHJjNF9rZXlfc3QpCithc3NlcnQgYWxpZ25tZW50KHJjNF9rZXlfc3QpID09IDEsIGFsaWdubWVudChyYzRfa2V5X3N0KQorUkM0X0tFWSA9IHJjNF9rZXlfc3QKK2NsYXNzIHJjNV9rZXlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCityYzVfa2V5X3N0Ll9maWVsZHNfID0gWworICAgICgncm91bmRzJywgY19pbnQpLAorICAgICgnZGF0YScsIGNfdWxvbmcgKiAzNCksCitdCithc3NlcnQgc2l6ZW9mKHJjNV9rZXlfc3QpID09IDE0MCwgc2l6ZW9mKHJjNV9rZXlfc3QpCithc3NlcnQgYWxpZ25tZW50KHJjNV9rZXlfc3QpID09IDQsIGFsaWdubWVudChyYzVfa2V5X3N0KQorUkM1XzMyX0tFWSA9IHJjNV9rZXlfc3QKK2NsYXNzIFJJUEVNRDE2MHN0YXRlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworUklQRU1EMTYwc3RhdGVfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdBJywgY191aW50KSwKKyAgICAoJ0InLCBjX3VpbnQpLAorICAgICgnQycsIGNfdWludCksCisgICAgKCdEJywgY191aW50KSwKKyAgICAoJ0UnLCBjX3VpbnQpLAorICAgICgnTmwnLCBjX3VpbnQpLAorICAgICgnTmgnLCBjX3VpbnQpLAorICAgICgnZGF0YScsIGNfdWludCAqIDE2KSwKKyAgICAoJ251bScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoUklQRU1EMTYwc3RhdGVfc3QpID09IDk2LCBzaXplb2YoUklQRU1EMTYwc3RhdGVfc3QpCithc3NlcnQgYWxpZ25tZW50KFJJUEVNRDE2MHN0YXRlX3N0KSA9PSA0LCBhbGlnbm1lbnQoUklQRU1EMTYwc3RhdGVfc3QpCitSSVBFTUQxNjBfQ1RYID0gUklQRU1EMTYwc3RhdGVfc3QKK1JTQSA9IHJzYV9zdAorY2xhc3MgcnNhX21ldGhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCityc2FfbWV0aF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ25hbWUnLCBTVFJJTkcpLAorICAgICgncnNhX3B1Yl9lbmMnLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKGNfdWJ5dGUpLCBQT0lOVEVSKFJTQSksIGNfaW50KSksCisgICAgKCdyc2FfcHViX2RlYycsIENGVU5DVFlQRShjX2ludCwgY19pbnQsIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoUlNBKSwgY19pbnQpKSwKKyAgICAoJ3JzYV9wcml2X2VuYycsIENGVU5DVFlQRShjX2ludCwgY19pbnQsIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoUlNBKSwgY19pbnQpKSwKKyAgICAoJ3JzYV9wcml2X2RlYycsIENGVU5DVFlQRShjX2ludCwgY19pbnQsIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoUlNBKSwgY19pbnQpKSwKKyAgICAoJ3JzYV9tb2RfZXhwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihSU0EpKSksCisgICAgKCdibl9tb2RfZXhwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQklHTlVNKSwgUE9JTlRFUihCSUdOVU0pLCBQT0lOVEVSKEJJR05VTSksIFBPSU5URVIoQk5fQ1RYKSwgUE9JTlRFUihCTl9NT05UX0NUWCkpKSwKKyAgICAoJ2luaXQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoUlNBKSkpLAorICAgICgnZmluaXNoJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFJTQSkpKSwKKyAgICAoJ2ZsYWdzJywgY19pbnQpLAorICAgICgnYXBwX2RhdGEnLCBTVFJJTkcpLAorICAgICgncnNhX3NpZ24nLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBjX3VpbnQsIFBPSU5URVIoY191Ynl0ZSksIFBPSU5URVIoY191aW50KSwgUE9JTlRFUihSU0EpKSksCisgICAgKCdyc2FfdmVyaWZ5JywgQ0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgUE9JTlRFUihjX3VieXRlKSwgY191aW50LCBQT0lOVEVSKGNfdWJ5dGUpLCBjX3VpbnQsIFBPSU5URVIoUlNBKSkpLAorXQorYXNzZXJ0IHNpemVvZihyc2FfbWV0aF9zdCkgPT0gNTIsIHNpemVvZihyc2FfbWV0aF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocnNhX21ldGhfc3QpID09IDQsIGFsaWdubWVudChyc2FfbWV0aF9zdCkKK1JTQV9NRVRIT0QgPSByc2FfbWV0aF9zdAorcnNhX3N0Ll9maWVsZHNfID0gWworICAgICgncGFkJywgY19pbnQpLAorICAgICgndmVyc2lvbicsIGNfbG9uZyksCisgICAgKCdtZXRoJywgUE9JTlRFUihSU0FfTUVUSE9EKSksCisgICAgKCdlbmdpbmUnLCBQT0lOVEVSKEVOR0lORSkpLAorICAgICgnbicsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdlJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ2QnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgncCcsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdxJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ2RtcDEnLCBQT0lOVEVSKEJJR05VTSkpLAorICAgICgnZG1xMScsIFBPSU5URVIoQklHTlVNKSksCisgICAgKCdpcW1wJywgUE9JTlRFUihCSUdOVU0pKSwKKyAgICAoJ2V4X2RhdGEnLCBDUllQVE9fRVhfREFUQSksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgnZmxhZ3MnLCBjX2ludCksCisgICAgKCdfbWV0aG9kX21vZF9uJywgUE9JTlRFUihCTl9NT05UX0NUWCkpLAorICAgICgnX21ldGhvZF9tb2RfcCcsIFBPSU5URVIoQk5fTU9OVF9DVFgpKSwKKyAgICAoJ19tZXRob2RfbW9kX3EnLCBQT0lOVEVSKEJOX01PTlRfQ1RYKSksCisgICAgKCdiaWdudW1fZGF0YScsIFNUUklORyksCisgICAgKCdibGluZGluZycsIFBPSU5URVIoQk5fQkxJTkRJTkcpKSwKK10KK2Fzc2VydCBzaXplb2YocnNhX3N0KSA9PSA4NCwgc2l6ZW9mKHJzYV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQocnNhX3N0KSA9PSA0LCBhbGlnbm1lbnQocnNhX3N0KQorb3BlbnNzbF9mcHRyID0gQ0ZVTkNUWVBFKE5vbmUpCitjbGFzcyBTSEFzdGF0ZV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1NIQXN0YXRlX3N0Ll9maWVsZHNfID0gWworICAgICgnaDAnLCBjX3VpbnQpLAorICAgICgnaDEnLCBjX3VpbnQpLAorICAgICgnaDInLCBjX3VpbnQpLAorICAgICgnaDMnLCBjX3VpbnQpLAorICAgICgnaDQnLCBjX3VpbnQpLAorICAgICgnTmwnLCBjX3VpbnQpLAorICAgICgnTmgnLCBjX3VpbnQpLAorICAgICgnZGF0YScsIGNfdWludCAqIDE2KSwKKyAgICAoJ251bScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoU0hBc3RhdGVfc3QpID09IDk2LCBzaXplb2YoU0hBc3RhdGVfc3QpCithc3NlcnQgYWxpZ25tZW50KFNIQXN0YXRlX3N0KSA9PSA0LCBhbGlnbm1lbnQoU0hBc3RhdGVfc3QpCitTSEFfQ1RYID0gU0hBc3RhdGVfc3QKK2NsYXNzIHNzbF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NzbF9jcm9ja19zdCA9IFBPSU5URVIoc3NsX3N0KQorY2xhc3Mgc3NsX2NpcGhlcl9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NzbF9jaXBoZXJfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2YWxpZCcsIGNfaW50KSwKKyAgICAoJ25hbWUnLCBTVFJJTkcpLAorICAgICgnaWQnLCBjX3Vsb25nKSwKKyAgICAoJ2FsZ29yaXRobXMnLCBjX3Vsb25nKSwKKyAgICAoJ2FsZ29fc3RyZW5ndGgnLCBjX3Vsb25nKSwKKyAgICAoJ2FsZ29yaXRobTInLCBjX3Vsb25nKSwKKyAgICAoJ3N0cmVuZ3RoX2JpdHMnLCBjX2ludCksCisgICAgKCdhbGdfYml0cycsIGNfaW50KSwKKyAgICAoJ21hc2snLCBjX3Vsb25nKSwKKyAgICAoJ21hc2tfc3RyZW5ndGgnLCBjX3Vsb25nKSwKK10KK2Fzc2VydCBzaXplb2Yoc3NsX2NpcGhlcl9zdCkgPT0gNDAsIHNpemVvZihzc2xfY2lwaGVyX3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2xfY2lwaGVyX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsX2NpcGhlcl9zdCkKK1NTTF9DSVBIRVIgPSBzc2xfY2lwaGVyX3N0CitTU0wgPSBzc2xfc3QKK2NsYXNzIHNzbF9jdHhfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitTU0xfQ1RYID0gc3NsX2N0eF9zdAorY2xhc3Mgc3NsX21ldGhvZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIHNzbDNfZW5jX21ldGhvZChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NzbF9tZXRob2Rfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgY19pbnQpLAorICAgICgnc3NsX25ldycsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTU0wpKSksCisgICAgKCdzc2xfY2xlYXInLCBDRlVOQ1RZUEUoTm9uZSwgUE9JTlRFUihTU0wpKSksCisgICAgKCdzc2xfZnJlZScsIENGVU5DVFlQRShOb25lLCBQT0lOVEVSKFNTTCkpKSwKKyAgICAoJ3NzbF9hY2NlcHQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSkpLAorICAgICgnc3NsX2Nvbm5lY3QnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSkpLAorICAgICgnc3NsX3JlYWQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSwgY192b2lkX3AsIGNfaW50KSksCisgICAgKCdzc2xfcGVlaycsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTU0wpLCBjX3ZvaWRfcCwgY19pbnQpKSwKKyAgICAoJ3NzbF93cml0ZScsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTU0wpLCBjX3ZvaWRfcCwgY19pbnQpKSwKKyAgICAoJ3NzbF9zaHV0ZG93bicsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTU0wpKSksCisgICAgKCdzc2xfcmVuZWdvdGlhdGUnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSkpLAorICAgICgnc3NsX3JlbmVnb3RpYXRlX2NoZWNrJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCkpKSwKKyAgICAoJ3NzbF9jdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZywgUE9JTlRFUihTU0wpLCBjX2ludCwgY19sb25nLCBjX3ZvaWRfcCkpLAorICAgICgnc3NsX2N0eF9jdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZywgUE9JTlRFUihTU0xfQ1RYKSwgY19pbnQsIGNfbG9uZywgY192b2lkX3ApKSwKKyAgICAoJ2dldF9jaXBoZXJfYnlfY2hhcicsIENGVU5DVFlQRShQT0lOVEVSKFNTTF9DSVBIRVIpLCBQT0lOVEVSKGNfdWJ5dGUpKSksCisgICAgKCdwdXRfY2lwaGVyX2J5X2NoYXInLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMX0NJUEhFUiksIFBPSU5URVIoY191Ynl0ZSkpKSwKKyAgICAoJ3NzbF9wZW5kaW5nJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCkpKSwKKyAgICAoJ251bV9jaXBoZXJzJywgQ0ZVTkNUWVBFKGNfaW50KSksCisgICAgKCdnZXRfY2lwaGVyJywgQ0ZVTkNUWVBFKFBPSU5URVIoU1NMX0NJUEhFUiksIGNfdWludCkpLAorICAgICgnZ2V0X3NzbF9tZXRob2QnLCBDRlVOQ1RZUEUoUE9JTlRFUihzc2xfbWV0aG9kX3N0KSwgY19pbnQpKSwKKyAgICAoJ2dldF90aW1lb3V0JywgQ0ZVTkNUWVBFKGNfbG9uZykpLAorICAgICgnc3NsM19lbmMnLCBQT0lOVEVSKHNzbDNfZW5jX21ldGhvZCkpLAorICAgICgnc3NsX3ZlcnNpb24nLCBDRlVOQ1RZUEUoY19pbnQpKSwKKyAgICAoJ3NzbF9jYWxsYmFja19jdHJsJywgQ0ZVTkNUWVBFKGNfbG9uZywgUE9JTlRFUihTU0wpLCBjX2ludCwgQ0ZVTkNUWVBFKE5vbmUpKSksCisgICAgKCdzc2xfY3R4X2NhbGxiYWNrX2N0cmwnLCBDRlVOQ1RZUEUoY19sb25nLCBQT0lOVEVSKFNTTF9DVFgpLCBjX2ludCwgQ0ZVTkNUWVBFKE5vbmUpKSksCitdCithc3NlcnQgc2l6ZW9mKHNzbF9tZXRob2Rfc3QpID09IDEwMCwgc2l6ZW9mKHNzbF9tZXRob2Rfc3QpCithc3NlcnQgYWxpZ25tZW50KHNzbF9tZXRob2Rfc3QpID09IDQsIGFsaWdubWVudChzc2xfbWV0aG9kX3N0KQorc3NsM19lbmNfbWV0aG9kLl9maWVsZHNfID0gWworXQorU1NMX01FVEhPRCA9IHNzbF9tZXRob2Rfc3QKK2NsYXNzIHNzbF9zZXNzaW9uX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworY2xhc3Mgc2Vzc19jZXJ0X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworc3NsX3Nlc3Npb25fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdzc2xfdmVyc2lvbicsIGNfaW50KSwKKyAgICAoJ2tleV9hcmdfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ2tleV9hcmcnLCBjX3VieXRlICogOCksCisgICAgKCdtYXN0ZXJfa2V5X2xlbmd0aCcsIGNfaW50KSwKKyAgICAoJ21hc3Rlcl9rZXknLCBjX3VieXRlICogNDgpLAorICAgICgnc2Vzc2lvbl9pZF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnc2Vzc2lvbl9pZCcsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdzaWRfY3R4X2xlbmd0aCcsIGNfdWludCksCisgICAgKCdzaWRfY3R4JywgY191Ynl0ZSAqIDMyKSwKKyAgICAoJ25vdF9yZXN1bWFibGUnLCBjX2ludCksCisgICAgKCdzZXNzX2NlcnQnLCBQT0lOVEVSKHNlc3NfY2VydF9zdCkpLAorICAgICgncGVlcicsIFBPSU5URVIoWDUwOSkpLAorICAgICgndmVyaWZ5X3Jlc3VsdCcsIGNfbG9uZyksCisgICAgKCdyZWZlcmVuY2VzJywgY19pbnQpLAorICAgICgndGltZW91dCcsIGNfbG9uZyksCisgICAgKCd0aW1lJywgY19sb25nKSwKKyAgICAoJ2NvbXByZXNzX21ldGgnLCBjX2ludCksCisgICAgKCdjaXBoZXInLCBQT0lOVEVSKFNTTF9DSVBIRVIpKSwKKyAgICAoJ2NpcGhlcl9pZCcsIGNfdWxvbmcpLAorICAgICgnY2lwaGVycycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2V4X2RhdGEnLCBDUllQVE9fRVhfREFUQSksCisgICAgKCdwcmV2JywgUE9JTlRFUihzc2xfc2Vzc2lvbl9zdCkpLAorICAgICgnbmV4dCcsIFBPSU5URVIoc3NsX3Nlc3Npb25fc3QpKSwKK10KK2Fzc2VydCBzaXplb2Yoc3NsX3Nlc3Npb25fc3QpID09IDIwMCwgc2l6ZW9mKHNzbF9zZXNzaW9uX3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2xfc2Vzc2lvbl9zdCkgPT0gNCwgYWxpZ25tZW50KHNzbF9zZXNzaW9uX3N0KQorc2Vzc19jZXJ0X3N0Ll9maWVsZHNfID0gWworXQorU1NMX1NFU1NJT04gPSBzc2xfc2Vzc2lvbl9zdAorR0VOX1NFU1NJT05fQ0IgPSBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoU1NMKSwgUE9JTlRFUihjX3VieXRlKSwgUE9JTlRFUihjX3VpbnQpKQorY2xhc3Mgc3NsX2NvbXBfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitzc2xfY29tcF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2lkJywgY19pbnQpLAorICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCdtZXRob2QnLCBQT0lOVEVSKENPTVBfTUVUSE9EKSksCitdCithc3NlcnQgc2l6ZW9mKHNzbF9jb21wX3N0KSA9PSAxMiwgc2l6ZW9mKHNzbF9jb21wX3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2xfY29tcF9zdCkgPT0gNCwgYWxpZ25tZW50KHNzbF9jb21wX3N0KQorU1NMX0NPTVAgPSBzc2xfY29tcF9zdAorY2xhc3MgTjEwc3NsX2N0eF9zdDRET0xMQVJfMThFKFN0cnVjdHVyZSk6CisgICAgcGFzcworTjEwc3NsX2N0eF9zdDRET0xMQVJfMThFLl9maWVsZHNfID0gWworICAgICgnc2Vzc19jb25uZWN0JywgY19pbnQpLAorICAgICgnc2Vzc19jb25uZWN0X3JlbmVnb3RpYXRlJywgY19pbnQpLAorICAgICgnc2Vzc19jb25uZWN0X2dvb2QnLCBjX2ludCksCisgICAgKCdzZXNzX2FjY2VwdCcsIGNfaW50KSwKKyAgICAoJ3Nlc3NfYWNjZXB0X3JlbmVnb3RpYXRlJywgY19pbnQpLAorICAgICgnc2Vzc19hY2NlcHRfZ29vZCcsIGNfaW50KSwKKyAgICAoJ3Nlc3NfbWlzcycsIGNfaW50KSwKKyAgICAoJ3Nlc3NfdGltZW91dCcsIGNfaW50KSwKKyAgICAoJ3Nlc3NfY2FjaGVfZnVsbCcsIGNfaW50KSwKKyAgICAoJ3Nlc3NfaGl0JywgY19pbnQpLAorICAgICgnc2Vzc19jYl9oaXQnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKE4xMHNzbF9jdHhfc3Q0RE9MTEFSXzE4RSkgPT0gNDQsIHNpemVvZihOMTBzc2xfY3R4X3N0NERPTExBUl8xOEUpCithc3NlcnQgYWxpZ25tZW50KE4xMHNzbF9jdHhfc3Q0RE9MTEFSXzE4RSkgPT0gNCwgYWxpZ25tZW50KE4xMHNzbF9jdHhfc3Q0RE9MTEFSXzE4RSkKK2NsYXNzIGNlcnRfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitzc2xfY3R4X3N0Ll9maWVsZHNfID0gWworICAgICgnbWV0aG9kJywgUE9JTlRFUihTU0xfTUVUSE9EKSksCisgICAgKCdjaXBoZXJfbGlzdCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2NpcGhlcl9saXN0X2J5X2lkJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnY2VydF9zdG9yZScsIFBPSU5URVIoeDUwOV9zdG9yZV9zdCkpLAorICAgICgnc2Vzc2lvbnMnLCBQT0lOVEVSKGxoYXNoX3N0KSksCisgICAgKCdzZXNzaW9uX2NhY2hlX3NpemUnLCBjX3Vsb25nKSwKKyAgICAoJ3Nlc3Npb25fY2FjaGVfaGVhZCcsIFBPSU5URVIoc3NsX3Nlc3Npb25fc3QpKSwKKyAgICAoJ3Nlc3Npb25fY2FjaGVfdGFpbCcsIFBPSU5URVIoc3NsX3Nlc3Npb25fc3QpKSwKKyAgICAoJ3Nlc3Npb25fY2FjaGVfbW9kZScsIGNfaW50KSwKKyAgICAoJ3Nlc3Npb25fdGltZW91dCcsIGNfbG9uZyksCisgICAgKCduZXdfc2Vzc2lvbl9jYicsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihzc2xfc3QpLCBQT0lOVEVSKFNTTF9TRVNTSU9OKSkpLAorICAgICgncmVtb3ZlX3Nlc3Npb25fY2InLCBDRlVOQ1RZUEUoTm9uZSwgUE9JTlRFUihzc2xfY3R4X3N0KSwgUE9JTlRFUihTU0xfU0VTU0lPTikpKSwKKyAgICAoJ2dldF9zZXNzaW9uX2NiJywgQ0ZVTkNUWVBFKFBPSU5URVIoU1NMX1NFU1NJT04pLCBQT0lOVEVSKHNzbF9zdCksIFBPSU5URVIoY191Ynl0ZSksIGNfaW50LCBQT0lOVEVSKGNfaW50KSkpLAorICAgICgnc3RhdHMnLCBOMTBzc2xfY3R4X3N0NERPTExBUl8xOEUpLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKKyAgICAoJ2FwcF92ZXJpZnlfY2FsbGJhY2snLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpLCBjX3ZvaWRfcCkpLAorICAgICgnYXBwX3ZlcmlmeV9hcmcnLCBjX3ZvaWRfcCksCisgICAgKCdkZWZhdWx0X3Bhc3N3ZF9jYWxsYmFjaycsIFBPSU5URVIocGVtX3Bhc3N3b3JkX2NiKSksCisgICAgKCdkZWZhdWx0X3Bhc3N3ZF9jYWxsYmFja191c2VyZGF0YScsIGNfdm9pZF9wKSwKKyAgICAoJ2NsaWVudF9jZXJ0X2NiJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFNTTCksIFBPSU5URVIoUE9JTlRFUihYNTA5KSksIFBPSU5URVIoUE9JTlRFUihFVlBfUEtFWSkpKSksCisgICAgKCdleF9kYXRhJywgQ1JZUFRPX0VYX0RBVEEpLAorICAgICgncnNhX21kNScsIFBPSU5URVIoRVZQX01EKSksCisgICAgKCdtZDUnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnc2hhMScsIFBPSU5URVIoRVZQX01EKSksCisgICAgKCdleHRyYV9jZXJ0cycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2NvbXBfbWV0aG9kcycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2luZm9fY2FsbGJhY2snLCBDRlVOQ1RZUEUoTm9uZSwgUE9JTlRFUihTU0wpLCBjX2ludCwgY19pbnQpKSwKKyAgICAoJ2NsaWVudF9DQScsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ29wdGlvbnMnLCBjX3Vsb25nKSwKKyAgICAoJ21vZGUnLCBjX3Vsb25nKSwKKyAgICAoJ21heF9jZXJ0X2xpc3QnLCBjX2xvbmcpLAorICAgICgnY2VydCcsIFBPSU5URVIoY2VydF9zdCkpLAorICAgICgncmVhZF9haGVhZCcsIGNfaW50KSwKKyAgICAoJ21zZ19jYWxsYmFjaycsIENGVU5DVFlQRShOb25lLCBjX2ludCwgY19pbnQsIGNfaW50LCBjX3ZvaWRfcCwgY191bG9uZywgUE9JTlRFUihTU0wpLCBjX3ZvaWRfcCkpLAorICAgICgnbXNnX2NhbGxiYWNrX2FyZycsIGNfdm9pZF9wKSwKKyAgICAoJ3ZlcmlmeV9tb2RlJywgY19pbnQpLAorICAgICgndmVyaWZ5X2RlcHRoJywgY19pbnQpLAorICAgICgnc2lkX2N0eF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnc2lkX2N0eCcsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdkZWZhdWx0X3ZlcmlmeV9jYWxsYmFjaycsIENGVU5DVFlQRShjX2ludCwgY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpKSksCisgICAgKCdnZW5lcmF0ZV9zZXNzaW9uX2lkJywgR0VOX1NFU1NJT05fQ0IpLAorICAgICgncHVycG9zZScsIGNfaW50KSwKKyAgICAoJ3RydXN0JywgY19pbnQpLAorICAgICgncXVpZXRfc2h1dGRvd24nLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKHNzbF9jdHhfc3QpID09IDI0OCwgc2l6ZW9mKHNzbF9jdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KHNzbF9jdHhfc3QpID09IDQsIGFsaWdubWVudChzc2xfY3R4X3N0KQorY2VydF9zdC5fZmllbGRzXyA9IFsKK10KK2NsYXNzIHNzbDJfc3RhdGVfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBzc2wzX3N0YXRlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworc3NsX3N0Ll9maWVsZHNfID0gWworICAgICgndmVyc2lvbicsIGNfaW50KSwKKyAgICAoJ3R5cGUnLCBjX2ludCksCisgICAgKCdtZXRob2QnLCBQT0lOVEVSKFNTTF9NRVRIT0QpKSwKKyAgICAoJ3JiaW8nLCBQT0lOVEVSKEJJTykpLAorICAgICgnd2JpbycsIFBPSU5URVIoQklPKSksCisgICAgKCdiYmlvJywgUE9JTlRFUihCSU8pKSwKKyAgICAoJ3J3c3RhdGUnLCBjX2ludCksCisgICAgKCdpbl9oYW5kc2hha2UnLCBjX2ludCksCisgICAgKCdoYW5kc2hha2VfZnVuYycsIENGVU5DVFlQRShjX2ludCkpLAorICAgICgnc2VydmVyJywgY19pbnQpLAorICAgICgnbmV3X3Nlc3Npb24nLCBjX2ludCksCisgICAgKCdxdWlldF9zaHV0ZG93bicsIGNfaW50KSwKKyAgICAoJ3NodXRkb3duJywgY19pbnQpLAorICAgICgnc3RhdGUnLCBjX2ludCksCisgICAgKCdyc3RhdGUnLCBjX2ludCksCisgICAgKCdpbml0X2J1ZicsIFBPSU5URVIoQlVGX01FTSkpLAorICAgICgnaW5pdF9tc2cnLCBjX3ZvaWRfcCksCisgICAgKCdpbml0X251bScsIGNfaW50KSwKKyAgICAoJ2luaXRfb2ZmJywgY19pbnQpLAorICAgICgncGFja2V0JywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdwYWNrZXRfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ3MyJywgUE9JTlRFUihzc2wyX3N0YXRlX3N0KSksCisgICAgKCdzMycsIFBPSU5URVIoc3NsM19zdGF0ZV9zdCkpLAorICAgICgncmVhZF9haGVhZCcsIGNfaW50KSwKKyAgICAoJ21zZ19jYWxsYmFjaycsIENGVU5DVFlQRShOb25lLCBjX2ludCwgY19pbnQsIGNfaW50LCBjX3ZvaWRfcCwgY191bG9uZywgUE9JTlRFUihTU0wpLCBjX3ZvaWRfcCkpLAorICAgICgnbXNnX2NhbGxiYWNrX2FyZycsIGNfdm9pZF9wKSwKKyAgICAoJ2hpdCcsIGNfaW50KSwKKyAgICAoJ3B1cnBvc2UnLCBjX2ludCksCisgICAgKCd0cnVzdCcsIGNfaW50KSwKKyAgICAoJ2NpcGhlcl9saXN0JywgUE9JTlRFUihTVEFDSykpLAorICAgICgnY2lwaGVyX2xpc3RfYnlfaWQnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdlbmNfcmVhZF9jdHgnLCBQT0lOVEVSKEVWUF9DSVBIRVJfQ1RYKSksCisgICAgKCdyZWFkX2hhc2gnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnZXhwYW5kJywgUE9JTlRFUihDT01QX0NUWCkpLAorICAgICgnZW5jX3dyaXRlX2N0eCcsIFBPSU5URVIoRVZQX0NJUEhFUl9DVFgpKSwKKyAgICAoJ3dyaXRlX2hhc2gnLCBQT0lOVEVSKEVWUF9NRCkpLAorICAgICgnY29tcHJlc3MnLCBQT0lOVEVSKENPTVBfQ1RYKSksCisgICAgKCdjZXJ0JywgUE9JTlRFUihjZXJ0X3N0KSksCisgICAgKCdzaWRfY3R4X2xlbmd0aCcsIGNfdWludCksCisgICAgKCdzaWRfY3R4JywgY191Ynl0ZSAqIDMyKSwKKyAgICAoJ3Nlc3Npb24nLCBQT0lOVEVSKFNTTF9TRVNTSU9OKSksCisgICAgKCdnZW5lcmF0ZV9zZXNzaW9uX2lkJywgR0VOX1NFU1NJT05fQ0IpLAorICAgICgndmVyaWZ5X21vZGUnLCBjX2ludCksCisgICAgKCd2ZXJpZnlfZGVwdGgnLCBjX2ludCksCisgICAgKCd2ZXJpZnlfY2FsbGJhY2snLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnaW5mb19jYWxsYmFjaycsIENGVU5DVFlQRShOb25lLCBQT0lOVEVSKFNTTCksIGNfaW50LCBjX2ludCkpLAorICAgICgnZXJyb3InLCBjX2ludCksCisgICAgKCdlcnJvcl9jb2RlJywgY19pbnQpLAorICAgICgnY3R4JywgUE9JTlRFUihTU0xfQ1RYKSksCisgICAgKCdkZWJ1ZycsIGNfaW50KSwKKyAgICAoJ3ZlcmlmeV9yZXN1bHQnLCBjX2xvbmcpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKKyAgICAoJ2NsaWVudF9DQScsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCisgICAgKCdvcHRpb25zJywgY191bG9uZyksCisgICAgKCdtb2RlJywgY191bG9uZyksCisgICAgKCdtYXhfY2VydF9saXN0JywgY19sb25nKSwKKyAgICAoJ2ZpcnN0X3BhY2tldCcsIGNfaW50KSwKKyAgICAoJ2NsaWVudF92ZXJzaW9uJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihzc2xfc3QpID09IDI2OCwgc2l6ZW9mKHNzbF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoc3NsX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsX3N0KQorY2xhc3MgTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFKFN0cnVjdHVyZSk6CisgICAgcGFzcworTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFLl9maWVsZHNfID0gWworICAgICgnY29ubl9pZF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgnY2VydF90eXBlJywgY191aW50KSwKKyAgICAoJ2NlcnRfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ2NzbCcsIGNfdWludCksCisgICAgKCdjbGVhcicsIGNfdWludCksCisgICAgKCdlbmMnLCBjX3VpbnQpLAorICAgICgnY2NsJywgY191Ynl0ZSAqIDMyKSwKKyAgICAoJ2NpcGhlcl9zcGVjX2xlbmd0aCcsIGNfdWludCksCisgICAgKCdzZXNzaW9uX2lkX2xlbmd0aCcsIGNfdWludCksCisgICAgKCdjbGVuJywgY191aW50KSwKKyAgICAoJ3JsZW4nLCBjX3VpbnQpLAorXQorYXNzZXJ0IHNpemVvZihOMTNzc2wyX3N0YXRlX3N0NERPTExBUl8xOUUpID09IDcyLCBzaXplb2YoTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFKQorYXNzZXJ0IGFsaWdubWVudChOMTNzc2wyX3N0YXRlX3N0NERPTExBUl8xOUUpID09IDQsIGFsaWdubWVudChOMTNzc2wyX3N0YXRlX3N0NERPTExBUl8xOUUpCitzc2wyX3N0YXRlX3N0Ll9maWVsZHNfID0gWworICAgICgndGhyZWVfYnl0ZV9oZWFkZXInLCBjX2ludCksCisgICAgKCdjbGVhcl90ZXh0JywgY19pbnQpLAorICAgICgnZXNjYXBlJywgY19pbnQpLAorICAgICgnc3NsMl9yb2xsYmFjaycsIGNfaW50KSwKKyAgICAoJ3dudW0nLCBjX3VpbnQpLAorICAgICgnd3BlbmRfdG90JywgY19pbnQpLAorICAgICgnd3BlbmRfYnVmJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCd3cGVuZF9vZmYnLCBjX2ludCksCisgICAgKCd3cGVuZF9sZW4nLCBjX2ludCksCisgICAgKCd3cGVuZF9yZXQnLCBjX2ludCksCisgICAgKCdyYnVmX2xlZnQnLCBjX2ludCksCisgICAgKCdyYnVmX29mZnMnLCBjX2ludCksCisgICAgKCdyYnVmJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCd3YnVmJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCd3cml0ZV9wdHInLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ3BhZGRpbmcnLCBjX3VpbnQpLAorICAgICgncmxlbmd0aCcsIGNfdWludCksCisgICAgKCdyYWN0X2RhdGFfbGVuZ3RoJywgY19pbnQpLAorICAgICgnd2xlbmd0aCcsIGNfdWludCksCisgICAgKCd3YWN0X2RhdGFfbGVuZ3RoJywgY19pbnQpLAorICAgICgncmFjdF9kYXRhJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCd3YWN0X2RhdGEnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ21hY19kYXRhJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdyZWFkX2tleScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnd3JpdGVfa2V5JywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdjaGFsbGVuZ2VfbGVuZ3RoJywgY191aW50KSwKKyAgICAoJ2NoYWxsZW5nZScsIGNfdWJ5dGUgKiAzMiksCisgICAgKCdjb25uX2lkX2xlbmd0aCcsIGNfdWludCksCisgICAgKCdjb25uX2lkJywgY191Ynl0ZSAqIDE2KSwKKyAgICAoJ2tleV9tYXRlcmlhbF9sZW5ndGgnLCBjX3VpbnQpLAorICAgICgna2V5X21hdGVyaWFsJywgY191Ynl0ZSAqIDQ4KSwKKyAgICAoJ3JlYWRfc2VxdWVuY2UnLCBjX3Vsb25nKSwKKyAgICAoJ3dyaXRlX3NlcXVlbmNlJywgY191bG9uZyksCisgICAgKCd0bXAnLCBOMTNzc2wyX3N0YXRlX3N0NERPTExBUl8xOUUpLAorXQorYXNzZXJ0IHNpemVvZihzc2wyX3N0YXRlX3N0KSA9PSAyODgsIHNpemVvZihzc2wyX3N0YXRlX3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2wyX3N0YXRlX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsMl9zdGF0ZV9zdCkKK1NTTDJfU1RBVEUgPSBzc2wyX3N0YXRlX3N0CitjbGFzcyBzc2wzX3JlY29yZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NzbDNfcmVjb3JkX3N0Ll9maWVsZHNfID0gWworICAgICgndHlwZScsIGNfaW50KSwKKyAgICAoJ2xlbmd0aCcsIGNfdWludCksCisgICAgKCdvZmYnLCBjX3VpbnQpLAorICAgICgnZGF0YScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnaW5wdXQnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2NvbXAnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKK10KK2Fzc2VydCBzaXplb2Yoc3NsM19yZWNvcmRfc3QpID09IDI0LCBzaXplb2Yoc3NsM19yZWNvcmRfc3QpCithc3NlcnQgYWxpZ25tZW50KHNzbDNfcmVjb3JkX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsM19yZWNvcmRfc3QpCitTU0wzX1JFQ09SRCA9IHNzbDNfcmVjb3JkX3N0CitjbGFzcyBzc2wzX2J1ZmZlcl9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NpemVfdCA9IF9fZGFyd2luX3NpemVfdAorc3NsM19idWZmZXJfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdidWYnLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ2xlbicsIHNpemVfdCksCisgICAgKCdvZmZzZXQnLCBjX2ludCksCisgICAgKCdsZWZ0JywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihzc2wzX2J1ZmZlcl9zdCkgPT0gMTYsIHNpemVvZihzc2wzX2J1ZmZlcl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoc3NsM19idWZmZXJfc3QpID09IDQsIGFsaWdubWVudChzc2wzX2J1ZmZlcl9zdCkKK1NTTDNfQlVGRkVSID0gc3NsM19idWZmZXJfc3QKK2NsYXNzIE4xM3NzbDNfc3RhdGVfc3Q0RE9MTEFSXzIwRShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK04xM3NzbDNfc3RhdGVfc3Q0RE9MTEFSXzIwRS5fZmllbGRzXyA9IFsKKyAgICAoJ2NlcnRfdmVyaWZ5X21kJywgY191Ynl0ZSAqIDcyKSwKKyAgICAoJ2ZpbmlzaF9tZCcsIGNfdWJ5dGUgKiA3MiksCisgICAgKCdmaW5pc2hfbWRfbGVuJywgY19pbnQpLAorICAgICgncGVlcl9maW5pc2hfbWQnLCBjX3VieXRlICogNzIpLAorICAgICgncGVlcl9maW5pc2hfbWRfbGVuJywgY19pbnQpLAorICAgICgnbWVzc2FnZV9zaXplJywgY191bG9uZyksCisgICAgKCdtZXNzYWdlX3R5cGUnLCBjX2ludCksCisgICAgKCduZXdfY2lwaGVyJywgUE9JTlRFUihTU0xfQ0lQSEVSKSksCisgICAgKCdkaCcsIFBPSU5URVIoREgpKSwKKyAgICAoJ25leHRfc3RhdGUnLCBjX2ludCksCisgICAgKCdyZXVzZV9tZXNzYWdlJywgY19pbnQpLAorICAgICgnY2VydF9yZXEnLCBjX2ludCksCisgICAgKCdjdHlwZV9udW0nLCBjX2ludCksCisgICAgKCdjdHlwZScsIGNfY2hhciAqIDcpLAorICAgICgnY2FfbmFtZXMnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCd1c2VfcnNhX3RtcCcsIGNfaW50KSwKKyAgICAoJ2tleV9ibG9ja19sZW5ndGgnLCBjX2ludCksCisgICAgKCdrZXlfYmxvY2snLCBQT0lOVEVSKGNfdWJ5dGUpKSwKKyAgICAoJ25ld19zeW1fZW5jJywgUE9JTlRFUihFVlBfQ0lQSEVSKSksCisgICAgKCduZXdfaGFzaCcsIFBPSU5URVIoRVZQX01EKSksCisgICAgKCduZXdfY29tcHJlc3Npb24nLCBQT0lOVEVSKFNTTF9DT01QKSksCisgICAgKCdjZXJ0X3JlcXVlc3QnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKE4xM3NzbDNfc3RhdGVfc3Q0RE9MTEFSXzIwRSkgPT0gMjk2LCBzaXplb2YoTjEzc3NsM19zdGF0ZV9zdDRET0xMQVJfMjBFKQorYXNzZXJ0IGFsaWdubWVudChOMTNzc2wzX3N0YXRlX3N0NERPTExBUl8yMEUpID09IDQsIGFsaWdubWVudChOMTNzc2wzX3N0YXRlX3N0NERPTExBUl8yMEUpCitzc2wzX3N0YXRlX3N0Ll9maWVsZHNfID0gWworICAgICgnZmxhZ3MnLCBjX2xvbmcpLAorICAgICgnZGVsYXlfYnVmX3BvcF9yZXQnLCBjX2ludCksCisgICAgKCdyZWFkX3NlcXVlbmNlJywgY191Ynl0ZSAqIDgpLAorICAgICgncmVhZF9tYWNfc2VjcmV0JywgY191Ynl0ZSAqIDM2KSwKKyAgICAoJ3dyaXRlX3NlcXVlbmNlJywgY191Ynl0ZSAqIDgpLAorICAgICgnd3JpdGVfbWFjX3NlY3JldCcsIGNfdWJ5dGUgKiAzNiksCisgICAgKCdzZXJ2ZXJfcmFuZG9tJywgY191Ynl0ZSAqIDMyKSwKKyAgICAoJ2NsaWVudF9yYW5kb20nLCBjX3VieXRlICogMzIpLAorICAgICgnbmVlZF9lbXB0eV9mcmFnbWVudHMnLCBjX2ludCksCisgICAgKCdlbXB0eV9mcmFnbWVudF9kb25lJywgY19pbnQpLAorICAgICgncmJ1ZicsIFNTTDNfQlVGRkVSKSwKKyAgICAoJ3didWYnLCBTU0wzX0JVRkZFUiksCisgICAgKCdycmVjJywgU1NMM19SRUNPUkQpLAorICAgICgnd3JlYycsIFNTTDNfUkVDT1JEKSwKKyAgICAoJ2FsZXJ0X2ZyYWdtZW50JywgY191Ynl0ZSAqIDIpLAorICAgICgnYWxlcnRfZnJhZ21lbnRfbGVuJywgY191aW50KSwKKyAgICAoJ2hhbmRzaGFrZV9mcmFnbWVudCcsIGNfdWJ5dGUgKiA0KSwKKyAgICAoJ2hhbmRzaGFrZV9mcmFnbWVudF9sZW4nLCBjX3VpbnQpLAorICAgICgnd251bScsIGNfdWludCksCisgICAgKCd3cGVuZF90b3QnLCBjX2ludCksCisgICAgKCd3cGVuZF90eXBlJywgY19pbnQpLAorICAgICgnd3BlbmRfcmV0JywgY19pbnQpLAorICAgICgnd3BlbmRfYnVmJywgUE9JTlRFUihjX3VieXRlKSksCisgICAgKCdmaW5pc2hfZGdzdDEnLCBFVlBfTURfQ1RYKSwKKyAgICAoJ2ZpbmlzaF9kZ3N0MicsIEVWUF9NRF9DVFgpLAorICAgICgnY2hhbmdlX2NpcGhlcl9zcGVjJywgY19pbnQpLAorICAgICgnd2Fybl9hbGVydCcsIGNfaW50KSwKKyAgICAoJ2ZhdGFsX2FsZXJ0JywgY19pbnQpLAorICAgICgnYWxlcnRfZGlzcGF0Y2gnLCBjX2ludCksCisgICAgKCdzZW5kX2FsZXJ0JywgY191Ynl0ZSAqIDIpLAorICAgICgncmVuZWdvdGlhdGUnLCBjX2ludCksCisgICAgKCd0b3RhbF9yZW5lZ290aWF0aW9ucycsIGNfaW50KSwKKyAgICAoJ251bV9yZW5lZ290aWF0aW9ucycsIGNfaW50KSwKKyAgICAoJ2luX3JlYWRfYXBwX2RhdGEnLCBjX2ludCksCisgICAgKCd0bXAnLCBOMTNzc2wzX3N0YXRlX3N0NERPTExBUl8yMEUpLAorXQorYXNzZXJ0IHNpemVvZihzc2wzX3N0YXRlX3N0KSA9PSA2NDgsIHNpemVvZihzc2wzX3N0YXRlX3N0KQorYXNzZXJ0IGFsaWdubWVudChzc2wzX3N0YXRlX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3NsM19zdGF0ZV9zdCkKK1NTTDNfU1RBVEUgPSBzc2wzX3N0YXRlX3N0CitzdGFja19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ251bScsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBQT0lOVEVSKFNUUklORykpLAorICAgICgnc29ydGVkJywgY19pbnQpLAorICAgICgnbnVtX2FsbG9jJywgY19pbnQpLAorICAgICgnY29tcCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihTVFJJTkcpLCBQT0lOVEVSKFNUUklORykpKSwKK10KK2Fzc2VydCBzaXplb2Yoc3RhY2tfc3QpID09IDIwLCBzaXplb2Yoc3RhY2tfc3QpCithc3NlcnQgYWxpZ25tZW50KHN0YWNrX3N0KSA9PSA0LCBhbGlnbm1lbnQoc3RhY2tfc3QpCitjbGFzcyB1aV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3VpX3N0Ll9maWVsZHNfID0gWworXQorVUkgPSB1aV9zdAorY2xhc3MgdWlfbWV0aG9kX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcwordWlfbWV0aG9kX3N0Ll9maWVsZHNfID0gWworXQorVUlfTUVUSE9EID0gdWlfbWV0aG9kX3N0CitjbGFzcyB1aV9zdHJpbmdfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCit1aV9zdHJpbmdfc3QuX2ZpZWxkc18gPSBbCitdCitVSV9TVFJJTkcgPSB1aV9zdHJpbmdfc3QKKworIyB2YWx1ZXMgZm9yIGVudW1lcmF0aW9uICdVSV9zdHJpbmdfdHlwZXMnCitVSV9zdHJpbmdfdHlwZXMgPSBjX2ludCAjIGVudW0KK2NsYXNzIFg1MDlfb2JqZWN0c19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfb2JqZWN0c19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ25pZCcsIGNfaW50KSwKKyAgICAoJ2EyaScsIENGVU5DVFlQRShjX2ludCkpLAorICAgICgnaTJhJywgQ0ZVTkNUWVBFKGNfaW50KSksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfb2JqZWN0c19zdCkgPT0gMTIsIHNpemVvZihYNTA5X29iamVjdHNfc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfb2JqZWN0c19zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfb2JqZWN0c19zdCkKK1g1MDlfT0JKRUNUUyA9IFg1MDlfb2JqZWN0c19zdAorWDUwOV9hbGdvcl9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2FsZ29yaXRobScsIFBPSU5URVIoQVNOMV9PQkpFQ1QpKSwKKyAgICAoJ3BhcmFtZXRlcicsIFBPSU5URVIoQVNOMV9UWVBFKSksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfYWxnb3Jfc3QpID09IDgsIHNpemVvZihYNTA5X2FsZ29yX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X2FsZ29yX3N0KSA9PSA0LCBhbGlnbm1lbnQoWDUwOV9hbGdvcl9zdCkKK2NsYXNzIFg1MDlfdmFsX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV92YWxfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdub3RCZWZvcmUnLCBQT0lOVEVSKEFTTjFfVElNRSkpLAorICAgICgnbm90QWZ0ZXInLCBQT0lOVEVSKEFTTjFfVElNRSkpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X3ZhbF9zdCkgPT0gOCwgc2l6ZW9mKFg1MDlfdmFsX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X3ZhbF9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfdmFsX3N0KQorWDUwOV9WQUwgPSBYNTA5X3ZhbF9zdAorY2xhc3MgWDUwOV9wdWJrZXlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X3B1YmtleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2FsZ29yJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdwdWJsaWNfa2V5JywgUE9JTlRFUihBU04xX0JJVF9TVFJJTkcpKSwKKyAgICAoJ3BrZXknLCBQT0lOVEVSKEVWUF9QS0VZKSksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfcHVia2V5X3N0KSA9PSAxMiwgc2l6ZW9mKFg1MDlfcHVia2V5X3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X3B1YmtleV9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfcHVia2V5X3N0KQorWDUwOV9QVUJLRVkgPSBYNTA5X3B1YmtleV9zdAorY2xhc3MgWDUwOV9zaWdfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X3NpZ19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2FsZ29yJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdkaWdlc3QnLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfc2lnX3N0KSA9PSA4LCBzaXplb2YoWDUwOV9zaWdfc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfc2lnX3N0KSA9PSA0LCBhbGlnbm1lbnQoWDUwOV9zaWdfc3QpCitYNTA5X1NJRyA9IFg1MDlfc2lnX3N0CitjbGFzcyBYNTA5X25hbWVfZW50cnlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X25hbWVfZW50cnlfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdvYmplY3QnLCBQT0lOVEVSKEFTTjFfT0JKRUNUKSksCisgICAgKCd2YWx1ZScsIFBPSU5URVIoQVNOMV9TVFJJTkcpKSwKKyAgICAoJ3NldCcsIGNfaW50KSwKKyAgICAoJ3NpemUnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfbmFtZV9lbnRyeV9zdCkgPT0gMTYsIHNpemVvZihYNTA5X25hbWVfZW50cnlfc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfbmFtZV9lbnRyeV9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfbmFtZV9lbnRyeV9zdCkKK1g1MDlfTkFNRV9FTlRSWSA9IFg1MDlfbmFtZV9lbnRyeV9zdAorWDUwOV9uYW1lX3N0Ll9maWVsZHNfID0gWworICAgICgnZW50cmllcycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ21vZGlmaWVkJywgY19pbnQpLAorICAgICgnYnl0ZXMnLCBQT0lOVEVSKEJVRl9NRU0pKSwKKyAgICAoJ2hhc2gnLCBjX3Vsb25nKSwKK10KK2Fzc2VydCBzaXplb2YoWDUwOV9uYW1lX3N0KSA9PSAxNiwgc2l6ZW9mKFg1MDlfbmFtZV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV9uYW1lX3N0KSA9PSA0LCBhbGlnbm1lbnQoWDUwOV9uYW1lX3N0KQorY2xhc3MgWDUwOV9leHRlbnNpb25fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X2V4dGVuc2lvbl9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ29iamVjdCcsIFBPSU5URVIoQVNOMV9PQkpFQ1QpKSwKKyAgICAoJ2NyaXRpY2FsJywgQVNOMV9CT09MRUFOKSwKKyAgICAoJ3ZhbHVlJywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorXQorYXNzZXJ0IHNpemVvZihYNTA5X2V4dGVuc2lvbl9zdCkgPT0gMTIsIHNpemVvZihYNTA5X2V4dGVuc2lvbl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV9leHRlbnNpb25fc3QpID09IDQsIGFsaWdubWVudChYNTA5X2V4dGVuc2lvbl9zdCkKK1g1MDlfRVhURU5TSU9OID0gWDUwOV9leHRlbnNpb25fc3QKK2NsYXNzIHg1MDlfYXR0cmlidXRlc19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2NsYXNzIE4xOHg1MDlfYXR0cmlidXRlc19zdDRET0xMQVJfMTNFKFVuaW9uKToKKyAgICBwYXNzCitOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRS5fZmllbGRzXyA9IFsKKyAgICAoJ3B0cicsIFNUUklORyksCisgICAgKCdzZXQnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdzaW5nbGUnLCBQT0lOVEVSKEFTTjFfVFlQRSkpLAorXQorYXNzZXJ0IHNpemVvZihOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRSkgPT0gNCwgc2l6ZW9mKE4xOHg1MDlfYXR0cmlidXRlc19zdDRET0xMQVJfMTNFKQorYXNzZXJ0IGFsaWdubWVudChOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRSkgPT0gNCwgYWxpZ25tZW50KE4xOHg1MDlfYXR0cmlidXRlc19zdDRET0xMQVJfMTNFKQoreDUwOV9hdHRyaWJ1dGVzX3N0Ll9maWVsZHNfID0gWworICAgICgnb2JqZWN0JywgUE9JTlRFUihBU04xX09CSkVDVCkpLAorICAgICgnc2luZ2xlJywgY19pbnQpLAorICAgICgndmFsdWUnLCBOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRSksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfYXR0cmlidXRlc19zdCkgPT0gMTIsIHNpemVvZih4NTA5X2F0dHJpYnV0ZXNfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfYXR0cmlidXRlc19zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfYXR0cmlidXRlc19zdCkKK1g1MDlfQVRUUklCVVRFID0geDUwOV9hdHRyaWJ1dGVzX3N0CitjbGFzcyBYNTA5X3JlcV9pbmZvX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9yZXFfaW5mb19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2VuYycsIEFTTjFfRU5DT0RJTkcpLAorICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdzdWJqZWN0JywgUE9JTlRFUihYNTA5X05BTUUpKSwKKyAgICAoJ3B1YmtleScsIFBPSU5URVIoWDUwOV9QVUJLRVkpKSwKKyAgICAoJ2F0dHJpYnV0ZXMnLCBQT0lOVEVSKFNUQUNLKSksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfcmVxX2luZm9fc3QpID09IDI4LCBzaXplb2YoWDUwOV9yZXFfaW5mb19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoWDUwOV9yZXFfaW5mb19zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfcmVxX2luZm9fc3QpCitYNTA5X1JFUV9JTkZPID0gWDUwOV9yZXFfaW5mb19zdAorY2xhc3MgWDUwOV9yZXFfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitYNTA5X3JlcV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3JlcV9pbmZvJywgUE9JTlRFUihYNTA5X1JFUV9JTkZPKSksCisgICAgKCdzaWdfYWxnJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdzaWduYXR1cmUnLCBQT0lOVEVSKEFTTjFfQklUX1NUUklORykpLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoWDUwOV9yZXFfc3QpID09IDE2LCBzaXplb2YoWDUwOV9yZXFfc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfcmVxX3N0KSA9PSA0LCBhbGlnbm1lbnQoWDUwOV9yZXFfc3QpCitYNTA5X1JFUSA9IFg1MDlfcmVxX3N0CitjbGFzcyB4NTA5X2NpbmZfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCit4NTA5X2NpbmZfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ3NlcmlhbE51bWJlcicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdzaWduYXR1cmUnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2lzc3VlcicsIFBPSU5URVIoWDUwOV9OQU1FKSksCisgICAgKCd2YWxpZGl0eScsIFBPSU5URVIoWDUwOV9WQUwpKSwKKyAgICAoJ3N1YmplY3QnLCBQT0lOVEVSKFg1MDlfTkFNRSkpLAorICAgICgna2V5JywgUE9JTlRFUihYNTA5X1BVQktFWSkpLAorICAgICgnaXNzdWVyVUlEJywgUE9JTlRFUihBU04xX0JJVF9TVFJJTkcpKSwKKyAgICAoJ3N1YmplY3RVSUQnLCBQT0lOVEVSKEFTTjFfQklUX1NUUklORykpLAorICAgICgnZXh0ZW5zaW9ucycsIFBPSU5URVIoU1RBQ0spKSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9jaW5mX3N0KSA9PSA0MCwgc2l6ZW9mKHg1MDlfY2luZl9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoeDUwOV9jaW5mX3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9jaW5mX3N0KQorWDUwOV9DSU5GID0geDUwOV9jaW5mX3N0CitjbGFzcyB4NTA5X2NlcnRfYXV4X3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworeDUwOV9jZXJ0X2F1eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3RydXN0JywgUE9JTlRFUihTVEFDSykpLAorICAgICgncmVqZWN0JywgUE9JTlRFUihTVEFDSykpLAorICAgICgnYWxpYXMnLCBQT0lOVEVSKEFTTjFfVVRGOFNUUklORykpLAorICAgICgna2V5aWQnLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCisgICAgKCdvdGhlcicsIFBPSU5URVIoU1RBQ0spKSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9jZXJ0X2F1eF9zdCkgPT0gMjAsIHNpemVvZih4NTA5X2NlcnRfYXV4X3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X2NlcnRfYXV4X3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9jZXJ0X2F1eF9zdCkKK1g1MDlfQ0VSVF9BVVggPSB4NTA5X2NlcnRfYXV4X3N0CitjbGFzcyBBVVRIT1JJVFlfS0VZSURfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCit4NTA5X3N0Ll9maWVsZHNfID0gWworICAgICgnY2VydF9pbmZvJywgUE9JTlRFUihYNTA5X0NJTkYpKSwKKyAgICAoJ3NpZ19hbGcnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ3NpZ25hdHVyZScsIFBPSU5URVIoQVNOMV9CSVRfU1RSSU5HKSksCisgICAgKCd2YWxpZCcsIGNfaW50KSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2V4X2RhdGEnLCBDUllQVE9fRVhfREFUQSksCisgICAgKCdleF9wYXRobGVuJywgY19sb25nKSwKKyAgICAoJ2V4X2ZsYWdzJywgY191bG9uZyksCisgICAgKCdleF9rdXNhZ2UnLCBjX3Vsb25nKSwKKyAgICAoJ2V4X3hrdXNhZ2UnLCBjX3Vsb25nKSwKKyAgICAoJ2V4X25zY2VydCcsIGNfdWxvbmcpLAorICAgICgnc2tpZCcsIFBPSU5URVIoQVNOMV9PQ1RFVF9TVFJJTkcpKSwKKyAgICAoJ2FraWQnLCBQT0lOVEVSKEFVVEhPUklUWV9LRVlJRF9zdCkpLAorICAgICgnc2hhMV9oYXNoJywgY191Ynl0ZSAqIDIwKSwKKyAgICAoJ2F1eCcsIFBPSU5URVIoWDUwOV9DRVJUX0FVWCkpLAorXQorYXNzZXJ0IHNpemVvZih4NTA5X3N0KSA9PSA4NCwgc2l6ZW9mKHg1MDlfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfc3QpID09IDQsIGFsaWdubWVudCh4NTA5X3N0KQorQVVUSE9SSVRZX0tFWUlEX3N0Ll9maWVsZHNfID0gWworXQorY2xhc3MgeDUwOV90cnVzdF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3g1MDlfdHJ1c3Rfc3QuX2ZpZWxkc18gPSBbCisgICAgKCd0cnVzdCcsIGNfaW50KSwKKyAgICAoJ2ZsYWdzJywgY19pbnQpLAorICAgICgnY2hlY2tfdHJ1c3QnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoeDUwOV90cnVzdF9zdCksIFBPSU5URVIoWDUwOSksIGNfaW50KSksCisgICAgKCduYW1lJywgU1RSSU5HKSwKKyAgICAoJ2FyZzEnLCBjX2ludCksCisgICAgKCdhcmcyJywgY192b2lkX3ApLAorXQorYXNzZXJ0IHNpemVvZih4NTA5X3RydXN0X3N0KSA9PSAyNCwgc2l6ZW9mKHg1MDlfdHJ1c3Rfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfdHJ1c3Rfc3QpID09IDQsIGFsaWdubWVudCh4NTA5X3RydXN0X3N0KQorWDUwOV9UUlVTVCA9IHg1MDlfdHJ1c3Rfc3QKK2NsYXNzIFg1MDlfcmV2b2tlZF9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfcmV2b2tlZF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3NlcmlhbE51bWJlcicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdyZXZvY2F0aW9uRGF0ZScsIFBPSU5URVIoQVNOMV9USU1FKSksCisgICAgKCdleHRlbnNpb25zJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnc2VxdWVuY2UnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfcmV2b2tlZF9zdCkgPT0gMTYsIHNpemVvZihYNTA5X3Jldm9rZWRfc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfcmV2b2tlZF9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfcmV2b2tlZF9zdCkKK1g1MDlfUkVWT0tFRCA9IFg1MDlfcmV2b2tlZF9zdAorY2xhc3MgWDUwOV9jcmxfaW5mb19zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1g1MDlfY3JsX2luZm9fc3QuX2ZpZWxkc18gPSBbCisgICAgKCd2ZXJzaW9uJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ3NpZ19hbGcnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2lzc3VlcicsIFBPSU5URVIoWDUwOV9OQU1FKSksCisgICAgKCdsYXN0VXBkYXRlJywgUE9JTlRFUihBU04xX1RJTUUpKSwKKyAgICAoJ25leHRVcGRhdGUnLCBQT0lOVEVSKEFTTjFfVElNRSkpLAorICAgICgncmV2b2tlZCcsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2V4dGVuc2lvbnMnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdlbmMnLCBBU04xX0VOQ09ESU5HKSwKK10KK2Fzc2VydCBzaXplb2YoWDUwOV9jcmxfaW5mb19zdCkgPT0gNDAsIHNpemVvZihYNTA5X2NybF9pbmZvX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X2NybF9pbmZvX3N0KSA9PSA0LCBhbGlnbm1lbnQoWDUwOV9jcmxfaW5mb19zdCkKK1g1MDlfQ1JMX0lORk8gPSBYNTA5X2NybF9pbmZvX3N0CitYNTA5X2NybF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2NybCcsIFBPSU5URVIoWDUwOV9DUkxfSU5GTykpLAorICAgICgnc2lnX2FsZycsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorICAgICgnc2lnbmF0dXJlJywgUE9JTlRFUihBU04xX0JJVF9TVFJJTkcpKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfY3JsX3N0KSA9PSAxNiwgc2l6ZW9mKFg1MDlfY3JsX3N0KQorYXNzZXJ0IGFsaWdubWVudChYNTA5X2NybF9zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfY3JsX3N0KQorY2xhc3MgcHJpdmF0ZV9rZXlfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwcml2YXRlX2tleV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3ZlcnNpb24nLCBjX2ludCksCisgICAgKCdlbmNfYWxnb3InLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2VuY19wa2V5JywgUE9JTlRFUihBU04xX09DVEVUX1NUUklORykpLAorICAgICgnZGVjX3BrZXknLCBQT0lOVEVSKEVWUF9QS0VZKSksCisgICAgKCdrZXlfbGVuZ3RoJywgY19pbnQpLAorICAgICgna2V5X2RhdGEnLCBTVFJJTkcpLAorICAgICgna2V5X2ZyZWUnLCBjX2ludCksCisgICAgKCdjaXBoZXInLCBFVlBfQ0lQSEVSX0lORk8pLAorICAgICgncmVmZXJlbmNlcycsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YocHJpdmF0ZV9rZXlfc3QpID09IDUyLCBzaXplb2YocHJpdmF0ZV9rZXlfc3QpCithc3NlcnQgYWxpZ25tZW50KHByaXZhdGVfa2V5X3N0KSA9PSA0LCBhbGlnbm1lbnQocHJpdmF0ZV9rZXlfc3QpCitYNTA5X1BLRVkgPSBwcml2YXRlX2tleV9zdAorY2xhc3MgWDUwOV9pbmZvX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9pbmZvX3N0Ll9maWVsZHNfID0gWworICAgICgneDUwOScsIFBPSU5URVIoWDUwOSkpLAorICAgICgnY3JsJywgUE9JTlRFUihYNTA5X0NSTCkpLAorICAgICgneF9wa2V5JywgUE9JTlRFUihYNTA5X1BLRVkpKSwKKyAgICAoJ2VuY19jaXBoZXInLCBFVlBfQ0lQSEVSX0lORk8pLAorICAgICgnZW5jX2xlbicsIGNfaW50KSwKKyAgICAoJ2VuY19kYXRhJywgU1RSSU5HKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKFg1MDlfaW5mb19zdCkgPT0gNDQsIHNpemVvZihYNTA5X2luZm9fc3QpCithc3NlcnQgYWxpZ25tZW50KFg1MDlfaW5mb19zdCkgPT0gNCwgYWxpZ25tZW50KFg1MDlfaW5mb19zdCkKK1g1MDlfSU5GTyA9IFg1MDlfaW5mb19zdAorY2xhc3MgTmV0c2NhcGVfc3BrYWNfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitOZXRzY2FwZV9zcGthY19zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3B1YmtleScsIFBPSU5URVIoWDUwOV9QVUJLRVkpKSwKKyAgICAoJ2NoYWxsZW5nZScsIFBPSU5URVIoQVNOMV9JQTVTVFJJTkcpKSwKK10KK2Fzc2VydCBzaXplb2YoTmV0c2NhcGVfc3BrYWNfc3QpID09IDgsIHNpemVvZihOZXRzY2FwZV9zcGthY19zdCkKK2Fzc2VydCBhbGlnbm1lbnQoTmV0c2NhcGVfc3BrYWNfc3QpID09IDQsIGFsaWdubWVudChOZXRzY2FwZV9zcGthY19zdCkKK05FVFNDQVBFX1NQS0FDID0gTmV0c2NhcGVfc3BrYWNfc3QKK2NsYXNzIE5ldHNjYXBlX3Nwa2lfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitOZXRzY2FwZV9zcGtpX3N0Ll9maWVsZHNfID0gWworICAgICgnc3BrYWMnLCBQT0lOVEVSKE5FVFNDQVBFX1NQS0FDKSksCisgICAgKCdzaWdfYWxnb3InLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ3NpZ25hdHVyZScsIFBPSU5URVIoQVNOMV9CSVRfU1RSSU5HKSksCitdCithc3NlcnQgc2l6ZW9mKE5ldHNjYXBlX3Nwa2lfc3QpID09IDEyLCBzaXplb2YoTmV0c2NhcGVfc3BraV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoTmV0c2NhcGVfc3BraV9zdCkgPT0gNCwgYWxpZ25tZW50KE5ldHNjYXBlX3Nwa2lfc3QpCitORVRTQ0FQRV9TUEtJID0gTmV0c2NhcGVfc3BraV9zdAorY2xhc3MgTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UoU3RydWN0dXJlKToKKyAgICBwYXNzCitOZXRzY2FwZV9jZXJ0aWZpY2F0ZV9zZXF1ZW5jZS5fZmllbGRzXyA9IFsKKyAgICAoJ3R5cGUnLCBQT0lOVEVSKEFTTjFfT0JKRUNUKSksCisgICAgKCdjZXJ0cycsIFBPSU5URVIoU1RBQ0spKSwKK10KK2Fzc2VydCBzaXplb2YoTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UpID09IDgsIHNpemVvZihOZXRzY2FwZV9jZXJ0aWZpY2F0ZV9zZXF1ZW5jZSkKK2Fzc2VydCBhbGlnbm1lbnQoTmV0c2NhcGVfY2VydGlmaWNhdGVfc2VxdWVuY2UpID09IDQsIGFsaWdubWVudChOZXRzY2FwZV9jZXJ0aWZpY2F0ZV9zZXF1ZW5jZSkKK05FVFNDQVBFX0NFUlRfU0VRVUVOQ0UgPSBOZXRzY2FwZV9jZXJ0aWZpY2F0ZV9zZXF1ZW5jZQorY2xhc3MgUEJFUEFSQU1fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitQQkVQQVJBTV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ3NhbHQnLCBQT0lOVEVSKEFTTjFfT0NURVRfU1RSSU5HKSksCisgICAgKCdpdGVyJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKK10KK2Fzc2VydCBzaXplb2YoUEJFUEFSQU1fc3QpID09IDgsIHNpemVvZihQQkVQQVJBTV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoUEJFUEFSQU1fc3QpID09IDQsIGFsaWdubWVudChQQkVQQVJBTV9zdCkKK1BCRVBBUkFNID0gUEJFUEFSQU1fc3QKK2NsYXNzIFBCRTJQQVJBTV9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK1BCRTJQQVJBTV9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2tleWZ1bmMnLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKKyAgICAoJ2VuY3J5cHRpb24nLCBQT0lOVEVSKFg1MDlfQUxHT1IpKSwKK10KK2Fzc2VydCBzaXplb2YoUEJFMlBBUkFNX3N0KSA9PSA4LCBzaXplb2YoUEJFMlBBUkFNX3N0KQorYXNzZXJ0IGFsaWdubWVudChQQkUyUEFSQU1fc3QpID09IDQsIGFsaWdubWVudChQQkUyUEFSQU1fc3QpCitQQkUyUEFSQU0gPSBQQkUyUEFSQU1fc3QKK2NsYXNzIFBCS0RGMlBBUkFNX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworUEJLREYyUEFSQU1fc3QuX2ZpZWxkc18gPSBbCisgICAgKCdzYWx0JywgUE9JTlRFUihBU04xX1RZUEUpKSwKKyAgICAoJ2l0ZXInLCBQT0lOVEVSKEFTTjFfSU5URUdFUikpLAorICAgICgna2V5bGVuZ3RoJywgUE9JTlRFUihBU04xX0lOVEVHRVIpKSwKKyAgICAoJ3ByZicsIFBPSU5URVIoWDUwOV9BTEdPUikpLAorXQorYXNzZXJ0IHNpemVvZihQQktERjJQQVJBTV9zdCkgPT0gMTYsIHNpemVvZihQQktERjJQQVJBTV9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoUEJLREYyUEFSQU1fc3QpID09IDQsIGFsaWdubWVudChQQktERjJQQVJBTV9zdCkKK1BCS0RGMlBBUkFNID0gUEJLREYyUEFSQU1fc3QKK2NsYXNzIHBrY3M4X3ByaXZfa2V5X2luZm9fc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitwa2NzOF9wcml2X2tleV9pbmZvX3N0Ll9maWVsZHNfID0gWworICAgICgnYnJva2VuJywgY19pbnQpLAorICAgICgndmVyc2lvbicsIFBPSU5URVIoQVNOMV9JTlRFR0VSKSksCisgICAgKCdwa2V5YWxnJywgUE9JTlRFUihYNTA5X0FMR09SKSksCisgICAgKCdwa2V5JywgUE9JTlRFUihBU04xX1RZUEUpKSwKKyAgICAoJ2F0dHJpYnV0ZXMnLCBQT0lOVEVSKFNUQUNLKSksCitdCithc3NlcnQgc2l6ZW9mKHBrY3M4X3ByaXZfa2V5X2luZm9fc3QpID09IDIwLCBzaXplb2YocGtjczhfcHJpdl9rZXlfaW5mb19zdCkKK2Fzc2VydCBhbGlnbm1lbnQocGtjczhfcHJpdl9rZXlfaW5mb19zdCkgPT0gNCwgYWxpZ25tZW50KHBrY3M4X3ByaXZfa2V5X2luZm9fc3QpCitQS0NTOF9QUklWX0tFWV9JTkZPID0gcGtjczhfcHJpdl9rZXlfaW5mb19zdAorY2xhc3MgeDUwOV9oYXNoX2Rpcl9zdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3g1MDlfaGFzaF9kaXJfc3QuX2ZpZWxkc18gPSBbCisgICAgKCdudW1fZGlycycsIGNfaW50KSwKKyAgICAoJ2RpcnMnLCBQT0lOVEVSKFNUUklORykpLAorICAgICgnZGlyc190eXBlJywgUE9JTlRFUihjX2ludCkpLAorICAgICgnbnVtX2RpcnNfYWxsb2NlZCcsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9oYXNoX2Rpcl9zdCkgPT0gMTYsIHNpemVvZih4NTA5X2hhc2hfZGlyX3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X2hhc2hfZGlyX3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9oYXNoX2Rpcl9zdCkKK1g1MDlfSEFTSF9ESVJfQ1RYID0geDUwOV9oYXNoX2Rpcl9zdAorY2xhc3MgeDUwOV9maWxlX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworeDUwOV9maWxlX3N0Ll9maWVsZHNfID0gWworICAgICgnbnVtX3BhdGhzJywgY19pbnQpLAorICAgICgnbnVtX2FsbG9jZWQnLCBjX2ludCksCisgICAgKCdwYXRocycsIFBPSU5URVIoU1RSSU5HKSksCisgICAgKCdwYXRoX3R5cGUnLCBQT0lOVEVSKGNfaW50KSksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfZmlsZV9zdCkgPT0gMTYsIHNpemVvZih4NTA5X2ZpbGVfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfZmlsZV9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfZmlsZV9zdCkKK1g1MDlfQ0VSVF9GSUxFX0NUWCA9IHg1MDlfZmlsZV9zdAorY2xhc3MgeDUwOV9vYmplY3Rfc3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitjbGFzcyBOMTR4NTA5X29iamVjdF9zdDRET0xMQVJfMTRFKFVuaW9uKToKKyAgICBwYXNzCitOMTR4NTA5X29iamVjdF9zdDRET0xMQVJfMTRFLl9maWVsZHNfID0gWworICAgICgncHRyJywgU1RSSU5HKSwKKyAgICAoJ3g1MDknLCBQT0lOVEVSKFg1MDkpKSwKKyAgICAoJ2NybCcsIFBPSU5URVIoWDUwOV9DUkwpKSwKKyAgICAoJ3BrZXknLCBQT0lOVEVSKEVWUF9QS0VZKSksCitdCithc3NlcnQgc2l6ZW9mKE4xNHg1MDlfb2JqZWN0X3N0NERPTExBUl8xNEUpID09IDQsIHNpemVvZihOMTR4NTA5X29iamVjdF9zdDRET0xMQVJfMTRFKQorYXNzZXJ0IGFsaWdubWVudChOMTR4NTA5X29iamVjdF9zdDRET0xMQVJfMTRFKSA9PSA0LCBhbGlnbm1lbnQoTjE0eDUwOV9vYmplY3Rfc3Q0RE9MTEFSXzE0RSkKK3g1MDlfb2JqZWN0X3N0Ll9maWVsZHNfID0gWworICAgICgndHlwZScsIGNfaW50KSwKKyAgICAoJ2RhdGEnLCBOMTR4NTA5X29iamVjdF9zdDRET0xMQVJfMTRFKSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9vYmplY3Rfc3QpID09IDgsIHNpemVvZih4NTA5X29iamVjdF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoeDUwOV9vYmplY3Rfc3QpID09IDQsIGFsaWdubWVudCh4NTA5X29iamVjdF9zdCkKK1g1MDlfT0JKRUNUID0geDUwOV9vYmplY3Rfc3QKK2NsYXNzIHg1MDlfbG9va3VwX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworWDUwOV9MT09LVVAgPSB4NTA5X2xvb2t1cF9zdAorY2xhc3MgeDUwOV9sb29rdXBfbWV0aG9kX3N0KFN0cnVjdHVyZSk6CisgICAgcGFzcworeDUwOV9sb29rdXBfbWV0aG9kX3N0Ll9maWVsZHNfID0gWworICAgICgnbmFtZScsIFNUUklORyksCisgICAgKCduZXdfaXRlbScsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X0xPT0tVUCkpKSwKKyAgICAoJ2ZyZWUnLCBDRlVOQ1RZUEUoTm9uZSwgUE9JTlRFUihYNTA5X0xPT0tVUCkpKSwKKyAgICAoJ2luaXQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApKSksCisgICAgKCdzaHV0ZG93bicsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X0xPT0tVUCkpKSwKKyAgICAoJ2N0cmwnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApLCBjX2ludCwgU1RSSU5HLCBjX2xvbmcsIFBPSU5URVIoU1RSSU5HKSkpLAorICAgICgnZ2V0X2J5X3N1YmplY3QnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApLCBjX2ludCwgUE9JTlRFUihYNTA5X05BTUUpLCBQT0lOVEVSKFg1MDlfT0JKRUNUKSkpLAorICAgICgnZ2V0X2J5X2lzc3Vlcl9zZXJpYWwnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApLCBjX2ludCwgUE9JTlRFUihYNTA5X05BTUUpLCBQT0lOVEVSKEFTTjFfSU5URUdFUiksIFBPSU5URVIoWDUwOV9PQkpFQ1QpKSksCisgICAgKCdnZXRfYnlfZmluZ2VycHJpbnQnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApLCBjX2ludCwgUE9JTlRFUihjX3VieXRlKSwgY19pbnQsIFBPSU5URVIoWDUwOV9PQkpFQ1QpKSksCisgICAgKCdnZXRfYnlfYWxpYXMnLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9MT09LVVApLCBjX2ludCwgU1RSSU5HLCBjX2ludCwgUE9JTlRFUihYNTA5X09CSkVDVCkpKSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9sb29rdXBfbWV0aG9kX3N0KSA9PSA0MCwgc2l6ZW9mKHg1MDlfbG9va3VwX21ldGhvZF9zdCkKK2Fzc2VydCBhbGlnbm1lbnQoeDUwOV9sb29rdXBfbWV0aG9kX3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9sb29rdXBfbWV0aG9kX3N0KQorWDUwOV9MT09LVVBfTUVUSE9EID0geDUwOV9sb29rdXBfbWV0aG9kX3N0Cit4NTA5X3N0b3JlX3N0Ll9maWVsZHNfID0gWworICAgICgnY2FjaGUnLCBjX2ludCksCisgICAgKCdvYmpzJywgUE9JTlRFUihTVEFDSykpLAorICAgICgnZ2V0X2NlcnRfbWV0aG9kcycsIFBPSU5URVIoU1RBQ0spKSwKKyAgICAoJ2ZsYWdzJywgY191bG9uZyksCisgICAgKCdwdXJwb3NlJywgY19pbnQpLAorICAgICgndHJ1c3QnLCBjX2ludCksCisgICAgKCd2ZXJpZnknLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpKSksCisgICAgKCd2ZXJpZnlfY2InLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnZ2V0X2lzc3VlcicsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihQT0lOVEVSKFg1MDkpKSwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOSkpKSwKKyAgICAoJ2NoZWNrX2lzc3VlZCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOSksIFBPSU5URVIoWDUwOSkpKSwKKyAgICAoJ2NoZWNrX3Jldm9jYXRpb24nLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpKSksCisgICAgKCdnZXRfY3JsJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSwgUE9JTlRFUihQT0lOVEVSKFg1MDlfQ1JMKSksIFBPSU5URVIoWDUwOSkpKSwKKyAgICAoJ2NoZWNrX2NybCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOV9DUkwpKSksCisgICAgKCdjZXJ0X2NybCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOV9DUkwpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjbGVhbnVwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnZXhfZGF0YScsIENSWVBUT19FWF9EQVRBKSwKKyAgICAoJ3JlZmVyZW5jZXMnLCBjX2ludCksCisgICAgKCdkZXB0aCcsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoeDUwOV9zdG9yZV9zdCkgPT0gNzYsIHNpemVvZih4NTA5X3N0b3JlX3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X3N0b3JlX3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9zdG9yZV9zdCkKK3g1MDlfbG9va3VwX3N0Ll9maWVsZHNfID0gWworICAgICgnaW5pdCcsIGNfaW50KSwKKyAgICAoJ3NraXAnLCBjX2ludCksCisgICAgKCdtZXRob2QnLCBQT0lOVEVSKFg1MDlfTE9PS1VQX01FVEhPRCkpLAorICAgICgnbWV0aG9kX2RhdGEnLCBTVFJJTkcpLAorICAgICgnc3RvcmVfY3R4JywgUE9JTlRFUihYNTA5X1NUT1JFKSksCitdCithc3NlcnQgc2l6ZW9mKHg1MDlfbG9va3VwX3N0KSA9PSAyMCwgc2l6ZW9mKHg1MDlfbG9va3VwX3N0KQorYXNzZXJ0IGFsaWdubWVudCh4NTA5X2xvb2t1cF9zdCkgPT0gNCwgYWxpZ25tZW50KHg1MDlfbG9va3VwX3N0KQordGltZV90ID0gX19kYXJ3aW5fdGltZV90Cit4NTA5X3N0b3JlX2N0eF9zdC5fZmllbGRzXyA9IFsKKyAgICAoJ2N0eCcsIFBPSU5URVIoWDUwOV9TVE9SRSkpLAorICAgICgnY3VycmVudF9tZXRob2QnLCBjX2ludCksCisgICAgKCdjZXJ0JywgUE9JTlRFUihYNTA5KSksCisgICAgKCd1bnRydXN0ZWQnLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdwdXJwb3NlJywgY19pbnQpLAorICAgICgndHJ1c3QnLCBjX2ludCksCisgICAgKCdjaGVja190aW1lJywgdGltZV90KSwKKyAgICAoJ2ZsYWdzJywgY191bG9uZyksCisgICAgKCdvdGhlcl9jdHgnLCBjX3ZvaWRfcCksCisgICAgKCd2ZXJpZnknLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpKSksCisgICAgKCd2ZXJpZnlfY2InLCBDRlVOQ1RZUEUoY19pbnQsIGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnZ2V0X2lzc3VlcicsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihQT0lOVEVSKFg1MDkpKSwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOSkpKSwKKyAgICAoJ2NoZWNrX2lzc3VlZCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOSksIFBPSU5URVIoWDUwOSkpKSwKKyAgICAoJ2NoZWNrX3Jldm9jYXRpb24nLCBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoWDUwOV9TVE9SRV9DVFgpKSksCisgICAgKCdnZXRfY3JsJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSwgUE9JTlRFUihQT0lOVEVSKFg1MDlfQ1JMKSksIFBPSU5URVIoWDUwOSkpKSwKKyAgICAoJ2NoZWNrX2NybCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOV9DUkwpKSksCisgICAgKCdjZXJ0X2NybCcsIENGVU5DVFlQRShjX2ludCwgUE9JTlRFUihYNTA5X1NUT1JFX0NUWCksIFBPSU5URVIoWDUwOV9DUkwpLCBQT0lOVEVSKFg1MDkpKSksCisgICAgKCdjbGVhbnVwJywgQ0ZVTkNUWVBFKGNfaW50LCBQT0lOVEVSKFg1MDlfU1RPUkVfQ1RYKSkpLAorICAgICgnZGVwdGgnLCBjX2ludCksCisgICAgKCd2YWxpZCcsIGNfaW50KSwKKyAgICAoJ2xhc3RfdW50cnVzdGVkJywgY19pbnQpLAorICAgICgnY2hhaW4nLCBQT0lOVEVSKFNUQUNLKSksCisgICAgKCdlcnJvcl9kZXB0aCcsIGNfaW50KSwKKyAgICAoJ2Vycm9yJywgY19pbnQpLAorICAgICgnY3VycmVudF9jZXJ0JywgUE9JTlRFUihYNTA5KSksCisgICAgKCdjdXJyZW50X2lzc3VlcicsIFBPSU5URVIoWDUwOSkpLAorICAgICgnY3VycmVudF9jcmwnLCBQT0lOVEVSKFg1MDlfQ1JMKSksCisgICAgKCdleF9kYXRhJywgQ1JZUFRPX0VYX0RBVEEpLAorXQorYXNzZXJ0IHNpemVvZih4NTA5X3N0b3JlX2N0eF9zdCkgPT0gMTE2LCBzaXplb2YoeDUwOV9zdG9yZV9jdHhfc3QpCithc3NlcnQgYWxpZ25tZW50KHg1MDlfc3RvcmVfY3R4X3N0KSA9PSA0LCBhbGlnbm1lbnQoeDUwOV9zdG9yZV9jdHhfc3QpCit2YV9saXN0ID0gX19kYXJ3aW5fdmFfbGlzdAorX19kYXJ3aW5fb2ZmX3QgPSBfX2ludDY0X3QKK2Zwb3NfdCA9IF9fZGFyd2luX29mZl90CitjbGFzcyBfX3NidWYoU3RydWN0dXJlKToKKyAgICBwYXNzCitfX3NidWYuX2ZpZWxkc18gPSBbCisgICAgKCdfYmFzZScsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnX3NpemUnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKF9fc2J1ZikgPT0gOCwgc2l6ZW9mKF9fc2J1ZikKK2Fzc2VydCBhbGlnbm1lbnQoX19zYnVmKSA9PSA0LCBhbGlnbm1lbnQoX19zYnVmKQorY2xhc3MgX19zRklMRVgoU3RydWN0dXJlKToKKyAgICBwYXNzCitfX3NGSUxFWC5fZmllbGRzXyA9IFsKK10KK2NsYXNzIF9fc0ZJTEUoU3RydWN0dXJlKToKKyAgICBwYXNzCitfX3NGSUxFLl9wYWNrXyA9IDQKK19fc0ZJTEUuX2ZpZWxkc18gPSBbCisgICAgKCdfcCcsIFBPSU5URVIoY191Ynl0ZSkpLAorICAgICgnX3InLCBjX2ludCksCisgICAgKCdfdycsIGNfaW50KSwKKyAgICAoJ19mbGFncycsIGNfc2hvcnQpLAorICAgICgnX2ZpbGUnLCBjX3Nob3J0KSwKKyAgICAoJ19iZicsIF9fc2J1ZiksCisgICAgKCdfbGJmc2l6ZScsIGNfaW50KSwKKyAgICAoJ19jb29raWUnLCBjX3ZvaWRfcCksCisgICAgKCdfY2xvc2UnLCBDRlVOQ1RZUEUoY19pbnQsIGNfdm9pZF9wKSksCisgICAgKCdfcmVhZCcsIENGVU5DVFlQRShjX2ludCwgY192b2lkX3AsIFNUUklORywgY19pbnQpKSwKKyAgICAoJ19zZWVrJywgQ0ZVTkNUWVBFKGZwb3NfdCwgY192b2lkX3AsIGNfbG9uZ2xvbmcsIGNfaW50KSksCisgICAgKCdfd3JpdGUnLCBDRlVOQ1RZUEUoY19pbnQsIGNfdm9pZF9wLCBTVFJJTkcsIGNfaW50KSksCisgICAgKCdfdWInLCBfX3NidWYpLAorICAgICgnX2V4dHJhJywgUE9JTlRFUihfX3NGSUxFWCkpLAorICAgICgnX3VyJywgY19pbnQpLAorICAgICgnX3VidWYnLCBjX3VieXRlICogMyksCisgICAgKCdfbmJ1ZicsIGNfdWJ5dGUgKiAxKSwKKyAgICAoJ19sYicsIF9fc2J1ZiksCisgICAgKCdfYmxrc2l6ZScsIGNfaW50KSwKKyAgICAoJ19vZmZzZXQnLCBmcG9zX3QpLAorXQorYXNzZXJ0IHNpemVvZihfX3NGSUxFKSA9PSA4OCwgc2l6ZW9mKF9fc0ZJTEUpCithc3NlcnQgYWxpZ25tZW50KF9fc0ZJTEUpID09IDQsIGFsaWdubWVudChfX3NGSUxFKQorRklMRSA9IF9fc0ZJTEUKK2N0X3J1bmVfdCA9IF9fZGFyd2luX2N0X3J1bmVfdAorcnVuZV90ID0gX19kYXJ3aW5fcnVuZV90CitjbGFzcyBkaXZfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2Rpdl90Ll9maWVsZHNfID0gWworICAgICgncXVvdCcsIGNfaW50KSwKKyAgICAoJ3JlbScsIGNfaW50KSwKK10KK2Fzc2VydCBzaXplb2YoZGl2X3QpID09IDgsIHNpemVvZihkaXZfdCkKK2Fzc2VydCBhbGlnbm1lbnQoZGl2X3QpID09IDQsIGFsaWdubWVudChkaXZfdCkKK2NsYXNzIGxkaXZfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK2xkaXZfdC5fZmllbGRzXyA9IFsKKyAgICAoJ3F1b3QnLCBjX2xvbmcpLAorICAgICgncmVtJywgY19sb25nKSwKK10KK2Fzc2VydCBzaXplb2YobGRpdl90KSA9PSA4LCBzaXplb2YobGRpdl90KQorYXNzZXJ0IGFsaWdubWVudChsZGl2X3QpID09IDQsIGFsaWdubWVudChsZGl2X3QpCitjbGFzcyBsbGRpdl90KFN0cnVjdHVyZSk6CisgICAgcGFzcworbGxkaXZfdC5fcGFja18gPSA0CitsbGRpdl90Ll9maWVsZHNfID0gWworICAgICgncXVvdCcsIGNfbG9uZ2xvbmcpLAorICAgICgncmVtJywgY19sb25nbG9uZyksCitdCithc3NlcnQgc2l6ZW9mKGxsZGl2X3QpID09IDE2LCBzaXplb2YobGxkaXZfdCkKK2Fzc2VydCBhbGlnbm1lbnQobGxkaXZfdCkgPT0gNCwgYWxpZ25tZW50KGxsZGl2X3QpCitfX2Rhcndpbl9kZXZfdCA9IF9faW50MzJfdAorZGV2X3QgPSBfX2Rhcndpbl9kZXZfdAorX19kYXJ3aW5fbW9kZV90ID0gX191aW50MTZfdAorbW9kZV90ID0gX19kYXJ3aW5fbW9kZV90CitjbGFzcyBtY29udGV4dChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK21jb250ZXh0Ll9maWVsZHNfID0gWworXQorY2xhc3MgbWNvbnRleHQ2NChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK21jb250ZXh0NjQuX2ZpZWxkc18gPSBbCitdCitjbGFzcyBfX2Rhcndpbl9wdGhyZWFkX2hhbmRsZXJfcmVjKFN0cnVjdHVyZSk6CisgICAgcGFzcworX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYy5fZmllbGRzXyA9IFsKKyAgICAoJ19fcm91dGluZScsIENGVU5DVFlQRShOb25lLCBjX3ZvaWRfcCkpLAorICAgICgnX19hcmcnLCBjX3ZvaWRfcCksCisgICAgKCdfX25leHQnLCBQT0lOVEVSKF9fZGFyd2luX3B0aHJlYWRfaGFuZGxlcl9yZWMpKSwKK10KK2Fzc2VydCBzaXplb2YoX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYykgPT0gMTIsIHNpemVvZihfX2Rhcndpbl9wdGhyZWFkX2hhbmRsZXJfcmVjKQorYXNzZXJ0IGFsaWdubWVudChfX2Rhcndpbl9wdGhyZWFkX2hhbmRsZXJfcmVjKSA9PSA0LCBhbGlnbm1lbnQoX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYykKK2NsYXNzIF9vcGFxdWVfcHRocmVhZF9hdHRyX3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitfb3BhcXVlX3B0aHJlYWRfYXR0cl90Ll9maWVsZHNfID0gWworICAgICgnX19zaWcnLCBjX2xvbmcpLAorICAgICgnX19vcGFxdWUnLCBjX2NoYXIgKiAzNiksCitdCithc3NlcnQgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9hdHRyX3QpID09IDQwLCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX2F0dHJfdCkKK2Fzc2VydCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX2F0dHJfdCkgPT0gNCwgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9hdHRyX3QpCitjbGFzcyBfb3BhcXVlX3B0aHJlYWRfY29uZF90KFN0cnVjdHVyZSk6CisgICAgcGFzcworX29wYXF1ZV9wdGhyZWFkX2NvbmRfdC5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnJywgY19sb25nKSwKKyAgICAoJ19fb3BhcXVlJywgY19jaGFyICogMjQpLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfY29uZF90KSA9PSAyOCwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9jb25kX3QpCithc3NlcnQgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9jb25kX3QpID09IDQsIGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfY29uZF90KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX2NvbmRhdHRyX3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitfb3BhcXVlX3B0aHJlYWRfY29uZGF0dHJfdC5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnJywgY19sb25nKSwKKyAgICAoJ19fb3BhcXVlJywgY19jaGFyICogNCksCitdCithc3NlcnQgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9jb25kYXR0cl90KSA9PSA4LCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX2NvbmRhdHRyX3QpCithc3NlcnQgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9jb25kYXR0cl90KSA9PSA0LCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX2NvbmRhdHRyX3QpCitjbGFzcyBfb3BhcXVlX3B0aHJlYWRfbXV0ZXhfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK19vcGFxdWVfcHRocmVhZF9tdXRleF90Ll9maWVsZHNfID0gWworICAgICgnX19zaWcnLCBjX2xvbmcpLAorICAgICgnX19vcGFxdWUnLCBjX2NoYXIgKiA0MCksCitdCithc3NlcnQgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9tdXRleF90KSA9PSA0NCwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9tdXRleF90KQorYXNzZXJ0IGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfbXV0ZXhfdCkgPT0gNCwgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9tdXRleF90KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX211dGV4YXR0cl90KFN0cnVjdHVyZSk6CisgICAgcGFzcworX29wYXF1ZV9wdGhyZWFkX211dGV4YXR0cl90Ll9maWVsZHNfID0gWworICAgICgnX19zaWcnLCBjX2xvbmcpLAorICAgICgnX19vcGFxdWUnLCBjX2NoYXIgKiA4KSwKK10KK2Fzc2VydCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX211dGV4YXR0cl90KSA9PSAxMiwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9tdXRleGF0dHJfdCkKK2Fzc2VydCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX211dGV4YXR0cl90KSA9PSA0LCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX211dGV4YXR0cl90KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX29uY2VfdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK19vcGFxdWVfcHRocmVhZF9vbmNlX3QuX2ZpZWxkc18gPSBbCisgICAgKCdfX3NpZycsIGNfbG9uZyksCisgICAgKCdfX29wYXF1ZScsIGNfY2hhciAqIDQpLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfb25jZV90KSA9PSA4LCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX29uY2VfdCkKK2Fzc2VydCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX29uY2VfdCkgPT0gNCwgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9vbmNlX3QpCitjbGFzcyBfb3BhcXVlX3B0aHJlYWRfcndsb2NrX3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitfb3BhcXVlX3B0aHJlYWRfcndsb2NrX3QuX2ZpZWxkc18gPSBbCisgICAgKCdfX3NpZycsIGNfbG9uZyksCisgICAgKCdfX29wYXF1ZScsIGNfY2hhciAqIDEyNCksCitdCithc3NlcnQgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9yd2xvY2tfdCkgPT0gMTI4LCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX3J3bG9ja190KQorYXNzZXJ0IGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfcndsb2NrX3QpID09IDQsIGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfcndsb2NrX3QpCitjbGFzcyBfb3BhcXVlX3B0aHJlYWRfcndsb2NrYXR0cl90KFN0cnVjdHVyZSk6CisgICAgcGFzcworX29wYXF1ZV9wdGhyZWFkX3J3bG9ja2F0dHJfdC5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnJywgY19sb25nKSwKKyAgICAoJ19fb3BhcXVlJywgY19jaGFyICogMTIpLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfcndsb2NrYXR0cl90KSA9PSAxNiwgc2l6ZW9mKF9vcGFxdWVfcHRocmVhZF9yd2xvY2thdHRyX3QpCithc3NlcnQgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF9yd2xvY2thdHRyX3QpID09IDQsIGFsaWdubWVudChfb3BhcXVlX3B0aHJlYWRfcndsb2NrYXR0cl90KQorY2xhc3MgX29wYXF1ZV9wdGhyZWFkX3QoU3RydWN0dXJlKToKKyAgICBwYXNzCitfb3BhcXVlX3B0aHJlYWRfdC5fZmllbGRzXyA9IFsKKyAgICAoJ19fc2lnJywgY19sb25nKSwKKyAgICAoJ19fY2xlYW51cF9zdGFjaycsIFBPSU5URVIoX19kYXJ3aW5fcHRocmVhZF9oYW5kbGVyX3JlYykpLAorICAgICgnX19vcGFxdWUnLCBjX2NoYXIgKiA1OTYpLAorXQorYXNzZXJ0IHNpemVvZihfb3BhcXVlX3B0aHJlYWRfdCkgPT0gNjA0LCBzaXplb2YoX29wYXF1ZV9wdGhyZWFkX3QpCithc3NlcnQgYWxpZ25tZW50KF9vcGFxdWVfcHRocmVhZF90KSA9PSA0LCBhbGlnbm1lbnQoX29wYXF1ZV9wdGhyZWFkX3QpCitfX2Rhcndpbl9ibGtjbnRfdCA9IF9faW50NjRfdAorX19kYXJ3aW5fYmxrc2l6ZV90ID0gX19pbnQzMl90CitfX2Rhcndpbl9mc2Jsa2NudF90ID0gY191aW50CitfX2Rhcndpbl9mc2ZpbGNudF90ID0gY191aW50CitfX2Rhcndpbl9naWRfdCA9IF9fdWludDMyX3QKK19fZGFyd2luX2lkX3QgPSBfX3VpbnQzMl90CitfX2Rhcndpbl9pbm9fdCA9IF9fdWludDMyX3QKK19fZGFyd2luX21hY2hfcG9ydF9uYW1lX3QgPSBfX2Rhcndpbl9uYXR1cmFsX3QKK19fZGFyd2luX21hY2hfcG9ydF90ID0gX19kYXJ3aW5fbWFjaF9wb3J0X25hbWVfdAorX19kYXJ3aW5fbWNvbnRleHRfdCA9IFBPSU5URVIobWNvbnRleHQpCitfX2Rhcndpbl9tY29udGV4dDY0X3QgPSBQT0lOVEVSKG1jb250ZXh0NjQpCitfX2Rhcndpbl9waWRfdCA9IF9faW50MzJfdAorX19kYXJ3aW5fcHRocmVhZF9hdHRyX3QgPSBfb3BhcXVlX3B0aHJlYWRfYXR0cl90CitfX2Rhcndpbl9wdGhyZWFkX2NvbmRfdCA9IF9vcGFxdWVfcHRocmVhZF9jb25kX3QKK19fZGFyd2luX3B0aHJlYWRfY29uZGF0dHJfdCA9IF9vcGFxdWVfcHRocmVhZF9jb25kYXR0cl90CitfX2Rhcndpbl9wdGhyZWFkX2tleV90ID0gY191bG9uZworX19kYXJ3aW5fcHRocmVhZF9tdXRleF90ID0gX29wYXF1ZV9wdGhyZWFkX211dGV4X3QKK19fZGFyd2luX3B0aHJlYWRfbXV0ZXhhdHRyX3QgPSBfb3BhcXVlX3B0aHJlYWRfbXV0ZXhhdHRyX3QKK19fZGFyd2luX3B0aHJlYWRfb25jZV90ID0gX29wYXF1ZV9wdGhyZWFkX29uY2VfdAorX19kYXJ3aW5fcHRocmVhZF9yd2xvY2tfdCA9IF9vcGFxdWVfcHRocmVhZF9yd2xvY2tfdAorX19kYXJ3aW5fcHRocmVhZF9yd2xvY2thdHRyX3QgPSBfb3BhcXVlX3B0aHJlYWRfcndsb2NrYXR0cl90CitfX2Rhcndpbl9wdGhyZWFkX3QgPSBQT0lOVEVSKF9vcGFxdWVfcHRocmVhZF90KQorX19kYXJ3aW5fc2lnc2V0X3QgPSBfX3VpbnQzMl90CitfX2Rhcndpbl9zdXNlY29uZHNfdCA9IF9faW50MzJfdAorX19kYXJ3aW5fdWlkX3QgPSBfX3VpbnQzMl90CitfX2Rhcndpbl91c2Vjb25kc190ID0gX191aW50MzJfdAorX19kYXJ3aW5fdXVpZF90ID0gY191Ynl0ZSAqIDE2CitjbGFzcyBzaWdhbHRzdGFjayhTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3NpZ2FsdHN0YWNrLl9maWVsZHNfID0gWworICAgICgnc3Nfc3AnLCBjX3ZvaWRfcCksCisgICAgKCdzc19zaXplJywgX19kYXJ3aW5fc2l6ZV90KSwKKyAgICAoJ3NzX2ZsYWdzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihzaWdhbHRzdGFjaykgPT0gMTIsIHNpemVvZihzaWdhbHRzdGFjaykKK2Fzc2VydCBhbGlnbm1lbnQoc2lnYWx0c3RhY2spID09IDQsIGFsaWdubWVudChzaWdhbHRzdGFjaykKK19fZGFyd2luX3N0YWNrX3QgPSBzaWdhbHRzdGFjaworY2xhc3MgdWNvbnRleHQoU3RydWN0dXJlKToKKyAgICBwYXNzCit1Y29udGV4dC5fZmllbGRzXyA9IFsKKyAgICAoJ3VjX29uc3RhY2snLCBjX2ludCksCisgICAgKCd1Y19zaWdtYXNrJywgX19kYXJ3aW5fc2lnc2V0X3QpLAorICAgICgndWNfc3RhY2snLCBfX2Rhcndpbl9zdGFja190KSwKKyAgICAoJ3VjX2xpbmsnLCBQT0lOVEVSKHVjb250ZXh0KSksCisgICAgKCd1Y19tY3NpemUnLCBfX2Rhcndpbl9zaXplX3QpLAorICAgICgndWNfbWNvbnRleHQnLCBfX2Rhcndpbl9tY29udGV4dF90KSwKK10KK2Fzc2VydCBzaXplb2YodWNvbnRleHQpID09IDMyLCBzaXplb2YodWNvbnRleHQpCithc3NlcnQgYWxpZ25tZW50KHVjb250ZXh0KSA9PSA0LCBhbGlnbm1lbnQodWNvbnRleHQpCitfX2Rhcndpbl91Y29udGV4dF90ID0gdWNvbnRleHQKK2NsYXNzIHVjb250ZXh0NjQoU3RydWN0dXJlKToKKyAgICBwYXNzCit1Y29udGV4dDY0Ll9maWVsZHNfID0gWworICAgICgndWNfb25zdGFjaycsIGNfaW50KSwKKyAgICAoJ3VjX3NpZ21hc2snLCBfX2Rhcndpbl9zaWdzZXRfdCksCisgICAgKCd1Y19zdGFjaycsIF9fZGFyd2luX3N0YWNrX3QpLAorICAgICgndWNfbGluaycsIFBPSU5URVIodWNvbnRleHQ2NCkpLAorICAgICgndWNfbWNzaXplJywgX19kYXJ3aW5fc2l6ZV90KSwKKyAgICAoJ3VjX21jb250ZXh0NjQnLCBfX2Rhcndpbl9tY29udGV4dDY0X3QpLAorXQorYXNzZXJ0IHNpemVvZih1Y29udGV4dDY0KSA9PSAzMiwgc2l6ZW9mKHVjb250ZXh0NjQpCithc3NlcnQgYWxpZ25tZW50KHVjb250ZXh0NjQpID09IDQsIGFsaWdubWVudCh1Y29udGV4dDY0KQorX19kYXJ3aW5fdWNvbnRleHQ2NF90ID0gdWNvbnRleHQ2NAorY2xhc3MgdGltZXZhbChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3RpbWV2YWwuX2ZpZWxkc18gPSBbCisgICAgKCd0dl9zZWMnLCBfX2Rhcndpbl90aW1lX3QpLAorICAgICgndHZfdXNlYycsIF9fZGFyd2luX3N1c2Vjb25kc190KSwKK10KK2Fzc2VydCBzaXplb2YodGltZXZhbCkgPT0gOCwgc2l6ZW9mKHRpbWV2YWwpCithc3NlcnQgYWxpZ25tZW50KHRpbWV2YWwpID09IDQsIGFsaWdubWVudCh0aW1ldmFsKQorcmxpbV90ID0gX19pbnQ2NF90CitjbGFzcyBydXNhZ2UoU3RydWN0dXJlKToKKyAgICBwYXNzCitydXNhZ2UuX2ZpZWxkc18gPSBbCisgICAgKCdydV91dGltZScsIHRpbWV2YWwpLAorICAgICgncnVfc3RpbWUnLCB0aW1ldmFsKSwKKyAgICAoJ3J1X21heHJzcycsIGNfbG9uZyksCisgICAgKCdydV9peHJzcycsIGNfbG9uZyksCisgICAgKCdydV9pZHJzcycsIGNfbG9uZyksCisgICAgKCdydV9pc3JzcycsIGNfbG9uZyksCisgICAgKCdydV9taW5mbHQnLCBjX2xvbmcpLAorICAgICgncnVfbWFqZmx0JywgY19sb25nKSwKKyAgICAoJ3J1X25zd2FwJywgY19sb25nKSwKKyAgICAoJ3J1X2luYmxvY2snLCBjX2xvbmcpLAorICAgICgncnVfb3VibG9jaycsIGNfbG9uZyksCisgICAgKCdydV9tc2dzbmQnLCBjX2xvbmcpLAorICAgICgncnVfbXNncmN2JywgY19sb25nKSwKKyAgICAoJ3J1X25zaWduYWxzJywgY19sb25nKSwKKyAgICAoJ3J1X252Y3N3JywgY19sb25nKSwKKyAgICAoJ3J1X25pdmNzdycsIGNfbG9uZyksCitdCithc3NlcnQgc2l6ZW9mKHJ1c2FnZSkgPT0gNzIsIHNpemVvZihydXNhZ2UpCithc3NlcnQgYWxpZ25tZW50KHJ1c2FnZSkgPT0gNCwgYWxpZ25tZW50KHJ1c2FnZSkKK2NsYXNzIHJsaW1pdChTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3JsaW1pdC5fcGFja18gPSA0CitybGltaXQuX2ZpZWxkc18gPSBbCisgICAgKCdybGltX2N1cicsIHJsaW1fdCksCisgICAgKCdybGltX21heCcsIHJsaW1fdCksCitdCithc3NlcnQgc2l6ZW9mKHJsaW1pdCkgPT0gMTYsIHNpemVvZihybGltaXQpCithc3NlcnQgYWxpZ25tZW50KHJsaW1pdCkgPT0gNCwgYWxpZ25tZW50KHJsaW1pdCkKK21jb250ZXh0X3QgPSBfX2Rhcndpbl9tY29udGV4dF90CittY29udGV4dDY0X3QgPSBfX2Rhcndpbl9tY29udGV4dDY0X3QKK3B0aHJlYWRfYXR0cl90ID0gX19kYXJ3aW5fcHRocmVhZF9hdHRyX3QKK3NpZ3NldF90ID0gX19kYXJ3aW5fc2lnc2V0X3QKK3Vjb250ZXh0X3QgPSBfX2Rhcndpbl91Y29udGV4dF90Cit1Y29udGV4dDY0X3QgPSBfX2Rhcndpbl91Y29udGV4dDY0X3QKK3VpZF90ID0gX19kYXJ3aW5fdWlkX3QKK2NsYXNzIHNpZ3ZhbChVbmlvbik6CisgICAgcGFzcworc2lndmFsLl9maWVsZHNfID0gWworICAgICgnc2l2YWxfaW50JywgY19pbnQpLAorICAgICgnc2l2YWxfcHRyJywgY192b2lkX3ApLAorXQorYXNzZXJ0IHNpemVvZihzaWd2YWwpID09IDQsIHNpemVvZihzaWd2YWwpCithc3NlcnQgYWxpZ25tZW50KHNpZ3ZhbCkgPT0gNCwgYWxpZ25tZW50KHNpZ3ZhbCkKK2NsYXNzIHNpZ2V2ZW50KFN0cnVjdHVyZSk6CisgICAgcGFzcworc2lnZXZlbnQuX2ZpZWxkc18gPSBbCisgICAgKCdzaWdldl9ub3RpZnknLCBjX2ludCksCisgICAgKCdzaWdldl9zaWdubycsIGNfaW50KSwKKyAgICAoJ3NpZ2V2X3ZhbHVlJywgc2lndmFsKSwKKyAgICAoJ3NpZ2V2X25vdGlmeV9mdW5jdGlvbicsIENGVU5DVFlQRShOb25lLCBzaWd2YWwpKSwKKyAgICAoJ3NpZ2V2X25vdGlmeV9hdHRyaWJ1dGVzJywgUE9JTlRFUihwdGhyZWFkX2F0dHJfdCkpLAorXQorYXNzZXJ0IHNpemVvZihzaWdldmVudCkgPT0gMjAsIHNpemVvZihzaWdldmVudCkKK2Fzc2VydCBhbGlnbm1lbnQoc2lnZXZlbnQpID09IDQsIGFsaWdubWVudChzaWdldmVudCkKK2NsYXNzIF9fc2lnaW5mbyhTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3BpZF90ID0gX19kYXJ3aW5fcGlkX3QKK19fc2lnaW5mby5fZmllbGRzXyA9IFsKKyAgICAoJ3NpX3NpZ25vJywgY19pbnQpLAorICAgICgnc2lfZXJybm8nLCBjX2ludCksCisgICAgKCdzaV9jb2RlJywgY19pbnQpLAorICAgICgnc2lfcGlkJywgcGlkX3QpLAorICAgICgnc2lfdWlkJywgdWlkX3QpLAorICAgICgnc2lfc3RhdHVzJywgY19pbnQpLAorICAgICgnc2lfYWRkcicsIGNfdm9pZF9wKSwKKyAgICAoJ3NpX3ZhbHVlJywgc2lndmFsKSwKKyAgICAoJ3NpX2JhbmQnLCBjX2xvbmcpLAorICAgICgncGFkJywgY191bG9uZyAqIDcpLAorXQorYXNzZXJ0IHNpemVvZihfX3NpZ2luZm8pID09IDY0LCBzaXplb2YoX19zaWdpbmZvKQorYXNzZXJ0IGFsaWdubWVudChfX3NpZ2luZm8pID09IDQsIGFsaWdubWVudChfX3NpZ2luZm8pCitzaWdpbmZvX3QgPSBfX3NpZ2luZm8KK2NsYXNzIF9fc2lnYWN0aW9uX3UoVW5pb24pOgorICAgIHBhc3MKK19fc2lnYWN0aW9uX3UuX2ZpZWxkc18gPSBbCisgICAgKCdfX3NhX2hhbmRsZXInLCBDRlVOQ1RZUEUoTm9uZSwgY19pbnQpKSwKKyAgICAoJ19fc2Ffc2lnYWN0aW9uJywgQ0ZVTkNUWVBFKE5vbmUsIGNfaW50LCBQT0lOVEVSKF9fc2lnaW5mbyksIGNfdm9pZF9wKSksCitdCithc3NlcnQgc2l6ZW9mKF9fc2lnYWN0aW9uX3UpID09IDQsIHNpemVvZihfX3NpZ2FjdGlvbl91KQorYXNzZXJ0IGFsaWdubWVudChfX3NpZ2FjdGlvbl91KSA9PSA0LCBhbGlnbm1lbnQoX19zaWdhY3Rpb25fdSkKK2NsYXNzIF9fc2lnYWN0aW9uKFN0cnVjdHVyZSk6CisgICAgcGFzcworX19zaWdhY3Rpb24uX2ZpZWxkc18gPSBbCisgICAgKCdfX3NpZ2FjdGlvbl91JywgX19zaWdhY3Rpb25fdSksCisgICAgKCdzYV90cmFtcCcsIENGVU5DVFlQRShOb25lLCBjX3ZvaWRfcCwgY19pbnQsIGNfaW50LCBQT0lOVEVSKHNpZ2luZm9fdCksIGNfdm9pZF9wKSksCisgICAgKCdzYV9tYXNrJywgc2lnc2V0X3QpLAorICAgICgnc2FfZmxhZ3MnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKF9fc2lnYWN0aW9uKSA9PSAxNiwgc2l6ZW9mKF9fc2lnYWN0aW9uKQorYXNzZXJ0IGFsaWdubWVudChfX3NpZ2FjdGlvbikgPT0gNCwgYWxpZ25tZW50KF9fc2lnYWN0aW9uKQorY2xhc3Mgc2lnYWN0aW9uKFN0cnVjdHVyZSk6CisgICAgcGFzcworc2lnYWN0aW9uLl9maWVsZHNfID0gWworICAgICgnX19zaWdhY3Rpb25fdScsIF9fc2lnYWN0aW9uX3UpLAorICAgICgnc2FfbWFzaycsIHNpZ3NldF90KSwKKyAgICAoJ3NhX2ZsYWdzJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihzaWdhY3Rpb24pID09IDEyLCBzaXplb2Yoc2lnYWN0aW9uKQorYXNzZXJ0IGFsaWdubWVudChzaWdhY3Rpb24pID09IDQsIGFsaWdubWVudChzaWdhY3Rpb24pCitzaWdfdCA9IENGVU5DVFlQRShOb25lLCBjX2ludCkKK3N0YWNrX3QgPSBfX2Rhcndpbl9zdGFja190CitjbGFzcyBzaWd2ZWMoU3RydWN0dXJlKToKKyAgICBwYXNzCitzaWd2ZWMuX2ZpZWxkc18gPSBbCisgICAgKCdzdl9oYW5kbGVyJywgQ0ZVTkNUWVBFKE5vbmUsIGNfaW50KSksCisgICAgKCdzdl9tYXNrJywgY19pbnQpLAorICAgICgnc3ZfZmxhZ3MnLCBjX2ludCksCitdCithc3NlcnQgc2l6ZW9mKHNpZ3ZlYykgPT0gMTIsIHNpemVvZihzaWd2ZWMpCithc3NlcnQgYWxpZ25tZW50KHNpZ3ZlYykgPT0gNCwgYWxpZ25tZW50KHNpZ3ZlYykKK2NsYXNzIHNpZ3N0YWNrKFN0cnVjdHVyZSk6CisgICAgcGFzcworc2lnc3RhY2suX2ZpZWxkc18gPSBbCisgICAgKCdzc19zcCcsIFNUUklORyksCisgICAgKCdzc19vbnN0YWNrJywgY19pbnQpLAorXQorYXNzZXJ0IHNpemVvZihzaWdzdGFjaykgPT0gOCwgc2l6ZW9mKHNpZ3N0YWNrKQorYXNzZXJ0IGFsaWdubWVudChzaWdzdGFjaykgPT0gNCwgYWxpZ25tZW50KHNpZ3N0YWNrKQordV9jaGFyID0gY191Ynl0ZQordV9zaG9ydCA9IGNfdXNob3J0Cit1X2ludCA9IGNfdWludAordV9sb25nID0gY191bG9uZwordXNob3J0ID0gY191c2hvcnQKK3VpbnQgPSBjX3VpbnQKK3VfcXVhZF90ID0gdV9pbnQ2NF90CitxdWFkX3QgPSBpbnQ2NF90CitxYWRkcl90ID0gUE9JTlRFUihxdWFkX3QpCitjYWRkcl90ID0gU1RSSU5HCitkYWRkcl90ID0gaW50MzJfdAorZml4cHRfdCA9IHVfaW50MzJfdAorYmxrY250X3QgPSBfX2Rhcndpbl9ibGtjbnRfdAorYmxrc2l6ZV90ID0gX19kYXJ3aW5fYmxrc2l6ZV90CitnaWRfdCA9IF9fZGFyd2luX2dpZF90Citpbl9hZGRyX3QgPSBfX3VpbnQzMl90Citpbl9wb3J0X3QgPSBfX3VpbnQxNl90Citpbm9fdCA9IF9fZGFyd2luX2lub190CitrZXlfdCA9IF9faW50MzJfdAorbmxpbmtfdCA9IF9fdWludDE2X3QKK29mZl90ID0gX19kYXJ3aW5fb2ZmX3QKK3NlZ3N6X3QgPSBpbnQzMl90Citzd2Jsa190ID0gaW50MzJfdAorY2xvY2tfdCA9IF9fZGFyd2luX2Nsb2NrX3QKK3NzaXplX3QgPSBfX2Rhcndpbl9zc2l6ZV90Cit1c2Vjb25kc190ID0gX19kYXJ3aW5fdXNlY29uZHNfdAorc3VzZWNvbmRzX3QgPSBfX2Rhcndpbl9zdXNlY29uZHNfdAorZmRfbWFzayA9IF9faW50MzJfdAorY2xhc3MgZmRfc2V0KFN0cnVjdHVyZSk6CisgICAgcGFzcworZmRfc2V0Ll9maWVsZHNfID0gWworICAgICgnZmRzX2JpdHMnLCBfX2ludDMyX3QgKiAzMiksCitdCithc3NlcnQgc2l6ZW9mKGZkX3NldCkgPT0gMTI4LCBzaXplb2YoZmRfc2V0KQorYXNzZXJ0IGFsaWdubWVudChmZF9zZXQpID09IDQsIGFsaWdubWVudChmZF9zZXQpCitwdGhyZWFkX2NvbmRfdCA9IF9fZGFyd2luX3B0aHJlYWRfY29uZF90CitwdGhyZWFkX2NvbmRhdHRyX3QgPSBfX2Rhcndpbl9wdGhyZWFkX2NvbmRhdHRyX3QKK3B0aHJlYWRfbXV0ZXhfdCA9IF9fZGFyd2luX3B0aHJlYWRfbXV0ZXhfdAorcHRocmVhZF9tdXRleGF0dHJfdCA9IF9fZGFyd2luX3B0aHJlYWRfbXV0ZXhhdHRyX3QKK3B0aHJlYWRfb25jZV90ID0gX19kYXJ3aW5fcHRocmVhZF9vbmNlX3QKK3B0aHJlYWRfcndsb2NrX3QgPSBfX2Rhcndpbl9wdGhyZWFkX3J3bG9ja190CitwdGhyZWFkX3J3bG9ja2F0dHJfdCA9IF9fZGFyd2luX3B0aHJlYWRfcndsb2NrYXR0cl90CitwdGhyZWFkX3QgPSBfX2Rhcndpbl9wdGhyZWFkX3QKK3B0aHJlYWRfa2V5X3QgPSBfX2Rhcndpbl9wdGhyZWFkX2tleV90Citmc2Jsa2NudF90ID0gX19kYXJ3aW5fZnNibGtjbnRfdAorZnNmaWxjbnRfdCA9IF9fZGFyd2luX2ZzZmlsY250X3QKKworIyB2YWx1ZXMgZm9yIGVudW1lcmF0aW9uICdpZHR5cGVfdCcKK2lkdHlwZV90ID0gY19pbnQgIyBlbnVtCitpZF90ID0gX19kYXJ3aW5faWRfdAorY2xhc3Mgd2FpdChVbmlvbik6CisgICAgcGFzcworY2xhc3MgTjR3YWl0M0RPTExBUl8zRShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK040d2FpdDNET0xMQVJfM0UuX2ZpZWxkc18gPSBbCisgICAgKCd3X1Rlcm1zaWcnLCBjX3VpbnQsIDcpLAorICAgICgnd19Db3JlZHVtcCcsIGNfdWludCwgMSksCisgICAgKCd3X1JldGNvZGUnLCBjX3VpbnQsIDgpLAorICAgICgnd19GaWxsZXInLCBjX3VpbnQsIDE2KSwKK10KK2Fzc2VydCBzaXplb2YoTjR3YWl0M0RPTExBUl8zRSkgPT0gNCwgc2l6ZW9mKE40d2FpdDNET0xMQVJfM0UpCithc3NlcnQgYWxpZ25tZW50KE40d2FpdDNET0xMQVJfM0UpID09IDQsIGFsaWdubWVudChONHdhaXQzRE9MTEFSXzNFKQorY2xhc3MgTjR3YWl0M0RPTExBUl80RShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK040d2FpdDNET0xMQVJfNEUuX2ZpZWxkc18gPSBbCisgICAgKCd3X1N0b3B2YWwnLCBjX3VpbnQsIDgpLAorICAgICgnd19TdG9wc2lnJywgY191aW50LCA4KSwKKyAgICAoJ3dfRmlsbGVyJywgY191aW50LCAxNiksCitdCithc3NlcnQgc2l6ZW9mKE40d2FpdDNET0xMQVJfNEUpID09IDQsIHNpemVvZihONHdhaXQzRE9MTEFSXzRFKQorYXNzZXJ0IGFsaWdubWVudChONHdhaXQzRE9MTEFSXzRFKSA9PSA0LCBhbGlnbm1lbnQoTjR3YWl0M0RPTExBUl80RSkKK3dhaXQuX2ZpZWxkc18gPSBbCisgICAgKCd3X3N0YXR1cycsIGNfaW50KSwKKyAgICAoJ3dfVCcsIE40d2FpdDNET0xMQVJfM0UpLAorICAgICgnd19TJywgTjR3YWl0M0RPTExBUl80RSksCitdCithc3NlcnQgc2l6ZW9mKHdhaXQpID09IDQsIHNpemVvZih3YWl0KQorYXNzZXJ0IGFsaWdubWVudCh3YWl0KSA9PSA0LCBhbGlnbm1lbnQod2FpdCkKK2NsYXNzIHRpbWVzcGVjKFN0cnVjdHVyZSk6CisgICAgcGFzcwordGltZXNwZWMuX2ZpZWxkc18gPSBbCisgICAgKCd0dl9zZWMnLCB0aW1lX3QpLAorICAgICgndHZfbnNlYycsIGNfbG9uZyksCitdCithc3NlcnQgc2l6ZW9mKHRpbWVzcGVjKSA9PSA4LCBzaXplb2YodGltZXNwZWMpCithc3NlcnQgYWxpZ25tZW50KHRpbWVzcGVjKSA9PSA0LCBhbGlnbm1lbnQodGltZXNwZWMpCitjbGFzcyB0bShTdHJ1Y3R1cmUpOgorICAgIHBhc3MKK3RtLl9maWVsZHNfID0gWworICAgICgndG1fc2VjJywgY19pbnQpLAorICAgICgndG1fbWluJywgY19pbnQpLAorICAgICgndG1faG91cicsIGNfaW50KSwKKyAgICAoJ3RtX21kYXknLCBjX2ludCksCisgICAgKCd0bV9tb24nLCBjX2ludCksCisgICAgKCd0bV95ZWFyJywgY19pbnQpLAorICAgICgndG1fd2RheScsIGNfaW50KSwKKyAgICAoJ3RtX3lkYXknLCBjX2ludCksCisgICAgKCd0bV9pc2RzdCcsIGNfaW50KSwKKyAgICAoJ3RtX2dtdG9mZicsIGNfbG9uZyksCisgICAgKCd0bV96b25lJywgU1RSSU5HKSwKK10KK2Fzc2VydCBzaXplb2YodG0pID09IDQ0LCBzaXplb2YodG0pCithc3NlcnQgYWxpZ25tZW50KHRtKSA9PSA0LCBhbGlnbm1lbnQodG0pCitfX2dudWNfdmFfbGlzdCA9IFNUUklORworcHRyZGlmZl90ID0gY19pbnQKK2ludDhfdCA9IGNfYnl0ZQoraW50MTZfdCA9IGNfc2hvcnQKK3VpbnQ4X3QgPSBjX3VieXRlCit1aW50MTZfdCA9IGNfdXNob3J0Cit1aW50MzJfdCA9IGNfdWludAordWludDY0X3QgPSBjX3Vsb25nbG9uZworaW50X2xlYXN0OF90ID0gaW50OF90CitpbnRfbGVhc3QxNl90ID0gaW50MTZfdAoraW50X2xlYXN0MzJfdCA9IGludDMyX3QKK2ludF9sZWFzdDY0X3QgPSBpbnQ2NF90Cit1aW50X2xlYXN0OF90ID0gdWludDhfdAordWludF9sZWFzdDE2X3QgPSB1aW50MTZfdAordWludF9sZWFzdDMyX3QgPSB1aW50MzJfdAordWludF9sZWFzdDY0X3QgPSB1aW50NjRfdAoraW50X2Zhc3Q4X3QgPSBpbnQ4X3QKK2ludF9mYXN0MTZfdCA9IGludDE2X3QKK2ludF9mYXN0MzJfdCA9IGludDMyX3QKK2ludF9mYXN0NjRfdCA9IGludDY0X3QKK3VpbnRfZmFzdDhfdCA9IHVpbnQ4X3QKK3VpbnRfZmFzdDE2X3QgPSB1aW50MTZfdAordWludF9mYXN0MzJfdCA9IHVpbnQzMl90Cit1aW50X2Zhc3Q2NF90ID0gdWludDY0X3QKK2ludHB0cl90ID0gY19sb25nCit1aW50cHRyX3QgPSBjX3Vsb25nCitpbnRtYXhfdCA9IGNfbG9uZ2xvbmcKK3VpbnRtYXhfdCA9IGNfdWxvbmdsb25nCitfX2FsbF9fID0gWydFTkdJTkUnLCAncGtjczdfZW5jX2NvbnRlbnRfc3QnLCAnX19pbnQxNl90JywKKyAgICAgICAgICAgJ1g1MDlfUkVWT0tFRCcsICdTU0xfQ1RYJywgJ1VJVF9CT09MRUFOJywKKyAgICAgICAgICAgJ19fZGFyd2luX3RpbWVfdCcsICd1Y29udGV4dDY0X3QnLCAnaW50X2Zhc3QzMl90JywKKyAgICAgICAgICAgJ3BlbV9jdHhfc3QnLCAndWludDhfdCcsICdmcG9zX3QnLCAnWDUwOScsICdDT01QX0NUWCcsCisgICAgICAgICAgICd0bScsICdOMTBwZW1fY3R4X3N0NERPTExBUl8xN0UnLCAnc3dibGtfdCcsCisgICAgICAgICAgICdBU04xX1RFTVBMQVRFJywgJ19fZGFyd2luX3B0aHJlYWRfdCcsICdmaXhwdF90JywKKyAgICAgICAgICAgJ0JJT19NRVRIT0QnLCAnQVNOMV9QUklOVEFCTEVTVFJJTkcnLCAnRVZQX0VOQ09ERV9DVFgnLAorICAgICAgICAgICAnZGhfbWV0aG9kJywgJ2Jpb19mX2J1ZmZlcl9jdHhfc3RydWN0JywgJ2luX3BvcnRfdCcsCisgICAgICAgICAgICdYNTA5X1NJRycsICdfX2Rhcndpbl9zc2l6ZV90JywgJ19fZGFyd2luX3NpZ3NldF90JywKKyAgICAgICAgICAgJ3dhaXQnLCAndWludF9mYXN0MTZfdCcsICdOMTJhc24xX3R5cGVfc3Q0RE9MTEFSXzExRScsCisgICAgICAgICAgICd1aW50X2xlYXN0OF90JywgJ3B0aHJlYWRfcndsb2NrX3QnLCAnQVNOMV9JQTVTVFJJTkcnLAorICAgICAgICAgICAnZnNmaWxjbnRfdCcsICd1Y29udGV4dCcsICdfX3VpbnQ2NF90JywgJ3RpbWVzcGVjJywKKyAgICAgICAgICAgJ3g1MDlfY2luZl9zdCcsICdDT01QX01FVEhPRCcsICdNRDVfQ1RYJywgJ2J1Zl9tZW1fc3QnLAorICAgICAgICAgICAnQVNOMV9FTkNPRElOR19zdCcsICdQQkVQQVJBTScsICdYNTA5X05BTUVfRU5UUlknLAorICAgICAgICAgICAnX19kYXJ3aW5fdmFfbGlzdCcsICd1Y29udGV4dF90JywgJ2xoYXNoX3N0JywKKyAgICAgICAgICAgJ040d2FpdDNET0xMQVJfNEUnLCAnX19kYXJ3aW5fdXVpZF90JywKKyAgICAgICAgICAgJ19vc3NsX29sZF9kZXNfa3Nfc3RydWN0JywgJ2lkX3QnLCAnQVNOMV9CSVRfU1RSSU5HJywKKyAgICAgICAgICAgJ3ZhX2xpc3QnLCAnX19kYXJ3aW5fd2NoYXJfdCcsICdwdGhyZWFkX2tleV90JywKKyAgICAgICAgICAgJ3BrY3M3X3NpZ25lcl9pbmZvX3N0JywgJ0FTTjFfTUVUSE9EJywgJ0RTQV9TSUcnLCAnRFNBJywKKyAgICAgICAgICAgJ1VJVF9OT05FJywgJ3B0aHJlYWRfdCcsICdfX2Rhcndpbl91c2Vjb25kc190JywKKyAgICAgICAgICAgJ3VpbnRfZmFzdDhfdCcsICdVSV9TVFJJTkcnLCAnREVTX2NibG9jaycsCisgICAgICAgICAgICdfX2Rhcndpbl9tY29udGV4dDY0X3QnLCAncmxpbV90JywgJ1BFTV9FbmNvZGVfU2VhbF9zdCcsCisgICAgICAgICAgICdTSEFzdGF0ZV9zdCcsICd1X3F1YWRfdCcsICdvcGVuc3NsX2ZwdHInLAorICAgICAgICAgICAnX29wYXF1ZV9wdGhyZWFkX3J3bG9ja2F0dHJfdCcsCisgICAgICAgICAgICdOMTh4NTA5X2F0dHJpYnV0ZXNfc3Q0RE9MTEFSXzEzRScsCisgICAgICAgICAgICdfX2Rhcndpbl9wdGhyZWFkX3J3bG9ja190JywgJ2RhZGRyX3QnLCAndWlfc3RyaW5nX3N0JywKKyAgICAgICAgICAgJ3g1MDlfZmlsZV9zdCcsICdYNTA5X3JlcV9pbmZvX3N0JywgJ2ludF9sZWFzdDY0X3QnLAorICAgICAgICAgICAnZXZwX0VuY29kZV9DdHhfc3QnLCAnWDUwOV9PQkpFQ1RTJywgJ0NSWVBUT19FWF9EQVRBJywKKyAgICAgICAgICAgJ19faW50OF90JywgJ0FVVEhPUklUWV9LRVlJRF9zdCcsICdfb3BhcXVlX3B0aHJlYWRfYXR0cl90JywKKyAgICAgICAgICAgJ3NpZ3N0YWNrJywgJ0VWUF9DSVBIRVJfQ1RYJywgJ1g1MDlfZXh0ZW5zaW9uX3N0JywgJ3BpZF90JywKKyAgICAgICAgICAgJ1JTQV9NRVRIT0QnLCAnUEVNX1VTRVInLCAncGVtX3JlY2lwX3N0JywgJ2Vudl9tZF9jdHhfc3QnLAorICAgICAgICAgICAncmM1X2tleV9zdCcsICd1aV9zdCcsICdYNTA5X1BVQktFWScsICd1X2ludDhfdCcsCisgICAgICAgICAgICdBU04xX0lURU1fc3QnLCAncGtjczdfcmVjaXBfaW5mb19zdCcsICdzc2wyX3N0YXRlX3N0JywKKyAgICAgICAgICAgJ29mZl90JywgJ04xMHNzbF9jdHhfc3Q0RE9MTEFSXzE4RScsICdjcnlwdG9fZXhfZGF0YV9zdCcsCisgICAgICAgICAgICd1aV9tZXRob2Rfc3QnLCAnX19kYXJ3aW5fcHRocmVhZF9yd2xvY2thdHRyX3QnLAorICAgICAgICAgICAnQ1JZUFRPX0VYX2R1cCcsICdfX2Rhcndpbl9pbm9fdCcsICdfX3NGSUxFJywKKyAgICAgICAgICAgJ09TVW5rbm93bkJ5dGVPcmRlcicsICdCTl9NT05UX0NUWCcsICdBU04xX05VTEwnLCAndGltZV90JywKKyAgICAgICAgICAgJ0NSWVBUT19FWF9uZXcnLCAnYXNuMV90eXBlX3N0JywgJ0NSWVBUT19FWF9EQVRBX0ZVTkNTJywKKyAgICAgICAgICAgJ3VzZXJfdGltZV90JywgJ0JJR05VTScsICdwdGhyZWFkX3J3bG9ja2F0dHJfdCcsCisgICAgICAgICAgICdBU04xX1ZBTFVFX3N0JywgJ0RIX01FVEhPRCcsICdfX2Rhcndpbl9vZmZfdCcsCisgICAgICAgICAgICdfb3BhcXVlX3B0aHJlYWRfdCcsICdibl9ibGluZGluZ19zdCcsICdSU0EnLCAnc3NpemVfdCcsCisgICAgICAgICAgICdtY29udGV4dDY0X3QnLCAndXNlcl9sb25nX3QnLCAnZnNibGtjbnRfdCcsICdjZXJ0X3N0JywKKyAgICAgICAgICAgJ19fZGFyd2luX3B0aHJlYWRfY29uZGF0dHJfdCcsICdYNTA5X1BLRVknLAorICAgICAgICAgICAnX19kYXJ3aW5faWRfdCcsICdfX2Rhcndpbl9ubF9pdGVtJywgJ1NTTDJfU1RBVEUnLCAnRklMRScsCisgICAgICAgICAgICdwdGhyZWFkX211dGV4YXR0cl90JywgJ3NpemVfdCcsCisgICAgICAgICAgICdfb3NzbF9vbGRfZGVzX2tleV9zY2hlZHVsZScsICdwa2NzN19pc3N1ZXJfYW5kX3NlcmlhbF9zdCcsCisgICAgICAgICAgICdzaWd2YWwnLCAnQ1JZUFRPX01FTV9MRUFLX0NCJywgJ1g1MDlfTkFNRScsICdibGtjbnRfdCcsCisgICAgICAgICAgICd1aW50X2xlYXN0MTZfdCcsICdfX2Rhcndpbl9kZXZfdCcsICdldnBfY2lwaGVyX2luZm9fc3QnLAorICAgICAgICAgICAnQk5fQkxJTkRJTkcnLCAnc3NsM19zdGF0ZV9zdCcsICd1aW50X2xlYXN0NjRfdCcsCisgICAgICAgICAgICd1c2VyX2FkZHJfdCcsICdERVNfa2V5X3NjaGVkdWxlJywgJ1JJUEVNRDE2MF9DVFgnLAorICAgICAgICAgICAndV9jaGFyJywgJ1g1MDlfYWxnb3Jfc3QnLCAndWlkX3QnLCAnc2Vzc19jZXJ0X3N0JywKKyAgICAgICAgICAgJ3VfaW50NjRfdCcsICd1X2ludDE2X3QnLCAnc2lnc2V0X3QnLCAnX19kYXJ3aW5fcHRyZGlmZl90JywKKyAgICAgICAgICAgJ0FTTjFfQ1RYJywgJ1NUQUNLJywgJ19faW50MzJfdCcsICdVSV9NRVRIT0QnLAorICAgICAgICAgICAnTkVUU0NBUEVfU1BLSScsICdVSVRfUFJPTVBUJywgJ3N0X0NSWVBUT19FWF9EQVRBX0lNUEwnLAorICAgICAgICAgICAnY2FzdF9rZXlfc3QnLCAnWDUwOV9IQVNIX0RJUl9DVFgnLCAnc2lnZXZlbnQnLAorICAgICAgICAgICAndXNlcl9zc2l6ZV90JywgJ2Nsb2NrX3QnLCAnYWVzX2tleV9zdCcsCisgICAgICAgICAgICdfX2Rhcndpbl9zb2NrbGVuX3QnLCAnX19kYXJ3aW5faW50cHRyX3QnLCAnaW50X2Zhc3Q2NF90JywKKyAgICAgICAgICAgJ2FzbjFfc3RyaW5nX3RhYmxlX3N0JywgJ3VpbnRfZmFzdDMyX3QnLAorICAgICAgICAgICAnQVNOMV9WSVNJQkxFU1RSSU5HJywgJ0RTQV9TSUdfc3QnLCAnb2JqX25hbWVfc3QnLAorICAgICAgICAgICAnWDUwOV9MT09LVVBfTUVUSE9EJywgJ3VfaW50MzJfdCcsICdFVlBfQ0lQSEVSX0lORk8nLAorICAgICAgICAgICAnX19nbnVjX3ZhX2xpc3QnLCAnQUVTX0tFWScsICdQS0NTN19JU1NVRVJfQU5EX1NFUklBTCcsCisgICAgICAgICAgICdCTl9DVFgnLCAnX19kYXJ3aW5fYmxrY250X3QnLCAna2V5X3QnLCAnU0hBX0NUWCcsCisgICAgICAgICAgICdwa2NzN19zaWduZWRfc3QnLCAnU1NMJywgJ04xMHBlbV9jdHhfc3Q0RE9MTEFSXzE2RScsCisgICAgICAgICAgICdwdGhyZWFkX2F0dHJfdCcsICdFVlBfTUQnLCAndWludCcsICdBU04xX0JPT0xFQU4nLAorICAgICAgICAgICAnaW5vX3QnLCAnX19kYXJ3aW5fY2xvY2tfdCcsICdBU04xX09DVEVUX1NUUklORycsCisgICAgICAgICAgICdhc24xX2N0eF9zdCcsICdCSU9fRl9CVUZGRVJfQ1RYJywgJ2JuX21vbnRfY3R4X3N0JywKKyAgICAgICAgICAgJ1g1MDlfUkVRX0lORk8nLCAnUEVNX0NUWCcsICdzaWd2ZWMnLAorICAgICAgICAgICAnX19kYXJ3aW5fcHRocmVhZF9tdXRleGF0dHJfdCcsICd4NTA5X2F0dHJpYnV0ZXNfc3QnLAorICAgICAgICAgICAnc3RhY2tfdCcsICdfX2Rhcndpbl9tb2RlX3QnLCAnX19tYnN0YXRlX3QnLAorICAgICAgICAgICAnYXNuMV9vYmplY3Rfc3QnLCAnQVNOMV9FTkNPRElORycsICdfX3VpbnQ4X3QnLAorICAgICAgICAgICAnTEhBU0hfTk9ERScsICdQS0NTN19TSUdORVJfSU5GTycsICdhc24xX21ldGhvZF9zdCcsCisgICAgICAgICAgICdzdGFja19zdCcsICdiaW9faW5mb19jYicsICdkaXZfdCcsICdVSVRfVkVSSUZZJywKKyAgICAgICAgICAgJ1BCRVBBUkFNX3N0JywgJ040d2FpdDNET0xMQVJfM0UnLCAncXVhZF90JywgJ19fc2lnaW5mbycsCisgICAgICAgICAgICdfX2Rhcndpbl9tYnN0YXRlX3QnLCAncnNhX3N0JywgJ0FTTjFfVU5JVkVSU0FMU1RSSU5HJywKKyAgICAgICAgICAgJ3VpbnQ2NF90JywgJ3NzbF9jb21wX3N0JywgJ1g1MDlfT0JKRUNUJywgJ3B0aHJlYWRfY29uZF90JywKKyAgICAgICAgICAgJ0RIJywgJ19fZGFyd2luX3djdHlwZV90JywgJ1BLQ1M3X0VOVkVMT1BFJywgJ0FTTjFfVExDX3N0JywKKyAgICAgICAgICAgJ3NpZ19hdG9taWNfdCcsICdCSU8nLCAnbmxpbmtfdCcsICdCVUZfTUVNJywgJ1NTTDNfUkVDT1JEJywKKyAgICAgICAgICAgJ2Jpb19tZXRob2Rfc3QnLCAndGltZXZhbCcsICdVSV9zdHJpbmdfdHlwZXMnLCAnQklPX2R1bW15JywKKyAgICAgICAgICAgJ3NzbF9jdHhfc3QnLCAnTkVUU0NBUEVfQ0VSVF9TRVFVRU5DRScsCisgICAgICAgICAgICdCSVRfU1RSSU5HX0JJVE5BTUVfc3QnLCAnX19kYXJ3aW5fcHRocmVhZF9hdHRyX3QnLAorICAgICAgICAgICAnaW50OF90JywgJ19fZGFyd2luX3dpbnRfdCcsICdPQkpfTkFNRScsCisgICAgICAgICAgICdQS0NTOF9QUklWX0tFWV9JTkZPJywgJ1BCRTJQQVJBTV9zdCcsCisgICAgICAgICAgICdMSEFTSF9ET0FMTF9GTl9UWVBFJywgJ3g1MDlfc3QnLCAnWDUwOV9WQUwnLCAnZGV2X3QnLAorICAgICAgICAgICAnQVNOMV9URU1QTEFURV9zdCcsICdNRDVzdGF0ZV9zdCcsICdfX3VpbnQxNl90JywKKyAgICAgICAgICAgJ0xIQVNIX0RPQUxMX0FSR19GTl9UWVBFJywgJ21kYzJfY3R4X3N0JywgJ1NTTDNfU1RBVEUnLAorICAgICAgICAgICAnc3NsM19idWZmZXJfc3QnLCAnQVNOMV9JVEVNX0VYUCcsCisgICAgICAgICAgICdfb3BhcXVlX3B0aHJlYWRfY29uZGF0dHJfdCcsICdtb2RlX3QnLCAnQVNOMV9WQUxVRScsCisgICAgICAgICAgICdxYWRkcl90JywgJ19fZGFyd2luX2dpZF90JywgJ0VWUF9QS0VZJywgJ0NSWVBUT19FWF9mcmVlJywKKyAgICAgICAgICAgJ19vc3NsX29sZF9kZXNfY2Jsb2NrJywgJ1g1MDlfSU5GTycsICdhc24xX3N0cmluZ19zdCcsCisgICAgICAgICAgICdpbnRwdHJfdCcsICdVSVRfSU5GTycsICdpbnRfZmFzdDhfdCcsICdzaWdhbHRzdGFjaycsCisgICAgICAgICAgICdlbnZfbWRfc3QnLCAnTEhBU0gnLCAnX19kYXJ3aW5fdWNvbnRleHRfdCcsCisgICAgICAgICAgICdQS0NTN19TSUdOX0VOVkVMT1BFJywgJ19fZGFyd2luX21jb250ZXh0X3QnLCAnY3RfcnVuZV90JywKKyAgICAgICAgICAgJ01EMl9DVFgnLCAncHRocmVhZF9vbmNlX3QnLCAnU1NMM19CVUZGRVInLCAnZmRfbWFzaycsCisgICAgICAgICAgICdBU04xX1RZUEUnLCAnUEtDUzdfU0lHTkVEJywgJ3NzbDNfcmVjb3JkX3N0JywgJ0JGX0tFWScsCisgICAgICAgICAgICdNRDRzdGF0ZV9zdCcsICdNRDRfQ1RYJywgJ2ludDE2X3QnLCAnU1NMX0NJUEhFUicsCisgICAgICAgICAgICdydW5lX3QnLCAnWDUwOV9UUlVTVCcsICdzaWdpbmZvX3QnLCAnWDUwOV9TVE9SRScsCisgICAgICAgICAgICdfX3NidWYnLCAnWDUwOV9TVE9SRV9DVFgnLCAnX19kYXJ3aW5fYmxrc2l6ZV90JywgJ2xkaXZfdCcsCisgICAgICAgICAgICdBU04xX1RJTUUnLCAnU1NMX01FVEhPRCcsICdYNTA5X0xPT0tVUCcsCisgICAgICAgICAgICdOZXRzY2FwZV9zcGtpX3N0JywgJ1BfUElEJywgJ3NpZ2FjdGlvbicsICdzaWdfdCcsCisgICAgICAgICAgICdob3N0ZW50JywgJ3g1MDlfY2VydF9hdXhfc3QnLCAnX29wYXF1ZV9wdGhyZWFkX2NvbmRfdCcsCisgICAgICAgICAgICdzZWdzel90JywgJ3VzaG9ydCcsICdfX2Rhcndpbl9jdF9ydW5lX3QnLCAnZmRfc2V0JywKKyAgICAgICAgICAgJ0JOX1JFQ1BfQ1RYJywgJ3g1MDlfbG9va3VwX3N0JywgJ3VpbnQxNl90JywgJ3BrY3M3X3N0JywKKyAgICAgICAgICAgJ2FzbjFfaGVhZGVyX3N0JywgJ19fZGFyd2luX3B0aHJlYWRfa2V5X3QnLAorICAgICAgICAgICAneDUwOV90cnVzdF9zdCcsICdfX2Rhcndpbl9wdGhyZWFkX2hhbmRsZXJfcmVjJywgJ2ludDMyX3QnLAorICAgICAgICAgICAnWDUwOV9DUkxfSU5GTycsICdOMTFldnBfcGtleV9zdDRET0xMQVJfMTJFJywgJ01EQzJfQ1RYJywKKyAgICAgICAgICAgJ04yM19vc3NsX29sZF9kZXNfa3Nfc3RydWN0NERPTExBUl8xMEUnLCAnQVNOMV9IRUFERVInLAorICAgICAgICAgICAnWDUwOV9jcmxfaW5mb19zdCcsICdMSEFTSF9IQVNIX0ZOX1RZUEUnLAorICAgICAgICAgICAnX29wYXF1ZV9wdGhyZWFkX211dGV4YXR0cl90JywgJ3NzbF9zdCcsCisgICAgICAgICAgICdOOHBrY3M3X3N0NERPTExBUl8xNUUnLCAnZXZwX3BrZXlfc3QnLAorICAgICAgICAgICAncGtjczdfc2lnbmVkYW5kZW52ZWxvcGVkX3N0JywgJ19fZGFyd2luX21hY2hfcG9ydF90JywKKyAgICAgICAgICAgJ0VWUF9QQkVfS0VZR0VOJywgJ19vcGFxdWVfcHRocmVhZF9tdXRleF90JywKKyAgICAgICAgICAgJ0FTTjFfVVRDVElNRScsICdtY29udGV4dCcsICdjcnlwdG9fZXhfZGF0YV9mdW5jX3N0JywKKyAgICAgICAgICAgJ3VfbG9uZycsICdQQktERjJQQVJBTV9zdCcsICdyYzRfa2V5X3N0JywgJ0RTQV9NRVRIT0QnLAorICAgICAgICAgICAnRVZQX0NJUEhFUicsICdCSVRfU1RSSU5HX0JJVE5BTUUnLCAnUEtDUzdfUkVDSVBfSU5GTycsCisgICAgICAgICAgICdzc2wzX2VuY19tZXRob2QnLCAnWDUwOV9DRVJUX0FVWCcsICd1aW50bWF4X3QnLAorICAgICAgICAgICAnaW50X2Zhc3QxNl90JywgJ1JDNV8zMl9LRVknLCAndWNvbnRleHQ2NCcsICdBU04xX0lOVEVHRVInLAorICAgICAgICAgICAndV9zaG9ydCcsICdOMTR4NTA5X29iamVjdF9zdDRET0xMQVJfMTRFJywgJ21jb250ZXh0NjQnLAorICAgICAgICAgICAnWDUwOV9zaWdfc3QnLCAnQVNOMV9HRU5FUkFMU1RSSU5HJywgJ1BLQ1M3JywgJ19fc0ZJTEVYJywKKyAgICAgICAgICAgJ1g1MDlfbmFtZV9lbnRyeV9zdCcsICdzc2xfc2Vzc2lvbl9zdCcsICdjYWRkcl90JywKKyAgICAgICAgICAgJ2JpZ251bV9zdCcsICdYNTA5X0NJTkYnLCAnX19kYXJ3aW5fcHRocmVhZF9jb25kX3QnLAorICAgICAgICAgICAnQVNOMV9UTEMnLCAnUEtDUzdfRU5DUllQVCcsICdORVRTQ0FQRV9TUEtBQycsCisgICAgICAgICAgICdOZXRzY2FwZV9zcGthY19zdCcsICdpZHR5cGVfdCcsICdVSVRfRVJST1InLAorICAgICAgICAgICAndWludF9mYXN0NjRfdCcsICdpbl9hZGRyX3QnLCAncHRocmVhZF9tdXRleF90JywKKyAgICAgICAgICAgJ19faW50NjRfdCcsICdBU04xX0JNUFNUUklORycsICd1aW50MzJfdCcsCisgICAgICAgICAgICdQRU1fRU5DT0RFX1NFQUxfQ1RYJywgJ3N1c2Vjb25kc190JywgJ0FTTjFfT0JKRUNUJywKKyAgICAgICAgICAgJ1g1MDlfdmFsX3N0JywgJ3ByaXZhdGVfa2V5X3N0JywgJ0NSWVBUT19keW5sb2NrJywKKyAgICAgICAgICAgJ1g1MDlfb2JqZWN0c19zdCcsICdDUllQVE9fRVhfREFUQV9JTVBMJywKKyAgICAgICAgICAgJ3B0aHJlYWRfY29uZGF0dHJfdCcsICdQS0NTN19ESUdFU1QnLCAndWludF9sZWFzdDMyX3QnLAorICAgICAgICAgICAnQVNOMV9TVFJJTkcnLCAnX191aW50MzJfdCcsICdQX1BHSUQnLCAncnNhX21ldGhfc3QnLAorICAgICAgICAgICAnWDUwOV9jcmxfc3QnLCAnUkMyX0tFWScsICdfX2Rhcndpbl9mc2ZpbGNudF90JywKKyAgICAgICAgICAgJ1g1MDlfcmV2b2tlZF9zdCcsICdQQkUyUEFSQU0nLCAnYmxrc2l6ZV90JywKKyAgICAgICAgICAgJ05ldHNjYXBlX2NlcnRpZmljYXRlX3NlcXVlbmNlJywgJ3NzbF9jaXBoZXJfc3QnLAorICAgICAgICAgICAnYmlnbnVtX2N0eCcsICdyZWdpc3Rlcl90JywgJ0FTTjFfVVRGOFNUUklORycsCisgICAgICAgICAgICdwa2NzN19lbmNyeXB0ZWRfc3QnLCAnUkM0X0tFWScsICdfX2Rhcndpbl91Y29udGV4dDY0X3QnLAorICAgICAgICAgICAnTjEzc3NsMl9zdGF0ZV9zdDRET0xMQVJfMTlFJywgJ2JuX3JlY3BfY3R4X3N0JywKKyAgICAgICAgICAgJ0NBU1RfS0VZJywgJ1g1MDlfQVRUUklCVVRFJywgJ19fZGFyd2luX3N1c2Vjb25kc190JywKKyAgICAgICAgICAgJ19fc2lnYWN0aW9uJywgJ3VzZXJfdWxvbmdfdCcsICdzeXNjYWxsX2FyZ190JywKKyAgICAgICAgICAgJ2V2cF9jaXBoZXJfY3R4X3N0JywgJ1g1MDlfQUxHT1InLCAnbWNvbnRleHRfdCcsCisgICAgICAgICAgICdjb25zdF9ERVNfY2Jsb2NrJywgJ19fZGFyd2luX2ZzYmxrY250X3QnLCAnZHNhX3N0JywKKyAgICAgICAgICAgJ2ludF9sZWFzdDhfdCcsICdNRDJzdGF0ZV9zdCcsICdYNTA5X0VYVEVOU0lPTicsCisgICAgICAgICAgICdHRU5fU0VTU0lPTl9DQicsICdpbnRfbGVhc3QxNl90JywgJ19fZGFyd2luX3djdHJhbnNfdCcsCisgICAgICAgICAgICdQQktERjJQQVJBTScsICd4NTA5X2xvb2t1cF9tZXRob2Rfc3QnLCAncGVtX3Bhc3N3b3JkX2NiJywKKyAgICAgICAgICAgJ1g1MDlfaW5mb19zdCcsICd4NTA5X3N0b3JlX3N0JywgJ19fZGFyd2luX25hdHVyYWxfdCcsCisgICAgICAgICAgICdYNTA5X3B1YmtleV9zdCcsICdwa2NzN19kaWdlc3Rfc3QnLCAnX19kYXJ3aW5fc2l6ZV90JywKKyAgICAgICAgICAgJ0FTTjFfU1RSSU5HX1RBQkxFJywgJ09TTGl0dGxlRW5kaWFuJywgJ1JJUEVNRDE2MHN0YXRlX3N0JywKKyAgICAgICAgICAgJ3BrY3M3X2VudmVsb3BlZF9zdCcsICdVSScsICdwdHJkaWZmX3QnLCAnWDUwOV9SRVEnLAorICAgICAgICAgICAnQ1JZUFRPX2R5bmxvY2tfdmFsdWUnLCAnWDUwOV9yZXFfc3QnLCAneDUwOV9zdG9yZV9jdHhfc3QnLAorICAgICAgICAgICAnTjEzc3NsM19zdGF0ZV9zdDRET0xMQVJfMjBFJywgJ2xoYXNoX25vZGVfc3QnLAorICAgICAgICAgICAnX19kYXJ3aW5fcHRocmVhZF9tdXRleF90JywgJ0xIQVNIX0NPTVBfRk5fVFlQRScsCisgICAgICAgICAgICdfX2Rhcndpbl9ydW5lX3QnLCAncmxpbWl0JywgJ19fZGFyd2luX3B0aHJlYWRfb25jZV90JywKKyAgICAgICAgICAgJ09TQmlnRW5kaWFuJywgJ3VpbnRwdHJfdCcsICdfX2Rhcndpbl91aWRfdCcsICd1X2ludCcsCisgICAgICAgICAgICdBU04xX1Q2MVNUUklORycsICdnaWRfdCcsICdzc2xfbWV0aG9kX3N0JywgJ0FTTjFfSVRFTScsCisgICAgICAgICAgICdBU04xX0VOVU1FUkFURUQnLCAnX29wYXF1ZV9wdGhyZWFkX3J3bG9ja190JywKKyAgICAgICAgICAgJ3BrY3M4X3ByaXZfa2V5X2luZm9fc3QnLCAnaW50bWF4X3QnLCAnc2lnY29udGV4dCcsCisgICAgICAgICAgICdYNTA5X0NSTCcsICdyYzJfa2V5X3N0JywgJ2VuZ2luZV9zdCcsICd4NTA5X29iamVjdF9zdCcsCisgICAgICAgICAgICdfb3BhcXVlX3B0aHJlYWRfb25jZV90JywgJ0RFU19rcycsICdTU0xfQ09NUCcsCisgICAgICAgICAgICdkc2FfbWV0aG9kJywgJ2ludDY0X3QnLCAnYmlvX3N0JywgJ2JmX2tleV9zdCcsCisgICAgICAgICAgICdBU04xX0dFTkVSQUxJWkVEVElNRScsICdQS0NTN19FTkNfQ09OVEVOVCcsCisgICAgICAgICAgICdfX2Rhcndpbl9waWRfdCcsICdsbGRpdl90JywgJ2NvbXBfbWV0aG9kX3N0JywKKyAgICAgICAgICAgJ0VWUF9NRF9DVFgnLCAnZXZwX2NpcGhlcl9zdCcsICdYNTA5X25hbWVfc3QnLAorICAgICAgICAgICAneDUwOV9oYXNoX2Rpcl9zdCcsICdfX2Rhcndpbl9tYWNoX3BvcnRfbmFtZV90JywKKyAgICAgICAgICAgJ3VzZWNvbmRzX3QnLCAndXNlcl9zaXplX3QnLCAnU1NMX1NFU1NJT04nLCAncnVzYWdlJywKKyAgICAgICAgICAgJ3NzbF9jcm9ja19zdCcsICdpbnRfbGVhc3QzMl90JywgJ19fc2lnYWN0aW9uX3UnLCAnZGhfc3QnLAorICAgICAgICAgICAnUF9BTEwnLCAnX19kYXJ3aW5fc3RhY2tfdCcsICdONkRFU19rczNET0xMQVJfOUUnLAorICAgICAgICAgICAnY29tcF9jdHhfc3QnLCAnWDUwOV9DRVJUX0ZJTEVfQ1RYJ10KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL3B5Ml90ZXN0X2dyYW1tYXIucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9weTJfdGVzdF9ncmFtbWFyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTQxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvZGF0YS9weTJfdGVzdF9ncmFtbWFyLnB5CkBAIC0wLDAgKzEsOTc0IEBACisjIFB5dGhvbiB0ZXN0IHNldCAtLSBwYXJ0IDEsIGdyYW1tYXIuCisjIFRoaXMganVzdCB0ZXN0cyB3aGV0aGVyIHRoZSBwYXJzZXIgYWNjZXB0cyB0aGVtIGFsbC4KKworIyBOT1RFOiBXaGVuIHlvdSBydW4gdGhpcyB0ZXN0IGFzIGEgc2NyaXB0IGZyb20gdGhlIGNvbW1hbmQgbGluZSwgeW91CisjIGdldCB3YXJuaW5ncyBhYm91dCBjZXJ0YWluIGhleC9vY3QgY29uc3RhbnRzLiAgU2luY2UgdGhvc2UgYXJlCisjIGlzc3VlZCBieSB0aGUgcGFyc2VyLCB5b3UgY2FuJ3Qgc3VwcHJlc3MgdGhlbSBieSBhZGRpbmcgYQorIyBmaWx0ZXJ3YXJuaW5ncygpIGNhbGwgdG8gdGhpcyBtb2R1bGUuICBUaGVyZWZvcmUsIHRvIHNodXQgdXAgdGhlCisjIHJlZ3Jlc3Npb24gdGVzdCwgdGhlIGZpbHRlcndhcm5pbmdzKCkgY2FsbCBoYXMgYmVlbiBhZGRlZCB0bworIyByZWdydGVzdC5weS4KKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19zeW50YXhfZXJyb3IKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworIyB0ZXN0aW5nIGltcG9ydCAqCitmcm9tIHN5cyBpbXBvcnQgKgorCitjbGFzcyBUb2tlblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0QmFja3NsYXNoKHNlbGYpOgorICAgICAgICAjIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjoKKyAgICAgICAgeCA9IDEgXAorICAgICAgICArIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMiwgJ2JhY2tzbGFzaCBmb3IgbGluZSBjb250aW51YXRpb24nKQorCisgICAgICAgICMgQmFja3NsYXNoIGRvZXMgbm90IG1lYW5zIGNvbnRpbnVhdGlvbiBpbiBjb21tZW50cyA6XAorICAgICAgICB4ID0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCAwLCAnYmFja3NsYXNoIGVuZGluZyBjb21tZW50JykKKworICAgIGRlZiB0ZXN0UGxhaW5JbnRlZ2VycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMHhmZiwgMjU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygwMzc3LCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIDAxNzc3Nzc3Nzc3NykKKyAgICAgICAgIyAiMHgiIGlzIG5vdCBhIHZhbGlkIGxpdGVyYWwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICIweCIpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBtYXhpbnQKKyAgICAgICAgaWYgbWF4aW50ID09IDIxNDc0ODM2NDc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscygtMjE0NzQ4MzY0Ny0xLCAtMDIwMDAwMDAwMDAwKQorICAgICAgICAgICAgIyBYWFggLTIxNDc0ODM2NDgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwMzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDB4ZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgZm9yIHMgaW4gJzIxNDc0ODM2NDgnLCAnMDQwMDAwMDAwMDAwJywgJzB4MTAwMDAwMDAwJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQorICAgICAgICBlbGlmIG1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSwgLTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgZm9yIHMgaW4gJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCAnMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCBcCisgICAgICAgICAgICAgICAgICAgICAnMHgxMDAwMDAwMDAwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnV2VpcmQgbWF4aW50IHZhbHVlICVyJyAlIG1heGludCkKKworICAgIGRlZiB0ZXN0TG9uZ0ludGVnZXJzKHNlbGYpOgorICAgICAgICB4ID0gMEwKKyAgICAgICAgeCA9IDBsCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmZmZMCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmZmZsCisgICAgICAgIHggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdMCisgICAgICAgIHggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdsCisgICAgICAgIHggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBMCisgICAgICAgIHggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBsCisKKyAgICBkZWYgdGVzdEZsb2F0cyhzZWxmKToKKyAgICAgICAgeCA9IDMuMTQKKyAgICAgICAgeCA9IDMxNC4KKyAgICAgICAgeCA9IDAuMzE0CisgICAgICAgICMgWFhYIHggPSAwMDAuMzE0CisgICAgICAgIHggPSAuMzE0CisgICAgICAgIHggPSAzZTE0CisgICAgICAgIHggPSAzRTE0CisgICAgICAgIHggPSAzZS0xNAorICAgICAgICB4ID0gM2UrMTQKKyAgICAgICAgeCA9IDMuZTE0CisgICAgICAgIHggPSAuM2UxNAorICAgICAgICB4ID0gMy4xZTQKKworICAgIGRlZiB0ZXN0U3RyaW5nTGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHggPSAnJzsgeSA9ICIiOyBzZWxmLmFzc2VydF8obGVuKHgpID09IDAgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICdcJyc7IHkgPSAiJyI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzkpCisgICAgICAgIHggPSAnIic7IHkgPSAiXCIiOyBzZWxmLmFzc2VydF8obGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM0KQorICAgICAgICB4ID0gImRvZXNuJ3QgXCJzaHJpbmtcIiBkb2VzIGl0IgorICAgICAgICB5ID0gJ2RvZXNuXCd0ICJzaHJpbmsiIGRvZXMgaXQnCisgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICJkb2VzIFwic2hyaW5rXCIgZG9lc24ndCBpdCIKKyAgICAgICAgeSA9ICdkb2VzICJzaHJpbmsiIGRvZXNuXCd0IGl0JworICAgICAgICBzZWxmLmFzc2VydF8obGVuKHgpID09IDI0IGFuZCB4ID09IHkpCisgICAgICAgIHggPSAiIiIKK1RoZSAicXVpY2siCiticm93biBmb3gKK2p1bXBzIG92ZXIKK3RoZSAnbGF6eScgZG9nLgorIiIiCisgICAgICAgIHkgPSAnXG5UaGUgInF1aWNrIlxuYnJvd24gZm94XG5qdW1wcyBvdmVyXG50aGUgXCdsYXp5XCcgZG9nLlxuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorICAgICAgICB5ID0gJycnCitUaGUgInF1aWNrIgorYnJvd24gZm94CitqdW1wcyBvdmVyCit0aGUgJ2xhenknIGRvZy4KKycnJworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCB5KQorICAgICAgICB5ID0gIlxuXAorVGhlIFwicXVpY2tcIlxuXAorYnJvd24gZm94XG5cCitqdW1wcyBvdmVyXG5cCit0aGUgJ2xhenknIGRvZy5cblwKKyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICdcblwKK1RoZSBcInF1aWNrXCJcblwKK2Jyb3duIGZveFxuXAoranVtcHMgb3ZlclxuXAordGhlIFwnbGF6eVwnIGRvZy5cblwKKycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKworCitjbGFzcyBHcmFtbWFyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBzaW5nbGVfaW5wdXQ6IE5FV0xJTkUgfCBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQgTkVXTElORQorICAgICMgWFhYIGNhbid0IHRlc3QgaW4gYSBzY3JpcHQgLS0gdGhpcyBydWxlIGlzIG9ubHkgdXNlZCB3aGVuIGludGVyYWN0aXZlCisKKyAgICAjIGZpbGVfaW5wdXQ6IChORVdMSU5FIHwgc3RtdCkqIEVORE1BUktFUgorICAgICMgQmVpbmcgdGVzdGVkIGFzIHRoaXMgdmVyeSBtb21lbnQgdGhpcyB2ZXJ5IG1vZHVsZQorCisgICAgIyBleHByX2lucHV0OiB0ZXN0bGlzdCBORVdMSU5FCisgICAgIyBYWFggSGFyZCB0byB0ZXN0IC0tIHVzZWQgb25seSBpbiBjYWxscyB0byBpbnB1dCgpCisKKyAgICBkZWYgdGVzdEV2YWxJbnB1dChzZWxmKToKKyAgICAgICAgIyB0ZXN0bGlzdCBFTkRNQVJLRVIKKyAgICAgICAgeCA9IGV2YWwoJzEsIDAgb3IgMScpCisKKyAgICBkZWYgdGVzdEZ1bmNkZWYoc2VsZik6CisgICAgICAgICMjIyAnZGVmJyBOQU1FIHBhcmFtZXRlcnMgJzonIHN1aXRlCisgICAgICAgICMjIyBwYXJhbWV0ZXJzOiAnKCcgW3ZhcmFyZ3NsaXN0XSAnKScKKyAgICAgICAgIyMjIHZhcmFyZ3NsaXN0OiAoZnBkZWYgWyc9JyB0ZXN0XSAnLCcpKiAoJyonIE5BTUUgWycsJyAoJyoqJ3wnKicgJyonKSBOQU1FXQorICAgICAgICAjIyMgICAgICAgICAgICB8ICgnKionfCcqJyAnKicpIE5BTUUpCisgICAgICAgICMjIyAgICAgICAgICAgIHwgZnBkZWYgWyc9JyB0ZXN0XSAoJywnIGZwZGVmIFsnPScgdGVzdF0pKiBbJywnXQorICAgICAgICAjIyMgZnBkZWY6IE5BTUUgfCAnKCcgZnBsaXN0ICcpJworICAgICAgICAjIyMgZnBsaXN0OiBmcGRlZiAoJywnIGZwZGVmKSogWycsJ10KKyAgICAgICAgIyMjIGFyZ2xpc3Q6IChhcmd1bWVudCAnLCcpKiAoYXJndW1lbnQgfCAqJyB0ZXN0IFsnLCcgJyoqJyB0ZXN0XSB8ICcqKicgdGVzdCkKKyAgICAgICAgIyMjIGFyZ3VtZW50OiBbdGVzdCAnPSddIHRlc3QgICAjIFJlYWxseSBba2V5d29yZCAnPSddIHRlc3QKKyAgICAgICAgZGVmIGYxKCk6IHBhc3MKKyAgICAgICAgZjEoKQorICAgICAgICBmMSgqKCkpCisgICAgICAgIGYxKCooKSwgKip7fSkKKyAgICAgICAgZGVmIGYyKG9uZV9hcmd1bWVudCk6IHBhc3MKKyAgICAgICAgZGVmIGYzKHR3bywgYXJndW1lbnRzKTogcGFzcworICAgICAgICBkZWYgZjQodHdvLCAoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpKTogcGFzcworICAgICAgICBkZWYgZjUoKGNvbXBvdW5kLCBmaXJzdCksIHR3byk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjIuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ29uZV9hcmd1bWVudCcsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ3R3bycsICdhcmd1bWVudHMnKSkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGY0LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICAoJ3R3bycsICcoY29tcG91bmQsIChhcmd1bWVudCwgbGlzdCkpJywgJ2NvbXBvdW5kJywgJ2FyZ3VtZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xpc3QnLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNS5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAgKCcoY29tcG91bmQsIGZpcnN0KScsICd0d28nLCAnY29tcG91bmQnLCAnZmlyc3QnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGY0LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICgndHdvJywgJy4xJywgJ2NvbXBvdW5kJywgJ2FyZ3VtZW50JywgICdsaXN0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmNS5mdW5jX2NvZGUuY29fdmFybmFtZXMsCisgICAgICAgICAgICAgICAgICAoJy4wJywgJ3R3bycsICdjb21wb3VuZCcsICdmaXJzdCcpKQorICAgICAgICBkZWYgYTEob25lX2FyZywpOiBwYXNzCisgICAgICAgIGRlZiBhMih0d28sIGFyZ3MsKTogcGFzcworICAgICAgICBkZWYgdjAoKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MShhLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZGVmIHYyKGEsIGIsICpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjMoYSwgKGIsIGMpLCAqcmVzdCk6IHJldHVybiBhLCBiLCBjLCByZXN0CisKKyAgICAgICAgZjEoKQorICAgICAgICBmMigxKQorICAgICAgICBmMigxLCkKKyAgICAgICAgZjMoMSwgMikKKyAgICAgICAgZjMoMSwgMiwpCisgICAgICAgIGY0KDEsICgyLCAoMywgNCkpKQorICAgICAgICB2MCgpCisgICAgICAgIHYwKDEpCisgICAgICAgIHYwKDEsKQorICAgICAgICB2MCgxLDIpCisgICAgICAgIHYwKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYxKDEpCisgICAgICAgIHYxKDEsKQorICAgICAgICB2MSgxLDIpCisgICAgICAgIHYxKDEsMiwzKQorICAgICAgICB2MSgxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MigxLDIpCisgICAgICAgIHYyKDEsMiwzKQorICAgICAgICB2MigxLDIsMyw0KQorICAgICAgICB2MigxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MygxLCgyLDMpKQorICAgICAgICB2MygxLCgyLDMpLDQpCisgICAgICAgIHYzKDEsKDIsMyksNCw1LDYsNyw4LDksMCkKKworICAgICAgICAjIGNldmFsIHVucGFja3MgdGhlIGZvcm1hbCBhcmd1bWVudHMgaW50byB0aGUgZmlyc3QgYXJnY291bnQgbmFtZXM7CisgICAgICAgICMgdGh1cywgdGhlIG5hbWVzIG5lc3RlZCBpbnNpZGUgdHVwbGVzIG11c3QgYXBwZWFyIGFmdGVyIHRoZXNlIG5hbWVzLgorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ2EnLCAnKGIsIGMpJywgJ3Jlc3QnLCAnYicsICdjJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh2My5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnYScsICcuMScsICdyZXN0JywgJ2InLCAnYycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh2MygxLCAoMiwgMyksIDQpLCAoMSwgMiwgMywgKDQsKSkpCisgICAgICAgIGRlZiBkMDEoYT0xKTogcGFzcworICAgICAgICBkMDEoKQorICAgICAgICBkMDEoMSkKKyAgICAgICAgZDAxKCooMSwpKQorICAgICAgICBkMDEoKip7J2EnOjJ9KQorICAgICAgICBkZWYgZDExKGEsIGI9MSk6IHBhc3MKKyAgICAgICAgZDExKDEpCisgICAgICAgIGQxMSgxLCAyKQorICAgICAgICBkMTEoMSwgKip7J2InOjJ9KQorICAgICAgICBkZWYgZDIxKGEsIGIsIGM9MSk6IHBhc3MKKyAgICAgICAgZDIxKDEsIDIpCisgICAgICAgIGQyMSgxLCAyLCAzKQorICAgICAgICBkMjEoKigxLCAyLCAzKSkKKyAgICAgICAgZDIxKDEsICooMiwgMykpCisgICAgICAgIGQyMSgxLCAyLCAqKDMsKSkKKyAgICAgICAgZDIxKDEsIDIsICoqeydjJzozfSkKKyAgICAgICAgZGVmIGQwMihhPTEsIGI9Mik6IHBhc3MKKyAgICAgICAgZDAyKCkKKyAgICAgICAgZDAyKDEpCisgICAgICAgIGQwMigxLCAyKQorICAgICAgICBkMDIoKigxLCAyKSkKKyAgICAgICAgZDAyKDEsICooMiwpKQorICAgICAgICBkMDIoMSwgKip7J2InOjJ9KQorICAgICAgICBkMDIoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEyKGEsIGI9MSwgYz0yKTogcGFzcworICAgICAgICBkMTIoMSkKKyAgICAgICAgZDEyKDEsIDIpCisgICAgICAgIGQxMigxLCAyLCAzKQorICAgICAgICBkZWYgZDIyKGEsIGIsIGM9MSwgZD0yKTogcGFzcworICAgICAgICBkMjIoMSwgMikKKyAgICAgICAgZDIyKDEsIDIsIDMpCisgICAgICAgIGQyMigxLCAyLCAzLCA0KQorICAgICAgICBkZWYgZDAxdihhPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMDF2KCkKKyAgICAgICAgZDAxdigxKQorICAgICAgICBkMDF2KDEsIDIpCisgICAgICAgIGQwMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDAxdigqKDEsKSkKKyAgICAgICAgZDAxdigqKnsnYSc6Mn0pCisgICAgICAgIGRlZiBkMTF2KGEsIGI9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMXYoMSkKKyAgICAgICAgZDExdigxLCAyKQorICAgICAgICBkMTF2KDEsIDIsIDMpCisgICAgICAgIGRlZiBkMjF2KGEsIGIsIGM9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQyMXYoMSwgMikKKyAgICAgICAgZDIxdigxLCAyLCAzKQorICAgICAgICBkMjF2KDEsIDIsIDMsIDQpCisgICAgICAgIGQyMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDIxdigxLCAyLCAqKnsnYyc6IDN9KQorICAgICAgICBkZWYgZDAydihhPTEsIGI9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQwMnYoKQorICAgICAgICBkMDJ2KDEpCisgICAgICAgIGQwMnYoMSwgMikKKyAgICAgICAgZDAydigxLCAyLCAzKQorICAgICAgICBkMDJ2KDEsICooMiwgMywgNCkpCisgICAgICAgIGQwMnYoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEydihhLCBiPTEsIGM9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMnYoMSkKKyAgICAgICAgZDEydigxLCAyKQorICAgICAgICBkMTJ2KDEsIDIsIDMpCisgICAgICAgIGQxMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDEydigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMTJ2KDEsIDIsICooMywgNCwgNSkpCisgICAgICAgIGQxMnYoMSwgKigyLCksICoqeydjJzogM30pCisgICAgICAgIGRlZiBkMjJ2KGEsIGIsIGM9MSwgZD0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDIydigxLCAyKQorICAgICAgICBkMjJ2KDEsIDIsIDMpCisgICAgICAgIGQyMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDIydigxLCAyLCAzLCA0LCA1KQorICAgICAgICBkMjJ2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQyMnYoMSwgMiwgKigzLCA0LCA1KSkKKyAgICAgICAgZDIydigxLCAqKDIsIDMpLCAqKnsnZCc6IDR9KQorICAgICAgICBkZWYgZDMxdigoeCkpOiBwYXNzCisgICAgICAgIGQzMXYoMSkKKyAgICAgICAgZGVmIGQzMnYoKHgsKSk6IHBhc3MKKyAgICAgICAgZDMydigoMSwpKQorCisgICAgICAgICMga2V5d29yZCBhcmd1bWVudHMgYWZ0ZXIgKmFyZ2xpc3QKKyAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZigxLCB4PTIsICpbMywgNF0sIHk9NSksICgoMSwgMywgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd4JzoyLCAneSc6NX0pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgImYoMSwgKigyLDMpLCA0KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZigxLCB4PTIsICooMyw0KSwgeD01KSIpCisKKyAgICAgICAgIyBDaGVjayBhc3QgZXJyb3JzIGluICphcmdzIGFuZCAqa3dhcmdzCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqZygxPTIpKSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZigqKmcoMT0yKSkiKQorCisgICAgZGVmIHRlc3RMYW1iZGVmKHNlbGYpOgorICAgICAgICAjIyMgbGFtYmRlZjogJ2xhbWJkYScgW3ZhcmFyZ3NsaXN0XSAnOicgdGVzdAorICAgICAgICBsMSA9IGxhbWJkYSA6IDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDEoKSwgMCkKKyAgICAgICAgbDIgPSBsYW1iZGEgOiBhW2RdICMgWFhYIGp1c3QgdGVzdGluZyB0aGUgZXhwcmVzc2lvbgorICAgICAgICBsMyA9IGxhbWJkYSA6IFsyIDwgeCBmb3IgeCBpbiBbLTEsIDMsIDBMXV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDMoKSwgWzAsIDEsIDBdKQorICAgICAgICBsNCA9IGxhbWJkYSB4ID0gbGFtYmRhIHkgPSBsYW1iZGEgej0xIDogeiA6IHkoKSA6IHgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNCgpLCAxKQorICAgICAgICBsNSA9IGxhbWJkYSB4LCB5LCB6PTI6IHggKyB5ICsgegorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNSgxLCAyKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDUoMSwgMiwgMyksIDYpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAibGFtYmRhIHg6IHggPSAyIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJsYW1iZGEgKE5vbmUsKTogTm9uZSIpCisKKyAgICAjIyMgc3RtdDogc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0U2ltcGxlU3RtdChzZWxmKToKKyAgICAgICAgIyMjIHNpbXBsZV9zdG10OiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddCisgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeAorICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAjIHZlcmlmeSBzdGF0ZW1lbnRzIHRoYXQgZW5kIHdpdGggc2VtaS1jb2xvbnMKKyAgICAgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeDsKKyAgICAgICAgZm9vKCkKKworICAgICMjIyBzbWFsbF9zdG10OiBleHByX3N0bXQgfCBwcmludF9zdG10ICB8IHBhc3Nfc3RtdCB8IGRlbF9zdG10IHwgZmxvd19zdG10IHwgaW1wb3J0X3N0bXQgfCBnbG9iYWxfc3RtdCB8IGFjY2Vzc19zdG10IHwgZXhlY19zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0RXhwclN0bXQoc2VsZik6CisgICAgICAgICMgKGV4cHJsaXN0ICc9JykqIGV4cHJsaXN0CisgICAgICAgIDEKKyAgICAgICAgMSwgMiwgMworICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSwgMiwgMworICAgICAgICB4ID0geSA9IHogPSAxLCAyLCAzCisgICAgICAgIHgsIHksIHogPSAxLCAyLCAzCisgICAgICAgIGFiYyA9IGEsIGIsIGMgPSB4LCB5LCB6ID0geHl6ID0gMSwgMiwgKDMsIDQpCisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJ4ICsgMSA9IDEiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImEgKyAxID0gYiArIDIiKQorCisgICAgZGVmIHRlc3RQcmludFN0bXQoc2VsZik6CisgICAgICAgICMgJ3ByaW50JyAodGVzdCAnLCcpKiBbdGVzdF0KKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisKKyAgICAgICAgIyBDYW4ndCB0ZXN0IHByaW50aW5nIHRvIHJlYWwgc3Rkb3V0IHdpdGhvdXQgY29tcGFyaW5nIG91dHB1dAorICAgICAgICAjIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgaW4gdW5pdHRlc3QuCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorCisgICAgICAgIHByaW50IDEsIDIsIDMKKyAgICAgICAgcHJpbnQgMSwgMiwgMywKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgMCBvciAxLCAwIG9yIDEsCisgICAgICAgIHByaW50IDAgb3IgMQorCisgICAgICAgICMgJ3ByaW50JyAnPj4nIHRlc3QgJywnCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMSwgMiwgMywKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dAorICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEsIDAgb3IgMSwKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMCBvciAxCisKKyAgICAgICAgIyB0ZXN0IHByaW50aW5nIHRvIGFuIGluc3RhbmNlCisgICAgICAgIGNsYXNzIEd1bHA6CisgICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgbXNnKTogcGFzcworCisgICAgICAgIGd1bHAgPSBHdWxwKCkKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMSwgMiwgMworICAgICAgICBwcmludCA+PiBndWxwLCAxLCAyLCAzLAorICAgICAgICBwcmludCA+PiBndWxwCisgICAgICAgIHByaW50ID4+IGd1bHAsIDAgb3IgMSwgMCBvciAxLAorICAgICAgICBwcmludCA+PiBndWxwLCAwIG9yIDEKKworICAgICAgICAjIHRlc3QgcHJpbnQgPj4gTm9uZQorICAgICAgICBkZWYgZHJpdmVyKCk6CisgICAgICAgICAgICBvbGRzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gR3VscCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVsbG1lKEd1bHAoKSkKKyAgICAgICAgICAgICAgICB0ZWxsbWUoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkc3Rkb3V0CisKKyAgICAgICAgIyB3ZSBzaG91bGQgc2VlIHRoaXMgb25jZQorICAgICAgICBkZWYgdGVsbG1lKGZpbGU9c3lzLnN0ZG91dCk6CisgICAgICAgICAgICBwcmludCA+PiBmaWxlLCAnaGVsbG8gd29ybGQnCisKKyAgICAgICAgZHJpdmVyKCkKKworICAgICAgICAjIHdlIHNob3VsZCBub3Qgc2VlIHRoaXMgYXQgYWxsCisgICAgICAgIGRlZiB0ZWxsbWUoZmlsZT1Ob25lKToKKyAgICAgICAgICAgIHByaW50ID4+IGZpbGUsICdnb29kYnllIHVuaXZlcnNlJworCisgICAgICAgIGRyaXZlcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuc3Rkb3V0LmdldHZhbHVlKCksICcnJ1wKKzEgMiAzCisxIDIgMworMSAxIDEKKzEgMiAzCisxIDIgMworMSAxIDEKK2hlbGxvIHdvcmxkCisnJycpCisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorCisgICAgICAgICMgc3ludGF4IGVycm9ycworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgJ3ByaW50ICwnKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgJ3ByaW50ID4+IHgsJykKKworICAgIGRlZiB0ZXN0RGVsU3RtdChzZWxmKToKKyAgICAgICAgIyAnZGVsJyBleHBybGlzdAorICAgICAgICBhYmMgPSBbMSwyLDNdCisgICAgICAgIHgsIHksIHogPSBhYmMKKyAgICAgICAgeHl6ID0geCwgeSwgegorCisgICAgICAgIGRlbCBhYmMKKyAgICAgICAgZGVsIHgsIHksICh6LCB4eXopCisKKyAgICBkZWYgdGVzdFBhc3NTdG10KHNlbGYpOgorICAgICAgICAjICdwYXNzJworICAgICAgICBwYXNzCisKKyAgICAjIGZsb3dfc3RtdDogYnJlYWtfc3RtdCB8IGNvbnRpbnVlX3N0bXQgfCByZXR1cm5fc3RtdCB8IHJhaXNlX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RCcmVha1N0bXQoc2VsZik6CisgICAgICAgICMgJ2JyZWFrJworICAgICAgICB3aGlsZSAxOiBicmVhaworCisgICAgZGVmIHRlc3RDb250aW51ZVN0bXQoc2VsZik6CisgICAgICAgICMgJ2NvbnRpbnVlJworICAgICAgICBpID0gMQorICAgICAgICB3aGlsZSBpOiBpID0gMDsgY29udGludWUKKworICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gIm9rIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbXNnID0gImNvbnRpbnVlIGZhaWxlZCB0byBjb250aW51ZSBpbnNpZGUgdHJ5IgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG1zZyA9ICJjb250aW51ZSBpbnNpZGUgdHJ5IGNhbGxlZCBleGNlcHQgYmxvY2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gImZpbmFsbHkgYmxvY2sgbm90IGNhbGxlZCIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtc2cgPSAib2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgIGRlZiB0ZXN0X2JyZWFrX2NvbnRpbnVlX2xvb3Aoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IHdhcnJhbnRzIGFuIGV4cGxhbmF0aW9uLiBJdCBpcyBhIHRlc3Qgc3BlY2lmaWNhbGx5IGZvciBTRiBidWdzCisgICAgICAgICMgIzQ2MzM1OSBhbmQgIzQ2MjkzNy4gVGhlIGJ1ZyBpcyB0aGF0IGEgJ2JyZWFrJyBzdGF0ZW1lbnQgZXhlY3V0ZWQgb3IKKyAgICAgICAgIyBleGNlcHRpb24gcmFpc2VkIGluc2lkZSBhIHRyeS9leGNlcHQgaW5zaWRlIGEgbG9vcCwgKmFmdGVyKiBhIGNvbnRpbnVlCisgICAgICAgICMgc3RhdGVtZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGluIHRoYXQgbG9vcCwgd2lsbCBjYXVzZSB0aGUgd3JvbmcgbnVtYmVyIG9mCisgICAgICAgICMgYXJndW1lbnRzIHRvIGJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciByZXNldCB0bworICAgICAgICAjIGEgdmVyeSBzbWFsbCBudW1iZXIgKHVzdWFsbHkgMC4pIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGZvbGxvd2luZyB0ZXN0CisgICAgICAgICMgKm11c3QqIHdyaXR0ZW4gYXMgYSBmdW5jdGlvbiwgYW5kIHRoZSB0cmFja2luZyB2YXJzICptdXN0KiBiZSBmdW5jdGlvbgorICAgICAgICAjIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzLiBPdGhlcndpc2UsIHRoZSB0ZXN0IHdpbGwgbG9vcCBhbmQgbG9vcC4KKworICAgICAgICBkZWYgdGVzdF9pbm5lcihleHRyYV9idXJuaW5nX29pbCA9IDEsIGNvdW50PTApOgorICAgICAgICAgICAgYmlnX2hpcHBvID0gMgorICAgICAgICAgICAgd2hpbGUgYmlnX2hpcHBvOgorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhX2J1cm5pbmdfb2lsIGFuZCBiaWdfaGlwcG8gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2J1cm5pbmdfb2lsIC09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGJpZ19oaXBwbyAtPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgaWYgY291bnQgPiAyIG9yIGJpZ19oaXBwbyA8PiAxOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY29udGludWUgdGhlbiBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AgYnJva2VuISIpCisgICAgICAgIHRlc3RfaW5uZXIoKQorCisgICAgZGVmIHRlc3RSZXR1cm4oc2VsZik6CisgICAgICAgICMgJ3JldHVybicgW3Rlc3RsaXN0XQorICAgICAgICBkZWYgZzEoKTogcmV0dXJuCisgICAgICAgIGRlZiBnMigpOiByZXR1cm4gMQorICAgICAgICBnMSgpCisgICAgICAgIHggPSBnMigpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnJldHVybiAxIikKKworICAgIGRlZiB0ZXN0WWllbGQoc2VsZik6CisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnlpZWxkIDEiKQorCisgICAgZGVmIHRlc3RSYWlzZShzZWxmKToKKyAgICAgICAgIyAncmFpc2UnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICB0cnk6IHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2p1c3QgdGVzdGluZycKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjogcGFzcworICAgICAgICB0cnk6IHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDogcGFzcworCisgICAgZGVmIHRlc3RJbXBvcnQoc2VsZik6CisgICAgICAgICMgJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaW1wb3J0IHRpbWUsIHN5cworICAgICAgICAjICdmcm9tJyBkb3R0ZWRfbmFtZSAnaW1wb3J0JyAoJyonIHwgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpCisgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICBmcm9tIHRpbWUgaW1wb3J0ICh0aW1lKQorICAgICAgICAjIG5vdCB0ZXN0YWJsZSBpbnNpZGUgYSBmdW5jdGlvbiwgYnV0IGFscmVhZHkgZG9uZSBhdCB0b3Agb2YgdGhlIG1vZHVsZQorICAgICAgICAjIGZyb20gc3lzIGltcG9ydCAqCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBwYXRoLCBhcmd2CisgICAgICAgIGZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2LCkKKworICAgIGRlZiB0ZXN0R2xvYmFsKHNlbGYpOgorICAgICAgICAjICdnbG9iYWwnIE5BTUUgKCcsJyBOQU1FKSoKKyAgICAgICAgZ2xvYmFsIGEKKyAgICAgICAgZ2xvYmFsIGEsIGIKKyAgICAgICAgZ2xvYmFsIG9uZSwgdHdvLCB0aHJlZSwgZm91ciwgZml2ZSwgc2l4LCBzZXZlbiwgZWlnaHQsIG5pbmUsIHRlbgorCisgICAgZGVmIHRlc3RFeGVjKHNlbGYpOgorICAgICAgICAjICdleGVjJyBleHByIFsnaW4nIGV4cHIgWycsJyBleHByXV0KKyAgICAgICAgeiA9IE5vbmUKKyAgICAgICAgZGVsIHoKKyAgICAgICAgZXhlYyAnej0xKzFcbicKKyAgICAgICAgaWYgeiAhPSAyOiBzZWxmLmZhaWwoJ2V4ZWMgXCd6PTErMVwnXFxuJykKKyAgICAgICAgZGVsIHoKKyAgICAgICAgZXhlYyAnej0xKzEnCisgICAgICAgIGlmIHogIT0gMjogc2VsZi5mYWlsKCdleGVjIFwnej0xKzFcJycpCisgICAgICAgIHogPSBOb25lCisgICAgICAgIGRlbCB6CisgICAgICAgIGltcG9ydCB0eXBlcworICAgICAgICBpZiBoYXNhdHRyKHR5cGVzLCAiVW5pY29kZVR5cGUiKToKKyAgICAgICAgICAgIGV4ZWMgciIiImlmIDE6CisgICAgICAgICAgICBleGVjIHUnej0xKzFcbicKKyAgICAgICAgICAgIGlmIHogIT0gMjogc2VsZi5mYWlsKCdleGVjIHVcJ3o9MSsxXCdcXG4nKQorICAgICAgICAgICAgZGVsIHoKKyAgICAgICAgICAgIGV4ZWMgdSd6PTErMScKKyAgICAgICAgICAgIGlmIHogIT0gMjogc2VsZi5mYWlsKCdleGVjIHVcJ3o9MSsxXCcnKSIiIgorICAgICAgICBnID0ge30KKyAgICAgICAgZXhlYyAneiA9IDEnIGluIGcKKyAgICAgICAgaWYgZy5oYXNfa2V5KCdfX2J1aWx0aW5zX18nKTogZGVsIGdbJ19fYnVpbHRpbnNfXyddCisgICAgICAgIGlmIGcgIT0geyd6JzogMX06IHNlbGYuZmFpbCgnZXhlYyBcJ3ogPSAxXCcgaW4gZycpCisgICAgICAgIGcgPSB7fQorICAgICAgICBsID0ge30KKworICAgICAgICBpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJnbG9iYWwgc3RhdGVtZW50IiwgbW9kdWxlPSI8c3RyaW5nPiIpCisgICAgICAgIGV4ZWMgJ2dsb2JhbCBhOyBhID0gMTsgYiA9IDInIGluIGcsIGwKKyAgICAgICAgaWYgZy5oYXNfa2V5KCdfX2J1aWx0aW5zX18nKTogZGVsIGdbJ19fYnVpbHRpbnNfXyddCisgICAgICAgIGlmIGwuaGFzX2tleSgnX19idWlsdGluc19fJyk6IGRlbCBsWydfX2J1aWx0aW5zX18nXQorICAgICAgICBpZiAoZywgbCkgIT0gKHsnYSc6MX0sIHsnYic6Mn0pOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdleGVjIC4uLiBpbiBnICglcyksIGwgKCVzKScgJShnLGwpKQorCisgICAgZGVmIHRlc3RBc3NlcnQoc2VsZik6CisgICAgICAgICMgYXNzZXJ0X3N0bXQ6ICdhc3NlcnQnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICBhc3NlcnQgMQorICAgICAgICBhc3NlcnQgMSwgMQorICAgICAgICBhc3NlcnQgbGFtYmRhIHg6eAorICAgICAgICBhc3NlcnQgMSwgbGFtYmRhIHg6eCsxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCAwLCAibXNnIgorICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlLmFyZ3NbMF0sICJtc2ciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiQXNzZXJ0aW9uRXJyb3Igbm90IHJhaXNlZCBieSBhc3NlcnQgMCIpCisKKyAgICAjIyMgY29tcG91bmRfc3RtdDogaWZfc3RtdCB8IHdoaWxlX3N0bXQgfCBmb3Jfc3RtdCB8IHRyeV9zdG10IHwgZnVuY2RlZiB8IGNsYXNzZGVmCisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0SWYoc2VsZik6CisgICAgICAgICMgJ2lmJyB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworCisgICAgZGVmIHRlc3RXaGlsZShzZWxmKToKKyAgICAgICAgIyAnd2hpbGUnIHRlc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICB3aGlsZSAwOiBwYXNzCisgICAgICAgIHdoaWxlIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworCisgICAgICAgICMgSXNzdWUxOTIwOiAid2hpbGUgMCIgaXMgb3B0aW1pemVkIGF3YXksCisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlICJlbHNlIiBjbGF1c2UgaXMgc3RpbGwgcHJlc2VudC4KKyAgICAgICAgeCA9IDAKKyAgICAgICAgd2hpbGUgMDoKKyAgICAgICAgICAgIHggPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCAyKQorCisgICAgZGVmIHRlc3RGb3Ioc2VsZik6CisgICAgICAgICMgJ2ZvcicgZXhwcmxpc3QgJ2luJyBleHBybGlzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIGZvciBpIGluIDEsIDIsIDM6IHBhc3MKKyAgICAgICAgZm9yIGksIGosIGsgaW4gKCk6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICBjbGFzcyBTcXVhcmVzOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heCk6CisgICAgICAgICAgICAgICAgc2VsZi5tYXggPSBtYXgKKyAgICAgICAgICAgICAgICBzZWxmLnNvZmFyID0gW10KKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc29mYXIpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgbm90IDAgPD0gaSA8IHNlbGYubWF4OiByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgbiA9IGxlbihzZWxmLnNvZmFyKQorICAgICAgICAgICAgICAgIHdoaWxlIG4gPD0gaToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2Zhci5hcHBlbmQobipuKQorICAgICAgICAgICAgICAgICAgICBuID0gbisxCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29mYXJbaV0KKyAgICAgICAgbiA9IDAKKyAgICAgICAgZm9yIHggaW4gU3F1YXJlcygxMCk6IG4gPSBuK3gKKyAgICAgICAgaWYgbiAhPSAyODU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ZvciBvdmVyIGdyb3dpbmcgc2VxdWVuY2UnKQorCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGZvciB4LCBpbiBbKDEsKSwgKDIsKSwgKDMsKV06CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbMSwgMiwgM10pCisKKyAgICBkZWYgdGVzdFRyeShzZWxmKToKKyAgICAgICAgIyMjIHRyeV9zdG10OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgICMjIyAgICAgICAgIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKKyAgICAgICAgIyMjIGV4Y2VwdF9jbGF1c2U6ICdleGNlcHQnIFtleHByIFsoJ2FzJyB8ICcsJykgZXhwcl1dCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEvMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjogcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIG1zZzogcGFzcworICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLCBtc2c6IHBhc3MKKyAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvcik6IHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IChFT0ZFcnJvciwgVHlwZUVycm9yLCBaZXJvRGl2aXNpb25FcnJvciksIG1zZzogcGFzcworICAgICAgICB0cnk6IHBhc3MKKyAgICAgICAgZmluYWxseTogcGFzcworCisgICAgZGVmIHRlc3RTdWl0ZShzZWxmKToKKyAgICAgICAgIyBzaW1wbGVfc3RtdCB8IE5FV0xJTkUgSU5ERU5UIE5FV0xJTkUqIChzdG10IE5FV0xJTkUqKSsgREVERU5UCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgaWYgMToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgMToKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMKKworICAgIGRlZiB0ZXN0VGVzdChzZWxmKToKKyAgICAgICAgIyMjIGFuZF90ZXN0ICgnb3InIGFuZF90ZXN0KSoKKyAgICAgICAgIyMjIGFuZF90ZXN0OiBub3RfdGVzdCAoJ2FuZCcgbm90X3Rlc3QpKgorICAgICAgICAjIyMgbm90X3Rlc3Q6ICdub3QnIG5vdF90ZXN0IHwgY29tcGFyaXNvbgorICAgICAgICBpZiBub3QgMTogcGFzcworICAgICAgICBpZiAxIGFuZCAxOiBwYXNzCisgICAgICAgIGlmIDEgb3IgMTogcGFzcworICAgICAgICBpZiBub3Qgbm90IG5vdCAxOiBwYXNzCisgICAgICAgIGlmIG5vdCAxIGFuZCAxIGFuZCAxOiBwYXNzCisgICAgICAgIGlmIDEgYW5kIDEgb3IgMSBhbmQgMSBhbmQgMSBvciBub3QgMSBhbmQgMTogcGFzcworCisgICAgZGVmIHRlc3RDb21wYXJpc29uKHNlbGYpOgorICAgICAgICAjIyMgY29tcGFyaXNvbjogZXhwciAoY29tcF9vcCBleHByKSoKKyAgICAgICAgIyMjIGNvbXBfb3A6ICc8J3wnPid8Jz09J3wnPj0nfCc8PSd8Jzw+J3wnIT0nfCdpbid8J25vdCcgJ2luJ3wnaXMnfCdpcycgJ25vdCcKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICB4ID0gKDEgPT0gMSkKKyAgICAgICAgaWYgMSA9PSAxOiBwYXNzCisgICAgICAgIGlmIDEgIT0gMTogcGFzcworICAgICAgICBpZiAxIDw+IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8IDE6IHBhc3MKKyAgICAgICAgaWYgMSA+IDE6IHBhc3MKKyAgICAgICAgaWYgMSA8PSAxOiBwYXNzCisgICAgICAgIGlmIDEgPj0gMTogcGFzcworICAgICAgICBpZiAxIGlzIDE6IHBhc3MKKyAgICAgICAgaWYgMSBpcyBub3QgMTogcGFzcworICAgICAgICBpZiAxIGluICgpOiBwYXNzCisgICAgICAgIGlmIDEgbm90IGluICgpOiBwYXNzCisgICAgICAgIGlmIDEgPCAxID4gMSA9PSAxID49IDEgPD0gMSA8PiAxICE9IDEgaW4gMSBub3QgaW4gMSBpcyAxIGlzIG5vdCAxOiBwYXNzCisKKyAgICBkZWYgdGVzdEJpbmFyeU1hc2tPcHMoc2VsZik6CisgICAgICAgIHggPSAxICYgMQorICAgICAgICB4ID0gMSBeIDEKKyAgICAgICAgeCA9IDEgfCAxCisKKyAgICBkZWYgdGVzdFNoaWZ0T3BzKHNlbGYpOgorICAgICAgICB4ID0gMSA8PCAxCisgICAgICAgIHggPSAxID4+IDEKKyAgICAgICAgeCA9IDEgPDwgMSA+PiAxCisKKyAgICBkZWYgdGVzdEFkZGl0aXZlT3BzKHNlbGYpOgorICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSArIDEKKyAgICAgICAgeCA9IDEgLSAxIC0gMQorICAgICAgICB4ID0gMSAtIDEgKyAxIC0gMSArIDEKKworICAgIGRlZiB0ZXN0TXVsdGlwbGljYXRpdmVPcHMoc2VsZik6CisgICAgICAgIHggPSAxICogMQorICAgICAgICB4ID0gMSAvIDEKKyAgICAgICAgeCA9IDEgJSAxCisgICAgICAgIHggPSAxIC8gMSAqIDEgJSAxCisKKyAgICBkZWYgdGVzdFVuYXJ5T3BzKHNlbGYpOgorICAgICAgICB4ID0gKzEKKyAgICAgICAgeCA9IC0xCisgICAgICAgIHggPSB+MQorICAgICAgICB4ID0gfjEgXiAxICYgMSB8IDEgJiAxIF4gLTEKKyAgICAgICAgeCA9IC0xKjEvMSArIDEqMSAtIC0tLTEqMQorCisgICAgZGVmIHRlc3RTZWxlY3RvcnMoc2VsZik6CisgICAgICAgICMjIyB0cmFpbGVyOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgc3Vic2NyaXB0ICddJyB8ICcuJyBOQU1FCisgICAgICAgICMjIyBzdWJzY3JpcHQ6IGV4cHIgfCBbZXhwcl0gJzonIFtleHByXQorCisgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgYyA9IHN5cy5wYXRoWzBdCisgICAgICAgIHggPSB0aW1lLnRpbWUoKQorICAgICAgICB4ID0gc3lzLm1vZHVsZXNbJ3RpbWUnXS50aW1lKCkKKyAgICAgICAgYSA9ICcwMTIzNCcKKyAgICAgICAgYyA9IGFbMF0KKyAgICAgICAgYyA9IGFbLTFdCisgICAgICAgIHMgPSBhWzA6NV0KKyAgICAgICAgcyA9IGFbOjVdCisgICAgICAgIHMgPSBhWzA6XQorICAgICAgICBzID0gYVs6XQorICAgICAgICBzID0gYVstNTpdCisgICAgICAgIHMgPSBhWzotMV0KKyAgICAgICAgcyA9IGFbLTQ6LTNdCisgICAgICAgICMgQSByb3VnaCB0ZXN0IG9mIFNGIGJ1ZyAxMzMzOTgyLiAgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTMzMzk4MgorICAgICAgICAjIFRoZSB0ZXN0aW5nIGhlcmUgaXMgZmFpcmx5IGluY29tcGxldGUuCisgICAgICAgICMgVGVzdCBjYXNlcyBzaG91bGQgaW5jbHVkZTogY29tbWFzIHdpdGggMSBhbmQgMiBjb2xvbnMKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbMV0gPSAxCisgICAgICAgIGRbMSxdID0gMgorICAgICAgICBkWzEsMl0gPSAzCisgICAgICAgIGRbMSwyLDNdID0gNAorICAgICAgICBMID0gbGlzdChkKQorICAgICAgICBMLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzdHIoTCksICdbMSwgKDEsKSwgKDEsIDIpLCAoMSwgMiwgMyldJykKKworICAgIGRlZiB0ZXN0QXRvbXMoc2VsZik6CisgICAgICAgICMjIyBhdG9tOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgW3Rlc3RsaXN0XSAnXScgfCAneycgW2RpY3RtYWtlcl0gJ30nIHwgJ2AnIHRlc3RsaXN0ICdgJyB8IE5BTUUgfCBOVU1CRVIgfCBTVFJJTkcKKyAgICAgICAgIyMjIGRpY3RtYWtlcjogdGVzdCAnOicgdGVzdCAoJywnIHRlc3QgJzonIHRlc3QpKiBbJywnXQorCisgICAgICAgIHggPSAoMSkKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMykKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMywgMiwgMykKKworICAgICAgICB4ID0gW10KKyAgICAgICAgeCA9IFsxXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzLCAyLCAzXQorICAgICAgICB4ID0gW10KKworICAgICAgICB4ID0ge30KKyAgICAgICAgeCA9IHsnb25lJzogMX0KKyAgICAgICAgeCA9IHsnb25lJzogMSx9CisgICAgICAgIHggPSB7J29uZScgb3IgJ3R3byc6IDEgb3IgMn0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDJ9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyLH0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMsICdmb3VyJzogNCwgJ2ZpdmUnOiA1LCAnc2l4JzogNn0KKworICAgICAgICB4ID0gYHhgCisgICAgICAgIHggPSBgMSBvciAyIG9yIDNgCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYDEsMmAsICcoMSwgMiknKQorCisgICAgICAgIHggPSB4CisgICAgICAgIHggPSAneCcKKyAgICAgICAgeCA9IDEyMworCisgICAgIyMjIGV4cHJsaXN0OiBleHByICgnLCcgZXhwcikqIFsnLCddCisgICAgIyMjIHRlc3RsaXN0OiB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddCisgICAgIyBUaGVzZSBoYXZlIGJlZW4gZXhlcmNpc2VkIGVub3VnaCBhYm92ZQorCisgICAgZGVmIHRlc3RDbGFzc2RlZihzZWxmKToKKyAgICAgICAgIyAnY2xhc3MnIE5BTUUgWycoJyBbdGVzdGxpc3RdICcpJ10gJzonIHN1aXRlCisgICAgICAgIGNsYXNzIEI6IHBhc3MKKyAgICAgICAgY2xhc3MgQjIoKTogcGFzcworICAgICAgICBjbGFzcyBDMShCKTogcGFzcworICAgICAgICBjbGFzcyBDMihCKTogcGFzcworICAgICAgICBjbGFzcyBEKEMxLCBDMiwgQik6IHBhc3MKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBtZXRoMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIG1ldGgyKHNlbGYsIGFyZyk6IHBhc3MKKyAgICAgICAgICAgIGRlZiBtZXRoMyhzZWxmLCBhMSwgYTIpOiBwYXNzCisgICAgICAgICMgZGVjb3JhdG9yOiAnQCcgZG90dGVkX25hbWUgWyAnKCcgW2FyZ2xpc3RdICcpJyBdIE5FV0xJTkUKKyAgICAgICAgIyBkZWNvcmF0b3JzOiBkZWNvcmF0b3IrCisgICAgICAgICMgZGVjb3JhdGVkOiBkZWNvcmF0b3JzIChjbGFzc2RlZiB8IGZ1bmNkZWYpCisgICAgICAgIGRlZiBjbGFzc19kZWNvcmF0b3IoeCk6CisgICAgICAgICAgICB4LmRlY29yYXRlZCA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIEBjbGFzc19kZWNvcmF0b3IKKyAgICAgICAgY2xhc3MgRzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChHLmRlY29yYXRlZCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0TGlzdGNvbXBzKHNlbGYpOgorICAgICAgICAjIGxpc3QgY29tcHJlaGVuc2lvbiB0ZXN0cworICAgICAgICBudW1zID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIHN0cnMgPSBbIkFwcGxlIiwgIkJhbmFuYSIsICJDb2NvbnV0Il0KKyAgICAgICAgc3BjcyA9IFsiICBBcHBsZSIsICIgQmFuYW5hICIsICJDb2NvICBudXQgICJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcy5zdHJpcCgpIGZvciBzIGluIHNwY3NdLCBbJ0FwcGxlJywgJ0JhbmFuYScsICdDb2NvICBudXQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbMyAqIHggZm9yIHggaW4gbnVtc10sIFszLCA2LCA5LCAxMiwgMTVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFt4IGZvciB4IGluIG51bXMgaWYgeCA+IDJdLCBbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0FwcGxlJyksICgxLCAnQmFuYW5hJyksICgxLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ0FwcGxlJyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0FwcGxlJyksICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ0FwcGxlJyksICg0LCAnQmFuYW5hJyksICg0LCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ0FwcGxlJyksICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gW2YgZm9yIGYgaW4gc3RycyBpZiAibiIgaW4gZl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwgKDIsICdCYW5hbmEnKSwgKDIsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdCYW5hbmEnKSwgKDUsICdDb2NvbnV0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsobGFtYmRhIGE6W2EqKmkgZm9yIGkgaW4gcmFuZ2UoYSsxKV0pKGopIGZvciBqIGluIHJhbmdlKDUpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbWzFdLCBbMSwgMV0sIFsxLCAyLCA0XSwgWzEsIDMsIDksIDI3XSwgWzEsIDQsIDE2LCA2NCwgMjU2XV0pCisKKyAgICAgICAgZGVmIHRlc3RfaW5fZnVuYyhsKToKKyAgICAgICAgICAgIHJldHVybiBbTm9uZSA8IHggPCAzIGZvciB4IGluIGwgaWYgeCA+IDJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2luX2Z1bmMobnVtcyksIFtGYWxzZSwgRmFsc2UsIEZhbHNlXSkKKworICAgICAgICBkZWYgdGVzdF9uZXN0ZWRfZnJvbnQoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW1t5IGZvciB5IGluIFt4LCB4ICsgMV1dIGZvciB4IGluIFsxLDMsNV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0pCisKKyAgICAgICAgdGVzdF9uZXN0ZWRfZnJvbnQoKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW2ksIHMgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW3ggaWYgeV0iKQorCisgICAgICAgIHN1cHBsaWVycyA9IFsKKyAgICAgICAgICAoMSwgIkJvZWluZyIpLAorICAgICAgICAgICgyLCAiRm9yZCIpLAorICAgICAgICAgICgzLCAiTWFjZG9uYWxkcyIpCisgICAgICAgIF0KKworICAgICAgICBwYXJ0cyA9IFsKKyAgICAgICAgICAoMTAsICJBaXJsaW5lciIpLAorICAgICAgICAgICgyMCwgIkVuZ2luZSIpLAorICAgICAgICAgICgzMCwgIkNoZWVzZWJ1cmdlciIpCisgICAgICAgIF0KKworICAgICAgICBzdXBwYXJ0ID0gWworICAgICAgICAgICgxLCAxMCksICgxLCAyMCksICgyLCAyMCksICgzLCAzMCkKKyAgICAgICAgXQorCisgICAgICAgIHggPSBbCisgICAgICAgICAgKHNuYW1lLCBwbmFtZSkKKyAgICAgICAgICAgIGZvciAoc25vLCBzbmFtZSkgaW4gc3VwcGxpZXJzCisgICAgICAgICAgICAgIGZvciAocG5vLCBwbmFtZSkgaW4gcGFydHMKKyAgICAgICAgICAgICAgICBmb3IgKHNwX3Nubywgc3BfcG5vKSBpbiBzdXBwYXJ0CisgICAgICAgICAgICAgICAgICBpZiBzbm8gPT0gc3Bfc25vIGFuZCBwbm8gPT0gc3BfcG5vCisgICAgICAgIF0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIFsoJ0JvZWluZycsICdBaXJsaW5lcicpLCAoJ0JvZWluZycsICdFbmdpbmUnKSwgKCdGb3JkJywgJ0VuZ2luZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ01hY2RvbmFsZHMnLCAnQ2hlZXNlYnVyZ2VyJyldKQorCisgICAgZGVmIHRlc3RHZW5leHBzKHNlbGYpOgorICAgICAgICAjIGdlbmVyYXRvciBleHByZXNzaW9uIHRlc3RzCisgICAgICAgIGcgPSAoW3ggZm9yIHggaW4gcmFuZ2UoMTApXSBmb3IgeCBpbiByYW5nZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm5leHQoKSwgW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZy5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc2hvdWxkIHByb2R1Y2UgU3RvcEl0ZXJhdGlvbiBleGNlcHRpb24nKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBhID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBnID0gKGEgZm9yIGQgaW4gYSkKKyAgICAgICAgICAgIGcubmV4dCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFR5cGVFcnJvcicpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eScpLCBbKHgsIHkpIGZvciB4IGluICdhYicgZm9yIHkgaW4gJ3h5J10pCisKKyAgICAgICAgYSA9IFt4IGZvciB4IGluIHJhbmdlKDEwKV0KKyAgICAgICAgYiA9ICh4IGZvciB4IGluICh5IGZvciB5IGluIGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShiKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHgqKjIgZm9yIHggaW4gcmFuZ2UoMTApKSwgc3VtKFt4KioyIGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KnggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMiksIHN1bShbeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiByYW5nZSgxMCkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluIFt5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSldKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSBpZiBUcnVlKSkgaWYgVHJ1ZSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkgaWYgRmFsc2UpIGlmIFRydWUpLCAwKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbyh4IGZvciB4IGluIHJhbmdlKDEwKSwgMTAwKSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZm9vKDEwMCwgeCBmb3IgeCBpbiByYW5nZSgxMCkpIikKKworICAgIGRlZiB0ZXN0Q29tcHJlaGVuc2lvblNwZWNpYWxzKHNlbGYpOgorICAgICAgICAjIHRlc3QgZm9yIG91dG1vc3QgaXRlcmFibGUgcHJlY29tcHV0YXRpb24KKyAgICAgICAgeCA9IDEwOyBnID0gKGkgZm9yIGkgaW4gcmFuZ2UoeCkpOyB4ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGcpKSwgMTApCisKKyAgICAgICAgIyBUaGlzIHNob3VsZCBob2xkLCBzaW5jZSB3ZSdyZSBvbmx5IHByZWNvbXB1dGluZyBvdXRtb3N0IGl0ZXJhYmxlLgorICAgICAgICB4ID0gMTA7IHQgPSBGYWxzZTsgZyA9ICgoaSxqKSBmb3IgaSBpbiByYW5nZSh4KSBpZiB0IGZvciBqIGluIHJhbmdlKHgpKQorICAgICAgICB4ID0gNTsgdCA9IFRydWU7CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLGopIGZvciBpIGluIHJhbmdlKDEwKSBmb3IgaiBpbiByYW5nZSg1KV0sIGxpc3QoZykpCisKKyAgICAgICAgIyBHcmFtbWFyIGFsbG93cyBtdWx0aXBsZSBhZGphY2VudCAnaWYncyBpbiBsaXN0Y29tcHMgYW5kIGdlbmV4cHMsCisgICAgICAgICMgZXZlbiB0aG91Z2ggaXQncyBzaWxseS4gTWFrZSBzdXJlIGl0IHdvcmtzIChpZmVsc2UgYnJva2UgdGhpcy4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyBdLCBbMSwgNSwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyksIFsxLCA1LCA3XSkKKworICAgICAgICAjIHZlcmlmeSB1bnBhY2tpbmcgc2luZ2xlIGVsZW1lbnQgdHVwbGVzIGluIGxpc3Rjb21wL2dlbmV4cC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCwgaW4gWyg0LCksICg1LCksICg2LCldXSwgWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCwgaW4gWyg3LCksICg4LCksICg5LCldKSwgWzcsIDgsIDldKQorCisgICAgZGVmIHRlc3Rfd2l0aF9zdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIGNsYXNzIG1hbmFnZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgxLCAyKQorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHg6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzICh4LCB5KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCksIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCkgYXMgeCwgbWFuYWdlcigpIGFzIHk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHgsIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0SWZFbHNlRXhwcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCisgICAgICAgIGRlZiBfY2hlY2tldmFsKG1zZywgcmV0KToKKyAgICAgICAgICAgICJoZWxwZXIgdG8gY2hlY2sgdGhhdCBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zIGlzIGRvbmUgY29ycmVjdGx5IgorICAgICAgICAgICAgcHJpbnQgeAorICAgICAgICAgICAgcmV0dXJuIHJldAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gbGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlIGlmIHgoKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KCkgZm9yIHggaW4gKGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSkgaWYgeCgpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHgoRmFsc2UpIGZvciB4IGluIChsYW1iZGEgeDogRmFsc2UgaWYgeCBlbHNlIFRydWUsIGxhbWJkYSB4OiBUcnVlIGlmIHggZWxzZSBGYWxzZSkgaWYgeChGYWxzZSkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayAxIiwgMCkpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChfY2hlY2tldmFsKCJjaGVjayAyIiwgMCkgaWYgMCBlbHNlIDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGFuZCA2IGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoKDUgYW5kIDYpIGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBhbmQgKDYgaWYgMSBlbHNlIDEpKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciBfY2hlY2tldmFsKCJjaGVjayAzIiwgMikgaWYgMCBlbHNlIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxIG9yIF9jaGVja2V2YWwoImNoZWNrIDQiLCAyKSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNSIsIDMpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCBvciA1IGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA2IiwgMykpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAxIGVsc2UgMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChub3QgNSBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgKyAxIGlmIDEgZWxzZSAyKSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAtIDEgaWYgMSBlbHNlIDIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2ICogMiBpZiAxIGVsc2UgNCksIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IC8gMiBpZiAxIGVsc2UgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgPCA0IGlmIDAgZWxzZSAyKSwgMikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRva2VuVGVzdHMsIEdyYW1tYXJUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL2RhdGEvcHkzX3Rlc3RfZ3JhbW1hci5weSBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiZjdmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9kYXRhL3B5M190ZXN0X2dyYW1tYXIucHkKQEAgLTAsMCArMSw5MjMgQEAKKyMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgMSwgZ3JhbW1hci4KKyMgVGhpcyBqdXN0IHRlc3RzIHdoZXRoZXIgdGhlIHBhcnNlciBhY2NlcHRzIHRoZW0gYWxsLgorCisjIE5PVEU6IFdoZW4geW91IHJ1biB0aGlzIHRlc3QgYXMgYSBzY3JpcHQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3UKKyMgZ2V0IHdhcm5pbmdzIGFib3V0IGNlcnRhaW4gaGV4L29jdCBjb25zdGFudHMuICBTaW5jZSB0aG9zZSBhcmUKKyMgaXNzdWVkIGJ5IHRoZSBwYXJzZXIsIHlvdSBjYW4ndCBzdXBwcmVzcyB0aGVtIGJ5IGFkZGluZyBhCisjIGZpbHRlcndhcm5pbmdzKCkgY2FsbCB0byB0aGlzIG1vZHVsZS4gIFRoZXJlZm9yZSwgdG8gc2h1dCB1cCB0aGUKKyMgcmVncmVzc2lvbiB0ZXN0LCB0aGUgZmlsdGVyd2FybmluZ3MoKSBjYWxsIGhhcyBiZWVuIGFkZGVkIHRvCisjIHJlZ3J0ZXN0LnB5LgorCitmcm9tIHRlc3Quc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19zeW50YXhfZXJyb3IKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworIyB0ZXN0aW5nIGltcG9ydCAqCitmcm9tIHN5cyBpbXBvcnQgKgorCitjbGFzcyBUb2tlblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0QmFja3NsYXNoKHNlbGYpOgorICAgICAgICAjIEJhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbjoKKyAgICAgICAgeCA9IDEgXAorICAgICAgICArIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMiwgJ2JhY2tzbGFzaCBmb3IgbGluZSBjb250aW51YXRpb24nKQorCisgICAgICAgICMgQmFja3NsYXNoIGRvZXMgbm90IG1lYW5zIGNvbnRpbnVhdGlvbiBpbiBjb21tZW50cyA6XAorICAgICAgICB4ID0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCAwLCAnYmFja3NsYXNoIGVuZGluZyBjb21tZW50JykKKworICAgIGRlZiB0ZXN0UGxhaW5JbnRlZ2VycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHlwZSgwMDApLCB0eXBlKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygweGZmLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDBvMzc3LCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIDBvMTc3Nzc3Nzc3NzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDBiMTAwMSwgOSkKKyAgICAgICAgIyAiMHgiIGlzIG5vdCBhIHZhbGlkIGxpdGVyYWwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICIweCIpCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBtYXhzaXplCisgICAgICAgIGlmIG1heHNpemUgPT0gMjE0NzQ4MzY0NzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKC0yMTQ3NDgzNjQ3LTEsIC0wbzIwMDAwMDAwMDAwKQorICAgICAgICAgICAgIyBYWFggLTIxNDc0ODM2NDgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwbzM3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgPiAwKQorICAgICAgICAgICAgZm9yIHMgaW4gKCcyMTQ3NDgzNjQ4JywgJzBvNDAwMDAwMDAwMDAnLCAnMHgxMDAwMDAwMDAnLAorICAgICAgICAgICAgICAgICAgICAgICcwYjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxpZiBtYXhzaXplID09IDkyMjMzNzIwMzY4NTQ3NzU4MDc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscygtOTIyMzM3MjAzNjg1NDc3NTgwNy0xLCAtMG8xMDAwMDAwMDAwMDAwMDAwMDAwMDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDBvMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyA+IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oMHhmZmZmZmZmZmZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExID4gMCkKKyAgICAgICAgICAgIGZvciBzIGluICc5MjIzMzcyMDM2ODU0Nzc1ODA4JywgJzBvMjAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIFwKKyAgICAgICAgICAgICAgICAgICAgICcweDEwMDAwMDAwMDAwMDAwMDAwJywgXAorICAgICAgICAgICAgICAgICAgICAgJzBiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdXZWlyZCBtYXhzaXplIHZhbHVlICVyJyAlIG1heHNpemUpCisKKyAgICBkZWYgdGVzdExvbmdJbnRlZ2VycyhzZWxmKToKKyAgICAgICAgeCA9IDAKKyAgICAgICAgeCA9IDB4ZmZmZmZmZmZmZmZmZmZmZgorICAgICAgICB4ID0gMFhmZmZmZmZmZmZmZmZmZmZmCisgICAgICAgIHggPSAwbzc3Nzc3Nzc3Nzc3Nzc3Nzc3CisgICAgICAgIHggPSAwTzc3Nzc3Nzc3Nzc3Nzc3Nzc3CisgICAgICAgIHggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAKKyAgICAgICAgeCA9IDBiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisgICAgICAgIHggPSAwQjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorCisgICAgZGVmIHRlc3RGbG9hdHMoc2VsZik6CisgICAgICAgIHggPSAzLjE0CisgICAgICAgIHggPSAzMTQuCisgICAgICAgIHggPSAwLjMxNAorICAgICAgICAjIFhYWCB4ID0gMDAwLjMxNAorICAgICAgICB4ID0gLjMxNAorICAgICAgICB4ID0gM2UxNAorICAgICAgICB4ID0gM0UxNAorICAgICAgICB4ID0gM2UtMTQKKyAgICAgICAgeCA9IDNlKzE0CisgICAgICAgIHggPSAzLmUxNAorICAgICAgICB4ID0gLjNlMTQKKyAgICAgICAgeCA9IDMuMWU0CisKKyAgICBkZWYgdGVzdFN0cmluZ0xpdGVyYWxzKHNlbGYpOgorICAgICAgICB4ID0gJyc7IHkgPSAiIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAwIGFuZCB4ID09IHkpCisgICAgICAgIHggPSAnXCcnOyB5ID0gIiciOyBzZWxmLmFzc2VydF8obGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM5KQorICAgICAgICB4ID0gJyInOyB5ID0gIlwiIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzNCkKKyAgICAgICAgeCA9ICJkb2Vzbid0IFwic2hyaW5rXCIgZG9lcyBpdCIKKyAgICAgICAgeSA9ICdkb2VzblwndCAic2hyaW5rIiBkb2VzIGl0JworICAgICAgICBzZWxmLmFzc2VydF8obGVuKHgpID09IDI0IGFuZCB4ID09IHkpCisgICAgICAgIHggPSAiZG9lcyBcInNocmlua1wiIGRvZXNuJ3QgaXQiCisgICAgICAgIHkgPSAnZG9lcyAic2hyaW5rIiBkb2VzblwndCBpdCcKKyAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQorICAgICAgICB4ID0gIiIiCitUaGUgInF1aWNrIgorYnJvd24gZm94CitqdW1wcyBvdmVyCit0aGUgJ2xhenknIGRvZy4KKyIiIgorICAgICAgICB5ID0gJ1xuVGhlICJxdWljayJcbmJyb3duIGZveFxuanVtcHMgb3ZlclxudGhlIFwnbGF6eVwnIGRvZy5cbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICcnJworVGhlICJxdWljayIKK2Jyb3duIGZveAoranVtcHMgb3ZlcgordGhlICdsYXp5JyBkb2cuCisnJycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgeSkKKyAgICAgICAgeSA9ICJcblwKK1RoZSBcInF1aWNrXCJcblwKK2Jyb3duIGZveFxuXAoranVtcHMgb3ZlclxuXAordGhlICdsYXp5JyBkb2cuXG5cCisiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisgICAgICAgIHkgPSAnXG5cCitUaGUgXCJxdWlja1wiXG5cCiticm93biBmb3hcblwKK2p1bXBzIG92ZXJcblwKK3RoZSBcJ2xhenlcJyBkb2cuXG5cCisnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIHkpCisKKyAgICBkZWYgdGVzdEVsbGlwc2lzKHNlbGYpOgorICAgICAgICB4ID0gLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIEVsbGlwc2lzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgIi4uIC4iKQorCitjbGFzcyBHcmFtbWFyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBzaW5nbGVfaW5wdXQ6IE5FV0xJTkUgfCBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQgTkVXTElORQorICAgICMgWFhYIGNhbid0IHRlc3QgaW4gYSBzY3JpcHQgLS0gdGhpcyBydWxlIGlzIG9ubHkgdXNlZCB3aGVuIGludGVyYWN0aXZlCisKKyAgICAjIGZpbGVfaW5wdXQ6IChORVdMSU5FIHwgc3RtdCkqIEVORE1BUktFUgorICAgICMgQmVpbmcgdGVzdGVkIGFzIHRoaXMgdmVyeSBtb21lbnQgdGhpcyB2ZXJ5IG1vZHVsZQorCisgICAgIyBleHByX2lucHV0OiB0ZXN0bGlzdCBORVdMSU5FCisgICAgIyBYWFggSGFyZCB0byB0ZXN0IC0tIHVzZWQgb25seSBpbiBjYWxscyB0byBpbnB1dCgpCisKKyAgICBkZWYgdGVzdEV2YWxJbnB1dChzZWxmKToKKyAgICAgICAgIyB0ZXN0bGlzdCBFTkRNQVJLRVIKKyAgICAgICAgeCA9IGV2YWwoJzEsIDAgb3IgMScpCisKKyAgICBkZWYgdGVzdEZ1bmNkZWYoc2VsZik6CisgICAgICAgICMjIyBbZGVjb3JhdG9yc10gJ2RlZicgTkFNRSBwYXJhbWV0ZXJzIFsnLT4nIHRlc3RdICc6JyBzdWl0ZQorICAgICAgICAjIyMgZGVjb3JhdG9yOiAnQCcgZG90dGVkX25hbWUgWyAnKCcgW2FyZ2xpc3RdICcpJyBdIE5FV0xJTkUKKyAgICAgICAgIyMjIGRlY29yYXRvcnM6IGRlY29yYXRvcisKKyAgICAgICAgIyMjIHBhcmFtZXRlcnM6ICcoJyBbdHlwZWRhcmdzbGlzdF0gJyknCisgICAgICAgICMjIyB0eXBlZGFyZ3NsaXN0OiAoKHRmcGRlZiBbJz0nIHRlc3RdICcsJykqCisgICAgICAgICMjIyAgICAgICAgICAgICAgICAoJyonIFt0ZnBkZWZdICgnLCcgdGZwZGVmIFsnPScgdGVzdF0pKiBbJywnICcqKicgdGZwZGVmXSB8ICcqKicgdGZwZGVmKQorICAgICAgICAjIyMgICAgICAgICAgICAgICAgfCB0ZnBkZWYgWyc9JyB0ZXN0XSAoJywnIHRmcGRlZiBbJz0nIHRlc3RdKSogWycsJ10pCisgICAgICAgICMjIyB0ZnBkZWY6IE5BTUUgWyc6JyB0ZXN0XQorICAgICAgICAjIyMgdmFyYXJnc2xpc3Q6ICgodmZwZGVmIFsnPScgdGVzdF0gJywnKSoKKyAgICAgICAgIyMjICAgICAgICAgICAgICAoJyonIFt2ZnBkZWZdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiAgWycsJyAnKionIHZmcGRlZl0gfCAnKionIHZmcGRlZikKKyAgICAgICAgIyMjICAgICAgICAgICAgICB8IHZmcGRlZiBbJz0nIHRlc3RdICgnLCcgdmZwZGVmIFsnPScgdGVzdF0pKiBbJywnXSkKKyAgICAgICAgIyMjIHZmcGRlZjogTkFNRQorICAgICAgICBkZWYgZjEoKTogcGFzcworICAgICAgICBmMSgpCisgICAgICAgIGYxKCooKSkKKyAgICAgICAgZjEoKigpLCAqKnt9KQorICAgICAgICBkZWYgZjIob25lX2FyZ3VtZW50KTogcGFzcworICAgICAgICBkZWYgZjModHdvLCBhcmd1bWVudHMpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYyLl9fY29kZV9fLmNvX3Zhcm5hbWVzLCAoJ29uZV9hcmd1bWVudCcsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZjMuX19jb2RlX18uY29fdmFybmFtZXMsICgndHdvJywgJ2FyZ3VtZW50cycpKQorICAgICAgICBkZWYgYTEob25lX2FyZywpOiBwYXNzCisgICAgICAgIGRlZiBhMih0d28sIGFyZ3MsKTogcGFzcworICAgICAgICBkZWYgdjAoKnJlc3QpOiBwYXNzCisgICAgICAgIGRlZiB2MShhLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZGVmIHYyKGEsIGIsICpyZXN0KTogcGFzcworCisgICAgICAgIGYxKCkKKyAgICAgICAgZjIoMSkKKyAgICAgICAgZjIoMSwpCisgICAgICAgIGYzKDEsIDIpCisgICAgICAgIGYzKDEsIDIsKQorICAgICAgICB2MCgpCisgICAgICAgIHYwKDEpCisgICAgICAgIHYwKDEsKQorICAgICAgICB2MCgxLDIpCisgICAgICAgIHYwKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYxKDEpCisgICAgICAgIHYxKDEsKQorICAgICAgICB2MSgxLDIpCisgICAgICAgIHYxKDEsMiwzKQorICAgICAgICB2MSgxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MigxLDIpCisgICAgICAgIHYyKDEsMiwzKQorICAgICAgICB2MigxLDIsMyw0KQorICAgICAgICB2MigxLDIsMyw0LDUsNiw3LDgsOSwwKQorCisgICAgICAgIGRlZiBkMDEoYT0xKTogcGFzcworICAgICAgICBkMDEoKQorICAgICAgICBkMDEoMSkKKyAgICAgICAgZDAxKCooMSwpKQorICAgICAgICBkMDEoKip7J2EnOjJ9KQorICAgICAgICBkZWYgZDExKGEsIGI9MSk6IHBhc3MKKyAgICAgICAgZDExKDEpCisgICAgICAgIGQxMSgxLCAyKQorICAgICAgICBkMTEoMSwgKip7J2InOjJ9KQorICAgICAgICBkZWYgZDIxKGEsIGIsIGM9MSk6IHBhc3MKKyAgICAgICAgZDIxKDEsIDIpCisgICAgICAgIGQyMSgxLCAyLCAzKQorICAgICAgICBkMjEoKigxLCAyLCAzKSkKKyAgICAgICAgZDIxKDEsICooMiwgMykpCisgICAgICAgIGQyMSgxLCAyLCAqKDMsKSkKKyAgICAgICAgZDIxKDEsIDIsICoqeydjJzozfSkKKyAgICAgICAgZGVmIGQwMihhPTEsIGI9Mik6IHBhc3MKKyAgICAgICAgZDAyKCkKKyAgICAgICAgZDAyKDEpCisgICAgICAgIGQwMigxLCAyKQorICAgICAgICBkMDIoKigxLCAyKSkKKyAgICAgICAgZDAyKDEsICooMiwpKQorICAgICAgICBkMDIoMSwgKip7J2InOjJ9KQorICAgICAgICBkMDIoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEyKGEsIGI9MSwgYz0yKTogcGFzcworICAgICAgICBkMTIoMSkKKyAgICAgICAgZDEyKDEsIDIpCisgICAgICAgIGQxMigxLCAyLCAzKQorICAgICAgICBkZWYgZDIyKGEsIGIsIGM9MSwgZD0yKTogcGFzcworICAgICAgICBkMjIoMSwgMikKKyAgICAgICAgZDIyKDEsIDIsIDMpCisgICAgICAgIGQyMigxLCAyLCAzLCA0KQorICAgICAgICBkZWYgZDAxdihhPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMDF2KCkKKyAgICAgICAgZDAxdigxKQorICAgICAgICBkMDF2KDEsIDIpCisgICAgICAgIGQwMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDAxdigqKDEsKSkKKyAgICAgICAgZDAxdigqKnsnYSc6Mn0pCisgICAgICAgIGRlZiBkMTF2KGEsIGI9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMXYoMSkKKyAgICAgICAgZDExdigxLCAyKQorICAgICAgICBkMTF2KDEsIDIsIDMpCisgICAgICAgIGRlZiBkMjF2KGEsIGIsIGM9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQyMXYoMSwgMikKKyAgICAgICAgZDIxdigxLCAyLCAzKQorICAgICAgICBkMjF2KDEsIDIsIDMsIDQpCisgICAgICAgIGQyMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDIxdigxLCAyLCAqKnsnYyc6IDN9KQorICAgICAgICBkZWYgZDAydihhPTEsIGI9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQwMnYoKQorICAgICAgICBkMDJ2KDEpCisgICAgICAgIGQwMnYoMSwgMikKKyAgICAgICAgZDAydigxLCAyLCAzKQorICAgICAgICBkMDJ2KDEsICooMiwgMywgNCkpCisgICAgICAgIGQwMnYoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEydihhLCBiPTEsIGM9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMnYoMSkKKyAgICAgICAgZDEydigxLCAyKQorICAgICAgICBkMTJ2KDEsIDIsIDMpCisgICAgICAgIGQxMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDEydigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMTJ2KDEsIDIsICooMywgNCwgNSkpCisgICAgICAgIGQxMnYoMSwgKigyLCksICoqeydjJzogM30pCisgICAgICAgIGRlZiBkMjJ2KGEsIGIsIGM9MSwgZD0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDIydigxLCAyKQorICAgICAgICBkMjJ2KDEsIDIsIDMpCisgICAgICAgIGQyMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDIydigxLCAyLCAzLCA0LCA1KQorICAgICAgICBkMjJ2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQyMnYoMSwgMiwgKigzLCA0LCA1KSkKKyAgICAgICAgZDIydigxLCAqKDIsIDMpLCAqKnsnZCc6IDR9KQorCisgICAgICAgICMga2V5d29yZCBhcmd1bWVudCB0eXBlIHRlc3RzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0cigneCcsICoqe2InZm9vJzoxIH0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0J5dGVzIHNob3VsZCBub3Qgd29yayBhcyBrZXl3b3JkIGFyZ3VtZW50IG5hbWVzJykKKyAgICAgICAgIyBrZXl3b3JkIG9ubHkgYXJndW1lbnQgdGVzdHMKKyAgICAgICAgZGVmIHBvczBrZXkxKCosIGtleSk6IHJldHVybiBrZXkKKyAgICAgICAgcG9zMGtleTEoa2V5PTEwMCkKKyAgICAgICAgZGVmIHBvczJrZXkyKHAxLCBwMiwgKiwgazEsIGsyPTEwMCk6IHJldHVybiBwMSxwMixrMSxrMgorICAgICAgICBwb3Mya2V5MigxLCAyLCBrMT0xMDApCisgICAgICAgIHBvczJrZXkyKDEsIDIsIGsxPTEwMCwgazI9MjAwKQorICAgICAgICBwb3Mya2V5MigxLCAyLCBrMj0xMDAsIGsxPTIwMCkKKyAgICAgICAgZGVmIHBvczJrZXkyZGljdChwMSwgcDIsICosIGsxPTEwMCwgazIsICoqa3dhcmcpOiByZXR1cm4gcDEscDIsazEsazIsa3dhcmcKKyAgICAgICAgcG9zMmtleTJkaWN0KDEsMixrMj0xMDAsdG9rd2FyZzE9MTAwLHRva3dhcmcyPTIwMCkKKyAgICAgICAgcG9zMmtleTJkaWN0KDEsMix0b2t3YXJnMT0xMDAsdG9rd2FyZzI9MjAwLCBrMj0xMDApCisKKyAgICAgICAgIyBrZXl3b3JkIGFyZ3VtZW50cyBhZnRlciAqYXJnbGlzdAorICAgICAgICBkZWYgZigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIGFyZ3MsIGt3YXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmKDEsIHg9MiwgKlszLCA0XSwgeT01KSwgKCgxLCAzLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3gnOjIsICd5Jzo1fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZigxLCAqKDIsMyksIDQpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJmKDEsIHg9MiwgKigzLDQpLCB4PTUpIikKKworICAgICAgICAjIGFyZ3VtZW50IGFubm90YXRpb24gdGVzdHMKKyAgICAgICAgZGVmIGYoeCkgLT4gbGlzdDogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeydyZXR1cm4nOiBsaXN0fSkKKyAgICAgICAgZGVmIGYoeDppbnQpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLCB7J3gnOiBpbnR9KQorICAgICAgICBkZWYgZigqeDpzdHIpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLCB7J3gnOiBzdHJ9KQorICAgICAgICBkZWYgZigqKng6ZmxvYXQpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLCB7J3gnOiBmbG9hdH0pCisgICAgICAgIGRlZiBmKHgsIHk6MSsyKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeyd5JzogM30pCisgICAgICAgIGRlZiBmKGEsIGI6MSwgYzoyLCBkKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLl9fYW5ub3RhdGlvbnNfXywgeydiJzogMSwgJ2MnOiAyfSkKKyAgICAgICAgZGVmIGYoYSwgYjoxLCBjOjIsIGQsIGU6Mz00LCBmPTUsICpnOjYpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYuX19hbm5vdGF0aW9uc19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICB7J2InOiAxLCAnYyc6IDIsICdlJzogMywgJ2cnOiA2fSkKKyAgICAgICAgZGVmIGYoYSwgYjoxLCBjOjIsIGQsIGU6Mz00LCBmPTUsICpnOjYsIGg6NywgaT04LCBqOjk9MTAsCisgICAgICAgICAgICAgICoqazoxMSkgLT4gMTI6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5fX2Fubm90YXRpb25zX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYic6IDEsICdjJzogMiwgJ2UnOiAzLCAnZyc6IDYsICdoJzogNywgJ2onOiA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2snOiAxMSwgJ3JldHVybic6IDEyfSkKKyAgICAgICAgIyBDaGVjayBmb3IgU0YgQnVnICMxNjk3MjQ4IC0gbWl4aW5nIGRlY29yYXRvcnMgYW5kIGEgcmV0dXJuIGFubm90YXRpb24KKyAgICAgICAgZGVmIG51bGwoeCk6IHJldHVybiB4CisgICAgICAgIEBudWxsCisgICAgICAgIGRlZiBmKHgpIC0+IGxpc3Q6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5fX2Fubm90YXRpb25zX18sIHsncmV0dXJuJzogbGlzdH0pCisKKyAgICAgICAgIyB0ZXN0IE1BS0VfQ0xPU1VSRSB3aXRoIGEgdmFyaWV0eSBvZiBvcGFyZydzCisgICAgICAgIGNsb3N1cmUgPSAxCisgICAgICAgIGRlZiBmKCk6IHJldHVybiBjbG9zdXJlCisgICAgICAgIGRlZiBmKHg9MSk6IHJldHVybiBjbG9zdXJlCisgICAgICAgIGRlZiBmKCosIGs9MSk6IHJldHVybiBjbG9zdXJlCisgICAgICAgIGRlZiBmKCkgLT4gaW50OiByZXR1cm4gY2xvc3VyZQorCisgICAgICAgICMgQ2hlY2sgYXN0IGVycm9ycyBpbiAqYXJncyBhbmQgKmt3YXJncworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKmcoMT0yKSkiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImYoKipnKDE9MikpIikKKworICAgIGRlZiB0ZXN0TGFtYmRlZihzZWxmKToKKyAgICAgICAgIyMjIGxhbWJkZWY6ICdsYW1iZGEnIFt2YXJhcmdzbGlzdF0gJzonIHRlc3QKKyAgICAgICAgbDEgPSBsYW1iZGEgOiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGwxKCksIDApCisgICAgICAgIGwyID0gbGFtYmRhIDogYVtkXSAjIFhYWCBqdXN0IHRlc3RpbmcgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgbDMgPSBsYW1iZGEgOiBbMiA8IHggZm9yIHggaW4gWy0xLCAzLCAwXV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDMoKSwgWzAsIDEsIDBdKQorICAgICAgICBsNCA9IGxhbWJkYSB4ID0gbGFtYmRhIHkgPSBsYW1iZGEgej0xIDogeiA6IHkoKSA6IHgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNCgpLCAxKQorICAgICAgICBsNSA9IGxhbWJkYSB4LCB5LCB6PTI6IHggKyB5ICsgegorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsNSgxLCAyKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDUoMSwgMiwgMyksIDYpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAibGFtYmRhIHg6IHggPSAyIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJsYW1iZGEgKE5vbmUsKTogTm9uZSIpCisgICAgICAgIGw2ID0gbGFtYmRhIHgsIHksICosIGs9MjA6IHgreStrCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGw2KDEsMiksIDErMisyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobDYoMSwyLGs9MTApLCAxKzIrMTApCisKKworICAgICMjIyBzdG10OiBzaW1wbGVfc3RtdCB8IGNvbXBvdW5kX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RTaW1wbGVTdG10KHNlbGYpOgorICAgICAgICAjIyMgc2ltcGxlX3N0bXQ6IHNtYWxsX3N0bXQgKCc7JyBzbWFsbF9zdG10KSogWyc7J10KKyAgICAgICAgeCA9IDE7IHBhc3M7IGRlbCB4CisgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICMgdmVyaWZ5IHN0YXRlbWVudHMgdGhhdCBlbmQgd2l0aCBzZW1pLWNvbG9ucworICAgICAgICAgICAgeCA9IDE7IHBhc3M7IGRlbCB4OworICAgICAgICBmb28oKQorCisgICAgIyMjIHNtYWxsX3N0bXQ6IGV4cHJfc3RtdCB8IHBhc3Nfc3RtdCB8IGRlbF9zdG10IHwgZmxvd19zdG10IHwgaW1wb3J0X3N0bXQgfCBnbG9iYWxfc3RtdCB8IGFjY2Vzc19zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0RXhwclN0bXQoc2VsZik6CisgICAgICAgICMgKGV4cHJsaXN0ICc9JykqIGV4cHJsaXN0CisgICAgICAgIDEKKyAgICAgICAgMSwgMiwgMworICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSwgMiwgMworICAgICAgICB4ID0geSA9IHogPSAxLCAyLCAzCisgICAgICAgIHgsIHksIHogPSAxLCAyLCAzCisgICAgICAgIGFiYyA9IGEsIGIsIGMgPSB4LCB5LCB6ID0geHl6ID0gMSwgMiwgKDMsIDQpCisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJ4ICsgMSA9IDEiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImEgKyAxID0gYiArIDIiKQorCisgICAgZGVmIHRlc3REZWxTdG10KHNlbGYpOgorICAgICAgICAjICdkZWwnIGV4cHJsaXN0CisgICAgICAgIGFiYyA9IFsxLDIsM10KKyAgICAgICAgeCwgeSwgeiA9IGFiYworICAgICAgICB4eXogPSB4LCB5LCB6CisKKyAgICAgICAgZGVsIGFiYworICAgICAgICBkZWwgeCwgeSwgKHosIHh5eikKKworICAgIGRlZiB0ZXN0UGFzc1N0bXQoc2VsZik6CisgICAgICAgICMgJ3Bhc3MnCisgICAgICAgIHBhc3MKKworICAgICMgZmxvd19zdG10OiBicmVha19zdG10IHwgY29udGludWVfc3RtdCB8IHJldHVybl9zdG10IHwgcmFpc2Vfc3RtdAorICAgICMgVGVzdGVkIGJlbG93CisKKyAgICBkZWYgdGVzdEJyZWFrU3RtdChzZWxmKToKKyAgICAgICAgIyAnYnJlYWsnCisgICAgICAgIHdoaWxlIDE6IGJyZWFrCisKKyAgICBkZWYgdGVzdENvbnRpbnVlU3RtdChzZWxmKToKKyAgICAgICAgIyAnY29udGludWUnCisgICAgICAgIGkgPSAxCisgICAgICAgIHdoaWxlIGk6IGkgPSAwOyBjb250aW51ZQorCisgICAgICAgIG1zZyA9ICIiCisgICAgICAgIHdoaWxlIG5vdCBtc2c6CisgICAgICAgICAgICBtc2cgPSAib2siCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBtc2cgPSAiY29udGludWUgZmFpbGVkIHRvIGNvbnRpbnVlIGluc2lkZSB0cnkiCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgbXNnID0gImNvbnRpbnVlIGluc2lkZSB0cnkgY2FsbGVkIGV4Y2VwdCBibG9jayIKKyAgICAgICAgaWYgbXNnICE9ICJvayI6CisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorCisgICAgICAgIG1zZyA9ICIiCisgICAgICAgIHdoaWxlIG5vdCBtc2c6CisgICAgICAgICAgICBtc2cgPSAiZmluYWxseSBibG9jayBub3QgY2FsbGVkIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG1zZyA9ICJvayIKKyAgICAgICAgaWYgbXNnICE9ICJvayI6CisgICAgICAgICAgICBzZWxmLmZhaWwobXNnKQorCisgICAgZGVmIHRlc3RfYnJlYWtfY29udGludWVfbG9vcChzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3Qgd2FycmFudHMgYW4gZXhwbGFuYXRpb24uIEl0IGlzIGEgdGVzdCBzcGVjaWZpY2FsbHkgZm9yIFNGIGJ1Z3MKKyAgICAgICAgIyAjNDYzMzU5IGFuZCAjNDYyOTM3LiBUaGUgYnVnIGlzIHRoYXQgYSAnYnJlYWsnIHN0YXRlbWVudCBleGVjdXRlZCBvcgorICAgICAgICAjIGV4Y2VwdGlvbiByYWlzZWQgaW5zaWRlIGEgdHJ5L2V4Y2VwdCBpbnNpZGUgYSBsb29wLCAqYWZ0ZXIqIGEgY29udGludWUKKyAgICAgICAgIyBzdGF0ZW1lbnQgaGFzIGJlZW4gZXhlY3V0ZWQgaW4gdGhhdCBsb29wLCB3aWxsIGNhdXNlIHRoZSB3cm9uZyBudW1iZXIgb2YKKyAgICAgICAgIyBhcmd1bWVudHMgdG8gYmUgcG9wcGVkIG9mZiB0aGUgc3RhY2sgYW5kIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHJlc2V0IHRvCisgICAgICAgICMgYSB2ZXJ5IHNtYWxsIG51bWJlciAodXN1YWxseSAwLikgQmVjYXVzZSBvZiB0aGlzLCB0aGUgZm9sbG93aW5nIHRlc3QKKyAgICAgICAgIyAqbXVzdCogd3JpdHRlbiBhcyBhIGZ1bmN0aW9uLCBhbmQgdGhlIHRyYWNraW5nIHZhcnMgKm11c3QqIGJlIGZ1bmN0aW9uCisgICAgICAgICMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMuIE90aGVyd2lzZSwgdGhlIHRlc3Qgd2lsbCBsb29wIGFuZCBsb29wLgorCisgICAgICAgIGRlZiB0ZXN0X2lubmVyKGV4dHJhX2J1cm5pbmdfb2lsID0gMSwgY291bnQ9MCk6CisgICAgICAgICAgICBiaWdfaGlwcG8gPSAyCisgICAgICAgICAgICB3aGlsZSBiaWdfaGlwcG86CisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmFfYnVybmluZ19vaWwgYW5kIGJpZ19oaXBwbyA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfYnVybmluZ19vaWwgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgYmlnX2hpcHBvIC09IDEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBpZiBjb3VudCA+IDIgb3IgYmlnX2hpcHBvICE9IDE6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjb250aW51ZSB0aGVuIGJyZWFrIGluIHRyeS9leGNlcHQgaW4gbG9vcCBicm9rZW4hIikKKyAgICAgICAgdGVzdF9pbm5lcigpCisKKyAgICBkZWYgdGVzdFJldHVybihzZWxmKToKKyAgICAgICAgIyAncmV0dXJuJyBbdGVzdGxpc3RdCisgICAgICAgIGRlZiBnMSgpOiByZXR1cm4KKyAgICAgICAgZGVmIGcyKCk6IHJldHVybiAxCisgICAgICAgIGcxKCkKKyAgICAgICAgeCA9IGcyKCkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJjbGFzcyBmb286cmV0dXJuIDEiKQorCisgICAgZGVmIHRlc3RZaWVsZChzZWxmKToKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJjbGFzcyBmb286eWllbGQgMSIpCisKKyAgICBkZWYgdGVzdFJhaXNlKHNlbGYpOgorICAgICAgICAjICdyYWlzZScgdGVzdCBbJywnIHRlc3RdCisgICAgICAgIHRyeTogcmFpc2UgUnVudGltZUVycm9yKCdqdXN0IHRlc3RpbmcnKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOiBwYXNzCisgICAgICAgIHRyeTogcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OiBwYXNzCisKKyAgICBkZWYgdGVzdEltcG9ydChzZWxmKToKKyAgICAgICAgIyAnaW1wb3J0JyBkb3R0ZWRfYXNfbmFtZXMKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpbXBvcnQgdGltZSwgc3lzCisgICAgICAgICMgJ2Zyb20nIGRvdHRlZF9uYW1lICdpbXBvcnQnICgnKicgfCAnKCcgaW1wb3J0X2FzX25hbWVzICcpJyB8IGltcG9ydF9hc19uYW1lcykKKyAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgIGZyb20gdGltZSBpbXBvcnQgKHRpbWUpCisgICAgICAgICMgbm90IHRlc3RhYmxlIGluc2lkZSBhIGZ1bmN0aW9uLCBidXQgYWxyZWFkeSBkb25lIGF0IHRvcCBvZiB0aGUgbW9kdWxlCisgICAgICAgICMgZnJvbSBzeXMgaW1wb3J0ICoKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IHBhdGgsIGFyZ3YKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2KQorICAgICAgICBmcm9tIHN5cyBpbXBvcnQgKHBhdGgsIGFyZ3YsKQorCisgICAgZGVmIHRlc3RHbG9iYWwoc2VsZik6CisgICAgICAgICMgJ2dsb2JhbCcgTkFNRSAoJywnIE5BTUUpKgorICAgICAgICBnbG9iYWwgYQorICAgICAgICBnbG9iYWwgYSwgYgorICAgICAgICBnbG9iYWwgb25lLCB0d28sIHRocmVlLCBmb3VyLCBmaXZlLCBzaXgsIHNldmVuLCBlaWdodCwgbmluZSwgdGVuCisKKyAgICBkZWYgdGVzdE5vbmxvY2FsKHNlbGYpOgorICAgICAgICAjICdub25sb2NhbCcgTkFNRSAoJywnIE5BTUUpKgorICAgICAgICB4ID0gMAorICAgICAgICB5ID0gMAorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgbm9ubG9jYWwgeAorICAgICAgICAgICAgbm9ubG9jYWwgeCwgeQorCisgICAgZGVmIHRlc3RBc3NlcnQoc2VsZik6CisgICAgICAgICMgYXNzZXJ0X3N0bXQ6ICdhc3NlcnQnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICBhc3NlcnQgMQorICAgICAgICBhc3NlcnQgMSwgMQorICAgICAgICBhc3NlcnQgbGFtYmRhIHg6eAorICAgICAgICBhc3NlcnQgMSwgbGFtYmRhIHg6eCsxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCAwLCAibXNnIgorICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGUuYXJnc1swXSwgIm1zZyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJBc3NlcnRpb25FcnJvciBub3QgcmFpc2VkIGJ5IGFzc2VydCAwIikKKworICAgICMjIyBjb21wb3VuZF9zdG10OiBpZl9zdG10IHwgd2hpbGVfc3RtdCB8IGZvcl9zdG10IHwgdHJ5X3N0bXQgfCBmdW5jZGVmIHwgY2xhc3NkZWYKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RJZihzZWxmKToKKyAgICAgICAgIyAnaWYnIHRlc3QgJzonIHN1aXRlICgnZWxpZicgdGVzdCAnOicgc3VpdGUpKiBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGVsc2U6IHBhc3MKKyAgICAgICAgaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisKKyAgICBkZWYgdGVzdFdoaWxlKHNlbGYpOgorICAgICAgICAjICd3aGlsZScgdGVzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIHdoaWxlIDA6IHBhc3MKKyAgICAgICAgd2hpbGUgMDogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisKKyAgICAgICAgIyBJc3N1ZTE5MjA6ICJ3aGlsZSAwIiBpcyBvcHRpbWl6ZWQgYXdheSwKKyAgICAgICAgIyBlbnN1cmUgdGhhdCB0aGUgImVsc2UiIGNsYXVzZSBpcyBzdGlsbCBwcmVzZW50LgorICAgICAgICB4ID0gMAorICAgICAgICB3aGlsZSAwOgorICAgICAgICAgICAgeCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHggPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIDIpCisKKyAgICBkZWYgdGVzdEZvcihzZWxmKToKKyAgICAgICAgIyAnZm9yJyBleHBybGlzdCAnaW4nIGV4cHJsaXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgZm9yIGkgaW4gMSwgMiwgMzogcGFzcworICAgICAgICBmb3IgaSwgaiwgayBpbiAoKTogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIGNsYXNzIFNxdWFyZXM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4KToKKyAgICAgICAgICAgICAgICBzZWxmLm1heCA9IG1heAorICAgICAgICAgICAgICAgIHNlbGYuc29mYXIgPSBbXQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zb2ZhcikKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBub3QgMCA8PSBpIDwgc2VsZi5tYXg6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICBuID0gbGVuKHNlbGYuc29mYXIpCisgICAgICAgICAgICAgICAgd2hpbGUgbiA8PSBpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvZmFyLmFwcGVuZChuKm4pCisgICAgICAgICAgICAgICAgICAgIG4gPSBuKzEKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb2ZhcltpXQorICAgICAgICBuID0gMAorICAgICAgICBmb3IgeCBpbiBTcXVhcmVzKDEwKTogbiA9IG4reAorICAgICAgICBpZiBuICE9IDI4NToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZm9yIG92ZXIgZ3Jvd2luZyBzZXF1ZW5jZScpCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIHgsIGluIFsoMSwpLCAoMiwpLCAoMywpXToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsxLCAyLCAzXSkKKworICAgIGRlZiB0ZXN0VHJ5KHNlbGYpOgorICAgICAgICAjIyMgdHJ5X3N0bXQ6ICd0cnknICc6JyBzdWl0ZSAoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgIyMjICAgICAgICAgfCAndHJ5JyAnOicgc3VpdGUgJ2ZpbmFsbHknICc6JyBzdWl0ZQorICAgICAgICAjIyMgZXhjZXB0X2NsYXVzZTogJ2V4Y2VwdCcgW2V4cHIgWydhcycgZXhwcl1dCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEvMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeTogMS8wCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjogcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIG1zZzogcGFzcworICAgICAgICBleGNlcHQgUnVudGltZUVycm9yIGFzIG1zZzogcGFzcworICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKTogcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKSBhcyBtc2c6IHBhc3MKKyAgICAgICAgdHJ5OiBwYXNzCisgICAgICAgIGZpbmFsbHk6IHBhc3MKKworICAgIGRlZiB0ZXN0U3VpdGUoc2VsZik6CisgICAgICAgICMgc2ltcGxlX3N0bXQgfCBORVdMSU5FIElOREVOVCBORVdMSU5FKiAoc3RtdCBORVdMSU5FKikrIERFREVOVAorICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCisgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjCisKKyAgICBkZWYgdGVzdFRlc3Qoc2VsZik6CisgICAgICAgICMjIyBhbmRfdGVzdCAoJ29yJyBhbmRfdGVzdCkqCisgICAgICAgICMjIyBhbmRfdGVzdDogbm90X3Rlc3QgKCdhbmQnIG5vdF90ZXN0KSoKKyAgICAgICAgIyMjIG5vdF90ZXN0OiAnbm90JyBub3RfdGVzdCB8IGNvbXBhcmlzb24KKyAgICAgICAgaWYgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIG9yIDE6IHBhc3MKKyAgICAgICAgaWYgbm90IG5vdCBub3QgMTogcGFzcworICAgICAgICBpZiBub3QgMSBhbmQgMSBhbmQgMTogcGFzcworICAgICAgICBpZiAxIGFuZCAxIG9yIDEgYW5kIDEgYW5kIDEgb3Igbm90IDEgYW5kIDE6IHBhc3MKKworICAgIGRlZiB0ZXN0Q29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgIyMjIGNvbXBhcmlzb246IGV4cHIgKGNvbXBfb3AgZXhwcikqCisgICAgICAgICMjIyBjb21wX29wOiAnPCd8Jz4nfCc9PSd8Jz49J3wnPD0nfCchPSd8J2luJ3wnbm90JyAnaW4nfCdpcyd8J2lzJyAnbm90JworICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIHggPSAoMSA9PSAxKQorICAgICAgICBpZiAxID09IDE6IHBhc3MKKyAgICAgICAgaWYgMSAhPSAxOiBwYXNzCisgICAgICAgIGlmIDEgPCAxOiBwYXNzCisgICAgICAgIGlmIDEgPiAxOiBwYXNzCisgICAgICAgIGlmIDEgPD0gMTogcGFzcworICAgICAgICBpZiAxID49IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpcyAxOiBwYXNzCisgICAgICAgIGlmIDEgaXMgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpbiAoKTogcGFzcworICAgICAgICBpZiAxIG5vdCBpbiAoKTogcGFzcworICAgICAgICBpZiAxIDwgMSA+IDEgPT0gMSA+PSAxIDw9IDEgIT0gMSBpbiAxIG5vdCBpbiAxIGlzIDEgaXMgbm90IDE6IHBhc3MKKworICAgIGRlZiB0ZXN0QmluYXJ5TWFza09wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgJiAxCisgICAgICAgIHggPSAxIF4gMQorICAgICAgICB4ID0gMSB8IDEKKworICAgIGRlZiB0ZXN0U2hpZnRPcHMoc2VsZik6CisgICAgICAgIHggPSAxIDw8IDEKKyAgICAgICAgeCA9IDEgPj4gMQorICAgICAgICB4ID0gMSA8PCAxID4+IDEKKworICAgIGRlZiB0ZXN0QWRkaXRpdmVPcHMoc2VsZik6CisgICAgICAgIHggPSAxCisgICAgICAgIHggPSAxICsgMQorICAgICAgICB4ID0gMSAtIDEgLSAxCisgICAgICAgIHggPSAxIC0gMSArIDEgLSAxICsgMQorCisgICAgZGVmIHRlc3RNdWx0aXBsaWNhdGl2ZU9wcyhzZWxmKToKKyAgICAgICAgeCA9IDEgKiAxCisgICAgICAgIHggPSAxIC8gMQorICAgICAgICB4ID0gMSAlIDEKKyAgICAgICAgeCA9IDEgLyAxICogMSAlIDEKKworICAgIGRlZiB0ZXN0VW5hcnlPcHMoc2VsZik6CisgICAgICAgIHggPSArMQorICAgICAgICB4ID0gLTEKKyAgICAgICAgeCA9IH4xCisgICAgICAgIHggPSB+MSBeIDEgJiAxIHwgMSAmIDEgXiAtMQorICAgICAgICB4ID0gLTEqMS8xICsgMSoxIC0gLS0tMSoxCisKKyAgICBkZWYgdGVzdFNlbGVjdG9ycyhzZWxmKToKKyAgICAgICAgIyMjIHRyYWlsZXI6ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBzdWJzY3JpcHQgJ10nIHwgJy4nIE5BTUUKKyAgICAgICAgIyMjIHN1YnNjcmlwdDogZXhwciB8IFtleHByXSAnOicgW2V4cHJdCisKKyAgICAgICAgaW1wb3J0IHN5cywgdGltZQorICAgICAgICBjID0gc3lzLnBhdGhbMF0KKyAgICAgICAgeCA9IHRpbWUudGltZSgpCisgICAgICAgIHggPSBzeXMubW9kdWxlc1sndGltZSddLnRpbWUoKQorICAgICAgICBhID0gJzAxMjM0JworICAgICAgICBjID0gYVswXQorICAgICAgICBjID0gYVstMV0KKyAgICAgICAgcyA9IGFbMDo1XQorICAgICAgICBzID0gYVs6NV0KKyAgICAgICAgcyA9IGFbMDpdCisgICAgICAgIHMgPSBhWzpdCisgICAgICAgIHMgPSBhWy01Ol0KKyAgICAgICAgcyA9IGFbOi0xXQorICAgICAgICBzID0gYVstNDotM10KKyAgICAgICAgIyBBIHJvdWdoIHRlc3Qgb2YgU0YgYnVnIDEzMzM5ODIuICBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMzMzOTgyCisgICAgICAgICMgVGhlIHRlc3RpbmcgaGVyZSBpcyBmYWlybHkgaW5jb21wbGV0ZS4KKyAgICAgICAgIyBUZXN0IGNhc2VzIHNob3VsZCBpbmNsdWRlOiBjb21tYXMgd2l0aCAxIGFuZCAyIGNvbG9ucworICAgICAgICBkID0ge30KKyAgICAgICAgZFsxXSA9IDEKKyAgICAgICAgZFsxLF0gPSAyCisgICAgICAgIGRbMSwyXSA9IDMKKyAgICAgICAgZFsxLDIsM10gPSA0CisgICAgICAgIEwgPSBsaXN0KGQpCisgICAgICAgIEwuc29ydChrZXk9bGFtYmRhIHg6IHggaWYgaXNpbnN0YW5jZSh4LCB0dXBsZSkgZWxzZSAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3RyKEwpLCAnWzEsICgxLCksICgxLCAyKSwgKDEsIDIsIDMpXScpCisKKyAgICBkZWYgdGVzdEF0b21zKHNlbGYpOgorICAgICAgICAjIyMgYXRvbTogJygnIFt0ZXN0bGlzdF0gJyknIHwgJ1snIFt0ZXN0bGlzdF0gJ10nIHwgJ3snIFtkaWN0c2V0bWFrZXJdICd9JyB8IE5BTUUgfCBOVU1CRVIgfCBTVFJJTkcKKyAgICAgICAgIyMjIGRpY3RzZXRtYWtlcjogKHRlc3QgJzonIHRlc3QgKCcsJyB0ZXN0ICc6JyB0ZXN0KSogWycsJ10pIHwgKHRlc3QgKCcsJyB0ZXN0KSogWycsJ10pCisKKyAgICAgICAgeCA9ICgxKQorICAgICAgICB4ID0gKDEgb3IgMiBvciAzKQorICAgICAgICB4ID0gKDEgb3IgMiBvciAzLCAyLCAzKQorCisgICAgICAgIHggPSBbXQorICAgICAgICB4ID0gWzFdCisgICAgICAgIHggPSBbMSBvciAyIG9yIDNdCisgICAgICAgIHggPSBbMSBvciAyIG9yIDMsIDIsIDNdCisgICAgICAgIHggPSBbXQorCisgICAgICAgIHggPSB7fQorICAgICAgICB4ID0geydvbmUnOiAxfQorICAgICAgICB4ID0geydvbmUnOiAxLH0KKyAgICAgICAgeCA9IHsnb25lJyBvciAndHdvJzogMSBvciAyfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMn0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsfQorICAgICAgICB4ID0geydvbmUnOiAxLCAndHdvJzogMiwgJ3RocmVlJzogMywgJ2ZvdXInOiA0LCAnZml2ZSc6IDUsICdzaXgnOiA2fQorCisgICAgICAgIHggPSB7J29uZSd9CisgICAgICAgIHggPSB7J29uZScsIDEsfQorICAgICAgICB4ID0geydvbmUnLCAndHdvJywgJ3RocmVlJ30KKyAgICAgICAgeCA9IHsyLCAzLCA0LH0KKworICAgICAgICB4ID0geAorICAgICAgICB4ID0gJ3gnCisgICAgICAgIHggPSAxMjMKKworICAgICMjIyBleHBybGlzdDogZXhwciAoJywnIGV4cHIpKiBbJywnXQorICAgICMjIyB0ZXN0bGlzdDogdGVzdCAoJywnIHRlc3QpKiBbJywnXQorICAgICMgVGhlc2UgaGF2ZSBiZWVuIGV4ZXJjaXNlZCBlbm91Z2ggYWJvdmUKKworICAgIGRlZiB0ZXN0Q2xhc3NkZWYoc2VsZik6CisgICAgICAgICMgJ2NsYXNzJyBOQU1FIFsnKCcgW3Rlc3RsaXN0XSAnKSddICc6JyBzdWl0ZQorICAgICAgICBjbGFzcyBCOiBwYXNzCisgICAgICAgIGNsYXNzIEIyKCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQzEoQik6IHBhc3MKKyAgICAgICAgY2xhc3MgQzIoQik6IHBhc3MKKyAgICAgICAgY2xhc3MgRChDMSwgQzIsIEIpOiBwYXNzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgbWV0aDEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBtZXRoMihzZWxmLCBhcmcpOiBwYXNzCisgICAgICAgICAgICBkZWYgbWV0aDMoc2VsZiwgYTEsIGEyKTogcGFzcworCisgICAgICAgICMgZGVjb3JhdG9yOiAnQCcgZG90dGVkX25hbWUgWyAnKCcgW2FyZ2xpc3RdICcpJyBdIE5FV0xJTkUKKyAgICAgICAgIyBkZWNvcmF0b3JzOiBkZWNvcmF0b3IrCisgICAgICAgICMgZGVjb3JhdGVkOiBkZWNvcmF0b3JzIChjbGFzc2RlZiB8IGZ1bmNkZWYpCisgICAgICAgIGRlZiBjbGFzc19kZWNvcmF0b3IoeCk6IHJldHVybiB4CisgICAgICAgIEBjbGFzc19kZWNvcmF0b3IKKyAgICAgICAgY2xhc3MgRzogcGFzcworCisgICAgZGVmIHRlc3REaWN0Y29tcHMoc2VsZik6CisgICAgICAgICMgZGljdG9yc2V0bWFrZXI6ICggKHRlc3QgJzonIHRlc3QgKGNvbXBfZm9yIHwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcsJyB0ZXN0ICc6JyB0ZXN0KSogWycsJ10pKSB8CisgICAgICAgICMgICAgICAgICAgICAgICAgICAgKHRlc3QgKGNvbXBfZm9yIHwgKCcsJyB0ZXN0KSogWycsJ10pKSApCisgICAgICAgIG51bXMgPSBbMSwgMiwgM10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7aTppKzEgZm9yIGkgaW4gbnVtc30sIHsxOiAyLCAyOiAzLCAzOiA0fSkKKworICAgIGRlZiB0ZXN0TGlzdGNvbXBzKHNlbGYpOgorICAgICAgICAjIGxpc3QgY29tcHJlaGVuc2lvbiB0ZXN0cworICAgICAgICBudW1zID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIHN0cnMgPSBbIkFwcGxlIiwgIkJhbmFuYSIsICJDb2NvbnV0Il0KKyAgICAgICAgc3BjcyA9IFsiICBBcHBsZSIsICIgQmFuYW5hICIsICJDb2NvICBudXQgICJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcy5zdHJpcCgpIGZvciBzIGluIHNwY3NdLCBbJ0FwcGxlJywgJ0JhbmFuYScsICdDb2NvICBudXQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbMyAqIHggZm9yIHggaW4gbnVtc10sIFszLCA2LCA5LCAxMiwgMTVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFt4IGZvciB4IGluIG51bXMgaWYgeCA+IDJdLCBbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIHN0cnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0FwcGxlJyksICgxLCAnQmFuYW5hJyksICgxLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ0FwcGxlJyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0FwcGxlJyksICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ0FwcGxlJyksICg0LCAnQmFuYW5hJyksICg0LCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ0FwcGxlJyksICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGksIHMpIGZvciBpIGluIG51bXMgZm9yIHMgaW4gW2YgZm9yIGYgaW4gc3RycyBpZiAibiIgaW4gZl1dLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwgKDIsICdCYW5hbmEnKSwgKDIsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnQmFuYW5hJyksICgzLCAnQ29jb251dCcpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdCYW5hbmEnKSwgKDUsICdDb2NvbnV0JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsobGFtYmRhIGE6W2EqKmkgZm9yIGkgaW4gcmFuZ2UoYSsxKV0pKGopIGZvciBqIGluIHJhbmdlKDUpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbWzFdLCBbMSwgMV0sIFsxLCAyLCA0XSwgWzEsIDMsIDksIDI3XSwgWzEsIDQsIDE2LCA2NCwgMjU2XV0pCisKKyAgICAgICAgZGVmIHRlc3RfaW5fZnVuYyhsKToKKyAgICAgICAgICAgIHJldHVybiBbMCA8IHggPCAzIGZvciB4IGluIGwgaWYgeCA+IDJdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2luX2Z1bmMobnVtcyksIFtGYWxzZSwgRmFsc2UsIEZhbHNlXSkKKworICAgICAgICBkZWYgdGVzdF9uZXN0ZWRfZnJvbnQoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW1t5IGZvciB5IGluIFt4LCB4ICsgMV1dIGZvciB4IGluIFsxLDMsNV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWzEsIDJdLCBbMywgNF0sIFs1LCA2XV0pCisKKyAgICAgICAgdGVzdF9uZXN0ZWRfZnJvbnQoKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW2ksIHMgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiW3ggaWYgeV0iKQorCisgICAgICAgIHN1cHBsaWVycyA9IFsKKyAgICAgICAgICAoMSwgIkJvZWluZyIpLAorICAgICAgICAgICgyLCAiRm9yZCIpLAorICAgICAgICAgICgzLCAiTWFjZG9uYWxkcyIpCisgICAgICAgIF0KKworICAgICAgICBwYXJ0cyA9IFsKKyAgICAgICAgICAoMTAsICJBaXJsaW5lciIpLAorICAgICAgICAgICgyMCwgIkVuZ2luZSIpLAorICAgICAgICAgICgzMCwgIkNoZWVzZWJ1cmdlciIpCisgICAgICAgIF0KKworICAgICAgICBzdXBwYXJ0ID0gWworICAgICAgICAgICgxLCAxMCksICgxLCAyMCksICgyLCAyMCksICgzLCAzMCkKKyAgICAgICAgXQorCisgICAgICAgIHggPSBbCisgICAgICAgICAgKHNuYW1lLCBwbmFtZSkKKyAgICAgICAgICAgIGZvciAoc25vLCBzbmFtZSkgaW4gc3VwcGxpZXJzCisgICAgICAgICAgICAgIGZvciAocG5vLCBwbmFtZSkgaW4gcGFydHMKKyAgICAgICAgICAgICAgICBmb3IgKHNwX3Nubywgc3BfcG5vKSBpbiBzdXBwYXJ0CisgICAgICAgICAgICAgICAgICBpZiBzbm8gPT0gc3Bfc25vIGFuZCBwbm8gPT0gc3BfcG5vCisgICAgICAgIF0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIFsoJ0JvZWluZycsICdBaXJsaW5lcicpLCAoJ0JvZWluZycsICdFbmdpbmUnKSwgKCdGb3JkJywgJ0VuZ2luZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ01hY2RvbmFsZHMnLCAnQ2hlZXNlYnVyZ2VyJyldKQorCisgICAgZGVmIHRlc3RHZW5leHBzKHNlbGYpOgorICAgICAgICAjIGdlbmVyYXRvciBleHByZXNzaW9uIHRlc3RzCisgICAgICAgIGcgPSAoW3ggZm9yIHggaW4gcmFuZ2UoMTApXSBmb3IgeCBpbiByYW5nZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGcpLCBbeCBmb3IgeCBpbiByYW5nZSgxMCldKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0KGcpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uJykKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYSA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZyA9IChhIGZvciBkIGluIGEpCisgICAgICAgICAgICBuZXh0KGcpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFR5cGVFcnJvcicpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWJjZCcgZm9yIHkgaW4gJ2FiY2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eScpLCBbKHgsIHkpIGZvciB4IGluICdhYicgZm9yIHkgaW4gJ3h5J10pCisKKyAgICAgICAgYSA9IFt4IGZvciB4IGluIHJhbmdlKDEwKV0KKyAgICAgICAgYiA9ICh4IGZvciB4IGluICh5IGZvciB5IGluIGEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShiKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHgqKjIgZm9yIHggaW4gcmFuZ2UoMTApKSwgc3VtKFt4KioyIGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KnggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMiksIHN1bShbeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiByYW5nZSgxMCkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSkpKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluIFt5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSldKSwgc3VtKFt4IGZvciB4IGluIHJhbmdlKDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4IGZvciB4IGluICh5IGZvciB5IGluICh6IGZvciB6IGluIHJhbmdlKDEwKSBpZiBUcnVlKSkgaWYgVHJ1ZSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkgaWYgRmFsc2UpIGlmIFRydWUpLCAwKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbyh4IGZvciB4IGluIHJhbmdlKDEwKSwgMTAwKSIpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiZm9vKDEwMCwgeCBmb3IgeCBpbiByYW5nZSgxMCkpIikKKworICAgIGRlZiB0ZXN0Q29tcHJlaGVuc2lvblNwZWNpYWxzKHNlbGYpOgorICAgICAgICAjIHRlc3QgZm9yIG91dG1vc3QgaXRlcmFibGUgcHJlY29tcHV0YXRpb24KKyAgICAgICAgeCA9IDEwOyBnID0gKGkgZm9yIGkgaW4gcmFuZ2UoeCkpOyB4ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGcpKSwgMTApCisKKyAgICAgICAgIyBUaGlzIHNob3VsZCBob2xkLCBzaW5jZSB3ZSdyZSBvbmx5IHByZWNvbXB1dGluZyBvdXRtb3N0IGl0ZXJhYmxlLgorICAgICAgICB4ID0gMTA7IHQgPSBGYWxzZTsgZyA9ICgoaSxqKSBmb3IgaSBpbiByYW5nZSh4KSBpZiB0IGZvciBqIGluIHJhbmdlKHgpKQorICAgICAgICB4ID0gNTsgdCA9IFRydWU7CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLGopIGZvciBpIGluIHJhbmdlKDEwKSBmb3IgaiBpbiByYW5nZSg1KV0sIGxpc3QoZykpCisKKyAgICAgICAgIyBHcmFtbWFyIGFsbG93cyBtdWx0aXBsZSBhZGphY2VudCAnaWYncyBpbiBsaXN0Y29tcHMgYW5kIGdlbmV4cHMsCisgICAgICAgICMgZXZlbiB0aG91Z2ggaXQncyBzaWxseS4gTWFrZSBzdXJlIGl0IHdvcmtzIChpZmVsc2UgYnJva2UgdGhpcy4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyBdLCBbMSwgNSwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyksIFsxLCA1LCA3XSkKKworICAgICAgICAjIHZlcmlmeSB1bnBhY2tpbmcgc2luZ2xlIGVsZW1lbnQgdHVwbGVzIGluIGxpc3Rjb21wL2dlbmV4cC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCwgaW4gWyg0LCksICg1LCksICg2LCldXSwgWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCwgaW4gWyg3LCksICg4LCksICg5LCldKSwgWzcsIDgsIDldKQorCisgICAgZGVmIHRlc3Rfd2l0aF9zdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIGNsYXNzIG1hbmFnZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICgxLCAyKQorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHg6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzICh4LCB5KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCksIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBtYW5hZ2VyKCkgYXMgeCwgbWFuYWdlcigpIGFzIHk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHgsIG1hbmFnZXIoKToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0SWZFbHNlRXhwcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmZWxzZSBleHByZXNzaW9ucyBpbiB2YXJpb3VzIGNhc2VzCisgICAgICAgIGRlZiBfY2hlY2tldmFsKG1zZywgcmV0KToKKyAgICAgICAgICAgICJoZWxwZXIgdG8gY2hlY2sgdGhhdCBldmFsdWF0aW9uIG9mIGV4cHJlc3Npb25zIGlzIGRvbmUgY29ycmVjdGx5IgorICAgICAgICAgICAgcHJpbnQoeCkKKyAgICAgICAgICAgIHJldHVybiByZXQKKworICAgICAgICAjIHRoZSBuZXh0IGxpbmUgaXMgbm90IGFsbG93ZWQgYW55bW9yZQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChbIHgoKSBmb3IgeCBpbiBsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UgaWYgeCgpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbIHgoKSBmb3IgeCBpbiAobGFtYmRhOiBUcnVlLCBsYW1iZGE6IEZhbHNlKSBpZiB4KCkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeChGYWxzZSkgZm9yIHggaW4gKGxhbWJkYSB4OiBGYWxzZSBpZiB4IGVsc2UgVHJ1ZSwgbGFtYmRhIHg6IFRydWUgaWYgeCBlbHNlIEZhbHNlKSBpZiB4KEZhbHNlKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDEiLCAwKSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKF9jaGVja2V2YWwoImNoZWNrIDIiLCAwKSBpZiAwIGVsc2UgNSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUgYW5kIDYgaWYgMCBlbHNlIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgoNSBhbmQgNikgaWYgMCBlbHNlIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg1IGFuZCAoNiBpZiAxIGVsc2UgMSkpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwIG9yIF9jaGVja2V2YWwoImNoZWNrIDMiLCAyKSBpZiAwIGVsc2UgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEgb3IgX2NoZWNrZXZhbCgiY2hlY2sgNCIsIDIpIGlmIDEgZWxzZSBfY2hlY2tldmFsKCJjaGVjayA1IiwgMykpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwIG9yIDUgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDYiLCAzKSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG5vdCA1IGlmIDEgZWxzZSAxKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG5vdCA1IGlmIDAgZWxzZSAxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiArIDEgaWYgMSBlbHNlIDIpLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IC0gMSBpZiAxIGVsc2UgMiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgKiAyIGlmIDEgZWxzZSA0KSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgLyAyIGlmIDEgZWxzZSAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiA8IDQgaWYgMCBlbHNlIDIpLCAyKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVG9rZW5UZXN0cywgR3JhbW1hclRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvcHl0cmVlX2lkZW1wb3RlbmN5LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3B5dHJlZV9pZGVtcG90ZW5jeS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNDNmN2U4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3B5dHJlZV9pZGVtcG90ZW5jeS5weQpAQCAtMCwwICsxLDkyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiTWFpbiBwcm9ncmFtIGZvciB0ZXN0aW5nIHRoZSBpbmZyYXN0cnVjdHVyZS4iIiIKKworX19hdXRob3JfXyA9ICJHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BweXRob24ub3JnPiIKKworIyBTdXBwb3J0IGltcG9ydHMgKG5lZWQgdG8gYmUgaW1wb3J0ZWQgZmlyc3QpCitmcm9tIC4gaW1wb3J0IHN1cHBvcnQKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgbG9nZ2luZworCisjIExvY2FsIGltcG9ydHMKK2Zyb20gLi4gaW1wb3J0IHB5dHJlZQoraW1wb3J0IHBnZW4yCitmcm9tIHBnZW4yIGltcG9ydCBkcml2ZXIKKworbG9nZ2luZy5iYXNpY0NvbmZpZygpCisKK2RlZiBtYWluKCk6CisgICAgZ3IgPSBkcml2ZXIubG9hZF9ncmFtbWFyKCJHcmFtbWFyLnR4dCIpCisgICAgZHIgPSBkcml2ZXIuRHJpdmVyKGdyLCBjb252ZXJ0PXB5dHJlZS5jb252ZXJ0KQorCisgICAgZm4gPSAiZXhhbXBsZS5weSIKKyAgICB0cmVlID0gZHIucGFyc2VfZmlsZShmbiwgZGVidWc9VHJ1ZSkKKyAgICBpZiBub3QgZGlmZihmbiwgdHJlZSk6CisgICAgICAgIHByaW50ICJObyBkaWZmcy4iCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgcmV0dXJuICMgUGFzcyBhIGR1bW15IGFyZ3VtZW50IHRvIHJ1biB0aGUgY29tcGxldGUgdGVzdCBzdWl0ZSBiZWxvdworCisgICAgcHJvYmxlbXMgPSBbXQorCisgICAgIyBQcm9jZXNzIGV2ZXJ5IGltcG9ydGVkIG1vZHVsZQorICAgIGZvciBuYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1tuYW1lXQorICAgICAgICBpZiBtb2QgaXMgTm9uZSBvciBub3QgaGFzYXR0cihtb2QsICJfX2ZpbGVfXyIpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZm4gPSBtb2QuX19maWxlX18KKyAgICAgICAgaWYgZm4uZW5kc3dpdGgoIi5weWMiKToKKyAgICAgICAgICAgIGZuID0gZm5bOi0xXQorICAgICAgICBpZiBub3QgZm4uZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiUGFyc2luZyIsIGZuCisgICAgICAgIHRyZWUgPSBkci5wYXJzZV9maWxlKGZuLCBkZWJ1Zz1UcnVlKQorICAgICAgICBpZiBkaWZmKGZuLCB0cmVlKToKKyAgICAgICAgICAgIHByb2JsZW1zLmFwcGVuZChmbikKKworICAgICMgUHJvY2VzcyBldmVyeSBzaW5nbGUgbW9kdWxlIG9uIHN5cy5wYXRoIChidXQgbm90IGluIHBhY2thZ2VzKQorICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIlNjYW5uaW5nIiwgZGlyLCAiLi4uIgorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lLmVuZHN3aXRoKCIucHkiKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiUGFyc2luZyIsIG5hbWUKKyAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKGRpciwgbmFtZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cmVlID0gZHIucGFyc2VfZmlsZShmbiwgZGVidWc9VHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBwZ2VuMi5wYXJzZS5QYXJzZUVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgcHJpbnQgIlBhcnNlRXJyb3I6IiwgZXJyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGRpZmYoZm4sIHRyZWUpOgorICAgICAgICAgICAgICAgICAgICBwcm9ibGVtcy5hcHBlbmQoZm4pCisKKyAgICAjIFNob3cgc3VtbWFyeSBvZiBwcm9ibGVtIGZpbGVzCisgICAgaWYgbm90IHByb2JsZW1zOgorICAgICAgICBwcmludCAiTm8gcHJvYmxlbXMuICBDb25ncmF0dWxhdGlvbnMhIgorICAgIGVsc2U6CisgICAgICAgIHByaW50ICJQcm9ibGVtcyBpbiBmb2xsb3dpbmcgZmlsZXM6IgorICAgICAgICBmb3IgZm4gaW4gcHJvYmxlbXM6CisgICAgICAgICAgICBwcmludCAiKioqIiwgZm4KKworZGVmIGRpZmYoZm4sIHRyZWUpOgorICAgIGYgPSBvcGVuKCJAIiwgInciKQorICAgIHRyeToKKyAgICAgICAgZi53cml0ZShzdHIodHJlZSkpCisgICAgZmluYWxseToKKyAgICAgICAgZi5jbG9zZSgpCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gb3Muc3lzdGVtKCJkaWZmIC11ICVzIEAiICUgZm4pCisgICAgZmluYWxseToKKyAgICAgICAgb3MucmVtb3ZlKCJAIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3B5dHJlZV9pZGVtcG90ZW5jeS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwZWNjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3B5dHJlZV9pZGVtcG90ZW5jeS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwZWNjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9weXRyZWVfaWRlbXBvdGVuY3kucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NjkzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsNTQgQEAKKyIiIlN1cHBvcnQgY29kZSBmb3IgdGVzdF8qLnB5IGZpbGVzIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCByZQorZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZGVkZW50CisKKyMgTG9jYWwgaW1wb3J0cworZnJvbSBsaWIydG8zIGltcG9ydCBweXRyZWUsIHJlZmFjdG9yCitmcm9tIGxpYjJ0bzMucGdlbjIgaW1wb3J0IGRyaXZlcgorCit0ZXN0X2RpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKK3Byb2pfZGlyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4odGVzdF9kaXIsICIuLiIpKQorZ3JhbW1hcl9wYXRoID0gb3MucGF0aC5qb2luKHRlc3RfZGlyLCAiLi4iLCAiR3JhbW1hci50eHQiKQorZ3JhbW1hciA9IGRyaXZlci5sb2FkX2dyYW1tYXIoZ3JhbW1hcl9wYXRoKQorZHJpdmVyID0gZHJpdmVyLkRyaXZlcihncmFtbWFyLCBjb252ZXJ0PXB5dHJlZS5jb252ZXJ0KQorCitkZWYgcGFyc2Vfc3RyaW5nKHN0cmluZyk6CisgICAgcmV0dXJuIGRyaXZlci5wYXJzZV9zdHJpbmcocmVmb3JtYXQoc3RyaW5nKSwgZGVidWc9VHJ1ZSkKKworZGVmIHJ1bl9hbGxfdGVzdHModGVzdF9tb2Q9Tm9uZSwgdGVzdHM9Tm9uZSk6CisgICAgaWYgdGVzdHMgaXMgTm9uZToKKyAgICAgICAgdGVzdHMgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbU1vZHVsZSh0ZXN0X21vZCkKKyAgICB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikucnVuKHRlc3RzKQorCitkZWYgcmVmb3JtYXQoc3RyaW5nKToKKyAgICByZXR1cm4gZGVkZW50KHN0cmluZykgKyB1IlxuXG4iCisKK2RlZiBnZXRfcmVmYWN0b3JlcihmaXhlcl9wa2c9ImxpYjJ0bzMiLCBmaXhlcnM9Tm9uZSwgb3B0aW9ucz1Ob25lKToKKyAgICAiIiIKKyAgICBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhIFJlZmFjdG9yaW5nVG9vbCBmb3IgdGVzdHMuCisKKyAgICBmaXhlcnMgaXMgYSBsaXN0IG9mIGZpeGVycyBmb3IgdGhlIFJlZmFjdG9yaW5nVG9vbCB0byB1c2UuIEJ5IGRlZmF1bHQKKyAgICAibGliMnRvMy5maXhlcy4qIiBpcyB1c2VkLiBvcHRpb25zIGlzIGFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2Ygb3B0aW9ucyB0bworICAgIGJlIHBhc3NlZCB0byB0aGUgUmVmYWN0b3JpbmdUb29sLgorICAgICIiIgorICAgIGlmIGZpeGVycyBpcyBub3QgTm9uZToKKyAgICAgICAgZml4ZXJzID0gW2ZpeGVyX3BrZyArICIuZml4ZXMuZml4XyIgKyBmaXggZm9yIGZpeCBpbiBmaXhlcnNdCisgICAgZWxzZToKKyAgICAgICAgZml4ZXJzID0gcmVmYWN0b3IuZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UoZml4ZXJfcGtnICsgIi5maXhlcyIpCisgICAgb3B0aW9ucyA9IG9wdGlvbnMgb3Ige30KKyAgICByZXR1cm4gcmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sKGZpeGVycywgb3B0aW9ucywgZXhwbGljaXQ9VHJ1ZSkKKworZGVmIGFsbF9wcm9qZWN0X2ZpbGVzKCk6CisgICAgZm9yIGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMgaW4gb3Mud2Fsayhwcm9qX2Rpcik6CisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgiLnB5Iik6CisgICAgICAgICAgICAgICAgeWllbGQgb3MucGF0aC5qb2luKGRpcnBhdGgsIGZpbGVuYW1lKQorCitUZXN0Q2FzZSA9IHVuaXR0ZXN0LlRlc3RDYXNlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyNmI3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyNmI3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy9zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjRiM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfYWxsX2ZpeGVycy5weQpAQCAtMCwwICsxLDIzIEBACisiIiJUZXN0cyB0aGF0IHJ1biBhbGwgZml4ZXIgbW9kdWxlcyBvdmVyIGFuIGlucHV0IHN0cmVhbS4KKworVGhpcyBoYXMgYmVlbiBicm9rZW4gb3V0IGludG8gaXRzIG93biB0ZXN0IG1vZHVsZSBiZWNhdXNlIG9mIGl0cworcnVubmluZyB0aW1lLgorIiIiCisjIEF1dGhvcjogQ29sbGluIFdpbnRlcgorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgdW5pdHRlc3QKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMgaW1wb3J0IHJlZmFjdG9yCitmcm9tIC4gaW1wb3J0IHN1cHBvcnQKKworCitjbGFzcyBUZXN0X2FsbChzdXBwb3J0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5yZWZhY3RvciA9IHN1cHBvcnQuZ2V0X3JlZmFjdG9yZXIoKQorCisgICAgZGVmIHRlc3RfYWxsX3Byb2plY3RfZmlsZXMoc2VsZik6CisgICAgICAgIGZvciBmaWxlcGF0aCBpbiBzdXBwb3J0LmFsbF9wcm9qZWN0X2ZpbGVzKCk6CisgICAgICAgICAgICBzZWxmLnJlZmFjdG9yLnJlZmFjdG9yX2ZpbGUoZmlsZXBhdGgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOGU4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X2FsbF9maXhlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOGU4MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9hbGxfZml4ZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0ODI4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weQpAQCAtMCwwICsxLDQ1NDEgQEAKKyIiIiBUZXN0IHN1aXRlIGZvciB0aGUgZml4ZXIgbW9kdWxlcyAiIiIKKworIyBQeXRob24gaW1wb3J0cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbgorZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMyBpbXBvcnQgcHlncmFtLCBweXRyZWUsIHJlZmFjdG9yLCBmaXhlcl91dGlsCitmcm9tIGxpYjJ0bzMudGVzdHMgaW1wb3J0IHN1cHBvcnQKKworCitjbGFzcyBGaXhlclRlc3RDYXNlKHN1cHBvcnQuVGVzdENhc2UpOgorCisgICAgIyBPdGhlciB0ZXN0IGNhc2VzIGNhbiBzdWJjbGFzcyB0aGlzIGNsYXNzIGFuZCByZXBsYWNlICJmaXhlcl9wa2ciIHdpdGgKKyAgICAjIHRoZWlyIG93bi4KKyAgICBkZWYgc2V0VXAoc2VsZiwgZml4X2xpc3Q9Tm9uZSwgZml4ZXJfcGtnPSJsaWIydG8zIiwgb3B0aW9ucz1Ob25lKToKKyAgICAgICAgaWYgZml4X2xpc3QgaXMgTm9uZToKKyAgICAgICAgICAgIGZpeF9saXN0ID0gW3NlbGYuZml4ZXJdCisgICAgICAgIHNlbGYucmVmYWN0b3IgPSBzdXBwb3J0LmdldF9yZWZhY3RvcmVyKGZpeGVyX3BrZywgZml4X2xpc3QsIG9wdGlvbnMpCisgICAgICAgIHNlbGYuZml4ZXJfbG9nID0gW10KKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHUiPHN0cmluZz4iCisKKyAgICAgICAgZm9yIGZpeGVyIGluIGNoYWluKHNlbGYucmVmYWN0b3IucHJlX29yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWZhY3Rvci5wb3N0X29yZGVyKToKKyAgICAgICAgICAgIGZpeGVyLmxvZyA9IHNlbGYuZml4ZXJfbG9nCisKKyAgICBkZWYgX2NoZWNrKHNlbGYsIGJlZm9yZSwgYWZ0ZXIpOgorICAgICAgICBiZWZvcmUgPSBzdXBwb3J0LnJlZm9ybWF0KGJlZm9yZSkKKyAgICAgICAgYWZ0ZXIgPSBzdXBwb3J0LnJlZm9ybWF0KGFmdGVyKQorICAgICAgICB0cmVlID0gc2VsZi5yZWZhY3Rvci5yZWZhY3Rvcl9zdHJpbmcoYmVmb3JlLCBzZWxmLmZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFmdGVyLCB1bmljb2RlKHRyZWUpKQorICAgICAgICByZXR1cm4gdHJlZQorCisgICAgZGVmIGNoZWNrKHNlbGYsIGJlZm9yZSwgYWZ0ZXIsIGlnbm9yZV93YXJuaW5ncz1GYWxzZSk6CisgICAgICAgIHRyZWUgPSBzZWxmLl9jaGVjayhiZWZvcmUsIGFmdGVyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHJlZS53YXNfY2hhbmdlZCkKKyAgICAgICAgaWYgbm90IGlnbm9yZV93YXJuaW5nczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXhlcl9sb2csIFtdKQorCisgICAgZGVmIHdhcm5zKHNlbGYsIGJlZm9yZSwgYWZ0ZXIsIG1lc3NhZ2UsIHVuY2hhbmdlZD1GYWxzZSk6CisgICAgICAgIHRyZWUgPSBzZWxmLl9jaGVjayhiZWZvcmUsIGFmdGVyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZSBpbiAiIi5qb2luKHNlbGYuZml4ZXJfbG9nKSkKKyAgICAgICAgaWYgbm90IHVuY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmVlLndhc19jaGFuZ2VkKQorCisgICAgZGVmIHdhcm5zX3VuY2hhbmdlZChzZWxmLCBiZWZvcmUsIG1lc3NhZ2UpOgorICAgICAgICBzZWxmLndhcm5zKGJlZm9yZSwgYmVmb3JlLCBtZXNzYWdlLCB1bmNoYW5nZWQ9VHJ1ZSkKKworICAgIGRlZiB1bmNoYW5nZWQoc2VsZiwgYmVmb3JlLCBpZ25vcmVfd2FybmluZ3M9RmFsc2UpOgorICAgICAgICBzZWxmLl9jaGVjayhiZWZvcmUsIGJlZm9yZSkKKyAgICAgICAgaWYgbm90IGlnbm9yZV93YXJuaW5nczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXhlcl9sb2csIFtdKQorCisgICAgZGVmIGFzc2VydF9ydW5zX2FmdGVyKHNlbGYsICpuYW1lcyk6CisgICAgICAgIGZpeGVzID0gW3NlbGYuZml4ZXJdCisgICAgICAgIGZpeGVzLmV4dGVuZChuYW1lcykKKyAgICAgICAgciA9IHN1cHBvcnQuZ2V0X3JlZmFjdG9yZXIoImxpYjJ0bzMiLCBmaXhlcykKKyAgICAgICAgKHByZSwgcG9zdCkgPSByLmdldF9maXhlcnMoKQorICAgICAgICBuID0gImZpeF8iICsgc2VsZi5maXhlcgorICAgICAgICBpZiBwb3N0IGFuZCBwb3N0Wy0xXS5fX2NsYXNzX18uX19tb2R1bGVfXy5lbmRzd2l0aChuKToKKyAgICAgICAgICAgICMgV2UncmUgdGhlIGxhc3QgZml4ZXIgdG8gcnVuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgcHJlIGFuZCBwcmVbLTFdLl9fY2xhc3NfXy5fX21vZHVsZV9fLmVuZHN3aXRoKG4pIGFuZCBub3QgcG9zdDoKKyAgICAgICAgICAgICMgV2UncmUgdGhlIGxhc3QgaW4gcHJlIGFuZCBwb3N0IGlzIGVtcHR5CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mYWlsKCJGaXhlciBydW4gb3JkZXIgKCVzKSBpcyBpbmNvcnJlY3Q7ICVzIHNob3VsZCBiZSBsYXN0LiJcCisgICAgICAgICAgICAgICAlKCIsICIuam9pbihbeC5fX2NsYXNzX18uX19tb2R1bGVfXyBmb3IgeCBpbiAocHJlK3Bvc3QpXSksIG4pKQorCitjbGFzcyBUZXN0X25lKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gIm5lIgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGIgPSAiIiJpZiB4IDw+IHk6CisgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiImlmIHggIT0geToKKyAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfbm9fc3BhY2VzKHNlbGYpOgorICAgICAgICBiID0gIiIiaWYgeDw+eToKKyAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiaWYgeCE9eToKKyAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY2hhaW5lZChzZWxmKToKKyAgICAgICAgYiA9ICIiImlmIHg8Pnk8Pno6CisgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiImlmIHghPXkhPXo6CisgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9oYXNfa2V5KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImhhc19rZXkiCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGQuaGFzX2tleSgieCIpIG9yIGQuaGFzX2tleSgieSIpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gIngiIGluIGQgb3IgInkiIGluIGQiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhLmIuYy5kLmhhc19rZXkoIngiKSAqKiAzIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gKCJ4IiBpbiBhLmIuYy5kKSAqKiAzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYS5iLmhhc19rZXkoMSArIDIpLl9fcmVwcl9fKCkiIiIKKyAgICAgICAgYSA9ICIiInggPSAoMSArIDIgaW4gYS5iKS5fX3JlcHJfXygpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYS5iLmhhc19rZXkoMSArIDIpLl9fcmVwcl9fKCkgKiogLTMgKiogNCIiIgorICAgICAgICBhID0gIiIieCA9ICgxICsgMiBpbiBhLmIpLl9fcmVwcl9fKCkgKiogLTMgKiogNCIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF81KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGEuaGFzX2tleShmIG9yIGcpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gKGYgb3IgZykgaW4gYSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF82KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGEgKyBiLmhhc19rZXkoYykiIiIKKyAgICAgICAgYSA9ICIiInggPSBhICsgKGMgaW4gYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhLmhhc19rZXkobGFtYmRhOiAxMikiIiIKKyAgICAgICAgYSA9ICIiInggPSAobGFtYmRhOiAxMikgaW4gYSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF84KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGEuaGFzX2tleShhIGZvciBhIGluIGIpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gKGEgZm9yIGEgaW4gYikgaW4gYSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF85KHNlbGYpOgorICAgICAgICBiID0gIiIiaWYgbm90IGEuaGFzX2tleShiKTogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgYiBub3QgaW4gYTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xMChzZWxmKToKKyAgICAgICAgYiA9ICIiImlmIG5vdCBhLmhhc19rZXkoYikuX19yZXByX18oKTogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgbm90IChiIGluIGEpLl9fcmVwcl9fKCk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTEoc2VsZik6CisgICAgICAgIGIgPSAiIiJpZiBub3QgYS5oYXNfa2V5KGIpICoqIDI6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmIG5vdCAoYiBpbiBhKSAqKiAyOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9hcHBseShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJhcHBseSIKKworICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYXBwbHkoZiwgZyArIGgpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZigqZyArIGgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJ5ID0gYXBwbHkoZiwgZywgaCkiIiIKKyAgICAgICAgYSA9ICIiInkgPSBmKCpnLCAqKmgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ6ID0gYXBwbHkoZnNbMF0sIGcgb3IgaCwgaCBvciBnKSIiIgorICAgICAgICBhID0gIiIieiA9IGZzWzBdKCpnIG9yIGgsICoqaCBvciBnKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBiID0gIiIiYXBwbHkoZiwgKHgsIHkpICsgdCkiIiIKKyAgICAgICAgYSA9ICIiImYoKih4LCB5KSArIHQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzUoc2VsZik6CisgICAgICAgIGIgPSAiIiJhcHBseShmLCBhcmdzLCkiIiIKKyAgICAgICAgYSA9ICIiImYoKmFyZ3MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzYoc2VsZik6CisgICAgICAgIGIgPSAiIiJhcHBseShmLCBhcmdzLCBrd2RzLCkiIiIKKyAgICAgICAgYSA9ICIiImYoKmFyZ3MsICoqa3dkcykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgIyBUZXN0IHRoYXQgY29tcGxleCBmdW5jdGlvbnMgYXJlIHBhcmVudGhlc2l6ZWQKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhfMShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhcHBseShmK2csIGFyZ3MpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gKGYrZykoKmFyZ3MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhfMihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhcHBseShmKmcsIGFyZ3MpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gKGYqZykoKmFyZ3MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhcHBseShmKipnLCBhcmdzKSIiIgorICAgICAgICBhID0gIiIieCA9IChmKipnKSgqYXJncykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgIyBCdXQgZG90dGVkIG5hbWVzIGV0Yy4gbm90CisKKyAgICBkZWYgdGVzdF9kb3R0ZWRfbmFtZShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhcHBseShmLmcsIGFyZ3MpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZi5nKCphcmdzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zdWJzY3JpcHQoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYXBwbHkoZlt4XSwgYXJncykiIiIKKyAgICAgICAgYSA9ICIiInggPSBmW3hdKCphcmdzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jYWxsKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGFwcGx5KGYoKSwgYXJncykiIiIKKyAgICAgICAgYSA9ICIiInggPSBmKCkoKmFyZ3MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgRXh0cmVtZSBjYXNlCisgICAgZGVmIHRlc3RfZXh0cmVtZShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBhcHBseShhLmIuYy5kLmUuZiwgYXJncywga3dkcykiIiIKKyAgICAgICAgYSA9ICIiInggPSBhLmIuYy5kLmUuZigqYXJncywgKiprd2RzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjIFhYWCBDb21tZW50cyBpbiB3ZWlyZCBwbGFjZXMgc3RpbGwgZ2V0IGxvc3QKKyAgICBkZWYgdGVzdF93ZWlyZF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgYiA9ICIiImFwcGx5KCAgICMgZm9vCisgICAgICAgICAgZiwgIyBiYXIKKyAgICAgICAgICBhcmdzKSIiIgorICAgICAgICBhID0gIiIiZigqYXJncykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgIyBUaGVzZSBzaG91bGQgKm5vdCogYmUgdG91Y2hlZAorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseSgpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMihzZWxmKToKKyAgICAgICAgcyA9ICIiImFwcGx5KGYpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMyhzZWxmKToKKyAgICAgICAgcyA9ICIiImFwcGx5KGYsKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzQoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseShmLCBhcmdzLCBrd2RzLCBleHRyYXMpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfNShzZWxmKToKKyAgICAgICAgcyA9ICIiImFwcGx5KGYsICphcmdzLCAqKmt3ZHMpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfNihzZWxmKToKKyAgICAgICAgcyA9ICIiImFwcGx5KGYsICphcmdzKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzcoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseShmdW5jPWYsIGFyZ3M9YXJncywga3dkcz1rd2RzKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzgoc2VsZik6CisgICAgICAgIHMgPSAiIiJhcHBseShmLCBhcmdzPWFyZ3MsIGt3ZHM9a3dkcykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF85KHNlbGYpOgorICAgICAgICBzID0gIiIiYXBwbHkoZiwgYXJncywga3dkcz1rd2RzKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3Rfc3BhY2VfMShzZWxmKToKKyAgICAgICAgYSA9ICIiImFwcGx5KCAgZiwgIGFyZ3MsICAga3dkcykiIiIKKyAgICAgICAgYiA9ICIiImYoKmFyZ3MsICoqa3dkcykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhhLCBiKQorCisgICAgZGVmIHRlc3Rfc3BhY2VfMihzZWxmKToKKyAgICAgICAgYSA9ICIiImFwcGx5KCAgZiAgLGFyZ3Msa3dkcyAgICkiIiIKKyAgICAgICAgYiA9ICIiImYoKmFyZ3MsICoqa3dkcykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhhLCBiKQorCitjbGFzcyBUZXN0X2ludGVybihGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJpbnRlcm4iCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9ICAgaW50ZXJuKCAgYSAgKSIiIgorICAgICAgICBhID0gIiIiaW1wb3J0IHN5c1xueCA9ICAgc3lzLmludGVybiggIGEgICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ5ID0gaW50ZXJuKCJiIiAjIHRlc3QKKyAgICAgICAgICAgICAgKSIiIgorICAgICAgICBhID0gIiIiaW1wb3J0IHN5c1xueSA9IHN5cy5pbnRlcm4oImIiICMgdGVzdAorICAgICAgICAgICAgICApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieiA9IGludGVybihhK2IrYy5kLCAgICkiIiIKKyAgICAgICAgYSA9ICIiImltcG9ydCBzeXNcbnogPSBzeXMuaW50ZXJuKGErYitjLmQsICAgKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBpbnRlcm4oYSkiIiIKKyAgICAgICAgYSA9ICIiImltcG9ydCBzeXNcbnggPSBzeXMuaW50ZXJuKGEpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieiA9IGludGVybihhK2IrYy5kLCkiIiIKKyAgICAgICAgYSA9ICIiImltcG9ydCBzeXNcbnogPSBzeXMuaW50ZXJuKGErYitjLmQsKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImludGVybigieSVzIiAlIDUpLnJlcGxhY2UoInkiLCAiIikiIiIKKyAgICAgICAgYSA9ICIiImltcG9ydCBzeXNcbnN5cy5pbnRlcm4oInklcyIgJSA1KS5yZXBsYWNlKCJ5IiwgIiIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBiZSByZWZhY3RvcmVkCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiJpbnRlcm4oYT0xKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJpbnRlcm4oZiwgZykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiaW50ZXJuKCpoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJpbnRlcm4oKippKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJpbnRlcm4oKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCitjbGFzcyBUZXN0X3JlZHVjZShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJyZWR1Y2UiCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfY2FsbChzZWxmKToKKyAgICAgICAgYiA9ICJyZWR1Y2UoYSwgYiwgYykiCisgICAgICAgIGEgPSAiZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZVxucmVkdWNlKGEsIGIsIGMpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9idWdfNzI1MyhzZWxmKToKKyAgICAgICAgIyBmaXhfdHVwbGVfcGFyYW1zIHdhcyBiZWluZyBiYWQgYW5kIG9ycGhhbmluZyBub2RlcyBpbiB0aGUgdHJlZS4KKyAgICAgICAgYiA9ICJkZWYgeChhcmcpOiByZWR1Y2Uoc3VtLCBbXSkiCisgICAgICAgIGEgPSAiZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZVxuZGVmIHgoYXJnKTogcmVkdWNlKHN1bSwgW10pIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jYWxsX3dpdGhfbGFtYmRhKHNlbGYpOgorICAgICAgICBiID0gInJlZHVjZShsYW1iZGEgeCwgeTogeCArIHksIHNlcSkiCisgICAgICAgIGEgPSAiZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZVxucmVkdWNlKGxhbWJkYSB4LCB5OiB4ICsgeSwgc2VxKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gInJlZHVjZShhKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gInJlZHVjZShhLCBiPTQyKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gInJlZHVjZShhLCBiLCBjLCBkKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gInJlZHVjZSgqKmMpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAicmVkdWNlKCkiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKK2NsYXNzIFRlc3RfcHJpbnQoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAicHJpbnQiCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgMSwgICAxKzEsICAgMSsxKzEiIiIKKyAgICAgICAgYSA9ICIiInByaW50KDEsICAgMSsxLCAgIDErMSsxKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pZGVtcG90ZW5jeShzZWxmKToKKyAgICAgICAgcyA9ICIiInByaW50KCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIicHJpbnQoJycpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9pZGVtcG90ZW5jeV9wcmludF9hc19mdW5jdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5yZWZhY3Rvci5kcml2ZXIuZ3JhbW1hciA9IHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQKKyAgICAgICAgcyA9ICIiInByaW50KDEsIDErMSwgMSsxKzEpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInByaW50KCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIicHJpbnQoJycpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgMSwgMSsxLCAxKzErMSIiIgorICAgICAgICBhID0gIiIicHJpbnQoMSwgMSsxLCAxKzErMSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50IDEsIDIiIiIKKyAgICAgICAgYSA9ICIiInByaW50KDEsIDIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJwcmludCIiIgorICAgICAgICBhID0gIiIicHJpbnQoKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICAjIGZyb20gYnVnIDMwMDAKKyAgICAgICAgYiA9ICIiInByaW50IHdoYXRldmVyOyBwcmludCIiIgorICAgICAgICBhID0gIiIicHJpbnQod2hhdGV2ZXIpOyBwcmludCgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzUoc2VsZik6CisgICAgICAgIGIgPSAiIiJwcmludDsgcHJpbnQgd2hhdGV2ZXI7IiIiCisgICAgICAgIGEgPSAiIiJwcmludCgpOyBwcmludCh3aGF0ZXZlcik7IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgKGEsIGIsIGMpIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgoYSwgYiwgYykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgdHJhaWxpbmcgY29tbWFzCisKKyAgICBkZWYgdGVzdF90cmFpbGluZ19jb21tYV8xKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgMSwgMiwgMywiIiIKKyAgICAgICAgYSA9ICIiInByaW50KDEsIDIsIDMsIGVuZD0nICcpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RyYWlsaW5nX2NvbW1hXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJwcmludCAxLCAyLCIiIgorICAgICAgICBhID0gIiIicHJpbnQoMSwgMiwgZW5kPScgJykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHJhaWxpbmdfY29tbWFfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiInByaW50IDEsIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgxLCBlbmQ9JyAnKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAjID4+IHN0dWZmCisKKyAgICBkZWYgdGVzdF92YXJnc193aXRob3V0X3RyYWlsaW5nX2NvbW1hKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgPj5zeXMuc3RkZXJyLCAxLCAyLCAzIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgxLCAyLCAzLCBmaWxlPXN5cy5zdGRlcnIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3dpdGhfdHJhaWxpbmdfY29tbWEoc2VsZik6CisgICAgICAgIGIgPSAiIiJwcmludCA+PnN5cy5zdGRlcnIsIDEsIDIsIiIiCisgICAgICAgIGEgPSAiIiJwcmludCgxLCAyLCBlbmQ9JyAnLCBmaWxlPXN5cy5zdGRlcnIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25vX3RyYWlsaW5nX2NvbW1hKHNlbGYpOgorICAgICAgICBiID0gIiIicHJpbnQgPj5zeXMuc3RkZXJyLCAxKzEiIiIKKyAgICAgICAgYSA9ICIiInByaW50KDErMSwgZmlsZT1zeXMuc3RkZXJyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zcGFjZXNfYmVmb3JlX2ZpbGUoc2VsZik6CisgICAgICAgIGIgPSAiIiJwcmludCA+PiAgc3lzLnN0ZGVyciIiIgorICAgICAgICBhID0gIiIicHJpbnQoZmlsZT1zeXMuc3RkZXJyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93aXRoX2Z1dHVyZV9wcmludF9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgcyA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uXG4iIFwKKyAgICAgICAgICAgICJwcmludCgnSGFpIScsIGVuZD0nICcpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIGIgPSAicHJpbnQgJ0hlbGxvLCB3b3JsZCEnIgorICAgICAgICBhID0gInByaW50KCdIZWxsbywgd29ybGQhJykiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCitjbGFzcyBUZXN0X2V4ZWMoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiZXhlYyIKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiIgIGV4ZWMgY29kZSBpbiBuczEsICAgbnMyIiIiCisgICAgICAgIGEgPSAiIiIgIGV4ZWMoY29kZSwgbnMxLCAgIG5zMikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGIgPSAiIiJleGVjIGNvZGUiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoY29kZSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfd2l0aF9nbG9iYWxzKHNlbGYpOgorICAgICAgICBiID0gIiIiZXhlYyBjb2RlIGluIG5zIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvZGUsIG5zKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93aXRoX2dsb2JhbHNfbG9jYWxzKHNlbGYpOgorICAgICAgICBiID0gIiIiZXhlYyBjb2RlIGluIG5zMSwgbnMyIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvZGUsIG5zMSwgbnMyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jb21wbGV4XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJleGVjIChhLmIoKSkgaW4gbnMiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoKGEuYigpKSwgbnMpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhfMihzZWxmKToKKyAgICAgICAgYiA9ICIiImV4ZWMgYS5iKCkgKyBjIGluIG5zIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGEuYigpICsgYywgbnMpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBiZSB0b3VjaGVkCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMShzZWxmKToKKyAgICAgICAgcyA9ICIiImV4ZWMoY29kZSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8yKHNlbGYpOgorICAgICAgICBzID0gIiIiZXhlYyAoY29kZSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8zKHNlbGYpOgorICAgICAgICBzID0gIiIiZXhlYyhjb2RlLCBucykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF80KHNlbGYpOgorICAgICAgICBzID0gIiIiZXhlYyhjb2RlLCBuczEsIG5zMikiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworY2xhc3MgVGVzdF9yZXByKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInJlcHIiCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9ICAgYDEgKyAyYCIiIgorICAgICAgICBhID0gIiIieCA9ICAgcmVwcigxICsgMikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYDEgKyAyYCIiIgorICAgICAgICBhID0gIiIieCA9IHJlcHIoMSArIDIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV8yKHNlbGYpOgorICAgICAgICBiID0gIiIieSA9IGB4YCIiIgorICAgICAgICBhID0gIiIieSA9IHJlcHIoeCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY29tcGxleChzZWxmKToKKyAgICAgICAgYiA9ICIiInogPSBgeWAuX19yZXByX18oKSIiIgorICAgICAgICBhID0gIiIieiA9IHJlcHIoeSkuX19yZXByX18oKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBgMSwgMiwgM2AiIiIKKyAgICAgICAgYSA9ICIiInggPSByZXByKCgxLCAyLCAzKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbmVzdGVkKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGAxICsgYDJgYCIiIgorICAgICAgICBhID0gIiIieCA9IHJlcHIoMSArIHJlcHIoMikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF90dXBsZXMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gYDEsIDIgKyBgMywgNGBgIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gcmVwcigoMSwgMiArIHJlcHIoKDMsIDQpKSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9leGNlcHQoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiZXhjZXB0IgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCAoUnVudGltZUVycm9yLCBJbXBvcnRFcnJvciksICAgIGU6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IChSdW50aW1lRXJyb3IsIEltcG9ydEVycm9yKSBhcyAgICBlOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEZvbywgZToKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRm9vIGFzIGU6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfbm9fc3BhY2VfYmVmb3JlX3RhcmdldChzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBGb28sZToKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRm9vIGFzIGU6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90dXBsZV91bnBhY2soc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCAoZiwgZSk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4eHhfdG9kb19jaGFuZ2VtZToKKyAgICAgICAgICAgICAgICAgICAgKGYsIGUpID0geHh4X3RvZG9fY2hhbmdlbWUuYXJncworICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbXVsdGlfY2xhc3Moc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgKFJ1bnRpbWVFcnJvciwgSW1wb3J0RXJyb3IpLCBlOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IChSdW50aW1lRXJyb3IsIEltcG9ydEVycm9yKSBhcyBlOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGlzdF91bnBhY2soc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBbYSwgYl06CisgICAgICAgICAgICAgICAgcGFzcyIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHh4eF90b2RvX2NoYW5nZW1lOgorICAgICAgICAgICAgICAgIFthLCBiXSA9IHh4eF90b2RvX2NoYW5nZW1lLmFyZ3MKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3dlaXJkX3RhcmdldF8xKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZFs1XToKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgeHh4X3RvZG9fY2hhbmdlbWU6CisgICAgICAgICAgICAgICAgZFs1XSA9IHh4eF90b2RvX2NoYW5nZW1lCisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93ZWlyZF90YXJnZXRfMihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGEuZm9vOgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyB4eHhfdG9kb19jaGFuZ2VtZToKKyAgICAgICAgICAgICAgICBhLmZvbyA9IHh4eF90b2RvX2NoYW5nZW1lCisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93ZWlyZF90YXJnZXRfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGEoKS5mb286CisgICAgICAgICAgICAgICAgcGFzcyIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIHh4eF90b2RvX2NoYW5nZW1lOgorICAgICAgICAgICAgICAgIGEoKS5mb28gPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYmFyZV9leGNlcHQoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBhOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9iYXJlX2V4Y2VwdF9hbmRfZWxzZV9maW5hbGx5KHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHBhc3MiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBhOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tdWx0aV9maXhlZF9leGNlcHRzX2JlZm9yZV9iYXJlX2V4Y2VwdChzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGI6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGI6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBhOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X29uZV9saW5lX3N1aXRlcyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OiByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeTogcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZTogcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZTogcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdHJ5OiByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6IHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB0cnk6IHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlOiBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB0cnk6IHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZTogcGFzcworICAgICAgICAgICAgZWxzZTogZnVuY3Rpb24oKQorICAgICAgICAgICAgZmluYWxseTogZG9uZSgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdHJ5OiByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZTogcGFzcworICAgICAgICAgICAgZWxzZTogZnVuY3Rpb24oKQorICAgICAgICAgICAgZmluYWxseTogZG9uZSgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgIyBUaGVzZSBzaG91bGQgbm90IGJlIHRvdWNoZWQ6CisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMihzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzMoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgKEV4Y2VwdGlvbiwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCitjbGFzcyBUZXN0X3JhaXNlKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInJhaXNlIgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGIgPSAiIiJyYWlzZSBFeGNlcHRpb24sIDUiIiIKKyAgICAgICAgYSA9ICIiInJhaXNlIEV4Y2VwdGlvbig1KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIicmFpc2UgRXhjZXB0aW9uLDUiIiIKKyAgICAgICAgYSA9ICIiInJhaXNlIEV4Y2VwdGlvbig1KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInJhaXNlICAgRXhjZXB0aW9uLCAgICA1IiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSAgIEV4Y2VwdGlvbig1KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93aXRoX2NvbW1lbnRzKHNlbGYpOgorICAgICAgICBiID0gIiIicmFpc2UgRXhjZXB0aW9uLCA1ICMgZm9vIiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSBFeGNlcHRpb24oNSkgIyBmb28iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJyYWlzZSBFLCAoNSwgNikgJSAoYSwgYikgIyBmb28iIiIKKyAgICAgICAgYSA9ICIiInJhaXNlIEUoKDUsIDYpICUgKGEsIGIpKSAjIGZvbyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCA1LCA2ICMgZm9vIiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KSAjIGZvbyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9Ob25lX3ZhbHVlKHNlbGYpOgorICAgICAgICBiID0gIiIicmFpc2UgRXhjZXB0aW9uKDUpLCBOb25lLCB0YiIiIgorICAgICAgICBhID0gIiIicmFpc2UgRXhjZXB0aW9uKDUpLndpdGhfdHJhY2ViYWNrKHRiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90dXBsZV92YWx1ZShzZWxmKToKKyAgICAgICAgYiA9ICIiInJhaXNlIEV4Y2VwdGlvbiwgKDUsIDYsIDcpIiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSBFeGNlcHRpb24oNSwgNiwgNykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHVwbGVfZGV0ZWN0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIicmFpc2UgRSwgKDUsIDYpICUgKGEsIGIpIiIiCisgICAgICAgIGEgPSAiIiJyYWlzZSBFKCg1LCA2KSAlIChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHVwbGVfZXhjXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJyYWlzZSAoKChFMSwgRTIpLCBFMyksIEU0KSwgViIiIgorICAgICAgICBhID0gIiIicmFpc2UgRTEoVikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHVwbGVfZXhjXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJyYWlzZSAoRTEsIChFMiwgRTMpLCBFNCksIFYiIiIKKyAgICAgICAgYSA9ICIiInJhaXNlIEUxKFYpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgVGhlc2Ugc2hvdWxkIHByb2R1Y2UgYSB3YXJuaW5nCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfZXhjKHNlbGYpOgorICAgICAgICBzID0gIiIicmFpc2UgJ2ZvbyciIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIlB5dGhvbiAzIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIGV4Y2VwdGlvbnMiKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2V4Y192YWwoc2VsZik6CisgICAgICAgIHMgPSAiIiJyYWlzZSAiZm9vIiwgNSIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiUHl0aG9uIDMgZG9lcyBub3Qgc3VwcG9ydCBzdHJpbmcgZXhjZXB0aW9ucyIpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfZXhjX3ZhbF90YihzZWxmKToKKyAgICAgICAgcyA9ICIiInJhaXNlICJmb28iLCA1LCA2IiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJQeXRob24gMyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBleGNlcHRpb25zIikKKworICAgICMgVGhlc2Ugc2hvdWxkIHJlc3VsdCBpbiB0cmFjZWJhY2stYXNzaWdubWVudAorCisgICAgZGVmIHRlc3RfdGJfMShzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCA1LCA2IiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl8yKHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sIDUsIDYKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKDUpLndpdGhfdHJhY2ViYWNrKDYpCisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiw1LDYiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKDUpLndpdGhfdHJhY2ViYWNrKDYpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzQoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiw1LDYKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKDUpLndpdGhfdHJhY2ViYWNrKDYpCisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzUoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgKDUsIDYsIDcpLCA2IiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbig1LCA2LCA3KS53aXRoX3RyYWNlYmFjayg2KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl82KHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICg1LCA2LCA3KSwgNgorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oNSwgNiwgNykud2l0aF90cmFjZWJhY2soNikKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCitjbGFzcyBUZXN0X3Rocm93KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInRocm93IgorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiImcudGhyb3coRXhjZXB0aW9uLCA1KSIiIgorICAgICAgICBhID0gIiIiZy50aHJvdyhFeGNlcHRpb24oNSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJnLnRocm93KEV4Y2VwdGlvbiw1KSIiIgorICAgICAgICBhID0gIiIiZy50aHJvdyhFeGNlcHRpb24oNSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJnLnRocm93KEV4Y2VwdGlvbiwgKDUsIDYsIDcpKSIiIgorICAgICAgICBhID0gIiIiZy50aHJvdyhFeGNlcHRpb24oNSwgNiwgNykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIGIgPSAiIiI1ICsgZy50aHJvdyhFeGNlcHRpb24sIDUpIiIiCisgICAgICAgIGEgPSAiIiI1ICsgZy50aHJvdyhFeGNlcHRpb24oNSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICMgVGhlc2Ugc2hvdWxkIHByb2R1Y2Ugd2FybmluZ3MKKworICAgIGRlZiB0ZXN0X3dhcm5fMShzZWxmKToKKyAgICAgICAgcyA9ICIiImcudGhyb3coImZvbyIpIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJQeXRob24gMyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBleGNlcHRpb25zIikKKworICAgIGRlZiB0ZXN0X3dhcm5fMihzZWxmKToKKyAgICAgICAgcyA9ICIiImcudGhyb3coImZvbyIsIDUpIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJQeXRob24gMyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBleGNlcHRpb25zIikKKworICAgIGRlZiB0ZXN0X3dhcm5fMyhzZWxmKToKKyAgICAgICAgcyA9ICIiImcudGhyb3coImZvbyIsIDUsIDYpIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJQeXRob24gMyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBleGNlcHRpb25zIikKKworICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBiZSB0b3VjaGVkCisKKyAgICBkZWYgdGVzdF91bnRvdWNoZWRfMShzZWxmKToKKyAgICAgICAgcyA9ICIiImcudGhyb3coRXhjZXB0aW9uKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW50b3VjaGVkXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiJnLnRocm93KEV4Y2VwdGlvbig1LCA2KSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VudG91Y2hlZF8zKHNlbGYpOgorICAgICAgICBzID0gIiIiNSArIGcudGhyb3coRXhjZXB0aW9uKDUsIDYpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgIyBUaGVzZSBzaG91bGQgcmVzdWx0IGluIHRyYWNlYmFjay1hc3NpZ25tZW50CisKKyAgICBkZWYgdGVzdF90Yl8xKHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBnLnRocm93KEV4Y2VwdGlvbiwgNSwgNikiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uLCA1LCA2KQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICBnLnRocm93KEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KSkKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGJfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24sNSw2KSIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBnLnRocm93KEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGJfNChzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24sNSw2KQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICBnLnRocm93KEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KSkKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGJfNShzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24sICg1LCA2LCA3KSwgNikiIiIKKyAgICAgICAgYSA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgZy50aHJvdyhFeGNlcHRpb24oNSwgNiwgNykud2l0aF90cmFjZWJhY2soNikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RiXzYoc2VsZik6CisgICAgICAgIGIgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uLCAoNSwgNiwgNyksIDYpCisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA1CisgICAgICAgICAgICAgICAgICAgIGcudGhyb3coRXhjZXB0aW9uKDUsIDYsIDcpLndpdGhfdHJhY2ViYWNrKDYpKQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90Yl83KHNlbGYpOgorICAgICAgICBiID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhICsgZy50aHJvdyhFeGNlcHRpb24sIDUsIDYpIiIiCisgICAgICAgIGEgPSAiIiJkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgICAgIGEgKyBnLnRocm93KEV4Y2VwdGlvbig1KS53aXRoX3RyYWNlYmFjayg2KSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGJfOChzZWxmKToKKyAgICAgICAgYiA9ICIiImRlZiBmb28oKToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDUKKyAgICAgICAgICAgICAgICAgICAgYSArIGcudGhyb3coRXhjZXB0aW9uLCA1LCA2KQorICAgICAgICAgICAgICAgICAgICBiID0gNiIiIgorICAgICAgICBhID0gIiIiZGVmIGZvbygpOgorICAgICAgICAgICAgICAgICAgICBhID0gNQorICAgICAgICAgICAgICAgICAgICBhICsgZy50aHJvdyhFeGNlcHRpb24oNSkud2l0aF90cmFjZWJhY2soNikpCisgICAgICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9sb25nKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImxvbmciCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGxvbmcoeCkiIiIKKyAgICAgICAgYSA9ICIiInggPSBpbnQoeCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiInkgPSBpc2luc3RhbmNlKHgsIGxvbmcpIiIiCisgICAgICAgIGEgPSAiIiJ5ID0gaXNpbnN0YW5jZSh4LCBpbnQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ6ID0gdHlwZSh4KSBpbiAoaW50LCBsb25nKSIiIgorICAgICAgICBhID0gIiIieiA9IHR5cGUoeCkgaW4gKGludCwgaW50KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiJsb25nID0gVHJ1ZSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJzLmxvbmcgPSBUcnVlIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiImRlZiBsb25nKCk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIiY2xhc3MgbG9uZygpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiImRlZiBmKGxvbmcpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiImRlZiBmKGcsIGxvbmcpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiImRlZiBmKHgsIGxvbmc9VHJ1ZSk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gICBsb25nKCAgeCAgKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgaW50KCAgeCAgKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworY2xhc3MgVGVzdF9leGVjZmlsZShGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJleGVjZmlsZSIKKworICAgIGRlZiB0ZXN0X2NvbnZlcnNpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJleGVjZmlsZSgiZm4iKSIiIgorICAgICAgICBhID0gIiIiZXhlYyhjb21waWxlKG9wZW4oImZuIikucmVhZCgpLCAiZm4iLCAnZXhlYycpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImV4ZWNmaWxlKCJmbiIsIGdsb2IpIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvbXBpbGUob3BlbigiZm4iKS5yZWFkKCksICJmbiIsICdleGVjJyksIGdsb2IpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiZXhlY2ZpbGUoImZuIiwgZ2xvYiwgbG9jKSIiIgorICAgICAgICBhID0gIiIiZXhlYyhjb21waWxlKG9wZW4oImZuIikucmVhZCgpLCAiZm4iLCAnZXhlYycpLCBnbG9iLCBsb2MpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiZXhlY2ZpbGUoImZuIiwgZ2xvYmFscz1nbG9iKSIiIgorICAgICAgICBhID0gIiIiZXhlYyhjb21waWxlKG9wZW4oImZuIikucmVhZCgpLCAiZm4iLCAnZXhlYycpLCBnbG9iYWxzPWdsb2IpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiZXhlY2ZpbGUoImZuIiwgbG9jYWxzPWxvYykiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoY29tcGlsZShvcGVuKCJmbiIpLnJlYWQoKSwgImZuIiwgJ2V4ZWMnKSwgbG9jYWxzPWxvYykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJleGVjZmlsZSgiZm4iLCBnbG9iYWxzPWdsb2IsIGxvY2Fscz1sb2MpIiIiCisgICAgICAgIGEgPSAiIiJleGVjKGNvbXBpbGUob3BlbigiZm4iKS5yZWFkKCksICJmbiIsICdleGVjJyksIGdsb2JhbHM9Z2xvYiwgbG9jYWxzPWxvYykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc3BhY2luZyhzZWxmKToKKyAgICAgICAgYiA9ICIiImV4ZWNmaWxlKCAiZm4iICkiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoY29tcGlsZShvcGVuKCAiZm4iICkucmVhZCgpLCAiZm4iLCAnZXhlYycpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImV4ZWNmaWxlKCJmbiIsICBnbG9iYWxzID0gZ2xvYikiIiIKKyAgICAgICAgYSA9ICIiImV4ZWMoY29tcGlsZShvcGVuKCJmbiIpLnJlYWQoKSwgImZuIiwgJ2V4ZWMnKSwgIGdsb2JhbHMgPSBnbG9iKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworY2xhc3MgVGVzdF9pc2luc3RhbmNlKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImlzaW5zdGFuY2UiCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfbXVsdGlwbGVfaXRlbXMoc2VsZik6CisgICAgICAgIGIgPSAiIiJpc2luc3RhbmNlKHgsIChpbnQsIGludCwgaW50KSkiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoeCwgaW50KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlzaW5zdGFuY2UoeCwgKGludCwgZmxvYXQsIGludCwgaW50LCBmbG9hdCkpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIChpbnQsIGZsb2F0KSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpc2luc3RhbmNlKHgsIChpbnQsIGZsb2F0LCBpbnQsIGludCwgZmxvYXQsIHN0cikpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIChpbnQsIGZsb2F0LCBzdHIpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlzaW5zdGFuY2UoZm9vKCkgKyBiYXIoKSwgKHgoKSwgeSgpLCB4KCksIGludCwgaW50KSkiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoZm9vKCkgKyBiYXIoKSwgKHgoKSwgeSgpLCB4KCksIGludCkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3ByZWZpeF9wcmVzZXJ2YXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJpZiAgICBpc2luc3RhbmNlKCAgZm9vKCksICggIGJhciwgYmFyLCBiYXogKSkgOiBwYXNzIiIiCisgICAgICAgIGEgPSAiIiJpZiAgICBpc2luc3RhbmNlKCAgZm9vKCksICggIGJhciwgYmF6ICkpIDogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJpc2luc3RhbmNlKHgsIChzdHIsIGludCkpIikKKworY2xhc3MgVGVzdF9kaWN0KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImRpY3QiCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gImlmICAgZC4ga2V5cyAgKCAgKSAgOiBwYXNzIgorICAgICAgICBhID0gImlmICAgbGlzdChkLiBrZXlzICAoICApKSAgOiBwYXNzIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJpZiAgIGQuIGl0ZW1zICAoICApICA6IHBhc3MiCisgICAgICAgIGEgPSAiaWYgICBsaXN0KGQuIGl0ZW1zICAoICApKSAgOiBwYXNzIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJpZiAgIGQuIGl0ZXJrZXlzICAoICkgIDogcGFzcyIKKyAgICAgICAgYSA9ICJpZiAgIGl0ZXIoZC4ga2V5cyAgKCApKSAgOiBwYXNzIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJbaSBmb3IgaSBpbiAgICBkLiAgaXRlcmtleXMoICApICBdIgorICAgICAgICBhID0gIltpIGZvciBpIGluICAgIGQuICBrZXlzKCAgKSAgXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiaWYgICBkLiB2aWV3a2V5cyAgKCApICA6IHBhc3MiCisgICAgICAgIGEgPSAiaWYgICBkLiBrZXlzICAoICkgIDogcGFzcyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiW2kgZm9yIGkgaW4gICAgZC4gIHZpZXdrZXlzKCAgKSAgXSIKKyAgICAgICAgYSA9ICJbaSBmb3IgaSBpbiAgICBkLiAga2V5cyggICkgIF0iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3RyYWlsaW5nX2NvbW1lbnQoc2VsZik6CisgICAgICAgIGIgPSAiZC5rZXlzKCkgIyBmb28iCisgICAgICAgIGEgPSAibGlzdChkLmtleXMoKSkgIyBmb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImQuaXRlbXMoKSAgIyBmb28iCisgICAgICAgIGEgPSAibGlzdChkLml0ZW1zKCkpICAjIGZvbyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZC5pdGVya2V5cygpICAjIGZvbyIKKyAgICAgICAgYSA9ICJpdGVyKGQua2V5cygpKSAgIyBmb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiW2kgZm9yIGkgaW4gZC5pdGVya2V5cygpICMgZm9vCisgICAgICAgICAgICAgICBdIiIiCisgICAgICAgIGEgPSAiIiJbaSBmb3IgaSBpbiBkLmtleXMoKSAjIGZvbworICAgICAgICAgICAgICAgXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIltpIGZvciBpIGluIGQuaXRlcmtleXMoKSAjIGZvbworICAgICAgICAgICAgICAgXSIiIgorICAgICAgICBhID0gIiIiW2kgZm9yIGkgaW4gZC5rZXlzKCkgIyBmb28KKyAgICAgICAgICAgICAgIF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZC52aWV3aXRlbXMoKSAgIyBmb28iCisgICAgICAgIGEgPSAiZC5pdGVtcygpICAjIGZvbyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBmb3Igd3JhcHBlciBpbiBmaXhlcl91dGlsLmNvbnN1bWluZ19jYWxsczoKKyAgICAgICAgICAgIHMgPSAicyA9ICVzKGQua2V5cygpKSIgJSB3cmFwcGVyCisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgICAgICBzID0gInMgPSAlcyhkLnZhbHVlcygpKSIgJSB3cmFwcGVyCisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgICAgICBzID0gInMgPSAlcyhkLml0ZW1zKCkpIiAlIHdyYXBwZXIKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF8wMShzZWxmKToKKyAgICAgICAgYiA9ICJkLmtleXMoKSIKKyAgICAgICAgYSA9ICJsaXN0KGQua2V5cygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiYVswXS5mb28oKS5rZXlzKCkiCisgICAgICAgIGEgPSAibGlzdChhWzBdLmZvbygpLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzAyKHNlbGYpOgorICAgICAgICBiID0gImQuaXRlbXMoKSIKKyAgICAgICAgYSA9ICJsaXN0KGQuaXRlbXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzAzKHNlbGYpOgorICAgICAgICBiID0gImQudmFsdWVzKCkiCisgICAgICAgIGEgPSAibGlzdChkLnZhbHVlcygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMDQoc2VsZik6CisgICAgICAgIGIgPSAiZC5pdGVya2V5cygpIgorICAgICAgICBhID0gIml0ZXIoZC5rZXlzKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8wNShzZWxmKToKKyAgICAgICAgYiA9ICJkLml0ZXJpdGVtcygpIgorICAgICAgICBhID0gIml0ZXIoZC5pdGVtcygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMDYoc2VsZik6CisgICAgICAgIGIgPSAiZC5pdGVydmFsdWVzKCkiCisgICAgICAgIGEgPSAiaXRlcihkLnZhbHVlcygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMDcoc2VsZik6CisgICAgICAgIHMgPSAibGlzdChkLmtleXMoKSkiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF8wOChzZWxmKToKKyAgICAgICAgcyA9ICJzb3J0ZWQoZC5rZXlzKCkpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfMDkoc2VsZik6CisgICAgICAgIGIgPSAiaXRlcihkLmtleXMoKSkiCisgICAgICAgIGEgPSAiaXRlcihsaXN0KGQua2V5cygpKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzEwKHNlbGYpOgorICAgICAgICBiID0gImZvbyhkLmtleXMoKSkiCisgICAgICAgIGEgPSAiZm9vKGxpc3QoZC5rZXlzKCkpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTEoc2VsZik6CisgICAgICAgIGIgPSAiZm9yIGkgaW4gZC5rZXlzKCk6IHByaW50IGkiCisgICAgICAgIGEgPSAiZm9yIGkgaW4gbGlzdChkLmtleXMoKSk6IHByaW50IGkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzEyKHNlbGYpOgorICAgICAgICBiID0gImZvciBpIGluIGQuaXRlcmtleXMoKTogcHJpbnQgaSIKKyAgICAgICAgYSA9ICJmb3IgaSBpbiBkLmtleXMoKTogcHJpbnQgaSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTMoc2VsZik6CisgICAgICAgIGIgPSAiW2kgZm9yIGkgaW4gZC5rZXlzKCldIgorICAgICAgICBhID0gIltpIGZvciBpIGluIGxpc3QoZC5rZXlzKCkpXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTQoc2VsZik6CisgICAgICAgIGIgPSAiW2kgZm9yIGkgaW4gZC5pdGVya2V5cygpXSIKKyAgICAgICAgYSA9ICJbaSBmb3IgaSBpbiBkLmtleXMoKV0iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE1KHNlbGYpOgorICAgICAgICBiID0gIihpIGZvciBpIGluIGQua2V5cygpKSIKKyAgICAgICAgYSA9ICIoaSBmb3IgaSBpbiBsaXN0KGQua2V5cygpKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE2KHNlbGYpOgorICAgICAgICBiID0gIihpIGZvciBpIGluIGQuaXRlcmtleXMoKSkiCisgICAgICAgIGEgPSAiKGkgZm9yIGkgaW4gZC5rZXlzKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xNyhzZWxmKToKKyAgICAgICAgYiA9ICJpdGVyKGQuaXRlcmtleXMoKSkiCisgICAgICAgIGEgPSAiaXRlcihkLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE4KHNlbGYpOgorICAgICAgICBiID0gImxpc3QoZC5pdGVya2V5cygpKSIKKyAgICAgICAgYSA9ICJsaXN0KGQua2V5cygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTkoc2VsZik6CisgICAgICAgIGIgPSAic29ydGVkKGQuaXRlcmtleXMoKSkiCisgICAgICAgIGEgPSAic29ydGVkKGQua2V5cygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMjAoc2VsZik6CisgICAgICAgIGIgPSAiZm9vKGQuaXRlcmtleXMoKSkiCisgICAgICAgIGEgPSAiZm9vKGl0ZXIoZC5rZXlzKCkpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMjEoc2VsZik6CisgICAgICAgIGIgPSAicHJpbnQgaC5pdGVya2V5cygpLm5leHQoKSIKKyAgICAgICAgYSA9ICJwcmludCBpdGVyKGgua2V5cygpKS5uZXh0KCkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIyKHNlbGYpOgorICAgICAgICBiID0gInByaW50IGgua2V5cygpWzBdIgorICAgICAgICBhID0gInByaW50IGxpc3QoaC5rZXlzKCkpWzBdIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yMyhzZWxmKToKKyAgICAgICAgYiA9ICJwcmludCBsaXN0KGguaXRlcmtleXMoKS5uZXh0KCkpIgorICAgICAgICBhID0gInByaW50IGxpc3QoaXRlcihoLmtleXMoKSkubmV4dCgpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMjQoc2VsZik6CisgICAgICAgIGIgPSAiZm9yIHggaW4gaC5rZXlzKClbMF06IHByaW50IHgiCisgICAgICAgIGEgPSAiZm9yIHggaW4gbGlzdChoLmtleXMoKSlbMF06IHByaW50IHgiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzI1KHNlbGYpOgorICAgICAgICBiID0gImQudmlld2tleXMoKSIKKyAgICAgICAgYSA9ICJkLmtleXMoKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMjYoc2VsZik6CisgICAgICAgIGIgPSAiZC52aWV3aXRlbXMoKSIKKyAgICAgICAgYSA9ICJkLml0ZW1zKCkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzI3KHNlbGYpOgorICAgICAgICBiID0gImQudmlld3ZhbHVlcygpIgorICAgICAgICBhID0gImQudmFsdWVzKCkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE0KHNlbGYpOgorICAgICAgICBiID0gIltpIGZvciBpIGluIGQudmlld2tleXMoKV0iCisgICAgICAgIGEgPSAiW2kgZm9yIGkgaW4gZC5rZXlzKCldIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xNShzZWxmKToKKyAgICAgICAgYiA9ICIoaSBmb3IgaSBpbiBkLnZpZXdrZXlzKCkpIgorICAgICAgICBhID0gIihpIGZvciBpIGluIGQua2V5cygpKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMTcoc2VsZik6CisgICAgICAgIGIgPSAiaXRlcihkLnZpZXdrZXlzKCkpIgorICAgICAgICBhID0gIml0ZXIoZC5rZXlzKCkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xOChzZWxmKToKKyAgICAgICAgYiA9ICJsaXN0KGQudmlld2tleXMoKSkiCisgICAgICAgIGEgPSAibGlzdChkLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzE5KHNlbGYpOgorICAgICAgICBiID0gInNvcnRlZChkLnZpZXdrZXlzKCkpIgorICAgICAgICBhID0gInNvcnRlZChkLmtleXMoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF94cmFuZ2UoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAieHJhbmdlIgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSAgICB4cmFuZ2UoICAxMCAgKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgIHJhbmdlKCAgMTAgICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0geHJhbmdlKCAgMSAgLCAgMTAgICApIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gcmFuZ2UoICAxICAsICAxMCAgICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0geHJhbmdlKCAgMCAgLCAgMTAgLCAgMiApIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gcmFuZ2UoICAwICAsICAxMCAsICAyICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX2FyZyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSB4cmFuZ2UoMTApIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gcmFuZ2UoMTApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3R3b19hcmdzKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IHhyYW5nZSgxLCAxMCkiIiIKKyAgICAgICAgYSA9ICIiInggPSByYW5nZSgxLCAxMCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdGhyZWVfYXJncyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSB4cmFuZ2UoMCwgMTAsIDIpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gcmFuZ2UoMCwgMTAsIDIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3dyYXBfaW5fbGlzdChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSByYW5nZSgxMCwgMywgOSkiIiIKKyAgICAgICAgYSA9ICIiInggPSBsaXN0KHJhbmdlKDEwLCAzLCA5KSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gZm9vKHJhbmdlKDEwLCAzLCA5KSkiIiIKKyAgICAgICAgYSA9ICIiInggPSBmb28obGlzdChyYW5nZSgxMCwgMywgOSkpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSByYW5nZSgxMCwgMywgOSkgKyBbNF0iIiIKKyAgICAgICAgYSA9ICIiInggPSBsaXN0KHJhbmdlKDEwLCAzLCA5KSkgKyBbNF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gcmFuZ2UoMTApWzo6LTFdIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdChyYW5nZSgxMCkpWzo6LTFdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IHJhbmdlKDEwKSAgWzNdIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdChyYW5nZSgxMCkpICBbM10iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfeHJhbmdlX2luX2ZvcihzZWxmKToKKyAgICAgICAgYiA9ICIiImZvciBpIGluIHhyYW5nZSgxMCk6XG4gICAgaj1pIiIiCisgICAgICAgIGEgPSAiIiJmb3IgaSBpbiByYW5nZSgxMCk6XG4gICAgaj1pIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiW2kgZm9yIGkgaW4geHJhbmdlKDEwKV0iIiIKKyAgICAgICAgYSA9ICIiIltpIGZvciBpIGluIHJhbmdlKDEwKV0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfcmFuZ2VfaW5fZm9yKHNlbGYpOgorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiZm9yIGkgaW4gcmFuZ2UoMTApOiBwYXNzIikKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoIltpIGZvciBpIGluIHJhbmdlKDEwKV0iKQorCisgICAgZGVmIHRlc3RfaW5fY29udGFpbnNfdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoInggaW4gcmFuZ2UoMTAsIDMsIDkpIikKKworICAgIGRlZiB0ZXN0X2luX2NvbnN1bWluZ19jb250ZXh0KHNlbGYpOgorICAgICAgICBmb3IgY2FsbCBpbiBmaXhlcl91dGlsLmNvbnN1bWluZ19jYWxsczoKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJhID0gJXMocmFuZ2UoMTApKSIgJSBjYWxsKQorCitjbGFzcyBUZXN0X3hyYW5nZV93aXRoX3JlZHVjZShGaXhlclRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdF94cmFuZ2Vfd2l0aF9yZWR1Y2UsIHNlbGYpLnNldFVwKFsieHJhbmdlIiwgInJlZHVjZSJdKQorCisgICAgZGVmIHRlc3RfZG91YmxlX3RyYW5zZm9ybShzZWxmKToKKyAgICAgICAgYiA9ICIiInJlZHVjZSh4LCB4cmFuZ2UoNSkpIiIiCisgICAgICAgIGEgPSAiIiJmcm9tIGZ1bmN0b29scyBpbXBvcnQgcmVkdWNlCityZWR1Y2UoeCwgcmFuZ2UoNSkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9yYXdfaW5wdXQoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAicmF3X2lucHV0IgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSAgICByYXdfaW5wdXQoICAgKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgIGlucHV0KCAgICkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gcmF3X2lucHV0KCAgICcnICAgKSIiIgorICAgICAgICBhID0gIiIieCA9IGlucHV0KCAgICcnICAgKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IHJhd19pbnB1dCgpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gaW5wdXQoKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IHJhd19pbnB1dCgnJykiIiIKKyAgICAgICAgYSA9ICIiInggPSBpbnB1dCgnJykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSByYXdfaW5wdXQoJ3Byb21wdCcpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gaW5wdXQoJ3Byb21wdCcpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gcmF3X2lucHV0KGZvbyhhKSArIDYpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gaW5wdXQoZm9vKGEpICsgNikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSByYXdfaW5wdXQoaW52aXRlKS5zcGxpdCgpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gaW5wdXQoaW52aXRlKS5zcGxpdCgpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzYoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gcmF3X2lucHV0KGludml0ZSkgLiBzcGxpdCAoKSIiIgorICAgICAgICBhID0gIiIieCA9IGlucHV0KGludml0ZSkgLiBzcGxpdCAoKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF84KHNlbGYpOgorICAgICAgICBiID0gInggPSBpbnQocmF3X2lucHV0KCkpIgorICAgICAgICBhID0gInggPSBpbnQoaW5wdXQoKSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9mdW5jYXR0cnMoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiZnVuY2F0dHJzIgorCisgICAgYXR0cnMgPSBbImNsb3N1cmUiLCAiZG9jIiwgIm5hbWUiLCAiZGVmYXVsdHMiLCAiY29kZSIsICJnbG9iYWxzIiwgImRpY3QiXQorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuYXR0cnM6CisgICAgICAgICAgICBiID0gImEuZnVuY18lcyIgJSBhdHRyCisgICAgICAgICAgICBhID0gImEuX18lc19fIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgYiA9ICJzZWxmLmZvby5mdW5jXyVzLmZvb19iYXIiICUgYXR0cgorICAgICAgICAgICAgYSA9ICJzZWxmLmZvby5fXyVzX18uZm9vX2JhciIgJSBhdHRyCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuYXR0cnM6CisgICAgICAgICAgICBzID0gImZvbyhmdW5jXyVzICsgNSkiICUgYXR0cgorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICAgICAgcyA9ICJmKGZvby5fXyVzX18pIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgICAgIHMgPSAiZihmb28uX18lc19fLmZvbykiICUgYXR0cgorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworY2xhc3MgVGVzdF94cmVhZGxpbmVzKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInhyZWFkbGluZXMiCisKKyAgICBkZWYgdGVzdF9jYWxsKHNlbGYpOgorICAgICAgICBiID0gImZvciB4IGluIGYueHJlYWRsaW5lcygpOiBwYXNzIgorICAgICAgICBhID0gImZvciB4IGluIGY6IHBhc3MiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZvciB4IGluIGZvbygpLnhyZWFkbGluZXMoKTogcGFzcyIKKyAgICAgICAgYSA9ICJmb3IgeCBpbiBmb28oKTogcGFzcyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZm9yIHggaW4gKDUgKyBmb28oKSkueHJlYWRsaW5lcygpOiBwYXNzIgorICAgICAgICBhID0gImZvciB4IGluICg1ICsgZm9vKCkpOiBwYXNzIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9hdHRyX3JlZihzZWxmKToKKyAgICAgICAgYiA9ICJmb28oZi54cmVhZGxpbmVzICsgNSkiCisgICAgICAgIGEgPSAiZm9vKGYuX19pdGVyX18gKyA1KSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZm9vKGYoKS54cmVhZGxpbmVzICsgNSkiCisgICAgICAgIGEgPSAiZm9vKGYoKS5fX2l0ZXJfXyArIDUpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJmb28oKDUgKyBmKCkpLnhyZWFkbGluZXMgKyA1KSIKKyAgICAgICAgYSA9ICJmb28oKDUgKyBmKCkpLl9faXRlcl9fICsgNSkiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgcyA9ICJmb3IgeCBpbiBmLnhyZWFkbGluZXMoNSk6IHBhc3MiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICJmb3IgeCBpbiBmLnhyZWFkbGluZXMoaz01KTogcGFzcyIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gImZvciB4IGluIGYueHJlYWRsaW5lcygqaywgKip2KTogcGFzcyIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gImZvbyh4cmVhZGxpbmVzKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworCitjbGFzcyBJbXBvcnRzRml4ZXJUZXN0czoKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGUoc2VsZik6CisgICAgICAgIGZvciBvbGQsIG5ldyBpbiBzZWxmLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGIgPSAiaW1wb3J0ICVzIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJpbXBvcnQgJXMiICUgbmV3CisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgIGIgPSAiaW1wb3J0IGZvbywgJXMsIGJhciIgJSBvbGQKKyAgICAgICAgICAgIGEgPSAiaW1wb3J0IGZvbywgJXMsIGJhciIgJSBuZXcKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBuZXcgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0IGZvbyIgJSBvbGQKKyAgICAgICAgICAgIGEgPSAiZnJvbSAlcyBpbXBvcnQgZm9vIiAlIG5ldworICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0IGZvbywgYmFyIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJmcm9tICVzIGltcG9ydCBmb28sIGJhciIgJSBuZXcKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgYiA9ICJmcm9tICVzIGltcG9ydCAoeWVzLCBubykiICUgb2xkCisgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0ICh5ZXMsIG5vKSIgJSBuZXcKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGVfYXMoc2VsZik6CisgICAgICAgIGZvciBvbGQsIG5ldyBpbiBzZWxmLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGIgPSAiaW1wb3J0ICVzIGFzIGZvb19iYXIiICUgb2xkCisgICAgICAgICAgICBhID0gImltcG9ydCAlcyBhcyBmb29fYmFyIiAlIG5ldworICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBiID0gImltcG9ydCAlcyBhcyBmb29fYmFyIiAlIG9sZAorICAgICAgICAgICAgYSA9ICJpbXBvcnQgJXMgYXMgZm9vX2JhciIgJSBuZXcKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tX2FzKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBuZXcgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0IGZvbyBhcyBiYXIiICUgb2xkCisgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0IGZvbyBhcyBiYXIiICUgbmV3CisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zdGFyKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBuZXcgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICoiICUgb2xkCisgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0ICoiICUgbmV3CisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfbW9kdWxlX3VzYWdlKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBuZXcgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgZm9vKCVzLmJhcikKKyAgICAgICAgICAgICAgICAiIiIgJSAob2xkLCBvbGQpCisgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgZm9vKCVzLmJhcikKKyAgICAgICAgICAgICAgICAiIiIgJSAobmV3LCBuZXcpCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgICAgICBmcm9tICVzIGltcG9ydCB4CisgICAgICAgICAgICAgICAgJXMgPSAyMworICAgICAgICAgICAgICAgICIiIiAlIChvbGQsIG9sZCkKKyAgICAgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgICAgICBmcm9tICVzIGltcG9ydCB4CisgICAgICAgICAgICAgICAgJXMgPSAyMworICAgICAgICAgICAgICAgICIiIiAlIChuZXcsIG9sZCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAgICAgICAgICVzLm1ldGhvZCgpCisgICAgICAgICAgICAgICAgIiIiICUgKG9sZCwpCisgICAgICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgICAgICAjIHRlc3QgbmVzdGVkIHVzYWdlCisgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgJXMuYmFyKCVzLmZvbykKKyAgICAgICAgICAgICAgICAiIiIgJSAob2xkLCBvbGQsIG9sZCkKKyAgICAgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICAlcy5iYXIoJXMuZm9vKQorICAgICAgICAgICAgICAgICIiIiAlIChuZXcsIG5ldywgbmV3KQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgeC4lcworICAgICAgICAgICAgICAgICIiIiAlIChvbGQsIG9sZCkKKyAgICAgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICB4LiVzCisgICAgICAgICAgICAgICAgIiIiICUgKG5ldywgb2xkKQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKK2NsYXNzIFRlc3RfaW1wb3J0cyhGaXhlclRlc3RDYXNlLCBJbXBvcnRzRml4ZXJUZXN0cyk6CisgICAgZml4ZXIgPSAiaW1wb3J0cyIKKyAgICBmcm9tIC4uZml4ZXMuZml4X2ltcG9ydHMgaW1wb3J0IE1BUFBJTkcgYXMgbW9kdWxlcworCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfaW1wb3J0cyhzZWxmKToKKyAgICAgICAgYiA9ICIiImltcG9ydCB1cmxwYXJzZSwgY1N0cmluZ0lPIiIiCisgICAgICAgIGEgPSAiIiJpbXBvcnQgdXJsbGliLnBhcnNlLCBpbyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9pbXBvcnRzX2FzKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgY29weV9yZWcgYXMgYmFyLCBIVE1MUGFyc2VyIGFzIGZvbywgdXJscGFyc2UKKyAgICAgICAgICAgIHMgPSB1cmxwYXJzZS5zcGFtKGJhci5mb28oKSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgY29weXJlZyBhcyBiYXIsIGh0bWwucGFyc2VyIGFzIGZvbywgdXJsbGliLnBhcnNlCisgICAgICAgICAgICBzID0gdXJsbGliLnBhcnNlLnNwYW0oYmFyLmZvbygpKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCitjbGFzcyBUZXN0X2ltcG9ydHMyKEZpeGVyVGVzdENhc2UsIEltcG9ydHNGaXhlclRlc3RzKToKKyAgICBmaXhlciA9ICJpbXBvcnRzMiIKKyAgICBmcm9tIC4uZml4ZXMuZml4X2ltcG9ydHMyIGltcG9ydCBNQVBQSU5HIGFzIG1vZHVsZXMKKworCitjbGFzcyBUZXN0X2ltcG9ydHNfZml4ZXJfb3JkZXIoRml4ZXJUZXN0Q2FzZSwgSW1wb3J0c0ZpeGVyVGVzdHMpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0X2ltcG9ydHNfZml4ZXJfb3JkZXIsIHNlbGYpLnNldFVwKFsnaW1wb3J0cycsICdpbXBvcnRzMiddKQorICAgICAgICBmcm9tIC4uZml4ZXMuZml4X2ltcG9ydHMyIGltcG9ydCBNQVBQSU5HIGFzIG1hcHBpbmcyCisgICAgICAgIHNlbGYubW9kdWxlcyA9IG1hcHBpbmcyLmNvcHkoKQorICAgICAgICBmcm9tIC4uZml4ZXMuZml4X2ltcG9ydHMgaW1wb3J0IE1BUFBJTkcgYXMgbWFwcGluZzEKKyAgICAgICAgZm9yIGtleSBpbiAoJ2RiaGFzaCcsICdkdW1iZGJtJywgJ2RibScsICdnZGJtJyk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZXNba2V5XSA9IG1hcHBpbmcxW2tleV0KKworICAgIGRlZiB0ZXN0X2FmdGVyX2xvY2FsX2ltcG9ydHNfcmVmYWN0b3Jpbmcoc2VsZik6CisgICAgICAgIGZvciBmaXggaW4gKCJpbXBvcnRzIiwgImltcG9ydHMyIik6CisgICAgICAgICAgICBzZWxmLmZpeGVyID0gZml4CisgICAgICAgICAgICBzZWxmLmFzc2VydF9ydW5zX2FmdGVyKCJpbXBvcnQiKQorCisKK2NsYXNzIFRlc3RfdXJsbGliKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInVybGxpYiIKKyAgICBmcm9tIC4uZml4ZXMuZml4X3VybGxpYiBpbXBvcnQgTUFQUElORyBhcyBtb2R1bGVzCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfbW9kdWxlKHNlbGYpOgorICAgICAgICBmb3Igb2xkLCBjaGFuZ2VzIGluIHNlbGYubW9kdWxlcy5pdGVtcygpOgorICAgICAgICAgICAgYiA9ICJpbXBvcnQgJXMiICUgb2xkCisgICAgICAgICAgICBhID0gImltcG9ydCAlcyIgJSAiLCAiLmpvaW4obWFwKGl0ZW1nZXR0ZXIoMCksIGNoYW5nZXMpKQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2Zyb20oc2VsZik6CisgICAgICAgIGZvciBvbGQsIGNoYW5nZXMgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBhbGxfbWVtYmVycyA9IFtdCisgICAgICAgICAgICBmb3IgbmV3LCBtZW1iZXJzIGluIGNoYW5nZXM6CisgICAgICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgICAgICAgICBhbGxfbWVtYmVycy5hcHBlbmQobWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICVzIiAlIChvbGQsIG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgYSA9ICJmcm9tICVzIGltcG9ydCAlcyIgJSAobmV3LCBtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgICAgICAgICBzID0gImZyb20gZm9vIGltcG9ydCAlcyIgJSBtZW1iZXIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICAgICAgICAgIGIgPSAiZnJvbSAlcyBpbXBvcnQgJXMiICUgKG9sZCwgIiwgIi5qb2luKG1lbWJlcnMpKQorICAgICAgICAgICAgICAgIGEgPSAiZnJvbSAlcyBpbXBvcnQgJXMiICUgKG5ldywgIiwgIi5qb2luKG1lbWJlcnMpKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgICAgIHMgPSAiZnJvbSBmb28gaW1wb3J0ICVzIiAlICIsICIuam9pbihtZW1iZXJzKQorICAgICAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgICAgICMgdGVzdCB0aGUgYnJlYWtpbmcgb2YgYSBtb2R1bGUgaW50byBtdWx0aXBsZSByZXBsYWNlbWVudHMKKyAgICAgICAgICAgIGIgPSAiZnJvbSAlcyBpbXBvcnQgJXMiICUgKG9sZCwgIiwgIi5qb2luKGFsbF9tZW1iZXJzKSkKKyAgICAgICAgICAgIGEgPSAiXG4iLmpvaW4oWyJmcm9tICVzIGltcG9ydCAlcyIgJSAobmV3LCAiLCAiLmpvaW4obWVtYmVycykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuZXcsIG1lbWJlcnMpIGluIGNoYW5nZXNdKQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X21vZHVsZV9hcyhzZWxmKToKKyAgICAgICAgZm9yIG9sZCBpbiBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgICBzID0gImltcG9ydCAlcyBhcyBmb28iICUgb2xkCisgICAgICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiVGhpcyBtb2R1bGUgaXMgbm93IG11bHRpcGxlIG1vZHVsZXMiKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2Zyb21fYXMoc2VsZik6CisgICAgICAgIGZvciBvbGQsIGNoYW5nZXMgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgbmV3LCBtZW1iZXJzIGluIGNoYW5nZXM6CisgICAgICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICVzIGFzIGZvb19iYXIiICUgKG9sZCwgbWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0ICVzIGFzIGZvb19iYXIiICUgKG5ldywgbWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisgICAgICAgICAgICAgICAgICAgIGIgPSAiZnJvbSAlcyBpbXBvcnQgJXMgYXMgYmxhaCwgJXMiICUgKG9sZCwgbWVtYmVyLCBtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgIGEgPSAiZnJvbSAlcyBpbXBvcnQgJXMgYXMgYmxhaCwgJXMiICUgKG5ldywgbWVtYmVyLCBtZW1iZXIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3N0YXIoc2VsZik6CisgICAgICAgIGZvciBvbGQgaW4gc2VsZi5tb2R1bGVzOgorICAgICAgICAgICAgcyA9ICJmcm9tICVzIGltcG9ydCAqIiAlIG9sZAorICAgICAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbm5vdCBoYW5kbGUgc3RhciBpbXBvcnRzIikKKworICAgIGRlZiB0ZXN0X2luZGVudGVkKHNlbGYpOgorICAgICAgICBiID0gIiIiCitkZWYgZm9vKCk6CisgICAgZnJvbSB1cmxsaWIgaW1wb3J0IHVybGVuY29kZSwgdXJsb3BlbgorIiIiCisgICAgICAgIGEgPSAiIiIKK2RlZiBmb28oKToKKyAgICBmcm9tIHVybGxpYi5wYXJzZSBpbXBvcnQgdXJsZW5jb2RlCisgICAgZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgdXJsb3BlbgorIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCitkZWYgZm9vKCk6CisgICAgb3RoZXIoKQorICAgIGZyb20gdXJsbGliIGltcG9ydCB1cmxlbmNvZGUsIHVybG9wZW4KKyIiIgorICAgICAgICBhID0gIiIiCitkZWYgZm9vKCk6CisgICAgb3RoZXIoKQorICAgIGZyb20gdXJsbGliLnBhcnNlIGltcG9ydCB1cmxlbmNvZGUKKyAgICBmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuCisiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9tb2R1bGVfdXNhZ2Uoc2VsZik6CisgICAgICAgIGZvciBvbGQsIGNoYW5nZXMgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgbmV3LCBtZW1iZXJzIGluIGNoYW5nZXM6CisgICAgICAgICAgICAgICAgZm9yIG1lbWJlciBpbiBtZW1iZXJzOgorICAgICAgICAgICAgICAgICAgICBuZXdfaW1wb3J0ID0gIiwgIi5qb2luKFtuIGZvciAobiwgbWVtcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc2VsZi5tb2R1bGVzW29sZF1dKQorICAgICAgICAgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbyglcy4lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIiAlIChvbGQsIG9sZCwgbWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbyglcy4lcykKKyAgICAgICAgICAgICAgICAgICAgICAgICIiIiAlIChuZXdfaW1wb3J0LCBuZXcsIG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorICAgICAgICAgICAgICAgICAgICBiID0gIiIiCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICAgICAgICAgICVzLiVzKCVzLiVzKQorICAgICAgICAgICAgICAgICAgICAgICAgIiIiICUgKG9sZCwgb2xkLCBtZW1iZXIsIG9sZCwgbWVtYmVyKQorICAgICAgICAgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICAgICAgICAgICVzLiVzKCVzLiVzKQorICAgICAgICAgICAgICAgICAgICAgICAgIiIiICUgKG5ld19pbXBvcnQsIG5ldywgbWVtYmVyLCBuZXcsIG1lbWJlcikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKK2NsYXNzIFRlc3RfaW5wdXQoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiaW5wdXQiCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9ICAgaW5wdXQoICAgKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgZXZhbChpbnB1dCggICApKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSBpbnB1dCggICAnJyAgICkiIiIKKyAgICAgICAgYSA9ICIiInggPSBldmFsKGlucHV0KCAgICcnICAgKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdHJhaWxpbmdfY29tbWVudChzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBpbnB1dCgpICAjICBmb28iIiIKKyAgICAgICAgYSA9ICIiInggPSBldmFsKGlucHV0KCkpICAjICBmb28iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaWRlbXBvdGVuY3koc2VsZik6CisgICAgICAgIHMgPSAiIiJ4ID0gZXZhbChpbnB1dCgpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJ4ID0gZXZhbChpbnB1dCgnJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInggPSBldmFsKGlucHV0KGZvbyg1KSArIDkpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBpbnB1dCgpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZXZhbChpbnB1dCgpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGlucHV0KCcnKSIiIgorICAgICAgICBhID0gIiIieCA9IGV2YWwoaW5wdXQoJycpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGlucHV0KCdwcm9tcHQnKSIiIgorICAgICAgICBhID0gIiIieCA9IGV2YWwoaW5wdXQoJ3Byb21wdCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGlucHV0KGZvbyg1KSArIDkpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gZXZhbChpbnB1dChmb28oNSkgKyA5KSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCitjbGFzcyBUZXN0X3R1cGxlX3BhcmFtcyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJ0dXBsZV9wYXJhbXMiCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMShzZWxmKToKKyAgICAgICAgcyA9ICIiImRlZiBmb28oKTogcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiJkZWYgZm9vKGEsIGIsIGMpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMyhzZWxmKToKKyAgICAgICAgcyA9ICIiImRlZiBmb28oYT0zLCBiPTQsIGM9NSk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKChhLCBiKSwgYykpOgorICAgICAgICAgICAgICAgIHggPSA1IiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbyh4eHhfdG9kb19jaGFuZ2VtZSk6CisgICAgICAgICAgICAgICAgKChhLCBiKSwgYykgPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIHggPSA1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzIoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKChhLCBiKSwgYyksIGQpOgorICAgICAgICAgICAgICAgIHggPSA1IiIiCisKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbyh4eHhfdG9kb19jaGFuZ2VtZSwgZCk6CisgICAgICAgICAgICAgICAgKChhLCBiKSwgYykgPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIHggPSA1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKChhLCBiKSwgYyksIGQpIC0+IGU6CisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHh4eF90b2RvX2NoYW5nZW1lLCBkKSAtPiBlOgorICAgICAgICAgICAgICAgICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zZW1pY29sb24oc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKChhLCBiKSwgYykpOiB4ID0gNTsgeSA9IDciIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHh4eF90b2RvX2NoYW5nZW1lKTogKChhLCBiKSwgYykgPSB4eHhfdG9kb19jaGFuZ2VtZTsgeCA9IDU7IHkgPSA3IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2tleXdvcmRzKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpLCBkLCBlPTUpIC0+IHo6CisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHh4eF90b2RvX2NoYW5nZW1lLCBkLCBlPTUpIC0+IHo6CisgICAgICAgICAgICAgICAgKChhLCBiKSwgYykgPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIHggPSA1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3Moc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKChhLCBiKSwgYyksIGQsICp2YXJncywgKiprd2FyZ3MpIC0+IHo6CisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHh4eF90b2RvX2NoYW5nZW1lLCBkLCAqdmFyZ3MsICoqa3dhcmdzKSAtPiB6OgorICAgICAgICAgICAgICAgICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tdWx0aV8xKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpLCAoZCwgZSwgZikpIC0+IHo6CisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKworICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKHh4eF90b2RvX2NoYW5nZW1lLCB4eHhfdG9kb19jaGFuZ2VtZTEpIC0+IHo6CisgICAgICAgICAgICAgICAgKChhLCBiKSwgYykgPSB4eHhfdG9kb19jaGFuZ2VtZQorICAgICAgICAgICAgICAgIChkLCBlLCBmKSA9IHh4eF90b2RvX2NoYW5nZW1lMQorICAgICAgICAgICAgICAgIHggPSA1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X211bHRpXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oeCwgKChhLCBiKSwgYyksIGQsIChlLCBmLCBnKSwgeSkgLT4gejoKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oeCwgeHh4X3RvZG9fY2hhbmdlbWUsIGQsIHh4eF90b2RvX2NoYW5nZW1lMSwgeSkgLT4gejoKKyAgICAgICAgICAgICAgICAoKGEsIGIpLCBjKSA9IHh4eF90b2RvX2NoYW5nZW1lCisgICAgICAgICAgICAgICAgKGUsIGYsIGcpID0geHh4X3RvZG9fY2hhbmdlbWUxCisgICAgICAgICAgICAgICAgeCA9IDUiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCgoYSwgYiksIGMpLCAoZCwgZSwgZikpIC0+IHo6CisgICAgICAgICAgICAgICAgImZvbyBmb28gZm9vIGZvbyIKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oeHh4X3RvZG9fY2hhbmdlbWUsIHh4eF90b2RvX2NoYW5nZW1lMSkgLT4gejoKKyAgICAgICAgICAgICAgICAiZm9vIGZvbyBmb28gZm9vIgorICAgICAgICAgICAgICAgICgoYSwgYiksIGMpID0geHh4X3RvZG9fY2hhbmdlbWUKKyAgICAgICAgICAgICAgICAoZCwgZSwgZikgPSB4eHhfdG9kb19jaGFuZ2VtZTEKKyAgICAgICAgICAgICAgICB4ID0gNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfbm9fY2hhbmdlKHNlbGYpOgorICAgICAgICBzID0gIiIibGFtYmRhIHg6IHggKyA1IiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfcGFyZW5zX3NpbmdsZV9hcmcoc2VsZik6CisgICAgICAgIGIgPSAiIiJsYW1iZGEgKHgpOiB4ICsgNSIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHg6IHggKyA1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIibGFtYmRhKHgpOiB4ICsgNSIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHg6IHggKyA1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIibGFtYmRhICgoKCh4KSkpKTogeCArIDUiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4OiB4ICsgNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImxhbWJkYSgoKCh4KSkpKTogeCArIDUiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4OiB4ICsgNSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfc2ltcGxlKHNlbGYpOgorICAgICAgICBiID0gIiIibGFtYmRhICh4LCB5KTogeCArIGYoeSkiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4X3k6IHhfeVswXSArIGYoeF95WzFdKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImxhbWJkYSh4LCB5KTogeCArIGYoeSkiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4X3k6IHhfeVswXSArIGYoeF95WzFdKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoKCh4LCB5KSkpOiB4ICsgZih5KSIiIgorICAgICAgICBhID0gIiIibGFtYmRhIHhfeTogeF95WzBdICsgZih4X3lbMV0pIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIibGFtYmRhKCgoeCwgeSkpKTogeCArIGYoeSkiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4X3k6IHhfeVswXSArIGYoeF95WzFdKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfb25lX3R1cGxlKHNlbGYpOgorICAgICAgICBiID0gIiIibGFtYmRhICh4LCk6IHggKyBmKHgpIiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeDE6IHgxWzBdICsgZih4MVswXSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJsYW1iZGEgKCgoeCwpKSk6IHggKyBmKHgpIiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeDE6IHgxWzBdICsgZih4MVswXSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX3NpbXBsZV9tdWx0aV91c2Uoc2VsZik6CisgICAgICAgIGIgPSAiIiJsYW1iZGEgKHgsIHkpOiB4ICsgeCArIGYoeCkgKyB4IiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95OiB4X3lbMF0gKyB4X3lbMF0gKyBmKHhfeVswXSkgKyB4X3lbMF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX3NpbXBsZV9yZXZlcnNlKHNlbGYpOgorICAgICAgICBiID0gIiIibGFtYmRhICh4LCB5KTogeSArIHgiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4X3k6IHhfeVsxXSArIHhfeVswXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfbmVzdGVkKHNlbGYpOgorICAgICAgICBiID0gIiIibGFtYmRhICh4LCAoeSwgeikpOiB4ICsgeSArIHoiIiIKKyAgICAgICAgYSA9ICIiImxhbWJkYSB4X3lfejogeF95X3pbMF0gKyB4X3lfelsxXVswXSArIHhfeV96WzFdWzFdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIibGFtYmRhICgoKHgsICh5LCB6KSkpKTogeCArIHkgKyB6IiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95X3o6IHhfeV96WzBdICsgeF95X3pbMV1bMF0gKyB4X3lfelsxXVsxXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfbmVzdGVkX211bHRpX3VzZShzZWxmKToKKyAgICAgICAgYiA9ICIiImxhbWJkYSAoeCwgKHksIHopKTogeCArIHkgKyBmKHkpIiIiCisgICAgICAgIGEgPSAiIiJsYW1iZGEgeF95X3o6IHhfeV96WzBdICsgeF95X3pbMV1bMF0gKyBmKHhfeV96WzFdWzBdKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfbWV0aG9kYXR0cnMoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAibWV0aG9kYXR0cnMiCisKKyAgICBhdHRycyA9IFsiZnVuYyIsICJzZWxmIiwgImNsYXNzIl0KKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmF0dHJzOgorICAgICAgICAgICAgYiA9ICJhLmltXyVzIiAlIGF0dHIKKyAgICAgICAgICAgIGlmIGF0dHIgPT0gImNsYXNzIjoKKyAgICAgICAgICAgICAgICBhID0gImEuX19zZWxmX18uX19jbGFzc19fIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhID0gImEuX18lc19fIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAgICAgYiA9ICJzZWxmLmZvby5pbV8lcy5mb29fYmFyIiAlIGF0dHIKKyAgICAgICAgICAgIGlmIGF0dHIgPT0gImNsYXNzIjoKKyAgICAgICAgICAgICAgICBhID0gInNlbGYuZm9vLl9fc2VsZl9fLl9fY2xhc3NfXy5mb29fYmFyIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhID0gInNlbGYuZm9vLl9fJXNfXy5mb29fYmFyIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgZm9yIGF0dHIgaW4gc2VsZi5hdHRyczoKKyAgICAgICAgICAgIHMgPSAiZm9vKGltXyVzICsgNSkiICUgYXR0cgorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICAgICAgcyA9ICJmKGZvby5fXyVzX18pIiAlIGF0dHIKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgICAgIHMgPSAiZihmb28uX18lc19fLmZvbykiICUgYXR0cgorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworY2xhc3MgVGVzdF9uZXh0KEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gIm5leHQiCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIiaXQubmV4dCgpIiIiCisgICAgICAgIGEgPSAiIiJuZXh0KGl0KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIiYS5iLmMuZC5uZXh0KCkiIiIKKyAgICAgICAgYSA9ICIiIm5leHQoYS5iLmMuZCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiIihhICsgYikubmV4dCgpIiIiCisgICAgICAgIGEgPSAiIiJuZXh0KChhICsgYikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzQoc2VsZik6CisgICAgICAgIGIgPSAiIiJhKCkubmV4dCgpIiIiCisgICAgICAgIGEgPSAiIiJuZXh0KGEoKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgYiA9ICIiImEoKS5uZXh0KCkgKyBiIiIiCisgICAgICAgIGEgPSAiIiJuZXh0KGEoKSkgKyBiIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0XzYoc2VsZik6CisgICAgICAgIGIgPSAiIiJjKCAgICAgIGEoKS5uZXh0KCkgKyBiKSIiIgorICAgICAgICBhID0gIiIiYyggICAgICBuZXh0KGEoKSkgKyBiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGZvciBhIGluIGI6CisgICAgICAgICAgICAgICAgZm9vKGEpCisgICAgICAgICAgICAgICAgYS5uZXh0KCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhhKQorICAgICAgICAgICAgICAgIG5leHQoYSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGZvciBhIGluIGI6CisgICAgICAgICAgICAgICAgZm9vKGEpICMgYWJjCisgICAgICAgICAgICAgICAgIyBkZWYKKyAgICAgICAgICAgICAgICBhLm5leHQoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGZvciBhIGluIGI6CisgICAgICAgICAgICAgICAgZm9vKGEpICMgYWJjCisgICAgICAgICAgICAgICAgIyBkZWYKKyAgICAgICAgICAgICAgICBuZXh0KGEpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbl8zKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBuZXh0ID0gNQorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oYSkKKyAgICAgICAgICAgICAgICBhLm5leHQoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIG5leHQgPSA1CisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhhKQorICAgICAgICAgICAgICAgIGEuX19uZXh0X18oKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSwgaWdub3JlX3dhcm5pbmdzPVRydWUpCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uXzQoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIG5leHQgPSA1CisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhhKSAjIGFiYworICAgICAgICAgICAgICAgICMgZGVmCisgICAgICAgICAgICAgICAgYS5uZXh0KCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBuZXh0ID0gNQorICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICBmb28oYSkgIyBhYmMKKyAgICAgICAgICAgICAgICAjIGRlZgorICAgICAgICAgICAgICAgIGEuX19uZXh0X18oKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSwgaWdub3JlX3dhcm5pbmdzPVRydWUpCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uXzUoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIG5leHQgPSA1CisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhmb28oYSksICMgYWJjCisgICAgICAgICAgICAgICAgICAgIGEubmV4dCgpKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIG5leHQgPSA1CisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhmb28oYSksICMgYWJjCisgICAgICAgICAgICAgICAgICAgIGEuX19uZXh0X18oKSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEsIGlnbm9yZV93YXJuaW5ncz1UcnVlKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbl82KHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBmb3IgYSBpbiBiOgorICAgICAgICAgICAgICAgIGZvbyhmb28oYSksICMgYWJjCisgICAgICAgICAgICAgICAgICAgIGEubmV4dCgpKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGZvciBhIGluIGI6CisgICAgICAgICAgICAgICAgZm9vKGZvbyhhKSwgIyBhYmMKKyAgICAgICAgICAgICAgICAgICAgbmV4dChhKSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tZXRob2RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbWV0aG9kXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tZXRob2RfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dCh4KToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIF9fbmV4dF9fKHgpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbWV0aG9kXzQoc2VsZik6CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisKKyAgICAgICAgICAgICAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tZXRob2RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19hc3NpZ25fc2ltcGxlKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBuZXh0ID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2Fzc2lnbl90dXBsZV8xKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICAobmV4dCwgYSkgPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfYXNzaWduX3R1cGxlXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIChhLCAoYiwgKG5leHQsIGMpKSwgYSkgPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfYXNzaWduX2xpc3RfMShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgW25leHQsIGFdID0gZm9vCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2Fzc2lnbl9saXN0XzIoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIFthLCBbYiwgW25leHQsIGNdXSwgYV0gPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2Fzc2lnbihzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9fLm5leHQgPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2Fzc2lnbl9pbl90dXBsZShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIChhLCBfX2J1aWx0aW5fXy5uZXh0KSA9IGZvbworCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fYXNzaWduX2luX2xpc3Qoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgICAgICBbYSwgX19idWlsdGluX18ubmV4dF0gPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fdG9fbmV4dChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIEEubmV4dCA9IGZvbworCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X2Fzc2lnbl90b19uZXh0X2luX3R1cGxlKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgKGEsIEEubmV4dCkgPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fdG9fbmV4dF9pbl9saXN0KHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgW2EsIEEubmV4dF0gPSBmb28KKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfaW1wb3J0XzEoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBmb28uYmFyIGFzIG5leHQKKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfaW1wb3J0XzIoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBiYXIsIGJhci5mb28gYXMgbmV4dAorCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19pbXBvcnRfMyhzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IGJhciwgYmFyLmZvbyBhcyBuZXh0LCBiYXoKKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfaW1wb3J0X2Zyb21fMShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZnJvbSB4IGltcG9ydCBuZXh0CisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2ltcG9ydF9mcm9tXzIoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZyb20geC5hIGltcG9ydCBuZXh0CisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZiwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2ltcG9ydF9mcm9tXzMoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZyb20geCBpbXBvcnQgYSwgbmV4dCwgYgorCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19pbXBvcnRfZnJvbV80KHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmcm9tIHguYSBpbXBvcnQgYSwgbmV4dCwgYgorCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYsIGEsIGIpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19mdW5jZGVmXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGRlZiBuZXh0KGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsICJDYWxscyB0byBidWlsdGluIG5leHQoKSBwb3NzaWJseSBzaGFkb3dlZCIpCisKKyAgICBkZWYgdGVzdF9zaGFkb3dpbmdfZnVuY2RlZl8yKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBkZWYgbmV4dChhKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgaXQubmV4dCgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgZGVmIG5leHQoYSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBpdC5fX25leHRfXygpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJucyhiLCBhLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2dsb2JhbF8xKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIGdsb2JhbCBuZXh0CisgICAgICAgICAgICAgICAgbmV4dCA9IDUKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2dsb2JhbF8yKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIGdsb2JhbCBhLCBuZXh0LCBiCisgICAgICAgICAgICAgICAgbmV4dCA9IDUKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2Zvcl9zaW1wbGUoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBuZXh0IGluIGl0KCk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBiID0gNQorICAgICAgICAgICAgYyA9IDYKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiQ2FsbHMgdG8gYnVpbHRpbiBuZXh0KCkgcG9zc2libHkgc2hhZG93ZWQiKQorCisgICAgZGVmIHRlc3Rfc2hhZG93aW5nX2Zvcl90dXBsZV8xKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmb3IgbmV4dCwgYiBpbiBpdCgpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgYiA9IDUKKyAgICAgICAgICAgIGMgPSA2CisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X3NoYWRvd2luZ19mb3JfdHVwbGVfMihzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZm9yIGEsIChuZXh0LCBjKSwgYiBpbiBpdCgpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgYiA9IDUKKyAgICAgICAgICAgIGMgPSA2CisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgIkNhbGxzIHRvIGJ1aWx0aW4gbmV4dCgpIHBvc3NpYmx5IHNoYWRvd2VkIikKKworICAgIGRlZiB0ZXN0X25vbmNhbGxfYWNjZXNzXzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJnbmV4dCA9IGcubmV4dCIiIgorICAgICAgICBhID0gIiIiZ25leHQgPSBnLl9fbmV4dF9fIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25vbmNhbGxfYWNjZXNzXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJmKGcubmV4dCArIDUpIiIiCisgICAgICAgIGEgPSAiIiJmKGcuX19uZXh0X18gKyA1KSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9ub25jYWxsX2FjY2Vzc18zKHNlbGYpOgorICAgICAgICBiID0gIiIiZihnKCkubmV4dCArIDUpIiIiCisgICAgICAgIGEgPSAiIiJmKGcoKS5fX25leHRfXyArIDUpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9ub256ZXJvKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gIm5vbnplcm8iCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAgICAgZGVmIF9fYm9vbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19ib29sX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMShzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2Jvb2xfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMihzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmLCBhKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfZnVuYyhzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCitjbGFzcyBUZXN0X251bWxpdGVyYWxzKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gIm51bWxpdGVyYWxzIgorCisgICAgZGVmIHRlc3Rfb2N0YWxfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIjA3NTUiIiIKKyAgICAgICAgYSA9ICIiIjBvNzU1IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2xvbmdfaW50XzEoc2VsZik6CisgICAgICAgIGIgPSAiIiJhID0gMTJMIiIiCisgICAgICAgIGEgPSAiIiJhID0gMTIiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbG9uZ19pbnRfMihzZWxmKToKKyAgICAgICAgYiA9ICIiImEgPSAxMmwiIiIKKyAgICAgICAgYSA9ICIiImEgPSAxMiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sb25nX2hleChzZWxmKToKKyAgICAgICAgYiA9ICIiImIgPSAweDEybCIiIgorICAgICAgICBhID0gIiIiYiA9IDB4MTIiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY29tbWVudHNfYW5kX3NwYWNpbmcoc2VsZik6CisgICAgICAgIGIgPSAiIiJiID0gICAweDEyTCIiIgorICAgICAgICBhID0gIiIiYiA9ICAgMHgxMiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImIgPSAwNzU1ICMgc3BhbSIiIgorICAgICAgICBhID0gIiIiYiA9IDBvNzU1ICMgc3BhbSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfaW50KHNlbGYpOgorICAgICAgICBzID0gIiIiNSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX2Zsb2F0KHNlbGYpOgorICAgICAgICBzID0gIiIiNS4wIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfb2N0YWwoc2VsZik6CisgICAgICAgIHMgPSAiIiIwbzc1NSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX2hleChzZWxmKToKKyAgICAgICAgcyA9ICIiIjB4QUJDIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfZXhwKHNlbGYpOgorICAgICAgICBzID0gIiIiNS4wZTEwIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfY29tcGxleF9pbnQoc2VsZik6CisgICAgICAgIHMgPSAiIiI1ICsgNGoiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF9jb21wbGV4X2Zsb2F0KHNlbGYpOgorICAgICAgICBzID0gIiIiNS40ICsgNC45aiIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkX2NvbXBsZXhfYmFyZShzZWxmKToKKyAgICAgICAgcyA9ICIiIjRqIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisgICAgICAgIHMgPSAiIiI0LjRqIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKK2NsYXNzIFRlc3RfcmVuYW1lcyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJyZW5hbWVzIgorCisgICAgbW9kdWxlcyA9IHsic3lzIjogICgibWF4aW50IiwgIm1heHNpemUiKSwKKyAgICAgICAgICAgICAgfQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2Zyb20oc2VsZik6CisgICAgICAgIGZvciBtb2QsIChvbGQsIG5ldykgaW4gc2VsZi5tb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICBiID0gImZyb20gJXMgaW1wb3J0ICVzIiAlIChtb2QsIG9sZCkKKyAgICAgICAgICAgIGEgPSAiZnJvbSAlcyBpbXBvcnQgJXMiICUgKG1vZCwgbmV3KQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBzID0gImZyb20gZm9vIGltcG9ydCAlcyIgJSBvbGQKKyAgICAgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfZnJvbV9hcyhzZWxmKToKKyAgICAgICAgZm9yIG1vZCwgKG9sZCwgbmV3KSBpbiBzZWxmLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGIgPSAiZnJvbSAlcyBpbXBvcnQgJXMgYXMgZm9vX2JhciIgJSAobW9kLCBvbGQpCisgICAgICAgICAgICBhID0gImZyb20gJXMgaW1wb3J0ICVzIGFzIGZvb19iYXIiICUgKG1vZCwgbmV3KQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X21vZHVsZV91c2FnZShzZWxmKToKKyAgICAgICAgZm9yIG1vZCwgKG9sZCwgbmV3KSBpbiBzZWxmLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgICAgICBpbXBvcnQgJXMKKyAgICAgICAgICAgICAgICBmb28oJXMsICVzLiVzKQorICAgICAgICAgICAgICAgICIiIiAlIChtb2QsIG1vZCwgbW9kLCBvbGQpCisgICAgICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAgICAgaW1wb3J0ICVzCisgICAgICAgICAgICAgICAgZm9vKCVzLCAlcy4lcykKKyAgICAgICAgICAgICAgICAiIiIgJSAobW9kLCBtb2QsIG1vZCwgbmV3KQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIFhYWF90ZXN0X2Zyb21faW1wb3J0X3VzYWdlKHNlbGYpOgorICAgICAgICAjIG5vdCBpbXBsZW1lbnRlZCB5ZXQKKyAgICAgICAgZm9yIG1vZCwgKG9sZCwgbmV3KSBpbiBzZWxmLm1vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgICAgICBmcm9tICVzIGltcG9ydCAlcworICAgICAgICAgICAgICAgIGZvbyglcywgJXMpCisgICAgICAgICAgICAgICAgIiIiICUgKG1vZCwgb2xkLCBtb2QsIG9sZCkKKyAgICAgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgICAgICBmcm9tICVzIGltcG9ydCAlcworICAgICAgICAgICAgICAgIGZvbyglcywgJXMpCisgICAgICAgICAgICAgICAgIiIiICUgKG1vZCwgbmV3LCBtb2QsIG5ldykKKyAgICAgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF91bmljb2RlKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInVuaWNvZGUiCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICBiID0gIiIidW5pY29kZSggeCkiIiIKKyAgICAgICAgYSA9ICIiInN0ciggeCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIgdW5pY29kZSh4ICkiIiIKKyAgICAgICAgYSA9ICIiIiBzdHIoeCApIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiIHUnaCciIiIKKyAgICAgICAgYSA9ICIiIiAnaCciIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9jYWxsKHNlbGYpOgorICAgICAgICBiID0gIiIidW5pY29kZSh4LCB5LCB6KSIiIgorICAgICAgICBhID0gIiIic3RyKHgsIHksIHopIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuaWNocihzZWxmKToKKyAgICAgICAgYiA9ICIiInVuaWNocih1J2gnKSIiIgorICAgICAgICBhID0gIiIiY2hyKCdoJykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9saXRlcmFsXzEoc2VsZik6CisgICAgICAgIGIgPSAnJyd1IngiJycnCisgICAgICAgIGEgPSAnJycieCInJycKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9saXRlcmFsXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiJ1cid4JyIiIgorICAgICAgICBhID0gIiIicid4JyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2xpdGVyYWxfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiIlVSJycneCcnJyAiIiIKKyAgICAgICAgYSA9ICIiIlInJyd4JycnICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfY2FsbGFibGUoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiY2FsbGFibGUiCisKKyAgICBkZWYgdGVzdF9wcmVmaXhfcHJlc2VydmF0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIiY2FsbGFibGUoICAgIHgpIiIiCisgICAgICAgIGEgPSAiIiJpbXBvcnQgY29sbGVjdGlvbnNcbmlzaW5zdGFuY2UoICAgIHgsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlmICAgICBjYWxsYWJsZSh4KTogcGFzcyIiIgorICAgICAgICBhID0gIiIiaW1wb3J0IGNvbGxlY3Rpb25zCitpZiAgICAgaXNpbnN0YW5jZSh4LCBjb2xsZWN0aW9ucy5DYWxsYWJsZSk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY2FsbGFibGVfY2FsbChzZWxmKToKKyAgICAgICAgYiA9ICIiImNhbGxhYmxlKHgpIiIiCisgICAgICAgIGEgPSAiIiJpbXBvcnQgY29sbGVjdGlvbnNcbmlzaW5zdGFuY2UoeCwgY29sbGVjdGlvbnMuQ2FsbGFibGUpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2dsb2JhbF9pbXBvcnQoc2VsZik6CisgICAgICAgIGIgPSAiIiIKK2RlZiBzcGFtKGZvbyk6CisgICAgY2FsbGFibGUoZm9vKSIiIlsxOl0KKyAgICAgICAgYSA9ICIiIgoraW1wb3J0IGNvbGxlY3Rpb25zCitkZWYgc3BhbShmb28pOgorICAgIGlzaW5zdGFuY2UoZm9vLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkiIiJbMTpdCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCitpbXBvcnQgY29sbGVjdGlvbnMKK2RlZiBzcGFtKGZvbyk6CisgICAgY2FsbGFibGUoZm9vKSIiIlsxOl0KKyAgICAgICAgIyBzYW1lIG91dHB1dCBpZiBpdCB3YXMgYWxyZWFkeSBpbXBvcnRlZAorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgKgorZGVmIHNwYW0oZm9vKToKKyAgICBjYWxsYWJsZShmb28pIiIiWzE6XQorICAgICAgICBhID0gIiIiCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCAqCitpbXBvcnQgY29sbGVjdGlvbnMKK2RlZiBzcGFtKGZvbyk6CisgICAgaXNpbnN0YW5jZShmb28sIGNvbGxlY3Rpb25zLkNhbGxhYmxlKSIiIlsxOl0KKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKK2RvX3N0dWZmKCkKK2RvX3NvbWVfb3RoZXJfc3R1ZmYoKQorYXNzZXJ0IGNhbGxhYmxlKGRvX3N0dWZmKSIiIlsxOl0KKyAgICAgICAgYSA9ICIiIgoraW1wb3J0IGNvbGxlY3Rpb25zCitkb19zdHVmZigpCitkb19zb21lX290aGVyX3N0dWZmKCkKK2Fzc2VydCBpc2luc3RhbmNlKGRvX3N0dWZmLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkiIiJbMTpdCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCitpZiBpc2luc3RhbmNlKGRvX3N0dWZmLCBDYWxsYWJsZSk6CisgICAgYXNzZXJ0IGNhbGxhYmxlKGRvX3N0dWZmKQorICAgIGRvX3N0dWZmKGRvX3N0dWZmKQorICAgIGlmIG5vdCBjYWxsYWJsZShkb19zdHVmZik6CisgICAgICAgIGV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgICBhc3NlcnQgY2FsbGFibGUoZG9fc3R1ZmYpCitlbHNlOgorICAgIGFzc2VydCBub3QgY2FsbGFibGUoZG9fc3R1ZmYpIiIiWzE6XQorICAgICAgICBhID0gIiIiCitpbXBvcnQgY29sbGVjdGlvbnMKK2lmIGlzaW5zdGFuY2UoZG9fc3R1ZmYsIENhbGxhYmxlKToKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShkb19zdHVmZiwgY29sbGVjdGlvbnMuQ2FsbGFibGUpCisgICAgZG9fc3R1ZmYoZG9fc3R1ZmYpCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZG9fc3R1ZmYsIGNvbGxlY3Rpb25zLkNhbGxhYmxlKToKKyAgICAgICAgZXhpdCgxKQorICAgIGVsc2U6CisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRvX3N0dWZmLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkKK2Vsc2U6CisgICAgYXNzZXJ0IG5vdCBpc2luc3RhbmNlKGRvX3N0dWZmLCBjb2xsZWN0aW9ucy5DYWxsYWJsZSkiIiJbMTpdCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NhbGxhYmxlX3Nob3VsZF9ub3RfY2hhbmdlKHNlbGYpOgorICAgICAgICBhID0gIiIiY2FsbGFibGUoKngpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKKyAgICAgICAgYSA9ICIiImNhbGxhYmxlKHgsIHkpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKKyAgICAgICAgYSA9ICIiImNhbGxhYmxlKHgsIGt3PXkpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKKyAgICAgICAgYSA9ICIiImNhbGxhYmxlKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworY2xhc3MgVGVzdF9maWx0ZXIoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiZmlsdGVyIgorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSAgIGZpbHRlciggICAgZm9vLCAgICAgJ2FiYycgICApIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gICBsaXN0KGZpbHRlciggICAgZm9vLCAgICAgJ2FiYycgICApKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSAgIGZpbHRlciggIE5vbmUgLCAnYWJjJyAgKSIiIgorICAgICAgICBhID0gIiIieCA9ICAgW19mIGZvciBfZiBpbiAnYWJjJyBpZiBfZl0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfZmlsdGVyX2Jhc2ljKHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IGZpbHRlcihOb25lLCAnYWJjJykiIiIKKyAgICAgICAgYSA9ICIiInggPSBbX2YgZm9yIF9mIGluICdhYmMnIGlmIF9mXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSBsZW4oZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgYSA9ICIiInggPSBsZW4obGlzdChmaWx0ZXIoZiwgJ2FiYycpKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gZmlsdGVyKGxhbWJkYSB4OiB4JTIgPT0gMCwgcmFuZ2UoMTApKSIiIgorICAgICAgICBhID0gIiIieCA9IFt4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTIgPT0gMF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMgTm90ZSB0aGUgcGFyZW5zIGFyb3VuZCB4CisgICAgICAgIGIgPSAiIiJ4ID0gZmlsdGVyKGxhbWJkYSAoeCk6IHglMiA9PSAwLCByYW5nZSgxMCkpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gW3ggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHglMiA9PSAwXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgIyBYWFggVGhpcyAocmFyZSkgY2FzZSBpcyBub3Qgc3VwcG9ydGVkCisjIyAgICAgICAgIGIgPSAiIiJ4ID0gZmlsdGVyKGYsICdhYmMnKVswXSIiIgorIyMgICAgICAgICBhID0gIiIieCA9IGxpc3QoZmlsdGVyKGYsICdhYmMnKSlbMF0iIiIKKyMjICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfZmlsdGVyX25vY2hhbmdlKHNlbGYpOgorICAgICAgICBhID0gIiIiYi5qb2luKGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiIoYSArIGZvbyg1KSkuam9pbihmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiaXRlcihmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIibGlzdChmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIibGlzdChmaWx0ZXIoZiwgJ2FiYycpKVswXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic2V0KGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzZXQoZmlsdGVyKGYsICdhYmMnKSkucG9wKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInR1cGxlKGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJhbnkoZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImFsbChmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic3VtKGZpbHRlcihmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzb3J0ZWQoZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZChmaWx0ZXIoZiwgJ2FiYycpLCBrZXk9YmxhaCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZChmaWx0ZXIoZiwgJ2FiYycpLCBrZXk9YmxhaClbMF0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImVudW1lcmF0ZShmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZW51bWVyYXRlKGZpbHRlcihmLCAnYWJjJyksIHN0YXJ0PTEpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJmb3IgaSBpbiBmaWx0ZXIoZiwgJ2FiYycpOiBwYXNzIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJbeCBmb3IgeCBpbiBmaWx0ZXIoZiwgJ2FiYycpXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiKHggZm9yIHggaW4gZmlsdGVyKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworICAgIGRlZiB0ZXN0X2Z1dHVyZV9idWlsdGlucyhzZWxmKToKKyAgICAgICAgYSA9ICJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgc3BhbSwgZmlsdGVyOyBmaWx0ZXIoZiwgJ2hhbScpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCisgICAgICAgIGIgPSAiIiJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgc3BhbTsgeCA9IGZpbHRlcihmLCAnYWJjJykiIiIKKyAgICAgICAgYSA9ICIiImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBzcGFtOyB4ID0gbGlzdChmaWx0ZXIoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYSA9ICJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgKjsgZmlsdGVyKGYsICdoYW0nKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworY2xhc3MgVGVzdF9tYXAoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAibWFwIgorCisgICAgZGVmIGNoZWNrKHNlbGYsIGIsIGEpOgorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IG1hcDsgIiArIGIsIGEpCisgICAgICAgIHN1cGVyKFRlc3RfbWFwLCBzZWxmKS5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfcHJlZml4X3ByZXNlcnZhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSAgICBtYXAoICAgZiwgICAgJ2FiYycgICApIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gICAgbGlzdChtYXAoICAgZiwgICAgJ2FiYycgICApKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90cmFpbGluZ19jb21tZW50KHNlbGYpOgorICAgICAgICBiID0gIiIieCA9IG1hcChmLCAnYWJjJykgICAjICAgZm9vIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdChtYXAoZiwgJ2FiYycpKSAgICMgICBmb28iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfTm9uZV93aXRoX211bHRpcGxlX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgcyA9ICIiInggPSBtYXAoTm9uZSwgYSwgYiwgYykiIiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgImNhbm5vdCBjb252ZXJ0IG1hcChOb25lLCAuLi4pIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGlwbGUgYXJndW1lbnRzIikKKworICAgIGRlZiB0ZXN0X21hcF9iYXNpYyhzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBtYXAoZiwgJ2FiYycpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdChtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSBsZW4obWFwKGYsICdhYmMnLCAnZGVmJykpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGVuKGxpc3QobWFwKGYsICdhYmMnLCAnZGVmJykpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInggPSBtYXAoTm9uZSwgJ2FiYycpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdCgnYWJjJykiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gbWFwKGxhbWJkYSB4OiB4KzEsIHJhbmdlKDQpKSIiIgorICAgICAgICBhID0gIiIieCA9IFt4KzEgZm9yIHggaW4gcmFuZ2UoNCldIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICAjIE5vdGUgdGhlIHBhcmVucyBhcm91bmQgeAorICAgICAgICBiID0gIiIieCA9IG1hcChsYW1iZGEgKHgpOiB4KzEsIHJhbmdlKDQpKSIiIgorICAgICAgICBhID0gIiIieCA9IFt4KzEgZm9yIHggaW4gcmFuZ2UoNCldIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBmb28oKQorICAgICAgICAgICAgIyBmb28KKyAgICAgICAgICAgIG1hcChmLCB4KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGZvbygpCisgICAgICAgICAgICAjIGZvbworICAgICAgICAgICAgbGlzdChtYXAoZiwgeCkpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi53YXJucyhiLCBhLCAiWW91IHNob3VsZCB1c2UgYSBmb3IgbG9vcCBoZXJlIikKKworICAgICAgICAjIFhYWCBUaGlzIChyYXJlKSBjYXNlIGlzIG5vdCBzdXBwb3J0ZWQKKyMjICAgICAgICAgYiA9ICIiInggPSBtYXAoZiwgJ2FiYycpWzBdIiIiCisjIyAgICAgICAgIGEgPSAiIiJ4ID0gbGlzdChtYXAoZiwgJ2FiYycpKVswXSIiIgorIyMgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9tYXBfbm9jaGFuZ2Uoc2VsZik6CisgICAgICAgIGEgPSAiIiJiLmpvaW4obWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIihhICsgZm9vKDUpKS5qb2luKG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJpdGVyKG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJsaXN0KG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJsaXN0KG1hcChmLCAnYWJjJykpWzBdIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzZXQobWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNldChtYXAoZiwgJ2FiYycpKS5wb3AoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIidHVwbGUobWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImFueShtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiYWxsKG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzdW0obWFwKGYsICdhYmMnKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZChtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic29ydGVkKG1hcChmLCAnYWJjJyksIGtleT1ibGFoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic29ydGVkKG1hcChmLCAnYWJjJyksIGtleT1ibGFoKVswXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZW51bWVyYXRlKG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJlbnVtZXJhdGUobWFwKGYsICdhYmMnKSwgc3RhcnQ9MSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImZvciBpIGluIG1hcChmLCAnYWJjJyk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIlt4IGZvciB4IGluIG1hcChmLCAnYWJjJyldIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiIoeCBmb3IgeCBpbiBtYXAoZiwgJ2FiYycpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCisgICAgZGVmIHRlc3RfZnV0dXJlX2J1aWx0aW5zKHNlbGYpOgorICAgICAgICBhID0gImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBzcGFtLCBtYXAsIGVnZ3M7IG1hcChmLCAnaGFtJykiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKKyAgICAgICAgYiA9ICIiImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBzcGFtLCBlZ2dzOyB4ID0gbWFwKGYsICdhYmMnKSIiIgorICAgICAgICBhID0gIiIiZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IHNwYW0sIGVnZ3M7IHggPSBsaXN0KG1hcChmLCAnYWJjJykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBhID0gImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCAqOyBtYXAoZiwgJ2hhbScpIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCitjbGFzcyBUZXN0X3ppcChGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJ6aXAiCisKKyAgICBkZWYgY2hlY2soc2VsZiwgYiwgYSk6CisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJmcm9tIGZ1dHVyZV9idWlsdGlucyBpbXBvcnQgemlwOyAiICsgYiwgYSkKKyAgICAgICAgc3VwZXIoVGVzdF96aXAsIHNlbGYpLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF96aXBfYmFzaWMoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gemlwKGEsIGIsIGMpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGlzdCh6aXAoYSwgYiwgYykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIieCA9IGxlbih6aXAoYSwgYikpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gbGVuKGxpc3QoemlwKGEsIGIpKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfemlwX25vY2hhbmdlKHNlbGYpOgorICAgICAgICBhID0gIiIiYi5qb2luKHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIihhICsgZm9vKDUpKS5qb2luKHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiIml0ZXIoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIibGlzdCh6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJsaXN0KHppcChhLCBiKSlbMF0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNldCh6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzZXQoemlwKGEsIGIpKS5wb3AoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIidHVwbGUoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiYW55KHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImFsbCh6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJzdW0oemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic29ydGVkKHppcChhLCBiKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiInNvcnRlZCh6aXAoYSwgYiksIGtleT1ibGFoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIic29ydGVkKHppcChhLCBiKSwga2V5PWJsYWgpWzBdIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisgICAgICAgIGEgPSAiIiJlbnVtZXJhdGUoemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiZW51bWVyYXRlKHppcChhLCBiKSwgc3RhcnQ9MSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKyAgICAgICAgYSA9ICIiImZvciBpIGluIHppcChhLCBiKTogcGFzcyIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiW3ggZm9yIHggaW4gemlwKGEsIGIpXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorICAgICAgICBhID0gIiIiKHggZm9yIHggaW4gemlwKGEsIGIpKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChhKQorCisgICAgZGVmIHRlc3RfZnV0dXJlX2J1aWx0aW5zKHNlbGYpOgorICAgICAgICBhID0gImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBzcGFtLCB6aXAsIGVnZ3M7IHppcChhLCBiKSIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworICAgICAgICBiID0gIiIiZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IHNwYW0sIGVnZ3M7IHggPSB6aXAoYSwgYikiIiIKKyAgICAgICAgYSA9ICIiImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCBzcGFtLCBlZ2dzOyB4ID0gbGlzdCh6aXAoYSwgYikpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBhID0gImZyb20gZnV0dXJlX2J1aWx0aW5zIGltcG9ydCAqOyB6aXAoYSwgYikiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKGEpCisKK2NsYXNzIFRlc3Rfc3RhbmRhcmRlcnJvcihGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJzdGFuZGFyZGVycm9yIgorCisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGIgPSAiIiJ4ID0gICAgU3RhbmRhcmRFcnJvcigpIiIiCisgICAgICAgIGEgPSAiIiJ4ID0gICAgRXhjZXB0aW9uKCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ4ID0gU3RhbmRhcmRFcnJvcihhLCBiLCBjKSIiIgorICAgICAgICBhID0gIiIieCA9IEV4Y2VwdGlvbihhLCBiLCBjKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImYoMiArIFN0YW5kYXJkRXJyb3IoYSwgYiwgYykpIiIiCisgICAgICAgIGEgPSAiIiJmKDIgKyBFeGNlcHRpb24oYSwgYiwgYykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF90eXBlcyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJ0eXBlcyIKKworICAgIGRlZiB0ZXN0X2Jhc2ljX3R5cGVzX2NvbnZlcnQoc2VsZik6CisgICAgICAgIGIgPSAiIiJ0eXBlcy5TdHJpbmdUeXBlIiIiCisgICAgICAgIGEgPSAiIiJieXRlcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInR5cGVzLkRpY3RUeXBlIiIiCisgICAgICAgIGEgPSAiIiJkaWN0IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIidHlwZXMgLiBJbnRUeXBlIiIiCisgICAgICAgIGEgPSAiIiJpbnQiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ0eXBlcy5MaXN0VHlwZSIiIgorICAgICAgICBhID0gIiIibGlzdCIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInR5cGVzLkxvbmdUeXBlIiIiCisgICAgICAgIGEgPSAiIiJpbnQiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJ0eXBlcy5Ob25lVHlwZSIiIgorICAgICAgICBhID0gIiIidHlwZShOb25lKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfaWRpb21zKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImlkaW9tcyIKKworICAgIGRlZiB0ZXN0X3doaWxlKHNlbGYpOgorICAgICAgICBiID0gIiIid2hpbGUgMTogZm9vKCkiIiIKKyAgICAgICAgYSA9ICIiIndoaWxlIFRydWU6IGZvbygpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIid2hpbGUgICAxOiBmb28oKSIiIgorICAgICAgICBhID0gIiIid2hpbGUgICBUcnVlOiBmb28oKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBmb28oKQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgZm9vKCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF93aGlsZV91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiJ3aGlsZSAxMTogZm9vKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIid2hpbGUgMDogZm9vKCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIid2hpbGUgZm9vKCk6IGZvbygpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiIndoaWxlIFtdOiBmb28oKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfZXFfc2ltcGxlKHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZSh4KSA9PSBUIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIFQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiaWYgICB0eXBlKHgpID09IFQ6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmICAgaXNpbnN0YW5jZSh4LCBUKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9lcV9yZXZlcnNlKHNlbGYpOgorICAgICAgICBiID0gIiIiVCA9PSB0eXBlKHgpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHgsIFQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiaWYgICBUID09IHR5cGUoeCk6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmICAgaXNpbnN0YW5jZSh4LCBUKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9lcV9leHByZXNzaW9uKHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZSh4K3kpID09IGQuZ2V0KCdUJykiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoeCt5LCBkLmdldCgnVCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInR5cGUoICAgeCAgKyAgeSkgPT0gZC5nZXQoJ1QnKSIiIgorICAgICAgICBhID0gIiIiaXNpbnN0YW5jZSh4ICArICB5LCBkLmdldCgnVCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pc19zaW1wbGUoc2VsZik6CisgICAgICAgIGIgPSAiIiJ0eXBlKHgpIGlzIFQiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoeCwgVCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpZiAgIHR5cGUoeCkgaXMgVDogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgICBpc2luc3RhbmNlKHgsIFQpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2lzX3JldmVyc2Uoc2VsZik6CisgICAgICAgIGIgPSAiIiJUIGlzIHR5cGUoeCkiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoeCwgVCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJpZiAgIFQgaXMgdHlwZSh4KTogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgICBpc2luc3RhbmNlKHgsIFQpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2lzX2V4cHJlc3Npb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJ0eXBlKHgreSkgaXMgZC5nZXQoJ1QnKSIiIgorICAgICAgICBhID0gIiIiaXNpbnN0YW5jZSh4K3ksIGQuZ2V0KCdUJykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIidHlwZSggICB4ICArICB5KSBpcyBkLmdldCgnVCcpIiIiCisgICAgICAgIGEgPSAiIiJpc2luc3RhbmNlKHggICsgIHksIGQuZ2V0KCdUJykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2lzX25vdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGIgPSAiIiJ0eXBlKHgpIGlzIG5vdCBUIiIiCisgICAgICAgIGEgPSAiIiJub3QgaXNpbnN0YW5jZSh4LCBUKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlmICAgdHlwZSh4KSBpcyBub3QgVDogcGFzcyIiIgorICAgICAgICBhID0gIiIiaWYgICBub3QgaXNpbnN0YW5jZSh4LCBUKTogcGFzcyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pc19ub3RfcmV2ZXJzZShzZWxmKToKKyAgICAgICAgYiA9ICIiIlQgaXMgbm90IHR5cGUoeCkiIiIKKyAgICAgICAgYSA9ICIiIm5vdCBpc2luc3RhbmNlKHgsIFQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiaWYgICBUIGlzIG5vdCB0eXBlKHgpOiBwYXNzIiIiCisgICAgICAgIGEgPSAiIiJpZiAgIG5vdCBpc2luc3RhbmNlKHgsIFQpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2lzX25vdF9leHByZXNzaW9uKHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZSh4K3kpIGlzIG5vdCBkLmdldCgnVCcpIiIiCisgICAgICAgIGEgPSAiIiJub3QgaXNpbnN0YW5jZSh4K3ksIGQuZ2V0KCdUJykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIidHlwZSggICB4ICArICB5KSBpcyBub3QgZC5nZXQoJ1QnKSIiIgorICAgICAgICBhID0gIiIibm90IGlzaW5zdGFuY2UoeCAgKyAgeSwgZC5nZXQoJ1QnKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbmVfc2ltcGxlKHNlbGYpOgorICAgICAgICBiID0gIiIidHlwZSh4KSAhPSBUIiIiCisgICAgICAgIGEgPSAiIiJub3QgaXNpbnN0YW5jZSh4LCBUKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiImlmICAgdHlwZSh4KSAhPSBUOiBwYXNzIiIiCisgICAgICAgIGEgPSAiIiJpZiAgIG5vdCBpc2luc3RhbmNlKHgsIFQpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25lX3JldmVyc2Uoc2VsZik6CisgICAgICAgIGIgPSAiIiJUICE9IHR5cGUoeCkiIiIKKyAgICAgICAgYSA9ICIiIm5vdCBpc2luc3RhbmNlKHgsIFQpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiaWYgICBUICE9IHR5cGUoeCk6IHBhc3MiIiIKKyAgICAgICAgYSA9ICIiImlmICAgbm90IGlzaW5zdGFuY2UoeCwgVCk6IHBhc3MiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbmVfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgYiA9ICIiInR5cGUoeCt5KSAhPSBkLmdldCgnVCcpIiIiCisgICAgICAgIGEgPSAiIiJub3QgaXNpbnN0YW5jZSh4K3ksIGQuZ2V0KCdUJykpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIidHlwZSggICB4ICArICB5KSAhPSBkLmdldCgnVCcpIiIiCisgICAgICAgIGEgPSAiIiJub3QgaXNpbnN0YW5jZSh4ICArICB5LCBkLmdldCgnVCcpKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF90eXBlX3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgYSA9ICIiInR5cGUoeCkuX19uYW1lX18iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoYSkKKworICAgIGRlZiB0ZXN0X3NvcnRfbGlzdF9jYWxsKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB2ID0gbGlzdCh0KQorICAgICAgICAgICAgdi5zb3J0KCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHYgPSBzb3J0ZWQodCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB2ID0gbGlzdChmb28oYikgKyBkKQorICAgICAgICAgICAgdi5zb3J0KCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHYgPSBzb3J0ZWQoZm9vKGIpICsgZCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgICAgICB3aGlsZSB4OgorICAgICAgICAgICAgICAgIHYgPSBsaXN0KHQpCisgICAgICAgICAgICAgICAgdi5zb3J0KCkKKyAgICAgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB3aGlsZSB4OgorICAgICAgICAgICAgICAgIHYgPSBzb3J0ZWQodCkKKyAgICAgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdiA9IGxpc3QodCkKKyAgICAgICAgICAgICMgZm9vCisgICAgICAgICAgICB2LnNvcnQoKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgdiA9IHNvcnRlZCh0KQorICAgICAgICAgICAgIyBmb28KKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gciIiIgorICAgICAgICAgICAgdiA9IGxpc3QoICAgdCkKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gciIiIgorICAgICAgICAgICAgdiA9IHNvcnRlZCggICB0KQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSByIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbSA9IGxpc3QocykKKyAgICAgICAgICAgICAgICBtLnNvcnQoKQorICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgICAgICAiIiIKKworICAgICAgICBhID0gciIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0gPSBzb3J0ZWQocykKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gciIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0gPSBsaXN0KHMpCisgICAgICAgICAgICAgICAgIyBmb28KKyAgICAgICAgICAgICAgICBtLnNvcnQoKQorICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgICAgICAiIiIKKworICAgICAgICBhID0gciIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0gPSBzb3J0ZWQocykKKyAgICAgICAgICAgICAgICAjIGZvbworICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSByIiIiCisgICAgICAgICAgICBtID0gbGlzdChzKQorICAgICAgICAgICAgIyBtb3JlIGNvbW1lbnRzCisgICAgICAgICAgICBtLnNvcnQoKSIiIgorCisgICAgICAgIGEgPSByIiIiCisgICAgICAgICAgICBtID0gc29ydGVkKHMpCisgICAgICAgICAgICAjIG1vcmUgY29tbWVudHMiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc29ydF9zaW1wbGVfZXhwcihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdiA9IHQKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB2ID0gc29ydGVkKHQpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdiA9IGZvbyhiKQorICAgICAgICAgICAgdi5zb3J0KCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHYgPSBzb3J0ZWQoZm9vKGIpKQorICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHYgPSBiLmtleXMoKQorICAgICAgICAgICAgdi5zb3J0KCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHYgPSBzb3J0ZWQoYi5rZXlzKCkpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgdiA9IGZvbyhiKSArIGQKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICB2ID0gc29ydGVkKGZvbyhiKSArIGQpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgd2hpbGUgeDoKKyAgICAgICAgICAgICAgICB2ID0gdAorICAgICAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgd2hpbGUgeDoKKyAgICAgICAgICAgICAgICB2ID0gc29ydGVkKHQpCisgICAgICAgICAgICAgICAgZm9vKHYpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgIHYgPSB0CisgICAgICAgICAgICAjIGZvbworICAgICAgICAgICAgdi5zb3J0KCkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIHYgPSBzb3J0ZWQodCkKKyAgICAgICAgICAgICMgZm9vCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9IHIiIiIKKyAgICAgICAgICAgIHYgPSAgIHQKKyAgICAgICAgICAgIHYuc29ydCgpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gciIiIgorICAgICAgICAgICAgdiA9ICAgc29ydGVkKHQpCisgICAgICAgICAgICBmb28odikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9zb3J0X3VuY2hhbmdlZChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdiA9IGxpc3QodCkKKyAgICAgICAgICAgIHcuc29ydCgpCisgICAgICAgICAgICBmb28odykKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHYgPSBsaXN0KHQpCisgICAgICAgICAgICB2LnNvcnQodSkKKyAgICAgICAgICAgIGZvbyh2KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKK2NsYXNzIFRlc3RfYmFzZXN0cmluZyhGaXhlclRlc3RDYXNlKToKKyAgICBmaXhlciA9ICJiYXNlc3RyaW5nIgorCisgICAgZGVmIHRlc3RfYmFzZXN0cmluZyhzZWxmKToKKyAgICAgICAgYiA9ICIiImlzaW5zdGFuY2UoeCwgYmFzZXN0cmluZykiIiIKKyAgICAgICAgYSA9ICIiImlzaW5zdGFuY2UoeCwgc3RyKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKK2NsYXNzIFRlc3RfYnVmZmVyKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gImJ1ZmZlciIKKworICAgIGRlZiB0ZXN0X2J1ZmZlcihzZWxmKToKKyAgICAgICAgYiA9ICIiInggPSBidWZmZXIoeSkiIiIKKyAgICAgICAgYSA9ICIiInggPSBtZW1vcnl2aWV3KHkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3NsaWNpbmcoc2VsZik6CisgICAgICAgIGIgPSAiIiJidWZmZXIoeSlbNDo1XSIiIgorICAgICAgICBhID0gIiIibWVtb3J5dmlldyh5KVs0OjVdIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworY2xhc3MgVGVzdF9mdXR1cmUoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiZnV0dXJlIgorCisgICAgZGVmIHRlc3RfZnV0dXJlKHNlbGYpOgorICAgICAgICBiID0gIiIiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBicmFjZXMiIiIKKyAgICAgICAgYSA9ICIiIiIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIiMgY29tbWVudFxuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBicmFjZXMiIiIKKyAgICAgICAgYSA9ICIiIiMgY29tbWVudFxuIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBicmFjZXNcbiMgY29tbWVudCIiIgorICAgICAgICBhID0gIiIiXG4jIGNvbW1lbnQiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfcnVuX29yZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydF9ydW5zX2FmdGVyKCdwcmludCcpCisKK2NsYXNzIFRlc3RfaXRlcnRvb2xzKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gIml0ZXJ0b29scyIKKworICAgIGRlZiBjaGVja2FsbChzZWxmLCBiZWZvcmUsIGFmdGVyKToKKyAgICAgICAgIyBCZWNhdXNlIHdlIG5lZWQgdG8gY2hlY2sgd2l0aCBhbmQgd2l0aG91dCB0aGUgaXRlcnRvb2xzIHByZWZpeAorICAgICAgICAjIGFuZCBvbiBlYWNoIG9mIHRoZSB0aHJlZSBmdW5jdGlvbnMsIHRoZXNlIGxvb3BzIG1ha2UgaXQgYWxsCisgICAgICAgICMgbXVjaCBlYXNpZXIKKyAgICAgICAgZm9yIGkgaW4gKCdpdGVydG9vbHMuJywgJycpOgorICAgICAgICAgICAgZm9yIGYgaW4gKCdtYXAnLCAnZmlsdGVyJywgJ3ppcCcpOgorICAgICAgICAgICAgICAgIGIgPSBiZWZvcmUgJShpKydpJytmKQorICAgICAgICAgICAgICAgIGEgPSBhZnRlciAlKGYpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMChzZWxmKToKKyAgICAgICAgIyBBIHNpbXBsZSBleGFtcGxlIC0tIHRlc3RfMSBjb3ZlcnMgZXhhY3RseSB0aGUgc2FtZSB0aGluZywKKyAgICAgICAgIyBidXQgaXQncyBub3QgcXVpdGUgYXMgY2xlYXIuCisgICAgICAgIGIgPSAiaXRlcnRvb2xzLml6aXAoYSwgYikiCisgICAgICAgIGEgPSAiemlwKGEsIGIpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICBiID0gIiIiJXMoZiwgYSkiIiIKKyAgICAgICAgYSA9ICIiIiVzKGYsIGEpIiIiCisgICAgICAgIHNlbGYuY2hlY2thbGwoYiwgYSkKKworICAgIGRlZiB0ZXN0X3F1YWxpZmllZChzZWxmKToKKyAgICAgICAgYiA9ICIiIml0ZXJ0b29scy5pZmlsdGVyZmFsc2UoYSwgYikiIiIKKyAgICAgICAgYSA9ICIiIml0ZXJ0b29scy5maWx0ZXJmYWxzZShhLCBiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIml0ZXJ0b29scy5pemlwX2xvbmdlc3QoYSwgYikiIiIKKyAgICAgICAgYSA9ICIiIml0ZXJ0b29scy56aXBfbG9uZ2VzdChhLCBiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIiaWZpbHRlcmZhbHNlKGEsIGIpIiIiCisgICAgICAgIGEgPSAiIiJmaWx0ZXJmYWxzZShhLCBiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIml6aXBfbG9uZ2VzdChhLCBiKSIiIgorICAgICAgICBhID0gIiIiemlwX2xvbmdlc3QoYSwgYikiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfc3BhY2VfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIiAgICAlcyhmLCBhKSIiIgorICAgICAgICBhID0gIiIiICAgICVzKGYsIGEpIiIiCisgICAgICAgIHNlbGYuY2hlY2thbGwoYiwgYSkKKworICAgIGRlZiB0ZXN0X3NwYWNlXzIoc2VsZik6CisgICAgICAgIGIgPSAiIiIgICAgaXRlcnRvb2xzLmlmaWx0ZXJmYWxzZShhLCBiKSIiIgorICAgICAgICBhID0gIiIiICAgIGl0ZXJ0b29scy5maWx0ZXJmYWxzZShhLCBiKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIiAgICBpdGVydG9vbHMuaXppcF9sb25nZXN0KGEsIGIpIiIiCisgICAgICAgIGEgPSAiIiIgICAgaXRlcnRvb2xzLnppcF9sb25nZXN0KGEsIGIpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3J1bl9vcmRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRfcnVuc19hZnRlcignbWFwJywgJ3ppcCcsICdmaWx0ZXInKQorCisKK2NsYXNzIFRlc3RfaXRlcnRvb2xzX2ltcG9ydHMoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAnaXRlcnRvb2xzX2ltcG9ydHMnCisKKyAgICBkZWYgdGVzdF9yZWR1Y2VkKHNlbGYpOgorICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwLCBpemlwLCBmb28iCisgICAgICAgIGEgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGZvbyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGJhciwgaW1hcCwgaXppcCwgZm9vIgorICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBiYXIsIGZvbyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluLCBpbWFwLCBpemlwIgorICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY29tbWVudHMoc2VsZik6CisgICAgICAgIGIgPSAiI2Zvb1xuZnJvbSBpdGVydG9vbHMgaW1wb3J0IGltYXAsIGl6aXAiCisgICAgICAgIGEgPSAiI2Zvb1xuIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9ub25lKHNlbGYpOgorICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwLCBpemlwIgorICAgICAgICBhID0gIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGl6aXAiCisgICAgICAgIGEgPSAiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfYXMoc2VsZik6CisgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGl6aXAsIGJhciBhcyBiYW5nLCBpbWFwIgorICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBiYXIgYXMgYmFuZyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGl6aXAgYXMgX3ppcCwgaW1hcCwgYmFyIgorICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBiYXIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwIGFzIF9tYXAiCisgICAgICAgIGEgPSAiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaW1hcCBhcyBfbWFwLCBpemlwIGFzIF96aXAiCisgICAgICAgIGEgPSAiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgcyA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgYmFyIGFzIGJhbmciCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9pZmlsdGVyX2FuZF96aXBfbG9uZ2VzdChzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gImZpbHRlcmZhbHNlIiwgInppcF9sb25nZXN0IjoKKyAgICAgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGklcyIgJSAobmFtZSwpCisgICAgICAgICAgICBhID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCAlcyIgJSAobmFtZSwpCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgICAgIGIgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGltYXAsIGklcywgZm9vIiAlIChuYW1lLCkKKyAgICAgICAgICAgIGEgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0ICVzLCBmb28iICUgKG5hbWUsKQorICAgICAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICAgICBiID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBiYXIsIGklcywgZm9vIiAlIChuYW1lLCkKKyAgICAgICAgICAgIGEgPSAiZnJvbSBpdGVydG9vbHMgaW1wb3J0IGJhciwgJXMsIGZvbyIgJSAobmFtZSwpCisgICAgICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfc3RhcihzZWxmKToKKyAgICAgICAgcyA9ICJmcm9tIGl0ZXJ0b29scyBpbXBvcnQgKiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gImZyb20gaXRlcnRvb2xzIGltcG9ydCBmb28iCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKworY2xhc3MgVGVzdF9pbXBvcnQoRml4ZXJUZXN0Q2FzZSk6CisgICAgZml4ZXIgPSAiaW1wb3J0IgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0X2ltcG9ydCwgc2VsZikuc2V0VXAoKQorICAgICAgICAjIE5lZWQgdG8gcmVwbGFjZSBmaXhfaW1wb3J0J3MgZXhpc3RzIG1ldGhvZAorICAgICAgICAjIHNvIHdlIGNhbiBjaGVjayB0aGF0IGl0J3MgZG9pbmcgdGhlIHJpZ2h0IHRoaW5nCisgICAgICAgIHNlbGYuZmlsZXNfY2hlY2tlZCA9IFtdCisgICAgICAgIHNlbGYucHJlc2VudF9maWxlcyA9IHNldCgpCisgICAgICAgIHNlbGYuYWx3YXlzX2V4aXN0cyA9IFRydWUKKyAgICAgICAgZGVmIGZha2VfZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgc2VsZi5maWxlc19jaGVja2VkLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWx3YXlzX2V4aXN0cyBvciAobmFtZSBpbiBzZWxmLnByZXNlbnRfZmlsZXMpCisKKyAgICAgICAgZnJvbSBsaWIydG8zLmZpeGVzIGltcG9ydCBmaXhfaW1wb3J0CisgICAgICAgIGZpeF9pbXBvcnQuZXhpc3RzID0gZmFrZV9leGlzdHMKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZnJvbSBsaWIydG8zLmZpeGVzIGltcG9ydCBmaXhfaW1wb3J0CisgICAgICAgIGZpeF9pbXBvcnQuZXhpc3RzID0gb3MucGF0aC5leGlzdHMKKworICAgIGRlZiBjaGVja19ib3RoKHNlbGYsIGIsIGEpOgorICAgICAgICBzZWxmLmFsd2F5c19leGlzdHMgPSBUcnVlCisgICAgICAgIHN1cGVyKFRlc3RfaW1wb3J0LCBzZWxmKS5jaGVjayhiLCBhKQorICAgICAgICBzZWxmLmFsd2F5c19leGlzdHMgPSBGYWxzZQorICAgICAgICBzdXBlcihUZXN0X2ltcG9ydCwgc2VsZikudW5jaGFuZ2VkKGIpCisKKyAgICBkZWYgdGVzdF9maWxlc19jaGVja2VkKHNlbGYpOgorICAgICAgICBkZWYgcChwYXRoKToKKyAgICAgICAgICAgICMgVGFrZXMgYSB1bml4IHBhdGggYW5kIHJldHVybnMgYSBwYXRoIHdpdGggY29ycmVjdCBzZXBhcmF0b3JzCisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5wYXRoc2VwLmpvaW4ocGF0aC5zcGxpdCgiLyIpKQorCisgICAgICAgIHNlbGYuYWx3YXlzX2V4aXN0cyA9IEZhbHNlCisgICAgICAgIHNlbGYucHJlc2VudF9maWxlcyA9IHNldChbJ19faW5pdF9fLnB5J10pCisgICAgICAgIGV4cGVjdGVkX2V4dGVuc2lvbnMgPSAoJy5weScsIG9zLnBhdGguc2VwLCAnLnB5YycsICcuc28nLCAnLnNsJywgJy5weWQnKQorICAgICAgICBuYW1lc190b190ZXN0ID0gKHAoIi9zcGFtL2VnZ3MucHkiKSwgIm5pLnB5IiwgcCgiLi4vLi4vc2hydWJiZXJ5LnB5IikpCisKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXNfdG9fdGVzdDoKKyAgICAgICAgICAgIHNlbGYuZmlsZXNfY2hlY2tlZCA9IFtdCisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gbmFtZQorICAgICAgICAgICAgc2VsZi51bmNoYW5nZWQoImltcG9ydCBqYW0iKQorCisgICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUobmFtZSk6CisgICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguZGlybmFtZShuYW1lKSArICcvamFtJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lID0gJ2phbScKKyAgICAgICAgICAgIGV4cGVjdGVkX2NoZWNrcyA9IHNldChuYW1lICsgZXh0IGZvciBleHQgaW4gZXhwZWN0ZWRfZXh0ZW5zaW9ucykKKyAgICAgICAgICAgIGV4cGVjdGVkX2NoZWNrcy5hZGQoIl9faW5pdF9fLnB5IikKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5maWxlc19jaGVja2VkKSwgZXhwZWN0ZWRfY2hlY2tzKQorCisgICAgZGVmIHRlc3Rfbm90X2luX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIHMgPSAiaW1wb3J0IGJhciIKKyAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcmVzZW50X2ZpbGVzID0gc2V0KFsiYmFyLnB5Il0pCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF93aXRoX2Fic29sdXRlX2ltcG9ydF9lbmFibGVkKHNlbGYpOgorICAgICAgICBzID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0XG5pbXBvcnQgYmFyIgorICAgICAgICBzZWxmLmFsd2F5c19leGlzdHMgPSBGYWxzZQorICAgICAgICBzZWxmLnByZXNlbnRfZmlsZXMgPSBzZXQoWyJfX2luaXRfXy5weSIsICJiYXIucHkiXSkKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X2luX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIGIgPSAiaW1wb3J0IGJhciIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGJhciIKKyAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcmVzZW50X2ZpbGVzID0gc2V0KFsiX19pbml0X18ucHkiLCAiYmFyLnB5Il0pCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIGIgPSAiaW1wb3J0IGJhciIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGJhciIKKyAgICAgICAgc2VsZi5hbHdheXNfZXhpc3RzID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcmVzZW50X2ZpbGVzID0gc2V0KFsiX19pbml0X18ucHkiLCAiYmFyIiArIG9zLnBhdGguc2VwXSkKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfYWxyZWFkeV9yZWxhdGl2ZV9pbXBvcnQoc2VsZik6CisgICAgICAgIHMgPSAiZnJvbSAuIGltcG9ydCBiYXIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9jb21tZW50c19hbmRfaW5kZW50KHNlbGYpOgorICAgICAgICBiID0gImltcG9ydCBiYXIgIyBGb28iCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBiYXIgIyBGb28iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2Zyb20oc2VsZik6CisgICAgICAgIGIgPSAiZnJvbSBmb28gaW1wb3J0IGJhciwgYmF6IgorICAgICAgICBhID0gImZyb20gLmZvbyBpbXBvcnQgYmFyLCBiYXoiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgICAgIGIgPSAiZnJvbSBmb28gaW1wb3J0IGJhciIKKyAgICAgICAgYSA9ICJmcm9tIC5mb28gaW1wb3J0IGJhciIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICAgICAgYiA9ICJmcm9tIGZvbyBpbXBvcnQgKGJhciwgYmF6KSIKKyAgICAgICAgYSA9ICJmcm9tIC5mb28gaW1wb3J0IChiYXIsIGJheikiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgZGVmIHRlc3RfZG90dGVkX2Zyb20oc2VsZik6CisgICAgICAgIGIgPSAiZnJvbSBncmVlbi5lZ2dzIGltcG9ydCBoYW0iCisgICAgICAgIGEgPSAiZnJvbSAuZ3JlZW4uZWdncyBpbXBvcnQgaGFtIgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworICAgIGRlZiB0ZXN0X2Zyb21fYXMoc2VsZik6CisgICAgICAgIGIgPSAiZnJvbSBncmVlbi5lZ2dzIGltcG9ydCBoYW0gYXMgc3BhbSIKKyAgICAgICAgYSA9ICJmcm9tIC5ncmVlbi5lZ2dzIGltcG9ydCBoYW0gYXMgc3BhbSIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbXBvcnQoc2VsZik6CisgICAgICAgIGIgPSAiaW1wb3J0IGZvbyIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGZvbyIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICAgICAgYiA9ICJpbXBvcnQgZm9vLCBiYXIiCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBmb28sIGJhciIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICAgICAgYiA9ICJpbXBvcnQgZm9vLCBiYXIsIHgiCisgICAgICAgIGEgPSAiZnJvbSAuIGltcG9ydCBmb28sIGJhciwgeCIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICAgICAgYiA9ICJpbXBvcnQgeCwgeSwgeiIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IHgsIHksIHoiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2FzKHNlbGYpOgorICAgICAgICBiID0gImltcG9ydCBmb28gYXMgeCIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGZvbyBhcyB4IgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworICAgICAgICBiID0gImltcG9ydCBhIGFzIGIsIGIgYXMgYywgYyBhcyBkIgorICAgICAgICBhID0gImZyb20gLiBpbXBvcnQgYSBhcyBiLCBiIGFzIGMsIGMgYXMgZCIKKyAgICAgICAgc2VsZi5jaGVja19ib3RoKGIsIGEpCisKKyAgICBkZWYgdGVzdF9sb2NhbF9hbmRfYWJzb2x1dGUoc2VsZik6CisgICAgICAgIHNlbGYuYWx3YXlzX2V4aXN0cyA9IEZhbHNlCisgICAgICAgIHNlbGYucHJlc2VudF9maWxlcyA9IHNldChbImZvby5weSIsICJfX2luaXRfXy5weSJdKQorCisgICAgICAgIHMgPSAiaW1wb3J0IGZvbywgYmFyIgorICAgICAgICBzZWxmLndhcm5zX3VuY2hhbmdlZChzLCAiYWJzb2x1dGUgYW5kIGxvY2FsIGltcG9ydHMgdG9nZXRoZXIiKQorCisgICAgZGVmIHRlc3RfZG90dGVkX2ltcG9ydChzZWxmKToKKyAgICAgICAgYiA9ICJpbXBvcnQgZm9vLmJhciIKKyAgICAgICAgYSA9ICJmcm9tIC4gaW1wb3J0IGZvby5iYXIiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisgICAgZGVmIHRlc3RfZG90dGVkX2ltcG9ydF9hcyhzZWxmKToKKyAgICAgICAgYiA9ICJpbXBvcnQgZm9vLmJhciBhcyBiYW5nIgorICAgICAgICBhID0gImZyb20gLiBpbXBvcnQgZm9vLmJhciBhcyBiYW5nIgorICAgICAgICBzZWxmLmNoZWNrX2JvdGgoYiwgYSkKKworICAgIGRlZiB0ZXN0X3ByZWZpeChzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAjIHByZWZpeAorICAgICAgICBpbXBvcnQgZm9vLmJhcgorICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAjIHByZWZpeAorICAgICAgICBmcm9tIC4gaW1wb3J0IGZvby5iYXIKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2tfYm90aChiLCBhKQorCisKK2NsYXNzIFRlc3Rfc2V0X2xpdGVyYWwoRml4ZXJUZXN0Q2FzZSk6CisKKyAgICBmaXhlciA9ICJzZXRfbGl0ZXJhbCIKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBiID0gIiIic2V0KFsxLCAyLCAzXSkiIiIKKyAgICAgICAgYSA9ICIiInsxLCAyLCAzfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldCgoMSwgMiwgMykpIiIiCisgICAgICAgIGEgPSAiIiJ7MSwgMiwgM30iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoKDEsKSkiIiIKKyAgICAgICAgYSA9ICIiInsxfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbMV0pIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KChhLCBiKSkiIiIKKyAgICAgICAgYSA9ICIiInthLCBifSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbYSwgYl0pIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KChhKjIzNCwgZihhcmdzPTIzKSkpIiIiCisgICAgICAgIGEgPSAiIiJ7YSoyMzQsIGYoYXJncz0yMyl9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KFthKjIzLCBmKDIzKV0pIiIiCisgICAgICAgIGEgPSAiIiJ7YSoyMywgZigyMyl9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KFthLTIzNCoqMjNdKSIiIgorICAgICAgICBhID0gIiIie2EtMjM0KioyM30iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbGlzdGNvbXBzKHNlbGYpOgorICAgICAgICBiID0gIiIic2V0KFt4IGZvciB4IGluIHldKSIiIgorICAgICAgICBhID0gIiIie3ggZm9yIHggaW4geX0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoW3ggZm9yIHggaW4geSBpZiB4ID09IG1dKSIiIgorICAgICAgICBhID0gIiIie3ggZm9yIHggaW4geSBpZiB4ID09IG19IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KFt4IGZvciB4IGluIHkgZm9yIGEgaW4gYl0pIiIiCisgICAgICAgIGEgPSAiIiJ7eCBmb3IgeCBpbiB5IGZvciBhIGluIGJ9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KFtmKHgpIC0gMjMgZm9yIHggaW4geV0pIiIiCisgICAgICAgIGEgPSAiIiJ7Zih4KSAtIDIzIGZvciB4IGluIHl9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIGIgPSAiIiJzZXQoIFsxLCAyXSkiIiIKKyAgICAgICAgYSA9ICIiInsxLCAyfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbMSAsICAyXSkiIiIKKyAgICAgICAgYSA9ICIiInsxICwgIDJ9IiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIic2V0KFsgMSBdKSIiIgorICAgICAgICBhID0gIiIieyAxIH0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoIFsxXSApIiIiCisgICAgICAgIGEgPSAiIiJ7MX0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJzZXQoWyAgMSwgIDIgIF0pIiIiCisgICAgICAgIGEgPSAiIiJ7ICAxLCAgMiAgfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldChbeCAgZm9yIHggaW4geSBdKSIiIgorICAgICAgICBhID0gIiIie3ggIGZvciB4IGluIHkgfSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiInNldCgKKyAgICAgICAgICAgICAgICAgICBbMSwgMl0KKyAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiezEsIDJ9XG4iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfY29tbWVudHMoc2VsZik6CisgICAgICAgIGIgPSAiIiJzZXQoKDEsIDIpKSAjIEhpIiIiCisgICAgICAgIGEgPSAiIiJ7MSwgMn0gIyBIaSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgIyBUaGlzIGlzbid0IG9wdGltYWwgYmVoYXZpb3IsIGJ1dCB0aGUgZml4ZXIgaXMgb3B0aW9uYWwuCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgICAgICMgRm9vCisgICAgICAgICAgICBzZXQoICMgQmFyCisgICAgICAgICAgICAgICAoMSwgMikKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICAjIEZvbworICAgICAgICAgICAgezEsIDJ9CisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBzID0gIiIic2V0KCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIic2V0KGEpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInNldChhLCBiLCBjKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgICMgRG9uJ3QgdHJhbnNmb3JtIGdlbmVyYXRvcnMgYmVjYXVzZSB0aGV5IG1pZ2h0IGhhdmUgdG8gYmUgbGF6eS4KKyAgICAgICAgcyA9ICIiInNldCh4IGZvciB4IGluIHkpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICAgICAgcyA9ICIiInNldCh4IGZvciB4IGluIHkgaWYgeikiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIic2V0KGEqODIzLTIzKioyICsgZigyMykpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKworY2xhc3MgVGVzdF9zeXNfZXhjKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInN5c19leGMiCisKKyAgICBkZWYgdGVzdF8wKHNlbGYpOgorICAgICAgICBiID0gInN5cy5leGNfdHlwZSIKKyAgICAgICAgYSA9ICJzeXMuZXhjX2luZm8oKVswXSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICJzeXMuZXhjX3ZhbHVlIgorICAgICAgICBhID0gInN5cy5leGNfaW5mbygpWzFdIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gInN5cy5leGNfdHJhY2ViYWNrIgorICAgICAgICBhID0gInN5cy5leGNfaW5mbygpWzJdIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBiID0gInN5cy5leGNfdHlwZSAjIEZvbyIKKyAgICAgICAgYSA9ICJzeXMuZXhjX2luZm8oKVswXSAjIEZvbyIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNChzZWxmKToKKyAgICAgICAgYiA9ICJzeXMuICBleGNfdHlwZSIKKyAgICAgICAgYSA9ICJzeXMuICBleGNfaW5mbygpWzBdIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF81KHNlbGYpOgorICAgICAgICBiID0gInN5cyAgLmV4Y190eXBlIgorICAgICAgICBhID0gInN5cyAgLmV4Y19pbmZvKClbMF0iCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCitjbGFzcyBUZXN0X3BhcmVuKEZpeGVyVGVzdENhc2UpOgorICAgIGZpeGVyID0gInBhcmVuIgorCisgICAgZGVmIHRlc3RfMChzZWxmKToKKyAgICAgICAgYiA9ICIiIltpIGZvciBpIGluIDEsIDIgXSIiIgorICAgICAgICBhID0gIiIiW2kgZm9yIGkgaW4gKDEsIDIpIF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgYiA9ICIiIltpIGZvciBpIGluIDEsIDIsIF0iIiIKKyAgICAgICAgYSA9ICIiIltpIGZvciBpIGluICgxLCAyLCkgXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBiID0gIiIiW2kgZm9yIGkgIGluICAgICAxLCAyIF0iIiIKKyAgICAgICAgYSA9ICIiIltpIGZvciBpICBpbiAgICAgKDEsIDIpIF0iIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgYiA9ICIiIltpIGZvciBpIGluIDEsIDIgaWYgaV0iIiIKKyAgICAgICAgYSA9ICIiIltpIGZvciBpIGluICgxLCAyKSBpZiBpXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBiID0gIiIiW2kgZm9yIGkgaW4gMSwgICAgMiAgICBdIiIiCisgICAgICAgIGEgPSAiIiJbaSBmb3IgaSBpbiAoMSwgICAgMikgICAgXSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF81KHNlbGYpOgorICAgICAgICBiID0gIiIiKGkgZm9yIGkgaW4gMSwgMikiIiIKKyAgICAgICAgYSA9ICIiIihpIGZvciBpIGluICgxLCAyKSkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfNihzZWxmKToKKyAgICAgICAgYiA9ICIiIihpIGZvciBpIGluIDEgICAsMiAgIGlmIGkpIiIiCisgICAgICAgIGEgPSAiIiIoaSBmb3IgaSBpbiAoMSAgICwyKSAgIGlmIGkpIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8wKHNlbGYpOgorICAgICAgICBzID0gIiIiW2kgZm9yIGkgaW4gKDEsIDIpXSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgZGVmIHRlc3RfdW5jaGFuZ2VkXzEoc2VsZik6CisgICAgICAgIHMgPSAiIiJbaSBmb3IgaSBpbiBmb28oKV0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF8yKHNlbGYpOgorICAgICAgICBzID0gIiIiW2kgZm9yIGkgaW4gKDEsIDIpIGlmIG5vdGhpbmddIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfMyhzZWxmKToKKyAgICAgICAgcyA9ICIiIihpIGZvciBpIGluICgxLCAyKSkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgIGRlZiB0ZXN0X3VuY2hhbmdlZF80KHNlbGYpOgorICAgICAgICBzID0gIiIiW2kgZm9yIGkgaW4gbV0iIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworY2xhc3MgVGVzdF9tZXRhY2xhc3MoRml4ZXJUZXN0Q2FzZSk6CisKKyAgICBmaXhlciA9ICdtZXRhY2xhc3MnCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJjbGFzcyBYKCk6IHBhc3MiKQorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiY2xhc3MgWChvYmplY3QpOiBwYXNzIikKKyAgICAgICAgc2VsZi51bmNoYW5nZWQoImNsYXNzIFgob2JqZWN0MSwgb2JqZWN0Mik6IHBhc3MiKQorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiY2xhc3MgWChvYmplY3QxLCBvYmplY3QyLCBvYmplY3QzKTogcGFzcyIpCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJjbGFzcyBYKG1ldGFjbGFzcz1NZXRhKTogcGFzcyIpCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKCJjbGFzcyBYKGIsIGFyZz0yMywgbWV0Y2xhc3M9TWV0YSk6IHBhc3MiKQorICAgICAgICBzZWxmLnVuY2hhbmdlZCgiY2xhc3MgWChiLCBhcmc9MjMsIG1ldGFjbGFzcz1NZXRhLCBvdGhlcj00Mik6IHBhc3MiKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX21ldGFjbGFzc19fKHNlbGYpOiBwYXNzCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGFbMjNdID0gNzQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgIyBoaQorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IEFwcGxlTWV0YQorICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICBjbGFzcyBYKG1ldGFjbGFzcz1BcHBsZU1ldGEpOgorICAgICAgICAgICAgIyBoaQorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCisgICAgICAgICAgICAjIEJlZHRpbWUhCisgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgIGNsYXNzIFgobWV0YWNsYXNzPU1ldGEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBCZWR0aW1lIQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbWV0YShzZWxmKToKKyAgICAgICAgIyBuby1wYXJlbnQgY2xhc3MsIG9kZCBib2R5CisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWCgpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IFEKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChtZXRhY2xhc3M9USk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgIyBvbmUgcGFyZW50IGNsYXNzLCBubyBib2R5CisgICAgICAgIGIgPSAiIiJjbGFzcyBYKG9iamVjdCk6IF9fbWV0YWNsYXNzX18gPSBRIiIiCisgICAgICAgIGEgPSAiIiJjbGFzcyBYKG9iamVjdCwgbWV0YWNsYXNzPVEpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworCisgICAgICAgICMgb25lIHBhcmVudCwgc2ltcGxlIGJvZHkKKyAgICAgICAgYiA9ICIiIgorICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YQorICAgICAgICAgICAgYmFyID0gNworICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICBjbGFzcyBYKG9iamVjdCwgbWV0YWNsYXNzPU1ldGEpOgorICAgICAgICAgICAgYmFyID0gNworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhOyB4ID0gNDsgZyA9IDIzCisgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgIGNsYXNzIFgobWV0YWNsYXNzPU1ldGEpOgorICAgICAgICAgICAgeCA9IDQ7IGcgPSAyMworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgICMgb25lIHBhcmVudCwgc2ltcGxlIGJvZHksIF9fbWV0YWNsYXNzX18gbGFzdAorICAgICAgICBiID0gIiIiCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIGJhciA9IDcKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCisgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgIGNsYXNzIFgob2JqZWN0LCBtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICBiYXIgPSA3CisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgIyByZWRlZmluaW5nIF9fbWV0YWNsYXNzX18KKyAgICAgICAgYiA9ICIiIgorICAgICAgICBjbGFzcyBYKCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gQQorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IEIKKyAgICAgICAgICAgIGJhciA9IDcKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChtZXRhY2xhc3M9Qik6CisgICAgICAgICAgICBiYXIgPSA3CisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgIyBtdWx0aXBsZSBpbmhlcml0YW5jZSwgc2ltcGxlIGJvZHkKKyAgICAgICAgYiA9ICIiIgorICAgICAgICBjbGFzcyBYKGNsc0EsIGNsc0IpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGEKKyAgICAgICAgICAgIGJhciA9IDcKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChjbHNBLCBjbHNCLCBtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICBiYXIgPSA3CisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgIyBrZXl3b3JkcyBpbiB0aGUgY2xhc3Mgc3RhdGVtZW50CisgICAgICAgIGIgPSAiIiJjbGFzcyBtKGEsIGFyZz0yMyk6IF9fbWV0YWNsYXNzX18gPSBNZXRhIiIiCisgICAgICAgIGEgPSAiIiJjbGFzcyBtKGEsIGFyZz0yMywgbWV0YWNsYXNzPU1ldGEpOiBwYXNzIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIiCisgICAgICAgIGNsYXNzIFgoZXhwcmVzc2lvbigyICsgNCkpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGEKKyAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgY2xhc3MgWChleHByZXNzaW9uKDIgKyA0KSwgbWV0YWNsYXNzPU1ldGEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiIKKyAgICAgICAgY2xhc3MgWChleHByZXNzaW9uKDIgKyA0KSwgeCoqNCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YQorICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICBjbGFzcyBYKGV4cHJlc3Npb24oMiArIDQpLCB4Kio0LCBtZXRhY2xhc3M9TWV0YSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICBjbGFzcyBYOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGEKKyAgICAgICAgICAgIHNhdmUucHkgPSAyMworICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICBjbGFzcyBYKG1ldGFjbGFzcz1NZXRhKToKKyAgICAgICAgICAgIHNhdmUucHkgPSAyMworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisKK2NsYXNzIFRlc3RfZ2V0Y3dkdShGaXhlclRlc3RDYXNlKToKKworICAgIGZpeGVyID0gJ2dldGN3ZHUnCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgYiA9ICIiIm9zLmdldGN3ZHUiIiIKKyAgICAgICAgYSA9ICIiIm9zLmdldGN3ZCIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIm9zLmdldGN3ZHUoKSIiIgorICAgICAgICBhID0gIiIib3MuZ2V0Y3dkKCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJtZXRoID0gb3MuZ2V0Y3dkdSIiIgorICAgICAgICBhID0gIiIibWV0aCA9IG9zLmdldGN3ZCIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIm9zLmdldGN3ZHUoYXJncykiIiIKKyAgICAgICAgYSA9ICIiIm9zLmdldGN3ZChhcmdzKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9jb21tZW50KHNlbGYpOgorICAgICAgICBiID0gIiIib3MuZ2V0Y3dkdSgpICMgRm9vIiIiCisgICAgICAgIGEgPSAiIiJvcy5nZXRjd2QoKSAjIEZvbyIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiJvcy5nZXRjd2QoKSIiIgorICAgICAgICBzZWxmLnVuY2hhbmdlZChzKQorCisgICAgICAgIHMgPSAiIiJnZXRjd2R1KCkiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKKworICAgICAgICBzID0gIiIib3MuZ2V0Y3dkYigpIiIiCisgICAgICAgIHNlbGYudW5jaGFuZ2VkKHMpCisKKyAgICBkZWYgdGVzdF9pbmRlbnRhdGlvbihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaWYgMToKKyAgICAgICAgICAgICAgICBvcy5nZXRjd2R1KCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBpZiAxOgorICAgICAgICAgICAgICAgIG9zLmdldGN3ZCgpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3RfbXVsdGlsYXRpb24oc2VsZik6CisgICAgICAgIGIgPSAiIiJvcyAuZ2V0Y3dkdSgpIiIiCisgICAgICAgIGEgPSAiIiJvcyAuZ2V0Y3dkKCkiIiIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAiIiJvcy4gIGdldGN3ZHUiIiIKKyAgICAgICAgYSA9ICIiIm9zLiAgZ2V0Y3dkIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIiIib3MuZ2V0Y3dkdSAoICApIiIiCisgICAgICAgIGEgPSAiIiJvcy5nZXRjd2QgKCAgKSIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKworY2xhc3MgVGVzdF9vcGVyYXRvcihGaXhlclRlc3RDYXNlKToKKworICAgIGZpeGVyID0gIm9wZXJhdG9yIgorCisgICAgZGVmIHRlc3Rfb3BlcmF0b3JfaXNDYWxsYWJsZShzZWxmKToKKyAgICAgICAgYiA9ICJvcGVyYXRvci5pc0NhbGxhYmxlKHgpIgorICAgICAgICBhID0gImhhc2F0dHIoeCwgJ19fY2FsbF9fJykiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX3NlcXVlbmNlSW5jbHVkZXMoc2VsZik6CisgICAgICAgIGIgPSAib3BlcmF0b3Iuc2VxdWVuY2VJbmNsdWRlcyh4LCB5KSIKKyAgICAgICAgYSA9ICJvcGVyYXRvci5jb250YWlucyh4LCB5KSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAib3BlcmF0b3IgLnNlcXVlbmNlSW5jbHVkZXMoeCwgeSkiCisgICAgICAgIGEgPSAib3BlcmF0b3IgLmNvbnRhaW5zKHgsIHkpIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJvcGVyYXRvci4gIHNlcXVlbmNlSW5jbHVkZXMoeCwgeSkiCisgICAgICAgIGEgPSAib3BlcmF0b3IuICBjb250YWlucyh4LCB5KSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfb3BlcmF0b3JfaXNTZXF1ZW5jZVR5cGUoc2VsZik6CisgICAgICAgIGIgPSAib3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoeCkiCisgICAgICAgIGEgPSAiaW1wb3J0IGNvbGxlY3Rpb25zXG5pc2luc3RhbmNlKHgsIGNvbGxlY3Rpb25zLlNlcXVlbmNlKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfb3BlcmF0b3JfaXNNYXBwaW5nVHlwZShzZWxmKToKKyAgICAgICAgYiA9ICJvcGVyYXRvci5pc01hcHBpbmdUeXBlKHgpIgorICAgICAgICBhID0gImltcG9ydCBjb2xsZWN0aW9uc1xuaXNpbnN0YW5jZSh4LCBjb2xsZWN0aW9ucy5NYXBwaW5nKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgZGVmIHRlc3Rfb3BlcmF0b3JfaXNOdW1iZXJUeXBlKHNlbGYpOgorICAgICAgICBiID0gIm9wZXJhdG9yLmlzTnVtYmVyVHlwZSh4KSIKKyAgICAgICAgYSA9ICJpbXBvcnQgbnVtYmVyc1xuaXNpbnN0YW5jZSh4LCBudW1iZXJzLk51bWJlcikiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X29wZXJhdG9yX3JlcGVhdChzZWxmKToKKyAgICAgICAgYiA9ICJvcGVyYXRvci5yZXBlYXQoeCwgbikiCisgICAgICAgIGEgPSAib3BlcmF0b3IubXVsKHgsIG4pIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICJvcGVyYXRvciAucmVwZWF0KHgsIG4pIgorICAgICAgICBhID0gIm9wZXJhdG9yIC5tdWwoeCwgbikiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIm9wZXJhdG9yLiAgcmVwZWF0KHgsIG4pIgorICAgICAgICBhID0gIm9wZXJhdG9yLiAgbXVsKHgsIG4pIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9vcGVyYXRvcl9pcmVwZWF0KHNlbGYpOgorICAgICAgICBiID0gIm9wZXJhdG9yLmlyZXBlYXQoeCwgbikiCisgICAgICAgIGEgPSAib3BlcmF0b3IuaW11bCh4LCBuKSIKKyAgICAgICAgc2VsZi5jaGVjayhiLCBhKQorCisgICAgICAgIGIgPSAib3BlcmF0b3IgLmlyZXBlYXQoeCwgbikiCisgICAgICAgIGEgPSAib3BlcmF0b3IgLmltdWwoeCwgbikiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgICAgICBiID0gIm9wZXJhdG9yLiAgaXJlcGVhdCh4LCBuKSIKKyAgICAgICAgYSA9ICJvcGVyYXRvci4gIGltdWwoeCwgbikiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2JhcmVfaXNDYWxsYWJsZShzZWxmKToKKyAgICAgICAgcyA9ICJpc0NhbGxhYmxlKHgpIgorICAgICAgICB0ID0gIllvdSBzaG91bGQgdXNlICdoYXNhdHRyKHgsICdfX2NhbGxfXycpJyBoZXJlLiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgdCkKKworICAgIGRlZiB0ZXN0X2JhcmVfc2VxdWVuY2VJbmNsdWRlcyhzZWxmKToKKyAgICAgICAgcyA9ICJzZXF1ZW5jZUluY2x1ZGVzKHgsIHkpIgorICAgICAgICB0ID0gIllvdSBzaG91bGQgdXNlICdvcGVyYXRvci5jb250YWlucyh4LCB5KScgaGVyZS4iCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsIHQpCisKKyAgICBkZWYgdGVzdF9iYXJlX29wZXJhdG9yX2lzU2VxdWVuY2VUeXBlKHNlbGYpOgorICAgICAgICBzID0gImlzU2VxdWVuY2VUeXBlKHopIgorICAgICAgICB0ID0gIllvdSBzaG91bGQgdXNlICdpc2luc3RhbmNlKHosIGNvbGxlY3Rpb25zLlNlcXVlbmNlKScgaGVyZS4iCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsIHQpCisKKyAgICBkZWYgdGVzdF9iYXJlX29wZXJhdG9yX2lzTWFwcGluZ1R5cGUoc2VsZik6CisgICAgICAgIHMgPSAiaXNNYXBwaW5nVHlwZSh4KSIKKyAgICAgICAgdCA9ICJZb3Ugc2hvdWxkIHVzZSAnaXNpbnN0YW5jZSh4LCBjb2xsZWN0aW9ucy5NYXBwaW5nKScgaGVyZS4iCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsIHQpCisKKyAgICBkZWYgdGVzdF9iYXJlX29wZXJhdG9yX2lzTnVtYmVyVHlwZShzZWxmKToKKyAgICAgICAgcyA9ICJpc051bWJlclR5cGUoeSkiCisgICAgICAgIHQgPSAiWW91IHNob3VsZCB1c2UgJ2lzaW5zdGFuY2UoeSwgbnVtYmVycy5OdW1iZXIpJyBoZXJlLiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgdCkKKworICAgIGRlZiB0ZXN0X2JhcmVfb3BlcmF0b3JfcmVwZWF0KHNlbGYpOgorICAgICAgICBzID0gInJlcGVhdCh4LCBuKSIKKyAgICAgICAgdCA9ICJZb3Ugc2hvdWxkIHVzZSAnb3BlcmF0b3IubXVsKHgsIG4pJyBoZXJlLiIKKyAgICAgICAgc2VsZi53YXJuc191bmNoYW5nZWQocywgdCkKKworICAgIGRlZiB0ZXN0X2JhcmVfb3BlcmF0b3JfaXJlcGVhdChzZWxmKToKKyAgICAgICAgcyA9ICJpcmVwZWF0KHksIDE4NykiCisgICAgICAgIHQgPSAiWW91IHNob3VsZCB1c2UgJ29wZXJhdG9yLmltdWwoeSwgMTg3KScgaGVyZS4iCisgICAgICAgIHNlbGYud2FybnNfdW5jaGFuZ2VkKHMsIHQpCisKKworY2xhc3MgVGVzdF9leGl0ZnVuYyhGaXhlclRlc3RDYXNlKToKKworICAgIGZpeGVyID0gImV4aXRmdW5jIgorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBzeXMuZXhpdGZ1bmMgPSBteV9hdGV4aXQKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBpbXBvcnQgYXRleGl0CisgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIobXlfYXRleGl0KQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X25hbWVzX2ltcG9ydChzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cywgY3J1bWJzCisgICAgICAgICAgICBzeXMuZXhpdGZ1bmMgPSBteV9mdW5jCisgICAgICAgICAgICAiIiIKKyAgICAgICAgYSA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cywgY3J1bWJzLCBhdGV4aXQKKyAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihteV9mdW5jKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhfZXhwcmVzc2lvbihzZWxmKToKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgc3lzLmV4aXRmdW5jID0gZG8oZCkvYSgpK2NvbXBsZXgoZj0yMywgZz0yMykqZXhwcmVzc2lvbgorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIGltcG9ydCBhdGV4aXQKKyAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihkbyhkKS9hKCkrY29tcGxleChmPTIzLCBnPTIzKSpleHByZXNzaW9uKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2hlY2soYiwgYSkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgc3lzICMgRm9vCisgICAgICAgICAgICBzeXMuZXhpdGZ1bmMgPSBmICMgQmxhaAorICAgICAgICAgICAgIiIiCisgICAgICAgIGEgPSAiIiIKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIGltcG9ydCBhdGV4aXQgIyBGb28KKyAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihmKSAjIEJsYWgKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICAgICAgYiA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IGFwcGxlcywgc3lzLCBjcnVtYnMsIGxhcnJ5ICMgUGxlYXNhbnQgY29tbWVudHMKKyAgICAgICAgICAgIHN5cy5leGl0ZnVuYyA9IGZ1bmMKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgYXBwbGVzLCBzeXMsIGNydW1icywgbGFycnksIGF0ZXhpdCAjIFBsZWFzYW50IGNvbW1lbnRzCisgICAgICAgICAgICBhdGV4aXQucmVnaXN0ZXIoZnVuYykKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9pbl9hX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBiID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIHN5cy5leGl0ZnVuYyA9IGZ1bmMKKyAgICAgICAgICAgICIiIgorICAgICAgICBhID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBpbXBvcnQgYXRleGl0CisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihmdW5jKQorICAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLmNoZWNrKGIsIGEpCisKKyAgICBkZWYgdGVzdF9ub19zeXNfaW1wb3J0KHNlbGYpOgorICAgICAgICBiID0gIiIic3lzLmV4aXRmdW5jID0gZiIiIgorICAgICAgICBhID0gIiIiYXRleGl0LnJlZ2lzdGVyKGYpIiIiCisgICAgICAgIG1zZyA9ICgiQ2FuJ3QgZmluZCBzeXMgaW1wb3J0OyBQbGVhc2UgYWRkIGFuIGF0ZXhpdCBpbXBvcnQgYXQgdGhlICIKKyAgICAgICAgICAgICJ0b3Agb2YgeW91ciBmaWxlLiIpCisgICAgICAgIHNlbGYud2FybnMoYiwgYSwgbXNnKQorCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiJmKHN5cy5leGl0ZnVuYykiIiIKKyAgICAgICAgc2VsZi51bmNoYW5nZWQocykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYWI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X2ZpeGVycy5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYWI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9maXhlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X21haW4ucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9tYWluLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGIyNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9tYWluLnB5CkBAIC0wLDAgKzEsMTQ5IEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQoraW1wb3J0IHN5cworaW1wb3J0IGNvZGVjcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gbGliMnRvMyBpbXBvcnQgbWFpbgorCisKK1RFU1RfREFUQV9ESVIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImRhdGEiKQorUFkyX1RFU1RfTU9EVUxFID0gb3MucGF0aC5qb2luKFRFU1RfREFUQV9ESVIsICJweTJfdGVzdF9ncmFtbWFyLnB5IikKKworCitjbGFzcyBUZXN0TWFpbih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBpZiBub3QgaGFzYXR0cih1bml0dGVzdC5UZXN0Q2FzZSwgJ2Fzc2VydE5vdFJlZ2V4Jyk6CisgICAgICAgICMgVGhpcyBtZXRob2Qgd2FzIG9ubHkgaW50cm9kdWNlZCBpbiAzLjIuCisgICAgICAgIGRlZiBhc3NlcnROb3RSZWdleChzZWxmLCB0ZXh0LCByZWdleHAsIG1zZz1Ob25lKToKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIocmVnZXhwLCAnc2VhcmNoJyk6CisgICAgICAgICAgICAgICAgcmVnZXhwID0gcmUuY29tcGlsZShyZWdleHApCisgICAgICAgICAgICBpZiByZWdleHAuc2VhcmNoKHRleHQpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVnZXhwICVzIE1BVENIRUQgdGV4dCAlciIgJSAocmVnZXhwLnBhdHRlcm4sIHRleHQpKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlbXBfZGlyID0gTm9uZSAgIyB0ZWFyRG93bigpIHdpbGwgcm10cmVlIHRoaXMgZGlyZWN0b3J5IGlmIHNldC4KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyBDbGVhbiB1cCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gZG93biBieSBtYWluLgorICAgICAgICBkZWwgbG9nZ2luZy5yb290LmhhbmRsZXJzWzpdCisgICAgICAgIGlmIHNlbGYudGVtcF9kaXI6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYudGVtcF9kaXIpCisKKyAgICBkZWYgcnVuXzJ0bzNfY2FwdHVyZShzZWxmLCBhcmdzLCBpbl9jYXB0dXJlLCBvdXRfY2FwdHVyZSwgZXJyX2NhcHR1cmUpOgorICAgICAgICBzYXZlX3N0ZGluID0gc3lzLnN0ZGluCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzYXZlX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgc3lzLnN0ZGluID0gaW5fY2FwdHVyZQorICAgICAgICBzeXMuc3Rkb3V0ID0gb3V0X2NhcHR1cmUKKyAgICAgICAgc3lzLnN0ZGVyciA9IGVycl9jYXB0dXJlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBtYWluLm1haW4oImxpYjJ0bzMuZml4ZXMiLCBhcmdzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZGluID0gc2F2ZV9zdGRpbgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc2F2ZV9zdGRlcnIKKworICAgIGRlZiB0ZXN0X3VuZW5jb2RhYmxlX2RpZmYoc2VsZik6CisgICAgICAgIGlucHV0X3N0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKHUicHJpbnQgJ25vdGhpbmcnXG5wcmludCB1J8O8YmVyJ1xuIikKKyAgICAgICAgb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBvdXRfZW5jID0gY29kZWNzLmdldHdyaXRlcigiYXNjaWkiKShvdXQpCisgICAgICAgIGVyciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgcmV0ID0gc2VsZi5ydW5fMnRvM19jYXB0dXJlKFsiLSJdLCBpbnB1dF9zdHJlYW0sIG91dF9lbmMsIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXQsIDApCisgICAgICAgIG91dHB1dCA9IG91dC5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLXByaW50ICdub3RoaW5nJyIgaW4gb3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIldBUk5JTkc6IGNvdWxkbid0IGVuY29kZSA8c3RkaW4+J3MgZGlmZiBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgInlvdXIgdGVybWluYWwiIGluIGVyci5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHNldHVwX3Rlc3Rfc291cmNlX3RyZWVzKHNlbGYpOgorICAgICAgICAiIiJTZXR1cCBhIHRlc3Qgc291cmNlIHRyZWUgYW5kIG91dHB1dCBkZXN0aW5hdGlvbiB0cmVlLiIiIgorICAgICAgICBzZWxmLnRlbXBfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpICAjIHRlYXJEb3duKCkgY2xlYW5zIHRoaXMgdXAuCisgICAgICAgIHNlbGYucHkyX3NyY19kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wX2RpciwgInB5dGhvbjJfcHJvamVjdCIpCisgICAgICAgIHNlbGYucHkzX2Rlc3RfZGlyID0gb3MucGF0aC5qb2luKHNlbGYudGVtcF9kaXIsICJweXRob24zX3Byb2plY3QiKQorICAgICAgICBvcy5ta2RpcihzZWxmLnB5Ml9zcmNfZGlyKQorICAgICAgICBvcy5ta2RpcihzZWxmLnB5M19kZXN0X2RpcikKKyAgICAgICAgIyBUdXJuIGl0IGludG8gYSBwYWNrYWdlIHdpdGggYSBmZXcgZmlsZXMuCisgICAgICAgIHNlbGYuc2V0dXBfZmlsZXMgPSBbXQorICAgICAgICBvcGVuKG9zLnBhdGguam9pbihzZWxmLnB5Ml9zcmNfZGlyLCAiX19pbml0X18ucHkiKSwgInciKS5jbG9zZSgpCisgICAgICAgIHNlbGYuc2V0dXBfZmlsZXMuYXBwZW5kKCJfX2luaXRfXy5weSIpCisgICAgICAgIHNodXRpbC5jb3B5KFBZMl9URVNUX01PRFVMRSwgc2VsZi5weTJfc3JjX2RpcikKKyAgICAgICAgc2VsZi5zZXR1cF9maWxlcy5hcHBlbmQob3MucGF0aC5iYXNlbmFtZShQWTJfVEVTVF9NT0RVTEUpKQorICAgICAgICBzZWxmLnRyaXZpYWxfcHkyX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5weTJfc3JjX2RpciwgInRyaXZpYWwucHkiKQorICAgICAgICBzZWxmLmluaXRfcHkyX2ZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5weTJfc3JjX2RpciwgIl9faW5pdF9fLnB5IikKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYudHJpdmlhbF9weTJfZmlsZSwgInciKSBhcyB0cml2aWFsOgorICAgICAgICAgICAgdHJpdmlhbC53cml0ZSgicHJpbnQgJ0kgbmVlZCBhIHNpbXBsZSBjb252ZXJzaW9uLiciKQorICAgICAgICBzZWxmLnNldHVwX2ZpbGVzLmFwcGVuZCgidHJpdmlhbC5weSIpCisKKyAgICBkZWYgdGVzdF9maWxlbmFtZV9jaGFuZ2luZ19vbl9vdXRwdXRfc2luZ2xlX2RpcihzZWxmKToKKyAgICAgICAgIiIiMnRvMyBhIHNpbmdsZSBkaXJlY3Rvcnkgd2l0aCBhIG5ldyBvdXRwdXQgZGlyIGFuZCBzdWZmaXguIiIiCisgICAgICAgIHNlbGYuc2V0dXBfdGVzdF9zb3VyY2VfdHJlZXMoKQorICAgICAgICBvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGVyciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc3VmZml4ID0gIlRFU1QiCisgICAgICAgIHJldCA9IHNlbGYucnVuXzJ0bzNfY2FwdHVyZSgKKyAgICAgICAgICAgICAgICBbIi1uIiwgIi0tYWRkLXN1ZmZpeCIsIHN1ZmZpeCwgIi0td3JpdGUtdW5jaGFuZ2VkLWZpbGVzIiwKKyAgICAgICAgICAgICAgICAgIi0tbm8tZGlmZnMiLCAiLS1vdXRwdXQtZGlyIiwKKyAgICAgICAgICAgICAgICAgc2VsZi5weTNfZGVzdF9kaXIsIHNlbGYucHkyX3NyY19kaXJdLAorICAgICAgICAgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPKCIiKSwgb3V0LCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCAwKQorICAgICAgICBzdGRlcnIgPSBlcnIuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEluKCIgaW1wbGllcyAtdy4iLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgICAgIk91dHB1dCBpbiAlciB3aWxsIG1pcnJvciB0aGUgaW5wdXQgZGlyZWN0b3J5ICVyIGxheW91dCIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnB5M19kZXN0X2Rpciwgc2VsZi5weTJfc3JjX2RpciksIHN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobmFtZStzdWZmaXggZm9yIG5hbWUgaW4gc2VsZi5zZXR1cF9maWxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KG9zLmxpc3RkaXIoc2VsZi5weTNfZGVzdF9kaXIpKSkKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5zZXR1cF9maWxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIldyaXRpbmcgY29udmVydGVkICVzIHRvICVzIiAlICgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYucHkyX3NyY19kaXIsIG5hbWUpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5weTNfZGVzdF9kaXIsIG5hbWUrc3VmZml4KSksIHN0ZGVycikKKyAgICAgICAgc2VwID0gcmUuZXNjYXBlKG9zLnNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKAorICAgICAgICAgICAgICAgIHN0ZGVyciwgciJObyBjaGFuZ2VzIHRvIC4qL19faW5pdF9fXC5weSIucmVwbGFjZSgiLyIsIHNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90UmVnZXgoCisgICAgICAgICAgICAgICAgc3RkZXJyLCByIk5vIGNoYW5nZXMgdG8gLiovdHJpdmlhbFwucHkiLnJlcGxhY2UoIi8iLCBzZXApKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWVfY2hhbmdpbmdfb25fb3V0cHV0X3R3b19maWxlcyhzZWxmKToKKyAgICAgICAgIiIiMnRvMyB0d28gZmlsZXMgaW4gb25lIGRpcmVjdG9yeSB3aXRoIGEgbmV3IG91dHB1dCBkaXIuIiIiCisgICAgICAgIHNlbGYuc2V0dXBfdGVzdF9zb3VyY2VfdHJlZXMoKQorICAgICAgICBlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHB5Ml9maWxlcyA9IFtzZWxmLnRyaXZpYWxfcHkyX2ZpbGUsIHNlbGYuaW5pdF9weTJfZmlsZV0KKyAgICAgICAgZXhwZWN0ZWRfZmlsZXMgPSBzZXQob3MucGF0aC5iYXNlbmFtZShuYW1lKSBmb3IgbmFtZSBpbiBweTJfZmlsZXMpCisgICAgICAgIHJldCA9IHNlbGYucnVuXzJ0bzNfY2FwdHVyZSgKKyAgICAgICAgICAgICAgICBbIi1uIiwgIi13IiwgIi0td3JpdGUtdW5jaGFuZ2VkLWZpbGVzIiwKKyAgICAgICAgICAgICAgICAgIi0tbm8tZGlmZnMiLCAiLS1vdXRwdXQtZGlyIiwgc2VsZi5weTNfZGVzdF9kaXJdICsgcHkyX2ZpbGVzLAorICAgICAgICAgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPKCIiKSwgU3RyaW5nSU8uU3RyaW5nSU8oKSwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldCwgMCkKKyAgICAgICAgc3RkZXJyID0gZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICAgICAiT3V0cHV0IGluICVyIHdpbGwgbWlycm9yIHRoZSBpbnB1dCBkaXJlY3RvcnkgJXIgbGF5b3V0IiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHkzX2Rlc3RfZGlyLCBzZWxmLnB5Ml9zcmNfZGlyKSwgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2ZpbGVzLCBzZXQob3MubGlzdGRpcihzZWxmLnB5M19kZXN0X2RpcikpKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWVfY2hhbmdpbmdfb25fb3V0cHV0X3NpbmdsZV9maWxlKHNlbGYpOgorICAgICAgICAiIiIydG8zIGEgc2luZ2xlIGZpbGUgd2l0aCBhIG5ldyBvdXRwdXQgZGlyLiIiIgorICAgICAgICBzZWxmLnNldHVwX3Rlc3Rfc291cmNlX3RyZWVzKCkKKyAgICAgICAgZXJyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICByZXQgPSBzZWxmLnJ1bl8ydG8zX2NhcHR1cmUoCisgICAgICAgICAgICAgICAgWyItbiIsICItdyIsICItLW5vLWRpZmZzIiwgIi0tb3V0cHV0LWRpciIsIHNlbGYucHkzX2Rlc3RfZGlyLAorICAgICAgICAgICAgICAgICBzZWxmLnRyaXZpYWxfcHkyX2ZpbGVdLAorICAgICAgICAgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPKCIiKSwgU3RyaW5nSU8uU3RyaW5nSU8oKSwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldCwgMCkKKyAgICAgICAgc3RkZXJyID0gZXJyLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICAgICAiT3V0cHV0IGluICVyIHdpbGwgbWlycm9yIHRoZSBpbnB1dCBkaXJlY3RvcnkgJXIgbGF5b3V0IiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucHkzX2Rlc3RfZGlyLCBzZWxmLnB5Ml9zcmNfZGlyKSwgc3RkZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChbb3MucGF0aC5iYXNlbmFtZShzZWxmLnRyaXZpYWxfcHkyX2ZpbGUpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KG9zLmxpc3RkaXIoc2VsZi5weTNfZGVzdF9kaXIpKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weWMgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9tYWluLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWM1MGNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weW8gYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9tYWluLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWM1MGNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfbWFpbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDIzODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9wYXJzZXIucHkKQEAgLTAsMCArMSwyMjcgQEAKKyIiIlRlc3Qgc3VpdGUgZm9yIDJ0bzMncyBwYXJzZXIgYW5kIGdyYW1tYXIgZmlsZXMuCisKK1RoaXMgaXMgdGhlIHBsYWNlIHRvIGFkZCB0ZXN0cyBmb3IgY2hhbmdlcyB0byAydG8zJ3MgZ3JhbW1hciwgc3VjaCBhcyB0aG9zZQorbWVyZ2luZyB0aGUgZ3JhbW1hcnMgZm9yIFB5dGhvbiAyIGFuZCAzLiBJbiBhZGRpdGlvbiB0byBzcGVjaWZpYyB0ZXN0cyBmb3IKK3BhcnRzIG9mIHRoZSBncmFtbWFyIHdlJ3ZlIGNoYW5nZWQsIHdlIGFsc28gbWFrZSBzdXJlIHdlIGNhbiBwYXJzZSB0aGUKK3Rlc3RfZ3JhbW1hci5weSBmaWxlcyBmcm9tIGJvdGggUHl0aG9uIDIgYW5kIFB5dGhvbiAzLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKKworIyBUZXN0aW5nIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgc3VwcG9ydAorZnJvbSAuc3VwcG9ydCBpbXBvcnQgZHJpdmVyLCB0ZXN0X2RpcgorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworIyBMb2NhbCBpbXBvcnRzCitmcm9tIGxpYjJ0bzMucGdlbjIgaW1wb3J0IHRva2VuaXplCitmcm9tIC4ucGdlbjIucGFyc2UgaW1wb3J0IFBhcnNlRXJyb3IKK2Zyb20gbGliMnRvMy5weWdyYW0gaW1wb3J0IHB5dGhvbl9zeW1ib2xzIGFzIHN5bXMKKworCitjbGFzcyBUZXN0RHJpdmVyKHN1cHBvcnQuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZm9ybWZlZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiJwcmludCAxXG5ceDBDcHJpbnQgMlxuIiIiCisgICAgICAgIHQgPSBkcml2ZXIucGFyc2Vfc3RyaW5nKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5jaGlsZHJlblswXS5jaGlsZHJlblswXS50eXBlLCBzeW1zLnByaW50X3N0bXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5jaGlsZHJlblsxXS5jaGlsZHJlblswXS50eXBlLCBzeW1zLnByaW50X3N0bXQpCisKKworY2xhc3MgR3JhbW1hclRlc3Qoc3VwcG9ydC5UZXN0Q2FzZSk6CisgICAgZGVmIHZhbGlkYXRlKHNlbGYsIGNvZGUpOgorICAgICAgICBzdXBwb3J0LnBhcnNlX3N0cmluZyhjb2RlKQorCisgICAgZGVmIGludmFsaWRfc3ludGF4KHNlbGYsIGNvZGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnZhbGlkYXRlKGNvZGUpCisgICAgICAgIGV4Y2VwdCBQYXJzZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlN5bnRheCBzaG91bGRuJ3QgaGF2ZSBiZWVuIHZhbGlkIikKKworCitjbGFzcyBUZXN0UmFpc2VDaGFuZ2VzKEdyYW1tYXJUZXN0KToKKyAgICBkZWYgdGVzdF8yeF9zdHlsZV8xKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCJyYWlzZSIpCisKKyAgICBkZWYgdGVzdF8yeF9zdHlsZV8yKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCJyYWlzZSBFLCBWIikKKworICAgIGRlZiB0ZXN0XzJ4X3N0eWxlXzMoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoInJhaXNlIEUsIFYsIFQiKQorCisgICAgZGVmIHRlc3RfMnhfc3R5bGVfaW52YWxpZF8xKHNlbGYpOgorICAgICAgICBzZWxmLmludmFsaWRfc3ludGF4KCJyYWlzZSBFLCBWLCBULCBaIikKKworICAgIGRlZiB0ZXN0XzN4X3N0eWxlKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCJyYWlzZSBFMSBmcm9tIEUyIikKKworICAgIGRlZiB0ZXN0XzN4X3N0eWxlX2ludmFsaWRfMShzZWxmKToKKyAgICAgICAgc2VsZi5pbnZhbGlkX3N5bnRheCgicmFpc2UgRSwgViBmcm9tIEUxIikKKworICAgIGRlZiB0ZXN0XzN4X3N0eWxlX2ludmFsaWRfMihzZWxmKToKKyAgICAgICAgc2VsZi5pbnZhbGlkX3N5bnRheCgicmFpc2UgRSBmcm9tIEUxLCBFMiIpCisKKyAgICBkZWYgdGVzdF8zeF9zdHlsZV9pbnZhbGlkXzMoc2VsZik6CisgICAgICAgIHNlbGYuaW52YWxpZF9zeW50YXgoInJhaXNlIGZyb20gRTEsIEUyIikKKworICAgIGRlZiB0ZXN0XzN4X3N0eWxlX2ludmFsaWRfNChzZWxmKToKKyAgICAgICAgc2VsZi5pbnZhbGlkX3N5bnRheCgicmFpc2UgRSBmcm9tIikKKworCisjIEFkYXBhdGVkIGZyb20gUHl0aG9uIDMncyBMaWIvdGVzdC90ZXN0X2dyYW1tYXIucHk6R3JhbW1hclRlc3RzLnRlc3RGdW5jZGVmCitjbGFzcyBUZXN0RnVuY3Rpb25Bbm5vdGF0aW9ucyhHcmFtbWFyVGVzdCk6CisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJkZWYgZih4KSAtPiBsaXN0OiBwYXNzIiIiKQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJkZWYgZih4OmludCk6IHBhc3MiIiIpCisKKyAgICBkZWYgdGVzdF8zKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiImRlZiBmKCp4OnN0cik6IHBhc3MiIiIpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiImRlZiBmKCoqeDpmbG9hdCk6IHBhc3MiIiIpCisKKyAgICBkZWYgdGVzdF81KHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiImRlZiBmKHgsIHk6MSsyKTogcGFzcyIiIikKKworICAgIGRlZiB0ZXN0XzYoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIiZGVmIGYoYSwgKGI6MSwgYzoyLCBkKSk6IHBhc3MiIiIpCisKKyAgICBkZWYgdGVzdF83KHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiImRlZiBmKGEsIChiOjEsIGM6MiwgZCksIGU6Mz00LCBmPTUsICpnOjYpOiBwYXNzIiIiKQorCisgICAgZGVmIHRlc3RfOChzZWxmKToKKyAgICAgICAgcyA9ICIiImRlZiBmKGEsIChiOjEsIGM6MiwgZCksIGU6Mz00LCBmPTUsCisgICAgICAgICAgICAgICAgICAgICAgICAqZzo2LCBoOjcsIGk9OCwgajo5PTEwLCAqKms6MTEpIC0+IDEyOiBwYXNzIiIiCisgICAgICAgIHNlbGYudmFsaWRhdGUocykKKworCitjbGFzcyBUZXN0RXhjZXB0KEdyYW1tYXJUZXN0KToKKyAgICBkZWYgdGVzdF9uZXcoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4CisgICAgICAgICAgICBleGNlcHQgRSBhcyBOOgorICAgICAgICAgICAgICAgIHkiIiIKKyAgICAgICAgc2VsZi52YWxpZGF0ZShzKQorCisgICAgZGVmIHRlc3Rfb2xkKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeAorICAgICAgICAgICAgZXhjZXB0IEUsIE46CisgICAgICAgICAgICAgICAgeSIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlKHMpCisKKworIyBBZGFwdGVkIGZyb20gUHl0aG9uIDMncyBMaWIvdGVzdC90ZXN0X2dyYW1tYXIucHk6R3JhbW1hclRlc3RzLnRlc3RBdG9tcworY2xhc3MgVGVzdFNldExpdGVyYWwoR3JhbW1hclRlc3QpOgorICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIieCA9IHsnb25lJ30iIiIpCisKKyAgICBkZWYgdGVzdF8yKHNlbGYpOgorICAgICAgICBzZWxmLnZhbGlkYXRlKCIiInggPSB7J29uZScsIDEsfSIiIikKKworICAgIGRlZiB0ZXN0XzMoc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIieCA9IHsnb25lJywgJ3R3bycsICd0aHJlZSd9IiIiKQorCisgICAgZGVmIHRlc3RfNChzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiIiJ4ID0gezIsIDMsIDQsfSIiIikKKworCitjbGFzcyBUZXN0TnVtZXJpY0xpdGVyYWxzKEdyYW1tYXJUZXN0KToKKyAgICBkZWYgdGVzdF9uZXdfb2N0YWxfbm90YXRpb24oc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIiMG83Nzc3Nzc3Nzc3Nzc3IiIiKQorICAgICAgICBzZWxmLmludmFsaWRfc3ludGF4KCIiIjBvNzMyNDUyODg4NyIiIikKKworICAgIGRlZiB0ZXN0X25ld19iaW5hcnlfbm90YXRpb24oc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGUoIiIiMGIxMDEwMTAiIiIpCisgICAgICAgIHNlbGYuaW52YWxpZF9zeW50YXgoIiIiMGIwMTAxMDIxIiIiKQorCisKK2NsYXNzIFRlc3RDbGFzc0RlZihHcmFtbWFyVGVzdCk6CisgICAgZGVmIHRlc3RfbmV3X3N5bnRheChzZWxmKToKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiY2xhc3MgQih0PTcpOiBwYXNzIikKKyAgICAgICAgc2VsZi52YWxpZGF0ZSgiY2xhc3MgQih0LCAqYXJncyk6IHBhc3MiKQorICAgICAgICBzZWxmLnZhbGlkYXRlKCJjbGFzcyBCKHQsICoqa3dhcmdzKTogcGFzcyIpCisgICAgICAgIHNlbGYudmFsaWRhdGUoImNsYXNzIEIodCwgKmFyZ3MsICoqa3dhcmdzKTogcGFzcyIpCisgICAgICAgIHNlbGYudmFsaWRhdGUoImNsYXNzIEIodCwgeT05LCAqYXJncywgKiprd2FyZ3MpOiBwYXNzIikKKworCitjbGFzcyBUZXN0UGFyc2VySWRlbXBvdGVuY3koc3VwcG9ydC5UZXN0Q2FzZSk6CisKKyAgICAiIiJBIGN1dC1kb3duIHZlcnNpb24gb2YgcHl0cmVlX2lkZW1wb3RlbmN5LnB5LiIiIgorCisgICAgZGVmIHRlc3RfYWxsX3Byb2plY3RfZmlsZXMoc2VsZik6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKToKKyAgICAgICAgICAgICMgWFhYIHNvbWV0aGluZyB3aXRoIG5ld2xpbmVzIGdvZXMgd3Jvbmcgb24gV2luZG93cy4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmb3IgZmlsZXBhdGggaW4gc3VwcG9ydC5hbGxfcHJvamVjdF9maWxlcygpOgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBlbmNvZGluZyA9IHRva2VuaXplLmRldGVjdF9lbmNvZGluZyhmcC5yZWFkbGluZSlbMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbmNvZGluZyBpcyBub3QgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGV0ZWN0IGVuY29kaW5nIGZvciAlcyIgJSBmaWxlcGF0aCkKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlcGF0aCwgInIiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBzb3VyY2UuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgdHJlZSA9IGRyaXZlci5wYXJzZV9zdHJpbmcoc291cmNlKQorICAgICAgICAgICAgbmV3ID0gdW5pY29kZSh0cmVlKQorICAgICAgICAgICAgaWYgZGlmZihmaWxlcGF0aCwgbmV3LCBlbmNvZGluZyk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJJZGVtcG90ZW5jeSBmYWlsZWQ6ICVzIiAlIGZpbGVwYXRoKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfdW5wYWNraW5nKHNlbGYpOgorICAgICAgICBkcml2ZXIucGFyc2Vfc3RyaW5nKCJhLCAqYiwgYyA9IHhcbiIpCisgICAgICAgIGRyaXZlci5wYXJzZV9zdHJpbmcoIlsqYSwgYl0gPSB4XG4iKQorICAgICAgICBkcml2ZXIucGFyc2Vfc3RyaW5nKCIoeiwgKnksIHcpID0gbVxuIikKKyAgICAgICAgZHJpdmVyLnBhcnNlX3N0cmluZygiZm9yICp6LCBtIGluIGQ6IHBhc3NcbiIpCisKK2NsYXNzIFRlc3RMaXRlcmFscyhHcmFtbWFyVGVzdCk6CisKKyAgICBkZWYgdmFsaWRhdGUoc2VsZiwgcyk6CisgICAgICAgIGRyaXZlci5wYXJzZV9zdHJpbmcoc3VwcG9ydC5kZWRlbnQocykgKyAiXG5cbiIpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmVfYnl0ZXNfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIG1kNXRlc3QoYiJceGFhIiAqIDgwLAorICAgICAgICAgICAgICAgICAgICAoYiJUZXN0IFVzaW5nIExhcmdlciBUaGFuIEJsb2NrLVNpemUgS2V5ICIKKyAgICAgICAgICAgICAgICAgICAgIGIiYW5kIExhcmdlciBUaGFuIE9uZSBCbG9jay1TaXplIERhdGEiKSwKKyAgICAgICAgICAgICAgICAgICAgIjZmNjMwZmFkNjdjZGEwZWUxZmIxZjU2MmRiM2FhNTNlIikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlKHMpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmVfYnl0ZXNfdHJpcHF1b3RlX2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBzID0gJycnCisgICAgICAgICAgICBiIiIiCisgICAgICAgICAgICA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorICAgICAgICAgICAgPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUgQ29tcHV0ZXIvL0RURCBQTElTVCAxLjAvL0VOIj4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgJycnCisgICAgICAgIHNlbGYudmFsaWRhdGUocykKKworICAgIGRlZiB0ZXN0X211bHRpbGluZV9zdHJfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIG1kNXRlc3QoIlx4YWEiICogODAsCisgICAgICAgICAgICAgICAgICAgICgiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAiCisgICAgICAgICAgICAgICAgICAgICAiYW5kIExhcmdlciBUaGFuIE9uZSBCbG9jay1TaXplIERhdGEiKSwKKyAgICAgICAgICAgICAgICAgICAgIjZmNjMwZmFkNjdjZGEwZWUxZmIxZjU2MmRiM2FhNTNlIikKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnZhbGlkYXRlKHMpCisKKworZGVmIGRpZmYoZm4sIHJlc3VsdCwgZW5jb2RpbmcpOgorICAgIGYgPSBvcGVuKCJAIiwgInciKQorICAgIHRyeToKKyAgICAgICAgZi53cml0ZShyZXN1bHQuZW5jb2RlKGVuY29kaW5nKSkKKyAgICBmaW5hbGx5OgorICAgICAgICBmLmNsb3NlKCkKKyAgICB0cnk6CisgICAgICAgIGZuID0gZm4ucmVwbGFjZSgnIicsICdcXCInKQorICAgICAgICByZXR1cm4gb3Muc3lzdGVtKCdkaWZmIC11ICIlcyIgQCcgJSBmbikKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5yZW1vdmUoIkAiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1Yzc4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcGFyc2VyLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1Yzc4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3BhcnNlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5IGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjN2Q5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9weXRyZWUucHkKQEAgLTAsMCArMSw0OTQgQEAKKyMgQ29weXJpZ2h0IDIwMDYgR29vZ2xlLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKworIiIiVW5pdCB0ZXN0cyBmb3IgcHl0cmVlLnB5LgorCitOT1RFOiBQbGVhc2UgKmRvbid0KiBhZGQgZG9jIHN0cmluZ3MgdG8gaW5kaXZpZHVhbCB0ZXN0IG1ldGhvZHMhCitJbiB2ZXJib3NlIG1vZGUsIHByaW50aW5nIG9mIHRoZSBtb2R1bGUsIGNsYXNzIGFuZCBtZXRob2QgbmFtZSBpcyBtdWNoCittb3JlIGhlbHBmdWwgdGhhbiBwcmludGluZyBvZiAodGhlIGZpcnN0IGxpbmUgb2YpIHRoZSBkb2NzdHJpbmcsCitlc3BlY2lhbGx5IHdoZW4gZGVidWdnaW5nIGEgdGVzdC4KKyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2ltcG9ydCBzeXMKK2ltcG9ydCB3YXJuaW5ncworCisjIFRlc3RpbmcgaW1wb3J0cworZnJvbSAuIGltcG9ydCBzdXBwb3J0CisKK2Zyb20gbGliMnRvMyBpbXBvcnQgcHl0cmVlCisKK3RyeToKKyAgICBzb3J0ZWQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIHNvcnRlZChsc3QpOgorICAgICAgICBsID0gbGlzdChsc3QpCisgICAgICAgIGwuc29ydCgpCisgICAgICAgIHJldHVybiBsCisKK2NsYXNzIFRlc3ROb2RlcyhzdXBwb3J0LlRlc3RDYXNlKToKKworICAgICIiIlVuaXQgdGVzdHMgZm9yIG5vZGVzIChCYXNlLCBMZWFmLCBOb2RlKS4iIiIKKworICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDIsNik6CisgICAgICAgICMgd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MgaXMgbmV3IGluIDIuNi4KKyAgICAgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9wcmVmaXhfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgICAgIGwgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImFsd2F5cyIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwuZ2V0X3ByZWZpeCgpLCAiIikKKyAgICAgICAgICAgICAgICBsLnNldF9wcmVmaXgoImhpIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5wcmVmaXgsICJoaSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMikKKyAgICAgICAgICAgIGZvciB3YXJuaW5nIGluIHc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdhcm5pbmcuY2F0ZWdvcnkgaXMgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1swXS5tZXNzYWdlKSwgImdldF9wcmVmaXgoKSBpcyBkZXByZWNhdGVkOyAiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgdGhlIHByZWZpeCBwcm9wZXJ0eSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3WzFdLm1lc3NhZ2UpLCAic2V0X3ByZWZpeCgpIGlzIGRlcHJlY2F0ZWQ7ICIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZSB0aGUgcHJlZml4IHByb3BlcnR5IikKKworICAgIGRlZiB0ZXN0X2luc3RhbnRpYXRlX2Jhc2Uoc2VsZik6CisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICMgVGVzdCB0aGF0IGluc3RhbnRpYXRpbmcgQmFzZSgpIHJhaXNlcyBhbiBBc3NlcnRpb25FcnJvcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIHB5dHJlZS5CYXNlKQorCisgICAgZGVmIHRlc3RfbGVhZihzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnR5cGUsIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS52YWx1ZSwgImZvbyIpCisKKyAgICBkZWYgdGVzdF9sZWFmX3JlcHIoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGwxKSwgIkxlYWYoMTAwLCAnZm9vJykiKQorCisgICAgZGVmIHRlc3RfbGVhZl9zdHIoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobDEpLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJmb28iLCBjb250ZXh0PSgiICIsICgxMCwgMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihsMiksICIgZm9vIikKKworICAgIGRlZiB0ZXN0X2xlYWZfc3RyX251bWVyaWNfdmFsdWUoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdGhlIExlYWYncyB2YWx1ZSBpcyBzdHJpbmdpZmllZC4gRmFpbGluZyB0bworICAgICAgICAjICBkbyB0aGlzIGNhbiBjYXVzZSBhIFR5cGVFcnJvciBpbiBjZXJ0YWluIHNpdHVhdGlvbnMuCisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMiwgNSkKKyAgICAgICAgbDEucHJlZml4ID0gImZvb18iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGwxKSwgImZvb181IikKKworICAgIGRlZiB0ZXN0X2xlYWZfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJmb28iLCBjb250ZXh0PSgiICIsICgxLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEsIGwyKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMSwgImZvbyIpCisgICAgICAgIGw0ID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsMSwgbDMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobDEsIGw0KQorCisgICAgZGVmIHRlc3RfbGVhZl9wcmVmaXgoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wcmVmaXgsICIiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGwxLndhc19jaGFuZ2VkKQorICAgICAgICBsMS5wcmVmaXggPSAiICAjI1xuXG4iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCAiICAjI1xuXG4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobDEud2FzX2NoYW5nZWQpCisKKyAgICBkZWYgdGVzdF9ub2RlKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMjAwLCAiYmFyIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS50eXBlLCAxMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLmNoaWxkcmVuLCBbbDEsIGwyXSkKKworICAgIGRlZiB0ZXN0X25vZGVfcmVwcihzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIsIGNvbnRleHQ9KCIgIiwgKDEsIDApKSkKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKG4xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTm9kZSgxMDAwLCBbJXMsICVzXSkiICUgKHJlcHIobDEpLCByZXByKGwyKSkpCisKKyAgICBkZWYgdGVzdF9ub2RlX3N0cihzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIsIGNvbnRleHQ9KCIgIiwgKDEsIDApKSkKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobjEpLCAiZm9vIGJhciIpCisKKyAgICBkZWYgdGVzdF9ub2RlX3ByZWZpeChzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnByZWZpeCwgIiIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wcmVmaXgsICIiKQorICAgICAgICBuMS5wcmVmaXggPSAiICIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wcmVmaXgsICIgIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMS5wcmVmaXgsICIgIikKKworICAgIGRlZiB0ZXN0X2dldF9zdWZmaXgoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIiwgcHJlZml4PSJhIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiLCBwcmVmaXg9ImIiKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEuZ2V0X3N1ZmZpeCgpLCBsMi5wcmVmaXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDIuZ2V0X3N1ZmZpeCgpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5nZXRfc3VmZml4KCksICIiKQorCisgICAgICAgIGwzID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIiwgcHJlZml4PSJjIikKKyAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjEsIGwzXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLmdldF9zdWZmaXgoKSwgbDMucHJlZml4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwzLmdldF9zdWZmaXgoKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIuZ2V0X3N1ZmZpeCgpLCAiIikKKworICAgIGRlZiB0ZXN0X25vZGVfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgKCkpCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW10sIGNvbnRleHQ9KCIgIiwgKDEsIDApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMSwgbjIpCisgICAgICAgIG4zID0gcHl0cmVlLk5vZGUoMTAwMSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobjEsIG4zKQorCisgICAgZGVmIHRlc3Rfbm9kZV9yZWN1cnNpdmVfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMV0pCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMSwgbjIpCisgICAgICAgIGwzID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbjMgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDNdKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG4xLCBuMykKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICIrIikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDIsIGwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wxLCBsMiwgbDNdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShuMS5jaGlsZHJlbiwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobjEud2FzX2NoYW5nZWQpCisgICAgICAgIGwybmV3ID0gcHl0cmVlLkxlYWYoMTAwLCAiLSIpCisgICAgICAgIGwyLnJlcGxhY2UobDJuZXcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuY2hpbGRyZW4sIFtsMSwgbDJuZXcsIGwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobjEuY2hpbGRyZW4sIGxpc3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobjEud2FzX2NoYW5nZWQpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlX3dpdGhfbGlzdChzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgIisiKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMiwgbDNdKQorCisgICAgICAgIGwyLnJlcGxhY2UoW3B5dHJlZS5MZWFmKDEwMCwgIioiKSwgcHl0cmVlLkxlYWYoMTAwLCAiKiIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobjEpLCAiZm9vKipiYXIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShuMS5jaGlsZHJlbiwgbGlzdCkpCisKKyAgICBkZWYgdGVzdF9sZWF2ZXMoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImZvb2V5IikKKyAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgbjMgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDNdKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtuMiwgbjNdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChuMS5sZWF2ZXMoKSksIFtsMSwgbDIsIGwzXSkKKworICAgIGRlZiB0ZXN0X2RlcHRoKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgbjMgPSBweXRyZWUuTm9kZSgxMDAwLCBbXSkKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjIsIG4zXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLmRlcHRoKCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjMuZGVwdGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5kZXB0aCgpLCAwKQorCisgICAgZGVmIHRlc3RfcG9zdF9vcmRlcihzZWxmKToKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIGwzID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vZXkiKQorICAgICAgICBjMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtjMSwgbDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobjEucG9zdF9vcmRlcigpKSwgW2wxLCBsMiwgYzEsIGwzLCBuMV0pCisKKyAgICBkZWYgdGVzdF9wcmVfb3JkZXIoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImZvb2V5IikKKyAgICAgICAgYzEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbYzEsIGwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG4xLnByZV9vcmRlcigpKSwgW24xLCBjMSwgbDEsIGwyLCBsM10pCisKKyAgICBkZWYgdGVzdF9jaGFuZ2VkKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImYiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGwxLndhc19jaGFuZ2VkKQorICAgICAgICBsMS5jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwxLndhc19jaGFuZ2VkKQorCisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZiIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuMS53YXNfY2hhbmdlZCkKKyAgICAgICAgbjEuY2hhbmdlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMS53YXNfY2hhbmdlZCkKKworICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiKyIpCisgICAgICAgIGwzID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyLCBsM10pCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW24xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMS53YXNfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuMS53YXNfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuMi53YXNfY2hhbmdlZCkKKworICAgICAgICBuMS5jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4xLndhc19jaGFuZ2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobjIud2FzX2NoYW5nZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobDEud2FzX2NoYW5nZWQpCisKKyAgICBkZWYgdGVzdF9sZWFmX2NvbnN0cnVjdG9yX3ByZWZpeChzZWxmKToKKyAgICAgICAgZm9yIHByZWZpeCBpbiAoInh5el8iLCAiIik6CisgICAgICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgInNlbGYiLCBwcmVmaXg9cHJlZml4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihsMSksIHByZWZpeCArICJzZWxmIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCBwcmVmaXgpCisKKyAgICBkZWYgdGVzdF9ub2RlX2NvbnN0cnVjdG9yX3ByZWZpeChzZWxmKToKKyAgICAgICAgZm9yIHByZWZpeCBpbiAoInh5el8iLCAiIik6CisgICAgICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgInNlbGYiKQorICAgICAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJmb28iLCBwcmVmaXg9Il8iKQorICAgICAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSwgcHJlZml4PXByZWZpeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIobjEpLCBwcmVmaXggKyAic2VsZl9mb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wcmVmaXgsIHByZWZpeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJlZml4LCBwcmVmaXgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLnByZWZpeCwgIl8iKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDEsIGwyXSkKKyAgICAgICAgbjIgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjFdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucmVtb3ZlKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIuY2hpbGRyZW4sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnBhcmVudCwgbjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucGFyZW50LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuMS53YXNfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4yLndhc19jaGFuZ2VkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDIucmVtb3ZlKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucmVtb3ZlKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEuY2hpbGRyZW4sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wYXJlbnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIucGFyZW50LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobjEud2FzX2NoYW5nZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMi53YXNfY2hhbmdlZCkKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9wYXJlbnRsZXNzKHNlbGYpOgorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdKQorICAgICAgICBuMS5yZW1vdmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLnBhcmVudCwgTm9uZSkKKworICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwxLnJlbW92ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucGFyZW50LCBOb25lKQorCisgICAgZGVmIHRlc3Rfbm9kZV9zZXRfY2hpbGQoc2VsZik6CisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbjEgPSBweXRyZWUuTm9kZSgxMDAwLCBbbDFdKQorCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbjEuc2V0X2NoaWxkKDAsIGwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMi5wYXJlbnQsIG4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLmNoaWxkcmVuLCBbbDJdKQorCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxXSkKKyAgICAgICAgbjIuc2V0X2NoaWxkKDAsIG4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5wYXJlbnQsIG4yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLnBhcmVudCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMi5jaGlsZHJlbiwgW24xXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBuMS5zZXRfY2hpbGQsIDQsIGwyKQorICAgICAgICAjIEkgZG9uJ3QgY2FyZSB3aGF0IGl0IHJhaXNlcywgc28gbG9uZyBhcyBpdCdzIGFuIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG4xLnNldF9jaGlsZCwgMCwgbGlzdCkKKworICAgIGRlZiB0ZXN0X25vZGVfaW5zZXJ0X2NoaWxkKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxXSkKKworICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIG4xLmluc2VydF9jaGlsZCgwLCBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMi5wYXJlbnQsIG4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLmNoaWxkcmVuLCBbbDIsIGwxXSkKKworICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImFiYyIpCisgICAgICAgIG4xLmluc2VydF9jaGlsZCgyLCBsMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wyLCBsMSwgbDNdKQorCisgICAgICAgICMgSSBkb24ndCBjYXJlIHdoYXQgaXQgcmFpc2VzLCBzbyBsb25nIGFzIGl0J3MgYW4gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbjEuaW5zZXJ0X2NoaWxkLCAwLCBsaXN0KQorCisgICAgZGVmIHRlc3Rfbm9kZV9hcHBlbmRfY2hpbGQoc2VsZik6CisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW10pCisKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBuMS5hcHBlbmRfY2hpbGQobDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucGFyZW50LCBuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMS5jaGlsZHJlbiwgW2wxXSkKKworICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImJhciIpCisgICAgICAgIG4xLmFwcGVuZF9jaGlsZChsMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMi5wYXJlbnQsIG4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4xLmNoaWxkcmVuLCBbbDEsIGwyXSkKKworICAgICAgICAjIEkgZG9uJ3QgY2FyZSB3aGF0IGl0IHJhaXNlcywgc28gbG9uZyBhcyBpdCdzIGFuIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG4xLmFwcGVuZF9jaGlsZCwgbGlzdCkKKworICAgIGRlZiB0ZXN0X25vZGVfbmV4dF9zaWJsaW5nKHNlbGYpOgorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdKQorICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdKQorICAgICAgICBwMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtuMSwgbjJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMS5uZXh0X3NpYmxpbmcgaXMgbjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIubmV4dF9zaWJsaW5nLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLm5leHRfc2libGluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2xlYWZfbmV4dF9zaWJsaW5nKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImEiKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImIiKQorICAgICAgICBwMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsMS5uZXh0X3NpYmxpbmcgaXMgbDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDIubmV4dF9zaWJsaW5nLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLm5leHRfc2libGluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vZGVfcHJldl9zaWJsaW5nKHNlbGYpOgorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdKQorICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtdKQorICAgICAgICBwMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtuMSwgbjJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuMi5wcmV2X3NpYmxpbmcgaXMgbjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEucHJldl9zaWJsaW5nLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnByZXZfc2libGluZywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2xlYWZfcHJldl9zaWJsaW5nKHNlbGYpOgorICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImEiKQorICAgICAgICBsMiA9IHB5dHJlZS5MZWFmKDEwMCwgImIiKQorICAgICAgICBwMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsMi5wcmV2X3NpYmxpbmcgaXMgbDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDEucHJldl9zaWJsaW5nLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnByZXZfc2libGluZywgTm9uZSkKKworCitjbGFzcyBUZXN0UGF0dGVybnMoc3VwcG9ydC5UZXN0Q2FzZSk6CisKKyAgICAiIiJVbml0IHRlc3RzIGZvciB0cmVlIG1hdGNoaW5nIHBhdHRlcm5zLiIiIgorCisgICAgZGVmIHRlc3RfYmFzaWNfcGF0dGVybnMoc2VsZik6CisgICAgICAgICMgQnVpbGQgYSB0cmVlCisgICAgICAgIGwxID0gcHl0cmVlLkxlYWYoMTAwLCAiZm9vIikKKyAgICAgICAgbDIgPSBweXRyZWUuTGVhZigxMDAsICJiYXIiKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIG4xID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wxLCBsMl0pCisgICAgICAgIG4yID0gcHl0cmVlLk5vZGUoMTAwMCwgW2wzXSkKKyAgICAgICAgcm9vdCA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtuMSwgbjJdKQorICAgICAgICAjIEJ1aWxkIGEgcGF0dGVybiBtYXRjaGluZyBhIGxlYWYKKyAgICAgICAgcGwgPSBweXRyZWUuTGVhZlBhdHRlcm4oMTAwLCAiZm9vIiwgbmFtZT0icGwiKQorICAgICAgICByID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwbC5tYXRjaChyb290LCByZXN1bHRzPXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHt9KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBsLm1hdGNoKG4xLCByZXN1bHRzPXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHt9KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBsLm1hdGNoKG4yLCByZXN1bHRzPXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHt9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGwubWF0Y2gobDEsIHJlc3VsdHM9cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgeyJwbCI6IGwxfSkKKyAgICAgICAgciA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGwubWF0Y2gobDIsIHJlc3VsdHM9cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwge30pCisgICAgICAgICMgQnVpbGQgYSBwYXR0ZXJuIG1hdGNoaW5nIGEgbm9kZQorICAgICAgICBwbiA9IHB5dHJlZS5Ob2RlUGF0dGVybigxMDAwLCBbcGxdLCBuYW1lPSJwbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG4ubWF0Y2gocm9vdCwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwbi5tYXRjaChuMSwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBuLm1hdGNoKG4yLCByZXN1bHRzPXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHsicG4iOiBuMiwgInBsIjogbDN9KQorICAgICAgICByID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwbi5tYXRjaChsMSwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwbi5tYXRjaChsMiwgcmVzdWx0cz1yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKworICAgIGRlZiB0ZXN0X3dpbGRjYXJkKHNlbGYpOgorICAgICAgICAjIEJ1aWxkIGEgdHJlZSBmb3IgdGVzdGluZworICAgICAgICBsMSA9IHB5dHJlZS5MZWFmKDEwMCwgImZvbyIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMTAwLCAiYmFyIikKKyAgICAgICAgbDMgPSBweXRyZWUuTGVhZigxMDAsICJmb28iKQorICAgICAgICBuMSA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsMSwgbDJdKQorICAgICAgICBuMiA9IHB5dHJlZS5Ob2RlKDEwMDAsIFtsM10pCisgICAgICAgIHJvb3QgPSBweXRyZWUuTm9kZSgxMDAwLCBbbjEsIG4yXSkKKyAgICAgICAgIyBCdWlsZCBhIHBhdHRlcm4KKyAgICAgICAgcGwgPSBweXRyZWUuTGVhZlBhdHRlcm4oMTAwLCAiZm9vIiwgbmFtZT0icGwiKQorICAgICAgICBwbiA9IHB5dHJlZS5Ob2RlUGF0dGVybigxMDAwLCBbcGxdLCBuYW1lPSJwbiIpCisgICAgICAgIHB3ID0gcHl0cmVlLldpbGRjYXJkUGF0dGVybihbW3BuXSwgW3BsLCBwbF1dLCBuYW1lPSJwdyIpCisgICAgICAgIHIgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHB3Lm1hdGNoX3NlcShbcm9vdF0sIHIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHt9KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHB3Lm1hdGNoX3NlcShbbjFdLCByKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB3Lm1hdGNoX3NlcShbbjJdLCByKSkKKyAgICAgICAgIyBUaGVzZSBhcmUgZWFzaWVyIHRvIGRlYnVnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHIua2V5cygpKSwgWyJwbCIsICJwbiIsICJwdyJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbInBsIl0sIGwxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbInBuIl0sIG4yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbInB3Il0sIFtuMl0pCisgICAgICAgICMgQnV0IHRoaXMgaXMgZXF1aXZhbGVudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHsicGwiOiBsMSwgInBuIjogbjIsICJwdyI6IFtuMl19KQorICAgICAgICByID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB3Lm1hdGNoX3NlcShbbDEsIGwzXSwgcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgeyJwbCI6IGwzLCAicHciOiBbbDEsIGwzXX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyWyJwbCJdIGlzIGwzKQorICAgICAgICByID0ge30KKworICAgIGRlZiB0ZXN0X2dlbmVyYXRlX21hdGNoZXMoc2VsZik6CisgICAgICAgIGxhID0gcHl0cmVlLkxlYWYoMSwgImEiKQorICAgICAgICBsYiA9IHB5dHJlZS5MZWFmKDEsICJiIikKKyAgICAgICAgbGMgPSBweXRyZWUuTGVhZigxLCAiYyIpCisgICAgICAgIGxkID0gcHl0cmVlLkxlYWYoMSwgImQiKQorICAgICAgICBsZSA9IHB5dHJlZS5MZWFmKDEsICJlIikKKyAgICAgICAgbGYgPSBweXRyZWUuTGVhZigxLCAiZiIpCisgICAgICAgIGxlYXZlcyA9IFtsYSwgbGIsIGxjLCBsZCwgbGUsIGxmXQorICAgICAgICByb290ID0gcHl0cmVlLk5vZGUoMTAwMCwgbGVhdmVzKQorICAgICAgICBwYSA9IHB5dHJlZS5MZWFmUGF0dGVybigxLCAiYSIsICJwYSIpCisgICAgICAgIHBiID0gcHl0cmVlLkxlYWZQYXR0ZXJuKDEsICJiIiwgInBiIikKKyAgICAgICAgcGMgPSBweXRyZWUuTGVhZlBhdHRlcm4oMSwgImMiLCAicGMiKQorICAgICAgICBwZCA9IHB5dHJlZS5MZWFmUGF0dGVybigxLCAiZCIsICJwZCIpCisgICAgICAgIHBlID0gcHl0cmVlLkxlYWZQYXR0ZXJuKDEsICJlIiwgInBlIikKKyAgICAgICAgcGYgPSBweXRyZWUuTGVhZlBhdHRlcm4oMSwgImYiLCAicGYiKQorICAgICAgICBwdyA9IHB5dHJlZS5XaWxkY2FyZFBhdHRlcm4oW1twYSwgcGIsIHBjXSwgW3BkLCBwZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhLCBwYl0sIFtwYywgcGRdLCBbcGUsIHBmXV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW49MSwgbWF4PTQsIG5hbWU9InB3IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeFswXSBmb3IgeCBpbiBwdy5nZW5lcmF0ZV9tYXRjaGVzKGxlYXZlcyldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFszLCA1LCAyLCA0LCA2XSkKKyAgICAgICAgcHIgPSBweXRyZWUuTm9kZVBhdHRlcm4odHlwZT0xMDAwLCBjb250ZW50PVtwd10sIG5hbWU9InByIikKKyAgICAgICAgbWF0Y2hlcyA9IGxpc3QocHl0cmVlLmdlbmVyYXRlX21hdGNoZXMoW3ByXSwgW3Jvb3RdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obWF0Y2hlcyksIDEpCisgICAgICAgIGMsIHIgPSBtYXRjaGVzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoclsicHIiXSksICJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbInB3Il0sIFtsYSwgbGIsIGxjLCBsZCwgbGUsIGxmXSkKKyAgICAgICAgZm9yIGMgaW4gImFiY2RlZiI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbInAiICsgY10sIHB5dHJlZS5MZWFmKDEsIGMpKQorCisgICAgZGVmIHRlc3RfaGFzX2tleV9leGFtcGxlKHNlbGYpOgorICAgICAgICBwYXR0ZXJuID0gcHl0cmVlLk5vZGVQYXR0ZXJuKDMzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHl0cmVlLkxlYWZQYXR0ZXJuKDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXRyZWUuV2lsZGNhcmRQYXR0ZXJuKG5hbWU9ImFyZ3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHl0cmVlLkxlYWZQYXR0ZXJuKDgpKSkKKyAgICAgICAgbDEgPSBweXRyZWUuTGVhZig3LCAiKCIpCisgICAgICAgIGwyID0gcHl0cmVlLkxlYWYoMywgIngiKQorICAgICAgICBsMyA9IHB5dHJlZS5MZWFmKDgsICIpIikKKyAgICAgICAgbm9kZSA9IHB5dHJlZS5Ob2RlKDMzMSwgW2wxLCBsMiwgbDNdKQorICAgICAgICByID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhdHRlcm4ubWF0Y2gobm9kZSwgcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoclsiYXJncyJdLCBbbDJdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmYjMxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcHl0cmVlLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczODY0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3B5dHJlZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF9yZWZhY3Rvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDIwZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHkKQEAgLTAsMCArMSwzMTcgQEAKKyIiIgorVW5pdCB0ZXN0cyBmb3IgcmVmYWN0b3IucHkuCisiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB3aXRoX3N0YXRlbWVudAorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gbGliMnRvMyBpbXBvcnQgcmVmYWN0b3IsIHB5Z3JhbSwgZml4ZXJfYmFzZQorZnJvbSBsaWIydG8zLnBnZW4yIGltcG9ydCB0b2tlbgorCitmcm9tIC4gaW1wb3J0IHN1cHBvcnQKKworCitURVNUX0RBVEFfRElSID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIikKK0ZJWEVSX0RJUiA9IG9zLnBhdGguam9pbihURVNUX0RBVEFfRElSLCAiZml4ZXJzIikKKworc3lzLnBhdGguYXBwZW5kKEZJWEVSX0RJUikKK3RyeToKKyAgICBfREVGQVVMVF9GSVhFUlMgPSByZWZhY3Rvci5nZXRfZml4ZXJzX2Zyb21fcGFja2FnZSgibXlmaXhlcyIpCitmaW5hbGx5OgorICAgIHN5cy5wYXRoLnBvcCgpCisKK18yVE8zX0ZJWEVSUyA9IHJlZmFjdG9yLmdldF9maXhlcnNfZnJvbV9wYWNrYWdlKCJsaWIydG8zLmZpeGVzIikKKworY2xhc3MgVGVzdFJlZmFjdG9yaW5nVG9vbCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN5cy5wYXRoLmFwcGVuZChGSVhFUl9ESVIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wYXRoLnBvcCgpCisKKyAgICBkZWYgY2hlY2tfaW5zdGFuY2VzKHNlbGYsIGluc3RhbmNlcywgY2xhc3Nlcyk6CisgICAgICAgIGZvciBpbnN0LCBjbHMgaW4gemlwKGluc3RhbmNlcywgY2xhc3Nlcyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpbnN0LCBjbHMpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXMgYXJlIG5vdCBpbnN0YW5jZXMgb2YgJXMiICUgaW5zdGFuY2VzLCBjbGFzc2VzKQorCisgICAgZGVmIHJ0KHNlbGYsIG9wdGlvbnM9Tm9uZSwgZml4ZXJzPV9ERUZBVUxUX0ZJWEVSUywgZXhwbGljaXQ9Tm9uZSk6CisgICAgICAgIHJldHVybiByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2woZml4ZXJzLCBvcHRpb25zLCBleHBsaWNpdCkKKworICAgIGRlZiB0ZXN0X3ByaW50X2Z1bmN0aW9uX29wdGlvbihzZWxmKToKKyAgICAgICAgcnQgPSBzZWxmLnJ0KHsicHJpbnRfZnVuY3Rpb24iIDogVHJ1ZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydC5ncmFtbWFyIGlzIHB5Z3JhbS5weXRob25fZ3JhbW1hcl9ub19wcmludF9zdGF0ZW1lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydC5kcml2ZXIuZ3JhbW1hciBpcworICAgICAgICAgICAgICAgICAgICAgICAgcHlncmFtLnB5dGhvbl9ncmFtbWFyX25vX3ByaW50X3N0YXRlbWVudCkKKworICAgIGRlZiB0ZXN0X3dyaXRlX3VuY2hhbmdlZF9maWxlc19vcHRpb24oc2VsZik6CisgICAgICAgIHJ0ID0gc2VsZi5ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnQud3JpdGVfdW5jaGFuZ2VkX2ZpbGVzKQorICAgICAgICBydCA9IHNlbGYucnQoeyJ3cml0ZV91bmNoYW5nZWRfZmlsZXMiIDogVHJ1ZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydC53cml0ZV91bmNoYW5nZWRfZmlsZXMpCisKKyAgICBkZWYgdGVzdF9maXhlcl9sb2FkaW5nX2hlbHBlcnMoc2VsZik6CisgICAgICAgIGNvbnRlbnRzID0gWyJleHBsaWNpdCIsICJmaXJzdCIsICJsYXN0IiwgInBhcnJvdCIsICJwcmVvcmRlciJdCisgICAgICAgIG5vbl9wcmVmaXhlZCA9IHJlZmFjdG9yLmdldF9hbGxfZml4X25hbWVzKCJteWZpeGVzIikKKyAgICAgICAgcHJlZml4ZWQgPSByZWZhY3Rvci5nZXRfYWxsX2ZpeF9uYW1lcygibXlmaXhlcyIsIEZhbHNlKQorICAgICAgICBmdWxsX25hbWVzID0gcmVmYWN0b3IuZ2V0X2ZpeGVyc19mcm9tX3BhY2thZ2UoIm15Zml4ZXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZWZpeGVkLCBbImZpeF8iICsgbmFtZSBmb3IgbmFtZSBpbiBjb250ZW50c10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9uX3ByZWZpeGVkLCBjb250ZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdWxsX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsibXlmaXhlcy5maXhfIiArIG5hbWUgZm9yIG5hbWUgaW4gY29udGVudHNdKQorCisgICAgZGVmIHRlc3RfZGV0ZWN0X2Z1dHVyZV9mZWF0dXJlcyhzZWxmKToKKyAgICAgICAgcnVuID0gcmVmYWN0b3IuX2RldGVjdF9mdXR1cmVfZmVhdHVyZXMKKyAgICAgICAgZnMgPSBmcm96ZW5zZXQKKyAgICAgICAgZW1wdHkgPSBmcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKCIiKSwgZW1wdHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgZnMoKCJwcmludF9mdW5jdGlvbiIsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmcygoImdlbmVyYXRvcnMiLCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bigiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzLCBmZWF0dXJlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgZnMoKCJnZW5lcmF0b3JzIiwgImZlYXR1cmUiKSkpCisgICAgICAgIGlucCA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMsIHByaW50X2Z1bmN0aW9uIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihpbnApLCBmcygoImdlbmVyYXRvcnMiLCAicHJpbnRfZnVuY3Rpb24iKSkpCisgICAgICAgIGlucCA9ImZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24sIGdlbmVyYXRvcnMiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGZzKCgicHJpbnRfZnVuY3Rpb24iLCAiZ2VuZXJhdG9ycyIpKSkKKyAgICAgICAgaW5wID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgKHByaW50X2Z1bmN0aW9uLCkiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGZzKCgicHJpbnRfZnVuY3Rpb24iLCkpKQorICAgICAgICBpbnAgPSAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAoZ2VuZXJhdG9ycywgcHJpbnRfZnVuY3Rpb24pIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihpbnApLCBmcygoImdlbmVyYXRvcnMiLCAicHJpbnRfZnVuY3Rpb24iKSkpCisgICAgICAgIGlucCA9ICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChnZW5lcmF0b3JzLCBuZXN0ZWRfc2NvcGVzKSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZnMoKCJnZW5lcmF0b3JzIiwgIm5lc3RlZF9zY29wZXMiKSkpCisgICAgICAgIGlucCA9ICIiImZyb20gX19mdXR1cmVfXyBpbXBvcnQgZ2VuZXJhdG9ycworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihpbnApLCBmcygoImdlbmVyYXRvcnMiLCAicHJpbnRfZnVuY3Rpb24iKSkpCisgICAgICAgIGludmFsaWQgPSAoImZyb20iLAorICAgICAgICAgICAgICAgICAgICJmcm9tIDQiLAorICAgICAgICAgICAgICAgICAgICJmcm9tIHgiLAorICAgICAgICAgICAgICAgICAgICJmcm9tIHggNSIsCisgICAgICAgICAgICAgICAgICAgImZyb20geCBpbSIsCisgICAgICAgICAgICAgICAgICAgImZyb20geCBpbXBvcnQiLAorICAgICAgICAgICAgICAgICAgICJmcm9tIHggaW1wb3J0IDQiLAorICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgZm9yIGlucCBpbiBpbnZhbGlkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZW1wdHkpCisgICAgICAgIGlucCA9ICInZG9jc3RyaW5nJ1xuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZnMoKCJwcmludF9mdW5jdGlvbiIsKSkpCisgICAgICAgIGlucCA9ICInZG9jc3RyaW5nJ1xuJ3NvbW5nJ1xuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZW1wdHkpCisgICAgICAgIGlucCA9ICIjIGNvbW1lbnRcbmZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKGlucCksIGZzKCgicHJpbnRfZnVuY3Rpb24iLCkpKQorICAgICAgICBpbnAgPSAiIyBjb21tZW50XG4nZG9jJ1xuZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW4oaW5wKSwgZnMoKCJwcmludF9mdW5jdGlvbiIsKSkpCisgICAgICAgIGlucCA9ICJjbGFzcyB4OiBwYXNzXG5mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bihpbnApLCBlbXB0eSkKKworICAgIGRlZiB0ZXN0X2dldF9oZWFkbm9kZV9kaWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBOb25lRml4KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgRmlsZUlucHV0Rml4KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgICAgICAgICBQQVRURVJOID0gImZpbGVfaW5wdXQ8IGFueSAqID4iCisKKyAgICAgICAgY2xhc3MgU2ltcGxlRml4KGZpeGVyX2Jhc2UuQmFzZUZpeCk6CisgICAgICAgICAgICBQQVRURVJOID0gIiduYW1lJyIKKworICAgICAgICBub19oZWFkID0gTm9uZUZpeCh7fSwgW10pCisgICAgICAgIHdpdGhfaGVhZCA9IEZpbGVJbnB1dEZpeCh7fSwgW10pCisgICAgICAgIHNpbXBsZSA9IFNpbXBsZUZpeCh7fSwgW10pCisgICAgICAgIGQgPSByZWZhY3Rvci5fZ2V0X2hlYWRub2RlX2RpY3QoW25vX2hlYWQsIHdpdGhfaGVhZCwgc2ltcGxlXSkKKyAgICAgICAgdG9wX2ZpeGVzID0gZC5wb3AocHlncmFtLnB5dGhvbl9zeW1ib2xzLmZpbGVfaW5wdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9wX2ZpeGVzLCBbd2l0aF9oZWFkLCBub19oZWFkXSkKKyAgICAgICAgbmFtZV9maXhlcyA9IGQucG9wKHRva2VuLk5BTUUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZV9maXhlcywgW3NpbXBsZSwgbm9faGVhZF0pCisgICAgICAgIGZvciBmaXhlcyBpbiBkLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZXMsIFtub19oZWFkXSkKKworICAgIGRlZiB0ZXN0X2ZpeGVyX2xvYWRpbmcoc2VsZik6CisgICAgICAgIGZyb20gbXlmaXhlcy5maXhfZmlyc3QgaW1wb3J0IEZpeEZpcnN0CisgICAgICAgIGZyb20gbXlmaXhlcy5maXhfbGFzdCBpbXBvcnQgRml4TGFzdAorICAgICAgICBmcm9tIG15Zml4ZXMuZml4X3BhcnJvdCBpbXBvcnQgRml4UGFycm90CisgICAgICAgIGZyb20gbXlmaXhlcy5maXhfcHJlb3JkZXIgaW1wb3J0IEZpeFByZW9yZGVyCisKKyAgICAgICAgcnQgPSBzZWxmLnJ0KCkKKyAgICAgICAgcHJlLCBwb3N0ID0gcnQuZ2V0X2ZpeGVycygpCisKKyAgICAgICAgc2VsZi5jaGVja19pbnN0YW5jZXMocHJlLCBbRml4UHJlb3JkZXJdKQorICAgICAgICBzZWxmLmNoZWNrX2luc3RhbmNlcyhwb3N0LCBbRml4Rmlyc3QsIEZpeFBhcnJvdCwgRml4TGFzdF0pCisKKyAgICBkZWYgdGVzdF9uYXVnaHR5X2ZpeGVycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIHNlbGYucnQsIGZpeGVycz1bIm5vdF9oZXJlIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlZmFjdG9yLkZpeGVyRXJyb3IsIHNlbGYucnQsIGZpeGVycz1bIm5vX2ZpeGVyX2NscyJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZWZhY3Rvci5GaXhlckVycm9yLCBzZWxmLnJ0LCBmaXhlcnM9WyJiYWRfb3JkZXIiXSkKKworICAgIGRlZiB0ZXN0X3JlZmFjdG9yX3N0cmluZyhzZWxmKToKKyAgICAgICAgcnQgPSBzZWxmLnJ0KCkKKyAgICAgICAgaW5wdXQgPSAiZGVmIHBhcnJvdCgpOiBwYXNzXG5cbiIKKyAgICAgICAgdHJlZSA9IHJ0LnJlZmFjdG9yX3N0cmluZyhpbnB1dCwgIjx0ZXN0PiIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3RyKHRyZWUpLCBpbnB1dCkKKworICAgICAgICBpbnB1dCA9ICJkZWYgZigpOiBwYXNzXG5cbiIKKyAgICAgICAgdHJlZSA9IHJ0LnJlZmFjdG9yX3N0cmluZyhpbnB1dCwgIjx0ZXN0PiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHRyZWUpLCBpbnB1dCkKKworICAgIGRlZiB0ZXN0X3JlZmFjdG9yX3N0ZGluKHNlbGYpOgorCisgICAgICAgIGNsYXNzIE15UlQocmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sKToKKworICAgICAgICAgICAgZGVmIHByaW50X291dHB1dChzZWxmLCBvbGRfdGV4dCwgbmV3X3RleHQsIGZpbGVuYW1lLCBlcXVhbCk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5leHRlbmQoW29sZF90ZXh0LCBuZXdfdGV4dCwgZmlsZW5hbWUsIGVxdWFsXSkKKworICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgcnQgPSBNeVJUKF9ERUZBVUxUX0ZJWEVSUykKKyAgICAgICAgc2F2ZSA9IHN5cy5zdGRpbgorICAgICAgICBzeXMuc3RkaW4gPSBTdHJpbmdJTy5TdHJpbmdJTygiZGVmIHBhcnJvdCgpOiBwYXNzXG5cbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ0LnJlZmFjdG9yX3N0ZGluKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IHNhdmUKKyAgICAgICAgZXhwZWN0ZWQgPSBbImRlZiBwYXJyb3QoKTogcGFzc1xuXG4iLAorICAgICAgICAgICAgICAgICAgICAiZGVmIGNoZWVzZSgpOiBwYXNzXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICI8c3RkaW4+IiwgRmFsc2VdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0cywgZXhwZWN0ZWQpCisKKyAgICBkZWYgY2hlY2tfZmlsZV9yZWZhY3RvcmluZyhzZWxmLCB0ZXN0X2ZpbGUsIGZpeGVycz1fMlRPM19GSVhFUlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1Ob25lLCBtb2NrX2xvZ19kZWJ1Zz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5X3dyaXRlPVRydWUpOgorICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0iMnRvMy10ZXN0X3JlZmFjdG9yIikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNodXRpbC5ybXRyZWUsIHRtcGRpcikKKyAgICAgICAgIyBtYWtlIGEgY29weSBvZiB0aGUgdGVzdGVkIGZpbGUgdGhhdCB3ZSBjYW4gd3JpdGUgdG8KKyAgICAgICAgc2h1dGlsLmNvcHkodGVzdF9maWxlLCB0bXBkaXIpCisgICAgICAgIHRlc3RfZmlsZSA9IG9zLnBhdGguam9pbih0bXBkaXIsIG9zLnBhdGguYmFzZW5hbWUodGVzdF9maWxlKSkKKyAgICAgICAgb3MuY2htb2QodGVzdF9maWxlLCAwbzY0NCkKKworICAgICAgICBkZWYgcmVhZF9maWxlKCk6CisgICAgICAgICAgICB3aXRoIG9wZW4odGVzdF9maWxlLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZnAucmVhZCgpCisKKyAgICAgICAgb2xkX2NvbnRlbnRzID0gcmVhZF9maWxlKCkKKyAgICAgICAgcnQgPSBzZWxmLnJ0KGZpeGVycz1maXhlcnMsIG9wdGlvbnM9b3B0aW9ucykKKyAgICAgICAgaWYgbW9ja19sb2dfZGVidWc6CisgICAgICAgICAgICBydC5sb2dfZGVidWcgPSBtb2NrX2xvZ19kZWJ1ZworCisgICAgICAgIHJ0LnJlZmFjdG9yX2ZpbGUodGVzdF9maWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9sZF9jb250ZW50cywgcmVhZF9maWxlKCkpCisKKyAgICAgICAgaWYgbm90IGFjdHVhbGx5X3dyaXRlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJ0LnJlZmFjdG9yX2ZpbGUodGVzdF9maWxlLCBUcnVlKQorICAgICAgICBuZXdfY29udGVudHMgPSByZWFkX2ZpbGUoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9sZF9jb250ZW50cywgbmV3X2NvbnRlbnRzKQorICAgICAgICByZXR1cm4gbmV3X2NvbnRlbnRzCisKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9maWxlKHNlbGYpOgorICAgICAgICB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oRklYRVJfRElSLCAicGFycm90X2V4YW1wbGUucHkiKQorICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcodGVzdF9maWxlLCBfREVGQVVMVF9GSVhFUlMpCisKKyAgICBkZWYgdGVzdF9yZWZhY3Rvcl9maWxlX3dyaXRlX3VuY2hhbmdlZF9maWxlKHNlbGYpOgorICAgICAgICB0ZXN0X2ZpbGUgPSBvcy5wYXRoLmpvaW4oRklYRVJfRElSLCAicGFycm90X2V4YW1wbGUucHkiKQorICAgICAgICBkZWJ1Z19tZXNzYWdlcyA9IFtdCisgICAgICAgIGRlZiByZWNvcmRpbmdfbG9nX2RlYnVnKG1zZywgKmFyZ3MpOgorICAgICAgICAgICAgZGVidWdfbWVzc2FnZXMuYXBwZW5kKG1zZyAlIGFyZ3MpCisgICAgICAgIHNlbGYuY2hlY2tfZmlsZV9yZWZhY3RvcmluZyh0ZXN0X2ZpbGUsIGZpeGVycz0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9eyJ3cml0ZV91bmNoYW5nZWRfZmlsZXMiOiBUcnVlfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2tfbG9nX2RlYnVnPXJlY29yZGluZ19sb2dfZGVidWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxseV93cml0ZT1GYWxzZSkKKyAgICAgICAgIyBUZXN0aW5nIHRoYXQgaXQgbG9nZ2VkIHRoaXMgbWVzc2FnZSB3aGVuIHdyaXRlPUZhbHNlIHdhcyBwYXNzZWQgaXMKKyAgICAgICAgIyBzdWZmaWNpZW50IHRvIHNlZSB0aGF0IGl0IGRpZCBub3QgYmFpbCBlYXJseSBhZnRlciAiTm8gY2hhbmdlcyIuCisgICAgICAgIG1lc3NhZ2VfcmVnZXggPSByIk5vdCB3cml0aW5nIGNoYW5nZXMgdG8gLiolcyVzIiAlICgKKyAgICAgICAgICAgICAgICBvcy5zZXAsIG9zLnBhdGguYmFzZW5hbWUodGVzdF9maWxlKSkKKyAgICAgICAgZm9yIG1lc3NhZ2UgaW4gZGVidWdfbWVzc2FnZXM6CisgICAgICAgICAgICBpZiAiTm90IHdyaXRpbmcgY2hhbmdlcyIgaW4gbWVzc2FnZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMobWVzc2FnZSwgbWVzc2FnZV9yZWdleCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIlciBub3QgbWF0Y2hlZCBpbiAlciIgJSAobWVzc2FnZV9yZWdleCwgZGVidWdfbWVzc2FnZXMpKQorCisgICAgZGVmIHRlc3RfcmVmYWN0b3JfZGlyKHNlbGYpOgorICAgICAgICBkZWYgY2hlY2soc3RydWN0dXJlLCBleHBlY3RlZCk6CisgICAgICAgICAgICBkZWYgbW9ja19yZWZhY3Rvcl9maWxlKHNlbGYsIGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBnb3QuYXBwZW5kKGYpCisgICAgICAgICAgICBzYXZlX2Z1bmMgPSByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2wucmVmYWN0b3JfZmlsZQorICAgICAgICAgICAgcmVmYWN0b3IuUmVmYWN0b3JpbmdUb29sLnJlZmFjdG9yX2ZpbGUgPSBtb2NrX3JlZmFjdG9yX2ZpbGUKKyAgICAgICAgICAgIHJ0ID0gc2VsZi5ydCgpCisgICAgICAgICAgICBnb3QgPSBbXQorICAgICAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9IjJ0bzMtdGVzdF9yZWZhY3RvciIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKGRpciwgImFfZGlyIikpCisgICAgICAgICAgICAgICAgZm9yIGZuIGluIHN0cnVjdHVyZToKKyAgICAgICAgICAgICAgICAgICAgb3Blbihvcy5wYXRoLmpvaW4oZGlyLCBmbiksICJ3YiIpLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBydC5yZWZhY3Rvcl9kaXIoZGlyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICByZWZhY3Rvci5SZWZhY3RvcmluZ1Rvb2wucmVmYWN0b3JfZmlsZSA9IHNhdmVfZnVuYworICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZGlyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcy5wYXRoLmpvaW4oZGlyLCBwYXRoKSBmb3IgcGF0aCBpbiBleHBlY3RlZF0pCisgICAgICAgIGNoZWNrKFtdLCBbXSkKKyAgICAgICAgdHJlZSA9IFsibm90aGluZyIsCisgICAgICAgICAgICAgICAgImhpLnB5IiwKKyAgICAgICAgICAgICAgICAiLmR1bWIiLAorICAgICAgICAgICAgICAgICIuYWZ0ZXIucHkiLAorICAgICAgICAgICAgICAgICJub3RweS5ucHkiLAorICAgICAgICAgICAgICAgICJzYXBweSJdCisgICAgICAgIGV4cGVjdGVkID0gWyJoaS5weSJdCisgICAgICAgIGNoZWNrKHRyZWUsIGV4cGVjdGVkKQorICAgICAgICB0cmVlID0gWyJoaS5weSIsCisgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKCJhX2RpciIsICJzdHVmZi5weSIpXQorICAgICAgICBjaGVjayh0cmVlLCB0cmVlKQorCisgICAgZGVmIHRlc3RfZmlsZV9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImRpZmZlcmVudF9lbmNvZGluZy5weSIpCisgICAgICAgIHNlbGYuY2hlY2tfZmlsZV9yZWZhY3RvcmluZyhmbikKKworICAgIGRlZiB0ZXN0X2JvbShzZWxmKToKKyAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImJvbS5weSIpCisgICAgICAgIGRhdGEgPSBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcoZm4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhLnN0YXJ0c3dpdGgoY29kZWNzLkJPTV9VVEY4KSkKKworICAgIGRlZiB0ZXN0X2NybGZfbmV3bGluZXMoc2VsZik6CisgICAgICAgIG9sZF9zZXAgPSBvcy5saW5lc2VwCisgICAgICAgIG9zLmxpbmVzZXAgPSAiXHJcbiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oVEVTVF9EQVRBX0RJUiwgImNybGYucHkiKQorICAgICAgICAgICAgZml4ZXMgPSByZWZhY3Rvci5nZXRfZml4ZXJzX2Zyb21fcGFja2FnZSgibGliMnRvMy5maXhlcyIpCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ZpbGVfcmVmYWN0b3JpbmcoZm4sIGZpeGVzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MubGluZXNlcCA9IG9sZF9zZXAKKworICAgIGRlZiB0ZXN0X3JlZmFjdG9yX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgcnQgPSBzZWxmLnJ0KCkKKworICAgICAgICBkb2MgPSAiIiIKKz4+PiBleGFtcGxlKCkKKzQyCisiIiIKKyAgICAgICAgb3V0ID0gcnQucmVmYWN0b3JfZG9jc3RyaW5nKGRvYywgIjx0ZXN0PiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBkb2MpCisKKyAgICAgICAgZG9jID0gIiIiCis+Pj4gZGVmIHBhcnJvdCgpOgorLi4uICAgICAgcmV0dXJuIDQzCisiIiIKKyAgICAgICAgb3V0ID0gcnQucmVmYWN0b3JfZG9jc3RyaW5nKGRvYywgIjx0ZXN0PiIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob3V0LCBkb2MpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdChzZWxmKToKKyAgICAgICAgZnJvbSBteWZpeGVzLmZpeF9leHBsaWNpdCBpbXBvcnQgRml4RXhwbGljaXQKKworICAgICAgICBydCA9IHNlbGYucnQoZml4ZXJzPVsibXlmaXhlcy5maXhfZXhwbGljaXQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocnQucG9zdF9vcmRlciksIDApCisKKyAgICAgICAgcnQgPSBzZWxmLnJ0KGV4cGxpY2l0PVsibXlmaXhlcy5maXhfZXhwbGljaXQiXSkKKyAgICAgICAgZm9yIGZpeCBpbiBydC5wb3N0X29yZGVyOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShmaXgsIEZpeEV4cGxpY2l0KToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBsaWNpdCBmaXhlciBub3QgbG9hZGVkIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5YyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UzZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5byBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3JlZmFjdG9yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UzZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfcmVmYWN0b3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHkgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWI4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpYjJ0bzMvdGVzdHMvdGVzdF91dGlsLnB5CkBAIC0wLDAgKzEsNTk0IEBACisiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGNvZGUgaW4gZml4ZXJfdXRpbCAiIiIKKworIyBUZXN0aW5nIGltcG9ydHMKK2Zyb20gLiBpbXBvcnQgc3VwcG9ydAorCisjIFB5dGhvbiBpbXBvcnRzCitpbXBvcnQgb3MucGF0aAorCisjIExvY2FsIGltcG9ydHMKK2Zyb20gbGliMnRvMy5weXRyZWUgaW1wb3J0IE5vZGUsIExlYWYKK2Zyb20gbGliMnRvMyBpbXBvcnQgZml4ZXJfdXRpbAorZnJvbSBsaWIydG8zLmZpeGVyX3V0aWwgaW1wb3J0IEF0dHIsIE5hbWUsIENhbGwsIENvbW1hCitmcm9tIGxpYjJ0bzMucGdlbjIgaW1wb3J0IHRva2VuCisKK2RlZiBwYXJzZShjb2RlLCBzdHJpcF9sZXZlbHM9MCk6CisgICAgIyBUaGUgdG9wbW9zdCBub2RlIGlzIGZpbGVfaW5wdXQsIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQuCisgICAgIyBUaGUgbmV4dC10b3Btb3N0IG5vZGUgaXMgYSAqX3N0bXQgbm9kZSwgd2hpY2ggd2UgYWxzbyBkb24ndCBjYXJlIGFib3V0CisgICAgdHJlZSA9IHN1cHBvcnQucGFyc2Vfc3RyaW5nKGNvZGUpCisgICAgZm9yIGkgaW4gcmFuZ2Uoc3RyaXBfbGV2ZWxzKToKKyAgICAgICAgdHJlZSA9IHRyZWUuY2hpbGRyZW5bMF0KKyAgICB0cmVlLnBhcmVudCA9IE5vbmUKKyAgICByZXR1cm4gdHJlZQorCitjbGFzcyBNYWNyb1Rlc3RDYXNlKHN1cHBvcnQuVGVzdENhc2UpOgorICAgIGRlZiBhc3NlcnRTdHIoc2VsZiwgbm9kZSwgc3RyaW5nKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShub2RlLCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgICAgIG5vZGUgPSBOb2RlKGZpeGVyX3V0aWwuc3ltcy5zaW1wbGVfc3RtdCwgbm9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobm9kZSksIHN0cmluZykKKworCitjbGFzcyBUZXN0X2lzX3R1cGxlKHN1cHBvcnQuVGVzdENhc2UpOgorICAgIGRlZiBpc190dXBsZShzZWxmLCBzdHJpbmcpOgorICAgICAgICByZXR1cm4gZml4ZXJfdXRpbC5pc190dXBsZShwYXJzZShzdHJpbmcsIHN0cmlwX2xldmVscz0yKSkKKworICAgIGRlZiB0ZXN0X3ZhbGlkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc190dXBsZSgiKGEsIGIpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX3R1cGxlKCIoYSwgKGIsIGMpKSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc190dXBsZSgiKChhLCAoYiwgYykpLCkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfdHVwbGUoIihhLCkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfdHVwbGUoIigpIikpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaXNfdHVwbGUoIihhKSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaXNfdHVwbGUoIignZm9vJykgJSAoYiwgYykiKSkKKworCitjbGFzcyBUZXN0X2lzX2xpc3Qoc3VwcG9ydC5UZXN0Q2FzZSk6CisgICAgZGVmIGlzX2xpc3Qoc2VsZiwgc3RyaW5nKToKKyAgICAgICAgcmV0dXJuIGZpeGVyX3V0aWwuaXNfbGlzdChwYXJzZShzdHJpbmcsIHN0cmlwX2xldmVscz0yKSkKKworICAgIGRlZiB0ZXN0X3ZhbGlkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19saXN0KCJbXSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pc19saXN0KCJbYV0iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaXNfbGlzdCgiW2EsIGJdIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2xpc3QoIlthLCBbYiwgY11dIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmlzX2xpc3QoIltbYSwgW2IsIGNdXSxdIikpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuaXNfbGlzdCgiW10rW10iKSkKKworCitjbGFzcyBUZXN0X0F0dHIoTWFjcm9UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGNhbGwgPSBwYXJzZSgiZm9vKCkiLCBzdHJpcF9sZXZlbHM9MikKKworICAgICAgICBzZWxmLmFzc2VydFN0cihBdHRyKE5hbWUoImEiKSwgTmFtZSgiYiIpKSwgImEuYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RyKEF0dHIoY2FsbCwgTmFtZSgiYiIpKSwgImZvbygpLmIiKQorCisgICAgZGVmIHRlc3RfcmV0dXJucyhzZWxmKToKKyAgICAgICAgYXR0ciA9IEF0dHIoTmFtZSgiYSIpLCBOYW1lKCJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhdHRyKSwgbGlzdCkKKworCitjbGFzcyBUZXN0X05hbWUoTWFjcm9UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U3RyKE5hbWUoImEiKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydFN0cihOYW1lKCJmb28uZm9vKCkuYmFyIiksICJmb28uZm9vKCkuYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoTmFtZSgiYSIsIHByZWZpeD0iYiIpLCAiYmEiKQorCisKK2NsYXNzIFRlc3RfQ2FsbChNYWNyb1Rlc3RDYXNlKToKKyAgICBkZWYgX0NhbGwoc2VsZiwgbmFtZSwgYXJncz1Ob25lLCBwcmVmaXg9Tm9uZSk6CisgICAgICAgICIiIkhlbHAgdGhlIG5leHQgdGVzdCIiIgorICAgICAgICBjaGlsZHJlbiA9IFtdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgbGlzdCk6CisgICAgICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKGFyZykKKyAgICAgICAgICAgICAgICBjaGlsZHJlbi5hcHBlbmQoQ29tbWEoKSkKKyAgICAgICAgICAgIGNoaWxkcmVuLnBvcCgpCisgICAgICAgIHJldHVybiBDYWxsKE5hbWUobmFtZSksIGNoaWxkcmVuLCBwcmVmaXgpCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAga2lkcyA9IFtOb25lLAorICAgICAgICAgICAgICAgIFtMZWFmKHRva2VuLk5VTUJFUiwgMSksIExlYWYodG9rZW4uTlVNQkVSLCAyKSwKKyAgICAgICAgICAgICAgICAgTGVhZih0b2tlbi5OVU1CRVIsIDMpXSwKKyAgICAgICAgICAgICAgICBbTGVhZih0b2tlbi5OVU1CRVIsIDEpLCBMZWFmKHRva2VuLk5VTUJFUiwgMyksCisgICAgICAgICAgICAgICAgIExlYWYodG9rZW4uTlVNQkVSLCAyKSwgTGVhZih0b2tlbi5OVU1CRVIsIDQpXSwKKyAgICAgICAgICAgICAgICBbTGVhZih0b2tlbi5TVFJJTkcsICJiIiksIExlYWYodG9rZW4uU1RSSU5HLCAiaiIsIHByZWZpeD0iICIpXQorICAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiQSIpLCAiQSgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiYiIsIGtpZHNbMV0pLCAiYigxLDIsMykiKQorICAgICAgICBzZWxmLmFzc2VydFN0cihzZWxmLl9DYWxsKCJhLmIoKS5jIiwga2lkc1syXSksICJhLmIoKS5jKDEsMywyLDQpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHIoc2VsZi5fQ2FsbCgiZCIsIGtpZHNbM10sIHByZWZpeD0iICIpLCAiIGQoYiwgaikiKQorCisKK2NsYXNzIFRlc3RfZG9lc190cmVlX2ltcG9ydChzdXBwb3J0LlRlc3RDYXNlKToKKyAgICBkZWYgX2ZpbmRfYmluZF9yZWMoc2VsZiwgbmFtZSwgbm9kZSk6CisgICAgICAgICMgU2VhcmNoIGEgdHJlZSBmb3IgYSBiaW5kaW5nIC0tIHVzZWQgdG8gZmluZCB0aGUgc3RhcnRpbmcKKyAgICAgICAgIyBwb2ludCBmb3IgdGhlc2UgdGVzdHMuCisgICAgICAgIGMgPSBmaXhlcl91dGlsLmZpbmRfYmluZGluZyhuYW1lLCBub2RlKQorICAgICAgICBpZiBjOiByZXR1cm4gYworICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZHJlbjoKKyAgICAgICAgICAgIGMgPSBzZWxmLl9maW5kX2JpbmRfcmVjKG5hbWUsIGNoaWxkKQorICAgICAgICAgICAgaWYgYzogcmV0dXJuIGMKKworICAgIGRlZiBkb2VzX3RyZWVfaW1wb3J0KHNlbGYsIHBhY2thZ2UsIG5hbWUsIHN0cmluZyk6CisgICAgICAgIG5vZGUgPSBwYXJzZShzdHJpbmcpCisgICAgICAgICMgRmluZCB0aGUgYmluZGluZyBvZiBzdGFydCAtLSB0aGF0J3Mgd2hhdCB3ZSdsbCBnbyBmcm9tCisgICAgICAgIG5vZGUgPSBzZWxmLl9maW5kX2JpbmRfcmVjKCdzdGFydCcsIG5vZGUpCisgICAgICAgIHJldHVybiBmaXhlcl91dGlsLmRvZXNfdHJlZV9pbXBvcnQocGFja2FnZSwgbmFtZSwgbm9kZSkKKworICAgIGRlZiB0cnlfd2l0aChzZWxmLCBzdHJpbmcpOgorICAgICAgICBmYWlsaW5nX3Rlc3RzID0gKCgiYSIsICJhIiwgImZyb20gYSBpbXBvcnQgYiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgiYS5kIiwgImEiLCAiZnJvbSBhLmQgaW1wb3J0IGIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoImQuYSIsICJhIiwgImZyb20gZC5hIGltcG9ydCBiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICJhIiwgImltcG9ydCBiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICJhIiwgImltcG9ydCBiLCBjLCBkIikpCisgICAgICAgIGZvciBwYWNrYWdlLCBuYW1lLCBpbXBvcnRfIGluIGZhaWxpbmdfdGVzdHM6CisgICAgICAgICAgICBuID0gc2VsZi5kb2VzX3RyZWVfaW1wb3J0KHBhY2thZ2UsIG5hbWUsIGltcG9ydF8gKyAiXG4iICsgc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuKQorICAgICAgICAgICAgbiA9IHNlbGYuZG9lc190cmVlX2ltcG9ydChwYWNrYWdlLCBuYW1lLCBzdHJpbmcgKyAiXG4iICsgaW1wb3J0XykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobikKKworICAgICAgICBwYXNzaW5nX3Rlc3RzID0gKCgiYSIsICJhIiwgImZyb20gYSBpbXBvcnQgYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgieCIsICJhIiwgImZyb20geCBpbXBvcnQgYSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgieCIsICJhIiwgImZyb20geCBpbXBvcnQgYiwgYywgYSwgZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgieC5iIiwgImEiLCAiZnJvbSB4LmIgaW1wb3J0IGEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInguYiIsICJhIiwgImZyb20geC5iIGltcG9ydCBiLCBjLCBhLCBkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICJhIiwgImltcG9ydCBhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICJhIiwgImltcG9ydCBiLCBjLCBhLCBkIikpCisgICAgICAgIGZvciBwYWNrYWdlLCBuYW1lLCBpbXBvcnRfIGluIHBhc3NpbmdfdGVzdHM6CisgICAgICAgICAgICBuID0gc2VsZi5kb2VzX3RyZWVfaW1wb3J0KHBhY2thZ2UsIG5hbWUsIGltcG9ydF8gKyAiXG4iICsgc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4pCisgICAgICAgICAgICBuID0gc2VsZi5kb2VzX3RyZWVfaW1wb3J0KHBhY2thZ2UsIG5hbWUsIHN0cmluZyArICJcbiIgKyBpbXBvcnRfKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4pCisKKyAgICBkZWYgdGVzdF9pbl9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi50cnlfd2l0aCgiZGVmIGZvbygpOlxuXHRiYXIuYmF6KClcblx0c3RhcnQ9MyIpCisKK2NsYXNzIFRlc3RfZmluZF9iaW5kaW5nKHN1cHBvcnQuVGVzdENhc2UpOgorICAgIGRlZiBmaW5kX2JpbmRpbmcoc2VsZiwgbmFtZSwgc3RyaW5nLCBwYWNrYWdlPU5vbmUpOgorICAgICAgICByZXR1cm4gZml4ZXJfdXRpbC5maW5kX2JpbmRpbmcobmFtZSwgcGFyc2Uoc3RyaW5nKSwgcGFja2FnZSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiYSA9IGIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImEgPSBbYiwgYywgZF0iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImEgPSBmb28oKSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiYSA9IGZvbygpLmZvby5mb29bNl1bZm9vXSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvbyA9IGEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb28gPSAoYSwgYiwgYykiKSkKKworICAgIGRlZiB0ZXN0X3R1cGxlX2Fzc2lnbm1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICIoYSwpID0gYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiKGEsIGIsIGMpID0gW2IsIGMsIGRdIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICIoYywgKGQsIGEpLCBiKSA9IGZvbygpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICIoYSwgYikgPSBmb28oKS5mb29bNl1bZm9vXSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIihmb28sIGIpID0gKGIsIGEpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiKGZvbywgKGIsIGMpKSA9IChhLCBiLCBjKSIpKQorCisgICAgZGVmIHRlc3RfbGlzdF9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiW2FdID0gYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiW2EsIGIsIGNdID0gW2IsIGMsIGRdIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJbYywgW2QsIGFdLCBiXSA9IGZvbygpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJbYSwgYl0gPSBmb28oKS5mb29bYV1bZm9vXSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIltmb28sIGJdID0gKGIsIGEpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiW2ZvbywgW2IsIGNdXSA9IChhLCBiLCBjKSIpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hc3NpZ25tZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb28uYSA9IDUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb29bYV0gPSA1IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZm9vKGEpID0gNSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvbyhhLCBiKSA9IDUiKSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9pbXBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiaW1wb3J0IGIsIGMsIGEsIGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImltcG9ydCBiLCBjLCBkIikpCisKKyAgICBkZWYgdGVzdF9mcm9tX2ltcG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geCBpbXBvcnQgYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBhIGltcG9ydCBhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0IGIsIGMsIGEsIGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geC5iIGltcG9ydCBhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgYiwgYywgYSwgZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYSBpbXBvcnQgYiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYS5kIGltcG9ydCBiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBkLmEgaW1wb3J0IGIiKSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9hcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImltcG9ydCBiIGFzIGEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImltcG9ydCBiIGFzIGEsIGMsIGEgYXMgZiwgZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImltcG9ydCBhIGFzIGYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYiwgYyBhcyBmLCBkIGFzIGUiKSkKKworICAgIGRlZiB0ZXN0X2Zyb21faW1wb3J0X2FzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4IGltcG9ydCBiIGFzIGEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geCBpbXBvcnQgZyBhcyBhLCBkIGFzIGIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geC5iIGltcG9ydCB0IGFzIGEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geC5iIGltcG9ydCBnIGFzIGEsIGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGEgaW1wb3J0IGIgYXMgdCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYS5kIGltcG9ydCBiIGFzIHQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGQuYSBpbXBvcnQgYiBhcyB0IikpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfaW1wb3J0X3dpdGhfcGFja2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJiIiwgImltcG9ydCBiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYiIsICJpbXBvcnQgYiwgYywgZCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJiIiwgImltcG9ydCBiIiwgImIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYiIsICJpbXBvcnQgYiwgYywgZCIsICJjIikpCisKKyAgICBkZWYgdGVzdF9mcm9tX2ltcG9ydF93aXRoX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0IGEiLCAieCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBhIGltcG9ydCBhIiwgImEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geCBpbXBvcnQgKiIsICJ4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0IGIsIGMsIGEsIGQiLCAieCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4LmIgaW1wb3J0IGEiLCAieC5iIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgKiIsICJ4LmIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geC5iIGltcG9ydCBiLCBjLCBhLCBkIiwgInguYiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYSBpbXBvcnQgYiIsICJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBhLmQgaW1wb3J0IGIiLCAiYS5kIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBkLmEgaW1wb3J0IGIiLCAiYS5kIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSB4LnkgaW1wb3J0ICoiLCAiYS5iIikpCisKKyAgICBkZWYgdGVzdF9pbXBvcnRfYXNfd2l0aF9wYWNrYWdlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImltcG9ydCBiLmMgYXMgYSIsICJiLmMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYSBhcyBmIiwgImYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpbXBvcnQgYSBhcyBmIiwgImEiKSkKKworICAgIGRlZiB0ZXN0X2Zyb21faW1wb3J0X2FzX3dpdGhfcGFja2FnZShzZWxmKToKKyAgICAgICAgIyBCZWNhdXNlIGl0IHdvdWxkIHRha2UgYSBsb3Qgb2Ygc3BlY2lhbC1jYXNlIGNvZGUgaW4gdGhlIGZpeGVycworICAgICAgICAjIHRvIGRlYWwgd2l0aCBmcm9tIGZvbyBpbXBvcnQgYmFyIGFzIGJheiwgd2UnbGwgc2ltcGx5IGFsd2F5cworICAgICAgICAjIGZhaWwgaWYgdGhlcmUgaXMgYW4gImZyb20gLi4uIGltcG9ydCAuLi4gYXMgLi4uIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geCBpbXBvcnQgYiBhcyBhIiwgIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHggaW1wb3J0IGcgYXMgYSwgZCBhcyBiIiwgIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIHguYiBpbXBvcnQgdCBhcyBhIiwgInguYiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20geC5iIGltcG9ydCBnIGFzIGEsIGQiLCAieC5iIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZnJvbSBhIGltcG9ydCBiIGFzIHQiLCAiYSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZyb20gYSBpbXBvcnQgYiBhcyB0IiwgImIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmcm9tIGEgaW1wb3J0IGIgYXMgdCIsICJ0IikpCisKKyAgICBkZWYgdGVzdF9mdW5jdGlvbl9kZWYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJkZWYgYSgpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJkZWYgYShiLCBjLCBkKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZGVmIGEoKTogYiA9IDciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJkZWYgZChiLCAoYywgYSksIGUpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZGVmIGQoYT03KTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImRlZiBkKGEpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZGVmIGQoKTogYSA9IDciKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBkZWYgZCgpOgorICAgICAgICAgICAgICAgIGRlZiBhKCk6CisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgZGVmIHRlc3RfY2xhc3NfZGVmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgYTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgYSgpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJjbGFzcyBhKGIpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJjbGFzcyBhKGIsIGM9OCk6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJjbGFzcyBkOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgZChhKTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImNsYXNzIGQoYiwgYT03KTogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImNsYXNzIGQoYiwgKmEpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgZChiLCAqKmEpOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiY2xhc3MgZDogYSA9IDciKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBjbGFzcyBkKCk6CisgICAgICAgICAgICAgICAgY2xhc3MgYSgpOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgIGRlZiB0ZXN0X2ZvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvciBhIGluIHI6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvciBhLCBiIGluIHI6IHBhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvciAoYSwgYikgaW4gcjogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZm9yIGMsIChhLCkgaW4gcjogcGFzcyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAiZm9yIGMsIChhLCBiKSBpbiByOiBwYXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJmb3IgYyBpbiByOiBhID0gYyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImZvciBjIGluIGE6IHBhc3MiKSkKKworICAgIGRlZiB0ZXN0X2Zvcl9uZXN0ZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBiIGluIHI6CisgICAgICAgICAgICAgICAgZm9yIGEgaW4gYjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcyIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmb3IgYiBpbiByOgorICAgICAgICAgICAgICAgIGZvciBhLCBjIGluIGI6CisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZm9yIGIgaW4gcjoKKyAgICAgICAgICAgICAgICBmb3IgKGEsIGMpIGluIGI6CisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZm9yIGIgaW4gcjoKKyAgICAgICAgICAgICAgICBmb3IgKGEsKSBpbiBiOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBiIGluIHI6CisgICAgICAgICAgICAgICAgZm9yIGMsIChhLCBkKSBpbiBiOgorICAgICAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGZvciBiIGluIHI6CisgICAgICAgICAgICAgICAgZm9yIGMgaW4gYjoKKyAgICAgICAgICAgICAgICAgICAgYSA9IDciIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZm9yIGIgaW4gcjoKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBiOgorICAgICAgICAgICAgICAgICAgICBkID0gYSIiIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZm9yIGIgaW4gcjoKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBhOgorICAgICAgICAgICAgICAgICAgICBkID0gNyIiIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICBkZWYgdGVzdF9pZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgImlmIGIgaW4gcjogYSA9IGMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsICJpZiBhIGluIHI6IGQgPSBlIikpCisKKyAgICBkZWYgdGVzdF9pZl9uZXN0ZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGlmIGIgaW4gcjoKKyAgICAgICAgICAgICAgICBpZiBjIGluIGQ6CisgICAgICAgICAgICAgICAgICAgIGEgPSBjIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIGlmIGIgaW4gcjoKKyAgICAgICAgICAgICAgICBpZiBjIGluIGQ6CisgICAgICAgICAgICAgICAgICAgIGMgPSBhIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgIGRlZiB0ZXN0X3doaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCAid2hpbGUgYiBpbiByOiBhID0gYyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgIndoaWxlIGEgaW4gcjogZCA9IGUiKSkKKworICAgIGRlZiB0ZXN0X3doaWxlX25lc3RlZChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgd2hpbGUgYiBpbiByOgorICAgICAgICAgICAgICAgIHdoaWxlIGMgaW4gZDoKKyAgICAgICAgICAgICAgICAgICAgYSA9IGMiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgd2hpbGUgYiBpbiByOgorICAgICAgICAgICAgICAgIHdoaWxlIGMgaW4gZDoKKyAgICAgICAgICAgICAgICAgICAgYyA9IGEiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgZGVmIHRlc3RfdHJ5X2V4Y2VwdChzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGEgPSA2CisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgYiA9IDgiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgYSA9IDYiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGEgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfbmVzdGVkKHNlbGYpOgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBhID0gNgorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGIgPSA4IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDYKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBhID0gNiIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgYSA9IDYKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgYSA9IDYiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBjID0gZAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYiA9IDYKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHQgPSA4CisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBvID0geSIiIgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0X2ZpbmFsbHkoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjID0gNgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGEgPSA5IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBhID0gNiIiIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgICAgICBzID0gIiIiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYiA9IDgKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgYiA9IDYiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGIgPSA5CisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGIgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kX2JpbmRpbmcoImEiLCBzKSkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfZmluYWxseV9uZXN0ZWQoc2VsZik6CisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjID0gNgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYSA9IDkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGIgPSA5CisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgYyA9IDkiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZF9iaW5kaW5nKCJhIiwgcykpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGIgPSA4CisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGEgPSA2IiIiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCisgICAgICAgIHMgPSAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBiID0gOAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGIgPSA2CisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgYiA9IDciIiIKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRfYmluZGluZygiYSIsIHMpKQorCitjbGFzcyBUZXN0X3RvdWNoX2ltcG9ydChzdXBwb3J0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FmdGVyX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgbm9kZSA9IHBhcnNlKCciIiJmb28iIiJcbmJhcigpJykKKyAgICAgICAgZml4ZXJfdXRpbC50b3VjaF9pbXBvcnQoTm9uZSwgImZvbyIsIG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCAnIiIiZm9vIiIiXG5pbXBvcnQgZm9vXG5iYXIoKVxuXG4nKQorCisgICAgZGVmIHRlc3RfYWZ0ZXJfaW1wb3J0cyhzZWxmKToKKyAgICAgICAgbm9kZSA9IHBhcnNlKCciIiJmb28iIiJcbmltcG9ydCBiYXJcbmJhcigpJykKKyAgICAgICAgZml4ZXJfdXRpbC50b3VjaF9pbXBvcnQoTm9uZSwgImZvbyIsIG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCAnIiIiZm9vIiIiXG5pbXBvcnQgYmFyXG5pbXBvcnQgZm9vXG5iYXIoKVxuXG4nKQorCisgICAgZGVmIHRlc3RfYmVnaW5uaW5nKHNlbGYpOgorICAgICAgICBub2RlID0gcGFyc2UoJ2JhcigpJykKKyAgICAgICAgZml4ZXJfdXRpbC50b3VjaF9pbXBvcnQoTm9uZSwgImZvbyIsIG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCAnaW1wb3J0IGZvb1xuYmFyKClcblxuJykKKworICAgIGRlZiB0ZXN0X2Zyb21faW1wb3J0KHNlbGYpOgorICAgICAgICBub2RlID0gcGFyc2UoJ2JhcigpJykKKyAgICAgICAgZml4ZXJfdXRpbC50b3VjaF9pbXBvcnQoImh0bWwiLCAiZXNjYXBlIiwgbm9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobm9kZSksICdmcm9tIGh0bWwgaW1wb3J0IGVzY2FwZVxuYmFyKClcblxuJykKKworICAgIGRlZiB0ZXN0X25hbWVfaW1wb3J0KHNlbGYpOgorICAgICAgICBub2RlID0gcGFyc2UoJ2JhcigpJykKKyAgICAgICAgZml4ZXJfdXRpbC50b3VjaF9pbXBvcnQoTm9uZSwgImNnaSIsIG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG5vZGUpLCAnaW1wb3J0IGNnaVxuYmFyKClcblxuJykKKworY2xhc3MgVGVzdF9maW5kX2luZGVudGF0aW9uKHN1cHBvcnQuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfbm90aGluZyhzZWxmKToKKyAgICAgICAgZmkgPSBmaXhlcl91dGlsLmZpbmRfaW5kZW50YXRpb24KKyAgICAgICAgbm9kZSA9IHBhcnNlKCJub2RlKCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpKG5vZGUpLCB1IiIpCisgICAgICAgIG5vZGUgPSBwYXJzZSgiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaShub2RlKSwgdSIiKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBmaSA9IGZpeGVyX3V0aWwuZmluZF9pbmRlbnRhdGlvbgorICAgICAgICBub2RlID0gcGFyc2UoImRlZiBmKCk6XG4gICAgeCgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaShub2RlKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpKG5vZGUuY2hpbGRyZW5bMF0uY2hpbGRyZW5bNF0uY2hpbGRyZW5bMl0pLCB1IiAgICAiKQorICAgICAgICBub2RlID0gcGFyc2UoImRlZiBmKCk6XG4gICAgeCgpXG4gICAgeSgpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaShub2RlLmNoaWxkcmVuWzBdLmNoaWxkcmVuWzRdLmNoaWxkcmVuWzRdKSwgdSIgICAgIikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjZjBmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9saWIydG8zL3Rlc3RzL3Rlc3RfdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVjZjBmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGliMnRvMy90ZXN0cy90ZXN0X3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbGluZWNhY2hlLnB5IGIvbGliL3B5dGhvbjIuNy9saW5lY2FjaGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODExZjI3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbGluZWNhY2hlLnB5CkBAIC0wLDAgKzEsMTM1IEBACisiIiJDYWNoZSBsaW5lcyBmcm9tIGZpbGVzLgorCitUaGlzIGlzIGludGVuZGVkIHRvIHJlYWQgbGluZXMgZnJvbSBtb2R1bGVzIGltcG9ydGVkIC0tIGhlbmNlIGlmIGEgZmlsZW5hbWUKK2lzIG5vdCBmb3VuZCwgaXQgd2lsbCBsb29rIGRvd24gdGhlIG1vZHVsZSBzZWFyY2ggcGF0aCBmb3IgYSBmaWxlIGJ5Cit0aGF0IG5hbWUuCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCisKK19fYWxsX18gPSBbImdldGxpbmUiLCAiY2xlYXJjYWNoZSIsICJjaGVja2NhY2hlIl0KKworZGVmIGdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CisgICAgbGluZXMgPSBnZXRsaW5lcyhmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCisgICAgaWYgMSA8PSBsaW5lbm8gPD0gbGVuKGxpbmVzKToKKyAgICAgICAgcmV0dXJuIGxpbmVzW2xpbmVuby0xXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJworCisKKyMgVGhlIGNhY2hlCisKK2NhY2hlID0ge30gIyBUaGUgY2FjaGUKKworCitkZWYgY2xlYXJjYWNoZSgpOgorICAgICIiIkNsZWFyIHRoZSBjYWNoZSBlbnRpcmVseS4iIiIKKworICAgIGdsb2JhbCBjYWNoZQorICAgIGNhY2hlID0ge30KKworCitkZWYgZ2V0bGluZXMoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgICIiIkdldCB0aGUgbGluZXMgZm9yIGEgZmlsZSBmcm9tIHRoZSBjYWNoZS4KKyAgICBVcGRhdGUgdGhlIGNhY2hlIGlmIGl0IGRvZXNuJ3QgY29udGFpbiBhbiBlbnRyeSBmb3IgdGhpcyBmaWxlIGFscmVhZHkuIiIiCisKKyAgICBpZiBmaWxlbmFtZSBpbiBjYWNoZToKKyAgICAgICAgcmV0dXJuIGNhY2hlW2ZpbGVuYW1lXVsyXQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB1cGRhdGVjYWNoZShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCisKKworZGVmIGNoZWNrY2FjaGUoZmlsZW5hbWU9Tm9uZSk6CisgICAgIiIiRGlzY2FyZCBjYWNoZSBlbnRyaWVzIHRoYXQgYXJlIG91dCBvZiBkYXRlLgorICAgIChUaGlzIGlzIG5vdCBjaGVja2VkIHVwb24gZWFjaCBjYWxsISkiIiIKKworICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgIGZpbGVuYW1lcyA9IGNhY2hlLmtleXMoKQorICAgIGVsc2U6CisgICAgICAgIGlmIGZpbGVuYW1lIGluIGNhY2hlOgorICAgICAgICAgICAgZmlsZW5hbWVzID0gW2ZpbGVuYW1lXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICBzaXplLCBtdGltZSwgbGluZXMsIGZ1bGxuYW1lID0gY2FjaGVbZmlsZW5hbWVdCisgICAgICAgIGlmIG10aW1lIGlzIE5vbmU6CisgICAgICAgICAgICBjb250aW51ZSAgICMgbm8tb3AgZm9yIGZpbGVzIGxvYWRlZCB2aWEgYSBfX2xvYWRlcl9fCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0YXQgPSBvcy5zdGF0KGZ1bGxuYW1lKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBkZWwgY2FjaGVbZmlsZW5hbWVdCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBzaXplICE9IHN0YXQuc3Rfc2l6ZSBvciBtdGltZSAhPSBzdGF0LnN0X210aW1lOgorICAgICAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQorCisKK2RlZiB1cGRhdGVjYWNoZShmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CisgICAgIiIiVXBkYXRlIGEgY2FjaGUgZW50cnkgYW5kIHJldHVybiBpdHMgbGlzdCBvZiBsaW5lcy4KKyAgICBJZiBzb21ldGhpbmcncyB3cm9uZywgcHJpbnQgYSBtZXNzYWdlLCBkaXNjYXJkIHRoZSBjYWNoZSBlbnRyeSwKKyAgICBhbmQgcmV0dXJuIGFuIGVtcHR5IGxpc3QuIiIiCisKKyAgICBpZiBmaWxlbmFtZSBpbiBjYWNoZToKKyAgICAgICAgZGVsIGNhY2hlW2ZpbGVuYW1lXQorICAgIGlmIG5vdCBmaWxlbmFtZSBvciAoZmlsZW5hbWUuc3RhcnRzd2l0aCgnPCcpIGFuZCBmaWxlbmFtZS5lbmRzd2l0aCgnPicpKToKKyAgICAgICAgcmV0dXJuIFtdCisKKyAgICBmdWxsbmFtZSA9IGZpbGVuYW1lCisgICAgdHJ5OgorICAgICAgICBzdGF0ID0gb3Muc3RhdChmdWxsbmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgYmFzZW5hbWUgPSBmaWxlbmFtZQorCisgICAgICAgICMgVHJ5IGZvciBhIF9fbG9hZGVyX18sIGlmIGF2YWlsYWJsZQorICAgICAgICBpZiBtb2R1bGVfZ2xvYmFscyBhbmQgJ19fbG9hZGVyX18nIGluIG1vZHVsZV9nbG9iYWxzOgorICAgICAgICAgICAgbmFtZSA9IG1vZHVsZV9nbG9iYWxzLmdldCgnX19uYW1lX18nKQorICAgICAgICAgICAgbG9hZGVyID0gbW9kdWxlX2dsb2JhbHNbJ19fbG9hZGVyX18nXQorICAgICAgICAgICAgZ2V0X3NvdXJjZSA9IGdldGF0dHIobG9hZGVyLCAnZ2V0X3NvdXJjZScsIE5vbmUpCisKKyAgICAgICAgICAgIGlmIG5hbWUgYW5kIGdldF9zb3VyY2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZ2V0X3NvdXJjZShuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBObyBsdWNrLCB0aGUgUEVQMzAyIGxvYWRlciBjYW5ub3QgZmluZCB0aGUgc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGlzIG1vZHVsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICAgICAgICAgICAgICBjYWNoZVtmaWxlbmFtZV0gPSAoCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4oZGF0YSksIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBbbGluZSsnXG4nIGZvciBsaW5lIGluIGRhdGEuc3BsaXRsaW5lcygpXSwgZnVsbG5hbWUKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVbZmlsZW5hbWVdWzJdCisKKyAgICAgICAgIyBUcnkgbG9va2luZyB0aHJvdWdoIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGgsIHdoaWNoIGlzIG9ubHkgdXNlZnVsCisgICAgICAgICMgd2hlbiBoYW5kbGluZyBhIHJlbGF0aXZlIGZpbGVuYW1lLgorICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGZpbGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIGZvciBkaXJuYW1lIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgIyBXaGVuIHVzaW5nIGltcHV0aWwsIHN5cy5wYXRoIG1heSBjb250YWluIHRoaW5ncyBvdGhlciB0aGFuCisgICAgICAgICAgICAjIHN0cmluZ3M7IGlnbm9yZSB0aGVtIHdoZW4gaXQgaGFwcGVucy4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBiYXNlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICAgICAgIyBOb3Qgc3VmZmljaWVudGx5IHN0cmluZy1saWtlIHRvIGRvIGFueXRoaW5nIHVzZWZ1bCB3aXRoLgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICB0cnk6CisgICAgICAgIHdpdGggb3BlbihmdWxsbmFtZSwgJ3JVJykgYXMgZnA6CisgICAgICAgICAgICBsaW5lcyA9IGZwLnJlYWRsaW5lcygpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBbXQorICAgIGlmIGxpbmVzIGFuZCBub3QgbGluZXNbLTFdLmVuZHN3aXRoKCdcbicpOgorICAgICAgICBsaW5lc1stMV0gKz0gJ1xuJworICAgIHNpemUsIG10aW1lID0gc3RhdC5zdF9zaXplLCBzdGF0LnN0X210aW1lCisgICAgY2FjaGVbZmlsZW5hbWVdID0gc2l6ZSwgbXRpbWUsIGxpbmVzLCBmdWxsbmFtZQorICAgIHJldHVybiBsaW5lcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saW5lY2FjaGUucHljIGIvbGliL3B5dGhvbjIuNy9saW5lY2FjaGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzhlODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpbmVjYWNoZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9saW5lY2FjaGUucHlvIGIvbGliL3B5dGhvbjIuNy9saW5lY2FjaGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMzhlODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xpbmVjYWNoZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9sb2NhbGUucHkgYi9saWIvcHl0aG9uMi43L2xvY2FsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGRmZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2NhbGUucHkKQEAgLTAsMCArMSwxODgyIEBACisiIiIgTG9jYWxlIHN1cHBvcnQuCisKKyAgICBUaGUgbW9kdWxlIHByb3ZpZGVzIGxvdy1sZXZlbCBhY2Nlc3MgdG8gdGhlIEMgbGliJ3MgbG9jYWxlIEFQSXMKKyAgICBhbmQgYWRkcyBoaWdoIGxldmVsIG51bWJlciBmb3JtYXR0aW5nIEFQSXMgYXMgd2VsbCBhcyBhIGxvY2FsZQorICAgIGFsaWFzaW5nIGVuZ2luZSB0byBjb21wbGVtZW50IHRoZXNlLgorCisgICAgVGhlIGFsaWFzaW5nIGVuZ2luZSBpbmNsdWRlcyBzdXBwb3J0IGZvciBtYW55IGNvbW1vbmx5IHVzZWQgbG9jYWxlCisgICAgbmFtZXMgYW5kIG1hcHMgdGhlbSB0byB2YWx1ZXMgc3VpdGFibGUgZm9yIHBhc3NpbmcgdG8gdGhlIEMgbGliJ3MKKyAgICBzZXRsb2NhbGUoKSBmdW5jdGlvbi4gSXQgYWxzbyBpbmNsdWRlcyBkZWZhdWx0IGVuY29kaW5ncyBmb3IgYWxsCisgICAgc3VwcG9ydGVkIGxvY2FsZSBuYW1lcy4KKworIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBlbmNvZGluZ3MKK2ltcG9ydCBlbmNvZGluZ3MuYWxpYXNlcworaW1wb3J0IHJlCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBmdW5jdG9vbHMKKwordHJ5OgorICAgIF91bmljb2RlID0gdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAjIElmIFB5dGhvbiBpcyBidWlsdCB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgdGhlIHVuaWNvZGUgdHlwZQorICAgICMgd2lsbCBub3QgZXhpc3QuIEZha2Ugb25lLgorICAgIGNsYXNzIF91bmljb2RlKG9iamVjdCk6CisgICAgICAgIHBhc3MKKworIyBUcnkgaW1wb3J0aW5nIHRoZSBfbG9jYWxlIG1vZHVsZS4KKyMKKyMgSWYgdGhpcyBmYWlscywgZmFsbCBiYWNrIG9uIGEgYmFzaWMgJ0MnIGxvY2FsZSBlbXVsYXRpb24uCisKKyMgWXVjazogIExDX01FU1NBR0VTIGlzIG5vbi1zdGFuZGFyZDogIGNhbid0IHRlbGwgd2hldGhlciBpdCBleGlzdHMgYmVmb3JlCisjIHRyeWluZyB0aGUgaW1wb3J0LiAgU28gX19hbGxfXyBpcyBhbHNvIGZpZGRsZWQgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KK19fYWxsX18gPSBbImdldGxvY2FsZSIsICJnZXRkZWZhdWx0bG9jYWxlIiwgImdldHByZWZlcnJlZGVuY29kaW5nIiwgIkVycm9yIiwKKyAgICAgICAgICAgInNldGxvY2FsZSIsICJyZXNldGxvY2FsZSIsICJsb2NhbGVjb252IiwgInN0cmNvbGwiLCAic3RyeGZybSIsCisgICAgICAgICAgICJzdHIiLCAiYXRvZiIsICJhdG9pIiwgImZvcm1hdCIsICJmb3JtYXRfc3RyaW5nIiwgImN1cnJlbmN5IiwKKyAgICAgICAgICAgIm5vcm1hbGl6ZSIsICJMQ19DVFlQRSIsICJMQ19DT0xMQVRFIiwgIkxDX1RJTUUiLCAiTENfTU9ORVRBUlkiLAorICAgICAgICAgICAiTENfTlVNRVJJQyIsICJMQ19BTEwiLCAiQ0hBUl9NQVgiXQorCit0cnk6CisKKyAgICBmcm9tIF9sb2NhbGUgaW1wb3J0ICoKKworZXhjZXB0IEltcG9ydEVycm9yOgorCisgICAgIyBMb2NhbGUgZW11bGF0aW9uCisKKyAgICBDSEFSX01BWCA9IDEyNworICAgIExDX0FMTCA9IDYKKyAgICBMQ19DT0xMQVRFID0gMworICAgIExDX0NUWVBFID0gMAorICAgIExDX01FU1NBR0VTID0gNQorICAgIExDX01PTkVUQVJZID0gNAorICAgIExDX05VTUVSSUMgPSAxCisgICAgTENfVElNRSA9IDIKKyAgICBFcnJvciA9IFZhbHVlRXJyb3IKKworICAgIGRlZiBsb2NhbGVjb252KCk6CisgICAgICAgICIiIiBsb2NhbGVjb252KCkgLT4gZGljdC4KKyAgICAgICAgICAgIFJldHVybnMgbnVtZXJpYyBhbmQgbW9uZXRhcnkgbG9jYWxlLXNwZWNpZmljIHBhcmFtZXRlcnMuCisgICAgICAgICIiIgorICAgICAgICAjICdDJyBsb2NhbGUgZGVmYXVsdCB2YWx1ZXMKKyAgICAgICAgcmV0dXJuIHsnZ3JvdXBpbmcnOiBbMTI3XSwKKyAgICAgICAgICAgICAgICAnY3VycmVuY3lfc3ltYm9sJzogJycsCisgICAgICAgICAgICAgICAgJ25fc2lnbl9wb3NuJzogMTI3LAorICAgICAgICAgICAgICAgICdwX2NzX3ByZWNlZGVzJzogMTI3LAorICAgICAgICAgICAgICAgICduX2NzX3ByZWNlZGVzJzogMTI3LAorICAgICAgICAgICAgICAgICdtb25fZ3JvdXBpbmcnOiBbXSwKKyAgICAgICAgICAgICAgICAnbl9zZXBfYnlfc3BhY2UnOiAxMjcsCisgICAgICAgICAgICAgICAgJ2RlY2ltYWxfcG9pbnQnOiAnLicsCisgICAgICAgICAgICAgICAgJ25lZ2F0aXZlX3NpZ24nOiAnJywKKyAgICAgICAgICAgICAgICAncG9zaXRpdmVfc2lnbic6ICcnLAorICAgICAgICAgICAgICAgICdwX3NlcF9ieV9zcGFjZSc6IDEyNywKKyAgICAgICAgICAgICAgICAnaW50X2N1cnJfc3ltYm9sJzogJycsCisgICAgICAgICAgICAgICAgJ3Bfc2lnbl9wb3NuJzogMTI3LAorICAgICAgICAgICAgICAgICd0aG91c2FuZHNfc2VwJzogJycsCisgICAgICAgICAgICAgICAgJ21vbl90aG91c2FuZHNfc2VwJzogJycsCisgICAgICAgICAgICAgICAgJ2ZyYWNfZGlnaXRzJzogMTI3LAorICAgICAgICAgICAgICAgICdtb25fZGVjaW1hbF9wb2ludCc6ICcnLAorICAgICAgICAgICAgICAgICdpbnRfZnJhY19kaWdpdHMnOiAxMjd9CisKKyAgICBkZWYgc2V0bG9jYWxlKGNhdGVnb3J5LCB2YWx1ZT1Ob25lKToKKyAgICAgICAgIiIiIHNldGxvY2FsZShpbnRlZ2VyLHN0cmluZz1Ob25lKSAtPiBzdHJpbmcuCisgICAgICAgICAgICBBY3RpdmF0ZXMvcXVlcmllcyBsb2NhbGUgcHJvY2Vzc2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHZhbHVlIG5vdCBpbiAoTm9uZSwgJycsICdDJyk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ19sb2NhbGUgZW11bGF0aW9uIG9ubHkgc3VwcG9ydHMgIkMiIGxvY2FsZScKKyAgICAgICAgcmV0dXJuICdDJworCisgICAgZGVmIHN0cmNvbGwoYSxiKToKKyAgICAgICAgIiIiIHN0cmNvbGwoc3RyaW5nLHN0cmluZykgLT4gaW50LgorICAgICAgICAgICAgQ29tcGFyZXMgdHdvIHN0cmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gY21wKGEsYikKKworICAgIGRlZiBzdHJ4ZnJtKHMpOgorICAgICAgICAiIiIgc3RyeGZybShzdHJpbmcpIC0+IHN0cmluZy4KKyAgICAgICAgICAgIFJldHVybnMgYSBzdHJpbmcgdGhhdCBiZWhhdmVzIGZvciBjbXAgbG9jYWxlLWF3YXJlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHMKKworCitfbG9jYWxlY29udiA9IGxvY2FsZWNvbnYKKworIyBXaXRoIHRoaXMgZGljdCwgeW91IGNhbiBvdmVycmlkZSBzb21lIGl0ZW1zIG9mIGxvY2FsZWNvbnYncyByZXR1cm4gdmFsdWUuCisjIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorX292ZXJyaWRlX2xvY2FsZWNvbnYgPSB7fQorCitAZnVuY3Rvb2xzLndyYXBzKF9sb2NhbGVjb252KQorZGVmIGxvY2FsZWNvbnYoKToKKyAgICBkID0gX2xvY2FsZWNvbnYoKQorICAgIGlmIF9vdmVycmlkZV9sb2NhbGVjb252OgorICAgICAgICBkLnVwZGF0ZShfb3ZlcnJpZGVfbG9jYWxlY29udikKKyAgICByZXR1cm4gZAorCisKKyMjIyBOdW1iZXIgZm9ybWF0dGluZyBBUElzCisKKyMgQXV0aG9yOiBNYXJ0aW4gdm9uIExvZXdpcworIyBpbXByb3ZlZCBieSBHZW9yZyBCcmFuZGwKKworIyBJdGVyYXRlIG92ZXIgZ3JvdXBpbmcgaW50ZXJ2YWxzCitkZWYgX2dyb3VwaW5nX2ludGVydmFscyhncm91cGluZyk6CisgICAgbGFzdF9pbnRlcnZhbCA9IE5vbmUKKyAgICBmb3IgaW50ZXJ2YWwgaW4gZ3JvdXBpbmc6CisgICAgICAgICMgaWYgZ3JvdXBpbmcgaXMgLTEsIHdlIGFyZSBkb25lCisgICAgICAgIGlmIGludGVydmFsID09IENIQVJfTUFYOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgMDogcmUtdXNlIGxhc3QgZ3JvdXAgYWQgaW5maW5pdHVtCisgICAgICAgIGlmIGludGVydmFsID09IDA6CisgICAgICAgICAgICBpZiBsYXN0X2ludGVydmFsIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBncm91cGluZyIpCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHlpZWxkIGxhc3RfaW50ZXJ2YWwKKyAgICAgICAgeWllbGQgaW50ZXJ2YWwKKyAgICAgICAgbGFzdF9pbnRlcnZhbCA9IGludGVydmFsCisKKyNwZXJmb3JtIHRoZSBncm91cGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQKK2RlZiBfZ3JvdXAocywgbW9uZXRhcnk9RmFsc2UpOgorICAgIGNvbnYgPSBsb2NhbGVjb252KCkKKyAgICB0aG91c2FuZHNfc2VwID0gY29udlttb25ldGFyeSBhbmQgJ21vbl90aG91c2FuZHNfc2VwJyBvciAndGhvdXNhbmRzX3NlcCddCisgICAgZ3JvdXBpbmcgPSBjb252W21vbmV0YXJ5IGFuZCAnbW9uX2dyb3VwaW5nJyBvciAnZ3JvdXBpbmcnXQorICAgIGlmIG5vdCBncm91cGluZzoKKyAgICAgICAgcmV0dXJuIChzLCAwKQorICAgIGlmIHNbLTFdID09ICcgJzoKKyAgICAgICAgc3RyaXBwZWQgPSBzLnJzdHJpcCgpCisgICAgICAgIHJpZ2h0X3NwYWNlcyA9IHNbbGVuKHN0cmlwcGVkKTpdCisgICAgICAgIHMgPSBzdHJpcHBlZAorICAgIGVsc2U6CisgICAgICAgIHJpZ2h0X3NwYWNlcyA9ICcnCisgICAgbGVmdF9zcGFjZXMgPSAnJworICAgIGdyb3VwcyA9IFtdCisgICAgZm9yIGludGVydmFsIGluIF9ncm91cGluZ19pbnRlcnZhbHMoZ3JvdXBpbmcpOgorICAgICAgICBpZiBub3QgcyBvciBzWy0xXSBub3QgaW4gIjAxMjM0NTY3ODkiOgorICAgICAgICAgICAgIyBvbmx5IG5vbi1kaWdpdCBjaGFyYWN0ZXJzIHJlbWFpbiAoc2lnbiwgc3BhY2VzKQorICAgICAgICAgICAgbGVmdF9zcGFjZXMgPSBzCisgICAgICAgICAgICBzID0gJycKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGdyb3Vwcy5hcHBlbmQoc1staW50ZXJ2YWw6XSkKKyAgICAgICAgcyA9IHNbOi1pbnRlcnZhbF0KKyAgICBpZiBzOgorICAgICAgICBncm91cHMuYXBwZW5kKHMpCisgICAgZ3JvdXBzLnJldmVyc2UoKQorICAgIHJldHVybiAoCisgICAgICAgIGxlZnRfc3BhY2VzICsgdGhvdXNhbmRzX3NlcC5qb2luKGdyb3VwcykgKyByaWdodF9zcGFjZXMsCisgICAgICAgIGxlbih0aG91c2FuZHNfc2VwKSAqIChsZW4oZ3JvdXBzKSAtIDEpCisgICAgKQorCisjIFN0cmlwIGEgZ2l2ZW4gYW1vdW50IG9mIGV4Y2VzcyBwYWRkaW5nIGZyb20gdGhlIGdpdmVuIHN0cmluZworZGVmIF9zdHJpcF9wYWRkaW5nKHMsIGFtb3VudCk6CisgICAgbHBvcyA9IDAKKyAgICB3aGlsZSBhbW91bnQgYW5kIHNbbHBvc10gPT0gJyAnOgorICAgICAgICBscG9zICs9IDEKKyAgICAgICAgYW1vdW50IC09IDEKKyAgICBycG9zID0gbGVuKHMpIC0gMQorICAgIHdoaWxlIGFtb3VudCBhbmQgc1tycG9zXSA9PSAnICc6CisgICAgICAgIHJwb3MgLT0gMQorICAgICAgICBhbW91bnQgLT0gMQorICAgIHJldHVybiBzW2xwb3M6cnBvcysxXQorCitfcGVyY2VudF9yZSA9IHJlLmNvbXBpbGUociclKD86XCgoP1A8a2V5Pi4qPylcKSk/JworICAgICAgICAgICAgICAgICAgICAgICAgIHInKD9QPG1vZGlmaWVycz5bLSMwLTkgKyouaGxMXSo/KVtlRWZGZ0dkaW91eFhjcnMlXScpCisKK2RlZiBmb3JtYXQocGVyY2VudCwgdmFsdWUsIGdyb3VwaW5nPUZhbHNlLCBtb25ldGFyeT1GYWxzZSwgKmFkZGl0aW9uYWwpOgorICAgICIiIlJldHVybnMgdGhlIGxvY2FsZS1hd2FyZSBzdWJzdGl0dXRpb24gb2YgYSAlPyBzcGVjaWZpZXIKKyAgICAocGVyY2VudCkuCisKKyAgICBhZGRpdGlvbmFsIGlzIGZvciBmb3JtYXQgc3RyaW5ncyB3aGljaCBjb250YWluIG9uZSBvciBtb3JlCisgICAgJyonIG1vZGlmaWVycy4iIiIKKyAgICAjIHRoaXMgaXMgb25seSBmb3Igb25lLXBlcmNlbnQtc3BlY2lmaWVyIHN0cmluZ3MgYW5kIHRoaXMgc2hvdWxkIGJlIGNoZWNrZWQKKyAgICBtYXRjaCA9IF9wZXJjZW50X3JlLm1hdGNoKHBlcmNlbnQpCisgICAgaWYgbm90IG1hdGNoIG9yIGxlbihtYXRjaC5ncm91cCgpKSE9IGxlbihwZXJjZW50KToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigoImZvcm1hdCgpIG11c3QgYmUgZ2l2ZW4gZXhhY3RseSBvbmUgJSVjaGFyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IHNwZWNpZmllciwgJXMgbm90IHZhbGlkIikgJSByZXByKHBlcmNlbnQpKQorICAgIHJldHVybiBfZm9ybWF0KHBlcmNlbnQsIHZhbHVlLCBncm91cGluZywgbW9uZXRhcnksICphZGRpdGlvbmFsKQorCitkZWYgX2Zvcm1hdChwZXJjZW50LCB2YWx1ZSwgZ3JvdXBpbmc9RmFsc2UsIG1vbmV0YXJ5PUZhbHNlLCAqYWRkaXRpb25hbCk6CisgICAgaWYgYWRkaXRpb25hbDoKKyAgICAgICAgZm9ybWF0dGVkID0gcGVyY2VudCAlICgodmFsdWUsKSArIGFkZGl0aW9uYWwpCisgICAgZWxzZToKKyAgICAgICAgZm9ybWF0dGVkID0gcGVyY2VudCAlIHZhbHVlCisgICAgIyBmbG9hdHMgYW5kIGRlY2ltYWwgaW50cyBuZWVkIHNwZWNpYWwgYWN0aW9uIQorICAgIGlmIHBlcmNlbnRbLTFdIGluICdlRWZGZ0cnOgorICAgICAgICBzZXBzID0gMAorICAgICAgICBwYXJ0cyA9IGZvcm1hdHRlZC5zcGxpdCgnLicpCisgICAgICAgIGlmIGdyb3VwaW5nOgorICAgICAgICAgICAgcGFydHNbMF0sIHNlcHMgPSBfZ3JvdXAocGFydHNbMF0sIG1vbmV0YXJ5PW1vbmV0YXJ5KQorICAgICAgICBkZWNpbWFsX3BvaW50ID0gbG9jYWxlY29udigpW21vbmV0YXJ5IGFuZCAnbW9uX2RlY2ltYWxfcG9pbnQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgJ2RlY2ltYWxfcG9pbnQnXQorICAgICAgICBmb3JtYXR0ZWQgPSBkZWNpbWFsX3BvaW50LmpvaW4ocGFydHMpCisgICAgICAgIGlmIHNlcHM6CisgICAgICAgICAgICBmb3JtYXR0ZWQgPSBfc3RyaXBfcGFkZGluZyhmb3JtYXR0ZWQsIHNlcHMpCisgICAgZWxpZiBwZXJjZW50Wy0xXSBpbiAnZGl1JzoKKyAgICAgICAgc2VwcyA9IDAKKyAgICAgICAgaWYgZ3JvdXBpbmc6CisgICAgICAgICAgICBmb3JtYXR0ZWQsIHNlcHMgPSBfZ3JvdXAoZm9ybWF0dGVkLCBtb25ldGFyeT1tb25ldGFyeSkKKyAgICAgICAgaWYgc2VwczoKKyAgICAgICAgICAgIGZvcm1hdHRlZCA9IF9zdHJpcF9wYWRkaW5nKGZvcm1hdHRlZCwgc2VwcykKKyAgICByZXR1cm4gZm9ybWF0dGVkCisKK2RlZiBmb3JtYXRfc3RyaW5nKGYsIHZhbCwgZ3JvdXBpbmc9RmFsc2UpOgorICAgICIiIkZvcm1hdHMgYSBzdHJpbmcgaW4gdGhlIHNhbWUgd2F5IHRoYXQgdGhlICUgZm9ybWF0dGluZyB3b3VsZCB1c2UsCisgICAgYnV0IHRha2VzIHRoZSBjdXJyZW50IGxvY2FsZSBpbnRvIGFjY291bnQuCisgICAgR3JvdXBpbmcgaXMgYXBwbGllZCBpZiB0aGUgdGhpcmQgcGFyYW1ldGVyIGlzIHRydWUuIiIiCisgICAgcGVyY2VudHMgPSBsaXN0KF9wZXJjZW50X3JlLmZpbmRpdGVyKGYpKQorICAgIG5ld19mID0gX3BlcmNlbnRfcmUuc3ViKCclcycsIGYpCisKKyAgICBpZiBvcGVyYXRvci5pc01hcHBpbmdUeXBlKHZhbCk6CisgICAgICAgIG5ld192YWwgPSBbXQorICAgICAgICBmb3IgcGVyYyBpbiBwZXJjZW50czoKKyAgICAgICAgICAgIGlmIHBlcmMuZ3JvdXAoKVstMV09PSclJzoKKyAgICAgICAgICAgICAgICBuZXdfdmFsLmFwcGVuZCgnJScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld192YWwuYXBwZW5kKGZvcm1hdChwZXJjLmdyb3VwKCksIHZhbCwgZ3JvdXBpbmcpKQorICAgIGVsc2U6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbCwgdHVwbGUpOgorICAgICAgICAgICAgdmFsID0gKHZhbCwpCisgICAgICAgIG5ld192YWwgPSBbXQorICAgICAgICBpID0gMAorICAgICAgICBmb3IgcGVyYyBpbiBwZXJjZW50czoKKyAgICAgICAgICAgIGlmIHBlcmMuZ3JvdXAoKVstMV09PSclJzoKKyAgICAgICAgICAgICAgICBuZXdfdmFsLmFwcGVuZCgnJScpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0YXJjb3VudCA9IHBlcmMuZ3JvdXAoJ21vZGlmaWVycycpLmNvdW50KCcqJykKKyAgICAgICAgICAgICAgICBuZXdfdmFsLmFwcGVuZChfZm9ybWF0KHBlcmMuZ3JvdXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp2YWxbaSsxOmkrMStzdGFyY291bnRdKSkKKyAgICAgICAgICAgICAgICBpICs9ICgxICsgc3RhcmNvdW50KQorICAgIHZhbCA9IHR1cGxlKG5ld192YWwpCisKKyAgICByZXR1cm4gbmV3X2YgJSB2YWwKKworZGVmIGN1cnJlbmN5KHZhbCwgc3ltYm9sPVRydWUsIGdyb3VwaW5nPUZhbHNlLCBpbnRlcm5hdGlvbmFsPUZhbHNlKToKKyAgICAiIiJGb3JtYXRzIHZhbCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbmN5IHNldHRpbmdzCisgICAgaW4gdGhlIGN1cnJlbnQgbG9jYWxlLiIiIgorICAgIGNvbnYgPSBsb2NhbGVjb252KCkKKworICAgICMgY2hlY2sgZm9yIGlsbGVnYWwgdmFsdWVzCisgICAgZGlnaXRzID0gY29udltpbnRlcm5hdGlvbmFsIGFuZCAnaW50X2ZyYWNfZGlnaXRzJyBvciAnZnJhY19kaWdpdHMnXQorICAgIGlmIGRpZ2l0cyA9PSAxMjc6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkN1cnJlbmN5IGZvcm1hdHRpbmcgaXMgbm90IHBvc3NpYmxlIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhlICdDJyBsb2NhbGUuIikKKworICAgIHMgPSBmb3JtYXQoJyUlLiVpZicgJSBkaWdpdHMsIGFicyh2YWwpLCBncm91cGluZywgbW9uZXRhcnk9VHJ1ZSkKKyAgICAjICc8JyBhbmQgJz4nIGFyZSBtYXJrZXJzIGlmIHRoZSBzaWduIG11c3QgYmUgaW5zZXJ0ZWQgYmV0d2VlbiBzeW1ib2wgYW5kIHZhbHVlCisgICAgcyA9ICc8JyArIHMgKyAnPicKKworICAgIGlmIHN5bWJvbDoKKyAgICAgICAgc21iID0gY29udltpbnRlcm5hdGlvbmFsIGFuZCAnaW50X2N1cnJfc3ltYm9sJyBvciAnY3VycmVuY3lfc3ltYm9sJ10KKyAgICAgICAgcHJlY2VkZXMgPSBjb252W3ZhbDwwIGFuZCAnbl9jc19wcmVjZWRlcycgb3IgJ3BfY3NfcHJlY2VkZXMnXQorICAgICAgICBzZXBhcmF0ZWQgPSBjb252W3ZhbDwwIGFuZCAnbl9zZXBfYnlfc3BhY2UnIG9yICdwX3NlcF9ieV9zcGFjZSddCisKKyAgICAgICAgaWYgcHJlY2VkZXM6CisgICAgICAgICAgICBzID0gc21iICsgKHNlcGFyYXRlZCBhbmQgJyAnIG9yICcnKSArIHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSBzICsgKHNlcGFyYXRlZCBhbmQgJyAnIG9yICcnKSArIHNtYgorCisgICAgc2lnbl9wb3MgPSBjb252W3ZhbDwwIGFuZCAnbl9zaWduX3Bvc24nIG9yICdwX3NpZ25fcG9zbiddCisgICAgc2lnbiA9IGNvbnZbdmFsPDAgYW5kICduZWdhdGl2ZV9zaWduJyBvciAncG9zaXRpdmVfc2lnbiddCisKKyAgICBpZiBzaWduX3BvcyA9PSAwOgorICAgICAgICBzID0gJygnICsgcyArICcpJworICAgIGVsaWYgc2lnbl9wb3MgPT0gMToKKyAgICAgICAgcyA9IHNpZ24gKyBzCisgICAgZWxpZiBzaWduX3BvcyA9PSAyOgorICAgICAgICBzID0gcyArIHNpZ24KKyAgICBlbGlmIHNpZ25fcG9zID09IDM6CisgICAgICAgIHMgPSBzLnJlcGxhY2UoJzwnLCBzaWduKQorICAgIGVsaWYgc2lnbl9wb3MgPT0gNDoKKyAgICAgICAgcyA9IHMucmVwbGFjZSgnPicsIHNpZ24pCisgICAgZWxzZToKKyAgICAgICAgIyB0aGUgZGVmYXVsdCBpZiBub3RoaW5nIHNwZWNpZmllZDsKKyAgICAgICAgIyB0aGlzIHNob3VsZCBiZSB0aGUgbW9zdCBmaXR0aW5nIHNpZ24gcG9zaXRpb24KKyAgICAgICAgcyA9IHNpZ24gKyBzCisKKyAgICByZXR1cm4gcy5yZXBsYWNlKCc8JywgJycpLnJlcGxhY2UoJz4nLCAnJykKKworZGVmIHN0cih2YWwpOgorICAgICIiIkNvbnZlcnQgZmxvYXQgdG8gaW50ZWdlciwgdGFraW5nIHRoZSBsb2NhbGUgaW50byBhY2NvdW50LiIiIgorICAgIHJldHVybiBmb3JtYXQoIiUuMTJnIiwgdmFsKQorCitkZWYgYXRvZihzdHJpbmcsIGZ1bmM9ZmxvYXQpOgorICAgICJQYXJzZXMgYSBzdHJpbmcgYXMgYSBmbG9hdCBhY2NvcmRpbmcgdG8gdGhlIGxvY2FsZSBzZXR0aW5ncy4iCisgICAgI0ZpcnN0LCBnZXQgcmlkIG9mIHRoZSBncm91cGluZworICAgIHRzID0gbG9jYWxlY29udigpWyd0aG91c2FuZHNfc2VwJ10KKyAgICBpZiB0czoKKyAgICAgICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UodHMsICcnKQorICAgICNuZXh0LCByZXBsYWNlIHRoZSBkZWNpbWFsIHBvaW50IHdpdGggYSBkb3QKKyAgICBkZCA9IGxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddCisgICAgaWYgZGQ6CisgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGRkLCAnLicpCisgICAgI2ZpbmFsbHksIHBhcnNlIHRoZSBzdHJpbmcKKyAgICByZXR1cm4gZnVuYyhzdHJpbmcpCisKK2RlZiBhdG9pKHN0cik6CisgICAgIkNvbnZlcnRzIGEgc3RyaW5nIHRvIGFuIGludGVnZXIgYWNjb3JkaW5nIHRvIHRoZSBsb2NhbGUgc2V0dGluZ3MuIgorICAgIHJldHVybiBhdG9mKHN0ciwgaW50KQorCitkZWYgX3Rlc3QoKToKKyAgICBzZXRsb2NhbGUoTENfQUxMLCAiIikKKyAgICAjZG8gZ3JvdXBpbmcKKyAgICBzMSA9IGZvcm1hdCgiJWQiLCAxMjM0NTY3ODksMSkKKyAgICBwcmludCBzMSwgImlzIiwgYXRvaShzMSkKKyAgICAjc3RhbmRhcmQgZm9ybWF0dGluZworICAgIHMxID0gc3RyKDMuMTQpCisgICAgcHJpbnQgczEsICJpcyIsIGF0b2YoczEpCisKKyMjIyBMb2NhbGUgbmFtZSBhbGlhc2luZyBlbmdpbmUKKworIyBBdXRob3I6IE1hcmMtQW5kcmUgTGVtYnVyZywgbWFsQGxlbWJ1cmcuY29tCisjIFZhcmlvdXMgdHdlYWtzIGJ5IEZyZWRyaWsgTHVuZGggPGZyZWRyaWtAcHl0aG9ud2FyZS5jb20+CisKKyMgc3RvcmUgYXdheSB0aGUgbG93LWxldmVsIHZlcnNpb24gb2Ygc2V0bG9jYWxlIChpdCdzCisjIG92ZXJyaWRkZW4gYmVsb3cpCitfc2V0bG9jYWxlID0gc2V0bG9jYWxlCisKKyMgQXZvaWQgcmVseWluZyBvbiB0aGUgbG9jYWxlLWRlcGVuZGVudCAubG93ZXIoKSBtZXRob2QKKyMgKHNlZSBpc3N1ZSAjMTgxMykuCitfYXNjaWlfbG93ZXJfbWFwID0gJycuam9pbigKKyAgICBjaHIoeCArIDMyIGlmIHggPj0gb3JkKCdBJykgYW5kIHggPD0gb3JkKCdaJykgZWxzZSB4KQorICAgIGZvciB4IGluIHJhbmdlKDI1NikKKykKKworZGVmIG5vcm1hbGl6ZShsb2NhbGVuYW1lKToKKworICAgICIiIiBSZXR1cm5zIGEgbm9ybWFsaXplZCBsb2NhbGUgY29kZSBmb3IgdGhlIGdpdmVuIGxvY2FsZQorICAgICAgICBuYW1lLgorCisgICAgICAgIFRoZSByZXR1cm5lZCBsb2NhbGUgY29kZSBpcyBmb3JtYXR0ZWQgZm9yIHVzZSB3aXRoCisgICAgICAgIHNldGxvY2FsZSgpLgorCisgICAgICAgIElmIG5vcm1hbGl6YXRpb24gZmFpbHMsIHRoZSBvcmlnaW5hbCBuYW1lIGlzIHJldHVybmVkCisgICAgICAgIHVuY2hhbmdlZC4KKworICAgICAgICBJZiB0aGUgZ2l2ZW4gZW5jb2RpbmcgaXMgbm90IGtub3duLCB0aGUgZnVuY3Rpb24gZGVmYXVsdHMgdG8KKyAgICAgICAgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIHRoZSBsb2NhbGUgY29kZSBqdXN0IGxpa2Ugc2V0bG9jYWxlKCkKKyAgICAgICAgZG9lcy4KKworICAgICIiIgorICAgICMgTm9ybWFsaXplIHRoZSBsb2NhbGUgbmFtZSBhbmQgZXh0cmFjdCB0aGUgZW5jb2RpbmcKKyAgICBpZiBpc2luc3RhbmNlKGxvY2FsZW5hbWUsIF91bmljb2RlKToKKyAgICAgICAgbG9jYWxlbmFtZSA9IGxvY2FsZW5hbWUuZW5jb2RlKCdhc2NpaScpCisgICAgZnVsbG5hbWUgPSBsb2NhbGVuYW1lLnRyYW5zbGF0ZShfYXNjaWlfbG93ZXJfbWFwKQorICAgIGlmICc6JyBpbiBmdWxsbmFtZToKKyAgICAgICAgIyAnOicgaXMgc29tZXRpbWVzIHVzZWQgYXMgZW5jb2RpbmcgZGVsaW1pdGVyLgorICAgICAgICBmdWxsbmFtZSA9IGZ1bGxuYW1lLnJlcGxhY2UoJzonLCAnLicpCisgICAgaWYgJy4nIGluIGZ1bGxuYW1lOgorICAgICAgICBsYW5nbmFtZSwgZW5jb2RpbmcgPSBmdWxsbmFtZS5zcGxpdCgnLicpWzoyXQorICAgICAgICBmdWxsbmFtZSA9IGxhbmduYW1lICsgJy4nICsgZW5jb2RpbmcKKyAgICBlbHNlOgorICAgICAgICBsYW5nbmFtZSA9IGZ1bGxuYW1lCisgICAgICAgIGVuY29kaW5nID0gJycKKworICAgICMgRmlyc3QgbG9va3VwOiBmdWxsbmFtZSAocG9zc2libHkgd2l0aCBlbmNvZGluZykKKyAgICBub3JtX2VuY29kaW5nID0gZW5jb2RpbmcucmVwbGFjZSgnLScsICcnKQorICAgIG5vcm1fZW5jb2RpbmcgPSBub3JtX2VuY29kaW5nLnJlcGxhY2UoJ18nLCAnJykKKyAgICBsb29rdXBfbmFtZSA9IGxhbmduYW1lICsgJy4nICsgZW5jb2RpbmcKKyAgICBjb2RlID0gbG9jYWxlX2FsaWFzLmdldChsb29rdXBfbmFtZSwgTm9uZSkKKyAgICBpZiBjb2RlIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gY29kZQorICAgICNwcmludCAnZmlyc3QgbG9va3VwIGZhaWxlZCcKKworICAgICMgU2Vjb25kIHRyeTogbGFuZ25hbWUgKHdpdGhvdXQgZW5jb2RpbmcpCisgICAgY29kZSA9IGxvY2FsZV9hbGlhcy5nZXQobGFuZ25hbWUsIE5vbmUpCisgICAgaWYgY29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgI3ByaW50ICdsYW5nbmFtZSBsb29rdXAgc3VjY2VlZGVkJworICAgICAgICBpZiAnLicgaW4gY29kZToKKyAgICAgICAgICAgIGxhbmduYW1lLCBkZWZlbmMgPSBjb2RlLnNwbGl0KCcuJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxhbmduYW1lID0gY29kZQorICAgICAgICAgICAgZGVmZW5jID0gJycKKyAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICAjIENvbnZlcnQgdGhlIGVuY29kaW5nIHRvIGEgQyBsaWIgY29tcGF0aWJsZSBlbmNvZGluZyBzdHJpbmcKKyAgICAgICAgICAgIG5vcm1fZW5jb2RpbmcgPSBlbmNvZGluZ3Mubm9ybWFsaXplX2VuY29kaW5nKGVuY29kaW5nKQorICAgICAgICAgICAgI3ByaW50ICdub3JtIGVuY29kaW5nOiAlcicgJSBub3JtX2VuY29kaW5nCisgICAgICAgICAgICBub3JtX2VuY29kaW5nID0gZW5jb2RpbmdzLmFsaWFzZXMuYWxpYXNlcy5nZXQobm9ybV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtX2VuY29kaW5nKQorICAgICAgICAgICAgI3ByaW50ICdhbGlhc2VkIGVuY29kaW5nOiAlcicgJSBub3JtX2VuY29kaW5nCisgICAgICAgICAgICBlbmNvZGluZyA9IGxvY2FsZV9lbmNvZGluZ19hbGlhcy5nZXQobm9ybV9lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtX2VuY29kaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBkZWZlbmMKKyAgICAgICAgI3ByaW50ICdmb3VuZCBlbmNvZGluZyAlcicgJSBlbmNvZGluZworICAgICAgICBpZiBlbmNvZGluZzoKKyAgICAgICAgICAgIHJldHVybiBsYW5nbmFtZSArICcuJyArIGVuY29kaW5nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbGFuZ25hbWUKKworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBsb2NhbGVuYW1lCisKK2RlZiBfcGFyc2VfbG9jYWxlbmFtZShsb2NhbGVuYW1lKToKKworICAgICIiIiBQYXJzZXMgdGhlIGxvY2FsZSBjb2RlIGZvciBsb2NhbGVuYW1lIGFuZCByZXR1cm5zIHRoZQorICAgICAgICByZXN1bHQgYXMgdHVwbGUgKGxhbmd1YWdlIGNvZGUsIGVuY29kaW5nKS4KKworICAgICAgICBUaGUgbG9jYWxlbmFtZSBpcyBub3JtYWxpemVkIGFuZCBwYXNzZWQgdGhyb3VnaCB0aGUgbG9jYWxlCisgICAgICAgIGFsaWFzIGVuZ2luZS4gQSBWYWx1ZUVycm9yIGlzIHJhaXNlZCBpbiBjYXNlIHRoZSBsb2NhbGUgbmFtZQorICAgICAgICBjYW5ub3QgYmUgcGFyc2VkLgorCisgICAgICAgIFRoZSBsYW5ndWFnZSBjb2RlIGNvcnJlc3BvbmRzIHRvIFJGQyAxNzY2LiAgY29kZSBhbmQgZW5jb2RpbmcKKyAgICAgICAgY2FuIGJlIE5vbmUgaW4gY2FzZSB0aGUgdmFsdWVzIGNhbm5vdCBiZSBkZXRlcm1pbmVkIG9yIGFyZQorICAgICAgICB1bmtub3duIHRvIHRoaXMgaW1wbGVtZW50YXRpb24uCisKKyAgICAiIiIKKyAgICBjb2RlID0gbm9ybWFsaXplKGxvY2FsZW5hbWUpCisgICAgaWYgJ0AnIGluIGNvZGU6CisgICAgICAgICMgRGVhbCB3aXRoIGxvY2FsZSBtb2RpZmllcnMKKyAgICAgICAgY29kZSwgbW9kaWZpZXIgPSBjb2RlLnNwbGl0KCdAJykKKyAgICAgICAgaWYgbW9kaWZpZXIgPT0gJ2V1cm8nIGFuZCAnLicgbm90IGluIGNvZGU6CisgICAgICAgICAgICAjIEFzc3VtZSBMYXRpbi05IGZvciBAZXVybyBsb2NhbGVzLiBUaGlzIGlzIGJvZ3VzLAorICAgICAgICAgICAgIyBzaW5jZSBzb21lIHN5c3RlbXMgbWF5IHVzZSBvdGhlciBlbmNvZGluZ3MgZm9yIHRoZXNlCisgICAgICAgICAgICAjIGxvY2FsZXMuIEFsc28sIHdlIGlnbm9yZSBvdGhlciBtb2RpZmllcnMuCisgICAgICAgICAgICByZXR1cm4gY29kZSwgJ2lzby04ODU5LTE1JworCisgICAgaWYgJy4nIGluIGNvZGU6CisgICAgICAgIHJldHVybiB0dXBsZShjb2RlLnNwbGl0KCcuJylbOjJdKQorICAgIGVsaWYgY29kZSA9PSAnQyc6CisgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgcmFpc2UgVmFsdWVFcnJvciwgJ3Vua25vd24gbG9jYWxlOiAlcycgJSBsb2NhbGVuYW1lCisKK2RlZiBfYnVpbGRfbG9jYWxlbmFtZShsb2NhbGV0dXBsZSk6CisKKyAgICAiIiIgQnVpbGRzIGEgbG9jYWxlIGNvZGUgZnJvbSB0aGUgZ2l2ZW4gdHVwbGUgKGxhbmd1YWdlIGNvZGUsCisgICAgICAgIGVuY29kaW5nKS4KKworICAgICAgICBObyBhbGlhc2luZyBvciBub3JtYWxpemluZyB0YWtlcyBwbGFjZS4KKworICAgICIiIgorICAgIGxhbmd1YWdlLCBlbmNvZGluZyA9IGxvY2FsZXR1cGxlCisgICAgaWYgbGFuZ3VhZ2UgaXMgTm9uZToKKyAgICAgICAgbGFuZ3VhZ2UgPSAnQycKKyAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICByZXR1cm4gbGFuZ3VhZ2UKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gbGFuZ3VhZ2UgKyAnLicgKyBlbmNvZGluZworCitkZWYgZ2V0ZGVmYXVsdGxvY2FsZShlbnZ2YXJzPSgnTENfQUxMJywgJ0xDX0NUWVBFJywgJ0xBTkcnLCAnTEFOR1VBR0UnKSk6CisKKyAgICAiIiIgVHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGxvY2FsZSBzZXR0aW5ncyBhbmQgcmV0dXJucworICAgICAgICB0aGVtIGFzIHR1cGxlIChsYW5ndWFnZSBjb2RlLCBlbmNvZGluZykuCisKKyAgICAgICAgQWNjb3JkaW5nIHRvIFBPU0lYLCBhIHByb2dyYW0gd2hpY2ggaGFzIG5vdCBjYWxsZWQKKyAgICAgICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpIHJ1bnMgdXNpbmcgdGhlIHBvcnRhYmxlICdDJyBsb2NhbGUuCisgICAgICAgIENhbGxpbmcgc2V0bG9jYWxlKExDX0FMTCwgIiIpIGxldHMgaXQgdXNlIHRoZSBkZWZhdWx0IGxvY2FsZSBhcworICAgICAgICBkZWZpbmVkIGJ5IHRoZSBMQU5HIHZhcmlhYmxlLiBTaW5jZSB3ZSBkb24ndCB3YW50IHRvIGludGVyZmVyZQorICAgICAgICB3aXRoIHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHdlIHRodXMgZW11bGF0ZSB0aGUgYmVoYXZpb3IKKyAgICAgICAgaW4gdGhlIHdheSBkZXNjcmliZWQgYWJvdmUuCisKKyAgICAgICAgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIHBsYXRmb3Jtcywgbm90IG9ubHkgdGhlCisgICAgICAgIExBTkcgdmFyaWFibGUgaXMgdGVzdGVkLCBidXQgYSBsaXN0IG9mIHZhcmlhYmxlcyBnaXZlbiBhcworICAgICAgICBlbnZ2YXJzIHBhcmFtZXRlci4gVGhlIGZpcnN0IGZvdW5kIHRvIGJlIGRlZmluZWQgd2lsbCBiZQorICAgICAgICB1c2VkLiBlbnZ2YXJzIGRlZmF1bHRzIHRvIHRoZSBzZWFyY2ggcGF0aCB1c2VkIGluIEdOVSBnZXR0ZXh0OworICAgICAgICBpdCBtdXN0IGFsd2F5cyBjb250YWluIHRoZSB2YXJpYWJsZSBuYW1lICdMQU5HJy4KKworICAgICAgICBFeGNlcHQgZm9yIHRoZSBjb2RlICdDJywgdGhlIGxhbmd1YWdlIGNvZGUgY29ycmVzcG9uZHMgdG8gUkZDCisgICAgICAgIDE3NjYuICBjb2RlIGFuZCBlbmNvZGluZyBjYW4gYmUgTm9uZSBpbiBjYXNlIHRoZSB2YWx1ZXMgY2Fubm90CisgICAgICAgIGJlIGRldGVybWluZWQuCisKKyAgICAiIiIKKworICAgIHRyeToKKyAgICAgICAgIyBjaGVjayBpZiBpdCdzIHN1cHBvcnRlZCBieSB0aGUgX2xvY2FsZSBtb2R1bGUKKyAgICAgICAgaW1wb3J0IF9sb2NhbGUKKyAgICAgICAgY29kZSwgZW5jb2RpbmcgPSBfbG9jYWxlLl9nZXRkZWZhdWx0bG9jYWxlKCkKKyAgICBleGNlcHQgKEltcG9ydEVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgY29kZS9lbmNvZGluZyB2YWx1ZXMgYXJlIHZhbGlkCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIGFuZCBjb2RlIGFuZCBjb2RlWzoyXSA9PSAiMHgiOgorICAgICAgICAgICAgIyBtYXAgd2luZG93cyBsYW5ndWFnZSBpZGVudGlmaWVyIHRvIGxhbmd1YWdlIG5hbWUKKyAgICAgICAgICAgIGNvZGUgPSB3aW5kb3dzX2xvY2FsZS5nZXQoaW50KGNvZGUsIDApKQorICAgICAgICAjIC4uLmFkZCBvdGhlciBwbGF0Zm9ybS1zcGVjaWZpYyBwcm9jZXNzaW5nIGhlcmUsIGlmCisgICAgICAgICMgbmVjZXNzYXJ5Li4uCisgICAgICAgIHJldHVybiBjb2RlLCBlbmNvZGluZworCisgICAgIyBmYWxsIGJhY2sgb24gUE9TSVggYmVoYXZpb3VyCisgICAgaW1wb3J0IG9zCisgICAgbG9va3VwID0gb3MuZW52aXJvbi5nZXQKKyAgICBmb3IgdmFyaWFibGUgaW4gZW52dmFyczoKKyAgICAgICAgbG9jYWxlbmFtZSA9IGxvb2t1cCh2YXJpYWJsZSxOb25lKQorICAgICAgICBpZiBsb2NhbGVuYW1lOgorICAgICAgICAgICAgaWYgdmFyaWFibGUgPT0gJ0xBTkdVQUdFJzoKKyAgICAgICAgICAgICAgICBsb2NhbGVuYW1lID0gbG9jYWxlbmFtZS5zcGxpdCgnOicpWzBdCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIGxvY2FsZW5hbWUgPSAnQycKKyAgICByZXR1cm4gX3BhcnNlX2xvY2FsZW5hbWUobG9jYWxlbmFtZSkKKworCitkZWYgZ2V0bG9jYWxlKGNhdGVnb3J5PUxDX0NUWVBFKToKKworICAgICIiIiBSZXR1cm5zIHRoZSBjdXJyZW50IHNldHRpbmcgZm9yIHRoZSBnaXZlbiBsb2NhbGUgY2F0ZWdvcnkgYXMKKyAgICAgICAgdHVwbGUgKGxhbmd1YWdlIGNvZGUsIGVuY29kaW5nKS4KKworICAgICAgICBjYXRlZ29yeSBtYXkgYmUgb25lIG9mIHRoZSBMQ18qIHZhbHVlIGV4Y2VwdCBMQ19BTEwuIEl0CisgICAgICAgIGRlZmF1bHRzIHRvIExDX0NUWVBFLgorCisgICAgICAgIEV4Y2VwdCBmb3IgdGhlIGNvZGUgJ0MnLCB0aGUgbGFuZ3VhZ2UgY29kZSBjb3JyZXNwb25kcyB0byBSRkMKKyAgICAgICAgMTc2Ni4gIGNvZGUgYW5kIGVuY29kaW5nIGNhbiBiZSBOb25lIGluIGNhc2UgdGhlIHZhbHVlcyBjYW5ub3QKKyAgICAgICAgYmUgZGV0ZXJtaW5lZC4KKworICAgICIiIgorICAgIGxvY2FsZW5hbWUgPSBfc2V0bG9jYWxlKGNhdGVnb3J5KQorICAgIGlmIGNhdGVnb3J5ID09IExDX0FMTCBhbmQgJzsnIGluIGxvY2FsZW5hbWU6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ2NhdGVnb3J5IExDX0FMTCBpcyBub3Qgc3VwcG9ydGVkJworICAgIHJldHVybiBfcGFyc2VfbG9jYWxlbmFtZShsb2NhbGVuYW1lKQorCitkZWYgc2V0bG9jYWxlKGNhdGVnb3J5LCBsb2NhbGU9Tm9uZSk6CisKKyAgICAiIiIgU2V0IHRoZSBsb2NhbGUgZm9yIHRoZSBnaXZlbiBjYXRlZ29yeS4gIFRoZSBsb2NhbGUgY2FuIGJlCisgICAgICAgIGEgc3RyaW5nLCBhbiBpdGVyYWJsZSBvZiB0d28gc3RyaW5ncyAobGFuZ3VhZ2UgY29kZSBhbmQgZW5jb2RpbmcpLAorICAgICAgICBvciBOb25lLgorCisgICAgICAgIEl0ZXJhYmxlcyBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgdXNpbmcgdGhlIGxvY2FsZSBhbGlhc2luZworICAgICAgICBlbmdpbmUuICBMb2NhbGUgc3RyaW5ncyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBDIGxpYi4KKworICAgICAgICBjYXRlZ29yeSBtYXkgYmUgZ2l2ZW4gYXMgb25lIG9mIHRoZSBMQ18qIHZhbHVlcy4KKworICAgICIiIgorICAgIGlmIGxvY2FsZSBhbmQgdHlwZShsb2NhbGUpIGlzIG5vdCB0eXBlKCIiKToKKyAgICAgICAgIyBjb252ZXJ0IHRvIHN0cmluZworICAgICAgICBsb2NhbGUgPSBub3JtYWxpemUoX2J1aWxkX2xvY2FsZW5hbWUobG9jYWxlKSkKKyAgICByZXR1cm4gX3NldGxvY2FsZShjYXRlZ29yeSwgbG9jYWxlKQorCitkZWYgcmVzZXRsb2NhbGUoY2F0ZWdvcnk9TENfQUxMKToKKworICAgICIiIiBTZXRzIHRoZSBsb2NhbGUgZm9yIGNhdGVnb3J5IHRvIHRoZSBkZWZhdWx0IHNldHRpbmcuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyBkZXRlcm1pbmVkIGJ5IGNhbGxpbmcKKyAgICAgICAgZ2V0ZGVmYXVsdGxvY2FsZSgpLiBjYXRlZ29yeSBkZWZhdWx0cyB0byBMQ19BTEwuCisKKyAgICAiIiIKKyAgICBfc2V0bG9jYWxlKGNhdGVnb3J5LCBfYnVpbGRfbG9jYWxlbmFtZShnZXRkZWZhdWx0bG9jYWxlKCkpKQorCitpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIik6CisgICAgIyBPbiBXaW4zMiwgdGhpcyB3aWxsIHJldHVybiB0aGUgQU5TSSBjb2RlIHBhZ2UKKyAgICBkZWYgZ2V0cHJlZmVycmVkZW5jb2RpbmcoZG9fc2V0bG9jYWxlID0gVHJ1ZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgY2hhcnNldCB0aGF0IHRoZSB1c2VyIGlzIGxpa2VseSB1c2luZy4iIiIKKyAgICAgICAgaW1wb3J0IF9sb2NhbGUKKyAgICAgICAgcmV0dXJuIF9sb2NhbGUuX2dldGRlZmF1bHRsb2NhbGUoKVsxXQorZWxzZToKKyAgICAjIE9uIFVuaXgsIGlmIENPREVTRVQgaXMgYXZhaWxhYmxlLCB1c2UgdGhhdC4KKyAgICB0cnk6CisgICAgICAgIENPREVTRVQKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAjIEZhbGwgYmFjayB0byBwYXJzaW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyA6LSgKKyAgICAgICAgZGVmIGdldHByZWZlcnJlZGVuY29kaW5nKGRvX3NldGxvY2FsZSA9IFRydWUpOgorICAgICAgICAgICAgIiIiUmV0dXJuIHRoZSBjaGFyc2V0IHRoYXQgdGhlIHVzZXIgaXMgbGlrZWx5IHVzaW5nLAorICAgICAgICAgICAgYnkgbG9va2luZyBhdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIiIiCisgICAgICAgICAgICByZXR1cm4gZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdCisgICAgZWxzZToKKyAgICAgICAgZGVmIGdldHByZWZlcnJlZGVuY29kaW5nKGRvX3NldGxvY2FsZSA9IFRydWUpOgorICAgICAgICAgICAgIiIiUmV0dXJuIHRoZSBjaGFyc2V0IHRoYXQgdGhlIHVzZXIgaXMgbGlrZWx5IHVzaW5nLAorICAgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4iIiIKKyAgICAgICAgICAgIGlmIGRvX3NldGxvY2FsZToKKyAgICAgICAgICAgICAgICBvbGRsb2MgPSBzZXRsb2NhbGUoTENfQ1RZUEUpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5sX2xhbmdpbmZvKENPREVTRVQpCisgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX0NUWVBFLCBvbGRsb2MpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbmxfbGFuZ2luZm8oQ09ERVNFVCkKKworCisjIyMgRGF0YWJhc2UKKyMKKyMgVGhlIGZvbGxvd2luZyBkYXRhIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgbG9jYWxlLmFsaWFzIGZpbGUgd2hpY2gKKyMgY29tZXMgd2l0aCBYMTEgYW5kIHRoZW4gaGFuZCBlZGl0ZWQgcmVtb3ZpbmcgdGhlIGV4cGxpY2l0IGVuY29kaW5nCisjIGRlZmluaXRpb25zIGFuZCBhZGRpbmcgc29tZSBtb3JlIGFsaWFzZXMuIFRoZSBmaWxlIGlzIHVzdWFsbHkKKyMgYXZhaWxhYmxlIGFzIC91c3IvbGliL1gxMS9sb2NhbGUvbG9jYWxlLmFsaWFzLgorIworCisjCisjIFRoZSBsb2NhbF9lbmNvZGluZ19hbGlhcyB0YWJsZSBtYXBzIGxvd2VyY2FzZSBlbmNvZGluZyBhbGlhcyBuYW1lcworIyB0byBDIGxvY2FsZSBlbmNvZGluZyBuYW1lcyAoY2FzZS1zZW5zaXRpdmUpLiBOb3RlIHRoYXQgbm9ybWFsaXplKCkKKyMgZmlyc3QgbG9va3MgdXAgdGhlIGVuY29kaW5nIGluIHRoZSBlbmNvZGluZ3MuYWxpYXNlcyBkaWN0aW9uYXJ5IGFuZAorIyB0aGVuIGFwcGxpZXMgdGhpcyBtYXBwaW5nIHRvIGZpbmQgdGhlIGNvcnJlY3QgQyBsaWIgbmFtZSBmb3IgdGhlCisjIGVuY29kaW5nLgorIworbG9jYWxlX2VuY29kaW5nX2FsaWFzID0geworCisgICAgIyBNYXBwaW5ncyBmb3Igbm9uLXN0YW5kYXJkIGVuY29kaW5nIG5hbWVzIHVzZWQgaW4gbG9jYWxlIG5hbWVzCisgICAgJzQzNyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCisgICAgJ2MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCisgICAgJ2VuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xJywKKyAgICAnamlzJzogICAgICAgICAgICAgICAgICAgICAgICAgICdKSVM3JywKKyAgICAnamlzNyc6ICAgICAgICAgICAgICAgICAgICAgICAgICdKSVM3JywKKyAgICAnYWplYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICdldWNKUCcsCisKKyAgICAjIE1hcHBpbmdzIGZyb20gUHl0aG9uIGNvZGVjIG5hbWVzIHRvIEMgbGliIGVuY29kaW5nIG5hbWVzCisgICAgJ2FzY2lpJzogICAgICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xJywKKyAgICAnbGF0aW5fMSc6ICAgICAgICAgICAgICAgICAgICAgICdJU084ODU5LTEnLAorICAgICdpc284ODU5XzEnOiAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktMScsCisgICAgJ2lzbzg4NTlfMTAnOiAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xMCcsCisgICAgJ2lzbzg4NTlfMTEnOiAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xMScsCisgICAgJ2lzbzg4NTlfMTMnOiAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xMycsCisgICAgJ2lzbzg4NTlfMTQnOiAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xNCcsCisgICAgJ2lzbzg4NTlfMTUnOiAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xNScsCisgICAgJ2lzbzg4NTlfMTYnOiAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0xNicsCisgICAgJ2lzbzg4NTlfMic6ICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS0yJywKKyAgICAnaXNvODg1OV8zJzogICAgICAgICAgICAgICAgICAgICdJU084ODU5LTMnLAorICAgICdpc284ODU5XzQnOiAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktNCcsCisgICAgJ2lzbzg4NTlfNSc6ICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS01JywKKyAgICAnaXNvODg1OV82JzogICAgICAgICAgICAgICAgICAgICdJU084ODU5LTYnLAorICAgICdpc284ODU5XzcnOiAgICAgICAgICAgICAgICAgICAgJ0lTTzg4NTktNycsCisgICAgJ2lzbzg4NTlfOCc6ICAgICAgICAgICAgICAgICAgICAnSVNPODg1OS04JywKKyAgICAnaXNvODg1OV85JzogICAgICAgICAgICAgICAgICAgICdJU084ODU5LTknLAorICAgICdpc28yMDIyX2pwJzogICAgICAgICAgICAgICAgICAgJ0pJUzcnLAorICAgICdzaGlmdF9qaXMnOiAgICAgICAgICAgICAgICAgICAgJ1NKSVMnLAorICAgICd0YWN0aXMnOiAgICAgICAgICAgICAgICAgICAgICAgJ1RBQ1RJUycsCisgICAgJ2V1Y19qcCc6ICAgICAgICAgICAgICAgICAgICAgICAnZXVjSlAnLAorICAgICdldWNfa3InOiAgICAgICAgICAgICAgICAgICAgICAgJ2V1Y0tSJywKKyAgICAndXRmXzgnOiAgICAgICAgICAgICAgICAgICAgICAgICdVVEYtOCcsCisgICAgJ2tvaThfcic6ICAgICAgICAgICAgICAgICAgICAgICAnS09JOC1SJywKKyAgICAna29pOF91JzogICAgICAgICAgICAgICAgICAgICAgICdLT0k4LVUnLAorICAgICMgWFhYIFRoaXMgbGlzdCBpcyBzdGlsbCBpbmNvbXBsZXRlLiBJZiB5b3Uga25vdyBtb3JlCisgICAgIyBtYXBwaW5ncywgcGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0LiBUaGFua3MuCit9CisKKyMKKyMgVGhlIGxvY2FsZV9hbGlhcyB0YWJsZSBtYXBzIGxvd2VyY2FzZSBhbGlhcyBuYW1lcyB0byBDIGxvY2FsZSBuYW1lcworIyAoY2FzZS1zZW5zaXRpdmUpLiBFbmNvZGluZ3MgYXJlIGFsd2F5cyBzZXBhcmF0ZWQgZnJvbSB0aGUgbG9jYWxlCisjIG5hbWUgdXNpbmcgYSBkb3QgKCcuJyk7IHRoZXkgc2hvdWxkIG9ubHkgYmUgZ2l2ZW4gaW4gY2FzZSB0aGUKKyMgbGFuZ3VhZ2UgbmFtZSBpcyBuZWVkZWQgdG8gaW50ZXJwcmV0IHRoZSBnaXZlbiBlbmNvZGluZyBhbGlhcworIyBjb3JyZWN0bHkgKENKSyBjb2RlcyBvZnRlbiBoYXZlIHRoaXMgbmVlZCkuCisjCisjIE5vdGUgdGhhdCB0aGUgbm9ybWFsaXplKCkgZnVuY3Rpb24gd2hpY2ggdXNlcyB0aGlzIHRhYmxlcworIyByZW1vdmVzICdfJyBhbmQgJy0nIGNoYXJhY3RlcnMgZnJvbSB0aGUgZW5jb2RpbmcgcGFydCBvZiB0aGUKKyMgbG9jYWxlIG5hbWUgYmVmb3JlIGRvaW5nIHRoZSBsb29rdXAuIFRoaXMgc2F2ZXMgYSBsb3Qgb2YKKyMgc3BhY2UgaW4gdGhlIHRhYmxlLgorIworIyBNQUwgMjAwNC0xMi0xMDoKKyMgVXBkYXRlZCBhbGlhcyBtYXBwaW5nIHRvIG1vc3QgcmVjZW50IGxvY2FsZS5hbGlhcyBmaWxlCisjIGZyb20gWC5vcmcgZGlzdHJpYnV0aW9uIHVzaW5nIG1ha2Vsb2NhbGVhbGlhcy5weS4KKyMKKyMgVGhlc2UgYXJlIHRoZSBkaWZmZXJlbmNlcyBjb21wYXJlZCB0byB0aGUgb2xkIG1hcHBpbmcgKFB5dGhvbiAyLjQKKyMgYW5kIG9sZGVyKToKKyMKKyMgICAgdXBkYXRlZCAnYmcnIC0+ICdiZ19CRy5JU084ODU5LTUnIHRvICdiZ19CRy5DUDEyNTEnCisjICAgIHVwZGF0ZWQgJ2JnX2JnJyAtPiAnYmdfQkcuSVNPODg1OS01JyB0byAnYmdfQkcuQ1AxMjUxJworIyAgICB1cGRhdGVkICdidWxnYXJpYW4nIC0+ICdiZ19CRy5JU084ODU5LTUnIHRvICdiZ19CRy5DUDEyNTEnCisjICAgIHVwZGF0ZWQgJ2N6JyAtPiAnY3pfQ1ouSVNPODg1OS0yJyB0byAnY3NfQ1ouSVNPODg1OS0yJworIyAgICB1cGRhdGVkICdjel9jeicgLT4gJ2N6X0NaLklTTzg4NTktMicgdG8gJ2NzX0NaLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnY3plY2gnIC0+ICdjc19DUy5JU084ODU5LTInIHRvICdjc19DWi5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ2R1dGNoJyAtPiAnbmxfQkUuSVNPODg1OS0xJyB0byAnbmxfTkwuSVNPODg1OS0xJworIyAgICB1cGRhdGVkICdldCcgLT4gJ2V0X0VFLklTTzg4NTktNCcgdG8gJ2V0X0VFLklTTzg4NTktMTUnCisjICAgIHVwZGF0ZWQgJ2V0X2VlJyAtPiAnZXRfRUUuSVNPODg1OS00JyB0byAnZXRfRUUuSVNPODg1OS0xNScKKyMgICAgdXBkYXRlZCAnZmknIC0+ICdmaV9GSS5JU084ODU5LTEnIHRvICdmaV9GSS5JU084ODU5LTE1JworIyAgICB1cGRhdGVkICdmaV9maScgLT4gJ2ZpX0ZJLklTTzg4NTktMScgdG8gJ2ZpX0ZJLklTTzg4NTktMTUnCisjICAgIHVwZGF0ZWQgJ2l3JyAtPiAnaXdfSUwuSVNPODg1OS04JyB0byAnaGVfSUwuSVNPODg1OS04JworIyAgICB1cGRhdGVkICdpd19pbCcgLT4gJ2l3X0lMLklTTzg4NTktOCcgdG8gJ2hlX0lMLklTTzg4NTktOCcKKyMgICAgdXBkYXRlZCAnamFwYW5lc2UnIC0+ICdqYV9KUC5TSklTJyB0byAnamFfSlAuZXVjSlAnCisjICAgIHVwZGF0ZWQgJ2x0JyAtPiAnbHRfTFQuSVNPODg1OS00JyB0byAnbHRfTFQuSVNPODg1OS0xMycKKyMgICAgdXBkYXRlZCAnbHYnIC0+ICdsdl9MVi5JU084ODU5LTQnIHRvICdsdl9MVi5JU084ODU5LTEzJworIyAgICB1cGRhdGVkICdzbCcgLT4gJ3NsX0NTLklTTzg4NTktMicgdG8gJ3NsX1NJLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc2xvdmVuZScgLT4gJ3NsX0NTLklTTzg4NTktMicgdG8gJ3NsX1NJLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAndGhfdGgnIC0+ICd0aF9USC5UQUNUSVMnIHRvICd0aF9USC5JU084ODU5LTExJworIyAgICB1cGRhdGVkICd6aF9jbicgLT4gJ3poX0NOLmV1Y0NOJyB0byAnemhfQ04uZ2IyMzEyJworIyAgICB1cGRhdGVkICd6aF9jbi5iaWc1JyAtPiAnemhfVFcuZXVjVFcnIHRvICd6aF9UVy5iaWc1JworIyAgICB1cGRhdGVkICd6aF90dycgLT4gJ3poX1RXLmV1Y1RXJyB0byAnemhfVFcuYmlnNScKKyMKKyMgTUFMIDIwMDgtMDUtMzA6CisjIFVwZGF0ZWQgYWxpYXMgbWFwcGluZyB0byBtb3N0IHJlY2VudCBsb2NhbGUuYWxpYXMgZmlsZQorIyBmcm9tIFgub3JnIGRpc3RyaWJ1dGlvbiB1c2luZyBtYWtlbG9jYWxlYWxpYXMucHkuCisjCisjIFRoZXNlIGFyZSB0aGUgZGlmZmVyZW5jZXMgY29tcGFyZWQgdG8gdGhlIG9sZCBtYXBwaW5nIChQeXRob24gMi41CisjIGFuZCBvbGRlcik6CisjCisjICAgIHVwZGF0ZWQgJ2NzX2NzLmlzbzg4NTkyJyAtPiAnY3NfQ1ouSVNPODg1OS0yJyB0byAnY3NfQ1MuSVNPODg1OS0yJworIyAgICB1cGRhdGVkICdzZXJib2Nyb2F0aWFuJyAtPiAnc2hfWVUuSVNPODg1OS0yJyB0byAnc3JfQ1MuSVNPODg1OS0yJworIyAgICB1cGRhdGVkICdzaCcgLT4gJ3NoX1lVLklTTzg4NTktMicgdG8gJ3NyX0NTLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc2hfaHIuaXNvODg1OTInIC0+ICdzaF9IUi5JU084ODU5LTInIHRvICdocl9IUi5JU084ODU5LTInCisjICAgIHVwZGF0ZWQgJ3NoX3NwJyAtPiAnc2hfWVUuSVNPODg1OS0yJyB0byAnc3JfQ1MuSVNPODg1OS0yJworIyAgICB1cGRhdGVkICdzaF95dScgLT4gJ3NoX1lVLklTTzg4NTktMicgdG8gJ3NyX0NTLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc3AnIC0+ICdzcF9ZVS5JU084ODU5LTUnIHRvICdzcl9DUy5JU084ODU5LTUnCisjICAgIHVwZGF0ZWQgJ3NwX3l1JyAtPiAnc3BfWVUuSVNPODg1OS01JyB0byAnc3JfQ1MuSVNPODg1OS01JworIyAgICB1cGRhdGVkICdzcicgLT4gJ3NyX1lVLklTTzg4NTktNScgdG8gJ3NyX0NTLklTTzg4NTktNScKKyMgICAgdXBkYXRlZCAnc3JAY3lyaWxsaWMnIC0+ICdzcl9ZVS5JU084ODU5LTUnIHRvICdzcl9DUy5JU084ODU5LTUnCisjICAgIHVwZGF0ZWQgJ3NyX3NwJyAtPiAnc3JfU1AuSVNPODg1OS0yJyB0byAnc3JfQ1MuSVNPODg1OS0yJworIyAgICB1cGRhdGVkICdzcl95dScgLT4gJ3NyX1lVLklTTzg4NTktNScgdG8gJ3NyX0NTLklTTzg4NTktNScKKyMgICAgdXBkYXRlZCAnc3JfeXUuY3AxMjUxQGN5cmlsbGljJyAtPiAnc3JfWVUuQ1AxMjUxJyB0byAnc3JfQ1MuQ1AxMjUxJworIyAgICB1cGRhdGVkICdzcl95dS5pc284ODU5MicgLT4gJ3NyX1lVLklTTzg4NTktMicgdG8gJ3NyX0NTLklTTzg4NTktMicKKyMgICAgdXBkYXRlZCAnc3JfeXUuaXNvODg1OTUnIC0+ICdzcl9ZVS5JU084ODU5LTUnIHRvICdzcl9DUy5JU084ODU5LTUnCisjICAgIHVwZGF0ZWQgJ3NyX3l1Lmlzbzg4NTk1QGN5cmlsbGljJyAtPiAnc3JfWVUuSVNPODg1OS01JyB0byAnc3JfQ1MuSVNPODg1OS01JworIyAgICB1cGRhdGVkICdzcl95dS5taWNyb3NvZnRjcDEyNTFAY3lyaWxsaWMnIC0+ICdzcl9ZVS5DUDEyNTEnIHRvICdzcl9DUy5DUDEyNTEnCisjICAgIHVwZGF0ZWQgJ3NyX3l1LnV0ZjhAY3lyaWxsaWMnIC0+ICdzcl9ZVS5VVEYtOCcgdG8gJ3NyX0NTLlVURi04JworIyAgICB1cGRhdGVkICdzcl95dUBjeXJpbGxpYycgLT4gJ3NyX1lVLklTTzg4NTktNScgdG8gJ3NyX0NTLklTTzg4NTktNScKKyMKKyMgQVAgMjAxMC0wNC0xMjoKKyMgVXBkYXRlZCBhbGlhcyBtYXBwaW5nIHRvIG1vc3QgcmVjZW50IGxvY2FsZS5hbGlhcyBmaWxlCisjIGZyb20gWC5vcmcgZGlzdHJpYnV0aW9uIHVzaW5nIG1ha2Vsb2NhbGVhbGlhcy5weS4KKyMKKyMgVGhlc2UgYXJlIHRoZSBkaWZmZXJlbmNlcyBjb21wYXJlZCB0byB0aGUgb2xkIG1hcHBpbmcgKFB5dGhvbiAyLjYuNQorIyBhbmQgb2xkZXIpOgorIworIyAgICB1cGRhdGVkICdydScgLT4gJ3J1X1JVLklTTzg4NTktNScgdG8gJ3J1X1JVLlVURi04JworIyAgICB1cGRhdGVkICdydV9ydScgLT4gJ3J1X1JVLklTTzg4NTktNScgdG8gJ3J1X1JVLlVURi04JworIyAgICB1cGRhdGVkICdzZXJib2Nyb2F0aWFuJyAtPiAnc3JfQ1MuSVNPODg1OS0yJyB0byAnc3JfUlMuVVRGLThAbGF0aW4nCisjICAgIHVwZGF0ZWQgJ3NoJyAtPiAnc3JfQ1MuSVNPODg1OS0yJyB0byAnc3JfUlMuVVRGLThAbGF0aW4nCisjICAgIHVwZGF0ZWQgJ3NoX3l1JyAtPiAnc3JfQ1MuSVNPODg1OS0yJyB0byAnc3JfUlMuVVRGLThAbGF0aW4nCisjICAgIHVwZGF0ZWQgJ3NyJyAtPiAnc3JfQ1MuSVNPODg1OS01JyB0byAnc3JfUlMuVVRGLTgnCisjICAgIHVwZGF0ZWQgJ3NyQGN5cmlsbGljJyAtPiAnc3JfQ1MuSVNPODg1OS01JyB0byAnc3JfUlMuVVRGLTgnCisjICAgIHVwZGF0ZWQgJ3NyQGxhdG4nIC0+ICdzcl9DUy5JU084ODU5LTInIHRvICdzcl9SUy5VVEYtOEBsYXRpbicKKyMgICAgdXBkYXRlZCAnc3JfY3MudXRmOEBsYXRuJyAtPiAnc3JfQ1MuVVRGLTgnIHRvICdzcl9SUy5VVEYtOEBsYXRpbicKKyMgICAgdXBkYXRlZCAnc3JfY3NAbGF0bicgLT4gJ3NyX0NTLklTTzg4NTktMicgdG8gJ3NyX1JTLlVURi04QGxhdGluJworIyAgICB1cGRhdGVkICdzcl95dScgLT4gJ3NyX0NTLklTTzg4NTktNScgdG8gJ3NyX1JTLlVURi04QGxhdGluJworIyAgICB1cGRhdGVkICdzcl95dS51dGY4QGN5cmlsbGljJyAtPiAnc3JfQ1MuVVRGLTgnIHRvICdzcl9SUy5VVEYtOCcKKyMgICAgdXBkYXRlZCAnc3JfeXVAY3lyaWxsaWMnIC0+ICdzcl9DUy5JU084ODU5LTUnIHRvICdzcl9SUy5VVEYtOCcKKyMKKworbG9jYWxlX2FsaWFzID0geworICAgICdhMyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYTNfQVouS09JOC1DJywKKyAgICAnYTNfYXonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EzX0FaLktPSTgtQycsCisgICAgJ2EzX2F6LmtvaThjJzogICAgICAgICAgICAgICAgICAgICAgICAgICdhM19BWi5LT0k4LUMnLAorICAgICdhZic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWZfWkEuSVNPODg1OS0xJywKKyAgICAnYWZfemEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FmX1pBLklTTzg4NTktMScsCisgICAgJ2FmX3phLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdhZl9aQS5JU084ODU5LTEnLAorICAgICdhbSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1fRVQuVVRGLTgnLAorICAgICdhbV9ldCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYW1fRVQuVVRGLTgnLAorICAgICdhbWVyaWNhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnYW1lcmljYW4uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2FyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9BQS5JU084ODU5LTYnLAorICAgICdhcl9hYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfQUEuSVNPODg1OS02JywKKyAgICAnYXJfYWEuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0FBLklTTzg4NTktNicsCisgICAgJ2FyX2FlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9BRS5JU084ODU5LTYnLAorICAgICdhcl9hZS5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfQUUuSVNPODg1OS02JywKKyAgICAnYXJfYmgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0JILklTTzg4NTktNicsCisgICAgJ2FyX2JoLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9CSC5JU084ODU5LTYnLAorICAgICdhcl9keic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfRFouSVNPODg1OS02JywKKyAgICAnYXJfZHouaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0RaLklTTzg4NTktNicsCisgICAgJ2FyX2VnJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9FRy5JU084ODU5LTYnLAorICAgICdhcl9lZy5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfRUcuSVNPODg1OS02JywKKyAgICAnYXJfaXEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0lRLklTTzg4NTktNicsCisgICAgJ2FyX2lxLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9JUS5JU084ODU5LTYnLAorICAgICdhcl9qbyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfSk8uSVNPODg1OS02JywKKyAgICAnYXJfam8uaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0pPLklTTzg4NTktNicsCisgICAgJ2FyX2t3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9LVy5JU084ODU5LTYnLAorICAgICdhcl9rdy5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfS1cuSVNPODg1OS02JywKKyAgICAnYXJfbGInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0xCLklTTzg4NTktNicsCisgICAgJ2FyX2xiLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9MQi5JU084ODU5LTYnLAorICAgICdhcl9seSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfTFkuSVNPODg1OS02JywKKyAgICAnYXJfbHkuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX0xZLklTTzg4NTktNicsCisgICAgJ2FyX21hJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9NQS5JU084ODU5LTYnLAorICAgICdhcl9tYS5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfTUEuSVNPODg1OS02JywKKyAgICAnYXJfb20nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX09NLklTTzg4NTktNicsCisgICAgJ2FyX29tLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9PTS5JU084ODU5LTYnLAorICAgICdhcl9xYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfUUEuSVNPODg1OS02JywKKyAgICAnYXJfcWEuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1FBLklTTzg4NTktNicsCisgICAgJ2FyX3NhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9TQS5JU084ODU5LTYnLAorICAgICdhcl9zYS5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfU0EuSVNPODg1OS02JywKKyAgICAnYXJfc2QnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1NELklTTzg4NTktNicsCisgICAgJ2FyX3NkLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9TRC5JU084ODU5LTYnLAorICAgICdhcl9zeSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfU1kuSVNPODg1OS02JywKKyAgICAnYXJfc3kuaXNvODg1OTYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1NZLklTTzg4NTktNicsCisgICAgJ2FyX3RuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcl9UTi5JU084ODU5LTYnLAorICAgICdhcl90bi5pc284ODU5Nic6ICAgICAgICAgICAgICAgICAgICAgICAnYXJfVE4uSVNPODg1OS02JywKKyAgICAnYXJfeWUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyX1lFLklTTzg4NTktNicsCisgICAgJ2FyX3llLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgICdhcl9ZRS5JU084ODU5LTYnLAorICAgICdhcmFiaWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXJfQUEuSVNPODg1OS02JywKKyAgICAnYXJhYmljLmlzbzg4NTk2JzogICAgICAgICAgICAgICAgICAgICAgJ2FyX0FBLklTTzg4NTktNicsCisgICAgJ2FzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhc19JTi5VVEYtOCcsCisgICAgJ2F6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhel9BWi5JU084ODU5LTlFJywKKyAgICAnYXpfYXonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F6X0FaLklTTzg4NTktOUUnLAorICAgICdhel9hei5pc284ODU5OWUnOiAgICAgICAgICAgICAgICAgICAgICAnYXpfQVouSVNPODg1OS05RScsCisgICAgJ2JlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZV9CWS5DUDEyNTEnLAorICAgICdiZUBsYXRpbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmVfQlkuVVRGLThAbGF0aW4nLAorICAgICdiZV9ieSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmVfQlkuQ1AxMjUxJywKKyAgICAnYmVfYnkuY3AxMjUxJzogICAgICAgICAgICAgICAgICAgICAgICAgJ2JlX0JZLkNQMTI1MScsCisgICAgJ2JlX2J5Lm1pY3Jvc29mdGNwMTI1MSc6ICAgICAgICAgICAgICAgICdiZV9CWS5DUDEyNTEnLAorICAgICdiZV9ieS51dGY4QGxhdGluJzogICAgICAgICAgICAgICAgICAgICAnYmVfQlkuVVRGLThAbGF0aW4nLAorICAgICdiZV9ieUBsYXRpbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAnYmVfQlkuVVRGLThAbGF0aW4nLAorICAgICdiZyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmdfQkcuQ1AxMjUxJywKKyAgICAnYmdfYmcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnX0JHLkNQMTI1MScsCisgICAgJ2JnX2JnLmNwMTI1MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdiZ19CRy5DUDEyNTEnLAorICAgICdiZ19iZy5pc284ODU5NSc6ICAgICAgICAgICAgICAgICAgICAgICAnYmdfQkcuSVNPODg1OS01JywKKyAgICAnYmdfYmcua29pOHInOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnX0JHLktPSTgtUicsCisgICAgJ2JnX2JnLm1pY3Jvc29mdGNwMTI1MSc6ICAgICAgICAgICAgICAgICdiZ19CRy5DUDEyNTEnLAorICAgICdibl9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm5fSU4uVVRGLTgnLAorICAgICdib2ttYWwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xJywKKyAgICAnYm9rbVx4ZTVsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25iX05PLklTTzg4NTktMScsCisgICAgJ2JyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdicl9GUi5JU084ODU5LTEnLAorICAgICdicl9mcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnJfRlIuSVNPODg1OS0xJywKKyAgICAnYnJfZnIuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2JyX0ZSLklTTzg4NTktMScsCisgICAgJ2JyX2ZyLmlzbzg4NTkxNCc6ICAgICAgICAgICAgICAgICAgICAgICdicl9GUi5JU084ODU5LTE0JywKKyAgICAnYnJfZnIuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2JyX0ZSLklTTzg4NTktMTUnLAorICAgICdicl9mci5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnYnJfRlIuSVNPODg1OS0xNScsCisgICAgJ2JyX2ZyLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdicl9GUi5VVEYtOCcsCisgICAgJ2JyX2ZyQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdicl9GUi5JU084ODU5LTE1JywKKyAgICAnYnMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JzX0JBLklTTzg4NTktMicsCisgICAgJ2JzX2JhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdic19CQS5JU084ODU5LTInLAorICAgICdic19iYS5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnYnNfQkEuSVNPODg1OS0yJywKKyAgICAnYnVsZ2FyaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JnX0JHLkNQMTI1MScsCisgICAgJ2MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJywKKyAgICAnYy1mcmVuY2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NBLklTTzg4NTktMScsCisgICAgJ2MtZnJlbmNoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICdmcl9DQS5JU084ODU5LTEnLAorICAgICdjLmVuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCisgICAgJ2MuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTEnLAorICAgICdjX2MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQycsCisgICAgJ2NfYy5jJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJywKKyAgICAnY2EnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0VTLklTTzg4NTktMScsCisgICAgJ2NhX2FkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9BRC5JU084ODU5LTEnLAorICAgICdjYV9hZC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnY2FfQUQuSVNPODg1OS0xJywKKyAgICAnY2FfYWQuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2NhX0FELklTTzg4NTktMTUnLAorICAgICdjYV9hZC5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnY2FfQUQuSVNPODg1OS0xNScsCisgICAgJ2NhX2FkLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdjYV9BRC5VVEYtOCcsCisgICAgJ2NhX2FkQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9BRC5JU084ODU5LTE1JywKKyAgICAnY2FfZXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0VTLklTTzg4NTktMScsCisgICAgJ2NhX2VzLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdjYV9FUy5JU084ODU5LTEnLAorICAgICdjYV9lcy5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnY2FfRVMuSVNPODg1OS0xNScsCisgICAgJ2NhX2VzLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdjYV9FUy5JU084ODU5LTE1JywKKyAgICAnY2FfZXMudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2NhX0VTLlVURi04JywKKyAgICAnY2FfZXNAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0VTLklTTzg4NTktMTUnLAorICAgICdjYV9mcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FfRlIuSVNPODg1OS0xJywKKyAgICAnY2FfZnIuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0ZSLklTTzg4NTktMScsCisgICAgJ2NhX2ZyLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdjYV9GUi5JU084ODU5LTE1JywKKyAgICAnY2FfZnIuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2NhX0ZSLklTTzg4NTktMTUnLAorICAgICdjYV9mci51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnY2FfRlIuVVRGLTgnLAorICAgICdjYV9mckBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FfRlIuSVNPODg1OS0xNScsCisgICAgJ2NhX2l0JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9JVC5JU084ODU5LTEnLAorICAgICdjYV9pdC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnY2FfSVQuSVNPODg1OS0xJywKKyAgICAnY2FfaXQuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2NhX0lULklTTzg4NTktMTUnLAorICAgICdjYV9pdC5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnY2FfSVQuSVNPODg1OS0xNScsCisgICAgJ2NhX2l0LnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdjYV9JVC5VVEYtOCcsCisgICAgJ2NhX2l0QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYV9JVC5JU084ODU5LTE1JywKKyAgICAnY2F0YWxhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhX0VTLklTTzg4NTktMScsCisgICAgJ2NleHRlbmQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTEnLAorICAgICdjZXh0ZW5kLmVuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnY2hpbmVzZS1zJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0NOLmV1Y0NOJywKKyAgICAnY2hpbmVzZS10JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX1RXLmV1Y1RXJywKKyAgICAnY3JvYXRpYW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hyX0hSLklTTzg4NTktMicsCisgICAgJ2NzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc19DWi5JU084ODU5LTInLAorICAgICdjc19jcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKKyAgICAnY3NfY3MuaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ2NzX0NTLklTTzg4NTktMicsCisgICAgJ2NzX2N6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc19DWi5JU084ODU5LTInLAorICAgICdjc19jei5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKKyAgICAnY3knOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N5X0dCLklTTzg4NTktMScsCisgICAgJ2N5X2diJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjeV9HQi5JU084ODU5LTEnLAorICAgICdjeV9nYi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnY3lfR0IuSVNPODg1OS0xJywKKyAgICAnY3lfZ2IuaXNvODg1OTE0JzogICAgICAgICAgICAgICAgICAgICAgJ2N5X0dCLklTTzg4NTktMTQnLAorICAgICdjeV9nYi5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnY3lfR0IuSVNPODg1OS0xNScsCisgICAgJ2N5X2diQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjeV9HQi5JU084ODU5LTE1JywKKyAgICAnY3onOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NzX0NaLklTTzg4NTktMicsCisgICAgJ2N6X2N6JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjc19DWi5JU084ODU5LTInLAorICAgICdjemVjaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY3NfQ1ouSVNPODg1OS0yJywKKyAgICAnZGEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhX0RLLklTTzg4NTktMScsCisgICAgJ2RhLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTE1JywKKyAgICAnZGFfZGsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhX0RLLklTTzg4NTktMScsCisgICAgJ2RhX2RrLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTEnLAorICAgICdkYV9kay44ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xNScsCisgICAgJ2RhX2RrLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTEnLAorICAgICdkYV9kay5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xNScsCisgICAgJ2RhX2RrQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTE1JywKKyAgICAnZGFuaXNoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhX0RLLklTTzg4NTktMScsCisgICAgJ2RhbmlzaC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICdkYV9ESy5JU084ODU5LTEnLAorICAgICdkYW5zayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGFfREsuSVNPODg1OS0xJywKKyAgICAnZGUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMScsCisgICAgJ2RlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTE1JywKKyAgICAnZGVfYXQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0FULklTTzg4NTktMScsCisgICAgJ2RlX2F0Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdkZV9BVC5JU084ODU5LTEnLAorICAgICdkZV9hdC5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZGVfQVQuSVNPODg1OS0xNScsCisgICAgJ2RlX2F0Lmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdkZV9BVC5JU084ODU5LTE1JywKKyAgICAnZGVfYXQudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2RlX0FULlVURi04JywKKyAgICAnZGVfYXRAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0FULklTTzg4NTktMTUnLAorICAgICdkZV9iZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfQkUuSVNPODg1OS0xJywKKyAgICAnZGVfYmUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0JFLklTTzg4NTktMScsCisgICAgJ2RlX2JlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdkZV9CRS5JU084ODU5LTE1JywKKyAgICAnZGVfYmUuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2RlX0JFLklTTzg4NTktMTUnLAorICAgICdkZV9iZS51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnZGVfQkUuVVRGLTgnLAorICAgICdkZV9iZUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfQkUuSVNPODg1OS0xNScsCisgICAgJ2RlX2NoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9DSC5JU084ODU5LTEnLAorICAgICdkZV9jaC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZGVfQ0guSVNPODg1OS0xJywKKyAgICAnZGVfY2guaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2RlX0NILklTTzg4NTktMTUnLAorICAgICdkZV9jaEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfQ0guSVNPODg1OS0xNScsCisgICAgJ2RlX2RlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTEnLAorICAgICdkZV9kZS44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xJywKKyAgICAnZGVfZGUuODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMTUnLAorICAgICdkZV9kZS44ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xNScsCisgICAgJ2RlX2RlLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTEnLAorICAgICdkZV9kZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xNScsCisgICAgJ2RlX2RlLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTE1JywKKyAgICAnZGVfZGUudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLlVURi04JywKKyAgICAnZGVfZGVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMTUnLAorICAgICdkZV9sdSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfTFUuSVNPODg1OS0xJywKKyAgICAnZGVfbHUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0xVLklTTzg4NTktMScsCisgICAgJ2RlX2x1Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdkZV9MVS5JU084ODU5LTE1JywKKyAgICAnZGVfbHUuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2RlX0xVLklTTzg4NTktMTUnLAorICAgICdkZV9sdS51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnZGVfTFUuVVRGLTgnLAorICAgICdkZV9sdUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfTFUuSVNPODg1OS0xNScsCisgICAgJ2RldXRzY2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTEnLAorICAgICdkdXRjaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmxfTkwuSVNPODg1OS0xJywKKyAgICAnZHV0Y2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ25sX0JFLklTTzg4NTktMScsCisgICAgJ2VlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlZV9FRS5JU084ODU5LTQnLAorICAgICdlZV9lZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWVfRUUuSVNPODg1OS00JywKKyAgICAnZWVfZWUuaXNvODg1OTQnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VlX0VFLklTTzg4NTktNCcsCisgICAgJ2Vlc3RpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldF9FRS5JU084ODU5LTEnLAorICAgICdlbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxfR1IuSVNPODg1OS03JywKKyAgICAnZWxfZ3InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsX0dSLklTTzg4NTktNycsCisgICAgJ2VsX2dyLmlzbzg4NTk3JzogICAgICAgICAgICAgICAgICAgICAgICdlbF9HUi5JU084ODU5LTcnLAorICAgICdlbF9nckBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxfR1IuSVNPODg1OS0xNScsCisgICAgJ2VuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTEnLAorICAgICdlbi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW5fYXUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0FVLklTTzg4NTktMScsCisgICAgJ2VuX2F1Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlbl9BVS5JU084ODU5LTEnLAorICAgICdlbl9iZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fQkUuSVNPODg1OS0xJywKKyAgICAnZW5fYmVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0JFLklTTzg4NTktMTUnLAorICAgICdlbl9idyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fQlcuSVNPODg1OS0xJywKKyAgICAnZW5fYncuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0JXLklTTzg4NTktMScsCisgICAgJ2VuX2NhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9DQS5JU084ODU5LTEnLAorICAgICdlbl9jYS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fQ0EuSVNPODg1OS0xJywKKyAgICAnZW5fZ2InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMScsCisgICAgJ2VuX2diLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9HQi5JU084ODU5LTEnLAorICAgICdlbl9nYi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fR0IuSVNPODg1OS0xJywKKyAgICAnZW5fZ2IuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMTUnLAorICAgICdlbl9nYkBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fR0IuSVNPODg1OS0xNScsCisgICAgJ2VuX2hrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9ISy5JU084ODU5LTEnLAorICAgICdlbl9oay5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fSEsuSVNPODg1OS0xJywKKyAgICAnZW5faWUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0lFLklTTzg4NTktMScsCisgICAgJ2VuX2llLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlbl9JRS5JU084ODU5LTEnLAorICAgICdlbl9pZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZW5fSUUuSVNPODg1OS0xNScsCisgICAgJ2VuX2llLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdlbl9JRS5JU084ODU5LTE1JywKKyAgICAnZW5faWUudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2VuX0lFLlVURi04JywKKyAgICAnZW5faWVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0lFLklTTzg4NTktMTUnLAorICAgICdlbl9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fSU4uSVNPODg1OS0xJywKKyAgICAnZW5fbnonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX05aLklTTzg4NTktMScsCisgICAgJ2VuX256Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlbl9OWi5JU084ODU5LTEnLAorICAgICdlbl9waCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fUEguSVNPODg1OS0xJywKKyAgICAnZW5fcGguaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1BILklTTzg4NTktMScsCisgICAgJ2VuX3NnJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9TRy5JU084ODU5LTEnLAorICAgICdlbl9zZy5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fU0cuSVNPODg1OS0xJywKKyAgICAnZW5fdWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMScsCisgICAgJ2VuX3VzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTEnLAorICAgICdlbl91cy44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW5fdXMuODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMTUnLAorICAgICdlbl91cy5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW5fdXMuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMTUnLAorICAgICdlbl91cy5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xNScsCisgICAgJ2VuX3VzQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTE1JywKKyAgICAnZW5fdXNAZXVyb0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMTUnLAorICAgICdlbl96YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fWkEuSVNPODg1OS0xJywKKyAgICAnZW5femEuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1pBLklTTzg4NTktMScsCisgICAgJ2VuX3phLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlbl9aQS5JU084ODU5LTEnLAorICAgICdlbl96YS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZW5fWkEuSVNPODg1OS0xNScsCisgICAgJ2VuX3phQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9aQS5JU084ODU5LTE1JywKKyAgICAnZW5fencnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1pXLklTTzg4NTktMScsCisgICAgJ2VuX3p3Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlbl9aVy5JU084ODU5LTEnLAorICAgICdlbmdfZ2InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fR0IuSVNPODg1OS0xJywKKyAgICAnZW5nX2diLjg4NTknOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMScsCisgICAgJ2VuZ2xpc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9FTi5JU084ODU5LTEnLAorICAgICdlbmdsaXNoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAnZW5fRU4uSVNPODg1OS0xJywKKyAgICAnZW5nbGlzaF91ayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX0dCLklTTzg4NTktMScsCisgICAgJ2VuZ2xpc2hfdWsuODg1OSc6ICAgICAgICAgICAgICAgICAgICAgICdlbl9HQi5JU084ODU5LTEnLAorICAgICdlbmdsaXNoX3VuaXRlZC1zdGF0ZXMnOiAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW5nbGlzaF91bml0ZWQtc3RhdGVzLjQzNyc6ICAgICAgICAgICAgJ0MnLAorICAgICdlbmdsaXNoX3VzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnZW5nbGlzaF91cy44ODU5JzogICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMScsCisgICAgJ2VuZ2xpc2hfdXMuYXNjaWknOiAgICAgICAgICAgICAgICAgICAgICdlbl9VUy5JU084ODU5LTEnLAorICAgICdlbyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW9fWFguSVNPODg1OS0zJywKKyAgICAnZW9fZW8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VvX0VPLklTTzg4NTktMycsCisgICAgJ2VvX2VvLmlzbzg4NTkzJzogICAgICAgICAgICAgICAgICAgICAgICdlb19FTy5JU084ODU5LTMnLAorICAgICdlb194eCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW9fWFguSVNPODg1OS0zJywKKyAgICAnZW9feHguaXNvODg1OTMnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VvX1hYLklTTzg4NTktMycsCisgICAgJ2VzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTEnLAorICAgICdlc19hcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfQVIuSVNPODg1OS0xJywKKyAgICAnZXNfYXIuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0FSLklTTzg4NTktMScsCisgICAgJ2VzX2JvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19CTy5JU084ODU5LTEnLAorICAgICdlc19iby5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfQk8uSVNPODg1OS0xJywKKyAgICAnZXNfY2wnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0NMLklTTzg4NTktMScsCisgICAgJ2VzX2NsLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19DTC5JU084ODU5LTEnLAorICAgICdlc19jbyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfQ08uSVNPODg1OS0xJywKKyAgICAnZXNfY28uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0NPLklTTzg4NTktMScsCisgICAgJ2VzX2NyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19DUi5JU084ODU5LTEnLAorICAgICdlc19jci5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfQ1IuSVNPODg1OS0xJywKKyAgICAnZXNfZG8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0RPLklTTzg4NTktMScsCisgICAgJ2VzX2RvLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19ETy5JU084ODU5LTEnLAorICAgICdlc19lYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfRUMuSVNPODg1OS0xJywKKyAgICAnZXNfZWMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0VDLklTTzg4NTktMScsCisgICAgJ2VzX2VzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTEnLAorICAgICdlc19lcy44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfRVMuSVNPODg1OS0xJywKKyAgICAnZXNfZXMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0VTLklTTzg4NTktMScsCisgICAgJ2VzX2VzLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTE1JywKKyAgICAnZXNfZXMuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2VzX0VTLklTTzg4NTktMTUnLAorICAgICdlc19lcy51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnZXNfRVMuVVRGLTgnLAorICAgICdlc19lc0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfRVMuSVNPODg1OS0xNScsCisgICAgJ2VzX2d0JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19HVC5JU084ODU5LTEnLAorICAgICdlc19ndC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfR1QuSVNPODg1OS0xJywKKyAgICAnZXNfaG4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0hOLklTTzg4NTktMScsCisgICAgJ2VzX2huLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19ITi5JU084ODU5LTEnLAorICAgICdlc19teCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfTVguSVNPODg1OS0xJywKKyAgICAnZXNfbXguaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX01YLklTTzg4NTktMScsCisgICAgJ2VzX25pJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19OSS5JU084ODU5LTEnLAorICAgICdlc19uaS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfTkkuSVNPODg1OS0xJywKKyAgICAnZXNfcGEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1BBLklTTzg4NTktMScsCisgICAgJ2VzX3BhLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19QQS5JU084ODU5LTEnLAorICAgICdlc19wYS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZXNfUEEuSVNPODg1OS0xNScsCisgICAgJ2VzX3BhQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19QQS5JU084ODU5LTE1JywKKyAgICAnZXNfcGUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1BFLklTTzg4NTktMScsCisgICAgJ2VzX3BlLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19QRS5JU084ODU5LTEnLAorICAgICdlc19wZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZXNfUEUuSVNPODg1OS0xNScsCisgICAgJ2VzX3BlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19QRS5JU084ODU5LTE1JywKKyAgICAnZXNfcHInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1BSLklTTzg4NTktMScsCisgICAgJ2VzX3ByLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdlc19QUi5JU084ODU5LTEnLAorICAgICdlc19weSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfUFkuSVNPODg1OS0xJywKKyAgICAnZXNfcHkuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1BZLklTTzg4NTktMScsCisgICAgJ2VzX3B5Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdlc19QWS5JU084ODU5LTE1JywKKyAgICAnZXNfcHlAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1BZLklTTzg4NTktMTUnLAorICAgICdlc19zdic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfU1YuSVNPODg1OS0xJywKKyAgICAnZXNfc3YuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1NWLklTTzg4NTktMScsCisgICAgJ2VzX3N2Lmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdlc19TVi5JU084ODU5LTE1JywKKyAgICAnZXNfc3ZAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1NWLklTTzg4NTktMTUnLAorICAgICdlc191cyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfVVMuSVNPODg1OS0xJywKKyAgICAnZXNfdXMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2VzX1VTLklTTzg4NTktMScsCisgICAgJ2VzX3V5JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19VWS5JU084ODU5LTEnLAorICAgICdlc191eS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfVVkuSVNPODg1OS0xJywKKyAgICAnZXNfdXkuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VzX1VZLklTTzg4NTktMTUnLAorICAgICdlc191eUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfVVkuSVNPODg1OS0xNScsCisgICAgJ2VzX3ZlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc19WRS5JU084ODU5LTEnLAorICAgICdlc192ZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZXNfVkUuSVNPODg1OS0xJywKKyAgICAnZXNfdmUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2VzX1ZFLklTTzg4NTktMTUnLAorICAgICdlc192ZUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZXNfVkUuSVNPODg1OS0xNScsCisgICAgJ2VzdG9uaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldF9FRS5JU084ODU5LTEnLAorICAgICdldCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXRfRUUuSVNPODg1OS0xNScsCisgICAgJ2V0X2VlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldF9FRS5JU084ODU5LTE1JywKKyAgICAnZXRfZWUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2V0X0VFLklTTzg4NTktMScsCisgICAgJ2V0X2VlLmlzbzg4NTkxMyc6ICAgICAgICAgICAgICAgICAgICAgICdldF9FRS5JU084ODU5LTEzJywKKyAgICAnZXRfZWUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2V0X0VFLklTTzg4NTktMTUnLAorICAgICdldF9lZS5pc284ODU5NCc6ICAgICAgICAgICAgICAgICAgICAgICAnZXRfRUUuSVNPODg1OS00JywKKyAgICAnZXRfZWVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V0X0VFLklTTzg4NTktMTUnLAorICAgICdldSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXVfRVMuSVNPODg1OS0xJywKKyAgICAnZXVfZXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V1X0VTLklTTzg4NTktMScsCisgICAgJ2V1X2VzLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdldV9FUy5JU084ODU5LTEnLAorICAgICdldV9lcy5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZXVfRVMuSVNPODg1OS0xNScsCisgICAgJ2V1X2VzLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdldV9FUy5JU084ODU5LTE1JywKKyAgICAnZXVfZXMudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2V1X0VTLlVURi04JywKKyAgICAnZXVfZXNAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V1X0VTLklTTzg4NTktMTUnLAorICAgICdmYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFfSVIuVVRGLTgnLAorICAgICdmYV9pcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFfSVIuVVRGLTgnLAorICAgICdmYV9pci5pc2lyaTMzNDInOiAgICAgICAgICAgICAgICAgICAgICAnZmFfSVIuSVNJUkktMzM0MicsCisgICAgJ2ZpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5JU084ODU5LTE1JywKKyAgICAnZmkuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpX0ZJLklTTzg4NTktMTUnLAorICAgICdmaV9maSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlfRkkuSVNPODg1OS0xNScsCisgICAgJ2ZpX2ZpLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5JU084ODU5LTEnLAorICAgICdmaV9maS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZmlfRkkuSVNPODg1OS0xJywKKyAgICAnZmlfZmkuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2ZpX0ZJLklTTzg4NTktMTUnLAorICAgICdmaV9maS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZmlfRkkuSVNPODg1OS0xNScsCisgICAgJ2ZpX2ZpLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5VVEYtOCcsCisgICAgJ2ZpX2ZpQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5JU084ODU5LTE1JywKKyAgICAnZmlubmlzaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpX0ZJLklTTzg4NTktMScsCisgICAgJ2Zpbm5pc2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICdmaV9GSS5JU084ODU5LTEnLAorICAgICdmbyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9fRk8uSVNPODg1OS0xJywKKyAgICAnZm9fZm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvX0ZPLklTTzg4NTktMScsCisgICAgJ2ZvX2ZvLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdmb19GTy5JU084ODU5LTEnLAorICAgICdmb19mby5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZm9fRk8uSVNPODg1OS0xNScsCisgICAgJ2ZvX2ZvQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb19GTy5JU084ODU5LTE1JywKKyAgICAnZnInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMScsCisgICAgJ2ZyLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTE1JywKKyAgICAnZnJfYmUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0JFLklTTzg4NTktMScsCisgICAgJ2ZyX2JlLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9CRS5JU084ODU5LTEnLAorICAgICdmcl9iZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZnJfQkUuSVNPODg1OS0xJywKKyAgICAnZnJfYmUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2ZyX0JFLklTTzg4NTktMTUnLAorICAgICdmcl9iZS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnZnJfQkUuSVNPODg1OS0xNScsCisgICAgJ2ZyX2JlLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdmcl9CRS5VVEYtOCcsCisgICAgJ2ZyX2JlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9CRS5JU084ODU5LTE1JywKKyAgICAnZnJfY2EnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NBLklTTzg4NTktMScsCisgICAgJ2ZyX2NhLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9DQS5JU084ODU5LTEnLAorICAgICdmcl9jYS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZnJfQ0EuSVNPODg1OS0xJywKKyAgICAnZnJfY2EuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NBLklTTzg4NTktMTUnLAorICAgICdmcl9jYUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfQ0EuSVNPODg1OS0xNScsCisgICAgJ2ZyX2NoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9DSC5JU084ODU5LTEnLAorICAgICdmcl9jaC44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfQ0guSVNPODg1OS0xJywKKyAgICAnZnJfY2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NILklTTzg4NTktMScsCisgICAgJ2ZyX2NoLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdmcl9DSC5JU084ODU5LTE1JywKKyAgICAnZnJfY2hAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NILklTTzg4NTktMTUnLAorICAgICdmcl9mcic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xJywKKyAgICAnZnJfZnIuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMScsCisgICAgJ2ZyX2ZyLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTEnLAorICAgICdmcl9mci5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xNScsCisgICAgJ2ZyX2ZyLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTE1JywKKyAgICAnZnJfZnIudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLlVURi04JywKKyAgICAnZnJfZnJAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMTUnLAorICAgICdmcl9sdSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfTFUuSVNPODg1OS0xJywKKyAgICAnZnJfbHUuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0xVLklTTzg4NTktMScsCisgICAgJ2ZyX2x1Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdmcl9MVS5JU084ODU5LTEnLAorICAgICdmcl9sdS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZnJfTFUuSVNPODg1OS0xNScsCisgICAgJ2ZyX2x1Lmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdmcl9MVS5JU084ODU5LTE1JywKKyAgICAnZnJfbHUudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2ZyX0xVLlVURi04JywKKyAgICAnZnJfbHVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0xVLklTTzg4NTktMTUnLAorICAgICdmcmFuXHhlN2Fpcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xJywKKyAgICAnZnJlX2ZyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyX0ZSLklTTzg4NTktMScsCisgICAgJ2ZyZV9mci44ODU5JzogICAgICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTEnLAorICAgICdmcmVuY2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xJywKKyAgICAnZnJlbmNoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgJ2ZyX0NILklTTzg4NTktMScsCisgICAgJ2ZyZW5jaF9mcmFuY2UnOiAgICAgICAgICAgICAgICAgICAgICAgICdmcl9GUi5JU084ODU5LTEnLAorICAgICdmcmVuY2hfZnJhbmNlLjg4NTknOiAgICAgICAgICAgICAgICAgICAnZnJfRlIuSVNPODg1OS0xJywKKyAgICAnZ2EnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dhX0lFLklTTzg4NTktMScsCisgICAgJ2dhX2llJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnYV9JRS5JU084ODU5LTEnLAorICAgICdnYV9pZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZ2FfSUUuSVNPODg1OS0xJywKKyAgICAnZ2FfaWUuaXNvODg1OTE0JzogICAgICAgICAgICAgICAgICAgICAgJ2dhX0lFLklTTzg4NTktMTQnLAorICAgICdnYV9pZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZ2FfSUUuSVNPODg1OS0xNScsCisgICAgJ2dhX2llLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdnYV9JRS5JU084ODU5LTE1JywKKyAgICAnZ2FfaWUudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2dhX0lFLlVURi04JywKKyAgICAnZ2FfaWVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dhX0lFLklTTzg4NTktMTUnLAorICAgICdnYWxlZ28nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xfRVMuSVNPODg1OS0xJywKKyAgICAnZ2FsaWNpYW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsX0VTLklTTzg4NTktMScsCisgICAgJ2dkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZF9HQi5JU084ODU5LTEnLAorICAgICdnZF9nYic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2RfR0IuSVNPODg1OS0xJywKKyAgICAnZ2RfZ2IuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2dkX0dCLklTTzg4NTktMScsCisgICAgJ2dkX2diLmlzbzg4NTkxNCc6ICAgICAgICAgICAgICAgICAgICAgICdnZF9HQi5JU084ODU5LTE0JywKKyAgICAnZ2RfZ2IuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ2dkX0dCLklTTzg4NTktMTUnLAorICAgICdnZF9nYkBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2RfR0IuSVNPODg1OS0xNScsCisgICAgJ2dlcl9kZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZV9ERS5JU084ODU5LTEnLAorICAgICdnZXJfZGUuODg1OSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xJywKKyAgICAnZ2VybWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMScsCisgICAgJ2dlcm1hbi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICdkZV9DSC5JU084ODU5LTEnLAorICAgICdnZXJtYW5fZ2VybWFueSc6ICAgICAgICAgICAgICAgICAgICAgICAnZGVfREUuSVNPODg1OS0xJywKKyAgICAnZ2VybWFuX2dlcm1hbnkuODg1OSc6ICAgICAgICAgICAgICAgICAgJ2RlX0RFLklTTzg4NTktMScsCisgICAgJ2dsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnbF9FUy5JU084ODU5LTEnLAorICAgICdnbF9lcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xfRVMuSVNPODg1OS0xJywKKyAgICAnZ2xfZXMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2dsX0VTLklTTzg4NTktMScsCisgICAgJ2dsX2VzLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdnbF9FUy5JU084ODU5LTE1JywKKyAgICAnZ2xfZXMuaXNvODg1OTE1QGV1cm8nOiAgICAgICAgICAgICAgICAgJ2dsX0VTLklTTzg4NTktMTUnLAorICAgICdnbF9lcy51dGY4QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAnZ2xfRVMuVVRGLTgnLAorICAgICdnbF9lc0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZ2xfRVMuSVNPODg1OS0xNScsCisgICAgJ2dyZWVrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbF9HUi5JU084ODU5LTcnLAorICAgICdncmVlay5pc284ODU5Nyc6ICAgICAgICAgICAgICAgICAgICAgICAnZWxfR1IuSVNPODg1OS03JywKKyAgICAnZ3VfaW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2d1X0lOLlVURi04JywKKyAgICAnZ3YnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2d2X0dCLklTTzg4NTktMScsCisgICAgJ2d2X2diJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdndl9HQi5JU084ODU5LTEnLAorICAgICdndl9nYi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnZ3ZfR0IuSVNPODg1OS0xJywKKyAgICAnZ3ZfZ2IuaXNvODg1OTE0JzogICAgICAgICAgICAgICAgICAgICAgJ2d2X0dCLklTTzg4NTktMTQnLAorICAgICdndl9nYi5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnZ3ZfR0IuSVNPODg1OS0xNScsCisgICAgJ2d2X2diQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdndl9HQi5JU084ODU5LTE1JywKKyAgICAnaGUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hlX0lMLklTTzg4NTktOCcsCisgICAgJ2hlX2lsJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZV9JTC5JU084ODU5LTgnLAorICAgICdoZV9pbC5jcDEyNTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnaGVfSUwuQ1AxMjU1JywKKyAgICAnaGVfaWwuaXNvODg1OTgnOiAgICAgICAgICAgICAgICAgICAgICAgJ2hlX0lMLklTTzg4NTktOCcsCisgICAgJ2hlX2lsLm1pY3Jvc29mdGNwMTI1NSc6ICAgICAgICAgICAgICAgICdoZV9JTC5DUDEyNTUnLAorICAgICdoZWJyZXcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXdfSUwuSVNPODg1OS04JywKKyAgICAnaGVicmV3Lmlzbzg4NTk4JzogICAgICAgICAgICAgICAgICAgICAgJ2l3X0lMLklTTzg4NTktOCcsCisgICAgJ2hpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaV9JTi5JU0NJSS1ERVYnLAorICAgICdoaV9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGlfSU4uSVNDSUktREVWJywKKyAgICAnaGlfaW4uaXNjaWlkZXYnOiAgICAgICAgICAgICAgICAgICAgICAgJ2hpX0lOLklTQ0lJLURFVicsCisgICAgJ2huZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdobmVfSU4uVVRGLTgnLAorICAgICdocic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHJfSFIuSVNPODg1OS0yJywKKyAgICAnaHJfaHInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hyX0hSLklTTzg4NTktMicsCisgICAgJ2hyX2hyLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdocl9IUi5JU084ODU5LTInLAorICAgICdocnZhdHNraSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHJfSFIuSVNPODg1OS0yJywKKyAgICAnaHUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h1X0hVLklTTzg4NTktMicsCisgICAgJ2h1X2h1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdodV9IVS5JU084ODU5LTInLAorICAgICdodV9odS5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnaHVfSFUuSVNPODg1OS0yJywKKyAgICAnaHVuZ2FyaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2h1X0hVLklTTzg4NTktMicsCisgICAgJ2ljZWxhbmRpYyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc19JUy5JU084ODU5LTEnLAorICAgICdpY2VsYW5kaWMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAnaXNfSVMuSVNPODg1OS0xJywKKyAgICAnaWQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkX0lELklTTzg4NTktMScsCisgICAgJ2lkX2lkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZF9JRC5JU084ODU5LTEnLAorICAgICdpbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWRfSUQuSVNPODg1OS0xJywKKyAgICAnaW5faWQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lkX0lELklTTzg4NTktMScsCisgICAgJ2lzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc19JUy5JU084ODU5LTEnLAorICAgICdpc19pcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfSVMuSVNPODg1OS0xJywKKyAgICAnaXNfaXMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2lzX0lTLklTTzg4NTktMScsCisgICAgJ2lzX2lzLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdpc19JUy5JU084ODU5LTE1JywKKyAgICAnaXNfaXNAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzX0lTLklTTzg4NTktMTUnLAorICAgICdpc28tODg1OS0xJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnaXNvLTg4NTktMTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMTUnLAorICAgICdpc284ODU5LTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnaXNvODg1OS0xNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMTUnLAorICAgICdpc29fODg1OV8xJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnZW5fVVMuSVNPODg1OS0xJywKKyAgICAnaXNvXzg4NTlfMTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLklTTzg4NTktMTUnLAorICAgICdpdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXRfSVQuSVNPODg1OS0xJywKKyAgICAnaXQuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMTUnLAorICAgICdpdF9jaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXRfQ0guSVNPODg1OS0xJywKKyAgICAnaXRfY2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0NILklTTzg4NTktMScsCisgICAgJ2l0X2NoLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdpdF9DSC5JU084ODU5LTE1JywKKyAgICAnaXRfY2hAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0NILklTTzg4NTktMTUnLAorICAgICdpdF9pdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXRfSVQuSVNPODg1OS0xJywKKyAgICAnaXRfaXQuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMScsCisgICAgJ2l0X2l0Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdpdF9JVC5JU084ODU5LTEnLAorICAgICdpdF9pdC5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnaXRfSVQuSVNPODg1OS0xNScsCisgICAgJ2l0X2l0Lmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICdpdF9JVC5JU084ODU5LTE1JywKKyAgICAnaXRfaXQudXRmOEBldXJvJzogICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULlVURi04JywKKyAgICAnaXRfaXRAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMTUnLAorICAgICdpdGFsaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXRfSVQuSVNPODg1OS0xJywKKyAgICAnaXRhbGlhbi5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgJ2l0X0lULklTTzg4NTktMScsCisgICAgJ2l1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpdV9DQS5OVU5BQ09NLTgnLAorICAgICdpdV9jYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXVfQ0EuTlVOQUNPTS04JywKKyAgICAnaXVfY2EubnVuYWNvbTgnOiAgICAgICAgICAgICAgICAgICAgICAgJ2l1X0NBLk5VTkFDT00tOCcsCisgICAgJ2l3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZV9JTC5JU084ODU5LTgnLAorICAgICdpd19pbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVfSUwuSVNPODg1OS04JywKKyAgICAnaXdfaWwuaXNvODg1OTgnOiAgICAgICAgICAgICAgICAgICAgICAgJ2hlX0lMLklTTzg4NTktOCcsCisgICAgJ2phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5ldWNKUCcsCisgICAgJ2phLmppcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5KSVM3JywKKyAgICAnamEuc2ppcyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLlNKSVMnLAorICAgICdqYV9qcCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYV9qcC5hamVjJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYV9qcC5ldWMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYV9qcC5ldWNqcCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuZXVjSlAnLAorICAgICdqYV9qcC5pc28tMjAyMi1qcCc6ICAgICAgICAgICAgICAgICAgICAnamFfSlAuSklTNycsCisgICAgJ2phX2pwLmlzbzIwMjJqcCc6ICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5KSVM3JywKKyAgICAnamFfanAuamlzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLkpJUzcnLAorICAgICdqYV9qcC5qaXM3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuSklTNycsCisgICAgJ2phX2pwLm1zY29kZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5TSklTJywKKyAgICAnamFfanAucGNrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLlNKSVMnLAorICAgICdqYV9qcC5zamlzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnamFfSlAuU0pJUycsCisgICAgJ2phX2pwLnVqaXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5ldWNKUCcsCisgICAgJ2phcGFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5ldWNKUCcsCisgICAgJ2phcGFuZXNlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5ldWNKUCcsCisgICAgJ2phcGFuZXNlLWV1Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5ldWNKUCcsCisgICAgJ2phcGFuZXNlLmV1Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5ldWNKUCcsCisgICAgJ2phcGFuZXNlLnNqaXMnOiAgICAgICAgICAgICAgICAgICAgICAgICdqYV9KUC5TSklTJywKKyAgICAnanBfanAnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2phX0pQLmV1Y0pQJywKKyAgICAna2EnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2thX0dFLkdFT1JHSUFOLUFDQURFTVknLAorICAgICdrYV9nZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna2FfR0UuR0VPUkdJQU4tQUNBREVNWScsCisgICAgJ2thX2dlLmdlb3JnaWFuYWNhZGVteSc6ICAgICAgICAgICAgICAgICdrYV9HRS5HRU9SR0lBTi1BQ0FERU1ZJywKKyAgICAna2FfZ2UuZ2VvcmdpYW5wcyc6ICAgICAgICAgICAgICAgICAgICAgJ2thX0dFLkdFT1JHSUFOLVBTJywKKyAgICAna2FfZ2UuZ2VvcmdpYW5ycyc6ICAgICAgICAgICAgICAgICAgICAgJ2thX0dFLkdFT1JHSUFOLUFDQURFTVknLAorICAgICdrbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna2xfR0wuSVNPODg1OS0xJywKKyAgICAna2xfZ2wnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tsX0dMLklTTzg4NTktMScsCisgICAgJ2tsX2dsLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdrbF9HTC5JU084ODU5LTEnLAorICAgICdrbF9nbC5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAna2xfR0wuSVNPODg1OS0xNScsCisgICAgJ2tsX2dsQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdrbF9HTC5JU084ODU5LTE1JywKKyAgICAna21fa2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ttX0tILlVURi04JywKKyAgICAna24nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tuX0lOLlVURi04JywKKyAgICAna25faW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tuX0lOLlVURi04JywKKyAgICAna28nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tvX0tSLmV1Y0tSJywKKyAgICAna29fa3InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tvX0tSLmV1Y0tSJywKKyAgICAna29fa3IuZXVjJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tvX0tSLmV1Y0tSJywKKyAgICAna29fa3IuZXVja3InOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tvX0tSLmV1Y0tSJywKKyAgICAna29yZWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tvX0tSLmV1Y0tSJywKKyAgICAna29yZWFuLmV1Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tvX0tSLmV1Y0tSJywKKyAgICAna3MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tzX0lOLlVURi04JywKKyAgICAna3NfaW5AZGV2YW5hZ2FyaSc6ICAgICAgICAgICAgICAgICAgICAgJ2tzX0lOQGRldmFuYWdhcmkuVVRGLTgnLAorICAgICdrdyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna3dfR0IuSVNPODg1OS0xJywKKyAgICAna3dfZ2InOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2t3X0dCLklTTzg4NTktMScsCisgICAgJ2t3X2diLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdrd19HQi5JU084ODU5LTEnLAorICAgICdrd19nYi5pc284ODU5MTQnOiAgICAgICAgICAgICAgICAgICAgICAna3dfR0IuSVNPODg1OS0xNCcsCisgICAgJ2t3X2diLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdrd19HQi5JU084ODU5LTE1JywKKyAgICAna3dfZ2JAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2t3X0dCLklTTzg4NTktMTUnLAorICAgICdreSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna3lfS0cuVVRGLTgnLAorICAgICdreV9rZyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAna3lfS0cuVVRGLTgnLAorICAgICdsaXRodWFuaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnbHRfTFQuSVNPODg1OS0xMycsCisgICAgJ2xvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsb19MQS5NVUxFTEFPLTEnLAorICAgICdsb19sYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9fTEEuTVVMRUxBTy0xJywKKyAgICAnbG9fbGEuY3AxMTMzJzogICAgICAgICAgICAgICAgICAgICAgICAgJ2xvX0xBLklCTS1DUDExMzMnLAorICAgICdsb19sYS5pYm1jcDExMzMnOiAgICAgICAgICAgICAgICAgICAgICAnbG9fTEEuSUJNLUNQMTEzMycsCisgICAgJ2xvX2xhLm11bGVsYW8xJzogICAgICAgICAgICAgICAgICAgICAgICdsb19MQS5NVUxFTEFPLTEnLAorICAgICdsdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbHRfTFQuSVNPODg1OS0xMycsCisgICAgJ2x0X2x0JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsdF9MVC5JU084ODU5LTEzJywKKyAgICAnbHRfbHQuaXNvODg1OTEzJzogICAgICAgICAgICAgICAgICAgICAgJ2x0X0xULklTTzg4NTktMTMnLAorICAgICdsdF9sdC5pc284ODU5NCc6ICAgICAgICAgICAgICAgICAgICAgICAnbHRfTFQuSVNPODg1OS00JywKKyAgICAnbHYnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2x2X0xWLklTTzg4NTktMTMnLAorICAgICdsdl9sdic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbHZfTFYuSVNPODg1OS0xMycsCisgICAgJ2x2X2x2Lmlzbzg4NTkxMyc6ICAgICAgICAgICAgICAgICAgICAgICdsdl9MVi5JU084ODU5LTEzJywKKyAgICAnbHZfbHYuaXNvODg1OTQnOiAgICAgICAgICAgICAgICAgICAgICAgJ2x2X0xWLklTTzg4NTktNCcsCisgICAgJ21haSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWlfSU4uVVRGLTgnLAorICAgICdtaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWlfTlouSVNPODg1OS0xJywKKyAgICAnbWlfbnonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21pX05aLklTTzg4NTktMScsCisgICAgJ21pX256Lmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdtaV9OWi5JU084ODU5LTEnLAorICAgICdtayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWtfTUsuSVNPODg1OS01JywKKyAgICAnbWtfbWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21rX01LLklTTzg4NTktNScsCisgICAgJ21rX21rLmNwMTI1MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdta19NSy5DUDEyNTEnLAorICAgICdta19tay5pc284ODU5NSc6ICAgICAgICAgICAgICAgICAgICAgICAnbWtfTUsuSVNPODg1OS01JywKKyAgICAnbWtfbWsubWljcm9zb2Z0Y3AxMjUxJzogICAgICAgICAgICAgICAgJ21rX01LLkNQMTI1MScsCisgICAgJ21sJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtbF9JTi5VVEYtOCcsCisgICAgJ21yJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtcl9JTi5VVEYtOCcsCisgICAgJ21yX2luJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtcl9JTi5VVEYtOCcsCisgICAgJ21zJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtc19NWS5JU084ODU5LTEnLAorICAgICdtc19teSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXNfTVkuSVNPODg1OS0xJywKKyAgICAnbXNfbXkuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ21zX01ZLklTTzg4NTktMScsCisgICAgJ210JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtdF9NVC5JU084ODU5LTMnLAorICAgICdtdF9tdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbXRfTVQuSVNPODg1OS0zJywKKyAgICAnbXRfbXQuaXNvODg1OTMnOiAgICAgICAgICAgICAgICAgICAgICAgJ210X01ULklTTzg4NTktMycsCisgICAgJ25iJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTEnLAorICAgICduYl9ubyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xJywKKyAgICAnbmJfbm8uODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ25iX05PLklTTzg4NTktMScsCisgICAgJ25iX25vLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTEnLAorICAgICduYl9uby5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnbmJfTk8uSVNPODg1OS0xNScsCisgICAgJ25iX25vQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICduYl9OTy5JU084ODU5LTE1JywKKyAgICAnbmwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25sX05MLklTTzg4NTktMScsCisgICAgJ25sLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5JU084ODU5LTE1JywKKyAgICAnbmxfYmUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25sX0JFLklTTzg4NTktMScsCisgICAgJ25sX2JlLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdubF9CRS5JU084ODU5LTEnLAorICAgICdubF9iZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnbmxfQkUuSVNPODg1OS0xJywKKyAgICAnbmxfYmUuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ25sX0JFLklTTzg4NTktMTUnLAorICAgICdubF9iZS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnbmxfQkUuSVNPODg1OS0xNScsCisgICAgJ25sX2JlLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdubF9CRS5VVEYtOCcsCisgICAgJ25sX2JlQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdubF9CRS5JU084ODU5LTE1JywKKyAgICAnbmxfbmwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25sX05MLklTTzg4NTktMScsCisgICAgJ25sX25sLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5JU084ODU5LTEnLAorICAgICdubF9ubC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnbmxfTkwuSVNPODg1OS0xJywKKyAgICAnbmxfbmwuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ25sX05MLklTTzg4NTktMTUnLAorICAgICdubF9ubC5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnbmxfTkwuSVNPODg1OS0xNScsCisgICAgJ25sX25sLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5VVEYtOCcsCisgICAgJ25sX25sQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdubF9OTC5JU084ODU5LTE1JywKKyAgICAnbm4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25uX05PLklTTzg4NTktMScsCisgICAgJ25uX25vJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdubl9OTy5JU084ODU5LTEnLAorICAgICdubl9uby44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnbm5fTk8uSVNPODg1OS0xJywKKyAgICAnbm5fbm8uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ25uX05PLklTTzg4NTktMScsCisgICAgJ25uX25vLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdubl9OTy5JU084ODU5LTE1JywKKyAgICAnbm5fbm9AZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25uX05PLklTTzg4NTktMTUnLAorICAgICdubyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xJywKKyAgICAnbm9Abnlub3Jzayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ255X05PLklTTzg4NTktMScsCisgICAgJ25vX25vJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub19OTy5JU084ODU5LTEnLAorICAgICdub19uby44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xJywKKyAgICAnbm9fbm8uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ25vX05PLklTTzg4NTktMScsCisgICAgJ25vX25vLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdub19OTy5JU084ODU5LTE1JywKKyAgICAnbm9fbm8uaXNvODg1OTFAYm9rbWFsJzogICAgICAgICAgICAgICAgJ25vX05PLklTTzg4NTktMScsCisgICAgJ25vX25vLmlzbzg4NTkxQG55bm9yc2snOiAgICAgICAgICAgICAgICdub19OTy5JU084ODU5LTEnLAorICAgICdub19ub0BldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xNScsCisgICAgJ25vcndlZ2lhbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub19OTy5JU084ODU5LTEnLAorICAgICdub3J3ZWdpYW4uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAnbm9fTk8uSVNPODg1OS0xJywKKyAgICAnbnInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25yX1pBLklTTzg4NTktMScsCisgICAgJ25yX3phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICducl9aQS5JU084ODU5LTEnLAorICAgICducl96YS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnbnJfWkEuSVNPODg1OS0xJywKKyAgICAnbnNvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25zb19aQS5JU084ODU5LTE1JywKKyAgICAnbnNvX3phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25zb19aQS5JU084ODU5LTE1JywKKyAgICAnbnNvX3phLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgJ25zb19aQS5JU084ODU5LTE1JywKKyAgICAnbnknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ255X05PLklTTzg4NTktMScsCisgICAgJ255X25vJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdueV9OTy5JU084ODU5LTEnLAorICAgICdueV9uby44ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAnbnlfTk8uSVNPODg1OS0xJywKKyAgICAnbnlfbm8uaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ255X05PLklTTzg4NTktMScsCisgICAgJ255X25vLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdueV9OTy5JU084ODU5LTE1JywKKyAgICAnbnlfbm9AZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ255X05PLklTTzg4NTktMTUnLAorICAgICdueW5vcnNrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm5fTk8uSVNPODg1OS0xJywKKyAgICAnb2MnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29jX0ZSLklTTzg4NTktMScsCisgICAgJ29jX2ZyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvY19GUi5JU084ODU5LTEnLAorICAgICdvY19mci5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnb2NfRlIuSVNPODg1OS0xJywKKyAgICAnb2NfZnIuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ29jX0ZSLklTTzg4NTktMTUnLAorICAgICdvY19mckBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnb2NfRlIuSVNPODg1OS0xNScsCisgICAgJ29yJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcl9JTi5VVEYtOCcsCisgICAgJ3BhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYV9JTi5VVEYtOCcsCisgICAgJ3BhX2luJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYV9JTi5VVEYtOCcsCisgICAgJ3BkJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwZF9VUy5JU084ODU5LTEnLAorICAgICdwZF9kZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGRfREUuSVNPODg1OS0xJywKKyAgICAncGRfZGUuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3BkX0RFLklTTzg4NTktMScsCisgICAgJ3BkX2RlLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdwZF9ERS5JU084ODU5LTE1JywKKyAgICAncGRfZGVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BkX0RFLklTTzg4NTktMTUnLAorICAgICdwZF91cyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGRfVVMuSVNPODg1OS0xJywKKyAgICAncGRfdXMuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3BkX1VTLklTTzg4NTktMScsCisgICAgJ3BkX3VzLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICdwZF9VUy5JU084ODU5LTE1JywKKyAgICAncGRfdXNAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BkX1VTLklTTzg4NTktMTUnLAorICAgICdwaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGhfUEguSVNPODg1OS0xJywKKyAgICAncGhfcGgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BoX1BILklTTzg4NTktMScsCisgICAgJ3BoX3BoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdwaF9QSC5JU084ODU5LTEnLAorICAgICdwbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxfUEwuSVNPODg1OS0yJywKKyAgICAncGxfcGwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BsX1BMLklTTzg4NTktMicsCisgICAgJ3BsX3BsLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdwbF9QTC5JU084ODU5LTInLAorICAgICdwb2xpc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGxfUEwuSVNPODg1OS0yJywKKyAgICAncG9ydHVndWVzZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B0X1BULklTTzg4NTktMScsCisgICAgJ3BvcnR1Z3Vlc2UuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICdwdF9QVC5JU084ODU5LTEnLAorICAgICdwb3J0dWd1ZXNlX2JyYXppbCc6ICAgICAgICAgICAgICAgICAgICAncHRfQlIuSVNPODg1OS0xJywKKyAgICAncG9ydHVndWVzZV9icmF6aWwuODg1OSc6ICAgICAgICAgICAgICAgJ3B0X0JSLklTTzg4NTktMScsCisgICAgJ3Bvc2l4JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDJywKKyAgICAncG9zaXgtdXRmMic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0MnLAorICAgICdwcCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHBfQU4uSVNPODg1OS0xJywKKyAgICAncHBfYW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BwX0FOLklTTzg4NTktMScsCisgICAgJ3BwX2FuLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdwcF9BTi5JU084ODU5LTEnLAorICAgICdwdCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHRfUFQuSVNPODg1OS0xJywKKyAgICAncHQuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgICAgJ3B0X1BULklTTzg4NTktMTUnLAorICAgICdwdF9icic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncHRfQlIuSVNPODg1OS0xJywKKyAgICAncHRfYnIuODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B0X0JSLklTTzg4NTktMScsCisgICAgJ3B0X2JyLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICdwdF9CUi5JU084ODU5LTEnLAorICAgICdwdF9ici5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAncHRfQlIuSVNPODg1OS0xNScsCisgICAgJ3B0X2JyQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdF9CUi5JU084ODU5LTE1JywKKyAgICAncHRfcHQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3B0X1BULklTTzg4NTktMScsCisgICAgJ3B0X3B0Ljg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdwdF9QVC5JU084ODU5LTEnLAorICAgICdwdF9wdC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAncHRfUFQuSVNPODg1OS0xJywKKyAgICAncHRfcHQuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ3B0X1BULklTTzg4NTktMTUnLAorICAgICdwdF9wdC5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAncHRfUFQuSVNPODg1OS0xNScsCisgICAgJ3B0X3B0LnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdwdF9QVC5VVEYtOCcsCisgICAgJ3B0X3B0QGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdwdF9QVC5JU084ODU5LTE1JywKKyAgICAncm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JvX1JPLklTTzg4NTktMicsCisgICAgJ3JvX3JvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyb19STy5JU084ODU5LTInLAorICAgICdyb19yby5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAncm9fUk8uSVNPODg1OS0yJywKKyAgICAncm9tYW5pYW4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JvX1JPLklTTzg4NTktMicsCisgICAgJ3J1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydV9SVS5VVEYtOCcsCisgICAgJ3J1LmtvaThyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdydV9SVS5LT0k4LVInLAorICAgICdydV9ydSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVfUlUuVVRGLTgnLAorICAgICdydV9ydS5jcDEyNTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAncnVfUlUuQ1AxMjUxJywKKyAgICAncnVfcnUuaXNvODg1OTUnOiAgICAgICAgICAgICAgICAgICAgICAgJ3J1X1JVLklTTzg4NTktNScsCisgICAgJ3J1X3J1LmtvaThyJzogICAgICAgICAgICAgICAgICAgICAgICAgICdydV9SVS5LT0k4LVInLAorICAgICdydV9ydS5taWNyb3NvZnRjcDEyNTEnOiAgICAgICAgICAgICAgICAncnVfUlUuQ1AxMjUxJywKKyAgICAncnVfdWEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1X1VBLktPSTgtVScsCisgICAgJ3J1X3VhLmNwMTI1MSc6ICAgICAgICAgICAgICAgICAgICAgICAgICdydV9VQS5DUDEyNTEnLAorICAgICdydV91YS5rb2k4dSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAncnVfVUEuS09JOC1VJywKKyAgICAncnVfdWEubWljcm9zb2Z0Y3AxMjUxJzogICAgICAgICAgICAgICAgJ3J1X1VBLkNQMTI1MScsCisgICAgJ3J1bWFuaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyb19STy5JU084ODU5LTInLAorICAgICdydXNzaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncnVfUlUuSVNPODg1OS01JywKKyAgICAncncnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J3X1JXLklTTzg4NTktMScsCisgICAgJ3J3X3J3JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyd19SVy5JU084ODU5LTEnLAorICAgICdyd19ydy5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAncndfUlcuSVNPODg1OS0xJywKKyAgICAnc2QnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NkX0lOQGRldmFuYWdhcmkuVVRGLTgnLAorICAgICdzZV9ubyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VfTk8uVVRGLTgnLAorICAgICdzZXJib2Nyb2F0aWFuJzogICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzaF9iYS5pc284ODU5MkBib3NuaWEnOiAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS0yJywKKyAgICAnc2hfaHInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NoX0hSLklTTzg4NTktMicsCisgICAgJ3NoX2hyLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdocl9IUi5JU084ODU5LTInLAorICAgICdzaF9zcCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS0yJywKKyAgICAnc2hfeXUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NyX1JTLlVURi04QGxhdGluJywKKyAgICAnc2knOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpX0xLLlVURi04JywKKyAgICAnc2lfbGsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpX0xLLlVURi04JywKKyAgICAnc2luaGFsYSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpX0xLLlVURi04JywKKyAgICAnc2snOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NrX1NLLklTTzg4NTktMicsCisgICAgJ3NrX3NrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza19TSy5JU084ODU5LTInLAorICAgICdza19zay5pc284ODU5Mic6ICAgICAgICAgICAgICAgICAgICAgICAnc2tfU0suSVNPODg1OS0yJywKKyAgICAnc2wnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NsX1NJLklTTzg4NTktMicsCisgICAgJ3NsX2NzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzbF9DUy5JU084ODU5LTInLAorICAgICdzbF9zaSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2xfU0kuSVNPODg1OS0yJywKKyAgICAnc2xfc2kuaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ3NsX1NJLklTTzg4NTktMicsCisgICAgJ3Nsb3Zhayc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdza19TSy5JU084ODU5LTInLAorICAgICdzbG92ZW5lJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2xfU0kuSVNPODg1OS0yJywKKyAgICAnc2xvdmVuaWFuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NsX1NJLklTTzg4NTktMicsCisgICAgJ3NwJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9DUy5JU084ODU5LTUnLAorICAgICdzcF95dSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS01JywKKyAgICAnc3BhbmlzaCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VzX0VTLklTTzg4NTktMScsCisgICAgJ3NwYW5pc2guaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICdlc19FUy5JU084ODU5LTEnLAorICAgICdzcGFuaXNoX3NwYWluJzogICAgICAgICAgICAgICAgICAgICAgICAnZXNfRVMuSVNPODg1OS0xJywKKyAgICAnc3BhbmlzaF9zcGFpbi44ODU5JzogICAgICAgICAgICAgICAgICAgJ2VzX0VTLklTTzg4NTktMScsCisgICAgJ3NxJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcV9BTC5JU084ODU5LTInLAorICAgICdzcV9hbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3FfQUwuSVNPODg1OS0yJywKKyAgICAnc3FfYWwuaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ3NxX0FMLklTTzg4NTktMicsCisgICAgJ3NyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOCcsCisgICAgJ3NyQGN5cmlsbGljJzogICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOCcsCisgICAgJ3NyQGxhdGluJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NyQGxhdG4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NyX2NzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOCcsCisgICAgJ3NyX2NzLmlzbzg4NTkyJzogICAgICAgICAgICAgICAgICAgICAgICdzcl9DUy5JU084ODU5LTInLAorICAgICdzcl9jcy5pc284ODU5MkBsYXRuJzogICAgICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS0yJywKKyAgICAnc3JfY3MuaXNvODg1OTUnOiAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktNScsCisgICAgJ3NyX2NzLnV0ZjhAbGF0bic6ICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NyX2NzQGxhdG4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NyX21lJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9NRS5VVEYtOCcsCisgICAgJ3NyX3JzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOCcsCisgICAgJ3NyX3JzLnV0ZjhAbGF0bic6ICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NyX3JzQGxhdGluJzogICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NyX3JzQGxhdG4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOEBsYXRpbicsCisgICAgJ3NyX3NwJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcl9DUy5JU084ODU5LTInLAorICAgICdzcl95dSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3JfUlMuVVRGLThAbGF0aW4nLAorICAgICdzcl95dS5jcDEyNTFAY3lyaWxsaWMnOiAgICAgICAgICAgICAgICAnc3JfQ1MuQ1AxMjUxJywKKyAgICAnc3JfeXUuaXNvODg1OTInOiAgICAgICAgICAgICAgICAgICAgICAgJ3NyX0NTLklTTzg4NTktMicsCisgICAgJ3NyX3l1Lmlzbzg4NTk1JzogICAgICAgICAgICAgICAgICAgICAgICdzcl9DUy5JU084ODU5LTUnLAorICAgICdzcl95dS5pc284ODU5NUBjeXJpbGxpYyc6ICAgICAgICAgICAgICAnc3JfQ1MuSVNPODg1OS01JywKKyAgICAnc3JfeXUubWljcm9zb2Z0Y3AxMjUxQGN5cmlsbGljJzogICAgICAgJ3NyX0NTLkNQMTI1MScsCisgICAgJ3NyX3l1LnV0ZjhAY3lyaWxsaWMnOiAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOCcsCisgICAgJ3NyX3l1QGN5cmlsbGljJzogICAgICAgICAgICAgICAgICAgICAgICdzcl9SUy5VVEYtOCcsCisgICAgJ3NzJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzc19aQS5JU084ODU5LTEnLAorICAgICdzc196YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3NfWkEuSVNPODg1OS0xJywKKyAgICAnc3NfemEuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3NzX1pBLklTTzg4NTktMScsCisgICAgJ3N0JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdF9aQS5JU084ODU5LTEnLAorICAgICdzdF96YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RfWkEuSVNPODg1OS0xJywKKyAgICAnc3RfemEuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3N0X1pBLklTTzg4NTktMScsCisgICAgJ3N2JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdl9TRS5JU084ODU5LTEnLAorICAgICdzdi5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZfU0UuSVNPODg1OS0xNScsCisgICAgJ3N2X2ZpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdl9GSS5JU084ODU5LTEnLAorICAgICdzdl9maS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnc3ZfRkkuSVNPODg1OS0xJywKKyAgICAnc3ZfZmkuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ3N2X0ZJLklTTzg4NTktMTUnLAorICAgICdzdl9maS5pc284ODU5MTVAZXVybyc6ICAgICAgICAgICAgICAgICAnc3ZfRkkuSVNPODg1OS0xNScsCisgICAgJ3N2X2ZpLnV0ZjhAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICdzdl9GSS5VVEYtOCcsCisgICAgJ3N2X2ZpQGV1cm8nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdl9GSS5JU084ODU5LTE1JywKKyAgICAnc3Zfc2UnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N2X1NFLklTTzg4NTktMScsCisgICAgJ3N2X3NlLjg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICAgICdzdl9TRS5JU084ODU5LTEnLAorICAgICdzdl9zZS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAnc3ZfU0UuSVNPODg1OS0xJywKKyAgICAnc3Zfc2UuaXNvODg1OTE1JzogICAgICAgICAgICAgICAgICAgICAgJ3N2X1NFLklTTzg4NTktMTUnLAorICAgICdzdl9zZUBldXJvJzogICAgICAgICAgICAgICAgICAgICAgICAgICAnc3ZfU0UuSVNPODg1OS0xNScsCisgICAgJ3N3ZWRpc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdl9TRS5JU084ODU5LTEnLAorICAgICdzd2VkaXNoLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAnc3ZfU0UuSVNPODg1OS0xJywKKyAgICAndGEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RhX0lOLlRTQ0lJLTAnLAorICAgICd0YV9pbic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGFfSU4uVFNDSUktMCcsCisgICAgJ3RhX2luLnRzY2lpJzogICAgICAgICAgICAgICAgICAgICAgICAgICd0YV9JTi5UU0NJSS0wJywKKyAgICAndGFfaW4udHNjaWkwJzogICAgICAgICAgICAgICAgICAgICAgICAgJ3RhX0lOLlRTQ0lJLTAnLAorICAgICd0ZSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVfSU4uVVRGLTgnLAorICAgICd0Zyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGdfVEouS09JOC1DJywKKyAgICAndGdfdGonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RnX1RKLktPSTgtQycsCisgICAgJ3RnX3RqLmtvaThjJzogICAgICAgICAgICAgICAgICAgICAgICAgICd0Z19USi5LT0k4LUMnLAorICAgICd0aCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGhfVEguSVNPODg1OS0xMScsCisgICAgJ3RoX3RoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aF9USC5JU084ODU5LTExJywKKyAgICAndGhfdGguaXNvODg1OTExJzogICAgICAgICAgICAgICAgICAgICAgJ3RoX1RILklTTzg4NTktMTEnLAorICAgICd0aF90aC50YWN0aXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAndGhfVEguVElTNjIwJywKKyAgICAndGhfdGgudGlzNjIwJzogICAgICAgICAgICAgICAgICAgICAgICAgJ3RoX1RILlRJUzYyMCcsCisgICAgJ3RoYWknOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aF9USC5JU084ODU5LTExJywKKyAgICAndGwnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RsX1BILklTTzg4NTktMScsCisgICAgJ3RsX3BoJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0bF9QSC5JU084ODU5LTEnLAorICAgICd0bF9waC5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAndGxfUEguSVNPODg1OS0xJywKKyAgICAndG4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RuX1pBLklTTzg4NTktMTUnLAorICAgICd0bl96YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndG5fWkEuSVNPODg1OS0xNScsCisgICAgJ3RuX3phLmlzbzg4NTkxNSc6ICAgICAgICAgICAgICAgICAgICAgICd0bl9aQS5JU084ODU5LTE1JywKKyAgICAndHInOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RyX1RSLklTTzg4NTktOScsCisgICAgJ3RyX3RyJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cl9UUi5JU084ODU5LTknLAorICAgICd0cl90ci5pc284ODU5OSc6ICAgICAgICAgICAgICAgICAgICAgICAndHJfVFIuSVNPODg1OS05JywKKyAgICAndHMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RzX1pBLklTTzg4NTktMScsCisgICAgJ3RzX3phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0c19aQS5JU084ODU5LTEnLAorICAgICd0c196YS5pc284ODU5MSc6ICAgICAgICAgICAgICAgICAgICAgICAndHNfWkEuSVNPODg1OS0xJywKKyAgICAndHQnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3R0X1JVLlRBVEFSLUNZUicsCisgICAgJ3R0X3J1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0dF9SVS5UQVRBUi1DWVInLAorICAgICd0dF9ydS5rb2k4Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAndHRfUlUuS09JOC1DJywKKyAgICAndHRfcnUudGF0YXJjeXInOiAgICAgICAgICAgICAgICAgICAgICAgJ3R0X1JVLlRBVEFSLUNZUicsCisgICAgJ3R1cmtpc2gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0cl9UUi5JU084ODU5LTknLAorICAgICd0dXJraXNoLmlzbzg4NTk5JzogICAgICAgICAgICAgICAgICAgICAndHJfVFIuSVNPODg1OS05JywKKyAgICAndWsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VrX1VBLktPSTgtVScsCisgICAgJ3VrX3VhJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1a19VQS5LT0k4LVUnLAorICAgICd1a191YS5jcDEyNTEnOiAgICAgICAgICAgICAgICAgICAgICAgICAndWtfVUEuQ1AxMjUxJywKKyAgICAndWtfdWEuaXNvODg1OTUnOiAgICAgICAgICAgICAgICAgICAgICAgJ3VrX1VBLklTTzg4NTktNScsCisgICAgJ3VrX3VhLmtvaTh1JzogICAgICAgICAgICAgICAgICAgICAgICAgICd1a19VQS5LT0k4LVUnLAorICAgICd1a191YS5taWNyb3NvZnRjcDEyNTEnOiAgICAgICAgICAgICAgICAndWtfVUEuQ1AxMjUxJywKKyAgICAndW5pdic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VuX1VTLnV0ZicsCisgICAgJ3VuaXZlcnNhbCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbl9VUy51dGYnLAorICAgICd1bml2ZXJzYWwudXRmOEB1Y3M0JzogICAgICAgICAgICAgICAgICAnZW5fVVMuVVRGLTgnLAorICAgICd1cic6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXJfUEsuQ1AxMjU2JywKKyAgICAndXJfcGsnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VyX1BLLkNQMTI1NicsCisgICAgJ3VyX3BrLmNwMTI1Nic6ICAgICAgICAgICAgICAgICAgICAgICAgICd1cl9QSy5DUDEyNTYnLAorICAgICd1cl9way5taWNyb3NvZnRjcDEyNTYnOiAgICAgICAgICAgICAgICAndXJfUEsuQ1AxMjU2JywKKyAgICAndXonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3V6X1VaLlVURi04JywKKyAgICAndXpfdXonOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3V6X1VaLlVURi04JywKKyAgICAndXpfdXouaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3V6X1VaLklTTzg4NTktMScsCisgICAgJ3V6X3V6LnV0ZjhAY3lyaWxsaWMnOiAgICAgICAgICAgICAgICAgICd1el9VWi5VVEYtOCcsCisgICAgJ3V6X3V6QGN5cmlsbGljJzogICAgICAgICAgICAgICAgICAgICAgICd1el9VWi5VVEYtOCcsCisgICAgJ3ZlJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZV9aQS5VVEYtOCcsCisgICAgJ3ZlX3phJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZV9aQS5VVEYtOCcsCisgICAgJ3ZpJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aV9WTi5UQ1ZOJywKKyAgICAndmlfdm4nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpX1ZOLlRDVk4nLAorICAgICd2aV92bi50Y3ZuJzogICAgICAgICAgICAgICAgICAgICAgICAgICAndmlfVk4uVENWTicsCisgICAgJ3ZpX3ZuLnRjdm41NzEyJzogICAgICAgICAgICAgICAgICAgICAgICd2aV9WTi5UQ1ZOJywKKyAgICAndmlfdm4udmlzY2lpJzogICAgICAgICAgICAgICAgICAgICAgICAgJ3ZpX1ZOLlZJU0NJSScsCisgICAgJ3ZpX3ZuLnZpc2NpaTExMSc6ICAgICAgICAgICAgICAgICAgICAgICd2aV9WTi5WSVNDSUknLAorICAgICd3YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FfQkUuSVNPODg1OS0xJywKKyAgICAnd2FfYmUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhX0JFLklTTzg4NTktMScsCisgICAgJ3dhX2JlLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICd3YV9CRS5JU084ODU5LTEnLAorICAgICd3YV9iZS5pc284ODU5MTUnOiAgICAgICAgICAgICAgICAgICAgICAnd2FfQkUuSVNPODg1OS0xNScsCisgICAgJ3dhX2JlLmlzbzg4NTkxNUBldXJvJzogICAgICAgICAgICAgICAgICd3YV9CRS5JU084ODU5LTE1JywKKyAgICAnd2FfYmVAZXVybyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhX0JFLklTTzg4NTktMTUnLAorICAgICd4aCc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneGhfWkEuSVNPODg1OS0xJywKKyAgICAneGhfemEnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3hoX1pBLklTTzg4NTktMScsCisgICAgJ3hoX3phLmlzbzg4NTkxJzogICAgICAgICAgICAgICAgICAgICAgICd4aF9aQS5JU084ODU5LTEnLAorICAgICd5aSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAneWlfVVMuQ1AxMjU1JywKKyAgICAneWlfdXMnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3lpX1VTLkNQMTI1NScsCisgICAgJ3lpX3VzLmNwMTI1NSc6ICAgICAgICAgICAgICAgICAgICAgICAgICd5aV9VUy5DUDEyNTUnLAorICAgICd5aV91cy5taWNyb3NvZnRjcDEyNTUnOiAgICAgICAgICAgICAgICAneWlfVVMuQ1AxMjU1JywKKyAgICAnemgnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0NOLmV1Y0NOJywKKyAgICAnemhfY24nOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0NOLmdiMjMxMicsCisgICAgJ3poX2NuLmJpZzUnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9UVy5iaWc1JywKKyAgICAnemhfY24uZXVjJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0NOLmV1Y0NOJywKKyAgICAnemhfY24uZ2IxODAzMCc6ICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0NOLmdiMTgwMzAnLAorICAgICd6aF9jbi5nYjIzMTInOiAgICAgICAgICAgICAgICAgICAgICAgICAnemhfQ04uZ2IyMzEyJywKKyAgICAnemhfY24uZ2JrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX0NOLmdiaycsCisgICAgJ3poX2hrJzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9ISy5iaWc1aGtzY3MnLAorICAgICd6aF9oay5iaWc1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAnemhfSEsuYmlnNScsCisgICAgJ3poX2hrLmJpZzVoayc6ICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9ISy5iaWc1aGtzY3MnLAorICAgICd6aF9oay5iaWc1aGtzY3MnOiAgICAgICAgICAgICAgICAgICAgICAnemhfSEsuYmlnNWhrc2NzJywKKyAgICAnemhfdHcnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3poX1RXLmJpZzUnLAorICAgICd6aF90dy5iaWc1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAnemhfVFcuYmlnNScsCisgICAgJ3poX3R3LmV1Yyc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9UVy5ldWNUVycsCisgICAgJ3poX3R3LmV1Y3R3JzogICAgICAgICAgICAgICAgICAgICAgICAgICd6aF9UVy5ldWNUVycsCisgICAgJ3p1JzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6dV9aQS5JU084ODU5LTEnLAorICAgICd6dV96YSc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnenVfWkEuSVNPODg1OS0xJywKKyAgICAnenVfemEuaXNvODg1OTEnOiAgICAgICAgICAgICAgICAgICAgICAgJ3p1X1pBLklTTzg4NTktMScsCit9CisKKyMKKyMgVGhpcyBtYXBzIFdpbmRvd3MgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgdG8gbG9jYWxlIHN0cmluZ3MuCisjCisjIFRoaXMgbGlzdCBoYXMgYmVlbiB1cGRhdGVkIGZyb20KKyMgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9saWJyYXJ5L2RlZmF1bHQuYXNwP3VybD0vbGlicmFyeS9lbi11cy9pbnRsL25sc18yMzh6LmFzcAorIyB0byBpbmNsdWRlIGV2ZXJ5IGxvY2FsZSB1cCB0byBXaW5kb3dzIFZpc3RhLgorIworIyBOT1RFOiB0aGlzIG1hcHBpbmcgaXMgaW5jb21wbGV0ZS4gIElmIHlvdXIgbGFuZ3VhZ2UgaXMgbWlzc2luZywgcGxlYXNlCisjIHN1Ym1pdCBhIGJ1ZyByZXBvcnQgdG8gdGhlIFB5dGhvbiBidWcgdHJhY2tlciBhdCBodHRwOi8vYnVncy5weXRob24ub3JnLworIyBNYWtlIHN1cmUgeW91IGluY2x1ZGUgdGhlIG1pc3NpbmcgbGFuZ3VhZ2UgaWRlbnRpZmllciBhbmQgdGhlIHN1Z2dlc3RlZAorIyBsb2NhbGUgY29kZS4KKyMKKword2luZG93c19sb2NhbGUgPSB7CisgICAgMHgwNDM2OiAiYWZfWkEiLCAjIEFmcmlrYWFucworICAgIDB4MDQxYzogInNxX0FMIiwgIyBBbGJhbmlhbgorICAgIDB4MDQ4NDogImdzd19GUiIsIyBBbHNhdGlhbiAtIEZyYW5jZQorICAgIDB4MDQ1ZTogImFtX0VUIiwgIyBBbWhhcmljIC0gRXRoaW9waWEKKyAgICAweDA0MDE6ICJhcl9TQSIsICMgQXJhYmljIC0gU2F1ZGkgQXJhYmlhCisgICAgMHgwODAxOiAiYXJfSVEiLCAjIEFyYWJpYyAtIElyYXEKKyAgICAweDBjMDE6ICJhcl9FRyIsICMgQXJhYmljIC0gRWd5cHQKKyAgICAweDEwMDE6ICJhcl9MWSIsICMgQXJhYmljIC0gTGlieWEKKyAgICAweDE0MDE6ICJhcl9EWiIsICMgQXJhYmljIC0gQWxnZXJpYQorICAgIDB4MTgwMTogImFyX01BIiwgIyBBcmFiaWMgLSBNb3JvY2NvCisgICAgMHgxYzAxOiAiYXJfVE4iLCAjIEFyYWJpYyAtIFR1bmlzaWEKKyAgICAweDIwMDE6ICJhcl9PTSIsICMgQXJhYmljIC0gT21hbgorICAgIDB4MjQwMTogImFyX1lFIiwgIyBBcmFiaWMgLSBZZW1lbgorICAgIDB4MjgwMTogImFyX1NZIiwgIyBBcmFiaWMgLSBTeXJpYQorICAgIDB4MmMwMTogImFyX0pPIiwgIyBBcmFiaWMgLSBKb3JkYW4KKyAgICAweDMwMDE6ICJhcl9MQiIsICMgQXJhYmljIC0gTGViYW5vbgorICAgIDB4MzQwMTogImFyX0tXIiwgIyBBcmFiaWMgLSBLdXdhaXQKKyAgICAweDM4MDE6ICJhcl9BRSIsICMgQXJhYmljIC0gVW5pdGVkIEFyYWIgRW1pcmF0ZXMKKyAgICAweDNjMDE6ICJhcl9CSCIsICMgQXJhYmljIC0gQmFocmFpbgorICAgIDB4NDAwMTogImFyX1FBIiwgIyBBcmFiaWMgLSBRYXRhcgorICAgIDB4MDQyYjogImh5X0FNIiwgIyBBcm1lbmlhbgorICAgIDB4MDQ0ZDogImFzX0lOIiwgIyBBc3NhbWVzZSAtIEluZGlhCisgICAgMHgwNDJjOiAiYXpfQVoiLCAjIEF6ZXJpIC0gTGF0aW4KKyAgICAweDA4MmM6ICJhel9BWiIsICMgQXplcmkgLSBDeXJpbGxpYworICAgIDB4MDQ2ZDogImJhX1JVIiwgIyBCYXNoa2lyCisgICAgMHgwNDJkOiAiZXVfRVMiLCAjIEJhc3F1ZSAtIFJ1c3NpYQorICAgIDB4MDQyMzogImJlX0JZIiwgIyBCZWxhcnVzaWFuCisgICAgMHgwNDQ1OiAiYm5fSU4iLCAjIEJlZ2FsaQorICAgIDB4MjAxYTogImJzX0JBIiwgIyBCb3NuaWFuIC0gQ3lyaWxsaWMKKyAgICAweDE0MWE6ICJic19CQSIsICMgQm9zbmlhbiAtIExhdGluCisgICAgMHgwNDdlOiAiYnJfRlIiLCAjIEJyZXRvbiAtIEZyYW5jZQorICAgIDB4MDQwMjogImJnX0JHIiwgIyBCdWxnYXJpYW4KKyMgICAgMHgwNDU1OiAibXlfTU0iLCAjIEJ1cm1lc2UgLSBOb3Qgc3VwcG9ydGVkCisgICAgMHgwNDAzOiAiY2FfRVMiLCAjIENhdGFsYW4KKyAgICAweDAwMDQ6ICJ6aF9DSFMiLCMgQ2hpbmVzZSAtIFNpbXBsaWZpZWQKKyAgICAweDA0MDQ6ICJ6aF9UVyIsICMgQ2hpbmVzZSAtIFRhaXdhbgorICAgIDB4MDgwNDogInpoX0NOIiwgIyBDaGluZXNlIC0gUFJDCisgICAgMHgwYzA0OiAiemhfSEsiLCAjIENoaW5lc2UgLSBIb25nIEtvbmcgUy5BLlIuCisgICAgMHgxMDA0OiAiemhfU0ciLCAjIENoaW5lc2UgLSBTaW5nYXBvcmUKKyAgICAweDE0MDQ6ICJ6aF9NTyIsICMgQ2hpbmVzZSAtIE1hY2FvIFMuQS5SLgorICAgIDB4N2MwNDogInpoX0NIVCIsIyBDaGluZXNlIC0gVHJhZGl0aW9uYWwKKyAgICAweDA0ODM6ICJjb19GUiIsICMgQ29yc2ljYW4gLSBGcmFuY2UKKyAgICAweDA0MWE6ICJocl9IUiIsICMgQ3JvYXRpYW4KKyAgICAweDEwMWE6ICJocl9CQSIsICMgQ3JvYXRpYW4gLSBCb3NuaWEKKyAgICAweDA0MDU6ICJjc19DWiIsICMgQ3plY2gKKyAgICAweDA0MDY6ICJkYV9ESyIsICMgRGFuaXNoCisgICAgMHgwNDhjOiAiZ2J6X0FGIiwjIERhcmkgLSBBZmdoYW5pc3RhbgorICAgIDB4MDQ2NTogImRpdl9NViIsIyBEaXZlaGkgLSBNYWxkaXZlcworICAgIDB4MDQxMzogIm5sX05MIiwgIyBEdXRjaCAtIFRoZSBOZXRoZXJsYW5kcworICAgIDB4MDgxMzogIm5sX0JFIiwgIyBEdXRjaCAtIEJlbGdpdW0KKyAgICAweDA0MDk6ICJlbl9VUyIsICMgRW5nbGlzaCAtIFVuaXRlZCBTdGF0ZXMKKyAgICAweDA4MDk6ICJlbl9HQiIsICMgRW5nbGlzaCAtIFVuaXRlZCBLaW5nZG9tCisgICAgMHgwYzA5OiAiZW5fQVUiLCAjIEVuZ2xpc2ggLSBBdXN0cmFsaWEKKyAgICAweDEwMDk6ICJlbl9DQSIsICMgRW5nbGlzaCAtIENhbmFkYQorICAgIDB4MTQwOTogImVuX05aIiwgIyBFbmdsaXNoIC0gTmV3IFplYWxhbmQKKyAgICAweDE4MDk6ICJlbl9JRSIsICMgRW5nbGlzaCAtIElyZWxhbmQKKyAgICAweDFjMDk6ICJlbl9aQSIsICMgRW5nbGlzaCAtIFNvdXRoIEFmcmljYQorICAgIDB4MjAwOTogImVuX0pBIiwgIyBFbmdsaXNoIC0gSmFtYWljYQorICAgIDB4MjQwOTogImVuX0NCIiwgIyBFbmdsaXNoIC0gQ2FycmliYmVhbgorICAgIDB4MjgwOTogImVuX0JaIiwgIyBFbmdsaXNoIC0gQmVsaXplCisgICAgMHgyYzA5OiAiZW5fVFQiLCAjIEVuZ2xpc2ggLSBUcmluaWRhZAorICAgIDB4MzAwOTogImVuX1pXIiwgIyBFbmdsaXNoIC0gWmltYmFid2UKKyAgICAweDM0MDk6ICJlbl9QSCIsICMgRW5nbGlzaCAtIFBoaWxpcHBpbmVzCisgICAgMHg0MDA5OiAiZW5fSU4iLCAjIEVuZ2xpc2ggLSBJbmRpYQorICAgIDB4NDQwOTogImVuX01ZIiwgIyBFbmdsaXNoIC0gTWFsYXlzaWEKKyAgICAweDQ4MDk6ICJlbl9JTiIsICMgRW5nbGlzaCAtIFNpbmdhcG9yZQorICAgIDB4MDQyNTogImV0X0VFIiwgIyBFc3RvbmlhbgorICAgIDB4MDQzODogImZvX0ZPIiwgIyBGYXJvZXNlCisgICAgMHgwNDY0OiAiZmlsX1BIIiwjIEZpbGlwaW5vCisgICAgMHgwNDBiOiAiZmlfRkkiLCAjIEZpbm5pc2gKKyAgICAweDA0MGM6ICJmcl9GUiIsICMgRnJlbmNoIC0gRnJhbmNlCisgICAgMHgwODBjOiAiZnJfQkUiLCAjIEZyZW5jaCAtIEJlbGdpdW0KKyAgICAweDBjMGM6ICJmcl9DQSIsICMgRnJlbmNoIC0gQ2FuYWRhCisgICAgMHgxMDBjOiAiZnJfQ0giLCAjIEZyZW5jaCAtIFN3aXR6ZXJsYW5kCisgICAgMHgxNDBjOiAiZnJfTFUiLCAjIEZyZW5jaCAtIEx1eGVtYm91cmcKKyAgICAweDE4MGM6ICJmcl9NQyIsICMgRnJlbmNoIC0gTW9uYWNvCisgICAgMHgwNDYyOiAiZnlfTkwiLCAjIEZyaXNpYW4gLSBOZXRoZXJsYW5kcworICAgIDB4MDQ1NjogImdsX0VTIiwgIyBHYWxpY2lhbgorICAgIDB4MDQzNzogImthX0dFIiwgIyBHZW9yZ2lhbgorICAgIDB4MDQwNzogImRlX0RFIiwgIyBHZXJtYW4gLSBHZXJtYW55CisgICAgMHgwODA3OiAiZGVfQ0giLCAjIEdlcm1hbiAtIFN3aXR6ZXJsYW5kCisgICAgMHgwYzA3OiAiZGVfQVQiLCAjIEdlcm1hbiAtIEF1c3RyaWEKKyAgICAweDEwMDc6ICJkZV9MVSIsICMgR2VybWFuIC0gTHV4ZW1ib3VyZworICAgIDB4MTQwNzogImRlX0xJIiwgIyBHZXJtYW4gLSBMaWVjaHRlbnN0ZWluCisgICAgMHgwNDA4OiAiZWxfR1IiLCAjIEdyZWVrCisgICAgMHgwNDZmOiAia2xfR0wiLCAjIEdyZWVubGFuZGljIC0gR3JlZW5sYW5kCisgICAgMHgwNDQ3OiAiZ3VfSU4iLCAjIEd1amFyYXRpCisgICAgMHgwNDY4OiAiaGFfTkciLCAjIEhhdXNhIC0gTGF0aW4KKyAgICAweDA0MGQ6ICJoZV9JTCIsICMgSGVicmV3CisgICAgMHgwNDM5OiAiaGlfSU4iLCAjIEhpbmRpCisgICAgMHgwNDBlOiAiaHVfSFUiLCAjIEh1bmdhcmlhbgorICAgIDB4MDQwZjogImlzX0lTIiwgIyBJY2VsYW5kaWMKKyAgICAweDA0MjE6ICJpZF9JRCIsICMgSW5kb25lc2lhbgorICAgIDB4MDQ1ZDogIml1X0NBIiwgIyBJbnVrdGl0dXQgLSBTeWxsYWJpY3MKKyAgICAweDA4NWQ6ICJpdV9DQSIsICMgSW51a3RpdHV0IC0gTGF0aW4KKyAgICAweDA4M2M6ICJnYV9JRSIsICMgSXJpc2ggLSBJcmVsYW5kCisgICAgMHgwNDEwOiAiaXRfSVQiLCAjIEl0YWxpYW4gLSBJdGFseQorICAgIDB4MDgxMDogIml0X0NIIiwgIyBJdGFsaWFuIC0gU3dpdHplcmxhbmQKKyAgICAweDA0MTE6ICJqYV9KUCIsICMgSmFwYW5lc2UKKyAgICAweDA0NGI6ICJrbl9JTiIsICMgS2FubmFkYSAtIEluZGlhCisgICAgMHgwNDNmOiAia2tfS1oiLCAjIEthemFraAorICAgIDB4MDQ1MzogImtoX0tIIiwgIyBLaG1lciAtIENhbWJvZGlhCisgICAgMHgwNDg2OiAicXV0X0dUIiwjIEsnaWNoZSAtIEd1YXRlbWFsYQorICAgIDB4MDQ4NzogInJ3X1JXIiwgIyBLaW55YXJ3YW5kYSAtIFJ3YW5kYQorICAgIDB4MDQ1NzogImtva19JTiIsIyBLb25rYW5pCisgICAgMHgwNDEyOiAia29fS1IiLCAjIEtvcmVhbgorICAgIDB4MDQ0MDogImt5X0tHIiwgIyBLeXJneXoKKyAgICAweDA0NTQ6ICJsb19MQSIsICMgTGFvIC0gTGFvIFBEUgorICAgIDB4MDQyNjogImx2X0xWIiwgIyBMYXR2aWFuCisgICAgMHgwNDI3OiAibHRfTFQiLCAjIExpdGh1YW5pYW4KKyAgICAweDA4MmU6ICJkc2JfREUiLCMgTG93ZXIgU29yYmlhbiAtIEdlcm1hbnkKKyAgICAweDA0NmU6ICJsYl9MVSIsICMgTHV4ZW1ib3VyZ2lzaAorICAgIDB4MDQyZjogIm1rX01LIiwgIyBGWVJPTSBNYWNlZG9uaWFuCisgICAgMHgwNDNlOiAibXNfTVkiLCAjIE1hbGF5IC0gTWFsYXlzaWEKKyAgICAweDA4M2U6ICJtc19CTiIsICMgTWFsYXkgLSBCcnVuZWkgRGFydXNzYWxhbQorICAgIDB4MDQ0YzogIm1sX0lOIiwgIyBNYWxheWFsYW0gLSBJbmRpYQorICAgIDB4MDQzYTogIm10X01UIiwgIyBNYWx0ZXNlCisgICAgMHgwNDgxOiAibWlfTloiLCAjIE1hb3JpCisgICAgMHgwNDdhOiAiYXJuX0NMIiwjIE1hcHVkdW5ndW4KKyAgICAweDA0NGU6ICJtcl9JTiIsICMgTWFyYXRoaQorICAgIDB4MDQ3YzogIm1vaF9DQSIsIyBNb2hhd2sgLSBDYW5hZGEKKyAgICAweDA0NTA6ICJtbl9NTiIsICMgTW9uZ29saWFuIC0gQ3lyaWxsaWMKKyAgICAweDA4NTA6ICJtbl9DTiIsICMgTW9uZ29saWFuIC0gUFJDCisgICAgMHgwNDYxOiAibmVfTlAiLCAjIE5lcGFsaQorICAgIDB4MDQxNDogIm5iX05PIiwgIyBOb3J3ZWdpYW4gLSBCb2ttYWwKKyAgICAweDA4MTQ6ICJubl9OTyIsICMgTm9yd2VnaWFuIC0gTnlub3JzaworICAgIDB4MDQ4MjogIm9jX0ZSIiwgIyBPY2NpdGFuIC0gRnJhbmNlCisgICAgMHgwNDQ4OiAib3JfSU4iLCAjIE9yaXlhIC0gSW5kaWEKKyAgICAweDA0NjM6ICJwc19BRiIsICMgUGFzaHRvIC0gQWZnaGFuaXN0YW4KKyAgICAweDA0Mjk6ICJmYV9JUiIsICMgUGVyc2lhbgorICAgIDB4MDQxNTogInBsX1BMIiwgIyBQb2xpc2gKKyAgICAweDA0MTY6ICJwdF9CUiIsICMgUG9ydHVndWVzZSAtIEJyYXppbAorICAgIDB4MDgxNjogInB0X1BUIiwgIyBQb3J0dWd1ZXNlIC0gUG9ydHVnYWwKKyAgICAweDA0NDY6ICJwYV9JTiIsICMgUHVuamFiaQorICAgIDB4MDQ2YjogInF1el9CTyIsIyBRdWVjaHVhIChCb2xpdmlhKQorICAgIDB4MDg2YjogInF1el9FQyIsIyBRdWVjaHVhIChFY3VhZG9yKQorICAgIDB4MGM2YjogInF1el9QRSIsIyBRdWVjaHVhIChQZXJ1KQorICAgIDB4MDQxODogInJvX1JPIiwgIyBSb21hbmlhbiAtIFJvbWFuaWEKKyAgICAweDA0MTc6ICJybV9DSCIsICMgUm9tYW5zaAorICAgIDB4MDQxOTogInJ1X1JVIiwgIyBSdXNzaWFuCisgICAgMHgyNDNiOiAic21uX0ZJIiwjIFNhbWkgRmlubGFuZAorICAgIDB4MTAzYjogInNtal9OTyIsIyBTYW1pIE5vcndheQorICAgIDB4MTQzYjogInNtal9TRSIsIyBTYW1pIFN3ZWRlbgorICAgIDB4MDQzYjogInNlX05PIiwgIyBTYW1pIE5vcnRoZXJuIE5vcndheQorICAgIDB4MDgzYjogInNlX1NFIiwgIyBTYW1pIE5vcnRoZXJuIFN3ZWRlbgorICAgIDB4MGMzYjogInNlX0ZJIiwgIyBTYW1pIE5vcnRoZXJuIEZpbmxhbmQKKyAgICAweDIwM2I6ICJzbXNfRkkiLCMgU2FtaSBTa29sdAorICAgIDB4MTgzYjogInNtYV9OTyIsIyBTYW1pIFNvdXRoZXJuIE5vcndheQorICAgIDB4MWMzYjogInNtYV9TRSIsIyBTYW1pIFNvdXRoZXJuIFN3ZWRlbgorICAgIDB4MDQ0ZjogInNhX0lOIiwgIyBTYW5za3JpdAorICAgIDB4MGMxYTogInNyX1NQIiwgIyBTZXJiaWFuIC0gQ3lyaWxsaWMKKyAgICAweDFjMWE6ICJzcl9CQSIsICMgU2VyYmlhbiAtIEJvc25pYSBDeXJpbGxpYworICAgIDB4MDgxYTogInNyX1NQIiwgIyBTZXJiaWFuIC0gTGF0aW4KKyAgICAweDE4MWE6ICJzcl9CQSIsICMgU2VyYmlhbiAtIEJvc25pYSBMYXRpbgorICAgIDB4MDQ1YjogInNpX0xLIiwgIyBTaW5oYWxhIC0gU3JpIExhbmthCisgICAgMHgwNDZjOiAibnNfWkEiLCAjIE5vcnRoZXJuIFNvdGhvCisgICAgMHgwNDMyOiAidG5fWkEiLCAjIFNldHN3YW5hIC0gU291dGhlcm4gQWZyaWNhCisgICAgMHgwNDFiOiAic2tfU0siLCAjIFNsb3ZhaworICAgIDB4MDQyNDogInNsX1NJIiwgIyBTbG92ZW5pYW4KKyAgICAweDA0MGE6ICJlc19FUyIsICMgU3BhbmlzaCAtIFNwYWluCisgICAgMHgwODBhOiAiZXNfTVgiLCAjIFNwYW5pc2ggLSBNZXhpY28KKyAgICAweDBjMGE6ICJlc19FUyIsICMgU3BhbmlzaCAtIFNwYWluIChNb2Rlcm4pCisgICAgMHgxMDBhOiAiZXNfR1QiLCAjIFNwYW5pc2ggLSBHdWF0ZW1hbGEKKyAgICAweDE0MGE6ICJlc19DUiIsICMgU3BhbmlzaCAtIENvc3RhIFJpY2EKKyAgICAweDE4MGE6ICJlc19QQSIsICMgU3BhbmlzaCAtIFBhbmFtYQorICAgIDB4MWMwYTogImVzX0RPIiwgIyBTcGFuaXNoIC0gRG9taW5pY2FuIFJlcHVibGljCisgICAgMHgyMDBhOiAiZXNfVkUiLCAjIFNwYW5pc2ggLSBWZW5lenVlbGEKKyAgICAweDI0MGE6ICJlc19DTyIsICMgU3BhbmlzaCAtIENvbG9tYmlhCisgICAgMHgyODBhOiAiZXNfUEUiLCAjIFNwYW5pc2ggLSBQZXJ1CisgICAgMHgyYzBhOiAiZXNfQVIiLCAjIFNwYW5pc2ggLSBBcmdlbnRpbmEKKyAgICAweDMwMGE6ICJlc19FQyIsICMgU3BhbmlzaCAtIEVjdWFkb3IKKyAgICAweDM0MGE6ICJlc19DTCIsICMgU3BhbmlzaCAtIENoaWxlCisgICAgMHgzODBhOiAiZXNfVVIiLCAjIFNwYW5pc2ggLSBVcnVndWF5CisgICAgMHgzYzBhOiAiZXNfUFkiLCAjIFNwYW5pc2ggLSBQYXJhZ3VheQorICAgIDB4NDAwYTogImVzX0JPIiwgIyBTcGFuaXNoIC0gQm9saXZpYQorICAgIDB4NDQwYTogImVzX1NWIiwgIyBTcGFuaXNoIC0gRWwgU2FsdmFkb3IKKyAgICAweDQ4MGE6ICJlc19ITiIsICMgU3BhbmlzaCAtIEhvbmR1cmFzCisgICAgMHg0YzBhOiAiZXNfTkkiLCAjIFNwYW5pc2ggLSBOaWNhcmFndWEKKyAgICAweDUwMGE6ICJlc19QUiIsICMgU3BhbmlzaCAtIFB1ZXJ0byBSaWNvCisgICAgMHg1NDBhOiAiZXNfVVMiLCAjIFNwYW5pc2ggLSBVbml0ZWQgU3RhdGVzCisjICAgIDB4MDQzMDogIiIsICMgU3V0dSAtIE5vdCBzdXBwb3J0ZWQKKyAgICAweDA0NDE6ICJzd19LRSIsICMgU3dhaGlsaQorICAgIDB4MDQxZDogInN2X1NFIiwgIyBTd2VkaXNoIC0gU3dlZGVuCisgICAgMHgwODFkOiAic3ZfRkkiLCAjIFN3ZWRpc2ggLSBGaW5sYW5kCisgICAgMHgwNDVhOiAic3lyX1NZIiwjIFN5cmlhYworICAgIDB4MDQyODogInRnX1RKIiwgIyBUYWppayAtIEN5cmlsbGljCisgICAgMHgwODVmOiAidG16X0RaIiwjIFRhbWF6aWdodCAtIExhdGluCisgICAgMHgwNDQ5OiAidGFfSU4iLCAjIFRhbWlsCisgICAgMHgwNDQ0OiAidHRfUlUiLCAjIFRhdGFyCisgICAgMHgwNDRhOiAidGVfSU4iLCAjIFRlbHVndQorICAgIDB4MDQxZTogInRoX1RIIiwgIyBUaGFpCisgICAgMHgwODUxOiAiYm9fQlQiLCAjIFRpYmV0YW4gLSBCaHV0YW4KKyAgICAweDA0NTE6ICJib19DTiIsICMgVGliZXRhbiAtIFBSQworICAgIDB4MDQxZjogInRyX1RSIiwgIyBUdXJraXNoCisgICAgMHgwNDQyOiAidGtfVE0iLCAjIFR1cmttZW4gLSBDeXJpbGxpYworICAgIDB4MDQ4MDogInVnX0NOIiwgIyBVaWdodXIgLSBBcmFiaWMKKyAgICAweDA0MjI6ICJ1a19VQSIsICMgVWtyYWluaWFuCisgICAgMHgwNDJlOiAid2VuX0RFIiwjIFVwcGVyIFNvcmJpYW4gLSBHZXJtYW55CisgICAgMHgwNDIwOiAidXJfUEsiLCAjIFVyZHUKKyAgICAweDA4MjA6ICJ1cl9JTiIsICMgVXJkdSAtIEluZGlhCisgICAgMHgwNDQzOiAidXpfVVoiLCAjIFV6YmVrIC0gTGF0aW4KKyAgICAweDA4NDM6ICJ1el9VWiIsICMgVXpiZWsgLSBDeXJpbGxpYworICAgIDB4MDQyYTogInZpX1ZOIiwgIyBWaWV0bmFtZXNlCisgICAgMHgwNDUyOiAiY3lfR0IiLCAjIFdlbHNoCisgICAgMHgwNDg4OiAid29fU04iLCAjIFdvbG9mIC0gU2VuZWdhbAorICAgIDB4MDQzNDogInhoX1pBIiwgIyBYaG9zYSAtIFNvdXRoIEFmcmljYQorICAgIDB4MDQ4NTogInNhaF9SVSIsIyBZYWt1dCAtIEN5cmlsbGljCisgICAgMHgwNDc4OiAiaWlfQ04iLCAjIFlpIC0gUFJDCisgICAgMHgwNDZhOiAieW9fTkciLCAjIFlvcnViYSAtIE5pZ2VyaWEKKyAgICAweDA0MzU6ICJ6dV9aQSIsICMgWnVsdQorfQorCitkZWYgX3ByaW50X2xvY2FsZSgpOgorCisgICAgIiIiIFRlc3QgZnVuY3Rpb24uCisgICAgIiIiCisgICAgY2F0ZWdvcmllcyA9IHt9CisgICAgZGVmIF9pbml0X2NhdGVnb3JpZXMoY2F0ZWdvcmllcz1jYXRlZ29yaWVzKToKKyAgICAgICAgZm9yIGssdiBpbiBnbG9iYWxzKCkuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtbOjNdID09ICdMQ18nOgorICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNba10gPSB2CisgICAgX2luaXRfY2F0ZWdvcmllcygpCisgICAgZGVsIGNhdGVnb3JpZXNbJ0xDX0FMTCddCisKKyAgICBwcmludCAnTG9jYWxlIGRlZmF1bHRzIGFzIGRldGVybWluZWQgYnkgZ2V0ZGVmYXVsdGxvY2FsZSgpOicKKyAgICBwcmludCAnLScqNzIKKyAgICBsYW5nLCBlbmMgPSBnZXRkZWZhdWx0bG9jYWxlKCkKKyAgICBwcmludCAnTGFuZ3VhZ2U6ICcsIGxhbmcgb3IgJyh1bmRlZmluZWQpJworICAgIHByaW50ICdFbmNvZGluZzogJywgZW5jIG9yICcodW5kZWZpbmVkKScKKyAgICBwcmludAorCisgICAgcHJpbnQgJ0xvY2FsZSBzZXR0aW5ncyBvbiBzdGFydHVwOicKKyAgICBwcmludCAnLScqNzIKKyAgICBmb3IgbmFtZSxjYXRlZ29yeSBpbiBjYXRlZ29yaWVzLml0ZW1zKCk6CisgICAgICAgIHByaW50IG5hbWUsICcuLi4nCisgICAgICAgIGxhbmcsIGVuYyA9IGdldGxvY2FsZShjYXRlZ29yeSkKKyAgICAgICAgcHJpbnQgJyAgIExhbmd1YWdlOiAnLCBsYW5nIG9yICcodW5kZWZpbmVkKScKKyAgICAgICAgcHJpbnQgJyAgIEVuY29kaW5nOiAnLCBlbmMgb3IgJyh1bmRlZmluZWQpJworICAgICAgICBwcmludAorCisgICAgcHJpbnQKKyAgICBwcmludCAnTG9jYWxlIHNldHRpbmdzIGFmdGVyIGNhbGxpbmcgcmVzZXRsb2NhbGUoKTonCisgICAgcHJpbnQgJy0nKjcyCisgICAgcmVzZXRsb2NhbGUoKQorICAgIGZvciBuYW1lLGNhdGVnb3J5IGluIGNhdGVnb3JpZXMuaXRlbXMoKToKKyAgICAgICAgcHJpbnQgbmFtZSwgJy4uLicKKyAgICAgICAgbGFuZywgZW5jID0gZ2V0bG9jYWxlKGNhdGVnb3J5KQorICAgICAgICBwcmludCAnICAgTGFuZ3VhZ2U6ICcsIGxhbmcgb3IgJyh1bmRlZmluZWQpJworICAgICAgICBwcmludCAnICAgRW5jb2Rpbmc6ICcsIGVuYyBvciAnKHVuZGVmaW5lZCknCisgICAgICAgIHByaW50CisKKyAgICB0cnk6CisgICAgICAgIHNldGxvY2FsZShMQ19BTEwsICIiKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQgJ05PVEU6JworICAgICAgICBwcmludCAnc2V0bG9jYWxlKExDX0FMTCwgIiIpIGRvZXMgbm90IHN1cHBvcnQgdGhlIGRlZmF1bHQgbG9jYWxlJworICAgICAgICBwcmludCAnZ2l2ZW4gaW4gdGhlIE9TIGVudmlyb25tZW50IHZhcmlhYmxlcy4nCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgJ0xvY2FsZSBzZXR0aW5ncyBhZnRlciBjYWxsaW5nIHNldGxvY2FsZShMQ19BTEwsICIiKTonCisgICAgICAgIHByaW50ICctJyo3MgorICAgICAgICBmb3IgbmFtZSxjYXRlZ29yeSBpbiBjYXRlZ29yaWVzLml0ZW1zKCk6CisgICAgICAgICAgICBwcmludCBuYW1lLCAnLi4uJworICAgICAgICAgICAgbGFuZywgZW5jID0gZ2V0bG9jYWxlKGNhdGVnb3J5KQorICAgICAgICAgICAgcHJpbnQgJyAgIExhbmd1YWdlOiAnLCBsYW5nIG9yICcodW5kZWZpbmVkKScKKyAgICAgICAgICAgIHByaW50ICcgICBFbmNvZGluZzogJywgZW5jIG9yICcodW5kZWZpbmVkKScKKyAgICAgICAgICAgIHByaW50CisKKyMjIworCit0cnk6CisgICAgTENfTUVTU0FHRVMKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBfX2FsbF9fLmFwcGVuZCgiTENfTUVTU0FHRVMiKQorCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICBwcmludCAnTG9jYWxlIGFsaWFzaW5nOicKKyAgICBwcmludAorICAgIF9wcmludF9sb2NhbGUoKQorICAgIHByaW50CisgICAgcHJpbnQgJ051bWJlciBmb3JtYXR0aW5nOicKKyAgICBwcmludAorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9jYWxlLnB5YyBiL2xpYi9weXRob24yLjcvbG9jYWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjgzODI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2NhbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9jYWxlLnB5byBiL2xpYi9weXRob24yLjcvbG9jYWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjgzODI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2NhbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTYyMmEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTcyNiBAQAorIyBDb3B5cmlnaHQgMjAwMS0yMDEyIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisjIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorIyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFZpbmF5IFNhamlwCisjIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgorIyBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorIyBWSU5BWSBTQUpJUCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisjIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAorIyBWSU5BWSBTQUpJUCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKKyMgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisjIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisjIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyIiIgorTG9nZ2luZyBwYWNrYWdlIGZvciBQeXRob24uIEJhc2VkIG9uIFBFUCAyODIgYW5kIGNvbW1lbnRzIHRoZXJldG8gaW4KK2NvbXAubGFuZy5weXRob24uCisKK0NvcHlyaWdodCAoQykgMjAwMS0yMDEyIFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitUbyB1c2UsIHNpbXBseSAnaW1wb3J0IGxvZ2dpbmcnIGFuZCBsb2cgYXdheSEKKyIiIgorCitpbXBvcnQgc3lzLCBvcywgdGltZSwgY1N0cmluZ0lPLCB0cmFjZWJhY2ssIHdhcm5pbmdzLCB3ZWFrcmVmCisKK19fYWxsX18gPSBbJ0JBU0lDX0ZPUk1BVCcsICdCdWZmZXJpbmdGb3JtYXR0ZXInLCAnQ1JJVElDQUwnLCAnREVCVUcnLCAnRVJST1InLAorICAgICAgICAgICAnRkFUQUwnLCAnRmlsZUhhbmRsZXInLCAnRmlsdGVyJywgJ0Zvcm1hdHRlcicsICdIYW5kbGVyJywgJ0lORk8nLAorICAgICAgICAgICAnTG9nUmVjb3JkJywgJ0xvZ2dlcicsICdMb2dnZXJBZGFwdGVyJywgJ05PVFNFVCcsICdOdWxsSGFuZGxlcicsCisgICAgICAgICAgICdTdHJlYW1IYW5kbGVyJywgJ1dBUk4nLCAnV0FSTklORycsICdhZGRMZXZlbE5hbWUnLCAnYmFzaWNDb25maWcnLAorICAgICAgICAgICAnY2FwdHVyZVdhcm5pbmdzJywgJ2NyaXRpY2FsJywgJ2RlYnVnJywgJ2Rpc2FibGUnLCAnZXJyb3InLAorICAgICAgICAgICAnZXhjZXB0aW9uJywgJ2ZhdGFsJywgJ2dldExldmVsTmFtZScsICdnZXRMb2dnZXInLCAnZ2V0TG9nZ2VyQ2xhc3MnLAorICAgICAgICAgICAnaW5mbycsICdsb2cnLCAnbWFrZUxvZ1JlY29yZCcsICdzZXRMb2dnZXJDbGFzcycsICd3YXJuJywgJ3dhcm5pbmcnXQorCit0cnk6CisgICAgaW1wb3J0IGNvZGVjcworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGNvZGVjcyA9IE5vbmUKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWQKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkID0gTm9uZQorCitfX2F1dGhvcl9fICA9ICJWaW5heSBTYWppcCA8dmluYXlfc2FqaXBAcmVkLWRvdmUuY29tPiIKK19fc3RhdHVzX18gID0gInByb2R1Y3Rpb24iCitfX3ZlcnNpb25fXyA9ICIwLjUuMS4yIgorX19kYXRlX18gICAgPSAiMDcgRmVicnVhcnkgMjAxMCIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIE1pc2NlbGxhbmVvdXMgbW9kdWxlIGRhdGEKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RyeToKKyAgICB1bmljb2RlCisgICAgX3VuaWNvZGUgPSBUcnVlCitleGNlcHQgTmFtZUVycm9yOgorICAgIF91bmljb2RlID0gRmFsc2UKKworIworIyBfc3JjZmlsZSBpcyB1c2VkIHdoZW4gd2Fsa2luZyB0aGUgc3RhY2sgdG8gY2hlY2sgd2hlbiB3ZSd2ZSBnb3QgdGhlIGZpcnN0CisjIGNhbGxlciBzdGFjayBmcmFtZS4KKyMKK2lmIGhhc2F0dHIoc3lzLCAnZnJvemVuJyk6ICNzdXBwb3J0IGZvciBweTJleGUKKyAgICBfc3JjZmlsZSA9ICJsb2dnaW5nJXNfX2luaXRfXyVzIiAlIChvcy5zZXAsIF9fZmlsZV9fWy00Ol0pCitlbGlmIF9fZmlsZV9fWy00Ol0ubG93ZXIoKSBpbiBbJy5weWMnLCAnLnB5byddOgorICAgIF9zcmNmaWxlID0gX19maWxlX19bOi00XSArICcucHknCitlbHNlOgorICAgIF9zcmNmaWxlID0gX19maWxlX18KK19zcmNmaWxlID0gb3MucGF0aC5ub3JtY2FzZShfc3JjZmlsZSkKKworIyBuZXh0IGJpdCBmaWxjaGVkIGZyb20gMS41LjIncyBpbnNwZWN0LnB5CitkZWYgY3VycmVudGZyYW1lKCk6CisgICAgIiIiUmV0dXJuIHRoZSBmcmFtZSBvYmplY3QgZm9yIHRoZSBjYWxsZXIncyBzdGFjayBmcmFtZS4iIiIKKyAgICB0cnk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbgorICAgIGV4Y2VwdDoKKyAgICAgICAgcmV0dXJuIHN5cy5leGNfaW5mbygpWzJdLnRiX2ZyYW1lLmZfYmFjaworCitpZiBoYXNhdHRyKHN5cywgJ19nZXRmcmFtZScpOiBjdXJyZW50ZnJhbWUgPSBsYW1iZGE6IHN5cy5fZ2V0ZnJhbWUoMykKKyMgZG9uZSBmaWxjaGluZworCisjIF9zcmNmaWxlIGlzIG9ubHkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHN5cy5fZ2V0ZnJhbWUoKS4KKyMgVG8gcHJvdmlkZSBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgUHl0aG9uLCBzZXQgX3NyY2ZpbGUKKyMgdG8gTm9uZSBpZiBfZ2V0ZnJhbWUoKSBpcyBub3QgYXZhaWxhYmxlOyB0aGlzIHZhbHVlIHdpbGwgcHJldmVudAorIyBmaW5kQ2FsbGVyKCkgZnJvbSBiZWluZyBjYWxsZWQuCisjaWYgbm90IGhhc2F0dHIoc3lzLCAiX2dldGZyYW1lIik6CisjICAgIF9zcmNmaWxlID0gTm9uZQorCisjCisjX3N0YXJ0VGltZSBpcyB1c2VkIGFzIHRoZSBiYXNlIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHJlbGF0aXZlIHRpbWUgb2YgZXZlbnRzCisjCitfc3RhcnRUaW1lID0gdGltZS50aW1lKCkKKworIworI3JhaXNlRXhjZXB0aW9ucyBpcyB1c2VkIHRvIHNlZSBpZiBleGNlcHRpb25zIGR1cmluZyBoYW5kbGluZyBzaG91bGQgYmUKKyNwcm9wYWdhdGVkCisjCityYWlzZUV4Y2VwdGlvbnMgPSAxCisKKyMKKyMgSWYgeW91IGRvbid0IHdhbnQgdGhyZWFkaW5nIGluZm9ybWF0aW9uIGluIHRoZSBsb2csIHNldCB0aGlzIHRvIHplcm8KKyMKK2xvZ1RocmVhZHMgPSAxCisKKyMKKyMgSWYgeW91IGRvbid0IHdhbnQgbXVsdGlwcm9jZXNzaW5nIGluZm9ybWF0aW9uIGluIHRoZSBsb2csIHNldCB0aGlzIHRvIHplcm8KKyMKK2xvZ011bHRpcHJvY2Vzc2luZyA9IDEKKworIworIyBJZiB5b3UgZG9uJ3Qgd2FudCBwcm9jZXNzIGluZm9ybWF0aW9uIGluIHRoZSBsb2csIHNldCB0aGlzIHRvIHplcm8KKyMKK2xvZ1Byb2Nlc3NlcyA9IDEKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIExldmVsIHJlbGF0ZWQgc3R1ZmYKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMKKyMgRGVmYXVsdCBsZXZlbHMgYW5kIGxldmVsIG5hbWVzLCB0aGVzZSBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhbnkgcG9zaXRpdmUgc2V0CisjIG9mIHZhbHVlcyBoYXZpbmcgY29ycmVzcG9uZGluZyBuYW1lcy4gVGhlcmUgaXMgYSBwc2V1ZG8tbGV2ZWwsIE5PVFNFVCwgd2hpY2gKKyMgaXMgb25seSByZWFsbHkgdGhlcmUgYXMgYSBsb3dlciBsaW1pdCBmb3IgdXNlci1kZWZpbmVkIGxldmVscy4gSGFuZGxlcnMgYW5kCisjIGxvZ2dlcnMgYXJlIGluaXRpYWxpemVkIHdpdGggTk9UU0VUIHNvIHRoYXQgdGhleSB3aWxsIGxvZyBhbGwgbWVzc2FnZXMsIGV2ZW4KKyMgYXQgdXNlci1kZWZpbmVkIGxldmVscy4KKyMKKworQ1JJVElDQUwgPSA1MAorRkFUQUwgPSBDUklUSUNBTAorRVJST1IgPSA0MAorV0FSTklORyA9IDMwCitXQVJOID0gV0FSTklORworSU5GTyA9IDIwCitERUJVRyA9IDEwCitOT1RTRVQgPSAwCisKK19sZXZlbE5hbWVzID0geworICAgIENSSVRJQ0FMIDogJ0NSSVRJQ0FMJywKKyAgICBFUlJPUiA6ICdFUlJPUicsCisgICAgV0FSTklORyA6ICdXQVJOSU5HJywKKyAgICBJTkZPIDogJ0lORk8nLAorICAgIERFQlVHIDogJ0RFQlVHJywKKyAgICBOT1RTRVQgOiAnTk9UU0VUJywKKyAgICAnQ1JJVElDQUwnIDogQ1JJVElDQUwsCisgICAgJ0VSUk9SJyA6IEVSUk9SLAorICAgICdXQVJOJyA6IFdBUk5JTkcsCisgICAgJ1dBUk5JTkcnIDogV0FSTklORywKKyAgICAnSU5GTycgOiBJTkZPLAorICAgICdERUJVRycgOiBERUJVRywKKyAgICAnTk9UU0VUJyA6IE5PVFNFVCwKK30KKworZGVmIGdldExldmVsTmFtZShsZXZlbCk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIGxvZ2dpbmcgbGV2ZWwgJ2xldmVsJy4KKworICAgIElmIHRoZSBsZXZlbCBpcyBvbmUgb2YgdGhlIHByZWRlZmluZWQgbGV2ZWxzIChDUklUSUNBTCwgRVJST1IsIFdBUk5JTkcsCisgICAgSU5GTywgREVCVUcpIHRoZW4geW91IGdldCB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuIElmIHlvdSBoYXZlCisgICAgYXNzb2NpYXRlZCBsZXZlbHMgd2l0aCBuYW1lcyB1c2luZyBhZGRMZXZlbE5hbWUgdGhlbiB0aGUgbmFtZSB5b3UgaGF2ZQorICAgIGFzc29jaWF0ZWQgd2l0aCAnbGV2ZWwnIGlzIHJldHVybmVkLgorCisgICAgSWYgYSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gb25lIG9mIHRoZSBkZWZpbmVkIGxldmVscyBpcyBwYXNzZWQKKyAgICBpbiwgdGhlIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGlzIHJldHVybmVkLgorCisgICAgT3RoZXJ3aXNlLCB0aGUgc3RyaW5nICJMZXZlbCAlcyIgJSBsZXZlbCBpcyByZXR1cm5lZC4KKyAgICAiIiIKKyAgICByZXR1cm4gX2xldmVsTmFtZXMuZ2V0KGxldmVsLCAoIkxldmVsICVzIiAlIGxldmVsKSkKKworZGVmIGFkZExldmVsTmFtZShsZXZlbCwgbGV2ZWxOYW1lKToKKyAgICAiIiIKKyAgICBBc3NvY2lhdGUgJ2xldmVsTmFtZScgd2l0aCAnbGV2ZWwnLgorCisgICAgVGhpcyBpcyB1c2VkIHdoZW4gY29udmVydGluZyBsZXZlbHMgdG8gdGV4dCBkdXJpbmcgbWVzc2FnZSBmb3JtYXR0aW5nLgorICAgICIiIgorICAgIF9hY3F1aXJlTG9jaygpCisgICAgdHJ5OiAgICAjdW5saWtlbHkgdG8gY2F1c2UgYW4gZXhjZXB0aW9uLCBidXQgeW91IG5ldmVyIGtub3cuLi4KKyAgICAgICAgX2xldmVsTmFtZXNbbGV2ZWxdID0gbGV2ZWxOYW1lCisgICAgICAgIF9sZXZlbE5hbWVzW2xldmVsTmFtZV0gPSBsZXZlbAorICAgIGZpbmFsbHk6CisgICAgICAgIF9yZWxlYXNlTG9jaygpCisKK2RlZiBfY2hlY2tMZXZlbChsZXZlbCk6CisgICAgaWYgaXNpbnN0YW5jZShsZXZlbCwgKGludCwgbG9uZykpOgorICAgICAgICBydiA9IGxldmVsCisgICAgZWxpZiBzdHIobGV2ZWwpID09IGxldmVsOgorICAgICAgICBpZiBsZXZlbCBub3QgaW4gX2xldmVsTmFtZXM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJVbmtub3duIGxldmVsOiAlciIgJSBsZXZlbCkKKyAgICAgICAgcnYgPSBfbGV2ZWxOYW1lc1tsZXZlbF0KKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkxldmVsIG5vdCBhbiBpbnRlZ2VyIG9yIGEgdmFsaWQgc3RyaW5nOiAlciIgJSBsZXZlbCkKKyAgICByZXR1cm4gcnYKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIFRocmVhZC1yZWxhdGVkIHN0dWZmCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyNfbG9jayBpcyB1c2VkIHRvIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gc2hhcmVkIGRhdGEgc3RydWN0dXJlcyBpbiB0aGlzIG1vZHVsZS4KKyNUaGlzIG5lZWRzIHRvIGJlIGFuIFJMb2NrIGJlY2F1c2UgZmlsZUNvbmZpZygpIGNyZWF0ZXMgYW5kIGNvbmZpZ3VyZXMKKyNIYW5kbGVycywgYW5kIHNvIG1pZ2h0IGFyYml0cmFyeSB1c2VyIHRocmVhZHMuIFNpbmNlIEhhbmRsZXIgY29kZSB1cGRhdGVzIHRoZQorI3NoYXJlZCBkaWN0aW9uYXJ5IF9oYW5kbGVycywgaXQgbmVlZHMgdG8gYWNxdWlyZSB0aGUgbG9jay4gQnV0IGlmIGNvbmZpZ3VyaW5nLAorI3RoZSBsb2NrIHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGFjcXVpcmVkIC0gc28gd2UgbmVlZCBhbiBSTG9jay4KKyNUaGUgc2FtZSBhcmd1bWVudCBhcHBsaWVzIHRvIExvZ2dlcnMgYW5kIE1hbmFnZXIubG9nZ2VyRGljdC4KKyMKK2lmIHRocmVhZDoKKyAgICBfbG9jayA9IHRocmVhZGluZy5STG9jaygpCitlbHNlOgorICAgIF9sb2NrID0gTm9uZQorCitkZWYgX2FjcXVpcmVMb2NrKCk6CisgICAgIiIiCisgICAgQWNxdWlyZSB0aGUgbW9kdWxlLWxldmVsIGxvY2sgZm9yIHNlcmlhbGl6aW5nIGFjY2VzcyB0byBzaGFyZWQgZGF0YS4KKworICAgIFRoaXMgc2hvdWxkIGJlIHJlbGVhc2VkIHdpdGggX3JlbGVhc2VMb2NrKCkuCisgICAgIiIiCisgICAgaWYgX2xvY2s6CisgICAgICAgIF9sb2NrLmFjcXVpcmUoKQorCitkZWYgX3JlbGVhc2VMb2NrKCk6CisgICAgIiIiCisgICAgUmVsZWFzZSB0aGUgbW9kdWxlLWxldmVsIGxvY2sgYWNxdWlyZWQgYnkgY2FsbGluZyBfYWNxdWlyZUxvY2soKS4KKyAgICAiIiIKKyAgICBpZiBfbG9jazoKKyAgICAgICAgX2xvY2sucmVsZWFzZSgpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBUaGUgbG9nZ2luZyByZWNvcmQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgTG9nUmVjb3JkKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBMb2dSZWNvcmQgaW5zdGFuY2UgcmVwcmVzZW50cyBhbiBldmVudCBiZWluZyBsb2dnZWQuCisKKyAgICBMb2dSZWNvcmQgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGV2ZXJ5IHRpbWUgc29tZXRoaW5nIGlzIGxvZ2dlZC4gVGhleQorICAgIGNvbnRhaW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBwZXJ0aW5lbnQgdG8gdGhlIGV2ZW50IGJlaW5nIGxvZ2dlZC4gVGhlCisgICAgbWFpbiBpbmZvcm1hdGlvbiBwYXNzZWQgaW4gaXMgaW4gbXNnIGFuZCBhcmdzLCB3aGljaCBhcmUgY29tYmluZWQKKyAgICB1c2luZyBzdHIobXNnKSAlIGFyZ3MgdG8gY3JlYXRlIHRoZSBtZXNzYWdlIGZpZWxkIG9mIHRoZSByZWNvcmQuIFRoZQorICAgIHJlY29yZCBhbHNvIGluY2x1ZGVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgd2hlbiB0aGUgcmVjb3JkIHdhcyBjcmVhdGVkLAorICAgIHRoZSBzb3VyY2UgbGluZSB3aGVyZSB0aGUgbG9nZ2luZyBjYWxsIHdhcyBtYWRlLCBhbmQgYW55IGV4Y2VwdGlvbgorICAgIGluZm9ybWF0aW9uIHRvIGJlIGxvZ2dlZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbGV2ZWwsIHBhdGhuYW1lLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgIG1zZywgYXJncywgZXhjX2luZm8sIGZ1bmM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIGEgbG9nZ2luZyByZWNvcmQgd2l0aCBpbnRlcmVzdGluZyBpbmZvcm1hdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIGN0ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICAjCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQgYWxsb3dzIHBhc3Npbmcgb2YgYSBkaWN0aW9uYXJ5IGFzIGEgc29sZQorICAgICAgICAjIGFyZ3VtZW50LCBzbyB0aGF0IHlvdSBjYW4gZG8gc29tZXRoaW5nIGxpa2UKKyAgICAgICAgIyAgbG9nZ2luZy5kZWJ1ZygiYSAlKGEpZCBiICUoYilzIiwgeydhJzoxLCAnYic6Mn0pCisgICAgICAgICMgU3VnZ2VzdGVkIGJ5IFN0ZWZhbiBCZWhuZWwuCisgICAgICAgICMgTm90ZSB0aGF0IHdpdGhvdXQgdGhlIHRlc3QgZm9yIGFyZ3NbMF0sIHdlIGdldCBhIHByb2JsZW0gYmVjYXVzZQorICAgICAgICAjIGR1cmluZyBmb3JtYXR0aW5nLCB3ZSB0ZXN0IHRvIHNlZSBpZiB0aGUgYXJnIGlzIHByZXNlbnQgdXNpbmcKKyAgICAgICAgIyAnaWYgc2VsZi5hcmdzOicuIElmIHRoZSBldmVudCBiZWluZyBsb2dnZWQgaXMgZS5nLiAnVmFsdWUgaXMgJWQnCisgICAgICAgICMgYW5kIGlmIHRoZSBwYXNzZWQgYXJnIGZhaWxzICdpZiBzZWxmLmFyZ3M6JyB0aGVuIG5vIGZvcm1hdHRpbmcKKyAgICAgICAgIyBpcyBkb25lLiBGb3IgZXhhbXBsZSwgbG9nZ2VyLndhcm4oJ1ZhbHVlIGlzICVkJywgMCkgd291bGQgbG9nCisgICAgICAgICMgJ1ZhbHVlIGlzICVkJyBpbnN0ZWFkIG9mICdWYWx1ZSBpcyAwJy4KKyAgICAgICAgIyBGb3IgdGhlIHVzZSBjYXNlIG9mIHBhc3NpbmcgYSBkaWN0aW9uYXJ5LCB0aGlzIHNob3VsZCBub3QgYmUgYQorICAgICAgICAjIHByb2JsZW0uCisgICAgICAgIGlmIGFyZ3MgYW5kIGxlbihhcmdzKSA9PSAxIGFuZCBpc2luc3RhbmNlKGFyZ3NbMF0sIGRpY3QpIGFuZCBhcmdzWzBdOgorICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF0KKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworICAgICAgICBzZWxmLmxldmVsbmFtZSA9IGdldExldmVsTmFtZShsZXZlbCkKKyAgICAgICAgc2VsZi5sZXZlbG5vID0gbGV2ZWwKKyAgICAgICAgc2VsZi5wYXRobmFtZSA9IHBhdGhuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGhuYW1lKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUgPSBvcy5wYXRoLnNwbGl0ZXh0KHNlbGYuZmlsZW5hbWUpWzBdCisgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gcGF0aG5hbWUKKyAgICAgICAgICAgIHNlbGYubW9kdWxlID0gIlVua25vd24gbW9kdWxlIgorICAgICAgICBzZWxmLmV4Y19pbmZvID0gZXhjX2luZm8KKyAgICAgICAgc2VsZi5leGNfdGV4dCA9IE5vbmUgICAgICAjIHVzZWQgdG8gY2FjaGUgdGhlIHRyYWNlYmFjayB0ZXh0CisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIHNlbGYuZnVuY05hbWUgPSBmdW5jCisgICAgICAgIHNlbGYuY3JlYXRlZCA9IGN0CisgICAgICAgIHNlbGYubXNlY3MgPSAoY3QgLSBsb25nKGN0KSkgKiAxMDAwCisgICAgICAgIHNlbGYucmVsYXRpdmVDcmVhdGVkID0gKHNlbGYuY3JlYXRlZCAtIF9zdGFydFRpbWUpICogMTAwMAorICAgICAgICBpZiBsb2dUaHJlYWRzIGFuZCB0aHJlYWQ6CisgICAgICAgICAgICBzZWxmLnRocmVhZCA9IHRocmVhZC5nZXRfaWRlbnQoKQorICAgICAgICAgICAgc2VsZi50aHJlYWROYW1lID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50aHJlYWQgPSBOb25lCisgICAgICAgICAgICBzZWxmLnRocmVhZE5hbWUgPSBOb25lCisgICAgICAgIGlmIG5vdCBsb2dNdWx0aXByb2Nlc3Npbmc6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3NOYW1lID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzTmFtZSA9ICdNYWluUHJvY2VzcycKKyAgICAgICAgICAgIG1wID0gc3lzLm1vZHVsZXMuZ2V0KCdtdWx0aXByb2Nlc3NpbmcnKQorICAgICAgICAgICAgaWYgbXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBFcnJvcnMgbWF5IG9jY3VyIGlmIG11bHRpcHJvY2Vzc2luZyBoYXMgbm90IGZpbmlzaGVkIGxvYWRpbmcKKyAgICAgICAgICAgICAgICAjIHlldCAtIGUuZy4gaWYgYSBjdXN0b20gaW1wb3J0IGhvb2sgY2F1c2VzIHRoaXJkLXBhcnR5IGNvZGUKKyAgICAgICAgICAgICAgICAjIHRvIHJ1biB3aGVuIG11bHRpcHJvY2Vzc2luZyBjYWxscyBpbXBvcnQuIFNlZSBpc3N1ZSA4MjAwCisgICAgICAgICAgICAgICAgIyBmb3IgYW4gZXhhbXBsZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzTmFtZSA9IG1wLmN1cnJlbnRfcHJvY2VzcygpLm5hbWUKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBsb2dQcm9jZXNzZXMgYW5kIGhhc2F0dHIob3MsICdnZXRwaWQnKToKKyAgICAgICAgICAgIHNlbGYucHJvY2VzcyA9IG9zLmdldHBpZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnByb2Nlc3MgPSBOb25lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8TG9nUmVjb3JkOiAlcywgJXMsICVzLCAlcywgIiVzIj4nJShzZWxmLm5hbWUsIHNlbGYubGV2ZWxubywKKyAgICAgICAgICAgIHNlbGYucGF0aG5hbWUsIHNlbGYubGluZW5vLCBzZWxmLm1zZykKKworICAgIGRlZiBnZXRNZXNzYWdlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBtZXNzYWdlIGZvciB0aGlzIExvZ1JlY29yZC4KKworICAgICAgICBSZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoaXMgTG9nUmVjb3JkIGFmdGVyIG1lcmdpbmcgYW55IHVzZXItc3VwcGxpZWQKKyAgICAgICAgYXJndW1lbnRzIHdpdGggdGhlIG1lc3NhZ2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgX3VuaWNvZGU6ICNpZiBubyB1bmljb2RlIHN1cHBvcnQuLi4KKyAgICAgICAgICAgIG1zZyA9IHN0cihzZWxmLm1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyA9IHNlbGYubXNnCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShtc2csIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gc3RyKHNlbGYubXNnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IHNlbGYubXNnICAgICAgI0RlZmVyIGVuY29kaW5nIHRpbGwgbGF0ZXIKKyAgICAgICAgaWYgc2VsZi5hcmdzOgorICAgICAgICAgICAgbXNnID0gbXNnICUgc2VsZi5hcmdzCisgICAgICAgIHJldHVybiBtc2cKKworZGVmIG1ha2VMb2dSZWNvcmQoZGljdCk6CisgICAgIiIiCisgICAgTWFrZSBhIExvZ1JlY29yZCB3aG9zZSBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgZGljdGlvbmFyeSwKKyAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWZ1bCBmb3IgY29udmVydGluZyBhIGxvZ2dpbmcgZXZlbnQgcmVjZWl2ZWQgb3ZlcgorICAgIGEgc29ja2V0IGNvbm5lY3Rpb24gKHdoaWNoIGlzIHNlbnQgYXMgYSBkaWN0aW9uYXJ5KSBpbnRvIGEgTG9nUmVjb3JkCisgICAgaW5zdGFuY2UuCisgICAgIiIiCisgICAgcnYgPSBMb2dSZWNvcmQoTm9uZSwgTm9uZSwgIiIsIDAsICIiLCAoKSwgTm9uZSwgTm9uZSkKKyAgICBydi5fX2RpY3RfXy51cGRhdGUoZGljdCkKKyAgICByZXR1cm4gcnYKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyAgIEZvcm1hdHRlciBjbGFzc2VzIGFuZCBmdW5jdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgRm9ybWF0dGVyKG9iamVjdCk6CisgICAgIiIiCisgICAgRm9ybWF0dGVyIGluc3RhbmNlcyBhcmUgdXNlZCB0byBjb252ZXJ0IGEgTG9nUmVjb3JkIHRvIHRleHQuCisKKyAgICBGb3JtYXR0ZXJzIG5lZWQgdG8ga25vdyBob3cgYSBMb2dSZWNvcmQgaXMgY29uc3RydWN0ZWQuIFRoZXkgYXJlCisgICAgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgYSBMb2dSZWNvcmQgdG8gKHVzdWFsbHkpIGEgc3RyaW5nIHdoaWNoIGNhbgorICAgIGJlIGludGVycHJldGVkIGJ5IGVpdGhlciBhIGh1bWFuIG9yIGFuIGV4dGVybmFsIHN5c3RlbS4gVGhlIGJhc2UgRm9ybWF0dGVyCisgICAgYWxsb3dzIGEgZm9ybWF0dGluZyBzdHJpbmcgdG8gYmUgc3BlY2lmaWVkLiBJZiBub25lIGlzIHN1cHBsaWVkLCB0aGUKKyAgICBkZWZhdWx0IHZhbHVlIG9mICIlcyhtZXNzYWdlKVxcbiIgaXMgdXNlZC4KKworICAgIFRoZSBGb3JtYXR0ZXIgY2FuIGJlIGluaXRpYWxpemVkIHdpdGggYSBmb3JtYXQgc3RyaW5nIHdoaWNoIG1ha2VzIHVzZSBvZgorICAgIGtub3dsZWRnZSBvZiB0aGUgTG9nUmVjb3JkIGF0dHJpYnV0ZXMgLSBlLmcuIHRoZSBkZWZhdWx0IHZhbHVlIG1lbnRpb25lZAorICAgIGFib3ZlIG1ha2VzIHVzZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSB1c2VyJ3MgbWVzc2FnZSBhbmQgYXJndW1lbnRzIGFyZSBwcmUtCisgICAgZm9ybWF0dGVkIGludG8gYSBMb2dSZWNvcmQncyBtZXNzYWdlIGF0dHJpYnV0ZS4gQ3VycmVudGx5LCB0aGUgdXNlZnVsCisgICAgYXR0cmlidXRlcyBpbiBhIExvZ1JlY29yZCBhcmUgZGVzY3JpYmVkIGJ5OgorCisgICAgJShuYW1lKXMgICAgICAgICAgICBOYW1lIG9mIHRoZSBsb2dnZXIgKGxvZ2dpbmcgY2hhbm5lbCkKKyAgICAlKGxldmVsbm8pcyAgICAgICAgIE51bWVyaWMgbG9nZ2luZyBsZXZlbCBmb3IgdGhlIG1lc3NhZ2UgKERFQlVHLCBJTkZPLAorICAgICAgICAgICAgICAgICAgICAgICAgV0FSTklORywgRVJST1IsIENSSVRJQ0FMKQorICAgICUobGV2ZWxuYW1lKXMgICAgICAgVGV4dCBsb2dnaW5nIGxldmVsIGZvciB0aGUgbWVzc2FnZSAoIkRFQlVHIiwgIklORk8iLAorICAgICAgICAgICAgICAgICAgICAgICAgIldBUk5JTkciLCAiRVJST1IiLCAiQ1JJVElDQUwiKQorICAgICUocGF0aG5hbWUpcyAgICAgICAgRnVsbCBwYXRobmFtZSBvZiB0aGUgc291cmNlIGZpbGUgd2hlcmUgdGhlIGxvZ2dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGwgd2FzIGlzc3VlZCAoaWYgYXZhaWxhYmxlKQorICAgICUoZmlsZW5hbWUpcyAgICAgICAgRmlsZW5hbWUgcG9ydGlvbiBvZiBwYXRobmFtZQorICAgICUobW9kdWxlKXMgICAgICAgICAgTW9kdWxlIChuYW1lIHBvcnRpb24gb2YgZmlsZW5hbWUpCisgICAgJShsaW5lbm8pZCAgICAgICAgICBTb3VyY2UgbGluZSBudW1iZXIgd2hlcmUgdGhlIGxvZ2dpbmcgY2FsbCB3YXMgaXNzdWVkCisgICAgICAgICAgICAgICAgICAgICAgICAoaWYgYXZhaWxhYmxlKQorICAgICUoZnVuY05hbWUpcyAgICAgICAgRnVuY3Rpb24gbmFtZQorICAgICUoY3JlYXRlZClmICAgICAgICAgVGltZSB3aGVuIHRoZSBMb2dSZWNvcmQgd2FzIGNyZWF0ZWQgKHRpbWUudGltZSgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUpCisgICAgJShhc2N0aW1lKXMgICAgICAgICBUZXh0dWFsIHRpbWUgd2hlbiB0aGUgTG9nUmVjb3JkIHdhcyBjcmVhdGVkCisgICAgJShtc2VjcylkICAgICAgICAgICBNaWxsaXNlY29uZCBwb3J0aW9uIG9mIHRoZSBjcmVhdGlvbiB0aW1lCisgICAgJShyZWxhdGl2ZUNyZWF0ZWQpZCBUaW1lIGluIG1pbGxpc2Vjb25kcyB3aGVuIHRoZSBMb2dSZWNvcmQgd2FzIGNyZWF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byB0aGUgdGltZSB0aGUgbG9nZ2luZyBtb2R1bGUgd2FzIGxvYWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGljYWxseSBhdCBhcHBsaWNhdGlvbiBzdGFydHVwIHRpbWUpCisgICAgJSh0aHJlYWQpZCAgICAgICAgICBUaHJlYWQgSUQgKGlmIGF2YWlsYWJsZSkKKyAgICAlKHRocmVhZE5hbWUpcyAgICAgIFRocmVhZCBuYW1lIChpZiBhdmFpbGFibGUpCisgICAgJShwcm9jZXNzKWQgICAgICAgICBQcm9jZXNzIElEIChpZiBhdmFpbGFibGUpCisgICAgJShtZXNzYWdlKXMgICAgICAgICBUaGUgcmVzdWx0IG9mIHJlY29yZC5nZXRNZXNzYWdlKCksIGNvbXB1dGVkIGp1c3QgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWNvcmQgaXMgZW1pdHRlZAorICAgICIiIgorCisgICAgY29udmVydGVyID0gdGltZS5sb2NhbHRpbWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmbXQ9Tm9uZSwgZGF0ZWZtdD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIGZvcm1hdHRlciB3aXRoIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5ncy4KKworICAgICAgICBJbml0aWFsaXplIHRoZSBmb3JtYXR0ZXIgZWl0aGVyIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nLCBvciBhCisgICAgICAgIGRlZmF1bHQgYXMgZGVzY3JpYmVkIGFib3ZlLiBBbGxvdyBmb3Igc3BlY2lhbGl6ZWQgZGF0ZSBmb3JtYXR0aW5nIHdpdGgKKyAgICAgICAgdGhlIG9wdGlvbmFsIGRhdGVmbXQgYXJndW1lbnQgKGlmIG9taXR0ZWQsIHlvdSBnZXQgdGhlIElTTzg2MDEgZm9ybWF0KS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZtdDoKKyAgICAgICAgICAgIHNlbGYuX2ZtdCA9IGZtdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZm10ID0gIiUobWVzc2FnZSlzIgorICAgICAgICBzZWxmLmRhdGVmbXQgPSBkYXRlZm10CisKKyAgICBkZWYgZm9ybWF0VGltZShzZWxmLCByZWNvcmQsIGRhdGVmbXQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIHNwZWNpZmllZCBMb2dSZWNvcmQgYXMgZm9ybWF0dGVkIHRleHQuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGZvcm1hdCgpIGJ5IGEgZm9ybWF0dGVyIHdoaWNoCisgICAgICAgIHdhbnRzIHRvIG1ha2UgdXNlIG9mIGEgZm9ybWF0dGVkIHRpbWUuIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuCisgICAgICAgIGluIGZvcm1hdHRlcnMgdG8gcHJvdmlkZSBmb3IgYW55IHNwZWNpZmljIHJlcXVpcmVtZW50LCBidXQgdGhlCisgICAgICAgIGJhc2ljIGJlaGF2aW91ciBpcyBhcyBmb2xsb3dzOiBpZiBkYXRlZm10IChhIHN0cmluZykgaXMgc3BlY2lmaWVkLAorICAgICAgICBpdCBpcyB1c2VkIHdpdGggdGltZS5zdHJmdGltZSgpIHRvIGZvcm1hdCB0aGUgY3JlYXRpb24gdGltZSBvZiB0aGUKKyAgICAgICAgcmVjb3JkLiBPdGhlcndpc2UsIHRoZSBJU084NjAxIGZvcm1hdCBpcyB1c2VkLiBUaGUgcmVzdWx0aW5nCisgICAgICAgIHN0cmluZyBpcyByZXR1cm5lZC4gVGhpcyBmdW5jdGlvbiB1c2VzIGEgdXNlci1jb25maWd1cmFibGUgZnVuY3Rpb24KKyAgICAgICAgdG8gY29udmVydCB0aGUgY3JlYXRpb24gdGltZSB0byBhIHR1cGxlLiBCeSBkZWZhdWx0LCB0aW1lLmxvY2FsdGltZSgpCisgICAgICAgIGlzIHVzZWQ7IHRvIGNoYW5nZSB0aGlzIGZvciBhIHBhcnRpY3VsYXIgZm9ybWF0dGVyIGluc3RhbmNlLCBzZXQgdGhlCisgICAgICAgICdjb252ZXJ0ZXInIGF0dHJpYnV0ZSB0byBhIGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzCisgICAgICAgIHRpbWUubG9jYWx0aW1lKCkgb3IgdGltZS5nbXRpbWUoKS4gVG8gY2hhbmdlIGl0IGZvciBhbGwgZm9ybWF0dGVycywKKyAgICAgICAgZm9yIGV4YW1wbGUgaWYgeW91IHdhbnQgYWxsIGxvZ2dpbmcgdGltZXMgdG8gYmUgc2hvd24gaW4gR01ULAorICAgICAgICBzZXQgdGhlICdjb252ZXJ0ZXInIGF0dHJpYnV0ZSBpbiB0aGUgRm9ybWF0dGVyIGNsYXNzLgorICAgICAgICAiIiIKKyAgICAgICAgY3QgPSBzZWxmLmNvbnZlcnRlcihyZWNvcmQuY3JlYXRlZCkKKyAgICAgICAgaWYgZGF0ZWZtdDoKKyAgICAgICAgICAgIHMgPSB0aW1lLnN0cmZ0aW1lKGRhdGVmbXQsIGN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdCA9IHRpbWUuc3RyZnRpbWUoIiVZLSVtLSVkICVIOiVNOiVTIiwgY3QpCisgICAgICAgICAgICBzID0gIiVzLCUwM2QiICUgKHQsIHJlY29yZC5tc2VjcykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBmb3JtYXRFeGNlcHRpb24oc2VsZiwgZWkpOgorICAgICAgICAiIiIKKyAgICAgICAgRm9ybWF0IGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBleGNlcHRpb24gaW5mb3JtYXRpb24gYXMgYSBzdHJpbmcuCisKKyAgICAgICAgVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgdXNlcworICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjZXB0aW9uKCkKKyAgICAgICAgIiIiCisgICAgICAgIHNpbyA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGNlcHRpb24oZWlbMF0sIGVpWzFdLCBlaVsyXSwgTm9uZSwgc2lvKQorICAgICAgICBzID0gc2lvLmdldHZhbHVlKCkKKyAgICAgICAgc2lvLmNsb3NlKCkKKyAgICAgICAgaWYgc1stMTpdID09ICJcbiI6CisgICAgICAgICAgICBzID0gc1s6LTFdCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgdXNlc1RpbWUoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDaGVjayBpZiB0aGUgZm9ybWF0IHVzZXMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIHJlY29yZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9mbXQuZmluZCgiJShhc2N0aW1lKSIpID49IDAKKworICAgIGRlZiBmb3JtYXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEZvcm1hdCB0aGUgc3BlY2lmaWVkIHJlY29yZCBhcyB0ZXh0LgorCisgICAgICAgIFRoZSByZWNvcmQncyBhdHRyaWJ1dGUgZGljdGlvbmFyeSBpcyB1c2VkIGFzIHRoZSBvcGVyYW5kIHRvIGEKKyAgICAgICAgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uIHdoaWNoIHlpZWxkcyB0aGUgcmV0dXJuZWQgc3RyaW5nLgorICAgICAgICBCZWZvcmUgZm9ybWF0dGluZyB0aGUgZGljdGlvbmFyeSwgYSBjb3VwbGUgb2YgcHJlcGFyYXRvcnkgc3RlcHMKKyAgICAgICAgYXJlIGNhcnJpZWQgb3V0LiBUaGUgbWVzc2FnZSBhdHRyaWJ1dGUgb2YgdGhlIHJlY29yZCBpcyBjb21wdXRlZAorICAgICAgICB1c2luZyBMb2dSZWNvcmQuZ2V0TWVzc2FnZSgpLiBJZiB0aGUgZm9ybWF0dGluZyBzdHJpbmcgdXNlcyB0aGUKKyAgICAgICAgdGltZSAoYXMgZGV0ZXJtaW5lZCBieSBhIGNhbGwgdG8gdXNlc1RpbWUoKSwgZm9ybWF0VGltZSgpIGlzCisgICAgICAgIGNhbGxlZCB0byBmb3JtYXQgdGhlIGV2ZW50IHRpbWUuIElmIHRoZXJlIGlzIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiwKKyAgICAgICAgaXQgaXMgZm9ybWF0dGVkIHVzaW5nIGZvcm1hdEV4Y2VwdGlvbigpIGFuZCBhcHBlbmRlZCB0byB0aGUgbWVzc2FnZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJlY29yZC5tZXNzYWdlID0gcmVjb3JkLmdldE1lc3NhZ2UoKQorICAgICAgICBpZiBzZWxmLnVzZXNUaW1lKCk6CisgICAgICAgICAgICByZWNvcmQuYXNjdGltZSA9IHNlbGYuZm9ybWF0VGltZShyZWNvcmQsIHNlbGYuZGF0ZWZtdCkKKyAgICAgICAgcyA9IHNlbGYuX2ZtdCAlIHJlY29yZC5fX2RpY3RfXworICAgICAgICBpZiByZWNvcmQuZXhjX2luZm86CisgICAgICAgICAgICAjIENhY2hlIHRoZSB0cmFjZWJhY2sgdGV4dCB0byBhdm9pZCBjb252ZXJ0aW5nIGl0IG11bHRpcGxlIHRpbWVzCisgICAgICAgICAgICAjIChpdCdzIGNvbnN0YW50IGFueXdheSkKKyAgICAgICAgICAgIGlmIG5vdCByZWNvcmQuZXhjX3RleHQ6CisgICAgICAgICAgICAgICAgcmVjb3JkLmV4Y190ZXh0ID0gc2VsZi5mb3JtYXRFeGNlcHRpb24ocmVjb3JkLmV4Y19pbmZvKQorICAgICAgICBpZiByZWNvcmQuZXhjX3RleHQ6CisgICAgICAgICAgICBpZiBzWy0xOl0gIT0gIlxuIjoKKyAgICAgICAgICAgICAgICBzID0gcyArICJcbiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzID0gcyArIHJlY29yZC5leGNfdGV4dAorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFNvbWV0aW1lcyBmaWxlbmFtZXMgaGF2ZSBub24tQVNDSUkgY2hhcnMsIHdoaWNoIGNhbiBsZWFkCisgICAgICAgICAgICAgICAgIyB0byBlcnJvcnMgd2hlbiBzIGlzIFVuaWNvZGUgYW5kIHJlY29yZC5leGNfdGV4dCBpcyBzdHIKKyAgICAgICAgICAgICAgICAjIFNlZSBpc3N1ZSA4OTI0LgorICAgICAgICAgICAgICAgICMgV2UgYWxzbyB1c2UgcmVwbGFjZSBmb3Igd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgICAgICAgICAgICAgICAjIGVuY29kaW5ncywgZS5nLiBVVEYtOCBmb3IgdGhlIGZpbGVzeXN0ZW0gYW5kIGxhdGluLTEKKyAgICAgICAgICAgICAgICAjIGZvciBhIHNjcmlwdC4gU2VlIGlzc3VlIDEzMjMyLgorICAgICAgICAgICAgICAgIHMgPSBzICsgcmVjb3JkLmV4Y190ZXh0LmRlY29kZShzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXBsYWNlJykKKyAgICAgICAgcmV0dXJuIHMKKworIworIyAgIFRoZSBkZWZhdWx0IGZvcm1hdHRlciB0byB1c2Ugd2hlbiBubyBvdGhlciBpcyBzcGVjaWZpZWQKKyMKK19kZWZhdWx0Rm9ybWF0dGVyID0gRm9ybWF0dGVyKCkKKworY2xhc3MgQnVmZmVyaW5nRm9ybWF0dGVyKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBmb3JtYXR0ZXIgc3VpdGFibGUgZm9yIGZvcm1hdHRpbmcgYSBudW1iZXIgb2YgcmVjb3Jkcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZWZtdD1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIE9wdGlvbmFsbHkgc3BlY2lmeSBhIGZvcm1hdHRlciB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZm9ybWF0IGVhY2gKKyAgICAgICAgaW5kaXZpZHVhbCByZWNvcmQuCisgICAgICAgICIiIgorICAgICAgICBpZiBsaW5lZm10OgorICAgICAgICAgICAgc2VsZi5saW5lZm10ID0gbGluZWZtdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5saW5lZm10ID0gX2RlZmF1bHRGb3JtYXR0ZXIKKworICAgIGRlZiBmb3JtYXRIZWFkZXIoc2VsZiwgcmVjb3Jkcyk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGhlYWRlciBzdHJpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcmVjb3Jkcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAiIgorCisgICAgZGVmIGZvcm1hdEZvb3RlcihzZWxmLCByZWNvcmRzKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZm9vdGVyIHN0cmluZyBmb3IgdGhlIHNwZWNpZmllZCByZWNvcmRzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZHMpOgorICAgICAgICAiIiIKKyAgICAgICAgRm9ybWF0IHRoZSBzcGVjaWZpZWQgcmVjb3JkcyBhbmQgcmV0dXJuIHRoZSByZXN1bHQgYXMgYSBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICBydiA9ICIiCisgICAgICAgIGlmIGxlbihyZWNvcmRzKSA+IDA6CisgICAgICAgICAgICBydiA9IHJ2ICsgc2VsZi5mb3JtYXRIZWFkZXIocmVjb3JkcykKKyAgICAgICAgICAgIGZvciByZWNvcmQgaW4gcmVjb3JkczoKKyAgICAgICAgICAgICAgICBydiA9IHJ2ICsgc2VsZi5saW5lZm10LmZvcm1hdChyZWNvcmQpCisgICAgICAgICAgICBydiA9IHJ2ICsgc2VsZi5mb3JtYXRGb290ZXIocmVjb3JkcykKKyAgICAgICAgcmV0dXJuIHJ2CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBGaWx0ZXIgY2xhc3NlcyBhbmQgZnVuY3Rpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEZpbHRlcihvYmplY3QpOgorICAgICIiIgorICAgIEZpbHRlciBpbnN0YW5jZXMgYXJlIHVzZWQgdG8gcGVyZm9ybSBhcmJpdHJhcnkgZmlsdGVyaW5nIG9mIExvZ1JlY29yZHMuCisKKyAgICBMb2dnZXJzIGFuZCBIYW5kbGVycyBjYW4gb3B0aW9uYWxseSB1c2UgRmlsdGVyIGluc3RhbmNlcyB0byBmaWx0ZXIKKyAgICByZWNvcmRzIGFzIGRlc2lyZWQuIFRoZSBiYXNlIGZpbHRlciBjbGFzcyBvbmx5IGFsbG93cyBldmVudHMgd2hpY2ggYXJlCisgICAgYmVsb3cgYSBjZXJ0YWluIHBvaW50IGluIHRoZSBsb2dnZXIgaGllcmFyY2h5LiBGb3IgZXhhbXBsZSwgYSBmaWx0ZXIKKyAgICBpbml0aWFsaXplZCB3aXRoICJBLkIiIHdpbGwgYWxsb3cgZXZlbnRzIGxvZ2dlZCBieSBsb2dnZXJzICJBLkIiLAorICAgICJBLkIuQyIsICJBLkIuQy5EIiwgIkEuQi5EIiBldGMuIGJ1dCBub3QgIkEuQkIiLCAiQi5BLkIiIGV0Yy4gSWYKKyAgICBpbml0aWFsaXplZCB3aXRoIHRoZSBlbXB0eSBzdHJpbmcsIGFsbCBldmVudHMgYXJlIHBhc3NlZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0nJyk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIGEgZmlsdGVyLgorCisgICAgICAgIEluaXRpYWxpemUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbG9nZ2VyIHdoaWNoLCB0b2dldGhlciB3aXRoIGl0cworICAgICAgICBjaGlsZHJlbiwgd2lsbCBoYXZlIGl0cyBldmVudHMgYWxsb3dlZCB0aHJvdWdoIHRoZSBmaWx0ZXIuIElmIG5vCisgICAgICAgIG5hbWUgaXMgc3BlY2lmaWVkLCBhbGxvdyBldmVyeSBldmVudC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5ubGVuID0gbGVuKG5hbWUpCisKKyAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBEZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCByZWNvcmQgaXMgdG8gYmUgbG9nZ2VkLgorCisgICAgICAgIElzIHRoZSBzcGVjaWZpZWQgcmVjb3JkIHRvIGJlIGxvZ2dlZD8gUmV0dXJucyAwIGZvciBubywgbm9uemVybyBmb3IKKyAgICAgICAgeWVzLiBJZiBkZWVtZWQgYXBwcm9wcmlhdGUsIHRoZSByZWNvcmQgbWF5IGJlIG1vZGlmaWVkIGluLXBsYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5ubGVuID09IDA6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbGlmIHNlbGYubmFtZSA9PSByZWNvcmQubmFtZToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGVsaWYgcmVjb3JkLm5hbWUuZmluZChzZWxmLm5hbWUsIDAsIHNlbGYubmxlbikgIT0gMDoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiAocmVjb3JkLm5hbWVbc2VsZi5ubGVuXSA9PSAiLiIpCisKK2NsYXNzIEZpbHRlcmVyKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBiYXNlIGNsYXNzIGZvciBsb2dnZXJzIGFuZCBoYW5kbGVycyB3aGljaCBhbGxvd3MgdGhlbSB0byBzaGFyZQorICAgIGNvbW1vbiBjb2RlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIGxpc3Qgb2YgZmlsdGVycyB0byBiZSBhbiBlbXB0eSBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWx0ZXJzID0gW10KKworICAgIGRlZiBhZGRGaWx0ZXIoc2VsZiwgZmlsdGVyKToKKyAgICAgICAgIiIiCisgICAgICAgIEFkZCB0aGUgc3BlY2lmaWVkIGZpbHRlciB0byB0aGlzIGhhbmRsZXIuCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgKGZpbHRlciBpbiBzZWxmLmZpbHRlcnMpOgorICAgICAgICAgICAgc2VsZi5maWx0ZXJzLmFwcGVuZChmaWx0ZXIpCisKKyAgICBkZWYgcmVtb3ZlRmlsdGVyKHNlbGYsIGZpbHRlcik6CisgICAgICAgICIiIgorICAgICAgICBSZW1vdmUgdGhlIHNwZWNpZmllZCBmaWx0ZXIgZnJvbSB0aGlzIGhhbmRsZXIuCisgICAgICAgICIiIgorICAgICAgICBpZiBmaWx0ZXIgaW4gc2VsZi5maWx0ZXJzOgorICAgICAgICAgICAgc2VsZi5maWx0ZXJzLnJlbW92ZShmaWx0ZXIpCisKKyAgICBkZWYgZmlsdGVyKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBEZXRlcm1pbmUgaWYgYSByZWNvcmQgaXMgbG9nZ2FibGUgYnkgY29uc3VsdGluZyBhbGwgdGhlIGZpbHRlcnMuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gYWxsb3cgdGhlIHJlY29yZCB0byBiZSBsb2dnZWQ7IGFueSBmaWx0ZXIgY2FuIHZldG8KKyAgICAgICAgdGhpcyBhbmQgdGhlIHJlY29yZCBpcyB0aGVuIGRyb3BwZWQuIFJldHVybnMgYSB6ZXJvIHZhbHVlIGlmIGEgcmVjb3JkCisgICAgICAgIGlzIHRvIGJlIGRyb3BwZWQsIGVsc2Ugbm9uLXplcm8uCisgICAgICAgICIiIgorICAgICAgICBydiA9IDEKKyAgICAgICAgZm9yIGYgaW4gc2VsZi5maWx0ZXJzOgorICAgICAgICAgICAgaWYgbm90IGYuZmlsdGVyKHJlY29yZCk6CisgICAgICAgICAgICAgICAgcnYgPSAwCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIHJ2CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBIYW5kbGVyIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitfaGFuZGxlcnMgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKSAgI21hcCBvZiBoYW5kbGVyIG5hbWVzIHRvIGhhbmRsZXJzCitfaGFuZGxlckxpc3QgPSBbXSAjIGFkZGVkIHRvIGFsbG93IGhhbmRsZXJzIHRvIGJlIHJlbW92ZWQgaW4gcmV2ZXJzZSBvZiBvcmRlciBpbml0aWFsaXplZAorCitkZWYgX3JlbW92ZUhhbmRsZXJSZWYod3IpOgorICAgICIiIgorICAgIFJlbW92ZSBhIGhhbmRsZXIgcmVmZXJlbmNlIGZyb20gdGhlIGludGVybmFsIGNsZWFudXAgbGlzdC4KKyAgICAiIiIKKyAgICAjIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBkdXJpbmcgbW9kdWxlIHRlYXJkb3duLCB3aGVuIGdsb2JhbHMgYXJlCisgICAgIyBzZXQgdG8gTm9uZS4gSWYgX2FjcXVpcmVMb2NrIGlzIE5vbmUsIGFzc3VtZSB0aGlzIGlzIHRoZSBjYXNlIGFuZCBkbworICAgICMgbm90aGluZy4KKyAgICBpZiAoX2FjcXVpcmVMb2NrIGlzIG5vdCBOb25lIGFuZCBfaGFuZGxlckxpc3QgaXMgbm90IE5vbmUgYW5kCisgICAgICAgIF9yZWxlYXNlTG9jayBpcyBub3QgTm9uZSk6CisgICAgICAgIF9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHdyIGluIF9oYW5kbGVyTGlzdDoKKyAgICAgICAgICAgICAgICBfaGFuZGxlckxpc3QucmVtb3ZlKHdyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3JlbGVhc2VMb2NrKCkKKworZGVmIF9hZGRIYW5kbGVyUmVmKGhhbmRsZXIpOgorICAgICIiIgorICAgIEFkZCBhIGhhbmRsZXIgdG8gdGhlIGludGVybmFsIGNsZWFudXAgbGlzdCB1c2luZyBhIHdlYWsgcmVmZXJlbmNlLgorICAgICIiIgorICAgIF9hY3F1aXJlTG9jaygpCisgICAgdHJ5OgorICAgICAgICBfaGFuZGxlckxpc3QuYXBwZW5kKHdlYWtyZWYucmVmKGhhbmRsZXIsIF9yZW1vdmVIYW5kbGVyUmVmKSkKKyAgICBmaW5hbGx5OgorICAgICAgICBfcmVsZWFzZUxvY2soKQorCitjbGFzcyBIYW5kbGVyKEZpbHRlcmVyKToKKyAgICAiIiIKKyAgICBIYW5kbGVyIGluc3RhbmNlcyBkaXNwYXRjaCBsb2dnaW5nIGV2ZW50cyB0byBzcGVjaWZpYyBkZXN0aW5hdGlvbnMuCisKKyAgICBUaGUgYmFzZSBoYW5kbGVyIGNsYXNzLiBBY3RzIGFzIGEgcGxhY2Vob2xkZXIgd2hpY2ggZGVmaW5lcyB0aGUgSGFuZGxlcgorICAgIGludGVyZmFjZS4gSGFuZGxlcnMgY2FuIG9wdGlvbmFsbHkgdXNlIEZvcm1hdHRlciBpbnN0YW5jZXMgdG8gZm9ybWF0CisgICAgcmVjb3JkcyBhcyBkZXNpcmVkLiBCeSBkZWZhdWx0LCBubyBmb3JtYXR0ZXIgaXMgc3BlY2lmaWVkOyBpbiB0aGlzIGNhc2UsCisgICAgdGhlICdyYXcnIG1lc3NhZ2UgYXMgZGV0ZXJtaW5lZCBieSByZWNvcmQubWVzc2FnZSBpcyBsb2dnZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxldmVsPU5PVFNFVCk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgLSBiYXNpY2FsbHkgc2V0dGluZyB0aGUgZm9ybWF0dGVyIHRvIE5vbmUKKyAgICAgICAgYW5kIHRoZSBmaWx0ZXIgbGlzdCB0byBlbXB0eS4KKyAgICAgICAgIiIiCisgICAgICAgIEZpbHRlcmVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX25hbWUgPSBOb25lCisgICAgICAgIHNlbGYubGV2ZWwgPSBfY2hlY2tMZXZlbChsZXZlbCkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBOb25lCisgICAgICAgICMgQWRkIHRoZSBoYW5kbGVyIHRvIHRoZSBnbG9iYWwgX2hhbmRsZXJMaXN0IChmb3IgY2xlYW51cCBvbiBzaHV0ZG93bikKKyAgICAgICAgX2FkZEhhbmRsZXJSZWYoc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVMb2NrKCkKKworICAgIGRlZiBnZXRfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX25hbWUKKworICAgIGRlZiBzZXRfbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgX2FjcXVpcmVMb2NrKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbmFtZSBpbiBfaGFuZGxlcnM6CisgICAgICAgICAgICAgICAgZGVsIF9oYW5kbGVyc1tzZWxmLl9uYW1lXQorICAgICAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAgICAgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICAgICAgX2hhbmRsZXJzW25hbWVdID0gc2VsZgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3JlbGVhc2VMb2NrKCkKKworICAgIG5hbWUgPSBwcm9wZXJ0eShnZXRfbmFtZSwgc2V0X25hbWUpCisKKyAgICBkZWYgY3JlYXRlTG9jayhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEFjcXVpcmUgYSB0aHJlYWQgbG9jayBmb3Igc2VyaWFsaXppbmcgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIEkvTy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRocmVhZDoKKyAgICAgICAgICAgIHNlbGYubG9jayA9IHRocmVhZGluZy5STG9jaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmxvY2sgPSBOb25lCisKKyAgICBkZWYgYWNxdWlyZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEFjcXVpcmUgdGhlIEkvTyB0aHJlYWQgbG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYubG9jazoKKyAgICAgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKKworICAgIGRlZiByZWxlYXNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVsZWFzZSB0aGUgSS9PIHRocmVhZCBsb2NrLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5sb2NrOgorICAgICAgICAgICAgc2VsZi5sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHNldExldmVsKHNlbGYsIGxldmVsKToKKyAgICAgICAgIiIiCisgICAgICAgIFNldCB0aGUgbG9nZ2luZyBsZXZlbCBvZiB0aGlzIGhhbmRsZXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxldmVsID0gX2NoZWNrTGV2ZWwobGV2ZWwpCisKKyAgICBkZWYgZm9ybWF0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBGb3JtYXQgdGhlIHNwZWNpZmllZCByZWNvcmQuCisKKyAgICAgICAgSWYgYSBmb3JtYXR0ZXIgaXMgc2V0LCB1c2UgaXQuIE90aGVyd2lzZSwgdXNlIHRoZSBkZWZhdWx0IGZvcm1hdHRlcgorICAgICAgICBmb3IgdGhlIG1vZHVsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZm9ybWF0dGVyOgorICAgICAgICAgICAgZm10ID0gc2VsZi5mb3JtYXR0ZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZtdCA9IF9kZWZhdWx0Rm9ybWF0dGVyCisgICAgICAgIHJldHVybiBmbXQuZm9ybWF0KHJlY29yZCkKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBEbyB3aGF0ZXZlciBpdCB0YWtlcyB0byBhY3R1YWxseSBsb2cgdGhlIHNwZWNpZmllZCBsb2dnaW5nIHJlY29yZC4KKworICAgICAgICBUaGlzIHZlcnNpb24gaXMgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBhbmQgc28KKyAgICAgICAgcmFpc2VzIGEgTm90SW1wbGVtZW50ZWRFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ2VtaXQgbXVzdCBiZSBpbXBsZW1lbnRlZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2J5IEhhbmRsZXIgc3ViY2xhc3NlcycpCisKKyAgICBkZWYgaGFuZGxlKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBDb25kaXRpb25hbGx5IGVtaXQgdGhlIHNwZWNpZmllZCBsb2dnaW5nIHJlY29yZC4KKworICAgICAgICBFbWlzc2lvbiBkZXBlbmRzIG9uIGZpbHRlcnMgd2hpY2ggbWF5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGUgaGFuZGxlci4KKyAgICAgICAgV3JhcCB0aGUgYWN0dWFsIGVtaXNzaW9uIG9mIHRoZSByZWNvcmQgd2l0aCBhY3F1aXNpdGlvbi9yZWxlYXNlIG9mCisgICAgICAgIHRoZSBJL08gdGhyZWFkIGxvY2suIFJldHVybnMgd2hldGhlciB0aGUgZmlsdGVyIHBhc3NlZCB0aGUgcmVjb3JkIGZvcgorICAgICAgICBlbWlzc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJ2ID0gc2VsZi5maWx0ZXIocmVjb3JkKQorICAgICAgICBpZiBydjoKKyAgICAgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5lbWl0KHJlY29yZCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgc2V0Rm9ybWF0dGVyKHNlbGYsIGZtdCk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGZvcm1hdHRlciBmb3IgdGhpcyBoYW5kbGVyLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBmbXQKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEVuc3VyZSBhbGwgbG9nZ2luZyBvdXRwdXQgaGFzIGJlZW4gZmx1c2hlZC4KKworICAgICAgICBUaGlzIHZlcnNpb24gZG9lcyBub3RoaW5nIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieQorICAgICAgICBzdWJjbGFzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGlkeSB1cCBhbnkgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGhhbmRsZXIuCisKKyAgICAgICAgVGhpcyB2ZXJzaW9uIHJlbW92ZXMgdGhlIGhhbmRsZXIgZnJvbSBhbiBpbnRlcm5hbCBtYXAgb2YgaGFuZGxlcnMsCisgICAgICAgIF9oYW5kbGVycywgd2hpY2ggaXMgdXNlZCBmb3IgaGFuZGxlciBsb29rdXAgYnkgbmFtZS4gU3ViY2xhc3NlcworICAgICAgICBzaG91bGQgZW5zdXJlIHRoYXQgdGhpcyBnZXRzIGNhbGxlZCBmcm9tIG92ZXJyaWRkZW4gY2xvc2UoKQorICAgICAgICBtZXRob2RzLgorICAgICAgICAiIiIKKyAgICAgICAgI2dldCB0aGUgbW9kdWxlIGRhdGEgbG9jaywgYXMgd2UncmUgdXBkYXRpbmcgYSBzaGFyZWQgc3RydWN0dXJlLgorICAgICAgICBfYWNxdWlyZUxvY2soKQorICAgICAgICB0cnk6ICAgICN1bmxpa2VseSB0byByYWlzZSBhbiBleGNlcHRpb24sIGJ1dCB5b3UgbmV2ZXIga25vdy4uLgorICAgICAgICAgICAgaWYgc2VsZi5fbmFtZSBhbmQgc2VsZi5fbmFtZSBpbiBfaGFuZGxlcnM6CisgICAgICAgICAgICAgICAgZGVsIF9oYW5kbGVyc1tzZWxmLl9uYW1lXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3JlbGVhc2VMb2NrKCkKKworICAgIGRlZiBoYW5kbGVFcnJvcihzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgSGFuZGxlIGVycm9ycyB3aGljaCBvY2N1ciBkdXJpbmcgYW4gZW1pdCgpIGNhbGwuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGhhbmRsZXJzIHdoZW4gYW4gZXhjZXB0aW9uIGlzCisgICAgICAgIGVuY291bnRlcmVkIGR1cmluZyBhbiBlbWl0KCkgY2FsbC4gSWYgcmFpc2VFeGNlcHRpb25zIGlzIGZhbHNlLAorICAgICAgICBleGNlcHRpb25zIGdldCBzaWxlbnRseSBpZ25vcmVkLiBUaGlzIGlzIHdoYXQgaXMgbW9zdGx5IHdhbnRlZAorICAgICAgICBmb3IgYSBsb2dnaW5nIHN5c3RlbSAtIG1vc3QgdXNlcnMgd2lsbCBub3QgY2FyZSBhYm91dCBlcnJvcnMgaW4KKyAgICAgICAgdGhlIGxvZ2dpbmcgc3lzdGVtLCB0aGV5IGFyZSBtb3JlIGludGVyZXN0ZWQgaW4gYXBwbGljYXRpb24gZXJyb3JzLgorICAgICAgICBZb3UgY291bGQsIGhvd2V2ZXIsIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGhhbmRsZXIgaWYgeW91IHdpc2guCisgICAgICAgIFRoZSByZWNvcmQgd2hpY2ggd2FzIGJlaW5nIHByb2Nlc3NlZCBpcyBwYXNzZWQgaW4gdG8gdGhpcyBtZXRob2QuCisgICAgICAgICIiIgorICAgICAgICBpZiByYWlzZUV4Y2VwdGlvbnMgYW5kIHN5cy5zdGRlcnI6ICAjIHNlZSBpc3N1ZSAxMzgwNworICAgICAgICAgICAgZWkgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGNlcHRpb24oZWlbMF0sIGVpWzFdLCBlaVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIHN5cy5zdGRlcnIpCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnTG9nZ2VkIGZyb20gZmlsZSAlcywgbGluZSAlc1xuJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5maWxlbmFtZSwgcmVjb3JkLmxpbmVubykpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzICAgICMgc2VlIGlzc3VlIDU5NzEKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZGVsIGVpCisKK2NsYXNzIFN0cmVhbUhhbmRsZXIoSGFuZGxlcik6CisgICAgIiIiCisgICAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIHdyaXRlcyBsb2dnaW5nIHJlY29yZHMsIGFwcHJvcHJpYXRlbHkgZm9ybWF0dGVkLAorICAgIHRvIGEgc3RyZWFtLiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdCBjbG9zZSB0aGUgc3RyZWFtLCBhcworICAgIHN5cy5zdGRvdXQgb3Igc3lzLnN0ZGVyciBtYXkgYmUgdXNlZC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW09Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBoYW5kbGVyLgorCisgICAgICAgIElmIHN0cmVhbSBpcyBub3Qgc3BlY2lmaWVkLCBzeXMuc3RkZXJyIGlzIHVzZWQuCisgICAgICAgICIiIgorICAgICAgICBIYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGlmIHN0cmVhbSBpcyBOb25lOgorICAgICAgICAgICAgc3RyZWFtID0gc3lzLnN0ZGVycgorICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgRmx1c2hlcyB0aGUgc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5zdHJlYW0gYW5kIGhhc2F0dHIoc2VsZi5zdHJlYW0sICJmbHVzaCIpOgorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmZsdXNoKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRW1pdCBhIHJlY29yZC4KKworICAgICAgICBJZiBhIGZvcm1hdHRlciBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgdG8gZm9ybWF0IHRoZSByZWNvcmQuCisgICAgICAgIFRoZSByZWNvcmQgaXMgdGhlbiB3cml0dGVuIHRvIHRoZSBzdHJlYW0gd2l0aCBhIHRyYWlsaW5nIG5ld2xpbmUuICBJZgorICAgICAgICBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgcHJlc2VudCwgaXQgaXMgZm9ybWF0dGVkIHVzaW5nCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGNlcHRpb24gYW5kIGFwcGVuZGVkIHRvIHRoZSBzdHJlYW0uICBJZiB0aGUgc3RyZWFtCisgICAgICAgIGhhcyBhbiAnZW5jb2RpbmcnIGF0dHJpYnV0ZSwgaXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaG93IHRvIGRvIHRoZQorICAgICAgICBvdXRwdXQgdG8gdGhlIHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IHNlbGYuZm9ybWF0KHJlY29yZCkKKyAgICAgICAgICAgIHN0cmVhbSA9IHNlbGYuc3RyZWFtCisgICAgICAgICAgICBmcyA9ICIlc1xuIgorICAgICAgICAgICAgaWYgbm90IF91bmljb2RlOiAjaWYgbm8gdW5pY29kZSBzdXBwb3J0Li4uCisgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKGZzICUgbXNnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKG1zZywgdW5pY29kZSkgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHN0cmVhbSwgJ2VuY29kaW5nJywgTm9uZSkpOgorICAgICAgICAgICAgICAgICAgICAgICAgdWZzID0gZnMuZGVjb2RlKHN0cmVhbS5lbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUodWZzICUgbXNnKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjUHJpbnRpbmcgdG8gdGVybWluYWxzIHNvbWV0aW1lcyBmYWlscy4gRm9yIGV4YW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3dpdGggYW4gZW5jb2Rpbmcgb2YgJ2NwMTI1MScsIHRoZSBhYm92ZSB3cml0ZSB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI3dvcmsgaWYgd3JpdHRlbiB0byBhIHN0cmVhbSBvcGVuZWQgb3Igd3JhcHBlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICN0aGUgY29kZWNzIG1vZHVsZSwgYnV0IGZhaWwgd2hlbiB3cml0aW5nIHRvIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjdGVybWluYWwgZXZlbiB3aGVuIHRoZSBjb2RlcGFnZSBpcyBzZXQgdG8gY3AxMjUxLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNBbiBleHRyYSBlbmNvZGluZyBzdGVwIHNlZW1zIHRvIGJlIG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoKHVmcyAlIG1zZykuZW5jb2RlKHN0cmVhbS5lbmNvZGluZykpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoZnMgJSBtc2cpCisgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKGZzICUgbXNnLmVuY29kZSgiVVRGLTgiKSkKKyAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IocmVjb3JkKQorCitjbGFzcyBGaWxlSGFuZGxlcihTdHJlYW1IYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggd3JpdGVzIGZvcm1hdHRlZCBsb2dnaW5nIHJlY29yZHMgdG8gZGlzayBmaWxlcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1vZGU9J2EnLCBlbmNvZGluZz1Ob25lLCBkZWxheT0wKToKKyAgICAgICAgIiIiCisgICAgICAgIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGFuZCB1c2UgaXQgYXMgdGhlIHN0cmVhbSBmb3IgbG9nZ2luZy4KKyAgICAgICAgIiIiCisgICAgICAgICNrZWVwIHRoZSBhYnNvbHV0ZSBwYXRoLCBvdGhlcndpc2UgZGVyaXZlZCBjbGFzc2VzIHdoaWNoIHVzZSB0aGlzCisgICAgICAgICNtYXkgY29tZSBhIGNyb3BwZXIgd2hlbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgY2hhbmdlcworICAgICAgICBpZiBjb2RlY3MgaXMgTm9uZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gTm9uZQorICAgICAgICBzZWxmLmJhc2VGaWxlbmFtZSA9IG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgaWYgZGVsYXk6CisgICAgICAgICAgICAjV2UgZG9uJ3Qgb3BlbiB0aGUgc3RyZWFtLCBidXQgd2Ugc3RpbGwgbmVlZCB0byBjYWxsIHRoZQorICAgICAgICAgICAgI0hhbmRsZXIgY29uc3RydWN0b3IgdG8gc2V0IGxldmVsLCBmb3JtYXR0ZXIsIGxvY2sgZXRjLgorICAgICAgICAgICAgSGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTdHJlYW1IYW5kbGVyLl9faW5pdF9fKHNlbGYsIHNlbGYuX29wZW4oKSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENsb3NlcyB0aGUgc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5zdHJlYW06CisgICAgICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnN0cmVhbSwgImNsb3NlIik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBTdHJlYW1IYW5kbGVyLmNsb3NlKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBOb25lCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgZGVmIF9vcGVuKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgT3BlbiB0aGUgY3VycmVudCBiYXNlIGZpbGUgd2l0aCB0aGUgKG9yaWdpbmFsKSBtb2RlIGFuZCBlbmNvZGluZy4KKyAgICAgICAgUmV0dXJuIHRoZSByZXN1bHRpbmcgc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5lbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgc3RyZWFtID0gb3BlbihzZWxmLmJhc2VGaWxlbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RyZWFtID0gY29kZWNzLm9wZW4oc2VsZi5iYXNlRmlsZW5hbWUsIHNlbGYubW9kZSwgc2VsZi5lbmNvZGluZykKKyAgICAgICAgcmV0dXJuIHN0cmVhbQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgSWYgdGhlIHN0cmVhbSB3YXMgbm90IG9wZW5lZCBiZWNhdXNlICdkZWxheScgd2FzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgICAgY29uc3RydWN0b3IsIG9wZW4gaXQgYmVmb3JlIGNhbGxpbmcgdGhlIHN1cGVyY2xhc3MncyBlbWl0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5zdHJlYW0gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc2VsZi5fb3BlbigpCisgICAgICAgIFN0cmVhbUhhbmRsZXIuZW1pdChzZWxmLCByZWNvcmQpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgICBNYW5hZ2VyIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBQbGFjZUhvbGRlcihvYmplY3QpOgorICAgICIiIgorICAgIFBsYWNlSG9sZGVyIGluc3RhbmNlcyBhcmUgdXNlZCBpbiB0aGUgTWFuYWdlciBsb2dnZXIgaGllcmFyY2h5IHRvIHRha2UKKyAgICB0aGUgcGxhY2Ugb2Ygbm9kZXMgZm9yIHdoaWNoIG5vIGxvZ2dlcnMgaGF2ZSBiZWVuIGRlZmluZWQuIFRoaXMgY2xhc3MgaXMKKyAgICBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgYW5kIG5vdCBhcyBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbG9nZ2VyKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgd2l0aCB0aGUgc3BlY2lmaWVkIGxvZ2dlciBiZWluZyBhIGNoaWxkIG9mIHRoaXMgcGxhY2Vob2xkZXIuCisgICAgICAgICIiIgorICAgICAgICAjc2VsZi5sb2dnZXJzID0gW2Fsb2dnZXJdCisgICAgICAgIHNlbGYubG9nZ2VyTWFwID0geyBhbG9nZ2VyIDogTm9uZSB9CisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIGFsb2dnZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgQWRkIHRoZSBzcGVjaWZpZWQgbG9nZ2VyIGFzIGEgY2hpbGQgb2YgdGhpcyBwbGFjZWhvbGRlci4KKyAgICAgICAgIiIiCisgICAgICAgICNpZiBhbG9nZ2VyIG5vdCBpbiBzZWxmLmxvZ2dlcnM6CisgICAgICAgIGlmIGFsb2dnZXIgbm90IGluIHNlbGYubG9nZ2VyTWFwOgorICAgICAgICAgICAgI3NlbGYubG9nZ2Vycy5hcHBlbmQoYWxvZ2dlcikKKyAgICAgICAgICAgIHNlbGYubG9nZ2VyTWFwW2Fsb2dnZXJdID0gTm9uZQorCisjCisjICAgRGV0ZXJtaW5lIHdoaWNoIGNsYXNzIHRvIHVzZSB3aGVuIGluc3RhbnRpYXRpbmcgbG9nZ2Vycy4KKyMKK19sb2dnZXJDbGFzcyA9IE5vbmUKKworZGVmIHNldExvZ2dlckNsYXNzKGtsYXNzKToKKyAgICAiIiIKKyAgICBTZXQgdGhlIGNsYXNzIHRvIGJlIHVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIGEgbG9nZ2VyLiBUaGUgY2xhc3Mgc2hvdWxkCisgICAgZGVmaW5lIF9faW5pdF9fKCkgc3VjaCB0aGF0IG9ubHkgYSBuYW1lIGFyZ3VtZW50IGlzIHJlcXVpcmVkLCBhbmQgdGhlCisgICAgX19pbml0X18oKSBzaG91bGQgY2FsbCBMb2dnZXIuX19pbml0X18oKQorICAgICIiIgorICAgIGlmIGtsYXNzICE9IExvZ2dlcjoKKyAgICAgICAgaWYgbm90IGlzc3ViY2xhc3Moa2xhc3MsIExvZ2dlcik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImxvZ2dlciBub3QgZGVyaXZlZCBmcm9tIGxvZ2dpbmcuTG9nZ2VyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBrbGFzcy5fX25hbWVfXykKKyAgICBnbG9iYWwgX2xvZ2dlckNsYXNzCisgICAgX2xvZ2dlckNsYXNzID0ga2xhc3MKKworZGVmIGdldExvZ2dlckNsYXNzKCk6CisgICAgIiIiCisgICAgUmV0dXJuIHRoZSBjbGFzcyB0byBiZSB1c2VkIHdoZW4gaW5zdGFudGlhdGluZyBhIGxvZ2dlci4KKyAgICAiIiIKKworICAgIHJldHVybiBfbG9nZ2VyQ2xhc3MKKworY2xhc3MgTWFuYWdlcihvYmplY3QpOgorICAgICIiIgorICAgIFRoZXJlIGlzIFt1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlc10ganVzdCBvbmUgTWFuYWdlciBpbnN0YW5jZSwgd2hpY2gKKyAgICBob2xkcyB0aGUgaGllcmFyY2h5IG9mIGxvZ2dlcnMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJvb3Rub2RlKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIG1hbmFnZXIgd2l0aCB0aGUgcm9vdCBub2RlIG9mIHRoZSBsb2dnZXIgaGllcmFyY2h5LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5yb290ID0gcm9vdG5vZGUKKyAgICAgICAgc2VsZi5kaXNhYmxlID0gMAorICAgICAgICBzZWxmLmVtaXR0ZWROb0hhbmRsZXJXYXJuaW5nID0gMAorICAgICAgICBzZWxmLmxvZ2dlckRpY3QgPSB7fQorICAgICAgICBzZWxmLmxvZ2dlckNsYXNzID0gTm9uZQorCisgICAgZGVmIGdldExvZ2dlcihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCBhIGxvZ2dlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSAoY2hhbm5lbCBuYW1lKSwgY3JlYXRpbmcgaXQKKyAgICAgICAgaWYgaXQgZG9lc24ndCB5ZXQgZXhpc3QuIFRoaXMgbmFtZSBpcyBhIGRvdC1zZXBhcmF0ZWQgaGllcmFyY2hpY2FsCisgICAgICAgIG5hbWUsIHN1Y2ggYXMgImEiLCAiYS5iIiwgImEuYi5jIiBvciBzaW1pbGFyLgorCisgICAgICAgIElmIGEgUGxhY2VIb2xkZXIgZXhpc3RlZCBmb3IgdGhlIHNwZWNpZmllZCBuYW1lIFtpLmUuIHRoZSBsb2dnZXIKKyAgICAgICAgZGlkbid0IGV4aXN0IGJ1dCBhIGNoaWxkIG9mIGl0IGRpZF0sIHJlcGxhY2UgaXQgd2l0aCB0aGUgY3JlYXRlZAorICAgICAgICBsb2dnZXIgYW5kIGZpeCB1cCB0aGUgcGFyZW50L2NoaWxkIHJlZmVyZW5jZXMgd2hpY2ggcG9pbnRlZCB0byB0aGUKKyAgICAgICAgcGxhY2Vob2xkZXIgdG8gbm93IHBvaW50IHRvIHRoZSBsb2dnZXIuCisgICAgICAgICIiIgorICAgICAgICBydiA9IE5vbmUKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobmFtZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0EgbG9nZ2VyIG5hbWUgbXVzdCBiZSBzdHJpbmcgb3IgVW5pY29kZScpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgdW5pY29kZSk6CisgICAgICAgICAgICBuYW1lID0gbmFtZS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgX2FjcXVpcmVMb2NrKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLmxvZ2dlckRpY3Q6CisgICAgICAgICAgICAgICAgcnYgPSBzZWxmLmxvZ2dlckRpY3RbbmFtZV0KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJ2LCBQbGFjZUhvbGRlcik6CisgICAgICAgICAgICAgICAgICAgIHBoID0gcnYKKyAgICAgICAgICAgICAgICAgICAgcnYgPSAoc2VsZi5sb2dnZXJDbGFzcyBvciBfbG9nZ2VyQ2xhc3MpKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHJ2Lm1hbmFnZXIgPSBzZWxmCisgICAgICAgICAgICAgICAgICAgIHNlbGYubG9nZ2VyRGljdFtuYW1lXSA9IHJ2CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpeHVwQ2hpbGRyZW4ocGgsIHJ2KQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9maXh1cFBhcmVudHMocnYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJ2ID0gKHNlbGYubG9nZ2VyQ2xhc3Mgb3IgX2xvZ2dlckNsYXNzKShuYW1lKQorICAgICAgICAgICAgICAgIHJ2Lm1hbmFnZXIgPSBzZWxmCisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXJEaWN0W25hbWVdID0gcnYKKyAgICAgICAgICAgICAgICBzZWxmLl9maXh1cFBhcmVudHMocnYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBfcmVsZWFzZUxvY2soKQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBzZXRMb2dnZXJDbGFzcyhzZWxmLCBrbGFzcyk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGNsYXNzIHRvIGJlIHVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIGEgbG9nZ2VyIHdpdGggdGhpcyBNYW5hZ2VyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYga2xhc3MgIT0gTG9nZ2VyOgorICAgICAgICAgICAgaWYgbm90IGlzc3ViY2xhc3Moa2xhc3MsIExvZ2dlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJsb2dnZXIgbm90IGRlcml2ZWQgZnJvbSBsb2dnaW5nLkxvZ2dlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtsYXNzLl9fbmFtZV9fKQorICAgICAgICBzZWxmLmxvZ2dlckNsYXNzID0ga2xhc3MKKworICAgIGRlZiBfZml4dXBQYXJlbnRzKHNlbGYsIGFsb2dnZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgRW5zdXJlIHRoYXQgdGhlcmUgYXJlIGVpdGhlciBsb2dnZXJzIG9yIHBsYWNlaG9sZGVycyBhbGwgdGhlIHdheQorICAgICAgICBmcm9tIHRoZSBzcGVjaWZpZWQgbG9nZ2VyIHRvIHRoZSByb290IG9mIHRoZSBsb2dnZXIgaGllcmFyY2h5LgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IGFsb2dnZXIubmFtZQorICAgICAgICBpID0gbmFtZS5yZmluZCgiLiIpCisgICAgICAgIHJ2ID0gTm9uZQorICAgICAgICB3aGlsZSAoaSA+IDApIGFuZCBub3QgcnY6CisgICAgICAgICAgICBzdWJzdHIgPSBuYW1lWzppXQorICAgICAgICAgICAgaWYgc3Vic3RyIG5vdCBpbiBzZWxmLmxvZ2dlckRpY3Q6CisgICAgICAgICAgICAgICAgc2VsZi5sb2dnZXJEaWN0W3N1YnN0cl0gPSBQbGFjZUhvbGRlcihhbG9nZ2VyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvYmogPSBzZWxmLmxvZ2dlckRpY3Rbc3Vic3RyXQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBMb2dnZXIpOgorICAgICAgICAgICAgICAgICAgICBydiA9IG9iagorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKG9iaiwgUGxhY2VIb2xkZXIpCisgICAgICAgICAgICAgICAgICAgIG9iai5hcHBlbmQoYWxvZ2dlcikKKyAgICAgICAgICAgIGkgPSBuYW1lLnJmaW5kKCIuIiwgMCwgaSAtIDEpCisgICAgICAgIGlmIG5vdCBydjoKKyAgICAgICAgICAgIHJ2ID0gc2VsZi5yb290CisgICAgICAgIGFsb2dnZXIucGFyZW50ID0gcnYKKworICAgIGRlZiBfZml4dXBDaGlsZHJlbihzZWxmLCBwaCwgYWxvZ2dlcik6CisgICAgICAgICIiIgorICAgICAgICBFbnN1cmUgdGhhdCBjaGlsZHJlbiBvZiB0aGUgcGxhY2Vob2xkZXIgcGggYXJlIGNvbm5lY3RlZCB0byB0aGUKKyAgICAgICAgc3BlY2lmaWVkIGxvZ2dlci4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBhbG9nZ2VyLm5hbWUKKyAgICAgICAgbmFtZWxlbiA9IGxlbihuYW1lKQorICAgICAgICBmb3IgYyBpbiBwaC5sb2dnZXJNYXAua2V5cygpOgorICAgICAgICAgICAgI1RoZSBpZiBtZWFucyAuLi4gaWYgbm90IGMucGFyZW50Lm5hbWUuc3RhcnRzd2l0aChubSkKKyAgICAgICAgICAgIGlmIGMucGFyZW50Lm5hbWVbOm5hbWVsZW5dICE9IG5hbWU6CisgICAgICAgICAgICAgICAgYWxvZ2dlci5wYXJlbnQgPSBjLnBhcmVudAorICAgICAgICAgICAgICAgIGMucGFyZW50ID0gYWxvZ2dlcgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjICAgTG9nZ2VyIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMb2dnZXIoRmlsdGVyZXIpOgorICAgICIiIgorICAgIEluc3RhbmNlcyBvZiB0aGUgTG9nZ2VyIGNsYXNzIHJlcHJlc2VudCBhIHNpbmdsZSBsb2dnaW5nIGNoYW5uZWwuIEEKKyAgICAibG9nZ2luZyBjaGFubmVsIiBpbmRpY2F0ZXMgYW4gYXJlYSBvZiBhbiBhcHBsaWNhdGlvbi4gRXhhY3RseSBob3cgYW4KKyAgICAiYXJlYSIgaXMgZGVmaW5lZCBpcyB1cCB0byB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyLiBTaW5jZSBhbgorICAgIGFwcGxpY2F0aW9uIGNhbiBoYXZlIGFueSBudW1iZXIgb2YgYXJlYXMsIGxvZ2dpbmcgY2hhbm5lbHMgYXJlIGlkZW50aWZpZWQKKyAgICBieSBhIHVuaXF1ZSBzdHJpbmcuIEFwcGxpY2F0aW9uIGFyZWFzIGNhbiBiZSBuZXN0ZWQgKGUuZy4gYW4gYXJlYQorICAgIG9mICJpbnB1dCBwcm9jZXNzaW5nIiBtaWdodCBpbmNsdWRlIHN1Yi1hcmVhcyAicmVhZCBDU1YgZmlsZXMiLCAicmVhZAorICAgIFhMUyBmaWxlcyIgYW5kICJyZWFkIEdudW1lcmljIGZpbGVzIikuIFRvIGNhdGVyIGZvciB0aGlzIG5hdHVyYWwgbmVzdGluZywKKyAgICBjaGFubmVsIG5hbWVzIGFyZSBvcmdhbml6ZWQgaW50byBhIG5hbWVzcGFjZSBoaWVyYXJjaHkgd2hlcmUgbGV2ZWxzIGFyZQorICAgIHNlcGFyYXRlZCBieSBwZXJpb2RzLCBtdWNoIGxpa2UgdGhlIEphdmEgb3IgUHl0aG9uIHBhY2thZ2UgbmFtZXNwYWNlLiBTbworICAgIGluIHRoZSBpbnN0YW5jZSBnaXZlbiBhYm92ZSwgY2hhbm5lbCBuYW1lcyBtaWdodCBiZSAiaW5wdXQiIGZvciB0aGUgdXBwZXIKKyAgICBsZXZlbCwgYW5kICJpbnB1dC5jc3YiLCAiaW5wdXQueGxzIiBhbmQgImlucHV0LmdudSIgZm9yIHRoZSBzdWItbGV2ZWxzLgorICAgIFRoZXJlIGlzIG5vIGFyYml0cmFyeSBsaW1pdCB0byB0aGUgZGVwdGggb2YgbmVzdGluZy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbGV2ZWw9Tk9UU0VUKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIGxvZ2dlciB3aXRoIGEgbmFtZSBhbmQgYW4gb3B0aW9uYWwgbGV2ZWwuCisgICAgICAgICIiIgorICAgICAgICBGaWx0ZXJlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYubGV2ZWwgPSBfY2hlY2tMZXZlbChsZXZlbCkKKyAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisgICAgICAgIHNlbGYucHJvcGFnYXRlID0gMQorICAgICAgICBzZWxmLmhhbmRsZXJzID0gW10KKyAgICAgICAgc2VsZi5kaXNhYmxlZCA9IDAKKworICAgIGRlZiBzZXRMZXZlbChzZWxmLCBsZXZlbCk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIGxvZ2dpbmcgbGV2ZWwgb2YgdGhpcyBsb2dnZXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxldmVsID0gX2NoZWNrTGV2ZWwobGV2ZWwpCisKKyAgICBkZWYgZGVidWcoc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgTG9nICdtc2cgJSBhcmdzJyB3aXRoIHNldmVyaXR5ICdERUJVRycuCisKKyAgICAgICAgVG8gcGFzcyBleGNlcHRpb24gaW5mb3JtYXRpb24sIHVzZSB0aGUga2V5d29yZCBhcmd1bWVudCBleGNfaW5mbyB3aXRoCisgICAgICAgIGEgdHJ1ZSB2YWx1ZSwgZS5nLgorCisgICAgICAgIGxvZ2dlci5kZWJ1ZygiSG91c3Rvbiwgd2UgaGF2ZSBhICVzIiwgInRob3JueSBwcm9ibGVtIiwgZXhjX2luZm89MSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaXNFbmFibGVkRm9yKERFQlVHKToKKyAgICAgICAgICAgIHNlbGYuX2xvZyhERUJVRywgbXNnLCBhcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBpbmZvKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIExvZyAnbXNnICUgYXJncycgd2l0aCBzZXZlcml0eSAnSU5GTycuCisKKyAgICAgICAgVG8gcGFzcyBleGNlcHRpb24gaW5mb3JtYXRpb24sIHVzZSB0aGUga2V5d29yZCBhcmd1bWVudCBleGNfaW5mbyB3aXRoCisgICAgICAgIGEgdHJ1ZSB2YWx1ZSwgZS5nLgorCisgICAgICAgIGxvZ2dlci5pbmZvKCJIb3VzdG9uLCB3ZSBoYXZlIGEgJXMiLCAiaW50ZXJlc3RpbmcgcHJvYmxlbSIsIGV4Y19pbmZvPTEpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmlzRW5hYmxlZEZvcihJTkZPKToKKyAgICAgICAgICAgIHNlbGYuX2xvZyhJTkZPLCBtc2csIGFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHdhcm5pbmcoc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgTG9nICdtc2cgJSBhcmdzJyB3aXRoIHNldmVyaXR5ICdXQVJOSU5HJy4KKworICAgICAgICBUbyBwYXNzIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiwgdXNlIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGV4Y19pbmZvIHdpdGgKKyAgICAgICAgYSB0cnVlIHZhbHVlLCBlLmcuCisKKyAgICAgICAgbG9nZ2VyLndhcm5pbmcoIkhvdXN0b24sIHdlIGhhdmUgYSAlcyIsICJiaXQgb2YgYSBwcm9ibGVtIiwgZXhjX2luZm89MSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaXNFbmFibGVkRm9yKFdBUk5JTkcpOgorICAgICAgICAgICAgc2VsZi5fbG9nKFdBUk5JTkcsIG1zZywgYXJncywgKiprd2FyZ3MpCisKKyAgICB3YXJuID0gd2FybmluZworCisgICAgZGVmIGVycm9yKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIExvZyAnbXNnICUgYXJncycgd2l0aCBzZXZlcml0eSAnRVJST1InLgorCisgICAgICAgIFRvIHBhc3MgZXhjZXB0aW9uIGluZm9ybWF0aW9uLCB1c2UgdGhlIGtleXdvcmQgYXJndW1lbnQgZXhjX2luZm8gd2l0aAorICAgICAgICBhIHRydWUgdmFsdWUsIGUuZy4KKworICAgICAgICBsb2dnZXIuZXJyb3IoIkhvdXN0b24sIHdlIGhhdmUgYSAlcyIsICJtYWpvciBwcm9ibGVtIiwgZXhjX2luZm89MSkKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaXNFbmFibGVkRm9yKEVSUk9SKToKKyAgICAgICAgICAgIHNlbGYuX2xvZyhFUlJPUiwgbXNnLCBhcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBleGNlcHRpb24oc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29udmVuaWVuY2UgbWV0aG9kIGZvciBsb2dnaW5nIGFuIEVSUk9SIHdpdGggZXhjZXB0aW9uIGluZm9ybWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAga3dhcmdzWydleGNfaW5mbyddID0gMQorICAgICAgICBzZWxmLmVycm9yKG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGNyaXRpY2FsKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIExvZyAnbXNnICUgYXJncycgd2l0aCBzZXZlcml0eSAnQ1JJVElDQUwnLgorCisgICAgICAgIFRvIHBhc3MgZXhjZXB0aW9uIGluZm9ybWF0aW9uLCB1c2UgdGhlIGtleXdvcmQgYXJndW1lbnQgZXhjX2luZm8gd2l0aAorICAgICAgICBhIHRydWUgdmFsdWUsIGUuZy4KKworICAgICAgICBsb2dnZXIuY3JpdGljYWwoIkhvdXN0b24sIHdlIGhhdmUgYSAlcyIsICJtYWpvciBkaXNhc3RlciIsIGV4Y19pbmZvPTEpCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmlzRW5hYmxlZEZvcihDUklUSUNBTCk6CisgICAgICAgICAgICBzZWxmLl9sb2coQ1JJVElDQUwsIG1zZywgYXJncywgKiprd2FyZ3MpCisKKyAgICBmYXRhbCA9IGNyaXRpY2FsCisKKyAgICBkZWYgbG9nKHNlbGYsIGxldmVsLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBMb2cgJ21zZyAlIGFyZ3MnIHdpdGggdGhlIGludGVnZXIgc2V2ZXJpdHkgJ2xldmVsJy4KKworICAgICAgICBUbyBwYXNzIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbiwgdXNlIHRoZSBrZXl3b3JkIGFyZ3VtZW50IGV4Y19pbmZvIHdpdGgKKyAgICAgICAgYSB0cnVlIHZhbHVlLCBlLmcuCisKKyAgICAgICAgbG9nZ2VyLmxvZyhsZXZlbCwgIldlIGhhdmUgYSAlcyIsICJteXN0ZXJpb3VzIHByb2JsZW0iLCBleGNfaW5mbz0xKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobGV2ZWwsIGludCk6CisgICAgICAgICAgICBpZiByYWlzZUV4Y2VwdGlvbnM6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJsZXZlbCBtdXN0IGJlIGFuIGludGVnZXIiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5pc0VuYWJsZWRGb3IobGV2ZWwpOgorICAgICAgICAgICAgc2VsZi5fbG9nKGxldmVsLCBtc2csIGFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGZpbmRDYWxsZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBGaW5kIHRoZSBzdGFjayBmcmFtZSBvZiB0aGUgY2FsbGVyIHNvIHRoYXQgd2UgY2FuIG5vdGUgdGhlIHNvdXJjZQorICAgICAgICBmaWxlIG5hbWUsIGxpbmUgbnVtYmVyIGFuZCBmdW5jdGlvbiBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgZiA9IGN1cnJlbnRmcmFtZSgpCisgICAgICAgICNPbiBzb21lIHZlcnNpb25zIG9mIElyb25QeXRob24sIGN1cnJlbnRmcmFtZSgpIHJldHVybnMgTm9uZSBpZgorICAgICAgICAjSXJvblB5dGhvbiBpc24ndCBydW4gd2l0aCAtWDpGcmFtZXMuCisgICAgICAgIGlmIGYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmID0gZi5mX2JhY2sKKyAgICAgICAgcnYgPSAiKHVua25vd24gZmlsZSkiLCAwLCAiKHVua25vd24gZnVuY3Rpb24pIgorICAgICAgICB3aGlsZSBoYXNhdHRyKGYsICJmX2NvZGUiKToKKyAgICAgICAgICAgIGNvID0gZi5mX2NvZGUKKyAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5ub3JtY2FzZShjby5jb19maWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lID09IF9zcmNmaWxlOgorICAgICAgICAgICAgICAgIGYgPSBmLmZfYmFjaworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBydiA9IChjby5jb19maWxlbmFtZSwgZi5mX2xpbmVubywgY28uY29fbmFtZSkKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIG1ha2VSZWNvcmQoc2VsZiwgbmFtZSwgbGV2ZWwsIGZuLCBsbm8sIG1zZywgYXJncywgZXhjX2luZm8sIGZ1bmM9Tm9uZSwgZXh0cmE9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBBIGZhY3RvcnkgbWV0aG9kIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGluIHN1YmNsYXNzZXMgdG8gY3JlYXRlCisgICAgICAgIHNwZWNpYWxpemVkIExvZ1JlY29yZHMuCisgICAgICAgICIiIgorICAgICAgICBydiA9IExvZ1JlY29yZChuYW1lLCBsZXZlbCwgZm4sIGxubywgbXNnLCBhcmdzLCBleGNfaW5mbywgZnVuYykKKyAgICAgICAgaWYgZXh0cmEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3Iga2V5IGluIGV4dHJhOgorICAgICAgICAgICAgICAgIGlmIChrZXkgaW4gWyJtZXNzYWdlIiwgImFzY3RpbWUiXSkgb3IgKGtleSBpbiBydi5fX2RpY3RfXyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJBdHRlbXB0IHRvIG92ZXJ3cml0ZSAlciBpbiBMb2dSZWNvcmQiICUga2V5KQorICAgICAgICAgICAgICAgIHJ2Ll9fZGljdF9fW2tleV0gPSBleHRyYVtrZXldCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIF9sb2coc2VsZiwgbGV2ZWwsIG1zZywgYXJncywgZXhjX2luZm89Tm9uZSwgZXh0cmE9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBMb3ctbGV2ZWwgbG9nZ2luZyByb3V0aW5lIHdoaWNoIGNyZWF0ZXMgYSBMb2dSZWNvcmQgYW5kIHRoZW4gY2FsbHMKKyAgICAgICAgYWxsIHRoZSBoYW5kbGVycyBvZiB0aGlzIGxvZ2dlciB0byBoYW5kbGUgdGhlIHJlY29yZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIF9zcmNmaWxlOgorICAgICAgICAgICAgI0lyb25QeXRob24gZG9lc24ndCB0cmFjayBQeXRob24gZnJhbWVzLCBzbyBmaW5kQ2FsbGVyIHJhaXNlcyBhbgorICAgICAgICAgICAgI2V4Y2VwdGlvbiBvbiBzb21lIHZlcnNpb25zIG9mIElyb25QeXRob24uIFdlIHRyYXAgaXQgaGVyZSBzbyB0aGF0CisgICAgICAgICAgICAjSXJvblB5dGhvbiBjYW4gdXNlIGxvZ2dpbmcuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm4sIGxubywgZnVuYyA9IHNlbGYuZmluZENhbGxlcigpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBmbiwgbG5vLCBmdW5jID0gIih1bmtub3duIGZpbGUpIiwgMCwgIih1bmtub3duIGZ1bmN0aW9uKSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZuLCBsbm8sIGZ1bmMgPSAiKHVua25vd24gZmlsZSkiLCAwLCAiKHVua25vd24gZnVuY3Rpb24pIgorICAgICAgICBpZiBleGNfaW5mbzoKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4Y19pbmZvLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgZXhjX2luZm8gPSBzeXMuZXhjX2luZm8oKQorICAgICAgICByZWNvcmQgPSBzZWxmLm1ha2VSZWNvcmQoc2VsZi5uYW1lLCBsZXZlbCwgZm4sIGxubywgbXNnLCBhcmdzLCBleGNfaW5mbywgZnVuYywgZXh0cmEpCisgICAgICAgIHNlbGYuaGFuZGxlKHJlY29yZCkKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIENhbGwgdGhlIGhhbmRsZXJzIGZvciB0aGUgc3BlY2lmaWVkIHJlY29yZC4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciB1bnBpY2tsZWQgcmVjb3JkcyByZWNlaXZlZCBmcm9tIGEgc29ja2V0LCBhcworICAgICAgICB3ZWxsIGFzIHRob3NlIGNyZWF0ZWQgbG9jYWxseS4gTG9nZ2VyLWxldmVsIGZpbHRlcmluZyBpcyBhcHBsaWVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgKG5vdCBzZWxmLmRpc2FibGVkKSBhbmQgc2VsZi5maWx0ZXIocmVjb3JkKToKKyAgICAgICAgICAgIHNlbGYuY2FsbEhhbmRsZXJzKHJlY29yZCkKKworICAgIGRlZiBhZGRIYW5kbGVyKHNlbGYsIGhkbHIpOgorICAgICAgICAiIiIKKyAgICAgICAgQWRkIHRoZSBzcGVjaWZpZWQgaGFuZGxlciB0byB0aGlzIGxvZ2dlci4KKyAgICAgICAgIiIiCisgICAgICAgIF9hY3F1aXJlTG9jaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCAoaGRsciBpbiBzZWxmLmhhbmRsZXJzKToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZXJzLmFwcGVuZChoZGxyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3JlbGVhc2VMb2NrKCkKKworICAgIGRlZiByZW1vdmVIYW5kbGVyKHNlbGYsIGhkbHIpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgaGFuZGxlciBmcm9tIHRoaXMgbG9nZ2VyLgorICAgICAgICAiIiIKKyAgICAgICAgX2FjcXVpcmVMb2NrKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaGRsciBpbiBzZWxmLmhhbmRsZXJzOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlcnMucmVtb3ZlKGhkbHIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBfcmVsZWFzZUxvY2soKQorCisgICAgZGVmIGNhbGxIYW5kbGVycyhzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgUGFzcyBhIHJlY29yZCB0byBhbGwgcmVsZXZhbnQgaGFuZGxlcnMuCisKKyAgICAgICAgTG9vcCB0aHJvdWdoIGFsbCBoYW5kbGVycyBmb3IgdGhpcyBsb2dnZXIgYW5kIGl0cyBwYXJlbnRzIGluIHRoZQorICAgICAgICBsb2dnZXIgaGllcmFyY2h5LiBJZiBubyBoYW5kbGVyIHdhcyBmb3VuZCwgb3V0cHV0IGEgb25lLW9mZiBlcnJvcgorICAgICAgICBtZXNzYWdlIHRvIHN5cy5zdGRlcnIuIFN0b3Agc2VhcmNoaW5nIHVwIHRoZSBoaWVyYXJjaHkgd2hlbmV2ZXIgYQorICAgICAgICBsb2dnZXIgd2l0aCB0aGUgInByb3BhZ2F0ZSIgYXR0cmlidXRlIHNldCB0byB6ZXJvIGlzIGZvdW5kIC0gdGhhdAorICAgICAgICB3aWxsIGJlIHRoZSBsYXN0IGxvZ2dlciB3aG9zZSBoYW5kbGVycyBhcmUgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgYyA9IHNlbGYKKyAgICAgICAgZm91bmQgPSAwCisgICAgICAgIHdoaWxlIGM6CisgICAgICAgICAgICBmb3IgaGRsciBpbiBjLmhhbmRsZXJzOgorICAgICAgICAgICAgICAgIGZvdW5kID0gZm91bmQgKyAxCisgICAgICAgICAgICAgICAgaWYgcmVjb3JkLmxldmVsbm8gPj0gaGRsci5sZXZlbDoKKyAgICAgICAgICAgICAgICAgICAgaGRsci5oYW5kbGUocmVjb3JkKQorICAgICAgICAgICAgaWYgbm90IGMucHJvcGFnYXRlOgorICAgICAgICAgICAgICAgIGMgPSBOb25lICAgICNicmVhayBvdXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYyA9IGMucGFyZW50CisgICAgICAgIGlmIChmb3VuZCA9PSAwKSBhbmQgcmFpc2VFeGNlcHRpb25zIGFuZCBub3Qgc2VsZi5tYW5hZ2VyLmVtaXR0ZWROb0hhbmRsZXJXYXJuaW5nOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiTm8gaGFuZGxlcnMgY291bGQgYmUgZm91bmQgZm9yIGxvZ2dlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBcIiVzXCJcbiIgJSBzZWxmLm5hbWUpCisgICAgICAgICAgICBzZWxmLm1hbmFnZXIuZW1pdHRlZE5vSGFuZGxlcldhcm5pbmcgPSAxCisKKyAgICBkZWYgZ2V0RWZmZWN0aXZlTGV2ZWwoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBHZXQgdGhlIGVmZmVjdGl2ZSBsZXZlbCBmb3IgdGhpcyBsb2dnZXIuCisKKyAgICAgICAgTG9vcCB0aHJvdWdoIHRoaXMgbG9nZ2VyIGFuZCBpdHMgcGFyZW50cyBpbiB0aGUgbG9nZ2VyIGhpZXJhcmNoeSwKKyAgICAgICAgbG9va2luZyBmb3IgYSBub24temVybyBsb2dnaW5nIGxldmVsLiBSZXR1cm4gdGhlIGZpcnN0IG9uZSBmb3VuZC4KKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dlciA9IHNlbGYKKyAgICAgICAgd2hpbGUgbG9nZ2VyOgorICAgICAgICAgICAgaWYgbG9nZ2VyLmxldmVsOgorICAgICAgICAgICAgICAgIHJldHVybiBsb2dnZXIubGV2ZWwKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dlci5wYXJlbnQKKyAgICAgICAgcmV0dXJuIE5PVFNFVAorCisgICAgZGVmIGlzRW5hYmxlZEZvcihzZWxmLCBsZXZlbCk6CisgICAgICAgICIiIgorICAgICAgICBJcyB0aGlzIGxvZ2dlciBlbmFibGVkIGZvciBsZXZlbCAnbGV2ZWwnPworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5tYW5hZ2VyLmRpc2FibGUgPj0gbGV2ZWw6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gbGV2ZWwgPj0gc2VsZi5nZXRFZmZlY3RpdmVMZXZlbCgpCisKKyAgICBkZWYgZ2V0Q2hpbGQoc2VsZiwgc3VmZml4KToKKyAgICAgICAgIiIiCisgICAgICAgIEdldCBhIGxvZ2dlciB3aGljaCBpcyBhIGRlc2NlbmRhbnQgdG8gdGhpcyBvbmUuCisKKyAgICAgICAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgc3VjaCB0aGF0CisKKyAgICAgICAgbG9nZ2luZy5nZXRMb2dnZXIoJ2FiYycpLmdldENoaWxkKCdkZWYuZ2hpJykKKworICAgICAgICBpcyB0aGUgc2FtZSBhcworCisgICAgICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhYmMuZGVmLmdoaScpCisKKyAgICAgICAgSXQncyB1c2VmdWwsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBwYXJlbnQgbG9nZ2VyIGlzIG5hbWVkIHVzaW5nCisgICAgICAgIF9fbmFtZV9fIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnJvb3QgaXMgbm90IHNlbGY6CisgICAgICAgICAgICBzdWZmaXggPSAnLicuam9pbigoc2VsZi5uYW1lLCBzdWZmaXgpKQorICAgICAgICByZXR1cm4gc2VsZi5tYW5hZ2VyLmdldExvZ2dlcihzdWZmaXgpCisKK2NsYXNzIFJvb3RMb2dnZXIoTG9nZ2VyKToKKyAgICAiIiIKKyAgICBBIHJvb3QgbG9nZ2VyIGlzIG5vdCB0aGF0IGRpZmZlcmVudCB0byBhbnkgb3RoZXIgbG9nZ2VyLCBleGNlcHQgdGhhdAorICAgIGl0IG11c3QgaGF2ZSBhIGxvZ2dpbmcgbGV2ZWwgYW5kIHRoZXJlIGlzIG9ubHkgb25lIGluc3RhbmNlIG9mIGl0IGluCisgICAgdGhlIGhpZXJhcmNoeS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGV2ZWwpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgbG9nZ2VyIHdpdGggdGhlIG5hbWUgInJvb3QiLgorICAgICAgICAiIiIKKyAgICAgICAgTG9nZ2VyLl9faW5pdF9fKHNlbGYsICJyb290IiwgbGV2ZWwpCisKK19sb2dnZXJDbGFzcyA9IExvZ2dlcgorCitjbGFzcyBMb2dnZXJBZGFwdGVyKG9iamVjdCk6CisgICAgIiIiCisgICAgQW4gYWRhcHRlciBmb3IgbG9nZ2VycyB3aGljaCBtYWtlcyBpdCBlYXNpZXIgdG8gc3BlY2lmeSBjb250ZXh0dWFsCisgICAgaW5mb3JtYXRpb24gaW4gbG9nZ2luZyBvdXRwdXQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nZ2VyLCBleHRyYSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBhZGFwdGVyIHdpdGggYSBsb2dnZXIgYW5kIGEgZGljdC1saWtlIG9iamVjdCB3aGljaAorICAgICAgICBwcm92aWRlcyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiBUaGlzIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSBhbGxvd3MKKyAgICAgICAgZWFzeSBzdGFja2luZyBvZiBMb2dnZXJBZGFwdGVycywgaWYgc28gZGVzaXJlZC4KKworICAgICAgICBZb3UgY2FuIGVmZmVjdGl2ZWx5IHBhc3Mga2V5d29yZCBhcmd1bWVudHMgYXMgc2hvd24gaW4gdGhlCisgICAgICAgIGZvbGxvd2luZyBleGFtcGxlOgorCisgICAgICAgIGFkYXB0ZXIgPSBMb2dnZXJBZGFwdGVyKHNvbWVMb2dnZXIsIGRpY3QocDE9djEsIHAyPSJ2MiIpKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5sb2dnZXIgPSBsb2dnZXIKKyAgICAgICAgc2VsZi5leHRyYSA9IGV4dHJhCisKKyAgICBkZWYgcHJvY2VzcyhzZWxmLCBtc2csIGt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBQcm9jZXNzIHRoZSBsb2dnaW5nIG1lc3NhZ2UgYW5kIGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCBpbiB0bworICAgICAgICBhIGxvZ2dpbmcgY2FsbCB0byBpbnNlcnQgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gWW91IGNhbiBlaXRoZXIKKyAgICAgICAgbWFuaXB1bGF0ZSB0aGUgbWVzc2FnZSBpdHNlbGYsIHRoZSBrZXl3b3JkIGFyZ3Mgb3IgYm90aC4gUmV0dXJuCisgICAgICAgIHRoZSBtZXNzYWdlIGFuZCBrd2FyZ3MgbW9kaWZpZWQgKG9yIG5vdCkgdG8gc3VpdCB5b3VyIG5lZWRzLgorCisgICAgICAgIE5vcm1hbGx5LCB5b3UnbGwgb25seSBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgb25lIG1ldGhvZCBpbiBhCisgICAgICAgIExvZ2dlckFkYXB0ZXIgc3ViY2xhc3MgZm9yIHlvdXIgc3BlY2lmaWMgbmVlZHMuCisgICAgICAgICIiIgorICAgICAgICBrd2FyZ3NbImV4dHJhIl0gPSBzZWxmLmV4dHJhCisgICAgICAgIHJldHVybiBtc2csIGt3YXJncworCisgICAgZGVmIGRlYnVnKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGVnYXRlIGEgZGVidWcgY2FsbCB0byB0aGUgdW5kZXJseWluZyBsb2dnZXIsIGFmdGVyIGFkZGluZworICAgICAgICBjb250ZXh0dWFsIGluZm9ybWF0aW9uIGZyb20gdGhpcyBhZGFwdGVyIGluc3RhbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgbXNnLCBrd2FyZ3MgPSBzZWxmLnByb2Nlc3MobXNnLCBrd2FyZ3MpCisgICAgICAgIHNlbGYubG9nZ2VyLmRlYnVnKG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGluZm8oc2VsZiwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVsZWdhdGUgYW4gaW5mbyBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGxvZ2dlciwgYWZ0ZXIgYWRkaW5nCisgICAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBtc2csIGt3YXJncyA9IHNlbGYucHJvY2Vzcyhtc2csIGt3YXJncykKKyAgICAgICAgc2VsZi5sb2dnZXIuaW5mbyhtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB3YXJuaW5nKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGVnYXRlIGEgd2FybmluZyBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGxvZ2dlciwgYWZ0ZXIgYWRkaW5nCisgICAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBtc2csIGt3YXJncyA9IHNlbGYucHJvY2Vzcyhtc2csIGt3YXJncykKKyAgICAgICAgc2VsZi5sb2dnZXIud2FybmluZyhtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBlcnJvcihzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBEZWxlZ2F0ZSBhbiBlcnJvciBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGxvZ2dlciwgYWZ0ZXIgYWRkaW5nCisgICAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBtc2csIGt3YXJncyA9IHNlbGYucHJvY2Vzcyhtc2csIGt3YXJncykKKyAgICAgICAgc2VsZi5sb2dnZXIuZXJyb3IobXNnLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgZXhjZXB0aW9uKHNlbGYsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGVnYXRlIGFuIGV4Y2VwdGlvbiBjYWxsIHRvIHRoZSB1bmRlcmx5aW5nIGxvZ2dlciwgYWZ0ZXIgYWRkaW5nCisgICAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZnJvbSB0aGlzIGFkYXB0ZXIgaW5zdGFuY2UuCisgICAgICAgICIiIgorICAgICAgICBtc2csIGt3YXJncyA9IHNlbGYucHJvY2Vzcyhtc2csIGt3YXJncykKKyAgICAgICAga3dhcmdzWyJleGNfaW5mbyJdID0gMQorICAgICAgICBzZWxmLmxvZ2dlci5lcnJvcihtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBjcml0aWNhbChzZWxmLCBtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIgorICAgICAgICBEZWxlZ2F0ZSBhIGNyaXRpY2FsIGNhbGwgdG8gdGhlIHVuZGVybHlpbmcgbG9nZ2VyLCBhZnRlciBhZGRpbmcKKyAgICAgICAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIG1zZywga3dhcmdzID0gc2VsZi5wcm9jZXNzKG1zZywga3dhcmdzKQorICAgICAgICBzZWxmLmxvZ2dlci5jcml0aWNhbChtc2csICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBsb2coc2VsZiwgbGV2ZWwsIG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGVnYXRlIGEgbG9nIGNhbGwgdG8gdGhlIHVuZGVybHlpbmcgbG9nZ2VyLCBhZnRlciBhZGRpbmcKKyAgICAgICAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgYWRhcHRlciBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIG1zZywga3dhcmdzID0gc2VsZi5wcm9jZXNzKG1zZywga3dhcmdzKQorICAgICAgICBzZWxmLmxvZ2dlci5sb2cobGV2ZWwsIG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGlzRW5hYmxlZEZvcihzZWxmLCBsZXZlbCk6CisgICAgICAgICIiIgorICAgICAgICBTZWUgaWYgdGhlIHVuZGVybHlpbmcgbG9nZ2VyIGlzIGVuYWJsZWQgZm9yIHRoZSBzcGVjaWZpZWQgbGV2ZWwuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5sb2dnZXIuaXNFbmFibGVkRm9yKGxldmVsKQorCityb290ID0gUm9vdExvZ2dlcihXQVJOSU5HKQorTG9nZ2VyLnJvb3QgPSByb290CitMb2dnZXIubWFuYWdlciA9IE1hbmFnZXIoTG9nZ2VyLnJvb3QpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBjbGFzc2VzIGFuZCBmdW5jdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQkFTSUNfRk9STUFUID0gIiUobGV2ZWxuYW1lKXM6JShuYW1lKXM6JShtZXNzYWdlKXMiCisKK2RlZiBiYXNpY0NvbmZpZygqKmt3YXJncyk6CisgICAgIiIiCisgICAgRG8gYmFzaWMgY29uZmlndXJhdGlvbiBmb3IgdGhlIGxvZ2dpbmcgc3lzdGVtLgorCisgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcgaWYgdGhlIHJvb3QgbG9nZ2VyIGFscmVhZHkgaGFzIGhhbmRsZXJzCisgICAgY29uZmlndXJlZC4gSXQgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgaW50ZW5kZWQgZm9yIHVzZSBieSBzaW1wbGUgc2NyaXB0cworICAgIHRvIGRvIG9uZS1zaG90IGNvbmZpZ3VyYXRpb24gb2YgdGhlIGxvZ2dpbmcgcGFja2FnZS4KKworICAgIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBjcmVhdGUgYSBTdHJlYW1IYW5kbGVyIHdoaWNoIHdyaXRlcyB0bworICAgIHN5cy5zdGRlcnIsIHNldCBhIGZvcm1hdHRlciB1c2luZyB0aGUgQkFTSUNfRk9STUFUIGZvcm1hdCBzdHJpbmcsIGFuZAorICAgIGFkZCB0aGUgaGFuZGxlciB0byB0aGUgcm9vdCBsb2dnZXIuCisKKyAgICBBIG51bWJlciBvZiBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyBtYXkgYmUgc3BlY2lmaWVkLCB3aGljaCBjYW4gYWx0ZXIKKyAgICB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCisKKyAgICBmaWxlbmFtZSAgU3BlY2lmaWVzIHRoYXQgYSBGaWxlSGFuZGxlciBiZSBjcmVhdGVkLCB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgIGZpbGVuYW1lLCByYXRoZXIgdGhhbiBhIFN0cmVhbUhhbmRsZXIuCisgICAgZmlsZW1vZGUgIFNwZWNpZmllcyB0aGUgbW9kZSB0byBvcGVuIHRoZSBmaWxlLCBpZiBmaWxlbmFtZSBpcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgKGlmIGZpbGVtb2RlIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byAnYScpLgorICAgIGZvcm1hdCAgICBVc2UgdGhlIHNwZWNpZmllZCBmb3JtYXQgc3RyaW5nIGZvciB0aGUgaGFuZGxlci4KKyAgICBkYXRlZm10ICAgVXNlIHRoZSBzcGVjaWZpZWQgZGF0ZS90aW1lIGZvcm1hdC4KKyAgICBsZXZlbCAgICAgU2V0IHRoZSByb290IGxvZ2dlciBsZXZlbCB0byB0aGUgc3BlY2lmaWVkIGxldmVsLgorICAgIHN0cmVhbSAgICBVc2UgdGhlIHNwZWNpZmllZCBzdHJlYW0gdG8gaW5pdGlhbGl6ZSB0aGUgU3RyZWFtSGFuZGxlci4gTm90ZQorICAgICAgICAgICAgICB0aGF0IHRoaXMgYXJndW1lbnQgaXMgaW5jb21wYXRpYmxlIHdpdGggJ2ZpbGVuYW1lJyAtIGlmIGJvdGgKKyAgICAgICAgICAgICAgYXJlIHByZXNlbnQsICdzdHJlYW0nIGlzIGlnbm9yZWQuCisKKyAgICBOb3RlIHRoYXQgeW91IGNvdWxkIHNwZWNpZnkgYSBzdHJlYW0gY3JlYXRlZCB1c2luZyBvcGVuKGZpbGVuYW1lLCBtb2RlKQorICAgIHJhdGhlciB0aGFuIHBhc3NpbmcgdGhlIGZpbGVuYW1lIGFuZCBtb2RlIGluLiBIb3dldmVyLCBpdCBzaG91bGQgYmUKKyAgICByZW1lbWJlcmVkIHRoYXQgU3RyZWFtSGFuZGxlciBkb2VzIG5vdCBjbG9zZSBpdHMgc3RyZWFtIChzaW5jZSBpdCBtYXkgYmUKKyAgICB1c2luZyBzeXMuc3Rkb3V0IG9yIHN5cy5zdGRlcnIpLCB3aGVyZWFzIEZpbGVIYW5kbGVyIGNsb3NlcyBpdHMgc3RyZWFtCisgICAgd2hlbiB0aGUgaGFuZGxlciBpcyBjbG9zZWQuCisgICAgIiIiCisgICAgIyBBZGQgdGhyZWFkIHNhZmV0eSBpbiBjYXNlIHNvbWVvbmUgbWlzdGFrZW5seSBjYWxscworICAgICMgYmFzaWNDb25maWcoKSBmcm9tIG11bHRpcGxlIHRocmVhZHMKKyAgICBfYWNxdWlyZUxvY2soKQorICAgIHRyeToKKyAgICAgICAgaWYgbGVuKHJvb3QuaGFuZGxlcnMpID09IDA6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGt3YXJncy5nZXQoImZpbGVuYW1lIikKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgICAgIG1vZGUgPSBrd2FyZ3MuZ2V0KCJmaWxlbW9kZSIsICdhJykKKyAgICAgICAgICAgICAgICBoZGxyID0gRmlsZUhhbmRsZXIoZmlsZW5hbWUsIG1vZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN0cmVhbSA9IGt3YXJncy5nZXQoInN0cmVhbSIpCisgICAgICAgICAgICAgICAgaGRsciA9IFN0cmVhbUhhbmRsZXIoc3RyZWFtKQorICAgICAgICAgICAgZnMgPSBrd2FyZ3MuZ2V0KCJmb3JtYXQiLCBCQVNJQ19GT1JNQVQpCisgICAgICAgICAgICBkZnMgPSBrd2FyZ3MuZ2V0KCJkYXRlZm10IiwgTm9uZSkKKyAgICAgICAgICAgIGZtdCA9IEZvcm1hdHRlcihmcywgZGZzKQorICAgICAgICAgICAgaGRsci5zZXRGb3JtYXR0ZXIoZm10KQorICAgICAgICAgICAgcm9vdC5hZGRIYW5kbGVyKGhkbHIpCisgICAgICAgICAgICBsZXZlbCA9IGt3YXJncy5nZXQoImxldmVsIikKKyAgICAgICAgICAgIGlmIGxldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJvb3Quc2V0TGV2ZWwobGV2ZWwpCisgICAgZmluYWxseToKKyAgICAgICAgX3JlbGVhc2VMb2NrKCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBVdGlsaXR5IGZ1bmN0aW9ucyBhdCBtb2R1bGUgbGV2ZWwuCisjIEJhc2ljYWxseSBkZWxlZ2F0ZSBldmVyeXRoaW5nIHRvIHRoZSByb290IGxvZ2dlci4KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGdldExvZ2dlcihuYW1lPU5vbmUpOgorICAgICIiIgorICAgIFJldHVybiBhIGxvZ2dlciB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorCisgICAgSWYgbm8gbmFtZSBpcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgcm9vdCBsb2dnZXIuCisgICAgIiIiCisgICAgaWYgbmFtZToKKyAgICAgICAgcmV0dXJuIExvZ2dlci5tYW5hZ2VyLmdldExvZ2dlcihuYW1lKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiByb290CisKKyNkZWYgZ2V0Um9vdExvZ2dlcigpOgorIyAgICAiIiIKKyMgICAgUmV0dXJuIHRoZSByb290IGxvZ2dlci4KKyMKKyMgICAgTm90ZSB0aGF0IGdldExvZ2dlcignJykgbm93IGRvZXMgdGhlIHNhbWUgdGhpbmcsIHNvIHRoaXMgZnVuY3Rpb24gaXMKKyMgICAgZGVwcmVjYXRlZCBhbmQgbWF5IGRpc2FwcGVhciBpbiB0aGUgZnV0dXJlLgorIyAgICAiIiIKKyMgICAgcmV0dXJuIHJvb3QKKworZGVmIGNyaXRpY2FsKG1zZywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiIKKyAgICBMb2cgYSBtZXNzYWdlIHdpdGggc2V2ZXJpdHkgJ0NSSVRJQ0FMJyBvbiB0aGUgcm9vdCBsb2dnZXIuCisgICAgIiIiCisgICAgaWYgbGVuKHJvb3QuaGFuZGxlcnMpID09IDA6CisgICAgICAgIGJhc2ljQ29uZmlnKCkKKyAgICByb290LmNyaXRpY2FsKG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCitmYXRhbCA9IGNyaXRpY2FsCisKK2RlZiBlcnJvcihtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiCisgICAgTG9nIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5ICdFUlJPUicgb24gdGhlIHJvb3QgbG9nZ2VyLgorICAgICIiIgorICAgIGlmIGxlbihyb290LmhhbmRsZXJzKSA9PSAwOgorICAgICAgICBiYXNpY0NvbmZpZygpCisgICAgcm9vdC5lcnJvcihtc2csICphcmdzLCAqKmt3YXJncykKKworZGVmIGV4Y2VwdGlvbihtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiCisgICAgTG9nIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5ICdFUlJPUicgb24gdGhlIHJvb3QgbG9nZ2VyLAorICAgIHdpdGggZXhjZXB0aW9uIGluZm9ybWF0aW9uLgorICAgICIiIgorICAgIGt3YXJnc1snZXhjX2luZm8nXSA9IDEKKyAgICBlcnJvcihtc2csICphcmdzLCAqKmt3YXJncykKKworZGVmIHdhcm5pbmcobXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIExvZyBhIG1lc3NhZ2Ugd2l0aCBzZXZlcml0eSAnV0FSTklORycgb24gdGhlIHJvb3QgbG9nZ2VyLgorICAgICIiIgorICAgIGlmIGxlbihyb290LmhhbmRsZXJzKSA9PSAwOgorICAgICAgICBiYXNpY0NvbmZpZygpCisgICAgcm9vdC53YXJuaW5nKG1zZywgKmFyZ3MsICoqa3dhcmdzKQorCit3YXJuID0gd2FybmluZworCitkZWYgaW5mbyhtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiCisgICAgTG9nIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5ICdJTkZPJyBvbiB0aGUgcm9vdCBsb2dnZXIuCisgICAgIiIiCisgICAgaWYgbGVuKHJvb3QuaGFuZGxlcnMpID09IDA6CisgICAgICAgIGJhc2ljQ29uZmlnKCkKKyAgICByb290LmluZm8obXNnLCAqYXJncywgKiprd2FyZ3MpCisKK2RlZiBkZWJ1Zyhtc2csICphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiCisgICAgTG9nIGEgbWVzc2FnZSB3aXRoIHNldmVyaXR5ICdERUJVRycgb24gdGhlIHJvb3QgbG9nZ2VyLgorICAgICIiIgorICAgIGlmIGxlbihyb290LmhhbmRsZXJzKSA9PSAwOgorICAgICAgICBiYXNpY0NvbmZpZygpCisgICAgcm9vdC5kZWJ1Zyhtc2csICphcmdzLCAqKmt3YXJncykKKworZGVmIGxvZyhsZXZlbCwgbXNnLCAqYXJncywgKiprd2FyZ3MpOgorICAgICIiIgorICAgIExvZyAnbXNnICUgYXJncycgd2l0aCB0aGUgaW50ZWdlciBzZXZlcml0eSAnbGV2ZWwnIG9uIHRoZSByb290IGxvZ2dlci4KKyAgICAiIiIKKyAgICBpZiBsZW4ocm9vdC5oYW5kbGVycykgPT0gMDoKKyAgICAgICAgYmFzaWNDb25maWcoKQorICAgIHJvb3QubG9nKGxldmVsLCBtc2csICphcmdzLCAqKmt3YXJncykKKworZGVmIGRpc2FibGUobGV2ZWwpOgorICAgICIiIgorICAgIERpc2FibGUgYWxsIGxvZ2dpbmcgY2FsbHMgb2Ygc2V2ZXJpdHkgJ2xldmVsJyBhbmQgYmVsb3cuCisgICAgIiIiCisgICAgcm9vdC5tYW5hZ2VyLmRpc2FibGUgPSBsZXZlbAorCitkZWYgc2h1dGRvd24oaGFuZGxlckxpc3Q9X2hhbmRsZXJMaXN0KToKKyAgICAiIiIKKyAgICBQZXJmb3JtIGFueSBjbGVhbnVwIGFjdGlvbnMgaW4gdGhlIGxvZ2dpbmcgc3lzdGVtIChlLmcuIGZsdXNoaW5nCisgICAgYnVmZmVycykuCisKKyAgICBTaG91bGQgYmUgY2FsbGVkIGF0IGFwcGxpY2F0aW9uIGV4aXQuCisgICAgIiIiCisgICAgZm9yIHdyIGluIHJldmVyc2VkKGhhbmRsZXJMaXN0WzpdKToKKyAgICAgICAgI2Vycm9ycyBtaWdodCBvY2N1ciwgZm9yIGV4YW1wbGUsIGlmIGZpbGVzIGFyZSBsb2NrZWQKKyAgICAgICAgI3dlIGp1c3QgaWdub3JlIHRoZW0gaWYgcmFpc2VFeGNlcHRpb25zIGlzIG5vdCBzZXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaCA9IHdyKCkKKyAgICAgICAgICAgIGlmIGg6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBoLmFjcXVpcmUoKQorICAgICAgICAgICAgICAgICAgICBoLmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgaC5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgIyBJZ25vcmUgZXJyb3JzIHdoaWNoIG1pZ2h0IGJlIGNhdXNlZAorICAgICAgICAgICAgICAgICAgICAjIGJlY2F1c2UgaGFuZGxlcnMgaGF2ZSBiZWVuIGNsb3NlZCBidXQKKyAgICAgICAgICAgICAgICAgICAgIyByZWZlcmVuY2VzIHRvIHRoZW0gYXJlIHN0aWxsIGFyb3VuZCBhdAorICAgICAgICAgICAgICAgICAgICAjIGFwcGxpY2F0aW9uIGV4aXQuCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBoLnJlbGVhc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiByYWlzZUV4Y2VwdGlvbnM6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICNlbHNlLCBzd2FsbG93CisKKyNMZXQncyB0cnkgYW5kIHNodXRkb3duIGF1dG9tYXRpY2FsbHkgb24gYXBwbGljYXRpb24gZXhpdC4uLgoraW1wb3J0IGF0ZXhpdAorYXRleGl0LnJlZ2lzdGVyKHNodXRkb3duKQorCisjIE51bGwgaGFuZGxlcgorCitjbGFzcyBOdWxsSGFuZGxlcihIYW5kbGVyKToKKyAgICAiIiIKKyAgICBUaGlzIGhhbmRsZXIgZG9lcyBub3RoaW5nLiBJdCdzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gYXZvaWQgdGhlCisgICAgIk5vIGhhbmRsZXJzIGNvdWxkIGJlIGZvdW5kIGZvciBsb2dnZXIgWFhYIiBvbmUtb2ZmIHdhcm5pbmcuIFRoaXMgaXMKKyAgICBpbXBvcnRhbnQgZm9yIGxpYnJhcnkgY29kZSwgd2hpY2ggbWF5IGNvbnRhaW4gY29kZSB0byBsb2cgZXZlbnRzLiBJZiBhIHVzZXIKKyAgICBvZiB0aGUgbGlicmFyeSBkb2VzIG5vdCBjb25maWd1cmUgbG9nZ2luZywgdGhlIG9uZS1vZmYgd2FybmluZyBtaWdodCBiZQorICAgIHByb2R1Y2VkOyB0byBhdm9pZCB0aGlzLCB0aGUgbGlicmFyeSBkZXZlbG9wZXIgc2ltcGx5IG5lZWRzIHRvIGluc3RhbnRpYXRlCisgICAgYSBOdWxsSGFuZGxlciBhbmQgYWRkIGl0IHRvIHRoZSB0b3AtbGV2ZWwgbG9nZ2VyIG9mIHRoZSBsaWJyYXJ5IG1vZHVsZSBvcgorICAgIHBhY2thZ2UuCisgICAgIiIiCisgICAgZGVmIGhhbmRsZShzZWxmLCByZWNvcmQpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY3JlYXRlTG9jayhzZWxmKToKKyAgICAgICAgc2VsZi5sb2NrID0gTm9uZQorCisjIFdhcm5pbmdzIGludGVncmF0aW9uCisKK193YXJuaW5nc19zaG93d2FybmluZyA9IE5vbmUKKworZGVmIF9zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgZmlsZT1Ob25lLCBsaW5lPU5vbmUpOgorICAgICIiIgorICAgIEltcGxlbWVudGF0aW9uIG9mIHNob3d3YXJuaW5ncyB3aGljaCByZWRpcmVjdHMgdG8gbG9nZ2luZywgd2hpY2ggd2lsbCBmaXJzdAorICAgIGNoZWNrIHRvIHNlZSBpZiB0aGUgZmlsZSBwYXJhbWV0ZXIgaXMgTm9uZS4gSWYgYSBmaWxlIGlzIHNwZWNpZmllZCwgaXQgd2lsbAorICAgIGRlbGVnYXRlIHRvIHRoZSBvcmlnaW5hbCB3YXJuaW5ncyBpbXBsZW1lbnRhdGlvbiBvZiBzaG93d2FybmluZy4gT3RoZXJ3aXNlLAorICAgIGl0IHdpbGwgY2FsbCB3YXJuaW5ncy5mb3JtYXR3YXJuaW5nIGFuZCB3aWxsIGxvZyB0aGUgcmVzdWx0aW5nIHN0cmluZyB0byBhCisgICAgd2FybmluZ3MgbG9nZ2VyIG5hbWVkICJweS53YXJuaW5ncyIgd2l0aCBsZXZlbCBsb2dnaW5nLldBUk5JTkcuCisgICAgIiIiCisgICAgaWYgZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlLCBsaW5lKQorICAgIGVsc2U6CisgICAgICAgIHMgPSB3YXJuaW5ncy5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lKQorICAgICAgICBsb2dnZXIgPSBnZXRMb2dnZXIoInB5Lndhcm5pbmdzIikKKyAgICAgICAgaWYgbm90IGxvZ2dlci5oYW5kbGVyczoKKyAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKE51bGxIYW5kbGVyKCkpCisgICAgICAgIGxvZ2dlci53YXJuaW5nKCIlcyIsIHMpCisKK2RlZiBjYXB0dXJlV2FybmluZ3MoY2FwdHVyZSk6CisgICAgIiIiCisgICAgSWYgY2FwdHVyZSBpcyB0cnVlLCByZWRpcmVjdCBhbGwgd2FybmluZ3MgdG8gdGhlIGxvZ2dpbmcgcGFja2FnZS4KKyAgICBJZiBjYXB0dXJlIGlzIEZhbHNlLCBlbnN1cmUgdGhhdCB3YXJuaW5ncyBhcmUgbm90IHJlZGlyZWN0ZWQgdG8gbG9nZ2luZworICAgIGJ1dCB0byB0aGVpciBvcmlnaW5hbCBkZXN0aW5hdGlvbnMuCisgICAgIiIiCisgICAgZ2xvYmFsIF93YXJuaW5nc19zaG93d2FybmluZworICAgIGlmIGNhcHR1cmU6CisgICAgICAgIGlmIF93YXJuaW5nc19zaG93d2FybmluZyBpcyBOb25lOgorICAgICAgICAgICAgX3dhcm5pbmdzX3Nob3d3YXJuaW5nID0gd2FybmluZ3Muc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIHdhcm5pbmdzLnNob3d3YXJuaW5nID0gX3Nob3d3YXJuaW5nCisgICAgZWxzZToKKyAgICAgICAgaWYgX3dhcm5pbmdzX3Nob3d3YXJuaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgd2FybmluZ3Muc2hvd3dhcm5pbmcgPSBfd2FybmluZ3Nfc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIF93YXJuaW5nc19zaG93d2FybmluZyA9IE5vbmUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlNGE4NDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMWEzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9jb25maWcucHkgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvY29uZmlnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjAxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L2xvZ2dpbmcvY29uZmlnLnB5CkBAIC0wLDAgKzEsOTMyIEBACisjIENvcHlyaWdodCAyMDAxLTIwMTMgYnkgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCisjIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyMgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisjIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgVmluYXkgU2FqaXAKKyMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCisjIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisjIFZJTkFZIFNBSklQIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKKyMgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMCisjIFZJTkFZIFNBSklQIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorIyBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIKKyMgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyMgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworIiIiCitDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBmb3IgdGhlIGxvZ2dpbmcgcGFja2FnZSBmb3IgUHl0aG9uLiBUaGUgY29yZSBwYWNrYWdlCitpcyBiYXNlZCBvbiBQRVAgMjgyIGFuZCBjb21tZW50cyB0aGVyZXRvIGluIGNvbXAubGFuZy5weXRob24sIGFuZCBpbmZsdWVuY2VkCitieSBBcGFjaGUncyBsb2c0aiBzeXN0ZW0uCisKK0NvcHlyaWdodCAoQykgMjAwMS0yMDEzIFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitUbyB1c2UsIHNpbXBseSAnaW1wb3J0IGxvZ2dpbmcnIGFuZCBsb2cgYXdheSEKKyIiIgorCitpbXBvcnQgc3lzLCBsb2dnaW5nLCBsb2dnaW5nLmhhbmRsZXJzLCBzb2NrZXQsIHN0cnVjdCwgb3MsIHRyYWNlYmFjaywgcmUKK2ltcG9ydCB0eXBlcywgY1N0cmluZ0lPCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkCisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZCA9IE5vbmUKKworZnJvbSBTb2NrZXRTZXJ2ZXIgaW1wb3J0IFRocmVhZGluZ1RDUFNlcnZlciwgU3RyZWFtUmVxdWVzdEhhbmRsZXIKKworCitERUZBVUxUX0xPR0dJTkdfQ09ORklHX1BPUlQgPSA5MDMwCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgIFJFU0VUX0VSUk9SID0gMTAwNTQgICAjV1NBRUNPTk5SRVNFVAorZWxzZToKKyAgICBSRVNFVF9FUlJPUiA9IDEwNCAgICAgI0VDT05OUkVTRVQKKworIworIyAgIFRoZSBmb2xsb3dpbmcgY29kZSBpbXBsZW1lbnRzIGEgc29ja2V0IGxpc3RlbmVyIGZvciBvbi10aGUtZmx5CisjICAgcmVjb25maWd1cmF0aW9uIG9mIGxvZ2dpbmcuCisjCisjICAgX2xpc3RlbmVyIGhvbGRzIHRoZSBzZXJ2ZXIgb2JqZWN0IGRvaW5nIHRoZSBsaXN0ZW5pbmcKK19saXN0ZW5lciA9IE5vbmUKKworZGVmIGZpbGVDb25maWcoZm5hbWUsIGRlZmF1bHRzPU5vbmUsIGRpc2FibGVfZXhpc3RpbmdfbG9nZ2Vycz1UcnVlKToKKyAgICAiIiIKKyAgICBSZWFkIHRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gZnJvbSBhIENvbmZpZ1BhcnNlci1mb3JtYXQgZmlsZS4KKworICAgIFRoaXMgY2FuIGJlIGNhbGxlZCBzZXZlcmFsIHRpbWVzIGZyb20gYW4gYXBwbGljYXRpb24sIGFsbG93aW5nIGFuIGVuZCB1c2VyCisgICAgdGhlIGFiaWxpdHkgdG8gc2VsZWN0IGZyb20gdmFyaW91cyBwcmUtY2FubmVkIGNvbmZpZ3VyYXRpb25zIChpZiB0aGUKKyAgICBkZXZlbG9wZXIgcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gcHJlc2VudCB0aGUgY2hvaWNlcyBhbmQgbG9hZCB0aGUgY2hvc2VuCisgICAgY29uZmlndXJhdGlvbikuCisgICAgIiIiCisgICAgaW1wb3J0IENvbmZpZ1BhcnNlcgorCisgICAgY3AgPSBDb25maWdQYXJzZXIuQ29uZmlnUGFyc2VyKGRlZmF1bHRzKQorICAgIGlmIGhhc2F0dHIoZm5hbWUsICdyZWFkbGluZScpOgorICAgICAgICBjcC5yZWFkZnAoZm5hbWUpCisgICAgZWxzZToKKyAgICAgICAgY3AucmVhZChmbmFtZSkKKworICAgIGZvcm1hdHRlcnMgPSBfY3JlYXRlX2Zvcm1hdHRlcnMoY3ApCisKKyAgICAjIGNyaXRpY2FsIHNlY3Rpb24KKyAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgdHJ5OgorICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy5jbGVhcigpCisgICAgICAgIGRlbCBsb2dnaW5nLl9oYW5kbGVyTGlzdFs6XQorICAgICAgICAjIEhhbmRsZXJzIGFkZCB0aGVtc2VsdmVzIHRvIGxvZ2dpbmcuX2hhbmRsZXJzCisgICAgICAgIGhhbmRsZXJzID0gX2luc3RhbGxfaGFuZGxlcnMoY3AsIGZvcm1hdHRlcnMpCisgICAgICAgIF9pbnN0YWxsX2xvZ2dlcnMoY3AsIGhhbmRsZXJzLCBkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnMpCisgICAgZmluYWxseToKKyAgICAgICAgbG9nZ2luZy5fcmVsZWFzZUxvY2soKQorCisKK2RlZiBfcmVzb2x2ZShuYW1lKToKKyAgICAiIiJSZXNvbHZlIGEgZG90dGVkIG5hbWUgdG8gYSBnbG9iYWwgb2JqZWN0LiIiIgorICAgIG5hbWUgPSBuYW1lLnNwbGl0KCcuJykKKyAgICB1c2VkID0gbmFtZS5wb3AoMCkKKyAgICBmb3VuZCA9IF9faW1wb3J0X18odXNlZCkKKyAgICBmb3IgbiBpbiBuYW1lOgorICAgICAgICB1c2VkID0gdXNlZCArICcuJyArIG4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm91bmQgPSBnZXRhdHRyKGZvdW5kLCBuKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBfX2ltcG9ydF9fKHVzZWQpCisgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIG4pCisgICAgcmV0dXJuIGZvdW5kCisKK2RlZiBfc3RyaXBfc3BhY2VzKGFsaXN0KToKKyAgICByZXR1cm4gbWFwKGxhbWJkYSB4OiB4LnN0cmlwKCksIGFsaXN0KQorCitkZWYgX2VuY29kZWQocyk6CisgICAgcmV0dXJuIHMgaWYgaXNpbnN0YW5jZShzLCBzdHIpIGVsc2Ugcy5lbmNvZGUoJ3V0Zi04JykKKworZGVmIF9jcmVhdGVfZm9ybWF0dGVycyhjcCk6CisgICAgIiIiQ3JlYXRlIGFuZCByZXR1cm4gZm9ybWF0dGVycyIiIgorICAgIGZsaXN0ID0gY3AuZ2V0KCJmb3JtYXR0ZXJzIiwgImtleXMiKQorICAgIGlmIG5vdCBsZW4oZmxpc3QpOgorICAgICAgICByZXR1cm4ge30KKyAgICBmbGlzdCA9IGZsaXN0LnNwbGl0KCIsIikKKyAgICBmbGlzdCA9IF9zdHJpcF9zcGFjZXMoZmxpc3QpCisgICAgZm9ybWF0dGVycyA9IHt9CisgICAgZm9yIGZvcm0gaW4gZmxpc3Q6CisgICAgICAgIHNlY3RuYW1lID0gImZvcm1hdHRlcl8lcyIgJSBmb3JtCisgICAgICAgIG9wdHMgPSBjcC5vcHRpb25zKHNlY3RuYW1lKQorICAgICAgICBpZiAiZm9ybWF0IiBpbiBvcHRzOgorICAgICAgICAgICAgZnMgPSBjcC5nZXQoc2VjdG5hbWUsICJmb3JtYXQiLCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnMgPSBOb25lCisgICAgICAgIGlmICJkYXRlZm10IiBpbiBvcHRzOgorICAgICAgICAgICAgZGZzID0gY3AuZ2V0KHNlY3RuYW1lLCAiZGF0ZWZtdCIsIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZnMgPSBOb25lCisgICAgICAgIGMgPSBsb2dnaW5nLkZvcm1hdHRlcgorICAgICAgICBpZiAiY2xhc3MiIGluIG9wdHM6CisgICAgICAgICAgICBjbGFzc19uYW1lID0gY3AuZ2V0KHNlY3RuYW1lLCAiY2xhc3MiKQorICAgICAgICAgICAgaWYgY2xhc3NfbmFtZToKKyAgICAgICAgICAgICAgICBjID0gX3Jlc29sdmUoY2xhc3NfbmFtZSkKKyAgICAgICAgZiA9IGMoZnMsIGRmcykKKyAgICAgICAgZm9ybWF0dGVyc1tmb3JtXSA9IGYKKyAgICByZXR1cm4gZm9ybWF0dGVycworCisKK2RlZiBfaW5zdGFsbF9oYW5kbGVycyhjcCwgZm9ybWF0dGVycyk6CisgICAgIiIiSW5zdGFsbCBhbmQgcmV0dXJuIGhhbmRsZXJzIiIiCisgICAgaGxpc3QgPSBjcC5nZXQoImhhbmRsZXJzIiwgImtleXMiKQorICAgIGlmIG5vdCBsZW4oaGxpc3QpOgorICAgICAgICByZXR1cm4ge30KKyAgICBobGlzdCA9IGhsaXN0LnNwbGl0KCIsIikKKyAgICBobGlzdCA9IF9zdHJpcF9zcGFjZXMoaGxpc3QpCisgICAgaGFuZGxlcnMgPSB7fQorICAgIGZpeHVwcyA9IFtdICNmb3IgaW50ZXItaGFuZGxlciByZWZlcmVuY2VzCisgICAgZm9yIGhhbmQgaW4gaGxpc3Q6CisgICAgICAgIHNlY3RuYW1lID0gImhhbmRsZXJfJXMiICUgaGFuZAorICAgICAgICBrbGFzcyA9IGNwLmdldChzZWN0bmFtZSwgImNsYXNzIikKKyAgICAgICAgb3B0cyA9IGNwLm9wdGlvbnMoc2VjdG5hbWUpCisgICAgICAgIGlmICJmb3JtYXR0ZXIiIGluIG9wdHM6CisgICAgICAgICAgICBmbXQgPSBjcC5nZXQoc2VjdG5hbWUsICJmb3JtYXR0ZXIiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm10ID0gIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2xhc3MgPSBldmFsKGtsYXNzLCB2YXJzKGxvZ2dpbmcpKQorICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBOYW1lRXJyb3IpOgorICAgICAgICAgICAga2xhc3MgPSBfcmVzb2x2ZShrbGFzcykKKyAgICAgICAgYXJncyA9IGNwLmdldChzZWN0bmFtZSwgImFyZ3MiKQorICAgICAgICBhcmdzID0gZXZhbChhcmdzLCB2YXJzKGxvZ2dpbmcpKQorICAgICAgICBoID0ga2xhc3MoKmFyZ3MpCisgICAgICAgIGlmICJsZXZlbCIgaW4gb3B0czoKKyAgICAgICAgICAgIGxldmVsID0gY3AuZ2V0KHNlY3RuYW1lLCAibGV2ZWwiKQorICAgICAgICAgICAgaC5zZXRMZXZlbChsb2dnaW5nLl9sZXZlbE5hbWVzW2xldmVsXSkKKyAgICAgICAgaWYgbGVuKGZtdCk6CisgICAgICAgICAgICBoLnNldEZvcm1hdHRlcihmb3JtYXR0ZXJzW2ZtdF0pCisgICAgICAgIGlmIGlzc3ViY2xhc3Moa2xhc3MsIGxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlcik6CisgICAgICAgICAgICBpZiAidGFyZ2V0IiBpbiBvcHRzOgorICAgICAgICAgICAgICAgIHRhcmdldCA9IGNwLmdldChzZWN0bmFtZSwidGFyZ2V0IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gIiIKKyAgICAgICAgICAgIGlmIGxlbih0YXJnZXQpOiAjdGhlIHRhcmdldCBoYW5kbGVyIG1heSBub3QgYmUgbG9hZGVkIHlldCwgc28ga2VlcCBmb3IgbGF0ZXIuLi4KKyAgICAgICAgICAgICAgICBmaXh1cHMuYXBwZW5kKChoLCB0YXJnZXQpKQorICAgICAgICBoYW5kbGVyc1toYW5kXSA9IGgKKyAgICAjbm93IGFsbCBoYW5kbGVycyBhcmUgbG9hZGVkLCBmaXh1cCBpbnRlci1oYW5kbGVyIHJlZmVyZW5jZXMuLi4KKyAgICBmb3IgaCwgdCBpbiBmaXh1cHM6CisgICAgICAgIGguc2V0VGFyZ2V0KGhhbmRsZXJzW3RdKQorICAgIHJldHVybiBoYW5kbGVycworCisKK2RlZiBfaW5zdGFsbF9sb2dnZXJzKGNwLCBoYW5kbGVycywgZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzKToKKyAgICAiIiJDcmVhdGUgYW5kIGluc3RhbGwgbG9nZ2VycyIiIgorCisgICAgIyBjb25maWd1cmUgdGhlIHJvb3QgZmlyc3QKKyAgICBsbGlzdCA9IGNwLmdldCgibG9nZ2VycyIsICJrZXlzIikKKyAgICBsbGlzdCA9IGxsaXN0LnNwbGl0KCIsIikKKyAgICBsbGlzdCA9IGxpc3QobWFwKGxhbWJkYSB4OiB4LnN0cmlwKCksIGxsaXN0KSkKKyAgICBsbGlzdC5yZW1vdmUoInJvb3QiKQorICAgIHNlY3RuYW1lID0gImxvZ2dlcl9yb290IgorICAgIHJvb3QgPSBsb2dnaW5nLnJvb3QKKyAgICBsb2cgPSByb290CisgICAgb3B0cyA9IGNwLm9wdGlvbnMoc2VjdG5hbWUpCisgICAgaWYgImxldmVsIiBpbiBvcHRzOgorICAgICAgICBsZXZlbCA9IGNwLmdldChzZWN0bmFtZSwgImxldmVsIikKKyAgICAgICAgbG9nLnNldExldmVsKGxvZ2dpbmcuX2xldmVsTmFtZXNbbGV2ZWxdKQorICAgIGZvciBoIGluIHJvb3QuaGFuZGxlcnNbOl06CisgICAgICAgIHJvb3QucmVtb3ZlSGFuZGxlcihoKQorICAgIGhsaXN0ID0gY3AuZ2V0KHNlY3RuYW1lLCAiaGFuZGxlcnMiKQorICAgIGlmIGxlbihobGlzdCk6CisgICAgICAgIGhsaXN0ID0gaGxpc3Quc3BsaXQoIiwiKQorICAgICAgICBobGlzdCA9IF9zdHJpcF9zcGFjZXMoaGxpc3QpCisgICAgICAgIGZvciBoYW5kIGluIGhsaXN0OgorICAgICAgICAgICAgbG9nLmFkZEhhbmRsZXIoaGFuZGxlcnNbaGFuZF0pCisKKyAgICAjYW5kIG5vdyB0aGUgb3RoZXJzLi4uCisgICAgI3dlIGRvbid0IHdhbnQgdG8gbG9zZSB0aGUgZXhpc3RpbmcgbG9nZ2VycywKKyAgICAjc2luY2Ugb3RoZXIgdGhyZWFkcyBtYXkgaGF2ZSBwb2ludGVycyB0byB0aGVtLgorICAgICNleGlzdGluZyBpcyBzZXQgdG8gY29udGFpbiBhbGwgZXhpc3RpbmcgbG9nZ2VycywKKyAgICAjYW5kIGFzIHdlIGdvIHRocm91Z2ggdGhlIG5ldyBjb25maWd1cmF0aW9uIHdlCisgICAgI3JlbW92ZSBhbnkgd2hpY2ggYXJlIGNvbmZpZ3VyZWQuIEF0IHRoZSBlbmQsCisgICAgI3doYXQncyBsZWZ0IGluIGV4aXN0aW5nIGlzIHRoZSBzZXQgb2YgbG9nZ2VycworICAgICN3aGljaCB3ZXJlIGluIHRoZSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGJ1dAorICAgICN3aGljaCBhcmUgbm90IGluIHRoZSBuZXcgY29uZmlndXJhdGlvbi4KKyAgICBleGlzdGluZyA9IGxpc3Qocm9vdC5tYW5hZ2VyLmxvZ2dlckRpY3Qua2V5cygpKQorICAgICNUaGUgbGlzdCBuZWVkcyB0byBiZSBzb3J0ZWQgc28gdGhhdCB3ZSBjYW4KKyAgICAjYXZvaWQgZGlzYWJsaW5nIGNoaWxkIGxvZ2dlcnMgb2YgZXhwbGljaXRseQorICAgICNuYW1lZCBsb2dnZXJzLiBXaXRoIGEgc29ydGVkIGxpc3QgaXQgaXMgZWFzaWVyCisgICAgI3RvIGZpbmQgdGhlIGNoaWxkIGxvZ2dlcnMuCisgICAgZXhpc3Rpbmcuc29ydCgpCisgICAgI1dlJ2xsIGtlZXAgdGhlIGxpc3Qgb2YgZXhpc3RpbmcgbG9nZ2VycworICAgICN3aGljaCBhcmUgY2hpbGRyZW4gb2YgbmFtZWQgbG9nZ2VycyBoZXJlLi4uCisgICAgY2hpbGRfbG9nZ2VycyA9IFtdCisgICAgI25vdyBzZXQgdXAgdGhlIG5ldyBvbmVzLi4uCisgICAgZm9yIGxvZyBpbiBsbGlzdDoKKyAgICAgICAgc2VjdG5hbWUgPSAibG9nZ2VyXyVzIiAlIGxvZworICAgICAgICBxbiA9IGNwLmdldChzZWN0bmFtZSwgInF1YWxuYW1lIikKKyAgICAgICAgb3B0cyA9IGNwLm9wdGlvbnMoc2VjdG5hbWUpCisgICAgICAgIGlmICJwcm9wYWdhdGUiIGluIG9wdHM6CisgICAgICAgICAgICBwcm9wYWdhdGUgPSBjcC5nZXRpbnQoc2VjdG5hbWUsICJwcm9wYWdhdGUiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvcGFnYXRlID0gMQorICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcihxbikKKyAgICAgICAgaWYgcW4gaW4gZXhpc3Rpbmc6CisgICAgICAgICAgICBpID0gZXhpc3RpbmcuaW5kZXgocW4pICsgMSAjIHN0YXJ0IHdpdGggdGhlIGVudHJ5IGFmdGVyIHFuCisgICAgICAgICAgICBwcmVmaXhlZCA9IHFuICsgIi4iCisgICAgICAgICAgICBwZmxlbiA9IGxlbihwcmVmaXhlZCkKKyAgICAgICAgICAgIG51bV9leGlzdGluZyA9IGxlbihleGlzdGluZykKKyAgICAgICAgICAgIHdoaWxlIGkgPCBudW1fZXhpc3Rpbmc6CisgICAgICAgICAgICAgICAgaWYgZXhpc3RpbmdbaV1bOnBmbGVuXSA9PSBwcmVmaXhlZDoKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRfbG9nZ2Vycy5hcHBlbmQoZXhpc3RpbmdbaV0pCisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBleGlzdGluZy5yZW1vdmUocW4pCisgICAgICAgIGlmICJsZXZlbCIgaW4gb3B0czoKKyAgICAgICAgICAgIGxldmVsID0gY3AuZ2V0KHNlY3RuYW1lLCAibGV2ZWwiKQorICAgICAgICAgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuX2xldmVsTmFtZXNbbGV2ZWxdKQorICAgICAgICBmb3IgaCBpbiBsb2dnZXIuaGFuZGxlcnNbOl06CisgICAgICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihoKQorICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gcHJvcGFnYXRlCisgICAgICAgIGxvZ2dlci5kaXNhYmxlZCA9IDAKKyAgICAgICAgaGxpc3QgPSBjcC5nZXQoc2VjdG5hbWUsICJoYW5kbGVycyIpCisgICAgICAgIGlmIGxlbihobGlzdCk6CisgICAgICAgICAgICBobGlzdCA9IGhsaXN0LnNwbGl0KCIsIikKKyAgICAgICAgICAgIGhsaXN0ID0gX3N0cmlwX3NwYWNlcyhobGlzdCkKKyAgICAgICAgICAgIGZvciBoYW5kIGluIGhsaXN0OgorICAgICAgICAgICAgICAgIGxvZ2dlci5hZGRIYW5kbGVyKGhhbmRsZXJzW2hhbmRdKQorCisgICAgI0Rpc2FibGUgYW55IG9sZCBsb2dnZXJzLiBUaGVyZSdzIG5vIHBvaW50IGRlbGV0aW5nCisgICAgI3RoZW0gYXMgb3RoZXIgdGhyZWFkcyBtYXkgY29udGludWUgdG8gaG9sZCByZWZlcmVuY2VzCisgICAgI2FuZCBieSBkaXNhYmxpbmcgdGhlbSwgeW91IHN0b3AgdGhlbSBkb2luZyBhbnkgbG9nZ2luZy4KKyAgICAjSG93ZXZlciwgZG9uJ3QgZGlzYWJsZSBjaGlsZHJlbiBvZiBuYW1lZCBsb2dnZXJzLCBhcyB0aGF0J3MKKyAgICAjcHJvYmFibHkgbm90IHdoYXQgd2FzIGludGVuZGVkIGJ5IHRoZSB1c2VyLgorICAgIGZvciBsb2cgaW4gZXhpc3Rpbmc6CisgICAgICAgIGxvZ2dlciA9IHJvb3QubWFuYWdlci5sb2dnZXJEaWN0W2xvZ10KKyAgICAgICAgaWYgbG9nIGluIGNoaWxkX2xvZ2dlcnM6CisgICAgICAgICAgICBsb2dnZXIubGV2ZWwgPSBsb2dnaW5nLk5PVFNFVAorICAgICAgICAgICAgbG9nZ2VyLmhhbmRsZXJzID0gW10KKyAgICAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2dnZXIuZGlzYWJsZWQgPSBkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnMKKworCisKK0lERU5USUZJRVIgPSByZS5jb21waWxlKCdeW2Etel9dW2EtejAtOV9dKiQnLCByZS5JKQorCisKK2RlZiB2YWxpZF9pZGVudChzKToKKyAgICBtID0gSURFTlRJRklFUi5tYXRjaChzKQorICAgIGlmIG5vdCBtOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdOb3QgYSB2YWxpZCBQeXRob24gaWRlbnRpZmllcjogJXInICUgcykKKyAgICByZXR1cm4gVHJ1ZQorCisKKyMgVGhlIENvbnZlcnRpbmdYWFggY2xhc3NlcyBhcmUgd3JhcHBlcnMgYXJvdW5kIHN0YW5kYXJkIFB5dGhvbiBjb250YWluZXJzLAorIyBhbmQgdGhleSBzZXJ2ZSB0byBjb252ZXJ0IGFueSBzdWl0YWJsZSB2YWx1ZXMgaW4gdGhlIGNvbnRhaW5lci4gVGhlCisjIGNvbnZlcnNpb24gY29udmVydHMgYmFzZSBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyB0byB0aGVpciB3cmFwcGVkCisjIGVxdWl2YWxlbnRzLCB3aGVyZWFzIHN0cmluZ3Mgd2hpY2ggbWF0Y2ggYSBjb252ZXJzaW9uIGZvcm1hdCBhcmUgY29udmVydGVkCisjIGFwcHJvcHJpYXRlbHkuCisjCisjIEVhY2ggd3JhcHBlciBzaG91bGQgaGF2ZSBhIGNvbmZpZ3VyYXRvciBhdHRyaWJ1dGUgaG9sZGluZyB0aGUgYWN0dWFsCisjIGNvbmZpZ3VyYXRvciB0byB1c2UgZm9yIGNvbnZlcnNpb24uCisKK2NsYXNzIENvbnZlcnRpbmdEaWN0KGRpY3QpOgorICAgICIiIkEgY29udmVydGluZyBkaWN0aW9uYXJ5IHdyYXBwZXIuIiIiCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdmFsdWUgPSBkaWN0Ll9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKKyAgICAgICAgI0lmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAorICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKKyAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICB2YWx1ZSA9IGRpY3QuZ2V0KHNlbGYsIGtleSwgZGVmYXVsdCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKKyAgICAgICAgI0lmIHRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgZGlmZmVyZW50LCBzYXZlIGZvciBuZXh0IHRpbWUKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIHNlbGZba2V5XSA9IHJlc3VsdAorICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKKyAgICAgICAgICAgICAgICByZXN1bHQua2V5ID0ga2V5CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBwb3Aoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICB2YWx1ZSA9IGRpY3QucG9wKHNlbGYsIGtleSwgZGVmYXVsdCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCisgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIENvbnZlcnRpbmdMaXN0KGxpc3QpOgorICAgICIiIkEgY29udmVydGluZyBsaXN0IHdyYXBwZXIuIiIiCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHZhbHVlID0gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJhdG9yLmNvbnZlcnQodmFsdWUpCisgICAgICAgICNJZiB0aGUgY29udmVydGVkIHZhbHVlIGlzIGRpZmZlcmVudCwgc2F2ZSBmb3IgbmV4dCB0aW1lCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCByZXN1bHQ6CisgICAgICAgICAgICBzZWxmW2tleV0gPSByZXN1bHQKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCisgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcG9wKHNlbGYsIGlkeD0tMSk6CisgICAgICAgIHZhbHVlID0gbGlzdC5wb3Aoc2VsZiwgaWR4KQorICAgICAgICByZXN1bHQgPSBzZWxmLmNvbmZpZ3VyYXRvci5jb252ZXJ0KHZhbHVlKQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgcmVzdWx0OgorICAgICAgICAgICAgaWYgdHlwZShyZXN1bHQpIGluIChDb252ZXJ0aW5nRGljdCwgQ29udmVydGluZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnRpbmdUdXBsZSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LnBhcmVudCA9IHNlbGYKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBDb252ZXJ0aW5nVHVwbGUodHVwbGUpOgorICAgICIiIkEgY29udmVydGluZyB0dXBsZSB3cmFwcGVyLiIiIgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB2YWx1ZSA9IHR1cGxlLl9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmF0b3IuY29udmVydCh2YWx1ZSkKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IHJlc3VsdDoKKyAgICAgICAgICAgIGlmIHR5cGUocmVzdWx0KSBpbiAoQ29udmVydGluZ0RpY3QsIENvbnZlcnRpbmdMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJ0aW5nVHVwbGUpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5wYXJlbnQgPSBzZWxmCisgICAgICAgICAgICAgICAgcmVzdWx0LmtleSA9IGtleQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIEJhc2VDb25maWd1cmF0b3Iob2JqZWN0KToKKyAgICAiIiIKKyAgICBUaGUgY29uZmlndXJhdG9yIGJhc2UgY2xhc3Mgd2hpY2ggZGVmaW5lcyBzb21lIHVzZWZ1bCBkZWZhdWx0cy4KKyAgICAiIiIKKworICAgIENPTlZFUlRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideKD9QPHByZWZpeD5bYS16XSspOi8vKD9QPHN1ZmZpeD4uKikkJykKKworICAgIFdPUkRfUEFUVEVSTiA9IHJlLmNvbXBpbGUocideXHMqKFx3KylccyonKQorICAgIERPVF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cLlxzKihcdyspXHMqJykKKyAgICBJTkRFWF9QQVRURVJOID0gcmUuY29tcGlsZShyJ15cW1xzKihcdyspXHMqXF1ccyonKQorICAgIERJR0lUX1BBVFRFUk4gPSByZS5jb21waWxlKHInXlxkKyQnKQorCisgICAgdmFsdWVfY29udmVydGVycyA9IHsKKyAgICAgICAgJ2V4dCcgOiAnZXh0X2NvbnZlcnQnLAorICAgICAgICAnY2ZnJyA6ICdjZmdfY29udmVydCcsCisgICAgfQorCisgICAgIyBXZSBtaWdodCB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBvbmUsIGUuZy4gaW1wb3J0bGliCisgICAgaW1wb3J0ZXIgPSBfX2ltcG9ydF9fCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29uZmlnKToKKyAgICAgICAgc2VsZi5jb25maWcgPSBDb252ZXJ0aW5nRGljdChjb25maWcpCisgICAgICAgIHNlbGYuY29uZmlnLmNvbmZpZ3VyYXRvciA9IHNlbGYKKyAgICAgICAgIyBJc3N1ZSAxMjcxODogd2lucGRiIHJlcGxhY2VzIF9faW1wb3J0X18gd2l0aCBhIFB5dGhvbiBmdW5jdGlvbiwgd2hpY2gKKyAgICAgICAgIyBlbmRzIHVwIGJlaW5nIHRyZWF0ZWQgYXMgYSBib3VuZCBtZXRob2QuIFRvIGF2b2lkIHByb2JsZW1zLCB3ZQorICAgICAgICAjIHNldCB0aGUgaW1wb3J0ZXIgb24gdGhlIGluc3RhbmNlLCBidXQgbGVhdmUgaXQgZGVmaW5lZCBpbiB0aGUgY2xhc3MKKyAgICAgICAgIyBzbyBleGlzdGluZyBjb2RlIGRvZXNuJ3QgYnJlYWsKKyAgICAgICAgaWYgdHlwZShfX2ltcG9ydF9fKSA9PSB0eXBlcy5GdW5jdGlvblR5cGU6CisgICAgICAgICAgICBzZWxmLmltcG9ydGVyID0gX19pbXBvcnRfXworCisgICAgZGVmIHJlc29sdmUoc2VsZiwgcyk6CisgICAgICAgICIiIgorICAgICAgICBSZXNvbHZlIHN0cmluZ3MgdG8gb2JqZWN0cyB1c2luZyBzdGFuZGFyZCBpbXBvcnQgYW5kIGF0dHJpYnV0ZQorICAgICAgICBzeW50YXguCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gcy5zcGxpdCgnLicpCisgICAgICAgIHVzZWQgPSBuYW1lLnBvcCgwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3VuZCA9IHNlbGYuaW1wb3J0ZXIodXNlZCkKKyAgICAgICAgICAgIGZvciBmcmFnIGluIG5hbWU6CisgICAgICAgICAgICAgICAgdXNlZCArPSAnLicgKyBmcmFnCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IGdldGF0dHIoZm91bmQsIGZyYWcpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmltcG9ydGVyKHVzZWQpCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gZ2V0YXR0cihmb3VuZCwgZnJhZykKKyAgICAgICAgICAgIHJldHVybiBmb3VuZAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBlLCB0YiA9IHN5cy5leGNfaW5mbygpWzE6XQorICAgICAgICAgICAgdiA9IFZhbHVlRXJyb3IoJ0Nhbm5vdCByZXNvbHZlICVyOiAlcycgJSAocywgZSkpCisgICAgICAgICAgICB2Ll9fY2F1c2VfXywgdi5fX3RyYWNlYmFja19fID0gZSwgdGIKKyAgICAgICAgICAgIHJhaXNlIHYKKworICAgIGRlZiBleHRfY29udmVydChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIkRlZmF1bHQgY29udmVydGVyIGZvciB0aGUgZXh0Oi8vIHByb3RvY29sLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5yZXNvbHZlKHZhbHVlKQorCisgICAgZGVmIGNmZ19jb252ZXJ0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgIiIiRGVmYXVsdCBjb252ZXJ0ZXIgZm9yIHRoZSBjZmc6Ly8gcHJvdG9jb2wuIiIiCisgICAgICAgIHJlc3QgPSB2YWx1ZQorICAgICAgICBtID0gc2VsZi5XT1JEX1BBVFRFUk4ubWF0Y2gocmVzdCkKKyAgICAgICAgaWYgbSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5hYmxlIHRvIGNvbnZlcnQgJXIiICUgdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN0ID0gcmVzdFttLmVuZCgpOl0KKyAgICAgICAgICAgIGQgPSBzZWxmLmNvbmZpZ1ttLmdyb3VwcygpWzBdXQorICAgICAgICAgICAgI3ByaW50IGQsIHJlc3QKKyAgICAgICAgICAgIHdoaWxlIHJlc3Q6CisgICAgICAgICAgICAgICAgbSA9IHNlbGYuRE9UX1BBVFRFUk4ubWF0Y2gocmVzdCkKKyAgICAgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICAgICBkID0gZFttLmdyb3VwcygpWzBdXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG0gPSBzZWxmLklOREVYX1BBVFRFUk4ubWF0Y2gocmVzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IG0uZ3JvdXBzKClbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLkRJR0lUX1BBVFRFUk4ubWF0Y2goaWR4KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gZFtpZHhdCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGludChpZHgpICMgdHJ5IGFzIG51bWJlciBmaXJzdCAobW9zdCBsaWtlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkW25dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IGRbaWR4XQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIHJlc3QgPSByZXN0W20uZW5kKCk6XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb252ZXJ0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgYXQgJXInICUgKHZhbHVlLCByZXN0KSkKKyAgICAgICAgI3Jlc3Qgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgIHJldHVybiBkCisKKyAgICBkZWYgY29udmVydChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIgorICAgICAgICBDb252ZXJ0IHZhbHVlcyB0byBhbiBhcHByb3ByaWF0ZSB0eXBlLiBkaWN0cywgbGlzdHMgYW5kIHR1cGxlcyBhcmUKKyAgICAgICAgcmVwbGFjZWQgYnkgdGhlaXIgY29udmVydGluZyBhbHRlcm5hdGl2ZXMuIFN0cmluZ3MgYXJlIGNoZWNrZWQgdG8KKyAgICAgICAgc2VlIGlmIHRoZXkgaGF2ZSBhIGNvbnZlcnNpb24gZm9ybWF0IGFuZCBhcmUgY29udmVydGVkIGlmIHRoZXkgZG8uCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgQ29udmVydGluZ0RpY3QpIGFuZCBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKKyAgICAgICAgICAgIHZhbHVlID0gQ29udmVydGluZ0RpY3QodmFsdWUpCisgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIENvbnZlcnRpbmdMaXN0KSBhbmQgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6CisgICAgICAgICAgICB2YWx1ZSA9IENvbnZlcnRpbmdMaXN0KHZhbHVlKQorICAgICAgICAgICAgdmFsdWUuY29uZmlndXJhdG9yID0gc2VsZgorICAgICAgICBlbGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBDb252ZXJ0aW5nVHVwbGUpIGFuZFwKKyAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSh2YWx1ZSwgdHVwbGUpOgorICAgICAgICAgICAgdmFsdWUgPSBDb252ZXJ0aW5nVHVwbGUodmFsdWUpCisgICAgICAgICAgICB2YWx1ZS5jb25maWd1cmF0b3IgPSBzZWxmCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYmFzZXN0cmluZyk6ICMgc3RyIGZvciBweTNrCisgICAgICAgICAgICBtID0gc2VsZi5DT05WRVJUX1BBVFRFUk4ubWF0Y2godmFsdWUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIGQgPSBtLmdyb3VwZGljdCgpCisgICAgICAgICAgICAgICAgcHJlZml4ID0gZFsncHJlZml4J10KKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBzZWxmLnZhbHVlX2NvbnZlcnRlcnMuZ2V0KHByZWZpeCwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBjb252ZXJ0ZXI6CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGRbJ3N1ZmZpeCddCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IGdldGF0dHIoc2VsZiwgY29udmVydGVyKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbnZlcnRlcihzdWZmaXgpCisgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgZGVmIGNvbmZpZ3VyZV9jdXN0b20oc2VsZiwgY29uZmlnKToKKyAgICAgICAgIiIiQ29uZmlndXJlIGFuIG9iamVjdCB3aXRoIGEgdXNlci1zdXBwbGllZCBmYWN0b3J5LiIiIgorICAgICAgICBjID0gY29uZmlnLnBvcCgnKCknKQorICAgICAgICBpZiBub3QgaGFzYXR0cihjLCAnX19jYWxsX18nKSBhbmQgaGFzYXR0cih0eXBlcywgJ0NsYXNzVHlwZScpIGFuZCB0eXBlKGMpICE9IHR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgICAgIGMgPSBzZWxmLnJlc29sdmUoYykKKyAgICAgICAgcHJvcHMgPSBjb25maWcucG9wKCcuJywgTm9uZSkKKyAgICAgICAgIyBDaGVjayBmb3IgdmFsaWQgaWRlbnRpZmllcnMKKyAgICAgICAga3dhcmdzID0gZGljdChbKGssIGNvbmZpZ1trXSkgZm9yIGsgaW4gY29uZmlnIGlmIHZhbGlkX2lkZW50KGspXSkKKyAgICAgICAgcmVzdWx0ID0gYygqKmt3YXJncykKKyAgICAgICAgaWYgcHJvcHM6CisgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gcHJvcHMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwgbmFtZSwgdmFsdWUpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBhc190dXBsZShzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIlV0aWxpdHkgZnVuY3Rpb24gd2hpY2ggY29udmVydHMgbGlzdHMgdG8gdHVwbGVzLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKKyAgICAgICAgICAgIHZhbHVlID0gdHVwbGUodmFsdWUpCisgICAgICAgIHJldHVybiB2YWx1ZQorCitjbGFzcyBEaWN0Q29uZmlndXJhdG9yKEJhc2VDb25maWd1cmF0b3IpOgorICAgICIiIgorICAgIENvbmZpZ3VyZSBsb2dnaW5nIHVzaW5nIGEgZGljdGlvbmFyeS1saWtlIG9iamVjdCB0byBkZXNjcmliZSB0aGUKKyAgICBjb25maWd1cmF0aW9uLgorICAgICIiIgorCisgICAgZGVmIGNvbmZpZ3VyZShzZWxmKToKKyAgICAgICAgIiIiRG8gdGhlIGNvbmZpZ3VyYXRpb24uIiIiCisKKyAgICAgICAgY29uZmlnID0gc2VsZi5jb25maWcKKyAgICAgICAgaWYgJ3ZlcnNpb24nIG5vdCBpbiBjb25maWc6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJkaWN0aW9uYXJ5IGRvZXNuJ3Qgc3BlY2lmeSBhIHZlcnNpb24iKQorICAgICAgICBpZiBjb25maWdbJ3ZlcnNpb24nXSAhPSAxOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5zdXBwb3J0ZWQgdmVyc2lvbjogJXMiICUgY29uZmlnWyd2ZXJzaW9uJ10pCisgICAgICAgIGluY3JlbWVudGFsID0gY29uZmlnLnBvcCgnaW5jcmVtZW50YWwnLCBGYWxzZSkKKyAgICAgICAgRU1QVFlfRElDVCA9IHt9CisgICAgICAgIGxvZ2dpbmcuX2FjcXVpcmVMb2NrKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaW5jcmVtZW50YWw6CisgICAgICAgICAgICAgICAgaGFuZGxlcnMgPSBjb25maWcuZ2V0KCdoYW5kbGVycycsIEVNUFRZX0RJQ1QpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gaGFuZGxlcnM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIGxvZ2dpbmcuX2hhbmRsZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTm8gaGFuZGxlciBmb3VuZCB3aXRoICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUgJXInICAlIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGxvZ2dpbmcuX2hhbmRsZXJzW25hbWVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl9jb25maWcgPSBoYW5kbGVyc1tuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gaGFuZGxlcl9jb25maWcuZ2V0KCdsZXZlbCcsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuc2V0TGV2ZWwobG9nZ2luZy5fY2hlY2tMZXZlbChsZXZlbCkpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGhhbmRsZXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCisgICAgICAgICAgICAgICAgbG9nZ2VycyA9IGNvbmZpZy5nZXQoJ2xvZ2dlcnMnLCBFTVBUWV9ESUNUKQorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGxvZ2dlcnM6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX2xvZ2dlcihuYW1lLCBsb2dnZXJzW25hbWVdLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgbG9nZ2VyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCisgICAgICAgICAgICAgICAgcm9vdCA9IGNvbmZpZy5nZXQoJ3Jvb3QnLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIHJvb3Q6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX3Jvb3Qocm9vdCwgVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIHJvb3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9nZ2VyOiAlcycgJSBlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkaXNhYmxlX2V4aXN0aW5nID0gY29uZmlnLnBvcCgnZGlzYWJsZV9leGlzdGluZ19sb2dnZXJzJywgVHJ1ZSkKKworICAgICAgICAgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJzLmNsZWFyKCkKKyAgICAgICAgICAgICAgICBkZWwgbG9nZ2luZy5faGFuZGxlckxpc3RbOl0KKworICAgICAgICAgICAgICAgICMgRG8gZm9ybWF0dGVycyBmaXJzdCAtIHRoZXkgZG9uJ3QgcmVmZXIgdG8gYW55dGhpbmcgZWxzZQorICAgICAgICAgICAgICAgIGZvcm1hdHRlcnMgPSBjb25maWcuZ2V0KCdmb3JtYXR0ZXJzJywgRU1QVFlfRElDVCkKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmb3JtYXR0ZXJzOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXJzW25hbWVdID0gc2VsZi5jb25maWd1cmVfZm9ybWF0dGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyc1tuYW1lXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlciAlcjogJXMnICUgKG5hbWUsIGUpKQorICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gZmlsdGVycyAtIHRoZXkgZG9uJ3QgcmVmZXIgdG8gYW55dGhpbmcgZWxzZSwgZWl0aGVyCisgICAgICAgICAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5nZXQoJ2ZpbHRlcnMnLCBFTVBUWV9ESUNUKQorICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbHRlcnM6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnNbbmFtZV0gPSBzZWxmLmNvbmZpZ3VyZV9maWx0ZXIoZmlsdGVyc1tuYW1lXSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlciAlcjogJXMnICUgKG5hbWUsIGUpKQorCisgICAgICAgICAgICAgICAgIyBOZXh0LCBkbyBoYW5kbGVycyAtIHRoZXkgcmVmZXIgdG8gZm9ybWF0dGVycyBhbmQgZmlsdGVycworICAgICAgICAgICAgICAgICMgQXMgaGFuZGxlcnMgY2FuIHJlZmVyIHRvIG90aGVyIGhhbmRsZXJzLCBzb3J0IHRoZSBrZXlzCisgICAgICAgICAgICAgICAgIyB0byBhbGxvdyBhIGRldGVybWluaXN0aWMgb3JkZXIgb2YgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgIGhhbmRsZXJzID0gY29uZmlnLmdldCgnaGFuZGxlcnMnLCBFTVBUWV9ESUNUKQorICAgICAgICAgICAgICAgIGRlZmVycmVkID0gW10KKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBzb3J0ZWQoaGFuZGxlcnMpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5jb25maWd1cmVfaGFuZGxlcihoYW5kbGVyc1tuYW1lXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIubmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJzW25hbWVdID0gaGFuZGxlcgorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICd0YXJnZXQgbm90IGNvbmZpZ3VyZWQgeWV0JyBpbiBzdHIoZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgaGFuZGxlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKKworICAgICAgICAgICAgICAgICMgTm93IGRvIGFueSB0aGF0IHdlcmUgZGVmZXJyZWQKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBkZWZlcnJlZDoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuY29uZmlndXJlX2hhbmRsZXIoaGFuZGxlcnNbbmFtZV0pCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLm5hbWUgPSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyc1tuYW1lXSA9IGhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIGhhbmRsZXIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChuYW1lLCBlKSkKKworICAgICAgICAgICAgICAgICMgTmV4dCwgZG8gbG9nZ2VycyAtIHRoZXkgcmVmZXIgdG8gaGFuZGxlcnMgYW5kIGZpbHRlcnMKKworICAgICAgICAgICAgICAgICN3ZSBkb24ndCB3YW50IHRvIGxvc2UgdGhlIGV4aXN0aW5nIGxvZ2dlcnMsCisgICAgICAgICAgICAgICAgI3NpbmNlIG90aGVyIHRocmVhZHMgbWF5IGhhdmUgcG9pbnRlcnMgdG8gdGhlbS4KKyAgICAgICAgICAgICAgICAjZXhpc3RpbmcgaXMgc2V0IHRvIGNvbnRhaW4gYWxsIGV4aXN0aW5nIGxvZ2dlcnMsCisgICAgICAgICAgICAgICAgI2FuZCBhcyB3ZSBnbyB0aHJvdWdoIHRoZSBuZXcgY29uZmlndXJhdGlvbiB3ZQorICAgICAgICAgICAgICAgICNyZW1vdmUgYW55IHdoaWNoIGFyZSBjb25maWd1cmVkLiBBdCB0aGUgZW5kLAorICAgICAgICAgICAgICAgICN3aGF0J3MgbGVmdCBpbiBleGlzdGluZyBpcyB0aGUgc2V0IG9mIGxvZ2dlcnMKKyAgICAgICAgICAgICAgICAjd2hpY2ggd2VyZSBpbiB0aGUgcHJldmlvdXMgY29uZmlndXJhdGlvbiBidXQKKyAgICAgICAgICAgICAgICAjd2hpY2ggYXJlIG5vdCBpbiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgcm9vdCA9IGxvZ2dpbmcucm9vdAorICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gcm9vdC5tYW5hZ2VyLmxvZ2dlckRpY3Qua2V5cygpCisgICAgICAgICAgICAgICAgI1RoZSBsaXN0IG5lZWRzIHRvIGJlIHNvcnRlZCBzbyB0aGF0IHdlIGNhbgorICAgICAgICAgICAgICAgICNhdm9pZCBkaXNhYmxpbmcgY2hpbGQgbG9nZ2VycyBvZiBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgI25hbWVkIGxvZ2dlcnMuIFdpdGggYSBzb3J0ZWQgbGlzdCBpdCBpcyBlYXNpZXIKKyAgICAgICAgICAgICAgICAjdG8gZmluZCB0aGUgY2hpbGQgbG9nZ2Vycy4KKyAgICAgICAgICAgICAgICBleGlzdGluZy5zb3J0KCkKKyAgICAgICAgICAgICAgICAjV2UnbGwga2VlcCB0aGUgbGlzdCBvZiBleGlzdGluZyBsb2dnZXJzCisgICAgICAgICAgICAgICAgI3doaWNoIGFyZSBjaGlsZHJlbiBvZiBuYW1lZCBsb2dnZXJzIGhlcmUuLi4KKyAgICAgICAgICAgICAgICBjaGlsZF9sb2dnZXJzID0gW10KKyAgICAgICAgICAgICAgICAjbm93IHNldCB1cCB0aGUgbmV3IG9uZXMuLi4KKyAgICAgICAgICAgICAgICBsb2dnZXJzID0gY29uZmlnLmdldCgnbG9nZ2VycycsIEVNUFRZX0RJQ1QpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gbG9nZ2VyczoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IF9lbmNvZGVkKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5hbWUgaW4gZXhpc3Rpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gZXhpc3RpbmcuaW5kZXgobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeGVkID0gbmFtZSArICIuIgorICAgICAgICAgICAgICAgICAgICAgICAgcGZsZW4gPSBsZW4ocHJlZml4ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBudW1fZXhpc3RpbmcgPSBsZW4oZXhpc3RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSArIDEgIyBsb29rIGF0IHRoZSBlbnRyeSBhZnRlciBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IG51bV9leGlzdGluZykgYW5kXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nW2ldWzpwZmxlbl0gPT0gcHJlZml4ZWQpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2xvZ2dlcnMuYXBwZW5kKGV4aXN0aW5nW2ldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcucmVtb3ZlKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX2xvZ2dlcihuYW1lLCBsb2dnZXJzW25hbWVdKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1VuYWJsZSB0byBjb25maWd1cmUgbG9nZ2VyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyOiAlcycgJSAobmFtZSwgZSkpCisKKyAgICAgICAgICAgICAgICAjRGlzYWJsZSBhbnkgb2xkIGxvZ2dlcnMuIFRoZXJlJ3Mgbm8gcG9pbnQgZGVsZXRpbmcKKyAgICAgICAgICAgICAgICAjdGhlbSBhcyBvdGhlciB0aHJlYWRzIG1heSBjb250aW51ZSB0byBob2xkIHJlZmVyZW5jZXMKKyAgICAgICAgICAgICAgICAjYW5kIGJ5IGRpc2FibGluZyB0aGVtLCB5b3Ugc3RvcCB0aGVtIGRvaW5nIGFueSBsb2dnaW5nLgorICAgICAgICAgICAgICAgICNIb3dldmVyLCBkb24ndCBkaXNhYmxlIGNoaWxkcmVuIG9mIG5hbWVkIGxvZ2dlcnMsIGFzIHRoYXQncworICAgICAgICAgICAgICAgICNwcm9iYWJseSBub3Qgd2hhdCB3YXMgaW50ZW5kZWQgYnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgZm9yIGxvZyBpbiBleGlzdGluZzoKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyID0gcm9vdC5tYW5hZ2VyLmxvZ2dlckRpY3RbbG9nXQorICAgICAgICAgICAgICAgICAgICBpZiBsb2cgaW4gY2hpbGRfbG9nZ2VyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sZXZlbCA9IGxvZ2dpbmcuTk9UU0VUCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaGFuZGxlcnMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLnByb3BhZ2F0ZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBkaXNhYmxlX2V4aXN0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRpc2FibGVkID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgIyBBbmQgZmluYWxseSwgZG8gdGhlIHJvb3QgbG9nZ2VyCisgICAgICAgICAgICAgICAgcm9vdCA9IGNvbmZpZy5nZXQoJ3Jvb3QnLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIHJvb3Q6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uZmlndXJlX3Jvb3Qocm9vdCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gY29uZmlndXJlIHJvb3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbG9nZ2VyOiAlcycgJSBlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5fcmVsZWFzZUxvY2soKQorCisgICAgZGVmIGNvbmZpZ3VyZV9mb3JtYXR0ZXIoc2VsZiwgY29uZmlnKToKKyAgICAgICAgIiIiQ29uZmlndXJlIGEgZm9ybWF0dGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgorICAgICAgICBpZiAnKCknIGluIGNvbmZpZzoKKyAgICAgICAgICAgIGZhY3RvcnkgPSBjb25maWdbJygpJ10gIyBmb3IgdXNlIGluIGV4Y2VwdGlvbiBoYW5kbGVyCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKGNvbmZpZykKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIHRlOgorICAgICAgICAgICAgICAgIGlmICInZm9ybWF0JyIgbm90IGluIHN0cih0ZSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgI05hbWUgb2YgcGFyYW1ldGVyIGNoYW5nZWQgZnJvbSBmbXQgdG8gZm9ybWF0LgorICAgICAgICAgICAgICAgICNSZXRyeSB3aXRoIG9sZCBuYW1lLgorICAgICAgICAgICAgICAgICNUaGlzIGlzIHNvIHRoYXQgY29kZSBjYW4gYmUgdXNlZCB3aXRoIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucworICAgICAgICAgICAgICAgICMoZS5nLiBieSBEamFuZ28pCisgICAgICAgICAgICAgICAgY29uZmlnWydmbXQnXSA9IGNvbmZpZy5wb3AoJ2Zvcm1hdCcpCisgICAgICAgICAgICAgICAgY29uZmlnWycoKSddID0gZmFjdG9yeQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uZmlndXJlX2N1c3RvbShjb25maWcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbXQgPSBjb25maWcuZ2V0KCdmb3JtYXQnLCBOb25lKQorICAgICAgICAgICAgZGZtdCA9IGNvbmZpZy5nZXQoJ2RhdGVmbXQnLCBOb25lKQorICAgICAgICAgICAgcmVzdWx0ID0gbG9nZ2luZy5Gb3JtYXR0ZXIoZm10LCBkZm10KQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgY29uZmlndXJlX2ZpbHRlcihzZWxmLCBjb25maWcpOgorICAgICAgICAiIiJDb25maWd1cmUgYSBmaWx0ZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCisgICAgICAgIGlmICcoKScgaW4gY29uZmlnOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5jb25maWd1cmVfY3VzdG9tKGNvbmZpZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSBjb25maWcuZ2V0KCduYW1lJywgJycpCisgICAgICAgICAgICByZXN1bHQgPSBsb2dnaW5nLkZpbHRlcihuYW1lKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgYWRkX2ZpbHRlcnMoc2VsZiwgZmlsdGVyZXIsIGZpbHRlcnMpOgorICAgICAgICAiIiJBZGQgZmlsdGVycyB0byBhIGZpbHRlcmVyIGZyb20gYSBsaXN0IG9mIG5hbWVzLiIiIgorICAgICAgICBmb3IgZiBpbiBmaWx0ZXJzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbHRlcmVyLmFkZEZpbHRlcihzZWxmLmNvbmZpZ1snZmlsdGVycyddW2ZdKQorICAgICAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5hYmxlIHRvIGFkZCBmaWx0ZXIgJXI6ICVzJyAlIChmLCBlKSkKKworICAgIGRlZiBjb25maWd1cmVfaGFuZGxlcihzZWxmLCBjb25maWcpOgorICAgICAgICAiIiJDb25maWd1cmUgYSBoYW5kbGVyIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgorICAgICAgICBmb3JtYXR0ZXIgPSBjb25maWcucG9wKCdmb3JtYXR0ZXInLCBOb25lKQorICAgICAgICBpZiBmb3JtYXR0ZXI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5jb25maWdbJ2Zvcm1hdHRlcnMnXVtmb3JtYXR0ZXJdCisgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gc2V0IGZvcm1hdHRlciAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChmb3JtYXR0ZXIsIGUpKQorICAgICAgICBsZXZlbCA9IGNvbmZpZy5wb3AoJ2xldmVsJywgTm9uZSkKKyAgICAgICAgZmlsdGVycyA9IGNvbmZpZy5wb3AoJ2ZpbHRlcnMnLCBOb25lKQorICAgICAgICBpZiAnKCknIGluIGNvbmZpZzoKKyAgICAgICAgICAgIGMgPSBjb25maWcucG9wKCcoKScpCisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihjLCAnX19jYWxsX18nKSBhbmQgaGFzYXR0cih0eXBlcywgJ0NsYXNzVHlwZScpIGFuZCB0eXBlKGMpICE9IHR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgICAgICAgICBjID0gc2VsZi5yZXNvbHZlKGMpCisgICAgICAgICAgICBmYWN0b3J5ID0gYworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY25hbWUgPSBjb25maWcucG9wKCdjbGFzcycpCisgICAgICAgICAgICBrbGFzcyA9IHNlbGYucmVzb2x2ZShjbmFtZSkKKyAgICAgICAgICAgICNTcGVjaWFsIGNhc2UgZm9yIGhhbmRsZXIgd2hpY2ggcmVmZXJzIHRvIGFub3RoZXIgaGFuZGxlcgorICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyKSBhbmRcCisgICAgICAgICAgICAgICAgJ3RhcmdldCcgaW4gY29uZmlnOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGggPSBzZWxmLmNvbmZpZ1snaGFuZGxlcnMnXVtjb25maWdbJ3RhcmdldCddXQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0aCwgbG9nZ2luZy5IYW5kbGVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1snY2xhc3MnXSA9IGNuYW1lICMgcmVzdG9yZSBmb3IgZGVmZXJyZWQgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RhbmRhcmRFcnJvcigndGFyZ2V0IG5vdCBjb25maWd1cmVkIHlldCcpCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1sndGFyZ2V0J10gPSB0aAorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gc2V0IHRhcmdldCBoYW5kbGVyICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXI6ICVzJyAlIChjb25maWdbJ3RhcmdldCddLCBlKSkKKyAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyhrbGFzcywgbG9nZ2luZy5oYW5kbGVycy5TTVRQSGFuZGxlcikgYW5kXAorICAgICAgICAgICAgICAgICdtYWlsaG9zdCcgaW4gY29uZmlnOgorICAgICAgICAgICAgICAgIGNvbmZpZ1snbWFpbGhvc3QnXSA9IHNlbGYuYXNfdHVwbGUoY29uZmlnWydtYWlsaG9zdCddKQorICAgICAgICAgICAgZWxpZiBpc3N1YmNsYXNzKGtsYXNzLCBsb2dnaW5nLmhhbmRsZXJzLlN5c0xvZ0hhbmRsZXIpIGFuZFwKKyAgICAgICAgICAgICAgICAnYWRkcmVzcycgaW4gY29uZmlnOgorICAgICAgICAgICAgICAgIGNvbmZpZ1snYWRkcmVzcyddID0gc2VsZi5hc190dXBsZShjb25maWdbJ2FkZHJlc3MnXSkKKyAgICAgICAgICAgIGZhY3RvcnkgPSBrbGFzcworICAgICAgICBrd2FyZ3MgPSBkaWN0KFsoaywgY29uZmlnW2tdKSBmb3IgayBpbiBjb25maWcgaWYgdmFsaWRfaWRlbnQoayldKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBmYWN0b3J5KCoqa3dhcmdzKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCB0ZToKKyAgICAgICAgICAgIGlmICInc3RyZWFtJyIgbm90IGluIHN0cih0ZSk6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICNUaGUgYXJndW1lbnQgbmFtZSBjaGFuZ2VkIGZyb20gc3RybSB0byBzdHJlYW0KKyAgICAgICAgICAgICNSZXRyeSB3aXRoIG9sZCBuYW1lLgorICAgICAgICAgICAgI1RoaXMgaXMgc28gdGhhdCBjb2RlIGNhbiBiZSB1c2VkIHdpdGggb2xkZXIgUHl0aG9uIHZlcnNpb25zCisgICAgICAgICAgICAjKGUuZy4gYnkgRGphbmdvKQorICAgICAgICAgICAga3dhcmdzWydzdHJtJ10gPSBrd2FyZ3MucG9wKCdzdHJlYW0nKQorICAgICAgICAgICAgcmVzdWx0ID0gZmFjdG9yeSgqKmt3YXJncykKKyAgICAgICAgaWYgZm9ybWF0dGVyOgorICAgICAgICAgICAgcmVzdWx0LnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCisgICAgICAgIGlmIGxldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmVzdWx0LnNldExldmVsKGxvZ2dpbmcuX2NoZWNrTGV2ZWwobGV2ZWwpKQorICAgICAgICBpZiBmaWx0ZXJzOgorICAgICAgICAgICAgc2VsZi5hZGRfZmlsdGVycyhyZXN1bHQsIGZpbHRlcnMpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBhZGRfaGFuZGxlcnMoc2VsZiwgbG9nZ2VyLCBoYW5kbGVycyk6CisgICAgICAgICIiIkFkZCBoYW5kbGVycyB0byBhIGxvZ2dlciBmcm9tIGEgbGlzdCBvZiBuYW1lcy4iIiIKKyAgICAgICAgZm9yIGggaW4gaGFuZGxlcnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoc2VsZi5jb25maWdbJ2hhbmRsZXJzJ11baF0pCisgICAgICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdVbmFibGUgdG8gYWRkIGhhbmRsZXIgJXI6ICVzJyAlIChoLCBlKSkKKworICAgIGRlZiBjb21tb25fbG9nZ2VyX2NvbmZpZyhzZWxmLCBsb2dnZXIsIGNvbmZpZywgaW5jcmVtZW50YWw9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgUGVyZm9ybSBjb25maWd1cmF0aW9uIHdoaWNoIGlzIGNvbW1vbiB0byByb290IGFuZCBub24tcm9vdCBsb2dnZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgbGV2ZWwgPSBjb25maWcuZ2V0KCdsZXZlbCcsIE5vbmUpCisgICAgICAgIGlmIGxldmVsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuX2NoZWNrTGV2ZWwobGV2ZWwpKQorICAgICAgICBpZiBub3QgaW5jcmVtZW50YWw6CisgICAgICAgICAgICAjUmVtb3ZlIGFueSBleGlzdGluZyBoYW5kbGVycworICAgICAgICAgICAgZm9yIGggaW4gbG9nZ2VyLmhhbmRsZXJzWzpdOgorICAgICAgICAgICAgICAgIGxvZ2dlci5yZW1vdmVIYW5kbGVyKGgpCisgICAgICAgICAgICBoYW5kbGVycyA9IGNvbmZpZy5nZXQoJ2hhbmRsZXJzJywgTm9uZSkKKyAgICAgICAgICAgIGlmIGhhbmRsZXJzOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX2hhbmRsZXJzKGxvZ2dlciwgaGFuZGxlcnMpCisgICAgICAgICAgICBmaWx0ZXJzID0gY29uZmlnLmdldCgnZmlsdGVycycsIE5vbmUpCisgICAgICAgICAgICBpZiBmaWx0ZXJzOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkX2ZpbHRlcnMobG9nZ2VyLCBmaWx0ZXJzKQorCisgICAgZGVmIGNvbmZpZ3VyZV9sb2dnZXIoc2VsZiwgbmFtZSwgY29uZmlnLCBpbmNyZW1lbnRhbD1GYWxzZSk6CisgICAgICAgICIiIkNvbmZpZ3VyZSBhIG5vbi1yb290IGxvZ2dlciBmcm9tIGEgZGljdGlvbmFyeS4iIiIKKyAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIobmFtZSkKKyAgICAgICAgc2VsZi5jb21tb25fbG9nZ2VyX2NvbmZpZyhsb2dnZXIsIGNvbmZpZywgaW5jcmVtZW50YWwpCisgICAgICAgIHByb3BhZ2F0ZSA9IGNvbmZpZy5nZXQoJ3Byb3BhZ2F0ZScsIE5vbmUpCisgICAgICAgIGlmIHByb3BhZ2F0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlci5wcm9wYWdhdGUgPSBwcm9wYWdhdGUKKworICAgIGRlZiBjb25maWd1cmVfcm9vdChzZWxmLCBjb25maWcsIGluY3JlbWVudGFsPUZhbHNlKToKKyAgICAgICAgIiIiQ29uZmlndXJlIGEgcm9vdCBsb2dnZXIgZnJvbSBhIGRpY3Rpb25hcnkuIiIiCisgICAgICAgIHJvb3QgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgIHNlbGYuY29tbW9uX2xvZ2dlcl9jb25maWcocm9vdCwgY29uZmlnLCBpbmNyZW1lbnRhbCkKKworZGljdENvbmZpZ0NsYXNzID0gRGljdENvbmZpZ3VyYXRvcgorCitkZWYgZGljdENvbmZpZyhjb25maWcpOgorICAgICIiIkNvbmZpZ3VyZSBsb2dnaW5nIHVzaW5nIGEgZGljdGlvbmFyeS4iIiIKKyAgICBkaWN0Q29uZmlnQ2xhc3MoY29uZmlnKS5jb25maWd1cmUoKQorCisKK2RlZiBsaXN0ZW4ocG9ydD1ERUZBVUxUX0xPR0dJTkdfQ09ORklHX1BPUlQpOgorICAgICIiIgorICAgIFN0YXJ0IHVwIGEgc29ja2V0IHNlcnZlciBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsIGFuZCBsaXN0ZW4gZm9yIG5ldworICAgIGNvbmZpZ3VyYXRpb25zLgorCisgICAgVGhlc2Ugd2lsbCBiZSBzZW50IGFzIGEgZmlsZSBzdWl0YWJsZSBmb3IgcHJvY2Vzc2luZyBieSBmaWxlQ29uZmlnKCkuCisgICAgUmV0dXJucyBhIFRocmVhZCBvYmplY3Qgb24gd2hpY2ggeW91IGNhbiBjYWxsIHN0YXJ0KCkgdG8gc3RhcnQgdGhlIHNlcnZlciwKKyAgICBhbmQgd2hpY2ggeW91IGNhbiBqb2luKCkgd2hlbiBhcHByb3ByaWF0ZS4gVG8gc3RvcCB0aGUgc2VydmVyLCBjYWxsCisgICAgc3RvcExpc3RlbmluZygpLgorICAgICIiIgorICAgIGlmIG5vdCB0aHJlYWQ6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoImxpc3RlbigpIG5lZWRzIHRocmVhZGluZyB0byB3b3JrIikKKworICAgIGNsYXNzIENvbmZpZ1N0cmVhbUhhbmRsZXIoU3RyZWFtUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICAiIiIKKyAgICAgICAgSGFuZGxlciBmb3IgYSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gcmVxdWVzdC4KKworICAgICAgICBJdCBleHBlY3RzIGEgY29tcGxldGVseSBuZXcgbG9nZ2luZyBjb25maWd1cmF0aW9uIGFuZCB1c2VzIGZpbGVDb25maWcKKyAgICAgICAgdG8gaW5zdGFsbCBpdC4KKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIEhhbmRsZSBhIHJlcXVlc3QuCisKKyAgICAgICAgICAgIEVhY2ggcmVxdWVzdCBpcyBleHBlY3RlZCB0byBiZSBhIDQtYnl0ZSBsZW5ndGgsIHBhY2tlZCB1c2luZworICAgICAgICAgICAgc3RydWN0LnBhY2soIj5MIiwgbiksIGZvbGxvd2VkIGJ5IHRoZSBjb25maWcgZmlsZS4KKyAgICAgICAgICAgIFVzZXMgZmlsZUNvbmZpZygpIHRvIGRvIHRoZSBncnVudCB3b3JrLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb25uID0gc2VsZi5jb25uZWN0aW9uCisgICAgICAgICAgICAgICAgY2h1bmsgPSBjb25uLnJlY3YoNCkKKyAgICAgICAgICAgICAgICBpZiBsZW4oY2h1bmspID09IDQ6CisgICAgICAgICAgICAgICAgICAgIHNsZW4gPSBzdHJ1Y3QudW5wYWNrKCI+TCIsIGNodW5rKVswXQorICAgICAgICAgICAgICAgICAgICBjaHVuayA9IHNlbGYuY29ubmVjdGlvbi5yZWN2KHNsZW4pCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGxlbihjaHVuaykgPCBzbGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmsgPSBjaHVuayArIGNvbm4ucmVjdihzbGVuIC0gbGVuKGNodW5rKSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGpzb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPWpzb24ubG9hZHMoY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkLCBkaWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgZGljdENvbmZpZyhkKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAjQXBwbHkgbmV3IGNvbmZpZ3VyYXRpb24uCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBjU3RyaW5nSU8uU3RyaW5nSU8oY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZUNvbmZpZyhmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5zZXJ2ZXIucmVhZHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlci5yZWFkeS5zZXQoKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShlLmFyZ3MsIHR1cGxlKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBlcnJjb2RlID0gZS5hcmdzWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIGVycmNvZGUgIT0gUkVTRVRfRVJST1I6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgY2xhc3MgQ29uZmlnU29ja2V0UmVjZWl2ZXIoVGhyZWFkaW5nVENQU2VydmVyKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgc2ltcGxlIFRDUCBzb2NrZXQtYmFzZWQgbG9nZ2luZyBjb25maWcgcmVjZWl2ZXIuCisgICAgICAgICIiIgorCisgICAgICAgIGFsbG93X3JldXNlX2FkZHJlc3MgPSAxCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9J2xvY2FsaG9zdCcsIHBvcnQ9REVGQVVMVF9MT0dHSU5HX0NPTkZJR19QT1JULAorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcj1Ob25lLCByZWFkeT1Ob25lKToKKyAgICAgICAgICAgIFRocmVhZGluZ1RDUFNlcnZlci5fX2luaXRfXyhzZWxmLCAoaG9zdCwgcG9ydCksIGhhbmRsZXIpCisgICAgICAgICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgICAgICAgICBzZWxmLmFib3J0ID0gMAorICAgICAgICAgICAgbG9nZ2luZy5fcmVsZWFzZUxvY2soKQorICAgICAgICAgICAgc2VsZi50aW1lb3V0ID0gMQorICAgICAgICAgICAgc2VsZi5yZWFkeSA9IHJlYWR5CisKKyAgICAgICAgZGVmIHNlcnZlX3VudGlsX3N0b3BwZWQoc2VsZik6CisgICAgICAgICAgICBpbXBvcnQgc2VsZWN0CisgICAgICAgICAgICBhYm9ydCA9IDAKKyAgICAgICAgICAgIHdoaWxlIG5vdCBhYm9ydDoKKyAgICAgICAgICAgICAgICByZCwgd3IsIGV4ID0gc2VsZWN0LnNlbGVjdChbc2VsZi5zb2NrZXQuZmlsZW5vKCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVvdXQpCisgICAgICAgICAgICAgICAgaWYgcmQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICAgICAgICAgIGxvZ2dpbmcuX2FjcXVpcmVMb2NrKCkKKyAgICAgICAgICAgICAgICBhYm9ydCA9IHNlbGYuYWJvcnQKKyAgICAgICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCisgICAgICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCisKKyAgICBjbGFzcyBTZXJ2ZXIodGhyZWFkaW5nLlRocmVhZCk6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJjdnIsIGhkbHIsIHBvcnQpOgorICAgICAgICAgICAgc3VwZXIoU2VydmVyLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgICAgICBzZWxmLnJjdnIgPSByY3ZyCisgICAgICAgICAgICBzZWxmLmhkbHIgPSBoZGxyCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgICAgICBzZWxmLnJlYWR5ID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgc2VydmVyID0gc2VsZi5yY3ZyKHBvcnQ9c2VsZi5wb3J0LCBoYW5kbGVyPXNlbGYuaGRsciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkeT1zZWxmLnJlYWR5KQorICAgICAgICAgICAgaWYgc2VsZi5wb3J0ID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gc2VydmVyLnNlcnZlcl9hZGRyZXNzWzFdCisgICAgICAgICAgICBzZWxmLnJlYWR5LnNldCgpCisgICAgICAgICAgICBnbG9iYWwgX2xpc3RlbmVyCisgICAgICAgICAgICBsb2dnaW5nLl9hY3F1aXJlTG9jaygpCisgICAgICAgICAgICBfbGlzdGVuZXIgPSBzZXJ2ZXIKKyAgICAgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKKyAgICAgICAgICAgIHNlcnZlci5zZXJ2ZV91bnRpbF9zdG9wcGVkKCkKKworICAgIHJldHVybiBTZXJ2ZXIoQ29uZmlnU29ja2V0UmVjZWl2ZXIsIENvbmZpZ1N0cmVhbUhhbmRsZXIsIHBvcnQpCisKK2RlZiBzdG9wTGlzdGVuaW5nKCk6CisgICAgIiIiCisgICAgU3RvcCB0aGUgbGlzdGVuaW5nIHNlcnZlciB3aGljaCB3YXMgY3JlYXRlZCB3aXRoIGEgY2FsbCB0byBsaXN0ZW4oKS4KKyAgICAiIiIKKyAgICBnbG9iYWwgX2xpc3RlbmVyCisgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQorICAgIHRyeToKKyAgICAgICAgaWYgX2xpc3RlbmVyOgorICAgICAgICAgICAgX2xpc3RlbmVyLmFib3J0ID0gMQorICAgICAgICAgICAgX2xpc3RlbmVyID0gTm9uZQorICAgIGZpbmFsbHk6CisgICAgICAgIGxvZ2dpbmcuX3JlbGVhc2VMb2NrKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9jb25maWcucHljIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL2NvbmZpZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OTRjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9jb25maWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9jb25maWcucHlvIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL2NvbmZpZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAzMzRlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9jb25maWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weSBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODM3ZjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9sb2dnaW5nL2hhbmRsZXJzLnB5CkBAIC0wLDAgKzEsMTIyMSBAQAorIyBDb3B5cmlnaHQgMjAwMS0yMDEzIGJ5IFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisjIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorIyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFZpbmF5IFNhamlwCisjIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgorIyBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorIyBWSU5BWSBTQUpJUCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HCisjIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTAorIyBWSU5BWSBTQUpJUCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKKyMgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisjIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUCisjIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisKKyIiIgorQWRkaXRpb25hbCBoYW5kbGVycyBmb3IgdGhlIGxvZ2dpbmcgcGFja2FnZSBmb3IgUHl0aG9uLiBUaGUgY29yZSBwYWNrYWdlIGlzCitiYXNlZCBvbiBQRVAgMjgyIGFuZCBjb21tZW50cyB0aGVyZXRvIGluIGNvbXAubGFuZy5weXRob24uCisKK0NvcHlyaWdodCAoQykgMjAwMS0yMDEzIFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitUbyB1c2UsIHNpbXBseSAnaW1wb3J0IGxvZ2dpbmcuaGFuZGxlcnMnIGFuZCBsb2cgYXdheSEKKyIiIgorCitpbXBvcnQgZXJybm8sIGxvZ2dpbmcsIHNvY2tldCwgb3MsIGNQaWNrbGUsIHN0cnVjdCwgdGltZSwgcmUKK2Zyb20gc3RhdCBpbXBvcnQgU1RfREVWLCBTVF9JTk8sIFNUX01USU1FCisKK3RyeToKKyAgICBpbXBvcnQgY29kZWNzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY29kZWNzID0gTm9uZQordHJ5OgorICAgIHVuaWNvZGUKKyAgICBfdW5pY29kZSA9IFRydWUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgX3VuaWNvZGUgPSBGYWxzZQorCisjCisjIFNvbWUgY29uc3RhbnRzLi4uCisjCisKK0RFRkFVTFRfVENQX0xPR0dJTkdfUE9SVCAgICA9IDkwMjAKK0RFRkFVTFRfVURQX0xPR0dJTkdfUE9SVCAgICA9IDkwMjEKK0RFRkFVTFRfSFRUUF9MT0dHSU5HX1BPUlQgICA9IDkwMjIKK0RFRkFVTFRfU09BUF9MT0dHSU5HX1BPUlQgICA9IDkwMjMKK1NZU0xPR19VRFBfUE9SVCAgICAgICAgICAgICA9IDUxNAorU1lTTE9HX1RDUF9QT1JUICAgICAgICAgICAgID0gNTE0CisKK19NSUROSUdIVCA9IDI0ICogNjAgKiA2MCAgIyBudW1iZXIgb2Ygc2Vjb25kcyBpbiBhIGRheQorCitjbGFzcyBCYXNlUm90YXRpbmdIYW5kbGVyKGxvZ2dpbmcuRmlsZUhhbmRsZXIpOgorICAgICIiIgorICAgIEJhc2UgY2xhc3MgZm9yIGhhbmRsZXJzIHRoYXQgcm90YXRlIGxvZyBmaWxlcyBhdCBhIGNlcnRhaW4gcG9pbnQuCisgICAgTm90IG1lYW50IHRvIGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseS4gIEluc3RlYWQsIHVzZSBSb3RhdGluZ0ZpbGVIYW5kbGVyCisgICAgb3IgVGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbW9kZSwgZW5jb2Rpbmc9Tm9uZSwgZGVsYXk9MCk6CisgICAgICAgICIiIgorICAgICAgICBVc2UgdGhlIHNwZWNpZmllZCBmaWxlbmFtZSBmb3Igc3RyZWFtZWQgbG9nZ2luZworICAgICAgICAiIiIKKyAgICAgICAgaWYgY29kZWNzIGlzIE5vbmU6CisgICAgICAgICAgICBlbmNvZGluZyA9IE5vbmUKKyAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbW9kZSwgZW5jb2RpbmcsIGRlbGF5KQorICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCisgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgT3V0cHV0IHRoZSByZWNvcmQgdG8gdGhlIGZpbGUsIGNhdGVyaW5nIGZvciByb2xsb3ZlciBhcyBkZXNjcmliZWQKKyAgICAgICAgaW4gZG9Sb2xsb3ZlcigpLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5zaG91bGRSb2xsb3ZlcihyZWNvcmQpOgorICAgICAgICAgICAgICAgIHNlbGYuZG9Sb2xsb3ZlcigpCisgICAgICAgICAgICBsb2dnaW5nLkZpbGVIYW5kbGVyLmVtaXQoc2VsZiwgcmVjb3JkKQorICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IocmVjb3JkKQorCitjbGFzcyBSb3RhdGluZ0ZpbGVIYW5kbGVyKEJhc2VSb3RhdGluZ0hhbmRsZXIpOgorICAgICIiIgorICAgIEhhbmRsZXIgZm9yIGxvZ2dpbmcgdG8gYSBzZXQgb2YgZmlsZXMsIHdoaWNoIHN3aXRjaGVzIGZyb20gb25lIGZpbGUKKyAgICB0byB0aGUgbmV4dCB3aGVuIHRoZSBjdXJyZW50IGZpbGUgcmVhY2hlcyBhIGNlcnRhaW4gc2l6ZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1vZGU9J2EnLCBtYXhCeXRlcz0wLCBiYWNrdXBDb3VudD0wLCBlbmNvZGluZz1Ob25lLCBkZWxheT0wKToKKyAgICAgICAgIiIiCisgICAgICAgIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGFuZCB1c2UgaXQgYXMgdGhlIHN0cmVhbSBmb3IgbG9nZ2luZy4KKworICAgICAgICBCeSBkZWZhdWx0LCB0aGUgZmlsZSBncm93cyBpbmRlZmluaXRlbHkuIFlvdSBjYW4gc3BlY2lmeSBwYXJ0aWN1bGFyCisgICAgICAgIHZhbHVlcyBvZiBtYXhCeXRlcyBhbmQgYmFja3VwQ291bnQgdG8gYWxsb3cgdGhlIGZpbGUgdG8gcm9sbG92ZXIgYXQKKyAgICAgICAgYSBwcmVkZXRlcm1pbmVkIHNpemUuCisKKyAgICAgICAgUm9sbG92ZXIgb2NjdXJzIHdoZW5ldmVyIHRoZSBjdXJyZW50IGxvZyBmaWxlIGlzIG5lYXJseSBtYXhCeXRlcyBpbgorICAgICAgICBsZW5ndGguIElmIGJhY2t1cENvdW50IGlzID49IDEsIHRoZSBzeXN0ZW0gd2lsbCBzdWNjZXNzaXZlbHkgY3JlYXRlCisgICAgICAgIG5ldyBmaWxlcyB3aXRoIHRoZSBzYW1lIHBhdGhuYW1lIGFzIHRoZSBiYXNlIGZpbGUsIGJ1dCB3aXRoIGV4dGVuc2lvbnMKKyAgICAgICAgIi4xIiwgIi4yIiBldGMuIGFwcGVuZGVkIHRvIGl0LiBGb3IgZXhhbXBsZSwgd2l0aCBhIGJhY2t1cENvdW50IG9mIDUKKyAgICAgICAgYW5kIGEgYmFzZSBmaWxlIG5hbWUgb2YgImFwcC5sb2ciLCB5b3Ugd291bGQgZ2V0ICJhcHAubG9nIiwKKyAgICAgICAgImFwcC5sb2cuMSIsICJhcHAubG9nLjIiLCAuLi4gdGhyb3VnaCB0byAiYXBwLmxvZy41Ii4gVGhlIGZpbGUgYmVpbmcKKyAgICAgICAgd3JpdHRlbiB0byBpcyBhbHdheXMgImFwcC5sb2ciIC0gd2hlbiBpdCBnZXRzIGZpbGxlZCB1cCwgaXQgaXMgY2xvc2VkCisgICAgICAgIGFuZCByZW5hbWVkIHRvICJhcHAubG9nLjEiLCBhbmQgaWYgZmlsZXMgImFwcC5sb2cuMSIsICJhcHAubG9nLjIiIGV0Yy4KKyAgICAgICAgZXhpc3QsIHRoZW4gdGhleSBhcmUgcmVuYW1lZCB0byAiYXBwLmxvZy4yIiwgImFwcC5sb2cuMyIgZXRjLgorICAgICAgICByZXNwZWN0aXZlbHkuCisKKyAgICAgICAgSWYgbWF4Qnl0ZXMgaXMgemVybywgcm9sbG92ZXIgbmV2ZXIgb2NjdXJzLgorICAgICAgICAiIiIKKyAgICAgICAgIyBJZiByb3RhdGlvbi9yb2xsb3ZlciBpcyB3YW50ZWQsIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byB1c2UgYW5vdGhlcgorICAgICAgICAjIG1vZGUuIElmIGZvciBleGFtcGxlICd3JyB3ZXJlIHNwZWNpZmllZCwgdGhlbiBpZiB0aGVyZSB3ZXJlIG11bHRpcGxlCisgICAgICAgICMgcnVucyBvZiB0aGUgY2FsbGluZyBhcHBsaWNhdGlvbiwgdGhlIGxvZ3MgZnJvbSBwcmV2aW91cyBydW5zIHdvdWxkIGJlCisgICAgICAgICMgbG9zdCBpZiB0aGUgJ3cnIGlzIHJlc3BlY3RlZCwgYmVjYXVzZSB0aGUgbG9nIGZpbGUgd291bGQgYmUgdHJ1bmNhdGVkCisgICAgICAgICMgb24gZWFjaCBydW4uCisgICAgICAgIGlmIG1heEJ5dGVzID4gMDoKKyAgICAgICAgICAgIG1vZGUgPSAnYScKKyAgICAgICAgQmFzZVJvdGF0aW5nSGFuZGxlci5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbW9kZSwgZW5jb2RpbmcsIGRlbGF5KQorICAgICAgICBzZWxmLm1heEJ5dGVzID0gbWF4Qnl0ZXMKKyAgICAgICAgc2VsZi5iYWNrdXBDb3VudCA9IGJhY2t1cENvdW50CisKKyAgICBkZWYgZG9Sb2xsb3ZlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIERvIGEgcm9sbG92ZXIsIGFzIGRlc2NyaWJlZCBpbiBfX2luaXRfXygpLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5zdHJlYW06CisgICAgICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5iYWNrdXBDb3VudCA+IDA6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLmJhY2t1cENvdW50IC0gMSwgMCwgLTEpOgorICAgICAgICAgICAgICAgIHNmbiA9ICIlcy4lZCIgJSAoc2VsZi5iYXNlRmlsZW5hbWUsIGkpCisgICAgICAgICAgICAgICAgZGZuID0gIiVzLiVkIiAlIChzZWxmLmJhc2VGaWxlbmFtZSwgaSArIDEpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2ZuKToKKyAgICAgICAgICAgICAgICAgICAgI3ByaW50ICIlcyAtPiAlcyIgJSAoc2ZuLCBkZm4pCisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbik6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZGZuKQorICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUoc2ZuLCBkZm4pCisgICAgICAgICAgICBkZm4gPSBzZWxmLmJhc2VGaWxlbmFtZSArICIuMSIKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbik6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRmbikKKyAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQorICAgICAgICAgICAgI3ByaW50ICIlcyAtPiAlcyIgJSAoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzZWxmLl9vcGVuKCkKKworICAgIGRlZiBzaG91bGRSb2xsb3ZlcihzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRGV0ZXJtaW5lIGlmIHJvbGxvdmVyIHNob3VsZCBvY2N1ci4KKworICAgICAgICBCYXNpY2FsbHksIHNlZSBpZiB0aGUgc3VwcGxpZWQgcmVjb3JkIHdvdWxkIGNhdXNlIHRoZSBmaWxlIHRvIGV4Y2VlZAorICAgICAgICB0aGUgc2l6ZSBsaW1pdCB3ZSBoYXZlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5zdHJlYW0gaXMgTm9uZTogICAgICAgICAgICAgICAgICMgZGVsYXkgd2FzIHNldC4uLgorICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBzZWxmLl9vcGVuKCkKKyAgICAgICAgaWYgc2VsZi5tYXhCeXRlcyA+IDA6ICAgICAgICAgICAgICAgICAgICMgYXJlIHdlIHJvbGxpbmcgb3Zlcj8KKyAgICAgICAgICAgIG1zZyA9ICIlc1xuIiAlIHNlbGYuZm9ybWF0KHJlY29yZCkKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLnNlZWsoMCwgMikgICNkdWUgdG8gbm9uLXBvc2l4LWNvbXBsaWFudCBXaW5kb3dzIGZlYXR1cmUKKyAgICAgICAgICAgIGlmIHNlbGYuc3RyZWFtLnRlbGwoKSArIGxlbihtc2cpID49IHNlbGYubWF4Qnl0ZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuIDAKKworY2xhc3MgVGltZWRSb3RhdGluZ0ZpbGVIYW5kbGVyKEJhc2VSb3RhdGluZ0hhbmRsZXIpOgorICAgICIiIgorICAgIEhhbmRsZXIgZm9yIGxvZ2dpbmcgdG8gYSBmaWxlLCByb3RhdGluZyB0aGUgbG9nIGZpbGUgYXQgY2VydGFpbiB0aW1lZAorICAgIGludGVydmFscy4KKworICAgIElmIGJhY2t1cENvdW50IGlzID4gMCwgd2hlbiByb2xsb3ZlciBpcyBkb25lLCBubyBtb3JlIHRoYW4gYmFja3VwQ291bnQKKyAgICBmaWxlcyBhcmUga2VwdCAtIHRoZSBvbGRlc3Qgb25lcyBhcmUgZGVsZXRlZC4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIHdoZW49J2gnLCBpbnRlcnZhbD0xLCBiYWNrdXBDb3VudD0wLCBlbmNvZGluZz1Ob25lLCBkZWxheT1GYWxzZSwgdXRjPUZhbHNlKToKKyAgICAgICAgQmFzZVJvdGF0aW5nSGFuZGxlci5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgJ2EnLCBlbmNvZGluZywgZGVsYXkpCisgICAgICAgIHNlbGYud2hlbiA9IHdoZW4udXBwZXIoKQorICAgICAgICBzZWxmLmJhY2t1cENvdW50ID0gYmFja3VwQ291bnQKKyAgICAgICAgc2VsZi51dGMgPSB1dGMKKyAgICAgICAgIyBDYWxjdWxhdGUgdGhlIHJlYWwgcm9sbG92ZXIgaW50ZXJ2YWwsIHdoaWNoIGlzIGp1c3QgdGhlIG51bWJlciBvZgorICAgICAgICAjIHNlY29uZHMgYmV0d2VlbiByb2xsb3ZlcnMuICBBbHNvIHNldCB0aGUgZmlsZW5hbWUgc3VmZml4IHVzZWQgd2hlbgorICAgICAgICAjIGEgcm9sbG92ZXIgb2NjdXJzLiAgQ3VycmVudCAnd2hlbicgZXZlbnRzIHN1cHBvcnRlZDoKKyAgICAgICAgIyBTIC0gU2Vjb25kcworICAgICAgICAjIE0gLSBNaW51dGVzCisgICAgICAgICMgSCAtIEhvdXJzCisgICAgICAgICMgRCAtIERheXMKKyAgICAgICAgIyBtaWRuaWdodCAtIHJvbGwgb3ZlciBhdCBtaWRuaWdodAorICAgICAgICAjIFd7MC02fSAtIHJvbGwgb3ZlciBvbiBhIGNlcnRhaW4gZGF5OyAwIC0gTW9uZGF5CisgICAgICAgICMKKyAgICAgICAgIyBDYXNlIG9mIHRoZSAnd2hlbicgc3BlY2lmaWVyIGlzIG5vdCBpbXBvcnRhbnQ7IGxvd2VyIG9yIHVwcGVyIGNhc2UKKyAgICAgICAgIyB3aWxsIHdvcmsuCisgICAgICAgIGlmIHNlbGYud2hlbiA9PSAnUyc6CisgICAgICAgICAgICBzZWxmLmludGVydmFsID0gMSAjIG9uZSBzZWNvbmQKKyAgICAgICAgICAgIHNlbGYuc3VmZml4ID0gIiVZLSVtLSVkXyVILSVNLSVTIgorICAgICAgICAgICAgc2VsZi5leHRNYXRjaCA9IHIiXlxkezR9LVxkezJ9LVxkezJ9X1xkezJ9LVxkezJ9LVxkezJ9JCIKKyAgICAgICAgZWxpZiBzZWxmLndoZW4gPT0gJ00nOgorICAgICAgICAgICAgc2VsZi5pbnRlcnZhbCA9IDYwICMgb25lIG1pbnV0ZQorICAgICAgICAgICAgc2VsZi5zdWZmaXggPSAiJVktJW0tJWRfJUgtJU0iCisgICAgICAgICAgICBzZWxmLmV4dE1hdGNoID0gciJeXGR7NH0tXGR7Mn0tXGR7Mn1fXGR7Mn0tXGR7Mn0kIgorICAgICAgICBlbGlmIHNlbGYud2hlbiA9PSAnSCc6CisgICAgICAgICAgICBzZWxmLmludGVydmFsID0gNjAgKiA2MCAjIG9uZSBob3VyCisgICAgICAgICAgICBzZWxmLnN1ZmZpeCA9ICIlWS0lbS0lZF8lSCIKKyAgICAgICAgICAgIHNlbGYuZXh0TWF0Y2ggPSByIl5cZHs0fS1cZHsyfS1cZHsyfV9cZHsyfSQiCisgICAgICAgIGVsaWYgc2VsZi53aGVuID09ICdEJyBvciBzZWxmLndoZW4gPT0gJ01JRE5JR0hUJzoKKyAgICAgICAgICAgIHNlbGYuaW50ZXJ2YWwgPSA2MCAqIDYwICogMjQgIyBvbmUgZGF5CisgICAgICAgICAgICBzZWxmLnN1ZmZpeCA9ICIlWS0lbS0lZCIKKyAgICAgICAgICAgIHNlbGYuZXh0TWF0Y2ggPSByIl5cZHs0fS1cZHsyfS1cZHsyfSQiCisgICAgICAgIGVsaWYgc2VsZi53aGVuLnN0YXJ0c3dpdGgoJ1cnKToKKyAgICAgICAgICAgIHNlbGYuaW50ZXJ2YWwgPSA2MCAqIDYwICogMjQgKiA3ICMgb25lIHdlZWsKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLndoZW4pICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiWW91IG11c3Qgc3BlY2lmeSBhIGRheSBmb3Igd2Vla2x5IHJvbGxvdmVyIGZyb20gMCB0byA2ICgwIGlzIE1vbmRheSk6ICVzIiAlIHNlbGYud2hlbikKKyAgICAgICAgICAgIGlmIHNlbGYud2hlblsxXSA8ICcwJyBvciBzZWxmLndoZW5bMV0gPiAnNic6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBkYXkgc3BlY2lmaWVkIGZvciB3ZWVrbHkgcm9sbG92ZXI6ICVzIiAlIHNlbGYud2hlbikKKyAgICAgICAgICAgIHNlbGYuZGF5T2ZXZWVrID0gaW50KHNlbGYud2hlblsxXSkKKyAgICAgICAgICAgIHNlbGYuc3VmZml4ID0gIiVZLSVtLSVkIgorICAgICAgICAgICAgc2VsZi5leHRNYXRjaCA9IHIiXlxkezR9LVxkezJ9LVxkezJ9JCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgcm9sbG92ZXIgaW50ZXJ2YWwgc3BlY2lmaWVkOiAlcyIgJSBzZWxmLndoZW4pCisKKyAgICAgICAgc2VsZi5leHRNYXRjaCA9IHJlLmNvbXBpbGUoc2VsZi5leHRNYXRjaCkKKyAgICAgICAgc2VsZi5pbnRlcnZhbCA9IHNlbGYuaW50ZXJ2YWwgKiBpbnRlcnZhbCAjIG11bHRpcGx5IGJ5IHVuaXRzIHJlcXVlc3RlZAorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgICAgICB0ID0gb3Muc3RhdChmaWxlbmFtZSlbU1RfTVRJTUVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICBzZWxmLnJvbGxvdmVyQXQgPSBzZWxmLmNvbXB1dGVSb2xsb3Zlcih0KQorCisgICAgZGVmIGNvbXB1dGVSb2xsb3ZlcihzZWxmLCBjdXJyZW50VGltZSk6CisgICAgICAgICIiIgorICAgICAgICBXb3JrIG91dCB0aGUgcm9sbG92ZXIgdGltZSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHRpbWUuCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBjdXJyZW50VGltZSArIHNlbGYuaW50ZXJ2YWwKKyAgICAgICAgIyBJZiB3ZSBhcmUgcm9sbGluZyBvdmVyIGF0IG1pZG5pZ2h0IG9yIHdlZWtseSwgdGhlbiB0aGUgaW50ZXJ2YWwgaXMgYWxyZWFkeSBrbm93bi4KKyAgICAgICAgIyBXaGF0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpcyBXSEVOIHRoZSBuZXh0IGludGVydmFsIGlzLiAgSW4gb3RoZXIgd29yZHMsCisgICAgICAgICMgaWYgeW91IGFyZSByb2xsaW5nIG92ZXIgYXQgbWlkbmlnaHQsIHRoZW4geW91ciBiYXNlIGludGVydmFsIGlzIDEgZGF5LAorICAgICAgICAjIGJ1dCB5b3Ugd2FudCB0byBzdGFydCB0aGF0IG9uZSBkYXkgY2xvY2sgYXQgbWlkbmlnaHQsIG5vdCBub3cuICBTbywgd2UKKyAgICAgICAgIyBoYXZlIHRvIGZ1ZGdlIHRoZSByb2xsb3ZlckF0IHZhbHVlIGluIG9yZGVyIHRvIHRyaWdnZXIgdGhlIGZpcnN0IHJvbGxvdmVyCisgICAgICAgICMgYXQgdGhlIHJpZ2h0IHRpbWUuICBBZnRlciB0aGF0LCB0aGUgcmVndWxhciBpbnRlcnZhbCB3aWxsIHRha2UgY2FyZSBvZgorICAgICAgICAjIHRoZSByZXN0LiAgTm90ZSB0aGF0IHRoaXMgY29kZSBkb2Vzbid0IGNhcmUgYWJvdXQgbGVhcCBzZWNvbmRzLiA6KQorICAgICAgICBpZiBzZWxmLndoZW4gPT0gJ01JRE5JR0hUJyBvciBzZWxmLndoZW4uc3RhcnRzd2l0aCgnVycpOgorICAgICAgICAgICAgIyBUaGlzIGNvdWxkIGJlIGRvbmUgd2l0aCBsZXNzIGNvZGUsIGJ1dCBJIHdhbnRlZCBpdCB0byBiZSBjbGVhcgorICAgICAgICAgICAgaWYgc2VsZi51dGM6CisgICAgICAgICAgICAgICAgdCA9IHRpbWUuZ210aW1lKGN1cnJlbnRUaW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ID0gdGltZS5sb2NhbHRpbWUoY3VycmVudFRpbWUpCisgICAgICAgICAgICBjdXJyZW50SG91ciA9IHRbM10KKyAgICAgICAgICAgIGN1cnJlbnRNaW51dGUgPSB0WzRdCisgICAgICAgICAgICBjdXJyZW50U2Vjb25kID0gdFs1XQorICAgICAgICAgICAgIyByIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBsZWZ0IGJldHdlZW4gbm93IGFuZCBtaWRuaWdodAorICAgICAgICAgICAgciA9IF9NSUROSUdIVCAtICgoY3VycmVudEhvdXIgKiA2MCArIGN1cnJlbnRNaW51dGUpICogNjAgKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50U2Vjb25kKQorICAgICAgICAgICAgcmVzdWx0ID0gY3VycmVudFRpbWUgKyByCisgICAgICAgICAgICAjIElmIHdlIGFyZSByb2xsaW5nIG92ZXIgb24gYSBjZXJ0YWluIGRheSwgYWRkIGluIHRoZSBudW1iZXIgb2YgZGF5cyB1bnRpbAorICAgICAgICAgICAgIyB0aGUgbmV4dCByb2xsb3ZlciwgYnV0IG9mZnNldCBieSAxIHNpbmNlIHdlIGp1c3QgY2FsY3VsYXRlZCB0aGUgdGltZQorICAgICAgICAgICAgIyB1bnRpbCB0aGUgbmV4dCBkYXkgc3RhcnRzLiAgVGhlcmUgYXJlIHRocmVlIGNhc2VzOgorICAgICAgICAgICAgIyBDYXNlIDEpIFRoZSBkYXkgdG8gcm9sbG92ZXIgaXMgdG9kYXk7IGluIHRoaXMgY2FzZSwgZG8gbm90aGluZworICAgICAgICAgICAgIyBDYXNlIDIpIFRoZSBkYXkgdG8gcm9sbG92ZXIgaXMgZnVydGhlciBpbiB0aGUgaW50ZXJ2YWwgKGkuZS4sIHRvZGF5IGlzCisgICAgICAgICAgICAjICAgICAgICAgZGF5IDIgKFdlZG5lc2RheSkgYW5kIHJvbGxvdmVyIGlzIG9uIGRheSA2IChTdW5kYXkpLiAgRGF5cyB0bworICAgICAgICAgICAgIyAgICAgICAgIG5leHQgcm9sbG92ZXIgaXMgc2ltcGx5IDYgLSAyIC0gMSwgb3IgMy4KKyAgICAgICAgICAgICMgQ2FzZSAzKSBUaGUgZGF5IHRvIHJvbGxvdmVyIGlzIGJlaGluZCB1cyBpbiB0aGUgaW50ZXJ2YWwgKGkuZS4sIHRvZGF5CisgICAgICAgICAgICAjICAgICAgICAgaXMgZGF5IDUgKFNhdHVyZGF5KSBhbmQgcm9sbG92ZXIgaXMgb24gZGF5IDMgKFRodXJzZGF5KS4KKyAgICAgICAgICAgICMgICAgICAgICBEYXlzIHRvIHJvbGxvdmVyIGlzIDYgLSA1ICsgMywgb3IgNC4gIEluIHRoaXMgY2FzZSwgaXQncyB0aGUKKyAgICAgICAgICAgICMgICAgICAgICBudW1iZXIgb2YgZGF5cyBsZWZ0IGluIHRoZSBjdXJyZW50IHdlZWsgKDEpIHBsdXMgdGhlIG51bWJlcgorICAgICAgICAgICAgIyAgICAgICAgIG9mIGRheXMgaW4gdGhlIG5leHQgd2VlayB1bnRpbCB0aGUgcm9sbG92ZXIgZGF5ICgzKS4KKyAgICAgICAgICAgICMgVGhlIGNhbGN1bGF0aW9ucyBkZXNjcmliZWQgaW4gMikgYW5kIDMpIGFib3ZlIG5lZWQgdG8gaGF2ZSBhIGRheSBhZGRlZC4KKyAgICAgICAgICAgICMgVGhpcyBpcyBiZWNhdXNlIHRoZSBhYm92ZSB0aW1lIGNhbGN1bGF0aW9uIHRha2VzIHVzIHRvIG1pZG5pZ2h0IG9uIHRoaXMKKyAgICAgICAgICAgICMgZGF5LCBpLmUuIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBkYXkuCisgICAgICAgICAgICBpZiBzZWxmLndoZW4uc3RhcnRzd2l0aCgnVycpOgorICAgICAgICAgICAgICAgIGRheSA9IHRbNl0gIyAwIGlzIE1vbmRheQorICAgICAgICAgICAgICAgIGlmIGRheSAhPSBzZWxmLmRheU9mV2VlazoKKyAgICAgICAgICAgICAgICAgICAgaWYgZGF5IDwgc2VsZi5kYXlPZldlZWs6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXlzVG9XYWl0ID0gc2VsZi5kYXlPZldlZWsgLSBkYXkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRheXNUb1dhaXQgPSA2IC0gZGF5ICsgc2VsZi5kYXlPZldlZWsgKyAxCisgICAgICAgICAgICAgICAgICAgIG5ld1JvbGxvdmVyQXQgPSByZXN1bHQgKyAoZGF5c1RvV2FpdCAqICg2MCAqIDYwICogMjQpKQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi51dGM6CisgICAgICAgICAgICAgICAgICAgICAgICBkc3ROb3cgPSB0Wy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0QXRSb2xsb3ZlciA9IHRpbWUubG9jYWx0aW1lKG5ld1JvbGxvdmVyQXQpWy0xXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZHN0Tm93ICE9IGRzdEF0Um9sbG92ZXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRzdE5vdzogICMgRFNUIGtpY2tzIGluIGJlZm9yZSBuZXh0IHJvbGxvdmVyLCBzbyB3ZSBuZWVkIHRvIGRlZHVjdCBhbiBob3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IC0zNjAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZTogICAgICAgICAgICMgRFNUIGJvd3Mgb3V0IGJlZm9yZSBuZXh0IHJvbGxvdmVyLCBzbyB3ZSBuZWVkIHRvIGFkZCBhbiBob3VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IDM2MDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb2xsb3ZlckF0ICs9IGFkZGVuZAorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXdSb2xsb3ZlckF0CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBzaG91bGRSb2xsb3ZlcihzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRGV0ZXJtaW5lIGlmIHJvbGxvdmVyIHNob3VsZCBvY2N1ci4KKworICAgICAgICByZWNvcmQgaXMgbm90IHVzZWQsIGFzIHdlIGFyZSBqdXN0IGNvbXBhcmluZyB0aW1lcywgYnV0IGl0IGlzIG5lZWRlZCBzbworICAgICAgICB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgYXJlIHRoZSBzYW1lCisgICAgICAgICIiIgorICAgICAgICB0ID0gaW50KHRpbWUudGltZSgpKQorICAgICAgICBpZiB0ID49IHNlbGYucm9sbG92ZXJBdDoKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICNwcmludCAiTm8gbmVlZCB0byByb2xsb3ZlcjogJWQsICVkIiAlICh0LCBzZWxmLnJvbGxvdmVyQXQpCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgZ2V0RmlsZXNUb0RlbGV0ZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIERldGVybWluZSB0aGUgZmlsZXMgdG8gZGVsZXRlIHdoZW4gcm9sbGluZyBvdmVyLgorCisgICAgICAgIE1vcmUgc3BlY2lmaWMgdGhhbiB0aGUgZWFybGllciBtZXRob2QsIHdoaWNoIGp1c3QgdXNlZCBnbG9iLmdsb2IoKS4KKyAgICAgICAgIiIiCisgICAgICAgIGRpck5hbWUsIGJhc2VOYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLmJhc2VGaWxlbmFtZSkKKyAgICAgICAgZmlsZU5hbWVzID0gb3MubGlzdGRpcihkaXJOYW1lKQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBwcmVmaXggPSBiYXNlTmFtZSArICIuIgorICAgICAgICBwbGVuID0gbGVuKHByZWZpeCkKKyAgICAgICAgZm9yIGZpbGVOYW1lIGluIGZpbGVOYW1lczoKKyAgICAgICAgICAgIGlmIGZpbGVOYW1lWzpwbGVuXSA9PSBwcmVmaXg6CisgICAgICAgICAgICAgICAgc3VmZml4ID0gZmlsZU5hbWVbcGxlbjpdCisgICAgICAgICAgICAgICAgaWYgc2VsZi5leHRNYXRjaC5tYXRjaChzdWZmaXgpOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG9zLnBhdGguam9pbihkaXJOYW1lLCBmaWxlTmFtZSkpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgaWYgbGVuKHJlc3VsdCkgPCBzZWxmLmJhY2t1cENvdW50OgorICAgICAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdFs6bGVuKHJlc3VsdCkgLSBzZWxmLmJhY2t1cENvdW50XQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZG9Sb2xsb3ZlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGRvIGEgcm9sbG92ZXI7IGluIHRoaXMgY2FzZSwgYSBkYXRlL3RpbWUgc3RhbXAgaXMgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lCisgICAgICAgIHdoZW4gdGhlIHJvbGxvdmVyIGhhcHBlbnMuICBIb3dldmVyLCB5b3Ugd2FudCB0aGUgZmlsZSB0byBiZSBuYW1lZCBmb3IgdGhlCisgICAgICAgIHN0YXJ0IG9mIHRoZSBpbnRlcnZhbCwgbm90IHRoZSBjdXJyZW50IHRpbWUuICBJZiB0aGVyZSBpcyBhIGJhY2t1cCBjb3VudCwKKyAgICAgICAgdGhlbiB3ZSBoYXZlIHRvIGdldCBhIGxpc3Qgb2YgbWF0Y2hpbmcgZmlsZW5hbWVzLCBzb3J0IHRoZW0gYW5kIHJlbW92ZQorICAgICAgICB0aGUgb25lIHdpdGggdGhlIG9sZGVzdCBzdWZmaXguCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnN0cmVhbToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gTm9uZQorICAgICAgICAjIGdldCB0aGUgdGltZSB0aGF0IHRoaXMgc2VxdWVuY2Ugc3RhcnRlZCBhdCBhbmQgbWFrZSBpdCBhIFRpbWVUdXBsZQorICAgICAgICBjdXJyZW50VGltZSA9IGludCh0aW1lLnRpbWUoKSkKKyAgICAgICAgZHN0Tm93ID0gdGltZS5sb2NhbHRpbWUoY3VycmVudFRpbWUpWy0xXQorICAgICAgICB0ID0gc2VsZi5yb2xsb3ZlckF0IC0gc2VsZi5pbnRlcnZhbAorICAgICAgICBpZiBzZWxmLnV0YzoKKyAgICAgICAgICAgIHRpbWVUdXBsZSA9IHRpbWUuZ210aW1lKHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aW1lVHVwbGUgPSB0aW1lLmxvY2FsdGltZSh0KQorICAgICAgICAgICAgZHN0VGhlbiA9IHRpbWVUdXBsZVstMV0KKyAgICAgICAgICAgIGlmIGRzdE5vdyAhPSBkc3RUaGVuOgorICAgICAgICAgICAgICAgIGlmIGRzdE5vdzoKKyAgICAgICAgICAgICAgICAgICAgYWRkZW5kID0gMzYwMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFkZGVuZCA9IC0zNjAwCisgICAgICAgICAgICAgICAgdGltZVR1cGxlID0gdGltZS5sb2NhbHRpbWUodCArIGFkZGVuZCkKKyAgICAgICAgZGZuID0gc2VsZi5iYXNlRmlsZW5hbWUgKyAiLiIgKyB0aW1lLnN0cmZ0aW1lKHNlbGYuc3VmZml4LCB0aW1lVHVwbGUpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRmbik6CisgICAgICAgICAgICBvcy5yZW1vdmUoZGZuKQorICAgICAgICBvcy5yZW5hbWUoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKKyAgICAgICAgaWYgc2VsZi5iYWNrdXBDb3VudCA+IDA6CisgICAgICAgICAgICAjIGZpbmQgdGhlIG9sZGVzdCBsb2cgZmlsZSBhbmQgZGVsZXRlIGl0CisgICAgICAgICAgICAjcyA9IGdsb2IuZ2xvYihzZWxmLmJhc2VGaWxlbmFtZSArICIuMjAqIikKKyAgICAgICAgICAgICNpZiBsZW4ocykgPiBzZWxmLmJhY2t1cENvdW50OgorICAgICAgICAgICAgIyAgICBzLnNvcnQoKQorICAgICAgICAgICAgIyAgICBvcy5yZW1vdmUoc1swXSkKKyAgICAgICAgICAgIGZvciBzIGluIHNlbGYuZ2V0RmlsZXNUb0RlbGV0ZSgpOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShzKQorICAgICAgICAjcHJpbnQgIiVzIC0+ICVzIiAlIChzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQorICAgICAgICBzZWxmLnN0cmVhbSA9IHNlbGYuX29wZW4oKQorICAgICAgICBuZXdSb2xsb3ZlckF0ID0gc2VsZi5jb21wdXRlUm9sbG92ZXIoY3VycmVudFRpbWUpCisgICAgICAgIHdoaWxlIG5ld1JvbGxvdmVyQXQgPD0gY3VycmVudFRpbWU6CisgICAgICAgICAgICBuZXdSb2xsb3ZlckF0ID0gbmV3Um9sbG92ZXJBdCArIHNlbGYuaW50ZXJ2YWwKKyAgICAgICAgI0lmIERTVCBjaGFuZ2VzIGFuZCBtaWRuaWdodCBvciB3ZWVrbHkgcm9sbG92ZXIsIGFkanVzdCBmb3IgdGhpcy4KKyAgICAgICAgaWYgKHNlbGYud2hlbiA9PSAnTUlETklHSFQnIG9yIHNlbGYud2hlbi5zdGFydHN3aXRoKCdXJykpIGFuZCBub3Qgc2VsZi51dGM6CisgICAgICAgICAgICBkc3RBdFJvbGxvdmVyID0gdGltZS5sb2NhbHRpbWUobmV3Um9sbG92ZXJBdClbLTFdCisgICAgICAgICAgICBpZiBkc3ROb3cgIT0gZHN0QXRSb2xsb3ZlcjoKKyAgICAgICAgICAgICAgICBpZiBub3QgZHN0Tm93OiAgIyBEU1Qga2lja3MgaW4gYmVmb3JlIG5leHQgcm9sbG92ZXIsIHNvIHdlIG5lZWQgdG8gZGVkdWN0IGFuIGhvdXIKKyAgICAgICAgICAgICAgICAgICAgYWRkZW5kID0gLTM2MDAKKyAgICAgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgIyBEU1QgYm93cyBvdXQgYmVmb3JlIG5leHQgcm9sbG92ZXIsIHNvIHdlIG5lZWQgdG8gYWRkIGFuIGhvdXIKKyAgICAgICAgICAgICAgICAgICAgYWRkZW5kID0gMzYwMAorICAgICAgICAgICAgICAgIG5ld1JvbGxvdmVyQXQgKz0gYWRkZW5kCisgICAgICAgIHNlbGYucm9sbG92ZXJBdCA9IG5ld1JvbGxvdmVyQXQKKworY2xhc3MgV2F0Y2hlZEZpbGVIYW5kbGVyKGxvZ2dpbmcuRmlsZUhhbmRsZXIpOgorICAgICIiIgorICAgIEEgaGFuZGxlciBmb3IgbG9nZ2luZyB0byBhIGZpbGUsIHdoaWNoIHdhdGNoZXMgdGhlIGZpbGUKKyAgICB0byBzZWUgaWYgaXQgaGFzIGNoYW5nZWQgd2hpbGUgaW4gdXNlLiBUaGlzIGNhbiBoYXBwZW4gYmVjYXVzZSBvZgorICAgIHVzYWdlIG9mIHByb2dyYW1zIHN1Y2ggYXMgbmV3c3lzbG9nIGFuZCBsb2dyb3RhdGUgd2hpY2ggcGVyZm9ybQorICAgIGxvZyBmaWxlIHJvdGF0aW9uLiBUaGlzIGhhbmRsZXIsIGludGVuZGVkIGZvciB1c2UgdW5kZXIgVW5peCwKKyAgICB3YXRjaGVzIHRoZSBmaWxlIHRvIHNlZSBpZiBpdCBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBlbWl0LgorICAgIChBIGZpbGUgaGFzIGNoYW5nZWQgaWYgaXRzIGRldmljZSBvciBpbm9kZSBoYXZlIGNoYW5nZWQuKQorICAgIElmIGl0IGhhcyBjaGFuZ2VkLCB0aGUgb2xkIGZpbGUgc3RyZWFtIGlzIGNsb3NlZCwgYW5kIHRoZSBmaWxlCisgICAgb3BlbmVkIHRvIGdldCBhIG5ldyBzdHJlYW0uCisKKyAgICBUaGlzIGhhbmRsZXIgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB1c2UgdW5kZXIgV2luZG93cywgYmVjYXVzZQorICAgIHVuZGVyIFdpbmRvd3Mgb3BlbiBmaWxlcyBjYW5ub3QgYmUgbW92ZWQgb3IgcmVuYW1lZCAtIGxvZ2dpbmcKKyAgICBvcGVucyB0aGUgZmlsZXMgd2l0aCBleGNsdXNpdmUgbG9ja3MgLSBhbmQgc28gdGhlcmUgaXMgbm8gbmVlZAorICAgIGZvciBzdWNoIGEgaGFuZGxlci4gRnVydGhlcm1vcmUsIFNUX0lOTyBpcyBub3Qgc3VwcG9ydGVkIHVuZGVyCisgICAgV2luZG93czsgc3RhdCBhbHdheXMgcmV0dXJucyB6ZXJvIGZvciB0aGlzIHZhbHVlLgorCisgICAgVGhpcyBoYW5kbGVyIGlzIGJhc2VkIG9uIGEgc3VnZ2VzdGlvbiBhbmQgcGF0Y2ggYnkgQ2hhZCBKLgorICAgIFNjaHJvZWRlci4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIG1vZGU9J2EnLCBlbmNvZGluZz1Ob25lLCBkZWxheT0wKToKKyAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5fX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbW9kZSwgZW5jb2RpbmcsIGRlbGF5KQorICAgICAgICBzZWxmLmRldiwgc2VsZi5pbm8gPSAtMSwgLTEKKyAgICAgICAgc2VsZi5fc3RhdHN0cmVhbSgpCisKKyAgICBkZWYgX3N0YXRzdHJlYW0oc2VsZik6CisgICAgICAgIGlmIHNlbGYuc3RyZWFtOgorICAgICAgICAgICAgc3JlcyA9IG9zLmZzdGF0KHNlbGYuc3RyZWFtLmZpbGVubygpKQorICAgICAgICAgICAgc2VsZi5kZXYsIHNlbGYuaW5vID0gc3Jlc1tTVF9ERVZdLCBzcmVzW1NUX0lOT10KKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIEZpcnN0IGNoZWNrIGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUgaGFzIGNoYW5nZWQsIGFuZCBpZiBpdAorICAgICAgICBoYXMsIGNsb3NlIHRoZSBvbGQgc3RyZWFtIGFuZCByZW9wZW4gdGhlIGZpbGUgdG8gZ2V0IHRoZQorICAgICAgICBjdXJyZW50IHN0cmVhbS4KKyAgICAgICAgIiIiCisgICAgICAgICMgUmVkdWNlIHRoZSBjaGFuY2Ugb2YgcmFjZSBjb25kaXRpb25zIGJ5IHN0YXQnaW5nIGJ5IHBhdGggb25seQorICAgICAgICAjIG9uY2UgYW5kIHRoZW4gZnN0YXQnaW5nIG91ciBuZXcgZmQgaWYgd2Ugb3BlbmVkIGEgbmV3IGxvZyBzdHJlYW0uCisgICAgICAgICMgU2VlIGlzc3VlICMxNDYzMjogVGhhbmtzIHRvIEpvaG4gTXVsbGlnYW4gZm9yIHRoZSBwcm9ibGVtIHJlcG9ydAorICAgICAgICAjIGFuZCBwYXRjaC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBzdGF0IHRoZSBmaWxlIGJ5IHBhdGgsIGNoZWNraW5nIGZvciBleGlzdGVuY2UKKyAgICAgICAgICAgIHNyZXMgPSBvcy5zdGF0KHNlbGYuYmFzZUZpbGVuYW1lKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlcnI6CisgICAgICAgICAgICBpZiBlcnIuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHNyZXMgPSBOb25lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICMgY29tcGFyZSBmaWxlIHN5c3RlbSBzdGF0IHdpdGggdGhhdCBvZiBvdXIgc3RyZWFtIGZpbGUgaGFuZGxlCisgICAgICAgIGlmIG5vdCBzcmVzIG9yIHNyZXNbU1RfREVWXSAhPSBzZWxmLmRldiBvciBzcmVzW1NUX0lOT10gIT0gc2VsZi5pbm86CisgICAgICAgICAgICBpZiBzZWxmLnN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIHdlIGhhdmUgYW4gb3BlbiBmaWxlIGhhbmRsZSwgY2xlYW4gaXQgdXAKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0uY2xvc2UoKQorICAgICAgICAgICAgICAgICMgb3BlbiBhIG5ldyBmaWxlIGhhbmRsZSBhbmQgZ2V0IG5ldyBzdGF0IGluZm8gZnJvbSB0aGF0IGZkCisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBzZWxmLl9vcGVuKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGF0c3RyZWFtKCkKKyAgICAgICAgbG9nZ2luZy5GaWxlSGFuZGxlci5lbWl0KHNlbGYsIHJlY29yZCkKKworY2xhc3MgU29ja2V0SGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgorICAgICIiIgorICAgIEEgaGFuZGxlciBjbGFzcyB3aGljaCB3cml0ZXMgbG9nZ2luZyByZWNvcmRzLCBpbiBwaWNrbGUgZm9ybWF0LCB0bworICAgIGEgc3RyZWFtaW5nIHNvY2tldC4gVGhlIHNvY2tldCBpcyBrZXB0IG9wZW4gYWNyb3NzIGxvZ2dpbmcgY2FsbHMuCisgICAgSWYgdGhlIHBlZXIgcmVzZXRzIGl0LCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gcmVjb25uZWN0IG9uIHRoZSBuZXh0IGNhbGwuCisgICAgVGhlIHBpY2tsZSB3aGljaCBpcyBzZW50IGlzIHRoYXQgb2YgdGhlIExvZ1JlY29yZCdzIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgKF9fZGljdF9fKSwgc28gdGhhdCB0aGUgcmVjZWl2ZXIgZG9lcyBub3QgbmVlZCB0byBoYXZlIHRoZSBsb2dnaW5nIG1vZHVsZQorICAgIGluc3RhbGxlZCBpbiBvcmRlciB0byBwcm9jZXNzIHRoZSBsb2dnaW5nIGV2ZW50LgorCisgICAgVG8gdW5waWNrbGUgdGhlIHJlY29yZCBhdCB0aGUgcmVjZWl2aW5nIGVuZCBpbnRvIGEgTG9nUmVjb3JkLCB1c2UgdGhlCisgICAgbWFrZUxvZ1JlY29yZCBmdW5jdGlvbi4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0KToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemVzIHRoZSBoYW5kbGVyIHdpdGggYSBzcGVjaWZpYyBob3N0IGFkZHJlc3MgYW5kIHBvcnQuCisKKyAgICAgICAgVGhlIGF0dHJpYnV0ZSAnY2xvc2VPbkVycm9yJyBpcyBzZXQgdG8gMSAtIHdoaWNoIG1lYW5zIHRoYXQgaWYKKyAgICAgICAgYSBzb2NrZXQgZXJyb3Igb2NjdXJzLCB0aGUgc29ja2V0IGlzIHNpbGVudGx5IGNsb3NlZCBhbmQgdGhlbgorICAgICAgICByZW9wZW5lZCBvbiB0aGUgbmV4dCBsb2dnaW5nIGNhbGwuCisgICAgICAgICIiIgorICAgICAgICBsb2dnaW5nLkhhbmRsZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnBvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuc29jayA9IE5vbmUKKyAgICAgICAgc2VsZi5jbG9zZU9uRXJyb3IgPSAwCisgICAgICAgIHNlbGYucmV0cnlUaW1lID0gTm9uZQorICAgICAgICAjCisgICAgICAgICMgRXhwb25lbnRpYWwgYmFja29mZiBwYXJhbWV0ZXJzLgorICAgICAgICAjCisgICAgICAgIHNlbGYucmV0cnlTdGFydCA9IDEuMAorICAgICAgICBzZWxmLnJldHJ5TWF4ID0gMzAuMAorICAgICAgICBzZWxmLnJldHJ5RmFjdG9yID0gMi4wCisKKyAgICBkZWYgbWFrZVNvY2tldChzZWxmLCB0aW1lb3V0PTEpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBmYWN0b3J5IG1ldGhvZCB3aGljaCBhbGxvd3Mgc3ViY2xhc3NlcyB0byBkZWZpbmUgdGhlIHByZWNpc2UKKyAgICAgICAgdHlwZSBvZiBzb2NrZXQgdGhleSB3YW50LgorICAgICAgICAiIiIKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgaWYgaGFzYXR0cihzLCAnc2V0dGltZW91dCcpOgorICAgICAgICAgICAgcy5zZXR0aW1lb3V0KHRpbWVvdXQpCisgICAgICAgIHMuY29ubmVjdCgoc2VsZi5ob3N0LCBzZWxmLnBvcnQpKQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIGNyZWF0ZVNvY2tldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRyeSB0byBjcmVhdGUgYSBzb2NrZXQsIHVzaW5nIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYgd2l0aAorICAgICAgICBhIG1heCByZXRyeSB0aW1lLiBUaGFua3MgdG8gUm9iZXJ0IE9sc29uIGZvciB0aGUgb3JpZ2luYWwgcGF0Y2gKKyAgICAgICAgKFNGICM4MTU5MTEpIHdoaWNoIGhhcyBiZWVuIHNsaWdodGx5IHJlZmFjdG9yZWQuCisgICAgICAgICIiIgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICAjIEVpdGhlciByZXRyeVRpbWUgaXMgTm9uZSwgaW4gd2hpY2ggY2FzZSB0aGlzCisgICAgICAgICMgaXMgdGhlIGZpcnN0IHRpbWUgYmFjayBhZnRlciBhIGRpc2Nvbm5lY3QsIG9yCisgICAgICAgICMgd2UndmUgd2FpdGVkIGxvbmcgZW5vdWdoLgorICAgICAgICBpZiBzZWxmLnJldHJ5VGltZSBpcyBOb25lOgorICAgICAgICAgICAgYXR0ZW1wdCA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGF0dGVtcHQgPSAobm93ID49IHNlbGYucmV0cnlUaW1lKQorICAgICAgICBpZiBhdHRlbXB0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IHNlbGYubWFrZVNvY2tldCgpCisgICAgICAgICAgICAgICAgc2VsZi5yZXRyeVRpbWUgPSBOb25lICMgbmV4dCB0aW1lLCBubyBkZWxheSBiZWZvcmUgdHJ5aW5nCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgICNDcmVhdGlvbiBmYWlsZWQsIHNvIHNldCB0aGUgcmV0cnkgdGltZSBhbmQgcmV0dXJuLgorICAgICAgICAgICAgICAgIGlmIHNlbGYucmV0cnlUaW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0cnlQZXJpb2QgPSBzZWxmLnJldHJ5U3RhcnQKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHJ5UGVyaW9kID0gc2VsZi5yZXRyeVBlcmlvZCAqIHNlbGYucmV0cnlGYWN0b3IKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5yZXRyeVBlcmlvZCA+IHNlbGYucmV0cnlNYXg6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHJ5UGVyaW9kID0gc2VsZi5yZXRyeU1heAorICAgICAgICAgICAgICAgIHNlbGYucmV0cnlUaW1lID0gbm93ICsgc2VsZi5yZXRyeVBlcmlvZAorCisgICAgZGVmIHNlbmQoc2VsZiwgcyk6CisgICAgICAgICIiIgorICAgICAgICBTZW5kIGEgcGlja2xlZCBzdHJpbmcgdG8gdGhlIHNvY2tldC4KKworICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyBmb3IgcGFydGlhbCBzZW5kcyB3aGljaCBjYW4gaGFwcGVuIHdoZW4gdGhlCisgICAgICAgIG5ldHdvcmsgaXMgYnVzeS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuc29jayBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jcmVhdGVTb2NrZXQoKQorICAgICAgICAjc2VsZi5zb2NrIGNhbiBiZSBOb25lIGVpdGhlciBiZWNhdXNlIHdlIGhhdmVuJ3QgcmVhY2hlZCB0aGUgcmV0cnkKKyAgICAgICAgI3RpbWUgeWV0LCBvciBiZWNhdXNlIHdlIGhhdmUgcmVhY2hlZCB0aGUgcmV0cnkgdGltZSBhbmQgcmV0cmllZCwKKyAgICAgICAgI2J1dCBhcmUgc3RpbGwgdW5hYmxlIHRvIGNvbm5lY3QuCisgICAgICAgIGlmIHNlbGYuc29jazoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuc29jaywgInNlbmRhbGwiKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwocykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZW50c29mYXIgPSAwCisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZW4ocykKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgbGVmdCA+IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZW50ID0gc2VsZi5zb2NrLnNlbmQoc1tzZW50c29mYXI6XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRzb2ZhciA9IHNlbnRzb2ZhciArIHNlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0IC0gc2VudAorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IE5vbmUgICMgc28gd2UgY2FuIGNhbGwgY3JlYXRlU29ja2V0IG5leHQgdGltZQorCisgICAgZGVmIG1ha2VQaWNrbGUoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIFBpY2tsZXMgdGhlIHJlY29yZCBpbiBiaW5hcnkgZm9ybWF0IHdpdGggYSBsZW5ndGggcHJlZml4LCBhbmQKKyAgICAgICAgcmV0dXJucyBpdCByZWFkeSBmb3IgdHJhbnNtaXNzaW9uIGFjcm9zcyB0aGUgc29ja2V0LgorICAgICAgICAiIiIKKyAgICAgICAgZWkgPSByZWNvcmQuZXhjX2luZm8KKyAgICAgICAgaWYgZWk6CisgICAgICAgICAgICAjIGp1c3QgdG8gZ2V0IHRyYWNlYmFjayB0ZXh0IGludG8gcmVjb3JkLmV4Y190ZXh0IC4uLgorICAgICAgICAgICAgZHVtbXkgPSBzZWxmLmZvcm1hdChyZWNvcmQpCisgICAgICAgICAgICByZWNvcmQuZXhjX2luZm8gPSBOb25lICAjIHRvIGF2b2lkIFVucGlja2xlYWJsZSBlcnJvcgorICAgICAgICAjIFNlZSBpc3N1ZSAjMTQ0MzY6IElmIG1zZyBvciBhcmdzIGFyZSBvYmplY3RzLCB0aGV5IG1heSBub3QgYmUKKyAgICAgICAgIyBhdmFpbGFibGUgb24gdGhlIHJlY2VpdmluZyBlbmQuIFNvIHdlIGNvbnZlcnQgdGhlIG1zZyAlIGFyZ3MKKyAgICAgICAgIyB0byBhIHN0cmluZywgc2F2ZSBpdCBhcyBtc2cgYW5kIHphcCB0aGUgYXJncy4KKyAgICAgICAgZCA9IGRpY3QocmVjb3JkLl9fZGljdF9fKQorICAgICAgICBkWydtc2cnXSA9IHJlY29yZC5nZXRNZXNzYWdlKCkKKyAgICAgICAgZFsnYXJncyddID0gTm9uZQorICAgICAgICBzID0gY1BpY2tsZS5kdW1wcyhkLCAxKQorICAgICAgICBpZiBlaToKKyAgICAgICAgICAgIHJlY29yZC5leGNfaW5mbyA9IGVpICAjIGZvciBuZXh0IGhhbmRsZXIKKyAgICAgICAgc2xlbiA9IHN0cnVjdC5wYWNrKCI+TCIsIGxlbihzKSkKKyAgICAgICAgcmV0dXJuIHNsZW4gKyBzCisKKyAgICBkZWYgaGFuZGxlRXJyb3Ioc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEhhbmRsZSBhbiBlcnJvciBkdXJpbmcgbG9nZ2luZy4KKworICAgICAgICBBbiBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIGxvZ2dpbmcuIE1vc3QgbGlrZWx5IGNhdXNlIC0KKyAgICAgICAgY29ubmVjdGlvbiBsb3N0LiBDbG9zZSB0aGUgc29ja2V0IHNvIHRoYXQgd2UgY2FuIHJldHJ5IG9uIHRoZQorICAgICAgICBuZXh0IGV2ZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jbG9zZU9uRXJyb3IgYW5kIHNlbGYuc29jazoKKyAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBOb25lICAgICAgICAjdHJ5IHRvIHJlY29ubmVjdCBuZXh0IHRpbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5oYW5kbGVFcnJvcihzZWxmLCByZWNvcmQpCisKKyAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRW1pdCBhIHJlY29yZC4KKworICAgICAgICBQaWNrbGVzIHRoZSByZWNvcmQgYW5kIHdyaXRlcyBpdCB0byB0aGUgc29ja2V0IGluIGJpbmFyeSBmb3JtYXQuCisgICAgICAgIElmIHRoZXJlIGlzIGFuIGVycm9yIHdpdGggdGhlIHNvY2tldCwgc2lsZW50bHkgZHJvcCB0aGUgcGFja2V0LgorICAgICAgICBJZiB0aGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHNvY2tldCwgcmUtZXN0YWJsaXNoZXMgdGhlCisgICAgICAgIHNvY2tldC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzZWxmLm1ha2VQaWNrbGUocmVjb3JkKQorICAgICAgICAgICAgc2VsZi5zZW5kKHMpCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5oYW5kbGVFcnJvcihyZWNvcmQpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDbG9zZXMgdGhlIHNvY2tldC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuc29jazoKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IE5vbmUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5jbG9zZShzZWxmKQorCitjbGFzcyBEYXRhZ3JhbUhhbmRsZXIoU29ja2V0SGFuZGxlcik6CisgICAgIiIiCisgICAgQSBoYW5kbGVyIGNsYXNzIHdoaWNoIHdyaXRlcyBsb2dnaW5nIHJlY29yZHMsIGluIHBpY2tsZSBmb3JtYXQsIHRvCisgICAgYSBkYXRhZ3JhbSBzb2NrZXQuICBUaGUgcGlja2xlIHdoaWNoIGlzIHNlbnQgaXMgdGhhdCBvZiB0aGUgTG9nUmVjb3JkJ3MKKyAgICBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoX19kaWN0X18pLCBzbyB0aGF0IHRoZSByZWNlaXZlciBkb2VzIG5vdCBuZWVkIHRvCisgICAgaGF2ZSB0aGUgbG9nZ2luZyBtb2R1bGUgaW5zdGFsbGVkIGluIG9yZGVyIHRvIHByb2Nlc3MgdGhlIGxvZ2dpbmcgZXZlbnQuCisKKyAgICBUbyB1bnBpY2tsZSB0aGUgcmVjb3JkIGF0IHRoZSByZWNlaXZpbmcgZW5kIGludG8gYSBMb2dSZWNvcmQsIHVzZSB0aGUKKyAgICBtYWtlTG9nUmVjb3JkIGZ1bmN0aW9uLgorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZXMgdGhlIGhhbmRsZXIgd2l0aCBhIHNwZWNpZmljIGhvc3QgYWRkcmVzcyBhbmQgcG9ydC4KKyAgICAgICAgIiIiCisgICAgICAgIFNvY2tldEhhbmRsZXIuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCkKKyAgICAgICAgc2VsZi5jbG9zZU9uRXJyb3IgPSAwCisKKyAgICBkZWYgbWFrZVNvY2tldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoZSBmYWN0b3J5IG1ldGhvZCBvZiBTb2NrZXRIYW5kbGVyIGlzIGhlcmUgb3ZlcnJpZGRlbiB0byBjcmVhdGUKKyAgICAgICAgYSBVRFAgc29ja2V0IChTT0NLX0RHUkFNKS4KKyAgICAgICAgIiIiCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBzZW5kKHNlbGYsIHMpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VuZCBhIHBpY2tsZWQgc3RyaW5nIHRvIGEgc29ja2V0LgorCisgICAgICAgIFRoaXMgZnVuY3Rpb24gbm8gbG9uZ2VyIGFsbG93cyBmb3IgcGFydGlhbCBzZW5kcyB3aGljaCBjYW4gaGFwcGVuCisgICAgICAgIHdoZW4gdGhlIG5ldHdvcmsgaXMgYnVzeSAtIFVEUCBkb2VzIG5vdCBndWFyYW50ZWUgZGVsaXZlcnkgYW5kCisgICAgICAgIGNhbiBkZWxpdmVyIHBhY2tldHMgb3V0IG9mIHNlcXVlbmNlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5zb2NrIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZVNvY2tldCgpCisgICAgICAgIHNlbGYuc29jay5zZW5kdG8ocywgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSkKKworY2xhc3MgU3lzTG9nSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgorICAgICIiIgorICAgIEEgaGFuZGxlciBjbGFzcyB3aGljaCBzZW5kcyBmb3JtYXR0ZWQgbG9nZ2luZyByZWNvcmRzIHRvIGEgc3lzbG9nCisgICAgc2VydmVyLiBCYXNlZCBvbiBTYW0gUnVzaGluZydzIHN5c2xvZyBtb2R1bGU6CisgICAgaHR0cDovL3d3dy5uaWdodG1hcmUuY29tL3NxdWlybC9weXRob24tZXh0L21pc2Mvc3lzbG9nLnB5CisgICAgQ29udHJpYnV0ZWQgYnkgTmljb2xhcyBVbnR6IChhZnRlciB3aGljaCBtaW5vciByZWZhY3RvcmluZyBjaGFuZ2VzCisgICAgaGF2ZSBiZWVuIG1hZGUpLgorICAgICIiIgorCisgICAgIyBmcm9tIDxsaW51eC9zeXMvc3lzbG9nLmg+OgorICAgICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICMgcHJpb3JpdGllcy9mYWNpbGl0aWVzIGFyZSBlbmNvZGVkIGludG8gYSBzaW5nbGUgMzItYml0IHF1YW50aXR5LCB3aGVyZQorICAgICMgdGhlIGJvdHRvbSAzIGJpdHMgYXJlIHRoZSBwcmlvcml0eSAoMC03KSBhbmQgdGhlIHRvcCAyOCBiaXRzIGFyZSB0aGUKKyAgICAjIGZhY2lsaXR5ICgwLWJpZyBudW1iZXIpLiBCb3RoIHRoZSBwcmlvcml0aWVzIGFuZCB0aGUgZmFjaWxpdGllcyBtYXAKKyAgICAjIHJvdWdobHkgb25lLXRvLW9uZSB0byBzdHJpbmdzIGluIHRoZSBzeXNsb2dkKDgpIHNvdXJjZSBjb2RlLiAgVGhpcworICAgICMgbWFwcGluZyBpcyBpbmNsdWRlZCBpbiB0aGlzIGZpbGUuCisgICAgIworICAgICMgcHJpb3JpdGllcyAodGhlc2UgYXJlIG9yZGVyZWQpCisKKyAgICBMT0dfRU1FUkcgICAgID0gMCAgICAgICAjICBzeXN0ZW0gaXMgdW51c2FibGUKKyAgICBMT0dfQUxFUlQgICAgID0gMSAgICAgICAjICBhY3Rpb24gbXVzdCBiZSB0YWtlbiBpbW1lZGlhdGVseQorICAgIExPR19DUklUICAgICAgPSAyICAgICAgICMgIGNyaXRpY2FsIGNvbmRpdGlvbnMKKyAgICBMT0dfRVJSICAgICAgID0gMyAgICAgICAjICBlcnJvciBjb25kaXRpb25zCisgICAgTE9HX1dBUk5JTkcgICA9IDQgICAgICAgIyAgd2FybmluZyBjb25kaXRpb25zCisgICAgTE9HX05PVElDRSAgICA9IDUgICAgICAgIyAgbm9ybWFsIGJ1dCBzaWduaWZpY2FudCBjb25kaXRpb24KKyAgICBMT0dfSU5GTyAgICAgID0gNiAgICAgICAjICBpbmZvcm1hdGlvbmFsCisgICAgTE9HX0RFQlVHICAgICA9IDcgICAgICAgIyAgZGVidWctbGV2ZWwgbWVzc2FnZXMKKworICAgICMgIGZhY2lsaXR5IGNvZGVzCisgICAgTE9HX0tFUk4gICAgICA9IDAgICAgICAgIyAga2VybmVsIG1lc3NhZ2VzCisgICAgTE9HX1VTRVIgICAgICA9IDEgICAgICAgIyAgcmFuZG9tIHVzZXItbGV2ZWwgbWVzc2FnZXMKKyAgICBMT0dfTUFJTCAgICAgID0gMiAgICAgICAjICBtYWlsIHN5c3RlbQorICAgIExPR19EQUVNT04gICAgPSAzICAgICAgICMgIHN5c3RlbSBkYWVtb25zCisgICAgTE9HX0FVVEggICAgICA9IDQgICAgICAgIyAgc2VjdXJpdHkvYXV0aG9yaXphdGlvbiBtZXNzYWdlcworICAgIExPR19TWVNMT0cgICAgPSA1ICAgICAgICMgIG1lc3NhZ2VzIGdlbmVyYXRlZCBpbnRlcm5hbGx5IGJ5IHN5c2xvZ2QKKyAgICBMT0dfTFBSICAgICAgID0gNiAgICAgICAjICBsaW5lIHByaW50ZXIgc3Vic3lzdGVtCisgICAgTE9HX05FV1MgICAgICA9IDcgICAgICAgIyAgbmV0d29yayBuZXdzIHN1YnN5c3RlbQorICAgIExPR19VVUNQICAgICAgPSA4ICAgICAgICMgIFVVQ1Agc3Vic3lzdGVtCisgICAgTE9HX0NST04gICAgICA9IDkgICAgICAgIyAgY2xvY2sgZGFlbW9uCisgICAgTE9HX0FVVEhQUklWICA9IDEwICAgICAgIyAgc2VjdXJpdHkvYXV0aG9yaXphdGlvbiBtZXNzYWdlcyAocHJpdmF0ZSkKKyAgICBMT0dfRlRQICAgICAgID0gMTEgICAgICAjICBGVFAgZGFlbW9uCisKKyAgICAjICBvdGhlciBjb2RlcyB0aHJvdWdoIDE1IHJlc2VydmVkIGZvciBzeXN0ZW0gdXNlCisgICAgTE9HX0xPQ0FMMCAgICA9IDE2ICAgICAgIyAgcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZQorICAgIExPR19MT0NBTDEgICAgPSAxNyAgICAgICMgIHJlc2VydmVkIGZvciBsb2NhbCB1c2UKKyAgICBMT0dfTE9DQUwyICAgID0gMTggICAgICAjICByZXNlcnZlZCBmb3IgbG9jYWwgdXNlCisgICAgTE9HX0xPQ0FMMyAgICA9IDE5ICAgICAgIyAgcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZQorICAgIExPR19MT0NBTDQgICAgPSAyMCAgICAgICMgIHJlc2VydmVkIGZvciBsb2NhbCB1c2UKKyAgICBMT0dfTE9DQUw1ICAgID0gMjEgICAgICAjICByZXNlcnZlZCBmb3IgbG9jYWwgdXNlCisgICAgTE9HX0xPQ0FMNiAgICA9IDIyICAgICAgIyAgcmVzZXJ2ZWQgZm9yIGxvY2FsIHVzZQorICAgIExPR19MT0NBTDcgICAgPSAyMyAgICAgICMgIHJlc2VydmVkIGZvciBsb2NhbCB1c2UKKworICAgIHByaW9yaXR5X25hbWVzID0geworICAgICAgICAiYWxlcnQiOiAgICBMT0dfQUxFUlQsCisgICAgICAgICJjcml0IjogICAgIExPR19DUklULAorICAgICAgICAiY3JpdGljYWwiOiBMT0dfQ1JJVCwKKyAgICAgICAgImRlYnVnIjogICAgTE9HX0RFQlVHLAorICAgICAgICAiZW1lcmciOiAgICBMT0dfRU1FUkcsCisgICAgICAgICJlcnIiOiAgICAgIExPR19FUlIsCisgICAgICAgICJlcnJvciI6ICAgIExPR19FUlIsICAgICAgICAjICBERVBSRUNBVEVECisgICAgICAgICJpbmZvIjogICAgIExPR19JTkZPLAorICAgICAgICAibm90aWNlIjogICBMT0dfTk9USUNFLAorICAgICAgICAicGFuaWMiOiAgICBMT0dfRU1FUkcsICAgICAgIyAgREVQUkVDQVRFRAorICAgICAgICAid2FybiI6ICAgICBMT0dfV0FSTklORywgICAgIyAgREVQUkVDQVRFRAorICAgICAgICAid2FybmluZyI6ICBMT0dfV0FSTklORywKKyAgICAgICAgfQorCisgICAgZmFjaWxpdHlfbmFtZXMgPSB7CisgICAgICAgICJhdXRoIjogICAgIExPR19BVVRILAorICAgICAgICAiYXV0aHByaXYiOiBMT0dfQVVUSFBSSVYsCisgICAgICAgICJjcm9uIjogICAgIExPR19DUk9OLAorICAgICAgICAiZGFlbW9uIjogICBMT0dfREFFTU9OLAorICAgICAgICAiZnRwIjogICAgICBMT0dfRlRQLAorICAgICAgICAia2VybiI6ICAgICBMT0dfS0VSTiwKKyAgICAgICAgImxwciI6ICAgICAgTE9HX0xQUiwKKyAgICAgICAgIm1haWwiOiAgICAgTE9HX01BSUwsCisgICAgICAgICJuZXdzIjogICAgIExPR19ORVdTLAorICAgICAgICAic2VjdXJpdHkiOiBMT0dfQVVUSCwgICAgICAgIyAgREVQUkVDQVRFRAorICAgICAgICAic3lzbG9nIjogICBMT0dfU1lTTE9HLAorICAgICAgICAidXNlciI6ICAgICBMT0dfVVNFUiwKKyAgICAgICAgInV1Y3AiOiAgICAgTE9HX1VVQ1AsCisgICAgICAgICJsb2NhbDAiOiAgIExPR19MT0NBTDAsCisgICAgICAgICJsb2NhbDEiOiAgIExPR19MT0NBTDEsCisgICAgICAgICJsb2NhbDIiOiAgIExPR19MT0NBTDIsCisgICAgICAgICJsb2NhbDMiOiAgIExPR19MT0NBTDMsCisgICAgICAgICJsb2NhbDQiOiAgIExPR19MT0NBTDQsCisgICAgICAgICJsb2NhbDUiOiAgIExPR19MT0NBTDUsCisgICAgICAgICJsb2NhbDYiOiAgIExPR19MT0NBTDYsCisgICAgICAgICJsb2NhbDciOiAgIExPR19MT0NBTDcsCisgICAgICAgIH0KKworICAgICNUaGUgbWFwIGJlbG93IGFwcGVhcnMgdG8gYmUgdHJpdmlhbGx5IGxvd2VyY2FzaW5nIHRoZSBrZXkuIEhvd2V2ZXIsCisgICAgI3RoZXJlJ3MgbW9yZSB0byBpdCB0aGFuIG1lZXRzIHRoZSBleWUgLSBpbiBzb21lIGxvY2FsZXMsIGxvd2VyY2FzaW5nCisgICAgI2dpdmVzIHVuZXhwZWN0ZWQgcmVzdWx0cy4gU2VlIFNGICMxNTI0MDgxOiBpbiB0aGUgVHVya2lzaCBsb2NhbGUsCisgICAgIyJJTkZPIi5sb3dlcigpICE9ICJpbmZvIgorICAgIHByaW9yaXR5X21hcCA9IHsKKyAgICAgICAgIkRFQlVHIiA6ICJkZWJ1ZyIsCisgICAgICAgICJJTkZPIiA6ICJpbmZvIiwKKyAgICAgICAgIldBUk5JTkciIDogIndhcm5pbmciLAorICAgICAgICAiRVJST1IiIDogImVycm9yIiwKKyAgICAgICAgIkNSSVRJQ0FMIiA6ICJjcml0aWNhbCIKKyAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcz0oJ2xvY2FsaG9zdCcsIFNZU0xPR19VRFBfUE9SVCksCisgICAgICAgICAgICAgICAgIGZhY2lsaXR5PUxPR19VU0VSLCBzb2NrdHlwZT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgYSBoYW5kbGVyLgorCisgICAgICAgIElmIGFkZHJlc3MgaXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nLCBhIFVOSVggc29ja2V0IGlzIHVzZWQuIFRvIGxvZyB0byBhCisgICAgICAgIGxvY2FsIHN5c2xvZ2QsICJTeXNMb2dIYW5kbGVyKGFkZHJlc3M9Ii9kZXYvbG9nIikiIGNhbiBiZSB1c2VkLgorICAgICAgICBJZiBmYWNpbGl0eSBpcyBub3Qgc3BlY2lmaWVkLCBMT0dfVVNFUiBpcyB1c2VkLiBJZiBzb2NrdHlwZSBpcworICAgICAgICBzcGVjaWZpZWQgYXMgc29ja2V0LlNPQ0tfREdSQU0gb3Igc29ja2V0LlNPQ0tfU1RSRUFNLCB0aGF0IHNwZWNpZmljCisgICAgICAgIHNvY2tldCB0eXBlIHdpbGwgYmUgdXNlZC4gRm9yIFVuaXggc29ja2V0cywgeW91IGNhbiBhbHNvIHNwZWNpZnkgYQorICAgICAgICBzb2NrdHlwZSBvZiBOb25lLCBpbiB3aGljaCBjYXNlIHNvY2tldC5TT0NLX0RHUkFNIHdpbGwgYmUgdXNlZCwgZmFsbGluZworICAgICAgICBiYWNrIHRvIHNvY2tldC5TT0NLX1NUUkVBTS4KKyAgICAgICAgIiIiCisgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5fX2luaXRfXyhzZWxmKQorCisgICAgICAgIHNlbGYuYWRkcmVzcyA9IGFkZHJlc3MKKyAgICAgICAgc2VsZi5mYWNpbGl0eSA9IGZhY2lsaXR5CisgICAgICAgIHNlbGYuc29ja3R5cGUgPSBzb2NrdHlwZQorCisgICAgICAgIGlmIGlzaW5zdGFuY2UoYWRkcmVzcywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBzZWxmLnVuaXhzb2NrZXQgPSAxCisgICAgICAgICAgICBzZWxmLl9jb25uZWN0X3VuaXhzb2NrZXQoYWRkcmVzcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudW5peHNvY2tldCA9IDAKKyAgICAgICAgICAgIGlmIHNvY2t0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc29ja3R5cGUgPSBzb2NrZXQuU09DS19ER1JBTQorICAgICAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrdHlwZSkKKyAgICAgICAgICAgIGlmIHNvY2t0eXBlID09IHNvY2tldC5TT0NLX1NUUkVBTToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5jb25uZWN0KGFkZHJlc3MpCisgICAgICAgICAgICBzZWxmLnNvY2t0eXBlID0gc29ja3R5cGUKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBOb25lCisKKyAgICBkZWYgX2Nvbm5lY3RfdW5peHNvY2tldChzZWxmLCBhZGRyZXNzKToKKyAgICAgICAgdXNlX3NvY2t0eXBlID0gc2VsZi5zb2NrdHlwZQorICAgICAgICBpZiB1c2Vfc29ja3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHVzZV9zb2NrdHlwZSA9IHNvY2tldC5TT0NLX0RHUkFNCisgICAgICAgIHNlbGYuc29ja2V0ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgdXNlX3NvY2t0eXBlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNvY2tldC5jb25uZWN0KGFkZHJlc3MpCisgICAgICAgICAgICAjIGl0IHdvcmtlZCwgc28gc2V0IHNlbGYuc29ja3R5cGUgdG8gdGhlIHVzZWQgdHlwZQorICAgICAgICAgICAgc2VsZi5zb2NrdHlwZSA9IHVzZV9zb2NrdHlwZQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQorICAgICAgICAgICAgaWYgc2VsZi5zb2NrdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIHVzZXIgZGlkbid0IHNwZWNpZnkgZmFsbGluZyBiYWNrLCBzbyBmYWlsCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHVzZV9zb2NrdHlwZSA9IHNvY2tldC5TT0NLX1NUUkVBTQorICAgICAgICAgICAgc2VsZi5zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCB1c2Vfc29ja3R5cGUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuY29ubmVjdChhZGRyZXNzKQorICAgICAgICAgICAgICAgICMgaXQgd29ya2VkLCBzbyBzZXQgc2VsZi5zb2NrdHlwZSB0byB0aGUgdXNlZCB0eXBlCisgICAgICAgICAgICAgICAgc2VsZi5zb2NrdHlwZSA9IHVzZV9zb2NrdHlwZQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICMgY3VyaW91czogd2hlbiB0YWxraW5nIHRvIHRoZSB1bml4LWRvbWFpbiAnL2Rldi9sb2cnIHNvY2tldCwgYQorICAgICMgICB6ZXJvLXRlcm1pbmF0b3Igc2VlbXMgdG8gYmUgcmVxdWlyZWQuICB0aGlzIHN0cmluZyBpcyBwbGFjZWQKKyAgICAjICAgaW50byBhIGNsYXNzIHZhcmlhYmxlIHNvIHRoYXQgaXQgY2FuIGJlIG92ZXJyaWRkZW4gaWYKKyAgICAjICAgbmVjZXNzYXJ5LgorICAgIGxvZ19mb3JtYXRfc3RyaW5nID0gJzwlZD4lc1wwMDAnCisKKyAgICBkZWYgZW5jb2RlUHJpb3JpdHkoc2VsZiwgZmFjaWxpdHksIHByaW9yaXR5KToKKyAgICAgICAgIiIiCisgICAgICAgIEVuY29kZSB0aGUgZmFjaWxpdHkgYW5kIHByaW9yaXR5LiBZb3UgY2FuIHBhc3MgaW4gc3RyaW5ncyBvcgorICAgICAgICBpbnRlZ2VycyAtIGlmIHN0cmluZ3MgYXJlIHBhc3NlZCwgdGhlIGZhY2lsaXR5X25hbWVzIGFuZAorICAgICAgICBwcmlvcml0eV9uYW1lcyBtYXBwaW5nIGRpY3Rpb25hcmllcyBhcmUgdXNlZCB0byBjb252ZXJ0IHRoZW0gdG8KKyAgICAgICAgaW50ZWdlcnMuCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKGZhY2lsaXR5LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGZhY2lsaXR5ID0gc2VsZi5mYWNpbGl0eV9uYW1lc1tmYWNpbGl0eV0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShwcmlvcml0eSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBwcmlvcml0eSA9IHNlbGYucHJpb3JpdHlfbmFtZXNbcHJpb3JpdHldCisgICAgICAgIHJldHVybiAoZmFjaWxpdHkgPDwgMykgfCBwcmlvcml0eQorCisgICAgZGVmIGNsb3NlIChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENsb3NlcyB0aGUgc29ja2V0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi51bml4c29ja2V0OgorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5jbG9zZShzZWxmKQorCisgICAgZGVmIG1hcFByaW9yaXR5KHNlbGYsIGxldmVsTmFtZSk6CisgICAgICAgICIiIgorICAgICAgICBNYXAgYSBsb2dnaW5nIGxldmVsIG5hbWUgdG8gYSBrZXkgaW4gdGhlIHByaW9yaXR5X25hbWVzIG1hcC4KKyAgICAgICAgVGhpcyBpcyB1c2VmdWwgaW4gdHdvIHNjZW5hcmlvczogd2hlbiBjdXN0b20gbGV2ZWxzIGFyZSBiZWluZworICAgICAgICB1c2VkLCBhbmQgaW4gdGhlIGNhc2Ugd2hlcmUgeW91IGNhbid0IGRvIGEgc3RyYWlnaHRmb3J3YXJkCisgICAgICAgIG1hcHBpbmcgYnkgbG93ZXJjYXNpbmcgdGhlIGxvZ2dpbmcgbGV2ZWwgbmFtZSBiZWNhdXNlIG9mIGxvY2FsZS0KKyAgICAgICAgc3BlY2lmaWMgaXNzdWVzIChzZWUgU0YgIzE1MjQwODEpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYucHJpb3JpdHlfbWFwLmdldChsZXZlbE5hbWUsICJ3YXJuaW5nIikKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIFRoZSByZWNvcmQgaXMgZm9ybWF0dGVkLCBhbmQgdGhlbiBzZW50IHRvIHRoZSBzeXNsb2cgc2VydmVyLiBJZgorICAgICAgICBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgcHJlc2VudCwgaXQgaXMgTk9UIHNlbnQgdG8gdGhlIHNlcnZlci4KKyAgICAgICAgIiIiCisgICAgICAgIG1zZyA9IHNlbGYuZm9ybWF0KHJlY29yZCkgKyAnXDAwMCcKKyAgICAgICAgIiIiCisgICAgICAgIFdlIG5lZWQgdG8gY29udmVydCByZWNvcmQgbGV2ZWwgdG8gbG93ZXJjYXNlLCBtYXliZSB0aGlzIHdpbGwKKyAgICAgICAgY2hhbmdlIGluIHRoZSBmdXR1cmUuCisgICAgICAgICIiIgorICAgICAgICBwcmlvID0gJzwlZD4nICUgc2VsZi5lbmNvZGVQcmlvcml0eShzZWxmLmZhY2lsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcFByaW9yaXR5KHJlY29yZC5sZXZlbG5hbWUpKQorICAgICAgICAjIE1lc3NhZ2UgaXMgYSBzdHJpbmcuIENvbnZlcnQgdG8gYnl0ZXMgYXMgcmVxdWlyZWQgYnkgUkZDIDU0MjQKKyAgICAgICAgaWYgdHlwZShtc2cpIGlzIHVuaWNvZGU6CisgICAgICAgICAgICBtc2cgPSBtc2cuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIG1zZyA9IHByaW8gKyBtc2cKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi51bml4c29ja2V0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCisgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29ubmVjdF91bml4c29ja2V0KHNlbGYuYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZChtc2cpCisgICAgICAgICAgICBlbGlmIHNlbGYuc29ja3R5cGUgPT0gc29ja2V0LlNPQ0tfREdSQU06CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuc2VuZHRvKG1zZywgc2VsZi5hZGRyZXNzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5zZW5kYWxsKG1zZykKKyAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKworY2xhc3MgU01UUEhhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggc2VuZHMgYW4gU01UUCBlbWFpbCBmb3IgZWFjaCBsb2dnaW5nIGV2ZW50LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYWlsaG9zdCwgZnJvbWFkZHIsIHRvYWRkcnMsIHN1YmplY3QsCisgICAgICAgICAgICAgICAgIGNyZWRlbnRpYWxzPU5vbmUsIHNlY3VyZT1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIGhhbmRsZXIuCisKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgZnJvbSBhbmQgdG8gYWRkcmVzc2VzIGFuZCBzdWJqZWN0CisgICAgICAgIGxpbmUgb2YgdGhlIGVtYWlsLiBUbyBzcGVjaWZ5IGEgbm9uLXN0YW5kYXJkIFNNVFAgcG9ydCwgdXNlIHRoZQorICAgICAgICAoaG9zdCwgcG9ydCkgdHVwbGUgZm9ybWF0IGZvciB0aGUgbWFpbGhvc3QgYXJndW1lbnQuIFRvIHNwZWNpZnkKKyAgICAgICAgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMsIHN1cHBseSBhICh1c2VybmFtZSwgcGFzc3dvcmQpIHR1cGxlCisgICAgICAgIGZvciB0aGUgY3JlZGVudGlhbHMgYXJndW1lbnQuIFRvIHNwZWNpZnkgdGhlIHVzZSBvZiBhIHNlY3VyZQorICAgICAgICBwcm90b2NvbCAoVExTKSwgcGFzcyBpbiBhIHR1cGxlIGZvciB0aGUgc2VjdXJlIGFyZ3VtZW50LiBUaGlzIHdpbGwKKyAgICAgICAgb25seSBiZSB1c2VkIHdoZW4gYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgYXJlIHN1cHBsaWVkLiBUaGUgdHVwbGUKKyAgICAgICAgd2lsbCBiZSBlaXRoZXIgYW4gZW1wdHkgdHVwbGUsIG9yIGEgc2luZ2xlLXZhbHVlIHR1cGxlIHdpdGggdGhlIG5hbWUKKyAgICAgICAgb2YgYSBrZXlmaWxlLCBvciBhIDItdmFsdWUgdHVwbGUgd2l0aCB0aGUgbmFtZXMgb2YgdGhlIGtleWZpbGUgYW5kCisgICAgICAgIGNlcnRpZmljYXRlIGZpbGUuIChUaGlzIHR1cGxlIGlzIHBhc3NlZCB0byB0aGUgYHN0YXJ0dGxzYCBtZXRob2QpLgorICAgICAgICAiIiIKKyAgICAgICAgbG9nZ2luZy5IYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWFpbGhvc3QsIHR1cGxlKToKKyAgICAgICAgICAgIHNlbGYubWFpbGhvc3QsIHNlbGYubWFpbHBvcnQgPSBtYWlsaG9zdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5tYWlsaG9zdCwgc2VsZi5tYWlscG9ydCA9IG1haWxob3N0LCBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2UoY3JlZGVudGlhbHMsIHR1cGxlKToKKyAgICAgICAgICAgIHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQgPSBjcmVkZW50aWFscworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi51c2VybmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5mcm9tYWRkciA9IGZyb21hZGRyCisgICAgICAgIGlmIGlzaW5zdGFuY2UodG9hZGRycywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB0b2FkZHJzID0gW3RvYWRkcnNdCisgICAgICAgIHNlbGYudG9hZGRycyA9IHRvYWRkcnMKKyAgICAgICAgc2VsZi5zdWJqZWN0ID0gc3ViamVjdAorICAgICAgICBzZWxmLnNlY3VyZSA9IHNlY3VyZQorICAgICAgICBzZWxmLl90aW1lb3V0ID0gNS4wCisKKyAgICBkZWYgZ2V0U3ViamVjdChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgRGV0ZXJtaW5lIHRoZSBzdWJqZWN0IGZvciB0aGUgZW1haWwuCisKKyAgICAgICAgSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIHN1YmplY3QgbGluZSB3aGljaCBpcyByZWNvcmQtZGVwZW5kZW50LAorICAgICAgICBvdmVycmlkZSB0aGlzIG1ldGhvZC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnN1YmplY3QKKworICAgIGRlZiBlbWl0KHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBFbWl0IGEgcmVjb3JkLgorCisgICAgICAgIEZvcm1hdCB0aGUgcmVjb3JkIGFuZCBzZW5kIGl0IHRvIHRoZSBzcGVjaWZpZWQgYWRkcmVzc2Vlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBzbXRwbGliCisgICAgICAgICAgICBmcm9tIGVtYWlsLnV0aWxzIGltcG9ydCBmb3JtYXRkYXRlCisgICAgICAgICAgICBwb3J0ID0gc2VsZi5tYWlscG9ydAorICAgICAgICAgICAgaWYgbm90IHBvcnQ6CisgICAgICAgICAgICAgICAgcG9ydCA9IHNtdHBsaWIuU01UUF9QT1JUCisgICAgICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKHNlbGYubWFpbGhvc3QsIHBvcnQsIHRpbWVvdXQ9c2VsZi5fdGltZW91dCkKKyAgICAgICAgICAgIG1zZyA9IHNlbGYuZm9ybWF0KHJlY29yZCkKKyAgICAgICAgICAgIG1zZyA9ICJGcm9tOiAlc1xyXG5UbzogJXNcclxuU3ViamVjdDogJXNcclxuRGF0ZTogJXNcclxuXHJcbiVzIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZyb21hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIi5qb2luKHNlbGYudG9hZGRycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRTdWJqZWN0KHJlY29yZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ZGF0ZSgpLCBtc2cpCisgICAgICAgICAgICBpZiBzZWxmLnVzZXJuYW1lOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VjdXJlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzbXRwLmVobG8oKQorICAgICAgICAgICAgICAgICAgICBzbXRwLnN0YXJ0dGxzKCpzZWxmLnNlY3VyZSkKKyAgICAgICAgICAgICAgICAgICAgc210cC5laGxvKCkKKyAgICAgICAgICAgICAgICBzbXRwLmxvZ2luKHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCisgICAgICAgICAgICBzbXRwLnNlbmRtYWlsKHNlbGYuZnJvbWFkZHIsIHNlbGYudG9hZGRycywgbXNnKQorICAgICAgICAgICAgc210cC5xdWl0KCkKKyAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKworY2xhc3MgTlRFdmVudExvZ0hhbmRsZXIobG9nZ2luZy5IYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggc2VuZHMgZXZlbnRzIHRvIHRoZSBOVCBFdmVudCBMb2cuIEFkZHMgYQorICAgIHJlZ2lzdHJ5IGVudHJ5IGZvciB0aGUgc3BlY2lmaWVkIGFwcGxpY2F0aW9uIG5hbWUuIElmIG5vIGRsbG5hbWUgaXMKKyAgICBwcm92aWRlZCwgd2luMzJzZXJ2aWNlLnB5ZCAod2hpY2ggY29udGFpbnMgc29tZSBiYXNpYyBtZXNzYWdlCisgICAgcGxhY2Vob2xkZXJzKSBpcyB1c2VkLiBOb3RlIHRoYXQgdXNlIG9mIHRoZXNlIHBsYWNlaG9sZGVycyB3aWxsIG1ha2UKKyAgICB5b3VyIGV2ZW50IGxvZ3MgYmlnLCBhcyB0aGUgZW50aXJlIG1lc3NhZ2Ugc291cmNlIGlzIGhlbGQgaW4gdGhlIGxvZy4KKyAgICBJZiB5b3Ugd2FudCBzbGltbWVyIGxvZ3MsIHlvdSBoYXZlIHRvIHBhc3MgaW4gdGhlIG5hbWUgb2YgeW91ciBvd24gRExMCisgICAgd2hpY2ggY29udGFpbnMgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbnMgeW91IHdhbnQgdG8gdXNlIGluIHRoZSBldmVudCBsb2cuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFwcG5hbWUsIGRsbG5hbWU9Tm9uZSwgbG9ndHlwZT0iQXBwbGljYXRpb24iKToKKyAgICAgICAgbG9nZ2luZy5IYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB3aW4zMmV2dGxvZ3V0aWwsIHdpbjMyZXZ0bG9nCisgICAgICAgICAgICBzZWxmLmFwcG5hbWUgPSBhcHBuYW1lCisgICAgICAgICAgICBzZWxmLl93ZWx1ID0gd2luMzJldnRsb2d1dGlsCisgICAgICAgICAgICBpZiBub3QgZGxsbmFtZToKKyAgICAgICAgICAgICAgICBkbGxuYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLl93ZWx1Ll9fZmlsZV9fKQorICAgICAgICAgICAgICAgIGRsbG5hbWUgPSBvcy5wYXRoLnNwbGl0KGRsbG5hbWVbMF0pCisgICAgICAgICAgICAgICAgZGxsbmFtZSA9IG9zLnBhdGguam9pbihkbGxuYW1lWzBdLCByJ3dpbjMyc2VydmljZS5weWQnKQorICAgICAgICAgICAgc2VsZi5kbGxuYW1lID0gZGxsbmFtZQorICAgICAgICAgICAgc2VsZi5sb2d0eXBlID0gbG9ndHlwZQorICAgICAgICAgICAgc2VsZi5fd2VsdS5BZGRTb3VyY2VUb1JlZ2lzdHJ5KGFwcG5hbWUsIGRsbG5hbWUsIGxvZ3R5cGUpCisgICAgICAgICAgICBzZWxmLmRlZnR5cGUgPSB3aW4zMmV2dGxvZy5FVkVOVExPR19FUlJPUl9UWVBFCisgICAgICAgICAgICBzZWxmLnR5cGVtYXAgPSB7CisgICAgICAgICAgICAgICAgbG9nZ2luZy5ERUJVRyAgIDogd2luMzJldnRsb2cuRVZFTlRMT0dfSU5GT1JNQVRJT05fVFlQRSwKKyAgICAgICAgICAgICAgICBsb2dnaW5nLklORk8gICAgOiB3aW4zMmV2dGxvZy5FVkVOVExPR19JTkZPUk1BVElPTl9UWVBFLAorICAgICAgICAgICAgICAgIGxvZ2dpbmcuV0FSTklORyA6IHdpbjMyZXZ0bG9nLkVWRU5UTE9HX1dBUk5JTkdfVFlQRSwKKyAgICAgICAgICAgICAgICBsb2dnaW5nLkVSUk9SICAgOiB3aW4zMmV2dGxvZy5FVkVOVExPR19FUlJPUl9UWVBFLAorICAgICAgICAgICAgICAgIGxvZ2dpbmcuQ1JJVElDQUw6IHdpbjMyZXZ0bG9nLkVWRU5UTE9HX0VSUk9SX1RZUEUsCisgICAgICAgICB9CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHByaW50KCJUaGUgUHl0aG9uIFdpbjMyIGV4dGVuc2lvbnMgZm9yIE5UIChzZXJ2aWNlLCBldmVudCAiXAorICAgICAgICAgICAgICAgICAgICAgICAgImxvZ2dpbmcpIGFwcGVhciBub3QgdG8gYmUgYXZhaWxhYmxlLiIpCisgICAgICAgICAgICBzZWxmLl93ZWx1ID0gTm9uZQorCisgICAgZGVmIGdldE1lc3NhZ2VJRChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBtZXNzYWdlIElEIGZvciB0aGUgZXZlbnQgcmVjb3JkLiBJZiB5b3UgYXJlIHVzaW5nIHlvdXIKKyAgICAgICAgb3duIG1lc3NhZ2VzLCB5b3UgY291bGQgZG8gdGhpcyBieSBoYXZpbmcgdGhlIG1zZyBwYXNzZWQgdG8gdGhlCisgICAgICAgIGxvZ2dlciBiZWluZyBhbiBJRCByYXRoZXIgdGhhbiBhIGZvcm1hdHRpbmcgc3RyaW5nLiBUaGVuLCBpbiBoZXJlLAorICAgICAgICB5b3UgY291bGQgdXNlIGEgZGljdGlvbmFyeSBsb29rdXAgdG8gZ2V0IHRoZSBtZXNzYWdlIElELiBUaGlzCisgICAgICAgIHZlcnNpb24gcmV0dXJucyAxLCB3aGljaCBpcyB0aGUgYmFzZSBtZXNzYWdlIElEIGluIHdpbjMyc2VydmljZS5weWQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGdldEV2ZW50Q2F0ZWdvcnkoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiB0aGUgZXZlbnQgY2F0ZWdvcnkgZm9yIHRoZSByZWNvcmQuCisKKyAgICAgICAgT3ZlcnJpZGUgdGhpcyBpZiB5b3Ugd2FudCB0byBzcGVjaWZ5IHlvdXIgb3duIGNhdGVnb3JpZXMuIFRoaXMgdmVyc2lvbgorICAgICAgICByZXR1cm5zIDAuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGdldEV2ZW50VHlwZShzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBldmVudCB0eXBlIGZvciB0aGUgcmVjb3JkLgorCisgICAgICAgIE92ZXJyaWRlIHRoaXMgaWYgeW91IHdhbnQgdG8gc3BlY2lmeSB5b3VyIG93biB0eXBlcy4gVGhpcyB2ZXJzaW9uIGRvZXMKKyAgICAgICAgYSBtYXBwaW5nIHVzaW5nIHRoZSBoYW5kbGVyJ3MgdHlwZW1hcCBhdHRyaWJ1dGUsIHdoaWNoIGlzIHNldCB1cCBpbgorICAgICAgICBfX2luaXRfXygpIHRvIGEgZGljdGlvbmFyeSB3aGljaCBjb250YWlucyBtYXBwaW5ncyBmb3IgREVCVUcsIElORk8sCisgICAgICAgIFdBUk5JTkcsIEVSUk9SIGFuZCBDUklUSUNBTC4gSWYgeW91IGFyZSB1c2luZyB5b3VyIG93biBsZXZlbHMgeW91IHdpbGwKKyAgICAgICAgZWl0aGVyIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2Qgb3IgcGxhY2UgYSBzdWl0YWJsZSBkaWN0aW9uYXJ5IGluCisgICAgICAgIHRoZSBoYW5kbGVyJ3MgdHlwZW1hcCBhdHRyaWJ1dGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50eXBlbWFwLmdldChyZWNvcmQubGV2ZWxubywgc2VsZi5kZWZ0eXBlKQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgRGV0ZXJtaW5lIHRoZSBtZXNzYWdlIElELCBldmVudCBjYXRlZ29yeSBhbmQgZXZlbnQgdHlwZS4gVGhlbgorICAgICAgICBsb2cgdGhlIG1lc3NhZ2UgaW4gdGhlIE5UIGV2ZW50IGxvZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX3dlbHU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWQgPSBzZWxmLmdldE1lc3NhZ2VJRChyZWNvcmQpCisgICAgICAgICAgICAgICAgY2F0ID0gc2VsZi5nZXRFdmVudENhdGVnb3J5KHJlY29yZCkKKyAgICAgICAgICAgICAgICB0eXBlID0gc2VsZi5nZXRFdmVudFR5cGUocmVjb3JkKQorICAgICAgICAgICAgICAgIG1zZyA9IHNlbGYuZm9ybWF0KHJlY29yZCkKKyAgICAgICAgICAgICAgICBzZWxmLl93ZWx1LlJlcG9ydEV2ZW50KHNlbGYuYXBwbmFtZSwgaWQsIGNhdCwgdHlwZSwgW21zZ10pCisgICAgICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IocmVjb3JkKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQ2xlYW4gdXAgdGhpcyBoYW5kbGVyLgorCisgICAgICAgIFlvdSBjYW4gcmVtb3ZlIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGZyb20gdGhlIHJlZ2lzdHJ5IGFzIGEKKyAgICAgICAgc291cmNlIG9mIGV2ZW50IGxvZyBlbnRyaWVzLiBIb3dldmVyLCBpZiB5b3UgZG8gdGhpcywgeW91IHdpbGwKKyAgICAgICAgbm90IGJlIGFibGUgdG8gc2VlIHRoZSBldmVudHMgYXMgeW91IGludGVuZGVkIGluIHRoZSBFdmVudCBMb2cKKyAgICAgICAgVmlld2VyIC0gaXQgbmVlZHMgdG8gYmUgYWJsZSB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5IHRvIGdldCB0aGUKKyAgICAgICAgRExMIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICAjc2VsZi5fd2VsdS5SZW1vdmVTb3VyY2VGcm9tUmVnaXN0cnkoc2VsZi5hcHBuYW1lLCBzZWxmLmxvZ3R5cGUpCisgICAgICAgIGxvZ2dpbmcuSGFuZGxlci5jbG9zZShzZWxmKQorCitjbGFzcyBIVFRQSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgorICAgICIiIgorICAgIEEgY2xhc3Mgd2hpY2ggc2VuZHMgcmVjb3JkcyB0byBhIFdlYiBzZXJ2ZXIsIHVzaW5nIGVpdGhlciBHRVQgb3IKKyAgICBQT1NUIHNlbWFudGljcy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgdXJsLCBtZXRob2Q9IkdFVCIpOgorICAgICAgICAiIiIKKyAgICAgICAgSW5pdGlhbGl6ZSB0aGUgaW5zdGFuY2Ugd2l0aCB0aGUgaG9zdCwgdGhlIHJlcXVlc3QgVVJMLCBhbmQgdGhlIG1ldGhvZAorICAgICAgICAoIkdFVCIgb3IgIlBPU1QiKQorICAgICAgICAiIiIKKyAgICAgICAgbG9nZ2luZy5IYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIG1ldGhvZCA9IG1ldGhvZC51cHBlcigpCisgICAgICAgIGlmIG1ldGhvZCBub3QgaW4gWyJHRVQiLCAiUE9TVCJdOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibWV0aG9kIG11c3QgYmUgR0VUIG9yIFBPU1QiKQorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCisKKyAgICBkZWYgbWFwTG9nUmVjb3JkKHNlbGYsIHJlY29yZCk6CisgICAgICAgICIiIgorICAgICAgICBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIG1hcHBpbmcgdGhlIGxvZyByZWNvcmQgaW50byBhIGRpY3QKKyAgICAgICAgdGhhdCBpcyBzZW50IGFzIHRoZSBDR0kgZGF0YS4gT3ZlcndyaXRlIGluIHlvdXIgY2xhc3MuCisgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEZyYW56ICBHbGFzbmVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHJlY29yZC5fX2RpY3RfXworCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgU2VuZCB0aGUgcmVjb3JkIHRvIHRoZSBXZWIgc2VydmVyIGFzIGEgcGVyY2VudC1lbmNvZGVkIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBodHRwbGliLCB1cmxsaWIKKyAgICAgICAgICAgIGhvc3QgPSBzZWxmLmhvc3QKKyAgICAgICAgICAgIGggPSBodHRwbGliLkhUVFAoaG9zdCkKKyAgICAgICAgICAgIHVybCA9IHNlbGYudXJsCisgICAgICAgICAgICBkYXRhID0gdXJsbGliLnVybGVuY29kZShzZWxmLm1hcExvZ1JlY29yZChyZWNvcmQpKQorICAgICAgICAgICAgaWYgc2VsZi5tZXRob2QgPT0gIkdFVCI6CisgICAgICAgICAgICAgICAgaWYgKHVybC5maW5kKCc/JykgPj0gMCk6CisgICAgICAgICAgICAgICAgICAgIHNlcCA9ICcmJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlcCA9ICc/JworICAgICAgICAgICAgICAgIHVybCA9IHVybCArICIlYyVzIiAlIChzZXAsIGRhdGEpCisgICAgICAgICAgICBoLnB1dHJlcXVlc3Qoc2VsZi5tZXRob2QsIHVybCkKKyAgICAgICAgICAgICMgc3VwcG9ydCBtdWx0aXBsZSBob3N0cyBvbiBvbmUgSVAgYWRkcmVzcy4uLgorICAgICAgICAgICAgIyBuZWVkIHRvIHN0cmlwIG9wdGlvbmFsIDpwb3J0IGZyb20gaG9zdCwgaWYgcHJlc2VudAorICAgICAgICAgICAgaSA9IGhvc3QuZmluZCgiOiIpCisgICAgICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICAgICAgaG9zdCA9IGhvc3RbOmldCisgICAgICAgICAgICBoLnB1dGhlYWRlcigiSG9zdCIsIGhvc3QpCisgICAgICAgICAgICBpZiBzZWxmLm1ldGhvZCA9PSAiUE9TVCI6CisgICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoIkNvbnRlbnQtdHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgICAgICAgICAgICAgaC5wdXRoZWFkZXIoIkNvbnRlbnQtbGVuZ3RoIiwgc3RyKGxlbihkYXRhKSkpCisgICAgICAgICAgICBoLmVuZGhlYWRlcnMoZGF0YSBpZiBzZWxmLm1ldGhvZCA9PSAiUE9TVCIgZWxzZSBOb25lKQorICAgICAgICAgICAgaC5nZXRyZXBseSgpICAgICNjYW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoZSByZXN1bHQKKyAgICAgICAgZXhjZXB0IChLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmhhbmRsZUVycm9yKHJlY29yZCkKKworY2xhc3MgQnVmZmVyaW5nSGFuZGxlcihsb2dnaW5nLkhhbmRsZXIpOgorICAgICIiIgorICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggYnVmZmVycyBsb2dnaW5nIHJlY29yZHMgaW4gbWVtb3J5LiBXaGVuZXZlciBlYWNoCisgIHJlY29yZCBpcyBhZGRlZCB0byB0aGUgYnVmZmVyLCBhIGNoZWNrIGlzIG1hZGUgdG8gc2VlIGlmIHRoZSBidWZmZXIgc2hvdWxkCisgIGJlIGZsdXNoZWQuIElmIGl0IHNob3VsZCwgdGhlbiBmbHVzaCgpIGlzIGV4cGVjdGVkIHRvIGRvIHdoYXQncyBuZWVkZWQuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhcGFjaXR5KToKKyAgICAgICAgIiIiCisgICAgICAgIEluaXRpYWxpemUgdGhlIGhhbmRsZXIgd2l0aCB0aGUgYnVmZmVyIHNpemUuCisgICAgICAgICIiIgorICAgICAgICBsb2dnaW5nLkhhbmRsZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5jYXBhY2l0eSA9IGNhcGFjaXR5CisgICAgICAgIHNlbGYuYnVmZmVyID0gW10KKworICAgIGRlZiBzaG91bGRGbHVzaChzZWxmLCByZWNvcmQpOgorICAgICAgICAiIiIKKyAgICAgICAgU2hvdWxkIHRoZSBoYW5kbGVyIGZsdXNoIGl0cyBidWZmZXI/CisKKyAgICAgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgaXMgdXAgdG8gY2FwYWNpdHkuIFRoaXMgbWV0aG9kIGNhbiBiZQorICAgICAgICBvdmVycmlkZGVuIHRvIGltcGxlbWVudCBjdXN0b20gZmx1c2hpbmcgc3RyYXRlZ2llcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAobGVuKHNlbGYuYnVmZmVyKSA+PSBzZWxmLmNhcGFjaXR5KQorCisgICAgZGVmIGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIEVtaXQgYSByZWNvcmQuCisKKyAgICAgICAgQXBwZW5kIHRoZSByZWNvcmQuIElmIHNob3VsZEZsdXNoKCkgdGVsbHMgdXMgdG8sIGNhbGwgZmx1c2goKSB0byBwcm9jZXNzCisgICAgICAgIHRoZSBidWZmZXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmJ1ZmZlci5hcHBlbmQocmVjb3JkKQorICAgICAgICBpZiBzZWxmLnNob3VsZEZsdXNoKHJlY29yZCk6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIE92ZXJyaWRlIHRvIGltcGxlbWVudCBjdXN0b20gZmx1c2hpbmcgYmVoYXZpb3VyLgorCisgICAgICAgIFRoaXMgdmVyc2lvbiBqdXN0IHphcHMgdGhlIGJ1ZmZlciB0byBlbXB0eS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gW10KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDbG9zZSB0aGUgaGFuZGxlci4KKworICAgICAgICBUaGlzIHZlcnNpb24ganVzdCBmbHVzaGVzIGFuZCBjaGFpbnMgdG8gdGhlIHBhcmVudCBjbGFzcycgY2xvc2UoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBsb2dnaW5nLkhhbmRsZXIuY2xvc2Uoc2VsZikKKworY2xhc3MgTWVtb3J5SGFuZGxlcihCdWZmZXJpbmdIYW5kbGVyKToKKyAgICAiIiIKKyAgICBBIGhhbmRsZXIgY2xhc3Mgd2hpY2ggYnVmZmVycyBsb2dnaW5nIHJlY29yZHMgaW4gbWVtb3J5LCBwZXJpb2RpY2FsbHkKKyAgICBmbHVzaGluZyB0aGVtIHRvIGEgdGFyZ2V0IGhhbmRsZXIuIEZsdXNoaW5nIG9jY3VycyB3aGVuZXZlciB0aGUgYnVmZmVyCisgICAgaXMgZnVsbCwgb3Igd2hlbiBhbiBldmVudCBvZiBhIGNlcnRhaW4gc2V2ZXJpdHkgb3IgZ3JlYXRlciBpcyBzZWVuLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYXBhY2l0eSwgZmx1c2hMZXZlbD1sb2dnaW5nLkVSUk9SLCB0YXJnZXQ9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBJbml0aWFsaXplIHRoZSBoYW5kbGVyIHdpdGggdGhlIGJ1ZmZlciBzaXplLCB0aGUgbGV2ZWwgYXQgd2hpY2gKKyAgICAgICAgZmx1c2hpbmcgc2hvdWxkIG9jY3VyIGFuZCBhbiBvcHRpb25hbCB0YXJnZXQuCisKKyAgICAgICAgTm90ZSB0aGF0IHdpdGhvdXQgYSB0YXJnZXQgYmVpbmcgc2V0IGVpdGhlciBoZXJlIG9yIHZpYSBzZXRUYXJnZXQoKSwKKyAgICAgICAgYSBNZW1vcnlIYW5kbGVyIGlzIG5vIHVzZSB0byBhbnlvbmUhCisgICAgICAgICIiIgorICAgICAgICBCdWZmZXJpbmdIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGNhcGFjaXR5KQorICAgICAgICBzZWxmLmZsdXNoTGV2ZWwgPSBmbHVzaExldmVsCisgICAgICAgIHNlbGYudGFyZ2V0ID0gdGFyZ2V0CisKKyAgICBkZWYgc2hvdWxkRmx1c2goc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIiIiCisgICAgICAgIENoZWNrIGZvciBidWZmZXIgZnVsbCBvciBhIHJlY29yZCBhdCB0aGUgZmx1c2hMZXZlbCBvciBoaWdoZXIuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKGxlbihzZWxmLmJ1ZmZlcikgPj0gc2VsZi5jYXBhY2l0eSkgb3IgXAorICAgICAgICAgICAgICAgIChyZWNvcmQubGV2ZWxubyA+PSBzZWxmLmZsdXNoTGV2ZWwpCisKKyAgICBkZWYgc2V0VGFyZ2V0KHNlbGYsIHRhcmdldCk6CisgICAgICAgICIiIgorICAgICAgICBTZXQgdGhlIHRhcmdldCBoYW5kbGVyIGZvciB0aGlzIGhhbmRsZXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnRhcmdldCA9IHRhcmdldAorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgRm9yIGEgTWVtb3J5SGFuZGxlciwgZmx1c2hpbmcgbWVhbnMganVzdCBzZW5kaW5nIHRoZSBidWZmZXJlZAorICAgICAgICByZWNvcmRzIHRvIHRoZSB0YXJnZXQsIGlmIHRoZXJlIGlzIG9uZS4gT3ZlcnJpZGUgaWYgeW91IHdhbnQKKyAgICAgICAgZGlmZmVyZW50IGJlaGF2aW91ci4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYudGFyZ2V0OgorICAgICAgICAgICAgICAgIGZvciByZWNvcmQgaW4gc2VsZi5idWZmZXI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGFyZ2V0LmhhbmRsZShyZWNvcmQpCisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBbXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEZsdXNoLCBzZXQgdGhlIHRhcmdldCB0byBOb25lIGFuZCBsb3NlIHRoZSBidWZmZXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50YXJnZXQgPSBOb25lCisgICAgICAgICAgICBCdWZmZXJpbmdIYW5kbGVyLmNsb3NlKHNlbGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9sb2dnaW5nL2hhbmRsZXJzLnB5YyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3YjcyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9sb2dnaW5nL2hhbmRsZXJzLnB5byBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU3YjcyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbG9nZ2luZy9oYW5kbGVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWNwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy9tYWNwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNGNiODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21hY3BhdGgucHkKQEAgLTAsMCArMSwyMTUgQEAKKyIiIlBhdGhuYW1lIGFuZCBwYXRoLXJlbGF0ZWQgb3BlcmF0aW9ucyBmb3IgdGhlIE1hY2ludG9zaC4iIiIKKworaW1wb3J0IG9zCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gc3RhdCBpbXBvcnQgKgoraW1wb3J0IGdlbmVyaWNwYXRoCitmcm9tIGdlbmVyaWNwYXRoIGltcG9ydCAqCisKK19fYWxsX18gPSBbIm5vcm1jYXNlIiwiaXNhYnMiLCJqb2luIiwic3BsaXRkcml2ZSIsInNwbGl0Iiwic3BsaXRleHQiLAorICAgICAgICAgICAiYmFzZW5hbWUiLCJkaXJuYW1lIiwiY29tbW9ucHJlZml4IiwiZ2V0c2l6ZSIsImdldG10aW1lIiwKKyAgICAgICAgICAgImdldGF0aW1lIiwiZ2V0Y3RpbWUiLCAiaXNsaW5rIiwiZXhpc3RzIiwibGV4aXN0cyIsImlzZGlyIiwiaXNmaWxlIiwKKyAgICAgICAgICAgIndhbGsiLCJleHBhbmR1c2VyIiwiZXhwYW5kdmFycyIsIm5vcm1wYXRoIiwiYWJzcGF0aCIsCisgICAgICAgICAgICJjdXJkaXIiLCJwYXJkaXIiLCJzZXAiLCJwYXRoc2VwIiwiZGVmcGF0aCIsImFsdHNlcCIsImV4dHNlcCIsCisgICAgICAgICAgICJkZXZudWxsIiwicmVhbHBhdGgiLCJzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyJdCisKKyMgc3RyaW5ncyByZXByZXNlbnRpbmcgdmFyaW91cyBwYXRoLXJlbGF0ZWQgYml0cyBhbmQgcGllY2VzCitjdXJkaXIgPSAnOicKK3BhcmRpciA9ICc6OicKK2V4dHNlcCA9ICcuJworc2VwID0gJzonCitwYXRoc2VwID0gJ1xuJworZGVmcGF0aCA9ICc6JworYWx0c2VwID0gTm9uZQorZGV2bnVsbCA9ICdEZXY6TnVsbCcKKworIyBOb3JtYWxpemUgdGhlIGNhc2Ugb2YgYSBwYXRobmFtZS4gIER1bW15IGluIFBvc2l4LCBidXQgPHM+Lmxvd2VyKCkgaGVyZS4KKworZGVmIG5vcm1jYXNlKHBhdGgpOgorICAgIHJldHVybiBwYXRoLmxvd2VyKCkKKworCitkZWYgaXNhYnMocyk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgYSBwYXRoIGlzIGFic29sdXRlLgorICAgIE9uIHRoZSBNYWMsIHJlbGF0aXZlIHBhdGhzIGJlZ2luIHdpdGggYSBjb2xvbiwKKyAgICBidXQgYXMgYSBzcGVjaWFsIGNhc2UsIHBhdGhzIHdpdGggbm8gY29sb25zIGF0IGFsbCBhcmUgYWxzbyByZWxhdGl2ZS4KKyAgICBBbnl0aGluZyBlbHNlIGlzIGFic29sdXRlICh0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCBjb2xvbiBpcyB0aGUKKyAgICB2b2x1bWUgbmFtZSkuIiIiCisKKyAgICByZXR1cm4gJzonIGluIHMgYW5kIHNbMF0gIT0gJzonCisKKworZGVmIGpvaW4ocywgKnApOgorICAgIHBhdGggPSBzCisgICAgZm9yIHQgaW4gcDoKKyAgICAgICAgaWYgKG5vdCBzKSBvciBpc2Ficyh0KToKKyAgICAgICAgICAgIHBhdGggPSB0CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiB0WzoxXSA9PSAnOic6CisgICAgICAgICAgICB0ID0gdFsxOl0KKyAgICAgICAgaWYgJzonIG5vdCBpbiBwYXRoOgorICAgICAgICAgICAgcGF0aCA9ICc6JyArIHBhdGgKKyAgICAgICAgaWYgcGF0aFstMTpdICE9ICc6JzoKKyAgICAgICAgICAgIHBhdGggPSBwYXRoICsgJzonCisgICAgICAgIHBhdGggPSBwYXRoICsgdAorICAgIHJldHVybiBwYXRoCisKKworZGVmIHNwbGl0KHMpOgorICAgICIiIlNwbGl0IGEgcGF0aG5hbWUgaW50byB0d28gcGFydHM6IHRoZSBkaXJlY3RvcnkgbGVhZGluZyB1cCB0byB0aGUgZmluYWwKKyAgICBiaXQsIGFuZCB0aGUgYmFzZW5hbWUgKHRoZSBmaWxlbmFtZSwgd2l0aG91dCBjb2xvbnMsIGluIHRoYXQgZGlyZWN0b3J5KS4KKyAgICBUaGUgcmVzdWx0IChzLCB0KSBpcyBzdWNoIHRoYXQgam9pbihzLCB0KSB5aWVsZHMgdGhlIG9yaWdpbmFsIGFyZ3VtZW50LiIiIgorCisgICAgaWYgJzonIG5vdCBpbiBzOiByZXR1cm4gJycsIHMKKyAgICBjb2xvbiA9IDAKKyAgICBmb3IgaSBpbiByYW5nZShsZW4ocykpOgorICAgICAgICBpZiBzW2ldID09ICc6JzogY29sb24gPSBpICsgMQorICAgIHBhdGgsIGZpbGUgPSBzWzpjb2xvbi0xXSwgc1tjb2xvbjpdCisgICAgaWYgcGF0aCBhbmQgbm90ICc6JyBpbiBwYXRoOgorICAgICAgICBwYXRoID0gcGF0aCArICc6JworICAgIHJldHVybiBwYXRoLCBmaWxlCisKKworZGVmIHNwbGl0ZXh0KHApOgorICAgIHJldHVybiBnZW5lcmljcGF0aC5fc3BsaXRleHQocCwgc2VwLCBhbHRzZXAsIGV4dHNlcCkKK3NwbGl0ZXh0Ll9fZG9jX18gPSBnZW5lcmljcGF0aC5fc3BsaXRleHQuX19kb2NfXworCitkZWYgc3BsaXRkcml2ZShwKToKKyAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gYSBkcml2ZSBzcGVjaWZpY2F0aW9uIGFuZCB0aGUgcmVzdCBvZiB0aGUKKyAgICBwYXRoLiAgVXNlZnVsIG9uIERPUy9XaW5kb3dzL05UOyBvbiB0aGUgTWFjLCB0aGUgZHJpdmUgaXMgYWx3YXlzCisgICAgZW1wdHkgKGRvbid0IHVzZSB0aGUgdm9sdW1lIG5hbWUgLS0gaXQgZG9lc24ndCBoYXZlIHRoZSBzYW1lCisgICAgc3ludGFjdGljIGFuZCBzZW1hbnRpYyBvZGRpdGllcyBhcyBET1MgZHJpdmUgbGV0dGVycywgc3VjaCBhcyB0aGVyZQorICAgIGJlaW5nIGEgc2VwYXJhdGUgY3VycmVudCBkaXJlY3RvcnkgcGVyIGRyaXZlKS4iIiIKKworICAgIHJldHVybiAnJywgcAorCisKKyMgU2hvcnQgaW50ZXJmYWNlcyB0byBzcGxpdCgpCisKK2RlZiBkaXJuYW1lKHMpOiByZXR1cm4gc3BsaXQocylbMF0KK2RlZiBiYXNlbmFtZShzKTogcmV0dXJuIHNwbGl0KHMpWzFdCisKK2RlZiBpc21vdW50KHMpOgorICAgIGlmIG5vdCBpc2FicyhzKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgY29tcG9uZW50cyA9IHNwbGl0KHMpCisgICAgcmV0dXJuIGxlbihjb21wb25lbnRzKSA9PSAyIGFuZCBjb21wb25lbnRzWzFdID09ICcnCisKK2RlZiBpc2xpbmsocyk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIHBhdGhuYW1lIHJlZmVycyB0byBhIHN5bWJvbGljIGxpbmsuIiIiCisKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBDYXJib24uRmlsZQorICAgICAgICByZXR1cm4gQ2FyYm9uLkZpbGUuUmVzb2x2ZUFsaWFzRmlsZShzLCAwKVsyXQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyMgSXMgYHN0YXRgL2Bsc3RhdGAgYSBtZWFuaW5nZnVsIGRpZmZlcmVuY2Ugb24gdGhlIE1hYz8gIFRoaXMgaXMgc2FmZSBpbiBhbnkKKyMgY2FzZS4KKworZGVmIGxleGlzdHMocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBleGlzdHMuICBSZXR1cm5zIFRydWUgZm9yIGJyb2tlbiBzeW1ib2xpYyBsaW5rcyIiIgorCisgICAgdHJ5OgorICAgICAgICBzdCA9IG9zLmxzdGF0KHBhdGgpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgZXhwYW5kdmFycyhwYXRoKToKKyAgICAiIiJEdW1teSB0byByZXRhaW4gaW50ZXJmYWNlLWNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBvcGVyYXRpbmcgc3lzdGVtcy4iIiIKKyAgICByZXR1cm4gcGF0aAorCisKK2RlZiBleHBhbmR1c2VyKHBhdGgpOgorICAgICIiIkR1bW15IHRvIHJldGFpbiBpbnRlcmZhY2UtY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLiIiIgorICAgIHJldHVybiBwYXRoCisKK2NsYXNzIG5vcm1fZXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJQYXRoIGNhbm5vdCBiZSBub3JtYWxpemVkIiIiCisKK2RlZiBub3JtcGF0aChzKToKKyAgICAiIiJOb3JtYWxpemUgYSBwYXRobmFtZS4gIFdpbGwgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdCBmb3IKKyAgICBlcXVpdmFsZW50IHBhdGhzLiIiIgorCisgICAgaWYgIjoiIG5vdCBpbiBzOgorICAgICAgICByZXR1cm4gIjoiK3MKKworICAgIGNvbXBzID0gcy5zcGxpdCgiOiIpCisgICAgaSA9IDEKKyAgICB3aGlsZSBpIDwgbGVuKGNvbXBzKS0xOgorICAgICAgICBpZiBjb21wc1tpXSA9PSAiIiBhbmQgY29tcHNbaS0xXSAhPSAiIjoKKyAgICAgICAgICAgIGlmIGkgPiAxOgorICAgICAgICAgICAgICAgIGRlbCBjb21wc1tpLTE6aSsxXQorICAgICAgICAgICAgICAgIGkgPSBpIC0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGJlc3Qgd2F5IHRvIGhhbmRsZSB0aGlzIGlzIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHJhaXNlIG5vcm1fZXJyb3IsICdDYW5ub3QgdXNlIDo6IGltbWVkaWF0ZWx5IGFmdGVyIHZvbHVtZSBuYW1lJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSA9IGkgKyAxCisKKyAgICBzID0gIjoiLmpvaW4oY29tcHMpCisKKyAgICAjIHJlbW92ZSB0cmFpbGluZyAiOiIgZXhjZXB0IGZvciAiOiIgYW5kICJWb2x1bWU6IgorICAgIGlmIHNbLTFdID09ICI6IiBhbmQgbGVuKGNvbXBzKSA+IDIgYW5kIHMgIT0gIjoiKmxlbihzKToKKyAgICAgICAgcyA9IHNbOi0xXQorICAgIHJldHVybiBzCisKKworZGVmIHdhbGsodG9wLCBmdW5jLCBhcmcpOgorICAgICIiIkRpcmVjdG9yeSB0cmVlIHdhbGsgd2l0aCBjYWxsYmFjayBmdW5jdGlvbi4KKworICAgIEZvciBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUgcm9vdGVkIGF0IHRvcCAoaW5jbHVkaW5nIHRvcAorICAgIGl0c2VsZiwgYnV0IGV4Y2x1ZGluZyAnLicgYW5kICcuLicpLCBjYWxsIGZ1bmMoYXJnLCBkaXJuYW1lLCBmbmFtZXMpLgorICAgIGRpcm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSwgYW5kIGZuYW1lcyBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mCisgICAgdGhlIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBpbiBkaXJuYW1lIChleGNsdWRpbmcgJy4nIGFuZCAnLi4nKS4gIGZ1bmMKKyAgICBtYXkgbW9kaWZ5IHRoZSBmbmFtZXMgbGlzdCBpbi1wbGFjZSAoZS5nLiB2aWEgZGVsIG9yIHNsaWNlIGFzc2lnbm1lbnQpLAorICAgIGFuZCB3YWxrIHdpbGwgb25seSByZWN1cnNlIGludG8gdGhlIHN1YmRpcmVjdG9yaWVzIHdob3NlIG5hbWVzIHJlbWFpbiBpbgorICAgIGZuYW1lczsgdGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYSBmaWx0ZXIsIG9yIHRvIGltcG9zZSBhIHNwZWNpZmljCisgICAgb3JkZXIgb2YgdmlzaXRpbmcuICBObyBzZW1hbnRpY3MgYXJlIGRlZmluZWQgZm9yLCBvciByZXF1aXJlZCBvZiwgYXJnLAorICAgIGJleW9uZCB0aGF0IGFyZyBpcyBhbHdheXMgcGFzc2VkIHRvIGZ1bmMuICBJdCBjYW4gYmUgdXNlZCwgZS5nLiwgdG8gcGFzcworICAgIGEgZmlsZW5hbWUgcGF0dGVybiwgb3IgYSBtdXRhYmxlIG9iamVjdCBkZXNpZ25lZCB0byBhY2N1bXVsYXRlCisgICAgc3RhdGlzdGljcy4gIFBhc3NpbmcgTm9uZSBmb3IgYXJnIGlzIGNvbW1vbi4iIiIKKyAgICB3YXJuaW5ncy53YXJucHkzaygiSW4gMy54LCBvcy5wYXRoLndhbGsgaXMgcmVtb3ZlZCBpbiBmYXZvciBvZiBvcy53YWxrLiIsCisgICAgICAgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgIHRyeToKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRvcCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIHJldHVybgorICAgIGZ1bmMoYXJnLCB0b3AsIG5hbWVzKQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBuYW1lID0gam9pbih0b3AsIG5hbWUpCisgICAgICAgIGlmIGlzZGlyKG5hbWUpIGFuZCBub3QgaXNsaW5rKG5hbWUpOgorICAgICAgICAgICAgd2FsayhuYW1lLCBmdW5jLCBhcmcpCisKKworZGVmIGFic3BhdGgocGF0aCk6CisgICAgIiIiUmV0dXJuIGFuIGFic29sdXRlIHBhdGguIiIiCisgICAgaWYgbm90IGlzYWJzKHBhdGgpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpOgorICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkdSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICBwYXRoID0gam9pbihjd2QsIHBhdGgpCisgICAgcmV0dXJuIG5vcm1wYXRoKHBhdGgpCisKKyMgcmVhbHBhdGggaXMgYSBuby1vcCBvbiBzeXN0ZW1zIHdpdGhvdXQgaXNsaW5rIHN1cHBvcnQKK2RlZiByZWFscGF0aChwYXRoKToKKyAgICBwYXRoID0gYWJzcGF0aChwYXRoKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IENhcmJvbi5GaWxlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gcGF0aAorICAgIGlmIG5vdCBwYXRoOgorICAgICAgICByZXR1cm4gcGF0aAorICAgIGNvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCc6JykKKyAgICBwYXRoID0gY29tcG9uZW50c1swXSArICc6JworICAgIGZvciBjIGluIGNvbXBvbmVudHNbMTpdOgorICAgICAgICBwYXRoID0gam9pbihwYXRoLCBjKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXRoID0gQ2FyYm9uLkZpbGUuRlNSZXNvbHZlQWxpYXNGaWxlKHBhdGgsIDEpWzBdLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgZXhjZXB0IENhcmJvbi5GaWxlLkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgIHJldHVybiBwYXRoCisKK3N1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzID0gVHJ1ZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWNwYXRoLnB5YyBiL2xpYi9weXRob24yLjcvbWFjcGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwODFjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFjcGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWNwYXRoLnB5byBiL2xpYi9weXRob24yLjcvbWFjcGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwODFjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFjcGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWN1cmwycGF0aC5weSBiL2xpYi9weXRob24yLjcvbWFjdXJsMnBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM1YWU2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFjdXJsMnBhdGgucHkKQEAgLTAsMCArMSw5NyBAQAorIiIiTWFjaW50b3NoLXNwZWNpZmljIG1vZHVsZSBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIHBhdGhuYW1lcyBhbmQgVVJMcy4KKworRG8gbm90IGltcG9ydCBkaXJlY3RseTsgdXNlIHVybGxpYiBpbnN0ZWFkLiIiIgorCitpbXBvcnQgdXJsbGliCitpbXBvcnQgb3MKKworX19hbGxfXyA9IFsidXJsMnBhdGhuYW1lIiwicGF0aG5hbWUydXJsIl0KKworZGVmIHVybDJwYXRobmFtZShwYXRobmFtZSk6CisgICAgIiIiT1Mtc3BlY2lmaWMgY29udmVyc2lvbiBmcm9tIGEgcmVsYXRpdmUgVVJMIG9mIHRoZSAnZmlsZScgc2NoZW1lCisgICAgdG8gYSBmaWxlIHN5c3RlbSBwYXRoOyBub3QgcmVjb21tZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiIiIgorICAgICMKKyAgICAjIFhYWFggVGhlIC4uIGhhbmRsaW5nIHNob3VsZCBiZSBmaXhlZC4uLgorICAgICMKKyAgICB0cCA9IHVybGxpYi5zcGxpdHR5cGUocGF0aG5hbWUpWzBdCisgICAgaWYgdHAgYW5kIHRwICE9ICdmaWxlJzoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAnQ2Fubm90IGNvbnZlcnQgbm9uLWxvY2FsIFVSTCB0byBwYXRobmFtZScKKyAgICAjIFR1cm4gc3RhcnRpbmcgLy8vIGludG8gLywgYW4gZW1wdHkgaG9zdG5hbWUgbWVhbnMgY3VycmVudCBob3N0CisgICAgaWYgcGF0aG5hbWVbOjNdID09ICcvLy8nOgorICAgICAgICBwYXRobmFtZSA9IHBhdGhuYW1lWzI6XQorICAgIGVsaWYgcGF0aG5hbWVbOjJdID09ICcvLyc6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ0Nhbm5vdCBjb252ZXJ0IG5vbi1sb2NhbCBVUkwgdG8gcGF0aG5hbWUnCisgICAgY29tcG9uZW50cyA9IHBhdGhuYW1lLnNwbGl0KCcvJykKKyAgICAjIFJlbW92ZSAuIGFuZCBlbWJlZGRlZCAuLgorICAgIGkgPSAwCisgICAgd2hpbGUgaSA8IGxlbihjb21wb25lbnRzKToKKyAgICAgICAgaWYgY29tcG9uZW50c1tpXSA9PSAnLic6CisgICAgICAgICAgICBkZWwgY29tcG9uZW50c1tpXQorICAgICAgICBlbGlmIGNvbXBvbmVudHNbaV0gPT0gJy4uJyBhbmQgaSA+IDAgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzW2ktMV0gbm90IGluICgnJywgJy4uJyk6CisgICAgICAgICAgICBkZWwgY29tcG9uZW50c1tpLTE6aSsxXQorICAgICAgICAgICAgaSA9IGktMQorICAgICAgICBlbGlmIGNvbXBvbmVudHNbaV0gPT0gJycgYW5kIGkgPiAwIGFuZCBjb21wb25lbnRzW2ktMV0gIT0gJyc6CisgICAgICAgICAgICBkZWwgY29tcG9uZW50c1tpXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSA9IGkrMQorICAgIGlmIG5vdCBjb21wb25lbnRzWzBdOgorICAgICAgICAjIEFic29sdXRlIHVuaXggcGF0aCwgZG9uJ3Qgc3RhcnQgd2l0aCBjb2xvbgorICAgICAgICBydiA9ICc6Jy5qb2luKGNvbXBvbmVudHNbMTpdKQorICAgIGVsc2U6CisgICAgICAgICMgcmVsYXRpdmUgdW5peCBwYXRoLCBzdGFydCB3aXRoIGNvbG9uLiBGaXJzdCByZXBsYWNlCisgICAgICAgICMgbGVhZGluZyAuLiBieSBlbXB0eSBzdHJpbmdzIChnaXZpbmcgOjpmaWxlKQorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSBpIDwgbGVuKGNvbXBvbmVudHMpIGFuZCBjb21wb25lbnRzW2ldID09ICcuLic6CisgICAgICAgICAgICBjb21wb25lbnRzW2ldID0gJycKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICBydiA9ICc6JyArICc6Jy5qb2luKGNvbXBvbmVudHMpCisgICAgIyBhbmQgZmluYWxseSB1bnF1b3RlIHNsYXNoZXMgYW5kIG90aGVyIGZ1bm55IGNoYXJhY3RlcnMKKyAgICByZXR1cm4gdXJsbGliLnVucXVvdGUocnYpCisKK2RlZiBwYXRobmFtZTJ1cmwocGF0aG5hbWUpOgorICAgICIiIk9TLXNwZWNpZmljIGNvbnZlcnNpb24gZnJvbSBhIGZpbGUgc3lzdGVtIHBhdGggdG8gYSByZWxhdGl2ZSBVUkwKKyAgICBvZiB0aGUgJ2ZpbGUnIHNjaGVtZTsgbm90IHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZS4iIiIKKyAgICBpZiAnLycgaW4gcGF0aG5hbWU6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IHBhdGhuYW1lIGNvbnRhaW5pbmcgc2xhc2hlcyIKKyAgICBjb21wb25lbnRzID0gcGF0aG5hbWUuc3BsaXQoJzonKQorICAgICMgUmVtb3ZlIGVtcHR5IGZpcnN0IGFuZC9vciBsYXN0IGNvbXBvbmVudAorICAgIGlmIGNvbXBvbmVudHNbMF0gPT0gJyc6CisgICAgICAgIGRlbCBjb21wb25lbnRzWzBdCisgICAgaWYgY29tcG9uZW50c1stMV0gPT0gJyc6CisgICAgICAgIGRlbCBjb21wb25lbnRzWy0xXQorICAgICMgUmVwbGFjZSBlbXB0eSBzdHJpbmcgKCc6OicpIGJ5IC4uICh3aWxsIHJlc3VsdCBpbiAnLy4uLycgbGF0ZXIpCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNvbXBvbmVudHMpKToKKyAgICAgICAgaWYgY29tcG9uZW50c1tpXSA9PSAnJzoKKyAgICAgICAgICAgIGNvbXBvbmVudHNbaV0gPSAnLi4nCisgICAgIyBUcnVuY2F0ZSBuYW1lcyBsb25nZXIgdGhhbiAzMSBieXRlcworICAgIGNvbXBvbmVudHMgPSBtYXAoX3BuY29tcDJ1cmwsIGNvbXBvbmVudHMpCisKKyAgICBpZiBvcy5wYXRoLmlzYWJzKHBhdGhuYW1lKToKKyAgICAgICAgcmV0dXJuICcvJyArICcvJy5qb2luKGNvbXBvbmVudHMpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICcvJy5qb2luKGNvbXBvbmVudHMpCisKK2RlZiBfcG5jb21wMnVybChjb21wb25lbnQpOgorICAgIGNvbXBvbmVudCA9IHVybGxpYi5xdW90ZShjb21wb25lbnRbOjMxXSwgc2FmZT0nJykgICMgV2Ugd2FudCB0byBxdW90ZSBzbGFzaGVzCisgICAgcmV0dXJuIGNvbXBvbmVudAorCitkZWYgdGVzdCgpOgorICAgIGZvciB1cmwgaW4gWyJpbmRleC5odG1sIiwKKyAgICAgICAgICAgICAgICAiYmFyL2luZGV4Lmh0bWwiLAorICAgICAgICAgICAgICAgICIvZm9vL2Jhci9pbmRleC5odG1sIiwKKyAgICAgICAgICAgICAgICAiL2Zvby9iYXIvIiwKKyAgICAgICAgICAgICAgICAiLyJdOgorICAgICAgICBwcmludCAnJXIgLT4gJXInICUgKHVybCwgdXJsMnBhdGhuYW1lKHVybCkpCisgICAgZm9yIHBhdGggaW4gWyJkcml2ZToiLAorICAgICAgICAgICAgICAgICAiZHJpdmU6ZGlyOiIsCisgICAgICAgICAgICAgICAgICJkcml2ZTpkaXI6ZmlsZSIsCisgICAgICAgICAgICAgICAgICJkcml2ZTpmaWxlIiwKKyAgICAgICAgICAgICAgICAgImZpbGUiLAorICAgICAgICAgICAgICAgICAiOmZpbGUiLAorICAgICAgICAgICAgICAgICAiOmRpcjoiLAorICAgICAgICAgICAgICAgICAiOmRpcjpmaWxlIl06CisgICAgICAgIHByaW50ICclciAtPiAlcicgJSAocGF0aCwgcGF0aG5hbWUydXJsKHBhdGgpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWN1cmwycGF0aC5weWMgYi9saWIvcHl0aG9uMi43L21hY3VybDJwYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU3M2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYWN1cmwycGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWN1cmwycGF0aC5weW8gYi9saWIvcHl0aG9uMi43L21hY3VybDJwYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU3M2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tYWN1cmwycGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWlsYm94LnB5IGIvbGliL3B5dGhvbjIuNy9tYWlsYm94LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMGQzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21haWxib3gucHkKQEAgLTAsMCArMSwyMjMwIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlJlYWQvd3JpdGUgc3VwcG9ydCBmb3IgTWFpbGRpciwgbWJveCwgTUgsIEJhYnlsLCBhbmQgTU1ERiBtYWlsYm94ZXMuIiIiCisKKyMgTm90ZXMgZm9yIGF1dGhvcnMgb2YgbmV3IG1haWxib3ggc3ViY2xhc3NlczoKKyMKKyMgUmVtZW1iZXIgdG8gZnN5bmMoKSBjaGFuZ2VzIHRvIGRpc2sgYmVmb3JlIGNsb3NpbmcgYSBtb2RpZmllZCBmaWxlCisjIG9yIHJldHVybmluZyBmcm9tIGEgZmx1c2goKSBtZXRob2QuICBTZWUgZnVuY3Rpb25zIF9zeW5jX2ZsdXNoKCkgYW5kCisjIF9zeW5jX2Nsb3NlKCkuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2ltcG9ydCBjYWxlbmRhcgoraW1wb3J0IHNvY2tldAoraW1wb3J0IGVycm5vCitpbXBvcnQgY29weQoraW1wb3J0IGVtYWlsCitpbXBvcnQgZW1haWwubWVzc2FnZQoraW1wb3J0IGVtYWlsLmdlbmVyYXRvcgoraW1wb3J0IFN0cmluZ0lPCit0cnk6CisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdvczJlbXgnOgorICAgICAgICAjIE9TLzIgRU1YIGZjbnRsKCkgbm90IGFkZXF1YXRlCisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisgICAgaW1wb3J0IGZjbnRsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZmNudGwgPSBOb25lCisKK2ltcG9ydCB3YXJuaW5ncword2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgIGlmIHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKnJmYzgyMiBoYXMgYmVlbiByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIGltcG9ydCByZmM4MjIKKworX19hbGxfXyA9IFsgJ01haWxib3gnLCAnTWFpbGRpcicsICdtYm94JywgJ01IJywgJ0JhYnlsJywgJ01NREYnLAorICAgICAgICAgICAgJ01lc3NhZ2UnLCAnTWFpbGRpck1lc3NhZ2UnLCAnbWJveE1lc3NhZ2UnLCAnTUhNZXNzYWdlJywKKyAgICAgICAgICAgICdCYWJ5bE1lc3NhZ2UnLCAnTU1ERk1lc3NhZ2UnLCAnVW5peE1haWxib3gnLAorICAgICAgICAgICAgJ1BvcnRhYmxlVW5peE1haWxib3gnLCAnTW1kZk1haWxib3gnLCAnTUhNYWlsYm94JywgJ0JhYnlsTWFpbGJveCcgXQorCitjbGFzcyBNYWlsYm94OgorICAgICIiIkEgZ3JvdXAgb2YgbWVzc2FnZXMgaW4gYSBwYXJ0aWN1bGFyIHBsYWNlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZSwgY3JlYXRlPVRydWUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgTWFpbGJveCBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5fcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmV4cGFuZHVzZXIocGF0aCkpCisgICAgICAgIHNlbGYuX2ZhY3RvcnkgPSBmYWN0b3J5CisKKyAgICBkZWYgYWRkKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJBZGQgbWVzc2FnZSBhbmQgcmV0dXJuIGFzc2lnbmVkIGtleS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZW1vdmUgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBzZWxmLnJlbW92ZShrZXkpCisKKyAgICBkZWYgZGlzY2FyZChzZWxmLCBrZXkpOgorICAgICAgICAiIiJJZiB0aGUga2V5ZWQgbWVzc2FnZSBleGlzdHMsIHJlbW92ZSBpdC4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZW1vdmUoa2V5KQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBtZXNzYWdlKToKKyAgICAgICAgIiIiUmVwbGFjZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUga2V5ZWQgbWVzc2FnZSwgb3IgZGVmYXVsdCBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2dldGl0ZW1fXyhrZXkpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fZmFjdG9yeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldF9tZXNzYWdlKGtleSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9mYWN0b3J5KHNlbGYuZ2V0X2ZpbGUoa2V5KSkKKworICAgIGRlZiBnZXRfbWVzc2FnZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBnZXRfc3RyaW5nKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgZ2V0X2ZpbGUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIga2V5cy4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Yga2V5cy4iIiIKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVya2V5cygpKQorCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIGFsbCBtZXNzYWdlcy4iIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLml0ZXJrZXlzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWllbGQgdmFsdWUKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXRlcnZhbHVlcygpCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIG1lc3NhZ2VzLiBNZW1vcnkgaW50ZW5zaXZlLiIiIgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJ2YWx1ZXMoKSkKKworICAgIGRlZiBpdGVyaXRlbXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIChrZXksIG1lc3NhZ2UpIHR1cGxlcy4iIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLml0ZXJrZXlzKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2tleV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgeWllbGQgKGtleSwgdmFsdWUpCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgKGtleSwgbWVzc2FnZSkgdHVwbGVzLiBNZW1vcnkgaW50ZW5zaXZlLiIiIgorICAgICAgICByZXR1cm4gbGlzdChzZWxmLml0ZXJpdGVtcygpKQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIGtleWVkIG1lc3NhZ2UgZXhpc3RzLCBGYWxzZSBvdGhlcndpc2UuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFzX2tleShrZXkpCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgY291bnQgb2YgbWVzc2FnZXMgaW4gdGhlIG1haWxib3guIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgIiIiRGVsZXRlIGFsbCBtZXNzYWdlcy4iIiIKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLml0ZXJrZXlzKCk6CisgICAgICAgICAgICBzZWxmLmRpc2NhcmQoa2V5KQorCisgICAgZGVmIHBvcChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIkRlbGV0ZSB0aGUga2V5ZWQgbWVzc2FnZSBhbmQgcmV0dXJuIGl0LCBvciBkZWZhdWx0LiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgc2VsZi5kaXNjYXJkKGtleSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHBvcGl0ZW0oc2VsZik6CisgICAgICAgICIiIkRlbGV0ZSBhbiBhcmJpdHJhcnkgKGtleSwgbWVzc2FnZSkgcGFpciBhbmQgcmV0dXJuIGl0LiIiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuaXRlcmtleXMoKToKKyAgICAgICAgICAgIHJldHVybiAoa2V5LCBzZWxmLnBvcChrZXkpKSAgICAgIyBUaGlzIGlzIG9ubHkgcnVuIG9uY2UuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8gbWVzc2FnZXMgaW4gbWFpbGJveCcpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYsIGFyZz1Ob25lKToKKyAgICAgICAgIiIiQ2hhbmdlIHRoZSBtZXNzYWdlcyB0aGF0IGNvcnJlc3BvbmQgdG8gY2VydGFpbiBrZXlzLiIiIgorICAgICAgICBpZiBoYXNhdHRyKGFyZywgJ2l0ZXJpdGVtcycpOgorICAgICAgICAgICAgc291cmNlID0gYXJnLml0ZXJpdGVtcygpCisgICAgICAgIGVsaWYgaGFzYXR0cihhcmcsICdpdGVtcycpOgorICAgICAgICAgICAgc291cmNlID0gYXJnLml0ZW1zKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNvdXJjZSA9IGFyZworICAgICAgICBiYWRfa2V5ID0gRmFsc2UKKyAgICAgICAgZm9yIGtleSwgbWVzc2FnZSBpbiBzb3VyY2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZltrZXldID0gbWVzc2FnZQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGJhZF9rZXkgPSBUcnVlCisgICAgICAgIGlmIGJhZF9rZXk6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8gbWVzc2FnZSB3aXRoIGtleShzKScpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIldyaXRlIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gdGhlIGRpc2suIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ01ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzJykKKworICAgIGRlZiBsb2NrKHNlbGYpOgorICAgICAgICAiIiJMb2NrIHRoZSBtYWlsYm94LiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgdW5sb2NrKHNlbGYpOgorICAgICAgICAiIiJVbmxvY2sgdGhlIG1haWxib3ggaWYgaXQgaXMgbG9ja2VkLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCdNZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzcycpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkZsdXNoIGFuZCBjbG9zZSB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignTWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3MnKQorCisgICAgIyBXaGV0aGVyIGVhY2ggbWVzc2FnZSBtdXN0IGVuZCBpbiBhIG5ld2xpbmUKKyAgICBfYXBwZW5kX25ld2xpbmUgPSBGYWxzZQorCisgICAgZGVmIF9kdW1wX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSwgdGFyZ2V0LCBtYW5nbGVfZnJvbV89RmFsc2UpOgorICAgICAgICAjIE1vc3QgZmlsZXMgYXJlIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSB0byBhbGxvdyBwcmVkaWN0YWJsZSBzZWVraW5nLgorICAgICAgICAjIFRvIGdldCBuYXRpdmUgbGluZSBlbmRpbmdzIG9uIGRpc2ssIHRoZSB1c2VyLWZyaWVuZGx5IFxuIGxpbmUgZW5kaW5ncworICAgICAgICAjIHVzZWQgaW4gc3RyaW5ncyBhbmQgYnkgZW1haWwuTWVzc2FnZSBhcmUgdHJhbnNsYXRlZCBoZXJlLgorICAgICAgICAiIiJEdW1wIG1lc3NhZ2UgY29udGVudHMgdG8gdGFyZ2V0IGZpbGUuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgZW1haWwubWVzc2FnZS5NZXNzYWdlKToKKyAgICAgICAgICAgIGJ1ZmZlciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIGdlbiA9IGVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3IoYnVmZmVyLCBtYW5nbGVfZnJvbV8sIDApCisgICAgICAgICAgICBnZW4uZmxhdHRlbihtZXNzYWdlKQorICAgICAgICAgICAgYnVmZmVyLnNlZWsoMCkKKyAgICAgICAgICAgIGRhdGEgPSBidWZmZXIucmVhZCgpLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkKKyAgICAgICAgICAgIHRhcmdldC53cml0ZShkYXRhKQorICAgICAgICAgICAgaWYgc2VsZi5fYXBwZW5kX25ld2xpbmUgYW5kIG5vdCBkYXRhLmVuZHN3aXRoKG9zLmxpbmVzZXApOgorICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGVuZHMgd2l0aCBhIG5ld2xpbmUKKyAgICAgICAgICAgICAgICB0YXJnZXQud3JpdGUob3MubGluZXNlcCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIHN0cik6CisgICAgICAgICAgICBpZiBtYW5nbGVfZnJvbV86CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2UucmVwbGFjZSgnXG5Gcm9tICcsICdcbj5Gcm9tICcpCisgICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApCisgICAgICAgICAgICB0YXJnZXQud3JpdGUobWVzc2FnZSkKKyAgICAgICAgICAgIGlmIHNlbGYuX2FwcGVuZF9uZXdsaW5lIGFuZCBub3QgbWVzc2FnZS5lbmRzd2l0aChvcy5saW5lc2VwKToKKyAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgbWVzc2FnZSBlbmRzIHdpdGggYSBuZXdsaW5lCisgICAgICAgICAgICAgICAgdGFyZ2V0LndyaXRlKG9zLmxpbmVzZXApCisgICAgICAgIGVsaWYgaGFzYXR0cihtZXNzYWdlLCAncmVhZCcpOgorICAgICAgICAgICAgbGFzdGxpbmUgPSBOb25lCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBtZXNzYWdlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG1hbmdsZV9mcm9tXyBhbmQgbGluZS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gJz5Gcm9tICcgKyBsaW5lWzU6XQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkKKyAgICAgICAgICAgICAgICB0YXJnZXQud3JpdGUobGluZSkKKyAgICAgICAgICAgICAgICBsYXN0bGluZSA9IGxpbmUKKyAgICAgICAgICAgIGlmIHNlbGYuX2FwcGVuZF9uZXdsaW5lIGFuZCBsYXN0bGluZSBhbmQgbm90IGxhc3RsaW5lLmVuZHN3aXRoKG9zLmxpbmVzZXApOgorICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBtZXNzYWdlIGVuZHMgd2l0aCBhIG5ld2xpbmUKKyAgICAgICAgICAgICAgICB0YXJnZXQud3JpdGUob3MubGluZXNlcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignSW52YWxpZCBtZXNzYWdlIHR5cGU6ICVzJyAlIHR5cGUobWVzc2FnZSkpCisKKworY2xhc3MgTWFpbGRpcihNYWlsYm94KToKKyAgICAiIiJBIHFtYWlsLXN0eWxlIE1haWxkaXIgbWFpbGJveC4iIiIKKworICAgIGNvbG9uID0gJzonCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlybmFtZSwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSwgY3JlYXRlPVRydWUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgTWFpbGRpciBpbnN0YW5jZS4iIiIKKyAgICAgICAgTWFpbGJveC5fX2luaXRfXyhzZWxmLCBkaXJuYW1lLCBmYWN0b3J5LCBjcmVhdGUpCisgICAgICAgIHNlbGYuX3BhdGhzID0geworICAgICAgICAgICAgJ3RtcCc6IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAndG1wJyksCisgICAgICAgICAgICAnbmV3Jzogb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICduZXcnKSwKKyAgICAgICAgICAgICdjdXInOiBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2N1cicpLAorICAgICAgICAgICAgfQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5fcGF0aCk6CisgICAgICAgICAgICBpZiBjcmVhdGU6CisgICAgICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5fcGF0aCwgMDcwMCkKKyAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLl9wYXRocy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgb3MubWtkaXIocGF0aCwgMG83MDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vU3VjaE1haWxib3hFcnJvcihzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLl90b2MgPSB7fQorICAgICAgICBzZWxmLl90b2NfbXRpbWVzID0geydjdXInOiAwLCAnbmV3JzogMH0KKyAgICAgICAgc2VsZi5fbGFzdF9yZWFkID0gMCAgICAgICAgICMgUmVjb3JkcyBsYXN0IHRpbWUgd2UgcmVhZCBjdXIvbmV3CisgICAgICAgIHNlbGYuX3NrZXdmYWN0b3IgPSAwLjEgICAgICAjIEFkanVzdCBpZiBvcy9mcyBjbG9ja3MgYXJlIHNrZXdpbmcKKworICAgIGRlZiBhZGQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkFkZCBtZXNzYWdlIGFuZCByZXR1cm4gYXNzaWduZWQga2V5LiIiIgorICAgICAgICB0bXBfZmlsZSA9IHNlbGYuX2NyZWF0ZV90bXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9kdW1wX21lc3NhZ2UobWVzc2FnZSwgdG1wX2ZpbGUpCisgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgdG1wX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRtcF9maWxlLm5hbWUpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBfc3luY19jbG9zZSh0bXBfZmlsZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBzdWJkaXIgPSBtZXNzYWdlLmdldF9zdWJkaXIoKQorICAgICAgICAgICAgc3VmZml4ID0gc2VsZi5jb2xvbiArIG1lc3NhZ2UuZ2V0X2luZm8oKQorICAgICAgICAgICAgaWYgc3VmZml4ID09IHNlbGYuY29sb246CisgICAgICAgICAgICAgICAgc3VmZml4ID0gJycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1YmRpciA9ICduZXcnCisgICAgICAgICAgICBzdWZmaXggPSAnJworICAgICAgICB1bmlxID0gb3MucGF0aC5iYXNlbmFtZSh0bXBfZmlsZS5uYW1lKS5zcGxpdChzZWxmLmNvbG9uKVswXQorICAgICAgICBkZXN0ID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YmRpciwgdW5pcSArIHN1ZmZpeCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgJ2xpbmsnKToKKyAgICAgICAgICAgICAgICBvcy5saW5rKHRtcF9maWxlLm5hbWUsIGRlc3QpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRtcF9maWxlLm5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLnJlbmFtZSh0bXBfZmlsZS5uYW1lLCBkZXN0KQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0bXBfZmlsZS5uYW1lKQorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdOYW1lIGNsYXNoIHdpdGggZXhpc3RpbmcgbWVzc2FnZTogJXMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgZGVzdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBvcy51dGltZShkZXN0LCAob3MucGF0aC5nZXRhdGltZShkZXN0KSwgbWVzc2FnZS5nZXRfZGF0ZSgpKSkKKyAgICAgICAgcmV0dXJuIHVuaXEKKworICAgIGRlZiByZW1vdmUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHNlbGYuX2xvb2t1cChrZXkpKSkKKworICAgIGRlZiBkaXNjYXJkKHNlbGYsIGtleSk6CisgICAgICAgICIiIklmIHRoZSBrZXllZCBtZXNzYWdlIGV4aXN0cywgcmVtb3ZlIGl0LiIiIgorICAgICAgICAjIFRoaXMgb3ZlcnJpZGVzIGFuIGluYXBwbGljYWJsZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgc3VwZXJjbGFzcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZW1vdmUoa2V5KQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIG1lc3NhZ2UpOgorICAgICAgICAiIiJSZXBsYWNlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBvbGRfc3VicGF0aCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHRlbXBfa2V5ID0gc2VsZi5hZGQobWVzc2FnZSkKKyAgICAgICAgdGVtcF9zdWJwYXRoID0gc2VsZi5fbG9va3VwKHRlbXBfa2V5KQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1haWxkaXJNZXNzYWdlKToKKyAgICAgICAgICAgICMgdGVtcCdzIHN1YmRpciBhbmQgc3VmZml4IHdlcmUgc3BlY2lmaWVkIGJ5IG1lc3NhZ2UuCisgICAgICAgICAgICBkb21pbmFudF9zdWJwYXRoID0gdGVtcF9zdWJwYXRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRlbXAncyBzdWJkaXIgYW5kIHN1ZmZpeCB3ZXJlIGRlZmF1bHRzIGZyb20gYWRkKCkuCisgICAgICAgICAgICBkb21pbmFudF9zdWJwYXRoID0gb2xkX3N1YnBhdGgKKyAgICAgICAgc3ViZGlyID0gb3MucGF0aC5kaXJuYW1lKGRvbWluYW50X3N1YnBhdGgpCisgICAgICAgIGlmIHNlbGYuY29sb24gaW4gZG9taW5hbnRfc3VicGF0aDoKKyAgICAgICAgICAgIHN1ZmZpeCA9IHNlbGYuY29sb24gKyBkb21pbmFudF9zdWJwYXRoLnNwbGl0KHNlbGYuY29sb24pWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3VmZml4ID0gJycKKyAgICAgICAgc2VsZi5kaXNjYXJkKGtleSkKKyAgICAgICAgbmV3X3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyLCBrZXkgKyBzdWZmaXgpCisgICAgICAgIG9zLnJlbmFtZShvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgdGVtcF9zdWJwYXRoKSwgbmV3X3BhdGgpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgb3MudXRpbWUobmV3X3BhdGgsIChvcy5wYXRoLmdldGF0aW1lKG5ld19wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRfZGF0ZSgpKSkKKworICAgIGRlZiBnZXRfbWVzc2FnZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHN1YnBhdGggPSBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3VicGF0aCksICdyJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fZmFjdG9yeToKKyAgICAgICAgICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1zZyA9IE1haWxkaXJNZXNzYWdlKGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc3ViZGlyLCBuYW1lID0gb3MucGF0aC5zcGxpdChzdWJwYXRoKQorICAgICAgICBtc2cuc2V0X3N1YmRpcihzdWJkaXIpCisgICAgICAgIGlmIHNlbGYuY29sb24gaW4gbmFtZToKKyAgICAgICAgICAgIG1zZy5zZXRfaW5mbyhuYW1lLnNwbGl0KHNlbGYuY29sb24pWy0xXSkKKyAgICAgICAgbXNnLnNldF9kYXRlKG9zLnBhdGguZ2V0bXRpbWUob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YnBhdGgpKSkKKyAgICAgICAgcmV0dXJuIG1zZworCisgICAgZGVmIGdldF9zdHJpbmcoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzZWxmLl9sb29rdXAoa2V5KSksICdyJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBnZXRfZmlsZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHNlbGYuX2xvb2t1cChrZXkpKSwgJ3JiJykKKyAgICAgICAgcmV0dXJuIF9Qcm94eUZpbGUoZikKKworICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIga2V5cy4iIiIKKyAgICAgICAgc2VsZi5fcmVmcmVzaCgpCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fdG9jOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHlpZWxkIGtleQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIGtleWVkIG1lc3NhZ2UgZXhpc3RzLCBGYWxzZSBvdGhlcndpc2UuIiIiCisgICAgICAgIHNlbGYuX3JlZnJlc2goKQorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3RvYworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGNvdW50IG9mIG1lc3NhZ2VzIGluIHRoZSBtYWlsYm94LiIiIgorICAgICAgICBzZWxmLl9yZWZyZXNoKCkKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl90b2MpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIldyaXRlIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gZGlzay4iIiIKKyAgICAgICAgIyBNYWlsZGlyIGNoYW5nZXMgYXJlIGFsd2F5cyB3cml0dGVuIGltbWVkaWF0ZWx5LCBzbyB0aGVyZSdzIG5vdGhpbmcKKyAgICAgICAgIyB0byBkby4KKyAgICAgICAgcGFzcworCisgICAgZGVmIGxvY2soc2VsZik6CisgICAgICAgICIiIkxvY2sgdGhlIG1haWxib3guIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIHVubG9jayhzZWxmKToKKyAgICAgICAgIiIiVW5sb2NrIHRoZSBtYWlsYm94IGlmIGl0IGlzIGxvY2tlZC4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkZsdXNoIGFuZCBjbG9zZSB0aGUgbWFpbGJveC4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgbGlzdF9mb2xkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGZvbGRlciBuYW1lcy4iIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIoc2VsZi5fcGF0aCk6CisgICAgICAgICAgICBpZiBsZW4oZW50cnkpID4gMSBhbmQgZW50cnlbMF0gPT0gJy4nIGFuZCBcCisgICAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBlbnRyeSkpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZW50cnlbMTpdKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0X2ZvbGRlcihzZWxmLCBmb2xkZXIpOgorICAgICAgICAiIiJSZXR1cm4gYSBNYWlsZGlyIGluc3RhbmNlIGZvciB0aGUgbmFtZWQgZm9sZGVyLiIiIgorICAgICAgICByZXR1cm4gTWFpbGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy4nICsgZm9sZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yeT1zZWxmLl9mYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGU9RmFsc2UpCisKKyAgICBkZWYgYWRkX2ZvbGRlcihzZWxmLCBmb2xkZXIpOgorICAgICAgICAiIiJDcmVhdGUgYSBmb2xkZXIgYW5kIHJldHVybiBhIE1haWxkaXIgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGl0LiIiIgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuJyArIGZvbGRlcikKKyAgICAgICAgcmVzdWx0ID0gTWFpbGRpcihwYXRoLCBmYWN0b3J5PXNlbGYuX2ZhY3RvcnkpCisgICAgICAgIG1haWxkaXJmb2xkZXJfcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnbWFpbGRpcmZvbGRlcicpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhtYWlsZGlyZm9sZGVyX3BhdGgpOgorICAgICAgICAgICAgb3MuY2xvc2Uob3Mub3BlbihtYWlsZGlyZm9sZGVyX3BhdGgsIG9zLk9fQ1JFQVQgfCBvcy5PX1dST05MWSwKKyAgICAgICAgICAgICAgICAwNjY2KSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHJlbW92ZV9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSBuYW1lZCBmb2xkZXIsIHdoaWNoIG11c3QgYmUgZW1wdHkuIiIiCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJy4nICsgZm9sZGVyKQorICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4ocGF0aCwgJ25ldycpKSArIFwKKyAgICAgICAgICAgICAgICAgICAgIG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBhdGgsICdjdXInKSk6CisgICAgICAgICAgICBpZiBsZW4oZW50cnkpIDwgMSBvciBlbnRyeVswXSAhPSAnLic6CisgICAgICAgICAgICAgICAgcmFpc2UgTm90RW1wdHlFcnJvcignRm9sZGVyIGNvbnRhaW5zIG1lc3NhZ2Uocyk6ICVzJyAlIGZvbGRlcikKKyAgICAgICAgZm9yIGVudHJ5IGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICBpZiBlbnRyeSAhPSAnbmV3JyBhbmQgZW50cnkgIT0gJ2N1cicgYW5kIGVudHJ5ICE9ICd0bXAnIGFuZCBcCisgICAgICAgICAgICAgICBvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihwYXRoLCBlbnRyeSkpOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEVtcHR5RXJyb3IoIkZvbGRlciBjb250YWlucyBzdWJkaXJlY3RvcnkgJyVzJzogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb2xkZXIsIGVudHJ5KSkKKyAgICAgICAgZm9yIHJvb3QsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsocGF0aCwgdG9wZG93bj1GYWxzZSk6CisgICAgICAgICAgICBmb3IgZW50cnkgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihyb290LCBlbnRyeSkpCisgICAgICAgICAgICBmb3IgZW50cnkgaW4gZGlyczoKKyAgICAgICAgICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4ocm9vdCwgZW50cnkpKQorICAgICAgICBvcy5ybWRpcihwYXRoKQorCisgICAgZGVmIGNsZWFuKHNlbGYpOgorICAgICAgICAiIiJEZWxldGUgb2xkIGZpbGVzIGluICJ0bXAiLiIiIgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcpKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcsIGVudHJ5KQorICAgICAgICAgICAgaWYgbm93IC0gb3MucGF0aC5nZXRhdGltZShwYXRoKSA+IDEyOTYwMDogICAjIDYwICogNjAgKiAzNgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorCisgICAgX2NvdW50ID0gMSAgIyBUaGlzIGlzIHVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIGZpbGUgbmFtZXMuCisKKyAgICBkZWYgX2NyZWF0ZV90bXAoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBhIGZpbGUgaW4gdGhlIHRtcCBzdWJkaXJlY3RvcnkgYW5kIG9wZW4gYW5kIHJldHVybiBpdC4iIiIKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgaG9zdG5hbWUgPSBzb2NrZXQuZ2V0aG9zdG5hbWUoKQorICAgICAgICBpZiAnLycgaW4gaG9zdG5hbWU6CisgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoJy8nLCByJ1wwNTcnKQorICAgICAgICBpZiAnOicgaW4gaG9zdG5hbWU6CisgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoJzonLCByJ1wwNzInKQorICAgICAgICB1bmlxID0gIiVzLk0lc1Alc1Elcy4lcyIgJSAoaW50KG5vdyksIGludChub3cgJSAxICogMWU2KSwgb3MuZ2V0cGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWlsZGlyLl9jb3VudCwgaG9zdG5hbWUpCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ3RtcCcsIHVuaXEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnN0YXQocGF0aCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICBNYWlsZGlyLl9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2NyZWF0ZV9jYXJlZnVsbHkocGF0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FRVhJU1Q6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICMgRmFsbCB0aHJvdWdoIHRvIGhlcmUgaWYgc3RhdCBzdWNjZWVkZWQgb3Igb3BlbiByYWlzZWQgRUVYSVNULgorICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ05hbWUgY2xhc2ggcHJldmVudGVkIGZpbGUgY3JlYXRpb246ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKQorCisgICAgZGVmIF9yZWZyZXNoKHNlbGYpOgorICAgICAgICAiIiJVcGRhdGUgdGFibGUgb2YgY29udGVudHMgbWFwcGluZy4iIiIKKyAgICAgICAgIyBJZiBpdCBoYXMgYmVlbiBsZXNzIHRoYW4gdHdvIHNlY29uZHMgc2luY2UgdGhlIGxhc3QgX3JlZnJlc2goKSBjYWxsLAorICAgICAgICAjIHdlIGhhdmUgdG8gdW5jb25kaXRpb25hbGx5IHJlLXJlYWQgdGhlIG1haWxib3gganVzdCBpbiBjYXNlIGl0IGhhcworICAgICAgICAjIGJlZW4gbW9kaWZpZWQsIGJlY2F1c2Ugb3MucGF0aC5tdGltZSgpIGhhcyBhIDIgc2VjIHJlc29sdXRpb24gaW4gdGhlCisgICAgICAgICMgbW9zdCBjb21tb24gd29yc3QgY2FzZSAoRkFUKSBhbmQgYSAxIHNlYyByZXNvbHV0aW9uIHR5cGljYWxseS4gIFRoaXMKKyAgICAgICAgIyByZXN1bHRzIGluIGEgZmV3IHVubmVjZXNzYXJ5IHJlLXJlYWRzIHdoZW4gX3JlZnJlc2goKSBpcyBjYWxsZWQKKyAgICAgICAgIyBtdWx0aXBsZSB0aW1lcyBpbiB0aGF0IGludGVydmFsLCBidXQgb25jZSB0aGUgY2xvY2sgdGlja3Mgb3Zlciwgd2UKKyAgICAgICAgIyB3aWxsIG9ubHkgcmUtcmVhZCBhcyBuZWVkZWQuICBCZWNhdXNlIHRoZSBmaWxlc3lzdGVtIG1pZ2h0IGJlIGJlaW5nCisgICAgICAgICMgc2VydmVkIGJ5IGFuIGluZGVwZW5kZW50IHN5c3RlbSB3aXRoIGl0cyBvd24gY2xvY2ssIHdlIHJlY29yZCBhbmQKKyAgICAgICAgIyBjb21wYXJlIHdpdGggdGhlIG10aW1lcyBmcm9tIHRoZSBmaWxlc3lzdGVtLiAgQmVjYXVzZSB0aGUgb3RoZXIKKyAgICAgICAgIyBzeXN0ZW0ncyBjbG9jayBtaWdodCBiZSBza2V3aW5nIHJlbGF0aXZlIHRvIG91ciBjbG9jaywgd2UgYWRkIGFuCisgICAgICAgICMgZXh0cmEgZGVsdGEgdG8gb3VyIHdhaXQuICBUaGUgZGVmYXVsdCBpcyBvbmUgdGVudGggc2Vjb25kLCBidXQgaXMgYW4KKyAgICAgICAgIyBpbnN0YW5jZSB2YXJpYWJsZSBhbmQgc28gY2FuIGJlIGFkanVzdGVkIGlmIGRlYWxpbmcgd2l0aCBhCisgICAgICAgICMgcGFydGljdWxhcmx5IHNrZXdlZCBvciBpcnJlZ3VsYXIgc3lzdGVtLgorICAgICAgICBpZiB0aW1lLnRpbWUoKSAtIHNlbGYuX2xhc3RfcmVhZCA+IDIgKyBzZWxmLl9za2V3ZmFjdG9yOgorICAgICAgICAgICAgcmVmcmVzaCA9IEZhbHNlCisgICAgICAgICAgICBmb3Igc3ViZGlyIGluIHNlbGYuX3RvY19tdGltZXM6CisgICAgICAgICAgICAgICAgbXRpbWUgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYuX3BhdGhzW3N1YmRpcl0pCisgICAgICAgICAgICAgICAgaWYgbXRpbWUgPiBzZWxmLl90b2NfbXRpbWVzW3N1YmRpcl06CisgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5fdG9jX210aW1lc1tzdWJkaXJdID0gbXRpbWUKKyAgICAgICAgICAgIGlmIG5vdCByZWZyZXNoOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFJlZnJlc2ggdG9jCisgICAgICAgIHNlbGYuX3RvYyA9IHt9CisgICAgICAgIGZvciBzdWJkaXIgaW4gc2VsZi5fdG9jX210aW1lczoKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLl9wYXRoc1tzdWJkaXJdCisgICAgICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgICAgICBwID0gb3MucGF0aC5qb2luKHBhdGgsIGVudHJ5KQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocCk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdW5pcSA9IGVudHJ5LnNwbGl0KHNlbGYuY29sb24pWzBdCisgICAgICAgICAgICAgICAgc2VsZi5fdG9jW3VuaXFdID0gb3MucGF0aC5qb2luKHN1YmRpciwgZW50cnkpCisgICAgICAgIHNlbGYuX2xhc3RfcmVhZCA9IHRpbWUudGltZSgpCisKKyAgICBkZWYgX2xvb2t1cChzZWxmLCBrZXkpOgorICAgICAgICAiIiJVc2UgVE9DIHRvIHJldHVybiBzdWJwYXRoIGZvciBnaXZlbiBrZXksIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzZWxmLl90b2Nba2V5XSkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl90b2Nba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuX3JlZnJlc2goKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdG9jW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKworICAgICMgVGhpcyBtZXRob2QgaXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seS4KKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IG1lc3NhZ2UgaW4gYSBvbmUtdGltZSBpdGVyYXRpb24uIiIiCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdfb25ldGltZV9rZXlzJyk6CisgICAgICAgICAgICBzZWxmLl9vbmV0aW1lX2tleXMgPSBzZWxmLml0ZXJrZXlzKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZltzZWxmLl9vbmV0aW1lX2tleXMubmV4dCgpXQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisKK2NsYXNzIF9zaW5nbGVmaWxlTWFpbGJveChNYWlsYm94KToKKyAgICAiIiJBIHNpbmdsZS1maWxlIG1haWxib3guIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBzaW5nbGUtZmlsZSBtYWlsYm94LiIiIgorICAgICAgICBNYWlsYm94Ll9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3RvcnksIGNyZWF0ZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5fcGF0aCwgJ3JiKycpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgaWYgY3JlYXRlOgorICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihzZWxmLl9wYXRoLCAnd2IrJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOb1N1Y2hNYWlsYm94RXJyb3Ioc2VsZi5fcGF0aCkKKyAgICAgICAgICAgIGVsaWYgZS5lcnJubyBpbiAoZXJybm8uRUFDQ0VTLCBlcnJuby5FUk9GUyk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5fcGF0aCwgJ3JiJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5fZmlsZSA9IGYKKyAgICAgICAgc2VsZi5fdG9jID0gTm9uZQorICAgICAgICBzZWxmLl9uZXh0X2tleSA9IDAKKyAgICAgICAgc2VsZi5fcGVuZGluZyA9IEZhbHNlICAgICAgICMgTm8gY2hhbmdlcyByZXF1aXJlIHJld3JpdGluZyB0aGUgZmlsZS4KKyAgICAgICAgc2VsZi5fcGVuZGluZ19zeW5jID0gRmFsc2UgICMgTm8gbmVlZCB0byBzeW5jIHRoZSBmaWxlCisgICAgICAgIHNlbGYuX2xvY2tlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuX2ZpbGVfbGVuZ3RoID0gTm9uZSAgICAjIFVzZWQgdG8gcmVjb3JkIG1haWxib3ggc2l6ZQorCisgICAgZGVmIGFkZChzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQWRkIG1lc3NhZ2UgYW5kIHJldHVybiBhc3NpZ25lZCBrZXkuIiIiCisgICAgICAgIHNlbGYuX2xvb2t1cCgpCisgICAgICAgIHNlbGYuX3RvY1tzZWxmLl9uZXh0X2tleV0gPSBzZWxmLl9hcHBlbmRfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICBzZWxmLl9uZXh0X2tleSArPSAxCisgICAgICAgICMgX2FwcGVuZF9tZXNzYWdlIGFwcGVuZHMgdGhlIG1lc3NhZ2UgdG8gdGhlIG1haWxib3ggZmlsZS4gV2UKKyAgICAgICAgIyBkb24ndCBuZWVkIGEgZnVsbCByZXdyaXRlICsgcmVuYW1lLCBzeW5jIGlzIGVub3VnaC4KKyAgICAgICAgc2VsZi5fcGVuZGluZ19zeW5jID0gVHJ1ZQorICAgICAgICByZXR1cm4gc2VsZi5fbmV4dF9rZXkgLSAxCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgZGVsIHNlbGYuX3RvY1trZXldCisgICAgICAgIHNlbGYuX3BlbmRpbmcgPSBUcnVlCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBtZXNzYWdlKToKKyAgICAgICAgIiIiUmVwbGFjZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgc2VsZi5fdG9jW2tleV0gPSBzZWxmLl9hcHBlbmRfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICBzZWxmLl9wZW5kaW5nID0gVHJ1ZQorCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBrZXlzLiIiIgorICAgICAgICBzZWxmLl9sb29rdXAoKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX3RvYy5rZXlzKCk6CisgICAgICAgICAgICB5aWVsZCBrZXkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBUcnVlIGlmIHRoZSBrZXllZCBtZXNzYWdlIGV4aXN0cywgRmFsc2Ugb3RoZXJ3aXNlLiIiIgorICAgICAgICBzZWxmLl9sb29rdXAoKQorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3RvYworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGNvdW50IG9mIG1lc3NhZ2VzIGluIHRoZSBtYWlsYm94LiIiIgorICAgICAgICBzZWxmLl9sb29rdXAoKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX3RvYykKKworICAgIGRlZiBsb2NrKHNlbGYpOgorICAgICAgICAiIiJMb2NrIHRoZSBtYWlsYm94LiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgX2xvY2tfZmlsZShzZWxmLl9maWxlKQorICAgICAgICAgICAgc2VsZi5fbG9ja2VkID0gVHJ1ZQorCisgICAgZGVmIHVubG9jayhzZWxmKToKKyAgICAgICAgIiIiVW5sb2NrIHRoZSBtYWlsYm94IGlmIGl0IGlzIGxvY2tlZC4iIiIKKyAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgX3VubG9ja19maWxlKHNlbGYuX2ZpbGUpCisgICAgICAgICAgICBzZWxmLl9sb2NrZWQgPSBGYWxzZQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSBhbnkgcGVuZGluZyBjaGFuZ2VzIHRvIGRpc2suIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9wZW5kaW5nOgorICAgICAgICAgICAgaWYgc2VsZi5fcGVuZGluZ19zeW5jOgorICAgICAgICAgICAgICAgICMgTWVzc2FnZXMgaGF2ZSBvbmx5IGJlZW4gYWRkZWQsIHNvIHN5bmNpbmcgdGhlIGZpbGUKKyAgICAgICAgICAgICAgICAjIGlzIGVub3VnaC4KKyAgICAgICAgICAgICAgICBfc3luY19mbHVzaChzZWxmLl9maWxlKQorICAgICAgICAgICAgICAgIHNlbGYuX3BlbmRpbmdfc3luYyA9IEZhbHNlCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEluIG9yZGVyIHRvIGJlIHdyaXRpbmcgYW55dGhpbmcgb3V0IGF0IGFsbCwgc2VsZi5fdG9jIG11c3QKKyAgICAgICAgIyBhbHJlYWR5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgKGFuZCBwcmVzdW1hYmx5IGhhcyBiZWVuIG1vZGlmaWVkCisgICAgICAgICMgYnkgYWRkaW5nIG9yIGRlbGV0aW5nIGFuIGl0ZW0pLgorICAgICAgICBhc3NlcnQgc2VsZi5fdG9jIGlzIG5vdCBOb25lCisKKyAgICAgICAgIyBDaGVjayBsZW5ndGggb2Ygc2VsZi5fZmlsZTsgaWYgaXQncyBjaGFuZ2VkLCBzb21lIG90aGVyIHByb2Nlc3MKKyAgICAgICAgIyBoYXMgbW9kaWZpZWQgdGhlIG1haWxib3ggc2luY2Ugd2Ugc2Nhbm5lZCBpdC4KKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDAsIDIpCisgICAgICAgIGN1cl9sZW4gPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBpZiBjdXJfbGVuICE9IHNlbGYuX2ZpbGVfbGVuZ3RoOgorICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdTaXplIG9mIG1haWxib3ggZmlsZSBjaGFuZ2VkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKGV4cGVjdGVkICVpLCBmb3VuZCAlaSknICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fZmlsZV9sZW5ndGgsIGN1cl9sZW4pKQorCisgICAgICAgIG5ld19maWxlID0gX2NyZWF0ZV90ZW1wb3Jhcnkoc2VsZi5fcGF0aCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV3X3RvYyA9IHt9CisgICAgICAgICAgICBzZWxmLl9wcmVfbWFpbGJveF9ob29rKG5ld19maWxlKQorICAgICAgICAgICAgZm9yIGtleSBpbiBzb3J0ZWQoc2VsZi5fdG9jLmtleXMoKSk6CisgICAgICAgICAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLl90b2Nba2V5XQorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzdGFydCkKKyAgICAgICAgICAgICAgICBzZWxmLl9wcmVfbWVzc2FnZV9ob29rKG5ld19maWxlKQorICAgICAgICAgICAgICAgIG5ld19zdGFydCA9IG5ld19maWxlLnRlbGwoKQorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IHNlbGYuX2ZpbGUucmVhZChtaW4oNDA5NiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wIC0gc2VsZi5fZmlsZS50ZWxsKCkpKQorICAgICAgICAgICAgICAgICAgICBpZiBidWZmZXIgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBuZXdfZmlsZS53cml0ZShidWZmZXIpCisgICAgICAgICAgICAgICAgbmV3X3RvY1trZXldID0gKG5ld19zdGFydCwgbmV3X2ZpbGUudGVsbCgpKQorICAgICAgICAgICAgICAgIHNlbGYuX3Bvc3RfbWVzc2FnZV9ob29rKG5ld19maWxlKQorICAgICAgICAgICAgc2VsZi5fZmlsZV9sZW5ndGggPSBuZXdfZmlsZS50ZWxsKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgbmV3X2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKG5ld19maWxlLm5hbWUpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBfc3luY19jbG9zZShuZXdfZmlsZSkKKyAgICAgICAgIyBzZWxmLl9maWxlIGlzIGFib3V0IHRvIGdldCByZXBsYWNlZCwgc28gbm8gbmVlZCB0byBzeW5jLgorICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIG5ldyBmaWxlJ3MgbW9kZSBpcyB0aGUgc2FtZSBhcyB0aGUgb2xkIGZpbGUncworICAgICAgICBtb2RlID0gb3Muc3RhdChzZWxmLl9wYXRoKS5zdF9tb2RlCisgICAgICAgIG9zLmNobW9kKG5ld19maWxlLm5hbWUsIG1vZGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbmFtZShuZXdfZmlsZS5uYW1lLCBzZWxmLl9wYXRoKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUIG9yIFwKKyAgICAgICAgICAgICAgKG9zLm5hbWUgPT0gJ29zMicgYW5kIGUuZXJybm8gPT0gZXJybm8uRUFDQ0VTKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5fcGF0aCkKKyAgICAgICAgICAgICAgICBvcy5yZW5hbWUobmV3X2ZpbGUubmFtZSwgc2VsZi5fcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgc2VsZi5fZmlsZSA9IG9wZW4oc2VsZi5fcGF0aCwgJ3JiKycpCisgICAgICAgIHNlbGYuX3RvYyA9IG5ld190b2MKKyAgICAgICAgc2VsZi5fcGVuZGluZyA9IEZhbHNlCisgICAgICAgIHNlbGYuX3BlbmRpbmdfc3luYyA9IEZhbHNlCisgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIF9sb2NrX2ZpbGUoc2VsZi5fZmlsZSwgZG90bG9jaz1GYWxzZSkKKworICAgIGRlZiBfcHJlX21haWxib3hfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIHRoZSBtYWlsYm94IHRvIGZpbGUgZi4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX3ByZV9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBiZWZvcmUgd3JpdGluZyBlYWNoIG1lc3NhZ2UgdG8gZmlsZSBmLiIiIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBfcG9zdF9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBhZnRlciB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbmQgY2xvc2UgdGhlIG1haWxib3guIiIiCisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICBzZWxmLnVubG9jaygpCisgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKSAgIyBTeW5jIGhhcyBiZWVuIGRvbmUgYnkgc2VsZi5mbHVzaCgpIGFib3ZlLgorCisgICAgZGVmIF9sb29rdXAoc2VsZiwga2V5PU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gKHN0YXJ0LCBzdG9wKSBvciByYWlzZSBLZXlFcnJvci4iIiIKKyAgICAgICAgaWYgc2VsZi5fdG9jIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9nZW5lcmF0ZV90b2MoKQorICAgICAgICBpZiBrZXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RvY1trZXldCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKworICAgIGRlZiBfYXBwZW5kX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkFwcGVuZCBtZXNzYWdlIHRvIG1haWxib3ggYW5kIHJldHVybiAoc3RhcnQsIHN0b3ApIG9mZnNldHMuIiIiCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwLCAyKQorICAgICAgICBiZWZvcmUgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBpZiBsZW4oc2VsZi5fdG9jKSA9PSAwIGFuZCBub3Qgc2VsZi5fcGVuZGluZzoKKyAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgZmlyc3QgbWVzc2FnZSwgYW5kIHRoZSBfcHJlX21haWxib3hfaG9vaworICAgICAgICAgICAgIyBoYXNuJ3QgeWV0IGJlZW4gY2FsbGVkLiBJZiBzZWxmLl9wZW5kaW5nIGlzIFRydWUsCisgICAgICAgICAgICAjIG1lc3NhZ2VzIGhhdmUgYmVlbiByZW1vdmVkLCBzbyBfcHJlX21haWxib3hfaG9vayBtdXN0CisgICAgICAgICAgICAjIGhhdmUgYmVlbiBjYWxsZWQgYWxyZWFkeS4KKyAgICAgICAgICAgIHNlbGYuX3ByZV9tYWlsYm94X2hvb2soc2VsZi5fZmlsZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcHJlX21lc3NhZ2VfaG9vayhzZWxmLl9maWxlKQorICAgICAgICAgICAgb2Zmc2V0cyA9IHNlbGYuX2luc3RhbGxfbWVzc2FnZShtZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5fcG9zdF9tZXNzYWdlX2hvb2soc2VsZi5fZmlsZSkKKyAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246CisgICAgICAgICAgICBzZWxmLl9maWxlLnRydW5jYXRlKGJlZm9yZSkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuX2ZpbGUuZmx1c2goKQorICAgICAgICBzZWxmLl9maWxlX2xlbmd0aCA9IHNlbGYuX2ZpbGUudGVsbCgpICAjIFJlY29yZCBjdXJyZW50IGxlbmd0aCBvZiBtYWlsYm94CisgICAgICAgIHJldHVybiBvZmZzZXRzCisKKworCitjbGFzcyBfbWJveE1NREYoX3NpbmdsZWZpbGVNYWlsYm94KToKKyAgICAiIiJBbiBtYm94IG9yIE1NREYgbWFpbGJveC4iIiIKKworICAgIF9tYW5nbGVfZnJvbV8gPSBUcnVlCisKKyAgICBkZWYgZ2V0X21lc3NhZ2Uoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzdGFydCkKKyAgICAgICAgZnJvbV9saW5lID0gc2VsZi5fZmlsZS5yZWFkbGluZSgpLnJlcGxhY2Uob3MubGluZXNlcCwgJycpCisgICAgICAgIHN0cmluZyA9IHNlbGYuX2ZpbGUucmVhZChzdG9wIC0gc2VsZi5fZmlsZS50ZWxsKCkpCisgICAgICAgIG1zZyA9IHNlbGYuX21lc3NhZ2VfZmFjdG9yeShzdHJpbmcucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSkKKyAgICAgICAgbXNnLnNldF9mcm9tKGZyb21fbGluZVs1Ol0pCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBnZXRfc3RyaW5nKHNlbGYsIGtleSwgZnJvbV89RmFsc2UpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLl9sb29rdXAoa2V5KQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoc3RhcnQpCisgICAgICAgIGlmIG5vdCBmcm9tXzoKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzdHJpbmcgPSBzZWxmLl9maWxlLnJlYWQoc3RvcCAtIHNlbGYuX2ZpbGUudGVsbCgpKQorICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJykKKworICAgIGRlZiBnZXRfZmlsZShzZWxmLCBrZXksIGZyb21fPUZhbHNlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgZmlsZS1saWtlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHN0YXJ0KQorICAgICAgICBpZiBub3QgZnJvbV86CisgICAgICAgICAgICBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgcmV0dXJuIF9QYXJ0aWFsRmlsZShzZWxmLl9maWxlLCBzZWxmLl9maWxlLnRlbGwoKSwgc3RvcCkKKworICAgIGRlZiBfaW5zdGFsbF9tZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJGb3JtYXQgYSBtZXNzYWdlIGFuZCBibGluZGx5IHdyaXRlIHRvIHNlbGYuX2ZpbGUuIiIiCisgICAgICAgIGZyb21fbGluZSA9IE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBzdHIpIGFuZCBtZXNzYWdlLnN0YXJ0c3dpdGgoJ0Zyb20gJyk6CisgICAgICAgICAgICBuZXdsaW5lID0gbWVzc2FnZS5maW5kKCdcbicpCisgICAgICAgICAgICBpZiBuZXdsaW5lICE9IC0xOgorICAgICAgICAgICAgICAgIGZyb21fbGluZSA9IG1lc3NhZ2VbOm5ld2xpbmVdCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VbbmV3bGluZSArIDE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmcm9tX2xpbmUgPSBtZXNzYWdlCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICcnCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBfbWJveE1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIGZyb21fbGluZSA9ICdGcm9tICcgKyBtZXNzYWdlLmdldF9mcm9tKCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICAgICAgICBmcm9tX2xpbmUgPSBtZXNzYWdlLmdldF91bml4ZnJvbSgpICAjIE1heSBiZSBOb25lLgorICAgICAgICBpZiBmcm9tX2xpbmUgaXMgTm9uZToKKyAgICAgICAgICAgIGZyb21fbGluZSA9ICdGcm9tIE1BSUxFUi1EQUVNT04gJXMnICUgdGltZS5hc2N0aW1lKHRpbWUuZ210aW1lKCkpCisgICAgICAgIHN0YXJ0ID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZShmcm9tX2xpbmUgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLl9kdW1wX21lc3NhZ2UobWVzc2FnZSwgc2VsZi5fZmlsZSwgc2VsZi5fbWFuZ2xlX2Zyb21fKQorICAgICAgICBzdG9wID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgcmV0dXJuIChzdGFydCwgc3RvcCkKKworCitjbGFzcyBtYm94KF9tYm94TU1ERik6CisgICAgIiIiQSBjbGFzc2ljIG1ib3ggbWFpbGJveC4iIiIKKworICAgIF9tYW5nbGVfZnJvbV8gPSBUcnVlCisKKyAgICAjIEFsbCBtZXNzYWdlcyBtdXN0IGVuZCBpbiBhIG5ld2xpbmUgY2hhcmFjdGVyLCBhbmQKKyAgICAjIF9wb3N0X21lc3NhZ2VfaG9va3Mgb3V0cHV0cyBhbiBlbXB0eSBsaW5lIGJldHdlZW4gbWVzc2FnZXMuCisgICAgX2FwcGVuZF9uZXdsaW5lID0gVHJ1ZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZSwgY3JlYXRlPVRydWUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIG1ib3ggbWFpbGJveC4iIiIKKyAgICAgICAgc2VsZi5fbWVzc2FnZV9mYWN0b3J5ID0gbWJveE1lc3NhZ2UKKyAgICAgICAgX21ib3hNTURGLl9faW5pdF9fKHNlbGYsIHBhdGgsIGZhY3RvcnksIGNyZWF0ZSkKKworICAgIGRlZiBfcG9zdF9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBhZnRlciB3cml0aW5nIGVhY2ggbWVzc2FnZSB0byBmaWxlIGYuIiIiCisgICAgICAgIGYud3JpdGUob3MubGluZXNlcCkKKworICAgIGRlZiBfZ2VuZXJhdGVfdG9jKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBrZXktdG8tKHN0YXJ0LCBzdG9wKSB0YWJsZSBvZiBjb250ZW50cy4iIiIKKyAgICAgICAgc3RhcnRzLCBzdG9wcyA9IFtdLCBbXQorICAgICAgICBsYXN0X3dhc19lbXB0eSA9IEZhbHNlCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZV9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgIGlmIGxlbihzdG9wcykgPCBsZW4oc3RhcnRzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbGFzdF93YXNfZW1wdHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdG9wcy5hcHBlbmQobGluZV9wb3MgLSBsZW4ob3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBsYXN0IGxpbmUgYmVmb3JlIHRoZSAiRnJvbSAiIGxpbmUgd2Fzbid0CisgICAgICAgICAgICAgICAgICAgICAgICAjIGJsYW5rLCBidXQgd2UgY29uc2lkZXIgaXQgYSBzdGFydCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAjIG1lc3NhZ2UgYW55d2F5LgorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zKQorICAgICAgICAgICAgICAgIHN0YXJ0cy5hcHBlbmQobGluZV9wb3MpCisgICAgICAgICAgICAgICAgbGFzdF93YXNfZW1wdHkgPSBGYWxzZQorICAgICAgICAgICAgZWxpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICBpZiBsYXN0X3dhc19lbXB0eToKKyAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zIC0gbGVuKG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcykKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBsaW5lID09IG9zLmxpbmVzZXA6CisgICAgICAgICAgICAgICAgbGFzdF93YXNfZW1wdHkgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxhc3Rfd2FzX2VtcHR5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5fdG9jID0gZGljdChlbnVtZXJhdGUoemlwKHN0YXJ0cywgc3RvcHMpKSkKKyAgICAgICAgc2VsZi5fbmV4dF9rZXkgPSBsZW4oc2VsZi5fdG9jKQorICAgICAgICBzZWxmLl9maWxlX2xlbmd0aCA9IHNlbGYuX2ZpbGUudGVsbCgpCisKKworY2xhc3MgTU1ERihfbWJveE1NREYpOgorICAgICIiIkFuIE1NREYgbWFpbGJveC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBNTURGIG1haWxib3guIiIiCisgICAgICAgIHNlbGYuX21lc3NhZ2VfZmFjdG9yeSA9IE1NREZNZXNzYWdlCisgICAgICAgIF9tYm94TU1ERi5fX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5LCBjcmVhdGUpCisKKyAgICBkZWYgX3ByZV9tZXNzYWdlX2hvb2soc2VsZiwgZik6CisgICAgICAgICIiIkNhbGxlZCBiZWZvcmUgd3JpdGluZyBlYWNoIG1lc3NhZ2UgdG8gZmlsZSBmLiIiIgorICAgICAgICBmLndyaXRlKCdcMDAxXDAwMVwwMDFcMDAxJyArIG9zLmxpbmVzZXApCisKKyAgICBkZWYgX3Bvc3RfbWVzc2FnZV9ob29rKHNlbGYsIGYpOgorICAgICAgICAiIiJDYWxsZWQgYWZ0ZXIgd3JpdGluZyBlYWNoIG1lc3NhZ2UgdG8gZmlsZSBmLiIiIgorICAgICAgICBmLndyaXRlKG9zLmxpbmVzZXAgKyAnXDAwMVwwMDFcMDAxXDAwMScgKyBvcy5saW5lc2VwKQorCisgICAgZGVmIF9nZW5lcmF0ZV90b2Moc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIGtleS10by0oc3RhcnQsIHN0b3ApIHRhYmxlIG9mIGNvbnRlbnRzLiIiIgorICAgICAgICBzdGFydHMsIHN0b3BzID0gW10sIFtdCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwKQorICAgICAgICBuZXh0X3BvcyA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmVfcG9zID0gbmV4dF9wb3MKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIG5leHRfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnXDAwMVwwMDFcMDAxXDAwMScgKyBvcy5saW5lc2VwKToKKyAgICAgICAgICAgICAgICBzdGFydHMuYXBwZW5kKG5leHRfcG9zKQorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGxpbmVfcG9zID0gbmV4dF9wb3MKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBuZXh0X3BvcyA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1wwMDFcMDAxXDAwMVwwMDEnICsgb3MubGluZXNlcDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcyAtIGxlbihvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsaWYgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5fdG9jID0gZGljdChlbnVtZXJhdGUoemlwKHN0YXJ0cywgc3RvcHMpKSkKKyAgICAgICAgc2VsZi5fbmV4dF9rZXkgPSBsZW4oc2VsZi5fdG9jKQorICAgICAgICBzZWxmLl9maWxlLnNlZWsoMCwgMikKKyAgICAgICAgc2VsZi5fZmlsZV9sZW5ndGggPSBzZWxmLl9maWxlLnRlbGwoKQorCisKK2NsYXNzIE1IKE1haWxib3gpOgorICAgICIiIkFuIE1IIG1haWxib3guIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lLCBjcmVhdGU9VHJ1ZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYW4gTUggaW5zdGFuY2UuIiIiCisgICAgICAgIE1haWxib3guX19pbml0X18oc2VsZiwgcGF0aCwgZmFjdG9yeSwgY3JlYXRlKQorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5fcGF0aCk6CisgICAgICAgICAgICBpZiBjcmVhdGU6CisgICAgICAgICAgICAgICAgb3MubWtkaXIoc2VsZi5fcGF0aCwgMDcwMCkKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShvcy5vcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19DUkVBVCB8IG9zLk9fRVhDTCB8IG9zLk9fV1JPTkxZLCAwNjAwKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgTm9TdWNoTWFpbGJveEVycm9yKHNlbGYuX3BhdGgpCisgICAgICAgIHNlbGYuX2xvY2tlZCA9IEZhbHNlCisKKyAgICBkZWYgYWRkKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJBZGQgbWVzc2FnZSBhbmQgcmV0dXJuIGFzc2lnbmVkIGtleS4iIiIKKyAgICAgICAga2V5cyA9IHNlbGYua2V5cygpCisgICAgICAgIGlmIGxlbihrZXlzKSA9PSAwOgorICAgICAgICAgICAgbmV3X2tleSA9IDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld19rZXkgPSBtYXgoa2V5cykgKyAxCisgICAgICAgIG5ld19wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihuZXdfa2V5KSkKKyAgICAgICAgZiA9IF9jcmVhdGVfY2FyZWZ1bGx5KG5ld19wYXRoKQorICAgICAgICBjbG9zZWQgPSBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgX2xvY2tfZmlsZShmKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZHVtcF9tZXNzYWdlKG1lc3NhZ2UsIGYpCisgICAgICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICMgVW5sb2NrIGFuZCBjbG9zZSBzbyBpdCBjYW4gYmUgZGVsZXRlZCBvbiBXaW5kb3dzCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQorICAgICAgICAgICAgICAgICAgICBfc3luY19jbG9zZShmKQorICAgICAgICAgICAgICAgICAgICBjbG9zZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShuZXdfcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1ITWVzc2FnZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2R1bXBfc2VxdWVuY2VzKG1lc3NhZ2UsIG5ld19rZXkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgX3VubG9ja19maWxlKGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgY2xvc2VkOgorICAgICAgICAgICAgICAgIF9zeW5jX2Nsb3NlKGYpCisgICAgICAgIHJldHVybiBuZXdfa2V5CisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJlbW92ZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3JiKycpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBtZXNzYWdlKToKKyAgICAgICAgIiIiUmVwbGFjZSB0aGUga2V5ZWQgbWVzc2FnZTsgcmFpc2UgS2V5RXJyb3IgaWYgaXQgZG9lc24ndCBleGlzdC4iIiIKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3JiKycpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoJ05vIG1lc3NhZ2Ugd2l0aCBrZXk6ICVzJyAlIGtleSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgIF9sb2NrX2ZpbGUoZikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShvcy5vcGVuKHBhdGgsIG9zLk9fV1JPTkxZIHwgb3MuT19UUlVOQykpCisgICAgICAgICAgICAgICAgc2VsZi5fZHVtcF9tZXNzYWdlKG1lc3NhZ2UsIGYpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNSE1lc3NhZ2UpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kdW1wX3NlcXVlbmNlcyhtZXNzYWdlLCBrZXkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgX3VubG9ja19maWxlKGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBfc3luY19jbG9zZShmKQorCisgICAgZGVmIGdldF9tZXNzYWdlKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIE1lc3NhZ2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksICdyKycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8gbWVzc2FnZSB3aXRoIGtleTogJXMnICUga2V5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgX2xvY2tfZmlsZShmKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1zZyA9IE1ITWVzc2FnZShmKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgICAgIF91bmxvY2tfZmlsZShmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZvciBuYW1lLCBrZXlfbGlzdCBpbiBzZWxmLmdldF9zZXF1ZW5jZXMoKS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleSBpbiBrZXlfbGlzdDoKKyAgICAgICAgICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKG5hbWUpCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBnZXRfc3RyaW5nKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9sb2NrZWQ6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwgJ3IrJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwgJ3InKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCdObyBtZXNzYWdlIHdpdGgga2V5OiAlcycgJSBrZXkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICBfbG9ja19maWxlKGYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgICAgICAgICAgX3VubG9ja19maWxlKGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBnZXRfZmlsZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwgJ3JiJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVOT0VOVDoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignTm8gbWVzc2FnZSB3aXRoIGtleTogJXMnICUga2V5KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gX1Byb3h5RmlsZShmKQorCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciBrZXlzLiIiIgorICAgICAgICByZXR1cm4gaXRlcihzb3J0ZWQoaW50KGVudHJ5KSBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihzZWxmLl9wYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnRyeS5pc2RpZ2l0KCkpKQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlIGtleWVkIG1lc3NhZ2UgZXhpc3RzLCBGYWxzZSBvdGhlcndpc2UuIiIiCisgICAgICAgIHJldHVybiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3RyKGtleSkpKQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGNvdW50IG9mIG1lc3NhZ2VzIGluIHRoZSBtYWlsYm94LiIiIgorICAgICAgICByZXR1cm4gbGVuKGxpc3Qoc2VsZi5pdGVya2V5cygpKSkKKworICAgIGRlZiBsb2NrKHNlbGYpOgorICAgICAgICAiIiJMb2NrIHRoZSBtYWlsYm94LiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgc2VsZi5fZmlsZSA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcubWhfc2VxdWVuY2VzJyksICdyYisnKQorICAgICAgICAgICAgX2xvY2tfZmlsZShzZWxmLl9maWxlKQorICAgICAgICAgICAgc2VsZi5fbG9ja2VkID0gVHJ1ZQorCisgICAgZGVmIHVubG9jayhzZWxmKToKKyAgICAgICAgIiIiVW5sb2NrIHRoZSBtYWlsYm94IGlmIGl0IGlzIGxvY2tlZC4iIiIKKyAgICAgICAgaWYgc2VsZi5fbG9ja2VkOgorICAgICAgICAgICAgX3VubG9ja19maWxlKHNlbGYuX2ZpbGUpCisgICAgICAgICAgICBfc3luY19jbG9zZShzZWxmLl9maWxlKQorICAgICAgICAgICAgZGVsIHNlbGYuX2ZpbGUKKyAgICAgICAgICAgIHNlbGYuX2xvY2tlZCA9IEZhbHNlCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICIiIldyaXRlIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gdGhlIGRpc2suIiIiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJGbHVzaCBhbmQgY2xvc2UgdGhlIG1haWxib3guIiIiCisgICAgICAgIGlmIHNlbGYuX2xvY2tlZDoKKyAgICAgICAgICAgIHNlbGYudW5sb2NrKCkKKworICAgIGRlZiBsaXN0X2ZvbGRlcnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZm9sZGVyIG5hbWVzLiIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgZW50cnkgaW4gb3MubGlzdGRpcihzZWxmLl9wYXRoKToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGVudHJ5KSk6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChlbnRyeSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGdldF9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIE1IIGluc3RhbmNlIGZvciB0aGUgbmFtZWQgZm9sZGVyLiIiIgorICAgICAgICByZXR1cm4gTUgob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIGZvbGRlciksCisgICAgICAgICAgICAgICAgICBmYWN0b3J5PXNlbGYuX2ZhY3RvcnksIGNyZWF0ZT1GYWxzZSkKKworICAgIGRlZiBhZGRfZm9sZGVyKHNlbGYsIGZvbGRlcik6CisgICAgICAgICIiIkNyZWF0ZSBhIGZvbGRlciBhbmQgcmV0dXJuIGFuIE1IIGluc3RhbmNlIHJlcHJlc2VudGluZyBpdC4iIiIKKyAgICAgICAgcmV0dXJuIE1IKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBmb2xkZXIpLAorICAgICAgICAgICAgICAgICAgZmFjdG9yeT1zZWxmLl9mYWN0b3J5KQorCisgICAgZGVmIHJlbW92ZV9mb2xkZXIoc2VsZiwgZm9sZGVyKToKKyAgICAgICAgIiIiRGVsZXRlIHRoZSBuYW1lZCBmb2xkZXIsIHdoaWNoIG11c3QgYmUgZW1wdHkuIiIiCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgZm9sZGVyKQorICAgICAgICBlbnRyaWVzID0gb3MubGlzdGRpcihwYXRoKQorICAgICAgICBpZiBlbnRyaWVzID09IFsnLm1oX3NlcXVlbmNlcyddOgorICAgICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihwYXRoLCAnLm1oX3NlcXVlbmNlcycpKQorICAgICAgICBlbGlmIGVudHJpZXMgPT0gW106CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBOb3RFbXB0eUVycm9yKCdGb2xkZXIgbm90IGVtcHR5OiAlcycgJSBzZWxmLl9wYXRoKQorICAgICAgICBvcy5ybWRpcihwYXRoKQorCisgICAgZGVmIGdldF9zZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIG5hbWUtdG8ta2V5LWxpc3QgZGljdGlvbmFyeSB0byBkZWZpbmUgZWFjaCBzZXF1ZW5jZS4iIiIKKyAgICAgICAgcmVzdWx0cyA9IHt9CisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcycpLCAncicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFsbF9rZXlzID0gc2V0KHNlbGYua2V5cygpKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG5hbWUsIGNvbnRlbnRzID0gbGluZS5zcGxpdCgnOicpCisgICAgICAgICAgICAgICAgICAgIGtleXMgPSBzZXQoKQorICAgICAgICAgICAgICAgICAgICBmb3Igc3BlYyBpbiBjb250ZW50cy5zcGxpdCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc3BlYy5pc2RpZ2l0KCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5hZGQoaW50KHNwZWMpKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCA9IChpbnQoeCkgZm9yIHggaW4gc3BlYy5zcGxpdCgnLScpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMudXBkYXRlKHJhbmdlKHN0YXJ0LCBzdG9wICsgMSkpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbbmFtZV0gPSBba2V5IGZvciBrZXkgaW4gc29ydGVkKGtleXMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYga2V5IGluIGFsbF9rZXlzXQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocmVzdWx0c1tuYW1lXSkgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCByZXN1bHRzW25hbWVdCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEZvcm1hdEVycm9yKCdJbnZhbGlkIHNlcXVlbmNlIHNwZWNpZmljYXRpb246ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUucnN0cmlwKCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdHMKKworICAgIGRlZiBzZXRfc2VxdWVuY2VzKHNlbGYsIHNlcXVlbmNlcyk6CisgICAgICAgICIiIlNldCBzZXF1ZW5jZXMgdXNpbmcgdGhlIGdpdmVuIG5hbWUtdG8ta2V5LWxpc3QgZGljdGlvbmFyeS4iIiIKKyAgICAgICAgZiA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcubWhfc2VxdWVuY2VzJyksICdyKycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmNsb3NlKG9zLm9wZW4oZi5uYW1lLCBvcy5PX1dST05MWSB8IG9zLk9fVFJVTkMpKQorICAgICAgICAgICAgZm9yIG5hbWUsIGtleXMgaW4gc2VxdWVuY2VzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGxlbihrZXlzKSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGYud3JpdGUoJyVzOicgJSBuYW1lKQorICAgICAgICAgICAgICAgIHByZXYgPSBOb25lCisgICAgICAgICAgICAgICAgY29tcGxldGluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBzb3J0ZWQoc2V0KGtleXMpKToKKyAgICAgICAgICAgICAgICAgICAgaWYga2V5IC0gMSA9PSBwcmV2OgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNvbXBsZXRpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGluZyA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCctJykKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBjb21wbGV0aW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCclcyAlcycgJSAocHJldiwga2V5KSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyAlcycgJSBrZXkpCisgICAgICAgICAgICAgICAgICAgIHByZXYgPSBrZXkKKyAgICAgICAgICAgICAgICBpZiBjb21wbGV0aW5nOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKHN0cihwcmV2KSArICdcbicpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSgnXG4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX3N5bmNfY2xvc2UoZikKKworICAgIGRlZiBwYWNrKHNlbGYpOgorICAgICAgICAiIiJSZS1uYW1lIG1lc3NhZ2VzIHRvIGVsaW1pbmF0ZSBudW1iZXJpbmcgZ2Fwcy4gSW52YWxpZGF0ZXMga2V5cy4iIiIKKyAgICAgICAgc2VxdWVuY2VzID0gc2VsZi5nZXRfc2VxdWVuY2VzKCkKKyAgICAgICAgcHJldiA9IDAKKyAgICAgICAgY2hhbmdlcyA9IFtdCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5pdGVya2V5cygpOgorICAgICAgICAgICAgaWYga2V5IC0gMSAhPSBwcmV2OgorICAgICAgICAgICAgICAgIGNoYW5nZXMuYXBwZW5kKChrZXksIHByZXYgKyAxKSkKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpOgorICAgICAgICAgICAgICAgICAgICBvcy5saW5rKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIoa2V5KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihwcmV2ICsgMSkpKQorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIocHJldiArIDEpKSkKKyAgICAgICAgICAgIHByZXYgKz0gMQorICAgICAgICBzZWxmLl9uZXh0X2tleSA9IHByZXYgKyAxCisgICAgICAgIGlmIGxlbihjaGFuZ2VzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZvciBuYW1lLCBrZXlfbGlzdCBpbiBzZXF1ZW5jZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGZvciBvbGQsIG5ldyBpbiBjaGFuZ2VzOgorICAgICAgICAgICAgICAgIGlmIG9sZCBpbiBrZXlfbGlzdDoKKyAgICAgICAgICAgICAgICAgICAga2V5X2xpc3Rba2V5X2xpc3QuaW5kZXgob2xkKV0gPSBuZXcKKyAgICAgICAgc2VsZi5zZXRfc2VxdWVuY2VzKHNlcXVlbmNlcykKKworICAgIGRlZiBfZHVtcF9zZXF1ZW5jZXMoc2VsZiwgbWVzc2FnZSwga2V5KToKKyAgICAgICAgIiIiSW5zcGVjdCBhIG5ldyBNSE1lc3NhZ2UgYW5kIHVwZGF0ZSBzZXF1ZW5jZXMgYXBwcm9wcmlhdGVseS4iIiIKKyAgICAgICAgcGVuZGluZ19zZXF1ZW5jZXMgPSBtZXNzYWdlLmdldF9zZXF1ZW5jZXMoKQorICAgICAgICBhbGxfc2VxdWVuY2VzID0gc2VsZi5nZXRfc2VxdWVuY2VzKCkKKyAgICAgICAgZm9yIG5hbWUsIGtleV9saXN0IGluIGFsbF9zZXF1ZW5jZXMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lIGluIHBlbmRpbmdfc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIGtleV9saXN0LmFwcGVuZChrZXkpCisgICAgICAgICAgICBlbGlmIGtleSBpbiBrZXlfbGlzdDoKKyAgICAgICAgICAgICAgICBkZWwga2V5X2xpc3Rba2V5X2xpc3QuaW5kZXgoa2V5KV0KKyAgICAgICAgZm9yIHNlcXVlbmNlIGluIHBlbmRpbmdfc2VxdWVuY2VzOgorICAgICAgICAgICAgaWYgc2VxdWVuY2Ugbm90IGluIGFsbF9zZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgYWxsX3NlcXVlbmNlc1tzZXF1ZW5jZV0gPSBba2V5XQorICAgICAgICBzZWxmLnNldF9zZXF1ZW5jZXMoYWxsX3NlcXVlbmNlcykKKworCitjbGFzcyBCYWJ5bChfc2luZ2xlZmlsZU1haWxib3gpOgorICAgICIiIkFuIFJtYWlsLXN0eWxlIEJhYnlsIG1haWxib3guIiIiCisKKyAgICBfc3BlY2lhbF9sYWJlbHMgPSBmcm96ZW5zZXQoKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9yd2FyZGVkJywgJ2VkaXRlZCcsICdyZXNlbnQnKSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmUsIGNyZWF0ZT1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIEJhYnlsIG1haWxib3guIiIiCisgICAgICAgIF9zaW5nbGVmaWxlTWFpbGJveC5fX2luaXRfXyhzZWxmLCBwYXRoLCBmYWN0b3J5LCBjcmVhdGUpCisgICAgICAgIHNlbGYuX2xhYmVscyA9IHt9CisKKyAgICBkZWYgYWRkKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJBZGQgbWVzc2FnZSBhbmQgcmV0dXJuIGFzc2lnbmVkIGtleS4iIiIKKyAgICAgICAga2V5ID0gX3NpbmdsZWZpbGVNYWlsYm94LmFkZChzZWxmLCBtZXNzYWdlKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIEJhYnlsTWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLl9sYWJlbHNba2V5XSA9IG1lc3NhZ2UuZ2V0X2xhYmVscygpCisgICAgICAgIHJldHVybiBrZXkKKworICAgIGRlZiByZW1vdmUoc2VsZiwga2V5KToKKyAgICAgICAgIiIiUmVtb3ZlIHRoZSBrZXllZCBtZXNzYWdlOyByYWlzZSBLZXlFcnJvciBpZiBpdCBkb2Vzbid0IGV4aXN0LiIiIgorICAgICAgICBfc2luZ2xlZmlsZU1haWxib3gucmVtb3ZlKHNlbGYsIGtleSkKKyAgICAgICAgaWYga2V5IGluIHNlbGYuX2xhYmVsczoKKyAgICAgICAgICAgIGRlbCBzZWxmLl9sYWJlbHNba2V5XQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgbWVzc2FnZSk6CisgICAgICAgICIiIlJlcGxhY2UgdGhlIGtleWVkIG1lc3NhZ2U7IHJhaXNlIEtleUVycm9yIGlmIGl0IGRvZXNuJ3QgZXhpc3QuIiIiCisgICAgICAgIF9zaW5nbGVmaWxlTWFpbGJveC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIG1lc3NhZ2UpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgQmFieWxNZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuX2xhYmVsc1trZXldID0gbWVzc2FnZS5nZXRfbGFiZWxzKCkKKworICAgIGRlZiBnZXRfbWVzc2FnZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBNZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9yIHJhaXNlIGEgS2V5RXJyb3IuIiIiCisgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZi5fbG9va3VwKGtleSkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHN0YXJ0KQorICAgICAgICBzZWxmLl9maWxlLnJlYWRsaW5lKCkgICAjIFNraXAgJzEsJyBsaW5lIHNwZWNpZnlpbmcgbGFiZWxzLgorICAgICAgICBvcmlnaW5hbF9oZWFkZXJzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZSA9PSAnKioqIEVPT0ggKioqJyArIG9zLmxpbmVzZXAgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgb3JpZ2luYWxfaGVhZGVycy53cml0ZShsaW5lLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJykpCisgICAgICAgIHZpc2libGVfaGVhZGVycyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gb3MubGluZXNlcCBvciBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB2aXNpYmxlX2hlYWRlcnMud3JpdGUobGluZS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpKQorICAgICAgICBib2R5ID0gc2VsZi5fZmlsZS5yZWFkKHN0b3AgLSBzZWxmLl9maWxlLnRlbGwoKSkucmVwbGFjZShvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXG4nKQorICAgICAgICBtc2cgPSBCYWJ5bE1lc3NhZ2Uob3JpZ2luYWxfaGVhZGVycy5nZXR2YWx1ZSgpICsgYm9keSkKKyAgICAgICAgbXNnLnNldF92aXNpYmxlKHZpc2libGVfaGVhZGVycy5nZXR2YWx1ZSgpKQorICAgICAgICBpZiBrZXkgaW4gc2VsZi5fbGFiZWxzOgorICAgICAgICAgICAgbXNnLnNldF9sYWJlbHMoc2VsZi5fbGFiZWxzW2tleV0pCisgICAgICAgIHJldHVybiBtc2cKKworICAgIGRlZiBnZXRfc3RyaW5nKHNlbGYsIGtleSk6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciByYWlzZSBhIEtleUVycm9yLiIiIgorICAgICAgICBzdGFydCwgc3RvcCA9IHNlbGYuX2xvb2t1cChrZXkpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzdGFydCkKKyAgICAgICAgc2VsZi5fZmlsZS5yZWFkbGluZSgpICAgIyBTa2lwICcxLCcgbGluZSBzcGVjaWZ5aW5nIGxhYmVscy4KKyAgICAgICAgb3JpZ2luYWxfaGVhZGVycyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG9yaWdpbmFsX2hlYWRlcnMud3JpdGUobGluZS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbGluZSA9PSBvcy5saW5lc2VwIG9yIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIG9yaWdpbmFsX2hlYWRlcnMuZ2V0dmFsdWUoKSArIFwKKyAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUucmVhZChzdG9wIC0gc2VsZi5fZmlsZS50ZWxsKCkpLnJlcGxhY2Uob3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xuJykKKworICAgIGRlZiBnZXRfZmlsZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBmaWxlLWxpa2UgcmVwcmVzZW50YXRpb24gb3IgcmFpc2UgYSBLZXlFcnJvci4iIiIKKyAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPKHNlbGYuZ2V0X3N0cmluZyhrZXkpLnJlcGxhY2UoJ1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubGluZXNlcCkpCisKKyAgICBkZWYgZ2V0X2xhYmVscyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiB1c2VyLWRlZmluZWQgbGFiZWxzIGluIHRoZSBtYWlsYm94LiIiIgorICAgICAgICBzZWxmLl9sb29rdXAoKQorICAgICAgICBsYWJlbHMgPSBzZXQoKQorICAgICAgICBmb3IgbGFiZWxfbGlzdCBpbiBzZWxmLl9sYWJlbHMudmFsdWVzKCk6CisgICAgICAgICAgICBsYWJlbHMudXBkYXRlKGxhYmVsX2xpc3QpCisgICAgICAgIGxhYmVscy5kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLl9zcGVjaWFsX2xhYmVscykKKyAgICAgICAgcmV0dXJuIGxpc3QobGFiZWxzKQorCisgICAgZGVmIF9nZW5lcmF0ZV90b2Moc2VsZik6CisgICAgICAgICIiIkdlbmVyYXRlIGtleS10by0oc3RhcnQsIHN0b3ApIHRhYmxlIG9mIGNvbnRlbnRzLiIiIgorICAgICAgICBzdGFydHMsIHN0b3BzID0gW10sIFtdCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwKQorICAgICAgICBuZXh0X3BvcyA9IDAKKyAgICAgICAgbGFiZWxfbGlzdHMgPSBbXQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbGluZV9wb3MgPSBuZXh0X3BvcworICAgICAgICAgICAgbGluZSA9IHNlbGYuX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgbmV4dF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICAgICAgaWYgbGluZSA9PSAnXDAzN1wwMTQnICsgb3MubGluZXNlcDoKKyAgICAgICAgICAgICAgICBpZiBsZW4oc3RvcHMpIDwgbGVuKHN0YXJ0cyk6CisgICAgICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcyAtIGxlbihvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBzdGFydHMuYXBwZW5kKG5leHRfcG9zKQorICAgICAgICAgICAgICAgIGxhYmVscyA9IFtsYWJlbC5zdHJpcCgpIGZvciBsYWJlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNlbGYuX2ZpbGUucmVhZGxpbmUoKVsxOl0uc3BsaXQoJywnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxhYmVsLnN0cmlwKCkgIT0gJyddCisgICAgICAgICAgICAgICAgbGFiZWxfbGlzdHMuYXBwZW5kKGxhYmVscykKKyAgICAgICAgICAgIGVsaWYgbGluZSA9PSAnXDAzNycgb3IgbGluZSA9PSAnXDAzNycgKyBvcy5saW5lc2VwOgorICAgICAgICAgICAgICAgIGlmIGxlbihzdG9wcykgPCBsZW4oc3RhcnRzKToKKyAgICAgICAgICAgICAgICAgICAgc3RvcHMuYXBwZW5kKGxpbmVfcG9zIC0gbGVuKG9zLmxpbmVzZXApKQorICAgICAgICAgICAgZWxpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgIHN0b3BzLmFwcGVuZChsaW5lX3BvcyAtIGxlbihvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLl90b2MgPSBkaWN0KGVudW1lcmF0ZSh6aXAoc3RhcnRzLCBzdG9wcykpKQorICAgICAgICBzZWxmLl9sYWJlbHMgPSBkaWN0KGVudW1lcmF0ZShsYWJlbF9saXN0cykpCisgICAgICAgIHNlbGYuX25leHRfa2V5ID0gbGVuKHNlbGYuX3RvYykKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKDAsIDIpCisgICAgICAgIHNlbGYuX2ZpbGVfbGVuZ3RoID0gc2VsZi5fZmlsZS50ZWxsKCkKKworICAgIGRlZiBfcHJlX21haWxib3hfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGJlZm9yZSB3cml0aW5nIHRoZSBtYWlsYm94IHRvIGZpbGUgZi4iIiIKKyAgICAgICAgZi53cml0ZSgnQkFCWUwgT1BUSU9OUzolc1ZlcnNpb246IDUlc0xhYmVsczolcyVzXDAzNycgJQorICAgICAgICAgICAgICAgIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLCAnLCcuam9pbihzZWxmLmdldF9sYWJlbHMoKSksCisgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorCisgICAgZGVmIF9wcmVfbWVzc2FnZV9ob29rKHNlbGYsIGYpOgorICAgICAgICAiIiJDYWxsZWQgYmVmb3JlIHdyaXRpbmcgZWFjaCBtZXNzYWdlIHRvIGZpbGUgZi4iIiIKKyAgICAgICAgZi53cml0ZSgnXDAxNCcgKyBvcy5saW5lc2VwKQorCisgICAgZGVmIF9wb3N0X21lc3NhZ2VfaG9vayhzZWxmLCBmKToKKyAgICAgICAgIiIiQ2FsbGVkIGFmdGVyIHdyaXRpbmcgZWFjaCBtZXNzYWdlIHRvIGZpbGUgZi4iIiIKKyAgICAgICAgZi53cml0ZShvcy5saW5lc2VwICsgJ1wwMzcnKQorCisgICAgZGVmIF9pbnN0YWxsX21lc3NhZ2Uoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIldyaXRlIG1lc3NhZ2UgY29udGVudHMgYW5kIHJldHVybiAoc3RhcnQsIHN0b3ApLiIiIgorICAgICAgICBzdGFydCA9IHNlbGYuX2ZpbGUudGVsbCgpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgQmFieWxNZXNzYWdlKToKKyAgICAgICAgICAgIHNwZWNpYWxfbGFiZWxzID0gW10KKyAgICAgICAgICAgIGxhYmVscyA9IFtdCisgICAgICAgICAgICBmb3IgbGFiZWwgaW4gbWVzc2FnZS5nZXRfbGFiZWxzKCk6CisgICAgICAgICAgICAgICAgaWYgbGFiZWwgaW4gc2VsZi5fc3BlY2lhbF9sYWJlbHM6CisgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxfbGFiZWxzLmFwcGVuZChsYWJlbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKGxhYmVsKQorICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnMScpCisgICAgICAgICAgICBmb3IgbGFiZWwgaW4gc3BlY2lhbF9sYWJlbHM6CisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnLCAnICsgbGFiZWwpCisgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcsLCcpCisgICAgICAgICAgICBmb3IgbGFiZWwgaW4gbGFiZWxzOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyAnICsgbGFiZWwgKyAnLCcpCisgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKG9zLmxpbmVzZXApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcxLCwnICsgb3MubGluZXNlcCkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAgICAgb3JpZ19idWZmZXIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBvcmlnX2dlbmVyYXRvciA9IGVtYWlsLmdlbmVyYXRvci5HZW5lcmF0b3Iob3JpZ19idWZmZXIsIEZhbHNlLCAwKQorICAgICAgICAgICAgb3JpZ19nZW5lcmF0b3IuZmxhdHRlbihtZXNzYWdlKQorICAgICAgICAgICAgb3JpZ19idWZmZXIuc2VlaygwKQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsaW5lID0gb3JpZ19idWZmZXIucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobGluZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1xuJyBvciBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnKioqIEVPT0ggKioqJyArIG9zLmxpbmVzZXApCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIEJhYnlsTWVzc2FnZSk6CisgICAgICAgICAgICAgICAgdmlzX2J1ZmZlciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICB2aXNfZ2VuZXJhdG9yID0gZW1haWwuZ2VuZXJhdG9yLkdlbmVyYXRvcih2aXNfYnVmZmVyLCBGYWxzZSwgMCkKKyAgICAgICAgICAgICAgICB2aXNfZ2VuZXJhdG9yLmZsYXR0ZW4obWVzc2FnZS5nZXRfdmlzaWJsZSgpKQorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSB2aXNfYnVmZmVyLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShsaW5lLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmUgPT0gJ1xuJyBvciBsaW5lID09ICcnOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3JpZ19idWZmZXIuc2VlaygwKQorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBvcmlnX2J1ZmZlci5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobGluZS5yZXBsYWNlKCdcbicsIG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgICAgICBpZiBsaW5lID09ICdcbicgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG9yaWdfYnVmZmVyLnJlYWQoNDA5NikgIyBCdWZmZXIgc2l6ZSBpcyBhcmJpdHJhcnkuCisgICAgICAgICAgICAgICAgaWYgYnVmZmVyID09ICcnOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoYnVmZmVyLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBzdHIpOgorICAgICAgICAgICAgYm9keV9zdGFydCA9IG1lc3NhZ2UuZmluZCgnXG5cbicpICsgMgorICAgICAgICAgICAgaWYgYm9keV9zdGFydCAtIDIgIT0gLTE6CisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShtZXNzYWdlWzpib2R5X3N0YXJ0XS5yZXBsYWNlKCdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmVzZXApKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwKQorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUobWVzc2FnZVs6Ym9keV9zdGFydF0ucmVwbGFjZSgnXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKG1lc3NhZ2VbYm9keV9zdGFydDpdLnJlcGxhY2UoJ1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubGluZXNlcCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJyoqKiBFT09IICoqKicgKyBvcy5saW5lc2VwICsgb3MubGluZXNlcCkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKG1lc3NhZ2UucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgZWxpZiBoYXNhdHRyKG1lc3NhZ2UsICdyZWFkbGluZScpOgorICAgICAgICAgICAgb3JpZ2luYWxfcG9zID0gbWVzc2FnZS50ZWxsKCkKKyAgICAgICAgICAgIGZpcnN0X3Bhc3MgPSBUcnVlCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGxpbmUgPSBtZXNzYWdlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGxpbmUucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICdcbicgb3IgbGluZSA9PSAnJzoKKyAgICAgICAgICAgICAgICAgICAgaWYgZmlyc3RfcGFzczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3Bhc3MgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnKioqIEVPT0ggKioqJyArIG9zLmxpbmVzZXApCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNlZWsob3JpZ2luYWxfcG9zKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgYnVmZmVyID0gbWVzc2FnZS5yZWFkKDQwOTYpICAgICAjIEJ1ZmZlciBzaXplIGlzIGFyYml0cmFyeS4KKyAgICAgICAgICAgICAgICBpZiBidWZmZXIgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS53cml0ZShidWZmZXIucmVwbGFjZSgnXG4nLCBvcy5saW5lc2VwKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignSW52YWxpZCBtZXNzYWdlIHR5cGU6ICVzJyAlIHR5cGUobWVzc2FnZSkpCisgICAgICAgIHN0b3AgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICByZXR1cm4gKHN0YXJ0LCBzdG9wKQorCisKK2NsYXNzIE1lc3NhZ2UoZW1haWwubWVzc2FnZS5NZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggbWFpbGJveC1mb3JtYXQtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgTWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5fYmVjb21lX21lc3NhZ2UoY29weS5kZWVwY29weShtZXNzYWdlKSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWVzc2FnZSk6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5fZXhwbGFpbl90byhzZWxmKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgc3RyKToKKyAgICAgICAgICAgIHNlbGYuX2JlY29tZV9tZXNzYWdlKGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobWVzc2FnZSkpCisgICAgICAgIGVsaWYgaGFzYXR0cihtZXNzYWdlLCAicmVhZCIpOgorICAgICAgICAgICAgc2VsZi5fYmVjb21lX21lc3NhZ2UoZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUobWVzc2FnZSkpCisgICAgICAgIGVsaWYgbWVzc2FnZSBpcyBOb25lOgorICAgICAgICAgICAgZW1haWwubWVzc2FnZS5NZXNzYWdlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0ludmFsaWQgbWVzc2FnZSB0eXBlOiAlcycgJSB0eXBlKG1lc3NhZ2UpKQorCisgICAgZGVmIF9iZWNvbWVfbWVzc2FnZShzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQXNzdW1lIHRoZSBub24tZm9ybWF0LXNwZWNpZmljIHN0YXRlIG9mIG1lc3NhZ2UuIiIiCisgICAgICAgIGZvciBuYW1lIGluICgnX2hlYWRlcnMnLCAnX3VuaXhmcm9tJywgJ19wYXlsb2FkJywgJ19jaGFyc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICdwcmVhbWJsZScsICdlcGlsb2d1ZScsICdkZWZlY3RzJywgJ19kZWZhdWx0X3R5cGUnKToKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSBtZXNzYWdlLl9fZGljdF9fW25hbWVdCisKKyAgICBkZWYgX2V4cGxhaW5fdG8oc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkNvcHkgZm9ybWF0LXNwZWNpZmljIHN0YXRlIHRvIG1lc3NhZ2UgaW5zb2ZhciBhcyBwb3NzaWJsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHJldHVybiAgIyBUaGVyZSdzIG5vdGhpbmcgZm9ybWF0LXNwZWNpZmljIHRvIGV4cGxhaW4uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0Nhbm5vdCBjb252ZXJ0IHRvIHNwZWNpZmllZCB0eXBlJykKKworCitjbGFzcyBNYWlsZGlyTWVzc2FnZShNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggTWFpbGRpci1zcGVjaWZpYyBwcm9wZXJ0aWVzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2U9Tm9uZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBNYWlsZGlyTWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5fc3ViZGlyID0gJ25ldycKKyAgICAgICAgc2VsZi5faW5mbyA9ICcnCisgICAgICAgIHNlbGYuX2RhdGUgPSB0aW1lLnRpbWUoKQorICAgICAgICBNZXNzYWdlLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKyAgICBkZWYgZ2V0X3N1YmRpcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuICduZXcnIG9yICdjdXInLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc3ViZGlyCisKKyAgICBkZWYgc2V0X3N1YmRpcihzZWxmLCBzdWJkaXIpOgorICAgICAgICAiIiJTZXQgc3ViZGlyIHRvICduZXcnIG9yICdjdXInLiIiIgorICAgICAgICBpZiBzdWJkaXIgPT0gJ25ldycgb3Igc3ViZGlyID09ICdjdXInOgorICAgICAgICAgICAgc2VsZi5fc3ViZGlyID0gc3ViZGlyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdWJkaXIgbXVzdCBiZSAnbmV3JyBvciAnY3VyJzogJXMiICUgc3ViZGlyKQorCisgICAgZGVmIGdldF9mbGFncyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFzIGEgc3RyaW5nIHRoZSBmbGFncyB0aGF0IGFyZSBzZXQuIiIiCisgICAgICAgIGlmIHNlbGYuX2luZm8uc3RhcnRzd2l0aCgnMiwnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9pbmZvWzI6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICcnCisKKyAgICBkZWYgc2V0X2ZsYWdzKHNlbGYsIGZsYWdzKToKKyAgICAgICAgIiIiU2V0IHRoZSBnaXZlbiBmbGFncyBhbmQgdW5zZXQgYWxsIG90aGVycy4iIiIKKyAgICAgICAgc2VsZi5faW5mbyA9ICcyLCcgKyAnJy5qb2luKHNvcnRlZChmbGFncykpCisKKyAgICBkZWYgYWRkX2ZsYWcoc2VsZiwgZmxhZyk6CisgICAgICAgICIiIlNldCB0aGUgZ2l2ZW4gZmxhZyhzKSB3aXRob3V0IGNoYW5naW5nIG90aGVycy4iIiIKKyAgICAgICAgc2VsZi5zZXRfZmxhZ3MoJycuam9pbihzZXQoc2VsZi5nZXRfZmxhZ3MoKSkgfCBzZXQoZmxhZykpKQorCisgICAgZGVmIHJlbW92ZV9mbGFnKHNlbGYsIGZsYWcpOgorICAgICAgICAiIiJVbnNldCB0aGUgZ2l2ZW4gc3RyaW5nIGZsYWcocykgd2l0aG91dCBjaGFuZ2luZyBvdGhlcnMuIiIiCisgICAgICAgIGlmIHNlbGYuZ2V0X2ZsYWdzKCkgIT0gJyc6CisgICAgICAgICAgICBzZWxmLnNldF9mbGFncygnJy5qb2luKHNldChzZWxmLmdldF9mbGFncygpKSAtIHNldChmbGFnKSkpCisKKyAgICBkZWYgZ2V0X2RhdGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBkZWxpdmVyeSBkYXRlIG9mIG1lc3NhZ2UsIGluIHNlY29uZHMgc2luY2UgdGhlIGVwb2NoLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZGF0ZQorCisgICAgZGVmIHNldF9kYXRlKHNlbGYsIGRhdGUpOgorICAgICAgICAiIiJTZXQgZGVsaXZlcnkgZGF0ZSBvZiBtZXNzYWdlLCBpbiBzZWNvbmRzIHNpbmNlIHRoZSBlcG9jaC4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZGF0ZSA9IGZsb2F0KGRhdGUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJjYW4ndCBjb252ZXJ0IHRvIGZsb2F0OiAlcyIgJSBkYXRlKQorCisgICAgZGVmIGdldF9pbmZvKHNlbGYpOgorICAgICAgICAiIiJHZXQgdGhlIG1lc3NhZ2UncyAiaW5mbyIgYXMgYSBzdHJpbmcuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9pbmZvCisKKyAgICBkZWYgc2V0X2luZm8oc2VsZiwgaW5mbyk6CisgICAgICAgICIiIlNldCB0aGUgbWVzc2FnZSdzICJpbmZvIiBzdHJpbmcuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5mbywgc3RyKToKKyAgICAgICAgICAgIHNlbGYuX2luZm8gPSBpbmZvCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2luZm8gbXVzdCBiZSBhIHN0cmluZzogJXMnICUgdHlwZShpbmZvKSkKKworICAgIGRlZiBfZXhwbGFpbl90byhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgIiIiQ29weSBNYWlsZGlyLXNwZWNpZmljIHN0YXRlIHRvIG1lc3NhZ2UgaW5zb2ZhciBhcyBwb3NzaWJsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBtZXNzYWdlLnNldF9mbGFncyhzZWxmLmdldF9mbGFncygpKQorICAgICAgICAgICAgbWVzc2FnZS5zZXRfc3ViZGlyKHNlbGYuZ2V0X3N1YmRpcigpKQorICAgICAgICAgICAgbWVzc2FnZS5zZXRfZGF0ZShzZWxmLmdldF9kYXRlKCkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBfbWJveE1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUycgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUicpCisgICAgICAgICAgICBpZiBzZWxmLmdldF9zdWJkaXIoKSA9PSAnY3VyJzoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdPJykKKyAgICAgICAgICAgIGlmICdUJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdEJykKKyAgICAgICAgICAgIGlmICdGJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdGJykKKyAgICAgICAgICAgIGlmICdSJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdBJykKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X2Zyb20oJ01BSUxFUi1EQUVNT04nLCB0aW1lLmdtdGltZShzZWxmLmdldF9kYXRlKCkpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTUhNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUycgbm90IGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICAgICAgaWYgJ1InIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgICAgIGlmICdGJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgZmxhZ3MgPSBzZXQoc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIGlmICdTJyBub3QgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ3Vuc2VlbicpCisgICAgICAgICAgICBpZiAnVCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2RlbGV0ZWQnKQorICAgICAgICAgICAgaWYgJ1InIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdhbnN3ZXJlZCcpCisgICAgICAgICAgICBpZiAnUCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2ZvcndhcmRlZCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gc3BlY2lmaWVkIHR5cGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShtZXNzYWdlKSkKKworCitjbGFzcyBfbWJveE1NREZNZXNzYWdlKE1lc3NhZ2UpOgorICAgICIiIk1lc3NhZ2Ugd2l0aCBtYm94LSBvciBNTURGLXNwZWNpZmljIHByb3BlcnRpZXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZT1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBtYm94TU1ERk1lc3NhZ2UgaW5zdGFuY2UuIiIiCisgICAgICAgIHNlbGYuc2V0X2Zyb20oJ01BSUxFUi1EQUVNT04nLCBUcnVlKQorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICAgICAgICB1bml4ZnJvbSA9IG1lc3NhZ2UuZ2V0X3VuaXhmcm9tKCkKKyAgICAgICAgICAgIGlmIHVuaXhmcm9tIGlzIG5vdCBOb25lIGFuZCB1bml4ZnJvbS5zdGFydHN3aXRoKCdGcm9tICcpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0X2Zyb20odW5peGZyb21bNTpdKQorICAgICAgICBNZXNzYWdlLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKyAgICBkZWYgZ2V0X2Zyb20oc2VsZik6CisgICAgICAgICIiIlJldHVybiBjb250ZW50cyBvZiAiRnJvbSAiIGxpbmUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9mcm9tCisKKyAgICBkZWYgc2V0X2Zyb20oc2VsZiwgZnJvbV8sIHRpbWVfPU5vbmUpOgorICAgICAgICAiIiJTZXQgIkZyb20gIiBsaW5lLCBmb3JtYXR0aW5nIGFuZCBhcHBlbmRpbmcgdGltZV8gaWYgc3BlY2lmaWVkLiIiIgorICAgICAgICBpZiB0aW1lXyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIHRpbWVfIGlzIFRydWU6CisgICAgICAgICAgICAgICAgdGltZV8gPSB0aW1lLmdtdGltZSgpCisgICAgICAgICAgICBmcm9tXyArPSAnICcgKyB0aW1lLmFzY3RpbWUodGltZV8pCisgICAgICAgIHNlbGYuX2Zyb20gPSBmcm9tXworCisgICAgZGVmIGdldF9mbGFncyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFzIGEgc3RyaW5nIHRoZSBmbGFncyB0aGF0IGFyZSBzZXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldCgnU3RhdHVzJywgJycpICsgc2VsZi5nZXQoJ1gtU3RhdHVzJywgJycpCisKKyAgICBkZWYgc2V0X2ZsYWdzKHNlbGYsIGZsYWdzKToKKyAgICAgICAgIiIiU2V0IHRoZSBnaXZlbiBmbGFncyBhbmQgdW5zZXQgYWxsIG90aGVycy4iIiIKKyAgICAgICAgZmxhZ3MgPSBzZXQoZmxhZ3MpCisgICAgICAgIHN0YXR1c19mbGFncywgeHN0YXR1c19mbGFncyA9ICcnLCAnJworICAgICAgICBmb3IgZmxhZyBpbiAoJ1InLCAnTycpOgorICAgICAgICAgICAgaWYgZmxhZyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBzdGF0dXNfZmxhZ3MgKz0gZmxhZworICAgICAgICAgICAgICAgIGZsYWdzLnJlbW92ZShmbGFnKQorICAgICAgICBmb3IgZmxhZyBpbiAoJ0QnLCAnRicsICdBJyk6CisgICAgICAgICAgICBpZiBmbGFnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIHhzdGF0dXNfZmxhZ3MgKz0gZmxhZworICAgICAgICAgICAgICAgIGZsYWdzLnJlbW92ZShmbGFnKQorICAgICAgICB4c3RhdHVzX2ZsYWdzICs9ICcnLmpvaW4oc29ydGVkKGZsYWdzKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXBsYWNlX2hlYWRlcignU3RhdHVzJywgc3RhdHVzX2ZsYWdzKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ1N0YXR1cycsIHN0YXR1c19mbGFncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXBsYWNlX2hlYWRlcignWC1TdGF0dXMnLCB4c3RhdHVzX2ZsYWdzKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmFkZF9oZWFkZXIoJ1gtU3RhdHVzJywgeHN0YXR1c19mbGFncykKKworICAgIGRlZiBhZGRfZmxhZyhzZWxmLCBmbGFnKToKKyAgICAgICAgIiIiU2V0IHRoZSBnaXZlbiBmbGFnKHMpIHdpdGhvdXQgY2hhbmdpbmcgb3RoZXJzLiIiIgorICAgICAgICBzZWxmLnNldF9mbGFncygnJy5qb2luKHNldChzZWxmLmdldF9mbGFncygpKSB8IHNldChmbGFnKSkpCisKKyAgICBkZWYgcmVtb3ZlX2ZsYWcoc2VsZiwgZmxhZyk6CisgICAgICAgICIiIlVuc2V0IHRoZSBnaXZlbiBzdHJpbmcgZmxhZyhzKSB3aXRob3V0IGNoYW5naW5nIG90aGVycy4iIiIKKyAgICAgICAgaWYgJ1N0YXR1cycgaW4gc2VsZiBvciAnWC1TdGF0dXMnIGluIHNlbGY6CisgICAgICAgICAgICBzZWxmLnNldF9mbGFncygnJy5qb2luKHNldChzZWxmLmdldF9mbGFncygpKSAtIHNldChmbGFnKSkpCisKKyAgICBkZWYgX2V4cGxhaW5fdG8oc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkNvcHkgbWJveC0gb3IgTU1ERi1zcGVjaWZpYyBzdGF0ZSB0byBtZXNzYWdlIGluc29mYXIgYXMgcG9zc2libGUuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTWFpbGRpck1lc3NhZ2UpOgorICAgICAgICAgICAgZmxhZ3MgPSBzZXQoc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIGlmICdPJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgICAgICBpZiAnRicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnRicpCisgICAgICAgICAgICBpZiAnQScgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUicpCisgICAgICAgICAgICBpZiAnUicgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUycpCisgICAgICAgICAgICBpZiAnRCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnVCcpCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsnc3RhdHVzJ10KKyAgICAgICAgICAgIGRlbCBtZXNzYWdlWyd4LXN0YXR1cyddCisgICAgICAgICAgICBtYXliZV9kYXRlID0gJyAnLmpvaW4oc2VsZi5nZXRfZnJvbSgpLnNwbGl0KClbLTU6XSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9kYXRlKGNhbGVuZGFyLnRpbWVnbSh0aW1lLnN0cnB0aW1lKG1heWJlX2RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJWEgJWIgJWQgJUg6JU06JVMgJVknKSkpCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIF9tYm94TU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgbWVzc2FnZS5zZXRfZmxhZ3Moc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X2Zyb20oc2VsZi5nZXRfZnJvbSgpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgTUhNZXNzYWdlKToKKyAgICAgICAgICAgIGZsYWdzID0gc2V0KHNlbGYuZ2V0X2ZsYWdzKCkpCisgICAgICAgICAgICBpZiAnUicgbm90IGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQorICAgICAgICAgICAgaWYgJ0EnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKKyAgICAgICAgICAgIGlmICdGJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsnc3RhdHVzJ10KKyAgICAgICAgICAgIGRlbCBtZXNzYWdlWyd4LXN0YXR1cyddCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgZmxhZ3MgPSBzZXQoc2VsZi5nZXRfZmxhZ3MoKSkKKyAgICAgICAgICAgIGlmICdSJyBub3QgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ3Vuc2VlbicpCisgICAgICAgICAgICBpZiAnRCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2RlbGV0ZWQnKQorICAgICAgICAgICAgaWYgJ0EnIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2xhYmVsKCdhbnN3ZXJlZCcpCisgICAgICAgICAgICBkZWwgbWVzc2FnZVsnc3RhdHVzJ10KKyAgICAgICAgICAgIGRlbCBtZXNzYWdlWyd4LXN0YXR1cyddCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gc3BlY2lmaWVkIHR5cGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShtZXNzYWdlKSkKKworCitjbGFzcyBtYm94TWVzc2FnZShfbWJveE1NREZNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggbWJveC1zcGVjaWZpYyBwcm9wZXJ0aWVzLiIiIgorCisKK2NsYXNzIE1ITWVzc2FnZShNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggTUgtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIE1ITWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5fc2VxdWVuY2VzID0gW10KKyAgICAgICAgTWVzc2FnZS5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorCisgICAgZGVmIGdldF9zZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygc2VxdWVuY2VzIHRoYXQgaW5jbHVkZSB0aGUgbWVzc2FnZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NlcXVlbmNlc1s6XQorCisgICAgZGVmIHNldF9zZXF1ZW5jZXMoc2VsZiwgc2VxdWVuY2VzKToKKyAgICAgICAgIiIiU2V0IHRoZSBsaXN0IG9mIHNlcXVlbmNlcyB0aGF0IGluY2x1ZGUgdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHNlbGYuX3NlcXVlbmNlcyA9IGxpc3Qoc2VxdWVuY2VzKQorCisgICAgZGVmIGFkZF9zZXF1ZW5jZShzZWxmLCBzZXF1ZW5jZSk6CisgICAgICAgICIiIkFkZCBzZXF1ZW5jZSB0byBsaXN0IG9mIHNlcXVlbmNlcyBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VxdWVuY2UsIHN0cik6CisgICAgICAgICAgICBpZiBub3Qgc2VxdWVuY2UgaW4gc2VsZi5fc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIHNlbGYuX3NlcXVlbmNlcy5hcHBlbmQoc2VxdWVuY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3NlcXVlbmNlIG11c3QgYmUgYSBzdHJpbmc6ICVzJyAlIHR5cGUoc2VxdWVuY2UpKQorCisgICAgZGVmIHJlbW92ZV9zZXF1ZW5jZShzZWxmLCBzZXF1ZW5jZSk6CisgICAgICAgICIiIlJlbW92ZSBzZXF1ZW5jZSBmcm9tIHRoZSBsaXN0IG9mIHNlcXVlbmNlcyBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3NlcXVlbmNlcy5yZW1vdmUoc2VxdWVuY2UpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9leHBsYWluX3RvKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICAiIiJDb3B5IE1ILXNwZWNpZmljIHN0YXRlIHRvIG1lc3NhZ2UgaW5zb2ZhciBhcyBwb3NzaWJsZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBzZXF1ZW5jZXMgPSBzZXQoc2VsZi5nZXRfc2VxdWVuY2VzKCkpCisgICAgICAgICAgICBpZiAndW5zZWVuJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUycpCisgICAgICAgICAgICBpZiAnZmxhZ2dlZCcgaW4gc2VxdWVuY2VzOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ0YnKQorICAgICAgICAgICAgaWYgJ3JlcGxpZWQnIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdSJykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIF9tYm94TU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgc2VxdWVuY2VzID0gc2V0KHNlbGYuZ2V0X3NlcXVlbmNlcygpKQorICAgICAgICAgICAgaWYgJ3Vuc2Vlbicgbm90IGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdSTycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX2ZsYWcoJ08nKQorICAgICAgICAgICAgaWYgJ2ZsYWdnZWQnIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdGJykKKyAgICAgICAgICAgIGlmICdyZXBsaWVkJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnQScpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNSE1lc3NhZ2UpOgorICAgICAgICAgICAgZm9yIHNlcXVlbmNlIGluIHNlbGYuZ2V0X3NlcXVlbmNlcygpOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UuYWRkX3NlcXVlbmNlKHNlcXVlbmNlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UobWVzc2FnZSwgQmFieWxNZXNzYWdlKToKKyAgICAgICAgICAgIHNlcXVlbmNlcyA9IHNldChzZWxmLmdldF9zZXF1ZW5jZXMoKSkKKyAgICAgICAgICAgIGlmICd1bnNlZW4nIGluIHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9sYWJlbCgndW5zZWVuJykKKyAgICAgICAgICAgIGlmICdyZXBsaWVkJyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwoJ2Fuc3dlcmVkJykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1lc3NhZ2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW5ub3QgY29udmVydCB0byBzcGVjaWZpZWQgdHlwZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKG1lc3NhZ2UpKQorCisKK2NsYXNzIEJhYnlsTWVzc2FnZShNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggQmFieWwtc3BlY2lmaWMgcHJvcGVydGllcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuIEJhYnlsTWVzc2FnZSBpbnN0YW5jZS4iIiIKKyAgICAgICAgc2VsZi5fbGFiZWxzID0gW10KKyAgICAgICAgc2VsZi5fdmlzaWJsZSA9IE1lc3NhZ2UoKQorICAgICAgICBNZXNzYWdlLl9faW5pdF9fKHNlbGYsIG1lc3NhZ2UpCisKKyAgICBkZWYgZ2V0X2xhYmVscyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBsYWJlbHMgb24gdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9sYWJlbHNbOl0KKworICAgIGRlZiBzZXRfbGFiZWxzKHNlbGYsIGxhYmVscyk6CisgICAgICAgICIiIlNldCB0aGUgbGlzdCBvZiBsYWJlbHMgb24gdGhlIG1lc3NhZ2UuIiIiCisgICAgICAgIHNlbGYuX2xhYmVscyA9IGxpc3QobGFiZWxzKQorCisgICAgZGVmIGFkZF9sYWJlbChzZWxmLCBsYWJlbCk6CisgICAgICAgICIiIkFkZCBsYWJlbCB0byBsaXN0IG9mIGxhYmVscyBvbiB0aGUgbWVzc2FnZS4iIiIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShsYWJlbCwgc3RyKToKKyAgICAgICAgICAgIGlmIGxhYmVsIG5vdCBpbiBzZWxmLl9sYWJlbHM6CisgICAgICAgICAgICAgICAgc2VsZi5fbGFiZWxzLmFwcGVuZChsYWJlbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignbGFiZWwgbXVzdCBiZSBhIHN0cmluZzogJXMnICUgdHlwZShsYWJlbCkpCisKKyAgICBkZWYgcmVtb3ZlX2xhYmVsKHNlbGYsIGxhYmVsKToKKyAgICAgICAgIiIiUmVtb3ZlIGxhYmVsIGZyb20gdGhlIGxpc3Qgb2YgbGFiZWxzIG9uIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9sYWJlbHMucmVtb3ZlKGxhYmVsKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBnZXRfdmlzaWJsZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB2aXNpYmxlIGhlYWRlcnMuIiIiCisgICAgICAgIHJldHVybiBNZXNzYWdlKHNlbGYuX3Zpc2libGUpCisKKyAgICBkZWYgc2V0X3Zpc2libGUoc2VsZiwgdmlzaWJsZSk6CisgICAgICAgICIiIlNldCB0aGUgTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB2aXNpYmxlIGhlYWRlcnMuIiIiCisgICAgICAgIHNlbGYuX3Zpc2libGUgPSBNZXNzYWdlKHZpc2libGUpCisKKyAgICBkZWYgdXBkYXRlX3Zpc2libGUoc2VsZik6CisgICAgICAgICIiIlVwZGF0ZSBhbmQvb3Igc2Vuc2libHkgZ2VuZXJhdGUgYSBzZXQgb2YgdmlzaWJsZSBoZWFkZXJzLiIiIgorICAgICAgICBmb3IgaGVhZGVyIGluIHNlbGYuX3Zpc2libGUua2V5cygpOgorICAgICAgICAgICAgaWYgaGVhZGVyIGluIHNlbGY6CisgICAgICAgICAgICAgICAgc2VsZi5fdmlzaWJsZS5yZXBsYWNlX2hlYWRlcihoZWFkZXIsIHNlbGZbaGVhZGVyXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX3Zpc2libGVbaGVhZGVyXQorICAgICAgICBmb3IgaGVhZGVyIGluICgnRGF0ZScsICdGcm9tJywgJ1JlcGx5LVRvJywgJ1RvJywgJ0NDJywgJ1N1YmplY3QnKToKKyAgICAgICAgICAgIGlmIGhlYWRlciBpbiBzZWxmIGFuZCBoZWFkZXIgbm90IGluIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICAgICAgc2VsZi5fdmlzaWJsZVtoZWFkZXJdID0gc2VsZltoZWFkZXJdCisKKyAgICBkZWYgX2V4cGxhaW5fdG8oc2VsZiwgbWVzc2FnZSk6CisgICAgICAgICIiIkNvcHkgQmFieWwtc3BlY2lmaWMgc3RhdGUgdG8gbWVzc2FnZSBpbnNvZmFyIGFzIHBvc3NpYmxlLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1haWxkaXJNZXNzYWdlKToKKyAgICAgICAgICAgIGxhYmVscyA9IHNldChzZWxmLmdldF9sYWJlbHMoKSkKKyAgICAgICAgICAgIGlmICd1bnNlZW4nIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdTJykKKyAgICAgICAgICAgIGlmICdmb3J3YXJkZWQnIGluIGxhYmVscyBvciAncmVzZW50JyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUCcpCisgICAgICAgICAgICBpZiAnYW5zd2VyZWQnIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdSJykKKyAgICAgICAgICAgIGlmICdkZWxldGVkJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnVCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBfbWJveE1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIGxhYmVscyA9IHNldChzZWxmLmdldF9sYWJlbHMoKSkKKyAgICAgICAgICAgIGlmICd1bnNlZW4nIG5vdCBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnUk8nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdPJykKKyAgICAgICAgICAgIGlmICdkZWxldGVkJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfZmxhZygnRCcpCisgICAgICAgICAgICBpZiAnYW5zd2VyZWQnIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9mbGFnKCdBJykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIE1ITWVzc2FnZSk6CisgICAgICAgICAgICBsYWJlbHMgPSBzZXQoc2VsZi5nZXRfbGFiZWxzKCkpCisgICAgICAgICAgICBpZiAndW5zZWVuJyBpbiBsYWJlbHM6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfc2VxdWVuY2UoJ3Vuc2VlbicpCisgICAgICAgICAgICBpZiAnYW5zd2VyZWQnIGluIGxhYmVsczoKKyAgICAgICAgICAgICAgICBtZXNzYWdlLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBCYWJ5bE1lc3NhZ2UpOgorICAgICAgICAgICAgbWVzc2FnZS5zZXRfdmlzaWJsZShzZWxmLmdldF92aXNpYmxlKCkpCisgICAgICAgICAgICBmb3IgbGFiZWwgaW4gc2VsZi5nZXRfbGFiZWxzKCk6CisgICAgICAgICAgICAgICAgbWVzc2FnZS5hZGRfbGFiZWwobGFiZWwpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdG8gc3BlY2lmaWVkIHR5cGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShtZXNzYWdlKSkKKworCitjbGFzcyBNTURGTWVzc2FnZShfbWJveE1NREZNZXNzYWdlKToKKyAgICAiIiJNZXNzYWdlIHdpdGggTU1ERi1zcGVjaWZpYyBwcm9wZXJ0aWVzLiIiIgorCisKK2NsYXNzIF9Qcm94eUZpbGU6CisgICAgIiIiQSByZWFkLW9ubHkgd3JhcHBlciBvZiBhIGZpbGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZiwgcG9zPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgX1Byb3h5RmlsZS4iIiIKKyAgICAgICAgc2VsZi5fZmlsZSA9IGYKKyAgICAgICAgaWYgcG9zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9wb3MgPSBmLnRlbGwoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcG9zID0gcG9zCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplPU5vbmUpOgorICAgICAgICAiIiJSZWFkIGJ5dGVzLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZChzaXplLCBzZWxmLl9maWxlLnJlYWQpCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBhIGxpbmUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9yZWFkKHNpemUsIHNlbGYuX2ZpbGUucmVhZGxpbmUpCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYsIHNpemVoaW50PU5vbmUpOgorICAgICAgICAiIiJSZWFkIG11bHRpcGxlIGxpbmVzLiIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgbGluZSBpbiBzZWxmOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKQorICAgICAgICAgICAgaWYgc2l6ZWhpbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2l6ZWhpbnQgLT0gbGVuKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgc2l6ZWhpbnQgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAiIiJJdGVyYXRlIG92ZXIgbGluZXMuIiIiCisgICAgICAgIHJldHVybiBpdGVyKHNlbGYucmVhZGxpbmUsICIiKQorCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgcG9zaXRpb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9wb3MKKworICAgIGRlZiBzZWVrKHNlbGYsIG9mZnNldCwgd2hlbmNlPTApOgorICAgICAgICAiIiJDaGFuZ2UgcG9zaXRpb24uIiIiCisgICAgICAgIGlmIHdoZW5jZSA9PSAxOgorICAgICAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX3BvcykKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKG9mZnNldCwgd2hlbmNlKQorICAgICAgICBzZWxmLl9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJDbG9zZSB0aGUgZmlsZS4iIiIKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnX2ZpbGUnKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5fZmlsZSwgJ2Nsb3NlJyk6CisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBkZWwgc2VsZi5fZmlsZQorCisgICAgZGVmIF9yZWFkKHNlbGYsIHNpemUsIHJlYWRfbWV0aG9kKToKKyAgICAgICAgIiIiUmVhZCBzaXplIGJ5dGVzIHVzaW5nIHJlYWRfbWV0aG9kLiIiIgorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBzaXplID0gLTEKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX3BvcykKKyAgICAgICAgcmVzdWx0ID0gcmVhZF9tZXRob2Qoc2l6ZSkKKyAgICAgICAgc2VsZi5fcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2NsYXNzIF9QYXJ0aWFsRmlsZShfUHJveHlGaWxlKToKKyAgICAiIiJBIHJlYWQtb25seSB3cmFwcGVyIG9mIHBhcnQgb2YgYSBmaWxlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYsIHN0YXJ0PU5vbmUsIHN0b3A9Tm9uZSk6CisgICAgICAgICIiIkluaXRpYWxpemUgYSBfUGFydGlhbEZpbGUuIiIiCisgICAgICAgIF9Qcm94eUZpbGUuX19pbml0X18oc2VsZiwgZiwgc3RhcnQpCisgICAgICAgIHNlbGYuX3N0YXJ0ID0gc3RhcnQKKyAgICAgICAgc2VsZi5fc3RvcCA9IHN0b3AKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byBzdGFydC4iIiIKKyAgICAgICAgcmV0dXJuIF9Qcm94eUZpbGUudGVsbChzZWxmKSAtIHNlbGYuX3N0YXJ0CisKKyAgICBkZWYgc2VlayhzZWxmLCBvZmZzZXQsIHdoZW5jZT0wKToKKyAgICAgICAgIiIiQ2hhbmdlIHBvc2l0aW9uLCBwb3NzaWJseSB3aXRoIHJlc3BlY3QgdG8gc3RhcnQgb3Igc3RvcC4iIiIKKyAgICAgICAgaWYgd2hlbmNlID09IDA6CisgICAgICAgICAgICBzZWxmLl9wb3MgPSBzZWxmLl9zdGFydAorICAgICAgICAgICAgd2hlbmNlID0gMQorICAgICAgICBlbGlmIHdoZW5jZSA9PSAyOgorICAgICAgICAgICAgc2VsZi5fcG9zID0gc2VsZi5fc3RvcAorICAgICAgICAgICAgd2hlbmNlID0gMQorICAgICAgICBfUHJveHlGaWxlLnNlZWsoc2VsZiwgb2Zmc2V0LCB3aGVuY2UpCisKKyAgICBkZWYgX3JlYWQoc2VsZiwgc2l6ZSwgcmVhZF9tZXRob2QpOgorICAgICAgICAiIiJSZWFkIHNpemUgYnl0ZXMgdXNpbmcgcmVhZF9tZXRob2QsIGhvbm9yaW5nIHN0YXJ0IGFuZCBzdG9wLiIiIgorICAgICAgICByZW1haW5pbmcgPSBzZWxmLl9zdG9wIC0gc2VsZi5fcG9zCisgICAgICAgIGlmIHJlbWFpbmluZyA8PSAwOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGlmIHNpemUgaXMgTm9uZSBvciBzaXplIDwgMCBvciBzaXplID4gcmVtYWluaW5nOgorICAgICAgICAgICAgc2l6ZSA9IHJlbWFpbmluZworICAgICAgICByZXR1cm4gX1Byb3h5RmlsZS5fcmVhZChzZWxmLCBzaXplLCByZWFkX21ldGhvZCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIyBkbyAqbm90KiBjbG9zZSB0aGUgdW5kZXJseWluZyBmaWxlIG9iamVjdCBmb3IgcGFydGlhbCBmaWxlcywKKyAgICAgICAgIyBzaW5jZSBpdCdzIGdsb2JhbCB0byB0aGUgbWFpbGJveCBvYmplY3QKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnX2ZpbGUnKToKKyAgICAgICAgICAgIGRlbCBzZWxmLl9maWxlCisKKworZGVmIF9sb2NrX2ZpbGUoZiwgZG90bG9jaz1UcnVlKToKKyAgICAiIiJMb2NrIGZpbGUgZiB1c2luZyBsb2NrZiBhbmQgZG90IGxvY2tpbmcuIiIiCisgICAgZG90bG9ja19kb25lID0gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIGlmIGZjbnRsOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZjbnRsLmxvY2tmKGYsIGZjbnRsLkxPQ0tfRVggfCBmY250bC5MT0NLX05CKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyBpbiAoZXJybm8uRUFHQUlOLCBlcnJuby5FQUNDRVMsIGVycm5vLkVST0ZTKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXh0ZXJuYWxDbGFzaEVycm9yKCdsb2NrZjogbG9jayB1bmF2YWlsYWJsZTogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYubmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBpZiBkb3Rsb2NrOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByZV9sb2NrID0gX2NyZWF0ZV90ZW1wb3JhcnkoZi5uYW1lICsgJy5sb2NrJykKKyAgICAgICAgICAgICAgICBwcmVfbG9jay5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vIGluIChlcnJuby5FQUNDRVMsIGVycm5vLkVST0ZTKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICAjIFdpdGhvdXQgd3JpdGUgYWNjZXNzLCBqdXN0IHNraXAgZG90bG9ja2luZy4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICdsaW5rJyk6CisgICAgICAgICAgICAgICAgICAgIG9zLmxpbmsocHJlX2xvY2submFtZSwgZi5uYW1lICsgJy5sb2NrJykKKyAgICAgICAgICAgICAgICAgICAgZG90bG9ja19kb25lID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocHJlX2xvY2submFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW5hbWUocHJlX2xvY2submFtZSwgZi5uYW1lICsgJy5sb2NrJykKKyAgICAgICAgICAgICAgICAgICAgZG90bG9ja19kb25lID0gVHJ1ZQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FRVhJU1Qgb3IgXAorICAgICAgICAgICAgICAgICAgKG9zLm5hbWUgPT0gJ29zMicgYW5kIGUuZXJybm8gPT0gZXJybm8uRUFDQ0VTKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHByZV9sb2NrLm5hbWUpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4dGVybmFsQ2xhc2hFcnJvcignZG90IGxvY2sgdW5hdmFpbGFibGU6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLm5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICBleGNlcHQ6CisgICAgICAgIGlmIGZjbnRsOgorICAgICAgICAgICAgZmNudGwubG9ja2YoZiwgZmNudGwuTE9DS19VTikKKyAgICAgICAgaWYgZG90bG9ja19kb25lOgorICAgICAgICAgICAgb3MucmVtb3ZlKGYubmFtZSArICcubG9jaycpCisgICAgICAgIHJhaXNlCisKK2RlZiBfdW5sb2NrX2ZpbGUoZik6CisgICAgIiIiVW5sb2NrIGZpbGUgZiB1c2luZyBsb2NrZiBhbmQgZG90IGxvY2tpbmcuIiIiCisgICAgaWYgZmNudGw6CisgICAgICAgIGZjbnRsLmxvY2tmKGYsIGZjbnRsLkxPQ0tfVU4pCisgICAgaWYgb3MucGF0aC5leGlzdHMoZi5uYW1lICsgJy5sb2NrJyk6CisgICAgICAgIG9zLnJlbW92ZShmLm5hbWUgKyAnLmxvY2snKQorCitkZWYgX2NyZWF0ZV9jYXJlZnVsbHkocGF0aCk6CisgICAgIiIiQ3JlYXRlIGEgZmlsZSBpZiBpdCBkb2Vzbid0IGV4aXN0IGFuZCBvcGVuIGZvciByZWFkaW5nIGFuZCB3cml0aW5nLiIiIgorICAgIGZkID0gb3Mub3BlbihwYXRoLCBvcy5PX0NSRUFUIHwgb3MuT19FWENMIHwgb3MuT19SRFdSLCAwNjY2KQorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIG9wZW4ocGF0aCwgJ3JiKycpCisgICAgZmluYWxseToKKyAgICAgICAgb3MuY2xvc2UoZmQpCisKK2RlZiBfY3JlYXRlX3RlbXBvcmFyeShwYXRoKToKKyAgICAiIiJDcmVhdGUgYSB0ZW1wIGZpbGUgYmFzZWQgb24gcGF0aCBhbmQgb3BlbiBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4iIiIKKyAgICByZXR1cm4gX2NyZWF0ZV9jYXJlZnVsbHkoJyVzLiVzLiVzLiVzJyAlIChwYXRoLCBpbnQodGltZS50aW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRob3N0bmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmdldHBpZCgpKSkKKworZGVmIF9zeW5jX2ZsdXNoKGYpOgorICAgICIiIkVuc3VyZSBjaGFuZ2VzIHRvIGZpbGUgZiBhcmUgcGh5c2ljYWxseSBvbiBkaXNrLiIiIgorICAgIGYuZmx1c2goKQorICAgIGlmIGhhc2F0dHIob3MsICdmc3luYycpOgorICAgICAgICBvcy5mc3luYyhmLmZpbGVubygpKQorCitkZWYgX3N5bmNfY2xvc2UoZik6CisgICAgIiIiQ2xvc2UgZmlsZSBmLCBlbnN1cmluZyBhbGwgY2hhbmdlcyBhcmUgcGh5c2ljYWxseSBvbiBkaXNrLiIiIgorICAgIF9zeW5jX2ZsdXNoKGYpCisgICAgZi5jbG9zZSgpCisKKyMjIFN0YXJ0OiBjbGFzc2VzIGZyb20gdGhlIG9yaWdpbmFsIG1vZHVsZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgorCisjIE5vdGUgdGhhdCB0aGUgTWFpbGRpciBjbGFzcywgd2hvc2UgbmFtZSBpcyB1bmNoYW5nZWQsIGl0c2VsZiBvZmZlcnMgYSBuZXh0KCkKKyMgbWV0aG9kIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCitjbGFzcyBfTWFpbGJveDoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSk6CisgICAgICAgIHNlbGYuZnAgPSBmcAorICAgICAgICBzZWxmLnNlZWtwID0gMAorICAgICAgICBzZWxmLmZhY3RvcnkgPSBmYWN0b3J5CisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKHNlbGYubmV4dCwgTm9uZSkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc2Vla3ApCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fc2VhcmNoX3N0YXJ0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNlZWtwID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgc2VsZi5fc2VhcmNoX2VuZCgpCisgICAgICAgICAgICBzZWxmLnNlZWtwID0gc3RvcCA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICBpZiBzdGFydCAhPSBzdG9wOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBzZWxmLmZhY3RvcnkoX1BhcnRpYWxGaWxlKHNlbGYuZnAsIHN0YXJ0LCBzdG9wKSkKKworIyBSZWNvbW1lbmRlZCB0byB1c2UgUG9ydGFibGVVbml4TWFpbGJveCBpbnN0ZWFkIQorY2xhc3MgVW5peE1haWxib3goX01haWxib3gpOgorCisgICAgZGVmIF9zZWFyY2hfc3RhcnQoc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBwb3MgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgICAgIGlmIGxpbmVbOjVdID09ICdGcm9tICcgYW5kIHNlbGYuX2lzcmVhbGZyb21saW5lKGxpbmUpOgorICAgICAgICAgICAgICAgIHNlbGYuZnAuc2Vlayhwb3MpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX3NlYXJjaF9lbmQoc2VsZik6CisgICAgICAgIHNlbGYuZnAucmVhZGxpbmUoKSAgICAgICMgVGhyb3cgYXdheSBoZWFkZXIgbGluZQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcG9zID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbGluZVs6NV0gPT0gJ0Zyb20gJyBhbmQgc2VsZi5faXNyZWFsZnJvbWxpbmUobGluZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHBvcykKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICMgQW4gb3ZlcnJpZGFibGUgbWVjaGFuaXNtIHRvIHRlc3QgZm9yIEZyb20tbGluZS1uZXNzLiAgWW91IGNhbiBlaXRoZXIKKyAgICAjIHNwZWNpZnkgYSBkaWZmZXJlbnQgcmVndWxhciBleHByZXNzaW9uIG9yIGRlZmluZSBhIHdob2xlIG5ldworICAgICMgX2lzcmVhbGZyb21saW5lKCkgbWV0aG9kLiAgTm90ZSB0aGF0IHRoaXMgb25seSBnZXRzIGNhbGxlZCBmb3IgbGluZXMKKyAgICAjIHN0YXJ0aW5nIHdpdGggdGhlIDUgY2hhcmFjdGVycyAiRnJvbSAiLgorICAgICMKKyAgICAjIEJBVzogQWNjb3JkaW5nIHRvCisgICAgI2h0dHA6Ly9ob21lLm5ldHNjYXBlLmNvbS9lbmcvbW96aWxsYS8yLjAvcmVsbm90ZXMvZGVtby9jb250ZW50LWxlbmd0aC5odG1sCisgICAgIyB0aGUgb25seSBwb3J0YWJsZSwgcmVsaWFibGUgd2F5IHRvIGZpbmQgbWVzc2FnZSBkZWxpbWl0ZXJzIGluIGEgQlNEIChpLmUKKyAgICAjIFVuaXggbWFpbGJveCkgc3R5bGUgZm9sZGVyIGlzIHRvIHNlYXJjaCBmb3IgIlxuXG5Gcm9tIC4qXG4iLCBvciBhdCB0aGUKKyAgICAjIGJlZ2lubmluZyBvZiB0aGUgZmlsZSwgIl5Gcm9tIC4qXG4iLiAgV2hpbGUgX2Zyb21saW5lcGF0dGVybiBiZWxvdyBzZWVtcworICAgICMgbGlrZSBhIGdvb2QgaWRlYSwgaW4gcHJhY3RpY2UsIHRoZXJlIGFyZSB0b28gbWFueSB2YXJpYXRpb25zIGZvciBtb3JlCisgICAgIyBzdHJpY3QgcGFyc2luZyBvZiB0aGUgbGluZSB0byBiZSBjb21wbGV0ZWx5IGFjY3VyYXRlLgorICAgICMKKyAgICAjIF9zdHJpY3RfaXNyZWFsZnJvbWxpbmUoKSBpcyB0aGUgb2xkIHZlcnNpb24gd2hpY2ggdHJpZXMgdG8gZG8gc3RyaWN0ZXIKKyAgICAjIHBhcnNpbmcgb2YgdGhlIEZyb21fIGxpbmUuICBfcG9ydGFibGVfaXNyZWFsZnJvbWxpbmUoKSBzaW1wbHkgcmV0dXJucworICAgICMgdHJ1ZSwgc2luY2UgaXQncyBuZXZlciBjYWxsZWQgaWYgdGhlIGxpbmUgZG9lc24ndCBhbHJlYWR5IHN0YXJ0IHdpdGgKKyAgICAjICJGcm9tICIuCisgICAgIworICAgICMgVGhpcyBhbGdvcml0aG0sIGFuZCB0aGUgd2F5IGl0IGludGVyYWN0cyB3aXRoIF9zZWFyY2hfc3RhcnQoKSBhbmQKKyAgICAjIF9zZWFyY2hfZW5kKCkgbWF5IG5vdCBiZSBjb21wbGV0ZWx5IGNvcnJlY3QsIGJlY2F1c2UgaXQgZG9lc24ndCBjaGVjaworICAgICMgdGhhdCB0aGUgdHdvIGNoYXJhY3RlcnMgcHJlY2VkaW5nICJGcm9tICIgYXJlIFxuXG4gb3IgdGhlIGJlZ2lubmluZyBvZgorICAgICMgdGhlIGZpbGUuICBGaXhpbmcgdGhpcyB3b3VsZCByZXF1aXJlIGEgbW9yZSBleHRlbnNpdmUgcmV3cml0ZSB0aGFuIGlzCisgICAgIyBuZWNlc3NhcnkuICBGb3IgY29udmVuaWVuY2UsIHdlJ3ZlIGFkZGVkIGEgUG9ydGFibGVVbml4TWFpbGJveCBjbGFzcworICAgICMgd2hpY2ggZG9lcyBubyBjaGVja2luZyBvZiB0aGUgZm9ybWF0IG9mIHRoZSAnRnJvbScgbGluZS4KKworICAgIF9mcm9tbGluZXBhdHRlcm4gPSAociJGcm9tIFxzKlteXHNdK1xzK1x3XHdcd1xzK1x3XHdcd1xzK1xkP1xkXHMrIgorICAgICAgICAgICAgICAgICAgICAgICAgciJcZD9cZDpcZFxkKDpcZFxkKT8oXHMrW15cc10rKT9ccytcZFxkXGRcZFxzKiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHIiW15cc10qXHMqIgorICAgICAgICAgICAgICAgICAgICAgICAgIiQiKQorICAgIF9yZWdleHAgPSBOb25lCisKKyAgICBkZWYgX3N0cmljdF9pc3JlYWxmcm9tbGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3JlZ2V4cDoKKyAgICAgICAgICAgIGltcG9ydCByZQorICAgICAgICAgICAgc2VsZi5fcmVnZXhwID0gcmUuY29tcGlsZShzZWxmLl9mcm9tbGluZXBhdHRlcm4pCisgICAgICAgIHJldHVybiBzZWxmLl9yZWdleHAubWF0Y2gobGluZSkKKworICAgIGRlZiBfcG9ydGFibGVfaXNyZWFsZnJvbWxpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBfaXNyZWFsZnJvbWxpbmUgPSBfc3RyaWN0X2lzcmVhbGZyb21saW5lCisKKworY2xhc3MgUG9ydGFibGVVbml4TWFpbGJveChVbml4TWFpbGJveCk6CisgICAgX2lzcmVhbGZyb21saW5lID0gVW5peE1haWxib3guX3BvcnRhYmxlX2lzcmVhbGZyb21saW5lCisKKworY2xhc3MgTW1kZk1haWxib3goX01haWxib3gpOgorCisgICAgZGVmIF9zZWFyY2hfc3RhcnQoc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5mcC5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICAgICAgaWYgbGluZVs6NV0gPT0gJ1wwMDFcMDAxXDAwMVwwMDFcbic6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX3NlYXJjaF9lbmQoc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBwb3MgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBsaW5lID09ICdcMDAxXDAwMVwwMDFcMDAxXG4nOgorICAgICAgICAgICAgICAgIHNlbGYuZnAuc2Vlayhwb3MpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKworY2xhc3MgTUhNYWlsYm94OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpcm5hbWUsIGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgcGF0ID0gcmUuY29tcGlsZSgnXlsxLTldWzAtOV0qJCcpCisgICAgICAgIHNlbGYuZGlybmFtZSA9IGRpcm5hbWUKKyAgICAgICAgIyB0aGUgdGhyZWUgZm9sbG93aW5nIGxpbmVzIGNvdWxkIGJlIGNvbWJpbmVkIGludG86CisgICAgICAgICMgbGlzdCA9IG1hcChsb25nLCBmaWx0ZXIocGF0Lm1hdGNoLCBvcy5saXN0ZGlyKHNlbGYuZGlybmFtZSkpKQorICAgICAgICBsaXN0ID0gb3MubGlzdGRpcihzZWxmLmRpcm5hbWUpCisgICAgICAgIGxpc3QgPSBmaWx0ZXIocGF0Lm1hdGNoLCBsaXN0KQorICAgICAgICBsaXN0ID0gbWFwKGxvbmcsIGxpc3QpCisgICAgICAgIGxpc3Quc29ydCgpCisgICAgICAgICMgVGhpcyBvbmx5IHdvcmtzIGluIFB5dGhvbiAxLjYgb3IgbGF0ZXI7CisgICAgICAgICMgYmVmb3JlIHRoYXQgc3RyKCkgYWRkZWQgJ0wnOgorICAgICAgICBzZWxmLmJveGVzID0gbWFwKHN0ciwgbGlzdCkKKyAgICAgICAgc2VsZi5ib3hlcy5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5mYWN0b3J5ID0gZmFjdG9yeQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaXRlcihzZWxmLm5leHQsIE5vbmUpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuYm94ZXM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBmbiA9IHNlbGYuYm94ZXMucG9wKCkKKyAgICAgICAgZnAgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLmRpcm5hbWUsIGZuKSkKKyAgICAgICAgbXNnID0gc2VsZi5mYWN0b3J5KGZwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cuX21oX21zZ25vID0gZm4KKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIG1zZworCisKK2NsYXNzIEJhYnlsTWFpbGJveChfTWFpbGJveCk6CisKKyAgICBkZWYgX3NlYXJjaF9zdGFydChzZWxmKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgICAgICBpZiBsaW5lID09ICcqKiogRU9PSCAqKipcbic6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgX3NlYXJjaF9lbmQoc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBwb3MgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgbGluZSA9IHNlbGYuZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBsaW5lID09ICdcMDM3XDAxNFxuJyBvciBsaW5lID09ICdcMDM3JzoKKyAgICAgICAgICAgICAgICBzZWxmLmZwLnNlZWsocG9zKQorICAgICAgICAgICAgICAgIHJldHVybgorCisjIyBFbmQ6IGNsYXNzZXMgZnJvbSB0aGUgb3JpZ2luYWwgbW9kdWxlIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSkuCisKKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJSYWlzZWQgZm9yIG1vZHVsZS1zcGVjaWZpYyBlcnJvcnMuIiIiCisKK2NsYXNzIE5vU3VjaE1haWxib3hFcnJvcihFcnJvcik6CisgICAgIiIiVGhlIHNwZWNpZmllZCBtYWlsYm94IGRvZXMgbm90IGV4aXN0IGFuZCB3b24ndCBiZSBjcmVhdGVkLiIiIgorCitjbGFzcyBOb3RFbXB0eUVycm9yKEVycm9yKToKKyAgICAiIiJUaGUgc3BlY2lmaWVkIG1haWxib3ggaXMgbm90IGVtcHR5IGFuZCBkZWxldGlvbiB3YXMgcmVxdWVzdGVkLiIiIgorCitjbGFzcyBFeHRlcm5hbENsYXNoRXJyb3IoRXJyb3IpOgorICAgICIiIkFub3RoZXIgcHJvY2VzcyBjYXVzZWQgYW4gYWN0aW9uIHRvIGZhaWwuIiIiCisKK2NsYXNzIEZvcm1hdEVycm9yKEVycm9yKToKKyAgICAiIiJBIGZpbGUgYXBwZWFycyB0byBoYXZlIGFuIGludmFsaWQgZm9ybWF0LiIiIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWlsYm94LnB5YyBiL2xpYi9weXRob24yLjcvbWFpbGJveC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZDhjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFpbGJveC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWlsYm94LnB5byBiL2xpYi9weXRob24yLjcvbWFpbGJveC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ4ZGEzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFpbGJveC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWlsY2FwLnB5IGIvbGliL3B5dGhvbjIuNy9tYWlsY2FwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZGRhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21haWxjYXAucHkKQEAgLTAsMCArMSwyNTUgQEAKKyIiIk1haWxjYXAgZmlsZSBoYW5kbGluZy4gIFNlZSBSRkMgMTUyNC4iIiIKKworaW1wb3J0IG9zCisKK19fYWxsX18gPSBbImdldGNhcHMiLCJmaW5kbWF0Y2giXQorCisjIFBhcnQgMTogdG9wLWxldmVsIGludGVyZmFjZS4KKworZGVmIGdldGNhcHMoKToKKyAgICAiIiJSZXR1cm4gYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1haWxjYXAgZGF0YWJhc2UuCisKKyAgICBUaGUgZGljdGlvbmFyeSBtYXBzIGEgTUlNRSB0eXBlIChpbiBhbGwgbG93ZXJjYXNlLCBlLmcuICd0ZXh0L3BsYWluJykKKyAgICB0byBhIGxpc3Qgb2YgZGljdGlvbmFyaWVzIGNvcnJlc3BvbmRpbmcgdG8gbWFpbGNhcCBlbnRyaWVzLiAgVGhlIGxpc3QKKyAgICBjb2xsZWN0cyBhbGwgdGhlIGVudHJpZXMgZm9yIHRoYXQgTUlNRSB0eXBlIGZyb20gYWxsIGF2YWlsYWJsZSBtYWlsY2FwCisgICAgZmlsZXMuICBFYWNoIGRpY3Rpb25hcnkgY29udGFpbnMga2V5LXZhbHVlIHBhaXJzIGZvciB0aGF0IE1JTUUgdHlwZSwKKyAgICB3aGVyZSB0aGUgdmlld2luZyBjb21tYW5kIGlzIHN0b3JlZCB3aXRoIHRoZSBrZXkgInZpZXciLgorCisgICAgIiIiCisgICAgY2FwcyA9IHt9CisgICAgZm9yIG1haWxjYXAgaW4gbGlzdG1haWxjYXBmaWxlcygpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IG9wZW4obWFpbGNhcCwgJ3InKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG1vcmVjYXBzID0gcmVhZG1haWxjYXBmaWxlKGZwKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG1vcmVjYXBzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IGtleSBpbiBjYXBzOgorICAgICAgICAgICAgICAgIGNhcHNba2V5XSA9IHZhbHVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNhcHNba2V5XSA9IGNhcHNba2V5XSArIHZhbHVlCisgICAgcmV0dXJuIGNhcHMKKworZGVmIGxpc3RtYWlsY2FwZmlsZXMoKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBtYWlsY2FwIGZpbGVzIGZvdW5kIG9uIHRoZSBzeXN0ZW0uIiIiCisgICAgIyBYWFggQWN0dWFsbHksIHRoaXMgaXMgVW5peC1zcGVjaWZpYworICAgIGlmICdNQUlMQ0FQUycgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgc3RyID0gb3MuZW52aXJvblsnTUFJTENBUFMnXQorICAgICAgICBtYWlsY2FwcyA9IHN0ci5zcGxpdCgnOicpCisgICAgZWxzZToKKyAgICAgICAgaWYgJ0hPTUUnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBob21lID0gb3MuZW52aXJvblsnSE9NRSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIERvbid0IGJvdGhlciB3aXRoIGdldHB3dWlkKCkKKyAgICAgICAgICAgIGhvbWUgPSAnLicgIyBMYXN0IHJlc29ydAorICAgICAgICBtYWlsY2FwcyA9IFtob21lICsgJy8ubWFpbGNhcCcsICcvZXRjL21haWxjYXAnLAorICAgICAgICAgICAgICAgICcvdXNyL2V0Yy9tYWlsY2FwJywgJy91c3IvbG9jYWwvZXRjL21haWxjYXAnXQorICAgIHJldHVybiBtYWlsY2FwcworCisKKyMgUGFydCAyOiB0aGUgcGFyc2VyLgorCitkZWYgcmVhZG1haWxjYXBmaWxlKGZwKToKKyAgICAiIiJSZWFkIGEgbWFpbGNhcCBmaWxlIGFuZCByZXR1cm4gYSBkaWN0aW9uYXJ5IGtleWVkIGJ5IE1JTUUgdHlwZS4KKworICAgIEVhY2ggTUlNRSB0eXBlIGlzIG1hcHBlZCB0byBhbiBlbnRyeSBjb25zaXN0aW5nIG9mIGEgbGlzdCBvZgorICAgIGRpY3Rpb25hcmllczsgdGhlIGxpc3Qgd2lsbCBjb250YWluIG1vcmUgdGhhbiBvbmUgc3VjaCBkaWN0aW9uYXJ5CisgICAgaWYgYSBnaXZlbiBNSU1FIHR5cGUgYXBwZWFycyBtb3JlIHRoYW4gb25jZSBpbiB0aGUgbWFpbGNhcCBmaWxlLgorICAgIEVhY2ggZGljdGlvbmFyeSBjb250YWlucyBrZXktdmFsdWUgcGFpcnMgZm9yIHRoYXQgTUlNRSB0eXBlLCB3aGVyZQorICAgIHRoZSB2aWV3aW5nIGNvbW1hbmQgaXMgc3RvcmVkIHdpdGggdGhlIGtleSAidmlldyIuCisgICAgIiIiCisgICAgY2FwcyA9IHt9CisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgICMgSWdub3JlIGNvbW1lbnRzIGFuZCBibGFuayBsaW5lcworICAgICAgICBpZiBsaW5lWzBdID09ICcjJyBvciBsaW5lLnN0cmlwKCkgPT0gJyc6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBuZXh0bGluZSA9IGxpbmUKKyAgICAgICAgIyBKb2luIGNvbnRpbnVhdGlvbiBsaW5lcworICAgICAgICB3aGlsZSBuZXh0bGluZVstMjpdID09ICdcXFxuJzoKKyAgICAgICAgICAgIG5leHRsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IG5leHRsaW5lOiBuZXh0bGluZSA9ICdcbicKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0gKyBuZXh0bGluZQorICAgICAgICAjIFBhcnNlIHRoZSBsaW5lCisgICAgICAgIGtleSwgZmllbGRzID0gcGFyc2VsaW5lKGxpbmUpCisgICAgICAgIGlmIG5vdCAoa2V5IGFuZCBmaWVsZHMpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgIyBOb3JtYWxpemUgdGhlIGtleQorICAgICAgICB0eXBlcyA9IGtleS5zcGxpdCgnLycpCisgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbih0eXBlcykpOgorICAgICAgICAgICAgdHlwZXNbal0gPSB0eXBlc1tqXS5zdHJpcCgpCisgICAgICAgIGtleSA9ICcvJy5qb2luKHR5cGVzKS5sb3dlcigpCisgICAgICAgICMgVXBkYXRlIHRoZSBkYXRhYmFzZQorICAgICAgICBpZiBrZXkgaW4gY2FwczoKKyAgICAgICAgICAgIGNhcHNba2V5XS5hcHBlbmQoZmllbGRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2Fwc1trZXldID0gW2ZpZWxkc10KKyAgICByZXR1cm4gY2FwcworCitkZWYgcGFyc2VsaW5lKGxpbmUpOgorICAgICIiIlBhcnNlIG9uZSBlbnRyeSBpbiBhIG1haWxjYXAgZmlsZSBhbmQgcmV0dXJuIGEgZGljdGlvbmFyeS4KKworICAgIFRoZSB2aWV3aW5nIGNvbW1hbmQgaXMgc3RvcmVkIGFzIHRoZSB2YWx1ZSB3aXRoIHRoZSBrZXkgInZpZXciLAorICAgIGFuZCB0aGUgcmVzdCBvZiB0aGUgZmllbGRzIHByb2R1Y2Uga2V5LXZhbHVlIHBhaXJzIGluIHRoZSBkaWN0LgorICAgICIiIgorICAgIGZpZWxkcyA9IFtdCisgICAgaSwgbiA9IDAsIGxlbihsaW5lKQorICAgIHdoaWxlIGkgPCBuOgorICAgICAgICBmaWVsZCwgaSA9IHBhcnNlZmllbGQobGluZSwgaSwgbikKKyAgICAgICAgZmllbGRzLmFwcGVuZChmaWVsZCkKKyAgICAgICAgaSA9IGkrMSAjIFNraXAgc2VtaWNvbG9uCisgICAgaWYgbGVuKGZpZWxkcykgPCAyOgorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorICAgIGtleSwgdmlldywgcmVzdCA9IGZpZWxkc1swXSwgZmllbGRzWzFdLCBmaWVsZHNbMjpdCisgICAgZmllbGRzID0geyd2aWV3Jzogdmlld30KKyAgICBmb3IgZmllbGQgaW4gcmVzdDoKKyAgICAgICAgaSA9IGZpZWxkLmZpbmQoJz0nKQorICAgICAgICBpZiBpIDwgMDoKKyAgICAgICAgICAgIGZrZXkgPSBmaWVsZAorICAgICAgICAgICAgZnZhbHVlID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZrZXkgPSBmaWVsZFs6aV0uc3RyaXAoKQorICAgICAgICAgICAgZnZhbHVlID0gZmllbGRbaSsxOl0uc3RyaXAoKQorICAgICAgICBpZiBma2V5IGluIGZpZWxkczoKKyAgICAgICAgICAgICMgSWdub3JlIGl0CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWVsZHNbZmtleV0gPSBmdmFsdWUKKyAgICByZXR1cm4ga2V5LCBmaWVsZHMKKworZGVmIHBhcnNlZmllbGQobGluZSwgaSwgbik6CisgICAgIiIiU2VwYXJhdGUgb25lIGtleS12YWx1ZSBwYWlyIGluIGEgbWFpbGNhcCBlbnRyeS4iIiIKKyAgICBzdGFydCA9IGkKKyAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgYyA9IGxpbmVbaV0KKyAgICAgICAgaWYgYyA9PSAnOyc6CisgICAgICAgICAgICBicmVhaworICAgICAgICBlbGlmIGMgPT0gJ1xcJzoKKyAgICAgICAgICAgIGkgPSBpKzIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgPSBpKzEKKyAgICByZXR1cm4gbGluZVtzdGFydDppXS5zdHJpcCgpLCBpCisKKworIyBQYXJ0IDM6IHVzaW5nIHRoZSBkYXRhYmFzZS4KKworZGVmIGZpbmRtYXRjaChjYXBzLCBNSU1FdHlwZSwga2V5PSd2aWV3JywgZmlsZW5hbWU9Ii9kZXYvbnVsbCIsIHBsaXN0PVtdKToKKyAgICAiIiJGaW5kIGEgbWF0Y2ggZm9yIGEgbWFpbGNhcCBlbnRyeS4KKworICAgIFJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZSBtYWlsY2FwIGVudHJ5CisgICAgdXNlZDsgKE5vbmUsIE5vbmUpIGlmIG5vIG1hdGNoIGlzIGZvdW5kLiAgVGhpcyBtYXkgaW52b2tlIHRoZQorICAgICd0ZXN0JyBjb21tYW5kIG9mIHNldmVyYWwgbWF0Y2hpbmcgZW50cmllcyBiZWZvcmUgZGVjaWRpbmcgd2hpY2gKKyAgICBlbnRyeSB0byB1c2UuCisKKyAgICAiIiIKKyAgICBlbnRyaWVzID0gbG9va3VwKGNhcHMsIE1JTUV0eXBlLCBrZXkpCisgICAgIyBYWFggVGhpcyBjb2RlIHNob3VsZCBzb21laG93IGNoZWNrIGZvciB0aGUgbmVlZHN0ZXJtaW5hbCBmbGFnLgorICAgIGZvciBlIGluIGVudHJpZXM6CisgICAgICAgIGlmICd0ZXN0JyBpbiBlOgorICAgICAgICAgICAgdGVzdCA9IHN1YnN0KGVbJ3Rlc3QnXSwgZmlsZW5hbWUsIHBsaXN0KQorICAgICAgICAgICAgaWYgdGVzdCBhbmQgb3Muc3lzdGVtKHRlc3QpICE9IDA6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgY29tbWFuZCA9IHN1YnN0KGVba2V5XSwgTUlNRXR5cGUsIGZpbGVuYW1lLCBwbGlzdCkKKyAgICAgICAgcmV0dXJuIGNvbW1hbmQsIGUKKyAgICByZXR1cm4gTm9uZSwgTm9uZQorCitkZWYgbG9va3VwKGNhcHMsIE1JTUV0eXBlLCBrZXk9Tm9uZSk6CisgICAgZW50cmllcyA9IFtdCisgICAgaWYgTUlNRXR5cGUgaW4gY2FwczoKKyAgICAgICAgZW50cmllcyA9IGVudHJpZXMgKyBjYXBzW01JTUV0eXBlXQorICAgIE1JTUV0eXBlcyA9IE1JTUV0eXBlLnNwbGl0KCcvJykKKyAgICBNSU1FdHlwZSA9IE1JTUV0eXBlc1swXSArICcvKicKKyAgICBpZiBNSU1FdHlwZSBpbiBjYXBzOgorICAgICAgICBlbnRyaWVzID0gZW50cmllcyArIGNhcHNbTUlNRXR5cGVdCisgICAgaWYga2V5IGlzIG5vdCBOb25lOgorICAgICAgICBlbnRyaWVzID0gZmlsdGVyKGxhbWJkYSBlLCBrZXk9a2V5OiBrZXkgaW4gZSwgZW50cmllcykKKyAgICByZXR1cm4gZW50cmllcworCitkZWYgc3Vic3QoZmllbGQsIE1JTUV0eXBlLCBmaWxlbmFtZSwgcGxpc3Q9W10pOgorICAgICMgWFhYIEFjdHVhbGx5LCB0aGlzIGlzIFVuaXgtc3BlY2lmaWMKKyAgICByZXMgPSAnJworICAgIGksIG4gPSAwLCBsZW4oZmllbGQpCisgICAgd2hpbGUgaSA8IG46CisgICAgICAgIGMgPSBmaWVsZFtpXTsgaSA9IGkrMQorICAgICAgICBpZiBjICE9ICclJzoKKyAgICAgICAgICAgIGlmIGMgPT0gJ1xcJzoKKyAgICAgICAgICAgICAgICBjID0gZmllbGRbaTppKzFdOyBpID0gaSsxCisgICAgICAgICAgICByZXMgPSByZXMgKyBjCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gZmllbGRbaV07IGkgPSBpKzEKKyAgICAgICAgICAgIGlmIGMgPT0gJyUnOgorICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIGMKKyAgICAgICAgICAgIGVsaWYgYyA9PSAncyc6CisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgZmlsZW5hbWUKKyAgICAgICAgICAgIGVsaWYgYyA9PSAndCc6CisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgTUlNRXR5cGUKKyAgICAgICAgICAgIGVsaWYgYyA9PSAneyc6CisgICAgICAgICAgICAgICAgc3RhcnQgPSBpCisgICAgICAgICAgICAgICAgd2hpbGUgaSA8IG4gYW5kIGZpZWxkW2ldICE9ICd9JzoKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgIG5hbWUgPSBmaWVsZFtzdGFydDppXQorICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBmaW5kcGFyYW0obmFtZSwgcGxpc3QpCisgICAgICAgICAgICAjIFhYWCBUbyBkbzoKKyAgICAgICAgICAgICMgJW4gPT0gbnVtYmVyIG9mIHBhcnRzIGlmIHR5cGUgaXMgbXVsdGlwYXJ0LyoKKyAgICAgICAgICAgICMgJUYgPT0gbGlzdCBvZiBhbHRlcm5hdGluZyB0eXBlIGFuZCBmaWxlbmFtZSBmb3IgcGFydHMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgJyUnICsgYworICAgIHJldHVybiByZXMKKworZGVmIGZpbmRwYXJhbShuYW1lLCBwbGlzdCk6CisgICAgbmFtZSA9IG5hbWUubG93ZXIoKSArICc9JworICAgIG4gPSBsZW4obmFtZSkKKyAgICBmb3IgcCBpbiBwbGlzdDoKKyAgICAgICAgaWYgcFs6bl0ubG93ZXIoKSA9PSBuYW1lOgorICAgICAgICAgICAgcmV0dXJuIHBbbjpdCisgICAgcmV0dXJuICcnCisKKworIyBQYXJ0IDQ6IHRlc3QgcHJvZ3JhbS4KKworZGVmIHRlc3QoKToKKyAgICBpbXBvcnQgc3lzCisgICAgY2FwcyA9IGdldGNhcHMoKQorICAgIGlmIG5vdCBzeXMuYXJndlsxOl06CisgICAgICAgIHNob3coY2FwcykKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKHN5cy5hcmd2KSwgMik6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndltpOmkrMl0KKyAgICAgICAgaWYgbGVuKGFyZ3MpIDwgMjoKKyAgICAgICAgICAgIHByaW50ICJ1c2FnZTogbWFpbGNhcCBbTUlNRXR5cGUgZmlsZV0gLi4uIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIE1JTUV0eXBlID0gYXJnc1swXQorICAgICAgICBmaWxlID0gYXJnc1sxXQorICAgICAgICBjb21tYW5kLCBlID0gZmluZG1hdGNoKGNhcHMsIE1JTUV0eXBlLCAndmlldycsIGZpbGUpCisgICAgICAgIGlmIG5vdCBjb21tYW5kOgorICAgICAgICAgICAgcHJpbnQgIk5vIHZpZXdlciBmb3VuZCBmb3IiLCB0eXBlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiRXhlY3V0aW5nOiIsIGNvbW1hbmQKKyAgICAgICAgICAgIHN0cyA9IG9zLnN5c3RlbShjb21tYW5kKQorICAgICAgICAgICAgaWYgc3RzOgorICAgICAgICAgICAgICAgIHByaW50ICJFeGl0IHN0YXR1czoiLCBzdHMKKworZGVmIHNob3coY2Fwcyk6CisgICAgcHJpbnQgIk1haWxjYXAgZmlsZXM6IgorICAgIGZvciBmbiBpbiBsaXN0bWFpbGNhcGZpbGVzKCk6IHByaW50ICJcdCIgKyBmbgorICAgIHByaW50CisgICAgaWYgbm90IGNhcHM6IGNhcHMgPSBnZXRjYXBzKCkKKyAgICBwcmludCAiTWFpbGNhcCBlbnRyaWVzOiIKKyAgICBwcmludAorICAgIGNrZXlzID0gY2Fwcy5rZXlzKCkKKyAgICBja2V5cy5zb3J0KCkKKyAgICBmb3IgdHlwZSBpbiBja2V5czoKKyAgICAgICAgcHJpbnQgdHlwZQorICAgICAgICBlbnRyaWVzID0gY2Fwc1t0eXBlXQorICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgorICAgICAgICAgICAga2V5cyA9IGUua2V5cygpCisgICAgICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICAgICAgZm9yIGsgaW4ga2V5czoKKyAgICAgICAgICAgICAgICBwcmludCAiICAlLTE1cyIgJSBrLCBlW2tdCisgICAgICAgICAgICBwcmludAorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWlsY2FwLnB5YyBiL2xpYi9weXRob24yLjcvbWFpbGNhcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlY2JiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFpbGNhcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYWlsY2FwLnB5byBiL2xpYi9weXRob24yLjcvbWFpbGNhcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZlY2JiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWFpbGNhcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tYXJrdXBiYXNlLnB5IGIvbGliL3B5dGhvbjIuNy9tYXJrdXBiYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWI5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21hcmt1cGJhc2UucHkKQEAgLTAsMCArMSwzOTYgQEAKKyIiIlNoYXJlZCBzdXBwb3J0IGZvciBzY2FubmluZyBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9ucyBpbiBIVE1MIGFuZCBYSFRNTC4KKworVGhpcyBtb2R1bGUgaXMgdXNlZCBhcyBhIGZvdW5kYXRpb24gZm9yIHRoZSBIVE1MUGFyc2VyIGFuZCBzZ21sbGliCittb2R1bGVzIChpbmRpcmVjdGx5LCBmb3IgaHRtbGxpYiBhcyB3ZWxsKS4gIEl0IGhhcyBubyBkb2N1bWVudGVkCitwdWJsaWMgQVBJIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuCisKKyIiIgorCitpbXBvcnQgcmUKKworX2RlY2xuYW1lX21hdGNoID0gcmUuY29tcGlsZShyJ1thLXpBLVpdWy1fLmEtekEtWjAtOV0qXHMqJykubWF0Y2gKK19kZWNsc3RyaW5nbGl0X21hdGNoID0gcmUuY29tcGlsZShyJyhcJ1teXCddKlwnfCJbXiJdKiIpXHMqJykubWF0Y2gKK19jb21tZW50Y2xvc2UgPSByZS5jb21waWxlKHInLS1ccyo+JykKK19tYXJrZWRzZWN0aW9uY2xvc2UgPSByZS5jb21waWxlKHInXVxzKl1ccyo+JykKKworIyBBbiBhbmFseXNpcyBvZiB0aGUgTVMtV29yZCBleHRlbnNpb25zIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LnBsYW5ldHB1Ymxpc2guY29tL3htbGFyZW5hL3hhcC9UaHVyc2RheS9Xb3JkdG9YTUwucGRmCisKK19tc21hcmtlZHNlY3Rpb25jbG9zZSA9IHJlLmNvbXBpbGUociddXHMqPicpCisKK2RlbCByZQorCisKK2NsYXNzIFBhcnNlckJhc2U6CisgICAgIiIiUGFyc2VyIGJhc2UgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgc29tZSBjb21tb24gc3VwcG9ydCBtZXRob2RzIHVzZWQKKyAgICBieSB0aGUgU0dNTC9IVE1MIGFuZCBYSFRNTCBwYXJzZXJzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBQYXJzZXJCYXNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgICAgICJtYXJrdXBiYXNlLlBhcnNlckJhc2UgbXVzdCBiZSBzdWJjbGFzc2VkIikKKworICAgIGRlZiBlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICJzdWJjbGFzc2VzIG9mIFBhcnNlckJhc2UgbXVzdCBvdmVycmlkZSBlcnJvcigpIikKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5saW5lbm8gPSAxCisgICAgICAgIHNlbGYub2Zmc2V0ID0gMAorCisgICAgZGVmIGdldHBvcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGN1cnJlbnQgbGluZSBudW1iZXIgYW5kIG9mZnNldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubGluZW5vLCBzZWxmLm9mZnNldAorCisgICAgIyBJbnRlcm5hbCAtLSB1cGRhdGUgbGluZSBudW1iZXIgYW5kIG9mZnNldC4gIFRoaXMgc2hvdWxkIGJlCisgICAgIyBjYWxsZWQgZm9yIGVhY2ggcGllY2Ugb2YgZGF0YSBleGFjdGx5IG9uY2UsIGluIG9yZGVyIC0tIGluIG90aGVyCisgICAgIyB3b3JkcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhbGwgdGhlIGlucHV0IHN0cmluZ3MgdG8gdGhpcworICAgICMgZnVuY3Rpb24gc2hvdWxkIGJlIGV4YWN0bHkgdGhlIGVudGlyZSBpbnB1dC4KKyAgICBkZWYgdXBkYXRlcG9zKHNlbGYsIGksIGopOgorICAgICAgICBpZiBpID49IGo6CisgICAgICAgICAgICByZXR1cm4gagorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIG5saW5lcyA9IHJhd2RhdGEuY291bnQoIlxuIiwgaSwgaikKKyAgICAgICAgaWYgbmxpbmVzOgorICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIG5saW5lcworICAgICAgICAgICAgcG9zID0gcmF3ZGF0YS5yaW5kZXgoIlxuIiwgaSwgaikgIyBTaG91bGQgbm90IGZhaWwKKyAgICAgICAgICAgIHNlbGYub2Zmc2V0ID0gai0ocG9zKzEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm9mZnNldCA9IHNlbGYub2Zmc2V0ICsgai1pCisgICAgICAgIHJldHVybiBqCisKKyAgICBfZGVjbF9vdGhlcmNoYXJzID0gJycKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgZGVjbGFyYXRpb24gKGZvciB1c2UgYnkgc3ViY2xhc3NlcykuCisgICAgZGVmIHBhcnNlX2RlY2xhcmF0aW9uKHNlbGYsIGkpOgorICAgICAgICAjIFRoaXMgaXMgc29tZSBzb3J0IG9mIGRlY2xhcmF0aW9uOyBpbiAiSFRNTCBhcworICAgICAgICAjIGRlcGxveWVkLCIgdGhpcyBzaG91bGQgb25seSBiZSB0aGUgZG9jdW1lbnQgdHlwZQorICAgICAgICAjIGRlY2xhcmF0aW9uICgiPCFET0NUWVBFIGh0bWwuLi4+IikuCisgICAgICAgICMgSVNPIDg4Nzk6MTk4NiwgaG93ZXZlciwgaGFzIG1vcmUgY29tcGxleAorICAgICAgICAjIGRlY2xhcmF0aW9uIHN5bnRheCBmb3IgZWxlbWVudHMgaW4gPCEuLi4+LCBpbmNsdWRpbmc6CisgICAgICAgICMgLS1jb21tZW50LS0KKyAgICAgICAgIyBbbWFya2VkIHNlY3Rpb25dCisgICAgICAgICMgbmFtZSBpbiB0aGUgZm9sbG93aW5nIGxpc3Q6IEVOVElUWSwgRE9DVFlQRSwgRUxFTUVOVCwKKyAgICAgICAgIyBBVFRMSVNULCBOT1RBVElPTiwgU0hPUlRSRUYsIFVTRU1BUCwKKyAgICAgICAgIyBMSU5LVFlQRSwgTElOSywgSURMSU5LLCBVU0VMSU5LLCBTWVNURU0KKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBqID0gaSArIDIKKyAgICAgICAgYXNzZXJ0IHJhd2RhdGFbaTpqXSA9PSAiPCEiLCAidW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX2RlY2xhcmF0aW9uIgorICAgICAgICBpZiByYXdkYXRhW2o6aisxXSA9PSAiPiI6CisgICAgICAgICAgICAjIHRoZSBlbXB0eSBjb21tZW50IDwhPgorICAgICAgICAgICAgcmV0dXJuIGogKyAxCisgICAgICAgIGlmIHJhd2RhdGFbajpqKzFdIGluICgiLSIsICIiKToKKyAgICAgICAgICAgICMgU3RhcnQgb2YgY29tbWVudCBmb2xsb3dlZCBieSBidWZmZXIgYm91bmRhcnksCisgICAgICAgICAgICAjIG9yIGp1c3QgYSBidWZmZXIgYm91bmRhcnkuCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgIyBBIHNpbXBsZSwgcHJhY3RpY2FsIHZlcnNpb24gY291bGQgbG9vayBsaWtlOiAoKG5hbWV8c3RyaW5nbGl0KSBTKikgKyAnPicKKyAgICAgICAgbiA9IGxlbihyYXdkYXRhKQorICAgICAgICBpZiByYXdkYXRhW2o6aisyXSA9PSAnLS0nOiAjY29tbWVudAorICAgICAgICAgICAgIyBMb2NhdGUgLS0uKi0tIGFzIHRoZSBib2R5IG9mIHRoZSBjb21tZW50CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9jb21tZW50KGkpCisgICAgICAgIGVsaWYgcmF3ZGF0YVtqXSA9PSAnWyc6ICNtYXJrZWQgc2VjdGlvbgorICAgICAgICAgICAgIyBMb2NhdGUgW3N0YXR1c1dvcmQgWy4uLmFyYml0cmFyeSBTR01MLi4uXV0gYXMgdGhlIGJvZHkgb2YgdGhlIG1hcmtlZCBzZWN0aW9uCisgICAgICAgICAgICAjIFdoZXJlIHN0YXR1c1dvcmQgaXMgb25lIG9mIFRFTVAsIENEQVRBLCBJR05PUkUsIElOQ0xVREUsIFJDREFUQQorICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyBleHRlbmRlZCBieSBNaWNyb3NvZnQgT2ZmaWNlICJTYXZlIGFzIFdlYiIgZnVuY3Rpb24KKyAgICAgICAgICAgICMgdG8gaW5jbHVkZSBbaWYuLi5dIGFuZCBbZW5kaWZdLgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyc2VfbWFya2VkX3NlY3Rpb24oaSkKKyAgICAgICAgZWxzZTogI2FsbCBvdGhlciBkZWNsYXJhdGlvbiBlbGVtZW50cworICAgICAgICAgICAgZGVjbHR5cGUsIGogPSBzZWxmLl9zY2FuX25hbWUoaiwgaSkKKyAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICByZXR1cm4gagorICAgICAgICBpZiBkZWNsdHlwZSA9PSAiZG9jdHlwZSI6CisgICAgICAgICAgICBzZWxmLl9kZWNsX290aGVyY2hhcnMgPSAnJworICAgICAgICB3aGlsZSBqIDwgbjoKKyAgICAgICAgICAgIGMgPSByYXdkYXRhW2pdCisgICAgICAgICAgICBpZiBjID09ICI+IjoKKyAgICAgICAgICAgICAgICAjIGVuZCBvZiBkZWNsYXJhdGlvbiBzeW50YXgKKyAgICAgICAgICAgICAgICBkYXRhID0gcmF3ZGF0YVtpKzI6al0KKyAgICAgICAgICAgICAgICBpZiBkZWNsdHlwZSA9PSAiZG9jdHlwZSI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RlY2woZGF0YSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEFjY29yZGluZyB0byB0aGUgSFRNTDUgc3BlY3Mgc2VjdGlvbnMgIjguMi40LjQ0IEJvZ3VzCisgICAgICAgICAgICAgICAgICAgICMgY29tbWVudCBzdGF0ZSIgYW5kICI4LjIuNC40NSBNYXJrdXAgZGVjbGFyYXRpb24gb3BlbgorICAgICAgICAgICAgICAgICAgICAjIHN0YXRlIiwgYSBjb21tZW50IHRva2VuIHNob3VsZCBiZSBlbWl0dGVkLgorICAgICAgICAgICAgICAgICAgICAjIENhbGxpbmcgdW5rbm93bl9kZWNsIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkgdGhvdWdoLgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fZGVjbChkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybiBqICsgMQorICAgICAgICAgICAgaWYgYyBpbiAiXCInIjoKKyAgICAgICAgICAgICAgICBtID0gX2RlY2xzdHJpbmdsaXRfbWF0Y2gocmF3ZGF0YSwgaikKKyAgICAgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xICMgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgIGogPSBtLmVuZCgpCisgICAgICAgICAgICBlbGlmIGMgaW4gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiOgorICAgICAgICAgICAgICAgIG5hbWUsIGogPSBzZWxmLl9zY2FuX25hbWUoaiwgaSkKKyAgICAgICAgICAgIGVsaWYgYyBpbiBzZWxmLl9kZWNsX290aGVyY2hhcnM6CisgICAgICAgICAgICAgICAgaiA9IGogKyAxCisgICAgICAgICAgICBlbGlmIGMgPT0gIlsiOgorICAgICAgICAgICAgICAgICMgdGhpcyBjb3VsZCBiZSBoYW5kbGVkIGluIGEgc2VwYXJhdGUgZG9jdHlwZSBwYXJzZXIKKyAgICAgICAgICAgICAgICBpZiBkZWNsdHlwZSA9PSAiZG9jdHlwZSI6CisgICAgICAgICAgICAgICAgICAgIGogPSBzZWxmLl9wYXJzZV9kb2N0eXBlX3N1YnNldChqICsgMSwgaSkKKyAgICAgICAgICAgICAgICBlbGlmIGRlY2x0eXBlIGluICgiYXR0bGlzdCIsICJsaW5rdHlwZSIsICJsaW5rIiwgImVsZW1lbnQiKToKKyAgICAgICAgICAgICAgICAgICAgIyBtdXN0IHRvbGVyYXRlIFtdJ2QgZ3JvdXBzIGluIGEgY29udGVudCBtb2RlbCBpbiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICMgYWxzbyBpbiBkYXRhIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9ucyBvZiBhdHRsaXN0IGRlY2xhcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICMgYWxzbyBsaW5rIHR5cGUgZGVjbGFyYXRpb24gc3Vic2V0cyBpbiBsaW5rdHlwZSBkZWNsYXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgIyBhbHNvIGxpbmsgYXR0cmlidXRlIHNwZWNpZmljYXRpb24gbGlzdHMgaW4gbGluayBkZWNsYXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigidW5zdXBwb3J0ZWQgJ1snIGNoYXIgaW4gJXMgZGVjbGFyYXRpb24iICUgZGVjbHR5cGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigidW5leHBlY3RlZCAnWycgY2hhciBpbiBkZWNsYXJhdGlvbiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkICVyIGNoYXIgaW4gZGVjbGFyYXRpb24iICUgcmF3ZGF0YVtqXSkKKyAgICAgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgIHJldHVybiAtMSAjIGluY29tcGxldGUKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgYSBtYXJrZWQgc2VjdGlvbgorICAgICMgT3ZlcnJpZGUgdGhpcyB0byBoYW5kbGUgTVMtd29yZCBleHRlbnNpb24gc3ludGF4IDwhW2lmIHdvcmRdPmNvbnRlbnQ8IVtlbmRpZl0+CisgICAgZGVmIHBhcnNlX21hcmtlZF9zZWN0aW9uKHNlbGYsIGksIHJlcG9ydD0xKToKKyAgICAgICAgcmF3ZGF0YT0gc2VsZi5yYXdkYXRhCisgICAgICAgIGFzc2VydCByYXdkYXRhW2k6aSszXSA9PSAnPCFbJywgInVuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9tYXJrZWRfc2VjdGlvbigpIgorICAgICAgICBzZWN0TmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZSggaSszLCBpICkKKyAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICByZXR1cm4gagorICAgICAgICBpZiBzZWN0TmFtZSBpbiAoInRlbXAiLCAiY2RhdGEiLCAiaWdub3JlIiwgImluY2x1ZGUiLCAicmNkYXRhIik6CisgICAgICAgICAgICAjIGxvb2sgZm9yIHN0YW5kYXJkIF1dPiBlbmRpbmcKKyAgICAgICAgICAgIG1hdGNoPSBfbWFya2Vkc2VjdGlvbmNsb3NlLnNlYXJjaChyYXdkYXRhLCBpKzMpCisgICAgICAgIGVsaWYgc2VjdE5hbWUgaW4gKCJpZiIsICJlbHNlIiwgImVuZGlmIik6CisgICAgICAgICAgICAjIGxvb2sgZm9yIE1TIE9mZmljZSBdPiBlbmRpbmcKKyAgICAgICAgICAgIG1hdGNoPSBfbXNtYXJrZWRzZWN0aW9uY2xvc2Uuc2VhcmNoKHJhd2RhdGEsIGkrMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3Vua25vd24gc3RhdHVzIGtleXdvcmQgJXIgaW4gbWFya2VkIHNlY3Rpb24nICUgcmF3ZGF0YVtpKzM6al0pCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBpZiByZXBvcnQ6CisgICAgICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgICAgIHNlbGYudW5rbm93bl9kZWNsKHJhd2RhdGFbaSszOiBqXSkKKyAgICAgICAgcmV0dXJuIG1hdGNoLmVuZCgwKQorCisgICAgIyBJbnRlcm5hbCAtLSBwYXJzZSBjb21tZW50LCByZXR1cm4gbGVuZ3RoIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX2NvbW1lbnQoc2VsZiwgaSwgcmVwb3J0PTEpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGlmIHJhd2RhdGFbaTppKzRdICE9ICc8IS0tJzoKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9jb21tZW50KCknKQorICAgICAgICBtYXRjaCA9IF9jb21tZW50Y2xvc2Uuc2VhcmNoKHJhd2RhdGEsIGkrNCkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGlmIHJlcG9ydDoKKyAgICAgICAgICAgIGogPSBtYXRjaC5zdGFydCgwKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVfY29tbWVudChyYXdkYXRhW2krNDogal0pCisgICAgICAgIHJldHVybiBtYXRjaC5lbmQoMCkKKworICAgICMgSW50ZXJuYWwgLS0gc2NhbiBwYXN0IHRoZSBpbnRlcm5hbCBzdWJzZXQgaW4gYSA8IURPQ1RZUEUgZGVjbGFyYXRpb24sCisgICAgIyByZXR1cm5pbmcgdGhlIGluZGV4IGp1c3QgcGFzdCBhbnkgd2hpdGVzcGFjZSBmb2xsb3dpbmcgdGhlIHRyYWlsaW5nICddJy4KKyAgICBkZWYgX3BhcnNlX2RvY3R5cGVfc3Vic2V0KHNlbGYsIGksIGRlY2xzdGFydHBvcyk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgbiA9IGxlbihyYXdkYXRhKQorICAgICAgICBqID0gaQorICAgICAgICB3aGlsZSBqIDwgbjoKKyAgICAgICAgICAgIGMgPSByYXdkYXRhW2pdCisgICAgICAgICAgICBpZiBjID09ICI8IjoKKyAgICAgICAgICAgICAgICBzID0gcmF3ZGF0YVtqOmorMl0KKyAgICAgICAgICAgICAgICBpZiBzID09ICI8IjoKKyAgICAgICAgICAgICAgICAgICAgIyBlbmQgb2YgYnVmZmVyOyBpbmNvbXBsZXRlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIGlmIHMgIT0gIjwhIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVwb3MoZGVjbHN0YXJ0cG9zLCBqICsgMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigidW5leHBlY3RlZCBjaGFyIGluIGludGVybmFsIHN1YnNldCAoaW4gJXIpIiAlIHMpCisgICAgICAgICAgICAgICAgaWYgKGogKyAyKSA9PSBuOgorICAgICAgICAgICAgICAgICAgICAjIGVuZCBvZiBidWZmZXI7IGluY29tcGxldGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgaWYgKGogKyA0KSA+IG46CisgICAgICAgICAgICAgICAgICAgICMgZW5kIG9mIGJ1ZmZlcjsgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhW2o6ais0XSA9PSAiPCEtLSI6CisgICAgICAgICAgICAgICAgICAgIGogPSBzZWxmLnBhcnNlX2NvbW1lbnQoaiwgcmVwb3J0PTApCisgICAgICAgICAgICAgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGogKyAyLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICAgICAgaWYgaiA9PSAtMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gKCJhdHRsaXN0IiwgImVsZW1lbnQiLCAiZW50aXR5IiwgIm5vdGF0aW9uIik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlcG9zKGRlY2xzdGFydHBvcywgaiArIDIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biBkZWNsYXJhdGlvbiAlciBpbiBpbnRlcm5hbCBzdWJzZXQiICUgbmFtZSkKKyAgICAgICAgICAgICAgICAjIGhhbmRsZSB0aGUgaW5kaXZpZHVhbCBuYW1lcworICAgICAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHNlbGYsICJfcGFyc2VfZG9jdHlwZV8iICsgbmFtZSkKKyAgICAgICAgICAgICAgICBqID0gbWV0aChqLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICBlbGlmIGMgPT0gIiUiOgorICAgICAgICAgICAgICAgICMgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBpZiAoaiArIDEpID09IG46CisgICAgICAgICAgICAgICAgICAgICMgZW5kIG9mIGJ1ZmZlcjsgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBzLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGogKyAxLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtqXSA9PSAiOyI6CisgICAgICAgICAgICAgICAgICAgIGogPSBqICsgMQorICAgICAgICAgICAgZWxpZiBjID09ICJdIjoKKyAgICAgICAgICAgICAgICBqID0gaiArIDEKKyAgICAgICAgICAgICAgICB3aGlsZSBqIDwgbiBhbmQgcmF3ZGF0YVtqXS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgICAgIGogPSBqICsgMQorICAgICAgICAgICAgICAgIGlmIGogPCBuOgorICAgICAgICAgICAgICAgICAgICBpZiByYXdkYXRhW2pdID09ICI+IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlcG9zKGRlY2xzdGFydHBvcywgaikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigidW5leHBlY3RlZCBjaGFyIGFmdGVyIGludGVybmFsIHN1YnNldCIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBlbGlmIGMuaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgIGogPSBqICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZXBvcyhkZWNsc3RhcnRwb3MsIGopCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcigidW5leHBlY3RlZCBjaGFyICVyIGluIGludGVybmFsIHN1YnNldCIgJSBjKQorICAgICAgICAjIGVuZCBvZiBidWZmZXIgcmVhY2hlZAorICAgICAgICByZXR1cm4gLTEKKworICAgICMgSW50ZXJuYWwgLS0gc2NhbiBwYXN0IDwhRUxFTUVOVCBkZWNsYXJhdGlvbnMKKyAgICBkZWYgX3BhcnNlX2RvY3R5cGVfZWxlbWVudChzZWxmLCBpLCBkZWNsc3RhcnRwb3MpOgorICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGksIGRlY2xzdGFydHBvcykKKyAgICAgICAgaWYgaiA9PSAtMToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAjIHN0eWxlIGNvbnRlbnQgbW9kZWw7IGp1c3Qgc2tpcCB1bnRpbCAnPicKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpZiAnPicgaW4gcmF3ZGF0YVtqOl06CisgICAgICAgICAgICByZXR1cm4gcmF3ZGF0YS5maW5kKCI+IiwgaikgKyAxCisgICAgICAgIHJldHVybiAtMQorCisgICAgIyBJbnRlcm5hbCAtLSBzY2FuIHBhc3QgPCFBVFRMSVNUIGRlY2xhcmF0aW9ucworICAgIGRlZiBfcGFyc2VfZG9jdHlwZV9hdHRsaXN0KHNlbGYsIGksIGRlY2xzdGFydHBvcyk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShpLCBkZWNsc3RhcnRwb3MpCisgICAgICAgIGMgPSByYXdkYXRhW2o6aisxXQorICAgICAgICBpZiBjID09ICIiOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGlmIGMgPT0gIj4iOgorICAgICAgICAgICAgcmV0dXJuIGogKyAxCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIHNjYW4gYSBzZXJpZXMgb2YgYXR0cmlidXRlIGRlc2NyaXB0aW9uczsgc2ltcGxpZmllZDoKKyAgICAgICAgICAgICMgICBuYW1lIHR5cGUgW3ZhbHVlXSBbI2NvbnN0cmFpbnRdCisgICAgICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGosIGRlY2xzdGFydHBvcykKKyAgICAgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgICAgIHJldHVybiBqCisgICAgICAgICAgICBjID0gcmF3ZGF0YVtqOmorMV0KKyAgICAgICAgICAgIGlmIGMgPT0gIiI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBjID09ICIoIjoKKyAgICAgICAgICAgICAgICAjIGFuIGVudW1lcmF0ZWQgdHlwZTsgbG9vayBmb3IgJyknCisgICAgICAgICAgICAgICAgaWYgIikiIGluIHJhd2RhdGFbajpdOgorICAgICAgICAgICAgICAgICAgICBqID0gcmF3ZGF0YS5maW5kKCIpIiwgaikgKyAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgd2hpbGUgcmF3ZGF0YVtqOmorMV0uaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgICAgICBqID0gaiArIDEKKyAgICAgICAgICAgICAgICBpZiBub3QgcmF3ZGF0YVtqOl06CisgICAgICAgICAgICAgICAgICAgICMgZW5kIG9mIGJ1ZmZlciwgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShqLCBkZWNsc3RhcnRwb3MpCisgICAgICAgICAgICBjID0gcmF3ZGF0YVtqOmorMV0KKyAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgaWYgYyBpbiAiJ1wiIjoKKyAgICAgICAgICAgICAgICBtID0gX2RlY2xzdHJpbmdsaXRfbWF0Y2gocmF3ZGF0YSwgaikKKyAgICAgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICAgICBqID0gbS5lbmQoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIGMgPSByYXdkYXRhW2o6aisxXQorICAgICAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIGMgPT0gIiMiOgorICAgICAgICAgICAgICAgIGlmIHJhd2RhdGFbajpdID09ICIjIjoKKyAgICAgICAgICAgICAgICAgICAgIyBlbmQgb2YgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIG5hbWUsIGogPSBzZWxmLl9zY2FuX25hbWUoaiArIDEsIGRlY2xzdGFydHBvcykKKyAgICAgICAgICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgICAgICAgICBjID0gcmF3ZGF0YVtqOmorMV0KKyAgICAgICAgICAgICAgICBpZiBub3QgYzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICBpZiBjID09ICc+JzoKKyAgICAgICAgICAgICAgICAjIGFsbCBkb25lCisgICAgICAgICAgICAgICAgcmV0dXJuIGogKyAxCisKKyAgICAjIEludGVybmFsIC0tIHNjYW4gcGFzdCA8IU5PVEFUSU9OIGRlY2xhcmF0aW9ucworICAgIGRlZiBfcGFyc2VfZG9jdHlwZV9ub3RhdGlvbihzZWxmLCBpLCBkZWNsc3RhcnRwb3MpOgorICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGksIGRlY2xzdGFydHBvcykKKyAgICAgICAgaWYgaiA8IDA6CisgICAgICAgICAgICByZXR1cm4gagorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBjID0gcmF3ZGF0YVtqOmorMV0KKyAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgICMgZW5kIG9mIGJ1ZmZlcjsgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgaWYgYyA9PSAnPic6CisgICAgICAgICAgICAgICAgcmV0dXJuIGogKyAxCisgICAgICAgICAgICBpZiBjIGluICInXCIiOgorICAgICAgICAgICAgICAgIG0gPSBfZGVjbHN0cmluZ2xpdF9tYXRjaChyYXdkYXRhLCBqKQorICAgICAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgICAgICBqID0gbS5lbmQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGosIGRlY2xzdGFydHBvcykKKyAgICAgICAgICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGoKKworICAgICMgSW50ZXJuYWwgLS0gc2NhbiBwYXN0IDwhRU5USVRZIGRlY2xhcmF0aW9ucworICAgIGRlZiBfcGFyc2VfZG9jdHlwZV9lbnRpdHkoc2VsZiwgaSwgZGVjbHN0YXJ0cG9zKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpZiByYXdkYXRhW2k6aSsxXSA9PSAiJSI6CisgICAgICAgICAgICBqID0gaSArIDEKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgYyA9IHJhd2RhdGFbajpqKzFdCisgICAgICAgICAgICAgICAgaWYgbm90IGM6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICAgICAgICAgIGlmIGMuaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgICAgICBqID0gaiArIDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaiA9IGkKKyAgICAgICAgbmFtZSwgaiA9IHNlbGYuX3NjYW5fbmFtZShqLCBkZWNsc3RhcnRwb3MpCisgICAgICAgIGlmIGogPCAwOgorICAgICAgICAgICAgcmV0dXJuIGoKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGMgPSBzZWxmLnJhd2RhdGFbajpqKzFdCisgICAgICAgICAgICBpZiBub3QgYzoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGlmIGMgaW4gIidcIiI6CisgICAgICAgICAgICAgICAgbSA9IF9kZWNsc3RyaW5nbGl0X21hdGNoKHJhd2RhdGEsIGopCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgaiA9IG0uZW5kKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTEgICAgIyBpbmNvbXBsZXRlCisgICAgICAgICAgICBlbGlmIGMgPT0gIj4iOgorICAgICAgICAgICAgICAgIHJldHVybiBqICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lLCBqID0gc2VsZi5fc2Nhbl9uYW1lKGosIGRlY2xzdGFydHBvcykKKyAgICAgICAgICAgICAgICBpZiBqIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGoKKworICAgICMgSW50ZXJuYWwgLS0gc2NhbiBhIG5hbWUgdG9rZW4gYW5kIHRoZSBuZXcgcG9zaXRpb24gYW5kIHRoZSB0b2tlbiwgb3IKKyAgICAjIHJldHVybiAtMSBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgICBkZWYgX3NjYW5fbmFtZShzZWxmLCBpLCBkZWNsc3RhcnRwb3MpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIG4gPSBsZW4ocmF3ZGF0YSkKKyAgICAgICAgaWYgaSA9PSBuOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIC0xCisgICAgICAgIG0gPSBfZGVjbG5hbWVfbWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHMgPSBtLmdyb3VwKCkKKyAgICAgICAgICAgIG5hbWUgPSBzLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIChpICsgbGVuKHMpKSA9PSBuOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCAtMSAgIyBlbmQgb2YgYnVmZmVyCisgICAgICAgICAgICByZXR1cm4gbmFtZS5sb3dlcigpLCBtLmVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZXBvcyhkZWNsc3RhcnRwb3MsIGkpCisgICAgICAgICAgICBzZWxmLmVycm9yKCJleHBlY3RlZCBuYW1lIHRva2VuIGF0ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAlIHJhd2RhdGFbZGVjbHN0YXJ0cG9zOmRlY2xzdGFydHBvcysyMF0pCisKKyAgICAjIFRvIGJlIG92ZXJyaWRkZW4gLS0gaGFuZGxlcnMgZm9yIHVua25vd24gb2JqZWN0cworICAgIGRlZiB1bmtub3duX2RlY2woc2VsZiwgZGF0YSk6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFya3VwYmFzZS5weWMgYi9saWIvcHl0aG9uMi43L21hcmt1cGJhc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5YmRmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21hcmt1cGJhc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWFya3VwYmFzZS5weW8gYi9saWIvcHl0aG9uMi43L21hcmt1cGJhc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYjZmYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21hcmt1cGJhc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWQ1LnB5IGIvbGliL3B5dGhvbjIuNy9tZDUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0Y2EzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWQ1LnB5CkBAIC0wLDAgKzEsMTQgQEAKKyMgJElkJAorIworIyAgQ29weXJpZ2h0IChDKSAyMDA1ICAgR3JlZ29yeSBQLiBTbWl0aCAoZ3JlZ0BrcnlwdG8ub3JnKQorIyAgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLndhcm4oInRoZSBtZDUgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHVzZSBoYXNobGliIGluc3RlYWQiLAorICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKKworZnJvbSBoYXNobGliIGltcG9ydCBtZDUKK25ldyA9IG1kNQorCitibG9ja3NpemUgPSAxICAgICAgICAjIGxlZ2FjeSB2YWx1ZSAod3JvbmcgaW4gYW55IHVzZWZ1bCBzZW5zZSkKK2RpZ2VzdF9zaXplID0gMTYKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWQ1LnB5YyBiL2xpYi9weXRob24yLjcvbWQ1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg0NGNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tZDUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWQ1LnB5byBiL2xpYi9weXRob24yLjcvbWQ1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg0NGNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tZDUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWhsaWIucHkgYi9saWIvcHl0aG9uMi43L21obGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NmU4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21obGliLnB5CkBAIC0wLDAgKzEsMTAwNSBAQAorIiIiTUggaW50ZXJmYWNlIC0tIHB1cmVseSBvYmplY3Qtb3JpZW50ZWQgKHdlbGwsIGFsbW9zdCkKKworRXhlY3V0aXZlIHN1bW1hcnk6CisKK2ltcG9ydCBtaGxpYgorCittaCA9IG1obGliLk1IKCkgICAgICAgICAjIHVzZSBkZWZhdWx0IG1haWxib3ggZGlyZWN0b3J5IGFuZCBwcm9maWxlCittaCA9IG1obGliLk1IKG1haWxib3gpICAjIG92ZXJyaWRlIG1haWxib3ggbG9jYXRpb24gKGRlZmF1bHQgZnJvbSBwcm9maWxlKQorbWggPSBtaGxpYi5NSChtYWlsYm94LCBwcm9maWxlKSAjIG92ZXJyaWRlIG1haWxib3ggYW5kIHByb2ZpbGUKKworbWguZXJyb3IoZm9ybWF0LCAuLi4pICAgIyBwcmludCBlcnJvciBtZXNzYWdlIC0tIGNhbiBiZSBvdmVycmlkZGVuCitzID0gbWguZ2V0cHJvZmlsZShrZXkpICAjIHByb2ZpbGUgZW50cnkgKE5vbmUgaWYgbm90IHNldCkKK3BhdGggPSBtaC5nZXRwYXRoKCkgICAgICMgbWFpbGJveCBwYXRobmFtZQorbmFtZSA9IG1oLmdldGNvbnRleHQoKSAgIyBuYW1lIG9mIGN1cnJlbnQgZm9sZGVyCittaC5zZXRjb250ZXh0KG5hbWUpICAgICAjIHNldCBuYW1lIG9mIGN1cnJlbnQgZm9sZGVyCisKK2xpc3QgPSBtaC5saXN0Zm9sZGVycygpICMgbmFtZXMgb2YgdG9wLWxldmVsIGZvbGRlcnMKK2xpc3QgPSBtaC5saXN0YWxsZm9sZGVycygpICMgbmFtZXMgb2YgYWxsIGZvbGRlcnMsIGluY2x1ZGluZyBzdWJmb2xkZXJzCitsaXN0ID0gbWgubGlzdHN1YmZvbGRlcnMobmFtZSkgIyBkaXJlY3Qgc3ViZm9sZGVycyBvZiBnaXZlbiBmb2xkZXIKK2xpc3QgPSBtaC5saXN0YWxsc3ViZm9sZGVycyhuYW1lKSAjIGFsbCBzdWJmb2xkZXJzIG9mIGdpdmVuIGZvbGRlcgorCittaC5tYWtlZm9sZGVyKG5hbWUpICAgICAjIGNyZWF0ZSBuZXcgZm9sZGVyCittaC5kZWxldGVmb2xkZXIobmFtZSkgICAjIGRlbGV0ZSBmb2xkZXIgLS0gbXVzdCBoYXZlIG5vIHN1YmZvbGRlcnMKKworZiA9IG1oLm9wZW5mb2xkZXIobmFtZSkgIyBuZXcgb3BlbiBmb2xkZXIgb2JqZWN0CisKK2YuZXJyb3IoZm9ybWF0LCAuLi4pICAgICMgc2FtZSBhcyBtaC5lcnJvcihmb3JtYXQsIC4uLikKK3BhdGggPSBmLmdldGZ1bGxuYW1lKCkgICMgZm9sZGVyJ3MgZnVsbCBwYXRobmFtZQorcGF0aCA9IGYuZ2V0c2VxdWVuY2VzZmlsZW5hbWUoKSAjIGZ1bGwgcGF0aG5hbWUgb2YgZm9sZGVyJ3Mgc2VxdWVuY2VzIGZpbGUKK3BhdGggPSBmLmdldG1lc3NhZ2VmaWxlbmFtZShuKSAgIyBmdWxsIHBhdGhuYW1lIG9mIG1lc3NhZ2UgbiBpbiBmb2xkZXIKKworbGlzdCA9IGYubGlzdG1lc3NhZ2VzKCkgIyBsaXN0IG9mIG1lc3NhZ2VzIGluIGZvbGRlciAoYXMgbnVtYmVycykKK24gPSBmLmdldGN1cnJlbnQoKSAgICAgICMgZ2V0IGN1cnJlbnQgbWVzc2FnZQorZi5zZXRjdXJyZW50KG4pICAgICAgICAgIyBzZXQgY3VycmVudCBtZXNzYWdlCitsaXN0ID0gZi5wYXJzZXNlcXVlbmNlKHNlcSkgICAgICMgcGFyc2UgbXNncyBzeW50YXggaW50byBsaXN0IG9mIG1lc3NhZ2VzCituID0gZi5nZXRsYXN0KCkgICAgICAgICAjIGdldCBsYXN0IG1lc3NhZ2UgKDAgaWYgbm8gbWVzc2Fnc2UpCitmLnNldGxhc3QobikgICAgICAgICAgICAjIHNldCBsYXN0IG1lc3NhZ2UgKGludGVybmFsIHVzZSBvbmx5KQorCitkaWN0ID0gZi5nZXRzZXF1ZW5jZXMoKSAjIGRpY3Rpb25hcnkgb2Ygc2VxdWVuY2VzIGluIGZvbGRlciB7bmFtZTogbGlzdH0KK2YucHV0c2VxdWVuY2VzKGRpY3QpICAgICMgd3JpdGUgc2VxdWVuY2VzIGJhY2sgdG8gZm9sZGVyCisKK2YuY3JlYXRlbWVzc2FnZShuLCBmcCkgICMgYWRkIG1lc3NhZ2UgZnJvbSBmaWxlIGYgYXMgbnVtYmVyIG4KK2YucmVtb3ZlbWVzc2FnZXMobGlzdCkgICMgcmVtb3ZlIG1lc3NhZ2VzIGluIGxpc3QgZnJvbSBmb2xkZXIKK2YucmVmaWxlbWVzc2FnZXMobGlzdCwgdG9mb2xkZXIpICMgbW92ZSBtZXNzYWdlcyBpbiBsaXN0IHRvIG90aGVyIGZvbGRlcgorZi5tb3ZlbWVzc2FnZShuLCB0b2ZvbGRlciwgdG9uKSAgIyBtb3ZlIG9uZSBtZXNzYWdlIHRvIGEgZ2l2ZW4gZGVzdGluYXRpb24KK2YuY29weW1lc3NhZ2UobiwgdG9mb2xkZXIsIHRvbikgICMgY29weSBvbmUgbWVzc2FnZSB0byBhIGdpdmVuIGRlc3RpbmF0aW9uCisKK20gPSBmLm9wZW5tZXNzYWdlKG4pICAgICMgbmV3IG9wZW4gbWVzc2FnZSBvYmplY3QgKGNvc3RzIGEgZmlsZSBkZXNjcmlwdG9yKQorbSBpcyBhIGRlcml2ZWQgY2xhc3Mgb2YgbWltZXRvb2xzLk1lc3NhZ2UocmZjODIyLk1lc3NhZ2UpLCB3aXRoOgorcyA9IG0uZ2V0aGVhZGVydGV4dCgpICAgIyB0ZXh0IG9mIG1lc3NhZ2UncyBoZWFkZXJzCitzID0gbS5nZXRoZWFkZXJ0ZXh0KHByZWQpICMgdGV4dCBvZiBtZXNzYWdlJ3MgaGVhZGVycywgZmlsdGVyZWQgYnkgcHJlZAorcyA9IG0uZ2V0Ym9keXRleHQoKSAgICAgIyB0ZXh0IG9mIG1lc3NhZ2UncyBib2R5LCBkZWNvZGVkCitzID0gbS5nZXRib2R5dGV4dCgwKSAgICAjIHRleHQgb2YgbWVzc2FnZSdzIGJvZHksIG5vdCBkZWNvZGVkCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIG1obGliIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjA7IHVzZSB0aGUgbWFpbGJveCAiCisgICAgICAgICAgICAibW9kdWxlIGluc3RlYWQiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworIyBYWFggVG8gZG8sIGZ1bmN0aW9uYWxpdHk6CisjIC0gYW5ub3RhdGUgbWVzc2FnZXMKKyMgLSBzZW5kIG1lc3NhZ2VzCisjCisjIFhYWCBUbyBkbywgb3JnYW5pemF0aW9uOgorIyAtIG1vdmUgSW50U2V0IHRvIHNlcGFyYXRlIGZpbGUKKyMgLSBtb3ZlIG1vc3QgTWVzc2FnZSBmdW5jdGlvbmFsaXR5IHRvIG1vZHVsZSBtaW1ldG9vbHMKKworCisjIEN1c3RvbWl6YWJsZSBkZWZhdWx0cworCitNSF9QUk9GSUxFID0gJ34vLm1oX3Byb2ZpbGUnCitQQVRIID0gJ34vTWFpbCcKK01IX1NFUVVFTkNFUyA9ICcubWhfc2VxdWVuY2VzJworRk9MREVSX1BST1RFQ1QgPSAwNzAwCisKKworIyBJbXBvcnRlZCBtb2R1bGVzCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgbWltZXRvb2xzCitpbXBvcnQgbXVsdGlmaWxlCitpbXBvcnQgc2h1dGlsCitmcm9tIGJpc2VjdCBpbXBvcnQgYmlzZWN0CisKK19fYWxsX18gPSBbIk1IIiwiRXJyb3IiLCJGb2xkZXIiLCJNZXNzYWdlIl0KKworIyBFeHBvcnRlZCBjb25zdGFudHMKKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworY2xhc3MgTUg6CisgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgcGFydGljdWxhciBjb2xsZWN0aW9uIG9mIGZvbGRlcnMuCisgICAgT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIGFyZSB0aGUgcGF0aG5hbWUgZm9yIHRoZSBkaXJlY3RvcnkKKyAgICBjb250YWluaW5nIHRoZSBjb2xsZWN0aW9uLCBhbmQgdGhlIE1IIHByb2ZpbGUgdG8gdXNlLgorICAgIElmIGVpdGhlciBpcyBvbWl0dGVkIG9yIGVtcHR5IGEgZGVmYXVsdCBpcyB1c2VkOyB0aGUgZGVmYXVsdAorICAgIGRpcmVjdG9yeSBpcyB0YWtlbiBmcm9tIHRoZSBNSCBwcm9maWxlIGlmIGl0IGlzIHNwZWNpZmllZCB0aGVyZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoID0gTm9uZSwgcHJvZmlsZSA9IE5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4iIiIKKyAgICAgICAgaWYgcHJvZmlsZSBpcyBOb25lOiBwcm9maWxlID0gTUhfUFJPRklMRQorICAgICAgICBzZWxmLnByb2ZpbGUgPSBvcy5wYXRoLmV4cGFuZHVzZXIocHJvZmlsZSkKKyAgICAgICAgaWYgcGF0aCBpcyBOb25lOiBwYXRoID0gc2VsZi5nZXRwcm9maWxlKCdQYXRoJykKKyAgICAgICAgaWYgbm90IHBhdGg6IHBhdGggPSBQQVRICisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzYWJzKHBhdGgpIGFuZCBwYXRoWzBdICE9ICd+JzoKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oJ34nLCBwYXRoKQorICAgICAgICBwYXRoID0gb3MucGF0aC5leHBhbmR1c2VyKHBhdGgpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOiByYWlzZSBFcnJvciwgJ01IKCkgcGF0aCBub3QgZm91bmQnCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiU3RyaW5nIHJlcHJlc2VudGF0aW9uLiIiIgorICAgICAgICByZXR1cm4gJ01IKCVyLCAlciknICUgKHNlbGYucGF0aCwgc2VsZi5wcm9maWxlKQorCisgICAgZGVmIGVycm9yKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICAiIiJSb3V0aW5lIHRvIHByaW50IGFuIGVycm9yLiAgTWF5IGJlIG92ZXJyaWRkZW4gYnkgYSBkZXJpdmVkIGNsYXNzLiIiIgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdNSCBlcnJvcjogJXNcbicgJSAobXNnICUgYXJncykpCisKKyAgICBkZWYgZ2V0cHJvZmlsZShzZWxmLCBrZXkpOgorICAgICAgICAiIiJSZXR1cm4gYSBwcm9maWxlIGVudHJ5LCBOb25lIGlmIG5vdCBmb3VuZC4iIiIKKyAgICAgICAgcmV0dXJuIHBpY2tsaW5lKHNlbGYucHJvZmlsZSwga2V5KQorCisgICAgZGVmIGdldHBhdGgoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgcGF0aCAodGhlIG5hbWUgb2YgdGhlIGNvbGxlY3Rpb24ncyBkaXJlY3RvcnkpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisKKyAgICBkZWYgZ2V0Y29udGV4dChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IGZvbGRlci4iIiIKKyAgICAgICAgY29udGV4dCA9IHBpY2tsaW5lKG9zLnBhdGguam9pbihzZWxmLmdldHBhdGgoKSwgJ2NvbnRleHQnKSwKKyAgICAgICAgICAgICAgICAgICdDdXJyZW50LUZvbGRlcicpCisgICAgICAgIGlmIG5vdCBjb250ZXh0OiBjb250ZXh0ID0gJ2luYm94JworICAgICAgICByZXR1cm4gY29udGV4dAorCisgICAgZGVmIHNldGNvbnRleHQoc2VsZiwgY29udGV4dCk6CisgICAgICAgICIiIlNldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBmb2xkZXIuIiIiCisgICAgICAgIGZuID0gb3MucGF0aC5qb2luKHNlbGYuZ2V0cGF0aCgpLCAnY29udGV4dCcpCisgICAgICAgIGYgPSBvcGVuKGZuLCAidyIpCisgICAgICAgIGYud3JpdGUoIkN1cnJlbnQtRm9sZGVyOiAlc1xuIiAlIGNvbnRleHQpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGxpc3Rmb2xkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSB0b3AtbGV2ZWwgZm9sZGVycy4iIiIKKyAgICAgICAgZm9sZGVycyA9IFtdCisgICAgICAgIHBhdGggPSBzZWxmLmdldHBhdGgoKQorICAgICAgICBmb3IgbmFtZSBpbiBvcy5saXN0ZGlyKHBhdGgpOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIGZvbGRlcnMuYXBwZW5kKG5hbWUpCisgICAgICAgIGZvbGRlcnMuc29ydCgpCisgICAgICAgIHJldHVybiBmb2xkZXJzCisKKyAgICBkZWYgbGlzdHN1YmZvbGRlcnMoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgbmFtZXMgb2YgdGhlIHN1YmZvbGRlcnMgaW4gYSBnaXZlbiBmb2xkZXIKKyAgICAgICAgKHByZWZpeGVkIHdpdGggdGhlIGdpdmVuIGZvbGRlciBuYW1lKS4iIiIKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXRoLCBuYW1lKQorICAgICAgICAjIEdldCB0aGUgbGluayBjb3VudCBzbyB3ZSBjYW4gYXZvaWQgbGlzdGluZyBmb2xkZXJzCisgICAgICAgICMgdGhhdCBoYXZlIG5vIHN1YmZvbGRlcnMuCisgICAgICAgIG5saW5rcyA9IG9zLnN0YXQoZnVsbG5hbWUpLnN0X25saW5rCisgICAgICAgIGlmIG5saW5rcyA8PSAyOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIHN1YmZvbGRlcnMgPSBbXQorICAgICAgICBzdWJuYW1lcyA9IG9zLmxpc3RkaXIoZnVsbG5hbWUpCisgICAgICAgIGZvciBzdWJuYW1lIGluIHN1Ym5hbWVzOgorICAgICAgICAgICAgZnVsbHN1Ym5hbWUgPSBvcy5wYXRoLmpvaW4oZnVsbG5hbWUsIHN1Ym5hbWUpCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxzdWJuYW1lKToKKyAgICAgICAgICAgICAgICBuYW1lX3N1Ym5hbWUgPSBvcy5wYXRoLmpvaW4obmFtZSwgc3VibmFtZSkKKyAgICAgICAgICAgICAgICBzdWJmb2xkZXJzLmFwcGVuZChuYW1lX3N1Ym5hbWUpCisgICAgICAgICAgICAgICAgIyBTdG9wIGxvb2tpbmcgZm9yIHN1YmZvbGRlcnMgd2hlbgorICAgICAgICAgICAgICAgICMgd2UndmUgc2VlbiB0aGVtIGFsbAorICAgICAgICAgICAgICAgIG5saW5rcyA9IG5saW5rcyAtIDEKKyAgICAgICAgICAgICAgICBpZiBubGlua3MgPD0gMjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc3ViZm9sZGVycy5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHN1YmZvbGRlcnMKKworICAgIGRlZiBsaXN0YWxsZm9sZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuYW1lcyBvZiBhbGwgZm9sZGVycyBhbmQgc3ViZm9sZGVycywgcmVjdXJzaXZlbHkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmxpc3RhbGxzdWJmb2xkZXJzKCcnKQorCisgICAgZGVmIGxpc3RhbGxzdWJmb2xkZXJzKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5hbWVzIG9mIHN1YmZvbGRlcnMgaW4gYSBnaXZlbiBmb2xkZXIsIHJlY3Vyc2l2ZWx5LiIiIgorICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsIG5hbWUpCisgICAgICAgICMgR2V0IHRoZSBsaW5rIGNvdW50IHNvIHdlIGNhbiBhdm9pZCBsaXN0aW5nIGZvbGRlcnMKKyAgICAgICAgIyB0aGF0IGhhdmUgbm8gc3ViZm9sZGVycy4KKyAgICAgICAgbmxpbmtzID0gb3Muc3RhdChmdWxsbmFtZSkuc3RfbmxpbmsKKyAgICAgICAgaWYgbmxpbmtzIDw9IDI6CisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgc3ViZm9sZGVycyA9IFtdCisgICAgICAgIHN1Ym5hbWVzID0gb3MubGlzdGRpcihmdWxsbmFtZSkKKyAgICAgICAgZm9yIHN1Ym5hbWUgaW4gc3VibmFtZXM6CisgICAgICAgICAgICBpZiBzdWJuYW1lWzBdID09ICcsJyBvciBpc251bWVyaWMoc3VibmFtZSk6IGNvbnRpbnVlCisgICAgICAgICAgICBmdWxsc3VibmFtZSA9IG9zLnBhdGguam9pbihmdWxsbmFtZSwgc3VibmFtZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbHN1Ym5hbWUpOgorICAgICAgICAgICAgICAgIG5hbWVfc3VibmFtZSA9IG9zLnBhdGguam9pbihuYW1lLCBzdWJuYW1lKQorICAgICAgICAgICAgICAgIHN1YmZvbGRlcnMuYXBwZW5kKG5hbWVfc3VibmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2xpbmsoZnVsbHN1Ym5hbWUpOgorICAgICAgICAgICAgICAgICAgICBzdWJzdWJmb2xkZXJzID0gc2VsZi5saXN0YWxsc3ViZm9sZGVycygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfc3VibmFtZSkKKyAgICAgICAgICAgICAgICAgICAgc3ViZm9sZGVycyA9IHN1YmZvbGRlcnMgKyBzdWJzdWJmb2xkZXJzCisgICAgICAgICAgICAgICAgIyBTdG9wIGxvb2tpbmcgZm9yIHN1YmZvbGRlcnMgd2hlbgorICAgICAgICAgICAgICAgICMgd2UndmUgc2VlbiB0aGVtIGFsbAorICAgICAgICAgICAgICAgIG5saW5rcyA9IG5saW5rcyAtIDEKKyAgICAgICAgICAgICAgICBpZiBubGlua3MgPD0gMjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc3ViZm9sZGVycy5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHN1YmZvbGRlcnMKKworICAgIGRlZiBvcGVuZm9sZGVyKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSBuZXcgRm9sZGVyIG9iamVjdCBmb3IgdGhlIG5hbWVkIGZvbGRlci4iIiIKKyAgICAgICAgcmV0dXJuIEZvbGRlcihzZWxmLCBuYW1lKQorCisgICAgZGVmIG1ha2Vmb2xkZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIG5ldyBmb2xkZXIgKG9yIHJhaXNlIG9zLmVycm9yIGlmIGl0IGNhbm5vdCBiZSBjcmVhdGVkKS4iIiIKKyAgICAgICAgcHJvdGVjdCA9IHBpY2tsaW5lKHNlbGYucHJvZmlsZSwgJ0ZvbGRlci1Qcm90ZWN0JykKKyAgICAgICAgaWYgcHJvdGVjdCBhbmQgaXNudW1lcmljKHByb3RlY3QpOgorICAgICAgICAgICAgbW9kZSA9IGludChwcm90ZWN0LCA4KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kZSA9IEZPTERFUl9QUk9URUNUCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLmdldHBhdGgoKSwgbmFtZSksIG1vZGUpCisKKyAgICBkZWYgZGVsZXRlZm9sZGVyKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJEZWxldGUgYSBmb2xkZXIuICBUaGlzIHJlbW92ZXMgZmlsZXMgaW4gdGhlIGZvbGRlciBidXQgbm90CisgICAgICAgIHN1YmRpcmVjdG9yaWVzLiAgUmFpc2Ugb3MuZXJyb3IgaWYgZGVsZXRpbmcgdGhlIGZvbGRlciBpdHNlbGYgZmFpbHMuIiIiCisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuZ2V0cGF0aCgpLCBuYW1lKQorICAgICAgICBmb3Igc3VibmFtZSBpbiBvcy5saXN0ZGlyKGZ1bGxuYW1lKToKKyAgICAgICAgICAgIGZ1bGxzdWJuYW1lID0gb3MucGF0aC5qb2luKGZ1bGxuYW1lLCBzdWJuYW1lKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmdWxsc3VibmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yKCclcyBub3QgZGVsZXRlZCwgY29udGludWluZy4uLicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsc3VibmFtZSkKKyAgICAgICAgb3Mucm1kaXIoZnVsbG5hbWUpCisKKworbnVtZXJpY3Byb2cgPSByZS5jb21waWxlKCdeWzEtOV1bMC05XSokJykKK2RlZiBpc251bWVyaWMoc3RyKToKKyAgICByZXR1cm4gbnVtZXJpY3Byb2cubWF0Y2goc3RyKSBpcyBub3QgTm9uZQorCitjbGFzcyBGb2xkZXI6CisgICAgIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGEgcGFydGljdWxhciBmb2xkZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWgsIG5hbWUpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4iIiIKKyAgICAgICAgc2VsZi5taCA9IG1oCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5nZXRmdWxsbmFtZSgpKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbm8gZm9sZGVyICVzJyAlIG5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiU3RyaW5nIHJlcHJlc2VudGF0aW9uLiIiIgorICAgICAgICByZXR1cm4gJ0ZvbGRlciglciwgJXIpJyAlIChzZWxmLm1oLCBzZWxmLm5hbWUpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJFcnJvciBtZXNzYWdlIGhhbmRsZXIuIiIiCisgICAgICAgIHNlbGYubWguZXJyb3IoKmFyZ3MpCisKKyAgICBkZWYgZ2V0ZnVsbG5hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgZnVsbCBwYXRobmFtZSBvZiB0aGUgZm9sZGVyLiIiIgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYubWgucGF0aCwgc2VsZi5uYW1lKQorCisgICAgZGVmIGdldHNlcXVlbmNlc2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgcGF0aG5hbWUgb2YgdGhlIGZvbGRlcidzIHNlcXVlbmNlcyBmaWxlLiIiIgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuZ2V0ZnVsbG5hbWUoKSwgTUhfU0VRVUVOQ0VTKQorCisgICAgZGVmIGdldG1lc3NhZ2VmaWxlbmFtZShzZWxmLCBuKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBmdWxsIHBhdGhuYW1lIG9mIGEgbWVzc2FnZSBpbiB0aGUgZm9sZGVyLiIiIgorICAgICAgICByZXR1cm4gb3MucGF0aC5qb2luKHNlbGYuZ2V0ZnVsbG5hbWUoKSwgc3RyKG4pKQorCisgICAgZGVmIGxpc3RzdWJmb2xkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBkaXJlY3Qgc3ViZm9sZGVycy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubWgubGlzdHN1YmZvbGRlcnMoc2VsZi5uYW1lKQorCisgICAgZGVmIGxpc3RhbGxzdWJmb2xkZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gbGlzdCBvZiBhbGwgc3ViZm9sZGVycy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubWgubGlzdGFsbHN1YmZvbGRlcnMoc2VsZi5uYW1lKQorCisgICAgZGVmIGxpc3RtZXNzYWdlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsaXN0IG9mIG1lc3NhZ2VzIGN1cnJlbnRseSBwcmVzZW50IGluIHRoZSBmb2xkZXIuCisgICAgICAgIEFzIGEgc2lkZSBlZmZlY3QsIHNldCBzZWxmLmxhc3QgdG8gdGhlIGxhc3QgbWVzc2FnZSAob3IgMCkuIiIiCisgICAgICAgIG1lc3NhZ2VzID0gW10KKyAgICAgICAgbWF0Y2ggPSBudW1lcmljcHJvZy5tYXRjaAorICAgICAgICBhcHBlbmQgPSBtZXNzYWdlcy5hcHBlbmQKKyAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihzZWxmLmdldGZ1bGxuYW1lKCkpOgorICAgICAgICAgICAgaWYgbWF0Y2gobmFtZSk6CisgICAgICAgICAgICAgICAgYXBwZW5kKG5hbWUpCisgICAgICAgIG1lc3NhZ2VzID0gbWFwKGludCwgbWVzc2FnZXMpCisgICAgICAgIG1lc3NhZ2VzLnNvcnQoKQorICAgICAgICBpZiBtZXNzYWdlczoKKyAgICAgICAgICAgIHNlbGYubGFzdCA9IG1lc3NhZ2VzWy0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sYXN0ID0gMAorICAgICAgICByZXR1cm4gbWVzc2FnZXMKKworICAgIGRlZiBnZXRzZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgc2V0IG9mIHNlcXVlbmNlcyBmb3IgdGhlIGZvbGRlci4iIiIKKyAgICAgICAgc2VxdWVuY2VzID0ge30KKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmdldHNlcXVlbmNlc2ZpbGVuYW1lKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oZnVsbG5hbWUsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VxdWVuY2VzCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgICAgIGZpZWxkcyA9IGxpbmUuc3BsaXQoJzonKQorICAgICAgICAgICAgaWYgbGVuKGZpZWxkcykgIT0gMjoKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yKCdiYWQgc2VxdWVuY2UgaW4gJXM6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChmdWxsbmFtZSwgbGluZS5zdHJpcCgpKSkKKyAgICAgICAgICAgIGtleSA9IGZpZWxkc1swXS5zdHJpcCgpCisgICAgICAgICAgICB2YWx1ZSA9IEludFNldChmaWVsZHNbMV0uc3RyaXAoKSwgJyAnKS50b2xpc3QoKQorICAgICAgICAgICAgc2VxdWVuY2VzW2tleV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gc2VxdWVuY2VzCisKKyAgICBkZWYgcHV0c2VxdWVuY2VzKHNlbGYsIHNlcXVlbmNlcyk6CisgICAgICAgICIiIldyaXRlIHRoZSBzZXQgb2Ygc2VxdWVuY2VzIGJhY2sgdG8gdGhlIGZvbGRlci4iIiIKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmdldHNlcXVlbmNlc2ZpbGVuYW1lKCkKKyAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgZm9yIGtleSwgc2VxIGluIHNlcXVlbmNlcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHMgPSBJbnRTZXQoJycsICcgJykKKyAgICAgICAgICAgIHMuZnJvbWxpc3Qoc2VxKQorICAgICAgICAgICAgaWYgbm90IGY6IGYgPSBvcGVuKGZ1bGxuYW1lLCAndycpCisgICAgICAgICAgICBmLndyaXRlKCclczogJXNcbicgJSAoa2V5LCBzLnRvc3RyaW5nKCkpKQorICAgICAgICBpZiBub3QgZjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZnVsbG5hbWUpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0Y3VycmVudChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IG1lc3NhZ2UuICBSYWlzZSBFcnJvciB3aGVuIHRoZXJlIGlzIG5vbmUuIiIiCisgICAgICAgIHNlcXMgPSBzZWxmLmdldHNlcXVlbmNlcygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBtYXgoc2Vxc1snY3VyJ10pCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgS2V5RXJyb3IpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJubyBjdXIgbWVzc2FnZSIKKworICAgIGRlZiBzZXRjdXJyZW50KHNlbGYsIG4pOgorICAgICAgICAiIiJTZXQgdGhlIGN1cnJlbnQgbWVzc2FnZS4iIiIKKyAgICAgICAgdXBkYXRlbGluZShzZWxmLmdldHNlcXVlbmNlc2ZpbGVuYW1lKCksICdjdXInLCBzdHIobiksIDApCisKKyAgICBkZWYgcGFyc2VzZXF1ZW5jZShzZWxmLCBzZXEpOgorICAgICAgICAiIiJQYXJzZSBhbiBNSCBzZXF1ZW5jZSBzcGVjaWZpY2F0aW9uIGludG8gYSBtZXNzYWdlIGxpc3QuCisgICAgICAgIEF0dGVtcHQgdG8gbWltaWMgbWgtc2VxdWVuY2UoNSkgYXMgY2xvc2UgYXMgcG9zc2libGUuCisgICAgICAgIEFsc28gYXR0ZW1wdCB0byBtaW1pYyBvYnNlcnZlZCBiZWhhdmlvciByZWdhcmRpbmcgd2hpY2gKKyAgICAgICAgY29uZGl0aW9ucyBjYXVzZSB3aGljaCBlcnJvciBtZXNzYWdlcy4iIiIKKyAgICAgICAgIyBYWFggU3RpbGwgbm90IGNvbXBsZXRlIChzZWUgbWgtZm9ybWF0KDUpKS4KKyAgICAgICAgIyBNaXNzaW5nIGFyZToKKyAgICAgICAgIyAtICdwcmV2JywgJ25leHQnIGFzIGNvdW50CisgICAgICAgICMgLSBTZXF1ZW5jZS1OZWdhdGlvbiBvcHRpb24KKyAgICAgICAgYWxsID0gc2VsZi5saXN0bWVzc2FnZXMoKQorICAgICAgICAjIE9ic2VydmVkIGJlaGF2aW9yOiB0ZXN0IGZvciBlbXB0eSBmb2xkZXIgaXMgZG9uZSBmaXJzdAorICAgICAgICBpZiBub3QgYWxsOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJubyBtZXNzYWdlcyBpbiAlcyIgJSBzZWxmLm5hbWUKKyAgICAgICAgIyBDb21tb24gY2FzZSBmaXJzdDogYWxsIGlzIGZyZXF1ZW50bHkgdGhlIGRlZmF1bHQKKyAgICAgICAgaWYgc2VxID09ICdhbGwnOgorICAgICAgICAgICAgcmV0dXJuIGFsbAorICAgICAgICAjIFRlc3QgZm9yIFg6WSBiZWZvcmUgWC1ZIGJlY2F1c2UgJ3NlcTotbicgbWF0Y2hlcyBib3RoCisgICAgICAgIGkgPSBzZXEuZmluZCgnOicpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIGhlYWQsIGRpciwgdGFpbCA9IHNlcVs6aV0sICcnLCBzZXFbaSsxOl0KKyAgICAgICAgICAgIGlmIHRhaWxbOjFdIGluICctKyc6CisgICAgICAgICAgICAgICAgZGlyLCB0YWlsID0gdGFpbFs6MV0sIHRhaWxbMTpdCisgICAgICAgICAgICBpZiBub3QgaXNudW1lcmljKHRhaWwpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiYmFkIG1lc3NhZ2UgbGlzdCAlcyIgJSBzZXEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb3VudCA9IGludCh0YWlsKQorICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgICAgICAjIENhbid0IHVzZSBzeXMubWF4aW50IGJlY2F1c2Ugb2YgaStjb3VudCBiZWxvdworICAgICAgICAgICAgICAgIGNvdW50ID0gbGVuKGFsbCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhbmNob3IgPSBzZWxmLl9wYXJzZWluZGV4KGhlYWQsIGFsbCkKKyAgICAgICAgICAgIGV4Y2VwdCBFcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHNlcXMgPSBzZWxmLmdldHNlcXVlbmNlcygpCisgICAgICAgICAgICAgICAgaWYgbm90IGhlYWQgaW4gc2VxczoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG1zZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICJiYWQgbWVzc2FnZSBsaXN0ICVzIiAlIHNlcQorICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgbXNnLCBzeXMuZXhjX2luZm8oKVsyXQorICAgICAgICAgICAgICAgIG1zZ3MgPSBzZXFzW2hlYWRdCisgICAgICAgICAgICAgICAgaWYgbm90IG1zZ3M6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAic2VxdWVuY2UgJXMgZW1wdHkiICUgaGVhZAorICAgICAgICAgICAgICAgIGlmIGRpciA9PSAnLSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtc2dzWy1jb3VudDpdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1zZ3NbOmNvdW50XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBub3QgZGlyOgorICAgICAgICAgICAgICAgICAgICBpZiBoZWFkIGluICgncHJldicsICdsYXN0Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSAnLScKKyAgICAgICAgICAgICAgICBpZiBkaXIgPT0gJy0nOgorICAgICAgICAgICAgICAgICAgICBpID0gYmlzZWN0KGFsbCwgYW5jaG9yKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxsW21heCgwLCBpLWNvdW50KTppXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGkgPSBiaXNlY3QoYWxsLCBhbmNob3ItMSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFsbFtpOmkrY291bnRdCisgICAgICAgICMgVGVzdCBmb3IgWC1ZIG5leHQKKyAgICAgICAgaSA9IHNlcS5maW5kKCctJykKKyAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgYmVnaW4gPSBzZWxmLl9wYXJzZWluZGV4KHNlcVs6aV0sIGFsbCkKKyAgICAgICAgICAgIGVuZCA9IHNlbGYuX3BhcnNlaW5kZXgoc2VxW2krMTpdLCBhbGwpCisgICAgICAgICAgICBpID0gYmlzZWN0KGFsbCwgYmVnaW4tMSkKKyAgICAgICAgICAgIGogPSBiaXNlY3QoYWxsLCBlbmQpCisgICAgICAgICAgICByID0gYWxsW2k6al0KKyAgICAgICAgICAgIGlmIG5vdCByOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiYmFkIG1lc3NhZ2UgbGlzdCAlcyIgJSBzZXEKKyAgICAgICAgICAgIHJldHVybiByCisgICAgICAgICMgTmVpdGhlciBYOlkgbm9yIFgtWTsgbXVzdCBiZSBhIG51bWJlciBvciBhIChwc2V1ZG8tKXNlcXVlbmNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG4gPSBzZWxmLl9wYXJzZWluZGV4KHNlcSwgYWxsKQorICAgICAgICBleGNlcHQgRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlcXMgPSBzZWxmLmdldHNlcXVlbmNlcygpCisgICAgICAgICAgICBpZiBub3Qgc2VxIGluIHNlcXM6CisgICAgICAgICAgICAgICAgaWYgbm90IG1zZzoKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gImJhZCBtZXNzYWdlIGxpc3QgJXMiICUgc2VxCisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsIG1zZworICAgICAgICAgICAgcmV0dXJuIHNlcXNbc2VxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbiBub3QgaW4gYWxsOgorICAgICAgICAgICAgICAgIGlmIGlzbnVtZXJpYyhzZXEpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgIm1lc3NhZ2UgJWQgZG9lc24ndCBleGlzdCIgJSBuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJubyAlcyBtZXNzYWdlIiAlIHNlcQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gW25dCisKKyAgICBkZWYgX3BhcnNlaW5kZXgoc2VsZiwgc2VxLCBhbGwpOgorICAgICAgICAiIiJJbnRlcm5hbDogcGFyc2UgYSBtZXNzYWdlIG51bWJlciAob3IgY3VyLCBmaXJzdCwgZXRjLikuIiIiCisgICAgICAgIGlmIGlzbnVtZXJpYyhzZXEpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQoc2VxKQorICAgICAgICAgICAgZXhjZXB0IChPdmVyZmxvd0Vycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3lzLm1heGludAorICAgICAgICBpZiBzZXEgaW4gKCdjdXInLCAnLicpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0Y3VycmVudCgpCisgICAgICAgIGlmIHNlcSA9PSAnZmlyc3QnOgorICAgICAgICAgICAgcmV0dXJuIGFsbFswXQorICAgICAgICBpZiBzZXEgPT0gJ2xhc3QnOgorICAgICAgICAgICAgcmV0dXJuIGFsbFstMV0KKyAgICAgICAgaWYgc2VxID09ICduZXh0JzoKKyAgICAgICAgICAgIG4gPSBzZWxmLmdldGN1cnJlbnQoKQorICAgICAgICAgICAgaSA9IGJpc2VjdChhbGwsIG4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFsbFtpXQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJubyBuZXh0IG1lc3NhZ2UiCisgICAgICAgIGlmIHNlcSA9PSAncHJldic6CisgICAgICAgICAgICBuID0gc2VsZi5nZXRjdXJyZW50KCkKKyAgICAgICAgICAgIGkgPSBiaXNlY3QoYWxsLCBuLTEpCisgICAgICAgICAgICBpZiBpID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICJubyBwcmV2IG1lc3NhZ2UiCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFsbFtpLTFdCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgIm5vIHByZXYgbWVzc2FnZSIKKyAgICAgICAgcmFpc2UgRXJyb3IsIE5vbmUKKworICAgIGRlZiBvcGVubWVzc2FnZShzZWxmLCBuKToKKyAgICAgICAgIiIiT3BlbiBhIG1lc3NhZ2UgLS0gcmV0dXJucyBhIE1lc3NhZ2Ugb2JqZWN0LiIiIgorICAgICAgICByZXR1cm4gTWVzc2FnZShzZWxmLCBuKQorCisgICAgZGVmIHJlbW92ZW1lc3NhZ2VzKHNlbGYsIGxpc3QpOgorICAgICAgICAiIiJSZW1vdmUgb25lIG9yIG1vcmUgbWVzc2FnZXMgLS0gbWF5IHJhaXNlIG9zLmVycm9yLiIiIgorICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICBkZWxldGVkID0gW10KKyAgICAgICAgZm9yIG4gaW4gbGlzdDoKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLmdldG1lc3NhZ2VmaWxlbmFtZShuKQorICAgICAgICAgICAgY29tbWFwYXRoID0gc2VsZi5nZXRtZXNzYWdlZmlsZW5hbWUoJywnICsgc3RyKG4pKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhjb21tYXBhdGgpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwYXRoLCBjb21tYXBhdGgpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKG1zZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVsZXRlZC5hcHBlbmQobikKKyAgICAgICAgaWYgZGVsZXRlZDoKKyAgICAgICAgICAgIHNlbGYucmVtb3ZlZnJvbWFsbHNlcXVlbmNlcyhkZWxldGVkKQorICAgICAgICBpZiBlcnJvcnM6CisgICAgICAgICAgICBpZiBsZW4oZXJyb3JzKSA9PSAxOgorICAgICAgICAgICAgICAgIHJhaXNlIG9zLmVycm9yLCBlcnJvcnNbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2Ugb3MuZXJyb3IsICgnbXVsdGlwbGUgZXJyb3JzOicsIGVycm9ycykKKworICAgIGRlZiByZWZpbGVtZXNzYWdlcyhzZWxmLCBsaXN0LCB0b2ZvbGRlciwga2VlcHNlcXVlbmNlcz0wKToKKyAgICAgICAgIiIiUmVmaWxlIG9uZSBvciBtb3JlIG1lc3NhZ2VzIC0tIG1heSByYWlzZSBvcy5lcnJvci4KKyAgICAgICAgJ3RvZm9sZGVyJyBpcyBhbiBvcGVuIGZvbGRlciBvYmplY3QuIiIiCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHJlZmlsZWQgPSB7fQorICAgICAgICBmb3IgbiBpbiBsaXN0OgorICAgICAgICAgICAgdG9uID0gdG9mb2xkZXIuZ2V0bGFzdCgpICsgMQorICAgICAgICAgICAgcGF0aCA9IHNlbGYuZ2V0bWVzc2FnZWZpbGVuYW1lKG4pCisgICAgICAgICAgICB0b3BhdGggPSB0b2ZvbGRlci5nZXRtZXNzYWdlZmlsZW5hbWUodG9uKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbmFtZShwYXRoLCB0b3BhdGgpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgIyBUcnkgY29weWluZworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKHBhdGgsIHRvcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBvcy5lcnJvciksIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZChtc2cpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayh0b3BhdGgpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHRvZm9sZGVyLnNldGxhc3QodG9uKQorICAgICAgICAgICAgcmVmaWxlZFtuXSA9IHRvbgorICAgICAgICBpZiByZWZpbGVkOgorICAgICAgICAgICAgaWYga2VlcHNlcXVlbmNlczoKKyAgICAgICAgICAgICAgICB0b2ZvbGRlci5fY29weXNlcXVlbmNlcyhzZWxmLCByZWZpbGVkLml0ZW1zKCkpCisgICAgICAgICAgICBzZWxmLnJlbW92ZWZyb21hbGxzZXF1ZW5jZXMocmVmaWxlZC5rZXlzKCkpCisgICAgICAgIGlmIGVycm9yczoKKyAgICAgICAgICAgIGlmIGxlbihlcnJvcnMpID09IDE6CisgICAgICAgICAgICAgICAgcmFpc2Ugb3MuZXJyb3IsIGVycm9yc1swXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBvcy5lcnJvciwgKCdtdWx0aXBsZSBlcnJvcnM6JywgZXJyb3JzKQorCisgICAgZGVmIF9jb3B5c2VxdWVuY2VzKHNlbGYsIGZyb21mb2xkZXIsIHJlZmlsZWRpdGVtcyk6CisgICAgICAgICIiIkhlbHBlciBmb3IgcmVmaWxlbWVzc2FnZXMoKSB0byBjb3B5IHNlcXVlbmNlcy4iIiIKKyAgICAgICAgZnJvbXNlcXVlbmNlcyA9IGZyb21mb2xkZXIuZ2V0c2VxdWVuY2VzKCkKKyAgICAgICAgdG9zZXF1ZW5jZXMgPSBzZWxmLmdldHNlcXVlbmNlcygpCisgICAgICAgIGNoYW5nZWQgPSAwCisgICAgICAgIGZvciBuYW1lLCBzZXEgaW4gZnJvbXNlcXVlbmNlcy5pdGVtcygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRvc2VxID0gdG9zZXF1ZW5jZXNbbmFtZV0KKyAgICAgICAgICAgICAgICBuZXcgPSAwCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgdG9zZXEgPSBbXQorICAgICAgICAgICAgICAgIG5ldyA9IDEKKyAgICAgICAgICAgIGZvciBmcm9tbiwgdG9uIGluIHJlZmlsZWRpdGVtczoKKyAgICAgICAgICAgICAgICBpZiBmcm9tbiBpbiBzZXE6CisgICAgICAgICAgICAgICAgICAgIHRvc2VxLmFwcGVuZCh0b24pCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBpZiBuZXcgYW5kIHRvc2VxOgorICAgICAgICAgICAgICAgIHRvc2VxdWVuY2VzW25hbWVdID0gdG9zZXEKKyAgICAgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYucHV0c2VxdWVuY2VzKHRvc2VxdWVuY2VzKQorCisgICAgZGVmIG1vdmVtZXNzYWdlKHNlbGYsIG4sIHRvZm9sZGVyLCB0b24pOgorICAgICAgICAiIiJNb3ZlIG9uZSBtZXNzYWdlIG92ZXIgYSBzcGVjaWZpYyBkZXN0aW5hdGlvbiBtZXNzYWdlLAorICAgICAgICB3aGljaCBtYXkgb3IgbWF5IG5vdCBhbHJlYWR5IGV4aXN0LiIiIgorICAgICAgICBwYXRoID0gc2VsZi5nZXRtZXNzYWdlZmlsZW5hbWUobikKKyAgICAgICAgIyBPcGVuIGl0IHRvIGNoZWNrIHRoYXQgaXQgZXhpc3RzCisgICAgICAgIGYgPSBvcGVuKHBhdGgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBkZWwgZgorICAgICAgICB0b3BhdGggPSB0b2ZvbGRlci5nZXRtZXNzYWdlZmlsZW5hbWUodG9uKQorICAgICAgICBiYWNrdXB0b3BhdGggPSB0b2ZvbGRlci5nZXRtZXNzYWdlZmlsZW5hbWUoJywlZCcgJSB0b24pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbmFtZSh0b3BhdGgsIGJhY2t1cHRvcGF0aCkKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWUocGF0aCwgdG9wYXRoKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAjIFRyeSBjb3B5aW5nCisgICAgICAgICAgICBvayA9IDAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0b2ZvbGRlci5zZXRsYXN0KE5vbmUpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKHBhdGgsIHRvcGF0aCkKKyAgICAgICAgICAgICAgICBvayA9IDEKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodG9wYXRoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKKyAgICAgICAgc2VsZi5yZW1vdmVmcm9tYWxsc2VxdWVuY2VzKFtuXSkKKworICAgIGRlZiBjb3B5bWVzc2FnZShzZWxmLCBuLCB0b2ZvbGRlciwgdG9uKToKKyAgICAgICAgIiIiQ29weSBvbmUgbWVzc2FnZSBvdmVyIGEgc3BlY2lmaWMgZGVzdGluYXRpb24gbWVzc2FnZSwKKyAgICAgICAgd2hpY2ggbWF5IG9yIG1heSBub3QgYWxyZWFkeSBleGlzdC4iIiIKKyAgICAgICAgcGF0aCA9IHNlbGYuZ2V0bWVzc2FnZWZpbGVuYW1lKG4pCisgICAgICAgICMgT3BlbiBpdCB0byBjaGVjayB0aGF0IGl0IGV4aXN0cworICAgICAgICBmID0gb3BlbihwYXRoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZGVsIGYKKyAgICAgICAgdG9wYXRoID0gdG9mb2xkZXIuZ2V0bWVzc2FnZWZpbGVuYW1lKHRvbikKKyAgICAgICAgYmFja3VwdG9wYXRoID0gdG9mb2xkZXIuZ2V0bWVzc2FnZWZpbGVuYW1lKCcsJWQnICUgdG9uKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW5hbWUodG9wYXRoLCBiYWNrdXB0b3BhdGgpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgb2sgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRvZm9sZGVyLnNldGxhc3QoTm9uZSkKKyAgICAgICAgICAgIHNodXRpbC5jb3B5MihwYXRoLCB0b3BhdGgpCisgICAgICAgICAgICBvayA9IDEKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayh0b3BhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY3JlYXRlbWVzc2FnZShzZWxmLCBuLCB0eHQpOgorICAgICAgICAiIiJDcmVhdGUgYSBtZXNzYWdlLCB3aXRoIHRleHQgZnJvbSB0aGUgb3BlbiBmaWxlIHR4dC4iIiIKKyAgICAgICAgcGF0aCA9IHNlbGYuZ2V0bWVzc2FnZWZpbGVuYW1lKG4pCisgICAgICAgIGJhY2t1cHBhdGggPSBzZWxmLmdldG1lc3NhZ2VmaWxlbmFtZSgnLCVkJyAlIG4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbmFtZShwYXRoLCBiYWNrdXBwYXRoKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG9rID0gMAorICAgICAgICBCVUZTSVpFID0gMTYqMTAyNAorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihwYXRoLCAidyIpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHR4dC5yZWFkKEJVRlNJWkUpCisgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBmLndyaXRlKGJ1ZikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb2sgPSAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsocGF0aCkKKyAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiByZW1vdmVmcm9tYWxsc2VxdWVuY2VzKHNlbGYsIGxpc3QpOgorICAgICAgICAiIiJSZW1vdmUgb25lIG9yIG1vcmUgbWVzc2FnZXMgZnJvbSBhbGwgc2VxdWVuY2VzIChpbmNsdWRpbmcgbGFzdCkKKyAgICAgICAgLS0gYnV0IG5vdCBmcm9tICdjdXInISEhIiIiCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ2xhc3QnKSBhbmQgc2VsZi5sYXN0IGluIGxpc3Q6CisgICAgICAgICAgICBkZWwgc2VsZi5sYXN0CisgICAgICAgIHNlcXVlbmNlcyA9IHNlbGYuZ2V0c2VxdWVuY2VzKCkKKyAgICAgICAgY2hhbmdlZCA9IDAKKyAgICAgICAgZm9yIG5hbWUsIHNlcSBpbiBzZXF1ZW5jZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gJ2N1cic6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZvciBuIGluIGxpc3Q6CisgICAgICAgICAgICAgICAgaWYgbiBpbiBzZXE6CisgICAgICAgICAgICAgICAgICAgIHNlcS5yZW1vdmUobikKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlcToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzZXF1ZW5jZXNbbmFtZV0KKyAgICAgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYucHV0c2VxdWVuY2VzKHNlcXVlbmNlcykKKworICAgIGRlZiBnZXRsYXN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGxhc3QgbWVzc2FnZSBudW1iZXIuIiIiCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdsYXN0Jyk6CisgICAgICAgICAgICBzZWxmLmxpc3RtZXNzYWdlcygpICMgU2V0IHNlbGYubGFzdAorICAgICAgICByZXR1cm4gc2VsZi5sYXN0CisKKyAgICBkZWYgc2V0bGFzdChzZWxmLCBsYXN0KToKKyAgICAgICAgIiIiU2V0IHRoZSBsYXN0IG1lc3NhZ2UgbnVtYmVyLiIiIgorICAgICAgICBpZiBsYXN0IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdsYXN0Jyk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYubGFzdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5sYXN0ID0gbGFzdAorCitjbGFzcyBNZXNzYWdlKG1pbWV0b29scy5NZXNzYWdlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmLCBuLCBmcCA9IE5vbmUpOgorICAgICAgICAiIiJDb25zdHJ1Y3Rvci4iIiIKKyAgICAgICAgc2VsZi5mb2xkZXIgPSBmCisgICAgICAgIHNlbGYubnVtYmVyID0gbgorICAgICAgICBpZiBmcCBpcyBOb25lOgorICAgICAgICAgICAgcGF0aCA9IGYuZ2V0bWVzc2FnZWZpbGVuYW1lKG4pCisgICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQorICAgICAgICBtaW1ldG9vbHMuTWVzc2FnZS5fX2luaXRfXyhzZWxmLCBmcCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiU3RyaW5nIHJlcHJlc2VudGF0aW9uLiIiIgorICAgICAgICByZXR1cm4gJ01lc3NhZ2UoJXMsICVzKScgJSAocmVwcihzZWxmLmZvbGRlciksIHNlbGYubnVtYmVyKQorCisgICAgZGVmIGdldGhlYWRlcnRleHQoc2VsZiwgcHJlZCA9IE5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG1lc3NhZ2UncyBoZWFkZXIgdGV4dCBhcyBhIHN0cmluZy4gIElmIGFuCisgICAgICAgIGFyZ3VtZW50IGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBhcyBhIGZpbHRlciBwcmVkaWNhdGUgdG8KKyAgICAgICAgZGVjaWRlIHdoaWNoIGhlYWRlcnMgdG8gcmV0dXJuIChpdHMgYXJndW1lbnQgaXMgdGhlIGhlYWRlcgorICAgICAgICBuYW1lIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlKS4iIiIKKyAgICAgICAgaWYgcHJlZCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oc2VsZi5oZWFkZXJzKQorICAgICAgICBoZWFkZXJzID0gW10KKyAgICAgICAgaGl0ID0gMAorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmhlYWRlcnM6CisgICAgICAgICAgICBpZiBub3QgbGluZVswXS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgaSA9IGxpbmUuZmluZCgnOicpCisgICAgICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGhpdCA9IHByZWQobGluZVs6aV0ubG93ZXIoKSkKKyAgICAgICAgICAgIGlmIGhpdDogaGVhZGVycy5hcHBlbmQobGluZSkKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oaGVhZGVycykKKworICAgIGRlZiBnZXRib2R5dGV4dChzZWxmLCBkZWNvZGUgPSAxKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBtZXNzYWdlJ3MgYm9keSB0ZXh0IGFzIHN0cmluZy4gIFRoaXMgdW5kb2VzIGEKKyAgICAgICAgQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZywgYnV0IGRvZXMgbm90IGludGVycHJldCBvdGhlciBNSU1FCisgICAgICAgIGZlYXR1cmVzIChlLmcuIG11bHRpcGFydCBtZXNzYWdlcykuICBUbyBzdXBwcmVzcyBkZWNvZGluZywKKyAgICAgICAgcGFzcyAwIGFzIGFuIGFyZ3VtZW50LiIiIgorICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydG9mYm9keSkKKyAgICAgICAgZW5jb2RpbmcgPSBzZWxmLmdldGVuY29kaW5nKCkKKyAgICAgICAgaWYgbm90IGRlY29kZSBvciBlbmNvZGluZyBpbiAoJycsICc3Yml0JywgJzhiaXQnLCAnYmluYXJ5Jyk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mcC5yZWFkKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPKCkKKyAgICAgICAgbWltZXRvb2xzLmRlY29kZShzZWxmLmZwLCBvdXRwdXQsIGVuY29kaW5nKQorICAgICAgICByZXR1cm4gb3V0cHV0LmdldHZhbHVlKCkKKworICAgIGRlZiBnZXRib2R5cGFydHMoc2VsZik6CisgICAgICAgICIiIk9ubHkgZm9yIG11bHRpcGFydCBtZXNzYWdlczogcmV0dXJuIHRoZSBtZXNzYWdlJ3MgYm9keSBhcyBhCisgICAgICAgIGxpc3Qgb2YgU3ViTWVzc2FnZSBvYmplY3RzLiAgRWFjaCBzdWJtZXNzYWdlIG9iamVjdCBiZWhhdmVzCisgICAgICAgIChhbG1vc3QpIGFzIGEgTWVzc2FnZSBvYmplY3QuIiIiCisgICAgICAgIGlmIHNlbGYuZ2V0bWFpbnR5cGUoKSAhPSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnQ29udGVudC1UeXBlIGlzIG5vdCBtdWx0aXBhcnQvKicKKyAgICAgICAgYmRyeSA9IHNlbGYuZ2V0cGFyYW0oJ2JvdW5kYXJ5JykKKyAgICAgICAgaWYgbm90IGJkcnk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ211bHRpcGFydC8qIHdpdGhvdXQgYm91bmRhcnkgcGFyYW0nCisgICAgICAgIHNlbGYuZnAuc2VlayhzZWxmLnN0YXJ0b2Zib2R5KQorICAgICAgICBtZiA9IG11bHRpZmlsZS5NdWx0aUZpbGUoc2VsZi5mcCkKKyAgICAgICAgbWYucHVzaChiZHJ5KQorICAgICAgICBwYXJ0cyA9IFtdCisgICAgICAgIHdoaWxlIG1mLm5leHQoKToKKyAgICAgICAgICAgIG4gPSAiJXMuJXIiICUgKHNlbGYubnVtYmVyLCAxICsgbGVuKHBhcnRzKSkKKyAgICAgICAgICAgIHBhcnQgPSBTdWJNZXNzYWdlKHNlbGYuZm9sZGVyLCBuLCBtZikKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZChwYXJ0KQorICAgICAgICBtZi5wb3AoKQorICAgICAgICByZXR1cm4gcGFydHMKKworICAgIGRlZiBnZXRib2R5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYm9keSwgZWl0aGVyIGEgc3RyaW5nIG9yIGEgbGlzdCBvZiBtZXNzYWdlcy4iIiIKKyAgICAgICAgaWYgc2VsZi5nZXRtYWludHlwZSgpID09ICdtdWx0aXBhcnQnOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0Ym9keXBhcnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdldGJvZHl0ZXh0KCkKKworCitjbGFzcyBTdWJNZXNzYWdlKE1lc3NhZ2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYsIG4sIGZwKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuIiIiCisgICAgICAgIE1lc3NhZ2UuX19pbml0X18oc2VsZiwgZiwgbiwgZnApCisgICAgICAgIGlmIHNlbGYuZ2V0bWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JzoKKyAgICAgICAgICAgIHNlbGYuYm9keSA9IE1lc3NhZ2UuZ2V0Ym9keXBhcnRzKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJvZHkgPSBNZXNzYWdlLmdldGJvZHl0ZXh0KHNlbGYpCisgICAgICAgIHNlbGYuYm9keWVuY29kZWQgPSBNZXNzYWdlLmdldGJvZHl0ZXh0KHNlbGYsIGRlY29kZT0wKQorICAgICAgICAgICAgIyBYWFggSWYgdGhpcyBpcyBiaWcsIHNob3VsZCByZW1lbWJlciBmaWxlIHBvaW50ZXJzCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIlN0cmluZyByZXByZXNlbnRhdGlvbi4iIiIKKyAgICAgICAgZiwgbiwgZnAgPSBzZWxmLmZvbGRlciwgc2VsZi5udW1iZXIsIHNlbGYuZnAKKyAgICAgICAgcmV0dXJuICdTdWJNZXNzYWdlKCVzLCAlcywgJXMpJyAlIChmLCBuLCBmcCkKKworICAgIGRlZiBnZXRib2R5dGV4dChzZWxmLCBkZWNvZGUgPSAxKToKKyAgICAgICAgaWYgbm90IGRlY29kZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJvZHllbmNvZGVkCisgICAgICAgIGlmIHR5cGUoc2VsZi5ib2R5KSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJvZHkKKworICAgIGRlZiBnZXRib2R5cGFydHMoc2VsZik6CisgICAgICAgIGlmIHR5cGUoc2VsZi5ib2R5KSA9PSB0eXBlKFtdKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmJvZHkKKworICAgIGRlZiBnZXRib2R5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5ib2R5CisKKworY2xhc3MgSW50U2V0OgorICAgICIiIkNsYXNzIGltcGxlbWVudGluZyBzZXRzIG9mIGludGVnZXJzLgorCisgICAgVGhpcyBpcyBhbiBlZmZpY2llbnQgcmVwcmVzZW50YXRpb24gZm9yIHNldHMgY29uc2lzdGluZyBvZiBzZXZlcmFsCisgICAgY29udGludW91cyByYW5nZXMsIGUuZy4gMS0xMDAsMjAwLTQwMCw0MDItMTAwMCBpcyByZXByZXNlbnRlZAorICAgIGludGVybmFsbHkgYXMgYSBsaXN0IG9mIHRocmVlIHBhaXJzOiBbKDEsMTAwKSwgKDIwMCw0MDApLAorICAgICg0MDIsMTAwMCldLiAgVGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGlzIGFsd2F5cyBrZXB0IG5vcm1hbGl6ZWQuCisKKyAgICBUaGUgY29uc3RydWN0b3IgaGFzIHVwIHRvIHRocmVlIGFyZ3VtZW50czoKKyAgICAtIHRoZSBzdHJpbmcgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZXQgKGRlZmF1bHQgJycpLAorICAgIC0gdGhlIHNlcGFyYXRvciBiZXR3ZWVuIHJhbmdlcyAoZGVmYXVsdCAnLCcpCisgICAgLSB0aGUgc2VwYXJhdG9yIGJldHdlZW4gYmVnaW4gYW5kIGVuZCBvZiBhIHJhbmdlIChkZWZhdWx0ICctJykKKyAgICBUaGUgc2VwYXJhdG9ycyBtdXN0IGJlIHN0cmluZ3MgKG5vdCByZWdleHBycykgYW5kIHNob3VsZCBiZSBkaWZmZXJlbnQuCisKKyAgICBUaGUgdG9zdHJpbmcoKSBmdW5jdGlvbiB5aWVsZHMgYSBzdHJpbmcgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIGFub3RoZXIKKyAgICBJbnRTZXQgY29uc3RydWN0b3I7IF9fcmVwcl9fKCkgaXMgYSB2YWxpZCBJbnRTZXQgY29uc3RydWN0b3IgaXRzZWxmLgorICAgICIiIgorCisgICAgIyBYWFggVGhlIGRlZmF1bHQgYmVnaW4vZW5kIHNlcGFyYXRvciBtZWFucyB0aGF0IG5lZ2F0aXZlIG51bWJlcnMgYXJlCisgICAgIyAgICAgbm90IHN1cHBvcnRlZCB2ZXJ5IHdlbGwuCisgICAgIworICAgICMgWFhYIFRoZXJlIGFyZSBjdXJyZW50bHkgbm8gb3BlcmF0aW9ucyB0byByZW1vdmUgc2V0IGVsZW1lbnRzLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEgPSBOb25lLCBzZXAgPSAnLCcsIHJuZyA9ICctJyk6CisgICAgICAgIHNlbGYucGFpcnMgPSBbXQorICAgICAgICBzZWxmLnNlcCA9IHNlcAorICAgICAgICBzZWxmLnJuZyA9IHJuZworICAgICAgICBpZiBkYXRhOiBzZWxmLmZyb21zdHJpbmcoZGF0YSkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5wYWlycyA9IFtdCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBjbXAoc2VsZi5wYWlycywgb3RoZXIucGFpcnMpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYucGFpcnMpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnSW50U2V0KCVyLCAlciwgJXIpJyAlIChzZWxmLnRvc3RyaW5nKCksIHNlbGYuc2VwLCBzZWxmLnJuZykKKworICAgIGRlZiBub3JtYWxpemUoc2VsZik6CisgICAgICAgIHNlbGYucGFpcnMuc29ydCgpCisgICAgICAgIGkgPSAxCisgICAgICAgIHdoaWxlIGkgPCBsZW4oc2VsZi5wYWlycyk6CisgICAgICAgICAgICBhbG8sIGFoaSA9IHNlbGYucGFpcnNbaS0xXQorICAgICAgICAgICAgYmxvLCBiaGkgPSBzZWxmLnBhaXJzW2ldCisgICAgICAgICAgICBpZiBhaGkgPj0gYmxvLTE6CisgICAgICAgICAgICAgICAgc2VsZi5wYWlyc1tpLTE6aSsxXSA9IFsoYWxvLCBtYXgoYWhpLCBiaGkpKV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaSA9IGkrMQorCisgICAgZGVmIHRvc3RyaW5nKHNlbGYpOgorICAgICAgICBzID0gJycKKyAgICAgICAgZm9yIGxvLCBoaSBpbiBzZWxmLnBhaXJzOgorICAgICAgICAgICAgaWYgbG8gPT0gaGk6IHQgPSByZXByKGxvKQorICAgICAgICAgICAgZWxzZTogdCA9IHJlcHIobG8pICsgc2VsZi5ybmcgKyByZXByKGhpKQorICAgICAgICAgICAgaWYgczogcyA9IHMgKyAoc2VsZi5zZXAgKyB0KQorICAgICAgICAgICAgZWxzZTogcyA9IHQKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiB0b2xpc3Qoc2VsZik6CisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgbG8sIGhpIGluIHNlbGYucGFpcnM6CisgICAgICAgICAgICBtID0gcmFuZ2UobG8sIGhpKzEpCisgICAgICAgICAgICBsID0gbCArIG0KKyAgICAgICAgcmV0dXJuIGwKKworICAgIGRlZiBmcm9tbGlzdChzZWxmLCBsaXN0KToKKyAgICAgICAgZm9yIGkgaW4gbGlzdDoKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kKGkpCisKKyAgICBkZWYgY2xvbmUoc2VsZik6CisgICAgICAgIG5ldyA9IEludFNldCgpCisgICAgICAgIG5ldy5wYWlycyA9IHNlbGYucGFpcnNbOl0KKyAgICAgICAgcmV0dXJuIG5ldworCisgICAgZGVmIG1pbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGFpcnNbMF1bMF0KKworICAgIGRlZiBtYXgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhaXJzWy0xXVstMV0KKworICAgIGRlZiBjb250YWlucyhzZWxmLCB4KToKKyAgICAgICAgZm9yIGxvLCBoaSBpbiBzZWxmLnBhaXJzOgorICAgICAgICAgICAgaWYgbG8gPD0geCA8PSBoaTogcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIHgpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYWlycykpOgorICAgICAgICAgICAgbG8sIGhpID0gc2VsZi5wYWlyc1tpXQorICAgICAgICAgICAgaWYgeCA8IGxvOiAjIE5lZWQgdG8gaW5zZXJ0IGJlZm9yZQorICAgICAgICAgICAgICAgIGlmIHgrMSA9PSBsbzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYWlyc1tpXSA9ICh4LCBoaSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhaXJzLmluc2VydChpLCAoeCwgeCkpCisgICAgICAgICAgICAgICAgaWYgaSA+IDAgYW5kIHgtMSA9PSBzZWxmLnBhaXJzW2ktMV1bMV06CisgICAgICAgICAgICAgICAgICAgICMgTWVyZ2Ugd2l0aCBwcmV2aW91cworICAgICAgICAgICAgICAgICAgICBzZWxmLnBhaXJzW2ktMTppKzFdID0gWworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnBhaXJzW2ktMV1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFpcnNbaV1bMV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHggPD0gaGk6ICMgQWxyZWFkeSBpbiBzZXQKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaSA9IGxlbihzZWxmLnBhaXJzKSAtIDEKKyAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgbG8sIGhpID0gc2VsZi5wYWlyc1tpXQorICAgICAgICAgICAgaWYgeC0xID09IGhpOgorICAgICAgICAgICAgICAgIHNlbGYucGFpcnNbaV0gPSBsbywgeAorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnBhaXJzLmFwcGVuZCgoeCwgeCkpCisKKyAgICBkZWYgYWRkcGFpcihzZWxmLCB4bG8sIHhoaSk6CisgICAgICAgIGlmIHhsbyA+IHhoaTogcmV0dXJuCisgICAgICAgIHNlbGYucGFpcnMuYXBwZW5kKCh4bG8sIHhoaSkpCisgICAgICAgIHNlbGYubm9ybWFsaXplKCkKKworICAgIGRlZiBmcm9tc3RyaW5nKHNlbGYsIGRhdGEpOgorICAgICAgICBuZXcgPSBbXQorICAgICAgICBmb3IgcGFydCBpbiBkYXRhLnNwbGl0KHNlbGYuc2VwKToKKyAgICAgICAgICAgIGxpc3QgPSBbXQorICAgICAgICAgICAgZm9yIHN1YnAgaW4gcGFydC5zcGxpdChzZWxmLnJuZyk6CisgICAgICAgICAgICAgICAgcyA9IHN1YnAuc3RyaXAoKQorICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGludChzKSkKKyAgICAgICAgICAgIGlmIGxlbihsaXN0KSA9PSAxOgorICAgICAgICAgICAgICAgIG5ldy5hcHBlbmQoKGxpc3RbMF0sIGxpc3RbMF0pKQorICAgICAgICAgICAgZWxpZiBsZW4obGlzdCkgPT0gMiBhbmQgbGlzdFswXSA8PSBsaXN0WzFdOgorICAgICAgICAgICAgICAgIG5ldy5hcHBlbmQoKGxpc3RbMF0sIGxpc3RbMV0pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnYmFkIGRhdGEgcGFzc2VkIHRvIEludFNldCcKKyAgICAgICAgc2VsZi5wYWlycyA9IHNlbGYucGFpcnMgKyBuZXcKKyAgICAgICAgc2VsZi5ub3JtYWxpemUoKQorCisKKyMgU3Vicm91dGluZXMgdG8gcmVhZC93cml0ZSBlbnRyaWVzIGluIC5taF9wcm9maWxlIGFuZCAubWhfc2VxdWVuY2VzCisKK2RlZiBwaWNrbGluZShmaWxlLCBrZXksIGNhc2Vmb2xkID0gMSk6CisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihmaWxlLCAncicpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgcGF0ID0gcmUuZXNjYXBlKGtleSkgKyAnOicKKyAgICBwcm9nID0gcmUuY29tcGlsZShwYXQsIGNhc2Vmb2xkIGFuZCByZS5JR05PUkVDQVNFKQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIGlmIHByb2cubWF0Y2gobGluZSk6CisgICAgICAgICAgICB0ZXh0ID0gbGluZVtsZW4oa2V5KSsxOl0KKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lIG9yIG5vdCBsaW5lWzBdLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dCArIGxpbmUKKyAgICAgICAgICAgIHJldHVybiB0ZXh0LnN0cmlwKCkKKyAgICByZXR1cm4gTm9uZQorCitkZWYgdXBkYXRlbGluZShmaWxlLCBrZXksIHZhbHVlLCBjYXNlZm9sZCA9IDEpOgorICAgIHRyeToKKyAgICAgICAgZiA9IG9wZW4oZmlsZSwgJ3InKQorICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIGxpbmVzID0gW10KKyAgICBwYXQgPSByZS5lc2NhcGUoa2V5KSArICc6KC4qKVxuJworICAgIHByb2cgPSByZS5jb21waWxlKHBhdCwgY2FzZWZvbGQgYW5kIHJlLklHTk9SRUNBU0UpCisgICAgaWYgdmFsdWUgaXMgTm9uZToKKyAgICAgICAgbmV3bGluZSA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBuZXdsaW5lID0gJyVzOiAlc1xuJyAlIChrZXksIHZhbHVlKQorICAgIGZvciBpIGluIHJhbmdlKGxlbihsaW5lcykpOgorICAgICAgICBsaW5lID0gbGluZXNbaV0KKyAgICAgICAgaWYgcHJvZy5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGlmIG5ld2xpbmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgbGluZXNbaV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBuZXdsaW5lCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIGlmIG5ld2xpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsaW5lcy5hcHBlbmQobmV3bGluZSkKKyAgICB0ZW1wZmlsZSA9IGZpbGUgKyAifiIKKyAgICBmID0gb3Blbih0ZW1wZmlsZSwgJ3cnKQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBmLndyaXRlKGxpbmUpCisgICAgZi5jbG9zZSgpCisgICAgb3MucmVuYW1lKHRlbXBmaWxlLCBmaWxlKQorCisKKyMgVGVzdCBwcm9ncmFtCisKK2RlZiB0ZXN0KCk6CisgICAgZ2xvYmFsIG1oLCBmCisgICAgb3Muc3lzdGVtKCdybSAtcmYgJEhPTUUvTWFpbC9AdGVzdCcpCisgICAgbWggPSBNSCgpCisgICAgZGVmIGRvKHMpOiBwcmludCBzOyBwcmludCBldmFsKHMpCisgICAgZG8oJ21oLmxpc3Rmb2xkZXJzKCknKQorICAgIGRvKCdtaC5saXN0YWxsZm9sZGVycygpJykKKyAgICB0ZXN0Zm9sZGVycyA9IFsnQHRlc3QnLCAnQHRlc3QvdGVzdDEnLCAnQHRlc3QvdGVzdDInLAorICAgICAgICAgICAgICAgICAgICdAdGVzdC90ZXN0MS90ZXN0MTEnLCAnQHRlc3QvdGVzdDEvdGVzdDEyJywKKyAgICAgICAgICAgICAgICAgICAnQHRlc3QvdGVzdDEvdGVzdDExL3Rlc3QxMTEnXQorICAgIGZvciB0IGluIHRlc3Rmb2xkZXJzOiBkbygnbWgubWFrZWZvbGRlciglciknICUgKHQsKSkKKyAgICBkbygnbWgubGlzdHN1YmZvbGRlcnMoXCdAdGVzdFwnKScpCisgICAgZG8oJ21oLmxpc3RhbGxzdWJmb2xkZXJzKFwnQHRlc3RcJyknKQorICAgIGYgPSBtaC5vcGVuZm9sZGVyKCdAdGVzdCcpCisgICAgZG8oJ2YubGlzdHN1YmZvbGRlcnMoKScpCisgICAgZG8oJ2YubGlzdGFsbHN1YmZvbGRlcnMoKScpCisgICAgZG8oJ2YuZ2V0c2VxdWVuY2VzKCknKQorICAgIHNlcXMgPSBmLmdldHNlcXVlbmNlcygpCisgICAgc2Vxc1snZm9vJ10gPSBJbnRTZXQoJzEtMTAgMTItMjAnLCAnICcpLnRvbGlzdCgpCisgICAgcHJpbnQgc2VxcworICAgIGYucHV0c2VxdWVuY2VzKHNlcXMpCisgICAgZG8oJ2YuZ2V0c2VxdWVuY2VzKCknKQorICAgIGZvciB0IGluIHJldmVyc2VkKHRlc3Rmb2xkZXJzKTogZG8oJ21oLmRlbGV0ZWZvbGRlciglciknICUgKHQsKSkKKyAgICBkbygnbWguZ2V0Y29udGV4dCgpJykKKyAgICBjb250ZXh0ID0gbWguZ2V0Y29udGV4dCgpCisgICAgZiA9IG1oLm9wZW5mb2xkZXIoY29udGV4dCkKKyAgICBkbygnZi5nZXRjdXJyZW50KCknKQorICAgIGZvciBzZXEgaW4gKCdmaXJzdCcsICdsYXN0JywgJ2N1cicsICcuJywgJ3ByZXYnLCAnbmV4dCcsCisgICAgICAgICAgICAgICAgJ2ZpcnN0OjMnLCAnbGFzdDozJywgJ2N1cjozJywgJ2N1cjotMycsCisgICAgICAgICAgICAgICAgJ3ByZXY6MycsICduZXh0OjMnLAorICAgICAgICAgICAgICAgICcxOjMnLCAnMTotMycsICcxMDA6MycsICcxMDA6LTMnLCAnMTAwMDA6MycsICcxMDAwMDotMycsCisgICAgICAgICAgICAgICAgJ2FsbCcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkbygnZi5wYXJzZXNlcXVlbmNlKCVyKScgJSAoc2VxLCkpCisgICAgICAgIGV4Y2VwdCBFcnJvciwgbXNnOgorICAgICAgICAgICAgcHJpbnQgIkVycm9yOiIsIG1zZworICAgICAgICBzdHVmZiA9IG9zLnBvcGVuKCJwaWNrICVyIDI+L2Rldi9udWxsIiAlIChzZXEsKSkucmVhZCgpCisgICAgICAgIGxpc3QgPSBtYXAoaW50LCBzdHVmZi5zcGxpdCgpKQorICAgICAgICBwcmludCBsaXN0LCAiPC0tIHBpY2siCisgICAgZG8oJ2YubGlzdG1lc3NhZ2VzKCknKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21obGliLnB5YyBiL2xpYi9weXRob24yLjcvbWhsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjRiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21obGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21obGliLnB5byBiL2xpYi9weXRob24yLjcvbWhsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMjRiMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21obGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21pbWV0b29scy5weSBiL2xpYi9weXRob24yLjcvbWltZXRvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxY2E4ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21pbWV0b29scy5weQpAQCAtMCwwICsxLDI1MCBAQAorIiIiVmFyaW91cyB0b29scyB1c2VkIGJ5IE1JTUUtcmVhZGluZyBvciBNSU1FLXdyaXRpbmcgcHJvZ3JhbXMuIiIiCisKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2Zyb20gd2FybmluZ3MgaW1wb3J0IGZpbHRlcndhcm5pbmdzLCBjYXRjaF93YXJuaW5ncword2l0aCBjYXRjaF93YXJuaW5ncygpOgorICAgIGlmIHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKnJmYzgyMiBoYXMgYmVlbiByZW1vdmVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgIGltcG9ydCByZmM4MjIKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJpbiAzLngsIG1pbWV0b29scyBoYXMgYmVlbiByZW1vdmVkIGluIGZhdm9yIG9mIHRoZSBlbWFpbCBwYWNrYWdlIiwKKyAgICAgICAgIHN0YWNrbGV2ZWw9MikKKworX19hbGxfXyA9IFsiTWVzc2FnZSIsImNob29zZV9ib3VuZGFyeSIsImVuY29kZSIsImRlY29kZSIsImNvcHlsaXRlcmFsIiwKKyAgICAgICAgICAgImNvcHliaW5hcnkiXQorCitjbGFzcyBNZXNzYWdlKHJmYzgyMi5NZXNzYWdlKToKKyAgICAiIiJBIGRlcml2ZWQgY2xhc3Mgb2YgcmZjODIyLk1lc3NhZ2UgdGhhdCBrbm93cyBhYm91dCBNSU1FIGhlYWRlcnMgYW5kCisgICAgY29udGFpbnMgc29tZSBob29rcyBmb3IgZGVjb2RpbmcgZW5jb2RlZCBhbmQgbXVsdGlwYXJ0IG1lc3NhZ2VzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBzZWVrYWJsZSA9IDEpOgorICAgICAgICByZmM4MjIuTWVzc2FnZS5fX2luaXRfXyhzZWxmLCBmcCwgc2Vla2FibGUpCisgICAgICAgIHNlbGYuZW5jb2RpbmdoZWFkZXIgPSBcCisgICAgICAgICAgICAgICAgc2VsZi5nZXRoZWFkZXIoJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnKQorICAgICAgICBzZWxmLnR5cGVoZWFkZXIgPSBcCisgICAgICAgICAgICAgICAgc2VsZi5nZXRoZWFkZXIoJ2NvbnRlbnQtdHlwZScpCisgICAgICAgIHNlbGYucGFyc2V0eXBlKCkKKyAgICAgICAgc2VsZi5wYXJzZXBsaXN0KCkKKworICAgIGRlZiBwYXJzZXR5cGUoc2VsZik6CisgICAgICAgIHN0ciA9IHNlbGYudHlwZWhlYWRlcgorICAgICAgICBpZiBzdHIgaXMgTm9uZToKKyAgICAgICAgICAgIHN0ciA9ICd0ZXh0L3BsYWluJworICAgICAgICBpZiAnOycgaW4gc3RyOgorICAgICAgICAgICAgaSA9IHN0ci5pbmRleCgnOycpCisgICAgICAgICAgICBzZWxmLnBsaXN0dGV4dCA9IHN0cltpOl0KKyAgICAgICAgICAgIHN0ciA9IHN0cls6aV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucGxpc3R0ZXh0ID0gJycKKyAgICAgICAgZmllbGRzID0gc3RyLnNwbGl0KCcvJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGZpZWxkcykpOgorICAgICAgICAgICAgZmllbGRzW2ldID0gZmllbGRzW2ldLnN0cmlwKCkubG93ZXIoKQorICAgICAgICBzZWxmLnR5cGUgPSAnLycuam9pbihmaWVsZHMpCisgICAgICAgIHNlbGYubWFpbnR5cGUgPSBmaWVsZHNbMF0KKyAgICAgICAgc2VsZi5zdWJ0eXBlID0gJy8nLmpvaW4oZmllbGRzWzE6XSkKKworICAgIGRlZiBwYXJzZXBsaXN0KHNlbGYpOgorICAgICAgICBzdHIgPSBzZWxmLnBsaXN0dGV4dAorICAgICAgICBzZWxmLnBsaXN0ID0gW10KKyAgICAgICAgd2hpbGUgc3RyWzoxXSA9PSAnOyc6CisgICAgICAgICAgICBzdHIgPSBzdHJbMTpdCisgICAgICAgICAgICBpZiAnOycgaW4gc3RyOgorICAgICAgICAgICAgICAgICMgWFhYIFNob3VsZCBwYXJzZSBxdW90ZXMhCisgICAgICAgICAgICAgICAgZW5kID0gc3RyLmluZGV4KCc7JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW5kID0gbGVuKHN0cikKKyAgICAgICAgICAgIGYgPSBzdHJbOmVuZF0KKyAgICAgICAgICAgIGlmICc9JyBpbiBmOgorICAgICAgICAgICAgICAgIGkgPSBmLmluZGV4KCc9JykKKyAgICAgICAgICAgICAgICBmID0gZls6aV0uc3RyaXAoKS5sb3dlcigpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgJz0nICsgZltpKzE6XS5zdHJpcCgpCisgICAgICAgICAgICBzZWxmLnBsaXN0LmFwcGVuZChmLnN0cmlwKCkpCisgICAgICAgICAgICBzdHIgPSBzdHJbZW5kOl0KKworICAgIGRlZiBnZXRwbGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucGxpc3QKKworICAgIGRlZiBnZXRwYXJhbShzZWxmLCBuYW1lKToKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKSArICc9JworICAgICAgICBuID0gbGVuKG5hbWUpCisgICAgICAgIGZvciBwIGluIHNlbGYucGxpc3Q6CisgICAgICAgICAgICBpZiBwWzpuXSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiByZmM4MjIudW5xdW90ZShwW246XSkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXRwYXJhbW5hbWVzKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgcCBpbiBzZWxmLnBsaXN0OgorICAgICAgICAgICAgaSA9IHAuZmluZCgnPScpCisgICAgICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwWzppXS5sb3dlcigpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0ZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZW5jb2RpbmdoZWFkZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnN2JpdCcKKyAgICAgICAgcmV0dXJuIHNlbGYuZW5jb2RpbmdoZWFkZXIubG93ZXIoKQorCisgICAgZGVmIGdldHR5cGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUKKworICAgIGRlZiBnZXRtYWludHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubWFpbnR5cGUKKworICAgIGRlZiBnZXRzdWJ0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdWJ0eXBlCisKKworCisKKyMgVXRpbGl0eSBmdW5jdGlvbnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0KKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgZHVtbXlfdGhyZWFkIGFzIHRocmVhZAorX2NvdW50ZXJfbG9jayA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKK2RlbCB0aHJlYWQKKworX2NvdW50ZXIgPSAwCitkZWYgX2dldF9uZXh0X2NvdW50ZXIoKToKKyAgICBnbG9iYWwgX2NvdW50ZXIKKyAgICBfY291bnRlcl9sb2NrLmFjcXVpcmUoKQorICAgIF9jb3VudGVyICs9IDEKKyAgICByZXN1bHQgPSBfY291bnRlcgorICAgIF9jb3VudGVyX2xvY2sucmVsZWFzZSgpCisgICAgcmV0dXJuIHJlc3VsdAorCitfcHJlZml4ID0gTm9uZQorCitkZWYgY2hvb3NlX2JvdW5kYXJ5KCk6CisgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHVzYWJsZSBhcyBhIG11bHRpcGFydCBib3VuZGFyeS4KKworICAgIFRoZSBzdHJpbmcgY2hvc2VuIGlzIHVuaXF1ZSB3aXRoaW4gYSBzaW5nbGUgcHJvZ3JhbSBydW4sIGFuZAorICAgIGluY29ycG9yYXRlcyB0aGUgdXNlciBpZCAoaWYgYXZhaWxhYmxlKSwgcHJvY2VzcyBpZCAoaWYgYXZhaWxhYmxlKSwKKyAgICBhbmQgY3VycmVudCB0aW1lLiAgU28gaXQncyB2ZXJ5IHVubGlrZWx5IHRoZSByZXR1cm5lZCBzdHJpbmcgYXBwZWFycworICAgIGluIG1lc3NhZ2UgdGV4dCwgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlLgorCisgICAgVGhlIGJvdW5kYXJ5IGNvbnRhaW5zIGRvdHMgc28geW91IGhhdmUgdG8gcXVvdGUgaXQgaW4gdGhlIGhlYWRlci4iIiIKKworICAgIGdsb2JhbCBfcHJlZml4CisgICAgaW1wb3J0IHRpbWUKKyAgICBpZiBfcHJlZml4IGlzIE5vbmU6CisgICAgICAgIGltcG9ydCBzb2NrZXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaG9zdGlkID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBob3N0aWQgPSAnMTI3LjAuMC4xJworICAgICAgICB0cnk6CisgICAgICAgICAgICB1aWQgPSByZXByKG9zLmdldHVpZCgpKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB1aWQgPSAnMScKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGlkID0gcmVwcihvcy5nZXRwaWQoKSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGlkID0gJzEnCisgICAgICAgIF9wcmVmaXggPSBob3N0aWQgKyAnLicgKyB1aWQgKyAnLicgKyBwaWQKKyAgICByZXR1cm4gIiVzLiUuM2YuJWQiICUgKF9wcmVmaXgsIHRpbWUudGltZSgpLCBfZ2V0X25leHRfY291bnRlcigpKQorCisKKyMgU3Vicm91dGluZXMgZm9yIGRlY29kaW5nIHNvbWUgY29tbW9uIGNvbnRlbnQtdHJhbnNmZXItdHlwZXMKKworZGVmIGRlY29kZShpbnB1dCwgb3V0cHV0LCBlbmNvZGluZyk6CisgICAgIiIiRGVjb2RlIGNvbW1vbiBjb250ZW50LXRyYW5zZmVyLWVuY29kaW5ncyAoYmFzZTY0LCBxdW9wcmksIHV1ZW5jb2RlKS4iIiIKKyAgICBpZiBlbmNvZGluZyA9PSAnYmFzZTY0JzoKKyAgICAgICAgaW1wb3J0IGJhc2U2NAorICAgICAgICByZXR1cm4gYmFzZTY0LmRlY29kZShpbnB1dCwgb3V0cHV0KQorICAgIGlmIGVuY29kaW5nID09ICdxdW90ZWQtcHJpbnRhYmxlJzoKKyAgICAgICAgaW1wb3J0IHF1b3ByaQorICAgICAgICByZXR1cm4gcXVvcHJpLmRlY29kZShpbnB1dCwgb3V0cHV0KQorICAgIGlmIGVuY29kaW5nIGluICgndXVlbmNvZGUnLCAneC11dWVuY29kZScsICd1dWUnLCAneC11dWUnKToKKyAgICAgICAgaW1wb3J0IHV1CisgICAgICAgIHJldHVybiB1dS5kZWNvZGUoaW5wdXQsIG91dHB1dCkKKyAgICBpZiBlbmNvZGluZyBpbiAoJzdiaXQnLCAnOGJpdCcpOgorICAgICAgICByZXR1cm4gb3V0cHV0LndyaXRlKGlucHV0LnJlYWQoKSkKKyAgICBpZiBlbmNvZGluZyBpbiBkZWNvZGV0YWI6CisgICAgICAgIHBpcGV0aHJvdWdoKGlucHV0LCBkZWNvZGV0YWJbZW5jb2RpbmddLCBvdXRwdXQpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAndW5rbm93biBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiAlcycgJSBlbmNvZGluZworCitkZWYgZW5jb2RlKGlucHV0LCBvdXRwdXQsIGVuY29kaW5nKToKKyAgICAiIiJFbmNvZGUgY29tbW9uIGNvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmdzIChiYXNlNjQsIHF1b3ByaSwgdXVlbmNvZGUpLiIiIgorICAgIGlmIGVuY29kaW5nID09ICdiYXNlNjQnOgorICAgICAgICBpbXBvcnQgYmFzZTY0CisgICAgICAgIHJldHVybiBiYXNlNjQuZW5jb2RlKGlucHV0LCBvdXRwdXQpCisgICAgaWYgZW5jb2RpbmcgPT0gJ3F1b3RlZC1wcmludGFibGUnOgorICAgICAgICBpbXBvcnQgcXVvcHJpCisgICAgICAgIHJldHVybiBxdW9wcmkuZW5jb2RlKGlucHV0LCBvdXRwdXQsIDApCisgICAgaWYgZW5jb2RpbmcgaW4gKCd1dWVuY29kZScsICd4LXV1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZScpOgorICAgICAgICBpbXBvcnQgdXUKKyAgICAgICAgcmV0dXJuIHV1LmVuY29kZShpbnB1dCwgb3V0cHV0KQorICAgIGlmIGVuY29kaW5nIGluICgnN2JpdCcsICc4Yml0Jyk6CisgICAgICAgIHJldHVybiBvdXRwdXQud3JpdGUoaW5wdXQucmVhZCgpKQorICAgIGlmIGVuY29kaW5nIGluIGVuY29kZXRhYjoKKyAgICAgICAgcGlwZXRocm91Z2goaW5wdXQsIGVuY29kZXRhYltlbmNvZGluZ10sIG91dHB1dCkKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICd1bmtub3duIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICVzJyAlIGVuY29kaW5nCisKKyMgVGhlIGZvbGxvd2luZyBpcyBubyBsb25nZXIgdXNlZCBmb3Igc3RhbmRhcmQgZW5jb2RpbmdzCisKKyMgWFhYIFRoaXMgcmVxdWlyZXMgdGhhdCB1dWRlY29kZSBhbmQgbW1lbmNvZGUgYXJlIGluICRQQVRICisKK3V1ZGVjb2RlX3BpcGUgPSAnJycoCitURU1QPS90bXAvQHV1LiQkCitzZWQgInMlXmJlZ2luIFswLTddWzAtN10qIC4qJWJlZ2luIDYwMCAkVEVNUCUiIHwgdXVkZWNvZGUKK2NhdCAkVEVNUAorcm0gJFRFTVAKKyknJycKKworZGVjb2RldGFiID0geworICAgICAgICAndXVlbmNvZGUnOiAgICAgICAgICAgICB1dWRlY29kZV9waXBlLAorICAgICAgICAneC11dWVuY29kZSc6ICAgICAgICAgICB1dWRlY29kZV9waXBlLAorICAgICAgICAndXVlJzogICAgICAgICAgICAgICAgICB1dWRlY29kZV9waXBlLAorICAgICAgICAneC11dWUnOiAgICAgICAgICAgICAgICB1dWRlY29kZV9waXBlLAorICAgICAgICAncXVvdGVkLXByaW50YWJsZSc6ICAgICAnbW1lbmNvZGUgLXUgLXEnLAorICAgICAgICAnYmFzZTY0JzogICAgICAgICAgICAgICAnbW1lbmNvZGUgLXUgLWInLAorfQorCitlbmNvZGV0YWIgPSB7CisgICAgICAgICd4LXV1ZW5jb2RlJzogICAgICAgICAgICd1dWVuY29kZSB0ZW1wZmlsZScsCisgICAgICAgICd1dWVuY29kZSc6ICAgICAgICAgICAgICd1dWVuY29kZSB0ZW1wZmlsZScsCisgICAgICAgICd4LXV1ZSc6ICAgICAgICAgICAgICAgICd1dWVuY29kZSB0ZW1wZmlsZScsCisgICAgICAgICd1dWUnOiAgICAgICAgICAgICAgICAgICd1dWVuY29kZSB0ZW1wZmlsZScsCisgICAgICAgICdxdW90ZWQtcHJpbnRhYmxlJzogICAgICdtbWVuY29kZSAtcScsCisgICAgICAgICdiYXNlNjQnOiAgICAgICAgICAgICAgICdtbWVuY29kZSAtYicsCit9CisKK2RlZiBwaXBldG8oaW5wdXQsIGNvbW1hbmQpOgorICAgIHBpcGUgPSBvcy5wb3Blbihjb21tYW5kLCAndycpCisgICAgY29weWxpdGVyYWwoaW5wdXQsIHBpcGUpCisgICAgcGlwZS5jbG9zZSgpCisKK2RlZiBwaXBldGhyb3VnaChpbnB1dCwgY29tbWFuZCwgb3V0cHV0KToKKyAgICAoZmQsIHRlbXBuYW1lKSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgIHRlbXAgPSBvcy5mZG9wZW4oZmQsICd3JykKKyAgICBjb3B5bGl0ZXJhbChpbnB1dCwgdGVtcCkKKyAgICB0ZW1wLmNsb3NlKCkKKyAgICBwaXBlID0gb3MucG9wZW4oY29tbWFuZCArICcgPCcgKyB0ZW1wbmFtZSwgJ3InKQorICAgIGNvcHliaW5hcnkocGlwZSwgb3V0cHV0KQorICAgIHBpcGUuY2xvc2UoKQorICAgIG9zLnVubGluayh0ZW1wbmFtZSkKKworZGVmIGNvcHlsaXRlcmFsKGlucHV0LCBvdXRwdXQpOgorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBpbnB1dC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICBvdXRwdXQud3JpdGUobGluZSkKKworZGVmIGNvcHliaW5hcnkoaW5wdXQsIG91dHB1dCk6CisgICAgQlVGU0laRSA9IDgxOTIKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gaW5wdXQucmVhZChCVUZTSVpFKQorICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgb3V0cHV0LndyaXRlKGxpbmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21pbWV0b29scy5weWMgYi9saWIvcHl0aG9uMi43L21pbWV0b29scy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmMmM5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWltZXRvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21pbWV0b29scy5weW8gYi9saWIvcHl0aG9uMi43L21pbWV0b29scy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmMmM5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbWltZXRvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21pbWV0eXBlcy5weSBiL2xpYi9weXRob24yLjcvbWltZXR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWRlNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21pbWV0eXBlcy5weQpAQCAtMCwwICsxLDU5NCBAQAorIiIiR3Vlc3MgdGhlIE1JTUUgdHlwZSBvZiBhIGZpbGUuCisKK1RoaXMgbW9kdWxlIGRlZmluZXMgdHdvIHVzZWZ1bCBmdW5jdGlvbnM6CisKK2d1ZXNzX3R5cGUodXJsLCBzdHJpY3Q9MSkgLS0gZ3Vlc3MgdGhlIE1JTUUgdHlwZSBhbmQgZW5jb2Rpbmcgb2YgYSBVUkwuCisKK2d1ZXNzX2V4dGVuc2lvbih0eXBlLCBzdHJpY3Q9MSkgLS0gZ3Vlc3MgdGhlIGV4dGVuc2lvbiBmb3IgYSBnaXZlbiBNSU1FIHR5cGUuCisKK0l0IGFsc28gY29udGFpbnMgdGhlIGZvbGxvd2luZywgZm9yIHR1bmluZyB0aGUgYmVoYXZpb3I6CisKK0RhdGE6CisKK2tub3duZmlsZXMgLS0gbGlzdCBvZiBmaWxlcyB0byBwYXJzZQoraW5pdGVkIC0tIGZsYWcgc2V0IHdoZW4gaW5pdCgpIGhhcyBiZWVuIGNhbGxlZAorc3VmZml4X21hcCAtLSBkaWN0aW9uYXJ5IG1hcHBpbmcgc3VmZml4ZXMgdG8gc3VmZml4ZXMKK2VuY29kaW5nc19tYXAgLS0gZGljdGlvbmFyeSBtYXBwaW5nIHN1ZmZpeGVzIHRvIGVuY29kaW5ncwordHlwZXNfbWFwIC0tIGRpY3Rpb25hcnkgbWFwcGluZyBzdWZmaXhlcyB0byB0eXBlcworCitGdW5jdGlvbnM6CisKK2luaXQoW2ZpbGVzXSkgLS0gcGFyc2UgYSBsaXN0IG9mIGZpbGVzLCBkZWZhdWx0IGtub3duZmlsZXMgKG9uIFdpbmRvd3MsIHRoZQorICBkZWZhdWx0IHZhbHVlcyBhcmUgdGFrZW4gZnJvbSB0aGUgcmVnaXN0cnkpCityZWFkX21pbWVfdHlwZXMoZmlsZSkgLS0gcGFyc2Ugb25lIGZpbGUsIHJldHVybiBhIGRpY3Rpb25hcnkgb3IgTm9uZQorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHBvc2l4cGF0aAoraW1wb3J0IHVybGxpYgordHJ5OgorICAgIGltcG9ydCBfd2lucmVnCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX3dpbnJlZyA9IE5vbmUKKworX19hbGxfXyA9IFsKKyAgICAiZ3Vlc3NfdHlwZSIsImd1ZXNzX2V4dGVuc2lvbiIsImd1ZXNzX2FsbF9leHRlbnNpb25zIiwKKyAgICAiYWRkX3R5cGUiLCJyZWFkX21pbWVfdHlwZXMiLCJpbml0IgorXQorCitrbm93bmZpbGVzID0gWworICAgICIvZXRjL21pbWUudHlwZXMiLAorICAgICIvZXRjL2h0dHBkL21pbWUudHlwZXMiLCAgICAgICAgICAgICAgICAgICAgIyBNYWMgT1MgWAorICAgICIvZXRjL2h0dHBkL2NvbmYvbWltZS50eXBlcyIsICAgICAgICAgICAgICAgIyBBcGFjaGUKKyAgICAiL2V0Yy9hcGFjaGUvbWltZS50eXBlcyIsICAgICAgICAgICAgICAgICAgICMgQXBhY2hlIDEKKyAgICAiL2V0Yy9hcGFjaGUyL21pbWUudHlwZXMiLCAgICAgICAgICAgICAgICAgICMgQXBhY2hlIDIKKyAgICAiL3Vzci9sb2NhbC9ldGMvaHR0cGQvY29uZi9taW1lLnR5cGVzIiwKKyAgICAiL3Vzci9sb2NhbC9saWIvbmV0c2NhcGUvbWltZS50eXBlcyIsCisgICAgIi91c3IvbG9jYWwvZXRjL2h0dHBkL2NvbmYvbWltZS50eXBlcyIsICAgICAjIEFwYWNoZSAxLjIKKyAgICAiL3Vzci9sb2NhbC9ldGMvbWltZS50eXBlcyIsICAgICAgICAgICAgICAgICMgQXBhY2hlIDEuMworICAgIF0KKworaW5pdGVkID0gRmFsc2UKK19kYiA9IE5vbmUKKworCitjbGFzcyBNaW1lVHlwZXM6CisgICAgIiIiTUlNRS10eXBlcyBkYXRhc3RvcmUuCisKKyAgICBUaGlzIGRhdGFzdG9yZSBjYW4gaGFuZGxlIGluZm9ybWF0aW9uIGZyb20gbWltZS50eXBlcy1zdHlsZSBmaWxlcworICAgIGFuZCBzdXBwb3J0cyBiYXNpYyBkZXRlcm1pbmF0aW9uIG9mIE1JTUUgdHlwZSBmcm9tIGEgZmlsZW5hbWUgb3IKKyAgICBVUkwsIGFuZCBjYW4gZ3Vlc3MgYSByZWFzb25hYmxlIGV4dGVuc2lvbiBnaXZlbiBhIE1JTUUgdHlwZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZXM9KCksIHN0cmljdD1UcnVlKToKKyAgICAgICAgaWYgbm90IGluaXRlZDoKKyAgICAgICAgICAgIGluaXQoKQorICAgICAgICBzZWxmLmVuY29kaW5nc19tYXAgPSBlbmNvZGluZ3NfbWFwLmNvcHkoKQorICAgICAgICBzZWxmLnN1ZmZpeF9tYXAgPSBzdWZmaXhfbWFwLmNvcHkoKQorICAgICAgICBzZWxmLnR5cGVzX21hcCA9ICh7fSwge30pICMgZGljdCBmb3IgKG5vbi1zdHJpY3QsIHN0cmljdCkKKyAgICAgICAgc2VsZi50eXBlc19tYXBfaW52ID0gKHt9LCB7fSkKKyAgICAgICAgZm9yIChleHQsIHR5cGUpIGluIHR5cGVzX21hcC5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hZGRfdHlwZSh0eXBlLCBleHQsIFRydWUpCisgICAgICAgIGZvciAoZXh0LCB0eXBlKSBpbiBjb21tb25fdHlwZXMuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYWRkX3R5cGUodHlwZSwgZXh0LCBGYWxzZSkKKyAgICAgICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgorICAgICAgICAgICAgc2VsZi5yZWFkKG5hbWUsIHN0cmljdCkKKworICAgIGRlZiBhZGRfdHlwZShzZWxmLCB0eXBlLCBleHQsIHN0cmljdD1UcnVlKToKKyAgICAgICAgIiIiQWRkIGEgbWFwcGluZyBiZXR3ZWVuIGEgdHlwZSBhbmQgYW4gZXh0ZW5zaW9uLgorCisgICAgICAgIFdoZW4gdGhlIGV4dGVuc2lvbiBpcyBhbHJlYWR5IGtub3duLCB0aGUgbmV3CisgICAgICAgIHR5cGUgd2lsbCByZXBsYWNlIHRoZSBvbGQgb25lLiBXaGVuIHRoZSB0eXBlCisgICAgICAgIGlzIGFscmVhZHkga25vd24gdGhlIGV4dGVuc2lvbiB3aWxsIGJlIGFkZGVkCisgICAgICAgIHRvIHRoZSBsaXN0IG9mIGtub3duIGV4dGVuc2lvbnMuCisKKyAgICAgICAgSWYgc3RyaWN0IGlzIHRydWUsIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8KKyAgICAgICAgbGlzdCBvZiBzdGFuZGFyZCB0eXBlcywgZWxzZSB0byB0aGUgbGlzdCBvZiBub24tc3RhbmRhcmQKKyAgICAgICAgdHlwZXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnR5cGVzX21hcFtzdHJpY3RdW2V4dF0gPSB0eXBlCisgICAgICAgIGV4dHMgPSBzZWxmLnR5cGVzX21hcF9pbnZbc3RyaWN0XS5zZXRkZWZhdWx0KHR5cGUsIFtdKQorICAgICAgICBpZiBleHQgbm90IGluIGV4dHM6CisgICAgICAgICAgICBleHRzLmFwcGVuZChleHQpCisKKyAgICBkZWYgZ3Vlc3NfdHlwZShzZWxmLCB1cmwsIHN0cmljdD1UcnVlKToKKyAgICAgICAgIiIiR3Vlc3MgdGhlIHR5cGUgb2YgYSBmaWxlIGJhc2VkIG9uIGl0cyBVUkwuCisKKyAgICAgICAgUmV0dXJuIHZhbHVlIGlzIGEgdHVwbGUgKHR5cGUsIGVuY29kaW5nKSB3aGVyZSB0eXBlIGlzIE5vbmUgaWYKKyAgICAgICAgdGhlIHR5cGUgY2FuJ3QgYmUgZ3Vlc3NlZCAobm8gb3IgdW5rbm93biBzdWZmaXgpIG9yIGEgc3RyaW5nCisgICAgICAgIG9mIHRoZSBmb3JtIHR5cGUvc3VidHlwZSwgdXNhYmxlIGZvciBhIE1JTUUgQ29udGVudC10eXBlCisgICAgICAgIGhlYWRlcjsgYW5kIGVuY29kaW5nIGlzIE5vbmUgZm9yIG5vIGVuY29kaW5nIG9yIHRoZSBuYW1lIG9mCisgICAgICAgIHRoZSBwcm9ncmFtIHVzZWQgdG8gZW5jb2RlIChlLmcuIGNvbXByZXNzIG9yIGd6aXApLiAgVGhlCisgICAgICAgIG1hcHBpbmdzIGFyZSB0YWJsZSBkcml2ZW4uICBFbmNvZGluZyBzdWZmaXhlcyBhcmUgY2FzZQorICAgICAgICBzZW5zaXRpdmU7IHR5cGUgc3VmZml4ZXMgYXJlIGZpcnN0IHRyaWVkIGNhc2Ugc2Vuc2l0aXZlLCB0aGVuCisgICAgICAgIGNhc2UgaW5zZW5zaXRpdmUuCisKKyAgICAgICAgVGhlIHN1ZmZpeGVzIC50Z3osIC50YXogYW5kIC50eiAoY2FzZSBzZW5zaXRpdmUhKSBhcmUgYWxsCisgICAgICAgIG1hcHBlZCB0byAnLnRhci5neicuICAoVGhpcyBpcyB0YWJsZS1kcml2ZW4gdG9vLCB1c2luZyB0aGUKKyAgICAgICAgZGljdGlvbmFyeSBzdWZmaXhfbWFwLikKKworICAgICAgICBPcHRpb25hbCBgc3RyaWN0JyBhcmd1bWVudCB3aGVuIEZhbHNlIGFkZHMgYSBidW5jaCBvZiBjb21tb25seSBmb3VuZCwKKyAgICAgICAgYnV0IG5vbi1zdGFuZGFyZCB0eXBlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNjaGVtZSwgdXJsID0gdXJsbGliLnNwbGl0dHlwZSh1cmwpCisgICAgICAgIGlmIHNjaGVtZSA9PSAnZGF0YSc6CisgICAgICAgICAgICAjIHN5bnRheCBvZiBkYXRhIFVSTHM6CisgICAgICAgICAgICAjIGRhdGF1cmwgICA6PSAiZGF0YToiIFsgbWVkaWF0eXBlIF0gWyAiO2Jhc2U2NCIgXSAiLCIgZGF0YQorICAgICAgICAgICAgIyBtZWRpYXR5cGUgOj0gWyB0eXBlICIvIiBzdWJ0eXBlIF0gKiggIjsiIHBhcmFtZXRlciApCisgICAgICAgICAgICAjIGRhdGEgICAgICA6PSAqdXJsY2hhcgorICAgICAgICAgICAgIyBwYXJhbWV0ZXIgOj0gYXR0cmlidXRlICI9IiB2YWx1ZQorICAgICAgICAgICAgIyB0eXBlL3N1YnR5cGUgZGVmYXVsdHMgdG8gInRleHQvcGxhaW4iCisgICAgICAgICAgICBjb21tYSA9IHVybC5maW5kKCcsJykKKyAgICAgICAgICAgIGlmIGNvbW1hIDwgMDoKKyAgICAgICAgICAgICAgICAjIGJhZCBkYXRhIFVSTAorICAgICAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgICAgICBzZW1pID0gdXJsLmZpbmQoJzsnLCAwLCBjb21tYSkKKyAgICAgICAgICAgIGlmIHNlbWkgPj0gMDoKKyAgICAgICAgICAgICAgICB0eXBlID0gdXJsWzpzZW1pXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0eXBlID0gdXJsWzpjb21tYV0KKyAgICAgICAgICAgIGlmICc9JyBpbiB0eXBlIG9yICcvJyBub3QgaW4gdHlwZToKKyAgICAgICAgICAgICAgICB0eXBlID0gJ3RleHQvcGxhaW4nCisgICAgICAgICAgICByZXR1cm4gdHlwZSwgTm9uZSAgICAgICAgICAgIyBuZXZlciBjb21wcmVzc2VkLCBzbyBlbmNvZGluZyBpcyBOb25lCisgICAgICAgIGJhc2UsIGV4dCA9IHBvc2l4cGF0aC5zcGxpdGV4dCh1cmwpCisgICAgICAgIHdoaWxlIGV4dCBpbiBzZWxmLnN1ZmZpeF9tYXA6CisgICAgICAgICAgICBiYXNlLCBleHQgPSBwb3NpeHBhdGguc3BsaXRleHQoYmFzZSArIHNlbGYuc3VmZml4X21hcFtleHRdKQorICAgICAgICBpZiBleHQgaW4gc2VsZi5lbmNvZGluZ3NfbWFwOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBzZWxmLmVuY29kaW5nc19tYXBbZXh0XQorICAgICAgICAgICAgYmFzZSwgZXh0ID0gcG9zaXhwYXRoLnNwbGl0ZXh0KGJhc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGluZyA9IE5vbmUKKyAgICAgICAgdHlwZXNfbWFwID0gc2VsZi50eXBlc19tYXBbVHJ1ZV0KKyAgICAgICAgaWYgZXh0IGluIHR5cGVzX21hcDoKKyAgICAgICAgICAgIHJldHVybiB0eXBlc19tYXBbZXh0XSwgZW5jb2RpbmcKKyAgICAgICAgZWxpZiBleHQubG93ZXIoKSBpbiB0eXBlc19tYXA6CisgICAgICAgICAgICByZXR1cm4gdHlwZXNfbWFwW2V4dC5sb3dlcigpXSwgZW5jb2RpbmcKKyAgICAgICAgZWxpZiBzdHJpY3Q6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgZW5jb2RpbmcKKyAgICAgICAgdHlwZXNfbWFwID0gc2VsZi50eXBlc19tYXBbRmFsc2VdCisgICAgICAgIGlmIGV4dCBpbiB0eXBlc19tYXA6CisgICAgICAgICAgICByZXR1cm4gdHlwZXNfbWFwW2V4dF0sIGVuY29kaW5nCisgICAgICAgIGVsaWYgZXh0Lmxvd2VyKCkgaW4gdHlwZXNfbWFwOgorICAgICAgICAgICAgcmV0dXJuIHR5cGVzX21hcFtleHQubG93ZXIoKV0sIGVuY29kaW5nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgZW5jb2RpbmcKKworICAgIGRlZiBndWVzc19hbGxfZXh0ZW5zaW9ucyhzZWxmLCB0eXBlLCBzdHJpY3Q9VHJ1ZSk6CisgICAgICAgICIiIkd1ZXNzIHRoZSBleHRlbnNpb25zIGZvciBhIGZpbGUgYmFzZWQgb24gaXRzIE1JTUUgdHlwZS4KKworICAgICAgICBSZXR1cm4gdmFsdWUgaXMgYSBsaXN0IG9mIHN0cmluZ3MgZ2l2aW5nIHRoZSBwb3NzaWJsZSBmaWxlbmFtZQorICAgICAgICBleHRlbnNpb25zLCBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgZG90ICgnLicpLiAgVGhlIGV4dGVuc2lvbiBpcyBub3QKKyAgICAgICAgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4gYXNzb2NpYXRlZCB3aXRoIGFueSBwYXJ0aWN1bGFyIGRhdGEgc3RyZWFtLAorICAgICAgICBidXQgd291bGQgYmUgbWFwcGVkIHRvIHRoZSBNSU1FIHR5cGUgYHR5cGUnIGJ5IGd1ZXNzX3R5cGUoKS4KKworICAgICAgICBPcHRpb25hbCBgc3RyaWN0JyBhcmd1bWVudCB3aGVuIGZhbHNlIGFkZHMgYSBidW5jaCBvZiBjb21tb25seSBmb3VuZCwKKyAgICAgICAgYnV0IG5vbi1zdGFuZGFyZCB0eXBlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHR5cGUgPSB0eXBlLmxvd2VyKCkKKyAgICAgICAgZXh0ZW5zaW9ucyA9IHNlbGYudHlwZXNfbWFwX2ludltUcnVlXS5nZXQodHlwZSwgW10pCisgICAgICAgIGlmIG5vdCBzdHJpY3Q6CisgICAgICAgICAgICBmb3IgZXh0IGluIHNlbGYudHlwZXNfbWFwX2ludltGYWxzZV0uZ2V0KHR5cGUsIFtdKToKKyAgICAgICAgICAgICAgICBpZiBleHQgbm90IGluIGV4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMuYXBwZW5kKGV4dCkKKyAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMKKworICAgIGRlZiBndWVzc19leHRlbnNpb24oc2VsZiwgdHlwZSwgc3RyaWN0PVRydWUpOgorICAgICAgICAiIiJHdWVzcyB0aGUgZXh0ZW5zaW9uIGZvciBhIGZpbGUgYmFzZWQgb24gaXRzIE1JTUUgdHlwZS4KKworICAgICAgICBSZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgZ2l2aW5nIGEgZmlsZW5hbWUgZXh0ZW5zaW9uLAorICAgICAgICBpbmNsdWRpbmcgdGhlIGxlYWRpbmcgZG90ICgnLicpLiAgVGhlIGV4dGVuc2lvbiBpcyBub3QKKyAgICAgICAgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4gYXNzb2NpYXRlZCB3aXRoIGFueSBwYXJ0aWN1bGFyIGRhdGEKKyAgICAgICAgc3RyZWFtLCBidXQgd291bGQgYmUgbWFwcGVkIHRvIHRoZSBNSU1FIHR5cGUgYHR5cGUnIGJ5CisgICAgICAgIGd1ZXNzX3R5cGUoKS4gIElmIG5vIGV4dGVuc2lvbiBjYW4gYmUgZ3Vlc3NlZCBmb3IgYHR5cGUnLCBOb25lCisgICAgICAgIGlzIHJldHVybmVkLgorCisgICAgICAgIE9wdGlvbmFsIGBzdHJpY3QnIGFyZ3VtZW50IHdoZW4gZmFsc2UgYWRkcyBhIGJ1bmNoIG9mIGNvbW1vbmx5IGZvdW5kLAorICAgICAgICBidXQgbm9uLXN0YW5kYXJkIHR5cGVzLgorICAgICAgICAiIiIKKyAgICAgICAgZXh0ZW5zaW9ucyA9IHNlbGYuZ3Vlc3NfYWxsX2V4dGVuc2lvbnModHlwZSwgc3RyaWN0KQorICAgICAgICBpZiBub3QgZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBleHRlbnNpb25zWzBdCisKKyAgICBkZWYgcmVhZChzZWxmLCBmaWxlbmFtZSwgc3RyaWN0PVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVhZCBhIHNpbmdsZSBtaW1lLnR5cGVzLWZvcm1hdCBmaWxlLCBzcGVjaWZpZWQgYnkgcGF0aG5hbWUuCisKKyAgICAgICAgSWYgc3RyaWN0IGlzIHRydWUsIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8KKyAgICAgICAgbGlzdCBvZiBzdGFuZGFyZCB0eXBlcywgZWxzZSB0byB0aGUgbGlzdCBvZiBub24tc3RhbmRhcmQKKyAgICAgICAgdHlwZXMuCisgICAgICAgICIiIgorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5yZWFkZnAoZnAsIHN0cmljdCkKKworICAgIGRlZiByZWFkZnAoc2VsZiwgZnAsIHN0cmljdD1UcnVlKToKKyAgICAgICAgIiIiCisgICAgICAgIFJlYWQgYSBzaW5nbGUgbWltZS50eXBlcy1mb3JtYXQgZmlsZS4KKworICAgICAgICBJZiBzdHJpY3QgaXMgdHJ1ZSwgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB0bworICAgICAgICBsaXN0IG9mIHN0YW5kYXJkIHR5cGVzLCBlbHNlIHRvIHRoZSBsaXN0IG9mIG5vbi1zdGFuZGFyZAorICAgICAgICB0eXBlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4od29yZHMpKToKKyAgICAgICAgICAgICAgICBpZiB3b3Jkc1tpXVswXSA9PSAnIyc6CisgICAgICAgICAgICAgICAgICAgIGRlbCB3b3Jkc1tpOl0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIG5vdCB3b3JkczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHlwZSwgc3VmZml4ZXMgPSB3b3Jkc1swXSwgd29yZHNbMTpdCisgICAgICAgICAgICBmb3Igc3VmZiBpbiBzdWZmaXhlczoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZF90eXBlKHR5cGUsICcuJyArIHN1ZmYsIHN0cmljdCkKKworICAgIGRlZiByZWFkX3dpbmRvd3NfcmVnaXN0cnkoc2VsZiwgc3RyaWN0PVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgTG9hZCB0aGUgTUlNRSB0eXBlcyBkYXRhYmFzZSBmcm9tIFdpbmRvd3MgcmVnaXN0cnkuCisKKyAgICAgICAgSWYgc3RyaWN0IGlzIHRydWUsIGluZm9ybWF0aW9uIHdpbGwgYmUgYWRkZWQgdG8KKyAgICAgICAgbGlzdCBvZiBzdGFuZGFyZCB0eXBlcywgZWxzZSB0byB0aGUgbGlzdCBvZiBub24tc3RhbmRhcmQKKyAgICAgICAgdHlwZXMuCisgICAgICAgICIiIgorCisgICAgICAgICMgV2luZG93cyBvbmx5CisgICAgICAgIGlmIG5vdCBfd2lucmVnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZGVmIGVudW1fdHlwZXMobWltZWRiKToKKyAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY3R5cGUgPSBfd2lucmVnLkVudW1LZXkobWltZWRiLCBpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgY3R5cGUgPSBjdHlwZS5lbmNvZGUoZGVmYXVsdF9lbmNvZGluZykgIyBvbWl0IGluIDMueCEKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgY3R5cGUKKyAgICAgICAgICAgICAgICBpICs9IDEKKworICAgICAgICBkZWZhdWx0X2VuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIHdpdGggX3dpbnJlZy5PcGVuS2V5KF93aW5yZWcuSEtFWV9DTEFTU0VTX1JPT1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInTUlNRVxEYXRhYmFzZVxDb250ZW50IFR5cGUnKSBhcyBtaW1lZGI6CisgICAgICAgICAgICBmb3IgY3R5cGUgaW4gZW51bV90eXBlcyhtaW1lZGIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBfd2lucmVnLk9wZW5LZXkobWltZWRiLCBjdHlwZSkgYXMga2V5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3VmZml4LCBkYXRhdHlwZSA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4KGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXh0ZW5zaW9uJykKKyAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBkYXRhdHlwZSAhPSBfd2lucmVnLlJFR19TWjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IHN1ZmZpeC5lbmNvZGUoZGVmYXVsdF9lbmNvZGluZykgIyBvbWl0IGluIDMueCEKKyAgICAgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYuYWRkX3R5cGUoY3R5cGUsIHN1ZmZpeCwgc3RyaWN0KQorCisKK2RlZiBndWVzc190eXBlKHVybCwgc3RyaWN0PVRydWUpOgorICAgICIiIkd1ZXNzIHRoZSB0eXBlIG9mIGEgZmlsZSBiYXNlZCBvbiBpdHMgVVJMLgorCisgICAgUmV0dXJuIHZhbHVlIGlzIGEgdHVwbGUgKHR5cGUsIGVuY29kaW5nKSB3aGVyZSB0eXBlIGlzIE5vbmUgaWYgdGhlCisgICAgdHlwZSBjYW4ndCBiZSBndWVzc2VkIChubyBvciB1bmtub3duIHN1ZmZpeCkgb3IgYSBzdHJpbmcgb2YgdGhlCisgICAgZm9ybSB0eXBlL3N1YnR5cGUsIHVzYWJsZSBmb3IgYSBNSU1FIENvbnRlbnQtdHlwZSBoZWFkZXI7IGFuZAorICAgIGVuY29kaW5nIGlzIE5vbmUgZm9yIG5vIGVuY29kaW5nIG9yIHRoZSBuYW1lIG9mIHRoZSBwcm9ncmFtIHVzZWQKKyAgICB0byBlbmNvZGUgKGUuZy4gY29tcHJlc3Mgb3IgZ3ppcCkuICBUaGUgbWFwcGluZ3MgYXJlIHRhYmxlCisgICAgZHJpdmVuLiAgRW5jb2Rpbmcgc3VmZml4ZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlOyB0eXBlIHN1ZmZpeGVzIGFyZQorICAgIGZpcnN0IHRyaWVkIGNhc2Ugc2Vuc2l0aXZlLCB0aGVuIGNhc2UgaW5zZW5zaXRpdmUuCisKKyAgICBUaGUgc3VmZml4ZXMgLnRneiwgLnRheiBhbmQgLnR6IChjYXNlIHNlbnNpdGl2ZSEpIGFyZSBhbGwgbWFwcGVkCisgICAgdG8gIi50YXIuZ3oiLiAgKFRoaXMgaXMgdGFibGUtZHJpdmVuIHRvbywgdXNpbmcgdGhlIGRpY3Rpb25hcnkKKyAgICBzdWZmaXhfbWFwKS4KKworICAgIE9wdGlvbmFsIGBzdHJpY3QnIGFyZ3VtZW50IHdoZW4gZmFsc2UgYWRkcyBhIGJ1bmNoIG9mIGNvbW1vbmx5IGZvdW5kLCBidXQKKyAgICBub24tc3RhbmRhcmQgdHlwZXMuCisgICAgIiIiCisgICAgaWYgX2RiIGlzIE5vbmU6CisgICAgICAgIGluaXQoKQorICAgIHJldHVybiBfZGIuZ3Vlc3NfdHlwZSh1cmwsIHN0cmljdCkKKworCitkZWYgZ3Vlc3NfYWxsX2V4dGVuc2lvbnModHlwZSwgc3RyaWN0PVRydWUpOgorICAgICIiIkd1ZXNzIHRoZSBleHRlbnNpb25zIGZvciBhIGZpbGUgYmFzZWQgb24gaXRzIE1JTUUgdHlwZS4KKworICAgIFJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2Ygc3RyaW5ncyBnaXZpbmcgdGhlIHBvc3NpYmxlIGZpbGVuYW1lCisgICAgZXh0ZW5zaW9ucywgaW5jbHVkaW5nIHRoZSBsZWFkaW5nIGRvdCAoJy4nKS4gIFRoZSBleHRlbnNpb24gaXMgbm90CisgICAgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4gYXNzb2NpYXRlZCB3aXRoIGFueSBwYXJ0aWN1bGFyIGRhdGEKKyAgICBzdHJlYW0sIGJ1dCB3b3VsZCBiZSBtYXBwZWQgdG8gdGhlIE1JTUUgdHlwZSBgdHlwZScgYnkKKyAgICBndWVzc190eXBlKCkuICBJZiBubyBleHRlbnNpb24gY2FuIGJlIGd1ZXNzZWQgZm9yIGB0eXBlJywgTm9uZQorICAgIGlzIHJldHVybmVkLgorCisgICAgT3B0aW9uYWwgYHN0cmljdCcgYXJndW1lbnQgd2hlbiBmYWxzZSBhZGRzIGEgYnVuY2ggb2YgY29tbW9ubHkgZm91bmQsCisgICAgYnV0IG5vbi1zdGFuZGFyZCB0eXBlcy4KKyAgICAiIiIKKyAgICBpZiBfZGIgaXMgTm9uZToKKyAgICAgICAgaW5pdCgpCisgICAgcmV0dXJuIF9kYi5ndWVzc19hbGxfZXh0ZW5zaW9ucyh0eXBlLCBzdHJpY3QpCisKK2RlZiBndWVzc19leHRlbnNpb24odHlwZSwgc3RyaWN0PVRydWUpOgorICAgICIiIkd1ZXNzIHRoZSBleHRlbnNpb24gZm9yIGEgZmlsZSBiYXNlZCBvbiBpdHMgTUlNRSB0eXBlLgorCisgICAgUmV0dXJuIHZhbHVlIGlzIGEgc3RyaW5nIGdpdmluZyBhIGZpbGVuYW1lIGV4dGVuc2lvbiwgaW5jbHVkaW5nIHRoZQorICAgIGxlYWRpbmcgZG90ICgnLicpLiAgVGhlIGV4dGVuc2lvbiBpcyBub3QgZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4KKyAgICBhc3NvY2lhdGVkIHdpdGggYW55IHBhcnRpY3VsYXIgZGF0YSBzdHJlYW0sIGJ1dCB3b3VsZCBiZSBtYXBwZWQgdG8gdGhlCisgICAgTUlNRSB0eXBlIGB0eXBlJyBieSBndWVzc190eXBlKCkuICBJZiBubyBleHRlbnNpb24gY2FuIGJlIGd1ZXNzZWQgZm9yCisgICAgYHR5cGUnLCBOb25lIGlzIHJldHVybmVkLgorCisgICAgT3B0aW9uYWwgYHN0cmljdCcgYXJndW1lbnQgd2hlbiBmYWxzZSBhZGRzIGEgYnVuY2ggb2YgY29tbW9ubHkgZm91bmQsCisgICAgYnV0IG5vbi1zdGFuZGFyZCB0eXBlcy4KKyAgICAiIiIKKyAgICBpZiBfZGIgaXMgTm9uZToKKyAgICAgICAgaW5pdCgpCisgICAgcmV0dXJuIF9kYi5ndWVzc19leHRlbnNpb24odHlwZSwgc3RyaWN0KQorCitkZWYgYWRkX3R5cGUodHlwZSwgZXh0LCBzdHJpY3Q9VHJ1ZSk6CisgICAgIiIiQWRkIGEgbWFwcGluZyBiZXR3ZWVuIGEgdHlwZSBhbmQgYW4gZXh0ZW5zaW9uLgorCisgICAgV2hlbiB0aGUgZXh0ZW5zaW9uIGlzIGFscmVhZHkga25vd24sIHRoZSBuZXcKKyAgICB0eXBlIHdpbGwgcmVwbGFjZSB0aGUgb2xkIG9uZS4gV2hlbiB0aGUgdHlwZQorICAgIGlzIGFscmVhZHkga25vd24gdGhlIGV4dGVuc2lvbiB3aWxsIGJlIGFkZGVkCisgICAgdG8gdGhlIGxpc3Qgb2Yga25vd24gZXh0ZW5zaW9ucy4KKworICAgIElmIHN0cmljdCBpcyB0cnVlLCBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkZGVkIHRvCisgICAgbGlzdCBvZiBzdGFuZGFyZCB0eXBlcywgZWxzZSB0byB0aGUgbGlzdCBvZiBub24tc3RhbmRhcmQKKyAgICB0eXBlcy4KKyAgICAiIiIKKyAgICBpZiBfZGIgaXMgTm9uZToKKyAgICAgICAgaW5pdCgpCisgICAgcmV0dXJuIF9kYi5hZGRfdHlwZSh0eXBlLCBleHQsIHN0cmljdCkKKworCitkZWYgaW5pdChmaWxlcz1Ob25lKToKKyAgICBnbG9iYWwgc3VmZml4X21hcCwgdHlwZXNfbWFwLCBlbmNvZGluZ3NfbWFwLCBjb21tb25fdHlwZXMKKyAgICBnbG9iYWwgaW5pdGVkLCBfZGIKKyAgICBpbml0ZWQgPSBUcnVlICAgICMgc28gdGhhdCBNaW1lVHlwZXMuX19pbml0X18oKSBkb2Vzbid0IGNhbGwgdXMgYWdhaW4KKyAgICBkYiA9IE1pbWVUeXBlcygpCisgICAgaWYgZmlsZXMgaXMgTm9uZToKKyAgICAgICAgaWYgX3dpbnJlZzoKKyAgICAgICAgICAgIGRiLnJlYWRfd2luZG93c19yZWdpc3RyeSgpCisgICAgICAgIGZpbGVzID0ga25vd25maWxlcworICAgIGZvciBmaWxlIGluIGZpbGVzOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmaWxlKToKKyAgICAgICAgICAgIGRiLnJlYWQoZmlsZSkKKyAgICBlbmNvZGluZ3NfbWFwID0gZGIuZW5jb2RpbmdzX21hcAorICAgIHN1ZmZpeF9tYXAgPSBkYi5zdWZmaXhfbWFwCisgICAgdHlwZXNfbWFwID0gZGIudHlwZXNfbWFwW1RydWVdCisgICAgY29tbW9uX3R5cGVzID0gZGIudHlwZXNfbWFwW0ZhbHNlXQorICAgICMgTWFrZSB0aGUgREIgYSBnbG9iYWwgdmFyaWFibGUgbm93IHRoYXQgaXQgaXMgZnVsbHkgaW5pdGlhbGl6ZWQKKyAgICBfZGIgPSBkYgorCisKK2RlZiByZWFkX21pbWVfdHlwZXMoZmlsZSk6CisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihmaWxlKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGRiID0gTWltZVR5cGVzKCkKKyAgICBkYi5yZWFkZnAoZiwgVHJ1ZSkKKyAgICByZXR1cm4gZGIudHlwZXNfbWFwW1RydWVdCisKKworZGVmIF9kZWZhdWx0X21pbWVfdHlwZXMoKToKKyAgICBnbG9iYWwgc3VmZml4X21hcAorICAgIGdsb2JhbCBlbmNvZGluZ3NfbWFwCisgICAgZ2xvYmFsIHR5cGVzX21hcAorICAgIGdsb2JhbCBjb21tb25fdHlwZXMKKworICAgIHN1ZmZpeF9tYXAgPSB7CisgICAgICAgICcudGd6JzogJy50YXIuZ3onLAorICAgICAgICAnLnRheic6ICcudGFyLmd6JywKKyAgICAgICAgJy50eic6ICcudGFyLmd6JywKKyAgICAgICAgJy50YnoyJzogJy50YXIuYnoyJywKKyAgICAgICAgJy50eHonOiAnLnRhci54eicsCisgICAgICAgIH0KKworICAgIGVuY29kaW5nc19tYXAgPSB7CisgICAgICAgICcuZ3onOiAnZ3ppcCcsCisgICAgICAgICcuWic6ICdjb21wcmVzcycsCisgICAgICAgICcuYnoyJzogJ2J6aXAyJywKKyAgICAgICAgJy54eic6ICd4eicsCisgICAgICAgIH0KKworICAgICMgQmVmb3JlIGFkZGluZyBuZXcgdHlwZXMsIG1ha2Ugc3VyZSB0aGV5IGFyZSBlaXRoZXIgcmVnaXN0ZXJlZCB3aXRoIElBTkEsCisgICAgIyBhdCBodHRwOi8vd3d3LmlzaS5lZHUvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9tZWRpYS10eXBlcworICAgICMgb3IgZXh0ZW5zaW9ucywgaS5lLiB1c2luZyB0aGUgeC0gcHJlZml4CisKKyAgICAjIElmIHlvdSBhZGQgdG8gdGhlc2UsIHBsZWFzZSBrZWVwIHRoZW0gc29ydGVkIQorICAgIHR5cGVzX21hcCA9IHsKKyAgICAgICAgJy5hJyAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcuYWknICAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKKyAgICAgICAgJy5haWYnICAgIDogJ2F1ZGlvL3gtYWlmZicsCisgICAgICAgICcuYWlmYycgICA6ICdhdWRpby94LWFpZmYnLAorICAgICAgICAnLmFpZmYnICAgOiAnYXVkaW8veC1haWZmJywKKyAgICAgICAgJy5hdScgICAgIDogJ2F1ZGlvL2Jhc2ljJywKKyAgICAgICAgJy5hdmknICAgIDogJ3ZpZGVvL3gtbXN2aWRlbycsCisgICAgICAgICcuYmF0JyAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5iY3BpbycgIDogJ2FwcGxpY2F0aW9uL3gtYmNwaW8nLAorICAgICAgICAnLmJpbicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5ibXAnICAgIDogJ2ltYWdlL3gtbXMtYm1wJywKKyAgICAgICAgJy5jJyAgICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAjIER1cGxpY2F0ZXMgOigKKyAgICAgICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtY2RmJywKKyAgICAgICAgJy5jZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtbmV0Y2RmJywKKyAgICAgICAgJy5jcGlvJyAgIDogJ2FwcGxpY2F0aW9uL3gtY3BpbycsCisgICAgICAgICcuY3NoJyAgICA6ICdhcHBsaWNhdGlvbi94LWNzaCcsCisgICAgICAgICcuY3NzJyAgICA6ICd0ZXh0L2NzcycsCisgICAgICAgICcuZGxsJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLmRvYycgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKKyAgICAgICAgJy5kb3QnICAgIDogJ2FwcGxpY2F0aW9uL21zd29yZCcsCisgICAgICAgICcuZHZpJyAgICA6ICdhcHBsaWNhdGlvbi94LWR2aScsCisgICAgICAgICcuZW1sJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcuZXBzJyAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKKyAgICAgICAgJy5ldHgnICAgIDogJ3RleHQveC1zZXRleHQnLAorICAgICAgICAnLmV4ZScgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5naWYnICAgIDogJ2ltYWdlL2dpZicsCisgICAgICAgICcuZ3RhcicgICA6ICdhcHBsaWNhdGlvbi94LWd0YXInLAorICAgICAgICAnLmgnICAgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcuaGRmJyAgICA6ICdhcHBsaWNhdGlvbi94LWhkZicsCisgICAgICAgICcuaHRtJyAgICA6ICd0ZXh0L2h0bWwnLAorICAgICAgICAnLmh0bWwnICAgOiAndGV4dC9odG1sJywKKyAgICAgICAgJy5pY28nICAgIDogJ2ltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbicsCisgICAgICAgICcuaWVmJyAgICA6ICdpbWFnZS9pZWYnLAorICAgICAgICAnLmpwZScgICAgOiAnaW1hZ2UvanBlZycsCisgICAgICAgICcuanBlZycgICA6ICdpbWFnZS9qcGVnJywKKyAgICAgICAgJy5qcGcnICAgIDogJ2ltYWdlL2pwZWcnLAorICAgICAgICAnLmpzJyAgICAgOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsCisgICAgICAgICcua3NoJyAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5sYXRleCcgIDogJ2FwcGxpY2F0aW9uL3gtbGF0ZXgnLAorICAgICAgICAnLm0xdicgICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubWFuJyAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1hbicsCisgICAgICAgICcubWUnICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1lJywKKyAgICAgICAgJy5taHQnICAgIDogJ21lc3NhZ2UvcmZjODIyJywKKyAgICAgICAgJy5taHRtbCcgIDogJ21lc3NhZ2UvcmZjODIyJywKKyAgICAgICAgJy5taWYnICAgIDogJ2FwcGxpY2F0aW9uL3gtbWlmJywKKyAgICAgICAgJy5tb3YnICAgIDogJ3ZpZGVvL3F1aWNrdGltZScsCisgICAgICAgICcubW92aWUnICA6ICd2aWRlby94LXNnaS1tb3ZpZScsCisgICAgICAgICcubXAyJyAgICA6ICdhdWRpby9tcGVnJywKKyAgICAgICAgJy5tcDMnICAgIDogJ2F1ZGlvL21wZWcnLAorICAgICAgICAnLm1wNCcgICAgOiAndmlkZW8vbXA0JywKKyAgICAgICAgJy5tcGEnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1wZScgICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubXBlZycgICA6ICd2aWRlby9tcGVnJywKKyAgICAgICAgJy5tcGcnICAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1zJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZi1tcycsCisgICAgICAgICcubmMnICAgICA6ICdhcHBsaWNhdGlvbi94LW5ldGNkZicsCisgICAgICAgICcubndzJyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCisgICAgICAgICcubycgICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLm9iaicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5vZGEnICAgIDogJ2FwcGxpY2F0aW9uL29kYScsCisgICAgICAgICcucDEyJyAgICA6ICdhcHBsaWNhdGlvbi94LXBrY3MxMicsCisgICAgICAgICcucDdjJyAgICA6ICdhcHBsaWNhdGlvbi9wa2NzNy1taW1lJywKKyAgICAgICAgJy5wYm0nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtYml0bWFwJywKKyAgICAgICAgJy5wZGYnICAgIDogJ2FwcGxpY2F0aW9uL3BkZicsCisgICAgICAgICcucGZ4JyAgICA6ICdhcHBsaWNhdGlvbi94LXBrY3MxMicsCisgICAgICAgICcucGdtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWdyYXltYXAnLAorICAgICAgICAnLnBsJyAgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcucG5nJyAgICA6ICdpbWFnZS9wbmcnLAorICAgICAgICAnLnBubScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1hbnltYXAnLAorICAgICAgICAnLnBvdCcgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwYScgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwbScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1waXhtYXAnLAorICAgICAgICAnLnBwcycgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBwdCcgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAorICAgICAgICAnLnBzJyAgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCisgICAgICAgICcucHd6JyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCisgICAgICAgICcucHknICAgICA6ICd0ZXh0L3gtcHl0aG9uJywKKyAgICAgICAgJy5weWMnICAgIDogJ2FwcGxpY2F0aW9uL3gtcHl0aG9uLWNvZGUnLAorICAgICAgICAnLnB5bycgICAgOiAnYXBwbGljYXRpb24veC1weXRob24tY29kZScsCisgICAgICAgICcucXQnICAgICA6ICd2aWRlby9xdWlja3RpbWUnLAorICAgICAgICAnLnJhJyAgICAgOiAnYXVkaW8veC1wbi1yZWFsYXVkaW8nLAorICAgICAgICAnLnJhbScgICAgOiAnYXBwbGljYXRpb24veC1wbi1yZWFsYXVkaW8nLAorICAgICAgICAnLnJhcycgICAgOiAnaW1hZ2UveC1jbXUtcmFzdGVyJywKKyAgICAgICAgJy5yZGYnICAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcucmdiJyAgICA6ICdpbWFnZS94LXJnYicsCisgICAgICAgICcucm9mZicgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKKyAgICAgICAgJy5ydHgnICAgIDogJ3RleHQvcmljaHRleHQnLAorICAgICAgICAnLnNnbScgICAgOiAndGV4dC94LXNnbWwnLAorICAgICAgICAnLnNnbWwnICAgOiAndGV4dC94LXNnbWwnLAorICAgICAgICAnLnNoJyAgICAgOiAnYXBwbGljYXRpb24veC1zaCcsCisgICAgICAgICcuc2hhcicgICA6ICdhcHBsaWNhdGlvbi94LXNoYXInLAorICAgICAgICAnLnNuZCcgICAgOiAnYXVkaW8vYmFzaWMnLAorICAgICAgICAnLnNvJyAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5zcmMnICAgIDogJ2FwcGxpY2F0aW9uL3gtd2Fpcy1zb3VyY2UnLAorICAgICAgICAnLnN2NGNwaW8nOiAnYXBwbGljYXRpb24veC1zdjRjcGlvJywKKyAgICAgICAgJy5zdjRjcmMnIDogJ2FwcGxpY2F0aW9uL3gtc3Y0Y3JjJywKKyAgICAgICAgJy5zd2YnICAgIDogJ2FwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoJywKKyAgICAgICAgJy50JyAgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYnLAorICAgICAgICAnLnRhcicgICAgOiAnYXBwbGljYXRpb24veC10YXInLAorICAgICAgICAnLnRjbCcgICAgOiAnYXBwbGljYXRpb24veC10Y2wnLAorICAgICAgICAnLnRleCcgICAgOiAnYXBwbGljYXRpb24veC10ZXgnLAorICAgICAgICAnLnRleGknICAgOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKKyAgICAgICAgJy50ZXhpbmZvJzogJ2FwcGxpY2F0aW9uL3gtdGV4aW5mbycsCisgICAgICAgICcudGlmJyAgICA6ICdpbWFnZS90aWZmJywKKyAgICAgICAgJy50aWZmJyAgIDogJ2ltYWdlL3RpZmYnLAorICAgICAgICAnLnRyJyAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZicsCisgICAgICAgICcudHN2JyAgICA6ICd0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzJywKKyAgICAgICAgJy50eHQnICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLnVzdGFyJyAgOiAnYXBwbGljYXRpb24veC11c3RhcicsCisgICAgICAgICcudmNmJyAgICA6ICd0ZXh0L3gtdmNhcmQnLAorICAgICAgICAnLndhdicgICAgOiAnYXVkaW8veC13YXYnLAorICAgICAgICAnLndpeicgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKKyAgICAgICAgJy53c2RsJyAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcueGJtJyAgICA6ICdpbWFnZS94LXhiaXRtYXAnLAorICAgICAgICAnLnhsYicgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKKyAgICAgICAgIyBEdXBsaWNhdGVzIDooCisgICAgICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi9leGNlbCcsCisgICAgICAgICcueGxzJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLAorICAgICAgICAnLnhtbCcgICAgOiAndGV4dC94bWwnLAorICAgICAgICAnLnhwZGwnICAgOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAgICAgJy54cG0nICAgIDogJ2ltYWdlL3gteHBpeG1hcCcsCisgICAgICAgICcueHNsJyAgICA6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICAgICAnLnh3ZCcgICAgOiAnaW1hZ2UveC14d2luZG93ZHVtcCcsCisgICAgICAgICcuemlwJyAgICA6ICdhcHBsaWNhdGlvbi96aXAnLAorICAgICAgICB9CisKKyAgICAjIFRoZXNlIGFyZSBub24tc3RhbmRhcmQgdHlwZXMsIGNvbW1vbmx5IGZvdW5kIGluIHRoZSB3aWxkLiAgVGhleSB3aWxsCisgICAgIyBvbmx5IG1hdGNoIGlmIHN0cmljdD0wIGZsYWcgaXMgZ2l2ZW4gdG8gdGhlIEFQSSBtZXRob2RzLgorCisgICAgIyBQbGVhc2Ugc29ydCB0aGVzZSB0b28KKyAgICBjb21tb25fdHlwZXMgPSB7CisgICAgICAgICcuanBnJyA6ICdpbWFnZS9qcGcnLAorICAgICAgICAnLm1pZCcgOiAnYXVkaW8vbWlkaScsCisgICAgICAgICcubWlkaSc6ICdhdWRpby9taWRpJywKKyAgICAgICAgJy5wY3QnIDogJ2ltYWdlL3BpY3QnLAorICAgICAgICAnLnBpYycgOiAnaW1hZ2UvcGljdCcsCisgICAgICAgICcucGljdCc6ICdpbWFnZS9waWN0JywKKyAgICAgICAgJy5ydGYnIDogJ2FwcGxpY2F0aW9uL3J0ZicsCisgICAgICAgICcueHVsJyA6ICd0ZXh0L3h1bCcKKyAgICAgICAgfQorCisKK19kZWZhdWx0X21pbWVfdHlwZXMoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IGdldG9wdAorCisgICAgVVNBR0UgPSAiIiJcCitVc2FnZTogbWltZXR5cGVzLnB5IFtvcHRpb25zXSB0eXBlCisKK09wdGlvbnM6CisgICAgLS1oZWxwIC8gLWggICAgICAgLS0gcHJpbnQgdGhpcyBtZXNzYWdlIGFuZCBleGl0CisgICAgLS1sZW5pZW50IC8gLWwgICAgLS0gYWRkaXRpb25hbGx5IHNlYXJjaCBvZiBzb21lIGNvbW1vbiwgYnV0IG5vbi1zdGFuZGFyZAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzLgorICAgIC0tZXh0ZW5zaW9uIC8gLWUgIC0tIGd1ZXNzIGV4dGVuc2lvbiBpbnN0ZWFkIG9mIHR5cGUKKworTW9yZSB0aGFuIG9uZSB0eXBlIGFyZ3VtZW50IG1heSBiZSBnaXZlbi4KKyIiIgorCisgICAgZGVmIHVzYWdlKGNvZGUsIG1zZz0nJyk6CisgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgIGlmIG1zZzogcHJpbnQgbXNnCisgICAgICAgIHN5cy5leGl0KGNvZGUpCisKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2hsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnaGVscCcsICdsZW5pZW50JywgJ2V4dGVuc2lvbiddKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgdXNhZ2UoMSwgbXNnKQorCisgICAgc3RyaWN0ID0gMQorICAgIGV4dGVuc2lvbiA9IDAKKyAgICBmb3Igb3B0LCBhcmcgaW4gb3B0czoKKyAgICAgICAgaWYgb3B0IGluICgnLWgnLCAnLS1oZWxwJyk6CisgICAgICAgICAgICB1c2FnZSgwKQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1sJywgJy0tbGVuaWVudCcpOgorICAgICAgICAgICAgc3RyaWN0ID0gMAorICAgICAgICBlbGlmIG9wdCBpbiAoJy1lJywgJy0tZXh0ZW5zaW9uJyk6CisgICAgICAgICAgICBleHRlbnNpb24gPSAxCisgICAgZm9yIGd0eXBlIGluIGFyZ3M6CisgICAgICAgIGlmIGV4dGVuc2lvbjoKKyAgICAgICAgICAgIGd1ZXNzID0gZ3Vlc3NfZXh0ZW5zaW9uKGd0eXBlLCBzdHJpY3QpCisgICAgICAgICAgICBpZiBub3QgZ3Vlc3M6IHByaW50ICJJIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdHlwZSIsIGd0eXBlCisgICAgICAgICAgICBlbHNlOiBwcmludCBndWVzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ3Vlc3MsIGVuY29kaW5nID0gZ3Vlc3NfdHlwZShndHlwZSwgc3RyaWN0KQorICAgICAgICAgICAgaWYgbm90IGd1ZXNzOiBwcmludCAiSSBkb24ndCBrbm93IGFueXRoaW5nIGFib3V0IHR5cGUiLCBndHlwZQorICAgICAgICAgICAgZWxzZTogcHJpbnQgJ3R5cGU6JywgZ3Vlc3MsICdlbmNvZGluZzonLCBlbmNvZGluZwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjVmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21pbWV0eXBlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy9taW1ldHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjVmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L21pbWV0eXBlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9taW1pZnkucHkgYi9saWIvcHl0aG9uMi43L21pbWlmeS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYzE1OTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taW1pZnkucHkKQEAgLTAsMCArMSw0NjggQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiTWltaWZpY2F0aW9uIGFuZCB1bm1pbWlmaWNhdGlvbiBvZiBtYWlsIG1lc3NhZ2VzLgorCitEZWNvZGUgcXVvdGVkLXByaW50YWJsZSBwYXJ0cyBvZiBhIG1haWwgbWVzc2FnZSBvciBlbmNvZGUgdXNpbmcKK3F1b3RlZC1wcmludGFibGUuCisKK1VzYWdlOgorICAgICAgICBtaW1pZnkoaW5wdXQsIG91dHB1dCkKKyAgICAgICAgdW5taW1pZnkoaW5wdXQsIG91dHB1dCwgZGVjb2RlX2Jhc2U2NCA9IDApCit0byBlbmNvZGUgYW5kIGRlY29kZSByZXNwZWN0aXZlbHkuICBJbnB1dCBhbmQgb3V0cHV0IG1heSBiZSB0aGUgbmFtZQorb2YgYSBmaWxlIG9yIGFuIG9wZW4gZmlsZSBvYmplY3QuICBPbmx5IGEgcmVhZGxpbmUoKSBtZXRob2QgaXMgdXNlZAorb24gdGhlIGlucHV0IGZpbGUsIG9ubHkgYSB3cml0ZSgpIG1ldGhvZCBpcyB1c2VkIG9uIHRoZSBvdXRwdXQgZmlsZS4KK1doZW4gdXNpbmcgZmlsZSBuYW1lcywgdGhlIGlucHV0IGFuZCBvdXRwdXQgZmlsZSBuYW1lcyBtYXkgYmUgdGhlCitzYW1lLgorCitJbnRlcmFjdGl2ZSB1c2FnZToKKyAgICAgICAgbWltaWZ5LnB5IC1lIFtpbmZpbGUgW291dGZpbGVdXQorICAgICAgICBtaW1pZnkucHkgLWQgW2luZmlsZSBbb3V0ZmlsZV1dCit0byBlbmNvZGUgYW5kIGRlY29kZSByZXNwZWN0aXZlbHkuICBJbmZpbGUgZGVmYXVsdHMgdG8gc3RhbmRhcmQKK2lucHV0IGFuZCBvdXRmaWxlIHRvIHN0YW5kYXJkIG91dHB1dC4KKyIiIgorCisjIENvbmZpZ3VyZQorTUFYTEVOID0gMjAwICAgICMgaWYgbGluZXMgbG9uZ2VyIHRoYW4gdGhpcywgZW5jb2RlIGFzIHF1b3RlZC1wcmludGFibGUKK0NIQVJTRVQgPSAnSVNPLTg4NTktMScgICMgZGVmYXVsdCBjaGFyc2V0IGZvciBub24tVVMtQVNDSUkgbWFpbAorUVVPVEUgPSAnPiAnICAgICAgICAgICAgIyBzdHJpbmcgcmVwbGllcyBhcmUgcXVvdGVkIHdpdGgKKyMgRW5kIGNvbmZpZ3VyZQorCitpbXBvcnQgcmUKKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJuKCJ0aGUgbWltaWZ5IG1vZHVsZSBpcyBkZXByZWNhdGVkOyB1c2UgdGhlIGVtYWlsIHBhY2thZ2UgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorCitfX2FsbF9fID0gWyJtaW1pZnkiLCJ1bm1pbWlmeSIsIm1pbWVfZW5jb2RlX2hlYWRlciIsIm1pbWVfZGVjb2RlX2hlYWRlciJdCisKK3FwID0gcmUuY29tcGlsZSgnXmNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6XFxzKnF1b3RlZC1wcmludGFibGUnLCByZS5JKQorYmFzZTY0X3JlID0gcmUuY29tcGlsZSgnXmNvbnRlbnQtdHJhbnNmZXItZW5jb2Rpbmc6XFxzKmJhc2U2NCcsIHJlLkkpCittcCA9IHJlLmNvbXBpbGUoJ15jb250ZW50LXR5cGU6LiptdWx0aXBhcnQvLipib3VuZGFyeT0iPyhbXjsiXG5dKiknLCByZS5JfHJlLlMpCitjaHJzZXQgPSByZS5jb21waWxlKCdeKGNvbnRlbnQtdHlwZTouKmNoYXJzZXQ9IikodXMtYXNjaWl8aXNvLTg4NTktWzAtOV0rKSgiLiopJywgcmUuSXxyZS5TKQoraGUgPSByZS5jb21waWxlKCdeLSpcbicpCittaW1lX2NvZGUgPSByZS5jb21waWxlKCc9KFswLTlhLWZdWzAtOWEtZl0pJywgcmUuSSkKK21pbWVfaGVhZCA9IHJlLmNvbXBpbGUoJz1cXD9pc28tODg1OS0xXFw/cVxcPyhbXj8gXHRcbl0rKVxcPz0nLCByZS5JKQorcmVwbCA9IHJlLmNvbXBpbGUoJ15zdWJqZWN0OlxccytyZTogJywgcmUuSSkKKworY2xhc3MgRmlsZToKKyAgICAiIiJBIHNpbXBsZSBmYWtlIGZpbGUgb2JqZWN0IHRoYXQga25vd3MgYWJvdXQgbGltaXRlZCByZWFkLWFoZWFkIGFuZAorICAgIGJvdW5kYXJpZXMuICBUaGUgb25seSBzdXBwb3J0ZWQgbWV0aG9kIGlzIHJlYWRsaW5lKCkuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZSwgYm91bmRhcnkpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuYm91bmRhcnkgPSBib3VuZGFyeQorICAgICAgICBzZWxmLnBlZWsgPSBOb25lCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGVlayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICBsaW5lID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICByZXR1cm4gbGluZQorICAgICAgICBpZiBzZWxmLmJvdW5kYXJ5OgorICAgICAgICAgICAgaWYgbGluZSA9PSBzZWxmLmJvdW5kYXJ5ICsgJ1xuJzoKKyAgICAgICAgICAgICAgICBzZWxmLnBlZWsgPSBsaW5lCisgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgICAgICBpZiBsaW5lID09IHNlbGYuYm91bmRhcnkgKyAnLS1cbic6CisgICAgICAgICAgICAgICAgc2VsZi5wZWVrID0gbGluZQorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICByZXR1cm4gbGluZQorCitjbGFzcyBIZWFkZXJGaWxlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLnBlZWsgPSBOb25lCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGVlayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnBlZWsKKyAgICAgICAgICAgIHNlbGYucGVlayA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJldHVybiBsaW5lCisgICAgICAgIGlmIGhlLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHNlbGYucGVlayA9IHNlbGYuZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBsZW4oc2VsZi5wZWVrKSA9PSAwIG9yIFwKKyAgICAgICAgICAgICAgIChzZWxmLnBlZWtbMF0gIT0gJyAnIGFuZCBzZWxmLnBlZWtbMF0gIT0gJ1x0Jyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgc2VsZi5wZWVrCisgICAgICAgICAgICBzZWxmLnBlZWsgPSBOb25lCisKK2RlZiBtaW1lX2RlY29kZShsaW5lKToKKyAgICAiIiJEZWNvZGUgYSBzaW5nbGUgbGluZSBvZiBxdW90ZWQtcHJpbnRhYmxlIHRleHQgdG8gOGJpdC4iIiIKKyAgICBuZXdsaW5lID0gJycKKyAgICBwb3MgPSAwCisgICAgd2hpbGUgMToKKyAgICAgICAgcmVzID0gbWltZV9jb2RlLnNlYXJjaChsaW5lLCBwb3MpCisgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbmV3bGluZSA9IG5ld2xpbmUgKyBsaW5lW3BvczpyZXMuc3RhcnQoMCldICsgXAorICAgICAgICAgICAgICAgICAgY2hyKGludChyZXMuZ3JvdXAoMSksIDE2KSkKKyAgICAgICAgcG9zID0gcmVzLmVuZCgwKQorICAgIHJldHVybiBuZXdsaW5lICsgbGluZVtwb3M6XQorCitkZWYgbWltZV9kZWNvZGVfaGVhZGVyKGxpbmUpOgorICAgICIiIkRlY29kZSBhIGhlYWRlciBsaW5lIHRvIDhiaXQuIiIiCisgICAgbmV3bGluZSA9ICcnCisgICAgcG9zID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIHJlcyA9IG1pbWVfaGVhZC5zZWFyY2gobGluZSwgcG9zKQorICAgICAgICBpZiByZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG1hdGNoID0gcmVzLmdyb3VwKDEpCisgICAgICAgICMgY29udmVydCB1bmRlcnNjb3JlcyB0byBzcGFjZXMgKGJlZm9yZSA9WFggY29udmVyc2lvbiEpCisgICAgICAgIG1hdGNoID0gJyAnLmpvaW4obWF0Y2guc3BsaXQoJ18nKSkKKyAgICAgICAgbmV3bGluZSA9IG5ld2xpbmUgKyBsaW5lW3BvczpyZXMuc3RhcnQoMCldICsgbWltZV9kZWNvZGUobWF0Y2gpCisgICAgICAgIHBvcyA9IHJlcy5lbmQoMCkKKyAgICByZXR1cm4gbmV3bGluZSArIGxpbmVbcG9zOl0KKworZGVmIHVubWltaWZ5X3BhcnQoaWZpbGUsIG9maWxlLCBkZWNvZGVfYmFzZTY0ID0gMCk6CisgICAgIiIiQ29udmVydCBhIHF1b3RlZC1wcmludGFibGUgcGFydCBvZiBhIE1JTUUgbWFpbCBtZXNzYWdlIHRvIDhiaXQuIiIiCisgICAgbXVsdGlwYXJ0ID0gTm9uZQorICAgIHF1b3RlZF9wcmludGFibGUgPSAwCisgICAgaXNfYmFzZTY0ID0gMAorICAgIGlzX3JlcGwgPSAwCisgICAgaWYgaWZpbGUuYm91bmRhcnkgYW5kIGlmaWxlLmJvdW5kYXJ5WzoyXSA9PSBRVU9URToKKyAgICAgICAgcHJlZml4ID0gUVVPVEUKKyAgICBlbHNlOgorICAgICAgICBwcmVmaXggPSAnJworCisgICAgIyByZWFkIGhlYWRlcgorICAgIGhmaWxlID0gSGVhZGVyRmlsZShpZmlsZSkKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gaGZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBwcmVmaXggYW5kIGxpbmVbOmxlbihwcmVmaXgpXSA9PSBwcmVmaXg6CisgICAgICAgICAgICBsaW5lID0gbGluZVtsZW4ocHJlZml4KTpdCisgICAgICAgICAgICBwcmVmID0gcHJlZml4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmVmID0gJycKKyAgICAgICAgbGluZSA9IG1pbWVfZGVjb2RlX2hlYWRlcihsaW5lKQorICAgICAgICBpZiBxcC5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIHF1b3RlZF9wcmludGFibGUgPSAxCisgICAgICAgICAgICBjb250aW51ZSAgICAgICAgIyBza2lwIHRoaXMgaGVhZGVyCisgICAgICAgIGlmIGRlY29kZV9iYXNlNjQgYW5kIGJhc2U2NF9yZS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGlzX2Jhc2U2NCA9IDEKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIG9maWxlLndyaXRlKHByZWYgKyBsaW5lKQorICAgICAgICBpZiBub3QgcHJlZml4IGFuZCByZXBsLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgIyB3ZSdyZSBkZWFsaW5nIHdpdGggYSByZXBseSBtZXNzYWdlCisgICAgICAgICAgICBpc19yZXBsID0gMQorICAgICAgICBtcF9yZXMgPSBtcC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtcF9yZXM6CisgICAgICAgICAgICBtdWx0aXBhcnQgPSAnLS0nICsgbXBfcmVzLmdyb3VwKDEpCisgICAgICAgIGlmIGhlLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgYnJlYWsKKyAgICBpZiBpc19yZXBsIGFuZCAocXVvdGVkX3ByaW50YWJsZSBvciBtdWx0aXBhcnQpOgorICAgICAgICBpc19yZXBsID0gMAorCisgICAgIyByZWFkIGJvZHkKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gaWZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBsaW5lID0gcmUuc3ViKG1pbWVfaGVhZCwgJ1xcMScsIGxpbmUpCisgICAgICAgIGlmIHByZWZpeCBhbmQgbGluZVs6bGVuKHByZWZpeCldID09IHByZWZpeDoKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lW2xlbihwcmVmaXgpOl0KKyAgICAgICAgICAgIHByZWYgPSBwcmVmaXgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByZWYgPSAnJworIyMgICAgICAgICAgICAgIGlmIGlzX3JlcGwgYW5kIGxlbihsaW5lKSA+PSA0IGFuZCBsaW5lWzo0XSA9PSBRVU9URSsnLS0nIGFuZCBsaW5lWy0zOl0gIT0gJy0tXG4nOgorIyMgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwYXJ0ID0gbGluZVs6LTFdCisgICAgICAgIHdoaWxlIG11bHRpcGFydDoKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gbXVsdGlwYXJ0ICsgJy0tXG4nOgorICAgICAgICAgICAgICAgIG9maWxlLndyaXRlKHByZWYgKyBsaW5lKQorICAgICAgICAgICAgICAgIG11bHRpcGFydCA9IE5vbmUKKyAgICAgICAgICAgICAgICBsaW5lID0gTm9uZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lID09IG11bHRpcGFydCArICdcbic6CisgICAgICAgICAgICAgICAgb2ZpbGUud3JpdGUocHJlZiArIGxpbmUpCisgICAgICAgICAgICAgICAgbmlmaWxlID0gRmlsZShpZmlsZSwgbXVsdGlwYXJ0KQorICAgICAgICAgICAgICAgIHVubWltaWZ5X3BhcnQobmlmaWxlLCBvZmlsZSwgZGVjb2RlX2Jhc2U2NCkKKyAgICAgICAgICAgICAgICBsaW5lID0gbmlmaWxlLnBlZWsKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgIyBwcmVtYXR1cmUgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBub3QgYSBib3VuZGFyeSBiZXR3ZWVuIHBhcnRzCisgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBsaW5lIGFuZCBxdW90ZWRfcHJpbnRhYmxlOgorICAgICAgICAgICAgd2hpbGUgbGluZVstMjpdID09ICc9XG4nOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMl0KKyAgICAgICAgICAgICAgICBuZXdsaW5lID0gaWZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5ld2xpbmVbOmxlbihRVU9URSldID09IFFVT1RFOgorICAgICAgICAgICAgICAgICAgICBuZXdsaW5lID0gbmV3bGluZVtsZW4oUVVPVEUpOl0KKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArIG5ld2xpbmUKKyAgICAgICAgICAgIGxpbmUgPSBtaW1lX2RlY29kZShsaW5lKQorICAgICAgICBpZiBsaW5lIGFuZCBpc19iYXNlNjQgYW5kIG5vdCBwcmVmOgorICAgICAgICAgICAgaW1wb3J0IGJhc2U2NAorICAgICAgICAgICAgbGluZSA9IGJhc2U2NC5kZWNvZGVzdHJpbmcobGluZSkKKyAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgIG9maWxlLndyaXRlKHByZWYgKyBsaW5lKQorCitkZWYgdW5taW1pZnkoaW5maWxlLCBvdXRmaWxlLCBkZWNvZGVfYmFzZTY0ID0gMCk6CisgICAgIiIiQ29udmVydCBxdW90ZWQtcHJpbnRhYmxlIHBhcnRzIG9mIGEgTUlNRSBtYWlsIG1lc3NhZ2UgdG8gOGJpdC4iIiIKKyAgICBpZiB0eXBlKGluZmlsZSkgPT0gdHlwZSgnJyk6CisgICAgICAgIGlmaWxlID0gb3BlbihpbmZpbGUpCisgICAgICAgIGlmIHR5cGUob3V0ZmlsZSkgPT0gdHlwZSgnJykgYW5kIGluZmlsZSA9PSBvdXRmaWxlOgorICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICBkLCBmID0gb3MucGF0aC5zcGxpdChpbmZpbGUpCisgICAgICAgICAgICBvcy5yZW5hbWUoaW5maWxlLCBvcy5wYXRoLmpvaW4oZCwgJywnICsgZikpCisgICAgZWxzZToKKyAgICAgICAgaWZpbGUgPSBpbmZpbGUKKyAgICBpZiB0eXBlKG91dGZpbGUpID09IHR5cGUoJycpOgorICAgICAgICBvZmlsZSA9IG9wZW4ob3V0ZmlsZSwgJ3cnKQorICAgIGVsc2U6CisgICAgICAgIG9maWxlID0gb3V0ZmlsZQorICAgIG5pZmlsZSA9IEZpbGUoaWZpbGUsIE5vbmUpCisgICAgdW5taW1pZnlfcGFydChuaWZpbGUsIG9maWxlLCBkZWNvZGVfYmFzZTY0KQorICAgIG9maWxlLmZsdXNoKCkKKworbWltZV9jaGFyID0gcmUuY29tcGlsZSgnWz1cMTc3LVwzNzddJykgIyBxdW90ZSB0aGVzZSBjaGFycyBpbiBib2R5CittaW1lX2hlYWRlcl9jaGFyID0gcmUuY29tcGlsZSgnWz0/XDE3Ny1cMzc3XScpICMgcXVvdGUgdGhlc2UgaW4gaGVhZGVyCisKK2RlZiBtaW1lX2VuY29kZShsaW5lLCBoZWFkZXIpOgorICAgICIiIkNvZGUgYSBzaW5nbGUgbGluZSBhcyBxdW90ZWQtcHJpbnRhYmxlLgorICAgIElmIGhlYWRlciBpcyBzZXQsIHF1b3RlIHNvbWUgZXh0cmEgY2hhcmFjdGVycy4iIiIKKyAgICBpZiBoZWFkZXI6CisgICAgICAgIHJlZyA9IG1pbWVfaGVhZGVyX2NoYXIKKyAgICBlbHNlOgorICAgICAgICByZWcgPSBtaW1lX2NoYXIKKyAgICBuZXdsaW5lID0gJycKKyAgICBwb3MgPSAwCisgICAgaWYgbGVuKGxpbmUpID49IDUgYW5kIGxpbmVbOjVdID09ICdGcm9tICc6CisgICAgICAgICMgcXVvdGUgJ0Zyb20gJyBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lIGZvciBzdHVwaWQgbWFpbGVycworICAgICAgICBuZXdsaW5lID0gKCc9JTAyeCcgJSBvcmQoJ0YnKSkudXBwZXIoKQorICAgICAgICBwb3MgPSAxCisgICAgd2hpbGUgMToKKyAgICAgICAgcmVzID0gcmVnLnNlYXJjaChsaW5lLCBwb3MpCisgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbmV3bGluZSA9IG5ld2xpbmUgKyBsaW5lW3BvczpyZXMuc3RhcnQoMCldICsgXAorICAgICAgICAgICAgICAgICAgKCc9JTAyeCcgJSBvcmQocmVzLmdyb3VwKDApKSkudXBwZXIoKQorICAgICAgICBwb3MgPSByZXMuZW5kKDApCisgICAgbGluZSA9IG5ld2xpbmUgKyBsaW5lW3BvczpdCisKKyAgICBuZXdsaW5lID0gJycKKyAgICB3aGlsZSBsZW4obGluZSkgPj0gNzU6CisgICAgICAgIGkgPSA3MworICAgICAgICB3aGlsZSBsaW5lW2ldID09ICc9JyBvciBsaW5lW2ktMV0gPT0gJz0nOgorICAgICAgICAgICAgaSA9IGkgLSAxCisgICAgICAgIGkgPSBpICsgMQorICAgICAgICBuZXdsaW5lID0gbmV3bGluZSArIGxpbmVbOmldICsgJz1cbicKKyAgICAgICAgbGluZSA9IGxpbmVbaTpdCisgICAgcmV0dXJuIG5ld2xpbmUgKyBsaW5lCisKK21pbWVfaGVhZGVyID0gcmUuY29tcGlsZSgnKFsgXHQoXXxeKShbLWEtekEtWjAtOV8rXSpbXDE3Ny1cMzc3XVstYS16QS1aMC05XytcMTc3LVwzNzddKikoPz1bIFx0KV18XG4pJykKKworZGVmIG1pbWVfZW5jb2RlX2hlYWRlcihsaW5lKToKKyAgICAiIiJDb2RlIGEgc2luZ2xlIGhlYWRlciBsaW5lIGFzIHF1b3RlZC1wcmludGFibGUuIiIiCisgICAgbmV3bGluZSA9ICcnCisgICAgcG9zID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIHJlcyA9IG1pbWVfaGVhZGVyLnNlYXJjaChsaW5lLCBwb3MpCisgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbmV3bGluZSA9ICclcyVzJXM9PyVzP1E/JXM/PScgJSBcCisgICAgICAgICAgICAgICAgICAobmV3bGluZSwgbGluZVtwb3M6cmVzLnN0YXJ0KDApXSwgcmVzLmdyb3VwKDEpLAorICAgICAgICAgICAgICAgICAgIENIQVJTRVQsIG1pbWVfZW5jb2RlKHJlcy5ncm91cCgyKSwgMSkpCisgICAgICAgIHBvcyA9IHJlcy5lbmQoMCkKKyAgICByZXR1cm4gbmV3bGluZSArIGxpbmVbcG9zOl0KKworbXYgPSByZS5jb21waWxlKCdebWltZS12ZXJzaW9uOicsIHJlLkkpCitjdGUgPSByZS5jb21waWxlKCdeY29udGVudC10cmFuc2Zlci1lbmNvZGluZzonLCByZS5JKQoraXNvX2NoYXIgPSByZS5jb21waWxlKCdbXDE3Ny1cMzc3XScpCisKK2RlZiBtaW1pZnlfcGFydChpZmlsZSwgb2ZpbGUsIGlzX21pbWUpOgorICAgICIiIkNvbnZlcnQgYW4gOGJpdCBwYXJ0IG9mIGEgTUlNRSBtYWlsIG1lc3NhZ2UgdG8gcXVvdGVkLXByaW50YWJsZS4iIiIKKyAgICBoYXNfY3RlID0gaXNfcXAgPSBpc19iYXNlNjQgPSAwCisgICAgbXVsdGlwYXJ0ID0gTm9uZQorICAgIG11c3RfcXVvdGVfYm9keSA9IG11c3RfcXVvdGVfaGVhZGVyID0gaGFzX2lzb19jaGFycyA9IDAKKworICAgIGhlYWRlciA9IFtdCisgICAgaGVhZGVyX2VuZCA9ICcnCisgICAgbWVzc2FnZSA9IFtdCisgICAgbWVzc2FnZV9lbmQgPSAnJworICAgICMgcmVhZCBoZWFkZXIKKyAgICBoZmlsZSA9IEhlYWRlckZpbGUoaWZpbGUpCisgICAgd2hpbGUgMToKKyAgICAgICAgbGluZSA9IGhmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBub3QgbXVzdF9xdW90ZV9oZWFkZXIgYW5kIGlzb19jaGFyLnNlYXJjaChsaW5lKToKKyAgICAgICAgICAgIG11c3RfcXVvdGVfaGVhZGVyID0gMQorICAgICAgICBpZiBtdi5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGlzX21pbWUgPSAxCisgICAgICAgIGlmIGN0ZS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGhhc19jdGUgPSAxCisgICAgICAgICAgICBpZiBxcC5tYXRjaChsaW5lKToKKyAgICAgICAgICAgICAgICBpc19xcCA9IDEKKyAgICAgICAgICAgIGVsaWYgYmFzZTY0X3JlLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIGlzX2Jhc2U2NCA9IDEKKyAgICAgICAgbXBfcmVzID0gbXAubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbXBfcmVzOgorICAgICAgICAgICAgbXVsdGlwYXJ0ID0gJy0tJyArIG1wX3Jlcy5ncm91cCgxKQorICAgICAgICBpZiBoZS5tYXRjaChsaW5lKToKKyAgICAgICAgICAgIGhlYWRlcl9lbmQgPSBsaW5lCisgICAgICAgICAgICBicmVhaworICAgICAgICBoZWFkZXIuYXBwZW5kKGxpbmUpCisKKyAgICAjIHJlYWQgYm9keQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBpZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbXVsdGlwYXJ0OgorICAgICAgICAgICAgaWYgbGluZSA9PSBtdWx0aXBhcnQgKyAnLS1cbic6CisgICAgICAgICAgICAgICAgbWVzc2FnZV9lbmQgPSBsaW5lCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gbXVsdGlwYXJ0ICsgJ1xuJzoKKyAgICAgICAgICAgICAgICBtZXNzYWdlX2VuZCA9IGxpbmUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBpc19iYXNlNjQ6CisgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgaXNfcXA6CisgICAgICAgICAgICB3aGlsZSBsaW5lWy0yOl0gPT0gJz1cbic6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0yXQorICAgICAgICAgICAgICAgIG5ld2xpbmUgPSBpZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbmV3bGluZVs6bGVuKFFVT1RFKV0gPT0gUVVPVEU6CisgICAgICAgICAgICAgICAgICAgIG5ld2xpbmUgPSBuZXdsaW5lW2xlbihRVU9URSk6XQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgbmV3bGluZQorICAgICAgICAgICAgbGluZSA9IG1pbWVfZGVjb2RlKGxpbmUpCisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGxpbmUpCisgICAgICAgIGlmIG5vdCBoYXNfaXNvX2NoYXJzOgorICAgICAgICAgICAgaWYgaXNvX2NoYXIuc2VhcmNoKGxpbmUpOgorICAgICAgICAgICAgICAgIGhhc19pc29fY2hhcnMgPSBtdXN0X3F1b3RlX2JvZHkgPSAxCisgICAgICAgIGlmIG5vdCBtdXN0X3F1b3RlX2JvZHk6CisgICAgICAgICAgICBpZiBsZW4obGluZSkgPiBNQVhMRU46CisgICAgICAgICAgICAgICAgbXVzdF9xdW90ZV9ib2R5ID0gMQorCisgICAgIyBjb252ZXJ0IGFuZCBvdXRwdXQgaGVhZGVyIGFuZCBib2R5CisgICAgZm9yIGxpbmUgaW4gaGVhZGVyOgorICAgICAgICBpZiBtdXN0X3F1b3RlX2hlYWRlcjoKKyAgICAgICAgICAgIGxpbmUgPSBtaW1lX2VuY29kZV9oZWFkZXIobGluZSkKKyAgICAgICAgY2hyc2V0X3JlcyA9IGNocnNldC5tYXRjaChsaW5lKQorICAgICAgICBpZiBjaHJzZXRfcmVzOgorICAgICAgICAgICAgaWYgaGFzX2lzb19jaGFyczoKKyAgICAgICAgICAgICAgICAjIGNoYW5nZSB1cy1hc2NpaSBpbnRvIGlzby04ODU5LTEKKyAgICAgICAgICAgICAgICBpZiBjaHJzZXRfcmVzLmdyb3VwKDIpLmxvd2VyKCkgPT0gJ3VzLWFzY2lpJzoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9ICclcyVzJXMnICUgKGNocnNldF9yZXMuZ3JvdXAoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFSU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyc2V0X3Jlcy5ncm91cCgzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBjaGFuZ2UgaXNvLTg4NTktKiBpbnRvIHVzLWFzY2lpCisgICAgICAgICAgICAgICAgbGluZSA9ICclc3VzLWFzY2lpJXMnICUgY2hyc2V0X3Jlcy5ncm91cCgxLCAzKQorICAgICAgICBpZiBoYXNfY3RlIGFuZCBjdGUubWF0Y2gobGluZSk6CisgICAgICAgICAgICBsaW5lID0gJ0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6ICcKKyAgICAgICAgICAgIGlmIGlzX2Jhc2U2NDoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZSArICdiYXNlNjRcbicKKyAgICAgICAgICAgIGVsaWYgbXVzdF9xdW90ZV9ib2R5OgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lICsgJ3F1b3RlZC1wcmludGFibGVcbicKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAnN2JpdFxuJworICAgICAgICBvZmlsZS53cml0ZShsaW5lKQorICAgIGlmIChtdXN0X3F1b3RlX2hlYWRlciBvciBtdXN0X3F1b3RlX2JvZHkpIGFuZCBub3QgaXNfbWltZToKKyAgICAgICAgb2ZpbGUud3JpdGUoJ01pbWUtVmVyc2lvbjogMS4wXG4nKQorICAgICAgICBvZmlsZS53cml0ZSgnQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyAnKQorICAgICAgICBpZiBoYXNfaXNvX2NoYXJzOgorICAgICAgICAgICAgb2ZpbGUud3JpdGUoJ2NoYXJzZXQ9IiVzIlxuJyAlIENIQVJTRVQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvZmlsZS53cml0ZSgnY2hhcnNldD0idXMtYXNjaWkiXG4nKQorICAgIGlmIG11c3RfcXVvdGVfYm9keSBhbmQgbm90IGhhc19jdGU6CisgICAgICAgIG9maWxlLndyaXRlKCdDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBxdW90ZWQtcHJpbnRhYmxlXG4nKQorICAgIG9maWxlLndyaXRlKGhlYWRlcl9lbmQpCisKKyAgICBmb3IgbGluZSBpbiBtZXNzYWdlOgorICAgICAgICBpZiBtdXN0X3F1b3RlX2JvZHk6CisgICAgICAgICAgICBsaW5lID0gbWltZV9lbmNvZGUobGluZSwgMCkKKyAgICAgICAgb2ZpbGUud3JpdGUobGluZSkKKyAgICBvZmlsZS53cml0ZShtZXNzYWdlX2VuZCkKKworICAgIGxpbmUgPSBtZXNzYWdlX2VuZAorICAgIHdoaWxlIG11bHRpcGFydDoKKyAgICAgICAgaWYgbGluZSA9PSBtdWx0aXBhcnQgKyAnLS1cbic6CisgICAgICAgICAgICAjIHJlYWQgYml0IGFmdGVyIHRoZSBlbmQgb2YgdGhlIGxhc3QgcGFydAorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gaWZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiBtdXN0X3F1b3RlX2JvZHk6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBtaW1lX2VuY29kZShsaW5lLCAwKQorICAgICAgICAgICAgICAgIG9maWxlLndyaXRlKGxpbmUpCisgICAgICAgIGlmIGxpbmUgPT0gbXVsdGlwYXJ0ICsgJ1xuJzoKKyAgICAgICAgICAgIG5pZmlsZSA9IEZpbGUoaWZpbGUsIG11bHRpcGFydCkKKyAgICAgICAgICAgIG1pbWlmeV9wYXJ0KG5pZmlsZSwgb2ZpbGUsIDEpCisgICAgICAgICAgICBsaW5lID0gbmlmaWxlLnBlZWsKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICMgcHJlbWF0dXJlIGVuZCBvZiBmaWxlCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG9maWxlLndyaXRlKGxpbmUpCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAjIHVuZXhwZWN0ZWRseSBubyBtdWx0aXBhcnQgc2VwYXJhdG9yLS1jb3B5IHJlc3Qgb2YgZmlsZQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGlmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgbXVzdF9xdW90ZV9ib2R5OgorICAgICAgICAgICAgICAgIGxpbmUgPSBtaW1lX2VuY29kZShsaW5lLCAwKQorICAgICAgICAgICAgb2ZpbGUud3JpdGUobGluZSkKKworZGVmIG1pbWlmeShpbmZpbGUsIG91dGZpbGUpOgorICAgICIiIkNvbnZlcnQgOGJpdCBwYXJ0cyBvZiBhIE1JTUUgbWFpbCBtZXNzYWdlIHRvIHF1b3RlZC1wcmludGFibGUuIiIiCisgICAgaWYgdHlwZShpbmZpbGUpID09IHR5cGUoJycpOgorICAgICAgICBpZmlsZSA9IG9wZW4oaW5maWxlKQorICAgICAgICBpZiB0eXBlKG91dGZpbGUpID09IHR5cGUoJycpIGFuZCBpbmZpbGUgPT0gb3V0ZmlsZToKKyAgICAgICAgICAgIGltcG9ydCBvcworICAgICAgICAgICAgZCwgZiA9IG9zLnBhdGguc3BsaXQoaW5maWxlKQorICAgICAgICAgICAgb3MucmVuYW1lKGluZmlsZSwgb3MucGF0aC5qb2luKGQsICcsJyArIGYpKQorICAgIGVsc2U6CisgICAgICAgIGlmaWxlID0gaW5maWxlCisgICAgaWYgdHlwZShvdXRmaWxlKSA9PSB0eXBlKCcnKToKKyAgICAgICAgb2ZpbGUgPSBvcGVuKG91dGZpbGUsICd3JykKKyAgICBlbHNlOgorICAgICAgICBvZmlsZSA9IG91dGZpbGUKKyAgICBuaWZpbGUgPSBGaWxlKGlmaWxlLCBOb25lKQorICAgIG1pbWlmeV9wYXJ0KG5pZmlsZSwgb2ZpbGUsIDApCisgICAgb2ZpbGUuZmx1c2goKQorCitpbXBvcnQgc3lzCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nIG9yIChsZW4oc3lzLmFyZ3YpID4gMCBhbmQgc3lzLmFyZ3ZbMF0gPT0gJ21pbWlmeScpOgorICAgIGltcG9ydCBnZXRvcHQKKyAgICB1c2FnZSA9ICdVc2FnZTogbWltaWZ5IFstbCBsZW5dIC1bZWRdIFtpbmZpbGUgW291dGZpbGVdXScKKworICAgIGRlY29kZV9iYXNlNjQgPSAwCisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAnbDplZGInKQorICAgIGlmIGxlbihhcmdzKSBub3QgaW4gKDAsIDEsIDIpOgorICAgICAgICBwcmludCB1c2FnZQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGlmICgoJy1lJywgJycpIGluIG9wdHMpID09ICgoJy1kJywgJycpIGluIG9wdHMpIG9yIFwKKyAgICAgICAoKCgnLWInLCAnJykgaW4gb3B0cykgYW5kICgoJy1kJywgJycpIG5vdCBpbiBvcHRzKSk6CisgICAgICAgIHByaW50IHVzYWdlCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLWUnOgorICAgICAgICAgICAgZW5jb2RlID0gbWltaWZ5CisgICAgICAgIGVsaWYgbyA9PSAnLWQnOgorICAgICAgICAgICAgZW5jb2RlID0gdW5taW1pZnkKKyAgICAgICAgZWxpZiBvID09ICctbCc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgTUFYTEVOID0gaW50KGEpCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgICAgIHByaW50IHVzYWdlCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgZWxpZiBvID09ICctYic6CisgICAgICAgICAgICBkZWNvZGVfYmFzZTY0ID0gMQorICAgIGlmIGxlbihhcmdzKSA9PSAwOgorICAgICAgICBlbmNvZGVfYXJncyA9IChzeXMuc3RkaW4sIHN5cy5zdGRvdXQpCisgICAgZWxpZiBsZW4oYXJncykgPT0gMToKKyAgICAgICAgZW5jb2RlX2FyZ3MgPSAoYXJnc1swXSwgc3lzLnN0ZG91dCkKKyAgICBlbHNlOgorICAgICAgICBlbmNvZGVfYXJncyA9IChhcmdzWzBdLCBhcmdzWzFdKQorICAgIGlmIGRlY29kZV9iYXNlNjQ6CisgICAgICAgIGVuY29kZV9hcmdzID0gZW5jb2RlX2FyZ3MgKyAoZGVjb2RlX2Jhc2U2NCwpCisgICAgZW5jb2RlKCplbmNvZGVfYXJncykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWltaWZ5LnB5YyBiL2xpYi9weXRob24yLjcvbWltaWZ5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2MwNjllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taW1pZnkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbWltaWZ5LnB5byBiL2xpYi9weXRob24yLjcvbWltaWZ5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2MwNjllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9taW1pZnkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbW9kdWxlZmluZGVyLnB5IGIvbGliL3B5dGhvbjIuNy9tb2R1bGVmaW5kZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YyYmY4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbW9kdWxlZmluZGVyLnB5CkBAIC0wLDAgKzEsNjcxIEBACisiIiJGaW5kIG1vZHVsZXMgdXNlZCBieSBhIHNjcmlwdCwgdXNpbmcgaW50cm9zcGVjdGlvbi4iIiIKKyMgVGhpcyBtb2R1bGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjIsIHNlZSBQRVAgMjkxLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMKK2ltcG9ydCBkaXMKK2ltcG9ydCBpbXAKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHN0cnVjdAorCitpZiBoYXNhdHRyKHN5cy5fX3N0ZG91dF9fLCAibmV3bGluZXMiKToKKyAgICBSRUFEX01PREUgPSAiVSIgICMgdW5pdmVyc2FsIGxpbmUgZW5kaW5ncworZWxzZToKKyAgICAjIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggUHl0aG9uICA8IDIuMworICAgIFJFQURfTU9ERSA9ICJyIgorCitMT0FEX0NPTlNUID0gY2hyKGRpcy5vcG5hbWUuaW5kZXgoJ0xPQURfQ09OU1QnKSkKK0lNUE9SVF9OQU1FID0gY2hyKGRpcy5vcG5hbWUuaW5kZXgoJ0lNUE9SVF9OQU1FJykpCitTVE9SRV9OQU1FID0gY2hyKGRpcy5vcG5hbWUuaW5kZXgoJ1NUT1JFX05BTUUnKSkKK1NUT1JFX0dMT0JBTCA9IGNocihkaXMub3BuYW1lLmluZGV4KCdTVE9SRV9HTE9CQUwnKSkKK1NUT1JFX09QUyA9IFtTVE9SRV9OQU1FLCBTVE9SRV9HTE9CQUxdCitIQVZFX0FSR1VNRU5UID0gY2hyKGRpcy5IQVZFX0FSR1VNRU5UKQorCisjIE1vZHVsZWZpbmRlciBkb2VzIGEgZ29vZCBqb2IgYXQgc2ltdWxhdGluZyBQeXRob24ncywgYnV0IGl0IGNhbiBub3QKKyMgaGFuZGxlIF9fcGF0aF9fIG1vZGlmaWNhdGlvbnMgcGFja2FnZXMgbWFrZSBhdCBydW50aW1lLiAgVGhlcmVmb3JlIHRoZXJlCisjIGlzIGEgbWVjaGFuaXNtIHdoZXJlYnkgeW91IGNhbiByZWdpc3RlciBleHRyYSBwYXRocyBpbiB0aGlzIG1hcCBmb3IgYQorIyBwYWNrYWdlLCBhbmQgaXQgd2lsbCBiZSBob25vcmVkLgorCisjIE5vdGUgdGhpcyBpcyBhIG1hcHBpbmcgaXMgbGlzdHMgb2YgcGF0aHMuCitwYWNrYWdlUGF0aE1hcCA9IHt9CisKKyMgQSBQdWJsaWMgaW50ZXJmYWNlCitkZWYgQWRkUGFja2FnZVBhdGgocGFja2FnZW5hbWUsIHBhdGgpOgorICAgIHBhdGhzID0gcGFja2FnZVBhdGhNYXAuZ2V0KHBhY2thZ2VuYW1lLCBbXSkKKyAgICBwYXRocy5hcHBlbmQocGF0aCkKKyAgICBwYWNrYWdlUGF0aE1hcFtwYWNrYWdlbmFtZV0gPSBwYXRocworCityZXBsYWNlUGFja2FnZU1hcCA9IHt9CisKKyMgVGhpcyBSZXBsYWNlUGFja2FnZSBtZWNoYW5pc20gYWxsb3dzIG1vZHVsZWZpbmRlciB0byB3b3JrIGFyb3VuZCB0aGUKKyMgd2F5IHRoZSBfeG1scGx1cyBwYWNrYWdlIGluamVjdHMgaXRzZWxmIHVuZGVyIHRoZSBuYW1lICJ4bWwiIGludG8KKyMgc3lzLm1vZHVsZXMgYXQgcnVudGltZSBieSBjYWxsaW5nIFJlcGxhY2VQYWNrYWdlKCJfeG1scGx1cyIsICJ4bWwiKQorIyBiZWZvcmUgcnVubmluZyBNb2R1bGVGaW5kZXIuCisKK2RlZiBSZXBsYWNlUGFja2FnZShvbGRuYW1lLCBuZXduYW1lKToKKyAgICByZXBsYWNlUGFja2FnZU1hcFtvbGRuYW1lXSA9IG5ld25hbWUKKworCitjbGFzcyBNb2R1bGU6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZmlsZT1Ob25lLCBwYXRoPU5vbmUpOgorICAgICAgICBzZWxmLl9fbmFtZV9fID0gbmFtZQorICAgICAgICBzZWxmLl9fZmlsZV9fID0gZmlsZQorICAgICAgICBzZWxmLl9fcGF0aF9fID0gcGF0aAorICAgICAgICBzZWxmLl9fY29kZV9fID0gTm9uZQorICAgICAgICAjIFRoZSBzZXQgb2YgZ2xvYmFsIG5hbWVzIHRoYXQgYXJlIGFzc2lnbmVkIHRvIGluIHRoZSBtb2R1bGUuCisgICAgICAgICMgVGhpcyBpbmNsdWRlcyB0aG9zZSBuYW1lcyBpbXBvcnRlZCB0aHJvdWdoIHN0YXJpbXBvcnRzIG9mCisgICAgICAgICMgUHl0aG9uIG1vZHVsZXMuCisgICAgICAgIHNlbGYuZ2xvYmFsbmFtZXMgPSB7fQorICAgICAgICAjIFRoZSBzZXQgb2Ygc3RhcmltcG9ydHMgdGhpcyBtb2R1bGUgZGlkIHRoYXQgY291bGQgbm90IGJlCisgICAgICAgICMgcmVzb2x2ZWQsIGllLiBhIHN0YXJpbXBvcnQgZnJvbSBhIG5vbi1QeXRob24gbW9kdWxlLgorICAgICAgICBzZWxmLnN0YXJpbXBvcnRzID0ge30KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcyA9ICJNb2R1bGUoJXIiICUgKHNlbGYuX19uYW1lX18sKQorICAgICAgICBpZiBzZWxmLl9fZmlsZV9fIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcyA9IHMgKyAiLCAlciIgJSAoc2VsZi5fX2ZpbGVfXywpCisgICAgICAgIGlmIHNlbGYuX19wYXRoX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzID0gcyArICIsICVyIiAlIChzZWxmLl9fcGF0aF9fLCkKKyAgICAgICAgcyA9IHMgKyAiKSIKKyAgICAgICAgcmV0dXJuIHMKKworY2xhc3MgTW9kdWxlRmluZGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSwgZGVidWc9MCwgZXhjbHVkZXM9W10sIHJlcGxhY2VfcGF0aHM9W10pOgorICAgICAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm1vZHVsZXMgPSB7fQorICAgICAgICBzZWxmLmJhZG1vZHVsZXMgPSB7fQorICAgICAgICBzZWxmLmRlYnVnID0gZGVidWcKKyAgICAgICAgc2VsZi5pbmRlbnQgPSAwCisgICAgICAgIHNlbGYuZXhjbHVkZXMgPSBleGNsdWRlcworICAgICAgICBzZWxmLnJlcGxhY2VfcGF0aHMgPSByZXBsYWNlX3BhdGhzCisgICAgICAgIHNlbGYucHJvY2Vzc2VkX3BhdGhzID0gW10gICAjIFVzZWQgaW4gZGVidWdnaW5nIG9ubHkKKworICAgIGRlZiBtc2coc2VsZiwgbGV2ZWwsIHN0ciwgKmFyZ3MpOgorICAgICAgICBpZiBsZXZlbCA8PSBzZWxmLmRlYnVnOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5pbmRlbnQpOgorICAgICAgICAgICAgICAgIHByaW50ICIgICAiLAorICAgICAgICAgICAgcHJpbnQgc3RyLAorICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIHByaW50IHJlcHIoYXJnKSwKKyAgICAgICAgICAgIHByaW50CisKKyAgICBkZWYgbXNnaW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBsZXZlbCA9IGFyZ3NbMF0KKyAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnQgKyAxCisgICAgICAgICAgICBzZWxmLm1zZygqYXJncykKKworICAgIGRlZiBtc2dvdXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBsZXZlbCA9IGFyZ3NbMF0KKyAgICAgICAgaWYgbGV2ZWwgPD0gc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIHNlbGYuaW5kZW50ID0gc2VsZi5pbmRlbnQgLSAxCisgICAgICAgICAgICBzZWxmLm1zZygqYXJncykKKworICAgIGRlZiBydW5fc2NyaXB0KHNlbGYsIHBhdGhuYW1lKToKKyAgICAgICAgc2VsZi5tc2coMiwgInJ1bl9zY3JpcHQiLCBwYXRobmFtZSkKKyAgICAgICAgZnAgPSBvcGVuKHBhdGhuYW1lLCBSRUFEX01PREUpCisgICAgICAgIHN0dWZmID0gKCIiLCAiciIsIGltcC5QWV9TT1VSQ0UpCisgICAgICAgIHNlbGYubG9hZF9tb2R1bGUoJ19fbWFpbl9fJywgZnAsIHBhdGhuYW1lLCBzdHVmZikKKworICAgIGRlZiBsb2FkX2ZpbGUoc2VsZiwgcGF0aG5hbWUpOgorICAgICAgICBkaXIsIG5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGhuYW1lKQorICAgICAgICBuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGZwID0gb3BlbihwYXRobmFtZSwgUkVBRF9NT0RFKQorICAgICAgICBzdHVmZiA9IChleHQsICJyIiwgaW1wLlBZX1NPVVJDRSkKKyAgICAgICAgc2VsZi5sb2FkX21vZHVsZShuYW1lLCBmcCwgcGF0aG5hbWUsIHN0dWZmKQorCisgICAgZGVmIGltcG9ydF9ob29rKHNlbGYsIG5hbWUsIGNhbGxlcj1Ob25lLCBmcm9tbGlzdD1Ob25lLCBsZXZlbD0tMSk6CisgICAgICAgIHNlbGYubXNnKDMsICJpbXBvcnRfaG9vayIsIG5hbWUsIGNhbGxlciwgZnJvbWxpc3QsIGxldmVsKQorICAgICAgICBwYXJlbnQgPSBzZWxmLmRldGVybWluZV9wYXJlbnQoY2FsbGVyLCBsZXZlbD1sZXZlbCkKKyAgICAgICAgcSwgdGFpbCA9IHNlbGYuZmluZF9oZWFkX3BhY2thZ2UocGFyZW50LCBuYW1lKQorICAgICAgICBtID0gc2VsZi5sb2FkX3RhaWwocSwgdGFpbCkKKyAgICAgICAgaWYgbm90IGZyb21saXN0OgorICAgICAgICAgICAgcmV0dXJuIHEKKyAgICAgICAgaWYgbS5fX3BhdGhfXzoKKyAgICAgICAgICAgIHNlbGYuZW5zdXJlX2Zyb21saXN0KG0sIGZyb21saXN0KQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGRldGVybWluZV9wYXJlbnQoc2VsZiwgY2FsbGVyLCBsZXZlbD0tMSk6CisgICAgICAgIHNlbGYubXNnaW4oNCwgImRldGVybWluZV9wYXJlbnQiLCBjYWxsZXIsIGxldmVsKQorICAgICAgICBpZiBub3QgY2FsbGVyIG9yIGxldmVsID09IDA6CisgICAgICAgICAgICBzZWxmLm1zZ291dCg0LCAiZGV0ZXJtaW5lX3BhcmVudCAtPiBOb25lIikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHBuYW1lID0gY2FsbGVyLl9fbmFtZV9fCisgICAgICAgIGlmIGxldmVsID49IDE6ICMgcmVsYXRpdmUgaW1wb3J0CisgICAgICAgICAgICBpZiBjYWxsZXIuX19wYXRoX186CisgICAgICAgICAgICAgICAgbGV2ZWwgLT0gMQorICAgICAgICAgICAgaWYgbGV2ZWwgPT0gMDoKKyAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLm1vZHVsZXNbcG5hbWVdCisgICAgICAgICAgICAgICAgYXNzZXJ0IHBhcmVudCBpcyBjYWxsZXIKKyAgICAgICAgICAgICAgICBzZWxmLm1zZ291dCg0LCAiZGV0ZXJtaW5lX3BhcmVudCAtPiIsIHBhcmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50CisgICAgICAgICAgICBpZiBwbmFtZS5jb3VudCgiLiIpIDwgbGV2ZWw6CisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJyZWxhdGl2ZSBpbXBvcnRwYXRoIHRvbyBkZWVwIgorICAgICAgICAgICAgcG5hbWUgPSAiLiIuam9pbihwbmFtZS5zcGxpdCgiLiIpWzotbGV2ZWxdKQorICAgICAgICAgICAgcGFyZW50ID0gc2VsZi5tb2R1bGVzW3BuYW1lXQorICAgICAgICAgICAgc2VsZi5tc2dvdXQoNCwgImRldGVybWluZV9wYXJlbnQgLT4iLCBwYXJlbnQpCisgICAgICAgICAgICByZXR1cm4gcGFyZW50CisgICAgICAgIGlmIGNhbGxlci5fX3BhdGhfXzoKKyAgICAgICAgICAgIHBhcmVudCA9IHNlbGYubW9kdWxlc1twbmFtZV0KKyAgICAgICAgICAgIGFzc2VydCBjYWxsZXIgaXMgcGFyZW50CisgICAgICAgICAgICBzZWxmLm1zZ291dCg0LCAiZGV0ZXJtaW5lX3BhcmVudCAtPiIsIHBhcmVudCkKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQKKyAgICAgICAgaWYgJy4nIGluIHBuYW1lOgorICAgICAgICAgICAgaSA9IHBuYW1lLnJmaW5kKCcuJykKKyAgICAgICAgICAgIHBuYW1lID0gcG5hbWVbOmldCisgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLm1vZHVsZXNbcG5hbWVdCisgICAgICAgICAgICBhc3NlcnQgcGFyZW50Ll9fbmFtZV9fID09IHBuYW1lCisgICAgICAgICAgICBzZWxmLm1zZ291dCg0LCAiZGV0ZXJtaW5lX3BhcmVudCAtPiIsIHBhcmVudCkKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnQKKyAgICAgICAgc2VsZi5tc2dvdXQoNCwgImRldGVybWluZV9wYXJlbnQgLT4gTm9uZSIpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgZmluZF9oZWFkX3BhY2thZ2Uoc2VsZiwgcGFyZW50LCBuYW1lKToKKyAgICAgICAgc2VsZi5tc2dpbig0LCAiZmluZF9oZWFkX3BhY2thZ2UiLCBwYXJlbnQsIG5hbWUpCisgICAgICAgIGlmICcuJyBpbiBuYW1lOgorICAgICAgICAgICAgaSA9IG5hbWUuZmluZCgnLicpCisgICAgICAgICAgICBoZWFkID0gbmFtZVs6aV0KKyAgICAgICAgICAgIHRhaWwgPSBuYW1lW2krMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoZWFkID0gbmFtZQorICAgICAgICAgICAgdGFpbCA9ICIiCisgICAgICAgIGlmIHBhcmVudDoKKyAgICAgICAgICAgIHFuYW1lID0gIiVzLiVzIiAlIChwYXJlbnQuX19uYW1lX18sIGhlYWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxbmFtZSA9IGhlYWQKKyAgICAgICAgcSA9IHNlbGYuaW1wb3J0X21vZHVsZShoZWFkLCBxbmFtZSwgcGFyZW50KQorICAgICAgICBpZiBxOgorICAgICAgICAgICAgc2VsZi5tc2dvdXQoNCwgImZpbmRfaGVhZF9wYWNrYWdlIC0+IiwgKHEsIHRhaWwpKQorICAgICAgICAgICAgcmV0dXJuIHEsIHRhaWwKKyAgICAgICAgaWYgcGFyZW50OgorICAgICAgICAgICAgcW5hbWUgPSBoZWFkCisgICAgICAgICAgICBwYXJlbnQgPSBOb25lCisgICAgICAgICAgICBxID0gc2VsZi5pbXBvcnRfbW9kdWxlKGhlYWQsIHFuYW1lLCBwYXJlbnQpCisgICAgICAgICAgICBpZiBxOgorICAgICAgICAgICAgICAgIHNlbGYubXNnb3V0KDQsICJmaW5kX2hlYWRfcGFja2FnZSAtPiIsIChxLCB0YWlsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcSwgdGFpbAorICAgICAgICBzZWxmLm1zZ291dCg0LCAicmFpc2UgSW1wb3J0RXJyb3I6IE5vIG1vZHVsZSBuYW1lZCIsIHFuYW1lKQorICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIG1vZHVsZSBuYW1lZCAiICsgcW5hbWUKKworICAgIGRlZiBsb2FkX3RhaWwoc2VsZiwgcSwgdGFpbCk6CisgICAgICAgIHNlbGYubXNnaW4oNCwgImxvYWRfdGFpbCIsIHEsIHRhaWwpCisgICAgICAgIG0gPSBxCisgICAgICAgIHdoaWxlIHRhaWw6CisgICAgICAgICAgICBpID0gdGFpbC5maW5kKCcuJykKKyAgICAgICAgICAgIGlmIGkgPCAwOiBpID0gbGVuKHRhaWwpCisgICAgICAgICAgICBoZWFkLCB0YWlsID0gdGFpbFs6aV0sIHRhaWxbaSsxOl0KKyAgICAgICAgICAgIG1uYW1lID0gIiVzLiVzIiAlIChtLl9fbmFtZV9fLCBoZWFkKQorICAgICAgICAgICAgbSA9IHNlbGYuaW1wb3J0X21vZHVsZShoZWFkLCBtbmFtZSwgbSkKKyAgICAgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgICAgIHNlbGYubXNnb3V0KDQsICJyYWlzZSBJbXBvcnRFcnJvcjogTm8gbW9kdWxlIG5hbWVkIiwgbW5hbWUpCisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgIiArIG1uYW1lCisgICAgICAgIHNlbGYubXNnb3V0KDQsICJsb2FkX3RhaWwgLT4iLCBtKQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIGVuc3VyZV9mcm9tbGlzdChzZWxmLCBtLCBmcm9tbGlzdCwgcmVjdXJzaXZlPTApOgorICAgICAgICBzZWxmLm1zZyg0LCAiZW5zdXJlX2Zyb21saXN0IiwgbSwgZnJvbWxpc3QsIHJlY3Vyc2l2ZSkKKyAgICAgICAgZm9yIHN1YiBpbiBmcm9tbGlzdDoKKyAgICAgICAgICAgIGlmIHN1YiA9PSAiKiI6CisgICAgICAgICAgICAgICAgaWYgbm90IHJlY3Vyc2l2ZToKKyAgICAgICAgICAgICAgICAgICAgYWxsID0gc2VsZi5maW5kX2FsbF9zdWJtb2R1bGVzKG0pCisgICAgICAgICAgICAgICAgICAgIGlmIGFsbDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZW5zdXJlX2Zyb21saXN0KG0sIGFsbCwgMSkKKyAgICAgICAgICAgIGVsaWYgbm90IGhhc2F0dHIobSwgc3ViKToKKyAgICAgICAgICAgICAgICBzdWJuYW1lID0gIiVzLiVzIiAlIChtLl9fbmFtZV9fLCBzdWIpCisgICAgICAgICAgICAgICAgc3VibW9kID0gc2VsZi5pbXBvcnRfbW9kdWxlKHN1Yiwgc3VibmFtZSwgbSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3VibW9kOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIG1vZHVsZSBuYW1lZCAiICsgc3VibmFtZQorCisgICAgZGVmIGZpbmRfYWxsX3N1Ym1vZHVsZXMoc2VsZiwgbSk6CisgICAgICAgIGlmIG5vdCBtLl9fcGF0aF9fOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG1vZHVsZXMgPSB7fQorICAgICAgICAjICdzdWZmaXhlcycgdXNlZCB0byBiZSBhIGxpc3QgaGFyZGNvZGVkIHRvIFsiLnB5IiwgIi5weWMiLCAiLnB5byJdLgorICAgICAgICAjIEJ1dCB3ZSBtdXN0IGFsc28gY29sbGVjdCBQeXRob24gZXh0ZW5zaW9uIG1vZHVsZXMgLSBhbHRob3VnaAorICAgICAgICAjIHdlIGNhbm5vdCBzZXBhcmF0ZSBub3JtYWwgZGxscyBmcm9tIFB5dGhvbiBleHRlbnNpb25zLgorICAgICAgICBzdWZmaXhlcyA9IFtdCisgICAgICAgIGZvciB0cmlwbGUgaW4gaW1wLmdldF9zdWZmaXhlcygpOgorICAgICAgICAgICAgc3VmZml4ZXMuYXBwZW5kKHRyaXBsZVswXSkKKyAgICAgICAgZm9yIGRpciBpbiBtLl9fcGF0aF9fOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXIpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5tc2coMiwgImNhbid0IGxpc3QgZGlyZWN0b3J5IiwgZGlyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgICAgICBtb2QgPSBOb25lCisgICAgICAgICAgICAgICAgZm9yIHN1ZmYgaW4gc3VmZml4ZXM6CisgICAgICAgICAgICAgICAgICAgIG4gPSBsZW4oc3VmZikKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZVstbjpdID09IHN1ZmY6CisgICAgICAgICAgICAgICAgICAgICAgICBtb2QgPSBuYW1lWzotbl0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgbW9kIGFuZCBtb2QgIT0gIl9faW5pdF9fIjoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlc1ttb2RdID0gbW9kCisgICAgICAgIHJldHVybiBtb2R1bGVzLmtleXMoKQorCisgICAgZGVmIGltcG9ydF9tb2R1bGUoc2VsZiwgcGFydG5hbWUsIGZxbmFtZSwgcGFyZW50KToKKyAgICAgICAgc2VsZi5tc2dpbigzLCAiaW1wb3J0X21vZHVsZSIsIHBhcnRuYW1lLCBmcW5hbWUsIHBhcmVudCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbSA9IHNlbGYubW9kdWxlc1tmcW5hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubXNnb3V0KDMsICJpbXBvcnRfbW9kdWxlIC0+IiwgbSkKKyAgICAgICAgICAgIHJldHVybiBtCisgICAgICAgIGlmIGZxbmFtZSBpbiBzZWxmLmJhZG1vZHVsZXM6CisgICAgICAgICAgICBzZWxmLm1zZ291dCgzLCAiaW1wb3J0X21vZHVsZSAtPiBOb25lIikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHBhcmVudCBhbmQgcGFyZW50Ll9fcGF0aF9fIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLm1zZ291dCgzLCAiaW1wb3J0X21vZHVsZSAtPiBOb25lIikKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwLCBwYXRobmFtZSwgc3R1ZmYgPSBzZWxmLmZpbmRfbW9kdWxlKHBhcnRuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50IGFuZCBwYXJlbnQuX19wYXRoX18sIHBhcmVudCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgc2VsZi5tc2dvdXQoMywgImltcG9ydF9tb2R1bGUgLT4iLCBOb25lKQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbSA9IHNlbGYubG9hZF9tb2R1bGUoZnFuYW1lLCBmcCwgcGF0aG5hbWUsIHN0dWZmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgZnA6IGZwLmNsb3NlKCkKKyAgICAgICAgaWYgcGFyZW50OgorICAgICAgICAgICAgc2V0YXR0cihwYXJlbnQsIHBhcnRuYW1lLCBtKQorICAgICAgICBzZWxmLm1zZ291dCgzLCAiaW1wb3J0X21vZHVsZSAtPiIsIG0pCisgICAgICAgIHJldHVybiBtCisKKyAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnFuYW1lLCBmcCwgcGF0aG5hbWUsIGZpbGVfaW5mbyk6CisgICAgICAgIHN1ZmZpeCwgbW9kZSwgdHlwZSA9IGZpbGVfaW5mbworICAgICAgICBzZWxmLm1zZ2luKDIsICJsb2FkX21vZHVsZSIsIGZxbmFtZSwgZnAgYW5kICJmcCIsIHBhdGhuYW1lKQorICAgICAgICBpZiB0eXBlID09IGltcC5QS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgbSA9IHNlbGYubG9hZF9wYWNrYWdlKGZxbmFtZSwgcGF0aG5hbWUpCisgICAgICAgICAgICBzZWxmLm1zZ291dCgyLCAibG9hZF9tb2R1bGUgLT4iLCBtKQorICAgICAgICAgICAgcmV0dXJuIG0KKyAgICAgICAgaWYgdHlwZSA9PSBpbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgY28gPSBjb21waWxlKGZwLnJlYWQoKSsnXG4nLCBwYXRobmFtZSwgJ2V4ZWMnKQorICAgICAgICBlbGlmIHR5cGUgPT0gaW1wLlBZX0NPTVBJTEVEOgorICAgICAgICAgICAgaWYgZnAucmVhZCg0KSAhPSBpbXAuZ2V0X21hZ2ljKCk6CisgICAgICAgICAgICAgICAgc2VsZi5tc2dvdXQoMiwgInJhaXNlIEltcG9ydEVycm9yOiBCYWQgbWFnaWMgbnVtYmVyIiwgcGF0aG5hbWUpCisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJCYWQgbWFnaWMgbnVtYmVyIGluICVzIiAlIHBhdGhuYW1lCisgICAgICAgICAgICBmcC5yZWFkKDQpCisgICAgICAgICAgICBjbyA9IG1hcnNoYWwubG9hZChmcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvID0gTm9uZQorICAgICAgICBtID0gc2VsZi5hZGRfbW9kdWxlKGZxbmFtZSkKKyAgICAgICAgbS5fX2ZpbGVfXyA9IHBhdGhuYW1lCisgICAgICAgIGlmIGNvOgorICAgICAgICAgICAgaWYgc2VsZi5yZXBsYWNlX3BhdGhzOgorICAgICAgICAgICAgICAgIGNvID0gc2VsZi5yZXBsYWNlX3BhdGhzX2luX2NvZGUoY28pCisgICAgICAgICAgICBtLl9fY29kZV9fID0gY28KKyAgICAgICAgICAgIHNlbGYuc2Nhbl9jb2RlKGNvLCBtKQorICAgICAgICBzZWxmLm1zZ291dCgyLCAibG9hZF9tb2R1bGUgLT4iLCBtKQorICAgICAgICByZXR1cm4gbQorCisgICAgZGVmIF9hZGRfYmFkbW9kdWxlKHNlbGYsIG5hbWUsIGNhbGxlcik6CisgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuYmFkbW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYuYmFkbW9kdWxlc1tuYW1lXSA9IHt9CisgICAgICAgIGlmIGNhbGxlcjoKKyAgICAgICAgICAgIHNlbGYuYmFkbW9kdWxlc1tuYW1lXVtjYWxsZXIuX19uYW1lX19dID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5iYWRtb2R1bGVzW25hbWVdWyItIl0gPSAxCisKKyAgICBkZWYgX3NhZmVfaW1wb3J0X2hvb2soc2VsZiwgbmFtZSwgY2FsbGVyLCBmcm9tbGlzdCwgbGV2ZWw9LTEpOgorICAgICAgICAjIHdyYXBwZXIgZm9yIHNlbGYuaW1wb3J0X2hvb2soKSB0aGF0IHdvbid0IHJhaXNlIEltcG9ydEVycm9yCisgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5iYWRtb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5fYWRkX2JhZG1vZHVsZShuYW1lLCBjYWxsZXIpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5pbXBvcnRfaG9vayhuYW1lLCBjYWxsZXIsIGxldmVsPWxldmVsKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYubXNnKDIsICJJbXBvcnRFcnJvcjoiLCBzdHIobXNnKSkKKyAgICAgICAgICAgIHNlbGYuX2FkZF9iYWRtb2R1bGUobmFtZSwgY2FsbGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgZnJvbWxpc3Q6CisgICAgICAgICAgICAgICAgZm9yIHN1YiBpbiBmcm9tbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3ViIGluIHNlbGYuYmFkbW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2FkZF9iYWRtb2R1bGUoc3ViLCBjYWxsZXIpCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmltcG9ydF9ob29rKG5hbWUsIGNhbGxlciwgW3N1Yl0sIGxldmVsPWxldmVsKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXNnKDIsICJJbXBvcnRFcnJvcjoiLCBzdHIobXNnKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lID0gbmFtZSArICIuIiArIHN1YgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2JhZG1vZHVsZShmdWxsbmFtZSwgY2FsbGVyKQorCisgICAgZGVmIHNjYW5fb3Bjb2RlcyhzZWxmLCBjbywKKyAgICAgICAgICAgICAgICAgICAgIHVucGFjayA9IHN0cnVjdC51bnBhY2spOgorICAgICAgICAjIFNjYW4gdGhlIGNvZGUsIGFuZCB5aWVsZCAnaW50ZXJlc3RpbmcnIG9wY29kZSBjb21iaW5hdGlvbnMKKyAgICAgICAgIyBWZXJzaW9uIGZvciBQeXRob24gMi40IGFuZCBvbGRlcgorICAgICAgICBjb2RlID0gY28uY29fY29kZQorICAgICAgICBuYW1lcyA9IGNvLmNvX25hbWVzCisgICAgICAgIGNvbnN0cyA9IGNvLmNvX2NvbnN0cworICAgICAgICB3aGlsZSBjb2RlOgorICAgICAgICAgICAgYyA9IGNvZGVbMF0KKyAgICAgICAgICAgIGlmIGMgaW4gU1RPUkVfT1BTOgorICAgICAgICAgICAgICAgIG9wYXJnLCA9IHVucGFjaygnPEgnLCBjb2RlWzE6M10pCisgICAgICAgICAgICAgICAgeWllbGQgInN0b3JlIiwgKG5hbWVzW29wYXJnXSwpCisgICAgICAgICAgICAgICAgY29kZSA9IGNvZGVbMzpdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGMgPT0gTE9BRF9DT05TVCBhbmQgY29kZVszXSA9PSBJTVBPUlRfTkFNRToKKyAgICAgICAgICAgICAgICBvcGFyZ18xLCBvcGFyZ18yID0gdW5wYWNrKCc8eEh4SCcsIGNvZGVbOjZdKQorICAgICAgICAgICAgICAgIHlpZWxkICJpbXBvcnQiLCAoY29uc3RzW29wYXJnXzFdLCBuYW1lc1tvcGFyZ18yXSkKKyAgICAgICAgICAgICAgICBjb2RlID0gY29kZVs2Ol0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgYyA+PSBIQVZFX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlWzM6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb2RlID0gY29kZVsxOl0KKworICAgIGRlZiBzY2FuX29wY29kZXNfMjUoc2VsZiwgY28sCisgICAgICAgICAgICAgICAgICAgICB1bnBhY2sgPSBzdHJ1Y3QudW5wYWNrKToKKyAgICAgICAgIyBTY2FuIHRoZSBjb2RlLCBhbmQgeWllbGQgJ2ludGVyZXN0aW5nJyBvcGNvZGUgY29tYmluYXRpb25zCisgICAgICAgICMgUHl0aG9uIDIuNSB2ZXJzaW9uIChoYXMgYWJzb2x1dGUgYW5kIHJlbGF0aXZlIGltcG9ydHMpCisgICAgICAgIGNvZGUgPSBjby5jb19jb2RlCisgICAgICAgIG5hbWVzID0gY28uY29fbmFtZXMKKyAgICAgICAgY29uc3RzID0gY28uY29fY29uc3RzCisgICAgICAgIExPQURfTE9BRF9BTkRfSU1QT1JUID0gTE9BRF9DT05TVCArIExPQURfQ09OU1QgKyBJTVBPUlRfTkFNRQorICAgICAgICB3aGlsZSBjb2RlOgorICAgICAgICAgICAgYyA9IGNvZGVbMF0KKyAgICAgICAgICAgIGlmIGMgaW4gU1RPUkVfT1BTOgorICAgICAgICAgICAgICAgIG9wYXJnLCA9IHVucGFjaygnPEgnLCBjb2RlWzE6M10pCisgICAgICAgICAgICAgICAgeWllbGQgInN0b3JlIiwgKG5hbWVzW29wYXJnXSwpCisgICAgICAgICAgICAgICAgY29kZSA9IGNvZGVbMzpdCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGNvZGVbOjk6M10gPT0gTE9BRF9MT0FEX0FORF9JTVBPUlQ6CisgICAgICAgICAgICAgICAgb3BhcmdfMSwgb3BhcmdfMiwgb3BhcmdfMyA9IHVucGFjaygnPHhIeEh4SCcsIGNvZGVbOjldKQorICAgICAgICAgICAgICAgIGxldmVsID0gY29uc3RzW29wYXJnXzFdCisgICAgICAgICAgICAgICAgaWYgbGV2ZWwgPT0gLTE6ICMgbm9ybWFsIGltcG9ydAorICAgICAgICAgICAgICAgICAgICB5aWVsZCAiaW1wb3J0IiwgKGNvbnN0c1tvcGFyZ18yXSwgbmFtZXNbb3BhcmdfM10pCisgICAgICAgICAgICAgICAgZWxpZiBsZXZlbCA9PSAwOiAjIGFic29sdXRlIGltcG9ydAorICAgICAgICAgICAgICAgICAgICB5aWVsZCAiYWJzb2x1dGVfaW1wb3J0IiwgKGNvbnN0c1tvcGFyZ18yXSwgbmFtZXNbb3BhcmdfM10pCisgICAgICAgICAgICAgICAgZWxzZTogIyByZWxhdGl2ZSBpbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgInJlbGF0aXZlX2ltcG9ydCIsIChsZXZlbCwgY29uc3RzW29wYXJnXzJdLCBuYW1lc1tvcGFyZ18zXSkKKyAgICAgICAgICAgICAgICBjb2RlID0gY29kZVs5Ol0KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgYyA+PSBIQVZFX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlWzM6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb2RlID0gY29kZVsxOl0KKworICAgIGRlZiBzY2FuX2NvZGUoc2VsZiwgY28sIG0pOgorICAgICAgICBjb2RlID0gY28uY29fY29kZQorICAgICAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA1KToKKyAgICAgICAgICAgIHNjYW5uZXIgPSBzZWxmLnNjYW5fb3Bjb2Rlc18yNQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2Nhbm5lciA9IHNlbGYuc2Nhbl9vcGNvZGVzCisgICAgICAgIGZvciB3aGF0LCBhcmdzIGluIHNjYW5uZXIoY28pOgorICAgICAgICAgICAgaWYgd2hhdCA9PSAic3RvcmUiOgorICAgICAgICAgICAgICAgIG5hbWUsID0gYXJncworICAgICAgICAgICAgICAgIG0uZ2xvYmFsbmFtZXNbbmFtZV0gPSAxCisgICAgICAgICAgICBlbGlmIHdoYXQgaW4gKCJpbXBvcnQiLCAiYWJzb2x1dGVfaW1wb3J0Iik6CisgICAgICAgICAgICAgICAgZnJvbWxpc3QsIG5hbWUgPSBhcmdzCisgICAgICAgICAgICAgICAgaGF2ZV9zdGFyID0gMAorICAgICAgICAgICAgICAgIGlmIGZyb21saXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiAiKiIgaW4gZnJvbWxpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX3N0YXIgPSAxCisgICAgICAgICAgICAgICAgICAgIGZyb21saXN0ID0gW2YgZm9yIGYgaW4gZnJvbWxpc3QgaWYgZiAhPSAiKiJdCisgICAgICAgICAgICAgICAgaWYgd2hhdCA9PSAiYWJzb2x1dGVfaW1wb3J0IjogbGV2ZWwgPSAwCisgICAgICAgICAgICAgICAgZWxzZTogbGV2ZWwgPSAtMQorICAgICAgICAgICAgICAgIHNlbGYuX3NhZmVfaW1wb3J0X2hvb2sobmFtZSwgbSwgZnJvbWxpc3QsIGxldmVsPWxldmVsKQorICAgICAgICAgICAgICAgIGlmIGhhdmVfc3RhcjoKKyAgICAgICAgICAgICAgICAgICAgIyBXZSd2ZSBlbmNvdW50ZXJlZCBhbiAiaW1wb3J0ICoiLiBJZiBpdCBpcyBhIFB5dGhvbiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICMgdGhlIGNvZGUgaGFzIGFscmVhZHkgYmVlbiBwYXJzZWQgYW5kIHdlIGNhbiBzdWNrIG91dCB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBnbG9iYWwgbmFtZXMuCisgICAgICAgICAgICAgICAgICAgIG1tID0gTm9uZQorICAgICAgICAgICAgICAgICAgICBpZiBtLl9fcGF0aF9fOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBBdCB0aGlzIHBvaW50IHdlIGRvbid0IGtub3cgd2hldGhlciAnbmFtZScgaXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgIyBzdWJtb2R1bGUgb2YgJ20nIG9yIGEgZ2xvYmFsIG1vZHVsZS4gTGV0J3MganVzdCB0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIGZ1bGwgbmFtZSBmaXJzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1tID0gc2VsZi5tb2R1bGVzLmdldChtLl9fbmFtZV9fICsgIi4iICsgbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbW0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1tID0gc2VsZi5tb2R1bGVzLmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBtbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uZ2xvYmFsbmFtZXMudXBkYXRlKG1tLmdsb2JhbG5hbWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgbS5zdGFyaW1wb3J0cy51cGRhdGUobW0uc3RhcmltcG9ydHMpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBtbS5fX2NvZGVfXyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0uc3RhcmltcG9ydHNbbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBtLnN0YXJpbXBvcnRzW25hbWVdID0gMQorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICJyZWxhdGl2ZV9pbXBvcnQiOgorICAgICAgICAgICAgICAgIGxldmVsLCBmcm9tbGlzdCwgbmFtZSA9IGFyZ3MKKyAgICAgICAgICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zYWZlX2ltcG9ydF9ob29rKG5hbWUsIG0sIGZyb21saXN0LCBsZXZlbD1sZXZlbCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBzZWxmLmRldGVybWluZV9wYXJlbnQobSwgbGV2ZWw9bGV2ZWwpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NhZmVfaW1wb3J0X2hvb2socGFyZW50Ll9fbmFtZV9fLCBOb25lLCBmcm9tbGlzdCwgbGV2ZWw9MCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBXZSBkb24ndCBleHBlY3QgYW55dGhpbmcgZWxzZSBmcm9tIHRoZSBnZW5lcmF0b3IuCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKHdoYXQpCisKKyAgICAgICAgZm9yIGMgaW4gY28uY29fY29uc3RzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjLCB0eXBlKGNvKSk6CisgICAgICAgICAgICAgICAgc2VsZi5zY2FuX2NvZGUoYywgbSkKKworICAgIGRlZiBsb2FkX3BhY2thZ2Uoc2VsZiwgZnFuYW1lLCBwYXRobmFtZSk6CisgICAgICAgIHNlbGYubXNnaW4oMiwgImxvYWRfcGFja2FnZSIsIGZxbmFtZSwgcGF0aG5hbWUpCisgICAgICAgIG5ld25hbWUgPSByZXBsYWNlUGFja2FnZU1hcC5nZXQoZnFuYW1lKQorICAgICAgICBpZiBuZXduYW1lOgorICAgICAgICAgICAgZnFuYW1lID0gbmV3bmFtZQorICAgICAgICBtID0gc2VsZi5hZGRfbW9kdWxlKGZxbmFtZSkKKyAgICAgICAgbS5fX2ZpbGVfXyA9IHBhdGhuYW1lCisgICAgICAgIG0uX19wYXRoX18gPSBbcGF0aG5hbWVdCisKKyAgICAgICAgIyBBcyBwZXIgY29tbWVudCBhdCB0b3Agb2YgZmlsZSwgc2ltdWxhdGUgcnVudGltZSBfX3BhdGhfXyBhZGRpdGlvbnMuCisgICAgICAgIG0uX19wYXRoX18gPSBtLl9fcGF0aF9fICsgcGFja2FnZVBhdGhNYXAuZ2V0KGZxbmFtZSwgW10pCisKKyAgICAgICAgZnAsIGJ1Ziwgc3R1ZmYgPSBzZWxmLmZpbmRfbW9kdWxlKCJfX2luaXRfXyIsIG0uX19wYXRoX18pCisgICAgICAgIHNlbGYubG9hZF9tb2R1bGUoZnFuYW1lLCBmcCwgYnVmLCBzdHVmZikKKyAgICAgICAgc2VsZi5tc2dvdXQoMiwgImxvYWRfcGFja2FnZSAtPiIsIG0pCisgICAgICAgIHJldHVybiBtCisKKyAgICBkZWYgYWRkX21vZHVsZShzZWxmLCBmcW5hbWUpOgorICAgICAgICBpZiBmcW5hbWUgaW4gc2VsZi5tb2R1bGVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubW9kdWxlc1tmcW5hbWVdCisgICAgICAgIHNlbGYubW9kdWxlc1tmcW5hbWVdID0gbSA9IE1vZHVsZShmcW5hbWUpCisgICAgICAgIHJldHVybiBtCisKKyAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgbmFtZSwgcGF0aCwgcGFyZW50PU5vbmUpOgorICAgICAgICBpZiBwYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIGFzc2VydCBwYXRoIGlzIG5vdCBOb25lCisgICAgICAgICAgICBmdWxsbmFtZSA9IHBhcmVudC5fX25hbWVfXysnLicrbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBuYW1lCisgICAgICAgIGlmIGZ1bGxuYW1lIGluIHNlbGYuZXhjbHVkZXM6CisgICAgICAgICAgICBzZWxmLm1zZ291dCgzLCAiZmluZF9tb2R1bGUgLT4gRXhjbHVkZWQiLCBmdWxsbmFtZSkKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCBuYW1lCisKKyAgICAgICAgaWYgcGF0aCBpcyBOb25lOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lLCAoIiIsICIiLCBpbXAuQ19CVUlMVElOKSkKKworICAgICAgICAgICAgcGF0aCA9IHNlbGYucGF0aAorICAgICAgICByZXR1cm4gaW1wLmZpbmRfbW9kdWxlKG5hbWUsIHBhdGgpCisKKyAgICBkZWYgcmVwb3J0KHNlbGYpOgorICAgICAgICAiIiJQcmludCBhIHJlcG9ydCB0byBzdGRvdXQsIGxpc3RpbmcgdGhlIGZvdW5kIG1vZHVsZXMgd2l0aCB0aGVpcgorICAgICAgICBwYXRocywgYXMgd2VsbCBhcyBtb2R1bGVzIHRoYXQgYXJlIG1pc3NpbmcsIG9yIHNlZW0gdG8gYmUgbWlzc2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICIgICUtMjVzICVzIiAlICgiTmFtZSIsICJGaWxlIikKKyAgICAgICAgcHJpbnQgIiAgJS0yNXMgJXMiICUgKCItLS0tIiwgIi0tLS0iKQorICAgICAgICAjIFByaW50IG1vZHVsZXMgZm91bmQKKyAgICAgICAga2V5cyA9IHNlbGYubW9kdWxlcy5rZXlzKCkKKyAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgbSA9IHNlbGYubW9kdWxlc1trZXldCisgICAgICAgICAgICBpZiBtLl9fcGF0aF9fOgorICAgICAgICAgICAgICAgIHByaW50ICJQIiwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIm0iLAorICAgICAgICAgICAgcHJpbnQgIiUtMjVzIiAlIGtleSwgbS5fX2ZpbGVfXyBvciAiIgorCisgICAgICAgICMgUHJpbnQgbWlzc2luZyBtb2R1bGVzCisgICAgICAgIG1pc3NpbmcsIG1heWJlID0gc2VsZi5hbnlfbWlzc2luZ19tYXliZSgpCisgICAgICAgIGlmIG1pc3Npbmc6CisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgIk1pc3NpbmcgbW9kdWxlczoiCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBtaXNzaW5nOgorICAgICAgICAgICAgICAgIG1vZHMgPSBzZWxmLmJhZG1vZHVsZXNbbmFtZV0ua2V5cygpCisgICAgICAgICAgICAgICAgbW9kcy5zb3J0KCkKKyAgICAgICAgICAgICAgICBwcmludCAiPyIsIG5hbWUsICJpbXBvcnRlZCBmcm9tIiwgJywgJy5qb2luKG1vZHMpCisgICAgICAgICMgUHJpbnQgbW9kdWxlcyB0aGF0IG1heSBiZSBtaXNzaW5nLCBidXQgdGhlbiBhZ2FpbiwgbWF5YmUgbm90Li4uCisgICAgICAgIGlmIG1heWJlOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICJTdWJtb2R1bGVzIHRoYXkgYXBwZWFyIHRvIGJlIG1pc3NpbmcsIGJ1dCBjb3VsZCBhbHNvIGJlIiwKKyAgICAgICAgICAgIHByaW50ICJnbG9iYWwgbmFtZXMgaW4gdGhlIHBhcmVudCBwYWNrYWdlOiIKKyAgICAgICAgICAgIGZvciBuYW1lIGluIG1heWJlOgorICAgICAgICAgICAgICAgIG1vZHMgPSBzZWxmLmJhZG1vZHVsZXNbbmFtZV0ua2V5cygpCisgICAgICAgICAgICAgICAgbW9kcy5zb3J0KCkKKyAgICAgICAgICAgICAgICBwcmludCAiPyIsIG5hbWUsICJpbXBvcnRlZCBmcm9tIiwgJywgJy5qb2luKG1vZHMpCisKKyAgICBkZWYgYW55X21pc3Npbmcoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbW9kdWxlcyB0aGF0IGFwcGVhciB0byBiZSBtaXNzaW5nLiBVc2UKKyAgICAgICAgYW55X21pc3NpbmdfbWF5YmUoKSBpZiB5b3Ugd2FudCB0byBrbm93IHdoaWNoIG1vZHVsZXMgYXJlCisgICAgICAgIGNlcnRhaW4gdG8gYmUgbWlzc2luZywgYW5kIHdoaWNoICptYXkqIGJlIG1pc3NpbmcuCisgICAgICAgICIiIgorICAgICAgICBtaXNzaW5nLCBtYXliZSA9IHNlbGYuYW55X21pc3NpbmdfbWF5YmUoKQorICAgICAgICByZXR1cm4gbWlzc2luZyArIG1heWJlCisKKyAgICBkZWYgYW55X21pc3NpbmdfbWF5YmUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0d28gbGlzdHMsIG9uZSB3aXRoIG1vZHVsZXMgdGhhdCBhcmUgY2VydGFpbmx5IG1pc3NpbmcKKyAgICAgICAgYW5kIG9uZSB3aXRoIG1vZHVsZXMgdGhhdCAqbWF5KiBiZSBtaXNzaW5nLiBUaGUgbGF0dGVyIG5hbWVzIGNvdWxkCisgICAgICAgIGVpdGhlciBiZSBzdWJtb2R1bGVzICpvcioganVzdCBnbG9iYWwgbmFtZXMgaW4gdGhlIHBhY2thZ2UuCisKKyAgICAgICAgVGhlIHJlYXNvbiBpdCBjYW4ndCBhbHdheXMgYmUgZGV0ZXJtaW5lZCBpcyB0aGF0IGl0J3MgaW1wb3NzaWJsZSB0bworICAgICAgICB0ZWxsIHdoaWNoIG5hbWVzIGFyZSBpbXBvcnRlZCB3aGVuICJmcm9tIG1vZHVsZSBpbXBvcnQgKiIgaXMgZG9uZQorICAgICAgICB3aXRoIGFuIGV4dGVuc2lvbiBtb2R1bGUsIHNob3J0IG9mIGFjdHVhbGx5IGltcG9ydGluZyBpdC4KKyAgICAgICAgIiIiCisgICAgICAgIG1pc3NpbmcgPSBbXQorICAgICAgICBtYXliZSA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuYmFkbW9kdWxlczoKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gc2VsZi5leGNsdWRlczoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaSA9IG5hbWUucmZpbmQoIi4iKQorICAgICAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc3VibmFtZSA9IG5hbWVbaSsxOl0KKyAgICAgICAgICAgIHBrZ25hbWUgPSBuYW1lWzppXQorICAgICAgICAgICAgcGtnID0gc2VsZi5tb2R1bGVzLmdldChwa2duYW1lKQorICAgICAgICAgICAgaWYgcGtnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlmIHBrZ25hbWUgaW4gc2VsZi5iYWRtb2R1bGVzW25hbWVdOgorICAgICAgICAgICAgICAgICAgICAjIFRoZSBwYWNrYWdlIHRyaWVkIHRvIGltcG9ydCB0aGlzIG1vZHVsZSBpdHNlbGYgYW5kCisgICAgICAgICAgICAgICAgICAgICMgZmFpbGVkLiBJdCdzIGRlZmluaXRlbHkgbWlzc2luZy4KKyAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICBlbGlmIHN1Ym5hbWUgaW4gcGtnLmdsb2JhbG5hbWVzOgorICAgICAgICAgICAgICAgICAgICAjIEl0J3MgYSBnbG9iYWwgaW4gdGhlIHBhY2thZ2U6IGRlZmluaXRlbHkgbm90IG1pc3NpbmcuCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbGlmIHBrZy5zdGFyaW1wb3J0czoKKyAgICAgICAgICAgICAgICAgICAgIyBJdCBjb3VsZCBiZSBtaXNzaW5nLCBidXQgdGhlIHBhY2thZ2UgZGlkIGFuICJpbXBvcnQgKiIKKyAgICAgICAgICAgICAgICAgICAgIyBmcm9tIGEgbm9uLVB5dGhvbiBtb2R1bGUsIHNvIHdlIHNpbXBseSBjYW4ndCBiZSBzdXJlLgorICAgICAgICAgICAgICAgICAgICBtYXliZS5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEl0J3Mgbm90IGEgZ2xvYmFsIGluIHRoZSBwYWNrYWdlLCB0aGUgcGFja2FnZSBkaWRuJ3QKKyAgICAgICAgICAgICAgICAgICAgIyBkbyBmdW5ueSBzdGFyIGltcG9ydHMsIGl0J3MgdmVyeSBsaWtlbHkgdG8gYmUgbWlzc2luZy4KKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgc3ltYm9sIGNvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIHBhY2thZ2UgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgIyBvdXRzaWRlLCBidXQgc2luY2UgdGhhdCdzIG5vdCBnb29kIHN0eWxlIHdlIHNpbXBseSBsaXN0CisgICAgICAgICAgICAgICAgICAgICMgaXQgbWlzc2luZy4KKyAgICAgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQobmFtZSkKKyAgICAgICAgbWlzc2luZy5zb3J0KCkKKyAgICAgICAgbWF5YmUuc29ydCgpCisgICAgICAgIHJldHVybiBtaXNzaW5nLCBtYXliZQorCisgICAgZGVmIHJlcGxhY2VfcGF0aHNfaW5fY29kZShzZWxmLCBjbyk6CisgICAgICAgIG5ld19maWxlbmFtZSA9IG9yaWdpbmFsX2ZpbGVuYW1lID0gb3MucGF0aC5ub3JtcGF0aChjby5jb19maWxlbmFtZSkKKyAgICAgICAgZm9yIGYsIHIgaW4gc2VsZi5yZXBsYWNlX3BhdGhzOgorICAgICAgICAgICAgaWYgb3JpZ2luYWxfZmlsZW5hbWUuc3RhcnRzd2l0aChmKToKKyAgICAgICAgICAgICAgICBuZXdfZmlsZW5hbWUgPSByICsgb3JpZ2luYWxfZmlsZW5hbWVbbGVuKGYpOl0KKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIHNlbGYuZGVidWcgYW5kIG9yaWdpbmFsX2ZpbGVuYW1lIG5vdCBpbiBzZWxmLnByb2Nlc3NlZF9wYXRoczoKKyAgICAgICAgICAgIGlmIG5ld19maWxlbmFtZSAhPSBvcmlnaW5hbF9maWxlbmFtZToKKyAgICAgICAgICAgICAgICBzZWxmLm1zZ291dCgyLCAiY29fZmlsZW5hbWUgJXIgY2hhbmdlZCB0byAlciIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAob3JpZ2luYWxfZmlsZW5hbWUsbmV3X2ZpbGVuYW1lLCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubXNnb3V0KDIsICJjb19maWxlbmFtZSAlciByZW1haW5zIHVuY2hhbmdlZCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAob3JpZ2luYWxfZmlsZW5hbWUsKSkKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc2VkX3BhdGhzLmFwcGVuZChvcmlnaW5hbF9maWxlbmFtZSkKKworICAgICAgICBjb25zdHMgPSBsaXN0KGNvLmNvX2NvbnN0cykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNvbnN0cykpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb25zdHNbaV0sIHR5cGUoY28pKToKKyAgICAgICAgICAgICAgICBjb25zdHNbaV0gPSBzZWxmLnJlcGxhY2VfcGF0aHNfaW5fY29kZShjb25zdHNbaV0pCisKKyAgICAgICAgcmV0dXJuIHR5cGVzLkNvZGVUeXBlKGNvLmNvX2FyZ2NvdW50LCBjby5jb19ubG9jYWxzLCBjby5jb19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY28uY29fZmxhZ3MsIGNvLmNvX2NvZGUsIHR1cGxlKGNvbnN0cyksIGNvLmNvX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvLmNvX3Zhcm5hbWVzLCBuZXdfZmlsZW5hbWUsIGNvLmNvX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY28uY29fZmlyc3RsaW5lbm8sIGNvLmNvX2xub3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjby5jb19mcmVldmFycywgY28uY29fY2VsbHZhcnMpCisKKworZGVmIHRlc3QoKToKKyAgICAjIFBhcnNlIGNvbW1hbmQgbGluZQorICAgIGltcG9ydCBnZXRvcHQKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImRtcDpxeDoiKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgcHJpbnQgbXNnCisgICAgICAgIHJldHVybgorCisgICAgIyBQcm9jZXNzIG9wdGlvbnMKKyAgICBkZWJ1ZyA9IDEKKyAgICBkb21vZHMgPSAwCisgICAgYWRkcGF0aCA9IFtdCisgICAgZXhjbHVkZSA9IFtdCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLWQnOgorICAgICAgICAgICAgZGVidWcgPSBkZWJ1ZyArIDEKKyAgICAgICAgaWYgbyA9PSAnLW0nOgorICAgICAgICAgICAgZG9tb2RzID0gMQorICAgICAgICBpZiBvID09ICctcCc6CisgICAgICAgICAgICBhZGRwYXRoID0gYWRkcGF0aCArIGEuc3BsaXQob3MucGF0aHNlcCkKKyAgICAgICAgaWYgbyA9PSAnLXEnOgorICAgICAgICAgICAgZGVidWcgPSAwCisgICAgICAgIGlmIG8gPT0gJy14JzoKKyAgICAgICAgICAgIGV4Y2x1ZGUuYXBwZW5kKGEpCisKKyAgICAjIFByb3ZpZGUgZGVmYXVsdCBhcmd1bWVudHMKKyAgICBpZiBub3QgYXJnczoKKyAgICAgICAgc2NyaXB0ID0gImhlbGxvLnB5IgorICAgIGVsc2U6CisgICAgICAgIHNjcmlwdCA9IGFyZ3NbMF0KKworICAgICMgU2V0IHRoZSBwYXRoIGJhc2VkIG9uIHN5cy5wYXRoIGFuZCB0aGUgc2NyaXB0IGRpcmVjdG9yeQorICAgIHBhdGggPSBzeXMucGF0aFs6XQorICAgIHBhdGhbMF0gPSBvcy5wYXRoLmRpcm5hbWUoc2NyaXB0KQorICAgIHBhdGggPSBhZGRwYXRoICsgcGF0aAorICAgIGlmIGRlYnVnID4gMToKKyAgICAgICAgcHJpbnQgInBhdGg6IgorICAgICAgICBmb3IgaXRlbSBpbiBwYXRoOgorICAgICAgICAgICAgcHJpbnQgIiAgICIsIHJlcHIoaXRlbSkKKworICAgICMgQ3JlYXRlIHRoZSBtb2R1bGUgZmluZGVyIGFuZCB0dXJuIGl0cyBjcmFuaworICAgIG1mID0gTW9kdWxlRmluZGVyKHBhdGgsIGRlYnVnLCBleGNsdWRlKQorICAgIGZvciBhcmcgaW4gYXJnc1sxOl06CisgICAgICAgIGlmIGFyZyA9PSAnLW0nOgorICAgICAgICAgICAgZG9tb2RzID0gMQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgZG9tb2RzOgorICAgICAgICAgICAgaWYgYXJnWy0yOl0gPT0gJy4qJzoKKyAgICAgICAgICAgICAgICBtZi5pbXBvcnRfaG9vayhhcmdbOi0yXSwgTm9uZSwgWyIqIl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1mLmltcG9ydF9ob29rKGFyZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1mLmxvYWRfZmlsZShhcmcpCisgICAgbWYucnVuX3NjcmlwdChzY3JpcHQpCisgICAgbWYucmVwb3J0KCkKKyAgICByZXR1cm4gbWYgICMgZm9yIC1pIGRlYnVnZ2luZworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdHJ5OgorICAgICAgICBtZiA9IHRlc3QoKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcHJpbnQgIlxuW2ludGVycnVwdF0iCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weWMgYi9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjNDI2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbW9kdWxlZmluZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weW8gYi9saWIvcHl0aG9uMi43L21vZHVsZWZpbmRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkYjc4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbW9kdWxlZmluZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weSBiL2xpYi9weXRob24yLjcvbXVsdGlmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1YjAyMDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weQpAQCAtMCwwICsxLDE2MiBAQAorIiIiQSByZWFkbGluZSgpLXN0eWxlIGludGVyZmFjZSB0byB0aGUgcGFydHMgb2YgYSBtdWx0aXBhcnQgbWVzc2FnZS4KKworVGhlIE11bHRpRmlsZSBjbGFzcyBtYWtlcyBlYWNoIHBhcnQgb2YgYSBtdWx0aXBhcnQgbWVzc2FnZSAiZmVlbCIgbGlrZQorYW4gb3JkaW5hcnkgZmlsZSwgYXMgbG9uZyBhcyB5b3UgdXNlIGZwLnJlYWRsaW5lKCkuICBBbGxvd3MgcmVjdXJzaXZlCit1c2UsIGZvciBuZXN0ZWQgbXVsdGlwYXJ0IG1lc3NhZ2VzLiAgUHJvYmFibHkgYmVzdCB1c2VkIHRvZ2V0aGVyCit3aXRoIG1vZHVsZSBtaW1ldG9vbHMuCisKK1N1Z2dlc3RlZCB1c2U6CisKK3JlYWxfZnAgPSBvcGVuKC4uLikKK2ZwID0gTXVsdGlGaWxlKHJlYWxfZnApCisKKyJyZWFkIHNvbWUgbGluZXMgZnJvbSBmcCIKK2ZwLnB1c2goc2VwYXJhdG9yKQord2hpbGUgMToKKyAgICAgICAgInJlYWQgbGluZXMgZnJvbSBmcCB1bnRpbCBpdCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyIgKEEpCisgICAgICAgIGlmIG5vdCBmcC5uZXh0KCk6IGJyZWFrCitmcC5wb3AoKQorInJlYWQgcmVtYWluaW5nIGxpbmVzIGZyb20gZnAgdW50aWwgaXQgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmciCisKK1RoZSBsYXR0ZXIgc2VxdWVuY2UgbWF5IGJlIHVzZWQgcmVjdXJzaXZlbHkgYXQgKEEpLgorSXQgaXMgYWxzbyBhbGxvd2VkIHRvIHVzZSBtdWx0aXBsZSBwdXNoKCkuLi5wb3AoKSBzZXF1ZW5jZXMuCisKK0lmIHNlZWthYmxlIGlzIGdpdmVuIGFzIDAsIHRoZSBjbGFzcyBjb2RlIHdpbGwgbm90IGRvIHRoZSBib29ra2VlcGluZworaXQgbm9ybWFsbHkgYXR0ZW1wdHMgaW4gb3JkZXIgdG8gbWFrZSBzZWVrcyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorY3VycmVudCBmaWxlIHBhcnQuICBUaGlzIG1heSBiZSB1c2VmdWwgd2hlbiB1c2luZyBNdWx0aUZpbGUgd2l0aCBhIG5vbi0KK3NlZWthYmxlIHN0cmVhbSBvYmplY3QuCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KK3dhcm4oInRoZSBtdWx0aWZpbGUgbW9kdWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgc2luY2UgUHl0aG9uIDIuNSIsCisgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm4KKworX19hbGxfXyA9IFsiTXVsdGlGaWxlIiwiRXJyb3IiXQorCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgTXVsdGlGaWxlOgorCisgICAgc2Vla2FibGUgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIHNlZWthYmxlPTEpOgorICAgICAgICBzZWxmLmZwID0gZnAKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYubGV2ZWwgPSAwCisgICAgICAgIHNlbGYubGFzdCA9IDAKKyAgICAgICAgaWYgc2Vla2FibGU6CisgICAgICAgICAgICBzZWxmLnNlZWthYmxlID0gMQorICAgICAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICBzZWxmLnBvc3N0YWNrID0gW10KKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmxldmVsID4gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxhc3Rwb3MKKyAgICAgICAgcmV0dXJuIHNlbGYuZnAudGVsbCgpIC0gc2VsZi5zdGFydAorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2U9MCk6CisgICAgICAgIGhlcmUgPSBzZWxmLnRlbGwoKQorICAgICAgICBpZiB3aGVuY2U6CisgICAgICAgICAgICBpZiB3aGVuY2UgPT0gMToKKyAgICAgICAgICAgICAgICBwb3MgPSBwb3MgKyBoZXJlCisgICAgICAgICAgICBlbGlmIHdoZW5jZSA9PSAyOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubGV2ZWwgPiAwOgorICAgICAgICAgICAgICAgICAgICBwb3MgPSBwb3MgKyBzZWxmLmxhc3Rwb3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgImNhbid0IHVzZSB3aGVuY2U9MiB5ZXQiCisgICAgICAgIGlmIG5vdCAwIDw9IHBvcyA8PSBoZXJlIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGV2ZWwgPiAwIGFuZCBwb3MgPiBzZWxmLmxhc3Rwb3M6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2JhZCBNdWx0aUZpbGUuc2VlaygpIGNhbGwnCisgICAgICAgIHNlbGYuZnAuc2Vlayhwb3MgKyBzZWxmLnN0YXJ0KQorICAgICAgICBzZWxmLmxldmVsID0gMAorICAgICAgICBzZWxmLmxhc3QgPSAwCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGlmIHNlbGYubGV2ZWwgPiAwOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgIyBSZWFsIEVPRj8KKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBzZWxmLmxldmVsID0gbGVuKHNlbGYuc3RhY2spCisgICAgICAgICAgICBzZWxmLmxhc3QgPSAoc2VsZi5sZXZlbCA+IDApCisgICAgICAgICAgICBpZiBzZWxmLmxhc3Q6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzdWRkZW4gRU9GIGluIE11bHRpRmlsZS5yZWFkbGluZSgpJworICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGFzc2VydCBzZWxmLmxldmVsID09IDAKKyAgICAgICAgIyBGYXN0IGNoZWNrIHRvIHNlZSBpZiB0aGlzIGlzIGp1c3QgZGF0YQorICAgICAgICBpZiBzZWxmLmlzX2RhdGEobGluZSk6CisgICAgICAgICAgICByZXR1cm4gbGluZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZ25vcmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBvbiBtYXJrZXIgbGluZXMKKyAgICAgICAgICAgIG1hcmtlciA9IGxpbmUucnN0cmlwKCkKKyAgICAgICAgIyBObz8gIE9LLCB0cnkgdG8gbWF0Y2ggYSBib3VuZGFyeS4KKyAgICAgICAgIyBSZXR1cm4gdGhlIGxpbmUgKHVuc3RyaXBwZWQpIGlmIHdlIGRvbid0LgorICAgICAgICBmb3IgaSwgc2VwIGluIGVudW1lcmF0ZShyZXZlcnNlZChzZWxmLnN0YWNrKSk6CisgICAgICAgICAgICBpZiBtYXJrZXIgPT0gc2VsZi5zZWN0aW9uX2RpdmlkZXIoc2VwKToKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3QgPSAwCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbWFya2VyID09IHNlbGYuZW5kX21hcmtlcihzZXApOgorICAgICAgICAgICAgICAgIHNlbGYubGFzdCA9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGxpbmUKKyAgICAgICAgIyBXZSBvbmx5IGdldCBoZXJlIGlmIHdlIHNlZSBhIHNlY3Rpb24gZGl2aWRlciBvciBFT00gbGluZQorICAgICAgICBpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgc2VsZi5sYXN0cG9zID0gc2VsZi50ZWxsKCkgLSBsZW4obGluZSkKKyAgICAgICAgc2VsZi5sZXZlbCA9IGkrMQorICAgICAgICBpZiBzZWxmLmxldmVsID4gMToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCdNaXNzaW5nIGVuZG1hcmtlciBpbiBNdWx0aUZpbGUucmVhZGxpbmUoKScKKyAgICAgICAgcmV0dXJuICcnCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAgICAgbGlzdC5hcHBlbmQobGluZSkKKyAgICAgICAgcmV0dXJuIGxpc3QKKworICAgIGRlZiByZWFkKHNlbGYpOiAjIE5vdGU6IG5vIHNpemUgYXJndW1lbnQgLS0gcmVhZCB1bnRpbCBFT0Ygb25seSEKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oc2VsZi5yZWFkbGluZXMoKSkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICB3aGlsZSBzZWxmLnJlYWRsaW5lKCk6IHBhc3MKKyAgICAgICAgaWYgc2VsZi5sZXZlbCA+IDEgb3Igc2VsZi5sYXN0OgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgc2VsZi5sZXZlbCA9IDAKKyAgICAgICAgc2VsZi5sYXN0ID0gMAorICAgICAgICBpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgc2VsZi5zdGFydCA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgcHVzaChzZWxmLCBzZXApOgorICAgICAgICBpZiBzZWxmLmxldmVsID4gMDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIE11bHRpRmlsZS5wdXNoKCkgY2FsbCcKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoc2VwKQorICAgICAgICBpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgc2VsZi5wb3NzdGFjay5hcHBlbmQoc2VsZi5zdGFydCkKKyAgICAgICAgICAgIHNlbGYuc3RhcnQgPSBzZWxmLmZwLnRlbGwoKQorCisgICAgZGVmIHBvcChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zdGFjayA9PSBbXToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIE11bHRpRmlsZS5wb3AoKSBjYWxsJworICAgICAgICBpZiBzZWxmLmxldmVsIDw9IDE6CisgICAgICAgICAgICBzZWxmLmxhc3QgPSAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhYnNsYXN0cG9zID0gc2VsZi5sYXN0cG9zICsgc2VsZi5zdGFydAorICAgICAgICBzZWxmLmxldmVsID0gbWF4KDAsIHNlbGYubGV2ZWwgLSAxKQorICAgICAgICBzZWxmLnN0YWNrLnBvcCgpCisgICAgICAgIGlmIHNlbGYuc2Vla2FibGU6CisgICAgICAgICAgICBzZWxmLnN0YXJ0ID0gc2VsZi5wb3NzdGFjay5wb3AoKQorICAgICAgICAgICAgaWYgc2VsZi5sZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5sYXN0cG9zID0gYWJzbGFzdHBvcyAtIHNlbGYuc3RhcnQKKworICAgIGRlZiBpc19kYXRhKHNlbGYsIGxpbmUpOgorICAgICAgICByZXR1cm4gbGluZVs6Ml0gIT0gJy0tJworCisgICAgZGVmIHNlY3Rpb25fZGl2aWRlcihzZWxmLCBzdHIpOgorICAgICAgICByZXR1cm4gIi0tIiArIHN0cgorCisgICAgZGVmIGVuZF9tYXJrZXIoc2VsZiwgc3RyKToKKyAgICAgICAgcmV0dXJuICItLSIgKyBzdHIgKyAiLS0iCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhOTIzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L211bHRpZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4MTg1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOTFlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weQpAQCAtMCwwICsxLDI3NyBAQAorIworIyBQYWNrYWdlIGFuYWxvZ291cyB0byAndGhyZWFkaW5nLnB5JyBidXQgdXNpbmcgcHJvY2Vzc2VzCisjCisjIG11bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weQorIworIyBUaGlzIHBhY2thZ2UgaXMgaW50ZW5kZWQgdG8gZHVwbGljYXRlIHRoZSBmdW5jdGlvbmFsaXR5IChhbmQgbXVjaCBvZgorIyB0aGUgQVBJKSBvZiB0aHJlYWRpbmcucHkgYnV0IHVzZXMgcHJvY2Vzc2VzIGluc3RlYWQgb2YgdGhyZWFkcy4gIEEKKyMgc3VicGFja2FnZSAnbXVsdGlwcm9jZXNzaW5nLmR1bW15JyBoYXMgdGhlIHNhbWUgQVBJIGJ1dCBpcyBhIHNpbXBsZQorIyB3cmFwcGVyIGZvciAndGhyZWFkaW5nJy4KKyMKKyMgVHJ5IGNhbGxpbmcgYG11bHRpcHJvY2Vzc2luZy5kb2MubWFpbigpYCB0byByZWFkIHRoZSBodG1sCisjIGRvY3VtZW50YXRpb24gaW4gYSB3ZWJicm93c2VyLgorIworIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX3ZlcnNpb25fXyA9ICcwLjcwYTEnCisKK19fYWxsX18gPSBbCisgICAgJ1Byb2Nlc3MnLCAnY3VycmVudF9wcm9jZXNzJywgJ2FjdGl2ZV9jaGlsZHJlbicsICdmcmVlemVfc3VwcG9ydCcsCisgICAgJ01hbmFnZXInLCAnUGlwZScsICdjcHVfY291bnQnLCAnbG9nX3RvX3N0ZGVycicsICdnZXRfbG9nZ2VyJywKKyAgICAnYWxsb3dfY29ubmVjdGlvbl9waWNrbGluZycsICdCdWZmZXJUb29TaG9ydCcsICdUaW1lb3V0RXJyb3InLAorICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ0NvbmRpdGlvbicsCisgICAgJ0V2ZW50JywgJ1F1ZXVlJywgJ0pvaW5hYmxlUXVldWUnLCAnUG9vbCcsICdWYWx1ZScsICdBcnJheScsCisgICAgJ1Jhd1ZhbHVlJywgJ1Jhd0FycmF5JywgJ1NVQkRFQlVHJywgJ1NVQldBUk5JTkcnLAorICAgIF0KKworX19hdXRob3JfXyA9ICdSLiBPdWRrZXJrIChyLm0ub3Vka2Vya0BnbWFpbC5jb20pJworCisjCisjIEltcG9ydHMKKyMKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MgaW1wb3J0IFByb2Nlc3MsIGN1cnJlbnRfcHJvY2VzcywgYWN0aXZlX2NoaWxkcmVuCitmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBTVUJERUJVRywgU1VCV0FSTklORworCisjCisjIEV4Y2VwdGlvbnMKKyMKKworY2xhc3MgUHJvY2Vzc0Vycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitjbGFzcyBCdWZmZXJUb29TaG9ydChQcm9jZXNzRXJyb3IpOgorICAgIHBhc3MKKworY2xhc3MgVGltZW91dEVycm9yKFByb2Nlc3NFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBBdXRoZW50aWNhdGlvbkVycm9yKFByb2Nlc3NFcnJvcik6CisgICAgcGFzcworCisjIFRoaXMgaXMgZG93biBoZXJlIGJlY2F1c2UgX211bHRpcHJvY2Vzc2luZyB1c2VzIEJ1ZmZlclRvb1Nob3J0CitpbXBvcnQgX211bHRpcHJvY2Vzc2luZworCisjCisjIERlZmluaXRpb25zIG5vdCBkZXBlbmRpbmcgb24gbmF0aXZlIHNlbWFwaG9yZXMKKyMKKworZGVmIE1hbmFnZXIoKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgbWFuYWdlciBhc3NvY2lhdGVkIHdpdGggYSBydW5uaW5nIHNlcnZlciBwcm9jZXNzCisKKyAgICBUaGUgbWFuYWdlcnMgbWV0aG9kcyBzdWNoIGFzIGBMb2NrKClgLCBgQ29uZGl0aW9uKClgIGFuZCBgUXVldWUoKWAKKyAgICBjYW4gYmUgdXNlZCB0byBjcmVhdGUgc2hhcmVkIG9iamVjdHMuCisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMgaW1wb3J0IFN5bmNNYW5hZ2VyCisgICAgbSA9IFN5bmNNYW5hZ2VyKCkKKyAgICBtLnN0YXJ0KCkKKyAgICByZXR1cm4gbQorCitkZWYgUGlwZShkdXBsZXg9VHJ1ZSk6CisgICAgJycnCisgICAgUmV0dXJucyB0d28gY29ubmVjdGlvbiBvYmplY3QgY29ubmVjdGVkIGJ5IGEgcGlwZQorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24gaW1wb3J0IFBpcGUKKyAgICByZXR1cm4gUGlwZShkdXBsZXgpCisKK2RlZiBjcHVfY291bnQoKToKKyAgICAnJycKKyAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgQ1BVcyBpbiB0aGUgc3lzdGVtCisgICAgJycnCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG51bSA9IGludChvcy5lbnZpcm9uWydOVU1CRVJfT0ZfUFJPQ0VTU09SUyddKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEtleUVycm9yKToKKyAgICAgICAgICAgIG51bSA9IDAKKyAgICBlbGlmICdic2QnIGluIHN5cy5wbGF0Zm9ybSBvciBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIGNvbW0gPSAnL3NiaW4vc3lzY3RsIC1uIGh3Lm5jcHUnCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGNvbW0gPSAnL3VzcicgKyBjb21tCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3MucG9wZW4oY29tbSkgYXMgcDoKKyAgICAgICAgICAgICAgICBudW0gPSBpbnQocC5yZWFkKCkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgbnVtID0gMAorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG51bSA9IG9zLnN5c2NvbmYoJ1NDX05QUk9DRVNTT1JTX09OTE4nKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE9TRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIG51bSA9IDAKKworICAgIGlmIG51bSA+PSAxOgorICAgICAgICByZXR1cm4gbnVtCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignY2Fubm90IGRldGVybWluZSBudW1iZXIgb2YgY3B1cycpCisKK2RlZiBmcmVlemVfc3VwcG9ydCgpOgorICAgICcnJworICAgIENoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIGZha2UgZm9ya2VkIHByb2Nlc3MgaW4gYSBmcm96ZW4gZXhlY3V0YWJsZS4KKyAgICBJZiBzbyB0aGVuIHJ1biBjb2RlIHNwZWNpZmllZCBieSBjb21tYW5kbGluZSBhbmQgZXhpdC4KKyAgICAnJycKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBhbmQgZ2V0YXR0cihzeXMsICdmcm96ZW4nLCBGYWxzZSk6CisgICAgICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IGZyZWV6ZV9zdXBwb3J0CisgICAgICAgIGZyZWV6ZV9zdXBwb3J0KCkKKworZGVmIGdldF9sb2dnZXIoKToKKyAgICAnJycKKyAgICBSZXR1cm4gcGFja2FnZSBsb2dnZXIgLS0gaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCB0aGVuIGl0IGlzIGNyZWF0ZWQKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBnZXRfbG9nZ2VyCisgICAgcmV0dXJuIGdldF9sb2dnZXIoKQorCitkZWYgbG9nX3RvX3N0ZGVycihsZXZlbD1Ob25lKToKKyAgICAnJycKKyAgICBUdXJuIG9uIGxvZ2dpbmcgYW5kIGFkZCBhIGhhbmRsZXIgd2hpY2ggcHJpbnRzIHRvIHN0ZGVycgorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnV0aWwgaW1wb3J0IGxvZ190b19zdGRlcnIKKyAgICByZXR1cm4gbG9nX3RvX3N0ZGVycihsZXZlbCkKKworZGVmIGFsbG93X2Nvbm5lY3Rpb25fcGlja2xpbmcoKToKKyAgICAnJycKKyAgICBJbnN0YWxsIHN1cHBvcnQgZm9yIHNlbmRpbmcgY29ubmVjdGlvbnMgYW5kIHNvY2tldHMgYmV0d2VlbiBwcm9jZXNzZXMKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgcmVkdWN0aW9uCisKKyMKKyMgRGVmaW5pdGlvbnMgZGVwZW5kaW5nIG9uIG5hdGl2ZSBzZW1hcGhvcmVzCisjCisKK2RlZiBMb2NrKCk6CisgICAgJycnCisgICAgUmV0dXJucyBhIG5vbi1yZWN1cnNpdmUgbG9jayBvYmplY3QKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZSBpbXBvcnQgTG9jaworICAgIHJldHVybiBMb2NrKCkKKworZGVmIFJMb2NrKCk6CisgICAgJycnCisgICAgUmV0dXJucyBhIHJlY3Vyc2l2ZSBsb2NrIG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnN5bmNocm9uaXplIGltcG9ydCBSTG9jaworICAgIHJldHVybiBSTG9jaygpCisKK2RlZiBDb25kaXRpb24obG9jaz1Ob25lKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgY29uZGl0aW9uIG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnN5bmNocm9uaXplIGltcG9ydCBDb25kaXRpb24KKyAgICByZXR1cm4gQ29uZGl0aW9uKGxvY2spCisKK2RlZiBTZW1hcGhvcmUodmFsdWU9MSk6CisgICAgJycnCisgICAgUmV0dXJucyBhIHNlbWFwaG9yZSBvYmplY3QKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZSBpbXBvcnQgU2VtYXBob3JlCisgICAgcmV0dXJuIFNlbWFwaG9yZSh2YWx1ZSkKKworZGVmIEJvdW5kZWRTZW1hcGhvcmUodmFsdWU9MSk6CisgICAgJycnCisgICAgUmV0dXJucyBhIGJvdW5kZWQgc2VtYXBob3JlIG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnN5bmNocm9uaXplIGltcG9ydCBCb3VuZGVkU2VtYXBob3JlCisgICAgcmV0dXJuIEJvdW5kZWRTZW1hcGhvcmUodmFsdWUpCisKK2RlZiBFdmVudCgpOgorICAgICcnJworICAgIFJldHVybnMgYW4gZXZlbnQgb2JqZWN0CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc3luY2hyb25pemUgaW1wb3J0IEV2ZW50CisgICAgcmV0dXJuIEV2ZW50KCkKKworZGVmIFF1ZXVlKG1heHNpemU9MCk6CisgICAgJycnCisgICAgUmV0dXJucyBhIHF1ZXVlIG9iamVjdAorICAgICcnJworICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnF1ZXVlcyBpbXBvcnQgUXVldWUKKyAgICByZXR1cm4gUXVldWUobWF4c2l6ZSkKKworZGVmIEpvaW5hYmxlUXVldWUobWF4c2l6ZT0wKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgcXVldWUgb2JqZWN0CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcucXVldWVzIGltcG9ydCBKb2luYWJsZVF1ZXVlCisgICAgcmV0dXJuIEpvaW5hYmxlUXVldWUobWF4c2l6ZSkKKworZGVmIFBvb2wocHJvY2Vzc2VzPU5vbmUsIGluaXRpYWxpemVyPU5vbmUsIGluaXRhcmdzPSgpLCBtYXh0YXNrc3BlcmNoaWxkPU5vbmUpOgorICAgICcnJworICAgIFJldHVybnMgYSBwcm9jZXNzIHBvb2wgb2JqZWN0CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcucG9vbCBpbXBvcnQgUG9vbAorICAgIHJldHVybiBQb29sKHByb2Nlc3NlcywgaW5pdGlhbGl6ZXIsIGluaXRhcmdzLCBtYXh0YXNrc3BlcmNoaWxkKQorCitkZWYgUmF3VmFsdWUodHlwZWNvZGVfb3JfdHlwZSwgKmFyZ3MpOgorICAgICcnJworICAgIFJldHVybnMgYSBzaGFyZWQgb2JqZWN0CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc2hhcmVkY3R5cGVzIGltcG9ydCBSYXdWYWx1ZQorICAgIHJldHVybiBSYXdWYWx1ZSh0eXBlY29kZV9vcl90eXBlLCAqYXJncykKKworZGVmIFJhd0FycmF5KHR5cGVjb2RlX29yX3R5cGUsIHNpemVfb3JfaW5pdGlhbGl6ZXIpOgorICAgICcnJworICAgIFJldHVybnMgYSBzaGFyZWQgYXJyYXkKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zaGFyZWRjdHlwZXMgaW1wb3J0IFJhd0FycmF5CisgICAgcmV0dXJuIFJhd0FycmF5KHR5cGVjb2RlX29yX3R5cGUsIHNpemVfb3JfaW5pdGlhbGl6ZXIpCisKK2RlZiBWYWx1ZSh0eXBlY29kZV9vcl90eXBlLCAqYXJncywgKiprd2RzKToKKyAgICAnJycKKyAgICBSZXR1cm5zIGEgc3luY2hyb25pemVkIHNoYXJlZCBvYmplY3QKKyAgICAnJycKKyAgICBmcm9tIG11bHRpcHJvY2Vzc2luZy5zaGFyZWRjdHlwZXMgaW1wb3J0IFZhbHVlCisgICAgcmV0dXJuIFZhbHVlKHR5cGVjb2RlX29yX3R5cGUsICphcmdzLCAqKmt3ZHMpCisKK2RlZiBBcnJheSh0eXBlY29kZV9vcl90eXBlLCBzaXplX29yX2luaXRpYWxpemVyLCAqKmt3ZHMpOgorICAgICcnJworICAgIFJldHVybnMgYSBzeW5jaHJvbml6ZWQgc2hhcmVkIGFycmF5CisgICAgJycnCisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc2hhcmVkY3R5cGVzIGltcG9ydCBBcnJheQorICAgIHJldHVybiBBcnJheSh0eXBlY29kZV9vcl90eXBlLCBzaXplX29yX2luaXRpYWxpemVyLCAqKmt3ZHMpCisKKyMKKyMKKyMKKworaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisKKyAgICBkZWYgc2V0X2V4ZWN1dGFibGUoZXhlY3V0YWJsZSk6CisgICAgICAgICcnJworICAgICAgICBTZXRzIHRoZSBwYXRoIHRvIGEgcHl0aG9uLmV4ZSBvciBweXRob253LmV4ZSBiaW5hcnkgdXNlZCB0byBydW4KKyAgICAgICAgY2hpbGQgcHJvY2Vzc2VzIG9uIFdpbmRvd3MgaW5zdGVhZCBvZiBzeXMuZXhlY3V0YWJsZS4KKyAgICAgICAgVXNlZnVsIGZvciBwZW9wbGUgZW1iZWRkaW5nIFB5dGhvbi4KKyAgICAgICAgJycnCisgICAgICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IHNldF9leGVjdXRhYmxlCisgICAgICAgIHNldF9leGVjdXRhYmxlKGV4ZWN1dGFibGUpCisKKyAgICBfX2FsbF9fICs9IFsnc2V0X2V4ZWN1dGFibGUnXQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Njg1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5Njg1OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiZjgxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHkKQEAgLTAsMCArMSw0NjUgQEAKKyMKKyMgQSBoaWdoZXIgbGV2ZWwgbW9kdWxlIGZvciB1c2luZyBzb2NrZXRzIChvciBXaW5kb3dzIG5hbWVkIHBpcGVzKQorIworIyBtdWx0aXByb2Nlc3NpbmcvY29ubmVjdGlvbi5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gWyAnQ2xpZW50JywgJ0xpc3RlbmVyJywgJ1BpcGUnIF0KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc29ja2V0CitpbXBvcnQgZXJybm8KK2ltcG9ydCB0aW1lCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBpdGVydG9vbHMKKworaW1wb3J0IF9tdWx0aXByb2Nlc3NpbmcKK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBjdXJyZW50X3Byb2Nlc3MsIEF1dGhlbnRpY2F0aW9uRXJyb3IKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnV0aWwgaW1wb3J0IGdldF90ZW1wX2RpciwgRmluYWxpemUsIHN1Yl9kZWJ1ZywgZGVidWcKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IGR1cGxpY2F0ZSwgY2xvc2UKKworCisjCisjCisjCisKK0JVRlNJWkUgPSA4MTkyCisjIEEgdmVyeSBnZW5lcm91cyB0aW1lb3V0IHdoZW4gaXQgY29tZXMgdG8gbG9jYWwgY29ubmVjdGlvbnMuLi4KK0NPTk5FQ1RJT05fVElNRU9VVCA9IDIwLgorCitfbW1hcF9jb3VudGVyID0gaXRlcnRvb2xzLmNvdW50KCkKKworZGVmYXVsdF9mYW1pbHkgPSAnQUZfSU5FVCcKK2ZhbWlsaWVzID0gWydBRl9JTkVUJ10KKworaWYgaGFzYXR0cihzb2NrZXQsICdBRl9VTklYJyk6CisgICAgZGVmYXVsdF9mYW1pbHkgPSAnQUZfVU5JWCcKKyAgICBmYW1pbGllcyArPSBbJ0FGX1VOSVgnXQorCitpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICBkZWZhdWx0X2ZhbWlseSA9ICdBRl9QSVBFJworICAgIGZhbWlsaWVzICs9IFsnQUZfUElQRSddCisKKworZGVmIF9pbml0X3RpbWVvdXQodGltZW91dD1DT05ORUNUSU9OX1RJTUVPVVQpOgorICAgIHJldHVybiB0aW1lLnRpbWUoKSArIHRpbWVvdXQKKworZGVmIF9jaGVja190aW1lb3V0KHQpOgorICAgIHJldHVybiB0aW1lLnRpbWUoKSA+IHQKKworIworIworIworCitkZWYgYXJiaXRyYXJ5X2FkZHJlc3MoZmFtaWx5KToKKyAgICAnJycKKyAgICBSZXR1cm4gYW4gYXJiaXRyYXJ5IGZyZWUgYWRkcmVzcyBmb3IgdGhlIGdpdmVuIGZhbWlseQorICAgICcnJworICAgIGlmIGZhbWlseSA9PSAnQUZfSU5FVCc6CisgICAgICAgIHJldHVybiAoJ2xvY2FsaG9zdCcsIDApCisgICAgZWxpZiBmYW1pbHkgPT0gJ0FGX1VOSVgnOgorICAgICAgICByZXR1cm4gdGVtcGZpbGUubWt0ZW1wKHByZWZpeD0nbGlzdGVuZXItJywgZGlyPWdldF90ZW1wX2RpcigpKQorICAgIGVsaWYgZmFtaWx5ID09ICdBRl9QSVBFJzoKKyAgICAgICAgcmV0dXJuIHRlbXBmaWxlLm1rdGVtcChwcmVmaXg9cidcXC5ccGlwZVxweWMtJWQtJWQtJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9zLmdldHBpZCgpLCBfbW1hcF9jb3VudGVyLm5leHQoKSkpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5yZWNvZ25pemVkIGZhbWlseScpCisKKworZGVmIGFkZHJlc3NfdHlwZShhZGRyZXNzKToKKyAgICAnJycKKyAgICBSZXR1cm4gdGhlIHR5cGVzIG9mIHRoZSBhZGRyZXNzCisKKyAgICBUaGlzIGNhbiBiZSAnQUZfSU5FVCcsICdBRl9VTklYJywgb3IgJ0FGX1BJUEUnCisgICAgJycnCisgICAgaWYgdHlwZShhZGRyZXNzKSA9PSB0dXBsZToKKyAgICAgICAgcmV0dXJuICdBRl9JTkVUJworICAgIGVsaWYgdHlwZShhZGRyZXNzKSBpcyBzdHIgYW5kIGFkZHJlc3Muc3RhcnRzd2l0aCgnXFxcXCcpOgorICAgICAgICByZXR1cm4gJ0FGX1BJUEUnCisgICAgZWxpZiB0eXBlKGFkZHJlc3MpIGlzIHN0cjoKKyAgICAgICAgcmV0dXJuICdBRl9VTklYJworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2FkZHJlc3MgdHlwZSBvZiAlciB1bnJlY29nbml6ZWQnICUgYWRkcmVzcykKKworIworIyBQdWJsaWMgZnVuY3Rpb25zCisjCisKK2NsYXNzIExpc3RlbmVyKG9iamVjdCk6CisgICAgJycnCisgICAgUmV0dXJucyBhIGxpc3RlbmVyIG9iamVjdC4KKworICAgIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBhIGJvdW5kIHNvY2tldCB3aGljaCBpcyAnbGlzdGVuaW5nJyBmb3IKKyAgICBjb25uZWN0aW9ucywgb3IgZm9yIGEgV2luZG93cyBuYW1lZCBwaXBlLgorICAgICcnJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzPU5vbmUsIGZhbWlseT1Ob25lLCBiYWNrbG9nPTEsIGF1dGhrZXk9Tm9uZSk6CisgICAgICAgIGZhbWlseSA9IGZhbWlseSBvciAoYWRkcmVzcyBhbmQgYWRkcmVzc190eXBlKGFkZHJlc3MpKSBcCisgICAgICAgICAgICAgICAgIG9yIGRlZmF1bHRfZmFtaWx5CisgICAgICAgIGFkZHJlc3MgPSBhZGRyZXNzIG9yIGFyYml0cmFyeV9hZGRyZXNzKGZhbWlseSkKKworICAgICAgICBpZiBmYW1pbHkgPT0gJ0FGX1BJUEUnOgorICAgICAgICAgICAgc2VsZi5fbGlzdGVuZXIgPSBQaXBlTGlzdGVuZXIoYWRkcmVzcywgYmFja2xvZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2xpc3RlbmVyID0gU29ja2V0TGlzdGVuZXIoYWRkcmVzcywgZmFtaWx5LCBiYWNrbG9nKQorCisgICAgICAgIGlmIGF1dGhrZXkgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKGF1dGhrZXksIGJ5dGVzKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ2F1dGhrZXkgc2hvdWxkIGJlIGEgYnl0ZSBzdHJpbmcnCisKKyAgICAgICAgc2VsZi5fYXV0aGtleSA9IGF1dGhrZXkKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBBY2NlcHQgYSBjb25uZWN0aW9uIG9uIHRoZSBib3VuZCBzb2NrZXQgb3IgbmFtZWQgcGlwZSBvZiBgc2VsZmAuCisKKyAgICAgICAgUmV0dXJucyBhIGBDb25uZWN0aW9uYCBvYmplY3QuCisgICAgICAgICcnJworICAgICAgICBjID0gc2VsZi5fbGlzdGVuZXIuYWNjZXB0KCkKKyAgICAgICAgaWYgc2VsZi5fYXV0aGtleToKKyAgICAgICAgICAgIGRlbGl2ZXJfY2hhbGxlbmdlKGMsIHNlbGYuX2F1dGhrZXkpCisgICAgICAgICAgICBhbnN3ZXJfY2hhbGxlbmdlKGMsIHNlbGYuX2F1dGhrZXkpCisgICAgICAgIHJldHVybiBjCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBDbG9zZSB0aGUgYm91bmQgc29ja2V0IG9yIG5hbWVkIHBpcGUgb2YgYHNlbGZgLgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3RlbmVyLmNsb3NlKCkKKworICAgIGFkZHJlc3MgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fbGlzdGVuZXIuX2FkZHJlc3MpCisgICAgbGFzdF9hY2NlcHRlZCA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9saXN0ZW5lci5fbGFzdF9hY2NlcHRlZCkKKworCitkZWYgQ2xpZW50KGFkZHJlc3MsIGZhbWlseT1Ob25lLCBhdXRoa2V5PU5vbmUpOgorICAgICcnJworICAgIFJldHVybnMgYSBjb25uZWN0aW9uIHRvIHRoZSBhZGRyZXNzIG9mIGEgYExpc3RlbmVyYAorICAgICcnJworICAgIGZhbWlseSA9IGZhbWlseSBvciBhZGRyZXNzX3R5cGUoYWRkcmVzcykKKyAgICBpZiBmYW1pbHkgPT0gJ0FGX1BJUEUnOgorICAgICAgICBjID0gUGlwZUNsaWVudChhZGRyZXNzKQorICAgIGVsc2U6CisgICAgICAgIGMgPSBTb2NrZXRDbGllbnQoYWRkcmVzcykKKworICAgIGlmIGF1dGhrZXkgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKGF1dGhrZXksIGJ5dGVzKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnYXV0aGtleSBzaG91bGQgYmUgYSBieXRlIHN0cmluZycKKworICAgIGlmIGF1dGhrZXkgaXMgbm90IE5vbmU6CisgICAgICAgIGFuc3dlcl9jaGFsbGVuZ2UoYywgYXV0aGtleSkKKyAgICAgICAgZGVsaXZlcl9jaGFsbGVuZ2UoYywgYXV0aGtleSkKKworICAgIHJldHVybiBjCisKKworaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisKKyAgICBkZWYgUGlwZShkdXBsZXg9VHJ1ZSk6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm5zIHBhaXIgb2YgY29ubmVjdGlvbiBvYmplY3RzIGF0IGVpdGhlciBlbmQgb2YgYSBwaXBlCisgICAgICAgICcnJworICAgICAgICBpZiBkdXBsZXg6CisgICAgICAgICAgICBzMSwgczIgPSBzb2NrZXQuc29ja2V0cGFpcigpCisgICAgICAgICAgICBzMS5zZXRibG9ja2luZyhUcnVlKQorICAgICAgICAgICAgczIuc2V0YmxvY2tpbmcoVHJ1ZSkKKyAgICAgICAgICAgIGMxID0gX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uKG9zLmR1cChzMS5maWxlbm8oKSkpCisgICAgICAgICAgICBjMiA9IF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbihvcy5kdXAoczIuZmlsZW5vKCkpKQorICAgICAgICAgICAgczEuY2xvc2UoKQorICAgICAgICAgICAgczIuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmQxLCBmZDIgPSBvcy5waXBlKCkKKyAgICAgICAgICAgIGMxID0gX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uKGZkMSwgd3JpdGFibGU9RmFsc2UpCisgICAgICAgICAgICBjMiA9IF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbihmZDIsIHJlYWRhYmxlPUZhbHNlKQorCisgICAgICAgIHJldHVybiBjMSwgYzIKKworZWxzZToKKyAgICBmcm9tIF9tdWx0aXByb2Nlc3NpbmcgaW1wb3J0IHdpbjMyCisKKyAgICBkZWYgUGlwZShkdXBsZXg9VHJ1ZSk6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm5zIHBhaXIgb2YgY29ubmVjdGlvbiBvYmplY3RzIGF0IGVpdGhlciBlbmQgb2YgYSBwaXBlCisgICAgICAgICcnJworICAgICAgICBhZGRyZXNzID0gYXJiaXRyYXJ5X2FkZHJlc3MoJ0FGX1BJUEUnKQorICAgICAgICBpZiBkdXBsZXg6CisgICAgICAgICAgICBvcGVubW9kZSA9IHdpbjMyLlBJUEVfQUNDRVNTX0RVUExFWAorICAgICAgICAgICAgYWNjZXNzID0gd2luMzIuR0VORVJJQ19SRUFEIHwgd2luMzIuR0VORVJJQ19XUklURQorICAgICAgICAgICAgb2JzaXplLCBpYnNpemUgPSBCVUZTSVpFLCBCVUZTSVpFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcGVubW9kZSA9IHdpbjMyLlBJUEVfQUNDRVNTX0lOQk9VTkQKKyAgICAgICAgICAgIGFjY2VzcyA9IHdpbjMyLkdFTkVSSUNfV1JJVEUKKyAgICAgICAgICAgIG9ic2l6ZSwgaWJzaXplID0gMCwgQlVGU0laRQorCisgICAgICAgIGgxID0gd2luMzIuQ3JlYXRlTmFtZWRQaXBlKAorICAgICAgICAgICAgYWRkcmVzcywgb3Blbm1vZGUsCisgICAgICAgICAgICB3aW4zMi5QSVBFX1RZUEVfTUVTU0FHRSB8IHdpbjMyLlBJUEVfUkVBRE1PREVfTUVTU0FHRSB8CisgICAgICAgICAgICB3aW4zMi5QSVBFX1dBSVQsCisgICAgICAgICAgICAxLCBvYnNpemUsIGlic2l6ZSwgd2luMzIuTk1QV0FJVF9XQUlUX0ZPUkVWRVIsIHdpbjMyLk5VTEwKKyAgICAgICAgICAgICkKKyAgICAgICAgaDIgPSB3aW4zMi5DcmVhdGVGaWxlKAorICAgICAgICAgICAgYWRkcmVzcywgYWNjZXNzLCAwLCB3aW4zMi5OVUxMLCB3aW4zMi5PUEVOX0VYSVNUSU5HLCAwLCB3aW4zMi5OVUxMCisgICAgICAgICAgICApCisgICAgICAgIHdpbjMyLlNldE5hbWVkUGlwZUhhbmRsZVN0YXRlKAorICAgICAgICAgICAgaDIsIHdpbjMyLlBJUEVfUkVBRE1PREVfTUVTU0FHRSwgTm9uZSwgTm9uZQorICAgICAgICAgICAgKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpbjMyLkNvbm5lY3ROYW1lZFBpcGUoaDEsIHdpbjMyLk5VTEwpCisgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gIT0gd2luMzIuRVJST1JfUElQRV9DT05ORUNURUQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBjMSA9IF9tdWx0aXByb2Nlc3NpbmcuUGlwZUNvbm5lY3Rpb24oaDEsIHdyaXRhYmxlPWR1cGxleCkKKyAgICAgICAgYzIgPSBfbXVsdGlwcm9jZXNzaW5nLlBpcGVDb25uZWN0aW9uKGgyLCByZWFkYWJsZT1kdXBsZXgpCisKKyAgICAgICAgcmV0dXJuIGMxLCBjMgorCisjCisjIERlZmluaXRpb25zIGZvciBjb25uZWN0aW9ucyBiYXNlZCBvbiBzb2NrZXRzCisjCisKK2NsYXNzIFNvY2tldExpc3RlbmVyKG9iamVjdCk6CisgICAgJycnCisgICAgUmVwcmVzZW50YXRpb24gb2YgYSBzb2NrZXQgd2hpY2ggaXMgYm91bmQgdG8gYW4gYWRkcmVzcyBhbmQgbGlzdGVuaW5nCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3MsIGZhbWlseSwgYmFja2xvZz0xKToKKyAgICAgICAgc2VsZi5fc29ja2V0ID0gc29ja2V0LnNvY2tldChnZXRhdHRyKHNvY2tldCwgZmFtaWx5KSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fc29ja2V0LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgICAgICBzZWxmLl9zb2NrZXQuc2V0YmxvY2tpbmcoVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuX3NvY2tldC5iaW5kKGFkZHJlc3MpCisgICAgICAgICAgICBzZWxmLl9zb2NrZXQubGlzdGVuKGJhY2tsb2cpCisgICAgICAgICAgICBzZWxmLl9hZGRyZXNzID0gc2VsZi5fc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHNlbGYuX3NvY2tldC5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBzZWxmLl9mYW1pbHkgPSBmYW1pbHkKKyAgICAgICAgc2VsZi5fbGFzdF9hY2NlcHRlZCA9IE5vbmUKKworICAgICAgICBpZiBmYW1pbHkgPT0gJ0FGX1VOSVgnOgorICAgICAgICAgICAgc2VsZi5fdW5saW5rID0gRmluYWxpemUoCisgICAgICAgICAgICAgICAgc2VsZiwgb3MudW5saW5rLCBhcmdzPShhZGRyZXNzLCksIGV4aXRwcmlvcml0eT0wCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fdW5saW5rID0gTm9uZQorCisgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgcywgc2VsZi5fbGFzdF9hY2NlcHRlZCA9IHNlbGYuX3NvY2tldC5hY2NlcHQoKQorICAgICAgICBzLnNldGJsb2NraW5nKFRydWUpCisgICAgICAgIGZkID0gZHVwbGljYXRlKHMuZmlsZW5vKCkpCisgICAgICAgIGNvbm4gPSBfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb24oZmQpCisgICAgICAgIHMuY2xvc2UoKQorICAgICAgICByZXR1cm4gY29ubgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9zb2NrZXQuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl91bmxpbmsgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl91bmxpbmsoKQorCisKK2RlZiBTb2NrZXRDbGllbnQoYWRkcmVzcyk6CisgICAgJycnCisgICAgUmV0dXJuIGEgY29ubmVjdGlvbiBvYmplY3QgY29ubmVjdGVkIHRvIHRoZSBzb2NrZXQgZ2l2ZW4gYnkgYGFkZHJlc3NgCisgICAgJycnCisgICAgZmFtaWx5ID0gYWRkcmVzc190eXBlKGFkZHJlc3MpCisgICAgcyA9IHNvY2tldC5zb2NrZXQoIGdldGF0dHIoc29ja2V0LCBmYW1pbHkpICkKKyAgICBzLnNldGJsb2NraW5nKFRydWUpCisgICAgdCA9IF9pbml0X3RpbWVvdXQoKQorCisgICAgd2hpbGUgMToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcy5jb25uZWN0KGFkZHJlc3MpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gIT0gZXJybm8uRUNPTk5SRUZVU0VEIG9yIF9jaGVja190aW1lb3V0KHQpOgorICAgICAgICAgICAgICAgIGRlYnVnKCdmYWlsZWQgdG8gY29ubmVjdCB0byBhZGRyZXNzICVzJywgYWRkcmVzcykKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICByYWlzZQorCisgICAgZmQgPSBkdXBsaWNhdGUocy5maWxlbm8oKSkKKyAgICBjb25uID0gX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uKGZkKQorICAgIHMuY2xvc2UoKQorICAgIHJldHVybiBjb25uCisKKyMKKyMgRGVmaW5pdGlvbnMgZm9yIGNvbm5lY3Rpb25zIGJhc2VkIG9uIG5hbWVkIHBpcGVzCisjCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorCisgICAgY2xhc3MgUGlwZUxpc3RlbmVyKG9iamVjdCk6CisgICAgICAgICcnJworICAgICAgICBSZXByZXNlbnRhdGlvbiBvZiBhIG5hbWVkIHBpcGUKKyAgICAgICAgJycnCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzLCBiYWNrbG9nPU5vbmUpOgorICAgICAgICAgICAgc2VsZi5fYWRkcmVzcyA9IGFkZHJlc3MKKyAgICAgICAgICAgIGhhbmRsZSA9IHdpbjMyLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICAgICAgICAgICAgICBhZGRyZXNzLCB3aW4zMi5QSVBFX0FDQ0VTU19EVVBMRVgsCisgICAgICAgICAgICAgICAgd2luMzIuUElQRV9UWVBFX01FU1NBR0UgfCB3aW4zMi5QSVBFX1JFQURNT0RFX01FU1NBR0UgfAorICAgICAgICAgICAgICAgIHdpbjMyLlBJUEVfV0FJVCwKKyAgICAgICAgICAgICAgICB3aW4zMi5QSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMsIEJVRlNJWkUsIEJVRlNJWkUsCisgICAgICAgICAgICAgICAgd2luMzIuTk1QV0FJVF9XQUlUX0ZPUkVWRVIsIHdpbjMyLk5VTEwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLl9oYW5kbGVfcXVldWUgPSBbaGFuZGxlXQorICAgICAgICAgICAgc2VsZi5fbGFzdF9hY2NlcHRlZCA9IE5vbmUKKworICAgICAgICAgICAgc3ViX2RlYnVnKCdsaXN0ZW5lciBjcmVhdGVkIHdpdGggYWRkcmVzcz0lcicsIHNlbGYuX2FkZHJlc3MpCisKKyAgICAgICAgICAgIHNlbGYuY2xvc2UgPSBGaW5hbGl6ZSgKKyAgICAgICAgICAgICAgICBzZWxmLCBQaXBlTGlzdGVuZXIuX2ZpbmFsaXplX3BpcGVfbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgYXJncz0oc2VsZi5faGFuZGxlX3F1ZXVlLCBzZWxmLl9hZGRyZXNzKSwgZXhpdHByaW9yaXR5PTAKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgZGVmIGFjY2VwdChzZWxmKToKKyAgICAgICAgICAgIG5ld2hhbmRsZSA9IHdpbjMyLkNyZWF0ZU5hbWVkUGlwZSgKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRyZXNzLCB3aW4zMi5QSVBFX0FDQ0VTU19EVVBMRVgsCisgICAgICAgICAgICAgICAgd2luMzIuUElQRV9UWVBFX01FU1NBR0UgfCB3aW4zMi5QSVBFX1JFQURNT0RFX01FU1NBR0UgfAorICAgICAgICAgICAgICAgIHdpbjMyLlBJUEVfV0FJVCwKKyAgICAgICAgICAgICAgICB3aW4zMi5QSVBFX1VOTElNSVRFRF9JTlNUQU5DRVMsIEJVRlNJWkUsIEJVRlNJWkUsCisgICAgICAgICAgICAgICAgd2luMzIuTk1QV0FJVF9XQUlUX0ZPUkVWRVIsIHdpbjMyLk5VTEwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLl9oYW5kbGVfcXVldWUuYXBwZW5kKG5ld2hhbmRsZSkKKyAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYuX2hhbmRsZV9xdWV1ZS5wb3AoMCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aW4zMi5Db25uZWN0TmFtZWRQaXBlKGhhbmRsZSwgd2luMzIuTlVMTCkKKyAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgIyBFUlJPUl9OT19EQVRBIGNhbiBvY2N1ciBpZiBhIGNsaWVudCBoYXMgYWxyZWFkeSBjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgIyB3cml0dGVuIGRhdGEgYW5kIHRoZW4gZGlzY29ubmVjdGVkIC0tIHNlZSBJc3N1ZSAxNDcyNS4KKyAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gbm90IGluICh3aW4zMi5FUlJPUl9QSVBFX0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW4zMi5FUlJPUl9OT19EQVRBKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHJldHVybiBfbXVsdGlwcm9jZXNzaW5nLlBpcGVDb25uZWN0aW9uKGhhbmRsZSkKKworICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiBfZmluYWxpemVfcGlwZV9saXN0ZW5lcihxdWV1ZSwgYWRkcmVzcyk6CisgICAgICAgICAgICBzdWJfZGVidWcoJ2Nsb3NpbmcgbGlzdGVuZXIgd2l0aCBhZGRyZXNzPSVyJywgYWRkcmVzcykKKyAgICAgICAgICAgIGZvciBoYW5kbGUgaW4gcXVldWU6CisgICAgICAgICAgICAgICAgY2xvc2UoaGFuZGxlKQorCisgICAgZGVmIFBpcGVDbGllbnQoYWRkcmVzcyk6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm4gYSBjb25uZWN0aW9uIG9iamVjdCBjb25uZWN0ZWQgdG8gdGhlIHBpcGUgZ2l2ZW4gYnkgYGFkZHJlc3NgCisgICAgICAgICcnJworICAgICAgICB0ID0gX2luaXRfdGltZW91dCgpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luMzIuV2FpdE5hbWVkUGlwZShhZGRyZXNzLCAxMDAwKQorICAgICAgICAgICAgICAgIGggPSB3aW4zMi5DcmVhdGVGaWxlKAorICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCB3aW4zMi5HRU5FUklDX1JFQUQgfCB3aW4zMi5HRU5FUklDX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAwLCB3aW4zMi5OVUxMLCB3aW4zMi5PUEVOX0VYSVNUSU5HLCAwLCB3aW4zMi5OVUxMCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdIG5vdCBpbiAod2luMzIuRVJST1JfU0VNX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luMzIuRVJST1JfUElQRV9CVVNZKSBvciBfY2hlY2tfdGltZW91dCh0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgd2luMzIuU2V0TmFtZWRQaXBlSGFuZGxlU3RhdGUoCisgICAgICAgICAgICBoLCB3aW4zMi5QSVBFX1JFQURNT0RFX01FU1NBR0UsIE5vbmUsIE5vbmUKKyAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIF9tdWx0aXByb2Nlc3NpbmcuUGlwZUNvbm5lY3Rpb24oaCkKKworIworIyBBdXRoZW50aWNhdGlvbiBzdHVmZgorIworCitNRVNTQUdFX0xFTkdUSCA9IDIwCisKK0NIQUxMRU5HRSA9IGInI0NIQUxMRU5HRSMnCitXRUxDT01FID0gYicjV0VMQ09NRSMnCitGQUlMVVJFID0gYicjRkFJTFVSRSMnCisKK2RlZiBkZWxpdmVyX2NoYWxsZW5nZShjb25uZWN0aW9uLCBhdXRoa2V5KToKKyAgICBpbXBvcnQgaG1hYworICAgIGFzc2VydCBpc2luc3RhbmNlKGF1dGhrZXksIGJ5dGVzKQorICAgIG1lc3NhZ2UgPSBvcy51cmFuZG9tKE1FU1NBR0VfTEVOR1RIKQorICAgIGNvbm5lY3Rpb24uc2VuZF9ieXRlcyhDSEFMTEVOR0UgKyBtZXNzYWdlKQorICAgIGRpZ2VzdCA9IGhtYWMubmV3KGF1dGhrZXksIG1lc3NhZ2UpLmRpZ2VzdCgpCisgICAgcmVzcG9uc2UgPSBjb25uZWN0aW9uLnJlY3ZfYnl0ZXMoMjU2KSAgICAgICAgIyByZWplY3QgbGFyZ2UgbWVzc2FnZQorICAgIGlmIHJlc3BvbnNlID09IGRpZ2VzdDoKKyAgICAgICAgY29ubmVjdGlvbi5zZW5kX2J5dGVzKFdFTENPTUUpCisgICAgZWxzZToKKyAgICAgICAgY29ubmVjdGlvbi5zZW5kX2J5dGVzKEZBSUxVUkUpCisgICAgICAgIHJhaXNlIEF1dGhlbnRpY2F0aW9uRXJyb3IoJ2RpZ2VzdCByZWNlaXZlZCB3YXMgd3JvbmcnKQorCitkZWYgYW5zd2VyX2NoYWxsZW5nZShjb25uZWN0aW9uLCBhdXRoa2V5KToKKyAgICBpbXBvcnQgaG1hYworICAgIGFzc2VydCBpc2luc3RhbmNlKGF1dGhrZXksIGJ5dGVzKQorICAgIG1lc3NhZ2UgPSBjb25uZWN0aW9uLnJlY3ZfYnl0ZXMoMjU2KSAgICAgICAgICMgcmVqZWN0IGxhcmdlIG1lc3NhZ2UKKyAgICBhc3NlcnQgbWVzc2FnZVs6bGVuKENIQUxMRU5HRSldID09IENIQUxMRU5HRSwgJ21lc3NhZ2UgPSAlcicgJSBtZXNzYWdlCisgICAgbWVzc2FnZSA9IG1lc3NhZ2VbbGVuKENIQUxMRU5HRSk6XQorICAgIGRpZ2VzdCA9IGhtYWMubmV3KGF1dGhrZXksIG1lc3NhZ2UpLmRpZ2VzdCgpCisgICAgY29ubmVjdGlvbi5zZW5kX2J5dGVzKGRpZ2VzdCkKKyAgICByZXNwb25zZSA9IGNvbm5lY3Rpb24ucmVjdl9ieXRlcygyNTYpICAgICAgICAjIHJlamVjdCBsYXJnZSBtZXNzYWdlCisgICAgaWYgcmVzcG9uc2UgIT0gV0VMQ09NRToKKyAgICAgICAgcmFpc2UgQXV0aGVudGljYXRpb25FcnJvcignZGlnZXN0IHNlbnQgd2FzIHJlamVjdGVkJykKKworIworIyBTdXBwb3J0IGZvciB1c2luZyB4bWxycGNsaWIgZm9yIHNlcmlhbGl6YXRpb24KKyMKKworY2xhc3MgQ29ubmVjdGlvbldyYXBwZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubiwgZHVtcHMsIGxvYWRzKToKKyAgICAgICAgc2VsZi5fY29ubiA9IGNvbm4KKyAgICAgICAgc2VsZi5fZHVtcHMgPSBkdW1wcworICAgICAgICBzZWxmLl9sb2FkcyA9IGxvYWRzCisgICAgICAgIGZvciBhdHRyIGluICgnZmlsZW5vJywgJ2Nsb3NlJywgJ3BvbGwnLCAncmVjdl9ieXRlcycsICdzZW5kX2J5dGVzJyk6CisgICAgICAgICAgICBvYmogPSBnZXRhdHRyKGNvbm4sIGF0dHIpCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIG9iaikKKyAgICBkZWYgc2VuZChzZWxmLCBvYmopOgorICAgICAgICBzID0gc2VsZi5fZHVtcHMob2JqKQorICAgICAgICBzZWxmLl9jb25uLnNlbmRfYnl0ZXMocykKKyAgICBkZWYgcmVjdihzZWxmKToKKyAgICAgICAgcyA9IHNlbGYuX2Nvbm4ucmVjdl9ieXRlcygpCisgICAgICAgIHJldHVybiBzZWxmLl9sb2FkcyhzKQorCitkZWYgX3htbF9kdW1wcyhvYmopOgorICAgIHJldHVybiB4bWxycGNsaWIuZHVtcHMoKG9iaiwpLCBOb25lLCBOb25lLCBOb25lLCAxKS5lbmNvZGUoJ3V0ZjgnKQorCitkZWYgX3htbF9sb2FkcyhzKToKKyAgICAob2JqLCksIG1ldGhvZCA9IHhtbHJwY2xpYi5sb2FkcyhzLmRlY29kZSgndXRmOCcpKQorICAgIHJldHVybiBvYmoKKworY2xhc3MgWG1sTGlzdGVuZXIoTGlzdGVuZXIpOgorICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIGdsb2JhbCB4bWxycGNsaWIKKyAgICAgICAgaW1wb3J0IHhtbHJwY2xpYgorICAgICAgICBvYmogPSBMaXN0ZW5lci5hY2NlcHQoc2VsZikKKyAgICAgICAgcmV0dXJuIENvbm5lY3Rpb25XcmFwcGVyKG9iaiwgX3htbF9kdW1wcywgX3htbF9sb2FkcykKKworZGVmIFhtbENsaWVudCgqYXJncywgKiprd2RzKToKKyAgICBnbG9iYWwgeG1scnBjbGliCisgICAgaW1wb3J0IHhtbHJwY2xpYgorICAgIHJldHVybiBDb25uZWN0aW9uV3JhcHBlcihDbGllbnQoKmFyZ3MsICoqa3dkcyksIF94bWxfZHVtcHMsIF94bWxfbG9hZHMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjY2MzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2Nvbm5lY3Rpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzRjYjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9jb25uZWN0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYjEyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE1MyBAQAorIworIyBTdXBwb3J0IGZvciB0aGUgQVBJIG9mIHRoZSBtdWx0aXByb2Nlc3NpbmcgcGFja2FnZSB1c2luZyB0aHJlYWRzCisjCisjIG11bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gWworICAgICdQcm9jZXNzJywgJ2N1cnJlbnRfcHJvY2VzcycsICdhY3RpdmVfY2hpbGRyZW4nLCAnZnJlZXplX3N1cHBvcnQnLAorICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ0NvbmRpdGlvbicsCisgICAgJ0V2ZW50JywgJ1F1ZXVlJywgJ01hbmFnZXInLCAnUGlwZScsICdQb29sJywgJ0pvaW5hYmxlUXVldWUnCisgICAgXQorCisjCisjIEltcG9ydHMKKyMKKworaW1wb3J0IHRocmVhZGluZworaW1wb3J0IHN5cworaW1wb3J0IHdlYWtyZWYKK2ltcG9ydCBhcnJheQoraW1wb3J0IGl0ZXJ0b29scworCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgVGltZW91dEVycm9yLCBjcHVfY291bnQKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmR1bW15LmNvbm5lY3Rpb24gaW1wb3J0IFBpcGUKK2Zyb20gdGhyZWFkaW5nIGltcG9ydCBMb2NrLCBSTG9jaywgU2VtYXBob3JlLCBCb3VuZGVkU2VtYXBob3JlCitmcm9tIHRocmVhZGluZyBpbXBvcnQgRXZlbnQKK2Zyb20gUXVldWUgaW1wb3J0IFF1ZXVlCisKKyMKKyMKKyMKKworY2xhc3MgRHVtbXlQcm9jZXNzKHRocmVhZGluZy5UaHJlYWQpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdyb3VwPU5vbmUsIHRhcmdldD1Ob25lLCBuYW1lPU5vbmUsIGFyZ3M9KCksIGt3YXJncz17fSk6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZiwgZ3JvdXAsIHRhcmdldCwgbmFtZSwgYXJncywga3dhcmdzKQorICAgICAgICBzZWxmLl9waWQgPSBOb25lCisgICAgICAgIHNlbGYuX2NoaWxkcmVuID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSgpCisgICAgICAgIHNlbGYuX3N0YXJ0X2NhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuX3BhcmVudCA9IGN1cnJlbnRfcHJvY2VzcygpCisKKyAgICBkZWYgc3RhcnQoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLl9wYXJlbnQgaXMgY3VycmVudF9wcm9jZXNzKCkKKyAgICAgICAgc2VsZi5fc3RhcnRfY2FsbGVkID0gVHJ1ZQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX3BhcmVudCwgJ19jaGlsZHJlbicpOgorICAgICAgICAgICAgc2VsZi5fcGFyZW50Ll9jaGlsZHJlbltzZWxmXSA9IE5vbmUKKyAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5zdGFydChzZWxmKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGV4aXRjb2RlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9zdGFydF9jYWxsZWQgYW5kIG5vdCBzZWxmLmlzX2FsaXZlKCk6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworIworIworIworCitjbGFzcyBDb25kaXRpb24odGhyZWFkaW5nLl9Db25kaXRpb24pOgorICAgIG5vdGlmeV9hbGwgPSB0aHJlYWRpbmcuX0NvbmRpdGlvbi5ub3RpZnlfYWxsLmltX2Z1bmMKKworIworIworIworCitQcm9jZXNzID0gRHVtbXlQcm9jZXNzCitjdXJyZW50X3Byb2Nlc3MgPSB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQKK2N1cnJlbnRfcHJvY2VzcygpLl9jaGlsZHJlbiA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorCitkZWYgYWN0aXZlX2NoaWxkcmVuKCk6CisgICAgY2hpbGRyZW4gPSBjdXJyZW50X3Byb2Nlc3MoKS5fY2hpbGRyZW4KKyAgICBmb3IgcCBpbiBsaXN0KGNoaWxkcmVuKToKKyAgICAgICAgaWYgbm90IHAuaXNfYWxpdmUoKToKKyAgICAgICAgICAgIGNoaWxkcmVuLnBvcChwLCBOb25lKQorICAgIHJldHVybiBsaXN0KGNoaWxkcmVuKQorCitkZWYgZnJlZXplX3N1cHBvcnQoKToKKyAgICBwYXNzCisKKyMKKyMKKyMKKworY2xhc3MgTmFtZXNwYWNlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dkcyk6CisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGt3ZHMpCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpdGVtcyA9IHNlbGYuX19kaWN0X18uaXRlbXMoKQorICAgICAgICB0ZW1wID0gW10KKyAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGl0ZW1zOgorICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgnXycpOgorICAgICAgICAgICAgICAgIHRlbXAuYXBwZW5kKCclcz0lcicgJSAobmFtZSwgdmFsdWUpKQorICAgICAgICB0ZW1wLnNvcnQoKQorICAgICAgICByZXR1cm4gJ05hbWVzcGFjZSglcyknICUgc3RyLmpvaW4oJywgJywgdGVtcCkKKworZGljdCA9IGRpY3QKK2xpc3QgPSBsaXN0CisKK2RlZiBBcnJheSh0eXBlY29kZSwgc2VxdWVuY2UsIGxvY2s9VHJ1ZSk6CisgICAgcmV0dXJuIGFycmF5LmFycmF5KHR5cGVjb2RlLCBzZXF1ZW5jZSkKKworY2xhc3MgVmFsdWUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZWNvZGUsIHZhbHVlLCBsb2NrPVRydWUpOgorICAgICAgICBzZWxmLl90eXBlY29kZSA9IHR5cGVjb2RlCisgICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKyAgICBkZWYgX2dldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlCisgICAgZGVmIF9zZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisgICAgdmFsdWUgPSBwcm9wZXJ0eShfZ2V0LCBfc2V0KQorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXIoJXIsICVyKT4nJSh0eXBlKHNlbGYpLl9fbmFtZV9fLHNlbGYuX3R5cGVjb2RlLHNlbGYuX3ZhbHVlKQorCitkZWYgTWFuYWdlcigpOgorICAgIHJldHVybiBzeXMubW9kdWxlc1tfX25hbWVfX10KKworZGVmIHNodXRkb3duKCk6CisgICAgcGFzcworCitkZWYgUG9vbChwcm9jZXNzZXM9Tm9uZSwgaW5pdGlhbGl6ZXI9Tm9uZSwgaW5pdGFyZ3M9KCkpOgorICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nLnBvb2wgaW1wb3J0IFRocmVhZFBvb2wKKyAgICByZXR1cm4gVGhyZWFkUG9vbChwcm9jZXNzZXMsIGluaXRpYWxpemVyLCBpbml0YXJncykKKworSm9pbmFibGVRdWV1ZSA9IFF1ZXVlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU2NjRjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3NjU3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9kdW1teS9jb25uZWN0aW9uLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvY29ubmVjdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGRjOWZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvY29ubmVjdGlvbi5weQpAQCAtMCwwICsxLDg3IEBACisjCisjIEFuYWxvZ3VlIG9mIGBtdWx0aXByb2Nlc3NpbmcuY29ubmVjdGlvbmAgd2hpY2ggdXNlcyBxdWV1ZXMgaW5zdGVhZCBvZiBzb2NrZXRzCisjCisjIG11bHRpcHJvY2Vzc2luZy9kdW1teS9jb25uZWN0aW9uLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK19fYWxsX18gPSBbICdDbGllbnQnLCAnTGlzdGVuZXInLCAnUGlwZScgXQorCitmcm9tIFF1ZXVlIGltcG9ydCBRdWV1ZQorCisKK2ZhbWlsaWVzID0gW05vbmVdCisKKworY2xhc3MgTGlzdGVuZXIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhZGRyZXNzPU5vbmUsIGZhbWlseT1Ob25lLCBiYWNrbG9nPTEpOgorICAgICAgICBzZWxmLl9iYWNrbG9nX3F1ZXVlID0gUXVldWUoYmFja2xvZykKKworICAgIGRlZiBhY2NlcHQoc2VsZik6CisgICAgICAgIHJldHVybiBDb25uZWN0aW9uKCpzZWxmLl9iYWNrbG9nX3F1ZXVlLmdldCgpKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9iYWNrbG9nX3F1ZXVlID0gTm9uZQorCisgICAgYWRkcmVzcyA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9iYWNrbG9nX3F1ZXVlKQorCisKK2RlZiBDbGllbnQoYWRkcmVzcyk6CisgICAgX2luLCBfb3V0ID0gUXVldWUoKSwgUXVldWUoKQorICAgIGFkZHJlc3MucHV0KChfb3V0LCBfaW4pKQorICAgIHJldHVybiBDb25uZWN0aW9uKF9pbiwgX291dCkKKworCitkZWYgUGlwZShkdXBsZXg9VHJ1ZSk6CisgICAgYSwgYiA9IFF1ZXVlKCksIFF1ZXVlKCkKKyAgICByZXR1cm4gQ29ubmVjdGlvbihhLCBiKSwgQ29ubmVjdGlvbihiLCBhKQorCisKK2NsYXNzIENvbm5lY3Rpb24ob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfaW4sIF9vdXQpOgorICAgICAgICBzZWxmLl9vdXQgPSBfb3V0CisgICAgICAgIHNlbGYuX2luID0gX2luCisgICAgICAgIHNlbGYuc2VuZCA9IHNlbGYuc2VuZF9ieXRlcyA9IF9vdXQucHV0CisgICAgICAgIHNlbGYucmVjdiA9IHNlbGYucmVjdl9ieXRlcyA9IF9pbi5nZXQKKworICAgIGRlZiBwb2xsKHNlbGYsIHRpbWVvdXQ9MC4wKToKKyAgICAgICAgaWYgc2VsZi5faW4ucXNpemUoKSA+IDA6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiB0aW1lb3V0IDw9IDAuMDoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzZWxmLl9pbi5ub3RfZW1wdHkuYWNxdWlyZSgpCisgICAgICAgIHNlbGYuX2luLm5vdF9lbXB0eS53YWl0KHRpbWVvdXQpCisgICAgICAgIHNlbGYuX2luLm5vdF9lbXB0eS5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2luLnFzaXplKCkgPiAwCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvY29ubmVjdGlvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkN2RiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZHVtbXkvY29ubmVjdGlvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkN2RiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2R1bW15L2Nvbm5lY3Rpb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDY1YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5CkBAIC0wLDAgKzEsNTEyIEBACisjCisjIE1vZHVsZSBmb3Igc3RhcnRpbmcgYSBwcm9jZXNzIG9iamVjdCB1c2luZyBvcy5mb3JrKCkgb3IgQ3JlYXRlUHJvY2VzcygpCisjCisjIG11bHRpcHJvY2Vzc2luZy9mb3JraW5nLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHNpZ25hbAoraW1wb3J0IGVycm5vCisKK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCB1dGlsLCBwcm9jZXNzCisKK19fYWxsX18gPSBbJ1BvcGVuJywgJ2Fzc2VydF9zcGF3bmluZycsICdleGl0JywgJ2R1cGxpY2F0ZScsICdjbG9zZScsICdGb3JraW5nUGlja2xlciddCisKKyMKKyMgQ2hlY2sgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQgaXMgc3Bhd25pbmcgYSBjaGlsZCBwcm9jZXNzCisjCisKK2RlZiBhc3NlcnRfc3Bhd25pbmcoc2VsZik6CisgICAgaWYgbm90IFBvcGVuLnRocmVhZF9pc19zcGF3bmluZygpOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAnJXMgb2JqZWN0cyBzaG91bGQgb25seSBiZSBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMnCisgICAgICAgICAgICAnIHRocm91Z2ggaW5oZXJpdGFuY2UnICUgdHlwZShzZWxmKS5fX25hbWVfXworICAgICAgICAgICAgKQorCisjCisjIFRyeSBtYWtpbmcgc29tZSBjYWxsYWJsZSB0eXBlcyBwaWNrbGFibGUKKyMKKworZnJvbSBwaWNrbGUgaW1wb3J0IFBpY2tsZXIKK2NsYXNzIEZvcmtpbmdQaWNrbGVyKFBpY2tsZXIpOgorICAgIGRpc3BhdGNoID0gUGlja2xlci5kaXNwYXRjaC5jb3B5KCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiByZWdpc3RlcihjbHMsIHR5cGUsIHJlZHVjZSk6CisgICAgICAgIGRlZiBkaXNwYXRjaGVyKHNlbGYsIG9iaik6CisgICAgICAgICAgICBydiA9IHJlZHVjZShvYmopCisgICAgICAgICAgICBzZWxmLnNhdmVfcmVkdWNlKG9iaj1vYmosICpydikKKyAgICAgICAgY2xzLmRpc3BhdGNoW3R5cGVdID0gZGlzcGF0Y2hlcgorCitkZWYgX3JlZHVjZV9tZXRob2QobSk6CisgICAgaWYgbS5pbV9zZWxmIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBnZXRhdHRyLCAobS5pbV9jbGFzcywgbS5pbV9mdW5jLmZ1bmNfbmFtZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZ2V0YXR0ciwgKG0uaW1fc2VsZiwgbS5pbV9mdW5jLmZ1bmNfbmFtZSkKK0ZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKHR5cGUoRm9ya2luZ1BpY2tsZXIuc2F2ZSksIF9yZWR1Y2VfbWV0aG9kKQorCitkZWYgX3JlZHVjZV9tZXRob2RfZGVzY3JpcHRvcihtKToKKyAgICByZXR1cm4gZ2V0YXR0ciwgKG0uX19vYmpjbGFzc19fLCBtLl9fbmFtZV9fKQorRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIodHlwZShsaXN0LmFwcGVuZCksIF9yZWR1Y2VfbWV0aG9kX2Rlc2NyaXB0b3IpCitGb3JraW5nUGlja2xlci5yZWdpc3Rlcih0eXBlKGludC5fX2FkZF9fKSwgX3JlZHVjZV9tZXRob2RfZGVzY3JpcHRvcikKKworI2RlZiBfcmVkdWNlX2J1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kKG0pOgorIyAgICByZXR1cm4gZ2V0YXR0ciwgKG0uX19zZWxmX18sIG0uX19uYW1lX18pCisjRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIodHlwZShsaXN0KCkuYXBwZW5kKSwgX3JlZHVjZV9idWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZCkKKyNGb3JraW5nUGlja2xlci5yZWdpc3Rlcih0eXBlKGludCgpLl9fYWRkX18pLCBfcmVkdWNlX2J1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kKQorCit0cnk6CisgICAgZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGRlZiBfcmVkdWNlX3BhcnRpYWwocCk6CisgICAgICAgIHJldHVybiBfcmVidWlsZF9wYXJ0aWFsLCAocC5mdW5jLCBwLmFyZ3MsIHAua2V5d29yZHMgb3Ige30pCisgICAgZGVmIF9yZWJ1aWxkX3BhcnRpYWwoZnVuYywgYXJncywga2V5d29yZHMpOgorICAgICAgICByZXR1cm4gcGFydGlhbChmdW5jLCAqYXJncywgKiprZXl3b3JkcykKKyAgICBGb3JraW5nUGlja2xlci5yZWdpc3RlcihwYXJ0aWFsLCBfcmVkdWNlX3BhcnRpYWwpCisKKyMKKyMgVW5peAorIworCitpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICBpbXBvcnQgdGltZQorCisgICAgZXhpdCA9IG9zLl9leGl0CisgICAgZHVwbGljYXRlID0gb3MuZHVwCisgICAgY2xvc2UgPSBvcy5jbG9zZQorCisgICAgIworICAgICMgV2UgZGVmaW5lIGEgUG9wZW4gY2xhc3Mgc2ltaWxhciB0byB0aGUgb25lIGZyb20gc3VicHJvY2VzcywgYnV0CisgICAgIyB3aG9zZSBjb25zdHJ1Y3RvciB0YWtlcyBhIHByb2Nlc3Mgb2JqZWN0IGFzIGl0cyBhcmd1bWVudC4KKyAgICAjCisKKyAgICBjbGFzcyBQb3BlbihvYmplY3QpOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwcm9jZXNzX29iaik6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gTm9uZQorCisgICAgICAgICAgICBzZWxmLnBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgc2VsZi5waWQgPT0gMDoKKyAgICAgICAgICAgICAgICBpZiAncmFuZG9tJyBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICAgICAgICAgICAgICByYW5kb20uc2VlZCgpCisgICAgICAgICAgICAgICAgY29kZSA9IHByb2Nlc3Nfb2JqLl9ib290c3RyYXAoKQorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICAgICAgICAgIG9zLl9leGl0KGNvZGUpCisKKyAgICAgICAgZGVmIHBvbGwoc2VsZiwgZmxhZz1vcy5XTk9IQU5HKToKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwgc3RzID0gb3Mud2FpdHBpZChzZWxmLnBpZCwgZmxhZykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICAjIENoaWxkIHByb2Nlc3Mgbm90IHlldCBjcmVhdGVkLiBTZWUgIzE3MzE3MTcKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZS5lcnJubyA9PSBlcnJuby5FQ0hJTEQgPT0gMTAKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MuV0lGU0lHTkFMRUQoc3RzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IC1vcy5XVEVSTVNJRyhzdHMpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgb3MuV0lGRVhJVEVEKHN0cykKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IG9zLldFWElUU1RBVFVTKHN0cykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKKworICAgICAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBvbGwoMCkKKyAgICAgICAgICAgIGRlYWRsaW5lID0gdGltZS50aW1lKCkgKyB0aW1lb3V0CisgICAgICAgICAgICBkZWxheSA9IDAuMDAwNQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICByZXMgPSBzZWxmLnBvbGwoKQorICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBkZWFkbGluZSAtIHRpbWUudGltZSgpCisgICAgICAgICAgICAgICAgaWYgcmVtYWluaW5nIDw9IDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZGVsYXkgPSBtaW4oZGVsYXkgKiAyLCByZW1haW5pbmcsIDAuMDUpCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcChkZWxheSkKKyAgICAgICAgICAgIHJldHVybiByZXMKKworICAgICAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5raWxsKHNlbGYucGlkLCBzaWduYWwuU0lHVEVSTSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi53YWl0KHRpbWVvdXQ9MC4xKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiB0aHJlYWRfaXNfc3Bhd25pbmcoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisjCisjIFdpbmRvd3MKKyMKKworZWxzZToKKyAgICBpbXBvcnQgdGhyZWFkCisgICAgaW1wb3J0IG1zdmNydAorICAgIGltcG9ydCBfc3VicHJvY2VzcworICAgIGltcG9ydCB0aW1lCisKKyAgICBmcm9tIF9tdWx0aXByb2Nlc3NpbmcgaW1wb3J0IHdpbjMyLCBDb25uZWN0aW9uLCBQaXBlQ29ubmVjdGlvbgorICAgIGZyb20gLnV0aWwgaW1wb3J0IEZpbmFsaXplCisKKyAgICAjdHJ5OgorICAgICMgICAgZnJvbSBjUGlja2xlIGltcG9ydCBkdW1wLCBsb2FkLCBISUdIRVNUX1BST1RPQ09MCisgICAgI2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHBpY2tsZSBpbXBvcnQgbG9hZCwgSElHSEVTVF9QUk9UT0NPTAorCisgICAgZGVmIGR1bXAob2JqLCBmaWxlLCBwcm90b2NvbD1Ob25lKToKKyAgICAgICAgRm9ya2luZ1BpY2tsZXIoZmlsZSwgcHJvdG9jb2wpLmR1bXAob2JqKQorCisgICAgIworICAgICMKKyAgICAjCisKKyAgICBURVJNSU5BVEUgPSAweDEwMDAwCisgICAgV0lORVhFID0gKHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIGFuZCBnZXRhdHRyKHN5cywgJ2Zyb3plbicsIEZhbHNlKSkKKyAgICBXSU5TRVJWSUNFID0gc3lzLmV4ZWN1dGFibGUubG93ZXIoKS5lbmRzd2l0aCgicHl0aG9uc2VydmljZS5leGUiKQorCisgICAgZXhpdCA9IHdpbjMyLkV4aXRQcm9jZXNzCisgICAgY2xvc2UgPSB3aW4zMi5DbG9zZUhhbmRsZQorCisgICAgIworICAgICMgX3B5dGhvbl9leGUgaXMgdGhlIGFzc3VtZWQgcGF0aCB0byB0aGUgcHl0aG9uIGV4ZWN1dGFibGUuCisgICAgIyBQZW9wbGUgZW1iZWRkaW5nIFB5dGhvbiB3YW50IHRvIG1vZGlmeSBpdC4KKyAgICAjCisKKyAgICBpZiBXSU5TRVJWSUNFOgorICAgICAgICBfcHl0aG9uX2V4ZSA9IG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICdweXRob24uZXhlJykKKyAgICBlbHNlOgorICAgICAgICBfcHl0aG9uX2V4ZSA9IHN5cy5leGVjdXRhYmxlCisKKyAgICBkZWYgc2V0X2V4ZWN1dGFibGUoZXhlKToKKyAgICAgICAgZ2xvYmFsIF9weXRob25fZXhlCisgICAgICAgIF9weXRob25fZXhlID0gZXhlCisKKyAgICAjCisgICAgIworICAgICMKKworICAgIGRlZiBkdXBsaWNhdGUoaGFuZGxlLCB0YXJnZXRfcHJvY2Vzcz1Ob25lLCBpbmhlcml0YWJsZT1GYWxzZSk6CisgICAgICAgIGlmIHRhcmdldF9wcm9jZXNzIGlzIE5vbmU6CisgICAgICAgICAgICB0YXJnZXRfcHJvY2VzcyA9IF9zdWJwcm9jZXNzLkdldEN1cnJlbnRQcm9jZXNzKCkKKyAgICAgICAgcmV0dXJuIF9zdWJwcm9jZXNzLkR1cGxpY2F0ZUhhbmRsZSgKKyAgICAgICAgICAgIF9zdWJwcm9jZXNzLkdldEN1cnJlbnRQcm9jZXNzKCksIGhhbmRsZSwgdGFyZ2V0X3Byb2Nlc3MsCisgICAgICAgICAgICAwLCBpbmhlcml0YWJsZSwgX3N1YnByb2Nlc3MuRFVQTElDQVRFX1NBTUVfQUNDRVNTCisgICAgICAgICAgICApLkRldGFjaCgpCisKKyAgICAjCisgICAgIyBXZSBkZWZpbmUgYSBQb3BlbiBjbGFzcyBzaW1pbGFyIHRvIHRoZSBvbmUgZnJvbSBzdWJwcm9jZXNzLCBidXQKKyAgICAjIHdob3NlIGNvbnN0cnVjdG9yIHRha2VzIGEgcHJvY2VzcyBvYmplY3QgYXMgaXRzIGFyZ3VtZW50LgorICAgICMKKworICAgIGNsYXNzIFBvcGVuKG9iamVjdCk6CisgICAgICAgICcnJworICAgICAgICBTdGFydCBhIHN1YnByb2Nlc3MgdG8gcnVuIHRoZSBjb2RlIG9mIGEgcHJvY2VzcyBvYmplY3QKKyAgICAgICAgJycnCisgICAgICAgIF90bHMgPSB0aHJlYWQuX2xvY2FsKCkKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc19vYmopOgorICAgICAgICAgICAgIyBjcmVhdGUgcGlwZSBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIGNoaWxkCisgICAgICAgICAgICByZmQsIHdmZCA9IG9zLnBpcGUoKQorCisgICAgICAgICAgICAjIGdldCBoYW5kbGUgZm9yIHJlYWQgZW5kIG9mIHRoZSBwaXBlIGFuZCBtYWtlIGl0IGluaGVyaXRhYmxlCisgICAgICAgICAgICByaGFuZGxlID0gZHVwbGljYXRlKG1zdmNydC5nZXRfb3NmaGFuZGxlKHJmZCksIGluaGVyaXRhYmxlPVRydWUpCisgICAgICAgICAgICBvcy5jbG9zZShyZmQpCisKKyAgICAgICAgICAgICMgc3RhcnQgcHJvY2VzcworICAgICAgICAgICAgY21kID0gZ2V0X2NvbW1hbmRfbGluZSgpICsgW3JoYW5kbGVdCisgICAgICAgICAgICBjbWQgPSAnICcuam9pbignIiVzIicgJSB4IGZvciB4IGluIGNtZCkKKyAgICAgICAgICAgIGhwLCBodCwgcGlkLCB0aWQgPSBfc3VicHJvY2Vzcy5DcmVhdGVQcm9jZXNzKAorICAgICAgICAgICAgICAgIF9weXRob25fZXhlLCBjbWQsIE5vbmUsIE5vbmUsIDEsIDAsIE5vbmUsIE5vbmUsIE5vbmUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBodC5DbG9zZSgpCisgICAgICAgICAgICBjbG9zZShyaGFuZGxlKQorCisgICAgICAgICAgICAjIHNldCBhdHRyaWJ1dGVzIG9mIHNlbGYKKyAgICAgICAgICAgIHNlbGYucGlkID0gcGlkCisgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBocAorCisgICAgICAgICAgICAjIHNlbmQgaW5mb3JtYXRpb24gdG8gY2hpbGQKKyAgICAgICAgICAgIHByZXBfZGF0YSA9IGdldF9wcmVwYXJhdGlvbl9kYXRhKHByb2Nlc3Nfb2JqLl9uYW1lKQorICAgICAgICAgICAgdG9fY2hpbGQgPSBvcy5mZG9wZW4od2ZkLCAnd2InKQorICAgICAgICAgICAgUG9wZW4uX3Rscy5wcm9jZXNzX2hhbmRsZSA9IGludChocCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkdW1wKHByZXBfZGF0YSwgdG9fY2hpbGQsIEhJR0hFU1RfUFJPVE9DT0wpCisgICAgICAgICAgICAgICAgZHVtcChwcm9jZXNzX29iaiwgdG9fY2hpbGQsIEhJR0hFU1RfUFJPVE9DT0wpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGRlbCBQb3Blbi5fdGxzLnByb2Nlc3NfaGFuZGxlCisgICAgICAgICAgICAgICAgdG9fY2hpbGQuY2xvc2UoKQorCisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIHRocmVhZF9pc19zcGF3bmluZygpOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoUG9wZW4uX3RscywgJ3Byb2Nlc3NfaGFuZGxlJywgTm9uZSkgaXMgbm90IE5vbmUKKworICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgIGRlZiBkdXBsaWNhdGVfZm9yX2NoaWxkKGhhbmRsZSk6CisgICAgICAgICAgICByZXR1cm4gZHVwbGljYXRlKGhhbmRsZSwgUG9wZW4uX3Rscy5wcm9jZXNzX2hhbmRsZSkKKworICAgICAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBtc2VjcyA9IF9zdWJwcm9jZXNzLklORklOSVRFCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbXNlY3MgPSBtYXgoMCwgaW50KHRpbWVvdXQgKiAxMDAwICsgMC41KSkKKworICAgICAgICAgICAgICAgIHJlcyA9IF9zdWJwcm9jZXNzLldhaXRGb3JTaW5nbGVPYmplY3QoaW50KHNlbGYuX2hhbmRsZSksIG1zZWNzKQorICAgICAgICAgICAgICAgIGlmIHJlcyA9PSBfc3VicHJvY2Vzcy5XQUlUX09CSkVDVF8wOgorICAgICAgICAgICAgICAgICAgICBjb2RlID0gX3N1YnByb2Nlc3MuR2V0RXhpdENvZGVQcm9jZXNzKHNlbGYuX2hhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgY29kZSA9PSBURVJNSU5BVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gLXNpZ25hbC5TSUdURVJNCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IGNvZGUKKworICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQorCisgICAgICAgIGRlZiBwb2xsKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYud2FpdCh0aW1lb3V0PTApCisKKyAgICAgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgX3N1YnByb2Nlc3MuVGVybWluYXRlUHJvY2VzcyhpbnQoc2VsZi5faGFuZGxlKSwgVEVSTUlOQVRFKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYud2FpdCh0aW1lb3V0PTAuMSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAjCisgICAgIworICAgICMKKworICAgIGRlZiBpc19mb3JraW5nKGFyZ3YpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHdoZXRoZXIgY29tbWFuZGxpbmUgaW5kaWNhdGVzIHdlIGFyZSBmb3JraW5nCisgICAgICAgICcnJworICAgICAgICBpZiBsZW4oYXJndikgPj0gMiBhbmQgYXJndlsxXSA9PSAnLS1tdWx0aXByb2Nlc3NpbmctZm9yayc6CisgICAgICAgICAgICBhc3NlcnQgbGVuKGFyZ3YpID09IDMKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworCisgICAgZGVmIGZyZWV6ZV9zdXBwb3J0KCk6CisgICAgICAgICcnJworICAgICAgICBSdW4gY29kZSBmb3IgcHJvY2VzcyBvYmplY3QgaWYgdGhpcyBpbiBub3QgdGhlIG1haW4gcHJvY2VzcworICAgICAgICAnJycKKyAgICAgICAgaWYgaXNfZm9ya2luZyhzeXMuYXJndik6CisgICAgICAgICAgICBtYWluKCkKKyAgICAgICAgICAgIHN5cy5leGl0KCkKKworCisgICAgZGVmIGdldF9jb21tYW5kX2xpbmUoKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybnMgcHJlZml4IG9mIGNvbW1hbmQgbGluZSB1c2VkIGZvciBzcGF3bmluZyBhIGNoaWxkIHByb2Nlc3MKKyAgICAgICAgJycnCisgICAgICAgIGlmIGdldGF0dHIocHJvY2Vzcy5jdXJyZW50X3Byb2Nlc3MoKSwgJ19pbmhlcml0aW5nJywgRmFsc2UpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCcnJworICAgICAgICAgICAgQXR0ZW1wdCB0byBzdGFydCBhIG5ldyBwcm9jZXNzIGJlZm9yZSB0aGUgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICBoYXMgZmluaXNoZWQgaXRzIGJvb3RzdHJhcHBpbmcgcGhhc2UuCisKKyAgICAgICAgICAgIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB5b3UgYXJlIG9uIFdpbmRvd3MgYW5kIHlvdSBoYXZlCisgICAgICAgICAgICBmb3Jnb3R0ZW4gdG8gdXNlIHRoZSBwcm9wZXIgaWRpb20gaW4gdGhlIG1haW4gbW9kdWxlOgorCisgICAgICAgICAgICAgICAgaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICAgICAgICAgICAgICAgICAgZnJlZXplX3N1cHBvcnQoKQorICAgICAgICAgICAgICAgICAgICAuLi4KKworICAgICAgICAgICAgVGhlICJmcmVlemVfc3VwcG9ydCgpIiBsaW5lIGNhbiBiZSBvbWl0dGVkIGlmIHRoZSBwcm9ncmFtCisgICAgICAgICAgICBpcyBub3QgZ29pbmcgdG8gYmUgZnJvemVuIHRvIHByb2R1Y2UgYSBXaW5kb3dzIGV4ZWN1dGFibGUuJycnKQorCisgICAgICAgIGlmIGdldGF0dHIoc3lzLCAnZnJvemVuJywgRmFsc2UpOgorICAgICAgICAgICAgcmV0dXJuIFtzeXMuZXhlY3V0YWJsZSwgJy0tbXVsdGlwcm9jZXNzaW5nLWZvcmsnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJvZyA9ICdmcm9tIG11bHRpcHJvY2Vzc2luZy5mb3JraW5nIGltcG9ydCBtYWluOyBtYWluKCknCisgICAgICAgICAgICBvcHRzID0gdXRpbC5fYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCkKKyAgICAgICAgICAgIHJldHVybiBbX3B5dGhvbl9leGVdICsgb3B0cyArIFsnLWMnLCBwcm9nLCAnLS1tdWx0aXByb2Nlc3NpbmctZm9yayddCisKKworICAgIGRlZiBtYWluKCk6CisgICAgICAgICcnJworICAgICAgICBSdW4gY29kZSBzcGVjaWZlZCBieSBkYXRhIHJlY2VpdmVkIG92ZXIgcGlwZQorICAgICAgICAnJycKKyAgICAgICAgYXNzZXJ0IGlzX2Zvcmtpbmcoc3lzLmFyZ3YpCisKKyAgICAgICAgaGFuZGxlID0gaW50KHN5cy5hcmd2Wy0xXSkKKyAgICAgICAgZmQgPSBtc3ZjcnQub3Blbl9vc2ZoYW5kbGUoaGFuZGxlLCBvcy5PX1JET05MWSkKKyAgICAgICAgZnJvbV9wYXJlbnQgPSBvcy5mZG9wZW4oZmQsICdyYicpCisKKyAgICAgICAgcHJvY2Vzcy5jdXJyZW50X3Byb2Nlc3MoKS5faW5oZXJpdGluZyA9IFRydWUKKyAgICAgICAgcHJlcGFyYXRpb25fZGF0YSA9IGxvYWQoZnJvbV9wYXJlbnQpCisgICAgICAgIHByZXBhcmUocHJlcGFyYXRpb25fZGF0YSkKKyAgICAgICAgc2VsZiA9IGxvYWQoZnJvbV9wYXJlbnQpCisgICAgICAgIHByb2Nlc3MuY3VycmVudF9wcm9jZXNzKCkuX2luaGVyaXRpbmcgPSBGYWxzZQorCisgICAgICAgIGZyb21fcGFyZW50LmNsb3NlKCkKKworICAgICAgICBleGl0Y29kZSA9IHNlbGYuX2Jvb3RzdHJhcCgpCisgICAgICAgIGV4aXQoZXhpdGNvZGUpCisKKworICAgIGRlZiBnZXRfcHJlcGFyYXRpb25fZGF0YShuYW1lKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiBpbmZvIGFib3V0IHBhcmVudCBuZWVkZWQgYnkgY2hpbGQgdG8gdW5waWNrbGUgcHJvY2VzcyBvYmplY3QKKyAgICAgICAgJycnCisgICAgICAgIGZyb20gLnV0aWwgaW1wb3J0IF9sb2dnZXIsIF9sb2dfdG9fc3RkZXJyCisKKyAgICAgICAgZCA9IGRpY3QoCisgICAgICAgICAgICBuYW1lPW5hbWUsCisgICAgICAgICAgICBzeXNfcGF0aD1zeXMucGF0aCwKKyAgICAgICAgICAgIHN5c19hcmd2PXN5cy5hcmd2LAorICAgICAgICAgICAgbG9nX3RvX3N0ZGVycj1fbG9nX3RvX3N0ZGVyciwKKyAgICAgICAgICAgIG9yaWdfZGlyPXByb2Nlc3MuT1JJR0lOQUxfRElSLAorICAgICAgICAgICAgYXV0aGtleT1wcm9jZXNzLmN1cnJlbnRfcHJvY2VzcygpLmF1dGhrZXksCisgICAgICAgICAgICApCisKKyAgICAgICAgaWYgX2xvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRbJ2xvZ19sZXZlbCddID0gX2xvZ2dlci5nZXRFZmZlY3RpdmVMZXZlbCgpCisKKyAgICAgICAgaWYgbm90IFdJTkVYRSBhbmQgbm90IFdJTlNFUlZJQ0U6CisgICAgICAgICAgICBtYWluX3BhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzWydfX21haW5fXyddLCAnX19maWxlX18nLCBOb25lKQorICAgICAgICAgICAgaWYgbm90IG1haW5fcGF0aCBhbmQgc3lzLmFyZ3ZbMF0gbm90IGluICgnJywgJy1jJyk6CisgICAgICAgICAgICAgICAgbWFpbl9wYXRoID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgICAgIGlmIG1haW5fcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhtYWluX3BhdGgpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLk9SSUdJTkFMX0RJUiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbWFpbl9wYXRoID0gb3MucGF0aC5qb2luKHByb2Nlc3MuT1JJR0lOQUxfRElSLCBtYWluX3BhdGgpCisgICAgICAgICAgICAgICAgZFsnbWFpbl9wYXRoJ10gPSBvcy5wYXRoLm5vcm1wYXRoKG1haW5fcGF0aCkKKworICAgICAgICByZXR1cm4gZAorCisgICAgIworICAgICMgTWFrZSAoUGlwZSlDb25uZWN0aW9uIHBpY2tsYWJsZQorICAgICMKKworICAgIGRlZiByZWR1Y2VfY29ubmVjdGlvbihjb25uKToKKyAgICAgICAgaWYgbm90IFBvcGVuLnRocmVhZF9pc19zcGF3bmluZygpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICAgICAgICdCeSBkZWZhdWx0ICVzIG9iamVjdHMgY2FuIG9ubHkgYmUgc2hhcmVkIGJldHdlZW4gcHJvY2Vzc2VzXG4nCisgICAgICAgICAgICAgICAgJ3VzaW5nIGluaGVyaXRhbmNlJyAlIHR5cGUoY29ubikuX19uYW1lX18KKyAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiB0eXBlKGNvbm4pLCAoUG9wZW4uZHVwbGljYXRlX2Zvcl9jaGlsZChjb25uLmZpbGVubygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uLnJlYWRhYmxlLCBjb25uLndyaXRhYmxlKQorCisgICAgRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIoQ29ubmVjdGlvbiwgcmVkdWNlX2Nvbm5lY3Rpb24pCisgICAgRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIoUGlwZUNvbm5lY3Rpb24sIHJlZHVjZV9jb25uZWN0aW9uKQorCisjCisjIFByZXBhcmUgY3VycmVudCBwcm9jZXNzCisjCisKK29sZF9tYWluX21vZHVsZXMgPSBbXQorCitkZWYgcHJlcGFyZShkYXRhKToKKyAgICAnJycKKyAgICBUcnkgdG8gZ2V0IGN1cnJlbnQgcHJvY2VzcyByZWFkeSB0byB1bnBpY2tsZSBwcm9jZXNzIG9iamVjdAorICAgICcnJworICAgIG9sZF9tYWluX21vZHVsZXMuYXBwZW5kKHN5cy5tb2R1bGVzWydfX21haW5fXyddKQorCisgICAgaWYgJ25hbWUnIGluIGRhdGE6CisgICAgICAgIHByb2Nlc3MuY3VycmVudF9wcm9jZXNzKCkubmFtZSA9IGRhdGFbJ25hbWUnXQorCisgICAgaWYgJ2F1dGhrZXknIGluIGRhdGE6CisgICAgICAgIHByb2Nlc3MuY3VycmVudF9wcm9jZXNzKCkuX2F1dGhrZXkgPSBkYXRhWydhdXRoa2V5J10KKworICAgIGlmICdsb2dfdG9fc3RkZXJyJyBpbiBkYXRhIGFuZCBkYXRhWydsb2dfdG9fc3RkZXJyJ106CisgICAgICAgIHV0aWwubG9nX3RvX3N0ZGVycigpCisKKyAgICBpZiAnbG9nX2xldmVsJyBpbiBkYXRhOgorICAgICAgICB1dGlsLmdldF9sb2dnZXIoKS5zZXRMZXZlbChkYXRhWydsb2dfbGV2ZWwnXSkKKworICAgIGlmICdzeXNfcGF0aCcgaW4gZGF0YToKKyAgICAgICAgc3lzLnBhdGggPSBkYXRhWydzeXNfcGF0aCddCisKKyAgICBpZiAnc3lzX2FyZ3YnIGluIGRhdGE6CisgICAgICAgIHN5cy5hcmd2ID0gZGF0YVsnc3lzX2FyZ3YnXQorCisgICAgaWYgJ2RpcicgaW4gZGF0YToKKyAgICAgICAgb3MuY2hkaXIoZGF0YVsnZGlyJ10pCisKKyAgICBpZiAnb3JpZ19kaXInIGluIGRhdGE6CisgICAgICAgIHByb2Nlc3MuT1JJR0lOQUxfRElSID0gZGF0YVsnb3JpZ19kaXInXQorCisgICAgaWYgJ21haW5fcGF0aCcgaW4gZGF0YToKKyAgICAgICAgbWFpbl9wYXRoID0gZGF0YVsnbWFpbl9wYXRoJ10KKyAgICAgICAgbWFpbl9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKG1haW5fcGF0aCkpWzBdCisgICAgICAgIGlmIG1haW5fbmFtZSA9PSAnX19pbml0X18nOgorICAgICAgICAgICAgbWFpbl9uYW1lID0gb3MucGF0aC5iYXNlbmFtZShvcy5wYXRoLmRpcm5hbWUobWFpbl9wYXRoKSkKKworICAgICAgICBpZiBtYWluX25hbWUgIT0gJ2lweXRob24nOgorICAgICAgICAgICAgaW1wb3J0IGltcAorCisgICAgICAgICAgICBpZiBtYWluX3BhdGggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkaXJzID0gTm9uZQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmJhc2VuYW1lKG1haW5fcGF0aCkuc3RhcnRzd2l0aCgnX19pbml0X18ucHknKToKKyAgICAgICAgICAgICAgICBkaXJzID0gW29zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUobWFpbl9wYXRoKSldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRpcnMgPSBbb3MucGF0aC5kaXJuYW1lKG1haW5fcGF0aCldCisKKyAgICAgICAgICAgIGFzc2VydCBtYWluX25hbWUgbm90IGluIHN5cy5tb2R1bGVzLCBtYWluX25hbWUKKyAgICAgICAgICAgIGZpbGUsIHBhdGhfbmFtZSwgZXRjID0gaW1wLmZpbmRfbW9kdWxlKG1haW5fbmFtZSwgZGlycykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFdlIHdvdWxkIGxpa2UgdG8gZG8gImltcC5sb2FkX21vZHVsZSgnX19tYWluX18nLCAuLi4pIgorICAgICAgICAgICAgICAgICMgaGVyZS4gIEhvd2V2ZXIsIHRoYXQgd291bGQgY2F1c2UgJ2lmIF9fbmFtZV9fID09CisgICAgICAgICAgICAgICAgIyAiX19tYWluX18iJyBjbGF1c2VzIHRvIGJlIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgIG1haW5fbW9kdWxlID0gaW1wLmxvYWRfbW9kdWxlKAorICAgICAgICAgICAgICAgICAgICAnX19wYXJlbnRzX21haW5fXycsIGZpbGUsIHBhdGhfbmFtZSwgZXRjCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgZmlsZToKKyAgICAgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICAgICAgICAgIHN5cy5tb2R1bGVzWydfX21haW5fXyddID0gbWFpbl9tb2R1bGUKKyAgICAgICAgICAgIG1haW5fbW9kdWxlLl9fbmFtZV9fID0gJ19fbWFpbl9fJworCisgICAgICAgICAgICAjIFRyeSB0byBtYWtlIHRoZSBwb3RlbnRpYWxseSBwaWNrbGFibGUgb2JqZWN0cyBpbgorICAgICAgICAgICAgIyBzeXMubW9kdWxlc1snX19tYWluX18nXSByZWFsaXplIHRoZXkgYXJlIGluIHRoZSBtYWluCisgICAgICAgICAgICAjIG1vZHVsZSAtLSBzb21ld2hhdCB1Z2x5LgorICAgICAgICAgICAgZm9yIG9iaiBpbiBtYWluX21vZHVsZS5fX2RpY3RfXy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIG9iai5fX21vZHVsZV9fID09ICdfX3BhcmVudHNfbWFpbl9fJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9iai5fX21vZHVsZV9fID0gJ19fbWFpbl9fJworICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZm9ya2luZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjYmNkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvZm9ya2luZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyZjNmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2ZvcmtpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2hlYXAucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjM3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5CkBAIC0wLDAgKzEsMjU0IEBACisjCisjIE1vZHVsZSB3aGljaCBzdXBwb3J0cyBhbGxvY2F0aW9uIG9mIG1lbW9yeSBmcm9tIGFuIG1tYXAKKyMKKyMgbXVsdGlwcm9jZXNzaW5nL2hlYXAucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworaW1wb3J0IGJpc2VjdAoraW1wb3J0IG1tYXAKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgaXRlcnRvb2xzCisKK2ltcG9ydCBfbXVsdGlwcm9jZXNzaW5nCitmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBGaW5hbGl6ZSwgaW5mbworZnJvbSBtdWx0aXByb2Nlc3NpbmcuZm9ya2luZyBpbXBvcnQgYXNzZXJ0X3NwYXduaW5nCisKK19fYWxsX18gPSBbJ0J1ZmZlcldyYXBwZXInXQorCisjCisjIEluaGVpcnRhYmxlIGNsYXNzIHdoaWNoIHdyYXBzIGFuIG1tYXAsIGFuZCBmcm9tIHdoaWNoIGJsb2NrcyBjYW4gYmUgYWxsb2NhdGVkCisjCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorCisgICAgZnJvbSBfbXVsdGlwcm9jZXNzaW5nIGltcG9ydCB3aW4zMgorCisgICAgY2xhc3MgQXJlbmEob2JqZWN0KToKKworICAgICAgICBfY291bnRlciA9IGl0ZXJ0b29scy5jb3VudCgpCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemUpOgorICAgICAgICAgICAgc2VsZi5zaXplID0gc2l6ZQorICAgICAgICAgICAgc2VsZi5uYW1lID0gJ3B5bS0lZC0lZCcgJSAob3MuZ2V0cGlkKCksIEFyZW5hLl9jb3VudGVyLm5leHQoKSkKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gbW1hcC5tbWFwKC0xLCBzZWxmLnNpemUsIHRhZ25hbWU9c2VsZi5uYW1lKQorICAgICAgICAgICAgYXNzZXJ0IHdpbjMyLkdldExhc3RFcnJvcigpID09IDAsICd0YWduYW1lIGFscmVhZHkgaW4gdXNlJworICAgICAgICAgICAgc2VsZi5fc3RhdGUgPSAoc2VsZi5zaXplLCBzZWxmLm5hbWUpCisKKyAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgIGFzc2VydF9zcGF3bmluZyhzZWxmKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXRlCisKKyAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICBzZWxmLnNpemUsIHNlbGYubmFtZSA9IHNlbGYuX3N0YXRlID0gc3RhdGUKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gbW1hcC5tbWFwKC0xLCBzZWxmLnNpemUsIHRhZ25hbWU9c2VsZi5uYW1lKQorICAgICAgICAgICAgYXNzZXJ0IHdpbjMyLkdldExhc3RFcnJvcigpID09IHdpbjMyLkVSUk9SX0FMUkVBRFlfRVhJU1RTCisKK2Vsc2U6CisKKyAgICBjbGFzcyBBcmVuYShvYmplY3QpOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzaXplKToKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gbW1hcC5tbWFwKC0xLCBzaXplKQorICAgICAgICAgICAgc2VsZi5zaXplID0gc2l6ZQorICAgICAgICAgICAgc2VsZi5uYW1lID0gTm9uZQorCisjCisjIENsYXNzIGFsbG93aW5nIGFsbG9jYXRpb24gb2YgY2h1bmtzIG9mIG1lbW9yeSBmcm9tIGFyZW5hcworIworCitjbGFzcyBIZWFwKG9iamVjdCk6CisKKyAgICBfYWxpZ25tZW50ID0gOAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNpemU9bW1hcC5QQUdFU0laRSk6CisgICAgICAgIHNlbGYuX2xhc3RwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICBzZWxmLl9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBzZWxmLl9zaXplID0gc2l6ZQorICAgICAgICBzZWxmLl9sZW5ndGhzID0gW10KKyAgICAgICAgc2VsZi5fbGVuX3RvX3NlcSA9IHt9CisgICAgICAgIHNlbGYuX3N0YXJ0X3RvX2Jsb2NrID0ge30KKyAgICAgICAgc2VsZi5fc3RvcF90b19ibG9jayA9IHt9CisgICAgICAgIHNlbGYuX2FsbG9jYXRlZF9ibG9ja3MgPSBzZXQoKQorICAgICAgICBzZWxmLl9hcmVuYXMgPSBbXQorICAgICAgICAjIGxpc3Qgb2YgcGVuZGluZyBibG9ja3MgdG8gZnJlZSAtIHNlZSBmcmVlKCkgY29tbWVudCBiZWxvdworICAgICAgICBzZWxmLl9wZW5kaW5nX2ZyZWVfYmxvY2tzID0gW10KKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgX3JvdW5kdXAobiwgYWxpZ25tZW50KToKKyAgICAgICAgIyBhbGlnbm1lbnQgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAgICAgICAgbWFzayA9IGFsaWdubWVudCAtIDEKKyAgICAgICAgcmV0dXJuIChuICsgbWFzaykgJiB+bWFzaworCisgICAgZGVmIF9tYWxsb2Moc2VsZiwgc2l6ZSk6CisgICAgICAgICMgcmV0dXJucyBhIGxhcmdlIGVub3VnaCBibG9jayAtLSBpdCBtaWdodCBiZSBtdWNoIGxhcmdlcgorICAgICAgICBpID0gYmlzZWN0LmJpc2VjdF9sZWZ0KHNlbGYuX2xlbmd0aHMsIHNpemUpCisgICAgICAgIGlmIGkgPT0gbGVuKHNlbGYuX2xlbmd0aHMpOgorICAgICAgICAgICAgbGVuZ3RoID0gc2VsZi5fcm91bmR1cChtYXgoc2VsZi5fc2l6ZSwgc2l6ZSksIG1tYXAuUEFHRVNJWkUpCisgICAgICAgICAgICBzZWxmLl9zaXplICo9IDIKKyAgICAgICAgICAgIGluZm8oJ2FsbG9jYXRpbmcgYSBuZXcgbW1hcCBvZiBsZW5ndGggJWQnLCBsZW5ndGgpCisgICAgICAgICAgICBhcmVuYSA9IEFyZW5hKGxlbmd0aCkKKyAgICAgICAgICAgIHNlbGYuX2FyZW5hcy5hcHBlbmQoYXJlbmEpCisgICAgICAgICAgICByZXR1cm4gKGFyZW5hLCAwLCBsZW5ndGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsZW5ndGggPSBzZWxmLl9sZW5ndGhzW2ldCisgICAgICAgICAgICBzZXEgPSBzZWxmLl9sZW5fdG9fc2VxW2xlbmd0aF0KKyAgICAgICAgICAgIGJsb2NrID0gc2VxLnBvcCgpCisgICAgICAgICAgICBpZiBub3Qgc2VxOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9sZW5fdG9fc2VxW2xlbmd0aF0sIHNlbGYuX2xlbmd0aHNbaV0KKworICAgICAgICAoYXJlbmEsIHN0YXJ0LCBzdG9wKSA9IGJsb2NrCisgICAgICAgIGRlbCBzZWxmLl9zdGFydF90b19ibG9ja1soYXJlbmEsIHN0YXJ0KV0KKyAgICAgICAgZGVsIHNlbGYuX3N0b3BfdG9fYmxvY2tbKGFyZW5hLCBzdG9wKV0KKyAgICAgICAgcmV0dXJuIGJsb2NrCisKKyAgICBkZWYgX2ZyZWUoc2VsZiwgYmxvY2spOgorICAgICAgICAjIGZyZWUgbG9jYXRpb24gYW5kIHRyeSB0byBtZXJnZSB3aXRoIG5laWdoYm91cnMKKyAgICAgICAgKGFyZW5hLCBzdGFydCwgc3RvcCkgPSBibG9jaworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByZXZfYmxvY2sgPSBzZWxmLl9zdG9wX3RvX2Jsb2NrWyhhcmVuYSwgc3RhcnQpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdGFydCwgXyA9IHNlbGYuX2Fic29yYihwcmV2X2Jsb2NrKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHRfYmxvY2sgPSBzZWxmLl9zdGFydF90b19ibG9ja1soYXJlbmEsIHN0b3ApXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfLCBzdG9wID0gc2VsZi5fYWJzb3JiKG5leHRfYmxvY2spCisKKyAgICAgICAgYmxvY2sgPSAoYXJlbmEsIHN0YXJ0LCBzdG9wKQorICAgICAgICBsZW5ndGggPSBzdG9wIC0gc3RhcnQKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9sZW5fdG9fc2VxW2xlbmd0aF0uYXBwZW5kKGJsb2NrKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLl9sZW5fdG9fc2VxW2xlbmd0aF0gPSBbYmxvY2tdCisgICAgICAgICAgICBiaXNlY3QuaW5zb3J0KHNlbGYuX2xlbmd0aHMsIGxlbmd0aCkKKworICAgICAgICBzZWxmLl9zdGFydF90b19ibG9ja1soYXJlbmEsIHN0YXJ0KV0gPSBibG9jaworICAgICAgICBzZWxmLl9zdG9wX3RvX2Jsb2NrWyhhcmVuYSwgc3RvcCldID0gYmxvY2sKKworICAgIGRlZiBfYWJzb3JiKHNlbGYsIGJsb2NrKToKKyAgICAgICAgIyBkZXJlZ2lzdGVyIHRoaXMgYmxvY2sgc28gaXQgY2FuIGJlIG1lcmdlZCB3aXRoIGEgbmVpZ2hib3VyCisgICAgICAgIChhcmVuYSwgc3RhcnQsIHN0b3ApID0gYmxvY2sKKyAgICAgICAgZGVsIHNlbGYuX3N0YXJ0X3RvX2Jsb2NrWyhhcmVuYSwgc3RhcnQpXQorICAgICAgICBkZWwgc2VsZi5fc3RvcF90b19ibG9ja1soYXJlbmEsIHN0b3ApXQorCisgICAgICAgIGxlbmd0aCA9IHN0b3AgLSBzdGFydAorICAgICAgICBzZXEgPSBzZWxmLl9sZW5fdG9fc2VxW2xlbmd0aF0KKyAgICAgICAgc2VxLnJlbW92ZShibG9jaykKKyAgICAgICAgaWYgbm90IHNlcToKKyAgICAgICAgICAgIGRlbCBzZWxmLl9sZW5fdG9fc2VxW2xlbmd0aF0KKyAgICAgICAgICAgIHNlbGYuX2xlbmd0aHMucmVtb3ZlKGxlbmd0aCkKKworICAgICAgICByZXR1cm4gc3RhcnQsIHN0b3AKKworICAgIGRlZiBfZnJlZV9wZW5kaW5nX2Jsb2NrcyhzZWxmKToKKyAgICAgICAgIyBGcmVlIGFsbCB0aGUgYmxvY2tzIGluIHRoZSBwZW5kaW5nIGxpc3QgLSBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkLgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJsb2NrID0gc2VsZi5fcGVuZGluZ19mcmVlX2Jsb2Nrcy5wb3AoKQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuX2FsbG9jYXRlZF9ibG9ja3MucmVtb3ZlKGJsb2NrKQorICAgICAgICAgICAgc2VsZi5fZnJlZShibG9jaykKKworICAgIGRlZiBmcmVlKHNlbGYsIGJsb2NrKToKKyAgICAgICAgIyBmcmVlIGEgYmxvY2sgcmV0dXJuZWQgYnkgbWFsbG9jKCkKKyAgICAgICAgIyBTaW5jZSBmcmVlKCkgY2FuIGJlIGNhbGxlZCBhc3luY2hyb25vdXNseSBieSB0aGUgR0MsIGl0IGNvdWxkIGhhcHBlbgorICAgICAgICAjIHRoYXQgaXQncyBjYWxsZWQgd2hpbGUgc2VsZi5fbG9jayBpcyBoZWxkOiBpbiB0aGF0IGNhc2UsCisgICAgICAgICMgc2VsZi5fbG9jay5hY3F1aXJlKCkgd291bGQgZGVhZGxvY2sgKGlzc3VlICMxMjM1MikuIFRvIGF2b2lkIHRoYXQsIGEKKyAgICAgICAgIyB0cnlsb2NrIGlzIHVzZWQgaW5zdGVhZCwgYW5kIGlmIHRoZSBsb2NrIGNhbid0IGJlIGFjcXVpcmVkCisgICAgICAgICMgaW1tZWRpYXRlbHksIHRoZSBibG9jayBpcyBhZGRlZCB0byBhIGxpc3Qgb2YgYmxvY2tzIHRvIGJlIGZyZWVkCisgICAgICAgICMgc3luY2hyb25vdXNseSBzb21ldGltZXMgbGF0ZXIgZnJvbSBtYWxsb2MoKSBvciBmcmVlKCksIGJ5IGNhbGxpbmcKKyAgICAgICAgIyBfZnJlZV9wZW5kaW5nX2Jsb2NrcygpIChhcHBlbmRpbmcgYW5kIHJldHJpZXZpbmcgZnJvbSBhIGxpc3QgaXMgbm90CisgICAgICAgICMgc3RyaWN0bHkgdGhyZWFkLXNhZmUgYnV0IHVuZGVyIGNQeXRob24gaXQncyBhdG9taWMgdGhhbmtzIHRvIHRoZSBHSUwpLgorICAgICAgICBhc3NlcnQgb3MuZ2V0cGlkKCkgPT0gc2VsZi5fbGFzdHBpZAorICAgICAgICBpZiBub3Qgc2VsZi5fbG9jay5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgICMgY2FuJ3QgYWNxdWlyZSB0aGUgbG9jayByaWdodCBub3csIGFkZCB0aGUgYmxvY2sgdG8gdGhlIGxpc3Qgb2YKKyAgICAgICAgICAgICMgcGVuZGluZyBibG9ja3MgdG8gZnJlZQorICAgICAgICAgICAgc2VsZi5fcGVuZGluZ19mcmVlX2Jsb2Nrcy5hcHBlbmQoYmxvY2spCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHdlIGhvbGQgdGhlIGxvY2sKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9mcmVlX3BlbmRpbmdfYmxvY2tzKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9hbGxvY2F0ZWRfYmxvY2tzLnJlbW92ZShibG9jaykKKyAgICAgICAgICAgICAgICBzZWxmLl9mcmVlKGJsb2NrKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIG1hbGxvYyhzZWxmLCBzaXplKToKKyAgICAgICAgIyByZXR1cm4gYSBibG9jayBvZiByaWdodCBzaXplIChwb3NzaWJseSByb3VuZGVkIHVwKQorICAgICAgICBhc3NlcnQgMCA8PSBzaXplIDwgc3lzLm1heGludAorICAgICAgICBpZiBvcy5nZXRwaWQoKSAhPSBzZWxmLl9sYXN0cGlkOgorICAgICAgICAgICAgc2VsZi5fX2luaXRfXygpICAgICAgICAgICAgICAgICAgICAgIyByZWluaXRpYWxpemUgYWZ0ZXIgZm9yaworICAgICAgICBzZWxmLl9sb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLl9mcmVlX3BlbmRpbmdfYmxvY2tzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2l6ZSA9IHNlbGYuX3JvdW5kdXAobWF4KHNpemUsMSksIHNlbGYuX2FsaWdubWVudCkKKyAgICAgICAgICAgIChhcmVuYSwgc3RhcnQsIHN0b3ApID0gc2VsZi5fbWFsbG9jKHNpemUpCisgICAgICAgICAgICBuZXdfc3RvcCA9IHN0YXJ0ICsgc2l6ZQorICAgICAgICAgICAgaWYgbmV3X3N0b3AgPCBzdG9wOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZyZWUoKGFyZW5hLCBuZXdfc3RvcCwgc3RvcCkpCisgICAgICAgICAgICBibG9jayA9IChhcmVuYSwgc3RhcnQsIG5ld19zdG9wKQorICAgICAgICAgICAgc2VsZi5fYWxsb2NhdGVkX2Jsb2Nrcy5hZGQoYmxvY2spCisgICAgICAgICAgICByZXR1cm4gYmxvY2sKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2xvY2sucmVsZWFzZSgpCisKKyMKKyMgQ2xhc3MgcmVwcmVzZW50aW5nIGEgY2h1bmsgb2YgYW4gbW1hcCAtLSBjYW4gYmUgaW5oZXJpdGVkCisjCisKK2NsYXNzIEJ1ZmZlcldyYXBwZXIob2JqZWN0KToKKworICAgIF9oZWFwID0gSGVhcCgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2l6ZSk6CisgICAgICAgIGFzc2VydCAwIDw9IHNpemUgPCBzeXMubWF4aW50CisgICAgICAgIGJsb2NrID0gQnVmZmVyV3JhcHBlci5faGVhcC5tYWxsb2Moc2l6ZSkKKyAgICAgICAgc2VsZi5fc3RhdGUgPSAoYmxvY2ssIHNpemUpCisgICAgICAgIEZpbmFsaXplKHNlbGYsIEJ1ZmZlcldyYXBwZXIuX2hlYXAuZnJlZSwgYXJncz0oYmxvY2ssKSkKKworICAgIGRlZiBnZXRfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgKGFyZW5hLCBzdGFydCwgc3RvcCksIHNpemUgPSBzZWxmLl9zdGF0ZQorICAgICAgICBhZGRyZXNzLCBsZW5ndGggPSBfbXVsdGlwcm9jZXNzaW5nLmFkZHJlc3Nfb2ZfYnVmZmVyKGFyZW5hLmJ1ZmZlcikKKyAgICAgICAgYXNzZXJ0IHNpemUgPD0gbGVuZ3RoCisgICAgICAgIHJldHVybiBhZGRyZXNzICsgc3RhcnQKKworICAgIGRlZiBnZXRfc2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3N0YXRlWzFdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2hlYXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMjkwN2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL2hlYXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjBkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9oZWFwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL21hbmFnZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTU4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weQpAQCAtMCwwICsxLDExMTYgQEAKKyMKKyMgTW9kdWxlIHByb3ZpZGluZyB0aGUgYFN5bmNNYW5hZ2VyYCBjbGFzcyBmb3IgZGVhbGluZworIyB3aXRoIHNoYXJlZCBvYmplY3RzCisjCisjIG11bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gWyAnQmFzZU1hbmFnZXInLCAnU3luY01hbmFnZXInLCAnQmFzZVByb3h5JywgJ1Rva2VuJyBdCisKKyMKKyMgSW1wb3J0cworIworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgYXJyYXkKK2ltcG9ydCBRdWV1ZQorCitmcm9tIHRyYWNlYmFjayBpbXBvcnQgZm9ybWF0X2V4YworZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IFByb2Nlc3MsIGN1cnJlbnRfcHJvY2VzcywgYWN0aXZlX2NoaWxkcmVuLCBQb29sLCB1dGlsLCBjb25uZWN0aW9uCitmcm9tIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzIGltcG9ydCBBdXRoZW50aWNhdGlvblN0cmluZworZnJvbSBtdWx0aXByb2Nlc3NpbmcuZm9ya2luZyBpbXBvcnQgZXhpdCwgUG9wZW4sIGFzc2VydF9zcGF3bmluZywgRm9ya2luZ1BpY2tsZXIKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnV0aWwgaW1wb3J0IEZpbmFsaXplLCBpbmZvCisKK3RyeToKKyAgICBmcm9tIGNQaWNrbGUgaW1wb3J0IFBpY2tsaW5nRXJyb3IKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHBpY2tsZSBpbXBvcnQgUGlja2xpbmdFcnJvcgorCisjCisjIFJlZ2lzdGVyIHNvbWUgdGhpbmdzIGZvciBwaWNrbGluZworIworCitkZWYgcmVkdWNlX2FycmF5KGEpOgorICAgIHJldHVybiBhcnJheS5hcnJheSwgKGEudHlwZWNvZGUsIGEudG9zdHJpbmcoKSkKK0ZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKGFycmF5LmFycmF5LCByZWR1Y2VfYXJyYXkpCisKK3ZpZXdfdHlwZXMgPSBbdHlwZShnZXRhdHRyKHt9LCBuYW1lKSgpKSBmb3IgbmFtZSBpbiAoJ2l0ZW1zJywna2V5cycsJ3ZhbHVlcycpXQorCisjCisjIFR5cGUgZm9yIGlkZW50aWZ5aW5nIHNoYXJlZCBvYmplY3RzCisjCisKK2NsYXNzIFRva2VuKG9iamVjdCk6CisgICAgJycnCisgICAgVHlwZSB0byB1bmlxdWVseSBpbmRlbnRpZnkgYSBzaGFyZWQgb2JqZWN0CisgICAgJycnCisgICAgX19zbG90c19fID0gKCd0eXBlaWQnLCAnYWRkcmVzcycsICdpZCcpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZWlkLCBhZGRyZXNzLCBpZCk6CisgICAgICAgIChzZWxmLnR5cGVpZCwgc2VsZi5hZGRyZXNzLCBzZWxmLmlkKSA9ICh0eXBlaWQsIGFkZHJlc3MsIGlkKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLnR5cGVpZCwgc2VsZi5hZGRyZXNzLCBzZWxmLmlkKQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIChzZWxmLnR5cGVpZCwgc2VsZi5hZGRyZXNzLCBzZWxmLmlkKSA9IHN0YXRlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnVG9rZW4odHlwZWlkPSVyLCBhZGRyZXNzPSVyLCBpZD0lciknICUgXAorICAgICAgICAgICAgICAgKHNlbGYudHlwZWlkLCBzZWxmLmFkZHJlc3MsIHNlbGYuaWQpCisKKyMKKyMgRnVuY3Rpb24gZm9yIGNvbW11bmljYXRpb24gd2l0aCBhIG1hbmFnZXIncyBzZXJ2ZXIgcHJvY2VzcworIworCitkZWYgZGlzcGF0Y2goYywgaWQsIG1ldGhvZG5hbWUsIGFyZ3M9KCksIGt3ZHM9e30pOgorICAgICcnJworICAgIFNlbmQgYSBtZXNzYWdlIHRvIG1hbmFnZXIgdXNpbmcgY29ubmVjdGlvbiBgY2AgYW5kIHJldHVybiByZXNwb25zZQorICAgICcnJworICAgIGMuc2VuZCgoaWQsIG1ldGhvZG5hbWUsIGFyZ3MsIGt3ZHMpKQorICAgIGtpbmQsIHJlc3VsdCA9IGMucmVjdigpCisgICAgaWYga2luZCA9PSAnI1JFVFVSTic6CisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICByYWlzZSBjb252ZXJ0X3RvX2Vycm9yKGtpbmQsIHJlc3VsdCkKKworZGVmIGNvbnZlcnRfdG9fZXJyb3Ioa2luZCwgcmVzdWx0KToKKyAgICBpZiBraW5kID09ICcjRVJST1InOgorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgZWxpZiBraW5kID09ICcjVFJBQ0VCQUNLJzoKKyAgICAgICAgYXNzZXJ0IHR5cGUocmVzdWx0KSBpcyBzdHIKKyAgICAgICAgcmV0dXJuICBSZW1vdGVFcnJvcihyZXN1bHQpCisgICAgZWxpZiBraW5kID09ICcjVU5TRVJJQUxJWkFCTEUnOgorICAgICAgICBhc3NlcnQgdHlwZShyZXN1bHQpIGlzIHN0cgorICAgICAgICByZXR1cm4gUmVtb3RlRXJyb3IoJ1Vuc2VyaWFsaXphYmxlIG1lc3NhZ2U6ICVzXG4nICUgcmVzdWx0KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBWYWx1ZUVycm9yKCdVbnJlY29nbml6ZWQgbWVzc2FnZSB0eXBlJykKKworY2xhc3MgUmVtb3RlRXJyb3IoRXhjZXB0aW9uKToKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgnXG4nICsgJy0nKjc1ICsgJ1xuJyArIHN0cihzZWxmLmFyZ3NbMF0pICsgJy0nKjc1KQorCisjCisjIEZ1bmN0aW9ucyBmb3IgZmluZGluZyB0aGUgbWV0aG9kIG5hbWVzIG9mIGFuIG9iamVjdAorIworCitkZWYgYWxsX21ldGhvZHMob2JqKToKKyAgICAnJycKKyAgICBSZXR1cm4gYSBsaXN0IG9mIG5hbWVzIG9mIG1ldGhvZHMgb2YgYG9iamAKKyAgICAnJycKKyAgICB0ZW1wID0gW10KKyAgICBmb3IgbmFtZSBpbiBkaXIob2JqKToKKyAgICAgICAgZnVuYyA9IGdldGF0dHIob2JqLCBuYW1lKQorICAgICAgICBpZiBoYXNhdHRyKGZ1bmMsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgdGVtcC5hcHBlbmQobmFtZSkKKyAgICByZXR1cm4gdGVtcAorCitkZWYgcHVibGljX21ldGhvZHMob2JqKToKKyAgICAnJycKKyAgICBSZXR1cm4gYSBsaXN0IG9mIG5hbWVzIG9mIG1ldGhvZHMgb2YgYG9iamAgd2hpY2ggZG8gbm90IHN0YXJ0IHdpdGggJ18nCisgICAgJycnCisgICAgcmV0dXJuIFtuYW1lIGZvciBuYW1lIGluIGFsbF9tZXRob2RzKG9iaikgaWYgbmFtZVswXSAhPSAnXyddCisKKyMKKyMgU2VydmVyIHdoaWNoIGlzIHJ1biBpbiBhIHByb2Nlc3MgY29udHJvbGxlZCBieSBhIG1hbmFnZXIKKyMKKworY2xhc3MgU2VydmVyKG9iamVjdCk6CisgICAgJycnCisgICAgU2VydmVyIGNsYXNzIHdoaWNoIHJ1bnMgaW4gYSBwcm9jZXNzIGNvbnRyb2xsZWQgYnkgYSBtYW5hZ2VyIG9iamVjdAorICAgICcnJworICAgIHB1YmxpYyA9IFsnc2h1dGRvd24nLCAnY3JlYXRlJywgJ2FjY2VwdF9jb25uZWN0aW9uJywgJ2dldF9tZXRob2RzJywKKyAgICAgICAgICAgICAgJ2RlYnVnX2luZm8nLCAnbnVtYmVyX29mX29iamVjdHMnLCAnZHVtbXknLCAnaW5jcmVmJywgJ2RlY3JlZiddCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVnaXN0cnksIGFkZHJlc3MsIGF1dGhrZXksIHNlcmlhbGl6ZXIpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShhdXRoa2V5LCBieXRlcykKKyAgICAgICAgc2VsZi5yZWdpc3RyeSA9IHJlZ2lzdHJ5CisgICAgICAgIHNlbGYuYXV0aGtleSA9IEF1dGhlbnRpY2F0aW9uU3RyaW5nKGF1dGhrZXkpCisgICAgICAgIExpc3RlbmVyLCBDbGllbnQgPSBsaXN0ZW5lcl9jbGllbnRbc2VyaWFsaXplcl0KKworICAgICAgICAjIGRvIGF1dGhlbnRpY2F0aW9uIGxhdGVyCisgICAgICAgIHNlbGYubGlzdGVuZXIgPSBMaXN0ZW5lcihhZGRyZXNzPWFkZHJlc3MsIGJhY2tsb2c9MTYpCisgICAgICAgIHNlbGYuYWRkcmVzcyA9IHNlbGYubGlzdGVuZXIuYWRkcmVzcworCisgICAgICAgIHNlbGYuaWRfdG9fb2JqID0geycwJzogKE5vbmUsICgpKX0KKyAgICAgICAgc2VsZi5pZF90b19yZWZjb3VudCA9IHt9CisgICAgICAgIHNlbGYubXV0ZXggPSB0aHJlYWRpbmcuUkxvY2soKQorICAgICAgICBzZWxmLnN0b3AgPSAwCisKKyAgICBkZWYgc2VydmVfZm9yZXZlcihzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFJ1biB0aGUgc2VydmVyIGZvcmV2ZXIKKyAgICAgICAgJycnCisgICAgICAgIGN1cnJlbnRfcHJvY2VzcygpLl9tYW5hZ2VyX3NlcnZlciA9IHNlbGYKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBzZWxmLmxpc3RlbmVyLmFjY2VwdCgpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5oYW5kbGVfcmVxdWVzdCwgYXJncz0oYywpKQorICAgICAgICAgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnN0b3AgPSA5OTkKKyAgICAgICAgICAgIHNlbGYubGlzdGVuZXIuY2xvc2UoKQorCisgICAgZGVmIGhhbmRsZV9yZXF1ZXN0KHNlbGYsIGMpOgorICAgICAgICAnJycKKyAgICAgICAgSGFuZGxlIGEgbmV3IGNvbm5lY3Rpb24KKyAgICAgICAgJycnCisgICAgICAgIGZ1bmNuYW1lID0gcmVzdWx0ID0gcmVxdWVzdCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29ubmVjdGlvbi5kZWxpdmVyX2NoYWxsZW5nZShjLCBzZWxmLmF1dGhrZXkpCisgICAgICAgICAgICBjb25uZWN0aW9uLmFuc3dlcl9jaGFsbGVuZ2UoYywgc2VsZi5hdXRoa2V5KQorICAgICAgICAgICAgcmVxdWVzdCA9IGMucmVjdigpCisgICAgICAgICAgICBpZ25vcmUsIGZ1bmNuYW1lLCBhcmdzLCBrd2RzID0gcmVxdWVzdAorICAgICAgICAgICAgYXNzZXJ0IGZ1bmNuYW1lIGluIHNlbGYucHVibGljLCAnJXIgdW5yZWNvZ25pemVkJyAlIGZ1bmNuYW1lCisgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihzZWxmLCBmdW5jbmFtZSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIG1zZyA9ICgnI1RSQUNFQkFDSycsIGZvcm1hdF9leGMoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKGMsICphcmdzLCAqKmt3ZHMpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIG1zZyA9ICgnI1RSQUNFQkFDSycsIGZvcm1hdF9leGMoKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbXNnID0gKCcjUkVUVVJOJywgcmVzdWx0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjLnNlbmQobXNnKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGMuc2VuZCgoJyNUUkFDRUJBQ0snLCBmb3JtYXRfZXhjKCkpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB1dGlsLmluZm8oJ0ZhaWx1cmUgdG8gc2VuZCBtZXNzYWdlOiAlcicsIG1zZykKKyAgICAgICAgICAgIHV0aWwuaW5mbygnIC4uLiByZXF1ZXN0IHdhcyAlcicsIHJlcXVlc3QpCisgICAgICAgICAgICB1dGlsLmluZm8oJyAuLi4gZXhjZXB0aW9uIHdhcyAlcicsIGUpCisKKyAgICAgICAgYy5jbG9zZSgpCisKKyAgICBkZWYgc2VydmVfY2xpZW50KHNlbGYsIGNvbm4pOgorICAgICAgICAnJycKKyAgICAgICAgSGFuZGxlIHJlcXVlc3RzIGZyb20gdGhlIHByb3hpZXMgaW4gYSBwYXJ0aWN1bGFyIHByb2Nlc3MvdGhyZWFkCisgICAgICAgICcnJworICAgICAgICB1dGlsLmRlYnVnKCdzdGFydGluZyBzZXJ2ZXIgdGhyZWFkIHRvIHNlcnZpY2UgJXInLAorICAgICAgICAgICAgICAgICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUpCisKKyAgICAgICAgcmVjdiA9IGNvbm4ucmVjdgorICAgICAgICBzZW5kID0gY29ubi5zZW5kCisgICAgICAgIGlkX3RvX29iaiA9IHNlbGYuaWRfdG9fb2JqCisKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuc3RvcDoKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1ldGhvZG5hbWUgPSBvYmogPSBOb25lCisgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHJlY3YoKQorICAgICAgICAgICAgICAgIGlkZW50LCBtZXRob2RuYW1lLCBhcmdzLCBrd2RzID0gcmVxdWVzdAorICAgICAgICAgICAgICAgIG9iaiwgZXhwb3NlZCwgZ2V0dHlwZWlkID0gaWRfdG9fb2JqW2lkZW50XQorCisgICAgICAgICAgICAgICAgaWYgbWV0aG9kbmFtZSBub3QgaW4gZXhwb3NlZDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAnbWV0aG9kICVyIG9mICVyIG9iamVjdCBpcyBub3QgaW4gZXhwb3NlZD0lcicgJQorICAgICAgICAgICAgICAgICAgICAgICAgKG1ldGhvZG5hbWUsIHR5cGUob2JqKSwgZXhwb3NlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gZ2V0YXR0cihvYmosIG1ldGhvZG5hbWUpCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGZ1bmN0aW9uKCphcmdzLCAqKmt3ZHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gKCcjRVJST1InLCBlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHR5cGVpZCA9IGdldHR5cGVpZCBhbmQgZ2V0dHlwZWlkLmdldChtZXRob2RuYW1lLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiB0eXBlaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICByaWRlbnQsIHJleHBvc2VkID0gc2VsZi5jcmVhdGUoY29ubiwgdHlwZWlkLCByZXMpCisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IFRva2VuKHR5cGVpZCwgc2VsZi5hZGRyZXNzLCByaWRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAoJyNQUk9YWScsIChyZXhwb3NlZCwgdG9rZW4pKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gKCcjUkVUVVJOJywgcmVzKQorCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgaWYgbWV0aG9kbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBtc2cgPSAoJyNUUkFDRUJBQ0snLCBmb3JtYXRfZXhjKCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZmFsbGJhY2tfZnVuYyA9IHNlbGYuZmFsbGJhY2tfbWFwcGluZ1ttZXRob2RuYW1lXQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsbGJhY2tfZnVuYygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBjb25uLCBpZGVudCwgb2JqLCAqYXJncywgKiprd2RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gKCcjUkVUVVJOJywgcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gKCcjVFJBQ0VCQUNLJywgZm9ybWF0X2V4YygpKQorCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgdXRpbC5kZWJ1ZygnZ290IEVPRiAtLSBleGl0aW5nIHRocmVhZCBzZXJ2aW5nICVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUpCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBtc2cgPSAoJyNUUkFDRUJBQ0snLCBmb3JtYXRfZXhjKCkpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbmQobXNnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgICAgIHNlbmQoKCcjVU5TRVJJQUxJWkFCTEUnLCByZXByKG1zZykpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICB1dGlsLmluZm8oJ2V4Y2VwdGlvbiBpbiB0aHJlYWQgc2VydmluZyAlcicsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lKQorICAgICAgICAgICAgICAgIHV0aWwuaW5mbygnIC4uLiBtZXNzYWdlIHdhcyAlcicsIG1zZykKKyAgICAgICAgICAgICAgICB1dGlsLmluZm8oJyAuLi4gZXhjZXB0aW9uIHdhcyAlcicsIGUpCisgICAgICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGRlZiBmYWxsYmFja19nZXR2YWx1ZShzZWxmLCBjb25uLCBpZGVudCwgb2JqKToKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIGZhbGxiYWNrX3N0cihzZWxmLCBjb25uLCBpZGVudCwgb2JqKToKKyAgICAgICAgcmV0dXJuIHN0cihvYmopCisKKyAgICBkZWYgZmFsbGJhY2tfcmVwcihzZWxmLCBjb25uLCBpZGVudCwgb2JqKToKKyAgICAgICAgcmV0dXJuIHJlcHIob2JqKQorCisgICAgZmFsbGJhY2tfbWFwcGluZyA9IHsKKyAgICAgICAgJ19fc3RyX18nOmZhbGxiYWNrX3N0ciwKKyAgICAgICAgJ19fcmVwcl9fJzpmYWxsYmFja19yZXByLAorICAgICAgICAnI0dFVFZBTFVFJzpmYWxsYmFja19nZXR2YWx1ZQorICAgICAgICB9CisKKyAgICBkZWYgZHVtbXkoc2VsZiwgYyk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBkZWJ1Z19pbmZvKHNlbGYsIGMpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHNvbWUgaW5mbyAtLS0gdXNlZnVsIHRvIHNwb3QgcHJvYmxlbXMgd2l0aCByZWZjb3VudGluZworICAgICAgICAnJycKKyAgICAgICAgc2VsZi5tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgICAgIGtleXMgPSBzZWxmLmlkX3RvX29iai5rZXlzKCkKKyAgICAgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgICAgICBmb3IgaWRlbnQgaW4ga2V5czoKKyAgICAgICAgICAgICAgICBpZiBpZGVudCAhPSAnMCc6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAgJXM6ICAgICAgIHJlZmNvdW50PSVzXG4gICAgJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWRlbnQsIHNlbGYuaWRfdG9fcmVmY291bnRbaWRlbnRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoc2VsZi5pZF90b19vYmpbaWRlbnRdWzBdKVs6NzVdKSkKKyAgICAgICAgICAgIHJldHVybiAnXG4nLmpvaW4ocmVzdWx0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5tdXRleC5yZWxlYXNlKCkKKworICAgIGRlZiBudW1iZXJfb2Zfb2JqZWN0cyhzZWxmLCBjKToKKyAgICAgICAgJycnCisgICAgICAgIE51bWJlciBvZiBzaGFyZWQgb2JqZWN0cworICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmlkX3RvX29iaikgLSAxICAgICAgIyBkb24ndCBjb3VudCBpZGVudD0nMCcKKworICAgIGRlZiBzaHV0ZG93bihzZWxmLCBjKToKKyAgICAgICAgJycnCisgICAgICAgIFNodXRkb3duIHRoaXMgcHJvY2VzcworICAgICAgICAnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHV0aWwuZGVidWcoJ21hbmFnZXIgcmVjZWl2ZWQgc2h1dGRvd24gbWVzc2FnZScpCisgICAgICAgICAgICAgICAgYy5zZW5kKCgnI1JFVFVSTicsIE5vbmUpKQorCisgICAgICAgICAgICAgICAgaWYgc3lzLnN0ZG91dCAhPSBzeXMuX19zdGRvdXRfXzoKKyAgICAgICAgICAgICAgICAgICAgdXRpbC5kZWJ1ZygncmVzZXR0aW5nIHN0ZG91dCwgc3RkZXJyJykKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5fX3N0ZG91dF9fCisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzeXMuX19zdGRlcnJfXworCisgICAgICAgICAgICAgICAgdXRpbC5fcnVuX2ZpbmFsaXplcnMoMCkKKworICAgICAgICAgICAgICAgIGZvciBwIGluIGFjdGl2ZV9jaGlsZHJlbigpOgorICAgICAgICAgICAgICAgICAgICB1dGlsLmRlYnVnKCd0ZXJtaW5hdGluZyBhIGNoaWxkIHByb2Nlc3Mgb2YgbWFuYWdlcicpCisgICAgICAgICAgICAgICAgICAgIHAudGVybWluYXRlKCkKKworICAgICAgICAgICAgICAgIGZvciBwIGluIGFjdGl2ZV9jaGlsZHJlbigpOgorICAgICAgICAgICAgICAgICAgICB1dGlsLmRlYnVnKCd0ZXJtaW5hdGluZyBhIGNoaWxkIHByb2Nlc3Mgb2YgbWFuYWdlcicpCisgICAgICAgICAgICAgICAgICAgIHAuam9pbigpCisKKyAgICAgICAgICAgICAgICB1dGlsLl9ydW5fZmluYWxpemVycygpCisgICAgICAgICAgICAgICAgdXRpbC5pbmZvKCdtYW5hZ2VyIGV4aXRpbmcgd2l0aCBleGl0Y29kZSAwJykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBleGl0KDApCisKKyAgICBkZWYgY3JlYXRlKHNlbGYsIGMsIHR5cGVpZCwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICcnJworICAgICAgICBDcmVhdGUgYSBuZXcgc2hhcmVkIG9iamVjdCBhbmQgcmV0dXJuIGl0cyBpZAorICAgICAgICAnJycKKyAgICAgICAgc2VsZi5tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2FsbGFibGUsIGV4cG9zZWQsIG1ldGhvZF90b190eXBlaWQsIHByb3h5dHlwZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZ2lzdHJ5W3R5cGVpZF0KKworICAgICAgICAgICAgaWYgY2FsbGFibGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgbGVuKGFyZ3MpID09IDEgYW5kIG5vdCBrd2RzCisgICAgICAgICAgICAgICAgb2JqID0gYXJnc1swXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvYmogPSBjYWxsYWJsZSgqYXJncywgKiprd2RzKQorCisgICAgICAgICAgICBpZiBleHBvc2VkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZXhwb3NlZCA9IHB1YmxpY19tZXRob2RzKG9iaikKKyAgICAgICAgICAgIGlmIG1ldGhvZF90b190eXBlaWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUobWV0aG9kX3RvX3R5cGVpZCkgaXMgZGljdAorICAgICAgICAgICAgICAgIGV4cG9zZWQgPSBsaXN0KGV4cG9zZWQpICsgbGlzdChtZXRob2RfdG9fdHlwZWlkKQorCisgICAgICAgICAgICBpZGVudCA9ICcleCcgJSBpZChvYmopICAjIGNvbnZlcnQgdG8gc3RyaW5nIGJlY2F1c2UgeG1scnBjbGliCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgaGFzIDMyIGJpdCBzaWduZWQgaW50ZWdlcnMKKyAgICAgICAgICAgIHV0aWwuZGVidWcoJyVyIGNhbGxhYmxlIHJldHVybmVkIG9iamVjdCB3aXRoIGlkICVyJywgdHlwZWlkLCBpZGVudCkKKworICAgICAgICAgICAgc2VsZi5pZF90b19vYmpbaWRlbnRdID0gKG9iaiwgc2V0KGV4cG9zZWQpLCBtZXRob2RfdG9fdHlwZWlkKQorICAgICAgICAgICAgaWYgaWRlbnQgbm90IGluIHNlbGYuaWRfdG9fcmVmY291bnQ6CisgICAgICAgICAgICAgICAgc2VsZi5pZF90b19yZWZjb3VudFtpZGVudF0gPSAwCisgICAgICAgICAgICAjIGluY3JlbWVudCB0aGUgcmVmZXJlbmNlIGNvdW50IGltbWVkaWF0ZWx5LCB0byBhdm9pZAorICAgICAgICAgICAgIyB0aGlzIG9iamVjdCBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCBiZWZvcmUgYSBQcm94eQorICAgICAgICAgICAgIyBvYmplY3QgZm9yIGl0IGNhbiBiZSBjcmVhdGVkLiAgVGhlIGNhbGxlciBvZiBjcmVhdGUoKQorICAgICAgICAgICAgIyBpcyByZXNwb25zaWJsZSBmb3IgZG9pbmcgYSBkZWNyZWYgb25jZSB0aGUgUHJveHkgb2JqZWN0CisgICAgICAgICAgICAjIGhhcyBiZWVuIGNyZWF0ZWQuCisgICAgICAgICAgICBzZWxmLmluY3JlZihjLCBpZGVudCkKKyAgICAgICAgICAgIHJldHVybiBpZGVudCwgdHVwbGUoZXhwb3NlZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYubXV0ZXgucmVsZWFzZSgpCisKKyAgICBkZWYgZ2V0X21ldGhvZHMoc2VsZiwgYywgdG9rZW4pOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHRoZSBtZXRob2RzIG9mIHRoZSBzaGFyZWQgb2JqZWN0IGluZGljYXRlZCBieSB0b2tlbgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIHR1cGxlKHNlbGYuaWRfdG9fb2JqW3Rva2VuLmlkXVsxXSkKKworICAgIGRlZiBhY2NlcHRfY29ubmVjdGlvbihzZWxmLCBjLCBuYW1lKToKKyAgICAgICAgJycnCisgICAgICAgIFNwYXduIGEgbmV3IHRocmVhZCB0byBzZXJ2ZSB0aGlzIGNvbm5lY3Rpb24KKyAgICAgICAgJycnCisgICAgICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUgPSBuYW1lCisgICAgICAgIGMuc2VuZCgoJyNSRVRVUk4nLCBOb25lKSkKKyAgICAgICAgc2VsZi5zZXJ2ZV9jbGllbnQoYykKKworICAgIGRlZiBpbmNyZWYoc2VsZiwgYywgaWRlbnQpOgorICAgICAgICBzZWxmLm11dGV4LmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmlkX3RvX3JlZmNvdW50W2lkZW50XSArPSAxCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLm11dGV4LnJlbGVhc2UoKQorCisgICAgZGVmIGRlY3JlZihzZWxmLCBjLCBpZGVudCk6CisgICAgICAgIHNlbGYubXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLmlkX3RvX3JlZmNvdW50W2lkZW50XSA+PSAxCisgICAgICAgICAgICBzZWxmLmlkX3RvX3JlZmNvdW50W2lkZW50XSAtPSAxCisgICAgICAgICAgICBpZiBzZWxmLmlkX3RvX3JlZmNvdW50W2lkZW50XSA9PSAwOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmlkX3RvX29ialtpZGVudF0sIHNlbGYuaWRfdG9fcmVmY291bnRbaWRlbnRdCisgICAgICAgICAgICAgICAgdXRpbC5kZWJ1ZygnZGlzcG9zaW5nIG9mIG9iaiB3aXRoIGlkICVyJywgaWRlbnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLm11dGV4LnJlbGVhc2UoKQorCisjCisjIENsYXNzIHRvIHJlcHJlc2VudCBzdGF0ZSBvZiBhIG1hbmFnZXIKKyMKKworY2xhc3MgU3RhdGUob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ3ZhbHVlJ10KKyAgICBJTklUSUFMID0gMAorICAgIFNUQVJURUQgPSAxCisgICAgU0hVVERPV04gPSAyCisKKyMKKyMgTWFwcGluZyBmcm9tIHNlcmlhbGl6ZXIgbmFtZSB0byBMaXN0ZW5lciBhbmQgQ2xpZW50IHR5cGVzCisjCisKK2xpc3RlbmVyX2NsaWVudCA9IHsKKyAgICAncGlja2xlJyA6IChjb25uZWN0aW9uLkxpc3RlbmVyLCBjb25uZWN0aW9uLkNsaWVudCksCisgICAgJ3htbHJwY2xpYicgOiAoY29ubmVjdGlvbi5YbWxMaXN0ZW5lciwgY29ubmVjdGlvbi5YbWxDbGllbnQpCisgICAgfQorCisjCisjIERlZmluaXRpb24gb2YgQmFzZU1hbmFnZXIKKyMKKworY2xhc3MgQmFzZU1hbmFnZXIob2JqZWN0KToKKyAgICAnJycKKyAgICBCYXNlIGNsYXNzIGZvciBtYW5hZ2VycworICAgICcnJworICAgIF9yZWdpc3RyeSA9IHt9CisgICAgX1NlcnZlciA9IFNlcnZlcgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3M9Tm9uZSwgYXV0aGtleT1Ob25lLCBzZXJpYWxpemVyPSdwaWNrbGUnKToKKyAgICAgICAgaWYgYXV0aGtleSBpcyBOb25lOgorICAgICAgICAgICAgYXV0aGtleSA9IGN1cnJlbnRfcHJvY2VzcygpLmF1dGhrZXkKKyAgICAgICAgc2VsZi5fYWRkcmVzcyA9IGFkZHJlc3MgICAgICMgWFhYIG5vdCBmaW5hbCBhZGRyZXNzIGlmIGVnICgnJywgMCkKKyAgICAgICAgc2VsZi5fYXV0aGtleSA9IEF1dGhlbnRpY2F0aW9uU3RyaW5nKGF1dGhrZXkpCisgICAgICAgIHNlbGYuX3N0YXRlID0gU3RhdGUoKQorICAgICAgICBzZWxmLl9zdGF0ZS52YWx1ZSA9IFN0YXRlLklOSVRJQUwKKyAgICAgICAgc2VsZi5fc2VyaWFsaXplciA9IHNlcmlhbGl6ZXIKKyAgICAgICAgc2VsZi5fTGlzdGVuZXIsIHNlbGYuX0NsaWVudCA9IGxpc3RlbmVyX2NsaWVudFtzZXJpYWxpemVyXQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiB0eXBlKHNlbGYpLmZyb21fYWRkcmVzcywgXAorICAgICAgICAgICAgICAgKHNlbGYuX2FkZHJlc3MsIHNlbGYuX2F1dGhrZXksIHNlbGYuX3NlcmlhbGl6ZXIpCisKKyAgICBkZWYgZ2V0X3NlcnZlcihzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFJldHVybiBzZXJ2ZXIgb2JqZWN0IHdpdGggc2VydmVfZm9yZXZlcigpIG1ldGhvZCBhbmQgYWRkcmVzcyBhdHRyaWJ1dGUKKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZS52YWx1ZSA9PSBTdGF0ZS5JTklUSUFMCisgICAgICAgIHJldHVybiBTZXJ2ZXIoc2VsZi5fcmVnaXN0cnksIHNlbGYuX2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYXV0aGtleSwgc2VsZi5fc2VyaWFsaXplcikKKworICAgIGRlZiBjb25uZWN0KHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgQ29ubmVjdCBtYW5hZ2VyIG9iamVjdCB0byB0aGUgc2VydmVyIHByb2Nlc3MKKyAgICAgICAgJycnCisgICAgICAgIExpc3RlbmVyLCBDbGllbnQgPSBsaXN0ZW5lcl9jbGllbnRbc2VsZi5fc2VyaWFsaXplcl0KKyAgICAgICAgY29ubiA9IENsaWVudChzZWxmLl9hZGRyZXNzLCBhdXRoa2V5PXNlbGYuX2F1dGhrZXkpCisgICAgICAgIGRpc3BhdGNoKGNvbm4sIE5vbmUsICdkdW1teScpCisgICAgICAgIHNlbGYuX3N0YXRlLnZhbHVlID0gU3RhdGUuU1RBUlRFRAorCisgICAgZGVmIHN0YXJ0KHNlbGYsIGluaXRpYWxpemVyPU5vbmUsIGluaXRhcmdzPSgpKToKKyAgICAgICAgJycnCisgICAgICAgIFNwYXduIGEgc2VydmVyIHByb2Nlc3MgZm9yIHRoaXMgbWFuYWdlciBvYmplY3QKKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZS52YWx1ZSA9PSBTdGF0ZS5JTklUSUFMCisKKyAgICAgICAgaWYgaW5pdGlhbGl6ZXIgaXMgbm90IE5vbmUgYW5kIG5vdCBoYXNhdHRyKGluaXRpYWxpemVyLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGNhbGxhYmxlJykKKworICAgICAgICAjIHBpcGUgb3ZlciB3aGljaCB3ZSB3aWxsIHJldHJpZXZlIGFkZHJlc3Mgb2Ygc2VydmVyCisgICAgICAgIHJlYWRlciwgd3JpdGVyID0gY29ubmVjdGlvbi5QaXBlKGR1cGxleD1GYWxzZSkKKworICAgICAgICAjIHNwYXduIHByb2Nlc3Mgd2hpY2ggcnVucyBhIHNlcnZlcgorICAgICAgICBzZWxmLl9wcm9jZXNzID0gUHJvY2VzcygKKyAgICAgICAgICAgIHRhcmdldD10eXBlKHNlbGYpLl9ydW5fc2VydmVyLAorICAgICAgICAgICAgYXJncz0oc2VsZi5fcmVnaXN0cnksIHNlbGYuX2FkZHJlc3MsIHNlbGYuX2F1dGhrZXksCisgICAgICAgICAgICAgICAgICBzZWxmLl9zZXJpYWxpemVyLCB3cml0ZXIsIGluaXRpYWxpemVyLCBpbml0YXJncyksCisgICAgICAgICAgICApCisgICAgICAgIGlkZW50ID0gJzonLmpvaW4oc3RyKGkpIGZvciBpIGluIHNlbGYuX3Byb2Nlc3MuX2lkZW50aXR5KQorICAgICAgICBzZWxmLl9wcm9jZXNzLm5hbWUgPSB0eXBlKHNlbGYpLl9fbmFtZV9fICArICctJyArIGlkZW50CisgICAgICAgIHNlbGYuX3Byb2Nlc3Muc3RhcnQoKQorCisgICAgICAgICMgZ2V0IGFkZHJlc3Mgb2Ygc2VydmVyCisgICAgICAgIHdyaXRlci5jbG9zZSgpCisgICAgICAgIHNlbGYuX2FkZHJlc3MgPSByZWFkZXIucmVjdigpCisgICAgICAgIHJlYWRlci5jbG9zZSgpCisKKyAgICAgICAgIyByZWdpc3RlciBhIGZpbmFsaXplcgorICAgICAgICBzZWxmLl9zdGF0ZS52YWx1ZSA9IFN0YXRlLlNUQVJURUQKKyAgICAgICAgc2VsZi5zaHV0ZG93biA9IHV0aWwuRmluYWxpemUoCisgICAgICAgICAgICBzZWxmLCB0eXBlKHNlbGYpLl9maW5hbGl6ZV9tYW5hZ2VyLAorICAgICAgICAgICAgYXJncz0oc2VsZi5fcHJvY2Vzcywgc2VsZi5fYWRkcmVzcywgc2VsZi5fYXV0aGtleSwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX3N0YXRlLCBzZWxmLl9DbGllbnQpLAorICAgICAgICAgICAgZXhpdHByaW9yaXR5PTAKKyAgICAgICAgICAgICkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfcnVuX3NlcnZlcihjbHMsIHJlZ2lzdHJ5LCBhZGRyZXNzLCBhdXRoa2V5LCBzZXJpYWxpemVyLCB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyPU5vbmUsIGluaXRhcmdzPSgpKToKKyAgICAgICAgJycnCisgICAgICAgIENyZWF0ZSBhIHNlcnZlciwgcmVwb3J0IGl0cyBhZGRyZXNzIGFuZCBydW4gaXQKKyAgICAgICAgJycnCisgICAgICAgIGlmIGluaXRpYWxpemVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaW5pdGlhbGl6ZXIoKmluaXRhcmdzKQorCisgICAgICAgICMgY3JlYXRlIHNlcnZlcgorICAgICAgICBzZXJ2ZXIgPSBjbHMuX1NlcnZlcihyZWdpc3RyeSwgYWRkcmVzcywgYXV0aGtleSwgc2VyaWFsaXplcikKKworICAgICAgICAjIGluZm9ybSBwYXJlbnQgcHJvY2VzcyBvZiB0aGUgc2VydmVyJ3MgYWRkcmVzcworICAgICAgICB3cml0ZXIuc2VuZChzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgd3JpdGVyLmNsb3NlKCkKKworICAgICAgICAjIHJ1biB0aGUgbWFuYWdlcgorICAgICAgICB1dGlsLmluZm8oJ21hbmFnZXIgc2VydmluZyBhdCAlcicsIHNlcnZlci5hZGRyZXNzKQorICAgICAgICBzZXJ2ZXIuc2VydmVfZm9yZXZlcigpCisKKyAgICBkZWYgX2NyZWF0ZShzZWxmLCB0eXBlaWQsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAnJycKKyAgICAgICAgQ3JlYXRlIGEgbmV3IHNoYXJlZCBvYmplY3Q7IHJldHVybiB0aGUgdG9rZW4gYW5kIGV4cG9zZWQgdHVwbGUKKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZS52YWx1ZSA9PSBTdGF0ZS5TVEFSVEVELCAnc2VydmVyIG5vdCB5ZXQgc3RhcnRlZCcKKyAgICAgICAgY29ubiA9IHNlbGYuX0NsaWVudChzZWxmLl9hZGRyZXNzLCBhdXRoa2V5PXNlbGYuX2F1dGhrZXkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlkLCBleHBvc2VkID0gZGlzcGF0Y2goY29ubiwgTm9uZSwgJ2NyZWF0ZScsICh0eXBlaWQsKSthcmdzLCBrd2RzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIHJldHVybiBUb2tlbih0eXBlaWQsIHNlbGYuX2FkZHJlc3MsIGlkKSwgZXhwb3NlZAorCisgICAgZGVmIGpvaW4oc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgJycnCisgICAgICAgIEpvaW4gdGhlIG1hbmFnZXIgcHJvY2VzcyAoaWYgaXQgaGFzIGJlZW4gc3Bhd25lZCkKKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuX3Byb2Nlc3Muam9pbih0aW1lb3V0KQorCisgICAgZGVmIF9kZWJ1Z19pbmZvKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHNvbWUgaW5mbyBhYm91dCB0aGUgc2VydmVycyBzaGFyZWQgb2JqZWN0cyBhbmQgY29ubmVjdGlvbnMKKyAgICAgICAgJycnCisgICAgICAgIGNvbm4gPSBzZWxmLl9DbGllbnQoc2VsZi5fYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2goY29ubiwgTm9uZSwgJ2RlYnVnX2luZm8nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisKKyAgICBkZWYgX251bWJlcl9vZl9vYmplY3RzKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2hhcmVkIG9iamVjdHMKKyAgICAgICAgJycnCisgICAgICAgIGNvbm4gPSBzZWxmLl9DbGllbnQoc2VsZi5fYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2goY29ubiwgTm9uZSwgJ251bWJlcl9vZl9vYmplY3RzJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKKyAgICAgICAgc2VsZi5zaHV0ZG93bigpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9maW5hbGl6ZV9tYW5hZ2VyKHByb2Nlc3MsIGFkZHJlc3MsIGF1dGhrZXksIHN0YXRlLCBfQ2xpZW50KToKKyAgICAgICAgJycnCisgICAgICAgIFNodXRkb3duIHRoZSBtYW5hZ2VyIHByb2Nlc3M7IHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBhIGZpbmFsaXplcgorICAgICAgICAnJycKKyAgICAgICAgaWYgcHJvY2Vzcy5pc19hbGl2ZSgpOgorICAgICAgICAgICAgdXRpbC5pbmZvKCdzZW5kaW5nIHNodXRkb3duIG1lc3NhZ2UgdG8gbWFuYWdlcicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29ubiA9IF9DbGllbnQoYWRkcmVzcywgYXV0aGtleT1hdXRoa2V5KQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2goY29ubiwgTm9uZSwgJ3NodXRkb3duJykKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBwcm9jZXNzLmpvaW4odGltZW91dD0wLjIpCisgICAgICAgICAgICBpZiBwcm9jZXNzLmlzX2FsaXZlKCk6CisgICAgICAgICAgICAgICAgdXRpbC5pbmZvKCdtYW5hZ2VyIHN0aWxsIGFsaXZlJykKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHByb2Nlc3MsICd0ZXJtaW5hdGUnKToKKyAgICAgICAgICAgICAgICAgICAgdXRpbC5pbmZvKCd0cnlpbmcgdG8gYHRlcm1pbmF0ZSgpYCBtYW5hZ2VyIHByb2Nlc3MnKQorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3Muam9pbih0aW1lb3V0PTAuMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJvY2Vzcy5pc19hbGl2ZSgpOgorICAgICAgICAgICAgICAgICAgICAgICAgdXRpbC5pbmZvKCdtYW5hZ2VyIHN0aWxsIGFsaXZlIGFmdGVyIHRlcm1pbmF0ZScpCisKKyAgICAgICAgc3RhdGUudmFsdWUgPSBTdGF0ZS5TSFVURE9XTgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgQmFzZVByb3h5Ll9hZGRyZXNzX3RvX2xvY2FsW2FkZHJlc3NdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGFkZHJlc3MgPSBwcm9wZXJ0eShsYW1iZGEgc2VsZjogc2VsZi5fYWRkcmVzcykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiByZWdpc3RlcihjbHMsIHR5cGVpZCwgY2FsbGFibGU9Tm9uZSwgcHJveHl0eXBlPU5vbmUsIGV4cG9zZWQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgbWV0aG9kX3RvX3R5cGVpZD1Ob25lLCBjcmVhdGVfbWV0aG9kPVRydWUpOgorICAgICAgICAnJycKKyAgICAgICAgUmVnaXN0ZXIgYSB0eXBlaWQgd2l0aCB0aGUgbWFuYWdlciB0eXBlCisgICAgICAgICcnJworICAgICAgICBpZiAnX3JlZ2lzdHJ5JyBub3QgaW4gY2xzLl9fZGljdF9fOgorICAgICAgICAgICAgY2xzLl9yZWdpc3RyeSA9IGNscy5fcmVnaXN0cnkuY29weSgpCisKKyAgICAgICAgaWYgcHJveHl0eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBwcm94eXR5cGUgPSBBdXRvUHJveHkKKworICAgICAgICBleHBvc2VkID0gZXhwb3NlZCBvciBnZXRhdHRyKHByb3h5dHlwZSwgJ19leHBvc2VkXycsIE5vbmUpCisKKyAgICAgICAgbWV0aG9kX3RvX3R5cGVpZCA9IG1ldGhvZF90b190eXBlaWQgb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihwcm94eXR5cGUsICdfbWV0aG9kX3RvX3R5cGVpZF8nLCBOb25lKQorCisgICAgICAgIGlmIG1ldGhvZF90b190eXBlaWQ6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtZXRob2RfdG9fdHlwZWlkLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUoa2V5KSBpcyBzdHIsICclciBpcyBub3QgYSBzdHJpbmcnICUga2V5CisgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUodmFsdWUpIGlzIHN0ciwgJyVyIGlzIG5vdCBhIHN0cmluZycgJSB2YWx1ZQorCisgICAgICAgIGNscy5fcmVnaXN0cnlbdHlwZWlkXSA9ICgKKyAgICAgICAgICAgIGNhbGxhYmxlLCBleHBvc2VkLCBtZXRob2RfdG9fdHlwZWlkLCBwcm94eXR5cGUKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBjcmVhdGVfbWV0aG9kOgorICAgICAgICAgICAgZGVmIHRlbXAoc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICAgICAgdXRpbC5kZWJ1ZygncmVxdWVzdGluZyBjcmVhdGlvbiBvZiBhIHNoYXJlZCAlciBvYmplY3QnLCB0eXBlaWQpCisgICAgICAgICAgICAgICAgdG9rZW4sIGV4cCA9IHNlbGYuX2NyZWF0ZSh0eXBlaWQsICphcmdzLCAqKmt3ZHMpCisgICAgICAgICAgICAgICAgcHJveHkgPSBwcm94eXR5cGUoCisgICAgICAgICAgICAgICAgICAgIHRva2VuLCBzZWxmLl9zZXJpYWxpemVyLCBtYW5hZ2VyPXNlbGYsCisgICAgICAgICAgICAgICAgICAgIGF1dGhrZXk9c2VsZi5fYXV0aGtleSwgZXhwb3NlZD1leHAKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGNvbm4gPSBzZWxmLl9DbGllbnQodG9rZW4uYWRkcmVzcywgYXV0aGtleT1zZWxmLl9hdXRoa2V5KQorICAgICAgICAgICAgICAgIGRpc3BhdGNoKGNvbm4sIE5vbmUsICdkZWNyZWYnLCAodG9rZW4uaWQsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJveHkKKyAgICAgICAgICAgIHRlbXAuX19uYW1lX18gPSB0eXBlaWQKKyAgICAgICAgICAgIHNldGF0dHIoY2xzLCB0eXBlaWQsIHRlbXApCisKKyMKKyMgU3ViY2xhc3Mgb2Ygc2V0IHdoaWNoIGdldCBjbGVhcmVkIGFmdGVyIGEgZm9yaworIworCitjbGFzcyBQcm9jZXNzTG9jYWxTZXQoc2V0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHV0aWwucmVnaXN0ZXJfYWZ0ZXJfZm9yayhzZWxmLCBsYW1iZGEgb2JqOiBvYmouY2xlYXIoKSkKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHR5cGUoc2VsZiksICgpCisKKyMKKyMgRGVmaW5pdGlvbiBvZiBCYXNlUHJveHkKKyMKKworY2xhc3MgQmFzZVByb3h5KG9iamVjdCk6CisgICAgJycnCisgICAgQSBiYXNlIGZvciBwcm94aWVzIG9mIHNoYXJlZCBvYmplY3RzCisgICAgJycnCisgICAgX2FkZHJlc3NfdG9fbG9jYWwgPSB7fQorICAgIF9tdXRleCA9IHV0aWwuRm9ya0F3YXJlVGhyZWFkTG9jaygpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdG9rZW4sIHNlcmlhbGl6ZXIsIG1hbmFnZXI9Tm9uZSwKKyAgICAgICAgICAgICAgICAgYXV0aGtleT1Ob25lLCBleHBvc2VkPU5vbmUsIGluY3JlZj1UcnVlKToKKyAgICAgICAgQmFzZVByb3h5Ll9tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGxzX2lkc2V0ID0gQmFzZVByb3h5Ll9hZGRyZXNzX3RvX2xvY2FsLmdldCh0b2tlbi5hZGRyZXNzLCBOb25lKQorICAgICAgICAgICAgaWYgdGxzX2lkc2V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdGxzX2lkc2V0ID0gdXRpbC5Gb3JrQXdhcmVMb2NhbCgpLCBQcm9jZXNzTG9jYWxTZXQoKQorICAgICAgICAgICAgICAgIEJhc2VQcm94eS5fYWRkcmVzc190b19sb2NhbFt0b2tlbi5hZGRyZXNzXSA9IHRsc19pZHNldAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgQmFzZVByb3h5Ll9tdXRleC5yZWxlYXNlKCkKKworICAgICAgICAjIHNlbGYuX3RscyBpcyB1c2VkIHRvIHJlY29yZCB0aGUgY29ubmVjdGlvbiB1c2VkIGJ5IHRoaXMKKyAgICAgICAgIyB0aHJlYWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgbWFuYWdlciBhdCB0b2tlbi5hZGRyZXNzCisgICAgICAgIHNlbGYuX3RscyA9IHRsc19pZHNldFswXQorCisgICAgICAgICMgc2VsZi5faWRzZXQgaXMgdXNlZCB0byByZWNvcmQgdGhlIGlkZW50aXRpZXMgb2YgYWxsIHNoYXJlZAorICAgICAgICAjIG9iamVjdHMgZm9yIHdoaWNoIHRoZSBjdXJyZW50IHByb2Nlc3Mgb3ducyByZWZlcmVuY2VzIGFuZAorICAgICAgICAjIHdoaWNoIGFyZSBpbiB0aGUgbWFuYWdlciBhdCB0b2tlbi5hZGRyZXNzCisgICAgICAgIHNlbGYuX2lkc2V0ID0gdGxzX2lkc2V0WzFdCisKKyAgICAgICAgc2VsZi5fdG9rZW4gPSB0b2tlbgorICAgICAgICBzZWxmLl9pZCA9IHNlbGYuX3Rva2VuLmlkCisgICAgICAgIHNlbGYuX21hbmFnZXIgPSBtYW5hZ2VyCisgICAgICAgIHNlbGYuX3NlcmlhbGl6ZXIgPSBzZXJpYWxpemVyCisgICAgICAgIHNlbGYuX0NsaWVudCA9IGxpc3RlbmVyX2NsaWVudFtzZXJpYWxpemVyXVsxXQorCisgICAgICAgIGlmIGF1dGhrZXkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9hdXRoa2V5ID0gQXV0aGVudGljYXRpb25TdHJpbmcoYXV0aGtleSkKKyAgICAgICAgZWxpZiBzZWxmLl9tYW5hZ2VyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fYXV0aGtleSA9IHNlbGYuX21hbmFnZXIuX2F1dGhrZXkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2F1dGhrZXkgPSBjdXJyZW50X3Byb2Nlc3MoKS5hdXRoa2V5CisKKyAgICAgICAgaWYgaW5jcmVmOgorICAgICAgICAgICAgc2VsZi5faW5jcmVmKCkKKworICAgICAgICB1dGlsLnJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgQmFzZVByb3h5Ll9hZnRlcl9mb3JrKQorCisgICAgZGVmIF9jb25uZWN0KHNlbGYpOgorICAgICAgICB1dGlsLmRlYnVnKCdtYWtpbmcgY29ubmVjdGlvbiB0byBtYW5hZ2VyJykKKyAgICAgICAgbmFtZSA9IGN1cnJlbnRfcHJvY2VzcygpLm5hbWUKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSAhPSAnTWFpblRocmVhZCc6CisgICAgICAgICAgICBuYW1lICs9ICd8JyArIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUKKyAgICAgICAgY29ubiA9IHNlbGYuX0NsaWVudChzZWxmLl90b2tlbi5hZGRyZXNzLCBhdXRoa2V5PXNlbGYuX2F1dGhrZXkpCisgICAgICAgIGRpc3BhdGNoKGNvbm4sIE5vbmUsICdhY2NlcHRfY29ubmVjdGlvbicsIChuYW1lLCkpCisgICAgICAgIHNlbGYuX3Rscy5jb25uZWN0aW9uID0gY29ubgorCisgICAgZGVmIF9jYWxsbWV0aG9kKHNlbGYsIG1ldGhvZG5hbWUsIGFyZ3M9KCksIGt3ZHM9e30pOgorICAgICAgICAnJycKKyAgICAgICAgVHJ5IHRvIGNhbGwgYSBtZXRob2Qgb2YgdGhlIHJlZmVycmVudCBhbmQgcmV0dXJuIGEgY29weSBvZiB0aGUgcmVzdWx0CisgICAgICAgICcnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb25uID0gc2VsZi5fdGxzLmNvbm5lY3Rpb24KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgdXRpbC5kZWJ1ZygndGhyZWFkICVyIGRvZXMgbm90IG93biBhIGNvbm5lY3Rpb24nLAorICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lKQorICAgICAgICAgICAgc2VsZi5fY29ubmVjdCgpCisgICAgICAgICAgICBjb25uID0gc2VsZi5fdGxzLmNvbm5lY3Rpb24KKworICAgICAgICBjb25uLnNlbmQoKHNlbGYuX2lkLCBtZXRob2RuYW1lLCBhcmdzLCBrd2RzKSkKKyAgICAgICAga2luZCwgcmVzdWx0ID0gY29ubi5yZWN2KCkKKworICAgICAgICBpZiBraW5kID09ICcjUkVUVVJOJzoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgZWxpZiBraW5kID09ICcjUFJPWFknOgorICAgICAgICAgICAgZXhwb3NlZCwgdG9rZW4gPSByZXN1bHQKKyAgICAgICAgICAgIHByb3h5dHlwZSA9IHNlbGYuX21hbmFnZXIuX3JlZ2lzdHJ5W3Rva2VuLnR5cGVpZF1bLTFdCisgICAgICAgICAgICBwcm94eSA9IHByb3h5dHlwZSgKKyAgICAgICAgICAgICAgICB0b2tlbiwgc2VsZi5fc2VyaWFsaXplciwgbWFuYWdlcj1zZWxmLl9tYW5hZ2VyLAorICAgICAgICAgICAgICAgIGF1dGhrZXk9c2VsZi5fYXV0aGtleSwgZXhwb3NlZD1leHBvc2VkCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgY29ubiA9IHNlbGYuX0NsaWVudCh0b2tlbi5hZGRyZXNzLCBhdXRoa2V5PXNlbGYuX2F1dGhrZXkpCisgICAgICAgICAgICBkaXNwYXRjaChjb25uLCBOb25lLCAnZGVjcmVmJywgKHRva2VuLmlkLCkpCisgICAgICAgICAgICByZXR1cm4gcHJveHkKKyAgICAgICAgcmFpc2UgY29udmVydF90b19lcnJvcihraW5kLCByZXN1bHQpCisKKyAgICBkZWYgX2dldHZhbHVlKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgR2V0IGEgY29weSBvZiB0aGUgdmFsdWUgb2YgdGhlIHJlZmVyZW50CisgICAgICAgICcnJworICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnI0dFVFZBTFVFJykKKworICAgIGRlZiBfaW5jcmVmKHNlbGYpOgorICAgICAgICBjb25uID0gc2VsZi5fQ2xpZW50KHNlbGYuX3Rva2VuLmFkZHJlc3MsIGF1dGhrZXk9c2VsZi5fYXV0aGtleSkKKyAgICAgICAgZGlzcGF0Y2goY29ubiwgTm9uZSwgJ2luY3JlZicsIChzZWxmLl9pZCwpKQorICAgICAgICB1dGlsLmRlYnVnKCdJTkNSRUYgJXInLCBzZWxmLl90b2tlbi5pZCkKKworICAgICAgICBzZWxmLl9pZHNldC5hZGQoc2VsZi5faWQpCisKKyAgICAgICAgc3RhdGUgPSBzZWxmLl9tYW5hZ2VyIGFuZCBzZWxmLl9tYW5hZ2VyLl9zdGF0ZQorCisgICAgICAgIHNlbGYuX2Nsb3NlID0gdXRpbC5GaW5hbGl6ZSgKKyAgICAgICAgICAgIHNlbGYsIEJhc2VQcm94eS5fZGVjcmVmLAorICAgICAgICAgICAgYXJncz0oc2VsZi5fdG9rZW4sIHNlbGYuX2F1dGhrZXksIHN0YXRlLAorICAgICAgICAgICAgICAgICAgc2VsZi5fdGxzLCBzZWxmLl9pZHNldCwgc2VsZi5fQ2xpZW50KSwKKyAgICAgICAgICAgIGV4aXRwcmlvcml0eT0xMAorICAgICAgICAgICAgKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZGVjcmVmKHRva2VuLCBhdXRoa2V5LCBzdGF0ZSwgdGxzLCBpZHNldCwgX0NsaWVudCk6CisgICAgICAgIGlkc2V0LmRpc2NhcmQodG9rZW4uaWQpCisKKyAgICAgICAgIyBjaGVjayB3aGV0aGVyIG1hbmFnZXIgaXMgc3RpbGwgYWxpdmUKKyAgICAgICAgaWYgc3RhdGUgaXMgTm9uZSBvciBzdGF0ZS52YWx1ZSA9PSBTdGF0ZS5TVEFSVEVEOgorICAgICAgICAgICAgIyB0ZWxsIG1hbmFnZXIgdGhpcyBwcm9jZXNzIG5vIGxvbmdlciBjYXJlcyBhYm91dCByZWZlcmVudAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHV0aWwuZGVidWcoJ0RFQ1JFRiAlcicsIHRva2VuLmlkKQorICAgICAgICAgICAgICAgIGNvbm4gPSBfQ2xpZW50KHRva2VuLmFkZHJlc3MsIGF1dGhrZXk9YXV0aGtleSkKKyAgICAgICAgICAgICAgICBkaXNwYXRjaChjb25uLCBOb25lLCAnZGVjcmVmJywgKHRva2VuLmlkLCkpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHV0aWwuZGVidWcoJy4uLiBkZWNyZWYgZmFpbGVkICVzJywgZSkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXRpbC5kZWJ1ZygnREVDUkVGICVyIC0tIG1hbmFnZXIgYWxyZWFkeSBzaHV0ZG93bicsIHRva2VuLmlkKQorCisgICAgICAgICMgY2hlY2sgd2hldGhlciB3ZSBjYW4gY2xvc2UgdGhpcyB0aHJlYWQncyBjb25uZWN0aW9uIGJlY2F1c2UKKyAgICAgICAgIyB0aGUgcHJvY2VzcyBvd25zIG5vIG1vcmUgcmVmZXJlbmNlcyB0byBvYmplY3RzIGZvciB0aGlzIG1hbmFnZXIKKyAgICAgICAgaWYgbm90IGlkc2V0IGFuZCBoYXNhdHRyKHRscywgJ2Nvbm5lY3Rpb24nKToKKyAgICAgICAgICAgIHV0aWwuZGVidWcoJ3RocmVhZCAlciBoYXMgbm8gbW9yZSBwcm94aWVzIHNvIGNsb3NpbmcgY29ubicsCisgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpLm5hbWUpCisgICAgICAgICAgICB0bHMuY29ubmVjdGlvbi5jbG9zZSgpCisgICAgICAgICAgICBkZWwgdGxzLmNvbm5lY3Rpb24KKworICAgIGRlZiBfYWZ0ZXJfZm9yayhzZWxmKToKKyAgICAgICAgc2VsZi5fbWFuYWdlciA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5faW5jcmVmKCkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICMgdGhlIHByb3h5IG1heSBqdXN0IGJlIGZvciBhIG1hbmFnZXIgd2hpY2ggaGFzIHNodXRkb3duCisgICAgICAgICAgICB1dGlsLmluZm8oJ2luY3JlZiBmYWlsZWQ6ICVzJyAlIGUpCisKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAga3dkcyA9IHt9CisgICAgICAgIGlmIFBvcGVuLnRocmVhZF9pc19zcGF3bmluZygpOgorICAgICAgICAgICAga3dkc1snYXV0aGtleSddID0gc2VsZi5fYXV0aGtleQorCisgICAgICAgIGlmIGdldGF0dHIoc2VsZiwgJ19pc2F1dG8nLCBGYWxzZSk6CisgICAgICAgICAgICBrd2RzWydleHBvc2VkJ10gPSBzZWxmLl9leHBvc2VkXworICAgICAgICAgICAgcmV0dXJuIChSZWJ1aWxkUHJveHksCisgICAgICAgICAgICAgICAgICAgIChBdXRvUHJveHksIHNlbGYuX3Rva2VuLCBzZWxmLl9zZXJpYWxpemVyLCBrd2RzKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoUmVidWlsZFByb3h5LAorICAgICAgICAgICAgICAgICAgICAodHlwZShzZWxmKSwgc2VsZi5fdG9rZW4sIHNlbGYuX3NlcmlhbGl6ZXIsIGt3ZHMpKQorCisgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldHZhbHVlKCkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8JXMgb2JqZWN0LCB0eXBlaWQgJXIgYXQgJXM+JyAlIFwKKyAgICAgICAgICAgICAgICh0eXBlKHNlbGYpLl9fbmFtZV9fLCBzZWxmLl90b2tlbi50eXBlaWQsICcweCV4JyAlIGlkKHNlbGYpKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm4gcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlZmVyZW50IChvciBhIGZhbGwtYmFjayBpZiB0aGF0IGZhaWxzKQorICAgICAgICAnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ19fcmVwcl9fJykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHJldHVybiByZXByKHNlbGYpWzotMV0gKyAiOyAnX19zdHJfXygpJyBmYWlsZWQ+IgorCisjCisjIEZ1bmN0aW9uIHVzZWQgZm9yIHVucGlja2xpbmcKKyMKKworZGVmIFJlYnVpbGRQcm94eShmdW5jLCB0b2tlbiwgc2VyaWFsaXplciwga3dkcyk6CisgICAgJycnCisgICAgRnVuY3Rpb24gdXNlZCBmb3IgdW5waWNrbGluZyBwcm94eSBvYmplY3RzLgorCisgICAgSWYgcG9zc2libGUgdGhlIHNoYXJlZCBvYmplY3QgaXMgcmV0dXJuZWQsIG9yIG90aGVyd2lzZSBhIHByb3h5IGZvciBpdC4KKyAgICAnJycKKyAgICBzZXJ2ZXIgPSBnZXRhdHRyKGN1cnJlbnRfcHJvY2VzcygpLCAnX21hbmFnZXJfc2VydmVyJywgTm9uZSkKKworICAgIGlmIHNlcnZlciBhbmQgc2VydmVyLmFkZHJlc3MgPT0gdG9rZW4uYWRkcmVzczoKKyAgICAgICAgcmV0dXJuIHNlcnZlci5pZF90b19vYmpbdG9rZW4uaWRdWzBdCisgICAgZWxzZToKKyAgICAgICAgaW5jcmVmID0gKAorICAgICAgICAgICAga3dkcy5wb3AoJ2luY3JlZicsIFRydWUpIGFuZAorICAgICAgICAgICAgbm90IGdldGF0dHIoY3VycmVudF9wcm9jZXNzKCksICdfaW5oZXJpdGluZycsIEZhbHNlKQorICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gZnVuYyh0b2tlbiwgc2VyaWFsaXplciwgaW5jcmVmPWluY3JlZiwgKiprd2RzKQorCisjCisjIEZ1bmN0aW9ucyB0byBjcmVhdGUgcHJveGllcyBhbmQgcHJveHkgdHlwZXMKKyMKKworZGVmIE1ha2VQcm94eVR5cGUobmFtZSwgZXhwb3NlZCwgX2NhY2hlPXt9KToKKyAgICAnJycKKyAgICBSZXR1cm4gYW4gcHJveHkgdHlwZSB3aG9zZSBtZXRob2RzIGFyZSBnaXZlbiBieSBgZXhwb3NlZGAKKyAgICAnJycKKyAgICBleHBvc2VkID0gdHVwbGUoZXhwb3NlZCkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBfY2FjaGVbKG5hbWUsIGV4cG9zZWQpXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcGFzcworCisgICAgZGljID0ge30KKworICAgIGZvciBtZXRoIGluIGV4cG9zZWQ6CisgICAgICAgIGV4ZWMgJycnZGVmICVzKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCglciwgYXJncywga3dkcyknJycgJSAobWV0aCwgbWV0aCkgaW4gZGljCisKKyAgICBQcm94eVR5cGUgPSB0eXBlKG5hbWUsIChCYXNlUHJveHksKSwgZGljKQorICAgIFByb3h5VHlwZS5fZXhwb3NlZF8gPSBleHBvc2VkCisgICAgX2NhY2hlWyhuYW1lLCBleHBvc2VkKV0gPSBQcm94eVR5cGUKKyAgICByZXR1cm4gUHJveHlUeXBlCisKKworZGVmIEF1dG9Qcm94eSh0b2tlbiwgc2VyaWFsaXplciwgbWFuYWdlcj1Ob25lLCBhdXRoa2V5PU5vbmUsCisgICAgICAgICAgICAgIGV4cG9zZWQ9Tm9uZSwgaW5jcmVmPVRydWUpOgorICAgICcnJworICAgIFJldHVybiBhbiBhdXRvLXByb3h5IGZvciBgdG9rZW5gCisgICAgJycnCisgICAgX0NsaWVudCA9IGxpc3RlbmVyX2NsaWVudFtzZXJpYWxpemVyXVsxXQorCisgICAgaWYgZXhwb3NlZCBpcyBOb25lOgorICAgICAgICBjb25uID0gX0NsaWVudCh0b2tlbi5hZGRyZXNzLCBhdXRoa2V5PWF1dGhrZXkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4cG9zZWQgPSBkaXNwYXRjaChjb25uLCBOb25lLCAnZ2V0X21ldGhvZHMnLCAodG9rZW4sKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgaWYgYXV0aGtleSBpcyBOb25lIGFuZCBtYW5hZ2VyIGlzIG5vdCBOb25lOgorICAgICAgICBhdXRoa2V5ID0gbWFuYWdlci5fYXV0aGtleQorICAgIGlmIGF1dGhrZXkgaXMgTm9uZToKKyAgICAgICAgYXV0aGtleSA9IGN1cnJlbnRfcHJvY2VzcygpLmF1dGhrZXkKKworICAgIFByb3h5VHlwZSA9IE1ha2VQcm94eVR5cGUoJ0F1dG9Qcm94eVslc10nICUgdG9rZW4udHlwZWlkLCBleHBvc2VkKQorICAgIHByb3h5ID0gUHJveHlUeXBlKHRva2VuLCBzZXJpYWxpemVyLCBtYW5hZ2VyPW1hbmFnZXIsIGF1dGhrZXk9YXV0aGtleSwKKyAgICAgICAgICAgICAgICAgICAgICBpbmNyZWY9aW5jcmVmKQorICAgIHByb3h5Ll9pc2F1dG8gPSBUcnVlCisgICAgcmV0dXJuIHByb3h5CisKKyMKKyMgVHlwZXMvY2FsbGFibGVzIHdoaWNoIHdlIHdpbGwgcmVnaXN0ZXIgd2l0aCBTeW5jTWFuYWdlcgorIworCitjbGFzcyBOYW1lc3BhY2Uob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2RzKToKKyAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoa3dkcykKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGl0ZW1zID0gc2VsZi5fX2RpY3RfXy5pdGVtcygpCisgICAgICAgIHRlbXAgPSBbXQorICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gaXRlbXM6CisgICAgICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICAgICAgdGVtcC5hcHBlbmQoJyVzPSVyJyAlIChuYW1lLCB2YWx1ZSkpCisgICAgICAgIHRlbXAuc29ydCgpCisgICAgICAgIHJldHVybiAnTmFtZXNwYWNlKCVzKScgJSBzdHIuam9pbignLCAnLCB0ZW1wKQorCitjbGFzcyBWYWx1ZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlY29kZSwgdmFsdWUsIGxvY2s9VHJ1ZSk6CisgICAgICAgIHNlbGYuX3R5cGVjb2RlID0gdHlwZWNvZGUKKyAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQorICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzKCVyLCAlciknJSh0eXBlKHNlbGYpLl9fbmFtZV9fLCBzZWxmLl90eXBlY29kZSwgc2VsZi5fdmFsdWUpCisgICAgdmFsdWUgPSBwcm9wZXJ0eShnZXQsIHNldCkKKworZGVmIEFycmF5KHR5cGVjb2RlLCBzZXF1ZW5jZSwgbG9jaz1UcnVlKToKKyAgICByZXR1cm4gYXJyYXkuYXJyYXkodHlwZWNvZGUsIHNlcXVlbmNlKQorCisjCisjIFByb3h5IHR5cGVzIHVzZWQgYnkgU3luY01hbmFnZXIKKyMKKworY2xhc3MgSXRlcmF0b3JQcm94eShCYXNlUHJveHkpOgorICAgICMgWFhYIHJlbW92ZSBtZXRob2RzIGZvciBQeTMuMCBhbmQgUHkyLjYKKyAgICBfZXhwb3NlZF8gPSAoJ19fbmV4dF9fJywgJ25leHQnLCAnc2VuZCcsICd0aHJvdycsICdjbG9zZScpCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX25leHRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdfX25leHRfXycsIGFyZ3MpCisgICAgZGVmIG5leHQoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnbmV4dCcsIGFyZ3MpCisgICAgZGVmIHNlbmQoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnc2VuZCcsIGFyZ3MpCisgICAgZGVmIHRocm93KHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ3Rocm93JywgYXJncykKKyAgICBkZWYgY2xvc2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnY2xvc2UnLCBhcmdzKQorCisKK2NsYXNzIEFjcXVpcmVyUHJveHkoQmFzZVByb3h5KToKKyAgICBfZXhwb3NlZF8gPSAoJ2FjcXVpcmUnLCAncmVsZWFzZScpCisgICAgZGVmIGFjcXVpcmUoc2VsZiwgYmxvY2tpbmc9VHJ1ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdhY3F1aXJlJywgKGJsb2NraW5nLCkpCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdyZWxlYXNlJykKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnYWNxdWlyZScpCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgncmVsZWFzZScpCisKKworY2xhc3MgQ29uZGl0aW9uUHJveHkoQWNxdWlyZXJQcm94eSk6CisgICAgIyBYWFggd2lsbCBDb25kaXRpb24ubm90ZnlBbGwoKSBuYW1lIGJlIGF2YWlsYWJsZSBpbiBQeTMuMD8KKyAgICBfZXhwb3NlZF8gPSAoJ2FjcXVpcmUnLCAncmVsZWFzZScsICd3YWl0JywgJ25vdGlmeScsICdub3RpZnlfYWxsJykKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnd2FpdCcsICh0aW1lb3V0LCkpCisgICAgZGVmIG5vdGlmeShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ25vdGlmeScpCisgICAgZGVmIG5vdGlmeV9hbGwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdub3RpZnlfYWxsJykKKworY2xhc3MgRXZlbnRQcm94eShCYXNlUHJveHkpOgorICAgIF9leHBvc2VkXyA9ICgnaXNfc2V0JywgJ3NldCcsICdjbGVhcicsICd3YWl0JykKKyAgICBkZWYgaXNfc2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnaXNfc2V0JykKKyAgICBkZWYgc2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY2FsbG1ldGhvZCgnc2V0JykKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdjbGVhcicpCisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ3dhaXQnLCAodGltZW91dCwpKQorCitjbGFzcyBOYW1lc3BhY2VQcm94eShCYXNlUHJveHkpOgorICAgIF9leHBvc2VkXyA9ICgnX19nZXRhdHRyaWJ1dGVfXycsICdfX3NldGF0dHJfXycsICdfX2RlbGF0dHJfXycpCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGtleSk6CisgICAgICAgIGlmIGtleVswXSA9PSAnXyc6CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwga2V5KQorICAgICAgICBjYWxsbWV0aG9kID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19jYWxsbWV0aG9kJykKKyAgICAgICAgcmV0dXJuIGNhbGxtZXRob2QoJ19fZ2V0YXR0cmlidXRlX18nLCAoa2V5LCkpCisgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBpZiBrZXlbMF0gPT0gJ18nOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBrZXksIHZhbHVlKQorICAgICAgICBjYWxsbWV0aG9kID0gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgJ19jYWxsbWV0aG9kJykKKyAgICAgICAgcmV0dXJuIGNhbGxtZXRob2QoJ19fc2V0YXR0cl9fJywgKGtleSwgdmFsdWUpKQorICAgIGRlZiBfX2RlbGF0dHJfXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBrZXlbMF0gPT0gJ18nOgorICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2RlbGF0dHJfXyhzZWxmLCBrZXkpCisgICAgICAgIGNhbGxtZXRob2QgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2NhbGxtZXRob2QnKQorICAgICAgICByZXR1cm4gY2FsbG1ldGhvZCgnX19kZWxhdHRyX18nLCAoa2V5LCkpCisKKworY2xhc3MgVmFsdWVQcm94eShCYXNlUHJveHkpOgorICAgIF9leHBvc2VkXyA9ICgnZ2V0JywgJ3NldCcpCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NhbGxtZXRob2QoJ2dldCcpCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdzZXQnLCAodmFsdWUsKSkKKyAgICB2YWx1ZSA9IHByb3BlcnR5KGdldCwgc2V0KQorCisKK0Jhc2VMaXN0UHJveHkgPSBNYWtlUHJveHlUeXBlKCdCYXNlTGlzdFByb3h5JywgKAorICAgICdfX2FkZF9fJywgJ19fY29udGFpbnNfXycsICdfX2RlbGl0ZW1fXycsICdfX2RlbHNsaWNlX18nLAorICAgICdfX2dldGl0ZW1fXycsICdfX2dldHNsaWNlX18nLCAnX19sZW5fXycsICdfX211bF9fJywKKyAgICAnX19yZXZlcnNlZF9fJywgJ19fcm11bF9fJywgJ19fc2V0aXRlbV9fJywgJ19fc2V0c2xpY2VfXycsCisgICAgJ2FwcGVuZCcsICdjb3VudCcsICdleHRlbmQnLCAnaW5kZXgnLCAnaW5zZXJ0JywgJ3BvcCcsICdyZW1vdmUnLAorICAgICdyZXZlcnNlJywgJ3NvcnQnLCAnX19pbXVsX18nCisgICAgKSkgICAgICAgICAgICAgICAgICAjIFhYWCBfX2dldHNsaWNlX18gYW5kIF9fc2V0c2xpY2VfXyB1bm5lZWRlZCBpbiBQeTMuMAorY2xhc3MgTGlzdFByb3h5KEJhc2VMaXN0UHJveHkpOgorICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX2NhbGxtZXRob2QoJ2V4dGVuZCcsICh2YWx1ZSwpKQorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBfX2ltdWxfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX2NhbGxtZXRob2QoJ19faW11bF9fJywgKHZhbHVlLCkpCisgICAgICAgIHJldHVybiBzZWxmCisKKworRGljdFByb3h5ID0gTWFrZVByb3h5VHlwZSgnRGljdFByb3h5JywgKAorICAgICdfX2NvbnRhaW5zX18nLCAnX19kZWxpdGVtX18nLCAnX19nZXRpdGVtX18nLCAnX19sZW5fXycsCisgICAgJ19fc2V0aXRlbV9fJywgJ2NsZWFyJywgJ2NvcHknLCAnZ2V0JywgJ2hhc19rZXknLCAnaXRlbXMnLAorICAgICdrZXlzJywgJ3BvcCcsICdwb3BpdGVtJywgJ3NldGRlZmF1bHQnLCAndXBkYXRlJywgJ3ZhbHVlcycKKyAgICApKQorCisKK0FycmF5UHJveHkgPSBNYWtlUHJveHlUeXBlKCdBcnJheVByb3h5JywgKAorICAgICdfX2xlbl9fJywgJ19fZ2V0aXRlbV9fJywgJ19fc2V0aXRlbV9fJywgJ19fZ2V0c2xpY2VfXycsICdfX3NldHNsaWNlX18nCisgICAgKSkgICAgICAgICAgICAgICAgICAjIFhYWCBfX2dldHNsaWNlX18gYW5kIF9fc2V0c2xpY2VfXyB1bm5lZWRlZCBpbiBQeTMuMAorCisKK1Bvb2xQcm94eSA9IE1ha2VQcm94eVR5cGUoJ1Bvb2xQcm94eScsICgKKyAgICAnYXBwbHknLCAnYXBwbHlfYXN5bmMnLCAnY2xvc2UnLCAnaW1hcCcsICdpbWFwX3Vub3JkZXJlZCcsICdqb2luJywKKyAgICAnbWFwJywgJ21hcF9hc3luYycsICd0ZXJtaW5hdGUnCisgICAgKSkKK1Bvb2xQcm94eS5fbWV0aG9kX3RvX3R5cGVpZF8gPSB7CisgICAgJ2FwcGx5X2FzeW5jJzogJ0FzeW5jUmVzdWx0JywKKyAgICAnbWFwX2FzeW5jJzogJ0FzeW5jUmVzdWx0JywKKyAgICAnaW1hcCc6ICdJdGVyYXRvcicsCisgICAgJ2ltYXBfdW5vcmRlcmVkJzogJ0l0ZXJhdG9yJworICAgIH0KKworIworIyBEZWZpbml0aW9uIG9mIFN5bmNNYW5hZ2VyCisjCisKK2NsYXNzIFN5bmNNYW5hZ2VyKEJhc2VNYW5hZ2VyKToKKyAgICAnJycKKyAgICBTdWJjbGFzcyBvZiBgQmFzZU1hbmFnZXJgIHdoaWNoIHN1cHBvcnRzIGEgbnVtYmVyIG9mIHNoYXJlZCBvYmplY3QgdHlwZXMuCisKKyAgICBUaGUgdHlwZXMgcmVnaXN0ZXJlZCBhcmUgdGhvc2UgaW50ZW5kZWQgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24KKyAgICBvZiB0aHJlYWRzLCBwbHVzIGBkaWN0YCwgYGxpc3RgIGFuZCBgTmFtZXNwYWNlYC4KKworICAgIFRoZSBgbXVsdGlwcm9jZXNzaW5nLk1hbmFnZXIoKWAgZnVuY3Rpb24gY3JlYXRlcyBzdGFydGVkIGluc3RhbmNlcyBvZgorICAgIHRoaXMgY2xhc3MuCisgICAgJycnCisKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdRdWV1ZScsIFF1ZXVlLlF1ZXVlKQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ0pvaW5hYmxlUXVldWUnLCBRdWV1ZS5RdWV1ZSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdFdmVudCcsIHRocmVhZGluZy5FdmVudCwgRXZlbnRQcm94eSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdMb2NrJywgdGhyZWFkaW5nLkxvY2ssIEFjcXVpcmVyUHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignUkxvY2snLCB0aHJlYWRpbmcuUkxvY2ssIEFjcXVpcmVyUHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignU2VtYXBob3JlJywgdGhyZWFkaW5nLlNlbWFwaG9yZSwgQWNxdWlyZXJQcm94eSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdCb3VuZGVkU2VtYXBob3JlJywgdGhyZWFkaW5nLkJvdW5kZWRTZW1hcGhvcmUsCisgICAgICAgICAgICAgICAgICAgICBBY3F1aXJlclByb3h5KQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ0NvbmRpdGlvbicsIHRocmVhZGluZy5Db25kaXRpb24sIENvbmRpdGlvblByb3h5KQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ1Bvb2wnLCBQb29sLCBQb29sUHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignbGlzdCcsIGxpc3QsIExpc3RQcm94eSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdkaWN0JywgZGljdCwgRGljdFByb3h5KQorU3luY01hbmFnZXIucmVnaXN0ZXIoJ1ZhbHVlJywgVmFsdWUsIFZhbHVlUHJveHkpCitTeW5jTWFuYWdlci5yZWdpc3RlcignQXJyYXknLCBBcnJheSwgQXJyYXlQcm94eSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdOYW1lc3BhY2UnLCBOYW1lc3BhY2UsIE5hbWVzcGFjZVByb3h5KQorCisjIHR5cGVzIHJldHVybmVkIGJ5IG1ldGhvZHMgb2YgUG9vbFByb3h5CitTeW5jTWFuYWdlci5yZWdpc3RlcignSXRlcmF0b3InLCBwcm94eXR5cGU9SXRlcmF0b3JQcm94eSwgY3JlYXRlX21ldGhvZD1GYWxzZSkKK1N5bmNNYW5hZ2VyLnJlZ2lzdGVyKCdBc3luY1Jlc3VsdCcsIGNyZWF0ZV9tZXRob2Q9RmFsc2UpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weWMgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4YjRiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL21hbmFnZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weW8gYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9tYW5hZ2Vycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyMDhmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL21hbmFnZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wb29sLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDE4NjAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcG9vbC5weQpAQCAtMCwwICsxLDczMSBAQAorIworIyBNb2R1bGUgcHJvdmlkaW5nIHRoZSBgUG9vbGAgY2xhc3MgZm9yIG1hbmFnaW5nIGEgcHJvY2VzcyBwb29sCisjCisjIG11bHRpcHJvY2Vzc2luZy9wb29sLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK19fYWxsX18gPSBbJ1Bvb2wnXQorCisjCisjIEltcG9ydHMKKyMKKworaW1wb3J0IHRocmVhZGluZworaW1wb3J0IFF1ZXVlCitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgY29sbGVjdGlvbnMKK2ltcG9ydCB0aW1lCisKK2Zyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBQcm9jZXNzLCBjcHVfY291bnQsIFRpbWVvdXRFcnJvcgorZnJvbSBtdWx0aXByb2Nlc3NpbmcudXRpbCBpbXBvcnQgRmluYWxpemUsIGRlYnVnCisKKyMKKyMgQ29uc3RhbnRzIHJlcHJlc2VudGluZyB0aGUgc3RhdGUgb2YgYSBwb29sCisjCisKK1JVTiA9IDAKK0NMT1NFID0gMQorVEVSTUlOQVRFID0gMgorCisjCisjIE1pc2NlbGxhbmVvdXMKKyMKKworam9iX2NvdW50ZXIgPSBpdGVydG9vbHMuY291bnQoKQorCitkZWYgbWFwc3RhcihhcmdzKToKKyAgICByZXR1cm4gbWFwKCphcmdzKQorCisjCisjIENvZGUgcnVuIGJ5IHdvcmtlciBwcm9jZXNzZXMKKyMKKworY2xhc3MgTWF5YmVFbmNvZGluZ0Vycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiV3JhcHMgcG9zc2libGUgdW5waWNrbGVhYmxlIGVycm9ycywgc28gdGhleSBjYW4gYmUKKyAgICBzYWZlbHkgc2VudCB0aHJvdWdoIHRoZSBzb2NrZXQuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXhjLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuZXhjID0gcmVwcihleGMpCisgICAgICAgIHNlbGYudmFsdWUgPSByZXByKHZhbHVlKQorICAgICAgICBzdXBlcihNYXliZUVuY29kaW5nRXJyb3IsIHNlbGYpLl9faW5pdF9fKHNlbGYuZXhjLCBzZWxmLnZhbHVlKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiRXJyb3Igc2VuZGluZyByZXN1bHQ6ICclcycuIFJlYXNvbjogJyVzJyIgJSAoc2VsZi52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmV4YykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8TWF5YmVFbmNvZGluZ0Vycm9yOiAlcz4iICUgc3RyKHNlbGYpCisKKworZGVmIHdvcmtlcihpbnF1ZXVlLCBvdXRxdWV1ZSwgaW5pdGlhbGl6ZXI9Tm9uZSwgaW5pdGFyZ3M9KCksIG1heHRhc2tzPU5vbmUpOgorICAgIGFzc2VydCBtYXh0YXNrcyBpcyBOb25lIG9yICh0eXBlKG1heHRhc2tzKSA9PSBpbnQgYW5kIG1heHRhc2tzID4gMCkKKyAgICBwdXQgPSBvdXRxdWV1ZS5wdXQKKyAgICBnZXQgPSBpbnF1ZXVlLmdldAorICAgIGlmIGhhc2F0dHIoaW5xdWV1ZSwgJ193cml0ZXInKToKKyAgICAgICAgaW5xdWV1ZS5fd3JpdGVyLmNsb3NlKCkKKyAgICAgICAgb3V0cXVldWUuX3JlYWRlci5jbG9zZSgpCisKKyAgICBpZiBpbml0aWFsaXplciBpcyBub3QgTm9uZToKKyAgICAgICAgaW5pdGlhbGl6ZXIoKmluaXRhcmdzKQorCisgICAgY29tcGxldGVkID0gMAorICAgIHdoaWxlIG1heHRhc2tzIGlzIE5vbmUgb3IgKG1heHRhc2tzIGFuZCBjb21wbGV0ZWQgPCBtYXh0YXNrcyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhc2sgPSBnZXQoKQorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgIGRlYnVnKCd3b3JrZXIgZ290IEVPRkVycm9yIG9yIElPRXJyb3IgLS0gZXhpdGluZycpCisgICAgICAgICAgICBicmVhaworCisgICAgICAgIGlmIHRhc2sgaXMgTm9uZToKKyAgICAgICAgICAgIGRlYnVnKCd3b3JrZXIgZ290IHNlbnRpbmVsIC0tIGV4aXRpbmcnKQorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBqb2IsIGksIGZ1bmMsIGFyZ3MsIGt3ZHMgPSB0YXNrCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IChUcnVlLCBmdW5jKCphcmdzLCAqKmt3ZHMpKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgcmVzdWx0ID0gKEZhbHNlLCBlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwdXQoKGpvYiwgaSwgcmVzdWx0KSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgd3JhcHBlZCA9IE1heWJlRW5jb2RpbmdFcnJvcihlLCByZXN1bHRbMV0pCisgICAgICAgICAgICBkZWJ1ZygiUG9zc2libGUgZW5jb2RpbmcgZXJyb3Igd2hpbGUgc2VuZGluZyByZXN1bHQ6ICVzIiAlICgKKyAgICAgICAgICAgICAgICB3cmFwcGVkKSkKKyAgICAgICAgICAgIHB1dCgoam9iLCBpLCAoRmFsc2UsIHdyYXBwZWQpKSkKKyAgICAgICAgY29tcGxldGVkICs9IDEKKyAgICBkZWJ1Zygnd29ya2VyIGV4aXRpbmcgYWZ0ZXIgJWQgdGFza3MnICUgY29tcGxldGVkKQorCisjCisjIENsYXNzIHJlcHJlc2VudGluZyBhIHByb2Nlc3MgcG9vbAorIworCitjbGFzcyBQb29sKG9iamVjdCk6CisgICAgJycnCisgICAgQ2xhc3Mgd2hpY2ggc3VwcG9ydHMgYW4gYXN5bmMgdmVyc2lvbiBvZiB0aGUgYGFwcGx5KClgIGJ1aWx0aW4KKyAgICAnJycKKyAgICBQcm9jZXNzID0gUHJvY2VzcworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2Nlc3Nlcz1Ob25lLCBpbml0aWFsaXplcj1Ob25lLCBpbml0YXJncz0oKSwKKyAgICAgICAgICAgICAgICAgbWF4dGFza3NwZXJjaGlsZD1Ob25lKToKKyAgICAgICAgc2VsZi5fc2V0dXBfcXVldWVzKCkKKyAgICAgICAgc2VsZi5fdGFza3F1ZXVlID0gUXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLl9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYuX3N0YXRlID0gUlVOCisgICAgICAgIHNlbGYuX21heHRhc2tzcGVyY2hpbGQgPSBtYXh0YXNrc3BlcmNoaWxkCisgICAgICAgIHNlbGYuX2luaXRpYWxpemVyID0gaW5pdGlhbGl6ZXIKKyAgICAgICAgc2VsZi5faW5pdGFyZ3MgPSBpbml0YXJncworCisgICAgICAgIGlmIHByb2Nlc3NlcyBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByb2Nlc3NlcyA9IGNwdV9jb3VudCgpCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICBwcm9jZXNzZXMgPSAxCisgICAgICAgIGlmIHByb2Nlc3NlcyA8IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJOdW1iZXIgb2YgcHJvY2Vzc2VzIG11c3QgYmUgYXQgbGVhc3QgMSIpCisKKyAgICAgICAgaWYgaW5pdGlhbGl6ZXIgaXMgbm90IE5vbmUgYW5kIG5vdCBoYXNhdHRyKGluaXRpYWxpemVyLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignaW5pdGlhbGl6ZXIgbXVzdCBiZSBhIGNhbGxhYmxlJykKKworICAgICAgICBzZWxmLl9wcm9jZXNzZXMgPSBwcm9jZXNzZXMKKyAgICAgICAgc2VsZi5fcG9vbCA9IFtdCisgICAgICAgIHNlbGYuX3JlcG9wdWxhdGVfcG9vbCgpCisKKyAgICAgICAgc2VsZi5fd29ya2VyX2hhbmRsZXIgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgdGFyZ2V0PVBvb2wuX2hhbmRsZV93b3JrZXJzLAorICAgICAgICAgICAgYXJncz0oc2VsZiwgKQorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLl93b3JrZXJfaGFuZGxlci5kYWVtb24gPSBUcnVlCisgICAgICAgIHNlbGYuX3dvcmtlcl9oYW5kbGVyLl9zdGF0ZSA9IFJVTgorICAgICAgICBzZWxmLl93b3JrZXJfaGFuZGxlci5zdGFydCgpCisKKworICAgICAgICBzZWxmLl90YXNrX2hhbmRsZXIgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgdGFyZ2V0PVBvb2wuX2hhbmRsZV90YXNrcywKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuX3Rhc2txdWV1ZSwgc2VsZi5fcXVpY2tfcHV0LCBzZWxmLl9vdXRxdWV1ZSwgc2VsZi5fcG9vbCkKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5fdGFza19oYW5kbGVyLmRhZW1vbiA9IFRydWUKKyAgICAgICAgc2VsZi5fdGFza19oYW5kbGVyLl9zdGF0ZSA9IFJVTgorICAgICAgICBzZWxmLl90YXNrX2hhbmRsZXIuc3RhcnQoKQorCisgICAgICAgIHNlbGYuX3Jlc3VsdF9oYW5kbGVyID0gdGhyZWFkaW5nLlRocmVhZCgKKyAgICAgICAgICAgIHRhcmdldD1Qb29sLl9oYW5kbGVfcmVzdWx0cywKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuX291dHF1ZXVlLCBzZWxmLl9xdWlja19nZXQsIHNlbGYuX2NhY2hlKQorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLl9yZXN1bHRfaGFuZGxlci5kYWVtb24gPSBUcnVlCisgICAgICAgIHNlbGYuX3Jlc3VsdF9oYW5kbGVyLl9zdGF0ZSA9IFJVTgorICAgICAgICBzZWxmLl9yZXN1bHRfaGFuZGxlci5zdGFydCgpCisKKyAgICAgICAgc2VsZi5fdGVybWluYXRlID0gRmluYWxpemUoCisgICAgICAgICAgICBzZWxmLCBzZWxmLl90ZXJtaW5hdGVfcG9vbCwKKyAgICAgICAgICAgIGFyZ3M9KHNlbGYuX3Rhc2txdWV1ZSwgc2VsZi5faW5xdWV1ZSwgc2VsZi5fb3V0cXVldWUsIHNlbGYuX3Bvb2wsCisgICAgICAgICAgICAgICAgICBzZWxmLl93b3JrZXJfaGFuZGxlciwgc2VsZi5fdGFza19oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgc2VsZi5fcmVzdWx0X2hhbmRsZXIsIHNlbGYuX2NhY2hlKSwKKyAgICAgICAgICAgIGV4aXRwcmlvcml0eT0xNQorICAgICAgICAgICAgKQorCisgICAgZGVmIF9qb2luX2V4aXRlZF93b3JrZXJzKHNlbGYpOgorICAgICAgICAiIiJDbGVhbnVwIGFmdGVyIGFueSB3b3JrZXIgcHJvY2Vzc2VzIHdoaWNoIGhhdmUgZXhpdGVkIGR1ZSB0byByZWFjaGluZworICAgICAgICB0aGVpciBzcGVjaWZpZWQgbGlmZXRpbWUuICBSZXR1cm5zIFRydWUgaWYgYW55IHdvcmtlcnMgd2VyZSBjbGVhbmVkIHVwLgorICAgICAgICAiIiIKKyAgICAgICAgY2xlYW5lZCA9IEZhbHNlCisgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLl9wb29sKSkpOgorICAgICAgICAgICAgd29ya2VyID0gc2VsZi5fcG9vbFtpXQorICAgICAgICAgICAgaWYgd29ya2VyLmV4aXRjb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgd29ya2VyIGV4aXRlZAorICAgICAgICAgICAgICAgIGRlYnVnKCdjbGVhbmluZyB1cCB3b3JrZXIgJWQnICUgaSkKKyAgICAgICAgICAgICAgICB3b3JrZXIuam9pbigpCisgICAgICAgICAgICAgICAgY2xlYW5lZCA9IFRydWUKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fcG9vbFtpXQorICAgICAgICByZXR1cm4gY2xlYW5lZAorCisgICAgZGVmIF9yZXBvcHVsYXRlX3Bvb2woc2VsZik6CisgICAgICAgICIiIkJyaW5nIHRoZSBudW1iZXIgb2YgcG9vbCBwcm9jZXNzZXMgdXAgdG8gdGhlIHNwZWNpZmllZCBudW1iZXIsCisgICAgICAgIGZvciB1c2UgYWZ0ZXIgcmVhcGluZyB3b3JrZXJzIHdoaWNoIGhhdmUgZXhpdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2VsZi5fcHJvY2Vzc2VzIC0gbGVuKHNlbGYuX3Bvb2wpKToKKyAgICAgICAgICAgIHcgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXdvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oc2VsZi5faW5xdWV1ZSwgc2VsZi5fb3V0cXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luaXRpYWxpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pbml0YXJncywgc2VsZi5fbWF4dGFza3NwZXJjaGlsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLl9wb29sLmFwcGVuZCh3KQorICAgICAgICAgICAgdy5uYW1lID0gdy5uYW1lLnJlcGxhY2UoJ1Byb2Nlc3MnLCAnUG9vbFdvcmtlcicpCisgICAgICAgICAgICB3LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHcuc3RhcnQoKQorICAgICAgICAgICAgZGVidWcoJ2FkZGVkIHdvcmtlcicpCisKKyAgICBkZWYgX21haW50YWluX3Bvb2woc2VsZik6CisgICAgICAgICIiIkNsZWFuIHVwIGFueSBleGl0ZWQgd29ya2VycyBhbmQgc3RhcnQgcmVwbGFjZW1lbnRzIGZvciB0aGVtLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5fam9pbl9leGl0ZWRfd29ya2VycygpOgorICAgICAgICAgICAgc2VsZi5fcmVwb3B1bGF0ZV9wb29sKCkKKworICAgIGRlZiBfc2V0dXBfcXVldWVzKHNlbGYpOgorICAgICAgICBmcm9tIC5xdWV1ZXMgaW1wb3J0IFNpbXBsZVF1ZXVlCisgICAgICAgIHNlbGYuX2lucXVldWUgPSBTaW1wbGVRdWV1ZSgpCisgICAgICAgIHNlbGYuX291dHF1ZXVlID0gU2ltcGxlUXVldWUoKQorICAgICAgICBzZWxmLl9xdWlja19wdXQgPSBzZWxmLl9pbnF1ZXVlLl93cml0ZXIuc2VuZAorICAgICAgICBzZWxmLl9xdWlja19nZXQgPSBzZWxmLl9vdXRxdWV1ZS5fcmVhZGVyLnJlY3YKKworICAgIGRlZiBhcHBseShzZWxmLCBmdW5jLCBhcmdzPSgpLCBrd2RzPXt9KToKKyAgICAgICAgJycnCisgICAgICAgIEVxdWl2YWxlbnQgb2YgYGFwcGx5KClgIGJ1aWx0aW4KKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZSA9PSBSVU4KKyAgICAgICAgcmV0dXJuIHNlbGYuYXBwbHlfYXN5bmMoZnVuYywgYXJncywga3dkcykuZ2V0KCkKKworICAgIGRlZiBtYXAoc2VsZiwgZnVuYywgaXRlcmFibGUsIGNodW5rc2l6ZT1Ob25lKToKKyAgICAgICAgJycnCisgICAgICAgIEVxdWl2YWxlbnQgb2YgYG1hcCgpYCBidWlsdGluCisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUgPT0gUlVOCisgICAgICAgIHJldHVybiBzZWxmLm1hcF9hc3luYyhmdW5jLCBpdGVyYWJsZSwgY2h1bmtzaXplKS5nZXQoKQorCisgICAgZGVmIGltYXAoc2VsZiwgZnVuYywgaXRlcmFibGUsIGNodW5rc2l6ZT0xKToKKyAgICAgICAgJycnCisgICAgICAgIEVxdWl2YWxlbnQgb2YgYGl0ZXJ0b29scy5pbWFwKClgIC0tIGNhbiBiZSBNVUNIIHNsb3dlciB0aGFuIGBQb29sLm1hcCgpYAorICAgICAgICAnJycKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3N0YXRlID09IFJVTgorICAgICAgICBpZiBjaHVua3NpemUgPT0gMToKKyAgICAgICAgICAgIHJlc3VsdCA9IElNYXBJdGVyYXRvcihzZWxmLl9jYWNoZSkKKyAgICAgICAgICAgIHNlbGYuX3Rhc2txdWV1ZS5wdXQoKCgocmVzdWx0Ll9qb2IsIGksIGZ1bmMsICh4LCksIHt9KQorICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpLCB4IGluIGVudW1lcmF0ZShpdGVyYWJsZSkpLCByZXN1bHQuX3NldF9sZW5ndGgpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IGNodW5rc2l6ZSA+IDEKKyAgICAgICAgICAgIHRhc2tfYmF0Y2hlcyA9IFBvb2wuX2dldF90YXNrcyhmdW5jLCBpdGVyYWJsZSwgY2h1bmtzaXplKQorICAgICAgICAgICAgcmVzdWx0ID0gSU1hcEl0ZXJhdG9yKHNlbGYuX2NhY2hlKQorICAgICAgICAgICAgc2VsZi5fdGFza3F1ZXVlLnB1dCgoKChyZXN1bHQuX2pvYiwgaSwgbWFwc3RhciwgKHgsKSwge30pCisgICAgICAgICAgICAgICAgICAgICBmb3IgaSwgeCBpbiBlbnVtZXJhdGUodGFza19iYXRjaGVzKSksIHJlc3VsdC5fc2V0X2xlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gKGl0ZW0gZm9yIGNodW5rIGluIHJlc3VsdCBmb3IgaXRlbSBpbiBjaHVuaykKKworICAgIGRlZiBpbWFwX3Vub3JkZXJlZChzZWxmLCBmdW5jLCBpdGVyYWJsZSwgY2h1bmtzaXplPTEpOgorICAgICAgICAnJycKKyAgICAgICAgTGlrZSBgaW1hcCgpYCBtZXRob2QgYnV0IG9yZGVyaW5nIG9mIHJlc3VsdHMgaXMgYXJiaXRyYXJ5CisgICAgICAgICcnJworICAgICAgICBhc3NlcnQgc2VsZi5fc3RhdGUgPT0gUlVOCisgICAgICAgIGlmIGNodW5rc2l6ZSA9PSAxOgorICAgICAgICAgICAgcmVzdWx0ID0gSU1hcFVub3JkZXJlZEl0ZXJhdG9yKHNlbGYuX2NhY2hlKQorICAgICAgICAgICAgc2VsZi5fdGFza3F1ZXVlLnB1dCgoKChyZXN1bHQuX2pvYiwgaSwgZnVuYywgKHgsKSwge30pCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGksIHggaW4gZW51bWVyYXRlKGl0ZXJhYmxlKSksIHJlc3VsdC5fc2V0X2xlbmd0aCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgY2h1bmtzaXplID4gMQorICAgICAgICAgICAgdGFza19iYXRjaGVzID0gUG9vbC5fZ2V0X3Rhc2tzKGZ1bmMsIGl0ZXJhYmxlLCBjaHVua3NpemUpCisgICAgICAgICAgICByZXN1bHQgPSBJTWFwVW5vcmRlcmVkSXRlcmF0b3Ioc2VsZi5fY2FjaGUpCisgICAgICAgICAgICBzZWxmLl90YXNrcXVldWUucHV0KCgoKHJlc3VsdC5fam9iLCBpLCBtYXBzdGFyLCAoeCwpLCB7fSkKKyAgICAgICAgICAgICAgICAgICAgIGZvciBpLCB4IGluIGVudW1lcmF0ZSh0YXNrX2JhdGNoZXMpKSwgcmVzdWx0Ll9zZXRfbGVuZ3RoKSkKKyAgICAgICAgICAgIHJldHVybiAoaXRlbSBmb3IgY2h1bmsgaW4gcmVzdWx0IGZvciBpdGVtIGluIGNodW5rKQorCisgICAgZGVmIGFwcGx5X2FzeW5jKHNlbGYsIGZ1bmMsIGFyZ3M9KCksIGt3ZHM9e30sIGNhbGxiYWNrPU5vbmUpOgorICAgICAgICAnJycKKyAgICAgICAgQXN5bmNocm9ub3VzIGVxdWl2YWxlbnQgb2YgYGFwcGx5KClgIGJ1aWx0aW4KKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZSA9PSBSVU4KKyAgICAgICAgcmVzdWx0ID0gQXBwbHlSZXN1bHQoc2VsZi5fY2FjaGUsIGNhbGxiYWNrKQorICAgICAgICBzZWxmLl90YXNrcXVldWUucHV0KChbKHJlc3VsdC5fam9iLCBOb25lLCBmdW5jLCBhcmdzLCBrd2RzKV0sIE5vbmUpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgbWFwX2FzeW5jKHNlbGYsIGZ1bmMsIGl0ZXJhYmxlLCBjaHVua3NpemU9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgICcnJworICAgICAgICBBc3luY2hyb25vdXMgZXF1aXZhbGVudCBvZiBgbWFwKClgIGJ1aWx0aW4KKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9zdGF0ZSA9PSBSVU4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoaXRlcmFibGUsICdfX2xlbl9fJyk6CisgICAgICAgICAgICBpdGVyYWJsZSA9IGxpc3QoaXRlcmFibGUpCisKKyAgICAgICAgaWYgY2h1bmtzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBjaHVua3NpemUsIGV4dHJhID0gZGl2bW9kKGxlbihpdGVyYWJsZSksIGxlbihzZWxmLl9wb29sKSAqIDQpCisgICAgICAgICAgICBpZiBleHRyYToKKyAgICAgICAgICAgICAgICBjaHVua3NpemUgKz0gMQorICAgICAgICBpZiBsZW4oaXRlcmFibGUpID09IDA6CisgICAgICAgICAgICBjaHVua3NpemUgPSAwCisKKyAgICAgICAgdGFza19iYXRjaGVzID0gUG9vbC5fZ2V0X3Rhc2tzKGZ1bmMsIGl0ZXJhYmxlLCBjaHVua3NpemUpCisgICAgICAgIHJlc3VsdCA9IE1hcFJlc3VsdChzZWxmLl9jYWNoZSwgY2h1bmtzaXplLCBsZW4oaXRlcmFibGUpLCBjYWxsYmFjaykKKyAgICAgICAgc2VsZi5fdGFza3F1ZXVlLnB1dCgoKChyZXN1bHQuX2pvYiwgaSwgbWFwc3RhciwgKHgsKSwge30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSwgeCBpbiBlbnVtZXJhdGUodGFza19iYXRjaGVzKSksIE5vbmUpKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9oYW5kbGVfd29ya2Vycyhwb29sKToKKyAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKKworICAgICAgICAjIEtlZXAgbWFpbnRhaW5pbmcgd29ya2VycyB1bnRpbCB0aGUgY2FjaGUgZ2V0cyBkcmFpbmVkLCB1bmxlc3MgdGhlIHBvb2wKKyAgICAgICAgIyBpcyB0ZXJtaW5hdGVkLgorICAgICAgICB3aGlsZSB0aHJlYWQuX3N0YXRlID09IFJVTiBvciAocG9vbC5fY2FjaGUgYW5kIHRocmVhZC5fc3RhdGUgIT0gVEVSTUlOQVRFKToKKyAgICAgICAgICAgIHBvb2wuX21haW50YWluX3Bvb2woKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICMgc2VuZCBzZW50aW5lbCB0byBzdG9wIHdvcmtlcnMKKyAgICAgICAgcG9vbC5fdGFza3F1ZXVlLnB1dChOb25lKQorICAgICAgICBkZWJ1Zygnd29ya2VyIGhhbmRsZXIgZXhpdGluZycpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9oYW5kbGVfdGFza3ModGFza3F1ZXVlLCBwdXQsIG91dHF1ZXVlLCBwb29sKToKKyAgICAgICAgdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKKworICAgICAgICBmb3IgdGFza3NlcSwgc2V0X2xlbmd0aCBpbiBpdGVyKHRhc2txdWV1ZS5nZXQsIE5vbmUpOgorICAgICAgICAgICAgaSA9IC0xCisgICAgICAgICAgICBmb3IgaSwgdGFzayBpbiBlbnVtZXJhdGUodGFza3NlcSk6CisgICAgICAgICAgICAgICAgaWYgdGhyZWFkLl9zdGF0ZToKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoJ3Rhc2sgaGFuZGxlciBmb3VuZCB0aHJlYWQuX3N0YXRlICE9IFJVTicpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwdXQodGFzaykKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2NvdWxkIG5vdCBwdXQgdGFzayBvbiBxdWV1ZScpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNldF9sZW5ndGg6CisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCdkb2luZyBzZXRfbGVuZ3RoKCknKQorICAgICAgICAgICAgICAgICAgICBzZXRfbGVuZ3RoKGkrMSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlYnVnKCd0YXNrIGhhbmRsZXIgZ290IHNlbnRpbmVsJykKKworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdGVsbCByZXN1bHQgaGFuZGxlciB0byBmaW5pc2ggd2hlbiBjYWNoZSBpcyBlbXB0eQorICAgICAgICAgICAgZGVidWcoJ3Rhc2sgaGFuZGxlciBzZW5kaW5nIHNlbnRpbmVsIHRvIHJlc3VsdCBoYW5kbGVyJykKKyAgICAgICAgICAgIG91dHF1ZXVlLnB1dChOb25lKQorCisgICAgICAgICAgICAjIHRlbGwgd29ya2VycyB0aGVyZSBpcyBubyBtb3JlIHdvcmsKKyAgICAgICAgICAgIGRlYnVnKCd0YXNrIGhhbmRsZXIgc2VuZGluZyBzZW50aW5lbCB0byB3b3JrZXJzJykKKyAgICAgICAgICAgIGZvciBwIGluIHBvb2w6CisgICAgICAgICAgICAgICAgcHV0KE5vbmUpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgZGVidWcoJ3Rhc2sgaGFuZGxlciBnb3QgSU9FcnJvciB3aGVuIHNlbmRpbmcgc2VudGluZWxzJykKKworICAgICAgICBkZWJ1ZygndGFzayBoYW5kbGVyIGV4aXRpbmcnKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfaGFuZGxlX3Jlc3VsdHMob3V0cXVldWUsIGdldCwgY2FjaGUpOgorICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKQorCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFzayA9IGdldCgpCisgICAgICAgICAgICBleGNlcHQgKElPRXJyb3IsIEVPRkVycm9yKToKKyAgICAgICAgICAgICAgICBkZWJ1ZygncmVzdWx0IGhhbmRsZXIgZ290IEVPRkVycm9yL0lPRXJyb3IgLS0gZXhpdGluZycpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIGlmIHRocmVhZC5fc3RhdGU6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHRocmVhZC5fc3RhdGUgPT0gVEVSTUlOQVRFCisgICAgICAgICAgICAgICAgZGVidWcoJ3Jlc3VsdCBoYW5kbGVyIGZvdW5kIHRocmVhZC5fc3RhdGU9VEVSTUlOQVRFJykKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiB0YXNrIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVidWcoJ3Jlc3VsdCBoYW5kbGVyIGdvdCBzZW50aW5lbCcpCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgam9iLCBpLCBvYmogPSB0YXNrCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2FjaGVbam9iXS5fc2V0KGksIG9iaikKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2hpbGUgY2FjaGUgYW5kIHRocmVhZC5fc3RhdGUgIT0gVEVSTUlOQVRFOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhc2sgPSBnZXQoKQorICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBFT0ZFcnJvcik6CisgICAgICAgICAgICAgICAgZGVidWcoJ3Jlc3VsdCBoYW5kbGVyIGdvdCBFT0ZFcnJvci9JT0Vycm9yIC0tIGV4aXRpbmcnKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBpZiB0YXNrIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVidWcoJ3Jlc3VsdCBoYW5kbGVyIGlnbm9yaW5nIGV4dHJhIHNlbnRpbmVsJykKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgam9iLCBpLCBvYmogPSB0YXNrCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2FjaGVbam9iXS5fc2V0KGksIG9iaikKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgaGFzYXR0cihvdXRxdWV1ZSwgJ19yZWFkZXInKToKKyAgICAgICAgICAgIGRlYnVnKCdlbnN1cmluZyB0aGF0IG91dHF1ZXVlIGlzIG5vdCBmdWxsJykKKyAgICAgICAgICAgICMgSWYgd2UgZG9uJ3QgbWFrZSByb29tIGF2YWlsYWJsZSBpbiBvdXRxdWV1ZSB0aGVuCisgICAgICAgICAgICAjIGF0dGVtcHRzIHRvIGFkZCB0aGUgc2VudGluZWwgKE5vbmUpIHRvIG91dHF1ZXVlIG1heQorICAgICAgICAgICAgIyBibG9jay4gIFRoZXJlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbm8gbW9yZSB0aGFuIDIgc2VudGluZWxzLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG91dHF1ZXVlLl9yZWFkZXIucG9sbCgpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZ2V0KCkKKyAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgRU9GRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWJ1ZygncmVzdWx0IGhhbmRsZXIgZXhpdGluZzogbGVuKGNhY2hlKT0lcywgdGhyZWFkLl9zdGF0ZT0lcycsCisgICAgICAgICAgICAgIGxlbihjYWNoZSksIHRocmVhZC5fc3RhdGUpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9nZXRfdGFza3MoZnVuYywgaXQsIHNpemUpOgorICAgICAgICBpdCA9IGl0ZXIoaXQpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB4ID0gdHVwbGUoaXRlcnRvb2xzLmlzbGljZShpdCwgc2l6ZSkpCisgICAgICAgICAgICBpZiBub3QgeDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHlpZWxkIChmdW5jLCB4KQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAgICdwb29sIG9iamVjdHMgY2Fubm90IGJlIHBhc3NlZCBiZXR3ZWVuIHByb2Nlc3NlcyBvciBwaWNrbGVkJworICAgICAgICAgICAgICApCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGRlYnVnKCdjbG9zaW5nIHBvb2wnKQorICAgICAgICBpZiBzZWxmLl9zdGF0ZSA9PSBSVU46CisgICAgICAgICAgICBzZWxmLl9zdGF0ZSA9IENMT1NFCisgICAgICAgICAgICBzZWxmLl93b3JrZXJfaGFuZGxlci5fc3RhdGUgPSBDTE9TRQorCisgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgZGVidWcoJ3Rlcm1pbmF0aW5nIHBvb2wnKQorICAgICAgICBzZWxmLl9zdGF0ZSA9IFRFUk1JTkFURQorICAgICAgICBzZWxmLl93b3JrZXJfaGFuZGxlci5fc3RhdGUgPSBURVJNSU5BVEUKKyAgICAgICAgc2VsZi5fdGVybWluYXRlKCkKKworICAgIGRlZiBqb2luKHNlbGYpOgorICAgICAgICBkZWJ1Zygnam9pbmluZyBwb29sJykKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3N0YXRlIGluIChDTE9TRSwgVEVSTUlOQVRFKQorICAgICAgICBzZWxmLl93b3JrZXJfaGFuZGxlci5qb2luKCkKKyAgICAgICAgc2VsZi5fdGFza19oYW5kbGVyLmpvaW4oKQorICAgICAgICBzZWxmLl9yZXN1bHRfaGFuZGxlci5qb2luKCkKKyAgICAgICAgZm9yIHAgaW4gc2VsZi5fcG9vbDoKKyAgICAgICAgICAgIHAuam9pbigpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9oZWxwX3N0dWZmX2ZpbmlzaChpbnF1ZXVlLCB0YXNrX2hhbmRsZXIsIHNpemUpOgorICAgICAgICAjIHRhc2tfaGFuZGxlciBtYXkgYmUgYmxvY2tlZCB0cnlpbmcgdG8gcHV0IGl0ZW1zIG9uIGlucXVldWUKKyAgICAgICAgZGVidWcoJ3JlbW92aW5nIHRhc2tzIGZyb20gaW5xdWV1ZSB1bnRpbCB0YXNrIGhhbmRsZXIgZmluaXNoZWQnKQorICAgICAgICBpbnF1ZXVlLl9ybG9jay5hY3F1aXJlKCkKKyAgICAgICAgd2hpbGUgdGFza19oYW5kbGVyLmlzX2FsaXZlKCkgYW5kIGlucXVldWUuX3JlYWRlci5wb2xsKCk6CisgICAgICAgICAgICBpbnF1ZXVlLl9yZWFkZXIucmVjdigpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDApCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlcm1pbmF0ZV9wb29sKGNscywgdGFza3F1ZXVlLCBpbnF1ZXVlLCBvdXRxdWV1ZSwgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlcl9oYW5kbGVyLCB0YXNrX2hhbmRsZXIsIHJlc3VsdF9oYW5kbGVyLCBjYWNoZSk6CisgICAgICAgICMgdGhpcyBpcyBndWFyYW50ZWVkIHRvIG9ubHkgYmUgY2FsbGVkIG9uY2UKKyAgICAgICAgZGVidWcoJ2ZpbmFsaXppbmcgcG9vbCcpCisKKyAgICAgICAgd29ya2VyX2hhbmRsZXIuX3N0YXRlID0gVEVSTUlOQVRFCisgICAgICAgIHRhc2tfaGFuZGxlci5fc3RhdGUgPSBURVJNSU5BVEUKKworICAgICAgICBkZWJ1ZygnaGVscGluZyB0YXNrIGhhbmRsZXIvd29ya2VycyB0byBmaW5pc2gnKQorICAgICAgICBjbHMuX2hlbHBfc3R1ZmZfZmluaXNoKGlucXVldWUsIHRhc2tfaGFuZGxlciwgbGVuKHBvb2wpKQorCisgICAgICAgIGFzc2VydCByZXN1bHRfaGFuZGxlci5pc19hbGl2ZSgpIG9yIGxlbihjYWNoZSkgPT0gMAorCisgICAgICAgIHJlc3VsdF9oYW5kbGVyLl9zdGF0ZSA9IFRFUk1JTkFURQorICAgICAgICBvdXRxdWV1ZS5wdXQoTm9uZSkgICAgICAgICAgICAgICAgICAjIHNlbnRpbmVsCisKKyAgICAgICAgIyBXZSBtdXN0IHdhaXQgZm9yIHRoZSB3b3JrZXIgaGFuZGxlciB0byBleGl0IGJlZm9yZSB0ZXJtaW5hdGluZworICAgICAgICAjIHdvcmtlcnMgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHdvcmtlcnMgdG8gYmUgcmVzdGFydGVkIGJlaGluZCBvdXIgYmFjay4KKyAgICAgICAgZGVidWcoJ2pvaW5pbmcgd29ya2VyIGhhbmRsZXInKQorICAgICAgICBpZiB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKSBpcyBub3Qgd29ya2VyX2hhbmRsZXI6CisgICAgICAgICAgICB3b3JrZXJfaGFuZGxlci5qb2luKDFlMTAwKQorCisgICAgICAgICMgVGVybWluYXRlIHdvcmtlcnMgd2hpY2ggaGF2ZW4ndCBhbHJlYWR5IGZpbmlzaGVkLgorICAgICAgICBpZiBwb29sIGFuZCBoYXNhdHRyKHBvb2xbMF0sICd0ZXJtaW5hdGUnKToKKyAgICAgICAgICAgIGRlYnVnKCd0ZXJtaW5hdGluZyB3b3JrZXJzJykKKyAgICAgICAgICAgIGZvciBwIGluIHBvb2w6CisgICAgICAgICAgICAgICAgaWYgcC5leGl0Y29kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBwLnRlcm1pbmF0ZSgpCisKKyAgICAgICAgZGVidWcoJ2pvaW5pbmcgdGFzayBoYW5kbGVyJykKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkgaXMgbm90IHRhc2tfaGFuZGxlcjoKKyAgICAgICAgICAgIHRhc2tfaGFuZGxlci5qb2luKDFlMTAwKQorCisgICAgICAgIGRlYnVnKCdqb2luaW5nIHJlc3VsdCBoYW5kbGVyJykKKyAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkgaXMgbm90IHJlc3VsdF9oYW5kbGVyOgorICAgICAgICAgICAgcmVzdWx0X2hhbmRsZXIuam9pbigxZTEwMCkKKworICAgICAgICBpZiBwb29sIGFuZCBoYXNhdHRyKHBvb2xbMF0sICd0ZXJtaW5hdGUnKToKKyAgICAgICAgICAgIGRlYnVnKCdqb2luaW5nIHBvb2wgd29ya2VycycpCisgICAgICAgICAgICBmb3IgcCBpbiBwb29sOgorICAgICAgICAgICAgICAgIGlmIHAuaXNfYWxpdmUoKToKKyAgICAgICAgICAgICAgICAgICAgIyB3b3JrZXIgaGFzIG5vdCB5ZXQgZXhpdGVkCisgICAgICAgICAgICAgICAgICAgIGRlYnVnKCdjbGVhbmluZyB1cCB3b3JrZXIgJWQnICUgcC5waWQpCisgICAgICAgICAgICAgICAgICAgIHAuam9pbigpCisKKyMKKyMgQ2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCBieSBgUG9vbC5hcHBseV9hc3luYygpYAorIworCitjbGFzcyBBcHBseVJlc3VsdChvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhY2hlLCBjYWxsYmFjayk6CisgICAgICAgIHNlbGYuX2NvbmQgPSB0aHJlYWRpbmcuQ29uZGl0aW9uKHRocmVhZGluZy5Mb2NrKCkpCisgICAgICAgIHNlbGYuX2pvYiA9IGpvYl9jb3VudGVyLm5leHQoKQorICAgICAgICBzZWxmLl9jYWNoZSA9IGNhY2hlCisgICAgICAgIHNlbGYuX3JlYWR5ID0gRmFsc2UKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBjYWNoZVtzZWxmLl9qb2JdID0gc2VsZgorCisgICAgZGVmIHJlYWR5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhZHkKKworICAgIGRlZiBzdWNjZXNzZnVsKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5fcmVhZHkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3N1Y2Nlc3MKKworICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9yZWFkeToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb25kLndhaXQodGltZW91dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgZ2V0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIHNlbGYud2FpdCh0aW1lb3V0KQorICAgICAgICBpZiBub3Qgc2VsZi5fcmVhZHk6CisgICAgICAgICAgICByYWlzZSBUaW1lb3V0RXJyb3IKKyAgICAgICAgaWYgc2VsZi5fc3VjY2VzczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl92YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2Ugc2VsZi5fdmFsdWUKKworICAgIGRlZiBfc2V0KHNlbGYsIGksIG9iaik6CisgICAgICAgIHNlbGYuX3N1Y2Nlc3MsIHNlbGYuX3ZhbHVlID0gb2JqCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrIGFuZCBzZWxmLl9zdWNjZXNzOgorICAgICAgICAgICAgc2VsZi5fY2FsbGJhY2soc2VsZi5fdmFsdWUpCisgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5fY29uZC5ub3RpZnkoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKKyAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KKworQXN5bmNSZXN1bHQgPSBBcHBseVJlc3VsdCAgICAgICAjIGNyZWF0ZSBhbGlhcyAtLSBzZWUgIzE3ODA1CisKKyMKKyMgQ2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCBieSBgUG9vbC5tYXBfYXN5bmMoKWAKKyMKKworY2xhc3MgTWFwUmVzdWx0KEFwcGx5UmVzdWx0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZSwgY2h1bmtzaXplLCBsZW5ndGgsIGNhbGxiYWNrKToKKyAgICAgICAgQXBwbHlSZXN1bHQuX19pbml0X18oc2VsZiwgY2FjaGUsIGNhbGxiYWNrKQorICAgICAgICBzZWxmLl9zdWNjZXNzID0gVHJ1ZQorICAgICAgICBzZWxmLl92YWx1ZSA9IFtOb25lXSAqIGxlbmd0aAorICAgICAgICBzZWxmLl9jaHVua3NpemUgPSBjaHVua3NpemUKKyAgICAgICAgaWYgY2h1bmtzaXplIDw9IDA6CisgICAgICAgICAgICBzZWxmLl9udW1iZXJfbGVmdCA9IDAKKyAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gVHJ1ZQorICAgICAgICAgICAgZGVsIGNhY2hlW3NlbGYuX2pvYl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0ID0gbGVuZ3RoLy9jaHVua3NpemUgKyBib29sKGxlbmd0aCAlIGNodW5rc2l6ZSkKKworICAgIGRlZiBfc2V0KHNlbGYsIGksIHN1Y2Nlc3NfcmVzdWx0KToKKyAgICAgICAgc3VjY2VzcywgcmVzdWx0ID0gc3VjY2Vzc19yZXN1bHQKKyAgICAgICAgaWYgc3VjY2VzczoKKyAgICAgICAgICAgIHNlbGYuX3ZhbHVlW2kqc2VsZi5fY2h1bmtzaXplOihpKzEpKnNlbGYuX2NodW5rc2l6ZV0gPSByZXN1bHQKKyAgICAgICAgICAgIHNlbGYuX251bWJlcl9sZWZ0IC09IDEKKyAgICAgICAgICAgIGlmIHNlbGYuX251bWJlcl9sZWZ0ID09IDA6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrKHNlbGYuX3ZhbHVlKQorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9jYWNoZVtzZWxmLl9qb2JdCisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlYWR5ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb25kLm5vdGlmeSgpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fc3VjY2VzcyA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLl92YWx1ZSA9IHJlc3VsdAorICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KKyAgICAgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fcmVhZHkgPSBUcnVlCisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC5ub3RpZnkoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisjCisjIENsYXNzIHdob3NlIGluc3RhbmNlcyBhcmUgcmV0dXJuZWQgYnkgYFBvb2wuaW1hcCgpYAorIworCitjbGFzcyBJTWFwSXRlcmF0b3Iob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWNoZSk6CisgICAgICAgIHNlbGYuX2NvbmQgPSB0aHJlYWRpbmcuQ29uZGl0aW9uKHRocmVhZGluZy5Mb2NrKCkpCisgICAgICAgIHNlbGYuX2pvYiA9IGpvYl9jb3VudGVyLm5leHQoKQorICAgICAgICBzZWxmLl9jYWNoZSA9IGNhY2hlCisgICAgICAgIHNlbGYuX2l0ZW1zID0gY29sbGVjdGlvbnMuZGVxdWUoKQorICAgICAgICBzZWxmLl9pbmRleCA9IDAKKyAgICAgICAgc2VsZi5fbGVuZ3RoID0gTm9uZQorICAgICAgICBzZWxmLl91bnNvcnRlZCA9IHt9CisgICAgICAgIGNhY2hlW3NlbGYuX2pvYl0gPSBzZWxmCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2l0ZW1zLnBvcGxlZnQoKQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5faW5kZXggPT0gc2VsZi5fbGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC53YWl0KHRpbWVvdXQpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gc2VsZi5faXRlbXMucG9wbGVmdCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX2luZGV4ID09IHNlbGYuX2xlbmd0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVGltZW91dEVycm9yCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisgICAgICAgIHN1Y2Nlc3MsIHZhbHVlID0gaXRlbQorICAgICAgICBpZiBzdWNjZXNzOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIHJhaXNlIHZhbHVlCisKKyAgICBfX25leHRfXyA9IG5leHQgICAgICAgICAgICAgICAgICAgICMgWFhYCisKKyAgICBkZWYgX3NldChzZWxmLCBpLCBvYmopOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9pbmRleCA9PSBpOgorICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChvYmopCisgICAgICAgICAgICAgICAgc2VsZi5faW5kZXggKz0gMQorICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYuX2luZGV4IGluIHNlbGYuX3Vuc29ydGVkOgorICAgICAgICAgICAgICAgICAgICBvYmogPSBzZWxmLl91bnNvcnRlZC5wb3Aoc2VsZi5faW5kZXgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChvYmopCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2luZGV4ICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLl9jb25kLm5vdGlmeSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3Vuc29ydGVkW2ldID0gb2JqCisKKyAgICAgICAgICAgIGlmIHNlbGYuX2luZGV4ID09IHNlbGYuX2xlbmd0aDoKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fY2FjaGVbc2VsZi5fam9iXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKKworICAgIGRlZiBfc2V0X2xlbmd0aChzZWxmLCBsZW5ndGgpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9sZW5ndGggPSBsZW5ndGgKKyAgICAgICAgICAgIGlmIHNlbGYuX2luZGV4ID09IHNlbGYuX2xlbmd0aDoKKyAgICAgICAgICAgICAgICBzZWxmLl9jb25kLm5vdGlmeSgpCisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyMKKyMgQ2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSByZXR1cm5lZCBieSBgUG9vbC5pbWFwX3Vub3JkZXJlZCgpYAorIworCitjbGFzcyBJTWFwVW5vcmRlcmVkSXRlcmF0b3IoSU1hcEl0ZXJhdG9yKToKKworICAgIGRlZiBfc2V0KHNlbGYsIGksIG9iaik6CisgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2l0ZW1zLmFwcGVuZChvYmopCisgICAgICAgICAgICBzZWxmLl9pbmRleCArPSAxCisgICAgICAgICAgICBzZWxmLl9jb25kLm5vdGlmeSgpCisgICAgICAgICAgICBpZiBzZWxmLl9pbmRleCA9PSBzZWxmLl9sZW5ndGg6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2NhY2hlW3NlbGYuX2pvYl0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyMKKyMKKyMKKworY2xhc3MgVGhyZWFkUG9vbChQb29sKToKKworICAgIGZyb20gLmR1bW15IGltcG9ydCBQcm9jZXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJvY2Vzc2VzPU5vbmUsIGluaXRpYWxpemVyPU5vbmUsIGluaXRhcmdzPSgpKToKKyAgICAgICAgUG9vbC5fX2luaXRfXyhzZWxmLCBwcm9jZXNzZXMsIGluaXRpYWxpemVyLCBpbml0YXJncykKKworICAgIGRlZiBfc2V0dXBfcXVldWVzKHNlbGYpOgorICAgICAgICBzZWxmLl9pbnF1ZXVlID0gUXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLl9vdXRxdWV1ZSA9IFF1ZXVlLlF1ZXVlKCkKKyAgICAgICAgc2VsZi5fcXVpY2tfcHV0ID0gc2VsZi5faW5xdWV1ZS5wdXQKKyAgICAgICAgc2VsZi5fcXVpY2tfZ2V0ID0gc2VsZi5fb3V0cXVldWUuZ2V0CisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9oZWxwX3N0dWZmX2ZpbmlzaChpbnF1ZXVlLCB0YXNrX2hhbmRsZXIsIHNpemUpOgorICAgICAgICAjIHB1dCBzZW50aW5lbHMgYXQgaGVhZCBvZiBpbnF1ZXVlIHRvIG1ha2Ugd29ya2VycyBmaW5pc2gKKyAgICAgICAgaW5xdWV1ZS5ub3RfZW1wdHkuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlucXVldWUucXVldWUuY2xlYXIoKQorICAgICAgICAgICAgaW5xdWV1ZS5xdWV1ZS5leHRlbmQoW05vbmVdICogc2l6ZSkKKyAgICAgICAgICAgIGlucXVldWUubm90X2VtcHR5Lm5vdGlmeV9hbGwoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaW5xdWV1ZS5ub3RfZW1wdHkucmVsZWFzZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wb29sLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTA1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wb29sLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wb29sLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Bvb2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOWJhZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wb29sLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODJlYTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weQpAQCAtMCwwICsxLDMyMyBAQAorIworIyBNb2R1bGUgcHJvdmlkaW5nIHRoZSBgUHJvY2Vzc2AgY2xhc3Mgd2hpY2ggZW11bGF0ZXMgYHRocmVhZGluZy5UaHJlYWRgCisjCisjIG11bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK19fYWxsX18gPSBbJ1Byb2Nlc3MnLCAnY3VycmVudF9wcm9jZXNzJywgJ2FjdGl2ZV9jaGlsZHJlbiddCisKKyMKKyMgSW1wb3J0cworIworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBpdGVydG9vbHMKKworIworIworIworCit0cnk6CisgICAgT1JJR0lOQUxfRElSID0gb3MucGF0aC5hYnNwYXRoKG9zLmdldGN3ZCgpKQorZXhjZXB0IE9TRXJyb3I6CisgICAgT1JJR0lOQUxfRElSID0gTm9uZQorCisjCisjIFB1YmxpYyBmdW5jdGlvbnMKKyMKKworZGVmIGN1cnJlbnRfcHJvY2VzcygpOgorICAgICcnJworICAgIFJldHVybiBwcm9jZXNzIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgcHJvY2VzcworICAgICcnJworICAgIHJldHVybiBfY3VycmVudF9wcm9jZXNzCisKK2RlZiBhY3RpdmVfY2hpbGRyZW4oKToKKyAgICAnJycKKyAgICBSZXR1cm4gbGlzdCBvZiBwcm9jZXNzIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byBsaXZlIGNoaWxkIHByb2Nlc3NlcworICAgICcnJworICAgIF9jbGVhbnVwKCkKKyAgICByZXR1cm4gbGlzdChfY3VycmVudF9wcm9jZXNzLl9jaGlsZHJlbikKKworIworIworIworCitkZWYgX2NsZWFudXAoKToKKyAgICAjIGNoZWNrIGZvciBwcm9jZXNzZXMgd2hpY2ggaGF2ZSBmaW5pc2hlZAorICAgIGZvciBwIGluIGxpc3QoX2N1cnJlbnRfcHJvY2Vzcy5fY2hpbGRyZW4pOgorICAgICAgICBpZiBwLl9wb3Blbi5wb2xsKCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY3VycmVudF9wcm9jZXNzLl9jaGlsZHJlbi5kaXNjYXJkKHApCisKKyMKKyMgVGhlIGBQcm9jZXNzYCBjbGFzcworIworCitjbGFzcyBQcm9jZXNzKG9iamVjdCk6CisgICAgJycnCisgICAgUHJvY2VzcyBvYmplY3RzIHJlcHJlc2VudCBhY3Rpdml0eSB0aGF0IGlzIHJ1biBpbiBhIHNlcGFyYXRlIHByb2Nlc3MKKworICAgIFRoZSBjbGFzcyBpcyBhbmFsYWdvdXMgdG8gYHRocmVhZGluZy5UaHJlYWRgCisgICAgJycnCisgICAgX1BvcGVuID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdyb3VwPU5vbmUsIHRhcmdldD1Ob25lLCBuYW1lPU5vbmUsIGFyZ3M9KCksIGt3YXJncz17fSk6CisgICAgICAgIGFzc2VydCBncm91cCBpcyBOb25lLCAnZ3JvdXAgYXJndW1lbnQgbXVzdCBiZSBOb25lIGZvciBub3cnCisgICAgICAgIGNvdW50ID0gX2N1cnJlbnRfcHJvY2Vzcy5fY291bnRlci5uZXh0KCkKKyAgICAgICAgc2VsZi5faWRlbnRpdHkgPSBfY3VycmVudF9wcm9jZXNzLl9pZGVudGl0eSArIChjb3VudCwpCisgICAgICAgIHNlbGYuX2F1dGhrZXkgPSBfY3VycmVudF9wcm9jZXNzLl9hdXRoa2V5CisgICAgICAgIHNlbGYuX2RhZW1vbmljID0gX2N1cnJlbnRfcHJvY2Vzcy5fZGFlbW9uaWMKKyAgICAgICAgc2VsZi5fdGVtcGRpciA9IF9jdXJyZW50X3Byb2Nlc3MuX3RlbXBkaXIKKyAgICAgICAgc2VsZi5fcGFyZW50X3BpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIHNlbGYuX3BvcGVuID0gTm9uZQorICAgICAgICBzZWxmLl90YXJnZXQgPSB0YXJnZXQKKyAgICAgICAgc2VsZi5fYXJncyA9IHR1cGxlKGFyZ3MpCisgICAgICAgIHNlbGYuX2t3YXJncyA9IGRpY3Qoa3dhcmdzKQorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZSBvciB0eXBlKHNlbGYpLl9fbmFtZV9fICsgJy0nICsgXAorICAgICAgICAgICAgICAgICAgICAgJzonLmpvaW4oc3RyKGkpIGZvciBpIGluIHNlbGYuX2lkZW50aXR5KQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIE1ldGhvZCB0byBiZSBydW4gaW4gc3ViLXByb2Nlc3M7IGNhbiBiZSBvdmVycmlkZGVuIGluIHN1Yi1jbGFzcworICAgICAgICAnJycKKyAgICAgICAgaWYgc2VsZi5fdGFyZ2V0OgorICAgICAgICAgICAgc2VsZi5fdGFyZ2V0KCpzZWxmLl9hcmdzLCAqKnNlbGYuX2t3YXJncykKKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgJycnCisgICAgICAgIFN0YXJ0IGNoaWxkIHByb2Nlc3MKKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9wb3BlbiBpcyBOb25lLCAnY2Fubm90IHN0YXJ0IGEgcHJvY2VzcyB0d2ljZScKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3BhcmVudF9waWQgPT0gb3MuZ2V0cGlkKCksIFwKKyAgICAgICAgICAgICAgICdjYW4gb25seSBzdGFydCBhIHByb2Nlc3Mgb2JqZWN0IGNyZWF0ZWQgYnkgY3VycmVudCBwcm9jZXNzJworICAgICAgICBhc3NlcnQgbm90IF9jdXJyZW50X3Byb2Nlc3MuX2RhZW1vbmljLCBcCisgICAgICAgICAgICAgICAnZGFlbW9uaWMgcHJvY2Vzc2VzIGFyZSBub3QgYWxsb3dlZCB0byBoYXZlIGNoaWxkcmVuJworICAgICAgICBfY2xlYW51cCgpCisgICAgICAgIGlmIHNlbGYuX1BvcGVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgUG9wZW4gPSBzZWxmLl9Qb3BlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnJvbSAuZm9ya2luZyBpbXBvcnQgUG9wZW4KKyAgICAgICAgc2VsZi5fcG9wZW4gPSBQb3BlbihzZWxmKQorICAgICAgICBfY3VycmVudF9wcm9jZXNzLl9jaGlsZHJlbi5hZGQoc2VsZikKKworICAgIGRlZiB0ZXJtaW5hdGUoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBUZXJtaW5hdGUgcHJvY2Vzczsgc2VuZHMgU0lHVEVSTSBzaWduYWwgb3IgdXNlcyBUZXJtaW5hdGVQcm9jZXNzKCkKKyAgICAgICAgJycnCisgICAgICAgIHNlbGYuX3BvcGVuLnRlcm1pbmF0ZSgpCisKKyAgICBkZWYgam9pbihzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAnJycKKyAgICAgICAgV2FpdCB1bnRpbCBjaGlsZCBwcm9jZXNzIHRlcm1pbmF0ZXMKKyAgICAgICAgJycnCisgICAgICAgIGFzc2VydCBzZWxmLl9wYXJlbnRfcGlkID09IG9zLmdldHBpZCgpLCAnY2FuIG9ubHkgam9pbiBhIGNoaWxkIHByb2Nlc3MnCisgICAgICAgIGFzc2VydCBzZWxmLl9wb3BlbiBpcyBub3QgTm9uZSwgJ2NhbiBvbmx5IGpvaW4gYSBzdGFydGVkIHByb2Nlc3MnCisgICAgICAgIHJlcyA9IHNlbGYuX3BvcGVuLndhaXQodGltZW91dCkKKyAgICAgICAgaWYgcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2N1cnJlbnRfcHJvY2Vzcy5fY2hpbGRyZW4uZGlzY2FyZChzZWxmKQorCisgICAgZGVmIGlzX2FsaXZlKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHdoZXRoZXIgcHJvY2VzcyBpcyBhbGl2ZQorICAgICAgICAnJycKKyAgICAgICAgaWYgc2VsZiBpcyBfY3VycmVudF9wcm9jZXNzOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3BhcmVudF9waWQgPT0gb3MuZ2V0cGlkKCksICdjYW4gb25seSB0ZXN0IGEgY2hpbGQgcHJvY2VzcycKKyAgICAgICAgaWYgc2VsZi5fcG9wZW4gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzZWxmLl9wb3Blbi5wb2xsKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BvcGVuLnJldHVybmNvZGUgaXMgTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uYW1lCisKKyAgICBAbmFtZS5zZXR0ZXIKKyAgICBkZWYgbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgYmFzZXN0cmluZyksICduYW1lIG11c3QgYmUgYSBzdHJpbmcnCisgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGFlbW9uKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHdoZXRoZXIgcHJvY2VzcyBpcyBhIGRhZW1vbgorICAgICAgICAnJycKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RhZW1vbmljCisKKyAgICBAZGFlbW9uLnNldHRlcgorICAgIGRlZiBkYWVtb24oc2VsZiwgZGFlbW9uaWMpOgorICAgICAgICAnJycKKyAgICAgICAgU2V0IHdoZXRoZXIgcHJvY2VzcyBpcyBhIGRhZW1vbgorICAgICAgICAnJycKKyAgICAgICAgYXNzZXJ0IHNlbGYuX3BvcGVuIGlzIE5vbmUsICdwcm9jZXNzIGhhcyBhbHJlYWR5IHN0YXJ0ZWQnCisgICAgICAgIHNlbGYuX2RhZW1vbmljID0gZGFlbW9uaWMKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBhdXRoa2V5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXV0aGtleQorCisgICAgQGF1dGhrZXkuc2V0dGVyCisgICAgZGVmIGF1dGhrZXkoc2VsZiwgYXV0aGtleSk6CisgICAgICAgICcnJworICAgICAgICBTZXQgYXV0aG9yaXphdGlvbiBrZXkgb2YgcHJvY2VzcworICAgICAgICAnJycKKyAgICAgICAgc2VsZi5fYXV0aGtleSA9IEF1dGhlbnRpY2F0aW9uU3RyaW5nKGF1dGhrZXkpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZXhpdGNvZGUoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm4gZXhpdCBjb2RlIG9mIHByb2Nlc3Mgb3IgYE5vbmVgIGlmIGl0IGhhcyB5ZXQgdG8gc3RvcAorICAgICAgICAnJycKKyAgICAgICAgaWYgc2VsZi5fcG9wZW4gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3BlbgorICAgICAgICByZXR1cm4gc2VsZi5fcG9wZW4ucG9sbCgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgaWRlbnQoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBSZXR1cm4gaWRlbnRpZmllciAoUElEKSBvZiBwcm9jZXNzIG9yIGBOb25lYCBpZiBpdCBoYXMgeWV0IHRvIHN0YXJ0CisgICAgICAgICcnJworICAgICAgICBpZiBzZWxmIGlzIF9jdXJyZW50X3Byb2Nlc3M6CisgICAgICAgICAgICByZXR1cm4gb3MuZ2V0cGlkKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wb3BlbiBhbmQgc2VsZi5fcG9wZW4ucGlkCisKKyAgICBwaWQgPSBpZGVudAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmIGlzIF9jdXJyZW50X3Byb2Nlc3M6CisgICAgICAgICAgICBzdGF0dXMgPSAnc3RhcnRlZCcKKyAgICAgICAgZWxpZiBzZWxmLl9wYXJlbnRfcGlkICE9IG9zLmdldHBpZCgpOgorICAgICAgICAgICAgc3RhdHVzID0gJ3Vua25vd24nCisgICAgICAgIGVsaWYgc2VsZi5fcG9wZW4gaXMgTm9uZToKKyAgICAgICAgICAgIHN0YXR1cyA9ICdpbml0aWFsJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5fcG9wZW4ucG9sbCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuZXhpdGNvZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3N0YXJ0ZWQnCisKKyAgICAgICAgaWYgdHlwZShzdGF0dXMpIGlzIGludDoKKyAgICAgICAgICAgIGlmIHN0YXR1cyA9PSAwOgorICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdzdG9wcGVkJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAnc3RvcHBlZFslc10nICUgX2V4aXRjb2RlX3RvX25hbWUuZ2V0KHN0YXR1cywgc3RhdHVzKQorCisgICAgICAgIHJldHVybiAnPCVzKCVzLCAlcyVzKT4nICUgKHR5cGUoc2VsZikuX19uYW1lX18sIHNlbGYuX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgc2VsZi5fZGFlbW9uaWMgYW5kICcgZGFlbW9uJyBvciAnJykKKworICAgICMjCisKKyAgICBkZWYgX2Jvb3RzdHJhcChzZWxmKToKKyAgICAgICAgZnJvbSAuIGltcG9ydCB1dGlsCisgICAgICAgIGdsb2JhbCBfY3VycmVudF9wcm9jZXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSBzZXQoKQorICAgICAgICAgICAgc2VsZi5fY291bnRlciA9IGl0ZXJ0b29scy5jb3VudCgxKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc3lzLnN0ZGluID0gb3Blbihvcy5kZXZudWxsKQorICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBfY3VycmVudF9wcm9jZXNzID0gc2VsZgorICAgICAgICAgICAgdXRpbC5fZmluYWxpemVyX3JlZ2lzdHJ5LmNsZWFyKCkKKyAgICAgICAgICAgIHV0aWwuX3J1bl9hZnRlcl9mb3JrZXJzKCkKKyAgICAgICAgICAgIHV0aWwuaW5mbygnY2hpbGQgcHJvY2VzcyBjYWxsaW5nIHNlbGYucnVuKCknKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYucnVuKCkKKyAgICAgICAgICAgICAgICBleGl0Y29kZSA9IDAKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdXRpbC5fZXhpdF9mdW5jdGlvbigpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnczoKKyAgICAgICAgICAgICAgICBleGl0Y29kZSA9IDEKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShlLmFyZ3NbMF0sIGludCk6CisgICAgICAgICAgICAgICAgZXhpdGNvZGUgPSBlLmFyZ3NbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShzdHIoZS5hcmdzWzBdKSArICdcbicpCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCisgICAgICAgICAgICAgICAgZXhpdGNvZGUgPSAwIGlmIGlzaW5zdGFuY2UoZS5hcmdzWzBdLCBzdHIpIGVsc2UgMQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBleGl0Y29kZSA9IDEKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1Byb2Nlc3MgJXM6XG4nICUgc2VsZi5uYW1lKQorICAgICAgICAgICAgc3lzLnN0ZGVyci5mbHVzaCgpCisgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKCkKKworICAgICAgICB1dGlsLmluZm8oJ3Byb2Nlc3MgZXhpdGluZyB3aXRoIGV4aXRjb2RlICVkJyAlIGV4aXRjb2RlKQorICAgICAgICByZXR1cm4gZXhpdGNvZGUKKworIworIyBXZSBzdWJjbGFzcyBieXRlcyB0byBhdm9pZCBhY2NpZGVudGFsIHRyYW5zbWlzc2lvbiBvZiBhdXRoIGtleXMgb3ZlciBuZXR3b3JrCisjCisKK2NsYXNzIEF1dGhlbnRpY2F0aW9uU3RyaW5nKGJ5dGVzKToKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgZnJvbSAuZm9ya2luZyBpbXBvcnQgUG9wZW4KKyAgICAgICAgaWYgbm90IFBvcGVuLnRocmVhZF9pc19zcGF3bmluZygpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKAorICAgICAgICAgICAgICAgICdQaWNrbGluZyBhbiBBdXRoZW50aWNhdGlvblN0cmluZyBvYmplY3QgaXMgJworICAgICAgICAgICAgICAgICdkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zJworICAgICAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIEF1dGhlbnRpY2F0aW9uU3RyaW5nLCAoYnl0ZXMoc2VsZiksKQorCisjCisjIENyZWF0ZSBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBtYWluIHByb2Nlc3MKKyMKKworY2xhc3MgX01haW5Qcm9jZXNzKFByb2Nlc3MpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9pZGVudGl0eSA9ICgpCisgICAgICAgIHNlbGYuX2RhZW1vbmljID0gRmFsc2UKKyAgICAgICAgc2VsZi5fbmFtZSA9ICdNYWluUHJvY2VzcycKKyAgICAgICAgc2VsZi5fcGFyZW50X3BpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcG9wZW4gPSBOb25lCisgICAgICAgIHNlbGYuX2NvdW50ZXIgPSBpdGVydG9vbHMuY291bnQoMSkKKyAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSBzZXQoKQorICAgICAgICBzZWxmLl9hdXRoa2V5ID0gQXV0aGVudGljYXRpb25TdHJpbmcob3MudXJhbmRvbSgzMikpCisgICAgICAgIHNlbGYuX3RlbXBkaXIgPSBOb25lCisKK19jdXJyZW50X3Byb2Nlc3MgPSBfTWFpblByb2Nlc3MoKQorZGVsIF9NYWluUHJvY2VzcworCisjCisjIEdpdmUgbmFtZXMgdG8gc29tZSByZXR1cm4gY29kZXMKKyMKKworX2V4aXRjb2RlX3RvX25hbWUgPSB7fQorCitmb3IgbmFtZSwgc2lnbnVtIGluIHNpZ25hbC5fX2RpY3RfXy5pdGVtcygpOgorICAgIGlmIG5hbWVbOjNdPT0nU0lHJyBhbmQgJ18nIG5vdCBpbiBuYW1lOgorICAgICAgICBfZXhpdGNvZGVfdG9fbmFtZVstc2lnbnVtXSA9IG5hbWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjYzA3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg4NTYxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3F1ZXVlcy5weSBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3F1ZXVlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzNjN2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5CkBAIC0wLDAgKzEsMzkzIEBACisjCisjIE1vZHVsZSBpbXBsZW1lbnRpbmcgcXVldWVzCisjCisjIG11bHRpcHJvY2Vzc2luZy9xdWV1ZXMucHkKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDA2LTIwMDgsIFIgT3Vka2VyaworIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjCisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIyAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIGF1dGhvciBub3IgdGhlIG5hbWVzIG9mIGFueSBjb250cmlidXRvcnMgbWF5IGJlCisjICAgIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisjICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworX19hbGxfXyA9IFsnUXVldWUnLCAnU2ltcGxlUXVldWUnLCAnSm9pbmFibGVRdWV1ZSddCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHRocmVhZGluZworaW1wb3J0IGNvbGxlY3Rpb25zCitpbXBvcnQgdGltZQoraW1wb3J0IGF0ZXhpdAoraW1wb3J0IHdlYWtyZWYKKworZnJvbSBRdWV1ZSBpbXBvcnQgRW1wdHksIEZ1bGwKK2ltcG9ydCBfbXVsdGlwcm9jZXNzaW5nCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgUGlwZQorZnJvbSBtdWx0aXByb2Nlc3Npbmcuc3luY2hyb25pemUgaW1wb3J0IExvY2ssIEJvdW5kZWRTZW1hcGhvcmUsIFNlbWFwaG9yZSwgQ29uZGl0aW9uCitmcm9tIG11bHRpcHJvY2Vzc2luZy51dGlsIGltcG9ydCBkZWJ1ZywgaW5mbywgRmluYWxpemUsIHJlZ2lzdGVyX2FmdGVyX2ZvcmsKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IGFzc2VydF9zcGF3bmluZworCisjCisjIFF1ZXVlIHR5cGUgdXNpbmcgYSBwaXBlLCBidWZmZXIgYW5kIHRocmVhZAorIworCitjbGFzcyBRdWV1ZShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heHNpemU9MCk6CisgICAgICAgIGlmIG1heHNpemUgPD0gMDoKKyAgICAgICAgICAgIG1heHNpemUgPSBfbXVsdGlwcm9jZXNzaW5nLlNlbUxvY2suU0VNX1ZBTFVFX01BWAorICAgICAgICBzZWxmLl9tYXhzaXplID0gbWF4c2l6ZQorICAgICAgICBzZWxmLl9yZWFkZXIsIHNlbGYuX3dyaXRlciA9IFBpcGUoZHVwbGV4PUZhbHNlKQorICAgICAgICBzZWxmLl9ybG9jayA9IExvY2soKQorICAgICAgICBzZWxmLl9vcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBzZWxmLl93bG9jayA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3dsb2NrID0gTG9jaygpCisgICAgICAgIHNlbGYuX3NlbSA9IEJvdW5kZWRTZW1hcGhvcmUobWF4c2l6ZSkKKworICAgICAgICBzZWxmLl9hZnRlcl9mb3JrKCkKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgUXVldWUuX2FmdGVyX2ZvcmspCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICBhc3NlcnRfc3Bhd25pbmcoc2VsZikKKyAgICAgICAgcmV0dXJuIChzZWxmLl9tYXhzaXplLCBzZWxmLl9yZWFkZXIsIHNlbGYuX3dyaXRlciwKKyAgICAgICAgICAgICAgICBzZWxmLl9ybG9jaywgc2VsZi5fd2xvY2ssIHNlbGYuX3NlbSwgc2VsZi5fb3BpZCkKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAoc2VsZi5fbWF4c2l6ZSwgc2VsZi5fcmVhZGVyLCBzZWxmLl93cml0ZXIsCisgICAgICAgICBzZWxmLl9ybG9jaywgc2VsZi5fd2xvY2ssIHNlbGYuX3NlbSwgc2VsZi5fb3BpZCkgPSBzdGF0ZQorICAgICAgICBzZWxmLl9hZnRlcl9mb3JrKCkKKworICAgIGRlZiBfYWZ0ZXJfZm9yayhzZWxmKToKKyAgICAgICAgZGVidWcoJ1F1ZXVlLl9hZnRlcl9mb3JrKCknKQorICAgICAgICBzZWxmLl9ub3RlbXB0eSA9IHRocmVhZGluZy5Db25kaXRpb24odGhyZWFkaW5nLkxvY2soKSkKKyAgICAgICAgc2VsZi5fYnVmZmVyID0gY29sbGVjdGlvbnMuZGVxdWUoKQorICAgICAgICBzZWxmLl90aHJlYWQgPSBOb25lCisgICAgICAgIHNlbGYuX2pvaW50aHJlYWQgPSBOb25lCisgICAgICAgIHNlbGYuX2pvaW5jYW5jZWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9jbG9zZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9jbG9zZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fc2VuZCA9IHNlbGYuX3dyaXRlci5zZW5kCisgICAgICAgIHNlbGYuX3JlY3YgPSBzZWxmLl9yZWFkZXIucmVjdgorICAgICAgICBzZWxmLl9wb2xsID0gc2VsZi5fcmVhZGVyLnBvbGwKKworICAgIGRlZiBwdXQoc2VsZiwgb2JqLCBibG9jaz1UcnVlLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBhc3NlcnQgbm90IHNlbGYuX2Nsb3NlZAorICAgICAgICBpZiBub3Qgc2VsZi5fc2VtLmFjcXVpcmUoYmxvY2ssIHRpbWVvdXQpOgorICAgICAgICAgICAgcmFpc2UgRnVsbAorCisgICAgICAgIHNlbGYuX25vdGVtcHR5LmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl90aHJlYWQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGFydF90aHJlYWQoKQorICAgICAgICAgICAgc2VsZi5fYnVmZmVyLmFwcGVuZChvYmopCisgICAgICAgICAgICBzZWxmLl9ub3RlbXB0eS5ub3RpZnkoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fbm90ZW1wdHkucmVsZWFzZSgpCisKKyAgICBkZWYgZ2V0KHNlbGYsIGJsb2NrPVRydWUsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGlmIGJsb2NrIGFuZCB0aW1lb3V0IGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9ybG9jay5hY3F1aXJlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXMgPSBzZWxmLl9yZWN2KCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW0ucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZWxmLl9ybG9jay5yZWxlYXNlKCkKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYmxvY2s6CisgICAgICAgICAgICAgICAgZGVhZGxpbmUgPSB0aW1lLnRpbWUoKSArIHRpbWVvdXQKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9ybG9jay5hY3F1aXJlKGJsb2NrLCB0aW1lb3V0KToKKyAgICAgICAgICAgICAgICByYWlzZSBFbXB0eQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGJsb2NrOgorICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gZGVhZGxpbmUgLSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IDwgMCBvciBub3Qgc2VsZi5fcG9sbCh0aW1lb3V0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVtcHR5CisgICAgICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5fcG9sbCgpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFbXB0eQorICAgICAgICAgICAgICAgIHJlcyA9IHNlbGYuX3JlY3YoKQorICAgICAgICAgICAgICAgIHNlbGYuX3NlbS5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuX3Jsb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHFzaXplKHNlbGYpOgorICAgICAgICAjIFJhaXNlcyBOb3RJbXBsZW1lbnRlZEVycm9yIG9uIE1hYyBPU1ggYmVjYXVzZSBvZiBicm9rZW4gc2VtX2dldHZhbHVlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX21heHNpemUgLSBzZWxmLl9zZW0uX3NlbWxvY2suX2dldF92YWx1ZSgpCisKKyAgICBkZWYgZW1wdHkoc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fcG9sbCgpCisKKyAgICBkZWYgZnVsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NlbS5fc2VtbG9jay5faXNfemVybygpCisKKyAgICBkZWYgZ2V0X25vd2FpdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KEZhbHNlKQorCisgICAgZGVmIHB1dF9ub3dhaXQoc2VsZiwgb2JqKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHV0KG9iaiwgRmFsc2UpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2Nsb3NlZCA9IFRydWUKKyAgICAgICAgc2VsZi5fcmVhZGVyLmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5fY2xvc2U6CisgICAgICAgICAgICBzZWxmLl9jbG9zZSgpCisKKyAgICBkZWYgam9pbl90aHJlYWQoc2VsZik6CisgICAgICAgIGRlYnVnKCdRdWV1ZS5qb2luX3RocmVhZCgpJykKKyAgICAgICAgYXNzZXJ0IHNlbGYuX2Nsb3NlZAorICAgICAgICBpZiBzZWxmLl9qb2ludGhyZWFkOgorICAgICAgICAgICAgc2VsZi5fam9pbnRocmVhZCgpCisKKyAgICBkZWYgY2FuY2VsX2pvaW5fdGhyZWFkKHNlbGYpOgorICAgICAgICBkZWJ1ZygnUXVldWUuY2FuY2VsX2pvaW5fdGhyZWFkKCknKQorICAgICAgICBzZWxmLl9qb2luY2FuY2VsbGVkID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9qb2ludGhyZWFkLmNhbmNlbCgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfc3RhcnRfdGhyZWFkKHNlbGYpOgorICAgICAgICBkZWJ1ZygnUXVldWUuX3N0YXJ0X3RocmVhZCgpJykKKworICAgICAgICAjIFN0YXJ0IHRocmVhZCB3aGljaCB0cmFuc2ZlcnMgZGF0YSBmcm9tIGJ1ZmZlciB0byBwaXBlCisgICAgICAgIHNlbGYuX2J1ZmZlci5jbGVhcigpCisgICAgICAgIHNlbGYuX3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoCisgICAgICAgICAgICB0YXJnZXQ9UXVldWUuX2ZlZWQsCisgICAgICAgICAgICBhcmdzPShzZWxmLl9idWZmZXIsIHNlbGYuX25vdGVtcHR5LCBzZWxmLl9zZW5kLAorICAgICAgICAgICAgICAgICAgc2VsZi5fd2xvY2ssIHNlbGYuX3dyaXRlci5jbG9zZSksCisgICAgICAgICAgICBuYW1lPSdRdWV1ZUZlZWRlclRocmVhZCcKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5fdGhyZWFkLmRhZW1vbiA9IFRydWUKKworICAgICAgICBkZWJ1ZygnZG9pbmcgc2VsZi5fdGhyZWFkLnN0YXJ0KCknKQorICAgICAgICBzZWxmLl90aHJlYWQuc3RhcnQoKQorICAgICAgICBkZWJ1ZygnLi4uIGRvbmUgc2VsZi5fdGhyZWFkLnN0YXJ0KCknKQorCisgICAgICAgICMgT24gcHJvY2VzcyBleGl0IHdlIHdpbGwgd2FpdCBmb3IgZGF0YSB0byBiZSBmbHVzaGVkIHRvIHBpcGUuCisgICAgICAgIGlmIG5vdCBzZWxmLl9qb2luY2FuY2VsbGVkOgorICAgICAgICAgICAgc2VsZi5fam9pbnRocmVhZCA9IEZpbmFsaXplKAorICAgICAgICAgICAgICAgIHNlbGYuX3RocmVhZCwgUXVldWUuX2ZpbmFsaXplX2pvaW4sCisgICAgICAgICAgICAgICAgW3dlYWtyZWYucmVmKHNlbGYuX3RocmVhZCldLAorICAgICAgICAgICAgICAgIGV4aXRwcmlvcml0eT0tNQorICAgICAgICAgICAgICAgICkKKworICAgICAgICAjIFNlbmQgc2VudGluZWwgdG8gdGhlIHRocmVhZCBxdWV1ZSBvYmplY3Qgd2hlbiBnYXJiYWdlIGNvbGxlY3RlZAorICAgICAgICBzZWxmLl9jbG9zZSA9IEZpbmFsaXplKAorICAgICAgICAgICAgc2VsZiwgUXVldWUuX2ZpbmFsaXplX2Nsb3NlLAorICAgICAgICAgICAgW3NlbGYuX2J1ZmZlciwgc2VsZi5fbm90ZW1wdHldLAorICAgICAgICAgICAgZXhpdHByaW9yaXR5PTEwCisgICAgICAgICAgICApCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9maW5hbGl6ZV9qb2luKHR3cik6CisgICAgICAgIGRlYnVnKCdqb2luaW5nIHF1ZXVlIHRocmVhZCcpCisgICAgICAgIHRocmVhZCA9IHR3cigpCisgICAgICAgIGlmIHRocmVhZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRocmVhZC5qb2luKCkKKyAgICAgICAgICAgIGRlYnVnKCcuLi4gcXVldWUgdGhyZWFkIGpvaW5lZCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWJ1ZygnLi4uIHF1ZXVlIHRocmVhZCBhbHJlYWR5IGRlYWQnKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZmluYWxpemVfY2xvc2UoYnVmZmVyLCBub3RlbXB0eSk6CisgICAgICAgIGRlYnVnKCd0ZWxsaW5nIHF1ZXVlIHRocmVhZCB0byBxdWl0JykKKyAgICAgICAgbm90ZW1wdHkuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoX3NlbnRpbmVsKQorICAgICAgICAgICAgbm90ZW1wdHkubm90aWZ5KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG5vdGVtcHR5LnJlbGVhc2UoKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfZmVlZChidWZmZXIsIG5vdGVtcHR5LCBzZW5kLCB3cml0ZWxvY2ssIGNsb3NlKToKKyAgICAgICAgZGVidWcoJ3N0YXJ0aW5nIHRocmVhZCB0byBmZWVkIGRhdGEgdG8gcGlwZScpCisgICAgICAgIGZyb20gLnV0aWwgaW1wb3J0IGlzX2V4aXRpbmcKKworICAgICAgICBuYWNxdWlyZSA9IG5vdGVtcHR5LmFjcXVpcmUKKyAgICAgICAgbnJlbGVhc2UgPSBub3RlbXB0eS5yZWxlYXNlCisgICAgICAgIG53YWl0ID0gbm90ZW1wdHkud2FpdAorICAgICAgICBicG9wbGVmdCA9IGJ1ZmZlci5wb3BsZWZ0CisgICAgICAgIHNlbnRpbmVsID0gX3NlbnRpbmVsCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInOgorICAgICAgICAgICAgd2FjcXVpcmUgPSB3cml0ZWxvY2suYWNxdWlyZQorICAgICAgICAgICAgd3JlbGVhc2UgPSB3cml0ZWxvY2sucmVsZWFzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2FjcXVpcmUgPSBOb25lCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBuYWNxdWlyZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgYnVmZmVyOgorICAgICAgICAgICAgICAgICAgICAgICAgbndhaXQoKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIG5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBicG9wbGVmdCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBvYmogaXMgc2VudGluZWw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoJ2ZlZWRlciB0aHJlYWQgZ290IHNlbnRpbmVsIC0tIGV4aXRpbmcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgd2FjcXVpcmUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kKG9iaikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FjcXVpcmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZChvYmopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JlbGVhc2UoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAjIFNpbmNlIHRoaXMgcnVucyBpbiBhIGRhZW1vbiB0aHJlYWQgdGhlIHJlc291cmNlcyBpdCB1c2VzCisgICAgICAgICAgICAjIG1heSBiZSBiZWNvbWUgdW51c2FibGUgd2hpbGUgdGhlIHByb2Nlc3MgaXMgY2xlYW5pbmcgdXAuCisgICAgICAgICAgICAjIFdlIGlnbm9yZSBlcnJvcnMgd2hpY2ggaGFwcGVuIGFmdGVyIHRoZSBwcm9jZXNzIGhhcworICAgICAgICAgICAgIyBzdGFydGVkIHRvIGNsZWFudXAuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgaXNfZXhpdGluZygpOgorICAgICAgICAgICAgICAgICAgICBpbmZvKCdlcnJvciBpbiBxdWV1ZSB0aHJlYWQ6ICVzJywgZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrCisgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBwYXNzCisKK19zZW50aW5lbCA9IG9iamVjdCgpCisKKyMKKyMgQSBxdWV1ZSB0eXBlIHdoaWNoIGFsc28gc3VwcG9ydHMgam9pbigpIGFuZCB0YXNrX2RvbmUoKSBtZXRob2RzCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgZG8gbm90IGNhbGwgdGFza19kb25lKCkgZm9yIGVhY2ggZmluaXNoZWQgdGFzayB0aGVuCisjIGV2ZW50dWFsbHkgdGhlIGNvdW50ZXIncyBzZW1hcGhvcmUgbWF5IG92ZXJmbG93IGNhdXNpbmcgQmFkIFRoaW5ncworIyB0byBoYXBwZW4uCisjCisKK2NsYXNzIEpvaW5hYmxlUXVldWUoUXVldWUpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1heHNpemU9MCk6CisgICAgICAgIFF1ZXVlLl9faW5pdF9fKHNlbGYsIG1heHNpemUpCisgICAgICAgIHNlbGYuX3VuZmluaXNoZWRfdGFza3MgPSBTZW1hcGhvcmUoMCkKKyAgICAgICAgc2VsZi5fY29uZCA9IENvbmRpdGlvbigpCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gUXVldWUuX19nZXRzdGF0ZV9fKHNlbGYpICsgKHNlbGYuX2NvbmQsIHNlbGYuX3VuZmluaXNoZWRfdGFza3MpCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgUXVldWUuX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlWzotMl0pCisgICAgICAgIHNlbGYuX2NvbmQsIHNlbGYuX3VuZmluaXNoZWRfdGFza3MgPSBzdGF0ZVstMjpdCisKKyAgICBkZWYgcHV0KHNlbGYsIG9iaiwgYmxvY2s9VHJ1ZSwgdGltZW91dD1Ob25lKToKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLl9jbG9zZWQKKyAgICAgICAgaWYgbm90IHNlbGYuX3NlbS5hY3F1aXJlKGJsb2NrLCB0aW1lb3V0KToKKyAgICAgICAgICAgIHJhaXNlIEZ1bGwKKworICAgICAgICBzZWxmLl9ub3RlbXB0eS5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fdGhyZWFkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fc3RhcnRfdGhyZWFkKCkKKyAgICAgICAgICAgIHNlbGYuX2J1ZmZlci5hcHBlbmQob2JqKQorICAgICAgICAgICAgc2VsZi5fdW5maW5pc2hlZF90YXNrcy5yZWxlYXNlKCkKKyAgICAgICAgICAgIHNlbGYuX25vdGVtcHR5Lm5vdGlmeSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorICAgICAgICAgICAgc2VsZi5fbm90ZW1wdHkucmVsZWFzZSgpCisKKyAgICBkZWYgdGFza19kb25lKHNlbGYpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fdW5maW5pc2hlZF90YXNrcy5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd0YXNrX2RvbmUoKSBjYWxsZWQgdG9vIG1hbnkgdGltZXMnKQorICAgICAgICAgICAgaWYgc2VsZi5fdW5maW5pc2hlZF90YXNrcy5fc2VtbG9jay5faXNfemVybygpOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbmQubm90aWZ5X2FsbCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9jb25kLnJlbGVhc2UoKQorCisgICAgZGVmIGpvaW4oc2VsZik6CisgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl91bmZpbmlzaGVkX3Rhc2tzLl9zZW1sb2NrLl9pc196ZXJvKCk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29uZC53YWl0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyMKKyMgU2ltcGxpZmllZCBRdWV1ZSB0eXBlIC0tIHJlYWxseSBqdXN0IGEgbG9ja2VkIHBpcGUKKyMKKworY2xhc3MgU2ltcGxlUXVldWUob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fcmVhZGVyLCBzZWxmLl93cml0ZXIgPSBQaXBlKGR1cGxleD1GYWxzZSkKKyAgICAgICAgc2VsZi5fcmxvY2sgPSBMb2NrKCkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBzZWxmLl93bG9jayA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3dsb2NrID0gTG9jaygpCisgICAgICAgIHNlbGYuX21ha2VfbWV0aG9kcygpCisKKyAgICBkZWYgZW1wdHkoc2VsZik6CisgICAgICAgIHJldHVybiBub3Qgc2VsZi5fcmVhZGVyLnBvbGwoKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0X3NwYXduaW5nKHNlbGYpCisgICAgICAgIHJldHVybiAoc2VsZi5fcmVhZGVyLCBzZWxmLl93cml0ZXIsIHNlbGYuX3Jsb2NrLCBzZWxmLl93bG9jaykKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAoc2VsZi5fcmVhZGVyLCBzZWxmLl93cml0ZXIsIHNlbGYuX3Jsb2NrLCBzZWxmLl93bG9jaykgPSBzdGF0ZQorICAgICAgICBzZWxmLl9tYWtlX21ldGhvZHMoKQorCisgICAgZGVmIF9tYWtlX21ldGhvZHMoc2VsZik6CisgICAgICAgIHJlY3YgPSBzZWxmLl9yZWFkZXIucmVjdgorICAgICAgICByYWNxdWlyZSwgcnJlbGVhc2UgPSBzZWxmLl9ybG9jay5hY3F1aXJlLCBzZWxmLl9ybG9jay5yZWxlYXNlCisgICAgICAgIGRlZiBnZXQoKToKKyAgICAgICAgICAgIHJhY3F1aXJlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVjdigpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJyZWxlYXNlKCkKKyAgICAgICAgc2VsZi5nZXQgPSBnZXQKKworICAgICAgICBpZiBzZWxmLl93bG9jayBpcyBOb25lOgorICAgICAgICAgICAgIyB3cml0ZXMgdG8gYSBtZXNzYWdlIG9yaWVudGVkIHdpbjMyIHBpcGUgYXJlIGF0b21pYworICAgICAgICAgICAgc2VsZi5wdXQgPSBzZWxmLl93cml0ZXIuc2VuZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VuZCA9IHNlbGYuX3dyaXRlci5zZW5kCisgICAgICAgICAgICB3YWNxdWlyZSwgd3JlbGVhc2UgPSBzZWxmLl93bG9jay5hY3F1aXJlLCBzZWxmLl93bG9jay5yZWxlYXNlCisgICAgICAgICAgICBkZWYgcHV0KG9iaik6CisgICAgICAgICAgICAgICAgd2FjcXVpcmUoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmQob2JqKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHdyZWxlYXNlKCkKKyAgICAgICAgICAgIHNlbGYucHV0ID0gcHV0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9xdWV1ZXMucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmFkOWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9xdWV1ZXMucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJiZmQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcXVldWVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9yZWR1Y3Rpb24ucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9yZWR1Y3Rpb24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1ZTViYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3JlZHVjdGlvbi5weQpAQCAtMCwwICsxLDIxNSBAQAorIworIyBNb2R1bGUgdG8gYWxsb3cgY29ubmVjdGlvbiBhbmQgc29ja2V0IG9iamVjdHMgdG8gYmUgdHJhbnNmZXJyZWQKKyMgYmV0d2VlbiBwcm9jZXNzZXMKKyMKKyMgbXVsdGlwcm9jZXNzaW5nL3JlZHVjdGlvbi5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitfX2FsbF9fID0gW10KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc29ja2V0CitpbXBvcnQgdGhyZWFkaW5nCisKK2ltcG9ydCBfbXVsdGlwcm9jZXNzaW5nCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgY3VycmVudF9wcm9jZXNzCitmcm9tIG11bHRpcHJvY2Vzc2luZy5mb3JraW5nIGltcG9ydCBQb3BlbiwgZHVwbGljYXRlLCBjbG9zZSwgRm9ya2luZ1BpY2tsZXIKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnV0aWwgaW1wb3J0IHJlZ2lzdGVyX2FmdGVyX2ZvcmssIGRlYnVnLCBzdWJfZGVidWcKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24gaW1wb3J0IENsaWVudCwgTGlzdGVuZXIKKworCisjCisjCisjCisKK2lmIG5vdChzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJyBvciBoYXNhdHRyKF9tdWx0aXByb2Nlc3NpbmcsICdyZWN2ZmQnKSk6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IoJ3BpY2tsaW5nIG9mIGNvbm5lY3Rpb25zIG5vdCBzdXBwb3J0ZWQnKQorCisjCisjIFBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zCisjCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorICAgIGltcG9ydCBfc3VicHJvY2VzcworICAgIGZyb20gX211bHRpcHJvY2Vzc2luZyBpbXBvcnQgd2luMzIKKworICAgIGRlZiBzZW5kX2hhbmRsZShjb25uLCBoYW5kbGUsIGRlc3RpbmF0aW9uX3BpZCk6CisgICAgICAgIHByb2Nlc3NfaGFuZGxlID0gd2luMzIuT3BlblByb2Nlc3MoCisgICAgICAgICAgICB3aW4zMi5QUk9DRVNTX0FMTF9BQ0NFU1MsIEZhbHNlLCBkZXN0aW5hdGlvbl9waWQKKyAgICAgICAgICAgICkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmV3X2hhbmRsZSA9IGR1cGxpY2F0ZShoYW5kbGUsIHByb2Nlc3NfaGFuZGxlKQorICAgICAgICAgICAgY29ubi5zZW5kKG5ld19oYW5kbGUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBjbG9zZShwcm9jZXNzX2hhbmRsZSkKKworICAgIGRlZiByZWN2X2hhbmRsZShjb25uKToKKyAgICAgICAgcmV0dXJuIGNvbm4ucmVjdigpCisKK2Vsc2U6CisgICAgZGVmIHNlbmRfaGFuZGxlKGNvbm4sIGhhbmRsZSwgZGVzdGluYXRpb25fcGlkKToKKyAgICAgICAgX211bHRpcHJvY2Vzc2luZy5zZW5kZmQoY29ubi5maWxlbm8oKSwgaGFuZGxlKQorCisgICAgZGVmIHJlY3ZfaGFuZGxlKGNvbm4pOgorICAgICAgICByZXR1cm4gX211bHRpcHJvY2Vzc2luZy5yZWN2ZmQoY29ubi5maWxlbm8oKSkKKworIworIyBTdXBwb3J0IGZvciBhIHBlci1wcm9jZXNzIHNlcnZlciB0aHJlYWQgd2hpY2ggY2FjaGVzIHBpY2tsZWQgaGFuZGxlcworIworCitfY2FjaGUgPSBzZXQoKQorCitkZWYgX3Jlc2V0KG9iaik6CisgICAgZ2xvYmFsIF9sb2NrLCBfbGlzdGVuZXIsIF9jYWNoZQorICAgIGZvciBoIGluIF9jYWNoZToKKyAgICAgICAgY2xvc2UoaCkKKyAgICBfY2FjaGUuY2xlYXIoKQorICAgIF9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgIF9saXN0ZW5lciA9IE5vbmUKKworX3Jlc2V0KE5vbmUpCityZWdpc3Rlcl9hZnRlcl9mb3JrKF9yZXNldCwgX3Jlc2V0KQorCitkZWYgX2dldF9saXN0ZW5lcigpOgorICAgIGdsb2JhbCBfbGlzdGVuZXIKKworICAgIGlmIF9saXN0ZW5lciBpcyBOb25lOgorICAgICAgICBfbG9jay5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgX2xpc3RlbmVyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZGVidWcoJ3N0YXJ0aW5nIGxpc3RlbmVyIGFuZCB0aHJlYWQgZm9yIHNlbmRpbmcgaGFuZGxlcycpCisgICAgICAgICAgICAgICAgX2xpc3RlbmVyID0gTGlzdGVuZXIoYXV0aGtleT1jdXJyZW50X3Byb2Nlc3MoKS5hdXRoa2V5KQorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fc2VydmUpCisgICAgICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBfbG9jay5yZWxlYXNlKCkKKworICAgIHJldHVybiBfbGlzdGVuZXIKKworZGVmIF9zZXJ2ZSgpOgorICAgIGZyb20gLnV0aWwgaW1wb3J0IGlzX2V4aXRpbmcsIHN1Yl93YXJuaW5nCisKKyAgICB3aGlsZSAxOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb25uID0gX2xpc3RlbmVyLmFjY2VwdCgpCisgICAgICAgICAgICBoYW5kbGVfd2FudGVkLCBkZXN0aW5hdGlvbl9waWQgPSBjb25uLnJlY3YoKQorICAgICAgICAgICAgX2NhY2hlLnJlbW92ZShoYW5kbGVfd2FudGVkKQorICAgICAgICAgICAgc2VuZF9oYW5kbGUoY29ubiwgaGFuZGxlX3dhbnRlZCwgZGVzdGluYXRpb25fcGlkKQorICAgICAgICAgICAgY2xvc2UoaGFuZGxlX3dhbnRlZCkKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBub3QgaXNfZXhpdGluZygpOgorICAgICAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgICAgICBzdWJfd2FybmluZygKKyAgICAgICAgICAgICAgICAgICAgJ3RocmVhZCBmb3Igc2hhcmluZyBoYW5kbGVzIHJhaXNlZCBleGNlcHRpb24gOlxuJyArCisgICAgICAgICAgICAgICAgICAgICctJyo3OSArICdcbicgKyB0cmFjZWJhY2suZm9ybWF0X2V4YygpICsgJy0nKjc5CisgICAgICAgICAgICAgICAgICAgICkKKworIworIyBGdW5jdGlvbnMgdG8gYmUgdXNlZCBmb3IgcGlja2xpbmcvdW5waWNrbGluZyBvYmplY3RzIHdpdGggaGFuZGxlcworIworCitkZWYgcmVkdWNlX2hhbmRsZShoYW5kbGUpOgorICAgIGlmIFBvcGVuLnRocmVhZF9pc19zcGF3bmluZygpOgorICAgICAgICByZXR1cm4gKE5vbmUsIFBvcGVuLmR1cGxpY2F0ZV9mb3JfY2hpbGQoaGFuZGxlKSwgVHJ1ZSkKKyAgICBkdXBfaGFuZGxlID0gZHVwbGljYXRlKGhhbmRsZSkKKyAgICBfY2FjaGUuYWRkKGR1cF9oYW5kbGUpCisgICAgc3ViX2RlYnVnKCdyZWR1Y2luZyBoYW5kbGUgJWQnLCBoYW5kbGUpCisgICAgcmV0dXJuIChfZ2V0X2xpc3RlbmVyKCkuYWRkcmVzcywgZHVwX2hhbmRsZSwgRmFsc2UpCisKK2RlZiByZWJ1aWxkX2hhbmRsZShwaWNrbGVkX2RhdGEpOgorICAgIGFkZHJlc3MsIGhhbmRsZSwgaW5oZXJpdGVkID0gcGlja2xlZF9kYXRhCisgICAgaWYgaW5oZXJpdGVkOgorICAgICAgICByZXR1cm4gaGFuZGxlCisgICAgc3ViX2RlYnVnKCdyZWJ1aWxkaW5nIGhhbmRsZSAlZCcsIGhhbmRsZSkKKyAgICBjb25uID0gQ2xpZW50KGFkZHJlc3MsIGF1dGhrZXk9Y3VycmVudF9wcm9jZXNzKCkuYXV0aGtleSkKKyAgICBjb25uLnNlbmQoKGhhbmRsZSwgb3MuZ2V0cGlkKCkpKQorICAgIG5ld19oYW5kbGUgPSByZWN2X2hhbmRsZShjb25uKQorICAgIGNvbm4uY2xvc2UoKQorICAgIHJldHVybiBuZXdfaGFuZGxlCisKKyMKKyMgUmVnaXN0ZXIgYF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbmAgd2l0aCBgRm9ya2luZ1BpY2tsZXJgCisjCisKK2RlZiByZWR1Y2VfY29ubmVjdGlvbihjb25uKToKKyAgICByaCA9IHJlZHVjZV9oYW5kbGUoY29ubi5maWxlbm8oKSkKKyAgICByZXR1cm4gcmVidWlsZF9jb25uZWN0aW9uLCAocmgsIGNvbm4ucmVhZGFibGUsIGNvbm4ud3JpdGFibGUpCisKK2RlZiByZWJ1aWxkX2Nvbm5lY3Rpb24ocmVkdWNlZF9oYW5kbGUsIHJlYWRhYmxlLCB3cml0YWJsZSk6CisgICAgaGFuZGxlID0gcmVidWlsZF9oYW5kbGUocmVkdWNlZF9oYW5kbGUpCisgICAgcmV0dXJuIF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbigKKyAgICAgICAgaGFuZGxlLCByZWFkYWJsZT1yZWFkYWJsZSwgd3JpdGFibGU9d3JpdGFibGUKKyAgICAgICAgKQorCitGb3JraW5nUGlja2xlci5yZWdpc3RlcihfbXVsdGlwcm9jZXNzaW5nLkNvbm5lY3Rpb24sIHJlZHVjZV9jb25uZWN0aW9uKQorCisjCisjIFJlZ2lzdGVyIGBzb2NrZXQuc29ja2V0YCB3aXRoIGBGb3JraW5nUGlja2xlcmAKKyMKKworZGVmIGZyb21mZChmZCwgZmFtaWx5LCB0eXBlXywgcHJvdG89MCk6CisgICAgcyA9IHNvY2tldC5mcm9tZmQoZmQsIGZhbWlseSwgdHlwZV8sIHByb3RvKQorICAgIGlmIHMuX19jbGFzc19fIGlzIG5vdCBzb2NrZXQuc29ja2V0OgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChfc29jaz1zKQorICAgIHJldHVybiBzCisKK2RlZiByZWR1Y2Vfc29ja2V0KHMpOgorICAgIHJlZHVjZWRfaGFuZGxlID0gcmVkdWNlX2hhbmRsZShzLmZpbGVubygpKQorICAgIHJldHVybiByZWJ1aWxkX3NvY2tldCwgKHJlZHVjZWRfaGFuZGxlLCBzLmZhbWlseSwgcy50eXBlLCBzLnByb3RvKQorCitkZWYgcmVidWlsZF9zb2NrZXQocmVkdWNlZF9oYW5kbGUsIGZhbWlseSwgdHlwZV8sIHByb3RvKToKKyAgICBmZCA9IHJlYnVpbGRfaGFuZGxlKHJlZHVjZWRfaGFuZGxlKQorICAgIF9zb2NrID0gZnJvbWZkKGZkLCBmYW1pbHksIHR5cGVfLCBwcm90bykKKyAgICBjbG9zZShmZCkKKyAgICByZXR1cm4gX3NvY2sKKworRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIoc29ja2V0LnNvY2tldCwgcmVkdWNlX3NvY2tldCkKKworIworIyBSZWdpc3RlciBgX211bHRpcHJvY2Vzc2luZy5QaXBlQ29ubmVjdGlvbmAgd2l0aCBgRm9ya2luZ1BpY2tsZXJgCisjCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgorCisgICAgZGVmIHJlZHVjZV9waXBlX2Nvbm5lY3Rpb24oY29ubik6CisgICAgICAgIHJoID0gcmVkdWNlX2hhbmRsZShjb25uLmZpbGVubygpKQorICAgICAgICByZXR1cm4gcmVidWlsZF9waXBlX2Nvbm5lY3Rpb24sIChyaCwgY29ubi5yZWFkYWJsZSwgY29ubi53cml0YWJsZSkKKworICAgIGRlZiByZWJ1aWxkX3BpcGVfY29ubmVjdGlvbihyZWR1Y2VkX2hhbmRsZSwgcmVhZGFibGUsIHdyaXRhYmxlKToKKyAgICAgICAgaGFuZGxlID0gcmVidWlsZF9oYW5kbGUocmVkdWNlZF9oYW5kbGUpCisgICAgICAgIHJldHVybiBfbXVsdGlwcm9jZXNzaW5nLlBpcGVDb25uZWN0aW9uKAorICAgICAgICAgICAgaGFuZGxlLCByZWFkYWJsZT1yZWFkYWJsZSwgd3JpdGFibGU9d3JpdGFibGUKKyAgICAgICAgICAgICkKKworICAgIEZvcmtpbmdQaWNrbGVyLnJlZ2lzdGVyKF9tdWx0aXByb2Nlc3NpbmcuUGlwZUNvbm5lY3Rpb24sIHJlZHVjZV9waXBlX2Nvbm5lY3Rpb24pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9yZWR1Y3Rpb24ucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRlZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9yZWR1Y3Rpb24ucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODRlZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvcmVkdWN0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWViMDQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3NoYXJlZGN0eXBlcy5weQpAQCAtMCwwICsxLDI2NiBAQAorIworIyBNb2R1bGUgd2hpY2ggc3VwcG9ydHMgYWxsb2NhdGlvbiBvZiBjdHlwZXMgb2JqZWN0cyBmcm9tIHNoYXJlZCBtZW1vcnkKKyMKKyMgbXVsdGlwcm9jZXNzaW5nL3NoYXJlZGN0eXBlcy5weQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOCwgUiBPdWRrZXJrCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgYXV0aG9yIG5vciB0aGUgbmFtZXMgb2YgYW55IGNvbnRyaWJ1dG9ycyBtYXkgYmUKKyMgICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyMgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCitpbXBvcnQgc3lzCitpbXBvcnQgY3R5cGVzCitpbXBvcnQgd2Vha3JlZgorCitmcm9tIG11bHRpcHJvY2Vzc2luZyBpbXBvcnQgaGVhcCwgUkxvY2sKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLmZvcmtpbmcgaW1wb3J0IGFzc2VydF9zcGF3bmluZywgRm9ya2luZ1BpY2tsZXIKKworX19hbGxfXyA9IFsnUmF3VmFsdWUnLCAnUmF3QXJyYXknLCAnVmFsdWUnLCAnQXJyYXknLCAnY29weScsICdzeW5jaHJvbml6ZWQnXQorCisjCisjCisjCisKK3R5cGVjb2RlX3RvX3R5cGUgPSB7CisgICAgJ2MnOiBjdHlwZXMuY19jaGFyLCAgJ3UnOiBjdHlwZXMuY193Y2hhciwKKyAgICAnYic6IGN0eXBlcy5jX2J5dGUsICAnQic6IGN0eXBlcy5jX3VieXRlLAorICAgICdoJzogY3R5cGVzLmNfc2hvcnQsICdIJzogY3R5cGVzLmNfdXNob3J0LAorICAgICdpJzogY3R5cGVzLmNfaW50LCAgICdJJzogY3R5cGVzLmNfdWludCwKKyAgICAnbCc6IGN0eXBlcy5jX2xvbmcsICAnTCc6IGN0eXBlcy5jX3Vsb25nLAorICAgICdmJzogY3R5cGVzLmNfZmxvYXQsICdkJzogY3R5cGVzLmNfZG91YmxlCisgICAgfQorCisjCisjCisjCisKK2RlZiBfbmV3X3ZhbHVlKHR5cGVfKToKKyAgICBzaXplID0gY3R5cGVzLnNpemVvZih0eXBlXykKKyAgICB3cmFwcGVyID0gaGVhcC5CdWZmZXJXcmFwcGVyKHNpemUpCisgICAgcmV0dXJuIHJlYnVpbGRfY3R5cGUodHlwZV8sIHdyYXBwZXIsIE5vbmUpCisKK2RlZiBSYXdWYWx1ZSh0eXBlY29kZV9vcl90eXBlLCAqYXJncyk6CisgICAgJycnCisgICAgUmV0dXJucyBhIGN0eXBlcyBvYmplY3QgYWxsb2NhdGVkIGZyb20gc2hhcmVkIG1lbW9yeQorICAgICcnJworICAgIHR5cGVfID0gdHlwZWNvZGVfdG9fdHlwZS5nZXQodHlwZWNvZGVfb3JfdHlwZSwgdHlwZWNvZGVfb3JfdHlwZSkKKyAgICBvYmogPSBfbmV3X3ZhbHVlKHR5cGVfKQorICAgIGN0eXBlcy5tZW1zZXQoY3R5cGVzLmFkZHJlc3NvZihvYmopLCAwLCBjdHlwZXMuc2l6ZW9mKG9iaikpCisgICAgb2JqLl9faW5pdF9fKCphcmdzKQorICAgIHJldHVybiBvYmoKKworZGVmIFJhd0FycmF5KHR5cGVjb2RlX29yX3R5cGUsIHNpemVfb3JfaW5pdGlhbGl6ZXIpOgorICAgICcnJworICAgIFJldHVybnMgYSBjdHlwZXMgYXJyYXkgYWxsb2NhdGVkIGZyb20gc2hhcmVkIG1lbW9yeQorICAgICcnJworICAgIHR5cGVfID0gdHlwZWNvZGVfdG9fdHlwZS5nZXQodHlwZWNvZGVfb3JfdHlwZSwgdHlwZWNvZGVfb3JfdHlwZSkKKyAgICBpZiBpc2luc3RhbmNlKHNpemVfb3JfaW5pdGlhbGl6ZXIsIChpbnQsIGxvbmcpKToKKyAgICAgICAgdHlwZV8gPSB0eXBlXyAqIHNpemVfb3JfaW5pdGlhbGl6ZXIKKyAgICAgICAgb2JqID0gX25ld192YWx1ZSh0eXBlXykKKyAgICAgICAgY3R5cGVzLm1lbXNldChjdHlwZXMuYWRkcmVzc29mKG9iaiksIDAsIGN0eXBlcy5zaXplb2Yob2JqKSkKKyAgICAgICAgcmV0dXJuIG9iagorICAgIGVsc2U6CisgICAgICAgIHR5cGVfID0gdHlwZV8gKiBsZW4oc2l6ZV9vcl9pbml0aWFsaXplcikKKyAgICAgICAgcmVzdWx0ID0gX25ld192YWx1ZSh0eXBlXykKKyAgICAgICAgcmVzdWx0Ll9faW5pdF9fKCpzaXplX29yX2luaXRpYWxpemVyKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBWYWx1ZSh0eXBlY29kZV9vcl90eXBlLCAqYXJncywgKiprd2RzKToKKyAgICAnJycKKyAgICBSZXR1cm4gYSBzeW5jaHJvbml6YXRpb24gd3JhcHBlciBmb3IgYSBWYWx1ZQorICAgICcnJworICAgIGxvY2sgPSBrd2RzLnBvcCgnbG9jaycsIE5vbmUpCisgICAgaWYga3dkczoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5yZWNvZ25pemVkIGtleXdvcmQgYXJndW1lbnQocyk6ICVzJyAlIGt3ZHMua2V5cygpKQorICAgIG9iaiA9IFJhd1ZhbHVlKHR5cGVjb2RlX29yX3R5cGUsICphcmdzKQorICAgIGlmIGxvY2sgaXMgRmFsc2U6CisgICAgICAgIHJldHVybiBvYmoKKyAgICBpZiBsb2NrIGluIChUcnVlLCBOb25lKToKKyAgICAgICAgbG9jayA9IFJMb2NrKCkKKyAgICBpZiBub3QgaGFzYXR0cihsb2NrLCAnYWNxdWlyZScpOgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiJyVyJyBoYXMgbm8gbWV0aG9kICdhY3F1aXJlJyIgJSBsb2NrKQorICAgIHJldHVybiBzeW5jaHJvbml6ZWQob2JqLCBsb2NrKQorCitkZWYgQXJyYXkodHlwZWNvZGVfb3JfdHlwZSwgc2l6ZV9vcl9pbml0aWFsaXplciwgKiprd2RzKToKKyAgICAnJycKKyAgICBSZXR1cm4gYSBzeW5jaHJvbml6YXRpb24gd3JhcHBlciBmb3IgYSBSYXdBcnJheQorICAgICcnJworICAgIGxvY2sgPSBrd2RzLnBvcCgnbG9jaycsIE5vbmUpCisgICAgaWYga3dkczoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndW5yZWNvZ25pemVkIGtleXdvcmQgYXJndW1lbnQocyk6ICVzJyAlIGt3ZHMua2V5cygpKQorICAgIG9iaiA9IFJhd0FycmF5KHR5cGVjb2RlX29yX3R5cGUsIHNpemVfb3JfaW5pdGlhbGl6ZXIpCisgICAgaWYgbG9jayBpcyBGYWxzZToKKyAgICAgICAgcmV0dXJuIG9iagorICAgIGlmIGxvY2sgaW4gKFRydWUsIE5vbmUpOgorICAgICAgICBsb2NrID0gUkxvY2soKQorICAgIGlmIG5vdCBoYXNhdHRyKGxvY2ssICdhY3F1aXJlJyk6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCInJXInIGhhcyBubyBtZXRob2QgJ2FjcXVpcmUnIiAlIGxvY2spCisgICAgcmV0dXJuIHN5bmNocm9uaXplZChvYmosIGxvY2spCisKK2RlZiBjb3B5KG9iaik6CisgICAgbmV3X29iaiA9IF9uZXdfdmFsdWUodHlwZShvYmopKQorICAgIGN0eXBlcy5wb2ludGVyKG5ld19vYmopWzBdID0gb2JqCisgICAgcmV0dXJuIG5ld19vYmoKKworZGVmIHN5bmNocm9uaXplZChvYmosIGxvY2s9Tm9uZSk6CisgICAgYXNzZXJ0IG5vdCBpc2luc3RhbmNlKG9iaiwgU3luY2hyb25pemVkQmFzZSksICdvYmplY3QgYWxyZWFkeSBzeW5jaHJvbml6ZWQnCisKKyAgICBpZiBpc2luc3RhbmNlKG9iaiwgY3R5cGVzLl9TaW1wbGVDRGF0YSk6CisgICAgICAgIHJldHVybiBTeW5jaHJvbml6ZWQob2JqLCBsb2NrKQorICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIGN0eXBlcy5BcnJheSk6CisgICAgICAgIGlmIG9iai5fdHlwZV8gaXMgY3R5cGVzLmNfY2hhcjoKKyAgICAgICAgICAgIHJldHVybiBTeW5jaHJvbml6ZWRTdHJpbmcob2JqLCBsb2NrKQorICAgICAgICByZXR1cm4gU3luY2hyb25pemVkQXJyYXkob2JqLCBsb2NrKQorICAgIGVsc2U6CisgICAgICAgIGNscyA9IHR5cGUob2JqKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzY2xzID0gY2xhc3NfY2FjaGVbY2xzXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBuYW1lcyA9IFtmaWVsZFswXSBmb3IgZmllbGQgaW4gY2xzLl9maWVsZHNfXQorICAgICAgICAgICAgZCA9IGRpY3QoKG5hbWUsIG1ha2VfcHJvcGVydHkobmFtZSkpIGZvciBuYW1lIGluIG5hbWVzKQorICAgICAgICAgICAgY2xhc3NuYW1lID0gJ1N5bmNocm9uaXplZCcgKyBjbHMuX19uYW1lX18KKyAgICAgICAgICAgIHNjbHMgPSBjbGFzc19jYWNoZVtjbHNdID0gdHlwZShjbGFzc25hbWUsIChTeW5jaHJvbml6ZWRCYXNlLCksIGQpCisgICAgICAgIHJldHVybiBzY2xzKG9iaiwgbG9jaykKKworIworIyBGdW5jdGlvbnMgZm9yIHBpY2tsaW5nL3VucGlja2xpbmcKKyMKKworZGVmIHJlZHVjZV9jdHlwZShvYmopOgorICAgIGFzc2VydF9zcGF3bmluZyhvYmopCisgICAgaWYgaXNpbnN0YW5jZShvYmosIGN0eXBlcy5BcnJheSk6CisgICAgICAgIHJldHVybiByZWJ1aWxkX2N0eXBlLCAob2JqLl90eXBlXywgb2JqLl93cmFwcGVyLCBvYmouX2xlbmd0aF8pCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHJlYnVpbGRfY3R5cGUsICh0eXBlKG9iaiksIG9iai5fd3JhcHBlciwgTm9uZSkKKworZGVmIHJlYnVpbGRfY3R5cGUodHlwZV8sIHdyYXBwZXIsIGxlbmd0aCk6CisgICAgaWYgbGVuZ3RoIGlzIG5vdCBOb25lOgorICAgICAgICB0eXBlXyA9IHR5cGVfICogbGVuZ3RoCisgICAgRm9ya2luZ1BpY2tsZXIucmVnaXN0ZXIodHlwZV8sIHJlZHVjZV9jdHlwZSkKKyAgICBvYmogPSB0eXBlXy5mcm9tX2FkZHJlc3Mod3JhcHBlci5nZXRfYWRkcmVzcygpKQorICAgIG9iai5fd3JhcHBlciA9IHdyYXBwZXIKKyAgICByZXR1cm4gb2JqCisKKyMKKyMgRnVuY3Rpb24gdG8gY3JlYXRlIHByb3BlcnRpZXMKKyMKKworZGVmIG1ha2VfcHJvcGVydHkobmFtZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gcHJvcF9jYWNoZVtuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGV4ZWMgdGVtcGxhdGUgJSAoKG5hbWUsKSo3KSBpbiBkCisgICAgICAgIHByb3BfY2FjaGVbbmFtZV0gPSBkW25hbWVdCisgICAgICAgIHJldHVybiBkW25hbWVdCisKK3RlbXBsYXRlID0gJycnCitkZWYgZ2V0JXMoc2VsZik6CisgICAgc2VsZi5hY3F1aXJlKCkKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzZWxmLl9vYmouJXMKKyAgICBmaW5hbGx5OgorICAgICAgICBzZWxmLnJlbGVhc2UoKQorZGVmIHNldCVzKHNlbGYsIHZhbHVlKToKKyAgICBzZWxmLmFjcXVpcmUoKQorICAgIHRyeToKKyAgICAgICAgc2VsZi5fb2JqLiVzID0gdmFsdWUKKyAgICBmaW5hbGx5OgorICAgICAgICBzZWxmLnJlbGVhc2UoKQorJXMgPSBwcm9wZXJ0eShnZXQlcywgc2V0JXMpCisnJycKKworcHJvcF9jYWNoZSA9IHt9CitjbGFzc19jYWNoZSA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorCisjCisjIFN5bmNocm9uaXplZCB3cmFwcGVycworIworCitjbGFzcyBTeW5jaHJvbml6ZWRCYXNlKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb2JqLCBsb2NrPU5vbmUpOgorICAgICAgICBzZWxmLl9vYmogPSBvYmoKKyAgICAgICAgc2VsZi5fbG9jayA9IGxvY2sgb3IgUkxvY2soKQorICAgICAgICBzZWxmLmFjcXVpcmUgPSBzZWxmLl9sb2NrLmFjcXVpcmUKKyAgICAgICAgc2VsZi5yZWxlYXNlID0gc2VsZi5fbG9jay5yZWxlYXNlCisKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0X3NwYXduaW5nKHNlbGYpCisgICAgICAgIHJldHVybiBzeW5jaHJvbml6ZWQsIChzZWxmLl9vYmosIHNlbGYuX2xvY2spCisKKyAgICBkZWYgZ2V0X29iaihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX29iagorCisgICAgZGVmIGdldF9sb2NrKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbG9jaworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzwlcyB3cmFwcGVyIGZvciAlcz4nICUgKHR5cGUoc2VsZikuX19uYW1lX18sIHNlbGYuX29iaikKKworCitjbGFzcyBTeW5jaHJvbml6ZWQoU3luY2hyb25pemVkQmFzZSk6CisgICAgdmFsdWUgPSBtYWtlX3Byb3BlcnR5KCd2YWx1ZScpCisKKworY2xhc3MgU3luY2hyb25pemVkQXJyYXkoU3luY2hyb25pemVkQmFzZSk6CisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9vYmopCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIHNlbGYuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9vYmpbaV0KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVsZWFzZSgpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaSwgdmFsdWUpOgorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9vYmpbaV0gPSB2YWx1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3ApOgorICAgICAgICBzZWxmLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fb2JqW3N0YXJ0OnN0b3BdCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBzdGFydCwgc3RvcCwgdmFsdWVzKToKKyAgICAgICAgc2VsZi5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fb2JqW3N0YXJ0OnN0b3BdID0gdmFsdWVzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisKK2NsYXNzIFN5bmNocm9uaXplZFN0cmluZyhTeW5jaHJvbml6ZWRBcnJheSk6CisgICAgdmFsdWUgPSBtYWtlX3Byb3BlcnR5KCd2YWx1ZScpCisgICAgcmF3ID0gbWFrZV9wcm9wZXJ0eSgncmF3JykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3NoYXJlZGN0eXBlcy5weWMgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmRiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3NoYXJlZGN0eXBlcy5weW8gYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZDA4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy9zaGFyZWRjdHlwZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5IGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc3luY2hyb25pemUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwNzdlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5CkBAIC0wLDAgKzEsMzQ0IEBACisjCisjIE1vZHVsZSBpbXBsZW1lbnRpbmcgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMKKyMKKyMgbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK19fYWxsX18gPSBbCisgICAgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLCAnQ29uZGl0aW9uJywgJ0V2ZW50JworICAgIF0KKworaW1wb3J0IHRocmVhZGluZworaW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2Zyb20gdGltZSBpbXBvcnQgdGltZSBhcyBfdGltZSwgc2xlZXAgYXMgX3NsZWVwCisKK2ltcG9ydCBfbXVsdGlwcm9jZXNzaW5nCitmcm9tIG11bHRpcHJvY2Vzc2luZy5wcm9jZXNzIGltcG9ydCBjdXJyZW50X3Byb2Nlc3MKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnV0aWwgaW1wb3J0IEZpbmFsaXplLCByZWdpc3Rlcl9hZnRlcl9mb3JrLCBkZWJ1ZworZnJvbSBtdWx0aXByb2Nlc3NpbmcuZm9ya2luZyBpbXBvcnQgYXNzZXJ0X3NwYXduaW5nLCBQb3BlbgorCisjIFRyeSB0byBpbXBvcnQgdGhlIG1wLnN5bmNocm9uaXplIG1vZHVsZSBjbGVhbmx5LCBpZiBpdCBmYWlscworIyByYWlzZSBJbXBvcnRFcnJvciBmb3IgcGxhdGZvcm1zIGxhY2tpbmcgYSB3b3JraW5nIHNlbV9vcGVuIGltcGxlbWVudGF0aW9uLgorIyBTZWUgaXNzdWUgMzc3MAordHJ5OgorICAgIGZyb20gX211bHRpcHJvY2Vzc2luZyBpbXBvcnQgU2VtTG9jaworZXhjZXB0IChJbXBvcnRFcnJvcik6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlRoaXMgcGxhdGZvcm0gbGFja3MgYSBmdW5jdGlvbmluZyBzZW1fb3BlbiIgKworICAgICAgICAgICAgICAgICAgICAgICIgaW1wbGVtZW50YXRpb24sIHRoZXJlZm9yZSwgdGhlIHJlcXVpcmVkIiArCisgICAgICAgICAgICAgICAgICAgICAgIiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcyBuZWVkZWQgd2lsbCBub3QiICsKKyAgICAgICAgICAgICAgICAgICAgICAiIGZ1bmN0aW9uLCBzZWUgaXNzdWUgMzc3MC4iKQorCisjCisjIENvbnN0YW50cworIworCitSRUNVUlNJVkVfTVVURVgsIFNFTUFQSE9SRSA9IHJhbmdlKDIpCitTRU1fVkFMVUVfTUFYID0gX211bHRpcHJvY2Vzc2luZy5TZW1Mb2NrLlNFTV9WQUxVRV9NQVgKKworIworIyBCYXNlIGNsYXNzIGZvciBzZW1hcGhvcmVzIGFuZCBtdXRleGVzOyB3cmFwcyBgX211bHRpcHJvY2Vzc2luZy5TZW1Mb2NrYAorIworCitjbGFzcyBTZW1Mb2NrKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2luZCwgdmFsdWUsIG1heHZhbHVlKToKKyAgICAgICAgc2wgPSBzZWxmLl9zZW1sb2NrID0gX211bHRpcHJvY2Vzc2luZy5TZW1Mb2NrKGtpbmQsIHZhbHVlLCBtYXh2YWx1ZSkKKyAgICAgICAgZGVidWcoJ2NyZWF0ZWQgc2VtbG9jayB3aXRoIGhhbmRsZSAlcycgJSBzbC5oYW5kbGUpCisgICAgICAgIHNlbGYuX21ha2VfbWV0aG9kcygpCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6CisgICAgICAgICAgICBkZWYgX2FmdGVyX2Zvcmsob2JqKToKKyAgICAgICAgICAgICAgICBvYmouX3NlbWxvY2suX2FmdGVyX2ZvcmsoKQorICAgICAgICAgICAgcmVnaXN0ZXJfYWZ0ZXJfZm9yayhzZWxmLCBfYWZ0ZXJfZm9yaykKKworICAgIGRlZiBfbWFrZV9tZXRob2RzKHNlbGYpOgorICAgICAgICBzZWxmLmFjcXVpcmUgPSBzZWxmLl9zZW1sb2NrLmFjcXVpcmUKKyAgICAgICAgc2VsZi5yZWxlYXNlID0gc2VsZi5fc2VtbG9jay5yZWxlYXNlCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc2VtbG9jay5fX2VudGVyX18oKQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NlbWxvY2suX19leGl0X18oKmFyZ3MpCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICBhc3NlcnRfc3Bhd25pbmcoc2VsZikKKyAgICAgICAgc2wgPSBzZWxmLl9zZW1sb2NrCisgICAgICAgIHJldHVybiAoUG9wZW4uZHVwbGljYXRlX2Zvcl9jaGlsZChzbC5oYW5kbGUpLCBzbC5raW5kLCBzbC5tYXh2YWx1ZSkKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmLl9zZW1sb2NrID0gX211bHRpcHJvY2Vzc2luZy5TZW1Mb2NrLl9yZWJ1aWxkKCpzdGF0ZSkKKyAgICAgICAgZGVidWcoJ3JlY3JlYXRlZCBibG9ja2VyIHdpdGggaGFuZGxlICVyJyAlIHN0YXRlWzBdKQorICAgICAgICBzZWxmLl9tYWtlX21ldGhvZHMoKQorCisjCisjIFNlbWFwaG9yZQorIworCitjbGFzcyBTZW1hcGhvcmUoU2VtTG9jayk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9MSk6CisgICAgICAgIFNlbUxvY2suX19pbml0X18oc2VsZiwgU0VNQVBIT1JFLCB2YWx1ZSwgU0VNX1ZBTFVFX01BWCkKKworICAgIGRlZiBnZXRfdmFsdWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zZW1sb2NrLl9nZXRfdmFsdWUoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IHNlbGYuX3NlbWxvY2suX2dldF92YWx1ZSgpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICB2YWx1ZSA9ICd1bmtub3duJworICAgICAgICByZXR1cm4gJzxTZW1hcGhvcmUodmFsdWU9JXMpPicgJSB2YWx1ZQorCisjCisjIEJvdW5kZWQgc2VtYXBob3JlCisjCisKK2NsYXNzIEJvdW5kZWRTZW1hcGhvcmUoU2VtYXBob3JlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT0xKToKKyAgICAgICAgU2VtTG9jay5fX2luaXRfXyhzZWxmLCBTRU1BUEhPUkUsIHZhbHVlLCB2YWx1ZSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLl9zZW1sb2NrLl9nZXRfdmFsdWUoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgdmFsdWUgPSAndW5rbm93bicKKyAgICAgICAgcmV0dXJuICc8Qm91bmRlZFNlbWFwaG9yZSh2YWx1ZT0lcywgbWF4dmFsdWU9JXMpPicgJSBcCisgICAgICAgICAgICAgICAodmFsdWUsIHNlbGYuX3NlbWxvY2subWF4dmFsdWUpCisKKyMKKyMgTm9uLXJlY3Vyc2l2ZSBsb2NrCisjCisKK2NsYXNzIExvY2soU2VtTG9jayk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFNlbUxvY2suX19pbml0X18oc2VsZiwgU0VNQVBIT1JFLCAxLCAxKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9zZW1sb2NrLl9pc19taW5lKCk6CisgICAgICAgICAgICAgICAgbmFtZSA9IGN1cnJlbnRfcHJvY2VzcygpLm5hbWUKKyAgICAgICAgICAgICAgICBpZiB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lICE9ICdNYWluVGhyZWFkJzoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSArPSAnfCcgKyB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKS5uYW1lCisgICAgICAgICAgICBlbGlmIHNlbGYuX3NlbWxvY2suX2dldF92YWx1ZSgpID09IDE6CisgICAgICAgICAgICAgICAgbmFtZSA9ICdOb25lJworICAgICAgICAgICAgZWxpZiBzZWxmLl9zZW1sb2NrLl9jb3VudCgpID4gMDoKKyAgICAgICAgICAgICAgICBuYW1lID0gJ1NvbWVPdGhlclRocmVhZCcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmFtZSA9ICdTb21lT3RoZXJQcm9jZXNzJworICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgbmFtZSA9ICd1bmtub3duJworICAgICAgICByZXR1cm4gJzxMb2NrKG93bmVyPSVzKT4nICUgbmFtZQorCisjCisjIFJlY3Vyc2l2ZSBsb2NrCisjCisKK2NsYXNzIFJMb2NrKFNlbUxvY2spOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBTZW1Mb2NrLl9faW5pdF9fKHNlbGYsIFJFQ1VSU0lWRV9NVVRFWCwgMSwgMSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fc2VtbG9jay5faXNfbWluZSgpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBjdXJyZW50X3Byb2Nlc3MoKS5uYW1lCisgICAgICAgICAgICAgICAgaWYgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZSAhPSAnTWFpblRocmVhZCc6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgKz0gJ3wnICsgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkubmFtZQorICAgICAgICAgICAgICAgIGNvdW50ID0gc2VsZi5fc2VtbG9jay5fY291bnQoKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zZW1sb2NrLl9nZXRfdmFsdWUoKSA9PSAxOgorICAgICAgICAgICAgICAgIG5hbWUsIGNvdW50ID0gJ05vbmUnLCAwCisgICAgICAgICAgICBlbGlmIHNlbGYuX3NlbWxvY2suX2NvdW50KCkgPiAwOgorICAgICAgICAgICAgICAgIG5hbWUsIGNvdW50ID0gJ1NvbWVPdGhlclRocmVhZCcsICdub256ZXJvJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lLCBjb3VudCA9ICdTb21lT3RoZXJQcm9jZXNzJywgJ25vbnplcm8nCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICBuYW1lLCBjb3VudCA9ICd1bmtub3duJywgJ3Vua25vd24nCisgICAgICAgIHJldHVybiAnPFJMb2NrKCVzLCAlcyk+JyAlIChuYW1lLCBjb3VudCkKKworIworIyBDb25kaXRpb24gdmFyaWFibGUKKyMKKworY2xhc3MgQ29uZGl0aW9uKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jaz1Ob25lKToKKyAgICAgICAgc2VsZi5fbG9jayA9IGxvY2sgb3IgUkxvY2soKQorICAgICAgICBzZWxmLl9zbGVlcGluZ19jb3VudCA9IFNlbWFwaG9yZSgwKQorICAgICAgICBzZWxmLl93b2tlbl9jb3VudCA9IFNlbWFwaG9yZSgwKQorICAgICAgICBzZWxmLl93YWl0X3NlbWFwaG9yZSA9IFNlbWFwaG9yZSgwKQorICAgICAgICBzZWxmLl9tYWtlX21ldGhvZHMoKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0X3NwYXduaW5nKHNlbGYpCisgICAgICAgIHJldHVybiAoc2VsZi5fbG9jaywgc2VsZi5fc2xlZXBpbmdfY291bnQsCisgICAgICAgICAgICAgICAgc2VsZi5fd29rZW5fY291bnQsIHNlbGYuX3dhaXRfc2VtYXBob3JlKQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIChzZWxmLl9sb2NrLCBzZWxmLl9zbGVlcGluZ19jb3VudCwKKyAgICAgICAgIHNlbGYuX3dva2VuX2NvdW50LCBzZWxmLl93YWl0X3NlbWFwaG9yZSkgPSBzdGF0ZQorICAgICAgICBzZWxmLl9tYWtlX21ldGhvZHMoKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvY2suX19lbnRlcl9fKCkKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLl9sb2NrLl9fZXhpdF9fKCphcmdzKQorCisgICAgZGVmIF9tYWtlX21ldGhvZHMoc2VsZik6CisgICAgICAgIHNlbGYuYWNxdWlyZSA9IHNlbGYuX2xvY2suYWNxdWlyZQorICAgICAgICBzZWxmLnJlbGVhc2UgPSBzZWxmLl9sb2NrLnJlbGVhc2UKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbnVtX3dhaXRlcnMgPSAoc2VsZi5fc2xlZXBpbmdfY291bnQuX3NlbWxvY2suX2dldF92YWx1ZSgpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dva2VuX2NvdW50Ll9zZW1sb2NrLl9nZXRfdmFsdWUoKSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIG51bV93YWl0ZXJzID0gJ3Vua293bicKKyAgICAgICAgcmV0dXJuICc8Q29uZGl0aW9uKCVzLCAlcyk+JyAlIChzZWxmLl9sb2NrLCBudW1fd2FpdGVycykKKworICAgIGRlZiB3YWl0KHNlbGYsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgIGFzc2VydCBzZWxmLl9sb2NrLl9zZW1sb2NrLl9pc19taW5lKCksIFwKKyAgICAgICAgICAgICAgICdtdXN0IGFjcXVpcmUoKSBjb25kaXRpb24gYmVmb3JlIHVzaW5nIHdhaXQoKScKKworICAgICAgICAjIGluZGljYXRlIHRoYXQgdGhpcyB0aHJlYWQgaXMgZ29pbmcgdG8gc2xlZXAKKyAgICAgICAgc2VsZi5fc2xlZXBpbmdfY291bnQucmVsZWFzZSgpCisKKyAgICAgICAgIyByZWxlYXNlIGxvY2sKKyAgICAgICAgY291bnQgPSBzZWxmLl9sb2NrLl9zZW1sb2NrLl9jb3VudCgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShjb3VudCk6CisgICAgICAgICAgICBzZWxmLl9sb2NrLnJlbGVhc2UoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgd2FpdCBmb3Igbm90aWZpY2F0aW9uIG9yIHRpbWVvdXQKKyAgICAgICAgICAgIHNlbGYuX3dhaXRfc2VtYXBob3JlLmFjcXVpcmUoVHJ1ZSwgdGltZW91dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgaW5kaWNhdGUgdGhhdCB0aGlzIHRocmVhZCBoYXMgd29rZW4KKyAgICAgICAgICAgIHNlbGYuX3dva2VuX2NvdW50LnJlbGVhc2UoKQorCisgICAgICAgICAgICAjIHJlYWNxdWlyZSBsb2NrCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoY291bnQpOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvY2suYWNxdWlyZSgpCisKKyAgICBkZWYgbm90aWZ5KHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5fbG9jay5fc2VtbG9jay5faXNfbWluZSgpLCAnbG9jayBpcyBub3Qgb3duZWQnCisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5fd2FpdF9zZW1hcGhvcmUuYWNxdWlyZShGYWxzZSkKKworICAgICAgICAjIHRvIHRha2UgYWNjb3VudCBvZiB0aW1lb3V0cyBzaW5jZSBsYXN0IG5vdGlmeSgpIHdlIHN1YnRyYWN0CisgICAgICAgICMgd29rZW5fY291bnQgZnJvbSBzbGVlcGluZ19jb3VudCBhbmQgcmV6ZXJvIHdva2VuX2NvdW50CisgICAgICAgIHdoaWxlIHNlbGYuX3dva2VuX2NvdW50LmFjcXVpcmUoRmFsc2UpOgorICAgICAgICAgICAgcmVzID0gc2VsZi5fc2xlZXBpbmdfY291bnQuYWNxdWlyZShGYWxzZSkKKyAgICAgICAgICAgIGFzc2VydCByZXMKKworICAgICAgICBpZiBzZWxmLl9zbGVlcGluZ19jb3VudC5hY3F1aXJlKEZhbHNlKTogIyB0cnkgZ3JhYmJpbmcgYSBzbGVlcGVyCisgICAgICAgICAgICBzZWxmLl93YWl0X3NlbWFwaG9yZS5yZWxlYXNlKCkgICAgICAjIHdha2UgdXAgb25lIHNsZWVwZXIKKyAgICAgICAgICAgIHNlbGYuX3dva2VuX2NvdW50LmFjcXVpcmUoKSAgICAgICAgICMgd2FpdCBmb3IgdGhlIHNsZWVwZXIgdG8gd2FrZQorCisgICAgICAgICAgICAjIHJlemVybyBfd2FpdF9zZW1hcGhvcmUgaW4gY2FzZSBhIHRpbWVvdXQganVzdCBoYXBwZW5lZAorICAgICAgICAgICAgc2VsZi5fd2FpdF9zZW1hcGhvcmUuYWNxdWlyZShGYWxzZSkKKworICAgIGRlZiBub3RpZnlfYWxsKHNlbGYpOgorICAgICAgICBhc3NlcnQgc2VsZi5fbG9jay5fc2VtbG9jay5faXNfbWluZSgpLCAnbG9jayBpcyBub3Qgb3duZWQnCisgICAgICAgIGFzc2VydCBub3Qgc2VsZi5fd2FpdF9zZW1hcGhvcmUuYWNxdWlyZShGYWxzZSkKKworICAgICAgICAjIHRvIHRha2UgYWNjb3VudCBvZiB0aW1lb3V0cyBzaW5jZSBsYXN0IG5vdGlmeSooKSB3ZSBzdWJ0cmFjdAorICAgICAgICAjIHdva2VuX2NvdW50IGZyb20gc2xlZXBpbmdfY291bnQgYW5kIHJlemVybyB3b2tlbl9jb3VudAorICAgICAgICB3aGlsZSBzZWxmLl93b2tlbl9jb3VudC5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgIHJlcyA9IHNlbGYuX3NsZWVwaW5nX2NvdW50LmFjcXVpcmUoRmFsc2UpCisgICAgICAgICAgICBhc3NlcnQgcmVzCisKKyAgICAgICAgc2xlZXBlcnMgPSAwCisgICAgICAgIHdoaWxlIHNlbGYuX3NsZWVwaW5nX2NvdW50LmFjcXVpcmUoRmFsc2UpOgorICAgICAgICAgICAgc2VsZi5fd2FpdF9zZW1hcGhvcmUucmVsZWFzZSgpICAgICAgICAjIHdha2UgdXAgb25lIHNsZWVwZXIKKyAgICAgICAgICAgIHNsZWVwZXJzICs9IDEKKworICAgICAgICBpZiBzbGVlcGVyczoKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzbGVlcGVycyk6CisgICAgICAgICAgICAgICAgc2VsZi5fd29rZW5fY291bnQuYWNxdWlyZSgpICAgICAgICMgd2FpdCBmb3IgYSBzbGVlcGVyIHRvIHdha2UKKworICAgICAgICAgICAgIyByZXplcm8gd2FpdF9zZW1hcGhvcmUgaW4gY2FzZSBzb21lIHRpbWVvdXRzIGp1c3QgaGFwcGVuZWQKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuX3dhaXRfc2VtYXBob3JlLmFjcXVpcmUoRmFsc2UpOgorICAgICAgICAgICAgICAgIHBhc3MKKworIworIyBFdmVudAorIworCitjbGFzcyBFdmVudChvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9jb25kID0gQ29uZGl0aW9uKExvY2soKSkKKyAgICAgICAgc2VsZi5fZmxhZyA9IFNlbWFwaG9yZSgwKQorCisgICAgZGVmIGlzX3NldChzZWxmKToKKyAgICAgICAgc2VsZi5fY29uZC5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fZmxhZy5hY3F1aXJlKEZhbHNlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9mbGFnLnJlbGVhc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgc2V0KHNlbGYpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9mbGFnLmFjcXVpcmUoRmFsc2UpCisgICAgICAgICAgICBzZWxmLl9mbGFnLnJlbGVhc2UoKQorICAgICAgICAgICAgc2VsZi5fY29uZC5ub3RpZnlfYWxsKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYuX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2ZsYWcuYWNxdWlyZShGYWxzZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2NvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgd2FpdChzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBzZWxmLl9jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9mbGFnLmFjcXVpcmUoRmFsc2UpOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZsYWcucmVsZWFzZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbmQud2FpdCh0aW1lb3V0KQorCisgICAgICAgICAgICBpZiBzZWxmLl9mbGFnLmFjcXVpcmUoRmFsc2UpOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZsYWcucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fY29uZC5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5YyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTZiYTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc3luY2hyb25pemUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5byBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3N5bmNocm9uaXplLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNkMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3Npbmcvc3luY2hyb25pemUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHkgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYjNkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211bHRpcHJvY2Vzc2luZy91dGlsLnB5CkBAIC0wLDAgKzEsMzQ0IEBACisjCisjIE1vZHVsZSBwcm92aWRpbmcgdmFyaW91cyBmYWNpbGl0aWVzIHRvIG90aGVyIHBhcnRzIG9mIHRoZSBwYWNrYWdlCisjCisjIG11bHRpcHJvY2Vzc2luZy91dGlsLnB5CisjCisjIENvcHlyaWdodCAoYykgMjAwNi0yMDA4LCBSIE91ZGtlcmsKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIworIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBhbnkgY29udHJpYnV0b3JzIG1heSBiZQorIyAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorIyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VDSCBEQU1BR0UuCisjCisKK2ltcG9ydCBpdGVydG9vbHMKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgYXRleGl0CitpbXBvcnQgdGhyZWFkaW5nICAgICAgICAjIHdlIHdhbnQgdGhyZWFkaW5nIHRvIGluc3RhbGwgaXQncworICAgICAgICAgICAgICAgICAgICAgICAgIyBjbGVhbnVwIGZ1bmN0aW9uIGJlZm9yZSBtdWx0aXByb2Nlc3NpbmcgZG9lcworZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBfYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzCisKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLnByb2Nlc3MgaW1wb3J0IGN1cnJlbnRfcHJvY2VzcywgYWN0aXZlX2NoaWxkcmVuCisKK19fYWxsX18gPSBbCisgICAgJ3N1Yl9kZWJ1ZycsICdkZWJ1ZycsICdpbmZvJywgJ3N1Yl93YXJuaW5nJywgJ2dldF9sb2dnZXInLAorICAgICdsb2dfdG9fc3RkZXJyJywgJ2dldF90ZW1wX2RpcicsICdyZWdpc3Rlcl9hZnRlcl9mb3JrJywKKyAgICAnaXNfZXhpdGluZycsICdGaW5hbGl6ZScsICdGb3JrQXdhcmVUaHJlYWRMb2NrJywgJ0ZvcmtBd2FyZUxvY2FsJywKKyAgICAnU1VCREVCVUcnLCAnU1VCV0FSTklORycsCisgICAgXQorCisjCisjIExvZ2dpbmcKKyMKKworTk9UU0VUID0gMAorU1VCREVCVUcgPSA1CitERUJVRyA9IDEwCitJTkZPID0gMjAKK1NVQldBUk5JTkcgPSAyNQorCitMT0dHRVJfTkFNRSA9ICdtdWx0aXByb2Nlc3NpbmcnCitERUZBVUxUX0xPR0dJTkdfRk9STUFUID0gJ1slKGxldmVsbmFtZSlzLyUocHJvY2Vzc05hbWUpc10gJShtZXNzYWdlKXMnCisKK19sb2dnZXIgPSBOb25lCitfbG9nX3RvX3N0ZGVyciA9IEZhbHNlCisKK2RlZiBzdWJfZGVidWcobXNnLCAqYXJncyk6CisgICAgaWYgX2xvZ2dlcjoKKyAgICAgICAgX2xvZ2dlci5sb2coU1VCREVCVUcsIG1zZywgKmFyZ3MpCisKK2RlZiBkZWJ1Zyhtc2csICphcmdzKToKKyAgICBpZiBfbG9nZ2VyOgorICAgICAgICBfbG9nZ2VyLmxvZyhERUJVRywgbXNnLCAqYXJncykKKworZGVmIGluZm8obXNnLCAqYXJncyk6CisgICAgaWYgX2xvZ2dlcjoKKyAgICAgICAgX2xvZ2dlci5sb2coSU5GTywgbXNnLCAqYXJncykKKworZGVmIHN1Yl93YXJuaW5nKG1zZywgKmFyZ3MpOgorICAgIGlmIF9sb2dnZXI6CisgICAgICAgIF9sb2dnZXIubG9nKFNVQldBUk5JTkcsIG1zZywgKmFyZ3MpCisKK2RlZiBnZXRfbG9nZ2VyKCk6CisgICAgJycnCisgICAgUmV0dXJucyBsb2dnZXIgdXNlZCBieSBtdWx0aXByb2Nlc3NpbmcKKyAgICAnJycKKyAgICBnbG9iYWwgX2xvZ2dlcgorICAgIGltcG9ydCBsb2dnaW5nLCBhdGV4aXQKKworICAgIGxvZ2dpbmcuX2FjcXVpcmVMb2NrKCkKKyAgICB0cnk6CisgICAgICAgIGlmIG5vdCBfbG9nZ2VyOgorCisgICAgICAgICAgICBfbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoTE9HR0VSX05BTUUpCisgICAgICAgICAgICBfbG9nZ2VyLnByb3BhZ2F0ZSA9IDAKKyAgICAgICAgICAgIGxvZ2dpbmcuYWRkTGV2ZWxOYW1lKFNVQkRFQlVHLCAnU1VCREVCVUcnKQorICAgICAgICAgICAgbG9nZ2luZy5hZGRMZXZlbE5hbWUoU1VCV0FSTklORywgJ1NVQldBUk5JTkcnKQorCisgICAgICAgICAgICAjIFhYWCBtdWx0aXByb2Nlc3Npbmcgc2hvdWxkIGNsZWFudXAgYmVmb3JlIGxvZ2dpbmcKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoYXRleGl0LCAndW5yZWdpc3RlcicpOgorICAgICAgICAgICAgICAgIGF0ZXhpdC51bnJlZ2lzdGVyKF9leGl0X2Z1bmN0aW9uKQorICAgICAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihfZXhpdF9mdW5jdGlvbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXRleGl0Ll9leGl0aGFuZGxlcnMucmVtb3ZlKChfZXhpdF9mdW5jdGlvbiwgKCksIHt9KSkKKyAgICAgICAgICAgICAgICBhdGV4aXQuX2V4aXRoYW5kbGVycy5hcHBlbmQoKF9leGl0X2Z1bmN0aW9uLCAoKSwge30pKQorCisgICAgZmluYWxseToKKyAgICAgICAgbG9nZ2luZy5fcmVsZWFzZUxvY2soKQorCisgICAgcmV0dXJuIF9sb2dnZXIKKworZGVmIGxvZ190b19zdGRlcnIobGV2ZWw9Tm9uZSk6CisgICAgJycnCisgICAgVHVybiBvbiBsb2dnaW5nIGFuZCBhZGQgYSBoYW5kbGVyIHdoaWNoIHByaW50cyB0byBzdGRlcnIKKyAgICAnJycKKyAgICBnbG9iYWwgX2xvZ190b19zdGRlcnIKKyAgICBpbXBvcnQgbG9nZ2luZworCisgICAgbG9nZ2VyID0gZ2V0X2xvZ2dlcigpCisgICAgZm9ybWF0dGVyID0gbG9nZ2luZy5Gb3JtYXR0ZXIoREVGQVVMVF9MT0dHSU5HX0ZPUk1BVCkKKyAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKCkKKyAgICBoYW5kbGVyLnNldEZvcm1hdHRlcihmb3JtYXR0ZXIpCisgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKKworICAgIGlmIGxldmVsOgorICAgICAgICBsb2dnZXIuc2V0TGV2ZWwobGV2ZWwpCisgICAgX2xvZ190b19zdGRlcnIgPSBUcnVlCisgICAgcmV0dXJuIF9sb2dnZXIKKworIworIyBGdW5jdGlvbiByZXR1cm5pbmcgYSB0ZW1wIGRpcmVjdG9yeSB3aGljaCB3aWxsIGJlIHJlbW92ZWQgb24gZXhpdAorIworCitkZWYgZ2V0X3RlbXBfZGlyKCk6CisgICAgIyBnZXQgbmFtZSBvZiBhIHRlbXAgZGlyZWN0b3J5IHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSBjbGVhbmVkIHVwCisgICAgaWYgY3VycmVudF9wcm9jZXNzKCkuX3RlbXBkaXIgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHNodXRpbCwgdGVtcGZpbGUKKyAgICAgICAgdGVtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSdweW1wLScpCisgICAgICAgIGluZm8oJ2NyZWF0ZWQgdGVtcCBkaXJlY3RvcnkgJXMnLCB0ZW1wZGlyKQorICAgICAgICBGaW5hbGl6ZShOb25lLCBzaHV0aWwucm10cmVlLCBhcmdzPVt0ZW1wZGlyXSwgZXhpdHByaW9yaXR5PS0xMDApCisgICAgICAgIGN1cnJlbnRfcHJvY2VzcygpLl90ZW1wZGlyID0gdGVtcGRpcgorICAgIHJldHVybiBjdXJyZW50X3Byb2Nlc3MoKS5fdGVtcGRpcgorCisjCisjIFN1cHBvcnQgZm9yIHJlaW5pdGlhbGl6YXRpb24gb2Ygb2JqZWN0cyB3aGVuIGJvb3RzdHJhcHBpbmcgYSBjaGlsZCBwcm9jZXNzCisjCisKK19hZnRlcmZvcmtfcmVnaXN0cnkgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQorX2FmdGVyZm9ya19jb3VudGVyID0gaXRlcnRvb2xzLmNvdW50KCkKKworZGVmIF9ydW5fYWZ0ZXJfZm9ya2VycygpOgorICAgIGl0ZW1zID0gbGlzdChfYWZ0ZXJmb3JrX3JlZ2lzdHJ5Lml0ZW1zKCkpCisgICAgaXRlbXMuc29ydCgpCisgICAgZm9yIChpbmRleCwgaWRlbnQsIGZ1bmMpLCBvYmogaW4gaXRlbXM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMob2JqKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgaW5mbygnYWZ0ZXIgZm9ya2VyIHJhaXNlZCBleGNlcHRpb24gJXMnLCBlKQorCitkZWYgcmVnaXN0ZXJfYWZ0ZXJfZm9yayhvYmosIGZ1bmMpOgorICAgIF9hZnRlcmZvcmtfcmVnaXN0cnlbKF9hZnRlcmZvcmtfY291bnRlci5uZXh0KCksIGlkKG9iaiksIGZ1bmMpXSA9IG9iagorCisjCisjIEZpbmFsaXphdGlvbiB1c2luZyB3ZWFrcmVmcworIworCitfZmluYWxpemVyX3JlZ2lzdHJ5ID0ge30KK19maW5hbGl6ZXJfY291bnRlciA9IGl0ZXJ0b29scy5jb3VudCgpCisKKworY2xhc3MgRmluYWxpemUob2JqZWN0KToKKyAgICAnJycKKyAgICBDbGFzcyB3aGljaCBzdXBwb3J0cyBvYmplY3QgZmluYWxpemF0aW9uIHVzaW5nIHdlYWtyZWZzCisgICAgJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9iaiwgY2FsbGJhY2ssIGFyZ3M9KCksIGt3YXJncz1Ob25lLCBleGl0cHJpb3JpdHk9Tm9uZSk6CisgICAgICAgIGFzc2VydCBleGl0cHJpb3JpdHkgaXMgTm9uZSBvciB0eXBlKGV4aXRwcmlvcml0eSkgaXMgaW50CisKKyAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fd2Vha3JlZiA9IHdlYWtyZWYucmVmKG9iaiwgc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBleGl0cHJpb3JpdHkgaXMgbm90IE5vbmUKKworICAgICAgICBzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgIHNlbGYuX2FyZ3MgPSBhcmdzCisgICAgICAgIHNlbGYuX2t3YXJncyA9IGt3YXJncyBvciB7fQorICAgICAgICBzZWxmLl9rZXkgPSAoZXhpdHByaW9yaXR5LCBfZmluYWxpemVyX2NvdW50ZXIubmV4dCgpKQorCisgICAgICAgIF9maW5hbGl6ZXJfcmVnaXN0cnlbc2VsZi5fa2V5XSA9IHNlbGYKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCB3cj1Ob25lKToKKyAgICAgICAgJycnCisgICAgICAgIFJ1biB0aGUgY2FsbGJhY2sgdW5sZXNzIGl0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIG9yIGNhbmNlbGxlZAorICAgICAgICAnJycKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIF9maW5hbGl6ZXJfcmVnaXN0cnlbc2VsZi5fa2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzdWJfZGVidWcoJ2ZpbmFsaXplciBubyBsb25nZXIgcmVnaXN0ZXJlZCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWJfZGVidWcoJ2ZpbmFsaXplciBjYWxsaW5nICVzIHdpdGggYXJncyAlcyBhbmQga3dhcmdzICVzJywKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2NhbGxiYWNrLCBzZWxmLl9hcmdzLCBzZWxmLl9rd2FyZ3MpCisgICAgICAgICAgICByZXMgPSBzZWxmLl9jYWxsYmFjaygqc2VsZi5fYXJncywgKipzZWxmLl9rd2FyZ3MpCisgICAgICAgICAgICBzZWxmLl93ZWFrcmVmID0gc2VsZi5fY2FsbGJhY2sgPSBzZWxmLl9hcmdzID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2t3YXJncyA9IHNlbGYuX2tleSA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiBjYW5jZWwoc2VsZik6CisgICAgICAgICcnJworICAgICAgICBDYW5jZWwgZmluYWxpemF0aW9uIG9mIHRoZSBvYmplY3QKKyAgICAgICAgJycnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBfZmluYWxpemVyX3JlZ2lzdHJ5W3NlbGYuX2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fd2Vha3JlZiA9IHNlbGYuX2NhbGxiYWNrID0gc2VsZi5fYXJncyA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9rd2FyZ3MgPSBzZWxmLl9rZXkgPSBOb25lCisKKyAgICBkZWYgc3RpbGxfYWN0aXZlKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgUmV0dXJuIHdoZXRoZXIgdGhpcyBmaW5hbGl6ZXIgaXMgc3RpbGwgd2FpdGluZyB0byBpbnZva2UgY2FsbGJhY2sKKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiBzZWxmLl9rZXkgaW4gX2ZpbmFsaXplcl9yZWdpc3RyeQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvYmogPSBzZWxmLl93ZWFrcmVmKCkKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIG9iaiA9IE5vbmUKKworICAgICAgICBpZiBvYmogaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAnPEZpbmFsaXplIG9iamVjdCwgZGVhZD4nCisKKyAgICAgICAgeCA9ICc8RmluYWxpemUgb2JqZWN0LCBjYWxsYmFjaz0lcycgJSBcCisgICAgICAgICAgICBnZXRhdHRyKHNlbGYuX2NhbGxiYWNrLCAnX19uYW1lX18nLCBzZWxmLl9jYWxsYmFjaykKKyAgICAgICAgaWYgc2VsZi5fYXJnczoKKyAgICAgICAgICAgIHggKz0gJywgYXJncz0nICsgc3RyKHNlbGYuX2FyZ3MpCisgICAgICAgIGlmIHNlbGYuX2t3YXJnczoKKyAgICAgICAgICAgIHggKz0gJywga3dhcmdzPScgKyBzdHIoc2VsZi5fa3dhcmdzKQorICAgICAgICBpZiBzZWxmLl9rZXlbMF0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICB4ICs9ICcsIGV4aXRwcm9yaXR5PScgKyBzdHIoc2VsZi5fa2V5WzBdKQorICAgICAgICByZXR1cm4geCArICc+JworCisKK2RlZiBfcnVuX2ZpbmFsaXplcnMobWlucHJpb3JpdHk9Tm9uZSk6CisgICAgJycnCisgICAgUnVuIGFsbCBmaW5hbGl6ZXJzIHdob3NlIGV4aXQgcHJpb3JpdHkgaXMgbm90IE5vbmUgYW5kIGF0IGxlYXN0IG1pbnByaW9yaXR5CisKKyAgICBGaW5hbGl6ZXJzIHdpdGggaGlnaGVzdCBwcmlvcml0eSBhcmUgY2FsbGVkIGZpcnN0OyBmaW5hbGl6ZXJzIHdpdGgKKyAgICB0aGUgc2FtZSBwcmlvcml0eSB3aWxsIGJlIGNhbGxlZCBpbiByZXZlcnNlIG9yZGVyIG9mIGNyZWF0aW9uLgorICAgICcnJworICAgIGlmIF9maW5hbGl6ZXJfcmVnaXN0cnkgaXMgTm9uZToKKyAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIG1heSBiZSBjYWxsZWQgYWZ0ZXIgdGhpcyBtb2R1bGUncyBnbG9iYWxzIGFyZQorICAgICAgICAjIGRlc3Ryb3llZC4gIFNlZSB0aGUgX2V4aXRfZnVuY3Rpb24gZnVuY3Rpb24gaW4gdGhpcyBtb2R1bGUgZm9yIG1vcmUKKyAgICAgICAgIyBub3Rlcy4KKyAgICAgICAgcmV0dXJuCisKKyAgICBpZiBtaW5wcmlvcml0eSBpcyBOb25lOgorICAgICAgICBmID0gbGFtYmRhIHAgOiBwWzBdWzBdIGlzIG5vdCBOb25lCisgICAgZWxzZToKKyAgICAgICAgZiA9IGxhbWJkYSBwIDogcFswXVswXSBpcyBub3QgTm9uZSBhbmQgcFswXVswXSA+PSBtaW5wcmlvcml0eQorCisgICAgaXRlbXMgPSBbeCBmb3IgeCBpbiBfZmluYWxpemVyX3JlZ2lzdHJ5Lml0ZW1zKCkgaWYgZih4KV0KKyAgICBpdGVtcy5zb3J0KHJldmVyc2U9VHJ1ZSkKKworICAgIGZvciBrZXksIGZpbmFsaXplciBpbiBpdGVtczoKKyAgICAgICAgc3ViX2RlYnVnKCdjYWxsaW5nICVzJywgZmluYWxpemVyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaW5hbGl6ZXIoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisKKyAgICBpZiBtaW5wcmlvcml0eSBpcyBOb25lOgorICAgICAgICBfZmluYWxpemVyX3JlZ2lzdHJ5LmNsZWFyKCkKKworIworIyBDbGVhbiB1cCBvbiBleGl0CisjCisKK2RlZiBpc19leGl0aW5nKCk6CisgICAgJycnCisgICAgUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzIGlzIHNodXR0aW5nIGRvd24KKyAgICAnJycKKyAgICByZXR1cm4gX2V4aXRpbmcgb3IgX2V4aXRpbmcgaXMgTm9uZQorCitfZXhpdGluZyA9IEZhbHNlCisKK2RlZiBfZXhpdF9mdW5jdGlvbihpbmZvPWluZm8sIGRlYnVnPWRlYnVnLCBfcnVuX2ZpbmFsaXplcnM9X3J1bl9maW5hbGl6ZXJzLAorICAgICAgICAgICAgICAgICAgIGFjdGl2ZV9jaGlsZHJlbj1hY3RpdmVfY2hpbGRyZW4sCisgICAgICAgICAgICAgICAgICAgY3VycmVudF9wcm9jZXNzPWN1cnJlbnRfcHJvY2Vzcyk6CisgICAgIyBOQjogd2UgaG9sZCBvbiB0byByZWZlcmVuY2VzIHRvIGZ1bmN0aW9ucyBpbiB0aGUgYXJnbGlzdCBkdWUgdG8gdGhlCisgICAgIyBzaXR1YXRpb24gZGVzY3JpYmVkIGJlbG93LCB3aGVyZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhZnRlciB0aGlzCisgICAgIyBtb2R1bGUncyBnbG9iYWxzIGFyZSBkZXN0cm95ZWQuCisKKyAgICBnbG9iYWwgX2V4aXRpbmcKKworICAgIGluZm8oJ3Byb2Nlc3Mgc2h1dHRpbmcgZG93bicpCisgICAgZGVidWcoJ3J1bm5pbmcgYWxsICJhdGV4aXQiIGZpbmFsaXplcnMgd2l0aCBwcmlvcml0eSA+PSAwJykKKyAgICBfcnVuX2ZpbmFsaXplcnMoMCkKKworICAgIGlmIGN1cnJlbnRfcHJvY2VzcygpIGlzIG5vdCBOb25lOgorICAgICAgICAjIE5COiB3ZSBjaGVjayBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIE5vbmUgaGVyZSBiZWNhdXNlIGlmCisgICAgICAgICMgaXQncyBOb25lLCBhbnkgY2FsbCB0byBgYGFjdGl2ZV9jaGlsZHJlbigpYGAgd2lsbCB0aHJvdyBhbgorICAgICAgICAjIEF0dHJpYnV0ZUVycm9yIChhY3RpdmVfY2hpbGRyZW4gd2luZHMgdXAgdHJ5aW5nIHRvIGdldAorICAgICAgICAjIGF0dHJpYnV0ZXMgZnJvbSB1dGlsLl9jdXJyZW50X3Byb2Nlc3MpLiAgVGhpcyBoYXBwZW5zIGluIGEKKyAgICAgICAgIyB2YXJpZXR5IG9mIHNodXRkb3duIGNpcmN1bXN0YW5jZXMgdGhhdCBhcmUgbm90IHdlbGwtdW5kZXJzdG9vZAorICAgICAgICAjIGJlY2F1c2UgbW9kdWxlLXNjb3BlIHZhcmlhYmxlcyBhcmUgbm90IGFwcGFyZW50bHkgc3VwcG9zZWQgdG8KKyAgICAgICAgIyBiZSBkZXN0cm95ZWQgdW50aWwgYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuICBIb3dldmVyLAorICAgICAgICAjIHRoZXkgYXJlIGluZGVlZCBkZXN0cm95ZWQgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAgU2VlCisgICAgICAgICMgaXNzdWVzIDk3NzUgYW5kIDE1ODgxLiAgQWxzbyByZWxhdGVkOiA0MTA2LCA5MjA1LCBhbmQgOTIwNy4KKworICAgICAgICBmb3IgcCBpbiBhY3RpdmVfY2hpbGRyZW4oKToKKyAgICAgICAgICAgIGlmIHAuX2RhZW1vbmljOgorICAgICAgICAgICAgICAgIGluZm8oJ2NhbGxpbmcgdGVybWluYXRlKCkgZm9yIGRhZW1vbiAlcycsIHAubmFtZSkKKyAgICAgICAgICAgICAgICBwLl9wb3Blbi50ZXJtaW5hdGUoKQorCisgICAgICAgIGZvciBwIGluIGFjdGl2ZV9jaGlsZHJlbigpOgorICAgICAgICAgICAgaW5mbygnY2FsbGluZyBqb2luKCkgZm9yIHByb2Nlc3MgJXMnLCBwLm5hbWUpCisgICAgICAgICAgICBwLmpvaW4oKQorCisgICAgZGVidWcoJ3J1bm5pbmcgdGhlIHJlbWFpbmluZyAiYXRleGl0IiBmaW5hbGl6ZXJzJykKKyAgICBfcnVuX2ZpbmFsaXplcnMoKQorCithdGV4aXQucmVnaXN0ZXIoX2V4aXRfZnVuY3Rpb24pCisKKyMKKyMgU29tZSBmb3JrIGF3YXJlIHR5cGVzCisjCisKK2NsYXNzIEZvcmtBd2FyZVRocmVhZExvY2sob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3Jlc2V0KCkKKyAgICAgICAgcmVnaXN0ZXJfYWZ0ZXJfZm9yayhzZWxmLCBGb3JrQXdhcmVUaHJlYWRMb2NrLl9yZXNldCkKKworICAgIGRlZiBfcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuYWNxdWlyZSA9IHNlbGYuX2xvY2suYWNxdWlyZQorICAgICAgICBzZWxmLnJlbGVhc2UgPSBzZWxmLl9sb2NrLnJlbGVhc2UKKworY2xhc3MgRm9ya0F3YXJlTG9jYWwodGhyZWFkaW5nLmxvY2FsKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHJlZ2lzdGVyX2FmdGVyX2Zvcmsoc2VsZiwgbGFtYmRhIG9iaiA6IG9iai5fX2RpY3RfXy5jbGVhcigpKQorICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gdHlwZShzZWxmKSwgKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvdXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5M2RiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy9tdWx0aXByb2Nlc3NpbmcvdXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxYmNmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXVsdGlwcm9jZXNzaW5nL3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXV0ZXgucHkgYi9saWIvcHl0aG9uMi43L211dGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YWNiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L211dGV4LnB5CkBAIC0wLDAgKzEsNTUgQEAKKyIiIk11dHVhbCBleGNsdXNpb24gLS0gZm9yIHVzZSB3aXRoIG1vZHVsZSBzY2hlZAorCitBIG11dGV4IGhhcyB0d28gcGllY2VzIG9mIHN0YXRlIC0tIGEgJ2xvY2tlZCcgYml0IGFuZCBhIHF1ZXVlLgorV2hlbiB0aGUgbXV0ZXggaXMgbm90IGxvY2tlZCwgdGhlIHF1ZXVlIGlzIGVtcHR5LgorT3RoZXJ3aXNlLCB0aGUgcXVldWUgY29udGFpbnMgMCBvciBtb3JlIChmdW5jdGlvbiwgYXJndW1lbnQpIHBhaXJzCityZXByZXNlbnRpbmcgZnVuY3Rpb25zIChvciBtZXRob2RzKSB3YWl0aW5nIHRvIGFjcXVpcmUgdGhlIGxvY2suCitXaGVuIHRoZSBtdXRleCBpcyB1bmxvY2tlZCB3aGlsZSB0aGUgcXVldWUgaXMgbm90IGVtcHR5LAordGhlIGZpcnN0IHF1ZXVlIGVudHJ5IGlzIHJlbW92ZWQgYW5kIGl0cyBmdW5jdGlvbihhcmd1bWVudCkgcGFpciBjYWxsZWQsCitpbXBseWluZyBpdCBub3cgaGFzIHRoZSBsb2NrLgorCitPZiBjb3Vyc2UsIG5vIG11bHRpLXRocmVhZGluZyBpcyBpbXBsaWVkIC0tIGhlbmNlIHRoZSBmdW5ueSBpbnRlcmZhY2UKK2ZvciBsb2NrLCB3aGVyZSBhIGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIHRoZSBsb2NrIGlzIGFxdWlyZWQuCisiIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIG11dGV4IG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKKworY2xhc3MgbXV0ZXg6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYSBuZXcgbXV0ZXggLS0gaW5pdGlhbGx5IHVubG9ja2VkLiIiIgorICAgICAgICBzZWxmLmxvY2tlZCA9IEZhbHNlCisgICAgICAgIHNlbGYucXVldWUgPSBkZXF1ZSgpCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGUgbG9ja2VkIGJpdCBvZiB0aGUgbXV0ZXguIiIiCisgICAgICAgIHJldHVybiBzZWxmLmxvY2tlZAorCisgICAgZGVmIHRlc3RhbmRzZXQoc2VsZik6CisgICAgICAgICIiIkF0b21pYyB0ZXN0LWFuZC1zZXQgLS0gZ3JhYiB0aGUgbG9jayBpZiBpdCBpcyBub3Qgc2V0LAorICAgICAgICByZXR1cm4gVHJ1ZSBpZiBpdCBzdWNjZWVkZWQuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLmxvY2tlZDoKKyAgICAgICAgICAgIHNlbGYubG9ja2VkID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGxvY2soc2VsZiwgZnVuY3Rpb24sIGFyZ3VtZW50KToKKyAgICAgICAgIiIiTG9jayBhIG11dGV4LCBjYWxsIHRoZSBmdW5jdGlvbiB3aXRoIHN1cHBsaWVkIGFyZ3VtZW50CisgICAgICAgIHdoZW4gaXQgaXMgYWNxdWlyZWQuICBJZiB0aGUgbXV0ZXggaXMgYWxyZWFkeSBsb2NrZWQsIHBsYWNlCisgICAgICAgIGZ1bmN0aW9uIGFuZCBhcmd1bWVudCBpbiB0aGUgcXVldWUuIiIiCisgICAgICAgIGlmIHNlbGYudGVzdGFuZHNldCgpOgorICAgICAgICAgICAgZnVuY3Rpb24oYXJndW1lbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnF1ZXVlLmFwcGVuZCgoZnVuY3Rpb24sIGFyZ3VtZW50KSkKKworICAgIGRlZiB1bmxvY2soc2VsZik6CisgICAgICAgICIiIlVubG9jayBhIG11dGV4LiAgSWYgdGhlIHF1ZXVlIGlzIG5vdCBlbXB0eSwgY2FsbCB0aGUgbmV4dAorICAgICAgICBmdW5jdGlvbiB3aXRoIGl0cyBhcmd1bWVudC4iIiIKKyAgICAgICAgaWYgc2VsZi5xdWV1ZToKKyAgICAgICAgICAgIGZ1bmN0aW9uLCBhcmd1bWVudCA9IHNlbGYucXVldWUucG9wbGVmdCgpCisgICAgICAgICAgICBmdW5jdGlvbihhcmd1bWVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubG9ja2VkID0gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXV0ZXgucHljIGIvbGliL3B5dGhvbjIuNy9tdXRleC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhMDg2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXV0ZXgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbXV0ZXgucHlvIGIvbGliL3B5dGhvbjIuNy9tdXRleC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNhMDg2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbXV0ZXgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbmV0cmMucHkgYi9saWIvcHl0aG9uMi43L25ldHJjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZDM3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25ldHJjLnB5CkBAIC0wLDAgKzEsMTIyIEBACisiIiJBbiBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlIHRvIC5uZXRyYyBmaWxlcy4iIiIKKworIyBNb2R1bGUgYW5kIGRvY3VtZW50YXRpb24gYnkgRXJpYyBTLiBSYXltb25kLCAyMSBEZWMgMTk5OAorCitpbXBvcnQgb3MsIHNobGV4CisKK19fYWxsX18gPSBbIm5ldHJjIiwgIk5ldHJjUGFyc2VFcnJvciJdCisKKworY2xhc3MgTmV0cmNQYXJzZUVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCBvbiBzeW50YXggZXJyb3JzIGluIHRoZSAubmV0cmMgZmlsZS4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbXNnLCBmaWxlbmFtZT1Ob25lLCBsaW5lbm89Tm9uZSk6CisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmxpbmVubyA9IGxpbmVubworICAgICAgICBzZWxmLm1zZyA9IG1zZworICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXMgKCVzLCBsaW5lICVzKSIgJSAoc2VsZi5tc2csIHNlbGYuZmlsZW5hbWUsIHNlbGYubGluZW5vKQorCisKK2NsYXNzIG5ldHJjOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlPU5vbmUpOgorICAgICAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWydIT01FJ10sICIubmV0cmMiKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNvdWxkIG5vdCBmaW5kIC5uZXRyYzogJEhPTUUgaXMgbm90IHNldCIpCisgICAgICAgIHNlbGYuaG9zdHMgPSB7fQorICAgICAgICBzZWxmLm1hY3JvcyA9IHt9CisgICAgICAgIHdpdGggb3BlbihmaWxlKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlKGZpbGUsIGZwKQorCisgICAgZGVmIF9wYXJzZShzZWxmLCBmaWxlLCBmcCk6CisgICAgICAgIGxleGVyID0gc2hsZXguc2hsZXgoZnApCisgICAgICAgIGxleGVyLndvcmRjaGFycyArPSByIiIiISIjJCUmJygpKissLS4vOjs8PT4/QFtcXV5fYHt8fX4iIiIKKyAgICAgICAgbGV4ZXIuY29tbWVudGVycyA9IGxleGVyLmNvbW1lbnRlcnMucmVwbGFjZSgnIycsICcnKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBMb29rIGZvciBhIG1hY2hpbmUsIGRlZmF1bHQsIG9yIG1hY2RlZiB0b3AtbGV2ZWwga2V5d29yZAorICAgICAgICAgICAgdG9wbGV2ZWwgPSB0dCA9IGxleGVyLmdldF90b2tlbigpCisgICAgICAgICAgICBpZiBub3QgdHQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgdHRbMF0gPT0gJyMnOgorICAgICAgICAgICAgICAgICMgc2VlayB0byBiZWdpbm5pbmcgb2YgY29tbWVudCwgaW4gY2FzZSByZWFkaW5nIHRoZSB0b2tlbiBwdXQKKyAgICAgICAgICAgICAgICAjIHVzIG9uIGEgbmV3IGxpbmUsIGFuZCB0aGVuIHNraXAgdGhlIHJlc3Qgb2YgdGhlIGxpbmUuCisgICAgICAgICAgICAgICAgcG9zID0gbGVuKHR0KSArIDEKKyAgICAgICAgICAgICAgICBsZXhlci5pbnN0cmVhbS5zZWVrKC1wb3MsIDEpCisgICAgICAgICAgICAgICAgbGV4ZXIuaW5zdHJlYW0ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHR0ID09ICdtYWNoaW5lJzoKKyAgICAgICAgICAgICAgICBlbnRyeW5hbWUgPSBsZXhlci5nZXRfdG9rZW4oKQorICAgICAgICAgICAgZWxpZiB0dCA9PSAnZGVmYXVsdCc6CisgICAgICAgICAgICAgICAgZW50cnluYW1lID0gJ2RlZmF1bHQnCisgICAgICAgICAgICBlbGlmIHR0ID09ICdtYWNkZWYnOiAgICAgICAgICAgICAgICAjIEp1c3Qgc2tpcCB0byBlbmQgb2YgbWFjZGVmcworICAgICAgICAgICAgICAgIGVudHJ5bmFtZSA9IGxleGVyLmdldF90b2tlbigpCisgICAgICAgICAgICAgICAgc2VsZi5tYWNyb3NbZW50cnluYW1lXSA9IFtdCisgICAgICAgICAgICAgICAgbGV4ZXIud2hpdGVzcGFjZSA9ICcgXHQnCisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxleGVyLmluc3RyZWFtLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbmUgb3IgbGluZSA9PSAnXDAxMic6CisgICAgICAgICAgICAgICAgICAgICAgICBsZXhlci53aGl0ZXNwYWNlID0gJyBcdFxyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBzZWxmLm1hY3Jvc1tlbnRyeW5hbWVdLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIE5ldHJjUGFyc2VFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImJhZCB0b3BsZXZlbCB0b2tlbiAlciIgJSB0dCwgZmlsZSwgbGV4ZXIubGluZW5vKQorCisgICAgICAgICAgICAjIFdlJ3JlIGxvb2tpbmcgYXQgc3RhcnQgb2YgYW4gZW50cnkgZm9yIGEgbmFtZWQgbWFjaGluZSBvciBkZWZhdWx0LgorICAgICAgICAgICAgbG9naW4gPSAnJworICAgICAgICAgICAgYWNjb3VudCA9IHBhc3N3b3JkID0gTm9uZQorICAgICAgICAgICAgc2VsZi5ob3N0c1tlbnRyeW5hbWVdID0ge30KKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHQgPSBsZXhlci5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgIGlmICh0dC5zdGFydHN3aXRoKCcjJykgb3IKKyAgICAgICAgICAgICAgICAgICAgdHQgaW4geycnLCAnbWFjaGluZScsICdkZWZhdWx0JywgJ21hY2RlZid9KToKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhvc3RzW2VudHJ5bmFtZV0gPSAobG9naW4sIGFjY291bnQsIHBhc3N3b3JkKQorICAgICAgICAgICAgICAgICAgICAgICAgbGV4ZXIucHVzaF90b2tlbih0dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBOZXRyY1BhcnNlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hbGZvcm1lZCAlcyBlbnRyeSAlcyB0ZXJtaW5hdGVkIGJ5ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHRvcGxldmVsLCBlbnRyeW5hbWUsIHJlcHIodHQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBsZXhlci5saW5lbm8pCisgICAgICAgICAgICAgICAgZWxpZiB0dCA9PSAnbG9naW4nIG9yIHR0ID09ICd1c2VyJzoKKyAgICAgICAgICAgICAgICAgICAgbG9naW4gPSBsZXhlci5nZXRfdG9rZW4oKQorICAgICAgICAgICAgICAgIGVsaWYgdHQgPT0gJ2FjY291bnQnOgorICAgICAgICAgICAgICAgICAgICBhY2NvdW50ID0gbGV4ZXIuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBlbGlmIHR0ID09ICdwYXNzd29yZCc6CisgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkID0gbGV4ZXIuZ2V0X3Rva2VuKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBOZXRyY1BhcnNlRXJyb3IoImJhZCBmb2xsb3dlciB0b2tlbiAlciIgJSB0dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGxleGVyLmxpbmVubykKKworICAgIGRlZiBhdXRoZW50aWNhdG9ycyhzZWxmLCBob3N0KToKKyAgICAgICAgIiIiUmV0dXJuIGEgKHVzZXIsIGFjY291bnQsIHBhc3N3b3JkKSB0dXBsZSBmb3IgZ2l2ZW4gaG9zdC4iIiIKKyAgICAgICAgaWYgaG9zdCBpbiBzZWxmLmhvc3RzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaG9zdHNbaG9zdF0KKyAgICAgICAgZWxpZiAnZGVmYXVsdCcgaW4gc2VsZi5ob3N0czoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhvc3RzWydkZWZhdWx0J10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIkR1bXAgdGhlIGNsYXNzIGRhdGEgaW4gdGhlIGZvcm1hdCBvZiBhIC5uZXRyYyBmaWxlLiIiIgorICAgICAgICByZXAgPSAiIgorICAgICAgICBmb3IgaG9zdCBpbiBzZWxmLmhvc3RzLmtleXMoKToKKyAgICAgICAgICAgIGF0dHJzID0gc2VsZi5ob3N0c1tob3N0XQorICAgICAgICAgICAgcmVwID0gcmVwICsgIm1hY2hpbmUgIisgaG9zdCArICJcblx0bG9naW4gIiArIHJlcHIoYXR0cnNbMF0pICsgIlxuIgorICAgICAgICAgICAgaWYgYXR0cnNbMV06CisgICAgICAgICAgICAgICAgcmVwID0gcmVwICsgImFjY291bnQgIiArIHJlcHIoYXR0cnNbMV0pCisgICAgICAgICAgICByZXAgPSByZXAgKyAiXHRwYXNzd29yZCAiICsgcmVwcihhdHRyc1syXSkgKyAiXG4iCisgICAgICAgIGZvciBtYWNybyBpbiBzZWxmLm1hY3Jvcy5rZXlzKCk6CisgICAgICAgICAgICByZXAgPSByZXAgKyAibWFjZGVmICIgKyBtYWNybyArICJcbiIKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYubWFjcm9zW21hY3JvXToKKyAgICAgICAgICAgICAgICByZXAgPSByZXAgKyBsaW5lCisgICAgICAgICAgICByZXAgPSByZXAgKyAiXG4iCisgICAgICAgIHJldHVybiByZXAKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBwcmludCBuZXRyYygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L25ldHJjLnB5YyBiL2xpYi9weXRob24yLjcvbmV0cmMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2U5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25ldHJjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L25ldHJjLnB5byBiL2xpYi9weXRob24yLjcvbmV0cmMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhM2U5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25ldHJjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L25ldy5weSBiL2xpYi9weXRob24yLjcvbmV3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmU2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L25ldy5weQpAQCAtMCwwICsxLDE3IEBACisiIiJDcmVhdGUgbmV3IG9iamVjdHMgb2YgdmFyaW91cyB0eXBlcy4gIERlcHJlY2F0ZWQuCisKK1RoaXMgbW9kdWxlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBleGNlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitPYmplY3RzIG9mIG1vc3QgdHlwZXMgY2FuIG5vdyBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIHR5cGUgb2JqZWN0LgorIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soIlRoZSAnbmV3JyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wOyB1c2UgdGhlICd0eXBlcycgIgorICAgICAgICAgICAgIm1vZHVsZSBpbnN0ZWFkLiIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCitmcm9tIHR5cGVzIGltcG9ydCBDbGFzc1R5cGUgYXMgY2xhc3NvYmoKK2Zyb20gdHlwZXMgaW1wb3J0IEZ1bmN0aW9uVHlwZSBhcyBmdW5jdGlvbgorZnJvbSB0eXBlcyBpbXBvcnQgSW5zdGFuY2VUeXBlIGFzIGluc3RhbmNlCitmcm9tIHR5cGVzIGltcG9ydCBNZXRob2RUeXBlIGFzIGluc3RhbmNlbWV0aG9kCitmcm9tIHR5cGVzIGltcG9ydCBNb2R1bGVUeXBlIGFzIG1vZHVsZQorCitmcm9tIHR5cGVzIGltcG9ydCBDb2RlVHlwZSBhcyBjb2RlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L25ldy5weWMgYi9saWIvcHl0aG9uMi43L25ldy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyMDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbmV3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L25ldy5weW8gYi9saWIvcHl0aG9uMi43L25ldy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyMDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbmV3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L25udHBsaWIucHkgYi9saWIvcHl0aG9uMi43L25udHBsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjODJhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbm50cGxpYi5weQpAQCAtMCwwICsxLDYyNyBAQAorIiIiQW4gTk5UUCBjbGllbnQgY2xhc3MgYmFzZWQgb24gUkZDIDk3NzogTmV0d29yayBOZXdzIFRyYW5zZmVyIFByb3RvY29sLgorCitFeGFtcGxlOgorCis+Pj4gZnJvbSBubnRwbGliIGltcG9ydCBOTlRQCis+Pj4gcyA9IE5OVFAoJ25ld3MnKQorPj4+IHJlc3AsIGNvdW50LCBmaXJzdCwgbGFzdCwgbmFtZSA9IHMuZ3JvdXAoJ2NvbXAubGFuZy5weXRob24nKQorPj4+IHByaW50ICdHcm91cCcsIG5hbWUsICdoYXMnLCBjb3VudCwgJ2FydGljbGVzLCByYW5nZScsIGZpcnN0LCAndG8nLCBsYXN0CitHcm91cCBjb21wLmxhbmcucHl0aG9uIGhhcyA1MSBhcnRpY2xlcywgcmFuZ2UgNTc3MCB0byA1ODIxCis+Pj4gcmVzcCwgc3VicyA9IHMueGhkcignc3ViamVjdCcsIGZpcnN0ICsgJy0nICsgbGFzdCkKKz4+PiByZXNwID0gcy5xdWl0KCkKKz4+PgorCitIZXJlICdyZXNwJyBpcyB0aGUgc2VydmVyIHJlc3BvbnNlIGxpbmUuCitFcnJvciByZXNwb25zZXMgYXJlIHR1cm5lZCBpbnRvIGV4Y2VwdGlvbnMuCisKK1RvIHBvc3QgYW4gYXJ0aWNsZSBmcm9tIGEgZmlsZToKKz4+PiBmID0gb3BlbihmaWxlbmFtZSwgJ3InKSAjIGZpbGUgY29udGFpbmluZyBhcnRpY2xlLCBpbmNsdWRpbmcgaGVhZGVyCis+Pj4gcmVzcCA9IHMucG9zdChmKQorPj4+CisKK0ZvciBkZXNjcmlwdGlvbnMgb2YgYWxsIG1ldGhvZHMsIHJlYWQgdGhlIGNvbW1lbnRzIGluIHRoZSBjb2RlIGJlbG93LgorTm90ZSB0aGF0IGFsbCBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgcmVwcmVzZW50aW5nIGFydGljbGUgbnVtYmVycworYXJlIHN0cmluZ3MsIG5vdCBudW1iZXJzLCBzaW5jZSB0aGV5IGFyZSByYXJlbHkgdXNlZCBmb3IgY2FsY3VsYXRpb25zLgorIiIiCisKKyMgUkZDIDk3NyBieSBCcmlhbiBLYW50b3IgYW5kIFBoaWwgTGFwc2xleS4KKyMgeG92ZXIsIHhndGl0bGUsIHhwYXRoLCBkYXRlIG1ldGhvZHMgYnkgS2V2YW4gSGV5ZG9uCisKKworIyBJbXBvcnRzCitpbXBvcnQgcmUKK2ltcG9ydCBzb2NrZXQKKworX19hbGxfXyA9IFsiTk5UUCIsIk5OVFBSZXBseUVycm9yIiwiTk5UUFRlbXBvcmFyeUVycm9yIiwKKyAgICAgICAgICAgIk5OVFBQZXJtYW5lbnRFcnJvciIsIk5OVFBQcm90b2NvbEVycm9yIiwiTk5UUERhdGFFcnJvciIsCisgICAgICAgICAgICJlcnJvcl9yZXBseSIsImVycm9yX3RlbXAiLCJlcnJvcl9wZXJtIiwiZXJyb3JfcHJvdG8iLAorICAgICAgICAgICAiZXJyb3JfZGF0YSIsXQorCisjIEV4Y2VwdGlvbnMgcmFpc2VkIHdoZW4gYW4gZXJyb3Igb3IgaW52YWxpZCByZXNwb25zZSBpcyByZWNlaXZlZAorY2xhc3MgTk5UUEVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIG5udHBsaWIgZXhjZXB0aW9ucyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXNwb25zZSA9IGFyZ3NbMF0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlID0gJ05vIHJlc3BvbnNlIGdpdmVuJworCitjbGFzcyBOTlRQUmVwbHlFcnJvcihOTlRQRXJyb3IpOgorICAgICIiIlVuZXhwZWN0ZWQgWzEyM114eCByZXBseSIiIgorICAgIHBhc3MKKworY2xhc3MgTk5UUFRlbXBvcmFyeUVycm9yKE5OVFBFcnJvcik6CisgICAgIiIiNHh4IGVycm9ycyIiIgorICAgIHBhc3MKKworY2xhc3MgTk5UUFBlcm1hbmVudEVycm9yKE5OVFBFcnJvcik6CisgICAgIiIiNXh4IGVycm9ycyIiIgorICAgIHBhc3MKKworY2xhc3MgTk5UUFByb3RvY29sRXJyb3IoTk5UUEVycm9yKToKKyAgICAiIiJSZXNwb25zZSBkb2VzIG5vdCBiZWdpbiB3aXRoIFsxLTVdIiIiCisgICAgcGFzcworCitjbGFzcyBOTlRQRGF0YUVycm9yKE5OVFBFcnJvcik6CisgICAgIiIiRXJyb3IgaW4gcmVzcG9uc2UgZGF0YSIiIgorICAgIHBhc3MKKworIyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK2Vycm9yX3JlcGx5ID0gTk5UUFJlcGx5RXJyb3IKK2Vycm9yX3RlbXAgPSBOTlRQVGVtcG9yYXJ5RXJyb3IKK2Vycm9yX3Blcm0gPSBOTlRQUGVybWFuZW50RXJyb3IKK2Vycm9yX3Byb3RvID0gTk5UUFByb3RvY29sRXJyb3IKK2Vycm9yX2RhdGEgPSBOTlRQRGF0YUVycm9yCisKKworCisjIFN0YW5kYXJkIHBvcnQgdXNlZCBieSBOTlRQIHNlcnZlcnMKK05OVFBfUE9SVCA9IDExOQorCisKKyMgUmVzcG9uc2UgbnVtYmVycyB0aGF0IGFyZSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIHRleHQgKGUuZy4gYXJ0aWNsZSkKK0xPTkdSRVNQID0gWycxMDAnLCAnMjE1JywgJzIyMCcsICcyMjEnLCAnMjIyJywgJzIyNCcsICcyMzAnLCAnMjMxJywgJzI4MiddCisKKworIyBMaW5lIHRlcm1pbmF0b3JzICh3ZSBhbHdheXMgb3V0cHV0IENSTEYsIGJ1dCBhY2NlcHQgYW55IG9mIENSTEYsIENSLCBMRikKK0NSTEYgPSAnXHJcbicKKworCisKKyMgVGhlIGNsYXNzIGl0c2VsZgorY2xhc3MgTk5UUDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydD1OTlRQX1BPUlQsIHVzZXI9Tm9uZSwgcGFzc3dvcmQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgcmVhZGVybW9kZT1Ob25lLCB1c2VuZXRyYz1UcnVlKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZS4gIEFyZ3VtZW50czoKKyAgICAgICAgLSBob3N0OiBob3N0bmFtZSB0byBjb25uZWN0IHRvCisgICAgICAgIC0gcG9ydDogcG9ydCB0byBjb25uZWN0IHRvIChkZWZhdWx0IHRoZSBzdGFuZGFyZCBOTlRQIHBvcnQpCisgICAgICAgIC0gdXNlcjogdXNlcm5hbWUgdG8gYXV0aGVudGljYXRlIHdpdGgKKyAgICAgICAgLSBwYXNzd29yZDogcGFzc3dvcmQgdG8gdXNlIHdpdGggdXNlcm5hbWUKKyAgICAgICAgLSByZWFkZXJtb2RlOiBpZiB0cnVlLCBzZW5kICdtb2RlIHJlYWRlcicgY29tbWFuZCBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpbmcuCisKKyAgICAgICAgcmVhZGVybW9kZSBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IGlmIHlvdSBhcmUgY29ubmVjdGluZyB0byBhbgorICAgICAgICBOTlRQIHNlcnZlciBvbiB0aGUgbG9jYWwgbWFjaGluZSBhbmQgaW50ZW5kIHRvIGNhbGwKKyAgICAgICAgcmVhZGVyLXNwZWNpZmljIGNvbW1hbmRzLCBzdWNoIGFzIGBncm91cCcuICBJZiB5b3UgZ2V0CisgICAgICAgIHVuZXhwZWN0ZWQgTk5UUFBlcm1hbmVudEVycm9ycywgeW91IG1pZ2h0IG5lZWQgdG8gc2V0CisgICAgICAgIHJlYWRlcm1vZGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChob3N0LCBwb3J0KSkKKyAgICAgICAgc2VsZi5maWxlID0gc2VsZi5zb2NrLm1ha2VmaWxlKCdyYicpCisgICAgICAgIHNlbGYuZGVidWdnaW5nID0gMAorICAgICAgICBzZWxmLndlbGNvbWUgPSBzZWxmLmdldHJlc3AoKQorCisgICAgICAgICMgJ21vZGUgcmVhZGVyJyBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHRvIGVuYWJsZSAncmVhZGVyJyBtb2RlLgorICAgICAgICAjIEhvd2V2ZXIsIHRoZSBvcmRlciBpbiB3aGljaCAnbW9kZSByZWFkZXInIGFuZCAnYXV0aGluZm8nIG5lZWQgdG8KKyAgICAgICAgIyBhcnJpdmUgZGlmZmVycyBiZXR3ZWVuIHNvbWUgTk5UUCBzZXJ2ZXJzLiBUcnkgdG8gc2VuZAorICAgICAgICAjICdtb2RlIHJlYWRlcicsIGFuZCBpZiBpdCBmYWlscyB3aXRoIGFuIGF1dGhvcml6YXRpb24gZmFpbGVkCisgICAgICAgICMgZXJyb3IsIHRyeSBhZ2FpbiBhZnRlciBzZW5kaW5nIGF1dGhpbmZvLgorICAgICAgICByZWFkZXJtb2RlX2FmdGVyYXV0aCA9IDAKKyAgICAgICAgaWYgcmVhZGVybW9kZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLndlbGNvbWUgPSBzZWxmLnNob3J0Y21kKCdtb2RlIHJlYWRlcicpCisgICAgICAgICAgICBleGNlcHQgTk5UUFBlcm1hbmVudEVycm9yOgorICAgICAgICAgICAgICAgICMgZXJyb3IgNTAwLCBwcm9iYWJseSAnbm90IGltcGxlbWVudGVkJworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBOTlRQVGVtcG9yYXJ5RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgdXNlciBhbmQgZS5yZXNwb25zZVs6M10gPT0gJzQ4MCc6CisgICAgICAgICAgICAgICAgICAgICMgTmVlZCBhdXRob3JpemF0aW9uIGJlZm9yZSAnbW9kZSByZWFkZXInCisgICAgICAgICAgICAgICAgICAgIHJlYWRlcm1vZGVfYWZ0ZXJhdXRoID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICMgSWYgbm8gbG9naW4vcGFzc3dvcmQgd2FzIHNwZWNpZmllZCwgdHJ5IHRvIGdldCB0aGVtIGZyb20gfi8ubmV0cmMKKyAgICAgICAgIyBQcmVzdW1lIHRoYXQgaWYgLm5ldGMgaGFzIGFuIGVudHJ5LCBOTlJQIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB1c2VuZXRyYyBhbmQgbm90IHVzZXI6CisgICAgICAgICAgICAgICAgaW1wb3J0IG5ldHJjCisgICAgICAgICAgICAgICAgY3JlZGVudGlhbHMgPSBuZXRyYy5uZXRyYygpCisgICAgICAgICAgICAgICAgYXV0aCA9IGNyZWRlbnRpYWxzLmF1dGhlbnRpY2F0b3JzKGhvc3QpCisgICAgICAgICAgICAgICAgaWYgYXV0aDoKKyAgICAgICAgICAgICAgICAgICAgdXNlciA9IGF1dGhbMF0KKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBhdXRoWzJdCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFBlcmZvcm0gTk5SUCBhdXRoZW50aWNhdGlvbiBpZiBuZWVkZWQuCisgICAgICAgIGlmIHVzZXI6CisgICAgICAgICAgICByZXNwID0gc2VsZi5zaG9ydGNtZCgnYXV0aGluZm8gdXNlciAnK3VzZXIpCisgICAgICAgICAgICBpZiByZXNwWzozXSA9PSAnMzgxJzoKKyAgICAgICAgICAgICAgICBpZiBub3QgcGFzc3dvcmQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVzcCA9IHNlbGYuc2hvcnRjbWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2F1dGhpbmZvIHBhc3MgJytwYXNzd29yZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzcFs6M10gIT0gJzI4MSc6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBOTlRQUGVybWFuZW50RXJyb3IocmVzcCkKKyAgICAgICAgICAgIGlmIHJlYWRlcm1vZGVfYWZ0ZXJhdXRoOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53ZWxjb21lID0gc2VsZi5zaG9ydGNtZCgnbW9kZSByZWFkZXInKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBOTlRQUGVybWFuZW50RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgZXJyb3IgNTAwLCBwcm9iYWJseSAnbm90IGltcGxlbWVudGVkJworICAgICAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICMgR2V0IHRoZSB3ZWxjb21lIG1lc3NhZ2UgZnJvbSB0aGUgc2VydmVyCisgICAgIyAodGhpcyBpcyByZWFkIGFuZCBzcXVpcnJlbGVkIGF3YXkgYnkgX19pbml0X18oKSkuCisgICAgIyBJZiB0aGUgcmVzcG9uc2UgY29kZSBpcyAyMDAsIHBvc3RpbmcgaXMgYWxsb3dlZDsKKyAgICAjIGlmIGl0IDIwMSwgcG9zdGluZyBpcyBub3QgYWxsb3dlZAorCisgICAgZGVmIGdldHdlbGNvbWUoc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgd2VsY29tZSBtZXNzYWdlIGZyb20gdGhlIHNlcnZlcgorICAgICAgICAodGhpcyBpcyByZWFkIGFuZCBzcXVpcnJlbGVkIGF3YXkgYnkgX19pbml0X18oKSkuCisgICAgICAgIElmIHRoZSByZXNwb25zZSBjb2RlIGlzIDIwMCwgcG9zdGluZyBpcyBhbGxvd2VkOworICAgICAgICBpZiBpdCAyMDEsIHBvc3RpbmcgaXMgbm90IGFsbG93ZWQuIiIiCisKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6IHByaW50ICcqd2VsY29tZSonLCByZXByKHNlbGYud2VsY29tZSkKKyAgICAgICAgcmV0dXJuIHNlbGYud2VsY29tZQorCisgICAgZGVmIHNldF9kZWJ1Z2xldmVsKHNlbGYsIGxldmVsKToKKyAgICAgICAgIiIiU2V0IHRoZSBkZWJ1Z2dpbmcgbGV2ZWwuICBBcmd1bWVudCAnbGV2ZWwnIG1lYW5zOgorICAgICAgICAwOiBubyBkZWJ1Z2dpbmcgb3V0cHV0IChkZWZhdWx0KQorICAgICAgICAxOiBwcmludCBjb21tYW5kcyBhbmQgcmVzcG9uc2VzIGJ1dCBub3QgYm9keSB0ZXh0IGV0Yy4KKyAgICAgICAgMjogYWxzbyBwcmludCByYXcgbGluZXMgcmVhZCBhbmQgc2VudCBiZWZvcmUgc3RyaXBwaW5nIENSL0xGIiIiCisKKyAgICAgICAgc2VsZi5kZWJ1Z2dpbmcgPSBsZXZlbAorICAgIGRlYnVnID0gc2V0X2RlYnVnbGV2ZWwKKworICAgIGRlZiBwdXRsaW5lKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJJbnRlcm5hbDogc2VuZCBvbmUgbGluZSB0byB0aGUgc2VydmVyLCBhcHBlbmRpbmcgQ1JMRi4iIiIKKyAgICAgICAgbGluZSA9IGxpbmUgKyBDUkxGCisgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nID4gMTogcHJpbnQgJypwdXQqJywgcmVwcihsaW5lKQorICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChsaW5lKQorCisgICAgZGVmIHB1dGNtZChzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHNlbmQgb25lIGNvbW1hbmQgdG8gdGhlIHNlcnZlciAodGhyb3VnaCBwdXRsaW5lKCkpLiIiIgorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZzogcHJpbnQgJypjbWQqJywgcmVwcihsaW5lKQorICAgICAgICBzZWxmLnB1dGxpbmUobGluZSkKKworICAgIGRlZiBnZXRsaW5lKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbDogcmV0dXJuIG9uZSBsaW5lIGZyb20gdGhlIHNlcnZlciwgc3RyaXBwaW5nIENSTEYuCisgICAgICAgIFJhaXNlIEVPRkVycm9yIGlmIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4iIiIKKyAgICAgICAgbGluZSA9IHNlbGYuZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIHNlbGYuZGVidWdnaW5nID4gMToKKyAgICAgICAgICAgIHByaW50ICcqZ2V0KicsIHJlcHIobGluZSkKKyAgICAgICAgaWYgbm90IGxpbmU6IHJhaXNlIEVPRkVycm9yCisgICAgICAgIGlmIGxpbmVbLTI6XSA9PSBDUkxGOiBsaW5lID0gbGluZVs6LTJdCisgICAgICAgIGVsaWYgbGluZVstMTpdIGluIENSTEY6IGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiBnZXRyZXNwKHNlbGYpOgorICAgICAgICAiIiJJbnRlcm5hbDogZ2V0IGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLgorICAgICAgICBSYWlzZSB2YXJpb3VzIGVycm9ycyBpZiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIGFuIGVycm9yLiIiIgorICAgICAgICByZXNwID0gc2VsZi5nZXRsaW5lKCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2dpbmc6IHByaW50ICcqcmVzcConLCByZXByKHJlc3ApCisgICAgICAgIGMgPSByZXNwWzoxXQorICAgICAgICBpZiBjID09ICc0JzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBUZW1wb3JhcnlFcnJvcihyZXNwKQorICAgICAgICBpZiBjID09ICc1JzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBQZXJtYW5lbnRFcnJvcihyZXNwKQorICAgICAgICBpZiBjIG5vdCBpbiAnMTIzJzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBQcm90b2NvbEVycm9yKHJlc3ApCisgICAgICAgIHJldHVybiByZXNwCisKKyAgICBkZWYgZ2V0bG9uZ3Jlc3Aoc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IGdldCBhIHJlc3BvbnNlIHBsdXMgZm9sbG93aW5nIHRleHQgZnJvbSB0aGUgc2VydmVyLgorICAgICAgICBSYWlzZSB2YXJpb3VzIGVycm9ycyBpZiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIGFuIGVycm9yLiIiIgorCisgICAgICAgIG9wZW5lZEZpbGUgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgSWYgYSBzdHJpbmcgd2FzIHBhc3NlZCB0aGVuIG9wZW4gYSBmaWxlIHdpdGggdGhhdCBuYW1lCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGZpbGUsIHN0cik6CisgICAgICAgICAgICAgICAgb3BlbmVkRmlsZSA9IGZpbGUgPSBvcGVuKGZpbGUsICJ3IikKKworICAgICAgICAgICAgcmVzcCA9IHNlbGYuZ2V0cmVzcCgpCisgICAgICAgICAgICBpZiByZXNwWzozXSBub3QgaW4gTE9OR1JFU1A6CisgICAgICAgICAgICAgICAgcmFpc2UgTk5UUFJlcGx5RXJyb3IocmVzcCkKKyAgICAgICAgICAgIGxpc3QgPSBbXQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5nZXRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBsaW5lID09ICcuJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBsaW5lWzoyXSA9PSAnLi4nOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsxOl0KKyAgICAgICAgICAgICAgICBpZiBmaWxlOgorICAgICAgICAgICAgICAgICAgICBmaWxlLndyaXRlKGxpbmUgKyAiXG4iKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKGxpbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIElmIHRoaXMgbWV0aG9kIGNyZWF0ZWQgdGhlIGZpbGUsIHRoZW4gaXQgbXVzdCBjbG9zZSBpdAorICAgICAgICAgICAgaWYgb3BlbmVkRmlsZToKKyAgICAgICAgICAgICAgICBvcGVuZWRGaWxlLmNsb3NlKCkKKworICAgICAgICByZXR1cm4gcmVzcCwgbGlzdAorCisgICAgZGVmIHNob3J0Y21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJJbnRlcm5hbDogc2VuZCBhIGNvbW1hbmQgYW5kIGdldCB0aGUgcmVzcG9uc2UuIiIiCisgICAgICAgIHNlbGYucHV0Y21kKGxpbmUpCisgICAgICAgIHJldHVybiBzZWxmLmdldHJlc3AoKQorCisgICAgZGVmIGxvbmdjbWQoc2VsZiwgbGluZSwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHNlbmQgYSBjb21tYW5kIGFuZCBnZXQgdGhlIHJlc3BvbnNlIHBsdXMgZm9sbG93aW5nIHRleHQuIiIiCisgICAgICAgIHNlbGYucHV0Y21kKGxpbmUpCisgICAgICAgIHJldHVybiBzZWxmLmdldGxvbmdyZXNwKGZpbGUpCisKKyAgICBkZWYgbmV3Z3JvdXBzKHNlbGYsIGRhdGUsIHRpbWUsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBORVdHUk9VUFMgY29tbWFuZC4gIEFyZ3VtZW50czoKKyAgICAgICAgLSBkYXRlOiBzdHJpbmcgJ3l5bW1kZCcgaW5kaWNhdGluZyB0aGUgZGF0ZQorICAgICAgICAtIHRpbWU6IHN0cmluZyAnaGhtbXNzJyBpbmRpY2F0aW5nIHRoZSB0aW1lCisgICAgICAgIFJldHVybjoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAtIGxpc3Q6IGxpc3Qgb2YgbmV3c2dyb3VwIG5hbWVzIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYubG9uZ2NtZCgnTkVXR1JPVVBTICcgKyBkYXRlICsgJyAnICsgdGltZSwgZmlsZSkKKworICAgIGRlZiBuZXduZXdzKHNlbGYsIGdyb3VwLCBkYXRlLCB0aW1lLCBmaWxlPU5vbmUpOgorICAgICAgICAiIiJQcm9jZXNzIGEgTkVXTkVXUyBjb21tYW5kLiAgQXJndW1lbnRzOgorICAgICAgICAtIGdyb3VwOiBncm91cCBuYW1lIG9yICcqJworICAgICAgICAtIGRhdGU6IHN0cmluZyAneXltbWRkJyBpbmRpY2F0aW5nIHRoZSBkYXRlCisgICAgICAgIC0gdGltZTogc3RyaW5nICdoaG1tc3MnIGluZGljYXRpbmcgdGhlIHRpbWUKKyAgICAgICAgUmV0dXJuOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbGlzdDogbGlzdCBvZiBtZXNzYWdlIGlkcyIiIgorCisgICAgICAgIGNtZCA9ICdORVdORVdTICcgKyBncm91cCArICcgJyArIGRhdGUgKyAnICcgKyB0aW1lCisgICAgICAgIHJldHVybiBzZWxmLmxvbmdjbWQoY21kLCBmaWxlKQorCisgICAgZGVmIGxpc3Qoc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIExJU1QgY29tbWFuZC4gIFJldHVybjoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAtIGxpc3Q6IGxpc3Qgb2YgKGdyb3VwLCBsYXN0LCBmaXJzdCwgZmxhZykgKHN0cmluZ3MpIiIiCisKKyAgICAgICAgcmVzcCwgbGlzdCA9IHNlbGYubG9uZ2NtZCgnTElTVCcsIGZpbGUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihsaXN0KSk6CisgICAgICAgICAgICAjIFBhcnNlIGxpbmVzIGludG8gImdyb3VwIGxhc3QgZmlyc3QgZmxhZyIKKyAgICAgICAgICAgIGxpc3RbaV0gPSB0dXBsZShsaXN0W2ldLnNwbGl0KCkpCisgICAgICAgIHJldHVybiByZXNwLCBsaXN0CisKKyAgICBkZWYgZGVzY3JpcHRpb24oc2VsZiwgZ3JvdXApOgorCisgICAgICAgICIiIkdldCBhIGRlc2NyaXB0aW9uIGZvciBhIHNpbmdsZSBncm91cC4gIElmIG1vcmUgdGhhbiBvbmUKKyAgICAgICAgZ3JvdXAgbWF0Y2hlcyAoJ2dyb3VwJyBpcyBhIHBhdHRlcm4pLCByZXR1cm4gdGhlIGZpcnN0LiAgSWYgbm8KKyAgICAgICAgZ3JvdXAgbWF0Y2hlcywgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KKworICAgICAgICBUaGlzIGVsaWRlcyB0aGUgcmVzcG9uc2UgY29kZSBmcm9tIHRoZSBzZXJ2ZXIsIHNpbmNlIGl0IGNhbgorICAgICAgICBvbmx5IGJlICcyMTUnIG9yICcyODUnIChmb3IgeGd0aXRsZSkgYW55d2F5LiAgSWYgdGhlIHJlc3BvbnNlCisgICAgICAgIGNvZGUgaXMgbmVlZGVkLCB1c2UgdGhlICdkZXNjcmlwdGlvbnMnIG1ldGhvZC4KKworICAgICAgICBOT1RFOiBUaGlzIG5laXRoZXIgY2hlY2tzIGZvciBhIHdpbGRjYXJkIGluICdncm91cCcgbm9yIGRvZXMKKyAgICAgICAgaXQgY2hlY2sgd2hldGhlciB0aGUgZ3JvdXAgYWN0dWFsbHkgZXhpc3RzLiIiIgorCisgICAgICAgIHJlc3AsIGxpbmVzID0gc2VsZi5kZXNjcmlwdGlvbnMoZ3JvdXApCisgICAgICAgIGlmIGxlbihsaW5lcykgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGxpbmVzWzBdWzFdCisKKyAgICBkZWYgZGVzY3JpcHRpb25zKHNlbGYsIGdyb3VwX3BhdHRlcm4pOgorICAgICAgICAiIiJHZXQgZGVzY3JpcHRpb25zIGZvciBhIHJhbmdlIG9mIGdyb3Vwcy4iIiIKKyAgICAgICAgbGluZV9wYXQgPSByZS5jb21waWxlKCJeKD9QPGdyb3VwPlteIFx0XSspWyBcdF0rKC4qKSQiKQorICAgICAgICAjIFRyeSB0aGUgbW9yZSBzdGQgKGFjYy4gdG8gUkZDMjk4MCkgTElTVCBORVdTR1JPVVBTIGZpcnN0CisgICAgICAgIHJlc3AsIHJhd19saW5lcyA9IHNlbGYubG9uZ2NtZCgnTElTVCBORVdTR1JPVVBTICcgKyBncm91cF9wYXR0ZXJuKQorICAgICAgICBpZiByZXNwWzozXSAhPSAiMjE1IjoKKyAgICAgICAgICAgICMgTm93IHRoZSBkZXByZWNhdGVkIFhHVElUTEUuICBUaGlzIGVpdGhlciByYWlzZXMgYW4gZXJyb3IKKyAgICAgICAgICAgICMgb3Igc3VjY2VlZHMgd2l0aCB0aGUgc2FtZSBvdXRwdXQgc3RydWN0dXJlIGFzIExJU1QKKyAgICAgICAgICAgICMgTkVXU0dST1VQUy4KKyAgICAgICAgICAgIHJlc3AsIHJhd19saW5lcyA9IHNlbGYubG9uZ2NtZCgnWEdUSVRMRSAnICsgZ3JvdXBfcGF0dGVybikKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgcmF3X2xpbmUgaW4gcmF3X2xpbmVzOgorICAgICAgICAgICAgbWF0Y2ggPSBsaW5lX3BhdC5zZWFyY2gocmF3X2xpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChtYXRjaC5ncm91cCgxLCAyKSkKKyAgICAgICAgcmV0dXJuIHJlc3AsIGxpbmVzCisKKyAgICBkZWYgZ3JvdXAoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBHUk9VUCBjb21tYW5kLiAgQXJndW1lbnQ6CisgICAgICAgIC0gZ3JvdXA6IHRoZSBncm91cCBuYW1lCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBjb3VudDogbnVtYmVyIG9mIGFydGljbGVzIChzdHJpbmcpCisgICAgICAgIC0gZmlyc3Q6IGZpcnN0IGFydGljbGUgbnVtYmVyIChzdHJpbmcpCisgICAgICAgIC0gbGFzdDogbGFzdCBhcnRpY2xlIG51bWJlciAoc3RyaW5nKQorICAgICAgICAtIG5hbWU6IHRoZSBncm91cCBuYW1lIiIiCisKKyAgICAgICAgcmVzcCA9IHNlbGYuc2hvcnRjbWQoJ0dST1VQICcgKyBuYW1lKQorICAgICAgICBpZiByZXNwWzozXSAhPSAnMjExJzoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgIHdvcmRzID0gcmVzcC5zcGxpdCgpCisgICAgICAgIGNvdW50ID0gZmlyc3QgPSBsYXN0ID0gMAorICAgICAgICBuID0gbGVuKHdvcmRzKQorICAgICAgICBpZiBuID4gMToKKyAgICAgICAgICAgIGNvdW50ID0gd29yZHNbMV0KKyAgICAgICAgICAgIGlmIG4gPiAyOgorICAgICAgICAgICAgICAgIGZpcnN0ID0gd29yZHNbMl0KKyAgICAgICAgICAgICAgICBpZiBuID4gMzoKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHdvcmRzWzNdCisgICAgICAgICAgICAgICAgICAgIGlmIG4gPiA0OgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHdvcmRzWzRdLmxvd2VyKCkKKyAgICAgICAgcmV0dXJuIHJlc3AsIGNvdW50LCBmaXJzdCwgbGFzdCwgbmFtZQorCisgICAgZGVmIGhlbHAoc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIEhFTFAgY29tbWFuZC4gIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBsaXN0OiBsaXN0IG9mIHN0cmluZ3MiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5sb25nY21kKCdIRUxQJyxmaWxlKQorCisgICAgZGVmIHN0YXRwYXJzZShzZWxmLCByZXNwKToKKyAgICAgICAgIiIiSW50ZXJuYWw6IHBhcnNlIHRoZSByZXNwb25zZSBvZiBhIFNUQVQsIE5FWFQgb3IgTEFTVCBjb21tYW5kLiIiIgorICAgICAgICBpZiByZXNwWzoyXSAhPSAnMjInOgorICAgICAgICAgICAgcmFpc2UgTk5UUFJlcGx5RXJyb3IocmVzcCkKKyAgICAgICAgd29yZHMgPSByZXNwLnNwbGl0KCkKKyAgICAgICAgbnIgPSAwCisgICAgICAgIGlkID0gJycKKyAgICAgICAgbiA9IGxlbih3b3JkcykKKyAgICAgICAgaWYgbiA+IDE6CisgICAgICAgICAgICBuciA9IHdvcmRzWzFdCisgICAgICAgICAgICBpZiBuID4gMjoKKyAgICAgICAgICAgICAgICBpZCA9IHdvcmRzWzJdCisgICAgICAgIHJldHVybiByZXNwLCBuciwgaWQKKworICAgIGRlZiBzdGF0Y21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJJbnRlcm5hbDogcHJvY2VzcyBhIFNUQVQsIE5FWFQgb3IgTEFTVCBjb21tYW5kLiIiIgorICAgICAgICByZXNwID0gc2VsZi5zaG9ydGNtZChsaW5lKQorICAgICAgICByZXR1cm4gc2VsZi5zdGF0cGFyc2UocmVzcCkKKworICAgIGRlZiBzdGF0KHNlbGYsIGlkKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIFNUQVQgY29tbWFuZC4gIEFyZ3VtZW50OgorICAgICAgICAtIGlkOiBhcnRpY2xlIG51bWJlciBvciBtZXNzYWdlIGlkCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBucjogICB0aGUgYXJ0aWNsZSBudW1iZXIKKyAgICAgICAgLSBpZDogICB0aGUgbWVzc2FnZSBpZCIiIgorCisgICAgICAgIHJldHVybiBzZWxmLnN0YXRjbWQoJ1NUQVQgJyArIGlkKQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICIiIlByb2Nlc3MgYSBORVhUIGNvbW1hbmQuICBObyBhcmd1bWVudHMuICBSZXR1cm4gYXMgZm9yIFNUQVQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnN0YXRjbWQoJ05FWFQnKQorCisgICAgZGVmIGxhc3Qoc2VsZik6CisgICAgICAgICIiIlByb2Nlc3MgYSBMQVNUIGNvbW1hbmQuICBObyBhcmd1bWVudHMuICBSZXR1cm4gYXMgZm9yIFNUQVQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnN0YXRjbWQoJ0xBU1QnKQorCisgICAgZGVmIGFydGNtZChzZWxmLCBsaW5lLCBmaWxlPU5vbmUpOgorICAgICAgICAiIiJJbnRlcm5hbDogcHJvY2VzcyBhIEhFQUQsIEJPRFkgb3IgQVJUSUNMRSBjb21tYW5kLiIiIgorICAgICAgICByZXNwLCBsaXN0ID0gc2VsZi5sb25nY21kKGxpbmUsIGZpbGUpCisgICAgICAgIHJlc3AsIG5yLCBpZCA9IHNlbGYuc3RhdHBhcnNlKHJlc3ApCisgICAgICAgIHJldHVybiByZXNwLCBuciwgaWQsIGxpc3QKKworICAgIGRlZiBoZWFkKHNlbGYsIGlkKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIEhFQUQgY29tbWFuZC4gIEFyZ3VtZW50OgorICAgICAgICAtIGlkOiBhcnRpY2xlIG51bWJlciBvciBtZXNzYWdlIGlkCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBucjogYXJ0aWNsZSBudW1iZXIKKyAgICAgICAgLSBpZDogbWVzc2FnZSBpZAorICAgICAgICAtIGxpc3Q6IHRoZSBsaW5lcyBvZiB0aGUgYXJ0aWNsZSdzIGhlYWRlciIiIgorCisgICAgICAgIHJldHVybiBzZWxmLmFydGNtZCgnSEVBRCAnICsgaWQpCisKKyAgICBkZWYgYm9keShzZWxmLCBpZCwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIEJPRFkgY29tbWFuZC4gIEFyZ3VtZW50OgorICAgICAgICAtIGlkOiBhcnRpY2xlIG51bWJlciBvciBtZXNzYWdlIGlkCisgICAgICAgIC0gZmlsZTogRmlsZW5hbWUgc3RyaW5nIG9yIGZpbGUgb2JqZWN0IHRvIHN0b3JlIHRoZSBhcnRpY2xlIGluCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBucjogYXJ0aWNsZSBudW1iZXIKKyAgICAgICAgLSBpZDogbWVzc2FnZSBpZAorICAgICAgICAtIGxpc3Q6IHRoZSBsaW5lcyBvZiB0aGUgYXJ0aWNsZSdzIGJvZHkgb3IgYW4gZW1wdHkgbGlzdAorICAgICAgICAgICAgICAgIGlmIGZpbGUgd2FzIHVzZWQiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5hcnRjbWQoJ0JPRFkgJyArIGlkLCBmaWxlKQorCisgICAgZGVmIGFydGljbGUoc2VsZiwgaWQpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIEFSVElDTEUgY29tbWFuZC4gIEFyZ3VtZW50OgorICAgICAgICAtIGlkOiBhcnRpY2xlIG51bWJlciBvciBtZXNzYWdlIGlkCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBucjogYXJ0aWNsZSBudW1iZXIKKyAgICAgICAgLSBpZDogbWVzc2FnZSBpZAorICAgICAgICAtIGxpc3Q6IHRoZSBsaW5lcyBvZiB0aGUgYXJ0aWNsZSIiIgorCisgICAgICAgIHJldHVybiBzZWxmLmFydGNtZCgnQVJUSUNMRSAnICsgaWQpCisKKyAgICBkZWYgc2xhdmUoc2VsZik6CisgICAgICAgICIiIlByb2Nlc3MgYSBTTEFWRSBjb21tYW5kLiAgUmV0dXJuczoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCIiIgorCisgICAgICAgIHJldHVybiBzZWxmLnNob3J0Y21kKCdTTEFWRScpCisKKyAgICBkZWYgeGhkcihzZWxmLCBoZHIsIHN0ciwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiUHJvY2VzcyBhbiBYSERSIGNvbW1hbmQgKG9wdGlvbmFsIHNlcnZlciBleHRlbnNpb24pLiAgQXJndW1lbnRzOgorICAgICAgICAtIGhkcjogdGhlIGhlYWRlciB0eXBlIChlLmcuICdzdWJqZWN0JykKKyAgICAgICAgLSBzdHI6IGFuIGFydGljbGUgbnIsIGEgbWVzc2FnZSBpZCwgb3IgYSByYW5nZSBucjEtbnIyCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgLSBsaXN0OiBsaXN0IG9mIChuciwgdmFsdWUpIHN0cmluZ3MiIiIKKworICAgICAgICBwYXQgPSByZS5jb21waWxlKCdeKFswLTldKykgPyguKilcbj8nKQorICAgICAgICByZXNwLCBsaW5lcyA9IHNlbGYubG9uZ2NtZCgnWEhEUiAnICsgaGRyICsgJyAnICsgc3RyLCBmaWxlKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXQorICAgICAgICAgICAgbSA9IHBhdC5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IG0uZ3JvdXAoMSwgMikKKyAgICAgICAgcmV0dXJuIHJlc3AsIGxpbmVzCisKKyAgICBkZWYgeG92ZXIoc2VsZiwgc3RhcnQsIGVuZCwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIiUHJvY2VzcyBhbiBYT1ZFUiBjb21tYW5kIChvcHRpb25hbCBzZXJ2ZXIgZXh0ZW5zaW9uKSBBcmd1bWVudHM6CisgICAgICAgIC0gc3RhcnQ6IHN0YXJ0IG9mIHJhbmdlCisgICAgICAgIC0gZW5kOiBlbmQgb2YgcmFuZ2UKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bAorICAgICAgICAtIGxpc3Q6IGxpc3Qgb2YgKGFydC1uciwgc3ViamVjdCwgcG9zdGVyLCBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCByZWZlcmVuY2VzLCBzaXplLCBsaW5lcykiIiIKKworICAgICAgICByZXNwLCBsaW5lcyA9IHNlbGYubG9uZ2NtZCgnWE9WRVIgJyArIHN0YXJ0ICsgJy0nICsgZW5kLCBmaWxlKQorICAgICAgICB4b3Zlcl9saW5lcyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgZWxlbSA9IGxpbmUuc3BsaXQoIlx0IikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4b3Zlcl9saW5lcy5hcHBlbmQoKGVsZW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1bM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVs1XS5zcGxpdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbVs2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1bN10pKQorICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgTk5UUERhdGFFcnJvcihsaW5lKQorICAgICAgICByZXR1cm4gcmVzcCx4b3Zlcl9saW5lcworCisgICAgZGVmIHhndGl0bGUoc2VsZiwgZ3JvdXAsIGZpbGU9Tm9uZSk6CisgICAgICAgICIiIlByb2Nlc3MgYW4gWEdUSVRMRSBjb21tYW5kIChvcHRpb25hbCBzZXJ2ZXIgZXh0ZW5zaW9uKSBBcmd1bWVudHM6CisgICAgICAgIC0gZ3JvdXA6IGdyb3VwIG5hbWUgd2lsZGNhcmQgKGkuZS4gbmV3cy4qKQorICAgICAgICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsCisgICAgICAgIC0gbGlzdDogbGlzdCBvZiAobmFtZSx0aXRsZSkgc3RyaW5ncyIiIgorCisgICAgICAgIGxpbmVfcGF0ID0gcmUuY29tcGlsZSgiXihbXiBcdF0rKVsgXHRdKyguKikkIikKKyAgICAgICAgcmVzcCwgcmF3X2xpbmVzID0gc2VsZi5sb25nY21kKCdYR1RJVExFICcgKyBncm91cCwgZmlsZSkKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBmb3IgcmF3X2xpbmUgaW4gcmF3X2xpbmVzOgorICAgICAgICAgICAgbWF0Y2ggPSBsaW5lX3BhdC5zZWFyY2gocmF3X2xpbmUuc3RyaXAoKSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChtYXRjaC5ncm91cCgxLCAyKSkKKyAgICAgICAgcmV0dXJuIHJlc3AsIGxpbmVzCisKKyAgICBkZWYgeHBhdGgoc2VsZixpZCk6CisgICAgICAgICIiIlByb2Nlc3MgYW4gWFBBVEggY29tbWFuZCAob3B0aW9uYWwgc2VydmVyIGV4dGVuc2lvbikgQXJndW1lbnRzOgorICAgICAgICAtIGlkOiBNZXNzYWdlIGlkIG9mIGFydGljbGUKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgcGF0aDogZGlyZWN0b3J5IHBhdGggdG8gYXJ0aWNsZSIiIgorCisgICAgICAgIHJlc3AgPSBzZWxmLnNob3J0Y21kKCJYUEFUSCAiICsgaWQpCisgICAgICAgIGlmIHJlc3BbOjNdICE9ICcyMjMnOgorICAgICAgICAgICAgcmFpc2UgTk5UUFJlcGx5RXJyb3IocmVzcCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgW3Jlc3BfbnVtLCBwYXRoXSA9IHJlc3Auc3BsaXQoKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBSZXBseUVycm9yKHJlc3ApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcmVzcCwgcGF0aAorCisgICAgZGVmIGRhdGUgKHNlbGYpOgorICAgICAgICAiIiJQcm9jZXNzIHRoZSBEQVRFIGNvbW1hbmQuIEFyZ3VtZW50czoKKyAgICAgICAgTm9uZQorICAgICAgICBSZXR1cm5zOgorICAgICAgICByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bAorICAgICAgICBkYXRlOiBEYXRlIHN1aXRhYmxlIGZvciBuZXduZXdzL25ld2dyb3VwcyBjb21tYW5kcyBldGMuCisgICAgICAgIHRpbWU6IFRpbWUgc3VpdGFibGUgZm9yIG5ld25ld3MvbmV3Z3JvdXBzIGNvbW1hbmRzIGV0Yy4iIiIKKworICAgICAgICByZXNwID0gc2VsZi5zaG9ydGNtZCgiREFURSIpCisgICAgICAgIGlmIHJlc3BbOjNdICE9ICcxMTEnOgorICAgICAgICAgICAgcmFpc2UgTk5UUFJlcGx5RXJyb3IocmVzcCkKKyAgICAgICAgZWxlbSA9IHJlc3Auc3BsaXQoKQorICAgICAgICBpZiBsZW4oZWxlbSkgIT0gMjoKKyAgICAgICAgICAgIHJhaXNlIE5OVFBEYXRhRXJyb3IocmVzcCkKKyAgICAgICAgZGF0ZSA9IGVsZW1bMV1bMjo4XQorICAgICAgICB0aW1lID0gZWxlbVsxXVstNjpdCisgICAgICAgIGlmIGxlbihkYXRlKSAhPSA2IG9yIGxlbih0aW1lKSAhPSA2OgorICAgICAgICAgICAgcmFpc2UgTk5UUERhdGFFcnJvcihyZXNwKQorICAgICAgICByZXR1cm4gcmVzcCwgZGF0ZSwgdGltZQorCisKKyAgICBkZWYgcG9zdChzZWxmLCBmKToKKyAgICAgICAgIiIiUHJvY2VzcyBhIFBPU1QgY29tbWFuZC4gIEFyZ3VtZW50czoKKyAgICAgICAgLSBmOiBmaWxlIGNvbnRhaW5pbmcgdGhlIGFydGljbGUKKyAgICAgICAgUmV0dXJuczoKKyAgICAgICAgLSByZXNwOiBzZXJ2ZXIgcmVzcG9uc2UgaWYgc3VjY2Vzc2Z1bCIiIgorCisgICAgICAgIHJlc3AgPSBzZWxmLnNob3J0Y21kKCdQT1NUJykKKyAgICAgICAgIyBSYWlzZXMgZXJyb3JfPz8/IGlmIHBvc3RpbmcgaXMgbm90IGFsbG93ZWQKKyAgICAgICAgaWYgcmVzcFswXSAhPSAnMyc6CisgICAgICAgICAgICByYWlzZSBOTlRQUmVwbHlFcnJvcihyZXNwKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGxpbmVbLTFdID09ICdcbic6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgaWYgbGluZVs6MV0gPT0gJy4nOgorICAgICAgICAgICAgICAgIGxpbmUgPSAnLicgKyBsaW5lCisgICAgICAgICAgICBzZWxmLnB1dGxpbmUobGluZSkKKyAgICAgICAgc2VsZi5wdXRsaW5lKCcuJykKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVzcCgpCisKKyAgICBkZWYgaWhhdmUoc2VsZiwgaWQsIGYpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIElIQVZFIGNvbW1hbmQuICBBcmd1bWVudHM6CisgICAgICAgIC0gaWQ6IG1lc3NhZ2UtaWQgb2YgdGhlIGFydGljbGUKKyAgICAgICAgLSBmOiAgZmlsZSBjb250YWluaW5nIHRoZSBhcnRpY2xlCisgICAgICAgIFJldHVybnM6CisgICAgICAgIC0gcmVzcDogc2VydmVyIHJlc3BvbnNlIGlmIHN1Y2Nlc3NmdWwKKyAgICAgICAgTm90ZSB0aGF0IGlmIHRoZSBzZXJ2ZXIgcmVmdXNlcyB0aGUgYXJ0aWNsZSBhbiBleGNlcHRpb24gaXMgcmFpc2VkLiIiIgorCisgICAgICAgIHJlc3AgPSBzZWxmLnNob3J0Y21kKCdJSEFWRSAnICsgaWQpCisgICAgICAgICMgUmFpc2VzIGVycm9yXz8/PyBpZiB0aGUgc2VydmVyIGFscmVhZHkgaGFzIGl0CisgICAgICAgIGlmIHJlc3BbMF0gIT0gJzMnOgorICAgICAgICAgICAgcmFpc2UgTk5UUFJlcGx5RXJyb3IocmVzcCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBsaW5lWy0xXSA9PSAnXG4nOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgIGlmIGxpbmVbOjFdID09ICcuJzoKKyAgICAgICAgICAgICAgICBsaW5lID0gJy4nICsgbGluZQorICAgICAgICAgICAgc2VsZi5wdXRsaW5lKGxpbmUpCisgICAgICAgIHNlbGYucHV0bGluZSgnLicpCisgICAgICAgIHJldHVybiBzZWxmLmdldHJlc3AoKQorCisgICAgZGVmIHF1aXQoc2VsZik6CisgICAgICAgICIiIlByb2Nlc3MgYSBRVUlUIGNvbW1hbmQgYW5kIGNsb3NlIHRoZSBzb2NrZXQuICBSZXR1cm5zOgorICAgICAgICAtIHJlc3A6IHNlcnZlciByZXNwb25zZSBpZiBzdWNjZXNzZnVsIiIiCisKKyAgICAgICAgcmVzcCA9IHNlbGYuc2hvcnRjbWQoJ1FVSVQnKQorICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5maWxlLCBzZWxmLnNvY2sKKyAgICAgICAgcmV0dXJuIHJlc3AKKworCisjIFRlc3QgcmV0cmlldmFsIHdoZW4gcnVuIGFzIGEgc2NyaXB0LgorIyBBc3N1bXB0aW9uOiBpZiB0aGVyZSdzIGEgbG9jYWwgbmV3cyBzZXJ2ZXIsIGl0J3MgY2FsbGVkICduZXdzJy4KKyMgQXNzdW1wdGlvbjogaWYgdXNlciBxdWVyaWVzIGEgcmVtb3RlIG5ld3Mgc2VydmVyLCBpdCdzIG5hbWVkCisjIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBOTlRQU0VSVkVSICh1c2VkIGJ5IHNscm4gYW5kIGtpbikKKyMgYW5kIHdlIHdhbnQgcmVhZGVybW9kZSBvZmYuCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBvcworICAgIG5ld3Nob3N0ID0gJ25ld3MnIGFuZCBvcy5lbnZpcm9uWyJOTlRQU0VSVkVSIl0KKyAgICBpZiBuZXdzaG9zdC5maW5kKCcuJykgPT0gLTE6CisgICAgICAgIG1vZGUgPSAncmVhZGVybW9kZScKKyAgICBlbHNlOgorICAgICAgICBtb2RlID0gTm9uZQorICAgIHMgPSBOTlRQKG5ld3Nob3N0LCByZWFkZXJtb2RlPW1vZGUpCisgICAgcmVzcCwgY291bnQsIGZpcnN0LCBsYXN0LCBuYW1lID0gcy5ncm91cCgnY29tcC5sYW5nLnB5dGhvbicpCisgICAgcHJpbnQgcmVzcAorICAgIHByaW50ICdHcm91cCcsIG5hbWUsICdoYXMnLCBjb3VudCwgJ2FydGljbGVzLCByYW5nZScsIGZpcnN0LCAndG8nLCBsYXN0CisgICAgcmVzcCwgc3VicyA9IHMueGhkcignc3ViamVjdCcsIGZpcnN0ICsgJy0nICsgbGFzdCkKKyAgICBwcmludCByZXNwCisgICAgZm9yIGl0ZW0gaW4gc3ViczoKKyAgICAgICAgcHJpbnQgIiU3cyAlcyIgJSBpdGVtCisgICAgcmVzcCA9IHMucXVpdCgpCisgICAgcHJpbnQgcmVzcApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ubnRwbGliLnB5YyBiL2xpYi9weXRob24yLjcvbm50cGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4Mjc2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbm50cGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9ubnRwbGliLnB5byBiL2xpYi9weXRob24yLjcvbm50cGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk4Mjc2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbm50cGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9udHBhdGgucHkgYi9saWIvcHl0aG9uMi43L250cGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhmNDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9udHBhdGgucHkKQEAgLTAsMCArMSw1MzMgQEAKKyMgTW9kdWxlICdudHBhdGgnIC0tIGNvbW1vbiBvcGVyYXRpb25zIG9uIFdpbk5UL1dpbjk1IHBhdGhuYW1lcworIiIiQ29tbW9uIHBhdGhuYW1lIG1hbmlwdWxhdGlvbnMsIFdpbmRvd3NOVC85NSB2ZXJzaW9uLgorCitJbnN0ZWFkIG9mIGltcG9ydGluZyB0aGlzIG1vZHVsZSBkaXJlY3RseSwgaW1wb3J0IG9zIGFuZCByZWZlciB0byB0aGlzCittb2R1bGUgYXMgb3MucGF0aC4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdGF0CitpbXBvcnQgZ2VuZXJpY3BhdGgKK2ltcG9ydCB3YXJuaW5ncworCitmcm9tIGdlbmVyaWNwYXRoIGltcG9ydCAqCisKK19fYWxsX18gPSBbIm5vcm1jYXNlIiwiaXNhYnMiLCJqb2luIiwic3BsaXRkcml2ZSIsInNwbGl0Iiwic3BsaXRleHQiLAorICAgICAgICAgICAiYmFzZW5hbWUiLCJkaXJuYW1lIiwiY29tbW9ucHJlZml4IiwiZ2V0c2l6ZSIsImdldG10aW1lIiwKKyAgICAgICAgICAgImdldGF0aW1lIiwiZ2V0Y3RpbWUiLCAiaXNsaW5rIiwiZXhpc3RzIiwibGV4aXN0cyIsImlzZGlyIiwiaXNmaWxlIiwKKyAgICAgICAgICAgImlzbW91bnQiLCJ3YWxrIiwiZXhwYW5kdXNlciIsImV4cGFuZHZhcnMiLCJub3JtcGF0aCIsImFic3BhdGgiLAorICAgICAgICAgICAic3BsaXR1bmMiLCJjdXJkaXIiLCJwYXJkaXIiLCJzZXAiLCJwYXRoc2VwIiwiZGVmcGF0aCIsImFsdHNlcCIsCisgICAgICAgICAgICJleHRzZXAiLCJkZXZudWxsIiwicmVhbHBhdGgiLCJzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyIsInJlbHBhdGgiXQorCisjIHN0cmluZ3MgcmVwcmVzZW50aW5nIHZhcmlvdXMgcGF0aC1yZWxhdGVkIGJpdHMgYW5kIHBpZWNlcworY3VyZGlyID0gJy4nCitwYXJkaXIgPSAnLi4nCitleHRzZXAgPSAnLicKK3NlcCA9ICdcXCcKK3BhdGhzZXAgPSAnOycKK2FsdHNlcCA9ICcvJworZGVmcGF0aCA9ICcuO0M6XFxiaW4nCitpZiAnY2UnIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKKyAgICBkZWZwYXRoID0gJ1xcV2luZG93cycKK2VsaWYgJ29zMicgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgorICAgICMgT1MvMiB3LyBWQUNQUAorICAgIGFsdHNlcCA9ICcvJworZGV2bnVsbCA9ICdudWwnCisKKyMgTm9ybWFsaXplIHRoZSBjYXNlIG9mIGEgcGF0aG5hbWUgYW5kIG1hcCBzbGFzaGVzIHRvIGJhY2tzbGFzaGVzLgorIyBPdGhlciBub3JtYWxpemF0aW9ucyAoc3VjaCBhcyBvcHRpbWl6aW5nICcuLi8nIGF3YXkpIGFyZSBub3QgZG9uZQorIyAodGhpcyBpcyBkb25lIGJ5IG5vcm1wYXRoKS4KKworZGVmIG5vcm1jYXNlKHMpOgorICAgICIiIk5vcm1hbGl6ZSBjYXNlIG9mIHBhdGhuYW1lLgorCisgICAgTWFrZXMgYWxsIGNoYXJhY3RlcnMgbG93ZXJjYXNlIGFuZCBhbGwgc2xhc2hlcyBpbnRvIGJhY2tzbGFzaGVzLiIiIgorICAgIHJldHVybiBzLnJlcGxhY2UoIi8iLCAiXFwiKS5sb3dlcigpCisKKworIyBSZXR1cm4gd2hldGhlciBhIHBhdGggaXMgYWJzb2x1dGUuCisjIFRyaXZpYWwgaW4gUG9zaXgsIGhhcmRlciBvbiB0aGUgTWFjIG9yIE1TLURPUy4KKyMgRm9yIERPUyBpdCBpcyBhYnNvbHV0ZSBpZiBpdCBzdGFydHMgd2l0aCBhIHNsYXNoIG9yIGJhY2tzbGFzaCAoY3VycmVudAorIyB2b2x1bWUpLCBvciBpZiBhIHBhdGhuYW1lIGFmdGVyIHRoZSB2b2x1bWUgbGV0dGVyIGFuZCBjb2xvbiAvIFVOQyByZXNvdXJjZQorIyBzdGFydHMgd2l0aCBhIHNsYXNoIG9yIGJhY2tzbGFzaC4KKworZGVmIGlzYWJzKHMpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYWJzb2x1dGUiIiIKKyAgICBzID0gc3BsaXRkcml2ZShzKVsxXQorICAgIHJldHVybiBzICE9ICcnIGFuZCBzWzoxXSBpbiAnL1xcJworCisKKyMgSm9pbiB0d28gKG9yIG1vcmUpIHBhdGhzLgorCitkZWYgam9pbihhLCAqcCk6CisgICAgIiIiSm9pbiB0d28gb3IgbW9yZSBwYXRobmFtZSBjb21wb25lbnRzLCBpbnNlcnRpbmcgIlxcIiBhcyBuZWVkZWQuCisgICAgSWYgYW55IGNvbXBvbmVudCBpcyBhbiBhYnNvbHV0ZSBwYXRoLCBhbGwgcHJldmlvdXMgcGF0aCBjb21wb25lbnRzCisgICAgd2lsbCBiZSBkaXNjYXJkZWQuIiIiCisgICAgcGF0aCA9IGEKKyAgICBmb3IgYiBpbiBwOgorICAgICAgICBiX3dpbnMgPSAwICAjIHNldCB0byAxIGlmZiBiIG1ha2VzIHBhdGggaXJyZWxldmFudAorICAgICAgICBpZiBwYXRoID09ICIiOgorICAgICAgICAgICAgYl93aW5zID0gMQorCisgICAgICAgIGVsaWYgaXNhYnMoYik6CisgICAgICAgICAgICAjIFRoaXMgcHJvYmFibHkgd2lwZXMgb3V0IHBhdGggc28gZmFyLiAgSG93ZXZlciwgaXQncyBtb3JlCisgICAgICAgICAgICAjIGNvbXBsaWNhdGVkIGlmIHBhdGggYmVnaW5zIHdpdGggYSBkcml2ZSBsZXR0ZXI6CisgICAgICAgICAgICAjICAgICAxLiBqb2luKCdjOicsICcvYScpID09ICdjOi9hJworICAgICAgICAgICAgIyAgICAgMi4gam9pbignYzovJywgJy9hJykgPT0gJ2M6L2EnCisgICAgICAgICAgICAjIEJ1dAorICAgICAgICAgICAgIyAgICAgMy4gam9pbignYzovYScsICcvYicpID09ICcvYicKKyAgICAgICAgICAgICMgICAgIDQuIGpvaW4oJ2M6JywgJ2Q6LycpID0gJ2Q6LycKKyAgICAgICAgICAgICMgICAgIDUuIGpvaW4oJ2M6LycsICdkOi8nKSA9ICdkOi8nCisgICAgICAgICAgICBpZiBwYXRoWzE6Ml0gIT0gIjoiIG9yIGJbMToyXSA9PSAiOiI6CisgICAgICAgICAgICAgICAgIyBQYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCBhIGRyaXZlIGxldHRlciwgb3IgY2FzZXMgNCBhbmQgNS4KKyAgICAgICAgICAgICAgICBiX3dpbnMgPSAxCisKKyAgICAgICAgICAgICMgRWxzZSBwYXRoIGhhcyBhIGRyaXZlIGxldHRlciwgYW5kIGIgZG9lc24ndCBidXQgaXMgYWJzb2x1dGUuCisgICAgICAgICAgICBlbGlmIGxlbihwYXRoKSA+IDMgb3IgKGxlbihwYXRoKSA9PSAzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoWy0xXSBub3QgaW4gIi9cXCIpOgorICAgICAgICAgICAgICAgICMgY2FzZSAzCisgICAgICAgICAgICAgICAgYl93aW5zID0gMQorCisgICAgICAgIGlmIGJfd2luczoKKyAgICAgICAgICAgIHBhdGggPSBiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEpvaW4sIGFuZCBlbnN1cmUgdGhlcmUncyBhIHNlcGFyYXRvci4KKyAgICAgICAgICAgIGFzc2VydCBsZW4ocGF0aCkgPiAwCisgICAgICAgICAgICBpZiBwYXRoWy0xXSBpbiAiL1xcIjoKKyAgICAgICAgICAgICAgICBpZiBiIGFuZCBiWzBdIGluICIvXFwiOgorICAgICAgICAgICAgICAgICAgICBwYXRoICs9IGJbMTpdCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcGF0aCArPSBiCisgICAgICAgICAgICBlbGlmIHBhdGhbLTFdID09ICI6IjoKKyAgICAgICAgICAgICAgICBwYXRoICs9IGIKKyAgICAgICAgICAgIGVsaWYgYjoKKyAgICAgICAgICAgICAgICBpZiBiWzBdIGluICIvXFwiOgorICAgICAgICAgICAgICAgICAgICBwYXRoICs9IGIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwYXRoICs9ICJcXCIgKyBiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgcGF0aCBpcyBub3QgZW1wdHkgYW5kIGRvZXMgbm90IGVuZCB3aXRoIGEgYmFja3NsYXNoLAorICAgICAgICAgICAgICAgICMgYnV0IGIgaXMgZW1wdHk7IHNpbmNlLCBlLmcuLCBzcGxpdCgnYS8nKSBwcm9kdWNlcworICAgICAgICAgICAgICAgICMgKCdhJywgJycpLCBpdCdzIGJlc3QgaWYgam9pbigpIGFkZHMgYSBiYWNrc2xhc2ggaW4KKyAgICAgICAgICAgICAgICAjIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICBwYXRoICs9ICdcXCcKKworICAgIHJldHVybiBwYXRoCisKKworIyBTcGxpdCBhIHBhdGggaW4gYSBkcml2ZSBzcGVjaWZpY2F0aW9uIChhIGRyaXZlIGxldHRlciBmb2xsb3dlZCBieSBhCisjIGNvbG9uKSBhbmQgdGhlIHBhdGggc3BlY2lmaWNhdGlvbi4KKyMgSXQgaXMgYWx3YXlzIHRydWUgdGhhdCBkcml2ZXNwZWMgKyBwYXRoc3BlYyA9PSBwCitkZWYgc3BsaXRkcml2ZShwKToKKyAgICAiIiJTcGxpdCBhIHBhdGhuYW1lIGludG8gZHJpdmUgYW5kIHBhdGggc3BlY2lmaWVycy4gUmV0dXJucyBhIDItdHVwbGUKKyIoZHJpdmUscGF0aCkiOyAgZWl0aGVyIHBhcnQgbWF5IGJlIGVtcHR5IiIiCisgICAgaWYgcFsxOjJdID09ICc6JzoKKyAgICAgICAgcmV0dXJuIHBbMDoyXSwgcFsyOl0KKyAgICByZXR1cm4gJycsIHAKKworCisjIFBhcnNlIFVOQyBwYXRocworZGVmIHNwbGl0dW5jKHApOgorICAgICIiIlNwbGl0IGEgcGF0aG5hbWUgaW50byBVTkMgbW91bnQgcG9pbnQgYW5kIHJlbGF0aXZlIHBhdGggc3BlY2lmaWVycy4KKworICAgIFJldHVybiBhIDItdHVwbGUgKHVuYywgcmVzdCk7IGVpdGhlciBwYXJ0IG1heSBiZSBlbXB0eS4KKyAgICBJZiB1bmMgaXMgbm90IGVtcHR5LCBpdCBoYXMgdGhlIGZvcm0gJy8vaG9zdC9tb3VudCcgKG9yIHNpbWlsYXIKKyAgICB1c2luZyBiYWNrc2xhc2hlcykuICB1bmMrcmVzdCBpcyBhbHdheXMgdGhlIGlucHV0IHBhdGguCisgICAgUGF0aHMgY29udGFpbmluZyBkcml2ZSBsZXR0ZXJzIG5ldmVyIGhhdmUgYW4gVU5DIHBhcnQuCisgICAgIiIiCisgICAgaWYgcFsxOjJdID09ICc6JzoKKyAgICAgICAgcmV0dXJuICcnLCBwICMgRHJpdmUgbGV0dGVyIHByZXNlbnQKKyAgICBmaXJzdFR3byA9IHBbMDoyXQorICAgIGlmIGZpcnN0VHdvID09ICcvLycgb3IgZmlyc3RUd28gPT0gJ1xcXFwnOgorICAgICAgICAjIGlzIGEgVU5DIHBhdGg6CisgICAgICAgICMgdnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnYgZXF1aXZhbGVudCB0byBkcml2ZSBsZXR0ZXIKKyAgICAgICAgIyBcXG1hY2hpbmVcbW91bnRwb2ludFxkaXJlY3Rvcmllcy4uLgorICAgICAgICAjICAgICAgICAgICBkaXJlY3RvcnkgXl5eXl5eXl5eXl5eXl5eCisgICAgICAgIG5vcm1wID0gbm9ybWNhc2UocCkKKyAgICAgICAgaW5kZXggPSBub3JtcC5maW5kKCdcXCcsIDIpCisgICAgICAgIGlmIGluZGV4ID09IC0xOgorICAgICAgICAgICAgIyNyYWlzZSBSdW50aW1lRXJyb3IsICdpbGxlZ2FsIFVOQyBwYXRoOiAiJyArIHAgKyAnIicKKyAgICAgICAgICAgIHJldHVybiAoIiIsIHApCisgICAgICAgIGluZGV4ID0gbm9ybXAuZmluZCgnXFwnLCBpbmRleCArIDEpCisgICAgICAgIGlmIGluZGV4ID09IC0xOgorICAgICAgICAgICAgaW5kZXggPSBsZW4ocCkKKyAgICAgICAgcmV0dXJuIHBbOmluZGV4XSwgcFtpbmRleDpdCisgICAgcmV0dXJuICcnLCBwCisKKworIyBTcGxpdCBhIHBhdGggaW4gaGVhZCAoZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCAnLycpIGFuZCB0YWlsICh0aGUKKyMgcmVzdCkuICBBZnRlciB0aGUgdHJhaWxpbmcgJy8nIGlzIHN0cmlwcGVkLCB0aGUgaW52YXJpYW50CisjIGpvaW4oaGVhZCwgdGFpbCkgPT0gcCBob2xkcy4KKyMgVGhlIHJlc3VsdGluZyBoZWFkIHdvbid0IGVuZCBpbiAnLycgdW5sZXNzIGl0IGlzIHRoZSByb290LgorCitkZWYgc3BsaXQocCk6CisgICAgIiIiU3BsaXQgYSBwYXRobmFtZS4KKworICAgIFJldHVybiB0dXBsZSAoaGVhZCwgdGFpbCkgd2hlcmUgdGFpbCBpcyBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaW5hbCBzbGFzaC4KKyAgICBFaXRoZXIgcGFydCBtYXkgYmUgZW1wdHkuIiIiCisKKyAgICBkLCBwID0gc3BsaXRkcml2ZShwKQorICAgICMgc2V0IGkgdG8gaW5kZXggYmV5b25kIHAncyBsYXN0IHNsYXNoCisgICAgaSA9IGxlbihwKQorICAgIHdoaWxlIGkgYW5kIHBbaS0xXSBub3QgaW4gJy9cXCc6CisgICAgICAgIGkgPSBpIC0gMQorICAgIGhlYWQsIHRhaWwgPSBwWzppXSwgcFtpOl0gICMgbm93IHRhaWwgaGFzIG5vIHNsYXNoZXMKKyAgICAjIHJlbW92ZSB0cmFpbGluZyBzbGFzaGVzIGZyb20gaGVhZCwgdW5sZXNzIGl0J3MgYWxsIHNsYXNoZXMKKyAgICBoZWFkMiA9IGhlYWQKKyAgICB3aGlsZSBoZWFkMiBhbmQgaGVhZDJbLTFdIGluICcvXFwnOgorICAgICAgICBoZWFkMiA9IGhlYWQyWzotMV0KKyAgICBoZWFkID0gaGVhZDIgb3IgaGVhZAorICAgIHJldHVybiBkICsgaGVhZCwgdGFpbAorCisKKyMgU3BsaXQgYSBwYXRoIGluIHJvb3QgYW5kIGV4dGVuc2lvbi4KKyMgVGhlIGV4dGVuc2lvbiBpcyBldmVyeXRoaW5nIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IGRvdCBpbiB0aGUgbGFzdAorIyBwYXRobmFtZSBjb21wb25lbnQ7IHRoZSByb290IGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoYXQuCisjIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgcm9vdCArIGV4dCA9PSBwLgorCitkZWYgc3BsaXRleHQocCk6CisgICAgcmV0dXJuIGdlbmVyaWNwYXRoLl9zcGxpdGV4dChwLCBzZXAsIGFsdHNlcCwgZXh0c2VwKQorc3BsaXRleHQuX19kb2NfXyA9IGdlbmVyaWNwYXRoLl9zcGxpdGV4dC5fX2RvY19fCisKKworIyBSZXR1cm4gdGhlIHRhaWwgKGJhc2VuYW1lKSBwYXJ0IG9mIGEgcGF0aC4KKworZGVmIGJhc2VuYW1lKHApOgorICAgICIiIlJldHVybnMgdGhlIGZpbmFsIGNvbXBvbmVudCBvZiBhIHBhdGhuYW1lIiIiCisgICAgcmV0dXJuIHNwbGl0KHApWzFdCisKKworIyBSZXR1cm4gdGhlIGhlYWQgKGRpcm5hbWUpIHBhcnQgb2YgYSBwYXRoLgorCitkZWYgZGlybmFtZShwKToKKyAgICAiIiJSZXR1cm5zIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUiIiIKKyAgICByZXR1cm4gc3BsaXQocClbMF0KKworIyBJcyBhIHBhdGggYSBzeW1ib2xpYyBsaW5rPworIyBUaGlzIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZSBvbiBzeXN0ZW1zIHdoZXJlIHBvc2l4LmxzdGF0IGRvZXNuJ3QgZXhpc3QuCisKK2RlZiBpc2xpbmsocGF0aCk6CisgICAgIiIiVGVzdCBmb3Igc3ltYm9saWMgbGluay4KKyAgICBPbiBXaW5kb3dzTlQvOTUgYW5kIE9TLzIgYWx3YXlzIHJldHVybnMgZmFsc2UKKyAgICAiIiIKKyAgICByZXR1cm4gRmFsc2UKKworIyBhbGlhcyBleGlzdHMgdG8gbGV4aXN0cworbGV4aXN0cyA9IGV4aXN0cworCisjIElzIGEgcGF0aCBhIG1vdW50IHBvaW50PyAgRWl0aGVyIGEgcm9vdCAod2l0aCBvciB3aXRob3V0IGRyaXZlIGxldHRlcikKKyMgb3IgYW4gVU5DIHBhdGggd2l0aCBhdCBtb3N0IGEgLyBvciBcIGFmdGVyIHRoZSBtb3VudCBwb2ludC4KKworZGVmIGlzbW91bnQocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIG1vdW50IHBvaW50IChkZWZpbmVkIGFzIHJvb3Qgb2YgZHJpdmUpIiIiCisgICAgdW5jLCByZXN0ID0gc3BsaXR1bmMocGF0aCkKKyAgICBpZiB1bmM6CisgICAgICAgIHJldHVybiByZXN0IGluICgiIiwgIi8iLCAiXFwiKQorICAgIHAgPSBzcGxpdGRyaXZlKHBhdGgpWzFdCisgICAgcmV0dXJuIGxlbihwKSA9PSAxIGFuZCBwWzBdIGluICcvXFwnCisKKworIyBEaXJlY3RvcnkgdHJlZSB3YWxrLgorIyBGb3IgZWFjaCBkaXJlY3RvcnkgdW5kZXIgdG9wIChpbmNsdWRpbmcgdG9wIGl0c2VsZiwgYnV0IGV4Y2x1ZGluZworIyAnLicgYW5kICcuLicpLCBmdW5jKGFyZywgZGlybmFtZSwgZmlsZW5hbWVzKSBpcyBjYWxsZWQsIHdoZXJlCisjIGRpcm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWVzIGlzIHRoZSBsaXN0CisjIG9mIGZpbGVzIChhbmQgc3ViZGlyZWN0b3JpZXMgZXRjLikgaW4gdGhlIGRpcmVjdG9yeS4KKyMgVGhlIGZ1bmMgbWF5IG1vZGlmeSB0aGUgZmlsZW5hbWVzIGxpc3QsIHRvIGltcGxlbWVudCBhIGZpbHRlciwKKyMgb3IgdG8gaW1wb3NlIGEgZGlmZmVyZW50IG9yZGVyIG9mIHZpc2l0aW5nLgorCitkZWYgd2Fsayh0b3AsIGZ1bmMsIGFyZyk6CisgICAgIiIiRGlyZWN0b3J5IHRyZWUgd2FsayB3aXRoIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgRm9yIGVhY2ggZGlyZWN0b3J5IGluIHRoZSBkaXJlY3RvcnkgdHJlZSByb290ZWQgYXQgdG9wIChpbmNsdWRpbmcgdG9wCisgICAgaXRzZWxmLCBidXQgZXhjbHVkaW5nICcuJyBhbmQgJy4uJyksIGNhbGwgZnVuYyhhcmcsIGRpcm5hbWUsIGZuYW1lcykuCisgICAgZGlybmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5LCBhbmQgZm5hbWVzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YKKyAgICB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIGluIGRpcm5hbWUgKGV4Y2x1ZGluZyAnLicgYW5kICcuLicpLiAgZnVuYworICAgIG1heSBtb2RpZnkgdGhlIGZuYW1lcyBsaXN0IGluLXBsYWNlIChlLmcuIHZpYSBkZWwgb3Igc2xpY2UgYXNzaWdubWVudCksCisgICAgYW5kIHdhbGsgd2lsbCBvbmx5IHJlY3Vyc2UgaW50byB0aGUgc3ViZGlyZWN0b3JpZXMgd2hvc2UgbmFtZXMgcmVtYWluIGluCisgICAgZm5hbWVzOyB0aGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhIGZpbHRlciwgb3IgdG8gaW1wb3NlIGEgc3BlY2lmaWMKKyAgICBvcmRlciBvZiB2aXNpdGluZy4gIE5vIHNlbWFudGljcyBhcmUgZGVmaW5lZCBmb3IsIG9yIHJlcXVpcmVkIG9mLCBhcmcsCisgICAgYmV5b25kIHRoYXQgYXJnIGlzIGFsd2F5cyBwYXNzZWQgdG8gZnVuYy4gIEl0IGNhbiBiZSB1c2VkLCBlLmcuLCB0byBwYXNzCisgICAgYSBmaWxlbmFtZSBwYXR0ZXJuLCBvciBhIG11dGFibGUgb2JqZWN0IGRlc2lnbmVkIHRvIGFjY3VtdWxhdGUKKyAgICBzdGF0aXN0aWNzLiAgUGFzc2luZyBOb25lIGZvciBhcmcgaXMgY29tbW9uLiIiIgorICAgIHdhcm5pbmdzLndhcm5weTNrKCJJbiAzLngsIG9zLnBhdGgud2FsayBpcyByZW1vdmVkIGluIGZhdm9yIG9mIG9zLndhbGsuIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgdHJ5OgorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIodG9wKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcmV0dXJuCisgICAgZnVuYyhhcmcsIHRvcCwgbmFtZXMpCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIG5hbWUgPSBqb2luKHRvcCwgbmFtZSkKKyAgICAgICAgaWYgaXNkaXIobmFtZSk6CisgICAgICAgICAgICB3YWxrKG5hbWUsIGZ1bmMsIGFyZykKKworCisjIEV4cGFuZCBwYXRocyBiZWdpbm5pbmcgd2l0aCAnficgb3IgJ351c2VyJy4KKyMgJ34nIG1lYW5zICRIT01FOyAnfnVzZXInIG1lYW5zIHRoYXQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorIyBJZiB0aGUgcGF0aCBkb2Vzbid0IGJlZ2luIHdpdGggJ34nLCBvciBpZiB0aGUgdXNlciBvciAkSE9NRSBpcyB1bmtub3duLAorIyB0aGUgcGF0aCBpcyByZXR1cm5lZCB1bmNoYW5nZWQgKGxlYXZpbmcgZXJyb3IgcmVwb3J0aW5nIHRvIHdoYXRldmVyCisjIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBleHBhbmRlZCBwYXRoIGFzIGFyZ3VtZW50KS4KKyMgU2VlIGFsc28gbW9kdWxlICdnbG9iJyBmb3IgZXhwYW5zaW9uIG9mICosID8gYW5kIFsuLi5dIGluIHBhdGhuYW1lcy4KKyMgKEEgZnVuY3Rpb24gc2hvdWxkIGFsc28gYmUgZGVmaW5lZCB0byBkbyBmdWxsICpzaC1zdHlsZSBlbnZpcm9ubWVudAorIyB2YXJpYWJsZSBleHBhbnNpb24uKQorCitkZWYgZXhwYW5kdXNlcihwYXRoKToKKyAgICAiIiJFeHBhbmQgfiBhbmQgfnVzZXIgY29uc3RydWN0cy4KKworICAgIElmIHVzZXIgb3IgJEhPTUUgaXMgdW5rbm93biwgZG8gbm90aGluZy4iIiIKKyAgICBpZiBwYXRoWzoxXSAhPSAnfic6CisgICAgICAgIHJldHVybiBwYXRoCisgICAgaSwgbiA9IDEsIGxlbihwYXRoKQorICAgIHdoaWxlIGkgPCBuIGFuZCBwYXRoW2ldIG5vdCBpbiAnL1xcJzoKKyAgICAgICAgaSA9IGkgKyAxCisKKyAgICBpZiAnSE9NRScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgdXNlcmhvbWUgPSBvcy5lbnZpcm9uWydIT01FJ10KKyAgICBlbGlmICdVU0VSUFJPRklMRScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgdXNlcmhvbWUgPSBvcy5lbnZpcm9uWydVU0VSUFJPRklMRSddCisgICAgZWxpZiBub3QgJ0hPTUVQQVRIJyBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gcGF0aAorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRyaXZlID0gb3MuZW52aXJvblsnSE9NRURSSVZFJ10KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgZHJpdmUgPSAnJworICAgICAgICB1c2VyaG9tZSA9IGpvaW4oZHJpdmUsIG9zLmVudmlyb25bJ0hPTUVQQVRIJ10pCisKKyAgICBpZiBpICE9IDE6ICN+dXNlcgorICAgICAgICB1c2VyaG9tZSA9IGpvaW4oZGlybmFtZSh1c2VyaG9tZSksIHBhdGhbMTppXSkKKworICAgIHJldHVybiB1c2VyaG9tZSArIHBhdGhbaTpdCisKKworIyBFeHBhbmQgcGF0aHMgY29udGFpbmluZyBzaGVsbCB2YXJpYWJsZSBzdWJzdGl0dXRpb25zLgorIyBUaGUgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgorIyAgICAgICAtIG5vIGV4cGFuc2lvbiB3aXRoaW4gc2luZ2xlIHF1b3RlcworIyAgICAgICAtICckJCcgaXMgdHJhbnNsYXRlZCBpbnRvICckJworIyAgICAgICAtICclJScgaXMgdHJhbnNsYXRlZCBpbnRvICclJyBpZiAnJSUnIGFyZSBub3Qgc2VlbiBpbiAldmFyMSUldmFyMiUKKyMgICAgICAgLSAke3Zhcm5hbWV9IGlzIGFjY2VwdGVkLgorIyAgICAgICAtICR2YXJuYW1lIGlzIGFjY2VwdGVkLgorIyAgICAgICAtICV2YXJuYW1lJSBpcyBhY2NlcHRlZC4KKyMgICAgICAgLSB2YXJuYW1lcyBjYW4gYmUgbWFkZSBvdXQgb2YgbGV0dGVycywgZGlnaXRzIGFuZCB0aGUgY2hhcmFjdGVycyAnXy0nCisjICAgICAgICAgKHRob3VnaCBpcyBub3QgdmVyaWZpZWQgaW4gdGhlICR7dmFybmFtZX0gYW5kICV2YXJuYW1lJSBjYXNlcykKKyMgWFhYIFdpdGggQ09NTUFORC5DT00geW91IGNhbiB1c2UgYW55IGNoYXJhY3RlcnMgaW4gYSB2YXJpYWJsZSBuYW1lLAorIyBYWFggZXhjZXB0ICdefDw+PScuCisKK2RlZiBleHBhbmR2YXJzKHBhdGgpOgorICAgICIiIkV4cGFuZCBzaGVsbCB2YXJpYWJsZXMgb2YgdGhlIGZvcm1zICR2YXIsICR7dmFyfSBhbmQgJXZhciUuCisKKyAgICBVbmtub3duIHZhcmlhYmxlcyBhcmUgbGVmdCB1bmNoYW5nZWQuIiIiCisgICAgaWYgJyQnIG5vdCBpbiBwYXRoIGFuZCAnJScgbm90IGluIHBhdGg6CisgICAgICAgIHJldHVybiBwYXRoCisgICAgaW1wb3J0IHN0cmluZworICAgIHZhcmNoYXJzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzICsgJ18tJworICAgIHJlcyA9ICcnCisgICAgaW5kZXggPSAwCisgICAgcGF0aGxlbiA9IGxlbihwYXRoKQorICAgIHdoaWxlIGluZGV4IDwgcGF0aGxlbjoKKyAgICAgICAgYyA9IHBhdGhbaW5kZXhdCisgICAgICAgIGlmIGMgPT0gJ1wnJzogICAjIG5vIGV4cGFuc2lvbiB3aXRoaW4gc2luZ2xlIHF1b3RlcworICAgICAgICAgICAgcGF0aCA9IHBhdGhbaW5kZXggKyAxOl0KKyAgICAgICAgICAgIHBhdGhsZW4gPSBsZW4ocGF0aCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbmRleCA9IHBhdGguaW5kZXgoJ1wnJykKKyAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAnXCcnICsgcGF0aFs6aW5kZXggKyAxXQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgcGF0aAorICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aGxlbiAtIDEKKyAgICAgICAgZWxpZiBjID09ICclJzogICMgdmFyaWFibGUgb3IgJyUnCisgICAgICAgICAgICBpZiBwYXRoW2luZGV4ICsgMTppbmRleCArIDJdID09ICclJzoKKyAgICAgICAgICAgICAgICByZXMgPSByZXMgKyBjCisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGhbaW5kZXgrMTpdCisgICAgICAgICAgICAgICAgcGF0aGxlbiA9IGxlbihwYXRoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4KCclJykKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgJyUnICsgcGF0aAorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBhdGhsZW4gLSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdmFyID0gcGF0aFs6aW5kZXhdCisgICAgICAgICAgICAgICAgICAgIGlmIHZhciBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgb3MuZW52aXJvblt2YXJdCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAnJScgKyB2YXIgKyAnJScKKyAgICAgICAgZWxpZiBjID09ICckJzogICMgdmFyaWFibGUgb3IgJyQkJworICAgICAgICAgICAgaWYgcGF0aFtpbmRleCArIDE6aW5kZXggKyAyXSA9PSAnJCc6CisgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgYworICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgICAgICAgICBlbGlmIHBhdGhbaW5kZXggKyAxOmluZGV4ICsgMl0gPT0gJ3snOgorICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoW2luZGV4KzI6XQorICAgICAgICAgICAgICAgIHBhdGhsZW4gPSBsZW4ocGF0aCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0aC5pbmRleCgnfScpCisgICAgICAgICAgICAgICAgICAgIHZhciA9IHBhdGhbOmluZGV4XQorICAgICAgICAgICAgICAgICAgICBpZiB2YXIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIG9zLmVudmlyb25bdmFyXQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcmVzICsgJyR7JyArIHZhciArICd9JworICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMgKyAnJHsnICsgcGF0aAorICAgICAgICAgICAgICAgICAgICBpbmRleCA9IHBhdGhsZW4gLSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhciA9ICcnCisgICAgICAgICAgICAgICAgaW5kZXggPSBpbmRleCArIDEKKyAgICAgICAgICAgICAgICBjID0gcGF0aFtpbmRleDppbmRleCArIDFdCisgICAgICAgICAgICAgICAgd2hpbGUgYyAhPSAnJyBhbmQgYyBpbiB2YXJjaGFyczoKKyAgICAgICAgICAgICAgICAgICAgdmFyID0gdmFyICsgYworICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMQorICAgICAgICAgICAgICAgICAgICBjID0gcGF0aFtpbmRleDppbmRleCArIDFdCisgICAgICAgICAgICAgICAgaWYgdmFyIGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArIG9zLmVudmlyb25bdmFyXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICckJyArIHZhcgorICAgICAgICAgICAgICAgIGlmIGMgIT0gJyc6CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW5kZXggLSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXMgPSByZXMgKyBjCisgICAgICAgIGluZGV4ID0gaW5kZXggKyAxCisgICAgcmV0dXJuIHJlcworCisKKyMgTm9ybWFsaXplIGEgcGF0aCwgZS5nLiBBLy9CLCBBLy4vQiBhbmQgQS9mb28vLi4vQiBhbGwgYmVjb21lIEFcQi4KKyMgUHJldmlvdXNseSwgdGhpcyBmdW5jdGlvbiBhbHNvIHRydW5jYXRlZCBwYXRobmFtZXMgdG8gOCszIGZvcm1hdCwKKyMgYnV0IGFzIHRoaXMgbW9kdWxlIGlzIGNhbGxlZCAibnRwYXRoIiwgdGhhdCdzIG9idmlvdXNseSB3cm9uZyEKKworZGVmIG5vcm1wYXRoKHBhdGgpOgorICAgICIiIk5vcm1hbGl6ZSBwYXRoLCBlbGltaW5hdGluZyBkb3VibGUgc2xhc2hlcywgZXRjLiIiIgorICAgICMgUHJlc2VydmUgdW5pY29kZSAoaWYgcGF0aCBpcyB1bmljb2RlKQorICAgIGJhY2tzbGFzaCwgZG90ID0gKHUnXFwnLCB1Jy4nKSBpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpIGVsc2UgKCdcXCcsICcuJykKKyAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoKCdcXFxcLlxcJywgJ1xcXFw/XFwnKSk6CisgICAgICAgICMgaW4gdGhlIGNhc2Ugb2YgcGF0aHMgd2l0aCB0aGVzZSBwcmVmaXhlczoKKyAgICAgICAgIyBcXC5cIC0+IGRldmljZSBuYW1lcworICAgICAgICAjIFxcP1wgLT4gbGl0ZXJhbCBwYXRocworICAgICAgICAjIGRvIG5vdCBkbyBhbnkgbm9ybWFsaXphdGlvbiwgYnV0IHJldHVybiB0aGUgcGF0aCB1bmNoYW5nZWQKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBwYXRoID0gcGF0aC5yZXBsYWNlKCIvIiwgIlxcIikKKyAgICBwcmVmaXgsIHBhdGggPSBzcGxpdGRyaXZlKHBhdGgpCisgICAgIyBXZSBuZWVkIHRvIGJlIGNhcmVmdWwgaGVyZS4gSWYgdGhlIHByZWZpeCBpcyBlbXB0eSwgYW5kIHRoZSBwYXRoIHN0YXJ0cworICAgICMgd2l0aCBhIGJhY2tzbGFzaCwgaXQgY291bGQgZWl0aGVyIGJlIGFuIGFic29sdXRlIHBhdGggb24gdGhlIGN1cnJlbnQKKyAgICAjIGRyaXZlIChcZGlyMVxkaXIyXGZpbGUpIG9yIGEgVU5DIGZpbGVuYW1lIChcXHNlcnZlclxtb3VudFxkaXIxXGZpbGUpLiBJdAorICAgICMgaXMgdGhlcmVmb3JlIGltcGVyYXRpdmUgTk9UIHRvIGNvbGxhcHNlIG11bHRpcGxlIGJhY2tzbGFzaGVzIGJsaW5kbHkgaW4KKyAgICAjIHRoYXQgY2FzZS4KKyAgICAjIFRoZSBjb2RlIGJlbG93IHByZXNlcnZlcyBtdWx0aXBsZSBiYWNrc2xhc2hlcyB3aGVuIHRoZXJlIGlzIG5vIGRyaXZlCisgICAgIyBsZXR0ZXIuIFRoaXMgbWVhbnMgdGhhdCB0aGUgaW52YWxpZCBmaWxlbmFtZSBcXFxhXGIgaXMgcHJlc2VydmVkCisgICAgIyB1bmNoYW5nZWQsIHdoZXJlIGFcXFxiIGlzIG5vcm1hbGlzZWQgdG8gYVxiLiBJdCdzIG5vdCBjbGVhciB0aGF0IHRoZXJlCisgICAgIyBpcyBhbnkgYmV0dGVyIGJlaGF2aW91ciBmb3Igc3VjaCBlZGdlIGNhc2VzLgorICAgIGlmIHByZWZpeCA9PSAnJzoKKyAgICAgICAgIyBObyBkcml2ZSBsZXR0ZXIgLSBwcmVzZXJ2ZSBpbml0aWFsIGJhY2tzbGFzaGVzCisgICAgICAgIHdoaWxlIHBhdGhbOjFdID09ICJcXCI6CisgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyBiYWNrc2xhc2gKKyAgICAgICAgICAgIHBhdGggPSBwYXRoWzE6XQorICAgIGVsc2U6CisgICAgICAgICMgV2UgaGF2ZSBhIGRyaXZlIGxldHRlciAtIGNvbGxhcHNlIGluaXRpYWwgYmFja3NsYXNoZXMKKyAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCJcXCIpOgorICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4ICsgYmFja3NsYXNoCisgICAgICAgICAgICBwYXRoID0gcGF0aC5sc3RyaXAoIlxcIikKKyAgICBjb21wcyA9IHBhdGguc3BsaXQoIlxcIikKKyAgICBpID0gMAorICAgIHdoaWxlIGkgPCBsZW4oY29tcHMpOgorICAgICAgICBpZiBjb21wc1tpXSBpbiAoJy4nLCAnJyk6CisgICAgICAgICAgICBkZWwgY29tcHNbaV0KKyAgICAgICAgZWxpZiBjb21wc1tpXSA9PSAnLi4nOgorICAgICAgICAgICAgaWYgaSA+IDAgYW5kIGNvbXBzW2ktMV0gIT0gJy4uJzoKKyAgICAgICAgICAgICAgICBkZWwgY29tcHNbaS0xOmkrMV0KKyAgICAgICAgICAgICAgICBpIC09IDEKKyAgICAgICAgICAgIGVsaWYgaSA9PSAwIGFuZCBwcmVmaXguZW5kc3dpdGgoIlxcIik6CisgICAgICAgICAgICAgICAgZGVsIGNvbXBzW2ldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaSArPSAxCisgICAgIyBJZiB0aGUgcGF0aCBpcyBub3cgZW1wdHksIHN1YnN0aXR1dGUgJy4nCisgICAgaWYgbm90IHByZWZpeCBhbmQgbm90IGNvbXBzOgorICAgICAgICBjb21wcy5hcHBlbmQoZG90KQorICAgIHJldHVybiBwcmVmaXggKyBiYWNrc2xhc2guam9pbihjb21wcykKKworCisjIFJldHVybiBhbiBhYnNvbHV0ZSBwYXRoLgordHJ5OgorICAgIGZyb20gbnQgaW1wb3J0IF9nZXRmdWxscGF0aG5hbWUKKworZXhjZXB0IEltcG9ydEVycm9yOiAjIG5vdCBydW5uaW5nIG9uIFdpbmRvd3MgLSBtb2NrIHVwIHNvbWV0aGluZyBzZW5zaWJsZQorICAgIGRlZiBhYnNwYXRoKHBhdGgpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGFic29sdXRlIHZlcnNpb24gb2YgYSBwYXRoLiIiIgorICAgICAgICBpZiBub3QgaXNhYnMocGF0aCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZHUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICAgICAgcGF0aCA9IGpvaW4oY3dkLCBwYXRoKQorICAgICAgICByZXR1cm4gbm9ybXBhdGgocGF0aCkKKworZWxzZTogICMgdXNlIG5hdGl2ZSBXaW5kb3dzIG1ldGhvZCBvbiBXaW5kb3dzCisgICAgZGVmIGFic3BhdGgocGF0aCk6CisgICAgICAgICIiIlJldHVybiB0aGUgYWJzb2x1dGUgdmVyc2lvbiBvZiBhIHBhdGguIiIiCisKKyAgICAgICAgaWYgcGF0aDogIyBFbXB0eSBwYXRoIG11c3QgcmV0dXJuIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGF0aCA9IF9nZXRmdWxscGF0aG5hbWUocGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcyAjIEJhZCBwYXRoIC0gcmV0dXJuIHVuY2hhbmdlZC4KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHBhdGgsIHVuaWNvZGUpOgorICAgICAgICAgICAgcGF0aCA9IG9zLmdldGN3ZHUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IG9zLmdldGN3ZCgpCisgICAgICAgIHJldHVybiBub3JtcGF0aChwYXRoKQorCisjIHJlYWxwYXRoIGlzIGEgbm8tb3Agb24gc3lzdGVtcyB3aXRob3V0IGlzbGluayBzdXBwb3J0CityZWFscGF0aCA9IGFic3BhdGgKKyMgV2luOXggZmFtaWx5IGFuZCBlYXJsaWVyIGhhdmUgbm8gVW5pY29kZSBmaWxlbmFtZSBzdXBwb3J0Lgorc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgPSAoaGFzYXR0cihzeXMsICJnZXR3aW5kb3dzdmVyc2lvbiIpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldHdpbmRvd3N2ZXJzaW9uKClbM10gPj0gMikKKworZGVmIF9hYnNwYXRoX3NwbGl0KHBhdGgpOgorICAgIGFicyA9IGFic3BhdGgobm9ybXBhdGgocGF0aCkpCisgICAgcHJlZml4LCByZXN0ID0gc3BsaXR1bmMoYWJzKQorICAgIGlzX3VuYyA9IGJvb2wocHJlZml4KQorICAgIGlmIG5vdCBpc191bmM6CisgICAgICAgIHByZWZpeCwgcmVzdCA9IHNwbGl0ZHJpdmUoYWJzKQorICAgIHJldHVybiBpc191bmMsIHByZWZpeCwgW3ggZm9yIHggaW4gcmVzdC5zcGxpdChzZXApIGlmIHhdCisKK2RlZiByZWxwYXRoKHBhdGgsIHN0YXJ0PWN1cmRpcik6CisgICAgIiIiUmV0dXJuIGEgcmVsYXRpdmUgdmVyc2lvbiBvZiBhIHBhdGgiIiIKKworICAgIGlmIG5vdCBwYXRoOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBwYXRoIHNwZWNpZmllZCIpCisKKyAgICBzdGFydF9pc191bmMsIHN0YXJ0X3ByZWZpeCwgc3RhcnRfbGlzdCA9IF9hYnNwYXRoX3NwbGl0KHN0YXJ0KQorICAgIHBhdGhfaXNfdW5jLCBwYXRoX3ByZWZpeCwgcGF0aF9saXN0ID0gX2Fic3BhdGhfc3BsaXQocGF0aCkKKworICAgIGlmIHBhdGhfaXNfdW5jIF4gc3RhcnRfaXNfdW5jOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJDYW5ub3QgbWl4IFVOQyBhbmQgbm9uLVVOQyBwYXRocyAoJXMgYW5kICVzKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHBhdGgsIHN0YXJ0KSkKKyAgICBpZiBwYXRoX3ByZWZpeC5sb3dlcigpICE9IHN0YXJ0X3ByZWZpeC5sb3dlcigpOgorICAgICAgICBpZiBwYXRoX2lzX3VuYzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInBhdGggaXMgb24gVU5DIHJvb3QgJXMsIHN0YXJ0IG9uIFVOQyByb290ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAocGF0aF9wcmVmaXgsIHN0YXJ0X3ByZWZpeCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwYXRoIGlzIG9uIGRyaXZlICVzLCBzdGFydCBvbiBkcml2ZSAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHBhdGhfcHJlZml4LCBzdGFydF9wcmVmaXgpKQorICAgICMgV29yayBvdXQgaG93IG11Y2ggb2YgdGhlIGZpbGVwYXRoIGlzIHNoYXJlZCBieSBzdGFydCBhbmQgcGF0aC4KKyAgICBpID0gMAorICAgIGZvciBlMSwgZTIgaW4gemlwKHN0YXJ0X2xpc3QsIHBhdGhfbGlzdCk6CisgICAgICAgIGlmIGUxLmxvd2VyKCkgIT0gZTIubG93ZXIoKToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGkgKz0gMQorCisgICAgcmVsX2xpc3QgPSBbcGFyZGlyXSAqIChsZW4oc3RhcnRfbGlzdCktaSkgKyBwYXRoX2xpc3RbaTpdCisgICAgaWYgbm90IHJlbF9saXN0OgorICAgICAgICByZXR1cm4gY3VyZGlyCisgICAgcmV0dXJuIGpvaW4oKnJlbF9saXN0KQorCit0cnk6CisgICAgIyBUaGUgZ2VuZXJpY3BhdGguaXNkaXIgaW1wbGVtZW50YXRpb24gdXNlcyBvcy5zdGF0IGFuZCBjaGVja3MgdGhlIG1vZGUKKyAgICAjIGF0dHJpYnV0ZSB0byB0ZWxsIHdoZXRoZXIgb3Igbm90IHRoZSBwYXRoIGlzIGEgZGlyZWN0b3J5LgorICAgICMgVGhpcyBpcyBvdmVya2lsbCBvbiBXaW5kb3dzIC0ganVzdCBwYXNzIHRoZSBwYXRoIHRvIEdldEZpbGVBdHRyaWJ1dGVzCisgICAgIyBhbmQgY2hlY2sgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZXJlLgorICAgIGZyb20gbnQgaW1wb3J0IF9pc2RpciBhcyBpc2RpcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgVXNlIGdlbmVyaWNwYXRoLmlzZGlyIGFzIGltcG9ydGVkIGFib3ZlLgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbnRwYXRoLnB5YyBiL2xpYi9weXRob24yLjcvbnRwYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjY0YzJiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9udHBhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbnRwYXRoLnB5byBiL2xpYi9weXRob24yLjcvbnRwYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTg2YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9udHBhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvbnR1cmwycGF0aC5weSBiL2xpYi9weXRob24yLjcvbnR1cmwycGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGVhMjcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9udHVybDJwYXRoLnB5CkBAIC0wLDAgKzEsNjYgQEAKKyIiIkNvbnZlcnQgYSBOVCBwYXRobmFtZSB0byBhIGZpbGUgVVJMIGFuZCB2aWNlIHZlcnNhLiIiIgorCitkZWYgdXJsMnBhdGhuYW1lKHVybCk6CisgICAgIiIiT1Mtc3BlY2lmaWMgY29udmVyc2lvbiBmcm9tIGEgcmVsYXRpdmUgVVJMIG9mIHRoZSAnZmlsZScgc2NoZW1lCisgICAgdG8gYSBmaWxlIHN5c3RlbSBwYXRoOyBub3QgcmVjb21tZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiIiIgorICAgICMgZS5nLgorICAgICMgLy8vQ3wvZm9vL2Jhci9zcGFtLmZvbworICAgICMgYmVjb21lcworICAgICMgQzpcZm9vXGJhclxzcGFtLmZvbworICAgIGltcG9ydCBzdHJpbmcsIHVybGxpYgorICAgICMgV2luZG93cyBpdHNlbGYgdXNlcyAiOiIgZXZlbiBpbiBVUkxzLgorICAgIHVybCA9IHVybC5yZXBsYWNlKCc6JywgJ3wnKQorICAgIGlmIG5vdCAnfCcgaW4gdXJsOgorICAgICAgICAjIE5vIGRyaXZlIHNwZWNpZmllciwganVzdCBjb252ZXJ0IHNsYXNoZXMKKyAgICAgICAgaWYgdXJsWzo0XSA9PSAnLy8vLyc6CisgICAgICAgICAgICAjIHBhdGggaXMgc29tZXRoaW5nIGxpa2UgLy8vL2hvc3QvcGF0aC9vbi9yZW1vdGUvaG9zdAorICAgICAgICAgICAgIyBjb252ZXJ0IHRoaXMgdG8gXFxob3N0XHBhdGhcb25ccmVtb3RlXGhvc3QKKyAgICAgICAgICAgICMgKG5vdGljZSBoYWx2aW5nIG9mIHNsYXNoZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXRoKQorICAgICAgICAgICAgdXJsID0gdXJsWzI6XQorICAgICAgICBjb21wb25lbnRzID0gdXJsLnNwbGl0KCcvJykKKyAgICAgICAgIyBtYWtlIHN1cmUgbm90IHRvIGNvbnZlcnQgcXVvdGVkIHNsYXNoZXMgOi0pCisgICAgICAgIHJldHVybiB1cmxsaWIudW5xdW90ZSgnXFwnLmpvaW4oY29tcG9uZW50cykpCisgICAgY29tcCA9IHVybC5zcGxpdCgnfCcpCisgICAgaWYgbGVuKGNvbXApICE9IDIgb3IgY29tcFswXVstMV0gbm90IGluIHN0cmluZy5hc2NpaV9sZXR0ZXJzOgorICAgICAgICBlcnJvciA9ICdCYWQgVVJMOiAnICsgdXJsCisgICAgICAgIHJhaXNlIElPRXJyb3IsIGVycm9yCisgICAgZHJpdmUgPSBjb21wWzBdWy0xXS51cHBlcigpCisgICAgcGF0aCA9IGRyaXZlICsgJzonCisgICAgY29tcG9uZW50cyA9IGNvbXBbMV0uc3BsaXQoJy8nKQorICAgIGZvciBjb21wIGluIGNvbXBvbmVudHM6CisgICAgICAgIGlmIGNvbXA6CisgICAgICAgICAgICBwYXRoID0gcGF0aCArICdcXCcgKyB1cmxsaWIudW5xdW90ZShjb21wKQorICAgICMgSXNzdWUgIzExNDc0OiB1cmwgbGlrZSAnL0N8Lycgc2hvdWxkIGNvbnZlcnQgaW50byAnQzpcXCcKKyAgICBpZiBwYXRoLmVuZHN3aXRoKCc6JykgYW5kIHVybC5lbmRzd2l0aCgnLycpOgorICAgICAgICBwYXRoICs9ICdcXCcKKyAgICByZXR1cm4gcGF0aAorCitkZWYgcGF0aG5hbWUydXJsKHApOgorICAgICIiIk9TLXNwZWNpZmljIGNvbnZlcnNpb24gZnJvbSBhIGZpbGUgc3lzdGVtIHBhdGggdG8gYSByZWxhdGl2ZSBVUkwKKyAgICBvZiB0aGUgJ2ZpbGUnIHNjaGVtZTsgbm90IHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZS4iIiIKKyAgICAjIGUuZy4KKyAgICAjIEM6XGZvb1xiYXJcc3BhbS5mb28KKyAgICAjIGJlY29tZXMKKyAgICAjIC8vL0N8L2Zvby9iYXIvc3BhbS5mb28KKyAgICBpbXBvcnQgdXJsbGliCisgICAgaWYgbm90ICc6JyBpbiBwOgorICAgICAgICAjIE5vIGRyaXZlIHNwZWNpZmllciwganVzdCBjb252ZXJ0IHNsYXNoZXMgYW5kIHF1b3RlIHRoZSBuYW1lCisgICAgICAgIGlmIHBbOjJdID09ICdcXFxcJzoKKyAgICAgICAgIyBwYXRoIGlzIHNvbWV0aGluZyBsaWtlIFxcaG9zdFxwYXRoXG9uXHJlbW90ZVxob3N0CisgICAgICAgICMgY29udmVydCB0aGlzIHRvIC8vLy9ob3N0L3BhdGgvb24vcmVtb3RlL2hvc3QKKyAgICAgICAgIyAobm90aWNlIGRvdWJsaW5nIG9mIHNsYXNoZXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBwYXRoKQorICAgICAgICAgICAgcCA9ICdcXFxcJyArIHAKKyAgICAgICAgY29tcG9uZW50cyA9IHAuc3BsaXQoJ1xcJykKKyAgICAgICAgcmV0dXJuIHVybGxpYi5xdW90ZSgnLycuam9pbihjb21wb25lbnRzKSkKKyAgICBjb21wID0gcC5zcGxpdCgnOicpCisgICAgaWYgbGVuKGNvbXApICE9IDIgb3IgbGVuKGNvbXBbMF0pID4gMToKKyAgICAgICAgZXJyb3IgPSAnQmFkIHBhdGg6ICcgKyBwCisgICAgICAgIHJhaXNlIElPRXJyb3IsIGVycm9yCisKKyAgICBkcml2ZSA9IHVybGxpYi5xdW90ZShjb21wWzBdLnVwcGVyKCkpCisgICAgY29tcG9uZW50cyA9IGNvbXBbMV0uc3BsaXQoJ1xcJykKKyAgICBwYXRoID0gJy8vLycgKyBkcml2ZSArICc6JworICAgIGZvciBjb21wIGluIGNvbXBvbmVudHM6CisgICAgICAgIGlmIGNvbXA6CisgICAgICAgICAgICBwYXRoID0gcGF0aCArICcvJyArIHVybGxpYi5xdW90ZShjb21wKQorICAgIHJldHVybiBwYXRoCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L250dXJsMnBhdGgucHljIGIvbGliL3B5dGhvbjIuNy9udHVybDJwYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTdhNTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9udHVybDJwYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L250dXJsMnBhdGgucHlvIGIvbGliL3B5dGhvbjIuNy9udHVybDJwYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTdhNTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9udHVybDJwYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L251bWJlcnMucHkgYi9saWIvcHl0aG9uMi43L251bWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRjNmRkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnVtYmVycy5weQpAQCAtMCwwICsxLDM5MSBAQAorIyBDb3B5cmlnaHQgMjAwNyBHb29nbGUsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCisiIiJBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpIGZvciBudW1iZXJzLCBhY2NvcmRpbmcgdG8gUEVQIDMxNDEuCisKK1RPRE86IEZpbGwgb3V0IG1vcmUgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvbiB0aGUgb3BlcmF0b3JzLiIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIGFiYyBpbXBvcnQgQUJDTWV0YSwgYWJzdHJhY3RtZXRob2QsIGFic3RyYWN0cHJvcGVydHkKKworX19hbGxfXyA9IFsiTnVtYmVyIiwgIkNvbXBsZXgiLCAiUmVhbCIsICJSYXRpb25hbCIsICJJbnRlZ3JhbCJdCisKK2NsYXNzIE51bWJlcihvYmplY3QpOgorICAgICIiIkFsbCBudW1iZXJzIGluaGVyaXQgZnJvbSB0aGlzIGNsYXNzLgorCisgICAgSWYgeW91IGp1c3Qgd2FudCB0byBjaGVjayBpZiBhbiBhcmd1bWVudCB4IGlzIGEgbnVtYmVyLCB3aXRob3V0CisgICAgY2FyaW5nIHdoYXQga2luZCwgdXNlIGlzaW5zdGFuY2UoeCwgTnVtYmVyKS4KKyAgICAiIiIKKyAgICBfX21ldGFjbGFzc19fID0gQUJDTWV0YQorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICAjIENvbmNyZXRlIG51bWVyaWMgdHlwZXMgbXVzdCBwcm92aWRlIHRoZWlyIG93biBoYXNoIGltcGxlbWVudGF0aW9uCisgICAgX19oYXNoX18gPSBOb25lCisKKworIyMgTm90ZXMgb24gRGVjaW1hbAorIyMgLS0tLS0tLS0tLS0tLS0tLQorIyMgRGVjaW1hbCBoYXMgYWxsIG9mIHRoZSBtZXRob2RzIHNwZWNpZmllZCBieSB0aGUgUmVhbCBhYmMsIGJ1dCBpdCBzaG91bGQKKyMjIG5vdCBiZSByZWdpc3RlcmVkIGFzIGEgUmVhbCBiZWNhdXNlIGRlY2ltYWxzIGRvIG5vdCBpbnRlcm9wZXJhdGUgd2l0aAorIyMgYmluYXJ5IGZsb2F0cyAoaS5lLiAgRGVjaW1hbCgnMy4xNCcpICsgMi43MTgyOCBpcyB1bmRlZmluZWQpLiAgQnV0LAorIyMgYWJzdHJhY3QgcmVhbHMgYXJlIGV4cGVjdGVkIHRvIGludGVyb3BlcmF0ZSAoaS5lLiBSMSArIFIyIHNob3VsZCBiZQorIyMgZXhwZWN0ZWQgdG8gd29yayBpZiBSMSBhbmQgUjIgYXJlIGJvdGggUmVhbHMpLgorCitjbGFzcyBDb21wbGV4KE51bWJlcik6CisgICAgIiIiQ29tcGxleCBkZWZpbmVzIHRoZSBvcGVyYXRpb25zIHRoYXQgd29yayBvbiB0aGUgYnVpbHRpbiBjb21wbGV4IHR5cGUuCisKKyAgICBJbiBzaG9ydCwgdGhvc2UgYXJlOiBhIGNvbnZlcnNpb24gdG8gY29tcGxleCwgLnJlYWwsIC5pbWFnLCArLCAtLAorICAgICosIC8sIGFicygpLCAuY29uanVnYXRlLCA9PSwgYW5kICE9LgorCisgICAgSWYgaXQgaXMgZ2l2ZW4gaGV0ZXJvZ2Vub3VzIGFyZ3VtZW50cywgYW5kIGRvZXNuJ3QgaGF2ZSBzcGVjaWFsCisgICAga25vd2xlZGdlIGFib3V0IHRoZW0sIGl0IHNob3VsZCBmYWxsIGJhY2sgdG8gdGhlIGJ1aWx0aW4gY29tcGxleAorICAgIHR5cGUgYXMgZGVzY3JpYmVkIGJlbG93LgorICAgICIiIgorCisgICAgX19zbG90c19fID0gKCkKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgYnVpbHRpbiBjb21wbGV4IGluc3RhbmNlLiBDYWxsZWQgZm9yIGNvbXBsZXgoc2VsZikuIiIiCisKKyAgICAjIFdpbGwgYmUgX19ib29sX18gaW4gMy4wLgorICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgIiIiVHJ1ZSBpZiBzZWxmICE9IDAuIENhbGxlZCBmb3IgYm9vbChzZWxmKS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYgIT0gMAorCisgICAgQGFic3RyYWN0cHJvcGVydHkKKyAgICBkZWYgcmVhbChzZWxmKToKKyAgICAgICAgIiIiUmV0cmlldmUgdGhlIHJlYWwgY29tcG9uZW50IG9mIHRoaXMgbnVtYmVyLgorCisgICAgICAgIFRoaXMgc2hvdWxkIHN1YmNsYXNzIFJlYWwuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3Rwcm9wZXJ0eQorICAgIGRlZiBpbWFnKHNlbGYpOgorICAgICAgICAiIiJSZXRyaWV2ZSB0aGUgaW1hZ2luYXJ5IGNvbXBvbmVudCBvZiB0aGlzIG51bWJlci4KKworICAgICAgICBUaGlzIHNob3VsZCBzdWJjbGFzcyBSZWFsLgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmICsgb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgKyBzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX25lZ19fKHNlbGYpOgorICAgICAgICAiIiItc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19wb3NfXyhzZWxmKToKKyAgICAgICAgIiIiK3NlbGYiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmIC0gb3RoZXIiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYgKyAtb3RoZXIKKworICAgIGRlZiBfX3JzdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyIC0gc2VsZiIiIgorICAgICAgICByZXR1cm4gLXNlbGYgKyBvdGhlcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmICogb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgKiBzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2Rpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiAvIG90aGVyIHdpdGhvdXQgX19mdXR1cmVfXyBkaXZpc2lvbgorCisgICAgICAgIE1heSBwcm9tb3RlIHRvIGZsb2F0LgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgLyBzZWxmIHdpdGhvdXQgX19mdXR1cmVfXyBkaXZpc2lvbiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX190cnVlZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmIC8gb3RoZXIgd2l0aCBfX2Z1dHVyZV9fIGRpdmlzaW9uLgorCisgICAgICAgIFNob3VsZCBwcm9tb3RlIHRvIGZsb2F0IHdoZW4gbmVjZXNzYXJ5LgorICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcnRydWVkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyIC8gc2VsZiB3aXRoIF9fZnV0dXJlX18gZGl2aXNpb24iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcG93X18oc2VsZiwgZXhwb25lbnQpOgorICAgICAgICAiIiJzZWxmKipleHBvbmVudDsgc2hvdWxkIHByb21vdGUgdG8gZmxvYXQgb3IgY29tcGxleCB3aGVuIG5lY2Vzc2FyeS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcnBvd19fKHNlbGYsIGJhc2UpOgorICAgICAgICAiIiJiYXNlICoqIHNlbGYiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fYWJzX18oc2VsZik6CisgICAgICAgICIiIlJldHVybnMgdGhlIFJlYWwgZGlzdGFuY2UgZnJvbSAwLiBDYWxsZWQgZm9yIGFicyhzZWxmKS4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIGNvbmp1Z2F0ZShzZWxmKToKKyAgICAgICAgIiIiKHgreSppKS5jb25qdWdhdGUoKSByZXR1cm5zICh4LXkqaSkuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmID09IG90aGVyIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmICE9IG90aGVyIiIiCisgICAgICAgICMgVGhlIGRlZmF1bHQgX19uZV9fIGRvZXNuJ3QgbmVnYXRlIF9fZXFfXyB1bnRpbCAzLjAuCisgICAgICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK0NvbXBsZXgucmVnaXN0ZXIoY29tcGxleCkKKworCitjbGFzcyBSZWFsKENvbXBsZXgpOgorICAgICIiIlRvIENvbXBsZXgsIFJlYWwgYWRkcyB0aGUgb3BlcmF0aW9ucyB0aGF0IHdvcmsgb24gcmVhbCBudW1iZXJzLgorCisgICAgSW4gc2hvcnQsIHRob3NlIGFyZTogYSBjb252ZXJzaW9uIHRvIGZsb2F0LCB0cnVuYygpLCBkaXZtb2QsCisgICAgJSwgPCwgPD0sID4sIGFuZCA+PS4KKworICAgIFJlYWwgYWxzbyBwcm92aWRlcyBkZWZhdWx0cyBmb3IgdGhlIGRlcml2ZWQgb3BlcmF0aW9ucy4KKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAiIiJBbnkgUmVhbCBjYW4gYmUgY29udmVydGVkIHRvIGEgbmF0aXZlIGZsb2F0IG9iamVjdC4KKworICAgICAgICBDYWxsZWQgZm9yIGZsb2F0KHNlbGYpLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX190cnVuY19fKHNlbGYpOgorICAgICAgICAiIiJ0cnVuYyhzZWxmKTogVHJ1bmNhdGVzIHNlbGYgdG8gYW4gSW50ZWdyYWwuCisKKyAgICAgICAgUmV0dXJucyBhbiBJbnRlZ3JhbCBpIHN1Y2ggdGhhdDoKKyAgICAgICAgICAqIGk+MCBpZmYgc2VsZj4wOworICAgICAgICAgICogYWJzKGkpIDw9IGFicyhzZWxmKTsKKyAgICAgICAgICAqIGZvciBhbnkgSW50ZWdyYWwgaiBzYXRpc2Z5aW5nIHRoZSBmaXJzdCB0d28gY29uZGl0aW9ucywKKyAgICAgICAgICAgIGFicyhpKSA+PSBhYnMoaikgW2kuZS4gaSBoYXMgIm1heGltYWwiIGFicyBhbW9uZyB0aG9zZV0uCisgICAgICAgIGkuZS4gInRydW5jYXRlIHRvd2FyZHMgMCIuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgX19kaXZtb2RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiImRpdm1vZChzZWxmLCBvdGhlcik6IFRoZSBwYWlyIChzZWxmIC8vIG90aGVyLCBzZWxmICUgb3RoZXIpLgorCisgICAgICAgIFNvbWV0aW1lcyB0aGlzIGNhbiBiZSBjb21wdXRlZCBmYXN0ZXIgdGhhbiB0aGUgcGFpciBvZgorICAgICAgICBvcGVyYXRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIChzZWxmIC8vIG90aGVyLCBzZWxmICUgb3RoZXIpCisKKyAgICBkZWYgX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJkaXZtb2Qob3RoZXIsIHNlbGYpOiBUaGUgcGFpciAoc2VsZiAvLyBvdGhlciwgc2VsZiAlIG90aGVyKS4KKworICAgICAgICBTb21ldGltZXMgdGhpcyBjYW4gYmUgY29tcHV0ZWQgZmFzdGVyIHRoYW4gdGhlIHBhaXIgb2YKKyAgICAgICAgb3BlcmF0aW9ucy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAob3RoZXIgLy8gc2VsZiwgb3RoZXIgJSBzZWxmKQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgLy8gb3RoZXI6IFRoZSBmbG9vcigpIG9mIHNlbGYvb3RoZXIuIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgLy8gc2VsZjogVGhlIGZsb29yKCkgb2Ygb3RoZXIvc2VsZi4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fbW9kX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmICUgb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcm1vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIib3RoZXIgJSBzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJzZWxmIDwgb3RoZXIKKworICAgICAgICA8IG9uIFJlYWxzIGRlZmluZXMgYSB0b3RhbCBvcmRlcmluZywgZXhjZXB0IHBlcmhhcHMgZm9yIE5hTi4iIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgPD0gb3RoZXIiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgIyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgQ29tcGxleCBhYnN0cmFjdCBtZXRob2RzLgorICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgIiIiY29tcGxleChzZWxmKSA9PSBjb21wbGV4KGZsb2F0KHNlbGYpLCAwKSIiIgorICAgICAgICByZXR1cm4gY29tcGxleChmbG9hdChzZWxmKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiByZWFsKHNlbGYpOgorICAgICAgICAiIiJSZWFsIG51bWJlcnMgYXJlIHRoZWlyIHJlYWwgY29tcG9uZW50LiIiIgorICAgICAgICByZXR1cm4gK3NlbGYKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBpbWFnKHNlbGYpOgorICAgICAgICAiIiJSZWFsIG51bWJlcnMgaGF2ZSBubyBpbWFnaW5hcnkgY29tcG9uZW50LiIiIgorICAgICAgICByZXR1cm4gMAorCisgICAgZGVmIGNvbmp1Z2F0ZShzZWxmKToKKyAgICAgICAgIiIiQ29uanVnYXRlIGlzIGEgbm8tb3AgZm9yIFJlYWxzLiIiIgorICAgICAgICByZXR1cm4gK3NlbGYKKworUmVhbC5yZWdpc3RlcihmbG9hdCkKKworCitjbGFzcyBSYXRpb25hbChSZWFsKToKKyAgICAiIiIubnVtZXJhdG9yIGFuZCAuZGVub21pbmF0b3Igc2hvdWxkIGJlIGluIGxvd2VzdCB0ZXJtcy4iIiIKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBAYWJzdHJhY3Rwcm9wZXJ0eQorICAgIGRlZiBudW1lcmF0b3Ioc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdHByb3BlcnR5CisgICAgZGVmIGRlbm9taW5hdG9yKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICAjIENvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIFJlYWwncyBjb252ZXJzaW9uIHRvIGZsb2F0LgorICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICIiImZsb2F0KHNlbGYpID0gc2VsZi5udW1lcmF0b3IgLyBzZWxmLmRlbm9taW5hdG9yCisKKyAgICAgICAgSXQncyBpbXBvcnRhbnQgdGhhdCB0aGlzIGNvbnZlcnNpb24gdXNlIHRoZSBpbnRlZ2VyJ3MgInRydWUiCisgICAgICAgIGRpdmlzaW9uIHJhdGhlciB0aGFuIGNhc3Rpbmcgb25lIHNpZGUgdG8gZmxvYXQgYmVmb3JlIGRpdmlkaW5nCisgICAgICAgIHNvIHRoYXQgcmF0aW9zIG9mIGh1Z2UgaW50ZWdlcnMgY29udmVydCB3aXRob3V0IG92ZXJmbG93aW5nLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5udW1lcmF0b3IgLyBzZWxmLmRlbm9taW5hdG9yCisKKworY2xhc3MgSW50ZWdyYWwoUmF0aW9uYWwpOgorICAgICIiIkludGVncmFsIGFkZHMgYSBjb252ZXJzaW9uIHRvIGxvbmcgYW5kIHRoZSBiaXQtc3RyaW5nIG9wZXJhdGlvbnMuIiIiCisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAiIiJsb25nKHNlbGYpIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgICIiIkNhbGxlZCB3aGVuZXZlciBhbiBpbmRleCBpcyBuZWVkZWQsIHN1Y2ggYXMgaW4gc2xpY2luZyIiIgorICAgICAgICByZXR1cm4gbG9uZyhzZWxmKQorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fcG93X18oc2VsZiwgZXhwb25lbnQsIG1vZHVsdXM9Tm9uZSk6CisgICAgICAgICIiInNlbGYgKiogZXhwb25lbnQgJSBtb2R1bHVzLCBidXQgbWF5YmUgZmFzdGVyLgorCisgICAgICAgIEFjY2VwdCB0aGUgbW9kdWx1cyBhcmd1bWVudCBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoZQorICAgICAgICAzLWFyZ3VtZW50IHZlcnNpb24gb2YgcG93KCkuIFJhaXNlIGEgVHlwZUVycm9yIGlmIGV4cG9uZW50IDwgMAorICAgICAgICBvciBhbnkgYXJndW1lbnQgaXNuJ3QgSW50ZWdyYWwuIE90aGVyd2lzZSwganVzdCBpbXBsZW1lbnQgdGhlCisgICAgICAgIDItYXJndW1lbnQgdmVyc2lvbiBkZXNjcmliZWQgaW4gQ29tcGxleC4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2xzaGlmdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiA8PCBvdGhlciIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJvdGhlciA8PCBzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3JzaGlmdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiA+PiBvdGhlciIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJvdGhlciA+PiBzZWxmIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX2FuZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIic2VsZiAmIG90aGVyIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIEBhYnN0cmFjdG1ldGhvZAorICAgIGRlZiBfX3JhbmRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyICYgc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX194b3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgXiBvdGhlciIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yeG9yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJvdGhlciBeIHNlbGYiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgQGFic3RyYWN0bWV0aG9kCisgICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiInNlbGYgfCBvdGhlciIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19yb3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIm90aGVyIHwgc2VsZiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBAYWJzdHJhY3RtZXRob2QKKyAgICBkZWYgX19pbnZlcnRfXyhzZWxmKToKKyAgICAgICAgIiIifnNlbGYiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgIyBDb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgUmF0aW9uYWwgYW5kIFJlYWwgYWJzdHJhY3QgbWV0aG9kcy4KKyAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAiIiJmbG9hdChzZWxmKSA9PSBmbG9hdChsb25nKHNlbGYpKSIiIgorICAgICAgICByZXR1cm4gZmxvYXQobG9uZyhzZWxmKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBudW1lcmF0b3Ioc2VsZik6CisgICAgICAgICIiIkludGVnZXJzIGFyZSB0aGVpciBvd24gbnVtZXJhdG9ycy4iIiIKKyAgICAgICAgcmV0dXJuICtzZWxmCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgZGVub21pbmF0b3Ioc2VsZik6CisgICAgICAgICIiIkludGVnZXJzIGhhdmUgYSBkZW5vbWluYXRvciBvZiAxLiIiIgorICAgICAgICByZXR1cm4gMQorCitJbnRlZ3JhbC5yZWdpc3RlcihpbnQpCitJbnRlZ3JhbC5yZWdpc3Rlcihsb25nKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9udW1iZXJzLnB5YyBiL2xpYi9weXRob24yLjcvbnVtYmVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxYWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnVtYmVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9udW1iZXJzLnB5byBiL2xpYi9weXRob24yLjcvbnVtYmVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIxYWI3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvbnVtYmVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcGNvZGUucHkgYi9saWIvcHl0aG9uMi43L29wY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDAzMzY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vcGNvZGUucHkKQEAgLTAsMCArMSwxOTIgQEAKKworIiIiCitvcGNvZGUgbW9kdWxlIC0gcG90ZW50aWFsbHkgc2hhcmVkIGJldHdlZW4gZGlzIGFuZCBvdGhlciBtb2R1bGVzIHdoaWNoCitvcGVyYXRlIG9uIGJ5dGVjb2RlcyAoZS5nLiBwZWVwaG9sZSBvcHRpbWl6ZXJzKS4KKyIiIgorCitfX2FsbF9fID0gWyJjbXBfb3AiLCAiaGFzY29uc3QiLCAiaGFzbmFtZSIsICJoYXNqcmVsIiwgImhhc2phYnMiLAorICAgICAgICAgICAiaGFzbG9jYWwiLCAiaGFzY29tcGFyZSIsICJoYXNmcmVlIiwgIm9wbmFtZSIsICJvcG1hcCIsCisgICAgICAgICAgICJIQVZFX0FSR1VNRU5UIiwgIkVYVEVOREVEX0FSRyJdCisKK2NtcF9vcCA9ICgnPCcsICc8PScsICc9PScsICchPScsICc+JywgJz49JywgJ2luJywgJ25vdCBpbicsICdpcycsCisgICAgICAgICdpcyBub3QnLCAnZXhjZXB0aW9uIG1hdGNoJywgJ0JBRCcpCisKK2hhc2NvbnN0ID0gW10KK2hhc25hbWUgPSBbXQoraGFzanJlbCA9IFtdCitoYXNqYWJzID0gW10KK2hhc2xvY2FsID0gW10KK2hhc2NvbXBhcmUgPSBbXQoraGFzZnJlZSA9IFtdCisKK29wbWFwID0ge30KK29wbmFtZSA9IFsnJ10gKiAyNTYKK2ZvciBvcCBpbiByYW5nZSgyNTYpOiBvcG5hbWVbb3BdID0gJzwlcj4nICUgKG9wLCkKK2RlbCBvcAorCitkZWYgZGVmX29wKG5hbWUsIG9wKToKKyAgICBvcG5hbWVbb3BdID0gbmFtZQorICAgIG9wbWFwW25hbWVdID0gb3AKKworZGVmIG5hbWVfb3AobmFtZSwgb3ApOgorICAgIGRlZl9vcChuYW1lLCBvcCkKKyAgICBoYXNuYW1lLmFwcGVuZChvcCkKKworZGVmIGpyZWxfb3AobmFtZSwgb3ApOgorICAgIGRlZl9vcChuYW1lLCBvcCkKKyAgICBoYXNqcmVsLmFwcGVuZChvcCkKKworZGVmIGphYnNfb3AobmFtZSwgb3ApOgorICAgIGRlZl9vcChuYW1lLCBvcCkKKyAgICBoYXNqYWJzLmFwcGVuZChvcCkKKworIyBJbnN0cnVjdGlvbiBvcGNvZGVzIGZvciBjb21waWxlZCBjb2RlCisjIEJsYW5rIGxpbmVzIGNvcnJlc3BvbmQgdG8gYXZhaWxhYmxlIG9wY29kZXMKKworZGVmX29wKCdTVE9QX0NPREUnLCAwKQorZGVmX29wKCdQT1BfVE9QJywgMSkKK2RlZl9vcCgnUk9UX1RXTycsIDIpCitkZWZfb3AoJ1JPVF9USFJFRScsIDMpCitkZWZfb3AoJ0RVUF9UT1AnLCA0KQorZGVmX29wKCdST1RfRk9VUicsIDUpCisKK2RlZl9vcCgnTk9QJywgOSkKK2RlZl9vcCgnVU5BUllfUE9TSVRJVkUnLCAxMCkKK2RlZl9vcCgnVU5BUllfTkVHQVRJVkUnLCAxMSkKK2RlZl9vcCgnVU5BUllfTk9UJywgMTIpCitkZWZfb3AoJ1VOQVJZX0NPTlZFUlQnLCAxMykKKworZGVmX29wKCdVTkFSWV9JTlZFUlQnLCAxNSkKKworZGVmX29wKCdCSU5BUllfUE9XRVInLCAxOSkKK2RlZl9vcCgnQklOQVJZX01VTFRJUExZJywgMjApCitkZWZfb3AoJ0JJTkFSWV9ESVZJREUnLCAyMSkKK2RlZl9vcCgnQklOQVJZX01PRFVMTycsIDIyKQorZGVmX29wKCdCSU5BUllfQUREJywgMjMpCitkZWZfb3AoJ0JJTkFSWV9TVUJUUkFDVCcsIDI0KQorZGVmX29wKCdCSU5BUllfU1VCU0NSJywgMjUpCitkZWZfb3AoJ0JJTkFSWV9GTE9PUl9ESVZJREUnLCAyNikKK2RlZl9vcCgnQklOQVJZX1RSVUVfRElWSURFJywgMjcpCitkZWZfb3AoJ0lOUExBQ0VfRkxPT1JfRElWSURFJywgMjgpCitkZWZfb3AoJ0lOUExBQ0VfVFJVRV9ESVZJREUnLCAyOSkKK2RlZl9vcCgnU0xJQ0UrMCcsIDMwKQorZGVmX29wKCdTTElDRSsxJywgMzEpCitkZWZfb3AoJ1NMSUNFKzInLCAzMikKK2RlZl9vcCgnU0xJQ0UrMycsIDMzKQorCitkZWZfb3AoJ1NUT1JFX1NMSUNFKzAnLCA0MCkKK2RlZl9vcCgnU1RPUkVfU0xJQ0UrMScsIDQxKQorZGVmX29wKCdTVE9SRV9TTElDRSsyJywgNDIpCitkZWZfb3AoJ1NUT1JFX1NMSUNFKzMnLCA0MykKKworZGVmX29wKCdERUxFVEVfU0xJQ0UrMCcsIDUwKQorZGVmX29wKCdERUxFVEVfU0xJQ0UrMScsIDUxKQorZGVmX29wKCdERUxFVEVfU0xJQ0UrMicsIDUyKQorZGVmX29wKCdERUxFVEVfU0xJQ0UrMycsIDUzKQorCitkZWZfb3AoJ1NUT1JFX01BUCcsIDU0KQorZGVmX29wKCdJTlBMQUNFX0FERCcsIDU1KQorZGVmX29wKCdJTlBMQUNFX1NVQlRSQUNUJywgNTYpCitkZWZfb3AoJ0lOUExBQ0VfTVVMVElQTFknLCA1NykKK2RlZl9vcCgnSU5QTEFDRV9ESVZJREUnLCA1OCkKK2RlZl9vcCgnSU5QTEFDRV9NT0RVTE8nLCA1OSkKK2RlZl9vcCgnU1RPUkVfU1VCU0NSJywgNjApCitkZWZfb3AoJ0RFTEVURV9TVUJTQ1InLCA2MSkKK2RlZl9vcCgnQklOQVJZX0xTSElGVCcsIDYyKQorZGVmX29wKCdCSU5BUllfUlNISUZUJywgNjMpCitkZWZfb3AoJ0JJTkFSWV9BTkQnLCA2NCkKK2RlZl9vcCgnQklOQVJZX1hPUicsIDY1KQorZGVmX29wKCdCSU5BUllfT1InLCA2NikKK2RlZl9vcCgnSU5QTEFDRV9QT1dFUicsIDY3KQorZGVmX29wKCdHRVRfSVRFUicsIDY4KQorCitkZWZfb3AoJ1BSSU5UX0VYUFInLCA3MCkKK2RlZl9vcCgnUFJJTlRfSVRFTScsIDcxKQorZGVmX29wKCdQUklOVF9ORVdMSU5FJywgNzIpCitkZWZfb3AoJ1BSSU5UX0lURU1fVE8nLCA3MykKK2RlZl9vcCgnUFJJTlRfTkVXTElORV9UTycsIDc0KQorZGVmX29wKCdJTlBMQUNFX0xTSElGVCcsIDc1KQorZGVmX29wKCdJTlBMQUNFX1JTSElGVCcsIDc2KQorZGVmX29wKCdJTlBMQUNFX0FORCcsIDc3KQorZGVmX29wKCdJTlBMQUNFX1hPUicsIDc4KQorZGVmX29wKCdJTlBMQUNFX09SJywgNzkpCitkZWZfb3AoJ0JSRUFLX0xPT1AnLCA4MCkKK2RlZl9vcCgnV0lUSF9DTEVBTlVQJywgODEpCitkZWZfb3AoJ0xPQURfTE9DQUxTJywgODIpCitkZWZfb3AoJ1JFVFVSTl9WQUxVRScsIDgzKQorZGVmX29wKCdJTVBPUlRfU1RBUicsIDg0KQorZGVmX29wKCdFWEVDX1NUTVQnLCA4NSkKK2RlZl9vcCgnWUlFTERfVkFMVUUnLCA4NikKK2RlZl9vcCgnUE9QX0JMT0NLJywgODcpCitkZWZfb3AoJ0VORF9GSU5BTExZJywgODgpCitkZWZfb3AoJ0JVSUxEX0NMQVNTJywgODkpCisKK0hBVkVfQVJHVU1FTlQgPSA5MCAgICAgICAgICAgICAgIyBPcGNvZGVzIGZyb20gaGVyZSBoYXZlIGFuIGFyZ3VtZW50OgorCituYW1lX29wKCdTVE9SRV9OQU1FJywgOTApICAgICAgICMgSW5kZXggaW4gbmFtZSBsaXN0CituYW1lX29wKCdERUxFVEVfTkFNRScsIDkxKSAgICAgICMgIiIKK2RlZl9vcCgnVU5QQUNLX1NFUVVFTkNFJywgOTIpICAgIyBOdW1iZXIgb2YgdHVwbGUgaXRlbXMKK2pyZWxfb3AoJ0ZPUl9JVEVSJywgOTMpCitkZWZfb3AoJ0xJU1RfQVBQRU5EJywgOTQpCituYW1lX29wKCdTVE9SRV9BVFRSJywgOTUpICAgICAgICMgSW5kZXggaW4gbmFtZSBsaXN0CituYW1lX29wKCdERUxFVEVfQVRUUicsIDk2KSAgICAgICMgIiIKK25hbWVfb3AoJ1NUT1JFX0dMT0JBTCcsIDk3KSAgICAgIyAiIgorbmFtZV9vcCgnREVMRVRFX0dMT0JBTCcsIDk4KSAgICAjICIiCitkZWZfb3AoJ0RVUF9UT1BYJywgOTkpICAgICAgICAgICMgbnVtYmVyIG9mIGl0ZW1zIHRvIGR1cGxpY2F0ZQorZGVmX29wKCdMT0FEX0NPTlNUJywgMTAwKSAgICAgICAjIEluZGV4IGluIGNvbnN0IGxpc3QKK2hhc2NvbnN0LmFwcGVuZCgxMDApCituYW1lX29wKCdMT0FEX05BTUUnLCAxMDEpICAgICAgICMgSW5kZXggaW4gbmFtZSBsaXN0CitkZWZfb3AoJ0JVSUxEX1RVUExFJywgMTAyKSAgICAgICMgTnVtYmVyIG9mIHR1cGxlIGl0ZW1zCitkZWZfb3AoJ0JVSUxEX0xJU1QnLCAxMDMpICAgICAgICMgTnVtYmVyIG9mIGxpc3QgaXRlbXMKK2RlZl9vcCgnQlVJTERfU0VUJywgMTA0KSAgICAgICAgIyBOdW1iZXIgb2Ygc2V0IGl0ZW1zCitkZWZfb3AoJ0JVSUxEX01BUCcsIDEwNSkgICAgICAgICMgTnVtYmVyIG9mIGRpY3QgZW50cmllcyAodXB0byAyNTUpCituYW1lX29wKCdMT0FEX0FUVFInLCAxMDYpICAgICAgICMgSW5kZXggaW4gbmFtZSBsaXN0CitkZWZfb3AoJ0NPTVBBUkVfT1AnLCAxMDcpICAgICAgICMgQ29tcGFyaXNvbiBvcGVyYXRvcgoraGFzY29tcGFyZS5hcHBlbmQoMTA3KQorbmFtZV9vcCgnSU1QT1JUX05BTUUnLCAxMDgpICAgICAjIEluZGV4IGluIG5hbWUgbGlzdAorbmFtZV9vcCgnSU1QT1JUX0ZST00nLCAxMDkpICAgICAjIEluZGV4IGluIG5hbWUgbGlzdAoranJlbF9vcCgnSlVNUF9GT1JXQVJEJywgMTEwKSAgICAjIE51bWJlciBvZiBieXRlcyB0byBza2lwCitqYWJzX29wKCdKVU1QX0lGX0ZBTFNFX09SX1BPUCcsIDExMSkgIyBUYXJnZXQgYnl0ZSBvZmZzZXQgZnJvbSBiZWdpbm5pbmcgb2YgY29kZQoramFic19vcCgnSlVNUF9JRl9UUlVFX09SX1BPUCcsIDExMikgICMgIiIKK2phYnNfb3AoJ0pVTVBfQUJTT0xVVEUnLCAxMTMpICAgICAgICAjICIiCitqYWJzX29wKCdQT1BfSlVNUF9JRl9GQUxTRScsIDExNCkgICAgIyAiIgoramFic19vcCgnUE9QX0pVTVBfSUZfVFJVRScsIDExNSkgICAgICMgIiIKKworbmFtZV9vcCgnTE9BRF9HTE9CQUwnLCAxMTYpICAgICAjIEluZGV4IGluIG5hbWUgbGlzdAorCitqYWJzX29wKCdDT05USU5VRV9MT09QJywgMTE5KSAgICMgVGFyZ2V0IGFkZHJlc3MKK2pyZWxfb3AoJ1NFVFVQX0xPT1AnLCAxMjApICAgICAgIyBEaXN0YW5jZSB0byB0YXJnZXQgYWRkcmVzcworanJlbF9vcCgnU0VUVVBfRVhDRVBUJywgMTIxKSAgICAjICIiCitqcmVsX29wKCdTRVRVUF9GSU5BTExZJywgMTIyKSAgICMgIiIKKworZGVmX29wKCdMT0FEX0ZBU1QnLCAxMjQpICAgICAgICAjIExvY2FsIHZhcmlhYmxlIG51bWJlcgoraGFzbG9jYWwuYXBwZW5kKDEyNCkKK2RlZl9vcCgnU1RPUkVfRkFTVCcsIDEyNSkgICAgICAgIyBMb2NhbCB2YXJpYWJsZSBudW1iZXIKK2hhc2xvY2FsLmFwcGVuZCgxMjUpCitkZWZfb3AoJ0RFTEVURV9GQVNUJywgMTI2KSAgICAgICMgTG9jYWwgdmFyaWFibGUgbnVtYmVyCitoYXNsb2NhbC5hcHBlbmQoMTI2KQorCitkZWZfb3AoJ1JBSVNFX1ZBUkFSR1MnLCAxMzApICAgICMgTnVtYmVyIG9mIHJhaXNlIGFyZ3VtZW50cyAoMSwgMiwgb3IgMykKK2RlZl9vcCgnQ0FMTF9GVU5DVElPTicsIDEzMSkgICAgIyAjYXJncyArICgja3dhcmdzIDw8IDgpCitkZWZfb3AoJ01BS0VfRlVOQ1RJT04nLCAxMzIpICAgICMgTnVtYmVyIG9mIGFyZ3Mgd2l0aCBkZWZhdWx0IHZhbHVlcworZGVmX29wKCdCVUlMRF9TTElDRScsIDEzMykgICAgICAjIE51bWJlciBvZiBpdGVtcworZGVmX29wKCdNQUtFX0NMT1NVUkUnLCAxMzQpCitkZWZfb3AoJ0xPQURfQ0xPU1VSRScsIDEzNSkKK2hhc2ZyZWUuYXBwZW5kKDEzNSkKK2RlZl9vcCgnTE9BRF9ERVJFRicsIDEzNikKK2hhc2ZyZWUuYXBwZW5kKDEzNikKK2RlZl9vcCgnU1RPUkVfREVSRUYnLCAxMzcpCitoYXNmcmVlLmFwcGVuZCgxMzcpCisKK2RlZl9vcCgnQ0FMTF9GVU5DVElPTl9WQVInLCAxNDApICAgICAjICNhcmdzICsgKCNrd2FyZ3MgPDwgOCkKK2RlZl9vcCgnQ0FMTF9GVU5DVElPTl9LVycsIDE0MSkgICAgICAjICNhcmdzICsgKCNrd2FyZ3MgPDwgOCkKK2RlZl9vcCgnQ0FMTF9GVU5DVElPTl9WQVJfS1cnLCAxNDIpICAjICNhcmdzICsgKCNrd2FyZ3MgPDwgOCkKKworanJlbF9vcCgnU0VUVVBfV0lUSCcsIDE0MykKKworZGVmX29wKCdFWFRFTkRFRF9BUkcnLCAxNDUpCitFWFRFTkRFRF9BUkcgPSAxNDUKK2RlZl9vcCgnU0VUX0FERCcsIDE0NikKK2RlZl9vcCgnTUFQX0FERCcsIDE0NykKKworZGVsIGRlZl9vcCwgbmFtZV9vcCwganJlbF9vcCwgamFic19vcApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcGNvZGUucHljIGIvbGliL3B5dGhvbjIuNy9vcGNvZGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmUwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29wY29kZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcGNvZGUucHlvIGIvbGliL3B5dGhvbjIuNy9vcGNvZGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZmUwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29wY29kZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcHRwYXJzZS5weSBiL2xpYi9weXRob24yLjcvb3B0cGFyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxYTJiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvb3B0cGFyc2UucHkKQEAgLTAsMCArMSwxNzAzIEBACisiIiJBIHBvd2VyZnVsLCBleHRlbnNpYmxlLCBhbmQgZWFzeS10by11c2Ugb3B0aW9uIHBhcnNlci4KKworQnkgR3JlZyBXYXJkIDxnd2FyZEBweXRob24ubmV0PgorCitPcmlnaW5hbGx5IGRpc3RyaWJ1dGVkIGFzIE9wdGlrLgorCitGb3Igc3VwcG9ydCwgdXNlIHRoZSBvcHRpay11c2Vyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXQgbWFpbGluZyBsaXN0CisoaHR0cDovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9vcHRpay11c2VycykuCisKK1NpbXBsZSB1c2FnZSBleGFtcGxlOgorCisgICBmcm9tIG9wdHBhcnNlIGltcG9ydCBPcHRpb25QYXJzZXIKKworICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgIHBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLCBkZXN0PSJmaWxlbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBoZWxwPSJ3cml0ZSByZXBvcnQgdG8gRklMRSIsIG1ldGF2YXI9IkZJTEUiKQorICAgcGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLAorICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV9mYWxzZSIsIGRlc3Q9InZlcmJvc2UiLCBkZWZhdWx0PVRydWUsCisgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkb24ndCBwcmludCBzdGF0dXMgbWVzc2FnZXMgdG8gc3Rkb3V0IikKKworICAgKG9wdGlvbnMsIGFyZ3MpID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQorIiIiCisKK19fdmVyc2lvbl9fID0gIjEuNS4zIgorCitfX2FsbF9fID0gWydPcHRpb24nLAorICAgICAgICAgICAnbWFrZV9vcHRpb24nLAorICAgICAgICAgICAnU1VQUFJFU1NfSEVMUCcsCisgICAgICAgICAgICdTVVBQUkVTU19VU0FHRScsCisgICAgICAgICAgICdWYWx1ZXMnLAorICAgICAgICAgICAnT3B0aW9uQ29udGFpbmVyJywKKyAgICAgICAgICAgJ09wdGlvbkdyb3VwJywKKyAgICAgICAgICAgJ09wdGlvblBhcnNlcicsCisgICAgICAgICAgICdIZWxwRm9ybWF0dGVyJywKKyAgICAgICAgICAgJ0luZGVudGVkSGVscEZvcm1hdHRlcicsCisgICAgICAgICAgICdUaXRsZWRIZWxwRm9ybWF0dGVyJywKKyAgICAgICAgICAgJ09wdFBhcnNlRXJyb3InLAorICAgICAgICAgICAnT3B0aW9uRXJyb3InLAorICAgICAgICAgICAnT3B0aW9uQ29uZmxpY3RFcnJvcicsCisgICAgICAgICAgICdPcHRpb25WYWx1ZUVycm9yJywKKyAgICAgICAgICAgJ0JhZE9wdGlvbkVycm9yJ10KKworX19jb3B5cmlnaHRfXyA9ICIiIgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYgR3JlZ29yeSBQLiBXYXJkLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KK0NvcHlyaWdodCAoYykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTCitJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKK1RPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQQorUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SCitDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKK0VYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisiIiIKKworaW1wb3J0IHN5cywgb3MKK2ltcG9ydCB0eXBlcworaW1wb3J0IHRleHR3cmFwCisKK2RlZiBfcmVwcihzZWxmKToKKyAgICByZXR1cm4gIjwlcyBhdCAweCV4OiAlcz4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBpZChzZWxmKSwgc2VsZikKKworCisjIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGZyb206CisjICAgSWQ6IG9wdGlvbl9wYXJzZXIucHkgNTI3IDIwMDYtMDctMjMgMTU6MjE6MzBaIGdyZWcKKyMgICBJZDogb3B0aW9uLnB5IDUyMiAyMDA2LTA2LTExIDE2OjIyOjAzWiBnd2FyZAorIyAgIElkOiBoZWxwLnB5IDUyNyAyMDA2LTA3LTIzIDE1OjIxOjMwWiBncmVnCisjICAgSWQ6IGVycm9ycy5weSA1MDkgMjAwNi0wNC0yMCAwMDo1ODoyNFogZ3dhcmQKKwordHJ5OgorICAgIGZyb20gZ2V0dGV4dCBpbXBvcnQgZ2V0dGV4dAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRlZiBnZXR0ZXh0KG1lc3NhZ2UpOgorICAgICAgICByZXR1cm4gbWVzc2FnZQorXyA9IGdldHRleHQKKworCitjbGFzcyBPcHRQYXJzZUVycm9yIChFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cpOgorICAgICAgICBzZWxmLm1zZyA9IG1zZworCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1zZworCisKK2NsYXNzIE9wdGlvbkVycm9yIChPcHRQYXJzZUVycm9yKToKKyAgICAiIiIKKyAgICBSYWlzZWQgaWYgYW4gT3B0aW9uIGluc3RhbmNlIGlzIGNyZWF0ZWQgd2l0aCBpbnZhbGlkIG9yCisgICAgaW5jb25zaXN0ZW50IGFyZ3VtZW50cy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIG9wdGlvbik6CisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYub3B0aW9uX2lkID0gc3RyKG9wdGlvbikKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm9wdGlvbl9pZDoKKyAgICAgICAgICAgIHJldHVybiAib3B0aW9uICVzOiAlcyIgJSAoc2VsZi5vcHRpb25faWQsIHNlbGYubXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubXNnCisKK2NsYXNzIE9wdGlvbkNvbmZsaWN0RXJyb3IgKE9wdGlvbkVycm9yKToKKyAgICAiIiIKKyAgICBSYWlzZWQgaWYgY29uZmxpY3Rpbmcgb3B0aW9ucyBhcmUgYWRkZWQgdG8gYW4gT3B0aW9uUGFyc2VyLgorICAgICIiIgorCitjbGFzcyBPcHRpb25WYWx1ZUVycm9yIChPcHRQYXJzZUVycm9yKToKKyAgICAiIiIKKyAgICBSYWlzZWQgaWYgYW4gaW52YWxpZCBvcHRpb24gdmFsdWUgaXMgZW5jb3VudGVyZWQgb24gdGhlIGNvbW1hbmQKKyAgICBsaW5lLgorICAgICIiIgorCitjbGFzcyBCYWRPcHRpb25FcnJvciAoT3B0UGFyc2VFcnJvcik6CisgICAgIiIiCisgICAgUmFpc2VkIGlmIGFuIGludmFsaWQgb3B0aW9uIGlzIHNlZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0X3N0cik6CisgICAgICAgIHNlbGYub3B0X3N0ciA9IG9wdF9zdHIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gXygibm8gc3VjaCBvcHRpb246ICVzIikgJSBzZWxmLm9wdF9zdHIKKworY2xhc3MgQW1iaWd1b3VzT3B0aW9uRXJyb3IgKEJhZE9wdGlvbkVycm9yKToKKyAgICAiIiIKKyAgICBSYWlzZWQgaWYgYW4gYW1iaWd1b3VzIG9wdGlvbiBpcyBzZWVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdF9zdHIsIHBvc3NpYmlsaXRpZXMpOgorICAgICAgICBCYWRPcHRpb25FcnJvci5fX2luaXRfXyhzZWxmLCBvcHRfc3RyKQorICAgICAgICBzZWxmLnBvc3NpYmlsaXRpZXMgPSBwb3NzaWJpbGl0aWVzCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChfKCJhbWJpZ3VvdXMgb3B0aW9uOiAlcyAoJXM/KSIpCisgICAgICAgICAgICAgICAgJSAoc2VsZi5vcHRfc3RyLCAiLCAiLmpvaW4oc2VsZi5wb3NzaWJpbGl0aWVzKSkpCisKKworY2xhc3MgSGVscEZvcm1hdHRlcjoKKworICAgICIiIgorICAgIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGZvcm1hdHRpbmcgb3B0aW9uIGhlbHAuICBPcHRpb25QYXJzZXIKKyAgICBpbnN0YW5jZXMgc2hvdWxkIHVzZSBvbmUgb2YgdGhlIEhlbHBGb3JtYXR0ZXIgc3ViY2xhc3NlcyBmb3IKKyAgICBmb3JtYXR0aW5nIGhlbHA7IGJ5IGRlZmF1bHQgSW5kZW50ZWRIZWxwRm9ybWF0dGVyIGlzIHVzZWQuCisKKyAgICBJbnN0YW5jZSBhdHRyaWJ1dGVzOgorICAgICAgcGFyc2VyIDogT3B0aW9uUGFyc2VyCisgICAgICAgIHRoZSBjb250cm9sbGluZyBPcHRpb25QYXJzZXIgaW5zdGFuY2UKKyAgICAgIGluZGVudF9pbmNyZW1lbnQgOiBpbnQKKyAgICAgICAgdGhlIG51bWJlciBvZiBjb2x1bW5zIHRvIGluZGVudCBwZXIgbmVzdGluZyBsZXZlbAorICAgICAgbWF4X2hlbHBfcG9zaXRpb24gOiBpbnQKKyAgICAgICAgdGhlIG1heGltdW0gc3RhcnRpbmcgY29sdW1uIGZvciBvcHRpb24gaGVscCB0ZXh0CisgICAgICBoZWxwX3Bvc2l0aW9uIDogaW50CisgICAgICAgIHRoZSBjYWxjdWxhdGVkIHN0YXJ0aW5nIGNvbHVtbiBmb3Igb3B0aW9uIGhlbHAgdGV4dDsKKyAgICAgICAgaW5pdGlhbGx5IHRoZSBzYW1lIGFzIHRoZSBtYXhpbXVtCisgICAgICB3aWR0aCA6IGludAorICAgICAgICB0b3RhbCBudW1iZXIgb2YgY29sdW1ucyBmb3Igb3V0cHV0IChwYXNzIE5vbmUgdG8gY29uc3RydWN0b3IgZm9yCisgICAgICAgIHRoaXMgdmFsdWUgdG8gYmUgdGFrZW4gZnJvbSB0aGUgJENPTFVNTlMgZW52aXJvbm1lbnQgdmFyaWFibGUpCisgICAgICBsZXZlbCA6IGludAorICAgICAgICBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsCisgICAgICBjdXJyZW50X2luZGVudCA6IGludAorICAgICAgICBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsIChpbiBjb2x1bW5zKQorICAgICAgaGVscF93aWR0aCA6IGludAorICAgICAgICBudW1iZXIgb2YgY29sdW1ucyBhdmFpbGFibGUgZm9yIG9wdGlvbiBoZWxwIHRleHQgKGNhbGN1bGF0ZWQpCisgICAgICBkZWZhdWx0X3RhZyA6IHN0cgorICAgICAgICB0ZXh0IHRvIHJlcGxhY2Ugd2l0aCBlYWNoIG9wdGlvbidzIGRlZmF1bHQgdmFsdWUsICIlZGVmYXVsdCIKKyAgICAgICAgYnkgZGVmYXVsdC4gIFNldCB0byBmYWxzZSB2YWx1ZSB0byBkaXNhYmxlIGRlZmF1bHQgdmFsdWUgZXhwYW5zaW9uLgorICAgICAgb3B0aW9uX3N0cmluZ3MgOiB7IE9wdGlvbiA6IHN0ciB9CisgICAgICAgIG1hcHMgT3B0aW9uIGluc3RhbmNlcyB0byB0aGUgc25pcHBldCBvZiBoZWxwIHRleHQgZXhwbGFpbmluZworICAgICAgICB0aGUgc3ludGF4IG9mIHRoYXQgb3B0aW9uLCBlLmcuICItaCwgLS1oZWxwIiBvcgorICAgICAgICAiLWZGSUxFLCAtLWZpbGU9RklMRSIKKyAgICAgIF9zaG9ydF9vcHRfZm10IDogc3RyCisgICAgICAgIGZvcm1hdCBzdHJpbmcgY29udHJvbGxpbmcgaG93IHNob3J0IG9wdGlvbnMgd2l0aCB2YWx1ZXMgYXJlCisgICAgICAgIHByaW50ZWQgaW4gaGVscCB0ZXh0LiAgTXVzdCBiZSBlaXRoZXIgIiVzJXMiICgiLWZGSUxFIikgb3IKKyAgICAgICAgIiVzICVzIiAoIi1mIEZJTEUiKSwgYmVjYXVzZSB0aG9zZSBhcmUgdGhlIHR3byBzeW50YXhlcyB0aGF0CisgICAgICAgIE9wdGlrIHN1cHBvcnRzLgorICAgICAgX2xvbmdfb3B0X2ZtdCA6IHN0cgorICAgICAgICBzaW1pbGFyIGJ1dCBmb3IgbG9uZyBvcHRpb25zOyBtdXN0IGJlIGVpdGhlciAiJXMgJXMiICgiLS1maWxlIEZJTEUiKQorICAgICAgICBvciAiJXM9JXMiICgiLS1maWxlPUZJTEUiKS4KKyAgICAiIiIKKworICAgIE5PX0RFRkFVTFRfVkFMVUUgPSAibm9uZSIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBpbmRlbnRfaW5jcmVtZW50LAorICAgICAgICAgICAgICAgICBtYXhfaGVscF9wb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgIHNob3J0X2ZpcnN0KToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBOb25lCisgICAgICAgIHNlbGYuaW5kZW50X2luY3JlbWVudCA9IGluZGVudF9pbmNyZW1lbnQKKyAgICAgICAgc2VsZi5oZWxwX3Bvc2l0aW9uID0gc2VsZi5tYXhfaGVscF9wb3NpdGlvbiA9IG1heF9oZWxwX3Bvc2l0aW9uCisgICAgICAgIGlmIHdpZHRoIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2lkdGggPSBpbnQob3MuZW52aXJvblsnQ09MVU1OUyddKQorICAgICAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgd2lkdGggPSA4MAorICAgICAgICAgICAgd2lkdGggLT0gMgorICAgICAgICBzZWxmLndpZHRoID0gd2lkdGgKKyAgICAgICAgc2VsZi5jdXJyZW50X2luZGVudCA9IDAKKyAgICAgICAgc2VsZi5sZXZlbCA9IDAKKyAgICAgICAgc2VsZi5oZWxwX3dpZHRoID0gTm9uZSAgICAgICAgICAjIGNvbXB1dGVkIGxhdGVyCisgICAgICAgIHNlbGYuc2hvcnRfZmlyc3QgPSBzaG9ydF9maXJzdAorICAgICAgICBzZWxmLmRlZmF1bHRfdGFnID0gIiVkZWZhdWx0IgorICAgICAgICBzZWxmLm9wdGlvbl9zdHJpbmdzID0ge30KKyAgICAgICAgc2VsZi5fc2hvcnRfb3B0X2ZtdCA9ICIlcyAlcyIKKyAgICAgICAgc2VsZi5fbG9uZ19vcHRfZm10ID0gIiVzPSVzIgorCisgICAgZGVmIHNldF9wYXJzZXIoc2VsZiwgcGFyc2VyKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBwYXJzZXIKKworICAgIGRlZiBzZXRfc2hvcnRfb3B0X2RlbGltaXRlcihzZWxmLCBkZWxpbSk6CisgICAgICAgIGlmIGRlbGltIG5vdCBpbiAoIiIsICIgIik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJpbnZhbGlkIG1ldGF2YXIgZGVsaW1pdGVyIGZvciBzaG9ydCBvcHRpb25zOiAlciIgJSBkZWxpbSkKKyAgICAgICAgc2VsZi5fc2hvcnRfb3B0X2ZtdCA9ICIlcyIgKyBkZWxpbSArICIlcyIKKworICAgIGRlZiBzZXRfbG9uZ19vcHRfZGVsaW1pdGVyKHNlbGYsIGRlbGltKToKKyAgICAgICAgaWYgZGVsaW0gbm90IGluICgiPSIsICIgIik6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJpbnZhbGlkIG1ldGF2YXIgZGVsaW1pdGVyIGZvciBsb25nIG9wdGlvbnM6ICVyIiAlIGRlbGltKQorICAgICAgICBzZWxmLl9sb25nX29wdF9mbXQgPSAiJXMiICsgZGVsaW0gKyAiJXMiCisKKyAgICBkZWYgaW5kZW50KHNlbGYpOgorICAgICAgICBzZWxmLmN1cnJlbnRfaW5kZW50ICs9IHNlbGYuaW5kZW50X2luY3JlbWVudAorICAgICAgICBzZWxmLmxldmVsICs9IDEKKworICAgIGRlZiBkZWRlbnQoc2VsZik6CisgICAgICAgIHNlbGYuY3VycmVudF9pbmRlbnQgLT0gc2VsZi5pbmRlbnRfaW5jcmVtZW50CisgICAgICAgIGFzc2VydCBzZWxmLmN1cnJlbnRfaW5kZW50ID49IDAsICJJbmRlbnQgZGVjcmVhc2VkIGJlbG93IDAuIgorICAgICAgICBzZWxmLmxldmVsIC09IDEKKworICAgIGRlZiBmb3JtYXRfdXNhZ2Uoc2VsZiwgdXNhZ2UpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAic3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCIKKworICAgIGRlZiBmb3JtYXRfaGVhZGluZyhzZWxmLCBoZWFkaW5nKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvciwgInN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQiCisKKyAgICBkZWYgX2Zvcm1hdF90ZXh0KHNlbGYsIHRleHQpOgorICAgICAgICAiIiIKKyAgICAgICAgRm9ybWF0IGEgcGFyYWdyYXBoIG9mIGZyZWUtZm9ybSB0ZXh0IGZvciBpbmNsdXNpb24gaW4gdGhlCisgICAgICAgIGhlbHAgb3V0cHV0IGF0IHRoZSBjdXJyZW50IGluZGVudGF0aW9uIGxldmVsLgorICAgICAgICAiIiIKKyAgICAgICAgdGV4dF93aWR0aCA9IHNlbGYud2lkdGggLSBzZWxmLmN1cnJlbnRfaW5kZW50CisgICAgICAgIGluZGVudCA9ICIgIipzZWxmLmN1cnJlbnRfaW5kZW50CisgICAgICAgIHJldHVybiB0ZXh0d3JhcC5maWxsKHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PWluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VxdWVudF9pbmRlbnQ9aW5kZW50KQorCisgICAgZGVmIGZvcm1hdF9kZXNjcmlwdGlvbihzZWxmLCBkZXNjcmlwdGlvbik6CisgICAgICAgIGlmIGRlc2NyaXB0aW9uOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Zvcm1hdF90ZXh0KGRlc2NyaXB0aW9uKSArICJcbiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgZGVmIGZvcm1hdF9lcGlsb2coc2VsZiwgZXBpbG9nKToKKyAgICAgICAgaWYgZXBpbG9nOgorICAgICAgICAgICAgcmV0dXJuICJcbiIgKyBzZWxmLl9mb3JtYXRfdGV4dChlcGlsb2cpICsgIlxuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKworICAgIGRlZiBleHBhbmRfZGVmYXVsdChzZWxmLCBvcHRpb24pOgorICAgICAgICBpZiBzZWxmLnBhcnNlciBpcyBOb25lIG9yIG5vdCBzZWxmLmRlZmF1bHRfdGFnOgorICAgICAgICAgICAgcmV0dXJuIG9wdGlvbi5oZWxwCisKKyAgICAgICAgZGVmYXVsdF92YWx1ZSA9IHNlbGYucGFyc2VyLmRlZmF1bHRzLmdldChvcHRpb24uZGVzdCkKKyAgICAgICAgaWYgZGVmYXVsdF92YWx1ZSBpcyBOT19ERUZBVUxUIG9yIGRlZmF1bHRfdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPSBzZWxmLk5PX0RFRkFVTFRfVkFMVUUKKworICAgICAgICByZXR1cm4gb3B0aW9uLmhlbHAucmVwbGFjZShzZWxmLmRlZmF1bHRfdGFnLCBzdHIoZGVmYXVsdF92YWx1ZSkpCisKKyAgICBkZWYgZm9ybWF0X29wdGlvbihzZWxmLCBvcHRpb24pOgorICAgICAgICAjIFRoZSBoZWxwIGZvciBlYWNoIG9wdGlvbiBjb25zaXN0cyBvZiB0d28gcGFydHM6CisgICAgICAgICMgICAqIHRoZSBvcHQgc3RyaW5ncyBhbmQgbWV0YXZhcnMKKyAgICAgICAgIyAgICAgZWcuICgiLXgiLCBvciAiLWZGSUxFTkFNRSwgLS1maWxlPUZJTEVOQU1FIikKKyAgICAgICAgIyAgICogdGhlIHVzZXItc3VwcGxpZWQgaGVscCBzdHJpbmcKKyAgICAgICAgIyAgICAgZWcuICgidHVybiBvbiBleHBlcnQgbW9kZSIsICJyZWFkIGRhdGEgZnJvbSBGSUxFTkFNRSIpCisgICAgICAgICMKKyAgICAgICAgIyBJZiBwb3NzaWJsZSwgd2Ugd3JpdGUgYm90aCBvZiB0aGVzZSBvbiB0aGUgc2FtZSBsaW5lOgorICAgICAgICAjICAgLXggICAgICB0dXJuIG9uIGV4cGVydCBtb2RlCisgICAgICAgICMKKyAgICAgICAgIyBCdXQgaWYgdGhlIG9wdCBzdHJpbmcgbGlzdCBpcyB0b28gbG9uZywgd2UgcHV0IHRoZSBoZWxwCisgICAgICAgICMgc3RyaW5nIG9uIGEgc2Vjb25kIGxpbmUsIGluZGVudGVkIHRvIHRoZSBzYW1lIGNvbHVtbiBpdCB3b3VsZAorICAgICAgICAjIHN0YXJ0IGluIGlmIGl0IGZpdCBvbiB0aGUgZmlyc3QgbGluZS4KKyAgICAgICAgIyAgIC1mRklMRU5BTUUsIC0tZmlsZT1GSUxFTkFNRQorICAgICAgICAjICAgICAgICAgICByZWFkIGRhdGEgZnJvbSBGSUxFTkFNRQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBvcHRzID0gc2VsZi5vcHRpb25fc3RyaW5nc1tvcHRpb25dCisgICAgICAgIG9wdF93aWR0aCA9IHNlbGYuaGVscF9wb3NpdGlvbiAtIHNlbGYuY3VycmVudF9pbmRlbnQgLSAyCisgICAgICAgIGlmIGxlbihvcHRzKSA+IG9wdF93aWR0aDoKKyAgICAgICAgICAgIG9wdHMgPSAiJSpzJXNcbiIgJSAoc2VsZi5jdXJyZW50X2luZGVudCwgIiIsIG9wdHMpCisgICAgICAgICAgICBpbmRlbnRfZmlyc3QgPSBzZWxmLmhlbHBfcG9zaXRpb24KKyAgICAgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnQgaGVscCBvbiBzYW1lIGxpbmUgYXMgb3B0cworICAgICAgICAgICAgb3B0cyA9ICIlKnMlLSpzICAiICUgKHNlbGYuY3VycmVudF9pbmRlbnQsICIiLCBvcHRfd2lkdGgsIG9wdHMpCisgICAgICAgICAgICBpbmRlbnRfZmlyc3QgPSAwCisgICAgICAgIHJlc3VsdC5hcHBlbmQob3B0cykKKyAgICAgICAgaWYgb3B0aW9uLmhlbHA6CisgICAgICAgICAgICBoZWxwX3RleHQgPSBzZWxmLmV4cGFuZF9kZWZhdWx0KG9wdGlvbikKKyAgICAgICAgICAgIGhlbHBfbGluZXMgPSB0ZXh0d3JhcC53cmFwKGhlbHBfdGV4dCwgc2VsZi5oZWxwX3dpZHRoKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiJSpzJXNcbiIgJSAoaW5kZW50X2ZpcnN0LCAiIiwgaGVscF9saW5lc1swXSkpCisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKFsiJSpzJXNcbiIgJSAoc2VsZi5oZWxwX3Bvc2l0aW9uLCAiIiwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGhlbHBfbGluZXNbMTpdXSkKKyAgICAgICAgZWxpZiBvcHRzWy0xXSAhPSAiXG4iOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKQorICAgICAgICByZXR1cm4gIiIuam9pbihyZXN1bHQpCisKKyAgICBkZWYgc3RvcmVfb3B0aW9uX3N0cmluZ3Moc2VsZiwgcGFyc2VyKToKKyAgICAgICAgc2VsZi5pbmRlbnQoKQorICAgICAgICBtYXhfbGVuID0gMAorICAgICAgICBmb3Igb3B0IGluIHBhcnNlci5vcHRpb25fbGlzdDoKKyAgICAgICAgICAgIHN0cmluZ3MgPSBzZWxmLmZvcm1hdF9vcHRpb25fc3RyaW5ncyhvcHQpCisgICAgICAgICAgICBzZWxmLm9wdGlvbl9zdHJpbmdzW29wdF0gPSBzdHJpbmdzCisgICAgICAgICAgICBtYXhfbGVuID0gbWF4KG1heF9sZW4sIGxlbihzdHJpbmdzKSArIHNlbGYuY3VycmVudF9pbmRlbnQpCisgICAgICAgIHNlbGYuaW5kZW50KCkKKyAgICAgICAgZm9yIGdyb3VwIGluIHBhcnNlci5vcHRpb25fZ3JvdXBzOgorICAgICAgICAgICAgZm9yIG9wdCBpbiBncm91cC5vcHRpb25fbGlzdDoKKyAgICAgICAgICAgICAgICBzdHJpbmdzID0gc2VsZi5mb3JtYXRfb3B0aW9uX3N0cmluZ3Mob3B0KQorICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uX3N0cmluZ3Nbb3B0XSA9IHN0cmluZ3MKKyAgICAgICAgICAgICAgICBtYXhfbGVuID0gbWF4KG1heF9sZW4sIGxlbihzdHJpbmdzKSArIHNlbGYuY3VycmVudF9pbmRlbnQpCisgICAgICAgIHNlbGYuZGVkZW50KCkKKyAgICAgICAgc2VsZi5kZWRlbnQoKQorICAgICAgICBzZWxmLmhlbHBfcG9zaXRpb24gPSBtaW4obWF4X2xlbiArIDIsIHNlbGYubWF4X2hlbHBfcG9zaXRpb24pCisgICAgICAgIHNlbGYuaGVscF93aWR0aCA9IHNlbGYud2lkdGggLSBzZWxmLmhlbHBfcG9zaXRpb24KKworICAgIGRlZiBmb3JtYXRfb3B0aW9uX3N0cmluZ3Moc2VsZiwgb3B0aW9uKToKKyAgICAgICAgIiIiUmV0dXJuIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2Ygb3B0aW9uIHN0cmluZ3MgJiBtZXRhdmFyaWFibGVzLiIiIgorICAgICAgICBpZiBvcHRpb24udGFrZXNfdmFsdWUoKToKKyAgICAgICAgICAgIG1ldGF2YXIgPSBvcHRpb24ubWV0YXZhciBvciBvcHRpb24uZGVzdC51cHBlcigpCisgICAgICAgICAgICBzaG9ydF9vcHRzID0gW3NlbGYuX3Nob3J0X29wdF9mbXQgJSAoc29wdCwgbWV0YXZhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNvcHQgaW4gb3B0aW9uLl9zaG9ydF9vcHRzXQorICAgICAgICAgICAgbG9uZ19vcHRzID0gW3NlbGYuX2xvbmdfb3B0X2ZtdCAlIChsb3B0LCBtZXRhdmFyKQorICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBsb3B0IGluIG9wdGlvbi5fbG9uZ19vcHRzXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2hvcnRfb3B0cyA9IG9wdGlvbi5fc2hvcnRfb3B0cworICAgICAgICAgICAgbG9uZ19vcHRzID0gb3B0aW9uLl9sb25nX29wdHMKKworICAgICAgICBpZiBzZWxmLnNob3J0X2ZpcnN0OgorICAgICAgICAgICAgb3B0cyA9IHNob3J0X29wdHMgKyBsb25nX29wdHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9wdHMgPSBsb25nX29wdHMgKyBzaG9ydF9vcHRzCisKKyAgICAgICAgcmV0dXJuICIsICIuam9pbihvcHRzKQorCitjbGFzcyBJbmRlbnRlZEhlbHBGb3JtYXR0ZXIgKEhlbHBGb3JtYXR0ZXIpOgorICAgICIiIkZvcm1hdCBoZWxwIHdpdGggaW5kZW50ZWQgc2VjdGlvbiBib2RpZXMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgaW5kZW50X2luY3JlbWVudD0yLAorICAgICAgICAgICAgICAgICBtYXhfaGVscF9wb3NpdGlvbj0yNCwKKyAgICAgICAgICAgICAgICAgd2lkdGg9Tm9uZSwKKyAgICAgICAgICAgICAgICAgc2hvcnRfZmlyc3Q9MSk6CisgICAgICAgIEhlbHBGb3JtYXR0ZXIuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLCBpbmRlbnRfaW5jcmVtZW50LCBtYXhfaGVscF9wb3NpdGlvbiwgd2lkdGgsIHNob3J0X2ZpcnN0KQorCisgICAgZGVmIGZvcm1hdF91c2FnZShzZWxmLCB1c2FnZSk6CisgICAgICAgIHJldHVybiBfKCJVc2FnZTogJXNcbiIpICUgdXNhZ2UKKworICAgIGRlZiBmb3JtYXRfaGVhZGluZyhzZWxmLCBoZWFkaW5nKToKKyAgICAgICAgcmV0dXJuICIlKnMlczpcbiIgJSAoc2VsZi5jdXJyZW50X2luZGVudCwgIiIsIGhlYWRpbmcpCisKKworY2xhc3MgVGl0bGVkSGVscEZvcm1hdHRlciAoSGVscEZvcm1hdHRlcik6CisgICAgIiIiRm9ybWF0IGhlbHAgd2l0aCB1bmRlcmxpbmVkIHNlY3Rpb24gaGVhZGVycy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBpbmRlbnRfaW5jcmVtZW50PTAsCisgICAgICAgICAgICAgICAgIG1heF9oZWxwX3Bvc2l0aW9uPTI0LAorICAgICAgICAgICAgICAgICB3aWR0aD1Ob25lLAorICAgICAgICAgICAgICAgICBzaG9ydF9maXJzdD0wKToKKyAgICAgICAgSGVscEZvcm1hdHRlci5fX2luaXRfXyAoCisgICAgICAgICAgICBzZWxmLCBpbmRlbnRfaW5jcmVtZW50LCBtYXhfaGVscF9wb3NpdGlvbiwgd2lkdGgsIHNob3J0X2ZpcnN0KQorCisgICAgZGVmIGZvcm1hdF91c2FnZShzZWxmLCB1c2FnZSk6CisgICAgICAgIHJldHVybiAiJXMgICVzXG4iICUgKHNlbGYuZm9ybWF0X2hlYWRpbmcoXygiVXNhZ2UiKSksIHVzYWdlKQorCisgICAgZGVmIGZvcm1hdF9oZWFkaW5nKHNlbGYsIGhlYWRpbmcpOgorICAgICAgICByZXR1cm4gIiVzXG4lc1xuIiAlIChoZWFkaW5nLCAiPS0iW3NlbGYubGV2ZWxdICogbGVuKGhlYWRpbmcpKQorCisKK2RlZiBfcGFyc2VfbnVtKHZhbCwgdHlwZSk6CisgICAgaWYgdmFsWzoyXS5sb3dlcigpID09ICIweCI6ICAgICAgICAgIyBoZXhhZGVjaW1hbAorICAgICAgICByYWRpeCA9IDE2CisgICAgZWxpZiB2YWxbOjJdLmxvd2VyKCkgPT0gIjBiIjogICAgICAgIyBiaW5hcnkKKyAgICAgICAgcmFkaXggPSAyCisgICAgICAgIHZhbCA9IHZhbFsyOl0gb3IgIjAiICAgICAgICAgICAgIyBoYXZlIHRvIHJlbW92ZSAiMGIiIHByZWZpeAorICAgIGVsaWYgdmFsWzoxXSA9PSAiMCI6ICAgICAgICAgICAgICAgICMgb2N0YWwKKyAgICAgICAgcmFkaXggPSA4CisgICAgZWxzZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWNpbWFsCisgICAgICAgIHJhZGl4ID0gMTAKKworICAgIHJldHVybiB0eXBlKHZhbCwgcmFkaXgpCisKK2RlZiBfcGFyc2VfaW50KHZhbCk6CisgICAgcmV0dXJuIF9wYXJzZV9udW0odmFsLCBpbnQpCisKK2RlZiBfcGFyc2VfbG9uZyh2YWwpOgorICAgIHJldHVybiBfcGFyc2VfbnVtKHZhbCwgbG9uZykKKworX2J1aWx0aW5fY3Z0ID0geyAiaW50IiA6IChfcGFyc2VfaW50LCBfKCJpbnRlZ2VyIikpLAorICAgICAgICAgICAgICAgICAibG9uZyIgOiAoX3BhcnNlX2xvbmcsIF8oImxvbmcgaW50ZWdlciIpKSwKKyAgICAgICAgICAgICAgICAgImZsb2F0IiA6IChmbG9hdCwgXygiZmxvYXRpbmctcG9pbnQiKSksCisgICAgICAgICAgICAgICAgICJjb21wbGV4IiA6IChjb21wbGV4LCBfKCJjb21wbGV4IikpIH0KKworZGVmIGNoZWNrX2J1aWx0aW4ob3B0aW9uLCBvcHQsIHZhbHVlKToKKyAgICAoY3Z0LCB3aGF0KSA9IF9idWlsdGluX2N2dFtvcHRpb24udHlwZV0KKyAgICB0cnk6CisgICAgICAgIHJldHVybiBjdnQodmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IoCisgICAgICAgICAgICBfKCJvcHRpb24gJXM6IGludmFsaWQgJXMgdmFsdWU6ICVyIikgJSAob3B0LCB3aGF0LCB2YWx1ZSkpCisKK2RlZiBjaGVja19jaG9pY2Uob3B0aW9uLCBvcHQsIHZhbHVlKToKKyAgICBpZiB2YWx1ZSBpbiBvcHRpb24uY2hvaWNlczoKKyAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgZWxzZToKKyAgICAgICAgY2hvaWNlcyA9ICIsICIuam9pbihtYXAocmVwciwgb3B0aW9uLmNob2ljZXMpKQorICAgICAgICByYWlzZSBPcHRpb25WYWx1ZUVycm9yKAorICAgICAgICAgICAgXygib3B0aW9uICVzOiBpbnZhbGlkIGNob2ljZTogJXIgKGNob29zZSBmcm9tICVzKSIpCisgICAgICAgICAgICAlIChvcHQsIHZhbHVlLCBjaG9pY2VzKSkKKworIyBOb3Qgc3VwcGx5aW5nIGEgZGVmYXVsdCBpcyBkaWZmZXJlbnQgZnJvbSBhIGRlZmF1bHQgb2YgTm9uZSwKKyMgc28gd2UgbmVlZCBhbiBleHBsaWNpdCAibm90IHN1cHBsaWVkIiB2YWx1ZS4KK05PX0RFRkFVTFQgPSAoIk5PIiwgIkRFRkFVTFQiKQorCisKK2NsYXNzIE9wdGlvbjoKKyAgICAiIiIKKyAgICBJbnN0YW5jZSBhdHRyaWJ1dGVzOgorICAgICAgX3Nob3J0X29wdHMgOiBbc3RyaW5nXQorICAgICAgX2xvbmdfb3B0cyA6IFtzdHJpbmddCisKKyAgICAgIGFjdGlvbiA6IHN0cmluZworICAgICAgdHlwZSA6IHN0cmluZworICAgICAgZGVzdCA6IHN0cmluZworICAgICAgZGVmYXVsdCA6IGFueQorICAgICAgbmFyZ3MgOiBpbnQKKyAgICAgIGNvbnN0IDogYW55CisgICAgICBjaG9pY2VzIDogW3N0cmluZ10KKyAgICAgIGNhbGxiYWNrIDogZnVuY3Rpb24KKyAgICAgIGNhbGxiYWNrX2FyZ3MgOiAoYW55KikKKyAgICAgIGNhbGxiYWNrX2t3YXJncyA6IHsgc3RyaW5nIDogYW55IH0KKyAgICAgIGhlbHAgOiBzdHJpbmcKKyAgICAgIG1ldGF2YXIgOiBzdHJpbmcKKyAgICAiIiIKKworICAgICMgVGhlIGxpc3Qgb2YgaW5zdGFuY2UgYXR0cmlidXRlcyB0aGF0IG1heSBiZSBzZXQgdGhyb3VnaAorICAgICMga2V5d29yZCBhcmdzIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICBBVFRSUyA9IFsnYWN0aW9uJywKKyAgICAgICAgICAgICAndHlwZScsCisgICAgICAgICAgICAgJ2Rlc3QnLAorICAgICAgICAgICAgICdkZWZhdWx0JywKKyAgICAgICAgICAgICAnbmFyZ3MnLAorICAgICAgICAgICAgICdjb25zdCcsCisgICAgICAgICAgICAgJ2Nob2ljZXMnLAorICAgICAgICAgICAgICdjYWxsYmFjaycsCisgICAgICAgICAgICAgJ2NhbGxiYWNrX2FyZ3MnLAorICAgICAgICAgICAgICdjYWxsYmFja19rd2FyZ3MnLAorICAgICAgICAgICAgICdoZWxwJywKKyAgICAgICAgICAgICAnbWV0YXZhciddCisKKyAgICAjIFRoZSBzZXQgb2YgYWN0aW9ucyBhbGxvd2VkIGJ5IG9wdGlvbiBwYXJzZXJzLiAgRXhwbGljaXRseSBsaXN0ZWQKKyAgICAjIGhlcmUgc28gdGhlIGNvbnN0cnVjdG9yIGNhbiB2YWxpZGF0ZSBpdHMgYXJndW1lbnRzLgorICAgIEFDVElPTlMgPSAoInN0b3JlIiwKKyAgICAgICAgICAgICAgICJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAic3RvcmVfZmFsc2UiLAorICAgICAgICAgICAgICAgImFwcGVuZCIsCisgICAgICAgICAgICAgICAiYXBwZW5kX2NvbnN0IiwKKyAgICAgICAgICAgICAgICJjb3VudCIsCisgICAgICAgICAgICAgICAiY2FsbGJhY2siLAorICAgICAgICAgICAgICAgImhlbHAiLAorICAgICAgICAgICAgICAgInZlcnNpb24iKQorCisgICAgIyBUaGUgc2V0IG9mIGFjdGlvbnMgdGhhdCBpbnZvbHZlIHN0b3JpbmcgYSB2YWx1ZSBzb21ld2hlcmU7CisgICAgIyBhbHNvIGxpc3RlZCBqdXN0IGZvciBjb25zdHJ1Y3RvciBhcmd1bWVudCB2YWxpZGF0aW9uLiAgKElmCisgICAgIyB0aGUgYWN0aW9uIGlzIG9uZSBvZiB0aGVzZSwgdGhlcmUgbXVzdCBiZSBhIGRlc3RpbmF0aW9uLikKKyAgICBTVE9SRV9BQ1RJT05TID0gKCJzdG9yZSIsCisgICAgICAgICAgICAgICAgICAgICAic3RvcmVfY29uc3QiLAorICAgICAgICAgICAgICAgICAgICAgInN0b3JlX3RydWUiLAorICAgICAgICAgICAgICAgICAgICAgInN0b3JlX2ZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICJhcHBlbmQiLAorICAgICAgICAgICAgICAgICAgICAgImFwcGVuZF9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAiY291bnQiKQorCisgICAgIyBUaGUgc2V0IG9mIGFjdGlvbnMgZm9yIHdoaWNoIGl0IG1ha2VzIHNlbnNlIHRvIHN1cHBseSBhIHZhbHVlCisgICAgIyB0eXBlLCBpZS4gd2hpY2ggbWF5IGNvbnN1bWUgYW4gYXJndW1lbnQgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICAgIFRZUEVEX0FDVElPTlMgPSAoInN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICJhcHBlbmQiLAorICAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIikKKworICAgICMgVGhlIHNldCBvZiBhY3Rpb25zIHdoaWNoICpyZXF1aXJlKiBhIHZhbHVlIHR5cGUsIGllLiB0aGF0CisgICAgIyBhbHdheXMgY29uc3VtZSBhbiBhcmd1bWVudCBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgICAgQUxXQVlTX1RZUEVEX0FDVElPTlMgPSAoInN0b3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwZW5kIikKKworICAgICMgVGhlIHNldCBvZiBhY3Rpb25zIHdoaWNoIHRha2UgYSAnY29uc3QnIGF0dHJpYnV0ZS4KKyAgICBDT05TVF9BQ1RJT05TID0gKCJzdG9yZV9jb25zdCIsCisgICAgICAgICAgICAgICAgICAgICAiYXBwZW5kX2NvbnN0IikKKworICAgICMgVGhlIHNldCBvZiBrbm93biB0eXBlcyBmb3Igb3B0aW9uIHBhcnNlcnMuICBBZ2FpbiwgbGlzdGVkIGhlcmUgZm9yCisgICAgIyBjb25zdHJ1Y3RvciBhcmd1bWVudCB2YWxpZGF0aW9uLgorICAgIFRZUEVTID0gKCJzdHJpbmciLCAiaW50IiwgImxvbmciLCAiZmxvYXQiLCAiY29tcGxleCIsICJjaG9pY2UiKQorCisgICAgIyBEaWN0aW9uYXJ5IG9mIGFyZ3VtZW50IGNoZWNraW5nIGZ1bmN0aW9ucywgd2hpY2ggY29udmVydCBhbmQKKyAgICAjIHZhbGlkYXRlIG9wdGlvbiBhcmd1bWVudHMgYWNjb3JkaW5nIHRvIHRoZSBvcHRpb24gdHlwZS4KKyAgICAjCisgICAgIyBTaWduYXR1cmUgb2YgY2hlY2tpbmcgZnVuY3Rpb25zIGlzOgorICAgICMgICBjaGVjayhvcHRpb24gOiBPcHRpb24sIG9wdCA6IHN0cmluZywgdmFsdWUgOiBzdHJpbmcpIC0+IGFueQorICAgICMgd2hlcmUKKyAgICAjICAgb3B0aW9uIGlzIHRoZSBPcHRpb24gaW5zdGFuY2UgY2FsbGluZyB0aGUgY2hlY2tlcgorICAgICMgICBvcHQgaXMgdGhlIGFjdHVhbCBvcHRpb24gc2VlbiBvbiB0aGUgY29tbWFuZC1saW5lCisgICAgIyAgICAgKGVnLiAiLWEiLCAiLS1maWxlIikKKyAgICAjICAgdmFsdWUgaXMgdGhlIG9wdGlvbiBhcmd1bWVudCBzZWVuIG9uIHRoZSBjb21tYW5kLWxpbmUKKyAgICAjCisgICAgIyBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBpbiB0aGUgYXBwcm9wcmlhdGUgUHl0aG9uIHR5cGUKKyAgICAjIGZvciBvcHRpb24udHlwZSAtLSBlZy4gYW4gaW50ZWdlciBpZiBvcHRpb24udHlwZSA9PSAiaW50Ii4KKyAgICAjCisgICAgIyBJZiBubyBjaGVja2VyIGlzIGRlZmluZWQgZm9yIGEgdHlwZSwgYXJndW1lbnRzIHdpbGwgYmUKKyAgICAjIHVuY2hlY2tlZCBhbmQgcmVtYWluIHN0cmluZ3MuCisgICAgVFlQRV9DSEVDS0VSID0geyAiaW50IiAgICA6IGNoZWNrX2J1aWx0aW4sCisgICAgICAgICAgICAgICAgICAgICAibG9uZyIgICA6IGNoZWNrX2J1aWx0aW4sCisgICAgICAgICAgICAgICAgICAgICAiZmxvYXQiICA6IGNoZWNrX2J1aWx0aW4sCisgICAgICAgICAgICAgICAgICAgICAiY29tcGxleCI6IGNoZWNrX2J1aWx0aW4sCisgICAgICAgICAgICAgICAgICAgICAiY2hvaWNlIiA6IGNoZWNrX2Nob2ljZSwKKyAgICAgICAgICAgICAgICAgICB9CisKKworICAgICMgQ0hFQ0tfTUVUSE9EUyBpcyBhIGxpc3Qgb2YgdW5ib3VuZCBtZXRob2Qgb2JqZWN0czsgdGhleSBhcmUgY2FsbGVkCisgICAgIyBieSB0aGUgY29uc3RydWN0b3IsIGluIG9yZGVyLCBhZnRlciBhbGwgYXR0cmlidXRlcyBhcmUKKyAgICAjIGluaXRpYWxpemVkLiAgVGhlIGxpc3QgaXMgY3JlYXRlZCBhbmQgZmlsbGVkIGluIGxhdGVyLCBhZnRlciBhbGwKKyAgICAjIHRoZSBtZXRob2RzIGFyZSBhY3R1YWxseSBkZWZpbmVkLiAgKEkganVzdCBwdXQgaXQgaGVyZSBiZWNhdXNlIEkKKyAgICAjIGxpa2UgdG8gZGVmaW5lIGFuZCBkb2N1bWVudCBhbGwgY2xhc3MgYXR0cmlidXRlcyBpbiB0aGUgc2FtZQorICAgICMgcGxhY2UuKSAgU3ViY2xhc3NlcyB0aGF0IGFkZCBhbm90aGVyIF9jaGVja18qKCkgbWV0aG9kIHNob3VsZAorICAgICMgZGVmaW5lIHRoZWlyIG93biBDSEVDS19NRVRIT0RTIGxpc3QgdGhhdCBhZGRzIHRoZWlyIGNoZWNrIG1ldGhvZAorICAgICMgdG8gdGhvc2UgZnJvbSB0aGlzIGNsYXNzLgorICAgIENIRUNLX01FVEhPRFMgPSBOb25lCisKKworICAgICMgLS0gQ29uc3RydWN0b3IvaW5pdGlhbGl6YXRpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKm9wdHMsICoqYXR0cnMpOgorICAgICAgICAjIFNldCBfc2hvcnRfb3B0cywgX2xvbmdfb3B0cyBhdHRycyBmcm9tICdvcHRzJyB0dXBsZS4KKyAgICAgICAgIyBIYXZlIHRvIGJlIHNldCBub3csIGluIGNhc2Ugbm8gb3B0aW9uIHN0cmluZ3MgYXJlIHN1cHBsaWVkLgorICAgICAgICBzZWxmLl9zaG9ydF9vcHRzID0gW10KKyAgICAgICAgc2VsZi5fbG9uZ19vcHRzID0gW10KKyAgICAgICAgb3B0cyA9IHNlbGYuX2NoZWNrX29wdF9zdHJpbmdzKG9wdHMpCisgICAgICAgIHNlbGYuX3NldF9vcHRfc3RyaW5ncyhvcHRzKQorCisgICAgICAgICMgU2V0IGFsbCBvdGhlciBhdHRycyAoYWN0aW9uLCB0eXBlLCBldGMuKSBmcm9tICdhdHRycycgZGljdAorICAgICAgICBzZWxmLl9zZXRfYXR0cnMoYXR0cnMpCisKKyAgICAgICAgIyBDaGVjayBhbGwgdGhlIGF0dHJpYnV0ZXMgd2UganVzdCBzZXQuICBUaGVyZSBhcmUgbG90cyBvZgorICAgICAgICAjIGNvbXBsaWNhdGVkIGludGVyZGVwZW5kZW5jaWVzLCBidXQgbHVja2lseSB0aGV5IGNhbiBiZSBmYXJtZWQKKyAgICAgICAgIyBvdXQgdG8gdGhlIF9jaGVja18qKCkgbWV0aG9kcyBsaXN0ZWQgaW4gQ0hFQ0tfTUVUSE9EUyAtLSB3aGljaAorICAgICAgICAjIGNvdWxkIGJlIGhhbmR5IGZvciBzdWJjbGFzc2VzISAgVGhlIG9uZSB0aGluZyB0aGVzZSBhbGwgc2hhcmUKKyAgICAgICAgIyBpcyB0aGF0IHRoZXkgcmFpc2UgT3B0aW9uRXJyb3IgaWYgdGhleSBkaXNjb3ZlciBhIHByb2JsZW0uCisgICAgICAgIGZvciBjaGVja2VyIGluIHNlbGYuQ0hFQ0tfTUVUSE9EUzoKKyAgICAgICAgICAgIGNoZWNrZXIoc2VsZikKKworICAgIGRlZiBfY2hlY2tfb3B0X3N0cmluZ3Moc2VsZiwgb3B0cyk6CisgICAgICAgICMgRmlsdGVyIG91dCBOb25lIGJlY2F1c2UgZWFybHkgdmVyc2lvbnMgb2YgT3B0aWsgaGFkIGV4YWN0bHkKKyAgICAgICAgIyBvbmUgc2hvcnQgb3B0aW9uIGFuZCBvbmUgbG9uZyBvcHRpb24sIGVpdGhlciBvZiB3aGljaAorICAgICAgICAjIGNvdWxkIGJlIE5vbmUuCisgICAgICAgIG9wdHMgPSBmaWx0ZXIoTm9uZSwgb3B0cykKKyAgICAgICAgaWYgbm90IG9wdHM6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImF0IGxlYXN0IG9uZSBvcHRpb24gc3RyaW5nIG11c3QgYmUgc3VwcGxpZWQiKQorICAgICAgICByZXR1cm4gb3B0cworCisgICAgZGVmIF9zZXRfb3B0X3N0cmluZ3Moc2VsZiwgb3B0cyk6CisgICAgICAgIGZvciBvcHQgaW4gb3B0czoKKyAgICAgICAgICAgIGlmIGxlbihvcHQpIDwgMjoKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImludmFsaWQgb3B0aW9uIHN0cmluZyAlcjogIgorICAgICAgICAgICAgICAgICAgICAibXVzdCBiZSBhdCBsZWFzdCB0d28gY2hhcmFjdGVycyBsb25nIiAlIG9wdCwgc2VsZikKKyAgICAgICAgICAgIGVsaWYgbGVuKG9wdCkgPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBub3QgKG9wdFswXSA9PSAiLSIgYW5kIG9wdFsxXSAhPSAiLSIpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHNob3J0IG9wdGlvbiBzdHJpbmcgJXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIG9mIHRoZSBmb3JtIC14LCAoeCBhbnkgbm9uLWRhc2ggY2hhcikiICUgb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLl9zaG9ydF9vcHRzLmFwcGVuZChvcHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG5vdCAob3B0WzA6Ml0gPT0gIi0tIiBhbmQgb3B0WzJdICE9ICItIik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgbG9uZyBvcHRpb24gc3RyaW5nICVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBzdGFydCB3aXRoIC0tLCBmb2xsb3dlZCBieSBub24tZGFzaCIgJSBvcHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuX2xvbmdfb3B0cy5hcHBlbmQob3B0KQorCisgICAgZGVmIF9zZXRfYXR0cnMoc2VsZiwgYXR0cnMpOgorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLkFUVFJTOgorICAgICAgICAgICAgaWYgYXR0ciBpbiBhdHRyczoKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIGF0dHJzW2F0dHJdKQorICAgICAgICAgICAgICAgIGRlbCBhdHRyc1thdHRyXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBhdHRyID09ICdkZWZhdWx0JzoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCBOT19ERUZBVUxUKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgTm9uZSkKKyAgICAgICAgaWYgYXR0cnM6CisgICAgICAgICAgICBhdHRycyA9IGF0dHJzLmtleXMoKQorICAgICAgICAgICAgYXR0cnMuc29ydCgpCisgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50czogJXMiICUgIiwgIi5qb2luKGF0dHJzKSwKKyAgICAgICAgICAgICAgICBzZWxmKQorCisKKyAgICAjIC0tIENvbnN0cnVjdG9yIHZhbGlkYXRpb24gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIF9jaGVja19hY3Rpb24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuYWN0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmFjdGlvbiA9ICJzdG9yZSIKKyAgICAgICAgZWxpZiBzZWxmLmFjdGlvbiBub3QgaW4gc2VsZi5BQ1RJT05TOgorICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoImludmFsaWQgYWN0aW9uOiAlciIgJSBzZWxmLmFjdGlvbiwgc2VsZikKKworICAgIGRlZiBfY2hlY2tfdHlwZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLmFjdGlvbiBpbiBzZWxmLkFMV0FZU19UWVBFRF9BQ1RJT05TOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2hvaWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgImNob2ljZXMiIGF0dHJpYnV0ZSBpbXBsaWVzICJjaG9pY2UiIHR5cGUuCisgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSA9ICJjaG9pY2UiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBObyB0eXBlIGdpdmVuPyAgInN0cmluZyIgaXMgdGhlIG1vc3Qgc2Vuc2libGUgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlID0gInN0cmluZyIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQWxsb3cgdHlwZSBvYmplY3RzIG9yIGJ1aWx0aW4gdHlwZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworICAgICAgICAgICAgIyAoaW50LCBzdHIsIGV0Yy4pIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZWlyIG5hbWVzLiAgKFRoZQorICAgICAgICAgICAgIyBjb21wbGljYXRlZCBjaGVjayBvZiBfX2J1aWx0aW5fXyBpcyBvbmx5IG5lY2Vzc2FyeSBmb3IKKyAgICAgICAgICAgICMgUHl0aG9uIDIuMSBhbmQgZWFybGllciwgYW5kIGlzIHNob3J0LWNpcmN1aXRlZCBieSB0aGUKKyAgICAgICAgICAgICMgZmlyc3QgY2hlY2sgb24gbW9kZXJuIFB5dGhvbnMuKQorICAgICAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgICAgICBpZiAoIHR5cGUoc2VsZi50eXBlKSBpcyB0eXBlcy5UeXBlVHlwZSBvcgorICAgICAgICAgICAgICAgICAoaGFzYXR0cihzZWxmLnR5cGUsICJfX25hbWVfXyIpIGFuZAorICAgICAgICAgICAgICAgICAgZ2V0YXR0cihfX2J1aWx0aW5fXywgc2VsZi50eXBlLl9fbmFtZV9fLCBOb25lKSBpcyBzZWxmLnR5cGUpICk6CisgICAgICAgICAgICAgICAgc2VsZi50eXBlID0gc2VsZi50eXBlLl9fbmFtZV9fCisKKyAgICAgICAgICAgIGlmIHNlbGYudHlwZSA9PSAic3RyIjoKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGUgPSAic3RyaW5nIgorCisgICAgICAgICAgICBpZiBzZWxmLnR5cGUgbm90IGluIHNlbGYuVFlQRVM6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoImludmFsaWQgb3B0aW9uIHR5cGU6ICVyIiAlIHNlbGYudHlwZSwgc2VsZikKKyAgICAgICAgICAgIGlmIHNlbGYuYWN0aW9uIG5vdCBpbiBzZWxmLlRZUEVEX0FDVElPTlM6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJtdXN0IG5vdCBzdXBwbHkgYSB0eXBlIGZvciBhY3Rpb24gJXIiICUgc2VsZi5hY3Rpb24sIHNlbGYpCisKKyAgICBkZWYgX2NoZWNrX2Nob2ljZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50eXBlID09ICJjaG9pY2UiOgorICAgICAgICAgICAgaWYgc2VsZi5jaG9pY2VzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJtdXN0IHN1cHBseSBhIGxpc3Qgb2YgY2hvaWNlcyBmb3IgdHlwZSAnY2hvaWNlJyIsIHNlbGYpCisgICAgICAgICAgICBlbGlmIHR5cGUoc2VsZi5jaG9pY2VzKSBub3QgaW4gKHR5cGVzLlR1cGxlVHlwZSwgdHlwZXMuTGlzdFR5cGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiY2hvaWNlcyBtdXN0IGJlIGEgbGlzdCBvZiBzdHJpbmdzICgnJXMnIHN1cHBsaWVkKSIKKyAgICAgICAgICAgICAgICAgICAgJSBzdHIodHlwZShzZWxmLmNob2ljZXMpKS5zcGxpdCgiJyIpWzFdLCBzZWxmKQorICAgICAgICBlbGlmIHNlbGYuY2hvaWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJtdXN0IG5vdCBzdXBwbHkgY2hvaWNlcyBmb3IgdHlwZSAlciIgJSBzZWxmLnR5cGUsIHNlbGYpCisKKyAgICBkZWYgX2NoZWNrX2Rlc3Qoc2VsZik6CisgICAgICAgICMgTm8gZGVzdGluYXRpb24gZ2l2ZW4sIGFuZCB3ZSBuZWVkIG9uZSBmb3IgdGhpcyBhY3Rpb24uICBUaGUKKyAgICAgICAgIyBzZWxmLnR5cGUgY2hlY2sgaXMgZm9yIGNhbGxiYWNrcyB0aGF0IHRha2UgYSB2YWx1ZS4KKyAgICAgICAgdGFrZXNfdmFsdWUgPSAoc2VsZi5hY3Rpb24gaW4gc2VsZi5TVE9SRV9BQ1RJT05TIG9yCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudHlwZSBpcyBub3QgTm9uZSkKKyAgICAgICAgaWYgc2VsZi5kZXN0IGlzIE5vbmUgYW5kIHRha2VzX3ZhbHVlOgorCisgICAgICAgICAgICAjIEdsZWFuIGEgZGVzdGluYXRpb24gZnJvbSB0aGUgZmlyc3QgbG9uZyBvcHRpb24gc3RyaW5nLAorICAgICAgICAgICAgIyBvciBmcm9tIHRoZSBmaXJzdCBzaG9ydCBvcHRpb24gc3RyaW5nIGlmIG5vIGxvbmcgb3B0aW9ucy4KKyAgICAgICAgICAgIGlmIHNlbGYuX2xvbmdfb3B0czoKKyAgICAgICAgICAgICAgICAjIGVnLiAiLS1mb28tYmFyIiAtPiAiZm9vX2JhciIKKyAgICAgICAgICAgICAgICBzZWxmLmRlc3QgPSBzZWxmLl9sb25nX29wdHNbMF1bMjpdLnJlcGxhY2UoJy0nLCAnXycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGVzdCA9IHNlbGYuX3Nob3J0X29wdHNbMF1bMV0KKworICAgIGRlZiBfY2hlY2tfY29uc3Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYWN0aW9uIG5vdCBpbiBzZWxmLkNPTlNUX0FDVElPTlMgYW5kIHNlbGYuY29uc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiJ2NvbnN0JyBtdXN0IG5vdCBiZSBzdXBwbGllZCBmb3IgYWN0aW9uICVyIiAlIHNlbGYuYWN0aW9uLAorICAgICAgICAgICAgICAgIHNlbGYpCisKKyAgICBkZWYgX2NoZWNrX25hcmdzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmFjdGlvbiBpbiBzZWxmLlRZUEVEX0FDVElPTlM6CisgICAgICAgICAgICBpZiBzZWxmLm5hcmdzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5uYXJncyA9IDEKKyAgICAgICAgZWxpZiBzZWxmLm5hcmdzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIiduYXJncycgbXVzdCBub3QgYmUgc3VwcGxpZWQgZm9yIGFjdGlvbiAlciIgJSBzZWxmLmFjdGlvbiwKKyAgICAgICAgICAgICAgICBzZWxmKQorCisgICAgZGVmIF9jaGVja19jYWxsYmFjayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5hY3Rpb24gPT0gImNhbGxiYWNrIjoKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuY2FsbGJhY2ssICdfX2NhbGxfXycpOgorICAgICAgICAgICAgICAgIHJhaXNlIE9wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2sgbm90IGNhbGxhYmxlOiAlciIgJSBzZWxmLmNhbGxiYWNrLCBzZWxmKQorICAgICAgICAgICAgaWYgKHNlbGYuY2FsbGJhY2tfYXJncyBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICB0eXBlKHNlbGYuY2FsbGJhY2tfYXJncykgaXMgbm90IHR5cGVzLlR1cGxlVHlwZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJjYWxsYmFja19hcmdzLCBpZiBzdXBwbGllZCwgbXVzdCBiZSBhIHR1cGxlOiBub3QgJXIiCisgICAgICAgICAgICAgICAgICAgICUgc2VsZi5jYWxsYmFja19hcmdzLCBzZWxmKQorICAgICAgICAgICAgaWYgKHNlbGYuY2FsbGJhY2tfa3dhcmdzIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgICAgIHR5cGUoc2VsZi5jYWxsYmFja19rd2FyZ3MpIGlzIG5vdCB0eXBlcy5EaWN0VHlwZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJjYWxsYmFja19rd2FyZ3MsIGlmIHN1cHBsaWVkLCBtdXN0IGJlIGEgZGljdDogbm90ICVyIgorICAgICAgICAgICAgICAgICAgICAlIHNlbGYuY2FsbGJhY2tfa3dhcmdzLCBzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jYWxsYmFjayBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIHN1cHBsaWVkICglcikgZm9yIG5vbi1jYWxsYmFjayBvcHRpb24iCisgICAgICAgICAgICAgICAgICAgICUgc2VsZi5jYWxsYmFjaywgc2VsZikKKyAgICAgICAgICAgIGlmIHNlbGYuY2FsbGJhY2tfYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrX2FyZ3Mgc3VwcGxpZWQgZm9yIG5vbi1jYWxsYmFjayBvcHRpb24iLCBzZWxmKQorICAgICAgICAgICAgaWYgc2VsZi5jYWxsYmFja19rd2FyZ3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJjYWxsYmFja19rd2FyZ3Mgc3VwcGxpZWQgZm9yIG5vbi1jYWxsYmFjayBvcHRpb24iLCBzZWxmKQorCisKKyAgICBDSEVDS19NRVRIT0RTID0gW19jaGVja19hY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIF9jaGVja19jaG9pY2UsCisgICAgICAgICAgICAgICAgICAgICBfY2hlY2tfZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgIF9jaGVja19jb25zdCwKKyAgICAgICAgICAgICAgICAgICAgIF9jaGVja19uYXJncywKKyAgICAgICAgICAgICAgICAgICAgIF9jaGVja19jYWxsYmFja10KKworCisgICAgIyAtLSBNaXNjZWxsYW5lb3VzIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIi8iLmpvaW4oc2VsZi5fc2hvcnRfb3B0cyArIHNlbGYuX2xvbmdfb3B0cykKKworICAgIF9fcmVwcl9fID0gX3JlcHIKKworICAgIGRlZiB0YWtlc192YWx1ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpcyBub3QgTm9uZQorCisgICAgZGVmIGdldF9vcHRfc3RyaW5nKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9sb25nX29wdHM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbG9uZ19vcHRzWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRfb3B0c1swXQorCisKKyAgICAjIC0tIFByb2Nlc3NpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGNoZWNrX3ZhbHVlKHNlbGYsIG9wdCwgdmFsdWUpOgorICAgICAgICBjaGVja2VyID0gc2VsZi5UWVBFX0NIRUNLRVIuZ2V0KHNlbGYudHlwZSkKKyAgICAgICAgaWYgY2hlY2tlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY2hlY2tlcihzZWxmLCBvcHQsIHZhbHVlKQorCisgICAgZGVmIGNvbnZlcnRfdmFsdWUoc2VsZiwgb3B0LCB2YWx1ZSk6CisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5uYXJncyA9PSAxOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmNoZWNrX3ZhbHVlKG9wdCwgdmFsdWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiB0dXBsZShbc2VsZi5jaGVja192YWx1ZShvcHQsIHYpIGZvciB2IGluIHZhbHVlXSkKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIG9wdCwgdmFsdWUsIHZhbHVlcywgcGFyc2VyKToKKworICAgICAgICAjIEZpcnN0LCBjb252ZXJ0IHRoZSB2YWx1ZShzKSB0byB0aGUgcmlnaHQgdHlwZS4gIEhvd2wgaWYgYW55CisgICAgICAgICMgdmFsdWUocykgYXJlIGJvZ3VzLgorICAgICAgICB2YWx1ZSA9IHNlbGYuY29udmVydF92YWx1ZShvcHQsIHZhbHVlKQorCisgICAgICAgICMgQW5kIHRoZW4gdGFrZSB3aGF0ZXZlciBhY3Rpb24gaXMgZXhwZWN0ZWQgb2YgdXMuCisgICAgICAgICMgVGhpcyBpcyBhIHNlcGFyYXRlIG1ldGhvZCB0byBtYWtlIGxpZmUgZWFzaWVyIGZvcgorICAgICAgICAjIHN1YmNsYXNzZXMgdG8gYWRkIG5ldyBhY3Rpb25zLgorICAgICAgICByZXR1cm4gc2VsZi50YWtlX2FjdGlvbigKKyAgICAgICAgICAgIHNlbGYuYWN0aW9uLCBzZWxmLmRlc3QsIG9wdCwgdmFsdWUsIHZhbHVlcywgcGFyc2VyKQorCisgICAgZGVmIHRha2VfYWN0aW9uKHNlbGYsIGFjdGlvbiwgZGVzdCwgb3B0LCB2YWx1ZSwgdmFsdWVzLCBwYXJzZXIpOgorICAgICAgICBpZiBhY3Rpb24gPT0gInN0b3JlIjoKKyAgICAgICAgICAgIHNldGF0dHIodmFsdWVzLCBkZXN0LCB2YWx1ZSkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gInN0b3JlX2NvbnN0IjoKKyAgICAgICAgICAgIHNldGF0dHIodmFsdWVzLCBkZXN0LCBzZWxmLmNvbnN0KQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAic3RvcmVfdHJ1ZSI6CisgICAgICAgICAgICBzZXRhdHRyKHZhbHVlcywgZGVzdCwgVHJ1ZSkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gInN0b3JlX2ZhbHNlIjoKKyAgICAgICAgICAgIHNldGF0dHIodmFsdWVzLCBkZXN0LCBGYWxzZSkKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gImFwcGVuZCI6CisgICAgICAgICAgICB2YWx1ZXMuZW5zdXJlX3ZhbHVlKGRlc3QsIFtdKS5hcHBlbmQodmFsdWUpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJhcHBlbmRfY29uc3QiOgorICAgICAgICAgICAgdmFsdWVzLmVuc3VyZV92YWx1ZShkZXN0LCBbXSkuYXBwZW5kKHNlbGYuY29uc3QpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJjb3VudCI6CisgICAgICAgICAgICBzZXRhdHRyKHZhbHVlcywgZGVzdCwgdmFsdWVzLmVuc3VyZV92YWx1ZShkZXN0LCAwKSArIDEpCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJjYWxsYmFjayI6CisgICAgICAgICAgICBhcmdzID0gc2VsZi5jYWxsYmFja19hcmdzIG9yICgpCisgICAgICAgICAgICBrd2FyZ3MgPSBzZWxmLmNhbGxiYWNrX2t3YXJncyBvciB7fQorICAgICAgICAgICAgc2VsZi5jYWxsYmFjayhzZWxmLCBvcHQsIHZhbHVlLCBwYXJzZXIsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gImhlbHAiOgorICAgICAgICAgICAgcGFyc2VyLnByaW50X2hlbHAoKQorICAgICAgICAgICAgcGFyc2VyLmV4aXQoKQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAidmVyc2lvbiI6CisgICAgICAgICAgICBwYXJzZXIucHJpbnRfdmVyc2lvbigpCisgICAgICAgICAgICBwYXJzZXIuZXhpdCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGFjdGlvbiAlciIgJSBzZWxmLmFjdGlvbikKKworICAgICAgICByZXR1cm4gMQorCisjIGNsYXNzIE9wdGlvbgorCisKK1NVUFBSRVNTX0hFTFAgPSAiU1VQUFJFU1MiKyJIRUxQIgorU1VQUFJFU1NfVVNBR0UgPSAiU1VQUFJFU1MiKyJVU0FHRSIKKwordHJ5OgorICAgIGJhc2VzdHJpbmcKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIGlzYmFzZXN0cmluZyh4KToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgKHR5cGVzLlN0cmluZ1R5cGUsIHR5cGVzLlVuaWNvZGVUeXBlKSkKK2Vsc2U6CisgICAgZGVmIGlzYmFzZXN0cmluZyh4KToKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2UoeCwgYmFzZXN0cmluZykKKworY2xhc3MgVmFsdWVzOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHRzPU5vbmUpOgorICAgICAgICBpZiBkZWZhdWx0czoKKyAgICAgICAgICAgIGZvciAoYXR0ciwgdmFsKSBpbiBkZWZhdWx0cy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgdmFsKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzdHIoc2VsZi5fX2RpY3RfXykKKworICAgIF9fcmVwcl9fID0gX3JlcHIKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVmFsdWVzKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgdHlwZXMuRGljdFR5cGUpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLl9fZGljdF9fLCBvdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIF91cGRhdGVfY2FyZWZ1bChzZWxmLCBkaWN0KToKKyAgICAgICAgIiIiCisgICAgICAgIFVwZGF0ZSB0aGUgb3B0aW9uIHZhbHVlcyBmcm9tIGFuIGFyYml0cmFyeSBkaWN0aW9uYXJ5LCBidXQgb25seQorICAgICAgICB1c2Uga2V5cyBmcm9tIGRpY3QgdGhhdCBhbHJlYWR5IGhhdmUgYSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZQorICAgICAgICBpbiBzZWxmLiAgQW55IGtleXMgaW4gZGljdCB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGUKKyAgICAgICAgYXJlIHNpbGVudGx5IGlnbm9yZWQuCisgICAgICAgICIiIgorICAgICAgICBmb3IgYXR0ciBpbiBkaXIoc2VsZik6CisgICAgICAgICAgICBpZiBhdHRyIGluIGRpY3Q6CisgICAgICAgICAgICAgICAgZHZhbCA9IGRpY3RbYXR0cl0KKyAgICAgICAgICAgICAgICBpZiBkdmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIGR2YWwpCisKKyAgICBkZWYgX3VwZGF0ZV9sb29zZShzZWxmLCBkaWN0KToKKyAgICAgICAgIiIiCisgICAgICAgIFVwZGF0ZSB0aGUgb3B0aW9uIHZhbHVlcyBmcm9tIGFuIGFyYml0cmFyeSBkaWN0aW9uYXJ5LAorICAgICAgICB1c2luZyBhbGwga2V5cyBmcm9tIHRoZSBkaWN0aW9uYXJ5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICAgICAgICB0aGV5IGhhdmUgYSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZSBpbiBzZWxmIG9yIG5vdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGRpY3QpCisKKyAgICBkZWYgX3VwZGF0ZShzZWxmLCBkaWN0LCBtb2RlKToKKyAgICAgICAgaWYgbW9kZSA9PSAiY2FyZWZ1bCI6CisgICAgICAgICAgICBzZWxmLl91cGRhdGVfY2FyZWZ1bChkaWN0KQorICAgICAgICBlbGlmIG1vZGUgPT0gImxvb3NlIjoKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV9sb29zZShkaWN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImludmFsaWQgdXBkYXRlIG1vZGU6ICVyIiAlIG1vZGUKKworICAgIGRlZiByZWFkX21vZHVsZShzZWxmLCBtb2RuYW1lLCBtb2RlPSJjYXJlZnVsIik6CisgICAgICAgIF9faW1wb3J0X18obW9kbmFtZSkKKyAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICAgICAgc2VsZi5fdXBkYXRlKHZhcnMobW9kKSwgbW9kZSkKKworICAgIGRlZiByZWFkX2ZpbGUoc2VsZiwgZmlsZW5hbWUsIG1vZGU9ImNhcmVmdWwiKToKKyAgICAgICAgdmFycyA9IHt9CisgICAgICAgIGV4ZWNmaWxlKGZpbGVuYW1lLCB2YXJzKQorICAgICAgICBzZWxmLl91cGRhdGUodmFycywgbW9kZSkKKworICAgIGRlZiBlbnN1cmVfdmFsdWUoc2VsZiwgYXR0ciwgdmFsdWUpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCBhdHRyKSBvciBnZXRhdHRyKHNlbGYsIGF0dHIpIGlzIE5vbmU6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGF0dHIsIHZhbHVlKQorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBhdHRyKQorCisKK2NsYXNzIE9wdGlvbkNvbnRhaW5lcjoKKworICAgICIiIgorICAgIEFic3RyYWN0IGJhc2UgY2xhc3MuCisKKyAgICBDbGFzcyBhdHRyaWJ1dGVzOgorICAgICAgc3RhbmRhcmRfb3B0aW9uX2xpc3QgOiBbT3B0aW9uXQorICAgICAgICBsaXN0IG9mIHN0YW5kYXJkIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IGFsbCBpbnN0YW5jZXMKKyAgICAgICAgb2YgdGhpcyBwYXJzZXIgY2xhc3MgKGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcykuCisKKyAgICBJbnN0YW5jZSBhdHRyaWJ1dGVzOgorICAgICAgb3B0aW9uX2xpc3QgOiBbT3B0aW9uXQorICAgICAgICB0aGUgbGlzdCBvZiBPcHRpb24gb2JqZWN0cyBjb250YWluZWQgYnkgdGhpcyBPcHRpb25Db250YWluZXIKKyAgICAgIF9zaG9ydF9vcHQgOiB7IHN0cmluZyA6IE9wdGlvbiB9CisgICAgICAgIGRpY3Rpb25hcnkgbWFwcGluZyBzaG9ydCBvcHRpb24gc3RyaW5ncywgZWcuICItZiIgb3IgIi1YIiwKKyAgICAgICAgdG8gdGhlIE9wdGlvbiBpbnN0YW5jZXMgdGhhdCBpbXBsZW1lbnQgdGhlbS4gIElmIGFuIE9wdGlvbgorICAgICAgICBoYXMgbXVsdGlwbGUgc2hvcnQgb3B0aW9uIHN0cmluZ3MsIGl0IHdpbGwgYXBwZWFycyBpbiB0aGlzCisgICAgICAgIGRpY3Rpb25hcnkgbXVsdGlwbGUgdGltZXMuIFsxXQorICAgICAgX2xvbmdfb3B0IDogeyBzdHJpbmcgOiBPcHRpb24gfQorICAgICAgICBkaWN0aW9uYXJ5IG1hcHBpbmcgbG9uZyBvcHRpb24gc3RyaW5ncywgZWcuICItLWZpbGUiIG9yCisgICAgICAgICItLWV4Y2x1ZGUiLCB0byB0aGUgT3B0aW9uIGluc3RhbmNlcyB0aGF0IGltcGxlbWVudCB0aGVtLgorICAgICAgICBBZ2FpbiwgYSBnaXZlbiBPcHRpb24gY2FuIG9jY3VyIG11bHRpcGxlIHRpbWVzIGluIHRoaXMKKyAgICAgICAgZGljdGlvbmFyeS4gWzFdCisgICAgICBkZWZhdWx0cyA6IHsgc3RyaW5nIDogYW55IH0KKyAgICAgICAgZGljdGlvbmFyeSBtYXBwaW5nIG9wdGlvbiBkZXN0aW5hdGlvbiBuYW1lcyB0byBkZWZhdWx0CisgICAgICAgIHZhbHVlcyBmb3IgZWFjaCBkZXN0aW5hdGlvbiBbMV0KKworICAgIFsxXSBUaGVzZSBtYXBwaW5ncyBhcmUgY29tbW9uIHRvIChzaGFyZWQgYnkpIGFsbCBjb21wb25lbnRzIG9mIHRoZQorICAgICAgICBjb250cm9sbGluZyBPcHRpb25QYXJzZXIsIHdoZXJlIHRoZXkgYXJlIGluaXRpYWxseSBjcmVhdGVkLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9uX2NsYXNzLCBjb25mbGljdF9oYW5kbGVyLCBkZXNjcmlwdGlvbik6CisgICAgICAgICMgSW5pdGlhbGl6ZSB0aGUgb3B0aW9uIGxpc3QgYW5kIHJlbGF0ZWQgZGF0YSBzdHJ1Y3R1cmVzLgorICAgICAgICAjIFRoaXMgbWV0aG9kIG11c3QgYmUgcHJvdmlkZWQgYnkgc3ViY2xhc3NlcywgYW5kIGl0IG11c3QKKyAgICAgICAgIyBpbml0aWFsaXplIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcgaW5zdGFuY2UgYXR0cmlidXRlczoKKyAgICAgICAgIyBvcHRpb25fbGlzdCwgX3Nob3J0X29wdCwgX2xvbmdfb3B0LCBkZWZhdWx0cy4KKyAgICAgICAgc2VsZi5fY3JlYXRlX29wdGlvbl9saXN0KCkKKworICAgICAgICBzZWxmLm9wdGlvbl9jbGFzcyA9IG9wdGlvbl9jbGFzcworICAgICAgICBzZWxmLnNldF9jb25mbGljdF9oYW5kbGVyKGNvbmZsaWN0X2hhbmRsZXIpCisgICAgICAgIHNlbGYuc2V0X2Rlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKQorCisgICAgZGVmIF9jcmVhdGVfb3B0aW9uX21hcHBpbmdzKHNlbGYpOgorICAgICAgICAjIEZvciB1c2UgYnkgT3B0aW9uUGFyc2VyIGNvbnN0cnVjdG9yIC0tIGNyZWF0ZSB0aGUgbWFzdGVyCisgICAgICAgICMgb3B0aW9uIG1hcHBpbmdzIHVzZWQgYnkgdGhpcyBPcHRpb25QYXJzZXIgYW5kIGFsbAorICAgICAgICAjIE9wdGlvbkdyb3VwcyB0aGF0IGl0IG93bnMuCisgICAgICAgIHNlbGYuX3Nob3J0X29wdCA9IHt9ICAgICAgICAgICAgIyBzaW5nbGUgbGV0dGVyIC0+IE9wdGlvbiBpbnN0YW5jZQorICAgICAgICBzZWxmLl9sb25nX29wdCA9IHt9ICAgICAgICAgICAgICMgbG9uZyBvcHRpb24gLT4gT3B0aW9uIGluc3RhbmNlCisgICAgICAgIHNlbGYuZGVmYXVsdHMgPSB7fSAgICAgICAgICAgICAgIyBtYXBzIG9wdGlvbiBkZXN0IC0+IGRlZmF1bHQgdmFsdWUKKworCisgICAgZGVmIF9zaGFyZV9vcHRpb25fbWFwcGluZ3Moc2VsZiwgcGFyc2VyKToKKyAgICAgICAgIyBGb3IgdXNlIGJ5IE9wdGlvbkdyb3VwIGNvbnN0cnVjdG9yIC0tIHVzZSBzaGFyZWQgb3B0aW9uCisgICAgICAgICMgbWFwcGluZ3MgZnJvbSB0aGUgT3B0aW9uUGFyc2VyIHRoYXQgb3ducyB0aGlzIE9wdGlvbkdyb3VwLgorICAgICAgICBzZWxmLl9zaG9ydF9vcHQgPSBwYXJzZXIuX3Nob3J0X29wdAorICAgICAgICBzZWxmLl9sb25nX29wdCA9IHBhcnNlci5fbG9uZ19vcHQKKyAgICAgICAgc2VsZi5kZWZhdWx0cyA9IHBhcnNlci5kZWZhdWx0cworCisgICAgZGVmIHNldF9jb25mbGljdF9oYW5kbGVyKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBpZiBoYW5kbGVyIG5vdCBpbiAoImVycm9yIiwgInJlc29sdmUiKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbnZhbGlkIGNvbmZsaWN0X3Jlc29sdXRpb24gdmFsdWUgJXIiICUgaGFuZGxlcgorICAgICAgICBzZWxmLmNvbmZsaWN0X2hhbmRsZXIgPSBoYW5kbGVyCisKKyAgICBkZWYgc2V0X2Rlc2NyaXB0aW9uKHNlbGYsIGRlc2NyaXB0aW9uKToKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCisKKyAgICBkZWYgZ2V0X2Rlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kZXNjcmlwdGlvbgorCisKKyAgICBkZWYgZGVzdHJveShzZWxmKToKKyAgICAgICAgIiIic2VlIE9wdGlvblBhcnNlci5kZXN0cm95KCkuIiIiCisgICAgICAgIGRlbCBzZWxmLl9zaG9ydF9vcHQKKyAgICAgICAgZGVsIHNlbGYuX2xvbmdfb3B0CisgICAgICAgIGRlbCBzZWxmLmRlZmF1bHRzCisKKworICAgICMgLS0gT3B0aW9uLWFkZGluZyBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX2NoZWNrX2NvbmZsaWN0KHNlbGYsIG9wdGlvbik6CisgICAgICAgIGNvbmZsaWN0X29wdHMgPSBbXQorICAgICAgICBmb3Igb3B0IGluIG9wdGlvbi5fc2hvcnRfb3B0czoKKyAgICAgICAgICAgIGlmIG9wdCBpbiBzZWxmLl9zaG9ydF9vcHQ6CisgICAgICAgICAgICAgICAgY29uZmxpY3Rfb3B0cy5hcHBlbmQoKG9wdCwgc2VsZi5fc2hvcnRfb3B0W29wdF0pKQorICAgICAgICBmb3Igb3B0IGluIG9wdGlvbi5fbG9uZ19vcHRzOgorICAgICAgICAgICAgaWYgb3B0IGluIHNlbGYuX2xvbmdfb3B0OgorICAgICAgICAgICAgICAgIGNvbmZsaWN0X29wdHMuYXBwZW5kKChvcHQsIHNlbGYuX2xvbmdfb3B0W29wdF0pKQorCisgICAgICAgIGlmIGNvbmZsaWN0X29wdHM6CisgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5jb25mbGljdF9oYW5kbGVyCisgICAgICAgICAgICBpZiBoYW5kbGVyID09ICJlcnJvciI6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uQ29uZmxpY3RFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImNvbmZsaWN0aW5nIG9wdGlvbiBzdHJpbmcocyk6ICVzIgorICAgICAgICAgICAgICAgICAgICAlICIsICIuam9pbihbY29bMF0gZm9yIGNvIGluIGNvbmZsaWN0X29wdHNdKSwKKyAgICAgICAgICAgICAgICAgICAgb3B0aW9uKQorICAgICAgICAgICAgZWxpZiBoYW5kbGVyID09ICJyZXNvbHZlIjoKKyAgICAgICAgICAgICAgICBmb3IgKG9wdCwgY19vcHRpb24pIGluIGNvbmZsaWN0X29wdHM6CisgICAgICAgICAgICAgICAgICAgIGlmIG9wdC5zdGFydHN3aXRoKCItLSIpOgorICAgICAgICAgICAgICAgICAgICAgICAgY19vcHRpb24uX2xvbmdfb3B0cy5yZW1vdmUob3B0KQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2xvbmdfb3B0W29wdF0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfb3B0aW9uLl9zaG9ydF9vcHRzLnJlbW92ZShvcHQpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5fc2hvcnRfb3B0W29wdF0KKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IChjX29wdGlvbi5fc2hvcnRfb3B0cyBvciBjX29wdGlvbi5fbG9uZ19vcHRzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfb3B0aW9uLmNvbnRhaW5lci5vcHRpb25fbGlzdC5yZW1vdmUoY19vcHRpb24pCisKKyAgICBkZWYgYWRkX29wdGlvbihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAiIiJhZGRfb3B0aW9uKE9wdGlvbikKKyAgICAgICAgICAgYWRkX29wdGlvbihvcHRfc3RyLCAuLi4sIGt3YXJnPXZhbCwgLi4uKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgdHlwZShhcmdzWzBdKSBpbiB0eXBlcy5TdHJpbmdUeXBlczoKKyAgICAgICAgICAgIG9wdGlvbiA9IHNlbGYub3B0aW9uX2NsYXNzKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMSBhbmQgbm90IGt3YXJnczoKKyAgICAgICAgICAgIG9wdGlvbiA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG9wdGlvbiwgT3B0aW9uKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJub3QgYW4gT3B0aW9uIGluc3RhbmNlOiAlciIgJSBvcHRpb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImludmFsaWQgYXJndW1lbnRzIgorCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbmZsaWN0KG9wdGlvbikKKworICAgICAgICBzZWxmLm9wdGlvbl9saXN0LmFwcGVuZChvcHRpb24pCisgICAgICAgIG9wdGlvbi5jb250YWluZXIgPSBzZWxmCisgICAgICAgIGZvciBvcHQgaW4gb3B0aW9uLl9zaG9ydF9vcHRzOgorICAgICAgICAgICAgc2VsZi5fc2hvcnRfb3B0W29wdF0gPSBvcHRpb24KKyAgICAgICAgZm9yIG9wdCBpbiBvcHRpb24uX2xvbmdfb3B0czoKKyAgICAgICAgICAgIHNlbGYuX2xvbmdfb3B0W29wdF0gPSBvcHRpb24KKworICAgICAgICBpZiBvcHRpb24uZGVzdCBpcyBub3QgTm9uZTogICAgICMgb3B0aW9uIGhhcyBhIGRlc3QsIHdlIG5lZWQgYSBkZWZhdWx0CisgICAgICAgICAgICBpZiBvcHRpb24uZGVmYXVsdCBpcyBub3QgTk9fREVGQVVMVDoKKyAgICAgICAgICAgICAgICBzZWxmLmRlZmF1bHRzW29wdGlvbi5kZXN0XSA9IG9wdGlvbi5kZWZhdWx0CisgICAgICAgICAgICBlbGlmIG9wdGlvbi5kZXN0IG5vdCBpbiBzZWxmLmRlZmF1bHRzOgorICAgICAgICAgICAgICAgIHNlbGYuZGVmYXVsdHNbb3B0aW9uLmRlc3RdID0gTm9uZQorCisgICAgICAgIHJldHVybiBvcHRpb24KKworICAgIGRlZiBhZGRfb3B0aW9ucyhzZWxmLCBvcHRpb25fbGlzdCk6CisgICAgICAgIGZvciBvcHRpb24gaW4gb3B0aW9uX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmFkZF9vcHRpb24ob3B0aW9uKQorCisgICAgIyAtLSBPcHRpb24gcXVlcnkvcmVtb3ZhbCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBnZXRfb3B0aW9uKHNlbGYsIG9wdF9zdHIpOgorICAgICAgICByZXR1cm4gKHNlbGYuX3Nob3J0X29wdC5nZXQob3B0X3N0cikgb3IKKyAgICAgICAgICAgICAgICBzZWxmLl9sb25nX29wdC5nZXQob3B0X3N0cikpCisKKyAgICBkZWYgaGFzX29wdGlvbihzZWxmLCBvcHRfc3RyKToKKyAgICAgICAgcmV0dXJuIChvcHRfc3RyIGluIHNlbGYuX3Nob3J0X29wdCBvcgorICAgICAgICAgICAgICAgIG9wdF9zdHIgaW4gc2VsZi5fbG9uZ19vcHQpCisKKyAgICBkZWYgcmVtb3ZlX29wdGlvbihzZWxmLCBvcHRfc3RyKToKKyAgICAgICAgb3B0aW9uID0gc2VsZi5fc2hvcnRfb3B0LmdldChvcHRfc3RyKQorICAgICAgICBpZiBvcHRpb24gaXMgTm9uZToKKyAgICAgICAgICAgIG9wdGlvbiA9IHNlbGYuX2xvbmdfb3B0LmdldChvcHRfc3RyKQorICAgICAgICBpZiBvcHRpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIHN1Y2ggb3B0aW9uICVyIiAlIG9wdF9zdHIpCisKKyAgICAgICAgZm9yIG9wdCBpbiBvcHRpb24uX3Nob3J0X29wdHM6CisgICAgICAgICAgICBkZWwgc2VsZi5fc2hvcnRfb3B0W29wdF0KKyAgICAgICAgZm9yIG9wdCBpbiBvcHRpb24uX2xvbmdfb3B0czoKKyAgICAgICAgICAgIGRlbCBzZWxmLl9sb25nX29wdFtvcHRdCisgICAgICAgIG9wdGlvbi5jb250YWluZXIub3B0aW9uX2xpc3QucmVtb3ZlKG9wdGlvbikKKworCisgICAgIyAtLSBIZWxwLWZvcm1hdHRpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBmb3JtYXRfb3B0aW9uX2hlbHAoc2VsZiwgZm9ybWF0dGVyKToKKyAgICAgICAgaWYgbm90IHNlbGYub3B0aW9uX2xpc3Q6CisgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIG9wdGlvbiBpbiBzZWxmLm9wdGlvbl9saXN0OgorICAgICAgICAgICAgaWYgbm90IG9wdGlvbi5oZWxwIGlzIFNVUFBSRVNTX0hFTFA6CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChmb3JtYXR0ZXIuZm9ybWF0X29wdGlvbihvcHRpb24pKQorICAgICAgICByZXR1cm4gIiIuam9pbihyZXN1bHQpCisKKyAgICBkZWYgZm9ybWF0X2Rlc2NyaXB0aW9uKHNlbGYsIGZvcm1hdHRlcik6CisgICAgICAgIHJldHVybiBmb3JtYXR0ZXIuZm9ybWF0X2Rlc2NyaXB0aW9uKHNlbGYuZ2V0X2Rlc2NyaXB0aW9uKCkpCisKKyAgICBkZWYgZm9ybWF0X2hlbHAoc2VsZiwgZm9ybWF0dGVyKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgaWYgc2VsZi5kZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5mb3JtYXRfZGVzY3JpcHRpb24oZm9ybWF0dGVyKSkKKyAgICAgICAgaWYgc2VsZi5vcHRpb25fbGlzdDoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5mb3JtYXRfb3B0aW9uX2hlbHAoZm9ybWF0dGVyKSkKKyAgICAgICAgcmV0dXJuICJcbiIuam9pbihyZXN1bHQpCisKKworY2xhc3MgT3B0aW9uR3JvdXAgKE9wdGlvbkNvbnRhaW5lcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGFyc2VyLCB0aXRsZSwgZGVzY3JpcHRpb249Tm9uZSk6CisgICAgICAgIHNlbGYucGFyc2VyID0gcGFyc2VyCisgICAgICAgIE9wdGlvbkNvbnRhaW5lci5fX2luaXRfXygKKyAgICAgICAgICAgIHNlbGYsIHBhcnNlci5vcHRpb25fY2xhc3MsIHBhcnNlci5jb25mbGljdF9oYW5kbGVyLCBkZXNjcmlwdGlvbikKKyAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisKKyAgICBkZWYgX2NyZWF0ZV9vcHRpb25fbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5vcHRpb25fbGlzdCA9IFtdCisgICAgICAgIHNlbGYuX3NoYXJlX29wdGlvbl9tYXBwaW5ncyhzZWxmLnBhcnNlcikKKworICAgIGRlZiBzZXRfdGl0bGUoc2VsZiwgdGl0bGUpOgorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiJzZWUgT3B0aW9uUGFyc2VyLmRlc3Ryb3koKS4iIiIKKyAgICAgICAgT3B0aW9uQ29udGFpbmVyLmRlc3Ryb3koc2VsZikKKyAgICAgICAgZGVsIHNlbGYub3B0aW9uX2xpc3QKKworICAgICMgLS0gSGVscC1mb3JtYXR0aW5nIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZm9ybWF0X2hlbHAoc2VsZiwgZm9ybWF0dGVyKToKKyAgICAgICAgcmVzdWx0ID0gZm9ybWF0dGVyLmZvcm1hdF9oZWFkaW5nKHNlbGYudGl0bGUpCisgICAgICAgIGZvcm1hdHRlci5pbmRlbnQoKQorICAgICAgICByZXN1bHQgKz0gT3B0aW9uQ29udGFpbmVyLmZvcm1hdF9oZWxwKHNlbGYsIGZvcm1hdHRlcikKKyAgICAgICAgZm9ybWF0dGVyLmRlZGVudCgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworCitjbGFzcyBPcHRpb25QYXJzZXIgKE9wdGlvbkNvbnRhaW5lcik6CisKKyAgICAiIiIKKyAgICBDbGFzcyBhdHRyaWJ1dGVzOgorICAgICAgc3RhbmRhcmRfb3B0aW9uX2xpc3QgOiBbT3B0aW9uXQorICAgICAgICBsaXN0IG9mIHN0YW5kYXJkIG9wdGlvbnMgdGhhdCB3aWxsIGJlIGFjY2VwdGVkIGJ5IGFsbCBpbnN0YW5jZXMKKyAgICAgICAgb2YgdGhpcyBwYXJzZXIgY2xhc3MgKGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcykuCisKKyAgICBJbnN0YW5jZSBhdHRyaWJ1dGVzOgorICAgICAgdXNhZ2UgOiBzdHJpbmcKKyAgICAgICAgYSB1c2FnZSBzdHJpbmcgZm9yIHlvdXIgcHJvZ3JhbS4gIEJlZm9yZSBpdCBpcyBkaXNwbGF5ZWQKKyAgICAgICAgdG8gdGhlIHVzZXIsICIlcHJvZyIgd2lsbCBiZSBleHBhbmRlZCB0byB0aGUgbmFtZSBvZgorICAgICAgICB5b3VyIHByb2dyYW0gKHNlbGYucHJvZyBvciBvcy5wYXRoLmJhc2VuYW1lKHN5cy5hcmd2WzBdKSkuCisgICAgICBwcm9nIDogc3RyaW5nCisgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHByb2dyYW0gKHRvIG92ZXJyaWRlCisgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pKS4KKyAgICAgIGRlc2NyaXB0aW9uIDogc3RyaW5nCisgICAgICAgIEEgcGFyYWdyYXBoIG9mIHRleHQgZ2l2aW5nIGEgYnJpZWYgb3ZlcnZpZXcgb2YgeW91ciBwcm9ncmFtLgorICAgICAgICBvcHRwYXJzZSByZWZvcm1hdHMgdGhpcyBwYXJhZ3JhcGggdG8gZml0IHRoZSBjdXJyZW50IHRlcm1pbmFsCisgICAgICAgIHdpZHRoIGFuZCBwcmludHMgaXQgd2hlbiB0aGUgdXNlciByZXF1ZXN0cyBoZWxwIChhZnRlciB1c2FnZSwKKyAgICAgICAgYnV0IGJlZm9yZSB0aGUgbGlzdCBvZiBvcHRpb25zKS4KKyAgICAgIGVwaWxvZyA6IHN0cmluZworICAgICAgICBwYXJhZ3JhcGggb2YgaGVscCB0ZXh0IHRvIHByaW50IGFmdGVyIG9wdGlvbiBoZWxwCisKKyAgICAgIG9wdGlvbl9ncm91cHMgOiBbT3B0aW9uR3JvdXBdCisgICAgICAgIGxpc3Qgb2Ygb3B0aW9uIGdyb3VwcyBpbiB0aGlzIHBhcnNlciAob3B0aW9uIGdyb3VwcyBhcmUKKyAgICAgICAgaXJyZWxldmFudCBmb3IgcGFyc2luZyB0aGUgY29tbWFuZC1saW5lLCBidXQgdmVyeSB1c2VmdWwKKyAgICAgICAgZm9yIGdlbmVyYXRpbmcgaGVscCkKKworICAgICAgYWxsb3dfaW50ZXJzcGVyc2VkX2FyZ3MgOiBib29sID0gdHJ1ZQorICAgICAgICBpZiB0cnVlLCBwb3NpdGlvbmFsIGFyZ3VtZW50cyBtYXkgYmUgaW50ZXJzcGVyc2VkIHdpdGggb3B0aW9ucy4KKyAgICAgICAgQXNzdW1pbmcgLWEgYW5kIC1iIGVhY2ggdGFrZSBhIHNpbmdsZSBhcmd1bWVudCwgdGhlIGNvbW1hbmQtbGluZQorICAgICAgICAgIC1hYmxhaCBmb28gYmFyIC1iYm9vIGJhegorICAgICAgICB3aWxsIGJlIGludGVycHJldGVkIHRoZSBzYW1lIGFzCisgICAgICAgICAgLWFibGFoIC1iYm9vIC0tIGZvbyBiYXIgYmF6CisgICAgICAgIElmIHRoaXMgZmxhZyB3ZXJlIGZhbHNlLCB0aGF0IGNvbW1hbmQgbGluZSB3b3VsZCBiZSBpbnRlcnByZXRlZCBhcworICAgICAgICAgIC1hYmxhaCAtLSBmb28gYmFyIC1iYm9vIGJhegorICAgICAgICAtLSBpZS4gd2Ugc3RvcCBwcm9jZXNzaW5nIG9wdGlvbnMgYXMgc29vbiBhcyB3ZSBzZWUgdGhlIGZpcnN0CisgICAgICAgIG5vbi1vcHRpb24gYXJndW1lbnQuICAoVGhpcyBpcyB0aGUgdHJhZGl0aW9uIGZvbGxvd2VkIGJ5CisgICAgICAgIFB5dGhvbidzIGdldG9wdCBtb2R1bGUsIFBlcmwncyBHZXRvcHQ6OlN0ZCwgYW5kIG90aGVyIGFyZ3VtZW50LQorICAgICAgICBwYXJzaW5nIGxpYnJhcmllcywgYnV0IGl0IGlzIGdlbmVyYWxseSBhbm5veWluZyB0byB1c2Vycy4pCisKKyAgICAgIHByb2Nlc3NfZGVmYXVsdF92YWx1ZXMgOiBib29sID0gdHJ1ZQorICAgICAgICBpZiB0cnVlLCBvcHRpb24gZGVmYXVsdCB2YWx1ZXMgYXJlIHByb2Nlc3NlZCBzaW1pbGFybHkgdG8gb3B0aW9uCisgICAgICAgIHZhbHVlcyBmcm9tIHRoZSBjb21tYW5kIGxpbmU6IHRoYXQgaXMsIHRoZXkgYXJlIHBhc3NlZCB0byB0aGUKKyAgICAgICAgdHlwZS1jaGVja2luZyBmdW5jdGlvbiBmb3IgdGhlIG9wdGlvbidzIHR5cGUgKGFzIGxvbmcgYXMgdGhlCisgICAgICAgIGRlZmF1bHQgdmFsdWUgaXMgYSBzdHJpbmcpLiAgKFRoaXMgcmVhbGx5IG9ubHkgbWF0dGVycyBpZiB5b3UKKyAgICAgICAgaGF2ZSBkZWZpbmVkIGN1c3RvbSB0eXBlczsgc2VlIFNGIGJ1ZyAjOTU1ODg5LikgIFNldCBpdCB0byBmYWxzZQorICAgICAgICB0byByZXN0b3JlIHRoZSBiZWhhdmlvdXIgb2YgT3B0aWsgMS40LjEgYW5kIGVhcmxpZXIuCisKKyAgICAgIHJhcmdzIDogW3N0cmluZ10KKyAgICAgICAgdGhlIGFyZ3VtZW50IGxpc3QgY3VycmVudGx5IGJlaW5nIHBhcnNlZC4gIE9ubHkgc2V0IHdoZW4KKyAgICAgICAgcGFyc2VfYXJncygpIGlzIGFjdGl2ZSwgYW5kIGNvbnRpbnVhbGx5IHRyaW1tZWQgZG93biBhcworICAgICAgICB3ZSBjb25zdW1lIGFyZ3VtZW50cy4gIE1haW5seSB0aGVyZSBmb3IgdGhlIGJlbmVmaXQgb2YKKyAgICAgICAgY2FsbGJhY2sgb3B0aW9ucy4KKyAgICAgIGxhcmdzIDogW3N0cmluZ10KKyAgICAgICAgdGhlIGxpc3Qgb2YgbGVmdG92ZXIgYXJndW1lbnRzIHRoYXQgd2UgaGF2ZSBza2lwcGVkIHdoaWxlCisgICAgICAgIHBhcnNpbmcgb3B0aW9ucy4gIElmIGFsbG93X2ludGVyc3BlcnNlZF9hcmdzIGlzIGZhbHNlLCB0aGlzCisgICAgICAgIGxpc3QgaXMgYWx3YXlzIGVtcHR5LgorICAgICAgdmFsdWVzIDogVmFsdWVzCisgICAgICAgIHRoZSBzZXQgb2Ygb3B0aW9uIHZhbHVlcyBjdXJyZW50bHkgYmVpbmcgYWNjdW11bGF0ZWQuICBPbmx5CisgICAgICAgIHNldCB3aGVuIHBhcnNlX2FyZ3MoKSBpcyBhY3RpdmUuICBBbHNvIG1haW5seSBmb3IgY2FsbGJhY2tzLgorCisgICAgQmVjYXVzZSBvZiB0aGUgJ3JhcmdzJywgJ2xhcmdzJywgYW5kICd2YWx1ZXMnIGF0dHJpYnV0ZXMsCisgICAgT3B0aW9uUGFyc2VyIGlzIG5vdCB0aHJlYWQtc2FmZS4gIElmLCBmb3Igc29tZSBwZXJ2ZXJzZSByZWFzb24sIHlvdQorICAgIG5lZWQgdG8gcGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBzaW11bHRhbmVvdXNseSBpbiBkaWZmZXJlbnQKKyAgICB0aHJlYWRzLCB1c2UgZGlmZmVyZW50IE9wdGlvblBhcnNlciBpbnN0YW5jZXMuCisKKyAgICAiIiIKKworICAgIHN0YW5kYXJkX29wdGlvbl9saXN0ID0gW10KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICB1c2FnZT1Ob25lLAorICAgICAgICAgICAgICAgICBvcHRpb25fbGlzdD1Ob25lLAorICAgICAgICAgICAgICAgICBvcHRpb25fY2xhc3M9T3B0aW9uLAorICAgICAgICAgICAgICAgICB2ZXJzaW9uPU5vbmUsCisgICAgICAgICAgICAgICAgIGNvbmZsaWN0X2hhbmRsZXI9ImVycm9yIiwKKyAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249Tm9uZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0dGVyPU5vbmUsCisgICAgICAgICAgICAgICAgIGFkZF9oZWxwX29wdGlvbj1UcnVlLAorICAgICAgICAgICAgICAgICBwcm9nPU5vbmUsCisgICAgICAgICAgICAgICAgIGVwaWxvZz1Ob25lKToKKyAgICAgICAgT3B0aW9uQ29udGFpbmVyLl9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwgb3B0aW9uX2NsYXNzLCBjb25mbGljdF9oYW5kbGVyLCBkZXNjcmlwdGlvbikKKyAgICAgICAgc2VsZi5zZXRfdXNhZ2UodXNhZ2UpCisgICAgICAgIHNlbGYucHJvZyA9IHByb2cKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICBzZWxmLmFsbG93X2ludGVyc3BlcnNlZF9hcmdzID0gVHJ1ZQorICAgICAgICBzZWxmLnByb2Nlc3NfZGVmYXVsdF92YWx1ZXMgPSBUcnVlCisgICAgICAgIGlmIGZvcm1hdHRlciBpcyBOb25lOgorICAgICAgICAgICAgZm9ybWF0dGVyID0gSW5kZW50ZWRIZWxwRm9ybWF0dGVyKCkKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIgPSBmb3JtYXR0ZXIKKyAgICAgICAgc2VsZi5mb3JtYXR0ZXIuc2V0X3BhcnNlcihzZWxmKQorICAgICAgICBzZWxmLmVwaWxvZyA9IGVwaWxvZworCisgICAgICAgICMgUG9wdWxhdGUgdGhlIG9wdGlvbiBsaXN0OyBpbml0aWFsIHNvdXJjZXMgYXJlIHRoZQorICAgICAgICAjIHN0YW5kYXJkX29wdGlvbl9saXN0IGNsYXNzIGF0dHJpYnV0ZSwgdGhlICdvcHRpb25fbGlzdCcKKyAgICAgICAgIyBhcmd1bWVudCwgYW5kIChpZiBhcHBsaWNhYmxlKSB0aGUgX2FkZF92ZXJzaW9uX29wdGlvbigpIGFuZAorICAgICAgICAjIF9hZGRfaGVscF9vcHRpb24oKSBtZXRob2RzLgorICAgICAgICBzZWxmLl9wb3B1bGF0ZV9vcHRpb25fbGlzdChvcHRpb25fbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hlbHA9YWRkX2hlbHBfb3B0aW9uKQorCisgICAgICAgIHNlbGYuX2luaXRfcGFyc2luZ19zdGF0ZSgpCisKKworICAgIGRlZiBkZXN0cm95KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgRGVjbGFyZSB0aGF0IHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgT3B0aW9uUGFyc2VyLiAgVGhpcyBjbGVhbnMgdXAKKyAgICAgICAgcmVmZXJlbmNlIGN5Y2xlcyBzbyB0aGUgT3B0aW9uUGFyc2VyIChhbmQgYWxsIG9iamVjdHMgcmVmZXJlbmNlZCBieQorICAgICAgICBpdCkgY2FuIGJlIGdhcmJhZ2UtY29sbGVjdGVkIHByb21wdGx5LiAgQWZ0ZXIgY2FsbGluZyBkZXN0cm95KCksIHRoZQorICAgICAgICBPcHRpb25QYXJzZXIgaXMgdW51c2FibGUuCisgICAgICAgICIiIgorICAgICAgICBPcHRpb25Db250YWluZXIuZGVzdHJveShzZWxmKQorICAgICAgICBmb3IgZ3JvdXAgaW4gc2VsZi5vcHRpb25fZ3JvdXBzOgorICAgICAgICAgICAgZ3JvdXAuZGVzdHJveSgpCisgICAgICAgIGRlbCBzZWxmLm9wdGlvbl9saXN0CisgICAgICAgIGRlbCBzZWxmLm9wdGlvbl9ncm91cHMKKyAgICAgICAgZGVsIHNlbGYuZm9ybWF0dGVyCisKKworICAgICMgLS0gUHJpdmF0ZSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyAodXNlZCBieSBvdXIgb3IgT3B0aW9uQ29udGFpbmVyJ3MgY29uc3RydWN0b3IpCisKKyAgICBkZWYgX2NyZWF0ZV9vcHRpb25fbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5vcHRpb25fbGlzdCA9IFtdCisgICAgICAgIHNlbGYub3B0aW9uX2dyb3VwcyA9IFtdCisgICAgICAgIHNlbGYuX2NyZWF0ZV9vcHRpb25fbWFwcGluZ3MoKQorCisgICAgZGVmIF9hZGRfaGVscF9vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYWRkX29wdGlvbigiLWgiLCAiLS1oZWxwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iaGVscCIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPV8oInNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQiKSkKKworICAgIGRlZiBfYWRkX3ZlcnNpb25fb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFkZF9vcHRpb24oIi0tdmVyc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InZlcnNpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1fKCJzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdCIpKQorCisgICAgZGVmIF9wb3B1bGF0ZV9vcHRpb25fbGlzdChzZWxmLCBvcHRpb25fbGlzdCwgYWRkX2hlbHA9VHJ1ZSk6CisgICAgICAgIGlmIHNlbGYuc3RhbmRhcmRfb3B0aW9uX2xpc3Q6CisgICAgICAgICAgICBzZWxmLmFkZF9vcHRpb25zKHNlbGYuc3RhbmRhcmRfb3B0aW9uX2xpc3QpCisgICAgICAgIGlmIG9wdGlvbl9saXN0OgorICAgICAgICAgICAgc2VsZi5hZGRfb3B0aW9ucyhvcHRpb25fbGlzdCkKKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uOgorICAgICAgICAgICAgc2VsZi5fYWRkX3ZlcnNpb25fb3B0aW9uKCkKKyAgICAgICAgaWYgYWRkX2hlbHA6CisgICAgICAgICAgICBzZWxmLl9hZGRfaGVscF9vcHRpb24oKQorCisgICAgZGVmIF9pbml0X3BhcnNpbmdfc3RhdGUoc2VsZik6CisgICAgICAgICMgVGhlc2UgYXJlIHNldCBpbiBwYXJzZV9hcmdzKCkgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiBjYWxsYmFja3MuCisgICAgICAgIHNlbGYucmFyZ3MgPSBOb25lCisgICAgICAgIHNlbGYubGFyZ3MgPSBOb25lCisgICAgICAgIHNlbGYudmFsdWVzID0gTm9uZQorCisKKyAgICAjIC0tIFNpbXBsZSBtb2RpZmllciBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHNldF91c2FnZShzZWxmLCB1c2FnZSk6CisgICAgICAgIGlmIHVzYWdlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnVzYWdlID0gXygiJXByb2cgW29wdGlvbnNdIikKKyAgICAgICAgZWxpZiB1c2FnZSBpcyBTVVBQUkVTU19VU0FHRToKKyAgICAgICAgICAgIHNlbGYudXNhZ2UgPSBOb25lCisgICAgICAgICMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggT3B0aWsgMS4zIGFuZCBlYXJsaWVyLgorICAgICAgICBlbGlmIHVzYWdlLmxvd2VyKCkuc3RhcnRzd2l0aCgidXNhZ2U6ICIpOgorICAgICAgICAgICAgc2VsZi51c2FnZSA9IHVzYWdlWzc6XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi51c2FnZSA9IHVzYWdlCisKKyAgICBkZWYgZW5hYmxlX2ludGVyc3BlcnNlZF9hcmdzKHNlbGYpOgorICAgICAgICAiIiJTZXQgcGFyc2luZyB0byBub3Qgc3RvcCBvbiB0aGUgZmlyc3Qgbm9uLW9wdGlvbiwgYWxsb3dpbmcKKyAgICAgICAgaW50ZXJzcGVyc2luZyBzd2l0Y2hlcyB3aXRoIGNvbW1hbmQgYXJndW1lbnRzLiBUaGlzIGlzIHRoZQorICAgICAgICBkZWZhdWx0IGJlaGF2aW9yLiBTZWUgYWxzbyBkaXNhYmxlX2ludGVyc3BlcnNlZF9hcmdzKCkgYW5kIHRoZQorICAgICAgICBjbGFzcyBkb2N1bWVudGF0aW9uIGRlc2NyaXB0aW9uIG9mIHRoZSBhdHRyaWJ1dGUKKyAgICAgICAgYWxsb3dfaW50ZXJzcGVyc2VkX2FyZ3MuIiIiCisgICAgICAgIHNlbGYuYWxsb3dfaW50ZXJzcGVyc2VkX2FyZ3MgPSBUcnVlCisKKyAgICBkZWYgZGlzYWJsZV9pbnRlcnNwZXJzZWRfYXJncyhzZWxmKToKKyAgICAgICAgIiIiU2V0IHBhcnNpbmcgdG8gc3RvcCBvbiB0aGUgZmlyc3Qgbm9uLW9wdGlvbi4gVXNlIHRoaXMgaWYKKyAgICAgICAgeW91IGhhdmUgYSBjb21tYW5kIHByb2Nlc3NvciB3aGljaCBydW5zIGFub3RoZXIgY29tbWFuZCB0aGF0CisgICAgICAgIGhhcyBvcHRpb25zIG9mIGl0cyBvd24gYW5kIHlvdSB3YW50IHRvIG1ha2Ugc3VyZSB0aGVzZSBvcHRpb25zCisgICAgICAgIGRvbid0IGdldCBjb25mdXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYWxsb3dfaW50ZXJzcGVyc2VkX2FyZ3MgPSBGYWxzZQorCisgICAgZGVmIHNldF9wcm9jZXNzX2RlZmF1bHRfdmFsdWVzKHNlbGYsIHByb2Nlc3MpOgorICAgICAgICBzZWxmLnByb2Nlc3NfZGVmYXVsdF92YWx1ZXMgPSBwcm9jZXNzCisKKyAgICBkZWYgc2V0X2RlZmF1bHQoc2VsZiwgZGVzdCwgdmFsdWUpOgorICAgICAgICBzZWxmLmRlZmF1bHRzW2Rlc3RdID0gdmFsdWUKKworICAgIGRlZiBzZXRfZGVmYXVsdHMoc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBzZWxmLmRlZmF1bHRzLnVwZGF0ZShrd2FyZ3MpCisKKyAgICBkZWYgX2dldF9hbGxfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IHNlbGYub3B0aW9uX2xpc3RbOl0KKyAgICAgICAgZm9yIGdyb3VwIGluIHNlbGYub3B0aW9uX2dyb3VwczoKKyAgICAgICAgICAgIG9wdGlvbnMuZXh0ZW5kKGdyb3VwLm9wdGlvbl9saXN0KQorICAgICAgICByZXR1cm4gb3B0aW9ucworCisgICAgZGVmIGdldF9kZWZhdWx0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucHJvY2Vzc19kZWZhdWx0X3ZhbHVlczoKKyAgICAgICAgICAgICMgT2xkLCBwcmUtT3B0aWsgMS41IGJlaGF2aW91ci4KKyAgICAgICAgICAgIHJldHVybiBWYWx1ZXMoc2VsZi5kZWZhdWx0cykKKworICAgICAgICBkZWZhdWx0cyA9IHNlbGYuZGVmYXVsdHMuY29weSgpCisgICAgICAgIGZvciBvcHRpb24gaW4gc2VsZi5fZ2V0X2FsbF9vcHRpb25zKCk6CisgICAgICAgICAgICBkZWZhdWx0ID0gZGVmYXVsdHMuZ2V0KG9wdGlvbi5kZXN0KQorICAgICAgICAgICAgaWYgaXNiYXNlc3RyaW5nKGRlZmF1bHQpOgorICAgICAgICAgICAgICAgIG9wdF9zdHIgPSBvcHRpb24uZ2V0X29wdF9zdHJpbmcoKQorICAgICAgICAgICAgICAgIGRlZmF1bHRzW29wdGlvbi5kZXN0XSA9IG9wdGlvbi5jaGVja192YWx1ZShvcHRfc3RyLCBkZWZhdWx0KQorCisgICAgICAgIHJldHVybiBWYWx1ZXMoZGVmYXVsdHMpCisKKworICAgICMgLS0gT3B0aW9uR3JvdXAgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgYWRkX29wdGlvbl9ncm91cChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAjIFhYWCBsb3RzIG9mIG92ZXJsYXAgd2l0aCBPcHRpb25Db250YWluZXIuYWRkX29wdGlvbigpCisgICAgICAgIGlmIHR5cGUoYXJnc1swXSkgaXMgdHlwZXMuU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGdyb3VwID0gT3B0aW9uR3JvdXAoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAxIGFuZCBub3Qga3dhcmdzOgorICAgICAgICAgICAgZ3JvdXAgPSBhcmdzWzBdCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShncm91cCwgT3B0aW9uR3JvdXApOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIm5vdCBhbiBPcHRpb25Hcm91cCBpbnN0YW5jZTogJXIiICUgZ3JvdXAKKyAgICAgICAgICAgIGlmIGdyb3VwLnBhcnNlciBpcyBub3Qgc2VsZjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW52YWxpZCBPcHRpb25Hcm91cCAod3JvbmcgcGFyc2VyKSIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImludmFsaWQgYXJndW1lbnRzIgorCisgICAgICAgIHNlbGYub3B0aW9uX2dyb3Vwcy5hcHBlbmQoZ3JvdXApCisgICAgICAgIHJldHVybiBncm91cAorCisgICAgZGVmIGdldF9vcHRpb25fZ3JvdXAoc2VsZiwgb3B0X3N0cik6CisgICAgICAgIG9wdGlvbiA9IChzZWxmLl9zaG9ydF9vcHQuZ2V0KG9wdF9zdHIpIG9yCisgICAgICAgICAgICAgICAgICBzZWxmLl9sb25nX29wdC5nZXQob3B0X3N0cikpCisgICAgICAgIGlmIG9wdGlvbiBhbmQgb3B0aW9uLmNvbnRhaW5lciBpcyBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJldHVybiBvcHRpb24uY29udGFpbmVyCisgICAgICAgIHJldHVybiBOb25lCisKKworICAgICMgLS0gT3B0aW9uLXBhcnNpbmcgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX2dldF9hcmdzKHNlbGYsIGFyZ3MpOgorICAgICAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc3lzLmFyZ3ZbMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gYXJnc1s6XSAgICAgICAgICAgICAgIyBkb24ndCBtb2RpZnkgY2FsbGVyJ3MgbGlzdAorCisgICAgZGVmIHBhcnNlX2FyZ3Moc2VsZiwgYXJncz1Ob25lLCB2YWx1ZXM9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBwYXJzZV9hcmdzKGFyZ3MgOiBbc3RyaW5nXSA9IHN5cy5hcmd2WzE6XSwKKyAgICAgICAgICAgICAgICAgICB2YWx1ZXMgOiBWYWx1ZXMgPSBOb25lKQorICAgICAgICAtPiAodmFsdWVzIDogVmFsdWVzLCBhcmdzIDogW3N0cmluZ10pCisKKyAgICAgICAgUGFyc2UgdGhlIGNvbW1hbmQtbGluZSBvcHRpb25zIGZvdW5kIGluICdhcmdzJyAoZGVmYXVsdDoKKyAgICAgICAgc3lzLmFyZ3ZbMTpdKS4gIEFueSBlcnJvcnMgcmVzdWx0IGluIGEgY2FsbCB0byAnZXJyb3IoKScsIHdoaWNoCisgICAgICAgIGJ5IGRlZmF1bHQgcHJpbnRzIHRoZSB1c2FnZSBtZXNzYWdlIHRvIHN0ZGVyciBhbmQgY2FsbHMKKyAgICAgICAgc3lzLmV4aXQoKSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UuICBPbiBzdWNjZXNzIHJldHVybnMgYSBwYWlyCisgICAgICAgICh2YWx1ZXMsIGFyZ3MpIHdoZXJlICd2YWx1ZXMnIGlzIGFuIFZhbHVlcyBpbnN0YW5jZSAod2l0aCBhbGwKKyAgICAgICAgeW91ciBvcHRpb24gdmFsdWVzKSBhbmQgJ2FyZ3MnIGlzIHRoZSBsaXN0IG9mIGFyZ3VtZW50cyBsZWZ0CisgICAgICAgIG92ZXIgYWZ0ZXIgcGFyc2luZyBvcHRpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgcmFyZ3MgPSBzZWxmLl9nZXRfYXJncyhhcmdzKQorICAgICAgICBpZiB2YWx1ZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHZhbHVlcyA9IHNlbGYuZ2V0X2RlZmF1bHRfdmFsdWVzKCkKKworICAgICAgICAjIFN0b3JlIHRoZSBoYWx2ZXMgb2YgdGhlIGFyZ3VtZW50IGxpc3QgYXMgYXR0cmlidXRlcyBmb3IgdGhlCisgICAgICAgICMgY29udmVuaWVuY2Ugb2YgY2FsbGJhY2tzOgorICAgICAgICAjICAgcmFyZ3MKKyAgICAgICAgIyAgICAgdGhlIHJlc3Qgb2YgdGhlIGNvbW1hbmQtbGluZSAodGhlICJyIiBzdGFuZHMgZm9yCisgICAgICAgICMgICAgICJyZW1haW5pbmciIG9yICJyaWdodC1oYW5kIikKKyAgICAgICAgIyAgIGxhcmdzCisgICAgICAgICMgICAgIHRoZSBsZWZ0b3ZlciBhcmd1bWVudHMgLS0gaWUuIHdoYXQncyBsZWZ0IGFmdGVyIHJlbW92aW5nCisgICAgICAgICMgICAgIG9wdGlvbnMgYW5kIHRoZWlyIGFyZ3VtZW50cyAodGhlICJsIiBzdGFuZHMgZm9yICJsZWZ0b3ZlciIKKyAgICAgICAgIyAgICAgb3IgImxlZnQtaGFuZCIpCisgICAgICAgIHNlbGYucmFyZ3MgPSByYXJncworICAgICAgICBzZWxmLmxhcmdzID0gbGFyZ3MgPSBbXQorICAgICAgICBzZWxmLnZhbHVlcyA9IHZhbHVlcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLl9wcm9jZXNzX2FyZ3MobGFyZ3MsIHJhcmdzLCB2YWx1ZXMpCisgICAgICAgIGV4Y2VwdCAoQmFkT3B0aW9uRXJyb3IsIE9wdGlvblZhbHVlRXJyb3IpLCBlcnI6CisgICAgICAgICAgICBzZWxmLmVycm9yKHN0cihlcnIpKQorCisgICAgICAgIGFyZ3MgPSBsYXJncyArIHJhcmdzCisgICAgICAgIHJldHVybiBzZWxmLmNoZWNrX3ZhbHVlcyh2YWx1ZXMsIGFyZ3MpCisKKyAgICBkZWYgY2hlY2tfdmFsdWVzKHNlbGYsIHZhbHVlcywgYXJncyk6CisgICAgICAgICIiIgorICAgICAgICBjaGVja192YWx1ZXModmFsdWVzIDogVmFsdWVzLCBhcmdzIDogW3N0cmluZ10pCisgICAgICAgIC0+ICh2YWx1ZXMgOiBWYWx1ZXMsIGFyZ3MgOiBbc3RyaW5nXSkKKworICAgICAgICBDaGVjayB0aGF0IHRoZSBzdXBwbGllZCBvcHRpb24gdmFsdWVzIGFuZCBsZWZ0b3ZlciBhcmd1bWVudHMgYXJlCisgICAgICAgIHZhbGlkLiAgUmV0dXJucyB0aGUgb3B0aW9uIHZhbHVlcyBhbmQgbGVmdG92ZXIgYXJndW1lbnRzCisgICAgICAgIChwb3NzaWJseSBhZGp1c3RlZCwgcG9zc2libHkgY29tcGxldGVseSBuZXcgLS0gd2hhdGV2ZXIgeW91CisgICAgICAgIGxpa2UpLiAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IHJldHVybnMgdGhlIHBhc3NlZC1pbgorICAgICAgICB2YWx1ZXM7IHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIGFzIGRlc2lyZWQuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKHZhbHVlcywgYXJncykKKworICAgIGRlZiBfcHJvY2Vzc19hcmdzKHNlbGYsIGxhcmdzLCByYXJncywgdmFsdWVzKToKKyAgICAgICAgIiIiX3Byb2Nlc3NfYXJncyhsYXJncyA6IFtzdHJpbmddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJhcmdzIDogW3N0cmluZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzIDogVmFsdWVzKQorCisgICAgICAgIFByb2Nlc3MgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgcG9wdWxhdGUgJ3ZhbHVlcycsIGNvbnN1bWluZworICAgICAgICBvcHRpb25zIGFuZCBhcmd1bWVudHMgZnJvbSAncmFyZ3MnLiAgSWYgJ2FsbG93X2ludGVyc3BlcnNlZF9hcmdzJyBpcworICAgICAgICBmYWxzZSwgc3RvcCBhdCB0aGUgZmlyc3Qgbm9uLW9wdGlvbiBhcmd1bWVudC4gIElmIHRydWUsIGFjY3VtdWxhdGUgYW55CisgICAgICAgIGludGVyc3BlcnNlZCBub24tb3B0aW9uIGFyZ3VtZW50cyBpbiAnbGFyZ3MnLgorICAgICAgICAiIiIKKyAgICAgICAgd2hpbGUgcmFyZ3M6CisgICAgICAgICAgICBhcmcgPSByYXJnc1swXQorICAgICAgICAgICAgIyBXZSBoYW5kbGUgYmFyZSAiLS0iIGV4cGxpY2l0bHksIGFuZCBiYXJlICItIiBpcyBoYW5kbGVkIGJ5IHRoZQorICAgICAgICAgICAgIyBzdGFuZGFyZCBhcmcgaGFuZGxlciBzaW5jZSB0aGUgc2hvcnQgYXJnIGNhc2UgZW5zdXJlcyB0aGF0IHRoZQorICAgICAgICAgICAgIyBsZW4gb2YgdGhlIG9wdCBzdHJpbmcgaXMgZ3JlYXRlciB0aGFuIDEuCisgICAgICAgICAgICBpZiBhcmcgPT0gIi0tIjoKKyAgICAgICAgICAgICAgICBkZWwgcmFyZ3NbMF0KKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsaWYgYXJnWzA6Ml0gPT0gIi0tIjoKKyAgICAgICAgICAgICAgICAjIHByb2Nlc3MgYSBzaW5nbGUgbG9uZyBvcHRpb24gKHBvc3NpYmx5IHdpdGggdmFsdWUocykpCisgICAgICAgICAgICAgICAgc2VsZi5fcHJvY2Vzc19sb25nX29wdChyYXJncywgdmFsdWVzKQorICAgICAgICAgICAgZWxpZiBhcmdbOjFdID09ICItIiBhbmQgbGVuKGFyZykgPiAxOgorICAgICAgICAgICAgICAgICMgcHJvY2VzcyBhIGNsdXN0ZXIgb2Ygc2hvcnQgb3B0aW9ucyAocG9zc2libHkgd2l0aAorICAgICAgICAgICAgICAgICMgdmFsdWUocykgZm9yIHRoZSBsYXN0IG9uZSBvbmx5KQorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3Nfc2hvcnRfb3B0cyhyYXJncywgdmFsdWVzKQorICAgICAgICAgICAgZWxpZiBzZWxmLmFsbG93X2ludGVyc3BlcnNlZF9hcmdzOgorICAgICAgICAgICAgICAgIGxhcmdzLmFwcGVuZChhcmcpCisgICAgICAgICAgICAgICAgZGVsIHJhcmdzWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICAgICAgICMgc3RvcCBub3csIGxlYXZlIHRoaXMgYXJnIGluIHJhcmdzCisKKyAgICAgICAgIyBTYXkgdGhpcyBpcyB0aGUgb3JpZ2luYWwgYXJndW1lbnQgbGlzdDoKKyAgICAgICAgIyBbYXJnMCwgYXJnMSwgLi4uLCBhcmcoaS0xKSwgYXJnKGkpLCBhcmcoaSsxKSwgLi4uLCBhcmcoTi0xKV0KKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICMgKHdlIGFyZSBhYm91dCB0byBwcm9jZXNzIGFyZyhpKSkuCisgICAgICAgICMKKyAgICAgICAgIyBUaGVuIHJhcmdzIGlzIFthcmcoaSksIC4uLiwgYXJnKE4tMSldIGFuZCBsYXJncyBpcyBhICpzdWJzZXQqIG9mCisgICAgICAgICMgW2FyZzAsIC4uLiwgYXJnKGktMSldIChhbnkgb3B0aW9ucyBhbmQgdGhlaXIgYXJndW1lbnRzIHdpbGwgaGF2ZQorICAgICAgICAjIGJlZW4gcmVtb3ZlZCBmcm9tIGxhcmdzKS4KKyAgICAgICAgIworICAgICAgICAjIFRoZSB3aGlsZSBsb29wIHdpbGwgdXN1YWxseSBjb25zdW1lIDEgb3IgbW9yZSBhcmd1bWVudHMgcGVyIHBhc3MuCisgICAgICAgICMgSWYgaXQgY29uc3VtZXMgMSAoZWcuIGFyZyBpcyBhbiBvcHRpb24gdGhhdCB0YWtlcyBubyBhcmd1bWVudHMpLAorICAgICAgICAjIHRoZW4gYWZ0ZXIgX3Byb2Nlc3NfYXJnKCkgaXMgZG9uZSB0aGUgc2l0dWF0aW9uIGlzOgorICAgICAgICAjCisgICAgICAgICMgICBsYXJncyA9IHN1YnNldCBvZiBbYXJnMCwgLi4uLCBhcmcoaSldCisgICAgICAgICMgICByYXJncyA9IFthcmcoaSsxKSwgLi4uLCBhcmcoTi0xKV0KKyAgICAgICAgIworICAgICAgICAjIElmIGFsbG93X2ludGVyc3BlcnNlZF9hcmdzIGlzIGZhbHNlLCBsYXJncyB3aWxsIGFsd2F5cyBiZQorICAgICAgICAjICplbXB0eSogLS0gc3RpbGwgYSBzdWJzZXQgb2YgW2FyZzAsIC4uLiwgYXJnKGktMSldLCBidXQKKyAgICAgICAgIyBub3QgYSB2ZXJ5IGludGVyZXN0aW5nIHN1YnNldCEKKworICAgIGRlZiBfbWF0Y2hfbG9uZ19vcHQoc2VsZiwgb3B0KToKKyAgICAgICAgIiIiX21hdGNoX2xvbmdfb3B0KG9wdCA6IHN0cmluZykgLT4gc3RyaW5nCisKKyAgICAgICAgRGV0ZXJtaW5lIHdoaWNoIGxvbmcgb3B0aW9uIHN0cmluZyAnb3B0JyBtYXRjaGVzLCBpZS4gd2hpY2ggb25lCisgICAgICAgIGl0IGlzIGFuIHVuYW1iaWd1b3VzIGFiYnJldmF0aW9uIGZvci4gIFJhaXNlcyBCYWRPcHRpb25FcnJvciBpZgorICAgICAgICAnb3B0JyBkb2Vzbid0IHVuYW1iaWd1b3VzbHkgbWF0Y2ggYW55IGxvbmcgb3B0aW9uIHN0cmluZy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBfbWF0Y2hfYWJicmV2KG9wdCwgc2VsZi5fbG9uZ19vcHQpCisKKyAgICBkZWYgX3Byb2Nlc3NfbG9uZ19vcHQoc2VsZiwgcmFyZ3MsIHZhbHVlcyk6CisgICAgICAgIGFyZyA9IHJhcmdzLnBvcCgwKQorCisgICAgICAgICMgVmFsdWUgZXhwbGljaXRseSBhdHRhY2hlZCB0byBhcmc/ICBQcmV0ZW5kIGl0J3MgdGhlIG5leHQKKyAgICAgICAgIyBhcmd1bWVudC4KKyAgICAgICAgaWYgIj0iIGluIGFyZzoKKyAgICAgICAgICAgIChvcHQsIG5leHRfYXJnKSA9IGFyZy5zcGxpdCgiPSIsIDEpCisgICAgICAgICAgICByYXJncy5pbnNlcnQoMCwgbmV4dF9hcmcpCisgICAgICAgICAgICBoYWRfZXhwbGljaXRfdmFsdWUgPSBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcHQgPSBhcmcKKyAgICAgICAgICAgIGhhZF9leHBsaWNpdF92YWx1ZSA9IEZhbHNlCisKKyAgICAgICAgb3B0ID0gc2VsZi5fbWF0Y2hfbG9uZ19vcHQob3B0KQorICAgICAgICBvcHRpb24gPSBzZWxmLl9sb25nX29wdFtvcHRdCisgICAgICAgIGlmIG9wdGlvbi50YWtlc192YWx1ZSgpOgorICAgICAgICAgICAgbmFyZ3MgPSBvcHRpb24ubmFyZ3MKKyAgICAgICAgICAgIGlmIGxlbihyYXJncykgPCBuYXJnczoKKyAgICAgICAgICAgICAgICBpZiBuYXJncyA9PSAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKF8oIiVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIpICUgb3B0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoXygiJXMgb3B0aW9uIHJlcXVpcmVzICVkIGFyZ3VtZW50cyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAob3B0LCBuYXJncykpCisgICAgICAgICAgICBlbGlmIG5hcmdzID09IDE6CisgICAgICAgICAgICAgICAgdmFsdWUgPSByYXJncy5wb3AoMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB0dXBsZShyYXJnc1swOm5hcmdzXSkKKyAgICAgICAgICAgICAgICBkZWwgcmFyZ3NbMDpuYXJnc10KKworICAgICAgICBlbGlmIGhhZF9leHBsaWNpdF92YWx1ZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3IoXygiJXMgb3B0aW9uIGRvZXMgbm90IHRha2UgYSB2YWx1ZSIpICUgb3B0KQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKworICAgICAgICBvcHRpb24ucHJvY2VzcyhvcHQsIHZhbHVlLCB2YWx1ZXMsIHNlbGYpCisKKyAgICBkZWYgX3Byb2Nlc3Nfc2hvcnRfb3B0cyhzZWxmLCByYXJncywgdmFsdWVzKToKKyAgICAgICAgYXJnID0gcmFyZ3MucG9wKDApCisgICAgICAgIHN0b3AgPSBGYWxzZQorICAgICAgICBpID0gMQorICAgICAgICBmb3IgY2ggaW4gYXJnWzE6XToKKyAgICAgICAgICAgIG9wdCA9ICItIiArIGNoCisgICAgICAgICAgICBvcHRpb24gPSBzZWxmLl9zaG9ydF9vcHQuZ2V0KG9wdCkKKyAgICAgICAgICAgIGkgKz0gMSAgICAgICAgICAgICAgICAgICAgICAjIHdlIGhhdmUgY29uc3VtZWQgYSBjaGFyYWN0ZXIKKworICAgICAgICAgICAgaWYgbm90IG9wdGlvbjoKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRPcHRpb25FcnJvcihvcHQpCisgICAgICAgICAgICBpZiBvcHRpb24udGFrZXNfdmFsdWUoKToKKyAgICAgICAgICAgICAgICAjIEFueSBjaGFyYWN0ZXJzIGxlZnQgaW4gYXJnPyAgUHJldGVuZCB0aGV5J3JlIHRoZQorICAgICAgICAgICAgICAgICMgbmV4dCBhcmcsIGFuZCBzdG9wIGNvbnN1bWluZyBjaGFyYWN0ZXJzIG9mIGFyZy4KKyAgICAgICAgICAgICAgICBpZiBpIDwgbGVuKGFyZyk6CisgICAgICAgICAgICAgICAgICAgIHJhcmdzLmluc2VydCgwLCBhcmdbaTpdKQorICAgICAgICAgICAgICAgICAgICBzdG9wID0gVHJ1ZQorCisgICAgICAgICAgICAgICAgbmFyZ3MgPSBvcHRpb24ubmFyZ3MKKyAgICAgICAgICAgICAgICBpZiBsZW4ocmFyZ3MpIDwgbmFyZ3M6CisgICAgICAgICAgICAgICAgICAgIGlmIG5hcmdzID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmVycm9yKF8oIiVzIG9wdGlvbiByZXF1aXJlcyBhbiBhcmd1bWVudCIpICUgb3B0KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5lcnJvcihfKCIlcyBvcHRpb24gcmVxdWlyZXMgJWQgYXJndW1lbnRzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAob3B0LCBuYXJncykpCisgICAgICAgICAgICAgICAgZWxpZiBuYXJncyA9PSAxOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJhcmdzLnBvcCgwKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdHVwbGUocmFyZ3NbMDpuYXJnc10pCisgICAgICAgICAgICAgICAgICAgIGRlbCByYXJnc1swOm5hcmdzXQorCisgICAgICAgICAgICBlbHNlOiAgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb24gZG9lc24ndCB0YWtlIGEgdmFsdWUKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IE5vbmUKKworICAgICAgICAgICAgb3B0aW9uLnByb2Nlc3Mob3B0LCB2YWx1ZSwgdmFsdWVzLCBzZWxmKQorCisgICAgICAgICAgICBpZiBzdG9wOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKworICAgICMgLS0gRmVlZGJhY2sgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZ2V0X3Byb2dfbmFtZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5wcm9nIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnByb2cKKworICAgIGRlZiBleHBhbmRfcHJvZ19uYW1lKHNlbGYsIHMpOgorICAgICAgICByZXR1cm4gcy5yZXBsYWNlKCIlcHJvZyIsIHNlbGYuZ2V0X3Byb2dfbmFtZSgpKQorCisgICAgZGVmIGdldF9kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZXhwYW5kX3Byb2dfbmFtZShzZWxmLmRlc2NyaXB0aW9uKQorCisgICAgZGVmIGV4aXQoc2VsZiwgc3RhdHVzPTAsIG1zZz1Ob25lKToKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cpCisgICAgICAgIHN5cy5leGl0KHN0YXR1cykKKworICAgIGRlZiBlcnJvcihzZWxmLCBtc2cpOgorICAgICAgICAiIiJlcnJvcihtc2cgOiBzdHJpbmcpCisKKyAgICAgICAgUHJpbnQgYSB1c2FnZSBtZXNzYWdlIGluY29ycG9yYXRpbmcgJ21zZycgdG8gc3RkZXJyIGFuZCBleGl0LgorICAgICAgICBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBpbiBhIHN1YmNsYXNzLCBpdCBzaG91bGQgbm90IHJldHVybiAtLSBpdAorICAgICAgICBzaG91bGQgZWl0aGVyIGV4aXQgb3IgcmFpc2UgYW4gZXhjZXB0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5wcmludF91c2FnZShzeXMuc3RkZXJyKQorICAgICAgICBzZWxmLmV4aXQoMiwgIiVzOiBlcnJvcjogJXNcbiIgJSAoc2VsZi5nZXRfcHJvZ19uYW1lKCksIG1zZykpCisKKyAgICBkZWYgZ2V0X3VzYWdlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnVzYWdlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZm9ybWF0dGVyLmZvcm1hdF91c2FnZSgKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGFuZF9wcm9nX25hbWUoc2VsZi51c2FnZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBwcmludF91c2FnZShzZWxmLCBmaWxlPU5vbmUpOgorICAgICAgICAiIiJwcmludF91c2FnZShmaWxlIDogZmlsZSA9IHN0ZG91dCkKKworICAgICAgICBQcmludCB0aGUgdXNhZ2UgbWVzc2FnZSBmb3IgdGhlIGN1cnJlbnQgcHJvZ3JhbSAoc2VsZi51c2FnZSkgdG8KKyAgICAgICAgJ2ZpbGUnIChkZWZhdWx0IHN0ZG91dCkuICBBbnkgb2NjdXJyZW5jZSBvZiB0aGUgc3RyaW5nICIlcHJvZyIgaW4KKyAgICAgICAgc2VsZi51c2FnZSBpcyByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHByb2dyYW0KKyAgICAgICAgKGJhc2VuYW1lIG9mIHN5cy5hcmd2WzBdKS4gIERvZXMgbm90aGluZyBpZiBzZWxmLnVzYWdlIGlzIGVtcHR5CisgICAgICAgIG9yIG5vdCBkZWZpbmVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi51c2FnZToKKyAgICAgICAgICAgIHByaW50ID4+ZmlsZSwgc2VsZi5nZXRfdXNhZ2UoKQorCisgICAgZGVmIGdldF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnZlcnNpb246CisgICAgICAgICAgICByZXR1cm4gc2VsZi5leHBhbmRfcHJvZ19uYW1lKHNlbGYudmVyc2lvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgZGVmIHByaW50X3ZlcnNpb24oc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIicHJpbnRfdmVyc2lvbihmaWxlIDogZmlsZSA9IHN0ZG91dCkKKworICAgICAgICBQcmludCB0aGUgdmVyc2lvbiBtZXNzYWdlIGZvciB0aGlzIHByb2dyYW0gKHNlbGYudmVyc2lvbikgdG8KKyAgICAgICAgJ2ZpbGUnIChkZWZhdWx0IHN0ZG91dCkuICBBcyB3aXRoIHByaW50X3VzYWdlKCksIGFueSBvY2N1cnJlbmNlCisgICAgICAgIG9mICIlcHJvZyIgaW4gc2VsZi52ZXJzaW9uIGlzIHJlcGxhY2VkIGJ5IHRoZSBjdXJyZW50IHByb2dyYW0ncworICAgICAgICBuYW1lLiAgRG9lcyBub3RoaW5nIGlmIHNlbGYudmVyc2lvbiBpcyBlbXB0eSBvciB1bmRlZmluZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLnZlcnNpb246CisgICAgICAgICAgICBwcmludCA+PmZpbGUsIHNlbGYuZ2V0X3ZlcnNpb24oKQorCisgICAgZGVmIGZvcm1hdF9vcHRpb25faGVscChzZWxmLCBmb3JtYXR0ZXI9Tm9uZSk6CisgICAgICAgIGlmIGZvcm1hdHRlciBpcyBOb25lOgorICAgICAgICAgICAgZm9ybWF0dGVyID0gc2VsZi5mb3JtYXR0ZXIKKyAgICAgICAgZm9ybWF0dGVyLnN0b3JlX29wdGlvbl9zdHJpbmdzKHNlbGYpCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIHJlc3VsdC5hcHBlbmQoZm9ybWF0dGVyLmZvcm1hdF9oZWFkaW5nKF8oIk9wdGlvbnMiKSkpCisgICAgICAgIGZvcm1hdHRlci5pbmRlbnQoKQorICAgICAgICBpZiBzZWxmLm9wdGlvbl9saXN0OgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChPcHRpb25Db250YWluZXIuZm9ybWF0X29wdGlvbl9oZWxwKHNlbGYsIGZvcm1hdHRlcikpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpCisgICAgICAgIGZvciBncm91cCBpbiBzZWxmLm9wdGlvbl9ncm91cHM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGdyb3VwLmZvcm1hdF9oZWxwKGZvcm1hdHRlcikpCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpCisgICAgICAgIGZvcm1hdHRlci5kZWRlbnQoKQorICAgICAgICAjIERyb3AgdGhlIGxhc3QgIlxuIiwgb3IgdGhlIGhlYWRlciBpZiBubyBvcHRpb25zIG9yIG9wdGlvbiBncm91cHM6CisgICAgICAgIHJldHVybiAiIi5qb2luKHJlc3VsdFs6LTFdKQorCisgICAgZGVmIGZvcm1hdF9lcGlsb2coc2VsZiwgZm9ybWF0dGVyKToKKyAgICAgICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRfZXBpbG9nKHNlbGYuZXBpbG9nKQorCisgICAgZGVmIGZvcm1hdF9oZWxwKHNlbGYsIGZvcm1hdHRlcj1Ob25lKToKKyAgICAgICAgaWYgZm9ybWF0dGVyIGlzIE5vbmU6CisgICAgICAgICAgICBmb3JtYXR0ZXIgPSBzZWxmLmZvcm1hdHRlcgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBpZiBzZWxmLnVzYWdlOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLmdldF91c2FnZSgpICsgIlxuIikKKyAgICAgICAgaWYgc2VsZi5kZXNjcmlwdGlvbjoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5mb3JtYXRfZGVzY3JpcHRpb24oZm9ybWF0dGVyKSArICJcbiIpCisgICAgICAgIHJlc3VsdC5hcHBlbmQoc2VsZi5mb3JtYXRfb3B0aW9uX2hlbHAoZm9ybWF0dGVyKSkKKyAgICAgICAgcmVzdWx0LmFwcGVuZChzZWxmLmZvcm1hdF9lcGlsb2coZm9ybWF0dGVyKSkKKyAgICAgICAgcmV0dXJuICIiLmpvaW4ocmVzdWx0KQorCisgICAgIyB1c2VkIGJ5IHRlc3Qgc3VpdGUKKyAgICBkZWYgX2dldF9lbmNvZGluZyhzZWxmLCBmaWxlKToKKyAgICAgICAgZW5jb2RpbmcgPSBnZXRhdHRyKGZpbGUsICJlbmNvZGluZyIsIE5vbmUpCisgICAgICAgIGlmIG5vdCBlbmNvZGluZzoKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIHJldHVybiBlbmNvZGluZworCisgICAgZGVmIHByaW50X2hlbHAoc2VsZiwgZmlsZT1Ob25lKToKKyAgICAgICAgIiIicHJpbnRfaGVscChmaWxlIDogZmlsZSA9IHN0ZG91dCkKKworICAgICAgICBQcmludCBhbiBleHRlbmRlZCBoZWxwIG1lc3NhZ2UsIGxpc3RpbmcgYWxsIG9wdGlvbnMgYW5kIGFueQorICAgICAgICBoZWxwIHRleHQgcHJvdmlkZWQgd2l0aCB0aGVtLCB0byAnZmlsZScgKGRlZmF1bHQgc3Rkb3V0KS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgIGZpbGUgPSBzeXMuc3Rkb3V0CisgICAgICAgIGVuY29kaW5nID0gc2VsZi5fZ2V0X2VuY29kaW5nKGZpbGUpCisgICAgICAgIGZpbGUud3JpdGUoc2VsZi5mb3JtYXRfaGVscCgpLmVuY29kZShlbmNvZGluZywgInJlcGxhY2UiKSkKKworIyBjbGFzcyBPcHRpb25QYXJzZXIKKworCitkZWYgX21hdGNoX2FiYnJldihzLCB3b3JkbWFwKToKKyAgICAiIiJfbWF0Y2hfYWJicmV2KHMgOiBzdHJpbmcsIHdvcmRtYXAgOiB7c3RyaW5nIDogT3B0aW9ufSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gdGhlIHN0cmluZyBrZXkgaW4gJ3dvcmRtYXAnIGZvciB3aGljaCAncycgaXMgYW4gdW5hbWJpZ3VvdXMKKyAgICBhYmJyZXZpYXRpb24uICBJZiAncycgaXMgZm91bmQgdG8gYmUgYW1iaWd1b3VzIG9yIGRvZXNuJ3QgbWF0Y2ggYW55IG9mCisgICAgJ3dvcmRzJywgcmFpc2UgQmFkT3B0aW9uRXJyb3IuCisgICAgIiIiCisgICAgIyBJcyB0aGVyZSBhbiBleGFjdCBtYXRjaD8KKyAgICBpZiBzIGluIHdvcmRtYXA6CisgICAgICAgIHJldHVybiBzCisgICAgZWxzZToKKyAgICAgICAgIyBJc29sYXRlIGFsbCB3b3JkcyB3aXRoIHMgYXMgYSBwcmVmaXguCisgICAgICAgIHBvc3NpYmlsaXRpZXMgPSBbd29yZCBmb3Igd29yZCBpbiB3b3JkbWFwLmtleXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHdvcmQuc3RhcnRzd2l0aChzKV0KKyAgICAgICAgIyBObyBleGFjdCBtYXRjaCwgc28gdGhlcmUgaGFkIGJldHRlciBiZSBqdXN0IG9uZSBwb3NzaWJpbGl0eS4KKyAgICAgICAgaWYgbGVuKHBvc3NpYmlsaXRpZXMpID09IDE6CisgICAgICAgICAgICByZXR1cm4gcG9zc2liaWxpdGllc1swXQorICAgICAgICBlbGlmIG5vdCBwb3NzaWJpbGl0aWVzOgorICAgICAgICAgICAgcmFpc2UgQmFkT3B0aW9uRXJyb3IocykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgTW9yZSB0aGFuIG9uZSBwb3NzaWJsZSBjb21wbGV0aW9uOiBhbWJpZ3VvdXMgcHJlZml4LgorICAgICAgICAgICAgcG9zc2liaWxpdGllcy5zb3J0KCkKKyAgICAgICAgICAgIHJhaXNlIEFtYmlndW91c09wdGlvbkVycm9yKHMsIHBvc3NpYmlsaXRpZXMpCisKKworIyBTb21lIGRheSwgdGhlcmUgbWlnaHQgYmUgbWFueSBPcHRpb24gY2xhc3Nlcy4gIEFzIG9mIE9wdGlrIDEuMywgdGhlCisjIHByZWZlcnJlZCB3YXkgdG8gaW5zdGFudGlhdGUgT3B0aW9ucyBpcyBpbmRpcmVjdGx5LCB2aWEgbWFrZV9vcHRpb24oKSwKKyMgd2hpY2ggd2lsbCBiZWNvbWUgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoZW4gdGhlcmUgYXJlIG1hbnkgT3B0aW9uCisjIGNsYXNzZXMuCittYWtlX29wdGlvbiA9IE9wdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcHRwYXJzZS5weWMgYi9saWIvcHl0aG9uMi43L29wdHBhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQ4NWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vcHRwYXJzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcHRwYXJzZS5weW8gYi9saWIvcHl0aG9uMi43L29wdHBhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDlkYWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9vcHRwYXJzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9vcy5weSBiL2xpYi9weXRob24yLjcvb3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1OThmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvb3MucHkKQEAgLTAsMCArMSw3NDAgQEAKK3IiIiJPUyByb3V0aW5lcyBmb3IgTWFjLCBOVCwgb3IgUG9zaXggZGVwZW5kaW5nIG9uIHdoYXQgc3lzdGVtIHdlJ3JlIG9uLgorCitUaGlzIGV4cG9ydHM6CisgIC0gYWxsIGZ1bmN0aW9ucyBmcm9tIHBvc2l4LCBudCwgb3MyLCBvciBjZSwgZS5nLiB1bmxpbmssIHN0YXQsIGV0Yy4KKyAgLSBvcy5wYXRoIGlzIG9uZSBvZiB0aGUgbW9kdWxlcyBwb3NpeHBhdGgsIG9yIG50cGF0aAorICAtIG9zLm5hbWUgaXMgJ3Bvc2l4JywgJ250JywgJ29zMicsICdjZScgb3IgJ3Jpc2NvcycKKyAgLSBvcy5jdXJkaXIgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGRpcmVjdG9yeSAoJy4nIG9yICc6JykKKyAgLSBvcy5wYXJkaXIgaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXJlbnQgZGlyZWN0b3J5ICgnLi4nIG9yICc6OicpCisgIC0gb3Muc2VwIGlzIHRoZSAob3IgYSBtb3N0IGNvbW1vbikgcGF0aG5hbWUgc2VwYXJhdG9yICgnLycgb3IgJzonIG9yICdcXCcpCisgIC0gb3MuZXh0c2VwIGlzIHRoZSBleHRlbnNpb24gc2VwYXJhdG9yICgnLicgb3IgJy8nKQorICAtIG9zLmFsdHNlcCBpcyB0aGUgYWx0ZXJuYXRlIHBhdGhuYW1lIHNlcGFyYXRvciAoTm9uZSBvciAnLycpCisgIC0gb3MucGF0aHNlcCBpcyB0aGUgY29tcG9uZW50IHNlcGFyYXRvciB1c2VkIGluICRQQVRIIGV0YworICAtIG9zLmxpbmVzZXAgaXMgdGhlIGxpbmUgc2VwYXJhdG9yIGluIHRleHQgZmlsZXMgKCdccicgb3IgJ1xuJyBvciAnXHJcbicpCisgIC0gb3MuZGVmcGF0aCBpcyB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBmb3IgZXhlY3V0YWJsZXMKKyAgLSBvcy5kZXZudWxsIGlzIHRoZSBmaWxlIHBhdGggb2YgdGhlIG51bGwgZGV2aWNlICgnL2Rldi9udWxsJywgZXRjLikKKworUHJvZ3JhbXMgdGhhdCBpbXBvcnQgYW5kIHVzZSAnb3MnIHN0YW5kIGEgYmV0dGVyIGNoYW5jZSBvZiBiZWluZworcG9ydGFibGUgYmV0d2VlbiBkaWZmZXJlbnQgcGxhdGZvcm1zLiAgT2YgY291cnNlLCB0aGV5IG11c3QgdGhlbgorb25seSB1c2UgZnVuY3Rpb25zIHRoYXQgYXJlIGRlZmluZWQgYnkgYWxsIHBsYXRmb3JtcyAoZS5nLiwgdW5saW5rCithbmQgb3BlbmRpciksIGFuZCBsZWF2ZSBhbGwgcGF0aG5hbWUgbWFuaXB1bGF0aW9uIHRvIG9zLnBhdGgKKyhlLmcuLCBzcGxpdCBhbmQgam9pbikuCisiIiIKKworIycKKworaW1wb3J0IHN5cywgZXJybm8KKworX25hbWVzID0gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzCisKKyMgTm90ZTogIG1vcmUgbmFtZXMgYXJlIGFkZGVkIHRvIF9fYWxsX18gbGF0ZXIuCitfX2FsbF9fID0gWyJhbHRzZXAiLCAiY3VyZGlyIiwgInBhcmRpciIsICJzZXAiLCAiZXh0c2VwIiwgInBhdGhzZXAiLCAibGluZXNlcCIsCisgICAgICAgICAgICJkZWZwYXRoIiwgIm5hbWUiLCAicGF0aCIsICJkZXZudWxsIiwKKyAgICAgICAgICAgIlNFRUtfU0VUIiwgIlNFRUtfQ1VSIiwgIlNFRUtfRU5EIl0KKworZGVmIF9nZXRfZXhwb3J0c19saXN0KG1vZHVsZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gbGlzdChtb2R1bGUuX19hbGxfXykKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHJldHVybiBbbiBmb3IgbiBpbiBkaXIobW9kdWxlKSBpZiBuWzBdICE9ICdfJ10KKworaWYgJ3Bvc2l4JyBpbiBfbmFtZXM6CisgICAgbmFtZSA9ICdwb3NpeCcKKyAgICBsaW5lc2VwID0gJ1xuJworICAgIGZyb20gcG9zaXggaW1wb3J0ICoKKyAgICB0cnk6CisgICAgICAgIGZyb20gcG9zaXggaW1wb3J0IF9leGl0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgaW1wb3J0IHBvc2l4cGF0aCBhcyBwYXRoCisKKyAgICBpbXBvcnQgcG9zaXgKKyAgICBfX2FsbF9fLmV4dGVuZChfZ2V0X2V4cG9ydHNfbGlzdChwb3NpeCkpCisgICAgZGVsIHBvc2l4CisKK2VsaWYgJ250JyBpbiBfbmFtZXM6CisgICAgbmFtZSA9ICdudCcKKyAgICBsaW5lc2VwID0gJ1xyXG4nCisgICAgZnJvbSBudCBpbXBvcnQgKgorICAgIHRyeToKKyAgICAgICAgZnJvbSBudCBpbXBvcnQgX2V4aXQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBpbXBvcnQgbnRwYXRoIGFzIHBhdGgKKworICAgIGltcG9ydCBudAorICAgIF9fYWxsX18uZXh0ZW5kKF9nZXRfZXhwb3J0c19saXN0KG50KSkKKyAgICBkZWwgbnQKKworZWxpZiAnb3MyJyBpbiBfbmFtZXM6CisgICAgbmFtZSA9ICdvczInCisgICAgbGluZXNlcCA9ICdcclxuJworICAgIGZyb20gb3MyIGltcG9ydCAqCisgICAgdHJ5OgorICAgICAgICBmcm9tIG9zMiBpbXBvcnQgX2V4aXQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBpZiBzeXMudmVyc2lvbi5maW5kKCdFTVggR0NDJykgPT0gLTE6CisgICAgICAgIGltcG9ydCBudHBhdGggYXMgcGF0aAorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBvczJlbXhwYXRoIGFzIHBhdGgKKyAgICAgICAgZnJvbSBfZW14X2xpbmsgaW1wb3J0IGxpbmsKKworICAgIGltcG9ydCBvczIKKyAgICBfX2FsbF9fLmV4dGVuZChfZ2V0X2V4cG9ydHNfbGlzdChvczIpKQorICAgIGRlbCBvczIKKworZWxpZiAnY2UnIGluIF9uYW1lczoKKyAgICBuYW1lID0gJ2NlJworICAgIGxpbmVzZXAgPSAnXHJcbicKKyAgICBmcm9tIGNlIGltcG9ydCAqCisgICAgdHJ5OgorICAgICAgICBmcm9tIGNlIGltcG9ydCBfZXhpdAorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgICMgV2UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgV2luZG93cyBwYXRoLgorICAgIGltcG9ydCBudHBhdGggYXMgcGF0aAorCisgICAgaW1wb3J0IGNlCisgICAgX19hbGxfXy5leHRlbmQoX2dldF9leHBvcnRzX2xpc3QoY2UpKQorICAgIGRlbCBjZQorCitlbGlmICdyaXNjb3MnIGluIF9uYW1lczoKKyAgICBuYW1lID0gJ3Jpc2NvcycKKyAgICBsaW5lc2VwID0gJ1xuJworICAgIGZyb20gcmlzY29zIGltcG9ydCAqCisgICAgdHJ5OgorICAgICAgICBmcm9tIHJpc2NvcyBpbXBvcnQgX2V4aXQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBpbXBvcnQgcmlzY29zcGF0aCBhcyBwYXRoCisKKyAgICBpbXBvcnQgcmlzY29zCisgICAgX19hbGxfXy5leHRlbmQoX2dldF9leHBvcnRzX2xpc3QocmlzY29zKSkKKyAgICBkZWwgcmlzY29zCisKK2Vsc2U6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IsICdubyBvcyBzcGVjaWZpYyBtb2R1bGUgZm91bmQnCisKK3N5cy5tb2R1bGVzWydvcy5wYXRoJ10gPSBwYXRoCitmcm9tIG9zLnBhdGggaW1wb3J0IChjdXJkaXIsIHBhcmRpciwgc2VwLCBwYXRoc2VwLCBkZWZwYXRoLCBleHRzZXAsIGFsdHNlcCwKKyAgICBkZXZudWxsKQorCitkZWwgX25hbWVzCisKKyMgUHl0aG9uIHVzZXMgZml4ZWQgdmFsdWVzIGZvciB0aGUgU0VFS18gY29uc3RhbnRzOyB0aGV5IGFyZSBtYXBwZWQKKyMgdG8gbmF0aXZlIGNvbnN0YW50cyBpZiBuZWNlc3NhcnkgaW4gcG9zaXhtb2R1bGUuYworU0VFS19TRVQgPSAwCitTRUVLX0NVUiA9IDEKK1NFRUtfRU5EID0gMgorCisjJworCisjIFN1cGVyIGRpcmVjdG9yeSB1dGlsaXRpZXMuCisjIChJbnNwaXJlZCBieSBFcmljIFJheW1vbmQ7IHRoZSBkb2Mgc3RyaW5ncyBhcmUgbW9zdGx5IGhpcykKKworZGVmIG1ha2VkaXJzKG5hbWUsIG1vZGU9MDc3Nyk6CisgICAgIiIibWFrZWRpcnMocGF0aCBbLCBtb2RlPTA3NzddKQorCisgICAgU3VwZXItbWtkaXI7IGNyZWF0ZSBhIGxlYWYgZGlyZWN0b3J5IGFuZCBhbGwgaW50ZXJtZWRpYXRlIG9uZXMuCisgICAgV29ya3MgbGlrZSBta2RpciwgZXhjZXB0IHRoYXQgYW55IGludGVybWVkaWF0ZSBwYXRoIHNlZ21lbnQgKG5vdAorICAgIGp1c3QgdGhlIHJpZ2h0bW9zdCkgd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMgbm90IGV4aXN0LiAgVGhpcyBpcworICAgIHJlY3Vyc2l2ZS4KKworICAgICIiIgorICAgIGhlYWQsIHRhaWwgPSBwYXRoLnNwbGl0KG5hbWUpCisgICAgaWYgbm90IHRhaWw6CisgICAgICAgIGhlYWQsIHRhaWwgPSBwYXRoLnNwbGl0KGhlYWQpCisgICAgaWYgaGVhZCBhbmQgdGFpbCBhbmQgbm90IHBhdGguZXhpc3RzKGhlYWQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtYWtlZGlycyhoZWFkLCBtb2RlKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICMgYmUgaGFwcHkgaWYgc29tZW9uZSBhbHJlYWR5IGNyZWF0ZWQgdGhlIHBhdGgKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGlmIHRhaWwgPT0gY3VyZGlyOiAgICAgICAgICAgIyB4eHgvbmV3ZGlyLy4gZXhpc3RzIGlmIHh4eC9uZXdkaXIgZXhpc3RzCisgICAgICAgICAgICByZXR1cm4KKyAgICBta2RpcihuYW1lLCBtb2RlKQorCitkZWYgcmVtb3ZlZGlycyhuYW1lKToKKyAgICAiIiJyZW1vdmVkaXJzKHBhdGgpCisKKyAgICBTdXBlci1ybWRpcjsgcmVtb3ZlIGEgbGVhZiBkaXJlY3RvcnkgYW5kIGFsbCBlbXB0eSBpbnRlcm1lZGlhdGUKKyAgICBvbmVzLiAgV29ya3MgbGlrZSBybWRpciBleGNlcHQgdGhhdCwgaWYgdGhlIGxlYWYgZGlyZWN0b3J5IGlzCisgICAgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGRpcmVjdG9yaWVzIGNvcnJlc3BvbmRpbmcgdG8gcmlnaHRtb3N0IHBhdGgKKyAgICBzZWdtZW50cyB3aWxsIGJlIHBydW5lZCBhd2F5IHVudGlsIGVpdGhlciB0aGUgd2hvbGUgcGF0aCBpcworICAgIGNvbnN1bWVkIG9yIGFuIGVycm9yIG9jY3Vycy4gIEVycm9ycyBkdXJpbmcgdGhpcyBsYXR0ZXIgcGhhc2UgYXJlCisgICAgaWdub3JlZCAtLSB0aGV5IGdlbmVyYWxseSBtZWFuIHRoYXQgYSBkaXJlY3Rvcnkgd2FzIG5vdCBlbXB0eS4KKworICAgICIiIgorICAgIHJtZGlyKG5hbWUpCisgICAgaGVhZCwgdGFpbCA9IHBhdGguc3BsaXQobmFtZSkKKyAgICBpZiBub3QgdGFpbDoKKyAgICAgICAgaGVhZCwgdGFpbCA9IHBhdGguc3BsaXQoaGVhZCkKKyAgICB3aGlsZSBoZWFkIGFuZCB0YWlsOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBybWRpcihoZWFkKQorICAgICAgICBleGNlcHQgZXJyb3I6CisgICAgICAgICAgICBicmVhaworICAgICAgICBoZWFkLCB0YWlsID0gcGF0aC5zcGxpdChoZWFkKQorCitkZWYgcmVuYW1lcyhvbGQsIG5ldyk6CisgICAgIiIicmVuYW1lcyhvbGQsIG5ldykKKworICAgIFN1cGVyLXJlbmFtZTsgY3JlYXRlIGRpcmVjdG9yaWVzIGFzIG5lY2Vzc2FyeSBhbmQgZGVsZXRlIGFueSBsZWZ0CisgICAgZW1wdHkuICBXb3JrcyBsaWtlIHJlbmFtZSwgZXhjZXB0IGNyZWF0aW9uIG9mIGFueSBpbnRlcm1lZGlhdGUKKyAgICBkaXJlY3RvcmllcyBuZWVkZWQgdG8gbWFrZSB0aGUgbmV3IHBhdGhuYW1lIGdvb2QgaXMgYXR0ZW1wdGVkCisgICAgZmlyc3QuICBBZnRlciB0aGUgcmVuYW1lLCBkaXJlY3RvcmllcyBjb3JyZXNwb25kaW5nIHRvIHJpZ2h0bW9zdAorICAgIHBhdGggc2VnbWVudHMgb2YgdGhlIG9sZCBuYW1lIHdpbGwgYmUgcHJ1bmVkIHdheSB1bnRpbCBlaXRoZXIgdGhlCisgICAgd2hvbGUgcGF0aCBpcyBjb25zdW1lZCBvciBhIG5vbmVtcHR5IGRpcmVjdG9yeSBpcyBmb3VuZC4KKworICAgIE5vdGU6IHRoaXMgZnVuY3Rpb24gY2FuIGZhaWwgd2l0aCB0aGUgbmV3IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgbWFkZQorICAgIGlmIHlvdSBsYWNrIHBlcm1pc3Npb25zIG5lZWRlZCB0byB1bmxpbmsgdGhlIGxlYWYgZGlyZWN0b3J5IG9yCisgICAgZmlsZS4KKworICAgICIiIgorICAgIGhlYWQsIHRhaWwgPSBwYXRoLnNwbGl0KG5ldykKKyAgICBpZiBoZWFkIGFuZCB0YWlsIGFuZCBub3QgcGF0aC5leGlzdHMoaGVhZCk6CisgICAgICAgIG1ha2VkaXJzKGhlYWQpCisgICAgcmVuYW1lKG9sZCwgbmV3KQorICAgIGhlYWQsIHRhaWwgPSBwYXRoLnNwbGl0KG9sZCkKKyAgICBpZiBoZWFkIGFuZCB0YWlsOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZW1vdmVkaXJzKGhlYWQpCisgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworX19hbGxfXy5leHRlbmQoWyJtYWtlZGlycyIsICJyZW1vdmVkaXJzIiwgInJlbmFtZXMiXSkKKworZGVmIHdhbGsodG9wLCB0b3Bkb3duPVRydWUsIG9uZXJyb3I9Tm9uZSwgZm9sbG93bGlua3M9RmFsc2UpOgorICAgICIiIkRpcmVjdG9yeSB0cmVlIGdlbmVyYXRvci4KKworICAgIEZvciBlYWNoIGRpcmVjdG9yeSBpbiB0aGUgZGlyZWN0b3J5IHRyZWUgcm9vdGVkIGF0IHRvcCAoaW5jbHVkaW5nIHRvcAorICAgIGl0c2VsZiwgYnV0IGV4Y2x1ZGluZyAnLicgYW5kICcuLicpLCB5aWVsZHMgYSAzLXR1cGxlCisKKyAgICAgICAgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcworCisgICAgZGlycGF0aCBpcyBhIHN0cmluZywgdGhlIHBhdGggdG8gdGhlIGRpcmVjdG9yeS4gIGRpcm5hbWVzIGlzIGEgbGlzdCBvZgorICAgIHRoZSBuYW1lcyBvZiB0aGUgc3ViZGlyZWN0b3JpZXMgaW4gZGlycGF0aCAoZXhjbHVkaW5nICcuJyBhbmQgJy4uJykuCisgICAgZmlsZW5hbWVzIGlzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdGhlIG5vbi1kaXJlY3RvcnkgZmlsZXMgaW4gZGlycGF0aC4KKyAgICBOb3RlIHRoYXQgdGhlIG5hbWVzIGluIHRoZSBsaXN0cyBhcmUganVzdCBuYW1lcywgd2l0aCBubyBwYXRoIGNvbXBvbmVudHMuCisgICAgVG8gZ2V0IGEgZnVsbCBwYXRoICh3aGljaCBiZWdpbnMgd2l0aCB0b3ApIHRvIGEgZmlsZSBvciBkaXJlY3RvcnkgaW4KKyAgICBkaXJwYXRoLCBkbyBvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkuCisKKyAgICBJZiBvcHRpb25hbCBhcmcgJ3RvcGRvd24nIGlzIHRydWUgb3Igbm90IHNwZWNpZmllZCwgdGhlIHRyaXBsZSBmb3IgYQorICAgIGRpcmVjdG9yeSBpcyBnZW5lcmF0ZWQgYmVmb3JlIHRoZSB0cmlwbGVzIGZvciBhbnkgb2YgaXRzIHN1YmRpcmVjdG9yaWVzCisgICAgKGRpcmVjdG9yaWVzIGFyZSBnZW5lcmF0ZWQgdG9wIGRvd24pLiAgSWYgdG9wZG93biBpcyBmYWxzZSwgdGhlIHRyaXBsZQorICAgIGZvciBhIGRpcmVjdG9yeSBpcyBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIHRyaXBsZXMgZm9yIGFsbCBvZiBpdHMKKyAgICBzdWJkaXJlY3RvcmllcyAoZGlyZWN0b3JpZXMgYXJlIGdlbmVyYXRlZCBib3R0b20gdXApLgorCisgICAgV2hlbiB0b3Bkb3duIGlzIHRydWUsIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSB0aGUgZGlybmFtZXMgbGlzdCBpbi1wbGFjZQorICAgIChlLmcuLCB2aWEgZGVsIG9yIHNsaWNlIGFzc2lnbm1lbnQpLCBhbmQgd2FsayB3aWxsIG9ubHkgcmVjdXJzZSBpbnRvIHRoZQorICAgIHN1YmRpcmVjdG9yaWVzIHdob3NlIG5hbWVzIHJlbWFpbiBpbiBkaXJuYW1lczsgdGhpcyBjYW4gYmUgdXNlZCB0byBwcnVuZQorICAgIHRoZSBzZWFyY2gsIG9yIHRvIGltcG9zZSBhIHNwZWNpZmljIG9yZGVyIG9mIHZpc2l0aW5nLiAgTW9kaWZ5aW5nCisgICAgZGlybmFtZXMgd2hlbiB0b3Bkb3duIGlzIGZhbHNlIGlzIGluZWZmZWN0aXZlLCBzaW5jZSB0aGUgZGlyZWN0b3JpZXMgaW4KKyAgICBkaXJuYW1lcyBoYXZlIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIHRpbWUgZGlybmFtZXMgaXRzZWxmIGlzCisgICAgZ2VuZXJhdGVkLgorCisgICAgQnkgZGVmYXVsdCBlcnJvcnMgZnJvbSB0aGUgb3MubGlzdGRpcigpIGNhbGwgYXJlIGlnbm9yZWQuICBJZgorICAgIG9wdGlvbmFsIGFyZyAnb25lcnJvcicgaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYSBmdW5jdGlvbjsgaXQKKyAgICB3aWxsIGJlIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwgYW4gb3MuZXJyb3IgaW5zdGFuY2UuICBJdCBjYW4KKyAgICByZXBvcnQgdGhlIGVycm9yIHRvIGNvbnRpbnVlIHdpdGggdGhlIHdhbGssIG9yIHJhaXNlIHRoZSBleGNlcHRpb24KKyAgICB0byBhYm9ydCB0aGUgd2Fsay4gIE5vdGUgdGhhdCB0aGUgZmlsZW5hbWUgaXMgYXZhaWxhYmxlIGFzIHRoZQorICAgIGZpbGVuYW1lIGF0dHJpYnV0ZSBvZiB0aGUgZXhjZXB0aW9uIG9iamVjdC4KKworICAgIEJ5IGRlZmF1bHQsIG9zLndhbGsgZG9lcyBub3QgZm9sbG93IHN5bWJvbGljIGxpbmtzIHRvIHN1YmRpcmVjdG9yaWVzIG9uCisgICAgc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlbS4gIEluIG9yZGVyIHRvIGdldCB0aGlzIGZ1bmN0aW9uYWxpdHksIHNldCB0aGUKKyAgICBvcHRpb25hbCBhcmd1bWVudCAnZm9sbG93bGlua3MnIHRvIHRydWUuCisKKyAgICBDYXV0aW9uOiAgaWYgeW91IHBhc3MgYSByZWxhdGl2ZSBwYXRobmFtZSBmb3IgdG9wLCBkb24ndCBjaGFuZ2UgdGhlCisgICAgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSBiZXR3ZWVuIHJlc3VtcHRpb25zIG9mIHdhbGsuICB3YWxrIG5ldmVyCisgICAgY2hhbmdlcyB0aGUgY3VycmVudCBkaXJlY3RvcnksIGFuZCBhc3N1bWVzIHRoYXQgdGhlIGNsaWVudCBkb2Vzbid0CisgICAgZWl0aGVyLgorCisgICAgRXhhbXBsZToKKworICAgIGltcG9ydCBvcworICAgIGZyb20gb3MucGF0aCBpbXBvcnQgam9pbiwgZ2V0c2l6ZQorICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKCdweXRob24vTGliL2VtYWlsJyk6CisgICAgICAgIHByaW50IHJvb3QsICJjb25zdW1lcyIsCisgICAgICAgIHByaW50IHN1bShbZ2V0c2l6ZShqb2luKHJvb3QsIG5hbWUpKSBmb3IgbmFtZSBpbiBmaWxlc10pLAorICAgICAgICBwcmludCAiYnl0ZXMgaW4iLCBsZW4oZmlsZXMpLCAibm9uLWRpcmVjdG9yeSBmaWxlcyIKKyAgICAgICAgaWYgJ0NWUycgaW4gZGlyczoKKyAgICAgICAgICAgIGRpcnMucmVtb3ZlKCdDVlMnKSAgIyBkb24ndCB2aXNpdCBDVlMgZGlyZWN0b3JpZXMKKyAgICAiIiIKKworICAgIGlzbGluaywgam9pbiwgaXNkaXIgPSBwYXRoLmlzbGluaywgcGF0aC5qb2luLCBwYXRoLmlzZGlyCisKKyAgICAjIFdlIG1heSBub3QgaGF2ZSByZWFkIHBlcm1pc3Npb24gZm9yIHRvcCwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndAorICAgICMgZ2V0IGEgbGlzdCBvZiB0aGUgZmlsZXMgdGhlIGRpcmVjdG9yeSBjb250YWlucy4gIG9zLnBhdGgud2FsaworICAgICMgYWx3YXlzIHN1cHByZXNzZWQgdGhlIGV4Y2VwdGlvbiB0aGVuLCByYXRoZXIgdGhhbiBibG93IHVwIGZvciBhCisgICAgIyBtaW5vciByZWFzb24gd2hlbiAoc2F5KSBhIHRob3VzYW5kIHJlYWRhYmxlIGRpcmVjdG9yaWVzIGFyZSBzdGlsbAorICAgICMgbGVmdCB0byB2aXNpdC4gIFRoYXQgbG9naWMgaXMgY29waWVkIGhlcmUuCisgICAgdHJ5OgorICAgICAgICAjIE5vdGUgdGhhdCBsaXN0ZGlyIGFuZCBlcnJvciBhcmUgZ2xvYmFscyBpbiB0aGlzIG1vZHVsZSBkdWUKKyAgICAgICAgIyB0byBlYXJsaWVyIGltcG9ydC0qLgorICAgICAgICBuYW1lcyA9IGxpc3RkaXIodG9wKQorICAgIGV4Y2VwdCBlcnJvciwgZXJyOgorICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb25lcnJvcihlcnIpCisgICAgICAgIHJldHVybgorCisgICAgZGlycywgbm9uZGlycyA9IFtdLCBbXQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBpZiBpc2Rpcihqb2luKHRvcCwgbmFtZSkpOgorICAgICAgICAgICAgZGlycy5hcHBlbmQobmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5vbmRpcnMuYXBwZW5kKG5hbWUpCisKKyAgICBpZiB0b3Bkb3duOgorICAgICAgICB5aWVsZCB0b3AsIGRpcnMsIG5vbmRpcnMKKyAgICBmb3IgbmFtZSBpbiBkaXJzOgorICAgICAgICBuZXdfcGF0aCA9IGpvaW4odG9wLCBuYW1lKQorICAgICAgICBpZiBmb2xsb3dsaW5rcyBvciBub3QgaXNsaW5rKG5ld19wYXRoKToKKyAgICAgICAgICAgIGZvciB4IGluIHdhbGsobmV3X3BhdGgsIHRvcGRvd24sIG9uZXJyb3IsIGZvbGxvd2xpbmtzKToKKyAgICAgICAgICAgICAgICB5aWVsZCB4CisgICAgaWYgbm90IHRvcGRvd246CisgICAgICAgIHlpZWxkIHRvcCwgZGlycywgbm9uZGlycworCitfX2FsbF9fLmFwcGVuZCgid2FsayIpCisKKyMgTWFrZSBzdXJlIG9zLmVudmlyb24gZXhpc3RzLCBhdCBsZWFzdAordHJ5OgorICAgIGVudmlyb24KK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZW52aXJvbiA9IHt9CisKK2RlZiBleGVjbChmaWxlLCAqYXJncyk6CisgICAgIiIiZXhlY2woZmlsZSwgKmFyZ3MpCisKKyAgICBFeGVjdXRlIHRoZSBleGVjdXRhYmxlIGZpbGUgd2l0aCBhcmd1bWVudCBsaXN0IGFyZ3MsIHJlcGxhY2luZyB0aGUKKyAgICBjdXJyZW50IHByb2Nlc3MuICIiIgorICAgIGV4ZWN2KGZpbGUsIGFyZ3MpCisKK2RlZiBleGVjbGUoZmlsZSwgKmFyZ3MpOgorICAgICIiImV4ZWNsZShmaWxlLCAqYXJncywgZW52KQorCisgICAgRXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBmaWxlIHdpdGggYXJndW1lbnQgbGlzdCBhcmdzIGFuZAorICAgIGVudmlyb25tZW50IGVudiwgcmVwbGFjaW5nIHRoZSBjdXJyZW50IHByb2Nlc3MuICIiIgorICAgIGVudiA9IGFyZ3NbLTFdCisgICAgZXhlY3ZlKGZpbGUsIGFyZ3NbOi0xXSwgZW52KQorCitkZWYgZXhlY2xwKGZpbGUsICphcmdzKToKKyAgICAiIiJleGVjbHAoZmlsZSwgKmFyZ3MpCisKKyAgICBFeGVjdXRlIHRoZSBleGVjdXRhYmxlIGZpbGUgKHdoaWNoIGlzIHNlYXJjaGVkIGZvciBhbG9uZyAkUEFUSCkKKyAgICB3aXRoIGFyZ3VtZW50IGxpc3QgYXJncywgcmVwbGFjaW5nIHRoZSBjdXJyZW50IHByb2Nlc3MuICIiIgorICAgIGV4ZWN2cChmaWxlLCBhcmdzKQorCitkZWYgZXhlY2xwZShmaWxlLCAqYXJncyk6CisgICAgIiIiZXhlY2xwZShmaWxlLCAqYXJncywgZW52KQorCisgICAgRXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBmaWxlICh3aGljaCBpcyBzZWFyY2hlZCBmb3IgYWxvbmcgJFBBVEgpCisgICAgd2l0aCBhcmd1bWVudCBsaXN0IGFyZ3MgYW5kIGVudmlyb25tZW50IGVudiwgcmVwbGFjaW5nIHRoZSBjdXJyZW50CisgICAgcHJvY2Vzcy4gIiIiCisgICAgZW52ID0gYXJnc1stMV0KKyAgICBleGVjdnBlKGZpbGUsIGFyZ3NbOi0xXSwgZW52KQorCitkZWYgZXhlY3ZwKGZpbGUsIGFyZ3MpOgorICAgICIiImV4ZWN2cChmaWxlLCBhcmdzKQorCisgICAgRXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBmaWxlICh3aGljaCBpcyBzZWFyY2hlZCBmb3IgYWxvbmcgJFBBVEgpCisgICAgd2l0aCBhcmd1bWVudCBsaXN0IGFyZ3MsIHJlcGxhY2luZyB0aGUgY3VycmVudCBwcm9jZXNzLgorICAgIGFyZ3MgbWF5IGJlIGEgbGlzdCBvciB0dXBsZSBvZiBzdHJpbmdzLiAiIiIKKyAgICBfZXhlY3ZwZShmaWxlLCBhcmdzKQorCitkZWYgZXhlY3ZwZShmaWxlLCBhcmdzLCBlbnYpOgorICAgICIiImV4ZWN2cGUoZmlsZSwgYXJncywgZW52KQorCisgICAgRXhlY3V0ZSB0aGUgZXhlY3V0YWJsZSBmaWxlICh3aGljaCBpcyBzZWFyY2hlZCBmb3IgYWxvbmcgJFBBVEgpCisgICAgd2l0aCBhcmd1bWVudCBsaXN0IGFyZ3MgYW5kIGVudmlyb25tZW50IGVudiAsIHJlcGxhY2luZyB0aGUKKyAgICBjdXJyZW50IHByb2Nlc3MuCisgICAgYXJncyBtYXkgYmUgYSBsaXN0IG9yIHR1cGxlIG9mIHN0cmluZ3MuICIiIgorICAgIF9leGVjdnBlKGZpbGUsIGFyZ3MsIGVudikKKworX19hbGxfXy5leHRlbmQoWyJleGVjbCIsImV4ZWNsZSIsImV4ZWNscCIsImV4ZWNscGUiLCJleGVjdnAiLCJleGVjdnBlIl0pCisKK2RlZiBfZXhlY3ZwZShmaWxlLCBhcmdzLCBlbnY9Tm9uZSk6CisgICAgaWYgZW52IGlzIG5vdCBOb25lOgorICAgICAgICBmdW5jID0gZXhlY3ZlCisgICAgICAgIGFyZ3Jlc3QgPSAoYXJncywgZW52KQorICAgIGVsc2U6CisgICAgICAgIGZ1bmMgPSBleGVjdgorICAgICAgICBhcmdyZXN0ID0gKGFyZ3MsKQorICAgICAgICBlbnYgPSBlbnZpcm9uCisKKyAgICBoZWFkLCB0YWlsID0gcGF0aC5zcGxpdChmaWxlKQorICAgIGlmIGhlYWQ6CisgICAgICAgIGZ1bmMoZmlsZSwgKmFyZ3Jlc3QpCisgICAgICAgIHJldHVybgorICAgIGlmICdQQVRIJyBpbiBlbnY6CisgICAgICAgIGVudnBhdGggPSBlbnZbJ1BBVEgnXQorICAgIGVsc2U6CisgICAgICAgIGVudnBhdGggPSBkZWZwYXRoCisgICAgUEFUSCA9IGVudnBhdGguc3BsaXQocGF0aHNlcCkKKyAgICBzYXZlZF9leGMgPSBOb25lCisgICAgc2F2ZWRfdGIgPSBOb25lCisgICAgZm9yIGRpciBpbiBQQVRIOgorICAgICAgICBmdWxsbmFtZSA9IHBhdGguam9pbihkaXIsIGZpbGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoZnVsbG5hbWUsICphcmdyZXN0KQorICAgICAgICBleGNlcHQgZXJyb3IsIGU6CisgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWzJdCisgICAgICAgICAgICBpZiAoZS5lcnJubyAhPSBlcnJuby5FTk9FTlQgYW5kIGUuZXJybm8gIT0gZXJybm8uRU5PVERJUgorICAgICAgICAgICAgICAgIGFuZCBzYXZlZF9leGMgaXMgTm9uZSk6CisgICAgICAgICAgICAgICAgc2F2ZWRfZXhjID0gZQorICAgICAgICAgICAgICAgIHNhdmVkX3RiID0gdGIKKyAgICBpZiBzYXZlZF9leGM6CisgICAgICAgIHJhaXNlIGVycm9yLCBzYXZlZF9leGMsIHNhdmVkX3RiCisgICAgcmFpc2UgZXJyb3IsIGUsIHRiCisKKyMgQ2hhbmdlIGVudmlyb24gdG8gYXV0b21hdGljYWxseSBjYWxsIHB1dGVudigpIGlmIGl0IGV4aXN0cwordHJ5OgorICAgICMgVGhpcyB3aWxsIGZhaWwgaWYgdGhlcmUncyBubyBwdXRlbnYKKyAgICBwdXRlbnYKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBpbXBvcnQgVXNlckRpY3QKKworICAgICMgRmFrZSB1bnNldGVudigpIGZvciBXaW5kb3dzCisgICAgIyBub3Qgc3VyZSBhYm91dCBvczIgaGVyZSBidXQKKyAgICAjIEknbSBndWVzc2luZyB0aGV5IGFyZSB0aGUgc2FtZS4KKworICAgIGlmIG5hbWUgaW4gKCdvczInLCAnbnQnKToKKyAgICAgICAgZGVmIHVuc2V0ZW52KGtleSk6CisgICAgICAgICAgICBwdXRlbnYoa2V5LCAiIikKKworICAgIGlmIG5hbWUgPT0gInJpc2NvcyI6CisgICAgICAgICMgT24gUklTQyBPUywgYWxsIGVudiBhY2Nlc3MgZ29lcyB0aHJvdWdoIGdldGVudiBhbmQgcHV0ZW52CisgICAgICAgIGZyb20gcmlzY29zZW52aXJvbiBpbXBvcnQgX0Vudmlyb24KKyAgICBlbGlmIG5hbWUgaW4gKCdvczInLCAnbnQnKTogICMgV2hlcmUgRW52IFZhciBOYW1lcyBNdXN0IEJlIFVQUEVSQ0FTRQorICAgICAgICAjIEJ1dCB3ZSBzdG9yZSB0aGVtIGFzIHVwcGVyIGNhc2UKKyAgICAgICAgY2xhc3MgX0Vudmlyb24oVXNlckRpY3QuSXRlcmFibGVVc2VyRGljdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZW52aXJvbik6CisgICAgICAgICAgICAgICAgVXNlckRpY3QuVXNlckRpY3QuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5kYXRhCisgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gZW52aXJvbi5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBkYXRhW2sudXBwZXIoKV0gPSB2CisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCBpdGVtKToKKyAgICAgICAgICAgICAgICBwdXRlbnYoa2V5LCBpdGVtKQorICAgICAgICAgICAgICAgIHNlbGYuZGF0YVtrZXkudXBwZXIoKV0gPSBpdGVtCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW2tleS51cHBlcigpXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVuc2V0ZW52CisgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW2tleS51cHBlcigpXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICAgICAgdW5zZXRlbnYoa2V5KQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW2tleS51cHBlcigpXQorICAgICAgICAgICAgICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmRhdGEua2V5cygpOgorICAgICAgICAgICAgICAgICAgICAgICAgdW5zZXRlbnYoa2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVtrZXldCisgICAgICAgICAgICAgICAgZGVmIHBvcChzZWxmLCBrZXksICphcmdzKToKKyAgICAgICAgICAgICAgICAgICAgdW5zZXRlbnYoa2V5KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhLnBvcChrZXkudXBwZXIoKSwgKmFyZ3MpCisgICAgICAgICAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBrZXkudXBwZXIoKSBpbiBzZWxmLmRhdGEKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5LnVwcGVyKCkgaW4gc2VsZi5kYXRhCisgICAgICAgICAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZmFpbG9iaj1Ob25lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmdldChrZXkudXBwZXIoKSwgZmFpbG9iaikKKyAgICAgICAgICAgIGRlZiB1cGRhdGUoc2VsZiwgZGljdD1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgaWYgZGljdDoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAga2V5cyA9IGRpY3Qua2V5cygpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgTGlzdCBvZiAoa2V5LCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIGRpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltrXSA9IHYKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZ290IGtleXMKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2Fubm90IHVzZSBpdGVtcygpLCBzaW5jZSBtYXBwaW5ncworICAgICAgICAgICAgICAgICAgICAgICAgIyBtYXkgbm90IGhhdmUgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrIGluIGtleXM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZltrXSA9IGRpY3Rba10KKyAgICAgICAgICAgICAgICBpZiBrd2FyZ3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlKGt3YXJncykKKyAgICAgICAgICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBkaWN0KHNlbGYpCisKKyAgICBlbHNlOiAgIyBXaGVyZSBFbnYgVmFyIE5hbWVzIENhbiBCZSBNaXhlZCBDYXNlCisgICAgICAgIGNsYXNzIF9FbnZpcm9uKFVzZXJEaWN0Lkl0ZXJhYmxlVXNlckRpY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudmlyb24pOgorICAgICAgICAgICAgICAgIFVzZXJEaWN0LlVzZXJEaWN0Ll9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5kYXRhID0gZW52aXJvbgorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgaXRlbSk6CisgICAgICAgICAgICAgICAgcHV0ZW52KGtleSwgaXRlbSkKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFba2V5XSA9IGl0ZW0KKyAgICAgICAgICAgIGRlZiB1cGRhdGUoc2VsZiwgIGRpY3Q9Tm9uZSwgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGlmIGRpY3Q6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgPSBkaWN0LmtleXMoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAjIExpc3Qgb2YgKGtleSwgdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBkaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZba10gPSB2CisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGdvdCBrZXlzCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbm5vdCB1c2UgaXRlbXMoKSwgc2luY2UgbWFwcGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbWF5IG5vdCBoYXZlIHRoZW0uCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgayBpbiBrZXlzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZba10gPSBkaWN0W2tdCisgICAgICAgICAgICAgICAgaWYga3dhcmdzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2FyZ3MpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdW5zZXRlbnYKKyAgICAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICAgICAgdW5zZXRlbnYoa2V5KQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW2tleV0KKyAgICAgICAgICAgICAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5kYXRhLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2V0ZW52KGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmRhdGFba2V5XQorICAgICAgICAgICAgICAgIGRlZiBwb3Aoc2VsZiwga2V5LCAqYXJncyk6CisgICAgICAgICAgICAgICAgICAgIHVuc2V0ZW52KGtleSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5wb3Aoa2V5LCAqYXJncykKKyAgICAgICAgICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBkaWN0KHNlbGYpCisKKworICAgIGVudmlyb24gPSBfRW52aXJvbihlbnZpcm9uKQorCitkZWYgZ2V0ZW52KGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAiIiJHZXQgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUsIHJldHVybiBOb25lIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgVGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGUgZGVmYXVsdC4iIiIKKyAgICByZXR1cm4gZW52aXJvbi5nZXQoa2V5LCBkZWZhdWx0KQorX19hbGxfXy5hcHBlbmQoImdldGVudiIpCisKK2RlZiBfZXhpc3RzKG5hbWUpOgorICAgIHJldHVybiBuYW1lIGluIGdsb2JhbHMoKQorCisjIFN1cHBseSBzcGF3biooKSAocHJvYmFibHkgb25seSBmb3IgVW5peCkKK2lmIF9leGlzdHMoImZvcmsiKSBhbmQgbm90IF9leGlzdHMoInNwYXdudiIpIGFuZCBfZXhpc3RzKCJleGVjdiIpOgorCisgICAgUF9XQUlUID0gMAorICAgIFBfTk9XQUlUID0gUF9OT1dBSVRPID0gMQorCisgICAgIyBYWFggU2hvdWxkIHdlIHN1cHBvcnQgUF9ERVRBQ0g/ICBJIHN1cHBvc2UgaXQgY291bGQgZm9yaygpKioyCisgICAgIyBhbmQgY2xvc2UgdGhlIHN0ZCBJL08gc3RyZWFtcy4gIEFsc28sIFBfT1ZFUkxBWSBpcyB0aGUgc2FtZQorICAgICMgYXMgZXhlY3YqKCk/CisKKyAgICBkZWYgX3NwYXdudmVmKG1vZGUsIGZpbGUsIGFyZ3MsIGVudiwgZnVuYyk6CisgICAgICAgICMgSW50ZXJuYWwgaGVscGVyOyBmdW5jIGlzIHRoZSBleGVjKigpIGZ1bmN0aW9uIHRvIHVzZQorICAgICAgICBwaWQgPSBmb3JrKCkKKyAgICAgICAgaWYgbm90IHBpZDoKKyAgICAgICAgICAgICMgQ2hpbGQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZnVuYyhmaWxlLCBhcmdzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoZmlsZSwgYXJncywgZW52KQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIF9leGl0KDEyNykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUGFyZW50CisgICAgICAgICAgICBpZiBtb2RlID09IFBfTk9XQUlUOgorICAgICAgICAgICAgICAgIHJldHVybiBwaWQgIyBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHdhaXRpbmchCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHdwaWQsIHN0cyA9IHdhaXRwaWQocGlkLCAwKQorICAgICAgICAgICAgICAgIGlmIFdJRlNUT1BQRUQoc3RzKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbGlmIFdJRlNJR05BTEVEKHN0cyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtV1RFUk1TSUcoc3RzKQorICAgICAgICAgICAgICAgIGVsaWYgV0lGRVhJVEVEKHN0cyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBXRVhJVFNUQVRVUyhzdHMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJOb3Qgc3RvcHBlZCwgc2lnbmFsZWQgb3IgZXhpdGVkPz8/IgorCisgICAgZGVmIHNwYXdudihtb2RlLCBmaWxlLCBhcmdzKToKKyAgICAgICAgIiIic3Bhd252KG1vZGUsIGZpbGUsIGFyZ3MpIC0+IGludGVnZXIKKworRXhlY3V0ZSBmaWxlIHdpdGggYXJndW1lbnRzIGZyb20gYXJncyBpbiBhIHN1YnByb2Nlc3MuCitJZiBtb2RlID09IFBfTk9XQUlUIHJldHVybiB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzLgorSWYgbW9kZSA9PSBQX1dBSVQgcmV0dXJuIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlmIGl0IGV4aXRzIG5vcm1hbGx5Oworb3RoZXJ3aXNlIHJldHVybiAtU0lHLCB3aGVyZSBTSUcgaXMgdGhlIHNpZ25hbCB0aGF0IGtpbGxlZCBpdC4gIiIiCisgICAgICAgIHJldHVybiBfc3Bhd252ZWYobW9kZSwgZmlsZSwgYXJncywgTm9uZSwgZXhlY3YpCisKKyAgICBkZWYgc3Bhd252ZShtb2RlLCBmaWxlLCBhcmdzLCBlbnYpOgorICAgICAgICAiIiJzcGF3bnZlKG1vZGUsIGZpbGUsIGFyZ3MsIGVudikgLT4gaW50ZWdlcgorCitFeGVjdXRlIGZpbGUgd2l0aCBhcmd1bWVudHMgZnJvbSBhcmdzIGluIGEgc3VicHJvY2VzcyB3aXRoIHRoZQorc3BlY2lmaWVkIGVudmlyb25tZW50LgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICByZXR1cm4gX3NwYXdudmVmKG1vZGUsIGZpbGUsIGFyZ3MsIGVudiwgZXhlY3ZlKQorCisgICAgIyBOb3RlOiBzcGF3bnZwW2VdIGlzJ3QgY3VycmVudGx5IHN1cHBvcnRlZCBvbiBXaW5kb3dzCisKKyAgICBkZWYgc3Bhd252cChtb2RlLCBmaWxlLCBhcmdzKToKKyAgICAgICAgIiIic3Bhd252cChtb2RlLCBmaWxlLCBhcmdzKSAtPiBpbnRlZ2VyCisKK0V4ZWN1dGUgZmlsZSAod2hpY2ggaXMgbG9va2VkIGZvciBhbG9uZyAkUEFUSCkgd2l0aCBhcmd1bWVudHMgZnJvbQorYXJncyBpbiBhIHN1YnByb2Nlc3MuCitJZiBtb2RlID09IFBfTk9XQUlUIHJldHVybiB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzLgorSWYgbW9kZSA9PSBQX1dBSVQgcmV0dXJuIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlmIGl0IGV4aXRzIG5vcm1hbGx5Oworb3RoZXJ3aXNlIHJldHVybiAtU0lHLCB3aGVyZSBTSUcgaXMgdGhlIHNpZ25hbCB0aGF0IGtpbGxlZCBpdC4gIiIiCisgICAgICAgIHJldHVybiBfc3Bhd252ZWYobW9kZSwgZmlsZSwgYXJncywgTm9uZSwgZXhlY3ZwKQorCisgICAgZGVmIHNwYXdudnBlKG1vZGUsIGZpbGUsIGFyZ3MsIGVudik6CisgICAgICAgICIiInNwYXdudnBlKG1vZGUsIGZpbGUsIGFyZ3MsIGVudikgLT4gaW50ZWdlcgorCitFeGVjdXRlIGZpbGUgKHdoaWNoIGlzIGxvb2tlZCBmb3IgYWxvbmcgJFBBVEgpIHdpdGggYXJndW1lbnRzIGZyb20KK2FyZ3MgaW4gYSBzdWJwcm9jZXNzIHdpdGggdGhlIHN1cHBsaWVkIGVudmlyb25tZW50LgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICByZXR1cm4gX3NwYXdudmVmKG1vZGUsIGZpbGUsIGFyZ3MsIGVudiwgZXhlY3ZwZSkKKworaWYgX2V4aXN0cygic3Bhd252Iik6CisgICAgIyBUaGVzZSBhcmVuJ3Qgc3VwcGxpZWQgYnkgdGhlIGJhc2ljIFdpbmRvd3MgY29kZQorICAgICMgYnV0IGNhbiBiZSBlYXNpbHkgaW1wbGVtZW50ZWQgaW4gUHl0aG9uCisKKyAgICBkZWYgc3Bhd25sKG1vZGUsIGZpbGUsICphcmdzKToKKyAgICAgICAgIiIic3Bhd25sKG1vZGUsIGZpbGUsICphcmdzKSAtPiBpbnRlZ2VyCisKK0V4ZWN1dGUgZmlsZSB3aXRoIGFyZ3VtZW50cyBmcm9tIGFyZ3MgaW4gYSBzdWJwcm9jZXNzLgorSWYgbW9kZSA9PSBQX05PV0FJVCByZXR1cm4gdGhlIHBpZCBvZiB0aGUgcHJvY2Vzcy4KK0lmIG1vZGUgPT0gUF9XQUlUIHJldHVybiB0aGUgcHJvY2VzcydzIGV4aXQgY29kZSBpZiBpdCBleGl0cyBub3JtYWxseTsKK290aGVyd2lzZSByZXR1cm4gLVNJRywgd2hlcmUgU0lHIGlzIHRoZSBzaWduYWwgdGhhdCBraWxsZWQgaXQuICIiIgorICAgICAgICByZXR1cm4gc3Bhd252KG1vZGUsIGZpbGUsIGFyZ3MpCisKKyAgICBkZWYgc3Bhd25sZShtb2RlLCBmaWxlLCAqYXJncyk6CisgICAgICAgICIiInNwYXdubGUobW9kZSwgZmlsZSwgKmFyZ3MsIGVudikgLT4gaW50ZWdlcgorCitFeGVjdXRlIGZpbGUgd2l0aCBhcmd1bWVudHMgZnJvbSBhcmdzIGluIGEgc3VicHJvY2VzcyB3aXRoIHRoZQorc3VwcGxpZWQgZW52aXJvbm1lbnQuCitJZiBtb2RlID09IFBfTk9XQUlUIHJldHVybiB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzLgorSWYgbW9kZSA9PSBQX1dBSVQgcmV0dXJuIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlmIGl0IGV4aXRzIG5vcm1hbGx5Oworb3RoZXJ3aXNlIHJldHVybiAtU0lHLCB3aGVyZSBTSUcgaXMgdGhlIHNpZ25hbCB0aGF0IGtpbGxlZCBpdC4gIiIiCisgICAgICAgIGVudiA9IGFyZ3NbLTFdCisgICAgICAgIHJldHVybiBzcGF3bnZlKG1vZGUsIGZpbGUsIGFyZ3NbOi0xXSwgZW52KQorCisKKyAgICBfX2FsbF9fLmV4dGVuZChbInNwYXdudiIsICJzcGF3bnZlIiwgInNwYXdubCIsICJzcGF3bmxlIixdKQorCisKK2lmIF9leGlzdHMoInNwYXdudnAiKToKKyAgICAjIEF0IHRoZSBtb21lbnQsIFdpbmRvd3MgZG9lc24ndCBpbXBsZW1lbnQgc3Bhd252cFtlXSwKKyAgICAjIHNvIGl0IHdvbid0IGhhdmUgc3Bhd25scFtlXSBlaXRoZXIuCisgICAgZGVmIHNwYXdubHAobW9kZSwgZmlsZSwgKmFyZ3MpOgorICAgICAgICAiIiJzcGF3bmxwKG1vZGUsIGZpbGUsICphcmdzKSAtPiBpbnRlZ2VyCisKK0V4ZWN1dGUgZmlsZSAod2hpY2ggaXMgbG9va2VkIGZvciBhbG9uZyAkUEFUSCkgd2l0aCBhcmd1bWVudHMgZnJvbQorYXJncyBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUgc3VwcGxpZWQgZW52aXJvbm1lbnQuCitJZiBtb2RlID09IFBfTk9XQUlUIHJldHVybiB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzLgorSWYgbW9kZSA9PSBQX1dBSVQgcmV0dXJuIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlmIGl0IGV4aXRzIG5vcm1hbGx5Oworb3RoZXJ3aXNlIHJldHVybiAtU0lHLCB3aGVyZSBTSUcgaXMgdGhlIHNpZ25hbCB0aGF0IGtpbGxlZCBpdC4gIiIiCisgICAgICAgIHJldHVybiBzcGF3bnZwKG1vZGUsIGZpbGUsIGFyZ3MpCisKKyAgICBkZWYgc3Bhd25scGUobW9kZSwgZmlsZSwgKmFyZ3MpOgorICAgICAgICAiIiJzcGF3bmxwZShtb2RlLCBmaWxlLCAqYXJncywgZW52KSAtPiBpbnRlZ2VyCisKK0V4ZWN1dGUgZmlsZSAod2hpY2ggaXMgbG9va2VkIGZvciBhbG9uZyAkUEFUSCkgd2l0aCBhcmd1bWVudHMgZnJvbQorYXJncyBpbiBhIHN1YnByb2Nlc3Mgd2l0aCB0aGUgc3VwcGxpZWQgZW52aXJvbm1lbnQuCitJZiBtb2RlID09IFBfTk9XQUlUIHJldHVybiB0aGUgcGlkIG9mIHRoZSBwcm9jZXNzLgorSWYgbW9kZSA9PSBQX1dBSVQgcmV0dXJuIHRoZSBwcm9jZXNzJ3MgZXhpdCBjb2RlIGlmIGl0IGV4aXRzIG5vcm1hbGx5Oworb3RoZXJ3aXNlIHJldHVybiAtU0lHLCB3aGVyZSBTSUcgaXMgdGhlIHNpZ25hbCB0aGF0IGtpbGxlZCBpdC4gIiIiCisgICAgICAgIGVudiA9IGFyZ3NbLTFdCisgICAgICAgIHJldHVybiBzcGF3bnZwZShtb2RlLCBmaWxlLCBhcmdzWzotMV0sIGVudikKKworCisgICAgX19hbGxfXy5leHRlbmQoWyJzcGF3bnZwIiwgInNwYXdudnBlIiwgInNwYXdubHAiLCAic3Bhd25scGUiLF0pCisKKworIyBTdXBwbHkgcG9wZW4yIGV0Yy4gKGZvciBVbml4KQoraWYgX2V4aXN0cygiZm9yayIpOgorICAgIGlmIG5vdCBfZXhpc3RzKCJwb3BlbjIiKToKKyAgICAgICAgZGVmIHBvcGVuMihjbWQsIG1vZGU9InQiLCBidWZzaXplPS0xKToKKyAgICAgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gIE9uIFVOSVgsICdjbWQnCisgICAgICAgICAgICBtYXkgYmUgYSBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8KKyAgICAgICAgICAgIHRoZSBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gIElmICdjbWQnCisgICAgICAgICAgICBpcyBhIHN0cmluZyBpdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2hlbGwgKGFzIHdpdGggb3Muc3lzdGVtKCkpLiBJZgorICAgICAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuICBUaGUKKyAgICAgICAgICAgIGZpbGUgb2JqZWN0cyAoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dCkgYXJlIHJldHVybmVkLiIiIgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICBtc2cgPSAib3MucG9wZW4yIGlzIGRlcHJlY2F0ZWQuICBVc2UgdGhlIHN1YnByb2Nlc3MgbW9kdWxlLiIKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKworICAgICAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgICAgIFBJUEUgPSBzdWJwcm9jZXNzLlBJUEUKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9aXNpbnN0YW5jZShjbWQsIGJhc2VzdHJpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZT1idWZzaXplLCBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz1UcnVlKQorICAgICAgICAgICAgcmV0dXJuIHAuc3RkaW4sIHAuc3Rkb3V0CisgICAgICAgIF9fYWxsX18uYXBwZW5kKCJwb3BlbjIiKQorCisgICAgaWYgbm90IF9leGlzdHMoInBvcGVuMyIpOgorICAgICAgICBkZWYgcG9wZW4zKGNtZCwgbW9kZT0idCIsIGJ1ZnNpemU9LTEpOgorICAgICAgICAgICAgIiIiRXhlY3V0ZSB0aGUgc2hlbGwgY29tbWFuZCAnY21kJyBpbiBhIHN1Yi1wcm9jZXNzLiAgT24gVU5JWCwgJ2NtZCcKKyAgICAgICAgICAgIG1heSBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0bworICAgICAgICAgICAgdGhlIHByb2dyYW0gd2l0aG91dCBzaGVsbCBpbnRlcnZlbnRpb24gKGFzIHdpdGggb3Muc3Bhd252KCkpLiAgSWYgJ2NtZCcKKyAgICAgICAgICAgIGlzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGVsbCAoYXMgd2l0aCBvcy5zeXN0ZW0oKSkuIElmCisgICAgICAgICAgICAnYnVmc2l6ZScgaXMgc3BlY2lmaWVkLCBpdCBzZXRzIHRoZSBidWZmZXIgc2l6ZSBmb3IgdGhlIEkvTyBwaXBlcy4gIFRoZQorICAgICAgICAgICAgZmlsZSBvYmplY3RzIChjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRlcnIpIGFyZSByZXR1cm5lZC4iIiIKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgbXNnID0gIm9zLnBvcGVuMyBpcyBkZXByZWNhdGVkLiAgVXNlIHRoZSBzdWJwcm9jZXNzIG1vZHVsZS4iCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKG1zZywgRGVwcmVjYXRpb25XYXJuaW5nLCBzdGFja2xldmVsPTIpCisKKyAgICAgICAgICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgICAgICAgICBQSVBFID0gc3VicHJvY2Vzcy5QSVBFCisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHNoZWxsPWlzaW5zdGFuY2UoY21kLCBiYXNlc3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemU9YnVmc2l6ZSwgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9UElQRSwgY2xvc2VfZmRzPVRydWUpCisgICAgICAgICAgICByZXR1cm4gcC5zdGRpbiwgcC5zdGRvdXQsIHAuc3RkZXJyCisgICAgICAgIF9fYWxsX18uYXBwZW5kKCJwb3BlbjMiKQorCisgICAgaWYgbm90IF9leGlzdHMoInBvcGVuNCIpOgorICAgICAgICBkZWYgcG9wZW40KGNtZCwgbW9kZT0idCIsIGJ1ZnNpemU9LTEpOgorICAgICAgICAgICAgIiIiRXhlY3V0ZSB0aGUgc2hlbGwgY29tbWFuZCAnY21kJyBpbiBhIHN1Yi1wcm9jZXNzLiAgT24gVU5JWCwgJ2NtZCcKKyAgICAgICAgICAgIG1heSBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0bworICAgICAgICAgICAgdGhlIHByb2dyYW0gd2l0aG91dCBzaGVsbCBpbnRlcnZlbnRpb24gKGFzIHdpdGggb3Muc3Bhd252KCkpLiAgSWYgJ2NtZCcKKyAgICAgICAgICAgIGlzIGEgc3RyaW5nIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGVsbCAoYXMgd2l0aCBvcy5zeXN0ZW0oKSkuIElmCisgICAgICAgICAgICAnYnVmc2l6ZScgaXMgc3BlY2lmaWVkLCBpdCBzZXRzIHRoZSBidWZmZXIgc2l6ZSBmb3IgdGhlIEkvTyBwaXBlcy4gIFRoZQorICAgICAgICAgICAgZmlsZSBvYmplY3RzIChjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0X3N0ZGVycikgYXJlIHJldHVybmVkLiIiIgorICAgICAgICAgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgICAgICAgICBtc2cgPSAib3MucG9wZW40IGlzIGRlcHJlY2F0ZWQuICBVc2UgdGhlIHN1YnByb2Nlc3MgbW9kdWxlLiIKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4obXNnLCBEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MikKKworICAgICAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgICAgIFBJUEUgPSBzdWJwcm9jZXNzLlBJUEUKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc2hlbGw9aXNpbnN0YW5jZShjbWQsIGJhc2VzdHJpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZT1idWZzaXplLCBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwgY2xvc2VfZmRzPVRydWUpCisgICAgICAgICAgICByZXR1cm4gcC5zdGRpbiwgcC5zdGRvdXQKKyAgICAgICAgX19hbGxfXy5hcHBlbmQoInBvcGVuNCIpCisKK2ltcG9ydCBjb3B5X3JlZyBhcyBfY29weV9yZWcKKworZGVmIF9tYWtlX3N0YXRfcmVzdWx0KHR1cCwgZGljdCk6CisgICAgcmV0dXJuIHN0YXRfcmVzdWx0KHR1cCwgZGljdCkKKworZGVmIF9waWNrbGVfc3RhdF9yZXN1bHQoc3IpOgorICAgICh0eXBlLCBhcmdzKSA9IHNyLl9fcmVkdWNlX18oKQorICAgIHJldHVybiAoX21ha2Vfc3RhdF9yZXN1bHQsIGFyZ3MpCisKK3RyeToKKyAgICBfY29weV9yZWcucGlja2xlKHN0YXRfcmVzdWx0LCBfcGlja2xlX3N0YXRfcmVzdWx0LCBfbWFrZV9zdGF0X3Jlc3VsdCkKK2V4Y2VwdCBOYW1lRXJyb3I6ICMgc3RhdF9yZXN1bHQgbWF5IG5vdCBleGlzdAorICAgIHBhc3MKKworZGVmIF9tYWtlX3N0YXR2ZnNfcmVzdWx0KHR1cCwgZGljdCk6CisgICAgcmV0dXJuIHN0YXR2ZnNfcmVzdWx0KHR1cCwgZGljdCkKKworZGVmIF9waWNrbGVfc3RhdHZmc19yZXN1bHQoc3IpOgorICAgICh0eXBlLCBhcmdzKSA9IHNyLl9fcmVkdWNlX18oKQorICAgIHJldHVybiAoX21ha2Vfc3RhdHZmc19yZXN1bHQsIGFyZ3MpCisKK3RyeToKKyAgICBfY29weV9yZWcucGlja2xlKHN0YXR2ZnNfcmVzdWx0LCBfcGlja2xlX3N0YXR2ZnNfcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgX21ha2Vfc3RhdHZmc19yZXN1bHQpCitleGNlcHQgTmFtZUVycm9yOiAjIHN0YXR2ZnNfcmVzdWx0IG1heSBub3QgZXhpc3QKKyAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L29zLnB5YyBiL2xpYi9weXRob24yLjcvb3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjkxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L29zLnB5byBiL2xpYi9weXRob24yLjcvb3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NjkxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHkgYi9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlZDUxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvb3MyZW14cGF0aC5weQpAQCAtMCwwICsxLDE1OSBAQAorIyBNb2R1bGUgJ29zMmVteHBhdGgnIC0tIGNvbW1vbiBvcGVyYXRpb25zIG9uIE9TLzIgcGF0aG5hbWVzCisiIiJDb21tb24gcGF0aG5hbWUgbWFuaXB1bGF0aW9ucywgT1MvMiBFTVggdmVyc2lvbi4KKworSW5zdGVhZCBvZiBpbXBvcnRpbmcgdGhpcyBtb2R1bGUgZGlyZWN0bHksIGltcG9ydCBvcyBhbmQgcmVmZXIgdG8gdGhpcworbW9kdWxlIGFzIG9zLnBhdGguCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3RhdAorZnJvbSBnZW5lcmljcGF0aCBpbXBvcnQgKgorZnJvbSBudHBhdGggaW1wb3J0IChleHBhbmR1c2VyLCBleHBhbmR2YXJzLCBpc2FicywgaXNsaW5rLCBzcGxpdGRyaXZlLAorICAgICAgICAgICAgICAgICAgICBzcGxpdGV4dCwgc3BsaXQsIHdhbGspCisKK19fYWxsX18gPSBbIm5vcm1jYXNlIiwiaXNhYnMiLCJqb2luIiwic3BsaXRkcml2ZSIsInNwbGl0Iiwic3BsaXRleHQiLAorICAgICAgICAgICAiYmFzZW5hbWUiLCJkaXJuYW1lIiwiY29tbW9ucHJlZml4IiwiZ2V0c2l6ZSIsImdldG10aW1lIiwKKyAgICAgICAgICAgImdldGF0aW1lIiwiZ2V0Y3RpbWUiLCAiaXNsaW5rIiwiZXhpc3RzIiwibGV4aXN0cyIsImlzZGlyIiwiaXNmaWxlIiwKKyAgICAgICAgICAgImlzbW91bnQiLCJ3YWxrIiwiZXhwYW5kdXNlciIsImV4cGFuZHZhcnMiLCJub3JtcGF0aCIsImFic3BhdGgiLAorICAgICAgICAgICAic3BsaXR1bmMiLCJjdXJkaXIiLCJwYXJkaXIiLCJzZXAiLCJwYXRoc2VwIiwiZGVmcGF0aCIsImFsdHNlcCIsCisgICAgICAgICAgICJleHRzZXAiLCJkZXZudWxsIiwicmVhbHBhdGgiLCJzdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lcyJdCisKKyMgc3RyaW5ncyByZXByZXNlbnRpbmcgdmFyaW91cyBwYXRoLXJlbGF0ZWQgYml0cyBhbmQgcGllY2VzCitjdXJkaXIgPSAnLicKK3BhcmRpciA9ICcuLicKK2V4dHNlcCA9ICcuJworc2VwID0gJy8nCithbHRzZXAgPSAnXFwnCitwYXRoc2VwID0gJzsnCitkZWZwYXRoID0gJy47QzpcXGJpbicKK2Rldm51bGwgPSAnbnVsJworCisjIE5vcm1hbGl6ZSB0aGUgY2FzZSBvZiBhIHBhdGhuYW1lIGFuZCBtYXAgc2xhc2hlcyB0byBiYWNrc2xhc2hlcy4KKyMgT3RoZXIgbm9ybWFsaXphdGlvbnMgKHN1Y2ggYXMgb3B0aW1pemluZyAnLi4vJyBhd2F5KSBhcmUgbm90IGRvbmUKKyMgKHRoaXMgaXMgZG9uZSBieSBub3JtcGF0aCkuCisKK2RlZiBub3JtY2FzZShzKToKKyAgICAiIiJOb3JtYWxpemUgY2FzZSBvZiBwYXRobmFtZS4KKworICAgIE1ha2VzIGFsbCBjaGFyYWN0ZXJzIGxvd2VyY2FzZSBhbmQgYWxsIGFsdHNlcHMgaW50byBzZXBzLiIiIgorICAgIHJldHVybiBzLnJlcGxhY2UoJ1xcJywgJy8nKS5sb3dlcigpCisKKworIyBKb2luIHR3byAob3IgbW9yZSkgcGF0aHMuCisKK2RlZiBqb2luKGEsICpwKToKKyAgICAiIiJKb2luIHR3byBvciBtb3JlIHBhdGhuYW1lIGNvbXBvbmVudHMsIGluc2VydGluZyBzZXAgYXMgbmVlZGVkIiIiCisgICAgcGF0aCA9IGEKKyAgICBmb3IgYiBpbiBwOgorICAgICAgICBpZiBpc2FicyhiKToKKyAgICAgICAgICAgIHBhdGggPSBiCisgICAgICAgIGVsaWYgcGF0aCA9PSAnJyBvciBwYXRoWy0xOl0gaW4gJy9cXDonOgorICAgICAgICAgICAgcGF0aCA9IHBhdGggKyBiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gcGF0aCArICcvJyArIGIKKyAgICByZXR1cm4gcGF0aAorCisKKyMgUGFyc2UgVU5DIHBhdGhzCitkZWYgc3BsaXR1bmMocCk6CisgICAgIiIiU3BsaXQgYSBwYXRobmFtZSBpbnRvIFVOQyBtb3VudCBwb2ludCBhbmQgcmVsYXRpdmUgcGF0aCBzcGVjaWZpZXJzLgorCisgICAgUmV0dXJuIGEgMi10dXBsZSAodW5jLCByZXN0KTsgZWl0aGVyIHBhcnQgbWF5IGJlIGVtcHR5LgorICAgIElmIHVuYyBpcyBub3QgZW1wdHksIGl0IGhhcyB0aGUgZm9ybSAnLy9ob3N0L21vdW50JyAob3Igc2ltaWxhcgorICAgIHVzaW5nIGJhY2tzbGFzaGVzKS4gIHVuYytyZXN0IGlzIGFsd2F5cyB0aGUgaW5wdXQgcGF0aC4KKyAgICBQYXRocyBjb250YWluaW5nIGRyaXZlIGxldHRlcnMgbmV2ZXIgaGF2ZSBhbiBVTkMgcGFydC4KKyAgICAiIiIKKyAgICBpZiBwWzE6Ml0gPT0gJzonOgorICAgICAgICByZXR1cm4gJycsIHAgIyBEcml2ZSBsZXR0ZXIgcHJlc2VudAorICAgIGZpcnN0VHdvID0gcFswOjJdCisgICAgaWYgZmlyc3RUd28gPT0gJy8nICogMiBvciBmaXJzdFR3byA9PSAnXFwnICogMjoKKyAgICAgICAgIyBpcyBhIFVOQyBwYXRoOgorICAgICAgICAjIHZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2IGVxdWl2YWxlbnQgdG8gZHJpdmUgbGV0dGVyCisgICAgICAgICMgXFxtYWNoaW5lXG1vdW50cG9pbnRcZGlyZWN0b3JpZXMuLi4KKyAgICAgICAgIyAgICAgICAgICAgZGlyZWN0b3J5IF5eXl5eXl5eXl5eXl5eXgorICAgICAgICBub3JtcCA9IG5vcm1jYXNlKHApCisgICAgICAgIGluZGV4ID0gbm9ybXAuZmluZCgnLycsIDIpCisgICAgICAgIGlmIGluZGV4ID09IC0xOgorICAgICAgICAgICAgIyNyYWlzZSBSdW50aW1lRXJyb3IsICdpbGxlZ2FsIFVOQyBwYXRoOiAiJyArIHAgKyAnIicKKyAgICAgICAgICAgIHJldHVybiAoIiIsIHApCisgICAgICAgIGluZGV4ID0gbm9ybXAuZmluZCgnLycsIGluZGV4ICsgMSkKKyAgICAgICAgaWYgaW5kZXggPT0gLTE6CisgICAgICAgICAgICBpbmRleCA9IGxlbihwKQorICAgICAgICByZXR1cm4gcFs6aW5kZXhdLCBwW2luZGV4Ol0KKyAgICByZXR1cm4gJycsIHAKKworCisjIFJldHVybiB0aGUgdGFpbCAoYmFzZW5hbWUpIHBhcnQgb2YgYSBwYXRoLgorCitkZWYgYmFzZW5hbWUocCk6CisgICAgIiIiUmV0dXJucyB0aGUgZmluYWwgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUiIiIKKyAgICByZXR1cm4gc3BsaXQocClbMV0KKworCisjIFJldHVybiB0aGUgaGVhZCAoZGlybmFtZSkgcGFydCBvZiBhIHBhdGguCisKK2RlZiBkaXJuYW1lKHApOgorICAgICIiIlJldHVybnMgdGhlIGRpcmVjdG9yeSBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgorICAgIHJldHVybiBzcGxpdChwKVswXQorCisKKyMgYWxpYXMgZXhpc3RzIHRvIGxleGlzdHMKK2xleGlzdHMgPSBleGlzdHMKKworCisjIElzIGEgcGF0aCBhIGRpcmVjdG9yeT8KKworIyBJcyBhIHBhdGggYSBtb3VudCBwb2ludD8gIEVpdGhlciBhIHJvb3QgKHdpdGggb3Igd2l0aG91dCBkcml2ZSBsZXR0ZXIpCisjIG9yIGFuIFVOQyBwYXRoIHdpdGggYXQgbW9zdCBhIC8gb3IgXCBhZnRlciB0aGUgbW91bnQgcG9pbnQuCisKK2RlZiBpc21vdW50KHBhdGgpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYSBtb3VudCBwb2ludCAoZGVmaW5lZCBhcyByb290IG9mIGRyaXZlKSIiIgorICAgIHVuYywgcmVzdCA9IHNwbGl0dW5jKHBhdGgpCisgICAgaWYgdW5jOgorICAgICAgICByZXR1cm4gcmVzdCBpbiAoIiIsICIvIiwgIlxcIikKKyAgICBwID0gc3BsaXRkcml2ZShwYXRoKVsxXQorICAgIHJldHVybiBsZW4ocCkgPT0gMSBhbmQgcFswXSBpbiAnL1xcJworCisKKyMgTm9ybWFsaXplIGEgcGF0aCwgZS5nLiBBLy9CLCBBLy4vQiBhbmQgQS9mb28vLi4vQiBhbGwgYmVjb21lIEEvQi4KKworZGVmIG5vcm1wYXRoKHBhdGgpOgorICAgICIiIk5vcm1hbGl6ZSBwYXRoLCBlbGltaW5hdGluZyBkb3VibGUgc2xhc2hlcywgZXRjLiIiIgorICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKQorICAgIHByZWZpeCwgcGF0aCA9IHNwbGl0ZHJpdmUocGF0aCkKKyAgICB3aGlsZSBwYXRoWzoxXSA9PSAnLyc6CisgICAgICAgIHByZWZpeCA9IHByZWZpeCArICcvJworICAgICAgICBwYXRoID0gcGF0aFsxOl0KKyAgICBjb21wcyA9IHBhdGguc3BsaXQoJy8nKQorICAgIGkgPSAwCisgICAgd2hpbGUgaSA8IGxlbihjb21wcyk6CisgICAgICAgIGlmIGNvbXBzW2ldID09ICcuJzoKKyAgICAgICAgICAgIGRlbCBjb21wc1tpXQorICAgICAgICBlbGlmIGNvbXBzW2ldID09ICcuLicgYW5kIGkgPiAwIGFuZCBjb21wc1tpLTFdIG5vdCBpbiAoJycsICcuLicpOgorICAgICAgICAgICAgZGVsIGNvbXBzW2ktMTppKzFdCisgICAgICAgICAgICBpID0gaSAtIDEKKyAgICAgICAgZWxpZiBjb21wc1tpXSA9PSAnJyBhbmQgaSA+IDAgYW5kIGNvbXBzW2ktMV0gIT0gJyc6CisgICAgICAgICAgICBkZWwgY29tcHNbaV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICMgSWYgdGhlIHBhdGggaXMgbm93IGVtcHR5LCBzdWJzdGl0dXRlICcuJworICAgIGlmIG5vdCBwcmVmaXggYW5kIG5vdCBjb21wczoKKyAgICAgICAgY29tcHMuYXBwZW5kKCcuJykKKyAgICByZXR1cm4gcHJlZml4ICsgJy8nLmpvaW4oY29tcHMpCisKKworIyBSZXR1cm4gYW4gYWJzb2x1dGUgcGF0aC4KK2RlZiBhYnNwYXRoKHBhdGgpOgorICAgICIiIlJldHVybiB0aGUgYWJzb2x1dGUgdmVyc2lvbiBvZiBhIHBhdGgiIiIKKyAgICBpZiBub3QgaXNhYnMocGF0aCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UocGF0aCwgdW5pY29kZSk6CisgICAgICAgICAgICBjd2QgPSBvcy5nZXRjd2R1KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIHBhdGggPSBqb2luKGN3ZCwgcGF0aCkKKyAgICByZXR1cm4gbm9ybXBhdGgocGF0aCkKKworIyByZWFscGF0aCBpcyBhIG5vLW9wIG9uIHN5c3RlbXMgd2l0aG91dCBpc2xpbmsgc3VwcG9ydAorcmVhbHBhdGggPSBhYnNwYXRoCisKK3N1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzID0gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3MyZW14cGF0aC5weWMgYi9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTI1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvb3MyZW14cGF0aC5weW8gYi9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTI1ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L29zMmVteHBhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGRiLmRvYyBiL2xpYi9weXRob24yLjcvcGRiLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzViZTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wZGIuZG9jCkBAIC0wLDAgKzEsMjAyIEBACitUaGUgUHl0aG9uIERlYnVnZ2VyIFBkYgorPT09PT09PT09PT09PT09PT09PT09PT0KKworVG8gdXNlIHRoZSBkZWJ1Z2dlciBpbiBpdHMgc2ltcGxlc3QgZm9ybToKKworICAgICAgICA+Pj4gaW1wb3J0IHBkYgorICAgICAgICA+Pj4gcGRiLnJ1bignPGEgc3RhdGVtZW50PicpCisKK1RoZSBkZWJ1Z2dlcidzIHByb21wdCBpcyAnKFBkYikgJy4gIFRoaXMgd2lsbCBzdG9wIGluIHRoZSBmaXJzdAorZnVuY3Rpb24gY2FsbCBpbiA8YSBzdGF0ZW1lbnQ+LgorCitBbHRlcm5hdGl2ZWx5LCBpZiBhIHN0YXRlbWVudCB0ZXJtaW5hdGVkIHdpdGggYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiwKK3lvdSBjYW4gdXNlIHBkYidzIHBvc3QtbW9ydGVtIGZhY2lsaXR5IHRvIGluc3BlY3QgdGhlIGNvbnRlbnRzIG9mIHRoZQordHJhY2ViYWNrOgorCisgICAgICAgID4+PiA8YSBzdGF0ZW1lbnQ+CisgICAgICAgIDxleGNlcHRpb24gdHJhY2ViYWNrPgorICAgICAgICA+Pj4gaW1wb3J0IHBkYgorICAgICAgICA+Pj4gcGRiLnBtKCkKKworVGhlIGNvbW1hbmRzIHJlY29nbml6ZWQgYnkgdGhlIGRlYnVnZ2VyIGFyZSBsaXN0ZWQgaW4gdGhlIG5leHQKK3NlY3Rpb24uICBNb3N0IGNhbiBiZSBhYmJyZXZpYXRlZCBhcyBpbmRpY2F0ZWQ7IGUuZy4sIGgoZWxwKSBtZWFucwordGhhdCAnaGVscCcgY2FuIGJlIHR5cGVkIGFzICdoJyBvciAnaGVscCcgKGJ1dCBub3QgYXMgJ2hlJyBvciAnaGVsJywKK25vciBhcyAnSCcgb3IgJ0hlbHAnIG9yICdIRUxQJykuICBPcHRpb25hbCBhcmd1bWVudHMgYXJlIGVuY2xvc2VkIGluCitzcXVhcmUgYnJhY2tldHMuCisKK0EgYmxhbmsgbGluZSByZXBlYXRzIHRoZSBwcmV2aW91cyBjb21tYW5kIGxpdGVyYWxseSwgZXhjZXB0IGZvcgorJ2xpc3QnLCB3aGVyZSBpdCBsaXN0cyB0aGUgbmV4dCAxMSBsaW5lcy4KKworQ29tbWFuZHMgdGhhdCB0aGUgZGVidWdnZXIgZG9lc24ndCByZWNvZ25pemUgYXJlIGFzc3VtZWQgdG8gYmUgUHl0aG9uCitzdGF0ZW1lbnRzIGFuZCBhcmUgZXhlY3V0ZWQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHByb2dyYW0gYmVpbmcKK2RlYnVnZ2VkLiAgUHl0aG9uIHN0YXRlbWVudHMgY2FuIGFsc28gYmUgcHJlZml4ZWQgd2l0aCBhbiBleGNsYW1hdGlvbgorcG9pbnQgKCchJykuICBUaGlzIGlzIGEgcG93ZXJmdWwgd2F5IHRvIGluc3BlY3QgdGhlIHByb2dyYW0gYmVpbmcKK2RlYnVnZ2VkOyBpdCBpcyBldmVuIHBvc3NpYmxlIHRvIGNoYW5nZSB2YXJpYWJsZXMuICBXaGVuIGFuIGV4Y2VwdGlvbgorb2NjdXJzIGluIHN1Y2ggYSBzdGF0ZW1lbnQsIHRoZSBleGNlcHRpb24gbmFtZSBpcyBwcmludGVkIGJ1dCB0aGUKK2RlYnVnZ2VyJ3Mgc3RhdGUgaXMgbm90IGNoYW5nZWQuCisKK1RoZSBkZWJ1Z2dlciBzdXBwb3J0cyBhbGlhc2VzLCB3aGljaCBjYW4gc2F2ZSB0eXBpbmcuICBBbmQgYWxpYXNlcyBjYW4KK2hhdmUgcGFyYW1ldGVycyAoc2VlIHRoZSBhbGlhcyBoZWxwIGVudHJ5KSB3aGljaCBhbGxvd3Mgb25lIGEgY2VydGFpbgorbGV2ZWwgb2YgYWRhcHRhYmlsaXR5IHRvIHRoZSBjb250ZXh0IHVuZGVyIGV4YW1pbmF0aW9uLgorCitNdWx0aXBsZSBjb21tYW5kcyBtYXkgYmUgZW50ZXJlZCBvbiBhIHNpbmdsZSBsaW5lLCBzZXBhcmF0ZWQgYnkgdGhlCitwYWlyICc7OycuICBObyBpbnRlbGxpZ2VuY2UgaXMgYXBwbGllZCB0byBzZXBhcmF0aW5nIHRoZSBjb21tYW5kczsgdGhlCitpbnB1dCBpcyBzcGxpdCBhdCB0aGUgZmlyc3QgJzs7JywgZXZlbiBpZiBpdCBpcyBpbiB0aGUgbWlkZGxlIG9mIGEKK3F1b3RlZCBzdHJpbmcuCisKK0lmIGEgZmlsZSAiLnBkYnJjIiBleGlzdHMgaW4geW91ciBob21lIGRpcmVjdG9yeSBvciBpbiB0aGUgY3VycmVudAorZGlyZWN0b3J5LCBpdCBpcyByZWFkIGluIGFuZCBleGVjdXRlZCBhcyBpZiBpdCBoYWQgYmVlbiB0eXBlZCBhdCB0aGUKK2RlYnVnZ2VyIHByb21wdC4gIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgYWxpYXNlcy4gIElmIGJvdGgKK2ZpbGVzIGV4aXN0LCB0aGUgb25lIGluIHRoZSBob21lIGRpcmVjdG9yeSBpcyByZWFkIGZpcnN0IGFuZCBhbGlhc2VzCitkZWZpbmVkIHRoZXJlIGNhbiBiZSBvdmVycmlkZW4gYnkgdGhlIGxvY2FsIGZpbGUuCisKK0FzaWRlIGZyb20gYWxpYXNlcywgdGhlIGRlYnVnZ2VyIGlzIG5vdCBkaXJlY3RseSBwcm9ncmFtbWFibGU7IGJ1dCBpdAoraXMgaW1wbGVtZW50ZWQgYXMgYSBjbGFzcyBmcm9tIHdoaWNoIHlvdSBjYW4gZGVyaXZlIHlvdXIgb3duIGRlYnVnZ2VyCitjbGFzcywgd2hpY2ggeW91IGNhbiBtYWtlIGFzIGZhbmN5IGFzIHlvdSBsaWtlLgorCisKK0RlYnVnZ2VyIGNvbW1hbmRzCis9PT09PT09PT09PT09PT09PQorCitoKGVscCkKKyAgICAgICAgV2l0aG91dCBhcmd1bWVudCwgcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGNvbW1hbmRzLiAgV2l0aAorICAgICAgICBhIGNvbW1hbmQgbmFtZSBhcyBhcmd1bWVudCwgcHJpbnQgaGVscCBhYm91dCB0aGF0IGNvbW1hbmQKKyAgICAgICAgKHRoaXMgaXMgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCkuCisKK3coaGVyZSkKKyAgICAgICAgUHJpbnQgYSBzdGFjayB0cmFjZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgZnJhbWUgYXQgdGhlIGJvdHRvbS4KKyAgICAgICAgQW4gYXJyb3cgaW5kaWNhdGVzIHRoZSAiY3VycmVudCBmcmFtZSIsIHdoaWNoIGRldGVybWluZXMgdGhlCisgICAgICAgIGNvbnRleHQgb2YgbW9zdCBjb21tYW5kcy4KKworZChvd24pCisgICAgICAgIE1vdmUgdGhlIGN1cnJlbnQgZnJhbWUgb25lIGxldmVsIGRvd24gaW4gdGhlIHN0YWNrIHRyYWNlCisgICAgICAgICh0byBhIG5ld2VyIGZyYW1lKS4KKwordShwKQorICAgICAgICBNb3ZlIHRoZSBjdXJyZW50IGZyYW1lIG9uZSBsZXZlbCB1cCBpbiB0aGUgc3RhY2sgdHJhY2UKKyAgICAgICAgKHRvIGFuIG9sZGVyIGZyYW1lKS4KKworYihyZWFrKSBbIChbZmlsZW5hbWU6XWxpbmVubyB8IGZ1bmN0aW9uKSBbLCBjb25kaXRpb25dIF0KKyAgICAgICAgV2l0aCBhIGZpbGVuYW1lOmxpbmUgbnVtYmVyIGFyZ3VtZW50LCBzZXQgYSBicmVhayB0aGVyZS4gIElmCisgICAgICAgIGZpbGVuYW1lIGlzIG9taXR0ZWQsIHVzZSB0aGUgY3VycmVudCBmaWxlLiAgV2l0aCBhIGZ1bmN0aW9uCisgICAgICAgIG5hbWUsIHNldCBhIGJyZWFrIGF0IHRoZSBmaXJzdCBleGVjdXRhYmxlIGxpbmUgb2YgdGhhdAorICAgICAgICBmdW5jdGlvbi4gIFdpdGhvdXQgYXJndW1lbnQsIGxpc3QgYWxsIGJyZWFrcy4gIEVhY2ggYnJlYWtwb2ludAorICAgICAgICBpcyBhc3NpZ25lZCBhIG51bWJlciB0byB3aGljaCBhbGwgdGhlIG90aGVyIGJyZWFrcG9pbnQKKyAgICAgICAgY29tbWFuZHMgcmVmZXIuCisKKyAgICAgICAgVGhlIGNvbmRpdGlvbiBhcmd1bWVudCwgaWYgcHJlc2VudCwgaXMgYSBzdHJpbmcgd2hpY2ggbXVzdAorICAgICAgICBldmFsdWF0ZSB0byB0cnVlIGluIG9yZGVyIGZvciB0aGUgYnJlYWtwb2ludCB0byBiZSBob25vcmVkLgorCit0YnJlYWsgWyAoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgY29uZGl0aW9uXSBdCisgICAgICAgIFRlbXBvcmFyeSBicmVha3BvaW50LCB3aGljaCBpcyByZW1vdmVkIGF1dG9tYXRpY2FsbHkgd2hlbiBpdAorICAgICAgICBpcyBmaXJzdCBoaXQuICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBicmVhay4KKworY2woZWFyKSBbYnBudW1iZXIgW2JwbnVtYmVyIC4uLl0gXQorICAgICAgICBXaXRoIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYnJlYWtwb2ludCBudW1iZXJzLCBjbGVhciB0aG9zZQorICAgICAgICBicmVha3BvaW50cy4gIFdpdGhvdXQgYXJndW1lbnQsIGNsZWFyIGFsbCBicmVha3MgKGJ1dCBmaXJzdAorICAgICAgICBhc2sgY29uZmlybWF0aW9uKS4KKworZGlzYWJsZSBicG51bWJlciBbYnBudW1iZXIgLi4uXQorICAgICAgICBEaXNhYmxlcyB0aGUgYnJlYWtwb2ludHMgZ2l2ZW4gYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZgorICAgICAgICBicmVha3BvaW50IG51bWJlcnMuICBEaXNhYmxpbmcgYSBicmVha3BvaW50IG1lYW5zIGl0IGNhbm5vdAorICAgICAgICBjYXVzZSB0aGUgcHJvZ3JhbSB0byBzdG9wIGV4ZWN1dGlvbiwgYnV0IHVubGlrZSBjbGVhcmluZyBhCisgICAgICAgIGJyZWFrcG9pbnQsIGl0IHJlbWFpbnMgaW4gdGhlIGxpc3Qgb2YgYnJlYWtwb2ludHMgYW5kIGNhbiBiZQorICAgICAgICAocmUtKWVuYWJsZWQuCisKK2VuYWJsZSBicG51bWJlciBbYnBudW1iZXIgLi4uXQorICAgICAgICBFbmFibGVzIHRoZSBicmVha3BvaW50cyBzcGVjaWZpZWQuCisKK2lnbm9yZSBicG51bWJlciBjb3VudAorICAgICAgICBTZXRzIHRoZSBpZ25vcmUgY291bnQgZm9yIHRoZSBnaXZlbiBicmVha3BvaW50IG51bWJlci4gIElmCisgICAgICAgIGNvdW50IGlzIG9taXR0ZWQsIHRoZSBpZ25vcmUgY291bnQgaXMgc2V0IHRvIDAuICBBIGJyZWFrcG9pbnQKKyAgICAgICAgYmVjb21lcyBhY3RpdmUgd2hlbiB0aGUgaWdub3JlIGNvdW50IGlzIHplcm8uICBXaGVuIG5vbi16ZXJvLAorICAgICAgICB0aGUgY291bnQgaXMgZGVjcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQKKyAgICAgICAgYW5kIHRoZSBicmVha3BvaW50IGlzIG5vdCBkaXNhYmxlZCBhbmQgYW55IGFzc29jaWF0ZWQKKyAgICAgICAgY29uZGl0aW9uIGV2YWx1YXRlcyB0byB0cnVlLgorCitjb25kaXRpb24gYnBudW1iZXIgY29uZGl0aW9uCisgICAgICAgIGNvbmRpdGlvbiBpcyBhbiBleHByZXNzaW9uIHdoaWNoIG11c3QgZXZhbHVhdGUgdG8gdHJ1ZSBiZWZvcmUKKyAgICAgICAgdGhlIGJyZWFrcG9pbnQgaXMgaG9ub3JlZC4gIElmIGNvbmRpdGlvbiBpcyBhYnNlbnQsIGFueQorICAgICAgICBleGlzdGluZyBjb25kaXRpb24gaXMgcmVtb3ZlZDsgaS5lLiwgdGhlIGJyZWFrcG9pbnQgaXMgbWFkZQorICAgICAgICB1bmNvbmRpdGlvbmFsLgorCitzKHRlcCkKKyAgICAgICAgRXhlY3V0ZSB0aGUgY3VycmVudCBsaW5lLCBzdG9wIGF0IHRoZSBmaXJzdCBwb3NzaWJsZSBvY2Nhc2lvbgorICAgICAgICAoZWl0aGVyIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb3IgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24pLgorCituKGV4dCkKKyAgICAgICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24KKyAgICAgICAgaXMgcmVhY2hlZCBvciBpdCByZXR1cm5zLgorCit1bnQoaWwpCisgICAgICAgIENvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgbGluZSB3aXRoIGEgbnVtYmVyIGdyZWF0ZXIgdGhhbiB0aGUgCisgICAgICAgIGN1cnJlbnQgb25lIGlzIHJlYWNoZWQgb3IgdW50aWwgdGhlIGN1cnJlbnQgZnJhbWUgcmV0dXJucy4KKworcihldHVybikKKyAgICAgICAgQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHJldHVybnMuCisKK3J1biBbYXJncy4uLl0KKyAgICAgICAgUmVzdGFydCB0aGUgZGVidWdnZWQgcHl0aG9uIHByb2dyYW0uIElmIGEgc3RyaW5nIGlzIHN1cHBsaWVkIGl0IGlzCisgICAgICAgIHNwbGl0dGVkIHdpdGggInNobGV4IiwgYW5kIHRoZSByZXN1bHQgaXMgdXNlZCBhcyB0aGUgbmV3IHN5cy5hcmd2LgorICAgICAgICBIaXN0b3J5LCBicmVha3BvaW50cywgYWN0aW9ucyBhbmQgZGVidWdnZXIgb3B0aW9ucyBhcmUgcHJlc2VydmVkLgorICAgICAgICAicmVzdGFydCIgaXMgYW4gYWxpYXMgZm9yICJydW4iLgorCitjKG9udChpbnVlKSkKKyAgICAgICAgQ29udGludWUgZXhlY3V0aW9uLCBvbmx5IHN0b3Agd2hlbiBhIGJyZWFrcG9pbnQgaXMgZW5jb3VudGVyZWQuCisKK2woaXN0KSBbZmlyc3QgWyxsYXN0XV0KKyAgICAgICAgTGlzdCBzb3VyY2UgY29kZSBmb3IgdGhlIGN1cnJlbnQgZmlsZS4KKyAgICAgICAgV2l0aG91dCBhcmd1bWVudHMsIGxpc3QgMTEgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUKKyAgICAgICAgb3IgY29udGludWUgdGhlIHByZXZpb3VzIGxpc3RpbmcuCisgICAgICAgIFdpdGggb25lIGFyZ3VtZW50LCBsaXN0IDExIGxpbmVzIHN0YXJ0aW5nIGF0IHRoYXQgbGluZS4KKyAgICAgICAgV2l0aCB0d28gYXJndW1lbnRzLCBsaXN0IHRoZSBnaXZlbiByYW5nZTsKKyAgICAgICAgaWYgdGhlIHNlY29uZCBhcmd1bWVudCBpcyBsZXNzIHRoYW4gdGhlIGZpcnN0LCBpdCBpcyBhIGNvdW50LgorCithKHJncykKKyAgICAgICAgUHJpbnQgdGhlIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisKK3AgZXhwcmVzc2lvbgorICAgICAgICBQcmludCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uCisKKyghKSBzdGF0ZW1lbnQKKyAgICAgICAgRXhlY3V0ZSB0aGUgKG9uZS1saW5lKSBzdGF0ZW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgc3RhY2sgZnJhbWUuICBUaGUgZXhjbGFtYXRpb24gcG9pbnQgY2FuIGJlIG9taXR0ZWQgdW5sZXNzIHRoZQorICAgICAgICBmaXJzdCB3b3JkIG9mIHRoZSBzdGF0ZW1lbnQgcmVzZW1ibGVzIGEgZGVidWdnZXIgY29tbWFuZC4gIFRvCisgICAgICAgIGFzc2lnbiB0byBhIGdsb2JhbCB2YXJpYWJsZSB5b3UgbXVzdCBhbHdheXMgcHJlZml4IHRoZSBjb21tYW5kCisgICAgICAgIHdpdGggYSAnZ2xvYmFsJyBjb21tYW5kLCBlLmcuOgorICAgICAgICAoUGRiKSBnbG9iYWwgbGlzdF9vcHRpb25zOyBsaXN0X29wdGlvbnMgPSBbJy1sJ10KKyAgICAgICAgKFBkYikKKworCit3aGF0aXMgYXJnCisgICAgICAgICBQcmludHMgdGhlIHR5cGUgb2YgdGhlIGFyZ3VtZW50LgorCithbGlhcyBbbmFtZSBbY29tbWFuZF1dCisgICAgICAgIENyZWF0ZXMgYW4gYWxpYXMgY2FsbGVkICduYW1lJyB0aGF0IGV4ZWN1dGVzICdjb21tYW5kJy4gIFRoZQorICAgICAgICBjb21tYW5kIG11c3QgKm5vdCogYmUgZW5jbG9zZWQgaW4gcXVvdGVzLiAgUmVwbGFjZWFibGUKKyAgICAgICAgcGFyYW1ldGVycyBjYW4gYmUgaW5kaWNhdGVkIGJ5ICUxLCAlMiwgYW5kIHNvIG9uLCB3aGlsZSAlKiBpcworICAgICAgICByZXBsYWNlZCBieSBhbGwgdGhlIHBhcmFtZXRlcnMuICBJZiBubyBjb21tYW5kIGlzIGdpdmVuLCB0aGUKKyAgICAgICAgY3VycmVudCBhbGlhcyBmb3IgbmFtZSBpcyBzaG93bi4gSWYgbm8gbmFtZSBpcyBnaXZlbiwgYWxsCisgICAgICAgIGFsaWFzZXMgYXJlIGxpc3RlZC4KKworICAgICAgICBBbGlhc2VzIG1heSBiZSBuZXN0ZWQgYW5kIGNhbiBjb250YWluIGFueXRoaW5nIHRoYXQgY2FuIGJlCisgICAgICAgIGxlZ2FsbHkgdHlwZWQgYXQgdGhlIHBkYiBwcm9tcHQuICBOb3RlISAgWW91ICpjYW4qIG92ZXJyaWRlCisgICAgICAgIGludGVybmFsIHBkYiBjb21tYW5kcyB3aXRoIGFsaWFzZXMhICBUaG9zZSBpbnRlcm5hbCBjb21tYW5kcworICAgICAgICBhcmUgdGhlbiBoaWRkZW4gdW50aWwgdGhlIGFsaWFzIGlzIHJlbW92ZWQuICBBbGlhc2luZyBpcworICAgICAgICByZWN1cnNpdmVseSBhcHBsaWVkIHRvIHRoZSBmaXJzdCB3b3JkIG9mIHRoZSBjb21tYW5kIGxpbmU7IGFsbAorICAgICAgICBvdGhlciB3b3JkcyBpbiB0aGUgbGluZSBhcmUgbGVmdCBhbG9uZS4KKworICAgICAgICBBcyBhbiBleGFtcGxlLCBoZXJlIGFyZSB0d28gdXNlZnVsIGFsaWFzZXMgKGVzcGVjaWFsbHkgd2hlbgorICAgICAgICBwbGFjZWQgaW4gdGhlIC5wZGJyYyBmaWxlKToKKworICAgICAgICAjUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IikKKyAgICAgICAgYWxpYXMgcGkgZm9yIGsgaW4gJTEuX19kaWN0X18ua2V5cygpOiBwcmludCAiJTEuIixrLCI9IiwlMS5fX2RpY3RfX1trXQorICAgICAgICAjUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzIGluIHNlbGYKKyAgICAgICAgYWxpYXMgcHMgcGkgc2VsZgorICAgICAgICAgICAgICAgIAordW5hbGlhcyBuYW1lCisgICAgICAgIERlbGV0ZXMgdGhlIHNwZWNpZmllZCBhbGlhcy4KKworcSh1aXQpCisgICAgICAgIFF1aXQgZnJvbSB0aGUgZGVidWdnZXIuCisgICAgICAgIFRoZSBwcm9ncmFtIGJlaW5nIGV4ZWN1dGVkIGlzIGFib3J0ZWQuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BkYi5weSBiL2xpYi9weXRob24yLjcvcGRiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU0NjhkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BkYi5weQpAQCAtMCwwICsxLDEzMzggQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiQSBQeXRob24gZGVidWdnZXIuIiIiCisKKyMgKFNlZSBwZGIuZG9jIGZvciBkb2N1bWVudGF0aW9uLikKKworaW1wb3J0IHN5cworaW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IGNtZAoraW1wb3J0IGJkYgorZnJvbSByZXByIGltcG9ydCBSZXByCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHBwcmludAoraW1wb3J0IHRyYWNlYmFjaworCisKK2NsYXNzIFJlc3RhcnQoRXhjZXB0aW9uKToKKyAgICAiIiJDYXVzZXMgYSBkZWJ1Z2dlciB0byBiZSByZXN0YXJ0ZWQgZm9yIHRoZSBkZWJ1Z2dlZCBweXRob24gcHJvZ3JhbS4iIiIKKyAgICBwYXNzCisKKyMgQ3JlYXRlIGEgY3VzdG9tIHNhZmUgUmVwciBpbnN0YW5jZSBhbmQgaW5jcmVhc2UgaXRzIG1heHN0cmluZy4KKyMgVGhlIGRlZmF1bHQgb2YgMzAgdHJ1bmNhdGVzIGVycm9yIG1lc3NhZ2VzIHRvbyBlYXNpbHkuCitfcmVwciA9IFJlcHIoKQorX3JlcHIubWF4c3RyaW5nID0gMjAwCitfc2FmZXJlcHIgPSBfcmVwci5yZXByCisKK19fYWxsX18gPSBbInJ1biIsICJwbSIsICJQZGIiLCAicnVuZXZhbCIsICJydW5jdHgiLCAicnVuY2FsbCIsICJzZXRfdHJhY2UiLAorICAgICAgICAgICAicG9zdF9tb3J0ZW0iLCAiaGVscCJdCisKK2RlZiBmaW5kX2Z1bmN0aW9uKGZ1bmNuYW1lLCBmaWxlbmFtZSk6CisgICAgY3JlID0gcmUuY29tcGlsZShyJ2RlZlxzKyVzXHMqWyhdJyAlIHJlLmVzY2FwZShmdW5jbmFtZSkpCisgICAgdHJ5OgorICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgIyBjb25zdW1lciBvZiB0aGlzIGluZm8gZXhwZWN0cyB0aGUgZmlyc3QgbGluZSB0byBiZSAxCisgICAgbGluZW5vID0gMQorICAgIGFuc3dlciA9IE5vbmUKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICBpZiBsaW5lID09ICcnOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgY3JlLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgYW5zd2VyID0gZnVuY25hbWUsIGZpbGVuYW1lLCBsaW5lbm8KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGxpbmVubyA9IGxpbmVubyArIDEKKyAgICBmcC5jbG9zZSgpCisgICAgcmV0dXJuIGFuc3dlcgorCisKKyMgSW50ZXJhY3Rpb24gcHJvbXB0IGxpbmUgd2lsbCBzZXBhcmF0ZSBmaWxlIGFuZCBjYWxsIGluZm8gZnJvbSBjb2RlCisjIHRleHQgdXNpbmcgdmFsdWUgb2YgbGluZV9wcmVmaXggc3RyaW5nLiAgQSBuZXdsaW5lIGFuZCBhcnJvdyBtYXkKKyMgYmUgdG8geW91ciBsaWtpbmcuICBZb3UgY2FuIHNldCBpdCBvbmNlIHBkYiBpcyBpbXBvcnRlZCB1c2luZyB0aGUKKyMgY29tbWFuZCAicGRiLmxpbmVfcHJlZml4ID0gJ1xuJSAnIi4KKyMgbGluZV9wcmVmaXggPSAnOiAnICAgICMgVXNlIHRoaXMgdG8gZ2V0IHRoZSBvbGQgc2l0dWF0aW9uIGJhY2sKK2xpbmVfcHJlZml4ID0gJ1xuLT4gJyAgICMgUHJvYmFibHkgYSBiZXR0ZXIgZGVmYXVsdAorCitjbGFzcyBQZGIoYmRiLkJkYiwgY21kLkNtZCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tcGxldGVrZXk9J3RhYicsIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBza2lwPU5vbmUpOgorICAgICAgICBiZGIuQmRiLl9faW5pdF9fKHNlbGYsIHNraXA9c2tpcCkKKyAgICAgICAgY21kLkNtZC5fX2luaXRfXyhzZWxmLCBjb21wbGV0ZWtleSwgc3RkaW4sIHN0ZG91dCkKKyAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgc2VsZi51c2VfcmF3aW5wdXQgPSAwCisgICAgICAgIHNlbGYucHJvbXB0ID0gJyhQZGIpICcKKyAgICAgICAgc2VsZi5hbGlhc2VzID0ge30KKyAgICAgICAgc2VsZi5tYWlucHlmaWxlID0gJycKKyAgICAgICAgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZSA9IDAKKyAgICAgICAgIyBUcnkgdG8gbG9hZCByZWFkbGluZSBpZiBpdCBleGlzdHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHJlYWRsaW5lCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFJlYWQgJEhPTUUvLnBkYnJjIGFuZCAuLy5wZGJyYworICAgICAgICBzZWxmLnJjTGluZXMgPSBbXQorICAgICAgICBpZiAnSE9NRScgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIGVudkhvbWUgPSBvcy5lbnZpcm9uWydIT01FJ10KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByY0ZpbGUgPSBvcGVuKG9zLnBhdGguam9pbihlbnZIb21lLCAiLnBkYnJjIikpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHJjRmlsZS5yZWFkbGluZXMoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yY0xpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIHJjRmlsZS5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJjRmlsZSA9IG9wZW4oIi5wZGJyYyIpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gcmNGaWxlLnJlYWRsaW5lcygpOgorICAgICAgICAgICAgICAgIHNlbGYucmNMaW5lcy5hcHBlbmQobGluZSkKKyAgICAgICAgICAgIHJjRmlsZS5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5jb21tYW5kcyA9IHt9ICMgYXNzb2NpYXRlcyBhIGNvbW1hbmQgbGlzdCB0byBicmVha3BvaW50IG51bWJlcnMKKyAgICAgICAgc2VsZi5jb21tYW5kc19kb3Byb21wdCA9IHt9ICMgZm9yIGVhY2ggYnAgbnVtLCB0ZWxscyBpZiB0aGUgcHJvbXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG11c3QgYmUgZGlzcC4gYWZ0ZXIgZXhlY2luZyB0aGUgY21kIGxpc3QKKyAgICAgICAgc2VsZi5jb21tYW5kc19zaWxlbnQgPSB7fSAjIGZvciBlYWNoIGJwIG51bSwgdGVsbHMgaWYgdGhlIHN0YWNrIHRyYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtdXN0IGJlIGRpc3AuIGFmdGVyIGV4ZWNpbmcgdGhlIGNtZCBsaXN0CisgICAgICAgIHNlbGYuY29tbWFuZHNfZGVmaW5pbmcgPSBGYWxzZSAjIFRydWUgd2hpbGUgaW4gdGhlIHByb2Nlc3Mgb2YgZGVmaW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYSBjb21tYW5kIGxpc3QKKyAgICAgICAgc2VsZi5jb21tYW5kc19ibnVtID0gTm9uZSAjIFRoZSBicmVha3BvaW50IG51bWJlciBmb3Igd2hpY2ggd2UgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWZpbmluZyBhIGxpc3QKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgYmRiLkJkYi5yZXNldChzZWxmKQorICAgICAgICBzZWxmLmZvcmdldCgpCisKKyAgICBkZWYgZm9yZ2V0KHNlbGYpOgorICAgICAgICBzZWxmLmxpbmVubyA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYuY3VyaW5kZXggPSAwCisgICAgICAgIHNlbGYuY3VyZnJhbWUgPSBOb25lCisKKyAgICBkZWYgc2V0dXAoc2VsZiwgZiwgdCk6CisgICAgICAgIHNlbGYuZm9yZ2V0KCkKKyAgICAgICAgc2VsZi5zdGFjaywgc2VsZi5jdXJpbmRleCA9IHNlbGYuZ2V0X3N0YWNrKGYsIHQpCisgICAgICAgIHNlbGYuY3VyZnJhbWUgPSBzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXhdWzBdCisgICAgICAgICMgVGhlIGZfbG9jYWxzIGRpY3Rpb25hcnkgaXMgdXBkYXRlZCBmcm9tIHRoZSBhY3R1YWwgZnJhbWUKKyAgICAgICAgIyBsb2NhbHMgd2hlbmV2ZXIgdGhlIC5mX2xvY2FscyBhY2Nlc3NvciBpcyBjYWxsZWQsIHNvIHdlCisgICAgICAgICMgY2FjaGUgaXQgaGVyZSB0byBlbnN1cmUgdGhhdCBtb2RpZmljYXRpb25zIGFyZSBub3Qgb3ZlcndyaXR0ZW4uCisgICAgICAgIHNlbGYuY3VyZnJhbWVfbG9jYWxzID0gc2VsZi5jdXJmcmFtZS5mX2xvY2FscworICAgICAgICBzZWxmLmV4ZWNSY0xpbmVzKCkKKworICAgICMgQ2FuIGJlIGV4ZWN1dGVkIGVhcmxpZXIgdGhhbiAnc2V0dXAnIGlmIGRlc2lyZWQKKyAgICBkZWYgZXhlY1JjTGluZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYucmNMaW5lczoKKyAgICAgICAgICAgICMgTWFrZSBsb2NhbCBjb3B5IGJlY2F1c2Ugb2YgcmVjdXJzaW9uCisgICAgICAgICAgICByY0xpbmVzID0gc2VsZi5yY0xpbmVzCisgICAgICAgICAgICAjIGV4ZWN1dGVkIG9ubHkgb25jZQorICAgICAgICAgICAgc2VsZi5yY0xpbmVzID0gW10KKyAgICAgICAgICAgIGZvciBsaW5lIGluIHJjTGluZXM6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXQorICAgICAgICAgICAgICAgIGlmIGxlbihsaW5lKSA+IDAgYW5kIGxpbmVbMF0gIT0gJyMnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm9uZWNtZChsaW5lKQorCisgICAgIyBPdmVycmlkZSBCZGIgbWV0aG9kcworCisgICAgZGVmIHVzZXJfY2FsbChzZWxmLCBmcmFtZSwgYXJndW1lbnRfbGlzdCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIHRoZSByZW1vdGUgcG9zc2liaWxpdHkKKyAgICAgICAgdGhhdCB3ZSBldmVyIG5lZWQgdG8gc3RvcCBpbiB0aGlzIGZ1bmN0aW9uLiIiIgorICAgICAgICBpZiBzZWxmLl93YWl0X2Zvcl9tYWlucHlmaWxlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuc3RvcF9oZXJlKGZyYW1lKToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICctLUNhbGwtLScKKyAgICAgICAgICAgIHNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIE5vbmUpCisKKyAgICBkZWYgdXNlcl9saW5lKHNlbGYsIGZyYW1lKToKKyAgICAgICAgIiIiVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBzdG9wIG9yIGJyZWFrIGF0IHRoaXMgbGluZS4iIiIKKyAgICAgICAgaWYgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZToKKyAgICAgICAgICAgIGlmIChzZWxmLm1haW5weWZpbGUgIT0gc2VsZi5jYW5vbmljKGZyYW1lLmZfY29kZS5jb19maWxlbmFtZSkKKyAgICAgICAgICAgICAgICBvciBmcmFtZS5mX2xpbmVubzw9IDApOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZSA9IDAKKyAgICAgICAgaWYgc2VsZi5icF9jb21tYW5kcyhmcmFtZSk6CisgICAgICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorCisgICAgZGVmIGJwX2NvbW1hbmRzKHNlbGYsZnJhbWUpOgorICAgICAgICAiIiJDYWxsIGV2ZXJ5IGNvbW1hbmQgdGhhdCB3YXMgc2V0IGZvciB0aGUgY3VycmVudCBhY3RpdmUgYnJlYWtwb2ludAorICAgICAgICAoaWYgdGhlcmUgaXMgb25lKS4KKworICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIG5vcm1hbCBpbnRlcmFjdGlvbiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCwKKyAgICAgICAgRmFsc2Ugb3RoZXJ3aXNlLiIiIgorICAgICAgICAjIHNlbGYuY3VycmVudGJwIGlzIHNldCBpbiBiZGIgaW4gQmRiLmJyZWFrX2hlcmUgaWYgYSBicmVha3BvaW50IHdhcyBoaXQKKyAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAiY3VycmVudGJwIiwgRmFsc2UpIGFuZCBcCisgICAgICAgICAgICAgICBzZWxmLmN1cnJlbnRicCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgY3VycmVudGJwID0gc2VsZi5jdXJyZW50YnAKKyAgICAgICAgICAgIHNlbGYuY3VycmVudGJwID0gMAorICAgICAgICAgICAgbGFzdGNtZF9iYWNrID0gc2VsZi5sYXN0Y21kCisgICAgICAgICAgICBzZWxmLnNldHVwKGZyYW1lLCBOb25lKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5jb21tYW5kc1tjdXJyZW50YnBdOgorICAgICAgICAgICAgICAgIHNlbGYub25lY21kKGxpbmUpCisgICAgICAgICAgICBzZWxmLmxhc3RjbWQgPSBsYXN0Y21kX2JhY2sKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbW1hbmRzX3NpbGVudFtjdXJyZW50YnBdOgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfc3RhY2tfZW50cnkoc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XSkKKyAgICAgICAgICAgIGlmIHNlbGYuY29tbWFuZHNfZG9wcm9tcHRbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLmNtZGxvb3AoKQorICAgICAgICAgICAgc2VsZi5mb3JnZXQoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgdXNlcl9yZXR1cm4oc2VsZiwgZnJhbWUsIHJldHVybl92YWx1ZSk6CisgICAgICAgICIiIlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZXR1cm4gdHJhcCBpcyBzZXQgaGVyZS4iIiIKKyAgICAgICAgaWYgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmcmFtZS5mX2xvY2Fsc1snX19yZXR1cm5fXyddID0gcmV0dXJuX3ZhbHVlCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICctLVJldHVybi0tJworICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorCisgICAgZGVmIHVzZXJfZXhjZXB0aW9uKHNlbGYsIGZyYW1lLCBleGNfaW5mbyk6CisgICAgICAgICIiIlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsCisgICAgICAgIGJ1dCBvbmx5IGlmIHdlIGFyZSB0byBzdG9wIGF0IG9yIGp1c3QgYmVsb3cgdGhpcyBsZXZlbC4iIiIKKyAgICAgICAgaWYgc2VsZi5fd2FpdF9mb3JfbWFpbnB5ZmlsZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrID0gZXhjX2luZm8KKyAgICAgICAgZnJhbWUuZl9sb2NhbHNbJ19fZXhjZXB0aW9uX18nXSA9IGV4Y190eXBlLCBleGNfdmFsdWUKKyAgICAgICAgaWYgdHlwZShleGNfdHlwZSkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBleGNfdHlwZV9uYW1lID0gZXhjX3R5cGUKKyAgICAgICAgZWxzZTogZXhjX3R5cGVfbmFtZSA9IGV4Y190eXBlLl9fbmFtZV9fCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIGV4Y190eXBlX25hbWUgKyAnOicsIF9zYWZlcmVwcihleGNfdmFsdWUpCisgICAgICAgIHNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIGV4Y190cmFjZWJhY2spCisKKyAgICAjIEdlbmVyYWwgaW50ZXJhY3Rpb24gZnVuY3Rpb24KKworICAgIGRlZiBpbnRlcmFjdGlvbihzZWxmLCBmcmFtZSwgdHJhY2ViYWNrKToKKyAgICAgICAgc2VsZi5zZXR1cChmcmFtZSwgdHJhY2ViYWNrKQorICAgICAgICBzZWxmLnByaW50X3N0YWNrX2VudHJ5KHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF0pCisgICAgICAgIHNlbGYuY21kbG9vcCgpCisgICAgICAgIHNlbGYuZm9yZ2V0KCkKKworICAgIGRlZiBkaXNwbGF5aG9vayhzZWxmLCBvYmopOgorICAgICAgICAiIiJDdXN0b20gZGlzcGxheWhvb2sgZm9yIHRoZSBleGVjIGluIGRlZmF1bHQoKSwgd2hpY2ggcHJldmVudHMKKyAgICAgICAgYXNzaWdubWVudCBvZiB0aGUgXyB2YXJpYWJsZSBpbiB0aGUgYnVpbHRpbnMuCisgICAgICAgICIiIgorICAgICAgICAjIHJlcHJvZHVjZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHN0YW5kYXJkIGRpc3BsYXlob29rLCBub3QgcHJpbnRpbmcgTm9uZQorICAgICAgICBpZiBvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmludCByZXByKG9iaikKKworICAgIGRlZiBkZWZhdWx0KHNlbGYsIGxpbmUpOgorICAgICAgICBpZiBsaW5lWzoxXSA9PSAnISc6IGxpbmUgPSBsaW5lWzE6XQorICAgICAgICBsb2NhbHMgPSBzZWxmLmN1cmZyYW1lX2xvY2FscworICAgICAgICBnbG9iYWxzID0gc2VsZi5jdXJmcmFtZS5mX2dsb2JhbHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUobGluZSArICdcbicsICc8c3RkaW4+JywgJ3NpbmdsZScpCisgICAgICAgICAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIHNhdmVfc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgICAgIHNhdmVfZGlzcGxheWhvb2sgPSBzeXMuZGlzcGxheWhvb2sKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3RkaW4gPSBzZWxmLnN0ZGluCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuc3Rkb3V0CisgICAgICAgICAgICAgICAgc3lzLmRpc3BsYXlob29rID0gc2VsZi5kaXNwbGF5aG9vaworICAgICAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBnbG9iYWxzLCBsb2NhbHMKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisgICAgICAgICAgICAgICAgc3lzLnN0ZGluID0gc2F2ZV9zdGRpbgorICAgICAgICAgICAgICAgIHN5cy5kaXNwbGF5aG9vayA9IHNhdmVfZGlzcGxheWhvb2sKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdCwgdiA9IHN5cy5leGNfaW5mbygpWzoyXQorICAgICAgICAgICAgaWYgdHlwZSh0KSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgICAgICBleGNfdHlwZV9uYW1lID0gdAorICAgICAgICAgICAgZWxzZTogZXhjX3R5cGVfbmFtZSA9IHQuX19uYW1lX18KKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKionLCBleGNfdHlwZV9uYW1lICsgJzonLCB2CisKKyAgICBkZWYgcHJlY21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJIYW5kbGUgYWxpYXMgZXhwYW5zaW9uIGFuZCAnOzsnIHNlcGFyYXRvci4iIiIKKyAgICAgICAgaWYgbm90IGxpbmUuc3RyaXAoKToKKyAgICAgICAgICAgIHJldHVybiBsaW5lCisgICAgICAgIGFyZ3MgPSBsaW5lLnNwbGl0KCkKKyAgICAgICAgd2hpbGUgYXJnc1swXSBpbiBzZWxmLmFsaWFzZXM6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5hbGlhc2VzW2FyZ3NbMF1dCisgICAgICAgICAgICBpaSA9IDEKKyAgICAgICAgICAgIGZvciB0bXBBcmcgaW4gYXJnc1sxOl06CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgiJSIgKyBzdHIoaWkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBBcmcpCisgICAgICAgICAgICAgICAgaWkgPSBpaSArIDEKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoIiUqIiwgJyAnLmpvaW4oYXJnc1sxOl0pKQorICAgICAgICAgICAgYXJncyA9IGxpbmUuc3BsaXQoKQorICAgICAgICAjIHNwbGl0IGludG8gJzs7JyBzZXBhcmF0ZWQgY29tbWFuZHMKKyAgICAgICAgIyB1bmxlc3MgaXQncyBhbiBhbGlhcyBjb21tYW5kCisgICAgICAgIGlmIGFyZ3NbMF0gIT0gJ2FsaWFzJzoKKyAgICAgICAgICAgIG1hcmtlciA9IGxpbmUuZmluZCgnOzsnKQorICAgICAgICAgICAgaWYgbWFya2VyID49IDA6CisgICAgICAgICAgICAgICAgIyBxdWV1ZSB1cCBldmVyeXRoaW5nIGFmdGVyIG1hcmtlcgorICAgICAgICAgICAgICAgIG5leHQgPSBsaW5lW21hcmtlcisyOl0ubHN0cmlwKCkKKyAgICAgICAgICAgICAgICBzZWxmLmNtZHF1ZXVlLmFwcGVuZChuZXh0KQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzptYXJrZXJdLnJzdHJpcCgpCisgICAgICAgIHJldHVybiBsaW5lCisKKyAgICBkZWYgb25lY21kKHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJJbnRlcnByZXQgdGhlIGFyZ3VtZW50IGFzIHRob3VnaCBpdCBoYWQgYmVlbiB0eXBlZCBpbiByZXNwb25zZQorICAgICAgICB0byB0aGUgcHJvbXB0LgorCisgICAgICAgIENoZWNrcyB3aGV0aGVyIHRoaXMgbGluZSBpcyB0eXBlZCBhdCB0aGUgbm9ybWFsIHByb21wdCBvciBpbgorICAgICAgICBhIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0IGRlZmluaXRpb24uCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5jb21tYW5kc19kZWZpbmluZzoKKyAgICAgICAgICAgIHJldHVybiBjbWQuQ21kLm9uZWNtZChzZWxmLCBsaW5lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2NvbW1hbmRfZGVmKGxpbmUpCisKKyAgICBkZWYgaGFuZGxlX2NvbW1hbmRfZGVmKHNlbGYsbGluZSk6CisgICAgICAgICIiIkhhbmRsZXMgb25lIGNvbW1hbmQgbGluZSBkdXJpbmcgY29tbWFuZCBsaXN0IGRlZmluaXRpb24uIiIiCisgICAgICAgIGNtZCwgYXJnLCBsaW5lID0gc2VsZi5wYXJzZWxpbmUobGluZSkKKyAgICAgICAgaWYgbm90IGNtZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBjbWQgPT0gJ3NpbGVudCc6CisgICAgICAgICAgICBzZWxmLmNvbW1hbmRzX3NpbGVudFtzZWxmLmNvbW1hbmRzX2JudW1dID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuICMgY29udGludWUgdG8gaGFuZGxlIG90aGVyIGNtZCBkZWYgaW4gdGhlIGNtZCBsaXN0CisgICAgICAgIGVsaWYgY21kID09ICdlbmQnOgorICAgICAgICAgICAgc2VsZi5jbWRxdWV1ZSA9IFtdCisgICAgICAgICAgICByZXR1cm4gMSAjIGVuZCBvZiBjbWQgbGlzdAorICAgICAgICBjbWRsaXN0ID0gc2VsZi5jb21tYW5kc1tzZWxmLmNvbW1hbmRzX2JudW1dCisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIGNtZGxpc3QuYXBwZW5kKGNtZCsnICcrYXJnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kbGlzdC5hcHBlbmQoY21kKQorICAgICAgICAjIERldGVybWluZSBpZiB3ZSBtdXN0IHN0b3AKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyBjbWQpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGZ1bmMgPSBzZWxmLmRlZmF1bHQKKyAgICAgICAgIyBvbmUgb2YgdGhlIHJlc3VtaW5nIGNvbW1hbmRzCisgICAgICAgIGlmIGZ1bmMuZnVuY19uYW1lIGluIHNlbGYuY29tbWFuZHNfcmVzdW1pbmc6CisgICAgICAgICAgICBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W3NlbGYuY29tbWFuZHNfYm51bV0gPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jbWRxdWV1ZSA9IFtdCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4KKworICAgICMgQ29tbWFuZCBkZWZpbml0aW9ucywgY2FsbGVkIGJ5IGNtZGxvb3AoKQorICAgICMgVGhlIGFyZ3VtZW50IGlzIHRoZSByZW1haW5pbmcgc3RyaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUKKyAgICAjIFJldHVybiB0cnVlIHRvIGV4aXQgZnJvbSB0aGUgY29tbWFuZCBsb29wCisKKyAgICBkb19oID0gY21kLkNtZC5kb19oZWxwCisKKyAgICBkZWYgZG9fY29tbWFuZHMoc2VsZiwgYXJnKToKKyAgICAgICAgIiIiRGVmaW5lcyBhIGxpc3Qgb2YgY29tbWFuZHMgYXNzb2NpYXRlZCB0byBhIGJyZWFrcG9pbnQuCisKKyAgICAgICAgVGhvc2UgY29tbWFuZHMgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgYnJlYWtwb2ludCBjYXVzZXMKKyAgICAgICAgdGhlIHByb2dyYW0gdG8gc3RvcCBleGVjdXRpb24uIiIiCisgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICBibnVtID0gbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpLTEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBibnVtID0gaW50KGFyZykKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiVXNhZ2UgOiBjb21tYW5kcyBbYm51bV1cbiAgICAgICAgLi4uIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuICAgICAgICBlbmQiCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuY29tbWFuZHNfYm51bSA9IGJudW0KKyAgICAgICAgc2VsZi5jb21tYW5kc1tibnVtXSA9IFtdCisgICAgICAgIHNlbGYuY29tbWFuZHNfZG9wcm9tcHRbYm51bV0gPSBUcnVlCisgICAgICAgIHNlbGYuY29tbWFuZHNfc2lsZW50W2JudW1dID0gRmFsc2UKKyAgICAgICAgcHJvbXB0X2JhY2sgPSBzZWxmLnByb21wdAorICAgICAgICBzZWxmLnByb21wdCA9ICcoY29tKSAnCisgICAgICAgIHNlbGYuY29tbWFuZHNfZGVmaW5pbmcgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY21kbG9vcCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNvbW1hbmRzX2RlZmluaW5nID0gRmFsc2UKKyAgICAgICAgICAgIHNlbGYucHJvbXB0ID0gcHJvbXB0X2JhY2sKKworICAgIGRlZiBkb19icmVhayhzZWxmLCBhcmcsIHRlbXBvcmFyeSA9IDApOgorICAgICAgICAjIGJyZWFrIFsgKFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssICJjb25kaXRpb24iXSBdCisgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICBpZiBzZWxmLmJyZWFrczogICMgVGhlcmUncyBhdCBsZWFzdCBvbmUKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiTnVtIFR5cGUgICAgICAgICBEaXNwIEVuYiAgIFdoZXJlIgorICAgICAgICAgICAgICAgIGZvciBicCBpbiBiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyOgorICAgICAgICAgICAgICAgICAgICBpZiBicDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJwLmJwcHJpbnQoc2VsZi5zdGRvdXQpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBwYXJzZSBhcmd1bWVudHM7IGNvbW1hIGhhcyBsb3dlc3QgcHJlY2VkZW5jZQorICAgICAgICAjIGFuZCBjYW5ub3Qgb2NjdXIgaW4gZmlsZW5hbWUKKyAgICAgICAgZmlsZW5hbWUgPSBOb25lCisgICAgICAgIGxpbmVubyA9IE5vbmUKKyAgICAgICAgY29uZCA9IE5vbmUKKyAgICAgICAgY29tbWEgPSBhcmcuZmluZCgnLCcpCisgICAgICAgIGlmIGNvbW1hID4gMDoKKyAgICAgICAgICAgICMgcGFyc2Ugc3R1ZmYgYWZ0ZXIgY29tbWE6ICJjb25kaXRpb24iCisgICAgICAgICAgICBjb25kID0gYXJnW2NvbW1hKzE6XS5sc3RyaXAoKQorICAgICAgICAgICAgYXJnID0gYXJnWzpjb21tYV0ucnN0cmlwKCkKKyAgICAgICAgIyBwYXJzZSBzdHVmZiBiZWZvcmUgY29tbWE6IFtmaWxlbmFtZTpdbGluZW5vIHwgZnVuY3Rpb24KKyAgICAgICAgY29sb24gPSBhcmcucmZpbmQoJzonKQorICAgICAgICBmdW5jbmFtZSA9IE5vbmUKKyAgICAgICAgaWYgY29sb24gPj0gMDoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gYXJnWzpjb2xvbl0ucnN0cmlwKCkKKyAgICAgICAgICAgIGYgPSBzZWxmLmxvb2t1cG1vZHVsZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBmOgorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogJywgcmVwcihmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ25vdCBmb3VuZCBmcm9tIHN5cy5wYXRoJworICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGYKKyAgICAgICAgICAgIGFyZyA9IGFyZ1tjb2xvbisxOl0ubHN0cmlwKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lbm8gPSBpbnQoYXJnKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIEJhZCBsaW5lbm86JywgYXJnCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5vIGNvbG9uOyBjYW4gYmUgbGluZW5vIG9yIGZ1bmN0aW9uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGluZW5vID0gaW50KGFyZykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYyA9IGV2YWwoYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cmZyYW1lLmZfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jdXJmcmFtZV9sb2NhbHMpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBmdW5jID0gYXJnCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGZ1bmMsICdpbV9mdW5jJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jID0gZnVuYy5pbV9mdW5jCisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBmdW5jLmZ1bmNfY29kZQorICAgICAgICAgICAgICAgICAgICAjdXNlIGNvX25hbWUgdG8gaWRlbnRpZnkgdGhlIGJrcHQgKGZ1bmN0aW9uIG5hbWVzCisgICAgICAgICAgICAgICAgICAgICNjb3VsZCBiZSBhbGlhc2VkLCBidXQgY29fbmFtZSBpcyBpbnZhcmlhbnQpCisgICAgICAgICAgICAgICAgICAgIGZ1bmNuYW1lID0gY29kZS5jb19uYW1lCisgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGNvZGUuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBjb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAjIGxhc3QgdGhpbmcgdG8gdHJ5CisgICAgICAgICAgICAgICAgICAgIChvaywgZmlsZW5hbWUsIGxuKSA9IHNlbGYubGluZWluZm8oYXJnKQorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIFRoZSBzcGVjaWZpZWQgb2JqZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIHJlcHIoYXJnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdpcyBub3QgYSBmdW5jdGlvbicKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdvciB3YXMgbm90IGZvdW5kIGFsb25nIHN5cy5wYXRoLicKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBmdW5jbmFtZSA9IG9rICMgb2sgY29udGFpbnMgYSBmdW5jdGlvbiBuYW1lCisgICAgICAgICAgICAgICAgICAgIGxpbmVubyA9IGludChsbikKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmRlZmF1bHRGaWxlKCkKKyAgICAgICAgIyBDaGVjayBmb3IgcmVhc29uYWJsZSBicmVha3BvaW50CisgICAgICAgIGxpbmUgPSBzZWxmLmNoZWNrbGluZShmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgIyBub3cgc2V0IHRoZSBicmVhayBwb2ludAorICAgICAgICAgICAgZXJyID0gc2VsZi5zZXRfYnJlYWsoZmlsZW5hbWUsIGxpbmUsIHRlbXBvcmFyeSwgY29uZCwgZnVuY25hbWUpCisgICAgICAgICAgICBpZiBlcnI6IHByaW50ID4+c2VsZi5zdGRvdXQsICcqKionLCBlcnIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnAgPSBzZWxmLmdldF9icmVha3MoZmlsZW5hbWUsIGxpbmUpWy0xXQorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICJCcmVha3BvaW50ICVkIGF0ICVzOiVkIiAlIChicC5udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwLmxpbmUpCisKKyAgICAjIFRvIGJlIG92ZXJyaWRkZW4gaW4gZGVyaXZlZCBkZWJ1Z2dlcnMKKyAgICBkZWYgZGVmYXVsdEZpbGUoc2VsZik6CisgICAgICAgICIiIlByb2R1Y2UgYSByZWFzb25hYmxlIGRlZmF1bHQuIiIiCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jdXJmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgaWYgZmlsZW5hbWUgPT0gJzxzdHJpbmc+JyBhbmQgc2VsZi5tYWlucHlmaWxlOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm1haW5weWZpbGUKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisKKyAgICBkb19iID0gZG9fYnJlYWsKKworICAgIGRlZiBkb190YnJlYWsoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5kb19icmVhayhhcmcsIDEpCisKKyAgICBkZWYgbGluZWluZm8oc2VsZiwgaWRlbnRpZmllcik6CisgICAgICAgIGZhaWxlZCA9IChOb25lLCBOb25lLCBOb25lKQorICAgICAgICAjIElucHV0IGlzIGlkZW50aWZpZXIsIG1heSBiZSBpbiBzaW5nbGUgcXVvdGVzCisgICAgICAgIGlkc3RyaW5nID0gaWRlbnRpZmllci5zcGxpdCgiJyIpCisgICAgICAgIGlmIGxlbihpZHN0cmluZykgPT0gMToKKyAgICAgICAgICAgICMgbm90IGluIHNpbmdsZSBxdW90ZXMKKyAgICAgICAgICAgIGlkID0gaWRzdHJpbmdbMF0uc3RyaXAoKQorICAgICAgICBlbGlmIGxlbihpZHN0cmluZykgPT0gMzoKKyAgICAgICAgICAgICMgcXVvdGVkCisgICAgICAgICAgICBpZCA9IGlkc3RyaW5nWzFdLnN0cmlwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmYWlsZWQKKyAgICAgICAgaWYgaWQgPT0gJyc6IHJldHVybiBmYWlsZWQKKyAgICAgICAgcGFydHMgPSBpZC5zcGxpdCgnLicpCisgICAgICAgICMgUHJvdGVjdGlvbiBmb3IgZGVyaXZlZCBkZWJ1Z2dlcnMKKyAgICAgICAgaWYgcGFydHNbMF0gPT0gJ3NlbGYnOgorICAgICAgICAgICAgZGVsIHBhcnRzWzBdCisgICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWxlZAorICAgICAgICAjIEJlc3QgZmlyc3QgZ3Vlc3MgYXQgZmlsZSB0byBsb29rIGF0CisgICAgICAgIGZuYW1lID0gc2VsZi5kZWZhdWx0RmlsZSgpCisgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMToKKyAgICAgICAgICAgIGl0ZW0gPSBwYXJ0c1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBNb3JlIHRoYW4gb25lIHBhcnQuCisgICAgICAgICAgICAjIEZpcnN0IGlzIG1vZHVsZSwgc2Vjb25kIGlzIG1ldGhvZC9jbGFzcworICAgICAgICAgICAgZiA9IHNlbGYubG9va3VwbW9kdWxlKHBhcnRzWzBdKQorICAgICAgICAgICAgaWYgZjoKKyAgICAgICAgICAgICAgICBmbmFtZSA9IGYKKyAgICAgICAgICAgIGl0ZW0gPSBwYXJ0c1sxXQorICAgICAgICBhbnN3ZXIgPSBmaW5kX2Z1bmN0aW9uKGl0ZW0sIGZuYW1lKQorICAgICAgICByZXR1cm4gYW5zd2VyIG9yIGZhaWxlZAorCisgICAgZGVmIGNoZWNrbGluZShzZWxmLCBmaWxlbmFtZSwgbGluZW5vKToKKyAgICAgICAgIiIiQ2hlY2sgd2hldGhlciBzcGVjaWZpZWQgbGluZSBzZWVtcyB0byBiZSBleGVjdXRhYmxlLgorCisgICAgICAgIFJldHVybiBgbGluZW5vYCBpZiBpdCBpcywgMCBpZiBub3QgKGUuZy4gYSBkb2NzdHJpbmcsIGNvbW1lbnQsIGJsYW5rCisgICAgICAgIGxpbmUgb3IgRU9GKS4gV2FybmluZzogdGVzdGluZyBpcyBub3QgY29tcHJlaGVuc2l2ZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxhYmxlIGJlZm9yZSBzdGFydGluZyBkZWJ1Z2dpbmcsIHNvIGRlZmF1bHQKKyAgICAgICAgIyB0byAibm8gZ2xvYmFscyIgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBmcmFtZQorICAgICAgICBnbG9icyA9IHNlbGYuY3VyZnJhbWUuZl9nbG9iYWxzIGlmIGhhc2F0dHIoc2VsZiwgJ2N1cmZyYW1lJykgZWxzZSBOb25lCisgICAgICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vLCBnbG9icykKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnRW5kIG9mIGZpbGUnCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgICMgRG9uJ3QgYWxsb3cgc2V0dGluZyBicmVha3BvaW50IGF0IGEgYmxhbmsgbGluZQorICAgICAgICBpZiAobm90IGxpbmUgb3IgKGxpbmVbMF0gPT0gJyMnKSBvcgorICAgICAgICAgICAgIChsaW5lWzozXSA9PSAnIiIiJykgb3IgbGluZVs6M10gPT0gIicnJyIpOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBCbGFuayBvciBjb21tZW50JworICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgcmV0dXJuIGxpbmVubworCisgICAgZGVmIGRvX2VuYWJsZShzZWxmLCBhcmcpOgorICAgICAgICBhcmdzID0gYXJnLnNwbGl0KCkKKyAgICAgICAgZm9yIGkgaW4gYXJnczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpID0gaW50KGkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgYSBudW1iZXInICUgaQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIG5vdCAoMCA8PSBpIDwgbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpKToKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnTm8gYnJlYWtwb2ludCBudW1iZXJlZCcsIGkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBicCA9IGJkYi5CcmVha3BvaW50LmJwYnludW1iZXJbaV0KKyAgICAgICAgICAgIGlmIGJwOgorICAgICAgICAgICAgICAgIGJwLmVuYWJsZSgpCisKKyAgICBkZWYgZG9fZGlzYWJsZShzZWxmLCBhcmcpOgorICAgICAgICBhcmdzID0gYXJnLnNwbGl0KCkKKyAgICAgICAgZm9yIGkgaW4gYXJnczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpID0gaW50KGkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgYSBudW1iZXInICUgaQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIG5vdCAoMCA8PSBpIDwgbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpKToKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnTm8gYnJlYWtwb2ludCBudW1iZXJlZCcsIGkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBicCA9IGJkYi5CcmVha3BvaW50LmJwYnludW1iZXJbaV0KKyAgICAgICAgICAgIGlmIGJwOgorICAgICAgICAgICAgICAgIGJwLmRpc2FibGUoKQorCisgICAgZGVmIGRvX2NvbmRpdGlvbihzZWxmLCBhcmcpOgorICAgICAgICAjIGFyZyBpcyBicmVha3BvaW50IG51bWJlciBhbmQgY29uZGl0aW9uCisgICAgICAgIGFyZ3MgPSBhcmcuc3BsaXQoJyAnLCAxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBicG51bSA9IGludChhcmdzWzBdLnN0cmlwKCkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIyBzb21ldGhpbmcgd2VudCB3cm9uZworICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgXAorICAgICAgICAgICAgICAgICdCcmVha3BvaW50IGluZGV4ICVyIGlzIG5vdCBhIG51bWJlcicgJSBhcmdzWzBdCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uZCA9IGFyZ3NbMV0KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgY29uZCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnAgPSBiZGIuQnJlYWtwb2ludC5icGJ5bnVtYmVyW2JwbnVtXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICdCcmVha3BvaW50IGluZGV4ICVyIGlzIG5vdCB2YWxpZCcgJSBhcmdzWzBdCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgYnA6CisgICAgICAgICAgICBicC5jb25kID0gY29uZAorICAgICAgICAgICAgaWYgbm90IGNvbmQ6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJ0JyZWFrcG9pbnQnLCBicG51bSwKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnaXMgbm93IHVuY29uZGl0aW9uYWwuJworCisgICAgZGVmIGRvX2lnbm9yZShzZWxmLGFyZyk6CisgICAgICAgICIiImFyZyBpcyBicCBudW1iZXIgZm9sbG93ZWQgYnkgaWdub3JlIGNvdW50LiIiIgorICAgICAgICBhcmdzID0gYXJnLnNwbGl0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnBudW0gPSBpbnQoYXJnc1swXS5zdHJpcCgpKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICMgc29tZXRoaW5nIHdlbnQgd3JvbmcKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIFwKKyAgICAgICAgICAgICAgICAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgYSBudW1iZXInICUgYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvdW50ID0gaW50KGFyZ3NbMV0uc3RyaXAoKSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJwID0gYmRiLkJyZWFrcG9pbnQuYnBieW51bWJlclticG51bV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgdmFsaWQnICUgYXJnc1swXQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGJwOgorICAgICAgICAgICAgYnAuaWdub3JlID0gY291bnQKKyAgICAgICAgICAgIGlmIGNvdW50ID4gMDoKKyAgICAgICAgICAgICAgICByZXBseSA9ICdXaWxsIGlnbm9yZSBuZXh0ICcKKyAgICAgICAgICAgICAgICBpZiBjb3VudCA+IDE6CisgICAgICAgICAgICAgICAgICAgIHJlcGx5ID0gcmVwbHkgKyAnJWQgY3Jvc3NpbmdzJyAlIGNvdW50CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVwbHkgPSByZXBseSArICcxIGNyb3NzaW5nJworICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIHJlcGx5ICsgJyBvZiBicmVha3BvaW50ICVkLicgJSBicG51bQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnV2lsbCBzdG9wIG5leHQgdGltZSBicmVha3BvaW50JywKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCBicG51bSwgJ2lzIHJlYWNoZWQuJworCisgICAgZGVmIGRvX2NsZWFyKHNlbGYsIGFyZyk6CisgICAgICAgICIiIlRocmVlIHBvc3NpYmlsaXRpZXMsIHRyaWVkIGluIHRoaXMgb3JkZXI6CisgICAgICAgIGNsZWFyIC0+IGNsZWFyIGFsbCBicmVha3MsIGFzayBmb3IgY29uZmlybWF0aW9uCisgICAgICAgIGNsZWFyIGZpbGU6bGluZW5vIC0+IGNsZWFyIGFsbCBicmVha3MgYXQgZmlsZTpsaW5lbm8KKyAgICAgICAgY2xlYXIgYnBubyBicG5vIC4uLiAtPiBjbGVhciBicmVha3BvaW50cyBieSBudW1iZXIiIiIKKyAgICAgICAgaWYgbm90IGFyZzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXBseSA9IHJhd19pbnB1dCgnQ2xlYXIgYWxsIGJyZWFrcz8gJykKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICByZXBseSA9ICdubycKKyAgICAgICAgICAgIHJlcGx5ID0gcmVwbHkuc3RyaXAoKS5sb3dlcigpCisgICAgICAgICAgICBpZiByZXBseSBpbiAoJ3knLCAneWVzJyk6CisgICAgICAgICAgICAgICAgc2VsZi5jbGVhcl9hbGxfYnJlYWtzKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiAnOicgaW4gYXJnOgorICAgICAgICAgICAgIyBNYWtlIHN1cmUgaXQgd29ya3MgZm9yICJjbGVhciBDOlxmb29cYmFyLnB5OjEyIgorICAgICAgICAgICAgaSA9IGFyZy5yZmluZCgnOicpCisgICAgICAgICAgICBmaWxlbmFtZSA9IGFyZ1s6aV0KKyAgICAgICAgICAgIGFyZyA9IGFyZ1tpKzE6XQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmVubyA9IGludChhcmcpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBlcnIgPSAiSW52YWxpZCBsaW5lIG51bWJlciAoJXMpIiAlIGFyZworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlcnIgPSBzZWxmLmNsZWFyX2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICBpZiBlcnI6IHByaW50ID4+c2VsZi5zdGRvdXQsICcqKionLCBlcnIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBudW1iZXJsaXN0ID0gYXJnLnNwbGl0KCkKKyAgICAgICAgZm9yIGkgaW4gbnVtYmVybGlzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpID0gaW50KGkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnQnJlYWtwb2ludCBpbmRleCAlciBpcyBub3QgYSBudW1iZXInICUgaQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIG5vdCAoMCA8PSBpIDwgbGVuKGJkYi5CcmVha3BvaW50LmJwYnludW1iZXIpKToKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnTm8gYnJlYWtwb2ludCBudW1iZXJlZCcsIGkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZXJyID0gc2VsZi5jbGVhcl9icGJ5bnVtYmVyKGkpCisgICAgICAgICAgICBpZiBlcnI6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKicsIGVycgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnRGVsZXRlZCBicmVha3BvaW50JywgaQorICAgIGRvX2NsID0gZG9fY2xlYXIgIyAnYycgaXMgYWxyZWFkeSBhbiBhYmJyZXZpYXRpb24gZm9yICdjb250aW51ZScKKworICAgIGRlZiBkb193aGVyZShzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnByaW50X3N0YWNrX3RyYWNlKCkKKyAgICBkb193ID0gZG9fd2hlcmUKKyAgICBkb19idCA9IGRvX3doZXJlCisKKyAgICBkZWYgZG9fdXAoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgc2VsZi5jdXJpbmRleCA9PSAwOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBPbGRlc3QgZnJhbWUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmN1cmluZGV4ID0gc2VsZi5jdXJpbmRleCAtIDEKKyAgICAgICAgICAgIHNlbGYuY3VyZnJhbWUgPSBzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXhdWzBdCisgICAgICAgICAgICBzZWxmLmN1cmZyYW1lX2xvY2FscyA9IHNlbGYuY3VyZnJhbWUuZl9sb2NhbHMKKyAgICAgICAgICAgIHNlbGYucHJpbnRfc3RhY2tfZW50cnkoc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XSkKKyAgICAgICAgICAgIHNlbGYubGluZW5vID0gTm9uZQorICAgIGRvX3UgPSBkb191cAorCisgICAgZGVmIGRvX2Rvd24oc2VsZiwgYXJnKToKKyAgICAgICAgaWYgc2VsZi5jdXJpbmRleCArIDEgPT0gbGVuKHNlbGYuc3RhY2spOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBOZXdlc3QgZnJhbWUnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmN1cmluZGV4ID0gc2VsZi5jdXJpbmRleCArIDEKKyAgICAgICAgICAgIHNlbGYuY3VyZnJhbWUgPSBzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXhdWzBdCisgICAgICAgICAgICBzZWxmLmN1cmZyYW1lX2xvY2FscyA9IHNlbGYuY3VyZnJhbWUuZl9sb2NhbHMKKyAgICAgICAgICAgIHNlbGYucHJpbnRfc3RhY2tfZW50cnkoc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XSkKKyAgICAgICAgICAgIHNlbGYubGluZW5vID0gTm9uZQorICAgIGRvX2QgPSBkb19kb3duCisKKyAgICBkZWYgZG9fdW50aWwoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5zZXRfdW50aWwoc2VsZi5jdXJmcmFtZSkKKyAgICAgICAgcmV0dXJuIDEKKyAgICBkb191bnQgPSBkb191bnRpbAorCisgICAgZGVmIGRvX3N0ZXAoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5zZXRfc3RlcCgpCisgICAgICAgIHJldHVybiAxCisgICAgZG9fcyA9IGRvX3N0ZXAKKworICAgIGRlZiBkb19uZXh0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuc2V0X25leHQoc2VsZi5jdXJmcmFtZSkKKyAgICAgICAgcmV0dXJuIDEKKyAgICBkb19uID0gZG9fbmV4dAorCisgICAgZGVmIGRvX3J1bihzZWxmLCBhcmcpOgorICAgICAgICAiIiJSZXN0YXJ0IHByb2dyYW0gYnkgcmFpc2luZyBhbiBleGNlcHRpb24gdG8gYmUgY2F1Z2h0IGluIHRoZSBtYWluCisgICAgICAgIGRlYnVnZ2VyIGxvb3AuICBJZiBhcmd1bWVudHMgd2VyZSBnaXZlbiwgc2V0IHRoZW0gaW4gc3lzLmFyZ3YuIiIiCisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIGltcG9ydCBzaGxleAorICAgICAgICAgICAgYXJndjAgPSBzeXMuYXJndlswOjFdCisgICAgICAgICAgICBzeXMuYXJndiA9IHNobGV4LnNwbGl0KGFyZykKKyAgICAgICAgICAgIHN5cy5hcmd2WzowXSA9IGFyZ3YwCisgICAgICAgIHJhaXNlIFJlc3RhcnQKKworICAgIGRvX3Jlc3RhcnQgPSBkb19ydW4KKworICAgIGRlZiBkb19yZXR1cm4oc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5zZXRfcmV0dXJuKHNlbGYuY3VyZnJhbWUpCisgICAgICAgIHJldHVybiAxCisgICAgZG9fciA9IGRvX3JldHVybgorCisgICAgZGVmIGRvX2NvbnRpbnVlKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuc2V0X2NvbnRpbnVlKCkKKyAgICAgICAgcmV0dXJuIDEKKyAgICBkb19jID0gZG9fY29udCA9IGRvX2NvbnRpbnVlCisKKyAgICBkZWYgZG9fanVtcChzZWxmLCBhcmcpOgorICAgICAgICBpZiBzZWxmLmN1cmluZGV4ICsgMSAhPSBsZW4oc2VsZi5zdGFjayk6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiKioqIFlvdSBjYW4gb25seSBqdW1wIHdpdGhpbiB0aGUgYm90dG9tIGZyYW1lIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFyZyA9IGludChhcmcpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIioqKiBUaGUgJ2p1bXAnIGNvbW1hbmQgcmVxdWlyZXMgYSBsaW5lIG51bWJlci4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBEbyB0aGUganVtcCwgZml4IHVwIG91ciBjb3B5IG9mIHRoZSBzdGFjaywgYW5kIGRpc3BsYXkgdGhlCisgICAgICAgICAgICAgICAgIyBuZXcgcG9zaXRpb24KKyAgICAgICAgICAgICAgICBzZWxmLmN1cmZyYW1lLmZfbGluZW5vID0gYXJnCisgICAgICAgICAgICAgICAgc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XSA9IHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleF1bMF0sIGFyZworICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfc3RhY2tfZW50cnkoc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKiogSnVtcCBmYWlsZWQ6JywgZQorICAgIGRvX2ogPSBkb19qdW1wCisKKyAgICBkZWYgZG9fZGVidWcoc2VsZiwgYXJnKToKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgIGdsb2JhbHMgPSBzZWxmLmN1cmZyYW1lLmZfZ2xvYmFscworICAgICAgICBsb2NhbHMgPSBzZWxmLmN1cmZyYW1lX2xvY2FscworICAgICAgICBwID0gUGRiKHNlbGYuY29tcGxldGVrZXksIHNlbGYuc3RkaW4sIHNlbGYuc3Rkb3V0KQorICAgICAgICBwLnByb21wdCA9ICIoJXMpICIgJSBzZWxmLnByb21wdC5zdHJpcCgpCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICJFTlRFUklORyBSRUNVUlNJVkUgREVCVUdHRVIiCisgICAgICAgIHN5cy5jYWxsX3RyYWNpbmcocC5ydW4sIChhcmcsIGdsb2JhbHMsIGxvY2FscykpCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICJMRUFWSU5HIFJFQ1VSU0lWRSBERUJVR0dFUiIKKyAgICAgICAgc3lzLnNldHRyYWNlKHNlbGYudHJhY2VfZGlzcGF0Y2gpCisgICAgICAgIHNlbGYubGFzdGNtZCA9IHAubGFzdGNtZAorCisgICAgZGVmIGRvX3F1aXQoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5fdXNlcl9yZXF1ZXN0ZWRfcXVpdCA9IDEKKyAgICAgICAgc2VsZi5zZXRfcXVpdCgpCisgICAgICAgIHJldHVybiAxCisKKyAgICBkb19xID0gZG9fcXVpdAorICAgIGRvX2V4aXQgPSBkb19xdWl0CisKKyAgICBkZWYgZG9fRU9GKHNlbGYsIGFyZyk6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQKKyAgICAgICAgc2VsZi5fdXNlcl9yZXF1ZXN0ZWRfcXVpdCA9IDEKKyAgICAgICAgc2VsZi5zZXRfcXVpdCgpCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgZG9fYXJncyhzZWxmLCBhcmcpOgorICAgICAgICBjbyA9IHNlbGYuY3VyZnJhbWUuZl9jb2RlCisgICAgICAgIGRpY3QgPSBzZWxmLmN1cmZyYW1lX2xvY2FscworICAgICAgICBuID0gY28uY29fYXJnY291bnQKKyAgICAgICAgaWYgY28uY29fZmxhZ3MgJiA0OiBuID0gbisxCisgICAgICAgIGlmIGNvLmNvX2ZsYWdzICYgODogbiA9IG4rMQorICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgIG5hbWUgPSBjby5jb192YXJuYW1lc1tpXQorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgbmFtZSwgJz0nLAorICAgICAgICAgICAgaWYgbmFtZSBpbiBkaWN0OiBwcmludCA+PnNlbGYuc3Rkb3V0LCBkaWN0W25hbWVdCisgICAgICAgICAgICBlbHNlOiBwcmludCA+PnNlbGYuc3Rkb3V0LCAiKioqIHVuZGVmaW5lZCAqKioiCisgICAgZG9fYSA9IGRvX2FyZ3MKKworICAgIGRlZiBkb19yZXR2YWwoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgJ19fcmV0dXJuX18nIGluIHNlbGYuY3VyZnJhbWVfbG9jYWxzOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgc2VsZi5jdXJmcmFtZV9sb2NhbHNbJ19fcmV0dXJuX18nXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgJyoqKiBOb3QgeWV0IHJldHVybmVkIScKKyAgICBkb19ydiA9IGRvX3JldHZhbAorCisgICAgZGVmIF9nZXR2YWwoc2VsZiwgYXJnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGV2YWwoYXJnLCBzZWxmLmN1cmZyYW1lLmZfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyZnJhbWVfbG9jYWxzKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB0LCB2ID0gc3lzLmV4Y19pbmZvKClbOjJdCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHQsIHN0cik6CisgICAgICAgICAgICAgICAgZXhjX3R5cGVfbmFtZSA9IHQKKyAgICAgICAgICAgIGVsc2U6IGV4Y190eXBlX25hbWUgPSB0Ll9fbmFtZV9fCisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqJywgZXhjX3R5cGVfbmFtZSArICc6JywgcmVwcih2KQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBkb19wKHNlbGYsIGFyZyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIHJlcHIoc2VsZi5fZ2V0dmFsKGFyZykpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBkb19wcChzZWxmLCBhcmcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcHJpbnQucHByaW50KHNlbGYuX2dldHZhbChhcmcpLCBzZWxmLnN0ZG91dCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGRvX2xpc3Qoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5sYXN0Y21kID0gJ2xpc3QnCisgICAgICAgIGxhc3QgPSBOb25lCisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gZXZhbChhcmcsIHt9LCB7fSkKKyAgICAgICAgICAgICAgICBpZiB0eXBlKHgpID09IHR5cGUoKCkpOgorICAgICAgICAgICAgICAgICAgICBmaXJzdCwgbGFzdCA9IHgKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBpbnQoZmlyc3QpCisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBpbnQobGFzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGFzdCA8IGZpcnN0OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBBc3N1bWUgaXQncyBhIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gZmlyc3QgKyBsYXN0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBtYXgoMSwgaW50KHgpIC0gNSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIEVycm9yIGluIGFyZ3VtZW50OicsIHJlcHIoYXJnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHNlbGYubGluZW5vIGlzIE5vbmU6CisgICAgICAgICAgICBmaXJzdCA9IG1heCgxLCBzZWxmLmN1cmZyYW1lLmZfbGluZW5vIC0gNSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0ID0gc2VsZi5saW5lbm8gKyAxCisgICAgICAgIGlmIGxhc3QgaXMgTm9uZToKKyAgICAgICAgICAgIGxhc3QgPSBmaXJzdCArIDEwCisgICAgICAgIGZpbGVuYW1lID0gc2VsZi5jdXJmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgYnJlYWtsaXN0ID0gc2VsZi5nZXRfZmlsZV9icmVha3MoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBsaW5lbm8gaW4gcmFuZ2UoZmlyc3QsIGxhc3QrMSk6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyZnJhbWUuZl9nbG9iYWxzKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnW0VPRl0nCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcyA9IHJlcHIobGluZW5vKS5yanVzdCgzKQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4ocykgPCA0OiBzID0gcyArICcgJworICAgICAgICAgICAgICAgICAgICBpZiBsaW5lbm8gaW4gYnJlYWtsaXN0OiBzID0gcyArICdCJworICAgICAgICAgICAgICAgICAgICBlbHNlOiBzID0gcyArICcgJworICAgICAgICAgICAgICAgICAgICBpZiBsaW5lbm8gPT0gc2VsZi5jdXJmcmFtZS5mX2xpbmVubzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgJy0+JworICAgICAgICAgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCBzICsgJ1x0JyArIGxpbmUsCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICBkb19sID0gZG9fbGlzdAorCisgICAgZGVmIGRvX3doYXRpcyhzZWxmLCBhcmcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB2YWx1ZSA9IGV2YWwoYXJnLCBzZWxmLmN1cmZyYW1lLmZfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmN1cmZyYW1lX2xvY2FscykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdCwgdiA9IHN5cy5leGNfaW5mbygpWzoyXQorICAgICAgICAgICAgaWYgdHlwZSh0KSA9PSB0eXBlKCcnKToKKyAgICAgICAgICAgICAgICBleGNfdHlwZV9uYW1lID0gdAorICAgICAgICAgICAgZWxzZTogZXhjX3R5cGVfbmFtZSA9IHQuX19uYW1lX18KKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICcqKionLCBleGNfdHlwZV9uYW1lICsgJzonLCByZXByKHYpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY29kZSA9IE5vbmUKKyAgICAgICAgIyBJcyBpdCBhIGZ1bmN0aW9uPworICAgICAgICB0cnk6IGNvZGUgPSB2YWx1ZS5mdW5jX2NvZGUKKyAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGlmIGNvZGU6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnRnVuY3Rpb24nLCBjb2RlLmNvX25hbWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIElzIGl0IGFuIGluc3RhbmNlIG1ldGhvZD8KKyAgICAgICAgdHJ5OiBjb2RlID0gdmFsdWUuaW1fZnVuYy5mdW5jX2NvZGUKKyAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGlmIGNvZGU6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnTWV0aG9kJywgY29kZS5jb19uYW1lCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBOb25lIG9mIHRoZSBhYm92ZS4uLgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCB0eXBlKHZhbHVlKQorCisgICAgZGVmIGRvX2FsaWFzKHNlbGYsIGFyZyk6CisgICAgICAgIGFyZ3MgPSBhcmcuc3BsaXQoKQorICAgICAgICBpZiBsZW4oYXJncykgPT0gMDoKKyAgICAgICAgICAgIGtleXMgPSBzZWxmLmFsaWFzZXMua2V5cygpCisgICAgICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICAgICAgZm9yIGFsaWFzIGluIGtleXM6CisgICAgICAgICAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiVzID0gJXMiICUgKGFsaWFzLCBzZWxmLmFsaWFzZXNbYWxpYXNdKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGFyZ3NbMF0gaW4gc2VsZi5hbGlhc2VzIGFuZCBsZW4oYXJncykgPT0gMToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIlcyA9ICVzIiAlIChhcmdzWzBdLCBzZWxmLmFsaWFzZXNbYXJnc1swXV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFsaWFzZXNbYXJnc1swXV0gPSAnICcuam9pbihhcmdzWzE6XSkKKworICAgIGRlZiBkb191bmFsaWFzKHNlbGYsIGFyZyk6CisgICAgICAgIGFyZ3MgPSBhcmcuc3BsaXQoKQorICAgICAgICBpZiBsZW4oYXJncykgPT0gMDogcmV0dXJuCisgICAgICAgIGlmIGFyZ3NbMF0gaW4gc2VsZi5hbGlhc2VzOgorICAgICAgICAgICAgZGVsIHNlbGYuYWxpYXNlc1thcmdzWzBdXQorCisgICAgI2xpc3Qgb2YgYWxsIHRoZSBjb21tYW5kcyBtYWtpbmcgdGhlIHByb2dyYW0gcmVzdW1lIGV4ZWN1dGlvbi4KKyAgICBjb21tYW5kc19yZXN1bWluZyA9IFsnZG9fY29udGludWUnLCAnZG9fc3RlcCcsICdkb19uZXh0JywgJ2RvX3JldHVybicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2RvX3F1aXQnLCAnZG9fanVtcCddCisKKyAgICAjIFByaW50IGEgdHJhY2ViYWNrIHN0YXJ0aW5nIGF0IHRoZSB0b3Agc3RhY2sgZnJhbWUuCisgICAgIyBUaGUgbW9zdCByZWNlbnRseSBlbnRlcmVkIGZyYW1lIGlzIHByaW50ZWQgbGFzdDsKKyAgICAjIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gZGJ4IGFuZCBnZGIsIGJ1dCBjb25zaXN0ZW50IHdpdGgKKyAgICAjIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIncyBzdGFjayB0cmFjZS4KKyAgICAjIEl0IGlzIGFsc28gY29uc2lzdGVudCB3aXRoIHRoZSB1cC9kb3duIGNvbW1hbmRzICh3aGljaCBhcmUKKyAgICAjIGNvbXBhdGlibGUgd2l0aCBkYnggYW5kIGdkYjogdXAgbW92ZXMgdG93YXJkcyAnbWFpbigpJworICAgICMgYW5kIGRvd24gbW92ZXMgdG93YXJkcyB0aGUgbW9zdCByZWNlbnQgc3RhY2sgZnJhbWUpLgorCisgICAgZGVmIHByaW50X3N0YWNrX3RyYWNlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgZnJhbWVfbGluZW5vIGluIHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgc2VsZi5wcmludF9zdGFja19lbnRyeShmcmFtZV9saW5lbm8pCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBwcmludF9zdGFja19lbnRyeShzZWxmLCBmcmFtZV9saW5lbm8sIHByb21wdF9wcmVmaXg9bGluZV9wcmVmaXgpOgorICAgICAgICBmcmFtZSwgbGluZW5vID0gZnJhbWVfbGluZW5vCisgICAgICAgIGlmIGZyYW1lIGlzIHNlbGYuY3VyZnJhbWU6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnPicsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnICcsCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIHNlbGYuZm9ybWF0X3N0YWNrX2VudHJ5KGZyYW1lX2xpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbXB0X3ByZWZpeCkKKworCisgICAgIyBIZWxwIG1ldGhvZHMgKGRlcml2ZWQgZnJvbSBwZGIuZG9jKQorCisgICAgZGVmIGhlbHBfaGVscChzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX2goKQorCisgICAgZGVmIGhlbHBfaChzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiaChlbHApCitXaXRob3V0IGFyZ3VtZW50LCBwcmludCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMuCitXaXRoIGEgY29tbWFuZCBuYW1lIGFzIGFyZ3VtZW50LCBwcmludCBoZWxwIGFib3V0IHRoYXQgY29tbWFuZAorImhlbHAgcGRiIiBwaXBlcyB0aGUgZnVsbCBkb2N1bWVudGF0aW9uIGZpbGUgdG8gdGhlICRQQUdFUgorImhlbHAgZXhlYyIgZ2l2ZXMgaGVscCBvbiB0aGUgISBjb21tYW5kIiIiCisKKyAgICBkZWYgaGVscF93aGVyZShzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX3coKQorCisgICAgZGVmIGhlbHBfdyhzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIidyhoZXJlKQorUHJpbnQgYSBzdGFjayB0cmFjZSwgd2l0aCB0aGUgbW9zdCByZWNlbnQgZnJhbWUgYXQgdGhlIGJvdHRvbS4KK0FuIGFycm93IGluZGljYXRlcyB0aGUgImN1cnJlbnQgZnJhbWUiLCB3aGljaCBkZXRlcm1pbmVzIHRoZQorY29udGV4dCBvZiBtb3N0IGNvbW1hbmRzLiAgJ2J0JyBpcyBhbiBhbGlhcyBmb3IgdGhpcyBjb21tYW5kLiIiIgorCisgICAgaGVscF9idCA9IGhlbHBfdworCisgICAgZGVmIGhlbHBfZG93bihzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX2QoKQorCisgICAgZGVmIGhlbHBfZChzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiZChvd24pCitNb3ZlIHRoZSBjdXJyZW50IGZyYW1lIG9uZSBsZXZlbCBkb3duIGluIHRoZSBzdGFjayB0cmFjZQorKHRvIGEgbmV3ZXIgZnJhbWUpLiIiIgorCisgICAgZGVmIGhlbHBfdXAoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF91KCkKKworICAgIGRlZiBoZWxwX3Uoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInUocCkKK01vdmUgdGhlIGN1cnJlbnQgZnJhbWUgb25lIGxldmVsIHVwIGluIHRoZSBzdGFjayB0cmFjZQorKHRvIGFuIG9sZGVyIGZyYW1lKS4iIiIKKworICAgIGRlZiBoZWxwX2JyZWFrKHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfYigpCisKKyAgICBkZWYgaGVscF9iKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJiKHJlYWspIChbZmlsZTpdbGluZW5vIHwgZnVuY3Rpb24pIFssIGNvbmRpdGlvbl0KK1dpdGggYSBsaW5lIG51bWJlciBhcmd1bWVudCwgc2V0IGEgYnJlYWsgdGhlcmUgaW4gdGhlIGN1cnJlbnQKK2ZpbGUuICBXaXRoIGEgZnVuY3Rpb24gbmFtZSwgc2V0IGEgYnJlYWsgYXQgZmlyc3QgZXhlY3V0YWJsZSBsaW5lCitvZiB0aGF0IGZ1bmN0aW9uLiAgV2l0aG91dCBhcmd1bWVudCwgbGlzdCBhbGwgYnJlYWtzLiAgSWYgYSBzZWNvbmQKK2FyZ3VtZW50IGlzIHByZXNlbnQsIGl0IGlzIGEgc3RyaW5nIHNwZWNpZnlpbmcgYW4gZXhwcmVzc2lvbgord2hpY2ggbXVzdCBldmFsdWF0ZSB0byB0cnVlIGJlZm9yZSB0aGUgYnJlYWtwb2ludCBpcyBob25vcmVkLgorCitUaGUgbGluZSBudW1iZXIgbWF5IGJlIHByZWZpeGVkIHdpdGggYSBmaWxlbmFtZSBhbmQgYSBjb2xvbiwKK3RvIHNwZWNpZnkgYSBicmVha3BvaW50IGluIGFub3RoZXIgZmlsZSAocHJvYmFibHkgb25lIHRoYXQKK2hhc24ndCBiZWVuIGxvYWRlZCB5ZXQpLiAgVGhlIGZpbGUgaXMgc2VhcmNoZWQgZm9yIG9uIHN5cy5wYXRoOwordGhlIC5weSBzdWZmaXggbWF5IGJlIG9taXR0ZWQuIiIiCisKKyAgICBkZWYgaGVscF9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX2NsKCkKKworICAgIGRlZiBoZWxwX2NsKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiY2woZWFyKSBmaWxlbmFtZTpsaW5lbm8iCisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImNsKGVhcikgW2JwbnVtYmVyIFticG51bWJlci4uLl1dCitXaXRoIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YgYnJlYWtwb2ludCBudW1iZXJzLCBjbGVhcgordGhvc2UgYnJlYWtwb2ludHMuICBXaXRob3V0IGFyZ3VtZW50LCBjbGVhciBhbGwgYnJlYWtzIChidXQKK2ZpcnN0IGFzayBjb25maXJtYXRpb24pLiAgV2l0aCBhIGZpbGVuYW1lOmxpbmVubyBhcmd1bWVudCwKK2NsZWFyIGFsbCBicmVha3MgYXQgdGhhdCBsaW5lIGluIHRoYXQgZmlsZS4KKworTm90ZSB0aGF0IHRoZSBhcmd1bWVudCBpcyBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyB2ZXJzaW9ucyBvZgordGhlIGRlYnVnZ2VyIChpbiBweXRob24gZGlzdHJpYnV0aW9ucyAxLjUuMSBhbmQgYmVmb3JlKSB3aGVyZQorYSBsaW5lbnVtYmVyIHdhcyB1c2VkIGluc3RlYWQgb2YgZWl0aGVyIGZpbGVuYW1lOmxpbmVubyBvcgorYnJlYWtwb2ludCBudW1iZXJzLiIiIgorCisgICAgZGVmIGhlbHBfdGJyZWFrKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJ0YnJlYWsgIHNhbWUgYXJndW1lbnRzIGFzIGJyZWFrLCBidXQgYnJlYWtwb2ludAoraXMgcmVtb3ZlZCB3aGVuIGZpcnN0IGhpdC4iIiIKKworICAgIGRlZiBoZWxwX2VuYWJsZShzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiZW5hYmxlIGJwbnVtYmVyIFticG51bWJlciAuLi5dCitFbmFibGVzIHRoZSBicmVha3BvaW50cyBnaXZlbiBhcyBhIHNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mCiticCBudW1iZXJzLiIiIgorCisgICAgZGVmIGhlbHBfZGlzYWJsZShzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiZGlzYWJsZSBicG51bWJlciBbYnBudW1iZXIgLi4uXQorRGlzYWJsZXMgdGhlIGJyZWFrcG9pbnRzIGdpdmVuIGFzIGEgc3BhY2Ugc2VwYXJhdGVkIGxpc3Qgb2YKK2JwIG51bWJlcnMuIiIiCisKKyAgICBkZWYgaGVscF9pZ25vcmUoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImlnbm9yZSBicG51bWJlciBjb3VudAorU2V0cyB0aGUgaWdub3JlIGNvdW50IGZvciB0aGUgZ2l2ZW4gYnJlYWtwb2ludCBudW1iZXIuICBBIGJyZWFrcG9pbnQKK2JlY29tZXMgYWN0aXZlIHdoZW4gdGhlIGlnbm9yZSBjb3VudCBpcyB6ZXJvLiAgV2hlbiBub24temVybywgdGhlCitjb3VudCBpcyBkZWNyZW1lbnRlZCBlYWNoIHRpbWUgdGhlIGJyZWFrcG9pbnQgaXMgcmVhY2hlZCBhbmQgdGhlCiticmVha3BvaW50IGlzIG5vdCBkaXNhYmxlZCBhbmQgYW55IGFzc29jaWF0ZWQgY29uZGl0aW9uIGV2YWx1YXRlcwordG8gdHJ1ZS4iIiIKKworICAgIGRlZiBoZWxwX2NvbmRpdGlvbihzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiY29uZGl0aW9uIGJwbnVtYmVyIHN0cl9jb25kaXRpb24KK3N0cl9jb25kaXRpb24gaXMgYSBzdHJpbmcgc3BlY2lmeWluZyBhbiBleHByZXNzaW9uIHdoaWNoCittdXN0IGV2YWx1YXRlIHRvIHRydWUgYmVmb3JlIHRoZSBicmVha3BvaW50IGlzIGhvbm9yZWQuCitJZiBzdHJfY29uZGl0aW9uIGlzIGFic2VudCwgYW55IGV4aXN0aW5nIGNvbmRpdGlvbiBpcyByZW1vdmVkOworaS5lLiwgdGhlIGJyZWFrcG9pbnQgaXMgbWFkZSB1bmNvbmRpdGlvbmFsLiIiIgorCisgICAgZGVmIGhlbHBfc3RlcChzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX3MoKQorCisgICAgZGVmIGhlbHBfcyhzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIicyh0ZXApCitFeGVjdXRlIHRoZSBjdXJyZW50IGxpbmUsIHN0b3AgYXQgdGhlIGZpcnN0IHBvc3NpYmxlIG9jY2FzaW9uCisoZWl0aGVyIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgb3IgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24pLiIiIgorCisgICAgZGVmIGhlbHBfdW50aWwoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF91bnQoKQorCisgICAgZGVmIGhlbHBfdW50KHNlbGYpOgorICAgICAgICBwcmludCAiIiJ1bnQoaWwpCitDb250aW51ZSBleGVjdXRpb24gdW50aWwgdGhlIGxpbmUgd2l0aCBhIG51bWJlciBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQKK29uZSBpcyByZWFjaGVkIG9yIHVudGlsIHRoZSBjdXJyZW50IGZyYW1lIHJldHVybnMiIiIKKworICAgIGRlZiBoZWxwX25leHQoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9uKCkKKworICAgIGRlZiBoZWxwX24oc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiIm4oZXh0KQorQ29udGludWUgZXhlY3V0aW9uIHVudGlsIHRoZSBuZXh0IGxpbmUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24KK2lzIHJlYWNoZWQgb3IgaXQgcmV0dXJucy4iIiIKKworICAgIGRlZiBoZWxwX3JldHVybihzZWxmKToKKyAgICAgICAgc2VsZi5oZWxwX3IoKQorCisgICAgZGVmIGhlbHBfcihzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIicihldHVybikKK0NvbnRpbnVlIGV4ZWN1dGlvbiB1bnRpbCB0aGUgY3VycmVudCBmdW5jdGlvbiByZXR1cm5zLiIiIgorCisgICAgZGVmIGhlbHBfY29udGludWUoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9jKCkKKworICAgIGRlZiBoZWxwX2NvbnQoc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9jKCkKKworICAgIGRlZiBoZWxwX2Moc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImMob250KGludWUpKQorQ29udGludWUgZXhlY3V0aW9uLCBvbmx5IHN0b3Agd2hlbiBhIGJyZWFrcG9pbnQgaXMgZW5jb3VudGVyZWQuIiIiCisKKyAgICBkZWYgaGVscF9qdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfaigpCisKKyAgICBkZWYgaGVscF9qKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJqKHVtcCkgbGluZW5vCitTZXQgdGhlIG5leHQgbGluZSB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuIiIiCisKKyAgICBkZWYgaGVscF9kZWJ1ZyhzZWxmKToKKyAgICAgICAgcHJpbnQgPj5zZWxmLnN0ZG91dCwgIiIiZGVidWcgY29kZQorRW50ZXIgYSByZWN1cnNpdmUgZGVidWdnZXIgdGhhdCBzdGVwcyB0aHJvdWdoIHRoZSBjb2RlIGFyZ3VtZW50Cisod2hpY2ggaXMgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gb3Igc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkCitpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCkuIiIiCisKKyAgICBkZWYgaGVscF9saXN0KHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfbCgpCisKKyAgICBkZWYgaGVscF9sKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJsKGlzdCkgW2ZpcnN0IFssbGFzdF1dCitMaXN0IHNvdXJjZSBjb2RlIGZvciB0aGUgY3VycmVudCBmaWxlLgorV2l0aG91dCBhcmd1bWVudHMsIGxpc3QgMTEgbGluZXMgYXJvdW5kIHRoZSBjdXJyZW50IGxpbmUKK29yIGNvbnRpbnVlIHRoZSBwcmV2aW91cyBsaXN0aW5nLgorV2l0aCBvbmUgYXJndW1lbnQsIGxpc3QgMTEgbGluZXMgc3RhcnRpbmcgYXQgdGhhdCBsaW5lLgorV2l0aCB0d28gYXJndW1lbnRzLCBsaXN0IHRoZSBnaXZlbiByYW5nZTsKK2lmIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHRoZSBmaXJzdCwgaXQgaXMgYSBjb3VudC4iIiIKKworICAgIGRlZiBoZWxwX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuaGVscF9hKCkKKworICAgIGRlZiBoZWxwX2Eoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImEocmdzKQorUHJpbnQgdGhlIGFyZ3VtZW50cyBvZiB0aGUgY3VycmVudCBmdW5jdGlvbi4iIiIKKworICAgIGRlZiBoZWxwX3Aoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInAgZXhwcmVzc2lvbgorUHJpbnQgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiIiIgorCisgICAgZGVmIGhlbHBfcHAoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInBwIGV4cHJlc3Npb24KK1ByZXR0eS1wcmludCB0aGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uIiIiCisKKyAgICBkZWYgaGVscF9leGVjKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiIoISkgc3RhdGVtZW50CitFeGVjdXRlIHRoZSAob25lLWxpbmUpIHN0YXRlbWVudCBpbiB0aGUgY29udGV4dCBvZgordGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuCitUaGUgZXhjbGFtYXRpb24gcG9pbnQgY2FuIGJlIG9taXR0ZWQgdW5sZXNzIHRoZSBmaXJzdCB3b3JkCitvZiB0aGUgc3RhdGVtZW50IHJlc2VtYmxlcyBhIGRlYnVnZ2VyIGNvbW1hbmQuCitUbyBhc3NpZ24gdG8gYSBnbG9iYWwgdmFyaWFibGUgeW91IG11c3QgYWx3YXlzIHByZWZpeCB0aGUKK2NvbW1hbmQgd2l0aCBhICdnbG9iYWwnIGNvbW1hbmQsIGUuZy46CisoUGRiKSBnbG9iYWwgbGlzdF9vcHRpb25zOyBsaXN0X29wdGlvbnMgPSBbJy1sJ10KKyhQZGIpIiIiCisKKyAgICBkZWYgaGVscF9ydW4oc2VsZik6CisgICAgICAgIHByaW50ICIiInJ1biBbYXJncy4uLl0KK1Jlc3RhcnQgdGhlIGRlYnVnZ2VkIHB5dGhvbiBwcm9ncmFtLiBJZiBhIHN0cmluZyBpcyBzdXBwbGllZCwgaXQgaXMKK3NwbGl0dGVkIHdpdGggInNobGV4IiBhbmQgdGhlIHJlc3VsdCBpcyB1c2VkIGFzIHRoZSBuZXcgc3lzLmFyZ3YuCitIaXN0b3J5LCBicmVha3BvaW50cywgYWN0aW9ucyBhbmQgZGVidWdnZXIgb3B0aW9ucyBhcmUgcHJlc2VydmVkLgorInJlc3RhcnQiIGlzIGFuIGFsaWFzIGZvciAicnVuIi4iIiIKKworICAgIGhlbHBfcmVzdGFydCA9IGhlbHBfcnVuCisKKyAgICBkZWYgaGVscF9xdWl0KHNlbGYpOgorICAgICAgICBzZWxmLmhlbHBfcSgpCisKKyAgICBkZWYgaGVscF9xKHNlbGYpOgorICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAiIiJxKHVpdCkgb3IgZXhpdCAtIFF1aXQgZnJvbSB0aGUgZGVidWdnZXIuCitUaGUgcHJvZ3JhbSBiZWluZyBleGVjdXRlZCBpcyBhYm9ydGVkLiIiIgorCisgICAgaGVscF9leGl0ID0gaGVscF9xCisKKyAgICBkZWYgaGVscF93aGF0aXMoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiIndoYXRpcyBhcmcKK1ByaW50cyB0aGUgdHlwZSBvZiB0aGUgYXJndW1lbnQuIiIiCisKKyAgICBkZWYgaGVscF9FT0Yoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiIkVPRgorSGFuZGxlcyB0aGUgcmVjZWlwdCBvZiBFT0YgYXMgYSBjb21tYW5kLiIiIgorCisgICAgZGVmIGhlbHBfYWxpYXMoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImFsaWFzIFtuYW1lIFtjb21tYW5kIFtwYXJhbWV0ZXIgcGFyYW1ldGVyIC4uLl1dXQorQ3JlYXRlcyBhbiBhbGlhcyBjYWxsZWQgJ25hbWUnIHRoZSBleGVjdXRlcyAnY29tbWFuZCcuICBUaGUgY29tbWFuZAorbXVzdCAqbm90KiBiZSBlbmNsb3NlZCBpbiBxdW90ZXMuICBSZXBsYWNlYWJsZSBwYXJhbWV0ZXJzIGFyZQoraW5kaWNhdGVkIGJ5ICUxLCAlMiwgYW5kIHNvIG9uLCB3aGlsZSAlKiBpcyByZXBsYWNlZCBieSBhbGwgdGhlCitwYXJhbWV0ZXJzLiAgSWYgbm8gY29tbWFuZCBpcyBnaXZlbiwgdGhlIGN1cnJlbnQgYWxpYXMgZm9yIG5hbWUKK2lzIHNob3duLiBJZiBubyBuYW1lIGlzIGdpdmVuLCBhbGwgYWxpYXNlcyBhcmUgbGlzdGVkLgorCitBbGlhc2VzIG1heSBiZSBuZXN0ZWQgYW5kIGNhbiBjb250YWluIGFueXRoaW5nIHRoYXQgY2FuIGJlCitsZWdhbGx5IHR5cGVkIGF0IHRoZSBwZGIgcHJvbXB0LiAgTm90ZSEgIFlvdSAqY2FuKiBvdmVycmlkZQoraW50ZXJuYWwgcGRiIGNvbW1hbmRzIHdpdGggYWxpYXNlcyEgIFRob3NlIGludGVybmFsIGNvbW1hbmRzCithcmUgdGhlbiBoaWRkZW4gdW50aWwgdGhlIGFsaWFzIGlzIHJlbW92ZWQuICBBbGlhc2luZyBpcyByZWN1cnNpdmVseQorYXBwbGllZCB0byB0aGUgZmlyc3Qgd29yZCBvZiB0aGUgY29tbWFuZCBsaW5lOyBhbGwgb3RoZXIgd29yZHMKK2luIHRoZSBsaW5lIGFyZSBsZWZ0IGFsb25lLgorCitTb21lIHVzZWZ1bCBhbGlhc2VzIChlc3BlY2lhbGx5IHdoZW4gcGxhY2VkIGluIHRoZSAucGRicmMgZmlsZSkgYXJlOgorCisjUHJpbnQgaW5zdGFuY2UgdmFyaWFibGVzICh1c2FnZSAicGkgY2xhc3NJbnN0IikKK2FsaWFzIHBpIGZvciBrIGluICUxLl9fZGljdF9fLmtleXMoKTogcHJpbnQgIiUxLiIsaywiPSIsJTEuX19kaWN0X19ba10KKworI1ByaW50IGluc3RhbmNlIHZhcmlhYmxlcyBpbiBzZWxmCithbGlhcyBwcyBwaSBzZWxmCisiIiIKKworICAgIGRlZiBoZWxwX3VuYWxpYXMoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiInVuYWxpYXMgbmFtZQorRGVsZXRlcyB0aGUgc3BlY2lmaWVkIGFsaWFzLiIiIgorCisgICAgZGVmIGhlbHBfY29tbWFuZHMoc2VsZik6CisgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsICIiImNvbW1hbmRzIFticG51bWJlcl0KKyhjb20pIC4uLgorKGNvbSkgZW5kCisoUGRiKQorCitTcGVjaWZ5IGEgbGlzdCBvZiBjb21tYW5kcyBmb3IgYnJlYWtwb2ludCBudW1iZXIgYnBudW1iZXIuICBUaGUKK2NvbW1hbmRzIHRoZW1zZWx2ZXMgYXBwZWFyIG9uIHRoZSBmb2xsb3dpbmcgbGluZXMuICBUeXBlIGEgbGluZQorY29udGFpbmluZyBqdXN0ICdlbmQnIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZHMuCisKK1RvIHJlbW92ZSBhbGwgY29tbWFuZHMgZnJvbSBhIGJyZWFrcG9pbnQsIHR5cGUgY29tbWFuZHMgYW5kCitmb2xsb3cgaXQgaW1tZWRpYXRlbHkgd2l0aCAgZW5kOyB0aGF0IGlzLCBnaXZlIG5vIGNvbW1hbmRzLgorCitXaXRoIG5vIGJwbnVtYmVyIGFyZ3VtZW50LCBjb21tYW5kcyByZWZlcnMgdG8gdGhlIGxhc3QKK2JyZWFrcG9pbnQgc2V0LgorCitZb3UgY2FuIHVzZSBicmVha3BvaW50IGNvbW1hbmRzIHRvIHN0YXJ0IHlvdXIgcHJvZ3JhbSB1cCBhZ2Fpbi4KK1NpbXBseSB1c2UgdGhlIGNvbnRpbnVlIGNvbW1hbmQsIG9yIHN0ZXAsIG9yIGFueSBvdGhlcgorY29tbWFuZCB0aGF0IHJlc3VtZXMgZXhlY3V0aW9uLgorCitTcGVjaWZ5aW5nIGFueSBjb21tYW5kIHJlc3VtaW5nIGV4ZWN1dGlvbiAoY3VycmVudGx5IGNvbnRpbnVlLAorc3RlcCwgbmV4dCwgcmV0dXJuLCBqdW1wLCBxdWl0IGFuZCB0aGVpciBhYmJyZXZpYXRpb25zKSB0ZXJtaW5hdGVzCit0aGUgY29tbWFuZCBsaXN0IChhcyBpZiB0aGF0IGNvbW1hbmQgd2FzIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGVuZCkuCitUaGlzIGlzIGJlY2F1c2UgYW55IHRpbWUgeW91IHJlc3VtZSBleGVjdXRpb24KKyhldmVuIHdpdGggYSBzaW1wbGUgbmV4dCBvciBzdGVwKSwgeW91IG1heSBlbmNvdW50ZXIKK2Fub3RoZXIgYnJlYWtwb2ludC0td2hpY2ggY291bGQgaGF2ZSBpdHMgb3duIGNvbW1hbmQgbGlzdCwgbGVhZGluZyB0bworYW1iaWd1aXRpZXMgYWJvdXQgd2hpY2ggbGlzdCB0byBleGVjdXRlLgorCisgICBJZiB5b3UgdXNlIHRoZSAnc2lsZW50JyBjb21tYW5kIGluIHRoZSBjb21tYW5kIGxpc3QsIHRoZQordXN1YWwgbWVzc2FnZSBhYm91dCBzdG9wcGluZyBhdCBhIGJyZWFrcG9pbnQgaXMgbm90IHByaW50ZWQuICBUaGlzIG1heQorYmUgZGVzaXJhYmxlIGZvciBicmVha3BvaW50cyB0aGF0IGFyZSB0byBwcmludCBhIHNwZWNpZmljIG1lc3NhZ2UgYW5kCit0aGVuIGNvbnRpbnVlLiAgSWYgbm9uZSBvZiB0aGUgb3RoZXIgY29tbWFuZHMgcHJpbnQgYW55dGhpbmcsIHlvdQorc2VlIG5vIHNpZ24gdGhhdCB0aGUgYnJlYWtwb2ludCB3YXMgcmVhY2hlZC4KKyIiIgorCisgICAgZGVmIGhlbHBfcGRiKHNlbGYpOgorICAgICAgICBoZWxwKCkKKworICAgIGRlZiBsb29rdXBtb2R1bGUoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAiIiJIZWxwZXIgZnVuY3Rpb24gZm9yIGJyZWFrL2NsZWFyIHBhcnNpbmcgLS0gbWF5IGJlIG92ZXJyaWRkZW4uCisKKyAgICAgICAgbG9va3VwbW9kdWxlKCkgdHJhbnNsYXRlcyAocG9zc2libHkgaW5jb21wbGV0ZSkgZmlsZSBvciBtb2R1bGUgbmFtZQorICAgICAgICBpbnRvIGFuIGFic29sdXRlIGZpbGUgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG9zLnBhdGguaXNhYnMoZmlsZW5hbWUpIGFuZCAgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCisgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oc3lzLnBhdGhbMF0sIGZpbGVuYW1lKQorICAgICAgICBpZiAgb3MucGF0aC5leGlzdHMoZikgYW5kIHNlbGYuY2Fub25pYyhmKSA9PSBzZWxmLm1haW5weWZpbGU6CisgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICByb290LCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICBpZiBleHQgPT0gJyc6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgJy5weScKKyAgICAgICAgaWYgb3MucGF0aC5pc2FicyhmaWxlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKyAgICAgICAgZm9yIGRpcm5hbWUgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICB3aGlsZSBvcy5wYXRoLmlzbGluayhkaXJuYW1lKToKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucmVhZGxpbmsoZGlybmFtZSkKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBmdWxsbmFtZQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9ydW5zY3JpcHQoc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICAjIFRoZSBzY3JpcHQgaGFzIHRvIHJ1biBpbiBfX21haW5fXyBuYW1lc3BhY2UgKG9yIGltcG9ydHMgZnJvbQorICAgICAgICAjIF9fbWFpbl9fIHdpbGwgYnJlYWspLgorICAgICAgICAjCisgICAgICAgICMgU28gd2UgY2xlYXIgdXAgdGhlIF9fbWFpbl9fIGFuZCBzZXQgc2V2ZXJhbCBzcGVjaWFsIHZhcmlhYmxlcworICAgICAgICAjICh0aGlzIGdldHMgcmlkIG9mIHBkYidzIGdsb2JhbHMgYW5kIGNsZWFucyBvbGQgdmFyaWFibGVzIG9uIHJlc3RhcnRzKS4KKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIF9fbWFpbl9fLl9fZGljdF9fLmNsZWFyKCkKKyAgICAgICAgX19tYWluX18uX19kaWN0X18udXBkYXRlKHsiX19uYW1lX18iICAgIDogIl9fbWFpbl9fIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19maWxlX18iICAgIDogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fYnVpbHRpbnNfXyI6IF9fYnVpbHRpbnNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgIyBXaGVuIGJkYiBzZXRzIHRyYWNpbmcsIGEgbnVtYmVyIG9mIGNhbGwgYW5kIGxpbmUgZXZlbnRzIGhhcHBlbnMKKyAgICAgICAgIyBCRUZPUkUgZGVidWdnZXIgZXZlbiByZWFjaGVzIHVzZXIncyBjb2RlIChhbmQgdGhlIGV4YWN0IHNlcXVlbmNlIG9mCisgICAgICAgICMgZXZlbnRzIGRlcGVuZHMgb24gcHl0aG9uIHZlcnNpb24pLiBTbyB3ZSB0YWtlIHNwZWNpYWwgbWVhc3VyZXMgdG8KKyAgICAgICAgIyBhdm9pZCBzdG9wcGluZyBiZWZvcmUgd2UgcmVhY2ggdGhlIG1haW4gc2NyaXB0IChzZWUgdXNlcl9saW5lIGFuZAorICAgICAgICAjIHVzZXJfY2FsbCBmb3IgZGV0YWlscykuCisgICAgICAgIHNlbGYuX3dhaXRfZm9yX21haW5weWZpbGUgPSAxCisgICAgICAgIHNlbGYubWFpbnB5ZmlsZSA9IHNlbGYuY2Fub25pYyhmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5fdXNlcl9yZXF1ZXN0ZWRfcXVpdCA9IDAKKyAgICAgICAgc3RhdGVtZW50ID0gJ2V4ZWNmaWxlKCVyKScgJSBmaWxlbmFtZQorICAgICAgICBzZWxmLnJ1bihzdGF0ZW1lbnQpCisKKyMgU2ltcGxpZmllZCBpbnRlcmZhY2UKKworZGVmIHJ1bihzdGF0ZW1lbnQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpOgorICAgIFBkYigpLnJ1bihzdGF0ZW1lbnQsIGdsb2JhbHMsIGxvY2FscykKKworZGVmIHJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSk6CisgICAgcmV0dXJuIFBkYigpLnJ1bmV2YWwoZXhwcmVzc2lvbiwgZ2xvYmFscywgbG9jYWxzKQorCitkZWYgcnVuY3R4KHN0YXRlbWVudCwgZ2xvYmFscywgbG9jYWxzKToKKyAgICAjIEIvVyBjb21wYXRpYmlsaXR5CisgICAgcnVuKHN0YXRlbWVudCwgZ2xvYmFscywgbG9jYWxzKQorCitkZWYgcnVuY2FsbCgqYXJncywgKiprd2RzKToKKyAgICByZXR1cm4gUGRiKCkucnVuY2FsbCgqYXJncywgKiprd2RzKQorCitkZWYgc2V0X3RyYWNlKCk6CisgICAgUGRiKCkuc2V0X3RyYWNlKHN5cy5fZ2V0ZnJhbWUoKS5mX2JhY2spCisKKyMgUG9zdC1Nb3J0ZW0gaW50ZXJmYWNlCisKK2RlZiBwb3N0X21vcnRlbSh0PU5vbmUpOgorICAgICMgaGFuZGxpbmcgdGhlIGRlZmF1bHQKKyAgICBpZiB0IGlzIE5vbmU6CisgICAgICAgICMgc3lzLmV4Y19pbmZvKCkgcmV0dXJucyAodHlwZSwgdmFsdWUsIHRyYWNlYmFjaykgaWYgYW4gZXhjZXB0aW9uIGlzCisgICAgICAgICMgYmVpbmcgaGFuZGxlZCwgb3RoZXJ3aXNlIGl0IHJldHVybnMgTm9uZQorICAgICAgICB0ID0gc3lzLmV4Y19pbmZvKClbMl0KKyAgICAgICAgaWYgdCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQSB2YWxpZCB0cmFjZWJhY2sgbXVzdCBiZSBwYXNzZWQgaWYgbm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIGlzIGJlaW5nIGhhbmRsZWQiKQorCisgICAgcCA9IFBkYigpCisgICAgcC5yZXNldCgpCisgICAgcC5pbnRlcmFjdGlvbihOb25lLCB0KQorCitkZWYgcG0oKToKKyAgICBwb3N0X21vcnRlbShzeXMubGFzdF90cmFjZWJhY2spCisKKworIyBNYWluIHByb2dyYW0gZm9yIHRlc3RpbmcKKworVEVTVENNRCA9ICdpbXBvcnQgeDsgeC5tYWluKCknCisKK2RlZiB0ZXN0KCk6CisgICAgcnVuKFRFU1RDTUQpCisKKyMgcHJpbnQgaGVscAorZGVmIGhlbHAoKToKKyAgICBmb3IgZGlybmFtZSBpbiBzeXMucGF0aDoKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ3BkYi5kb2MnKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmdWxsbmFtZSk6CisgICAgICAgICAgICBzdHMgPSBvcy5zeXN0ZW0oJyR7UEFHRVItbW9yZX0gJytmdWxsbmFtZSkKKyAgICAgICAgICAgIGlmIHN0czogcHJpbnQgJyoqKiBQYWdlciBleGl0IHN0YXR1czonLCBzdHMKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgJ1NvcnJ5LCBjYW5cJ3QgZmluZCB0aGUgaGVscCBmaWxlICJwZGIuZG9jIicsCisgICAgICAgIHByaW50ICdhbG9uZyB0aGUgUHl0aG9uIHNlYXJjaCBwYXRoJworCitkZWYgbWFpbigpOgorICAgIGlmIG5vdCBzeXMuYXJndlsxOl0gb3Igc3lzLmFyZ3ZbMV0gaW4gKCItLWhlbHAiLCAiLWgiKToKKyAgICAgICAgcHJpbnQgInVzYWdlOiBwZGIucHkgc2NyaXB0ZmlsZSBbYXJnXSAuLi4iCisgICAgICAgIHN5cy5leGl0KDIpCisKKyAgICBtYWlucHlmaWxlID0gIHN5cy5hcmd2WzFdICAgICAjIEdldCBzY3JpcHQgZmlsZW5hbWUKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobWFpbnB5ZmlsZSk6CisgICAgICAgIHByaW50ICdFcnJvcjonLCBtYWlucHlmaWxlLCAnZG9lcyBub3QgZXhpc3QnCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBkZWwgc3lzLmFyZ3ZbMF0gICAgICAgICAjIEhpZGUgInBkYi5weSIgZnJvbSBhcmd1bWVudCBsaXN0CisKKyAgICAjIFJlcGxhY2UgcGRiJ3MgZGlyIHdpdGggc2NyaXB0J3MgZGlyIGluIGZyb250IG9mIG1vZHVsZSBzZWFyY2ggcGF0aC4KKyAgICBzeXMucGF0aFswXSA9IG9zLnBhdGguZGlybmFtZShtYWlucHlmaWxlKQorCisgICAgIyBOb3RlIG9uIHNhdmluZy9yZXN0b3Jpbmcgc3lzLmFyZ3Y6IGl0J3MgYSBnb29kIGlkZWEgd2hlbiBzeXMuYXJndiB3YXMKKyAgICAjIG1vZGlmaWVkIGJ5IHRoZSBzY3JpcHQgYmVpbmcgZGVidWdnZWQuIEl0J3MgYSBiYWQgaWRlYSB3aGVuIGl0IHdhcworICAgICMgY2hhbmdlZCBieSB0aGUgdXNlciBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFRoZXJlIGlzIGEgInJlc3RhcnQiIGNvbW1hbmQKKyAgICAjIHdoaWNoIGFsbG93cyBleHBsaWNpdCBzcGVjaWZpY2F0aW9uIG9mIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisgICAgcGRiID0gUGRiKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwZGIuX3J1bnNjcmlwdChtYWlucHlmaWxlKQorICAgICAgICAgICAgaWYgcGRiLl91c2VyX3JlcXVlc3RlZF9xdWl0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBwcmludCAiVGhlIHByb2dyYW0gZmluaXNoZWQgYW5kIHdpbGwgYmUgcmVzdGFydGVkIgorICAgICAgICBleGNlcHQgUmVzdGFydDoKKyAgICAgICAgICAgIHByaW50ICJSZXN0YXJ0aW5nIiwgbWFpbnB5ZmlsZSwgIndpdGggYXJndW1lbnRzOiIKKyAgICAgICAgICAgIHByaW50ICJcdCIgKyAiICIuam9pbihzeXMuYXJndlsxOl0pCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0OgorICAgICAgICAgICAgIyBJbiBtb3N0IGNhc2VzIFN5c3RlbUV4aXQgZG9lcyBub3Qgd2FycmFudCBhIHBvc3QtbW9ydGVtIHNlc3Npb24uCisgICAgICAgICAgICBwcmludCAiVGhlIHByb2dyYW0gZXhpdGVkIHZpYSBzeXMuZXhpdCgpLiBFeGl0IHN0YXR1czogIiwKKyAgICAgICAgICAgIHByaW50IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgcHJpbnQgIlVuY2F1Z2h0IGV4Y2VwdGlvbi4gRW50ZXJpbmcgcG9zdCBtb3J0ZW0gZGVidWdnaW5nIgorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJ2NvbnQnIG9yICdzdGVwJyB3aWxsIHJlc3RhcnQgdGhlIHByb2dyYW0iCisgICAgICAgICAgICB0ID0gc3lzLmV4Y19pbmZvKClbMl0KKyAgICAgICAgICAgIHBkYi5pbnRlcmFjdGlvbihOb25lLCB0KQorICAgICAgICAgICAgcHJpbnQgIlBvc3QgbW9ydGVtIGRlYnVnZ2VyIGZpbmlzaGVkLiBUaGUgIiArIG1haW5weWZpbGUgKyBcCisgICAgICAgICAgICAgICAgICAiIHdpbGwgYmUgcmVzdGFydGVkIgorCisKKyMgV2hlbiBpbnZva2VkIGFzIG1haW4gcHJvZ3JhbSwgaW52b2tlIHRoZSBkZWJ1Z2dlciBvbiBhIHNjcmlwdAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgcGRiCisgICAgcGRiLm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wZGIucHljIGIvbGliL3B5dGhvbjIuNy9wZGIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OWQ4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BkYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wZGIucHlvIGIvbGliL3B5dGhvbjIuNy9wZGIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OWQ4MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BkYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9waWNrbGUucHkgYi9saWIvcHl0aG9uMi43L3BpY2tsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhlODU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9waWNrbGUucHkKQEAgLTAsMCArMSwxMzkxIEBACisiIiJDcmVhdGUgcG9ydGFibGUgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbnMgb2YgUHl0aG9uIG9iamVjdHMuCisKK1NlZSBtb2R1bGUgY1BpY2tsZSBmb3IgYSAobXVjaCkgZmFzdGVyIGltcGxlbWVudGF0aW9uLgorU2VlIG1vZHVsZSBjb3B5X3JlZyBmb3IgYSBtZWNoYW5pc20gZm9yIHJlZ2lzdGVyaW5nIGN1c3RvbSBwaWNrbGVycy4KK1NlZSBtb2R1bGUgcGlja2xldG9vbHMgc291cmNlIGZvciBleHRlbnNpdmUgY29tbWVudHMuCisKK0NsYXNzZXM6CisKKyAgICBQaWNrbGVyCisgICAgVW5waWNrbGVyCisKK0Z1bmN0aW9uczoKKworICAgIGR1bXAob2JqZWN0LCBmaWxlKQorICAgIGR1bXBzKG9iamVjdCkgLT4gc3RyaW5nCisgICAgbG9hZChmaWxlKSAtPiBvYmplY3QKKyAgICBsb2FkcyhzdHJpbmcpIC0+IG9iamVjdAorCitNaXNjIHZhcmlhYmxlczoKKworICAgIF9fdmVyc2lvbl9fCisgICAgZm9ybWF0X3ZlcnNpb24KKyAgICBjb21wYXRpYmxlX2Zvcm1hdHMKKworIiIiCisKK19fdmVyc2lvbl9fID0gIiRSZXZpc2lvbjogNzIyMjMgJCIgICAgICAgIyBDb2RlIHZlcnNpb24KKworZnJvbSB0eXBlcyBpbXBvcnQgKgorZnJvbSBjb3B5X3JlZyBpbXBvcnQgZGlzcGF0Y2hfdGFibGUKK2Zyb20gY29weV9yZWcgaW1wb3J0IF9leHRlbnNpb25fcmVnaXN0cnksIF9pbnZlcnRlZF9yZWdpc3RyeSwgX2V4dGVuc2lvbl9jYWNoZQoraW1wb3J0IG1hcnNoYWwKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCByZQorCitfX2FsbF9fID0gWyJQaWNrbGVFcnJvciIsICJQaWNrbGluZ0Vycm9yIiwgIlVucGlja2xpbmdFcnJvciIsICJQaWNrbGVyIiwKKyAgICAgICAgICAgIlVucGlja2xlciIsICJkdW1wIiwgImR1bXBzIiwgImxvYWQiLCAibG9hZHMiXQorCisjIFRoZXNlIGFyZSBwdXJlbHkgaW5mb3JtYXRpb25hbDsgbm8gY29kZSB1c2VzIHRoZXNlLgorZm9ybWF0X3ZlcnNpb24gPSAiMi4wIiAgICAgICAgICAgICAgICAgICMgRmlsZSBmb3JtYXQgdmVyc2lvbiB3ZSB3cml0ZQorY29tcGF0aWJsZV9mb3JtYXRzID0gWyIxLjAiLCAgICAgICAgICAgICMgT3JpZ2luYWwgcHJvdG9jb2wgMAorICAgICAgICAgICAgICAgICAgICAgICIxLjEiLCAgICAgICAgICAgICMgUHJvdG9jb2wgMCB3aXRoIElOU1QgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICAiMS4yIiwgICAgICAgICAgICAjIE9yaWdpbmFsIHByb3RvY29sIDEKKyAgICAgICAgICAgICAgICAgICAgICAiMS4zIiwgICAgICAgICAgICAjIFByb3RvY29sIDEgd2l0aCBCSU5GTE9BVCBhZGRlZAorICAgICAgICAgICAgICAgICAgICAgICIyLjAiLCAgICAgICAgICAgICMgUHJvdG9jb2wgMgorICAgICAgICAgICAgICAgICAgICAgIF0gICAgICAgICAgICAgICAgICMgT2xkIGZvcm1hdCB2ZXJzaW9ucyB3ZSBjYW4gcmVhZAorCisjIEtlZXAgaW4gc3luY2ggd2l0aCBjUGlja2xlLiAgVGhpcyBpcyB0aGUgaGlnaGVzdCBwcm90b2NvbCBudW1iZXIgd2UKKyMga25vdyBob3cgdG8gcmVhZC4KK0hJR0hFU1RfUFJPVE9DT0wgPSAyCisKKyMgV2h5IHVzZSBzdHJ1Y3QucGFjaygpIGZvciBwaWNrbGluZyBidXQgbWFyc2hhbC5sb2FkcygpIGZvcgorIyB1bnBpY2tsaW5nPyAgc3RydWN0LnBhY2soKSBpcyA0MCUgZmFzdGVyIHRoYW4gbWFyc2hhbC5kdW1wcygpLCBidXQKKyMgbWFyc2hhbC5sb2FkcygpIGlzIHR3aWNlIGFzIGZhc3QgYXMgc3RydWN0LnVucGFjaygpIQorbWxvYWRzID0gbWFyc2hhbC5sb2FkcworCitjbGFzcyBQaWNrbGVFcnJvcihFeGNlcHRpb24pOgorICAgICIiIkEgY29tbW9uIGJhc2UgY2xhc3MgZm9yIHRoZSBvdGhlciBwaWNrbGluZyBleGNlcHRpb25zLiIiIgorICAgIHBhc3MKKworY2xhc3MgUGlja2xpbmdFcnJvcihQaWNrbGVFcnJvcik6CisgICAgIiIiVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYW4gdW5waWNrbGFibGUgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUKKyAgICBkdW1wKCkgbWV0aG9kLgorCisgICAgIiIiCisgICAgcGFzcworCitjbGFzcyBVbnBpY2tsaW5nRXJyb3IoUGlja2xlRXJyb3IpOgorICAgICIiIlRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHRoZXJlIGlzIGEgcHJvYmxlbSB1bnBpY2tsaW5nIGFuIG9iamVjdCwKKyAgICBzdWNoIGFzIGEgc2VjdXJpdHkgdmlvbGF0aW9uLgorCisgICAgTm90ZSB0aGF0IG90aGVyIGV4Y2VwdGlvbnMgbWF5IGFsc28gYmUgcmFpc2VkIGR1cmluZyB1bnBpY2tsaW5nLCBpbmNsdWRpbmcKKyAgICAoYnV0IG5vdCBuZWNlc3NhcmlseSBsaW1pdGVkIHRvKSBBdHRyaWJ1dGVFcnJvciwgRU9GRXJyb3IsIEltcG9ydEVycm9yLAorICAgIGFuZCBJbmRleEVycm9yLgorCisgICAgIiIiCisgICAgcGFzcworCisjIEFuIGluc3RhbmNlIG9mIF9TdG9wIGlzIHJhaXNlZCBieSBVbnBpY2tsZXIubG9hZF9zdG9wKCkgaW4gcmVzcG9uc2UgdG8KKyMgdGhlIFNUT1Agb3Bjb2RlLCBwYXNzaW5nIHRoZSBvYmplY3QgdGhhdCBpcyB0aGUgcmVzdWx0IG9mIHVucGlja2xpbmcuCitjbGFzcyBfU3RvcChFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCisjIEp5dGhvbiBoYXMgUHlTdHJpbmdNYXA7IGl0J3MgYSBkaWN0IHN1YmNsYXNzIHdpdGggc3RyaW5nIGtleXMKK3RyeToKKyAgICBmcm9tIG9yZy5weXRob24uY29yZSBpbXBvcnQgUHlTdHJpbmdNYXAKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBQeVN0cmluZ01hcCA9IE5vbmUKKworIyBVbmljb2RlVHlwZSBtYXkgb3IgbWF5IG5vdCBiZSBleHBvcnRlZCAobm9ybWFsbHkgaW1wb3J0ZWQgZnJvbSB0eXBlcykKK3RyeToKKyAgICBVbmljb2RlVHlwZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBVbmljb2RlVHlwZSA9IE5vbmUKKworIyBQaWNrbGUgb3Bjb2Rlcy4gIFNlZSBwaWNrbGV0b29scy5weSBmb3IgZXh0ZW5zaXZlIGRvY3MuICBUaGUgbGlzdGluZworIyBoZXJlIGlzIGluIGtpbmQtb2YgYWxwaGFiZXRpY2FsIG9yZGVyIG9mIDEtY2hhcmFjdGVyIHBpY2tsZSBjb2RlLgorIyBwaWNrbGV0b29scyBncm91cHMgdGhlbSBieSBwdXJwb3NlLgorCitNQVJLICAgICAgICAgICAgPSAnKCcgICAjIHB1c2ggc3BlY2lhbCBtYXJrb2JqZWN0IG9uIHN0YWNrCitTVE9QICAgICAgICAgICAgPSAnLicgICAjIGV2ZXJ5IHBpY2tsZSBlbmRzIHdpdGggU1RPUAorUE9QICAgICAgICAgICAgID0gJzAnICAgIyBkaXNjYXJkIHRvcG1vc3Qgc3RhY2sgaXRlbQorUE9QX01BUksgICAgICAgID0gJzEnICAgIyBkaXNjYXJkIHN0YWNrIHRvcCB0aHJvdWdoIHRvcG1vc3QgbWFya29iamVjdAorRFVQICAgICAgICAgICAgID0gJzInICAgIyBkdXBsaWNhdGUgdG9wIHN0YWNrIGl0ZW0KK0ZMT0FUICAgICAgICAgICA9ICdGJyAgICMgcHVzaCBmbG9hdCBvYmplY3Q7IGRlY2ltYWwgc3RyaW5nIGFyZ3VtZW50CitJTlQgICAgICAgICAgICAgPSAnSScgICAjIHB1c2ggaW50ZWdlciBvciBib29sOyBkZWNpbWFsIHN0cmluZyBhcmd1bWVudAorQklOSU5UICAgICAgICAgID0gJ0onICAgIyBwdXNoIGZvdXItYnl0ZSBzaWduZWQgaW50CitCSU5JTlQxICAgICAgICAgPSAnSycgICAjIHB1c2ggMS1ieXRlIHVuc2lnbmVkIGludAorTE9ORyAgICAgICAgICAgID0gJ0wnICAgIyBwdXNoIGxvbmc7IGRlY2ltYWwgc3RyaW5nIGFyZ3VtZW50CitCSU5JTlQyICAgICAgICAgPSAnTScgICAjIHB1c2ggMi1ieXRlIHVuc2lnbmVkIGludAorTk9ORSAgICAgICAgICAgID0gJ04nICAgIyBwdXNoIE5vbmUKK1BFUlNJRCAgICAgICAgICA9ICdQJyAgICMgcHVzaCBwZXJzaXN0ZW50IG9iamVjdDsgaWQgaXMgdGFrZW4gZnJvbSBzdHJpbmcgYXJnCitCSU5QRVJTSUQgICAgICAgPSAnUScgICAjICAiICAgICAgICIgICAgICAgICAiICA7ICAiICAiICAgIiAgICAgIiAgc3RhY2sKK1JFRFVDRSAgICAgICAgICA9ICdSJyAgICMgYXBwbHkgY2FsbGFibGUgdG8gYXJndHVwbGUsIGJvdGggb24gc3RhY2sKK1NUUklORyAgICAgICAgICA9ICdTJyAgICMgcHVzaCBzdHJpbmc7IE5MLXRlcm1pbmF0ZWQgc3RyaW5nIGFyZ3VtZW50CitCSU5TVFJJTkcgICAgICAgPSAnVCcgICAjIHB1c2ggc3RyaW5nOyBjb3VudGVkIGJpbmFyeSBzdHJpbmcgYXJndW1lbnQKK1NIT1JUX0JJTlNUUklORyA9ICdVJyAgICMgICIgICAgICIgICA7ICAgICIgICAgICAiICAgICAgICIgICAgICAiIDwgMjU2IGJ5dGVzCitVTklDT0RFICAgICAgICAgPSAnVicgICAjIHB1c2ggVW5pY29kZSBzdHJpbmc7IHJhdy11bmljb2RlLWVzY2FwZWQnZCBhcmd1bWVudAorQklOVU5JQ09ERSAgICAgID0gJ1gnICAgIyAgICIgICAgICIgICAgICAgIiAgOyBjb3VudGVkIFVURi04IHN0cmluZyBhcmd1bWVudAorQVBQRU5EICAgICAgICAgID0gJ2EnICAgIyBhcHBlbmQgc3RhY2sgdG9wIHRvIGxpc3QgYmVsb3cgaXQKK0JVSUxEICAgICAgICAgICA9ICdiJyAgICMgY2FsbCBfX3NldHN0YXRlX18gb3IgX19kaWN0X18udXBkYXRlKCkKK0dMT0JBTCAgICAgICAgICA9ICdjJyAgICMgcHVzaCBzZWxmLmZpbmRfY2xhc3MobW9kbmFtZSwgbmFtZSk7IDIgc3RyaW5nIGFyZ3MKK0RJQ1QgICAgICAgICAgICA9ICdkJyAgICMgYnVpbGQgYSBkaWN0IGZyb20gc3RhY2sgaXRlbXMKK0VNUFRZX0RJQ1QgICAgICA9ICd9JyAgICMgcHVzaCBlbXB0eSBkaWN0CitBUFBFTkRTICAgICAgICAgPSAnZScgICAjIGV4dGVuZCBsaXN0IG9uIHN0YWNrIGJ5IHRvcG1vc3Qgc3RhY2sgc2xpY2UKK0dFVCAgICAgICAgICAgICA9ICdnJyAgICMgcHVzaCBpdGVtIGZyb20gbWVtbyBvbiBzdGFjazsgaW5kZXggaXMgc3RyaW5nIGFyZworQklOR0VUICAgICAgICAgID0gJ2gnICAgIyAgICIgICAgIiAgICAiICAgICIgICAiICAgIiAgOyAgICIgICAgIiAxLWJ5dGUgYXJnCitJTlNUICAgICAgICAgICAgPSAnaScgICAjIGJ1aWxkICYgcHVzaCBjbGFzcyBpbnN0YW5jZQorTE9OR19CSU5HRVQgICAgID0gJ2onICAgIyBwdXNoIGl0ZW0gZnJvbSBtZW1vIG9uIHN0YWNrOyBpbmRleCBpcyA0LWJ5dGUgYXJnCitMSVNUICAgICAgICAgICAgPSAnbCcgICAjIGJ1aWxkIGxpc3QgZnJvbSB0b3Btb3N0IHN0YWNrIGl0ZW1zCitFTVBUWV9MSVNUICAgICAgPSAnXScgICAjIHB1c2ggZW1wdHkgbGlzdAorT0JKICAgICAgICAgICAgID0gJ28nICAgIyBidWlsZCAmIHB1c2ggY2xhc3MgaW5zdGFuY2UKK1BVVCAgICAgICAgICAgICA9ICdwJyAgICMgc3RvcmUgc3RhY2sgdG9wIGluIG1lbW87IGluZGV4IGlzIHN0cmluZyBhcmcKK0JJTlBVVCAgICAgICAgICA9ICdxJyAgICMgICAiICAgICAiICAgICIgICAiICAgIiA7ICAgIiAgICAiIDEtYnl0ZSBhcmcKK0xPTkdfQklOUFVUICAgICA9ICdyJyAgICMgICAiICAgICAiICAgICIgICAiICAgIiA7ICAgIiAgICAiIDQtYnl0ZSBhcmcKK1NFVElURU0gICAgICAgICA9ICdzJyAgICMgYWRkIGtleSt2YWx1ZSBwYWlyIHRvIGRpY3QKK1RVUExFICAgICAgICAgICA9ICd0JyAgICMgYnVpbGQgdHVwbGUgZnJvbSB0b3Btb3N0IHN0YWNrIGl0ZW1zCitFTVBUWV9UVVBMRSAgICAgPSAnKScgICAjIHB1c2ggZW1wdHkgdHVwbGUKK1NFVElURU1TICAgICAgICA9ICd1JyAgICMgbW9kaWZ5IGRpY3QgYnkgYWRkaW5nIHRvcG1vc3Qga2V5K3ZhbHVlIHBhaXJzCitCSU5GTE9BVCAgICAgICAgPSAnRycgICAjIHB1c2ggZmxvYXQ7IGFyZyBpcyA4LWJ5dGUgZmxvYXQgZW5jb2RpbmcKKworVFJVRSAgICAgICAgICAgID0gJ0kwMVxuJyAgIyBub3QgYW4gb3Bjb2RlOyBzZWUgSU5UIGRvY3MgaW4gcGlja2xldG9vbHMucHkKK0ZBTFNFICAgICAgICAgICA9ICdJMDBcbicgICMgbm90IGFuIG9wY29kZTsgc2VlIElOVCBkb2NzIGluIHBpY2tsZXRvb2xzLnB5CisKKyMgUHJvdG9jb2wgMgorCitQUk9UTyAgICAgICAgICAgPSAnXHg4MCcgICMgaWRlbnRpZnkgcGlja2xlIHByb3RvY29sCitORVdPQkogICAgICAgICAgPSAnXHg4MScgICMgYnVpbGQgb2JqZWN0IGJ5IGFwcGx5aW5nIGNscy5fX25ld19fIHRvIGFyZ3R1cGxlCitFWFQxICAgICAgICAgICAgPSAnXHg4MicgICMgcHVzaCBvYmplY3QgZnJvbSBleHRlbnNpb24gcmVnaXN0cnk7IDEtYnl0ZSBpbmRleAorRVhUMiAgICAgICAgICAgID0gJ1x4ODMnICAjIGRpdHRvLCBidXQgMi1ieXRlIGluZGV4CitFWFQ0ICAgICAgICAgICAgPSAnXHg4NCcgICMgZGl0dG8sIGJ1dCA0LWJ5dGUgaW5kZXgKK1RVUExFMSAgICAgICAgICA9ICdceDg1JyAgIyBidWlsZCAxLXR1cGxlIGZyb20gc3RhY2sgdG9wCitUVVBMRTIgICAgICAgICAgPSAnXHg4NicgICMgYnVpbGQgMi10dXBsZSBmcm9tIHR3byB0b3Btb3N0IHN0YWNrIGl0ZW1zCitUVVBMRTMgICAgICAgICAgPSAnXHg4NycgICMgYnVpbGQgMy10dXBsZSBmcm9tIHRocmVlIHRvcG1vc3Qgc3RhY2sgaXRlbXMKK05FV1RSVUUgICAgICAgICA9ICdceDg4JyAgIyBwdXNoIFRydWUKK05FV0ZBTFNFICAgICAgICA9ICdceDg5JyAgIyBwdXNoIEZhbHNlCitMT05HMSAgICAgICAgICAgPSAnXHg4YScgICMgcHVzaCBsb25nIGZyb20gPCAyNTYgYnl0ZXMKK0xPTkc0ICAgICAgICAgICA9ICdceDhiJyAgIyBwdXNoIHJlYWxseSBiaWcgbG9uZworCitfdHVwbGVzaXplMmNvZGUgPSBbRU1QVFlfVFVQTEUsIFRVUExFMSwgVFVQTEUyLCBUVVBMRTNdCisKKworX19hbGxfXy5leHRlbmQoW3ggZm9yIHggaW4gZGlyKCkgaWYgcmUubWF0Y2goIltBLVpdW0EtWjAtOV9dKyQiLHgpXSkKK2RlbCB4CisKKworIyBQaWNrbGluZyBtYWNoaW5lcnkKKworY2xhc3MgUGlja2xlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBwcm90b2NvbD1Ob25lKToKKyAgICAgICAgIiIiVGhpcyB0YWtlcyBhIGZpbGUtbGlrZSBvYmplY3QgZm9yIHdyaXRpbmcgYSBwaWNrbGUgZGF0YSBzdHJlYW0uCisKKyAgICAgICAgVGhlIG9wdGlvbmFsIHByb3RvY29sIGFyZ3VtZW50IHRlbGxzIHRoZSBwaWNrbGVyIHRvIHVzZSB0aGUKKyAgICAgICAgZ2l2ZW4gcHJvdG9jb2w7IHN1cHBvcnRlZCBwcm90b2NvbHMgYXJlIDAsIDEsIDIuICBUaGUgZGVmYXVsdAorICAgICAgICBwcm90b2NvbCBpcyAwLCB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZS4gIChQcm90b2NvbCAwIGlzIHRoZQorICAgICAgICBvbmx5IHByb3RvY29sIHRoYXQgY2FuIGJlIHdyaXR0ZW4gdG8gYSBmaWxlIG9wZW5lZCBpbiB0ZXh0CisgICAgICAgIG1vZGUgYW5kIHJlYWQgYmFjayBzdWNjZXNzZnVsbHkuICBXaGVuIHVzaW5nIGEgcHJvdG9jb2wgaGlnaGVyCisgICAgICAgIHRoYW4gMCwgbWFrZSBzdXJlIHRoZSBmaWxlIGlzIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSwgYm90aCB3aGVuCisgICAgICAgIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nLikKKworICAgICAgICBQcm90b2NvbCAxIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gcHJvdG9jb2wgMDsgcHJvdG9jb2wgMiBpcworICAgICAgICBtb3JlIGVmZmljaWVudCB0aGFuIHByb3RvY29sIDEuCisKKyAgICAgICAgU3BlY2lmeWluZyBhIG5lZ2F0aXZlIHByb3RvY29sIHZlcnNpb24gc2VsZWN0cyB0aGUgaGlnaGVzdAorICAgICAgICBwcm90b2NvbCB2ZXJzaW9uIHN1cHBvcnRlZC4gIFRoZSBoaWdoZXIgdGhlIHByb3RvY29sIHVzZWQsIHRoZQorICAgICAgICBtb3JlIHJlY2VudCB0aGUgdmVyc2lvbiBvZiBQeXRob24gbmVlZGVkIHRvIHJlYWQgdGhlIHBpY2tsZQorICAgICAgICBwcm9kdWNlZC4KKworICAgICAgICBUaGUgZmlsZSBwYXJhbWV0ZXIgbXVzdCBoYXZlIGEgd3JpdGUoKSBtZXRob2QgdGhhdCBhY2NlcHRzIGEgc2luZ2xlCisgICAgICAgIHN0cmluZyBhcmd1bWVudC4gIEl0IGNhbiB0aHVzIGJlIGFuIG9wZW4gZmlsZSBvYmplY3QsIGEgU3RyaW5nSU8KKyAgICAgICAgb2JqZWN0LCBvciBhbnkgb3RoZXIgY3VzdG9tIG9iamVjdCB0aGF0IG1lZXRzIHRoaXMgaW50ZXJmYWNlLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBwcm90b2NvbCBpcyBOb25lOgorICAgICAgICAgICAgcHJvdG9jb2wgPSAwCisgICAgICAgIGlmIHByb3RvY29sIDwgMDoKKyAgICAgICAgICAgIHByb3RvY29sID0gSElHSEVTVF9QUk9UT0NPTAorICAgICAgICBlbGlmIG5vdCAwIDw9IHByb3RvY29sIDw9IEhJR0hFU1RfUFJPVE9DT0w6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwaWNrbGUgcHJvdG9jb2wgbXVzdCBiZSA8PSAlZCIgJSBISUdIRVNUX1BST1RPQ09MKQorICAgICAgICBzZWxmLndyaXRlID0gZmlsZS53cml0ZQorICAgICAgICBzZWxmLm1lbW8gPSB7fQorICAgICAgICBzZWxmLnByb3RvID0gaW50KHByb3RvY29sKQorICAgICAgICBzZWxmLmJpbiA9IHByb3RvY29sID49IDEKKyAgICAgICAgc2VsZi5mYXN0ID0gMAorCisgICAgZGVmIGNsZWFyX21lbW8oc2VsZik6CisgICAgICAgICIiIkNsZWFycyB0aGUgcGlja2xlcidzICJtZW1vIi4KKworICAgICAgICBUaGUgbWVtbyBpcyB0aGUgZGF0YSBzdHJ1Y3R1cmUgdGhhdCByZW1lbWJlcnMgd2hpY2ggb2JqZWN0cyB0aGUKKyAgICAgICAgcGlja2xlciBoYXMgYWxyZWFkeSBzZWVuLCBzbyB0aGF0IHNoYXJlZCBvciByZWN1cnNpdmUgb2JqZWN0cyBhcmUKKyAgICAgICAgcGlja2xlZCBieSByZWZlcmVuY2UgYW5kIG5vdCBieSB2YWx1ZS4gIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCB3aGVuCisgICAgICAgIHJlLXVzaW5nIHBpY2tsZXJzLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm1lbW8uY2xlYXIoKQorCisgICAgZGVmIGR1bXAoc2VsZiwgb2JqKToKKyAgICAgICAgIiIiV3JpdGUgYSBwaWNrbGVkIHJlcHJlc2VudGF0aW9uIG9mIG9iaiB0byB0aGUgb3BlbiBmaWxlLiIiIgorICAgICAgICBpZiBzZWxmLnByb3RvID49IDI6CisgICAgICAgICAgICBzZWxmLndyaXRlKFBST1RPICsgY2hyKHNlbGYucHJvdG8pKQorICAgICAgICBzZWxmLnNhdmUob2JqKQorICAgICAgICBzZWxmLndyaXRlKFNUT1ApCisKKyAgICBkZWYgbWVtb2l6ZShzZWxmLCBvYmopOgorICAgICAgICAiIiJTdG9yZSBhbiBvYmplY3QgaW4gdGhlIG1lbW8uIiIiCisKKyAgICAgICAgIyBUaGUgUGlja2xlciBtZW1vIGlzIGEgZGljdGlvbmFyeSBtYXBwaW5nIG9iamVjdCBpZHMgdG8gMi10dXBsZXMKKyAgICAgICAgIyB0aGF0IGNvbnRhaW4gdGhlIFVucGlja2xlciBtZW1vIGtleSBhbmQgdGhlIG9iamVjdCBiZWluZyBtZW1vaXplZC4KKyAgICAgICAgIyBUaGUgbWVtbyBrZXkgaXMgd3JpdHRlbiB0byB0aGUgcGlja2xlIGFuZCB3aWxsIGJlY29tZQorICAgICAgICAjIHRoZSBrZXkgaW4gdGhlIFVucGlja2xlcidzIG1lbW8uICBUaGUgb2JqZWN0IGlzIHN0b3JlZCBpbiB0aGUKKyAgICAgICAgIyBQaWNrbGVyIG1lbW8gc28gdGhhdCB0cmFuc2llbnQgb2JqZWN0cyBhcmUga2VwdCBhbGl2ZSBkdXJpbmcKKyAgICAgICAgIyBwaWNrbGluZy4KKworICAgICAgICAjIFRoZSB1c2Ugb2YgdGhlIFVucGlja2xlciBtZW1vIGxlbmd0aCBhcyB0aGUgbWVtbyBrZXkgaXMganVzdCBhCisgICAgICAgICMgY29udmVudGlvbi4gIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgdGhlIG1lbW8gdmFsdWVzIGJlIHVuaXF1ZS4KKyAgICAgICAgIyBCdXQgdGhlcmUgYXBwZWFycyBubyBhZHZhbnRhZ2UgdG8gYW55IG90aGVyIHNjaGVtZSwgYW5kIHRoaXMKKyAgICAgICAgIyBzY2hlbWUgYWxsb3dzIHRoZSBVbnBpY2tsZXIgbWVtbyB0byBiZSBpbXBsZW1lbnRlZCBhcyBhIHBsYWluIChidXQKKyAgICAgICAgIyBncm93YWJsZSkgYXJyYXksIGluZGV4ZWQgYnkgbWVtbyBrZXkuCisgICAgICAgIGlmIHNlbGYuZmFzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhc3NlcnQgaWQob2JqKSBub3QgaW4gc2VsZi5tZW1vCisgICAgICAgIG1lbW9fbGVuID0gbGVuKHNlbGYubWVtbykKKyAgICAgICAgc2VsZi53cml0ZShzZWxmLnB1dChtZW1vX2xlbikpCisgICAgICAgIHNlbGYubWVtb1tpZChvYmopXSA9IG1lbW9fbGVuLCBvYmoKKworICAgICMgUmV0dXJuIGEgUFVUIChCSU5QVVQsIExPTkdfQklOUFVUKSBvcGNvZGUgc3RyaW5nLCB3aXRoIGFyZ3VtZW50IGkuCisgICAgZGVmIHB1dChzZWxmLCBpLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICBpZiBpIDwgMjU2OgorICAgICAgICAgICAgICAgIHJldHVybiBCSU5QVVQgKyBjaHIoaSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkdfQklOUFVUICsgcGFjaygiPGkiLCBpKQorCisgICAgICAgIHJldHVybiBQVVQgKyByZXByKGkpICsgJ1xuJworCisgICAgIyBSZXR1cm4gYSBHRVQgKEJJTkdFVCwgTE9OR19CSU5HRVQpIG9wY29kZSBzdHJpbmcsIHdpdGggYXJndW1lbnQgaS4KKyAgICBkZWYgZ2V0KHNlbGYsIGksIHBhY2s9c3RydWN0LnBhY2spOgorICAgICAgICBpZiBzZWxmLmJpbjoKKyAgICAgICAgICAgIGlmIGkgPCAyNTY6CisgICAgICAgICAgICAgICAgcmV0dXJuIEJJTkdFVCArIGNocihpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9OR19CSU5HRVQgKyBwYWNrKCI8aSIsIGkpCisKKyAgICAgICAgcmV0dXJuIEdFVCArIHJlcHIoaSkgKyAnXG4nCisKKyAgICBkZWYgc2F2ZShzZWxmLCBvYmopOgorICAgICAgICAjIENoZWNrIGZvciBwZXJzaXN0ZW50IGlkIChkZWZpbmVkIGJ5IGEgc3ViY2xhc3MpCisgICAgICAgIHBpZCA9IHNlbGYucGVyc2lzdGVudF9pZChvYmopCisgICAgICAgIGlmIHBpZDoKKyAgICAgICAgICAgIHNlbGYuc2F2ZV9wZXJzKHBpZCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQ2hlY2sgdGhlIG1lbW8KKyAgICAgICAgeCA9IHNlbGYubWVtby5nZXQoaWQob2JqKSkKKyAgICAgICAgaWYgeDoKKyAgICAgICAgICAgIHNlbGYud3JpdGUoc2VsZi5nZXQoeFswXSkpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIENoZWNrIHRoZSB0eXBlIGRpc3BhdGNoIHRhYmxlCisgICAgICAgIHQgPSB0eXBlKG9iaikKKyAgICAgICAgZiA9IHNlbGYuZGlzcGF0Y2guZ2V0KHQpCisgICAgICAgIGlmIGY6CisgICAgICAgICAgICBmKHNlbGYsIG9iaikgIyBDYWxsIHVuYm91bmQgbWV0aG9kIHdpdGggZXhwbGljaXQgc2VsZgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBDaGVjayBjb3B5X3JlZy5kaXNwYXRjaF90YWJsZQorICAgICAgICByZWR1Y2UgPSBkaXNwYXRjaF90YWJsZS5nZXQodCkKKyAgICAgICAgaWYgcmVkdWNlOgorICAgICAgICAgICAgcnYgPSByZWR1Y2Uob2JqKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBjbGFzcyB3aXRoIGEgY3VzdG9tIG1ldGFjbGFzczsgdHJlYXQgYXMgcmVndWxhciBjbGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlzc2MgPSBpc3N1YmNsYXNzKHQsIFR5cGVUeXBlKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogIyB0IGlzIG5vdCBhIGNsYXNzIChvbGQgQm9vc3Q7IHNlZSBTRiAjNTAyMDg1KQorICAgICAgICAgICAgICAgIGlzc2MgPSAwCisgICAgICAgICAgICBpZiBpc3NjOgorICAgICAgICAgICAgICAgIHNlbGYuc2F2ZV9nbG9iYWwob2JqKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICAjIENoZWNrIGZvciBhIF9fcmVkdWNlX2V4X18gbWV0aG9kLCBmYWxsIGJhY2sgdG8gX19yZWR1Y2VfXworICAgICAgICAgICAgcmVkdWNlID0gZ2V0YXR0cihvYmosICJfX3JlZHVjZV9leF9fIiwgTm9uZSkKKyAgICAgICAgICAgIGlmIHJlZHVjZToKKyAgICAgICAgICAgICAgICBydiA9IHJlZHVjZShzZWxmLnByb3RvKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWR1Y2UgPSBnZXRhdHRyKG9iaiwgIl9fcmVkdWNlX18iLCBOb25lKQorICAgICAgICAgICAgICAgIGlmIHJlZHVjZToKKyAgICAgICAgICAgICAgICAgICAgcnYgPSByZWR1Y2UoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoIkNhbid0IHBpY2tsZSAlciBvYmplY3Q6ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQuX19uYW1lX18sIG9iaikpCisKKyAgICAgICAgIyBDaGVjayBmb3Igc3RyaW5nIHJldHVybmVkIGJ5IHJlZHVjZSgpLCBtZWFuaW5nICJzYXZlIGFzIGdsb2JhbCIKKyAgICAgICAgaWYgdHlwZShydikgaXMgU3RyaW5nVHlwZToKKyAgICAgICAgICAgIHNlbGYuc2F2ZV9nbG9iYWwob2JqLCBydikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQXNzZXJ0IHRoYXQgcmVkdWNlKCkgcmV0dXJuZWQgYSB0dXBsZQorICAgICAgICBpZiB0eXBlKHJ2KSBpcyBub3QgVHVwbGVUeXBlOgorICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiJXMgbXVzdCByZXR1cm4gc3RyaW5nIG9yIHR1cGxlIiAlIHJlZHVjZSkKKworICAgICAgICAjIEFzc2VydCB0aGF0IGl0IHJldHVybmVkIGFuIGFwcHJvcHJpYXRlbHkgc2l6ZWQgdHVwbGUKKyAgICAgICAgbCA9IGxlbihydikKKyAgICAgICAgaWYgbm90ICgyIDw9IGwgPD0gNSk6CisgICAgICAgICAgICByYWlzZSBQaWNrbGluZ0Vycm9yKCJUdXBsZSByZXR1cm5lZCBieSAlcyBtdXN0IGhhdmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHdvIHRvIGZpdmUgZWxlbWVudHMiICUgcmVkdWNlKQorCisgICAgICAgICMgU2F2ZSB0aGUgcmVkdWNlKCkgb3V0cHV0IGFuZCBmaW5hbGx5IG1lbW9pemUgdGhlIG9iamVjdAorICAgICAgICBzZWxmLnNhdmVfcmVkdWNlKG9iaj1vYmosICpydikKKworICAgIGRlZiBwZXJzaXN0ZW50X2lkKHNlbGYsIG9iaik6CisgICAgICAgICMgVGhpcyBleGlzdHMgc28gYSBzdWJjbGFzcyBjYW4gb3ZlcnJpZGUgaXQKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBzYXZlX3BlcnMoc2VsZiwgcGlkKToKKyAgICAgICAgIyBTYXZlIGEgcGVyc2lzdGVudCBpZCByZWZlcmVuY2UKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICBzZWxmLnNhdmUocGlkKQorICAgICAgICAgICAgc2VsZi53cml0ZShCSU5QRVJTSUQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlKFBFUlNJRCArIHN0cihwaWQpICsgJ1xuJykKKworICAgIGRlZiBzYXZlX3JlZHVjZShzZWxmLCBmdW5jLCBhcmdzLCBzdGF0ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICBsaXN0aXRlbXM9Tm9uZSwgZGljdGl0ZW1zPU5vbmUsIG9iaj1Ob25lKToKKyAgICAgICAgIyBUaGlzIEFQSSBpcyBjYWxsZWQgYnkgc29tZSBzdWJjbGFzc2VzCisKKyAgICAgICAgIyBBc3NlcnQgdGhhdCBhcmdzIGlzIGEgdHVwbGUgb3IgTm9uZQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhcmdzLCBUdXBsZVR5cGUpOgorICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigiYXJncyBmcm9tIHJlZHVjZSgpIHNob3VsZCBiZSBhIHR1cGxlIikKKworICAgICAgICAjIEFzc2VydCB0aGF0IGZ1bmMgaXMgY2FsbGFibGUKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoZnVuYywgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICByYWlzZSBQaWNrbGluZ0Vycm9yKCJmdW5jIGZyb20gcmVkdWNlIHNob3VsZCBiZSBjYWxsYWJsZSIpCisKKyAgICAgICAgc2F2ZSA9IHNlbGYuc2F2ZQorICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKKworICAgICAgICAjIFByb3RvY29sIDIgc3BlY2lhbCBjYXNlOiBpZiBmdW5jJ3MgbmFtZSBpcyBfX25ld29ial9fLCB1c2UgTkVXT0JKCisgICAgICAgIGlmIHNlbGYucHJvdG8gPj0gMiBhbmQgZ2V0YXR0cihmdW5jLCAiX19uYW1lX18iLCAiIikgPT0gIl9fbmV3b2JqX18iOgorICAgICAgICAgICAgIyBBIF9fcmVkdWNlX18gaW1wbGVtZW50YXRpb24gY2FuIGRpcmVjdCBwcm90b2NvbCAyIHRvCisgICAgICAgICAgICAjIHVzZSB0aGUgbW9yZSBlZmZpY2llbnQgTkVXT0JKIG9wY29kZSwgd2hpbGUgc3RpbGwKKyAgICAgICAgICAgICMgYWxsb3dpbmcgcHJvdG9jb2wgMCBhbmQgMSB0byB3b3JrIG5vcm1hbGx5LiAgRm9yIHRoaXMgdG8KKyAgICAgICAgICAgICMgd29yaywgdGhlIGZ1bmN0aW9uIHJldHVybmVkIGJ5IF9fcmVkdWNlX18gc2hvdWxkIGJlCisgICAgICAgICAgICAjIGNhbGxlZCBfX25ld29ial9fLCBhbmQgaXRzIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBiZSBhCisgICAgICAgICAgICAjIG5ldy1zdHlsZSBjbGFzcy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgX19uZXdvYmpfXworICAgICAgICAgICAgIyBzaG91bGQgYmUgYXMgZm9sbG93cywgYWx0aG91Z2ggcGlja2xlIGhhcyBubyB3YXkgdG8KKyAgICAgICAgICAgICMgdmVyaWZ5IHRoaXM6CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIGRlZiBfX25ld29ial9fKGNscywgKmFyZ3MpOgorICAgICAgICAgICAgIyAgICAgcmV0dXJuIGNscy5fX25ld19fKGNscywgKmFyZ3MpCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFByb3RvY29scyAwIGFuZCAxIHdpbGwgcGlja2xlIGEgcmVmZXJlbmNlIHRvIF9fbmV3b2JqX18sCisgICAgICAgICAgICAjIHdoaWxlIHByb3RvY29sIDIgKGFuZCBhYm92ZSkgd2lsbCBwaWNrbGUgYSByZWZlcmVuY2UgdG8KKyAgICAgICAgICAgICMgY2xzLCB0aGUgcmVtYWluaW5nIGFyZ3MgdHVwbGUsIGFuZCB0aGUgTkVXT0JKIGNvZGUsCisgICAgICAgICAgICAjIHdoaWNoIGNhbGxzIGNscy5fX25ld19fKGNscywgKmFyZ3MpIGF0IHVucGlja2xpbmcgdGltZQorICAgICAgICAgICAgIyAoc2VlIGxvYWRfbmV3b2JqIGJlbG93KS4gIElmIF9fcmVkdWNlX18gcmV0dXJucyBhCisgICAgICAgICAgICAjIHRocmVlLXR1cGxlLCB0aGUgc3RhdGUgZnJvbSB0aGUgdGhpcmQgdHVwbGUgaXRlbSB3aWxsIGJlCisgICAgICAgICAgICAjIHBpY2tsZWQgcmVnYXJkbGVzcyBvZiB0aGUgcHJvdG9jb2wsIGNhbGxpbmcgX19zZXRzdGF0ZV9fCisgICAgICAgICAgICAjIGF0IHVucGlja2xpbmcgdGltZSAoc2VlIGxvYWRfYnVpbGQgYmVsb3cpLgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBOb3RlIHRoYXQgbm8gc3RhbmRhcmQgX19uZXdvYmpfXyBpbXBsZW1lbnRhdGlvbiBleGlzdHM7CisgICAgICAgICAgICAjIHlvdSBoYXZlIHRvIHByb3ZpZGUgeW91ciBvd24uICBUaGlzIGlzIHRvIGVuZm9yY2UKKyAgICAgICAgICAgICMgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjIgKHBpY2tsZXMgd3JpdHRlbiB1c2luZworICAgICAgICAgICAgIyBwcm90b2NvbCAwIG9yIDEgaW4gUHl0aG9uIDIuMyBzaG91bGQgYmUgdW5waWNrbGFibGUgYnkKKyAgICAgICAgICAgICMgUHl0aG9uIDIuMikuCisgICAgICAgICAgICBjbHMgPSBhcmdzWzBdCisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihjbHMsICJfX25ld19fIik6CisgICAgICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImFyZ3NbMF0gZnJvbSBfX25ld29ial9fIGFyZ3MgaGFzIG5vIF9fbmV3X18iKQorICAgICAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lIGFuZCBjbHMgaXMgbm90IG9iai5fX2NsYXNzX186CisgICAgICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgImFyZ3NbMF0gZnJvbSBfX25ld29ial9fIGFyZ3MgaGFzIHRoZSB3cm9uZyBjbGFzcyIpCisgICAgICAgICAgICBhcmdzID0gYXJnc1sxOl0KKyAgICAgICAgICAgIHNhdmUoY2xzKQorICAgICAgICAgICAgc2F2ZShhcmdzKQorICAgICAgICAgICAgd3JpdGUoTkVXT0JKKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2F2ZShmdW5jKQorICAgICAgICAgICAgc2F2ZShhcmdzKQorICAgICAgICAgICAgd3JpdGUoUkVEVUNFKQorCisgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYubWVtb2l6ZShvYmopCisKKyAgICAgICAgIyBNb3JlIG5ldyBzcGVjaWFsIGNhc2VzICh0aGF0IHdvcmsgd2l0aCBvbGRlciBwcm90b2NvbHMgYXMKKyAgICAgICAgIyB3ZWxsKTogd2hlbiBfX3JlZHVjZV9fIHJldHVybnMgYSB0dXBsZSB3aXRoIDQgb3IgNSBpdGVtcywKKyAgICAgICAgIyB0aGUgNHRoIGFuZCA1dGggaXRlbSBzaG91bGQgYmUgaXRlcmF0b3JzIHRoYXQgcHJvdmlkZSBsaXN0CisgICAgICAgICMgaXRlbXMgYW5kIGRpY3QgaXRlbXMgKGFzIChrZXksIHZhbHVlKSB0dXBsZXMpLCBvciBOb25lLgorCisgICAgICAgIGlmIGxpc3RpdGVtcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2JhdGNoX2FwcGVuZHMobGlzdGl0ZW1zKQorCisgICAgICAgIGlmIGRpY3RpdGVtcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2JhdGNoX3NldGl0ZW1zKGRpY3RpdGVtcykKKworICAgICAgICBpZiBzdGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNhdmUoc3RhdGUpCisgICAgICAgICAgICB3cml0ZShCVUlMRCkKKworICAgICMgTWV0aG9kcyBiZWxvdyB0aGlzIHBvaW50IGFyZSBkaXNwYXRjaGVkIHRocm91Z2ggdGhlIGRpc3BhdGNoIHRhYmxlCisKKyAgICBkaXNwYXRjaCA9IHt9CisKKyAgICBkZWYgc2F2ZV9ub25lKHNlbGYsIG9iaik6CisgICAgICAgIHNlbGYud3JpdGUoTk9ORSkKKyAgICBkaXNwYXRjaFtOb25lVHlwZV0gPSBzYXZlX25vbmUKKworICAgIGRlZiBzYXZlX2Jvb2woc2VsZiwgb2JqKToKKyAgICAgICAgaWYgc2VsZi5wcm90byA+PSAyOgorICAgICAgICAgICAgc2VsZi53cml0ZShvYmogYW5kIE5FV1RSVUUgb3IgTkVXRkFMU0UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlKG9iaiBhbmQgVFJVRSBvciBGQUxTRSkKKyAgICBkaXNwYXRjaFtib29sXSA9IHNhdmVfYm9vbAorCisgICAgZGVmIHNhdmVfaW50KHNlbGYsIG9iaiwgcGFjaz1zdHJ1Y3QucGFjayk6CisgICAgICAgIGlmIHNlbGYuYmluOgorICAgICAgICAgICAgIyBJZiB0aGUgaW50IGlzIHNtYWxsIGVub3VnaCB0byBmaXQgaW4gYSBzaWduZWQgNC1ieXRlIDIncy1jb21wCisgICAgICAgICAgICAjIGZvcm1hdCwgd2UgY2FuIHN0b3JlIGl0IG1vcmUgZWZmaWNpZW50bHkgdGhhbiB0aGUgZ2VuZXJhbAorICAgICAgICAgICAgIyBjYXNlLgorICAgICAgICAgICAgIyBGaXJzdCBvbmUtIGFuZCB0d28tYnl0ZSB1bnNpZ25lZCBpbnRzOgorICAgICAgICAgICAgaWYgb2JqID49IDA6CisgICAgICAgICAgICAgICAgaWYgb2JqIDw9IDB4ZmY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoQklOSU5UMSArIGNocihvYmopKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiBvYmogPD0gMHhmZmZmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKCIlYyVjJWMiICUgKEJJTklOVDIsIG9iaiYweGZmLCBvYmo+PjgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICMgTmV4dCBjaGVjayBmb3IgNC1ieXRlIHNpZ25lZCBpbnRzOgorICAgICAgICAgICAgaGlnaF9iaXRzID0gb2JqID4+IDMxICAjIG5vdGUgdGhhdCBQeXRob24gc2hpZnQgc2lnbi1leHRlbmRzCisgICAgICAgICAgICBpZiBoaWdoX2JpdHMgPT0gMCBvciBoaWdoX2JpdHMgPT0gLTE6CisgICAgICAgICAgICAgICAgIyBBbGwgaGlnaCBiaXRzIGFyZSBjb3BpZXMgb2YgYml0IDIqKjMxLCBzbyB0aGUgdmFsdWUKKyAgICAgICAgICAgICAgICAjIGZpdHMgaW4gYSA0LWJ5dGUgc2lnbmVkIGludC4KKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKEJJTklOVCArIHBhY2soIjxpIiwgb2JqKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBUZXh0IHBpY2tsZSwgb3IgaW50IHRvbyBiaWcgdG8gZml0IGluIHNpZ25lZCA0LWJ5dGUgZm9ybWF0LgorICAgICAgICBzZWxmLndyaXRlKElOVCArIHJlcHIob2JqKSArICdcbicpCisgICAgZGlzcGF0Y2hbSW50VHlwZV0gPSBzYXZlX2ludAorCisgICAgZGVmIHNhdmVfbG9uZyhzZWxmLCBvYmosIHBhY2s9c3RydWN0LnBhY2spOgorICAgICAgICBpZiBzZWxmLnByb3RvID49IDI6CisgICAgICAgICAgICBieXRlcyA9IGVuY29kZV9sb25nKG9iaikKKyAgICAgICAgICAgIG4gPSBsZW4oYnl0ZXMpCisgICAgICAgICAgICBpZiBuIDwgMjU2OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoTE9ORzEgKyBjaHIobikgKyBieXRlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZShMT05HNCArIHBhY2soIjxpIiwgbikgKyBieXRlcykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLndyaXRlKExPTkcgKyByZXByKG9iaikgKyAnXG4nKQorICAgIGRpc3BhdGNoW0xvbmdUeXBlXSA9IHNhdmVfbG9uZworCisgICAgZGVmIHNhdmVfZmxvYXQoc2VsZiwgb2JqLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICBzZWxmLndyaXRlKEJJTkZMT0FUICsgcGFjaygnPmQnLCBvYmopKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZShGTE9BVCArIHJlcHIob2JqKSArICdcbicpCisgICAgZGlzcGF0Y2hbRmxvYXRUeXBlXSA9IHNhdmVfZmxvYXQKKworICAgIGRlZiBzYXZlX3N0cmluZyhzZWxmLCBvYmosIHBhY2s9c3RydWN0LnBhY2spOgorICAgICAgICBpZiBzZWxmLmJpbjoKKyAgICAgICAgICAgIG4gPSBsZW4ob2JqKQorICAgICAgICAgICAgaWYgbiA8IDI1NjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlKFNIT1JUX0JJTlNUUklORyArIGNocihuKSArIG9iaikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZShCSU5TVFJJTkcgKyBwYWNrKCI8aSIsIG4pICsgb2JqKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZShTVFJJTkcgKyByZXByKG9iaikgKyAnXG4nKQorICAgICAgICBzZWxmLm1lbW9pemUob2JqKQorICAgIGRpc3BhdGNoW1N0cmluZ1R5cGVdID0gc2F2ZV9zdHJpbmcKKworICAgIGRlZiBzYXZlX3VuaWNvZGUoc2VsZiwgb2JqLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgaWYgc2VsZi5iaW46CisgICAgICAgICAgICBlbmNvZGluZyA9IG9iai5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIG4gPSBsZW4oZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLndyaXRlKEJJTlVOSUNPREUgKyBwYWNrKCI8aSIsIG4pICsgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvYmogPSBvYmoucmVwbGFjZSgiXFwiLCAiXFx1MDA1YyIpCisgICAgICAgICAgICBvYmogPSBvYmoucmVwbGFjZSgiXG4iLCAiXFx1MDAwYSIpCisgICAgICAgICAgICBzZWxmLndyaXRlKFVOSUNPREUgKyBvYmouZW5jb2RlKCdyYXctdW5pY29kZS1lc2NhcGUnKSArICdcbicpCisgICAgICAgIHNlbGYubWVtb2l6ZShvYmopCisgICAgZGlzcGF0Y2hbVW5pY29kZVR5cGVdID0gc2F2ZV91bmljb2RlCisKKyAgICBpZiBTdHJpbmdUeXBlIGlzIFVuaWNvZGVUeXBlOgorICAgICAgICAjIFRoaXMgaXMgdHJ1ZSBmb3IgSnl0aG9uCisgICAgICAgIGRlZiBzYXZlX3N0cmluZyhzZWxmLCBvYmosIHBhY2s9c3RydWN0LnBhY2spOgorICAgICAgICAgICAgdW5pY29kZSA9IG9iai5pc3VuaWNvZGUoKQorCisgICAgICAgICAgICBpZiBzZWxmLmJpbjoKKyAgICAgICAgICAgICAgICBpZiB1bmljb2RlOgorICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmouZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgICAgICAgICAgbCA9IGxlbihvYmopCisgICAgICAgICAgICAgICAgaWYgbCA8IDI1NiBhbmQgbm90IHVuaWNvZGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoU0hPUlRfQklOU1RSSU5HICsgY2hyKGwpICsgb2JqKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHMgPSBwYWNrKCI8aSIsIGwpCisgICAgICAgICAgICAgICAgICAgIGlmIHVuaWNvZGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKEJJTlVOSUNPREUgKyBzICsgb2JqKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShCSU5TVFJJTkcgKyBzICsgb2JqKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiB1bmljb2RlOgorICAgICAgICAgICAgICAgICAgICBvYmogPSBvYmoucmVwbGFjZSgiXFwiLCAiXFx1MDA1YyIpCisgICAgICAgICAgICAgICAgICAgIG9iaiA9IG9iai5yZXBsYWNlKCJcbiIsICJcXHUwMDBhIikKKyAgICAgICAgICAgICAgICAgICAgb2JqID0gb2JqLmVuY29kZSgncmF3LXVuaWNvZGUtZXNjYXBlJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShVTklDT0RFICsgb2JqICsgJ1xuJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndyaXRlKFNUUklORyArIHJlcHIob2JqKSArICdcbicpCisgICAgICAgICAgICBzZWxmLm1lbW9pemUob2JqKQorICAgICAgICBkaXNwYXRjaFtTdHJpbmdUeXBlXSA9IHNhdmVfc3RyaW5nCisKKyAgICBkZWYgc2F2ZV90dXBsZShzZWxmLCBvYmopOgorICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKKyAgICAgICAgcHJvdG8gPSBzZWxmLnByb3RvCisKKyAgICAgICAgbiA9IGxlbihvYmopCisgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgIGlmIHByb3RvOgorICAgICAgICAgICAgICAgIHdyaXRlKEVNUFRZX1RVUExFKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3cml0ZShNQVJLICsgVFVQTEUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzYXZlID0gc2VsZi5zYXZlCisgICAgICAgIG1lbW8gPSBzZWxmLm1lbW8KKyAgICAgICAgaWYgbiA8PSAzIGFuZCBwcm90byA+PSAyOgorICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gb2JqOgorICAgICAgICAgICAgICAgIHNhdmUoZWxlbWVudCkKKyAgICAgICAgICAgICMgU3VidGxlLiAgU2FtZSBhcyBpbiB0aGUgYmlnIGNvbW1lbnQgYmVsb3cuCisgICAgICAgICAgICBpZiBpZChvYmopIGluIG1lbW86CisgICAgICAgICAgICAgICAgZ2V0ID0gc2VsZi5nZXQobWVtb1tpZChvYmopXVswXSkKKyAgICAgICAgICAgICAgICB3cml0ZShQT1AgKiBuICsgZ2V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3cml0ZShfdHVwbGVzaXplMmNvZGVbbl0pCisgICAgICAgICAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgcHJvdG8gMCBvciBwcm90byAxIGFuZCB0dXBsZSBpc24ndCBlbXB0eSwgb3IgcHJvdG8gPiAxIGFuZCB0dXBsZQorICAgICAgICAjIGhhcyBtb3JlIHRoYW4gMyBlbGVtZW50cy4KKyAgICAgICAgd3JpdGUoTUFSSykKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gb2JqOgorICAgICAgICAgICAgc2F2ZShlbGVtZW50KQorCisgICAgICAgIGlmIGlkKG9iaikgaW4gbWVtbzoKKyAgICAgICAgICAgICMgU3VidGxlLiAgZCB3YXMgbm90IGluIG1lbW8gd2hlbiB3ZSBlbnRlcmVkIHNhdmVfdHVwbGUoKSwgc28KKyAgICAgICAgICAgICMgdGhlIHByb2Nlc3Mgb2Ygc2F2aW5nIHRoZSB0dXBsZSdzIGVsZW1lbnRzIG11c3QgaGF2ZSBzYXZlZAorICAgICAgICAgICAgIyB0aGUgdHVwbGUgaXRzZWxmOiAgdGhlIHR1cGxlIGlzIHJlY3Vyc2l2ZS4gIFRoZSBwcm9wZXIgYWN0aW9uCisgICAgICAgICAgICAjIG5vdyBpcyB0byB0aHJvdyBhd2F5IGV2ZXJ5dGhpbmcgd2UgcHV0IG9uIHRoZSBzdGFjaywgYW5kCisgICAgICAgICAgICAjIHNpbXBseSBHRVQgdGhlIHR1cGxlIChpdCdzIGFscmVhZHkgY29uc3RydWN0ZWQpLiAgVGhpcyBjaGVjaworICAgICAgICAgICAgIyBjb3VsZCBoYXZlIGJlZW4gZG9uZSBpbiB0aGUgImZvciBlbGVtZW50IiBsb29wIGluc3RlYWQsIGJ1dAorICAgICAgICAgICAgIyByZWN1cnNpdmUgdHVwbGVzIGFyZSBhIHJhcmUgdGhpbmcuCisgICAgICAgICAgICBnZXQgPSBzZWxmLmdldChtZW1vW2lkKG9iaildWzBdKQorICAgICAgICAgICAgaWYgcHJvdG86CisgICAgICAgICAgICAgICAgd3JpdGUoUE9QX01BUksgKyBnZXQpCisgICAgICAgICAgICBlbHNlOiAgICMgcHJvdG8gMCAtLSBQT1BfTUFSSyBub3QgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgd3JpdGUoUE9QICogKG4rMSkgKyBnZXQpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIE5vIHJlY3Vyc2lvbi4KKyAgICAgICAgc2VsZi53cml0ZShUVVBMRSkKKyAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKworICAgIGRpc3BhdGNoW1R1cGxlVHlwZV0gPSBzYXZlX3R1cGxlCisKKyAgICAjIHNhdmVfZW1wdHlfdHVwbGUoKSBpc24ndCB1c2VkIGJ5IGFueXRoaW5nIGluIFB5dGhvbiAyLjMuICBIb3dldmVyLCBJCisgICAgIyBmb3VuZCBhIFBpY2tsZXIgc3ViY2xhc3MgaW4gWm9wZTMgdGhhdCBjYWxscyBpdCwgc28gaXQncyBub3QgaGFybWxlc3MKKyAgICAjIHRvIHJlbW92ZSBpdC4KKyAgICBkZWYgc2F2ZV9lbXB0eV90dXBsZShzZWxmLCBvYmopOgorICAgICAgICBzZWxmLndyaXRlKEVNUFRZX1RVUExFKQorCisgICAgZGVmIHNhdmVfbGlzdChzZWxmLCBvYmopOgorICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKKworICAgICAgICBpZiBzZWxmLmJpbjoKKyAgICAgICAgICAgIHdyaXRlKEVNUFRZX0xJU1QpCisgICAgICAgIGVsc2U6ICAgIyBwcm90byAwIC0tIGNhbid0IHVzZSBFTVBUWV9MSVNUCisgICAgICAgICAgICB3cml0ZShNQVJLICsgTElTVCkKKworICAgICAgICBzZWxmLm1lbW9pemUob2JqKQorICAgICAgICBzZWxmLl9iYXRjaF9hcHBlbmRzKGl0ZXIob2JqKSkKKworICAgIGRpc3BhdGNoW0xpc3RUeXBlXSA9IHNhdmVfbGlzdAorCisgICAgIyBLZWVwIGluIHN5bmNoIHdpdGggY1BpY2tsZSdzIEJBVENIU0laRS4gIE5vdGhpbmcgd2lsbCBicmVhayBpZiBpdCBnZXRzCisgICAgIyBvdXQgb2Ygc3luY2gsIHRob3VnaC4KKyAgICBfQkFUQ0hTSVpFID0gMTAwMAorCisgICAgZGVmIF9iYXRjaF9hcHBlbmRzKHNlbGYsIGl0ZW1zKToKKyAgICAgICAgIyBIZWxwZXIgdG8gYmF0Y2ggdXAgQVBQRU5EUyBzZXF1ZW5jZXMKKyAgICAgICAgc2F2ZSA9IHNlbGYuc2F2ZQorICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKKworICAgICAgICBpZiBub3Qgc2VsZi5iaW46CisgICAgICAgICAgICBmb3IgeCBpbiBpdGVtczoKKyAgICAgICAgICAgICAgICBzYXZlKHgpCisgICAgICAgICAgICAgICAgd3JpdGUoQVBQRU5EKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgciA9IHhyYW5nZShzZWxmLl9CQVRDSFNJWkUpCisgICAgICAgIHdoaWxlIGl0ZW1zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdG1wID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gaXRlbXMubmV4dCgpCisgICAgICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoeCkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBuID0gbGVuKHRtcCkKKyAgICAgICAgICAgIGlmIG4gPiAxOgorICAgICAgICAgICAgICAgIHdyaXRlKE1BUkspCisgICAgICAgICAgICAgICAgZm9yIHggaW4gdG1wOgorICAgICAgICAgICAgICAgICAgICBzYXZlKHgpCisgICAgICAgICAgICAgICAgd3JpdGUoQVBQRU5EUykKKyAgICAgICAgICAgIGVsaWYgbjoKKyAgICAgICAgICAgICAgICBzYXZlKHRtcFswXSkKKyAgICAgICAgICAgICAgICB3cml0ZShBUFBFTkQpCisgICAgICAgICAgICAjIGVsc2UgdG1wIGlzIGVtcHR5LCBhbmQgd2UncmUgZG9uZQorCisgICAgZGVmIHNhdmVfZGljdChzZWxmLCBvYmopOgorICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKKworICAgICAgICBpZiBzZWxmLmJpbjoKKyAgICAgICAgICAgIHdyaXRlKEVNUFRZX0RJQ1QpCisgICAgICAgIGVsc2U6ICAgIyBwcm90byAwIC0tIGNhbid0IHVzZSBFTVBUWV9ESUNUCisgICAgICAgICAgICB3cml0ZShNQVJLICsgRElDVCkKKworICAgICAgICBzZWxmLm1lbW9pemUob2JqKQorICAgICAgICBzZWxmLl9iYXRjaF9zZXRpdGVtcyhvYmouaXRlcml0ZW1zKCkpCisKKyAgICBkaXNwYXRjaFtEaWN0aW9uYXJ5VHlwZV0gPSBzYXZlX2RpY3QKKyAgICBpZiBub3QgUHlTdHJpbmdNYXAgaXMgTm9uZToKKyAgICAgICAgZGlzcGF0Y2hbUHlTdHJpbmdNYXBdID0gc2F2ZV9kaWN0CisKKyAgICBkZWYgX2JhdGNoX3NldGl0ZW1zKHNlbGYsIGl0ZW1zKToKKyAgICAgICAgIyBIZWxwZXIgdG8gYmF0Y2ggdXAgU0VUSVRFTVMgc2VxdWVuY2VzOyBwcm90byA+PSAxIG9ubHkKKyAgICAgICAgc2F2ZSA9IHNlbGYuc2F2ZQorICAgICAgICB3cml0ZSA9IHNlbGYud3JpdGUKKworICAgICAgICBpZiBub3Qgc2VsZi5iaW46CisgICAgICAgICAgICBmb3IgaywgdiBpbiBpdGVtczoKKyAgICAgICAgICAgICAgICBzYXZlKGspCisgICAgICAgICAgICAgICAgc2F2ZSh2KQorICAgICAgICAgICAgICAgIHdyaXRlKFNFVElURU0pCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICByID0geHJhbmdlKHNlbGYuX0JBVENIU0laRSkKKyAgICAgICAgd2hpbGUgaXRlbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0bXAgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRtcC5hcHBlbmQoaXRlbXMubmV4dCgpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBpdGVtcyA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG4gPSBsZW4odG1wKQorICAgICAgICAgICAgaWYgbiA+IDE6CisgICAgICAgICAgICAgICAgd3JpdGUoTUFSSykKKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiB0bXA6CisgICAgICAgICAgICAgICAgICAgIHNhdmUoaykKKyAgICAgICAgICAgICAgICAgICAgc2F2ZSh2KQorICAgICAgICAgICAgICAgIHdyaXRlKFNFVElURU1TKQorICAgICAgICAgICAgZWxpZiBuOgorICAgICAgICAgICAgICAgIGssIHYgPSB0bXBbMF0KKyAgICAgICAgICAgICAgICBzYXZlKGspCisgICAgICAgICAgICAgICAgc2F2ZSh2KQorICAgICAgICAgICAgICAgIHdyaXRlKFNFVElURU0pCisgICAgICAgICAgICAjIGVsc2UgdG1wIGlzIGVtcHR5LCBhbmQgd2UncmUgZG9uZQorCisgICAgZGVmIHNhdmVfaW5zdChzZWxmLCBvYmopOgorICAgICAgICBjbHMgPSBvYmouX19jbGFzc19fCisKKyAgICAgICAgbWVtbyAgPSBzZWxmLm1lbW8KKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisgICAgICAgIHNhdmUgID0gc2VsZi5zYXZlCisKKyAgICAgICAgaWYgaGFzYXR0cihvYmosICdfX2dldGluaXRhcmdzX18nKToKKyAgICAgICAgICAgIGFyZ3MgPSBvYmouX19nZXRpbml0YXJnc19fKCkKKyAgICAgICAgICAgIGxlbihhcmdzKSAjIFhYWCBBc3NlcnQgaXQncyBhIHNlcXVlbmNlCisgICAgICAgICAgICBfa2VlcF9hbGl2ZShhcmdzLCBtZW1vKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncyA9ICgpCisKKyAgICAgICAgd3JpdGUoTUFSSykKKworICAgICAgICBpZiBzZWxmLmJpbjoKKyAgICAgICAgICAgIHNhdmUoY2xzKQorICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIHNhdmUoYXJnKQorICAgICAgICAgICAgd3JpdGUoT0JKKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIHNhdmUoYXJnKQorICAgICAgICAgICAgd3JpdGUoSU5TVCArIGNscy5fX21vZHVsZV9fICsgJ1xuJyArIGNscy5fX25hbWVfXyArICdcbicpCisKKyAgICAgICAgc2VsZi5tZW1vaXplKG9iaikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBnZXRzdGF0ZSA9IG9iai5fX2dldHN0YXRlX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc3R1ZmYgPSBvYmouX19kaWN0X18KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0dWZmID0gZ2V0c3RhdGUoKQorICAgICAgICAgICAgX2tlZXBfYWxpdmUoc3R1ZmYsIG1lbW8pCisgICAgICAgIHNhdmUoc3R1ZmYpCisgICAgICAgIHdyaXRlKEJVSUxEKQorCisgICAgZGlzcGF0Y2hbSW5zdGFuY2VUeXBlXSA9IHNhdmVfaW5zdAorCisgICAgZGVmIHNhdmVfZ2xvYmFsKHNlbGYsIG9iaiwgbmFtZT1Ob25lLCBwYWNrPXN0cnVjdC5wYWNrKToKKyAgICAgICAgd3JpdGUgPSBzZWxmLndyaXRlCisgICAgICAgIG1lbW8gPSBzZWxmLm1lbW8KKworICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBuYW1lID0gb2JqLl9fbmFtZV9fCisKKyAgICAgICAgbW9kdWxlID0gZ2V0YXR0cihvYmosICJfX21vZHVsZV9fIiwgTm9uZSkKKyAgICAgICAgaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2R1bGUgPSB3aGljaG1vZHVsZShvYmosIG5hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX19pbXBvcnRfXyhtb2R1bGUpCisgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2R1bGVdCisgICAgICAgICAgICBrbGFzcyA9IGdldGF0dHIobW9kLCBuYW1lKQorICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBLZXlFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgcmFpc2UgUGlja2xpbmdFcnJvcigKKyAgICAgICAgICAgICAgICAiQ2FuJ3QgcGlja2xlICVyOiBpdCdzIG5vdCBmb3VuZCBhcyAlcy4lcyIgJQorICAgICAgICAgICAgICAgIChvYmosIG1vZHVsZSwgbmFtZSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBrbGFzcyBpcyBub3Qgb2JqOgorICAgICAgICAgICAgICAgIHJhaXNlIFBpY2tsaW5nRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBwaWNrbGUgJXI6IGl0J3Mgbm90IHRoZSBzYW1lIG9iamVjdCBhcyAlcy4lcyIgJQorICAgICAgICAgICAgICAgICAgICAob2JqLCBtb2R1bGUsIG5hbWUpKQorCisgICAgICAgIGlmIHNlbGYucHJvdG8gPj0gMjoKKyAgICAgICAgICAgIGNvZGUgPSBfZXh0ZW5zaW9uX3JlZ2lzdHJ5LmdldCgobW9kdWxlLCBuYW1lKSkKKyAgICAgICAgICAgIGlmIGNvZGU6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGNvZGUgPiAwCisgICAgICAgICAgICAgICAgaWYgY29kZSA8PSAweGZmOgorICAgICAgICAgICAgICAgICAgICB3cml0ZShFWFQxICsgY2hyKGNvZGUpKQorICAgICAgICAgICAgICAgIGVsaWYgY29kZSA8PSAweGZmZmY6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKCIlYyVjJWMiICUgKEVYVDIsIGNvZGUmMHhmZiwgY29kZT4+OCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoRVhUNCArIHBhY2soIjxpIiwgY29kZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgd3JpdGUoR0xPQkFMICsgbW9kdWxlICsgJ1xuJyArIG5hbWUgKyAnXG4nKQorICAgICAgICBzZWxmLm1lbW9pemUob2JqKQorCisgICAgZGlzcGF0Y2hbQ2xhc3NUeXBlXSA9IHNhdmVfZ2xvYmFsCisgICAgZGlzcGF0Y2hbRnVuY3Rpb25UeXBlXSA9IHNhdmVfZ2xvYmFsCisgICAgZGlzcGF0Y2hbQnVpbHRpbkZ1bmN0aW9uVHlwZV0gPSBzYXZlX2dsb2JhbAorICAgIGRpc3BhdGNoW1R5cGVUeXBlXSA9IHNhdmVfZ2xvYmFsCisKKyMgUGlja2xpbmcgaGVscGVycworCitkZWYgX2tlZXBfYWxpdmUoeCwgbWVtbyk6CisgICAgIiIiS2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB4IGluIHRoZSBtZW1vLgorCisgICAgQmVjYXVzZSB3ZSByZW1lbWJlciBvYmplY3RzIGJ5IHRoZWlyIGlkLCB3ZSBoYXZlCisgICAgdG8gYXNzdXJlIHRoYXQgcG9zc2libHkgdGVtcG9yYXJ5IG9iamVjdHMgYXJlIGtlcHQKKyAgICBhbGl2ZSBieSByZWZlcmVuY2luZyB0aGVtLgorICAgIFdlIHN0b3JlIGEgcmVmZXJlbmNlIGF0IHRoZSBpZCBvZiB0aGUgbWVtbywgd2hpY2ggc2hvdWxkCisgICAgbm9ybWFsbHkgbm90IGJlIHVzZWQgdW5sZXNzIHNvbWVvbmUgdHJpZXMgdG8gZGVlcGNvcHkKKyAgICB0aGUgbWVtbyBpdHNlbGYuLi4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIG1lbW9baWQobWVtbyldLmFwcGVuZCh4KQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgIyBhaGEsIHRoaXMgaXMgdGhlIGZpcnN0IG9uZSA6LSkKKyAgICAgICAgbWVtb1tpZChtZW1vKV09W3hdCisKKworIyBBIGNhY2hlIGZvciB3aGljaG1vZHVsZSgpLCBtYXBwaW5nIGEgZnVuY3Rpb24gb2JqZWN0IHRvIHRoZSBuYW1lIG9mCisjIHRoZSBtb2R1bGUgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBmb3VuZC4KKworY2xhc3NtYXAgPSB7fSAjIGNhbGxlZCBjbGFzc21hcCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKKworZGVmIHdoaWNobW9kdWxlKGZ1bmMsIGZ1bmNuYW1lKToKKyAgICAiIiJGaWd1cmUgb3V0IHRoZSBtb2R1bGUgaW4gd2hpY2ggYSBmdW5jdGlvbiBvY2N1cnMuCisKKyAgICBTZWFyY2ggc3lzLm1vZHVsZXMgZm9yIHRoZSBtb2R1bGUuCisgICAgQ2FjaGUgaW4gY2xhc3NtYXAuCisgICAgUmV0dXJuIGEgbW9kdWxlIG5hbWUuCisgICAgSWYgdGhlIGZ1bmN0aW9uIGNhbm5vdCBiZSBmb3VuZCwgcmV0dXJuICJfX21haW5fXyIuCisgICAgIiIiCisgICAgIyBQeXRob24gZnVuY3Rpb25zIHNob3VsZCBhbHdheXMgZ2V0IGFuIF9fbW9kdWxlX18gZnJvbSB0aGVpciBnbG9iYWxzLgorICAgIG1vZCA9IGdldGF0dHIoZnVuYywgIl9fbW9kdWxlX18iLCBOb25lKQorICAgIGlmIG1vZCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIG1vZAorICAgIGlmIGZ1bmMgaW4gY2xhc3NtYXA6CisgICAgICAgIHJldHVybiBjbGFzc21hcFtmdW5jXQorCisgICAgZm9yIG5hbWUsIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5pdGVtcygpOgorICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRpbnVlICMgc2tpcCBkdW1teSBwYWNrYWdlIGVudHJpZXMKKyAgICAgICAgaWYgbmFtZSAhPSAnX19tYWluX18nIGFuZCBnZXRhdHRyKG1vZHVsZSwgZnVuY25hbWUsIE5vbmUpIGlzIGZ1bmM6CisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIG5hbWUgPSAnX19tYWluX18nCisgICAgY2xhc3NtYXBbZnVuY10gPSBuYW1lCisgICAgcmV0dXJuIG5hbWUKKworCisjIFVucGlja2xpbmcgbWFjaGluZXJ5CisKK2NsYXNzIFVucGlja2xlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlKToKKyAgICAgICAgIiIiVGhpcyB0YWtlcyBhIGZpbGUtbGlrZSBvYmplY3QgZm9yIHJlYWRpbmcgYSBwaWNrbGUgZGF0YSBzdHJlYW0uCisKKyAgICAgICAgVGhlIHByb3RvY29sIHZlcnNpb24gb2YgdGhlIHBpY2tsZSBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5LCBzbyBubworICAgICAgICBwcm90byBhcmd1bWVudCBpcyBuZWVkZWQuCisKKyAgICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgbXVzdCBoYXZlIHR3byBtZXRob2RzLCBhIHJlYWQoKSBtZXRob2QgdGhhdAorICAgICAgICB0YWtlcyBhbiBpbnRlZ2VyIGFyZ3VtZW50LCBhbmQgYSByZWFkbGluZSgpIG1ldGhvZCB0aGF0IHJlcXVpcmVzIG5vCisgICAgICAgIGFyZ3VtZW50cy4gIEJvdGggbWV0aG9kcyBzaG91bGQgcmV0dXJuIGEgc3RyaW5nLiAgVGh1cyBmaWxlLWxpa2UKKyAgICAgICAgb2JqZWN0IGNhbiBiZSBhIGZpbGUgb2JqZWN0IG9wZW5lZCBmb3IgcmVhZGluZywgYSBTdHJpbmdJTyBvYmplY3QsCisgICAgICAgIG9yIGFueSBvdGhlciBjdXN0b20gb2JqZWN0IHRoYXQgbWVldHMgdGhpcyBpbnRlcmZhY2UuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnJlYWRsaW5lID0gZmlsZS5yZWFkbGluZQorICAgICAgICBzZWxmLnJlYWQgPSBmaWxlLnJlYWQKKyAgICAgICAgc2VsZi5tZW1vID0ge30KKworICAgIGRlZiBsb2FkKHNlbGYpOgorICAgICAgICAiIiJSZWFkIGEgcGlja2xlZCBvYmplY3QgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUgb3BlbiBmaWxlLgorCisgICAgICAgIFJldHVybiB0aGUgcmVjb25zdGl0dXRlZCBvYmplY3QgaGllcmFyY2h5IHNwZWNpZmllZCBpbiB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYubWFyayA9IG9iamVjdCgpICMgYW55IG5ldyB1bmlxdWUgb2JqZWN0CisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmFwcGVuZCA9IHNlbGYuc3RhY2suYXBwZW5kCisgICAgICAgIHJlYWQgPSBzZWxmLnJlYWQKKyAgICAgICAgZGlzcGF0Y2ggPSBzZWxmLmRpc3BhdGNoCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAga2V5ID0gcmVhZCgxKQorICAgICAgICAgICAgICAgIGRpc3BhdGNoW2tleV0oc2VsZikKKyAgICAgICAgZXhjZXB0IF9TdG9wLCBzdG9waW5zdDoKKyAgICAgICAgICAgIHJldHVybiBzdG9waW5zdC52YWx1ZQorCisgICAgIyBSZXR1cm4gbGFyZ2VzdCBpbmRleCBrIHN1Y2ggdGhhdCBzZWxmLnN0YWNrW2tdIGlzIHNlbGYubWFyay4KKyAgICAjIElmIHRoZSBzdGFjayBkb2Vzbid0IGNvbnRhaW4gYSBtYXJrLCBldmVudHVhbGx5IHJhaXNlcyBJbmRleEVycm9yLgorICAgICMgVGhpcyBjb3VsZCBiZSBzcGVkIGJ5IG1haW50YWluaW5nIGFub3RoZXIgc3RhY2ssIG9mIGluZGljZXMgYXQgd2hpY2gKKyAgICAjIHRoZSBtYXJrIGFwcGVhcnMuICBGb3IgdGhhdCBtYXR0ZXIsIHRoZSBsYXR0ZXIgc3RhY2sgd291bGQgc3VmZmljZSwKKyAgICAjIGFuZCB3ZSB3b3VsZG4ndCBuZWVkIHRvIHB1c2ggbWFyayBvYmplY3RzIG9uIHNlbGYuc3RhY2sgYXQgYWxsLgorICAgICMgRG9pbmcgc28gaXMgcHJvYmFibHkgYSBnb29kIHRoaW5nLCB0aG91Z2gsIHNpbmNlIGlmIHRoZSBwaWNrbGUgaXMKKyAgICAjIGNvcnJ1cHQgKG9yIGhvc3RpbGUpIHdlIG1heSBnZXQgYSBjbHVlIGZyb20gZmluZGluZyBzZWxmLm1hcmsgZW1iZWRkZWQKKyAgICAjIGluIHVucGlja2xlZCBvYmplY3RzLgorICAgIGRlZiBtYXJrZXIoc2VsZik6CisgICAgICAgIHN0YWNrID0gc2VsZi5zdGFjaworICAgICAgICBtYXJrID0gc2VsZi5tYXJrCisgICAgICAgIGsgPSBsZW4oc3RhY2spLTEKKyAgICAgICAgd2hpbGUgc3RhY2tba10gaXMgbm90IG1hcms6IGsgPSBrLTEKKyAgICAgICAgcmV0dXJuIGsKKworICAgIGRpc3BhdGNoID0ge30KKworICAgIGRlZiBsb2FkX2VvZihzZWxmKToKKyAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICBkaXNwYXRjaFsnJ10gPSBsb2FkX2VvZgorCisgICAgZGVmIGxvYWRfcHJvdG8oc2VsZik6CisgICAgICAgIHByb3RvID0gb3JkKHNlbGYucmVhZCgxKSkKKyAgICAgICAgaWYgbm90IDAgPD0gcHJvdG8gPD0gMjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ1bnN1cHBvcnRlZCBwaWNrbGUgcHJvdG9jb2w6ICVkIiAlIHByb3RvCisgICAgZGlzcGF0Y2hbUFJPVE9dID0gbG9hZF9wcm90bworCisgICAgZGVmIGxvYWRfcGVyc2lkKHNlbGYpOgorICAgICAgICBwaWQgPSBzZWxmLnJlYWRsaW5lKClbOi0xXQorICAgICAgICBzZWxmLmFwcGVuZChzZWxmLnBlcnNpc3RlbnRfbG9hZChwaWQpKQorICAgIGRpc3BhdGNoW1BFUlNJRF0gPSBsb2FkX3BlcnNpZAorCisgICAgZGVmIGxvYWRfYmlucGVyc2lkKHNlbGYpOgorICAgICAgICBwaWQgPSBzZWxmLnN0YWNrLnBvcCgpCisgICAgICAgIHNlbGYuYXBwZW5kKHNlbGYucGVyc2lzdGVudF9sb2FkKHBpZCkpCisgICAgZGlzcGF0Y2hbQklOUEVSU0lEXSA9IGxvYWRfYmlucGVyc2lkCisKKyAgICBkZWYgbG9hZF9ub25lKHNlbGYpOgorICAgICAgICBzZWxmLmFwcGVuZChOb25lKQorICAgIGRpc3BhdGNoW05PTkVdID0gbG9hZF9ub25lCisKKyAgICBkZWYgbG9hZF9mYWxzZShzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQoRmFsc2UpCisgICAgZGlzcGF0Y2hbTkVXRkFMU0VdID0gbG9hZF9mYWxzZQorCisgICAgZGVmIGxvYWRfdHJ1ZShzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQoVHJ1ZSkKKyAgICBkaXNwYXRjaFtORVdUUlVFXSA9IGxvYWRfdHJ1ZQorCisgICAgZGVmIGxvYWRfaW50KHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5yZWFkbGluZSgpCisgICAgICAgIGlmIGRhdGEgPT0gRkFMU0VbMTpdOgorICAgICAgICAgICAgdmFsID0gRmFsc2UKKyAgICAgICAgZWxpZiBkYXRhID09IFRSVUVbMTpdOgorICAgICAgICAgICAgdmFsID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbCA9IGludChkYXRhKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgdmFsID0gbG9uZyhkYXRhKQorICAgICAgICBzZWxmLmFwcGVuZCh2YWwpCisgICAgZGlzcGF0Y2hbSU5UXSA9IGxvYWRfaW50CisKKyAgICBkZWYgbG9hZF9iaW5pbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKG1sb2FkcygnaScgKyBzZWxmLnJlYWQoNCkpKQorICAgIGRpc3BhdGNoW0JJTklOVF0gPSBsb2FkX2JpbmludAorCisgICAgZGVmIGxvYWRfYmluaW50MShzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQob3JkKHNlbGYucmVhZCgxKSkpCisgICAgZGlzcGF0Y2hbQklOSU5UMV0gPSBsb2FkX2JpbmludDEKKworICAgIGRlZiBsb2FkX2JpbmludDIoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKG1sb2FkcygnaScgKyBzZWxmLnJlYWQoMikgKyAnXDAwMFwwMDAnKSkKKyAgICBkaXNwYXRjaFtCSU5JTlQyXSA9IGxvYWRfYmluaW50MgorCisgICAgZGVmIGxvYWRfbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQobG9uZyhzZWxmLnJlYWRsaW5lKClbOi0xXSwgMCkpCisgICAgZGlzcGF0Y2hbTE9OR10gPSBsb2FkX2xvbmcKKworICAgIGRlZiBsb2FkX2xvbmcxKHNlbGYpOgorICAgICAgICBuID0gb3JkKHNlbGYucmVhZCgxKSkKKyAgICAgICAgYnl0ZXMgPSBzZWxmLnJlYWQobikKKyAgICAgICAgc2VsZi5hcHBlbmQoZGVjb2RlX2xvbmcoYnl0ZXMpKQorICAgIGRpc3BhdGNoW0xPTkcxXSA9IGxvYWRfbG9uZzEKKworICAgIGRlZiBsb2FkX2xvbmc0KHNlbGYpOgorICAgICAgICBuID0gbWxvYWRzKCdpJyArIHNlbGYucmVhZCg0KSkKKyAgICAgICAgYnl0ZXMgPSBzZWxmLnJlYWQobikKKyAgICAgICAgc2VsZi5hcHBlbmQoZGVjb2RlX2xvbmcoYnl0ZXMpKQorICAgIGRpc3BhdGNoW0xPTkc0XSA9IGxvYWRfbG9uZzQKKworICAgIGRlZiBsb2FkX2Zsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLmFwcGVuZChmbG9hdChzZWxmLnJlYWRsaW5lKClbOi0xXSkpCisgICAgZGlzcGF0Y2hbRkxPQVRdID0gbG9hZF9mbG9hdAorCisgICAgZGVmIGxvYWRfYmluZmxvYXQoc2VsZiwgdW5wYWNrPXN0cnVjdC51bnBhY2spOgorICAgICAgICBzZWxmLmFwcGVuZCh1bnBhY2soJz5kJywgc2VsZi5yZWFkKDgpKVswXSkKKyAgICBkaXNwYXRjaFtCSU5GTE9BVF0gPSBsb2FkX2JpbmZsb2F0CisKKyAgICBkZWYgbG9hZF9zdHJpbmcoc2VsZik6CisgICAgICAgIHJlcCA9IHNlbGYucmVhZGxpbmUoKVs6LTFdCisgICAgICAgIGZvciBxIGluICJcIiciOiAjIGRvdWJsZSBvciBzaW5nbGUgcXVvdGUKKyAgICAgICAgICAgIGlmIHJlcC5zdGFydHN3aXRoKHEpOgorICAgICAgICAgICAgICAgIGlmIGxlbihyZXApIDwgMiBvciBub3QgcmVwLmVuZHN3aXRoKHEpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiaW5zZWN1cmUgc3RyaW5nIHBpY2tsZSIKKyAgICAgICAgICAgICAgICByZXAgPSByZXBbbGVuKHEpOi1sZW4ocSldCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJpbnNlY3VyZSBzdHJpbmcgcGlja2xlIgorICAgICAgICBzZWxmLmFwcGVuZChyZXAuZGVjb2RlKCJzdHJpbmctZXNjYXBlIikpCisgICAgZGlzcGF0Y2hbU1RSSU5HXSA9IGxvYWRfc3RyaW5nCisKKyAgICBkZWYgbG9hZF9iaW5zdHJpbmcoc2VsZik6CisgICAgICAgIGxlbiA9IG1sb2FkcygnaScgKyBzZWxmLnJlYWQoNCkpCisgICAgICAgIHNlbGYuYXBwZW5kKHNlbGYucmVhZChsZW4pKQorICAgIGRpc3BhdGNoW0JJTlNUUklOR10gPSBsb2FkX2JpbnN0cmluZworCisgICAgZGVmIGxvYWRfdW5pY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQodW5pY29kZShzZWxmLnJlYWRsaW5lKClbOi0xXSwncmF3LXVuaWNvZGUtZXNjYXBlJykpCisgICAgZGlzcGF0Y2hbVU5JQ09ERV0gPSBsb2FkX3VuaWNvZGUKKworICAgIGRlZiBsb2FkX2JpbnVuaWNvZGUoc2VsZik6CisgICAgICAgIGxlbiA9IG1sb2FkcygnaScgKyBzZWxmLnJlYWQoNCkpCisgICAgICAgIHNlbGYuYXBwZW5kKHVuaWNvZGUoc2VsZi5yZWFkKGxlbiksJ3V0Zi04JykpCisgICAgZGlzcGF0Y2hbQklOVU5JQ09ERV0gPSBsb2FkX2JpbnVuaWNvZGUKKworICAgIGRlZiBsb2FkX3Nob3J0X2JpbnN0cmluZyhzZWxmKToKKyAgICAgICAgbGVuID0gb3JkKHNlbGYucmVhZCgxKSkKKyAgICAgICAgc2VsZi5hcHBlbmQoc2VsZi5yZWFkKGxlbikpCisgICAgZGlzcGF0Y2hbU0hPUlRfQklOU1RSSU5HXSA9IGxvYWRfc2hvcnRfYmluc3RyaW5nCisKKyAgICBkZWYgbG9hZF90dXBsZShzZWxmKToKKyAgICAgICAgayA9IHNlbGYubWFya2VyKCkKKyAgICAgICAgc2VsZi5zdGFja1trOl0gPSBbdHVwbGUoc2VsZi5zdGFja1trKzE6XSldCisgICAgZGlzcGF0Y2hbVFVQTEVdID0gbG9hZF90dXBsZQorCisgICAgZGVmIGxvYWRfZW1wdHlfdHVwbGUoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKCgpKQorICAgIGRpc3BhdGNoW0VNUFRZX1RVUExFXSA9IGxvYWRfZW1wdHlfdHVwbGUKKworICAgIGRlZiBsb2FkX3R1cGxlMShzZWxmKToKKyAgICAgICAgc2VsZi5zdGFja1stMV0gPSAoc2VsZi5zdGFja1stMV0sKQorICAgIGRpc3BhdGNoW1RVUExFMV0gPSBsb2FkX3R1cGxlMQorCisgICAgZGVmIGxvYWRfdHVwbGUyKHNlbGYpOgorICAgICAgICBzZWxmLnN0YWNrWy0yOl0gPSBbKHNlbGYuc3RhY2tbLTJdLCBzZWxmLnN0YWNrWy0xXSldCisgICAgZGlzcGF0Y2hbVFVQTEUyXSA9IGxvYWRfdHVwbGUyCisKKyAgICBkZWYgbG9hZF90dXBsZTMoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2tbLTM6XSA9IFsoc2VsZi5zdGFja1stM10sIHNlbGYuc3RhY2tbLTJdLCBzZWxmLnN0YWNrWy0xXSldCisgICAgZGlzcGF0Y2hbVFVQTEUzXSA9IGxvYWRfdHVwbGUzCisKKyAgICBkZWYgbG9hZF9lbXB0eV9saXN0KHNlbGYpOgorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZChbXSkKKyAgICBkaXNwYXRjaFtFTVBUWV9MSVNUXSA9IGxvYWRfZW1wdHlfbGlzdAorCisgICAgZGVmIGxvYWRfZW1wdHlfZGljdGlvbmFyeShzZWxmKToKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoe30pCisgICAgZGlzcGF0Y2hbRU1QVFlfRElDVF0gPSBsb2FkX2VtcHR5X2RpY3Rpb25hcnkKKworICAgIGRlZiBsb2FkX2xpc3Qoc2VsZik6CisgICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCisgICAgICAgIHNlbGYuc3RhY2tbazpdID0gW3NlbGYuc3RhY2tbaysxOl1dCisgICAgZGlzcGF0Y2hbTElTVF0gPSBsb2FkX2xpc3QKKworICAgIGRlZiBsb2FkX2RpY3Qoc2VsZik6CisgICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCisgICAgICAgIGQgPSB7fQorICAgICAgICBpdGVtcyA9IHNlbGYuc3RhY2tbaysxOl0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGl0ZW1zKSwgMik6CisgICAgICAgICAgICBrZXkgPSBpdGVtc1tpXQorICAgICAgICAgICAgdmFsdWUgPSBpdGVtc1tpKzFdCisgICAgICAgICAgICBkW2tleV0gPSB2YWx1ZQorICAgICAgICBzZWxmLnN0YWNrW2s6XSA9IFtkXQorICAgIGRpc3BhdGNoW0RJQ1RdID0gbG9hZF9kaWN0CisKKyAgICAjIElOU1QgYW5kIE9CSiBkaWZmZXIgb25seSBpbiBob3cgdGhleSBnZXQgYSBjbGFzcyBvYmplY3QuICBJdCdzIG5vdAorICAgICMgb25seSBzZW5zaWJsZSB0byBkbyB0aGUgcmVzdCBpbiBhIGNvbW1vbiByb3V0aW5lLCB0aGUgdHdvIHJvdXRpbmVzCisgICAgIyBwcmV2aW91c2x5IGRpdmVyZ2VkIGFuZCBncmV3IGRpZmZlcmVudCBidWdzLgorICAgICMga2xhc3MgaXMgdGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlLCBhbmQgayBwb2ludHMgdG8gdGhlIHRvcG1vc3QgbWFyaworICAgICMgb2JqZWN0LCBmb2xsb3dpbmcgd2hpY2ggYXJlIHRoZSBhcmd1bWVudHMgZm9yIGtsYXNzLl9faW5pdF9fLgorICAgIGRlZiBfaW5zdGFudGlhdGUoc2VsZiwga2xhc3MsIGspOgorICAgICAgICBhcmdzID0gdHVwbGUoc2VsZi5zdGFja1trKzE6XSkKKyAgICAgICAgZGVsIHNlbGYuc3RhY2tbazpdCisgICAgICAgIGluc3RhbnRpYXRlZCA9IDAKKyAgICAgICAgaWYgKG5vdCBhcmdzIGFuZAorICAgICAgICAgICAgICAgIHR5cGUoa2xhc3MpIGlzIENsYXNzVHlwZSBhbmQKKyAgICAgICAgICAgICAgICBub3QgaGFzYXR0cihrbGFzcywgIl9fZ2V0aW5pdGFyZ3NfXyIpKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IF9FbXB0eUNsYXNzKCkKKyAgICAgICAgICAgICAgICB2YWx1ZS5fX2NsYXNzX18gPSBrbGFzcworICAgICAgICAgICAgICAgIGluc3RhbnRpYXRlZCA9IDEKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgIyBJbiByZXN0cmljdGVkIGV4ZWN1dGlvbiwgYXNzaWdubWVudCB0byBpbnN0Ll9fY2xhc3NfXyBpcworICAgICAgICAgICAgICAgICMgcHJvaGliaXRlZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgbm90IGluc3RhbnRpYXRlZDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGtsYXNzKCphcmdzKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImluIGNvbnN0cnVjdG9yIGZvciAlczogJXMiICUgKAorICAgICAgICAgICAgICAgICAgICBrbGFzcy5fX25hbWVfXywgc3RyKGVycikpLCBzeXMuZXhjX2luZm8oKVsyXQorICAgICAgICBzZWxmLmFwcGVuZCh2YWx1ZSkKKworICAgIGRlZiBsb2FkX2luc3Qoc2VsZik6CisgICAgICAgIG1vZHVsZSA9IHNlbGYucmVhZGxpbmUoKVs6LTFdCisgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXQorICAgICAgICBrbGFzcyA9IHNlbGYuZmluZF9jbGFzcyhtb2R1bGUsIG5hbWUpCisgICAgICAgIHNlbGYuX2luc3RhbnRpYXRlKGtsYXNzLCBzZWxmLm1hcmtlcigpKQorICAgIGRpc3BhdGNoW0lOU1RdID0gbG9hZF9pbnN0CisKKyAgICBkZWYgbG9hZF9vYmooc2VsZik6CisgICAgICAgICMgU3RhY2sgaXMgLi4uIG1hcmtvYmplY3QgY2xhc3NvYmplY3QgYXJnMSBhcmcyIC4uLgorICAgICAgICBrID0gc2VsZi5tYXJrZXIoKQorICAgICAgICBrbGFzcyA9IHNlbGYuc3RhY2sucG9wKGsrMSkKKyAgICAgICAgc2VsZi5faW5zdGFudGlhdGUoa2xhc3MsIGspCisgICAgZGlzcGF0Y2hbT0JKXSA9IGxvYWRfb2JqCisKKyAgICBkZWYgbG9hZF9uZXdvYmooc2VsZik6CisgICAgICAgIGFyZ3MgPSBzZWxmLnN0YWNrLnBvcCgpCisgICAgICAgIGNscyA9IHNlbGYuc3RhY2tbLTFdCisgICAgICAgIG9iaiA9IGNscy5fX25ld19fKGNscywgKmFyZ3MpCisgICAgICAgIHNlbGYuc3RhY2tbLTFdID0gb2JqCisgICAgZGlzcGF0Y2hbTkVXT0JKXSA9IGxvYWRfbmV3b2JqCisKKyAgICBkZWYgbG9hZF9nbG9iYWwoc2VsZik6CisgICAgICAgIG1vZHVsZSA9IHNlbGYucmVhZGxpbmUoKVs6LTFdCisgICAgICAgIG5hbWUgPSBzZWxmLnJlYWRsaW5lKClbOi0xXQorICAgICAgICBrbGFzcyA9IHNlbGYuZmluZF9jbGFzcyhtb2R1bGUsIG5hbWUpCisgICAgICAgIHNlbGYuYXBwZW5kKGtsYXNzKQorICAgIGRpc3BhdGNoW0dMT0JBTF0gPSBsb2FkX2dsb2JhbAorCisgICAgZGVmIGxvYWRfZXh0MShzZWxmKToKKyAgICAgICAgY29kZSA9IG9yZChzZWxmLnJlYWQoMSkpCisgICAgICAgIHNlbGYuZ2V0X2V4dGVuc2lvbihjb2RlKQorICAgIGRpc3BhdGNoW0VYVDFdID0gbG9hZF9leHQxCisKKyAgICBkZWYgbG9hZF9leHQyKHNlbGYpOgorICAgICAgICBjb2RlID0gbWxvYWRzKCdpJyArIHNlbGYucmVhZCgyKSArICdcMDAwXDAwMCcpCisgICAgICAgIHNlbGYuZ2V0X2V4dGVuc2lvbihjb2RlKQorICAgIGRpc3BhdGNoW0VYVDJdID0gbG9hZF9leHQyCisKKyAgICBkZWYgbG9hZF9leHQ0KHNlbGYpOgorICAgICAgICBjb2RlID0gbWxvYWRzKCdpJyArIHNlbGYucmVhZCg0KSkKKyAgICAgICAgc2VsZi5nZXRfZXh0ZW5zaW9uKGNvZGUpCisgICAgZGlzcGF0Y2hbRVhUNF0gPSBsb2FkX2V4dDQKKworICAgIGRlZiBnZXRfZXh0ZW5zaW9uKHNlbGYsIGNvZGUpOgorICAgICAgICBuaWwgPSBbXQorICAgICAgICBvYmogPSBfZXh0ZW5zaW9uX2NhY2hlLmdldChjb2RlLCBuaWwpCisgICAgICAgIGlmIG9iaiBpcyBub3QgbmlsOgorICAgICAgICAgICAgc2VsZi5hcHBlbmQob2JqKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGtleSA9IF9pbnZlcnRlZF9yZWdpc3RyeS5nZXQoY29kZSkKKyAgICAgICAgaWYgbm90IGtleToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVucmVnaXN0ZXJlZCBleHRlbnNpb24gY29kZSAlZCIgJSBjb2RlKQorICAgICAgICBvYmogPSBzZWxmLmZpbmRfY2xhc3MoKmtleSkKKyAgICAgICAgX2V4dGVuc2lvbl9jYWNoZVtjb2RlXSA9IG9iagorICAgICAgICBzZWxmLmFwcGVuZChvYmopCisKKyAgICBkZWYgZmluZF9jbGFzcyhzZWxmLCBtb2R1bGUsIG5hbWUpOgorICAgICAgICAjIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMKKyAgICAgICAgX19pbXBvcnRfXyhtb2R1bGUpCisgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzW21vZHVsZV0KKyAgICAgICAga2xhc3MgPSBnZXRhdHRyKG1vZCwgbmFtZSkKKyAgICAgICAgcmV0dXJuIGtsYXNzCisKKyAgICBkZWYgbG9hZF9yZWR1Y2Uoc2VsZik6CisgICAgICAgIHN0YWNrID0gc2VsZi5zdGFjaworICAgICAgICBhcmdzID0gc3RhY2sucG9wKCkKKyAgICAgICAgZnVuYyA9IHN0YWNrWy0xXQorICAgICAgICB2YWx1ZSA9IGZ1bmMoKmFyZ3MpCisgICAgICAgIHN0YWNrWy0xXSA9IHZhbHVlCisgICAgZGlzcGF0Y2hbUkVEVUNFXSA9IGxvYWRfcmVkdWNlCisKKyAgICBkZWYgbG9hZF9wb3Aoc2VsZik6CisgICAgICAgIGRlbCBzZWxmLnN0YWNrWy0xXQorICAgIGRpc3BhdGNoW1BPUF0gPSBsb2FkX3BvcAorCisgICAgZGVmIGxvYWRfcG9wX21hcmsoc2VsZik6CisgICAgICAgIGsgPSBzZWxmLm1hcmtlcigpCisgICAgICAgIGRlbCBzZWxmLnN0YWNrW2s6XQorICAgIGRpc3BhdGNoW1BPUF9NQVJLXSA9IGxvYWRfcG9wX21hcmsKKworICAgIGRlZiBsb2FkX2R1cChzZWxmKToKKyAgICAgICAgc2VsZi5hcHBlbmQoc2VsZi5zdGFja1stMV0pCisgICAgZGlzcGF0Y2hbRFVQXSA9IGxvYWRfZHVwCisKKyAgICBkZWYgbG9hZF9nZXQoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKHNlbGYubWVtb1tzZWxmLnJlYWRsaW5lKClbOi0xXV0pCisgICAgZGlzcGF0Y2hbR0VUXSA9IGxvYWRfZ2V0CisKKyAgICBkZWYgbG9hZF9iaW5nZXQoc2VsZik6CisgICAgICAgIGkgPSBvcmQoc2VsZi5yZWFkKDEpKQorICAgICAgICBzZWxmLmFwcGVuZChzZWxmLm1lbW9bcmVwcihpKV0pCisgICAgZGlzcGF0Y2hbQklOR0VUXSA9IGxvYWRfYmluZ2V0CisKKyAgICBkZWYgbG9hZF9sb25nX2JpbmdldChzZWxmKToKKyAgICAgICAgaSA9IG1sb2FkcygnaScgKyBzZWxmLnJlYWQoNCkpCisgICAgICAgIHNlbGYuYXBwZW5kKHNlbGYubWVtb1tyZXByKGkpXSkKKyAgICBkaXNwYXRjaFtMT05HX0JJTkdFVF0gPSBsb2FkX2xvbmdfYmluZ2V0CisKKyAgICBkZWYgbG9hZF9wdXQoc2VsZik6CisgICAgICAgIHNlbGYubWVtb1tzZWxmLnJlYWRsaW5lKClbOi0xXV0gPSBzZWxmLnN0YWNrWy0xXQorICAgIGRpc3BhdGNoW1BVVF0gPSBsb2FkX3B1dAorCisgICAgZGVmIGxvYWRfYmlucHV0KHNlbGYpOgorICAgICAgICBpID0gb3JkKHNlbGYucmVhZCgxKSkKKyAgICAgICAgc2VsZi5tZW1vW3JlcHIoaSldID0gc2VsZi5zdGFja1stMV0KKyAgICBkaXNwYXRjaFtCSU5QVVRdID0gbG9hZF9iaW5wdXQKKworICAgIGRlZiBsb2FkX2xvbmdfYmlucHV0KHNlbGYpOgorICAgICAgICBpID0gbWxvYWRzKCdpJyArIHNlbGYucmVhZCg0KSkKKyAgICAgICAgc2VsZi5tZW1vW3JlcHIoaSldID0gc2VsZi5zdGFja1stMV0KKyAgICBkaXNwYXRjaFtMT05HX0JJTlBVVF0gPSBsb2FkX2xvbmdfYmlucHV0CisKKyAgICBkZWYgbG9hZF9hcHBlbmQoc2VsZik6CisgICAgICAgIHN0YWNrID0gc2VsZi5zdGFjaworICAgICAgICB2YWx1ZSA9IHN0YWNrLnBvcCgpCisgICAgICAgIGxpc3QgPSBzdGFja1stMV0KKyAgICAgICAgbGlzdC5hcHBlbmQodmFsdWUpCisgICAgZGlzcGF0Y2hbQVBQRU5EXSA9IGxvYWRfYXBwZW5kCisKKyAgICBkZWYgbG9hZF9hcHBlbmRzKHNlbGYpOgorICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKKyAgICAgICAgbWFyayA9IHNlbGYubWFya2VyKCkKKyAgICAgICAgbGlzdCA9IHN0YWNrW21hcmsgLSAxXQorICAgICAgICBsaXN0LmV4dGVuZChzdGFja1ttYXJrICsgMTpdKQorICAgICAgICBkZWwgc3RhY2tbbWFyazpdCisgICAgZGlzcGF0Y2hbQVBQRU5EU10gPSBsb2FkX2FwcGVuZHMKKworICAgIGRlZiBsb2FkX3NldGl0ZW0oc2VsZik6CisgICAgICAgIHN0YWNrID0gc2VsZi5zdGFjaworICAgICAgICB2YWx1ZSA9IHN0YWNrLnBvcCgpCisgICAgICAgIGtleSA9IHN0YWNrLnBvcCgpCisgICAgICAgIGRpY3QgPSBzdGFja1stMV0KKyAgICAgICAgZGljdFtrZXldID0gdmFsdWUKKyAgICBkaXNwYXRjaFtTRVRJVEVNXSA9IGxvYWRfc2V0aXRlbQorCisgICAgZGVmIGxvYWRfc2V0aXRlbXMoc2VsZik6CisgICAgICAgIHN0YWNrID0gc2VsZi5zdGFjaworICAgICAgICBtYXJrID0gc2VsZi5tYXJrZXIoKQorICAgICAgICBkaWN0ID0gc3RhY2tbbWFyayAtIDFdCisgICAgICAgIGZvciBpIGluIHJhbmdlKG1hcmsgKyAxLCBsZW4oc3RhY2spLCAyKToKKyAgICAgICAgICAgIGRpY3Rbc3RhY2tbaV1dID0gc3RhY2tbaSArIDFdCisKKyAgICAgICAgZGVsIHN0YWNrW21hcms6XQorICAgIGRpc3BhdGNoW1NFVElURU1TXSA9IGxvYWRfc2V0aXRlbXMKKworICAgIGRlZiBsb2FkX2J1aWxkKHNlbGYpOgorICAgICAgICBzdGFjayA9IHNlbGYuc3RhY2sKKyAgICAgICAgc3RhdGUgPSBzdGFjay5wb3AoKQorICAgICAgICBpbnN0ID0gc3RhY2tbLTFdCisgICAgICAgIHNldHN0YXRlID0gZ2V0YXR0cihpbnN0LCAiX19zZXRzdGF0ZV9fIiwgTm9uZSkKKyAgICAgICAgaWYgc2V0c3RhdGU6CisgICAgICAgICAgICBzZXRzdGF0ZShzdGF0ZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzbG90c3RhdGUgPSBOb25lCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3RhdGUsIHR1cGxlKSBhbmQgbGVuKHN0YXRlKSA9PSAyOgorICAgICAgICAgICAgc3RhdGUsIHNsb3RzdGF0ZSA9IHN0YXRlCisgICAgICAgIGlmIHN0YXRlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGQgPSBpbnN0Ll9fZGljdF9fCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBzdGF0ZS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbaW50ZXJuKGspXSA9IHYKKyAgICAgICAgICAgICAgICAjIGtleXMgaW4gc3RhdGUgZG9uJ3QgaGF2ZSB0byBiZSBzdHJpbmdzCisgICAgICAgICAgICAgICAgIyBkb24ndCBibG93IHVwLCBidXQgZG9uJ3QgZ28gb3V0IG9mIG91ciB3YXkKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBkLnVwZGF0ZShzdGF0ZSkKKworICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFhYWCBJbiByZXN0cmljdGVkIGV4ZWN1dGlvbiwgdGhlIGluc3RhbmNlJ3MgX19kaWN0X18KKyAgICAgICAgICAgICAgICAjIGlzIG5vdCBhY2Nlc3NpYmxlLiAgVXNlIHRoZSBvbGQgd2F5IG9mIHVucGlja2xpbmcKKyAgICAgICAgICAgICAgICAjIHRoZSBpbnN0YW5jZSB2YXJpYWJsZXMuICBUaGlzIGlzIGEgc2VtYW50aWMKKyAgICAgICAgICAgICAgICAjIGRpZmZlcmVuY2Ugd2hlbiB1bnBpY2tsaW5nIGluIHJlc3RyaWN0ZWQKKyAgICAgICAgICAgICAgICAjIHZzLiB1bnJlc3RyaWN0ZWQgbW9kZXMuCisgICAgICAgICAgICAgICAgIyBOb3RlLCBob3dldmVyLCB0aGF0IGNQaWNrbGUgaGFzIG5ldmVyIHRyaWVkIHRvIGRvIHRoZQorICAgICAgICAgICAgICAgICMgLnVwZGF0ZSgpIGJ1c2luZXNzLCBhbmQgYWx3YXlzIHVzZXMKKyAgICAgICAgICAgICAgICAjICAgICBQeU9iamVjdF9TZXRJdGVtKGluc3QuX19kaWN0X18sIGtleSwgdmFsdWUpIGluIGEKKyAgICAgICAgICAgICAgICAjIGxvb3Agb3ZlciBzdGF0ZS5pdGVtcygpLgorICAgICAgICAgICAgICAgIGZvciBrLCB2IGluIHN0YXRlLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoaW5zdCwgaywgdikKKyAgICAgICAgaWYgc2xvdHN0YXRlOgorICAgICAgICAgICAgZm9yIGssIHYgaW4gc2xvdHN0YXRlLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihpbnN0LCBrLCB2KQorICAgIGRpc3BhdGNoW0JVSUxEXSA9IGxvYWRfYnVpbGQKKworICAgIGRlZiBsb2FkX21hcmsoc2VsZik6CisgICAgICAgIHNlbGYuYXBwZW5kKHNlbGYubWFyaykKKyAgICBkaXNwYXRjaFtNQVJLXSA9IGxvYWRfbWFyaworCisgICAgZGVmIGxvYWRfc3RvcChzZWxmKToKKyAgICAgICAgdmFsdWUgPSBzZWxmLnN0YWNrLnBvcCgpCisgICAgICAgIHJhaXNlIF9TdG9wKHZhbHVlKQorICAgIGRpc3BhdGNoW1NUT1BdID0gbG9hZF9zdG9wCisKKyMgSGVscGVyIGNsYXNzIGZvciBsb2FkX2luc3QvbG9hZF9vYmoKKworY2xhc3MgX0VtcHR5Q2xhc3M6CisgICAgcGFzcworCisjIEVuY29kZS9kZWNvZGUgbG9uZ3MgaW4gbGluZWFyIHRpbWUuCisKK2ltcG9ydCBiaW5hc2NpaSBhcyBfYmluYXNjaWkKKworZGVmIGVuY29kZV9sb25nKHgpOgorICAgIHIiIiJFbmNvZGUgYSBsb25nIHRvIGEgdHdvJ3MgY29tcGxlbWVudCBsaXR0bGUtZW5kaWFuIGJpbmFyeSBzdHJpbmcuCisgICAgTm90ZSB0aGF0IDBMIGlzIGEgc3BlY2lhbCBjYXNlLCByZXR1cm5pbmcgYW4gZW1wdHkgc3RyaW5nLCB0byBzYXZlIGEKKyAgICBieXRlIGluIHRoZSBMT05HMSBwaWNrbGluZyBjb250ZXh0LgorCisgICAgPj4+IGVuY29kZV9sb25nKDBMKQorICAgICcnCisgICAgPj4+IGVuY29kZV9sb25nKDI1NUwpCisgICAgJ1x4ZmZceDAwJworICAgID4+PiBlbmNvZGVfbG9uZygzMjc2N0wpCisgICAgJ1x4ZmZceDdmJworICAgID4+PiBlbmNvZGVfbG9uZygtMjU2TCkKKyAgICAnXHgwMFx4ZmYnCisgICAgPj4+IGVuY29kZV9sb25nKC0zMjc2OEwpCisgICAgJ1x4MDBceDgwJworICAgID4+PiBlbmNvZGVfbG9uZygtMTI4TCkKKyAgICAnXHg4MCcKKyAgICA+Pj4gZW5jb2RlX2xvbmcoMTI3TCkKKyAgICAnXHg3ZicKKyAgICA+Pj4KKyAgICAiIiIKKworICAgIGlmIHggPT0gMDoKKyAgICAgICAgcmV0dXJuICcnCisgICAgaWYgeCA+IDA6CisgICAgICAgIGFzaGV4ID0gaGV4KHgpCisgICAgICAgIGFzc2VydCBhc2hleC5zdGFydHN3aXRoKCIweCIpCisgICAgICAgIG5qdW5rY2hhcnMgPSAyICsgYXNoZXguZW5kc3dpdGgoJ0wnKQorICAgICAgICBuaWJibGVzID0gbGVuKGFzaGV4KSAtIG5qdW5rY2hhcnMKKyAgICAgICAgaWYgbmliYmxlcyAmIDE6CisgICAgICAgICAgICAjIG5lZWQgYW4gZXZlbiAjIG9mIG5pYmJsZXMgZm9yIHVuaGV4bGlmeQorICAgICAgICAgICAgYXNoZXggPSAiMHgwIiArIGFzaGV4WzI6XQorICAgICAgICBlbGlmIGludChhc2hleFsyXSwgMTYpID49IDg6CisgICAgICAgICAgICAjICJsb29rcyBuZWdhdGl2ZSIsIHNvIG5lZWQgYSBieXRlIG9mIHNpZ24gYml0cworICAgICAgICAgICAgYXNoZXggPSAiMHgwMCIgKyBhc2hleFsyOl0KKyAgICBlbHNlOgorICAgICAgICAjIEJ1aWxkIHRoZSAyNTYncy1jb21wbGVtZW50OiAgKDFMIDw8IG5ieXRlcykgKyB4LiAgVGhlIHRyaWNrIGlzCisgICAgICAgICMgdG8gZmluZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIGxpbmVhciB0aW1lIChhbHRob3VnaCB0aGF0IHNob3VsZAorICAgICAgICAjIHJlYWxseSBiZSBhIGNvbnN0YW50LXRpbWUgdGFzaykuCisgICAgICAgIGFzaGV4ID0gaGV4KC14KQorICAgICAgICBhc3NlcnQgYXNoZXguc3RhcnRzd2l0aCgiMHgiKQorICAgICAgICBuanVua2NoYXJzID0gMiArIGFzaGV4LmVuZHN3aXRoKCdMJykKKyAgICAgICAgbmliYmxlcyA9IGxlbihhc2hleCkgLSBuanVua2NoYXJzCisgICAgICAgIGlmIG5pYmJsZXMgJiAxOgorICAgICAgICAgICAgIyBFeHRlbmQgdG8gYSBmdWxsIGJ5dGUuCisgICAgICAgICAgICBuaWJibGVzICs9IDEKKyAgICAgICAgbmJpdHMgPSBuaWJibGVzICogNAorICAgICAgICB4ICs9IDFMIDw8IG5iaXRzCisgICAgICAgIGFzc2VydCB4ID4gMAorICAgICAgICBhc2hleCA9IGhleCh4KQorICAgICAgICBuanVua2NoYXJzID0gMiArIGFzaGV4LmVuZHN3aXRoKCdMJykKKyAgICAgICAgbmV3bmliYmxlcyA9IGxlbihhc2hleCkgLSBuanVua2NoYXJzCisgICAgICAgIGlmIG5ld25pYmJsZXMgPCBuaWJibGVzOgorICAgICAgICAgICAgYXNoZXggPSAiMHgiICsgIjAiICogKG5pYmJsZXMgLSBuZXduaWJibGVzKSArIGFzaGV4WzI6XQorICAgICAgICBpZiBpbnQoYXNoZXhbMl0sIDE2KSA8IDg6CisgICAgICAgICAgICAjICJsb29rcyBwb3NpdGl2ZSIsIHNvIG5lZWQgYSBieXRlIG9mIHNpZ24gYml0cworICAgICAgICAgICAgYXNoZXggPSAiMHhmZiIgKyBhc2hleFsyOl0KKworICAgIGlmIGFzaGV4LmVuZHN3aXRoKCdMJyk6CisgICAgICAgIGFzaGV4ID0gYXNoZXhbMjotMV0KKyAgICBlbHNlOgorICAgICAgICBhc2hleCA9IGFzaGV4WzI6XQorICAgIGFzc2VydCBsZW4oYXNoZXgpICYgMSA9PSAwLCAoeCwgYXNoZXgpCisgICAgYmluYXJ5ID0gX2JpbmFzY2lpLnVuaGV4bGlmeShhc2hleCkKKyAgICByZXR1cm4gYmluYXJ5Wzo6LTFdCisKK2RlZiBkZWNvZGVfbG9uZyhkYXRhKToKKyAgICByIiIiRGVjb2RlIGEgbG9uZyBmcm9tIGEgdHdvJ3MgY29tcGxlbWVudCBsaXR0bGUtZW5kaWFuIGJpbmFyeSBzdHJpbmcuCisKKyAgICA+Pj4gZGVjb2RlX2xvbmcoJycpCisgICAgMEwKKyAgICA+Pj4gZGVjb2RlX2xvbmcoIlx4ZmZceDAwIikKKyAgICAyNTVMCisgICAgPj4+IGRlY29kZV9sb25nKCJceGZmXHg3ZiIpCisgICAgMzI3NjdMCisgICAgPj4+IGRlY29kZV9sb25nKCJceDAwXHhmZiIpCisgICAgLTI1NkwKKyAgICA+Pj4gZGVjb2RlX2xvbmcoIlx4MDBceDgwIikKKyAgICAtMzI3NjhMCisgICAgPj4+IGRlY29kZV9sb25nKCJceDgwIikKKyAgICAtMTI4TAorICAgID4+PiBkZWNvZGVfbG9uZygiXHg3ZiIpCisgICAgMTI3TAorICAgICIiIgorCisgICAgbmJ5dGVzID0gbGVuKGRhdGEpCisgICAgaWYgbmJ5dGVzID09IDA6CisgICAgICAgIHJldHVybiAwTAorICAgIGFzaGV4ID0gX2JpbmFzY2lpLmhleGxpZnkoZGF0YVs6Oi0xXSkKKyAgICBuID0gbG9uZyhhc2hleCwgMTYpICMgcXVhZHJhdGljIHRpbWUgYmVmb3JlIFB5dGhvbiAyLjM7IGxpbmVhciBub3cKKyAgICBpZiBkYXRhWy0xXSA+PSAnXHg4MCc6CisgICAgICAgIG4gLT0gMUwgPDwgKG5ieXRlcyAqIDgpCisgICAgcmV0dXJuIG4KKworIyBTaG9ydGhhbmRzCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitkZWYgZHVtcChvYmosIGZpbGUsIHByb3RvY29sPU5vbmUpOgorICAgIFBpY2tsZXIoZmlsZSwgcHJvdG9jb2wpLmR1bXAob2JqKQorCitkZWYgZHVtcHMob2JqLCBwcm90b2NvbD1Ob25lKToKKyAgICBmaWxlID0gU3RyaW5nSU8oKQorICAgIFBpY2tsZXIoZmlsZSwgcHJvdG9jb2wpLmR1bXAob2JqKQorICAgIHJldHVybiBmaWxlLmdldHZhbHVlKCkKKworZGVmIGxvYWQoZmlsZSk6CisgICAgcmV0dXJuIFVucGlja2xlcihmaWxlKS5sb2FkKCkKKworZGVmIGxvYWRzKHN0cik6CisgICAgZmlsZSA9IFN0cmluZ0lPKHN0cikKKyAgICByZXR1cm4gVW5waWNrbGVyKGZpbGUpLmxvYWQoKQorCisjIERvY3Rlc3QKKworZGVmIF90ZXN0KCk6CisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICByZXR1cm4gZG9jdGVzdC50ZXN0bW9kKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpY2tsZS5weWMgYi9saWIvcHl0aG9uMi43L3BpY2tsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjMmY3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGlja2xlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpY2tsZS5weW8gYi9saWIvcHl0aG9uMi43L3BpY2tsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzYjcyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGlja2xlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpY2tsZXRvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy9waWNrbGV0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzE3NzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9waWNrbGV0b29scy5weQpAQCAtMCwwICsxLDIyNzQgQEAKKycnJyJFeGVjdXRhYmxlIGRvY3VtZW50YXRpb24iIGZvciB0aGUgcGlja2xlIG1vZHVsZS4KKworRXh0ZW5zaXZlIGNvbW1lbnRzIGFib3V0IHRoZSBwaWNrbGUgcHJvdG9jb2xzIGFuZCBwaWNrbGUtbWFjaGluZSBvcGNvZGVzCitjYW4gYmUgZm91bmQgaGVyZS4gIFNvbWUgZnVuY3Rpb25zIG1lYW50IGZvciBleHRlcm5hbCB1c2U6CisKK2dlbm9wcyhwaWNrbGUpCisgICBHZW5lcmF0ZSBhbGwgdGhlIG9wY29kZXMgaW4gYSBwaWNrbGUsIGFzIChvcGNvZGUsIGFyZywgcG9zaXRpb24pIHRyaXBsZXMuCisKK2RpcyhwaWNrbGUsIG91dD1Ob25lLCBtZW1vPU5vbmUsIGluZGVudGxldmVsPTQpCisgICBQcmludCBhIHN5bWJvbGljIGRpc2Fzc2VtYmx5IG9mIGEgcGlja2xlLgorJycnCisKK19fYWxsX18gPSBbJ2RpcycsICdnZW5vcHMnLCAnb3B0aW1pemUnXQorCisjIE90aGVyIGlkZWFzOgorIworIyAtIEEgcGlja2xlIHZlcmlmaWVyOiAgcmVhZCBhIHBpY2tsZSBhbmQgY2hlY2sgaXQgZXhoYXVzdGl2ZWx5IGZvcgorIyAgIHdlbGwtZm9ybWVkbmVzcy4gIGRpcygpIGRvZXMgYSBsb3Qgb2YgdGhpcyBhbHJlYWR5LgorIworIyAtIEEgcHJvdG9jb2wgaWRlbnRpZmllcjogIGV4YW1pbmUgYSBwaWNrbGUgYW5kIHJldHVybiBpdHMgcHJvdG9jb2wgbnVtYmVyCisjICAgKD09IHRoZSBoaWdoZXN0IC5wcm90byBhdHRyIHZhbHVlIGFtb25nIGFsbCB0aGUgb3Bjb2RlcyBpbiB0aGUgcGlja2xlKS4KKyMgICBkaXMoKSBhbHJlYWR5IHByaW50cyB0aGlzIGluZm8gYXQgdGhlIGVuZC4KKyMKKyMgLSBBIHBpY2tsZSBvcHRpbWl6ZXI6ICBmb3IgZXhhbXBsZSwgdHVwbGUtYnVpbGRpbmcgY29kZSBpcyBzb21ldGltZXMgbW9yZQorIyAgIGVsYWJvcmF0ZSB0aGFuIG5lY2Vzc2FyeSwgY2F0ZXJpbmcgZm9yIHRoZSBwb3NzaWJpbGl0eSB0aGF0IHRoZSB0dXBsZQorIyAgIGlzIHJlY3Vyc2l2ZS4gIE9yIGxvdHMgb2YgdGltZXMgYSBQVVQgaXMgZ2VuZXJhdGVkIHRoYXQncyBuZXZlciBhY2Nlc3NlZAorIyAgIGJ5IGEgbGF0ZXIgR0VULgorCisKKyIiIgorIkEgcGlja2xlIiBpcyBhIHByb2dyYW0gZm9yIGEgdmlydHVhbCBwaWNrbGUgbWFjaGluZSAoUE0sIGJ1dCBtb3JlIGFjY3VyYXRlbHkKK2NhbGxlZCBhbiB1bnBpY2tsaW5nIG1hY2hpbmUpLiAgSXQncyBhIHNlcXVlbmNlIG9mIG9wY29kZXMsIGludGVycHJldGVkIGJ5IHRoZQorUE0sIGJ1aWxkaW5nIGFuIGFyYml0cmFyaWx5IGNvbXBsZXggUHl0aG9uIG9iamVjdC4KKworRm9yIHRoZSBtb3N0IHBhcnQsIHRoZSBQTSBpcyB2ZXJ5IHNpbXBsZTogIHRoZXJlIGFyZSBubyBsb29waW5nLCB0ZXN0aW5nLCBvcgorY29uZGl0aW9uYWwgaW5zdHJ1Y3Rpb25zLCBubyBhcml0aG1ldGljIGFuZCBubyBmdW5jdGlvbiBjYWxscy4gIE9wY29kZXMgYXJlCitleGVjdXRlZCBvbmNlIGVhY2gsIGZyb20gZmlyc3QgdG8gbGFzdCwgdW50aWwgYSBTVE9QIG9wY29kZSBpcyByZWFjaGVkLgorCitUaGUgUE0gaGFzIHR3byBkYXRhIGFyZWFzLCAidGhlIHN0YWNrIiBhbmQgInRoZSBtZW1vIi4KKworTWFueSBvcGNvZGVzIHB1c2ggUHl0aG9uIG9iamVjdHMgb250byB0aGUgc3RhY2s7IGUuZy4sIElOVCBwdXNoZXMgYSBQeXRob24KK2ludGVnZXIgb2JqZWN0IG9uIHRoZSBzdGFjaywgd2hvc2UgdmFsdWUgaXMgZ290dGVuIGZyb20gYSBkZWNpbWFsIHN0cmluZworbGl0ZXJhbCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIElOVCBvcGNvZGUgaW4gdGhlIHBpY2tsZSBieXRlc3RyZWFtLiAgT3RoZXIKK29wY29kZXMgdGFrZSBQeXRob24gb2JqZWN0cyBvZmYgdGhlIHN0YWNrLiAgVGhlIHJlc3VsdCBvZiB1bnBpY2tsaW5nIGlzCit3aGF0ZXZlciBvYmplY3QgaXMgbGVmdCBvbiB0aGUgc3RhY2sgd2hlbiB0aGUgZmluYWwgU1RPUCBvcGNvZGUgaXMgZXhlY3V0ZWQuCisKK1RoZSBtZW1vIGlzIHNpbXBseSBhbiBhcnJheSBvZiBvYmplY3RzLCBvciBpdCBjYW4gYmUgaW1wbGVtZW50ZWQgYXMgYSBkaWN0CittYXBwaW5nIGxpdHRsZSBpbnRlZ2VycyB0byBvYmplY3RzLiAgVGhlIG1lbW8gc2VydmVzIGFzIHRoZSBQTSdzICJsb25nIHRlcm0KK21lbW9yeSIsIGFuZCB0aGUgbGl0dGxlIGludGVnZXJzIGluZGV4aW5nIHRoZSBtZW1vIGFyZSBha2luIHRvIHZhcmlhYmxlCituYW1lcy4gIFNvbWUgb3Bjb2RlcyBwb3AgYSBzdGFjayBvYmplY3QgaW50byB0aGUgbWVtbyBhdCBhIGdpdmVuIGluZGV4LAorYW5kIG90aGVycyBwdXNoIGEgbWVtbyBvYmplY3QgYXQgYSBnaXZlbiBpbmRleCBvbnRvIHRoZSBzdGFjayBhZ2Fpbi4KKworQXQgaGVhcnQsIHRoYXQncyBhbGwgdGhlIFBNIGhhcy4gIFN1YnRsZXRpZXMgYXJpc2UgZm9yIHRoZXNlIHJlYXNvbnM6CisKKysgT2JqZWN0IGlkZW50aXR5LiAgT2JqZWN0cyBjYW4gYmUgYXJiaXRyYXJpbHkgY29tcGxleCwgYW5kIHN1Ym9iamVjdHMKKyAgbWF5IGJlIHNoYXJlZCAoZm9yIGV4YW1wbGUsIHRoZSBsaXN0IFthLCBhXSByZWZlcnMgdG8gdGhlIHNhbWUgb2JqZWN0IGEKKyAgdHdpY2UpLiAgSXQgY2FuIGJlIHZpdGFsIHRoYXQgdW5waWNrbGluZyByZWNyZWF0ZSBhbiBpc29tb3JwaGljIG9iamVjdAorICBncmFwaCwgZmFpdGhmdWxseSByZXByb2R1Y2luZyBzaGFyaW5nLgorCisrIFJlY3Vyc2l2ZSBvYmplY3RzLiAgRm9yIGV4YW1wbGUsIGFmdGVyICJMID0gW107IEwuYXBwZW5kKEwpIiwgTCBpcyBhCisgIGxpc3QsIGFuZCBMWzBdIGlzIHRoZSBzYW1lIGxpc3QuICBUaGlzIGlzIHJlbGF0ZWQgdG8gdGhlIG9iamVjdCBpZGVudGl0eQorICBwb2ludCwgYW5kIHNvbWUgc2VxdWVuY2VzIG9mIHBpY2tsZSBvcGNvZGVzIGFyZSBzdWJ0bGUgaW4gb3JkZXIgdG8KKyAgZ2V0IHRoZSByaWdodCByZXN1bHQgaW4gYWxsIGNhc2VzLgorCisrIFRoaW5ncyBwaWNrbGUgZG9lc24ndCBrbm93IGV2ZXJ5dGhpbmcgYWJvdXQuICBFeGFtcGxlcyBvZiB0aGluZ3MgcGlja2xlCisgIGRvZXMga25vdyBldmVyeXRoaW5nIGFib3V0IGFyZSBQeXRob24ncyBidWlsdGluIHNjYWxhciBhbmQgY29udGFpbmVyCisgIHR5cGVzLCBsaWtlIGludHMgYW5kIHR1cGxlcy4gIFRoZXkgZ2VuZXJhbGx5IGhhdmUgb3Bjb2RlcyBkZWRpY2F0ZWQgdG8KKyAgdGhlbS4gIEZvciB0aGluZ3MgbGlrZSBtb2R1bGUgcmVmZXJlbmNlcyBhbmQgaW5zdGFuY2VzIG9mIHVzZXItZGVmaW5lZAorICBjbGFzc2VzLCBwaWNrbGUncyBrbm93bGVkZ2UgaXMgbGltaXRlZC4gIEhpc3RvcmljYWxseSwgbWFueSBlbmhhbmNlbWVudHMKKyAgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIHBpY2tsZSBwcm90b2NvbCBpbiBvcmRlciB0byBkbyBhIGJldHRlciAoZmFzdGVyLAorICBhbmQvb3IgbW9yZSBjb21wYWN0KSBqb2Igb24gdGhvc2UuCisKKysgQmFja3dhcmQgY29tcGF0aWJpbGl0eSBhbmQgbWljcm8tb3B0aW1pemF0aW9uLiAgQXMgZXhwbGFpbmVkIGJlbG93LAorICBwaWNrbGUgb3Bjb2RlcyBuZXZlciBnbyBhd2F5LCBub3QgZXZlbiB3aGVuIGJldHRlciB3YXlzIHRvIGRvIGEgdGhpbmcKKyAgZ2V0IGludmVudGVkLiAgVGhlIHJlcGVydG9pcmUgb2YgdGhlIFBNIGp1c3Qga2VlcHMgZ3Jvd2luZyBvdmVyIHRpbWUuCisgIEZvciBleGFtcGxlLCBwcm90b2NvbCAwIGhhZCB0d28gb3Bjb2RlcyBmb3IgYnVpbGRpbmcgUHl0aG9uIGludGVnZXJzIChJTlQKKyAgYW5kIExPTkcpLCBwcm90b2NvbCAxIGFkZGVkIHRocmVlIG1vcmUgZm9yIG1vcmUtZWZmaWNpZW50IHBpY2tsaW5nIG9mIHNob3J0CisgIGludGVnZXJzLCBhbmQgcHJvdG9jb2wgMiBhZGRlZCB0d28gbW9yZSBmb3IgbW9yZS1lZmZpY2llbnQgcGlja2xpbmcgb2YKKyAgbG9uZyBpbnRlZ2VycyAoYmVmb3JlIHByb3RvY29sIDIsIHRoZSBvbmx5IHdheXMgdG8gcGlja2xlIGEgUHl0aG9uIGxvbmcKKyAgdG9vayB0aW1lIHF1YWRyYXRpYyBpbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cywgZm9yIGJvdGggcGlja2xpbmcgYW5kCisgIHVucGlja2xpbmcpLiAgIk9wY29kZSBibG9hdCIgaXNuJ3Qgc28gbXVjaCBhIHN1YnRsZXR5IGFzIGEgc291cmNlIG9mCisgIHdlYXJ5aW5nIGNvbXBsaWNhdGlvbi4KKworCitQaWNrbGUgcHJvdG9jb2xzOgorCitGb3IgY29tcGF0aWJpbGl0eSwgdGhlIG1lYW5pbmcgb2YgYSBwaWNrbGUgb3Bjb2RlIG5ldmVyIGNoYW5nZXMuICBJbnN0ZWFkIG5ldworcGlja2xlIG9wY29kZXMgZ2V0IGFkZGVkLCBhbmQgZWFjaCB2ZXJzaW9uJ3MgdW5waWNrbGVyIGNhbiBoYW5kbGUgYWxsIHRoZQorcGlja2xlIG9wY29kZXMgaW4gYWxsIHByb3RvY29sIHZlcnNpb25zIHRvIGRhdGUuICBTbyBvbGQgcGlja2xlcyBjb250aW51ZSB0bworYmUgcmVhZGFibGUgZm9yZXZlci4gIFRoZSBwaWNrbGVyIGNhbiBnZW5lcmFsbHkgYmUgdG9sZCB0byByZXN0cmljdCBpdHNlbGYgdG8KK3RoZSBzdWJzZXQgb2Ygb3Bjb2RlcyBhdmFpbGFibGUgdW5kZXIgcHJldmlvdXMgcHJvdG9jb2wgdmVyc2lvbnMgdG9vLCBzbyB0aGF0Cit1c2VycyBjYW4gY3JlYXRlIHBpY2tsZXMgdW5kZXIgdGhlIGN1cnJlbnQgdmVyc2lvbiByZWFkYWJsZSBieSBvbGRlcgordmVyc2lvbnMuICBIb3dldmVyLCBhIHBpY2tsZSBkb2VzIG5vdCBjb250YWluIGl0cyB2ZXJzaW9uIG51bWJlciBlbWJlZGRlZAord2l0aGluIGl0LiAgSWYgYW4gb2xkZXIgdW5waWNrbGVyIHRyaWVzIHRvIHJlYWQgYSBwaWNrbGUgdXNpbmcgYSBsYXRlcgorcHJvdG9jb2wsIHRoZSByZXN1bHQgaXMgbW9zdCBsaWtlbHkgYW4gZXhjZXB0aW9uIGR1ZSB0byBzZWVpbmcgYW4gdW5rbm93biAoaW4KK3RoZSBvbGRlciB1bnBpY2tsZXIpIG9wY29kZS4KKworVGhlIG9yaWdpbmFsIHBpY2tsZSB1c2VkIHdoYXQncyBub3cgY2FsbGVkICJwcm90b2NvbCAwIiwgYW5kIHdoYXQgd2FzIGNhbGxlZAorInRleHQgbW9kZSIgYmVmb3JlIFB5dGhvbiAyLjMuICBUaGUgZW50aXJlIHBpY2tsZSBieXRlc3RyZWFtIGlzIG1hZGUgdXAgb2YKK3ByaW50YWJsZSA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzLCBwbHVzIHRoZSBuZXdsaW5lIGNoYXJhY3RlciwgaW4gcHJvdG9jb2wgMC4KK1RoYXQncyB3aHkgaXQgd2FzIGNhbGxlZCB0ZXh0IG1vZGUuICBQcm90b2NvbCAwIGlzIHNtYWxsIGFuZCBlbGVnYW50LCBidXQKK3NvbWV0aW1lcyBwYWluZnVsbHkgaW5lZmZpY2llbnQuCisKK1RoZSBzZWNvbmQgbWFqb3Igc2V0IG9mIGFkZGl0aW9ucyBpcyBub3cgY2FsbGVkICJwcm90b2NvbCAxIiwgYW5kIHdhcyBjYWxsZWQKKyJiaW5hcnkgbW9kZSIgYmVmb3JlIFB5dGhvbiAyLjMuICBUaGlzIGFkZGVkIG1hbnkgb3Bjb2RlcyB3aXRoIGFyZ3VtZW50cworY29uc2lzdGluZyBvZiBhcmJpdHJhcnkgYnl0ZXMsIGluY2x1ZGluZyBOVUwgYnl0ZXMgYW5kIHVucHJpbnRhYmxlICJoaWdoIGJpdCIKK2J5dGVzLiAgQmluYXJ5IG1vZGUgcGlja2xlcyBjYW4gYmUgc3Vic3RhbnRpYWxseSBzbWFsbGVyIHRoYW4gZXF1aXZhbGVudAordGV4dCBtb2RlIHBpY2tsZXMsIGFuZCBzb21ldGltZXMgZmFzdGVyIHRvbzsgZS5nLiwgQklOSU5UIHJlcHJlc2VudHMgYSA0LWJ5dGUKK2ludCBhcyA0IGJ5dGVzIGZvbGxvd2luZyB0aGUgb3Bjb2RlLCB3aGljaCBpcyBjaGVhcGVyIHRvIHVucGlja2xlIHRoYW4gdGhlCisocGVyaGFwcykgMTEtY2hhcmFjdGVyIGRlY2ltYWwgc3RyaW5nIGF0dGFjaGVkIHRvIElOVC4gIFByb3RvY29sIDEgYWxzbyBhZGRlZAorYSBudW1iZXIgb2Ygb3Bjb2RlcyB0aGF0IG9wZXJhdGUgb24gbWFueSBzdGFjayBlbGVtZW50cyBhdCBvbmNlIChsaWtlIEFQUEVORFMKK2FuZCBTRVRJVEVNUyksIGFuZCAic2hvcnRjdXQiIG9wY29kZXMgKGxpa2UgRU1QVFlfRElDVCBhbmQgRU1QVFlfVFVQTEUpLgorCitUaGUgdGhpcmQgbWFqb3Igc2V0IG9mIGFkZGl0aW9ucyBjYW1lIGluIFB5dGhvbiAyLjMsIGFuZCBpcyBjYWxsZWQgInByb3RvY29sCisyIi4gIFRoaXMgYWRkZWQ6CisKKy0gQSBiZXR0ZXIgd2F5IHRvIHBpY2tsZSBpbnN0YW5jZXMgb2YgbmV3LXN0eWxlIGNsYXNzZXMgKE5FV09CSikuCisKKy0gQSB3YXkgZm9yIGEgcGlja2xlIHRvIGlkZW50aWZ5IGl0cyBwcm90b2NvbCAoUFJPVE8pLgorCistIFRpbWUtIGFuZCBzcGFjZS0gZWZmaWNpZW50IHBpY2tsaW5nIG9mIGxvbmcgaW50cyAoTE9OR3sxLDR9KS4KKworLSBTaG9ydGN1dHMgZm9yIHNtYWxsIHR1cGxlcyAoVFVQTEV7MSwyLDN9fS4KKworLSBEZWRpY2F0ZWQgb3Bjb2RlcyBmb3IgYm9vbHMgKE5FV1RSVUUsIE5FV0ZBTFNFKS4KKworLSBUaGUgImV4dGVuc2lvbiByZWdpc3RyeSIsIGEgdmVjdG9yIG9mIHBvcHVsYXIgb2JqZWN0cyB0aGF0IGNhbiBiZSBwdXNoZWQKKyAgZWZmaWNpZW50bHkgYnkgaW5kZXggKEVYVHsxLDIsNH0pLiAgVGhpcyBpcyBha2luIHRvIHRoZSBtZW1vIGFuZCBHRVQsIGJ1dAorICB0aGUgcmVnaXN0cnkgY29udGVudHMgYXJlIHByZWRlZmluZWQgKHRoZXJlJ3Mgbm90aGluZyBha2luIHRvIHRoZSBtZW1vJ3MKKyAgUFVUKS4KKworQW5vdGhlciBpbmRlcGVuZGVudCBjaGFuZ2Ugd2l0aCBQeXRob24gMi4zIGlzIHRoZSBhYmFuZG9ubWVudCBvZiBhbnkKK3ByZXRlbnNlIHRoYXQgaXQgbWlnaHQgYmUgc2FmZSB0byBsb2FkIHBpY2tsZXMgcmVjZWl2ZWQgZnJvbSB1bnRydXN0ZWQKK3BhcnRpZXMgLS0gbm8gc3VmZmljaWVudCBzZWN1cml0eSBhbmFseXNpcyBoYXMgYmVlbiBkb25lIHRvIGd1YXJhbnRlZQordGhpcyBhbmQgdGhlcmUgaXNuJ3QgYSB1c2UgY2FzZSB0aGF0IHdhcnJhbnRzIHRoZSBleHBlbnNlIG9mIHN1Y2ggYW4KK2FuYWx5c2lzLgorCitUbyB0aGlzIGVuZCwgYWxsIHRlc3RzIGZvciBfX3NhZmVfZm9yX3VucGlja2xpbmdfXyBvciBmb3IKK2NvcHlfcmVnLnNhZmVfY29uc3RydWN0b3JzIGFyZSByZW1vdmVkIGZyb20gdGhlIHVucGlja2xpbmcgY29kZS4KK1JlZmVyZW5jZXMgdG8gdGhlc2UgdmFyaWFibGVzIGluIHRoZSBkZXNjcmlwdGlvbnMgYmVsb3cgYXJlIHRvIGJlIHNlZW4KK2FzIGRlc2NyaWJpbmcgdW5waWNrbGluZyBpbiBQeXRob24gMi4yIGFuZCBiZWZvcmUuCisiIiIKKworIyBNZXRhLXJ1bGU6ICBEZXNjcmlwdGlvbnMgYXJlIHN0b3JlZCBpbiBpbnN0YW5jZXMgb2YgZGVzY3JpcHRvciBvYmplY3RzLAorIyB3aXRoIHBsYWluIGNvbnN0cnVjdG9ycy4gIE5vIG1ldGEtbGFuZ3VhZ2UgaXMgZGVmaW5lZCBmcm9tIHdoaWNoCisjIGRlc2NyaXB0b3JzIGNvdWxkIGJlIGNvbnN0cnVjdGVkLiAgSWYgeW91IHdhbnQsIGUuZy4sIFhNTCwgd3JpdGUgYSBsaXR0bGUKKyMgcHJvZ3JhbSB0byBnZW5lcmF0ZSBYTUwgZnJvbSB0aGUgb2JqZWN0cy4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNvbWUgcGlja2xlIG9wY29kZXMgaGF2ZSBhbiBhcmd1bWVudCwgZm9sbG93aW5nIHRoZSBvcGNvZGUgaW4gdGhlCisjIGJ5dGVzdHJlYW0uICBBbiBhcmd1bWVudCBpcyBvZiBhIHNwZWNpZmljIHR5cGUsIGRlc2NyaWJlZCBieSBhbiBpbnN0YW5jZQorIyBvZiBBcmd1bWVudERlc2NyaXB0b3IuICBUaGVzZSBhcmUgbm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggYXJndW1lbnRzIHRha2VuCisjIG9mZiB0aGUgc3RhY2sgLS0gQXJndW1lbnREZXNjcmlwdG9yIGFwcGxpZXMgb25seSB0byBhcmd1bWVudHMgZW1iZWRkZWQgaW4KKyMgdGhlIG9wY29kZSBzdHJlYW0sIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBhbiBvcGNvZGUuCisKKyMgUmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGJ5IGFuIGFyZ3VtZW50IGRlbGltaXRlZCBieSB0aGUKKyMgbmV4dCBuZXdsaW5lIGNoYXJhY3Rlci4KK1VQX1RPX05FV0xJTkUgPSAtMQorCisjIFJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCBieSBhIHR3by1hcmd1bWVudCBvcGNvZGUgd2hlcmUKKyMgdGhlIGZpcnN0IGFyZ3VtZW50IGdpdmVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHNlY29uZCBhcmd1bWVudC4KK1RBS0VOX0ZST01fQVJHVU1FTlQxID0gLTIgICAjIG51bSBieXRlcyBpcyAxLWJ5dGUgdW5zaWduZWQgaW50CitUQUtFTl9GUk9NX0FSR1VNRU5UNCA9IC0zICAgIyBudW0gYnl0ZXMgaXMgNC1ieXRlIHNpZ25lZCBsaXR0bGUtZW5kaWFuIGludAorCitjbGFzcyBBcmd1bWVudERlc2NyaXB0b3Iob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoCisgICAgICAgICMgbmFtZSBvZiBkZXNjcmlwdG9yIHJlY29yZCwgYWxzbyBhIG1vZHVsZSBnbG9iYWwgbmFtZTsgYSBzdHJpbmcKKyAgICAgICAgJ25hbWUnLAorCisgICAgICAgICMgbGVuZ3RoIG9mIGFyZ3VtZW50LCBpbiBieXRlczsgYW4gaW50OyBVUF9UT19ORVdMSU5FIGFuZAorICAgICAgICAjIFRBS0VOX0ZST01fQVJHVU1FTlR7MSw0fSBhcmUgbmVnYXRpdmUgdmFsdWVzIGZvciB2YXJpYWJsZS1sZW5ndGgKKyAgICAgICAgIyBjYXNlcworICAgICAgICAnbicsCisKKyAgICAgICAgIyBhIGZ1bmN0aW9uIHRha2luZyBhIGZpbGUtbGlrZSBvYmplY3QsIHJlYWRpbmcgdGhpcyBraW5kIG9mIGFyZ3VtZW50CisgICAgICAgICMgZnJvbSB0aGUgb2JqZWN0IGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLCBhZHZhbmNpbmcgdGhlIGN1cnJlbnQKKyAgICAgICAgIyBwb3NpdGlvbiBieSBuIGJ5dGVzLCBhbmQgcmV0dXJuaW5nIHRoZSB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKKyAgICAgICAgJ3JlYWRlcicsCisKKyAgICAgICAgIyBodW1hbi1yZWFkYWJsZSBkb2NzIGZvciB0aGlzIGFyZyBkZXNjcmlwdG9yOyBhIHN0cmluZworICAgICAgICAnZG9jJywKKyAgICApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbiwgcmVhZGVyLCBkb2MpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCBzdHIpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuLCBpbnQpIGFuZCAobiA+PSAwIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuIGluIChVUF9UT19ORVdMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFLRU5fRlJPTV9BUkdVTUVOVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQUtFTl9GUk9NX0FSR1VNRU5UNCkpCisgICAgICAgIHNlbGYubiA9IG4KKworICAgICAgICBzZWxmLnJlYWRlciA9IHJlYWRlcgorCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGRvYywgc3RyKQorICAgICAgICBzZWxmLmRvYyA9IGRvYworCitmcm9tIHN0cnVjdCBpbXBvcnQgdW5wYWNrIGFzIF91bnBhY2sKKworZGVmIHJlYWRfdWludDEoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcmVhZF91aW50MShTdHJpbmdJTy5TdHJpbmdJTygnXHhmZicpKQorICAgIDI1NQorICAgICIiIgorCisgICAgZGF0YSA9IGYucmVhZCgxKQorICAgIGlmIGRhdGE6CisgICAgICAgIHJldHVybiBvcmQoZGF0YSkKKyAgICByYWlzZSBWYWx1ZUVycm9yKCJub3QgZW5vdWdoIGRhdGEgaW4gc3RyZWFtIHRvIHJlYWQgdWludDEiKQorCit1aW50MSA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgIG5hbWU9J3VpbnQxJywKKyAgICAgICAgICAgIG49MSwKKyAgICAgICAgICAgIHJlYWRlcj1yZWFkX3VpbnQxLAorICAgICAgICAgICAgZG9jPSJPbmUtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyLiIpCisKKworZGVmIHJlYWRfdWludDIoZik6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcmVhZF91aW50MihTdHJpbmdJTy5TdHJpbmdJTygnXHhmZlx4MDAnKSkKKyAgICAyNTUKKyAgICA+Pj4gcmVhZF91aW50MihTdHJpbmdJTy5TdHJpbmdJTygnXHhmZlx4ZmYnKSkKKyAgICA2NTUzNQorICAgICIiIgorCisgICAgZGF0YSA9IGYucmVhZCgyKQorICAgIGlmIGxlbihkYXRhKSA9PSAyOgorICAgICAgICByZXR1cm4gX3VucGFjaygiPEgiLCBkYXRhKVswXQorICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdCBlbm91Z2ggZGF0YSBpbiBzdHJlYW0gdG8gcmVhZCB1aW50MiIpCisKK3VpbnQyID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgbmFtZT0ndWludDInLAorICAgICAgICAgICAgbj0yLAorICAgICAgICAgICAgcmVhZGVyPXJlYWRfdWludDIsCisgICAgICAgICAgICBkb2M9IlR3by1ieXRlIHVuc2lnbmVkIGludGVnZXIsIGxpdHRsZS1lbmRpYW4uIikKKworCitkZWYgcmVhZF9pbnQ0KGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfaW50NChTdHJpbmdJTy5TdHJpbmdJTygnXHhmZlx4MDBceDAwXHgwMCcpKQorICAgIDI1NQorICAgID4+PiByZWFkX2ludDQoU3RyaW5nSU8uU3RyaW5nSU8oJ1x4MDBceDAwXHgwMFx4ODAnKSkgPT0gLSgyKiozMSkKKyAgICBUcnVlCisgICAgIiIiCisKKyAgICBkYXRhID0gZi5yZWFkKDQpCisgICAgaWYgbGVuKGRhdGEpID09IDQ6CisgICAgICAgIHJldHVybiBfdW5wYWNrKCI8aSIsIGRhdGEpWzBdCisgICAgcmFpc2UgVmFsdWVFcnJvcigibm90IGVub3VnaCBkYXRhIGluIHN0cmVhbSB0byByZWFkIGludDQiKQorCitpbnQ0ID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICBuYW1lPSdpbnQ0JywKKyAgICAgICAgICAgbj00LAorICAgICAgICAgICByZWFkZXI9cmVhZF9pbnQ0LAorICAgICAgICAgICBkb2M9IkZvdXItYnl0ZSBzaWduZWQgaW50ZWdlciwgbGl0dGxlLWVuZGlhbiwgMidzIGNvbXBsZW1lbnQuIikKKworCitkZWYgcmVhZF9zdHJpbmdubChmLCBkZWNvZGU9VHJ1ZSwgc3RyaXBxdW90ZXM9VHJ1ZSk6CisgICAgciIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKyAgICA+Pj4gcmVhZF9zdHJpbmdubChTdHJpbmdJTy5TdHJpbmdJTygiJ2FiY2QnXG5lZmdcbiIpKQorICAgICdhYmNkJworCisgICAgPj4+IHJlYWRfc3RyaW5nbmwoU3RyaW5nSU8uU3RyaW5nSU8oIlxuIikpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IG5vIHN0cmluZyBxdW90ZXMgYXJvdW5kICcnCisKKyAgICA+Pj4gcmVhZF9zdHJpbmdubChTdHJpbmdJTy5TdHJpbmdJTygiXG4iKSwgc3RyaXBxdW90ZXM9RmFsc2UpCisgICAgJycKKworICAgID4+PiByZWFkX3N0cmluZ25sKFN0cmluZ0lPLlN0cmluZ0lPKCInJ1xuIikpCisgICAgJycKKworICAgID4+PiByZWFkX3N0cmluZ25sKFN0cmluZ0lPLlN0cmluZ0lPKCciYWJjZCInKSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uCisgICAgVmFsdWVFcnJvcjogbm8gbmV3bGluZSBmb3VuZCB3aGVuIHRyeWluZyB0byByZWFkIHN0cmluZ25sCisKKyAgICBFbWJlZGRlZCBlc2NhcGVzIGFyZSB1bmRvbmUgaW4gdGhlIHJlc3VsdC4KKyAgICA+Pj4gcmVhZF9zdHJpbmdubChTdHJpbmdJTy5TdHJpbmdJTyhyIidhXG5cXGJceDAwY1x0ZCciICsgIlxuJ2UnIikpCisgICAgJ2FcblxcYlx4MDBjXHRkJworICAgICIiIgorCisgICAgZGF0YSA9IGYucmVhZGxpbmUoKQorICAgIGlmIG5vdCBkYXRhLmVuZHN3aXRoKCdcbicpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBuZXdsaW5lIGZvdW5kIHdoZW4gdHJ5aW5nIHRvIHJlYWQgc3RyaW5nbmwiKQorICAgIGRhdGEgPSBkYXRhWzotMV0gICAgIyBsb3NlIHRoZSBuZXdsaW5lCisKKyAgICBpZiBzdHJpcHF1b3RlczoKKyAgICAgICAgZm9yIHEgaW4gIidcIiI6CisgICAgICAgICAgICBpZiBkYXRhLnN0YXJ0c3dpdGgocSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGEuZW5kc3dpdGgocSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInN0cmlucSBxdW90ZSAlciBub3QgZm91bmQgYXQgYm90aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVuZHMgb2YgJXIiICUgKHEsIGRhdGEpKQorICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhWzE6LTFdCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIHN0cmluZyBxdW90ZXMgYXJvdW5kICVyIiAlIGRhdGEpCisKKyAgICAjIEknbSBub3Qgc3VyZSB3aGVuICdzdHJpbmdfZXNjYXBlJyB3YXMgYWRkZWQgdG8gdGhlIHN0ZCBjb2RlY3M7IGl0J3MKKyAgICAjIGNyYXp5IG5vdCB0byB1c2UgaXQgaWYgaXQncyB0aGVyZS4KKyAgICBpZiBkZWNvZGU6CisgICAgICAgIGRhdGEgPSBkYXRhLmRlY29kZSgnc3RyaW5nX2VzY2FwZScpCisgICAgcmV0dXJuIGRhdGEKKworc3RyaW5nbmwgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICBuYW1lPSdzdHJpbmdubCcsCisgICAgICAgICAgICAgICBuPVVQX1RPX05FV0xJTkUsCisgICAgICAgICAgICAgICByZWFkZXI9cmVhZF9zdHJpbmdubCwKKyAgICAgICAgICAgICAgIGRvYz0iIiJBIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmcuCisKKyAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgcmVwci1zdHlsZSBzdHJpbmcsIHdpdGggZW1iZWRkZWQgZXNjYXBlcywgYW5kCisgICAgICAgICAgICAgICAgICAgYnJhY2tldGluZyBxdW90ZXMuCisgICAgICAgICAgICAgICAgICAgIiIiKQorCitkZWYgcmVhZF9zdHJpbmdubF9ub2VzY2FwZShmKToKKyAgICByZXR1cm4gcmVhZF9zdHJpbmdubChmLCBkZWNvZGU9RmFsc2UsIHN0cmlwcXVvdGVzPUZhbHNlKQorCitzdHJpbmdubF9ub2VzY2FwZSA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J3N0cmluZ25sX25vZXNjYXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgIG49VVBfVE9fTkVXTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX3N0cmluZ25sX25vZXNjYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZG9jPSIiIkEgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZy4KKworICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhIHN0ci1zdHlsZSBzdHJpbmcsIHdpdGhvdXQgZW1iZWRkZWQgZXNjYXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yIGJyYWNrZXRpbmcgcXVvdGVzLiAgSXQgc2hvdWxkIGNvbnNpc3Qgc29sZWx5IG9mCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGFibGUgQVNDSUkgY2hhcmFjdGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICIiIikKKworZGVmIHJlYWRfc3RyaW5nbmxfbm9lc2NhcGVfcGFpcihmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX3N0cmluZ25sX25vZXNjYXBlX3BhaXIoU3RyaW5nSU8uU3RyaW5nSU8oIlF1ZXVlXG5FbXB0eVxuanVuayIpKQorICAgICdRdWV1ZSBFbXB0eScKKyAgICAiIiIKKworICAgIHJldHVybiAiJXMgJXMiICUgKHJlYWRfc3RyaW5nbmxfbm9lc2NhcGUoZiksIHJlYWRfc3RyaW5nbmxfbm9lc2NhcGUoZikpCisKK3N0cmluZ25sX25vZXNjYXBlX3BhaXIgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J3N0cmluZ25sX25vZXNjYXBlX3BhaXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuPVVQX1RPX05FV0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX3N0cmluZ25sX25vZXNjYXBlX3BhaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvYz0iIiJBIHBhaXIgb2YgbmV3bGluZS10ZXJtaW5hdGVkIHN0cmluZ3MuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgYXJlIHN0ci1zdHlsZSBzdHJpbmdzLCB3aXRob3V0IGVtYmVkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZXMsIG9yIGJyYWNrZXRpbmcgcXVvdGVzLiAgVGhleSBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc2lzdCBzb2xlbHkgb2YgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBwYWlyIGlzIHJldHVybmVkIGFzIGEgc2luZ2xlIHN0cmluZywgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSBibGFuayBzZXBhcmF0aW5nIHRoZSB0d28gc3RyaW5ncy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCitkZWYgcmVhZF9zdHJpbmc0KGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfc3RyaW5nNChTdHJpbmdJTy5TdHJpbmdJTygiXHgwMFx4MDBceDAwXHgwMGFiYyIpKQorICAgICcnCisgICAgPj4+IHJlYWRfc3RyaW5nNChTdHJpbmdJTy5TdHJpbmdJTygiXHgwM1x4MDBceDAwXHgwMGFiY2RlZiIpKQorICAgICdhYmMnCisgICAgPj4+IHJlYWRfc3RyaW5nNChTdHJpbmdJTy5TdHJpbmdJTygiXHgwMFx4MDBceDAwXHgwM2FiY2RlZiIpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4KKyAgICBWYWx1ZUVycm9yOiBleHBlY3RlZCA1MDMzMTY0OCBieXRlcyBpbiBhIHN0cmluZzQsIGJ1dCBvbmx5IDYgcmVtYWluCisgICAgIiIiCisKKyAgICBuID0gcmVhZF9pbnQ0KGYpCisgICAgaWYgbiA8IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInN0cmluZzQgYnl0ZSBjb3VudCA8IDA6ICVkIiAlIG4pCisgICAgZGF0YSA9IGYucmVhZChuKQorICAgIGlmIGxlbihkYXRhKSA9PSBuOgorICAgICAgICByZXR1cm4gZGF0YQorICAgIHJhaXNlIFZhbHVlRXJyb3IoImV4cGVjdGVkICVkIGJ5dGVzIGluIGEgc3RyaW5nNCwgYnV0IG9ubHkgJWQgcmVtYWluIiAlCisgICAgICAgICAgICAgICAgICAgICAobiwgbGVuKGRhdGEpKSkKKworc3RyaW5nNCA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgbmFtZT0ic3RyaW5nNCIsCisgICAgICAgICAgICAgIG49VEFLRU5fRlJPTV9BUkdVTUVOVDQsCisgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX3N0cmluZzQsCisgICAgICAgICAgICAgIGRvYz0iIiJBIGNvdW50ZWQgc3RyaW5nLgorCisgICAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIDQtYnl0ZSBsaXR0bGUtZW5kaWFuIHNpZ25lZCBpbnQgZ2l2aW5nCisgICAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZywgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMKKyAgICAgICAgICAgICAgdGhhdCBtYW55IGJ5dGVzLgorICAgICAgICAgICAgICAiIiIpCisKKworZGVmIHJlYWRfc3RyaW5nMShmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX3N0cmluZzEoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDAiKSkKKyAgICAnJworICAgID4+PiByZWFkX3N0cmluZzEoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDNhYmNkZWYiKSkKKyAgICAnYWJjJworICAgICIiIgorCisgICAgbiA9IHJlYWRfdWludDEoZikKKyAgICBhc3NlcnQgbiA+PSAwCisgICAgZGF0YSA9IGYucmVhZChuKQorICAgIGlmIGxlbihkYXRhKSA9PSBuOgorICAgICAgICByZXR1cm4gZGF0YQorICAgIHJhaXNlIFZhbHVlRXJyb3IoImV4cGVjdGVkICVkIGJ5dGVzIGluIGEgc3RyaW5nMSwgYnV0IG9ubHkgJWQgcmVtYWluIiAlCisgICAgICAgICAgICAgICAgICAgICAobiwgbGVuKGRhdGEpKSkKKworc3RyaW5nMSA9IEFyZ3VtZW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgbmFtZT0ic3RyaW5nMSIsCisgICAgICAgICAgICAgIG49VEFLRU5fRlJPTV9BUkdVTUVOVDEsCisgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX3N0cmluZzEsCisgICAgICAgICAgICAgIGRvYz0iIiJBIGNvdW50ZWQgc3RyaW5nLgorCisgICAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCBpcyBhIDEtYnl0ZSB1bnNpZ25lZCBpbnQgZ2l2aW5nIHRoZSBudW1iZXIKKyAgICAgICAgICAgICAgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZywgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhhdCBtYW55CisgICAgICAgICAgICAgIGJ5dGVzLgorICAgICAgICAgICAgICAiIiIpCisKKworZGVmIHJlYWRfdW5pY29kZXN0cmluZ25sKGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfdW5pY29kZXN0cmluZ25sKFN0cmluZ0lPLlN0cmluZ0lPKCJhYmNcdWFiY2Rcbmp1bmsiKSkKKyAgICB1J2FiY1x1YWJjZCcKKyAgICAiIiIKKworICAgIGRhdGEgPSBmLnJlYWRsaW5lKCkKKyAgICBpZiBub3QgZGF0YS5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm8gbmV3bGluZSBmb3VuZCB3aGVuIHRyeWluZyB0byByZWFkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidW5pY29kZXN0cmluZ25sIikKKyAgICBkYXRhID0gZGF0YVs6LTFdICAgICMgbG9zZSB0aGUgbmV3bGluZQorICAgIHJldHVybiB1bmljb2RlKGRhdGEsICdyYXctdW5pY29kZS1lc2NhcGUnKQorCit1bmljb2Rlc3RyaW5nbmwgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgbmFtZT0ndW5pY29kZXN0cmluZ25sJywKKyAgICAgICAgICAgICAgICAgICAgICBuPVVQX1RPX05FV0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyPXJlYWRfdW5pY29kZXN0cmluZ25sLAorICAgICAgICAgICAgICAgICAgICAgIGRvYz0iIiJBIG5ld2xpbmUtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZy4KKworICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgcmF3LXVuaWNvZGUtZXNjYXBlIGVuY29kZWQsIHNvIGNvbnNpc3RzIG9mCisgICAgICAgICAgICAgICAgICAgICAgcHJpbnRhYmxlIEFTQ0lJIGNoYXJhY3RlcnMsIGFuZCBtYXkgY29udGFpbiBlbWJlZGRlZAorICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZSBzZXF1ZW5jZXMuCisgICAgICAgICAgICAgICAgICAgICAgIiIiKQorCitkZWYgcmVhZF91bmljb2Rlc3RyaW5nNChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiBzID0gdSdhYmNkXHVhYmNkJworICAgID4+PiBlbmMgPSBzLmVuY29kZSgndXRmLTgnKQorICAgID4+PiBlbmMKKyAgICAnYWJjZFx4ZWFceGFmXHg4ZCcKKyAgICA+Pj4gbiA9IGNocihsZW4oZW5jKSkgKyBjaHIoMCkgKiAzICAjIGxpdHRsZS1lbmRpYW4gNC1ieXRlIGxlbmd0aAorICAgID4+PiB0ID0gcmVhZF91bmljb2Rlc3RyaW5nNChTdHJpbmdJTy5TdHJpbmdJTyhuICsgZW5jICsgJ2p1bmsnKSkKKyAgICA+Pj4gcyA9PSB0CisgICAgVHJ1ZQorCisgICAgPj4+IHJlYWRfdW5pY29kZXN0cmluZzQoU3RyaW5nSU8uU3RyaW5nSU8obiArIGVuY1s6LTFdKSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uCisgICAgVmFsdWVFcnJvcjogZXhwZWN0ZWQgNyBieXRlcyBpbiBhIHVuaWNvZGVzdHJpbmc0LCBidXQgb25seSA2IHJlbWFpbgorICAgICIiIgorCisgICAgbiA9IHJlYWRfaW50NChmKQorICAgIGlmIG4gPCAwOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmljb2Rlc3RyaW5nNCBieXRlIGNvdW50IDwgMDogJWQiICUgbikKKyAgICBkYXRhID0gZi5yZWFkKG4pCisgICAgaWYgbGVuKGRhdGEpID09IG46CisgICAgICAgIHJldHVybiB1bmljb2RlKGRhdGEsICd1dGYtOCcpCisgICAgcmFpc2UgVmFsdWVFcnJvcigiZXhwZWN0ZWQgJWQgYnl0ZXMgaW4gYSB1bmljb2Rlc3RyaW5nNCwgYnV0IG9ubHkgJWQgIgorICAgICAgICAgICAgICAgICAgICAgInJlbWFpbiIgJSAobiwgbGVuKGRhdGEpKSkKKwordW5pY29kZXN0cmluZzQgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgIG5hbWU9InVuaWNvZGVzdHJpbmc0IiwKKyAgICAgICAgICAgICAgICAgICAgbj1UQUtFTl9GUk9NX0FSR1VNRU5UNCwKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyPXJlYWRfdW5pY29kZXN0cmluZzQsCisgICAgICAgICAgICAgICAgICAgIGRvYz0iIiJBIGNvdW50ZWQgVW5pY29kZSBzdHJpbmcuCisKKyAgICAgICAgICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgNC1ieXRlIGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludAorICAgICAgICAgICAgICAgICAgICBnaXZpbmcgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3RyaW5nLCBhbmQgdGhlIHNlY29uZAorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC0tIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgVW5pY29kZSBzdHJpbmcgLS0KKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhhdCBtYW55IGJ5dGVzLgorICAgICAgICAgICAgICAgICAgICAiIiIpCisKKworZGVmIHJlYWRfZGVjaW1hbG5sX3Nob3J0KGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfZGVjaW1hbG5sX3Nob3J0KFN0cmluZ0lPLlN0cmluZ0lPKCIxMjM0XG41NiIpKQorICAgIDEyMzQKKworICAgID4+PiByZWFkX2RlY2ltYWxubF9zaG9ydChTdHJpbmdJTy5TdHJpbmdJTygiMTIzNExcbjU2IikpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IHRyYWlsaW5nICdMJyBub3QgYWxsb3dlZCBpbiAnMTIzNEwnCisgICAgIiIiCisKKyAgICBzID0gcmVhZF9zdHJpbmdubChmLCBkZWNvZGU9RmFsc2UsIHN0cmlwcXVvdGVzPUZhbHNlKQorICAgIGlmIHMuZW5kc3dpdGgoIkwiKToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidHJhaWxpbmcgJ0wnIG5vdCBhbGxvd2VkIGluICVyIiAlIHMpCisKKyAgICAjIEl0J3Mgbm90IG5lY2Vzc2FyaWx5IHRydWUgdGhhdCB0aGUgcmVzdWx0IGZpdHMgaW4gYSBQeXRob24gc2hvcnQgaW50OgorICAgICMgdGhlIHBpY2tsZSBtYXkgaGF2ZSBiZWVuIHdyaXR0ZW4gb24gYSA2NC1iaXQgYm94LiAgVGhlcmUncyBhbHNvIGEgaGFjaworICAgICMgZm9yIFRydWUgYW5kIEZhbHNlIGhlcmUuCisgICAgaWYgcyA9PSAiMDAiOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbGlmIHMgPT0gIjAxIjoKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGludChzKQorICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICByZXR1cm4gbG9uZyhzKQorCitkZWYgcmVhZF9kZWNpbWFsbmxfbG9uZyhmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworCisgICAgPj4+IHJlYWRfZGVjaW1hbG5sX2xvbmcoU3RyaW5nSU8uU3RyaW5nSU8oIjEyMzRcbjU2IikpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IHRyYWlsaW5nICdMJyByZXF1aXJlZCBpbiAnMTIzNCcKKworICAgIFNvbWVkYXkgdGhlIHRyYWlsaW5nICdMJyB3aWxsIHByb2JhYmx5IGdvIGF3YXkgZnJvbSB0aGlzIG91dHB1dC4KKworICAgID4+PiByZWFkX2RlY2ltYWxubF9sb25nKFN0cmluZ0lPLlN0cmluZ0lPKCIxMjM0TFxuNTYiKSkKKyAgICAxMjM0TAorCisgICAgPj4+IHJlYWRfZGVjaW1hbG5sX2xvbmcoU3RyaW5nSU8uU3RyaW5nSU8oIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNExcbjYiKSkKKyAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzRMCisgICAgIiIiCisKKyAgICBzID0gcmVhZF9zdHJpbmdubChmLCBkZWNvZGU9RmFsc2UsIHN0cmlwcXVvdGVzPUZhbHNlKQorICAgIGlmIG5vdCBzLmVuZHN3aXRoKCJMIik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRyYWlsaW5nICdMJyByZXF1aXJlZCBpbiAlciIgJSBzKQorICAgIHJldHVybiBsb25nKHMpCisKKworZGVjaW1hbG5sX3Nob3J0ID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgIG5hbWU9J2RlY2ltYWxubF9zaG9ydCcsCisgICAgICAgICAgICAgICAgICAgICAgbj1VUF9UT19ORVdMSU5FLAorICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcj1yZWFkX2RlY2ltYWxubF9zaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICBkb2M9IiIiQSBuZXdsaW5lLXRlcm1pbmF0ZWQgZGVjaW1hbCBpbnRlZ2VyIGxpdGVyYWwuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBuZXZlciBoYXMgYSB0cmFpbGluZyAnTCcsIGFuZCB0aGUgaW50ZWdlciBmaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYSBzaG9ydCBQeXRob24gaW50IG9uIHRoZSBib3ggd2hlcmUgdGhlIHBpY2tsZQorICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgd3JpdHRlbiAtLSBidXQgdGhlcmUncyBubyBndWFyYW50ZWUgaXQgd2lsbCBmaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYSBzaG9ydCBQeXRob24gaW50IG9uIHRoZSBib3ggd2hlcmUgdGhlIHBpY2tsZQorICAgICAgICAgICAgICAgICAgICAgICAgICBpcyByZWFkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKK2RlY2ltYWxubF9sb25nID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICAgbmFtZT0nZGVjaW1hbG5sX2xvbmcnLAorICAgICAgICAgICAgICAgICAgICAgbj1VUF9UT19ORVdMSU5FLAorICAgICAgICAgICAgICAgICAgICAgcmVhZGVyPXJlYWRfZGVjaW1hbG5sX2xvbmcsCisgICAgICAgICAgICAgICAgICAgICBkb2M9IiIiQSBuZXdsaW5lLXRlcm1pbmF0ZWQgZGVjaW1hbCBpbnRlZ2VyIGxpdGVyYWwuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGhhcyBhIHRyYWlsaW5nICdMJywgYW5kIGNhbiByZXByZXNlbnQgaW50ZWdlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhbnkgc2l6ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiIpCisKKworZGVmIHJlYWRfZmxvYXRubChmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX2Zsb2F0bmwoU3RyaW5nSU8uU3RyaW5nSU8oIi0xLjI1XG42IikpCisgICAgLTEuMjUKKyAgICAiIiIKKyAgICBzID0gcmVhZF9zdHJpbmdubChmLCBkZWNvZGU9RmFsc2UsIHN0cmlwcXVvdGVzPUZhbHNlKQorICAgIHJldHVybiBmbG9hdChzKQorCitmbG9hdG5sID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgICAgICAgICAgICBuYW1lPSdmbG9hdG5sJywKKyAgICAgICAgICAgICAgbj1VUF9UT19ORVdMSU5FLAorICAgICAgICAgICAgICByZWFkZXI9cmVhZF9mbG9hdG5sLAorICAgICAgICAgICAgICBkb2M9IiIiQSBuZXdsaW5lLXRlcm1pbmF0ZWQgZGVjaW1hbCBmbG9hdGluZyBsaXRlcmFsLgorCisgICAgICAgICAgICAgIEluIGdlbmVyYWwgdGhpcyByZXF1aXJlcyAxNyBzaWduaWZpY2FudCBkaWdpdHMgZm9yIHJvdW5kdHJpcAorICAgICAgICAgICAgICBpZGVudGl0eSwgYW5kIHBpY2tsaW5nIHRoZW4gdW5waWNrbGluZyBpbmZpbml0aWVzLCBOYU5zLCBhbmQKKyAgICAgICAgICAgICAgbWludXMgemVybyBkb2Vzbid0IHdvcmsgYWNyb3NzIGJveGVzLCBvciBvbiBzb21lIGJveGVzIGV2ZW4KKyAgICAgICAgICAgICAgb24gaXRzZWxmIChlLmcuLCBXaW5kb3dzIGNhbid0IHJlYWQgdGhlIHN0cmluZ3MgaXQgcHJvZHVjZXMKKyAgICAgICAgICAgICAgZm9yIGluZmluaXRpZXMgb3IgTmFOcykuCisgICAgICAgICAgICAgICIiIikKKworZGVmIHJlYWRfZmxvYXQ4KGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPLCBzdHJ1Y3QKKyAgICA+Pj4gcmF3ID0gc3RydWN0LnBhY2soIj5kIiwgLTEuMjUpCisgICAgPj4+IHJhdworICAgICdceGJmXHhmNFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICA+Pj4gcmVhZF9mbG9hdDgoU3RyaW5nSU8uU3RyaW5nSU8ocmF3ICsgIlxuIikpCisgICAgLTEuMjUKKyAgICAiIiIKKworICAgIGRhdGEgPSBmLnJlYWQoOCkKKyAgICBpZiBsZW4oZGF0YSkgPT0gODoKKyAgICAgICAgcmV0dXJuIF91bnBhY2soIj5kIiwgZGF0YSlbMF0KKyAgICByYWlzZSBWYWx1ZUVycm9yKCJub3QgZW5vdWdoIGRhdGEgaW4gc3RyZWFtIHRvIHJlYWQgZmxvYXQ4IikKKworCitmbG9hdDggPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgICAgICAgICAgbmFtZT0nZmxvYXQ4JywKKyAgICAgICAgICAgICBuPTgsCisgICAgICAgICAgICAgcmVhZGVyPXJlYWRfZmxvYXQ4LAorICAgICAgICAgICAgIGRvYz0iIiJBbiA4LWJ5dGUgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGEgZmxvYXQsIGJpZy1lbmRpYW4uCisKKyAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIHVuaXF1ZSB0byBQeXRob24sIGFuZCBzaGFyZWQgd2l0aCB0aGUgc3RydWN0CisgICAgICAgICAgICAgbW9kdWxlIChmb3JtYXQgc3RyaW5nICc+ZCcpICJpbiB0aGVvcnkiICh0aGUgc3RydWN0IGFuZCBjUGlja2xlCisgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIGRvbid0IHNoYXJlIHRoZSBjb2RlIC0tIHRoZXkgc2hvdWxkKS4gIEl0J3MKKyAgICAgICAgICAgICBzdHJvbmdseSByZWxhdGVkIHRvIHRoZSBJRUVFLTc1NCBkb3VibGUgZm9ybWF0LCBhbmQsIGluIG5vcm1hbAorICAgICAgICAgICAgIGNhc2VzLCBpcyBpbiBmYWN0IGlkZW50aWNhbCB0byB0aGUgYmlnLWVuZGlhbiA3NTQgZG91YmxlIGZvcm1hdC4KKyAgICAgICAgICAgICBPbiBvdGhlciBib3hlcyB0aGUgZHluYW1pYyByYW5nZSBpcyBsaW1pdGVkIHRvIHRoYXQgb2YgYSA3NTQKKyAgICAgICAgICAgICBkb3VibGUsIGFuZCAiYWRkIGEgaGFsZiBhbmQgY2hvcCIgcm91bmRpbmcgaXMgdXNlZCB0byByZWR1Y2UKKyAgICAgICAgICAgICB0aGUgcHJlY2lzaW9uIHRvIDUzIGJpdHMuICBIb3dldmVyLCBldmVuIG9uIGEgNzU0IGJveCwKKyAgICAgICAgICAgICBpbmZpbml0aWVzLCBOYU5zLCBhbmQgbWludXMgemVybyBtYXkgbm90IGJlIGhhbmRsZWQgY29ycmVjdGx5CisgICAgICAgICAgICAgKG1heSBub3Qgc3Vydml2ZSByb3VuZHRyaXAgcGlja2xpbmcgaW50YWN0KS4KKyAgICAgICAgICAgICAiIiIpCisKKyMgUHJvdG9jb2wgMiBmb3JtYXRzCisKK2Zyb20gcGlja2xlIGltcG9ydCBkZWNvZGVfbG9uZworCitkZWYgcmVhZF9sb25nMShmKToKKyAgICByIiIiCisgICAgPj4+IGltcG9ydCBTdHJpbmdJTworICAgID4+PiByZWFkX2xvbmcxKFN0cmluZ0lPLlN0cmluZ0lPKCJceDAwIikpCisgICAgMEwKKyAgICA+Pj4gcmVhZF9sb25nMShTdHJpbmdJTy5TdHJpbmdJTygiXHgwMlx4ZmZceDAwIikpCisgICAgMjU1TAorICAgID4+PiByZWFkX2xvbmcxKFN0cmluZ0lPLlN0cmluZ0lPKCJceDAyXHhmZlx4N2YiKSkKKyAgICAzMjc2N0wKKyAgICA+Pj4gcmVhZF9sb25nMShTdHJpbmdJTy5TdHJpbmdJTygiXHgwMlx4MDBceGZmIikpCisgICAgLTI1NkwKKyAgICA+Pj4gcmVhZF9sb25nMShTdHJpbmdJTy5TdHJpbmdJTygiXHgwMlx4MDBceDgwIikpCisgICAgLTMyNzY4TAorICAgICIiIgorCisgICAgbiA9IHJlYWRfdWludDEoZikKKyAgICBkYXRhID0gZi5yZWFkKG4pCisgICAgaWYgbGVuKGRhdGEpICE9IG46CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdCBlbm91Z2ggZGF0YSBpbiBzdHJlYW0gdG8gcmVhZCBsb25nMSIpCisgICAgcmV0dXJuIGRlY29kZV9sb25nKGRhdGEpCisKK2xvbmcxID0gQXJndW1lbnREZXNjcmlwdG9yKAorICAgIG5hbWU9ImxvbmcxIiwKKyAgICBuPVRBS0VOX0ZST01fQVJHVU1FTlQxLAorICAgIHJlYWRlcj1yZWFkX2xvbmcxLAorICAgIGRvYz0iIiJBIGJpbmFyeSBsb25nLCBsaXR0bGUtZW5kaWFuLCB1c2luZyAxLWJ5dGUgc2l6ZS4KKworICAgIFRoaXMgZmlyc3QgcmVhZHMgb25lIGJ5dGUgYXMgYW4gdW5zaWduZWQgc2l6ZSwgdGhlbiByZWFkcyB0aGF0CisgICAgbWFueSBieXRlcyBhbmQgaW50ZXJwcmV0cyB0aGVtIGFzIGEgbGl0dGxlLWVuZGlhbiAyJ3MtY29tcGxlbWVudCBsb25nLgorICAgIElmIHRoZSBzaXplIGlzIDAsIHRoYXQncyB0YWtlbiBhcyBhIHNob3J0Y3V0IGZvciB0aGUgbG9uZyAwTC4KKyAgICAiIiIpCisKK2RlZiByZWFkX2xvbmc0KGYpOgorICAgIHIiIiIKKyAgICA+Pj4gaW1wb3J0IFN0cmluZ0lPCisgICAgPj4+IHJlYWRfbG9uZzQoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDJceDAwXHgwMFx4MDBceGZmXHgwMCIpKQorICAgIDI1NUwKKyAgICA+Pj4gcmVhZF9sb25nNChTdHJpbmdJTy5TdHJpbmdJTygiXHgwMlx4MDBceDAwXHgwMFx4ZmZceDdmIikpCisgICAgMzI3NjdMCisgICAgPj4+IHJlYWRfbG9uZzQoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDJceDAwXHgwMFx4MDBceDAwXHhmZiIpKQorICAgIC0yNTZMCisgICAgPj4+IHJlYWRfbG9uZzQoU3RyaW5nSU8uU3RyaW5nSU8oIlx4MDJceDAwXHgwMFx4MDBceDAwXHg4MCIpKQorICAgIC0zMjc2OEwKKyAgICA+Pj4gcmVhZF9sb25nMShTdHJpbmdJTy5TdHJpbmdJTygiXHgwMFx4MDBceDAwXHgwMCIpKQorICAgIDBMCisgICAgIiIiCisKKyAgICBuID0gcmVhZF9pbnQ0KGYpCisgICAgaWYgbiA8IDA6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxvbmc0IGJ5dGUgY291bnQgPCAwOiAlZCIgJSBuKQorICAgIGRhdGEgPSBmLnJlYWQobikKKyAgICBpZiBsZW4oZGF0YSkgIT0gbjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm90IGVub3VnaCBkYXRhIGluIHN0cmVhbSB0byByZWFkIGxvbmc0IikKKyAgICByZXR1cm4gZGVjb2RlX2xvbmcoZGF0YSkKKworbG9uZzQgPSBBcmd1bWVudERlc2NyaXB0b3IoCisgICAgbmFtZT0ibG9uZzQiLAorICAgIG49VEFLRU5fRlJPTV9BUkdVTUVOVDQsCisgICAgcmVhZGVyPXJlYWRfbG9uZzQsCisgICAgZG9jPSIiIkEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIG9mIGEgbG9uZywgbGl0dGxlLWVuZGlhbi4KKworICAgIFRoaXMgZmlyc3QgcmVhZHMgZm91ciBieXRlcyBhcyBhIHNpZ25lZCBzaXplIChidXQgcmVxdWlyZXMgdGhlCisgICAgc2l6ZSB0byBiZSA+PSAwKSwgdGhlbiByZWFkcyB0aGF0IG1hbnkgYnl0ZXMgYW5kIGludGVycHJldHMgdGhlbQorICAgIGFzIGEgbGl0dGxlLWVuZGlhbiAyJ3MtY29tcGxlbWVudCBsb25nLiAgSWYgdGhlIHNpemUgaXMgMCwgdGhhdCdzIHRha2VuCisgICAgYXMgYSBzaG9ydGN1dCBmb3IgdGhlIGxvbmcgMEwsIGFsdGhvdWdoIExPTkcxIHNob3VsZCByZWFsbHkgYmUgdXNlZAorICAgIHRoZW4gaW5zdGVhZCAoYW5kIGluIGFueSBjYXNlIHdoZXJlICMgb2YgYnl0ZXMgPCAyNTYpLgorICAgICIiIikKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT2JqZWN0IGRlc2NyaXB0b3JzLiAgVGhlIHN0YWNrIHVzZWQgYnkgdGhlIHBpY2tsZSBtYWNoaW5lIGhvbGRzIG9iamVjdHMsCisjIGFuZCBpbiB0aGUgc3RhY2tfYmVmb3JlIGFuZCBzdGFja19hZnRlciBhdHRyaWJ1dGVzIG9mIE9wY29kZUluZm8KKyMgZGVzY3JpcHRvcnMgd2UgbmVlZCBuYW1lcyB0byBkZXNjcmliZSB0aGUgdmFyaW91cyB0eXBlcyBvZiBvYmplY3RzIHRoYXQgY2FuCisjIGFwcGVhciBvbiB0aGUgc3RhY2suCisKK2NsYXNzIFN0YWNrT2JqZWN0KG9iamVjdCk6CisgICAgX19zbG90c19fID0gKAorICAgICAgICAjIG5hbWUgb2YgZGVzY3JpcHRvciByZWNvcmQsIGZvciBpbmZvIG9ubHkKKyAgICAgICAgJ25hbWUnLAorCisgICAgICAgICMgdHlwZSBvZiBvYmplY3QsIG9yIHR1cGxlIG9mIHR5cGUgb2JqZWN0cyAobWVhbmluZyB0aGUgb2JqZWN0IGNhbgorICAgICAgICAjIGJlIG9mIGFueSB0eXBlIGluIHRoZSB0dXBsZSkKKyAgICAgICAgJ29idHlwZScsCisKKyAgICAgICAgIyBodW1hbi1yZWFkYWJsZSBkb2NzIGZvciB0aGlzIGtpbmQgb2Ygc3RhY2sgb2JqZWN0OyBhIHN0cmluZworICAgICAgICAnZG9jJywKKyAgICApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgb2J0eXBlLCBkb2MpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShuYW1lLCBzdHIpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShvYnR5cGUsIHR5cGUpIG9yIGlzaW5zdGFuY2Uob2J0eXBlLCB0dXBsZSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYnR5cGUsIHR1cGxlKToKKyAgICAgICAgICAgIGZvciBjb250YWluZWQgaW4gb2J0eXBlOgorICAgICAgICAgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKGNvbnRhaW5lZCwgdHlwZSkKKyAgICAgICAgc2VsZi5vYnR5cGUgPSBvYnR5cGUKKworICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZShkb2MsIHN0cikKKyAgICAgICAgc2VsZi5kb2MgPSBkb2MKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorCisKK3B5aW50ID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICBuYW1lPSdpbnQnLAorICAgICAgICAgICAgb2J0eXBlPWludCwKKyAgICAgICAgICAgIGRvYz0iQSBzaG9ydCAoYXMgb3Bwb3NlZCB0byBsb25nKSBQeXRob24gaW50ZWdlciBvYmplY3QuIikKKworcHlsb25nID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgbmFtZT0nbG9uZycsCisgICAgICAgICAgICAgb2J0eXBlPWxvbmcsCisgICAgICAgICAgICAgZG9jPSJBIGxvbmcgKGFzIG9wcG9zZWQgdG8gc2hvcnQpIFB5dGhvbiBpbnRlZ2VyIG9iamVjdC4iKQorCitweWludGVnZXJfb3JfYm9vbCA9IFN0YWNrT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0naW50X29yX2Jvb2wnLAorICAgICAgICAgICAgICAgICAgICAgICAgb2J0eXBlPShpbnQsIGxvbmcsIGJvb2wpLAorICAgICAgICAgICAgICAgICAgICAgICAgZG9jPSJBIFB5dGhvbiBpbnRlZ2VyIG9iamVjdCAoc2hvcnQgb3IgbG9uZyksIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBQeXRob24gYm9vbC4iKQorCitweWJvb2wgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICBuYW1lPSdib29sJywKKyAgICAgICAgICAgICBvYnR5cGU9KGJvb2wsKSwKKyAgICAgICAgICAgICBkb2M9IkEgUHl0aG9uIGJvb2wgb2JqZWN0LiIpCisKK3B5ZmxvYXQgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICAgbmFtZT0nZmxvYXQnLAorICAgICAgICAgICAgICBvYnR5cGU9ZmxvYXQsCisgICAgICAgICAgICAgIGRvYz0iQSBQeXRob24gZmxvYXQgb2JqZWN0LiIpCisKK3B5c3RyaW5nID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgICBuYW1lPSdzdHInLAorICAgICAgICAgICAgICAgb2J0eXBlPXN0ciwKKyAgICAgICAgICAgICAgIGRvYz0iQSBQeXRob24gc3RyaW5nIG9iamVjdC4iKQorCitweXVuaWNvZGUgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICAgICBuYW1lPSd1bmljb2RlJywKKyAgICAgICAgICAgICAgICBvYnR5cGU9dW5pY29kZSwKKyAgICAgICAgICAgICAgICBkb2M9IkEgUHl0aG9uIFVuaWNvZGUgc3RyaW5nIG9iamVjdC4iKQorCitweW5vbmUgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICBuYW1lPSJOb25lIiwKKyAgICAgICAgICAgICBvYnR5cGU9dHlwZShOb25lKSwKKyAgICAgICAgICAgICBkb2M9IlRoZSBQeXRob24gTm9uZSBvYmplY3QuIikKKworcHl0dXBsZSA9IFN0YWNrT2JqZWN0KAorICAgICAgICAgICAgICBuYW1lPSJ0dXBsZSIsCisgICAgICAgICAgICAgIG9idHlwZT10dXBsZSwKKyAgICAgICAgICAgICAgZG9jPSJBIFB5dGhvbiB0dXBsZSBvYmplY3QuIikKKworcHlsaXN0ID0gU3RhY2tPYmplY3QoCisgICAgICAgICAgICAgbmFtZT0ibGlzdCIsCisgICAgICAgICAgICAgb2J0eXBlPWxpc3QsCisgICAgICAgICAgICAgZG9jPSJBIFB5dGhvbiBsaXN0IG9iamVjdC4iKQorCitweWRpY3QgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICBuYW1lPSJkaWN0IiwKKyAgICAgICAgICAgICBvYnR5cGU9ZGljdCwKKyAgICAgICAgICAgICBkb2M9IkEgUHl0aG9uIGRpY3Qgb2JqZWN0LiIpCisKK2FueW9iamVjdCA9IFN0YWNrT2JqZWN0KAorICAgICAgICAgICAgICAgIG5hbWU9J2FueScsCisgICAgICAgICAgICAgICAgb2J0eXBlPW9iamVjdCwKKyAgICAgICAgICAgICAgICBkb2M9IkFueSBraW5kIG9mIG9iamVjdCB3aGF0c29ldmVyLiIpCisKK21hcmtvYmplY3QgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICAgICAgbmFtZT0ibWFyayIsCisgICAgICAgICAgICAgICAgIG9idHlwZT1TdGFja09iamVjdCwKKyAgICAgICAgICAgICAgICAgZG9jPSIiIidUaGUgbWFyaycgaXMgYSB1bmlxdWUgb2JqZWN0LgorCisgICAgICAgICAgICAgICAgIE9wY29kZXMgdGhhdCBvcGVyYXRlIG9uIGEgdmFyaWFibGUgbnVtYmVyIG9mIG9iamVjdHMKKyAgICAgICAgICAgICAgICAgZ2VuZXJhbGx5IGRvbid0IGVtYmVkIHRoZSBjb3VudCBvZiBvYmplY3RzIGluIHRoZSBvcGNvZGUsCisgICAgICAgICAgICAgICAgIG9yIHB1bGwgaXQgb2ZmIHRoZSBzdGFjay4gIEluc3RlYWQgdGhlIE1BUksgb3Bjb2RlIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgdG8gcHVzaCBhIHNwZWNpYWwgbWFya2VyIG9iamVjdCBvbiB0aGUgc3RhY2ssIGFuZCB0aGVuCisgICAgICAgICAgICAgICAgIHNvbWUgb3RoZXIgb3Bjb2RlcyBncmFiIGFsbCB0aGUgb2JqZWN0cyBmcm9tIHRoZSB0b3Agb2YKKyAgICAgICAgICAgICAgICAgdGhlIHN0YWNrIGRvd24gdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgdG9wbW9zdCBtYXJrZXIKKyAgICAgICAgICAgICAgICAgb2JqZWN0LgorICAgICAgICAgICAgICAgICAiIiIpCisKK3N0YWNrc2xpY2UgPSBTdGFja09iamVjdCgKKyAgICAgICAgICAgICAgICAgbmFtZT0ic3RhY2tzbGljZSIsCisgICAgICAgICAgICAgICAgIG9idHlwZT1TdGFja09iamVjdCwKKyAgICAgICAgICAgICAgICAgZG9jPSIiIkFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjb250aWd1b3VzIHNsaWNlIG9mIHRoZSBzdGFjay4KKworICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgaW4gY29uanVjdGlvbiB3aXRoIG1hcmtvYmplY3QsIHRvIHJlcHJlc2VudCBhbGwKKyAgICAgICAgICAgICAgICAgb2YgdGhlIHN0YWNrIGZvbGxvd2luZyB0aGUgdG9wbW9zdCBtYXJrb2JqZWN0LiAgRm9yIGV4YW1wbGUsCisgICAgICAgICAgICAgICAgIHRoZSBQT1BfTUFSSyBvcGNvZGUgY2hhbmdlcyB0aGUgc3RhY2sgZnJvbQorCisgICAgICAgICAgICAgICAgICAgICBbLi4uLCBtYXJrb2JqZWN0LCBzdGFja3NsaWNlXQorICAgICAgICAgICAgICAgICB0bworICAgICAgICAgICAgICAgICAgICAgWy4uLl0KKworICAgICAgICAgICAgICAgICBObyBtYXR0ZXIgaG93IG1hbnkgb2JqZWN0IGFyZSBvbiB0aGUgc3RhY2sgYWZ0ZXIgdGhlIHRvcG1vc3QKKyAgICAgICAgICAgICAgICAgbWFya29iamVjdCwgUE9QX01BUksgZ2V0cyByaWQgb2YgYWxsIG9mIHRoZW0gKGluY2x1ZGluZyB0aGUKKyAgICAgICAgICAgICAgICAgdG9wbW9zdCBtYXJrb2JqZWN0IHRvbykuCisgICAgICAgICAgICAgICAgICIiIikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIERlc2NyaXB0b3JzIGZvciBwaWNrbGUgb3Bjb2Rlcy4KKworY2xhc3MgT3Bjb2RlSW5mbyhvYmplY3QpOgorCisgICAgX19zbG90c19fID0gKAorICAgICAgICAjIHN5bWJvbGljIG5hbWUgb2Ygb3Bjb2RlOyBhIHN0cmluZworICAgICAgICAnbmFtZScsCisKKyAgICAgICAgIyB0aGUgY29kZSB1c2VkIGluIGEgYnl0ZXN0cmVhbSB0byByZXByZXNlbnQgdGhlIG9wY29kZTsgYQorICAgICAgICAjIG9uZS1jaGFyYWN0ZXIgc3RyaW5nCisgICAgICAgICdjb2RlJywKKworICAgICAgICAjIElmIHRoZSBvcGNvZGUgaGFzIGFuIGFyZ3VtZW50IGVtYmVkZGVkIGluIHRoZSBieXRlIHN0cmluZywgYW4KKyAgICAgICAgIyBpbnN0YW5jZSBvZiBBcmd1bWVudERlc2NyaXB0b3Igc3BlY2lmeWluZyBpdHMgdHlwZS4gIE5vdGUgdGhhdAorICAgICAgICAjIGFyZy5yZWFkZXIocykgY2FuIGJlIHVzZWQgdG8gcmVhZCBhbmQgZGVjb2RlIHRoZSBhcmd1bWVudCBmcm9tCisgICAgICAgICMgdGhlIGJ5dGVzdHJlYW0gcywgYW5kIGFyZy5kb2MgZG9jdW1lbnRzIHRoZSBmb3JtYXQgb2YgdGhlIHJhdworICAgICAgICAjIGFyZ3VtZW50IGJ5dGVzLiAgSWYgdGhlIG9wY29kZSBkb2Vzbid0IGhhdmUgYW4gYXJndW1lbnQgZW1iZWRkZWQKKyAgICAgICAgIyBpbiB0aGUgYnl0ZXN0cmVhbSwgYXJnIHNob3VsZCBiZSBOb25lLgorICAgICAgICAnYXJnJywKKworICAgICAgICAjIHdoYXQgdGhlIHN0YWNrIGxvb2tzIGxpa2UgYmVmb3JlIHRoaXMgb3Bjb2RlIHJ1bnM7IGEgbGlzdAorICAgICAgICAnc3RhY2tfYmVmb3JlJywKKworICAgICAgICAjIHdoYXQgdGhlIHN0YWNrIGxvb2tzIGxpa2UgYWZ0ZXIgdGhpcyBvcGNvZGUgcnVuczsgYSBsaXN0CisgICAgICAgICdzdGFja19hZnRlcicsCisKKyAgICAgICAgIyB0aGUgcHJvdG9jb2wgbnVtYmVyIGluIHdoaWNoIHRoaXMgb3Bjb2RlIHdhcyBpbnRyb2R1Y2VkOyBhbiBpbnQKKyAgICAgICAgJ3Byb3RvJywKKworICAgICAgICAjIGh1bWFuLXJlYWRhYmxlIGRvY3MgZm9yIHRoaXMgb3Bjb2RlOyBhIHN0cmluZworICAgICAgICAnZG9jJywKKyAgICApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgY29kZSwgYXJnLAorICAgICAgICAgICAgICAgICBzdGFja19iZWZvcmUsIHN0YWNrX2FmdGVyLCBwcm90bywgZG9jKToKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UobmFtZSwgc3RyKQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY29kZSwgc3RyKQorICAgICAgICBhc3NlcnQgbGVuKGNvZGUpID09IDEKKyAgICAgICAgc2VsZi5jb2RlID0gY29kZQorCisgICAgICAgIGFzc2VydCBhcmcgaXMgTm9uZSBvciBpc2luc3RhbmNlKGFyZywgQXJndW1lbnREZXNjcmlwdG9yKQorICAgICAgICBzZWxmLmFyZyA9IGFyZworCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHN0YWNrX2JlZm9yZSwgbGlzdCkKKyAgICAgICAgZm9yIHggaW4gc3RhY2tfYmVmb3JlOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgU3RhY2tPYmplY3QpCisgICAgICAgIHNlbGYuc3RhY2tfYmVmb3JlID0gc3RhY2tfYmVmb3JlCisKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2Uoc3RhY2tfYWZ0ZXIsIGxpc3QpCisgICAgICAgIGZvciB4IGluIHN0YWNrX2FmdGVyOgorICAgICAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoeCwgU3RhY2tPYmplY3QpCisgICAgICAgIHNlbGYuc3RhY2tfYWZ0ZXIgPSBzdGFja19hZnRlcgorCisgICAgICAgIGFzc2VydCBpc2luc3RhbmNlKHByb3RvLCBpbnQpIGFuZCAwIDw9IHByb3RvIDw9IDIKKyAgICAgICAgc2VsZi5wcm90byA9IHByb3RvCisKKyAgICAgICAgYXNzZXJ0IGlzaW5zdGFuY2UoZG9jLCBzdHIpCisgICAgICAgIHNlbGYuZG9jID0gZG9jCisKK0kgPSBPcGNvZGVJbmZvCitvcGNvZGVzID0gWworCisgICAgIyBXYXlzIHRvIHNwZWxsIGludGVnZXJzLgorCisgICAgSShuYW1lPSdJTlQnLAorICAgICAgY29kZT0nSScsCisgICAgICBhcmc9ZGVjaW1hbG5sX3Nob3J0LAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5aW50ZWdlcl9vcl9ib29sXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiUHVzaCBhbiBpbnRlZ2VyIG9yIGJvb2wuCisKKyAgICAgIFRoZSBhcmd1bWVudCBpcyBhIG5ld2xpbmUtdGVybWluYXRlZCBkZWNpbWFsIGxpdGVyYWwgc3RyaW5nLgorCisgICAgICBUaGUgaW50ZW50IG1heSBoYXZlIGJlZW4gdGhhdCB0aGlzIGFsd2F5cyBmaXQgaW4gYSBzaG9ydCBQeXRob24gaW50LAorICAgICAgYnV0IElOVCBjYW4gYmUgZ2VuZXJhdGVkIGluIHBpY2tsZXMgd3JpdHRlbiBvbiBhIDY0LWJpdCBib3ggdGhhdAorICAgICAgcmVxdWlyZSBhIFB5dGhvbiBsb25nIG9uIGEgMzItYml0IGJveC4gIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcworICAgICAgYW5kIExPTkcgdGhlbiBpcyB0aGF0IElOVCBza2lwcyBhIHRyYWlsaW5nICdMJywgYW5kIHByb2R1Y2VzIGEgc2hvcnQKKyAgICAgIGludCB3aGVuZXZlciBwb3NzaWJsZS4KKworICAgICAgQW5vdGhlciBkaWZmZXJlbmNlIGlzIGR1ZSB0byB0aGF0LCB3aGVuIGJvb2wgd2FzIGludHJvZHVjZWQgYXMgYQorICAgICAgZGlzdGluY3QgdHlwZSBpbiAyLjMsIGJ1aWx0aW4gbmFtZXMgVHJ1ZSBhbmQgRmFsc2Ugd2VyZSBhbHNvIGFkZGVkIHRvCisgICAgICAyLjIuMiwgbWFwcGluZyB0byBpbnRzIDEgYW5kIDAuICBGb3IgY29tcGF0aWJpbGl0eSBpbiBib3RoIGRpcmVjdGlvbnMsCisgICAgICBUcnVlIGdldHMgcGlja2xlZCBhcyBJTlQgKyAiSTAxXFxuIiwgYW5kIEZhbHNlIGFzIElOVCArICJJMDBcXG4iLgorICAgICAgTGVhZGluZyB6ZXJvZXMgYXJlIG5ldmVyIHByb2R1Y2VkIGZvciBhIGdlbnVpbmUgaW50ZWdlci4gIFRoZSAyLjMKKyAgICAgIChhbmQgbGF0ZXIpIHVucGlja2xlcnMgc3BlY2lhbC1jYXNlIHRoZXNlIGFuZCByZXR1cm4gYm9vbCBpbnN0ZWFkOworICAgICAgZWFybGllciB1bnBpY2tsZXJzIGlnbm9yZSB0aGUgbGVhZGluZyAiMCIgYW5kIHJldHVybiB0aGUgaW50LgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQklOSU5UJywKKyAgICAgIGNvZGU9J0onLAorICAgICAgYXJnPWludDQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlpbnRdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJQdXNoIGEgZm91ci1ieXRlIHNpZ25lZCBpbnRlZ2VyLgorCisgICAgICBUaGlzIGhhbmRsZXMgdGhlIGZ1bGwgcmFuZ2Ugb2YgUHl0aG9uIChzaG9ydCkgaW50ZWdlcnMgb24gYSAzMi1iaXQKKyAgICAgIGJveCwgZGlyZWN0bHkgYXMgYmluYXJ5IGJ5dGVzICgxIGZvciB0aGUgb3Bjb2RlIGFuZCA0IGZvciB0aGUgaW50ZWdlcikuCisgICAgICBJZiB0aGUgaW50ZWdlciBpcyBub24tbmVnYXRpdmUgYW5kIGZpdHMgaW4gMSBvciAyIGJ5dGVzLCBwaWNrbGluZyB2aWEKKyAgICAgIEJJTklOVDEgb3IgQklOSU5UMiBzYXZlcyBzcGFjZS4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0JJTklOVDEnLAorICAgICAgY29kZT0nSycsCisgICAgICBhcmc9dWludDEsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlpbnRdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJQdXNoIGEgb25lLWJ5dGUgdW5zaWduZWQgaW50ZWdlci4KKworICAgICAgVGhpcyBpcyBhIHNwYWNlIG9wdGltaXphdGlvbiBmb3IgcGlja2xpbmcgdmVyeSBzbWFsbCBub24tbmVnYXRpdmUgaW50cywKKyAgICAgIGluIHJhbmdlKDI1NikuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdCSU5JTlQyJywKKyAgICAgIGNvZGU9J00nLAorICAgICAgYXJnPXVpbnQyLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5aW50XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUHVzaCBhIHR3by1ieXRlIHVuc2lnbmVkIGludGVnZXIuCisKKyAgICAgIFRoaXMgaXMgYSBzcGFjZSBvcHRpbWl6YXRpb24gZm9yIHBpY2tsaW5nIHNtYWxsIHBvc2l0aXZlIGludHMsIGluCisgICAgICByYW5nZSgyNTYsIDIqKjE2KS4gIEludGVnZXJzIGluIHJhbmdlKDI1NikgY2FuIGFsc28gYmUgcGlja2xlZCB2aWEKKyAgICAgIEJJTklOVDIsIGJ1dCBCSU5JTlQxIGluc3RlYWQgc2F2ZXMgYSBieXRlLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nTE9ORycsCisgICAgICBjb2RlPSdMJywKKyAgICAgIGFyZz1kZWNpbWFsbmxfbG9uZywKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWxvbmddLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJQdXNoIGEgbG9uZyBpbnRlZ2VyLgorCisgICAgICBUaGUgc2FtZSBhcyBJTlQsIGV4Y2VwdCB0aGF0IHRoZSBsaXRlcmFsIGVuZHMgd2l0aCAnTCcsIGFuZCBhbHdheXMKKyAgICAgIHVucGlja2xlcyB0byBhIFB5dGhvbiBsb25nLiAgVGhlcmUgZG9lc24ndCBzZWVtIGEgcmVhbCBwdXJwb3NlIHRvIHRoZQorICAgICAgdHJhaWxpbmcgJ0wnLgorCisgICAgICBOb3RlIHRoYXQgTE9ORyB0YWtlcyB0aW1lIHF1YWRyYXRpYyBpbiB0aGUgbnVtYmVyIG9mIGRpZ2l0cyB3aGVuCisgICAgICB1bnBpY2tsaW5nICh0aGlzIGlzIHNpbXBseSBkdWUgdG8gdGhlIG5hdHVyZSBvZiBkZWNpbWFsLT5iaW5hcnkKKyAgICAgIGNvbnZlcnNpb24pLiAgUHJvdG8gMiBhZGRlZCBsaW5lYXItdGltZSAoaW4gQzsgc3RpbGwgcXVhZHJhdGljLXRpbWUKKyAgICAgIGluIFB5dGhvbikgTE9ORzEgYW5kIExPTkc0IG9wY29kZXMuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSJMT05HMSIsCisgICAgICBjb2RlPSdceDhhJywKKyAgICAgIGFyZz1sb25nMSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWxvbmddLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJMb25nIGludGVnZXIgdXNpbmcgb25lLWJ5dGUgbGVuZ3RoLgorCisgICAgICBBIG1vcmUgZWZmaWNpZW50IGVuY29kaW5nIG9mIGEgUHl0aG9uIGxvbmc7IHRoZSBsb25nMSBlbmNvZGluZworICAgICAgc2F5cyBpdCBhbGwuIiIiKSwKKworICAgIEkobmFtZT0iTE9ORzQiLAorICAgICAgY29kZT0nXHg4YicsCisgICAgICBhcmc9bG9uZzQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlsb25nXSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiTG9uZyBpbnRlZ2VyIHVzaW5nIGZvdW5kLWJ5dGUgbGVuZ3RoLgorCisgICAgICBBIG1vcmUgZWZmaWNpZW50IGVuY29kaW5nIG9mIGEgUHl0aG9uIGxvbmc7IHRoZSBsb25nNCBlbmNvZGluZworICAgICAgc2F5cyBpdCBhbGwuIiIiKSwKKworICAgICMgV2F5cyB0byBzcGVsbCBzdHJpbmdzICg4LWJpdCwgbm90IFVuaWNvZGUpLgorCisgICAgSShuYW1lPSdTVFJJTkcnLAorICAgICAgY29kZT0nUycsCisgICAgICBhcmc9c3RyaW5nbmwsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlzdHJpbmddLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJQdXNoIGEgUHl0aG9uIHN0cmluZyBvYmplY3QuCisKKyAgICAgIFRoZSBhcmd1bWVudCBpcyBhIHJlcHItc3R5bGUgc3RyaW5nLCB3aXRoIGJyYWNrZXRpbmcgcXVvdGUgY2hhcmFjdGVycywKKyAgICAgIGFuZCBwZXJoYXBzIGVtYmVkZGVkIGVzY2FwZXMuICBUaGUgYXJndW1lbnQgZXh0ZW5kcyB1bnRpbCB0aGUgbmV4dAorICAgICAgbmV3bGluZSBjaGFyYWN0ZXIuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdCSU5TVFJJTkcnLAorICAgICAgY29kZT0nVCcsCisgICAgICBhcmc9c3RyaW5nNCwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweXN0cmluZ10sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlB1c2ggYSBQeXRob24gc3RyaW5nIG9iamVjdC4KKworICAgICAgVGhlcmUgYXJlIHR3byBhcmd1bWVudHM6ICB0aGUgZmlyc3QgaXMgYSA0LWJ5dGUgbGl0dGxlLWVuZGlhbiBzaWduZWQgaW50CisgICAgICBnaXZpbmcgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3RyaW5nLCBhbmQgdGhlIHNlY29uZCBpcyB0aGF0IG1hbnkKKyAgICAgIGJ5dGVzLCB3aGljaCBhcmUgdGFrZW4gbGl0ZXJhbGx5IGFzIHRoZSBzdHJpbmcgY29udGVudC4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1NIT1JUX0JJTlNUUklORycsCisgICAgICBjb2RlPSdVJywKKyAgICAgIGFyZz1zdHJpbmcxLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5c3RyaW5nXSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUHVzaCBhIFB5dGhvbiBzdHJpbmcgb2JqZWN0LgorCisgICAgICBUaGVyZSBhcmUgdHdvIGFyZ3VtZW50czogIHRoZSBmaXJzdCBpcyBhIDEtYnl0ZSB1bnNpZ25lZCBpbnQgZ2l2aW5nCisgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBzdHJpbmcsIGFuZCB0aGUgc2Vjb25kIGlzIHRoYXQgbWFueSBieXRlcywKKyAgICAgIHdoaWNoIGFyZSB0YWtlbiBsaXRlcmFsbHkgYXMgdGhlIHN0cmluZyBjb250ZW50LgorICAgICAgIiIiKSwKKworICAgICMgV2F5cyB0byBzcGVsbCBOb25lLgorCisgICAgSShuYW1lPSdOT05FJywKKyAgICAgIGNvZGU9J04nLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlub25lXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IlB1c2ggTm9uZSBvbiB0aGUgc3RhY2suIiksCisKKyAgICAjIFdheXMgdG8gc3BlbGwgYm9vbHMsIHN0YXJ0aW5nIHdpdGggcHJvdG8gMi4gIFNlZSBJTlQgZm9yIGhvdyB0aGlzIHdhcworICAgICMgZG9uZSBiZWZvcmUgcHJvdG8gMi4KKworICAgIEkobmFtZT0nTkVXVFJVRScsCisgICAgICBjb2RlPSdceDg4JywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5Ym9vbF0sCisgICAgICBwcm90bz0yLAorICAgICAgZG9jPSIiIlRydWUuCisKKyAgICAgIFB1c2ggVHJ1ZSBvbnRvIHRoZSBzdGFjay4iIiIpLAorCisgICAgSShuYW1lPSdORVdGQUxTRScsCisgICAgICBjb2RlPSdceDg5JywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5Ym9vbF0sCisgICAgICBwcm90bz0yLAorICAgICAgZG9jPSIiIlRydWUuCisKKyAgICAgIFB1c2ggRmFsc2Ugb250byB0aGUgc3RhY2suIiIiKSwKKworICAgICMgV2F5cyB0byBzcGVsbCBVbmljb2RlIHN0cmluZ3MuCisKKyAgICBJKG5hbWU9J1VOSUNPREUnLAorICAgICAgY29kZT0nVicsCisgICAgICBhcmc9dW5pY29kZXN0cmluZ25sLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5dW5pY29kZV0sCisgICAgICBwcm90bz0wLCAgIyB0aGlzIG1heSBiZSBwdXJlLXRleHQsIGJ1dCBpdCdzIGEgbGF0ZXIgYWRkaXRpb24KKyAgICAgIGRvYz0iIiJQdXNoIGEgUHl0aG9uIFVuaWNvZGUgc3RyaW5nIG9iamVjdC4KKworICAgICAgVGhlIGFyZ3VtZW50IGlzIGEgcmF3LXVuaWNvZGUtZXNjYXBlIGVuY29kaW5nIG9mIGEgVW5pY29kZSBzdHJpbmcsCisgICAgICBhbmQgc28gbWF5IGNvbnRhaW4gZW1iZWRkZWQgZXNjYXBlIHNlcXVlbmNlcy4gIFRoZSBhcmd1bWVudCBleHRlbmRzCisgICAgICB1bnRpbCB0aGUgbmV4dCBuZXdsaW5lIGNoYXJhY3Rlci4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0JJTlVOSUNPREUnLAorICAgICAgY29kZT0nWCcsCisgICAgICBhcmc9dW5pY29kZXN0cmluZzQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHl1bmljb2RlXSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUHVzaCBhIFB5dGhvbiBVbmljb2RlIHN0cmluZyBvYmplY3QuCisKKyAgICAgIFRoZXJlIGFyZSB0d28gYXJndW1lbnRzOiAgdGhlIGZpcnN0IGlzIGEgNC1ieXRlIGxpdHRsZS1lbmRpYW4gc2lnbmVkIGludAorICAgICAgZ2l2aW5nIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIHN0cmluZy4gIFRoZSBzZWNvbmQgaXMgdGhhdCBtYW55CisgICAgICBieXRlcywgYW5kIGlzIHRoZSBVVEYtOCBlbmNvZGluZyBvZiB0aGUgVW5pY29kZSBzdHJpbmcuCisgICAgICAiIiIpLAorCisgICAgIyBXYXlzIHRvIHNwZWxsIGZsb2F0cy4KKworICAgIEkobmFtZT0nRkxPQVQnLAorICAgICAgY29kZT0nRicsCisgICAgICBhcmc9ZmxvYXRubCwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWZsb2F0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiTmV3bGluZS10ZXJtaW5hdGVkIGRlY2ltYWwgZmxvYXQgbGl0ZXJhbC4KKworICAgICAgVGhlIGFyZ3VtZW50IGlzIHJlcHIoYV9mbG9hdCksIGFuZCBpbiBnZW5lcmFsIHJlcXVpcmVzIDE3IHNpZ25pZmljYW50CisgICAgICBkaWdpdHMgZm9yIHJvdW5kdHJpcCBjb252ZXJzaW9uIHRvIGJlIGFuIGlkZW50aXR5ICh0aGlzIGlzIHNvIGZvcgorICAgICAgSUVFRS03NTQgZG91YmxlIHByZWNpc2lvbiB2YWx1ZXMsIHdoaWNoIGlzIHdoYXQgUHl0aG9uIGZsb2F0IG1hcHMgdG8KKyAgICAgIG9uIG1vc3QgYm94ZXMpLgorCisgICAgICBJbiBnZW5lcmFsLCBGTE9BVCBjYW5ub3QgYmUgdXNlZCB0byB0cmFuc3BvcnQgaW5maW5pdGllcywgTmFOcywgb3IKKyAgICAgIG1pbnVzIHplcm8gYWNyb3NzIGJveGVzIChvciBldmVuIG9uIGEgc2luZ2xlIGJveCwgaWYgdGhlIHBsYXRmb3JtIEMKKyAgICAgIGxpYnJhcnkgY2FuJ3QgcmVhZCB0aGUgc3RyaW5ncyBpdCBwcm9kdWNlcyBmb3Igc3VjaCB0aGluZ3MgLS0gV2luZG93cworICAgICAgaXMgbGlrZSB0aGF0KSwgYnV0IG1heSBkbyBsZXNzIGRhbWFnZSB0aGFuIEJJTkZMT0FUIG9uIGJveGVzIHdpdGgKKyAgICAgIGdyZWF0ZXIgcHJlY2lzaW9uIG9yIGR5bmFtaWMgcmFuZ2UgdGhhbiBJRUVFLTc1NCBkb3VibGUuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdCSU5GTE9BVCcsCisgICAgICBjb2RlPSdHJywKKyAgICAgIGFyZz1mbG9hdDgsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlmbG9hdF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIkZsb2F0IHN0b3JlZCBpbiBiaW5hcnkgZm9ybSwgd2l0aCA4IGJ5dGVzIG9mIGRhdGEuCisKKyAgICAgIFRoaXMgZ2VuZXJhbGx5IHJlcXVpcmVzIGxlc3MgdGhhbiBoYWxmIHRoZSBzcGFjZSBvZiBGTE9BVCBlbmNvZGluZy4KKyAgICAgIEluIGdlbmVyYWwsIEJJTkZMT0FUIGNhbm5vdCBiZSB1c2VkIHRvIHRyYW5zcG9ydCBpbmZpbml0aWVzLCBOYU5zLCBvcgorICAgICAgbWludXMgemVybywgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhwb25lbnQgZXhjZWVkcyB0aGUgcmFuZ2Ugb2YKKyAgICAgIGFuIElFRUUtNzU0IGRvdWJsZSwgYW5kIHJldGFpbnMgbm8gbW9yZSB0aGFuIDUzIGJpdHMgb2YgcHJlY2lzaW9uIChpZgorICAgICAgdGhlcmUgYXJlIG1vcmUgdGhhbiB0aGF0LCAiYWRkIGEgaGFsZiBhbmQgY2hvcCIgcm91bmRpbmcgaXMgdXNlZCB0bworICAgICAgY3V0IGl0IGJhY2sgdG8gNTMgc2lnbmlmaWNhbnQgYml0cykuCisgICAgICAiIiIpLAorCisgICAgIyBXYXlzIHRvIGJ1aWxkIGxpc3RzLgorCisgICAgSShuYW1lPSdFTVBUWV9MSVNUJywKKyAgICAgIGNvZGU9J10nLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlsaXN0XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IlB1c2ggYW4gZW1wdHkgbGlzdC4iKSwKKworICAgIEkobmFtZT0nQVBQRU5EJywKKyAgICAgIGNvZGU9J2EnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W3B5bGlzdCwgYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWxpc3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJBcHBlbmQgYW4gb2JqZWN0IHRvIGEgbGlzdC4KKworICAgICAgU3RhY2sgYmVmb3JlOiAgLi4uIHB5bGlzdCBhbnlvYmplY3QKKyAgICAgIFN0YWNrIGFmdGVyOiAgIC4uLiBweWxpc3QrW2FueW9iamVjdF0KKworICAgICAgYWx0aG91Z2ggcHlsaXN0IGlzIHJlYWxseSBleHRlbmRlZCBpbi1wbGFjZS4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0FQUEVORFMnLAorICAgICAgY29kZT0nZScsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bcHlsaXN0LCBtYXJrb2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWxpc3RdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJFeHRlbmQgYSBsaXN0IGJ5IGEgc2xpY2Ugb2Ygc3RhY2sgb2JqZWN0cy4KKworICAgICAgU3RhY2sgYmVmb3JlOiAgLi4uIHB5bGlzdCBtYXJrb2JqZWN0IHN0YWNrc2xpY2UKKyAgICAgIFN0YWNrIGFmdGVyOiAgIC4uLiBweWxpc3Qrc3RhY2tzbGljZQorCisgICAgICBhbHRob3VnaCBweWxpc3QgaXMgcmVhbGx5IGV4dGVuZGVkIGluLXBsYWNlLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nTElTVCcsCisgICAgICBjb2RlPSdsJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVttYXJrb2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWxpc3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJCdWlsZCBhIGxpc3Qgb3V0IG9mIHRoZSB0b3Btb3N0IHN0YWNrIHNsaWNlLCBhZnRlciBtYXJrb2JqZWN0LgorCisgICAgICBBbGwgdGhlIHN0YWNrIGVudHJpZXMgZm9sbG93aW5nIHRoZSB0b3Btb3N0IG1hcmtvYmplY3QgYXJlIHBsYWNlZCBpbnRvCisgICAgICBhIHNpbmdsZSBQeXRob24gbGlzdCwgd2hpY2ggc2luZ2xlIGxpc3Qgb2JqZWN0IHJlcGxhY2VzIGFsbCBvZiB0aGUKKyAgICAgIHN0YWNrIGZyb20gdGhlIHRvcG1vc3QgbWFya29iamVjdCBvbndhcmQuICBGb3IgZXhhbXBsZSwKKworICAgICAgU3RhY2sgYmVmb3JlOiAuLi4gbWFya29iamVjdCAxIDIgMyAnYWJjJworICAgICAgU3RhY2sgYWZ0ZXI6ICAuLi4gWzEsIDIsIDMsICdhYmMnXQorICAgICAgIiIiKSwKKworICAgICMgV2F5cyB0byBidWlsZCB0dXBsZXMuCisKKyAgICBJKG5hbWU9J0VNUFRZX1RVUExFJywKKyAgICAgIGNvZGU9JyknLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHl0dXBsZV0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSJQdXNoIGFuIGVtcHR5IHR1cGxlLiIpLAorCisgICAgSShuYW1lPSdUVVBMRScsCisgICAgICBjb2RlPSd0JywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVttYXJrb2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweXR1cGxlXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiQnVpbGQgYSB0dXBsZSBvdXQgb2YgdGhlIHRvcG1vc3Qgc3RhY2sgc2xpY2UsIGFmdGVyIG1hcmtvYmplY3QuCisKKyAgICAgIEFsbCB0aGUgc3RhY2sgZW50cmllcyBmb2xsb3dpbmcgdGhlIHRvcG1vc3QgbWFya29iamVjdCBhcmUgcGxhY2VkIGludG8KKyAgICAgIGEgc2luZ2xlIFB5dGhvbiB0dXBsZSwgd2hpY2ggc2luZ2xlIHR1cGxlIG9iamVjdCByZXBsYWNlcyBhbGwgb2YgdGhlCisgICAgICBzdGFjayBmcm9tIHRoZSB0b3Btb3N0IG1hcmtvYmplY3Qgb253YXJkLiAgRm9yIGV4YW1wbGUsCisKKyAgICAgIFN0YWNrIGJlZm9yZTogLi4uIG1hcmtvYmplY3QgMSAyIDMgJ2FiYycKKyAgICAgIFN0YWNrIGFmdGVyOiAgLi4uICgxLCAyLCAzLCAnYWJjJykKKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1RVUExFMScsCisgICAgICBjb2RlPSdceDg1JywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVthbnlvYmplY3RdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5dHVwbGVdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJCdWlsZCBhIG9uZS10dXBsZSBvdXQgb2YgdGhlIHRvcG1vc3QgaXRlbSBvbiB0aGUgc3RhY2suCisKKyAgICAgIFRoaXMgY29kZSBwb3BzIG9uZSB2YWx1ZSBvZmYgdGhlIHN0YWNrIGFuZCBwdXNoZXMgYSB0dXBsZSBvZgorICAgICAgbGVuZ3RoIDEgd2hvc2Ugb25lIGl0ZW0gaXMgdGhhdCB2YWx1ZSBiYWNrIG9udG8gaXQuICBJbiBvdGhlcgorICAgICAgd29yZHM6CisKKyAgICAgICAgICBzdGFja1stMV0gPSB0dXBsZShzdGFja1stMTpdKQorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nVFVQTEUyJywKKyAgICAgIGNvZGU9J1x4ODYnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdCwgYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweXR1cGxlXSwKKyAgICAgIHByb3RvPTIsCisgICAgICBkb2M9IiIiQnVpbGQgYSB0d28tdHVwbGUgb3V0IG9mIHRoZSB0b3AgdHdvIGl0ZW1zIG9uIHRoZSBzdGFjay4KKworICAgICAgVGhpcyBjb2RlIHBvcHMgdHdvIHZhbHVlcyBvZmYgdGhlIHN0YWNrIGFuZCBwdXNoZXMgYSB0dXBsZSBvZgorICAgICAgbGVuZ3RoIDIgd2hvc2UgaXRlbXMgYXJlIHRob3NlIHZhbHVlcyBiYWNrIG9udG8gaXQuICBJbiBvdGhlcgorICAgICAgd29yZHM6CisKKyAgICAgICAgICBzdGFja1stMjpdID0gW3R1cGxlKHN0YWNrWy0yOl0pXQorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nVFVQTEUzJywKKyAgICAgIGNvZGU9J1x4ODcnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdCwgYW55b2JqZWN0LCBhbnlvYmplY3RdLAorICAgICAgc3RhY2tfYWZ0ZXI9W3B5dHVwbGVdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJCdWlsZCBhIHRocmVlLXR1cGxlIG91dCBvZiB0aGUgdG9wIHRocmVlIGl0ZW1zIG9uIHRoZSBzdGFjay4KKworICAgICAgVGhpcyBjb2RlIHBvcHMgdGhyZWUgdmFsdWVzIG9mZiB0aGUgc3RhY2sgYW5kIHB1c2hlcyBhIHR1cGxlIG9mCisgICAgICBsZW5ndGggMyB3aG9zZSBpdGVtcyBhcmUgdGhvc2UgdmFsdWVzIGJhY2sgb250byBpdC4gIEluIG90aGVyCisgICAgICB3b3JkczoKKworICAgICAgICAgIHN0YWNrWy0zOl0gPSBbdHVwbGUoc3RhY2tbLTM6XSldCisgICAgICAiIiIpLAorCisgICAgIyBXYXlzIHRvIGJ1aWxkIGRpY3RzLgorCisgICAgSShuYW1lPSdFTVBUWV9ESUNUJywKKyAgICAgIGNvZGU9J30nLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bcHlkaWN0XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IlB1c2ggYW4gZW1wdHkgZGljdC4iKSwKKworICAgIEkobmFtZT0nRElDVCcsCisgICAgICBjb2RlPSdkJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVttYXJrb2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWRpY3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJCdWlsZCBhIGRpY3Qgb3V0IG9mIHRoZSB0b3Btb3N0IHN0YWNrIHNsaWNlLCBhZnRlciBtYXJrb2JqZWN0LgorCisgICAgICBBbGwgdGhlIHN0YWNrIGVudHJpZXMgZm9sbG93aW5nIHRoZSB0b3Btb3N0IG1hcmtvYmplY3QgYXJlIHBsYWNlZCBpbnRvCisgICAgICBhIHNpbmdsZSBQeXRob24gZGljdCwgd2hpY2ggc2luZ2xlIGRpY3Qgb2JqZWN0IHJlcGxhY2VzIGFsbCBvZiB0aGUKKyAgICAgIHN0YWNrIGZyb20gdGhlIHRvcG1vc3QgbWFya29iamVjdCBvbndhcmQuICBUaGUgc3RhY2sgc2xpY2UgYWx0ZXJuYXRlcworICAgICAga2V5LCB2YWx1ZSwga2V5LCB2YWx1ZSwgLi4uLiAgRm9yIGV4YW1wbGUsCisKKyAgICAgIFN0YWNrIGJlZm9yZTogLi4uIG1hcmtvYmplY3QgMSAyIDMgJ2FiYycKKyAgICAgIFN0YWNrIGFmdGVyOiAgLi4uIHsxOiAyLCAzOiAnYWJjJ30KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1NFVElURU0nLAorICAgICAgY29kZT0ncycsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bcHlkaWN0LCBhbnlvYmplY3QsIGFueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bcHlkaWN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiQWRkIGEga2V5K3ZhbHVlIHBhaXIgdG8gYW4gZXhpc3RpbmcgZGljdC4KKworICAgICAgU3RhY2sgYmVmb3JlOiAgLi4uIHB5ZGljdCBrZXkgdmFsdWUKKyAgICAgIFN0YWNrIGFmdGVyOiAgIC4uLiBweWRpY3QKKworICAgICAgd2hlcmUgcHlkaWN0IGhhcyBiZWVuIG1vZGlmaWVkIHZpYSBweWRpY3Rba2V5XSA9IHZhbHVlLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nU0VUSVRFTVMnLAorICAgICAgY29kZT0ndScsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bcHlkaWN0LCBtYXJrb2JqZWN0LCBzdGFja3NsaWNlXSwKKyAgICAgIHN0YWNrX2FmdGVyPVtweWRpY3RdLAorICAgICAgcHJvdG89MSwKKyAgICAgIGRvYz0iIiJBZGQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBrZXkrdmFsdWUgcGFpcnMgdG8gYW4gZXhpc3RpbmcgZGljdC4KKworICAgICAgVGhlIHNsaWNlIG9mIHRoZSBzdGFjayBmb2xsb3dpbmcgdGhlIHRvcG1vc3QgbWFya29iamVjdCBpcyB0YWtlbiBhcworICAgICAgYW4gYWx0ZXJuYXRpbmcgc2VxdWVuY2Ugb2Yga2V5cyBhbmQgdmFsdWVzLCBhZGRlZCB0byB0aGUgZGljdAorICAgICAgaW1tZWRpYXRlbHkgdW5kZXIgdGhlIHRvcG1vc3QgbWFya29iamVjdC4gIEV2ZXJ5dGhpbmcgYXQgYW5kIGFmdGVyIHRoZQorICAgICAgdG9wbW9zdCBtYXJrb2JqZWN0IGlzIHBvcHBlZCwgbGVhdmluZyB0aGUgbXV0YXRlZCBkaWN0IGF0IHRoZSB0b3AKKyAgICAgIG9mIHRoZSBzdGFjay4KKworICAgICAgU3RhY2sgYmVmb3JlOiAgLi4uIHB5ZGljdCBtYXJrb2JqZWN0IGtleV8xIHZhbHVlXzEgLi4uIGtleV9uIHZhbHVlX24KKyAgICAgIFN0YWNrIGFmdGVyOiAgIC4uLiBweWRpY3QKKworICAgICAgd2hlcmUgcHlkaWN0IGhhcyBiZWVuIG1vZGlmaWVkIHZpYSBweWRpY3Rba2V5X2ldID0gdmFsdWVfaSBmb3IgaSBpbgorICAgICAgMSwgMiwgLi4uLCBuLCBhbmQgaW4gdGhhdCBvcmRlci4KKyAgICAgICIiIiksCisKKyAgICAjIFN0YWNrIG1hbmlwdWxhdGlvbi4KKworICAgIEkobmFtZT0nUE9QJywKKyAgICAgIGNvZGU9JzAnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IkRpc2NhcmQgdGhlIHRvcCBzdGFjayBpdGVtLCBzaHJpbmtpbmcgdGhlIHN0YWNrIGJ5IG9uZSBpdGVtLiIpLAorCisgICAgSShuYW1lPSdEVVAnLAorICAgICAgY29kZT0nMicsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3QsIGFueW9iamVjdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSJQdXNoIHRoZSB0b3Agc3RhY2sgaXRlbSBvbnRvIHRoZSBzdGFjayBhZ2FpbiwgZHVwbGljYXRpbmcgaXQuIiksCisKKyAgICBJKG5hbWU9J01BUksnLAorICAgICAgY29kZT0nKCcsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVttYXJrb2JqZWN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiUHVzaCBtYXJrb2JqZWN0IG9udG8gdGhlIHN0YWNrLgorCisgICAgICBtYXJrb2JqZWN0IGlzIGEgdW5pcXVlIG9iamVjdCwgdXNlZCBieSBvdGhlciBvcGNvZGVzIHRvIGlkZW50aWZ5IGEKKyAgICAgIHJlZ2lvbiBvZiB0aGUgc3RhY2sgY29udGFpbmluZyBhIHZhcmlhYmxlIG51bWJlciBvZiBvYmplY3RzIGZvciB0aGVtCisgICAgICB0byB3b3JrIG9uLiAgU2VlIG1hcmtvYmplY3QuZG9jIGZvciBtb3JlIGRldGFpbC4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1BPUF9NQVJLJywKKyAgICAgIGNvZGU9JzEnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W21hcmtvYmplY3QsIHN0YWNrc2xpY2VdLAorICAgICAgc3RhY2tfYWZ0ZXI9W10sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlBvcCBhbGwgdGhlIHN0YWNrIG9iamVjdHMgYXQgYW5kIGFib3ZlIHRoZSB0b3Btb3N0IG1hcmtvYmplY3QuCisKKyAgICAgIFdoZW4gYW4gb3Bjb2RlIHVzaW5nIGEgdmFyaWFibGUgbnVtYmVyIG9mIHN0YWNrIG9iamVjdHMgaXMgZG9uZSwKKyAgICAgIFBPUF9NQVJLIGlzIHVzZWQgdG8gcmVtb3ZlIHRob3NlIG9iamVjdHMsIGFuZCB0byByZW1vdmUgdGhlIG1hcmtvYmplY3QKKyAgICAgIHRoYXQgZGVsaW1pdGVkIHRoZWlyIHN0YXJ0aW5nIHBvc2l0aW9uIG9uIHRoZSBzdGFjay4KKyAgICAgICIiIiksCisKKyAgICAjIE1lbW8gbWFuaXB1bGF0aW9uLiAgVGhlcmUgYXJlIHJlYWxseSBvbmx5IHR3byBvcGVyYXRpb25zIChnZXQgYW5kIHB1dCksCisgICAgIyBlYWNoIGluIGFsbC10ZXh0LCAic2hvcnQgYmluYXJ5IiwgYW5kICJsb25nIGJpbmFyeSIgZmxhdm9ycy4KKworICAgIEkobmFtZT0nR0VUJywKKyAgICAgIGNvZGU9J2cnLAorICAgICAgYXJnPWRlY2ltYWxubF9zaG9ydCwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJSZWFkIGFuIG9iamVjdCBmcm9tIHRoZSBtZW1vIGFuZCBwdXNoIGl0IG9uIHRoZSBzdGFjay4KKworICAgICAgVGhlIGluZGV4IG9mIHRoZSBtZW1vIG9iamVjdCB0byBwdXNoIGlzIGdpdmVuIGJ5IHRoZSBuZXdsaW5lLXRlcm1pbmF0ZWQKKyAgICAgIGRlY2ltYWwgc3RyaW5nIGZvbGxvd2luZy4gIEJJTkdFVCBhbmQgTE9OR19CSU5HRVQgYXJlIHNwYWNlLW9wdGltaXplZAorICAgICAgdmVyc2lvbnMuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdCSU5HRVQnLAorICAgICAgY29kZT0naCcsCisgICAgICBhcmc9dWludDEsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUmVhZCBhbiBvYmplY3QgZnJvbSB0aGUgbWVtbyBhbmQgcHVzaCBpdCBvbiB0aGUgc3RhY2suCisKKyAgICAgIFRoZSBpbmRleCBvZiB0aGUgbWVtbyBvYmplY3QgdG8gcHVzaCBpcyBnaXZlbiBieSB0aGUgMS1ieXRlIHVuc2lnbmVkCisgICAgICBpbnRlZ2VyIGZvbGxvd2luZy4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0xPTkdfQklOR0VUJywKKyAgICAgIGNvZGU9J2onLAorICAgICAgYXJnPWludDQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUmVhZCBhbiBvYmplY3QgZnJvbSB0aGUgbWVtbyBhbmQgcHVzaCBpdCBvbiB0aGUgc3RhY2suCisKKyAgICAgIFRoZSBpbmRleCBvZiB0aGUgbWVtbyBvYmplY3QgdG8gcHVzaCBpcyBnaXZlbiBieSB0aGUgNC1ieXRlIHNpZ25lZAorICAgICAgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyIGZvbGxvd2luZy4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J1BVVCcsCisgICAgICBjb2RlPSdwJywKKyAgICAgIGFyZz1kZWNpbWFsbmxfc2hvcnQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiU3RvcmUgdGhlIHN0YWNrIHRvcCBpbnRvIHRoZSBtZW1vLiAgVGhlIHN0YWNrIGlzIG5vdCBwb3BwZWQuCisKKyAgICAgIFRoZSBpbmRleCBvZiB0aGUgbWVtbyBsb2NhdGlvbiB0byB3cml0ZSBpbnRvIGlzIGdpdmVuIGJ5IHRoZSBuZXdsaW5lLQorICAgICAgdGVybWluYXRlZCBkZWNpbWFsIHN0cmluZyBmb2xsb3dpbmcuICBCSU5QVVQgYW5kIExPTkdfQklOUFVUIGFyZQorICAgICAgc3BhY2Utb3B0aW1pemVkIHZlcnNpb25zLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQklOUFVUJywKKyAgICAgIGNvZGU9J3EnLAorICAgICAgYXJnPXVpbnQxLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W10sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIlN0b3JlIHRoZSBzdGFjayB0b3AgaW50byB0aGUgbWVtby4gIFRoZSBzdGFjayBpcyBub3QgcG9wcGVkLgorCisgICAgICBUaGUgaW5kZXggb2YgdGhlIG1lbW8gbG9jYXRpb24gdG8gd3JpdGUgaW50byBpcyBnaXZlbiBieSB0aGUgMS1ieXRlCisgICAgICB1bnNpZ25lZCBpbnRlZ2VyIGZvbGxvd2luZy4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0xPTkdfQklOUFVUJywKKyAgICAgIGNvZGU9J3InLAorICAgICAgYXJnPWludDQsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bXSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiU3RvcmUgdGhlIHN0YWNrIHRvcCBpbnRvIHRoZSBtZW1vLiAgVGhlIHN0YWNrIGlzIG5vdCBwb3BwZWQuCisKKyAgICAgIFRoZSBpbmRleCBvZiB0aGUgbWVtbyBsb2NhdGlvbiB0byB3cml0ZSBpbnRvIGlzIGdpdmVuIGJ5IHRoZSA0LWJ5dGUKKyAgICAgIHNpZ25lZCBsaXR0bGUtZW5kaWFuIGludGVnZXIgZm9sbG93aW5nLgorICAgICAgIiIiKSwKKworICAgICMgQWNjZXNzIHRoZSBleHRlbnNpb24gcmVnaXN0cnkgKHByZWRlZmluZWQgb2JqZWN0cykuICBBa2luIHRvIHRoZSBHRVQKKyAgICAjIGZhbWlseS4KKworICAgIEkobmFtZT0nRVhUMScsCisgICAgICBjb2RlPSdceDgyJywKKyAgICAgIGFyZz11aW50MSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJFeHRlbnNpb24gY29kZS4KKworICAgICAgVGhpcyBjb2RlIGFuZCB0aGUgc2ltaWxhciBFWFQyIGFuZCBFWFQ0IGFsbG93IHVzaW5nIGEgcmVnaXN0cnkKKyAgICAgIG9mIHBvcHVsYXIgb2JqZWN0cyB0aGF0IGFyZSBwaWNrbGVkIGJ5IG5hbWUsIHR5cGljYWxseSBjbGFzc2VzLgorICAgICAgSXQgaXMgZW52aXNpb25lZCB0aGF0IHRocm91Z2ggYSBnbG9iYWwgbmVnb3RpYXRpb24gYW5kCisgICAgICByZWdpc3RyYXRpb24gcHJvY2VzcywgdGhpcmQgcGFydGllcyBjYW4gc2V0IHVwIGEgbWFwcGluZyBiZXR3ZWVuCisgICAgICBpbnRzIGFuZCBvYmplY3QgbmFtZXMuCisKKyAgICAgIEluIG9yZGVyIHRvIGd1YXJhbnRlZSBwaWNrbGUgaW50ZXJjaGFuZ2VhYmlsaXR5LCB0aGUgZXh0ZW5zaW9uCisgICAgICBjb2RlIHJlZ2lzdHJ5IG91Z2h0IHRvIGJlIGdsb2JhbCwgYWx0aG91Z2ggYSByYW5nZSBvZiBjb2RlcyBtYXkKKyAgICAgIGJlIHJlc2VydmVkIGZvciBwcml2YXRlIHVzZS4KKworICAgICAgRVhUMSBoYXMgYSAxLWJ5dGUgaW50ZWdlciBhcmd1bWVudC4gIFRoaXMgaXMgdXNlZCB0byBpbmRleCBpbnRvIHRoZQorICAgICAgZXh0ZW5zaW9uIHJlZ2lzdHJ5LCBhbmQgdGhlIG9iamVjdCBhdCB0aGF0IGluZGV4IGlzIHB1c2hlZCBvbiB0aGUgc3RhY2suCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdFWFQyJywKKyAgICAgIGNvZGU9J1x4ODMnLAorICAgICAgYXJnPXVpbnQyLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0yLAorICAgICAgZG9jPSIiIkV4dGVuc2lvbiBjb2RlLgorCisgICAgICBTZWUgRVhUMS4gIEVYVDIgaGFzIGEgdHdvLWJ5dGUgaW50ZWdlciBhcmd1bWVudC4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J0VYVDQnLAorICAgICAgY29kZT0nXHg4NCcsCisgICAgICBhcmc9aW50NCwKKyAgICAgIHN0YWNrX2JlZm9yZT1bXSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJFeHRlbnNpb24gY29kZS4KKworICAgICAgU2VlIEVYVDEuICBFWFQ0IGhhcyBhIGZvdXItYnl0ZSBpbnRlZ2VyIGFyZ3VtZW50LgorICAgICAgIiIiKSwKKworICAgICMgUHVzaCBhIGNsYXNzIG9iamVjdCwgb3IgbW9kdWxlIGZ1bmN0aW9uLCBvbiB0aGUgc3RhY2ssIHZpYSBpdHMgbW9kdWxlCisgICAgIyBhbmQgbmFtZS4KKworICAgIEkobmFtZT0nR0xPQkFMJywKKyAgICAgIGNvZGU9J2MnLAorICAgICAgYXJnPXN0cmluZ25sX25vZXNjYXBlX3BhaXIsCisgICAgICBzdGFja19iZWZvcmU9W10sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiUHVzaCBhIGdsb2JhbCBvYmplY3QgKG1vZHVsZS5hdHRyKSBvbiB0aGUgc3RhY2suCisKKyAgICAgIFR3byBuZXdsaW5lLXRlcm1pbmF0ZWQgc3RyaW5ncyBmb2xsb3cgdGhlIEdMT0JBTCBvcGNvZGUuICBUaGUgZmlyc3QgaXMKKyAgICAgIHRha2VuIGFzIGEgbW9kdWxlIG5hbWUsIGFuZCB0aGUgc2Vjb25kIGFzIGEgY2xhc3MgbmFtZS4gIFRoZSBjbGFzcworICAgICAgb2JqZWN0IG1vZHVsZS5jbGFzcyBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLiAgTW9yZSBhY2N1cmF0ZWx5LCB0aGUKKyAgICAgIG9iamVjdCByZXR1cm5lZCBieSBzZWxmLmZpbmRfY2xhc3MobW9kdWxlLCBjbGFzcykgaXMgcHVzaGVkIG9uIHRoZQorICAgICAgc3RhY2ssIHNvIHVucGlja2xpbmcgc3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBmb3JtIG9mIGxvb2t1cC4KKyAgICAgICIiIiksCisKKyAgICAjIFdheXMgdG8gYnVpbGQgb2JqZWN0cyBvZiBjbGFzc2VzIHBpY2tsZSBkb2Vzbid0IGtub3cgYWJvdXQgZGlyZWN0bHkKKyAgICAjICh1c2VyLWRlZmluZWQgY2xhc3NlcykuICBJIGRlc3BhaXIgb2YgZG9jdW1lbnRpbmcgdGhpcyBhY2N1cmF0ZWx5CisgICAgIyBhbmQgY29tcHJlaGVuc2libHkgLS0geW91IHJlYWxseSBoYXZlIHRvIHJlYWQgdGhlIHBpY2tsZSBjb2RlIHRvCisgICAgIyBmaW5kIGFsbCB0aGUgc3BlY2lhbCBjYXNlcy4KKworICAgIEkobmFtZT0nUkVEVUNFJywKKyAgICAgIGNvZGU9J1InLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdCwgYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MCwKKyAgICAgIGRvYz0iIiJQdXNoIGFuIG9iamVjdCBidWlsdCBmcm9tIGEgY2FsbGFibGUgYW5kIGFuIGFyZ3VtZW50IHR1cGxlLgorCisgICAgICBUaGUgb3Bjb2RlIGlzIG5hbWVkIHRvIHJlbWluZCBvZiB0aGUgX19yZWR1Y2VfXygpIG1ldGhvZC4KKworICAgICAgU3RhY2sgYmVmb3JlOiAuLi4gY2FsbGFibGUgcHl0dXBsZQorICAgICAgU3RhY2sgYWZ0ZXI6ICAuLi4gY2FsbGFibGUoKnB5dHVwbGUpCisKKyAgICAgIFRoZSBjYWxsYWJsZSBhbmQgdGhlIGFyZ3VtZW50IHR1cGxlIGFyZSB0aGUgZmlyc3QgdHdvIGl0ZW1zIHJldHVybmVkCisgICAgICBieSBhIF9fcmVkdWNlX18gbWV0aG9kLiAgQXBwbHlpbmcgdGhlIGNhbGxhYmxlIHRvIHRoZSBhcmd0dXBsZSBpcworICAgICAgc3VwcG9zZWQgdG8gcmVwcm9kdWNlIHRoZSBvcmlnaW5hbCBvYmplY3QsIG9yIGF0IGxlYXN0IGdldCBpdCBzdGFydGVkLgorICAgICAgSWYgdGhlIF9fcmVkdWNlX18gbWV0aG9kIHJldHVybnMgYSAzLXR1cGxlLCB0aGUgbGFzdCBjb21wb25lbnQgaXMgYW4KKyAgICAgIGFyZ3VtZW50IHRvIGJlIHBhc3NlZCB0byB0aGUgb2JqZWN0J3MgX19zZXRzdGF0ZV9fLCBhbmQgdGhlbiB0aGUgUkVEVUNFCisgICAgICBvcGNvZGUgaXMgZm9sbG93ZWQgYnkgY29kZSB0byBjcmVhdGUgc2V0c3RhdGUncyBhcmd1bWVudCwgYW5kIHRoZW4gYQorICAgICAgQlVJTEQgb3Bjb2RlIHRvIGFwcGx5ICBfX3NldHN0YXRlX18gdG8gdGhhdCBhcmd1bWVudC4KKworICAgICAgSWYgdHlwZShjYWxsYWJsZSkgaXMgbm90IENsYXNzVHlwZSwgUkVEVUNFIGNvbXBsYWlucyB1bmxlc3MgdGhlCisgICAgICBjYWxsYWJsZSBoYXMgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhlIGNvcHlfcmVnIG1vZHVsZSdzCisgICAgICBzYWZlX2NvbnN0cnVjdG9ycyBkaWN0LCBvciB0aGUgY2FsbGFibGUgaGFzIGEgbWFnaWMKKyAgICAgICdfX3NhZmVfZm9yX3VucGlja2xpbmdfXycgYXR0cmlidXRlIHdpdGggYSB0cnVlIHZhbHVlLiAgSSdtIG5vdCBzdXJlCisgICAgICB3aHkgaXQgZG9lcyB0aGlzLCBidXQgSSd2ZSBzdXJlIHNlZW4gdGhpcyBjb21wbGFpbnQgb2Z0ZW4gZW5vdWdoIHdoZW4KKyAgICAgIEkgZGlkbid0IHdhbnQgdG8gPHdpbms+LgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQlVJTEQnLAorICAgICAgY29kZT0nYicsCisgICAgICBhcmc9Tm9uZSwKKyAgICAgIHN0YWNrX2JlZm9yZT1bYW55b2JqZWN0LCBhbnlvYmplY3RdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIkZpbmlzaCBidWlsZGluZyBhbiBvYmplY3QsIHZpYSBfX3NldHN0YXRlX18gb3IgZGljdCB1cGRhdGUuCisKKyAgICAgIFN0YWNrIGJlZm9yZTogLi4uIGFueW9iamVjdCBhcmd1bWVudAorICAgICAgU3RhY2sgYWZ0ZXI6ICAuLi4gYW55b2JqZWN0CisKKyAgICAgIHdoZXJlIGFueW9iamVjdCBtYXkgaGF2ZSBiZWVuIG11dGF0ZWQsIGFzIGZvbGxvd3M6CisKKyAgICAgIElmIHRoZSBvYmplY3QgaGFzIGEgX19zZXRzdGF0ZV9fIG1ldGhvZCwKKworICAgICAgICAgIGFueW9iamVjdC5fX3NldHN0YXRlX18oYXJndW1lbnQpCisKKyAgICAgIGlzIGNhbGxlZC4KKworICAgICAgRWxzZSB0aGUgYXJndW1lbnQgbXVzdCBiZSBhIGRpY3QsIHRoZSBvYmplY3QgbXVzdCBoYXZlIGEgX19kaWN0X18sIGFuZAorICAgICAgdGhlIG9iamVjdCBpcyB1cGRhdGVkIHZpYQorCisgICAgICAgICAgYW55b2JqZWN0Ll9fZGljdF9fLnVwZGF0ZShhcmd1bWVudCkKKworICAgICAgVGhpcyBtYXkgcmFpc2UgUnVudGltZUVycm9yIGluIHJlc3RyaWN0ZWQgZXhlY3V0aW9uIG1vZGUgKHdoaWNoCisgICAgICBkaXNhbGxvd3MgYWNjZXNzIHRvIF9fZGljdF9fIGRpcmVjdGx5KTsgaW4gdGhhdCBjYXNlLCB0aGUgb2JqZWN0CisgICAgICBpcyB1cGRhdGVkIGluc3RlYWQgdmlhCisKKyAgICAgICAgICBmb3IgaywgdiBpbiBhcmd1bWVudC5pdGVtcygpOgorICAgICAgICAgICAgICBhbnlvYmplY3Rba10gPSB2CisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdJTlNUJywKKyAgICAgIGNvZGU9J2knLAorICAgICAgYXJnPXN0cmluZ25sX25vZXNjYXBlX3BhaXIsCisgICAgICBzdGFja19iZWZvcmU9W21hcmtvYmplY3QsIHN0YWNrc2xpY2VdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIkJ1aWxkIGEgY2xhc3MgaW5zdGFuY2UuCisKKyAgICAgIFRoaXMgaXMgdGhlIHByb3RvY29sIDAgdmVyc2lvbiBvZiBwcm90b2NvbCAxJ3MgT0JKIG9wY29kZS4KKyAgICAgIElOU1QgaXMgZm9sbG93ZWQgYnkgdHdvIG5ld2xpbmUtdGVybWluYXRlZCBzdHJpbmdzLCBnaXZpbmcgYQorICAgICAgbW9kdWxlIGFuZCBjbGFzcyBuYW1lLCBqdXN0IGFzIGZvciB0aGUgR0xPQkFMIG9wY29kZSAoYW5kIHNlZQorICAgICAgR0xPQkFMIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhhdCkuICBzZWxmLmZpbmRfY2xhc3MobW9kdWxlLCBuYW1lKQorICAgICAgaXMgdXNlZCB0byBnZXQgYSBjbGFzcyBvYmplY3QuCisKKyAgICAgIEluIGFkZGl0aW9uLCBhbGwgdGhlIG9iamVjdHMgb24gdGhlIHN0YWNrIGZvbGxvd2luZyB0aGUgdG9wbW9zdAorICAgICAgbWFya29iamVjdCBhcmUgZ2F0aGVyZWQgaW50byBhIHR1cGxlIGFuZCBwb3BwZWQgKGFsb25nIHdpdGggdGhlCisgICAgICB0b3Btb3N0IG1hcmtvYmplY3QpLCBqdXN0IGFzIGZvciB0aGUgVFVQTEUgb3Bjb2RlLgorCisgICAgICBOb3cgaXQgZ2V0cyBjb21wbGljYXRlZC4gIElmIGFsbCBvZiB0aGVzZSBhcmUgdHJ1ZToKKworICAgICAgICArIFRoZSBhcmd0dXBsZSBpcyBlbXB0eSAobWFya29iamVjdCB3YXMgYXQgdGhlIHRvcCBvZiB0aGUgc3RhY2sKKyAgICAgICAgICBhdCB0aGUgc3RhcnQpLgorCisgICAgICAgICsgSXQncyBhbiBvbGQtc3R5bGUgY2xhc3Mgb2JqZWN0ICh0aGUgdHlwZSBvZiB0aGUgY2xhc3Mgb2JqZWN0IGlzCisgICAgICAgICAgQ2xhc3NUeXBlKS4KKworICAgICAgICArIFRoZSBjbGFzcyBvYmplY3QgZG9lcyBub3QgaGF2ZSBhIF9fZ2V0aW5pdGFyZ3NfXyBhdHRyaWJ1dGUuCisKKyAgICAgIHRoZW4gd2Ugd2FudCB0byBjcmVhdGUgYW4gb2xkLXN0eWxlIGNsYXNzIGluc3RhbmNlIHdpdGhvdXQgaW52b2tpbmcKKyAgICAgIGl0cyBfX2luaXRfXygpIG1ldGhvZCAocGlja2xlIGhhcyB3YWZmbGVkIG9uIHRoaXMgb3ZlciB0aGUgeWVhcnM7IG5vdAorICAgICAgY2FsbGluZyBfX2luaXRfXygpIGlzIGN1cnJlbnQgd2lzZG9tKS4gIEluIHRoaXMgY2FzZSwgYW4gaW5zdGFuY2Ugb2YKKyAgICAgIGFuIG9sZC1zdHlsZSBkdW1teSBjbGFzcyBpcyBjcmVhdGVkLCBhbmQgdGhlbiB3ZSB0cnkgdG8gcmViaW5kIGl0cworICAgICAgX19jbGFzc19fIGF0dHJpYnV0ZSB0byB0aGUgZGVzaXJlZCBjbGFzcyBvYmplY3QuICBJZiB0aGlzIHN1Y2NlZWRzLAorICAgICAgdGhlIG5ldyBpbnN0YW5jZSBvYmplY3QgaXMgcHVzaGVkIG9uIHRoZSBzdGFjaywgYW5kIHdlJ3JlIGRvbmUuICBJbgorICAgICAgcmVzdHJpY3RlZCBleGVjdXRpb24gbW9kZSBpdCBjYW4gZmFpbCAoYXNzaWdubWVudCB0byBfX2NsYXNzX18gaXMKKyAgICAgIGRpc2FsbG93ZWQpLCBhbmQgSSdtIG5vdCByZWFsbHkgc3VyZSB3aGF0IGhhcHBlbnMgdGhlbiAtLSBpdCBsb29rcworICAgICAgbGlrZSB0aGUgY29kZSBlbmRzIHVwIGNhbGxpbmcgdGhlIGNsYXNzIG9iamVjdCdzIF9faW5pdF9fIGFueXdheSwKKyAgICAgIHZpYSBmYWxsaW5nIGludG8gdGhlIG5leHQgY2FzZS4KKworICAgICAgRWxzZSAodGhlIGFyZ3R1cGxlIGlzIG5vdCBlbXB0eSwgaXQncyBub3QgYW4gb2xkLXN0eWxlIGNsYXNzIG9iamVjdCwKKyAgICAgIG9yIHRoZSBjbGFzcyBvYmplY3QgZG9lcyBoYXZlIGEgX19nZXRpbml0YXJnc19fIGF0dHJpYnV0ZSksIHRoZSBjb2RlCisgICAgICBmaXJzdCBpbnNpc3RzIHRoYXQgdGhlIGNsYXNzIG9iamVjdCBoYXZlIGEgX19zYWZlX2Zvcl91bnBpY2tsaW5nX18KKyAgICAgIGF0dHJpYnV0ZS4gIFVubGlrZSBhcyBmb3IgdGhlIF9fc2FmZV9mb3JfdW5waWNrbGluZ19fIGNoZWNrIGluIFJFRFVDRSwKKyAgICAgIGl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaGFzIGEgdHJ1ZSBvciBmYWxzZSB2YWx1ZSwgaXQKKyAgICAgIG9ubHkgbWF0dGVycyB3aGV0aGVyIGl0IGV4aXN0cyAoWFhYIHRoaXMgaXMgYSBidWc7IGNQaWNrbGUKKyAgICAgIHJlcXVpcmVzIHRoZSBhdHRyaWJ1dGUgdG8gYmUgdHJ1ZSkuICBJZiBfX3NhZmVfZm9yX3VucGlja2xpbmdfXworICAgICAgZG9lc24ndCBleGlzdCwgVW5waWNrbGluZ0Vycm9yIGlzIHJhaXNlZC4KKworICAgICAgRWxzZSAodGhlIGNsYXNzIG9iamVjdCBkb2VzIGhhdmUgYSBfX3NhZmVfZm9yX3VucGlja2xpbmdfXyBhdHRyKSwKKyAgICAgIHRoZSBjbGFzcyBvYmplY3Qgb2J0YWluZWQgZnJvbSBJTlNUJ3MgYXJndW1lbnRzIGlzIGFwcGxpZWQgdG8gdGhlCisgICAgICBhcmd0dXBsZSBvYnRhaW5lZCBmcm9tIHRoZSBzdGFjaywgYW5kIHRoZSByZXN1bHRpbmcgaW5zdGFuY2Ugb2JqZWN0CisgICAgICBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLgorCisgICAgICBOT1RFOiAgY2hlY2tzIGZvciBfX3NhZmVfZm9yX3VucGlja2xpbmdfXyB3ZW50IGF3YXkgaW4gUHl0aG9uIDIuMy4KKyAgICAgICIiIiksCisKKyAgICBJKG5hbWU9J09CSicsCisgICAgICBjb2RlPSdvJywKKyAgICAgIGFyZz1Ob25lLAorICAgICAgc3RhY2tfYmVmb3JlPVttYXJrb2JqZWN0LCBhbnlvYmplY3QsIHN0YWNrc2xpY2VdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0xLAorICAgICAgZG9jPSIiIkJ1aWxkIGEgY2xhc3MgaW5zdGFuY2UuCisKKyAgICAgIFRoaXMgaXMgdGhlIHByb3RvY29sIDEgdmVyc2lvbiBvZiBwcm90b2NvbCAwJ3MgSU5TVCBvcGNvZGUsIGFuZCBpcworICAgICAgdmVyeSBtdWNoIGxpa2UgaXQuICBUaGUgbWFqb3IgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSBjbGFzcyBvYmplY3QKKyAgICAgIGlzIHRha2VuIG9mZiB0aGUgc3RhY2ssIGFsbG93aW5nIGl0IHRvIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBtZW1vCisgICAgICByZXBlYXRlZGx5IGlmIHNldmVyYWwgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGNsYXNzIGFyZSBjcmVhdGVkLiAgVGhpcworICAgICAgY2FuIGJlIG11Y2ggbW9yZSBlZmZpY2llbnQgKGluIGJvdGggdGltZSBhbmQgc3BhY2UpIHRoYW4gcmVwZWF0ZWRseQorICAgICAgZW1iZWRkaW5nIHRoZSBtb2R1bGUgYW5kIGNsYXNzIG5hbWVzIGluIElOU1Qgb3Bjb2Rlcy4KKworICAgICAgVW5saWtlIElOU1QsIE9CSiB0YWtlcyBubyBhcmd1bWVudHMgZnJvbSB0aGUgb3Bjb2RlIHN0cmVhbS4gIEluc3RlYWQKKyAgICAgIHRoZSBjbGFzcyBvYmplY3QgaXMgdGFrZW4gb2ZmIHRoZSBzdGFjaywgaW1tZWRpYXRlbHkgYWJvdmUgdGhlCisgICAgICB0b3Btb3N0IG1hcmtvYmplY3Q6CisKKyAgICAgIFN0YWNrIGJlZm9yZTogLi4uIG1hcmtvYmplY3QgY2xhc3NvYmplY3Qgc3RhY2tzbGljZQorICAgICAgU3RhY2sgYWZ0ZXI6ICAuLi4gbmV3X2luc3RhbmNlX29iamVjdAorCisgICAgICBBcyBmb3IgSU5TVCwgdGhlIHJlbWFpbmRlciBvZiB0aGUgc3RhY2sgYWJvdmUgdGhlIG1hcmtvYmplY3QgaXMKKyAgICAgIGdhdGhlcmVkIGludG8gYW4gYXJndW1lbnQgdHVwbGUsIGFuZCB0aGVuIHRoZSBsb2dpYyBzZWVtcyBpZGVudGljYWwsCisgICAgICBleGNlcHQgdGhhdCBubyBfX3NhZmVfZm9yX3VucGlja2xpbmdfXyBjaGVjayBpcyBkb25lIChYWFggdGhpcyBpcworICAgICAgYSBidWc7IGNQaWNrbGUgZG9lcyB0ZXN0IF9fc2FmZV9mb3JfdW5waWNrbGluZ19fKS4gIFNlZSBJTlNUIGZvcgorICAgICAgdGhlIGdvcnkgZGV0YWlscy4KKworICAgICAgTk9URTogIEluIFB5dGhvbiAyLjMsIElOU1QgYW5kIE9CSiBhcmUgaWRlbnRpY2FsIGV4Y2VwdCBmb3IgaG93IHRoZXkKKyAgICAgIGdldCB0aGUgY2xhc3Mgb2JqZWN0LiAgVGhhdCB3YXMgYWx3YXlzIHRoZSBpbnRlbnQ7IHRoZSBpbXBsZW1lbnRhdGlvbnMKKyAgICAgIGhhZCBkaXZlcmdlZCBmb3IgYWNjaWRlbnRhbCByZWFzb25zLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nTkVXT0JKJywKKyAgICAgIGNvZGU9J1x4ODEnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdCwgYW55b2JqZWN0XSwKKyAgICAgIHN0YWNrX2FmdGVyPVthbnlvYmplY3RdLAorICAgICAgcHJvdG89MiwKKyAgICAgIGRvYz0iIiJCdWlsZCBhbiBvYmplY3QgaW5zdGFuY2UuCisKKyAgICAgIFRoZSBzdGFjayBiZWZvcmUgc2hvdWxkIGJlIHRob3VnaHQgb2YgYXMgY29udGFpbmluZyBhIGNsYXNzCisgICAgICBvYmplY3QgZm9sbG93ZWQgYnkgYW4gYXJndW1lbnQgdHVwbGUgKHRoZSB0dXBsZSBiZWluZyB0aGUgc3RhY2sKKyAgICAgIHRvcCkuICBDYWxsIHRoZXNlIGNscyBhbmQgYXJncy4gIFRoZXkgYXJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrLAorICAgICAgYW5kIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBjbHMuX19uZXdfXyhjbHMsICphcmdzKSBpcyBwdXNoZWQgYmFjaworICAgICAgb250byB0aGUgc3RhY2suCisgICAgICAiIiIpLAorCisgICAgIyBNYWNoaW5lIGNvbnRyb2wuCisKKyAgICBJKG5hbWU9J1BST1RPJywKKyAgICAgIGNvZGU9J1x4ODAnLAorICAgICAgYXJnPXVpbnQxLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W10sCisgICAgICBwcm90bz0yLAorICAgICAgZG9jPSIiIlByb3RvY29sIHZlcnNpb24gaW5kaWNhdG9yLgorCisgICAgICBGb3IgcHJvdG9jb2wgMiBhbmQgYWJvdmUsIGEgcGlja2xlIG11c3Qgc3RhcnQgd2l0aCB0aGlzIG9wY29kZS4KKyAgICAgIFRoZSBhcmd1bWVudCBpcyB0aGUgcHJvdG9jb2wgdmVyc2lvbiwgYW4gaW50IGluIHJhbmdlKDIsIDI1NikuCisgICAgICAiIiIpLAorCisgICAgSShuYW1lPSdTVE9QJywKKyAgICAgIGNvZGU9Jy4nLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bXSwKKyAgICAgIHByb3RvPTAsCisgICAgICBkb2M9IiIiU3RvcCB0aGUgdW5waWNrbGluZyBtYWNoaW5lLgorCisgICAgICBFdmVyeSBwaWNrbGUgZW5kcyB3aXRoIHRoaXMgb3Bjb2RlLiAgVGhlIG9iamVjdCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaworICAgICAgaXMgcG9wcGVkLCBhbmQgdGhhdCdzIHRoZSByZXN1bHQgb2YgdW5waWNrbGluZy4gIFRoZSBzdGFjayBzaG91bGQgYmUKKyAgICAgIGVtcHR5IHRoZW4uCisgICAgICAiIiIpLAorCisgICAgIyBXYXlzIHRvIGRlYWwgd2l0aCBwZXJzaXN0ZW50IElEcy4KKworICAgIEkobmFtZT0nUEVSU0lEJywKKyAgICAgIGNvZGU9J1AnLAorICAgICAgYXJnPXN0cmluZ25sX25vZXNjYXBlLAorICAgICAgc3RhY2tfYmVmb3JlPVtdLAorICAgICAgc3RhY2tfYWZ0ZXI9W2FueW9iamVjdF0sCisgICAgICBwcm90bz0wLAorICAgICAgZG9jPSIiIlB1c2ggYW4gb2JqZWN0IGlkZW50aWZpZWQgYnkgYSBwZXJzaXN0ZW50IElELgorCisgICAgICBUaGUgcGlja2xlIG1vZHVsZSBkb2Vzbid0IGRlZmluZSB3aGF0IGEgcGVyc2lzdGVudCBJRCBtZWFucy4gIFBFUlNJRCdzCisgICAgICBhcmd1bWVudCBpcyBhIG5ld2xpbmUtdGVybWluYXRlZCBzdHItc3R5bGUgKG5vIGVtYmVkZGVkIGVzY2FwZXMsIG5vCisgICAgICBicmFja2V0aW5nIHF1b3RlIGNoYXJhY3RlcnMpIHN0cmluZywgd2hpY2ggKmlzKiAidGhlIHBlcnNpc3RlbnQgSUQiLgorICAgICAgVGhlIHVucGlja2xlciBwYXNzZXMgdGhpcyBzdHJpbmcgdG8gc2VsZi5wZXJzaXN0ZW50X2xvYWQoKS4gIFdoYXRldmVyCisgICAgICBvYmplY3QgdGhhdCByZXR1cm5zIGlzIHB1c2hlZCBvbiB0aGUgc3RhY2suICBUaGVyZSBpcyBubyBpbXBsZW1lbnRhdGlvbgorICAgICAgb2YgcGVyc2lzdGVudF9sb2FkKCkgaW4gUHl0aG9uJ3MgdW5waWNrbGVyOiAgaXQgbXVzdCBiZSBzdXBwbGllZCBieSBhbgorICAgICAgdW5waWNrbGVyIHN1YmNsYXNzLgorICAgICAgIiIiKSwKKworICAgIEkobmFtZT0nQklOUEVSU0lEJywKKyAgICAgIGNvZGU9J1EnLAorICAgICAgYXJnPU5vbmUsCisgICAgICBzdGFja19iZWZvcmU9W2FueW9iamVjdF0sCisgICAgICBzdGFja19hZnRlcj1bYW55b2JqZWN0XSwKKyAgICAgIHByb3RvPTEsCisgICAgICBkb2M9IiIiUHVzaCBhbiBvYmplY3QgaWRlbnRpZmllZCBieSBhIHBlcnNpc3RlbnQgSUQuCisKKyAgICAgIExpa2UgUEVSU0lELCBleGNlcHQgdGhlIHBlcnNpc3RlbnQgSUQgaXMgcG9wcGVkIG9mZiB0aGUgc3RhY2sgKGluc3RlYWQKKyAgICAgIG9mIGJlaW5nIGEgc3RyaW5nIGVtYmVkZGVkIGluIHRoZSBvcGNvZGUgYnl0ZXN0cmVhbSkuICBUaGUgcGVyc2lzdGVudAorICAgICAgSUQgaXMgcGFzc2VkIHRvIHNlbGYucGVyc2lzdGVudF9sb2FkKCksIGFuZCB3aGF0ZXZlciBvYmplY3QgdGhhdAorICAgICAgcmV0dXJucyBpcyBwdXNoZWQgb24gdGhlIHN0YWNrLiAgU2VlIFBFUlNJRCBmb3IgbW9yZSBkZXRhaWwuCisgICAgICAiIiIpLAorXQorZGVsIEkKKworIyBWZXJpZnkgdW5pcXVlbmVzcyBvZiAubmFtZSBhbmQgLmNvZGUgbWVtYmVycy4KK25hbWUyaSA9IHt9Citjb2RlMmkgPSB7fQorCitmb3IgaSwgZCBpbiBlbnVtZXJhdGUob3Bjb2Rlcyk6CisgICAgaWYgZC5uYW1lIGluIG5hbWUyaToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVwZWF0ZWQgbmFtZSAlciBhdCBpbmRpY2VzICVkIGFuZCAlZCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChkLm5hbWUsIG5hbWUyaVtkLm5hbWVdLCBpKSkKKyAgICBpZiBkLmNvZGUgaW4gY29kZTJpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJyZXBlYXRlZCBjb2RlICVyIGF0IGluZGljZXMgJWQgYW5kICVkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGQuY29kZSwgY29kZTJpW2QuY29kZV0sIGkpKQorCisgICAgbmFtZTJpW2QubmFtZV0gPSBpCisgICAgY29kZTJpW2QuY29kZV0gPSBpCisKK2RlbCBuYW1lMmksIGNvZGUyaSwgaSwgZAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQnVpbGQgYSBjb2RlMm9wIGRpY3QsIG1hcHBpbmcgb3Bjb2RlIGNoYXJhY3RlcnMgdG8gT3Bjb2RlSW5mbyByZWNvcmRzLgorIyBBbHNvIGVuc3VyZSB3ZSd2ZSBnb3QgdGhlIHNhbWUgc3R1ZmYgYXMgcGlja2xlLnB5LCBhbHRob3VnaCB0aGUKKyMgaW50cm9zcGVjdGlvbiBoZXJlIGlzIGRpY2V5LgorCitjb2RlMm9wID0ge30KK2ZvciBkIGluIG9wY29kZXM6CisgICAgY29kZTJvcFtkLmNvZGVdID0gZAorZGVsIGQKKworZGVmIGFzc3VyZV9waWNrbGVfY29uc2lzdGVuY3kodmVyYm9zZT1GYWxzZSk6CisgICAgaW1wb3J0IHBpY2tsZSwgcmUKKworICAgIGNvcHkgPSBjb2RlMm9wLmNvcHkoKQorICAgIGZvciBuYW1lIGluIHBpY2tsZS5fX2FsbF9fOgorICAgICAgICBpZiBub3QgcmUubWF0Y2goIltBLVpdW0EtWjAtOV9dKyQiLCBuYW1lKToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgInNraXBwaW5nICVyOiBpdCBkb2Vzbid0IGxvb2sgbGlrZSBhbiBvcGNvZGUgbmFtZSIgJSBuYW1lCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBwaWNrbGVjb2RlID0gZ2V0YXR0cihwaWNrbGUsIG5hbWUpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHBpY2tsZWNvZGUsIHN0cikgb3IgbGVuKHBpY2tsZWNvZGUpICE9IDE6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICgic2tpcHBpbmcgJXI6IHZhbHVlICVyIGRvZXNuJ3QgbG9vayBsaWtlIGEgcGlja2xlICIKKyAgICAgICAgICAgICAgICAgICAgICAgImNvZGUiICUgKG5hbWUsIHBpY2tsZWNvZGUpKQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgcGlja2xlY29kZSBpbiBjb3B5OgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiY2hlY2tpbmcgbmFtZSAlciB3LyBjb2RlICVyIGZvciBjb25zaXN0ZW5jeSIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgcGlja2xlY29kZSkKKyAgICAgICAgICAgIGQgPSBjb3B5W3BpY2tsZWNvZGVdCisgICAgICAgICAgICBpZiBkLm5hbWUgIT0gbmFtZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJmb3IgcGlja2xlIGNvZGUgJXIsIHBpY2tsZS5weSB1c2VzIG5hbWUgJXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1dCB3ZSdyZSB1c2luZyBuYW1lICVyIiAlIChwaWNrbGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLm5hbWUpKQorICAgICAgICAgICAgIyBGb3JnZXQgdGhpcyBvbmUuICBBbnkgbGVmdCBvdmVyIGluIGNvcHkgYXQgdGhlIGVuZCBhcmUgYSBwcm9ibGVtCisgICAgICAgICAgICAjIG9mIGEgZGlmZmVyZW50IGtpbmQuCisgICAgICAgICAgICBkZWwgY29weVtwaWNrbGVjb2RlXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicGlja2xlLnB5IGFwcGVhcnMgdG8gaGF2ZSBhIHBpY2tsZSBvcGNvZGUgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lICVyIGFuZCBjb2RlICVyLCBidXQgd2UgZG9uJ3QiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsIHBpY2tsZWNvZGUpKQorICAgIGlmIGNvcHk6CisgICAgICAgIG1zZyA9IFsid2UgYXBwZWFyIHRvIGhhdmUgcGlja2xlIG9wY29kZXMgdGhhdCBwaWNrbGUucHkgZG9lc24ndCBoYXZlOiJdCisgICAgICAgIGZvciBjb2RlLCBkIGluIGNvcHkuaXRlbXMoKToKKyAgICAgICAgICAgIG1zZy5hcHBlbmQoIiAgICBuYW1lICVyIHdpdGggY29kZSAlciIgJSAoZC5uYW1lLCBjb2RlKSkKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiXG4iLmpvaW4obXNnKSkKKworYXNzdXJlX3BpY2tsZV9jb25zaXN0ZW5jeSgpCitkZWwgYXNzdXJlX3BpY2tsZV9jb25zaXN0ZW5jeQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQSBwaWNrbGUgb3Bjb2RlIGdlbmVyYXRvci4KKworZGVmIGdlbm9wcyhwaWNrbGUpOgorICAgICIiIkdlbmVyYXRlIGFsbCB0aGUgb3Bjb2RlcyBpbiBhIHBpY2tsZS4KKworICAgICdwaWNrbGUnIGlzIGEgZmlsZS1saWtlIG9iamVjdCwgb3Igc3RyaW5nLCBjb250YWluaW5nIHRoZSBwaWNrbGUuCisKKyAgICBFYWNoIG9wY29kZSBpbiB0aGUgcGlja2xlIGlzIGdlbmVyYXRlZCwgZnJvbSB0aGUgY3VycmVudCBwaWNrbGUgcG9zaXRpb24sCisgICAgc3RvcHBpbmcgYWZ0ZXIgYSBTVE9QIG9wY29kZSBpcyBkZWxpdmVyZWQuICBBIHRyaXBsZSBpcyBnZW5lcmF0ZWQgZm9yCisgICAgZWFjaCBvcGNvZGU6CisKKyAgICAgICAgb3Bjb2RlLCBhcmcsIHBvcworCisgICAgb3Bjb2RlIGlzIGFuIE9wY29kZUluZm8gcmVjb3JkLCBkZXNjcmliaW5nIHRoZSBjdXJyZW50IG9wY29kZS4KKworICAgIElmIHRoZSBvcGNvZGUgaGFzIGFuIGFyZ3VtZW50IGVtYmVkZGVkIGluIHRoZSBwaWNrbGUsIGFyZyBpcyBpdHMgZGVjb2RlZAorICAgIHZhbHVlLCBhcyBhIFB5dGhvbiBvYmplY3QuICBJZiB0aGUgb3Bjb2RlIGRvZXNuJ3QgaGF2ZSBhbiBhcmd1bWVudCwgYXJnCisgICAgaXMgTm9uZS4KKworICAgIElmIHRoZSBwaWNrbGUgaGFzIGEgdGVsbCgpIG1ldGhvZCwgcG9zIHdhcyB0aGUgdmFsdWUgb2YgcGlja2xlLnRlbGwoKQorICAgIGJlZm9yZSByZWFkaW5nIHRoZSBjdXJyZW50IG9wY29kZS4gIElmIHRoZSBwaWNrbGUgaXMgYSBzdHJpbmcgb2JqZWN0LAorICAgIGl0J3Mgd3JhcHBlZCBpbiBhIFN0cmluZ0lPIG9iamVjdCwgYW5kIHRoZSBsYXR0ZXIncyB0ZWxsKCkgcmVzdWx0IGlzCisgICAgdXNlZC4gIEVsc2UgKHRoZSBwaWNrbGUgZG9lc24ndCBoYXZlIGEgdGVsbCgpLCBhbmQgaXQncyBub3Qgb2J2aW91cyBob3cKKyAgICB0byBxdWVyeSBpdHMgY3VycmVudCBwb3NpdGlvbikgcG9zIGlzIE5vbmUuCisgICAgIiIiCisKKyAgICBpbXBvcnQgY1N0cmluZ0lPIGFzIFN0cmluZ0lPCisKKyAgICBpZiBpc2luc3RhbmNlKHBpY2tsZSwgc3RyKToKKyAgICAgICAgcGlja2xlID0gU3RyaW5nSU8uU3RyaW5nSU8ocGlja2xlKQorCisgICAgaWYgaGFzYXR0cihwaWNrbGUsICJ0ZWxsIik6CisgICAgICAgIGdldHBvcyA9IHBpY2tsZS50ZWxsCisgICAgZWxzZToKKyAgICAgICAgZ2V0cG9zID0gbGFtYmRhOiBOb25lCisKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBwb3MgPSBnZXRwb3MoKQorICAgICAgICBjb2RlID0gcGlja2xlLnJlYWQoMSkKKyAgICAgICAgb3Bjb2RlID0gY29kZTJvcC5nZXQoY29kZSkKKyAgICAgICAgaWYgb3Bjb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBjb2RlID09ICIiOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInBpY2tsZSBleGhhdXN0ZWQgYmVmb3JlIHNlZWluZyBTVE9QIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYXQgcG9zaXRpb24gJXMsIG9wY29kZSAlciB1bmtub3duIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyBpcyBOb25lIGFuZCAiPHVua25vd24+IiBvciBwb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlKSkKKyAgICAgICAgaWYgb3Bjb2RlLmFyZyBpcyBOb25lOgorICAgICAgICAgICAgYXJnID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnID0gb3Bjb2RlLmFyZy5yZWFkZXIocGlja2xlKQorICAgICAgICB5aWVsZCBvcGNvZGUsIGFyZywgcG9zCisgICAgICAgIGlmIGNvZGUgPT0gJy4nOgorICAgICAgICAgICAgYXNzZXJ0IG9wY29kZS5uYW1lID09ICdTVE9QJworICAgICAgICAgICAgYnJlYWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEEgcGlja2xlIG9wdGltaXplci4KKworZGVmIG9wdGltaXplKHApOgorICAgICdPcHRpbWl6ZSBhIHBpY2tsZSBzdHJpbmcgYnkgcmVtb3ZpbmcgdW51c2VkIFBVVCBvcGNvZGVzJworICAgIGdldHMgPSBzZXQoKSAgICAgICAgICAgICMgc2V0IG9mIGFyZ3MgdXNlZCBieSBhIEdFVCBvcGNvZGUKKyAgICBwdXRzID0gW10gICAgICAgICAgICAgICAjIChhcmcsIHN0YXJ0cG9zLCBzdG9wcG9zKSBmb3IgdGhlIFBVVCBvcGNvZGVzCisgICAgcHJldnBvcyA9IE5vbmUgICAgICAgICAgIyBzZXQgdG8gcG9zIGlmIHByZXZpb3VzIG9wY29kZSB3YXMgYSBQVVQKKyAgICBmb3Igb3Bjb2RlLCBhcmcsIHBvcyBpbiBnZW5vcHMocCk6CisgICAgICAgIGlmIHByZXZwb3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwdXRzLmFwcGVuZCgocHJldmFyZywgcHJldnBvcywgcG9zKSkKKyAgICAgICAgICAgIHByZXZwb3MgPSBOb25lCisgICAgICAgIGlmICdQVVQnIGluIG9wY29kZS5uYW1lOgorICAgICAgICAgICAgcHJldmFyZywgcHJldnBvcyA9IGFyZywgcG9zCisgICAgICAgIGVsaWYgJ0dFVCcgaW4gb3Bjb2RlLm5hbWU6CisgICAgICAgICAgICBnZXRzLmFkZChhcmcpCisKKyAgICAjIENvcHkgdGhlIHBpY2tsZSBzdHJpbmcgZXhjZXB0IGZvciBQVVRTIHdpdGhvdXQgYSBjb3JyZXNwb25kaW5nIEdFVAorICAgIHMgPSBbXQorICAgIGkgPSAwCisgICAgZm9yIGFyZywgc3RhcnQsIHN0b3AgaW4gcHV0czoKKyAgICAgICAgaiA9IHN0b3AgaWYgKGFyZyBpbiBnZXRzKSBlbHNlIHN0YXJ0CisgICAgICAgIHMuYXBwZW5kKHBbaTpqXSkKKyAgICAgICAgaSA9IHN0b3AKKyAgICBzLmFwcGVuZChwW2k6XSkKKyAgICByZXR1cm4gJycuam9pbihzKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQSBzeW1ib2xpYyBwaWNrbGUgZGlzYXNzZW1ibGVyLgorCitkZWYgZGlzKHBpY2tsZSwgb3V0PU5vbmUsIG1lbW89Tm9uZSwgaW5kZW50bGV2ZWw9NCk6CisgICAgIiIiUHJvZHVjZSBhIHN5bWJvbGljIGRpc2Fzc2VtYmx5IG9mIGEgcGlja2xlLgorCisgICAgJ3BpY2tsZScgaXMgYSBmaWxlLWxpa2Ugb2JqZWN0LCBvciBzdHJpbmcsIGNvbnRhaW5pbmcgYSAoYXQgbGVhc3Qgb25lKQorICAgIHBpY2tsZS4gIFRoZSBwaWNrbGUgaXMgZGlzYXNzZW1ibGVkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24sIHRocm91Z2gKKyAgICB0aGUgZmlyc3QgU1RPUCBvcGNvZGUgZW5jb3VudGVyZWQuCisKKyAgICBPcHRpb25hbCBhcmcgJ291dCcgaXMgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIHdoaWNoIHRoZSBkaXNhc3NlbWJseSBpcworICAgIHByaW50ZWQuICBJdCBkZWZhdWx0cyB0byBzeXMuc3Rkb3V0LgorCisgICAgT3B0aW9uYWwgYXJnICdtZW1vJyBpcyBhIFB5dGhvbiBkaWN0LCB1c2VkIGFzIHRoZSBwaWNrbGUncyBtZW1vLiAgSXQKKyAgICBtYXkgYmUgbXV0YXRlZCBieSBkaXMoKSwgaWYgdGhlIHBpY2tsZSBjb250YWlucyBQVVQgb3IgQklOUFVUIG9wY29kZXMuCisgICAgUGFzc2luZyB0aGUgc2FtZSBtZW1vIG9iamVjdCB0byBhbm90aGVyIGRpcygpIGNhbGwgdGhlbiBhbGxvd3MgZGlzYXNzZW1ibHkKKyAgICB0byBwcm9jZWVkIGFjcm9zcyBtdWx0aXBsZSBwaWNrbGVzIHRoYXQgd2VyZSBhbGwgY3JlYXRlZCBieSB0aGUgc2FtZQorICAgIHBpY2tsZXIgd2l0aCB0aGUgc2FtZSBtZW1vLiAgT3JkaW5hcmlseSB5b3UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGlzLgorCisgICAgT3B0aW9uYWwgYXJnIGluZGVudGxldmVsIGlzIHRoZSBudW1iZXIgb2YgYmxhbmtzIGJ5IHdoaWNoIHRvIGluZGVudAorICAgIGEgbmV3IE1BUksgbGV2ZWwuICBJdCBkZWZhdWx0cyB0byA0LgorCisgICAgSW4gYWRkaXRpb24gdG8gcHJpbnRpbmcgdGhlIGRpc2Fzc2VtYmx5LCBzb21lIHNhbml0eSBjaGVja3MgYXJlIG1hZGU6CisKKyAgICArIEFsbCBlbWJlZGRlZCBvcGNvZGUgYXJndW1lbnRzICJtYWtlIHNlbnNlIi4KKworICAgICsgRXhwbGljaXQgYW5kIGltcGxpY2l0IHBvcCBvcGVyYXRpb25zIGhhdmUgZW5vdWdoIGl0ZW1zIG9uIHRoZSBzdGFjay4KKworICAgICsgV2hlbiBhbiBvcGNvZGUgaW1wbGljaXRseSByZWZlcnMgdG8gYSBtYXJrb2JqZWN0LCBhIG1hcmtvYmplY3QgaXMKKyAgICAgIGFjdHVhbGx5IG9uIHRoZSBzdGFjay4KKworICAgICsgQSBtZW1vIGVudHJ5IGlzbid0IHJlZmVyZW5jZWQgYmVmb3JlIGl0J3MgZGVmaW5lZC4KKworICAgICsgVGhlIG1hcmtvYmplY3QgaXNuJ3Qgc3RvcmVkIGluIHRoZSBtZW1vLgorCisgICAgKyBBIG1lbW8gZW50cnkgaXNuJ3QgcmVkZWZpbmVkLgorICAgICIiIgorCisgICAgIyBNb3N0IG9mIHRoZSBoYWlyIGhlcmUgaXMgZm9yIHNhbml0eSBjaGVja3MsIGJ1dCBtb3N0IG9mIGl0IGlzIG5lZWRlZAorICAgICMgYW55d2F5IHRvIGRldGVjdCB3aGVuIGEgcHJvdG9jb2wgMCBQT1AgdGFrZXMgYSBNQVJLIG9mZiB0aGUgc3RhY2sKKyAgICAjICh3aGljaCBpbiB0dXJuIGlzIG5lZWRlZCB0byBpbmRlbnQgTUFSSyBibG9ja3MgY29ycmVjdGx5KS4KKworICAgIHN0YWNrID0gW10gICAgICAgICAgIyBjcnVkZSBlbXVsYXRpb24gb2YgdW5waWNrbGVyIHN0YWNrCisgICAgaWYgbWVtbyBpcyBOb25lOgorICAgICAgICBtZW1vID0ge30gICAgICAgIyBjcnVkZSBlbXVsYXRpb24gb2YgdW5waWNrZXIgbWVtbworICAgIG1heHByb3RvID0gLTEgICAgICAgIyBtYXggcHJvdG9jb2wgbnVtYmVyIHNlZW4KKyAgICBtYXJrc3RhY2sgPSBbXSAgICAgICMgYnl0ZWNvZGUgcG9zaXRpb25zIG9mIE1BUksgb3Bjb2RlcworICAgIGluZGVudGNodW5rID0gJyAnICogaW5kZW50bGV2ZWwKKyAgICBlcnJvcm1zZyA9IE5vbmUKKyAgICBmb3Igb3Bjb2RlLCBhcmcsIHBvcyBpbiBnZW5vcHMocGlja2xlKToKKyAgICAgICAgaWYgcG9zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJpbnQgPj4gb3V0LCAiJTVkOiIgJSBwb3MsCisKKyAgICAgICAgbGluZSA9ICIlLTRzICVzJXMiICUgKHJlcHIob3Bjb2RlLmNvZGUpWzE6LTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZW50Y2h1bmsgKiBsZW4obWFya3N0YWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZS5uYW1lKQorCisgICAgICAgIG1heHByb3RvID0gbWF4KG1heHByb3RvLCBvcGNvZGUucHJvdG8pCisgICAgICAgIGJlZm9yZSA9IG9wY29kZS5zdGFja19iZWZvcmUgICAgIyBkb24ndCBtdXRhdGUKKyAgICAgICAgYWZ0ZXIgPSBvcGNvZGUuc3RhY2tfYWZ0ZXIgICAgICAjIGRvbid0IG11dGF0ZQorICAgICAgICBudW10b3BvcCA9IGxlbihiZWZvcmUpCisKKyAgICAgICAgIyBTZWUgd2hldGhlciBhIE1BUksgc2hvdWxkIGJlIHBvcHBlZC4KKyAgICAgICAgbWFya21zZyA9IE5vbmUKKyAgICAgICAgaWYgbWFya29iamVjdCBpbiBiZWZvcmUgb3IgKG9wY29kZS5uYW1lID09ICJQT1AiIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1stMV0gaXMgbWFya29iamVjdCk6CisgICAgICAgICAgICBhc3NlcnQgbWFya29iamVjdCBub3QgaW4gYWZ0ZXIKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBpZiBtYXJrb2JqZWN0IGluIGJlZm9yZToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IGJlZm9yZVstMV0gaXMgc3RhY2tzbGljZQorICAgICAgICAgICAgaWYgbWFya3N0YWNrOgorICAgICAgICAgICAgICAgIG1hcmtwb3MgPSBtYXJrc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICBpZiBtYXJrcG9zIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG1hcmttc2cgPSAiKE1BUksgYXQgdW5rbm93biBvcGNvZGUgb2Zmc2V0KSIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtYXJrbXNnID0gIihNQVJLIGF0ICVkKSIgJSBtYXJrcG9zCisgICAgICAgICAgICAgICAgIyBQb3AgZXZlcnl0aGluZyBhdCBhbmQgYWZ0ZXIgdGhlIHRvcG1vc3QgbWFya29iamVjdC4KKyAgICAgICAgICAgICAgICB3aGlsZSBzdGFja1stMV0gaXMgbm90IG1hcmtvYmplY3Q6CisgICAgICAgICAgICAgICAgICAgIHN0YWNrLnBvcCgpCisgICAgICAgICAgICAgICAgc3RhY2sucG9wKCkKKyAgICAgICAgICAgICAgICAjIFN0b3AgbGF0ZXIgY29kZSBmcm9tIHBvcHBpbmcgdG9vIG11Y2guCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBudW10b3BvcCA9IGJlZm9yZS5pbmRleChtYXJrb2JqZWN0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgb3Bjb2RlLm5hbWUgPT0gIlBPUCIKKyAgICAgICAgICAgICAgICAgICAgbnVtdG9wb3AgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVycm9ybXNnID0gbWFya21zZyA9ICJubyBNQVJLIGV4aXN0cyBvbiBzdGFjayIKKworICAgICAgICAjIENoZWNrIGZvciBjb3JyZWN0IG1lbW8gdXNhZ2UuCisgICAgICAgIGlmIG9wY29kZS5uYW1lIGluICgiUFVUIiwgIkJJTlBVVCIsICJMT05HX0JJTlBVVCIpOgorICAgICAgICAgICAgYXNzZXJ0IGFyZyBpcyBub3QgTm9uZQorICAgICAgICAgICAgaWYgYXJnIGluIG1lbW86CisgICAgICAgICAgICAgICAgZXJyb3Jtc2cgPSAibWVtbyBrZXkgJXIgYWxyZWFkeSBkZWZpbmVkIiAlIGFyZworICAgICAgICAgICAgZWxpZiBub3Qgc3RhY2s6CisgICAgICAgICAgICAgICAgZXJyb3Jtc2cgPSAic3RhY2sgaXMgZW1wdHkgLS0gY2FuJ3Qgc3RvcmUgaW50byBtZW1vIgorICAgICAgICAgICAgZWxpZiBzdGFja1stMV0gaXMgbWFya29iamVjdDoKKyAgICAgICAgICAgICAgICBlcnJvcm1zZyA9ICJjYW4ndCBzdG9yZSBtYXJrb2JqZWN0IGluIHRoZSBtZW1vIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZW1vW2FyZ10gPSBzdGFja1stMV0KKworICAgICAgICBlbGlmIG9wY29kZS5uYW1lIGluICgiR0VUIiwgIkJJTkdFVCIsICJMT05HX0JJTkdFVCIpOgorICAgICAgICAgICAgaWYgYXJnIGluIG1lbW86CisgICAgICAgICAgICAgICAgYXNzZXJ0IGxlbihhZnRlcikgPT0gMQorICAgICAgICAgICAgICAgIGFmdGVyID0gW21lbW9bYXJnXV0gICAgICMgZm9yIGJldHRlciBzdGFjayBlbXVsYXRpb24KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXJyb3Jtc2cgPSAibWVtbyBrZXkgJXIgaGFzIG5ldmVyIGJlZW4gc3RvcmVkIGludG8iICUgYXJnCisKKyAgICAgICAgaWYgYXJnIGlzIG5vdCBOb25lIG9yIG1hcmttc2c6CisgICAgICAgICAgICAjIG1ha2UgYSBtaWxkIGVmZm9ydCB0byBhbGlnbiBhcmd1bWVudHMKKyAgICAgICAgICAgIGxpbmUgKz0gJyAnICogKDEwIC0gbGVuKG9wY29kZS5uYW1lKSkKKyAgICAgICAgICAgIGlmIGFyZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBsaW5lICs9ICcgJyArIHJlcHIoYXJnKQorICAgICAgICAgICAgaWYgbWFya21zZzoKKyAgICAgICAgICAgICAgICBsaW5lICs9ICcgJyArIG1hcmttc2cKKyAgICAgICAgcHJpbnQgPj4gb3V0LCBsaW5lCisKKyAgICAgICAgaWYgZXJyb3Jtc2c6CisgICAgICAgICAgICAjIE5vdGUgdGhhdCB3ZSBkZWxheWVkIGNvbXBsYWluaW5nIHVudGlsIHRoZSBvZmZlbmRpbmcgb3Bjb2RlCisgICAgICAgICAgICAjIHdhcyBwcmludGVkLgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcihlcnJvcm1zZykKKworICAgICAgICAjIEVtdWxhdGUgdGhlIHN0YWNrIGVmZmVjdHMuCisgICAgICAgIGlmIGxlbihzdGFjaykgPCBudW10b3BvcDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInRyaWVzIHRvIHBvcCAlZCBpdGVtcyBmcm9tIHN0YWNrIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib25seSAlZCBpdGVtcyIgJSAobnVtdG9wb3AsIGxlbihzdGFjaykpKQorICAgICAgICBpZiBudW10b3BvcDoKKyAgICAgICAgICAgIGRlbCBzdGFja1stbnVtdG9wb3A6XQorICAgICAgICBpZiBtYXJrb2JqZWN0IGluIGFmdGVyOgorICAgICAgICAgICAgYXNzZXJ0IG1hcmtvYmplY3Qgbm90IGluIGJlZm9yZQorICAgICAgICAgICAgbWFya3N0YWNrLmFwcGVuZChwb3MpCisKKyAgICAgICAgc3RhY2suZXh0ZW5kKGFmdGVyKQorCisgICAgcHJpbnQgPj4gb3V0LCAiaGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0iLCBtYXhwcm90bworICAgIGlmIHN0YWNrOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdGFjayBub3QgZW1wdHkgYWZ0ZXIgU1RPUDogJXIiICUgc3RhY2spCisKKyMgRm9yIHVzZSBpbiB0aGUgZG9jdGVzdCwgc2ltcGx5IGFzIGFuIGV4YW1wbGUgb2YgYSBjbGFzcyB0byBwaWNrbGUuCitjbGFzcyBfRXhhbXBsZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKworX2Rpc190ZXN0ID0gciIiIgorPj4+IGltcG9ydCBwaWNrbGUKKz4+PiB4ID0gWzEsIDIsICgzLCA0KSwgeydhYmMnOiB1ImRlZiJ9XQorPj4+IHBrbCA9IHBpY2tsZS5kdW1wcyh4LCAwKQorPj4+IGRpcyhwa2wpCisgICAgMDogKCAgICBNQVJLCisgICAgMTogbCAgICAgICAgTElTVCAgICAgICAoTUFSSyBhdCAwKQorICAgIDI6IHAgICAgUFVUICAgICAgICAwCisgICAgNTogSSAgICBJTlQgICAgICAgIDEKKyAgICA4OiBhICAgIEFQUEVORAorICAgIDk6IEkgICAgSU5UICAgICAgICAyCisgICAxMjogYSAgICBBUFBFTkQKKyAgIDEzOiAoICAgIE1BUksKKyAgIDE0OiBJICAgICAgICBJTlQgICAgICAgIDMKKyAgIDE3OiBJICAgICAgICBJTlQgICAgICAgIDQKKyAgIDIwOiB0ICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDEzKQorICAgMjE6IHAgICAgUFVUICAgICAgICAxCisgICAyNDogYSAgICBBUFBFTkQKKyAgIDI1OiAoICAgIE1BUksKKyAgIDI2OiBkICAgICAgICBESUNUICAgICAgIChNQVJLIGF0IDI1KQorICAgMjc6IHAgICAgUFVUICAgICAgICAyCisgICAzMDogUyAgICBTVFJJTkcgICAgICdhYmMnCisgICAzNzogcCAgICBQVVQgICAgICAgIDMKKyAgIDQwOiBWICAgIFVOSUNPREUgICAgdSdkZWYnCisgICA0NTogcCAgICBQVVQgICAgICAgIDQKKyAgIDQ4OiBzICAgIFNFVElURU0KKyAgIDQ5OiBhICAgIEFQUEVORAorICAgNTA6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMAorCitUcnkgYWdhaW4gd2l0aCBhICJiaW5hcnkiIHBpY2tsZS4KKworPj4+IHBrbCA9IHBpY2tsZS5kdW1wcyh4LCAxKQorPj4+IGRpcyhwa2wpCisgICAgMDogXSAgICBFTVBUWV9MSVNUCisgICAgMTogcSAgICBCSU5QVVQgICAgIDAKKyAgICAzOiAoICAgIE1BUksKKyAgICA0OiBLICAgICAgICBCSU5JTlQxICAgIDEKKyAgICA2OiBLICAgICAgICBCSU5JTlQxICAgIDIKKyAgICA4OiAoICAgICAgICBNQVJLCisgICAgOTogSyAgICAgICAgICAgIEJJTklOVDEgICAgMworICAgMTE6IEsgICAgICAgICAgICBCSU5JTlQxICAgIDQKKyAgIDEzOiB0ICAgICAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCA4KQorICAgMTQ6IHEgICAgICAgIEJJTlBVVCAgICAgMQorICAgMTY6IH0gICAgICAgIEVNUFRZX0RJQ1QKKyAgIDE3OiBxICAgICAgICBCSU5QVVQgICAgIDIKKyAgIDE5OiBVICAgICAgICBTSE9SVF9CSU5TVFJJTkcgJ2FiYycKKyAgIDI0OiBxICAgICAgICBCSU5QVVQgICAgIDMKKyAgIDI2OiBYICAgICAgICBCSU5VTklDT0RFIHUnZGVmJworICAgMzQ6IHEgICAgICAgIEJJTlBVVCAgICAgNAorICAgMzY6IHMgICAgICAgIFNFVElURU0KKyAgIDM3OiBlICAgICAgICBBUFBFTkRTICAgIChNQVJLIGF0IDMpCisgICAzODogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAxCisKK0V4ZXJjaXNlIHRoZSBJTlNUL09CSi9CVUlMRCBmYW1pbHkuCisKKz4+PiBpbXBvcnQgcGlja2xldG9vbHMKKz4+PiBkaXMocGlja2xlLmR1bXBzKHBpY2tsZXRvb2xzLmRpcywgMCkpCisgICAgMDogYyAgICBHTE9CQUwgICAgICdwaWNrbGV0b29scyBkaXMnCisgICAxNzogcCAgICBQVVQgICAgICAgIDAKKyAgIDIwOiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDAKKworPj4+IGZyb20gcGlja2xldG9vbHMgaW1wb3J0IF9FeGFtcGxlCis+Pj4geCA9IFtfRXhhbXBsZSg0MildICogMgorPj4+IGRpcyhwaWNrbGUuZHVtcHMoeCwgMCkpCisgICAgMDogKCAgICBNQVJLCisgICAgMTogbCAgICAgICAgTElTVCAgICAgICAoTUFSSyBhdCAwKQorICAgIDI6IHAgICAgUFVUICAgICAgICAwCisgICAgNTogKCAgICBNQVJLCisgICAgNjogaSAgICAgICAgSU5TVCAgICAgICAncGlja2xldG9vbHMgX0V4YW1wbGUnIChNQVJLIGF0IDUpCisgICAyODogcCAgICBQVVQgICAgICAgIDEKKyAgIDMxOiAoICAgIE1BUksKKyAgIDMyOiBkICAgICAgICBESUNUICAgICAgIChNQVJLIGF0IDMxKQorICAgMzM6IHAgICAgUFVUICAgICAgICAyCisgICAzNjogUyAgICBTVFJJTkcgICAgICd2YWx1ZScKKyAgIDQ1OiBwICAgIFBVVCAgICAgICAgMworICAgNDg6IEkgICAgSU5UICAgICAgICA0MgorICAgNTI6IHMgICAgU0VUSVRFTQorICAgNTM6IGIgICAgQlVJTEQKKyAgIDU0OiBhICAgIEFQUEVORAorICAgNTU6IGcgICAgR0VUICAgICAgICAxCisgICA1ODogYSAgICBBUFBFTkQKKyAgIDU5OiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDAKKworPj4+IGRpcyhwaWNrbGUuZHVtcHMoeCwgMSkpCisgICAgMDogXSAgICBFTVBUWV9MSVNUCisgICAgMTogcSAgICBCSU5QVVQgICAgIDAKKyAgICAzOiAoICAgIE1BUksKKyAgICA0OiAoICAgICAgICBNQVJLCisgICAgNTogYyAgICAgICAgICAgIEdMT0JBTCAgICAgJ3BpY2tsZXRvb2xzIF9FeGFtcGxlJworICAgMjc6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDEKKyAgIDI5OiBvICAgICAgICAgICAgT0JKICAgICAgICAoTUFSSyBhdCA0KQorICAgMzA6IHEgICAgICAgIEJJTlBVVCAgICAgMgorICAgMzI6IH0gICAgICAgIEVNUFRZX0RJQ1QKKyAgIDMzOiBxICAgICAgICBCSU5QVVQgICAgIDMKKyAgIDM1OiBVICAgICAgICBTSE9SVF9CSU5TVFJJTkcgJ3ZhbHVlJworICAgNDI6IHEgICAgICAgIEJJTlBVVCAgICAgNAorICAgNDQ6IEsgICAgICAgIEJJTklOVDEgICAgNDIKKyAgIDQ2OiBzICAgICAgICBTRVRJVEVNCisgICA0NzogYiAgICAgICAgQlVJTEQKKyAgIDQ4OiBoICAgICAgICBCSU5HRVQgICAgIDIKKyAgIDUwOiBlICAgICAgICBBUFBFTkRTICAgIChNQVJLIGF0IDMpCisgICA1MTogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAxCisKK1RyeSAidGhlIGNhbm9uaWNhbCIgcmVjdXJzaXZlLW9iamVjdCB0ZXN0LgorCis+Pj4gTCA9IFtdCis+Pj4gVCA9IEwsCis+Pj4gTC5hcHBlbmQoVCkKKz4+PiBMWzBdIGlzIFQKK1RydWUKKz4+PiBUWzBdIGlzIEwKK1RydWUKKz4+PiBMWzBdWzBdIGlzIEwKK1RydWUKKz4+PiBUWzBdWzBdIGlzIFQKK1RydWUKKz4+PiBkaXMocGlja2xlLmR1bXBzKEwsIDApKQorICAgIDA6ICggICAgTUFSSworICAgIDE6IGwgICAgICAgIExJU1QgICAgICAgKE1BUksgYXQgMCkKKyAgICAyOiBwICAgIFBVVCAgICAgICAgMAorICAgIDU6ICggICAgTUFSSworICAgIDY6IGcgICAgICAgIEdFVCAgICAgICAgMAorICAgIDk6IHQgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgNSkKKyAgIDEwOiBwICAgIFBVVCAgICAgICAgMQorICAgMTM6IGEgICAgQVBQRU5ECisgICAxNDogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAwCisKKz4+PiBkaXMocGlja2xlLmR1bXBzKEwsIDEpKQorICAgIDA6IF0gICAgRU1QVFlfTElTVAorICAgIDE6IHEgICAgQklOUFVUICAgICAwCisgICAgMzogKCAgICBNQVJLCisgICAgNDogaCAgICAgICAgQklOR0VUICAgICAwCisgICAgNjogdCAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCAzKQorICAgIDc6IHEgICAgQklOUFVUICAgICAxCisgICAgOTogYSAgICBBUFBFTkQKKyAgIDEwOiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDEKKworTm90ZSB0aGF0LCBpbiB0aGUgcHJvdG9jb2wgMCBwaWNrbGUgb2YgdGhlIHJlY3Vyc2l2ZSB0dXBsZSwgdGhlIGRpc2Fzc2VtYmxlcgoraGFzIHRvIGVtdWxhdGUgdGhlIHN0YWNrIGluIG9yZGVyIHRvIHJlYWxpemUgdGhhdCB0aGUgUE9QIG9wY29kZSBhdCAxNiBnZXRzCityaWQgb2YgdGhlIE1BUksgYXQgMC4KKworPj4+IGRpcyhwaWNrbGUuZHVtcHMoVCwgMCkpCisgICAgMDogKCAgICBNQVJLCisgICAgMTogKCAgICAgICAgTUFSSworICAgIDI6IGwgICAgICAgICAgICBMSVNUICAgICAgIChNQVJLIGF0IDEpCisgICAgMzogcCAgICAgICAgUFVUICAgICAgICAwCisgICAgNjogKCAgICAgICAgTUFSSworICAgIDc6IGcgICAgICAgICAgICBHRVQgICAgICAgIDAKKyAgIDEwOiB0ICAgICAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCA2KQorICAgMTE6IHAgICAgICAgIFBVVCAgICAgICAgMQorICAgMTQ6IGEgICAgICAgIEFQUEVORAorICAgMTU6IDAgICAgICAgIFBPUAorICAgMTY6IDAgICAgICAgIFBPUCAgICAgICAgKE1BUksgYXQgMCkKKyAgIDE3OiBnICAgIEdFVCAgICAgICAgMQorICAgMjA6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMAorCis+Pj4gZGlzKHBpY2tsZS5kdW1wcyhULCAxKSkKKyAgICAwOiAoICAgIE1BUksKKyAgICAxOiBdICAgICAgICBFTVBUWV9MSVNUCisgICAgMjogcSAgICAgICAgQklOUFVUICAgICAwCisgICAgNDogKCAgICAgICAgTUFSSworICAgIDU6IGggICAgICAgICAgICBCSU5HRVQgICAgIDAKKyAgICA3OiB0ICAgICAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCA0KQorICAgIDg6IHEgICAgICAgIEJJTlBVVCAgICAgMQorICAgMTA6IGEgICAgICAgIEFQUEVORAorICAgMTE6IDEgICAgICAgIFBPUF9NQVJLICAgKE1BUksgYXQgMCkKKyAgIDEyOiBoICAgIEJJTkdFVCAgICAgMQorICAgMTQ6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMQorCitUcnkgcHJvdG9jb2wgMi4KKworPj4+IGRpcyhwaWNrbGUuZHVtcHMoTCwgMikpCisgICAgMDogXHg4MCBQUk9UTyAgICAgIDIKKyAgICAyOiBdICAgIEVNUFRZX0xJU1QKKyAgICAzOiBxICAgIEJJTlBVVCAgICAgMAorICAgIDU6IGggICAgQklOR0VUICAgICAwCisgICAgNzogXHg4NSBUVVBMRTEKKyAgICA4OiBxICAgIEJJTlBVVCAgICAgMQorICAgMTA6IGEgICAgQVBQRU5ECisgICAxMTogLiAgICBTVE9QCitoaWdoZXN0IHByb3RvY29sIGFtb25nIG9wY29kZXMgPSAyCisKKz4+PiBkaXMocGlja2xlLmR1bXBzKFQsIDIpKQorICAgIDA6IFx4ODAgUFJPVE8gICAgICAyCisgICAgMjogXSAgICBFTVBUWV9MSVNUCisgICAgMzogcSAgICBCSU5QVVQgICAgIDAKKyAgICA1OiBoICAgIEJJTkdFVCAgICAgMAorICAgIDc6IFx4ODUgVFVQTEUxCisgICAgODogcSAgICBCSU5QVVQgICAgIDEKKyAgIDEwOiBhICAgIEFQUEVORAorICAgMTE6IDAgICAgUE9QCisgICAxMjogaCAgICBCSU5HRVQgICAgIDEKKyAgIDE0OiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDIKKyIiIgorCitfbWVtb190ZXN0ID0gciIiIgorPj4+IGltcG9ydCBwaWNrbGUKKz4+PiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworPj4+IGYgPSBTdHJpbmdJTygpCis+Pj4gcCA9IHBpY2tsZS5QaWNrbGVyKGYsIDIpCis+Pj4geCA9IFsxLCAyLCAzXQorPj4+IHAuZHVtcCh4KQorPj4+IHAuZHVtcCh4KQorPj4+IGYuc2VlaygwKQorPj4+IG1lbW8gPSB7fQorPj4+IGRpcyhmLCBtZW1vPW1lbW8pCisgICAgMDogXHg4MCBQUk9UTyAgICAgIDIKKyAgICAyOiBdICAgIEVNUFRZX0xJU1QKKyAgICAzOiBxICAgIEJJTlBVVCAgICAgMAorICAgIDU6ICggICAgTUFSSworICAgIDY6IEsgICAgICAgIEJJTklOVDEgICAgMQorICAgIDg6IEsgICAgICAgIEJJTklOVDEgICAgMgorICAgMTA6IEsgICAgICAgIEJJTklOVDEgICAgMworICAgMTI6IGUgICAgICAgIEFQUEVORFMgICAgKE1BUksgYXQgNSkKKyAgIDEzOiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDIKKz4+PiBkaXMoZiwgbWVtbz1tZW1vKQorICAgMTQ6IFx4ODAgUFJPVE8gICAgICAyCisgICAxNjogaCAgICBCSU5HRVQgICAgIDAKKyAgIDE4OiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDIKKyIiIgorCitfX3Rlc3RfXyA9IHsnZGlzYXNzZW1ibGVyX3Rlc3QnOiBfZGlzX3Rlc3QsCisgICAgICAgICAgICAnZGlzYXNzZW1ibGVyX21lbW9fdGVzdCc6IF9tZW1vX3Rlc3QsCisgICAgICAgICAgIH0KKworZGVmIF90ZXN0KCk6CisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICByZXR1cm4gZG9jdGVzdC50ZXN0bW9kKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpY2tsZXRvb2xzLnB5YyBiL2xpYi9weXRob24yLjcvcGlja2xldG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOTJjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BpY2tsZXRvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpY2tsZXRvb2xzLnB5byBiL2xpYi9weXRob24yLjcvcGlja2xldG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTQxOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BpY2tsZXRvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpcGVzLnB5IGIvbGliL3B5dGhvbjIuNy9waXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc1MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9waXBlcy5weQpAQCAtMCwwICsxLDI3OCBAQAorIiIiQ29udmVyc2lvbiBwaXBlbGluZSB0ZW1wbGF0ZXMuCisKK1RoZSBwcm9ibGVtOgorLS0tLS0tLS0tLS0tCisKK1N1cHBvc2UgeW91IGhhdmUgc29tZSBkYXRhIHRoYXQgeW91IHdhbnQgdG8gY29udmVydCB0byBhbm90aGVyIGZvcm1hdCwKK3N1Y2ggYXMgZnJvbSBHSUYgaW1hZ2UgZm9ybWF0IHRvIFBQTSBpbWFnZSBmb3JtYXQuICBNYXliZSB0aGUKK2NvbnZlcnNpb24gaW52b2x2ZXMgc2V2ZXJhbCBzdGVwcyAoZS5nLiBwaXBpbmcgaXQgdGhyb3VnaCBjb21wcmVzcyBvcgordXVlbmNvZGUpLiAgU29tZSBvZiB0aGUgY29udmVyc2lvbiBzdGVwcyBtYXkgcmVxdWlyZSB0aGF0IHRoZWlyIGlucHV0CitpcyBhIGRpc2sgZmlsZSwgb3RoZXJzIG1heSBiZSBhYmxlIHRvIHJlYWQgc3RhbmRhcmQgaW5wdXQ7IHNpbWlsYXIgZm9yCit0aGVpciBvdXRwdXQuICBUaGUgaW5wdXQgdG8gdGhlIGVudGlyZSBjb252ZXJzaW9uIG1heSBhbHNvIGJlIHJlYWQKK2Zyb20gYSBkaXNrIGZpbGUgb3IgZnJvbSBhbiBvcGVuIGZpbGUsIGFuZCBzaW1pbGFyIGZvciBpdHMgb3V0cHV0LgorCitUaGUgbW9kdWxlIGxldHMgeW91IGNvbnN0cnVjdCBhIHBpcGVsaW5lIHRlbXBsYXRlIGJ5IHN0aWNraW5nIG9uZSBvcgorbW9yZSBjb252ZXJzaW9uIHN0ZXBzIHRvZ2V0aGVyLiAgSXQgd2lsbCB0YWtlIGNhcmUgb2YgY3JlYXRpbmcgYW5kCityZW1vdmluZyB0ZW1wb3JhcnkgZmlsZXMgaWYgdGhleSBhcmUgbmVjZXNzYXJ5IHRvIGhvbGQgaW50ZXJtZWRpYXRlCitkYXRhLiAgWW91IGNhbiB0aGVuIHVzZSB0aGUgdGVtcGxhdGUgdG8gZG8gY29udmVyc2lvbnMgZnJvbSBtYW55CitkaWZmZXJlbnQgc291cmNlcyB0byBtYW55IGRpZmZlcmVudCBkZXN0aW5hdGlvbnMuICBUaGUgdGVtcG9yYXJ5CitmaWxlIG5hbWVzIHVzZWQgYXJlIGRpZmZlcmVudCBlYWNoIHRpbWUgdGhlIHRlbXBsYXRlIGlzIHVzZWQuCisKK1RoZSB0ZW1wbGF0ZXMgYXJlIG9iamVjdHMgc28geW91IGNhbiBjcmVhdGUgdGVtcGxhdGVzIGZvciBtYW55CitkaWZmZXJlbnQgY29udmVyc2lvbiBzdGVwcyBhbmQgc3RvcmUgdGhlbSBpbiBhIGRpY3Rpb25hcnksIGZvcgoraW5zdGFuY2UuCisKKworRGlyZWN0aW9uczoKKy0tLS0tLS0tLS0tCisKK1RvIGNyZWF0ZSBhIHRlbXBsYXRlOgorICAgIHQgPSBUZW1wbGF0ZSgpCisKK1RvIGFkZCBhIGNvbnZlcnNpb24gc3RlcCB0byBhIHRlbXBsYXRlOgorICAgdC5hcHBlbmQoY29tbWFuZCwga2luZCkKK3doZXJlIGtpbmQgaXMgYSBzdHJpbmcgb2YgdHdvIGNoYXJhY3RlcnM6IHRoZSBmaXJzdCBpcyAnLScgaWYgdGhlCitjb21tYW5kIHJlYWRzIGl0cyBzdGFuZGFyZCBpbnB1dCBvciAnZicgaWYgaXQgcmVxdWlyZXMgYSBmaWxlOyB0aGUKK3NlY29uZCBsaWtld2lzZSBmb3IgdGhlIG91dHB1dC4gVGhlIGNvbW1hbmQgbXVzdCBiZSB2YWxpZCAvYmluL3NoCitzeW50YXguICBJZiBpbnB1dCBvciBvdXRwdXQgZmlsZXMgYXJlIHJlcXVpcmVkLCB0aGV5IGFyZSBwYXNzZWQgYXMKKyRJTiBhbmQgJE9VVDsgb3RoZXJ3aXNlLCBpdCBtdXN0IGJlICBwb3NzaWJsZSB0byB1c2UgdGhlIGNvbW1hbmQgaW4KK2EgcGlwZWxpbmUuCisKK1RvIGFkZCBhIGNvbnZlcnNpb24gc3RlcCBhdCB0aGUgYmVnaW5uaW5nOgorICAgdC5wcmVwZW5kKGNvbW1hbmQsIGtpbmQpCisKK1RvIGNvbnZlcnQgYSBmaWxlIHRvIGFub3RoZXIgZmlsZSB1c2luZyBhIHRlbXBsYXRlOgorICBzdHMgPSB0LmNvcHkoaW5maWxlLCBvdXRmaWxlKQorSWYgaW5maWxlIG9yIG91dGZpbGUgYXJlIHRoZSBlbXB0eSBzdHJpbmcsIHN0YW5kYXJkIGlucHV0IGlzIHJlYWQgb3IKK3N0YW5kYXJkIG91dHB1dCBpcyB3cml0dGVuLCByZXNwZWN0aXZlbHkuICBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZQorZXhpdCBzdGF0dXMgb2YgdGhlIGNvbnZlcnNpb24gcGlwZWxpbmUuCisKK1RvIG9wZW4gYSBmaWxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgdGhyb3VnaCBhIGNvbnZlcnNpb24gcGlwZWxpbmU6CisgICBmcCA9IHQub3BlbihmaWxlLCBtb2RlKQord2hlcmUgbW9kZSBpcyAncicgdG8gcmVhZCB0aGUgZmlsZSwgb3IgJ3cnIHRvIHdyaXRlIGl0IC0tIGp1c3QgbGlrZQorZm9yIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBvcGVuKCkgb3IgZm9yIG9zLnBvcGVuKCkuCisKK1RvIGNyZWF0ZSBhIG5ldyB0ZW1wbGF0ZSBvYmplY3QgaW5pdGlhbGl6ZWQgdG8gYSBnaXZlbiBvbmU6CisgICB0MiA9IHQuY2xvbmUoKQorIiIiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJworCisKK2ltcG9ydCByZQoraW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBzdHJpbmcKKworX19hbGxfXyA9IFsiVGVtcGxhdGUiXQorCisjIENvbnZlcnNpb24gc3RlcCBraW5kcworCitGSUxFSU5fRklMRU9VVCA9ICdmZicgICAgICAgICAgICAgICAgICAgIyBNdXN0IHJlYWQgJiB3cml0ZSByZWFsIGZpbGVzCitTVERJTl9GSUxFT1VUICA9ICctZicgICAgICAgICAgICAgICAgICAgIyBNdXN0IHdyaXRlIGEgcmVhbCBmaWxlCitGSUxFSU5fU1RET1VUICA9ICdmLScgICAgICAgICAgICAgICAgICAgIyBNdXN0IHJlYWQgYSByZWFsIGZpbGUKK1NURElOX1NURE9VVCAgID0gJy0tJyAgICAgICAgICAgICAgICAgICAjIE5vcm1hbCBwaXBlbGluZSBlbGVtZW50CitTT1VSQ0UgICAgICAgICA9ICcuLScgICAgICAgICAgICAgICAgICAgIyBNdXN0IGJlIGZpcnN0LCB3cml0ZXMgc3Rkb3V0CitTSU5LICAgICAgICAgICA9ICctLicgICAgICAgICAgICAgICAgICAgIyBNdXN0IGJlIGxhc3QsIHJlYWRzIHN0ZGluCisKK3N0ZXBraW5kcyA9IFtGSUxFSU5fRklMRU9VVCwgU1RESU5fRklMRU9VVCwgRklMRUlOX1NURE9VVCwgU1RESU5fU1RET1VULCBcCisgICAgICAgICAgICAgU09VUkNFLCBTSU5LXQorCisKK2NsYXNzIFRlbXBsYXRlOgorICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBhIHBpcGVsaW5lIHRlbXBsYXRlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAiIiJUZW1wbGF0ZSgpIHJldHVybnMgYSBmcmVzaCBwaXBlbGluZSB0ZW1wbGF0ZS4iIiIKKyAgICAgICAgc2VsZi5kZWJ1Z2dpbmcgPSAwCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAiIiJ0Ll9fcmVwcl9fKCkgaW1wbGVtZW50cyByZXByKHQpLiIiIgorICAgICAgICByZXR1cm4gJzxUZW1wbGF0ZSBpbnN0YW5jZSwgc3RlcHM9JXI+JyAlIChzZWxmLnN0ZXBzLCkKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIidC5yZXNldCgpIHJlc3RvcmVzIGEgcGlwZWxpbmUgdGVtcGxhdGUgdG8gaXRzIGluaXRpYWwgc3RhdGUuIiIiCisgICAgICAgIHNlbGYuc3RlcHMgPSBbXQorCisgICAgZGVmIGNsb25lKHNlbGYpOgorICAgICAgICAiIiJ0LmNsb25lKCkgcmV0dXJucyBhIG5ldyBwaXBlbGluZSB0ZW1wbGF0ZSB3aXRoIGlkZW50aWNhbAorICAgICAgICBpbml0aWFsIHN0YXRlIGFzIHRoZSBjdXJyZW50IG9uZS4iIiIKKyAgICAgICAgdCA9IFRlbXBsYXRlKCkKKyAgICAgICAgdC5zdGVwcyA9IHNlbGYuc3RlcHNbOl0KKyAgICAgICAgdC5kZWJ1Z2dpbmcgPSBzZWxmLmRlYnVnZ2luZworICAgICAgICByZXR1cm4gdAorCisgICAgZGVmIGRlYnVnKHNlbGYsIGZsYWcpOgorICAgICAgICAiIiJ0LmRlYnVnKGZsYWcpIHR1cm5zIGRlYnVnZ2luZyBvbiBvciBvZmYuIiIiCisgICAgICAgIHNlbGYuZGVidWdnaW5nID0gZmxhZworCisgICAgZGVmIGFwcGVuZChzZWxmLCBjbWQsIGtpbmQpOgorICAgICAgICAiIiJ0LmFwcGVuZChjbWQsIGtpbmQpIGFkZHMgYSBuZXcgc3RlcCBhdCB0aGUgZW5kLiIiIgorICAgICAgICBpZiB0eXBlKGNtZCkgaXMgbm90IHR5cGUoJycpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAnVGVtcGxhdGUuYXBwZW5kOiBjbWQgbXVzdCBiZSBhIHN0cmluZycKKyAgICAgICAgaWYga2luZCBub3QgaW4gc3RlcGtpbmRzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLmFwcGVuZDogYmFkIGtpbmQgJXInICUgKGtpbmQsKQorICAgICAgICBpZiBraW5kID09IFNPVVJDRToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5hcHBlbmQ6IFNPVVJDRSBjYW4gb25seSBiZSBwcmVwZW5kZWQnCisgICAgICAgIGlmIHNlbGYuc3RlcHMgYW5kIHNlbGYuc3RlcHNbLTFdWzFdID09IFNJTks6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAnVGVtcGxhdGUuYXBwZW5kOiBhbHJlYWR5IGVuZHMgd2l0aCBTSU5LJworICAgICAgICBpZiBraW5kWzBdID09ICdmJyBhbmQgbm90IHJlLnNlYXJjaChyJ1wkSU5cYicsIGNtZCk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAnVGVtcGxhdGUuYXBwZW5kOiBtaXNzaW5nICRJTiBpbiBjbWQnCisgICAgICAgIGlmIGtpbmRbMV0gPT0gJ2YnIGFuZCBub3QgcmUuc2VhcmNoKHInXCRPVVRcYicsIGNtZCk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAnVGVtcGxhdGUuYXBwZW5kOiBtaXNzaW5nICRPVVQgaW4gY21kJworICAgICAgICBzZWxmLnN0ZXBzLmFwcGVuZCgoY21kLCBraW5kKSkKKworICAgIGRlZiBwcmVwZW5kKHNlbGYsIGNtZCwga2luZCk6CisgICAgICAgICIiInQucHJlcGVuZChjbWQsIGtpbmQpIGFkZHMgYSBuZXcgc3RlcCBhdCB0aGUgZnJvbnQuIiIiCisgICAgICAgIGlmIHR5cGUoY21kKSBpcyBub3QgdHlwZSgnJyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICdUZW1wbGF0ZS5wcmVwZW5kOiBjbWQgbXVzdCBiZSBhIHN0cmluZycKKyAgICAgICAgaWYga2luZCBub3QgaW4gc3RlcGtpbmRzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLnByZXBlbmQ6IGJhZCBraW5kICVyJyAlIChraW5kLCkKKyAgICAgICAgaWYga2luZCA9PSBTSU5LOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLnByZXBlbmQ6IFNJTksgY2FuIG9ubHkgYmUgYXBwZW5kZWQnCisgICAgICAgIGlmIHNlbGYuc3RlcHMgYW5kIHNlbGYuc3RlcHNbMF1bMV0gPT0gU09VUkNFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLnByZXBlbmQ6IGFscmVhZHkgYmVnaW5zIHdpdGggU09VUkNFJworICAgICAgICBpZiBraW5kWzBdID09ICdmJyBhbmQgbm90IHJlLnNlYXJjaChyJ1wkSU5cYicsIGNtZCk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAnVGVtcGxhdGUucHJlcGVuZDogbWlzc2luZyAkSU4gaW4gY21kJworICAgICAgICBpZiBraW5kWzFdID09ICdmJyBhbmQgbm90IHJlLnNlYXJjaChyJ1wkT1VUXGInLCBjbWQpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLnByZXBlbmQ6IG1pc3NpbmcgJE9VVCBpbiBjbWQnCisgICAgICAgIHNlbGYuc3RlcHMuaW5zZXJ0KDAsIChjbWQsIGtpbmQpKQorCisgICAgZGVmIG9wZW4oc2VsZiwgZmlsZSwgcncpOgorICAgICAgICAiIiJ0Lm9wZW4oZmlsZSwgcncpIHJldHVybnMgYSBwaXBlIG9yIGZpbGUgb2JqZWN0IG9wZW4gZm9yCisgICAgICAgIHJlYWRpbmcgb3Igd3JpdGluZzsgdGhlIGZpbGUgaXMgdGhlIG90aGVyIGVuZCBvZiB0aGUgcGlwZWxpbmUuIiIiCisgICAgICAgIGlmIHJ3ID09ICdyJzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW5fcihmaWxlKQorICAgICAgICBpZiBydyA9PSAndyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX3coZmlsZSkKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAnVGVtcGxhdGUub3BlbjogcncgbXVzdCBiZSBcJ3JcJyBvciBcJ3dcJywgbm90ICVyJyAlIChydywpCisKKyAgICBkZWYgb3Blbl9yKHNlbGYsIGZpbGUpOgorICAgICAgICAiIiJ0Lm9wZW5fcihmaWxlKSBhbmQgdC5vcGVuX3coZmlsZSkgaW1wbGVtZW50CisgICAgICAgIHQub3BlbihmaWxlLCAncicpIGFuZCB0Lm9wZW4oZmlsZSwgJ3cnKSByZXNwZWN0aXZlbHkuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnN0ZXBzOgorICAgICAgICAgICAgcmV0dXJuIG9wZW4oZmlsZSwgJ3InKQorICAgICAgICBpZiBzZWxmLnN0ZXBzWy0xXVsxXSA9PSBTSU5LOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLm9wZW5fcjogcGlwZWxpbmUgZW5kcyB3aWR0aCBTSU5LJworICAgICAgICBjbWQgPSBzZWxmLm1ha2VwaXBlbGluZShmaWxlLCAnJykKKyAgICAgICAgcmV0dXJuIG9zLnBvcGVuKGNtZCwgJ3InKQorCisgICAgZGVmIG9wZW5fdyhzZWxmLCBmaWxlKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RlcHM6CisgICAgICAgICAgICByZXR1cm4gb3BlbihmaWxlLCAndycpCisgICAgICAgIGlmIHNlbGYuc3RlcHNbMF1bMV0gPT0gU09VUkNFOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlLm9wZW5fdzogcGlwZWxpbmUgYmVnaW5zIHdpdGggU09VUkNFJworICAgICAgICBjbWQgPSBzZWxmLm1ha2VwaXBlbGluZSgnJywgZmlsZSkKKyAgICAgICAgcmV0dXJuIG9zLnBvcGVuKGNtZCwgJ3cnKQorCisgICAgZGVmIGNvcHkoc2VsZiwgaW5maWxlLCBvdXRmaWxlKToKKyAgICAgICAgcmV0dXJuIG9zLnN5c3RlbShzZWxmLm1ha2VwaXBlbGluZShpbmZpbGUsIG91dGZpbGUpKQorCisgICAgZGVmIG1ha2VwaXBlbGluZShzZWxmLCBpbmZpbGUsIG91dGZpbGUpOgorICAgICAgICBjbWQgPSBtYWtlcGlwZWxpbmUoaW5maWxlLCBzZWxmLnN0ZXBzLCBvdXRmaWxlKQorICAgICAgICBpZiBzZWxmLmRlYnVnZ2luZzoKKyAgICAgICAgICAgIHByaW50IGNtZAorICAgICAgICAgICAgY21kID0gJ3NldCAteDsgJyArIGNtZAorICAgICAgICByZXR1cm4gY21kCisKKworZGVmIG1ha2VwaXBlbGluZShpbmZpbGUsIHN0ZXBzLCBvdXRmaWxlKToKKyAgICAjIEJ1aWxkIGEgbGlzdCB3aXRoIGZvciBlYWNoIGNvbW1hbmQ6CisgICAgIyBbaW5wdXQgZmlsZW5hbWUgb3IgJycsIGNvbW1hbmQgc3RyaW5nLCBraW5kLCBvdXRwdXQgZmlsZW5hbWUgb3IgJyddCisKKyAgICBsaXN0ID0gW10KKyAgICBmb3IgY21kLCBraW5kIGluIHN0ZXBzOgorICAgICAgICBsaXN0LmFwcGVuZChbJycsIGNtZCwga2luZCwgJyddKQorICAgICMKKyAgICAjIE1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgc3RlcAorICAgICMKKyAgICBpZiBub3QgbGlzdDoKKyAgICAgICAgbGlzdC5hcHBlbmQoWycnLCAnY2F0JywgJy0tJywgJyddKQorICAgICMKKyAgICAjIFRha2UgY2FyZSBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBlbmRzCisgICAgIworICAgIFtjbWQsIGtpbmRdID0gbGlzdFswXVsxOjNdCisgICAgaWYga2luZFswXSA9PSAnZicgYW5kIG5vdCBpbmZpbGU6CisgICAgICAgIGxpc3QuaW5zZXJ0KDAsIFsnJywgJ2NhdCcsICctLScsICcnXSkKKyAgICBsaXN0WzBdWzBdID0gaW5maWxlCisgICAgIworICAgIFtjbWQsIGtpbmRdID0gbGlzdFstMV1bMTozXQorICAgIGlmIGtpbmRbMV0gPT0gJ2YnIGFuZCBub3Qgb3V0ZmlsZToKKyAgICAgICAgbGlzdC5hcHBlbmQoWycnLCAnY2F0JywgJy0tJywgJyddKQorICAgIGxpc3RbLTFdWy0xXSA9IG91dGZpbGUKKyAgICAjCisgICAgIyBJbnZlbnQgdGVtcG9yYXJ5IGZpbGVzIHRvIGNvbm5lY3Qgc3RhZ2VzIHRoYXQgbmVlZCBmaWxlcworICAgICMKKyAgICBnYXJiYWdlID0gW10KKyAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obGlzdCkpOgorICAgICAgICBsa2luZCA9IGxpc3RbaS0xXVsyXQorICAgICAgICBya2luZCA9IGxpc3RbaV1bMl0KKyAgICAgICAgaWYgbGtpbmRbMV0gPT0gJ2YnIG9yIHJraW5kWzBdID09ICdmJzoKKyAgICAgICAgICAgIChmZCwgdGVtcCkgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgZ2FyYmFnZS5hcHBlbmQodGVtcCkKKyAgICAgICAgICAgIGxpc3RbaS0xXVstMV0gPSBsaXN0W2ldWzBdID0gdGVtcAorICAgICMKKyAgICBmb3IgaXRlbSBpbiBsaXN0OgorICAgICAgICBbaW5mLCBjbWQsIGtpbmQsIG91dGZdID0gaXRlbQorICAgICAgICBpZiBraW5kWzFdID09ICdmJzoKKyAgICAgICAgICAgIGNtZCA9ICdPVVQ9JyArIHF1b3RlKG91dGYpICsgJzsgJyArIGNtZAorICAgICAgICBpZiBraW5kWzBdID09ICdmJzoKKyAgICAgICAgICAgIGNtZCA9ICdJTj0nICsgcXVvdGUoaW5mKSArICc7ICcgKyBjbWQKKyAgICAgICAgaWYga2luZFswXSA9PSAnLScgYW5kIGluZjoKKyAgICAgICAgICAgIGNtZCA9IGNtZCArICcgPCcgKyBxdW90ZShpbmYpCisgICAgICAgIGlmIGtpbmRbMV0gPT0gJy0nIGFuZCBvdXRmOgorICAgICAgICAgICAgY21kID0gY21kICsgJyA+JyArIHF1b3RlKG91dGYpCisgICAgICAgIGl0ZW1bMV0gPSBjbWQKKyAgICAjCisgICAgY21kbGlzdCA9IGxpc3RbMF1bMV0KKyAgICBmb3IgaXRlbSBpbiBsaXN0WzE6XToKKyAgICAgICAgW2NtZCwga2luZF0gPSBpdGVtWzE6M10KKyAgICAgICAgaWYgaXRlbVswXSA9PSAnJzoKKyAgICAgICAgICAgIGlmICdmJyBpbiBraW5kOgorICAgICAgICAgICAgICAgIGNtZCA9ICd7ICcgKyBjbWQgKyAnOyB9JworICAgICAgICAgICAgY21kbGlzdCA9IGNtZGxpc3QgKyAnIHxcbicgKyBjbWQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNtZGxpc3QgPSBjbWRsaXN0ICsgJ1xuJyArIGNtZAorICAgICMKKyAgICBpZiBnYXJiYWdlOgorICAgICAgICBybWNtZCA9ICdybSAtZicKKyAgICAgICAgZm9yIGZpbGUgaW4gZ2FyYmFnZToKKyAgICAgICAgICAgIHJtY21kID0gcm1jbWQgKyAnICcgKyBxdW90ZShmaWxlKQorICAgICAgICB0cmFwY21kID0gJ3RyYXAgJyArIHF1b3RlKHJtY21kICsgJzsgZXhpdCcpICsgJyAxIDIgMyAxMyAxNCAxNScKKyAgICAgICAgY21kbGlzdCA9IHRyYXBjbWQgKyAnXG4nICsgY21kbGlzdCArICdcbicgKyBybWNtZAorICAgICMKKyAgICByZXR1cm4gY21kbGlzdAorCisKKyMgUmVsaWFibHkgcXVvdGUgYSBzdHJpbmcgYXMgYSBzaW5nbGUgYXJndW1lbnQgZm9yIC9iaW4vc2gKKworIyBTYWZlIHVucXVvdGVkCitfc2FmZWNoYXJzID0gZnJvemVuc2V0KHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICdAJV8tKz06LC4vJykKKworZGVmIHF1b3RlKGZpbGUpOgorICAgICIiIlJldHVybiBhIHNoZWxsLWVzY2FwZWQgdmVyc2lvbiBvZiB0aGUgZmlsZSBzdHJpbmcuIiIiCisgICAgZm9yIGMgaW4gZmlsZToKKyAgICAgICAgaWYgYyBub3QgaW4gX3NhZmVjaGFyczoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgaWYgbm90IGZpbGU6CisgICAgICAgICAgICByZXR1cm4gIicnIgorICAgICAgICByZXR1cm4gZmlsZQorICAgICMgdXNlIHNpbmdsZSBxdW90ZXMsIGFuZCBwdXQgc2luZ2xlIHF1b3RlcyBpbnRvIGRvdWJsZSBxdW90ZXMKKyAgICAjIHRoZSBzdHJpbmcgJCdiIGlzIHRoZW4gcXVvdGVkIGFzICckJyInIidiJworICAgIHJldHVybiAiJyIgKyBmaWxlLnJlcGxhY2UoIiciLCAiJ1wiJ1wiJyIpICsgIiciCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpcGVzLnB5YyBiL2xpYi9weXRob24yLjcvcGlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTczOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BpcGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BpcGVzLnB5byBiL2xpYi9weXRob24yLjcvcGlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTczOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BpcGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BrZ3V0aWwucHkgYi9saWIvcHl0aG9uMi43L3BrZ3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwNzJlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGtndXRpbC5weQpAQCAtMCwwICsxLDU5MSBAQAorIiIiVXRpbGl0aWVzIHRvIHN1cHBvcnQgcGFja2FnZXMuIiIiCisKKyMgTk9URTogVGhpcyBtb2R1bGUgbXVzdCByZW1haW4gY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIGFzIGl0IGlzIHNoYXJlZAorIyBieSBzZXR1cHRvb2xzIGZvciBkaXN0cmlidXRpb24gd2l0aCBQeXRob24gMi4zIGFuZCB1cC4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgaW1wCitpbXBvcnQgb3MucGF0aAorZnJvbSB0eXBlcyBpbXBvcnQgTW9kdWxlVHlwZQorCitfX2FsbF9fID0gWworICAgICdnZXRfaW1wb3J0ZXInLCAnaXRlcl9pbXBvcnRlcnMnLCAnZ2V0X2xvYWRlcicsICdmaW5kX2xvYWRlcicsCisgICAgJ3dhbGtfcGFja2FnZXMnLCAnaXRlcl9tb2R1bGVzJywgJ2dldF9kYXRhJywKKyAgICAnSW1wSW1wb3J0ZXInLCAnSW1wTG9hZGVyJywgJ3JlYWRfY29kZScsICdleHRlbmRfcGF0aCcsCitdCisKK2RlZiByZWFkX2NvZGUoc3RyZWFtKToKKyAgICAjIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIFBFUCAzMDIgZW11bGF0aW9uIHRvCisgICAgIyBjb3JyZWN0bHkgaGFuZGxlIGNvbXBpbGVkIGZpbGVzCisgICAgaW1wb3J0IG1hcnNoYWwKKworICAgIG1hZ2ljID0gc3RyZWFtLnJlYWQoNCkKKyAgICBpZiBtYWdpYyAhPSBpbXAuZ2V0X21hZ2ljKCk6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBzdHJlYW0ucmVhZCg0KSAjIFNraXAgdGltZXN0YW1wCisgICAgcmV0dXJuIG1hcnNoYWwubG9hZChzdHJlYW0pCisKKworZGVmIHNpbXBsZWdlbmVyaWMoZnVuYyk6CisgICAgIiIiTWFrZSBhIHRyaXZpYWwgc2luZ2xlLWRpc3BhdGNoIGdlbmVyaWMgZnVuY3Rpb24iIiIKKyAgICByZWdpc3RyeSA9IHt9CisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3cpOgorICAgICAgICBvYiA9IGFyZ3NbMF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xzID0gb2IuX19jbGFzc19fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGNscyA9IHR5cGUob2IpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1ybyA9IGNscy5fX21yb19fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbGFzcyBjbHMoY2xzLCBvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgbXJvID0gY2xzLl9fbXJvX19bMTpdCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIG1ybyA9IG9iamVjdCwgICAjIG11c3QgYmUgYW4gRXh0ZW5zaW9uQ2xhc3Mgb3Igc29tZSBzdWNoICA6KAorICAgICAgICBmb3IgdCBpbiBtcm86CisgICAgICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XSgqYXJncywgKiprdykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3KQorICAgIHRyeToKKyAgICAgICAgd3JhcHBlci5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18KKyAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBwYXNzICAgICMgUHl0aG9uIDIuMyBkb2Vzbid0IGFsbG93IGZ1bmN0aW9ucyB0byBiZSByZW5hbWVkCisKKyAgICBkZWYgcmVnaXN0ZXIodHlwLCBmdW5jPU5vbmUpOgorICAgICAgICBpZiBmdW5jIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIGY6IHJlZ2lzdGVyKHR5cCwgZikKKyAgICAgICAgcmVnaXN0cnlbdHlwXSA9IGZ1bmMKKyAgICAgICAgcmV0dXJuIGZ1bmMKKworICAgIHdyYXBwZXIuX19kaWN0X18gPSBmdW5jLl9fZGljdF9fCisgICAgd3JhcHBlci5fX2RvY19fID0gZnVuYy5fX2RvY19fCisgICAgd3JhcHBlci5yZWdpc3RlciA9IHJlZ2lzdGVyCisgICAgcmV0dXJuIHdyYXBwZXIKKworCitkZWYgd2Fsa19wYWNrYWdlcyhwYXRoPU5vbmUsIHByZWZpeD0nJywgb25lcnJvcj1Ob25lKToKKyAgICAiIiJZaWVsZHMgKG1vZHVsZV9sb2FkZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIG1vZHVsZXMgcmVjdXJzaXZlbHkKKyAgICBvbiBwYXRoLCBvciwgaWYgcGF0aCBpcyBOb25lLCBhbGwgYWNjZXNzaWJsZSBtb2R1bGVzLgorCisgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKKyAgICBtb2R1bGVzIGluLgorCisgICAgJ3ByZWZpeCcgaXMgYSBzdHJpbmcgdG8gb3V0cHV0IG9uIHRoZSBmcm9udCBvZiBldmVyeSBtb2R1bGUgbmFtZQorICAgIG9uIG91dHB1dC4KKworICAgIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QgaW1wb3J0IGFsbCAqcGFja2FnZXMqIChOT1QgYWxsCisgICAgbW9kdWxlcyEpIG9uIHRoZSBnaXZlbiBwYXRoLCBpbiBvcmRlciB0byBhY2Nlc3MgdGhlIF9fcGF0aF9fCisgICAgYXR0cmlidXRlIHRvIGZpbmQgc3VibW9kdWxlcy4KKworICAgICdvbmVycm9yJyBpcyBhIGZ1bmN0aW9uIHdoaWNoIGdldHMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50ICh0aGUKKyAgICBuYW1lIG9mIHRoZSBwYWNrYWdlIHdoaWNoIHdhcyBiZWluZyBpbXBvcnRlZCkgaWYgYW55IGV4Y2VwdGlvbgorICAgIG9jY3VycyB3aGlsZSB0cnlpbmcgdG8gaW1wb3J0IGEgcGFja2FnZS4gIElmIG5vIG9uZXJyb3IgZnVuY3Rpb24gaXMKKyAgICBzdXBwbGllZCwgSW1wb3J0RXJyb3JzIGFyZSBjYXVnaHQgYW5kIGlnbm9yZWQsIHdoaWxlIGFsbCBvdGhlcgorICAgIGV4Y2VwdGlvbnMgYXJlIHByb3BhZ2F0ZWQsIHRlcm1pbmF0aW5nIHRoZSBzZWFyY2guCisKKyAgICBFeGFtcGxlczoKKworICAgICMgbGlzdCBhbGwgbW9kdWxlcyBweXRob24gY2FuIGFjY2VzcworICAgIHdhbGtfcGFja2FnZXMoKQorCisgICAgIyBsaXN0IGFsbCBzdWJtb2R1bGVzIG9mIGN0eXBlcworICAgIHdhbGtfcGFja2FnZXMoY3R5cGVzLl9fcGF0aF9fLCBjdHlwZXMuX19uYW1lX18rJy4nKQorICAgICIiIgorCisgICAgZGVmIHNlZW4ocCwgbT17fSk6CisgICAgICAgIGlmIHAgaW4gbToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIG1bcF0gPSBUcnVlCisKKyAgICBmb3IgaW1wb3J0ZXIsIG5hbWUsIGlzcGtnIGluIGl0ZXJfbW9kdWxlcyhwYXRoLCBwcmVmaXgpOgorICAgICAgICB5aWVsZCBpbXBvcnRlciwgbmFtZSwgaXNwa2cKKworICAgICAgICBpZiBpc3BrZzoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgb25lcnJvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvbmVycm9yKG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGF0aCA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbmFtZV0sICdfX3BhdGhfXycsIE5vbmUpIG9yIFtdCisKKyAgICAgICAgICAgICAgICAjIGRvbid0IHRyYXZlcnNlIHBhdGggaXRlbXMgd2UndmUgc2VlbiBiZWZvcmUKKyAgICAgICAgICAgICAgICBwYXRoID0gW3AgZm9yIHAgaW4gcGF0aCBpZiBub3Qgc2VlbihwKV0KKworICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHdhbGtfcGFja2FnZXMocGF0aCwgbmFtZSsnLicsIG9uZXJyb3IpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCisKKworZGVmIGl0ZXJfbW9kdWxlcyhwYXRoPU5vbmUsIHByZWZpeD0nJyk6CisgICAgIiIiWWllbGRzIChtb2R1bGVfbG9hZGVyLCBuYW1lLCBpc3BrZykgZm9yIGFsbCBzdWJtb2R1bGVzIG9uIHBhdGgsCisgICAgb3IsIGlmIHBhdGggaXMgTm9uZSwgYWxsIHRvcC1sZXZlbCBtb2R1bGVzIG9uIHN5cy5wYXRoLgorCisgICAgJ3BhdGgnIHNob3VsZCBiZSBlaXRoZXIgTm9uZSBvciBhIGxpc3Qgb2YgcGF0aHMgdG8gbG9vayBmb3IKKyAgICBtb2R1bGVzIGluLgorCisgICAgJ3ByZWZpeCcgaXMgYSBzdHJpbmcgdG8gb3V0cHV0IG9uIHRoZSBmcm9udCBvZiBldmVyeSBtb2R1bGUgbmFtZQorICAgIG9uIG91dHB1dC4KKyAgICAiIiIKKworICAgIGlmIHBhdGggaXMgTm9uZToKKyAgICAgICAgaW1wb3J0ZXJzID0gaXRlcl9pbXBvcnRlcnMoKQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydGVycyA9IG1hcChnZXRfaW1wb3J0ZXIsIHBhdGgpCisKKyAgICB5aWVsZGVkID0ge30KKyAgICBmb3IgaSBpbiBpbXBvcnRlcnM6CisgICAgICAgIGZvciBuYW1lLCBpc3BrZyBpbiBpdGVyX2ltcG9ydGVyX21vZHVsZXMoaSwgcHJlZml4KToKKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHlpZWxkZWQ6CisgICAgICAgICAgICAgICAgeWllbGRlZFtuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBpLCBuYW1lLCBpc3BrZworCisKKyNAc2ltcGxlZ2VuZXJpYworZGVmIGl0ZXJfaW1wb3J0ZXJfbW9kdWxlcyhpbXBvcnRlciwgcHJlZml4PScnKToKKyAgICBpZiBub3QgaGFzYXR0cihpbXBvcnRlciwgJ2l0ZXJfbW9kdWxlcycpOgorICAgICAgICByZXR1cm4gW10KKyAgICByZXR1cm4gaW1wb3J0ZXIuaXRlcl9tb2R1bGVzKHByZWZpeCkKKworaXRlcl9pbXBvcnRlcl9tb2R1bGVzID0gc2ltcGxlZ2VuZXJpYyhpdGVyX2ltcG9ydGVyX21vZHVsZXMpCisKKworY2xhc3MgSW1wSW1wb3J0ZXI6CisgICAgIiIiUEVQIDMwMiBJbXBvcnRlciB0aGF0IHdyYXBzIFB5dGhvbidzICJjbGFzc2ljIiBpbXBvcnQgYWxnb3JpdGhtCisKKyAgICBJbXBJbXBvcnRlcihkaXJuYW1lKSBwcm9kdWNlcyBhIFBFUCAzMDIgaW1wb3J0ZXIgdGhhdCBzZWFyY2hlcyB0aGF0CisgICAgZGlyZWN0b3J5LiAgSW1wSW1wb3J0ZXIoTm9uZSkgcHJvZHVjZXMgYSBQRVAgMzAyIGltcG9ydGVyIHRoYXQgc2VhcmNoZXMKKyAgICB0aGUgY3VycmVudCBzeXMucGF0aCwgcGx1cyBhbnkgbW9kdWxlcyB0aGF0IGFyZSBmcm96ZW4gb3IgYnVpbHQtaW4uCisKKyAgICBOb3RlIHRoYXQgSW1wSW1wb3J0ZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgYmVpbmcgdXNlZCBieSBwbGFjZW1lbnQKKyAgICBvbiBzeXMubWV0YV9wYXRoLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSk6CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKworICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKKyAgICAgICAgIyBOb3RlOiB3ZSBpZ25vcmUgJ3BhdGgnIGFyZ3VtZW50IHNpbmNlIGl0IGlzIG9ubHkgdXNlZCB2aWEgbWV0YV9wYXRoCisgICAgICAgIHN1Ym5hbWUgPSBmdWxsbmFtZS5zcGxpdCgiLiIpWy0xXQorICAgICAgICBpZiBzdWJuYW1lICE9IGZ1bGxuYW1lIGFuZCBzZWxmLnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgorICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBbb3MucGF0aC5yZWFscGF0aChzZWxmLnBhdGgpXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlLCBmaWxlbmFtZSwgZXRjID0gaW1wLmZpbmRfbW9kdWxlKHN1Ym5hbWUsIHBhdGgpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBJbXBMb2FkZXIoZnVsbG5hbWUsIGZpbGUsIGZpbGVuYW1lLCBldGMpCisKKyAgICBkZWYgaXRlcl9tb2R1bGVzKHNlbGYsIHByZWZpeD0nJyk6CisgICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNlbGYucGF0aCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB5aWVsZGVkID0ge30KKyAgICAgICAgaW1wb3J0IGluc3BlY3QKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW5hbWVzID0gb3MubGlzdGRpcihzZWxmLnBhdGgpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgIyBpZ25vcmUgdW5yZWFkYWJsZSBkaXJlY3RvcmllcyBsaWtlIGltcG9ydCBkb2VzCisgICAgICAgICAgICBmaWxlbmFtZXMgPSBbXQorICAgICAgICBmaWxlbmFtZXMuc29ydCgpICAjIGhhbmRsZSBwYWNrYWdlcyBiZWZvcmUgc2FtZS1uYW1lZCBtb2R1bGVzCisKKyAgICAgICAgZm9yIGZuIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIG1vZG5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZm4pCisgICAgICAgICAgICBpZiBtb2RuYW1lPT0nX19pbml0X18nIG9yIG1vZG5hbWUgaW4geWllbGRlZDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYucGF0aCwgZm4pCisgICAgICAgICAgICBpc3BrZyA9IEZhbHNlCisKKyAgICAgICAgICAgIGlmIG5vdCBtb2RuYW1lIGFuZCBvcy5wYXRoLmlzZGlyKHBhdGgpIGFuZCAnLicgbm90IGluIGZuOgorICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBmbgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGlyY29udGVudHMgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgaWdub3JlIHVucmVhZGFibGUgZGlyZWN0b3JpZXMgbGlrZSBpbXBvcnQgZG9lcworICAgICAgICAgICAgICAgICAgICBkaXJjb250ZW50cyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGZuIGluIGRpcmNvbnRlbnRzOgorICAgICAgICAgICAgICAgICAgICBzdWJuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKGZuKQorICAgICAgICAgICAgICAgICAgICBpZiBzdWJuYW1lPT0nX19pbml0X18nOgorICAgICAgICAgICAgICAgICAgICAgICAgaXNwa2cgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgbm90IGEgcGFja2FnZQorCisgICAgICAgICAgICBpZiBtb2RuYW1lIGFuZCAnLicgbm90IGluIG1vZG5hbWU6CisgICAgICAgICAgICAgICAgeWllbGRlZFttb2RuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBwcmVmaXggKyBtb2RuYW1lLCBpc3BrZworCisKK2NsYXNzIEltcExvYWRlcjoKKyAgICAiIiJQRVAgMzAyIExvYWRlciB0aGF0IHdyYXBzIFB5dGhvbidzICJjbGFzc2ljIiBpbXBvcnQgYWxnb3JpdGhtCisgICAgIiIiCisgICAgY29kZSA9IHNvdXJjZSA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdWxsbmFtZSwgZmlsZSwgZmlsZW5hbWUsIGV0Yyk6CisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuZnVsbG5hbWUgPSBmdWxsbmFtZQorICAgICAgICBzZWxmLmV0YyA9IGV0YworCisgICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgc2VsZi5fcmVvcGVuKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kID0gaW1wLmxvYWRfbW9kdWxlKGZ1bGxuYW1lLCBzZWxmLmZpbGUsIHNlbGYuZmlsZW5hbWUsIHNlbGYuZXRjKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgc2VsZi5maWxlOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgICMgTm90ZTogd2UgZG9uJ3Qgc2V0IF9fbG9hZGVyX18gYmVjYXVzZSB3ZSB3YW50IHRoZSBtb2R1bGUgdG8gbG9vaworICAgICAgICAjIG5vcm1hbDsgaS5lLiB0aGlzIGlzIGp1c3QgYSB3cmFwcGVyIGZvciBzdGFuZGFyZCBpbXBvcnQgbWFjaGluZXJ5CisgICAgICAgIHJldHVybiBtb2QKKworICAgIGRlZiBnZXRfZGF0YShzZWxmLCBwYXRobmFtZSk6CisgICAgICAgIHJldHVybiBvcGVuKHBhdGhuYW1lLCAicmIiKS5yZWFkKCkKKworICAgIGRlZiBfcmVvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZpbGUgYW5kIHNlbGYuZmlsZS5jbG9zZWQ6CisgICAgICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCisgICAgICAgICAgICBpZiBtb2RfdHlwZT09aW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBvcGVuKHNlbGYuZmlsZW5hbWUsICdyVScpCisgICAgICAgICAgICBlbGlmIG1vZF90eXBlIGluIChpbXAuUFlfQ09NUElMRUQsIGltcC5DX0VYVEVOU0lPTik6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlID0gb3BlbihzZWxmLmZpbGVuYW1lLCAncmInKQorCisgICAgZGVmIF9maXhfbmFtZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIGlmIGZ1bGxuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBmdWxsbmFtZSA9IHNlbGYuZnVsbG5hbWUKKyAgICAgICAgZWxpZiBmdWxsbmFtZSAhPSBzZWxmLmZ1bGxuYW1lOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkxvYWRlciBmb3IgbW9kdWxlICVzIGNhbm5vdCBoYW5kbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZHVsZSAlcyIgJSAoc2VsZi5mdWxsbmFtZSwgZnVsbG5hbWUpKQorICAgICAgICByZXR1cm4gZnVsbG5hbWUKKworICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIGZ1bGxuYW1lKToKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLl9maXhfbmFtZShmdWxsbmFtZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZXRjWzJdPT1pbXAuUEtHX0RJUkVDVE9SWQorCisgICAgZGVmIGdldF9jb2RlKHNlbGYsIGZ1bGxuYW1lPU5vbmUpOgorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKGZ1bGxuYW1lKQorICAgICAgICBpZiBzZWxmLmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZF90eXBlID0gc2VsZi5ldGNbMl0KKyAgICAgICAgICAgIGlmIG1vZF90eXBlPT1pbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgICAgIHNvdXJjZSA9IHNlbGYuZ2V0X3NvdXJjZShmdWxsbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvZGUgPSBjb21waWxlKHNvdXJjZSwgc2VsZi5maWxlbmFtZSwgJ2V4ZWMnKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZT09aW1wLlBZX0NPTVBJTEVEOgorICAgICAgICAgICAgICAgIHNlbGYuX3Jlb3BlbigpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvZGUgPSByZWFkX2NvZGUoc2VsZi5maWxlKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBlbGlmIG1vZF90eXBlPT1pbXAuUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgICAgICBzZWxmLmNvZGUgPSBzZWxmLl9nZXRfZGVsZWdhdGUoKS5nZXRfY29kZSgpCisgICAgICAgIHJldHVybiBzZWxmLmNvZGUKKworICAgIGRlZiBnZXRfc291cmNlKHNlbGYsIGZ1bGxuYW1lPU5vbmUpOgorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKGZ1bGxuYW1lKQorICAgICAgICBpZiBzZWxmLnNvdXJjZSBpcyBOb25lOgorICAgICAgICAgICAgbW9kX3R5cGUgPSBzZWxmLmV0Y1syXQorICAgICAgICAgICAgaWYgbW9kX3R5cGU9PWltcC5QWV9TT1VSQ0U6CisgICAgICAgICAgICAgICAgc2VsZi5fcmVvcGVuKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc291cmNlID0gc2VsZi5maWxlLnJlYWQoKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBlbGlmIG1vZF90eXBlPT1pbXAuUFlfQ09NUElMRUQ6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5maWxlbmFtZVs6LTFdKToKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5maWxlbmFtZVs6LTFdLCAnclUnKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZSA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZT09aW1wLlBLR19ESVJFQ1RPUlk6CisgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBzZWxmLl9nZXRfZGVsZWdhdGUoKS5nZXRfc291cmNlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc291cmNlCisKKworICAgIGRlZiBfZ2V0X2RlbGVnYXRlKHNlbGYpOgorICAgICAgICByZXR1cm4gSW1wSW1wb3J0ZXIoc2VsZi5maWxlbmFtZSkuZmluZF9tb2R1bGUoJ19faW5pdF9fJykKKworICAgIGRlZiBnZXRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWU9Tm9uZSk6CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5fZml4X25hbWUoZnVsbG5hbWUpCisgICAgICAgIG1vZF90eXBlID0gc2VsZi5ldGNbMl0KKyAgICAgICAgaWYgc2VsZi5ldGNbMl09PWltcC5QS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9kZWxlZ2F0ZSgpLmdldF9maWxlbmFtZSgpCisgICAgICAgIGVsaWYgc2VsZi5ldGNbMl0gaW4gKGltcC5QWV9TT1VSQ0UsIGltcC5QWV9DT01QSUxFRCwgaW1wLkNfRVhURU5TSU9OKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lCisgICAgICAgIHJldHVybiBOb25lCisKKwordHJ5OgorICAgIGltcG9ydCB6aXBpbXBvcnQKKyAgICBmcm9tIHppcGltcG9ydCBpbXBvcnQgemlwaW1wb3J0ZXIKKworICAgIGRlZiBpdGVyX3ppcGltcG9ydF9tb2R1bGVzKGltcG9ydGVyLCBwcmVmaXg9JycpOgorICAgICAgICBkaXJsaXN0ID0gemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlW2ltcG9ydGVyLmFyY2hpdmVdLmtleXMoKQorICAgICAgICBkaXJsaXN0LnNvcnQoKQorICAgICAgICBfcHJlZml4ID0gaW1wb3J0ZXIucHJlZml4CisgICAgICAgIHBsZW4gPSBsZW4oX3ByZWZpeCkKKyAgICAgICAgeWllbGRlZCA9IHt9CisgICAgICAgIGltcG9ydCBpbnNwZWN0CisgICAgICAgIGZvciBmbiBpbiBkaXJsaXN0OgorICAgICAgICAgICAgaWYgbm90IGZuLnN0YXJ0c3dpdGgoX3ByZWZpeCk6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgZm4gPSBmbltwbGVuOl0uc3BsaXQob3Muc2VwKQorCisgICAgICAgICAgICBpZiBsZW4oZm4pPT0yIGFuZCBmblsxXS5zdGFydHN3aXRoKCdfX2luaXRfXy5weScpOgorICAgICAgICAgICAgICAgIGlmIGZuWzBdIG5vdCBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgICAgICB5aWVsZGVkW2ZuWzBdXSA9IDEKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgZm5bMF0sIFRydWUKKworICAgICAgICAgICAgaWYgbGVuKGZuKSE9MToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKGZuWzBdKQorICAgICAgICAgICAgaWYgbW9kbmFtZT09J19faW5pdF9fJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBtb2RuYW1lIGFuZCAnLicgbm90IGluIG1vZG5hbWUgYW5kIG1vZG5hbWUgbm90IGluIHlpZWxkZWQ6CisgICAgICAgICAgICAgICAgeWllbGRlZFttb2RuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICB5aWVsZCBwcmVmaXggKyBtb2RuYW1lLCBGYWxzZQorCisgICAgaXRlcl9pbXBvcnRlcl9tb2R1bGVzLnJlZ2lzdGVyKHppcGltcG9ydGVyLCBpdGVyX3ppcGltcG9ydF9tb2R1bGVzKQorCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworCisKK2RlZiBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKToKKyAgICAiIiJSZXRyaWV2ZSBhIFBFUCAzMDIgaW1wb3J0ZXIgZm9yIHRoZSBnaXZlbiBwYXRoIGl0ZW0KKworICAgIFRoZSByZXR1cm5lZCBpbXBvcnRlciBpcyBjYWNoZWQgaW4gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUKKyAgICBpZiBpdCB3YXMgbmV3bHkgY3JlYXRlZCBieSBhIHBhdGggaG9vay4KKworICAgIElmIHRoZXJlIGlzIG5vIGltcG9ydGVyLCBhIHdyYXBwZXIgYXJvdW5kIHRoZSBiYXNpYyBpbXBvcnQKKyAgICBtYWNoaW5lcnkgaXMgcmV0dXJuZWQuIFRoaXMgd3JhcHBlciBpcyBuZXZlciBpbnNlcnRlZCBpbnRvCisgICAgdGhlIGltcG9ydGVyIGNhY2hlIChOb25lIGlzIGluc2VydGVkIGluc3RlYWQpLgorCisgICAgVGhlIGNhY2hlIChvciBwYXJ0IG9mIGl0KSBjYW4gYmUgY2xlYXJlZCBtYW51YWxseSBpZiBhCisgICAgcmVzY2FuIG9mIHN5cy5wYXRoX2hvb2tzIGlzIG5lY2Vzc2FyeS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydGVyID0gc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVbcGF0aF9pdGVtXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgZm9yIHBhdGhfaG9vayBpbiBzeXMucGF0aF9ob29rczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnRlciA9IHBhdGhfaG9vayhwYXRoX2l0ZW0pCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbXBvcnRlciA9IE5vbmUKKyAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuc2V0ZGVmYXVsdChwYXRoX2l0ZW0sIGltcG9ydGVyKQorCisgICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0ZXIgPSBJbXBJbXBvcnRlcihwYXRoX2l0ZW0pCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGltcG9ydGVyID0gTm9uZQorICAgIHJldHVybiBpbXBvcnRlcgorCisKK2RlZiBpdGVyX2ltcG9ydGVycyhmdWxsbmFtZT0iIik6CisgICAgIiIiWWllbGQgUEVQIDMwMiBpbXBvcnRlcnMgZm9yIHRoZSBnaXZlbiBtb2R1bGUgbmFtZQorCisgICAgSWYgZnVsbG5hbWUgY29udGFpbnMgYSAnLicsIHRoZSBpbXBvcnRlcnMgd2lsbCBiZSBmb3IgdGhlIHBhY2thZ2UKKyAgICBjb250YWluaW5nIGZ1bGxuYW1lLCBvdGhlcndpc2UgdGhleSB3aWxsIGJlIGltcG9ydGVycyBmb3Igc3lzLm1ldGFfcGF0aCwKKyAgICBzeXMucGF0aCwgYW5kIFB5dGhvbidzICJjbGFzc2ljIiBpbXBvcnQgbWFjaGluZXJ5LCBpbiB0aGF0IG9yZGVyLiAgSWYKKyAgICB0aGUgbmFtZWQgbW9kdWxlIGlzIGluIGEgcGFja2FnZSwgdGhhdCBwYWNrYWdlIGlzIGltcG9ydGVkIGFzIGEgc2lkZQorICAgIGVmZmVjdCBvZiBpbnZva2luZyB0aGlzIGZ1bmN0aW9uLgorCisgICAgTm9uIFBFUCAzMDIgbWVjaGFuaXNtcyAoZS5nLiB0aGUgV2luZG93cyByZWdpc3RyeSkgdXNlZCBieSB0aGUKKyAgICBzdGFuZGFyZCBpbXBvcnQgbWFjaGluZXJ5IHRvIGZpbmQgZmlsZXMgaW4gYWx0ZXJuYXRpdmUgbG9jYXRpb25zCisgICAgYXJlIHBhcnRpYWxseSBzdXBwb3J0ZWQsIGJ1dCBhcmUgc2VhcmNoZWQgQUZURVIgc3lzLnBhdGguIE5vcm1hbGx5LAorICAgIHRoZXNlIGxvY2F0aW9ucyBhcmUgc2VhcmNoZWQgQkVGT1JFIHN5cy5wYXRoLCBwcmV2ZW50aW5nIHN5cy5wYXRoCisgICAgZW50cmllcyBmcm9tIHNoYWRvd2luZyB0aGVtLgorCisgICAgRm9yIHRoaXMgdG8gY2F1c2UgYSB2aXNpYmxlIGRpZmZlcmVuY2UgaW4gYmVoYXZpb3VyLCB0aGVyZSBtdXN0CisgICAgYmUgYSBtb2R1bGUgb3IgcGFja2FnZSBuYW1lIHRoYXQgaXMgYWNjZXNzaWJsZSB2aWEgYm90aCBzeXMucGF0aAorICAgIGFuZCBvbmUgb2YgdGhlIG5vbiBQRVAgMzAyIGZpbGUgc3lzdGVtIG1lY2hhbmlzbXMuIEluIHRoaXMgY2FzZSwKKyAgICB0aGUgZW11bGF0aW9uIHdpbGwgZmluZCB0aGUgZm9ybWVyIHZlcnNpb24sIHdoaWxlIHRoZSBidWlsdGluCisgICAgaW1wb3J0IG1lY2hhbmlzbSB3aWxsIGZpbmQgdGhlIGxhdHRlci4KKworICAgIEl0ZW1zIG9mIHRoZSBmb2xsb3dpbmcgdHlwZXMgY2FuIGJlIGFmZmVjdGVkIGJ5IHRoaXMgZGlzY3JlcGFuY3k6CisgICAgICAgIGltcC5DX0VYVEVOU0lPTiwgaW1wLlBZX1NPVVJDRSwgaW1wLlBZX0NPTVBJTEVELCBpbXAuUEtHX0RJUkVDVE9SWQorICAgICIiIgorICAgIGlmIGZ1bGxuYW1lLnN0YXJ0c3dpdGgoJy4nKToKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlJlbGF0aXZlIG1vZHVsZSBuYW1lcyBub3Qgc3VwcG9ydGVkIikKKyAgICBpZiAnLicgaW4gZnVsbG5hbWU6CisgICAgICAgICMgR2V0IHRoZSBjb250YWluaW5nIHBhY2thZ2UncyBfX3BhdGhfXworICAgICAgICBwa2cgPSAnLicuam9pbihmdWxsbmFtZS5zcGxpdCgnLicpWzotMV0pCisgICAgICAgIGlmIHBrZyBub3QgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICBfX2ltcG9ydF9fKHBrZykKKyAgICAgICAgcGF0aCA9IGdldGF0dHIoc3lzLm1vZHVsZXNbcGtnXSwgJ19fcGF0aF9fJywgTm9uZSkgb3IgW10KKyAgICBlbHNlOgorICAgICAgICBmb3IgaW1wb3J0ZXIgaW4gc3lzLm1ldGFfcGF0aDoKKyAgICAgICAgICAgIHlpZWxkIGltcG9ydGVyCisgICAgICAgIHBhdGggPSBzeXMucGF0aAorICAgIGZvciBpdGVtIGluIHBhdGg6CisgICAgICAgIHlpZWxkIGdldF9pbXBvcnRlcihpdGVtKQorICAgIGlmICcuJyBub3QgaW4gZnVsbG5hbWU6CisgICAgICAgIHlpZWxkIEltcEltcG9ydGVyKCkKKworZGVmIGdldF9sb2FkZXIobW9kdWxlX29yX25hbWUpOgorICAgICIiIkdldCBhIFBFUCAzMDIgImxvYWRlciIgb2JqZWN0IGZvciBtb2R1bGVfb3JfbmFtZQorCisgICAgSWYgdGhlIG1vZHVsZSBvciBwYWNrYWdlIGlzIGFjY2Vzc2libGUgdmlhIHRoZSBub3JtYWwgaW1wb3J0CisgICAgbWVjaGFuaXNtLCBhIHdyYXBwZXIgYXJvdW5kIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoYXQgbWFjaGluZXJ5CisgICAgaXMgcmV0dXJuZWQuICBSZXR1cm5zIE5vbmUgaWYgdGhlIG1vZHVsZSBjYW5ub3QgYmUgZm91bmQgb3IgaW1wb3J0ZWQuCisgICAgSWYgdGhlIG5hbWVkIG1vZHVsZSBpcyBub3QgYWxyZWFkeSBpbXBvcnRlZCwgaXRzIGNvbnRhaW5pbmcgcGFja2FnZQorICAgIChpZiBhbnkpIGlzIGltcG9ydGVkLCBpbiBvcmRlciB0byBlc3RhYmxpc2ggdGhlIHBhY2thZ2UgX19wYXRoX18uCisKKyAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgaXRlcl9pbXBvcnRlcnMoKSwgYW5kIGlzIHRodXMgc3ViamVjdCB0byB0aGUgc2FtZQorICAgIGxpbWl0YXRpb25zIHJlZ2FyZGluZyBwbGF0Zm9ybS1zcGVjaWZpYyBzcGVjaWFsIGltcG9ydCBsb2NhdGlvbnMgc3VjaAorICAgIGFzIHRoZSBXaW5kb3dzIHJlZ2lzdHJ5LgorICAgICIiIgorICAgIGlmIG1vZHVsZV9vcl9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICBtb2R1bGVfb3JfbmFtZSA9IHN5cy5tb2R1bGVzW21vZHVsZV9vcl9uYW1lXQorICAgIGlmIGlzaW5zdGFuY2UobW9kdWxlX29yX25hbWUsIE1vZHVsZVR5cGUpOgorICAgICAgICBtb2R1bGUgPSBtb2R1bGVfb3JfbmFtZQorICAgICAgICBsb2FkZXIgPSBnZXRhdHRyKG1vZHVsZSwgJ19fbG9hZGVyX18nLCBOb25lKQorICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbG9hZGVyCisgICAgICAgIGZ1bGxuYW1lID0gbW9kdWxlLl9fbmFtZV9fCisgICAgZWxzZToKKyAgICAgICAgZnVsbG5hbWUgPSBtb2R1bGVfb3JfbmFtZQorICAgIHJldHVybiBmaW5kX2xvYWRlcihmdWxsbmFtZSkKKworZGVmIGZpbmRfbG9hZGVyKGZ1bGxuYW1lKToKKyAgICAiIiJGaW5kIGEgUEVQIDMwMiAibG9hZGVyIiBvYmplY3QgZm9yIGZ1bGxuYW1lCisKKyAgICBJZiBmdWxsbmFtZSBjb250YWlucyBkb3RzLCBwYXRoIG11c3QgYmUgdGhlIGNvbnRhaW5pbmcgcGFja2FnZSdzIF9fcGF0aF9fLgorICAgIFJldHVybnMgTm9uZSBpZiB0aGUgbW9kdWxlIGNhbm5vdCBiZSBmb3VuZCBvciBpbXBvcnRlZC4gVGhpcyBmdW5jdGlvbiB1c2VzCisgICAgaXRlcl9pbXBvcnRlcnMoKSwgYW5kIGlzIHRodXMgc3ViamVjdCB0byB0aGUgc2FtZSBsaW1pdGF0aW9ucyByZWdhcmRpbmcKKyAgICBwbGF0Zm9ybS1zcGVjaWZpYyBzcGVjaWFsIGltcG9ydCBsb2NhdGlvbnMgc3VjaCBhcyB0aGUgV2luZG93cyByZWdpc3RyeS4KKyAgICAiIiIKKyAgICBmb3IgaW1wb3J0ZXIgaW4gaXRlcl9pbXBvcnRlcnMoZnVsbG5hbWUpOgorICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShmdWxsbmFtZSkKKyAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxvYWRlcgorCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgZXh0ZW5kX3BhdGgocGF0aCwgbmFtZSk6CisgICAgIiIiRXh0ZW5kIGEgcGFja2FnZSdzIHBhdGguCisKKyAgICBJbnRlbmRlZCB1c2UgaXMgdG8gcGxhY2UgdGhlIGZvbGxvd2luZyBjb2RlIGluIGEgcGFja2FnZSdzIF9faW5pdF9fLnB5OgorCisgICAgICAgIGZyb20gcGtndXRpbCBpbXBvcnQgZXh0ZW5kX3BhdGgKKyAgICAgICAgX19wYXRoX18gPSBleHRlbmRfcGF0aChfX3BhdGhfXywgX19uYW1lX18pCisKKyAgICBUaGlzIHdpbGwgYWRkIHRvIHRoZSBwYWNrYWdlJ3MgX19wYXRoX18gYWxsIHN1YmRpcmVjdG9yaWVzIG9mCisgICAgZGlyZWN0b3JpZXMgb24gc3lzLnBhdGggbmFtZWQgYWZ0ZXIgdGhlIHBhY2thZ2UuICBUaGlzIGlzIHVzZWZ1bAorICAgIGlmIG9uZSB3YW50cyB0byBkaXN0cmlidXRlIGRpZmZlcmVudCBwYXJ0cyBvZiBhIHNpbmdsZSBsb2dpY2FsCisgICAgcGFja2FnZSBhcyBtdWx0aXBsZSBkaXJlY3Rvcmllcy4KKworICAgIEl0IGFsc28gbG9va3MgZm9yICoucGtnIGZpbGVzIGJlZ2lubmluZyB3aGVyZSAqIG1hdGNoZXMgdGhlIG5hbWUKKyAgICBhcmd1bWVudC4gIFRoaXMgZmVhdHVyZSBpcyBzaW1pbGFyIHRvICoucHRoIGZpbGVzIChzZWUgc2l0ZS5weSksCisgICAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBzcGVjaWFsLWNhc2UgbGluZXMgc3RhcnRpbmcgd2l0aCAnaW1wb3J0Jy4KKyAgICBBICoucGtnIGZpbGUgaXMgdHJ1c3RlZCBhdCBmYWNlIHZhbHVlOiBhcGFydCBmcm9tIGNoZWNraW5nIGZvcgorICAgIGR1cGxpY2F0ZXMsIGFsbCBlbnRyaWVzIGZvdW5kIGluIGEgKi5wa2cgZmlsZSBhcmUgYWRkZWQgdG8gdGhlCisgICAgcGF0aCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGV4aXN0IHRoZSBmaWxlc3lzdGVtLiAgKFRoaXMKKyAgICBpcyBhIGZlYXR1cmUuKQorCisgICAgSWYgdGhlIGlucHV0IHBhdGggaXMgbm90IGEgbGlzdCAoYXMgaXMgdGhlIGNhc2UgZm9yIGZyb3plbgorICAgIHBhY2thZ2VzKSBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuICBUaGUgaW5wdXQgcGF0aCBpcyBub3QKKyAgICBtb2RpZmllZDsgYW4gZXh0ZW5kZWQgY29weSBpcyByZXR1cm5lZC4gIEl0ZW1zIGFyZSBvbmx5IGFwcGVuZGVkCisgICAgdG8gdGhlIGNvcHkgYXQgdGhlIGVuZC4KKworICAgIEl0IGlzIGFzc3VtZWQgdGhhdCBzeXMucGF0aCBpcyBhIHNlcXVlbmNlLiAgSXRlbXMgb2Ygc3lzLnBhdGggdGhhdAorICAgIGFyZSBub3QgKHVuaWNvZGUgb3IgOC1iaXQpIHN0cmluZ3MgcmVmZXJyaW5nIHRvIGV4aXN0aW5nCisgICAgZGlyZWN0b3JpZXMgYXJlIGlnbm9yZWQuICBVbmljb2RlIGl0ZW1zIG9mIHN5cy5wYXRoIHRoYXQgY2F1c2UKKyAgICBlcnJvcnMgd2hlbiB1c2VkIGFzIGZpbGVuYW1lcyBtYXkgY2F1c2UgdGhpcyBmdW5jdGlvbiB0byByYWlzZSBhbgorICAgIGV4Y2VwdGlvbiAoaW4gbGluZSB3aXRoIG9zLnBhdGguaXNkaXIoKSBiZWhhdmlvcikuCisgICAgIiIiCisKKyAgICBpZiBub3QgaXNpbnN0YW5jZShwYXRoLCBsaXN0KToKKyAgICAgICAgIyBUaGlzIGNvdWxkIGhhcHBlbiBlLmcuIHdoZW4gdGhpcyBpcyBjYWxsZWQgZnJvbSBpbnNpZGUgYQorICAgICAgICAjIGZyb3plbiBwYWNrYWdlLiAgUmV0dXJuIHRoZSBwYXRoIHVuY2hhbmdlZCBpbiB0aGF0IGNhc2UuCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBwbmFtZSA9IG9zLnBhdGguam9pbigqbmFtZS5zcGxpdCgnLicpKSAjIFJlY29uc3RpdHV0ZSBhcyByZWxhdGl2ZSBwYXRoCisgICAgIyBKdXN0IGluIGNhc2Ugb3MuZXh0c2VwICE9ICcuJworICAgIHNuYW1lID0gb3MuZXh0c2VwLmpvaW4obmFtZS5zcGxpdCgnLicpKQorICAgIHNuYW1lX3BrZyA9IHNuYW1lICsgb3MuZXh0c2VwICsgInBrZyIKKyAgICBpbml0X3B5ID0gIl9faW5pdF9fIiArIG9zLmV4dHNlcCArICJweSIKKworICAgIHBhdGggPSBwYXRoWzpdICMgU3RhcnQgd2l0aCBhIGNvcHkgb2YgdGhlIGV4aXN0aW5nIHBhdGgKKworICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGRpciwgYmFzZXN0cmluZykgb3Igbm90IG9zLnBhdGguaXNkaXIoZGlyKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHN1YmRpciA9IG9zLnBhdGguam9pbihkaXIsIHBuYW1lKQorICAgICAgICAjIFhYWCBUaGlzIG1heSBzdGlsbCBhZGQgZHVwbGljYXRlIGVudHJpZXMgdG8gcGF0aCBvbgorICAgICAgICAjIGNhc2UtaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMKKyAgICAgICAgaW5pdGZpbGUgPSBvcy5wYXRoLmpvaW4oc3ViZGlyLCBpbml0X3B5KQorICAgICAgICBpZiBzdWJkaXIgbm90IGluIHBhdGggYW5kIG9zLnBhdGguaXNmaWxlKGluaXRmaWxlKToKKyAgICAgICAgICAgIHBhdGguYXBwZW5kKHN1YmRpcikKKyAgICAgICAgIyBYWFggSXMgdGhpcyB0aGUgcmlnaHQgdGhpbmcgZm9yIHN1YnBhY2thZ2VzIGxpa2Ugem9wZS5hcHA/CisgICAgICAgICMgSXQgbG9va3MgZm9yIGEgZmlsZSBuYW1lZCAiem9wZS5hcHAucGtnIgorICAgICAgICBwa2dmaWxlID0gb3MucGF0aC5qb2luKGRpciwgc25hbWVfcGtnKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwa2dmaWxlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3Blbihwa2dmaWxlKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJDYW4ndCBvcGVuICVzOiAlc1xuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGtnZmlsZSwgbXNnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmUucnN0cmlwKCdcbicpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5hcHBlbmQobGluZSkgIyBEb24ndCBjaGVjayBmb3IgZXhpc3RlbmNlIQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgcmV0dXJuIHBhdGgKKworZGVmIGdldF9kYXRhKHBhY2thZ2UsIHJlc291cmNlKToKKyAgICAiIiJHZXQgYSByZXNvdXJjZSBmcm9tIGEgcGFja2FnZS4KKworICAgIFRoaXMgaXMgYSB3cmFwcGVyIHJvdW5kIHRoZSBQRVAgMzAyIGxvYWRlciBnZXRfZGF0YSBBUEkuIFRoZSBwYWNrYWdlCisgICAgYXJndW1lbnQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgcGFja2FnZSwgaW4gc3RhbmRhcmQgbW9kdWxlIGZvcm1hdAorICAgIChmb28uYmFyKS4gVGhlIHJlc291cmNlIGFyZ3VtZW50IHNob3VsZCBiZSBpbiB0aGUgZm9ybSBvZiBhIHJlbGF0aXZlCisgICAgZmlsZW5hbWUsIHVzaW5nICcvJyBhcyB0aGUgcGF0aCBzZXBhcmF0b3IuIFRoZSBwYXJlbnQgZGlyZWN0b3J5IG5hbWUgJy4uJworICAgIGlzIG5vdCBhbGxvd2VkLCBhbmQgbm9yIGlzIGEgcm9vdGVkIG5hbWUgKHN0YXJ0aW5nIHdpdGggYSAnLycpLgorCisgICAgVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBiaW5hcnkgc3RyaW5nLCB3aGljaCBpcyB0aGUgY29udGVudHMgb2YgdGhlCisgICAgc3BlY2lmaWVkIHJlc291cmNlLgorCisgICAgRm9yIHBhY2thZ2VzIGxvY2F0ZWQgaW4gdGhlIGZpbGVzeXN0ZW0sIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGltcG9ydGVkLAorICAgIHRoaXMgaXMgdGhlIHJvdWdoIGVxdWl2YWxlbnQgb2YKKworICAgICAgICBkID0gb3MucGF0aC5kaXJuYW1lKHN5cy5tb2R1bGVzW3BhY2thZ2VdLl9fZmlsZV9fKQorICAgICAgICBkYXRhID0gb3Blbihvcy5wYXRoLmpvaW4oZCwgcmVzb3VyY2UpLCAncmInKS5yZWFkKCkKKworICAgIElmIHRoZSBwYWNrYWdlIGNhbm5vdCBiZSBsb2NhdGVkIG9yIGxvYWRlZCwgb3IgaXQgdXNlcyBhIFBFUCAzMDIgbG9hZGVyCisgICAgd2hpY2ggZG9lcyBub3Qgc3VwcG9ydCBnZXRfZGF0YSgpLCB0aGVuIE5vbmUgaXMgcmV0dXJuZWQuCisgICAgIiIiCisKKyAgICBsb2FkZXIgPSBnZXRfbG9hZGVyKHBhY2thZ2UpCisgICAgaWYgbG9hZGVyIGlzIE5vbmUgb3Igbm90IGhhc2F0dHIobG9hZGVyLCAnZ2V0X2RhdGEnKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBtb2QgPSBzeXMubW9kdWxlcy5nZXQocGFja2FnZSkgb3IgbG9hZGVyLmxvYWRfbW9kdWxlKHBhY2thZ2UpCisgICAgaWYgbW9kIGlzIE5vbmUgb3Igbm90IGhhc2F0dHIobW9kLCAnX19maWxlX18nKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgTW9kaWZ5IHRoZSByZXNvdXJjZSBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgbG9hZGVyLmdldF9kYXRhCisgICAgIyBzaWduYXR1cmUgLSBhbiBvcy5wYXRoIGZvcm1hdCAiZmlsZW5hbWUiIHN0YXJ0aW5nIHdpdGggdGhlIGRpcm5hbWUgb2YKKyAgICAjIHRoZSBwYWNrYWdlJ3MgX19maWxlX18KKyAgICBwYXJ0cyA9IHJlc291cmNlLnNwbGl0KCcvJykKKyAgICBwYXJ0cy5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKG1vZC5fX2ZpbGVfXykpCisgICAgcmVzb3VyY2VfbmFtZSA9IG9zLnBhdGguam9pbigqcGFydHMpCisgICAgcmV0dXJuIGxvYWRlci5nZXRfZGF0YShyZXNvdXJjZV9uYW1lKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wa2d1dGlsLnB5YyBiL2xpYi9weXRob24yLjcvcGtndXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiMzNiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGtndXRpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wa2d1dGlsLnB5byBiL2xpYi9weXRob24yLjcvcGtndXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJiMzNiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGtndXRpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9DRFJPTS5weSBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvQ0RST00ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0MDkzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvQ0RST00ucHkKQEAgLTAsMCArMSwyMDcgQEAKKyMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvbGludXgvY2Ryb20uaAorCitDRFJPTVBBVVNFID0gMHg1MzAxCitDRFJPTVJFU1VNRSA9IDB4NTMwMgorQ0RST01QTEFZTVNGID0gMHg1MzAzCitDRFJPTVBMQVlUUktJTkQgPSAweDUzMDQKK0NEUk9NUkVBRFRPQ0hEUiA9IDB4NTMwNQorQ0RST01SRUFEVE9DRU5UUlkgPSAweDUzMDYKK0NEUk9NU1RPUCA9IDB4NTMwNworQ0RST01TVEFSVCA9IDB4NTMwOAorQ0RST01FSkVDVCA9IDB4NTMwOQorQ0RST01WT0xDVFJMID0gMHg1MzBhCitDRFJPTVNVQkNITkwgPSAweDUzMGIKK0NEUk9NUkVBRE1PREUyID0gMHg1MzBjCitDRFJPTVJFQURNT0RFMSA9IDB4NTMwZAorQ0RST01SRUFEQVVESU8gPSAweDUzMGUKK0NEUk9NRUpFQ1RfU1cgPSAweDUzMGYKK0NEUk9NTVVMVElTRVNTSU9OID0gMHg1MzEwCitDRFJPTV9HRVRfTUNOID0gMHg1MzExCitDRFJPTV9HRVRfVVBDID0gQ0RST01fR0VUX01DTgorQ0RST01SRVNFVCA9IDB4NTMxMgorQ0RST01WT0xSRUFEID0gMHg1MzEzCitDRFJPTVJFQURSQVcgPSAweDUzMTQKK0NEUk9NUkVBRENPT0tFRCA9IDB4NTMxNQorQ0RST01TRUVLID0gMHg1MzE2CitDRFJPTVBMQVlCTEsgPSAweDUzMTcKK0NEUk9NUkVBREFMTCA9IDB4NTMxOAorQ0RST01HRVRTUElORE9XTiA9IDB4NTMxZAorQ0RST01TRVRTUElORE9XTiA9IDB4NTMxZQorQ0RST01DTE9TRVRSQVkgPSAweDUzMTkKK0NEUk9NX1NFVF9PUFRJT05TID0gMHg1MzIwCitDRFJPTV9DTEVBUl9PUFRJT05TID0gMHg1MzIxCitDRFJPTV9TRUxFQ1RfU1BFRUQgPSAweDUzMjIKK0NEUk9NX1NFTEVDVF9ESVNDID0gMHg1MzIzCitDRFJPTV9NRURJQV9DSEFOR0VEID0gMHg1MzI1CitDRFJPTV9EUklWRV9TVEFUVVMgPSAweDUzMjYKK0NEUk9NX0RJU0NfU1RBVFVTID0gMHg1MzI3CitDRFJPTV9DSEFOR0VSX05TTE9UUyA9IDB4NTMyOAorQ0RST01fTE9DS0RPT1IgPSAweDUzMjkKK0NEUk9NX0RFQlVHID0gMHg1MzMwCitDRFJPTV9HRVRfQ0FQQUJJTElUWSA9IDB4NTMzMQorQ0RST01BVURJT0JVRlNJWiA9IDB4NTM4MgorRFZEX1JFQURfU1RSVUNUID0gMHg1MzkwCitEVkRfV1JJVEVfU1RSVUNUID0gMHg1MzkxCitEVkRfQVVUSCA9IDB4NTM5MgorQ0RST01fU0VORF9QQUNLRVQgPSAweDUzOTMKK0NEUk9NX05FWFRfV1JJVEFCTEUgPSAweDUzOTQKK0NEUk9NX0xBU1RfV1JJVFRFTiA9IDB4NTM5NQorQ0RST01fUEFDS0VUX1NJWkUgPSAxMgorQ0dDX0RBVEFfVU5LTk9XTiA9IDAKK0NHQ19EQVRBX1dSSVRFID0gMQorQ0dDX0RBVEFfUkVBRCA9IDIKK0NHQ19EQVRBX05PTkUgPSAzCitDRF9NSU5TID0gNzQKK0NEX1NFQ1MgPSA2MAorQ0RfRlJBTUVTID0gNzUKK0NEX1NZTkNfU0laRSA9IDEyCitDRF9NU0ZfT0ZGU0VUID0gMTUwCitDRF9DSFVOS19TSVpFID0gMjQKK0NEX05VTV9PRl9DSFVOS1MgPSA5OAorQ0RfRlJBTUVTSVpFX1NVQiA9IDk2CitDRF9IRUFEX1NJWkUgPSA0CitDRF9TVUJIRUFEX1NJWkUgPSA4CitDRF9FRENfU0laRSA9IDQKK0NEX1pFUk9fU0laRSA9IDgKK0NEX0VDQ19TSVpFID0gMjc2CitDRF9GUkFNRVNJWkUgPSAyMDQ4CitDRF9GUkFNRVNJWkVfUkFXID0gMjM1MgorQ0RfRlJBTUVTSVpFX1JBV0VSID0gMjY0NgorQ0RfRlJBTUVTSVpFX1JBVzEgPSAoQ0RfRlJBTUVTSVpFX1JBVy1DRF9TWU5DX1NJWkUpCitDRF9GUkFNRVNJWkVfUkFXMCA9IChDRF9GUkFNRVNJWkVfUkFXLUNEX1NZTkNfU0laRS1DRF9IRUFEX1NJWkUpCitDRF9YQV9IRUFEID0gKENEX0hFQURfU0laRStDRF9TVUJIRUFEX1NJWkUpCitDRF9YQV9UQUlMID0gKENEX0VEQ19TSVpFK0NEX0VDQ19TSVpFKQorQ0RfWEFfU1lOQ19IRUFEID0gKENEX1NZTkNfU0laRStDRF9YQV9IRUFEKQorQ0RST01fTEJBID0gMHgwMQorQ0RST01fTVNGID0gMHgwMgorQ0RST01fREFUQV9UUkFDSyA9IDB4MDQKK0NEUk9NX0xFQURPVVQgPSAweEFBCitDRFJPTV9BVURJT19JTlZBTElEID0gMHgwMAorQ0RST01fQVVESU9fUExBWSA9IDB4MTEKK0NEUk9NX0FVRElPX1BBVVNFRCA9IDB4MTIKK0NEUk9NX0FVRElPX0NPTVBMRVRFRCA9IDB4MTMKK0NEUk9NX0FVRElPX0VSUk9SID0gMHgxNAorQ0RST01fQVVESU9fTk9fU1RBVFVTID0gMHgxNQorQ0RDX0NMT1NFX1RSQVkgPSAweDEKK0NEQ19PUEVOX1RSQVkgPSAweDIKK0NEQ19MT0NLID0gMHg0CitDRENfU0VMRUNUX1NQRUVEID0gMHg4CitDRENfU0VMRUNUX0RJU0MgPSAweDEwCitDRENfTVVMVElfU0VTU0lPTiA9IDB4MjAKK0NEQ19NQ04gPSAweDQwCitDRENfTUVESUFfQ0hBTkdFRCA9IDB4ODAKK0NEQ19QTEFZX0FVRElPID0gMHgxMDAKK0NEQ19SRVNFVCA9IDB4MjAwCitDRENfSU9DVExTID0gMHg0MDAKK0NEQ19EUklWRV9TVEFUVVMgPSAweDgwMAorQ0RDX0dFTkVSSUNfUEFDS0VUID0gMHgxMDAwCitDRENfQ0RfUiA9IDB4MjAwMAorQ0RDX0NEX1JXID0gMHg0MDAwCitDRENfRFZEID0gMHg4MDAwCitDRENfRFZEX1IgPSAweDEwMDAwCitDRENfRFZEX1JBTSA9IDB4MjAwMDAKK0NEU19OT19JTkZPID0gMAorQ0RTX05PX0RJU0MgPSAxCitDRFNfVFJBWV9PUEVOID0gMgorQ0RTX0RSSVZFX05PVF9SRUFEWSA9IDMKK0NEU19ESVNDX09LID0gNAorQ0RTX0FVRElPID0gMTAwCitDRFNfREFUQV8xID0gMTAxCitDRFNfREFUQV8yID0gMTAyCitDRFNfWEFfMl8xID0gMTAzCitDRFNfWEFfMl8yID0gMTA0CitDRFNfTUlYRUQgPSAxMDUKK0NET19BVVRPX0NMT1NFID0gMHgxCitDRE9fQVVUT19FSkVDVCA9IDB4MgorQ0RPX1VTRV9GRkxBR1MgPSAweDQKK0NET19MT0NLID0gMHg4CitDRE9fQ0hFQ0tfVFlQRSA9IDB4MTAKK0NEX1BBUlRfTUFYID0gNjQKK0NEX1BBUlRfTUFTSyA9IChDRF9QQVJUX01BWCAtIDEpCitHUENNRF9CTEFOSyA9IDB4YTEKK0dQQ01EX0NMT1NFX1RSQUNLID0gMHg1YgorR1BDTURfRkxVU0hfQ0FDSEUgPSAweDM1CitHUENNRF9GT1JNQVRfVU5JVCA9IDB4MDQKK0dQQ01EX0dFVF9DT05GSUdVUkFUSU9OID0gMHg0NgorR1BDTURfR0VUX0VWRU5UX1NUQVRVU19OT1RJRklDQVRJT04gPSAweDRhCitHUENNRF9HRVRfUEVSRk9STUFOQ0UgPSAweGFjCitHUENNRF9JTlFVSVJZID0gMHgxMgorR1BDTURfTE9BRF9VTkxPQUQgPSAweGE2CitHUENNRF9NRUNIQU5JU01fU1RBVFVTID0gMHhiZAorR1BDTURfTU9ERV9TRUxFQ1RfMTAgPSAweDU1CitHUENNRF9NT0RFX1NFTlNFXzEwID0gMHg1YQorR1BDTURfUEFVU0VfUkVTVU1FID0gMHg0YgorR1BDTURfUExBWV9BVURJT18xMCA9IDB4NDUKK0dQQ01EX1BMQVlfQVVESU9fTVNGID0gMHg0NworR1BDTURfUExBWV9BVURJT19USSA9IDB4NDgKK0dQQ01EX1BMQVlfQ0QgPSAweGJjCitHUENNRF9QUkVWRU5UX0FMTE9XX01FRElVTV9SRU1PVkFMID0gMHgxZQorR1BDTURfUkVBRF8xMCA9IDB4MjgKK0dQQ01EX1JFQURfMTIgPSAweGE4CitHUENNRF9SRUFEX0NEVkRfQ0FQQUNJVFkgPSAweDI1CitHUENNRF9SRUFEX0NEID0gMHhiZQorR1BDTURfUkVBRF9DRF9NU0YgPSAweGI5CitHUENNRF9SRUFEX0RJU0NfSU5GTyA9IDB4NTEKK0dQQ01EX1JFQURfRFZEX1NUUlVDVFVSRSA9IDB4YWQKK0dQQ01EX1JFQURfRk9STUFUX0NBUEFDSVRJRVMgPSAweDIzCitHUENNRF9SRUFEX0hFQURFUiA9IDB4NDQKK0dQQ01EX1JFQURfVFJBQ0tfUlpPTkVfSU5GTyA9IDB4NTIKK0dQQ01EX1JFQURfU1VCQ0hBTk5FTCA9IDB4NDIKK0dQQ01EX1JFQURfVE9DX1BNQV9BVElQID0gMHg0MworR1BDTURfUkVQQUlSX1JaT05FX1RSQUNLID0gMHg1OAorR1BDTURfUkVQT1JUX0tFWSA9IDB4YTQKK0dQQ01EX1JFUVVFU1RfU0VOU0UgPSAweDAzCitHUENNRF9SRVNFUlZFX1JaT05FX1RSQUNLID0gMHg1MworR1BDTURfU0NBTiA9IDB4YmEKK0dQQ01EX1NFRUsgPSAweDJiCitHUENNRF9TRU5EX0RWRF9TVFJVQ1RVUkUgPSAweGFkCitHUENNRF9TRU5EX0VWRU5UID0gMHhhMgorR1BDTURfU0VORF9LRVkgPSAweGEzCitHUENNRF9TRU5EX09QQyA9IDB4NTQKK0dQQ01EX1NFVF9SRUFEX0FIRUFEID0gMHhhNworR1BDTURfU0VUX1NUUkVBTUlORyA9IDB4YjYKK0dQQ01EX1NUQVJUX1NUT1BfVU5JVCA9IDB4MWIKK0dQQ01EX1NUT1BfUExBWV9TQ0FOID0gMHg0ZQorR1BDTURfVEVTVF9VTklUX1JFQURZID0gMHgwMAorR1BDTURfVkVSSUZZXzEwID0gMHgyZgorR1BDTURfV1JJVEVfMTAgPSAweDJhCitHUENNRF9XUklURV9BTkRfVkVSSUZZXzEwID0gMHgyZQorR1BDTURfU0VUX1NQRUVEID0gMHhiYgorR1BDTURfUExBWUFVRElPX1RJID0gMHg0OAorR1BDTURfR0VUX01FRElBX1NUQVRVUyA9IDB4ZGEKK0dQTU9ERV9SX1dfRVJST1JfUEFHRSA9IDB4MDEKK0dQTU9ERV9XUklURV9QQVJNU19QQUdFID0gMHgwNQorR1BNT0RFX0FVRElPX0NUTF9QQUdFID0gMHgwZQorR1BNT0RFX1BPV0VSX1BBR0UgPSAweDFhCitHUE1PREVfRkFVTFRfRkFJTF9QQUdFID0gMHgxYworR1BNT0RFX1RPX1BST1RFQ1RfUEFHRSA9IDB4MWQKK0dQTU9ERV9DQVBBQklMSVRJRVNfUEFHRSA9IDB4MmEKK0dQTU9ERV9BTExfUEFHRVMgPSAweDNmCitHUE1PREVfQ0RST01fUEFHRSA9IDB4MGQKK0RWRF9TVFJVQ1RfUEhZU0lDQUwgPSAweDAwCitEVkRfU1RSVUNUX0NPUFlSSUdIVCA9IDB4MDEKK0RWRF9TVFJVQ1RfRElTQ0tFWSA9IDB4MDIKK0RWRF9TVFJVQ1RfQkNBID0gMHgwMworRFZEX1NUUlVDVF9NQU5VRkFDVCA9IDB4MDQKK0RWRF9MQVlFUlMgPSA0CitEVkRfTFVfU0VORF9BR0lEID0gMAorRFZEX0hPU1RfU0VORF9DSEFMTEVOR0UgPSAxCitEVkRfTFVfU0VORF9LRVkxID0gMgorRFZEX0xVX1NFTkRfQ0hBTExFTkdFID0gMworRFZEX0hPU1RfU0VORF9LRVkyID0gNAorRFZEX0FVVEhfRVNUQUJMSVNIRUQgPSA1CitEVkRfQVVUSF9GQUlMVVJFID0gNgorRFZEX0xVX1NFTkRfVElUTEVfS0VZID0gNworRFZEX0xVX1NFTkRfQVNGID0gOAorRFZEX0lOVkFMSURBVEVfQUdJRCA9IDkKK0RWRF9MVV9TRU5EX1JQQ19TVEFURSA9IDEwCitEVkRfSE9TVF9TRU5EX1JQQ19TVEFURSA9IDExCitEVkRfQ1BNX05PX0NPUFlSSUdIVCA9IDAKK0RWRF9DUE1fQ09QWVJJR0hURUQgPSAxCitEVkRfQ1BfU0VDX05PTkUgPSAwCitEVkRfQ1BfU0VDX0VYSVNUID0gMQorRFZEX0NHTVNfVU5SRVNUUklDVEVEID0gMAorRFZEX0NHTVNfU0lOR0xFID0gMgorRFZEX0NHTVNfUkVTVFJJQ1RFRCA9IDMKKworQ0RST01fTUFYX1NMT1RTID0gMjU2CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0NEUk9NLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvQ0RST00ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGFlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0NEUk9NLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0NEUk9NLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvQ0RST00ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGFlMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0NEUk9NLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0RMRkNOLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9ETEZDTi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjMzNDBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9ETEZDTi5weQpAQCAtMCwwICsxLDgzIEBACisjIEdlbmVyYXRlZCBieSBoMnB5IGZyb20gL3Vzci9pbmNsdWRlL2RsZmNuLmgKK19ETEZDTl9IID0gMQorCisjIEluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaAorX0ZFQVRVUkVTX0ggPSAxCitfX1VTRV9BTlNJID0gMQorX19GQVZPUl9CU0QgPSAxCitfSVNPQzk5X1NPVVJDRSA9IDEKK19QT1NJWF9TT1VSQ0UgPSAxCitfUE9TSVhfQ19TT1VSQ0UgPSAxOTk1MDZMCitfWE9QRU5fU09VUkNFID0gNjAwCitfWE9QRU5fU09VUkNFX0VYVEVOREVEID0gMQorX0xBUkdFRklMRTY0X1NPVVJDRSA9IDEKK19CU0RfU09VUkNFID0gMQorX1NWSURfU09VUkNFID0gMQorX0JTRF9TT1VSQ0UgPSAxCitfU1ZJRF9TT1VSQ0UgPSAxCitfX1VTRV9JU09DOTkgPSAxCitfUE9TSVhfU09VUkNFID0gMQorX1BPU0lYX0NfU09VUkNFID0gMgorX1BPU0lYX0NfU09VUkNFID0gMTk5NTA2TAorX19VU0VfUE9TSVggPSAxCitfX1VTRV9QT1NJWDIgPSAxCitfX1VTRV9QT1NJWDE5OTMwOSA9IDEKK19fVVNFX1BPU0lYMTk5NTA2ID0gMQorX19VU0VfWE9QRU4gPSAxCitfX1VTRV9YT1BFTl9FWFRFTkRFRCA9IDEKK19fVVNFX1VOSVg5OCA9IDEKK19MQVJHRUZJTEVfU09VUkNFID0gMQorX19VU0VfWE9QRU4ySyA9IDEKK19fVVNFX0lTT0M5OSA9IDEKK19fVVNFX1hPUEVOX0VYVEVOREVEID0gMQorX19VU0VfTEFSR0VGSUxFID0gMQorX19VU0VfTEFSR0VGSUxFNjQgPSAxCitfX1VTRV9GSUxFX09GRlNFVDY0ID0gMQorX19VU0VfTUlTQyA9IDEKK19fVVNFX0JTRCA9IDEKK19fVVNFX1NWSUQgPSAxCitfX1VTRV9HTlUgPSAxCitfX1VTRV9SRUVOVFJBTlQgPSAxCitfX1NURENfSUVDXzU1OV9fID0gMQorX19TVERDX0lFQ181NTlfQ09NUExFWF9fID0gMQorX19TVERDX0lTT18xMDY0Nl9fID0gMjAwMDA5TAorX19HTlVfTElCUkFSWV9fID0gNgorX19HTElCQ19fID0gMgorX19HTElCQ19NSU5PUl9fID0gMgorCisjIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKK19TWVNfQ0RFRlNfSCA9IDEKK2RlZiBfX1BNVChhcmdzKTogcmV0dXJuIGFyZ3MKKworZGVmIF9fUChhcmdzKTogcmV0dXJuIGFyZ3MKKworZGVmIF9fUE1UKGFyZ3MpOiByZXR1cm4gYXJncworCitkZWYgX19TVFJJTkcoeCk6IHJldHVybiAjeAorCitfX2ZsZXhhcnIgPSBbXQorX19mbGV4YXJyID0gWzBdCitfX2ZsZXhhcnIgPSBbXQorX19mbGV4YXJyID0gWzFdCitkZWYgX19BU01OQU1FKGNuYW1lKTogcmV0dXJuIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCisKK2RlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybgorCitkZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fICh4KSkpCisKK2RlZiBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCk6IHJldHVybgorCitfX1VTRV9MQVJHRUZJTEUgPSAxCitfX1VTRV9MQVJHRUZJTEU2NCA9IDEKK19fVVNFX0VYVEVSTl9JTkxJTkVTID0gMQorCisjIEluY2x1ZGVkIGZyb20gZ251L3N0dWJzLmgKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvZGxmY24uaAorUlRMRF9MQVpZID0gMHgwMDAwMQorUlRMRF9OT1cgPSAweDAwMDAyCitSVExEX0JJTkRJTkdfTUFTSyA9IDB4MworUlRMRF9OT0xPQUQgPSAweDAwMDA0CitSVExEX0dMT0JBTCA9IDB4MDAxMDAKK1JUTERfTE9DQUwgPSAwCitSVExEX05PREVMRVRFID0gMHgwMTAwMApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9ETEZDTi5weWMgYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0RMRkNOLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQ5Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9ETEZDTi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9ETEZDTi5weW8gYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0RMRkNOLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQ5Y2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9ETEZDTi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9JTi5weSBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvSU4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQzMDdmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvSU4ucHkKQEAgLTAsMCArMSw2MTUgQEAKKyMgR2VuZXJhdGVkIGJ5IGgycHkgZnJvbSAvdXNyL2luY2x1ZGUvbmV0aW5ldC9pbi5oCitfTkVUSU5FVF9JTl9IID0gMQorCisjIEluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaAorX0ZFQVRVUkVTX0ggPSAxCitfX1VTRV9BTlNJID0gMQorX19GQVZPUl9CU0QgPSAxCitfSVNPQzk5X1NPVVJDRSA9IDEKK19QT1NJWF9TT1VSQ0UgPSAxCitfUE9TSVhfQ19TT1VSQ0UgPSAxOTk1MDZMCitfWE9QRU5fU09VUkNFID0gNjAwCitfWE9QRU5fU09VUkNFX0VYVEVOREVEID0gMQorX0xBUkdFRklMRTY0X1NPVVJDRSA9IDEKK19CU0RfU09VUkNFID0gMQorX1NWSURfU09VUkNFID0gMQorX0JTRF9TT1VSQ0UgPSAxCitfU1ZJRF9TT1VSQ0UgPSAxCitfX1VTRV9JU09DOTkgPSAxCitfUE9TSVhfU09VUkNFID0gMQorX1BPU0lYX0NfU09VUkNFID0gMgorX1BPU0lYX0NfU09VUkNFID0gMTk5NTA2TAorX19VU0VfUE9TSVggPSAxCitfX1VTRV9QT1NJWDIgPSAxCitfX1VTRV9QT1NJWDE5OTMwOSA9IDEKK19fVVNFX1BPU0lYMTk5NTA2ID0gMQorX19VU0VfWE9QRU4gPSAxCitfX1VTRV9YT1BFTl9FWFRFTkRFRCA9IDEKK19fVVNFX1VOSVg5OCA9IDEKK19MQVJHRUZJTEVfU09VUkNFID0gMQorX19VU0VfWE9QRU4ySyA9IDEKK19fVVNFX0lTT0M5OSA9IDEKK19fVVNFX1hPUEVOX0VYVEVOREVEID0gMQorX19VU0VfTEFSR0VGSUxFID0gMQorX19VU0VfTEFSR0VGSUxFNjQgPSAxCitfX1VTRV9GSUxFX09GRlNFVDY0ID0gMQorX19VU0VfTUlTQyA9IDEKK19fVVNFX0JTRCA9IDEKK19fVVNFX1NWSUQgPSAxCitfX1VTRV9HTlUgPSAxCitfX1VTRV9SRUVOVFJBTlQgPSAxCitfX1NURENfSUVDXzU1OV9fID0gMQorX19TVERDX0lFQ181NTlfQ09NUExFWF9fID0gMQorX19TVERDX0lTT18xMDY0Nl9fID0gMjAwMDA5TAorX19HTlVfTElCUkFSWV9fID0gNgorX19HTElCQ19fID0gMgorX19HTElCQ19NSU5PUl9fID0gMgorCisjIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKK19TWVNfQ0RFRlNfSCA9IDEKK2RlZiBfX1BNVChhcmdzKTogcmV0dXJuIGFyZ3MKKworZGVmIF9fUChhcmdzKTogcmV0dXJuIGFyZ3MKKworZGVmIF9fUE1UKGFyZ3MpOiByZXR1cm4gYXJncworCitkZWYgX19TVFJJTkcoeCk6IHJldHVybiAjeAorCitfX2ZsZXhhcnIgPSBbXQorX19mbGV4YXJyID0gWzBdCitfX2ZsZXhhcnIgPSBbXQorX19mbGV4YXJyID0gWzFdCitkZWYgX19BU01OQU1FKGNuYW1lKTogcmV0dXJuIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCisKK2RlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybgorCitkZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fICh4KSkpCisKK2RlZiBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCk6IHJldHVybgorCitfX1VTRV9MQVJHRUZJTEUgPSAxCitfX1VTRV9MQVJHRUZJTEU2NCA9IDEKK19fVVNFX0VYVEVSTl9JTkxJTkVTID0gMQorCisjIEluY2x1ZGVkIGZyb20gZ251L3N0dWJzLmgKKworIyBJbmNsdWRlZCBmcm9tIHN0ZGludC5oCitfU1RESU5UX0ggPSAxCisKKyMgSW5jbHVkZWQgZnJvbSBiaXRzL3djaGFyLmgKK19CSVRTX1dDSEFSX0ggPSAxCitfX1dDSEFSX01JTiA9ICgtMjE0NzQ4MzY0N2wgLSAxbCkKK19fV0NIQVJfTUFYID0gKDIxNDc0ODM2NDdsKQorCisjIEluY2x1ZGVkIGZyb20gYml0cy93b3Jkc2l6ZS5oCitfX1dPUkRTSVpFID0gMzIKK2RlZiBfX0lOVDY0X0MoYyk6IHJldHVybiBjICMjIEwKKworZGVmIF9fVUlOVDY0X0MoYyk6IHJldHVybiBjICMjIFVMCisKK2RlZiBfX0lOVDY0X0MoYyk6IHJldHVybiBjICMjIExMCisKK2RlZiBfX1VJTlQ2NF9DKGMpOiByZXR1cm4gYyAjIyBVTEwKKworSU5UOF9NSU4gPSAoLTEyOCkKK0lOVDE2X01JTiA9ICgtMzI3NjctMSkKK0lOVDMyX01JTiA9ICgtMjE0NzQ4MzY0Ny0xKQorSU5UNjRfTUlOID0gKC1fX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNyktMSkKK0lOVDhfTUFYID0gKDEyNykKK0lOVDE2X01BWCA9ICgzMjc2NykKK0lOVDMyX01BWCA9ICgyMTQ3NDgzNjQ3KQorSU5UNjRfTUFYID0gKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKK1VJTlQ4X01BWCA9ICgyNTUpCitVSU5UMTZfTUFYID0gKDY1NTM1KQorVUlOVDY0X01BWCA9IChfX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSkKK0lOVF9MRUFTVDhfTUlOID0gKC0xMjgpCitJTlRfTEVBU1QxNl9NSU4gPSAoLTMyNzY3LTEpCitJTlRfTEVBU1QzMl9NSU4gPSAoLTIxNDc0ODM2NDctMSkKK0lOVF9MRUFTVDY0X01JTiA9ICgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCitJTlRfTEVBU1Q4X01BWCA9ICgxMjcpCitJTlRfTEVBU1QxNl9NQVggPSAoMzI3NjcpCitJTlRfTEVBU1QzMl9NQVggPSAoMjE0NzQ4MzY0NykKK0lOVF9MRUFTVDY0X01BWCA9IChfX0lOVDY0X0MoOTIyMzM3MjAzNjg1NDc3NTgwNykpCitVSU5UX0xFQVNUOF9NQVggPSAoMjU1KQorVUlOVF9MRUFTVDE2X01BWCA9ICg2NTUzNSkKK1VJTlRfTEVBU1Q2NF9NQVggPSAoX19VSU5UNjRfQygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpCitJTlRfRkFTVDhfTUlOID0gKC0xMjgpCitJTlRfRkFTVDE2X01JTiA9ICgtOTIyMzM3MjAzNjg1NDc3NTgwN0wtMSkKK0lOVF9GQVNUMzJfTUlOID0gKC05MjIzMzcyMDM2ODU0Nzc1ODA3TC0xKQorSU5UX0ZBU1QxNl9NSU4gPSAoLTIxNDc0ODM2NDctMSkKK0lOVF9GQVNUMzJfTUlOID0gKC0yMTQ3NDgzNjQ3LTEpCitJTlRfRkFTVDY0X01JTiA9ICgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCitJTlRfRkFTVDhfTUFYID0gKDEyNykKK0lOVF9GQVNUMTZfTUFYID0gKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKQorSU5UX0ZBU1QzMl9NQVggPSAoOTIyMzM3MjAzNjg1NDc3NTgwN0wpCitJTlRfRkFTVDE2X01BWCA9ICgyMTQ3NDgzNjQ3KQorSU5UX0ZBU1QzMl9NQVggPSAoMjE0NzQ4MzY0NykKK0lOVF9GQVNUNjRfTUFYID0gKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKK1VJTlRfRkFTVDhfTUFYID0gKDI1NSkKK1VJTlRfRkFTVDY0X01BWCA9IChfX1VJTlQ2NF9DKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSkKK0lOVFBUUl9NSU4gPSAoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMLTEpCitJTlRQVFJfTUFYID0gKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKQorSU5UUFRSX01JTiA9ICgtMjE0NzQ4MzY0Ny0xKQorSU5UUFRSX01BWCA9ICgyMTQ3NDgzNjQ3KQorSU5UTUFYX01JTiA9ICgtX19JTlQ2NF9DKDkyMjMzNzIwMzY4NTQ3NzU4MDcpLTEpCitJTlRNQVhfTUFYID0gKF9fSU5UNjRfQyg5MjIzMzcyMDM2ODU0Nzc1ODA3KSkKK1VJTlRNQVhfTUFYID0gKF9fVUlOVDY0X0MoMTg0NDY3NDQwNzM3MDk1NTE2MTUpKQorUFRSRElGRl9NSU4gPSAoLTkyMjMzNzIwMzY4NTQ3NzU4MDdMLTEpCitQVFJESUZGX01BWCA9ICg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkKK1BUUkRJRkZfTUlOID0gKC0yMTQ3NDgzNjQ3LTEpCitQVFJESUZGX01BWCA9ICgyMTQ3NDgzNjQ3KQorU0lHX0FUT01JQ19NSU4gPSAoLTIxNDc0ODM2NDctMSkKK1NJR19BVE9NSUNfTUFYID0gKDIxNDc0ODM2NDcpCitXQ0hBUl9NSU4gPSBfX1dDSEFSX01JTgorV0NIQVJfTUFYID0gX19XQ0hBUl9NQVgKK2RlZiBJTlQ4X0MoYyk6IHJldHVybiBjCisKK2RlZiBJTlQxNl9DKGMpOiByZXR1cm4gYworCitkZWYgSU5UMzJfQyhjKTogcmV0dXJuIGMKKworZGVmIElOVDY0X0MoYyk6IHJldHVybiBjICMjIEwKKworZGVmIElOVDY0X0MoYyk6IHJldHVybiBjICMjIExMCisKK2RlZiBVSU5UOF9DKGMpOiByZXR1cm4gYyAjIyBVCisKK2RlZiBVSU5UMTZfQyhjKTogcmV0dXJuIGMgIyMgVQorCitkZWYgVUlOVDMyX0MoYyk6IHJldHVybiBjICMjIFUKKworZGVmIFVJTlQ2NF9DKGMpOiByZXR1cm4gYyAjIyBVTAorCitkZWYgVUlOVDY0X0MoYyk6IHJldHVybiBjICMjIFVMTAorCitkZWYgSU5UTUFYX0MoYyk6IHJldHVybiBjICMjIEwKKworZGVmIFVJTlRNQVhfQyhjKTogcmV0dXJuIGMgIyMgVUwKKworZGVmIElOVE1BWF9DKGMpOiByZXR1cm4gYyAjIyBMTAorCitkZWYgVUlOVE1BWF9DKGMpOiByZXR1cm4gYyAjIyBVTEwKKworCisjIEluY2x1ZGVkIGZyb20gYml0cy90eXBlcy5oCitfQklUU19UWVBFU19IID0gMQorX19GRF9TRVRTSVpFID0gMTAyNAorCisjIEluY2x1ZGVkIGZyb20gYml0cy9wdGhyZWFkdHlwZXMuaAorX0JJVFNfUFRIUkVBRFRZUEVTX0ggPSAxCisKKyMgSW5jbHVkZWQgZnJvbSBiaXRzL3NjaGVkLmgKK1NDSEVEX09USEVSID0gMAorU0NIRURfRklGTyA9IDEKK1NDSEVEX1JSID0gMgorQ1NJR05BTCA9IDB4MDAwMDAwZmYKK0NMT05FX1ZNID0gMHgwMDAwMDEwMAorQ0xPTkVfRlMgPSAweDAwMDAwMjAwCitDTE9ORV9GSUxFUyA9IDB4MDAwMDA0MDAKK0NMT05FX1NJR0hBTkQgPSAweDAwMDAwODAwCitDTE9ORV9QSUQgPSAweDAwMDAxMDAwCitDTE9ORV9QVFJBQ0UgPSAweDAwMDAyMDAwCitDTE9ORV9WRk9SSyA9IDB4MDAwMDQwMDAKK19fZGVmaW5lZF9zY2hlZHBhcmFtID0gMQorZGVmIElOX0NMQVNTQShhKTogcmV0dXJuICgoKChpbl9hZGRyX3QpKGEpKSAmICgtMjE0NzQ4MzY0OCkpID09IDApCisKK0lOX0NMQVNTQV9ORVQgPSAoLTE2Nzc3MjE2KQorSU5fQ0xBU1NBX05TSElGVCA9IDI0CitJTl9DTEFTU0FfSE9TVCA9ICgoLTEpICYgfklOX0NMQVNTQV9ORVQpCitJTl9DTEFTU0FfTUFYID0gMTI4CitkZWYgSU5fQ0xBU1NCKGEpOiByZXR1cm4gKCgoKGluX2FkZHJfdCkoYSkpICYgKC0xMDczNzQxODI0KSkgPT0gKC0yMTQ3NDgzNjQ4KSkKKworSU5fQ0xBU1NCX05FVCA9ICgtNjU1MzYpCitJTl9DTEFTU0JfTlNISUZUID0gMTYKK0lOX0NMQVNTQl9IT1NUID0gKCgtMSkgJiB+SU5fQ0xBU1NCX05FVCkKK0lOX0NMQVNTQl9NQVggPSA2NTUzNgorZGVmIElOX0NMQVNTQyhhKTogcmV0dXJuICgoKChpbl9hZGRyX3QpKGEpKSAmICgtNTM2ODcwOTEyKSkgPT0gKC0xMDczNzQxODI0KSkKKworSU5fQ0xBU1NDX05FVCA9ICgtMjU2KQorSU5fQ0xBU1NDX05TSElGVCA9IDgKK0lOX0NMQVNTQ19IT1NUID0gKCgtMSkgJiB+SU5fQ0xBU1NDX05FVCkKK2RlZiBJTl9DTEFTU0QoYSk6IHJldHVybiAoKCgoaW5fYWRkcl90KShhKSkgJiAoLTI2ODQzNTQ1NikpID09ICgtNTM2ODcwOTEyKSkKKworZGVmIElOX01VTFRJQ0FTVChhKTogcmV0dXJuIElOX0NMQVNTRChhKQorCitkZWYgSU5fRVhQRVJJTUVOVEFMKGEpOiByZXR1cm4gKCgoKGluX2FkZHJfdCkoYSkpICYgKC01MzY4NzA5MTIpKSA9PSAoLTUzNjg3MDkxMikpCisKK2RlZiBJTl9CQURDTEFTUyhhKTogcmV0dXJuICgoKChpbl9hZGRyX3QpKGEpKSAmICgtMjY4NDM1NDU2KSkgPT0gKC0yNjg0MzU0NTYpKQorCitJTl9MT09QQkFDS05FVCA9IDEyNworSU5FVF9BRERSU1RSTEVOID0gMTYKK0lORVQ2X0FERFJTVFJMRU4gPSA0NgorCisjIEluY2x1ZGVkIGZyb20gYml0cy9zb2NrZXQuaAorCisjIEluY2x1ZGVkIGZyb20gbGltaXRzLmgKK19MSUJDX0xJTUlUU19IXyA9IDEKK01CX0xFTl9NQVggPSAxNgorX0xJTUlUU19IID0gMQorQ0hBUl9CSVQgPSA4CitTQ0hBUl9NSU4gPSAoLTEyOCkKK1NDSEFSX01BWCA9IDEyNworVUNIQVJfTUFYID0gMjU1CitDSEFSX01JTiA9IDAKK0NIQVJfTUFYID0gVUNIQVJfTUFYCitDSEFSX01JTiA9IFNDSEFSX01JTgorQ0hBUl9NQVggPSBTQ0hBUl9NQVgKK1NIUlRfTUlOID0gKC0zMjc2OCkKK1NIUlRfTUFYID0gMzI3NjcKK1VTSFJUX01BWCA9IDY1NTM1CitJTlRfTUFYID0gMjE0NzQ4MzY0NworTE9OR19NQVggPSA5MjIzMzcyMDM2ODU0Nzc1ODA3TAorTE9OR19NQVggPSAyMTQ3NDgzNjQ3TAorTE9OR19NSU4gPSAoLUxPTkdfTUFYIC0gMUwpCisKKyMgSW5jbHVkZWQgZnJvbSBiaXRzL3Bvc2l4MV9saW0uaAorX0JJVFNfUE9TSVgxX0xJTV9IID0gMQorX1BPU0lYX0FJT19MSVNUSU9fTUFYID0gMgorX1BPU0lYX0FJT19NQVggPSAxCitfUE9TSVhfQVJHX01BWCA9IDQwOTYKK19QT1NJWF9DSElMRF9NQVggPSA2CitfUE9TSVhfREVMQVlUSU1FUl9NQVggPSAzMgorX1BPU0lYX0xJTktfTUFYID0gOAorX1BPU0lYX01BWF9DQU5PTiA9IDI1NQorX1BPU0lYX01BWF9JTlBVVCA9IDI1NQorX1BPU0lYX01RX09QRU5fTUFYID0gOAorX1BPU0lYX01RX1BSSU9fTUFYID0gMzIKK19QT1NJWF9OR1JPVVBTX01BWCA9IDAKK19QT1NJWF9PUEVOX01BWCA9IDE2CitfUE9TSVhfRkRfU0VUU0laRSA9IF9QT1NJWF9PUEVOX01BWAorX1BPU0lYX05BTUVfTUFYID0gMTQKK19QT1NJWF9QQVRIX01BWCA9IDI1NgorX1BPU0lYX1BJUEVfQlVGID0gNTEyCitfUE9TSVhfUlRTSUdfTUFYID0gOAorX1BPU0lYX1NFTV9OU0VNU19NQVggPSAyNTYKK19QT1NJWF9TRU1fVkFMVUVfTUFYID0gMzI3NjcKK19QT1NJWF9TSUdRVUVVRV9NQVggPSAzMgorX1BPU0lYX1NTSVpFX01BWCA9IDMyNzY3CitfUE9TSVhfU1RSRUFNX01BWCA9IDgKK19QT1NJWF9UWk5BTUVfTUFYID0gNgorX1BPU0lYX1FMSU1JVCA9IDEKK19QT1NJWF9ISVdBVCA9IF9QT1NJWF9QSVBFX0JVRgorX1BPU0lYX1VJT19NQVhJT1YgPSAxNgorX1BPU0lYX1RUWV9OQU1FX01BWCA9IDkKK19QT1NJWF9USU1FUl9NQVggPSAzMgorX1BPU0lYX0xPR0lOX05BTUVfTUFYID0gOQorX1BPU0lYX0NMT0NLUkVTX01JTiA9IDIwMDAwMDAwCisKKyMgSW5jbHVkZWQgZnJvbSBiaXRzL2xvY2FsX2xpbS5oCisKKyMgSW5jbHVkZWQgZnJvbSBsaW51eC9saW1pdHMuaAorTlJfT1BFTiA9IDEwMjQKK05HUk9VUFNfTUFYID0gMzIKK0FSR19NQVggPSAxMzEwNzIKK0NISUxEX01BWCA9IDk5OQorT1BFTl9NQVggPSAyNTYKK0xJTktfTUFYID0gMTI3CitNQVhfQ0FOT04gPSAyNTUKK01BWF9JTlBVVCA9IDI1NQorTkFNRV9NQVggPSAyNTUKK1BBVEhfTUFYID0gNDA5NgorUElQRV9CVUYgPSA0MDk2CitSVFNJR19NQVggPSAzMgorX1BPU0lYX1RIUkVBRF9LRVlTX01BWCA9IDEyOAorUFRIUkVBRF9LRVlTX01BWCA9IDEwMjQKK19QT1NJWF9USFJFQURfREVTVFJVQ1RPUl9JVEVSQVRJT05TID0gNAorUFRIUkVBRF9ERVNUUlVDVE9SX0lURVJBVElPTlMgPSBfUE9TSVhfVEhSRUFEX0RFU1RSVUNUT1JfSVRFUkFUSU9OUworX1BPU0lYX1RIUkVBRF9USFJFQURTX01BWCA9IDY0CitQVEhSRUFEX1RIUkVBRFNfTUFYID0gMTAyNAorQUlPX1BSSU9fREVMVEFfTUFYID0gMjAKK1BUSFJFQURfU1RBQ0tfTUlOID0gMTYzODQKK1RJTUVSX01BWCA9IDI1NgorU1NJWkVfTUFYID0gTE9OR19NQVgKK05HUk9VUFNfTUFYID0gX1BPU0lYX05HUk9VUFNfTUFYCisKKyMgSW5jbHVkZWQgZnJvbSBiaXRzL3Bvc2l4Ml9saW0uaAorX0JJVFNfUE9TSVgyX0xJTV9IID0gMQorX1BPU0lYMl9CQ19CQVNFX01BWCA9IDk5CitfUE9TSVgyX0JDX0RJTV9NQVggPSAyMDQ4CitfUE9TSVgyX0JDX1NDQUxFX01BWCA9IDk5CitfUE9TSVgyX0JDX1NUUklOR19NQVggPSAxMDAwCitfUE9TSVgyX0NPTExfV0VJR0hUU19NQVggPSAyCitfUE9TSVgyX0VYUFJfTkVTVF9NQVggPSAzMgorX1BPU0lYMl9MSU5FX01BWCA9IDIwNDgKK19QT1NJWDJfUkVfRFVQX01BWCA9IDI1NQorX1BPU0lYMl9DSEFSQ0xBU1NfTkFNRV9NQVggPSAxNAorQkNfQkFTRV9NQVggPSBfUE9TSVgyX0JDX0JBU0VfTUFYCitCQ19ESU1fTUFYID0gX1BPU0lYMl9CQ19ESU1fTUFYCitCQ19TQ0FMRV9NQVggPSBfUE9TSVgyX0JDX1NDQUxFX01BWAorQkNfU1RSSU5HX01BWCA9IF9QT1NJWDJfQkNfU1RSSU5HX01BWAorQ09MTF9XRUlHSFRTX01BWCA9IDI1NQorRVhQUl9ORVNUX01BWCA9IF9QT1NJWDJfRVhQUl9ORVNUX01BWAorTElORV9NQVggPSBfUE9TSVgyX0xJTkVfTUFYCitDSEFSQ0xBU1NfTkFNRV9NQVggPSAyMDQ4CitSRV9EVVBfTUFYID0gKDB4N2ZmZikKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMveG9wZW5fbGltLmgKK19YT1BFTl9MSU1fSCA9IDEKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvc3RkaW9fbGltLmgKK0xfdG1wbmFtID0gMjAKK1RNUF9NQVggPSAyMzgzMjgKK0ZJTEVOQU1FX01BWCA9IDQwOTYKK0xfY3Rlcm1pZCA9IDkKK0xfY3VzZXJpZCA9IDkKK0ZPUEVOX01BWCA9IDE2CitJT1ZfTUFYID0gMTAyNAorX1hPUEVOX0lPVl9NQVggPSBfUE9TSVhfVUlPX01BWElPVgorTkxfQVJHTUFYID0gX1BPU0lYX0FSR19NQVgKK05MX0xBTkdNQVggPSBfUE9TSVgyX0xJTkVfTUFYCitOTF9NU0dNQVggPSBJTlRfTUFYCitOTF9OTUFYID0gSU5UX01BWAorTkxfU0VUTUFYID0gSU5UX01BWAorTkxfVEVYVE1BWCA9IElOVF9NQVgKK05aRVJPID0gMjAKK1dPUkRfQklUID0gMTYKK1dPUkRfQklUID0gMzIKK1dPUkRfQklUID0gNjQKK1dPUkRfQklUID0gMTYKK1dPUkRfQklUID0gMzIKK1dPUkRfQklUID0gNjQKK1dPUkRfQklUID0gMzIKK0xPTkdfQklUID0gMzIKK0xPTkdfQklUID0gNjQKK0xPTkdfQklUID0gMzIKK0xPTkdfQklUID0gNjQKK0xPTkdfQklUID0gNjQKK0xPTkdfQklUID0gMzIKK2Zyb20gVFlQRVMgaW1wb3J0ICoKK1BGX1VOU1BFQyA9IDAKK1BGX0xPQ0FMID0gMQorUEZfVU5JWCA9IFBGX0xPQ0FMCitQRl9GSUxFID0gUEZfTE9DQUwKK1BGX0lORVQgPSAyCitQRl9BWDI1ID0gMworUEZfSVBYID0gNAorUEZfQVBQTEVUQUxLID0gNQorUEZfTkVUUk9NID0gNgorUEZfQlJJREdFID0gNworUEZfQVRNUFZDID0gOAorUEZfWDI1ID0gOQorUEZfSU5FVDYgPSAxMAorUEZfUk9TRSA9IDExCitQRl9ERUNuZXQgPSAxMgorUEZfTkVUQkVVSSA9IDEzCitQRl9TRUNVUklUWSA9IDE0CitQRl9LRVkgPSAxNQorUEZfTkVUTElOSyA9IDE2CitQRl9ST1VURSA9IFBGX05FVExJTksKK1BGX1BBQ0tFVCA9IDE3CitQRl9BU0ggPSAxOAorUEZfRUNPTkVUID0gMTkKK1BGX0FUTVNWQyA9IDIwCitQRl9TTkEgPSAyMgorUEZfSVJEQSA9IDIzCitQRl9QUFBPWCA9IDI0CitQRl9XQU5QSVBFID0gMjUKK1BGX0JMVUVUT09USCA9IDMxCitQRl9NQVggPSAzMgorQUZfVU5TUEVDID0gUEZfVU5TUEVDCitBRl9MT0NBTCA9IFBGX0xPQ0FMCitBRl9VTklYID0gUEZfVU5JWAorQUZfRklMRSA9IFBGX0ZJTEUKK0FGX0lORVQgPSBQRl9JTkVUCitBRl9BWDI1ID0gUEZfQVgyNQorQUZfSVBYID0gUEZfSVBYCitBRl9BUFBMRVRBTEsgPSBQRl9BUFBMRVRBTEsKK0FGX05FVFJPTSA9IFBGX05FVFJPTQorQUZfQlJJREdFID0gUEZfQlJJREdFCitBRl9BVE1QVkMgPSBQRl9BVE1QVkMKK0FGX1gyNSA9IFBGX1gyNQorQUZfSU5FVDYgPSBQRl9JTkVUNgorQUZfUk9TRSA9IFBGX1JPU0UKK0FGX0RFQ25ldCA9IFBGX0RFQ25ldAorQUZfTkVUQkVVSSA9IFBGX05FVEJFVUkKK0FGX1NFQ1VSSVRZID0gUEZfU0VDVVJJVFkKK0FGX0tFWSA9IFBGX0tFWQorQUZfTkVUTElOSyA9IFBGX05FVExJTksKK0FGX1JPVVRFID0gUEZfUk9VVEUKK0FGX1BBQ0tFVCA9IFBGX1BBQ0tFVAorQUZfQVNIID0gUEZfQVNICitBRl9FQ09ORVQgPSBQRl9FQ09ORVQKK0FGX0FUTVNWQyA9IFBGX0FUTVNWQworQUZfU05BID0gUEZfU05BCitBRl9JUkRBID0gUEZfSVJEQQorQUZfUFBQT1ggPSBQRl9QUFBPWAorQUZfV0FOUElQRSA9IFBGX1dBTlBJUEUKK0FGX0JMVUVUT09USCA9IFBGX0JMVUVUT09USAorQUZfTUFYID0gUEZfTUFYCitTT0xfUkFXID0gMjU1CitTT0xfREVDTkVUID0gMjYxCitTT0xfWDI1ID0gMjYyCitTT0xfUEFDS0VUID0gMjYzCitTT0xfQVRNID0gMjY0CitTT0xfQUFMID0gMjY1CitTT0xfSVJEQSA9IDI2NgorU09NQVhDT05OID0gMTI4CisKKyMgSW5jbHVkZWQgZnJvbSBiaXRzL3NvY2thZGRyLmgKK19CSVRTX1NPQ0tBRERSX0ggPSAxCitkZWYgX19TT0NLQUREUl9DT01NT04oc2FfcHJlZml4KTogcmV0dXJuIFwKKworX1NTX1NJWkUgPSAxMjgKK2RlZiBDTVNHX0ZJUlNUSERSKG1oZHIpOiByZXR1cm4gXAorCisKKyMgSW5jbHVkZWQgZnJvbSBhc20vc29ja2V0LmgKKworIyBJbmNsdWRlZCBmcm9tIGFzbS9zb2NraW9zLmgKK0ZJT1NFVE9XTiA9IDB4ODkwMQorU0lPQ1NQR1JQID0gMHg4OTAyCitGSU9HRVRPV04gPSAweDg5MDMKK1NJT0NHUEdSUCA9IDB4ODkwNAorU0lPQ0FUTUFSSyA9IDB4ODkwNQorU0lPQ0dTVEFNUCA9IDB4ODkwNgorU09MX1NPQ0tFVCA9IDEKK1NPX0RFQlVHID0gMQorU09fUkVVU0VBRERSID0gMgorU09fVFlQRSA9IDMKK1NPX0VSUk9SID0gNAorU09fRE9OVFJPVVRFID0gNQorU09fQlJPQURDQVNUID0gNgorU09fU05EQlVGID0gNworU09fUkNWQlVGID0gOAorU09fS0VFUEFMSVZFID0gOQorU09fT09CSU5MSU5FID0gMTAKK1NPX05PX0NIRUNLID0gMTEKK1NPX1BSSU9SSVRZID0gMTIKK1NPX0xJTkdFUiA9IDEzCitTT19CU0RDT01QQVQgPSAxNAorU09fUEFTU0NSRUQgPSAxNgorU09fUEVFUkNSRUQgPSAxNworU09fUkNWTE9XQVQgPSAxOAorU09fU05ETE9XQVQgPSAxOQorU09fUkNWVElNRU8gPSAyMAorU09fU05EVElNRU8gPSAyMQorU09fU0VDVVJJVFlfQVVUSEVOVElDQVRJT04gPSAyMgorU09fU0VDVVJJVFlfRU5DUllQVElPTl9UUkFOU1BPUlQgPSAyMworU09fU0VDVVJJVFlfRU5DUllQVElPTl9ORVRXT1JLID0gMjQKK1NPX0JJTkRUT0RFVklDRSA9IDI1CitTT19BVFRBQ0hfRklMVEVSID0gMjYKK1NPX0RFVEFDSF9GSUxURVIgPSAyNworU09fUEVFUk5BTUUgPSAyOAorU09fVElNRVNUQU1QID0gMjkKK1NDTV9USU1FU1RBTVAgPSBTT19USU1FU1RBTVAKK1NPX0FDQ0VQVENPTk4gPSAzMAorU09DS19TVFJFQU0gPSAxCitTT0NLX0RHUkFNID0gMgorU09DS19SQVcgPSAzCitTT0NLX1JETSA9IDQKK1NPQ0tfU0VRUEFDS0VUID0gNQorU09DS19QQUNLRVQgPSAxMAorU09DS19NQVggPSAoU09DS19QQUNLRVQrMSkKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvaW4uaAorSVBfVE9TID0gMQorSVBfVFRMID0gMgorSVBfSERSSU5DTCA9IDMKK0lQX09QVElPTlMgPSA0CitJUF9ST1VURVJfQUxFUlQgPSA1CitJUF9SRUNWT1BUUyA9IDYKK0lQX1JFVE9QVFMgPSA3CitJUF9QS1RJTkZPID0gOAorSVBfUEtUT1BUSU9OUyA9IDkKK0lQX1BNVFVESVNDID0gMTAKK0lQX01UVV9ESVNDT1ZFUiA9IDEwCitJUF9SRUNWRVJSID0gMTEKK0lQX1JFQ1ZUVEwgPSAxMgorSVBfUkVDVlRPUyA9IDEzCitJUF9NVUxUSUNBU1RfSUYgPSAzMgorSVBfTVVMVElDQVNUX1RUTCA9IDMzCitJUF9NVUxUSUNBU1RfTE9PUCA9IDM0CitJUF9BRERfTUVNQkVSU0hJUCA9IDM1CitJUF9EUk9QX01FTUJFUlNISVAgPSAzNgorSVBfUkVDVlJFVE9QVFMgPSBJUF9SRVRPUFRTCitJUF9QTVRVRElTQ19ET05UID0gMAorSVBfUE1UVURJU0NfV0FOVCA9IDEKK0lQX1BNVFVESVNDX0RPID0gMgorU09MX0lQID0gMAorSVBfREVGQVVMVF9NVUxUSUNBU1RfVFRMID0gMQorSVBfREVGQVVMVF9NVUxUSUNBU1RfTE9PUCA9IDEKK0lQX01BWF9NRU1CRVJTSElQUyA9IDIwCitJUFY2X0FERFJGT1JNID0gMQorSVBWNl9QS1RJTkZPID0gMgorSVBWNl9IT1BPUFRTID0gMworSVBWNl9EU1RPUFRTID0gNAorSVBWNl9SVEhEUiA9IDUKK0lQVjZfUEtUT1BUSU9OUyA9IDYKK0lQVjZfQ0hFQ0tTVU0gPSA3CitJUFY2X0hPUExJTUlUID0gOAorSVBWNl9ORVhUSE9QID0gOQorSVBWNl9BVVRISERSID0gMTAKK0lQVjZfVU5JQ0FTVF9IT1BTID0gMTYKK0lQVjZfTVVMVElDQVNUX0lGID0gMTcKK0lQVjZfTVVMVElDQVNUX0hPUFMgPSAxOAorSVBWNl9NVUxUSUNBU1RfTE9PUCA9IDE5CitJUFY2X0pPSU5fR1JPVVAgPSAyMAorSVBWNl9MRUFWRV9HUk9VUCA9IDIxCitJUFY2X1JPVVRFUl9BTEVSVCA9IDIyCitJUFY2X01UVV9ESVNDT1ZFUiA9IDIzCitJUFY2X01UVSA9IDI0CitJUFY2X1JFQ1ZFUlIgPSAyNQorSVBWNl9SWEhPUE9QVFMgPSBJUFY2X0hPUE9QVFMKK0lQVjZfUlhEU1RPUFRTID0gSVBWNl9EU1RPUFRTCitJUFY2X0FERF9NRU1CRVJTSElQID0gSVBWNl9KT0lOX0dST1VQCitJUFY2X0RST1BfTUVNQkVSU0hJUCA9IElQVjZfTEVBVkVfR1JPVVAKK0lQVjZfUE1UVURJU0NfRE9OVCA9IDAKK0lQVjZfUE1UVURJU0NfV0FOVCA9IDEKK0lQVjZfUE1UVURJU0NfRE8gPSAyCitTT0xfSVBWNiA9IDQxCitTT0xfSUNNUFY2ID0gNTgKK0lQVjZfUlRIRFJfTE9PU0UgPSAwCitJUFY2X1JUSERSX1NUUklDVCA9IDEKK0lQVjZfUlRIRFJfVFlQRV8wID0gMAorCisjIEluY2x1ZGVkIGZyb20gZW5kaWFuLmgKK19FTkRJQU5fSCA9IDEKK19fTElUVExFX0VORElBTiA9IDEyMzQKK19fQklHX0VORElBTiA9IDQzMjEKK19fUERQX0VORElBTiA9IDM0MTIKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvZW5kaWFuLmgKK19fQllURV9PUkRFUiA9IF9fTElUVExFX0VORElBTgorX19GTE9BVF9XT1JEX09SREVSID0gX19CWVRFX09SREVSCitMSVRUTEVfRU5ESUFOID0gX19MSVRUTEVfRU5ESUFOCitCSUdfRU5ESUFOID0gX19CSUdfRU5ESUFOCitQRFBfRU5ESUFOID0gX19QRFBfRU5ESUFOCitCWVRFX09SREVSID0gX19CWVRFX09SREVSCisKKyMgSW5jbHVkZWQgZnJvbSBiaXRzL2J5dGVzd2FwLmgKK19CSVRTX0JZVEVTV0FQX0ggPSAxCitkZWYgX19ic3dhcF9jb25zdGFudF8xNih4KTogcmV0dXJuIFwKKworZGVmIF9fYnN3YXBfMTYoeCk6IHJldHVybiBcCisKK2RlZiBfX2Jzd2FwXzE2KHgpOiByZXR1cm4gX19ic3dhcF9jb25zdGFudF8xNiAoeCkKKworZGVmIF9fYnN3YXBfY29uc3RhbnRfMzIoeCk6IHJldHVybiBcCisKK2RlZiBfX2Jzd2FwXzMyKHgpOiByZXR1cm4gXAorCitkZWYgX19ic3dhcF8zMih4KTogcmV0dXJuIFwKKworZGVmIF9fYnN3YXBfMzIoeCk6IHJldHVybiBfX2Jzd2FwX2NvbnN0YW50XzMyICh4KQorCitkZWYgX19ic3dhcF9jb25zdGFudF82NCh4KTogcmV0dXJuIFwKKworZGVmIF9fYnN3YXBfNjQoeCk6IHJldHVybiBcCisKK2RlZiBudG9obCh4KTogcmV0dXJuICh4KQorCitkZWYgbnRvaHMoeCk6IHJldHVybiAoeCkKKworZGVmIGh0b25sKHgpOiByZXR1cm4gKHgpCisKK2RlZiBodG9ucyh4KTogcmV0dXJuICh4KQorCitkZWYgbnRvaGwoeCk6IHJldHVybiBfX2Jzd2FwXzMyICh4KQorCitkZWYgbnRvaHMoeCk6IHJldHVybiBfX2Jzd2FwXzE2ICh4KQorCitkZWYgaHRvbmwoeCk6IHJldHVybiBfX2Jzd2FwXzMyICh4KQorCitkZWYgaHRvbnMoeCk6IHJldHVybiBfX2Jzd2FwXzE2ICh4KQorCitkZWYgSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9MT09QQkFDSyhhKTogcmV0dXJuIFwKKworZGVmIElONl9JU19BRERSX0xJTktMT0NBTChhKTogcmV0dXJuIFwKKworZGVmIElONl9JU19BRERSX1NJVEVMT0NBTChhKTogcmV0dXJuIFwKKworZGVmIElONl9JU19BRERSX1Y0TUFQUEVEKGEpOiByZXR1cm4gXAorCitkZWYgSU42X0lTX0FERFJfVjRDT01QQVQoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19OT0RFTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19MSU5LTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19TSVRFTE9DQUwoYSk6IHJldHVybiBcCisKK2RlZiBJTjZfSVNfQUREUl9NQ19PUkdMT0NBTChhKTogcmV0dXJuIFwKKworZGVmIElONl9JU19BRERSX01DX0dMT0JBTChhKTogcmV0dXJuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0lOLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvSU4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDI4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0lOLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0lOLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvSU4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MDI4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL0lOLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL1RZUEVTLnB5IGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9UWVBFUy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2RkNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9UWVBFUy5weQpAQCAtMCwwICsxLDE3MCBAQAorIyBHZW5lcmF0ZWQgYnkgaDJweSBmcm9tIC91c3IvaW5jbHVkZS9zeXMvdHlwZXMuaAorX1NZU19UWVBFU19IID0gMQorCisjIEluY2x1ZGVkIGZyb20gZmVhdHVyZXMuaAorX0ZFQVRVUkVTX0ggPSAxCitfX1VTRV9BTlNJID0gMQorX19GQVZPUl9CU0QgPSAxCitfSVNPQzk5X1NPVVJDRSA9IDEKK19QT1NJWF9TT1VSQ0UgPSAxCitfUE9TSVhfQ19TT1VSQ0UgPSAxOTk1MDZMCitfWE9QRU5fU09VUkNFID0gNjAwCitfWE9QRU5fU09VUkNFX0VYVEVOREVEID0gMQorX0xBUkdFRklMRTY0X1NPVVJDRSA9IDEKK19CU0RfU09VUkNFID0gMQorX1NWSURfU09VUkNFID0gMQorX0JTRF9TT1VSQ0UgPSAxCitfU1ZJRF9TT1VSQ0UgPSAxCitfX1VTRV9JU09DOTkgPSAxCitfUE9TSVhfU09VUkNFID0gMQorX1BPU0lYX0NfU09VUkNFID0gMgorX1BPU0lYX0NfU09VUkNFID0gMTk5NTA2TAorX19VU0VfUE9TSVggPSAxCitfX1VTRV9QT1NJWDIgPSAxCitfX1VTRV9QT1NJWDE5OTMwOSA9IDEKK19fVVNFX1BPU0lYMTk5NTA2ID0gMQorX19VU0VfWE9QRU4gPSAxCitfX1VTRV9YT1BFTl9FWFRFTkRFRCA9IDEKK19fVVNFX1VOSVg5OCA9IDEKK19MQVJHRUZJTEVfU09VUkNFID0gMQorX19VU0VfWE9QRU4ySyA9IDEKK19fVVNFX0lTT0M5OSA9IDEKK19fVVNFX1hPUEVOX0VYVEVOREVEID0gMQorX19VU0VfTEFSR0VGSUxFID0gMQorX19VU0VfTEFSR0VGSUxFNjQgPSAxCitfX1VTRV9GSUxFX09GRlNFVDY0ID0gMQorX19VU0VfTUlTQyA9IDEKK19fVVNFX0JTRCA9IDEKK19fVVNFX1NWSUQgPSAxCitfX1VTRV9HTlUgPSAxCitfX1VTRV9SRUVOVFJBTlQgPSAxCitfX1NURENfSUVDXzU1OV9fID0gMQorX19TVERDX0lFQ181NTlfQ09NUExFWF9fID0gMQorX19TVERDX0lTT18xMDY0Nl9fID0gMjAwMDA5TAorX19HTlVfTElCUkFSWV9fID0gNgorX19HTElCQ19fID0gMgorX19HTElCQ19NSU5PUl9fID0gMgorCisjIEluY2x1ZGVkIGZyb20gc3lzL2NkZWZzLmgKK19TWVNfQ0RFRlNfSCA9IDEKK2RlZiBfX1BNVChhcmdzKTogcmV0dXJuIGFyZ3MKKworZGVmIF9fUChhcmdzKTogcmV0dXJuIGFyZ3MKKworZGVmIF9fUE1UKGFyZ3MpOiByZXR1cm4gYXJncworCitkZWYgX19TVFJJTkcoeCk6IHJldHVybiAjeAorCitfX2ZsZXhhcnIgPSBbXQorX19mbGV4YXJyID0gWzBdCitfX2ZsZXhhcnIgPSBbXQorX19mbGV4YXJyID0gWzFdCitkZWYgX19BU01OQU1FKGNuYW1lKTogcmV0dXJuIF9fQVNNTkFNRTIgKF9fVVNFUl9MQUJFTF9QUkVGSVhfXywgY25hbWUpCisKK2RlZiBfX2F0dHJpYnV0ZV9fKHh5eik6IHJldHVybgorCitkZWYgX19hdHRyaWJ1dGVfZm9ybWF0X2FyZ19fKHgpOiByZXR1cm4gX19hdHRyaWJ1dGVfXyAoKF9fZm9ybWF0X2FyZ19fICh4KSkpCisKK2RlZiBfX2F0dHJpYnV0ZV9mb3JtYXRfYXJnX18oeCk6IHJldHVybgorCitfX1VTRV9MQVJHRUZJTEUgPSAxCitfX1VTRV9MQVJHRUZJTEU2NCA9IDEKK19fVVNFX0VYVEVSTl9JTkxJTkVTID0gMQorCisjIEluY2x1ZGVkIGZyb20gZ251L3N0dWJzLmgKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvdHlwZXMuaAorX0JJVFNfVFlQRVNfSCA9IDEKK19fRkRfU0VUU0laRSA9IDEwMjQKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvcHRocmVhZHR5cGVzLmgKK19CSVRTX1BUSFJFQURUWVBFU19IID0gMQorCisjIEluY2x1ZGVkIGZyb20gYml0cy9zY2hlZC5oCitTQ0hFRF9PVEhFUiA9IDAKK1NDSEVEX0ZJRk8gPSAxCitTQ0hFRF9SUiA9IDIKK0NTSUdOQUwgPSAweDAwMDAwMGZmCitDTE9ORV9WTSA9IDB4MDAwMDAxMDAKK0NMT05FX0ZTID0gMHgwMDAwMDIwMAorQ0xPTkVfRklMRVMgPSAweDAwMDAwNDAwCitDTE9ORV9TSUdIQU5EID0gMHgwMDAwMDgwMAorQ0xPTkVfUElEID0gMHgwMDAwMTAwMAorQ0xPTkVfUFRSQUNFID0gMHgwMDAwMjAwMAorQ0xPTkVfVkZPUksgPSAweDAwMDA0MDAwCitfX2RlZmluZWRfc2NoZWRwYXJhbSA9IDEKKworIyBJbmNsdWRlZCBmcm9tIHRpbWUuaAorX1RJTUVfSCA9IDEKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvdGltZS5oCitfQklUU19USU1FX0ggPSAxCitDTE9DS1NfUEVSX1NFQyA9IDEwMDAwMDBsCitDTE9DS19SRUFMVElNRSA9IDAKK0NMT0NLX1BST0NFU1NfQ1BVVElNRV9JRCA9IDIKK0NMT0NLX1RIUkVBRF9DUFVUSU1FX0lEID0gMworVElNRVJfQUJTVElNRSA9IDEKK19TVFJVQ1RfVElNRVZBTCA9IDEKK0NMS19UQ0sgPSBDTE9DS1NfUEVSX1NFQworX19jbG9ja190X2RlZmluZWQgPSAxCitfX3RpbWVfdF9kZWZpbmVkID0gMQorX19jbG9ja2lkX3RfZGVmaW5lZCA9IDEKK19fdGltZXJfdF9kZWZpbmVkID0gMQorX190aW1lc3BlY19kZWZpbmVkID0gMQorZGVmIF9faXNsZWFwKHllYXIpOiByZXR1cm4gXAorCitfX0JJVF9UWVBFU19ERUZJTkVEX18gPSAxCisKKyMgSW5jbHVkZWQgZnJvbSBlbmRpYW4uaAorX0VORElBTl9IID0gMQorX19MSVRUTEVfRU5ESUFOID0gMTIzNAorX19CSUdfRU5ESUFOID0gNDMyMQorX19QRFBfRU5ESUFOID0gMzQxMgorCisjIEluY2x1ZGVkIGZyb20gYml0cy9lbmRpYW4uaAorX19CWVRFX09SREVSID0gX19MSVRUTEVfRU5ESUFOCitfX0ZMT0FUX1dPUkRfT1JERVIgPSBfX0JZVEVfT1JERVIKK0xJVFRMRV9FTkRJQU4gPSBfX0xJVFRMRV9FTkRJQU4KK0JJR19FTkRJQU4gPSBfX0JJR19FTkRJQU4KK1BEUF9FTkRJQU4gPSBfX1BEUF9FTkRJQU4KK0JZVEVfT1JERVIgPSBfX0JZVEVfT1JERVIKKworIyBJbmNsdWRlZCBmcm9tIHN5cy9zZWxlY3QuaAorX1NZU19TRUxFQ1RfSCA9IDEKKworIyBJbmNsdWRlZCBmcm9tIGJpdHMvc2VsZWN0LmgKK2RlZiBfX0ZEX1pFUk8oZmRzcCk6IHJldHVybiBcCisKK2RlZiBfX0ZEX1pFUk8oc2V0KTogcmV0dXJuIFwKKworCisjIEluY2x1ZGVkIGZyb20gYml0cy9zaWdzZXQuaAorX1NJR1NFVF9IX3R5cGVzID0gMQorX1NJR1NFVF9IX2ZucyA9IDEKK2RlZiBfX3NpZ21hc2soc2lnKTogcmV0dXJuIFwKKworZGVmIF9fc2lnZW1wdHlzZXQoc2V0KTogcmV0dXJuIFwKKworZGVmIF9fc2lnZmlsbHNldChzZXQpOiByZXR1cm4gXAorCitkZWYgX19zaWdpc2VtcHR5c2V0KHNldCk6IHJldHVybiBcCisKK2RlZiBfX0ZERUxUKGQpOiByZXR1cm4gKChkKSAvIF9fTkZEQklUUykKKworRkRfU0VUU0laRSA9IF9fRkRfU0VUU0laRQorZGVmIEZEX1pFUk8oZmRzZXRwKTogcmV0dXJuIF9fRkRfWkVSTyAoZmRzZXRwKQorCisKKyMgSW5jbHVkZWQgZnJvbSBzeXMvc3lzbWFjcm9zLmgKK19TWVNfU1lTTUFDUk9TX0ggPSAxCitkZWYgbWFqb3IoZGV2KTogcmV0dXJuICgoaW50KSgoKGRldikgPj4gOCkgJiAweGZmKSkKKworZGVmIG1pbm9yKGRldik6IHJldHVybiAoKGludCkoKGRldikgJiAweGZmKSkKKworZGVmIG1ham9yKGRldik6IHJldHVybiAoKChkZXYpLl9fdmFsWzFdID4+IDgpICYgMHhmZikKKworZGVmIG1pbm9yKGRldik6IHJldHVybiAoKGRldikuX192YWxbMV0gJiAweGZmKQorCitkZWYgbWFqb3IoZGV2KTogcmV0dXJuICgoKGRldikuX192YWxbMF0gPj4gOCkgJiAweGZmKQorCitkZWYgbWlub3IoZGV2KTogcmV0dXJuICgoZGV2KS5fX3ZhbFswXSAmIDB4ZmYpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL1RZUEVTLnB5YyBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvVFlQRVMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjRjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL1RZUEVTLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL1RZUEVTLnB5byBiL2xpYi9weXRob24yLjcvcGxhdC1saW51eDIvVFlQRVMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYjRjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL1RZUEVTLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BsYXQtbGludXgyL3JlZ2VuIGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9yZWdlbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNzY5NTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wbGF0LWxpbnV4Mi9yZWdlbgpAQCAtMCwwICsxLDggQEAKKyMhIC9iaW4vc2gKK2Nhc2UgYHVuYW1lYCBpbgorTGludXgqKQk7OworKikJZWNobyBQcm9iYWJseSBub3Qgb24gYSBMaW51eCBzeXN0ZW0gMT4mMgorCWV4aXQgMTs7Citlc2FjCitzZXQgLXYKK2gycHkgLWkgJyh1X2xvbmcpJyAvdXNyL2luY2x1ZGUvc3lzL3R5cGVzLmggL3Vzci9pbmNsdWRlL25ldGluZXQvaW4uaCAvdXNyL2luY2x1ZGUvZGxmY24uaApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weSBiL2xpYi9weXRob24yLjcvcGxhdGZvcm0ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzAwMTZhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdGZvcm0ucHkKQEAgLTAsMCArMSwxNjQyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKworIiIiIFRoaXMgbW9kdWxlIHRyaWVzIHRvIHJldHJpZXZlIGFzIG11Y2ggcGxhdGZvcm0taWRlbnRpZnlpbmcgZGF0YSBhcworICAgIHBvc3NpYmxlLiBJdCBtYWtlcyB0aGlzIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB2aWEgZnVuY3Rpb24gQVBJcy4KKworICAgIElmIGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGl0IHByaW50cyB0aGUgcGxhdGZvcm0KKyAgICBpbmZvcm1hdGlvbiBjb25jYXRlbmF0ZWQgYXMgc2luZ2xlIHN0cmluZyB0byBzdGRvdXQuIFRoZSBvdXRwdXQKKyAgICBmb3JtYXQgaXMgdXNlYWJsZSBhcyBwYXJ0IG9mIGEgZmlsZW5hbWUuCisKKyIiIgorIyAgICBUaGlzIG1vZHVsZSBpcyBtYWludGFpbmVkIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyA8bWFsQGVnZW5peC5jb20+LgorIyAgICBJZiB5b3UgZmluZCBwcm9ibGVtcywgcGxlYXNlIHN1Ym1pdCBidWcgcmVwb3J0cy9wYXRjaGVzIHZpYSB0aGUKKyMgICAgUHl0aG9uIGJ1ZyB0cmFja2VyIChodHRwOi8vYnVncy5weXRob24ub3JnKSBhbmQgYXNzaWduIHRoZW0gdG8gImxlbWJ1cmciLgorIworIyAgICBOb3RlOiBQbGVhc2Uga2VlcCB0aGlzIG1vZHVsZSBjb21wYXRpYmxlIHRvIFB5dGhvbiAxLjUuMi4KKyMKKyMgICAgU3RpbGwgbmVlZGVkOgorIyAgICAqIG1vcmUgc3VwcG9ydCBmb3IgV2luQ0UKKyMgICAgKiBzdXBwb3J0IGZvciBNUy1ET1MgKFB5dGhvbkRYID8pCisjICAgICogc3VwcG9ydCBmb3IgQW1pZ2EgYW5kIG90aGVyIHN0aWxsIHVuc3VwcG9ydGVkIHBsYXRmb3JtcyBydW5uaW5nIFB5dGhvbgorIyAgICAqIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgTGludXggZGlzdHJpYnV0aW9ucworIworIyAgICBNYW55IHRoYW5rcyB0byBhbGwgdGhvc2Ugd2hvIGhlbHBlZCBhZGRpbmcgcGxhdGZvcm0tc3BlY2lmaWMKKyMgICAgY2hlY2tzIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKToKKyMKKyMgICAgICBDaGFybGVzIEcgV2FsZG1hbiwgRGF2aWQgQXJub2xkLCBHb3Jkb24gTWNNaWxsYW4sIEJlbiBEYXJuZWxsLAorIyAgICAgIEplZmYgQmF1ZXIsIENsaWZmIENyYXdmb3JkLCBJdmFuIFZhbiBMYW5pbmdoYW0sIEpvc2VmCisjICAgICAgQmV0YW5jb3VydCwgUmFuZGFsbCBIb3BwZXIsIEthcmwgUHV0bGFuZCwgSm9obiBGYXJyZWxsLCBHcmVnCisjICAgICAgQW5kcnVrLCBKdXN0IHZhbiBSb3NzdW0sIFRob21hcyBIZWxsZXIsIE1hcmsgUi4gTGV2aW5zb24sIE1hcmsKKyMgICAgICBIYW1tb25kLCBCaWxsIFR1dHQsIEhhbnMgTm93YWssIFV3ZSBaZXNzaW4gKE9wZW5WTVMgc3VwcG9ydCksCisjICAgICAgQ29saW4gS29uZywgVHJlbnQgTWljaywgR3VpZG8gdmFuIFJvc3N1bSwgQW50aG9ueSBCYXh0ZXIKKyMKKyMgICAgSGlzdG9yeToKKyMKKyMgICAgPHNlZSBDVlMgYW5kIFNWTiBjaGVja2luIG1lc3NhZ2VzIGZvciBoaXN0b3J5PgorIworIyAgICAxLjAuNyAtIGFkZGVkIERFVl9OVUxMCisjICAgIDEuMC42IC0gYWRkZWQgbGludXhfZGlzdHJpYnV0aW9uKCkKKyMgICAgMS4wLjUgLSBmaXhlZCBKYXZhIHN1cHBvcnQgdG8gYWxsb3cgcnVubmluZyB0aGUgbW9kdWxlIG9uIEp5dGhvbgorIyAgICAxLjAuNCAtIGFkZGVkIElyb25QeXRob24gc3VwcG9ydAorIyAgICAxLjAuMyAtIGFkZGVkIG5vcm1hbGl6YXRpb24gb2YgV2luZG93cyBzeXN0ZW0gbmFtZQorIyAgICAxLjAuMiAtIGFkZGVkIG1vcmUgV2luZG93cyBzdXBwb3J0CisjICAgIDEuMC4xIC0gcmVmb3JtYXR0ZWQgdG8gbWFrZSBkb2MucHkgaGFwcHkKKyMgICAgMS4wLjAgLSByZWZvcm1hdHRlZCBhIGJpdCBhbmQgY2hlY2tlZCBpbnRvIFB5dGhvbiBDVlMKKyMgICAgMC44LjAgLSBhZGRlZCBzeXMudmVyc2lvbiBwYXJzZXIgYW5kIHZhcmlvdXMgbmV3IGFjY2VzcworIyAgICAgICAgICAgIEFQSXMgKHB5dGhvbl92ZXJzaW9uKCksIHB5dGhvbl9jb21waWxlcigpLCBldGMuKQorIyAgICAwLjcuMiAtIGZpeGVkIGFyY2hpdGVjdHVyZSgpIHRvIHVzZSBzaXplb2YocG9pbnRlcikgd2hlcmUgYXZhaWxhYmxlCisjICAgIDAuNy4xIC0gYWRkZWQgc3VwcG9ydCBmb3IgQ2FsZGVyYSBPcGVuTGludXgKKyMgICAgMC43LjAgLSBzb21lIGZpeGVzIGZvciBXaW5DRTsgdW50YWJpZmllZCB0aGUgc291cmNlIGZpbGUKKyMgICAgMC42LjIgLSBzdXBwb3J0IGZvciBPcGVuVk1TIC0gcmVxdWlyZXMgdmVyc2lvbiAxLjUuMi1WMDA2IG9yIGhpZ2hlciBhbmQKKyMgICAgICAgICAgICB2bXNfbGliLmdldHN5aSgpIGNvbmZpZ3VyZWQKKyMgICAgMC42LjEgLSBhZGRlZCBjb2RlIHRvIHByZXZlbnQgJ3VuYW1lIC1wJyBvbiBwbGF0Zm9ybXMgd2hpY2ggYXJlCisjICAgICAgICAgICAga25vd24gbm90IHRvIHN1cHBvcnQgaXQKKyMgICAgMC42LjAgLSBmaXhlZCB3aW4zMl92ZXIoKSB0byBob3BlZnVsbHkgd29yayBvbiBXaW45NSw5OCxOVCBhbmQgV2luMms7CisjICAgICAgICAgICAgZGlkIHNvbWUgY2xlYW51cCBvZiB0aGUgaW50ZXJmYWNlcyAtIHNvbWUgQVBJcyBoYXZlIGNoYW5nZWQKKyMgICAgMC41LjUgLSBmaXhlZCBhbm90aGVyIHR5cGUgaW4gdGhlIE1hY09TIGNvZGUuLi4gc2hvdWxkIGhhdmUKKyMgICAgICAgICAgICB1c2VkIG1vcmUgY29mZmVlIHRvZGF5IDstKQorIyAgICAwLjUuNCAtIGZpeGVkIGEgZmV3IHR5cG9zIGluIHRoZSBNYWNPUyBjb2RlCisjICAgIDAuNS4zIC0gYWRkZWQgZXhwZXJpbWVudGFsIE1hY09TIHN1cHBvcnQ7IGFkZGVkIGJldHRlciBwb3BlbigpCisjICAgICAgICAgICAgd29ya2Fyb3VuZHMgaW4gX3N5c2NtZF92ZXIoKSAtLSBzdGlsbCBub3QgMTAwJSBlbGVnYW50CisjICAgICAgICAgICAgdGhvdWdoCisjICAgIDAuNS4yIC0gZml4ZWQgdW5hbWUoKSB0byByZXR1cm4gJycgaW5zdGVhZCBvZiAndW5rbm93bicgaW4gYWxsCisjICAgICAgICAgICAgcmV0dXJuIHZhbHVlcyAodGhlIHN5c3RlbSB1bmFtZSBjb21tYW5kIHRlbmRzIHRvIHJldHVybgorIyAgICAgICAgICAgICd1bmtub3duJyBpbnN0ZWFkIG9mIGp1c3QgbGVhdmluZyB0aGUgZmllbGQgZW10cHkpCisjICAgIDAuNS4xIC0gaW5jbHVkZWQgY29kZSBmb3Igc2xhY2t3YXJlIGRpc3Q7IGFkZGVkIGV4Y2VwdGlvbiBoYW5kbGVycworIyAgICAgICAgICAgIHRvIGNvdmVyIHVwIHNpdHVhdGlvbnMgd2hlcmUgcGxhdGZvcm1zIGRvbid0IGhhdmUgb3MucG9wZW4KKyMgICAgICAgICAgICAoZS5nLiBNYWMpIG9yIGZhaWwgb24gc29ja2V0LmdldGhvc3RuYW1lKCk7IGZpeGVkIGxpYmMKKyMgICAgICAgICAgICBkZXRlY3Rpb24gUkUKKyMgICAgMC41LjAgLSBjaGFuZ2VkIHRoZSBBUEkgbmFtZXMgcmVmZXJyaW5nIHRvIHN5c3RlbSBjb21tYW5kcyB0byAqc3lzY21kKjsKKyMgICAgICAgICAgICBhZGRlZCBqYXZhX3ZlcigpOyBtYWRlIHN5c2NtZF92ZXIoKSBhIHByaXZhdGUKKyMgICAgICAgICAgICBBUEkgKHdhcyBzeXN0ZW1fdmVyKCkgaW4gcHJldmlvdXMgdmVyc2lvbnMpIC0tIHVzZSB1bmFtZSgpCisjICAgICAgICAgICAgaW5zdGVhZDsgZXh0ZW5kZWQgdGhlIHdpbjMyX3ZlcigpIHRvIGFsc28gcmV0dXJuIHByb2Nlc3NvcgorIyAgICAgICAgICAgIHR5cGUgaW5mb3JtYXRpb24KKyMgICAgMC40LjAgLSBhZGRlZCB3aW4zMl92ZXIoKSBhbmQgbW9kaWZpZWQgdGhlIHBsYXRmb3JtKCkgb3V0cHV0IGZvciBXaW5YWAorIyAgICAwLjMuNCAtIGZpeGVkIGEgYnVnIGluIF9mb2xsb3dfc3ltbGlua3MoKQorIyAgICAwLjMuMyAtIGZpeGVkIHBvcGVuKCkgYW5kICJmaWxlIiBjb21tYW5kIGludm9rYXRpb24gYnVncworIyAgICAwLjMuMiAtIGFkZGVkIGFyY2hpdGVjdHVyZSgpIEFQSSBhbmQgc3VwcG9ydCBmb3IgaXQgaW4gcGxhdGZvcm0oKQorIyAgICAwLjMuMSAtIGZpeGVkIHN5c2NtZF92ZXIoKSBSRSB0byBzdXBwb3J0IFdpbmRvd3MgTlQKKyMgICAgMC4zLjAgLSBhZGRlZCBzeXN0ZW0gYWxpYXMgc3VwcG9ydAorIyAgICAwLjIuMyAtIHJlbW92ZWQgJ3dpbmNlJyBhZ2Fpbi4uLiBvaCB3ZWxsLgorIyAgICAwLjIuMiAtIGFkZGVkICd3aW5jZScgdG8gc3lzY21kX3ZlcigpIHN1cHBvcnRlZCBwbGF0Zm9ybXMKKyMgICAgMC4yLjEgLSBhZGRlZCBjYWNoZSBsb2dpYyBhbmQgY2hhbmdlZCB0aGUgcGxhdGZvcm0gc3RyaW5nIGZvcm1hdAorIyAgICAwLjIuMCAtIGNoYW5nZWQgdGhlIEFQSSB0byB1c2UgZnVuY3Rpb25zIGluc3RlYWQgb2YgbW9kdWxlIGdsb2JhbHMKKyMgICAgICAgICAgICBzaW5jZSBzb21lIGFjdGlvbiB0YWtlIHRvbyBsb25nIHRvIGJlIHJ1biBvbiBtb2R1bGUgaW1wb3J0CisjICAgIDAuMS4wIC0gZmlyc3QgcmVsZWFzZQorIworIyAgICBZb3UgY2FuIGFsd2F5cyBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlIGF0OgorIworIyAgICAgICAgICAgICBodHRwOi8vd3d3LmVnZW5peC5jb20vZmlsZXMvcHl0aG9uL3BsYXRmb3JtLnB5CisjCisjICAgIElmIHRoYXQgVVJMIHNob3VsZCBmYWlsLCB0cnkgY29udGFjdGluZyB0aGUgYXV0aG9yLgorCitfX2NvcHlyaWdodF9fID0gIiIiCisgICAgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDAsIE1hcmMtQW5kcmUgTGVtYnVyZzsgbWFpbHRvOm1hbEBsZW1idXJnLmNvbQorICAgIENvcHlyaWdodCAoYykgMjAwMC0yMDEwLCBlR2VuaXguY29tIFNvZnR3YXJlIEdtYkg7IG1haWx0bzppbmZvQGVnZW5peC5jb20KKworICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICAgIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBvciByb3lhbHR5IGlzIGhlcmVieSBncmFudGVkLAorICAgIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyAgICBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KKyAgICBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24gb3IgcG9ydGlvbnMgdGhlcmVvZiwgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbnMsCisgICAgdGhhdCB5b3UgbWFrZS4KKworICAgIEVHRU5JWC5DT00gU09GVFdBUkUgR01CSCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KKyAgICBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ECisgICAgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLAorICAgIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORworICAgIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgICAgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KKyAgICBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRSAhCisKKyIiIgorCitfX3ZlcnNpb25fXyA9ICcxLjAuNycKKworaW1wb3J0IHN5cyxzdHJpbmcsb3MscmUKKworIyMjIEdsb2JhbHMgJiBDb25zdGFudHMKKworIyBEZXRlcm1pbmUgdGhlIHBsYXRmb3JtJ3MgL2Rldi9udWxsIGRldmljZQordHJ5OgorICAgIERFVl9OVUxMID0gb3MuZGV2bnVsbAorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICMgb3MuZGV2bnVsbCB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuNCwgc28gZW11bGF0ZSBpdCBmb3IgZWFybGllcgorICAgICMgUHl0aG9uIHZlcnNpb25zCisgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnZG9zJywnd2luMzInLCd3aW4xNicsJ29zMicpOgorICAgICAgICAjIFVzZSB0aGUgb2xkIENQL00gTlVMIGFzIGRldmljZSBuYW1lCisgICAgICAgIERFVl9OVUxMID0gJ05VTCcKKyAgICBlbHNlOgorICAgICAgICAjIFN0YW5kYXJkIFVuaXggdXNlcyAvZGV2L251bGwKKyAgICAgICAgREVWX05VTEwgPSAnL2Rldi9udWxsJworCisjIyMgUGxhdGZvcm0gc3BlY2lmaWMgQVBJcworCitfbGliY19zZWFyY2ggPSByZS5jb21waWxlKHInKF9fbGliY19pbml0KScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCisgICAgICAgICAgICAgICAgICAgICAgICAgICcoR0xJQkNfKFswLTkuXSspKScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3wnCisgICAgICAgICAgICAgICAgICAgICAgICAgICcobGliYyhfXHcrKT9cLnNvKD86XC4oXGRbMC05Ll0qKSk/KScpCisKK2RlZiBsaWJjX3ZlcihleGVjdXRhYmxlPXN5cy5leGVjdXRhYmxlLGxpYj0nJyx2ZXJzaW9uPScnLAorCisgICAgICAgICAgICAgY2h1bmtzaXplPTIwNDgpOgorCisgICAgIiIiIFRyaWVzIHRvIGRldGVybWluZSB0aGUgbGliYyB2ZXJzaW9uIHRoYXQgdGhlIGZpbGUgZXhlY3V0YWJsZQorICAgICAgICAod2hpY2ggZGVmYXVsdHMgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcikgaXMgbGlua2VkIGFnYWluc3QuCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIG9mIHN0cmluZ3MgKGxpYix2ZXJzaW9uKSB3aGljaCBkZWZhdWx0IHRvIHRoZQorICAgICAgICBnaXZlbiBwYXJhbWV0ZXJzIGluIGNhc2UgdGhlIGxvb2t1cCBmYWlscy4KKworICAgICAgICBOb3RlIHRoYXQgdGhlIGZ1bmN0aW9uIGhhcyBpbnRpbWF0ZSBrbm93bGVkZ2Ugb2YgaG93IGRpZmZlcmVudAorICAgICAgICBsaWJjIHZlcnNpb25zIGFkZCBzeW1ib2xzIHRvIHRoZSBleGVjdXRhYmxlIGFuZCB0aHVzIGlzIHByb2JhYmx5CisgICAgICAgIG9ubHkgdXNlYWJsZSBmb3IgZXhlY3V0YWJsZXMgY29tcGlsZWQgdXNpbmcgZ2NjLgorCisgICAgICAgIFRoZSBmaWxlIGlzIHJlYWQgYW5kIHNjYW5uZWQgaW4gY2h1bmtzIG9mIGNodW5rc2l6ZSBieXRlcy4KKworICAgICIiIgorICAgIGlmIGhhc2F0dHIob3MucGF0aCwgJ3JlYWxwYXRoJyk6CisgICAgICAgICMgUHl0aG9uIDIuMiBpbnRyb2R1Y2VkIG9zLnBhdGgucmVhbHBhdGgoKTsgaXQgaXMgdXNlZAorICAgICAgICAjIGhlcmUgdG8gd29yayBhcm91bmQgcHJvYmxlbXMgd2l0aCBDeWd3aW4gbm90IGJlaW5nCisgICAgICAgICMgYWJsZSB0byBvcGVuIHN5bWxpbmtzIGZvciByZWFkaW5nCisgICAgICAgIGV4ZWN1dGFibGUgPSBvcy5wYXRoLnJlYWxwYXRoKGV4ZWN1dGFibGUpCisgICAgZiA9IG9wZW4oZXhlY3V0YWJsZSwncmInKQorICAgIGJpbmFyeSA9IGYucmVhZChjaHVua3NpemUpCisgICAgcG9zID0gMAorICAgIHdoaWxlIDE6CisgICAgICAgIG0gPSBfbGliY19zZWFyY2guc2VhcmNoKGJpbmFyeSxwb3MpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgYmluYXJ5ID0gZi5yZWFkKGNodW5rc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBiaW5hcnk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHBvcyA9IDAKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGxpYmNpbml0LGdsaWJjLGdsaWJjdmVyc2lvbixzbyx0aHJlYWRzLHNvdmVyc2lvbiA9IG0uZ3JvdXBzKCkKKyAgICAgICAgaWYgbGliY2luaXQgYW5kIG5vdCBsaWI6CisgICAgICAgICAgICBsaWIgPSAnbGliYycKKyAgICAgICAgZWxpZiBnbGliYzoKKyAgICAgICAgICAgIGlmIGxpYiAhPSAnZ2xpYmMnOgorICAgICAgICAgICAgICAgIGxpYiA9ICdnbGliYycKKyAgICAgICAgICAgICAgICB2ZXJzaW9uID0gZ2xpYmN2ZXJzaW9uCisgICAgICAgICAgICBlbGlmIGdsaWJjdmVyc2lvbiA+IHZlcnNpb246CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IGdsaWJjdmVyc2lvbgorICAgICAgICBlbGlmIHNvOgorICAgICAgICAgICAgaWYgbGliICE9ICdnbGliYyc6CisgICAgICAgICAgICAgICAgbGliID0gJ2xpYmMnCisgICAgICAgICAgICAgICAgaWYgc292ZXJzaW9uIGFuZCBzb3ZlcnNpb24gPiB2ZXJzaW9uOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gc292ZXJzaW9uCisgICAgICAgICAgICAgICAgaWYgdGhyZWFkcyBhbmQgdmVyc2lvblstbGVuKHRocmVhZHMpOl0gIT0gdGhyZWFkczoKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyB0aHJlYWRzCisgICAgICAgIHBvcyA9IG0uZW5kKCkKKyAgICBmLmNsb3NlKCkKKyAgICByZXR1cm4gbGliLHZlcnNpb24KKworZGVmIF9kaXN0X3RyeV9oYXJkZXIoZGlzdG5hbWUsdmVyc2lvbixpZCk6CisKKyAgICAiIiIgVHJpZXMgc29tZSBzcGVjaWFsIHRyaWNrcyB0byBnZXQgdGhlIGRpc3RyaWJ1dGlvbgorICAgICAgICBpbmZvcm1hdGlvbiBpbiBjYXNlIHRoZSBkZWZhdWx0IG1ldGhvZCBmYWlscy4KKworICAgICAgICBDdXJyZW50bHkgc3VwcG9ydHMgb2xkZXIgU3VTRSBMaW51eCwgQ2FsZGVyYSBPcGVuTGludXggYW5kCisgICAgICAgIFNsYWNrd2FyZSBMaW51eCBkaXN0cmlidXRpb25zLgorCisgICAgIiIiCisgICAgaWYgb3MucGF0aC5leGlzdHMoJy92YXIvYWRtL2luc3QtbG9nL2luZm8nKToKKyAgICAgICAgIyBTdVNFIExpbnV4IHN0b3JlcyBkaXN0cmlidXRpb24gaW5mb3JtYXRpb24gaW4gdGhhdCBmaWxlCisgICAgICAgIGluZm8gPSBvcGVuKCcvdmFyL2FkbS9pbnN0LWxvZy9pbmZvJykucmVhZGxpbmVzKCkKKyAgICAgICAgZGlzdG5hbWUgPSAnU3VTRScKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5mbzoKKyAgICAgICAgICAgIHR2ID0gc3RyaW5nLnNwbGl0KGxpbmUpCisgICAgICAgICAgICBpZiBsZW4odHYpID09IDI6CisgICAgICAgICAgICAgICAgdGFnLHZhbHVlID0gdHYKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHRhZyA9PSAnTUlOX0RJU1RfVkVSU0lPTic6CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHN0cmluZy5zdHJpcCh2YWx1ZSkKKyAgICAgICAgICAgIGVsaWYgdGFnID09ICdESVNUX0lERU5UJzoKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBzdHJpbmcuc3BsaXQodmFsdWUsJy0nKQorICAgICAgICAgICAgICAgIGlkID0gdmFsdWVzWzJdCisgICAgICAgIHJldHVybiBkaXN0bmFtZSx2ZXJzaW9uLGlkCisKKyAgICBpZiBvcy5wYXRoLmV4aXN0cygnL2V0Yy8uaW5zdGFsbGVkJyk6CisgICAgICAgICMgQ2FsZGVyYSBPcGVuTGludXggaGFzIHNvbWUgaW5mb3MgaW4gdGhhdCBmaWxlICh0aGFua3MgdG8gQ29saW4gS29uZykKKyAgICAgICAgaW5mbyA9IG9wZW4oJy9ldGMvLmluc3RhbGxlZCcpLnJlYWRsaW5lcygpCisgICAgICAgIGZvciBsaW5lIGluIGluZm86CisgICAgICAgICAgICBwa2cgPSBzdHJpbmcuc3BsaXQobGluZSwnLScpCisgICAgICAgICAgICBpZiBsZW4ocGtnKSA+PSAyIGFuZCBwa2dbMF0gPT0gJ09wZW5MaW51eCc6CisgICAgICAgICAgICAgICAgIyBYWFggZG9lcyBDYWxkZXJhIHN1cHBvcnQgbm9uIEludGVsIHBsYXRmb3JtcyA/IElmIHllcywKKyAgICAgICAgICAgICAgICAjICAgICB3aGVyZSBjYW4gd2UgZmluZCB0aGUgbmVlZGVkIGlkID8KKyAgICAgICAgICAgICAgICByZXR1cm4gJ09wZW5MaW51eCcscGtnWzFdLGlkCisKKyAgICBpZiBvcy5wYXRoLmlzZGlyKCcvdXNyL2xpYi9zZXR1cCcpOgorICAgICAgICAjIENoZWNrIGZvciBzbGFja3dhcmUgdmVyc29uIHRhZyBmaWxlICh0aGFua3MgdG8gR3JlZyBBbmRydWspCisgICAgICAgIHZlcmZpbGVzID0gb3MubGlzdGRpcignL3Vzci9saWIvc2V0dXAnKQorICAgICAgICBmb3IgbiBpbiByYW5nZShsZW4odmVyZmlsZXMpLTEsIC0xLCAtMSk6CisgICAgICAgICAgICBpZiB2ZXJmaWxlc1tuXVs6MTRdICE9ICdzbGFjay12ZXJzaW9uLSc6CisgICAgICAgICAgICAgICAgZGVsIHZlcmZpbGVzW25dCisgICAgICAgIGlmIHZlcmZpbGVzOgorICAgICAgICAgICAgdmVyZmlsZXMuc29ydCgpCisgICAgICAgICAgICBkaXN0bmFtZSA9ICdzbGFja3dhcmUnCisgICAgICAgICAgICB2ZXJzaW9uID0gdmVyZmlsZXNbLTFdWzE0Ol0KKyAgICAgICAgICAgIHJldHVybiBkaXN0bmFtZSx2ZXJzaW9uLGlkCisKKyAgICByZXR1cm4gZGlzdG5hbWUsdmVyc2lvbixpZAorCitfcmVsZWFzZV9maWxlbmFtZSA9IHJlLmNvbXBpbGUocicoXHcrKVstX10ocmVsZWFzZXx2ZXJzaW9uKScpCitfbHNiX3JlbGVhc2VfdmVyc2lvbiA9IHJlLmNvbXBpbGUocicoLispJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHJlbGVhc2UgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnKFtcZC5dKyknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbXihdKig/OlwoKC4rKVwpKT8nKQorX3JlbGVhc2VfdmVyc2lvbiA9IHJlLmNvbXBpbGUocicoW14wLTldKyknCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyg/OiByZWxlYXNlICk/JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoW1xkLl0rKScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW14oXSooPzpcKCguKylcKSk/JykKKworIyBTZWUgYWxzbyBodHRwOi8vd3d3Lm5vdmVsbC5jb20vY29vbHNvbHV0aW9ucy9mZWF0dXJlLzExMjUxLmh0bWwKKyMgYW5kIGh0dHA6Ly9saW51eG1hZmlhLmNvbS9mYXEvQWRtaW4vcmVsZWFzZS1maWxlcy5odG1sCisjIGFuZCBodHRwOi8vZGF0YS5saW51eC1udGZzLm9yZy9ycG0vd2hpY2hycG0KKyMgYW5kIGh0dHA6Ly93d3cuZGllLm5ldC9kb2MvbGludXgvbWFuL21hbjEvbHNiX3JlbGVhc2UuMS5odG1sCisKK19zdXBwb3J0ZWRfZGlzdHMgPSAoCisgICAgJ1N1U0UnLCAnZGViaWFuJywgJ2ZlZG9yYScsICdyZWRoYXQnLCAnY2VudG9zJywKKyAgICAnbWFuZHJha2UnLCAnbWFuZHJpdmEnLCAncm9ja3MnLCAnc2xhY2t3YXJlJywgJ3llbGxvd2RvZycsICdnZW50b28nLAorICAgICdVbml0ZWRMaW51eCcsICd0dXJib2xpbnV4JykKKworZGVmIF9wYXJzZV9yZWxlYXNlX2ZpbGUoZmlyc3RsaW5lKToKKworICAgICMgRGVmYXVsdCB0byBlbXB0eSAndmVyc2lvbicgYW5kICdpZCcgc3RyaW5ncy4gIEJvdGggZGVmYXVsdHMgYXJlIHVzZWQKKyAgICAjIHdoZW4gJ2ZpcnN0bGluZScgaXMgZW1wdHkuICAnaWQnIGRlZmF1bHRzIHRvIGVtcHR5IHdoZW4gYW4gaWQgY2FuIG5vdAorICAgICMgYmUgZGVkdWNlZC4KKyAgICB2ZXJzaW9uID0gJycKKyAgICBpZCA9ICcnCisKKyAgICAjIFBhcnNlIHRoZSBmaXJzdCBsaW5lCisgICAgbSA9IF9sc2JfcmVsZWFzZV92ZXJzaW9uLm1hdGNoKGZpcnN0bGluZSkKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAjIExTQiBmb3JtYXQ6ICJkaXN0cm8gcmVsZWFzZSB4LnggKGNvZGVuYW1lKSIKKyAgICAgICAgcmV0dXJuIHR1cGxlKG0uZ3JvdXBzKCkpCisKKyAgICAjIFByZS1MU0IgZm9ybWF0OiAiZGlzdHJvIHgueCAoY29kZW5hbWUpIgorICAgIG0gPSBfcmVsZWFzZV92ZXJzaW9uLm1hdGNoKGZpcnN0bGluZSkKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gdHVwbGUobS5ncm91cHMoKSkKKworICAgICMgVW5rb3duIGZvcm1hdC4uLiB0YWtlIHRoZSBmaXJzdCB0d28gd29yZHMKKyAgICBsID0gc3RyaW5nLnNwbGl0KHN0cmluZy5zdHJpcChmaXJzdGxpbmUpKQorICAgIGlmIGw6CisgICAgICAgIHZlcnNpb24gPSBsWzBdCisgICAgICAgIGlmIGxlbihsKSA+IDE6CisgICAgICAgICAgICBpZCA9IGxbMV0KKyAgICByZXR1cm4gJycsIHZlcnNpb24sIGlkCisKK2RlZiBsaW51eF9kaXN0cmlidXRpb24oZGlzdG5hbWU9JycsIHZlcnNpb249JycsIGlkPScnLAorCisgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZF9kaXN0cz1fc3VwcG9ydGVkX2Rpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICBmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lPTEpOgorCisgICAgIiIiIFRyaWVzIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgTGludXggT1MgZGlzdHJpYnV0aW9uIG5hbWUuCisKKyAgICAgICAgVGhlIGZ1bmN0aW9uIGZpcnN0IGxvb2tzIGZvciBhIGRpc3RyaWJ1dGlvbiByZWxlYXNlIGZpbGUgaW4KKyAgICAgICAgL2V0YyBhbmQgdGhlbiByZXZlcnRzIHRvIF9kaXN0X3RyeV9oYXJkZXIoKSBpbiBjYXNlIG5vCisgICAgICAgIHN1aXRhYmxlIGZpbGVzIGFyZSBmb3VuZC4KKworICAgICAgICBzdXBwb3J0ZWRfZGlzdHMgbWF5IGJlIGdpdmVuIHRvIGRlZmluZSB0aGUgc2V0IG9mIExpbnV4CisgICAgICAgIGRpc3RyaWJ1dGlvbnMgdG8gbG9vayBmb3IuIEl0IGRlZmF1bHRzIHRvIGEgbGlzdCBvZiBjdXJyZW50bHkKKyAgICAgICAgc3VwcG9ydGVkIExpbnV4IGRpc3RyaWJ1dGlvbnMgaWRlbnRpZmllZCBieSB0aGVpciByZWxlYXNlIGZpbGUKKyAgICAgICAgbmFtZS4KKworICAgICAgICBJZiBmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lIGlzIHRydWUgKGRlZmF1bHQpLCB0aGUgZnVsbAorICAgICAgICBkaXN0cmlidXRpb24gcmVhZCBmcm9tIHRoZSBPUyBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBzaG9ydAorICAgICAgICBuYW1lIHRha2VuIGZyb20gc3VwcG9ydGVkX2Rpc3RzIGlzIHVzZWQuCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIChkaXN0bmFtZSx2ZXJzaW9uLGlkKSB3aGljaCBkZWZhdWx0IHRvIHRoZQorICAgICAgICBhcmdzIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIGV0YyA9IG9zLmxpc3RkaXIoJy9ldGMnKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgIyBQcm9iYWJseSBub3QgYSBVbml4IHN5c3RlbQorICAgICAgICByZXR1cm4gZGlzdG5hbWUsdmVyc2lvbixpZAorICAgIGV0Yy5zb3J0KCkKKyAgICBmb3IgZmlsZSBpbiBldGM6CisgICAgICAgIG0gPSBfcmVsZWFzZV9maWxlbmFtZS5tYXRjaChmaWxlKQorICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2Rpc3RuYW1lLGR1bW15ID0gbS5ncm91cHMoKQorICAgICAgICAgICAgaWYgX2Rpc3RuYW1lIGluIHN1cHBvcnRlZF9kaXN0czoKKyAgICAgICAgICAgICAgICBkaXN0bmFtZSA9IF9kaXN0bmFtZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIF9kaXN0X3RyeV9oYXJkZXIoZGlzdG5hbWUsdmVyc2lvbixpZCkKKworICAgICMgUmVhZCB0aGUgZmlyc3QgbGluZQorICAgIGYgPSBvcGVuKCcvZXRjLycrZmlsZSwgJ3InKQorICAgIGZpcnN0bGluZSA9IGYucmVhZGxpbmUoKQorICAgIGYuY2xvc2UoKQorICAgIF9kaXN0bmFtZSwgX3ZlcnNpb24sIF9pZCA9IF9wYXJzZV9yZWxlYXNlX2ZpbGUoZmlyc3RsaW5lKQorCisgICAgaWYgX2Rpc3RuYW1lIGFuZCBmdWxsX2Rpc3RyaWJ1dGlvbl9uYW1lOgorICAgICAgICBkaXN0bmFtZSA9IF9kaXN0bmFtZQorICAgIGlmIF92ZXJzaW9uOgorICAgICAgICB2ZXJzaW9uID0gX3ZlcnNpb24KKyAgICBpZiBfaWQ6CisgICAgICAgIGlkID0gX2lkCisgICAgcmV0dXJuIGRpc3RuYW1lLCB2ZXJzaW9uLCBpZAorCisjIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5OgorCitkZWYgZGlzdChkaXN0bmFtZT0nJyx2ZXJzaW9uPScnLGlkPScnLAorCisgICAgICAgICBzdXBwb3J0ZWRfZGlzdHM9X3N1cHBvcnRlZF9kaXN0cyk6CisKKyAgICAiIiIgVHJpZXMgdG8gZGV0ZXJtaW5lIHRoZSBuYW1lIG9mIHRoZSBMaW51eCBPUyBkaXN0cmlidXRpb24gbmFtZS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gZmlyc3QgbG9va3MgZm9yIGEgZGlzdHJpYnV0aW9uIHJlbGVhc2UgZmlsZSBpbgorICAgICAgICAvZXRjIGFuZCB0aGVuIHJldmVydHMgdG8gX2Rpc3RfdHJ5X2hhcmRlcigpIGluIGNhc2Ugbm8KKyAgICAgICAgc3VpdGFibGUgZmlsZXMgYXJlIGZvdW5kLgorCisgICAgICAgIFJldHVybnMgYSB0dXBsZSAoZGlzdG5hbWUsdmVyc2lvbixpZCkgd2hpY2ggZGVmYXVsdCB0byB0aGUKKyAgICAgICAgYXJncyBnaXZlbiBhcyBwYXJhbWV0ZXJzLgorCisgICAgIiIiCisgICAgcmV0dXJuIGxpbnV4X2Rpc3RyaWJ1dGlvbihkaXN0bmFtZSwgdmVyc2lvbiwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRfZGlzdHM9c3VwcG9ydGVkX2Rpc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbF9kaXN0cmlidXRpb25fbmFtZT0wKQorCitjbGFzcyBfcG9wZW46CisKKyAgICAiIiIgRmFpcmx5IHBvcnRhYmxlIChhbHRlcm5hdGl2ZSkgcG9wZW4gaW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgVGhpcyBpcyBtb3N0bHkgbmVlZGVkIGluIGNhc2Ugb3MucG9wZW4oKSBpcyBub3QgYXZhaWxhYmxlLCBvcgorICAgICAgICBkb2Vzbid0IHdvcmsgYXMgYWR2ZXJ0aXNlZCwgZS5nLiBpbiBXaW45WCBHVUkgcHJvZ3JhbXMgbGlrZQorICAgICAgICBQeXRob25XaW4gb3IgSURMRS4KKworICAgICAgICBXcml0aW5nIHRvIHRoZSBwaXBlIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLgorCisgICAgIiIiCisgICAgdG1wZmlsZSA9ICcnCisgICAgcGlwZSA9IE5vbmUKKyAgICBidWZzaXplID0gTm9uZQorICAgIG1vZGUgPSAncicKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLGNtZCxtb2RlPSdyJyxidWZzaXplPU5vbmUpOgorCisgICAgICAgIGlmIG1vZGUgIT0gJ3InOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwncG9wZW4oKS1lbXVsYXRpb24gb25seSBzdXBwb3J0cyByZWFkIG1vZGUnCisgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorICAgICAgICBzZWxmLnRtcGZpbGUgPSB0bXBmaWxlID0gdGVtcGZpbGUubWt0ZW1wKCkKKyAgICAgICAgb3Muc3lzdGVtKGNtZCArICcgPiAlcycgJSB0bXBmaWxlKQorICAgICAgICBzZWxmLnBpcGUgPSBvcGVuKHRtcGZpbGUsJ3JiJykKKyAgICAgICAgc2VsZi5idWZzaXplID0gYnVmc2l6ZQorICAgICAgICBzZWxmLm1vZGUgPSBtb2RlCisKKyAgICBkZWYgcmVhZChzZWxmKToKKworICAgICAgICByZXR1cm4gc2VsZi5waXBlLnJlYWQoKQorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmKToKKworICAgICAgICBpZiBzZWxmLmJ1ZnNpemUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5waXBlLnJlYWRsaW5lcygpCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwKKworICAgICAgICAgICAgICByZW1vdmU9b3MudW5saW5rLGVycm9yPW9zLmVycm9yKToKKworICAgICAgICBpZiBzZWxmLnBpcGU6CisgICAgICAgICAgICByYyA9IHNlbGYucGlwZS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYyA9IDI1NQorICAgICAgICBpZiBzZWxmLnRtcGZpbGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVtb3ZlKHNlbGYudG1wZmlsZSkKKyAgICAgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiByYworCisgICAgIyBBbGlhcworICAgIF9fZGVsX18gPSBjbG9zZQorCitkZWYgcG9wZW4oY21kLCBtb2RlPSdyJywgYnVmc2l6ZT1Ob25lKToKKworICAgICIiIiBQb3J0YWJsZSBwb3BlbigpIGludGVyZmFjZS4KKyAgICAiIiIKKyAgICAjIEZpbmQgYSB3b3JraW5nIHBvcGVuIGltcGxlbWVudGF0aW9uIHByZWZlcnJpbmcgd2luMzJwaXBlLnBvcGVuCisgICAgIyBvdmVyIG9zLnBvcGVuIG92ZXIgX3BvcGVuCisgICAgcG9wZW4gPSBOb25lCisgICAgaWYgb3MuZW52aXJvbi5nZXQoJ09TJywnJykgPT0gJ1dpbmRvd3NfTlQnOgorICAgICAgICAjIE9uIE5UIHdpbjMycGlwZSBzaG91bGQgd29yazsgb24gV2luOXggaXQgaGFuZ3MgZHVlIHRvIGJ1Z3MKKyAgICAgICAgIyBpbiB0aGUgTVMgQyBsaWIgKHNlZSBNUyBLbm93bGVkZ2VCYXNlIGFydGljbGUgUTE1MDk1NikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHdpbjMycGlwZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwb3BlbiA9IHdpbjMycGlwZS5wb3BlbgorICAgIGlmIHBvcGVuIGlzIE5vbmU6CisgICAgICAgIGlmIGhhc2F0dHIob3MsJ3BvcGVuJyk6CisgICAgICAgICAgICBwb3BlbiA9IG9zLnBvcGVuCisgICAgICAgICAgICAjIENoZWNrIHdoZXRoZXIgaXQgd29ya3MuLi4gaXQgZG9lc24ndCBpbiBHVUkgcHJvZ3JhbXMKKyAgICAgICAgICAgICMgb24gV2luZG93cyBwbGF0Zm9ybXMKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOiAjIFhYWCBPdGhlcnMgdG9vID8KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBvcGVuKCcnKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcG9wZW4gPSBfcG9wZW4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBvcGVuID0gX3BvcGVuCisgICAgaWYgYnVmc2l6ZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gcG9wZW4oY21kLG1vZGUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHBvcGVuKGNtZCxtb2RlLGJ1ZnNpemUpCisKK2RlZiBfbm9ybV92ZXJzaW9uKHZlcnNpb24sIGJ1aWxkPScnKToKKworICAgICIiIiBOb3JtYWxpemUgdGhlIHZlcnNpb24gYW5kIGJ1aWxkIHN0cmluZ3MgYW5kIHJldHVybiBhIHNpbmdsZQorICAgICAgICB2ZXJzaW9uIHN0cmluZyB1c2luZyB0aGUgZm9ybWF0IG1ham9yLm1pbm9yLmJ1aWxkIChvciBwYXRjaGxldmVsKS4KKyAgICAiIiIKKyAgICBsID0gc3RyaW5nLnNwbGl0KHZlcnNpb24sJy4nKQorICAgIGlmIGJ1aWxkOgorICAgICAgICBsLmFwcGVuZChidWlsZCkKKyAgICB0cnk6CisgICAgICAgIGludHMgPSBtYXAoaW50LGwpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHN0cmluZ3MgPSBsCisgICAgZWxzZToKKyAgICAgICAgc3RyaW5ncyA9IG1hcChzdHIsaW50cykKKyAgICB2ZXJzaW9uID0gc3RyaW5nLmpvaW4oc3RyaW5nc1s6M10sJy4nKQorICAgIHJldHVybiB2ZXJzaW9uCisKK192ZXJfb3V0cHV0ID0gcmUuY29tcGlsZShyJyg/OihbXHcgXSspIChbXHcuXSspICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAnLionCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1xbLiogKFtcZC5dKylcXSknKQorCisjIEV4YW1wbGVzIG9mIFZFUiBjb21tYW5kIG91dHB1dDoKKyMKKyMgICBXaW5kb3dzIDIwMDA6ICBNaWNyb3NvZnQgV2luZG93cyAyMDAwIFtWZXJzaW9uIDUuMDAuMjE5NV0KKyMgICBXaW5kb3dzIFhQOiAgICBNaWNyb3NvZnQgV2luZG93cyBYUCBbVmVyc2lvbiA1LjEuMjYwMF0KKyMgICBXaW5kb3dzIFZpc3RhOiBNaWNyb3NvZnQgV2luZG93cyBbVmVyc2lvbiA2LjAuNjAwMl0KKyMKKyMgTm90ZSB0aGF0IHRoZSAiVmVyc2lvbiIgc3RyaW5nIGdldHMgbG9jYWxpemVkIG9uIGRpZmZlcmVudAorIyBXaW5kb3dzIHZlcnNpb25zLgorCitkZWYgX3N5c2NtZF92ZXIoc3lzdGVtPScnLCByZWxlYXNlPScnLCB2ZXJzaW9uPScnLAorCisgICAgICAgICAgICAgICBzdXBwb3J0ZWRfcGxhdGZvcm1zPSgnd2luMzInLCd3aW4xNicsJ2RvcycsJ29zMicpKToKKworICAgICIiIiBUcmllcyB0byBmaWd1cmUgb3V0IHRoZSBPUyB2ZXJzaW9uIHVzZWQgYW5kIHJldHVybnMKKyAgICAgICAgYSB0dXBsZSAoc3lzdGVtLHJlbGVhc2UsdmVyc2lvbikuCisKKyAgICAgICAgSXQgdXNlcyB0aGUgInZlciIgc2hlbGwgY29tbWFuZCBmb3IgdGhpcyB3aGljaCBpcyBrbm93bgorICAgICAgICB0byBleGlzdHMgb24gV2luZG93cywgRE9TIGFuZCBPUy8yLiBYWFggT3RoZXJzIHRvbyA/CisKKyAgICAgICAgSW4gY2FzZSB0aGlzIGZhaWxzLCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBhcmUgdXNlZCBhcworICAgICAgICBkZWZhdWx0cy4KKworICAgICIiIgorICAgIGlmIHN5cy5wbGF0Zm9ybSBub3QgaW4gc3VwcG9ydGVkX3BsYXRmb3JtczoKKyAgICAgICAgcmV0dXJuIHN5c3RlbSxyZWxlYXNlLHZlcnNpb24KKworICAgICMgVHJ5IHNvbWUgY29tbW9uIGNtZCBzdHJpbmdzCisgICAgZm9yIGNtZCBpbiAoJ3ZlcicsJ2NvbW1hbmQgL2MgdmVyJywnY21kIC9jIHZlcicpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaXBlID0gcG9wZW4oY21kKQorICAgICAgICAgICAgaW5mbyA9IHBpcGUucmVhZCgpCisgICAgICAgICAgICBpZiBwaXBlLmNsb3NlKCk6CisgICAgICAgICAgICAgICAgcmFpc2Ugb3MuZXJyb3IsJ2NvbW1hbmQgZmFpbGVkJworICAgICAgICAgICAgIyBYWFggSG93IGNhbiBJIHN1cHByZXNzIHNoZWxsIGVycm9ycyBmcm9tIGJlaW5nIHdyaXR0ZW4KKyAgICAgICAgICAgICMgICAgIHRvIHN0ZGVyciA/CisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcix3aHk6CisgICAgICAgICAgICAjcHJpbnQgJ0NvbW1hbmQgJXMgZmFpbGVkOiAlcycgJSAoY21kLHdoeSkKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLHdoeToKKyAgICAgICAgICAgICNwcmludCAnQ29tbWFuZCAlcyBmYWlsZWQ6ICVzJyAlIChjbWQsd2h5KQorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHN5c3RlbSxyZWxlYXNlLHZlcnNpb24KKworICAgICMgUGFyc2UgdGhlIG91dHB1dAorICAgIGluZm8gPSBzdHJpbmcuc3RyaXAoaW5mbykKKyAgICBtID0gX3Zlcl9vdXRwdXQubWF0Y2goaW5mbykKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICBzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uID0gbS5ncm91cHMoKQorICAgICAgICAjIFN0cmlwIHRyYWlsaW5nIGRvdHMgZnJvbSB2ZXJzaW9uIGFuZCByZWxlYXNlCisgICAgICAgIGlmIHJlbGVhc2VbLTFdID09ICcuJzoKKyAgICAgICAgICAgIHJlbGVhc2UgPSByZWxlYXNlWzotMV0KKyAgICAgICAgaWYgdmVyc2lvblstMV0gPT0gJy4nOgorICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb25bOi0xXQorICAgICAgICAjIE5vcm1hbGl6ZSB0aGUgdmVyc2lvbiBhbmQgYnVpbGQgc3RyaW5ncyAoZWxpbWluYXRpbmcgYWRkaXRpb25hbAorICAgICAgICAjIHplcm9zKQorICAgICAgICB2ZXJzaW9uID0gX25vcm1fdmVyc2lvbih2ZXJzaW9uKQorICAgIHJldHVybiBzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uCisKK2RlZiBfd2luMzJfZ2V0dmFsdWUoa2V5LG5hbWUsZGVmYXVsdD0nJyk6CisKKyAgICAiIiIgUmVhZCBhIHZhbHVlIGZvciBuYW1lIGZyb20gdGhlIHJlZ2lzdHJ5IGtleS4KKworICAgICAgICBJbiBjYXNlIHRoaXMgZmFpbHMsIGRlZmF1bHQgaXMgcmV0dXJuZWQuCisKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgICMgVXNlIHdpbjMyYXBpIGlmIGF2YWlsYWJsZQorICAgICAgICBmcm9tIHdpbjMyYXBpIGltcG9ydCBSZWdRdWVyeVZhbHVlRXgKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgT24gUHl0aG9uIDIuMCBhbmQgbGF0ZXIsIGVtdWxhdGUgdXNpbmcgX3dpbnJlZworICAgICAgICBpbXBvcnQgX3dpbnJlZworICAgICAgICBSZWdRdWVyeVZhbHVlRXggPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeAorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIFJlZ1F1ZXJ5VmFsdWVFeChrZXksbmFtZSkKKyAgICBleGNlcHQ6CisgICAgICAgIHJldHVybiBkZWZhdWx0CisKK2RlZiB3aW4zMl92ZXIocmVsZWFzZT0nJyx2ZXJzaW9uPScnLGNzZD0nJyxwdHlwZT0nJyk6CisKKyAgICAiIiIgR2V0IGFkZGl0aW9uYWwgdmVyc2lvbiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBXaW5kb3dzIFJlZ2lzdHJ5CisgICAgICAgIGFuZCByZXR1cm4gYSB0dXBsZSAodmVyc2lvbixjc2QscHR5cGUpIHJlZmVycmluZyB0byB2ZXJzaW9uCisgICAgICAgIG51bWJlciwgQ1NEIGxldmVsIChzZXJ2aWNlIHBhY2spLCBhbmQgT1MgdHlwZSAobXVsdGkvc2luZ2xlCisgICAgICAgIHByb2Nlc3NvcikuCisKKyAgICAgICAgQXMgYSBoaW50OiBwdHlwZSByZXR1cm5zICdVbmlwcm9jZXNzb3IgRnJlZScgb24gc2luZ2xlCisgICAgICAgIHByb2Nlc3NvciBOVCBtYWNoaW5lcyBhbmQgJ011bHRpcHJvY2Vzc29yIEZyZWUnIG9uIG11bHRpCisgICAgICAgIHByb2Nlc3NvciBtYWNoaW5lcy4gVGhlICdGcmVlJyByZWZlcnMgdG8gdGhlIE9TIHZlcnNpb24gYmVpbmcKKyAgICAgICAgZnJlZSBvZiBkZWJ1Z2dpbmcgY29kZS4gSXQgY291bGQgYWxzbyBzdGF0ZSAnQ2hlY2tlZCcgd2hpY2gKKyAgICAgICAgbWVhbnMgdGhlIE9TIHZlcnNpb24gdXNlcyBkZWJ1Z2dpbmcgY29kZSwgaS5lLiBjb2RlIHRoYXQKKyAgICAgICAgY2hlY2tzIGFyZ3VtZW50cywgcmFuZ2VzLCBldGMuIChUaG9tYXMgSGVsbGVyKS4KKworICAgICAgICBOb3RlOiB0aGlzIGZ1bmN0aW9uIHdvcmtzIGJlc3Qgd2l0aCBNYXJrIEhhbW1vbmQncyB3aW4zMgorICAgICAgICBwYWNrYWdlIGluc3RhbGxlZCwgYnV0IGFsc28gb24gUHl0aG9uIDIuMyBhbmQgbGF0ZXIuIEl0CisgICAgICAgIG9idmlvdXNseSBvbmx5IHJ1bnMgb24gV2luMzIgY29tcGF0aWJsZSBwbGF0Zm9ybXMuCisKKyAgICAiIiIKKyAgICAjIFhYWCBJcyB0aGVyZSBhbnkgd2F5IHRvIGZpbmQgb3V0IHRoZSBwcm9jZXNzb3IgdHlwZSBvbiBXaW5YWCA/CisgICAgIyBYWFggSXMgd2luMzIgYXZhaWxhYmxlIG9uIFdpbmRvd3MgQ0UgPworICAgICMKKyAgICAjIEFkYXB0ZWQgZnJvbSBjb2RlIHBvc3RlZCBieSBLYXJsIFB1dGxhbmQgdG8gY29tcC5sYW5nLnB5dGhvbi4KKyAgICAjCisgICAgIyBUaGUgbWFwcGluZ3MgYmV0d2VlbiByZWcuIHZhbHVlcyBhbmQgcmVsZWFzZSBuYW1lcyBjYW4gYmUgZm91bmQKKyAgICAjIGhlcmU6IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vbGlicmFyeS9lbi11cy9zeXNpbmZvL2Jhc2Uvb3N2ZXJzaW9uaW5mb19zdHIuYXNwCisKKyAgICAjIEltcG9ydCB0aGUgbmVlZGVkIEFQSXMKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB3aW4zMmFwaQorICAgICAgICBmcm9tIHdpbjMyYXBpIGltcG9ydCBSZWdRdWVyeVZhbHVlRXgsIFJlZ09wZW5LZXlFeCwgXAorICAgICAgICAgICAgIFJlZ0Nsb3NlS2V5LCBHZXRWZXJzaW9uRXgKKyAgICAgICAgZnJvbSB3aW4zMmNvbiBpbXBvcnQgSEtFWV9MT0NBTF9NQUNISU5FLCBWRVJfUExBVEZPUk1fV0lOMzJfTlQsIFwKKyAgICAgICAgICAgICBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUywgVkVSX05UX1dPUktTVEFUSU9OCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAjIEVtdWxhdGUgdGhlIHdpbjMyYXBpIG1vZHVsZSB1c2luZyBQeXRob24gQVBJcworICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuZ2V0d2luZG93c3ZlcnNpb24KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgIyBObyBlbXVsYXRpb24gcG9zc2libGUsIHNvIHJldHVybiB0aGUgZGVmYXVsdHMuLi4KKyAgICAgICAgICAgIHJldHVybiByZWxlYXNlLHZlcnNpb24sY3NkLHB0eXBlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEVtdWxhdGlvbiB1c2luZyBfd2lucmVnIChhZGRlZCBpbiBQeXRob24gMi4wKSBhbmQKKyAgICAgICAgICAgICMgc3lzLmdldHdpbmRvd3N2ZXJzaW9uKCkgKGFkZGVkIGluIFB5dGhvbiAyLjMpCisgICAgICAgICAgICBpbXBvcnQgX3dpbnJlZworICAgICAgICAgICAgR2V0VmVyc2lvbkV4ID0gc3lzLmdldHdpbmRvd3N2ZXJzaW9uCisgICAgICAgICAgICBSZWdRdWVyeVZhbHVlRXggPSBfd2lucmVnLlF1ZXJ5VmFsdWVFeAorICAgICAgICAgICAgUmVnT3BlbktleUV4ID0gX3dpbnJlZy5PcGVuS2V5RXgKKyAgICAgICAgICAgIFJlZ0Nsb3NlS2V5ID0gX3dpbnJlZy5DbG9zZUtleQorICAgICAgICAgICAgSEtFWV9MT0NBTF9NQUNISU5FID0gX3dpbnJlZy5IS0VZX0xPQ0FMX01BQ0hJTkUKKyAgICAgICAgICAgIFZFUl9QTEFURk9STV9XSU4zMl9XSU5ET1dTID0gMQorICAgICAgICAgICAgVkVSX1BMQVRGT1JNX1dJTjMyX05UID0gMgorICAgICAgICAgICAgVkVSX05UX1dPUktTVEFUSU9OID0gMQorICAgICAgICAgICAgVkVSX05UX1NFUlZFUiA9IDMKKyAgICAgICAgICAgIFJFR19TWiA9IDEKKworICAgICMgRmluZCBvdXQgdGhlIHJlZ2lzdHJ5IGtleSBhbmQgc29tZSBnZW5lcmFsIHZlcnNpb24gaW5mb3MKKyAgICB3aW52ZXIgPSBHZXRWZXJzaW9uRXgoKQorICAgIG1haixtaW4sYnVpbGRubyxwbGF0LGNzZCA9IHdpbnZlcgorICAgIHZlcnNpb24gPSAnJWkuJWkuJWknICUgKG1haixtaW4sYnVpbGRubyAmIDB4RkZGRikKKyAgICBpZiBoYXNhdHRyKHdpbnZlciwgInNlcnZpY2VfcGFjayIpOgorICAgICAgICBpZiB3aW52ZXIuc2VydmljZV9wYWNrICE9ICIiOgorICAgICAgICAgICAgY3NkID0gJ1NQJXMnICUgd2ludmVyLnNlcnZpY2VfcGFja19tYWpvcgorICAgIGVsc2U6CisgICAgICAgIGlmIGNzZFs6MTNdID09ICdTZXJ2aWNlIFBhY2sgJzoKKyAgICAgICAgICAgIGNzZCA9ICdTUCcgKyBjc2RbMTM6XQorCisgICAgaWYgcGxhdCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfV0lORE9XUzoKKyAgICAgICAgcmVna2V5ID0gJ1NPRlRXQVJFXFxNaWNyb3NvZnRcXFdpbmRvd3NcXEN1cnJlbnRWZXJzaW9uJworICAgICAgICAjIFRyeSB0byBndWVzcyB0aGUgcmVsZWFzZSBuYW1lCisgICAgICAgIGlmIG1haiA9PSA0OgorICAgICAgICAgICAgaWYgbWluID09IDA6CisgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICc5NScKKyAgICAgICAgICAgIGVsaWYgbWluID09IDEwOgorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnOTgnCisgICAgICAgICAgICBlbGlmIG1pbiA9PSA5MDoKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gJ01lJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gJ3Bvc3RNZScKKyAgICAgICAgZWxpZiBtYWogPT0gNToKKyAgICAgICAgICAgIHJlbGVhc2UgPSAnMjAwMCcKKworICAgIGVsaWYgcGxhdCA9PSBWRVJfUExBVEZPUk1fV0lOMzJfTlQ6CisgICAgICAgIHJlZ2tleSA9ICdTT0ZUV0FSRVxcTWljcm9zb2Z0XFxXaW5kb3dzIE5UXFxDdXJyZW50VmVyc2lvbicKKyAgICAgICAgaWYgbWFqIDw9IDQ6CisgICAgICAgICAgICByZWxlYXNlID0gJ05UJworICAgICAgICBlbGlmIG1haiA9PSA1OgorICAgICAgICAgICAgaWYgbWluID09IDA6CisgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICcyMDAwJworICAgICAgICAgICAgZWxpZiBtaW4gPT0gMToKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gJ1hQJworICAgICAgICAgICAgZWxpZiBtaW4gPT0gMjoKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gJzIwMDNTZXJ2ZXInCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAncG9zdDIwMDMnCisgICAgICAgIGVsaWYgbWFqID09IDY6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHdpbnZlciwgInByb2R1Y3RfdHlwZSIpOgorICAgICAgICAgICAgICAgIHByb2R1Y3RfdHlwZSA9IHdpbnZlci5wcm9kdWN0X3R5cGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJvZHVjdF90eXBlID0gVkVSX05UX1dPUktTVEFUSU9OCisgICAgICAgICAgICAgICAgIyBXaXRob3V0IGFuIE9TVkVSU0lPTklORk9FWCBjYXBhYmxlIHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICMgb3IgaGVscCBmcm9tIHRoZSByZWdpc3RyeSwgd2UgY2Fubm90IHByb3Blcmx5IGlkZW50aWZ5CisgICAgICAgICAgICAgICAgIyBub24td29ya3N0YXRpb24gdmVyc2lvbnMuCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBrZXkgPSBSZWdPcGVuS2V5RXgoSEtFWV9MT0NBTF9NQUNISU5FLCByZWdrZXkpCisgICAgICAgICAgICAgICAgICAgIG5hbWUsIHR5cGUgPSBSZWdRdWVyeVZhbHVlRXgoa2V5LCAiUHJvZHVjdE5hbWUiKQorICAgICAgICAgICAgICAgICAgICAjIERpc2NhcmQgYW55IHR5cGUgdGhhdCBpc24ndCBSRUdfU1oKKyAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSBSRUdfU1ogYW5kIG5hbWUuZmluZCgiU2VydmVyIikgIT0gLTE6CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3R5cGUgPSBWRVJfTlRfU0VSVkVSCisgICAgICAgICAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBVc2UgZGVmYXVsdCBvZiBWRVJfTlRfV09SS1NUQVRJT04KKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBpZiBtaW4gPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBwcm9kdWN0X3R5cGUgPT0gVkVSX05UX1dPUktTVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gJ1Zpc3RhJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnMjAwOFNlcnZlcicKKyAgICAgICAgICAgIGVsaWYgbWluID09IDE6CisgICAgICAgICAgICAgICAgaWYgcHJvZHVjdF90eXBlID09IFZFUl9OVF9XT1JLU1RBVElPTjoKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICc3JworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnMjAwOFNlcnZlclIyJworICAgICAgICAgICAgZWxpZiBtaW4gPT0gMjoKKyAgICAgICAgICAgICAgICBpZiBwcm9kdWN0X3R5cGUgPT0gVkVSX05UX1dPUktTVEFUSU9OOgorICAgICAgICAgICAgICAgICAgICByZWxlYXNlID0gJzgnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICcyMDEyU2VydmVyJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gJ3Bvc3QyMDEyU2VydmVyJworCisgICAgZWxzZToKKyAgICAgICAgaWYgbm90IHJlbGVhc2U6CisgICAgICAgICAgICAjIEUuZy4gV2luMy4xIHdpdGggd2luMzJzCisgICAgICAgICAgICByZWxlYXNlID0gJyVpLiVpJyAlIChtYWosbWluKQorICAgICAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uLGNzZCxwdHlwZQorCisgICAgIyBPcGVuIHRoZSByZWdpc3RyeSBrZXkKKyAgICB0cnk6CisgICAgICAgIGtleUN1clZlciA9IFJlZ09wZW5LZXlFeChIS0VZX0xPQ0FMX01BQ0hJTkUsIHJlZ2tleSkKKyAgICAgICAgIyBHZXQgYSB2YWx1ZSB0byBtYWtlIHN1cmUgdGhlIGtleSBleGlzdHMuLi4KKyAgICAgICAgUmVnUXVlcnlWYWx1ZUV4KGtleUN1clZlciwgJ1N5c3RlbVJvb3QnKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmV0dXJuIHJlbGVhc2UsdmVyc2lvbixjc2QscHR5cGUKKworICAgICMgUGFyc2UgdmFsdWVzCisgICAgI3N1YnZlcnNpb24gPSBfd2luMzJfZ2V0dmFsdWUoa2V5Q3VyVmVyLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N1YlZlcnNpb25OdW1iZXInLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcnLDEpKVswXQorICAgICNpZiBzdWJ2ZXJzaW9uOgorICAgICMgICByZWxlYXNlID0gcmVsZWFzZSArIHN1YnZlcnNpb24gIyA5NWEsIDk1YiwgZXRjLgorICAgIGJ1aWxkID0gX3dpbjMyX2dldHZhbHVlKGtleUN1clZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3VycmVudEJ1aWxkTnVtYmVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJycsMSkpWzBdCisgICAgcHR5cGUgPSBfd2luMzJfZ2V0dmFsdWUoa2V5Q3VyVmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0N1cnJlbnRUeXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdHlwZSwxKSlbMF0KKworICAgICMgTm9ybWFsaXplIHZlcnNpb24KKyAgICB2ZXJzaW9uID0gX25vcm1fdmVyc2lvbih2ZXJzaW9uLGJ1aWxkKQorCisgICAgIyBDbG9zZSBrZXkKKyAgICBSZWdDbG9zZUtleShrZXlDdXJWZXIpCisgICAgcmV0dXJuIHJlbGVhc2UsdmVyc2lvbixjc2QscHR5cGUKKworZGVmIF9tYWNfdmVyX2xvb2t1cChzZWxlY3RvcnMsZGVmYXVsdD1Ob25lKToKKworICAgIGZyb20gZ2VzdGFsdCBpbXBvcnQgZ2VzdGFsdAorICAgIGltcG9ydCBNYWNPUworICAgIGwgPSBbXQorICAgIGFwcGVuZCA9IGwuYXBwZW5kCisgICAgZm9yIHNlbGVjdG9yIGluIHNlbGVjdG9yczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXBwZW5kKGdlc3RhbHQoc2VsZWN0b3IpKQorICAgICAgICBleGNlcHQgKFJ1bnRpbWVFcnJvciwgTWFjT1MuRXJyb3IpOgorICAgICAgICAgICAgYXBwZW5kKGRlZmF1bHQpCisgICAgcmV0dXJuIGwKKworZGVmIF9iY2Qyc3RyKGJjZCk6CisKKyAgICByZXR1cm4gaGV4KGJjZClbMjpdCisKK2RlZiBfbWFjX3Zlcl9nZXN0YWx0KCk6CisgICAgIiIiCisgICAgICAgIFRoYW5rcyB0byBNYXJrIFIuIExldmluc29uIGZvciBtYWlsaW5nIGRvY3VtZW50YXRpb24gbGlua3MgYW5kCisgICAgICAgIGNvZGUgZXhhbXBsZXMgZm9yIHRoaXMgZnVuY3Rpb24uIERvY3VtZW50YXRpb24gZm9yIHRoZQorICAgICAgICBnZXN0YWx0KCkgQVBJIGlzIGF2YWlsYWJsZSBvbmxpbmUgYXQ6CisKKyAgICAgICAgICAgaHR0cDovL3d3dy5yZ2Fyb3MubmwvZ2VzdGFsdC8KKyAgICAiIiIKKyAgICAjIENoZWNrIHdoZXRoZXIgdGhlIHZlcnNpb24gaW5mbyBtb2R1bGUgaXMgYXZhaWxhYmxlCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgZ2VzdGFsdAorICAgICAgICBpbXBvcnQgTWFjT1MKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgIyBHZXQgdGhlIGluZm9zCisgICAgc3lzdixzeXNhID0gX21hY192ZXJfbG9va3VwKCgnc3lzdicsJ3N5c2EnKSkKKyAgICAjIERlY29kZSB0aGUgaW5mb3MKKyAgICBpZiBzeXN2OgorICAgICAgICBtYWpvciA9IChzeXN2ICYgMHhGRjAwKSA+PiA4CisgICAgICAgIG1pbm9yID0gKHN5c3YgJiAweDAwRjApID4+IDQKKyAgICAgICAgcGF0Y2ggPSAoc3lzdiAmIDB4MDAwRikKKworICAgICAgICBpZiAobWFqb3IsIG1pbm9yKSA+PSAoMTAsIDQpOgorICAgICAgICAgICAgIyB0aGUgJ3N5c3YnIGdlc3RhbGQgY2Fubm90IHJldHVybiBwYXRjaGxldmVscworICAgICAgICAgICAgIyBoaWdoZXIgdGhhbiA5LiBBcHBsZSBpbnRyb2R1Y2VkIDMgbmV3CisgICAgICAgICAgICAjIGdlc3RhbHQgY29kZXMgaW4gMTAuNCB0byBkZWFsIHdpdGggdGhpcworICAgICAgICAgICAgIyBpc3N1ZSAobmVlZGVkIGJlY2F1c2UgcGF0Y2ggbGV2ZWxzIGNhbgorICAgICAgICAgICAgIyBydW4gaGlnaGVyIHRoYW4gOSwgc3VjaCBhcyAxMC40LjExKQorICAgICAgICAgICAgbWFqb3IsbWlub3IscGF0Y2ggPSBfbWFjX3Zlcl9sb29rdXAoKCdzeXMxJywnc3lzMicsJ3N5czMnKSkKKyAgICAgICAgICAgIHJlbGVhc2UgPSAnJWkuJWkuJWknICUobWFqb3IsIG1pbm9yLCBwYXRjaCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlbGVhc2UgPSAnJXMuJWkuJWknICUgKF9iY2Qyc3RyKG1ham9yKSxtaW5vcixwYXRjaCkKKworICAgIGlmIHN5c2E6CisgICAgICAgIG1hY2hpbmUgPSB7MHgxOiAnNjhrJywKKyAgICAgICAgICAgICAgICAgICAweDI6ICdQb3dlclBDJywKKyAgICAgICAgICAgICAgICAgICAweGE6ICdpMzg2J30uZ2V0KHN5c2EsJycpCisKKyAgICB2ZXJzaW9uaW5mbz0oJycsICcnLCAnJykKKyAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uaW5mbyxtYWNoaW5lCisKK2RlZiBfbWFjX3Zlcl94bWwoKToKKyAgICBmbiA9ICcvU3lzdGVtL0xpYnJhcnkvQ29yZVNlcnZpY2VzL1N5c3RlbVZlcnNpb24ucGxpc3QnCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHBsaXN0bGliCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgcGwgPSBwbGlzdGxpYi5yZWFkUGxpc3QoZm4pCisgICAgcmVsZWFzZSA9IHBsWydQcm9kdWN0VmVyc2lvbiddCisgICAgdmVyc2lvbmluZm89KCcnLCAnJywgJycpCisgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0KKyAgICBpZiBtYWNoaW5lIGluICgncHBjJywgJ1Bvd2VyIE1hY2ludG9zaCcpOgorICAgICAgICAjIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIGdlc3RhbHQgYmFzZWQgY29kZQorICAgICAgICBtYWNoaW5lID0gJ1Bvd2VyUEMnCisKKyAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uaW5mbyxtYWNoaW5lCisKKworZGVmIG1hY192ZXIocmVsZWFzZT0nJyx2ZXJzaW9uaW5mbz0oJycsJycsJycpLG1hY2hpbmU9JycpOgorCisgICAgIiIiIEdldCBNYWNPUyB2ZXJzaW9uIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gaXQgYXMgdHVwbGUgKHJlbGVhc2UsCisgICAgICAgIHZlcnNpb25pbmZvLCBtYWNoaW5lKSB3aXRoIHZlcnNpb25pbmZvIGJlaW5nIGEgdHVwbGUgKHZlcnNpb24sCisgICAgICAgIGRldl9zdGFnZSwgbm9uX3JlbGVhc2VfdmVyc2lvbikuCisKKyAgICAgICAgRW50cmllcyB3aGljaCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhcmUgc2V0IHRvIHRoZSBwYXJhbXRlciB2YWx1ZXMKKyAgICAgICAgd2hpY2ggZGVmYXVsdCB0byAnJy4gQWxsIHR1cGxlIGVudHJpZXMgYXJlIHN0cmluZ3MuCisgICAgIiIiCisKKyAgICAjIEZpcnN0IHRyeSByZWFkaW5nIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGFuIFhNTCBmaWxlIHdoaWNoIHNob3VsZAorICAgICMgYWx3YXlzIGJlIHByZXNlbnQKKyAgICBpbmZvID0gX21hY192ZXJfeG1sKCkKKyAgICBpZiBpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gaW5mbworCisgICAgIyBJZiB0aGF0IGRvZXNuJ3Qgd29yayBmb3Igc29tZSByZWFzb24gZmFsbCBiYWNrIHRvIHJlYWRpbmcgdGhlCisgICAgIyBpbmZvcm1hdGlvbiB1c2luZyBnZXN0YWx0IGNhbGxzLgorICAgIGluZm8gPSBfbWFjX3Zlcl9nZXN0YWx0KCkKKyAgICBpZiBpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gaW5mbworCisgICAgIyBJZiB0aGF0IGFsc28gZG9lc24ndCB3b3JrIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZXMKKyAgICByZXR1cm4gcmVsZWFzZSx2ZXJzaW9uaW5mbyxtYWNoaW5lCisKK2RlZiBfamF2YV9nZXRwcm9wKG5hbWUsZGVmYXVsdCk6CisKKyAgICBmcm9tIGphdmEubGFuZyBpbXBvcnQgU3lzdGVtCisgICAgdHJ5OgorICAgICAgICB2YWx1ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShuYW1lKQorICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICByZXR1cm4gZGVmYXVsdAorCitkZWYgamF2YV92ZXIocmVsZWFzZT0nJyx2ZW5kb3I9Jycsdm1pbmZvPSgnJywnJywnJyksb3NpbmZvPSgnJywnJywnJykpOgorCisgICAgIiIiIFZlcnNpb24gaW50ZXJmYWNlIGZvciBKeXRob24uCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIChyZWxlYXNlLHZlbmRvcix2bWluZm8sb3NpbmZvKSB3aXRoIHZtaW5mbyBiZWluZworICAgICAgICBhIHR1cGxlICh2bV9uYW1lLHZtX3JlbGVhc2Usdm1fdmVuZG9yKSBhbmQgb3NpbmZvIGJlaW5nIGEKKyAgICAgICAgdHVwbGUgKG9zX25hbWUsb3NfdmVyc2lvbixvc19hcmNoKS4KKworICAgICAgICBWYWx1ZXMgd2hpY2ggY2Fubm90IGJlIGRldGVybWluZWQgYXJlIHNldCB0byB0aGUgZGVmYXVsdHMKKyAgICAgICAgZ2l2ZW4gYXMgcGFyYW1ldGVycyAod2hpY2ggYWxsIGRlZmF1bHQgdG8gJycpLgorCisgICAgIiIiCisgICAgIyBJbXBvcnQgdGhlIG5lZWRlZCBBUElzCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgamF2YS5sYW5nCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gcmVsZWFzZSx2ZW5kb3Isdm1pbmZvLG9zaW5mbworCisgICAgdmVuZG9yID0gX2phdmFfZ2V0cHJvcCgnamF2YS52ZW5kb3InLCB2ZW5kb3IpCisgICAgcmVsZWFzZSA9IF9qYXZhX2dldHByb3AoJ2phdmEudmVyc2lvbicsIHJlbGVhc2UpCisgICAgdm1fbmFtZSwgdm1fcmVsZWFzZSwgdm1fdmVuZG9yID0gdm1pbmZvCisgICAgdm1fbmFtZSA9IF9qYXZhX2dldHByb3AoJ2phdmEudm0ubmFtZScsIHZtX25hbWUpCisgICAgdm1fdmVuZG9yID0gX2phdmFfZ2V0cHJvcCgnamF2YS52bS52ZW5kb3InLCB2bV92ZW5kb3IpCisgICAgdm1fcmVsZWFzZSA9IF9qYXZhX2dldHByb3AoJ2phdmEudm0udmVyc2lvbicsIHZtX3JlbGVhc2UpCisgICAgdm1pbmZvID0gdm1fbmFtZSwgdm1fcmVsZWFzZSwgdm1fdmVuZG9yCisgICAgb3NfbmFtZSwgb3NfdmVyc2lvbiwgb3NfYXJjaCA9IG9zaW5mbworICAgIG9zX2FyY2ggPSBfamF2YV9nZXRwcm9wKCdqYXZhLm9zLmFyY2gnLCBvc19hcmNoKQorICAgIG9zX25hbWUgPSBfamF2YV9nZXRwcm9wKCdqYXZhLm9zLm5hbWUnLCBvc19uYW1lKQorICAgIG9zX3ZlcnNpb24gPSBfamF2YV9nZXRwcm9wKCdqYXZhLm9zLnZlcnNpb24nLCBvc192ZXJzaW9uKQorICAgIG9zaW5mbyA9IG9zX25hbWUsIG9zX3ZlcnNpb24sIG9zX2FyY2gKKworICAgIHJldHVybiByZWxlYXNlLCB2ZW5kb3IsIHZtaW5mbywgb3NpbmZvCisKKyMjIyBTeXN0ZW0gbmFtZSBhbGlhc2luZworCitkZWYgc3lzdGVtX2FsaWFzKHN5c3RlbSxyZWxlYXNlLHZlcnNpb24pOgorCisgICAgIiIiIFJldHVybnMgKHN5c3RlbSxyZWxlYXNlLHZlcnNpb24pIGFsaWFzZWQgdG8gY29tbW9uCisgICAgICAgIG1hcmtldGluZyBuYW1lcyB1c2VkIGZvciBzb21lIHN5c3RlbXMuCisKKyAgICAgICAgSXQgYWxzbyBkb2VzIHNvbWUgcmVvcmRlcmluZyBvZiB0aGUgaW5mb3JtYXRpb24gaW4gc29tZSBjYXNlcworICAgICAgICB3aGVyZSBpdCB3b3VsZCBvdGhlcndpc2UgY2F1c2UgY29uZnVzaW9uLgorCisgICAgIiIiCisgICAgaWYgc3lzdGVtID09ICdSaGFwc29keSc6CisgICAgICAgICMgQXBwbGUncyBCU0QgZGVyaXZhdGl2ZQorICAgICAgICAjIFhYWCBIb3cgY2FuIHdlIGRldGVybWluZSB0aGUgbWFya2V0aW5nIHJlbGVhc2UgbnVtYmVyID8KKyAgICAgICAgcmV0dXJuICdNYWNPUyBYIFNlcnZlcicsc3lzdGVtK3JlbGVhc2UsdmVyc2lvbgorCisgICAgZWxpZiBzeXN0ZW0gPT0gJ1N1bk9TJzoKKyAgICAgICAgIyBTdW4ncyBPUworICAgICAgICBpZiByZWxlYXNlIDwgJzUnOgorICAgICAgICAgICAgIyBUaGVzZSByZWxlYXNlcyB1c2UgdGhlIG9sZCBuYW1lIFN1bk9TCisgICAgICAgICAgICByZXR1cm4gc3lzdGVtLHJlbGVhc2UsdmVyc2lvbgorICAgICAgICAjIE1vZGlmeSByZWxlYXNlIChtYXJrZXRpbmcgcmVsZWFzZSA9IFN1bk9TIHJlbGVhc2UgLSAzKQorICAgICAgICBsID0gc3RyaW5nLnNwbGl0KHJlbGVhc2UsJy4nKQorICAgICAgICBpZiBsOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1ham9yID0gaW50KGxbMF0pCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1ham9yID0gbWFqb3IgLSAzCisgICAgICAgICAgICAgICAgbFswXSA9IHN0cihtYWpvcikKKyAgICAgICAgICAgICAgICByZWxlYXNlID0gc3RyaW5nLmpvaW4obCwnLicpCisgICAgICAgIGlmIHJlbGVhc2UgPCAnNic6CisgICAgICAgICAgICBzeXN0ZW0gPSAnU29sYXJpcycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgWFhYIFdoYXRldmVyIHRoZSBuZXcgU3VuT1MgbWFya2V0aW5nIG5hbWUgaXMuLi4KKyAgICAgICAgICAgIHN5c3RlbSA9ICdTb2xhcmlzJworCisgICAgZWxpZiBzeXN0ZW0gPT0gJ0lSSVg2NCc6CisgICAgICAgICMgSVJJWCByZXBvcnRzIElSSVg2NCBvbiBwbGF0Zm9ybXMgd2l0aCA2NC1iaXQgc3VwcG9ydDsgeWV0IGl0CisgICAgICAgICMgaXMgcmVhbGx5IGEgdmVyc2lvbiBhbmQgbm90IGEgZGlmZmVyZW50IHBsYXRmb3JtLCBzaW5jZSAzMi1iaXQKKyAgICAgICAgIyBhcHBzIGFyZSBhbHNvIHN1cHBvcnRlZC4uCisgICAgICAgIHN5c3RlbSA9ICdJUklYJworICAgICAgICBpZiB2ZXJzaW9uOgorICAgICAgICAgICAgdmVyc2lvbiA9IHZlcnNpb24gKyAnICg2NGJpdCknCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB2ZXJzaW9uID0gJzY0Yml0JworCisgICAgZWxpZiBzeXN0ZW0gaW4gKCd3aW4zMicsJ3dpbjE2Jyk6CisgICAgICAgICMgSW4gY2FzZSBvbmUgb2YgdGhlIG90aGVyIHRyaWNrcworICAgICAgICBzeXN0ZW0gPSAnV2luZG93cycKKworICAgIHJldHVybiBzeXN0ZW0scmVsZWFzZSx2ZXJzaW9uCisKKyMjIyBWYXJpb3VzIGludGVybmFsIGhlbHBlcnMKKworZGVmIF9wbGF0Zm9ybSgqYXJncyk6CisKKyAgICAiIiIgSGVscGVyIHRvIGZvcm1hdCB0aGUgcGxhdGZvcm0gc3RyaW5nIGluIGEgZmlsZW5hbWUKKyAgICAgICAgY29tcGF0aWJsZSBmb3JtYXQgZS5nLiAic3lzdGVtLXZlcnNpb24tbWFjaGluZSIuCisgICAgIiIiCisgICAgIyBGb3JtYXQgdGhlIHBsYXRmb3JtIHN0cmluZworICAgIHBsYXRmb3JtID0gc3RyaW5nLmpvaW4oCisgICAgICAgIG1hcChzdHJpbmcuc3RyaXAsCisgICAgICAgICAgICBmaWx0ZXIobGVuLCBhcmdzKSksCisgICAgICAgICctJykKKworICAgICMgQ2xlYW51cCBzb21lIHBvc3NpYmxlIGZpbGVuYW1lIG9ic3RhY2xlcy4uLgorICAgIHJlcGxhY2UgPSBzdHJpbmcucmVwbGFjZQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnICcsJ18nKQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnLycsJy0nKQorICAgIHBsYXRmb3JtID0gcmVwbGFjZShwbGF0Zm9ybSwnXFwnLCctJykKKyAgICBwbGF0Zm9ybSA9IHJlcGxhY2UocGxhdGZvcm0sJzonLCctJykKKyAgICBwbGF0Zm9ybSA9IHJlcGxhY2UocGxhdGZvcm0sJzsnLCctJykKKyAgICBwbGF0Zm9ybSA9IHJlcGxhY2UocGxhdGZvcm0sJyInLCctJykKKyAgICBwbGF0Zm9ybSA9IHJlcGxhY2UocGxhdGZvcm0sJygnLCctJykKKyAgICBwbGF0Zm9ybSA9IHJlcGxhY2UocGxhdGZvcm0sJyknLCctJykKKworICAgICMgTm8gbmVlZCB0byByZXBvcnQgJ3Vua25vd24nIGluZm9ybWF0aW9uLi4uCisgICAgcGxhdGZvcm0gPSByZXBsYWNlKHBsYXRmb3JtLCd1bmtub3duJywnJykKKworICAgICMgRm9sZCAnLS0ncyBhbmQgcmVtb3ZlIHRyYWlsaW5nICctJworICAgIHdoaWxlIDE6CisgICAgICAgIGNsZWFuZWQgPSByZXBsYWNlKHBsYXRmb3JtLCctLScsJy0nKQorICAgICAgICBpZiBjbGVhbmVkID09IHBsYXRmb3JtOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcGxhdGZvcm0gPSBjbGVhbmVkCisgICAgd2hpbGUgcGxhdGZvcm1bLTFdID09ICctJzoKKyAgICAgICAgcGxhdGZvcm0gPSBwbGF0Zm9ybVs6LTFdCisKKyAgICByZXR1cm4gcGxhdGZvcm0KKworZGVmIF9ub2RlKGRlZmF1bHQ9JycpOgorCisgICAgIiIiIEhlbHBlciB0byBkZXRlcm1pbmUgdGhlIG5vZGUgbmFtZSBvZiB0aGlzIG1hY2hpbmUuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAjIE5vIHNvY2tldHMuLi4KKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzb2NrZXQuZ2V0aG9zdG5hbWUoKQorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICMgU3RpbGwgbm90IHdvcmtpbmcuLi4KKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworIyBvcy5wYXRoLmFic3BhdGggaXMgbmV3IGluIFB5dGhvbiAxLjUuMjoKK2lmIG5vdCBoYXNhdHRyKG9zLnBhdGgsJ2Fic3BhdGgnKToKKworICAgIGRlZiBfYWJzcGF0aChwYXRoLAorCisgICAgICAgICAgICAgICAgIGlzYWJzPW9zLnBhdGguaXNhYnMsam9pbj1vcy5wYXRoLmpvaW4sZ2V0Y3dkPW9zLmdldGN3ZCwKKyAgICAgICAgICAgICAgICAgbm9ybXBhdGg9b3MucGF0aC5ub3JtcGF0aCk6CisKKyAgICAgICAgaWYgbm90IGlzYWJzKHBhdGgpOgorICAgICAgICAgICAgcGF0aCA9IGpvaW4oZ2V0Y3dkKCksIHBhdGgpCisgICAgICAgIHJldHVybiBub3JtcGF0aChwYXRoKQorCitlbHNlOgorCisgICAgX2Fic3BhdGggPSBvcy5wYXRoLmFic3BhdGgKKworZGVmIF9mb2xsb3dfc3ltbGlua3MoZmlsZXBhdGgpOgorCisgICAgIiIiIEluIGNhc2UgZmlsZXBhdGggaXMgYSBzeW1saW5rLCBmb2xsb3cgaXQgdW50aWwgYQorICAgICAgICByZWFsIGZpbGUgaXMgcmVhY2hlZC4KKyAgICAiIiIKKyAgICBmaWxlcGF0aCA9IF9hYnNwYXRoKGZpbGVwYXRoKQorICAgIHdoaWxlIG9zLnBhdGguaXNsaW5rKGZpbGVwYXRoKToKKyAgICAgICAgZmlsZXBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKAorICAgICAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShmaWxlcGF0aCksb3MucmVhZGxpbmsoZmlsZXBhdGgpKSkKKyAgICByZXR1cm4gZmlsZXBhdGgKKworZGVmIF9zeXNjbWRfdW5hbWUob3B0aW9uLGRlZmF1bHQ9JycpOgorCisgICAgIiIiIEludGVyZmFjZSB0byB0aGUgc3lzdGVtJ3MgdW5hbWUgY29tbWFuZC4KKyAgICAiIiIKKyAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdkb3MnLCd3aW4zMicsJ3dpbjE2Jywnb3MyJyk6CisgICAgICAgICMgWFhYIE90aGVycyB0b28gPworICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIHRyeToKKyAgICAgICAgZiA9IG9zLnBvcGVuKCd1bmFtZSAlcyAyPiAlcycgJSAob3B0aW9uLCBERVZfTlVMTCkpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvcixvcy5lcnJvcik6CisgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgb3V0cHV0ID0gc3RyaW5nLnN0cmlwKGYucmVhZCgpKQorICAgIHJjID0gZi5jbG9zZSgpCisgICAgaWYgbm90IG91dHB1dCBvciByYzoKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gb3V0cHV0CisKK2RlZiBfc3lzY21kX2ZpbGUodGFyZ2V0LGRlZmF1bHQ9JycpOgorCisgICAgIiIiIEludGVyZmFjZSB0byB0aGUgc3lzdGVtJ3MgZmlsZSBjb21tYW5kLgorCisgICAgICAgIFRoZSBmdW5jdGlvbiB1c2VzIHRoZSAtYiBvcHRpb24gb2YgdGhlIGZpbGUgY29tbWFuZCB0byBoYXZlIGl0CisgICAgICAgIG9tbWl0IHRoZSBmaWxlbmFtZSBpbiBpdHMgb3V0cHV0IGFuZCBpZiBwb3NzaWJsZSB0aGUgLUwgb3B0aW9uCisgICAgICAgIHRvIGhhdmUgdGhlIGNvbW1hbmQgZm9sbG93IHN5bWxpbmtzLiBJdCByZXR1cm5zIGRlZmF1bHQgaW4KKyAgICAgICAgY2FzZSB0aGUgY29tbWFuZCBzaG91bGQgZmFpbC4KKworICAgICIiIgorCisgICAgIyBXZSBkbyB0aGUgaW1wb3J0IGhlcmUgdG8gYXZvaWQgYSBib290c3RyYXAgaXNzdWUuCisgICAgIyBTZWUgYzczYjkwYjZkYWRkIGNoYW5nZXNldC4KKyAgICAjCisgICAgIyBbLi5dCisgICAgIyByYW5saWIgbGlicHl0aG9uMi43LmEKKyAgICAjIGdjYyAgIC1vIHB5dGhvbiBcCisgICAgIyAgICAgICAgTW9kdWxlcy9weXRob24ubyBcCisgICAgIyAgICAgICAgbGlicHl0aG9uMi43LmEgLWxzb2NrZXQgLWxuc2wgLWxkbCAgICAtbG0KKyAgICAjIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAjICBGaWxlICIuL3NldHVwLnB5IiwgbGluZSA4LCBpbiA8bW9kdWxlPgorICAgICMgICAgZnJvbSBwbGF0Zm9ybSBpbXBvcnQgbWFjaGluZSBhcyBwbGF0Zm9ybV9tYWNoaW5lCisgICAgIyAgRmlsZSAiWy4uXS9idWlsZC9MaWIvcGxhdGZvcm0ucHkiLCBsaW5lIDExNiwgaW4gPG1vZHVsZT4KKyAgICAjICAgIGltcG9ydCBzeXMsc3RyaW5nLG9zLHJlLHN1YnByb2Nlc3MKKyAgICAjICBGaWxlICJbLi5dL2J1aWxkL0xpYi9zdWJwcm9jZXNzLnB5IiwgbGluZSA0MjksIGluIDxtb2R1bGU+CisgICAgIyAgICBpbXBvcnQgc2VsZWN0CisgICAgIyBJbXBvcnRFcnJvcjogTm8gbW9kdWxlIG5hbWVkIHNlbGVjdAorCisgICAgaW1wb3J0IHN1YnByb2Nlc3MKKworICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ2RvcycsJ3dpbjMyJywnd2luMTYnLCdvczInKToKKyAgICAgICAgIyBYWFggT3RoZXJzIHRvbyA/CisgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgdGFyZ2V0ID0gX2ZvbGxvd19zeW1saW5rcyh0YXJnZXQpCisgICAgdHJ5OgorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2ZpbGUnLCB0YXJnZXRdLAorICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKworICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3Isb3MuZXJyb3IpOgorICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIG91dHB1dCA9IHByb2MuY29tbXVuaWNhdGUoKVswXQorICAgIHJjID0gcHJvYy53YWl0KCkKKyAgICBpZiBub3Qgb3V0cHV0IG9yIHJjOgorICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBvdXRwdXQKKworIyMjIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VkIGFyY2hpdGVjdHVyZQorCisjIERlZmF1bHQgdmFsdWVzIGZvciBhcmNoaXRlY3R1cmU7IG5vbi1lbXB0eSBzdHJpbmdzIG92ZXJyaWRlIHRoZQorIyBkZWZhdWx0cyBnaXZlbiBhcyBwYXJhbWV0ZXJzCitfZGVmYXVsdF9hcmNoaXRlY3R1cmUgPSB7CisgICAgJ3dpbjMyJzogKCcnLCdXaW5kb3dzUEUnKSwKKyAgICAnd2luMTYnOiAoJycsJ1dpbmRvd3MnKSwKKyAgICAnZG9zJzogKCcnLCdNU0RPUycpLAorfQorCitfYXJjaGl0ZWN0dXJlX3NwbGl0ID0gcmUuY29tcGlsZShyJ1tccyxdJykuc3BsaXQKKworZGVmIGFyY2hpdGVjdHVyZShleGVjdXRhYmxlPXN5cy5leGVjdXRhYmxlLGJpdHM9JycsbGlua2FnZT0nJyk6CisKKyAgICAiIiIgUXVlcmllcyB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSAoZGVmYXVsdHMgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorICAgICAgICBiaW5hcnkpIGZvciB2YXJpb3VzIGFyY2hpdGVjdHVyZSBpbmZvcm1hdGlvbi4KKworICAgICAgICBSZXR1cm5zIGEgdHVwbGUgKGJpdHMsbGlua2FnZSkgd2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgICAgdGhlIGJpdCBhcmNoaXRlY3R1cmUgYW5kIHRoZSBsaW5rYWdlIGZvcm1hdCB1c2VkIGZvciB0aGUKKyAgICAgICAgZXhlY3V0YWJsZS4gQm90aCB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIHN0cmluZ3MuCisKKyAgICAgICAgVmFsdWVzIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQgYXJlIHJldHVybmVkIGFzIGdpdmVuIGJ5IHRoZQorICAgICAgICBwYXJhbWV0ZXIgcHJlc2V0cy4gSWYgYml0cyBpcyBnaXZlbiBhcyAnJywgdGhlIHNpemVvZihwb2ludGVyKQorICAgICAgICAob3Igc2l6ZW9mKGxvbmcpIG9uIFB5dGhvbiB2ZXJzaW9uIDwgMS41LjIpIGlzIHVzZWQgYXMKKyAgICAgICAgaW5kaWNhdG9yIGZvciB0aGUgc3VwcG9ydGVkIHBvaW50ZXIgc2l6ZS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gcmVsaWVzIG9uIHRoZSBzeXN0ZW0ncyAiZmlsZSIgY29tbWFuZCB0byBkbyB0aGUKKyAgICAgICAgYWN0dWFsIHdvcmsuIFRoaXMgaXMgYXZhaWxhYmxlIG9uIG1vc3QgaWYgbm90IGFsbCBVbml4CisgICAgICAgIHBsYXRmb3Jtcy4gT24gc29tZSBub24tVW5peCBwbGF0Zm9ybXMgd2hlcmUgdGhlICJmaWxlIiBjb21tYW5kCisgICAgICAgIGRvZXMgbm90IGV4aXN0IGFuZCB0aGUgZXhlY3V0YWJsZSBpcyBzZXQgdG8gdGhlIFB5dGhvbiBpbnRlcnByZXRlcgorICAgICAgICBiaW5hcnkgZGVmYXVsdHMgZnJvbSBfZGVmYXVsdF9hcmNoaXRlY3R1cmUgYXJlIHVzZWQuCisKKyAgICAiIiIKKyAgICAjIFVzZSB0aGUgc2l6ZW9mKHBvaW50ZXIpIGFzIGRlZmF1bHQgbnVtYmVyIG9mIGJpdHMgaWYgbm90aGluZworICAgICMgZWxzZSBpcyBnaXZlbiBhcyBkZWZhdWx0LgorICAgIGlmIG5vdCBiaXRzOgorICAgICAgICBpbXBvcnQgc3RydWN0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNpemUgPSBzdHJ1Y3QuY2FsY3NpemUoJ1AnKQorICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICAgICAgIyBPbGRlciBpbnN0YWxsYXRpb25zIGNhbiBvbmx5IHF1ZXJ5IGxvbmdzCisgICAgICAgICAgICBzaXplID0gc3RydWN0LmNhbGNzaXplKCdsJykKKyAgICAgICAgYml0cyA9IHN0cihzaXplKjgpICsgJ2JpdCcKKworICAgICMgR2V0IGRhdGEgZnJvbSB0aGUgJ2ZpbGUnIHN5c3RlbSBjb21tYW5kCisgICAgaWYgZXhlY3V0YWJsZToKKyAgICAgICAgb3V0cHV0ID0gX3N5c2NtZF9maWxlKGV4ZWN1dGFibGUsICcnKQorICAgIGVsc2U6CisgICAgICAgIG91dHB1dCA9ICcnCisKKyAgICBpZiBub3Qgb3V0cHV0IGFuZCBcCisgICAgICAgZXhlY3V0YWJsZSA9PSBzeXMuZXhlY3V0YWJsZToKKyAgICAgICAgIyAiZmlsZSIgY29tbWFuZCBkaWQgbm90IHJldHVybiBhbnl0aGluZzsgd2UnbGwgdHJ5IHRvIHByb3ZpZGUKKyAgICAgICAgIyBzb21lIHNlbnNpYmxlIGRlZmF1bHRzIHRoZW4uLi4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluIF9kZWZhdWx0X2FyY2hpdGVjdHVyZToKKyAgICAgICAgICAgIGIsIGwgPSBfZGVmYXVsdF9hcmNoaXRlY3R1cmVbc3lzLnBsYXRmb3JtXQorICAgICAgICAgICAgaWYgYjoKKyAgICAgICAgICAgICAgICBiaXRzID0gYgorICAgICAgICAgICAgaWYgbDoKKyAgICAgICAgICAgICAgICBsaW5rYWdlID0gbAorICAgICAgICByZXR1cm4gYml0cywgbGlua2FnZQorCisgICAgIyBTcGxpdCB0aGUgb3V0cHV0IGludG8gYSBsaXN0IG9mIHN0cmluZ3Mgb21pdHRpbmcgdGhlIGZpbGVuYW1lCisgICAgZmlsZW91dCA9IF9hcmNoaXRlY3R1cmVfc3BsaXQob3V0cHV0KVsxOl0KKworICAgIGlmICdleGVjdXRhYmxlJyBub3QgaW4gZmlsZW91dDoKKyAgICAgICAgIyBGb3JtYXQgbm90IHN1cHBvcnRlZAorICAgICAgICByZXR1cm4gYml0cyxsaW5rYWdlCisKKyAgICAjIEJpdHMKKyAgICBpZiAnMzItYml0JyBpbiBmaWxlb3V0OgorICAgICAgICBiaXRzID0gJzMyYml0JworICAgIGVsaWYgJ04zMicgaW4gZmlsZW91dDoKKyAgICAgICAgIyBPbiBJcml4IG9ubHkKKyAgICAgICAgYml0cyA9ICduMzJiaXQnCisgICAgZWxpZiAnNjQtYml0JyBpbiBmaWxlb3V0OgorICAgICAgICBiaXRzID0gJzY0Yml0JworCisgICAgIyBMaW5rYWdlCisgICAgaWYgJ0VMRicgaW4gZmlsZW91dDoKKyAgICAgICAgbGlua2FnZSA9ICdFTEYnCisgICAgZWxpZiAnUEUnIGluIGZpbGVvdXQ6CisgICAgICAgICMgRS5nLiBXaW5kb3dzIHVzZXMgdGhpcyBmb3JtYXQKKyAgICAgICAgaWYgJ1dpbmRvd3MnIGluIGZpbGVvdXQ6CisgICAgICAgICAgICBsaW5rYWdlID0gJ1dpbmRvd3NQRScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxpbmthZ2UgPSAnUEUnCisgICAgZWxpZiAnQ09GRicgaW4gZmlsZW91dDoKKyAgICAgICAgbGlua2FnZSA9ICdDT0ZGJworICAgIGVsaWYgJ01TLURPUycgaW4gZmlsZW91dDoKKyAgICAgICAgbGlua2FnZSA9ICdNU0RPUycKKyAgICBlbHNlOgorICAgICAgICAjIFhYWCB0aGUgQS5PVVQgZm9ybWF0IGFsc28gZmFsbHMgdW5kZXIgdGhpcyBjbGFzcy4uLgorICAgICAgICBwYXNzCisKKyAgICByZXR1cm4gYml0cyxsaW5rYWdlCisKKyMjIyBQb3J0YWJsZSB1bmFtZSgpIGludGVyZmFjZQorCitfdW5hbWVfY2FjaGUgPSBOb25lCisKK2RlZiB1bmFtZSgpOgorCisgICAgIiIiIEZhaXJseSBwb3J0YWJsZSB1bmFtZSBpbnRlcmZhY2UuIFJldHVybnMgYSB0dXBsZQorICAgICAgICBvZiBzdHJpbmdzIChzeXN0ZW0sbm9kZSxyZWxlYXNlLHZlcnNpb24sbWFjaGluZSxwcm9jZXNzb3IpCisgICAgICAgIGlkZW50aWZ5aW5nIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtLgorCisgICAgICAgIE5vdGUgdGhhdCB1bmxpa2UgdGhlIG9zLnVuYW1lIGZ1bmN0aW9uIHRoaXMgYWxzbyByZXR1cm5zCisgICAgICAgIHBvc3NpYmxlIHByb2Nlc3NvciBpbmZvcm1hdGlvbiBhcyBhbiBhZGRpdGlvbmFsIHR1cGxlIGVudHJ5LgorCisgICAgICAgIEVudHJpZXMgd2hpY2ggY2Fubm90IGJlIGRldGVybWluZWQgYXJlIHNldCB0byAnJy4KKworICAgICIiIgorICAgIGdsb2JhbCBfdW5hbWVfY2FjaGUKKyAgICBub19vc191bmFtZSA9IDAKKworICAgIGlmIF91bmFtZV9jYWNoZSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIF91bmFtZV9jYWNoZQorCisgICAgcHJvY2Vzc29yID0gJycKKworICAgICMgR2V0IHNvbWUgaW5mb3MgZnJvbSB0aGUgYnVpbHRpbiBvcy51bmFtZSBBUEkuLi4KKyAgICB0cnk6CisgICAgICAgIHN5c3RlbSxub2RlLHJlbGVhc2UsdmVyc2lvbixtYWNoaW5lID0gb3MudW5hbWUoKQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgbm9fb3NfdW5hbWUgPSAxCisKKyAgICBpZiBub19vc191bmFtZSBvciBub3QgZmlsdGVyKE5vbmUsIChzeXN0ZW0sIG5vZGUsIHJlbGVhc2UsIHZlcnNpb24sIG1hY2hpbmUpKToKKyAgICAgICAgIyBIbW0sIG5vIHRoZXJlIGlzIGVpdGhlciBubyB1bmFtZSBvciB1bmFtZSBoYXMgcmV0dXJuZWQKKyAgICAgICAgIyd1bmtub3ducycuLi4gd2UnbGwgaGF2ZSB0byBwb2tlIGFyb3VuZCB0aGUgc3lzdGVtIHRoZW4uCisgICAgICAgIGlmIG5vX29zX3VuYW1lOgorICAgICAgICAgICAgc3lzdGVtID0gc3lzLnBsYXRmb3JtCisgICAgICAgICAgICByZWxlYXNlID0gJycKKyAgICAgICAgICAgIHZlcnNpb24gPSAnJworICAgICAgICAgICAgbm9kZSA9IF9ub2RlKCkKKyAgICAgICAgICAgIG1hY2hpbmUgPSAnJworCisgICAgICAgIHVzZV9zeXNjbWRfdmVyID0gMQorCisgICAgICAgICMgVHJ5IHdpbjMyX3ZlcigpIG9uIHdpbjMyIHBsYXRmb3JtcworICAgICAgICBpZiBzeXN0ZW0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHJlbGVhc2UsdmVyc2lvbixjc2QscHR5cGUgPSB3aW4zMl92ZXIoKQorICAgICAgICAgICAgaWYgcmVsZWFzZSBhbmQgdmVyc2lvbjoKKyAgICAgICAgICAgICAgICB1c2Vfc3lzY21kX3ZlciA9IDAKKyAgICAgICAgICAgICMgVHJ5IHRvIHVzZSB0aGUgUFJPQ0VTU09SXyogZW52aXJvbm1lbnQgdmFyaWFibGVzCisgICAgICAgICAgICAjIGF2YWlsYWJsZSBvbiBXaW4gWFAgYW5kIGxhdGVyOyBzZWUKKyAgICAgICAgICAgICMgaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi84ODg3MzEgYW5kCisgICAgICAgICAgICAjIGh0dHA6Ly93d3cuZ2VvY2l0aWVzLmNvbS9yaWNrX2xpdmVseS9NQU5VQUxTL0VOVi9NU1dJTi9QUk9DRVNTSS5IVE0KKyAgICAgICAgICAgIGlmIG5vdCBtYWNoaW5lOgorICAgICAgICAgICAgICAgICMgV09XNjQgcHJvY2Vzc2VzIG1hc2sgdGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUKKyAgICAgICAgICAgICAgICBpZiAiUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9IG9zLmVudmlyb24uZ2V0KCJQUk9DRVNTT1JfQVJDSElURVc2NDMyIiwgJycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbWFjaGluZSA9IG9zLmVudmlyb24uZ2V0KCdQUk9DRVNTT1JfQVJDSElURUNUVVJFJywgJycpCisgICAgICAgICAgICBpZiBub3QgcHJvY2Vzc29yOgorICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9IG9zLmVudmlyb24uZ2V0KCdQUk9DRVNTT1JfSURFTlRJRklFUicsIG1hY2hpbmUpCisKKyAgICAgICAgIyBUcnkgdGhlICd2ZXInIHN5c3RlbSBjb21tYW5kIGF2YWlsYWJsZSBvbiBzb21lCisgICAgICAgICMgcGxhdGZvcm1zCisgICAgICAgIGlmIHVzZV9zeXNjbWRfdmVyOgorICAgICAgICAgICAgc3lzdGVtLHJlbGVhc2UsdmVyc2lvbiA9IF9zeXNjbWRfdmVyKHN5c3RlbSkKKyAgICAgICAgICAgICMgTm9ybWFsaXplIHN5c3RlbSB0byB3aGF0IHdpbjMyX3ZlcigpIG5vcm1hbGx5IHJldHVybnMKKyAgICAgICAgICAgICMgKF9zeXNjbWRfdmVyKCkgdGVuZHMgdG8gcmV0dXJuIHRoZSB2ZW5kb3IgbmFtZSBhcyB3ZWxsKQorICAgICAgICAgICAgaWYgc3lzdGVtID09ICdNaWNyb3NvZnQgV2luZG93cyc6CisgICAgICAgICAgICAgICAgc3lzdGVtID0gJ1dpbmRvd3MnCisgICAgICAgICAgICBlbGlmIHN5c3RlbSA9PSAnTWljcm9zb2Z0JyBhbmQgcmVsZWFzZSA9PSAnV2luZG93cyc6CisgICAgICAgICAgICAgICAgIyBVbmRlciBXaW5kb3dzIFZpc3RhIGFuZCBXaW5kb3dzIFNlcnZlciAyMDA4LAorICAgICAgICAgICAgICAgICMgTWljcm9zb2Z0IGNoYW5nZWQgdGhlIG91dHB1dCBvZiB0aGUgdmVyIGNvbW1hbmQuIFRoZQorICAgICAgICAgICAgICAgICMgcmVsZWFzZSBpcyBubyBsb25nZXIgcHJpbnRlZC4gIFRoaXMgY2F1c2VzIHRoZQorICAgICAgICAgICAgICAgICMgc3lzdGVtIGFuZCByZWxlYXNlIHRvIGJlIG1pc2lkZW50aWZpZWQuCisgICAgICAgICAgICAgICAgc3lzdGVtID0gJ1dpbmRvd3MnCisgICAgICAgICAgICAgICAgaWYgJzYuMCcgPT0gdmVyc2lvbls6M106CisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UgPSAnVmlzdGEnCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZSA9ICcnCisKKyAgICAgICAgIyBJbiBjYXNlIHdlIHN0aWxsIGRvbid0IGtub3cgYW55dGhpbmcgdXNlZnVsLCB3ZSdsbCB0cnkgdG8KKyAgICAgICAgIyBoZWxwIG91cnNlbHZlcworICAgICAgICBpZiBzeXN0ZW0gaW4gKCd3aW4zMicsJ3dpbjE2Jyk6CisgICAgICAgICAgICBpZiBub3QgdmVyc2lvbjoKKyAgICAgICAgICAgICAgICBpZiBzeXN0ZW0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA9ICczMmJpdCcKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uID0gJzE2Yml0JworICAgICAgICAgICAgc3lzdGVtID0gJ1dpbmRvd3MnCisKKyAgICAgICAgZWxpZiBzeXN0ZW1bOjRdID09ICdqYXZhJzoKKyAgICAgICAgICAgIHJlbGVhc2UsdmVuZG9yLHZtaW5mbyxvc2luZm8gPSBqYXZhX3ZlcigpCisgICAgICAgICAgICBzeXN0ZW0gPSAnSmF2YScKKyAgICAgICAgICAgIHZlcnNpb24gPSBzdHJpbmcuam9pbih2bWluZm8sJywgJykKKyAgICAgICAgICAgIGlmIG5vdCB2ZXJzaW9uOgorICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2ZW5kb3IKKworICAgICMgU3lzdGVtIHNwZWNpZmljIGV4dGVuc2lvbnMKKyAgICBpZiBzeXN0ZW0gPT0gJ09wZW5WTVMnOgorICAgICAgICAjIE9wZW5WTVMgc2VlbXMgdG8gaGF2ZSByZWxlYXNlIGFuZCB2ZXJzaW9uIG1peGVkIHVwCisgICAgICAgIGlmIG5vdCByZWxlYXNlIG9yIHJlbGVhc2UgPT0gJzAnOgorICAgICAgICAgICAgcmVsZWFzZSA9IHZlcnNpb24KKyAgICAgICAgICAgIHZlcnNpb24gPSAnJworICAgICAgICAjIEdldCBwcm9jZXNzb3IgaW5mb3JtYXRpb24KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHZtc19saWIKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3NpZCwgY3B1X251bWJlciA9IHZtc19saWIuZ2V0c3lpKCdTWUkkX0NQVScsMCkKKyAgICAgICAgICAgIGlmIChjcHVfbnVtYmVyID49IDEyOCk6CisgICAgICAgICAgICAgICAgcHJvY2Vzc29yID0gJ0FscGhhJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPSAnVkFYJworICAgIGlmIG5vdCBwcm9jZXNzb3I6CisgICAgICAgICMgR2V0IHByb2Nlc3NvciBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1bmFtZSBzeXN0ZW0gY29tbWFuZAorICAgICAgICBwcm9jZXNzb3IgPSBfc3lzY21kX3VuYW1lKCctcCcsJycpCisKKyAgICAjSWYgYW55IHVua25vd25zIHN0aWxsIGV4aXN0LCByZXBsYWNlIHRoZW0gd2l0aCAnJ3MsIHdoaWNoIGFyZSBtb3JlIHBvcnRhYmxlCisgICAgaWYgc3lzdGVtID09ICd1bmtub3duJzoKKyAgICAgICAgc3lzdGVtID0gJycKKyAgICBpZiBub2RlID09ICd1bmtub3duJzoKKyAgICAgICAgbm9kZSA9ICcnCisgICAgaWYgcmVsZWFzZSA9PSAndW5rbm93bic6CisgICAgICAgIHJlbGVhc2UgPSAnJworICAgIGlmIHZlcnNpb24gPT0gJ3Vua25vd24nOgorICAgICAgICB2ZXJzaW9uID0gJycKKyAgICBpZiBtYWNoaW5lID09ICd1bmtub3duJzoKKyAgICAgICAgbWFjaGluZSA9ICcnCisgICAgaWYgcHJvY2Vzc29yID09ICd1bmtub3duJzoKKyAgICAgICAgcHJvY2Vzc29yID0gJycKKworICAgICMgIG5vcm1hbGl6ZSBuYW1lCisgICAgaWYgc3lzdGVtID09ICdNaWNyb3NvZnQnIGFuZCByZWxlYXNlID09ICdXaW5kb3dzJzoKKyAgICAgICAgc3lzdGVtID0gJ1dpbmRvd3MnCisgICAgICAgIHJlbGVhc2UgPSAnVmlzdGEnCisKKyAgICBfdW5hbWVfY2FjaGUgPSBzeXN0ZW0sbm9kZSxyZWxlYXNlLHZlcnNpb24sbWFjaGluZSxwcm9jZXNzb3IKKyAgICByZXR1cm4gX3VuYW1lX2NhY2hlCisKKyMjIyBEaXJlY3QgaW50ZXJmYWNlcyB0byBzb21lIG9mIHRoZSB1bmFtZSgpIHJldHVybiB2YWx1ZXMKKworZGVmIHN5c3RlbSgpOgorCisgICAgIiIiIFJldHVybnMgdGhlIHN5c3RlbS9PUyBuYW1lLCBlLmcuICdMaW51eCcsICdXaW5kb3dzJyBvciAnSmF2YScuCisKKyAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKworICAgICIiIgorICAgIHJldHVybiB1bmFtZSgpWzBdCisKK2RlZiBub2RlKCk6CisKKyAgICAiIiIgUmV0dXJucyB0aGUgY29tcHV0ZXIncyBuZXR3b3JrIG5hbWUgKHdoaWNoIG1heSBub3QgYmUgZnVsbHkKKyAgICAgICAgcXVhbGlmaWVkKQorCisgICAgICAgIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gdW5hbWUoKVsxXQorCitkZWYgcmVsZWFzZSgpOgorCisgICAgIiIiIFJldHVybnMgdGhlIHN5c3RlbSdzIHJlbGVhc2UsIGUuZy4gJzIuMi4wJyBvciAnTlQnCisKKyAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKworICAgICIiIgorICAgIHJldHVybiB1bmFtZSgpWzJdCisKK2RlZiB2ZXJzaW9uKCk6CisKKyAgICAiIiIgUmV0dXJucyB0aGUgc3lzdGVtJ3MgcmVsZWFzZSB2ZXJzaW9uLCBlLmcuICcjMyBvbiBkZWdhcycKKworICAgICAgICBBbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHVuYW1lKClbM10KKworZGVmIG1hY2hpbmUoKToKKworICAgICIiIiBSZXR1cm5zIHRoZSBtYWNoaW5lIHR5cGUsIGUuZy4gJ2kzODYnCisKKyAgICAgICAgQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGlmIHRoZSB2YWx1ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZC4KKworICAgICIiIgorICAgIHJldHVybiB1bmFtZSgpWzRdCisKK2RlZiBwcm9jZXNzb3IoKToKKworICAgICIiIiBSZXR1cm5zIHRoZSAodHJ1ZSkgcHJvY2Vzc29yIG5hbWUsIGUuZy4gJ2FtZGs2JworCisgICAgICAgIEFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0aGUgdmFsdWUgY2Fubm90IGJlCisgICAgICAgIGRldGVybWluZWQuIE5vdGUgdGhhdCBtYW55IHBsYXRmb3JtcyBkbyBub3QgcHJvdmlkZSB0aGlzCisgICAgICAgIGluZm9ybWF0aW9uIG9yIHNpbXBseSByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgZm9yIG1hY2hpbmUoKSwKKyAgICAgICAgZS5nLiAgTmV0QlNEIGRvZXMgdGhpcy4KKworICAgICIiIgorICAgIHJldHVybiB1bmFtZSgpWzVdCisKKyMjIyBWYXJpb3VzIEFQSXMgZm9yIGV4dHJhY3RpbmcgaW5mb3JtYXRpb24gZnJvbSBzeXMudmVyc2lvbgorCitfc3lzX3ZlcnNpb25fcGFyc2VyID0gcmUuY29tcGlsZSgKKyAgICByJyhbXHcuK10rKVxzKicKKyAgICAnXCgjPyhbXixdKyksXHMqKFtcdyBdKyksXHMqKFtcdyA6XSspXClccyonCisgICAgJ1xbKFteXF1dKylcXT8nKQorCitfaXJvbnB5dGhvbl9zeXNfdmVyc2lvbl9wYXJzZXIgPSByZS5jb21waWxlKAorICAgIHInSXJvblB5dGhvblxzKicKKyAgICAnKFtcZFwuXSspJworICAgICcoPzogXCgoW1xkXC5dKylcKSk/JworICAgICcgb24gKC5ORVQgW1xkXC5dKyknKQorCitfcHlweV9zeXNfdmVyc2lvbl9wYXJzZXIgPSByZS5jb21waWxlKAorICAgIHInKFtcdy4rXSspXHMqJworICAgICdcKCM/KFteLF0rKSxccyooW1x3IF0rKSxccyooW1x3IDpdKylcKVxzKicKKyAgICAnXFtQeVB5IFteXF1dK1xdPycpCisKK19zeXNfdmVyc2lvbl9jYWNoZSA9IHt9CisKK2RlZiBfc3lzX3ZlcnNpb24oc3lzX3ZlcnNpb249Tm9uZSk6CisKKyAgICAiIiIgUmV0dXJucyBhIHBhcnNlZCB2ZXJzaW9uIG9mIFB5dGhvbidzIHN5cy52ZXJzaW9uIGFzIHR1cGxlCisgICAgICAgIChuYW1lLCB2ZXJzaW9uLCBicmFuY2gsIHJldmlzaW9uLCBidWlsZG5vLCBidWlsZGRhdGUsIGNvbXBpbGVyKQorICAgICAgICByZWZlcnJpbmcgdG8gdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBuYW1lLCB2ZXJzaW9uLCBicmFuY2gsCisgICAgICAgIHJldmlzaW9uLCBidWlsZCBudW1iZXIsIGJ1aWxkIGRhdGUvdGltZSBhcyBzdHJpbmcgYW5kIHRoZSBjb21waWxlcgorICAgICAgICBpZGVudGlmaWNhdGlvbiBzdHJpbmcuCisKKyAgICAgICAgTm90ZSB0aGF0IHVubGlrZSB0aGUgUHl0aG9uIHN5cy52ZXJzaW9uLCB0aGUgcmV0dXJuZWQgdmFsdWUKKyAgICAgICAgZm9yIHRoZSBQeXRob24gdmVyc2lvbiB3aWxsIGFsd2F5cyBpbmNsdWRlIHRoZSBwYXRjaGxldmVsIChpdAorICAgICAgICBkZWZhdWx0cyB0byAnLjAnKS4KKworICAgICAgICBUaGUgZnVuY3Rpb24gcmV0dXJucyBlbXB0eSBzdHJpbmdzIGZvciB0dXBsZSBlbnRyaWVzIHRoYXQKKyAgICAgICAgY2Fubm90IGJlIGRldGVybWluZWQuCisKKyAgICAgICAgc3lzX3ZlcnNpb24gbWF5IGJlIGdpdmVuIHRvIHBhcnNlIGFuIGFsdGVybmF0aXZlIHZlcnNpb24KKyAgICAgICAgc3RyaW5nLCBlLmcuIGlmIHRoZSB2ZXJzaW9uIHdhcyByZWFkIGZyb20gYSBkaWZmZXJlbnQgUHl0aG9uCisgICAgICAgIGludGVycHJldGVyLgorCisgICAgIiIiCisgICAgIyBHZXQgdGhlIFB5dGhvbiB2ZXJzaW9uCisgICAgaWYgc3lzX3ZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgc3lzX3ZlcnNpb24gPSBzeXMudmVyc2lvbgorCisgICAgIyBUcnkgdGhlIGNhY2hlIGZpcnN0CisgICAgcmVzdWx0ID0gX3N5c192ZXJzaW9uX2NhY2hlLmdldChzeXNfdmVyc2lvbiwgTm9uZSkKKyAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICMgUGFyc2UgaXQKKyAgICBpZiBzeXNfdmVyc2lvbls6MTBdID09ICdJcm9uUHl0aG9uJzoKKyAgICAgICAgIyBJcm9uUHl0aG9uCisgICAgICAgIG5hbWUgPSAnSXJvblB5dGhvbicKKyAgICAgICAgbWF0Y2ggPSBfaXJvbnB5dGhvbl9zeXNfdmVyc2lvbl9wYXJzZXIubWF0Y2goc3lzX3ZlcnNpb24pCisgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICdmYWlsZWQgdG8gcGFyc2UgSXJvblB5dGhvbiBzeXMudmVyc2lvbjogJXMnICUKKyAgICAgICAgICAgICAgICByZXByKHN5c192ZXJzaW9uKSkKKyAgICAgICAgdmVyc2lvbiwgYWx0X3ZlcnNpb24sIGNvbXBpbGVyID0gbWF0Y2guZ3JvdXBzKCkKKyAgICAgICAgYnVpbGRubyA9ICcnCisgICAgICAgIGJ1aWxkZGF0ZSA9ICcnCisKKyAgICBlbGlmIHN5cy5wbGF0Zm9ybVs6NF0gPT0gJ2phdmEnOgorICAgICAgICAjIEp5dGhvbgorICAgICAgICBuYW1lID0gJ0p5dGhvbicKKyAgICAgICAgbWF0Y2ggPSBfc3lzX3ZlcnNpb25fcGFyc2VyLm1hdGNoKHN5c192ZXJzaW9uKQorICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAnZmFpbGVkIHRvIHBhcnNlIEp5dGhvbiBzeXMudmVyc2lvbjogJXMnICUKKyAgICAgICAgICAgICAgICByZXByKHN5c192ZXJzaW9uKSkKKyAgICAgICAgdmVyc2lvbiwgYnVpbGRubywgYnVpbGRkYXRlLCBidWlsZHRpbWUsIF8gPSBtYXRjaC5ncm91cHMoKQorICAgICAgICBjb21waWxlciA9IHN5cy5wbGF0Zm9ybQorCisgICAgZWxpZiAiUHlQeSIgaW4gc3lzX3ZlcnNpb246CisgICAgICAgICMgUHlQeQorICAgICAgICBuYW1lID0gIlB5UHkiCisgICAgICAgIG1hdGNoID0gX3B5cHlfc3lzX3ZlcnNpb25fcGFyc2VyLm1hdGNoKHN5c192ZXJzaW9uKQorICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiZmFpbGVkIHRvIHBhcnNlIFB5UHkgc3lzLnZlcnNpb246ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoc3lzX3ZlcnNpb24pKQorICAgICAgICB2ZXJzaW9uLCBidWlsZG5vLCBidWlsZGRhdGUsIGJ1aWxkdGltZSA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgIGNvbXBpbGVyID0gIiIKKworICAgIGVsc2U6CisgICAgICAgICMgQ1B5dGhvbgorICAgICAgICBtYXRjaCA9IF9zeXNfdmVyc2lvbl9wYXJzZXIubWF0Y2goc3lzX3ZlcnNpb24pCisgICAgICAgIGlmIG1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICdmYWlsZWQgdG8gcGFyc2UgQ1B5dGhvbiBzeXMudmVyc2lvbjogJXMnICUKKyAgICAgICAgICAgICAgICByZXByKHN5c192ZXJzaW9uKSkKKyAgICAgICAgdmVyc2lvbiwgYnVpbGRubywgYnVpbGRkYXRlLCBidWlsZHRpbWUsIGNvbXBpbGVyID0gXAorICAgICAgICAgICAgICBtYXRjaC5ncm91cHMoKQorICAgICAgICBuYW1lID0gJ0NQeXRob24nCisgICAgICAgIGJ1aWxkZGF0ZSA9IGJ1aWxkZGF0ZSArICcgJyArIGJ1aWxkdGltZQorCisgICAgaWYgaGFzYXR0cihzeXMsICdzdWJ2ZXJzaW9uJyk6CisgICAgICAgICMgc3lzLnN1YnZlcnNpb24gd2FzIGFkZGVkIGluIFB5dGhvbiAyLjUKKyAgICAgICAgXywgYnJhbmNoLCByZXZpc2lvbiA9IHN5cy5zdWJ2ZXJzaW9uCisgICAgZWxzZToKKyAgICAgICAgYnJhbmNoID0gJycKKyAgICAgICAgcmV2aXNpb24gPSAnJworCisgICAgIyBBZGQgdGhlIHBhdGNobGV2ZWwgdmVyc2lvbiBpZiBtaXNzaW5nCisgICAgbCA9IHN0cmluZy5zcGxpdCh2ZXJzaW9uLCAnLicpCisgICAgaWYgbGVuKGwpID09IDI6CisgICAgICAgIGwuYXBwZW5kKCcwJykKKyAgICAgICAgdmVyc2lvbiA9IHN0cmluZy5qb2luKGwsICcuJykKKworICAgICMgQnVpbGQgYW5kIGNhY2hlIHRoZSByZXN1bHQKKyAgICByZXN1bHQgPSAobmFtZSwgdmVyc2lvbiwgYnJhbmNoLCByZXZpc2lvbiwgYnVpbGRubywgYnVpbGRkYXRlLCBjb21waWxlcikKKyAgICBfc3lzX3ZlcnNpb25fY2FjaGVbc3lzX3ZlcnNpb25dID0gcmVzdWx0CisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgcHl0aG9uX2ltcGxlbWVudGF0aW9uKCk6CisKKyAgICAiIiIgUmV0dXJucyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgIEN1cnJlbnRseSwgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbnMgYXJlIGlkZW50aWZpZWQ6CisgICAgICAgICAgJ0NQeXRob24nIChDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiksCisgICAgICAgICAgJ0lyb25QeXRob24nICguTkVUIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiksCisgICAgICAgICAgJ0p5dGhvbicgKEphdmEgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uKSwKKyAgICAgICAgICAnUHlQeScgKFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24pLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9zeXNfdmVyc2lvbigpWzBdCisKK2RlZiBweXRob25fdmVyc2lvbigpOgorCisgICAgIiIiIFJldHVybnMgdGhlIFB5dGhvbiB2ZXJzaW9uIGFzIHN0cmluZyAnbWFqb3IubWlub3IucGF0Y2hsZXZlbCcKKworICAgICAgICBOb3RlIHRoYXQgdW5saWtlIHRoZSBQeXRob24gc3lzLnZlcnNpb24sIHRoZSByZXR1cm5lZCB2YWx1ZQorICAgICAgICB3aWxsIGFsd2F5cyBpbmNsdWRlIHRoZSBwYXRjaGxldmVsIChpdCBkZWZhdWx0cyB0byAwKS4KKworICAgICIiIgorICAgIHJldHVybiBfc3lzX3ZlcnNpb24oKVsxXQorCitkZWYgcHl0aG9uX3ZlcnNpb25fdHVwbGUoKToKKworICAgICIiIiBSZXR1cm5zIHRoZSBQeXRob24gdmVyc2lvbiBhcyB0dXBsZSAobWFqb3IsIG1pbm9yLCBwYXRjaGxldmVsKQorICAgICAgICBvZiBzdHJpbmdzLgorCisgICAgICAgIE5vdGUgdGhhdCB1bmxpa2UgdGhlIFB5dGhvbiBzeXMudmVyc2lvbiwgdGhlIHJldHVybmVkIHZhbHVlCisgICAgICAgIHdpbGwgYWx3YXlzIGluY2x1ZGUgdGhlIHBhdGNobGV2ZWwgKGl0IGRlZmF1bHRzIHRvIDApLgorCisgICAgIiIiCisgICAgcmV0dXJuIHR1cGxlKHN0cmluZy5zcGxpdChfc3lzX3ZlcnNpb24oKVsxXSwgJy4nKSkKKworZGVmIHB5dGhvbl9icmFuY2goKToKKworICAgICIiIiBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KKyAgICAgICAgYnJhbmNoLgorCisgICAgICAgIEZvciBDUHl0aG9uIHRoaXMgaXMgdGhlIFN1YnZlcnNpb24gYnJhbmNoIGZyb20gd2hpY2ggdGhlCisgICAgICAgIFB5dGhvbiBiaW5hcnkgd2FzIGJ1aWx0LgorCisgICAgICAgIElmIG5vdCBhdmFpbGFibGUsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KKworICAgICIiIgorCisgICAgcmV0dXJuIF9zeXNfdmVyc2lvbigpWzJdCisKK2RlZiBweXRob25fcmV2aXNpb24oKToKKworICAgICIiIiBSZXR1cm5zIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KKyAgICAgICAgcmV2aXNpb24uCisKKyAgICAgICAgRm9yIENQeXRob24gdGhpcyBpcyB0aGUgU3VidmVyc2lvbiByZXZpc2lvbiBmcm9tIHdoaWNoIHRoZQorICAgICAgICBQeXRob24gYmluYXJ5IHdhcyBidWlsdC4KKworICAgICAgICBJZiBub3QgYXZhaWxhYmxlLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX3N5c192ZXJzaW9uKClbM10KKworZGVmIHB5dGhvbl9idWlsZCgpOgorCisgICAgIiIiIFJldHVybnMgYSB0dXBsZSAoYnVpbGRubywgYnVpbGRkYXRlKSBzdGF0aW5nIHRoZSBQeXRob24KKyAgICAgICAgYnVpbGQgbnVtYmVyIGFuZCBkYXRlIGFzIHN0cmluZ3MuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX3N5c192ZXJzaW9uKClbNDo2XQorCitkZWYgcHl0aG9uX2NvbXBpbGVyKCk6CisKKyAgICAiIiIgUmV0dXJucyBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgY29tcGlsZXIgdXNlZCBmb3IgY29tcGlsaW5nCisgICAgICAgIFB5dGhvbi4KKworICAgICIiIgorICAgIHJldHVybiBfc3lzX3ZlcnNpb24oKVs2XQorCisjIyMgVGhlIE9wdXMgTWFnbnVtIG9mIHBsYXRmb3JtIHN0cmluZ3MgOi0pCisKK19wbGF0Zm9ybV9jYWNoZSA9IHt9CisKK2RlZiBwbGF0Zm9ybShhbGlhc2VkPTAsIHRlcnNlPTApOgorCisgICAgIiIiIFJldHVybnMgYSBzaW5nbGUgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSB1bmRlcmx5aW5nIHBsYXRmb3JtCisgICAgICAgIHdpdGggYXMgbXVjaCB1c2VmdWwgaW5mb3JtYXRpb24gYXMgcG9zc2libGUgKGJ1dCBubyBtb3JlIDopLgorCisgICAgICAgIFRoZSBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gYmUgaHVtYW4gcmVhZGFibGUgcmF0aGVyIHRoYW4KKyAgICAgICAgbWFjaGluZSBwYXJzZWFibGUuIEl0IG1heSBsb29rIGRpZmZlcmVudCBvbiBkaWZmZXJlbnQKKyAgICAgICAgcGxhdGZvcm1zIGFuZCB0aGlzIGlzIGludGVuZGVkLgorCisgICAgICAgIElmICJhbGlhc2VkIiBpcyB0cnVlLCB0aGUgZnVuY3Rpb24gd2lsbCB1c2UgYWxpYXNlcyBmb3IKKyAgICAgICAgdmFyaW91cyBwbGF0Zm9ybXMgdGhhdCByZXBvcnQgc3lzdGVtIG5hbWVzIHdoaWNoIGRpZmZlciBmcm9tCisgICAgICAgIHRoZWlyIGNvbW1vbiBuYW1lcywgZS5nLiBTdW5PUyB3aWxsIGJlIHJlcG9ydGVkIGFzCisgICAgICAgIFNvbGFyaXMuIFRoZSBzeXN0ZW1fYWxpYXMoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGltcGxlbWVudAorICAgICAgICB0aGlzLgorCisgICAgICAgIFNldHRpbmcgdGVyc2UgdG8gdHJ1ZSBjYXVzZXMgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiBvbmx5IHRoZQorICAgICAgICBhYnNvbHV0ZSBtaW5pbXVtIGluZm9ybWF0aW9uIG5lZWRlZCB0byBpZGVudGlmeSB0aGUgcGxhdGZvcm0uCisKKyAgICAiIiIKKyAgICByZXN1bHQgPSBfcGxhdGZvcm1fY2FjaGUuZ2V0KChhbGlhc2VkLCB0ZXJzZSksIE5vbmUpCisgICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAjIEdldCB1bmFtZSBpbmZvcm1hdGlvbiBhbmQgdGhlbiBhcHBseSBwbGF0Zm9ybSBzcGVjaWZpYyBjb3NtZXRpY3MKKyAgICAjIHRvIGl0Li4uCisgICAgc3lzdGVtLG5vZGUscmVsZWFzZSx2ZXJzaW9uLG1hY2hpbmUscHJvY2Vzc29yID0gdW5hbWUoKQorICAgIGlmIG1hY2hpbmUgPT0gcHJvY2Vzc29yOgorICAgICAgICBwcm9jZXNzb3IgPSAnJworICAgIGlmIGFsaWFzZWQ6CisgICAgICAgIHN5c3RlbSxyZWxlYXNlLHZlcnNpb24gPSBzeXN0ZW1fYWxpYXMoc3lzdGVtLHJlbGVhc2UsdmVyc2lvbikKKworICAgIGlmIHN5c3RlbSA9PSAnV2luZG93cyc6CisgICAgICAgICMgTVMgcGxhdGZvcm1zCisgICAgICAgIHJlbCx2ZXJzLGNzZCxwdHlwZSA9IHdpbjMyX3Zlcih2ZXJzaW9uKQorICAgICAgICBpZiB0ZXJzZToKKyAgICAgICAgICAgIHBsYXRmb3JtID0gX3BsYXRmb3JtKHN5c3RlbSxyZWxlYXNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UsdmVyc2lvbixjc2QpCisKKyAgICBlbGlmIHN5c3RlbSBpbiAoJ0xpbnV4JywpOgorICAgICAgICAjIExpbnV4IGJhc2VkIHN5c3RlbXMKKyAgICAgICAgZGlzdG5hbWUsZGlzdHZlcnNpb24sZGlzdGlkID0gZGlzdCgnJykKKyAgICAgICAgaWYgZGlzdG5hbWUgYW5kIG5vdCB0ZXJzZToKKyAgICAgICAgICAgIHBsYXRmb3JtID0gX3BsYXRmb3JtKHN5c3RlbSxyZWxlYXNlLG1hY2hpbmUscHJvY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpdGgnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdG5hbWUsZGlzdHZlcnNpb24sZGlzdGlkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZiB0aGUgZGlzdHJpYnV0aW9uIG5hbWUgaXMgdW5rbm93biBjaGVjayBmb3IgbGliYyB2cy4gZ2xpYmMKKyAgICAgICAgICAgIGxpYmNuYW1lLGxpYmN2ZXJzaW9uID0gbGliY192ZXIoc3lzLmV4ZWN1dGFibGUpCisgICAgICAgICAgICBwbGF0Zm9ybSA9IF9wbGF0Zm9ybShzeXN0ZW0scmVsZWFzZSxtYWNoaW5lLHByb2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aXRoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmNuYW1lK2xpYmN2ZXJzaW9uKQorICAgIGVsaWYgc3lzdGVtID09ICdKYXZhJzoKKyAgICAgICAgIyBKYXZhIHBsYXRmb3JtcworICAgICAgICByLHYsdm1pbmZvLChvc19uYW1lLG9zX3ZlcnNpb24sb3NfYXJjaCkgPSBqYXZhX3ZlcigpCisgICAgICAgIGlmIHRlcnNlIG9yIG5vdCBvc19uYW1lOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UsdmVyc2lvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBsYXRmb3JtID0gX3BsYXRmb3JtKHN5c3RlbSxyZWxlYXNlLHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3NfbmFtZSxvc192ZXJzaW9uLG9zX2FyY2gpCisKKyAgICBlbGlmIHN5c3RlbSA9PSAnTWFjT1MnOgorICAgICAgICAjIE1hY09TIHBsYXRmb3JtcworICAgICAgICBpZiB0ZXJzZToKKyAgICAgICAgICAgIHBsYXRmb3JtID0gX3BsYXRmb3JtKHN5c3RlbSxyZWxlYXNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UsbWFjaGluZSkKKworICAgIGVsc2U6CisgICAgICAgICMgR2VuZXJpYyBoYW5kbGVyCisgICAgICAgIGlmIHRlcnNlOgorICAgICAgICAgICAgcGxhdGZvcm0gPSBfcGxhdGZvcm0oc3lzdGVtLHJlbGVhc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiaXRzLGxpbmthZ2UgPSBhcmNoaXRlY3R1cmUoc3lzLmV4ZWN1dGFibGUpCisgICAgICAgICAgICBwbGF0Zm9ybSA9IF9wbGF0Zm9ybShzeXN0ZW0scmVsZWFzZSxtYWNoaW5lLHByb2Nlc3NvcixiaXRzLGxpbmthZ2UpCisKKyAgICBfcGxhdGZvcm1fY2FjaGVbKGFsaWFzZWQsIHRlcnNlKV0gPSBwbGF0Zm9ybQorICAgIHJldHVybiBwbGF0Zm9ybQorCisjIyMgQ29tbWFuZCBsaW5lIGludGVyZmFjZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgRGVmYXVsdCBpcyB0byBwcmludCB0aGUgYWxpYXNlZCB2ZXJib3NlIHBsYXRmb3JtIHN0cmluZworICAgIHRlcnNlID0gKCd0ZXJzZScgaW4gc3lzLmFyZ3Ygb3IgJy0tdGVyc2UnIGluIHN5cy5hcmd2KQorICAgIGFsaWFzZWQgPSAobm90ICdub25hbGlhc2VkJyBpbiBzeXMuYXJndiBhbmQgbm90ICctLW5vbmFsaWFzZWQnIGluIHN5cy5hcmd2KQorICAgIHByaW50IHBsYXRmb3JtKGFsaWFzZWQsdGVyc2UpCisgICAgc3lzLmV4aXQoMCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdGZvcm0ucHljIGIvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhZTA2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdGZvcm0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxhdGZvcm0ucHlvIGIvbGliL3B5dGhvbjIuNy9wbGF0Zm9ybS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhZTA2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxhdGZvcm0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxpc3RsaWIucHkgYi9saWIvcHl0aG9uMi43L3BsaXN0bGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODk3YjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BsaXN0bGliLnB5CkBAIC0wLDAgKzEsNDc0IEBACityIiIicGxpc3RsaWIucHkgLS0gYSB0b29sIHRvIGdlbmVyYXRlIGFuZCBwYXJzZSBNYWNPU1ggLnBsaXN0IGZpbGVzLgorCitUaGUgUHJvcGVydHlMaXN0ICgucGxpc3QpIGZpbGUgZm9ybWF0IGlzIGEgc2ltcGxlIFhNTCBwaWNrbGUgc3VwcG9ydGluZworYmFzaWMgb2JqZWN0IHR5cGVzLCBsaWtlIGRpY3Rpb25hcmllcywgbGlzdHMsIG51bWJlcnMgYW5kIHN0cmluZ3MuCitVc3VhbGx5IHRoZSB0b3AgbGV2ZWwgb2JqZWN0IGlzIGEgZGljdGlvbmFyeS4KKworVG8gd3JpdGUgb3V0IGEgcGxpc3QgZmlsZSwgdXNlIHRoZSB3cml0ZVBsaXN0KHJvb3RPYmplY3QsIHBhdGhPckZpbGUpCitmdW5jdGlvbi4gJ3Jvb3RPYmplY3QnIGlzIHRoZSB0b3AgbGV2ZWwgb2JqZWN0LCAncGF0aE9yRmlsZScgaXMgYQorZmlsZW5hbWUgb3IgYSAod3JpdGFibGUpIGZpbGUgb2JqZWN0LgorCitUbyBwYXJzZSBhIHBsaXN0IGZyb20gYSBmaWxlLCB1c2UgdGhlIHJlYWRQbGlzdChwYXRoT3JGaWxlKSBmdW5jdGlvbiwKK3dpdGggYSBmaWxlIG5hbWUgb3IgYSAocmVhZGFibGUpIGZpbGUgb2JqZWN0IGFzIHRoZSBvbmx5IGFyZ3VtZW50LiBJdAorcmV0dXJucyB0aGUgdG9wIGxldmVsIG9iamVjdCAoYWdhaW4sIHVzdWFsbHkgYSBkaWN0aW9uYXJ5KS4KKworVG8gd29yayB3aXRoIHBsaXN0IGRhdGEgaW4gc3RyaW5ncywgeW91IGNhbiB1c2UgcmVhZFBsaXN0RnJvbVN0cmluZygpCithbmQgd3JpdGVQbGlzdFRvU3RyaW5nKCkuCisKK1ZhbHVlcyBjYW4gYmUgc3RyaW5ncywgaW50ZWdlcnMsIGZsb2F0cywgYm9vbGVhbnMsIHR1cGxlcywgbGlzdHMsCitkaWN0aW9uYXJpZXMsIERhdGEgb3IgZGF0ZXRpbWUuZGF0ZXRpbWUgb2JqZWN0cy4gU3RyaW5nIHZhbHVlcyAoaW5jbHVkaW5nCitkaWN0aW9uYXJ5IGtleXMpIG1heSBiZSB1bmljb2RlIHN0cmluZ3MgLS0gdGhleSB3aWxsIGJlIHdyaXR0ZW4gb3V0IGFzCitVVEYtOC4KKworVGhlIDxkYXRhPiBwbGlzdCB0eXBlIGlzIHN1cHBvcnRlZCB0aHJvdWdoIHRoZSBEYXRhIGNsYXNzLiBUaGlzIGlzIGEKK3RoaW4gd3JhcHBlciBhcm91bmQgYSBQeXRob24gc3RyaW5nLgorCitHZW5lcmF0ZSBQbGlzdCBleGFtcGxlOgorCisgICAgcGwgPSBkaWN0KAorICAgICAgICBhU3RyaW5nPSJEb29kYWgiLAorICAgICAgICBhTGlzdD1bIkEiLCAiQiIsIDEyLCAzMi4xLCBbMSwgMiwgM11dLAorICAgICAgICBhRmxvYXQ9MC4xLAorICAgICAgICBhbkludD03MjgsCisgICAgICAgIGFEaWN0PWRpY3QoCisgICAgICAgICAgICBhbm90aGVyU3RyaW5nPSI8aGVsbG8gJiBoaSB0aGVyZSE+IiwKKyAgICAgICAgICAgIGFVbmljb2RlVmFsdWU9dSdNXHhlNHNzaWcsIE1hXHhkZicsCisgICAgICAgICAgICBhVHJ1ZVZhbHVlPVRydWUsCisgICAgICAgICAgICBhRmFsc2VWYWx1ZT1GYWxzZSwKKyAgICAgICAgKSwKKyAgICAgICAgc29tZURhdGE9RGF0YSgiPGJpbmFyeSBndW5rPiIpLAorICAgICAgICBzb21lTW9yZURhdGE9RGF0YSgiPGxvdHMgb2YgYmluYXJ5IGd1bms+IiAqIDEwKSwKKyAgICAgICAgYURhdGU9ZGF0ZXRpbWUuZGF0ZXRpbWUuZnJvbXRpbWVzdGFtcCh0aW1lLm1rdGltZSh0aW1lLmdtdGltZSgpKSksCisgICAgKQorICAgICMgdW5pY29kZSBrZXlzIGFyZSBwb3NzaWJsZSwgYnV0IGEgbGl0dGxlIGF3a3dhcmQgdG8gdXNlOgorICAgIHBsW3UnXHhjNWJlbnJhYSddID0gIlRoYXQgd2FzIGEgdW5pY29kZSBrZXkuIgorICAgIHdyaXRlUGxpc3QocGwsIGZpbGVOYW1lKQorCitQYXJzZSBQbGlzdCBleGFtcGxlOgorCisgICAgcGwgPSByZWFkUGxpc3QocGF0aE9yRmlsZSkKKyAgICBwcmludCBwbFsiYUtleSJdCisiIiIKKworCitfX2FsbF9fID0gWworICAgICJyZWFkUGxpc3QiLCAid3JpdGVQbGlzdCIsICJyZWFkUGxpc3RGcm9tU3RyaW5nIiwgIndyaXRlUGxpc3RUb1N0cmluZyIsCisgICAgInJlYWRQbGlzdEZyb21SZXNvdXJjZSIsICJ3cml0ZVBsaXN0VG9SZXNvdXJjZSIsCisgICAgIlBsaXN0IiwgIkRhdGEiLCAiRGljdCIKK10KKyMgTm90ZTogdGhlIFBsaXN0IGFuZCBEaWN0IGNsYXNzZXMgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQuCisKK2ltcG9ydCBiaW5hc2NpaQoraW1wb3J0IGRhdGV0aW1lCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCByZQoraW1wb3J0IHdhcm5pbmdzCisKKworZGVmIHJlYWRQbGlzdChwYXRoT3JGaWxlKToKKyAgICAiIiJSZWFkIGEgLnBsaXN0IGZpbGUuICdwYXRoT3JGaWxlJyBtYXkgZWl0aGVyIGJlIGEgZmlsZSBuYW1lIG9yIGEKKyAgICAocmVhZGFibGUpIGZpbGUgb2JqZWN0LiBSZXR1cm4gdGhlIHVucGFja2VkIHJvb3Qgb2JqZWN0ICh3aGljaAorICAgIHVzdWFsbHkgaXMgYSBkaWN0aW9uYXJ5KS4KKyAgICAiIiIKKyAgICBkaWRPcGVuID0gMAorICAgIGlmIGlzaW5zdGFuY2UocGF0aE9yRmlsZSwgKHN0ciwgdW5pY29kZSkpOgorICAgICAgICBwYXRoT3JGaWxlID0gb3BlbihwYXRoT3JGaWxlKQorICAgICAgICBkaWRPcGVuID0gMQorICAgIHAgPSBQbGlzdFBhcnNlcigpCisgICAgcm9vdE9iamVjdCA9IHAucGFyc2UocGF0aE9yRmlsZSkKKyAgICBpZiBkaWRPcGVuOgorICAgICAgICBwYXRoT3JGaWxlLmNsb3NlKCkKKyAgICByZXR1cm4gcm9vdE9iamVjdAorCisKK2RlZiB3cml0ZVBsaXN0KHJvb3RPYmplY3QsIHBhdGhPckZpbGUpOgorICAgICIiIldyaXRlICdyb290T2JqZWN0JyB0byBhIC5wbGlzdCBmaWxlLiAncGF0aE9yRmlsZScgbWF5IGVpdGhlciBiZSBhCisgICAgZmlsZSBuYW1lIG9yIGEgKHdyaXRhYmxlKSBmaWxlIG9iamVjdC4KKyAgICAiIiIKKyAgICBkaWRPcGVuID0gMAorICAgIGlmIGlzaW5zdGFuY2UocGF0aE9yRmlsZSwgKHN0ciwgdW5pY29kZSkpOgorICAgICAgICBwYXRoT3JGaWxlID0gb3BlbihwYXRoT3JGaWxlLCAidyIpCisgICAgICAgIGRpZE9wZW4gPSAxCisgICAgd3JpdGVyID0gUGxpc3RXcml0ZXIocGF0aE9yRmlsZSkKKyAgICB3cml0ZXIud3JpdGVsbigiPHBsaXN0IHZlcnNpb249XCIxLjBcIj4iKQorICAgIHdyaXRlci53cml0ZVZhbHVlKHJvb3RPYmplY3QpCisgICAgd3JpdGVyLndyaXRlbG4oIjwvcGxpc3Q+IikKKyAgICBpZiBkaWRPcGVuOgorICAgICAgICBwYXRoT3JGaWxlLmNsb3NlKCkKKworCitkZWYgcmVhZFBsaXN0RnJvbVN0cmluZyhkYXRhKToKKyAgICAiIiJSZWFkIGEgcGxpc3QgZGF0YSBmcm9tIGEgc3RyaW5nLiBSZXR1cm4gdGhlIHJvb3Qgb2JqZWN0LgorICAgICIiIgorICAgIHJldHVybiByZWFkUGxpc3QoU3RyaW5nSU8oZGF0YSkpCisKKworZGVmIHdyaXRlUGxpc3RUb1N0cmluZyhyb290T2JqZWN0KToKKyAgICAiIiJSZXR1cm4gJ3Jvb3RPYmplY3QnIGFzIGEgcGxpc3QtZm9ybWF0dGVkIHN0cmluZy4KKyAgICAiIiIKKyAgICBmID0gU3RyaW5nSU8oKQorICAgIHdyaXRlUGxpc3Qocm9vdE9iamVjdCwgZikKKyAgICByZXR1cm4gZi5nZXR2YWx1ZSgpCisKKworZGVmIHJlYWRQbGlzdEZyb21SZXNvdXJjZShwYXRoLCByZXN0eXBlPSdwbHN0JywgcmVzaWQ9MCk6CisgICAgIiIiUmVhZCBwbHN0IHJlc291cmNlIGZyb20gdGhlIHJlc291cmNlIGZvcmsgb2YgcGF0aC4KKyAgICAiIiIKKyAgICB3YXJuaW5ncy53YXJucHkzaygiSW4gMy54LCByZWFkUGxpc3RGcm9tUmVzb3VyY2UgaXMgcmVtb3ZlZC4iLAorICAgICAgICAgICAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKKyAgICBmcm9tIENhcmJvbi5GaWxlIGltcG9ydCBGU1JlZiwgRlNHZXRSZXNvdXJjZUZvcmtOYW1lCisgICAgZnJvbSBDYXJib24uRmlsZXMgaW1wb3J0IGZzUmRQZXJtCisgICAgZnJvbSBDYXJib24gaW1wb3J0IFJlcworICAgIGZzUmVmID0gRlNSZWYocGF0aCkKKyAgICByZXNOdW0gPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKGZzUmVmLCBGU0dldFJlc291cmNlRm9ya05hbWUoKSwgZnNSZFBlcm0pCisgICAgUmVzLlVzZVJlc0ZpbGUocmVzTnVtKQorICAgIHBsaXN0RGF0YSA9IFJlcy5HZXQxUmVzb3VyY2UocmVzdHlwZSwgcmVzaWQpLmRhdGEKKyAgICBSZXMuQ2xvc2VSZXNGaWxlKHJlc051bSkKKyAgICByZXR1cm4gcmVhZFBsaXN0RnJvbVN0cmluZyhwbGlzdERhdGEpCisKKworZGVmIHdyaXRlUGxpc3RUb1Jlc291cmNlKHJvb3RPYmplY3QsIHBhdGgsIHJlc3R5cGU9J3Bsc3QnLCByZXNpZD0wKToKKyAgICAiIiJXcml0ZSAncm9vdE9iamVjdCcgYXMgYSBwbHN0IHJlc291cmNlIHRvIHRoZSByZXNvdXJjZSBmb3JrIG9mIHBhdGguCisgICAgIiIiCisgICAgd2FybmluZ3Mud2FybnB5M2soIkluIDMueCwgd3JpdGVQbGlzdFRvUmVzb3VyY2UgaXMgcmVtb3ZlZC4iLCBzdGFja2xldmVsPTIpCisgICAgZnJvbSBDYXJib24uRmlsZSBpbXBvcnQgRlNSZWYsIEZTR2V0UmVzb3VyY2VGb3JrTmFtZQorICAgIGZyb20gQ2FyYm9uLkZpbGVzIGltcG9ydCBmc1JkV3JQZXJtCisgICAgZnJvbSBDYXJib24gaW1wb3J0IFJlcworICAgIHBsaXN0RGF0YSA9IHdyaXRlUGxpc3RUb1N0cmluZyhyb290T2JqZWN0KQorICAgIGZzUmVmID0gRlNSZWYocGF0aCkKKyAgICByZXNOdW0gPSBSZXMuRlNPcGVuUmVzb3VyY2VGaWxlKGZzUmVmLCBGU0dldFJlc291cmNlRm9ya05hbWUoKSwgZnNSZFdyUGVybSkKKyAgICBSZXMuVXNlUmVzRmlsZShyZXNOdW0pCisgICAgdHJ5OgorICAgICAgICBSZXMuR2V0MVJlc291cmNlKHJlc3R5cGUsIHJlc2lkKS5SZW1vdmVSZXNvdXJjZSgpCisgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJlcyA9IFJlcy5SZXNvdXJjZShwbGlzdERhdGEpCisgICAgcmVzLkFkZFJlc291cmNlKHJlc3R5cGUsIHJlc2lkLCAnJykKKyAgICByZXMuV3JpdGVSZXNvdXJjZSgpCisgICAgUmVzLkNsb3NlUmVzRmlsZShyZXNOdW0pCisKKworY2xhc3MgRHVtYlhNTFdyaXRlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBpbmRlbnRMZXZlbD0wLCBpbmRlbnQ9Ilx0Iik6CisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5zdGFjayA9IFtdCisgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwgPSBpbmRlbnRMZXZlbAorICAgICAgICBzZWxmLmluZGVudCA9IGluZGVudAorCisgICAgZGVmIGJlZ2luRWxlbWVudChzZWxmLCBlbGVtZW50KToKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoZWxlbWVudCkKKyAgICAgICAgc2VsZi53cml0ZWxuKCI8JXM+IiAlIGVsZW1lbnQpCisgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwgKz0gMQorCisgICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgZWxlbWVudCk6CisgICAgICAgIGFzc2VydCBzZWxmLmluZGVudExldmVsID4gMAorICAgICAgICBhc3NlcnQgc2VsZi5zdGFjay5wb3AoKSA9PSBlbGVtZW50CisgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwgLT0gMQorICAgICAgICBzZWxmLndyaXRlbG4oIjwvJXM+IiAlIGVsZW1lbnQpCisKKyAgICBkZWYgc2ltcGxlRWxlbWVudChzZWxmLCBlbGVtZW50LCB2YWx1ZT1Ob25lKToKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB2YWx1ZSA9IF9lc2NhcGVBbmRFbmNvZGUodmFsdWUpCisgICAgICAgICAgICBzZWxmLndyaXRlbG4oIjwlcz4lczwvJXM+IiAlIChlbGVtZW50LCB2YWx1ZSwgZWxlbWVudCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndyaXRlbG4oIjwlcy8+IiAlIGVsZW1lbnQpCisKKyAgICBkZWYgd3JpdGVsbihzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZShzZWxmLmluZGVudExldmVsICogc2VsZi5pbmRlbnQgKyBsaW5lICsgIlxuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmlsZS53cml0ZSgiXG4iKQorCisKKyMgQ29udGVudHMgc2hvdWxkIGNvbmZvcm0gdG8gYSBzdWJzZXQgb2YgSVNPIDg2MDEKKyMgKGluIHBhcnRpY3VsYXIsIFlZWVkgJy0nIE1NICctJyBERCAnVCcgSEggJzonIE1NICc6JyBTUyAnWicuICBTbWFsbGVyIHVuaXRzIG1heSBiZSBvbWl0dGVkIHdpdGgKKyMgIGEgbG9zcyBvZiBwcmVjaXNpb24pCitfZGF0ZVBhcnNlciA9IHJlLmNvbXBpbGUociIoP1A8eWVhcj5cZFxkXGRcZCkoPzotKD9QPG1vbnRoPlxkXGQpKD86LSg/UDxkYXk+XGRcZCkoPzpUKD9QPGhvdXI+XGRcZCkoPzo6KD9QPG1pbnV0ZT5cZFxkKSg/OjooP1A8c2Vjb25kPlxkXGQpKT8pPyk/KT8pP1oiKQorCitkZWYgX2RhdGVGcm9tU3RyaW5nKHMpOgorICAgIG9yZGVyID0gKCd5ZWFyJywgJ21vbnRoJywgJ2RheScsICdob3VyJywgJ21pbnV0ZScsICdzZWNvbmQnKQorICAgIGdkID0gX2RhdGVQYXJzZXIubWF0Y2gocykuZ3JvdXBkaWN0KCkKKyAgICBsc3QgPSBbXQorICAgIGZvciBrZXkgaW4gb3JkZXI6CisgICAgICAgIHZhbCA9IGdkW2tleV0KKyAgICAgICAgaWYgdmFsIGlzIE5vbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBsc3QuYXBwZW5kKGludCh2YWwpKQorICAgIHJldHVybiBkYXRldGltZS5kYXRldGltZSgqbHN0KQorCitkZWYgX2RhdGVUb1N0cmluZyhkKToKKyAgICByZXR1cm4gJyUwNGQtJTAyZC0lMDJkVCUwMmQ6JTAyZDolMDJkWicgJSAoCisgICAgICAgIGQueWVhciwgZC5tb250aCwgZC5kYXksCisgICAgICAgIGQuaG91ciwgZC5taW51dGUsIGQuc2Vjb25kCisgICAgKQorCisKKyMgUmVnZXggdG8gZmluZCBhbnkgY29udHJvbCBjaGFycywgZXhjZXB0IGZvciBcdCBcbiBhbmQgXHIKK19jb250cm9sQ2hhclBhdCA9IHJlLmNvbXBpbGUoCisgICAgciJbXHgwMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHgwYlx4MGNceDBlXHgwZiIKKyAgICByIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWZdIikKKworZGVmIF9lc2NhcGVBbmRFbmNvZGUodGV4dCk6CisgICAgbSA9IF9jb250cm9sQ2hhclBhdC5zZWFyY2godGV4dCkKKyAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzdHJpbmdzIGNhbid0IGNvbnRhaW5zIGNvbnRyb2wgY2hhcmFjdGVyczsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2UgcGxpc3RsaWIuRGF0YSBpbnN0ZWFkIikKKyAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCJcclxuIiwgIlxuIikgICAgICAgIyBjb252ZXJ0IERPUyBsaW5lIGVuZGluZ3MKKyAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCJcciIsICJcbiIpICAgICAgICAgIyBjb252ZXJ0IE1hYyBsaW5lIGVuZGluZ3MKKyAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCImIiwgIiZhbXA7IikgICAgICAgIyBlc2NhcGUgJyYnCisgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiPCIsICImbHQ7IikgICAgICAgICMgZXNjYXBlICc8JworICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIj4iLCAiJmd0OyIpICAgICAgICAjIGVzY2FwZSAnPicKKyAgICByZXR1cm4gdGV4dC5lbmNvZGUoInV0Zi04IikgICAgICAgICAgICAgIyBlbmNvZGUgYXMgVVRGLTgKKworCitQTElTVEhFQURFUiA9ICIiIlwKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGxpc3QgUFVCTElDICItLy9BcHBsZS8vRFREIFBMSVNUIDEuMC8vRU4iICJodHRwOi8vd3d3LmFwcGxlLmNvbS9EVERzL1Byb3BlcnR5TGlzdC0xLjAuZHRkIj4KKyIiIgorCitjbGFzcyBQbGlzdFdyaXRlcihEdW1iWE1MV3JpdGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBpbmRlbnRMZXZlbD0wLCBpbmRlbnQ9Ilx0Iiwgd3JpdGVIZWFkZXI9MSk6CisgICAgICAgIGlmIHdyaXRlSGVhZGVyOgorICAgICAgICAgICAgZmlsZS53cml0ZShQTElTVEhFQURFUikKKyAgICAgICAgRHVtYlhNTFdyaXRlci5fX2luaXRfXyhzZWxmLCBmaWxlLCBpbmRlbnRMZXZlbCwgaW5kZW50KQorCisgICAgZGVmIHdyaXRlVmFsdWUoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoc3RyLCB1bmljb2RlKSk6CisgICAgICAgICAgICBzZWxmLnNpbXBsZUVsZW1lbnQoInN0cmluZyIsIHZhbHVlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpOgorICAgICAgICAgICAgIyBtdXN0IHN3aXRjaCBmb3IgYm9vbCBiZWZvcmUgaW50LCBhcyBib29sIGlzIGEKKyAgICAgICAgICAgICMgc3ViY2xhc3Mgb2YgaW50Li4uCisgICAgICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgICAgICBzZWxmLnNpbXBsZUVsZW1lbnQoInRydWUiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNpbXBsZUVsZW1lbnQoImZhbHNlIikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICBzZWxmLnNpbXBsZUVsZW1lbnQoImludGVnZXIiLCAiJWQiICUgdmFsdWUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZmxvYXQpOgorICAgICAgICAgICAgc2VsZi5zaW1wbGVFbGVtZW50KCJyZWFsIiwgcmVwcih2YWx1ZSkpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCk6CisgICAgICAgICAgICBzZWxmLndyaXRlRGljdCh2YWx1ZSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBEYXRhKToKKyAgICAgICAgICAgIHNlbGYud3JpdGVEYXRhKHZhbHVlKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGRhdGV0aW1lLmRhdGV0aW1lKToKKyAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgiZGF0ZSIsIF9kYXRlVG9TdHJpbmcodmFsdWUpKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsICh0dXBsZSwgbGlzdCkpOgorICAgICAgICAgICAgc2VsZi53cml0ZUFycmF5KHZhbHVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJ1bnN1cG9ydGVkIHR5cGU6ICVzIiAlIHR5cGUodmFsdWUpKQorCisgICAgZGVmIHdyaXRlRGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5iZWdpbkVsZW1lbnQoImRhdGEiKQorICAgICAgICBzZWxmLmluZGVudExldmVsIC09IDEKKyAgICAgICAgbWF4bGluZWxlbmd0aCA9IG1heCgxNiwgNzYgLSBsZW4oc2VsZi5pbmRlbnQucmVwbGFjZSgiXHQiLCAiICIgKiA4KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluZGVudExldmVsKSkKKyAgICAgICAgZm9yIGxpbmUgaW4gZGF0YS5hc0Jhc2U2NChtYXhsaW5lbGVuZ3RoKS5zcGxpdCgiXG4iKToKKyAgICAgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZWxuKGxpbmUpCisgICAgICAgIHNlbGYuaW5kZW50TGV2ZWwgKz0gMQorICAgICAgICBzZWxmLmVuZEVsZW1lbnQoImRhdGEiKQorCisgICAgZGVmIHdyaXRlRGljdChzZWxmLCBkKToKKyAgICAgICAgc2VsZi5iZWdpbkVsZW1lbnQoImRpY3QiKQorICAgICAgICBpdGVtcyA9IGQuaXRlbXMoKQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gaXRlbXM6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShrZXksIChzdHIsIHVuaWNvZGUpKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImtleXMgbXVzdCBiZSBzdHJpbmdzIikKKyAgICAgICAgICAgIHNlbGYuc2ltcGxlRWxlbWVudCgia2V5Iiwga2V5KQorICAgICAgICAgICAgc2VsZi53cml0ZVZhbHVlKHZhbHVlKQorICAgICAgICBzZWxmLmVuZEVsZW1lbnQoImRpY3QiKQorCisgICAgZGVmIHdyaXRlQXJyYXkoc2VsZiwgYXJyYXkpOgorICAgICAgICBzZWxmLmJlZ2luRWxlbWVudCgiYXJyYXkiKQorICAgICAgICBmb3IgdmFsdWUgaW4gYXJyYXk6CisgICAgICAgICAgICBzZWxmLndyaXRlVmFsdWUodmFsdWUpCisgICAgICAgIHNlbGYuZW5kRWxlbWVudCgiYXJyYXkiKQorCisKK2NsYXNzIF9JbnRlcm5hbERpY3QoZGljdCk6CisKKyAgICAjIFRoaXMgY2xhc3MgaXMgbmVlZGVkIHdoaWxlIERpY3QgaXMgc2NoZWR1bGVkIGZvciBkZXByZWNhdGlvbjoKKyAgICAjIHdlIG9ubHkgbmVlZCB0byB3YXJuIHdoZW4gYSAqdXNlciogaW5zdGFudGlhdGVzIERpY3Qgb3Igd2hlbgorICAgICMgdGhlICJhdHRyaWJ1dGUgbm90YXRpb24gZm9yIGRpY3Qga2V5cyIgaXMgdXNlZC4KKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdmFsdWUgPSBzZWxmW2F0dHJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCisgICAgICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KKyAgICAgICAgd2FybigiQXR0cmlidXRlIGFjY2VzcyBmcm9tIHBsaXN0IGRpY3RzIGlzIGRlcHJlY2F0ZWQsIHVzZSBkW2tleV0gIgorICAgICAgICAgICAgICJub3RhdGlvbiBpbnN0ZWFkIiwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgYXR0ciwgdmFsdWUpOgorICAgICAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisgICAgICAgIHdhcm4oIkF0dHJpYnV0ZSBhY2Nlc3MgZnJvbSBwbGlzdCBkaWN0cyBpcyBkZXByZWNhdGVkLCB1c2UgZFtrZXldICIKKyAgICAgICAgICAgICAibm90YXRpb24gaW5zdGVhZCIsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgICAgIHNlbGZbYXR0cl0gPSB2YWx1ZQorCisgICAgZGVmIF9fZGVsYXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZlthdHRyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgorICAgICAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisgICAgICAgIHdhcm4oIkF0dHJpYnV0ZSBhY2Nlc3MgZnJvbSBwbGlzdCBkaWN0cyBpcyBkZXByZWNhdGVkLCB1c2UgZFtrZXldICIKKyAgICAgICAgICAgICAibm90YXRpb24gaW5zdGVhZCIsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2NsYXNzIERpY3QoX0ludGVybmFsRGljdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisgICAgICAgIHdhcm4oIlRoZSBwbGlzdGxpYi5EaWN0IGNsYXNzIGlzIGRlcHJlY2F0ZWQsIHVzZSBidWlsdGluIGRpY3QgaW5zdGVhZCIsCisgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICAgICAgc3VwZXIoRGljdCwgc2VsZikuX19pbml0X18oKiprd2FyZ3MpCisKKworY2xhc3MgUGxpc3QoX0ludGVybmFsRGljdCk6CisKKyAgICAiIiJUaGlzIGNsYXNzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSByZWFkUGxpc3QoKSBhbmQgd3JpdGVQbGlzdCgpCisgICAgZnVuY3Rpb25zIGluc3RlYWQsIHRvZ2V0aGVyIHdpdGggcmVndWxhciBkaWN0IG9iamVjdHMuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKiprd2FyZ3MpOgorICAgICAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuCisgICAgICAgIHdhcm4oIlRoZSBQbGlzdCBjbGFzcyBpcyBkZXByZWNhdGVkLCB1c2UgdGhlIHJlYWRQbGlzdCgpIGFuZCAiCisgICAgICAgICAgICAgIndyaXRlUGxpc3QoKSBmdW5jdGlvbnMgaW5zdGVhZCIsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIDIpCisgICAgICAgIHN1cGVyKFBsaXN0LCBzZWxmKS5fX2luaXRfXygqKmt3YXJncykKKworICAgIGRlZiBmcm9tRmlsZShjbHMsIHBhdGhPckZpbGUpOgorICAgICAgICAiIiJEZXByZWNhdGVkLiBVc2UgdGhlIHJlYWRQbGlzdCgpIGZ1bmN0aW9uIGluc3RlYWQuIiIiCisgICAgICAgIHJvb3RPYmplY3QgPSByZWFkUGxpc3QocGF0aE9yRmlsZSkKKyAgICAgICAgcGxpc3QgPSBjbHMoKQorICAgICAgICBwbGlzdC51cGRhdGUocm9vdE9iamVjdCkKKyAgICAgICAgcmV0dXJuIHBsaXN0CisgICAgZnJvbUZpbGUgPSBjbGFzc21ldGhvZChmcm9tRmlsZSkKKworICAgIGRlZiB3cml0ZShzZWxmLCBwYXRoT3JGaWxlKToKKyAgICAgICAgIiIiRGVwcmVjYXRlZC4gVXNlIHRoZSB3cml0ZVBsaXN0KCkgZnVuY3Rpb24gaW5zdGVhZC4iIiIKKyAgICAgICAgd3JpdGVQbGlzdChzZWxmLCBwYXRoT3JGaWxlKQorCisKK2RlZiBfZW5jb2RlQmFzZTY0KHMsIG1heGxpbmVsZW5ndGg9NzYpOgorICAgICMgY29waWVkIGZyb20gYmFzZTY0LmVuY29kZXN0cmluZygpLCB3aXRoIGFkZGVkIG1heGxpbmVsZW5ndGggYXJndW1lbnQKKyAgICBtYXhiaW5zaXplID0gKG1heGxpbmVsZW5ndGgvLzQpKjMKKyAgICBwaWVjZXMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzKSwgbWF4Ymluc2l6ZSk6CisgICAgICAgIGNodW5rID0gc1tpIDogaSArIG1heGJpbnNpemVdCisgICAgICAgIHBpZWNlcy5hcHBlbmQoYmluYXNjaWkuYjJhX2Jhc2U2NChjaHVuaykpCisgICAgcmV0dXJuICIiLmpvaW4ocGllY2VzKQorCitjbGFzcyBEYXRhOgorCisgICAgIiIiV3JhcHBlciBmb3IgYmluYXJ5IGRhdGEuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKworICAgIGRlZiBmcm9tQmFzZTY0KGNscywgZGF0YSk6CisgICAgICAgICMgYmFzZTY0LmRlY29kZXN0cmluZyBqdXN0IGNhbGxzIGJpbmFzY2lpLmEyYl9iYXNlNjQ7CisgICAgICAgICMgaXQgc2VlbXMgb3ZlcmtpbGwgdG8gdXNlIGJvdGggYmFzZTY0IGFuZCBiaW5hc2NpaS4KKyAgICAgICAgcmV0dXJuIGNscyhiaW5hc2NpaS5hMmJfYmFzZTY0KGRhdGEpKQorICAgIGZyb21CYXNlNjQgPSBjbGFzc21ldGhvZChmcm9tQmFzZTY0KQorCisgICAgZGVmIGFzQmFzZTY0KHNlbGYsIG1heGxpbmVsZW5ndGg9NzYpOgorICAgICAgICByZXR1cm4gX2VuY29kZUJhc2U2NChzZWxmLmRhdGEsIG1heGxpbmVsZW5ndGgpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5kYXRhLCBvdGhlci5kYXRhKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsIHN0cik6CisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZGF0YSwgb3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY21wKGlkKHNlbGYpLCBpZChvdGhlcikpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiJXMoJXMpIiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgcmVwcihzZWxmLmRhdGEpKQorCisKK2NsYXNzIFBsaXN0UGFyc2VyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnN0YWNrID0gW10KKyAgICAgICAgc2VsZi5jdXJyZW50S2V5ID0gTm9uZQorICAgICAgICBzZWxmLnJvb3QgPSBOb25lCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgZmlsZW9iaik6CisgICAgICAgIGZyb20geG1sLnBhcnNlcnMuZXhwYXQgaW1wb3J0IFBhcnNlckNyZWF0ZQorICAgICAgICBwYXJzZXIgPSBQYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuaGFuZGxlQmVnaW5FbGVtZW50CisgICAgICAgIHBhcnNlci5FbmRFbGVtZW50SGFuZGxlciA9IHNlbGYuaGFuZGxlRW5kRWxlbWVudAorICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLmhhbmRsZURhdGEKKyAgICAgICAgcGFyc2VyLlBhcnNlRmlsZShmaWxlb2JqKQorICAgICAgICByZXR1cm4gc2VsZi5yb290CisKKyAgICBkZWYgaGFuZGxlQmVnaW5FbGVtZW50KHNlbGYsIGVsZW1lbnQsIGF0dHJzKToKKyAgICAgICAgc2VsZi5kYXRhID0gW10KKyAgICAgICAgaGFuZGxlciA9IGdldGF0dHIoc2VsZiwgImJlZ2luXyIgKyBlbGVtZW50LCBOb25lKQorICAgICAgICBpZiBoYW5kbGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaGFuZGxlcihhdHRycykKKworICAgIGRlZiBoYW5kbGVFbmRFbGVtZW50KHNlbGYsIGVsZW1lbnQpOgorICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCAiZW5kXyIgKyBlbGVtZW50LCBOb25lKQorICAgICAgICBpZiBoYW5kbGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaGFuZGxlcigpCisKKyAgICBkZWYgaGFuZGxlRGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhLmFwcGVuZChkYXRhKQorCisgICAgZGVmIGFkZE9iamVjdChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIHNlbGYuY3VycmVudEtleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3RhY2tbLTFdW3NlbGYuY3VycmVudEtleV0gPSB2YWx1ZQorICAgICAgICAgICAgc2VsZi5jdXJyZW50S2V5ID0gTm9uZQorICAgICAgICBlbGlmIG5vdCBzZWxmLnN0YWNrOgorICAgICAgICAgICAgIyB0aGlzIGlzIHRoZSByb290IG9iamVjdAorICAgICAgICAgICAgc2VsZi5yb290ID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3RhY2tbLTFdLmFwcGVuZCh2YWx1ZSkKKworICAgIGRlZiBnZXREYXRhKHNlbGYpOgorICAgICAgICBkYXRhID0gIiIuam9pbihzZWxmLmRhdGEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgiYXNjaWkiKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmRhdGEgPSBbXQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgIyBlbGVtZW50IGhhbmRsZXJzCisKKyAgICBkZWYgYmVnaW5fZGljdChzZWxmLCBhdHRycyk6CisgICAgICAgIGQgPSBfSW50ZXJuYWxEaWN0KCkKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoZCkKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoZCkKKyAgICBkZWYgZW5kX2RpY3Qoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2sucG9wKCkKKworICAgIGRlZiBlbmRfa2V5KHNlbGYpOgorICAgICAgICBzZWxmLmN1cnJlbnRLZXkgPSBzZWxmLmdldERhdGEoKQorCisgICAgZGVmIGJlZ2luX2FycmF5KHNlbGYsIGF0dHJzKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYuYWRkT2JqZWN0KGEpCisgICAgICAgIHNlbGYuc3RhY2suYXBwZW5kKGEpCisgICAgZGVmIGVuZF9hcnJheShzZWxmKToKKyAgICAgICAgc2VsZi5zdGFjay5wb3AoKQorCisgICAgZGVmIGVuZF90cnVlKHNlbGYpOgorICAgICAgICBzZWxmLmFkZE9iamVjdChUcnVlKQorICAgIGRlZiBlbmRfZmFsc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYWRkT2JqZWN0KEZhbHNlKQorICAgIGRlZiBlbmRfaW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoaW50KHNlbGYuZ2V0RGF0YSgpKSkKKyAgICBkZWYgZW5kX3JlYWwoc2VsZik6CisgICAgICAgIHNlbGYuYWRkT2JqZWN0KGZsb2F0KHNlbGYuZ2V0RGF0YSgpKSkKKyAgICBkZWYgZW5kX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hZGRPYmplY3Qoc2VsZi5nZXREYXRhKCkpCisgICAgZGVmIGVuZF9kYXRhKHNlbGYpOgorICAgICAgICBzZWxmLmFkZE9iamVjdChEYXRhLmZyb21CYXNlNjQoc2VsZi5nZXREYXRhKCkpKQorICAgIGRlZiBlbmRfZGF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hZGRPYmplY3QoX2RhdGVGcm9tU3RyaW5nKHNlbGYuZ2V0RGF0YSgpKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxpc3RsaWIucHljIGIvbGliL3B5dGhvbjIuNy9wbGlzdGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2ZGRiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxpc3RsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcGxpc3RsaWIucHlvIGIvbGliL3B5dGhvbjIuNy9wbGlzdGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYyZDRlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcGxpc3RsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcG9wZW4yLnB5IGIvbGliL3B5dGhvbjIuNy9wb3BlbjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3NjlmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9wZW4yLnB5CkBAIC0wLDAgKzEsMjAxIEBACisiIiJTcGF3biBhIGNvbW1hbmQgd2l0aCBwaXBlcyB0byBpdHMgc3RkaW4sIHN0ZG91dCwgYW5kIG9wdGlvbmFsbHkgc3RkZXJyLgorCitUaGUgbm9ybWFsIG9zLnBvcGVuKGNtZCwgbW9kZSkgY2FsbCBzcGF3bnMgYSBzaGVsbCBjb21tYW5kIGFuZCBwcm92aWRlcyBhCitmaWxlIGludGVyZmFjZSB0byBqdXN0IHRoZSBpbnB1dCBvciBvdXRwdXQgb2YgdGhlIHByb2Nlc3MgZGVwZW5kaW5nIG9uCit3aGV0aGVyIG1vZGUgaXMgJ3InIG9yICd3Jy4gIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHRoZSBmdW5jdGlvbnMgcG9wZW4yKGNtZCkKK2FuZCBwb3BlbjMoY21kKSB3aGljaCByZXR1cm4gdHdvIG9yIHRocmVlIHBpcGVzIHRvIHRoZSBzcGF3bmVkIGNvbW1hbmQuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLndhcm4oIlRoZSBwb3BlbjIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQuICBVc2UgdGhlIHN1YnByb2Nlc3MgbW9kdWxlLiIsCisgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorCitfX2FsbF9fID0gWyJwb3BlbjIiLCAicG9wZW4zIiwgInBvcGVuNCJdCisKK3RyeToKKyAgICBNQVhGRCA9IG9zLnN5c2NvbmYoJ1NDX09QRU5fTUFYJykKK2V4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgIE1BWEZEID0gMjU2CisKK19hY3RpdmUgPSBbXQorCitkZWYgX2NsZWFudXAoKToKKyAgICBmb3IgaW5zdCBpbiBfYWN0aXZlWzpdOgorICAgICAgICBpZiBpbnN0LnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KSA+PSAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKGluc3QpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiBpZiB0d28gdGhyZWFkcyBjcmVhdGUgYSBuZXcgUG9wZW4gaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgIyBJdCdzIGhhcm1sZXNzIHRoYXQgaXQgd2FzIGFscmVhZHkgcmVtb3ZlZCwgc28gaWdub3JlLgorICAgICAgICAgICAgICAgIHBhc3MKKworY2xhc3MgUG9wZW4zOgorICAgICIiIkNsYXNzIHJlcHJlc2VudGluZyBhIGNoaWxkIHByb2Nlc3MuICBOb3JtYWxseSwgaW5zdGFuY2VzIGFyZSBjcmVhdGVkCisgICAgaW50ZXJuYWxseSBieSB0aGUgZnVuY3Rpb25zIHBvcGVuMigpIGFuZCBwb3BlbjMoKS4iIiIKKworICAgIHN0cyA9IC0xICAgICAgICAgICAgICAgICAgICAjIENoaWxkIG5vdCBjb21wbGV0ZWQgeWV0CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY21kLCBjYXB0dXJlc3RkZXJyPUZhbHNlLCBidWZzaXplPS0xKToKKyAgICAgICAgIiIiVGhlIHBhcmFtZXRlciAnY21kJyBpcyB0aGUgc2hlbGwgY29tbWFuZCB0byBleGVjdXRlIGluIGEKKyAgICAgICAgc3ViLXByb2Nlc3MuICBPbiBVTklYLCAnY21kJyBtYXkgYmUgYSBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSBhcmd1bWVudHMKKyAgICAgICAgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIHByb2dyYW0gd2l0aG91dCBzaGVsbCBpbnRlcnZlbnRpb24gKGFzCisgICAgICAgIHdpdGggb3Muc3Bhd252KCkpLiAgSWYgJ2NtZCcgaXMgYSBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoZWxsCisgICAgICAgIChhcyB3aXRoIG9zLnN5c3RlbSgpKS4gICBUaGUgJ2NhcHR1cmVzdGRlcnInIGZsYWcsIGlmIHRydWUsIHNwZWNpZmllcworICAgICAgICB0aGF0IHRoZSBvYmplY3Qgc2hvdWxkIGNhcHR1cmUgc3RhbmRhcmQgZXJyb3Igb3V0cHV0IG9mIHRoZSBjaGlsZAorICAgICAgICBwcm9jZXNzLiAgVGhlIGRlZmF1bHQgaXMgZmFsc2UuICBJZiB0aGUgJ2J1ZnNpemUnIHBhcmFtZXRlciBpcworICAgICAgICBzcGVjaWZpZWQsIGl0IHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgSS9PIGJ1ZmZlcnMgdG8vZnJvbSB0aGUgY2hpbGQKKyAgICAgICAgcHJvY2Vzcy4iIiIKKyAgICAgICAgX2NsZWFudXAoKQorICAgICAgICBzZWxmLmNtZCA9IGNtZAorICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IG9zLnBpcGUoKQorICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IG9zLnBpcGUoKQorICAgICAgICBpZiBjYXB0dXJlc3RkZXJyOgorICAgICAgICAgICAgZXJyb3V0LCBlcnJpbiA9IG9zLnBpcGUoKQorICAgICAgICBzZWxmLnBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBzZWxmLnBpZCA9PSAwOgorICAgICAgICAgICAgIyBDaGlsZAorICAgICAgICAgICAgb3MuZHVwMihwMmNyZWFkLCAwKQorICAgICAgICAgICAgb3MuZHVwMihjMnB3cml0ZSwgMSkKKyAgICAgICAgICAgIGlmIGNhcHR1cmVzdGRlcnI6CisgICAgICAgICAgICAgICAgb3MuZHVwMihlcnJpbiwgMikKKyAgICAgICAgICAgIHNlbGYuX3J1bl9jaGlsZChjbWQpCisgICAgICAgIG9zLmNsb3NlKHAyY3JlYWQpCisgICAgICAgIHNlbGYudG9jaGlsZCA9IG9zLmZkb3BlbihwMmN3cml0ZSwgJ3cnLCBidWZzaXplKQorICAgICAgICBvcy5jbG9zZShjMnB3cml0ZSkKKyAgICAgICAgc2VsZi5mcm9tY2hpbGQgPSBvcy5mZG9wZW4oYzJwcmVhZCwgJ3InLCBidWZzaXplKQorICAgICAgICBpZiBjYXB0dXJlc3RkZXJyOgorICAgICAgICAgICAgb3MuY2xvc2UoZXJyaW4pCisgICAgICAgICAgICBzZWxmLmNoaWxkZXJyID0gb3MuZmRvcGVuKGVycm91dCwgJ3InLCBidWZzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jaGlsZGVyciA9IE5vbmUKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgorICAgICAgICBzZWxmLnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KQorICAgICAgICBpZiBzZWxmLnN0cyA8IDA6CisgICAgICAgICAgICBpZiBfYWN0aXZlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgQ2hpbGQgaXMgc3RpbGwgcnVubmluZywga2VlcCB1cyBhbGl2ZSB1bnRpbCB3ZSBjYW4gd2FpdCBvbiBpdC4KKyAgICAgICAgICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQorCisgICAgZGVmIF9ydW5fY2hpbGQoc2VsZiwgY21kKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShjbWQsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgY21kID0gWycvYmluL3NoJywgJy1jJywgY21kXQorICAgICAgICBvcy5jbG9zZXJhbmdlKDMsIE1BWEZEKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5leGVjdnAoY21kWzBdLCBjbWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5fZXhpdCgxKQorCisgICAgZGVmIHBvbGwoc2VsZiwgX2RlYWRzdGF0ZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2VzcyBpZiBpdCBoYXMgZmluaXNoZWQsCisgICAgICAgIG9yIC0xIGlmIGl0IGhhc24ndCBmaW5pc2hlZCB5ZXQuIiIiCisgICAgICAgIGlmIHNlbGYuc3RzIDwgMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICAgICAgIyBwaWQgd2lsbCBiZSAwIGlmIHNlbGYucGlkIGhhc24ndCB0ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cyA9IHN0cworICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIGlmIF9kZWFkc3RhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RzID0gX2RlYWRzdGF0ZQorICAgICAgICByZXR1cm4gc2VsZi5zdHMKKworICAgIGRlZiB3YWl0KHNlbGYpOgorICAgICAgICAiIiJXYWl0IGZvciBhbmQgcmV0dXJuIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4iIiIKKyAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgorICAgICAgICAgICAgcGlkLCBzdHMgPSBvcy53YWl0cGlkKHNlbGYucGlkLCAwKQorICAgICAgICAgICAgIyBUaGlzIHVzZWQgdG8gYmUgYSB0ZXN0LCBidXQgaXQgaXMgYmVsaWV2ZWQgdG8gYmUKKyAgICAgICAgICAgICMgYWx3YXlzIHRydWUsIHNvIEkgY2hhbmdlZCBpdCB0byBhbiBhc3NlcnRpb24gLSBtdmwKKyAgICAgICAgICAgIGFzc2VydCBwaWQgPT0gc2VsZi5waWQKKyAgICAgICAgICAgIHNlbGYuc3RzID0gc3RzCisgICAgICAgIHJldHVybiBzZWxmLnN0cworCisKK2NsYXNzIFBvcGVuNChQb3BlbjMpOgorICAgIGNoaWxkZXJyID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNtZCwgYnVmc2l6ZT0tMSk6CisgICAgICAgIF9jbGVhbnVwKCkKKyAgICAgICAgc2VsZi5jbWQgPSBjbWQKKyAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBvcy5waXBlKCkKKyAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBvcy5waXBlKCkKKyAgICAgICAgc2VsZi5waWQgPSBvcy5mb3JrKCkKKyAgICAgICAgaWYgc2VsZi5waWQgPT0gMDoKKyAgICAgICAgICAgICMgQ2hpbGQKKyAgICAgICAgICAgIG9zLmR1cDIocDJjcmVhZCwgMCkKKyAgICAgICAgICAgIG9zLmR1cDIoYzJwd3JpdGUsIDEpCisgICAgICAgICAgICBvcy5kdXAyKGMycHdyaXRlLCAyKQorICAgICAgICAgICAgc2VsZi5fcnVuX2NoaWxkKGNtZCkKKyAgICAgICAgb3MuY2xvc2UocDJjcmVhZCkKKyAgICAgICAgc2VsZi50b2NoaWxkID0gb3MuZmRvcGVuKHAyY3dyaXRlLCAndycsIGJ1ZnNpemUpCisgICAgICAgIG9zLmNsb3NlKGMycHdyaXRlKQorICAgICAgICBzZWxmLmZyb21jaGlsZCA9IG9zLmZkb3BlbihjMnByZWFkLCAncicsIGJ1ZnNpemUpCisKKworaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAid2luIiBvciBzeXMucGxhdGZvcm0gPT0gIm9zMmVteCI6CisgICAgIyBTb21lIHRoaW5ncyBkb24ndCBtYWtlIHNlbnNlIG9uIG5vbi1Vbml4IHBsYXRmb3Jtcy4KKyAgICBkZWwgUG9wZW4zLCBQb3BlbjQKKworICAgIGRlZiBwb3BlbjIoY21kLCBidWZzaXplPS0xLCBtb2RlPSd0Jyk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIHNoZWxsIGNvbW1hbmQgJ2NtZCcgaW4gYSBzdWItcHJvY2Vzcy4gT24gVU5JWCwgJ2NtZCcgbWF5CisgICAgICAgIGJlIGEgc2VxdWVuY2UsIGluIHdoaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZQorICAgICAgICBwcm9ncmFtIHdpdGhvdXQgc2hlbGwgaW50ZXJ2ZW50aW9uIChhcyB3aXRoIG9zLnNwYXdudigpKS4gSWYgJ2NtZCcgaXMgYQorICAgICAgICBzdHJpbmcgaXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHNoZWxsIChhcyB3aXRoIG9zLnN5c3RlbSgpKS4gSWYKKyAgICAgICAgJ2J1ZnNpemUnIGlzIHNwZWNpZmllZCwgaXQgc2V0cyB0aGUgYnVmZmVyIHNpemUgZm9yIHRoZSBJL08gcGlwZXMuIFRoZQorICAgICAgICBmaWxlIG9iamVjdHMgKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pIGFyZSByZXR1cm5lZC4iIiIKKyAgICAgICAgdywgciA9IG9zLnBvcGVuMihjbWQsIG1vZGUsIGJ1ZnNpemUpCisgICAgICAgIHJldHVybiByLCB3CisKKyAgICBkZWYgcG9wZW4zKGNtZCwgYnVmc2l6ZT0tMSwgbW9kZT0ndCcpOgorICAgICAgICAiIiJFeGVjdXRlIHRoZSBzaGVsbCBjb21tYW5kICdjbWQnIGluIGEgc3ViLXByb2Nlc3MuIE9uIFVOSVgsICdjbWQnIG1heQorICAgICAgICBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUKKyAgICAgICAgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbiAoYXMgd2l0aCBvcy5zcGF3bnYoKSkuIElmICdjbWQnIGlzIGEKKyAgICAgICAgc3RyaW5nIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGVsbCAoYXMgd2l0aCBvcy5zeXN0ZW0oKSkuIElmCisgICAgICAgICdidWZzaXplJyBpcyBzcGVjaWZpZWQsIGl0IHNldHMgdGhlIGJ1ZmZlciBzaXplIGZvciB0aGUgSS9PIHBpcGVzLiBUaGUKKyAgICAgICAgZmlsZSBvYmplY3RzIChjaGlsZF9zdGRvdXQsIGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRlcnIpIGFyZSByZXR1cm5lZC4iIiIKKyAgICAgICAgdywgciwgZSA9IG9zLnBvcGVuMyhjbWQsIG1vZGUsIGJ1ZnNpemUpCisgICAgICAgIHJldHVybiByLCB3LCBlCisKKyAgICBkZWYgcG9wZW40KGNtZCwgYnVmc2l6ZT0tMSwgbW9kZT0ndCcpOgorICAgICAgICAiIiJFeGVjdXRlIHRoZSBzaGVsbCBjb21tYW5kICdjbWQnIGluIGEgc3ViLXByb2Nlc3MuIE9uIFVOSVgsICdjbWQnIG1heQorICAgICAgICBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUKKyAgICAgICAgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbiAoYXMgd2l0aCBvcy5zcGF3bnYoKSkuIElmICdjbWQnIGlzIGEKKyAgICAgICAgc3RyaW5nIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGVsbCAoYXMgd2l0aCBvcy5zeXN0ZW0oKSkuIElmCisgICAgICAgICdidWZzaXplJyBpcyBzcGVjaWZpZWQsIGl0IHNldHMgdGhlIGJ1ZmZlciBzaXplIGZvciB0aGUgSS9PIHBpcGVzLiBUaGUKKyAgICAgICAgZmlsZSBvYmplY3RzIChjaGlsZF9zdGRvdXRfc3RkZXJyLCBjaGlsZF9zdGRpbikgYXJlIHJldHVybmVkLiIiIgorICAgICAgICB3LCByID0gb3MucG9wZW40KGNtZCwgbW9kZSwgYnVmc2l6ZSkKKyAgICAgICAgcmV0dXJuIHIsIHcKK2Vsc2U6CisgICAgZGVmIHBvcGVuMihjbWQsIGJ1ZnNpemU9LTEsIG1vZGU9J3QnKToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgc2hlbGwgY29tbWFuZCAnY21kJyBpbiBhIHN1Yi1wcm9jZXNzLiBPbiBVTklYLCAnY21kJyBtYXkKKyAgICAgICAgYmUgYSBzZXF1ZW5jZSwgaW4gd2hpY2ggY2FzZSBhcmd1bWVudHMgd2lsbCBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlCisgICAgICAgIHByb2dyYW0gd2l0aG91dCBzaGVsbCBpbnRlcnZlbnRpb24gKGFzIHdpdGggb3Muc3Bhd252KCkpLiBJZiAnY21kJyBpcyBhCisgICAgICAgIHN0cmluZyBpdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2hlbGwgKGFzIHdpdGggb3Muc3lzdGVtKCkpLiBJZgorICAgICAgICAnYnVmc2l6ZScgaXMgc3BlY2lmaWVkLCBpdCBzZXRzIHRoZSBidWZmZXIgc2l6ZSBmb3IgdGhlIEkvTyBwaXBlcy4gVGhlCisgICAgICAgIGZpbGUgb2JqZWN0cyAoY2hpbGRfc3Rkb3V0LCBjaGlsZF9zdGRpbikgYXJlIHJldHVybmVkLiIiIgorICAgICAgICBpbnN0ID0gUG9wZW4zKGNtZCwgRmFsc2UsIGJ1ZnNpemUpCisgICAgICAgIHJldHVybiBpbnN0LmZyb21jaGlsZCwgaW5zdC50b2NoaWxkCisKKyAgICBkZWYgcG9wZW4zKGNtZCwgYnVmc2l6ZT0tMSwgbW9kZT0ndCcpOgorICAgICAgICAiIiJFeGVjdXRlIHRoZSBzaGVsbCBjb21tYW5kICdjbWQnIGluIGEgc3ViLXByb2Nlc3MuIE9uIFVOSVgsICdjbWQnIG1heQorICAgICAgICBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUKKyAgICAgICAgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbiAoYXMgd2l0aCBvcy5zcGF3bnYoKSkuIElmICdjbWQnIGlzIGEKKyAgICAgICAgc3RyaW5nIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGVsbCAoYXMgd2l0aCBvcy5zeXN0ZW0oKSkuIElmCisgICAgICAgICdidWZzaXplJyBpcyBzcGVjaWZpZWQsIGl0IHNldHMgdGhlIGJ1ZmZlciBzaXplIGZvciB0aGUgSS9PIHBpcGVzLiBUaGUKKyAgICAgICAgZmlsZSBvYmplY3RzIChjaGlsZF9zdGRvdXQsIGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRlcnIpIGFyZSByZXR1cm5lZC4iIiIKKyAgICAgICAgaW5zdCA9IFBvcGVuMyhjbWQsIFRydWUsIGJ1ZnNpemUpCisgICAgICAgIHJldHVybiBpbnN0LmZyb21jaGlsZCwgaW5zdC50b2NoaWxkLCBpbnN0LmNoaWxkZXJyCisKKyAgICBkZWYgcG9wZW40KGNtZCwgYnVmc2l6ZT0tMSwgbW9kZT0ndCcpOgorICAgICAgICAiIiJFeGVjdXRlIHRoZSBzaGVsbCBjb21tYW5kICdjbWQnIGluIGEgc3ViLXByb2Nlc3MuIE9uIFVOSVgsICdjbWQnIG1heQorICAgICAgICBiZSBhIHNlcXVlbmNlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseSB0byB0aGUKKyAgICAgICAgcHJvZ3JhbSB3aXRob3V0IHNoZWxsIGludGVydmVudGlvbiAoYXMgd2l0aCBvcy5zcGF3bnYoKSkuIElmICdjbWQnIGlzIGEKKyAgICAgICAgc3RyaW5nIGl0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBzaGVsbCAoYXMgd2l0aCBvcy5zeXN0ZW0oKSkuIElmCisgICAgICAgICdidWZzaXplJyBpcyBzcGVjaWZpZWQsIGl0IHNldHMgdGhlIGJ1ZmZlciBzaXplIGZvciB0aGUgSS9PIHBpcGVzLiBUaGUKKyAgICAgICAgZmlsZSBvYmplY3RzIChjaGlsZF9zdGRvdXRfc3RkZXJyLCBjaGlsZF9zdGRpbikgYXJlIHJldHVybmVkLiIiIgorICAgICAgICBpbnN0ID0gUG9wZW40KGNtZCwgYnVmc2l6ZSkKKyAgICAgICAgcmV0dXJuIGluc3QuZnJvbWNoaWxkLCBpbnN0LnRvY2hpbGQKKworICAgIF9fYWxsX18uZXh0ZW5kKFsiUG9wZW4zIiwgIlBvcGVuNCJdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wb3BlbjIucHljIGIvbGliL3B5dGhvbjIuNy9wb3BlbjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZWZkNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BvcGVuMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wb3BlbjIucHlvIGIvbGliL3B5dGhvbjIuNy9wb3BlbjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYzI1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3BvcGVuMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wb3BsaWIucHkgYi9saWIvcHl0aG9uMi43L3BvcGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmIzM2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wb3BsaWIucHkKQEAgLTAsMCArMSw0MTcgQEAKKyIiIkEgUE9QMyBjbGllbnQgY2xhc3MuCisKK0Jhc2VkIG9uIHRoZSBKLiBNeWVycyBQT1AzIGRyYWZ0LCBKYW4uIDk2CisiIiIKKworIyBBdXRob3I6IERhdmlkIEFzY2hlciA8ZGF2aWRfYXNjaGVyQGJyb3duLmVkdT4KKyMgICAgICAgICBbaGVhdmlseSBzdGVhbGluZyBmcm9tIG5udHBsaWIucHldCisjIFVwZGF0ZWQ6IFBpZXJzIExhdWRlciA8cGllcnNAY3Muc3Uub3ouYXU+IFtKdWwgJzk3XQorIyBTdHJpbmcgbWV0aG9kIGNvbnZlcnNpb24gYW5kIHRlc3QgamlnIGltcHJvdmVtZW50cyBieSBFU1IsIEZlYnJ1YXJ5IDIwMDEuCisjIEFkZGVkIHRoZSBQT1AzX1NTTCBjbGFzcy4gTWV0aG9kcyBsb29zZWx5IGJhc2VkIG9uIElNQVBfU1NMLiBIZWN0b3IgVXJ0dWJpYSA8dXJ0dWJpYUBtcmJvb2sub3JnPiBBdWcgMjAwMworCisjIEV4YW1wbGUgKHNlZSB0aGUgdGVzdCBmdW5jdGlvbiBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZSkKKworIyBJbXBvcnRzCisKK2ltcG9ydCByZSwgc29ja2V0CisKK19fYWxsX18gPSBbIlBPUDMiLCJlcnJvcl9wcm90byJdCisKKyMgRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIG9yIGludmFsaWQgcmVzcG9uc2UgaXMgcmVjZWl2ZWQ6CisKK2NsYXNzIGVycm9yX3Byb3RvKEV4Y2VwdGlvbik6IHBhc3MKKworIyBTdGFuZGFyZCBQb3J0CitQT1AzX1BPUlQgPSAxMTAKKworIyBQT1AgU1NMIFBPUlQKK1BPUDNfU1NMX1BPUlQgPSA5OTUKKworIyBMaW5lIHRlcm1pbmF0b3JzICh3ZSBhbHdheXMgb3V0cHV0IENSTEYsIGJ1dCBhY2NlcHQgYW55IG9mIENSTEYsIExGQ1IsIExGKQorQ1IgPSAnXHInCitMRiA9ICdcbicKK0NSTEYgPSBDUitMRgorCisKK2NsYXNzIFBPUDM6CisKKyAgICAiIiJUaGlzIGNsYXNzIHN1cHBvcnRzIGJvdGggdGhlIG1pbmltYWwgYW5kIG9wdGlvbmFsIGNvbW1hbmQgc2V0cy4KKyAgICBBcmd1bWVudHMgY2FuIGJlIHN0cmluZ3Mgb3IgaW50ZWdlcnMgKHdoZXJlIGFwcHJvcHJpYXRlKQorICAgIChlLmcuOiByZXRyKDEpIGFuZCByZXRyKCcxJykgYm90aCB3b3JrIGVxdWFsbHkgd2VsbC4KKworICAgIE1pbmltYWwgQ29tbWFuZCBTZXQ6CisgICAgICAgICAgICBVU0VSIG5hbWUgICAgICAgICAgICAgICB1c2VyKG5hbWUpCisgICAgICAgICAgICBQQVNTIHN0cmluZyAgICAgICAgICAgICBwYXNzXyhzdHJpbmcpCisgICAgICAgICAgICBTVEFUICAgICAgICAgICAgICAgICAgICBzdGF0KCkKKyAgICAgICAgICAgIExJU1QgW21zZ10gICAgICAgICAgICAgIGxpc3QobXNnID0gTm9uZSkKKyAgICAgICAgICAgIFJFVFIgbXNnICAgICAgICAgICAgICAgIHJldHIobXNnKQorICAgICAgICAgICAgREVMRSBtc2cgICAgICAgICAgICAgICAgZGVsZShtc2cpCisgICAgICAgICAgICBOT09QICAgICAgICAgICAgICAgICAgICBub29wKCkKKyAgICAgICAgICAgIFJTRVQgICAgICAgICAgICAgICAgICAgIHJzZXQoKQorICAgICAgICAgICAgUVVJVCAgICAgICAgICAgICAgICAgICAgcXVpdCgpCisKKyAgICBPcHRpb25hbCBDb21tYW5kcyAoc29tZSBzZXJ2ZXJzIHN1cHBvcnQgdGhlc2UpOgorICAgICAgICAgICAgUlBPUCBuYW1lICAgICAgICAgICAgICAgcnBvcChuYW1lKQorICAgICAgICAgICAgQVBPUCBuYW1lIGRpZ2VzdCAgICAgICAgYXBvcChuYW1lLCBkaWdlc3QpCisgICAgICAgICAgICBUT1AgbXNnIG4gICAgICAgICAgICAgICB0b3AobXNnLCBuKQorICAgICAgICAgICAgVUlETCBbbXNnXSAgICAgICAgICAgICAgdWlkbChtc2cgPSBOb25lKQorCisgICAgUmFpc2VzIG9uZSBleGNlcHRpb246ICdlcnJvcl9wcm90bycuCisKKyAgICBJbnN0YW50aWF0ZSB3aXRoOgorICAgICAgICAgICAgUE9QMyhob3N0bmFtZSwgcG9ydD0xMTApCisKKyAgICBOQjogICAgIHRoZSBQT1AgcHJvdG9jb2wgbG9ja3MgdGhlIG1haWxib3ggZnJvbSB1c2VyCisgICAgICAgICAgICBhdXRob3JpemF0aW9uIHVudGlsIFFVSVQsIHNvIGJlIHN1cmUgdG8gZ2V0IGluLCBzdWNrCisgICAgICAgICAgICB0aGUgbWVzc2FnZXMsIGFuZCBxdWl0LCBlYWNoIHRpbWUgeW91IGFjY2VzcyB0aGUKKyAgICAgICAgICAgIG1haWxib3guCisKKyAgICAgICAgICAgIFBPUCBpcyBhIGxpbmUtYmFzZWQgcHJvdG9jb2wsIHdoaWNoIG1lYW5zIGxhcmdlIG1haWwKKyAgICAgICAgICAgIG1lc3NhZ2VzIGNvbnN1bWUgbG90cyBvZiBweXRob24gY3ljbGVzIHJlYWRpbmcgdGhlbQorICAgICAgICAgICAgbGluZS1ieS1saW5lLgorCisgICAgICAgICAgICBJZiBpdCdzIGF2YWlsYWJsZSBvbiB5b3VyIG1haWwgc2VydmVyLCB1c2UgSU1BUDQKKyAgICAgICAgICAgIGluc3RlYWQsIGl0IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhlIHR3byBwcm9ibGVtcworICAgICAgICAgICAgYWJvdmUuCisgICAgIiIiCisKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0LCBwb3J0PVBPUDNfUE9SVCwKKyAgICAgICAgICAgICAgICAgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQpOgorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChob3N0LCBwb3J0KSwgdGltZW91dCkKKyAgICAgICAgc2VsZi5maWxlID0gc2VsZi5zb2NrLm1ha2VmaWxlKCdyYicpCisgICAgICAgIHNlbGYuX2RlYnVnZ2luZyA9IDAKKyAgICAgICAgc2VsZi53ZWxjb21lID0gc2VsZi5fZ2V0cmVzcCgpCisKKworICAgIGRlZiBfcHV0bGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnaW5nID4gMTogcHJpbnQgJypwdXQqJywgcmVwcihsaW5lKQorICAgICAgICBzZWxmLnNvY2suc2VuZGFsbCgnJXMlcycgJSAobGluZSwgQ1JMRikpCisKKworICAgICMgSW50ZXJuYWw6IHNlbmQgb25lIGNvbW1hbmQgdG8gdGhlIHNlcnZlciAodGhyb3VnaCBfcHV0bGluZSgpKQorCisgICAgZGVmIF9wdXRjbWQoc2VsZiwgbGluZSk6CisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2luZzogcHJpbnQgJypjbWQqJywgcmVwcihsaW5lKQorICAgICAgICBzZWxmLl9wdXRsaW5lKGxpbmUpCisKKworICAgICMgSW50ZXJuYWw6IHJldHVybiBvbmUgbGluZSBmcm9tIHRoZSBzZXJ2ZXIsIHN0cmlwcGluZyBDUkxGLgorICAgICMgVGhpcyBpcyB3aGVyZSBhbGwgdGhlIENQVSB0aW1lIG9mIHRoaXMgbW9kdWxlIGlzIGNvbnN1bWVkLgorICAgICMgUmFpc2UgZXJyb3JfcHJvdG8oJy1FUlIgRU9GJykgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorCisgICAgZGVmIF9nZXRsaW5lKHNlbGYpOgorICAgICAgICBsaW5lID0gc2VsZi5maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnaW5nID4gMTogcHJpbnQgJypnZXQqJywgcmVwcihsaW5lKQorICAgICAgICBpZiBub3QgbGluZTogcmFpc2UgZXJyb3JfcHJvdG8oJy1FUlIgRU9GJykKKyAgICAgICAgb2N0ZXRzID0gbGVuKGxpbmUpCisgICAgICAgICMgc2VydmVyIGNhbiBzZW5kIGFueSBjb21iaW5hdGlvbiBvZiBDUiAmIExGCisgICAgICAgICMgaG93ZXZlciwgJ3JlYWRsaW5lKCknIHJldHVybnMgbGluZXMgZW5kaW5nIGluIExGCisgICAgICAgICMgc28gb25seSBwb3NzaWJpbGl0aWVzIGFyZSAuLi5MRiwgLi4uQ1JMRiwgQ1IuLi5MRgorICAgICAgICBpZiBsaW5lWy0yOl0gPT0gQ1JMRjoKKyAgICAgICAgICAgIHJldHVybiBsaW5lWzotMl0sIG9jdGV0cworICAgICAgICBpZiBsaW5lWzBdID09IENSOgorICAgICAgICAgICAgcmV0dXJuIGxpbmVbMTotMV0sIG9jdGV0cworICAgICAgICByZXR1cm4gbGluZVs6LTFdLCBvY3RldHMKKworCisgICAgIyBJbnRlcm5hbDogZ2V0IGEgcmVzcG9uc2UgZnJvbSB0aGUgc2VydmVyLgorICAgICMgUmFpc2UgJ2Vycm9yX3Byb3RvJyBpZiB0aGUgcmVzcG9uc2UgZG9lc24ndCBzdGFydCB3aXRoICcrJy4KKworICAgIGRlZiBfZ2V0cmVzcChzZWxmKToKKyAgICAgICAgcmVzcCwgbyA9IHNlbGYuX2dldGxpbmUoKQorICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dpbmcgPiAxOiBwcmludCAnKnJlc3AqJywgcmVwcihyZXNwKQorICAgICAgICBjID0gcmVzcFs6MV0KKyAgICAgICAgaWYgYyAhPSAnKyc6CisgICAgICAgICAgICByYWlzZSBlcnJvcl9wcm90byhyZXNwKQorICAgICAgICByZXR1cm4gcmVzcAorCisKKyAgICAjIEludGVybmFsOiBnZXQgYSByZXNwb25zZSBwbHVzIGZvbGxvd2luZyB0ZXh0IGZyb20gdGhlIHNlcnZlci4KKworICAgIGRlZiBfZ2V0bG9uZ3Jlc3Aoc2VsZik6CisgICAgICAgIHJlc3AgPSBzZWxmLl9nZXRyZXNwKCkKKyAgICAgICAgbGlzdCA9IFtdOyBvY3RldHMgPSAwCisgICAgICAgIGxpbmUsIG8gPSBzZWxmLl9nZXRsaW5lKCkKKyAgICAgICAgd2hpbGUgbGluZSAhPSAnLic6CisgICAgICAgICAgICBpZiBsaW5lWzoyXSA9PSAnLi4nOgorICAgICAgICAgICAgICAgIG8gPSBvLTEKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVsxOl0KKyAgICAgICAgICAgIG9jdGV0cyA9IG9jdGV0cyArIG8KKyAgICAgICAgICAgIGxpc3QuYXBwZW5kKGxpbmUpCisgICAgICAgICAgICBsaW5lLCBvID0gc2VsZi5fZ2V0bGluZSgpCisgICAgICAgIHJldHVybiByZXNwLCBsaXN0LCBvY3RldHMKKworCisgICAgIyBJbnRlcm5hbDogc2VuZCBhIGNvbW1hbmQgYW5kIGdldCB0aGUgcmVzcG9uc2UKKworICAgIGRlZiBfc2hvcnRjbWQoc2VsZiwgbGluZSk6CisgICAgICAgIHNlbGYuX3B1dGNtZChsaW5lKQorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0cmVzcCgpCisKKworICAgICMgSW50ZXJuYWw6IHNlbmQgYSBjb21tYW5kIGFuZCBnZXQgdGhlIHJlc3BvbnNlIHBsdXMgZm9sbG93aW5nIHRleHQKKworICAgIGRlZiBfbG9uZ2NtZChzZWxmLCBsaW5lKToKKyAgICAgICAgc2VsZi5fcHV0Y21kKGxpbmUpCisgICAgICAgIHJldHVybiBzZWxmLl9nZXRsb25ncmVzcCgpCisKKworICAgICMgVGhlc2UgY2FuIGJlIHVzZWZ1bDoKKworICAgIGRlZiBnZXR3ZWxjb21lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi53ZWxjb21lCisKKworICAgIGRlZiBzZXRfZGVidWdsZXZlbChzZWxmLCBsZXZlbCk6CisgICAgICAgIHNlbGYuX2RlYnVnZ2luZyA9IGxldmVsCisKKworICAgICMgSGVyZSBhcmUgYWxsIHRoZSBQT1AgY29tbWFuZHM6CisKKyAgICBkZWYgdXNlcihzZWxmLCB1c2VyKToKKyAgICAgICAgIiIiU2VuZCB1c2VyIG5hbWUsIHJldHVybiByZXNwb25zZQorCisgICAgICAgIChzaG91bGQgaW5kaWNhdGUgcGFzc3dvcmQgcmVxdWlyZWQpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3J0Y21kKCdVU0VSICVzJyAlIHVzZXIpCisKKworICAgIGRlZiBwYXNzXyhzZWxmLCBwc3dkKToKKyAgICAgICAgIiIiU2VuZCBwYXNzd29yZCwgcmV0dXJuIHJlc3BvbnNlCisKKyAgICAgICAgKHJlc3BvbnNlIGluY2x1ZGVzIG1lc3NhZ2UgY291bnQsIG1haWxib3ggc2l6ZSkuCisKKyAgICAgICAgTkI6IG1haWxib3ggaXMgbG9ja2VkIGJ5IHNlcnZlciBmcm9tIGhlcmUgdG8gJ3F1aXQoKScKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaG9ydGNtZCgnUEFTUyAlcycgJSBwc3dkKQorCisKKyAgICBkZWYgc3RhdChzZWxmKToKKyAgICAgICAgIiIiR2V0IG1haWxib3ggc3RhdHVzLgorCisgICAgICAgIFJlc3VsdCBpcyB0dXBsZSBvZiAyIGludHMgKG1lc3NhZ2UgY291bnQsIG1haWxib3ggc2l6ZSkKKyAgICAgICAgIiIiCisgICAgICAgIHJldHZhbCA9IHNlbGYuX3Nob3J0Y21kKCdTVEFUJykKKyAgICAgICAgcmV0cyA9IHJldHZhbC5zcGxpdCgpCisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2luZzogcHJpbnQgJypzdGF0KicsIHJlcHIocmV0cykKKyAgICAgICAgbnVtTWVzc2FnZXMgPSBpbnQocmV0c1sxXSkKKyAgICAgICAgc2l6ZU1lc3NhZ2VzID0gaW50KHJldHNbMl0pCisgICAgICAgIHJldHVybiAobnVtTWVzc2FnZXMsIHNpemVNZXNzYWdlcykKKworCisgICAgZGVmIGxpc3Qoc2VsZiwgd2hpY2g9Tm9uZSk6CisgICAgICAgICIiIlJlcXVlc3QgbGlzdGluZywgcmV0dXJuIHJlc3VsdC4KKworICAgICAgICBSZXN1bHQgd2l0aG91dCBhIG1lc3NhZ2UgbnVtYmVyIGFyZ3VtZW50IGlzIGluIGZvcm0KKyAgICAgICAgWydyZXNwb25zZScsIFsnbWVzZ19udW0gb2N0ZXRzJywgLi4uXSwgb2N0ZXRzXS4KKworICAgICAgICBSZXN1bHQgd2hlbiBhIG1lc3NhZ2UgbnVtYmVyIGFyZ3VtZW50IGlzIGdpdmVuIGlzIGEKKyAgICAgICAgc2luZ2xlIHJlc3BvbnNlOiB0aGUgInNjYW4gbGlzdGluZyIgZm9yIHRoYXQgbWVzc2FnZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdoaWNoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3J0Y21kKCdMSVNUICVzJyAlIHdoaWNoKQorICAgICAgICByZXR1cm4gc2VsZi5fbG9uZ2NtZCgnTElTVCcpCisKKworICAgIGRlZiByZXRyKHNlbGYsIHdoaWNoKToKKyAgICAgICAgIiIiUmV0cmlldmUgd2hvbGUgbWVzc2FnZSBudW1iZXIgJ3doaWNoJy4KKworICAgICAgICBSZXN1bHQgaXMgaW4gZm9ybSBbJ3Jlc3BvbnNlJywgWydsaW5lJywgLi4uXSwgb2N0ZXRzXS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9sb25nY21kKCdSRVRSICVzJyAlIHdoaWNoKQorCisKKyAgICBkZWYgZGVsZShzZWxmLCB3aGljaCk6CisgICAgICAgICIiIkRlbGV0ZSBtZXNzYWdlIG51bWJlciAnd2hpY2gnLgorCisgICAgICAgIFJlc3VsdCBpcyAncmVzcG9uc2UnLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3J0Y21kKCdERUxFICVzJyAlIHdoaWNoKQorCisKKyAgICBkZWYgbm9vcChzZWxmKToKKyAgICAgICAgIiIiRG9lcyBub3RoaW5nLgorCisgICAgICAgIE9uZSBzdXBwb3NlcyB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHRoZSBzZXJ2ZXIgaXMgYWxpdmUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ05PT1AnKQorCisKKyAgICBkZWYgcnNldChzZWxmKToKKyAgICAgICAgIiIiVW5tYXJrIGFsbCBtZXNzYWdlcyBtYXJrZWQgZm9yIGRlbGV0aW9uLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ1JTRVQnKQorCisKKyAgICBkZWYgcXVpdChzZWxmKToKKyAgICAgICAgIiIiU2lnbm9mZjogY29tbWl0IGNoYW5nZXMgb24gc2VydmVyLCB1bmxvY2sgbWFpbGJveCwgY2xvc2UgY29ubmVjdGlvbi4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzcCA9IHNlbGYuX3Nob3J0Y21kKCdRVUlUJykKKyAgICAgICAgZXhjZXB0IGVycm9yX3Byb3RvLCB2YWw6CisgICAgICAgICAgICByZXNwID0gdmFsCisgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLmZpbGUsIHNlbGYuc29jaworICAgICAgICByZXR1cm4gcmVzcAorCisgICAgI19fZGVsX18gPSBxdWl0CisKKworICAgICMgb3B0aW9uYWwgY29tbWFuZHM6CisKKyAgICBkZWYgcnBvcChzZWxmLCB1c2VyKToKKyAgICAgICAgIiIiTm90IHN1cmUgd2hhdCB0aGlzIGRvZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zaG9ydGNtZCgnUlBPUCAlcycgJSB1c2VyKQorCisKKyAgICB0aW1lc3RhbXAgPSByZS5jb21waWxlKHInXCtPSy4qKDxbXj5dKz4pJykKKworICAgIGRlZiBhcG9wKHNlbGYsIHVzZXIsIHNlY3JldCk6CisgICAgICAgICIiIkF1dGhvcmlzYXRpb24KKworICAgICAgICAtIG9ubHkgcG9zc2libGUgaWYgc2VydmVyIGhhcyBzdXBwbGllZCBhIHRpbWVzdGFtcCBpbiBpbml0aWFsIGdyZWV0aW5nLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICAgICAgdXNlciAgICAtIG1haWxib3ggdXNlcjsKKyAgICAgICAgICAgICAgICBzZWNyZXQgIC0gc2VjcmV0IHNoYXJlZCBiZXR3ZWVuIGNsaWVudCBhbmQgc2VydmVyLgorCisgICAgICAgIE5COiBtYWlsYm94IGlzIGxvY2tlZCBieSBzZXJ2ZXIgZnJvbSBoZXJlIHRvICdxdWl0KCknCisgICAgICAgICIiIgorICAgICAgICBtID0gc2VsZi50aW1lc3RhbXAubWF0Y2goc2VsZi53ZWxjb21lKQorICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yX3Byb3RvKCctRVJSIEFQT1Agbm90IHN1cHBvcnRlZCBieSBzZXJ2ZXInKQorICAgICAgICBpbXBvcnQgaGFzaGxpYgorICAgICAgICBkaWdlc3QgPSBoYXNobGliLm1kNShtLmdyb3VwKDEpK3NlY3JldCkuZGlnZXN0KCkKKyAgICAgICAgZGlnZXN0ID0gJycuam9pbihtYXAobGFtYmRhIHg6JyUwMngnJW9yZCh4KSwgZGlnZXN0KSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Nob3J0Y21kKCdBUE9QICVzICVzJyAlICh1c2VyLCBkaWdlc3QpKQorCisKKyAgICBkZWYgdG9wKHNlbGYsIHdoaWNoLCBob3dtdWNoKToKKyAgICAgICAgIiIiUmV0cmlldmUgbWVzc2FnZSBoZWFkZXIgb2YgbWVzc2FnZSBudW1iZXIgJ3doaWNoJworICAgICAgICBhbmQgZmlyc3QgJ2hvd211Y2gnIGxpbmVzIG9mIG1lc3NhZ2UgYm9keS4KKworICAgICAgICBSZXN1bHQgaXMgaW4gZm9ybSBbJ3Jlc3BvbnNlJywgWydsaW5lJywgLi4uXSwgb2N0ZXRzXS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9sb25nY21kKCdUT1AgJXMgJXMnICUgKHdoaWNoLCBob3dtdWNoKSkKKworCisgICAgZGVmIHVpZGwoc2VsZiwgd2hpY2g9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBtZXNzYWdlIGRpZ2VzdCAodW5pcXVlIGlkKSBsaXN0LgorCisgICAgICAgIElmICd3aGljaCcsIHJlc3VsdCBjb250YWlucyB1bmlxdWUgaWQgZm9yIHRoYXQgbWVzc2FnZQorICAgICAgICBpbiB0aGUgZm9ybSAncmVzcG9uc2UgbWVzZ251bSB1aWQnLCBvdGhlcndpc2UgcmVzdWx0IGlzCisgICAgICAgIHRoZSBsaXN0IFsncmVzcG9uc2UnLCBbJ21lc2dudW0gdWlkJywgLi4uXSwgb2N0ZXRzXQorICAgICAgICAiIiIKKyAgICAgICAgaWYgd2hpY2ggaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2hvcnRjbWQoJ1VJREwgJXMnICUgd2hpY2gpCisgICAgICAgIHJldHVybiBzZWxmLl9sb25nY21kKCdVSURMJykKKwordHJ5OgorICAgIGltcG9ydCBzc2wKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorCisgICAgY2xhc3MgUE9QM19TU0woUE9QMyk6CisgICAgICAgICIiIlBPUDMgY2xpZW50IGNsYXNzIG92ZXIgU1NMIGNvbm5lY3Rpb24KKworICAgICAgICBJbnN0YW50aWF0ZSB3aXRoOiBQT1AzX1NTTChob3N0bmFtZSwgcG9ydD05OTUsIGtleWZpbGU9Tm9uZSwgY2VydGZpbGU9Tm9uZSkKKworICAgICAgICAgICAgICAgaG9zdG5hbWUgLSB0aGUgaG9zdG5hbWUgb2YgdGhlIHBvcDMgb3ZlciBzc2wgc2VydmVyCisgICAgICAgICAgICAgICBwb3J0IC0gcG9ydCBudW1iZXIKKyAgICAgICAgICAgICAgIGtleWZpbGUgLSBQRU0gZm9ybWF0dGVkIGZpbGUgdGhhdCBjb3VudGFpbnMgeW91ciBwcml2YXRlIGtleQorICAgICAgICAgICAgICAgY2VydGZpbGUgLSBQRU0gZm9ybWF0dGVkIGNlcnRpZmljYXRlIGNoYWluIGZpbGUKKworICAgICAgICAgICAgU2VlIHRoZSBtZXRob2RzIG9mIHRoZSBwYXJlbnQgY2xhc3MgUE9QMyBmb3IgbW9yZSBkb2N1bWVudGF0aW9uLgorICAgICAgICAiIiIKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCA9IFBPUDNfU1NMX1BPUlQsIGtleWZpbGUgPSBOb25lLCBjZXJ0ZmlsZSA9IE5vbmUpOgorICAgICAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5ZmlsZQorICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiCisgICAgICAgICAgICBtc2cgPSAiZ2V0YWRkcmluZm8gcmV0dXJucyBhbiBlbXB0eSBsaXN0IgorICAgICAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICAgICAgZm9yIHJlcyBpbiBzb2NrZXQuZ2V0YWRkcmluZm8oc2VsZi5ob3N0LCBzZWxmLnBvcnQsIDAsIHNvY2tldC5TT0NLX1NUUkVBTSk6CisgICAgICAgICAgICAgICAgYWYsIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzYSA9IHJlcworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChhZiwgc29ja3R5cGUsIHByb3RvKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2suY29ubmVjdChzYSkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc29jazoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jayA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbm90IHNlbGYuc29jazoKKyAgICAgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IsIG1zZworICAgICAgICAgICAgc2VsZi5maWxlID0gc2VsZi5zb2NrLm1ha2VmaWxlKCdyYicpCisgICAgICAgICAgICBzZWxmLnNzbG9iaiA9IHNzbC53cmFwX3NvY2tldChzZWxmLnNvY2ssIHNlbGYua2V5ZmlsZSwgc2VsZi5jZXJ0ZmlsZSkKKyAgICAgICAgICAgIHNlbGYuX2RlYnVnZ2luZyA9IDAKKyAgICAgICAgICAgIHNlbGYud2VsY29tZSA9IHNlbGYuX2dldHJlc3AoKQorCisgICAgICAgIGRlZiBfZmlsbEJ1ZmZlcihzZWxmKToKKyAgICAgICAgICAgIGxvY2FsYnVmID0gc2VsZi5zc2xvYmoucmVhZCgpCisgICAgICAgICAgICBpZiBsZW4obG9jYWxidWYpID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3JfcHJvdG8oJy1FUlIgRU9GJykKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyICs9IGxvY2FsYnVmCisKKyAgICAgICAgZGVmIF9nZXRsaW5lKHNlbGYpOgorICAgICAgICAgICAgbGluZSA9ICIiCisgICAgICAgICAgICByZW5ld2xpbmUgPSByZS5jb21waWxlKHInLio/XG4nKQorICAgICAgICAgICAgbWF0Y2ggPSByZW5ld2xpbmUubWF0Y2goc2VsZi5idWZmZXIpCisgICAgICAgICAgICB3aGlsZSBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAgc2VsZi5fZmlsbEJ1ZmZlcigpCisgICAgICAgICAgICAgICAgbWF0Y2ggPSByZW5ld2xpbmUubWF0Y2goc2VsZi5idWZmZXIpCisgICAgICAgICAgICBsaW5lID0gbWF0Y2guZ3JvdXAoMCkKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gcmVuZXdsaW5lLnN1YignJyAsc2VsZi5idWZmZXIsIDEpCisgICAgICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dpbmcgPiAxOiBwcmludCAnKmdldConLCByZXByKGxpbmUpCisKKyAgICAgICAgICAgIG9jdGV0cyA9IGxlbihsaW5lKQorICAgICAgICAgICAgaWYgbGluZVstMjpdID09IENSTEY6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVbOi0yXSwgb2N0ZXRzCisgICAgICAgICAgICBpZiBsaW5lWzBdID09IENSOgorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lWzE6LTFdLCBvY3RldHMKKyAgICAgICAgICAgIHJldHVybiBsaW5lWzotMV0sIG9jdGV0cworCisgICAgICAgIGRlZiBfcHV0bGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2luZyA+IDE6IHByaW50ICcqcHV0KicsIHJlcHIobGluZSkKKyAgICAgICAgICAgIGxpbmUgKz0gQ1JMRgorICAgICAgICAgICAgYnl0ZXMgPSBsZW4obGluZSkKKyAgICAgICAgICAgIHdoaWxlIGJ5dGVzID4gMDoKKyAgICAgICAgICAgICAgICBzZW50ID0gc2VsZi5zc2xvYmoud3JpdGUobGluZSkKKyAgICAgICAgICAgICAgICBpZiBzZW50ID09IGJ5dGVzOgorICAgICAgICAgICAgICAgICAgICBicmVhayAgICAjIGF2b2lkIGNvcHkKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVtzZW50Ol0KKyAgICAgICAgICAgICAgICBieXRlcyA9IGJ5dGVzIC0gc2VudAorCisgICAgICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICAgICAgIiIiU2lnbm9mZjogY29tbWl0IGNoYW5nZXMgb24gc2VydmVyLCB1bmxvY2sgbWFpbGJveCwgY2xvc2UgY29ubmVjdGlvbi4iIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXNwID0gc2VsZi5fc2hvcnRjbWQoJ1FVSVQnKQorICAgICAgICAgICAgZXhjZXB0IGVycm9yX3Byb3RvLCB2YWw6CisgICAgICAgICAgICAgICAgcmVzcCA9IHZhbAorICAgICAgICAgICAgc2VsZi5zb2NrLmNsb3NlKCkKKyAgICAgICAgICAgIGRlbCBzZWxmLnNzbG9iaiwgc2VsZi5zb2NrCisgICAgICAgICAgICByZXR1cm4gcmVzcAorCisgICAgX19hbGxfXy5hcHBlbmQoIlBPUDNfU1NMIikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpbXBvcnQgc3lzCisgICAgYSA9IFBPUDMoc3lzLmFyZ3ZbMV0pCisgICAgcHJpbnQgYS5nZXR3ZWxjb21lKCkKKyAgICBhLnVzZXIoc3lzLmFyZ3ZbMl0pCisgICAgYS5wYXNzXyhzeXMuYXJndlszXSkKKyAgICBhLmxpc3QoKQorICAgIChudW1Nc2dzLCB0b3RhbFNpemUpID0gYS5zdGF0KCkKKyAgICBmb3IgaSBpbiByYW5nZSgxLCBudW1Nc2dzICsgMSk6CisgICAgICAgIChoZWFkZXIsIG1zZywgb2N0ZXRzKSA9IGEucmV0cihpKQorICAgICAgICBwcmludCAiTWVzc2FnZSAlZDoiICUgaQorICAgICAgICBmb3IgbGluZSBpbiBtc2c6CisgICAgICAgICAgICBwcmludCAnICAgJyArIGxpbmUKKyAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICAgIGEucXVpdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BvcGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3BvcGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3YjhkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9wbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BvcGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3BvcGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3YjhkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9wbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Bvc2l4ZmlsZS5weSBiL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjkxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Bvc2l4ZmlsZS5weQpAQCAtMCwwICsxLDIzNyBAQAorIiIiRXh0ZW5kZWQgZmlsZSBvcGVyYXRpb25zIGF2YWlsYWJsZSBpbiBQT1NJWC4KKworZiA9IHBvc2l4ZmlsZS5vcGVuKGZpbGVuYW1lLCBbbW9kZSwgW2J1ZnNpemVdXSkKKyAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IHBvc2l4ZmlsZSBvYmplY3QKKworZiA9IHBvc2l4ZmlsZS5maWxlb3BlbihmaWxlb2JqZWN0KQorICAgICAgd2lsbCBjcmVhdGUgYSBwb3NpeGZpbGUgb2JqZWN0IGZyb20gYSBidWlsdGluIGZpbGUgb2JqZWN0CisKK2YuZmlsZSgpCisgICAgICB3aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgYnVpbHRpbiBmaWxlIG9iamVjdAorCitmLmR1cCgpCisgICAgICB3aWxsIHJldHVybiBhIG5ldyBmaWxlIG9iamVjdCBiYXNlZCBvbiBhIG5ldyBmaWxlZGVzY3JpcHRvcgorCitmLmR1cDIoZmQpCisgICAgICB3aWxsIHJldHVybiBhIG5ldyBmaWxlIG9iamVjdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZmlsZWRlc2NyaXB0b3IKKworZi5mbGFncyhtb2RlKQorICAgICAgd2lsbCB0dXJuIG9uIHRoZSBhc3NvY2lhdGVkIGZsYWcgKG1lcmdlKQorICAgICAgbW9kZSBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcnM6CisKKyAgKGNoYXJhY3RlciByZXByZXNlbnRpbmcgYSBmbGFnKQorICAgICAgYSAgICAgICBhcHBlbmQgb25seSBmbGFnCisgICAgICBjICAgICAgIGNsb3NlIG9uIGV4ZWMgZmxhZworICAgICAgbiAgICAgICBubyBkZWxheSBmbGFnCisgICAgICBzICAgICAgIHN5bmNocm9uaXphdGlvbiBmbGFnCisgIChtb2RpZmllcnMpCisgICAgICAhICAgICAgIHR1cm4gZmxhZ3MgJ29mZicgaW5zdGVhZCBvZiBkZWZhdWx0ICdvbicKKyAgICAgID0gICAgICAgY29weSBmbGFncyAnYXMgaXMnIGluc3RlYWQgb2YgZGVmYXVsdCAnbWVyZ2UnCisgICAgICA/ICAgICAgIHJldHVybiBhIHN0cmluZyBpbiB3aGljaCB0aGUgY2hhcmFjdGVycyByZXByZXNlbnQgdGhlIGZsYWdzCisgICAgICAgICAgICAgIHRoYXQgYXJlIHNldAorCisgICAgICBub3RlOiAtIHRoZSAnIScgYW5kICc9JyBtb2RpZmllcnMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4KKyAgICAgICAgICAgIC0gdGhlICc/JyBtb2RpZmllciB3aWxsIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoZSBmbGFncyBhZnRlciB0aGV5CisgICAgICAgICAgICAgIGhhdmUgYmVlbiBjaGFuZ2VkIGJ5IG90aGVyIGNoYXJhY3RlcnMgaW4gdGhlIG1vZGUgc3RyaW5nCisKK2YubG9jayhtb2RlIFssIGxlbiBbLCBzdGFydCBbLCB3aGVuY2VdXV0pCisgICAgICB3aWxsICh1bilsb2NrIGEgcmVnaW9uCisgICAgICBtb2RlIGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKKworICAoY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0eXBlIG9mIGxvY2spCisgICAgICB1ICAgICAgIHVubG9jaworICAgICAgciAgICAgICByZWFkIGxvY2sKKyAgICAgIHcgICAgICAgd3JpdGUgbG9jaworICAobW9kaWZpZXJzKQorICAgICAgfCAgICAgICB3YWl0IHVudGlsIHRoZSBsb2NrIGNhbiBiZSBncmFudGVkCisgICAgICA/ICAgICAgIHJldHVybiB0aGUgZmlyc3QgbG9jayBjb25mbGljdGluZyB3aXRoIHRoZSByZXF1ZXN0ZWQgbG9jaworICAgICAgICAgICAgICBvciAnTm9uZScgaWYgdGhlcmUgaXMgbm8gY29uZmxpY3QuIFRoZSBsb2NrIHJldHVybmVkIGlzIGluIHRoZQorICAgICAgICAgICAgICBmb3JtYXQgKG1vZGUsIGxlbiwgc3RhcnQsIHdoZW5jZSwgcGlkKSB3aGVyZSBtb2RlIGlzIGEKKyAgICAgICAgICAgICAgY2hhcmFjdGVyIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBsb2NrICgncicgb3IgJ3cnKQorCisgICAgICBub3RlOiAtIHRoZSAnPycgbW9kaWZpZXIgcHJldmVudHMgYSByZWdpb24gZnJvbSBiZWluZyBsb2NrZWQ7IGl0IGlzCisgICAgICAgICAgICAgIHF1ZXJ5IG9ubHkKKyIiIgoraW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJuKCJUaGUgcG9zaXhmaWxlIG1vZHVsZSBpcyBkZXByZWNhdGVkOyAiCisgICAgICAgICAgICAgICAgImZjbnRsLmxvY2tmKCkgcHJvdmlkZXMgYmV0dGVyIGxvY2tpbmciLCBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2NsYXNzIF9wb3NpeGZpbGVfOgorICAgICIiIkZpbGUgd3JhcHBlciBjbGFzcyB0aGF0IHByb3ZpZGVzIGV4dHJhIFBPU0lYIGZpbGUgcm91dGluZXMuIiIiCisKKyAgICBzdGF0ZXMgPSBbJ29wZW4nLCAnY2xvc2VkJ10KKworICAgICMKKyAgICAjIEludGVybmFsIHJvdXRpbmVzCisgICAgIworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgZmlsZSA9IHNlbGYuX2ZpbGVfCisgICAgICAgIHJldHVybiAiPCVzIHBvc2l4ZmlsZSAnJXMnLCBtb2RlICclcycgYXQgJXM+IiAlIFwKKyAgICAgICAgICAgICAgICAoc2VsZi5zdGF0ZXNbZmlsZS5jbG9zZWRdLCBmaWxlLm5hbWUsIGZpbGUubW9kZSwgXAorICAgICAgICAgICAgICAgICBoZXgoaWQoc2VsZikpWzI6XSkKKworICAgICMKKyAgICAjIEluaXRpYWxpemF0aW9uIHJvdXRpbmVzCisgICAgIworICAgIGRlZiBvcGVuKHNlbGYsIG5hbWUsIG1vZGU9J3InLCBidWZzaXplPS0xKToKKyAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgIHJldHVybiBzZWxmLmZpbGVvcGVuKF9fYnVpbHRpbl9fLm9wZW4obmFtZSwgbW9kZSwgYnVmc2l6ZSkpCisKKyAgICBkZWYgZmlsZW9wZW4oc2VsZiwgZmlsZSk6CisgICAgICAgIGltcG9ydCB0eXBlcworICAgICAgICBpZiByZXByKHR5cGUoZmlsZSkpICE9ICI8dHlwZSAnZmlsZSc+IjoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ3Bvc2l4ZmlsZS5maWxlb3BlbigpIGFyZyBtdXN0IGJlIGZpbGUgb2JqZWN0JworICAgICAgICBzZWxmLl9maWxlXyAgPSBmaWxlCisgICAgICAgICMgQ29weSBiYXNpYyBmaWxlIG1ldGhvZHMKKyAgICAgICAgZm9yIG1heWJlbWV0aG9kIGluIGRpcihmaWxlKToKKyAgICAgICAgICAgIGlmIG5vdCBtYXliZW1ldGhvZC5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICAgICAgYXR0ciA9IGdldGF0dHIoZmlsZSwgbWF5YmVtZXRob2QpCisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhdHRyLCB0eXBlcy5CdWlsdGluTWV0aG9kVHlwZSk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbWF5YmVtZXRob2QsIGF0dHIpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAjCisgICAgIyBOZXcgbWV0aG9kcworICAgICMKKyAgICBkZWYgZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGVfCisKKyAgICBkZWYgZHVwKHNlbGYpOgorICAgICAgICBpbXBvcnQgcG9zaXgKKworICAgICAgICBpZiBub3QgaGFzYXR0cihwb3NpeCwgJ2Zkb3BlbicpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICdkdXAoKSBtZXRob2QgdW5hdmFpbGFibGUnCisKKyAgICAgICAgcmV0dXJuIHBvc2l4LmZkb3Blbihwb3NpeC5kdXAoc2VsZi5fZmlsZV8uZmlsZW5vKCkpLCBzZWxmLl9maWxlXy5tb2RlKQorCisgICAgZGVmIGR1cDIoc2VsZiwgZmQpOgorICAgICAgICBpbXBvcnQgcG9zaXgKKworICAgICAgICBpZiBub3QgaGFzYXR0cihwb3NpeCwgJ2Zkb3BlbicpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICdkdXAoKSBtZXRob2QgdW5hdmFpbGFibGUnCisKKyAgICAgICAgcG9zaXguZHVwMihzZWxmLl9maWxlXy5maWxlbm8oKSwgZmQpCisgICAgICAgIHJldHVybiBwb3NpeC5mZG9wZW4oZmQsIHNlbGYuX2ZpbGVfLm1vZGUpCisKKyAgICBkZWYgZmxhZ3Moc2VsZiwgKndoaWNoKToKKyAgICAgICAgaW1wb3J0IGZjbnRsLCBvcworCisgICAgICAgIGlmIHdoaWNoOgorICAgICAgICAgICAgaWYgbGVuKHdoaWNoKSA+IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAnVG9vIG1hbnkgYXJndW1lbnRzJworICAgICAgICAgICAgd2hpY2ggPSB3aGljaFswXQorICAgICAgICBlbHNlOiB3aGljaCA9ICc/JworCisgICAgICAgIGxfZmxhZ3MgPSAwCisgICAgICAgIGlmICduJyBpbiB3aGljaDogbF9mbGFncyA9IGxfZmxhZ3MgfCBvcy5PX05ERUxBWQorICAgICAgICBpZiAnYScgaW4gd2hpY2g6IGxfZmxhZ3MgPSBsX2ZsYWdzIHwgb3MuT19BUFBFTkQKKyAgICAgICAgaWYgJ3MnIGluIHdoaWNoOiBsX2ZsYWdzID0gbF9mbGFncyB8IG9zLk9fU1lOQworCisgICAgICAgIGZpbGUgPSBzZWxmLl9maWxlXworCisgICAgICAgIGlmICc9JyBub3QgaW4gd2hpY2g6CisgICAgICAgICAgICBjdXJfZmwgPSBmY250bC5mY250bChmaWxlLmZpbGVubygpLCBmY250bC5GX0dFVEZMLCAwKQorICAgICAgICAgICAgaWYgJyEnIGluIHdoaWNoOiBsX2ZsYWdzID0gY3VyX2ZsICYgfiBsX2ZsYWdzCisgICAgICAgICAgICBlbHNlOiBsX2ZsYWdzID0gY3VyX2ZsIHwgbF9mbGFncworCisgICAgICAgIGxfZmxhZ3MgPSBmY250bC5mY250bChmaWxlLmZpbGVubygpLCBmY250bC5GX1NFVEZMLCBsX2ZsYWdzKQorCisgICAgICAgIGlmICdjJyBpbiB3aGljaDoKKyAgICAgICAgICAgIGFyZyA9ICgnIScgbm90IGluIHdoaWNoKSAgICAjIDAgaXMgZG9uJ3QsIDEgaXMgZG8gY2xvc2Ugb24gZXhlYworICAgICAgICAgICAgbF9mbGFncyA9IGZjbnRsLmZjbnRsKGZpbGUuZmlsZW5vKCksIGZjbnRsLkZfU0VURkQsIGFyZykKKworICAgICAgICBpZiAnPycgaW4gd2hpY2g6CisgICAgICAgICAgICB3aGljaCA9ICcnICAgICAgICAgICAgICAgICAgIyBSZXR1cm4gY3VycmVudCBmbGFncworICAgICAgICAgICAgbF9mbGFncyA9IGZjbnRsLmZjbnRsKGZpbGUuZmlsZW5vKCksIGZjbnRsLkZfR0VURkwsIDApCisgICAgICAgICAgICBpZiBvcy5PX0FQUEVORCAmIGxfZmxhZ3M6IHdoaWNoID0gd2hpY2ggKyAnYScKKyAgICAgICAgICAgIGlmIGZjbnRsLmZjbnRsKGZpbGUuZmlsZW5vKCksIGZjbnRsLkZfR0VURkQsIDApICYgMToKKyAgICAgICAgICAgICAgICB3aGljaCA9IHdoaWNoICsgJ2MnCisgICAgICAgICAgICBpZiBvcy5PX05ERUxBWSAmIGxfZmxhZ3M6IHdoaWNoID0gd2hpY2ggKyAnbicKKyAgICAgICAgICAgIGlmIG9zLk9fU1lOQyAmIGxfZmxhZ3M6IHdoaWNoID0gd2hpY2ggKyAncycKKyAgICAgICAgICAgIHJldHVybiB3aGljaAorCisgICAgZGVmIGxvY2soc2VsZiwgaG93LCAqYXJncyk6CisgICAgICAgIGltcG9ydCBzdHJ1Y3QsIGZjbnRsCisKKyAgICAgICAgaWYgJ3cnIGluIGhvdzogbF90eXBlID0gZmNudGwuRl9XUkxDSworICAgICAgICBlbGlmICdyJyBpbiBob3c6IGxfdHlwZSA9IGZjbnRsLkZfUkRMQ0sKKyAgICAgICAgZWxpZiAndScgaW4gaG93OiBsX3R5cGUgPSBmY250bC5GX1VOTENLCisgICAgICAgIGVsc2U6IHJhaXNlIFR5cGVFcnJvciwgJ25vIHR5cGUgb2YgbG9jayBzcGVjaWZpZWQnCisKKyAgICAgICAgaWYgJ3wnIGluIGhvdzogY21kID0gZmNudGwuRl9TRVRMS1cKKyAgICAgICAgZWxpZiAnPycgaW4gaG93OiBjbWQgPSBmY250bC5GX0dFVExLCisgICAgICAgIGVsc2U6IGNtZCA9IGZjbnRsLkZfU0VUTEsKKworICAgICAgICBsX3doZW5jZSA9IDAKKyAgICAgICAgbF9zdGFydCA9IDAKKyAgICAgICAgbF9sZW4gPSAwCisKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgICAgICBsX2xlbiA9IGFyZ3NbMF0KKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIGxfbGVuLCBsX3N0YXJ0ID0gYXJncworICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAzOgorICAgICAgICAgICAgbF9sZW4sIGxfc3RhcnQsIGxfd2hlbmNlID0gYXJncworICAgICAgICBlbGlmIGxlbihhcmdzKSA+IDM6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICd0b28gbWFueSBhcmd1bWVudHMnCisKKyAgICAgICAgIyBIYWNrIGJ5IGRhdmVtQG1hZ25ldC5jb20gdG8gZ2V0IGxvY2tpbmcgdG8gZ28gb24gZnJlZWJzZDsKKyAgICAgICAgIyBhZGRpdGlvbnMgZm9yIEFJWCBieSBWbGFkaW1pci5NYXJhbmdvem92QGltYWcuZnIKKyAgICAgICAgaW1wb3J0IHN5cywgb3MKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnbmV0YnNkMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29wZW5ic2QyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDInLCAnZnJlZWJzZDMnLCAnZnJlZWJzZDQnLCAnZnJlZWJzZDUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVlYnNkNicsICdmcmVlYnNkNycsICdmcmVlYnNkOCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JzZG9zMicsICdic2RvczMnLCAnYnNkb3M0Jyk6CisgICAgICAgICAgICBmbG9jayA9IHN0cnVjdC5wYWNrKCdseHh4eGx4eHh4bGhoJywgXAorICAgICAgICAgICAgICAgICAgbF9zdGFydCwgbF9sZW4sIG9zLmdldHBpZCgpLCBsX3R5cGUsIGxfd2hlbmNlKQorICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ2FpeDMnLCAnYWl4NCcpOgorICAgICAgICAgICAgZmxvY2sgPSBzdHJ1Y3QucGFjaygnaGhsbGxpaScsIFwKKyAgICAgICAgICAgICAgICAgIGxfdHlwZSwgbF93aGVuY2UsIGxfc3RhcnQsIGxfbGVuLCAwLCAwLCAwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmxvY2sgPSBzdHJ1Y3QucGFjaygnaGhsbGhoJywgXAorICAgICAgICAgICAgICAgICAgbF90eXBlLCBsX3doZW5jZSwgbF9zdGFydCwgbF9sZW4sIDAsIDApCisKKyAgICAgICAgZmxvY2sgPSBmY250bC5mY250bChzZWxmLl9maWxlXy5maWxlbm8oKSwgY21kLCBmbG9jaykKKworICAgICAgICBpZiAnPycgaW4gaG93OgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnbmV0YnNkMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuYnNkMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVlYnNkMicsICdmcmVlYnNkMycsICdmcmVlYnNkNCcsICdmcmVlYnNkNScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdic2RvczInLCAnYnNkb3MzJywgJ2JzZG9zNCcpOgorICAgICAgICAgICAgICAgIGxfc3RhcnQsIGxfbGVuLCBsX3BpZCwgbF90eXBlLCBsX3doZW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0LnVucGFjaygnbHh4eHhseHh4eGxoaCcsIGZsb2NrKQorICAgICAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0gaW4gKCdhaXgzJywgJ2FpeDQnKToKKyAgICAgICAgICAgICAgICBsX3R5cGUsIGxfd2hlbmNlLCBsX3N0YXJ0LCBsX2xlbiwgbF9zeXNpZCwgbF9waWQsIGxfdmZzID0gXAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QudW5wYWNrKCdoaGxsbGlpJywgZmxvY2spCisgICAgICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAibGludXgyIjoKKyAgICAgICAgICAgICAgICBsX3R5cGUsIGxfd2hlbmNlLCBsX3N0YXJ0LCBsX2xlbiwgbF9waWQsIGxfc3lzaWQgPSBcCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdC51bnBhY2soJ2hobGxoaCcsIGZsb2NrKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsX3R5cGUsIGxfd2hlbmNlLCBsX3N0YXJ0LCBsX2xlbiwgbF9zeXNpZCwgbF9waWQgPSBcCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdC51bnBhY2soJ2hobGxoaCcsIGZsb2NrKQorCisgICAgICAgICAgICBpZiBsX3R5cGUgIT0gZmNudGwuRl9VTkxDSzoKKyAgICAgICAgICAgICAgICBpZiBsX3R5cGUgPT0gZmNudGwuRl9SRExDSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdyJywgbF9sZW4sIGxfc3RhcnQsIGxfd2hlbmNlLCBsX3BpZAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAndycsIGxfbGVuLCBsX3N0YXJ0LCBsX3doZW5jZSwgbF9waWQKKworZGVmIG9wZW4obmFtZSwgbW9kZT0ncicsIGJ1ZnNpemU9LTEpOgorICAgICIiIlB1YmxpYyByb3V0aW5lIHRvIG9wZW4gYSBmaWxlIGFzIGEgcG9zaXhmaWxlIG9iamVjdC4iIiIKKyAgICByZXR1cm4gX3Bvc2l4ZmlsZV8oKS5vcGVuKG5hbWUsIG1vZGUsIGJ1ZnNpemUpCisKK2RlZiBmaWxlb3BlbihmaWxlKToKKyAgICAiIiJQdWJsaWMgcm91dGluZSB0byBnZXQgYSBwb3NpeGZpbGUgb2JqZWN0IGZyb20gYSBQeXRob24gZmlsZSBvYmplY3QuIiIiCisgICAgcmV0dXJuIF9wb3NpeGZpbGVfKCkuZmlsZW9wZW4oZmlsZSkKKworIworIyBDb25zdGFudHMKKyMKK1NFRUtfU0VUID0gMAorU0VFS19DVVIgPSAxCitTRUVLX0VORCA9IDIKKworIworIyBFbmQgb2YgcG9zaXhmaWxlLnB5CisjCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Bvc2l4ZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Bvc2l4ZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyMDA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Bvc2l4ZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Bvc2l4ZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMyMDA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcG9zaXhmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weSBiL2xpYi9weXRob24yLjcvcG9zaXhwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NWRjNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weQpAQCAtMCwwICsxLDQzMSBAQAorIiIiQ29tbW9uIG9wZXJhdGlvbnMgb24gUG9zaXggcGF0aG5hbWVzLgorCitJbnN0ZWFkIG9mIGltcG9ydGluZyB0aGlzIG1vZHVsZSBkaXJlY3RseSwgaW1wb3J0IG9zIGFuZCByZWZlciB0bwordGhpcyBtb2R1bGUgYXMgb3MucGF0aC4gIFRoZSAib3MucGF0aCIgbmFtZSBpcyBhbiBhbGlhcyBmb3IgdGhpcworbW9kdWxlIG9uIFBvc2l4IHN5c3RlbXM7IG9uIG90aGVyIHN5c3RlbXMgKGUuZy4gTWFjLCBXaW5kb3dzKSwKK29zLnBhdGggcHJvdmlkZXMgdGhlIHNhbWUgb3BlcmF0aW9ucyBpbiBhIG1hbm5lciBzcGVjaWZpYyB0byB0aGF0CitwbGF0Zm9ybSwgYW5kIGlzIGFuIGFsaWFzIHRvIGFub3RoZXIgbW9kdWxlIChlLmcuIG1hY3BhdGgsIG50cGF0aCkuCisKK1NvbWUgb2YgdGhpcyBjYW4gYWN0dWFsbHkgYmUgdXNlZnVsIG9uIG5vbi1Qb3NpeCBzeXN0ZW1zIHRvbywgZS5nLgorZm9yIG1hbmlwdWxhdGlvbiBvZiB0aGUgcGF0aG5hbWUgY29tcG9uZW50IG9mIFVSTHMuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RhdAoraW1wb3J0IGdlbmVyaWNwYXRoCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gZ2VuZXJpY3BhdGggaW1wb3J0ICoKKwordHJ5OgorICAgIF91bmljb2RlID0gdW5pY29kZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAjIElmIFB5dGhvbiBpcyBidWlsdCB3aXRob3V0IFVuaWNvZGUgc3VwcG9ydCwgdGhlIHVuaWNvZGUgdHlwZQorICAgICMgd2lsbCBub3QgZXhpc3QuIEZha2Ugb25lLgorICAgIGNsYXNzIF91bmljb2RlKG9iamVjdCk6CisgICAgICAgIHBhc3MKKworX19hbGxfXyA9IFsibm9ybWNhc2UiLCJpc2FicyIsImpvaW4iLCJzcGxpdGRyaXZlIiwic3BsaXQiLCJzcGxpdGV4dCIsCisgICAgICAgICAgICJiYXNlbmFtZSIsImRpcm5hbWUiLCJjb21tb25wcmVmaXgiLCJnZXRzaXplIiwiZ2V0bXRpbWUiLAorICAgICAgICAgICAiZ2V0YXRpbWUiLCJnZXRjdGltZSIsImlzbGluayIsImV4aXN0cyIsImxleGlzdHMiLCJpc2RpciIsImlzZmlsZSIsCisgICAgICAgICAgICJpc21vdW50Iiwid2FsayIsImV4cGFuZHVzZXIiLCJleHBhbmR2YXJzIiwibm9ybXBhdGgiLCJhYnNwYXRoIiwKKyAgICAgICAgICAgInNhbWVmaWxlIiwic2FtZW9wZW5maWxlIiwic2FtZXN0YXQiLAorICAgICAgICAgICAiY3VyZGlyIiwicGFyZGlyIiwic2VwIiwicGF0aHNlcCIsImRlZnBhdGgiLCJhbHRzZXAiLCJleHRzZXAiLAorICAgICAgICAgICAiZGV2bnVsbCIsInJlYWxwYXRoIiwic3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMiLCJyZWxwYXRoIl0KKworIyBzdHJpbmdzIHJlcHJlc2VudGluZyB2YXJpb3VzIHBhdGgtcmVsYXRlZCBiaXRzIGFuZCBwaWVjZXMKK2N1cmRpciA9ICcuJworcGFyZGlyID0gJy4uJworZXh0c2VwID0gJy4nCitzZXAgPSAnLycKK3BhdGhzZXAgPSAnOicKK2RlZnBhdGggPSAnOi9iaW46L3Vzci9iaW4nCithbHRzZXAgPSBOb25lCitkZXZudWxsID0gJy9kZXYvbnVsbCcKKworIyBOb3JtYWxpemUgdGhlIGNhc2Ugb2YgYSBwYXRobmFtZS4gIFRyaXZpYWwgaW4gUG9zaXgsIHN0cmluZy5sb3dlciBvbiBNYWMuCisjIE9uIE1TLURPUyB0aGlzIG1heSBhbHNvIHR1cm4gc2xhc2hlcyBpbnRvIGJhY2tzbGFzaGVzOyBob3dldmVyLCBvdGhlcgorIyBub3JtYWxpemF0aW9ucyAoc3VjaCBhcyBvcHRpbWl6aW5nICcuLi8nIGF3YXkpIGFyZSBub3QgYWxsb3dlZAorIyAoYW5vdGhlciBmdW5jdGlvbiBzaG91bGQgYmUgZGVmaW5lZCB0byBkbyB0aGF0KS4KKworZGVmIG5vcm1jYXNlKHMpOgorICAgICIiIk5vcm1hbGl6ZSBjYXNlIG9mIHBhdGhuYW1lLiAgSGFzIG5vIGVmZmVjdCB1bmRlciBQb3NpeCIiIgorICAgIHJldHVybiBzCisKKworIyBSZXR1cm4gd2hldGhlciBhIHBhdGggaXMgYWJzb2x1dGUuCisjIFRyaXZpYWwgaW4gUG9zaXgsIGhhcmRlciBvbiB0aGUgTWFjIG9yIE1TLURPUy4KKworZGVmIGlzYWJzKHMpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYWJzb2x1dGUiIiIKKyAgICByZXR1cm4gcy5zdGFydHN3aXRoKCcvJykKKworCisjIEpvaW4gcGF0aG5hbWVzLgorIyBJZ25vcmUgdGhlIHByZXZpb3VzIHBhcnRzIGlmIGEgcGFydCBpcyBhYnNvbHV0ZS4KKyMgSW5zZXJ0IGEgJy8nIHVubGVzcyB0aGUgZmlyc3QgcGFydCBpcyBlbXB0eSBvciBhbHJlYWR5IGVuZHMgaW4gJy8nLgorCitkZWYgam9pbihhLCAqcCk6CisgICAgIiIiSm9pbiB0d28gb3IgbW9yZSBwYXRobmFtZSBjb21wb25lbnRzLCBpbnNlcnRpbmcgJy8nIGFzIG5lZWRlZC4KKyAgICBJZiBhbnkgY29tcG9uZW50IGlzIGFuIGFic29sdXRlIHBhdGgsIGFsbCBwcmV2aW91cyBwYXRoIGNvbXBvbmVudHMKKyAgICB3aWxsIGJlIGRpc2NhcmRlZC4gIEFuIGVtcHR5IGxhc3QgcGFydCB3aWxsIHJlc3VsdCBpbiBhIHBhdGggdGhhdAorICAgIGVuZHMgd2l0aCBhIHNlcGFyYXRvci4iIiIKKyAgICBwYXRoID0gYQorICAgIGZvciBiIGluIHA6CisgICAgICAgIGlmIGIuc3RhcnRzd2l0aCgnLycpOgorICAgICAgICAgICAgcGF0aCA9IGIKKyAgICAgICAgZWxpZiBwYXRoID09ICcnIG9yIHBhdGguZW5kc3dpdGgoJy8nKToKKyAgICAgICAgICAgIHBhdGggKz0gIGIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggKz0gJy8nICsgYgorICAgIHJldHVybiBwYXRoCisKKworIyBTcGxpdCBhIHBhdGggaW4gaGVhZCAoZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCAnLycpIGFuZCB0YWlsICh0aGUKKyMgcmVzdCkuICBJZiB0aGUgcGF0aCBlbmRzIGluICcvJywgdGFpbCB3aWxsIGJlIGVtcHR5LiAgSWYgdGhlcmUgaXMgbm8KKyMgJy8nIGluIHRoZSBwYXRoLCBoZWFkICB3aWxsIGJlIGVtcHR5LgorIyBUcmFpbGluZyAnLydlcyBhcmUgc3RyaXBwZWQgZnJvbSBoZWFkIHVubGVzcyBpdCBpcyB0aGUgcm9vdC4KKworZGVmIHNwbGl0KHApOgorICAgICIiIlNwbGl0IGEgcGF0aG5hbWUuICBSZXR1cm5zIHR1cGxlICIoaGVhZCwgdGFpbCkiIHdoZXJlICJ0YWlsIiBpcworICAgIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpbmFsIHNsYXNoLiAgRWl0aGVyIHBhcnQgbWF5IGJlIGVtcHR5LiIiIgorICAgIGkgPSBwLnJmaW5kKCcvJykgKyAxCisgICAgaGVhZCwgdGFpbCA9IHBbOmldLCBwW2k6XQorICAgIGlmIGhlYWQgYW5kIGhlYWQgIT0gJy8nKmxlbihoZWFkKToKKyAgICAgICAgaGVhZCA9IGhlYWQucnN0cmlwKCcvJykKKyAgICByZXR1cm4gaGVhZCwgdGFpbAorCisKKyMgU3BsaXQgYSBwYXRoIGluIHJvb3QgYW5kIGV4dGVuc2lvbi4KKyMgVGhlIGV4dGVuc2lvbiBpcyBldmVyeXRoaW5nIHN0YXJ0aW5nIGF0IHRoZSBsYXN0IGRvdCBpbiB0aGUgbGFzdAorIyBwYXRobmFtZSBjb21wb25lbnQ7IHRoZSByb290IGlzIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoYXQuCisjIEl0IGlzIGFsd2F5cyB0cnVlIHRoYXQgcm9vdCArIGV4dCA9PSBwLgorCitkZWYgc3BsaXRleHQocCk6CisgICAgcmV0dXJuIGdlbmVyaWNwYXRoLl9zcGxpdGV4dChwLCBzZXAsIGFsdHNlcCwgZXh0c2VwKQorc3BsaXRleHQuX19kb2NfXyA9IGdlbmVyaWNwYXRoLl9zcGxpdGV4dC5fX2RvY19fCisKKyMgU3BsaXQgYSBwYXRobmFtZSBpbnRvIGEgZHJpdmUgc3BlY2lmaWNhdGlvbiBhbmQgdGhlIHJlc3Qgb2YgdGhlCisjIHBhdGguICBVc2VmdWwgb24gRE9TL1dpbmRvd3MvTlQ7IG9uIFVuaXgsIHRoZSBkcml2ZSBpcyBhbHdheXMgZW1wdHkuCisKK2RlZiBzcGxpdGRyaXZlKHApOgorICAgICIiIlNwbGl0IGEgcGF0aG5hbWUgaW50byBkcml2ZSBhbmQgcGF0aC4gT24gUG9zaXgsIGRyaXZlIGlzIGFsd2F5cworICAgIGVtcHR5LiIiIgorICAgIHJldHVybiAnJywgcAorCisKKyMgUmV0dXJuIHRoZSB0YWlsIChiYXNlbmFtZSkgcGFydCBvZiBhIHBhdGgsIHNhbWUgYXMgc3BsaXQocGF0aClbMV0uCisKK2RlZiBiYXNlbmFtZShwKToKKyAgICAiIiJSZXR1cm5zIHRoZSBmaW5hbCBjb21wb25lbnQgb2YgYSBwYXRobmFtZSIiIgorICAgIGkgPSBwLnJmaW5kKCcvJykgKyAxCisgICAgcmV0dXJuIHBbaTpdCisKKworIyBSZXR1cm4gdGhlIGhlYWQgKGRpcm5hbWUpIHBhcnQgb2YgYSBwYXRoLCBzYW1lIGFzIHNwbGl0KHBhdGgpWzBdLgorCitkZWYgZGlybmFtZShwKToKKyAgICAiIiJSZXR1cm5zIHRoZSBkaXJlY3RvcnkgY29tcG9uZW50IG9mIGEgcGF0aG5hbWUiIiIKKyAgICBpID0gcC5yZmluZCgnLycpICsgMQorICAgIGhlYWQgPSBwWzppXQorICAgIGlmIGhlYWQgYW5kIGhlYWQgIT0gJy8nKmxlbihoZWFkKToKKyAgICAgICAgaGVhZCA9IGhlYWQucnN0cmlwKCcvJykKKyAgICByZXR1cm4gaGVhZAorCisKKyMgSXMgYSBwYXRoIGEgc3ltYm9saWMgbGluaz8KKyMgVGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2Ugb24gc3lzdGVtcyB3aGVyZSBvcy5sc3RhdCBkb2Vzbid0IGV4aXN0LgorCitkZWYgaXNsaW5rKHBhdGgpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggaXMgYSBzeW1ib2xpYyBsaW5rIiIiCisgICAgdHJ5OgorICAgICAgICBzdCA9IG9zLmxzdGF0KHBhdGgpCisgICAgZXhjZXB0IChvcy5lcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gc3RhdC5TX0lTTE5LKHN0LnN0X21vZGUpCisKKyMgQmVpbmcgdHJ1ZSBmb3IgZGFuZ2xpbmcgc3ltYm9saWMgbGlua3MgaXMgYWxzbyB1c2VmdWwuCisKK2RlZiBsZXhpc3RzKHBhdGgpOgorICAgICIiIlRlc3Qgd2hldGhlciBhIHBhdGggZXhpc3RzLiAgUmV0dXJucyBUcnVlIGZvciBicm9rZW4gc3ltYm9saWMgbGlua3MiIiIKKyAgICB0cnk6CisgICAgICAgIG9zLmxzdGF0KHBhdGgpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCisKKyMgQXJlIHR3byBmaWxlbmFtZXMgcmVhbGx5IHBvaW50aW5nIHRvIHRoZSBzYW1lIGZpbGU/CisKK2RlZiBzYW1lZmlsZShmMSwgZjIpOgorICAgICIiIlRlc3Qgd2hldGhlciB0d28gcGF0aG5hbWVzIHJlZmVyZW5jZSB0aGUgc2FtZSBhY3R1YWwgZmlsZSIiIgorICAgIHMxID0gb3Muc3RhdChmMSkKKyAgICBzMiA9IG9zLnN0YXQoZjIpCisgICAgcmV0dXJuIHNhbWVzdGF0KHMxLCBzMikKKworCisjIEFyZSB0d28gb3BlbiBmaWxlcyByZWFsbHkgcmVmZXJlbmNpbmcgdGhlIHNhbWUgZmlsZT8KKyMgKE5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBmaWxlIGRlc2NyaXB0b3IhKQorCitkZWYgc2FtZW9wZW5maWxlKGZwMSwgZnAyKToKKyAgICAiIiJUZXN0IHdoZXRoZXIgdHdvIG9wZW4gZmlsZSBvYmplY3RzIHJlZmVyZW5jZSB0aGUgc2FtZSBmaWxlIiIiCisgICAgczEgPSBvcy5mc3RhdChmcDEpCisgICAgczIgPSBvcy5mc3RhdChmcDIpCisgICAgcmV0dXJuIHNhbWVzdGF0KHMxLCBzMikKKworCisjIEFyZSB0d28gc3RhdCBidWZmZXJzIChvYnRhaW5lZCBmcm9tIHN0YXQsIGZzdGF0IG9yIGxzdGF0KQorIyBkZXNjcmliaW5nIHRoZSBzYW1lIGZpbGU/CisKK2RlZiBzYW1lc3RhdChzMSwgczIpOgorICAgICIiIlRlc3Qgd2hldGhlciB0d28gc3RhdCBidWZmZXJzIHJlZmVyZW5jZSB0aGUgc2FtZSBmaWxlIiIiCisgICAgcmV0dXJuIHMxLnN0X2lubyA9PSBzMi5zdF9pbm8gYW5kIFwKKyAgICAgICAgICAgczEuc3RfZGV2ID09IHMyLnN0X2RldgorCisKKyMgSXMgYSBwYXRoIGEgbW91bnQgcG9pbnQ/CisjIChEb2VzIHRoaXMgd29yayBmb3IgYWxsIFVOSVhlcz8gIElzIGl0IGV2ZW4gZ3VhcmFudGVlZCB0byB3b3JrIGJ5IFBvc2l4PykKKworZGVmIGlzbW91bnQocGF0aCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcGF0aCBpcyBhIG1vdW50IHBvaW50IiIiCisgICAgaWYgaXNsaW5rKHBhdGgpOgorICAgICAgICAjIEEgc3ltbGluayBjYW4gbmV2ZXIgYmUgYSBtb3VudCBwb2ludAorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIHMxID0gb3MubHN0YXQocGF0aCkKKyAgICAgICAgczIgPSBvcy5sc3RhdChqb2luKHBhdGgsICcuLicpKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlICMgSXQgZG9lc24ndCBleGlzdCAtLSBzbyBub3QgYSBtb3VudCBwb2ludCA6LSkKKyAgICBkZXYxID0gczEuc3RfZGV2CisgICAgZGV2MiA9IHMyLnN0X2RldgorICAgIGlmIGRldjEgIT0gZGV2MjoKKyAgICAgICAgcmV0dXJuIFRydWUgICAgICMgcGF0aC8uLiBvbiBhIGRpZmZlcmVudCBkZXZpY2UgYXMgcGF0aAorICAgIGlubzEgPSBzMS5zdF9pbm8KKyAgICBpbm8yID0gczIuc3RfaW5vCisgICAgaWYgaW5vMSA9PSBpbm8yOgorICAgICAgICByZXR1cm4gVHJ1ZSAgICAgIyBwYXRoLy4uIGlzIHRoZSBzYW1lIGktbm9kZSBhcyBwYXRoCisgICAgcmV0dXJuIEZhbHNlCisKKworIyBEaXJlY3RvcnkgdHJlZSB3YWxrLgorIyBGb3IgZWFjaCBkaXJlY3RvcnkgdW5kZXIgdG9wIChpbmNsdWRpbmcgdG9wIGl0c2VsZiwgYnV0IGV4Y2x1ZGluZworIyAnLicgYW5kICcuLicpLCBmdW5jKGFyZywgZGlybmFtZSwgZmlsZW5hbWVzKSBpcyBjYWxsZWQsIHdoZXJlCisjIGRpcm5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBhbmQgZmlsZW5hbWVzIGlzIHRoZSBsaXN0CisjIG9mIGZpbGVzIChhbmQgc3ViZGlyZWN0b3JpZXMgZXRjLikgaW4gdGhlIGRpcmVjdG9yeS4KKyMgVGhlIGZ1bmMgbWF5IG1vZGlmeSB0aGUgZmlsZW5hbWVzIGxpc3QsIHRvIGltcGxlbWVudCBhIGZpbHRlciwKKyMgb3IgdG8gaW1wb3NlIGEgZGlmZmVyZW50IG9yZGVyIG9mIHZpc2l0aW5nLgorCitkZWYgd2Fsayh0b3AsIGZ1bmMsIGFyZyk6CisgICAgIiIiRGlyZWN0b3J5IHRyZWUgd2FsayB3aXRoIGNhbGxiYWNrIGZ1bmN0aW9uLgorCisgICAgRm9yIGVhY2ggZGlyZWN0b3J5IGluIHRoZSBkaXJlY3RvcnkgdHJlZSByb290ZWQgYXQgdG9wIChpbmNsdWRpbmcgdG9wCisgICAgaXRzZWxmLCBidXQgZXhjbHVkaW5nICcuJyBhbmQgJy4uJyksIGNhbGwgZnVuYyhhcmcsIGRpcm5hbWUsIGZuYW1lcykuCisgICAgZGlybmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5LCBhbmQgZm5hbWVzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YKKyAgICB0aGUgZmlsZXMgYW5kIHN1YmRpcmVjdG9yaWVzIGluIGRpcm5hbWUgKGV4Y2x1ZGluZyAnLicgYW5kICcuLicpLiAgZnVuYworICAgIG1heSBtb2RpZnkgdGhlIGZuYW1lcyBsaXN0IGluLXBsYWNlIChlLmcuIHZpYSBkZWwgb3Igc2xpY2UgYXNzaWdubWVudCksCisgICAgYW5kIHdhbGsgd2lsbCBvbmx5IHJlY3Vyc2UgaW50byB0aGUgc3ViZGlyZWN0b3JpZXMgd2hvc2UgbmFtZXMgcmVtYWluIGluCisgICAgZm5hbWVzOyB0aGlzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhIGZpbHRlciwgb3IgdG8gaW1wb3NlIGEgc3BlY2lmaWMKKyAgICBvcmRlciBvZiB2aXNpdGluZy4gIE5vIHNlbWFudGljcyBhcmUgZGVmaW5lZCBmb3IsIG9yIHJlcXVpcmVkIG9mLCBhcmcsCisgICAgYmV5b25kIHRoYXQgYXJnIGlzIGFsd2F5cyBwYXNzZWQgdG8gZnVuYy4gIEl0IGNhbiBiZSB1c2VkLCBlLmcuLCB0byBwYXNzCisgICAgYSBmaWxlbmFtZSBwYXR0ZXJuLCBvciBhIG11dGFibGUgb2JqZWN0IGRlc2lnbmVkIHRvIGFjY3VtdWxhdGUKKyAgICBzdGF0aXN0aWNzLiAgUGFzc2luZyBOb25lIGZvciBhcmcgaXMgY29tbW9uLiIiIgorICAgIHdhcm5pbmdzLndhcm5weTNrKCJJbiAzLngsIG9zLnBhdGgud2FsayBpcyByZW1vdmVkIGluIGZhdm9yIG9mIG9zLndhbGsuIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGFja2xldmVsPTIpCisgICAgdHJ5OgorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIodG9wKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgcmV0dXJuCisgICAgZnVuYyhhcmcsIHRvcCwgbmFtZXMpCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIG5hbWUgPSBqb2luKHRvcCwgbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3QgPSBvcy5sc3RhdChuYW1lKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBzdGF0LlNfSVNESVIoc3Quc3RfbW9kZSk6CisgICAgICAgICAgICB3YWxrKG5hbWUsIGZ1bmMsIGFyZykKKworCisjIEV4cGFuZCBwYXRocyBiZWdpbm5pbmcgd2l0aCAnficgb3IgJ351c2VyJy4KKyMgJ34nIG1lYW5zICRIT01FOyAnfnVzZXInIG1lYW5zIHRoYXQgdXNlcidzIGhvbWUgZGlyZWN0b3J5LgorIyBJZiB0aGUgcGF0aCBkb2Vzbid0IGJlZ2luIHdpdGggJ34nLCBvciBpZiB0aGUgdXNlciBvciAkSE9NRSBpcyB1bmtub3duLAorIyB0aGUgcGF0aCBpcyByZXR1cm5lZCB1bmNoYW5nZWQgKGxlYXZpbmcgZXJyb3IgcmVwb3J0aW5nIHRvIHdoYXRldmVyCisjIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBleHBhbmRlZCBwYXRoIGFzIGFyZ3VtZW50KS4KKyMgU2VlIGFsc28gbW9kdWxlICdnbG9iJyBmb3IgZXhwYW5zaW9uIG9mICosID8gYW5kIFsuLi5dIGluIHBhdGhuYW1lcy4KKyMgKEEgZnVuY3Rpb24gc2hvdWxkIGFsc28gYmUgZGVmaW5lZCB0byBkbyBmdWxsICpzaC1zdHlsZSBlbnZpcm9ubWVudAorIyB2YXJpYWJsZSBleHBhbnNpb24uKQorCitkZWYgZXhwYW5kdXNlcihwYXRoKToKKyAgICAiIiJFeHBhbmQgfiBhbmQgfnVzZXIgY29uc3RydWN0aW9ucy4gIElmIHVzZXIgb3IgJEhPTUUgaXMgdW5rbm93biwKKyAgICBkbyBub3RoaW5nLiIiIgorICAgIGlmIG5vdCBwYXRoLnN0YXJ0c3dpdGgoJ34nKToKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBpID0gcGF0aC5maW5kKCcvJywgMSkKKyAgICBpZiBpIDwgMDoKKyAgICAgICAgaSA9IGxlbihwYXRoKQorICAgIGlmIGkgPT0gMToKKyAgICAgICAgaWYgJ0hPTUUnIG5vdCBpbiBvcy5lbnZpcm9uOgorICAgICAgICAgICAgaW1wb3J0IHB3ZAorICAgICAgICAgICAgdXNlcmhvbWUgPSBwd2QuZ2V0cHd1aWQob3MuZ2V0dWlkKCkpLnB3X2RpcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXNlcmhvbWUgPSBvcy5lbnZpcm9uWydIT01FJ10KKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgcHdkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHB3ZW50ID0gcHdkLmdldHB3bmFtKHBhdGhbMTppXSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIHBhdGgKKyAgICAgICAgdXNlcmhvbWUgPSBwd2VudC5wd19kaXIKKyAgICB1c2VyaG9tZSA9IHVzZXJob21lLnJzdHJpcCgnLycpCisgICAgcmV0dXJuICh1c2VyaG9tZSArIHBhdGhbaTpdKSBvciAnLycKKworCisjIEV4cGFuZCBwYXRocyBjb250YWluaW5nIHNoZWxsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMuCisjIFRoaXMgZXhwYW5kcyB0aGUgZm9ybXMgJHZhcmlhYmxlIGFuZCAke3ZhcmlhYmxlfSBvbmx5LgorIyBOb24tZXhpc3RlbnQgdmFyaWFibGVzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KKworX3ZhcnByb2cgPSBOb25lCisKK2RlZiBleHBhbmR2YXJzKHBhdGgpOgorICAgICIiIkV4cGFuZCBzaGVsbCB2YXJpYWJsZXMgb2YgZm9ybSAkdmFyIGFuZCAke3Zhcn0uICBVbmtub3duIHZhcmlhYmxlcworICAgIGFyZSBsZWZ0IHVuY2hhbmdlZC4iIiIKKyAgICBnbG9iYWwgX3ZhcnByb2cKKyAgICBpZiAnJCcgbm90IGluIHBhdGg6CisgICAgICAgIHJldHVybiBwYXRoCisgICAgaWYgbm90IF92YXJwcm9nOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgX3ZhcnByb2cgPSByZS5jb21waWxlKHInXCQoXHcrfFx7W159XSpcfSknKQorICAgIGkgPSAwCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgbSA9IF92YXJwcm9nLnNlYXJjaChwYXRoLCBpKQorICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGksIGogPSBtLnNwYW4oMCkKKyAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCd7JykgYW5kIG5hbWUuZW5kc3dpdGgoJ30nKToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lWzE6LTFdCisgICAgICAgIGlmIG5hbWUgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgIHRhaWwgPSBwYXRoW2o6XQorICAgICAgICAgICAgcGF0aCA9IHBhdGhbOmldICsgb3MuZW52aXJvbltuYW1lXQorICAgICAgICAgICAgaSA9IGxlbihwYXRoKQorICAgICAgICAgICAgcGF0aCArPSB0YWlsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpID0gagorICAgIHJldHVybiBwYXRoCisKKworIyBOb3JtYWxpemUgYSBwYXRoLCBlLmcuIEEvL0IsIEEvLi9CIGFuZCBBL2Zvby8uLi9CIGFsbCBiZWNvbWUgQS9CLgorIyBJdCBzaG91bGQgYmUgdW5kZXJzdG9vZCB0aGF0IHRoaXMgbWF5IGNoYW5nZSB0aGUgbWVhbmluZyBvZiB0aGUgcGF0aAorIyBpZiBpdCBjb250YWlucyBzeW1ib2xpYyBsaW5rcyEKKworZGVmIG5vcm1wYXRoKHBhdGgpOgorICAgICIiIk5vcm1hbGl6ZSBwYXRoLCBlbGltaW5hdGluZyBkb3VibGUgc2xhc2hlcywgZXRjLiIiIgorICAgICMgUHJlc2VydmUgdW5pY29kZSAoaWYgcGF0aCBpcyB1bmljb2RlKQorICAgIHNsYXNoLCBkb3QgPSAodScvJywgdScuJykgaWYgaXNpbnN0YW5jZShwYXRoLCBfdW5pY29kZSkgZWxzZSAoJy8nLCAnLicpCisgICAgaWYgcGF0aCA9PSAnJzoKKyAgICAgICAgcmV0dXJuIGRvdAorICAgIGluaXRpYWxfc2xhc2hlcyA9IHBhdGguc3RhcnRzd2l0aCgnLycpCisgICAgIyBQT1NJWCBhbGxvd3Mgb25lIG9yIHR3byBpbml0aWFsIHNsYXNoZXMsIGJ1dCB0cmVhdHMgdGhyZWUgb3IgbW9yZQorICAgICMgYXMgc2luZ2xlIHNsYXNoLgorICAgIGlmIChpbml0aWFsX3NsYXNoZXMgYW5kCisgICAgICAgIHBhdGguc3RhcnRzd2l0aCgnLy8nKSBhbmQgbm90IHBhdGguc3RhcnRzd2l0aCgnLy8vJykpOgorICAgICAgICBpbml0aWFsX3NsYXNoZXMgPSAyCisgICAgY29tcHMgPSBwYXRoLnNwbGl0KCcvJykKKyAgICBuZXdfY29tcHMgPSBbXQorICAgIGZvciBjb21wIGluIGNvbXBzOgorICAgICAgICBpZiBjb21wIGluICgnJywgJy4nKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIChjb21wICE9ICcuLicgb3IgKG5vdCBpbml0aWFsX3NsYXNoZXMgYW5kIG5vdCBuZXdfY29tcHMpIG9yCisgICAgICAgICAgICAgKG5ld19jb21wcyBhbmQgbmV3X2NvbXBzWy0xXSA9PSAnLi4nKSk6CisgICAgICAgICAgICBuZXdfY29tcHMuYXBwZW5kKGNvbXApCisgICAgICAgIGVsaWYgbmV3X2NvbXBzOgorICAgICAgICAgICAgbmV3X2NvbXBzLnBvcCgpCisgICAgY29tcHMgPSBuZXdfY29tcHMKKyAgICBwYXRoID0gc2xhc2guam9pbihjb21wcykKKyAgICBpZiBpbml0aWFsX3NsYXNoZXM6CisgICAgICAgIHBhdGggPSBzbGFzaCppbml0aWFsX3NsYXNoZXMgKyBwYXRoCisgICAgcmV0dXJuIHBhdGggb3IgZG90CisKKworZGVmIGFic3BhdGgocGF0aCk6CisgICAgIiIiUmV0dXJuIGFuIGFic29sdXRlIHBhdGguIiIiCisgICAgaWYgbm90IGlzYWJzKHBhdGgpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIF91bmljb2RlKToKKyAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZHUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgcGF0aCA9IGpvaW4oY3dkLCBwYXRoKQorICAgIHJldHVybiBub3JtcGF0aChwYXRoKQorCisKKyMgUmV0dXJuIGEgY2Fub25pY2FsIHBhdGggKGkuZS4gdGhlIGFic29sdXRlIGxvY2F0aW9uIG9mIGEgZmlsZSBvbiB0aGUKKyMgZmlsZXN5c3RlbSkuCisKK2RlZiByZWFscGF0aChmaWxlbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBjYW5vbmljYWwgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLCBlbGltaW5hdGluZyBhbnkKK3N5bWJvbGljIGxpbmtzIGVuY291bnRlcmVkIGluIHRoZSBwYXRoLiIiIgorICAgIHBhdGgsIG9rID0gX2pvaW5yZWFscGF0aCgnJywgZmlsZW5hbWUsIHt9KQorICAgIHJldHVybiBhYnNwYXRoKHBhdGgpCisKKyMgSm9pbiB0d28gcGF0aHMsIG5vcm1hbGl6aW5nIGFuZyBlbGltaW5hdGluZyBhbnkgc3ltYm9saWMgbGlua3MKKyMgZW5jb3VudGVyZWQgaW4gdGhlIHNlY29uZCBwYXRoLgorZGVmIF9qb2lucmVhbHBhdGgocGF0aCwgcmVzdCwgc2Vlbik6CisgICAgaWYgaXNhYnMocmVzdCk6CisgICAgICAgIHJlc3QgPSByZXN0WzE6XQorICAgICAgICBwYXRoID0gc2VwCisKKyAgICB3aGlsZSByZXN0OgorICAgICAgICBuYW1lLCBfLCByZXN0ID0gcmVzdC5wYXJ0aXRpb24oc2VwKQorICAgICAgICBpZiBub3QgbmFtZSBvciBuYW1lID09IGN1cmRpcjoKKyAgICAgICAgICAgICMgY3VycmVudCBkaXIKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIG5hbWUgPT0gcGFyZGlyOgorICAgICAgICAgICAgIyBwYXJlbnQgZGlyCisgICAgICAgICAgICBpZiBwYXRoOgorICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUgPSBzcGxpdChwYXRoKQorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gcGFyZGlyOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gam9pbihwYXRoLCBwYXJkaXIsIHBhcmRpcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGF0aCA9IHBhcmRpcgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbmV3cGF0aCA9IGpvaW4ocGF0aCwgbmFtZSkKKyAgICAgICAgaWYgbm90IGlzbGluayhuZXdwYXRoKToKKyAgICAgICAgICAgIHBhdGggPSBuZXdwYXRoCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAjIFJlc29sdmUgdGhlIHN5bWJvbGljIGxpbmsKKyAgICAgICAgaWYgbmV3cGF0aCBpbiBzZWVuOgorICAgICAgICAgICAgIyBBbHJlYWR5IHNlZW4gdGhpcyBwYXRoCisgICAgICAgICAgICBwYXRoID0gc2VlbltuZXdwYXRoXQorICAgICAgICAgICAgaWYgcGF0aCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIHVzZSBjYWNoZWQgdmFsdWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgIyBUaGUgc3ltbGluayBpcyBub3QgcmVzb2x2ZWQsIHNvIHdlIG11c3QgaGF2ZSBhIHN5bWxpbmsgbG9vcC4KKyAgICAgICAgICAgICMgUmV0dXJuIGFscmVhZHkgcmVzb2x2ZWQgcGFydCArIHJlc3Qgb2YgdGhlIHBhdGggdW5jaGFuZ2VkLgorICAgICAgICAgICAgcmV0dXJuIGpvaW4obmV3cGF0aCwgcmVzdCksIEZhbHNlCisgICAgICAgIHNlZW5bbmV3cGF0aF0gPSBOb25lICMgbm90IHJlc29sdmVkIHN5bWxpbmsKKyAgICAgICAgcGF0aCwgb2sgPSBfam9pbnJlYWxwYXRoKHBhdGgsIG9zLnJlYWRsaW5rKG5ld3BhdGgpLCBzZWVuKQorICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICByZXR1cm4gam9pbihwYXRoLCByZXN0KSwgRmFsc2UKKyAgICAgICAgc2VlbltuZXdwYXRoXSA9IHBhdGggIyByZXNvbHZlZCBzeW1saW5rCisKKyAgICByZXR1cm4gcGF0aCwgVHJ1ZQorCisKK3N1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzID0gKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJykKKworZGVmIHJlbHBhdGgocGF0aCwgc3RhcnQ9Y3VyZGlyKToKKyAgICAiIiJSZXR1cm4gYSByZWxhdGl2ZSB2ZXJzaW9uIG9mIGEgcGF0aCIiIgorCisgICAgaWYgbm90IHBhdGg6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vIHBhdGggc3BlY2lmaWVkIikKKworICAgIHN0YXJ0X2xpc3QgPSBbeCBmb3IgeCBpbiBhYnNwYXRoKHN0YXJ0KS5zcGxpdChzZXApIGlmIHhdCisgICAgcGF0aF9saXN0ID0gW3ggZm9yIHggaW4gYWJzcGF0aChwYXRoKS5zcGxpdChzZXApIGlmIHhdCisKKyAgICAjIFdvcmsgb3V0IGhvdyBtdWNoIG9mIHRoZSBmaWxlcGF0aCBpcyBzaGFyZWQgYnkgc3RhcnQgYW5kIHBhdGguCisgICAgaSA9IGxlbihjb21tb25wcmVmaXgoW3N0YXJ0X2xpc3QsIHBhdGhfbGlzdF0pKQorCisgICAgcmVsX2xpc3QgPSBbcGFyZGlyXSAqIChsZW4oc3RhcnRfbGlzdCktaSkgKyBwYXRoX2xpc3RbaTpdCisgICAgaWYgbm90IHJlbF9saXN0OgorICAgICAgICByZXR1cm4gY3VyZGlyCisgICAgcmV0dXJuIGpvaW4oKnJlbF9saXN0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wb3NpeHBhdGgucHljIGIvbGliL3B5dGhvbjIuNy9wb3NpeHBhdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTU0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wb3NpeHBhdGgucHlvIGIvbGliL3B5dGhvbjIuNy9wb3NpeHBhdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NTU0NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Bvc2l4cGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9wcHJpbnQucHkgYi9saWIvcHl0aG9uMi43L3BwcmludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAwOTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wcHJpbnQucHkKQEAgLTAsMCArMSwzNTMgQEAKKyMgIEF1dGhvcjogICAgICBGcmVkIEwuIERyYWtlLCBKci4KKyMgICAgICAgICAgICAgICBmZHJha2VAYWNtLm9yZworIworIyAgVGhpcyBpcyBhIHNpbXBsZSBsaXR0bGUgbW9kdWxlIEkgd3JvdGUgdG8gbWFrZSBsaWZlIGVhc2llci4gIEkgZGlkbid0CisjICBzZWUgYW55dGhpbmcgcXVpdGUgbGlrZSBpdCBpbiB0aGUgbGlicmFyeSwgdGhvdWdoIEkgbWF5IGhhdmUgb3Zlcmxvb2tlZAorIyAgc29tZXRoaW5nLiAgSSB3cm90ZSB0aGlzIHdoZW4gSSB3YXMgdHJ5aW5nIHRvIHJlYWQgc29tZSBoZWF2aWx5IG5lc3RlZAorIyAgdHVwbGVzIHdpdGggZmFpcmx5IG5vbi1kZXNjcmlwdGl2ZSBjb250ZW50LiAgVGhpcyBpcyBtb2RlbGVkIHZlcnkgbXVjaAorIyAgYWZ0ZXIgTGlzcC9TY2hlbWUgLSBzdHlsZSBwcmV0dHktcHJpbnRpbmcgb2YgbGlzdHMuICBJZiB5b3UgZmluZCBpdAorIyAgdXNlZnVsLCB0aGFuayBzbWFsbCBjaGlsZHJlbiB3aG8gc2xlZXAgYXQgbmlnaHQuCisKKyIiIlN1cHBvcnQgdG8gcHJldHR5LXByaW50IGxpc3RzLCB0dXBsZXMsICYgZGljdGlvbmFyaWVzIHJlY3Vyc2l2ZWx5LgorCitWZXJ5IHNpbXBsZSwgYnV0IHVzZWZ1bCwgZXNwZWNpYWxseSBpbiBkZWJ1Z2dpbmcgZGF0YSBzdHJ1Y3R1cmVzLgorCitDbGFzc2VzCistLS0tLS0tCisKK1ByZXR0eVByaW50ZXIoKQorICAgIEhhbmRsZSBwcmV0dHktcHJpbnRpbmcgb3BlcmF0aW9ucyBvbnRvIGEgc3RyZWFtIHVzaW5nIGEgY29uZmlndXJlZAorICAgIHNldCBvZiBmb3JtYXR0aW5nIHBhcmFtZXRlcnMuCisKK0Z1bmN0aW9ucworLS0tLS0tLS0tCisKK3Bmb3JtYXQoKQorICAgIEZvcm1hdCBhIFB5dGhvbiBvYmplY3QgaW50byBhIHByZXR0eS1wcmludGVkIHJlcHJlc2VudGF0aW9uLgorCitwcHJpbnQoKQorICAgIFByZXR0eS1wcmludCBhIFB5dGhvbiBvYmplY3QgdG8gYSBzdHJlYW0gW2RlZmF1bHQgaXMgc3lzLnN0ZG91dF0uCisKK3NhZmVyZXByKCkKKyAgICBHZW5lcmF0ZSBhICdzdGFuZGFyZCcgcmVwcigpLWxpa2UgdmFsdWUsIGJ1dCBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaXZlCisgICAgZGF0YSBzdHJ1Y3R1cmVzLgorCisiIiIKKworaW1wb3J0IHN5cyBhcyBfc3lzCitpbXBvcnQgd2FybmluZ3MKKwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KKworX19hbGxfXyA9IFsicHByaW50IiwicGZvcm1hdCIsImlzcmVhZGFibGUiLCJpc3JlY3Vyc2l2ZSIsInNhZmVyZXByIiwKKyAgICAgICAgICAgIlByZXR0eVByaW50ZXIiXQorCisjIGNhY2hlIHRoZXNlIGZvciBmYXN0ZXIgYWNjZXNzOgorX2NvbW1ham9pbiA9ICIsICIuam9pbgorX2lkID0gaWQKK19sZW4gPSBsZW4KK190eXBlID0gdHlwZQorCisKK2RlZiBwcHJpbnQob2JqZWN0LCBzdHJlYW09Tm9uZSwgaW5kZW50PTEsIHdpZHRoPTgwLCBkZXB0aD1Ob25lKToKKyAgICAiIiJQcmV0dHktcHJpbnQgYSBQeXRob24gb2JqZWN0IHRvIGEgc3RyZWFtIFtkZWZhdWx0IGlzIHN5cy5zdGRvdXRdLiIiIgorICAgIHByaW50ZXIgPSBQcmV0dHlQcmludGVyKAorICAgICAgICBzdHJlYW09c3RyZWFtLCBpbmRlbnQ9aW5kZW50LCB3aWR0aD13aWR0aCwgZGVwdGg9ZGVwdGgpCisgICAgcHJpbnRlci5wcHJpbnQob2JqZWN0KQorCitkZWYgcGZvcm1hdChvYmplY3QsIGluZGVudD0xLCB3aWR0aD04MCwgZGVwdGg9Tm9uZSk6CisgICAgIiIiRm9ybWF0IGEgUHl0aG9uIG9iamVjdCBpbnRvIGEgcHJldHR5LXByaW50ZWQgcmVwcmVzZW50YXRpb24uIiIiCisgICAgcmV0dXJuIFByZXR0eVByaW50ZXIoaW5kZW50PWluZGVudCwgd2lkdGg9d2lkdGgsIGRlcHRoPWRlcHRoKS5wZm9ybWF0KG9iamVjdCkKKworZGVmIHNhZmVyZXByKG9iamVjdCk6CisgICAgIiIiVmVyc2lvbiBvZiByZXByKCkgd2hpY2ggY2FuIGhhbmRsZSByZWN1cnNpdmUgZGF0YSBzdHJ1Y3R1cmVzLiIiIgorICAgIHJldHVybiBfc2FmZV9yZXByKG9iamVjdCwge30sIE5vbmUsIDApWzBdCisKK2RlZiBpc3JlYWRhYmxlKG9iamVjdCk6CisgICAgIiIiRGV0ZXJtaW5lIGlmIHNhZmVyZXByKG9iamVjdCkgaXMgcmVhZGFibGUgYnkgZXZhbCgpLiIiIgorICAgIHJldHVybiBfc2FmZV9yZXByKG9iamVjdCwge30sIE5vbmUsIDApWzFdCisKK2RlZiBpc3JlY3Vyc2l2ZShvYmplY3QpOgorICAgICIiIkRldGVybWluZSBpZiBvYmplY3QgcmVxdWlyZXMgYSByZWN1cnNpdmUgcmVwcmVzZW50YXRpb24uIiIiCisgICAgcmV0dXJuIF9zYWZlX3JlcHIob2JqZWN0LCB7fSwgTm9uZSwgMClbMl0KKworZGVmIF9zb3J0ZWQoaXRlcmFibGUpOgorICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgaWYgX3N5cy5weTNrd2FybmluZzoKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiY29tcGFyaW5nIHVuZXF1YWwgdHlwZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHJldHVybiBzb3J0ZWQoaXRlcmFibGUpCisKK2NsYXNzIFByZXR0eVByaW50ZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGVudD0xLCB3aWR0aD04MCwgZGVwdGg9Tm9uZSwgc3RyZWFtPU5vbmUpOgorICAgICAgICAiIiJIYW5kbGUgcHJldHR5IHByaW50aW5nIG9wZXJhdGlvbnMgb250byBhIHN0cmVhbSB1c2luZyBhIHNldCBvZgorICAgICAgICBjb25maWd1cmVkIHBhcmFtZXRlcnMuCisKKyAgICAgICAgaW5kZW50CisgICAgICAgICAgICBOdW1iZXIgb2Ygc3BhY2VzIHRvIGluZGVudCBmb3IgZWFjaCBsZXZlbCBvZiBuZXN0aW5nLgorCisgICAgICAgIHdpZHRoCisgICAgICAgICAgICBBdHRlbXB0ZWQgbWF4aW11bSBudW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgb3V0cHV0LgorCisgICAgICAgIGRlcHRoCisgICAgICAgICAgICBUaGUgbWF4aW11bSBkZXB0aCB0byBwcmludCBvdXQgbmVzdGVkIHN0cnVjdHVyZXMuCisKKyAgICAgICAgc3RyZWFtCisgICAgICAgICAgICBUaGUgZGVzaXJlZCBvdXRwdXQgc3RyZWFtLiAgSWYgb21pdHRlZCAob3IgZmFsc2UpLCB0aGUgc3RhbmRhcmQKKyAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gYXZhaWxhYmxlIGF0IGNvbnN0cnVjdGlvbiB3aWxsIGJlIHVzZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGluZGVudCA9IGludChpbmRlbnQpCisgICAgICAgIHdpZHRoID0gaW50KHdpZHRoKQorICAgICAgICBhc3NlcnQgaW5kZW50ID49IDAsICJpbmRlbnQgbXVzdCBiZSA+PSAwIgorICAgICAgICBhc3NlcnQgZGVwdGggaXMgTm9uZSBvciBkZXB0aCA+IDAsICJkZXB0aCBtdXN0IGJlID4gMCIKKyAgICAgICAgYXNzZXJ0IHdpZHRoLCAid2lkdGggbXVzdCBiZSAhPSAwIgorICAgICAgICBzZWxmLl9kZXB0aCA9IGRlcHRoCisgICAgICAgIHNlbGYuX2luZGVudF9wZXJfbGV2ZWwgPSBpbmRlbnQKKyAgICAgICAgc2VsZi5fd2lkdGggPSB3aWR0aAorICAgICAgICBpZiBzdHJlYW0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9zdHJlYW0gPSBzdHJlYW0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3N0cmVhbSA9IF9zeXMuc3Rkb3V0CisKKyAgICBkZWYgcHByaW50KHNlbGYsIG9iamVjdCk6CisgICAgICAgIHNlbGYuX2Zvcm1hdChvYmplY3QsIHNlbGYuX3N0cmVhbSwgMCwgMCwge30sIDApCisgICAgICAgIHNlbGYuX3N0cmVhbS53cml0ZSgiXG4iKQorCisgICAgZGVmIHBmb3JtYXQoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgc2lvID0gX1N0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fZm9ybWF0KG9iamVjdCwgc2lvLCAwLCAwLCB7fSwgMCkKKyAgICAgICAgcmV0dXJuIHNpby5nZXR2YWx1ZSgpCisKKyAgICBkZWYgaXNyZWN1cnNpdmUoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZm9ybWF0KG9iamVjdCwge30sIDAsIDApWzJdCisKKyAgICBkZWYgaXNyZWFkYWJsZShzZWxmLCBvYmplY3QpOgorICAgICAgICBzLCByZWFkYWJsZSwgcmVjdXJzaXZlID0gc2VsZi5mb3JtYXQob2JqZWN0LCB7fSwgMCwgMCkKKyAgICAgICAgcmV0dXJuIHJlYWRhYmxlIGFuZCBub3QgcmVjdXJzaXZlCisKKyAgICBkZWYgX2Zvcm1hdChzZWxmLCBvYmplY3QsIHN0cmVhbSwgaW5kZW50LCBhbGxvd2FuY2UsIGNvbnRleHQsIGxldmVsKToKKyAgICAgICAgbGV2ZWwgPSBsZXZlbCArIDEKKyAgICAgICAgb2JqaWQgPSBfaWQob2JqZWN0KQorICAgICAgICBpZiBvYmppZCBpbiBjb250ZXh0OgorICAgICAgICAgICAgc3RyZWFtLndyaXRlKF9yZWN1cnNpb24ob2JqZWN0KSkKKyAgICAgICAgICAgIHNlbGYuX3JlY3Vyc2l2ZSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX3JlYWRhYmxlID0gRmFsc2UKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXAgPSBzZWxmLl9yZXByKG9iamVjdCwgY29udGV4dCwgbGV2ZWwgLSAxKQorICAgICAgICB0eXAgPSBfdHlwZShvYmplY3QpCisgICAgICAgIHNlcExpbmVzID0gX2xlbihyZXApID4gKHNlbGYuX3dpZHRoIC0gMSAtIGluZGVudCAtIGFsbG93YW5jZSkKKyAgICAgICAgd3JpdGUgPSBzdHJlYW0ud3JpdGUKKworICAgICAgICBpZiBzZWxmLl9kZXB0aCBhbmQgbGV2ZWwgPiBzZWxmLl9kZXB0aDoKKyAgICAgICAgICAgIHdyaXRlKHJlcCkKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHIgPSBnZXRhdHRyKHR5cCwgIl9fcmVwcl9fIiwgTm9uZSkKKyAgICAgICAgaWYgaXNzdWJjbGFzcyh0eXAsIGRpY3QpIGFuZCByIGlzIGRpY3QuX19yZXByX186CisgICAgICAgICAgICB3cml0ZSgneycpCisgICAgICAgICAgICBpZiBzZWxmLl9pbmRlbnRfcGVyX2xldmVsID4gMToKKyAgICAgICAgICAgICAgICB3cml0ZSgoc2VsZi5faW5kZW50X3Blcl9sZXZlbCAtIDEpICogJyAnKQorICAgICAgICAgICAgbGVuZ3RoID0gX2xlbihvYmplY3QpCisgICAgICAgICAgICBpZiBsZW5ndGg6CisgICAgICAgICAgICAgICAgY29udGV4dFtvYmppZF0gPSAxCisgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50ICsgc2VsZi5faW5kZW50X3Blcl9sZXZlbAorICAgICAgICAgICAgICAgIGl0ZW1zID0gX3NvcnRlZChvYmplY3QuaXRlbXMoKSkKKyAgICAgICAgICAgICAgICBrZXksIGVudCA9IGl0ZW1zWzBdCisgICAgICAgICAgICAgICAgcmVwID0gc2VsZi5fcmVwcihrZXksIGNvbnRleHQsIGxldmVsKQorICAgICAgICAgICAgICAgIHdyaXRlKHJlcCkKKyAgICAgICAgICAgICAgICB3cml0ZSgnOiAnKQorICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdChlbnQsIHN0cmVhbSwgaW5kZW50ICsgX2xlbihyZXApICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93YW5jZSArIDEsIGNvbnRleHQsIGxldmVsKQorICAgICAgICAgICAgICAgIGlmIGxlbmd0aCA+IDE6CisgICAgICAgICAgICAgICAgICAgIGZvciBrZXksIGVudCBpbiBpdGVtc1sxOl06CisgICAgICAgICAgICAgICAgICAgICAgICByZXAgPSBzZWxmLl9yZXByKGtleSwgY29udGV4dCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZXBMaW5lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSgnLFxuJXMlczogJyAlICgnICcqaW5kZW50LCByZXApKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSgnLCAlczogJyAlIHJlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdChlbnQsIHN0cmVhbSwgaW5kZW50ICsgX2xlbihyZXApICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlICsgMSwgY29udGV4dCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50IC0gc2VsZi5faW5kZW50X3Blcl9sZXZlbAorICAgICAgICAgICAgICAgIGRlbCBjb250ZXh0W29iamlkXQorICAgICAgICAgICAgd3JpdGUoJ30nKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgKChpc3N1YmNsYXNzKHR5cCwgbGlzdCkgYW5kIHIgaXMgbGlzdC5fX3JlcHJfXykgb3IKKyAgICAgICAgICAgIChpc3N1YmNsYXNzKHR5cCwgdHVwbGUpIGFuZCByIGlzIHR1cGxlLl9fcmVwcl9fKSBvcgorICAgICAgICAgICAgKGlzc3ViY2xhc3ModHlwLCBzZXQpIGFuZCByIGlzIHNldC5fX3JlcHJfXykgb3IKKyAgICAgICAgICAgIChpc3N1YmNsYXNzKHR5cCwgZnJvemVuc2V0KSBhbmQgciBpcyBmcm96ZW5zZXQuX19yZXByX18pCisgICAgICAgICAgICk6CisgICAgICAgICAgICBsZW5ndGggPSBfbGVuKG9iamVjdCkKKyAgICAgICAgICAgIGlmIGlzc3ViY2xhc3ModHlwLCBsaXN0KToKKyAgICAgICAgICAgICAgICB3cml0ZSgnWycpCisgICAgICAgICAgICAgICAgZW5kY2hhciA9ICddJworICAgICAgICAgICAgZWxpZiBpc3N1YmNsYXNzKHR5cCwgc2V0KToKKyAgICAgICAgICAgICAgICBpZiBub3QgbGVuZ3RoOgorICAgICAgICAgICAgICAgICAgICB3cml0ZSgnc2V0KCknKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICB3cml0ZSgnc2V0KFsnKQorICAgICAgICAgICAgICAgIGVuZGNoYXIgPSAnXSknCisgICAgICAgICAgICAgICAgb2JqZWN0ID0gX3NvcnRlZChvYmplY3QpCisgICAgICAgICAgICAgICAgaW5kZW50ICs9IDQKKyAgICAgICAgICAgIGVsaWYgaXNzdWJjbGFzcyh0eXAsIGZyb3plbnNldCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGxlbmd0aDoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoJ2Zyb3plbnNldCgpJykKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgd3JpdGUoJ2Zyb3plbnNldChbJykKKyAgICAgICAgICAgICAgICBlbmRjaGFyID0gJ10pJworICAgICAgICAgICAgICAgIG9iamVjdCA9IF9zb3J0ZWQob2JqZWN0KQorICAgICAgICAgICAgICAgIGluZGVudCArPSAxMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3cml0ZSgnKCcpCisgICAgICAgICAgICAgICAgZW5kY2hhciA9ICcpJworICAgICAgICAgICAgaWYgc2VsZi5faW5kZW50X3Blcl9sZXZlbCA+IDEgYW5kIHNlcExpbmVzOgorICAgICAgICAgICAgICAgIHdyaXRlKChzZWxmLl9pbmRlbnRfcGVyX2xldmVsIC0gMSkgKiAnICcpCisgICAgICAgICAgICBpZiBsZW5ndGg6CisgICAgICAgICAgICAgICAgY29udGV4dFtvYmppZF0gPSAxCisgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50ICsgc2VsZi5faW5kZW50X3Blcl9sZXZlbAorICAgICAgICAgICAgICAgIHNlbGYuX2Zvcm1hdChvYmplY3RbMF0sIHN0cmVhbSwgaW5kZW50LCBhbGxvd2FuY2UgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBsZXZlbCkKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGggPiAxOgorICAgICAgICAgICAgICAgICAgICBmb3IgZW50IGluIG9iamVjdFsxOl06CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZXBMaW5lczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSgnLFxuJyArICcgJyppbmRlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlKCcsICcpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9mb3JtYXQoZW50LCBzdHJlYW0sIGluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dhbmNlICsgMSwgY29udGV4dCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50IC0gc2VsZi5faW5kZW50X3Blcl9sZXZlbAorICAgICAgICAgICAgICAgIGRlbCBjb250ZXh0W29iamlkXQorICAgICAgICAgICAgaWYgaXNzdWJjbGFzcyh0eXAsIHR1cGxlKSBhbmQgbGVuZ3RoID09IDE6CisgICAgICAgICAgICAgICAgd3JpdGUoJywnKQorICAgICAgICAgICAgd3JpdGUoZW5kY2hhcikKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHdyaXRlKHJlcCkKKworICAgIGRlZiBfcmVwcihzZWxmLCBvYmplY3QsIGNvbnRleHQsIGxldmVsKToKKyAgICAgICAgcmVwciwgcmVhZGFibGUsIHJlY3Vyc2l2ZSA9IHNlbGYuZm9ybWF0KG9iamVjdCwgY29udGV4dC5jb3B5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kZXB0aCwgbGV2ZWwpCisgICAgICAgIGlmIG5vdCByZWFkYWJsZToKKyAgICAgICAgICAgIHNlbGYuX3JlYWRhYmxlID0gRmFsc2UKKyAgICAgICAgaWYgcmVjdXJzaXZlOgorICAgICAgICAgICAgc2VsZi5fcmVjdXJzaXZlID0gVHJ1ZQorICAgICAgICByZXR1cm4gcmVwcgorCisgICAgZGVmIGZvcm1hdChzZWxmLCBvYmplY3QsIGNvbnRleHQsIG1heGxldmVscywgbGV2ZWwpOgorICAgICAgICAiIiJGb3JtYXQgb2JqZWN0IGZvciBhIHNwZWNpZmljIGNvbnRleHQsIHJldHVybmluZyBhIHN0cmluZworICAgICAgICBhbmQgZmxhZ3MgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZXByZXNlbnRhdGlvbiBpcyAncmVhZGFibGUnCisgICAgICAgIGFuZCB3aGV0aGVyIHRoZSBvYmplY3QgcmVwcmVzZW50cyBhIHJlY3Vyc2l2ZSBjb25zdHJ1Y3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gX3NhZmVfcmVwcihvYmplY3QsIGNvbnRleHQsIG1heGxldmVscywgbGV2ZWwpCisKKworIyBSZXR1cm4gdHJpcGxlIChyZXByX3N0cmluZywgaXNyZWFkYWJsZSwgaXNyZWN1cnNpdmUpLgorCitkZWYgX3NhZmVfcmVwcihvYmplY3QsIGNvbnRleHQsIG1heGxldmVscywgbGV2ZWwpOgorICAgIHR5cCA9IF90eXBlKG9iamVjdCkKKyAgICBpZiB0eXAgaXMgc3RyOgorICAgICAgICBpZiAnbG9jYWxlJyBub3QgaW4gX3N5cy5tb2R1bGVzOgorICAgICAgICAgICAgcmV0dXJuIHJlcHIob2JqZWN0KSwgVHJ1ZSwgRmFsc2UKKyAgICAgICAgaWYgIiciIGluIG9iamVjdCBhbmQgJyInIG5vdCBpbiBvYmplY3Q6CisgICAgICAgICAgICBjbG9zdXJlID0gJyInCisgICAgICAgICAgICBxdW90ZXMgPSB7JyInOiAnXFwiJ30KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNsb3N1cmUgPSAiJyIKKyAgICAgICAgICAgIHF1b3RlcyA9IHsiJyI6ICJcXCcifQorICAgICAgICBxZ2V0ID0gcXVvdGVzLmdldAorICAgICAgICBzaW8gPSBfU3RyaW5nSU8oKQorICAgICAgICB3cml0ZSA9IHNpby53cml0ZQorICAgICAgICBmb3IgY2hhciBpbiBvYmplY3Q6CisgICAgICAgICAgICBpZiBjaGFyLmlzYWxwaGEoKToKKyAgICAgICAgICAgICAgICB3cml0ZShjaGFyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3cml0ZShxZ2V0KGNoYXIsIHJlcHIoY2hhcilbMTotMV0pKQorICAgICAgICByZXR1cm4gKCIlcyVzJXMiICUgKGNsb3N1cmUsIHNpby5nZXR2YWx1ZSgpLCBjbG9zdXJlKSksIFRydWUsIEZhbHNlCisKKyAgICByID0gZ2V0YXR0cih0eXAsICJfX3JlcHJfXyIsIE5vbmUpCisgICAgaWYgaXNzdWJjbGFzcyh0eXAsIGRpY3QpIGFuZCByIGlzIGRpY3QuX19yZXByX186CisgICAgICAgIGlmIG5vdCBvYmplY3Q6CisgICAgICAgICAgICByZXR1cm4gInt9IiwgVHJ1ZSwgRmFsc2UKKyAgICAgICAgb2JqaWQgPSBfaWQob2JqZWN0KQorICAgICAgICBpZiBtYXhsZXZlbHMgYW5kIGxldmVsID49IG1heGxldmVsczoKKyAgICAgICAgICAgIHJldHVybiAiey4uLn0iLCBGYWxzZSwgb2JqaWQgaW4gY29udGV4dAorICAgICAgICBpZiBvYmppZCBpbiBjb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIF9yZWN1cnNpb24ob2JqZWN0KSwgRmFsc2UsIFRydWUKKyAgICAgICAgY29udGV4dFtvYmppZF0gPSAxCisgICAgICAgIHJlYWRhYmxlID0gVHJ1ZQorICAgICAgICByZWN1cnNpdmUgPSBGYWxzZQorICAgICAgICBjb21wb25lbnRzID0gW10KKyAgICAgICAgYXBwZW5kID0gY29tcG9uZW50cy5hcHBlbmQKKyAgICAgICAgbGV2ZWwgKz0gMQorICAgICAgICBzYWZlcmVwciA9IF9zYWZlX3JlcHIKKyAgICAgICAgZm9yIGssIHYgaW4gX3NvcnRlZChvYmplY3QuaXRlbXMoKSk6CisgICAgICAgICAgICBrcmVwciwga3JlYWRhYmxlLCBrcmVjdXIgPSBzYWZlcmVwcihrLCBjb250ZXh0LCBtYXhsZXZlbHMsIGxldmVsKQorICAgICAgICAgICAgdnJlcHIsIHZyZWFkYWJsZSwgdnJlY3VyID0gc2FmZXJlcHIodiwgY29udGV4dCwgbWF4bGV2ZWxzLCBsZXZlbCkKKyAgICAgICAgICAgIGFwcGVuZCgiJXM6ICVzIiAlIChrcmVwciwgdnJlcHIpKQorICAgICAgICAgICAgcmVhZGFibGUgPSByZWFkYWJsZSBhbmQga3JlYWRhYmxlIGFuZCB2cmVhZGFibGUKKyAgICAgICAgICAgIGlmIGtyZWN1ciBvciB2cmVjdXI6CisgICAgICAgICAgICAgICAgcmVjdXJzaXZlID0gVHJ1ZQorICAgICAgICBkZWwgY29udGV4dFtvYmppZF0KKyAgICAgICAgcmV0dXJuICJ7JXN9IiAlIF9jb21tYWpvaW4oY29tcG9uZW50cyksIHJlYWRhYmxlLCByZWN1cnNpdmUKKworICAgIGlmIChpc3N1YmNsYXNzKHR5cCwgbGlzdCkgYW5kIHIgaXMgbGlzdC5fX3JlcHJfXykgb3IgXAorICAgICAgIChpc3N1YmNsYXNzKHR5cCwgdHVwbGUpIGFuZCByIGlzIHR1cGxlLl9fcmVwcl9fKToKKyAgICAgICAgaWYgaXNzdWJjbGFzcyh0eXAsIGxpc3QpOgorICAgICAgICAgICAgaWYgbm90IG9iamVjdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIltdIiwgVHJ1ZSwgRmFsc2UKKyAgICAgICAgICAgIGZvcm1hdCA9ICJbJXNdIgorICAgICAgICBlbGlmIF9sZW4ob2JqZWN0KSA9PSAxOgorICAgICAgICAgICAgZm9ybWF0ID0gIiglcywpIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IG9iamVjdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIigpIiwgVHJ1ZSwgRmFsc2UKKyAgICAgICAgICAgIGZvcm1hdCA9ICIoJXMpIgorICAgICAgICBvYmppZCA9IF9pZChvYmplY3QpCisgICAgICAgIGlmIG1heGxldmVscyBhbmQgbGV2ZWwgPj0gbWF4bGV2ZWxzOgorICAgICAgICAgICAgcmV0dXJuIGZvcm1hdCAlICIuLi4iLCBGYWxzZSwgb2JqaWQgaW4gY29udGV4dAorICAgICAgICBpZiBvYmppZCBpbiBjb250ZXh0OgorICAgICAgICAgICAgcmV0dXJuIF9yZWN1cnNpb24ob2JqZWN0KSwgRmFsc2UsIFRydWUKKyAgICAgICAgY29udGV4dFtvYmppZF0gPSAxCisgICAgICAgIHJlYWRhYmxlID0gVHJ1ZQorICAgICAgICByZWN1cnNpdmUgPSBGYWxzZQorICAgICAgICBjb21wb25lbnRzID0gW10KKyAgICAgICAgYXBwZW5kID0gY29tcG9uZW50cy5hcHBlbmQKKyAgICAgICAgbGV2ZWwgKz0gMQorICAgICAgICBmb3IgbyBpbiBvYmplY3Q6CisgICAgICAgICAgICBvcmVwciwgb3JlYWRhYmxlLCBvcmVjdXIgPSBfc2FmZV9yZXByKG8sIGNvbnRleHQsIG1heGxldmVscywgbGV2ZWwpCisgICAgICAgICAgICBhcHBlbmQob3JlcHIpCisgICAgICAgICAgICBpZiBub3Qgb3JlYWRhYmxlOgorICAgICAgICAgICAgICAgIHJlYWRhYmxlID0gRmFsc2UKKyAgICAgICAgICAgIGlmIG9yZWN1cjoKKyAgICAgICAgICAgICAgICByZWN1cnNpdmUgPSBUcnVlCisgICAgICAgIGRlbCBjb250ZXh0W29iamlkXQorICAgICAgICByZXR1cm4gZm9ybWF0ICUgX2NvbW1ham9pbihjb21wb25lbnRzKSwgcmVhZGFibGUsIHJlY3Vyc2l2ZQorCisgICAgcmVwID0gcmVwcihvYmplY3QpCisgICAgcmV0dXJuIHJlcCwgKHJlcCBhbmQgbm90IHJlcC5zdGFydHN3aXRoKCc8JykpLCBGYWxzZQorCisKK2RlZiBfcmVjdXJzaW9uKG9iamVjdCk6CisgICAgcmV0dXJuICgiPFJlY3Vyc2lvbiBvbiAlcyB3aXRoIGlkPSVzPiIKKyAgICAgICAgICAgICUgKF90eXBlKG9iamVjdCkuX19uYW1lX18sIF9pZChvYmplY3QpKSkKKworCitkZWYgX3BlcmZjaGVjayhvYmplY3Q9Tm9uZSk6CisgICAgaW1wb3J0IHRpbWUKKyAgICBpZiBvYmplY3QgaXMgTm9uZToKKyAgICAgICAgb2JqZWN0ID0gWygic3RyaW5nIiwgKDEsIDIpLCBbMywgNF0sIHs1OiA2LCA3OiA4fSldICogMTAwMDAwCisgICAgcCA9IFByZXR0eVByaW50ZXIoKQorICAgIHQxID0gdGltZS50aW1lKCkKKyAgICBfc2FmZV9yZXByKG9iamVjdCwge30sIE5vbmUsIDApCisgICAgdDIgPSB0aW1lLnRpbWUoKQorICAgIHAucGZvcm1hdChvYmplY3QpCisgICAgdDMgPSB0aW1lLnRpbWUoKQorICAgIHByaW50ICJfc2FmZV9yZXByOiIsIHQyIC0gdDEKKyAgICBwcmludCAicGZvcm1hdDoiLCB0MyAtIHQyCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgX3BlcmZjaGVjaygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BwcmludC5weWMgYi9saWIvcHl0aG9uMi43L3BwcmludC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhYzA2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHByaW50LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3BwcmludC5weW8gYi9saWIvcHl0aG9uMi43L3BwcmludC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE0NjE3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHByaW50LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Byb2ZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Byb2ZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjk3YWEwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHJvZmlsZS5weQpAQCAtMCwwICsxLDYxMCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDbGFzcyBmb3IgcHJvZmlsaW5nIHB5dGhvbiBjb2RlLiByZXYgMS4wICA2LzIvOTQKKyMKKyMgV3JpdHRlbiBieSBKYW1lcyBSb3NraW5kCisjIEJhc2VkIG9uIHByaW9yIHByb2ZpbGUgbW9kdWxlIGJ5IFNqb2VyZCBNdWxsZW5kZXIuLi4KKyMgICB3aGljaCB3YXMgaGFja2VkIHNvbWV3aGF0IGJ5OiBHdWlkbyB2YW4gUm9zc3VtCisKKyIiIkNsYXNzIGZvciBwcm9maWxpbmcgUHl0aG9uIGNvZGUuIiIiCisKKyMgQ29weXJpZ2h0IERpc25leSBFbnRlcnByaXNlcywgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwKKyMgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlCisjIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdGltZQoraW1wb3J0IG1hcnNoYWwKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IE9wdGlvblBhcnNlcgorCitfX2FsbF9fID0gWyJydW4iLCAicnVuY3R4IiwgImhlbHAiLCAiUHJvZmlsZSJdCisKKyMgU2FtcGxlIHRpbWVyIGZvciB1c2Ugd2l0aAorI2lfY291bnQgPSAwCisjZGVmIGludGVnZXJfdGltZXIoKToKKyMgICAgICAgZ2xvYmFsIGlfY291bnQKKyMgICAgICAgaV9jb3VudCA9IGlfY291bnQgKyAxCisjICAgICAgIHJldHVybiBpX2NvdW50CisjaXRpbWVzID0gaW50ZWdlcl90aW1lciAjIHJlcGxhY2Ugd2l0aCBDIGNvZGVkIHRpbWVyIHJldHVybmluZyBpbnRlZ2VycworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgVGhlIGZvbGxvd2luZyBhcmUgdGhlIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIGZvciB0aGUgcHJvZmlsZXIgY2xhc3MKKyMgTm90ZSB0aGF0IGFuIGluc3RhbmNlIG9mIFByb2ZpbGUoKSBpcyAqbm90KiBuZWVkZWQgdG8gY2FsbCB0aGVtLgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2RlZiBydW4oc3RhdGVtZW50LCBmaWxlbmFtZT1Ob25lLCBzb3J0PS0xKToKKyAgICAiIiJSdW4gc3RhdGVtZW50IHVuZGVyIHByb2ZpbGVyIG9wdGlvbmFsbHkgc2F2aW5nIHJlc3VsdHMgaW4gZmlsZW5hbWUKKworICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzaW5nbGUgYXJndW1lbnQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZQorICAgICJleGVjIiBzdGF0ZW1lbnQsIGFuZCBhbiBvcHRpb25hbCBmaWxlIG5hbWUuICBJbiBhbGwgY2FzZXMgdGhpcworICAgIHJvdXRpbmUgYXR0ZW1wdHMgdG8gImV4ZWMiIGl0cyBmaXJzdCBhcmd1bWVudCBhbmQgZ2F0aGVyIHByb2ZpbGluZworICAgIHN0YXRpc3RpY3MgZnJvbSB0aGUgZXhlY3V0aW9uLiBJZiBubyBmaWxlIG5hbWUgaXMgcHJlc2VudCwgdGhlbiB0aGlzCisgICAgZnVuY3Rpb24gYXV0b21hdGljYWxseSBwcmludHMgYSBzaW1wbGUgcHJvZmlsaW5nIHJlcG9ydCwgc29ydGVkIGJ5IHRoZQorICAgIHN0YW5kYXJkIG5hbWUgc3RyaW5nIChmaWxlL2xpbmUvZnVuY3Rpb24tbmFtZSkgdGhhdCBpcyBwcmVzZW50ZWQgaW4KKyAgICBlYWNoIGxpbmUuCisgICAgIiIiCisgICAgcHJvZiA9IFByb2ZpbGUoKQorICAgIHRyeToKKyAgICAgICAgcHJvZiA9IHByb2YucnVuKHN0YXRlbWVudCkKKyAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgcGFzcworICAgIGlmIGZpbGVuYW1lIGlzIG5vdCBOb25lOgorICAgICAgICBwcm9mLmR1bXBfc3RhdHMoZmlsZW5hbWUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHByb2YucHJpbnRfc3RhdHMoc29ydCkKKworZGVmIHJ1bmN0eChzdGF0ZW1lbnQsIGdsb2JhbHMsIGxvY2FscywgZmlsZW5hbWU9Tm9uZSwgc29ydD0tMSk6CisgICAgIiIiUnVuIHN0YXRlbWVudCB1bmRlciBwcm9maWxlciwgc3VwcGx5aW5nIHlvdXIgb3duIGdsb2JhbHMgYW5kIGxvY2FscywKKyAgICBvcHRpb25hbGx5IHNhdmluZyByZXN1bHRzIGluIGZpbGVuYW1lLgorCisgICAgc3RhdGVtZW50IGFuZCBmaWxlbmFtZSBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyBwcm9maWxlLnJ1bgorICAgICIiIgorICAgIHByb2YgPSBQcm9maWxlKCkKKyAgICB0cnk6CisgICAgICAgIHByb2YgPSBwcm9mLnJ1bmN0eChzdGF0ZW1lbnQsIGdsb2JhbHMsIGxvY2FscykKKyAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgcGFzcworCisgICAgaWYgZmlsZW5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgIHByb2YuZHVtcF9zdGF0cyhmaWxlbmFtZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcHJvZi5wcmludF9zdGF0cyhzb3J0KQorCisjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorZGVmIGhlbHAoKToKKyAgICBwcmludCAiRG9jdW1lbnRhdGlvbiBmb3IgdGhlIHByb2ZpbGUgbW9kdWxlIGNhbiBiZSBmb3VuZCAiCisgICAgcHJpbnQgImluIHRoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UsIHNlY3Rpb24gJ1RoZSBQeXRob24gUHJvZmlsZXInLiIKKworaWYgaGFzYXR0cihvcywgInRpbWVzIik6CisgICAgZGVmIF9nZXRfdGltZV90aW1lcyh0aW1lcj1vcy50aW1lcyk6CisgICAgICAgIHQgPSB0aW1lcigpCisgICAgICAgIHJldHVybiB0WzBdICsgdFsxXQorCisjIFVzaW5nIGdldHJ1c2FnZSgzKSBpcyBiZXR0ZXIgdGhhbiBjbG9jaygzKSBpZiBhdmFpbGFibGU6CisjIG9uIHNvbWUgc3lzdGVtcyAoZS5nLiBGcmVlQlNEKSwgZ2V0cnVzYWdlIGhhcyBhIGhpZ2hlciByZXNvbHV0aW9uCisjIEZ1cnRoZXJtb3JlLCBvbiBhIFBPU0lYIHN5c3RlbSwgcmV0dXJucyBtaWNyb3NlY29uZHMsIHdoaWNoCisjIHdyYXAgYXJvdW5kIGFmdGVyIDM2bWluLgorX2hhc19yZXMgPSAwCit0cnk6CisgICAgaW1wb3J0IHJlc291cmNlCisgICAgcmVzZ2V0cnVzYWdlID0gbGFtYmRhOiByZXNvdXJjZS5nZXRydXNhZ2UocmVzb3VyY2UuUlVTQUdFX1NFTEYpCisgICAgZGVmIF9nZXRfdGltZV9yZXNvdXJjZSh0aW1lcj1yZXNnZXRydXNhZ2UpOgorICAgICAgICB0ID0gdGltZXIoKQorICAgICAgICByZXR1cm4gdFswXSArIHRbMV0KKyAgICBfaGFzX3JlcyA9IDEKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKK2NsYXNzIFByb2ZpbGU6CisgICAgIiIiUHJvZmlsZXIgY2xhc3MuCisKKyAgICBzZWxmLmN1ciBpcyBhbHdheXMgYSB0dXBsZS4gIEVhY2ggc3VjaCB0dXBsZSBjb3JyZXNwb25kcyB0byBhIHN0YWNrCisgICAgZnJhbWUgdGhhdCBpcyBjdXJyZW50bHkgYWN0aXZlIChzZWxmLmN1clstMl0pLiAgVGhlIGZvbGxvd2luZyBhcmUgdGhlCisgICAgZGVmaW5pdGlvbnMgb2YgaXRzIG1lbWJlcnMuICBXZSB1c2UgdGhpcyBleHRlcm5hbCAicGFyYWxsZWwgc3RhY2siIHRvCisgICAgYXZvaWQgY29udGFtaW5hdGluZyB0aGUgcHJvZ3JhbSB0aGF0IHdlIGFyZSBwcm9maWxpbmcuIChvbGQgcHJvZmlsZXIKKyAgICB1c2VkIHRvIHdyaXRlIGludG8gdGhlIGZyYW1lcyBsb2NhbCBkaWN0aW9uYXJ5ISEpIERlcml2ZWQgY2xhc3NlcworICAgIGNhbiBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2Ygc29tZSBlbnRyaWVzLCBhcyBsb25nIGFzIHRoZXkgbGVhdmUKKyAgICBbLTI6XSBpbnRhY3QgKGZyYW1lIGFuZCBwcmV2aW91cyB0dXBsZSkuICBJbiBjYXNlIGFuIGludGVybmFsIGVycm9yIGlzCisgICAgZGV0ZWN0ZWQsIHRoZSAtMyBlbGVtZW50IGlzIHVzZWQgYXMgdGhlIGZ1bmN0aW9uIG5hbWUuCisKKyAgICBbIDBdID0gVGltZSB0aGF0IG5lZWRzIHRvIGJlIGNoYXJnZWQgdG8gdGhlIHBhcmVudCBmcmFtZSdzIGZ1bmN0aW9uLgorICAgICAgICAgICBJdCBpcyB1c2VkIHNvIHRoYXQgYSBmdW5jdGlvbiBjYWxsIHdpbGwgbm90IGhhdmUgdG8gYWNjZXNzIHRoZQorICAgICAgICAgICB0aW1pbmcgZGF0YSBmb3IgdGhlIHBhcmVudCBmcmFtZS4KKyAgICBbIDFdID0gVG90YWwgdGltZSBzcGVudCBpbiB0aGlzIGZyYW1lJ3MgZnVuY3Rpb24sIGV4Y2x1ZGluZyB0aW1lIGluCisgICAgICAgICAgIHN1YmZ1bmN0aW9ucyAodGhpcyBsYXR0ZXIgaXMgdGFsbGllZCBpbiBjdXJbMl0pLgorICAgIFsgMl0gPSBUb3RhbCB0aW1lIHNwZW50IGluIHN1YmZ1bmN0aW9ucywgZXhjbHVkaW5nIHRpbWUgZXhlY3V0aW5nIHRoZQorICAgICAgICAgICBmcmFtZSdzIGZ1bmN0aW9uICh0aGlzIGxhdHRlciBpcyB0YWxsaWVkIGluIGN1clsxXSkuCisgICAgWy0zXSA9IE5hbWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcyBmcmFtZS4KKyAgICBbLTJdID0gQWN0dWFsIGZyYW1lIHRoYXQgd2UgY29ycmVzcG9uZCB0byAodXNlZCB0byBzeW5jIGV4Y2VwdGlvbiBoYW5kbGluZykuCisgICAgWy0xXSA9IE91ciBwYXJlbnQgNi10dXBsZSAoY29ycmVzcG9uZHMgdG8gZnJhbWUuZl9iYWNrKS4KKworICAgIFRpbWluZyBkYXRhIGZvciBlYWNoIGZ1bmN0aW9uIGlzIHN0b3JlZCBhcyBhIDUtdHVwbGUgaW4gdGhlIGRpY3Rpb25hcnkKKyAgICBzZWxmLnRpbWluZ3NbXS4gIFRoZSBpbmRleCBpcyBhbHdheXMgdGhlIG5hbWUgc3RvcmVkIGluIHNlbGYuY3VyWy0zXS4KKyAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG1lbWJlcnM6CisKKyAgICBbMF0gPSBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2FzIGNhbGxlZCwgbm90IGNvdW50aW5nIGRpcmVjdAorICAgICAgICAgIG9yIGluZGlyZWN0IHJlY3Vyc2lvbiwKKyAgICBbMV0gPSBOdW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiBhcHBlYXJzIG9uIHRoZSBzdGFjaywgbWludXMgb25lCisgICAgWzJdID0gVG90YWwgdGltZSBzcGVudCBpbnRlcm5hbCB0byB0aGlzIGZ1bmN0aW9uCisgICAgWzNdID0gQ3VtdWxhdGl2ZSB0aW1lIHRoYXQgdGhpcyBmdW5jdGlvbiB3YXMgcHJlc2VudCBvbiB0aGUgc3RhY2suICBJbgorICAgICAgICAgIG5vbi1yZWN1cnNpdmUgZnVuY3Rpb25zLCB0aGlzIGlzIHRoZSB0b3RhbCBleGVjdXRpb24gdGltZSBmcm9tIHN0YXJ0CisgICAgICAgICAgdG8gZmluaXNoIG9mIGVhY2ggaW52b2NhdGlvbiBvZiBhIGZ1bmN0aW9uLCBpbmNsdWRpbmcgdGltZSBzcGVudCBpbgorICAgICAgICAgIGFsbCBzdWJmdW5jdGlvbnMuCisgICAgWzRdID0gQSBkaWN0aW9uYXJ5IGluZGljYXRpbmcgZm9yIGVhY2ggZnVuY3Rpb24gbmFtZSwgdGhlIG51bWJlciBvZiB0aW1lcworICAgICAgICAgIGl0IHdhcyBjYWxsZWQgYnkgdXMuCisgICAgIiIiCisKKyAgICBiaWFzID0gMCAgIyBjYWxpYnJhdGlvbiBjb25zdGFudAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRpbWVyPU5vbmUsIGJpYXM9Tm9uZSk6CisgICAgICAgIHNlbGYudGltaW5ncyA9IHt9CisgICAgICAgIHNlbGYuY3VyID0gTm9uZQorICAgICAgICBzZWxmLmNtZCA9ICIiCisgICAgICAgIHNlbGYuY19mdW5jX25hbWUgPSAiIgorCisgICAgICAgIGlmIGJpYXMgaXMgTm9uZToKKyAgICAgICAgICAgIGJpYXMgPSBzZWxmLmJpYXMKKyAgICAgICAgc2VsZi5iaWFzID0gYmlhcyAgICAgIyBNYXRlcmlhbGl6ZSBpbiBsb2NhbCBkaWN0IGZvciBsb29rdXAgc3BlZWQuCisKKyAgICAgICAgaWYgbm90IHRpbWVyOgorICAgICAgICAgICAgaWYgX2hhc19yZXM6CisgICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IHJlc2dldHJ1c2FnZQorICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hlciA9IHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICBzZWxmLmdldF90aW1lID0gX2dldF90aW1lX3Jlc291cmNlCisgICAgICAgICAgICBlbGlmIGhhc2F0dHIodGltZSwgJ2Nsb2NrJyk6CisgICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IHNlbGYuZ2V0X3RpbWUgPSB0aW1lLmNsb2NrCisgICAgICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyID0gc2VsZi50cmFjZV9kaXNwYXRjaF9pCisgICAgICAgICAgICBlbGlmIGhhc2F0dHIob3MsICd0aW1lcycpOgorICAgICAgICAgICAgICAgIHNlbGYudGltZXIgPSBvcy50aW1lcworICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hlciA9IHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICBzZWxmLmdldF90aW1lID0gX2dldF90aW1lX3RpbWVzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudGltZXIgPSBzZWxmLmdldF90aW1lID0gdGltZS50aW1lCisgICAgICAgICAgICAgICAgc2VsZi5kaXNwYXRjaGVyID0gc2VsZi50cmFjZV9kaXNwYXRjaF9pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRpbWVyID0gdGltZXIKKyAgICAgICAgICAgIHQgPSBzZWxmLnRpbWVyKCkgIyB0ZXN0IG91dCB0aW1lciBmdW5jdGlvbgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxlbmd0aCA9IGxlbih0KQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmdldF90aW1lID0gdGltZXIKKyAgICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIgPSBzZWxmLnRyYWNlX2Rpc3BhdGNoX2kKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbGVuZ3RoID09IDI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlzcGF0Y2hlciA9IHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRpc3BhdGNoZXIgPSBzZWxmLnRyYWNlX2Rpc3BhdGNoX2wKKyAgICAgICAgICAgICAgICAjIFRoaXMgZ2V0X3RpbWUoKSBpbXBsZW1lbnRhdGlvbiBuZWVkcyB0byBiZSBkZWZpbmVkCisgICAgICAgICAgICAgICAgIyBoZXJlIHRvIGNhcHR1cmUgdGhlIHBhc3NlZC1pbiB0aW1lciBpbiB0aGUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgIyBsaXN0IChmb3IgcGVyZm9ybWFuY2UpLiAgTm90ZSB0aGF0IHdlIGNhbid0IGFzc3VtZQorICAgICAgICAgICAgICAgICMgdGhlIHRpbWVyKCkgcmVzdWx0IGNvbnRhaW5zIHR3byB2YWx1ZXMgaW4gYWxsCisgICAgICAgICAgICAgICAgIyBjYXNlcy4KKyAgICAgICAgICAgICAgICBkZWYgZ2V0X3RpbWVfdGltZXIodGltZXI9dGltZXIsIHN1bT1zdW0pOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VtKHRpbWVyKCkpCisgICAgICAgICAgICAgICAgc2VsZi5nZXRfdGltZSA9IGdldF90aW1lX3RpbWVyCisgICAgICAgIHNlbGYudCA9IHNlbGYuZ2V0X3RpbWUoKQorICAgICAgICBzZWxmLnNpbXVsYXRlX2NhbGwoJ3Byb2ZpbGVyJykKKworICAgICMgSGVhdmlseSBvcHRpbWl6ZWQgZGlzcGF0Y2ggcm91dGluZSBmb3Igb3MudGltZXMoKSB0aW1lcgorCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgdGltZXIgPSBzZWxmLnRpbWVyCisgICAgICAgIHQgPSB0aW1lcigpCisgICAgICAgIHQgPSB0WzBdICsgdFsxXSAtIHNlbGYudCAtIHNlbGYuYmlhcworCisgICAgICAgIGlmIGV2ZW50ID09ICJjX2NhbGwiOgorICAgICAgICAgICAgc2VsZi5jX2Z1bmNfbmFtZSA9IGFyZy5fX25hbWVfXworCisgICAgICAgIGlmIHNlbGYuZGlzcGF0Y2hbZXZlbnRdKHNlbGYsIGZyYW1lLHQpOgorICAgICAgICAgICAgdCA9IHRpbWVyKCkKKyAgICAgICAgICAgIHNlbGYudCA9IHRbMF0gKyB0WzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByID0gdGltZXIoKQorICAgICAgICAgICAgc2VsZi50ID0gclswXSArIHJbMV0gLSB0ICMgcHV0IGJhY2sgdW5yZWNvcmRlZCBkZWx0YQorCisgICAgIyBEaXNwYXRjaCByb3V0aW5lIGZvciBiZXN0IHRpbWVyIHByb2dyYW0gKHJldHVybiA9IHNjYWxhciwgZmFzdGVzdCBpZgorICAgICMgYW4gaW50ZWdlciBidXQgZmxvYXQgd29ya3MgdG9vIC0tIGFuZCB0aW1lLmNsb2NrKCkgcmVsaWVzIG9uIHRoYXQpLgorCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoX2koc2VsZiwgZnJhbWUsIGV2ZW50LCBhcmcpOgorICAgICAgICB0aW1lciA9IHNlbGYudGltZXIKKyAgICAgICAgdCA9IHRpbWVyKCkgLSBzZWxmLnQgLSBzZWxmLmJpYXMKKworICAgICAgICBpZiBldmVudCA9PSAiY19jYWxsIjoKKyAgICAgICAgICAgIHNlbGYuY19mdW5jX25hbWUgPSBhcmcuX19uYW1lX18KKworICAgICAgICBpZiBzZWxmLmRpc3BhdGNoW2V2ZW50XShzZWxmLCBmcmFtZSwgdCk6CisgICAgICAgICAgICBzZWxmLnQgPSB0aW1lcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnQgPSB0aW1lcigpIC0gdCAgIyBwdXQgYmFjayB1bnJlY29yZGVkIGRlbHRhCisKKyAgICAjIERpc3BhdGNoIHJvdXRpbmUgZm9yIG1hY2ludG9zaCAodGltZXIgcmV0dXJucyB0aW1lIGluIHRpY2tzIG9mCisgICAgIyAxLzYwdGggc2Vjb25kKQorCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoX21hYyhzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgIHRpbWVyID0gc2VsZi50aW1lcgorICAgICAgICB0ID0gdGltZXIoKS82MC4wIC0gc2VsZi50IC0gc2VsZi5iaWFzCisKKyAgICAgICAgaWYgZXZlbnQgPT0gImNfY2FsbCI6CisgICAgICAgICAgICBzZWxmLmNfZnVuY19uYW1lID0gYXJnLl9fbmFtZV9fCisKKyAgICAgICAgaWYgc2VsZi5kaXNwYXRjaFtldmVudF0oc2VsZiwgZnJhbWUsIHQpOgorICAgICAgICAgICAgc2VsZi50ID0gdGltZXIoKS82MC4wCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnQgPSB0aW1lcigpLzYwLjAgLSB0ICAjIHB1dCBiYWNrIHVucmVjb3JkZWQgZGVsdGEKKworICAgICMgU0xPVyBnZW5lcmljIGRpc3BhdGNoIHJvdXRpbmUgZm9yIHRpbWVyIHJldHVybmluZyBsaXN0cyBvZiBudW1iZXJzCisKKyAgICBkZWYgdHJhY2VfZGlzcGF0Y2hfbChzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgIGdldF90aW1lID0gc2VsZi5nZXRfdGltZQorICAgICAgICB0ID0gZ2V0X3RpbWUoKSAtIHNlbGYudCAtIHNlbGYuYmlhcworCisgICAgICAgIGlmIGV2ZW50ID09ICJjX2NhbGwiOgorICAgICAgICAgICAgc2VsZi5jX2Z1bmNfbmFtZSA9IGFyZy5fX25hbWVfXworCisgICAgICAgIGlmIHNlbGYuZGlzcGF0Y2hbZXZlbnRdKHNlbGYsIGZyYW1lLCB0KToKKyAgICAgICAgICAgIHNlbGYudCA9IGdldF90aW1lKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudCA9IGdldF90aW1lKCkgLSB0ICMgcHV0IGJhY2sgdW5yZWNvcmRlZCBkZWx0YQorCisgICAgIyBJbiB0aGUgZXZlbnQgaGFuZGxlcnMsIHRoZSBmaXJzdCAzIGVsZW1lbnRzIG9mIHNlbGYuY3VyIGFyZSB1bnBhY2tlZAorICAgICMgaW50byB2cmJscyB3LyAzLWxldHRlciBuYW1lcy4gIFRoZSBsYXN0IHR3byBjaGFyYWN0ZXJzIGFyZSBtZWFudCB0byBiZQorICAgICMgbW5lbW9uaWM6CisgICAgIyAgICAgX3B0ICBzZWxmLmN1clswXSAicGFyZW50IHRpbWUiICAgdGltZSB0byBiZSBjaGFyZ2VkIHRvIHBhcmVudCBmcmFtZQorICAgICMgICAgIF9pdCAgc2VsZi5jdXJbMV0gImludGVybmFsIHRpbWUiIHRpbWUgc3BlbnQgZGlyZWN0bHkgaW4gdGhlIGZ1bmN0aW9uCisgICAgIyAgICAgX2V0ICBzZWxmLmN1clsyXSAiZXh0ZXJuYWwgdGltZSIgdGltZSBzcGVudCBpbiBzdWJmdW5jdGlvbnMKKworICAgIGRlZiB0cmFjZV9kaXNwYXRjaF9leGNlcHRpb24oc2VsZiwgZnJhbWUsIHQpOgorICAgICAgICBycHQsIHJpdCwgcmV0LCByZm4sIHJmcmFtZSwgcmN1ciA9IHNlbGYuY3VyCisgICAgICAgIGlmIChyZnJhbWUgaXMgbm90IGZyYW1lKSBhbmQgcmN1cjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoX3JldHVybihyZnJhbWUsIHQpCisgICAgICAgIHNlbGYuY3VyID0gcnB0LCByaXQrdCwgcmV0LCByZm4sIHJmcmFtZSwgcmN1cgorICAgICAgICByZXR1cm4gMQorCisKKyAgICBkZWYgdHJhY2VfZGlzcGF0Y2hfY2FsbChzZWxmLCBmcmFtZSwgdCk6CisgICAgICAgIGlmIHNlbGYuY3VyIGFuZCBmcmFtZS5mX2JhY2sgaXMgbm90IHNlbGYuY3VyWy0yXToKKyAgICAgICAgICAgIHJwdCwgcml0LCByZXQsIHJmbiwgcmZyYW1lLCByY3VyID0gc2VsZi5jdXIKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHJmcmFtZSwgUHJvZmlsZS5mYWtlX2ZyYW1lKToKKyAgICAgICAgICAgICAgICBhc3NlcnQgcmZyYW1lLmZfYmFjayBpcyBmcmFtZS5mX2JhY2ssICgiQmFkIGNhbGwiLCByZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmZyYW1lLCByZnJhbWUuZl9iYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLCBmcmFtZS5mX2JhY2spCisgICAgICAgICAgICAgICAgc2VsZi50cmFjZV9kaXNwYXRjaF9yZXR1cm4ocmZyYW1lLCAwKQorICAgICAgICAgICAgICAgIGFzc2VydCAoc2VsZi5jdXIgaXMgTm9uZSBvciBcCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5mX2JhY2sgaXMgc2VsZi5jdXJbLTJdKSwgKCJCYWQgY2FsbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VyWy0zXSkKKyAgICAgICAgZmNvZGUgPSBmcmFtZS5mX2NvZGUKKyAgICAgICAgZm4gPSAoZmNvZGUuY29fZmlsZW5hbWUsIGZjb2RlLmNvX2ZpcnN0bGluZW5vLCBmY29kZS5jb19uYW1lKQorICAgICAgICBzZWxmLmN1ciA9ICh0LCAwLCAwLCBmbiwgZnJhbWUsIHNlbGYuY3VyKQorICAgICAgICB0aW1pbmdzID0gc2VsZi50aW1pbmdzCisgICAgICAgIGlmIGZuIGluIHRpbWluZ3M6CisgICAgICAgICAgICBjYywgbnMsIHR0LCBjdCwgY2FsbGVycyA9IHRpbWluZ3NbZm5dCisgICAgICAgICAgICB0aW1pbmdzW2ZuXSA9IGNjLCBucyArIDEsIHR0LCBjdCwgY2FsbGVycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGltaW5nc1tmbl0gPSAwLCAwLCAwLCAwLCB7fQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIHRyYWNlX2Rpc3BhdGNoX2NfY2FsbCAoc2VsZiwgZnJhbWUsIHQpOgorICAgICAgICBmbiA9ICgiIiwgMCwgc2VsZi5jX2Z1bmNfbmFtZSkKKyAgICAgICAgc2VsZi5jdXIgPSAodCwgMCwgMCwgZm4sIGZyYW1lLCBzZWxmLmN1cikKKyAgICAgICAgdGltaW5ncyA9IHNlbGYudGltaW5ncworICAgICAgICBpZiBmbiBpbiB0aW1pbmdzOgorICAgICAgICAgICAgY2MsIG5zLCB0dCwgY3QsIGNhbGxlcnMgPSB0aW1pbmdzW2ZuXQorICAgICAgICAgICAgdGltaW5nc1tmbl0gPSBjYywgbnMrMSwgdHQsIGN0LCBjYWxsZXJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aW1pbmdzW2ZuXSA9IDAsIDAsIDAsIDAsIHt9CisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgdHJhY2VfZGlzcGF0Y2hfcmV0dXJuKHNlbGYsIGZyYW1lLCB0KToKKyAgICAgICAgaWYgZnJhbWUgaXMgbm90IHNlbGYuY3VyWy0yXToKKyAgICAgICAgICAgIGFzc2VydCBmcmFtZSBpcyBzZWxmLmN1clstMl0uZl9iYWNrLCAoIkJhZCByZXR1cm4iLCBzZWxmLmN1clstM10pCisgICAgICAgICAgICBzZWxmLnRyYWNlX2Rpc3BhdGNoX3JldHVybihzZWxmLmN1clstMl0sIDApCisKKyAgICAgICAgIyBQcmVmaXggInIiIG1lYW5zIHBhcnQgb2YgdGhlIFJldHVybmluZyBvciBleGl0aW5nIGZyYW1lLgorICAgICAgICAjIFByZWZpeCAicCIgbWVhbnMgcGFydCBvZiB0aGUgUHJldmlvdXMgb3IgUGFyZW50IG9yIG9sZGVyIGZyYW1lLgorCisgICAgICAgIHJwdCwgcml0LCByZXQsIHJmbiwgZnJhbWUsIHJjdXIgPSBzZWxmLmN1cgorICAgICAgICByaXQgPSByaXQgKyB0CisgICAgICAgIGZyYW1lX3RvdGFsID0gcml0ICsgcmV0CisKKyAgICAgICAgcHB0LCBwaXQsIHBldCwgcGZuLCBwZnJhbWUsIHBjdXIgPSByY3VyCisgICAgICAgIHNlbGYuY3VyID0gcHB0LCBwaXQgKyBycHQsIHBldCArIGZyYW1lX3RvdGFsLCBwZm4sIHBmcmFtZSwgcGN1cgorCisgICAgICAgIHRpbWluZ3MgPSBzZWxmLnRpbWluZ3MKKyAgICAgICAgY2MsIG5zLCB0dCwgY3QsIGNhbGxlcnMgPSB0aW1pbmdzW3Jmbl0KKyAgICAgICAgaWYgbm90IG5zOgorICAgICAgICAgICAgIyBUaGlzIGlzIHRoZSBvbmx5IG9jY3VycmVuY2Ugb2YgdGhlIGZ1bmN0aW9uIG9uIHRoZSBzdGFjay4KKyAgICAgICAgICAgICMgRWxzZSB0aGlzIGlzIGEgKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIHJlY3Vyc2l2ZSBjYWxsLCBhbmQKKyAgICAgICAgICAgICMgaXRzIGN1bXVsYXRpdmUgdGltZSB3aWxsIGdldCB1cGRhdGVkIHdoZW4gdGhlIHRvcG1vc3QgY2FsbCB0bworICAgICAgICAgICAgIyBpdCByZXR1cm5zLgorICAgICAgICAgICAgY3QgPSBjdCArIGZyYW1lX3RvdGFsCisgICAgICAgICAgICBjYyA9IGNjICsgMQorCisgICAgICAgIGlmIHBmbiBpbiBjYWxsZXJzOgorICAgICAgICAgICAgY2FsbGVyc1twZm5dID0gY2FsbGVyc1twZm5dICsgMSAgIyBoYWNrOiBnYXRoZXIgbW9yZQorICAgICAgICAgICAgIyBzdGF0cyBzdWNoIGFzIHRoZSBhbW91bnQgb2YgdGltZSBhZGRlZCB0byBjdCBjb3VydGVzeQorICAgICAgICAgICAgIyBvZiB0aGlzIHNwZWNpZmljIGNhbGwsIGFuZCB0aGUgY29udHJpYnV0aW9uIHRvIGNjCisgICAgICAgICAgICAjIGNvdXJ0ZXN5IG9mIHRoaXMgY2FsbC4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNhbGxlcnNbcGZuXSA9IDEKKworICAgICAgICB0aW1pbmdzW3Jmbl0gPSBjYywgbnMgLSAxLCB0dCArIHJpdCwgY3QsIGNhbGxlcnMKKworICAgICAgICByZXR1cm4gMQorCisKKyAgICBkaXNwYXRjaCA9IHsKKyAgICAgICAgImNhbGwiOiB0cmFjZV9kaXNwYXRjaF9jYWxsLAorICAgICAgICAiZXhjZXB0aW9uIjogdHJhY2VfZGlzcGF0Y2hfZXhjZXB0aW9uLAorICAgICAgICAicmV0dXJuIjogdHJhY2VfZGlzcGF0Y2hfcmV0dXJuLAorICAgICAgICAiY19jYWxsIjogdHJhY2VfZGlzcGF0Y2hfY19jYWxsLAorICAgICAgICAiY19leGNlcHRpb24iOiB0cmFjZV9kaXNwYXRjaF9yZXR1cm4sICAjIHRoZSBDIGZ1bmN0aW9uIHJldHVybmVkCisgICAgICAgICJjX3JldHVybiI6IHRyYWNlX2Rpc3BhdGNoX3JldHVybiwKKyAgICAgICAgfQorCisKKyAgICAjIFRoZSBuZXh0IGZldyBmdW5jdGlvbnMgcGxheSB3aXRoIHNlbGYuY21kLiBCeSBjYXJlZnVsbHkgcHJlbG9hZGluZworICAgICMgb3VyIHBhcmFsbGVsIHN0YWNrLCB3ZSBjYW4gZm9yY2UgdGhlIHByb2ZpbGVkIHJlc3VsdCB0byBpbmNsdWRlCisgICAgIyBhbiBhcmJpdHJhcnkgc3RyaW5nIGFzIHRoZSBuYW1lIG9mIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLgorICAgICMgV2UgdXNlIHNlbGYuY21kIGFzIHRoYXQgc3RyaW5nLCBhbmQgdGhlIHJlc3VsdGluZyBzdGF0cyBsb29rCisgICAgIyB2ZXJ5IG5pY2UgOi0pLgorCisgICAgZGVmIHNldF9jbWQoc2VsZiwgY21kKToKKyAgICAgICAgaWYgc2VsZi5jdXJbLTFdOiByZXR1cm4gICAjIGFscmVhZHkgc2V0CisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgICAgIHNlbGYuc2ltdWxhdGVfY2FsbChjbWQpCisKKyAgICBjbGFzcyBmYWtlX2NvZGU6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbmFtZSwgbGluZSwgbmFtZSk6CisgICAgICAgICAgICBzZWxmLmNvX2ZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgICAgIHNlbGYuY29fbGluZSA9IGxpbmUKKyAgICAgICAgICAgIHNlbGYuY29fbmFtZSA9IG5hbWUKKyAgICAgICAgICAgIHNlbGYuY29fZmlyc3RsaW5lbm8gPSAwCisKKyAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHJlcHIoKHNlbGYuY29fZmlsZW5hbWUsIHNlbGYuY29fbGluZSwgc2VsZi5jb19uYW1lKSkKKworICAgIGNsYXNzIGZha2VfZnJhbWU6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlLCBwcmlvcik6CisgICAgICAgICAgICBzZWxmLmZfY29kZSA9IGNvZGUKKyAgICAgICAgICAgIHNlbGYuZl9iYWNrID0gcHJpb3IKKworICAgIGRlZiBzaW11bGF0ZV9jYWxsKHNlbGYsIG5hbWUpOgorICAgICAgICBjb2RlID0gc2VsZi5mYWtlX2NvZGUoJ3Byb2ZpbGUnLCAwLCBuYW1lKQorICAgICAgICBpZiBzZWxmLmN1cjoKKyAgICAgICAgICAgIHBmcmFtZSA9IHNlbGYuY3VyWy0yXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGZyYW1lID0gTm9uZQorICAgICAgICBmcmFtZSA9IHNlbGYuZmFrZV9mcmFtZShjb2RlLCBwZnJhbWUpCisgICAgICAgIHNlbGYuZGlzcGF0Y2hbJ2NhbGwnXShzZWxmLCBmcmFtZSwgMCkKKworICAgICMgY29sbGVjdCBzdGF0cyBmcm9tIHBlbmRpbmcgc3RhY2ssIGluY2x1ZGluZyBnZXR0aW5nIGZpbmFsCisgICAgIyB0aW1pbmdzIGZvciBzZWxmLmNtZCBmcmFtZS4KKworICAgIGRlZiBzaW11bGF0ZV9jbWRfY29tcGxldGUoc2VsZik6CisgICAgICAgIGdldF90aW1lID0gc2VsZi5nZXRfdGltZQorICAgICAgICB0ID0gZ2V0X3RpbWUoKSAtIHNlbGYudAorICAgICAgICB3aGlsZSBzZWxmLmN1clstMV06CisgICAgICAgICAgICAjIFdlICpjYW4qIGNhdXNlIGFzc2VydGlvbiBlcnJvcnMgaGVyZSBpZgorICAgICAgICAgICAgIyBkaXNwYXRjaF90cmFjZV9yZXR1cm4gY2hlY2tzIGZvciBhIGZyYW1lIG1hdGNoIQorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaFsncmV0dXJuJ10oc2VsZiwgc2VsZi5jdXJbLTJdLCB0KQorICAgICAgICAgICAgdCA9IDAKKyAgICAgICAgc2VsZi50ID0gZ2V0X3RpbWUoKSAtIHQKKworCisgICAgZGVmIHByaW50X3N0YXRzKHNlbGYsIHNvcnQ9LTEpOgorICAgICAgICBpbXBvcnQgcHN0YXRzCisgICAgICAgIHBzdGF0cy5TdGF0cyhzZWxmKS5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cyhzb3J0KS4gXAorICAgICAgICAgICAgICAgICAgcHJpbnRfc3RhdHMoKQorCisgICAgZGVmIGR1bXBfc3RhdHMoc2VsZiwgZmlsZSk6CisgICAgICAgIGYgPSBvcGVuKGZpbGUsICd3YicpCisgICAgICAgIHNlbGYuY3JlYXRlX3N0YXRzKCkKKyAgICAgICAgbWFyc2hhbC5kdW1wKHNlbGYuc3RhdHMsIGYpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGNyZWF0ZV9zdGF0cyhzZWxmKToKKyAgICAgICAgc2VsZi5zaW11bGF0ZV9jbWRfY29tcGxldGUoKQorICAgICAgICBzZWxmLnNuYXBzaG90X3N0YXRzKCkKKworICAgIGRlZiBzbmFwc2hvdF9zdGF0cyhzZWxmKToKKyAgICAgICAgc2VsZi5zdGF0cyA9IHt9CisgICAgICAgIGZvciBmdW5jLCAoY2MsIG5zLCB0dCwgY3QsIGNhbGxlcnMpIGluIHNlbGYudGltaW5ncy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGNhbGxlcnMgPSBjYWxsZXJzLmNvcHkoKQorICAgICAgICAgICAgbmMgPSAwCisgICAgICAgICAgICBmb3IgY2FsbGNudCBpbiBjYWxsZXJzLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBuYyArPSBjYWxsY250CisgICAgICAgICAgICBzZWxmLnN0YXRzW2Z1bmNdID0gY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMKKworCisgICAgIyBUaGUgZm9sbG93aW5nIHR3byBtZXRob2RzIGNhbiBiZSBjYWxsZWQgYnkgY2xpZW50cyB0byB1c2UKKyAgICAjIGEgcHJvZmlsZXIgdG8gcHJvZmlsZSBhIHN0YXRlbWVudCwgZ2l2ZW4gYXMgYSBzdHJpbmcuCisKKyAgICBkZWYgcnVuKHNlbGYsIGNtZCk6CisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBkaWN0ID0gX19tYWluX18uX19kaWN0X18KKyAgICAgICAgcmV0dXJuIHNlbGYucnVuY3R4KGNtZCwgZGljdCwgZGljdCkKKworICAgIGRlZiBydW5jdHgoc2VsZiwgY21kLCBnbG9iYWxzLCBsb2NhbHMpOgorICAgICAgICBzZWxmLnNldF9jbWQoY21kKQorICAgICAgICBzeXMuc2V0cHJvZmlsZShzZWxmLmRpc3BhdGNoZXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgY21kIGluIGdsb2JhbHMsIGxvY2FscworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnNldHByb2ZpbGUoTm9uZSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICMgVGhpcyBtZXRob2QgaXMgbW9yZSB1c2VmdWwgdG8gcHJvZmlsZSBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgorICAgIGRlZiBydW5jYWxsKHNlbGYsIGZ1bmMsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5zZXRfY21kKHJlcHIoZnVuYykpCisgICAgICAgIHN5cy5zZXRwcm9maWxlKHNlbGYuZGlzcGF0Y2hlcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc2V0cHJvZmlsZShOb25lKQorCisKKyAgICAjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgIyBUaGUgZm9sbG93aW5nIGNhbGN1bGF0ZXMgdGhlIG92ZXJoZWFkIGZvciB1c2luZyBhIHByb2ZpbGVyLiAgVGhlCisgICAgIyBwcm9ibGVtIGlzIHRoYXQgaXQgdGFrZXMgYSBmYWlyIGFtb3VudCBvZiB0aW1lIGZvciB0aGUgcHJvZmlsZXIKKyAgICAjIHRvIHN0b3AgdGhlIHN0b3B3YXRjaCAoZnJvbSB0aGUgdGltZSBpdCByZWNlaXZlcyBhbiBldmVudCkuCisgICAgIyBTaW1pbGFybHksIHRoZXJlIGlzIGEgZGVsYXkgZnJvbSB0aGUgdGltZSB0aGF0IHRoZSBwcm9maWxlcgorICAgICMgcmUtc3RhcnRzIHRoZSBzdG9wd2F0Y2ggYmVmb3JlIHRoZSB1c2VyJ3MgY29kZSByZWFsbHkgZ2V0cyB0bworICAgICMgY29udGludWUuICBUaGUgZm9sbG93aW5nIGNvZGUgdHJpZXMgdG8gbWVhc3VyZSB0aGUgZGlmZmVyZW5jZSBvbgorICAgICMgYSBwZXItZXZlbnQgYmFzaXMuCisgICAgIworICAgICMgTm90ZSB0aGF0IHRoaXMgZGlmZmVyZW5jZSBpcyBvbmx5IHNpZ25pZmljYW50IGlmIHRoZXJlIGFyZSBhIGxvdCBvZgorICAgICMgZXZlbnRzLCBhbmQgcmVsYXRpdmVseSBsaXR0bGUgdXNlciBjb2RlIHBlciBldmVudC4gIEZvciBleGFtcGxlLAorICAgICMgY29kZSB3aXRoIHNtYWxsIGZ1bmN0aW9ucyB3aWxsIHR5cGljYWxseSBiZW5lZml0IGZyb20gaGF2aW5nIHRoZQorICAgICMgcHJvZmlsZXIgY2FsaWJyYXRlZCBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBUaGlzICpjb3VsZCogYmUKKyAgICAjIGRvbmUgb24gdGhlIGZseSBkdXJpbmcgaW5pdCgpIHRpbWUsIGJ1dCBpdCBpcyBub3Qgd29ydGggdGhlCisgICAgIyBlZmZvcnQuICBBbHNvIG5vdGUgdGhhdCBpZiB0b28gbGFyZ2UgYSB2YWx1ZSBzcGVjaWZpZWQsIHRoZW4KKyAgICAjIGV4ZWN1dGlvbiB0aW1lIG9uIHNvbWUgZnVuY3Rpb25zIHdpbGwgYWN0dWFsbHkgYXBwZWFyIGFzIGEKKyAgICAjIG5lZ2F0aXZlIG51bWJlci4gIEl0IGlzICpub3JtYWwqIGZvciBzb21lIGZ1bmN0aW9ucyAod2l0aCB2ZXJ5CisgICAgIyBsb3cgY2FsbCBjb3VudHMpIHRvIGhhdmUgc3VjaCBuZWdhdGl2ZSBzdGF0cywgZXZlbiBpZiB0aGUKKyAgICAjIGNhbGlicmF0aW9uIGZpZ3VyZSBpcyAiY29ycmVjdC4iCisgICAgIworICAgICMgT25lIGFsdGVybmF0aXZlIHRvIHByb2ZpbGUtdGltZSBjYWxpYnJhdGlvbiBhZGp1c3RtZW50cyAoaS5lLiwKKyAgICAjIGFkZGluZyBpbiB0aGUgbWFnaWMgbGl0dGxlIGRlbHRhIGR1cmluZyBlYWNoIGV2ZW50KSBpcyB0byB0cmFjaworICAgICMgbW9yZSBjYXJlZnVsbHkgdGhlIG51bWJlciBvZiBldmVudHMgKGFuZCBjdW11bGF0aXZlbHksIHRoZSBudW1iZXIKKyAgICAjIG9mIGV2ZW50cyBkdXJpbmcgc3ViIGZ1bmN0aW9ucykgdGhhdCBhcmUgc2Vlbi4gIElmIHRoaXMgd2VyZQorICAgICMgZG9uZSwgdGhlbiB0aGUgYXJpdGhtZXRpYyBjb3VsZCBiZSBkb25lIGFmdGVyIHRoZSBmYWN0IChpLmUuLCBhdAorICAgICMgZGlzcGxheSB0aW1lKS4gIEN1cnJlbnRseSwgd2UgdHJhY2sgb25seSBjYWxsL3JldHVybiBldmVudHMuCisgICAgIyBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRlZHVjZWQgYnkgZXhhbWluaW5nIHRoZSBjYWxsZWVzIGFuZCBjYWxsZXJzCisgICAgIyB2ZWN0b3JzIGZvciBlYWNoIGZ1bmN0aW9ucy4gIEhlbmNlIHdlICpjYW4qIGFsbW9zdCBjb3JyZWN0IHRoZQorICAgICMgaW50ZXJuYWwgdGltZSBmaWd1cmUgYXQgcHJpbnQgdGltZSAobm90ZSB0aGF0IHdlIGN1cnJlbnRseSBkb24ndAorICAgICMgdHJhY2sgZXhjZXB0aW9uIGV2ZW50IHByb2Nlc3NpbmcgY291bnRzKS4gIFVuZm9ydHVuYXRlbHksIHRoZXJlCisgICAgIyBpcyBjdXJyZW50bHkgbm8gc2ltaWxhciBpbmZvcm1hdGlvbiBmb3IgY3VtdWxhdGl2ZSBzdWItZnVuY3Rpb24KKyAgICAjIHRpbWUuICBJdCB3b3VsZCBub3QgYmUgaGFyZCB0byAiZ2V0IGFsbCB0aGlzIGluZm8iIGF0IHByb2ZpbGVyCisgICAgIyB0aW1lLiAgU3BlY2lmaWNhbGx5LCB3ZSB3b3VsZCBoYXZlIHRvIGV4dGVuZCB0aGUgdHVwbGVzIHRvIGtlZXAKKyAgICAjIGNvdW50cyBvZiB0aGlzIGluIGVhY2ggZnJhbWUsIGFuZCB0aGVuIGV4dGVuZCB0aGUgZGVmcyBvZiB0aW1pbmcKKyAgICAjIHR1cGxlcyB0byBpbmNsdWRlIHRoZSBzaWduaWZpY2FudCB0d28gZmlndXJlcy4gSSdtIGEgYml0IGZlYXJmdWwKKyAgICAjIHRoYXQgdGhpcyBhZGRpdGlvbmFsIGZlYXR1cmUgd2lsbCBzbG93IHRoZSBoZWF2aWx5IG9wdGltaXplZAorICAgICMgZXZlbnQvdGltZSByYXRpbyAoaS5lLiwgdGhlIHByb2ZpbGVyIHdvdWxkIHJ1biBzbG93ZXIsIGZ1ciBhIHZlcnkKKyAgICAjIGxvdyAidmFsdWUgYWRkZWQiIGZlYXR1cmUuKQorICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisgICAgZGVmIGNhbGlicmF0ZShzZWxmLCBtLCB2ZXJib3NlPTApOgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyBpcyBub3QgUHJvZmlsZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIC5jYWxpYnJhdGUoKS4iKQorCisgICAgICAgIHNhdmVkX2JpYXMgPSBzZWxmLmJpYXMKKyAgICAgICAgc2VsZi5iaWFzID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2FsaWJyYXRlX2lubmVyKG0sIHZlcmJvc2UpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmJpYXMgPSBzYXZlZF9iaWFzCisKKyAgICBkZWYgX2NhbGlicmF0ZV9pbm5lcihzZWxmLCBtLCB2ZXJib3NlKToKKyAgICAgICAgZ2V0X3RpbWUgPSBzZWxmLmdldF90aW1lCisKKyAgICAgICAgIyBTZXQgdXAgYSB0ZXN0IGNhc2UgdG8gYmUgcnVuIHdpdGggYW5kIHdpdGhvdXQgcHJvZmlsaW5nLiAgSW5jbHVkZQorICAgICAgICAjIGxvdHMgb2YgY2FsbHMsIGJlY2F1c2Ugd2UncmUgdHJ5aW5nIHRvIHF1YW50aWZ5IHN0b3B3YXRjaCBvdmVyaGVhZC4KKyAgICAgICAgIyBEbyBub3QgcmFpc2UgYW55IGV4Y2VwdGlvbnMsIHRob3VnaCwgYmVjYXVzZSB3ZSB3YW50IHRvIGtub3cKKyAgICAgICAgIyBleGFjdGx5IGhvdyBtYW55IHByb2ZpbGUgZXZlbnRzIGFyZSBnZW5lcmF0ZWQgKG9uZSBjYWxsIGV2ZW50LCArCisgICAgICAgICMgb25lIHJldHVybiBldmVudCwgcGVyIFB5dGhvbi1sZXZlbCBjYWxsKS4KKworICAgICAgICBkZWYgZjEobik6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgICAgICB4ID0gMQorCisgICAgICAgIGRlZiBmKG0sIGYxPWYxKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG0pOgorICAgICAgICAgICAgICAgIGYxKDEwMCkKKworICAgICAgICBmKG0pICAgICMgd2FybSB1cCB0aGUgY2FjaGUKKworICAgICAgICAjIGVsYXBzZWRfbm9wcm9maWxlIDwtIHRpbWUgZihtKSB0YWtlcyB3aXRob3V0IHByb2ZpbGluZy4KKyAgICAgICAgdDAgPSBnZXRfdGltZSgpCisgICAgICAgIGYobSkKKyAgICAgICAgdDEgPSBnZXRfdGltZSgpCisgICAgICAgIGVsYXBzZWRfbm9wcm9maWxlID0gdDEgLSB0MAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImVsYXBzZWQgdGltZSB3aXRob3V0IHByb2ZpbGluZyA9IiwgZWxhcHNlZF9ub3Byb2ZpbGUKKworICAgICAgICAjIGVsYXBzZWRfcHJvZmlsZSA8LSB0aW1lIGYobSkgdGFrZXMgd2l0aCBwcm9maWxpbmcuICBUaGUgZGlmZmVyZW5jZQorICAgICAgICAjIGlzIHByb2ZpbGluZyBvdmVyaGVhZCwgb25seSBzb21lIG9mIHdoaWNoIHRoZSBwcm9maWxlciBzdWJ0cmFjdHMKKyAgICAgICAgIyBvdXQgb24gaXRzIG93bi4KKyAgICAgICAgcCA9IFByb2ZpbGUoKQorICAgICAgICB0MCA9IGdldF90aW1lKCkKKyAgICAgICAgcC5ydW5jdHgoJ2YobSknLCBnbG9iYWxzKCksIGxvY2FscygpKQorICAgICAgICB0MSA9IGdldF90aW1lKCkKKyAgICAgICAgZWxhcHNlZF9wcm9maWxlID0gdDEgLSB0MAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImVsYXBzZWQgdGltZSB3aXRoIHByb2ZpbGluZyA9IiwgZWxhcHNlZF9wcm9maWxlCisKKyAgICAgICAgIyByZXBvcnRlZF90aW1lIDwtICJDUFUgc2Vjb25kcyIgdGhlIHByb2ZpbGVyIGNoYXJnZWQgdG8gZiBhbmQgZjEuCisgICAgICAgIHRvdGFsX2NhbGxzID0gMC4wCisgICAgICAgIHJlcG9ydGVkX3RpbWUgPSAwLjAKKyAgICAgICAgZm9yIChmaWxlbmFtZSwgbGluZSwgZnVuY25hbWUpLCAoY2MsIG5zLCB0dCwgY3QsIGNhbGxlcnMpIGluIFwKKyAgICAgICAgICAgICAgICBwLnRpbWluZ3MuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGZ1bmNuYW1lIGluICgiZiIsICJmMSIpOgorICAgICAgICAgICAgICAgIHRvdGFsX2NhbGxzICs9IGNjCisgICAgICAgICAgICAgICAgcmVwb3J0ZWRfdGltZSArPSB0dAorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJ0NQVSBzZWNvbmRzJyBwcm9maWxlciByZXBvcnRlZCA9IiwgcmVwb3J0ZWRfdGltZQorICAgICAgICAgICAgcHJpbnQgInRvdGFsICMgY2FsbHMgPSIsIHRvdGFsX2NhbGxzCisgICAgICAgIGlmIHRvdGFsX2NhbGxzICE9IG0gKyAxOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW50ZXJuYWwgZXJyb3I6IHRvdGFsIGNhbGxzID0gJWQiICUgdG90YWxfY2FsbHMpCisKKyAgICAgICAgIyByZXBvcnRlZF90aW1lIC0gZWxhcHNlZF9ub3Byb2ZpbGUgPSBvdmVyaGVhZCB0aGUgcHJvZmlsZXIgd2Fzbid0CisgICAgICAgICMgYWJsZSB0byBtZWFzdXJlLiAgRGl2aWRlIGJ5IHR3aWNlIHRoZSBudW1iZXIgb2YgY2FsbHMgKHNpbmNlIHRoZXJlCisgICAgICAgICMgYXJlIHR3byBwcm9maWxlciBldmVudHMgcGVyIGNhbGwgaW4gdGhpcyB0ZXN0KSB0byBnZXQgdGhlIGhpZGRlbgorICAgICAgICAjIG92ZXJoZWFkIHBlciBldmVudC4KKyAgICAgICAgbWVhbiA9IChyZXBvcnRlZF90aW1lIC0gZWxhcHNlZF9ub3Byb2ZpbGUpIC8gMi4wIC8gdG90YWxfY2FsbHMKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJtZWFuIHN0b3B3YXRjaCBvdmVyaGVhZCBwZXIgcHJvZmlsZSBldmVudCA9IiwgbWVhbgorICAgICAgICByZXR1cm4gbWVhbgorCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorZGVmIFN0YXRzKCphcmdzKToKKyAgICBwcmludCAnUmVwb3J0IGdlbmVyYXRpbmcgZnVuY3Rpb25zIGFyZSBpbiB0aGUgInBzdGF0cyIgbW9kdWxlXGEnCisKK2RlZiBtYWluKCk6CisgICAgdXNhZ2UgPSAicHJvZmlsZS5weSBbLW8gb3V0cHV0X2ZpbGVfcGF0aF0gWy1zIHNvcnRdIHNjcmlwdGZpbGUgW2FyZ10gLi4uIgorICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT11c2FnZSkKKyAgICBwYXJzZXIuYWxsb3dfaW50ZXJzcGVyc2VkX2FyZ3MgPSBGYWxzZQorICAgIHBhcnNlci5hZGRfb3B0aW9uKCctbycsICctLW91dGZpbGUnLCBkZXN0PSJvdXRmaWxlIiwKKyAgICAgICAgaGVscD0iU2F2ZSBzdGF0cyB0byA8b3V0ZmlsZT4iLCBkZWZhdWx0PU5vbmUpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1zJywgJy0tc29ydCcsIGRlc3Q9InNvcnQiLAorICAgICAgICBoZWxwPSJTb3J0IG9yZGVyIHdoZW4gcHJpbnRpbmcgdG8gc3Rkb3V0LCBiYXNlZCBvbiBwc3RhdHMuU3RhdHMgY2xhc3MiLAorICAgICAgICBkZWZhdWx0PS0xKQorCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgcGFyc2VyLnByaW50X3VzYWdlKCkKKyAgICAgICAgc3lzLmV4aXQoMikKKworICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBzeXMuYXJndls6XSA9IGFyZ3MKKworICAgIGlmIGxlbihhcmdzKSA+IDA6CisgICAgICAgIHByb2duYW1lID0gYXJnc1swXQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKHByb2duYW1lKSkKKyAgICAgICAgd2l0aCBvcGVuKHByb2duYW1lLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGZwLnJlYWQoKSwgcHJvZ25hbWUsICdleGVjJykKKyAgICAgICAgZ2xvYnMgPSB7CisgICAgICAgICAgICAnX19maWxlX18nOiBwcm9nbmFtZSwKKyAgICAgICAgICAgICdfX25hbWVfXyc6ICdfX21haW5fXycsCisgICAgICAgICAgICAnX19wYWNrYWdlX18nOiBOb25lLAorICAgICAgICB9CisgICAgICAgIHJ1bmN0eChjb2RlLCBnbG9icywgTm9uZSwgb3B0aW9ucy5vdXRmaWxlLCBvcHRpb25zLnNvcnQpCisgICAgZWxzZToKKyAgICAgICAgcGFyc2VyLnByaW50X3VzYWdlKCkKKyAgICByZXR1cm4gcGFyc2VyCisKKyMgV2hlbiBpbnZva2VkIGFzIG1haW4gcHJvZ3JhbSwgaW52b2tlIHRoZSBwcm9maWxlciBvbiBhIHNjcmlwdAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHJvZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Byb2ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYTQyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Byb2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHJvZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Byb2ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNmZkYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Byb2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHN0YXRzLnB5IGIvbGliL3B5dGhvbjIuNy9wc3RhdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMzODk5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHN0YXRzLnB5CkBAIC0wLDAgKzEsNzA1IEBACisiIiJDbGFzcyBmb3IgcHJpbnRpbmcgcmVwb3J0cyBvbiBwcm9maWxlZCBweXRob24gY29kZS4iIiIKKworIyBXcml0dGVuIGJ5IEphbWVzIFJvc2tpbmQKKyMgQmFzZWQgb24gcHJpb3IgcHJvZmlsZSBtb2R1bGUgYnkgU2pvZXJkIE11bGxlbmRlci4uLgorIyAgIHdoaWNoIHdhcyBoYWNrZWQgc29tZXdoYXQgYnk6IEd1aWRvIHZhbiBSb3NzdW0KKworIyBDb3B5cmlnaHQgRGlzbmV5IEVudGVycHJpc2VzLCBJbmMuICBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAorIyBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UKKyMgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IHJlCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgY21wX3RvX2tleQorCitfX2FsbF9fID0gWyJTdGF0cyJdCisKK2NsYXNzIFN0YXRzOgorICAgICIiIlRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgY3JlYXRpbmcgcmVwb3J0cyBmcm9tIGRhdGEgZ2VuZXJhdGVkIGJ5IHRoZQorICAgIFByb2ZpbGUgY2xhc3MuICBJdCBpcyBhICJmcmllbmQiIG9mIHRoYXQgY2xhc3MsIGFuZCBpbXBvcnRzIGRhdGEgZWl0aGVyCisgICAgYnkgZGlyZWN0IGFjY2VzcyB0byBtZW1iZXJzIG9mIFByb2ZpbGUgY2xhc3MsIG9yIGJ5IHJlYWRpbmcgaW4gYSBkaWN0aW9uYXJ5CisgICAgdGhhdCB3YXMgZW1pdHRlZCAodmlhIG1hcnNoYWwpIGZyb20gdGhlIFByb2ZpbGUgY2xhc3MuCisKKyAgICBUaGUgYmlnIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyBQcm9maWxlciAoaW4gdGVybXMgb2YgcmF3IGZ1bmN0aW9uYWxpdHkpCisgICAgaXMgdGhhdCBhbiAiYWRkKCkiIG1ldGhvZCBoYXMgYmVlbiBwcm92aWRlZCB0byBjb21iaW5lIFN0YXRzIGZyb20KKyAgICBzZXZlcmFsIGRpc3RpbmN0IHByb2ZpbGUgcnVucy4gIEJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGUgYWRkKCkKKyAgICBtZXRob2Qgbm93IHRha2UgYXJiaXRyYXJpbHkgbWFueSBmaWxlIG5hbWVzIGFzIGFyZ3VtZW50cy4KKworICAgIEFsbCB0aGUgcHJpbnQgbWV0aG9kcyBub3cgdGFrZSBhbiBhcmd1bWVudCB0aGF0IGluZGljYXRlcyBob3cgbWFueSBsaW5lcworICAgIHRvIHByaW50LiAgSWYgdGhlIGFyZyBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuMCwgdGhlbgorICAgIGl0IGlzIHRha2VuIGFzIGEgZGVjaW1hbCBwZXJjZW50YWdlIG9mIHRoZSBhdmFpbGFibGUgbGluZXMgdG8gYmUgcHJpbnRlZAorICAgIChlLmcuLCAuMSBtZWFucyBwcmludCAxMCUgb2YgYWxsIGF2YWlsYWJsZSBsaW5lcykuICBJZiBpdCBpcyBhbiBpbnRlZ2VyLAorICAgIGl0IGlzIHRha2VuIHRvIG1lYW4gdGhlIG51bWJlciBvZiBsaW5lcyBvZiBkYXRhIHRoYXQgeW91IHdpc2ggdG8gaGF2ZQorICAgIHByaW50ZWQuCisKKyAgICBUaGUgc29ydF9zdGF0cygpIG1ldGhvZCBub3cgcHJvY2Vzc2VzIHNvbWUgYWRkaXRpb25hbCBvcHRpb25zIChpLmUuLCBpbgorICAgIGFkZGl0aW9uIHRvIHRoZSBvbGQgLTEsIDAsIDEsIG9yIDIpLiAgSXQgdGFrZXMgYW4gYXJiaXRyYXJ5IG51bWJlciBvZgorICAgIHF1b3RlZCBzdHJpbmdzIHRvIHNlbGVjdCB0aGUgc29ydCBvcmRlci4gIEZvciBleGFtcGxlIHNvcnRfc3RhdHMoJ3RpbWUnLAorICAgICduYW1lJykgc29ydHMgb24gdGhlIG1ham9yIGtleSBvZiAnaW50ZXJuYWwgZnVuY3Rpb24gdGltZScsIGFuZCBvbiB0aGUKKyAgICBtaW5vciBrZXkgb2YgJ3RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbicuICBMb29rIGF0IHRoZSB0d28gdGFibGVzIGluCisgICAgc29ydF9zdGF0cygpIGFuZCBnZXRfc29ydF9hcmdfZGVmcyhzZWxmKSBmb3IgbW9yZSBleGFtcGxlcy4KKworICAgIEFsbCBtZXRob2RzIHJldHVybiBzZWxmLCBzbyB5b3UgY2FuIHN0cmluZyB0b2dldGhlciBjb21tYW5kcyBsaWtlOgorICAgICAgICBTdGF0cygnZm9vJywgJ2dvbycpLnN0cmlwX2RpcnMoKS5zb3J0X3N0YXRzKCdjYWxscycpLlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9zdGF0cyg1KS5wcmludF9jYWxsZXJzKDUpCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICMgSSBjYW4ndCBmaWd1cmUgb3V0IGhvdyB0byBleHBsaWN0bHkgc3BlY2lmeSBhIHN0cmVhbSBrZXl3b3JkIGFyZworICAgICAgICAjIHdpdGggKmFyZ3M6CisgICAgICAgICMgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsIHN0cmVhbT1zeXMuc3Rkb3V0KTogLi4uCisgICAgICAgICMgc28gSSB1c2UgKiprd2RzIGFuZCBzcWF1d2sgaWYgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaXMgcGFzc2VkIGluLgorICAgICAgICBzZWxmLnN0cmVhbSA9IHN5cy5zdGRvdXQKKyAgICAgICAgaWYgInN0cmVhbSIgaW4ga3dkczoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0ga3dkc1sic3RyZWFtIl0KKyAgICAgICAgICAgIGRlbCBrd2RzWyJzdHJlYW0iXQorICAgICAgICBpZiBrd2RzOgorICAgICAgICAgICAga2V5cyA9IGt3ZHMua2V5cygpCisgICAgICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICAgICAgZXh0cmFzID0gIiwgIi5qb2luKFsiJXM9JXMiICUgKGssIGt3ZHNba10pIGZvciBrIGluIGtleXNdKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVucmVjb2duaXplZCBrZXl3b3JkIGFyZ3M6ICVzIiAlIGV4dHJhcworICAgICAgICBpZiBub3QgbGVuKGFyZ3MpOgorICAgICAgICAgICAgYXJnID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnID0gYXJnc1swXQorICAgICAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisgICAgICAgIHNlbGYuaW5pdChhcmcpCisgICAgICAgIHNlbGYuYWRkKCphcmdzKQorCisgICAgZGVmIGluaXQoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5hbGxfY2FsbGVlcyA9IE5vbmUgICMgY2FsYyBvbmx5IGlmIG5lZWRlZAorICAgICAgICBzZWxmLmZpbGVzID0gW10KKyAgICAgICAgc2VsZi5mY25fbGlzdCA9IE5vbmUKKyAgICAgICAgc2VsZi50b3RhbF90dCA9IDAKKyAgICAgICAgc2VsZi50b3RhbF9jYWxscyA9IDAKKyAgICAgICAgc2VsZi5wcmltX2NhbGxzID0gMAorICAgICAgICBzZWxmLm1heF9uYW1lX2xlbiA9IDAKKyAgICAgICAgc2VsZi50b3BfbGV2ZWwgPSB7fQorICAgICAgICBzZWxmLnN0YXRzID0ge30KKyAgICAgICAgc2VsZi5zb3J0X2FyZ19kaWN0ID0ge30KKyAgICAgICAgc2VsZi5sb2FkX3N0YXRzKGFyZykKKyAgICAgICAgdHJvdWJsZSA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5nZXRfdG9wX2xldmVsX3N0YXRzKCkKKyAgICAgICAgICAgIHRyb3VibGUgPSAwCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiB0cm91YmxlOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiSW52YWxpZCB0aW1pbmcgZGF0YSIsCisgICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlczogcHJpbnQgPj4gc2VsZi5zdHJlYW0sIHNlbGYuZmlsZXNbLTFdLAorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisKKyAgICBkZWYgbG9hZF9zdGF0cyhzZWxmLCBhcmcpOgorICAgICAgICBpZiBub3QgYXJnOiAgc2VsZi5zdGF0cyA9IHt9CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShhcmcsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgZiA9IG9wZW4oYXJnLCAncmInKQorICAgICAgICAgICAgc2VsZi5zdGF0cyA9IG1hcnNoYWwubG9hZChmKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlsZV9zdGF0cyA9IG9zLnN0YXQoYXJnKQorICAgICAgICAgICAgICAgIGFyZyA9IHRpbWUuY3RpbWUoZmlsZV9zdGF0cy5zdF9tdGltZSkgKyAiICAgICIgKyBhcmcKKyAgICAgICAgICAgIGV4Y2VwdDogICMgaW4gY2FzZSB0aGlzIGlzIG5vdCB1bml4CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5maWxlcyA9IFsgYXJnIF0KKyAgICAgICAgZWxpZiBoYXNhdHRyKGFyZywgJ2NyZWF0ZV9zdGF0cycpOgorICAgICAgICAgICAgYXJnLmNyZWF0ZV9zdGF0cygpCisgICAgICAgICAgICBzZWxmLnN0YXRzID0gYXJnLnN0YXRzCisgICAgICAgICAgICBhcmcuc3RhdHMgPSB7fQorICAgICAgICBpZiBub3Qgc2VsZi5zdGF0czoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiQ2Fubm90IGNyZWF0ZSBvciBjb25zdHJ1Y3QgYSAlciBvYmplY3QgZnJvbSAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLl9fY2xhc3NfXywgYXJnKSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZ2V0X3RvcF9sZXZlbF9zdGF0cyhzZWxmKToKKyAgICAgICAgZm9yIGZ1bmMsIChjYywgbmMsIHR0LCBjdCwgY2FsbGVycykgaW4gc2VsZi5zdGF0cy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi50b3RhbF9jYWxscyArPSBuYworICAgICAgICAgICAgc2VsZi5wcmltX2NhbGxzICArPSBjYworICAgICAgICAgICAgc2VsZi50b3RhbF90dCAgICArPSB0dAorICAgICAgICAgICAgaWYgKCJqcHJvZmlsZSIsIDAsICJwcm9maWxlciIpIGluIGNhbGxlcnM6CisgICAgICAgICAgICAgICAgc2VsZi50b3BfbGV2ZWxbZnVuY10gPSBOb25lCisgICAgICAgICAgICBpZiBsZW4oZnVuY19zdGRfc3RyaW5nKGZ1bmMpKSA+IHNlbGYubWF4X25hbWVfbGVuOgorICAgICAgICAgICAgICAgIHNlbGYubWF4X25hbWVfbGVuID0gbGVuKGZ1bmNfc3RkX3N0cmluZyhmdW5jKSkKKworICAgIGRlZiBhZGQoc2VsZiwgKmFyZ19saXN0KToKKyAgICAgICAgaWYgbm90IGFyZ19saXN0OiByZXR1cm4gc2VsZgorICAgICAgICBpZiBsZW4oYXJnX2xpc3QpID4gMTogc2VsZi5hZGQoKmFyZ19saXN0WzE6XSkKKyAgICAgICAgb3RoZXIgPSBhcmdfbGlzdFswXQorICAgICAgICBpZiB0eXBlKHNlbGYpICE9IHR5cGUob3RoZXIpIG9yIHNlbGYuX19jbGFzc19fICE9IG90aGVyLl9fY2xhc3NfXzoKKyAgICAgICAgICAgIG90aGVyID0gU3RhdHMob3RoZXIpCisgICAgICAgIHNlbGYuZmlsZXMgKz0gb3RoZXIuZmlsZXMKKyAgICAgICAgc2VsZi50b3RhbF9jYWxscyArPSBvdGhlci50b3RhbF9jYWxscworICAgICAgICBzZWxmLnByaW1fY2FsbHMgKz0gb3RoZXIucHJpbV9jYWxscworICAgICAgICBzZWxmLnRvdGFsX3R0ICs9IG90aGVyLnRvdGFsX3R0CisgICAgICAgIGZvciBmdW5jIGluIG90aGVyLnRvcF9sZXZlbDoKKyAgICAgICAgICAgIHNlbGYudG9wX2xldmVsW2Z1bmNdID0gTm9uZQorCisgICAgICAgIGlmIHNlbGYubWF4X25hbWVfbGVuIDwgb3RoZXIubWF4X25hbWVfbGVuOgorICAgICAgICAgICAgc2VsZi5tYXhfbmFtZV9sZW4gPSBvdGhlci5tYXhfbmFtZV9sZW4KKworICAgICAgICBzZWxmLmZjbl9saXN0ID0gTm9uZQorCisgICAgICAgIGZvciBmdW5jLCBzdGF0IGluIG90aGVyLnN0YXRzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgZnVuYyBpbiBzZWxmLnN0YXRzOgorICAgICAgICAgICAgICAgIG9sZF9mdW5jX3N0YXQgPSBzZWxmLnN0YXRzW2Z1bmNdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9sZF9mdW5jX3N0YXQgPSAoMCwgMCwgMCwgMCwge30sKQorICAgICAgICAgICAgc2VsZi5zdGF0c1tmdW5jXSA9IGFkZF9mdW5jX3N0YXRzKG9sZF9mdW5jX3N0YXQsIHN0YXQpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgZHVtcF9zdGF0cyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgICIiIldyaXRlIHRoZSBwcm9maWxlIGRhdGEgdG8gYSBmaWxlIHdlIGtub3cgaG93IHRvIGxvYWQgYmFjay4iIiIKKyAgICAgICAgZiA9IGZpbGUoZmlsZW5hbWUsICd3YicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1hcnNoYWwuZHVtcChzZWxmLnN0YXRzLCBmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAjIGxpc3QgdGhlIHR1cGxlIGluZGljZXMgYW5kIGRpcmVjdGlvbnMgZm9yIHNvcnRpbmcsCisgICAgIyBhbG9uZyB3aXRoIHNvbWUgcHJpbnRhYmxlIGRlc2NyaXB0aW9uCisgICAgc29ydF9hcmdfZGljdF9kZWZhdWx0ID0geworICAgICAgICAgICAgICAiY2FsbHMiICAgICA6ICgoKDEsLTEpLCAgICAgICAgICAgICAgKSwgImNhbGwgY291bnQiKSwKKyAgICAgICAgICAgICAgIm5jYWxscyIgICAgOiAoKCgxLC0xKSwgICAgICAgICAgICAgICksICJjYWxsIGNvdW50IiksCisgICAgICAgICAgICAgICJjdW10aW1lIiAgIDogKCgoMywtMSksICAgICAgICAgICAgICApLCAiY3VtdWxhdGl2ZSB0aW1lIiksCisgICAgICAgICAgICAgICJjdW11bGF0aXZlIjogKCgoMywtMSksICAgICAgICAgICAgICApLCAiY3VtdWxhdGl2ZSB0aW1lIiksCisgICAgICAgICAgICAgICJmaWxlIiAgICAgIDogKCgoNCwgMSksICAgICAgICAgICAgICApLCAiZmlsZSBuYW1lIiksCisgICAgICAgICAgICAgICJmaWxlbmFtZSIgIDogKCgoNCwgMSksICAgICAgICAgICAgICApLCAiZmlsZSBuYW1lIiksCisgICAgICAgICAgICAgICJsaW5lIiAgICAgIDogKCgoNSwgMSksICAgICAgICAgICAgICApLCAibGluZSBudW1iZXIiKSwKKyAgICAgICAgICAgICAgIm1vZHVsZSIgICAgOiAoKCg0LCAxKSwgICAgICAgICAgICAgICksICJmaWxlIG5hbWUiKSwKKyAgICAgICAgICAgICAgIm5hbWUiICAgICAgOiAoKCg2LCAxKSwgICAgICAgICAgICAgICksICJmdW5jdGlvbiBuYW1lIiksCisgICAgICAgICAgICAgICJuZmwiICAgICAgIDogKCgoNiwgMSksKDQsIDEpLCg1LCAxKSwpLCAibmFtZS9maWxlL2xpbmUiKSwKKyAgICAgICAgICAgICAgInBjYWxscyIgICAgOiAoKCgwLC0xKSwgICAgICAgICAgICAgICksICJwcmltaXRpdmUgY2FsbCBjb3VudCIpLAorICAgICAgICAgICAgICAic3RkbmFtZSIgICA6ICgoKDcsIDEpLCAgICAgICAgICAgICAgKSwgInN0YW5kYXJkIG5hbWUiKSwKKyAgICAgICAgICAgICAgInRpbWUiICAgICAgOiAoKCgyLC0xKSwgICAgICAgICAgICAgICksICJpbnRlcm5hbCB0aW1lIiksCisgICAgICAgICAgICAgICJ0b3R0aW1lIiAgIDogKCgoMiwtMSksICAgICAgICAgICAgICApLCAiaW50ZXJuYWwgdGltZSIpLAorICAgICAgICAgICAgICB9CisKKyAgICBkZWYgZ2V0X3NvcnRfYXJnX2RlZnMoc2VsZik6CisgICAgICAgICIiIkV4cGFuZCBhbGwgYWJicmV2aWF0aW9ucyB0aGF0IGFyZSB1bmlxdWUuIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnNvcnRfYXJnX2RpY3Q6CisgICAgICAgICAgICBzZWxmLnNvcnRfYXJnX2RpY3QgPSBkaWN0ID0ge30KKyAgICAgICAgICAgIGJhZF9saXN0ID0ge30KKyAgICAgICAgICAgIGZvciB3b3JkLCB0dXAgaW4gc2VsZi5zb3J0X2FyZ19kaWN0X2RlZmF1bHQuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgZnJhZ21lbnQgPSB3b3JkCisgICAgICAgICAgICAgICAgd2hpbGUgZnJhZ21lbnQ6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBmcmFnbWVudDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGlmIGZyYWdtZW50IGluIGRpY3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBiYWRfbGlzdFtmcmFnbWVudF0gPSAwCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBkaWN0W2ZyYWdtZW50XSA9IHR1cAorICAgICAgICAgICAgICAgICAgICBmcmFnbWVudCA9IGZyYWdtZW50WzotMV0KKyAgICAgICAgICAgIGZvciB3b3JkIGluIGJhZF9saXN0OgorICAgICAgICAgICAgICAgIGRlbCBkaWN0W3dvcmRdCisgICAgICAgIHJldHVybiBzZWxmLnNvcnRfYXJnX2RpY3QKKworICAgIGRlZiBzb3J0X3N0YXRzKHNlbGYsICpmaWVsZCk6CisgICAgICAgIGlmIG5vdCBmaWVsZDoKKyAgICAgICAgICAgIHNlbGYuZmNuX2xpc3QgPSAwCisgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBpZiBsZW4oZmllbGQpID09IDEgYW5kIGlzaW5zdGFuY2UoZmllbGRbMF0sIChpbnQsIGxvbmcpKToKKyAgICAgICAgICAgICMgQmUgY29tcGF0aWJsZSB3aXRoIG9sZCBwcm9maWxlcgorICAgICAgICAgICAgZmllbGQgPSBbIHstMTogInN0ZG5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAwOiAgImNhbGxzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMTogICJ0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMjogICJjdW11bGF0aXZlIn1bZmllbGRbMF1dIF0KKworICAgICAgICBzb3J0X2FyZ19kZWZzID0gc2VsZi5nZXRfc29ydF9hcmdfZGVmcygpCisgICAgICAgIHNvcnRfdHVwbGUgPSAoKQorICAgICAgICBzZWxmLnNvcnRfdHlwZSA9ICIiCisgICAgICAgIGNvbm5lY3RvciA9ICIiCisgICAgICAgIGZvciB3b3JkIGluIGZpZWxkOgorICAgICAgICAgICAgc29ydF90dXBsZSA9IHNvcnRfdHVwbGUgKyBzb3J0X2FyZ19kZWZzW3dvcmRdWzBdCisgICAgICAgICAgICBzZWxmLnNvcnRfdHlwZSArPSBjb25uZWN0b3IgKyBzb3J0X2FyZ19kZWZzW3dvcmRdWzFdCisgICAgICAgICAgICBjb25uZWN0b3IgPSAiLCAiCisKKyAgICAgICAgc3RhdHNfbGlzdCA9IFtdCisgICAgICAgIGZvciBmdW5jLCAoY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMpIGluIHNlbGYuc3RhdHMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzdGF0c19saXN0LmFwcGVuZCgoY2MsIG5jLCB0dCwgY3QpICsgZnVuYyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZnVuY19zdGRfc3RyaW5nKGZ1bmMpLCBmdW5jKSkKKworICAgICAgICBzdGF0c19saXN0LnNvcnQoa2V5PWNtcF90b19rZXkoVHVwbGVDb21wKHNvcnRfdHVwbGUpLmNvbXBhcmUpKQorCisgICAgICAgIHNlbGYuZmNuX2xpc3QgPSBmY25fbGlzdCA9IFtdCisgICAgICAgIGZvciB0dXBsZSBpbiBzdGF0c19saXN0OgorICAgICAgICAgICAgZmNuX2xpc3QuYXBwZW5kKHR1cGxlWy0xXSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiByZXZlcnNlX29yZGVyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZjbl9saXN0OgorICAgICAgICAgICAgc2VsZi5mY25fbGlzdC5yZXZlcnNlKCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBzdHJpcF9kaXJzKHNlbGYpOgorICAgICAgICBvbGRzdGF0cyA9IHNlbGYuc3RhdHMKKyAgICAgICAgc2VsZi5zdGF0cyA9IG5ld3N0YXRzID0ge30KKyAgICAgICAgbWF4X25hbWVfbGVuID0gMAorICAgICAgICBmb3IgZnVuYywgKGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzKSBpbiBvbGRzdGF0cy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIG5ld2Z1bmMgPSBmdW5jX3N0cmlwX3BhdGgoZnVuYykKKyAgICAgICAgICAgIGlmIGxlbihmdW5jX3N0ZF9zdHJpbmcobmV3ZnVuYykpID4gbWF4X25hbWVfbGVuOgorICAgICAgICAgICAgICAgIG1heF9uYW1lX2xlbiA9IGxlbihmdW5jX3N0ZF9zdHJpbmcobmV3ZnVuYykpCisgICAgICAgICAgICBuZXdjYWxsZXJzID0ge30KKyAgICAgICAgICAgIGZvciBmdW5jMiwgY2FsbGVyIGluIGNhbGxlcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgbmV3Y2FsbGVyc1tmdW5jX3N0cmlwX3BhdGgoZnVuYzIpXSA9IGNhbGxlcgorCisgICAgICAgICAgICBpZiBuZXdmdW5jIGluIG5ld3N0YXRzOgorICAgICAgICAgICAgICAgIG5ld3N0YXRzW25ld2Z1bmNdID0gYWRkX2Z1bmNfc3RhdHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3c3RhdHNbbmV3ZnVuY10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNjLCBuYywgdHQsIGN0LCBuZXdjYWxsZXJzKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3c3RhdHNbbmV3ZnVuY10gPSAoY2MsIG5jLCB0dCwgY3QsIG5ld2NhbGxlcnMpCisgICAgICAgIG9sZF90b3AgPSBzZWxmLnRvcF9sZXZlbAorICAgICAgICBzZWxmLnRvcF9sZXZlbCA9IG5ld190b3AgPSB7fQorICAgICAgICBmb3IgZnVuYyBpbiBvbGRfdG9wOgorICAgICAgICAgICAgbmV3X3RvcFtmdW5jX3N0cmlwX3BhdGgoZnVuYyldID0gTm9uZQorCisgICAgICAgIHNlbGYubWF4X25hbWVfbGVuID0gbWF4X25hbWVfbGVuCisKKyAgICAgICAgc2VsZi5mY25fbGlzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5hbGxfY2FsbGVlcyA9IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBjYWxjX2NhbGxlZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYWxsX2NhbGxlZXM6IHJldHVybgorICAgICAgICBzZWxmLmFsbF9jYWxsZWVzID0gYWxsX2NhbGxlZXMgPSB7fQorICAgICAgICBmb3IgZnVuYywgKGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzKSBpbiBzZWxmLnN0YXRzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IGZ1bmMgaW4gYWxsX2NhbGxlZXM6CisgICAgICAgICAgICAgICAgYWxsX2NhbGxlZXNbZnVuY10gPSB7fQorICAgICAgICAgICAgZm9yIGZ1bmMyLCBjYWxsZXIgaW4gY2FsbGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgZnVuYzIgaW4gYWxsX2NhbGxlZXM6CisgICAgICAgICAgICAgICAgICAgIGFsbF9jYWxsZWVzW2Z1bmMyXSA9IHt9CisgICAgICAgICAgICAgICAgYWxsX2NhbGxlZXNbZnVuYzJdW2Z1bmNdICA9IGNhbGxlcgorICAgICAgICByZXR1cm4KKworICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHN1cHBvcnQgYWN0dWFsIHByaW50aW5nIG9mIHJlcG9ydHMKKyAgICAjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAjIE9wdGlvbmFsICJhbW91bnQiIGlzIGVpdGhlciBhIGxpbmUgY291bnQsIG9yIGEgcGVyY2VudGFnZSBvZiBsaW5lcy4KKworICAgIGRlZiBldmFsX3ByaW50X2Ftb3VudChzZWxmLCBzZWwsIGxpc3QsIG1zZyk6CisgICAgICAgIG5ld19saXN0ID0gbGlzdAorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV4ID0gcmUuY29tcGlsZShzZWwpCisgICAgICAgICAgICBleGNlcHQgcmUuZXJyb3I6CisgICAgICAgICAgICAgICAgbXNnICs9ICIgICA8SW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gJXI+XG4iICUgc2VsCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld19saXN0LCBtc2cKKyAgICAgICAgICAgIG5ld19saXN0ID0gW10KKyAgICAgICAgICAgIGZvciBmdW5jIGluIGxpc3Q6CisgICAgICAgICAgICAgICAgaWYgcmV4LnNlYXJjaChmdW5jX3N0ZF9zdHJpbmcoZnVuYykpOgorICAgICAgICAgICAgICAgICAgICBuZXdfbGlzdC5hcHBlbmQoZnVuYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvdW50ID0gbGVuKGxpc3QpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbCwgZmxvYXQpIGFuZCAwLjAgPD0gc2VsIDwgMS4wOgorICAgICAgICAgICAgICAgIGNvdW50ID0gaW50KGNvdW50ICogc2VsICsgLjUpCisgICAgICAgICAgICAgICAgbmV3X2xpc3QgPSBsaXN0Wzpjb3VudF0KKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZWwsIChpbnQsIGxvbmcpKSBhbmQgMCA8PSBzZWwgPCBjb3VudDoKKyAgICAgICAgICAgICAgICBjb3VudCA9IHNlbAorICAgICAgICAgICAgICAgIG5ld19saXN0ID0gbGlzdFs6Y291bnRdCisgICAgICAgIGlmIGxlbihsaXN0KSAhPSBsZW4obmV3X2xpc3QpOgorICAgICAgICAgICAgbXNnICs9ICIgICBMaXN0IHJlZHVjZWQgZnJvbSAlciB0byAlciBkdWUgdG8gcmVzdHJpY3Rpb24gPCVyPlxuIiAlICgKKyAgICAgICAgICAgICAgICBsZW4obGlzdCksIGxlbihuZXdfbGlzdCksIHNlbCkKKworICAgICAgICByZXR1cm4gbmV3X2xpc3QsIG1zZworCisgICAgZGVmIGdldF9wcmludF9saXN0KHNlbGYsIHNlbF9saXN0KToKKyAgICAgICAgd2lkdGggPSBzZWxmLm1heF9uYW1lX2xlbgorICAgICAgICBpZiBzZWxmLmZjbl9saXN0OgorICAgICAgICAgICAgc3RhdF9saXN0ID0gc2VsZi5mY25fbGlzdFs6XQorICAgICAgICAgICAgbXNnID0gIiAgIE9yZGVyZWQgYnk6ICIgKyBzZWxmLnNvcnRfdHlwZSArICdcbicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXRfbGlzdCA9IHNlbGYuc3RhdHMua2V5cygpCisgICAgICAgICAgICBtc2cgPSAiICAgUmFuZG9tIGxpc3Rpbmcgb3JkZXIgd2FzIHVzZWRcbiIKKworICAgICAgICBmb3Igc2VsZWN0aW9uIGluIHNlbF9saXN0OgorICAgICAgICAgICAgc3RhdF9saXN0LCBtc2cgPSBzZWxmLmV2YWxfcHJpbnRfYW1vdW50KHNlbGVjdGlvbiwgc3RhdF9saXN0LCBtc2cpCisKKyAgICAgICAgY291bnQgPSBsZW4oc3RhdF9saXN0KQorCisgICAgICAgIGlmIG5vdCBzdGF0X2xpc3Q6CisgICAgICAgICAgICByZXR1cm4gMCwgc3RhdF9saXN0CisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBtc2cKKyAgICAgICAgaWYgY291bnQgPCBsZW4oc2VsZi5zdGF0cyk6CisgICAgICAgICAgICB3aWR0aCA9IDAKKyAgICAgICAgICAgIGZvciBmdW5jIGluIHN0YXRfbGlzdDoKKyAgICAgICAgICAgICAgICBpZiAgbGVuKGZ1bmNfc3RkX3N0cmluZyhmdW5jKSkgPiB3aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBsZW4oZnVuY19zdGRfc3RyaW5nKGZ1bmMpKQorICAgICAgICByZXR1cm4gd2lkdGgrMiwgc3RhdF9saXN0CisKKyAgICBkZWYgcHJpbnRfc3RhdHMoc2VsZiwgKmFtb3VudCk6CisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLmZpbGVzOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGZpbGVuYW1lCisgICAgICAgIGlmIHNlbGYuZmlsZXM6IHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgIGluZGVudCA9ICcgJyAqIDgKKyAgICAgICAgZm9yIGZ1bmMgaW4gc2VsZi50b3BfbGV2ZWw6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgaW5kZW50LCBmdW5jX2dldF9mdW5jdGlvbl9uYW1lKGZ1bmMpCisKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGluZGVudCwgc2VsZi50b3RhbF9jYWxscywgImZ1bmN0aW9uIGNhbGxzIiwKKyAgICAgICAgaWYgc2VsZi50b3RhbF9jYWxscyAhPSBzZWxmLnByaW1fY2FsbHM6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiglZCBwcmltaXRpdmUgY2FsbHMpIiAlIHNlbGYucHJpbV9jYWxscywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJpbiAlLjNmIHNlY29uZHMiICUgc2VsZi50b3RhbF90dAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICB3aWR0aCwgbGlzdCA9IHNlbGYuZ2V0X3ByaW50X2xpc3QoYW1vdW50KQorICAgICAgICBpZiBsaXN0OgorICAgICAgICAgICAgc2VsZi5wcmludF90aXRsZSgpCisgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfbGluZShmdW5jKQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgcHJpbnRfY2FsbGVlcyhzZWxmLCAqYW1vdW50KToKKyAgICAgICAgd2lkdGgsIGxpc3QgPSBzZWxmLmdldF9wcmludF9saXN0KGFtb3VudCkKKyAgICAgICAgaWYgbGlzdDoKKyAgICAgICAgICAgIHNlbGYuY2FsY19jYWxsZWVzKCkKKworICAgICAgICAgICAgc2VsZi5wcmludF9jYWxsX2hlYWRpbmcod2lkdGgsICJjYWxsZWQuLi4iKQorICAgICAgICAgICAgZm9yIGZ1bmMgaW4gbGlzdDoKKyAgICAgICAgICAgICAgICBpZiBmdW5jIGluIHNlbGYuYWxsX2NhbGxlZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCBzZWxmLmFsbF9jYWxsZWVzW2Z1bmNdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfY2FsbF9saW5lKHdpZHRoLCBmdW5jLCB7fSkKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHByaW50X2NhbGxlcnMoc2VsZiwgKmFtb3VudCk6CisgICAgICAgIHdpZHRoLCBsaXN0ID0gc2VsZi5nZXRfcHJpbnRfbGlzdChhbW91bnQpCisgICAgICAgIGlmIGxpc3Q6CisgICAgICAgICAgICBzZWxmLnByaW50X2NhbGxfaGVhZGluZyh3aWR0aCwgIndhcyBjYWxsZWQgYnkuLi4iKQorICAgICAgICAgICAgZm9yIGZ1bmMgaW4gbGlzdDoKKyAgICAgICAgICAgICAgICBjYywgbmMsIHR0LCBjdCwgY2FsbGVycyA9IHNlbGYuc3RhdHNbZnVuY10KKyAgICAgICAgICAgICAgICBzZWxmLnByaW50X2NhbGxfbGluZSh3aWR0aCwgZnVuYywgY2FsbGVycywgIjwtIikKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHByaW50X2NhbGxfaGVhZGluZyhzZWxmLCBuYW1lX3NpemUsIGNvbHVtbl90aXRsZSk6CisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiRnVuY3Rpb24gIi5sanVzdChuYW1lX3NpemUpICsgY29sdW1uX3RpdGxlCisgICAgICAgICMgcHJpbnQgc3ViLWhlYWRlciBvbmx5IGlmIHdlIGhhdmUgbmV3LXN0eWxlIGNhbGxlcnMKKyAgICAgICAgc3ViaGVhZGVyID0gRmFsc2UKKyAgICAgICAgZm9yIGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzIGluIHNlbGYuc3RhdHMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgaWYgY2FsbGVyczoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGNhbGxlcnMuaXRlcnZhbHVlcygpLm5leHQoKQorICAgICAgICAgICAgICAgIHN1YmhlYWRlciA9IGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIHN1YmhlYWRlcjoKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiICIqbmFtZV9zaXplICsgIiAgICBuY2FsbHMgIHRvdHRpbWUgIGN1bXRpbWUiCisKKyAgICBkZWYgcHJpbnRfY2FsbF9saW5lKHNlbGYsIG5hbWVfc2l6ZSwgc291cmNlLCBjYWxsX2RpY3QsIGFycm93PSItPiIpOgorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZnVuY19zdGRfc3RyaW5nKHNvdXJjZSkubGp1c3QobmFtZV9zaXplKSArIGFycm93LAorICAgICAgICBpZiBub3QgY2FsbF9kaWN0OgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjbGlzdCA9IGNhbGxfZGljdC5rZXlzKCkKKyAgICAgICAgY2xpc3Quc29ydCgpCisgICAgICAgIGluZGVudCA9ICIiCisgICAgICAgIGZvciBmdW5jIGluIGNsaXN0OgorICAgICAgICAgICAgbmFtZSA9IGZ1bmNfc3RkX3N0cmluZyhmdW5jKQorICAgICAgICAgICAgdmFsdWUgPSBjYWxsX2RpY3RbZnVuY10KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKToKKyAgICAgICAgICAgICAgICBuYywgY2MsIHR0LCBjdCA9IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgbmMgIT0gY2M6CisgICAgICAgICAgICAgICAgICAgIHN1YnN0YXRzID0gJyVkLyVkJyAlIChuYywgY2MpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3Vic3RhdHMgPSAnJWQnICUgKG5jLCkKKyAgICAgICAgICAgICAgICBzdWJzdGF0cyA9ICclcyAlcyAlcyAgJXMnICUgKHN1YnN0YXRzLnJqdXN0KDcrMipsZW4oaW5kZW50KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmOCh0dCksIGY4KGN0KSwgbmFtZSkKKyAgICAgICAgICAgICAgICBsZWZ0X3dpZHRoID0gbmFtZV9zaXplICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdWJzdGF0cyA9ICclcyglcikgJXMnICUgKG5hbWUsIHZhbHVlLCBmOChzZWxmLnN0YXRzW2Z1bmNdWzNdKSkKKyAgICAgICAgICAgICAgICBsZWZ0X3dpZHRoID0gbmFtZV9zaXplICsgMworICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGluZGVudCpsZWZ0X3dpZHRoICsgc3Vic3RhdHMKKyAgICAgICAgICAgIGluZGVudCA9ICIgIgorCisgICAgZGVmIHByaW50X3RpdGxlKHNlbGYpOgorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgJyAgIG5jYWxscyAgdG90dGltZSAgcGVyY2FsbCAgY3VtdGltZSAgcGVyY2FsbCcsCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAnZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKScKKworICAgIGRlZiBwcmludF9saW5lKHNlbGYsIGZ1bmMpOiAgIyBoYWNrIDogc2hvdWxkIHByaW50IHBlcmNlbnRhZ2VzCisgICAgICAgIGNjLCBuYywgdHQsIGN0LCBjYWxsZXJzID0gc2VsZi5zdGF0c1tmdW5jXQorICAgICAgICBjID0gc3RyKG5jKQorICAgICAgICBpZiBuYyAhPSBjYzoKKyAgICAgICAgICAgIGMgPSBjICsgJy8nICsgc3RyKGNjKQorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgYy5yanVzdCg5KSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KHR0KSwKKyAgICAgICAgaWYgbmMgPT0gMDoKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAnICcqOCwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmOChmbG9hdCh0dCkvbmMpLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZjgoY3QpLAorICAgICAgICBpZiBjYyA9PSAwOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICcgJyo4LAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KGZsb2F0KGN0KS9jYyksCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmdW5jX3N0ZF9zdHJpbmcoZnVuYykKKworY2xhc3MgVHVwbGVDb21wOgorICAgICIiIlRoaXMgY2xhc3MgcHJvdmlkZXMgYSBnZW5lcmljIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgYW55IHR3byB0dXBsZXMuCisgICAgRWFjaCBpbnN0YW5jZSByZWNvcmRzIGEgbGlzdCBvZiB0dXBsZS1pbmRpY2VzIChmcm9tIG1vc3Qgc2lnbmlmaWNhbnQKKyAgICB0byBsZWFzdCBzaWduaWZpY2FudCksIGFuZCBzb3J0IGRpcmVjdGlvbiAoYXNjZW5kaW5nIG9yIGRlY2VuZGluZykgZm9yCisgICAgZWFjaCB0dXBsZS1pbmRleC4gIFRoZSBjb21wYXJlIGZ1bmN0aW9ucyBjYW4gdGhlbiBiZSB1c2VkIGFzIHRoZSBmdW5jdGlvbgorICAgIGFyZ3VtZW50IHRvIHRoZSBzeXN0ZW0gc29ydCgpIGZ1bmN0aW9uIHdoZW4gYSBsaXN0IG9mIHR1cGxlcyBuZWVkIHRvIGJlCisgICAgc29ydGVkIGluIHRoZSBpbnN0YW5jZXMgb3JkZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29tcF9zZWxlY3RfbGlzdCk6CisgICAgICAgIHNlbGYuY29tcF9zZWxlY3RfbGlzdCA9IGNvbXBfc2VsZWN0X2xpc3QKKworICAgIGRlZiBjb21wYXJlIChzZWxmLCBsZWZ0LCByaWdodCk6CisgICAgICAgIGZvciBpbmRleCwgZGlyZWN0aW9uIGluIHNlbGYuY29tcF9zZWxlY3RfbGlzdDoKKyAgICAgICAgICAgIGwgPSBsZWZ0W2luZGV4XQorICAgICAgICAgICAgciA9IHJpZ2h0W2luZGV4XQorICAgICAgICAgICAgaWYgbCA8IHI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1kaXJlY3Rpb24KKyAgICAgICAgICAgIGlmIGwgPiByOgorICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3Rpb24KKyAgICAgICAgcmV0dXJuIDAKKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIGZ1bmNfbmFtZSBpcyBhIHRyaXBsZSAoZmlsZTpzdHJpbmcsIGxpbmU6aW50LCBuYW1lOnN0cmluZykKKworZGVmIGZ1bmNfc3RyaXBfcGF0aChmdW5jX25hbWUpOgorICAgIGZpbGVuYW1lLCBsaW5lLCBuYW1lID0gZnVuY19uYW1lCisgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBsaW5lLCBuYW1lCisKK2RlZiBmdW5jX2dldF9mdW5jdGlvbl9uYW1lKGZ1bmMpOgorICAgIHJldHVybiBmdW5jWzJdCisKK2RlZiBmdW5jX3N0ZF9zdHJpbmcoZnVuY19uYW1lKTogIyBtYXRjaCB3aGF0IG9sZCBwcm9maWxlIHByb2R1Y2VkCisgICAgaWYgZnVuY19uYW1lWzoyXSA9PSAoJ34nLCAwKToKKyAgICAgICAgIyBzcGVjaWFsIGNhc2UgZm9yIGJ1aWx0LWluIGZ1bmN0aW9ucworICAgICAgICBuYW1lID0gZnVuY19uYW1lWzJdCisgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnPCcpIGFuZCBuYW1lLmVuZHN3aXRoKCc+Jyk6CisgICAgICAgICAgICByZXR1cm4gJ3slc30nICUgbmFtZVsxOi0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG5hbWUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIiVzOiVkKCVzKSIgJSBmdW5jX25hbWUKKworIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbWJpbmUgc3RhdGlzdHMgZm9yIHBhaXJzIGZ1bmN0aW9ucy4KKyMgVGhlIGJ1bGsgb2YgdGhlIHByb2Nlc3NpbmcgaW52b2x2ZXMgY29ycmVjdGx5IGhhbmRsaW5nICJjYWxsIiBsaXN0cywKKyMgc3VjaCBhcyBjYWxsZXJzIGFuZCBjYWxsZWVzLgorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2RlZiBhZGRfZnVuY19zdGF0cyh0YXJnZXQsIHNvdXJjZSk6CisgICAgIiIiQWRkIHRvZ2V0aGVyIGFsbCB0aGUgc3RhdHMgZm9yIHR3byBwcm9maWxlIGVudHJpZXMuIiIiCisgICAgY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMgPSBzb3VyY2UKKyAgICB0X2NjLCB0X25jLCB0X3R0LCB0X2N0LCB0X2NhbGxlcnMgPSB0YXJnZXQKKyAgICByZXR1cm4gKGNjK3RfY2MsIG5jK3RfbmMsIHR0K3RfdHQsIGN0K3RfY3QsCisgICAgICAgICAgICAgIGFkZF9jYWxsZXJzKHRfY2FsbGVycywgY2FsbGVycykpCisKK2RlZiBhZGRfY2FsbGVycyh0YXJnZXQsIHNvdXJjZSk6CisgICAgIiIiQ29tYmluZSB0d28gY2FsbGVyIGxpc3RzIGluIGEgc2luZ2xlIGxpc3QuIiIiCisgICAgbmV3X2NhbGxlcnMgPSB7fQorICAgIGZvciBmdW5jLCBjYWxsZXIgaW4gdGFyZ2V0Lml0ZXJpdGVtcygpOgorICAgICAgICBuZXdfY2FsbGVyc1tmdW5jXSA9IGNhbGxlcgorICAgIGZvciBmdW5jLCBjYWxsZXIgaW4gc291cmNlLml0ZXJpdGVtcygpOgorICAgICAgICBpZiBmdW5jIGluIG5ld19jYWxsZXJzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjYWxsZXIsIHR1cGxlKToKKyAgICAgICAgICAgICAgICAjIGZvcm1hdCB1c2VkIGJ5IGNQcm9maWxlCisgICAgICAgICAgICAgICAgbmV3X2NhbGxlcnNbZnVuY10gPSB0dXBsZShbaVswXSArIGlbMV0gZm9yIGkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aXAoY2FsbGVyLCBuZXdfY2FsbGVyc1tmdW5jXSldKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGZvcm1hdCB1c2VkIGJ5IHByb2ZpbGUKKyAgICAgICAgICAgICAgICBuZXdfY2FsbGVyc1tmdW5jXSArPSBjYWxsZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld19jYWxsZXJzW2Z1bmNdID0gY2FsbGVyCisgICAgcmV0dXJuIG5ld19jYWxsZXJzCisKK2RlZiBjb3VudF9jYWxscyhjYWxsZXJzKToKKyAgICAiIiJTdW0gdGhlIGNhbGxlciBzdGF0aXN0aWNzIHRvIGdldCB0b3RhbCBudW1iZXIgb2YgY2FsbHMgcmVjZWl2ZWQuIiIiCisgICAgbmMgPSAwCisgICAgZm9yIGNhbGxzIGluIGNhbGxlcnMuaXRlcnZhbHVlcygpOgorICAgICAgICBuYyArPSBjYWxscworICAgIHJldHVybiBuYworCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgc3VwcG9ydCBwcmludGluZyBvZiByZXBvcnRzCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworZGVmIGY4KHgpOgorICAgIHJldHVybiAiJTguM2YiICUgeAorCisjKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyMgU3RhdGlzdGljcyBicm93c2VyIGFkZGVkIGJ5IEVTUiwgQXByaWwgMjAwMQorIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaW1wb3J0IGNtZAorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHJlYWRsaW5lCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisKKyAgICBjbGFzcyBQcm9maWxlQnJvd3NlcihjbWQuQ21kKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2ZpbGU9Tm9uZSk6CisgICAgICAgICAgICBjbWQuQ21kLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICBzZWxmLnByb21wdCA9ICIlICIKKyAgICAgICAgICAgIHNlbGYuc3RhdHMgPSBOb25lCisgICAgICAgICAgICBzZWxmLnN0cmVhbSA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIGlmIHByb2ZpbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5kb19yZWFkKHByb2ZpbGUpCisKKyAgICAgICAgZGVmIGdlbmVyaWMoc2VsZiwgZm4sIGxpbmUpOgorICAgICAgICAgICAgYXJncyA9IGxpbmUuc3BsaXQoKQorICAgICAgICAgICAgcHJvY2Vzc2VkID0gW10KKyAgICAgICAgICAgIGZvciB0ZXJtIGluIGFyZ3M6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQuYXBwZW5kKGludCh0ZXJtKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnJhYyA9IGZsb2F0KHRlcm0pCisgICAgICAgICAgICAgICAgICAgIGlmIGZyYWMgPiAxIG9yIGZyYWMgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJGcmFjdGlvbiBhcmd1bWVudCBtdXN0IGJlIGluIFswLCAxXSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hcHBlbmQoZnJhYykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hcHBlbmQodGVybSkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhdHM6CisgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLnN0YXRzLCBmbikoKnByb2Nlc3NlZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJObyBzdGF0aXN0aWNzIG9iamVjdCBpcyBsb2FkZWQuIgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgZGVmIGdlbmVyaWNfaGVscChzZWxmKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiQXJndW1lbnRzIG1heSBiZToiCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiogQW4gaW50ZWdlciBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIHByaW50LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKiBBIGRlY2ltYWwgZnJhY3Rpb25hbCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLCBjb250cm9sbGluZyIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiICB3aGF0IGZyYWN0aW9uIG9mIHNlbGVjdGVkIGVudHJpZXMgdG8gcHJpbnQuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIqIEEgcmVndWxhciBleHByZXNzaW9uOyBvbmx5IGVudHJpZXMgd2l0aCBmdW5jdGlvbiBuYW1lcyIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiICB0aGF0IG1hdGNoIGl0IGFyZSBwcmludGVkLiIKKworICAgICAgICBkZWYgZG9fYWRkKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5zdGF0czoKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRzLmFkZChsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGxvYWRlZC4iCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBkZWYgaGVscF9hZGQoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkFkZCBwcm9maWxlIGluZm8gZnJvbSBnaXZlbiBmaWxlIHRvIGN1cnJlbnQgc3RhdGlzdGljcyBvYmplY3QuIgorCisgICAgICAgIGRlZiBkb19jYWxsZWVzKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuZXJpYygncHJpbnRfY2FsbGVlcycsIGxpbmUpCisgICAgICAgIGRlZiBoZWxwX2NhbGxlZXMoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IGNhbGxlZXMgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKKyAgICAgICAgICAgIHNlbGYuZ2VuZXJpY19oZWxwKCkKKworICAgICAgICBkZWYgZG9fY2FsbGVycyhzZWxmLCBsaW5lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdlbmVyaWMoJ3ByaW50X2NhbGxlcnMnLCBsaW5lKQorICAgICAgICBkZWYgaGVscF9jYWxsZXJzKHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJQcmludCBjYWxsZXJzIHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCisgICAgICAgICAgICBzZWxmLmdlbmVyaWNfaGVscCgpCisKKyAgICAgICAgZGVmIGRvX0VPRihzZWxmLCBsaW5lKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiIgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZGVmIGhlbHBfRU9GKHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJMZWF2ZSB0aGUgcHJvZmlsZSBicm93ZXIuIgorCisgICAgICAgIGRlZiBkb19xdWl0KHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZGVmIGhlbHBfcXVpdChzZWxmKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTGVhdmUgdGhlIHByb2ZpbGUgYnJvd2VyLiIKKworICAgICAgICBkZWYgZG9fcmVhZChzZWxmLCBsaW5lKToKKyAgICAgICAgICAgIGlmIGxpbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRzID0gU3RhdHMobGluZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgYXJnczoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGFyZ3NbMV0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlcnI6CisgICAgICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBlcnIuX19jbGFzc19fLl9fbmFtZV9fICsgJzonLCBlcnIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5wcm9tcHQgPSBsaW5lICsgIiUgIgorICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5wcm9tcHQpID4gMjoKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5wcm9tcHRbOi0yXQorICAgICAgICAgICAgICAgIHNlbGYuZG9fcmVhZChsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGN1cnJlbnQgLS0gY2Fubm90IHJlbG9hZC4iCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBkZWYgaGVscF9yZWFkKHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJSZWFkIGluIHByb2ZpbGUgZGF0YSBmcm9tIGEgc3BlY2lmaWVkIGZpbGUuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJXaXRob3V0IGFyZ3VtZW50LCByZWxvYWQgdGhlIGN1cnJlbnQgZmlsZS4iCisKKyAgICAgICAgZGVmIGRvX3JldmVyc2Uoc2VsZiwgbGluZSk6CisgICAgICAgICAgICBpZiBzZWxmLnN0YXRzOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdHMucmV2ZXJzZV9vcmRlcigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgbG9hZGVkLiIKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGRlZiBoZWxwX3JldmVyc2Uoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlJldmVyc2UgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIHByb2ZpbGluZyByZXBvcnQuIgorCisgICAgICAgIGRlZiBkb19zb3J0KHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuc3RhdHM6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJObyBzdGF0aXN0aWNzIG9iamVjdCBpcyBsb2FkZWQuIgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgYWJicmV2cyA9IHNlbGYuc3RhdHMuZ2V0X3NvcnRfYXJnX2RlZnMoKQorICAgICAgICAgICAgaWYgbGluZSBhbmQgYWxsKCh4IGluIGFiYnJldnMpIGZvciB4IGluIGxpbmUuc3BsaXQoKSk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGF0cy5zb3J0X3N0YXRzKCpsaW5lLnNwbGl0KCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiVmFsaWQgc29ydCBrZXlzICh1bmlxdWUgcHJlZml4ZXMgYXJlIGFjY2VwdGVkKToiCisgICAgICAgICAgICAgICAgZm9yIChrZXksIHZhbHVlKSBpbiBTdGF0cy5zb3J0X2FyZ19kaWN0X2RlZmF1bHQuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiJXMgLS0gJXMiICUgKGtleSwgdmFsdWVbMV0pCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBkZWYgaGVscF9zb3J0KHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJTb3J0IHByb2ZpbGUgZGF0YSBhY2NvcmRpbmcgdG8gc3BlY2lmaWVkIGtleXMuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIoVHlwaW5nIGBzb3J0JyB3aXRob3V0IGFyZ3VtZW50cyBsaXN0cyB2YWxpZCBrZXlzLikiCisgICAgICAgIGRlZiBjb21wbGV0ZV9zb3J0KHNlbGYsIHRleHQsICphcmdzKToKKyAgICAgICAgICAgIHJldHVybiBbYSBmb3IgYSBpbiBTdGF0cy5zb3J0X2FyZ19kaWN0X2RlZmF1bHQgaWYgYS5zdGFydHN3aXRoKHRleHQpXQorCisgICAgICAgIGRlZiBkb19zdGF0cyhzZWxmLCBsaW5lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdlbmVyaWMoJ3ByaW50X3N0YXRzJywgbGluZSkKKyAgICAgICAgZGVmIGhlbHBfc3RhdHMoc2VsZik6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCisgICAgICAgICAgICBzZWxmLmdlbmVyaWNfaGVscCgpCisKKyAgICAgICAgZGVmIGRvX3N0cmlwKHNlbGYsIGxpbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5zdGF0czoKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRzLnN0cmlwX2RpcnMoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGxvYWRlZC4iCisgICAgICAgIGRlZiBoZWxwX3N0cmlwKHNlbGYpOgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJTdHJpcCBsZWFkaW5nIHBhdGggaW5mb3JtYXRpb24gZnJvbSBmaWxlbmFtZXMgaW4gdGhlIHJlcG9ydC4iCisKKyAgICAgICAgZGVmIGhlbHBfaGVscChzZWxmKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiU2hvdyBoZWxwIGZvciBhIGdpdmVuIGNvbW1hbmQuIgorCisgICAgICAgIGRlZiBwb3N0Y21kKHNlbGYsIHN0b3AsIGxpbmUpOgorICAgICAgICAgICAgaWYgc3RvcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RvcAorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGltcG9ydCBzeXMKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgaW5pdHByb2ZpbGUgPSBzeXMuYXJndlsxXQorICAgIGVsc2U6CisgICAgICAgIGluaXRwcm9maWxlID0gTm9uZQorICAgIHRyeToKKyAgICAgICAgYnJvd3NlciA9IFByb2ZpbGVCcm93c2VyKGluaXRwcm9maWxlKQorICAgICAgICBwcmludCA+PiBicm93c2VyLnN0cmVhbSwgIldlbGNvbWUgdG8gdGhlIHByb2ZpbGUgc3RhdGlzdGljcyBicm93c2VyLiIKKyAgICAgICAgYnJvd3Nlci5jbWRsb29wKCkKKyAgICAgICAgcHJpbnQgPj4gYnJvd3Nlci5zdHJlYW0sICJHb29kYnllLiIKKyAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgIHBhc3MKKworIyBUaGF0J3MgYWxsLCBmb2xrcy4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHN0YXRzLnB5YyBiL2xpYi9weXRob24yLjcvcHN0YXRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThkMWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wc3RhdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHN0YXRzLnB5byBiL2xpYi9weXRob24yLjcvcHN0YXRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNThkMWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9wc3RhdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHR5LnB5IGIvbGliL3B5dGhvbjIuNy9wdHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmZjY4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHR5LnB5CkBAIC0wLDAgKzEsMTgwIEBACisiIiJQc2V1ZG8gdGVybWluYWwgdXRpbGl0aWVzLiIiIgorCisjIEJ1Z3M6IE5vIHNpZ25hbCBoYW5kbGluZy4gIERvZXNuJ3Qgc2V0IHNsYXZlIHRlcm1pb3MgYW5kIHdpbmRvdyBzaXplLgorIyAgICAgICBPbmx5IHRlc3RlZCBvbiBMaW51eC4KKyMgU2VlOiAgVy4gUmljaGFyZCBTdGV2ZW5zLiAxOTkyLiAgQWR2YW5jZWQgUHJvZ3JhbW1pbmcgaW4gdGhlCisjICAgICAgIFVOSVggRW52aXJvbm1lbnQuICBDaGFwdGVyIDE5LgorIyBBdXRob3I6IFN0ZWVuIEx1bWhvbHQgLS0gd2l0aCBhZGRpdGlvbnMgYnkgR3VpZG8uCisKK2Zyb20gc2VsZWN0IGltcG9ydCBzZWxlY3QKK2ltcG9ydCBvcworaW1wb3J0IHR0eQorCitfX2FsbF9fID0gWyJvcGVucHR5IiwiZm9yayIsInNwYXduIl0KKworU1RESU5fRklMRU5PID0gMAorU1RET1VUX0ZJTEVOTyA9IDEKK1NUREVSUl9GSUxFTk8gPSAyCisKK0NISUxEID0gMAorCitkZWYgb3BlbnB0eSgpOgorICAgICIiIm9wZW5wdHkoKSAtPiAobWFzdGVyX2ZkLCBzbGF2ZV9mZCkKKyAgICBPcGVuIGEgcHR5IG1hc3Rlci9zbGF2ZSBwYWlyLCB1c2luZyBvcy5vcGVucHR5KCkgaWYgcG9zc2libGUuIiIiCisKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBvcy5vcGVucHR5KCkKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgcGFzcworICAgIG1hc3Rlcl9mZCwgc2xhdmVfbmFtZSA9IF9vcGVuX3Rlcm1pbmFsKCkKKyAgICBzbGF2ZV9mZCA9IHNsYXZlX29wZW4oc2xhdmVfbmFtZSkKKyAgICByZXR1cm4gbWFzdGVyX2ZkLCBzbGF2ZV9mZAorCitkZWYgbWFzdGVyX29wZW4oKToKKyAgICAiIiJtYXN0ZXJfb3BlbigpIC0+IChtYXN0ZXJfZmQsIHNsYXZlX25hbWUpCisgICAgT3BlbiBhIHB0eSBtYXN0ZXIgYW5kIHJldHVybiB0aGUgZmQsIGFuZCB0aGUgZmlsZW5hbWUgb2YgdGhlIHNsYXZlIGVuZC4KKyAgICBEZXByZWNhdGVkLCB1c2Ugb3BlbnB0eSgpIGluc3RlYWQuIiIiCisKKyAgICB0cnk6CisgICAgICAgIG1hc3Rlcl9mZCwgc2xhdmVfZmQgPSBvcy5vcGVucHR5KCkKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHNsYXZlX25hbWUgPSBvcy50dHluYW1lKHNsYXZlX2ZkKQorICAgICAgICBvcy5jbG9zZShzbGF2ZV9mZCkKKyAgICAgICAgcmV0dXJuIG1hc3Rlcl9mZCwgc2xhdmVfbmFtZQorCisgICAgcmV0dXJuIF9vcGVuX3Rlcm1pbmFsKCkKKworZGVmIF9vcGVuX3Rlcm1pbmFsKCk6CisgICAgIiIiT3BlbiBwdHkgbWFzdGVyIGFuZCByZXR1cm4gKG1hc3Rlcl9mZCwgdHR5X25hbWUpLgorICAgIFNHSSBhbmQgZ2VuZXJpYyBCU0QgdmVyc2lvbiwgZm9yIHdoZW4gb3BlbnB0eSgpIGZhaWxzLiIiIgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHNnaQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHR0eV9uYW1lLCBtYXN0ZXJfZmQgPSBzZ2kuX2dldHB0eShvcy5PX1JEV1IsIDA2NjYsIDApCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICByYWlzZSBvcy5lcnJvciwgbXNnCisgICAgICAgIHJldHVybiBtYXN0ZXJfZmQsIHR0eV9uYW1lCisgICAgZm9yIHggaW4gJ3BxcnN0dXZ3eHl6UFFSU1QnOgorICAgICAgICBmb3IgeSBpbiAnMDEyMzQ1Njc4OWFiY2RlZic6CisgICAgICAgICAgICBwdHlfbmFtZSA9ICcvZGV2L3B0eScgKyB4ICsgeQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZkID0gb3Mub3BlbihwdHlfbmFtZSwgb3MuT19SRFdSKQorICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByZXR1cm4gKGZkLCAnL2Rldi90dHknICsgeCArIHkpCisgICAgcmFpc2Ugb3MuZXJyb3IsICdvdXQgb2YgcHR5IGRldmljZXMnCisKK2RlZiBzbGF2ZV9vcGVuKHR0eV9uYW1lKToKKyAgICAiIiJzbGF2ZV9vcGVuKHR0eV9uYW1lKSAtPiBzbGF2ZV9mZAorICAgIE9wZW4gdGhlIHB0eSBzbGF2ZSBhbmQgYWNxdWlyZSB0aGUgY29udHJvbGxpbmcgdGVybWluYWwsIHJldHVybmluZworICAgIG9wZW5lZCBmaWxlZGVzY3JpcHRvci4KKyAgICBEZXByZWNhdGVkLCB1c2Ugb3BlbnB0eSgpIGluc3RlYWQuIiIiCisKKyAgICByZXN1bHQgPSBvcy5vcGVuKHR0eV9uYW1lLCBvcy5PX1JEV1IpCisgICAgdHJ5OgorICAgICAgICBmcm9tIGZjbnRsIGltcG9ydCBpb2N0bCwgSV9QVVNICisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgdHJ5OgorICAgICAgICBpb2N0bChyZXN1bHQsIElfUFVTSCwgInB0ZW0iKQorICAgICAgICBpb2N0bChyZXN1bHQsIElfUFVTSCwgImxkdGVybSIpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBmb3JrKCk6CisgICAgIiIiZm9yaygpIC0+IChwaWQsIG1hc3Rlcl9mZCkKKyAgICBGb3JrIGFuZCBtYWtlIHRoZSBjaGlsZCBhIHNlc3Npb24gbGVhZGVyIHdpdGggYSBjb250cm9sbGluZyB0ZXJtaW5hbC4iIiIKKworICAgIHRyeToKKyAgICAgICAgcGlkLCBmZCA9IG9zLmZvcmtwdHkoKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgaWYgcGlkID09IENISUxEOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnNldHNpZCgpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAjIG9zLmZvcmtwdHkoKSBhbHJlYWR5IHNldCB1cyBzZXNzaW9uIGxlYWRlcgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIHBpZCwgZmQKKworICAgIG1hc3Rlcl9mZCwgc2xhdmVfZmQgPSBvcGVucHR5KCkKKyAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICBpZiBwaWQgPT0gQ0hJTEQ6CisgICAgICAgICMgRXN0YWJsaXNoIGEgbmV3IHNlc3Npb24uCisgICAgICAgIG9zLnNldHNpZCgpCisgICAgICAgIG9zLmNsb3NlKG1hc3Rlcl9mZCkKKworICAgICAgICAjIFNsYXZlIGJlY29tZXMgc3RkaW4vc3Rkb3V0L3N0ZGVyciBvZiBjaGlsZC4KKyAgICAgICAgb3MuZHVwMihzbGF2ZV9mZCwgU1RESU5fRklMRU5PKQorICAgICAgICBvcy5kdXAyKHNsYXZlX2ZkLCBTVERPVVRfRklMRU5PKQorICAgICAgICBvcy5kdXAyKHNsYXZlX2ZkLCBTVERFUlJfRklMRU5PKQorICAgICAgICBpZiAoc2xhdmVfZmQgPiBTVERFUlJfRklMRU5PKToKKyAgICAgICAgICAgIG9zLmNsb3NlIChzbGF2ZV9mZCkKKworICAgICAgICAjIEV4cGxpY2l0bHkgb3BlbiB0aGUgdHR5IHRvIG1ha2UgaXQgYmVjb21lIGEgY29udHJvbGxpbmcgdHR5LgorICAgICAgICB0bXBfZmQgPSBvcy5vcGVuKG9zLnR0eW5hbWUoU1RET1VUX0ZJTEVOTyksIG9zLk9fUkRXUikKKyAgICAgICAgb3MuY2xvc2UodG1wX2ZkKQorICAgIGVsc2U6CisgICAgICAgIG9zLmNsb3NlKHNsYXZlX2ZkKQorCisgICAgIyBQYXJlbnQgYW5kIGNoaWxkIHByb2Nlc3MuCisgICAgcmV0dXJuIHBpZCwgbWFzdGVyX2ZkCisKK2RlZiBfd3JpdGVuKGZkLCBkYXRhKToKKyAgICAiIiJXcml0ZSBhbGwgdGhlIGRhdGEgdG8gYSBkZXNjcmlwdG9yLiIiIgorICAgIHdoaWxlIGRhdGEgIT0gJyc6CisgICAgICAgIG4gPSBvcy53cml0ZShmZCwgZGF0YSkKKyAgICAgICAgZGF0YSA9IGRhdGFbbjpdCisKK2RlZiBfcmVhZChmZCk6CisgICAgIiIiRGVmYXVsdCByZWFkIGZ1bmN0aW9uLiIiIgorICAgIHJldHVybiBvcy5yZWFkKGZkLCAxMDI0KQorCitkZWYgX2NvcHkobWFzdGVyX2ZkLCBtYXN0ZXJfcmVhZD1fcmVhZCwgc3RkaW5fcmVhZD1fcmVhZCk6CisgICAgIiIiUGFyZW50IGNvcHkgbG9vcC4KKyAgICBDb3BpZXMKKyAgICAgICAgICAgIHB0eSBtYXN0ZXIgLT4gc3RhbmRhcmQgb3V0cHV0ICAgKG1hc3Rlcl9yZWFkKQorICAgICAgICAgICAgc3RhbmRhcmQgaW5wdXQgLT4gcHR5IG1hc3RlciAgICAoc3RkaW5fcmVhZCkiIiIKKyAgICBmZHMgPSBbbWFzdGVyX2ZkLCBTVERJTl9GSUxFTk9dCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcmZkcywgd2ZkcywgeGZkcyA9IHNlbGVjdChmZHMsIFtdLCBbXSkKKyAgICAgICAgaWYgbWFzdGVyX2ZkIGluIHJmZHM6CisgICAgICAgICAgICBkYXRhID0gbWFzdGVyX3JlYWQobWFzdGVyX2ZkKQorICAgICAgICAgICAgaWYgbm90IGRhdGE6ICAjIFJlYWNoZWQgRU9GLgorICAgICAgICAgICAgICAgIGZkcy5yZW1vdmUobWFzdGVyX2ZkKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy53cml0ZShTVERPVVRfRklMRU5PLCBkYXRhKQorICAgICAgICBpZiBTVERJTl9GSUxFTk8gaW4gcmZkczoKKyAgICAgICAgICAgIGRhdGEgPSBzdGRpbl9yZWFkKFNURElOX0ZJTEVOTykKKyAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgIGZkcy5yZW1vdmUoU1RESU5fRklMRU5PKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBfd3JpdGVuKG1hc3Rlcl9mZCwgZGF0YSkKKworZGVmIHNwYXduKGFyZ3YsIG1hc3Rlcl9yZWFkPV9yZWFkLCBzdGRpbl9yZWFkPV9yZWFkKToKKyAgICAiIiJDcmVhdGUgYSBzcGF3bmVkIHByb2Nlc3MuIiIiCisgICAgaWYgdHlwZShhcmd2KSA9PSB0eXBlKCcnKToKKyAgICAgICAgYXJndiA9IChhcmd2LCkKKyAgICBwaWQsIG1hc3Rlcl9mZCA9IGZvcmsoKQorICAgIGlmIHBpZCA9PSBDSElMRDoKKyAgICAgICAgb3MuZXhlY2xwKGFyZ3ZbMF0sICphcmd2KQorICAgIHRyeToKKyAgICAgICAgbW9kZSA9IHR0eS50Y2dldGF0dHIoU1RESU5fRklMRU5PKQorICAgICAgICB0dHkuc2V0cmF3KFNURElOX0ZJTEVOTykKKyAgICAgICAgcmVzdG9yZSA9IDEKKyAgICBleGNlcHQgdHR5LmVycm9yOiAgICAjIFRoaXMgaXMgdGhlIHNhbWUgYXMgdGVybWlvcy5lcnJvcgorICAgICAgICByZXN0b3JlID0gMAorICAgIHRyeToKKyAgICAgICAgX2NvcHkobWFzdGVyX2ZkLCBtYXN0ZXJfcmVhZCwgc3RkaW5fcmVhZCkKKyAgICBleGNlcHQgKElPRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICBpZiByZXN0b3JlOgorICAgICAgICAgICAgdHR5LnRjc2V0YXR0cihTVERJTl9GSUxFTk8sIHR0eS5UQ1NBRkxVU0gsIG1vZGUpCisKKyAgICBvcy5jbG9zZShtYXN0ZXJfZmQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B0eS5weWMgYi9saWIvcHl0aG9uMi43L3B0eS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxMGRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHR5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B0eS5weW8gYi9saWIvcHl0aG9uMi43L3B0eS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIxMGRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHR5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5X2NvbXBpbGUucHkgYi9saWIvcHl0aG9uMi43L3B5X2NvbXBpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiYzFlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weQpAQCAtMCwwICsxLDE3MCBAQAorIiIiUm91dGluZSB0byAiY29tcGlsZSIgYSAucHkgZmlsZSB0byBhIC5weWMgKG9yIC5weW8pIGZpbGUuCisKK1RoaXMgbW9kdWxlIGhhcyBpbnRpbWF0ZSBrbm93bGVkZ2Ugb2YgdGhlIGZvcm1hdCBvZiAucHljIGZpbGVzLgorIiIiCisKK2ltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IGltcAoraW1wb3J0IG1hcnNoYWwKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRyYWNlYmFjaworCitNQUdJQyA9IGltcC5nZXRfbWFnaWMoKQorCitfX2FsbF9fID0gWyJjb21waWxlIiwgIm1haW4iLCAiUHlDb21waWxlRXJyb3IiXQorCisKK2NsYXNzIFB5Q29tcGlsZUVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHJhaXNlZCB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhdHRlbXB0aW5nIHRvCisgICAgY29tcGlsZSB0aGUgZmlsZS4KKworICAgIFRvIHJhaXNlIHRoaXMgZXhjZXB0aW9uLCB1c2UKKworICAgICAgICByYWlzZSBQeUNvbXBpbGVFcnJvcihleGNfdHlwZSxleGNfdmFsdWUsZmlsZVssbXNnXSkKKworICAgIHdoZXJlCisKKyAgICAgICAgZXhjX3R5cGU6ICAgZXhjZXB0aW9uIHR5cGUgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIHR5cGUgbmFtZSBjYW4gYmUgYWNjZXNzZXMgYXMgY2xhc3MgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgJ2V4Y190eXBlX25hbWUnCisKKyAgICAgICAgZXhjX3ZhbHVlOiAgZXhjZXB0aW9uIHZhbHVlIHRvIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICBjYW4gYmUgYWNjZXNzZXMgYXMgY2xhc3MgdmFyaWFibGUgJ2V4Y192YWx1ZScKKworICAgICAgICBmaWxlOiAgICAgICBuYW1lIG9mIGZpbGUgYmVpbmcgY29tcGlsZWQgdG8gYmUgdXNlZCBpbiBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhY2Nlc3NlcyBhcyBjbGFzcyB2YXJpYWJsZSAnZmlsZScKKworICAgICAgICBtc2c6ICAgICAgICBzdHJpbmcgbWVzc2FnZSB0byBiZSB3cml0dGVuIGFzIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgICAgICAgICAgICAgSWYgbm8gdmFsdWUgaXMgZ2l2ZW4sIGEgZGVmYXVsdCBleGNlcHRpb24gbWVzc2FnZSB3aWxsIGJlIGdpdmVuLAorICAgICAgICAgICAgICAgICAgICBjb25zaXN0ZW50IHdpdGggJ3N0YW5kYXJkJyBweV9jb21waWxlIG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSAob3IgZGVmYXVsdCkgY2FuIGJlIGFjY2Vzc2VzIGFzIGNsYXNzIHZhcmlhYmxlICdtc2cnCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCBmaWxlLCBtc2c9JycpOgorICAgICAgICBleGNfdHlwZV9uYW1lID0gZXhjX3R5cGUuX19uYW1lX18KKyAgICAgICAgaWYgZXhjX3R5cGUgaXMgU3ludGF4RXJyb3I6CisgICAgICAgICAgICB0YnRleHQgPSAnJy5qb2luKHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoZXhjX3R5cGUsIGV4Y192YWx1ZSkpCisgICAgICAgICAgICBlcnJtc2cgPSB0YnRleHQucmVwbGFjZSgnRmlsZSAiPHN0cmluZz4iJywgJ0ZpbGUgIiVzIicgJSBmaWxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXJybXNnID0gIlNvcnJ5OiAlczogJXMiICUgKGV4Y190eXBlX25hbWUsZXhjX3ZhbHVlKQorCisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLG1zZyBvciBlcnJtc2csZXhjX3R5cGVfbmFtZSxleGNfdmFsdWUsZmlsZSkKKworICAgICAgICBzZWxmLmV4Y190eXBlX25hbWUgPSBleGNfdHlwZV9uYW1lCisgICAgICAgIHNlbGYuZXhjX3ZhbHVlID0gZXhjX3ZhbHVlCisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cgb3IgZXJybXNnCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubXNnCisKKworZGVmIHdyX2xvbmcoZiwgeCk6CisgICAgIiIiSW50ZXJuYWw7IHdyaXRlIGEgMzItYml0IGludCB0byBhIGZpbGUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4iIiIKKyAgICBmLndyaXRlKGNociggeCAgICAgICAgJiAweGZmKSkKKyAgICBmLndyaXRlKGNocigoeCA+PiA4KSAgJiAweGZmKSkKKyAgICBmLndyaXRlKGNocigoeCA+PiAxNikgJiAweGZmKSkKKyAgICBmLndyaXRlKGNocigoeCA+PiAyNCkgJiAweGZmKSkKKworZGVmIGNvbXBpbGUoZmlsZSwgY2ZpbGU9Tm9uZSwgZGZpbGU9Tm9uZSwgZG9yYWlzZT1GYWxzZSk6CisgICAgIiIiQnl0ZS1jb21waWxlIG9uZSBQeXRob24gc291cmNlIGZpbGUgdG8gUHl0aG9uIGJ5dGVjb2RlLgorCisgICAgQXJndW1lbnRzOgorCisgICAgZmlsZTogICAgc291cmNlIGZpbGVuYW1lCisgICAgY2ZpbGU6ICAgdGFyZ2V0IGZpbGVuYW1lOyBkZWZhdWx0cyB0byBzb3VyY2Ugd2l0aCAnYycgb3IgJ28nIGFwcGVuZGVkCisgICAgICAgICAgICAgKCdjJyBub3JtYWxseSwgJ28nIGluIG9wdGltaXppbmcgbW9kZSwgZ2l2aW5nIC5weWMgb3IgLnB5bykKKyAgICBkZmlsZTogICBwdXJwb3J0ZWQgZmlsZW5hbWU7IGRlZmF1bHRzIHRvIHNvdXJjZSAodGhpcyBpcyB0aGUgZmlsZW5hbWUKKyAgICAgICAgICAgICB0aGF0IHdpbGwgc2hvdyB1cCBpbiBlcnJvciBtZXNzYWdlcykKKyAgICBkb3JhaXNlOiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgYW4gZXhjZXB0aW9uIHNob3VsZCBiZQorICAgICAgICAgICAgIHJhaXNlZCB3aGVuIGEgY29tcGlsZSBlcnJvciBpcyBmb3VuZC4gSWYgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgb2NjdXJzIGFuZCB0aGlzIGZsYWcgaXMgc2V0IHRvIEZhbHNlLCBhIHN0cmluZworICAgICAgICAgICAgIGluZGljYXRpbmcgdGhlIG5hdHVyZSBvZiB0aGUgZXhjZXB0aW9uIHdpbGwgYmUgcHJpbnRlZCwKKyAgICAgICAgICAgICBhbmQgdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRvIHRoZSBjYWxsZXIuIElmIGFuCisgICAgICAgICAgICAgZXhjZXB0aW9uIG9jY3VycyBhbmQgdGhpcyBmbGFnIGlzIHNldCB0byBUcnVlLCBhCisgICAgICAgICAgICAgUHlDb21waWxlRXJyb3IgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLgorCisgICAgTm90ZSB0aGF0IGl0IGlzbid0IG5lY2Vzc2FyeSB0byBieXRlLWNvbXBpbGUgUHl0aG9uIG1vZHVsZXMgZm9yCisgICAgZXhlY3V0aW9uIGVmZmljaWVuY3kgLS0gUHl0aG9uIGl0c2VsZiBieXRlLWNvbXBpbGVzIGEgbW9kdWxlIHdoZW4KKyAgICBpdCBpcyBsb2FkZWQsIGFuZCBpZiBpdCBjYW4sIHdyaXRlcyBvdXQgdGhlIGJ5dGVjb2RlIHRvIHRoZQorICAgIGNvcnJlc3BvbmRpbmcgLnB5YyAob3IgLnB5bykgZmlsZS4KKworICAgIEhvd2V2ZXIsIGlmIGEgUHl0aG9uIGluc3RhbGxhdGlvbiBpcyBzaGFyZWQgYmV0d2VlbiB1c2VycywgaXQgaXMgYQorICAgIGdvb2QgaWRlYSB0byBieXRlLWNvbXBpbGUgYWxsIG1vZHVsZXMgdXBvbiBpbnN0YWxsYXRpb24sIHNpbmNlCisgICAgb3RoZXIgdXNlcnMgbWF5IG5vdCBiZSBhYmxlIHRvIHdyaXRlIGluIHRoZSBzb3VyY2UgZGlyZWN0b3JpZXMsCisgICAgYW5kIHRodXMgdGhleSB3b24ndCBiZSBhYmxlIHRvIHdyaXRlIHRoZSAucHljLy5weW8gZmlsZSwgYW5kIHRoZW4KKyAgICB0aGV5IHdvdWxkIGJlIGJ5dGUtY29tcGlsaW5nIGV2ZXJ5IG1vZHVsZSBlYWNoIHRpbWUgaXQgaXMgbG9hZGVkLgorICAgIFRoaXMgY2FuIHNsb3cgZG93biBwcm9ncmFtIHN0YXJ0LXVwIGNvbnNpZGVyYWJseS4KKworICAgIFNlZSBjb21waWxlYWxsLnB5IGZvciBhIHNjcmlwdC9tb2R1bGUgdGhhdCB1c2VzIHRoaXMgbW9kdWxlIHRvCisgICAgYnl0ZS1jb21waWxlIGFsbCBpbnN0YWxsZWQgZmlsZXMgKG9yIGFsbCBmaWxlcyBpbiBzZWxlY3RlZAorICAgIGRpcmVjdG9yaWVzKS4KKworICAgICIiIgorICAgIHdpdGggb3BlbihmaWxlLCAnVScpIGFzIGY6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IGxvbmcob3MuZnN0YXQoZi5maWxlbm8oKSkuc3RfbXRpbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IGxvbmcob3Muc3RhdChmaWxlKS5zdF9tdGltZSkKKyAgICAgICAgY29kZXN0cmluZyA9IGYucmVhZCgpCisgICAgdHJ5OgorICAgICAgICBjb2Rlb2JqZWN0ID0gX19idWlsdGluX18uY29tcGlsZShjb2Rlc3RyaW5nLCBkZmlsZSBvciBmaWxlLCdleGVjJykKKyAgICBleGNlcHQgRXhjZXB0aW9uLGVycjoKKyAgICAgICAgcHlfZXhjID0gUHlDb21waWxlRXJyb3IoZXJyLl9fY2xhc3NfXywgZXJyLCBkZmlsZSBvciBmaWxlKQorICAgICAgICBpZiBkb3JhaXNlOgorICAgICAgICAgICAgcmFpc2UgcHlfZXhjCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHB5X2V4Yy5tc2cgKyAnXG4nKQorICAgICAgICAgICAgcmV0dXJuCisgICAgaWYgY2ZpbGUgaXMgTm9uZToKKyAgICAgICAgY2ZpbGUgPSBmaWxlICsgKF9fZGVidWdfXyBhbmQgJ2MnIG9yICdvJykKKyAgICB3aXRoIG9wZW4oY2ZpbGUsICd3YicpIGFzIGZjOgorICAgICAgICBmYy53cml0ZSgnXDBcMFwwXDAnKQorICAgICAgICB3cl9sb25nKGZjLCB0aW1lc3RhbXApCisgICAgICAgIG1hcnNoYWwuZHVtcChjb2Rlb2JqZWN0LCBmYykKKyAgICAgICAgZmMuZmx1c2goKQorICAgICAgICBmYy5zZWVrKDAsIDApCisgICAgICAgIGZjLndyaXRlKE1BR0lDKQorCitkZWYgbWFpbihhcmdzPU5vbmUpOgorICAgICIiIkNvbXBpbGUgc2V2ZXJhbCBzb3VyY2UgZmlsZXMuCisKKyAgICBUaGUgZmlsZXMgbmFtZWQgaW4gJ2FyZ3MnIChvciBvbiB0aGUgY29tbWFuZCBsaW5lLCBpZiAnYXJncycgaXMKKyAgICBub3Qgc3BlY2lmaWVkKSBhcmUgY29tcGlsZWQgYW5kIHRoZSByZXN1bHRpbmcgYnl0ZWNvZGUgaXMgY2FjaGVkCisgICAgaW4gdGhlIG5vcm1hbCBtYW5uZXIuICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHNlYXJjaCBhIGRpcmVjdG9yeQorICAgIHN0cnVjdHVyZSB0byBsb2NhdGUgc291cmNlIGZpbGVzOyBpdCBvbmx5IGNvbXBpbGVzIGZpbGVzIG5hbWVkCisgICAgZXhwbGljaXRseS4gIElmICctJyBpcyB0aGUgb25seSBwYXJhbWV0ZXIgaW4gYXJncywgdGhlIGxpc3Qgb2YKKyAgICBmaWxlcyBpcyB0YWtlbiBmcm9tIHN0YW5kYXJkIGlucHV0LgorCisgICAgIiIiCisgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisgICAgcnYgPSAwCisgICAgaWYgYXJncyA9PSBbJy0nXToKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yc3RyaXAoJ1xuJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb21waWxlKGZpbGVuYW1lLCBkb3JhaXNlPVRydWUpCisgICAgICAgICAgICBleGNlcHQgUHlDb21waWxlRXJyb3IgYXMgZXJyb3I6CisgICAgICAgICAgICAgICAgcnYgPSAxCisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiJXNcbiIgJSBlcnJvci5tc2cpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlcnJvcjoKKyAgICAgICAgICAgICAgICBydiA9IDEKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlc1xuIiAlIGVycm9yKQorICAgIGVsc2U6CisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbXBpbGUoZmlsZW5hbWUsIGRvcmFpc2U9VHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBQeUNvbXBpbGVFcnJvciBhcyBlcnJvcjoKKyAgICAgICAgICAgICAgICAjIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSBhdCBsZWFzdCBvbmUgZmFpbHVyZQorICAgICAgICAgICAgICAgIHJ2ID0gMQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoZXJyb3IubXNnKQorICAgIHJldHVybiBydgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weWMgYi9saWIvcHl0aG9uMi43L3B5X2NvbXBpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDlkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5X2NvbXBpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHlfY29tcGlsZS5weW8gYi9saWIvcHl0aG9uMi43L3B5X2NvbXBpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMDlkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5X2NvbXBpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcHljbGJyLnB5IGIvbGliL3B5dGhvbjIuNy9weWNsYnIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhmNzFhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHljbGJyLnB5CkBAIC0wLDAgKzEsMzQ0IEBACisiIiJQYXJzZSBhIFB5dGhvbiBtb2R1bGUgYW5kIGRlc2NyaWJlIGl0cyBjbGFzc2VzIGFuZCBtZXRob2RzLgorCitQYXJzZSBlbm91Z2ggb2YgYSBQeXRob24gZmlsZSB0byByZWNvZ25pemUgaW1wb3J0cyBhbmQgY2xhc3MgYW5kCittZXRob2QgZGVmaW5pdGlvbnMsIGFuZCB0byBmaW5kIG91dCB0aGUgc3VwZXJjbGFzc2VzIG9mIGEgY2xhc3MuCisKK1RoZSBpbnRlcmZhY2UgY29uc2lzdHMgb2YgYSBzaW5nbGUgZnVuY3Rpb246CisgICAgICAgIHJlYWRtb2R1bGVfZXgobW9kdWxlIFssIHBhdGhdKQord2hlcmUgbW9kdWxlIGlzIHRoZSBuYW1lIG9mIGEgUHl0aG9uIG1vZHVsZSwgYW5kIHBhdGggaXMgYW4gb3B0aW9uYWwKK2xpc3Qgb2YgZGlyZWN0b3JpZXMgd2hlcmUgdGhlIG1vZHVsZSBpcyB0byBiZSBzZWFyY2hlZC4gIElmIHByZXNlbnQsCitwYXRoIGlzIHByZXBlbmRlZCB0byB0aGUgc3lzdGVtIHNlYXJjaCBwYXRoIHN5cy5wYXRoLiAgVGhlIHJldHVybgordmFsdWUgaXMgYSBkaWN0aW9uYXJ5LiAgVGhlIGtleXMgb2YgdGhlIGRpY3Rpb25hcnkgYXJlIHRoZSBuYW1lcyBvZgordGhlIGNsYXNzZXMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlIChpbmNsdWRpbmcgY2xhc3NlcyB0aGF0IGFyZSBkZWZpbmVkCit2aWEgdGhlIGZyb20gWFhYIGltcG9ydCBZWVkgY29uc3RydWN0KS4gIFRoZSB2YWx1ZXMgYXJlIGNsYXNzCitpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIENsYXNzIGRlZmluZWQgaGVyZS4gIE9uZSBzcGVjaWFsIGtleS92YWx1ZSBwYWlyCitpcyBwcmVzZW50IGZvciBwYWNrYWdlczogdGhlIGtleSAnX19wYXRoX18nIGhhcyBhIGxpc3QgYXMgaXRzIHZhbHVlCit3aGljaCBjb250YWlucyB0aGUgcGFja2FnZSBzZWFyY2ggcGF0aC4KKworQSBjbGFzcyBpcyBkZXNjcmliZWQgYnkgdGhlIGNsYXNzIENsYXNzIGluIHRoaXMgbW9kdWxlLiAgSW5zdGFuY2VzCitvZiB0aGlzIGNsYXNzIGhhdmUgdGhlIGZvbGxvd2luZyBpbnN0YW5jZSB2YXJpYWJsZXM6CisgICAgICAgIG1vZHVsZSAtLSB0aGUgbW9kdWxlIG5hbWUKKyAgICAgICAgbmFtZSAtLSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MKKyAgICAgICAgc3VwZXIgLS0gYSBsaXN0IG9mIHN1cGVyIGNsYXNzZXMgKENsYXNzIGluc3RhbmNlcykKKyAgICAgICAgbWV0aG9kcyAtLSBhIGRpY3Rpb25hcnkgb2YgbWV0aG9kcworICAgICAgICBmaWxlIC0tIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBjbGFzcyB3YXMgZGVmaW5lZAorICAgICAgICBsaW5lbm8gLS0gdGhlIGxpbmUgaW4gdGhlIGZpbGUgb24gd2hpY2ggdGhlIGNsYXNzIHN0YXRlbWVudCBvY2N1cnJlZAorVGhlIGRpY3Rpb25hcnkgb2YgbWV0aG9kcyB1c2VzIHRoZSBtZXRob2QgbmFtZXMgYXMga2V5cyBhbmQgdGhlIGxpbmUKK251bWJlcnMgb24gd2hpY2ggdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBhcyB2YWx1ZXMuCitJZiB0aGUgbmFtZSBvZiBhIHN1cGVyIGNsYXNzIGlzIG5vdCByZWNvZ25pemVkLCB0aGUgY29ycmVzcG9uZGluZworZW50cnkgaW4gdGhlIGxpc3Qgb2Ygc3VwZXIgY2xhc3NlcyBpcyBub3QgYSBjbGFzcyBpbnN0YW5jZSBidXQgYQorc3RyaW5nIGdpdmluZyB0aGUgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MuICBTaW5jZSBpbXBvcnQgc3RhdGVtZW50cworYXJlIHJlY29nbml6ZWQgYW5kIGltcG9ydGVkIG1vZHVsZXMgYXJlIHNjYW5uZWQgYXMgd2VsbCwgdGhpcworc2hvdWxkbid0IGhhcHBlbiBvZnRlbi4KKworQSBmdW5jdGlvbiBpcyBkZXNjcmliZWQgYnkgdGhlIGNsYXNzIEZ1bmN0aW9uIGluIHRoaXMgbW9kdWxlLgorSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgaGF2ZSB0aGUgZm9sbG93aW5nIGluc3RhbmNlIHZhcmlhYmxlczoKKyAgICAgICAgbW9kdWxlIC0tIHRoZSBtb2R1bGUgbmFtZQorICAgICAgICBuYW1lIC0tIHRoZSBuYW1lIG9mIHRoZSBjbGFzcworICAgICAgICBmaWxlIC0tIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBjbGFzcyB3YXMgZGVmaW5lZAorICAgICAgICBsaW5lbm8gLS0gdGhlIGxpbmUgaW4gdGhlIGZpbGUgb24gd2hpY2ggdGhlIGNsYXNzIHN0YXRlbWVudCBvY2N1cnJlZAorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBpbXAKK2ltcG9ydCB0b2tlbml6ZQorZnJvbSB0b2tlbiBpbXBvcnQgTkFNRSwgREVERU5ULCBPUAorZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgorCitfX2FsbF9fID0gWyJyZWFkbW9kdWxlIiwgInJlYWRtb2R1bGVfZXgiLCAiQ2xhc3MiLCAiRnVuY3Rpb24iXQorCitfbW9kdWxlcyA9IHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSBvZiBtb2R1bGVzIHdlJ3ZlIHNlZW4KKworIyBlYWNoIFB5dGhvbiBjbGFzcyBpcyByZXByZXNlbnRlZCBieSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCitjbGFzcyBDbGFzczoKKyAgICAnJydDbGFzcyB0byByZXByZXNlbnQgYSBQeXRob24gY2xhc3MuJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSwgbmFtZSwgc3VwZXIsIGZpbGUsIGxpbmVubyk6CisgICAgICAgIHNlbGYubW9kdWxlID0gbW9kdWxlCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgaWYgc3VwZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHN1cGVyID0gW10KKyAgICAgICAgc2VsZi5zdXBlciA9IHN1cGVyCisgICAgICAgIHNlbGYubWV0aG9kcyA9IHt9CisgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKworICAgIGRlZiBfYWRkbWV0aG9kKHNlbGYsIG5hbWUsIGxpbmVubyk6CisgICAgICAgIHNlbGYubWV0aG9kc1tuYW1lXSA9IGxpbmVubworCitjbGFzcyBGdW5jdGlvbjoKKyAgICAnJydDbGFzcyB0byByZXByZXNlbnQgYSB0b3AtbGV2ZWwgUHl0aG9uIGZ1bmN0aW9uJycnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSwgbmFtZSwgZmlsZSwgbGluZW5vKToKKyAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYubGluZW5vID0gbGluZW5vCisKK2RlZiByZWFkbW9kdWxlKG1vZHVsZSwgcGF0aD1Ob25lKToKKyAgICAnJydCYWNrd2FyZHMgY29tcGF0aWJsZSBpbnRlcmZhY2UuCisKKyAgICBDYWxsIHJlYWRtb2R1bGVfZXgoKSBhbmQgdGhlbiBvbmx5IGtlZXAgQ2xhc3Mgb2JqZWN0cyBmcm9tIHRoZQorICAgIHJlc3VsdGluZyBkaWN0aW9uYXJ5LicnJworCisgICAgcmVzID0ge30KKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfcmVhZG1vZHVsZShtb2R1bGUsIHBhdGggb3IgW10pLml0ZW1zKCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIENsYXNzKToKKyAgICAgICAgICAgIHJlc1trZXldID0gdmFsdWUKKyAgICByZXR1cm4gcmVzCisKK2RlZiByZWFkbW9kdWxlX2V4KG1vZHVsZSwgcGF0aD1Ob25lKToKKyAgICAnJydSZWFkIGEgbW9kdWxlIGZpbGUgYW5kIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgY2xhc3Nlcy4KKworICAgIFNlYXJjaCBmb3IgTU9EVUxFIGluIFBBVEggYW5kIHN5cy5wYXRoLCByZWFkIGFuZCBwYXJzZSB0aGUKKyAgICBtb2R1bGUgYW5kIHJldHVybiBhIGRpY3Rpb25hcnkgd2l0aCBvbmUgZW50cnkgZm9yIGVhY2ggY2xhc3MKKyAgICBmb3VuZCBpbiB0aGUgbW9kdWxlLgorICAgICcnJworICAgIHJldHVybiBfcmVhZG1vZHVsZShtb2R1bGUsIHBhdGggb3IgW10pCisKK2RlZiBfcmVhZG1vZHVsZShtb2R1bGUsIHBhdGgsIGlucGFja2FnZT1Ob25lKToKKyAgICAnJydEbyB0aGUgaGFyZCB3b3JrIGZvciByZWFkbW9kdWxlW19leF0uCisKKyAgICBJZiBJTlBBQ0tBR0UgaXMgZ2l2ZW4sIGl0IG11c3QgYmUgdGhlIGRvdHRlZCBuYW1lIG9mIHRoZSBwYWNrYWdlIGluCisgICAgd2hpY2ggd2UgYXJlIHNlYXJjaGluZyBmb3IgYSBzdWJtb2R1bGUsIGFuZCB0aGVuIFBBVEggbXVzdCBiZSB0aGUKKyAgICBwYWNrYWdlIHNlYXJjaCBwYXRoOyBvdGhlcndpc2UsIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGEgdG9wLWxldmVsCisgICAgbW9kdWxlLCBhbmQgUEFUSCBpcyBjb21iaW5lZCB3aXRoIHN5cy5wYXRoLgorICAgICcnJworICAgICMgQ29tcHV0ZSB0aGUgZnVsbCBtb2R1bGUgbmFtZSAocHJlcGVuZGluZyBpbnBhY2thZ2UgaWYgc2V0KQorICAgIGlmIGlucGFja2FnZSBpcyBub3QgTm9uZToKKyAgICAgICAgZnVsbG1vZHVsZSA9ICIlcy4lcyIgJSAoaW5wYWNrYWdlLCBtb2R1bGUpCisgICAgZWxzZToKKyAgICAgICAgZnVsbG1vZHVsZSA9IG1vZHVsZQorCisgICAgIyBDaGVjayBpbiB0aGUgY2FjaGUKKyAgICBpZiBmdWxsbW9kdWxlIGluIF9tb2R1bGVzOgorICAgICAgICByZXR1cm4gX21vZHVsZXNbZnVsbG1vZHVsZV0KKworICAgICMgSW5pdGlhbGl6ZSB0aGUgZGljdCBmb3IgdGhpcyBtb2R1bGUncyBjb250ZW50cworICAgIGRpY3QgPSB7fQorCisgICAgIyBDaGVjayBpZiBpdCBpcyBhIGJ1aWx0LWluIG1vZHVsZTsgd2UgZG9uJ3QgZG8gbXVjaCBmb3IgdGhlc2UKKyAgICBpZiBtb2R1bGUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzIGFuZCBpbnBhY2thZ2UgaXMgTm9uZToKKyAgICAgICAgX21vZHVsZXNbbW9kdWxlXSA9IGRpY3QKKyAgICAgICAgcmV0dXJuIGRpY3QKKworICAgICMgQ2hlY2sgZm9yIGEgZG90dGVkIG1vZHVsZSBuYW1lCisgICAgaSA9IG1vZHVsZS5yZmluZCgnLicpCisgICAgaWYgaSA+PSAwOgorICAgICAgICBwYWNrYWdlID0gbW9kdWxlWzppXQorICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGVbaSsxOl0KKyAgICAgICAgcGFyZW50ID0gX3JlYWRtb2R1bGUocGFja2FnZSwgcGF0aCwgaW5wYWNrYWdlKQorICAgICAgICBpZiBpbnBhY2thZ2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwYWNrYWdlID0gIiVzLiVzIiAlIChpbnBhY2thZ2UsIHBhY2thZ2UpCisgICAgICAgIGlmIG5vdCAnX19wYXRoX18nIGluIHBhcmVudDoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCdObyBwYWNrYWdlIG5hbWVkIHt9Jy5mb3JtYXQocGFja2FnZSkpCisgICAgICAgIHJldHVybiBfcmVhZG1vZHVsZShzdWJtb2R1bGUsIHBhcmVudFsnX19wYXRoX18nXSwgcGFja2FnZSkKKworICAgICMgU2VhcmNoIHRoZSBwYXRoIGZvciB0aGUgbW9kdWxlCisgICAgZiA9IE5vbmUKKyAgICBpZiBpbnBhY2thZ2UgaXMgbm90IE5vbmU6CisgICAgICAgIGYsIGZuYW1lLCAoX3MsIF9tLCB0eSkgPSBpbXAuZmluZF9tb2R1bGUobW9kdWxlLCBwYXRoKQorICAgIGVsc2U6CisgICAgICAgIGYsIGZuYW1lLCAoX3MsIF9tLCB0eSkgPSBpbXAuZmluZF9tb2R1bGUobW9kdWxlLCBwYXRoICsgc3lzLnBhdGgpCisgICAgaWYgdHkgPT0gaW1wLlBLR19ESVJFQ1RPUlk6CisgICAgICAgIGRpY3RbJ19fcGF0aF9fJ10gPSBbZm5hbWVdCisgICAgICAgIHBhdGggPSBbZm5hbWVdICsgcGF0aAorICAgICAgICBmLCBmbmFtZSwgKF9zLCBfbSwgdHkpID0gaW1wLmZpbmRfbW9kdWxlKCdfX2luaXRfXycsIFtmbmFtZV0pCisgICAgX21vZHVsZXNbZnVsbG1vZHVsZV0gPSBkaWN0CisgICAgaWYgdHkgIT0gaW1wLlBZX1NPVVJDRToKKyAgICAgICAgIyBub3QgUHl0aG9uIHNvdXJjZSwgY2FuJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGlzIG1vZHVsZQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIGRpY3QKKworICAgIHN0YWNrID0gW10gIyBzdGFjayBvZiAoY2xhc3MsIGluZGVudCkgcGFpcnMKKworICAgIGcgPSB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSkKKyAgICB0cnk6CisgICAgICAgIGZvciB0b2tlbnR5cGUsIHRva2VuLCBzdGFydCwgX2VuZCwgX2xpbmUgaW4gZzoKKyAgICAgICAgICAgIGlmIHRva2VudHlwZSA9PSBERURFTlQ6CisgICAgICAgICAgICAgICAgbGluZW5vLCB0aGlzaW5kZW50ID0gc3RhcnQKKyAgICAgICAgICAgICAgICAjIGNsb3NlIG5lc3RlZCBjbGFzc2VzIGFuZCBkZWZzCisgICAgICAgICAgICAgICAgd2hpbGUgc3RhY2sgYW5kIHN0YWNrWy0xXVsxXSA+PSB0aGlzaW5kZW50OgorICAgICAgICAgICAgICAgICAgICBkZWwgc3RhY2tbLTFdCisgICAgICAgICAgICBlbGlmIHRva2VuID09ICdkZWYnOgorICAgICAgICAgICAgICAgIGxpbmVubywgdGhpc2luZGVudCA9IHN0YXJ0CisgICAgICAgICAgICAgICAgIyBjbG9zZSBwcmV2aW91cyBuZXN0ZWQgY2xhc3NlcyBhbmQgZGVmcworICAgICAgICAgICAgICAgIHdoaWxlIHN0YWNrIGFuZCBzdGFja1stMV1bMV0gPj0gdGhpc2luZGVudDoKKyAgICAgICAgICAgICAgICAgICAgZGVsIHN0YWNrWy0xXQorICAgICAgICAgICAgICAgIHRva2VudHlwZSwgbWV0aF9uYW1lLCBzdGFydCA9IGcubmV4dCgpWzA6M10KKyAgICAgICAgICAgICAgICBpZiB0b2tlbnR5cGUgIT0gTkFNRToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyBTeW50YXggZXJyb3IKKyAgICAgICAgICAgICAgICBpZiBzdGFjazoKKyAgICAgICAgICAgICAgICAgICAgY3VyX2NsYXNzID0gc3RhY2tbLTFdWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoY3VyX2NsYXNzLCBDbGFzcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jbGFzcy5fYWRkbWV0aG9kKG1ldGhfbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgICAgICAgICAjIGVsc2UgaXQncyBhIG5lc3RlZCBkZWYKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBmdW5jdGlvbgorICAgICAgICAgICAgICAgICAgICBkaWN0W21ldGhfbmFtZV0gPSBGdW5jdGlvbihmdWxsbW9kdWxlLCBtZXRoX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKChOb25lLCB0aGlzaW5kZW50KSkgIyBNYXJrZXIgZm9yIG5lc3RlZCBmbnMKKyAgICAgICAgICAgIGVsaWYgdG9rZW4gPT0gJ2NsYXNzJzoKKyAgICAgICAgICAgICAgICBsaW5lbm8sIHRoaXNpbmRlbnQgPSBzdGFydAorICAgICAgICAgICAgICAgICMgY2xvc2UgcHJldmlvdXMgbmVzdGVkIGNsYXNzZXMgYW5kIGRlZnMKKyAgICAgICAgICAgICAgICB3aGlsZSBzdGFjayBhbmQgc3RhY2tbLTFdWzFdID49IHRoaXNpbmRlbnQ6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzdGFja1stMV0KKyAgICAgICAgICAgICAgICB0b2tlbnR5cGUsIGNsYXNzX25hbWUsIHN0YXJ0ID0gZy5uZXh0KClbMDozXQorICAgICAgICAgICAgICAgIGlmIHRva2VudHlwZSAhPSBOQU1FOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAjIFN5bnRheCBlcnJvcgorICAgICAgICAgICAgICAgICMgcGFyc2Ugd2hhdCBmb2xsb3dzIHRoZSBjbGFzcyBuYW1lCisgICAgICAgICAgICAgICAgdG9rZW50eXBlLCB0b2tlbiwgc3RhcnQgPSBnLm5leHQoKVswOjNdCisgICAgICAgICAgICAgICAgaW5oZXJpdCA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAnKCc6CisgICAgICAgICAgICAgICAgICAgIG5hbWVzID0gW10gIyBMaXN0IG9mIHN1cGVyY2xhc3NlcworICAgICAgICAgICAgICAgICAgICAjIHRoZXJlJ3MgYSBsaXN0IG9mIHN1cGVyY2xhc3NlcworICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IDEKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIgPSBbXSAjIFRva2VucyBtYWtpbmcgdXAgY3VycmVudCBzdXBlcmNsYXNzCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbnR5cGUsIHRva2VuLCBzdGFydCA9IGcubmV4dCgpWzA6M10KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRva2VuIGluICgnKScsICcsJykgYW5kIGxldmVsID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9ICIiLmpvaW4oc3VwZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbiBpbiBkaWN0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdlIGtub3cgdGhpcyBzdXBlciBjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZGljdFtuXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBuLnNwbGl0KCcuJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGMpID4gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3VwZXIgY2xhc3MgaXMgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbW9kdWxlLmNsYXNzOiBsb29rIGluIG1vZHVsZSBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBjWy0yXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IGNbLTFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBtIGluIF9tb2R1bGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBfbW9kdWxlc1ttXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGMgaW4gZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbiA9IGRbY10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQobikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlciA9IFtdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0b2tlbiA9PSAnKCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiB0b2tlbiA9PSAnKSc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgLT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxldmVsID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHRva2VuID09ICcsJyBhbmQgbGV2ZWwgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgdXNlIE5BTUUgYW5kIE9QICg9PSBkb3QpIHRva2VucyBmb3IgdHlwZSBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIHRva2VudHlwZSBpbiAoTkFNRSwgT1ApIGFuZCBsZXZlbCA9PSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmFwcGVuZCh0b2tlbikKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZXhwcmVzc2lvbnMgaW4gdGhlIGJhc2UgbGlzdCBhcmUgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICBpbmhlcml0ID0gbmFtZXMKKyAgICAgICAgICAgICAgICBjdXJfY2xhc3MgPSBDbGFzcyhmdWxsbW9kdWxlLCBjbGFzc19uYW1lLCBpbmhlcml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZuYW1lLCBsaW5lbm8pCisgICAgICAgICAgICAgICAgaWYgbm90IHN0YWNrOgorICAgICAgICAgICAgICAgICAgICBkaWN0W2NsYXNzX25hbWVdID0gY3VyX2NsYXNzCisgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKChjdXJfY2xhc3MsIHRoaXNpbmRlbnQpKQorICAgICAgICAgICAgZWxpZiB0b2tlbiA9PSAnaW1wb3J0JyBhbmQgc3RhcnRbMV0gPT0gMDoKKyAgICAgICAgICAgICAgICBtb2R1bGVzID0gX2dldG5hbWVsaXN0KGcpCisgICAgICAgICAgICAgICAgZm9yIG1vZCwgX21vZDIgaW4gbW9kdWxlczoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWN1cnNpdmVseSByZWFkIHRoZSBpbXBvcnRlZCBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlucGFja2FnZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZWFkbW9kdWxlKG1vZCwgcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVhZG1vZHVsZShtb2QsIHBhdGgsIGlucGFja2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZWFkbW9kdWxlKG1vZCwgW10pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgd2UgY2FuJ3QgZmluZCBvciBwYXJzZSB0aGUgaW1wb3J0ZWQgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIyB0b28gYmFkIC0tIGRvbid0IGRpZSBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiB0b2tlbiA9PSAnZnJvbScgYW5kIHN0YXJ0WzFdID09IDA6CisgICAgICAgICAgICAgICAgbW9kLCB0b2tlbiA9IF9nZXRuYW1lKGcpCisgICAgICAgICAgICAgICAgaWYgbm90IG1vZCBvciB0b2tlbiAhPSAiaW1wb3J0IjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBuYW1lcyA9IF9nZXRuYW1lbGlzdChnKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyBSZWN1cnNpdmVseSByZWFkIHRoZSBpbXBvcnRlZCBtb2R1bGUKKyAgICAgICAgICAgICAgICAgICAgZCA9IF9yZWFkbW9kdWxlKG1vZCwgcGF0aCwgaW5wYWNrYWdlKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgIyBJZiB3ZSBjYW4ndCBmaW5kIG9yIHBhcnNlIHRoZSBpbXBvcnRlZCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICMgdG9vIGJhZCAtLSBkb24ndCBkaWUgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAjIGFkZCBhbnkgY2xhc3NlcyB0aGF0IHdlcmUgZGVmaW5lZCBpbiB0aGUgaW1wb3J0ZWQgbW9kdWxlCisgICAgICAgICAgICAgICAgIyB0byBvdXIgbmFtZSBzcGFjZSBpZiB0aGV5IHdlcmUgbWVudGlvbmVkIGluIHRoZSBsaXN0CisgICAgICAgICAgICAgICAgZm9yIG4sIG4yIGluIG5hbWVzOgorICAgICAgICAgICAgICAgICAgICBpZiBuIGluIGQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkaWN0W24yIG9yIG5dID0gZFtuXQorICAgICAgICAgICAgICAgICAgICBlbGlmIG4gPT0gJyonOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb24ndCBhZGQgbmFtZXMgdGhhdCBzdGFydCB3aXRoIF8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuIGluIGQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgblswXSAhPSAnXyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rbbl0gPSBkW25dCisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHBhc3MKKworICAgIGYuY2xvc2UoKQorICAgIHJldHVybiBkaWN0CisKK2RlZiBfZ2V0bmFtZWxpc3QoZyk6CisgICAgIyBIZWxwZXIgdG8gZ2V0IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZG90dGVkIG5hbWVzIHBsdXMgJ2FzJworICAgICMgY2xhdXNlcy4gIFJldHVybiBhIGxpc3Qgb2YgcGFpcnMgKG5hbWUsIG5hbWUyKSB3aGVyZSBuYW1lMiBpcworICAgICMgdGhlICdhcycgbmFtZSwgb3IgTm9uZSBpZiB0aGVyZSBpcyBubyAnYXMnIGNsYXVzZS4KKyAgICBuYW1lcyA9IFtdCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgbmFtZSwgdG9rZW4gPSBfZ2V0bmFtZShnKQorICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIHRva2VuID09ICdhcyc6CisgICAgICAgICAgICBuYW1lMiwgdG9rZW4gPSBfZ2V0bmFtZShnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZTIgPSBOb25lCisgICAgICAgIG5hbWVzLmFwcGVuZCgobmFtZSwgbmFtZTIpKQorICAgICAgICB3aGlsZSB0b2tlbiAhPSAiLCIgYW5kICJcbiIgbm90IGluIHRva2VuOgorICAgICAgICAgICAgdG9rZW4gPSBnLm5leHQoKVsxXQorICAgICAgICBpZiB0b2tlbiAhPSAiLCI6CisgICAgICAgICAgICBicmVhaworICAgIHJldHVybiBuYW1lcworCitkZWYgX2dldG5hbWUoZyk6CisgICAgIyBIZWxwZXIgdG8gZ2V0IGEgZG90dGVkIG5hbWUsIHJldHVybiBhIHBhaXIgKG5hbWUsIHRva2VuKSB3aGVyZQorICAgICMgbmFtZSBpcyB0aGUgZG90dGVkIG5hbWUsIG9yIE5vbmUgaWYgdGhlcmUgd2FzIG5vIGRvdHRlZCBuYW1lLAorICAgICMgYW5kIHRva2VuIGlzIHRoZSBuZXh0IGlucHV0IHRva2VuLgorICAgIHBhcnRzID0gW10KKyAgICB0b2tlbnR5cGUsIHRva2VuID0gZy5uZXh0KClbMDoyXQorICAgIGlmIHRva2VudHlwZSAhPSBOQU1FIGFuZCB0b2tlbiAhPSAnKic6CisgICAgICAgIHJldHVybiAoTm9uZSwgdG9rZW4pCisgICAgcGFydHMuYXBwZW5kKHRva2VuKQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRva2VudHlwZSwgdG9rZW4gPSBnLm5leHQoKVswOjJdCisgICAgICAgIGlmIHRva2VuICE9ICcuJzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHRva2VudHlwZSwgdG9rZW4gPSBnLm5leHQoKVswOjJdCisgICAgICAgIGlmIHRva2VudHlwZSAhPSBOQU1FOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcGFydHMuYXBwZW5kKHRva2VuKQorICAgIHJldHVybiAoIi4iLmpvaW4ocGFydHMpLCB0b2tlbikKKworZGVmIF9tYWluKCk6CisgICAgIyBNYWluIHByb2dyYW0gZm9yIHRlc3RpbmcuCisgICAgaW1wb3J0IG9zCisgICAgbW9kID0gc3lzLmFyZ3ZbMV0KKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhtb2QpOgorICAgICAgICBwYXRoID0gW29zLnBhdGguZGlybmFtZShtb2QpXQorICAgICAgICBtb2QgPSBvcy5wYXRoLmJhc2VuYW1lKG1vZCkKKyAgICAgICAgaWYgbW9kLmxvd2VyKCkuZW5kc3dpdGgoIi5weSIpOgorICAgICAgICAgICAgbW9kID0gbW9kWzotM10KKyAgICBlbHNlOgorICAgICAgICBwYXRoID0gW10KKyAgICBkaWN0ID0gcmVhZG1vZHVsZV9leChtb2QsIHBhdGgpCisgICAgb2JqcyA9IGRpY3QudmFsdWVzKCkKKyAgICBvYmpzLnNvcnQobGFtYmRhIGEsIGI6IGNtcChnZXRhdHRyKGEsICdsaW5lbm8nLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKGIsICdsaW5lbm8nLCAwKSkpCisgICAgZm9yIG9iaiBpbiBvYmpzOgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgQ2xhc3MpOgorICAgICAgICAgICAgcHJpbnQgImNsYXNzIiwgb2JqLm5hbWUsIG9iai5zdXBlciwgb2JqLmxpbmVubworICAgICAgICAgICAgbWV0aG9kcyA9IHNvcnRlZChvYmoubWV0aG9kcy5pdGVyaXRlbXMoKSwga2V5PWl0ZW1nZXR0ZXIoMSkpCisgICAgICAgICAgICBmb3IgbmFtZSwgbGluZW5vIGluIG1ldGhvZHM6CisgICAgICAgICAgICAgICAgaWYgbmFtZSAhPSAiX19wYXRoX18iOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiICBkZWYiLCBuYW1lLCBsaW5lbm8KKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgRnVuY3Rpb24pOgorICAgICAgICAgICAgcHJpbnQgImRlZiIsIG9iai5uYW1lLCBvYmoubGluZW5vCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgX21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weWNsYnIucHljIGIvbGliL3B5dGhvbjIuNy9weWNsYnIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmFmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5Y2xici5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weWNsYnIucHlvIGIvbGliL3B5dGhvbjIuNy9weWNsYnIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZmFmNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5Y2xici5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weWRvYy5weSBiL2xpYi9weXRob24yLjcvcHlkb2MucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjhiYTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2MucHkKQEAgLTAsMCArMSwyMzU5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogbGF0aW4tMSAtKi0KKyIiIkdlbmVyYXRlIFB5dGhvbiBkb2N1bWVudGF0aW9uIGluIEhUTUwgb3IgdGV4dCBmb3IgaW50ZXJhY3RpdmUgdXNlLgorCitJbiB0aGUgUHl0aG9uIGludGVycHJldGVyLCBkbyAiZnJvbSBweWRvYyBpbXBvcnQgaGVscCIgdG8gcHJvdmlkZSBvbmxpbmUKK2hlbHAuICBDYWxsaW5nIGhlbHAodGhpbmcpIG9uIGEgUHl0aG9uIG9iamVjdCBkb2N1bWVudHMgdGhlIG9iamVjdC4KKworT3IsIGF0IHRoZSBzaGVsbCBjb21tYW5kIGxpbmUgb3V0c2lkZSBvZiBQeXRob246CisKK1J1biAicHlkb2MgPG5hbWU+IiB0byBzaG93IGRvY3VtZW50YXRpb24gb24gc29tZXRoaW5nLiAgPG5hbWU+IG1heSBiZQordGhlIG5hbWUgb2YgYSBmdW5jdGlvbiwgbW9kdWxlLCBwYWNrYWdlLCBvciBhIGRvdHRlZCByZWZlcmVuY2UgdG8gYQorY2xhc3Mgb3IgZnVuY3Rpb24gd2l0aGluIGEgbW9kdWxlIG9yIG1vZHVsZSBpbiBhIHBhY2thZ2UuICBJZiB0aGUKK2FyZ3VtZW50IGNvbnRhaW5zIGEgcGF0aCBzZWdtZW50IGRlbGltaXRlciAoZS5nLiBzbGFzaCBvbiBVbml4LAorYmFja3NsYXNoIG9uIFdpbmRvd3MpIGl0IGlzIHRyZWF0ZWQgYXMgdGhlIHBhdGggdG8gYSBQeXRob24gc291cmNlIGZpbGUuCisKK1J1biAicHlkb2MgLWsgPGtleXdvcmQ+IiB0byBzZWFyY2ggZm9yIGEga2V5d29yZCBpbiB0aGUgc3lub3BzaXMgbGluZXMKK29mIGFsbCBhdmFpbGFibGUgbW9kdWxlcy4KKworUnVuICJweWRvYyAtcCA8cG9ydD4iIHRvIHN0YXJ0IGFuIEhUVFAgc2VydmVyIG9uIGEgZ2l2ZW4gcG9ydCBvbiB0aGUKK2xvY2FsIG1hY2hpbmUgdG8gZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiB3ZWIgcGFnZXMuCisKK0ZvciBwbGF0Zm9ybXMgd2l0aG91dCBhIGNvbW1hbmQgbGluZSwgInB5ZG9jIC1nIiBzdGFydHMgdGhlIEhUVFAgc2VydmVyCithbmQgYWxzbyBwb3BzIHVwIGEgbGl0dGxlIHdpbmRvdyBmb3IgY29udHJvbGxpbmcgaXQuCisKK1J1biAicHlkb2MgLXcgPG5hbWU+IiB0byB3cml0ZSBvdXQgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBtb2R1bGUKK3RvIGEgZmlsZSBuYW1lZCAiPG5hbWU+Lmh0bWwiLgorCitNb2R1bGUgZG9jcyBmb3IgY29yZSBtb2R1bGVzIGFyZSBhc3N1bWVkIHRvIGJlIGluCisKKyAgICBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYnJhcnkvCisKK1RoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUgUFlUSE9ORE9DUyBlbnZpcm9ubWVudCB2YXJpYWJsZQordG8gYSBkaWZmZXJlbnQgVVJMIG9yIHRvIGEgbG9jYWwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIExpYnJhcnkKK1JlZmVyZW5jZSBNYW51YWwgcGFnZXMuCisiIiIKKworX19hdXRob3JfXyA9ICJLYS1QaW5nIFllZSA8cGluZ0BsZncub3JnPiIKK19fZGF0ZV9fID0gIjI2IEZlYnJ1YXJ5IDIwMDEiCisKK19fdmVyc2lvbl9fID0gIiRSZXZpc2lvbjogODg1NjQgJCIKK19fY3JlZGl0c19fID0gIiIiR3VpZG8gdmFuIFJvc3N1bSwgZm9yIGFuIGV4Y2VsbGVudCBwcm9ncmFtbWluZyBsYW5ndWFnZS4KK1RvbW15IEJ1cm5ldHRlLCB0aGUgb3JpZ2luYWwgY3JlYXRvciBvZiBtYW5weS4KK1BhdWwgUHJlc2NvZCwgZm9yIGFsbCBoaXMgd29yayBvbiBvbmxpbmVoZWxwLgorUmljaGFyZCBDaGFtYmVybGFpbiwgZm9yIHRoZSBmaXJzdCBpbXBsZW1lbnRhdGlvbiBvZiB0ZXh0ZG9jLgorIiIiCisKKyMgS25vd24gYnVncyB0aGF0IGNhbid0IGJlIGZpeGVkIGhlcmU6CisjICAgLSBpbXAubG9hZF9tb2R1bGUoKSBjYW5ub3QgYmUgcHJldmVudGVkIGZyb20gY2xvYmJlcmluZyBleGlzdGluZworIyAgICAgbG9hZGVkIG1vZHVsZXMsIHNvIGNhbGxpbmcgc3lub3BzaXMoKSBvbiBhIGJpbmFyeSBtb2R1bGUgZmlsZQorIyAgICAgY2hhbmdlcyB0aGUgY29udGVudHMgb2YgYW55IGV4aXN0aW5nIG1vZHVsZSB3aXRoIHRoZSBzYW1lIG5hbWUuCisjICAgLSBJZiB0aGUgX19maWxlX18gYXR0cmlidXRlIG9uIGEgbW9kdWxlIGlzIGEgcmVsYXRpdmUgcGF0aCBhbmQKKyMgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBjaGFuZ2VkIHdpdGggb3MuY2hkaXIoKSwgYW4gaW5jb3JyZWN0CisjICAgICBwYXRoIHdpbGwgYmUgZGlzcGxheWVkLgorCitpbXBvcnQgc3lzLCBpbXAsIG9zLCByZSwgdHlwZXMsIGluc3BlY3QsIF9fYnVpbHRpbl9fLCBwa2d1dGlsLCB3YXJuaW5ncworZnJvbSByZXByIGltcG9ydCBSZXByCitmcm9tIHN0cmluZyBpbXBvcnQgZXhwYW5kdGFicywgZmluZCwgam9pbiwgbG93ZXIsIHNwbGl0LCBzdHJpcCwgcmZpbmQsIHJzdHJpcAorZnJvbSB0cmFjZWJhY2sgaW1wb3J0IGV4dHJhY3RfdGIKK3RyeToKKyAgICBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgUHl0aG9uIDIuMyBjb21wYXRpYmlsaXR5CisgICAgY2xhc3MgZGVxdWUobGlzdCk6CisgICAgICAgIGRlZiBwb3BsZWZ0KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucG9wKDApCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbW1vbiByb3V0aW5lcworCitkZWYgcGF0aGRpcnMoKToKKyAgICAiIiJDb252ZXJ0IHN5cy5wYXRoIGludG8gYSBsaXN0IG9mIGFic29sdXRlLCBleGlzdGluZywgdW5pcXVlIHBhdGhzLiIiIgorICAgIGRpcnMgPSBbXQorICAgIG5vcm1kaXJzID0gW10KKyAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgorICAgICAgICBkaXIgPSBvcy5wYXRoLmFic3BhdGgoZGlyIG9yICcuJykKKyAgICAgICAgbm9ybWRpciA9IG9zLnBhdGgubm9ybWNhc2UoZGlyKQorICAgICAgICBpZiBub3JtZGlyIG5vdCBpbiBub3JtZGlycyBhbmQgb3MucGF0aC5pc2RpcihkaXIpOgorICAgICAgICAgICAgZGlycy5hcHBlbmQoZGlyKQorICAgICAgICAgICAgbm9ybWRpcnMuYXBwZW5kKG5vcm1kaXIpCisgICAgcmV0dXJuIGRpcnMKKworZGVmIGdldGRvYyhvYmplY3QpOgorICAgICIiIkdldCB0aGUgZG9jIHN0cmluZyBvciBjb21tZW50cyBmb3IgYW4gb2JqZWN0LiIiIgorICAgIHJlc3VsdCA9IGluc3BlY3QuZ2V0ZG9jKG9iamVjdCkgb3IgaW5zcGVjdC5nZXRjb21tZW50cyhvYmplY3QpCisgICAgcmV0dXJuIHJlc3VsdCBhbmQgcmUuc3ViKCdeICpcbicsICcnLCByc3RyaXAocmVzdWx0KSkgb3IgJycKKworZGVmIHNwbGl0ZG9jKGRvYyk6CisgICAgIiIiU3BsaXQgYSBkb2Mgc3RyaW5nIGludG8gYSBzeW5vcHNpcyBsaW5lIChpZiBhbnkpIGFuZCB0aGUgcmVzdC4iIiIKKyAgICBsaW5lcyA9IHNwbGl0KHN0cmlwKGRvYyksICdcbicpCisgICAgaWYgbGVuKGxpbmVzKSA9PSAxOgorICAgICAgICByZXR1cm4gbGluZXNbMF0sICcnCisgICAgZWxpZiBsZW4obGluZXMpID49IDIgYW5kIG5vdCByc3RyaXAobGluZXNbMV0pOgorICAgICAgICByZXR1cm4gbGluZXNbMF0sIGpvaW4obGluZXNbMjpdLCAnXG4nKQorICAgIHJldHVybiAnJywgam9pbihsaW5lcywgJ1xuJykKKworZGVmIGNsYXNzbmFtZShvYmplY3QsIG1vZG5hbWUpOgorICAgICIiIkdldCBhIGNsYXNzIG5hbWUgYW5kIHF1YWxpZnkgaXQgd2l0aCBhIG1vZHVsZSBuYW1lIGlmIG5lY2Vzc2FyeS4iIiIKKyAgICBuYW1lID0gb2JqZWN0Ll9fbmFtZV9fCisgICAgaWYgb2JqZWN0Ll9fbW9kdWxlX18gIT0gbW9kbmFtZToKKyAgICAgICAgbmFtZSA9IG9iamVjdC5fX21vZHVsZV9fICsgJy4nICsgbmFtZQorICAgIHJldHVybiBuYW1lCisKK2RlZiBpc2RhdGEob2JqZWN0KToKKyAgICAiIiJDaGVjayBpZiBhbiBvYmplY3QgaXMgb2YgYSB0eXBlIHRoYXQgcHJvYmFibHkgbWVhbnMgaXQncyBkYXRhLiIiIgorICAgIHJldHVybiBub3QgKGluc3BlY3QuaXNtb2R1bGUob2JqZWN0KSBvciBpbnNwZWN0LmlzY2xhc3Mob2JqZWN0KSBvcgorICAgICAgICAgICAgICAgIGluc3BlY3QuaXNyb3V0aW5lKG9iamVjdCkgb3IgaW5zcGVjdC5pc2ZyYW1lKG9iamVjdCkgb3IKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmlzdHJhY2ViYWNrKG9iamVjdCkgb3IgaW5zcGVjdC5pc2NvZGUob2JqZWN0KSkKKworZGVmIHJlcGxhY2UodGV4dCwgKnBhaXJzKToKKyAgICAiIiJEbyBhIHNlcmllcyBvZiBnbG9iYWwgcmVwbGFjZW1lbnRzIG9uIGEgc3RyaW5nLiIiIgorICAgIHdoaWxlIHBhaXJzOgorICAgICAgICB0ZXh0ID0gam9pbihzcGxpdCh0ZXh0LCBwYWlyc1swXSksIHBhaXJzWzFdKQorICAgICAgICBwYWlycyA9IHBhaXJzWzI6XQorICAgIHJldHVybiB0ZXh0CisKK2RlZiBjcmFtKHRleHQsIG1heGxlbik6CisgICAgIiIiT21pdCBwYXJ0IG9mIGEgc3RyaW5nIGlmIG5lZWRlZCB0byBtYWtlIGl0IGZpdCBpbiBhIG1heGltdW0gbGVuZ3RoLiIiIgorICAgIGlmIGxlbih0ZXh0KSA+IG1heGxlbjoKKyAgICAgICAgcHJlID0gbWF4KDAsIChtYXhsZW4tMykvLzIpCisgICAgICAgIHBvc3QgPSBtYXgoMCwgbWF4bGVuLTMtcHJlKQorICAgICAgICByZXR1cm4gdGV4dFs6cHJlXSArICcuLi4nICsgdGV4dFtsZW4odGV4dCktcG9zdDpdCisgICAgcmV0dXJuIHRleHQKKworX3JlX3N0cmlwaWQgPSByZS5jb21waWxlKHInIGF0IDB4WzAtOWEtZl17NiwxNn0oPispJCcsIHJlLklHTk9SRUNBU0UpCitkZWYgc3RyaXBpZCh0ZXh0KToKKyAgICAiIiJSZW1vdmUgdGhlIGhleGFkZWNpbWFsIGlkIGZyb20gYSBQeXRob24gb2JqZWN0IHJlcHJlc2VudGF0aW9uLiIiIgorICAgICMgVGhlIGJlaGF2aW91ciBvZiAlcCBpcyBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQgaW4gdGVybXMgb2YgY2FzZS4KKyAgICByZXR1cm4gX3JlX3N0cmlwaWQuc3ViKHInXDEnLCB0ZXh0KQorCitkZWYgX2lzX3NvbWVfbWV0aG9kKG9iaik6CisgICAgcmV0dXJuIGluc3BlY3QuaXNtZXRob2Qob2JqKSBvciBpbnNwZWN0LmlzbWV0aG9kZGVzY3JpcHRvcihvYmopCisKK2RlZiBhbGxtZXRob2RzKGNsKToKKyAgICBtZXRob2RzID0ge30KKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpbnNwZWN0LmdldG1lbWJlcnMoY2wsIF9pc19zb21lX21ldGhvZCk6CisgICAgICAgIG1ldGhvZHNba2V5XSA9IDEKKyAgICBmb3IgYmFzZSBpbiBjbC5fX2Jhc2VzX186CisgICAgICAgIG1ldGhvZHMudXBkYXRlKGFsbG1ldGhvZHMoYmFzZSkpICMgYWxsIHlvdXIgYmFzZSBhcmUgYmVsb25nIHRvIHVzCisgICAgZm9yIGtleSBpbiBtZXRob2RzLmtleXMoKToKKyAgICAgICAgbWV0aG9kc1trZXldID0gZ2V0YXR0cihjbCwga2V5KQorICAgIHJldHVybiBtZXRob2RzCisKK2RlZiBfc3BsaXRfbGlzdChzLCBwcmVkaWNhdGUpOgorICAgICIiIlNwbGl0IHNlcXVlbmNlIHMgdmlhIHByZWRpY2F0ZSwgYW5kIHJldHVybiBwYWlyIChbdHJ1ZV0sIFtmYWxzZV0pLgorCisgICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIDItdHVwbGUgb2YgbGlzdHMsCisgICAgICAgIChbeCBmb3IgeCBpbiBzIGlmIHByZWRpY2F0ZSh4KV0sCisgICAgICAgICBbeCBmb3IgeCBpbiBzIGlmIG5vdCBwcmVkaWNhdGUoeCldKQorICAgICIiIgorCisgICAgeWVzID0gW10KKyAgICBubyA9IFtdCisgICAgZm9yIHggaW4gczoKKyAgICAgICAgaWYgcHJlZGljYXRlKHgpOgorICAgICAgICAgICAgeWVzLmFwcGVuZCh4KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm8uYXBwZW5kKHgpCisgICAgcmV0dXJuIHllcywgbm8KKworZGVmIHZpc2libGVuYW1lKG5hbWUsIGFsbD1Ob25lLCBvYmo9Tm9uZSk6CisgICAgIiIiRGVjaWRlIHdoZXRoZXIgdG8gc2hvdyBkb2N1bWVudGF0aW9uIG9uIGEgdmFyaWFibGUuIiIiCisgICAgIyBDZXJ0YWluIHNwZWNpYWwgbmFtZXMgYXJlIHJlZHVuZGFudC4KKyAgICBfaGlkZGVuX25hbWVzID0gKCdfX2J1aWx0aW5zX18nLCAnX19kb2NfXycsICdfX2ZpbGVfXycsICdfX3BhdGhfXycsCisgICAgICAgICAgICAgICAgICAgICAnX19tb2R1bGVfXycsICdfX25hbWVfXycsICdfX3Nsb3RzX18nLCAnX19wYWNrYWdlX18nKQorICAgIGlmIG5hbWUgaW4gX2hpZGRlbl9uYW1lczogcmV0dXJuIDAKKyAgICAjIFByaXZhdGUgbmFtZXMgYXJlIGhpZGRlbiwgYnV0IHNwZWNpYWwgbmFtZXMgYXJlIGRpc3BsYXllZC4KKyAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ19fJykgYW5kIG5hbWUuZW5kc3dpdGgoJ19fJyk6IHJldHVybiAxCisgICAgIyBOYW1lZHR1cGxlcyBoYXZlIHB1YmxpYyBmaWVsZHMgYW5kIG1ldGhvZHMgd2l0aCBhIHNpbmdsZSBsZWFkaW5nIHVuZGVyc2NvcmUKKyAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ18nKSBhbmQgaGFzYXR0cihvYmosICdfZmllbGRzJyk6CisgICAgICAgIHJldHVybiAxCisgICAgaWYgYWxsIGlzIG5vdCBOb25lOgorICAgICAgICAjIG9ubHkgZG9jdW1lbnQgdGhhdCB3aGljaCB0aGUgcHJvZ3JhbW1lciBleHBvcnRlZCBpbiBfX2FsbF9fCisgICAgICAgIHJldHVybiBuYW1lIGluIGFsbAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJykKKworZGVmIGNsYXNzaWZ5X2NsYXNzX2F0dHJzKG9iamVjdCk6CisgICAgIiIiV3JhcCBpbnNwZWN0LmNsYXNzaWZ5X2NsYXNzX2F0dHJzLCB3aXRoIGZpeHVwIGZvciBkYXRhIGRlc2NyaXB0b3JzLiIiIgorICAgIGRlZiBmaXh1cChkYXRhKToKKyAgICAgICAgbmFtZSwga2luZCwgY2xzLCB2YWx1ZSA9IGRhdGEKKyAgICAgICAgaWYgaW5zcGVjdC5pc2RhdGFkZXNjcmlwdG9yKHZhbHVlKToKKyAgICAgICAgICAgIGtpbmQgPSAnZGF0YSBkZXNjcmlwdG9yJworICAgICAgICByZXR1cm4gbmFtZSwga2luZCwgY2xzLCB2YWx1ZQorICAgIHJldHVybiBtYXAoZml4dXAsIGluc3BlY3QuY2xhc3NpZnlfY2xhc3NfYXR0cnMob2JqZWN0KSkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtb2R1bGUgbWFuaXB1bGF0aW9uCisKK2RlZiBpc3BhY2thZ2UocGF0aCk6CisgICAgIiIiR3Vlc3Mgd2hldGhlciBhIHBhdGggcmVmZXJzIHRvIGEgcGFja2FnZSBkaXJlY3RvcnkuIiIiCisgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgZm9yIGV4dCBpbiAoJy5weScsICcucHljJywgJy5weW8nKToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAnX19pbml0X18nICsgZXh0KSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworZGVmIHNvdXJjZV9zeW5vcHNpcyhmaWxlKToKKyAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgd2hpbGUgbGluZVs6MV0gPT0gJyMnIG9yIG5vdCBzdHJpcChsaW5lKToKKyAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICBsaW5lID0gc3RyaXAobGluZSkKKyAgICBpZiBsaW5lWzo0XSA9PSAnciIiIic6IGxpbmUgPSBsaW5lWzE6XQorICAgIGlmIGxpbmVbOjNdID09ICciIiInOgorICAgICAgICBsaW5lID0gbGluZVszOl0KKyAgICAgICAgaWYgbGluZVstMTpdID09ICdcXCc6IGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgd2hpbGUgbm90IHN0cmlwKGxpbmUpOgorICAgICAgICAgICAgbGluZSA9IGZpbGUucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCisgICAgICAgIHJlc3VsdCA9IHN0cmlwKHNwbGl0KGxpbmUsICciIiInKVswXSkKKyAgICBlbHNlOiByZXN1bHQgPSBOb25lCisgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgc3lub3BzaXMoZmlsZW5hbWUsIGNhY2hlPXt9KToKKyAgICAiIiJHZXQgdGhlIG9uZS1saW5lIHN1bW1hcnkgb3V0IG9mIGEgbW9kdWxlIGZpbGUuIiIiCisgICAgbXRpbWUgPSBvcy5zdGF0KGZpbGVuYW1lKS5zdF9tdGltZQorICAgIGxhc3R1cGRhdGUsIHJlc3VsdCA9IGNhY2hlLmdldChmaWxlbmFtZSwgKE5vbmUsIE5vbmUpKQorICAgIGlmIGxhc3R1cGRhdGUgaXMgTm9uZSBvciBsYXN0dXBkYXRlIDwgbXRpbWU6CisgICAgICAgIGluZm8gPSBpbnNwZWN0LmdldG1vZHVsZWluZm8oZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSBvcGVuKGZpbGVuYW1lKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICMgbW9kdWxlIGNhbid0IGJlIG9wZW5lZCwgc28gc2tpcCBpdAorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgaW5mbyBhbmQgJ2InIGluIGluZm9bMl06ICMgYmluYXJ5IG1vZHVsZXMgaGF2ZSB0byBiZSBpbXBvcnRlZAorICAgICAgICAgICAgdHJ5OiBtb2R1bGUgPSBpbXAubG9hZF9tb2R1bGUoJ19fdGVtcF9fJywgZmlsZSwgZmlsZW5hbWUsIGluZm9bMTpdKQorICAgICAgICAgICAgZXhjZXB0OiByZXR1cm4gTm9uZQorICAgICAgICAgICAgcmVzdWx0ID0gKG1vZHVsZS5fX2RvY19fIG9yICcnKS5zcGxpdGxpbmVzKClbMF0KKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1snX190ZW1wX18nXQorICAgICAgICBlbHNlOiAjIHRleHQgbW9kdWxlcyBjYW4gYmUgZGlyZWN0bHkgZXhhbWluZWQKKyAgICAgICAgICAgIHJlc3VsdCA9IHNvdXJjZV9zeW5vcHNpcyhmaWxlKQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIGNhY2hlW2ZpbGVuYW1lXSA9IChtdGltZSwgcmVzdWx0KQorICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgRXJyb3JEdXJpbmdJbXBvcnQoRXhjZXB0aW9uKToKKyAgICAiIiJFcnJvcnMgdGhhdCBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gaW1wb3J0IHNvbWV0aGluZyB0byBkb2N1bWVudCBpdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGV4Y19pbmZvKToKKyAgICAgICAgZXhjLCB2YWx1ZSwgdGIgPSBleGNfaW5mbworICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5leGMgPSBleGMKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYudGIgPSB0YgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIGV4YyA9IHNlbGYuZXhjCisgICAgICAgIGlmIHR5cGUoZXhjKSBpcyB0eXBlcy5DbGFzc1R5cGU6CisgICAgICAgICAgICBleGMgPSBleGMuX19uYW1lX18KKyAgICAgICAgcmV0dXJuICdwcm9ibGVtIGluICVzIC0gJXM6ICVzJyAlIChzZWxmLmZpbGVuYW1lLCBleGMsIHNlbGYudmFsdWUpCisKK2RlZiBpbXBvcnRmaWxlKHBhdGgpOgorICAgICIiIkltcG9ydCBhIFB5dGhvbiBzb3VyY2UgZmlsZSBvciBjb21waWxlZCBmaWxlIGdpdmVuIGl0cyBwYXRoLiIiIgorICAgIG1hZ2ljID0gaW1wLmdldF9tYWdpYygpCisgICAgZmlsZSA9IG9wZW4ocGF0aCwgJ3InKQorICAgIGlmIGZpbGUucmVhZChsZW4obWFnaWMpKSA9PSBtYWdpYzoKKyAgICAgICAga2luZCA9IGltcC5QWV9DT01QSUxFRAorICAgIGVsc2U6CisgICAgICAgIGtpbmQgPSBpbXAuUFlfU09VUkNFCisgICAgZmlsZS5jbG9zZSgpCisgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCisgICAgbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICBmaWxlID0gb3BlbihwYXRoLCAncicpCisgICAgdHJ5OgorICAgICAgICBtb2R1bGUgPSBpbXAubG9hZF9tb2R1bGUobmFtZSwgZmlsZSwgcGF0aCwgKGV4dCwgJ3InLCBraW5kKSkKKyAgICBleGNlcHQ6CisgICAgICAgIHJhaXNlIEVycm9yRHVyaW5nSW1wb3J0KHBhdGgsIHN5cy5leGNfaW5mbygpKQorICAgIGZpbGUuY2xvc2UoKQorICAgIHJldHVybiBtb2R1bGUKKworZGVmIHNhZmVpbXBvcnQocGF0aCwgZm9yY2Vsb2FkPTAsIGNhY2hlPXt9KToKKyAgICAiIiJJbXBvcnQgYSBtb2R1bGU7IGhhbmRsZSBlcnJvcnM7IHJldHVybiBOb25lIGlmIHRoZSBtb2R1bGUgaXNuJ3QgZm91bmQuCisKKyAgICBJZiB0aGUgbW9kdWxlICppcyogZm91bmQgYnV0IGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGl0J3Mgd3JhcHBlZCBpbiBhbgorICAgIEVycm9yRHVyaW5nSW1wb3J0IGV4Y2VwdGlvbiBhbmQgcmVyYWlzZWQuICBVbmxpa2UgX19pbXBvcnRfXywgaWYgYQorICAgIHBhY2thZ2UgcGF0aCBpcyBzcGVjaWZpZWQsIHRoZSBtb2R1bGUgYXQgdGhlIGVuZCBvZiB0aGUgcGF0aCBpcyByZXR1cm5lZCwKKyAgICBub3QgdGhlIHBhY2thZ2UgYXQgdGhlIGJlZ2lubmluZy4gIElmIHRoZSBvcHRpb25hbCAnZm9yY2Vsb2FkJyBhcmd1bWVudAorICAgIGlzIDEsIHdlIHJlbG9hZCB0aGUgbW9kdWxlIGZyb20gZGlzayAodW5sZXNzIGl0J3MgYSBkeW5hbWljIGV4dGVuc2lvbikuIiIiCisgICAgdHJ5OgorICAgICAgICAjIElmIGZvcmNlbG9hZCBpcyAxIGFuZCB0aGUgbW9kdWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgbG9hZGVkIGZyb20KKyAgICAgICAgIyBkaXNrLCB3ZSBhbHdheXMgaGF2ZSB0byByZWxvYWQgdGhlIG1vZHVsZS4gIENoZWNraW5nIHRoZSBmaWxlJ3MKKyAgICAgICAgIyBtdGltZSBpc24ndCBnb29kIGVub3VnaCAoZS5nLiB0aGUgbW9kdWxlIGNvdWxkIGNvbnRhaW4gYSBjbGFzcworICAgICAgICAjIHRoYXQgaW5oZXJpdHMgZnJvbSBhbm90aGVyIG1vZHVsZSB0aGF0IGhhcyBjaGFuZ2VkKS4KKyAgICAgICAgaWYgZm9yY2Vsb2FkIGFuZCBwYXRoIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgaWYgcGF0aCBub3QgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgorICAgICAgICAgICAgICAgICMgQXZvaWQgc2ltcGx5IGNhbGxpbmcgcmVsb2FkKCkgYmVjYXVzZSBpdCBsZWF2ZXMgbmFtZXMgaW4KKyAgICAgICAgICAgICAgICAjIHRoZSBjdXJyZW50bHkgbG9hZGVkIG1vZHVsZSBseWluZyBhcm91bmQgaWYgdGhleSdyZSBub3QKKyAgICAgICAgICAgICAgICAjIGRlZmluZWQgaW4gdGhlIG5ldyBzb3VyY2UgZmlsZS4gIEluc3RlYWQsIHJlbW92ZSB0aGUKKyAgICAgICAgICAgICAgICAjIG1vZHVsZSBmcm9tIHN5cy5tb2R1bGVzIGFuZCByZS1pbXBvcnQuICBBbHNvIHJlbW92ZSBhbnkKKyAgICAgICAgICAgICAgICAjIHN1Ym1vZHVsZXMgYmVjYXVzZSB0aGV5IHdvbid0IGFwcGVhciBpbiB0aGUgbmV3bHkgbG9hZGVkCisgICAgICAgICAgICAgICAgIyBtb2R1bGUncyBuYW1lc3BhY2UgaWYgdGhleSdyZSBhbHJlYWR5IGluIHN5cy5tb2R1bGVzLgorICAgICAgICAgICAgICAgIHN1YnMgPSBbbSBmb3IgbSBpbiBzeXMubW9kdWxlcyBpZiBtLnN0YXJ0c3dpdGgocGF0aCArICcuJyldCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBbcGF0aF0gKyBzdWJzOgorICAgICAgICAgICAgICAgICAgICAjIFByZXZlbnQgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICAgICAgICAgICAgICAgICAgICBjYWNoZVtrZXldID0gc3lzLm1vZHVsZXNba2V5XQorICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNba2V5XQorICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKHBhdGgpCisgICAgZXhjZXB0OgorICAgICAgICAjIERpZCB0aGUgZXJyb3Igb2NjdXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBtb2R1bGUgd2FzIGZvdW5kPworICAgICAgICAoZXhjLCB2YWx1ZSwgdGIpID0gaW5mbyA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIGlmIHBhdGggaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAjIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGV4ZWN1dGluZyB0aGUgaW1wb3J0ZWQgbW9kdWxlLgorICAgICAgICAgICAgcmFpc2UgRXJyb3JEdXJpbmdJbXBvcnQoc3lzLm1vZHVsZXNbcGF0aF0uX19maWxlX18sIGluZm8pCisgICAgICAgIGVsaWYgZXhjIGlzIFN5bnRheEVycm9yOgorICAgICAgICAgICAgIyBBIFN5bnRheEVycm9yIG9jY3VycmVkIGJlZm9yZSB3ZSBjb3VsZCBleGVjdXRlIHRoZSBtb2R1bGUuCisgICAgICAgICAgICByYWlzZSBFcnJvckR1cmluZ0ltcG9ydCh2YWx1ZS5maWxlbmFtZSwgaW5mbykKKyAgICAgICAgZWxpZiBleGMgaXMgSW1wb3J0RXJyb3IgYW5kIGV4dHJhY3RfdGIodGIpWy0xXVsyXT09J3NhZmVpbXBvcnQnOgorICAgICAgICAgICAgIyBUaGUgaW1wb3J0IGVycm9yIG9jY3VycmVkIGRpcmVjdGx5IGluIHRoaXMgZnVuY3Rpb24sCisgICAgICAgICAgICAjIHdoaWNoIG1lYW5zIHRoZXJlIGlzIG5vIHN1Y2ggbW9kdWxlIGluIHRoZSBwYXRoLgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgU29tZSBvdGhlciBlcnJvciBvY2N1cnJlZCBkdXJpbmcgdGhlIGltcG9ydGluZyBwcm9jZXNzLgorICAgICAgICAgICAgcmFpc2UgRXJyb3JEdXJpbmdJbXBvcnQocGF0aCwgc3lzLmV4Y19pbmZvKCkpCisgICAgZm9yIHBhcnQgaW4gc3BsaXQocGF0aCwgJy4nKVsxOl06CisgICAgICAgIHRyeTogbW9kdWxlID0gZ2V0YXR0cihtb2R1bGUsIHBhcnQpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjogcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gbW9kdWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmb3JtYXR0ZXIgYmFzZSBjbGFzcworCitjbGFzcyBEb2M6CisgICAgZGVmIGRvY3VtZW50KHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCAqYXJncyk6CisgICAgICAgICIiIkdlbmVyYXRlIGRvY3VtZW50YXRpb24gZm9yIGFuIG9iamVjdC4iIiIKKyAgICAgICAgYXJncyA9IChvYmplY3QsIG5hbWUpICsgYXJncworICAgICAgICAjICd0cnknIGNsYXVzZSBpcyB0byBhdHRlbXB0IHRvIGhhbmRsZSB0aGUgcG9zc2liaWxpdHkgdGhhdCBpbnNwZWN0CisgICAgICAgICMgaWRlbnRpZmllcyBzb21ldGhpbmcgaW4gYSB3YXkgdGhhdCBweWRvYyBpdHNlbGYgaGFzIGlzc3VlcyBoYW5kbGluZzsKKyAgICAgICAgIyB0aGluayAnc3VwZXInIGFuZCBob3cgaXQgaXMgYSBkZXNjcmlwdG9yICh3aGljaCByYWlzZXMgdGhlIGV4Y2VwdGlvbgorICAgICAgICAjIGJ5IGxhY2tpbmcgYSBfX25hbWVfXyBhdHRyaWJ1dGUpIGFuZCBhbiBpbnN0YW5jZS4KKyAgICAgICAgaWYgaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3Iob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jZGF0YSgqYXJncykKKyAgICAgICAgaWYgaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jZGF0YSgqYXJncykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaW5zcGVjdC5pc21vZHVsZShvYmplY3QpOiByZXR1cm4gc2VsZi5kb2Ntb2R1bGUoKmFyZ3MpCisgICAgICAgICAgICBpZiBpbnNwZWN0LmlzY2xhc3Mob2JqZWN0KTogcmV0dXJuIHNlbGYuZG9jY2xhc3MoKmFyZ3MpCisgICAgICAgICAgICBpZiBpbnNwZWN0Lmlzcm91dGluZShvYmplY3QpOiByZXR1cm4gc2VsZi5kb2Nyb3V0aW5lKCphcmdzKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqZWN0LCBwcm9wZXJ0eSk6IHJldHVybiBzZWxmLmRvY3Byb3BlcnR5KCphcmdzKQorICAgICAgICByZXR1cm4gc2VsZi5kb2NvdGhlcigqYXJncykKKworICAgIGRlZiBmYWlsKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCAqYXJncyk6CisgICAgICAgICIiIlJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgdW5pbXBsZW1lbnRlZCB0eXBlcy4iIiIKKyAgICAgICAgbWVzc2FnZSA9ICJkb24ndCBrbm93IGhvdyB0byBkb2N1bWVudCBvYmplY3QlcyBvZiB0eXBlICVzIiAlICgKKyAgICAgICAgICAgIG5hbWUgYW5kICcgJyArIHJlcHIobmFtZSksIHR5cGUob2JqZWN0KS5fX25hbWVfXykKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCBtZXNzYWdlCisKKyAgICBkb2Ntb2R1bGUgPSBkb2NjbGFzcyA9IGRvY3JvdXRpbmUgPSBkb2NvdGhlciA9IGRvY3Byb3BlcnR5ID0gZG9jZGF0YSA9IGZhaWwKKworICAgIGRlZiBnZXRkb2Nsb2Moc2VsZiwgb2JqZWN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiBtb2R1bGUgZG9jcyBvciBOb25lIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IGluc3BlY3QuZ2V0YWJzZmlsZShvYmplY3QpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBmaWxlID0gJyhidWlsdC1pbiknCisKKyAgICAgICAgZG9jbG9jID0gb3MuZW52aXJvbi5nZXQoIlBZVEhPTkRPQ1MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5IikKKyAgICAgICAgYmFzZWRpciA9IG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICJsaWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iK3N5cy52ZXJzaW9uWzA6M10pCisgICAgICAgIGlmIChpc2luc3RhbmNlKG9iamVjdCwgdHlwZShvcykpIGFuZAorICAgICAgICAgICAgKG9iamVjdC5fX25hbWVfXyBpbiAoJ2Vycm5vJywgJ2V4Y2VwdGlvbnMnLCAnZ2MnLCAnaW1wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXJzaGFsJywgJ3Bvc2l4JywgJ3NpZ25hbCcsICdzeXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RocmVhZCcsICd6aXBpbXBvcnQnKSBvcgorICAgICAgICAgICAgIChmaWxlLnN0YXJ0c3dpdGgoYmFzZWRpcikgYW5kCisgICAgICAgICAgICAgIG5vdCBmaWxlLnN0YXJ0c3dpdGgob3MucGF0aC5qb2luKGJhc2VkaXIsICdzaXRlLXBhY2thZ2VzJykpKSkgYW5kCisgICAgICAgICAgICBvYmplY3QuX19uYW1lX18gbm90IGluICgneG1sLmV0cmVlJywgJ3Rlc3QucHlkb2NfbW9kJykpOgorICAgICAgICAgICAgaWYgZG9jbG9jLnN0YXJ0c3dpdGgoImh0dHA6Ly8iKToKKyAgICAgICAgICAgICAgICBkb2Nsb2MgPSAiJXMvJXMiICUgKGRvY2xvYy5yc3RyaXAoIi8iKSwgb2JqZWN0Ll9fbmFtZV9fKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkb2Nsb2MgPSBvcy5wYXRoLmpvaW4oZG9jbG9jLCBvYmplY3QuX19uYW1lX18gKyAiLmh0bWwiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG9jbG9jID0gTm9uZQorICAgICAgICByZXR1cm4gZG9jbG9jCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSFRNTCBkb2N1bWVudGF0aW9uIGdlbmVyYXRvcgorCitjbGFzcyBIVE1MUmVwcihSZXByKToKKyAgICAiIiJDbGFzcyBmb3Igc2FmZWx5IG1ha2luZyBhbiBIVE1MIHJlcHJlc2VudGF0aW9uIG9mIGEgUHl0aG9uIG9iamVjdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFJlcHIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5tYXhsaXN0ID0gc2VsZi5tYXh0dXBsZSA9IDIwCisgICAgICAgIHNlbGYubWF4ZGljdCA9IDEwCisgICAgICAgIHNlbGYubWF4c3RyaW5nID0gc2VsZi5tYXhvdGhlciA9IDEwMAorCisgICAgZGVmIGVzY2FwZShzZWxmLCB0ZXh0KToKKyAgICAgICAgcmV0dXJuIHJlcGxhY2UodGV4dCwgJyYnLCAnJmFtcDsnLCAnPCcsICcmbHQ7JywgJz4nLCAnJmd0OycpCisKKyAgICBkZWYgcmVwcihzZWxmLCBvYmplY3QpOgorICAgICAgICByZXR1cm4gUmVwci5yZXByKHNlbGYsIG9iamVjdCkKKworICAgIGRlZiByZXByMShzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIGlmIGhhc2F0dHIodHlwZSh4KSwgJ19fbmFtZV9fJyk6CisgICAgICAgICAgICBtZXRob2RuYW1lID0gJ3JlcHJfJyArIGpvaW4oc3BsaXQodHlwZSh4KS5fX25hbWVfXyksICdfJykKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgbWV0aG9kbmFtZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgbWV0aG9kbmFtZSkoeCwgbGV2ZWwpCisgICAgICAgIHJldHVybiBzZWxmLmVzY2FwZShjcmFtKHN0cmlwaWQocmVwcih4KSksIHNlbGYubWF4b3RoZXIpKQorCisgICAgZGVmIHJlcHJfc3RyaW5nKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgdGVzdCA9IGNyYW0oeCwgc2VsZi5tYXhzdHJpbmcpCisgICAgICAgIHRlc3RyZXByID0gcmVwcih0ZXN0KQorICAgICAgICBpZiAnXFwnIGluIHRlc3QgYW5kICdcXCcgbm90IGluIHJlcGxhY2UodGVzdHJlcHIsIHInXFwnLCAnJyk6CisgICAgICAgICAgICAjIEJhY2tzbGFzaGVzIGFyZSBvbmx5IGxpdGVyYWwgaW4gdGhlIHN0cmluZyBhbmQgYXJlIG5ldmVyCisgICAgICAgICAgICAjIG5lZWRlZCB0byBtYWtlIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMsIHNvIHNob3cgYSByYXcgc3RyaW5nLgorICAgICAgICAgICAgcmV0dXJuICdyJyArIHRlc3RyZXByWzBdICsgc2VsZi5lc2NhcGUodGVzdCkgKyB0ZXN0cmVwclswXQorICAgICAgICByZXR1cm4gcmUuc3ViKHInKChcXFtcXGFiZm5ydHZcJyJdfFxcWzAtOV0uLnxcXHguLnxcXHUuLi4uKSspJywKKyAgICAgICAgICAgICAgICAgICAgICByJzxmb250IGNvbG9yPSIjYzA0MGMwIj5cMTwvZm9udD4nLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZXNjYXBlKHRlc3RyZXByKSkKKworICAgIHJlcHJfc3RyID0gcmVwcl9zdHJpbmcKKworICAgIGRlZiByZXByX2luc3RhbmNlKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXNjYXBlKGNyYW0oc3RyaXBpZChyZXByKHgpKSwgc2VsZi5tYXhzdHJpbmcpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5lc2NhcGUoJzwlcyBpbnN0YW5jZT4nICUgeC5fX2NsYXNzX18uX19uYW1lX18pCisKKyAgICByZXByX3VuaWNvZGUgPSByZXByX3N0cmluZworCitjbGFzcyBIVE1MRG9jKERvYyk6CisgICAgIiIiRm9ybWF0dGVyIGNsYXNzIGZvciBIVE1MIGRvY3VtZW50YXRpb24uIiIiCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSFRNTCBmb3JtYXR0aW5nIHV0aWxpdGllcworCisgICAgX3JlcHJfaW5zdGFuY2UgPSBIVE1MUmVwcigpCisgICAgcmVwciA9IF9yZXByX2luc3RhbmNlLnJlcHIKKyAgICBlc2NhcGUgPSBfcmVwcl9pbnN0YW5jZS5lc2NhcGUKKworICAgIGRlZiBwYWdlKHNlbGYsIHRpdGxlLCBjb250ZW50cyk6CisgICAgICAgICIiIkZvcm1hdCBhbiBIVE1MIHBhZ2UuIiIiCisgICAgICAgIHJldHVybiAnJycKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD48aGVhZD48dGl0bGU+UHl0aG9uOiAlczwvdGl0bGU+Cis8L2hlYWQ+PGJvZHkgYmdjb2xvcj0iI2YwZjBmOCI+CislcworPC9ib2R5PjwvaHRtbD4nJycgJSAodGl0bGUsIGNvbnRlbnRzKQorCisgICAgZGVmIGhlYWRpbmcoc2VsZiwgdGl0bGUsIGZnY29sLCBiZ2NvbCwgZXh0cmFzPScnKToKKyAgICAgICAgIiIiRm9ybWF0IGEgcGFnZSBoZWFkaW5nLiIiIgorICAgICAgICByZXR1cm4gJycnCis8dGFibGUgd2lkdGg9IjEwMCUlIiBjZWxsc3BhY2luZz0wIGNlbGxwYWRkaW5nPTIgYm9yZGVyPTAgc3VtbWFyeT0iaGVhZGluZyI+Cis8dHIgYmdjb2xvcj0iJXMiPgorPHRkIHZhbGlnbj1ib3R0b20+Jm5ic3A7PGJyPgorPGZvbnQgY29sb3I9IiVzIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj4mbmJzcDs8YnI+JXM8L2ZvbnQ+PC90ZAorPjx0ZCBhbGlnbj1yaWdodCB2YWxpZ249Ym90dG9tCis+PGZvbnQgY29sb3I9IiVzIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj4lczwvZm9udD48L3RkPjwvdHI+PC90YWJsZT4KKyAgICAnJycgJSAoYmdjb2wsIGZnY29sLCB0aXRsZSwgZmdjb2wsIGV4dHJhcyBvciAnJm5ic3A7JykKKworICAgIGRlZiBzZWN0aW9uKHNlbGYsIHRpdGxlLCBmZ2NvbCwgYmdjb2wsIGNvbnRlbnRzLCB3aWR0aD02LAorICAgICAgICAgICAgICAgIHByZWx1ZGU9JycsIG1hcmdpbmFsaWE9Tm9uZSwgZ2FwPScmbmJzcDsnKToKKyAgICAgICAgIiIiRm9ybWF0IGEgc2VjdGlvbiB3aXRoIGEgaGVhZGluZy4iIiIKKyAgICAgICAgaWYgbWFyZ2luYWxpYSBpcyBOb25lOgorICAgICAgICAgICAgbWFyZ2luYWxpYSA9ICc8dHQ+JyArICcmbmJzcDsnICogd2lkdGggKyAnPC90dD4nCisgICAgICAgIHJlc3VsdCA9ICcnJzxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiVzIj4KKzx0ZCBjb2xzcGFuPTMgdmFsaWduPWJvdHRvbT4mbmJzcDs8YnI+Cis8Zm9udCBjb2xvcj0iJXMiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPiVzPC9mb250PjwvdGQ+PC90cj4KKyAgICAnJycgJSAoYmdjb2wsIGZnY29sLCB0aXRsZSkKKyAgICAgICAgaWYgcHJlbHVkZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICcnJworPHRyIGJnY29sb3I9IiVzIj48dGQgcm93c3Bhbj0yPiVzPC90ZD4KKzx0ZCBjb2xzcGFuPTI+JXM8L3RkPjwvdHI+Cis8dHI+PHRkPiVzPC90ZD4nJycgJSAoYmdjb2wsIG1hcmdpbmFsaWEsIHByZWx1ZGUsIGdhcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICcnJworPHRyPjx0ZCBiZ2NvbG9yPSIlcyI+JXM8L3RkPjx0ZD4lczwvdGQ+JycnICUgKGJnY29sLCBtYXJnaW5hbGlhLCBnYXApCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdCArICdcbjx0ZCB3aWR0aD0iMTAwJSUiPiVzPC90ZD48L3RyPjwvdGFibGU+JyAlIGNvbnRlbnRzCisKKyAgICBkZWYgYmlnc2VjdGlvbihzZWxmLCB0aXRsZSwgKmFyZ3MpOgorICAgICAgICAiIiJGb3JtYXQgYSBzZWN0aW9uIHdpdGggYSBiaWcgaGVhZGluZy4iIiIKKyAgICAgICAgdGl0bGUgPSAnPGJpZz48c3Ryb25nPiVzPC9zdHJvbmc+PC9iaWc+JyAlIHRpdGxlCisgICAgICAgIHJldHVybiBzZWxmLnNlY3Rpb24odGl0bGUsICphcmdzKQorCisgICAgZGVmIHByZWZvcm1hdChzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiRm9ybWF0IGxpdGVyYWwgcHJlZm9ybWF0dGVkIHRleHQuIiIiCisgICAgICAgIHRleHQgPSBzZWxmLmVzY2FwZShleHBhbmR0YWJzKHRleHQpKQorICAgICAgICByZXR1cm4gcmVwbGFjZSh0ZXh0LCAnXG5cbicsICdcbiBcbicsICdcblxuJywgJ1xuIFxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAnLCAnJm5ic3A7JywgJ1xuJywgJzxicj5cbicpCisKKyAgICBkZWYgbXVsdGljb2x1bW4oc2VsZiwgbGlzdCwgZm9ybWF0LCBjb2xzPTQpOgorICAgICAgICAiIiJGb3JtYXQgYSBsaXN0IG9mIGl0ZW1zIGludG8gYSBtdWx0aS1jb2x1bW4gbGlzdC4iIiIKKyAgICAgICAgcmVzdWx0ID0gJycKKyAgICAgICAgcm93cyA9IChsZW4obGlzdCkrY29scy0xKS8vY29scworICAgICAgICBmb3IgY29sIGluIHJhbmdlKGNvbHMpOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJzx0ZCB3aWR0aD0iJWQlJSIgdmFsaWduPXRvcD4nICUgKDEwMC8vY29scykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHJvd3MqY29sLCByb3dzKmNvbCtyb3dzKToKKyAgICAgICAgICAgICAgICBpZiBpIDwgbGVuKGxpc3QpOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBmb3JtYXQobGlzdFtpXSkgKyAnPGJyPlxuJworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJzwvdGQ+JworICAgICAgICByZXR1cm4gJzx0YWJsZSB3aWR0aD0iMTAwJSUiIHN1bW1hcnk9Imxpc3QiPjx0cj4lczwvdHI+PC90YWJsZT4nICUgcmVzdWx0CisKKyAgICBkZWYgZ3JleShzZWxmLCB0ZXh0KTogcmV0dXJuICc8Zm9udCBjb2xvcj0iIzkwOTA5MCI+JXM8L2ZvbnQ+JyAlIHRleHQKKworICAgIGRlZiBuYW1lbGluayhzZWxmLCBuYW1lLCAqZGljdHMpOgorICAgICAgICAiIiJNYWtlIGEgbGluayBmb3IgYW4gaWRlbnRpZmllciwgZ2l2ZW4gbmFtZS10by1VUkwgbWFwcGluZ3MuIiIiCisgICAgICAgIGZvciBkaWN0IGluIGRpY3RzOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBkaWN0OgorICAgICAgICAgICAgICAgIHJldHVybiAnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAoZGljdFtuYW1lXSwgbmFtZSkKKyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiBjbGFzc2xpbmsoc2VsZiwgb2JqZWN0LCBtb2RuYW1lKToKKyAgICAgICAgIiIiTWFrZSBhIGxpbmsgZm9yIGEgY2xhc3MuIiIiCisgICAgICAgIG5hbWUsIG1vZHVsZSA9IG9iamVjdC5fX25hbWVfXywgc3lzLm1vZHVsZXMuZ2V0KG9iamVjdC5fX21vZHVsZV9fKQorICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgbmFtZSkgYW5kIGdldGF0dHIobW9kdWxlLCBuYW1lKSBpcyBvYmplY3Q6CisgICAgICAgICAgICByZXR1cm4gJzxhIGhyZWY9IiVzLmh0bWwjJXMiPiVzPC9hPicgJSAoCisgICAgICAgICAgICAgICAgbW9kdWxlLl9fbmFtZV9fLCBuYW1lLCBjbGFzc25hbWUob2JqZWN0LCBtb2RuYW1lKSkKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZShvYmplY3QsIG1vZG5hbWUpCisKKyAgICBkZWYgbW9kdWxlbGluayhzZWxmLCBvYmplY3QpOgorICAgICAgICAiIiJNYWtlIGEgbGluayBmb3IgYSBtb2R1bGUuIiIiCisgICAgICAgIHJldHVybiAnPGEgaHJlZj0iJXMuaHRtbCI+JXM8L2E+JyAlIChvYmplY3QuX19uYW1lX18sIG9iamVjdC5fX25hbWVfXykKKworICAgIGRlZiBtb2Rwa2dsaW5rKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJNYWtlIGEgbGluayBmb3IgYSBtb2R1bGUgb3IgcGFja2FnZSB0byBkaXNwbGF5IGluIGFuIGluZGV4LiIiIgorICAgICAgICBuYW1lLCBwYXRoLCBpc3BhY2thZ2UsIHNoYWRvd2VkID0gZGF0YQorICAgICAgICBpZiBzaGFkb3dlZDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmdyZXkobmFtZSkKKyAgICAgICAgaWYgcGF0aDoKKyAgICAgICAgICAgIHVybCA9ICclcy4lcy5odG1sJyAlIChwYXRoLCBuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXJsID0gJyVzLmh0bWwnICUgbmFtZQorICAgICAgICBpZiBpc3BhY2thZ2U6CisgICAgICAgICAgICB0ZXh0ID0gJzxzdHJvbmc+JXM8L3N0cm9uZz4mbmJzcDsocGFja2FnZSknICUgbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dCA9IG5hbWUKKyAgICAgICAgcmV0dXJuICc8YSBocmVmPSIlcyI+JXM8L2E+JyAlICh1cmwsIHRleHQpCisKKyAgICBkZWYgbWFya3VwKHNlbGYsIHRleHQsIGVzY2FwZT1Ob25lLCBmdW5jcz17fSwgY2xhc3Nlcz17fSwgbWV0aG9kcz17fSk6CisgICAgICAgICIiIk1hcmsgdXAgc29tZSBwbGFpbiB0ZXh0LCBnaXZlbiBhIGNvbnRleHQgb2Ygc3ltYm9scyB0byBsb29rIGZvci4KKyAgICAgICAgRWFjaCBjb250ZXh0IGRpY3Rpb25hcnkgbWFwcyBvYmplY3QgbmFtZXMgdG8gYW5jaG9yIG5hbWVzLiIiIgorICAgICAgICBlc2NhcGUgPSBlc2NhcGUgb3Igc2VsZi5lc2NhcGUKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIGhlcmUgPSAwCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKHInXGIoKGh0dHB8ZnRwKTovL1xTK1tcdy9dfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidSRkNbLSBdPyhcZCspfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidQRVBbLSBdPyhcZCspfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicoc2VsZlwuKT8oXHcrKSknKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbWF0Y2ggPSBwYXR0ZXJuLnNlYXJjaCh0ZXh0LCBoZXJlKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOiBicmVhaworICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoZXNjYXBlKHRleHRbaGVyZTpzdGFydF0pKQorCisgICAgICAgICAgICBhbGwsIHNjaGVtZSwgcmZjLCBwZXAsIHNlbGZkb3QsIG5hbWUgPSBtYXRjaC5ncm91cHMoKQorICAgICAgICAgICAgaWYgc2NoZW1lOgorICAgICAgICAgICAgICAgIHVybCA9IGVzY2FwZShhbGwpLnJlcGxhY2UoJyInLCAnJnF1b3Q7JykKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFwcGVuZCgnPGEgaHJlZj0iJXMiPiVzPC9hPicgJSAodXJsLCB1cmwpKQorICAgICAgICAgICAgZWxpZiByZmM6CisgICAgICAgICAgICAgICAgdXJsID0gJ2h0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYyVkLnR4dCcgJSBpbnQocmZjKQorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCc8YSBocmVmPSIlcyI+JXM8L2E+JyAlICh1cmwsIGVzY2FwZShhbGwpKSkKKyAgICAgICAgICAgIGVsaWYgcGVwOgorICAgICAgICAgICAgICAgIHVybCA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLSUwNGQvJyAlIGludChwZXApCisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJzxhIGhyZWY9IiVzIj4lczwvYT4nICUgKHVybCwgZXNjYXBlKGFsbCkpKQorICAgICAgICAgICAgZWxpZiB0ZXh0W2VuZDplbmQrMV0gPT0gJygnOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHNlbGYubmFtZWxpbmsobmFtZSwgbWV0aG9kcywgZnVuY3MsIGNsYXNzZXMpKQorICAgICAgICAgICAgZWxpZiBzZWxmZG90OgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdzZWxmLjxzdHJvbmc+JXM8L3N0cm9uZz4nICUgbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VsZi5uYW1lbGluayhuYW1lLCBjbGFzc2VzKSkKKyAgICAgICAgICAgIGhlcmUgPSBlbmQKKyAgICAgICAgcmVzdWx0cy5hcHBlbmQoZXNjYXBlKHRleHRbaGVyZTpdKSkKKyAgICAgICAgcmV0dXJuIGpvaW4ocmVzdWx0cywgJycpCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZS1zcGVjaWZpYyByb3V0aW5lcworCisgICAgZGVmIGZvcm1hdHRyZWUoc2VsZiwgdHJlZSwgbW9kbmFtZSwgcGFyZW50PU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZm9yIGEgY2xhc3MgdHJlZSBhcyBnaXZlbiBieSBpbnNwZWN0LmdldGNsYXNzdHJlZSgpLiIiIgorICAgICAgICByZXN1bHQgPSAnJworICAgICAgICBmb3IgZW50cnkgaW4gdHJlZToKKyAgICAgICAgICAgIGlmIHR5cGUoZW50cnkpIGlzIHR5cGUoKCkpOgorICAgICAgICAgICAgICAgIGMsIGJhc2VzID0gZW50cnkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnPGR0Pjxmb250IGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPicKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmNsYXNzbGluayhjLCBtb2RuYW1lKQorICAgICAgICAgICAgICAgIGlmIGJhc2VzIGFuZCBiYXNlcyAhPSAocGFyZW50LCk6CisgICAgICAgICAgICAgICAgICAgIHBhcmVudHMgPSBbXQorICAgICAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiBiYXNlczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudHMuYXBwZW5kKHNlbGYuY2xhc3NsaW5rKGJhc2UsIG1vZG5hbWUpKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnKCcgKyBqb2luKHBhcmVudHMsICcsICcpICsgJyknCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJ1xuPC9mb250PjwvZHQ+JworICAgICAgICAgICAgZWxpZiB0eXBlKGVudHJ5KSBpcyB0eXBlKFtdKToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAnPGRkPlxuJXM8L2RkPlxuJyAlIHNlbGYuZm9ybWF0dHJlZSgKKyAgICAgICAgICAgICAgICAgICAgZW50cnksIG1vZG5hbWUsIGMpCisgICAgICAgIHJldHVybiAnPGRsPlxuJXM8L2RsPlxuJyAlIHJlc3VsdAorCisgICAgZGVmIGRvY21vZHVsZShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsICppZ25vcmVkKToKKyAgICAgICAgIiIiUHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGEgbW9kdWxlIG9iamVjdC4iIiIKKyAgICAgICAgbmFtZSA9IG9iamVjdC5fX25hbWVfXyAjIGlnbm9yZSB0aGUgcGFzc2VkLWluIG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWxsID0gb2JqZWN0Ll9fYWxsX18KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgYWxsID0gTm9uZQorICAgICAgICBwYXJ0cyA9IHNwbGl0KG5hbWUsICcuJykKKyAgICAgICAgbGlua3MgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4ocGFydHMpLTEpOgorICAgICAgICAgICAgbGlua3MuYXBwZW5kKAorICAgICAgICAgICAgICAgICc8YSBocmVmPSIlcy5odG1sIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+JXM8L2ZvbnQ+PC9hPicgJQorICAgICAgICAgICAgICAgIChqb2luKHBhcnRzWzppKzFdLCAnLicpLCBwYXJ0c1tpXSkpCisgICAgICAgIGxpbmtlZG5hbWUgPSBqb2luKGxpbmtzICsgcGFydHNbLTE6XSwgJy4nKQorICAgICAgICBoZWFkID0gJzxiaWc+PGJpZz48c3Ryb25nPiVzPC9zdHJvbmc+PC9iaWc+PC9iaWc+JyAlIGxpbmtlZG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGF0aCA9IGluc3BlY3QuZ2V0YWJzZmlsZShvYmplY3QpCisgICAgICAgICAgICB1cmwgPSBwYXRoCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICBpbXBvcnQgbnR1cmwycGF0aAorICAgICAgICAgICAgICAgIHVybCA9IG50dXJsMnBhdGgucGF0aG5hbWUydXJsKHBhdGgpCisgICAgICAgICAgICBmaWxlbGluayA9ICc8YSBocmVmPSJmaWxlOiVzIj4lczwvYT4nICUgKHVybCwgcGF0aCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIGZpbGVsaW5rID0gJyhidWlsdC1pbiknCisgICAgICAgIGluZm8gPSBbXQorICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fdmVyc2lvbl9fJyk6CisgICAgICAgICAgICB2ZXJzaW9uID0gc3RyKG9iamVjdC5fX3ZlcnNpb25fXykKKyAgICAgICAgICAgIGlmIHZlcnNpb25bOjExXSA9PSAnJCcgKyAnUmV2aXNpb246ICcgYW5kIHZlcnNpb25bLTE6XSA9PSAnJCc6CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IHN0cmlwKHZlcnNpb25bMTE6LTFdKQorICAgICAgICAgICAgaW5mby5hcHBlbmQoJ3ZlcnNpb24gJXMnICUgc2VsZi5lc2NhcGUodmVyc2lvbikpCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19kYXRlX18nKToKKyAgICAgICAgICAgIGluZm8uYXBwZW5kKHNlbGYuZXNjYXBlKHN0cihvYmplY3QuX19kYXRlX18pKSkKKyAgICAgICAgaWYgaW5mbzoKKyAgICAgICAgICAgIGhlYWQgPSBoZWFkICsgJyAoJXMpJyAlIGpvaW4oaW5mbywgJywgJykKKyAgICAgICAgZG9jbG9jID0gc2VsZi5nZXRkb2Nsb2Mob2JqZWN0KQorICAgICAgICBpZiBkb2Nsb2MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkb2Nsb2MgPSAnPGJyPjxhIGhyZWY9IiUoZG9jbG9jKXMiPk1vZHVsZSBEb2NzPC9hPicgJSBsb2NhbHMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG9jbG9jID0gJycKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5oZWFkaW5nKAorICAgICAgICAgICAgaGVhZCwgJyNmZmZmZmYnLCAnIzc3OTllZScsCisgICAgICAgICAgICAnPGEgaHJlZj0iLiI+aW5kZXg8L2E+PGJyPicgKyBmaWxlbGluayArIGRvY2xvYykKKworICAgICAgICBtb2R1bGVzID0gaW5zcGVjdC5nZXRtZW1iZXJzKG9iamVjdCwgaW5zcGVjdC5pc21vZHVsZSkKKworICAgICAgICBjbGFzc2VzLCBjZGljdCA9IFtdLCB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpbnNwZWN0LmdldG1lbWJlcnMob2JqZWN0LCBpbnNwZWN0LmlzY2xhc3MpOgorICAgICAgICAgICAgIyBpZiBfX2FsbF9fIGV4aXN0cywgYmVsaWV2ZSBpdC4gIE90aGVyd2lzZSB1c2Ugb2xkIGhldXJpc3RpYy4KKyAgICAgICAgICAgIGlmIChhbGwgaXMgbm90IE5vbmUgb3IKKyAgICAgICAgICAgICAgICAoaW5zcGVjdC5nZXRtb2R1bGUodmFsdWUpIG9yIG9iamVjdCkgaXMgb2JqZWN0KToKKyAgICAgICAgICAgICAgICBpZiB2aXNpYmxlbmFtZShrZXksIGFsbCwgb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hcHBlbmQoKGtleSwgdmFsdWUpKQorICAgICAgICAgICAgICAgICAgICBjZGljdFtrZXldID0gY2RpY3RbdmFsdWVdID0gJyMnICsga2V5CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGNsYXNzZXM6CisgICAgICAgICAgICBmb3IgYmFzZSBpbiB2YWx1ZS5fX2Jhc2VzX186CisgICAgICAgICAgICAgICAga2V5LCBtb2RuYW1lID0gYmFzZS5fX25hbWVfXywgYmFzZS5fX21vZHVsZV9fCisgICAgICAgICAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KG1vZG5hbWUpCisgICAgICAgICAgICAgICAgaWYgbW9kbmFtZSAhPSBuYW1lIGFuZCBtb2R1bGUgYW5kIGhhc2F0dHIobW9kdWxlLCBrZXkpOgorICAgICAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKG1vZHVsZSwga2V5KSBpcyBiYXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGtleSBpbiBjZGljdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZGljdFtrZXldID0gY2RpY3RbYmFzZV0gPSBtb2RuYW1lICsgJy5odG1sIycgKyBrZXkKKyAgICAgICAgZnVuY3MsIGZkaWN0ID0gW10sIHt9CisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGluc3BlY3QuZ2V0bWVtYmVycyhvYmplY3QsIGluc3BlY3QuaXNyb3V0aW5lKToKKyAgICAgICAgICAgICMgaWYgX19hbGxfXyBleGlzdHMsIGJlbGlldmUgaXQuICBPdGhlcndpc2UgdXNlIG9sZCBoZXVyaXN0aWMuCisgICAgICAgICAgICBpZiAoYWxsIGlzIG5vdCBOb25lIG9yCisgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2J1aWx0aW4odmFsdWUpIG9yIGluc3BlY3QuZ2V0bW9kdWxlKHZhbHVlKSBpcyBvYmplY3QpOgorICAgICAgICAgICAgICAgIGlmIHZpc2libGVuYW1lKGtleSwgYWxsLCBvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBmdW5jcy5hcHBlbmQoKGtleSwgdmFsdWUpKQorICAgICAgICAgICAgICAgICAgICBmZGljdFtrZXldID0gJyMtJyArIGtleQorICAgICAgICAgICAgICAgICAgICBpZiBpbnNwZWN0LmlzZnVuY3Rpb24odmFsdWUpOiBmZGljdFt2YWx1ZV0gPSBmZGljdFtrZXldCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpbnNwZWN0LmdldG1lbWJlcnMob2JqZWN0LCBpc2RhdGEpOgorICAgICAgICAgICAgaWYgdmlzaWJsZW5hbWUoa2V5LCBhbGwsIG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoKGtleSwgdmFsdWUpKQorCisgICAgICAgIGRvYyA9IHNlbGYubWFya3VwKGdldGRvYyhvYmplY3QpLCBzZWxmLnByZWZvcm1hdCwgZmRpY3QsIGNkaWN0KQorICAgICAgICBkb2MgPSBkb2MgYW5kICc8dHQ+JXM8L3R0PicgJSBkb2MKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJzxwPiVzPC9wPlxuJyAlIGRvYworCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19wYXRoX18nKToKKyAgICAgICAgICAgIG1vZHBrZ3MgPSBbXQorICAgICAgICAgICAgZm9yIGltcG9ydGVyLCBtb2RuYW1lLCBpc3BrZyBpbiBwa2d1dGlsLml0ZXJfbW9kdWxlcyhvYmplY3QuX19wYXRoX18pOgorICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKChtb2RuYW1lLCBuYW1lLCBpc3BrZywgMCkpCisgICAgICAgICAgICBtb2Rwa2dzLnNvcnQoKQorICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLm11bHRpY29sdW1uKG1vZHBrZ3MsIHNlbGYubW9kcGtnbGluaykKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnUGFja2FnZSBDb250ZW50cycsICcjZmZmZmZmJywgJyNhYTU1Y2MnLCBjb250ZW50cykKKyAgICAgICAgZWxpZiBtb2R1bGVzOgorICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLm11bHRpY29sdW1uKAorICAgICAgICAgICAgICAgIG1vZHVsZXMsIGxhbWJkYSBrZXlfdmFsdWUsIHM9c2VsZjogcy5tb2R1bGVsaW5rKGtleV92YWx1ZVsxXSkpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmJpZ3NlY3Rpb24oCisgICAgICAgICAgICAgICAgJ01vZHVsZXMnLCAnI2ZmZmZmZicsICcjYWE1NWNjJywgY29udGVudHMpCisKKyAgICAgICAgaWYgY2xhc3NlczoKKyAgICAgICAgICAgIGNsYXNzbGlzdCA9IG1hcChsYW1iZGEga2V5X3ZhbHVlOiBrZXlfdmFsdWVbMV0sIGNsYXNzZXMpCisgICAgICAgICAgICBjb250ZW50cyA9IFsKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdHRyZWUoaW5zcGVjdC5nZXRjbGFzc3RyZWUoY2xhc3NsaXN0LCAxKSwgbmFtZSldCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBjbGFzc2VzOgorICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChzZWxmLmRvY3VtZW50KHZhbHVlLCBrZXksIG5hbWUsIGZkaWN0LCBjZGljdCkpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmJpZ3NlY3Rpb24oCisgICAgICAgICAgICAgICAgJ0NsYXNzZXMnLCAnI2ZmZmZmZicsICcjZWU3N2FhJywgam9pbihjb250ZW50cykpCisgICAgICAgIGlmIGZ1bmNzOgorICAgICAgICAgICAgY29udGVudHMgPSBbXQorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZnVuY3M6CisgICAgICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKHNlbGYuZG9jdW1lbnQodmFsdWUsIGtleSwgbmFtZSwgZmRpY3QsIGNkaWN0KSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnRnVuY3Rpb25zJywgJyNmZmZmZmYnLCAnI2VlYWE3NycsIGpvaW4oY29udGVudHMpKQorICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgY29udGVudHMgPSBbXQorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YToKKyAgICAgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoc2VsZi5kb2N1bWVudCh2YWx1ZSwga2V5KSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnRGF0YScsICcjZmZmZmZmJywgJyM1NWFhNTUnLCBqb2luKGNvbnRlbnRzLCAnPGJyPlxuJykpCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19hdXRob3JfXycpOgorICAgICAgICAgICAgY29udGVudHMgPSBzZWxmLm1hcmt1cChzdHIob2JqZWN0Ll9fYXV0aG9yX18pLCBzZWxmLnByZWZvcm1hdCkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnQXV0aG9yJywgJyNmZmZmZmYnLCAnIzc3OTllZScsIGNvbnRlbnRzKQorICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fY3JlZGl0c19fJyk6CisgICAgICAgICAgICBjb250ZW50cyA9IHNlbGYubWFya3VwKHN0cihvYmplY3QuX19jcmVkaXRzX18pLCBzZWxmLnByZWZvcm1hdCkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuYmlnc2VjdGlvbigKKyAgICAgICAgICAgICAgICAnQ3JlZGl0cycsICcjZmZmZmZmJywgJyM3Nzk5ZWUnLCBjb250ZW50cykKKworICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZG9jY2xhc3Moc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBmdW5jcz17fSwgY2xhc3Nlcz17fSwKKyAgICAgICAgICAgICAgICAgKmlnbm9yZWQpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBjbGFzcyBvYmplY3QuIiIiCisgICAgICAgIHJlYWxuYW1lID0gb2JqZWN0Ll9fbmFtZV9fCisgICAgICAgIG5hbWUgPSBuYW1lIG9yIHJlYWxuYW1lCisgICAgICAgIGJhc2VzID0gb2JqZWN0Ll9fYmFzZXNfXworCisgICAgICAgIGNvbnRlbnRzID0gW10KKyAgICAgICAgcHVzaCA9IGNvbnRlbnRzLmFwcGVuZAorCisgICAgICAgICMgQ3V0ZSBsaXR0bGUgY2xhc3MgdG8gcHVtcCBvdXQgYSBob3Jpem9udGFsIHJ1bGUgYmV0d2VlbiBzZWN0aW9ucy4KKyAgICAgICAgY2xhc3MgSG9yaXpvbnRhbFJ1bGU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5uZWVkb25lID0gMAorICAgICAgICAgICAgZGVmIG1heWJlKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubmVlZG9uZToKKyAgICAgICAgICAgICAgICAgICAgcHVzaCgnPGhyPlxuJykKKyAgICAgICAgICAgICAgICBzZWxmLm5lZWRvbmUgPSAxCisgICAgICAgIGhyID0gSG9yaXpvbnRhbFJ1bGUoKQorCisgICAgICAgICMgTGlzdCB0aGUgbXJvLCBpZiBub24tdHJpdmlhbC4KKyAgICAgICAgbXJvID0gZGVxdWUoaW5zcGVjdC5nZXRtcm8ob2JqZWN0KSkKKyAgICAgICAgaWYgbGVuKG1ybykgPiAyOgorICAgICAgICAgICAgaHIubWF5YmUoKQorICAgICAgICAgICAgcHVzaCgnPGRsPjxkdD5NZXRob2QgcmVzb2x1dGlvbiBvcmRlcjo8L2R0PlxuJykKKyAgICAgICAgICAgIGZvciBiYXNlIGluIG1ybzoKKyAgICAgICAgICAgICAgICBwdXNoKCc8ZGQ+JXM8L2RkPlxuJyAlIHNlbGYuY2xhc3NsaW5rKGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19tb2R1bGVfXykpCisgICAgICAgICAgICBwdXNoKCc8L2RsPlxuJykKKworICAgICAgICBkZWYgc3BpbGwobXNnLCBhdHRycywgcHJlZGljYXRlKToKKyAgICAgICAgICAgIG9rLCBhdHRycyA9IF9zcGxpdF9saXN0KGF0dHJzLCBwcmVkaWNhdGUpCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBoci5tYXliZSgpCisgICAgICAgICAgICAgICAgcHVzaChtc2cpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUsIGtpbmQsIGhvbWVjbHMsIHZhbHVlIGluIG9rOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIob2JqZWN0LCBuYW1lKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBTb21lIGRlc2NyaXB0b3JzIG1heSBtZWV0IGEgZmFpbHVyZSBpbiB0aGVpciBfX2dldF9fLgorICAgICAgICAgICAgICAgICAgICAgICAgIyAoYnVnICMxNzg1KQorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIHZhbHVlLCBtb2QpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChzZWxmLmRvY3VtZW50KHZhbHVlLCBuYW1lLCBtb2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MsIGNsYXNzZXMsIG1kaWN0LCBvYmplY3QpKQorICAgICAgICAgICAgICAgICAgICBwdXNoKCdcbicpCisgICAgICAgICAgICByZXR1cm4gYXR0cnMKKworICAgICAgICBkZWYgc3BpbGxkZXNjcmlwdG9ycyhtc2csIGF0dHJzLCBwcmVkaWNhdGUpOgorICAgICAgICAgICAgb2ssIGF0dHJzID0gX3NwbGl0X2xpc3QoYXR0cnMsIHByZWRpY2F0ZSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGhyLm1heWJlKCkKKyAgICAgICAgICAgICAgICBwdXNoKG1zZykKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSwga2luZCwgaG9tZWNscywgdmFsdWUgaW4gb2s6CisgICAgICAgICAgICAgICAgICAgIHB1c2goc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCB2YWx1ZSwgbW9kKSkKKyAgICAgICAgICAgIHJldHVybiBhdHRycworCisgICAgICAgIGRlZiBzcGlsbGRhdGEobXNnLCBhdHRycywgcHJlZGljYXRlKToKKyAgICAgICAgICAgIG9rLCBhdHRycyA9IF9zcGxpdF9saXN0KGF0dHJzLCBwcmVkaWNhdGUpCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBoci5tYXliZSgpCisgICAgICAgICAgICAgICAgcHVzaChtc2cpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUsIGtpbmQsIGhvbWVjbHMsIHZhbHVlIGluIG9rOgorICAgICAgICAgICAgICAgICAgICBiYXNlID0gc2VsZi5kb2NvdGhlcihnZXRhdHRyKG9iamVjdCwgbmFtZSksIG5hbWUsIG1vZCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2F0dHIodmFsdWUsICdfX2NhbGxfXycpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2RhdGFkZXNjcmlwdG9yKHZhbHVlKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSBnZXRhdHRyKHZhbHVlLCAiX19kb2NfXyIsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIGlmIGRvYyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgnPGRsPjxkdD4lczwvZGw+XG4nICUgYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvYyA9IHNlbGYubWFya3VwKGdldGRvYyh2YWx1ZSksIHNlbGYucHJlZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3MsIGNsYXNzZXMsIG1kaWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgZG9jID0gJzxkZD48dHQ+JXM8L3R0PicgJSBkb2MKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goJzxkbD48ZHQ+JXMlczwvZGw+XG4nICUgKGJhc2UsIGRvYykpCisgICAgICAgICAgICAgICAgICAgIHB1c2goJ1xuJykKKyAgICAgICAgICAgIHJldHVybiBhdHRycworCisgICAgICAgIGF0dHJzID0gZmlsdGVyKGxhbWJkYSBkYXRhOiB2aXNpYmxlbmFtZShkYXRhWzBdLCBvYmo9b2JqZWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZnlfY2xhc3NfYXR0cnMob2JqZWN0KSkKKyAgICAgICAgbWRpY3QgPSB7fQorICAgICAgICBmb3Iga2V5LCBraW5kLCBob21lY2xzLCB2YWx1ZSBpbiBhdHRyczoKKyAgICAgICAgICAgIG1kaWN0W2tleV0gPSBhbmNob3IgPSAnIycgKyBuYW1lICsgJy0nICsga2V5CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG9iamVjdCwgbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgIyBTb21lIGRlc2NyaXB0b3JzIG1heSBtZWV0IGEgZmFpbHVyZSBpbiB0aGVpciBfX2dldF9fLgorICAgICAgICAgICAgICAgICMgKGJ1ZyAjMTc4NSkKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBUaGUgdmFsdWUgbWF5IG5vdCBiZSBoYXNoYWJsZSAoZS5nLiwgYSBkYXRhIGF0dHIgd2l0aAorICAgICAgICAgICAgICAgICMgYSBkaWN0IG9yIGxpc3QgdmFsdWUpLgorICAgICAgICAgICAgICAgIG1kaWN0W3ZhbHVlXSA9IGFuY2hvcgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgd2hpbGUgYXR0cnM6CisgICAgICAgICAgICBpZiBtcm86CisgICAgICAgICAgICAgICAgdGhpc2NsYXNzID0gbXJvLnBvcGxlZnQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0aGlzY2xhc3MgPSBhdHRyc1swXVsyXQorICAgICAgICAgICAgYXR0cnMsIGluaGVyaXRlZCA9IF9zcGxpdF9saXN0KGF0dHJzLCBsYW1iZGEgdDogdFsyXSBpcyB0aGlzY2xhc3MpCisKKyAgICAgICAgICAgIGlmIHRoaXNjbGFzcyBpcyBfX2J1aWx0aW5fXy5vYmplY3Q6CisgICAgICAgICAgICAgICAgYXR0cnMgPSBpbmhlcml0ZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0aGlzY2xhc3MgaXMgb2JqZWN0OgorICAgICAgICAgICAgICAgIHRhZyA9ICdkZWZpbmVkIGhlcmUnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRhZyA9ICdpbmhlcml0ZWQgZnJvbSAlcycgJSBzZWxmLmNsYXNzbGluayh0aGlzY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdC5fX21vZHVsZV9fKQorICAgICAgICAgICAgdGFnICs9ICc6PGJyPlxuJworCisgICAgICAgICAgICAjIFNvcnQgYXR0cnMgYnkgbmFtZS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhdHRycy5zb3J0KGtleT1sYW1iZGEgdDogdFswXSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgYXR0cnMuc29ydChsYW1iZGEgdDEsIHQyOiBjbXAodDFbMF0sIHQyWzBdKSkgICAgIyAyLjMgY29tcGF0CisKKyAgICAgICAgICAgICMgUHVtcCBvdXQgdGhlIGF0dHJzLCBzZWdyZWdhdGVkIGJ5IGtpbmQuCisgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCdNZXRob2RzICVzJyAlIHRhZywgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB0OiB0WzFdID09ICdtZXRob2QnKQorICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgnQ2xhc3MgbWV0aG9kcyAlcycgJSB0YWcsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGEgdDogdFsxXSA9PSAnY2xhc3MgbWV0aG9kJykKKyAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoJ1N0YXRpYyBtZXRob2RzICVzJyAlIHRhZywgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB0OiB0WzFdID09ICdzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgICAgIGF0dHJzID0gc3BpbGxkZXNjcmlwdG9ycygnRGF0YSBkZXNjcmlwdG9ycyAlcycgJSB0YWcsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB0OiB0WzFdID09ICdkYXRhIGRlc2NyaXB0b3InKQorICAgICAgICAgICAgYXR0cnMgPSBzcGlsbGRhdGEoJ0RhdGEgYW5kIG90aGVyIGF0dHJpYnV0ZXMgJXMnICUgdGFnLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB0OiB0WzFdID09ICdkYXRhJykKKyAgICAgICAgICAgIGFzc2VydCBhdHRycyA9PSBbXQorICAgICAgICAgICAgYXR0cnMgPSBpbmhlcml0ZWQKKworICAgICAgICBjb250ZW50cyA9ICcnLmpvaW4oY29udGVudHMpCisKKyAgICAgICAgaWYgbmFtZSA9PSByZWFsbmFtZToKKyAgICAgICAgICAgIHRpdGxlID0gJzxhIG5hbWU9IiVzIj5jbGFzcyA8c3Ryb25nPiVzPC9zdHJvbmc+PC9hPicgJSAoCisgICAgICAgICAgICAgICAgbmFtZSwgcmVhbG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aXRsZSA9ICc8c3Ryb25nPiVzPC9zdHJvbmc+ID0gPGEgbmFtZT0iJXMiPmNsYXNzICVzPC9hPicgJSAoCisgICAgICAgICAgICAgICAgbmFtZSwgbmFtZSwgcmVhbG5hbWUpCisgICAgICAgIGlmIGJhc2VzOgorICAgICAgICAgICAgcGFyZW50cyA9IFtdCisgICAgICAgICAgICBmb3IgYmFzZSBpbiBiYXNlczoKKyAgICAgICAgICAgICAgICBwYXJlbnRzLmFwcGVuZChzZWxmLmNsYXNzbGluayhiYXNlLCBvYmplY3QuX19tb2R1bGVfXykpCisgICAgICAgICAgICB0aXRsZSA9IHRpdGxlICsgJyglcyknICUgam9pbihwYXJlbnRzLCAnLCAnKQorICAgICAgICBkb2MgPSBzZWxmLm1hcmt1cChnZXRkb2Mob2JqZWN0KSwgc2VsZi5wcmVmb3JtYXQsIGZ1bmNzLCBjbGFzc2VzLCBtZGljdCkKKyAgICAgICAgZG9jID0gZG9jIGFuZCAnPHR0PiVzPGJyPiZuYnNwOzwvdHQ+JyAlIGRvYworCisgICAgICAgIHJldHVybiBzZWxmLnNlY3Rpb24odGl0bGUsICcjMDAwMDAwJywgJyNmZmM4ZDgnLCBjb250ZW50cywgMywgZG9jKQorCisgICAgZGVmIGZvcm1hdHZhbHVlKHNlbGYsIG9iamVjdCk6CisgICAgICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBkZWZhdWx0IHZhbHVlIGFzIHRleHQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdyZXkoJz0nICsgc2VsZi5yZXByKG9iamVjdCkpCisKKyAgICBkZWYgZG9jcm91dGluZShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsCisgICAgICAgICAgICAgICAgICAgZnVuY3M9e30sIGNsYXNzZXM9e30sIG1ldGhvZHM9e30sIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBmb3IgYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LiIiIgorICAgICAgICByZWFsbmFtZSA9IG9iamVjdC5fX25hbWVfXworICAgICAgICBuYW1lID0gbmFtZSBvciByZWFsbmFtZQorICAgICAgICBhbmNob3IgPSAoY2wgYW5kIGNsLl9fbmFtZV9fIG9yICcnKSArICctJyArIG5hbWUKKyAgICAgICAgbm90ZSA9ICcnCisgICAgICAgIHNraXBkb2NzID0gMAorICAgICAgICBpZiBpbnNwZWN0LmlzbWV0aG9kKG9iamVjdCk6CisgICAgICAgICAgICBpbWNsYXNzID0gb2JqZWN0LmltX2NsYXNzCisgICAgICAgICAgICBpZiBjbDoKKyAgICAgICAgICAgICAgICBpZiBpbWNsYXNzIGlzIG5vdCBjbDoKKyAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICcgZnJvbSAnICsgc2VsZi5jbGFzc2xpbmsoaW1jbGFzcywgbW9kKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBvYmplY3QuaW1fc2VsZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICcgbWV0aG9kIG9mICVzIGluc3RhbmNlJyAlIHNlbGYuY2xhc3NsaW5rKAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LmltX3NlbGYuX19jbGFzc19fLCBtb2QpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICcgdW5ib3VuZCAlcyBtZXRob2QnICUgc2VsZi5jbGFzc2xpbmsoaW1jbGFzcyxtb2QpCisgICAgICAgICAgICBvYmplY3QgPSBvYmplY3QuaW1fZnVuYworCisgICAgICAgIGlmIG5hbWUgPT0gcmVhbG5hbWU6CisgICAgICAgICAgICB0aXRsZSA9ICc8YSBuYW1lPSIlcyI+PHN0cm9uZz4lczwvc3Ryb25nPjwvYT4nICUgKGFuY2hvciwgcmVhbG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAoY2wgYW5kIHJlYWxuYW1lIGluIGNsLl9fZGljdF9fIGFuZAorICAgICAgICAgICAgICAgIGNsLl9fZGljdF9fW3JlYWxuYW1lXSBpcyBvYmplY3QpOgorICAgICAgICAgICAgICAgIHJlYWxsaW5rID0gJzxhIGhyZWY9IiMlcyI+JXM8L2E+JyAlICgKKyAgICAgICAgICAgICAgICAgICAgY2wuX19uYW1lX18gKyAnLScgKyByZWFsbmFtZSwgcmVhbG5hbWUpCisgICAgICAgICAgICAgICAgc2tpcGRvY3MgPSAxCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlYWxsaW5rID0gcmVhbG5hbWUKKyAgICAgICAgICAgIHRpdGxlID0gJzxhIG5hbWU9IiVzIj48c3Ryb25nPiVzPC9zdHJvbmc+PC9hPiA9ICVzJyAlICgKKyAgICAgICAgICAgICAgICBhbmNob3IsIG5hbWUsIHJlYWxsaW5rKQorICAgICAgICBpZiBpbnNwZWN0LmlzZnVuY3Rpb24ob2JqZWN0KToKKyAgICAgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cyA9IGluc3BlY3QuZ2V0YXJnc3BlYyhvYmplY3QpCisgICAgICAgICAgICBhcmdzcGVjID0gaW5zcGVjdC5mb3JtYXRhcmdzcGVjKAorICAgICAgICAgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cywgZm9ybWF0dmFsdWU9c2VsZi5mb3JtYXR2YWx1ZSkKKyAgICAgICAgICAgIGlmIHJlYWxuYW1lID09ICc8bGFtYmRhPic6CisgICAgICAgICAgICAgICAgdGl0bGUgPSAnPHN0cm9uZz4lczwvc3Ryb25nPiA8ZW0+bGFtYmRhPC9lbT4gJyAlIG5hbWUKKyAgICAgICAgICAgICAgICBhcmdzcGVjID0gYXJnc3BlY1sxOi0xXSAjIHJlbW92ZSBwYXJlbnRoZXNlcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnc3BlYyA9ICcoLi4uKScKKworICAgICAgICBkZWNsID0gdGl0bGUgKyBhcmdzcGVjICsgKG5vdGUgYW5kIHNlbGYuZ3JleSgKKyAgICAgICAgICAgICAgICc8Zm9udCBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj4lczwvZm9udD4nICUgbm90ZSkpCisKKyAgICAgICAgaWYgc2tpcGRvY3M6CisgICAgICAgICAgICByZXR1cm4gJzxkbD48ZHQ+JXM8L2R0PjwvZGw+XG4nICUgZGVjbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZG9jID0gc2VsZi5tYXJrdXAoCisgICAgICAgICAgICAgICAgZ2V0ZG9jKG9iamVjdCksIHNlbGYucHJlZm9ybWF0LCBmdW5jcywgY2xhc3NlcywgbWV0aG9kcykKKyAgICAgICAgICAgIGRvYyA9IGRvYyBhbmQgJzxkZD48dHQ+JXM8L3R0PjwvZGQ+JyAlIGRvYworICAgICAgICAgICAgcmV0dXJuICc8ZGw+PGR0PiVzPC9kdD4lczwvZGw+XG4nICUgKGRlY2wsIGRvYykKKworICAgIGRlZiBfZG9jZGVzY3JpcHRvcihzZWxmLCBuYW1lLCB2YWx1ZSwgbW9kKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIHB1c2ggPSByZXN1bHRzLmFwcGVuZAorCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBwdXNoKCc8ZGw+PGR0PjxzdHJvbmc+JXM8L3N0cm9uZz48L2R0PlxuJyAlIG5hbWUpCisgICAgICAgIGlmIHZhbHVlLl9fZG9jX18gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkb2MgPSBzZWxmLm1hcmt1cChnZXRkb2ModmFsdWUpLCBzZWxmLnByZWZvcm1hdCkKKyAgICAgICAgICAgIHB1c2goJzxkZD48dHQ+JXM8L3R0PjwvZGQ+XG4nICUgZG9jKQorICAgICAgICBwdXNoKCc8L2RsPlxuJykKKworICAgICAgICByZXR1cm4gJycuam9pbihyZXN1bHRzKQorCisgICAgZGVmIGRvY3Byb3BlcnR5KHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgY2w9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgaHRtbCBkb2N1bWVudGF0aW9uIGZvciBhIHByb3BlcnR5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCBvYmplY3QsIG1vZCkKKworICAgIGRlZiBkb2NvdGhlcihzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsICppZ25vcmVkKToKKyAgICAgICAgIiIiUHJvZHVjZSBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGEgZGF0YSBvYmplY3QuIiIiCisgICAgICAgIGxocyA9IG5hbWUgYW5kICc8c3Ryb25nPiVzPC9zdHJvbmc+ID0gJyAlIG5hbWUgb3IgJycKKyAgICAgICAgcmV0dXJuIGxocyArIHNlbGYucmVwcihvYmplY3QpCisKKyAgICBkZWYgZG9jZGF0YShzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIGNsPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIGh0bWwgZG9jdW1lbnRhdGlvbiBmb3IgYSBkYXRhIGRlc2NyaXB0b3IuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIG9iamVjdCwgbW9kKQorCisgICAgZGVmIGluZGV4KHNlbGYsIGRpciwgc2hhZG93ZWQ9Tm9uZSk6CisgICAgICAgICIiIkdlbmVyYXRlIGFuIEhUTUwgaW5kZXggZm9yIGEgZGlyZWN0b3J5IG9mIG1vZHVsZXMuIiIiCisgICAgICAgIG1vZHBrZ3MgPSBbXQorICAgICAgICBpZiBzaGFkb3dlZCBpcyBOb25lOiBzaGFkb3dlZCA9IHt9CisgICAgICAgIGZvciBpbXBvcnRlciwgbmFtZSwgaXNwa2cgaW4gcGtndXRpbC5pdGVyX21vZHVsZXMoW2Rpcl0pOgorICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQoKG5hbWUsICcnLCBpc3BrZywgbmFtZSBpbiBzaGFkb3dlZCkpCisgICAgICAgICAgICBzaGFkb3dlZFtuYW1lXSA9IDEKKworICAgICAgICBtb2Rwa2dzLnNvcnQoKQorICAgICAgICBjb250ZW50cyA9IHNlbGYubXVsdGljb2x1bW4obW9kcGtncywgc2VsZi5tb2Rwa2dsaW5rKQorICAgICAgICByZXR1cm4gc2VsZi5iaWdzZWN0aW9uKGRpciwgJyNmZmZmZmYnLCAnI2VlNzdhYScsIGNvbnRlbnRzKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRleHQgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IKKworY2xhc3MgVGV4dFJlcHIoUmVwcik6CisgICAgIiIiQ2xhc3MgZm9yIHNhZmVseSBtYWtpbmcgYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGEgUHl0aG9uIG9iamVjdC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFJlcHIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5tYXhsaXN0ID0gc2VsZi5tYXh0dXBsZSA9IDIwCisgICAgICAgIHNlbGYubWF4ZGljdCA9IDEwCisgICAgICAgIHNlbGYubWF4c3RyaW5nID0gc2VsZi5tYXhvdGhlciA9IDEwMAorCisgICAgZGVmIHJlcHIxKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgaWYgaGFzYXR0cih0eXBlKHgpLCAnX19uYW1lX18nKToKKyAgICAgICAgICAgIG1ldGhvZG5hbWUgPSAncmVwcl8nICsgam9pbihzcGxpdCh0eXBlKHgpLl9fbmFtZV9fKSwgJ18nKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCBtZXRob2RuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLCBtZXRob2RuYW1lKSh4LCBsZXZlbCkKKyAgICAgICAgcmV0dXJuIGNyYW0oc3RyaXBpZChyZXByKHgpKSwgc2VsZi5tYXhvdGhlcikKKworICAgIGRlZiByZXByX3N0cmluZyhzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIHRlc3QgPSBjcmFtKHgsIHNlbGYubWF4c3RyaW5nKQorICAgICAgICB0ZXN0cmVwciA9IHJlcHIodGVzdCkKKyAgICAgICAgaWYgJ1xcJyBpbiB0ZXN0IGFuZCAnXFwnIG5vdCBpbiByZXBsYWNlKHRlc3RyZXByLCByJ1xcJywgJycpOgorICAgICAgICAgICAgIyBCYWNrc2xhc2hlcyBhcmUgb25seSBsaXRlcmFsIGluIHRoZSBzdHJpbmcgYW5kIGFyZSBuZXZlcgorICAgICAgICAgICAgIyBuZWVkZWQgdG8gbWFrZSBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzLCBzbyBzaG93IGEgcmF3IHN0cmluZy4KKyAgICAgICAgICAgIHJldHVybiAncicgKyB0ZXN0cmVwclswXSArIHRlc3QgKyB0ZXN0cmVwclswXQorICAgICAgICByZXR1cm4gdGVzdHJlcHIKKworICAgIHJlcHJfc3RyID0gcmVwcl9zdHJpbmcKKworICAgIGRlZiByZXByX2luc3RhbmNlKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGNyYW0oc3RyaXBpZChyZXByKHgpKSwgc2VsZi5tYXhzdHJpbmcpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiAnPCVzIGluc3RhbmNlPicgJSB4Ll9fY2xhc3NfXy5fX25hbWVfXworCitjbGFzcyBUZXh0RG9jKERvYyk6CisgICAgIiIiRm9ybWF0dGVyIGNsYXNzIGZvciB0ZXh0IGRvY3VtZW50YXRpb24uIiIiCisKKyAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdGV4dCBmb3JtYXR0aW5nIHV0aWxpdGllcworCisgICAgX3JlcHJfaW5zdGFuY2UgPSBUZXh0UmVwcigpCisgICAgcmVwciA9IF9yZXByX2luc3RhbmNlLnJlcHIKKworICAgIGRlZiBib2xkKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJGb3JtYXQgYSBzdHJpbmcgaW4gYm9sZCBieSBvdmVyc3RyaWtpbmcuIiIiCisgICAgICAgIHJldHVybiBqb2luKG1hcChsYW1iZGEgY2g6IGNoICsgJ1xiJyArIGNoLCB0ZXh0KSwgJycpCisKKyAgICBkZWYgaW5kZW50KHNlbGYsIHRleHQsIHByZWZpeD0nICAgICcpOgorICAgICAgICAiIiJJbmRlbnQgdGV4dCBieSBwcmVwZW5kaW5nIGEgZ2l2ZW4gcHJlZml4IHRvIGVhY2ggbGluZS4iIiIKKyAgICAgICAgaWYgbm90IHRleHQ6IHJldHVybiAnJworICAgICAgICBsaW5lcyA9IHNwbGl0KHRleHQsICdcbicpCisgICAgICAgIGxpbmVzID0gbWFwKGxhbWJkYSBsaW5lLCBwcmVmaXg9cHJlZml4OiBwcmVmaXggKyBsaW5lLCBsaW5lcykKKyAgICAgICAgaWYgbGluZXM6IGxpbmVzWy0xXSA9IHJzdHJpcChsaW5lc1stMV0pCisgICAgICAgIHJldHVybiBqb2luKGxpbmVzLCAnXG4nKQorCisgICAgZGVmIHNlY3Rpb24oc2VsZiwgdGl0bGUsIGNvbnRlbnRzKToKKyAgICAgICAgIiIiRm9ybWF0IGEgc2VjdGlvbiB3aXRoIGEgZ2l2ZW4gaGVhZGluZy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuYm9sZCh0aXRsZSkgKyAnXG4nICsgcnN0cmlwKHNlbGYuaW5kZW50KGNvbnRlbnRzKSkgKyAnXG5cbicKKworICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlLXNwZWNpZmljIHJvdXRpbmVzCisKKyAgICBkZWYgZm9ybWF0dHJlZShzZWxmLCB0cmVlLCBtb2RuYW1lLCBwYXJlbnQ9Tm9uZSwgcHJlZml4PScnKToKKyAgICAgICAgIiIiUmVuZGVyIGluIHRleHQgYSBjbGFzcyB0cmVlIGFzIHJldHVybmVkIGJ5IGluc3BlY3QuZ2V0Y2xhc3N0cmVlKCkuIiIiCisgICAgICAgIHJlc3VsdCA9ICcnCisgICAgICAgIGZvciBlbnRyeSBpbiB0cmVlOgorICAgICAgICAgICAgaWYgdHlwZShlbnRyeSkgaXMgdHlwZSgoKSk6CisgICAgICAgICAgICAgICAgYywgYmFzZXMgPSBlbnRyeQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHByZWZpeCArIGNsYXNzbmFtZShjLCBtb2RuYW1lKQorICAgICAgICAgICAgICAgIGlmIGJhc2VzIGFuZCBiYXNlcyAhPSAocGFyZW50LCk6CisgICAgICAgICAgICAgICAgICAgIHBhcmVudHMgPSBtYXAobGFtYmRhIGMsIG09bW9kbmFtZTogY2xhc3NuYW1lKGMsIG0pLCBiYXNlcykKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJyglcyknICUgam9pbihwYXJlbnRzLCAnLCAnKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICdcbicKKyAgICAgICAgICAgIGVsaWYgdHlwZShlbnRyeSkgaXMgdHlwZShbXSk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5mb3JtYXR0cmVlKAorICAgICAgICAgICAgICAgICAgICBlbnRyeSwgbW9kbmFtZSwgYywgcHJlZml4ICsgJyAgICAnKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZG9jbW9kdWxlKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgdGV4dCBkb2N1bWVudGF0aW9uIGZvciBhIGdpdmVuIG1vZHVsZSBvYmplY3QuIiIiCisgICAgICAgIG5hbWUgPSBvYmplY3QuX19uYW1lX18gIyBpZ25vcmUgdGhlIHBhc3NlZC1pbiBuYW1lCisgICAgICAgIHN5bm9wLCBkZXNjID0gc3BsaXRkb2MoZ2V0ZG9jKG9iamVjdCkpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VjdGlvbignTkFNRScsIG5hbWUgKyAoc3lub3AgYW5kICcgLSAnICsgc3lub3ApKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFsbCA9IG9iamVjdC5fX2FsbF9fCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGFsbCA9IE5vbmUKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gaW5zcGVjdC5nZXRhYnNmaWxlKG9iamVjdCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIGZpbGUgPSAnKGJ1aWx0LWluKScKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdGSUxFJywgZmlsZSkKKworICAgICAgICBkb2Nsb2MgPSBzZWxmLmdldGRvY2xvYyhvYmplY3QpCisgICAgICAgIGlmIGRvY2xvYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignTU9EVUxFIERPQ1MnLCBkb2Nsb2MpCisKKyAgICAgICAgaWYgZGVzYzoKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignREVTQ1JJUFRJT04nLCBkZXNjKQorCisgICAgICAgIGNsYXNzZXMgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpbnNwZWN0LmdldG1lbWJlcnMob2JqZWN0LCBpbnNwZWN0LmlzY2xhc3MpOgorICAgICAgICAgICAgIyBpZiBfX2FsbF9fIGV4aXN0cywgYmVsaWV2ZSBpdC4gIE90aGVyd2lzZSB1c2Ugb2xkIGhldXJpc3RpYy4KKyAgICAgICAgICAgIGlmIChhbGwgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICBvciAoaW5zcGVjdC5nZXRtb2R1bGUodmFsdWUpIG9yIG9iamVjdCkgaXMgb2JqZWN0KToKKyAgICAgICAgICAgICAgICBpZiB2aXNpYmxlbmFtZShrZXksIGFsbCwgb2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hcHBlbmQoKGtleSwgdmFsdWUpKQorICAgICAgICBmdW5jcyA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGluc3BlY3QuZ2V0bWVtYmVycyhvYmplY3QsIGluc3BlY3QuaXNyb3V0aW5lKToKKyAgICAgICAgICAgICMgaWYgX19hbGxfXyBleGlzdHMsIGJlbGlldmUgaXQuICBPdGhlcndpc2UgdXNlIG9sZCBoZXVyaXN0aWMuCisgICAgICAgICAgICBpZiAoYWxsIGlzIG5vdCBOb25lIG9yCisgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2J1aWx0aW4odmFsdWUpIG9yIGluc3BlY3QuZ2V0bW9kdWxlKHZhbHVlKSBpcyBvYmplY3QpOgorICAgICAgICAgICAgICAgIGlmIHZpc2libGVuYW1lKGtleSwgYWxsLCBvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBmdW5jcy5hcHBlbmQoKGtleSwgdmFsdWUpKQorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gaW5zcGVjdC5nZXRtZW1iZXJzKG9iamVjdCwgaXNkYXRhKToKKyAgICAgICAgICAgIGlmIHZpc2libGVuYW1lKGtleSwgYWxsLCBvYmplY3QpOgorICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKChrZXksIHZhbHVlKSkKKworICAgICAgICBtb2Rwa2dzID0gW10KKyAgICAgICAgbW9kcGtnc19uYW1lcyA9IHNldCgpCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19wYXRoX18nKToKKyAgICAgICAgICAgIGZvciBpbXBvcnRlciwgbW9kbmFtZSwgaXNwa2cgaW4gcGtndXRpbC5pdGVyX21vZHVsZXMob2JqZWN0Ll9fcGF0aF9fKToKKyAgICAgICAgICAgICAgICBtb2Rwa2dzX25hbWVzLmFkZChtb2RuYW1lKQorICAgICAgICAgICAgICAgIGlmIGlzcGtnOgorICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZChtb2RuYW1lICsgJyAocGFja2FnZSknKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKG1vZG5hbWUpCisKKyAgICAgICAgICAgIG1vZHBrZ3Muc29ydCgpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oCisgICAgICAgICAgICAgICAgJ1BBQ0tBR0UgQ09OVEVOVFMnLCBqb2luKG1vZHBrZ3MsICdcbicpKQorCisgICAgICAgICMgRGV0ZWN0IHN1Ym1vZHVsZXMgYXMgc29tZXRpbWVzIGNyZWF0ZWQgYnkgQyBleHRlbnNpb25zCisgICAgICAgIHN1Ym1vZHVsZXMgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBpbnNwZWN0LmdldG1lbWJlcnMob2JqZWN0LCBpbnNwZWN0LmlzbW9kdWxlKToKKyAgICAgICAgICAgIGlmIHZhbHVlLl9fbmFtZV9fLnN0YXJ0c3dpdGgobmFtZSArICcuJykgYW5kIGtleSBub3QgaW4gbW9kcGtnc19uYW1lczoKKyAgICAgICAgICAgICAgICBzdWJtb2R1bGVzLmFwcGVuZChrZXkpCisgICAgICAgIGlmIHN1Ym1vZHVsZXM6CisgICAgICAgICAgICBzdWJtb2R1bGVzLnNvcnQoKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKAorICAgICAgICAgICAgICAgICdTVUJNT0RVTEVTJywgam9pbihzdWJtb2R1bGVzLCAnXG4nKSkKKworICAgICAgICBpZiBjbGFzc2VzOgorICAgICAgICAgICAgY2xhc3NsaXN0ID0gbWFwKGxhbWJkYSBrZXlfdmFsdWU6IGtleV92YWx1ZVsxXSwgY2xhc3NlcykKKyAgICAgICAgICAgIGNvbnRlbnRzID0gW3NlbGYuZm9ybWF0dHJlZSgKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmdldGNsYXNzdHJlZShjbGFzc2xpc3QsIDEpLCBuYW1lKV0KKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGNsYXNzZXM6CisgICAgICAgICAgICAgICAgY29udGVudHMuYXBwZW5kKHNlbGYuZG9jdW1lbnQodmFsdWUsIGtleSwgbmFtZSkpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLnNlY3Rpb24oJ0NMQVNTRVMnLCBqb2luKGNvbnRlbnRzLCAnXG4nKSkKKworICAgICAgICBpZiBmdW5jczoKKyAgICAgICAgICAgIGNvbnRlbnRzID0gW10KKyAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGZ1bmNzOgorICAgICAgICAgICAgICAgIGNvbnRlbnRzLmFwcGVuZChzZWxmLmRvY3VtZW50KHZhbHVlLCBrZXksIG5hbWUpKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdGVU5DVElPTlMnLCBqb2luKGNvbnRlbnRzLCAnXG4nKSkKKworICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgY29udGVudHMgPSBbXQorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YToKKyAgICAgICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoc2VsZi5kb2NvdGhlcih2YWx1ZSwga2V5LCBuYW1lLCBtYXhsZW49NzApKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdEQVRBJywgam9pbihjb250ZW50cywgJ1xuJykpCisKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX3ZlcnNpb25fXycpOgorICAgICAgICAgICAgdmVyc2lvbiA9IHN0cihvYmplY3QuX192ZXJzaW9uX18pCisgICAgICAgICAgICBpZiB2ZXJzaW9uWzoxMV0gPT0gJyQnICsgJ1JldmlzaW9uOiAnIGFuZCB2ZXJzaW9uWy0xOl0gPT0gJyQnOgorICAgICAgICAgICAgICAgIHZlcnNpb24gPSBzdHJpcCh2ZXJzaW9uWzExOi0xXSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignVkVSU0lPTicsIHZlcnNpb24pCisgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19kYXRlX18nKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignREFURScsIHN0cihvYmplY3QuX19kYXRlX18pKQorICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fYXV0aG9yX18nKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbignQVVUSE9SJywgc3RyKG9iamVjdC5fX2F1dGhvcl9fKSkKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX2NyZWRpdHNfXycpOgorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc2VsZi5zZWN0aW9uKCdDUkVESVRTJywgc3RyKG9iamVjdC5fX2NyZWRpdHNfXykpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBkb2NjbGFzcyhzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsICppZ25vcmVkKToKKyAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgZ2l2ZW4gY2xhc3Mgb2JqZWN0LiIiIgorICAgICAgICByZWFsbmFtZSA9IG9iamVjdC5fX25hbWVfXworICAgICAgICBuYW1lID0gbmFtZSBvciByZWFsbmFtZQorICAgICAgICBiYXNlcyA9IG9iamVjdC5fX2Jhc2VzX18KKworICAgICAgICBkZWYgbWFrZW5hbWUoYywgbT1vYmplY3QuX19tb2R1bGVfXyk6CisgICAgICAgICAgICByZXR1cm4gY2xhc3NuYW1lKGMsIG0pCisKKyAgICAgICAgaWYgbmFtZSA9PSByZWFsbmFtZToKKyAgICAgICAgICAgIHRpdGxlID0gJ2NsYXNzICcgKyBzZWxmLmJvbGQocmVhbG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0aXRsZSA9IHNlbGYuYm9sZChuYW1lKSArICcgPSBjbGFzcyAnICsgcmVhbG5hbWUKKyAgICAgICAgaWYgYmFzZXM6CisgICAgICAgICAgICBwYXJlbnRzID0gbWFwKG1ha2VuYW1lLCBiYXNlcykKKyAgICAgICAgICAgIHRpdGxlID0gdGl0bGUgKyAnKCVzKScgJSBqb2luKHBhcmVudHMsICcsICcpCisKKyAgICAgICAgZG9jID0gZ2V0ZG9jKG9iamVjdCkKKyAgICAgICAgY29udGVudHMgPSBkb2MgYW5kIFtkb2MgKyAnXG4nXSBvciBbXQorICAgICAgICBwdXNoID0gY29udGVudHMuYXBwZW5kCisKKyAgICAgICAgIyBMaXN0IHRoZSBtcm8sIGlmIG5vbi10cml2aWFsLgorICAgICAgICBtcm8gPSBkZXF1ZShpbnNwZWN0LmdldG1ybyhvYmplY3QpKQorICAgICAgICBpZiBsZW4obXJvKSA+IDI6CisgICAgICAgICAgICBwdXNoKCJNZXRob2QgcmVzb2x1dGlvbiBvcmRlcjoiKQorICAgICAgICAgICAgZm9yIGJhc2UgaW4gbXJvOgorICAgICAgICAgICAgICAgIHB1c2goJyAgICAnICsgbWFrZW5hbWUoYmFzZSkpCisgICAgICAgICAgICBwdXNoKCcnKQorCisgICAgICAgICMgQ3V0ZSBsaXR0bGUgY2xhc3MgdG8gcHVtcCBvdXQgYSBob3Jpem9udGFsIHJ1bGUgYmV0d2VlbiBzZWN0aW9ucy4KKyAgICAgICAgY2xhc3MgSG9yaXpvbnRhbFJ1bGU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5uZWVkb25lID0gMAorICAgICAgICAgICAgZGVmIG1heWJlKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubmVlZG9uZToKKyAgICAgICAgICAgICAgICAgICAgcHVzaCgnLScgKiA3MCkKKyAgICAgICAgICAgICAgICBzZWxmLm5lZWRvbmUgPSAxCisgICAgICAgIGhyID0gSG9yaXpvbnRhbFJ1bGUoKQorCisgICAgICAgIGRlZiBzcGlsbChtc2csIGF0dHJzLCBwcmVkaWNhdGUpOgorICAgICAgICAgICAgb2ssIGF0dHJzID0gX3NwbGl0X2xpc3QoYXR0cnMsIHByZWRpY2F0ZSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGhyLm1heWJlKCkKKyAgICAgICAgICAgICAgICBwdXNoKG1zZykKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSwga2luZCwgaG9tZWNscywgdmFsdWUgaW4gb2s6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihvYmplY3QsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWUgZGVzY3JpcHRvcnMgbWF5IG1lZXQgYSBmYWlsdXJlIGluIHRoZWlyIF9fZ2V0X18uCisgICAgICAgICAgICAgICAgICAgICAgICAjIChidWcgIzE3ODUpCisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgdmFsdWUsIG1vZCkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuZG9jdW1lbnQodmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgbW9kLCBvYmplY3QpKQorICAgICAgICAgICAgcmV0dXJuIGF0dHJzCisKKyAgICAgICAgZGVmIHNwaWxsZGVzY3JpcHRvcnMobXNnLCBhdHRycywgcHJlZGljYXRlKToKKyAgICAgICAgICAgIG9rLCBhdHRycyA9IF9zcGxpdF9saXN0KGF0dHJzLCBwcmVkaWNhdGUpCisgICAgICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICAgICBoci5tYXliZSgpCisgICAgICAgICAgICAgICAgcHVzaChtc2cpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUsIGtpbmQsIGhvbWVjbHMsIHZhbHVlIGluIG9rOgorICAgICAgICAgICAgICAgICAgICBwdXNoKHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgdmFsdWUsIG1vZCkpCisgICAgICAgICAgICByZXR1cm4gYXR0cnMKKworICAgICAgICBkZWYgc3BpbGxkYXRhKG1zZywgYXR0cnMsIHByZWRpY2F0ZSk6CisgICAgICAgICAgICBvaywgYXR0cnMgPSBfc3BsaXRfbGlzdChhdHRycywgcHJlZGljYXRlKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgaHIubWF5YmUoKQorICAgICAgICAgICAgICAgIHB1c2gobXNnKQorICAgICAgICAgICAgICAgIGZvciBuYW1lLCBraW5kLCBob21lY2xzLCB2YWx1ZSBpbiBvazoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhc2F0dHIodmFsdWUsICdfX2NhbGxfXycpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2RhdGFkZXNjcmlwdG9yKHZhbHVlKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSBnZXRkb2ModmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBkb2MgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHB1c2goc2VsZi5kb2NvdGhlcihnZXRhdHRyKG9iamVjdCwgbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBtb2QsIG1heGxlbj03MCwgZG9jPWRvYykgKyAnXG4nKQorICAgICAgICAgICAgcmV0dXJuIGF0dHJzCisKKyAgICAgICAgYXR0cnMgPSBmaWx0ZXIobGFtYmRhIGRhdGE6IHZpc2libGVuYW1lKGRhdGFbMF0sIG9iaj1vYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmeV9jbGFzc19hdHRycyhvYmplY3QpKQorICAgICAgICB3aGlsZSBhdHRyczoKKyAgICAgICAgICAgIGlmIG1ybzoKKyAgICAgICAgICAgICAgICB0aGlzY2xhc3MgPSBtcm8ucG9wbGVmdCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRoaXNjbGFzcyA9IGF0dHJzWzBdWzJdCisgICAgICAgICAgICBhdHRycywgaW5oZXJpdGVkID0gX3NwbGl0X2xpc3QoYXR0cnMsIGxhbWJkYSB0OiB0WzJdIGlzIHRoaXNjbGFzcykKKworICAgICAgICAgICAgaWYgdGhpc2NsYXNzIGlzIF9fYnVpbHRpbl9fLm9iamVjdDoKKyAgICAgICAgICAgICAgICBhdHRycyA9IGluaGVyaXRlZAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHRoaXNjbGFzcyBpcyBvYmplY3Q6CisgICAgICAgICAgICAgICAgdGFnID0gImRlZmluZWQgaGVyZSIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGFnID0gImluaGVyaXRlZCBmcm9tICVzIiAlIGNsYXNzbmFtZSh0aGlzY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuX19tb2R1bGVfXykKKworICAgICAgICAgICAgIyBTb3J0IGF0dHJzIGJ5IG5hbWUuCisgICAgICAgICAgICBhdHRycy5zb3J0KCkKKworICAgICAgICAgICAgIyBQdW1wIG91dCB0aGUgYXR0cnMsIHNlZ3JlZ2F0ZWQgYnkga2luZC4KKyAgICAgICAgICAgIGF0dHJzID0gc3BpbGwoIk1ldGhvZHMgJXM6XG4iICUgdGFnLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ21ldGhvZCcpCisgICAgICAgICAgICBhdHRycyA9IHNwaWxsKCJDbGFzcyBtZXRob2RzICVzOlxuIiAlIHRhZywgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSB0OiB0WzFdID09ICdjbGFzcyBtZXRob2QnKQorICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgiU3RhdGljIG1ldGhvZHMgJXM6XG4iICUgdGFnLCBhdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ3N0YXRpYyBtZXRob2QnKQorICAgICAgICAgICAgYXR0cnMgPSBzcGlsbGRlc2NyaXB0b3JzKCJEYXRhIGRlc2NyaXB0b3JzICVzOlxuIiAlIHRhZywgYXR0cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ2RhdGEgZGVzY3JpcHRvcicpCisgICAgICAgICAgICBhdHRycyA9IHNwaWxsZGF0YSgiRGF0YSBhbmQgb3RoZXIgYXR0cmlidXRlcyAlczpcbiIgJSB0YWcsIGF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhIHQ6IHRbMV0gPT0gJ2RhdGEnKQorICAgICAgICAgICAgYXNzZXJ0IGF0dHJzID09IFtdCisgICAgICAgICAgICBhdHRycyA9IGluaGVyaXRlZAorCisgICAgICAgIGNvbnRlbnRzID0gJ1xuJy5qb2luKGNvbnRlbnRzKQorICAgICAgICBpZiBub3QgY29udGVudHM6CisgICAgICAgICAgICByZXR1cm4gdGl0bGUgKyAnXG4nCisgICAgICAgIHJldHVybiB0aXRsZSArICdcbicgKyBzZWxmLmluZGVudChyc3RyaXAoY29udGVudHMpLCAnIHwgICcpICsgJ1xuJworCisgICAgZGVmIGZvcm1hdHZhbHVlKHNlbGYsIG9iamVjdCk6CisgICAgICAgICIiIkZvcm1hdCBhbiBhcmd1bWVudCBkZWZhdWx0IHZhbHVlIGFzIHRleHQuIiIiCisgICAgICAgIHJldHVybiAnPScgKyBzZWxmLnJlcHIob2JqZWN0KQorCisgICAgZGVmIGRvY3JvdXRpbmUoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBjbD1Ob25lKToKKyAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIG9iamVjdC4iIiIKKyAgICAgICAgcmVhbG5hbWUgPSBvYmplY3QuX19uYW1lX18KKyAgICAgICAgbmFtZSA9IG5hbWUgb3IgcmVhbG5hbWUKKyAgICAgICAgbm90ZSA9ICcnCisgICAgICAgIHNraXBkb2NzID0gMAorICAgICAgICBpZiBpbnNwZWN0LmlzbWV0aG9kKG9iamVjdCk6CisgICAgICAgICAgICBpbWNsYXNzID0gb2JqZWN0LmltX2NsYXNzCisgICAgICAgICAgICBpZiBjbDoKKyAgICAgICAgICAgICAgICBpZiBpbWNsYXNzIGlzIG5vdCBjbDoKKyAgICAgICAgICAgICAgICAgICAgbm90ZSA9ICcgZnJvbSAnICsgY2xhc3NuYW1lKGltY2xhc3MsIG1vZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgb2JqZWN0LmltX3NlbGYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG5vdGUgPSAnIG1ldGhvZCBvZiAlcyBpbnN0YW5jZScgJSBjbGFzc25hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QuaW1fc2VsZi5fX2NsYXNzX18sIG1vZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBub3RlID0gJyB1bmJvdW5kICVzIG1ldGhvZCcgJSBjbGFzc25hbWUoaW1jbGFzcyxtb2QpCisgICAgICAgICAgICBvYmplY3QgPSBvYmplY3QuaW1fZnVuYworCisgICAgICAgIGlmIG5hbWUgPT0gcmVhbG5hbWU6CisgICAgICAgICAgICB0aXRsZSA9IHNlbGYuYm9sZChyZWFsbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIChjbCBhbmQgcmVhbG5hbWUgaW4gY2wuX19kaWN0X18gYW5kCisgICAgICAgICAgICAgICAgY2wuX19kaWN0X19bcmVhbG5hbWVdIGlzIG9iamVjdCk6CisgICAgICAgICAgICAgICAgc2tpcGRvY3MgPSAxCisgICAgICAgICAgICB0aXRsZSA9IHNlbGYuYm9sZChuYW1lKSArICcgPSAnICsgcmVhbG5hbWUKKyAgICAgICAgaWYgaW5zcGVjdC5pc2Z1bmN0aW9uKG9iamVjdCk6CisgICAgICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMgPSBpbnNwZWN0LmdldGFyZ3NwZWMob2JqZWN0KQorICAgICAgICAgICAgYXJnc3BlYyA9IGluc3BlY3QuZm9ybWF0YXJnc3BlYygKKyAgICAgICAgICAgICAgICBhcmdzLCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsIGZvcm1hdHZhbHVlPXNlbGYuZm9ybWF0dmFsdWUpCisgICAgICAgICAgICBpZiByZWFsbmFtZSA9PSAnPGxhbWJkYT4nOgorICAgICAgICAgICAgICAgIHRpdGxlID0gc2VsZi5ib2xkKG5hbWUpICsgJyBsYW1iZGEgJworICAgICAgICAgICAgICAgIGFyZ3NwZWMgPSBhcmdzcGVjWzE6LTFdICMgcmVtb3ZlIHBhcmVudGhlc2VzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzcGVjID0gJyguLi4pJworICAgICAgICBkZWNsID0gdGl0bGUgKyBhcmdzcGVjICsgbm90ZQorCisgICAgICAgIGlmIHNraXBkb2NzOgorICAgICAgICAgICAgcmV0dXJuIGRlY2wgKyAnXG4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkb2MgPSBnZXRkb2Mob2JqZWN0KSBvciAnJworICAgICAgICAgICAgcmV0dXJuIGRlY2wgKyAnXG4nICsgKGRvYyBhbmQgcnN0cmlwKHNlbGYuaW5kZW50KGRvYykpICsgJ1xuJykKKworICAgIGRlZiBfZG9jZGVzY3JpcHRvcihzZWxmLCBuYW1lLCB2YWx1ZSwgbW9kKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIHB1c2ggPSByZXN1bHRzLmFwcGVuZAorCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBwdXNoKHNlbGYuYm9sZChuYW1lKSkKKyAgICAgICAgICAgIHB1c2goJ1xuJykKKyAgICAgICAgZG9jID0gZ2V0ZG9jKHZhbHVlKSBvciAnJworICAgICAgICBpZiBkb2M6CisgICAgICAgICAgICBwdXNoKHNlbGYuaW5kZW50KGRvYykpCisgICAgICAgICAgICBwdXNoKCdcbicpCisgICAgICAgIHJldHVybiAnJy5qb2luKHJlc3VsdHMpCisKKyAgICBkZWYgZG9jcHJvcGVydHkoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBjbD1Ob25lKToKKyAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgcHJvcGVydHkuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIG9iamVjdCwgbW9kKQorCisgICAgZGVmIGRvY2RhdGEoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBjbD1Ob25lKToKKyAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgZGF0YSBkZXNjcmlwdG9yLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCBvYmplY3QsIG1vZCkKKworICAgIGRlZiBkb2NvdGhlcihzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIHBhcmVudD1Ob25lLCBtYXhsZW49Tm9uZSwgZG9jPU5vbmUpOgorICAgICAgICAiIiJQcm9kdWNlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgYSBkYXRhIG9iamVjdC4iIiIKKyAgICAgICAgcmVwciA9IHNlbGYucmVwcihvYmplY3QpCisgICAgICAgIGlmIG1heGxlbjoKKyAgICAgICAgICAgIGxpbmUgPSAobmFtZSBhbmQgbmFtZSArICcgPSAnIG9yICcnKSArIHJlcHIKKyAgICAgICAgICAgIGNob3AgPSBtYXhsZW4gLSBsZW4obGluZSkKKyAgICAgICAgICAgIGlmIGNob3AgPCAwOiByZXByID0gcmVwcls6Y2hvcF0gKyAnLi4uJworICAgICAgICBsaW5lID0gKG5hbWUgYW5kIHNlbGYuYm9sZChuYW1lKSArICcgPSAnIG9yICcnKSArIHJlcHIKKyAgICAgICAgaWYgZG9jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZSArPSAnXG4nICsgc2VsZi5pbmRlbnQoc3RyKGRvYykpCisgICAgICAgIHJldHVybiBsaW5lCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHVzZXIgaW50ZXJmYWNlcworCitkZWYgcGFnZXIodGV4dCk6CisgICAgIiIiVGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQsIGRldGVybWluZSB3aGF0IGtpbmQgb2YgcGFnZXIgdG8gdXNlLiIiIgorICAgIGdsb2JhbCBwYWdlcgorICAgIHBhZ2VyID0gZ2V0cGFnZXIoKQorICAgIHBhZ2VyKHRleHQpCisKK2RlZiBnZXRwYWdlcigpOgorICAgICIiIkRlY2lkZSB3aGF0IG1ldGhvZCB0byB1c2UgZm9yIHBhZ2luZyB0aHJvdWdoIHRleHQuIiIiCisgICAgaWYgdHlwZShzeXMuc3Rkb3V0KSBpcyBub3QgdHlwZXMuRmlsZVR5cGU6CisgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCisgICAgaWYgbm90IHN5cy5zdGRpbi5pc2F0dHkoKSBvciBub3Qgc3lzLnN0ZG91dC5pc2F0dHkoKToKKyAgICAgICAgcmV0dXJuIHBsYWlucGFnZXIKKyAgICBpZiAnUEFHRVInIGluIG9zLmVudmlyb246CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOiAjIHBpcGVzIGNvbXBsZXRlbHkgYnJva2VuIGluIFdpbmRvd3MKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogdGVtcGZpbGVwYWdlcihwbGFpbih0ZXh0KSwgb3MuZW52aXJvblsnUEFHRVInXSkKKyAgICAgICAgZWxpZiBvcy5lbnZpcm9uLmdldCgnVEVSTScpIGluICgnZHVtYicsICdlbWFjcycpOgorICAgICAgICAgICAgcmV0dXJuIGxhbWJkYSB0ZXh0OiBwaXBlcGFnZXIocGxhaW4odGV4dCksIG9zLmVudmlyb25bJ1BBR0VSJ10pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcih0ZXh0LCBvcy5lbnZpcm9uWydQQUdFUiddKQorICAgIGlmIG9zLmVudmlyb24uZ2V0KCdURVJNJykgaW4gKCdkdW1iJywgJ2VtYWNzJyk6CisgICAgICAgIHJldHVybiBwbGFpbnBhZ2VyCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3Igc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ29zMicpOgorICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHRlbXBmaWxlcGFnZXIocGxhaW4odGV4dCksICdtb3JlIDwnKQorICAgIGlmIGhhc2F0dHIob3MsICdzeXN0ZW0nKSBhbmQgb3Muc3lzdGVtKCcobGVzcykgMj4vZGV2L251bGwnKSA9PSAwOgorICAgICAgICByZXR1cm4gbGFtYmRhIHRleHQ6IHBpcGVwYWdlcih0ZXh0LCAnbGVzcycpCisKKyAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICAoZmQsIGZpbGVuYW1lKSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgIG9zLmNsb3NlKGZkKQorICAgIHRyeToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3N5c3RlbScpIGFuZCBvcy5zeXN0ZW0oJ21vcmUgIiVzIicgJSBmaWxlbmFtZSkgPT0gMDoKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGEgdGV4dDogcGlwZXBhZ2VyKHRleHQsICdtb3JlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB0dHlwYWdlcgorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworZGVmIHBsYWluKHRleHQpOgorICAgICIiIlJlbW92ZSBib2xkZmFjZSBmb3JtYXR0aW5nIGZyb20gdGV4dC4iIiIKKyAgICByZXR1cm4gcmUuc3ViKCcuXGInLCAnJywgdGV4dCkKKworZGVmIHBpcGVwYWdlcih0ZXh0LCBjbWQpOgorICAgICIiIlBhZ2UgdGhyb3VnaCB0ZXh0IGJ5IGZlZWRpbmcgaXQgdG8gYW5vdGhlciBwcm9ncmFtLiIiIgorICAgIHBpcGUgPSBvcy5wb3BlbihjbWQsICd3JykKKyAgICB0cnk6CisgICAgICAgIHBpcGUud3JpdGUodGV4dCkKKyAgICAgICAgcGlwZS5jbG9zZSgpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MgIyBJZ25vcmUgYnJva2VuIHBpcGVzIGNhdXNlZCBieSBxdWl0dGluZyB0aGUgcGFnZXIgcHJvZ3JhbS4KKworZGVmIHRlbXBmaWxlcGFnZXIodGV4dCwgY21kKToKKyAgICAiIiJQYWdlIHRocm91Z2ggdGV4dCBieSBpbnZva2luZyBhIHByb2dyYW0gb24gYSB0ZW1wb3JhcnkgZmlsZS4iIiIKKyAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICBmaWxlbmFtZSA9IHRlbXBmaWxlLm1rdGVtcCgpCisgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUsICd3JykKKyAgICBmaWxlLndyaXRlKHRleHQpCisgICAgZmlsZS5jbG9zZSgpCisgICAgdHJ5OgorICAgICAgICBvcy5zeXN0ZW0oY21kICsgJyAiJyArIGZpbGVuYW1lICsgJyInKQorICAgIGZpbmFsbHk6CisgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworZGVmIHR0eXBhZ2VyKHRleHQpOgorICAgICIiIlBhZ2UgdGhyb3VnaCB0ZXh0IG9uIGEgdGV4dCB0ZXJtaW5hbC4iIiIKKyAgICBsaW5lcyA9IHNwbGl0KHBsYWluKHRleHQpLCAnXG4nKQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHR0eQorICAgICAgICBmZCA9IHN5cy5zdGRpbi5maWxlbm8oKQorICAgICAgICBvbGQgPSB0dHkudGNnZXRhdHRyKGZkKQorICAgICAgICB0dHkuc2V0Y2JyZWFrKGZkKQorICAgICAgICBnZXRjaGFyID0gbGFtYmRhOiBzeXMuc3RkaW4ucmVhZCgxKQorICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgdHR5ID0gTm9uZQorICAgICAgICBnZXRjaGFyID0gbGFtYmRhOiBzeXMuc3RkaW4ucmVhZGxpbmUoKVs6LTFdWzoxXQorCisgICAgdHJ5OgorICAgICAgICByID0gaW5jID0gb3MuZW52aXJvbi5nZXQoJ0xJTkVTJywgMjUpIC0gMQorICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGpvaW4obGluZXNbOmluY10sICdcbicpICsgJ1xuJykKKyAgICAgICAgd2hpbGUgbGluZXNbcjpdOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnLS0gbW9yZSAtLScpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgIGMgPSBnZXRjaGFyKCkKKworICAgICAgICAgICAgaWYgYyBpbiAoJ3EnLCAnUScpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ1xyICAgICAgICAgIFxyJykKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBjIGluICgnXHInLCAnXG4nKToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcciAgICAgICAgICBccicgKyBsaW5lc1tyXSArICdcbicpCisgICAgICAgICAgICAgICAgciA9IHIgKyAxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIGMgaW4gKCdiJywgJ0InLCAnXHgxYicpOgorICAgICAgICAgICAgICAgIHIgPSByIC0gaW5jIC0gaW5jCisgICAgICAgICAgICAgICAgaWYgciA8IDA6IHIgPSAwCisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicgKyBqb2luKGxpbmVzW3I6citpbmNdLCAnXG4nKSArICdcbicpCisgICAgICAgICAgICByID0gciArIGluYworCisgICAgZmluYWxseToKKyAgICAgICAgaWYgdHR5OgorICAgICAgICAgICAgdHR5LnRjc2V0YXR0cihmZCwgdHR5LlRDU0FGTFVTSCwgb2xkKQorCitkZWYgcGxhaW5wYWdlcih0ZXh0KToKKyAgICAiIiJTaW1wbHkgcHJpbnQgdW5mb3JtYXR0ZWQgdGV4dC4gIFRoaXMgaXMgdGhlIHVsdGltYXRlIGZhbGxiYWNrLiIiIgorICAgIHN5cy5zdGRvdXQud3JpdGUocGxhaW4odGV4dCkpCisKK2RlZiBkZXNjcmliZSh0aGluZyk6CisgICAgIiIiUHJvZHVjZSBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBnaXZlbiB0aGluZy4iIiIKKyAgICBpZiBpbnNwZWN0LmlzbW9kdWxlKHRoaW5nKToKKyAgICAgICAgaWYgdGhpbmcuX19uYW1lX18gaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgorICAgICAgICAgICAgcmV0dXJuICdidWlsdC1pbiBtb2R1bGUgJyArIHRoaW5nLl9fbmFtZV9fCisgICAgICAgIGlmIGhhc2F0dHIodGhpbmcsICdfX3BhdGhfXycpOgorICAgICAgICAgICAgcmV0dXJuICdwYWNrYWdlICcgKyB0aGluZy5fX25hbWVfXworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdtb2R1bGUgJyArIHRoaW5nLl9fbmFtZV9fCisgICAgaWYgaW5zcGVjdC5pc2J1aWx0aW4odGhpbmcpOgorICAgICAgICByZXR1cm4gJ2J1aWx0LWluIGZ1bmN0aW9uICcgKyB0aGluZy5fX25hbWVfXworICAgIGlmIGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yKHRoaW5nKToKKyAgICAgICAgcmV0dXJuICdnZXRzZXQgZGVzY3JpcHRvciAlcy4lcy4lcycgJSAoCisgICAgICAgICAgICB0aGluZy5fX29iamNsYXNzX18uX19tb2R1bGVfXywgdGhpbmcuX19vYmpjbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgdGhpbmcuX19uYW1lX18pCisgICAgaWYgaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3IodGhpbmcpOgorICAgICAgICByZXR1cm4gJ21lbWJlciBkZXNjcmlwdG9yICVzLiVzLiVzJyAlICgKKyAgICAgICAgICAgIHRoaW5nLl9fb2JqY2xhc3NfXy5fX21vZHVsZV9fLCB0aGluZy5fX29iamNsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICB0aGluZy5fX25hbWVfXykKKyAgICBpZiBpbnNwZWN0LmlzY2xhc3ModGhpbmcpOgorICAgICAgICByZXR1cm4gJ2NsYXNzICcgKyB0aGluZy5fX25hbWVfXworICAgIGlmIGluc3BlY3QuaXNmdW5jdGlvbih0aGluZyk6CisgICAgICAgIHJldHVybiAnZnVuY3Rpb24gJyArIHRoaW5nLl9fbmFtZV9fCisgICAgaWYgaW5zcGVjdC5pc21ldGhvZCh0aGluZyk6CisgICAgICAgIHJldHVybiAnbWV0aG9kICcgKyB0aGluZy5fX25hbWVfXworICAgIGlmIHR5cGUodGhpbmcpIGlzIHR5cGVzLkluc3RhbmNlVHlwZToKKyAgICAgICAgcmV0dXJuICdpbnN0YW5jZSBvZiAnICsgdGhpbmcuX19jbGFzc19fLl9fbmFtZV9fCisgICAgcmV0dXJuIHR5cGUodGhpbmcpLl9fbmFtZV9fCisKK2RlZiBsb2NhdGUocGF0aCwgZm9yY2Vsb2FkPTApOgorICAgICIiIkxvY2F0ZSBhbiBvYmplY3QgYnkgbmFtZSBvciBkb3R0ZWQgcGF0aCwgaW1wb3J0aW5nIGFzIG5lY2Vzc2FyeS4iIiIKKyAgICBwYXJ0cyA9IFtwYXJ0IGZvciBwYXJ0IGluIHNwbGl0KHBhdGgsICcuJykgaWYgcGFydF0KKyAgICBtb2R1bGUsIG4gPSBOb25lLCAwCisgICAgd2hpbGUgbiA8IGxlbihwYXJ0cyk6CisgICAgICAgIG5leHRtb2R1bGUgPSBzYWZlaW1wb3J0KGpvaW4ocGFydHNbOm4rMV0sICcuJyksIGZvcmNlbG9hZCkKKyAgICAgICAgaWYgbmV4dG1vZHVsZTogbW9kdWxlLCBuID0gbmV4dG1vZHVsZSwgbiArIDEKKyAgICAgICAgZWxzZTogYnJlYWsKKyAgICBpZiBtb2R1bGU6CisgICAgICAgIG9iamVjdCA9IG1vZHVsZQorICAgIGVsc2U6CisgICAgICAgIG9iamVjdCA9IF9fYnVpbHRpbl9fCisgICAgZm9yIHBhcnQgaW4gcGFydHNbbjpdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvYmplY3QgPSBnZXRhdHRyKG9iamVjdCwgcGFydCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gb2JqZWN0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGludGVyYWN0aXZlIGludGVycHJldGVyIGludGVyZmFjZQorCit0ZXh0ID0gVGV4dERvYygpCitodG1sID0gSFRNTERvYygpCisKK2NsYXNzIF9PbGRTdHlsZUNsYXNzOiBwYXNzCitfT0xEX0lOU1RBTkNFX1RZUEUgPSB0eXBlKF9PbGRTdHlsZUNsYXNzKCkpCisKK2RlZiByZXNvbHZlKHRoaW5nLCBmb3JjZWxvYWQ9MCk6CisgICAgIiIiR2l2ZW4gYW4gb2JqZWN0IG9yIGEgcGF0aCB0byBhbiBvYmplY3QsIGdldCB0aGUgb2JqZWN0IGFuZCBpdHMgbmFtZS4iIiIKKyAgICBpZiBpc2luc3RhbmNlKHRoaW5nLCBzdHIpOgorICAgICAgICBvYmplY3QgPSBsb2NhdGUodGhpbmcsIGZvcmNlbG9hZCkKKyAgICAgICAgaWYgbm90IG9iamVjdDoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAnbm8gUHl0aG9uIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVyJyAlIHRoaW5nCisgICAgICAgIHJldHVybiBvYmplY3QsIHRoaW5nCisgICAgZWxzZToKKyAgICAgICAgbmFtZSA9IGdldGF0dHIodGhpbmcsICdfX25hbWVfXycsIE5vbmUpCisgICAgICAgIHJldHVybiB0aGluZywgbmFtZSBpZiBpc2luc3RhbmNlKG5hbWUsIHN0cikgZWxzZSBOb25lCisKK2RlZiByZW5kZXJfZG9jKHRoaW5nLCB0aXRsZT0nUHl0aG9uIExpYnJhcnkgRG9jdW1lbnRhdGlvbjogJXMnLCBmb3JjZWxvYWQ9MCk6CisgICAgIiIiUmVuZGVyIHRleHQgZG9jdW1lbnRhdGlvbiwgZ2l2ZW4gYW4gb2JqZWN0IG9yIGEgcGF0aCB0byBhbiBvYmplY3QuIiIiCisgICAgb2JqZWN0LCBuYW1lID0gcmVzb2x2ZSh0aGluZywgZm9yY2Vsb2FkKQorICAgIGRlc2MgPSBkZXNjcmliZShvYmplY3QpCisgICAgbW9kdWxlID0gaW5zcGVjdC5nZXRtb2R1bGUob2JqZWN0KQorICAgIGlmIG5hbWUgYW5kICcuJyBpbiBuYW1lOgorICAgICAgICBkZXNjICs9ICcgaW4gJyArIG5hbWVbOm5hbWUucmZpbmQoJy4nKV0KKyAgICBlbGlmIG1vZHVsZSBhbmQgbW9kdWxlIGlzIG5vdCBvYmplY3Q6CisgICAgICAgIGRlc2MgKz0gJyBpbiBtb2R1bGUgJyArIG1vZHVsZS5fX25hbWVfXworICAgIGlmIHR5cGUob2JqZWN0KSBpcyBfT0xEX0lOU1RBTkNFX1RZUEU6CisgICAgICAgICMgSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYW4gb2xkLXN0eWxlIGNsYXNzLAorICAgICAgICAjIGRvY3VtZW50IGl0cyBhdmFpbGFibGUgbWV0aG9kcyBpbnN0ZWFkIG9mIGl0cyB2YWx1ZS4KKyAgICAgICAgb2JqZWN0ID0gb2JqZWN0Ll9fY2xhc3NfXworICAgIGVsaWYgbm90IChpbnNwZWN0LmlzbW9kdWxlKG9iamVjdCkgb3IKKyAgICAgICAgICAgICAgaW5zcGVjdC5pc2NsYXNzKG9iamVjdCkgb3IKKyAgICAgICAgICAgICAgaW5zcGVjdC5pc3JvdXRpbmUob2JqZWN0KSBvcgorICAgICAgICAgICAgICBpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpIG9yCisgICAgICAgICAgICAgIGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKG9iamVjdCkgb3IKKyAgICAgICAgICAgICAgaXNpbnN0YW5jZShvYmplY3QsIHByb3BlcnR5KSk6CisgICAgICAgICMgSWYgdGhlIHBhc3NlZCBvYmplY3QgaXMgYSBwaWVjZSBvZiBkYXRhIG9yIGFuIGluc3RhbmNlLAorICAgICAgICAjIGRvY3VtZW50IGl0cyBhdmFpbGFibGUgbWV0aG9kcyBpbnN0ZWFkIG9mIGl0cyB2YWx1ZS4KKyAgICAgICAgb2JqZWN0ID0gdHlwZShvYmplY3QpCisgICAgICAgIGRlc2MgKz0gJyBvYmplY3QnCisgICAgcmV0dXJuIHRpdGxlICUgZGVzYyArICdcblxuJyArIHRleHQuZG9jdW1lbnQob2JqZWN0LCBuYW1lKQorCitkZWYgZG9jKHRoaW5nLCB0aXRsZT0nUHl0aG9uIExpYnJhcnkgRG9jdW1lbnRhdGlvbjogJXMnLCBmb3JjZWxvYWQ9MCk6CisgICAgIiIiRGlzcGxheSB0ZXh0IGRvY3VtZW50YXRpb24sIGdpdmVuIGFuIG9iamVjdCBvciBhIHBhdGggdG8gYW4gb2JqZWN0LiIiIgorICAgIHRyeToKKyAgICAgICAgcGFnZXIocmVuZGVyX2RvYyh0aGluZywgdGl0bGUsIGZvcmNlbG9hZCkpCisgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgRXJyb3JEdXJpbmdJbXBvcnQpLCB2YWx1ZToKKyAgICAgICAgcHJpbnQgdmFsdWUKKworZGVmIHdyaXRlZG9jKHRoaW5nLCBmb3JjZWxvYWQ9MCk6CisgICAgIiIiV3JpdGUgSFRNTCBkb2N1bWVudGF0aW9uIHRvIGEgZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuIiIiCisgICAgdHJ5OgorICAgICAgICBvYmplY3QsIG5hbWUgPSByZXNvbHZlKHRoaW5nLCBmb3JjZWxvYWQpCisgICAgICAgIHBhZ2UgPSBodG1sLnBhZ2UoZGVzY3JpYmUob2JqZWN0KSwgaHRtbC5kb2N1bWVudChvYmplY3QsIG5hbWUpKQorICAgICAgICBmaWxlID0gb3BlbihuYW1lICsgJy5odG1sJywgJ3cnKQorICAgICAgICBmaWxlLndyaXRlKHBhZ2UpCisgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICBwcmludCAnd3JvdGUnLCBuYW1lICsgJy5odG1sJworICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEVycm9yRHVyaW5nSW1wb3J0KSwgdmFsdWU6CisgICAgICAgIHByaW50IHZhbHVlCisKK2RlZiB3cml0ZWRvY3MoZGlyLCBwa2dwYXRoPScnLCBkb25lPU5vbmUpOgorICAgICIiIldyaXRlIG91dCBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGFsbCBtb2R1bGVzIGluIGEgZGlyZWN0b3J5IHRyZWUuIiIiCisgICAgaWYgZG9uZSBpcyBOb25lOiBkb25lID0ge30KKyAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyhbZGlyXSwgcGtncGF0aCk6CisgICAgICAgIHdyaXRlZG9jKG1vZG5hbWUpCisgICAgcmV0dXJuCisKK2NsYXNzIEhlbHBlcjoKKworICAgICMgVGhlc2UgZGljdGlvbmFyaWVzIG1hcCBhIHRvcGljIG5hbWUgdG8gZWl0aGVyIGFuIGFsaWFzLCBvciBhIHR1cGxlCisgICAgIyAobGFiZWwsIHNlZWFsc28taXRlbXMpLiAgVGhlICJsYWJlbCIgaXMgdGhlIGxhYmVsIG9mIHRoZSBjb3JyZXNwb25kaW5nCisgICAgIyBzZWN0aW9uIGluIHRoZSAucnN0IGZpbGUgdW5kZXIgRG9jLyBhbmQgYW4gaW5kZXggaW50byB0aGUgZGljdGlvbmFyeQorICAgICMgaW4gcHlkb2NfZGF0YS90b3BpY3MucHkuCisgICAgIworICAgICMgQ0FVVElPTjogaWYgeW91IGNoYW5nZSBvbmUgb2YgdGhlc2UgZGljdGlvbmFyaWVzLCBiZSBzdXJlIHRvIGFkYXB0IHRoZQorICAgICMgICAgICAgICAgbGlzdCBvZiBuZWVkZWQgbGFiZWxzIGluIERvYy90b29scy9zcGhpbnhleHQvcHlzcGVjaWZpYy5weSBhbmQKKyAgICAjICAgICAgICAgIHJlZ2VuZXJhdGUgdGhlIHB5ZG9jX2RhdGEvdG9waWNzLnB5IGZpbGUgYnkgcnVubmluZworICAgICMgICAgICAgICAgICAgIG1ha2UgcHlkb2MtdG9waWNzCisgICAgIyAgICAgICAgICBpbiBEb2MvIGFuZCBjb3B5aW5nIHRoZSBvdXRwdXQgZmlsZSBpbnRvIHRoZSBMaWIvIGRpcmVjdG9yeS4KKworICAgIGtleXdvcmRzID0geworICAgICAgICAnYW5kJzogJ0JPT0xFQU4nLAorICAgICAgICAnYXMnOiAnd2l0aCcsCisgICAgICAgICdhc3NlcnQnOiAoJ2Fzc2VydCcsICcnKSwKKyAgICAgICAgJ2JyZWFrJzogKCdicmVhaycsICd3aGlsZSBmb3InKSwKKyAgICAgICAgJ2NsYXNzJzogKCdjbGFzcycsICdDTEFTU0VTIFNQRUNJQUxNRVRIT0RTJyksCisgICAgICAgICdjb250aW51ZSc6ICgnY29udGludWUnLCAnd2hpbGUgZm9yJyksCisgICAgICAgICdkZWYnOiAoJ2Z1bmN0aW9uJywgJycpLAorICAgICAgICAnZGVsJzogKCdkZWwnLCAnQkFTSUNNRVRIT0RTJyksCisgICAgICAgICdlbGlmJzogJ2lmJywKKyAgICAgICAgJ2Vsc2UnOiAoJ2Vsc2UnLCAnd2hpbGUgZm9yJyksCisgICAgICAgICdleGNlcHQnOiAndHJ5JywKKyAgICAgICAgJ2V4ZWMnOiAoJ2V4ZWMnLCAnJyksCisgICAgICAgICdmaW5hbGx5JzogJ3RyeScsCisgICAgICAgICdmb3InOiAoJ2ZvcicsICdicmVhayBjb250aW51ZSB3aGlsZScpLAorICAgICAgICAnZnJvbSc6ICdpbXBvcnQnLAorICAgICAgICAnZ2xvYmFsJzogKCdnbG9iYWwnLCAnTkFNRVNQQUNFUycpLAorICAgICAgICAnaWYnOiAoJ2lmJywgJ1RSVVRIVkFMVUUnKSwKKyAgICAgICAgJ2ltcG9ydCc6ICgnaW1wb3J0JywgJ01PRFVMRVMnKSwKKyAgICAgICAgJ2luJzogKCdpbicsICdTRVFVRU5DRU1FVEhPRFMyJyksCisgICAgICAgICdpcyc6ICdDT01QQVJJU09OJywKKyAgICAgICAgJ2xhbWJkYSc6ICgnbGFtYmRhJywgJ0ZVTkNUSU9OUycpLAorICAgICAgICAnbm90JzogJ0JPT0xFQU4nLAorICAgICAgICAnb3InOiAnQk9PTEVBTicsCisgICAgICAgICdwYXNzJzogKCdwYXNzJywgJycpLAorICAgICAgICAncHJpbnQnOiAoJ3ByaW50JywgJycpLAorICAgICAgICAncmFpc2UnOiAoJ3JhaXNlJywgJ0VYQ0VQVElPTlMnKSwKKyAgICAgICAgJ3JldHVybic6ICgncmV0dXJuJywgJ0ZVTkNUSU9OUycpLAorICAgICAgICAndHJ5JzogKCd0cnknLCAnRVhDRVBUSU9OUycpLAorICAgICAgICAnd2hpbGUnOiAoJ3doaWxlJywgJ2JyZWFrIGNvbnRpbnVlIGlmIFRSVVRIVkFMVUUnKSwKKyAgICAgICAgJ3dpdGgnOiAoJ3dpdGgnLCAnQ09OVEVYVE1BTkFHRVJTIEVYQ0VQVElPTlMgeWllbGQnKSwKKyAgICAgICAgJ3lpZWxkJzogKCd5aWVsZCcsICcnKSwKKyAgICB9CisgICAgIyBFaXRoZXIgYWRkIHN5bWJvbHMgdG8gdGhpcyBkaWN0aW9uYXJ5IG9yIHRvIHRoZSBzeW1ib2xzIGRpY3Rpb25hcnkKKyAgICAjIGRpcmVjdGx5OiBXaGljaGV2ZXIgaXMgZWFzaWVyLiBUaGV5IGFyZSBtZXJnZWQgbGF0ZXIuCisgICAgX3N5bWJvbHNfaW52ZXJzZSA9IHsKKyAgICAgICAgJ1NUUklOR1MnIDogKCInIiwgIicnJyIsICJyJyIsICJ1JyIsICciIiInLCAnIicsICdyIicsICd1IicpLAorICAgICAgICAnT1BFUkFUT1JTJyA6ICgnKycsICctJywgJyonLCAnKionLCAnLycsICcvLycsICclJywgJzw8JywgJz4+JywgJyYnLAorICAgICAgICAgICAgICAgICAgICAgICAnfCcsICdeJywgJ34nLCAnPCcsICc+JywgJzw9JywgJz49JywgJz09JywgJyE9JywgJzw+JyksCisgICAgICAgICdDT01QQVJJU09OJyA6ICgnPCcsICc+JywgJzw9JywgJz49JywgJz09JywgJyE9JywgJzw+JyksCisgICAgICAgICdVTkFSWScgOiAoJy0nLCAnficpLAorICAgICAgICAnQVVHTUVOVEVEQVNTSUdOTUVOVCcgOiAoJys9JywgJy09JywgJyo9JywgJy89JywgJyU9JywgJyY9JywgJ3w9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ149JywgJzw8PScsICc+Pj0nLCAnKio9JywgJy8vPScpLAorICAgICAgICAnQklUV0lTRScgOiAoJzw8JywgJz4+JywgJyYnLCAnfCcsICdeJywgJ34nKSwKKyAgICAgICAgJ0NPTVBMRVgnIDogKCdqJywgJ0onKQorICAgIH0KKyAgICBzeW1ib2xzID0geworICAgICAgICAnJSc6ICdPUEVSQVRPUlMgRk9STUFUVElORycsCisgICAgICAgICcqKic6ICdQT1dFUicsCisgICAgICAgICcsJzogJ1RVUExFUyBMSVNUUyBGVU5DVElPTlMnLAorICAgICAgICAnLic6ICdBVFRSSUJVVEVTIEZMT0FUIE1PRFVMRVMgT0JKRUNUUycsCisgICAgICAgICcuLi4nOiAnRUxMSVBTSVMnLAorICAgICAgICAnOic6ICdTTElDSU5HUyBESUNUSU9OQVJZTElURVJBTFMnLAorICAgICAgICAnQCc6ICdkZWYgY2xhc3MnLAorICAgICAgICAnXFwnOiAnU1RSSU5HUycsCisgICAgICAgICdfJzogJ1BSSVZBVEVOQU1FUycsCisgICAgICAgICdfXyc6ICdQUklWQVRFTkFNRVMgU1BFQ0lBTE1FVEhPRFMnLAorICAgICAgICAnYCc6ICdCQUNLUVVPVEVTJywKKyAgICAgICAgJygnOiAnVFVQTEVTIEZVTkNUSU9OUyBDQUxMUycsCisgICAgICAgICcpJzogJ1RVUExFUyBGVU5DVElPTlMgQ0FMTFMnLAorICAgICAgICAnWyc6ICdMSVNUUyBTVUJTQ1JJUFRTIFNMSUNJTkdTJywKKyAgICAgICAgJ10nOiAnTElTVFMgU1VCU0NSSVBUUyBTTElDSU5HUycKKyAgICB9CisgICAgZm9yIHRvcGljLCBzeW1ib2xzXyBpbiBfc3ltYm9sc19pbnZlcnNlLml0ZXJpdGVtcygpOgorICAgICAgICBmb3Igc3ltYm9sIGluIHN5bWJvbHNfOgorICAgICAgICAgICAgdG9waWNzID0gc3ltYm9scy5nZXQoc3ltYm9sLCB0b3BpYykKKyAgICAgICAgICAgIGlmIHRvcGljIG5vdCBpbiB0b3BpY3M6CisgICAgICAgICAgICAgICAgdG9waWNzID0gdG9waWNzICsgJyAnICsgdG9waWMKKyAgICAgICAgICAgIHN5bWJvbHNbc3ltYm9sXSA9IHRvcGljcworCisgICAgdG9waWNzID0geworICAgICAgICAnVFlQRVMnOiAoJ3R5cGVzJywgJ1NUUklOR1MgVU5JQ09ERSBOVU1CRVJTIFNFUVVFTkNFUyBNQVBQSU5HUyAnCisgICAgICAgICAgICAgICAgICAnRlVOQ1RJT05TIENMQVNTRVMgTU9EVUxFUyBGSUxFUyBpbnNwZWN0JyksCisgICAgICAgICdTVFJJTkdTJzogKCdzdHJpbmdzJywgJ3N0ciBVTklDT0RFIFNFUVVFTkNFUyBTVFJJTkdNRVRIT0RTIEZPUk1BVFRJTkcgJworICAgICAgICAgICAgICAgICAgICAnVFlQRVMnKSwKKyAgICAgICAgJ1NUUklOR01FVEhPRFMnOiAoJ3N0cmluZy1tZXRob2RzJywgJ1NUUklOR1MgRk9STUFUVElORycpLAorICAgICAgICAnRk9STUFUVElORyc6ICgnZm9ybWF0c3RyaW5ncycsICdPUEVSQVRPUlMnKSwKKyAgICAgICAgJ1VOSUNPREUnOiAoJ3N0cmluZ3MnLCAnZW5jb2RpbmdzIHVuaWNvZGUgU0VRVUVOQ0VTIFNUUklOR01FVEhPRFMgJworICAgICAgICAgICAgICAgICAgICAnRk9STUFUVElORyBUWVBFUycpLAorICAgICAgICAnTlVNQkVSUyc6ICgnbnVtYmVycycsICdJTlRFR0VSIEZMT0FUIENPTVBMRVggVFlQRVMnKSwKKyAgICAgICAgJ0lOVEVHRVInOiAoJ2ludGVnZXJzJywgJ2ludCByYW5nZScpLAorICAgICAgICAnRkxPQVQnOiAoJ2Zsb2F0aW5nJywgJ2Zsb2F0IG1hdGgnKSwKKyAgICAgICAgJ0NPTVBMRVgnOiAoJ2ltYWdpbmFyeScsICdjb21wbGV4IGNtYXRoJyksCisgICAgICAgICdTRVFVRU5DRVMnOiAoJ3R5cGVzc2VxJywgJ1NUUklOR01FVEhPRFMgRk9STUFUVElORyB4cmFuZ2UgTElTVFMnKSwKKyAgICAgICAgJ01BUFBJTkdTJzogJ0RJQ1RJT05BUklFUycsCisgICAgICAgICdGVU5DVElPTlMnOiAoJ3R5cGVzZnVuY3Rpb25zJywgJ2RlZiBUWVBFUycpLAorICAgICAgICAnTUVUSE9EUyc6ICgndHlwZXNtZXRob2RzJywgJ2NsYXNzIGRlZiBDTEFTU0VTIFRZUEVTJyksCisgICAgICAgICdDT0RFT0JKRUNUUyc6ICgnYmx0aW4tY29kZS1vYmplY3RzJywgJ2NvbXBpbGUgRlVOQ1RJT05TIFRZUEVTJyksCisgICAgICAgICdUWVBFT0JKRUNUUyc6ICgnYmx0aW4tdHlwZS1vYmplY3RzJywgJ3R5cGVzIFRZUEVTJyksCisgICAgICAgICdGUkFNRU9CSkVDVFMnOiAnVFlQRVMnLAorICAgICAgICAnVFJBQ0VCQUNLUyc6ICdUWVBFUycsCisgICAgICAgICdOT05FJzogKCdibHRpbi1udWxsLW9iamVjdCcsICcnKSwKKyAgICAgICAgJ0VMTElQU0lTJzogKCdibHRpbi1lbGxpcHNpcy1vYmplY3QnLCAnU0xJQ0lOR1MnKSwKKyAgICAgICAgJ0ZJTEVTJzogKCdibHRpbi1maWxlLW9iamVjdHMnLCAnJyksCisgICAgICAgICdTUEVDSUFMQVRUUklCVVRFUyc6ICgnc3BlY2lhbGF0dHJzJywgJycpLAorICAgICAgICAnQ0xBU1NFUyc6ICgndHlwZXMnLCAnY2xhc3MgU1BFQ0lBTE1FVEhPRFMgUFJJVkFURU5BTUVTJyksCisgICAgICAgICdNT0RVTEVTJzogKCd0eXBlc21vZHVsZXMnLCAnaW1wb3J0JyksCisgICAgICAgICdQQUNLQUdFUyc6ICdpbXBvcnQnLAorICAgICAgICAnRVhQUkVTU0lPTlMnOiAoJ29wZXJhdG9yLXN1bW1hcnknLCAnbGFtYmRhIG9yIGFuZCBub3QgaW4gaXMgQk9PTEVBTiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnQ09NUEFSSVNPTiBCSVRXSVNFIFNISUZUSU5HIEJJTkFSWSBGT1JNQVRUSU5HIFBPV0VSICcKKyAgICAgICAgICAgICAgICAgICAgICAgICdVTkFSWSBBVFRSSUJVVEVTIFNVQlNDUklQVFMgU0xJQ0lOR1MgQ0FMTFMgVFVQTEVTICcKKyAgICAgICAgICAgICAgICAgICAgICAgICdMSVNUUyBESUNUSU9OQVJJRVMgQkFDS1FVT1RFUycpLAorICAgICAgICAnT1BFUkFUT1JTJzogJ0VYUFJFU1NJT05TJywKKyAgICAgICAgJ1BSRUNFREVOQ0UnOiAnRVhQUkVTU0lPTlMnLAorICAgICAgICAnT0JKRUNUUyc6ICgnb2JqZWN0cycsICdUWVBFUycpLAorICAgICAgICAnU1BFQ0lBTE1FVEhPRFMnOiAoJ3NwZWNpYWxuYW1lcycsICdCQVNJQ01FVEhPRFMgQVRUUklCVVRFTUVUSE9EUyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ0FMTEFCTEVNRVRIT0RTIFNFUVVFTkNFTUVUSE9EUzEgTUFQUElOR01FVEhPRFMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1NFUVVFTkNFTUVUSE9EUzIgTlVNQkVSTUVUSE9EUyBDTEFTU0VTJyksCisgICAgICAgICdCQVNJQ01FVEhPRFMnOiAoJ2N1c3RvbWl6YXRpb24nLCAnY21wIGhhc2ggcmVwciBzdHIgU1BFQ0lBTE1FVEhPRFMnKSwKKyAgICAgICAgJ0FUVFJJQlVURU1FVEhPRFMnOiAoJ2F0dHJpYnV0ZS1hY2Nlc3MnLCAnQVRUUklCVVRFUyBTUEVDSUFMTUVUSE9EUycpLAorICAgICAgICAnQ0FMTEFCTEVNRVRIT0RTJzogKCdjYWxsYWJsZS10eXBlcycsICdDQUxMUyBTUEVDSUFMTUVUSE9EUycpLAorICAgICAgICAnU0VRVUVOQ0VNRVRIT0RTMSc6ICgnc2VxdWVuY2UtdHlwZXMnLCAnU0VRVUVOQ0VTIFNFUVVFTkNFTUVUSE9EUzIgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU1BFQ0lBTE1FVEhPRFMnKSwKKyAgICAgICAgJ1NFUVVFTkNFTUVUSE9EUzInOiAoJ3NlcXVlbmNlLW1ldGhvZHMnLCAnU0VRVUVOQ0VTIFNFUVVFTkNFTUVUSE9EUzEgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU1BFQ0lBTE1FVEhPRFMnKSwKKyAgICAgICAgJ01BUFBJTkdNRVRIT0RTJzogKCdzZXF1ZW5jZS10eXBlcycsICdNQVBQSU5HUyBTUEVDSUFMTUVUSE9EUycpLAorICAgICAgICAnTlVNQkVSTUVUSE9EUyc6ICgnbnVtZXJpYy10eXBlcycsICdOVU1CRVJTIEFVR01FTlRFREFTU0lHTk1FTlQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAnU1BFQ0lBTE1FVEhPRFMnKSwKKyAgICAgICAgJ0VYRUNVVElPTic6ICgnZXhlY21vZGVsJywgJ05BTUVTUEFDRVMgRFlOQU1JQ0ZFQVRVUkVTIEVYQ0VQVElPTlMnKSwKKyAgICAgICAgJ05BTUVTUEFDRVMnOiAoJ25hbWluZycsICdnbG9iYWwgQVNTSUdOTUVOVCBERUxFVElPTiBEWU5BTUlDRkVBVFVSRVMnKSwKKyAgICAgICAgJ0RZTkFNSUNGRUFUVVJFUyc6ICgnZHluYW1pYy1mZWF0dXJlcycsICcnKSwKKyAgICAgICAgJ1NDT1BJTkcnOiAnTkFNRVNQQUNFUycsCisgICAgICAgICdGUkFNRVMnOiAnTkFNRVNQQUNFUycsCisgICAgICAgICdFWENFUFRJT05TJzogKCdleGNlcHRpb25zJywgJ3RyeSBleGNlcHQgZmluYWxseSByYWlzZScpLAorICAgICAgICAnQ09FUkNJT05TJzogKCdjb2VyY2lvbi1ydWxlcycsJ0NPTlZFUlNJT05TJyksCisgICAgICAgICdDT05WRVJTSU9OUyc6ICgnY29udmVyc2lvbnMnLCAnQ09FUkNJT05TJyksCisgICAgICAgICdJREVOVElGSUVSUyc6ICgnaWRlbnRpZmllcnMnLCAna2V5d29yZHMgU1BFQ0lBTElERU5USUZJRVJTJyksCisgICAgICAgICdTUEVDSUFMSURFTlRJRklFUlMnOiAoJ2lkLWNsYXNzZXMnLCAnJyksCisgICAgICAgICdQUklWQVRFTkFNRVMnOiAoJ2F0b20taWRlbnRpZmllcnMnLCAnJyksCisgICAgICAgICdMSVRFUkFMUyc6ICgnYXRvbS1saXRlcmFscycsICdTVFJJTkdTIEJBQ0tRVU9URVMgTlVNQkVSUyAnCisgICAgICAgICAgICAgICAgICAgICAnVFVQTEVMSVRFUkFMUyBMSVNUTElURVJBTFMgRElDVElPTkFSWUxJVEVSQUxTJyksCisgICAgICAgICdUVVBMRVMnOiAnU0VRVUVOQ0VTJywKKyAgICAgICAgJ1RVUExFTElURVJBTFMnOiAoJ2V4cHJsaXN0cycsICdUVVBMRVMgTElURVJBTFMnKSwKKyAgICAgICAgJ0xJU1RTJzogKCd0eXBlc3NlcS1tdXRhYmxlJywgJ0xJU1RMSVRFUkFMUycpLAorICAgICAgICAnTElTVExJVEVSQUxTJzogKCdsaXN0cycsICdMSVNUUyBMSVRFUkFMUycpLAorICAgICAgICAnRElDVElPTkFSSUVTJzogKCd0eXBlc21hcHBpbmcnLCAnRElDVElPTkFSWUxJVEVSQUxTJyksCisgICAgICAgICdESUNUSU9OQVJZTElURVJBTFMnOiAoJ2RpY3QnLCAnRElDVElPTkFSSUVTIExJVEVSQUxTJyksCisgICAgICAgICdCQUNLUVVPVEVTJzogKCdzdHJpbmctY29udmVyc2lvbnMnLCAncmVwciBzdHIgU1RSSU5HUyBMSVRFUkFMUycpLAorICAgICAgICAnQVRUUklCVVRFUyc6ICgnYXR0cmlidXRlLXJlZmVyZW5jZXMnLCAnZ2V0YXR0ciBoYXNhdHRyIHNldGF0dHIgJworICAgICAgICAgICAgICAgICAgICAgICAnQVRUUklCVVRFTUVUSE9EUycpLAorICAgICAgICAnU1VCU0NSSVBUUyc6ICgnc3Vic2NyaXB0aW9ucycsICdTRVFVRU5DRU1FVEhPRFMxJyksCisgICAgICAgICdTTElDSU5HUyc6ICgnc2xpY2luZ3MnLCAnU0VRVUVOQ0VNRVRIT0RTMicpLAorICAgICAgICAnQ0FMTFMnOiAoJ2NhbGxzJywgJ0VYUFJFU1NJT05TJyksCisgICAgICAgICdQT1dFUic6ICgncG93ZXInLCAnRVhQUkVTU0lPTlMnKSwKKyAgICAgICAgJ1VOQVJZJzogKCd1bmFyeScsICdFWFBSRVNTSU9OUycpLAorICAgICAgICAnQklOQVJZJzogKCdiaW5hcnknLCAnRVhQUkVTU0lPTlMnKSwKKyAgICAgICAgJ1NISUZUSU5HJzogKCdzaGlmdGluZycsICdFWFBSRVNTSU9OUycpLAorICAgICAgICAnQklUV0lTRSc6ICgnYml0d2lzZScsICdFWFBSRVNTSU9OUycpLAorICAgICAgICAnQ09NUEFSSVNPTic6ICgnY29tcGFyaXNvbnMnLCAnRVhQUkVTU0lPTlMgQkFTSUNNRVRIT0RTJyksCisgICAgICAgICdCT09MRUFOJzogKCdib29sZWFucycsICdFWFBSRVNTSU9OUyBUUlVUSFZBTFVFJyksCisgICAgICAgICdBU1NFUlRJT04nOiAnYXNzZXJ0JywKKyAgICAgICAgJ0FTU0lHTk1FTlQnOiAoJ2Fzc2lnbm1lbnQnLCAnQVVHTUVOVEVEQVNTSUdOTUVOVCcpLAorICAgICAgICAnQVVHTUVOVEVEQVNTSUdOTUVOVCc6ICgnYXVnYXNzaWduJywgJ05VTUJFUk1FVEhPRFMnKSwKKyAgICAgICAgJ0RFTEVUSU9OJzogJ2RlbCcsCisgICAgICAgICdQUklOVElORyc6ICdwcmludCcsCisgICAgICAgICdSRVRVUk5JTkcnOiAncmV0dXJuJywKKyAgICAgICAgJ0lNUE9SVElORyc6ICdpbXBvcnQnLAorICAgICAgICAnQ09ORElUSU9OQUwnOiAnaWYnLAorICAgICAgICAnTE9PUElORyc6ICgnY29tcG91bmQnLCAnZm9yIHdoaWxlIGJyZWFrIGNvbnRpbnVlJyksCisgICAgICAgICdUUlVUSFZBTFVFJzogKCd0cnV0aCcsICdpZiB3aGlsZSBhbmQgb3Igbm90IEJBU0lDTUVUSE9EUycpLAorICAgICAgICAnREVCVUdHSU5HJzogKCdkZWJ1Z2dlcicsICdwZGInKSwKKyAgICAgICAgJ0NPTlRFWFRNQU5BR0VSUyc6ICgnY29udGV4dC1tYW5hZ2VycycsICd3aXRoJyksCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0PU5vbmUsIG91dHB1dD1Ob25lKToKKyAgICAgICAgc2VsZi5faW5wdXQgPSBpbnB1dAorICAgICAgICBzZWxmLl9vdXRwdXQgPSBvdXRwdXQKKworICAgIGlucHV0ICA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9pbnB1dCBvciBzeXMuc3RkaW4pCisgICAgb3V0cHV0ID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IHNlbGYuX291dHB1dCBvciBzeXMuc3Rkb3V0KQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBpbnNwZWN0LnN0YWNrKClbMV1bM10gPT0gJz8nOgorICAgICAgICAgICAgc2VsZigpCisgICAgICAgICAgICByZXR1cm4gJycKKyAgICAgICAgcmV0dXJuICc8cHlkb2MuSGVscGVyIGluc3RhbmNlPicKKworICAgIF9Hb0ludGVyYWN0aXZlID0gb2JqZWN0KCkKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcmVxdWVzdD1fR29JbnRlcmFjdGl2ZSk6CisgICAgICAgIGlmIHJlcXVlc3QgaXMgbm90IHNlbGYuX0dvSW50ZXJhY3RpdmU6CisgICAgICAgICAgICBzZWxmLmhlbHAocmVxdWVzdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW50cm8oKQorICAgICAgICAgICAgc2VsZi5pbnRlcmFjdCgpCisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK1lvdSBhcmUgbm93IGxlYXZpbmcgaGVscCBhbmQgcmV0dXJuaW5nIHRvIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuCitJZiB5b3Ugd2FudCB0byBhc2sgZm9yIGhlbHAgb24gYSBwYXJ0aWN1bGFyIG9iamVjdCBkaXJlY3RseSBmcm9tIHRoZQoraW50ZXJwcmV0ZXIsIHlvdSBjYW4gdHlwZSAiaGVscChvYmplY3QpIi4gIEV4ZWN1dGluZyAiaGVscCgnc3RyaW5nJykiCitoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIHR5cGluZyBhIHBhcnRpY3VsYXIgc3RyaW5nIGF0IHRoZSBoZWxwPiBwcm9tcHQuCisnJycpCisKKyAgICBkZWYgaW50ZXJhY3Qoc2VsZik6CisgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCdcbicpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHNlbGYuZ2V0bGluZSgnaGVscD4gJykKKyAgICAgICAgICAgICAgICBpZiBub3QgcmVxdWVzdDogYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIEVPRkVycm9yKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmVxdWVzdCA9IHN0cmlwKHJlcGxhY2UocmVxdWVzdCwgJyInLCAnJywgIiciLCAnJykpCisgICAgICAgICAgICBpZiBsb3dlcihyZXF1ZXN0KSBpbiAoJ3EnLCAncXVpdCcpOiBicmVhaworICAgICAgICAgICAgc2VsZi5oZWxwKHJlcXVlc3QpCisKKyAgICBkZWYgZ2V0bGluZShzZWxmLCBwcm9tcHQpOgorICAgICAgICAiIiJSZWFkIG9uZSBsaW5lLCB1c2luZyByYXdfaW5wdXQgd2hlbiBhdmFpbGFibGUuIiIiCisgICAgICAgIGlmIHNlbGYuaW5wdXQgaXMgc3lzLnN0ZGluOgorICAgICAgICAgICAgcmV0dXJuIHJhd19pbnB1dChwcm9tcHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZShwcm9tcHQpCisgICAgICAgICAgICBzZWxmLm91dHB1dC5mbHVzaCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnB1dC5yZWFkbGluZSgpCisKKyAgICBkZWYgaGVscChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgaWYgdHlwZShyZXF1ZXN0KSBpcyB0eXBlKCcnKToKKyAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LnN0cmlwKCkKKyAgICAgICAgICAgIGlmIHJlcXVlc3QgPT0gJ2hlbHAnOiBzZWxmLmludHJvKCkKKyAgICAgICAgICAgIGVsaWYgcmVxdWVzdCA9PSAna2V5d29yZHMnOiBzZWxmLmxpc3RrZXl3b3JkcygpCisgICAgICAgICAgICBlbGlmIHJlcXVlc3QgPT0gJ3N5bWJvbHMnOiBzZWxmLmxpc3RzeW1ib2xzKCkKKyAgICAgICAgICAgIGVsaWYgcmVxdWVzdCA9PSAndG9waWNzJzogc2VsZi5saXN0dG9waWNzKCkKKyAgICAgICAgICAgIGVsaWYgcmVxdWVzdCA9PSAnbW9kdWxlcyc6IHNlbGYubGlzdG1vZHVsZXMoKQorICAgICAgICAgICAgZWxpZiByZXF1ZXN0Wzo4XSA9PSAnbW9kdWxlcyAnOgorICAgICAgICAgICAgICAgIHNlbGYubGlzdG1vZHVsZXMoc3BsaXQocmVxdWVzdClbMV0pCisgICAgICAgICAgICBlbGlmIHJlcXVlc3QgaW4gc2VsZi5zeW1ib2xzOiBzZWxmLnNob3dzeW1ib2wocmVxdWVzdCkKKyAgICAgICAgICAgIGVsaWYgcmVxdWVzdCBpbiBzZWxmLmtleXdvcmRzOiBzZWxmLnNob3d0b3BpYyhyZXF1ZXN0KQorICAgICAgICAgICAgZWxpZiByZXF1ZXN0IGluIHNlbGYudG9waWNzOiBzZWxmLnNob3d0b3BpYyhyZXF1ZXN0KQorICAgICAgICAgICAgZWxpZiByZXF1ZXN0OiBkb2MocmVxdWVzdCwgJ0hlbHAgb24gJXM6JykKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHJlcXVlc3QsIEhlbHBlcik6IHNlbGYoKQorICAgICAgICBlbHNlOiBkb2MocmVxdWVzdCwgJ0hlbHAgb24gJXM6JykKKyAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJ1xuJykKKworICAgIGRlZiBpbnRybyhzZWxmKToKKyAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJycnCitXZWxjb21lIHRvIFB5dGhvbiAlcyEgIFRoaXMgaXMgdGhlIG9ubGluZSBoZWxwIHV0aWxpdHkuCisKK0lmIHRoaXMgaXMgeW91ciBmaXJzdCB0aW1lIHVzaW5nIFB5dGhvbiwgeW91IHNob3VsZCBkZWZpbml0ZWx5IGNoZWNrIG91dAordGhlIHR1dG9yaWFsIG9uIHRoZSBJbnRlcm5ldCBhdCBodHRwOi8vZG9jcy5weXRob24ub3JnLyVzL3R1dG9yaWFsLy4KKworRW50ZXIgdGhlIG5hbWUgb2YgYW55IG1vZHVsZSwga2V5d29yZCwgb3IgdG9waWMgdG8gZ2V0IGhlbHAgb24gd3JpdGluZworUHl0aG9uIHByb2dyYW1zIGFuZCB1c2luZyBQeXRob24gbW9kdWxlcy4gIFRvIHF1aXQgdGhpcyBoZWxwIHV0aWxpdHkgYW5kCityZXR1cm4gdG8gdGhlIGludGVycHJldGVyLCBqdXN0IHR5cGUgInF1aXQiLgorCitUbyBnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBtb2R1bGVzLCBrZXl3b3Jkcywgb3IgdG9waWNzLCB0eXBlICJtb2R1bGVzIiwKKyJrZXl3b3JkcyIsIG9yICJ0b3BpY3MiLiAgRWFjaCBtb2R1bGUgYWxzbyBjb21lcyB3aXRoIGEgb25lLWxpbmUgc3VtbWFyeQorb2Ygd2hhdCBpdCBkb2VzOyB0byBsaXN0IHRoZSBtb2R1bGVzIHdob3NlIHN1bW1hcmllcyBjb250YWluIGEgZ2l2ZW4gd29yZAorc3VjaCBhcyAic3BhbSIsIHR5cGUgIm1vZHVsZXMgc3BhbSIuCisnJycgJSB0dXBsZShbc3lzLnZlcnNpb25bOjNdXSoyKSkKKworICAgIGRlZiBsaXN0KHNlbGYsIGl0ZW1zLCBjb2x1bW5zPTQsIHdpZHRoPTgwKToKKyAgICAgICAgaXRlbXMgPSBpdGVtc1s6XQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgY29sdyA9IHdpZHRoIC8gY29sdW1ucworICAgICAgICByb3dzID0gKGxlbihpdGVtcykgKyBjb2x1bW5zIC0gMSkgLyBjb2x1bW5zCisgICAgICAgIGZvciByb3cgaW4gcmFuZ2Uocm93cyk6CisgICAgICAgICAgICBmb3IgY29sIGluIHJhbmdlKGNvbHVtbnMpOgorICAgICAgICAgICAgICAgIGkgPSBjb2wgKiByb3dzICsgcm93CisgICAgICAgICAgICAgICAgaWYgaSA8IGxlbihpdGVtcyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKGl0ZW1zW2ldKQorICAgICAgICAgICAgICAgICAgICBpZiBjb2wgPCBjb2x1bW5zIC0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCcgJyArICcgJyAqIChjb2x3LTEgLSBsZW4oaXRlbXNbaV0pKSkKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCdcbicpCisKKyAgICBkZWYgbGlzdGtleXdvcmRzKHNlbGYpOgorICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK0hlcmUgaXMgYSBsaXN0IG9mIHRoZSBQeXRob24ga2V5d29yZHMuICBFbnRlciBhbnkga2V5d29yZCB0byBnZXQgbW9yZSBoZWxwLgorCisnJycpCisgICAgICAgIHNlbGYubGlzdChzZWxmLmtleXdvcmRzLmtleXMoKSkKKworICAgIGRlZiBsaXN0c3ltYm9scyhzZWxmKToKKyAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJycnCitIZXJlIGlzIGEgbGlzdCBvZiB0aGUgcHVuY3R1YXRpb24gc3ltYm9scyB3aGljaCBQeXRob24gYXNzaWducyBzcGVjaWFsIG1lYW5pbmcKK3RvLiBFbnRlciBhbnkgc3ltYm9sIHRvIGdldCBtb3JlIGhlbHAuCisKKycnJykKKyAgICAgICAgc2VsZi5saXN0KHNlbGYuc3ltYm9scy5rZXlzKCkpCisKKyAgICBkZWYgbGlzdHRvcGljcyhzZWxmKToKKyAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJycnCitIZXJlIGlzIGEgbGlzdCBvZiBhdmFpbGFibGUgdG9waWNzLiAgRW50ZXIgYW55IHRvcGljIG5hbWUgdG8gZ2V0IG1vcmUgaGVscC4KKworJycnKQorICAgICAgICBzZWxmLmxpc3Qoc2VsZi50b3BpY3Mua2V5cygpKQorCisgICAgZGVmIHNob3d0b3BpYyhzZWxmLCB0b3BpYywgbW9yZV94cmVmcz0nJyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBweWRvY19kYXRhLnRvcGljcworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK1NvcnJ5LCB0b3BpYyBhbmQga2V5d29yZCBkb2N1bWVudGF0aW9uIGlzIG5vdCBhdmFpbGFibGUgYmVjYXVzZSB0aGUKK21vZHVsZSAicHlkb2NfZGF0YS50b3BpY3MiIGNvdWxkIG5vdCBiZSBmb3VuZC4KKycnJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0YXJnZXQgPSBzZWxmLnRvcGljcy5nZXQodG9waWMsIHNlbGYua2V5d29yZHMuZ2V0KHRvcGljKSkKKyAgICAgICAgaWYgbm90IHRhcmdldDoKKyAgICAgICAgICAgIHNlbGYub3V0cHV0LndyaXRlKCdubyBkb2N1bWVudGF0aW9uIGZvdW5kIGZvciAlc1xuJyAlIHJlcHIodG9waWMpKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHR5cGUodGFyZ2V0KSBpcyB0eXBlKCcnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnNob3d0b3BpYyh0YXJnZXQsIG1vcmVfeHJlZnMpCisKKyAgICAgICAgbGFiZWwsIHhyZWZzID0gdGFyZ2V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRvYyA9IHB5ZG9jX2RhdGEudG9waWNzLnRvcGljc1tsYWJlbF0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJ25vIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVzXG4nICUgcmVwcih0b3BpYykpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGFnZXIoc3RyaXAoZG9jKSArICdcbicpCisgICAgICAgIGlmIG1vcmVfeHJlZnM6CisgICAgICAgICAgICB4cmVmcyA9ICh4cmVmcyBvciAnJykgKyAnICcgKyBtb3JlX3hyZWZzCisgICAgICAgIGlmIHhyZWZzOgorICAgICAgICAgICAgaW1wb3J0IFN0cmluZ0lPLCBmb3JtYXR0ZXIKKyAgICAgICAgICAgIGJ1ZmZlciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIGZvcm1hdHRlci5EdW1iV3JpdGVyKGJ1ZmZlcikuc2VuZF9mbG93aW5nX2RhdGEoCisgICAgICAgICAgICAgICAgJ1JlbGF0ZWQgaGVscCB0b3BpY3M6ICcgKyBqb2luKHNwbGl0KHhyZWZzKSwgJywgJykgKyAnXG4nKQorICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJ1xuJXNcbicgJSBidWZmZXIuZ2V0dmFsdWUoKSkKKworICAgIGRlZiBzaG93c3ltYm9sKHNlbGYsIHN5bWJvbCk6CisgICAgICAgIHRhcmdldCA9IHNlbGYuc3ltYm9sc1tzeW1ib2xdCisgICAgICAgIHRvcGljLCBfLCB4cmVmcyA9IHRhcmdldC5wYXJ0aXRpb24oJyAnKQorICAgICAgICBzZWxmLnNob3d0b3BpYyh0b3BpYywgeHJlZnMpCisKKyAgICBkZWYgbGlzdG1vZHVsZXMoc2VsZiwga2V5PScnKToKKyAgICAgICAgaWYga2V5OgorICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJycnCitIZXJlIGlzIGEgbGlzdCBvZiBtYXRjaGluZyBtb2R1bGVzLiAgRW50ZXIgYW55IG1vZHVsZSBuYW1lIHRvIGdldCBtb3JlIGhlbHAuCisKKycnJykKKyAgICAgICAgICAgIGFwcm9wb3Moa2V5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vdXRwdXQud3JpdGUoJycnCitQbGVhc2Ugd2FpdCBhIG1vbWVudCB3aGlsZSBJIGdhdGhlciBhIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBtb2R1bGVzLi4uCisKKycnJykKKyAgICAgICAgICAgIG1vZHVsZXMgPSB7fQorICAgICAgICAgICAgZGVmIGNhbGxiYWNrKHBhdGgsIG1vZG5hbWUsIGRlc2MsIG1vZHVsZXM9bW9kdWxlcyk6CisgICAgICAgICAgICAgICAgaWYgbW9kbmFtZSBhbmQgbW9kbmFtZVstOTpdID09ICcuX19pbml0X18nOgorICAgICAgICAgICAgICAgICAgICBtb2RuYW1lID0gbW9kbmFtZVs6LTldICsgJyAocGFja2FnZSknCisgICAgICAgICAgICAgICAgaWYgZmluZChtb2RuYW1lLCAnLicpIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlc1ttb2RuYW1lXSA9IDEKKyAgICAgICAgICAgIGRlZiBvbmVycm9yKG1vZG5hbWUpOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrKE5vbmUsIG1vZG5hbWUsIE5vbmUpCisgICAgICAgICAgICBNb2R1bGVTY2FubmVyKCkucnVuKGNhbGxiYWNrLCBvbmVycm9yPW9uZXJyb3IpCisgICAgICAgICAgICBzZWxmLmxpc3QobW9kdWxlcy5rZXlzKCkpCisgICAgICAgICAgICBzZWxmLm91dHB1dC53cml0ZSgnJycKK0VudGVyIGFueSBtb2R1bGUgbmFtZSB0byBnZXQgbW9yZSBoZWxwLiAgT3IsIHR5cGUgIm1vZHVsZXMgc3BhbSIgdG8gc2VhcmNoCitmb3IgbW9kdWxlcyB3aG9zZSBkZXNjcmlwdGlvbnMgY29udGFpbiB0aGUgd29yZCAic3BhbSIuCisnJycpCisKK2hlbHAgPSBIZWxwZXIoKQorCitjbGFzcyBTY2FubmVyOgorICAgICIiIkEgZ2VuZXJpYyB0cmVlIGl0ZXJhdG9yLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290cywgY2hpbGRyZW4sIGRlc2NlbmRwKToKKyAgICAgICAgc2VsZi5yb290cyA9IHJvb3RzWzpdCisgICAgICAgIHNlbGYuc3RhdGUgPSBbXQorICAgICAgICBzZWxmLmNoaWxkcmVuID0gY2hpbGRyZW4KKyAgICAgICAgc2VsZi5kZXNjZW5kcCA9IGRlc2NlbmRwCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdGU6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5yb290czoKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgcm9vdCA9IHNlbGYucm9vdHMucG9wKDApCisgICAgICAgICAgICBzZWxmLnN0YXRlID0gWyhyb290LCBzZWxmLmNoaWxkcmVuKHJvb3QpKV0KKyAgICAgICAgbm9kZSwgY2hpbGRyZW4gPSBzZWxmLnN0YXRlWy0xXQorICAgICAgICBpZiBub3QgY2hpbGRyZW46CisgICAgICAgICAgICBzZWxmLnN0YXRlLnBvcCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5uZXh0KCkKKyAgICAgICAgY2hpbGQgPSBjaGlsZHJlbi5wb3AoMCkKKyAgICAgICAgaWYgc2VsZi5kZXNjZW5kcChjaGlsZCk6CisgICAgICAgICAgICBzZWxmLnN0YXRlLmFwcGVuZCgoY2hpbGQsIHNlbGYuY2hpbGRyZW4oY2hpbGQpKSkKKyAgICAgICAgcmV0dXJuIGNoaWxkCisKKworY2xhc3MgTW9kdWxlU2Nhbm5lcjoKKyAgICAiIiJBbiBpbnRlcnJ1cHRpYmxlIHNjYW5uZXIgdGhhdCBzZWFyY2hlcyBtb2R1bGUgc3lub3BzZXMuIiIiCisKKyAgICBkZWYgcnVuKHNlbGYsIGNhbGxiYWNrLCBrZXk9Tm9uZSwgY29tcGxldGVyPU5vbmUsIG9uZXJyb3I9Tm9uZSk6CisgICAgICAgIGlmIGtleToga2V5ID0gbG93ZXIoa2V5KQorICAgICAgICBzZWxmLnF1aXQgPSBGYWxzZQorICAgICAgICBzZWVuID0ge30KKworICAgICAgICBmb3IgbW9kbmFtZSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgICAgICBpZiBtb2RuYW1lICE9ICdfX21haW5fXyc6CisgICAgICAgICAgICAgICAgc2Vlblttb2RuYW1lXSA9IDEKKyAgICAgICAgICAgICAgICBpZiBrZXkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soTm9uZSwgbW9kbmFtZSwgJycpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHNwbGl0KF9faW1wb3J0X18obW9kbmFtZSkuX19kb2NfXyBvciAnJywgJ1xuJylbMF0KKyAgICAgICAgICAgICAgICAgICAgaWYgZmluZChsb3dlcihtb2RuYW1lICsgJyAtICcgKyBkZXNjKSwga2V5KSA+PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soTm9uZSwgbW9kbmFtZSwgZGVzYykKKworICAgICAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyhvbmVycm9yPW9uZXJyb3IpOgorICAgICAgICAgICAgaWYgc2VsZi5xdWl0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBrZXkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjYWxsYmFjayhOb25lLCBtb2RuYW1lLCAnJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUobW9kbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGxvYWRlciwnZ2V0X3NvdXJjZScpOgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHNvdXJjZV9zeW5vcHNpcygKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0lPLlN0cmluZ0lPKGxvYWRlci5nZXRfc291cmNlKG1vZG5hbWUpKQorICAgICAgICAgICAgICAgICAgICApIG9yICcnCisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIobG9hZGVyLCdnZXRfZmlsZW5hbWUnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSBsb2FkZXIuZ2V0X2ZpbGVuYW1lKG1vZG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZSA9IGxvYWRlci5sb2FkX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgICAgICAgICBkZXNjID0gKG1vZHVsZS5fX2RvY19fIG9yICcnKS5zcGxpdGxpbmVzKClbMF0KKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGdldGF0dHIobW9kdWxlLCdfX2ZpbGVfXycsTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBmaW5kKGxvd2VyKG1vZG5hbWUgKyAnIC0gJyArIGRlc2MpLCBrZXkpID49IDA6CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHBhdGgsIG1vZG5hbWUsIGRlc2MpCisKKyAgICAgICAgaWYgY29tcGxldGVyOgorICAgICAgICAgICAgY29tcGxldGVyKCkKKworZGVmIGFwcm9wb3Moa2V5KToKKyAgICAiIiJQcmludCBhbGwgdGhlIG9uZS1saW5lIG1vZHVsZSBzdW1tYXJpZXMgdGhhdCBjb250YWluIGEgc3Vic3RyaW5nLiIiIgorICAgIGRlZiBjYWxsYmFjayhwYXRoLCBtb2RuYW1lLCBkZXNjKToKKyAgICAgICAgaWYgbW9kbmFtZVstOTpdID09ICcuX19pbml0X18nOgorICAgICAgICAgICAgbW9kbmFtZSA9IG1vZG5hbWVbOi05XSArICcgKHBhY2thZ2UpJworICAgICAgICBwcmludCBtb2RuYW1lLCBkZXNjIGFuZCAnLSAnICsgZGVzYworICAgIGRlZiBvbmVycm9yKG1vZG5hbWUpOgorICAgICAgICBwYXNzCisgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJykgIyBpZ25vcmUgcHJvYmxlbXMgZHVyaW5nIGltcG9ydAorICAgICAgICBNb2R1bGVTY2FubmVyKCkucnVuKGNhbGxiYWNrLCBrZXksIG9uZXJyb3I9b25lcnJvcikKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gd2ViIGJyb3dzZXIgaW50ZXJmYWNlCisKK2RlZiBzZXJ2ZShwb3J0LCBjYWxsYmFjaz1Ob25lLCBjb21wbGV0ZXI9Tm9uZSk6CisgICAgaW1wb3J0IEJhc2VIVFRQU2VydmVyLCBtaW1ldG9vbHMsIHNlbGVjdAorCisgICAgIyBQYXRjaCB1cCBtaW1ldG9vbHMuTWVzc2FnZSBzbyBpdCBkb2Vzbid0IGJyZWFrIGlmIHJmYzgyMiBpcyByZWxvYWRlZC4KKyAgICBjbGFzcyBNZXNzYWdlKG1pbWV0b29scy5NZXNzYWdlKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBzZWVrYWJsZT0xKToKKyAgICAgICAgICAgIE1lc3NhZ2UgPSBzZWxmLl9fY2xhc3NfXworICAgICAgICAgICAgTWVzc2FnZS5fX2Jhc2VzX19bMF0uX19iYXNlc19fWzBdLl9faW5pdF9fKHNlbGYsIGZwLCBzZWVrYWJsZSkKKyAgICAgICAgICAgIHNlbGYuZW5jb2RpbmdoZWFkZXIgPSBzZWxmLmdldGhlYWRlcignY29udGVudC10cmFuc2Zlci1lbmNvZGluZycpCisgICAgICAgICAgICBzZWxmLnR5cGVoZWFkZXIgPSBzZWxmLmdldGhlYWRlcignY29udGVudC10eXBlJykKKyAgICAgICAgICAgIHNlbGYucGFyc2V0eXBlKCkKKyAgICAgICAgICAgIHNlbGYucGFyc2VwbGlzdCgpCisKKyAgICBjbGFzcyBEb2NIYW5kbGVyKEJhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICBkZWYgc2VuZF9kb2N1bWVudChzZWxmLCB0aXRsZSwgY29udGVudHMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpCisgICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShodG1sLnBhZ2UodGl0bGUsIGNvbnRlbnRzKSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOiBwYXNzCisKKyAgICAgICAgZGVmIGRvX0dFVChzZWxmKToKKyAgICAgICAgICAgIHBhdGggPSBzZWxmLnBhdGgKKyAgICAgICAgICAgIGlmIHBhdGhbLTU6XSA9PSAnLmh0bWwnOiBwYXRoID0gcGF0aFs6LTVdCisgICAgICAgICAgICBpZiBwYXRoWzoxXSA9PSAnLyc6IHBhdGggPSBwYXRoWzE6XQorICAgICAgICAgICAgaWYgcGF0aCBhbmQgcGF0aCAhPSAnLic6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvYmogPSBsb2NhdGUocGF0aCwgZm9yY2Vsb2FkPTEpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVycm9yRHVyaW5nSW1wb3J0LCB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2RvY3VtZW50KHBhdGgsIGh0bWwuZXNjYXBlKHN0cih2YWx1ZSkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpZiBvYmo6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9kb2N1bWVudChkZXNjcmliZShvYmopLCBodG1sLmRvY3VtZW50KG9iaiwgcGF0aCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2RvY3VtZW50KHBhdGgsCisnbm8gUHl0aG9uIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICVzJyAlIHJlcHIocGF0aCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhlYWRpbmcgPSBodG1sLmhlYWRpbmcoCisnPGJpZz48YmlnPjxzdHJvbmc+UHl0aG9uOiBJbmRleCBvZiBNb2R1bGVzPC9zdHJvbmc+PC9iaWc+PC9iaWc+JywKKycjZmZmZmZmJywgJyM3Nzk5ZWUnKQorICAgICAgICAgICAgICAgIGRlZiBibHRpbmxpbmsobmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGEgaHJlZj0iJXMuaHRtbCI+JXM8L2E+JyAlIChuYW1lLCBuYW1lKQorICAgICAgICAgICAgICAgIG5hbWVzID0gZmlsdGVyKGxhbWJkYSB4OiB4ICE9ICdfX21haW5fXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzKQorICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gaHRtbC5tdWx0aWNvbHVtbihuYW1lcywgYmx0aW5saW5rKQorICAgICAgICAgICAgICAgIGluZGljZXMgPSBbJzxwPicgKyBodG1sLmJpZ3NlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICdCdWlsdC1pbiBNb2R1bGVzJywgJyNmZmZmZmYnLCAnI2VlNzdhYScsIGNvbnRlbnRzKV0KKworICAgICAgICAgICAgICAgIHNlZW4gPSB7fQorICAgICAgICAgICAgICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICAgICAgICAgIGluZGljZXMuYXBwZW5kKGh0bWwuaW5kZXgoZGlyLCBzZWVuKSkKKyAgICAgICAgICAgICAgICBjb250ZW50cyA9IGhlYWRpbmcgKyBqb2luKGluZGljZXMpICsgJycnPHAgYWxpZ249cmlnaHQ+Cis8Zm9udCBjb2xvcj0iIzkwOTA5MCIgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+PHN0cm9uZz4KK3B5ZG9jPC9zdHJvbmc+IGJ5IEthLVBpbmcgWWVlICZsdDtwaW5nQGxmdy5vcmcmZ3Q7PC9mb250PicnJworICAgICAgICAgICAgICAgIHNlbGYuc2VuZF9kb2N1bWVudCgnSW5kZXggb2YgTW9kdWxlcycsIGNvbnRlbnRzKQorCisgICAgICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCAqYXJncyk6IHBhc3MKKworICAgIGNsYXNzIERvY1NlcnZlcihCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIGNhbGxiYWNrKToKKyAgICAgICAgICAgIGhvc3QgPSAnbG9jYWxob3N0JworICAgICAgICAgICAgc2VsZi5hZGRyZXNzID0gKGhvc3QsIHBvcnQpCisgICAgICAgICAgICBzZWxmLnVybCA9ICdodHRwOi8vJXM6JWQvJyAlIChob3N0LCBwb3J0KQorICAgICAgICAgICAgc2VsZi5jYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgICAgICBzZWxmLmJhc2UuX19pbml0X18oc2VsZiwgc2VsZi5hZGRyZXNzLCBzZWxmLmhhbmRsZXIpCisKKyAgICAgICAgZGVmIHNlcnZlX3VudGlsX3F1aXQoc2VsZik6CisgICAgICAgICAgICBpbXBvcnQgc2VsZWN0CisgICAgICAgICAgICBzZWxmLnF1aXQgPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVpdDoKKyAgICAgICAgICAgICAgICByZCwgd3IsIGV4ID0gc2VsZWN0LnNlbGVjdChbc2VsZi5zb2NrZXQuZmlsZW5vKCldLCBbXSwgW10sIDEpCisgICAgICAgICAgICAgICAgaWYgcmQ6IHNlbGYuaGFuZGxlX3JlcXVlc3QoKQorCisgICAgICAgIGRlZiBzZXJ2ZXJfYWN0aXZhdGUoc2VsZik6CisgICAgICAgICAgICBzZWxmLmJhc2Uuc2VydmVyX2FjdGl2YXRlKHNlbGYpCisgICAgICAgICAgICBpZiBzZWxmLmNhbGxiYWNrOiBzZWxmLmNhbGxiYWNrKHNlbGYpCisKKyAgICBEb2NTZXJ2ZXIuYmFzZSA9IEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIKKyAgICBEb2NTZXJ2ZXIuaGFuZGxlciA9IERvY0hhbmRsZXIKKyAgICBEb2NIYW5kbGVyLk1lc3NhZ2VDbGFzcyA9IE1lc3NhZ2UKKyAgICB0cnk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIERvY1NlcnZlcihwb3J0LCBjYWxsYmFjaykuc2VydmVfdW50aWxfcXVpdCgpCisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIHNlbGVjdC5lcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgZmluYWxseToKKyAgICAgICAgaWYgY29tcGxldGVyOiBjb21wbGV0ZXIoKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdyYXBoaWNhbCBpbnRlcmZhY2UKKworZGVmIGd1aSgpOgorICAgICIiIkdyYXBoaWNhbCBpbnRlcmZhY2UgKHN0YXJ0cyB3ZWIgc2VydmVyIGFuZCBwb3BzIHVwIGEgY29udHJvbCB3aW5kb3cpLiIiIgorICAgIGNsYXNzIEdVSToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpbmRvdywgcG9ydD03NDY0KToKKyAgICAgICAgICAgIHNlbGYud2luZG93ID0gd2luZG93CisgICAgICAgICAgICBzZWxmLnNlcnZlciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc2Nhbm5lciA9IE5vbmUKKworICAgICAgICAgICAgaW1wb3J0IFRraW50ZXIKKyAgICAgICAgICAgIHNlbGYuc2VydmVyX2ZybSA9IFRraW50ZXIuRnJhbWUod2luZG93KQorICAgICAgICAgICAgc2VsZi50aXRsZV9sYmwgPSBUa2ludGVyLkxhYmVsKHNlbGYuc2VydmVyX2ZybSwKKyAgICAgICAgICAgICAgICB0ZXh0PSdTdGFydGluZyBzZXJ2ZXIuLi5cbiAnKQorICAgICAgICAgICAgc2VsZi5vcGVuX2J0biA9IFRraW50ZXIuQnV0dG9uKHNlbGYuc2VydmVyX2ZybSwKKyAgICAgICAgICAgICAgICB0ZXh0PSdvcGVuIGJyb3dzZXInLCBjb21tYW5kPXNlbGYub3Blbiwgc3RhdGU9J2Rpc2FibGVkJykKKyAgICAgICAgICAgIHNlbGYucXVpdF9idG4gPSBUa2ludGVyLkJ1dHRvbihzZWxmLnNlcnZlcl9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0ncXVpdCBzZXJ2aW5nJywgY29tbWFuZD1zZWxmLnF1aXQsIHN0YXRlPSdkaXNhYmxlZCcpCisKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2ZybSA9IFRraW50ZXIuRnJhbWUod2luZG93KQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfbGJsID0gVGtpbnRlci5MYWJlbChzZWxmLnNlYXJjaF9mcm0sIHRleHQ9J1NlYXJjaCBmb3InKQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfZW50ID0gVGtpbnRlci5FbnRyeShzZWxmLnNlYXJjaF9mcm0pCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9lbnQuYmluZCgnPFJldHVybj4nLCBzZWxmLnNlYXJjaCkKKyAgICAgICAgICAgIHNlbGYuc3RvcF9idG4gPSBUa2ludGVyLkJ1dHRvbihzZWxmLnNlYXJjaF9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0nc3RvcCcsIHBhZHk9MCwgY29tbWFuZD1zZWxmLnN0b3AsIHN0YXRlPSdkaXNhYmxlZCcpCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgICAgICAjIFRyeWluZyB0byBoaWRlIGFuZCBzaG93IHRoaXMgYnV0dG9uIGNyYXNoZXMgdW5kZXIgV2luZG93cy4KKyAgICAgICAgICAgICAgICBzZWxmLnN0b3BfYnRuLnBhY2soc2lkZT0ncmlnaHQnKQorCisgICAgICAgICAgICBzZWxmLndpbmRvdy50aXRsZSgncHlkb2MnKQorICAgICAgICAgICAgc2VsZi53aW5kb3cucHJvdG9jb2woJ1dNX0RFTEVURV9XSU5ET1cnLCBzZWxmLnF1aXQpCisgICAgICAgICAgICBzZWxmLnRpdGxlX2xibC5wYWNrKHNpZGU9J3RvcCcsIGZpbGw9J3gnKQorICAgICAgICAgICAgc2VsZi5vcGVuX2J0bi5wYWNrKHNpZGU9J2xlZnQnLCBmaWxsPSd4JywgZXhwYW5kPTEpCisgICAgICAgICAgICBzZWxmLnF1aXRfYnRuLnBhY2soc2lkZT0ncmlnaHQnLCBmaWxsPSd4JywgZXhwYW5kPTEpCisgICAgICAgICAgICBzZWxmLnNlcnZlcl9mcm0ucGFjayhzaWRlPSd0b3AnLCBmaWxsPSd4JykKKworICAgICAgICAgICAgc2VsZi5zZWFyY2hfbGJsLnBhY2soc2lkZT0nbGVmdCcpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9lbnQucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2ZybS5wYWNrKHNpZGU9J3RvcCcsIGZpbGw9J3gnKQorICAgICAgICAgICAgc2VsZi5zZWFyY2hfZW50LmZvY3VzX3NldCgpCisKKyAgICAgICAgICAgIGZvbnQgPSAoJ2hlbHZldGljYScsIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInIGFuZCA4IG9yIDEwKQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0ID0gVGtpbnRlci5MaXN0Ym94KHdpbmRvdywgZm9udD1mb250LCBoZWlnaHQ9NikKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2xzdC5iaW5kKCc8QnV0dG9uLTE+Jywgc2VsZi5zZWxlY3QpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QuYmluZCgnPERvdWJsZS1CdXR0b24tMT4nLCBzZWxmLmdvdG8pCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9zY3IgPSBUa2ludGVyLlNjcm9sbGJhcih3aW5kb3csCisgICAgICAgICAgICAgICAgb3JpZW50PSd2ZXJ0aWNhbCcsIGNvbW1hbmQ9c2VsZi5yZXN1bHRfbHN0Lnl2aWV3KQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LmNvbmZpZyh5c2Nyb2xsY29tbWFuZD1zZWxmLnJlc3VsdF9zY3Iuc2V0KQorCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9mcm0gPSBUa2ludGVyLkZyYW1lKHdpbmRvdykKKyAgICAgICAgICAgIHNlbGYuZ290b19idG4gPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJlc3VsdF9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0nZ28gdG8gc2VsZWN0ZWQnLCBjb21tYW5kPXNlbGYuZ290bykKKyAgICAgICAgICAgIHNlbGYuaGlkZV9idG4gPSBUa2ludGVyLkJ1dHRvbihzZWxmLnJlc3VsdF9mcm0sCisgICAgICAgICAgICAgICAgdGV4dD0naGlkZSByZXN1bHRzJywgY29tbWFuZD1zZWxmLmhpZGUpCisgICAgICAgICAgICBzZWxmLmdvdG9fYnRuLnBhY2soc2lkZT0nbGVmdCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYuaGlkZV9idG4ucGFjayhzaWRlPSdyaWdodCcsIGZpbGw9J3gnLCBleHBhbmQ9MSkKKworICAgICAgICAgICAgc2VsZi53aW5kb3cudXBkYXRlKCkKKyAgICAgICAgICAgIHNlbGYubWlud2lkdGggPSBzZWxmLndpbmRvdy53aW5mb193aWR0aCgpCisgICAgICAgICAgICBzZWxmLm1pbmhlaWdodCA9IHNlbGYud2luZG93LndpbmZvX2hlaWdodCgpCisgICAgICAgICAgICBzZWxmLmJpZ21pbmhlaWdodCA9IChzZWxmLnNlcnZlcl9mcm0ud2luZm9fcmVxaGVpZ2h0KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWFyY2hfZnJtLndpbmZvX3JlcWhlaWdodCgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0X2xzdC53aW5mb19yZXFoZWlnaHQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlc3VsdF9mcm0ud2luZm9fcmVxaGVpZ2h0KCkpCisgICAgICAgICAgICBzZWxmLmJpZ3dpZHRoLCBzZWxmLmJpZ2hlaWdodCA9IHNlbGYubWlud2lkdGgsIHNlbGYuYmlnbWluaGVpZ2h0CisgICAgICAgICAgICBzZWxmLmV4cGFuZGVkID0gMAorICAgICAgICAgICAgc2VsZi53aW5kb3cud21fZ2VvbWV0cnkoJyVkeCVkJyAlIChzZWxmLm1pbndpZHRoLCBzZWxmLm1pbmhlaWdodCkpCisgICAgICAgICAgICBzZWxmLndpbmRvdy53bV9taW5zaXplKHNlbGYubWlud2lkdGgsIHNlbGYubWluaGVpZ2h0KQorICAgICAgICAgICAgc2VsZi53aW5kb3cudGsud2lsbGRpc3BhdGNoKCkKKworICAgICAgICAgICAgaW1wb3J0IHRocmVhZGluZworICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZCgKKyAgICAgICAgICAgICAgICB0YXJnZXQ9c2VydmUsIGFyZ3M9KHBvcnQsIHNlbGYucmVhZHksIHNlbGYucXVpdCkpLnN0YXJ0KCkKKworICAgICAgICBkZWYgcmVhZHkoc2VsZiwgc2VydmVyKToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyID0gc2VydmVyCisgICAgICAgICAgICBzZWxmLnRpdGxlX2xibC5jb25maWcoCisgICAgICAgICAgICAgICAgdGV4dD0nUHl0aG9uIGRvY3VtZW50YXRpb24gc2VydmVyIGF0XG4nICsgc2VydmVyLnVybCkKKyAgICAgICAgICAgIHNlbGYub3Blbl9idG4uY29uZmlnKHN0YXRlPSdub3JtYWwnKQorICAgICAgICAgICAgc2VsZi5xdWl0X2J0bi5jb25maWcoc3RhdGU9J25vcm1hbCcpCisKKyAgICAgICAgZGVmIG9wZW4oc2VsZiwgZXZlbnQ9Tm9uZSwgdXJsPU5vbmUpOgorICAgICAgICAgICAgdXJsID0gdXJsIG9yIHNlbGYuc2VydmVyLnVybAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgICAgICAgICAgd2ViYnJvd3Nlci5vcGVuKHVybCkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjogIyBwcmUtd2ViYnJvd3Nlci5weSBjb21wYXRpYmlsaXR5CisgICAgICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICAgICAgICAgIG9zLnN5c3RlbSgnc3RhcnQgIiVzIicgJSB1cmwpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmMgPSBvcy5zeXN0ZW0oJ25ldHNjYXBlIC1yZW1vdGUgIm9wZW5VUkwoJXMpIiAmJyAlIHVybCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmM6IG9zLnN5c3RlbSgnbmV0c2NhcGUgIiVzIiAmJyAlIHVybCkKKworICAgICAgICBkZWYgcXVpdChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyOgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnF1aXQgPSAxCisgICAgICAgICAgICBzZWxmLndpbmRvdy5xdWl0KCkKKworICAgICAgICBkZWYgc2VhcmNoKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAga2V5ID0gc2VsZi5zZWFyY2hfZW50LmdldCgpCisgICAgICAgICAgICBzZWxmLnN0b3BfYnRuLnBhY2soc2lkZT0ncmlnaHQnKQorICAgICAgICAgICAgc2VsZi5zdG9wX2J0bi5jb25maWcoc3RhdGU9J25vcm1hbCcpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9sYmwuY29uZmlnKHRleHQ9J1NlYXJjaGluZyBmb3IgIiVzIi4uLicgJSBrZXkpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9lbnQuZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2xibC5wYWNrKHNpZGU9J2xlZnQnKQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0LmRlbGV0ZSgwLCAnZW5kJykKKyAgICAgICAgICAgIHNlbGYuZ290b19idG4uY29uZmlnKHN0YXRlPSdkaXNhYmxlZCcpCisgICAgICAgICAgICBzZWxmLmV4cGFuZCgpCisKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICAgICAgICAgIGlmIHNlbGYuc2Nhbm5lcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNjYW5uZXIucXVpdCA9IDEKKyAgICAgICAgICAgIHNlbGYuc2Nhbm5lciA9IE1vZHVsZVNjYW5uZXIoKQorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zY2FubmVyLnJ1biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oc2VsZi51cGRhdGUsIGtleSwgc2VsZi5kb25lKSkuc3RhcnQoKQorCisgICAgICAgIGRlZiB1cGRhdGUoc2VsZiwgcGF0aCwgbW9kbmFtZSwgZGVzYyk6CisgICAgICAgICAgICBpZiBtb2RuYW1lWy05Ol0gPT0gJy5fX2luaXRfXyc6CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IG1vZG5hbWVbOi05XSArICcgKHBhY2thZ2UpJworICAgICAgICAgICAgc2VsZi5yZXN1bHRfbHN0Lmluc2VydCgnZW5kJywKKyAgICAgICAgICAgICAgICBtb2RuYW1lICsgJyAtICcgKyAoZGVzYyBvciAnKG5vIGRlc2NyaXB0aW9uKScpKQorCisgICAgICAgIGRlZiBzdG9wKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAgaWYgc2VsZi5zY2FubmVyOgorICAgICAgICAgICAgICAgIHNlbGYuc2Nhbm5lci5xdWl0ID0gMQorICAgICAgICAgICAgICAgIHNlbGYuc2Nhbm5lciA9IE5vbmUKKworICAgICAgICBkZWYgZG9uZShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc2Nhbm5lciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2xibC5jb25maWcodGV4dD0nU2VhcmNoIGZvcicpCisgICAgICAgICAgICBzZWxmLnNlYXJjaF9sYmwucGFjayhzaWRlPSdsZWZ0JykKKyAgICAgICAgICAgIHNlbGYuc2VhcmNoX2VudC5wYWNrKHNpZGU9J3JpZ2h0JywgZmlsbD0neCcsIGV4cGFuZD0xKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICd3aW4zMic6IHNlbGYuc3RvcF9idG4uZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYuc3RvcF9idG4uY29uZmlnKHN0YXRlPSdkaXNhYmxlZCcpCisKKyAgICAgICAgZGVmIHNlbGVjdChzZWxmLCBldmVudD1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuZ290b19idG4uY29uZmlnKHN0YXRlPSdub3JtYWwnKQorCisgICAgICAgIGRlZiBnb3RvKHNlbGYsIGV2ZW50PU5vbmUpOgorICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZi5yZXN1bHRfbHN0LmN1cnNlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBzZWxlY3Rpb246CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IHNwbGl0KHNlbGYucmVzdWx0X2xzdC5nZXQoc2VsZWN0aW9uWzBdKSlbMF0KKyAgICAgICAgICAgICAgICBzZWxmLm9wZW4odXJsPXNlbGYuc2VydmVyLnVybCArIG1vZG5hbWUgKyAnLmh0bWwnKQorCisgICAgICAgIGRlZiBjb2xsYXBzZShzZWxmKToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmV4cGFuZGVkOiByZXR1cm4KKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2ZybS5mb3JnZXQoKQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfc2NyLmZvcmdldCgpCisgICAgICAgICAgICBzZWxmLnJlc3VsdF9sc3QuZm9yZ2V0KCkKKyAgICAgICAgICAgIHNlbGYuYmlnd2lkdGggPSBzZWxmLndpbmRvdy53aW5mb193aWR0aCgpCisgICAgICAgICAgICBzZWxmLmJpZ2hlaWdodCA9IHNlbGYud2luZG93LndpbmZvX2hlaWdodCgpCisgICAgICAgICAgICBzZWxmLndpbmRvdy53bV9nZW9tZXRyeSgnJWR4JWQnICUgKHNlbGYubWlud2lkdGgsIHNlbGYubWluaGVpZ2h0KSkKKyAgICAgICAgICAgIHNlbGYud2luZG93LndtX21pbnNpemUoc2VsZi5taW53aWR0aCwgc2VsZi5taW5oZWlnaHQpCisgICAgICAgICAgICBzZWxmLmV4cGFuZGVkID0gMAorCisgICAgICAgIGRlZiBleHBhbmQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmV4cGFuZGVkOiByZXR1cm4KKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2ZybS5wYWNrKHNpZGU9J2JvdHRvbScsIGZpbGw9J3gnKQorICAgICAgICAgICAgc2VsZi5yZXN1bHRfc2NyLnBhY2soc2lkZT0ncmlnaHQnLCBmaWxsPSd5JykKKyAgICAgICAgICAgIHNlbGYucmVzdWx0X2xzdC5wYWNrKHNpZGU9J3RvcCcsIGZpbGw9J2JvdGgnLCBleHBhbmQ9MSkKKyAgICAgICAgICAgIHNlbGYud2luZG93LndtX2dlb21ldHJ5KCclZHglZCcgJSAoc2VsZi5iaWd3aWR0aCwgc2VsZi5iaWdoZWlnaHQpKQorICAgICAgICAgICAgc2VsZi53aW5kb3cud21fbWluc2l6ZShzZWxmLm1pbndpZHRoLCBzZWxmLmJpZ21pbmhlaWdodCkKKyAgICAgICAgICAgIHNlbGYuZXhwYW5kZWQgPSAxCisKKyAgICAgICAgZGVmIGhpZGUoc2VsZiwgZXZlbnQ9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLnN0b3AoKQorICAgICAgICAgICAgc2VsZi5jb2xsYXBzZSgpCisKKyAgICBpbXBvcnQgVGtpbnRlcgorICAgIHRyeToKKyAgICAgICAgcm9vdCA9IFRraW50ZXIuVGsoKQorICAgICAgICAjIFRrIHdpbGwgY3Jhc2ggaWYgcHl0aG9udy5leGUgaGFzIGFuIFhQIC5tYW5pZmVzdAorICAgICAgICAjIGZpbGUgYW5kIHRoZSByb290IGhhcyBpcyBub3QgZGVzdHJveWVkIGV4cGxpY2l0bHkuCisgICAgICAgICMgSWYgdGhlIHByb2JsZW0gaXMgZXZlciBmaXhlZCBpbiBUaywgdGhlIGV4cGxpY2l0CisgICAgICAgICMgZGVzdHJveSBjYW4gZ28uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGd1aSA9IEdVSShyb290KQorICAgICAgICAgICAgcm9vdC5tYWlubG9vcCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByb290LmRlc3Ryb3koKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcGFzcworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UKKworZGVmIGlzcGF0aCh4KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBzdHIpIGFuZCBmaW5kKHgsIG9zLnNlcCkgPj0gMAorCitkZWYgY2xpKCk6CisgICAgIiIiQ29tbWFuZC1saW5lIGludGVyZmFjZSAobG9va3MgYXQgc3lzLmFyZ3YgdG8gZGVjaWRlIHdoYXQgdG8gZG8pLiIiIgorICAgIGltcG9ydCBnZXRvcHQKKyAgICBjbGFzcyBCYWRVc2FnZTogcGFzcworCisgICAgIyBTY3JpcHRzIGRvbid0IGdldCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaW4gdGhlaXIgcGF0aCBieSBkZWZhdWx0CisgICAgIyB1bmxlc3MgdGhleSBhcmUgcnVuIHdpdGggdGhlICctbScgc3dpdGNoCisgICAgaWYgJycgbm90IGluIHN5cy5wYXRoOgorICAgICAgICBzY3JpcHRkaXIgPSBvcy5wYXRoLmRpcm5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgIGlmIHNjcmlwdGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgIHN5cy5wYXRoLnJlbW92ZShzY3JpcHRkaXIpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCAnLicpCisKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgJ2drOnA6dycpCisgICAgICAgIHdyaXRpbmcgPSAwCisKKyAgICAgICAgZm9yIG9wdCwgdmFsIGluIG9wdHM6CisgICAgICAgICAgICBpZiBvcHQgPT0gJy1nJzoKKyAgICAgICAgICAgICAgICBndWkoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgb3B0ID09ICctayc6CisgICAgICAgICAgICAgICAgYXByb3Bvcyh2YWwpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBvcHQgPT0gJy1wJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHBvcnQgPSBpbnQodmFsKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRVc2FnZQorICAgICAgICAgICAgICAgIGRlZiByZWFkeShzZXJ2ZXIpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAncHlkb2Mgc2VydmVyIHJlYWR5IGF0ICVzJyAlIHNlcnZlci51cmwKKyAgICAgICAgICAgICAgICBkZWYgc3RvcHBlZCgpOgorICAgICAgICAgICAgICAgICAgICBwcmludCAncHlkb2Mgc2VydmVyIHN0b3BwZWQnCisgICAgICAgICAgICAgICAgc2VydmUocG9ydCwgcmVhZHksIHN0b3BwZWQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBvcHQgPT0gJy13JzoKKyAgICAgICAgICAgICAgICB3cml0aW5nID0gMQorCisgICAgICAgIGlmIG5vdCBhcmdzOiByYWlzZSBCYWRVc2FnZQorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBpZiBpc3BhdGgoYXJnKSBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGFyZyk6CisgICAgICAgICAgICAgICAgcHJpbnQgJ2ZpbGUgJXIgZG9lcyBub3QgZXhpc3QnICUgYXJnCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBpc3BhdGgoYXJnKSBhbmQgb3MucGF0aC5pc2ZpbGUoYXJnKToKKyAgICAgICAgICAgICAgICAgICAgYXJnID0gaW1wb3J0ZmlsZShhcmcpCisgICAgICAgICAgICAgICAgaWYgd3JpdGluZzoKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNwYXRoKGFyZykgYW5kIG9zLnBhdGguaXNkaXIoYXJnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlZG9jcyhhcmcpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZWRvYyhhcmcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaGVscC5oZWxwKGFyZykKKyAgICAgICAgICAgIGV4Y2VwdCBFcnJvckR1cmluZ0ltcG9ydCwgdmFsdWU6CisgICAgICAgICAgICAgICAgcHJpbnQgdmFsdWUKKworICAgIGV4Y2VwdCAoZ2V0b3B0LmVycm9yLCBCYWRVc2FnZSk6CisgICAgICAgIGNtZCA9IG9zLnBhdGguYmFzZW5hbWUoc3lzLmFyZ3ZbMF0pCisgICAgICAgIHByaW50ICIiInB5ZG9jIC0gdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uIHRvb2wKKworJXMgPG5hbWU+IC4uLgorICAgIFNob3cgdGV4dCBkb2N1bWVudGF0aW9uIG9uIHNvbWV0aGluZy4gIDxuYW1lPiBtYXkgYmUgdGhlIG5hbWUgb2YgYQorICAgIFB5dGhvbiBrZXl3b3JkLCB0b3BpYywgZnVuY3Rpb24sIG1vZHVsZSwgb3IgcGFja2FnZSwgb3IgYSBkb3R0ZWQKKyAgICByZWZlcmVuY2UgdG8gYSBjbGFzcyBvciBmdW5jdGlvbiB3aXRoaW4gYSBtb2R1bGUgb3IgbW9kdWxlIGluIGEKKyAgICBwYWNrYWdlLiAgSWYgPG5hbWU+IGNvbnRhaW5zIGEgJyVzJywgaXQgaXMgdXNlZCBhcyB0aGUgcGF0aCB0byBhCisgICAgUHl0aG9uIHNvdXJjZSBmaWxlIHRvIGRvY3VtZW50LiBJZiBuYW1lIGlzICdrZXl3b3JkcycsICd0b3BpY3MnLAorICAgIG9yICdtb2R1bGVzJywgYSBsaXN0aW5nIG9mIHRoZXNlIHRoaW5ncyBpcyBkaXNwbGF5ZWQuCisKKyVzIC1rIDxrZXl3b3JkPgorICAgIFNlYXJjaCBmb3IgYSBrZXl3b3JkIGluIHRoZSBzeW5vcHNpcyBsaW5lcyBvZiBhbGwgYXZhaWxhYmxlIG1vZHVsZXMuCisKKyVzIC1wIDxwb3J0PgorICAgIFN0YXJ0IGFuIEhUVFAgc2VydmVyIG9uIHRoZSBnaXZlbiBwb3J0IG9uIHRoZSBsb2NhbCBtYWNoaW5lLgorCislcyAtZworICAgIFBvcCB1cCBhIGdyYXBoaWNhbCBpbnRlcmZhY2UgZm9yIGZpbmRpbmcgYW5kIHNlcnZpbmcgZG9jdW1lbnRhdGlvbi4KKworJXMgLXcgPG5hbWU+IC4uLgorICAgIFdyaXRlIG91dCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uIGZvciBhIG1vZHVsZSB0byBhIGZpbGUgaW4gdGhlIGN1cnJlbnQKKyAgICBkaXJlY3RvcnkuICBJZiA8bmFtZT4gY29udGFpbnMgYSAnJXMnLCBpdCBpcyB0cmVhdGVkIGFzIGEgZmlsZW5hbWU7IGlmCisgICAgaXQgbmFtZXMgYSBkaXJlY3RvcnksIGRvY3VtZW50YXRpb24gaXMgd3JpdHRlbiBmb3IgYWxsIHRoZSBjb250ZW50cy4KKyIiIiAlIChjbWQsIG9zLnNlcCwgY21kLCBjbWQsIGNtZCwgY21kLCBvcy5zZXApCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6IGNsaSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jLnB5YyBiL2xpYi9weXRob24yLjcvcHlkb2MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYmQwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5ZG9jLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jLnB5byBiL2xpYi9weXRob24yLjcvcHlkb2MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTc4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5ZG9jLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkNGNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkNGNmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9weWRvY19kYXRhL3RvcGljcy5weSBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxYzE1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHkKQEAgLTAsMCArMSw3NyBAQAorIyBBdXRvZ2VuZXJhdGVkIGJ5IFNwaGlueCBvbiBTYXQgTWF5IDExIDIyOjMxOjEzIDIwMTMKK3RvcGljcyA9IHsnYXNzZXJ0JzogJ1xuVGhlIGBgYXNzZXJ0YGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuQXNzZXJ0IHN0YXRlbWVudHMgYXJlIGEgY29udmVuaWVudCB3YXkgdG8gaW5zZXJ0IGRlYnVnZ2luZyBhc3NlcnRpb25zXG5pbnRvIGEgcHJvZ3JhbTpcblxuICAgYXNzZXJ0X3N0bXQgOjo9ICJhc3NlcnQiIGV4cHJlc3Npb24gWyIsIiBleHByZXNzaW9uXVxuXG5UaGUgc2ltcGxlIGZvcm0sIGBgYXNzZXJ0IGV4cHJlc3Npb25gYCwgaXMgZXF1aXZhbGVudCB0b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICBpZiBub3QgZXhwcmVzc2lvbjogcmFpc2UgQXNzZXJ0aW9uRXJyb3JcblxuVGhlIGV4dGVuZGVkIGZvcm0sIGBgYXNzZXJ0IGV4cHJlc3Npb24xLCBleHByZXNzaW9uMmBgLCBpcyBlcXVpdmFsZW50XG50b1xuXG4gICBpZiBfX2RlYnVnX186XG4gICAgICBpZiBub3QgZXhwcmVzc2lvbjE6IHJhaXNlIEFzc2VydGlvbkVycm9yKGV4cHJlc3Npb24yKVxuXG5UaGVzZSBlcXVpdmFsZW5jZXMgYXNzdW1lIHRoYXQgYGBfX2RlYnVnX19gYCBhbmQgYGBBc3NlcnRpb25FcnJvcmBgXG5yZWZlciB0byB0aGUgYnVpbHQtaW4gdmFyaWFibGVzIHdpdGggdGhvc2UgbmFtZXMuICBJbiB0aGUgY3VycmVudFxuaW1wbGVtZW50YXRpb24sIHRoZSBidWlsdC1pbiB2YXJpYWJsZSBgYF9fZGVidWdfX2BgIGlzIGBgVHJ1ZWBgIHVuZGVyXG5ub3JtYWwgY2lyY3Vtc3RhbmNlcywgYGBGYWxzZWBgIHdoZW4gb3B0aW1pemF0aW9uIGlzIHJlcXVlc3RlZFxuKGNvbW1hbmQgbGluZSBvcHRpb24gLU8pLiAgVGhlIGN1cnJlbnQgY29kZSBnZW5lcmF0b3IgZW1pdHMgbm8gY29kZVxuZm9yIGFuIGFzc2VydCBzdGF0ZW1lbnQgd2hlbiBvcHRpbWl6YXRpb24gaXMgcmVxdWVzdGVkIGF0IGNvbXBpbGVcbnRpbWUuICBOb3RlIHRoYXQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgZm9yIHRoZVxuZXhwcmVzc2lvbiB0aGF0IGZhaWxlZCBpbiB0aGUgZXJyb3IgbWVzc2FnZTsgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXNcbnBhcnQgb2YgdGhlIHN0YWNrIHRyYWNlLlxuXG5Bc3NpZ25tZW50cyB0byBgYF9fZGVidWdfX2BgIGFyZSBpbGxlZ2FsLiAgVGhlIHZhbHVlIGZvciB0aGUgYnVpbHQtaW5cbnZhcmlhYmxlIGlzIGRldGVybWluZWQgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgc3RhcnRzLlxuJywKKyAnYXNzaWdubWVudCc6ICdcbkFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqXG5cbkFzc2lnbm1lbnQgc3RhdGVtZW50cyBhcmUgdXNlZCB0byAocmUpYmluZCBuYW1lcyB0byB2YWx1ZXMgYW5kIHRvXG5tb2RpZnkgYXR0cmlidXRlcyBvciBpdGVtcyBvZiBtdXRhYmxlIG9iamVjdHM6XG5cbiAgIGFzc2lnbm1lbnRfc3RtdCA6Oj0gKHRhcmdldF9saXN0ICI9IikrIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgdGFyZ2V0X2xpc3QgICAgIDo6PSB0YXJnZXQgKCIsIiB0YXJnZXQpKiBbIiwiXVxuICAgdGFyZ2V0ICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG4gICAgICAgICAgICAgIHwgIigiIHRhcmdldF9saXN0ICIpIlxuICAgICAgICAgICAgICB8ICJbIiB0YXJnZXRfbGlzdCAiXSJcbiAgICAgICAgICAgICAgfCBhdHRyaWJ1dGVyZWZcbiAgICAgICAgICAgICAgfCBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgfCBzbGljaW5nXG5cbihTZWUgc2VjdGlvbiAqUHJpbWFyaWVzKiBmb3IgdGhlIHN5bnRheCBkZWZpbml0aW9ucyBmb3IgdGhlIGxhc3QgdGhyZWVcbnN5bWJvbHMuKVxuXG5BbiBhc3NpZ25tZW50IHN0YXRlbWVudCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24gbGlzdCAocmVtZW1iZXIgdGhhdFxudGhpcyBjYW4gYmUgYSBzaW5nbGUgZXhwcmVzc2lvbiBvciBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCB0aGUgbGF0dGVyXG55aWVsZGluZyBhIHR1cGxlKSBhbmQgYXNzaWducyB0aGUgc2luZ2xlIHJlc3VsdGluZyBvYmplY3QgdG8gZWFjaCBvZlxudGhlIHRhcmdldCBsaXN0cywgZnJvbSBsZWZ0IHRvIHJpZ2h0LlxuXG5Bc3NpZ25tZW50IGlzIGRlZmluZWQgcmVjdXJzaXZlbHkgZGVwZW5kaW5nIG9uIHRoZSBmb3JtIG9mIHRoZSB0YXJnZXRcbihsaXN0KS4gV2hlbiBhIHRhcmdldCBpcyBwYXJ0IG9mIGEgbXV0YWJsZSBvYmplY3QgKGFuIGF0dHJpYnV0ZVxucmVmZXJlbmNlLCBzdWJzY3JpcHRpb24gb3Igc2xpY2luZyksIHRoZSBtdXRhYmxlIG9iamVjdCBtdXN0XG51bHRpbWF0ZWx5IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQgYW5kIGRlY2lkZSBhYm91dCBpdHMgdmFsaWRpdHksIGFuZFxubWF5IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgYXNzaWdubWVudCBpcyB1bmFjY2VwdGFibGUuICBUaGUgcnVsZXNcbm9ic2VydmVkIGJ5IHZhcmlvdXMgdHlwZXMgYW5kIHRoZSBleGNlcHRpb25zIHJhaXNlZCBhcmUgZ2l2ZW4gd2l0aCB0aGVcbmRlZmluaXRpb24gb2YgdGhlIG9iamVjdCB0eXBlcyAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlXG5oaWVyYXJjaHkqKS5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSB0YXJnZXQgbGlzdCBpcyByZWN1cnNpdmVseSBkZWZpbmVkIGFzXG5mb2xsb3dzLlxuXG4qIElmIHRoZSB0YXJnZXQgbGlzdCBpcyBhIHNpbmdsZSB0YXJnZXQ6IFRoZSBvYmplY3QgaXMgYXNzaWduZWQgdG9cbiAgdGhhdCB0YXJnZXQuXG5cbiogSWYgdGhlIHRhcmdldCBsaXN0IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFyZ2V0czogVGhlIG9iamVjdFxuICBtdXN0IGJlIGFuIGl0ZXJhYmxlIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zIGFzIHRoZXJlIGFyZVxuICB0YXJnZXRzIGluIHRoZSB0YXJnZXQgbGlzdCwgYW5kIHRoZSBpdGVtcyBhcmUgYXNzaWduZWQsIGZyb20gbGVmdCB0b1xuICByaWdodCwgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFyZ2V0cy5cblxuQXNzaWdubWVudCBvZiBhbiBvYmplY3QgdG8gYSBzaW5nbGUgdGFyZ2V0IGlzIHJlY3Vyc2l2ZWx5IGRlZmluZWQgYXNcbmZvbGxvd3MuXG5cbiogSWYgdGhlIHRhcmdldCBpcyBhbiBpZGVudGlmaWVyIChuYW1lKTpcblxuICAqIElmIHRoZSBuYW1lIGRvZXMgbm90IG9jY3VyIGluIGEgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgaW4gdGhlXG4gICAgY3VycmVudCBjb2RlIGJsb2NrOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50XG4gICAgbG9jYWwgbmFtZXNwYWNlLlxuXG4gICogT3RoZXJ3aXNlOiB0aGUgbmFtZSBpcyBib3VuZCB0byB0aGUgb2JqZWN0IGluIHRoZSBjdXJyZW50IGdsb2JhbFxuICAgIG5hbWVzcGFjZS5cblxuICBUaGUgbmFtZSBpcyByZWJvdW5kIGlmIGl0IHdhcyBhbHJlYWR5IGJvdW5kLiAgVGhpcyBtYXkgY2F1c2UgdGhlXG4gIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIG9iamVjdCBwcmV2aW91c2x5IGJvdW5kIHRvIHRoZSBuYW1lIHRvIHJlYWNoXG4gIHplcm8sIGNhdXNpbmcgdGhlIG9iamVjdCB0byBiZSBkZWFsbG9jYXRlZCBhbmQgaXRzIGRlc3RydWN0b3IgKGlmIGl0XG4gIGhhcyBvbmUpIHRvIGJlIGNhbGxlZC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgdGFyZ2V0IGxpc3QgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMgb3IgaW4gc3F1YXJlXG4gIGJyYWNrZXRzOiBUaGUgb2JqZWN0IG11c3QgYmUgYW4gaXRlcmFibGUgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2ZcbiAgaXRlbXMgYXMgdGhlcmUgYXJlIHRhcmdldHMgaW4gdGhlIHRhcmdldCBsaXN0LCBhbmQgaXRzIGl0ZW1zIGFyZVxuICBhc3NpZ25lZCwgZnJvbSBsZWZ0IHRvIHJpZ2h0LCB0byB0aGUgY29ycmVzcG9uZGluZyB0YXJnZXRzLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYW4gYXR0cmlidXRlIHJlZmVyZW5jZTogVGhlIHByaW1hcnkgZXhwcmVzc2lvbiBpblxuICB0aGUgcmVmZXJlbmNlIGlzIGV2YWx1YXRlZC4gIEl0IHNob3VsZCB5aWVsZCBhbiBvYmplY3Qgd2l0aFxuICBhc3NpZ25hYmxlIGF0dHJpYnV0ZXM7IGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBgYFR5cGVFcnJvcmBgIGlzXG4gIHJhaXNlZC4gIFRoYXQgb2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gYXNzaWduIHRoZSBhc3NpZ25lZCBvYmplY3QgdG9cbiAgdGhlIGdpdmVuIGF0dHJpYnV0ZTsgaWYgaXQgY2Fubm90IHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQsIGl0IHJhaXNlc1xuICBhbiBleGNlcHRpb24gKHVzdWFsbHkgYnV0IG5vdCBuZWNlc3NhcmlseSBgYEF0dHJpYnV0ZUVycm9yYGApLlxuXG4gIE5vdGU6IElmIHRoZSBvYmplY3QgaXMgYSBjbGFzcyBpbnN0YW5jZSBhbmQgdGhlIGF0dHJpYnV0ZSByZWZlcmVuY2VcbiAgb2NjdXJzIG9uIGJvdGggc2lkZXMgb2YgdGhlIGFzc2lnbm1lbnQgb3BlcmF0b3IsIHRoZSBSSFMgZXhwcmVzc2lvbixcbiAgYGBhLnhgYCBjYW4gYWNjZXNzIGVpdGhlciBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgb3IgKGlmIG5vIGluc3RhbmNlXG4gIGF0dHJpYnV0ZSBleGlzdHMpIGEgY2xhc3MgYXR0cmlidXRlLiAgVGhlIExIUyB0YXJnZXQgYGBhLnhgYCBpc1xuICBhbHdheXMgc2V0IGFzIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LlxuICBUaHVzLCB0aGUgdHdvIG9jY3VycmVuY2VzIG9mIGBgYS54YGAgZG8gbm90IG5lY2Vzc2FyaWx5IHJlZmVyIHRvIHRoZVxuICBzYW1lIGF0dHJpYnV0ZTogaWYgdGhlIFJIUyBleHByZXNzaW9uIHJlZmVycyB0byBhIGNsYXNzIGF0dHJpYnV0ZSxcbiAgdGhlIExIUyBjcmVhdGVzIGEgbmV3IGluc3RhbmNlIGF0dHJpYnV0ZSBhcyB0aGUgdGFyZ2V0IG9mIHRoZVxuICBhc3NpZ25tZW50OlxuXG4gICAgIGNsYXNzIENsczpcbiAgICAgICAgIHggPSAzICAgICAgICAgICAgICMgY2xhc3MgdmFyaWFibGVcbiAgICAgaW5zdCA9IENscygpXG4gICAgIGluc3QueCA9IGluc3QueCArIDEgICAjIHdyaXRlcyBpbnN0LnggYXMgNCBsZWF2aW5nIENscy54IGFzIDNcblxuICBUaGlzIGRlc2NyaXB0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFwcGx5IHRvIGRlc2NyaXB0b3JcbiAgYXR0cmlidXRlcywgc3VjaCBhcyBwcm9wZXJ0aWVzIGNyZWF0ZWQgd2l0aCBgYHByb3BlcnR5KClgYC5cblxuKiBJZiB0aGUgdGFyZ2V0IGlzIGEgc3Vic2NyaXB0aW9uOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZVxuICByZWZlcmVuY2UgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGVpdGhlciBhIG11dGFibGUgc2VxdWVuY2VcbiAgb2JqZWN0IChzdWNoIGFzIGEgbGlzdCkgb3IgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLlxuICBOZXh0LCB0aGUgc3Vic2NyaXB0IGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLlxuXG4gIElmIHRoZSBwcmltYXJ5IGlzIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYSBsaXN0KSwgdGhlXG4gIHN1YnNjcmlwdCBtdXN0IHlpZWxkIGEgcGxhaW4gaW50ZWdlci4gIElmIGl0IGlzIG5lZ2F0aXZlLCB0aGVcbiAgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYVxuICBub25uZWdhdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoLCBhbmQgdGhlXG4gIHNlcXVlbmNlIGlzIGFza2VkIHRvIGFzc2lnbiB0aGUgYXNzaWduZWQgb2JqZWN0IHRvIGl0cyBpdGVtIHdpdGhcbiAgdGhhdCBpbmRleC4gIElmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UsIGBgSW5kZXhFcnJvcmBgIGlzIHJhaXNlZFxuICAoYXNzaWdubWVudCB0byBhIHN1YnNjcmlwdGVkIHNlcXVlbmNlIGNhbm5vdCBhZGQgbmV3IGl0ZW1zIHRvIGFcbiAgbGlzdCkuXG5cbiAgSWYgdGhlIHByaW1hcnkgaXMgYSBtYXBwaW5nIG9iamVjdCAoc3VjaCBhcyBhIGRpY3Rpb25hcnkpLCB0aGVcbiAgc3Vic2NyaXB0IG11c3QgaGF2ZSBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBtYXBwaW5nXCdzIGtleSB0eXBlLFxuICBhbmQgdGhlIG1hcHBpbmcgaXMgdGhlbiBhc2tlZCB0byBjcmVhdGUgYSBrZXkvZGF0dW0gcGFpciB3aGljaCBtYXBzXG4gIHRoZSBzdWJzY3JpcHQgdG8gdGhlIGFzc2lnbmVkIG9iamVjdC4gIFRoaXMgY2FuIGVpdGhlciByZXBsYWNlIGFuXG4gIGV4aXN0aW5nIGtleS92YWx1ZSBwYWlyIHdpdGggdGhlIHNhbWUga2V5IHZhbHVlLCBvciBpbnNlcnQgYSBuZXdcbiAga2V5L3ZhbHVlIHBhaXIgKGlmIG5vIGtleSB3aXRoIHRoZSBzYW1lIHZhbHVlIGV4aXN0ZWQpLlxuXG4qIElmIHRoZSB0YXJnZXQgaXMgYSBzbGljaW5nOiBUaGUgcHJpbWFyeSBleHByZXNzaW9uIGluIHRoZSByZWZlcmVuY2VcbiAgaXMgZXZhbHVhdGVkLiAgSXQgc2hvdWxkIHlpZWxkIGEgbXV0YWJsZSBzZXF1ZW5jZSBvYmplY3QgKHN1Y2ggYXMgYVxuICBsaXN0KS4gIFRoZSBhc3NpZ25lZCBvYmplY3Qgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2JqZWN0IG9mIHRoZSBzYW1lXG4gIHR5cGUuICBOZXh0LCB0aGUgbG93ZXIgYW5kIHVwcGVyIGJvdW5kIGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQsXG4gIGluc29mYXIgdGhleSBhcmUgcHJlc2VudDsgZGVmYXVsdHMgYXJlIHplcm8gYW5kIHRoZSBzZXF1ZW5jZVwnc1xuICBsZW5ndGguICBUaGUgYm91bmRzIHNob3VsZCBldmFsdWF0ZSB0byAoc21hbGwpIGludGVnZXJzLiAgSWYgZWl0aGVyXG4gIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGUgc2VxdWVuY2VcJ3MgbGVuZ3RoIGlzIGFkZGVkIHRvIGl0LiBUaGVcbiAgcmVzdWx0aW5nIGJvdW5kcyBhcmUgY2xpcHBlZCB0byBsaWUgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgc2VxdWVuY2VcJ3NcbiAgbGVuZ3RoLCBpbmNsdXNpdmUuICBGaW5hbGx5LCB0aGUgc2VxdWVuY2Ugb2JqZWN0IGlzIGFza2VkIHRvIHJlcGxhY2VcbiAgdGhlIHNsaWNlIHdpdGggdGhlIGl0ZW1zIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZS4gIFRoZSBsZW5ndGggb2ZcbiAgdGhlIHNsaWNlIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhc3NpZ25lZCBzZXF1ZW5jZSxcbiAgdGh1cyBjaGFuZ2luZyB0aGUgbGVuZ3RoIG9mIHRoZSB0YXJnZXQgc2VxdWVuY2UsIGlmIHRoZSBvYmplY3RcbiAgYWxsb3dzIGl0LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGVcbnN5bnRheCBmb3IgdGFyZ2V0cyBpcyB0YWtlbiB0byBiZSB0aGUgc2FtZSBhcyBmb3IgZXhwcmVzc2lvbnMsIGFuZFxuaW52YWxpZCBzeW50YXggaXMgcmVqZWN0ZWQgZHVyaW5nIHRoZSBjb2RlIGdlbmVyYXRpb24gcGhhc2UsIGNhdXNpbmdcbmxlc3MgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZXMuXG5cbldBUk5JTkc6IEFsdGhvdWdoIHRoZSBkZWZpbml0aW9uIG9mIGFzc2lnbm1lbnQgaW1wbGllcyB0aGF0IG92ZXJsYXBzXG5iZXR3ZWVuIHRoZSBsZWZ0LWhhbmQgc2lkZSBhbmQgdGhlIHJpZ2h0LWhhbmQgc2lkZSBhcmUgXCdzYWZlXCcgKGZvclxuZXhhbXBsZSBgYGEsIGIgPSBiLCBhYGAgc3dhcHMgdHdvIHZhcmlhYmxlcyksIG92ZXJsYXBzICp3aXRoaW4qIHRoZVxuY29sbGVjdGlvbiBvZiBhc3NpZ25lZC10byB2YXJpYWJsZXMgYXJlIG5vdCBzYWZlISAgRm9yIGluc3RhbmNlLCB0aGVcbmZvbGxvd2luZyBwcm9ncmFtIHByaW50cyBgYFswLCAyXWBgOlxuXG4gICB4ID0gWzAsIDFdXG4gICBpID0gMFxuICAgaSwgeFtpXSA9IDEsIDJcbiAgIHByaW50IHhcblxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkF1Z21lbnRlZCBhc3NpZ25tZW50IGlzIHRoZSBjb21iaW5hdGlvbiwgaW4gYSBzaW5nbGUgc3RhdGVtZW50LCBvZiBhXG5iaW5hcnkgb3BlcmF0aW9uIGFuZCBhbiBhc3NpZ25tZW50IHN0YXRlbWVudDpcblxuICAgYXVnbWVudGVkX2Fzc2lnbm1lbnRfc3RtdCA6Oj0gYXVndGFyZ2V0IGF1Z29wIChleHByZXNzaW9uX2xpc3QgfCB5aWVsZF9leHByZXNzaW9uKVxuICAgYXVndGFyZ2V0ICAgICAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllciB8IGF0dHJpYnV0ZXJlZiB8IHN1YnNjcmlwdGlvbiB8IHNsaWNpbmdcbiAgIGF1Z29wICAgICAgICAgICAgICAgICAgICAgOjo9ICIrPSIgfCAiLT0iIHwgIio9IiB8ICIvPSIgfCAiLy89IiB8ICIlPSIgfCAiKio9IlxuICAgICAgICAgICAgIHwgIj4+PSIgfCAiPDw9IiB8ICImPSIgfCAiXj0iIHwgInw9IlxuXG4oU2VlIHNlY3Rpb24gKlByaW1hcmllcyogZm9yIHRoZSBzeW50YXggZGVmaW5pdGlvbnMgZm9yIHRoZSBsYXN0IHRocmVlXG5zeW1ib2xzLilcblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXZhbHVhdGVzIHRoZSB0YXJnZXQgKHdoaWNoLCB1bmxpa2Ugbm9ybWFsXG5hc3NpZ25tZW50IHN0YXRlbWVudHMsIGNhbm5vdCBiZSBhbiB1bnBhY2tpbmcpIGFuZCB0aGUgZXhwcmVzc2lvblxubGlzdCwgcGVyZm9ybXMgdGhlIGJpbmFyeSBvcGVyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHR5cGUgb2YgYXNzaWdubWVudFxub24gdGhlIHR3byBvcGVyYW5kcywgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byB0aGUgb3JpZ2luYWwgdGFyZ2V0LlxuVGhlIHRhcmdldCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLlxuXG5BbiBhdWdtZW50ZWQgYXNzaWdubWVudCBleHByZXNzaW9uIGxpa2UgYGB4ICs9IDFgYCBjYW4gYmUgcmV3cml0dGVuIGFzXG5gYHggPSB4ICsgMWBgIHRvIGFjaGlldmUgYSBzaW1pbGFyLCBidXQgbm90IGV4YWN0bHkgZXF1YWwgZWZmZWN0LiBJblxudGhlIGF1Z21lbnRlZCB2ZXJzaW9uLCBgYHhgYCBpcyBvbmx5IGV2YWx1YXRlZCBvbmNlLiBBbHNvLCB3aGVuXG5wb3NzaWJsZSwgdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkICppbi1wbGFjZSosIG1lYW5pbmcgdGhhdFxucmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb2JqZWN0IGFuZCBhc3NpZ25pbmcgdGhhdCB0byB0aGUgdGFyZ2V0LFxudGhlIG9sZCBvYmplY3QgaXMgbW9kaWZpZWQgaW5zdGVhZC5cblxuV2l0aCB0aGUgZXhjZXB0aW9uIG9mIGFzc2lnbmluZyB0byB0dXBsZXMgYW5kIG11bHRpcGxlIHRhcmdldHMgaW4gYVxuc2luZ2xlIHN0YXRlbWVudCwgdGhlIGFzc2lnbm1lbnQgZG9uZSBieSBhdWdtZW50ZWQgYXNzaWdubWVudFxuc3RhdGVtZW50cyBpcyBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBub3JtYWwgYXNzaWdubWVudHMuIFNpbWlsYXJseSxcbndpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgcG9zc2libGUgKmluLXBsYWNlKiBiZWhhdmlvciwgdGhlIGJpbmFyeVxub3BlcmF0aW9uIHBlcmZvcm1lZCBieSBhdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsXG5iaW5hcnkgb3BlcmF0aW9ucy5cblxuRm9yIHRhcmdldHMgd2hpY2ggYXJlIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCB0aGUgc2FtZSAqY2F2ZWF0IGFib3V0XG5jbGFzcyBhbmQgaW5zdGFuY2UgYXR0cmlidXRlcyogYXBwbGllcyBhcyBmb3IgcmVndWxhciBhc3NpZ25tZW50cy5cbicsCisgJ2F0b20taWRlbnRpZmllcnMnOiAnXG5JZGVudGlmaWVycyAoTmFtZXMpXG4qKioqKioqKioqKioqKioqKioqXG5cbkFuIGlkZW50aWZpZXIgb2NjdXJyaW5nIGFzIGFuIGF0b20gaXMgYSBuYW1lLiAgU2VlIHNlY3Rpb25cbipJZGVudGlmaWVycyBhbmQga2V5d29yZHMqIGZvciBsZXhpY2FsIGRlZmluaXRpb24gYW5kIHNlY3Rpb24gKk5hbWluZ1xuYW5kIGJpbmRpbmcqIGZvciBkb2N1bWVudGF0aW9uIG9mIG5hbWluZyBhbmQgYmluZGluZy5cblxuV2hlbiB0aGUgbmFtZSBpcyBib3VuZCB0byBhbiBvYmplY3QsIGV2YWx1YXRpb24gb2YgdGhlIGF0b20geWllbGRzXG50aGF0IG9iamVjdC4gV2hlbiBhIG5hbWUgaXMgbm90IGJvdW5kLCBhbiBhdHRlbXB0IHRvIGV2YWx1YXRlIGl0XG5yYWlzZXMgYSBgYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbi5cblxuKipQcml2YXRlIG5hbWUgbWFuZ2xpbmc6KiogV2hlbiBhbiBpZGVudGlmaWVyIHRoYXQgdGV4dHVhbGx5IG9jY3VycyBpblxuYSBjbGFzcyBkZWZpbml0aW9uIGJlZ2lucyB3aXRoIHR3byBvciBtb3JlIHVuZGVyc2NvcmUgY2hhcmFjdGVycyBhbmRcbmRvZXMgbm90IGVuZCBpbiB0d28gb3IgbW9yZSB1bmRlcnNjb3JlcywgaXQgaXMgY29uc2lkZXJlZCBhICpwcml2YXRlXG5uYW1lKiBvZiB0aGF0IGNsYXNzLiBQcml2YXRlIG5hbWVzIGFyZSB0cmFuc2Zvcm1lZCB0byBhIGxvbmdlciBmb3JtXG5iZWZvcmUgY29kZSBpcyBnZW5lcmF0ZWQgZm9yIHRoZW0uICBUaGUgdHJhbnNmb3JtYXRpb24gaW5zZXJ0cyB0aGVcbmNsYXNzIG5hbWUsIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlcyByZW1vdmVkIGFuZCBhIHNpbmdsZSB1bmRlcnNjb3JlXG5pbnNlcnRlZCwgaW4gZnJvbnQgb2YgdGhlIG5hbWUuICBGb3IgZXhhbXBsZSwgdGhlIGlkZW50aWZpZXJcbmBgX19zcGFtYGAgb2NjdXJyaW5nIGluIGEgY2xhc3MgbmFtZWQgYGBIYW1gYCB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvXG5gYF9IYW1fX3NwYW1gYC4gIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHN5bnRhY3RpY2FsXG5jb250ZXh0IGluIHdoaWNoIHRoZSBpZGVudGlmaWVyIGlzIHVzZWQuICBJZiB0aGUgdHJhbnNmb3JtZWQgbmFtZSBpc1xuZXh0cmVtZWx5IGxvbmcgKGxvbmdlciB0aGFuIDI1NSBjaGFyYWN0ZXJzKSwgaW1wbGVtZW50YXRpb24gZGVmaW5lZFxudHJ1bmNhdGlvbiBtYXkgaGFwcGVuLiBJZiB0aGUgY2xhc3MgbmFtZSBjb25zaXN0cyBvbmx5IG9mIHVuZGVyc2NvcmVzLFxubm8gdHJhbnNmb3JtYXRpb24gaXMgZG9uZS5cbicsCisgJ2F0b20tbGl0ZXJhbHMnOiAiXG5MaXRlcmFsc1xuKioqKioqKipcblxuUHl0aG9uIHN1cHBvcnRzIHN0cmluZyBsaXRlcmFscyBhbmQgdmFyaW91cyBudW1lcmljIGxpdGVyYWxzOlxuXG4gICBsaXRlcmFsIDo6PSBzdHJpbmdsaXRlcmFsIHwgaW50ZWdlciB8IGxvbmdpbnRlZ2VyXG4gICAgICAgICAgICAgICB8IGZsb2F0bnVtYmVyIHwgaW1hZ251bWJlclxuXG5FdmFsdWF0aW9uIG9mIGEgbGl0ZXJhbCB5aWVsZHMgYW4gb2JqZWN0IG9mIHRoZSBnaXZlbiB0eXBlIChzdHJpbmcsXG5pbnRlZ2VyLCBsb25nIGludGVnZXIsIGZsb2F0aW5nIHBvaW50IG51bWJlciwgY29tcGxleCBudW1iZXIpIHdpdGggdGhlXG5naXZlbiB2YWx1ZS4gIFRoZSB2YWx1ZSBtYXkgYmUgYXBwcm94aW1hdGVkIGluIHRoZSBjYXNlIG9mIGZsb2F0aW5nXG5wb2ludCBhbmQgaW1hZ2luYXJ5IChjb21wbGV4KSBsaXRlcmFscy4gIFNlZSBzZWN0aW9uICpMaXRlcmFscyogZm9yXG5kZXRhaWxzLlxuXG5BbGwgbGl0ZXJhbHMgY29ycmVzcG9uZCB0byBpbW11dGFibGUgZGF0YSB0eXBlcywgYW5kIGhlbmNlIHRoZVxub2JqZWN0J3MgaWRlbnRpdHkgaXMgbGVzcyBpbXBvcnRhbnQgdGhhbiBpdHMgdmFsdWUuICBNdWx0aXBsZVxuZXZhbHVhdGlvbnMgb2YgbGl0ZXJhbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSAoZWl0aGVyIHRoZSBzYW1lXG5vY2N1cnJlbmNlIGluIHRoZSBwcm9ncmFtIHRleHQgb3IgYSBkaWZmZXJlbnQgb2NjdXJyZW5jZSkgbWF5IG9idGFpblxudGhlIHNhbWUgb2JqZWN0IG9yIGEgZGlmZmVyZW50IG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlLlxuIiwKKyAnYXR0cmlidXRlLWFjY2Vzcyc6ICdcbkN1c3RvbWl6aW5nIGF0dHJpYnV0ZSBhY2Nlc3NcbioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGN1c3RvbWl6ZSB0aGUgbWVhbmluZyBvZlxuYXR0cmlidXRlIGFjY2VzcyAodXNlIG9mLCBhc3NpZ25tZW50IHRvLCBvciBkZWxldGlvbiBvZiBgYHgubmFtZWBgKVxuZm9yIGNsYXNzIGluc3RhbmNlcy5cblxub2JqZWN0Ll9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBsb29rdXAgaGFzIG5vdCBmb3VuZCB0aGUgYXR0cmlidXRlIGluIHRoZVxuICAgdXN1YWwgcGxhY2VzIChpLmUuIGl0IGlzIG5vdCBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUgbm9yIGlzIGl0IGZvdW5kXG4gICBpbiB0aGUgY2xhc3MgdHJlZSBmb3IgYGBzZWxmYGApLiAgYGBuYW1lYGAgaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLlxuICAgVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgKGNvbXB1dGVkKSBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2VcbiAgIGFuIGBgQXR0cmlidXRlRXJyb3JgYCBleGNlcHRpb24uXG5cbiAgIE5vdGUgdGhhdCBpZiB0aGUgYXR0cmlidXRlIGlzIGZvdW5kIHRocm91Z2ggdGhlIG5vcm1hbCBtZWNoYW5pc20sXG4gICBgYF9fZ2V0YXR0cl9fKClgYCBpcyBub3QgY2FsbGVkLiAgKFRoaXMgaXMgYW4gaW50ZW50aW9uYWwgYXN5bW1ldHJ5XG4gICBiZXR3ZWVuIGBgX19nZXRhdHRyX18oKWBgIGFuZCBgYF9fc2V0YXR0cl9fKClgYC4pIFRoaXMgaXMgZG9uZSBib3RoXG4gICBmb3IgZWZmaWNpZW5jeSByZWFzb25zIGFuZCBiZWNhdXNlIG90aGVyd2lzZSBgYF9fZ2V0YXR0cl9fKClgYFxuICAgd291bGQgaGF2ZSBubyB3YXkgdG8gYWNjZXNzIG90aGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGluc3RhbmNlLiAgTm90ZVxuICAgdGhhdCBhdCBsZWFzdCBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCB5b3UgY2FuIGZha2UgdG90YWwgY29udHJvbCBieVxuICAgbm90IGluc2VydGluZyBhbnkgdmFsdWVzIGluIHRoZSBpbnN0YW5jZSBhdHRyaWJ1dGUgZGljdGlvbmFyeSAoYnV0XG4gICBpbnN0ZWFkIGluc2VydGluZyB0aGVtIGluIGFub3RoZXIgb2JqZWN0KS4gIFNlZSB0aGVcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWV0aG9kIGJlbG93IGZvciBhIHdheSB0byBhY3R1YWxseSBnZXQgdG90YWxcbiAgIGNvbnRyb2wgaW4gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlcblxuICAgQ2FsbGVkIHdoZW4gYW4gYXR0cmlidXRlIGFzc2lnbm1lbnQgaXMgYXR0ZW1wdGVkLiAgVGhpcyBpcyBjYWxsZWRcbiAgIGluc3RlYWQgb2YgdGhlIG5vcm1hbCBtZWNoYW5pc20gKGkuZS4gc3RvcmUgdGhlIHZhbHVlIGluIHRoZVxuICAgaW5zdGFuY2UgZGljdGlvbmFyeSkuICAqbmFtZSogaXMgdGhlIGF0dHJpYnV0ZSBuYW1lLCAqdmFsdWUqIGlzIHRoZVxuICAgdmFsdWUgdG8gYmUgYXNzaWduZWQgdG8gaXQuXG5cbiAgIElmIGBgX19zZXRhdHRyX18oKWBgIHdhbnRzIHRvIGFzc2lnbiB0byBhbiBpbnN0YW5jZSBhdHRyaWJ1dGUsIGl0XG4gICBzaG91bGQgbm90IHNpbXBseSBleGVjdXRlIGBgc2VsZi5uYW1lID0gdmFsdWVgYCAtLS0gdGhpcyB3b3VsZFxuICAgY2F1c2UgYSByZWN1cnNpdmUgY2FsbCB0byBpdHNlbGYuICBJbnN0ZWFkLCBpdCBzaG91bGQgaW5zZXJ0IHRoZVxuICAgdmFsdWUgaW4gdGhlIGRpY3Rpb25hcnkgb2YgaW5zdGFuY2UgYXR0cmlidXRlcywgZS5nLixcbiAgIGBgc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlYGAuICBGb3IgbmV3LXN0eWxlIGNsYXNzZXMsIHJhdGhlclxuICAgdGhhbiBhY2Nlc3NpbmcgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnksIGl0IHNob3VsZCBjYWxsIHRoZSBiYXNlXG4gICBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lLCBmb3IgZXhhbXBsZSxcbiAgIGBgb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKWBgLlxuXG5vYmplY3QuX19kZWxhdHRyX18oc2VsZiwgbmFtZSlcblxuICAgTGlrZSBgYF9fc2V0YXR0cl9fKClgYCBidXQgZm9yIGF0dHJpYnV0ZSBkZWxldGlvbiBpbnN0ZWFkIG9mXG4gICBhc3NpZ25tZW50LiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBpZiBgYGRlbCBvYmoubmFtZWBgIGlzXG4gICBtZWFuaW5nZnVsIGZvciB0aGUgb2JqZWN0LlxuXG5cbk1vcmUgYXR0cmlidXRlIGFjY2VzcyBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgdG8gbmV3LXN0eWxlIGNsYXNzZXMuXG5cbm9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpXG5cbiAgIENhbGxlZCB1bmNvbmRpdGlvbmFsbHkgdG8gaW1wbGVtZW50IGF0dHJpYnV0ZSBhY2Nlc3NlcyBmb3JcbiAgIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MuIElmIHRoZSBjbGFzcyBhbHNvIGRlZmluZXNcbiAgIGBgX19nZXRhdHRyX18oKWBgLCB0aGUgbGF0dGVyIHdpbGwgbm90IGJlIGNhbGxlZCB1bmxlc3NcbiAgIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgZWl0aGVyIGNhbGxzIGl0IGV4cGxpY2l0bHkgb3IgcmFpc2VzIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAuIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZClcbiAgIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhbiBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLiBJbiBvcmRlclxuICAgdG8gYXZvaWQgaW5maW5pdGUgcmVjdXJzaW9uIGluIHRoaXMgbWV0aG9kLCBpdHMgaW1wbGVtZW50YXRpb25cbiAgIHNob3VsZCBhbHdheXMgY2FsbCB0aGUgYmFzZSBjbGFzcyBtZXRob2Qgd2l0aCB0aGUgc2FtZSBuYW1lIHRvXG4gICBhY2Nlc3MgYW55IGF0dHJpYnV0ZXMgaXQgbmVlZHMsIGZvciBleGFtcGxlLFxuICAgYGBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKWBgLlxuXG4gICBOb3RlOiBUaGlzIG1ldGhvZCBtYXkgc3RpbGwgYmUgYnlwYXNzZWQgd2hlbiBsb29raW5nIHVwIHNwZWNpYWwgbWV0aG9kc1xuICAgICBhcyB0aGUgcmVzdWx0IG9mIGltcGxpY2l0IGludm9jYXRpb24gdmlhIGxhbmd1YWdlIHN5bnRheCBvclxuICAgICBidWlsdC1pbiBmdW5jdGlvbnMuIFNlZSAqU3BlY2lhbCBtZXRob2QgbG9va3VwIGZvciBuZXctc3R5bGVcbiAgICAgY2xhc3NlcyouXG5cblxuSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzXG49PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIG9ubHkgYXBwbHkgd2hlbiBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3NcbmNvbnRhaW5pbmcgdGhlIG1ldGhvZCAoYSBzby1jYWxsZWQgKmRlc2NyaXB0b3IqIGNsYXNzKSBhcHBlYXJzIGluIGFuXG4qb3duZXIqIGNsYXNzICh0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGluIGVpdGhlciB0aGUgb3duZXJcJ3MgY2xhc3NcbmRpY3Rpb25hcnkgb3IgaW4gdGhlIGNsYXNzIGRpY3Rpb25hcnkgZm9yIG9uZSBvZiBpdHMgcGFyZW50cykuICBJbiB0aGVcbmV4YW1wbGVzIGJlbG93LCAidGhlIGF0dHJpYnV0ZSIgcmVmZXJzIHRvIHRoZSBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xudGhlIGtleSBvZiB0aGUgcHJvcGVydHkgaW4gdGhlIG93bmVyIGNsYXNzXCcgYGBfX2RpY3RfX2BgLlxuXG5vYmplY3QuX19nZXRfXyhzZWxmLCBpbnN0YW5jZSwgb3duZXIpXG5cbiAgIENhbGxlZCB0byBnZXQgdGhlIGF0dHJpYnV0ZSBvZiB0aGUgb3duZXIgY2xhc3MgKGNsYXNzIGF0dHJpYnV0ZVxuICAgYWNjZXNzKSBvciBvZiBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzIChpbnN0YW5jZSBhdHRyaWJ1dGVcbiAgIGFjY2VzcykuICpvd25lciogaXMgYWx3YXlzIHRoZSBvd25lciBjbGFzcywgd2hpbGUgKmluc3RhbmNlKiBpcyB0aGVcbiAgIGluc3RhbmNlIHRoYXQgdGhlIGF0dHJpYnV0ZSB3YXMgYWNjZXNzZWQgdGhyb3VnaCwgb3IgYGBOb25lYGAgd2hlblxuICAgdGhlIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZCB0aHJvdWdoIHRoZSAqb3duZXIqLiAgVGhpcyBtZXRob2Qgc2hvdWxkXG4gICByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlIGFuXG4gICBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG5vYmplY3QuX19zZXRfXyhzZWxmLCBpbnN0YW5jZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBzZXQgdGhlIGF0dHJpYnV0ZSBvbiBhbiBpbnN0YW5jZSAqaW5zdGFuY2UqIG9mIHRoZSBvd25lclxuICAgY2xhc3MgdG8gYSBuZXcgdmFsdWUsICp2YWx1ZSouXG5cbm9iamVjdC5fX2RlbGV0ZV9fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBDYWxsZWQgdG8gZGVsZXRlIHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGVcbiAgIG93bmVyIGNsYXNzLlxuXG5cbkludm9raW5nIERlc2NyaXB0b3JzXG49PT09PT09PT09PT09PT09PT09PVxuXG5JbiBnZW5lcmFsLCBhIGRlc2NyaXB0b3IgaXMgYW4gb2JqZWN0IGF0dHJpYnV0ZSB3aXRoICJiaW5kaW5nXG5iZWhhdmlvciIsIG9uZSB3aG9zZSBhdHRyaWJ1dGUgYWNjZXNzIGhhcyBiZWVuIG92ZXJyaWRkZW4gYnkgbWV0aG9kc1xuaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9jb2w6ICBgYF9fZ2V0X18oKWBgLCBgYF9fc2V0X18oKWBgLCBhbmRcbmBgX19kZWxldGVfXygpYGAuIElmIGFueSBvZiB0aG9zZSBtZXRob2RzIGFyZSBkZWZpbmVkIGZvciBhbiBvYmplY3QsXG5pdCBpcyBzYWlkIHRvIGJlIGEgZGVzY3JpcHRvci5cblxuVGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGF0dHJpYnV0ZSBhY2Nlc3MgaXMgdG8gZ2V0LCBzZXQsIG9yIGRlbGV0ZVxudGhlIGF0dHJpYnV0ZSBmcm9tIGFuIG9iamVjdFwncyBkaWN0aW9uYXJ5LiBGb3IgaW5zdGFuY2UsIGBgYS54YGAgaGFzIGFcbmxvb2t1cCBjaGFpbiBzdGFydGluZyB3aXRoIGBgYS5fX2RpY3RfX1tcJ3hcJ11gYCwgdGhlblxuYGB0eXBlKGEpLl9fZGljdF9fW1wneFwnXWBgLCBhbmQgY29udGludWluZyB0aHJvdWdoIHRoZSBiYXNlIGNsYXNzZXMgb2ZcbmBgdHlwZShhKWBgIGV4Y2x1ZGluZyBtZXRhY2xhc3Nlcy5cblxuSG93ZXZlciwgaWYgdGhlIGxvb2tlZC11cCB2YWx1ZSBpcyBhbiBvYmplY3QgZGVmaW5pbmcgb25lIG9mIHRoZVxuZGVzY3JpcHRvciBtZXRob2RzLCB0aGVuIFB5dGhvbiBtYXkgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgYmVoYXZpb3IgYW5kXG5pbnZva2UgdGhlIGRlc2NyaXB0b3IgbWV0aG9kIGluc3RlYWQuICBXaGVyZSB0aGlzIG9jY3VycyBpbiB0aGVcbnByZWNlZGVuY2UgY2hhaW4gZGVwZW5kcyBvbiB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgd2VyZSBkZWZpbmVkIGFuZFxuaG93IHRoZXkgd2VyZSBjYWxsZWQuICBOb3RlIHRoYXQgZGVzY3JpcHRvcnMgYXJlIG9ubHkgaW52b2tlZCBmb3IgbmV3XG5zdHlsZSBvYmplY3RzIG9yIGNsYXNzZXMgKG9uZXMgdGhhdCBzdWJjbGFzcyBgYG9iamVjdCgpYGAgb3JcbmBgdHlwZSgpYGApLlxuXG5UaGUgc3RhcnRpbmcgcG9pbnQgZm9yIGRlc2NyaXB0b3IgaW52b2NhdGlvbiBpcyBhIGJpbmRpbmcsIGBgYS54YGAuXG5Ib3cgdGhlIGFyZ3VtZW50cyBhcmUgYXNzZW1ibGVkIGRlcGVuZHMgb24gYGBhYGA6XG5cbkRpcmVjdCBDYWxsXG4gICBUaGUgc2ltcGxlc3QgYW5kIGxlYXN0IGNvbW1vbiBjYWxsIGlzIHdoZW4gdXNlciBjb2RlIGRpcmVjdGx5XG4gICBpbnZva2VzIGEgZGVzY3JpcHRvciBtZXRob2Q6ICAgIGBgeC5fX2dldF9fKGEpYGAuXG5cbkluc3RhbmNlIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgb2JqZWN0IGluc3RhbmNlLCBgYGEueGBgIGlzIHRyYW5zZm9ybWVkXG4gICBpbnRvIHRoZSBjYWxsOiBgYHR5cGUoYSkuX19kaWN0X19bXCd4XCddLl9fZ2V0X18oYSwgdHlwZShhKSlgYC5cblxuQ2xhc3MgQmluZGluZ1xuICAgSWYgYmluZGluZyB0byBhIG5ldy1zdHlsZSBjbGFzcywgYGBBLnhgYCBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZVxuICAgY2FsbDogYGBBLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKE5vbmUsIEEpYGAuXG5cblN1cGVyIEJpbmRpbmdcbiAgIElmIGBgYWBgIGlzIGFuIGluc3RhbmNlIG9mIGBgc3VwZXJgYCwgdGhlbiB0aGUgYmluZGluZyBgYHN1cGVyKEIsXG4gICBvYmopLm0oKWBgIHNlYXJjaGVzIGBgb2JqLl9fY2xhc3NfXy5fX21yb19fYGAgZm9yIHRoZSBiYXNlIGNsYXNzXG4gICBgYEFgYCBpbW1lZGlhdGVseSBwcmVjZWRpbmcgYGBCYGAgYW5kIHRoZW4gaW52b2tlcyB0aGUgZGVzY3JpcHRvclxuICAgd2l0aCB0aGUgY2FsbDogYGBBLl9fZGljdF9fW1wnbVwnXS5fX2dldF9fKG9iaiwgb2JqLl9fY2xhc3NfXylgYC5cblxuRm9yIGluc3RhbmNlIGJpbmRpbmdzLCB0aGUgcHJlY2VkZW5jZSBvZiBkZXNjcmlwdG9yIGludm9jYXRpb24gZGVwZW5kc1xub24gdGhlIHdoaWNoIGRlc2NyaXB0b3IgbWV0aG9kcyBhcmUgZGVmaW5lZC4gIEEgZGVzY3JpcHRvciBjYW4gZGVmaW5lXG5hbnkgY29tYmluYXRpb24gb2YgYGBfX2dldF9fKClgYCwgYGBfX3NldF9fKClgYCBhbmQgYGBfX2RlbGV0ZV9fKClgYC5cbklmIGl0IGRvZXMgbm90IGRlZmluZSBgYF9fZ2V0X18oKWBgLCB0aGVuIGFjY2Vzc2luZyB0aGUgYXR0cmlidXRlIHdpbGxcbnJldHVybiB0aGUgZGVzY3JpcHRvciBvYmplY3QgaXRzZWxmIHVubGVzcyB0aGVyZSBpcyBhIHZhbHVlIGluIHRoZVxub2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBJZiB0aGUgZGVzY3JpcHRvciBkZWZpbmVzIGBgX19zZXRfXygpYGBcbmFuZC9vciBgYF9fZGVsZXRlX18oKWBgLCBpdCBpcyBhIGRhdGEgZGVzY3JpcHRvcjsgaWYgaXQgZGVmaW5lc1xubmVpdGhlciwgaXQgaXMgYSBub24tZGF0YSBkZXNjcmlwdG9yLiAgTm9ybWFsbHksIGRhdGEgZGVzY3JpcHRvcnNcbmRlZmluZSBib3RoIGBgX19nZXRfXygpYGAgYW5kIGBgX19zZXRfXygpYGAsIHdoaWxlIG5vbi1kYXRhXG5kZXNjcmlwdG9ycyBoYXZlIGp1c3QgdGhlIGBgX19nZXRfXygpYGAgbWV0aG9kLiAgRGF0YSBkZXNjcmlwdG9ycyB3aXRoXG5gYF9fc2V0X18oKWBgIGFuZCBgYF9fZ2V0X18oKWBgIGRlZmluZWQgYWx3YXlzIG92ZXJyaWRlIGEgcmVkZWZpbml0aW9uXG5pbiBhbiBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSW4gY29udHJhc3QsIG5vbi1kYXRhIGRlc2NyaXB0b3JzIGNhbiBiZVxub3ZlcnJpZGRlbiBieSBpbnN0YW5jZXMuXG5cblB5dGhvbiBtZXRob2RzIChpbmNsdWRpbmcgYGBzdGF0aWNtZXRob2QoKWBgIGFuZCBgYGNsYXNzbWV0aG9kKClgYClcbmFyZSBpbXBsZW1lbnRlZCBhcyBub24tZGF0YSBkZXNjcmlwdG9ycy4gIEFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2FuXG5yZWRlZmluZSBhbmQgb3ZlcnJpZGUgbWV0aG9kcy4gIFRoaXMgYWxsb3dzIGluZGl2aWR1YWwgaW5zdGFuY2VzIHRvXG5hY3F1aXJlIGJlaGF2aW9ycyB0aGF0IGRpZmZlciBmcm9tIG90aGVyIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBjbGFzcy5cblxuVGhlIGBgcHJvcGVydHkoKWBgIGZ1bmN0aW9uIGlzIGltcGxlbWVudGVkIGFzIGEgZGF0YSBkZXNjcmlwdG9yLlxuQWNjb3JkaW5nbHksIGluc3RhbmNlcyBjYW5ub3Qgb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIG9mIGEgcHJvcGVydHkuXG5cblxuX19zbG90c19fXG49PT09PT09PT1cblxuQnkgZGVmYXVsdCwgaW5zdGFuY2VzIG9mIGJvdGggb2xkIGFuZCBuZXctc3R5bGUgY2xhc3NlcyBoYXZlIGFcbmRpY3Rpb25hcnkgZm9yIGF0dHJpYnV0ZSBzdG9yYWdlLiAgVGhpcyB3YXN0ZXMgc3BhY2UgZm9yIG9iamVjdHNcbmhhdmluZyB2ZXJ5IGZldyBpbnN0YW5jZSB2YXJpYWJsZXMuICBUaGUgc3BhY2UgY29uc3VtcHRpb24gY2FuIGJlY29tZVxuYWN1dGUgd2hlbiBjcmVhdGluZyBsYXJnZSBudW1iZXJzIG9mIGluc3RhbmNlcy5cblxuVGhlIGRlZmF1bHQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZGVmaW5pbmcgKl9fc2xvdHNfXyogaW4gYSBuZXctc3R5bGVcbmNsYXNzIGRlZmluaXRpb24uICBUaGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gdGFrZXMgYSBzZXF1ZW5jZSBvZlxuaW5zdGFuY2UgdmFyaWFibGVzIGFuZCByZXNlcnZlcyBqdXN0IGVub3VnaCBzcGFjZSBpbiBlYWNoIGluc3RhbmNlIHRvXG5ob2xkIGEgdmFsdWUgZm9yIGVhY2ggdmFyaWFibGUuICBTcGFjZSBpcyBzYXZlZCBiZWNhdXNlICpfX2RpY3RfXyogaXNcbm5vdCBjcmVhdGVkIGZvciBlYWNoIGluc3RhbmNlLlxuXG5fX3Nsb3RzX19cblxuICAgVGhpcyBjbGFzcyB2YXJpYWJsZSBjYW4gYmUgYXNzaWduZWQgYSBzdHJpbmcsIGl0ZXJhYmxlLCBvciBzZXF1ZW5jZVxuICAgb2Ygc3RyaW5ncyB3aXRoIHZhcmlhYmxlIG5hbWVzIHVzZWQgYnkgaW5zdGFuY2VzLiAgSWYgZGVmaW5lZCBpbiBhXG4gICBuZXctc3R5bGUgY2xhc3MsICpfX3Nsb3RzX18qIHJlc2VydmVzIHNwYWNlIGZvciB0aGUgZGVjbGFyZWRcbiAgIHZhcmlhYmxlcyBhbmQgcHJldmVudHMgdGhlIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiAqX19kaWN0X18qIGFuZFxuICAgKl9fd2Vha3JlZl9fKiBmb3IgZWFjaCBpbnN0YW5jZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG5Ob3RlcyBvbiB1c2luZyAqX19zbG90c19fKlxuXG4qIFdoZW4gaW5oZXJpdGluZyBmcm9tIGEgY2xhc3Mgd2l0aG91dCAqX19zbG90c19fKiwgdGhlICpfX2RpY3RfXypcbiAgYXR0cmlidXRlIG9mIHRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgYmUgYWNjZXNzaWJsZSwgc28gYSAqX19zbG90c19fKlxuICBkZWZpbml0aW9uIGluIHRoZSBzdWJjbGFzcyBpcyBtZWFuaW5nbGVzcy5cblxuKiBXaXRob3V0IGEgKl9fZGljdF9fKiB2YXJpYWJsZSwgaW5zdGFuY2VzIGNhbm5vdCBiZSBhc3NpZ25lZCBuZXdcbiAgdmFyaWFibGVzIG5vdCBsaXN0ZWQgaW4gdGhlICpfX3Nsb3RzX18qIGRlZmluaXRpb24uICBBdHRlbXB0cyB0b1xuICBhc3NpZ24gdG8gYW4gdW5saXN0ZWQgdmFyaWFibGUgbmFtZSByYWlzZXMgYGBBdHRyaWJ1dGVFcnJvcmBgLiBJZlxuICBkeW5hbWljIGFzc2lnbm1lbnQgb2YgbmV3IHZhcmlhYmxlcyBpcyBkZXNpcmVkLCB0aGVuIGFkZFxuICBgYFwnX19kaWN0X19cJ2BgIHRvIHRoZSBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKlxuICBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fZGljdF9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSB0aGUgYXNzaWdubWVudCBvZiBuZXdcbiAgYXR0cmlidXRlcyBub3Qgc3BlY2lmaWNhbGx5IGxpc3RlZCBpbiB0aGUgc2VxdWVuY2Ugb2YgaW5zdGFuY2VcbiAgdmFyaWFibGUgbmFtZXMuXG5cbiogV2l0aG91dCBhICpfX3dlYWtyZWZfXyogdmFyaWFibGUgZm9yIGVhY2ggaW5zdGFuY2UsIGNsYXNzZXMgZGVmaW5pbmdcbiAgKl9fc2xvdHNfXyogZG8gbm90IHN1cHBvcnQgd2VhayByZWZlcmVuY2VzIHRvIGl0cyBpbnN0YW5jZXMuIElmIHdlYWtcbiAgcmVmZXJlbmNlIHN1cHBvcnQgaXMgbmVlZGVkLCB0aGVuIGFkZCBgYFwnX193ZWFrcmVmX19cJ2BgIHRvIHRoZVxuICBzZXF1ZW5jZSBvZiBzdHJpbmdzIGluIHRoZSAqX19zbG90c19fKiBkZWNsYXJhdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhZGRpbmcgYGBcJ19fd2Vha3JlZl9fXCdgYCB0byB0aGVcbiAgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24gd291bGQgbm90IGVuYWJsZSBzdXBwb3J0IGZvciB3ZWFrXG4gIHJlZmVyZW5jZXMuXG5cbiogKl9fc2xvdHNfXyogYXJlIGltcGxlbWVudGVkIGF0IHRoZSBjbGFzcyBsZXZlbCBieSBjcmVhdGluZ1xuICBkZXNjcmlwdG9ycyAoKkltcGxlbWVudGluZyBEZXNjcmlwdG9ycyopIGZvciBlYWNoIHZhcmlhYmxlIG5hbWUuICBBc1xuICBhIHJlc3VsdCwgY2xhc3MgYXR0cmlidXRlcyBjYW5ub3QgYmUgdXNlZCB0byBzZXQgZGVmYXVsdCB2YWx1ZXMgZm9yXG4gIGluc3RhbmNlIHZhcmlhYmxlcyBkZWZpbmVkIGJ5ICpfX3Nsb3RzX18qOyBvdGhlcndpc2UsIHRoZSBjbGFzc1xuICBhdHRyaWJ1dGUgd291bGQgb3ZlcndyaXRlIHRoZSBkZXNjcmlwdG9yIGFzc2lnbm1lbnQuXG5cbiogVGhlIGFjdGlvbiBvZiBhICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzXG4gIHdoZXJlIGl0IGlzIGRlZmluZWQuICBBcyBhIHJlc3VsdCwgc3ViY2xhc3NlcyB3aWxsIGhhdmUgYSAqX19kaWN0X18qXG4gIHVubGVzcyB0aGV5IGFsc28gZGVmaW5lICpfX3Nsb3RzX18qICh3aGljaCBtdXN0IG9ubHkgY29udGFpbiBuYW1lc1xuICBvZiBhbnkgKmFkZGl0aW9uYWwqIHNsb3RzKS5cblxuKiBJZiBhIGNsYXNzIGRlZmluZXMgYSBzbG90IGFsc28gZGVmaW5lZCBpbiBhIGJhc2UgY2xhc3MsIHRoZSBpbnN0YW5jZVxuICB2YXJpYWJsZSBkZWZpbmVkIGJ5IHRoZSBiYXNlIGNsYXNzIHNsb3QgaXMgaW5hY2Nlc3NpYmxlIChleGNlcHQgYnlcbiAgcmV0cmlldmluZyBpdHMgZGVzY3JpcHRvciBkaXJlY3RseSBmcm9tIHRoZSBiYXNlIGNsYXNzKS4gVGhpc1xuICByZW5kZXJzIHRoZSBtZWFuaW5nIG9mIHRoZSBwcm9ncmFtIHVuZGVmaW5lZC4gIEluIHRoZSBmdXR1cmUsIGFcbiAgY2hlY2sgbWF5IGJlIGFkZGVkIHRvIHByZXZlbnQgdGhpcy5cblxuKiBOb25lbXB0eSAqX19zbG90c19fKiBkb2VzIG5vdCB3b3JrIGZvciBjbGFzc2VzIGRlcml2ZWQgZnJvbVxuICAidmFyaWFibGUtbGVuZ3RoIiBidWlsdC1pbiB0eXBlcyBzdWNoIGFzIGBgbG9uZ2BgLCBgYHN0cmBgIGFuZFxuICBgYHR1cGxlYGAuXG5cbiogQW55IG5vbi1zdHJpbmcgaXRlcmFibGUgbWF5IGJlIGFzc2lnbmVkIHRvICpfX3Nsb3RzX18qLiBNYXBwaW5ncyBtYXlcbiAgYWxzbyBiZSB1c2VkOyBob3dldmVyLCBpbiB0aGUgZnV0dXJlLCBzcGVjaWFsIG1lYW5pbmcgbWF5IGJlXG4gIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGtleS5cblxuKiAqX19jbGFzc19fKiBhc3NpZ25tZW50IHdvcmtzIG9ubHkgaWYgYm90aCBjbGFzc2VzIGhhdmUgdGhlIHNhbWVcbiAgKl9fc2xvdHNfXyouXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogUHJldmlvdXNseSwgKl9fY2xhc3NfXyogYXNzaWdubWVudCByYWlzZWQgYW5cbiAgZXJyb3IgaWYgZWl0aGVyIG5ldyBvciBvbGQgY2xhc3MgaGFkICpfX3Nsb3RzX18qLlxuJywKKyAnYXR0cmlidXRlLXJlZmVyZW5jZXMnOiAnXG5BdHRyaWJ1dGUgcmVmZXJlbmNlc1xuKioqKioqKioqKioqKioqKioqKipcblxuQW4gYXR0cmlidXRlIHJlZmVyZW5jZSBpcyBhIHByaW1hcnkgZm9sbG93ZWQgYnkgYSBwZXJpb2QgYW5kIGEgbmFtZTpcblxuICAgYXR0cmlidXRlcmVmIDo6PSBwcmltYXJ5ICIuIiBpZGVudGlmaWVyXG5cblRoZSBwcmltYXJ5IG11c3QgZXZhbHVhdGUgdG8gYW4gb2JqZWN0IG9mIGEgdHlwZSB0aGF0IHN1cHBvcnRzXG5hdHRyaWJ1dGUgcmVmZXJlbmNlcywgZS5nLiwgYSBtb2R1bGUsIGxpc3QsIG9yIGFuIGluc3RhbmNlLiAgVGhpc1xub2JqZWN0IGlzIHRoZW4gYXNrZWQgdG8gcHJvZHVjZSB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXMgdGhlXG5pZGVudGlmaWVyLiAgSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGV4Y2VwdGlvblxuYGBBdHRyaWJ1dGVFcnJvcmBgIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGUgdHlwZSBhbmQgdmFsdWUgb2YgdGhlXG5vYmplY3QgcHJvZHVjZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb2JqZWN0LiAgTXVsdGlwbGUgZXZhbHVhdGlvbnMgb2ZcbnRoZSBzYW1lIGF0dHJpYnV0ZSByZWZlcmVuY2UgbWF5IHlpZWxkIGRpZmZlcmVudCBvYmplY3RzLlxuJywKKyAnYXVnYXNzaWduJzogJ1xuQXVnbWVudGVkIGFzc2lnbm1lbnQgc3RhdGVtZW50c1xuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5BdWdtZW50ZWQgYXNzaWdubWVudCBpcyB0aGUgY29tYmluYXRpb24sIGluIGEgc2luZ2xlIHN0YXRlbWVudCwgb2YgYVxuYmluYXJ5IG9wZXJhdGlvbiBhbmQgYW4gYXNzaWdubWVudCBzdGF0ZW1lbnQ6XG5cbiAgIGF1Z21lbnRlZF9hc3NpZ25tZW50X3N0bXQgOjo9IGF1Z3RhcmdldCBhdWdvcCAoZXhwcmVzc2lvbl9saXN0IHwgeWllbGRfZXhwcmVzc2lvbilcbiAgIGF1Z3RhcmdldCAgICAgICAgICAgICAgICAgOjo9IGlkZW50aWZpZXIgfCBhdHRyaWJ1dGVyZWYgfCBzdWJzY3JpcHRpb24gfCBzbGljaW5nXG4gICBhdWdvcCAgICAgICAgICAgICAgICAgICAgIDo6PSAiKz0iIHwgIi09IiB8ICIqPSIgfCAiLz0iIHwgIi8vPSIgfCAiJT0iIHwgIioqPSJcbiAgICAgICAgICAgICB8ICI+Pj0iIHwgIjw8PSIgfCAiJj0iIHwgIl49IiB8ICJ8PSJcblxuKFNlZSBzZWN0aW9uICpQcmltYXJpZXMqIGZvciB0aGUgc3ludGF4IGRlZmluaXRpb25zIGZvciB0aGUgbGFzdCB0aHJlZVxuc3ltYm9scy4pXG5cbkFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGV2YWx1YXRlcyB0aGUgdGFyZ2V0ICh3aGljaCwgdW5saWtlIG5vcm1hbFxuYXNzaWdubWVudCBzdGF0ZW1lbnRzLCBjYW5ub3QgYmUgYW4gdW5wYWNraW5nKSBhbmQgdGhlIGV4cHJlc3Npb25cbmxpc3QsIHBlcmZvcm1zIHRoZSBiaW5hcnkgb3BlcmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0eXBlIG9mIGFzc2lnbm1lbnRcbm9uIHRoZSB0d28gb3BlcmFuZHMsIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gdGhlIG9yaWdpbmFsIHRhcmdldC5cblRoZSB0YXJnZXQgaXMgb25seSBldmFsdWF0ZWQgb25jZS5cblxuQW4gYXVnbWVudGVkIGFzc2lnbm1lbnQgZXhwcmVzc2lvbiBsaWtlIGBgeCArPSAxYGAgY2FuIGJlIHJld3JpdHRlbiBhc1xuYGB4ID0geCArIDFgYCB0byBhY2hpZXZlIGEgc2ltaWxhciwgYnV0IG5vdCBleGFjdGx5IGVxdWFsIGVmZmVjdC4gSW5cbnRoZSBhdWdtZW50ZWQgdmVyc2lvbiwgYGB4YGAgaXMgb25seSBldmFsdWF0ZWQgb25jZS4gQWxzbywgd2hlblxucG9zc2libGUsIHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCAqaW4tcGxhY2UqLCBtZWFuaW5nIHRoYXRcbnJhdGhlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9iamVjdCBhbmQgYXNzaWduaW5nIHRoYXQgdG8gdGhlIHRhcmdldCxcbnRoZSBvbGQgb2JqZWN0IGlzIG1vZGlmaWVkIGluc3RlYWQuXG5cbldpdGggdGhlIGV4Y2VwdGlvbiBvZiBhc3NpZ25pbmcgdG8gdHVwbGVzIGFuZCBtdWx0aXBsZSB0YXJnZXRzIGluIGFcbnNpbmdsZSBzdGF0ZW1lbnQsIHRoZSBhc3NpZ25tZW50IGRvbmUgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnRcbnN0YXRlbWVudHMgaXMgaGFuZGxlZCB0aGUgc2FtZSB3YXkgYXMgbm9ybWFsIGFzc2lnbm1lbnRzLiBTaW1pbGFybHksXG53aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHBvc3NpYmxlICppbi1wbGFjZSogYmVoYXZpb3IsIHRoZSBiaW5hcnlcbm9wZXJhdGlvbiBwZXJmb3JtZWQgYnkgYXVnbWVudGVkIGFzc2lnbm1lbnQgaXMgdGhlIHNhbWUgYXMgdGhlIG5vcm1hbFxuYmluYXJ5IG9wZXJhdGlvbnMuXG5cbkZvciB0YXJnZXRzIHdoaWNoIGFyZSBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgdGhlIHNhbWUgKmNhdmVhdCBhYm91dFxuY2xhc3MgYW5kIGluc3RhbmNlIGF0dHJpYnV0ZXMqIGFwcGxpZXMgYXMgZm9yIHJlZ3VsYXIgYXNzaWdubWVudHMuXG4nLAorICdiaW5hcnknOiAnXG5CaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGhhdmUgdGhlIGNvbnZlbnRpb25hbCBwcmlvcml0eVxubGV2ZWxzLiAgTm90ZSB0aGF0IHNvbWUgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhbHNvIGFwcGx5IHRvIGNlcnRhaW4gbm9uLVxubnVtZXJpYyB0eXBlcy4gIEFwYXJ0IGZyb20gdGhlIHBvd2VyIG9wZXJhdG9yLCB0aGVyZSBhcmUgb25seSB0d29cbmxldmVscywgb25lIGZvciBtdWx0aXBsaWNhdGl2ZSBvcGVyYXRvcnMgYW5kIG9uZSBmb3IgYWRkaXRpdmVcbm9wZXJhdG9yczpcblxuICAgbV9leHByIDo6PSB1X2V4cHIgfCBtX2V4cHIgIioiIHVfZXhwciB8IG1fZXhwciAiLy8iIHVfZXhwciB8IG1fZXhwciAiLyIgdV9leHByXG4gICAgICAgICAgICAgIHwgbV9leHByICIlIiB1X2V4cHJcbiAgIGFfZXhwciA6Oj0gbV9leHByIHwgYV9leHByICIrIiBtX2V4cHIgfCBhX2V4cHIgIi0iIG1fZXhwclxuXG5UaGUgYGAqYGAgKG11bHRpcGxpY2F0aW9uKSBvcGVyYXRvciB5aWVsZHMgdGhlIHByb2R1Y3Qgb2YgaXRzXG5hcmd1bWVudHMuICBUaGUgYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycywgb3Igb25lIGFyZ3VtZW50XG5tdXN0IGJlIGFuIGludGVnZXIgKHBsYWluIG9yIGxvbmcpIGFuZCB0aGUgb3RoZXIgbXVzdCBiZSBhIHNlcXVlbmNlLlxuSW4gdGhlIGZvcm1lciBjYXNlLCB0aGUgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUgYW5kXG50aGVuIG11bHRpcGxpZWQgdG9nZXRoZXIuICBJbiB0aGUgbGF0dGVyIGNhc2UsIHNlcXVlbmNlIHJlcGV0aXRpb24gaXNcbnBlcmZvcm1lZDsgYSBuZWdhdGl2ZSByZXBldGl0aW9uIGZhY3RvciB5aWVsZHMgYW4gZW1wdHkgc2VxdWVuY2UuXG5cblRoZSBgYC9gYCAoZGl2aXNpb24pIGFuZCBgYC8vYGAgKGZsb29yIGRpdmlzaW9uKSBvcGVyYXRvcnMgeWllbGQgdGhlXG5xdW90aWVudCBvZiB0aGVpciBhcmd1bWVudHMuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gUGxhaW4gb3IgbG9uZyBpbnRlZ2VyIGRpdmlzaW9uIHlpZWxkcyBhblxuaW50ZWdlciBvZiB0aGUgc2FtZSB0eXBlOyB0aGUgcmVzdWx0IGlzIHRoYXQgb2YgbWF0aGVtYXRpY2FsIGRpdmlzaW9uXG53aXRoIHRoZSBcJ2Zsb29yXCcgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcmVzdWx0LiBEaXZpc2lvbiBieSB6ZXJvXG5yYWlzZXMgdGhlIGBgWmVyb0RpdmlzaW9uRXJyb3JgYCBleGNlcHRpb24uXG5cblRoZSBgYCVgYCAobW9kdWxvKSBvcGVyYXRvciB5aWVsZHMgdGhlIHJlbWFpbmRlciBmcm9tIHRoZSBkaXZpc2lvbiBvZlxudGhlIGZpcnN0IGFyZ3VtZW50IGJ5IHRoZSBzZWNvbmQuICBUaGUgbnVtZXJpYyBhcmd1bWVudHMgYXJlIGZpcnN0XG5jb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIEEgemVybyByaWdodCBhcmd1bWVudCByYWlzZXMgdGhlXG5gYFplcm9EaXZpc2lvbkVycm9yYGAgZXhjZXB0aW9uLiAgVGhlIGFyZ3VtZW50cyBtYXkgYmUgZmxvYXRpbmcgcG9pbnRcbm51bWJlcnMsIGUuZy4sIGBgMy4xNCUwLjdgYCBlcXVhbHMgYGAwLjM0YGAgKHNpbmNlIGBgMy4xNGBgIGVxdWFsc1xuYGA0KjAuNyArIDAuMzRgYC4pICBUaGUgbW9kdWxvIG9wZXJhdG9yIGFsd2F5cyB5aWVsZHMgYSByZXN1bHQgd2l0aFxudGhlIHNhbWUgc2lnbiBhcyBpdHMgc2Vjb25kIG9wZXJhbmQgKG9yIHplcm8pOyB0aGUgYWJzb2x1dGUgdmFsdWUgb2ZcbnRoZSByZXN1bHQgaXMgc3RyaWN0bHkgc21hbGxlciB0aGFuIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgc2Vjb25kXG5vcGVyYW5kIFsyXS5cblxuVGhlIGludGVnZXIgZGl2aXNpb24gYW5kIG1vZHVsbyBvcGVyYXRvcnMgYXJlIGNvbm5lY3RlZCBieSB0aGVcbmZvbGxvd2luZyBpZGVudGl0eTogYGB4ID09ICh4L3kpKnkgKyAoeCV5KWBgLiAgSW50ZWdlciBkaXZpc2lvbiBhbmRcbm1vZHVsbyBhcmUgYWxzbyBjb25uZWN0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBkaXZtb2QoKWBgOlxuYGBkaXZtb2QoeCwgeSkgPT0gKHgveSwgeCV5KWBgLiAgVGhlc2UgaWRlbnRpdGllcyBkb25cJ3QgaG9sZCBmb3JcbmZsb2F0aW5nIHBvaW50IG51bWJlcnM7IHRoZXJlIHNpbWlsYXIgaWRlbnRpdGllcyBob2xkIGFwcHJveGltYXRlbHlcbndoZXJlIGBgeC95YGAgaXMgcmVwbGFjZWQgYnkgYGBmbG9vcih4L3kpYGAgb3IgYGBmbG9vcih4L3kpIC0gMWBgIFszXS5cblxuSW4gYWRkaXRpb24gdG8gcGVyZm9ybWluZyB0aGUgbW9kdWxvIG9wZXJhdGlvbiBvbiBudW1iZXJzLCB0aGUgYGAlYGBcbm9wZXJhdG9yIGlzIGFsc28gb3ZlcmxvYWRlZCBieSBzdHJpbmcgYW5kIHVuaWNvZGUgb2JqZWN0cyB0byBwZXJmb3JtXG5zdHJpbmcgZm9ybWF0dGluZyAoYWxzbyBrbm93biBhcyBpbnRlcnBvbGF0aW9uKS4gVGhlIHN5bnRheCBmb3Igc3RyaW5nXG5mb3JtYXR0aW5nIGlzIGRlc2NyaWJlZCBpbiB0aGUgUHl0aG9uIExpYnJhcnkgUmVmZXJlbmNlLCBzZWN0aW9uXG4qU3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9ucyouXG5cbkRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjM6IFRoZSBmbG9vciBkaXZpc2lvbiBvcGVyYXRvciwgdGhlIG1vZHVsb1xub3BlcmF0b3IsIGFuZCB0aGUgYGBkaXZtb2QoKWBgIGZ1bmN0aW9uIGFyZSBubyBsb25nZXIgZGVmaW5lZCBmb3JcbmNvbXBsZXggbnVtYmVycy4gIEluc3RlYWQsIGNvbnZlcnQgdG8gYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdXNpbmdcbnRoZSBgYGFicygpYGAgZnVuY3Rpb24gaWYgYXBwcm9wcmlhdGUuXG5cblRoZSBgYCtgYCAoYWRkaXRpb24pIG9wZXJhdG9yIHlpZWxkcyB0aGUgc3VtIG9mIGl0cyBhcmd1bWVudHMuIFRoZVxuYXJndW1lbnRzIG11c3QgZWl0aGVyIGJvdGggYmUgbnVtYmVycyBvciBib3RoIHNlcXVlbmNlcyBvZiB0aGUgc2FtZVxudHlwZS4gIEluIHRoZSBmb3JtZXIgY2FzZSwgdGhlIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlXG5hbmQgdGhlbiBhZGRlZCB0b2dldGhlci4gIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIHNlcXVlbmNlcyBhcmVcbmNvbmNhdGVuYXRlZC5cblxuVGhlIGBgLWBgIChzdWJ0cmFjdGlvbikgb3BlcmF0b3IgeWllbGRzIHRoZSBkaWZmZXJlbmNlIG9mIGl0c1xuYXJndW1lbnRzLiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG8gYSBjb21tb25cbnR5cGUuXG4nLAorICdiaXR3aXNlJzogJ1xuQmluYXJ5IGJpdHdpc2Ugb3BlcmF0aW9uc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5FYWNoIG9mIHRoZSB0aHJlZSBiaXR3aXNlIG9wZXJhdGlvbnMgaGFzIGEgZGlmZmVyZW50IHByaW9yaXR5IGxldmVsOlxuXG4gICBhbmRfZXhwciA6Oj0gc2hpZnRfZXhwciB8IGFuZF9leHByICImIiBzaGlmdF9leHByXG4gICB4b3JfZXhwciA6Oj0gYW5kX2V4cHIgfCB4b3JfZXhwciAiXiIgYW5kX2V4cHJcbiAgIG9yX2V4cHIgIDo6PSB4b3JfZXhwciB8IG9yX2V4cHIgInwiIHhvcl9leHByXG5cblRoZSBgYCZgYCBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgQU5EIG9mIGl0cyBhcmd1bWVudHMsIHdoaWNoIG11c3RcbmJlIHBsYWluIG9yIGxvbmcgaW50ZWdlcnMuICBUaGUgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb25cbnR5cGUuXG5cblRoZSBgYF5gYCBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgWE9SIChleGNsdXNpdmUgT1IpIG9mIGl0c1xuYXJndW1lbnRzLCB3aGljaCBtdXN0IGJlIHBsYWluIG9yIGxvbmcgaW50ZWdlcnMuICBUaGUgYXJndW1lbnRzIGFyZVxuY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuXG5cblRoZSBgYHxgYCBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgKGluY2x1c2l2ZSkgT1Igb2YgaXRzIGFyZ3VtZW50cyxcbndoaWNoIG11c3QgYmUgcGxhaW4gb3IgbG9uZyBpbnRlZ2Vycy4gIFRoZSBhcmd1bWVudHMgYXJlIGNvbnZlcnRlZCB0b1xuYSBjb21tb24gdHlwZS5cbicsCisgJ2JsdGluLWNvZGUtb2JqZWN0cyc6ICdcbkNvZGUgT2JqZWN0c1xuKioqKioqKioqKioqXG5cbkNvZGUgb2JqZWN0cyBhcmUgdXNlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gdG8gcmVwcmVzZW50ICJwc2V1ZG8tXG5jb21waWxlZCIgZXhlY3V0YWJsZSBQeXRob24gY29kZSBzdWNoIGFzIGEgZnVuY3Rpb24gYm9keS4gVGhleSBkaWZmZXJcbmZyb20gZnVuY3Rpb24gb2JqZWN0cyBiZWNhdXNlIHRoZXkgZG9uXCd0IGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlaXJcbmdsb2JhbCBleGVjdXRpb24gZW52aXJvbm1lbnQuICBDb2RlIG9iamVjdHMgYXJlIHJldHVybmVkIGJ5IHRoZSBidWlsdC1cbmluIGBgY29tcGlsZSgpYGAgZnVuY3Rpb24gYW5kIGNhbiBiZSBleHRyYWN0ZWQgZnJvbSBmdW5jdGlvbiBvYmplY3RzXG50aHJvdWdoIHRoZWlyIGBgZnVuY19jb2RlYGAgYXR0cmlidXRlLiBTZWUgYWxzbyB0aGUgYGBjb2RlYGAgbW9kdWxlLlxuXG5BIGNvZGUgb2JqZWN0IGNhbiBiZSBleGVjdXRlZCBvciBldmFsdWF0ZWQgYnkgcGFzc2luZyBpdCAoaW5zdGVhZCBvZiBhXG5zb3VyY2Ugc3RyaW5nKSB0byB0aGUgYGBleGVjYGAgc3RhdGVtZW50IG9yIHRoZSBidWlsdC1pbiBgYGV2YWwoKWBgXG5mdW5jdGlvbi5cblxuU2VlICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJywKKyAnYmx0aW4tZWxsaXBzaXMtb2JqZWN0JzogJ1xuVGhlIEVsbGlwc2lzIE9iamVjdFxuKioqKioqKioqKioqKioqKioqKlxuXG5UaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uIChzZWUgKlNsaWNpbmdzKikuICBJdFxuc3VwcG9ydHMgbm8gc3BlY2lhbCBvcGVyYXRpb25zLiAgVGhlcmUgaXMgZXhhY3RseSBvbmUgZWxsaXBzaXMgb2JqZWN0LFxubmFtZWQgYGBFbGxpcHNpc2BgIChhIGJ1aWx0LWluIG5hbWUpLlxuXG5JdCBpcyB3cml0dGVuIGFzIGBgRWxsaXBzaXNgYC4gIFdoZW4gaW4gYSBzdWJzY3JpcHQsIGl0IGNhbiBhbHNvIGJlXG53cml0dGVuIGFzIGBgLi4uYGAsIGZvciBleGFtcGxlIGBgc2VxWy4uLl1gYC5cbicsCisgJ2JsdGluLW51bGwtb2JqZWN0JzogIlxuVGhlIE51bGwgT2JqZWN0XG4qKioqKioqKioqKioqKipcblxuVGhpcyBvYmplY3QgaXMgcmV0dXJuZWQgYnkgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZXhwbGljaXRseSByZXR1cm4gYVxudmFsdWUuICBJdCBzdXBwb3J0cyBubyBzcGVjaWFsIG9wZXJhdGlvbnMuICBUaGVyZSBpcyBleGFjdGx5IG9uZSBudWxsXG5vYmplY3QsIG5hbWVkIGBgTm9uZWBgIChhIGJ1aWx0LWluIG5hbWUpLlxuXG5JdCBpcyB3cml0dGVuIGFzIGBgTm9uZWBgLlxuIiwKKyAnYmx0aW4tdHlwZS1vYmplY3RzJzogIlxuVHlwZSBPYmplY3RzXG4qKioqKioqKioqKipcblxuVHlwZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgdmFyaW91cyBvYmplY3QgdHlwZXMuICBBbiBvYmplY3QncyB0eXBlIGlzXG5hY2Nlc3NlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGB0eXBlKClgYC4gIFRoZXJlIGFyZSBubyBzcGVjaWFsXG5vcGVyYXRpb25zIG9uIHR5cGVzLiAgVGhlIHN0YW5kYXJkIG1vZHVsZSBgYHR5cGVzYGAgZGVmaW5lcyBuYW1lcyBmb3JcbmFsbCBzdGFuZGFyZCBidWlsdC1pbiB0eXBlcy5cblxuVHlwZXMgYXJlIHdyaXR0ZW4gbGlrZSB0aGlzOiBgYDx0eXBlICdpbnQnPmBgLlxuIiwKKyAnYm9vbGVhbnMnOiAnXG5Cb29sZWFuIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKlxuXG4gICBvcl90ZXN0ICA6Oj0gYW5kX3Rlc3QgfCBvcl90ZXN0ICJvciIgYW5kX3Rlc3RcbiAgIGFuZF90ZXN0IDo6PSBub3RfdGVzdCB8IGFuZF90ZXN0ICJhbmQiIG5vdF90ZXN0XG4gICBub3RfdGVzdCA6Oj0gY29tcGFyaXNvbiB8ICJub3QiIG5vdF90ZXN0XG5cbkluIHRoZSBjb250ZXh0IG9mIEJvb2xlYW4gb3BlcmF0aW9ucywgYW5kIGFsc28gd2hlbiBleHByZXNzaW9ucyBhcmVcbnVzZWQgYnkgY29udHJvbCBmbG93IHN0YXRlbWVudHMsIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBpbnRlcnByZXRlZFxuYXMgZmFsc2U6IGBgRmFsc2VgYCwgYGBOb25lYGAsIG51bWVyaWMgemVybyBvZiBhbGwgdHlwZXMsIGFuZCBlbXB0eVxuc3RyaW5ncyBhbmQgY29udGFpbmVycyAoaW5jbHVkaW5nIHN0cmluZ3MsIHR1cGxlcywgbGlzdHMsXG5kaWN0aW9uYXJpZXMsIHNldHMgYW5kIGZyb3plbnNldHMpLiAgQWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWRcbmFzIHRydWUuICAoU2VlIHRoZSBgYF9fbm9uemVyb19fKClgYCBzcGVjaWFsIG1ldGhvZCBmb3IgYSB3YXkgdG9cbmNoYW5nZSB0aGlzLilcblxuVGhlIG9wZXJhdG9yIGBgbm90YGAgeWllbGRzIGBgVHJ1ZWBgIGlmIGl0cyBhcmd1bWVudCBpcyBmYWxzZSxcbmBgRmFsc2VgYCBvdGhlcndpc2UuXG5cblRoZSBleHByZXNzaW9uIGBgeCBhbmQgeWBgIGZpcnN0IGV2YWx1YXRlcyAqeCo7IGlmICp4KiBpcyBmYWxzZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuVGhlIGV4cHJlc3Npb24gYGB4IG9yIHlgYCBmaXJzdCBldmFsdWF0ZXMgKngqOyBpZiAqeCogaXMgdHJ1ZSwgaXRzXG52YWx1ZSBpcyByZXR1cm5lZDsgb3RoZXJ3aXNlLCAqeSogaXMgZXZhbHVhdGVkIGFuZCB0aGUgcmVzdWx0aW5nIHZhbHVlXG5pcyByZXR1cm5lZC5cblxuKE5vdGUgdGhhdCBuZWl0aGVyIGBgYW5kYGAgbm9yIGBgb3JgYCByZXN0cmljdCB0aGUgdmFsdWUgYW5kIHR5cGUgdGhleVxucmV0dXJuIHRvIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAsIGJ1dCByYXRoZXIgcmV0dXJuIHRoZSBsYXN0IGV2YWx1YXRlZFxuYXJndW1lbnQuIFRoaXMgaXMgc29tZXRpbWVzIHVzZWZ1bCwgZS5nLiwgaWYgYGBzYGAgaXMgYSBzdHJpbmcgdGhhdFxuc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcyBlbXB0eSwgdGhlIGV4cHJlc3Npb25cbmBgcyBvciBcJ2Zvb1wnYGAgeWllbGRzIHRoZSBkZXNpcmVkIHZhbHVlLiAgQmVjYXVzZSBgYG5vdGBgIGhhcyB0b1xuaW52ZW50IGEgdmFsdWUgYW55d2F5LCBpdCBkb2VzIG5vdCBib3RoZXIgdG8gcmV0dXJuIGEgdmFsdWUgb2YgdGhlXG5zYW1lIHR5cGUgYXMgaXRzIGFyZ3VtZW50LCBzbyBlLmcuLCBgYG5vdCBcJ2Zvb1wnYGAgeWllbGRzIGBgRmFsc2VgYCxcbm5vdCBgYFwnXCdgYC4pXG4nLAorICdicmVhayc6ICdcblRoZSBgYGJyZWFrYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBicmVha19zdG10IDo6PSAiYnJlYWsiXG5cbmBgYnJlYWtgYCBtYXkgb25seSBvY2N1ciBzeW50YWN0aWNhbGx5IG5lc3RlZCBpbiBhIGBgZm9yYGAgb3JcbmBgd2hpbGVgYCBsb29wLCBidXQgbm90IG5lc3RlZCBpbiBhIGZ1bmN0aW9uIG9yIGNsYXNzIGRlZmluaXRpb25cbndpdGhpbiB0aGF0IGxvb3AuXG5cbkl0IHRlcm1pbmF0ZXMgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIGxvb3AsIHNraXBwaW5nIHRoZSBvcHRpb25hbFxuYGBlbHNlYGAgY2xhdXNlIGlmIHRoZSBsb29wIGhhcyBvbmUuXG5cbklmIGEgYGBmb3JgYCBsb29wIGlzIHRlcm1pbmF0ZWQgYnkgYGBicmVha2BgLCB0aGUgbG9vcCBjb250cm9sIHRhcmdldFxua2VlcHMgaXRzIGN1cnJlbnQgdmFsdWUuXG5cbldoZW4gYGBicmVha2BgIHBhc3NlcyBjb250cm9sIG91dCBvZiBhIGBgdHJ5YGAgc3RhdGVtZW50IHdpdGggYVxuYGBmaW5hbGx5YGAgY2xhdXNlLCB0aGF0IGBgZmluYWxseWBgIGNsYXVzZSBpcyBleGVjdXRlZCBiZWZvcmUgcmVhbGx5XG5sZWF2aW5nIHRoZSBsb29wLlxuJywKKyAnY2FsbGFibGUtdHlwZXMnOiAnXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCBgYHgoYXJnMSwgYXJnMiwgLi4uKWBgIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgYGB4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLilgYC5cbicsCisgJ2NhbGxzJzogJ1xuQ2FsbHNcbioqKioqXG5cbkEgY2FsbCBjYWxscyBhIGNhbGxhYmxlIG9iamVjdCAoZS5nLiwgYSAqZnVuY3Rpb24qKSB3aXRoIGEgcG9zc2libHlcbmVtcHR5IHNlcmllcyBvZiAqYXJndW1lbnRzKjpcblxuICAgY2FsbCAgICAgICAgICAgICAgICAgOjo9IHByaW1hcnkgIigiIFthcmd1bWVudF9saXN0IFsiLCJdXG4gICAgICAgICAgICB8IGV4cHJlc3Npb24gZ2VuZXhwcl9mb3JdICIpIlxuICAgYXJndW1lbnRfbGlzdCAgICAgICAgOjo9IHBvc2l0aW9uYWxfYXJndW1lbnRzIFsiLCIga2V5d29yZF9hcmd1bWVudHNdXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioiIGV4cHJlc3Npb25dIFsiLCIga2V5d29yZF9hcmd1bWVudHNdXG4gICAgICAgICAgICAgICAgICAgICAgIFsiLCIgIioqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgfCBrZXl3b3JkX2FyZ3VtZW50cyBbIiwiICIqIiBleHByZXNzaW9uXVxuICAgICAgICAgICAgICAgICAgICAgICBbIiwiICIqKiIgZXhwcmVzc2lvbl1cbiAgICAgICAgICAgICAgICAgICAgIHwgIioiIGV4cHJlc3Npb24gWyIsIiAiKiIgZXhwcmVzc2lvbl0gWyIsIiAiKioiIGV4cHJlc3Npb25dXG4gICAgICAgICAgICAgICAgICAgICB8ICIqKiIgZXhwcmVzc2lvblxuICAgcG9zaXRpb25hbF9hcmd1bWVudHMgOjo9IGV4cHJlc3Npb24gKCIsIiBleHByZXNzaW9uKSpcbiAgIGtleXdvcmRfYXJndW1lbnRzICAgIDo6PSBrZXl3b3JkX2l0ZW0gKCIsIiBrZXl3b3JkX2l0ZW0pKlxuICAga2V5d29yZF9pdGVtICAgICAgICAgOjo9IGlkZW50aWZpZXIgIj0iIGV4cHJlc3Npb25cblxuQSB0cmFpbGluZyBjb21tYSBtYXkgYmUgcHJlc2VudCBhZnRlciB0aGUgcG9zaXRpb25hbCBhbmQga2V5d29yZFxuYXJndW1lbnRzIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIHNlbWFudGljcy5cblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhIGNhbGxhYmxlIG9iamVjdCAodXNlci1kZWZpbmVkXG5mdW5jdGlvbnMsIGJ1aWx0LWluIGZ1bmN0aW9ucywgbWV0aG9kcyBvZiBidWlsdC1pbiBvYmplY3RzLCBjbGFzc1xub2JqZWN0cywgbWV0aG9kcyBvZiBjbGFzcyBpbnN0YW5jZXMsIGFuZCBjZXJ0YWluIGNsYXNzIGluc3RhbmNlc1xudGhlbXNlbHZlcyBhcmUgY2FsbGFibGU7IGV4dGVuc2lvbnMgbWF5IGRlZmluZSBhZGRpdGlvbmFsIGNhbGxhYmxlXG5vYmplY3QgdHlwZXMpLiAgQWxsIGFyZ3VtZW50IGV4cHJlc3Npb25zIGFyZSBldmFsdWF0ZWQgYmVmb3JlIHRoZSBjYWxsXG5pcyBhdHRlbXB0ZWQuICBQbGVhc2UgcmVmZXIgdG8gc2VjdGlvbiAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciB0aGVcbnN5bnRheCBvZiBmb3JtYWwgKnBhcmFtZXRlciogbGlzdHMuXG5cbklmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBmaXJzdCBjb252ZXJ0ZWQgdG9cbnBvc2l0aW9uYWwgYXJndW1lbnRzLCBhcyBmb2xsb3dzLiAgRmlyc3QsIGEgbGlzdCBvZiB1bmZpbGxlZCBzbG90cyBpc1xuY3JlYXRlZCBmb3IgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzLiAgSWYgdGhlcmUgYXJlIE4gcG9zaXRpb25hbFxuYXJndW1lbnRzLCB0aGV5IGFyZSBwbGFjZWQgaW4gdGhlIGZpcnN0IE4gc2xvdHMuICBOZXh0LCBmb3IgZWFjaFxua2V5d29yZCBhcmd1bWVudCwgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3QgKGlmIHRoZSBpZGVudGlmaWVyIGlzIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBmb3JtYWxcbnBhcmFtZXRlciBuYW1lLCB0aGUgZmlyc3Qgc2xvdCBpcyB1c2VkLCBhbmQgc28gb24pLiAgSWYgdGhlIHNsb3QgaXNcbmFscmVhZHkgZmlsbGVkLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gT3RoZXJ3aXNlLCB0aGVcbnZhbHVlIG9mIHRoZSBhcmd1bWVudCBpcyBwbGFjZWQgaW4gdGhlIHNsb3QsIGZpbGxpbmcgaXQgKGV2ZW4gaWYgdGhlXG5leHByZXNzaW9uIGlzIGBgTm9uZWBgLCBpdCBmaWxscyB0aGUgc2xvdCkuICBXaGVuIGFsbCBhcmd1bWVudHMgaGF2ZVxuYmVlbiBwcm9jZXNzZWQsIHRoZSBzbG90cyB0aGF0IGFyZSBzdGlsbCB1bmZpbGxlZCBhcmUgZmlsbGVkIHdpdGggdGhlXG5jb3JyZXNwb25kaW5nIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIChEZWZhdWx0XG52YWx1ZXMgYXJlIGNhbGN1bGF0ZWQsIG9uY2UsIHdoZW4gdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQ7IHRodXMsIGFcbm11dGFibGUgb2JqZWN0IHN1Y2ggYXMgYSBsaXN0IG9yIGRpY3Rpb25hcnkgdXNlZCBhcyBkZWZhdWx0IHZhbHVlIHdpbGxcbmJlIHNoYXJlZCBieSBhbGwgY2FsbHMgdGhhdCBkb25cJ3Qgc3BlY2lmeSBhbiBhcmd1bWVudCB2YWx1ZSBmb3IgdGhlXG5jb3JyZXNwb25kaW5nIHNsb3Q7IHRoaXMgc2hvdWxkIHVzdWFsbHkgYmUgYXZvaWRlZC4pICBJZiB0aGVyZSBhcmUgYW55XG51bmZpbGxlZCBzbG90cyBmb3Igd2hpY2ggbm8gZGVmYXVsdCB2YWx1ZSBpcyBzcGVjaWZpZWQsIGFcbmBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIE90aGVyd2lzZSwgdGhlIGxpc3Qgb2YgZmlsbGVkXG5zbG90cyBpcyB1c2VkIGFzIHRoZSBhcmd1bWVudCBsaXN0IGZvciB0aGUgY2FsbC5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgcHJvdmlkZVxuYnVpbHQtaW4gZnVuY3Rpb25zIHdob3NlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBuYW1lcywgZXZlblxuaWYgdGhleSBhcmUgXCduYW1lZFwnIGZvciB0aGUgcHVycG9zZSBvZiBkb2N1bWVudGF0aW9uLCBhbmQgd2hpY2hcbnRoZXJlZm9yZSBjYW5ub3QgYmUgc3VwcGxpZWQgYnkga2V5d29yZC4gIEluIENQeXRob24sIHRoaXMgaXMgdGhlIGNhc2VcbmZvciBmdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gQyB0aGF0IHVzZSBgYFB5QXJnX1BhcnNlVHVwbGUoKWBgIHRvXG5wYXJzZSB0aGVpciBhcmd1bWVudHMuXG5cbklmIHRoZXJlIGFyZSBtb3JlIHBvc2l0aW9uYWwgYXJndW1lbnRzIHRoYW4gdGhlcmUgYXJlIGZvcm1hbCBwYXJhbWV0ZXJcbnNsb3RzLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdW5sZXNzIGEgZm9ybWFsIHBhcmFtZXRlclxudXNpbmcgdGhlIHN5bnRheCBgYCppZGVudGlmaWVyYGAgaXMgcHJlc2VudDsgaW4gdGhpcyBjYXNlLCB0aGF0IGZvcm1hbFxucGFyYW1ldGVyIHJlY2VpdmVzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZXhjZXNzIHBvc2l0aW9uYWwgYXJndW1lbnRzXG4ob3IgYW4gZW1wdHkgdHVwbGUgaWYgdGhlcmUgd2VyZSBubyBleGNlc3MgcG9zaXRpb25hbCBhcmd1bWVudHMpLlxuXG5JZiBhbnkga2V5d29yZCBhcmd1bWVudCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEgZm9ybWFsIHBhcmFtZXRlclxubmFtZSwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQsIHVubGVzcyBhIGZvcm1hbCBwYXJhbWV0ZXJcbnVzaW5nIHRoZSBzeW50YXggYGAqKmlkZW50aWZpZXJgYCBpcyBwcmVzZW50OyBpbiB0aGlzIGNhc2UsIHRoYXRcbmZvcm1hbCBwYXJhbWV0ZXIgcmVjZWl2ZXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGV4Y2VzcyBrZXl3b3JkXG5hcmd1bWVudHMgKHVzaW5nIHRoZSBrZXl3b3JkcyBhcyBrZXlzIGFuZCB0aGUgYXJndW1lbnQgdmFsdWVzIGFzXG5jb3JyZXNwb25kaW5nIHZhbHVlcyksIG9yIGEgKG5ldykgZW1wdHkgZGljdGlvbmFyeSBpZiB0aGVyZSB3ZXJlIG5vXG5leGNlc3Mga2V5d29yZCBhcmd1bWVudHMuXG5cbklmIHRoZSBzeW50YXggYGAqZXhwcmVzc2lvbmBgIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG5gYGV4cHJlc3Npb25gYCBtdXN0IGV2YWx1YXRlIHRvIGFuIGl0ZXJhYmxlLiAgRWxlbWVudHMgZnJvbSB0aGlzXG5pdGVyYWJsZSBhcmUgdHJlYXRlZCBhcyBpZiB0aGV5IHdlcmUgYWRkaXRpb25hbCBwb3NpdGlvbmFsIGFyZ3VtZW50cztcbmlmIHRoZXJlIGFyZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLCAuLi4sICp4TiosIGFuZCBgYGV4cHJlc3Npb25gYFxuZXZhbHVhdGVzIHRvIGEgc2VxdWVuY2UgKnkxKiwgLi4uLCAqeU0qLCB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gYSBjYWxsXG53aXRoIE0rTiBwb3NpdGlvbmFsIGFyZ3VtZW50cyAqeDEqLCAuLi4sICp4TiosICp5MSosIC4uLiwgKnlNKi5cblxuQSBjb25zZXF1ZW5jZSBvZiB0aGlzIGlzIHRoYXQgYWx0aG91Z2ggdGhlIGBgKmV4cHJlc3Npb25gYCBzeW50YXggbWF5XG5hcHBlYXIgKmFmdGVyKiBzb21lIGtleXdvcmQgYXJndW1lbnRzLCBpdCBpcyBwcm9jZXNzZWQgKmJlZm9yZSogdGhlXG5rZXl3b3JkIGFyZ3VtZW50cyAoYW5kIHRoZSBgYCoqZXhwcmVzc2lvbmBgIGFyZ3VtZW50LCBpZiBhbnkgLS0gc2VlXG5iZWxvdykuICBTbzpcblxuICAgPj4+IGRlZiBmKGEsIGIpOlxuICAgLi4uICBwcmludCBhLCBiXG4gICAuLi5cbiAgID4+PiBmKGI9MSwgKigyLCkpXG4gICAyIDFcbiAgID4+PiBmKGE9MSwgKigyLCkpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbiAgIFR5cGVFcnJvcjogZigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgXCdhXCdcbiAgID4+PiBmKDEsICooMiwpKVxuICAgMSAyXG5cbkl0IGlzIHVudXN1YWwgZm9yIGJvdGgga2V5d29yZCBhcmd1bWVudHMgYW5kIHRoZSBgYCpleHByZXNzaW9uYGBcbnN5bnRheCB0byBiZSB1c2VkIGluIHRoZSBzYW1lIGNhbGwsIHNvIGluIHByYWN0aWNlIHRoaXMgY29uZnVzaW9uIGRvZXNcbm5vdCBhcmlzZS5cblxuSWYgdGhlIHN5bnRheCBgYCoqZXhwcmVzc2lvbmBgIGFwcGVhcnMgaW4gdGhlIGZ1bmN0aW9uIGNhbGwsXG5gYGV4cHJlc3Npb25gYCBtdXN0IGV2YWx1YXRlIHRvIGEgbWFwcGluZywgdGhlIGNvbnRlbnRzIG9mIHdoaWNoIGFyZVxudHJlYXRlZCBhcyBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzLiAgSW4gdGhlIGNhc2Ugb2YgYSBrZXl3b3JkXG5hcHBlYXJpbmcgaW4gYm90aCBgYGV4cHJlc3Npb25gYCBhbmQgYXMgYW4gZXhwbGljaXQga2V5d29yZCBhcmd1bWVudCxcbmEgYGBUeXBlRXJyb3JgYCBleGNlcHRpb24gaXMgcmFpc2VkLlxuXG5Gb3JtYWwgcGFyYW1ldGVycyB1c2luZyB0aGUgc3ludGF4IGBgKmlkZW50aWZpZXJgYCBvciBgYCoqaWRlbnRpZmllcmBgXG5jYW5ub3QgYmUgdXNlZCBhcyBwb3NpdGlvbmFsIGFyZ3VtZW50IHNsb3RzIG9yIGFzIGtleXdvcmQgYXJndW1lbnRcbm5hbWVzLiAgRm9ybWFsIHBhcmFtZXRlcnMgdXNpbmcgdGhlIHN5bnRheCBgYChzdWJsaXN0KWBgIGNhbm5vdCBiZVxudXNlZCBhcyBrZXl3b3JkIGFyZ3VtZW50IG5hbWVzOyB0aGUgb3V0ZXJtb3N0IHN1Ymxpc3QgY29ycmVzcG9uZHMgdG8gYVxuc2luZ2xlIHVubmFtZWQgYXJndW1lbnQgc2xvdCwgYW5kIHRoZSBhcmd1bWVudCB2YWx1ZSBpcyBhc3NpZ25lZCB0b1xudGhlIHN1Ymxpc3QgdXNpbmcgdGhlIHVzdWFsIHR1cGxlIGFzc2lnbm1lbnQgcnVsZXMgYWZ0ZXIgYWxsIG90aGVyXG5wYXJhbWV0ZXIgcHJvY2Vzc2luZyBpcyBkb25lLlxuXG5BIGNhbGwgYWx3YXlzIHJldHVybnMgc29tZSB2YWx1ZSwgcG9zc2libHkgYGBOb25lYGAsIHVubGVzcyBpdCByYWlzZXNcbmFuIGV4Y2VwdGlvbi4gIEhvdyB0aGlzIHZhbHVlIGlzIGNvbXB1dGVkIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlXG5jYWxsYWJsZSBvYmplY3QuXG5cbklmIGl0IGlzLS0tXG5cbmEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uOlxuICAgVGhlIGNvZGUgYmxvY2sgZm9yIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCwgcGFzc2luZyBpdCB0aGVcbiAgIGFyZ3VtZW50IGxpc3QuICBUaGUgZmlyc3QgdGhpbmcgdGhlIGNvZGUgYmxvY2sgd2lsbCBkbyBpcyBiaW5kIHRoZVxuICAgZm9ybWFsIHBhcmFtZXRlcnMgdG8gdGhlIGFyZ3VtZW50czsgdGhpcyBpcyBkZXNjcmliZWQgaW4gc2VjdGlvblxuICAgKkZ1bmN0aW9uIGRlZmluaXRpb25zKi4gIFdoZW4gdGhlIGNvZGUgYmxvY2sgZXhlY3V0ZXMgYSBgYHJldHVybmBgXG4gICBzdGF0ZW1lbnQsIHRoaXMgc3BlY2lmaWVzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGwuXG5cbmEgYnVpbHQtaW4gZnVuY3Rpb24gb3IgbWV0aG9kOlxuICAgVGhlIHJlc3VsdCBpcyB1cCB0byB0aGUgaW50ZXJwcmV0ZXI7IHNlZSAqQnVpbHQtaW4gRnVuY3Rpb25zKiBmb3JcbiAgIHRoZSBkZXNjcmlwdGlvbnMgb2YgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzLlxuXG5hIGNsYXNzIG9iamVjdDpcbiAgIEEgbmV3IGluc3RhbmNlIG9mIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQuXG5cbmEgY2xhc3MgaW5zdGFuY2UgbWV0aG9kOlxuICAgVGhlIGNvcnJlc3BvbmRpbmcgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCwgd2l0aCBhbiBhcmd1bWVudFxuICAgbGlzdCB0aGF0IGlzIG9uZSBsb25nZXIgdGhhbiB0aGUgYXJndW1lbnQgbGlzdCBvZiB0aGUgY2FsbDogdGhlXG4gICBpbnN0YW5jZSBiZWNvbWVzIHRoZSBmaXJzdCBhcmd1bWVudC5cblxuYSBjbGFzcyBpbnN0YW5jZTpcbiAgIFRoZSBjbGFzcyBtdXN0IGRlZmluZSBhIGBgX19jYWxsX18oKWBgIG1ldGhvZDsgdGhlIGVmZmVjdCBpcyB0aGVuXG4gICB0aGUgc2FtZSBhcyBpZiB0aGF0IG1ldGhvZCB3YXMgY2FsbGVkLlxuJywKKyAnY2xhc3MnOiAnXG5DbGFzcyBkZWZpbml0aW9uc1xuKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBkZWZpbml0aW9uIGRlZmluZXMgYSBjbGFzcyBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmRcbnR5cGUgaGllcmFyY2h5Kik6XG5cbiAgIGNsYXNzZGVmICAgIDo6PSAiY2xhc3MiIGNsYXNzbmFtZSBbaW5oZXJpdGFuY2VdICI6IiBzdWl0ZVxuICAgaW5oZXJpdGFuY2UgOjo9ICIoIiBbZXhwcmVzc2lvbl9saXN0XSAiKSJcbiAgIGNsYXNzbmFtZSAgIDo6PSBpZGVudGlmaWVyXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudC4gIEl0IGZpcnN0IGV2YWx1YXRlcyB0aGVcbmluaGVyaXRhbmNlIGxpc3QsIGlmIHByZXNlbnQuICBFYWNoIGl0ZW0gaW4gdGhlIGluaGVyaXRhbmNlIGxpc3RcbnNob3VsZCBldmFsdWF0ZSB0byBhIGNsYXNzIG9iamVjdCBvciBjbGFzcyB0eXBlIHdoaWNoIGFsbG93c1xuc3ViY2xhc3NpbmcuICBUaGUgY2xhc3NcJ3Mgc3VpdGUgaXMgdGhlbiBleGVjdXRlZCBpbiBhIG5ldyBleGVjdXRpb25cbmZyYW1lIChzZWUgc2VjdGlvbiAqTmFtaW5nIGFuZCBiaW5kaW5nKiksIHVzaW5nIGEgbmV3bHkgY3JlYXRlZCBsb2NhbFxubmFtZXNwYWNlIGFuZCB0aGUgb3JpZ2luYWwgZ2xvYmFsIG5hbWVzcGFjZS4gKFVzdWFsbHksIHRoZSBzdWl0ZVxuY29udGFpbnMgb25seSBmdW5jdGlvbiBkZWZpbml0aW9ucy4pICBXaGVuIHRoZSBjbGFzc1wncyBzdWl0ZSBmaW5pc2hlc1xuZXhlY3V0aW9uLCBpdHMgZXhlY3V0aW9uIGZyYW1lIGlzIGRpc2NhcmRlZCBidXQgaXRzIGxvY2FsIG5hbWVzcGFjZSBpc1xuc2F2ZWQuIFs0XSBBIGNsYXNzIG9iamVjdCBpcyB0aGVuIGNyZWF0ZWQgdXNpbmcgdGhlIGluaGVyaXRhbmNlIGxpc3RcbmZvciB0aGUgYmFzZSBjbGFzc2VzIGFuZCB0aGUgc2F2ZWQgbG9jYWwgbmFtZXNwYWNlIGZvciB0aGUgYXR0cmlidXRlXG5kaWN0aW9uYXJ5LiAgVGhlIGNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhpcyBjbGFzcyBvYmplY3QgaW4gdGhlXG5vcmlnaW5hbCBsb2NhbCBuYW1lc3BhY2UuXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIFZhcmlhYmxlcyBkZWZpbmVkIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uIGFyZVxuY2xhc3MgdmFyaWFibGVzOyB0aGV5IGFyZSBzaGFyZWQgYnkgYWxsIGluc3RhbmNlcy4gIFRvIGNyZWF0ZSBpbnN0YW5jZVxudmFyaWFibGVzLCB0aGV5IGNhbiBiZSBzZXQgaW4gYSBtZXRob2Qgd2l0aCBgYHNlbGYubmFtZSA9IHZhbHVlYGAuXG5Cb3RoIGNsYXNzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUgbm90YXRpb25cbiJgYHNlbGYubmFtZWBgIiwgYW5kIGFuIGluc3RhbmNlIHZhcmlhYmxlIGhpZGVzIGEgY2xhc3MgdmFyaWFibGUgd2l0aFxudGhlIHNhbWUgbmFtZSB3aGVuIGFjY2Vzc2VkIGluIHRoaXMgd2F5LiBDbGFzcyB2YXJpYWJsZXMgY2FuIGJlIHVzZWRcbmFzIGRlZmF1bHRzIGZvciBpbnN0YW5jZSB2YXJpYWJsZXMsIGJ1dCB1c2luZyBtdXRhYmxlIHZhbHVlcyB0aGVyZSBjYW5cbmxlYWQgdG8gdW5leHBlY3RlZCByZXN1bHRzLiAgRm9yICpuZXctc3R5bGUgY2xhc3MqZXMsIGRlc2NyaXB0b3JzIGNhblxuYmUgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2UgdmFyaWFibGVzIHdpdGggZGlmZmVyZW50IGltcGxlbWVudGF0aW9uXG5kZXRhaWxzLlxuXG5DbGFzcyBkZWZpbml0aW9ucywgbGlrZSBmdW5jdGlvbiBkZWZpbml0aW9ucywgbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yXG5tb3JlICpkZWNvcmF0b3IqIGV4cHJlc3Npb25zLiAgVGhlIGV2YWx1YXRpb24gcnVsZXMgZm9yIHRoZSBkZWNvcmF0b3JcbmV4cHJlc3Npb25zIGFyZSB0aGUgc2FtZSBhcyBmb3IgZnVuY3Rpb25zLiAgVGhlIHJlc3VsdCBtdXN0IGJlIGEgY2xhc3Ncbm9iamVjdCwgd2hpY2ggaXMgdGhlbiBib3VuZCB0byB0aGUgY2xhc3MgbmFtZS5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGUgZXhjZXB0aW9uIGlzIHByb3BhZ2F0ZWQgdG8gdGhlIGludm9jYXRpb24gc3RhY2sgdW5sZXNzIHRoZXJlXG4gICAgaXMgYSBgYGZpbmFsbHlgYCBjbGF1c2Ugd2hpY2ggaGFwcGVucyB0byByYWlzZSBhbm90aGVyIGV4Y2VwdGlvbi5cbiAgICBUaGF0IG5ldyBleGNlcHRpb24gY2F1c2VzIHRoZSBvbGQgb25lIHRvIGJlIGxvc3QuXG5cblsyXSBDdXJyZW50bHksIGNvbnRyb2wgImZsb3dzIG9mZiB0aGUgZW5kIiBleGNlcHQgaW4gdGhlIGNhc2Ugb2YgYW5cbiAgICBleGNlcHRpb24gb3IgdGhlIGV4ZWN1dGlvbiBvZiBhIGBgcmV0dXJuYGAsIGBgY29udGludWVgYCwgb3JcbiAgICBgYGJyZWFrYGAgc3RhdGVtZW50LlxuXG5bM10gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgZnVuY3Rpb25cbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIGZ1bmN0aW9uXCdzIGBgX19kb2NfX2BgIGF0dHJpYnV0ZSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uXCdzICpkb2NzdHJpbmcqLlxuXG5bNF0gQSBzdHJpbmcgbGl0ZXJhbCBhcHBlYXJpbmcgYXMgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiB0aGUgY2xhc3NcbiAgICBib2R5IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG5hbWVzcGFjZVwncyBgYF9fZG9jX19gYCBpdGVtIGFuZFxuICAgIHRoZXJlZm9yZSB0aGUgY2xhc3NcJ3MgKmRvY3N0cmluZyouXG4nLAorICdjb21wYXJpc29ucyc6ICdcbkNvbXBhcmlzb25zXG4qKioqKioqKioqKlxuXG5Vbmxpa2UgQywgYWxsIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpbiBQeXRob24gaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSxcbndoaWNoIGlzIGxvd2VyIHRoYW4gdGhhdCBvZiBhbnkgYXJpdGhtZXRpYywgc2hpZnRpbmcgb3IgYml0d2lzZVxub3BlcmF0aW9uLiAgQWxzbyB1bmxpa2UgQywgZXhwcmVzc2lvbnMgbGlrZSBgYGEgPCBiIDwgY2BgIGhhdmUgdGhlXG5pbnRlcnByZXRhdGlvbiB0aGF0IGlzIGNvbnZlbnRpb25hbCBpbiBtYXRoZW1hdGljczpcblxuICAgY29tcGFyaXNvbiAgICA6Oj0gb3JfZXhwciAoIGNvbXBfb3BlcmF0b3Igb3JfZXhwciApKlxuICAgY29tcF9vcGVyYXRvciA6Oj0gIjwiIHwgIj4iIHwgIj09IiB8ICI+PSIgfCAiPD0iIHwgIjw+IiB8ICIhPSJcbiAgICAgICAgICAgICAgICAgICAgIHwgImlzIiBbIm5vdCJdIHwgWyJub3QiXSAiaW4iXG5cbkNvbXBhcmlzb25zIHlpZWxkIGJvb2xlYW4gdmFsdWVzOiBgYFRydWVgYCBvciBgYEZhbHNlYGAuXG5cbkNvbXBhcmlzb25zIGNhbiBiZSBjaGFpbmVkIGFyYml0cmFyaWx5LCBlLmcuLCBgYHggPCB5IDw9IHpgYCBpc1xuZXF1aXZhbGVudCB0byBgYHggPCB5IGFuZCB5IDw9IHpgYCwgZXhjZXB0IHRoYXQgYGB5YGAgaXMgZXZhbHVhdGVkXG5vbmx5IG9uY2UgKGJ1dCBpbiBib3RoIGNhc2VzIGBgemBgIGlzIG5vdCBldmFsdWF0ZWQgYXQgYWxsIHdoZW4gYGB4IDxcbnlgYCBpcyBmb3VuZCB0byBiZSBmYWxzZSkuXG5cbkZvcm1hbGx5LCBpZiAqYSosICpiKiwgKmMqLCAuLi4sICp5KiwgKnoqIGFyZSBleHByZXNzaW9ucyBhbmQgKm9wMSosXG4qb3AyKiwgLi4uLCAqb3BOKiBhcmUgY29tcGFyaXNvbiBvcGVyYXRvcnMsIHRoZW4gYGBhIG9wMSBiIG9wMiBjIC4uLiB5XG5vcE4gemBgIGlzIGVxdWl2YWxlbnQgdG8gYGBhIG9wMSBiIGFuZCBiIG9wMiBjIGFuZCAuLi4geSBvcE4gemBgLFxuZXhjZXB0IHRoYXQgZWFjaCBleHByZXNzaW9uIGlzIGV2YWx1YXRlZCBhdCBtb3N0IG9uY2UuXG5cbk5vdGUgdGhhdCBgYGEgb3AxIGIgb3AyIGNgYCBkb2VzblwndCBpbXBseSBhbnkga2luZCBvZiBjb21wYXJpc29uXG5iZXR3ZWVuICphKiBhbmQgKmMqLCBzbyB0aGF0LCBlLmcuLCBgYHggPCB5ID4gemBgIGlzIHBlcmZlY3RseSBsZWdhbFxuKHRob3VnaCBwZXJoYXBzIG5vdCBwcmV0dHkpLlxuXG5UaGUgZm9ybXMgYGA8PmBgIGFuZCBgYCE9YGAgYXJlIGVxdWl2YWxlbnQ7IGZvciBjb25zaXN0ZW5jeSB3aXRoIEMsXG5gYCE9YGAgaXMgcHJlZmVycmVkOyB3aGVyZSBgYCE9YGAgaXMgbWVudGlvbmVkIGJlbG93IGBgPD5gYCBpcyBhbHNvXG5hY2NlcHRlZC4gIFRoZSBgYDw+YGAgc3BlbGxpbmcgaXMgY29uc2lkZXJlZCBvYnNvbGVzY2VudC5cblxuVGhlIG9wZXJhdG9ycyBgYDxgYCwgYGA+YGAsIGBgPT1gYCwgYGA+PWBgLCBgYDw9YGAsIGFuZCBgYCE9YGAgY29tcGFyZVxudGhlIHZhbHVlcyBvZiB0d28gb2JqZWN0cy4gIFRoZSBvYmplY3RzIG5lZWQgbm90IGhhdmUgdGhlIHNhbWUgdHlwZS5cbklmIGJvdGggYXJlIG51bWJlcnMsIHRoZXkgYXJlIGNvbnZlcnRlZCB0byBhIGNvbW1vbiB0eXBlLiAgT3RoZXJ3aXNlLFxub2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgKmFsd2F5cyogY29tcGFyZSB1bmVxdWFsLCBhbmQgYXJlIG9yZGVyZWRcbmNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuIFlvdSBjYW4gY29udHJvbCBjb21wYXJpc29uIGJlaGF2aW9yIG9mXG5vYmplY3RzIG9mIG5vbi1idWlsdC1pbiB0eXBlcyBieSBkZWZpbmluZyBhIGBgX19jbXBfX2BgIG1ldGhvZCBvciByaWNoXG5jb21wYXJpc29uIG1ldGhvZHMgbGlrZSBgYF9fZ3RfX2BgLCBkZXNjcmliZWQgaW4gc2VjdGlvbiAqU3BlY2lhbFxubWV0aG9kIG5hbWVzKi5cblxuKFRoaXMgdW51c3VhbCBkZWZpbml0aW9uIG9mIGNvbXBhcmlzb24gd2FzIHVzZWQgdG8gc2ltcGxpZnkgdGhlXG5kZWZpbml0aW9uIG9mIG9wZXJhdGlvbnMgbGlrZSBzb3J0aW5nIGFuZCB0aGUgYGBpbmBgIGFuZCBgYG5vdCBpbmBgXG5vcGVyYXRvcnMuIEluIHRoZSBmdXR1cmUsIHRoZSBjb21wYXJpc29uIHJ1bGVzIGZvciBvYmplY3RzIG9mXG5kaWZmZXJlbnQgdHlwZXMgYXJlIGxpa2VseSB0byBjaGFuZ2UuKVxuXG5Db21wYXJpc29uIG9mIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZSBkZXBlbmRzIG9uIHRoZSB0eXBlOlxuXG4qIE51bWJlcnMgYXJlIGNvbXBhcmVkIGFyaXRobWV0aWNhbGx5LlxuXG4qIFN0cmluZ3MgYXJlIGNvbXBhcmVkIGxleGljb2dyYXBoaWNhbGx5IHVzaW5nIHRoZSBudW1lcmljIGVxdWl2YWxlbnRzXG4gICh0aGUgcmVzdWx0IG9mIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYG9yZCgpYGApIG9mIHRoZWlyIGNoYXJhY3RlcnMuXG4gIFVuaWNvZGUgYW5kIDgtYml0IHN0cmluZ3MgYXJlIGZ1bGx5IGludGVyb3BlcmFibGUgaW4gdGhpcyBiZWhhdmlvci5cbiAgWzRdXG5cbiogVHVwbGVzIGFuZCBsaXN0cyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgY29tcGFyaXNvbiBvZlxuICBjb3JyZXNwb25kaW5nIGVsZW1lbnRzLiAgVGhpcyBtZWFucyB0aGF0IHRvIGNvbXBhcmUgZXF1YWwsIGVhY2hcbiAgZWxlbWVudCBtdXN0IGNvbXBhcmUgZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWVcbiAgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZSBsZW5ndGguXG5cbiAgSWYgbm90IGVxdWFsLCB0aGUgc2VxdWVuY2VzIGFyZSBvcmRlcmVkIHRoZSBzYW1lIGFzIHRoZWlyIGZpcnN0XG4gIGRpZmZlcmluZyBlbGVtZW50cy4gIEZvciBleGFtcGxlLCBgYGNtcChbMSwyLHhdLCBbMSwyLHldKWBgIHJldHVybnNcbiAgdGhlIHNhbWUgYXMgYGBjbXAoeCx5KWBgLiAgSWYgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBkb2VzIG5vdFxuICBleGlzdCwgdGhlIHNob3J0ZXIgc2VxdWVuY2UgaXMgb3JkZXJlZCBmaXJzdCAoZm9yIGV4YW1wbGUsIGBgWzEsMl0gPFxuICBbMSwyLDNdYGApLlxuXG4qIE1hcHBpbmdzIChkaWN0aW9uYXJpZXMpIGNvbXBhcmUgZXF1YWwgaWYgYW5kIG9ubHkgaWYgdGhlaXIgc29ydGVkXG4gIChrZXksIHZhbHVlKSBsaXN0cyBjb21wYXJlIGVxdWFsLiBbNV0gT3V0Y29tZXMgb3RoZXIgdGhhbiBlcXVhbGl0eVxuICBhcmUgcmVzb2x2ZWQgY29uc2lzdGVudGx5LCBidXQgYXJlIG5vdCBvdGhlcndpc2UgZGVmaW5lZC4gWzZdXG5cbiogTW9zdCBvdGhlciBvYmplY3RzIG9mIGJ1aWx0LWluIHR5cGVzIGNvbXBhcmUgdW5lcXVhbCB1bmxlc3MgdGhleSBhcmVcbiAgdGhlIHNhbWUgb2JqZWN0OyB0aGUgY2hvaWNlIHdoZXRoZXIgb25lIG9iamVjdCBpcyBjb25zaWRlcmVkIHNtYWxsZXJcbiAgb3IgbGFyZ2VyIHRoYW4gYW5vdGhlciBvbmUgaXMgbWFkZSBhcmJpdHJhcmlseSBidXQgY29uc2lzdGVudGx5XG4gIHdpdGhpbiBvbmUgZXhlY3V0aW9uIG9mIGEgcHJvZ3JhbS5cblxuVGhlIG9wZXJhdG9ycyBgYGluYGAgYW5kIGBgbm90IGluYGAgdGVzdCBmb3IgY29sbGVjdGlvbiBtZW1iZXJzaGlwLlxuYGB4IGluIHNgYCBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiAqeCogaXMgYSBtZW1iZXIgb2YgdGhlIGNvbGxlY3Rpb24gKnMqLFxuYW5kIGZhbHNlIG90aGVyd2lzZS4gIGBgeCBub3QgaW4gc2BgIHJldHVybnMgdGhlIG5lZ2F0aW9uIG9mIGBgeCBpblxuc2BgLiBUaGUgY29sbGVjdGlvbiBtZW1iZXJzaGlwIHRlc3QgaGFzIHRyYWRpdGlvbmFsbHkgYmVlbiBib3VuZCB0b1xuc2VxdWVuY2VzOyBhbiBvYmplY3QgaXMgYSBtZW1iZXIgb2YgYSBjb2xsZWN0aW9uIGlmIHRoZSBjb2xsZWN0aW9uIGlzXG5hIHNlcXVlbmNlIGFuZCBjb250YWlucyBhbiBlbGVtZW50IGVxdWFsIHRvIHRoYXQgb2JqZWN0LiAgSG93ZXZlciwgaXRcbm1ha2Ugc2Vuc2UgZm9yIG1hbnkgb3RoZXIgb2JqZWN0IHR5cGVzIHRvIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0c1xud2l0aG91dCBiZWluZyBhIHNlcXVlbmNlLiAgSW4gcGFydGljdWxhciwgZGljdGlvbmFyaWVzIChmb3Iga2V5cykgYW5kXG5zZXRzIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0aW5nLlxuXG5Gb3IgdGhlIGxpc3QgYW5kIHR1cGxlIHR5cGVzLCBgYHggaW4geWBgIGlzIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlcmVcbmV4aXN0cyBhbiBpbmRleCAqaSogc3VjaCB0aGF0IGBgeCA9PSB5W2ldYGAgaXMgdHJ1ZS5cblxuRm9yIHRoZSBVbmljb2RlIGFuZCBzdHJpbmcgdHlwZXMsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZlxuKngqIGlzIGEgc3Vic3RyaW5nIG9mICp5Ki4gIEFuIGVxdWl2YWxlbnQgdGVzdCBpcyBgYHkuZmluZCh4KSAhPSAtMWBgLlxuTm90ZSwgKngqIGFuZCAqeSogbmVlZCBub3QgYmUgdGhlIHNhbWUgdHlwZTsgY29uc2VxdWVudGx5LCBgYHVcJ2FiXCcgaW5cblwnYWJjXCdgYCB3aWxsIHJldHVybiBgYFRydWVgYC4gRW1wdHkgc3RyaW5ncyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgdG9cbmJlIGEgc3Vic3RyaW5nIG9mIGFueSBvdGhlciBzdHJpbmcsIHNvIGBgIiIgaW4gImFiYyJgYCB3aWxsIHJldHVyblxuYGBUcnVlYGAuXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksICp4KiB3YXMgcmVxdWlyZWQgdG8gYmUgYSBzdHJpbmcgb2Zcbmxlbmd0aCBgYDFgYC5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGUgYGBfX2NvbnRhaW5zX18oKWBgIG1ldGhvZCxcbmBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiBgYHkuX19jb250YWluc19fKHgpYGAgaXMgdHJ1ZS5cblxuRm9yIHVzZXItZGVmaW5lZCBjbGFzc2VzIHdoaWNoIGRvIG5vdCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgIGJ1dCBkb1xuZGVmaW5lIGBgX19pdGVyX18oKWBgLCBgYHggaW4geWBgIGlzIHRydWUgaWYgc29tZSB2YWx1ZSBgYHpgYCB3aXRoIGBgeFxuPT0gemBgIGlzIHByb2R1Y2VkIHdoaWxlIGl0ZXJhdGluZyBvdmVyIGBgeWBgLiAgSWYgYW4gZXhjZXB0aW9uIGlzXG5yYWlzZWQgZHVyaW5nIHRoZSBpdGVyYXRpb24sIGl0IGlzIGFzIGlmIGBgaW5gYCByYWlzZWQgdGhhdCBleGNlcHRpb24uXG5cbkxhc3RseSwgdGhlIG9sZC1zdHlsZSBpdGVyYXRpb24gcHJvdG9jb2wgaXMgdHJpZWQ6IGlmIGEgY2xhc3MgZGVmaW5lc1xuYGBfX2dldGl0ZW1fXygpYGAsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZSBpcyBhIG5vbi1cbm5lZ2F0aXZlIGludGVnZXIgaW5kZXggKmkqIHN1Y2ggdGhhdCBgYHggPT0geVtpXWBgLCBhbmQgYWxsIGxvd2VyXG5pbnRlZ2VyIGluZGljZXMgZG8gbm90IHJhaXNlIGBgSW5kZXhFcnJvcmBgIGV4Y2VwdGlvbi4gKElmIGFueSBvdGhlclxuZXhjZXB0aW9uIGlzIHJhaXNlZCwgaXQgaXMgYXMgaWYgYGBpbmBgIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbikuXG5cblRoZSBvcGVyYXRvciBgYG5vdCBpbmBgIGlzIGRlZmluZWQgdG8gaGF2ZSB0aGUgaW52ZXJzZSB0cnVlIHZhbHVlIG9mXG5gYGluYGAuXG5cblRoZSBvcGVyYXRvcnMgYGBpc2BgIGFuZCBgYGlzIG5vdGBgIHRlc3QgZm9yIG9iamVjdCBpZGVudGl0eTogYGB4IGlzXG55YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiAqeCogYW5kICp5KiBhcmUgdGhlIHNhbWUgb2JqZWN0LiAgYGB4IGlzXG5ub3QgeWBgIHlpZWxkcyB0aGUgaW52ZXJzZSB0cnV0aCB2YWx1ZS4gWzddXG4nLAorICdjb21wb3VuZCc6ICdcbkNvbXBvdW5kIHN0YXRlbWVudHNcbioqKioqKioqKioqKioqKioqKipcblxuQ29tcG91bmQgc3RhdGVtZW50cyBjb250YWluIChncm91cHMgb2YpIG90aGVyIHN0YXRlbWVudHM7IHRoZXkgYWZmZWN0XG5vciBjb250cm9sIHRoZSBleGVjdXRpb24gb2YgdGhvc2Ugb3RoZXIgc3RhdGVtZW50cyBpbiBzb21lIHdheS4gIEluXG5nZW5lcmFsLCBjb21wb3VuZCBzdGF0ZW1lbnRzIHNwYW4gbXVsdGlwbGUgbGluZXMsIGFsdGhvdWdoIGluIHNpbXBsZVxuaW5jYXJuYXRpb25zIGEgd2hvbGUgY29tcG91bmQgc3RhdGVtZW50IG1heSBiZSBjb250YWluZWQgaW4gb25lIGxpbmUuXG5cblRoZSBgYGlmYGAsIGBgd2hpbGVgYCBhbmQgYGBmb3JgYCBzdGF0ZW1lbnRzIGltcGxlbWVudCB0cmFkaXRpb25hbFxuY29udHJvbCBmbG93IGNvbnN0cnVjdHMuICBgYHRyeWBgIHNwZWNpZmllcyBleGNlcHRpb24gaGFuZGxlcnMgYW5kL29yXG5jbGVhbnVwIGNvZGUgZm9yIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cy4gIEZ1bmN0aW9uIGFuZCBjbGFzc1xuZGVmaW5pdGlvbnMgYXJlIGFsc28gc3ludGFjdGljYWxseSBjb21wb3VuZCBzdGF0ZW1lbnRzLlxuXG5Db21wb3VuZCBzdGF0ZW1lbnRzIGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgXCdjbGF1c2VzLlwnICBBIGNsYXVzZVxuY29uc2lzdHMgb2YgYSBoZWFkZXIgYW5kIGEgXCdzdWl0ZS5cJyAgVGhlIGNsYXVzZSBoZWFkZXJzIG9mIGFcbnBhcnRpY3VsYXIgY29tcG91bmQgc3RhdGVtZW50IGFyZSBhbGwgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwuXG5FYWNoIGNsYXVzZSBoZWFkZXIgYmVnaW5zIHdpdGggYSB1bmlxdWVseSBpZGVudGlmeWluZyBrZXl3b3JkIGFuZCBlbmRzXG53aXRoIGEgY29sb24uICBBIHN1aXRlIGlzIGEgZ3JvdXAgb2Ygc3RhdGVtZW50cyBjb250cm9sbGVkIGJ5IGFcbmNsYXVzZS4gIEEgc3VpdGUgY2FuIGJlIG9uZSBvciBtb3JlIHNlbWljb2xvbi1zZXBhcmF0ZWQgc2ltcGxlXG5zdGF0ZW1lbnRzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGhlYWRlciwgZm9sbG93aW5nIHRoZSBoZWFkZXJcJ3NcbmNvbG9uLCBvciBpdCBjYW4gYmUgb25lIG9yIG1vcmUgaW5kZW50ZWQgc3RhdGVtZW50cyBvbiBzdWJzZXF1ZW50XG5saW5lcy4gIE9ubHkgdGhlIGxhdHRlciBmb3JtIG9mIHN1aXRlIGNhbiBjb250YWluIG5lc3RlZCBjb21wb3VuZFxuc3RhdGVtZW50czsgdGhlIGZvbGxvd2luZyBpcyBpbGxlZ2FsLCBtb3N0bHkgYmVjYXVzZSBpdCB3b3VsZG5cJ3QgYmVcbmNsZWFyIHRvIHdoaWNoIGBgaWZgYCBjbGF1c2UgYSBmb2xsb3dpbmcgYGBlbHNlYGAgY2xhdXNlIHdvdWxkIGJlbG9uZzpcblxuICAgaWYgdGVzdDE6IGlmIHRlc3QyOiBwcmludCB4XG5cbkFsc28gbm90ZSB0aGF0IHRoZSBzZW1pY29sb24gYmluZHMgdGlnaHRlciB0aGFuIHRoZSBjb2xvbiBpbiB0aGlzXG5jb250ZXh0LCBzbyB0aGF0IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgZWl0aGVyIGFsbCBvciBub25lIG9mIHRoZVxuYGBwcmludGBgIHN0YXRlbWVudHMgYXJlIGV4ZWN1dGVkOlxuXG4gICBpZiB4IDwgeSA8IHo6IHByaW50IHg7IHByaW50IHk7IHByaW50IHpcblxuU3VtbWFyaXppbmc6XG5cbiAgIGNvbXBvdW5kX3N0bXQgOjo9IGlmX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgd2hpbGVfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCBmb3Jfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB0cnlfc3RtdFxuICAgICAgICAgICAgICAgICAgICAgfCB3aXRoX3N0bXRcbiAgICAgICAgICAgICAgICAgICAgIHwgZnVuY2RlZlxuICAgICAgICAgICAgICAgICAgICAgfCBjbGFzc2RlZlxuICAgICAgICAgICAgICAgICAgICAgfCBkZWNvcmF0ZWRcbiAgIHN1aXRlICAgICAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgTkVXTElORSBJTkRFTlQgc3RhdGVtZW50KyBERURFTlRcbiAgIHN0YXRlbWVudCAgICAgOjo9IHN0bXRfbGlzdCBORVdMSU5FIHwgY29tcG91bmRfc3RtdFxuICAgc3RtdF9saXN0ICAgICA6Oj0gc2ltcGxlX3N0bXQgKCI7IiBzaW1wbGVfc3RtdCkqIFsiOyJdXG5cbk5vdGUgdGhhdCBzdGF0ZW1lbnRzIGFsd2F5cyBlbmQgaW4gYSBgYE5FV0xJTkVgYCBwb3NzaWJseSBmb2xsb3dlZCBieVxuYSBgYERFREVOVGBgLiBBbHNvIG5vdGUgdGhhdCBvcHRpb25hbCBjb250aW51YXRpb24gY2xhdXNlcyBhbHdheXNcbmJlZ2luIHdpdGggYSBrZXl3b3JkIHRoYXQgY2Fubm90IHN0YXJ0IGEgc3RhdGVtZW50LCB0aHVzIHRoZXJlIGFyZSBub1xuYW1iaWd1aXRpZXMgKHRoZSBcJ2RhbmdsaW5nIGBgZWxzZWBgXCcgcHJvYmxlbSBpcyBzb2x2ZWQgaW4gUHl0aG9uIGJ5XG5yZXF1aXJpbmcgbmVzdGVkIGBgaWZgYCBzdGF0ZW1lbnRzIHRvIGJlIGluZGVudGVkKS5cblxuVGhlIGZvcm1hdHRpbmcgb2YgdGhlIGdyYW1tYXIgcnVsZXMgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucyBwbGFjZXNcbmVhY2ggY2xhdXNlIG9uIGEgc2VwYXJhdGUgbGluZSBmb3IgY2xhcml0eS5cblxuXG5UaGUgYGBpZmBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuXG5cblRoZSBgYHdoaWxlYGAgc3RhdGVtZW50XG49PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYGB3aGlsZWBgIHN0YXRlbWVudCBpcyB1c2VkIGZvciByZXBlYXRlZCBleGVjdXRpb24gYXMgbG9uZyBhcyBhblxuZXhwcmVzc2lvbiBpcyB0cnVlOlxuXG4gICB3aGlsZV9zdG10IDo6PSAid2hpbGUiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhpcyByZXBlYXRlZGx5IHRlc3RzIHRoZSBleHByZXNzaW9uIGFuZCwgaWYgaXQgaXMgdHJ1ZSwgZXhlY3V0ZXMgdGhlXG5maXJzdCBzdWl0ZTsgaWYgdGhlIGV4cHJlc3Npb24gaXMgZmFsc2UgKHdoaWNoIG1heSBiZSB0aGUgZmlyc3QgdGltZVxuaXQgaXMgdGVzdGVkKSB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWYgcHJlc2VudCwgaXNcbmV4ZWN1dGVkIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzLlxuXG5BIGBgYnJlYWtgYCBzdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHRlcm1pbmF0ZXMgdGhlIGxvb3BcbndpdGhvdXQgZXhlY3V0aW5nIHRoZSBgYGVsc2VgYCBjbGF1c2VcJ3Mgc3VpdGUuICBBIGBgY29udGludWVgYFxuc3RhdGVtZW50IGV4ZWN1dGVkIGluIHRoZSBmaXJzdCBzdWl0ZSBza2lwcyB0aGUgcmVzdCBvZiB0aGUgc3VpdGUgYW5kXG5nb2VzIGJhY2sgdG8gdGVzdGluZyB0aGUgZXhwcmVzc2lvbi5cblxuXG5UaGUgYGBmb3JgYCBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PVxuXG5UaGUgYGBmb3JgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGFcbnNlcXVlbmNlIChzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuYGBleHByZXNzaW9uX2xpc3RgYC4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbVxucHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgb2YgYXNjZW5kaW5nIGluZGljZXMuICBFYWNoXG5pdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuZm9yIGFzc2lnbm1lbnRzLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXMgZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmVcbmV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgZW1wdHkpLCB0aGUgc3VpdGVcbmluIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgYGBicmVha2BgIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZVwncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmRcbmNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlIGBgZWxzZWBgIGNsYXVzZSBpZiB0aGVyZSB3YXNcbm5vIG5leHQgaXRlbS5cblxuVGhlIHN1aXRlIG1heSBhc3NpZ24gdG8gdGhlIHZhcmlhYmxlKHMpIGluIHRoZSB0YXJnZXQgbGlzdDsgdGhpcyBkb2VzXG5ub3QgYWZmZWN0IHRoZSBuZXh0IGl0ZW0gYXNzaWduZWQgdG8gaXQuXG5cblRoZSB0YXJnZXQgbGlzdCBpcyBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLCBidXQgaWYgdGhlXG5zZXF1ZW5jZSBpcyBlbXB0eSwgaXQgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0IGFsbCBieSB0aGVcbmxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGByYW5nZSgpYGAgcmV0dXJucyBhIHNlcXVlbmNlIG9mXG5pbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzIGBgZm9yIGkgOj0gYSB0byBiXG5kb2BgOyBlLmcuLCBgYHJhbmdlKDMpYGAgcmV0dXJucyB0aGUgbGlzdCBgYFswLCAxLCAyXWBgLlxuXG5Ob3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZSBsb29wXG4gICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuIEFuIGludGVybmFsXG4gIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LCBhbmQgdGhpc1xuICBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhcyByZWFjaGVkIHRoZVxuICBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlXG4gIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGUgc2VxdWVuY2UsXG4gIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCBvZiB0aGVcbiAgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgdGhlXG4gIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbiAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbiAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG5cbiAgICAgZm9yIHggaW4gYVs6XTpcbiAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuXG5cblRoZSBgYHRyeWBgIHN0YXRlbWVudFxuPT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBgYHRyeWBgIHN0YXRlbWVudCBzcGVjaWZpZXMgZXhjZXB0aW9uIGhhbmRsZXJzIGFuZC9vciBjbGVhbnVwIGNvZGVcbmZvciBhIGdyb3VwIG9mIHN0YXRlbWVudHM6XG5cbiAgIHRyeV9zdG10ICA6Oj0gdHJ5MV9zdG10IHwgdHJ5Ml9zdG10XG4gICB0cnkxX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAoImV4Y2VwdCIgW2V4cHJlc3Npb24gWygiYXMiIHwgIiwiKSB0YXJnZXRdXSAiOiIgc3VpdGUpK1xuICAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cbiAgICAgICAgICAgICAgICAgWyJmaW5hbGx5IiAiOiIgc3VpdGVdXG4gICB0cnkyX3N0bXQgOjo9ICJ0cnkiICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgICAiZmluYWxseSIgIjoiIHN1aXRlXG5cbkNoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFB5dGhvbixcbmBgdHJ5YGAuLi5gYGV4Y2VwdGBgLi4uYGBmaW5hbGx5YGAgZGlkIG5vdCB3b3JrLiBgYHRyeWBgLi4uYGBleGNlcHRgYFxuaGFkIHRvIGJlIG5lc3RlZCBpbiBgYHRyeWBgLi4uYGBmaW5hbGx5YGAuXG5cblRoZSBgYGV4Y2VwdGBgIGNsYXVzZShzKSBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4Y2VwdGlvbiBoYW5kbGVycy4gV2hlblxubm8gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgYGB0cnlgYCBjbGF1c2UsIG5vIGV4Y2VwdGlvbiBoYW5kbGVyIGlzXG5leGVjdXRlZC4gV2hlbiBhbiBleGNlcHRpb24gb2NjdXJzIGluIHRoZSBgYHRyeWBgIHN1aXRlLCBhIHNlYXJjaCBmb3JcbmFuIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIHN0YXJ0ZWQuICBUaGlzIHNlYXJjaCBpbnNwZWN0cyB0aGUgZXhjZXB0XG5jbGF1c2VzIGluIHR1cm4gdW50aWwgb25lIGlzIGZvdW5kIHRoYXQgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLiAgQW5cbmV4cHJlc3Npb24tbGVzcyBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBtdXN0IGJlIGxhc3Q7IGl0IG1hdGNoZXNcbmFueSBleGNlcHRpb24uICBGb3IgYW4gZXhjZXB0IGNsYXVzZSB3aXRoIGFuIGV4cHJlc3Npb24sIHRoYXRcbmV4cHJlc3Npb24gaXMgZXZhbHVhdGVkLCBhbmQgdGhlIGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24gaWYgdGhlXG5yZXN1bHRpbmcgb2JqZWN0IGlzICJjb21wYXRpYmxlIiB3aXRoIHRoZSBleGNlcHRpb24uICBBbiBvYmplY3QgaXNcbmNvbXBhdGlibGUgd2l0aCBhbiBleGNlcHRpb24gaWYgaXQgaXMgdGhlIGNsYXNzIG9yIGEgYmFzZSBjbGFzcyBvZiB0aGVcbmV4Y2VwdGlvbiBvYmplY3QsIG9yIGEgdHVwbGUgY29udGFpbmluZyBhbiBpdGVtIGNvbXBhdGlibGUgd2l0aCB0aGVcbmV4Y2VwdGlvbi5cblxuSWYgbm8gZXhjZXB0IGNsYXVzZSBtYXRjaGVzIHRoZSBleGNlcHRpb24sIHRoZSBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjb250aW51ZXMgaW4gdGhlIHN1cnJvdW5kaW5nIGNvZGUgYW5kIG9uIHRoZSBpbnZvY2F0aW9uIHN0YWNrLlxuWzFdXG5cbklmIHRoZSBldmFsdWF0aW9uIG9mIGFuIGV4cHJlc3Npb24gaW4gdGhlIGhlYWRlciBvZiBhbiBleGNlcHQgY2xhdXNlXG5yYWlzZXMgYW4gZXhjZXB0aW9uLCB0aGUgb3JpZ2luYWwgc2VhcmNoIGZvciBhIGhhbmRsZXIgaXMgY2FuY2VsZWQgYW5kXG5hIHNlYXJjaCBzdGFydHMgZm9yIHRoZSBuZXcgZXhjZXB0aW9uIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvblxudGhlIGNhbGwgc3RhY2sgKGl0IGlzIHRyZWF0ZWQgYXMgaWYgdGhlIGVudGlyZSBgYHRyeWBgIHN0YXRlbWVudFxucmFpc2VkIHRoZSBleGNlcHRpb24pLlxuXG5XaGVuIGEgbWF0Y2hpbmcgZXhjZXB0IGNsYXVzZSBpcyBmb3VuZCwgdGhlIGV4Y2VwdGlvbiBpcyBhc3NpZ25lZCB0b1xudGhlIHRhcmdldCBzcGVjaWZpZWQgaW4gdGhhdCBleGNlcHQgY2xhdXNlLCBpZiBwcmVzZW50LCBhbmQgdGhlIGV4Y2VwdFxuY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLiAgQWxsIGV4Y2VwdCBjbGF1c2VzIG11c3QgaGF2ZSBhblxuZXhlY3V0YWJsZSBibG9jay4gIFdoZW4gdGhlIGVuZCBvZiB0aGlzIGJsb2NrIGlzIHJlYWNoZWQsIGV4ZWN1dGlvblxuY29udGludWVzIG5vcm1hbGx5IGFmdGVyIHRoZSBlbnRpcmUgdHJ5IHN0YXRlbWVudC4gIChUaGlzIG1lYW5zIHRoYXRcbmlmIHR3byBuZXN0ZWQgaGFuZGxlcnMgZXhpc3QgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbiwgYW5kIHRoZSBleGNlcHRpb25cbm9jY3VycyBpbiB0aGUgdHJ5IGNsYXVzZSBvZiB0aGUgaW5uZXIgaGFuZGxlciwgdGhlIG91dGVyIGhhbmRsZXIgd2lsbFxubm90IGhhbmRsZSB0aGUgZXhjZXB0aW9uLilcblxuQmVmb3JlIGFuIGV4Y2VwdCBjbGF1c2VcJ3Mgc3VpdGUgaXMgZXhlY3V0ZWQsIGRldGFpbHMgYWJvdXQgdGhlXG5leGNlcHRpb24gYXJlIGFzc2lnbmVkIHRvIHRocmVlIHZhcmlhYmxlcyBpbiB0aGUgYGBzeXNgYCBtb2R1bGU6XG5gYHN5cy5leGNfdHlwZWBgIHJlY2VpdmVzIHRoZSBvYmplY3QgaWRlbnRpZnlpbmcgdGhlIGV4Y2VwdGlvbjtcbmBgc3lzLmV4Y192YWx1ZWBgIHJlY2VpdmVzIHRoZSBleGNlcHRpb25cJ3MgcGFyYW1ldGVyO1xuYGBzeXMuZXhjX3RyYWNlYmFja2BgIHJlY2VpdmVzIGEgdHJhY2ViYWNrIG9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZVxuc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKSBpZGVudGlmeWluZyB0aGUgcG9pbnQgaW4gdGhlIHByb2dyYW0gd2hlcmVcbnRoZSBleGNlcHRpb24gb2NjdXJyZWQuIFRoZXNlIGRldGFpbHMgYXJlIGFsc28gYXZhaWxhYmxlIHRocm91Z2ggdGhlXG5gYHN5cy5leGNfaW5mbygpYGAgZnVuY3Rpb24sIHdoaWNoIHJldHVybnMgYSB0dXBsZSBgYChleGNfdHlwZSxcbmV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjaylgYC4gIFVzZSBvZiB0aGUgY29ycmVzcG9uZGluZyB2YXJpYWJsZXMgaXNcbmRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdGhpcyBmdW5jdGlvbiwgc2luY2UgdGhlaXIgdXNlIGlzIHVuc2FmZSBpbiBhXG50aHJlYWRlZCBwcm9ncmFtLiAgQXMgb2YgUHl0aG9uIDEuNSwgdGhlIHZhcmlhYmxlcyBhcmUgcmVzdG9yZWQgdG9cbnRoZWlyIHByZXZpb3VzIHZhbHVlcyAoYmVmb3JlIHRoZSBjYWxsKSB3aGVuIHJldHVybmluZyBmcm9tIGEgZnVuY3Rpb25cbnRoYXQgaGFuZGxlZCBhbiBleGNlcHRpb24uXG5cblRoZSBvcHRpb25hbCBgYGVsc2VgYCBjbGF1c2UgaXMgZXhlY3V0ZWQgaWYgYW5kIHdoZW4gY29udHJvbCBmbG93cyBvZmZcbnRoZSBlbmQgb2YgdGhlIGBgdHJ5YGAgY2xhdXNlLiBbMl0gRXhjZXB0aW9ucyBpbiB0aGUgYGBlbHNlYGAgY2xhdXNlXG5hcmUgbm90IGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBgYGV4Y2VwdGBgIGNsYXVzZXMuXG5cbklmIGBgZmluYWxseWBgIGlzIHByZXNlbnQsIGl0IHNwZWNpZmllcyBhIFwnY2xlYW51cFwnIGhhbmRsZXIuICBUaGVcbmBgdHJ5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkLCBpbmNsdWRpbmcgYW55IGBgZXhjZXB0YGAgYW5kIGBgZWxzZWBgXG5jbGF1c2VzLiAgSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBpbiBhbnkgb2YgdGhlIGNsYXVzZXMgYW5kIGlzIG5vdFxuaGFuZGxlZCwgdGhlIGV4Y2VwdGlvbiBpcyB0ZW1wb3JhcmlseSBzYXZlZC4gVGhlIGBgZmluYWxseWBgIGNsYXVzZSBpc1xuZXhlY3V0ZWQuICBJZiB0aGVyZSBpcyBhIHNhdmVkIGV4Y2VwdGlvbiwgaXQgaXMgcmUtcmFpc2VkIGF0IHRoZSBlbmRcbm9mIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UuIElmIHRoZSBgYGZpbmFsbHlgYCBjbGF1c2UgcmFpc2VzIGFub3RoZXJcbmV4Y2VwdGlvbiBvciBleGVjdXRlcyBhIGBgcmV0dXJuYGAgb3IgYGBicmVha2BgIHN0YXRlbWVudCwgdGhlIHNhdmVkXG5leGNlcHRpb24gaXMgZGlzY2FyZGVkOlxuXG4gICBkZWYgZigpOlxuICAgICAgIHRyeTpcbiAgICAgICAgICAgMS8wXG4gICAgICAgZmluYWxseTpcbiAgICAgICAgICAgcmV0dXJuIDQyXG5cbiAgID4+PiBmKClcbiAgIDQyXG5cblRoZSBleGNlcHRpb24gaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbSBkdXJpbmdcbmV4ZWN1dGlvbiBvZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLlxuXG5XaGVuIGEgYGByZXR1cm5gYCwgYGBicmVha2BgIG9yIGBgY29udGludWVgYCBzdGF0ZW1lbnQgaXMgZXhlY3V0ZWQgaW5cbnRoZSBgYHRyeWBgIHN1aXRlIG9mIGEgYGB0cnlgYC4uLmBgZmluYWxseWBgIHN0YXRlbWVudCwgdGhlXG5gYGZpbmFsbHlgYCBjbGF1c2UgaXMgYWxzbyBleGVjdXRlZCBcJ29uIHRoZSB3YXkgb3V0LlwnIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgaXMgaWxsZWdhbCBpbiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLiAoVGhlIHJlYXNvbiBpcyBhXG5wcm9ibGVtIHdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gLS0tIHRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlXG5saWZ0ZWQgaW4gdGhlIGZ1dHVyZSkuXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlIGBgcmFpc2VgYCBzdGF0ZW1lbnQgdG9cbmdlbmVyYXRlIGV4Y2VwdGlvbnMgbWF5IGJlIGZvdW5kIGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG5cblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnRcbj09PT09PT09PT09PT09PT09PT09PT1cblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5UaGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uXG5gYHRyeWBgLi4uYGBleGNlcHRgYC4uLmBgZmluYWxseWBgIHVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZFxuZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGBgd2l0aF9pdGVtYGApXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19leGl0X18oKWBgIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19lbnRlcl9fKClgYCBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gYGBfX2VudGVyX18oKWBgIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgYGB3aXRoYGAgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgYGBfX2VudGVyX18oKWBgXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gYGBfX2V4aXRfXygpYGAgd2lsbCBhbHdheXNcbiAgICAgYmUgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgbWV0aG9kIGlzIGludm9rZWQuIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gYGBfX2V4aXRfXygpYGAuIE90aGVyd2lzZSxcbiAgIHRocmVlIGBgTm9uZWBgIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSBgYF9fZXhpdF9fKClgYCBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICByZXJhaXNlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpc1xuICAgc3VwcHJlc3NlZCwgYW5kIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZ1xuICAgdGhlIGBgd2l0aGBgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gYGBfX2V4aXRfXygpYGAgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlIGBgd2l0aGBgIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5Ob3RlOiBJbiBQeXRob24gMi41LCB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZVxuICBgYHdpdGhfc3RhdGVtZW50YGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgSXQgaXMgYWx3YXlzIGVuYWJsZWRcbiAgaW4gUHl0aG9uIDIuNi5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG5cblxuRnVuY3Rpb24gZGVmaW5pdGlvbnNcbj09PT09PT09PT09PT09PT09PT09XG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKTpcblxuICAgZGVjb3JhdGVkICAgICAgOjo9IGRlY29yYXRvcnMgKGNsYXNzZGVmIHwgZnVuY2RlZilcbiAgIGRlY29yYXRvcnMgICAgIDo6PSBkZWNvcmF0b3IrXG4gICBkZWNvcmF0b3IgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuICAgZnVuY2RlZiAgICAgICAgOjo9ICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiAiOiIgc3VpdGVcbiAgIGRvdHRlZF9uYW1lICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4gICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKlxuICAgICAgICAgICAgICAgICAgICAgICggICIqIiBpZGVudGlmaWVyIFsiLCIgIioqIiBpZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBzdWJsaXN0ICAgICAgICA6Oj0gcGFyYW1ldGVyICgiLCIgcGFyYW1ldGVyKSogWyIsIl1cbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIHwgIigiIHN1Ymxpc3QgIikiXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvOlxuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSB0b3AtbGV2ZWwgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlcipcbmBgPWBgICpleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXJcbnZhbHVlcy4iICBGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nXG4qYXJndW1lbnQqIG1heSBiZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXJcJ3NcbmRlZmF1bHQgdmFsdWUgaXMgc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGxcbmZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gdGhpcyBpcyBhXG5zeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLlxuXG4qKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb25cbmlzIGV4ZWN1dGVkLioqICBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIG9uY2UsIHdoZW5cbnRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLWNvbXB1dGVkIiB2YWx1ZSBpc1xudXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoZW4gYVxuZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCBhcyBhIGxpc3Qgb3IgYSBkaWN0aW9uYXJ5OlxuaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gYnkgYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYVxubGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCBtb2RpZmllZC4gVGhpcyBpcyBnZW5lcmFsbHkgbm90XG53aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzICBpcyB0byB1c2UgYGBOb25lYGAgYXMgdGhlXG5kZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIGUuZy46XG5cbiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4gICAgICAgICAgIHBlbmd1aW4gPSBbXVxuICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbiAgICAgICByZXR1cm4gcGVuZ3VpblxuXG5GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb25cbipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnNcbm1lbnRpb25lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbVxua2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybVxuImBgKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmdcbmFueSBleGNlc3MgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmXG50aGUgZm9ybSAiYGAqKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXdcbmRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXdcbmVtcHR5IGRpY3Rpb25hcnkuXG5cbkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmRcbnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYSBmb3JtcyxcbmRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhIGZvcm0gaXMgbWVyZWx5IGFcbnNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247IGEgZnVuY3Rpb24gZGVmaW5lZCBpblxuYSAiYGBkZWZgYCIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yIGFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZVxuanVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYSBmb3JtLiAgVGhlICJgYGRlZmBgIiBmb3JtIGlzXG5hY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0IGFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlXG5zdGF0ZW1lbnRzLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICJgYGRlZmBgIlxuZm9ybSBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbCBmdW5jdGlvblxudGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWQgaW4gdGhlXG5uZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvblxuY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuXG5cblxuQ2xhc3MgZGVmaW5pdGlvbnNcbj09PT09PT09PT09PT09PT09XG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBkZWZpbmVzIGEgY2xhc3Mgb2JqZWN0IChzZWUgc2VjdGlvbiAqVGhlIHN0YW5kYXJkXG50eXBlIGhpZXJhcmNoeSopOlxuXG4gICBjbGFzc2RlZiAgICA6Oj0gImNsYXNzIiBjbGFzc25hbWUgW2luaGVyaXRhbmNlXSAiOiIgc3VpdGVcbiAgIGluaGVyaXRhbmNlIDo6PSAiKCIgW2V4cHJlc3Npb25fbGlzdF0gIikiXG4gICBjbGFzc25hbWUgICA6Oj0gaWRlbnRpZmllclxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdCBmaXJzdCBldmFsdWF0ZXMgdGhlXG5pbmhlcml0YW5jZSBsaXN0LCBpZiBwcmVzZW50LiAgRWFjaCBpdGVtIGluIHRoZSBpbmhlcml0YW5jZSBsaXN0XG5zaG91bGQgZXZhbHVhdGUgdG8gYSBjbGFzcyBvYmplY3Qgb3IgY2xhc3MgdHlwZSB3aGljaCBhbGxvd3NcbnN1YmNsYXNzaW5nLiAgVGhlIGNsYXNzXCdzIHN1aXRlIGlzIHRoZW4gZXhlY3V0ZWQgaW4gYSBuZXcgZXhlY3V0aW9uXG5mcmFtZSAoc2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyopLCB1c2luZyBhIG5ld2x5IGNyZWF0ZWQgbG9jYWxcbm5hbWVzcGFjZSBhbmQgdGhlIG9yaWdpbmFsIGdsb2JhbCBuYW1lc3BhY2UuIChVc3VhbGx5LCB0aGUgc3VpdGVcbmNvbnRhaW5zIG9ubHkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuKSAgV2hlbiB0aGUgY2xhc3NcJ3Mgc3VpdGUgZmluaXNoZXNcbmV4ZWN1dGlvbiwgaXRzIGV4ZWN1dGlvbiBmcmFtZSBpcyBkaXNjYXJkZWQgYnV0IGl0cyBsb2NhbCBuYW1lc3BhY2UgaXNcbnNhdmVkLiBbNF0gQSBjbGFzcyBvYmplY3QgaXMgdGhlbiBjcmVhdGVkIHVzaW5nIHRoZSBpbmhlcml0YW5jZSBsaXN0XG5mb3IgdGhlIGJhc2UgY2xhc3NlcyBhbmQgdGhlIHNhdmVkIGxvY2FsIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZVxuZGljdGlvbmFyeS4gIFRoZSBjbGFzcyBuYW1lIGlzIGJvdW5kIHRvIHRoaXMgY2xhc3Mgb2JqZWN0IGluIHRoZVxub3JpZ2luYWwgbG9jYWwgbmFtZXNwYWNlLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBWYXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiBhcmVcbmNsYXNzIHZhcmlhYmxlczsgdGhleSBhcmUgc2hhcmVkIGJ5IGFsbCBpbnN0YW5jZXMuICBUbyBjcmVhdGUgaW5zdGFuY2VcbnZhcmlhYmxlcywgdGhleSBjYW4gYmUgc2V0IGluIGEgbWV0aG9kIHdpdGggYGBzZWxmLm5hbWUgPSB2YWx1ZWBgLlxuQm90aCBjbGFzcyBhbmQgaW5zdGFuY2UgdmFyaWFibGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIG5vdGF0aW9uXG4iYGBzZWxmLm5hbWVgYCIsIGFuZCBhbiBpbnN0YW5jZSB2YXJpYWJsZSBoaWRlcyBhIGNsYXNzIHZhcmlhYmxlIHdpdGhcbnRoZSBzYW1lIG5hbWUgd2hlbiBhY2Nlc3NlZCBpbiB0aGlzIHdheS4gQ2xhc3MgdmFyaWFibGVzIGNhbiBiZSB1c2VkXG5hcyBkZWZhdWx0cyBmb3IgaW5zdGFuY2UgdmFyaWFibGVzLCBidXQgdXNpbmcgbXV0YWJsZSB2YWx1ZXMgdGhlcmUgY2FuXG5sZWFkIHRvIHVuZXhwZWN0ZWQgcmVzdWx0cy4gIEZvciAqbmV3LXN0eWxlIGNsYXNzKmVzLCBkZXNjcmlwdG9ycyBjYW5cbmJlIHVzZWQgdG8gY3JlYXRlIGluc3RhbmNlIHZhcmlhYmxlcyB3aXRoIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvblxuZGV0YWlscy5cblxuQ2xhc3MgZGVmaW5pdGlvbnMsIGxpa2UgZnVuY3Rpb24gZGVmaW5pdGlvbnMsIG1heSBiZSB3cmFwcGVkIGJ5IG9uZSBvclxubW9yZSAqZGVjb3JhdG9yKiBleHByZXNzaW9ucy4gIFRoZSBldmFsdWF0aW9uIHJ1bGVzIGZvciB0aGUgZGVjb3JhdG9yXG5leHByZXNzaW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIGZ1bmN0aW9ucy4gIFRoZSByZXN1bHQgbXVzdCBiZSBhIGNsYXNzXG5vYmplY3QsIHdoaWNoIGlzIHRoZW4gYm91bmQgdG8gdGhlIGNsYXNzIG5hbWUuXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gVGhlIGV4Y2VwdGlvbiBpcyBwcm9wYWdhdGVkIHRvIHRoZSBpbnZvY2F0aW9uIHN0YWNrIHVubGVzcyB0aGVyZVxuICAgIGlzIGEgYGBmaW5hbGx5YGAgY2xhdXNlIHdoaWNoIGhhcHBlbnMgdG8gcmFpc2UgYW5vdGhlciBleGNlcHRpb24uXG4gICAgVGhhdCBuZXcgZXhjZXB0aW9uIGNhdXNlcyB0aGUgb2xkIG9uZSB0byBiZSBsb3N0LlxuXG5bMl0gQ3VycmVudGx5LCBjb250cm9sICJmbG93cyBvZmYgdGhlIGVuZCIgZXhjZXB0IGluIHRoZSBjYXNlIG9mIGFuXG4gICAgZXhjZXB0aW9uIG9yIHRoZSBleGVjdXRpb24gb2YgYSBgYHJldHVybmBgLCBgYGNvbnRpbnVlYGAsIG9yXG4gICAgYGBicmVha2BgIHN0YXRlbWVudC5cblxuWzNdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGZ1bmN0aW9uXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBmdW5jdGlvblwncyBgYF9fZG9jX19gYCBhdHRyaWJ1dGUgYW5kXG4gICAgdGhlcmVmb3JlIHRoZSBmdW5jdGlvblwncyAqZG9jc3RyaW5nKi5cblxuWzRdIEEgc3RyaW5nIGxpdGVyYWwgYXBwZWFyaW5nIGFzIHRoZSBmaXJzdCBzdGF0ZW1lbnQgaW4gdGhlIGNsYXNzXG4gICAgYm9keSBpcyB0cmFuc2Zvcm1lZCBpbnRvIHRoZSBuYW1lc3BhY2VcJ3MgYGBfX2RvY19fYGAgaXRlbSBhbmRcbiAgICB0aGVyZWZvcmUgdGhlIGNsYXNzXCdzICpkb2NzdHJpbmcqLlxuJywKKyAnY29udGV4dC1tYW5hZ2Vycyc6ICdcbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5BICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0b1xuYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSBgYHdpdGhgYCBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0XG5tYW5hZ2VyIGhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lXG5jb250ZXh0IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmVcbm5vcm1hbGx5IGludm9rZWQgdXNpbmcgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb25cbipUaGUgd2l0aCBzdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXJcbm1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIGBgd2l0aGBgXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlIGBgYXNgYCBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuXG5vYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuXG4gICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnNcbiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGVcbiAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsXG4gICBiZSBgYE5vbmVgYC5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgYGBfX2V4aXRfXygpYGAgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAwMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuICAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvblxuICAgICAgYGB3aXRoYGAgc3RhdGVtZW50LlxuJywKKyAnY29udGludWUnOiAnXG5UaGUgYGBjb250aW51ZWBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgY29udGludWVfc3RtdCA6Oj0gImNvbnRpbnVlIlxuXG5gYGNvbnRpbnVlYGAgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBgYGZvcmBgIG9yXG5gYHdoaWxlYGAgbG9vcCwgYnV0IG5vdCBuZXN0ZWQgaW4gYSBmdW5jdGlvbiBvciBjbGFzcyBkZWZpbml0aW9uIG9yXG5gYGZpbmFsbHlgYCBjbGF1c2Ugd2l0aGluIHRoYXQgbG9vcC4gIEl0IGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGN5Y2xlXG5vZiB0aGUgbmVhcmVzdCBlbmNsb3NpbmcgbG9vcC5cblxuV2hlbiBgYGNvbnRpbnVlYGAgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBhXG5gYGZpbmFsbHlgYCBjbGF1c2UsIHRoYXQgYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbnN0YXJ0aW5nIHRoZSBuZXh0IGxvb3AgY3ljbGUuXG4nLAorICdjb252ZXJzaW9ucyc6ICdcbkFyaXRobWV0aWMgY29udmVyc2lvbnNcbioqKioqKioqKioqKioqKioqKioqKipcblxuV2hlbiBhIGRlc2NyaXB0aW9uIG9mIGFuIGFyaXRobWV0aWMgb3BlcmF0b3IgYmVsb3cgdXNlcyB0aGUgcGhyYXNlXG4idGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZSwiIHRoZSBhcmd1bWVudHNcbmFyZSBjb2VyY2VkIHVzaW5nIHRoZSBjb2VyY2lvbiBydWxlcyBsaXN0ZWQgYXQgICpDb2VyY2lvbiBydWxlcyouICBJZlxuYm90aCBhcmd1bWVudHMgYXJlIHN0YW5kYXJkIG51bWVyaWMgdHlwZXMsIHRoZSBmb2xsb3dpbmcgY29lcmNpb25zIGFyZVxuYXBwbGllZDpcblxuKiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBjb21wbGV4IG51bWJlciwgdGhlIG90aGVyIGlzIGNvbnZlcnRlZCB0b1xuICBjb21wbGV4O1xuXG4qIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCB0aGUgb3RoZXJcbiAgaXMgY29udmVydGVkIHRvIGZsb2F0aW5nIHBvaW50O1xuXG4qIG90aGVyd2lzZSwgaWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgbG9uZyBpbnRlZ2VyLCB0aGUgb3RoZXIgaXNcbiAgY29udmVydGVkIHRvIGxvbmcgaW50ZWdlcjtcblxuKiBvdGhlcndpc2UsIGJvdGggbXVzdCBiZSBwbGFpbiBpbnRlZ2VycyBhbmQgbm8gY29udmVyc2lvbiBpc1xuICBuZWNlc3NhcnkuXG5cblNvbWUgYWRkaXRpb25hbCBydWxlcyBhcHBseSBmb3IgY2VydGFpbiBvcGVyYXRvcnMgKGUuZy4sIGEgc3RyaW5nIGxlZnRcbmFyZ3VtZW50IHRvIHRoZSBcJyVcJyBvcGVyYXRvcikuIEV4dGVuc2lvbnMgY2FuIGRlZmluZSB0aGVpciBvd25cbmNvZXJjaW9ucy5cbicsCisgJ2N1c3RvbWl6YXRpb24nOiAnXG5CYXNpYyBjdXN0b21pemF0aW9uXG4qKioqKioqKioqKioqKioqKioqXG5cbm9iamVjdC5fX25ld19fKGNsc1ssIC4uLl0pXG5cbiAgIENhbGxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgY2xhc3MgKmNscyouICBgYF9fbmV3X18oKWBgIGlzIGFcbiAgIHN0YXRpYyBtZXRob2QgKHNwZWNpYWwtY2FzZWQgc28geW91IG5lZWQgbm90IGRlY2xhcmUgaXQgYXMgc3VjaClcbiAgIHRoYXQgdGFrZXMgdGhlIGNsYXNzIG9mIHdoaWNoIGFuIGluc3RhbmNlIHdhcyByZXF1ZXN0ZWQgYXMgaXRzXG4gICBmaXJzdCBhcmd1bWVudC4gIFRoZSByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aG9zZSBwYXNzZWQgdG8gdGhlXG4gICBvYmplY3QgY29uc3RydWN0b3IgZXhwcmVzc2lvbiAodGhlIGNhbGwgdG8gdGhlIGNsYXNzKS4gIFRoZSByZXR1cm5cbiAgIHZhbHVlIG9mIGBgX19uZXdfXygpYGAgc2hvdWxkIGJlIHRoZSBuZXcgb2JqZWN0IGluc3RhbmNlICh1c3VhbGx5XG4gICBhbiBpbnN0YW5jZSBvZiAqY2xzKikuXG5cbiAgIFR5cGljYWwgaW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgYnlcbiAgIGludm9raW5nIHRoZSBzdXBlcmNsYXNzXCdzIGBgX19uZXdfXygpYGAgbWV0aG9kIHVzaW5nXG4gICBgYHN1cGVyKGN1cnJlbnRjbGFzcywgY2xzKS5fX25ld19fKGNsc1ssIC4uLl0pYGAgd2l0aCBhcHByb3ByaWF0ZVxuICAgYXJndW1lbnRzIGFuZCB0aGVuIG1vZGlmeWluZyB0aGUgbmV3bHktY3JlYXRlZCBpbnN0YW5jZSBhc1xuICAgbmVjZXNzYXJ5IGJlZm9yZSByZXR1cm5pbmcgaXQuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyBgYF9faW5pdF9fKClgYCBtZXRob2Qgd2lsbCBiZSBpbnZva2VkIGxpa2VcbiAgIGBgX19pbml0X18oc2VsZlssIC4uLl0pYGAsIHdoZXJlICpzZWxmKiBpcyB0aGUgbmV3IGluc3RhbmNlIGFuZCB0aGVcbiAgIHJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIHdlcmUgcGFzc2VkIHRvIGBgX19uZXdfXygpYGAuXG5cbiAgIElmIGBgX19uZXdfXygpYGAgZG9lcyBub3QgcmV0dXJuIGFuIGluc3RhbmNlIG9mICpjbHMqLCB0aGVuIHRoZSBuZXdcbiAgIGluc3RhbmNlXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCB3aWxsIG5vdCBiZSBpbnZva2VkLlxuXG4gICBgYF9fbmV3X18oKWBgIGlzIGludGVuZGVkIG1haW5seSB0byBhbGxvdyBzdWJjbGFzc2VzIG9mIGltbXV0YWJsZVxuICAgdHlwZXMgKGxpa2UgaW50LCBzdHIsIG9yIHR1cGxlKSB0byBjdXN0b21pemUgaW5zdGFuY2UgY3JlYXRpb24uICBJdFxuICAgaXMgYWxzbyBjb21tb25seSBvdmVycmlkZGVuIGluIGN1c3RvbSBtZXRhY2xhc3NlcyBpbiBvcmRlciB0b1xuICAgY3VzdG9taXplIGNsYXNzIGNyZWF0aW9uLlxuXG5vYmplY3QuX19pbml0X18oc2VsZlssIC4uLl0pXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBjcmVhdGVkLiAgVGhlIGFyZ3VtZW50cyBhcmUgdGhvc2VcbiAgIHBhc3NlZCB0byB0aGUgY2xhc3MgY29uc3RydWN0b3IgZXhwcmVzc2lvbi4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYW5cbiAgIGBgX19pbml0X18oKWBgIG1ldGhvZCwgdGhlIGRlcml2ZWQgY2xhc3NcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kLFxuICAgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHkgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGluaXRpYWxpemF0aW9uIG9mXG4gICB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZSBpbnN0YW5jZTsgZm9yIGV4YW1wbGU6XG4gICBgYEJhc2VDbGFzcy5fX2luaXRfXyhzZWxmLCBbYXJncy4uLl0pYGAuICBBcyBhIHNwZWNpYWwgY29uc3RyYWludFxuICAgb24gY29uc3RydWN0b3JzLCBubyB2YWx1ZSBtYXkgYmUgcmV0dXJuZWQ7IGRvaW5nIHNvIHdpbGwgY2F1c2UgYVxuICAgYGBUeXBlRXJyb3JgYCB0byBiZSByYWlzZWQgYXQgcnVudGltZS5cblxub2JqZWN0Ll9fZGVsX18oc2VsZilcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZC4gIFRoaXMgaXMgYWxzb1xuICAgY2FsbGVkIGEgZGVzdHJ1Y3Rvci4gIElmIGEgYmFzZSBjbGFzcyBoYXMgYSBgYF9fZGVsX18oKWBgIG1ldGhvZCxcbiAgIHRoZSBkZXJpdmVkIGNsYXNzXCdzIGBgX19kZWxfXygpYGAgbWV0aG9kLCBpZiBhbnksIG11c3QgZXhwbGljaXRseVxuICAgY2FsbCBpdCB0byBlbnN1cmUgcHJvcGVyIGRlbGV0aW9uIG9mIHRoZSBiYXNlIGNsYXNzIHBhcnQgb2YgdGhlXG4gICBpbnN0YW5jZS4gIE5vdGUgdGhhdCBpdCBpcyBwb3NzaWJsZSAodGhvdWdoIG5vdCByZWNvbW1lbmRlZCEpIGZvclxuICAgdGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIHRvIHBvc3Rwb25lIGRlc3RydWN0aW9uIG9mIHRoZSBpbnN0YW5jZSBieVxuICAgY3JlYXRpbmcgYSBuZXcgcmVmZXJlbmNlIHRvIGl0LiAgSXQgbWF5IHRoZW4gYmUgY2FsbGVkIGF0IGEgbGF0ZXJcbiAgIHRpbWUgd2hlbiB0aGlzIG5ldyByZWZlcmVuY2UgaXMgZGVsZXRlZC4gIEl0IGlzIG5vdCBndWFyYW50ZWVkIHRoYXRcbiAgIGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgY2FsbGVkIGZvciBvYmplY3RzIHRoYXQgc3RpbGwgZXhpc3Qgd2hlblxuICAgdGhlIGludGVycHJldGVyIGV4aXRzLlxuXG4gICBOb3RlOiBgYGRlbCB4YGAgZG9lc25cJ3QgZGlyZWN0bHkgY2FsbCBgYHguX19kZWxfXygpYGAgLS0tIHRoZSBmb3JtZXJcbiAgICAgZGVjcmVtZW50cyB0aGUgcmVmZXJlbmNlIGNvdW50IGZvciBgYHhgYCBieSBvbmUsIGFuZCB0aGUgbGF0dGVyXG4gICAgIGlzIG9ubHkgY2FsbGVkIHdoZW4gYGB4YGBcJ3MgcmVmZXJlbmNlIGNvdW50IHJlYWNoZXMgemVyby4gIFNvbWVcbiAgICAgY29tbW9uIHNpdHVhdGlvbnMgdGhhdCBtYXkgcHJldmVudCB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGFuXG4gICAgIG9iamVjdCBmcm9tIGdvaW5nIHRvIHplcm8gaW5jbHVkZTogY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuXG4gICAgIG9iamVjdHMgKGUuZy4sIGEgZG91Ymx5LWxpbmtlZCBsaXN0IG9yIGEgdHJlZSBkYXRhIHN0cnVjdHVyZSB3aXRoXG4gICAgIHBhcmVudCBhbmQgY2hpbGQgcG9pbnRlcnMpOyBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZVxuICAgICBzdGFjayBmcmFtZSBvZiBhIGZ1bmN0aW9uIHRoYXQgY2F1Z2h0IGFuIGV4Y2VwdGlvbiAodGhlIHRyYWNlYmFja1xuICAgICBzdG9yZWQgaW4gYGBzeXMuZXhjX3RyYWNlYmFja2BgIGtlZXBzIHRoZSBzdGFjayBmcmFtZSBhbGl2ZSk7IG9yXG4gICAgIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3Qgb24gdGhlIHN0YWNrIGZyYW1lIHRoYXQgcmFpc2VkIGFuXG4gICAgIHVuaGFuZGxlZCBleGNlcHRpb24gaW4gaW50ZXJhY3RpdmUgbW9kZSAodGhlIHRyYWNlYmFjayBzdG9yZWQgaW5cbiAgICAgYGBzeXMubGFzdF90cmFjZWJhY2tgYCBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpLiAgVGhlIGZpcnN0XG4gICAgIHNpdHVhdGlvbiBjYW4gb25seSBiZSByZW1lZGllZCBieSBleHBsaWNpdGx5IGJyZWFraW5nIHRoZSBjeWNsZXM7XG4gICAgIHRoZSBsYXR0ZXIgdHdvIHNpdHVhdGlvbnMgY2FuIGJlIHJlc29sdmVkIGJ5IHN0b3JpbmcgYGBOb25lYGAgaW5cbiAgICAgYGBzeXMuZXhjX3RyYWNlYmFja2BgIG9yIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuICBDaXJjdWxhclxuICAgICByZWZlcmVuY2VzIHdoaWNoIGFyZSBnYXJiYWdlIGFyZSBkZXRlY3RlZCB3aGVuIHRoZSBvcHRpb24gY3ljbGVcbiAgICAgZGV0ZWN0b3IgaXMgZW5hYmxlZCAoaXRcJ3Mgb24gYnkgZGVmYXVsdCksIGJ1dCBjYW4gb25seSBiZSBjbGVhbmVkXG4gICAgIHVwIGlmIHRoZXJlIGFyZSBubyBQeXRob24tbGV2ZWwgYGBfX2RlbF9fKClgYCBtZXRob2RzIGludm9sdmVkLlxuICAgICBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGBgZ2NgYCBtb2R1bGUgZm9yIG1vcmVcbiAgICAgaW5mb3JtYXRpb24gYWJvdXQgaG93IGBgX19kZWxfXygpYGAgbWV0aG9kcyBhcmUgaGFuZGxlZCBieSB0aGVcbiAgICAgY3ljbGUgZGV0ZWN0b3IsIHBhcnRpY3VsYXJseSB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGBgZ2FyYmFnZWBgXG4gICAgIHZhbHVlLlxuXG4gICBXYXJuaW5nOiBEdWUgdG8gdGhlIHByZWNhcmlvdXMgY2lyY3Vtc3RhbmNlcyB1bmRlciB3aGljaCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgYXJlIGludm9rZWQsIGV4Y2VwdGlvbnMgdGhhdCBvY2N1ciBkdXJpbmcgdGhlaXIgZXhlY3V0aW9uXG4gICAgIGFyZSBpZ25vcmVkLCBhbmQgYSB3YXJuaW5nIGlzIHByaW50ZWQgdG8gYGBzeXMuc3RkZXJyYGAgaW5zdGVhZC5cbiAgICAgQWxzbywgd2hlbiBgYF9fZGVsX18oKWBgIGlzIGludm9rZWQgaW4gcmVzcG9uc2UgdG8gYSBtb2R1bGUgYmVpbmdcbiAgICAgZGVsZXRlZCAoZS5nLiwgd2hlbiBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0gaXMgZG9uZSksIG90aGVyXG4gICAgIGdsb2JhbHMgcmVmZXJlbmNlZCBieSB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgbWF5IGFscmVhZHkgaGF2ZVxuICAgICBiZWVuIGRlbGV0ZWQgb3IgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgdG9ybiBkb3duIChlLmcuIHRoZVxuICAgICBpbXBvcnQgbWFjaGluZXJ5IHNodXR0aW5nIGRvd24pLiAgRm9yIHRoaXMgcmVhc29uLCBgYF9fZGVsX18oKWBgXG4gICAgIG1ldGhvZHMgc2hvdWxkIGRvIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIG5lZWRlZCB0byBtYWludGFpblxuICAgICBleHRlcm5hbCBpbnZhcmlhbnRzLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDEuNSwgUHl0aG9uXG4gICAgIGd1YXJhbnRlZXMgdGhhdCBnbG9iYWxzIHdob3NlIG5hbWUgYmVnaW5zIHdpdGggYSBzaW5nbGVcbiAgICAgdW5kZXJzY29yZSBhcmUgZGVsZXRlZCBmcm9tIHRoZWlyIG1vZHVsZSBiZWZvcmUgb3RoZXIgZ2xvYmFscyBhcmVcbiAgICAgZGVsZXRlZDsgaWYgbm8gb3RoZXIgcmVmZXJlbmNlcyB0byBzdWNoIGdsb2JhbHMgZXhpc3QsIHRoaXMgbWF5XG4gICAgIGhlbHAgaW4gYXNzdXJpbmcgdGhhdCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBzdGlsbCBhdmFpbGFibGUgYXQgdGhlXG4gICAgIHRpbWUgd2hlbiB0aGUgYGBfX2RlbF9fKClgYCBtZXRob2QgaXMgY2FsbGVkLlxuXG4gICBTZWUgYWxzbyB0aGUgKi1SKiBjb21tYW5kLWxpbmUgb3B0aW9uLlxuXG5vYmplY3QuX19yZXByX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHJlcHIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSBzdHJpbmdcbiAgIGNvbnZlcnNpb25zIChyZXZlcnNlIHF1b3RlcykgdG8gY29tcHV0ZSB0aGUgIm9mZmljaWFsIiBzdHJpbmdcbiAgIHJlcHJlc2VudGF0aW9uIG9mIGFuIG9iamVjdC4gIElmIGF0IGFsbCBwb3NzaWJsZSwgdGhpcyBzaG91bGQgbG9va1xuICAgbGlrZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY291bGQgYmUgdXNlZCB0byByZWNyZWF0ZSBhblxuICAgb2JqZWN0IHdpdGggdGhlIHNhbWUgdmFsdWUgKGdpdmVuIGFuIGFwcHJvcHJpYXRlIGVudmlyb25tZW50KS4gIElmXG4gICB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYSBzdHJpbmcgb2YgdGhlIGZvcm0gYGA8Li4uc29tZSB1c2VmdWxcbiAgIGRlc2NyaXB0aW9uLi4uPmBgIHNob3VsZCBiZSByZXR1cm5lZC4gIFRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSBhXG4gICBzdHJpbmcgb2JqZWN0LiBJZiBhIGNsYXNzIGRlZmluZXMgYGBfX3JlcHJfXygpYGAgYnV0IG5vdFxuICAgYGBfX3N0cl9fKClgYCwgdGhlbiBgYF9fcmVwcl9fKClgYCBpcyBhbHNvIHVzZWQgd2hlbiBhbiAiaW5mb3JtYWwiXG4gICBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3MgaXMgcmVxdWlyZWQuXG5cbiAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlXG4gICByZXByZXNlbnRhdGlvbiBpcyBpbmZvcm1hdGlvbi1yaWNoIGFuZCB1bmFtYmlndW91cy5cblxub2JqZWN0Ll9fc3RyX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IHRoZSBgYHN0cigpYGAgYnVpbHQtaW4gZnVuY3Rpb24gYW5kIGJ5IHRoZSBgYHByaW50YGBcbiAgIHN0YXRlbWVudCB0byBjb21wdXRlIHRoZSAiaW5mb3JtYWwiIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhblxuICAgb2JqZWN0LiAgVGhpcyBkaWZmZXJzIGZyb20gYGBfX3JlcHJfXygpYGAgaW4gdGhhdCBpdCBkb2VzIG5vdCBoYXZlXG4gICB0byBiZSBhIHZhbGlkIFB5dGhvbiBleHByZXNzaW9uOiBhIG1vcmUgY29udmVuaWVudCBvciBjb25jaXNlXG4gICByZXByZXNlbnRhdGlvbiBtYXkgYmUgdXNlZCBpbnN0ZWFkLiBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYVxuICAgc3RyaW5nIG9iamVjdC5cblxub2JqZWN0Ll9fbHRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2xlX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19lcV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbmVfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2d0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19nZV9fKHNlbGYsIG90aGVyKVxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjEuXG5cbiAgIFRoZXNlIGFyZSB0aGUgc28tY2FsbGVkICJyaWNoIGNvbXBhcmlzb24iIG1ldGhvZHMsIGFuZCBhcmUgY2FsbGVkXG4gICBmb3IgY29tcGFyaXNvbiBvcGVyYXRvcnMgaW4gcHJlZmVyZW5jZSB0byBgYF9fY21wX18oKWBgIGJlbG93LiBUaGVcbiAgIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gb3BlcmF0b3Igc3ltYm9scyBhbmQgbWV0aG9kIG5hbWVzIGlzIGFzXG4gICBmb2xsb3dzOiBgYHg8eWBgIGNhbGxzIGBgeC5fX2x0X18oeSlgYCwgYGB4PD15YGAgY2FsbHNcbiAgIGBgeC5fX2xlX18oeSlgYCwgYGB4PT15YGAgY2FsbHMgYGB4Ll9fZXFfXyh5KWBgLCBgYHghPXlgYCBhbmRcbiAgIGBgeDw+eWBgIGNhbGwgYGB4Ll9fbmVfXyh5KWBgLCBgYHg+eWBgIGNhbGxzIGBgeC5fX2d0X18oeSlgYCwgYW5kXG4gICBgYHg+PXlgYCBjYWxscyBgYHguX19nZV9fKHkpYGAuXG5cbiAgIEEgcmljaCBjb21wYXJpc29uIG1ldGhvZCBtYXkgcmV0dXJuIHRoZSBzaW5nbGV0b25cbiAgIGBgTm90SW1wbGVtZW50ZWRgYCBpZiBpdCBkb2VzIG5vdCBpbXBsZW1lbnQgdGhlIG9wZXJhdGlvbiBmb3IgYVxuICAgZ2l2ZW4gcGFpciBvZiBhcmd1bWVudHMuIEJ5IGNvbnZlbnRpb24sIGBgRmFsc2VgYCBhbmQgYGBUcnVlYGAgYXJlXG4gICByZXR1cm5lZCBmb3IgYSBzdWNjZXNzZnVsIGNvbXBhcmlzb24uIEhvd2V2ZXIsIHRoZXNlIG1ldGhvZHMgY2FuXG4gICByZXR1cm4gYW55IHZhbHVlLCBzbyBpZiB0aGUgY29tcGFyaXNvbiBvcGVyYXRvciBpcyB1c2VkIGluIGFcbiAgIEJvb2xlYW4gY29udGV4dCAoZS5nLiwgaW4gdGhlIGNvbmRpdGlvbiBvZiBhbiBgYGlmYGAgc3RhdGVtZW50KSxcbiAgIFB5dGhvbiB3aWxsIGNhbGwgYGBib29sKClgYCBvbiB0aGUgdmFsdWUgdG8gZGV0ZXJtaW5lIGlmIHRoZSByZXN1bHRcbiAgIGlzIHRydWUgb3IgZmFsc2UuXG5cbiAgIFRoZXJlIGFyZSBubyBpbXBsaWVkIHJlbGF0aW9uc2hpcHMgYW1vbmcgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICAgVGhlIHRydXRoIG9mIGBgeD09eWBgIGRvZXMgbm90IGltcGx5IHRoYXQgYGB4IT15YGAgaXMgZmFsc2UuXG4gICBBY2NvcmRpbmdseSwgd2hlbiBkZWZpbmluZyBgYF9fZXFfXygpYGAsIG9uZSBzaG91bGQgYWxzbyBkZWZpbmVcbiAgIGBgX19uZV9fKClgYCBzbyB0aGF0IHRoZSBvcGVyYXRvcnMgd2lsbCBiZWhhdmUgYXMgZXhwZWN0ZWQuICBTZWVcbiAgIHRoZSBwYXJhZ3JhcGggb24gYGBfX2hhc2hfXygpYGAgZm9yIHNvbWUgaW1wb3J0YW50IG5vdGVzIG9uXG4gICBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b20gY29tcGFyaXNvblxuICAgb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuXG5cbiAgIFRoZXJlIGFyZSBubyBzd2FwcGVkLWFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIG1ldGhvZHMgKHRvIGJlIHVzZWRcbiAgIHdoZW4gdGhlIGxlZnQgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIGJ1dCB0aGUgcmlnaHRcbiAgIGFyZ3VtZW50IGRvZXMpOyByYXRoZXIsIGBgX19sdF9fKClgYCBhbmQgYGBfX2d0X18oKWBgIGFyZSBlYWNoXG4gICBvdGhlclwncyByZWZsZWN0aW9uLCBgYF9fbGVfXygpYGAgYW5kIGBgX19nZV9fKClgYCBhcmUgZWFjaCBvdGhlclwnc1xuICAgcmVmbGVjdGlvbiwgYW5kIGBgX19lcV9fKClgYCBhbmQgYGBfX25lX18oKWBgIGFyZSB0aGVpciBvd25cbiAgIHJlZmxlY3Rpb24uXG5cbiAgIEFyZ3VtZW50cyB0byByaWNoIGNvbXBhcmlzb24gbWV0aG9kcyBhcmUgbmV2ZXIgY29lcmNlZC5cblxuICAgVG8gYXV0b21hdGljYWxseSBnZW5lcmF0ZSBvcmRlcmluZyBvcGVyYXRpb25zIGZyb20gYSBzaW5nbGUgcm9vdFxuICAgb3BlcmF0aW9uLCBzZWUgYGBmdW5jdG9vbHMudG90YWxfb3JkZXJpbmcoKWBgLlxuXG5vYmplY3QuX19jbXBfXyhzZWxmLCBvdGhlcilcblxuICAgQ2FsbGVkIGJ5IGNvbXBhcmlzb24gb3BlcmF0aW9ucyBpZiByaWNoIGNvbXBhcmlzb24gKHNlZSBhYm92ZSkgaXNcbiAgIG5vdCBkZWZpbmVkLiAgU2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlIGludGVnZXIgaWYgYGBzZWxmIDwgb3RoZXJgYCxcbiAgIHplcm8gaWYgYGBzZWxmID09IG90aGVyYGAsIGEgcG9zaXRpdmUgaW50ZWdlciBpZiBgYHNlbGYgPiBvdGhlcmBgLlxuICAgSWYgbm8gYGBfX2NtcF9fKClgYCwgYGBfX2VxX18oKWBgIG9yIGBgX19uZV9fKClgYCBvcGVyYXRpb24gaXNcbiAgIGRlZmluZWQsIGNsYXNzIGluc3RhbmNlcyBhcmUgY29tcGFyZWQgYnkgb2JqZWN0IGlkZW50aXR5XG4gICAoImFkZHJlc3MiKS4gIFNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiBgYF9faGFzaF9fKClgYCBmb3Igc29tZVxuICAgaW1wb3J0YW50IG5vdGVzIG9uIGNyZWF0aW5nICpoYXNoYWJsZSogb2JqZWN0cyB3aGljaCBzdXBwb3J0IGN1c3RvbVxuICAgY29tcGFyaXNvbiBvcGVyYXRpb25zIGFuZCBhcmUgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4gKE5vdGU6IHRoZVxuICAgcmVzdHJpY3Rpb24gdGhhdCBleGNlcHRpb25zIGFyZSBub3QgcHJvcGFnYXRlZCBieSBgYF9fY21wX18oKWBgIGhhc1xuICAgYmVlbiByZW1vdmVkIHNpbmNlIFB5dGhvbiAxLjUuKVxuXG5vYmplY3QuX19yY21wX18oc2VsZiwgb3RoZXIpXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjE6IE5vIGxvbmdlciBzdXBwb3J0ZWQuXG5cbm9iamVjdC5fX2hhc2hfXyhzZWxmKVxuXG4gICBDYWxsZWQgYnkgYnVpbHQtaW4gZnVuY3Rpb24gYGBoYXNoKClgYCBhbmQgZm9yIG9wZXJhdGlvbnMgb25cbiAgIG1lbWJlcnMgb2YgaGFzaGVkIGNvbGxlY3Rpb25zIGluY2x1ZGluZyBgYHNldGBgLCBgYGZyb3plbnNldGBgLCBhbmRcbiAgIGBgZGljdGBgLiAgYGBfX2hhc2hfXygpYGAgc2hvdWxkIHJldHVybiBhbiBpbnRlZ2VyLiAgVGhlIG9ubHlcbiAgIHJlcXVpcmVkIHByb3BlcnR5IGlzIHRoYXQgb2JqZWN0cyB3aGljaCBjb21wYXJlIGVxdWFsIGhhdmUgdGhlIHNhbWVcbiAgIGhhc2ggdmFsdWU7IGl0IGlzIGFkdmlzZWQgdG8gc29tZWhvdyBtaXggdG9nZXRoZXIgKGUuZy4gdXNpbmdcbiAgIGV4Y2x1c2l2ZSBvcikgdGhlIGhhc2ggdmFsdWVzIGZvciB0aGUgY29tcG9uZW50cyBvZiB0aGUgb2JqZWN0IHRoYXRcbiAgIGFsc28gcGxheSBhIHBhcnQgaW4gY29tcGFyaXNvbiBvZiBvYmplY3RzLlxuXG4gICBJZiBhIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIG1ldGhvZFxuICAgaXQgc2hvdWxkIG5vdCBkZWZpbmUgYSBgYF9faGFzaF9fKClgYCBvcGVyYXRpb24gZWl0aGVyOyBpZiBpdFxuICAgZGVmaW5lcyBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBidXQgbm90IGBgX19oYXNoX18oKWBgLCBpdHNcbiAgIGluc3RhbmNlcyB3aWxsIG5vdCBiZSB1c2FibGUgaW4gaGFzaGVkIGNvbGxlY3Rpb25zLiAgSWYgYSBjbGFzc1xuICAgZGVmaW5lcyBtdXRhYmxlIG9iamVjdHMgYW5kIGltcGxlbWVudHMgYSBgYF9fY21wX18oKWBgIG9yXG4gICBgYF9fZXFfXygpYGAgbWV0aG9kLCBpdCBzaG91bGQgbm90IGltcGxlbWVudCBgYF9faGFzaF9fKClgYCwgc2luY2VcbiAgIGhhc2hhYmxlIGNvbGxlY3Rpb24gaW1wbGVtZW50YXRpb25zIHJlcXVpcmUgdGhhdCBhIG9iamVjdFwncyBoYXNoXG4gICB2YWx1ZSBpcyBpbW11dGFibGUgKGlmIHRoZSBvYmplY3RcJ3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlXG4gICBpbiB0aGUgd3JvbmcgaGFzaCBidWNrZXQpLlxuXG4gICBVc2VyLWRlZmluZWQgY2xhc3NlcyBoYXZlIGBgX19jbXBfXygpYGAgYW5kIGBgX19oYXNoX18oKWBgIG1ldGhvZHNcbiAgIGJ5IGRlZmF1bHQ7IHdpdGggdGhlbSwgYWxsIG9iamVjdHMgY29tcGFyZSB1bmVxdWFsIChleGNlcHQgd2l0aFxuICAgdGhlbXNlbHZlcykgYW5kIGBgeC5fX2hhc2hfXygpYGAgcmV0dXJucyBgYGlkKHgpYGAuXG5cbiAgIENsYXNzZXMgd2hpY2ggaW5oZXJpdCBhIGBgX19oYXNoX18oKWBgIG1ldGhvZCBmcm9tIGEgcGFyZW50IGNsYXNzXG4gICBidXQgY2hhbmdlIHRoZSBtZWFuaW5nIG9mIGBgX19jbXBfXygpYGAgb3IgYGBfX2VxX18oKWBgIHN1Y2ggdGhhdFxuICAgdGhlIGhhc2ggdmFsdWUgcmV0dXJuZWQgaXMgbm8gbG9uZ2VyIGFwcHJvcHJpYXRlIChlLmcuIGJ5IHN3aXRjaGluZ1xuICAgdG8gYSB2YWx1ZS1iYXNlZCBjb25jZXB0IG9mIGVxdWFsaXR5IGluc3RlYWQgb2YgdGhlIGRlZmF1bHRcbiAgIGlkZW50aXR5IGJhc2VkIGVxdWFsaXR5KSBjYW4gZXhwbGljaXRseSBmbGFnIHRoZW1zZWx2ZXMgYXMgYmVpbmdcbiAgIHVuaGFzaGFibGUgYnkgc2V0dGluZyBgYF9faGFzaF9fID0gTm9uZWBgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLlxuICAgRG9pbmcgc28gbWVhbnMgdGhhdCBub3Qgb25seSB3aWxsIGluc3RhbmNlcyBvZiB0aGUgY2xhc3MgcmFpc2UgYW5cbiAgIGFwcHJvcHJpYXRlIGBgVHlwZUVycm9yYGAgd2hlbiBhIHByb2dyYW0gYXR0ZW1wdHMgdG8gcmV0cmlldmUgdGhlaXJcbiAgIGhhc2ggdmFsdWUsIGJ1dCB0aGV5IHdpbGwgYWxzbyBiZSBjb3JyZWN0bHkgaWRlbnRpZmllZCBhc1xuICAgdW5oYXNoYWJsZSB3aGVuIGNoZWNraW5nIGBgaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkhhc2hhYmxlKWBgXG4gICAodW5saWtlIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZWlyIG93biBgYF9faGFzaF9fKClgYCB0byBleHBsaWNpdGx5XG4gICByYWlzZSBgYFR5cGVFcnJvcmBgKS5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogYGBfX2hhc2hfXygpYGAgbWF5IG5vdyBhbHNvIHJldHVybiBhIGxvbmdcbiAgIGludGVnZXIgb2JqZWN0OyB0aGUgMzItYml0IGludGVnZXIgaXMgdGhlbiBkZXJpdmVkIGZyb20gdGhlIGhhc2ggb2ZcbiAgIHRoYXQgb2JqZWN0LlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi42OiBgYF9faGFzaF9fYGAgbWF5IG5vdyBiZSBzZXQgdG8gYGBOb25lYGAgdG9cbiAgIGV4cGxpY2l0bHkgZmxhZyBpbnN0YW5jZXMgb2YgYSBjbGFzcyBhcyB1bmhhc2hhYmxlLlxuXG5vYmplY3QuX19ub256ZXJvX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0cnV0aCB2YWx1ZSB0ZXN0aW5nIGFuZCB0aGUgYnVpbHQtaW4gb3BlcmF0aW9uXG4gICBgYGJvb2woKWBgOyBzaG91bGQgcmV0dXJuIGBgRmFsc2VgYCBvciBgYFRydWVgYCwgb3IgdGhlaXIgaW50ZWdlclxuICAgZXF1aXZhbGVudHMgYGAwYGAgb3IgYGAxYGAuICBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLFxuICAgYGBfX2xlbl9fKClgYCBpcyBjYWxsZWQsIGlmIGl0IGlzIGRlZmluZWQsIGFuZCB0aGUgb2JqZWN0IGlzXG4gICBjb25zaWRlcmVkIHRydWUgaWYgaXRzIHJlc3VsdCBpcyBub256ZXJvLiBJZiBhIGNsYXNzIGRlZmluZXNcbiAgIG5laXRoZXIgYGBfX2xlbl9fKClgYCBub3IgYGBfX25vbnplcm9fXygpYGAsIGFsbCBpdHMgaW5zdGFuY2VzIGFyZVxuICAgY29uc2lkZXJlZCB0cnVlLlxuXG5vYmplY3QuX191bmljb2RlX18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYHVuaWNvZGUoKWBgIGJ1aWx0LWluOyBzaG91bGQgcmV0dXJuIGEgVW5pY29kZVxuICAgb2JqZWN0LiBXaGVuIHRoaXMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCBzdHJpbmcgY29udmVyc2lvbiBpc1xuICAgYXR0ZW1wdGVkLCBhbmQgdGhlIHJlc3VsdCBvZiBzdHJpbmcgY29udmVyc2lvbiBpcyBjb252ZXJ0ZWQgdG9cbiAgIFVuaWNvZGUgdXNpbmcgdGhlIHN5c3RlbSBkZWZhdWx0IGVuY29kaW5nLlxuJywKKyAnZGVidWdnZXInOiAnXG5gYHBkYmBgIC0tLSBUaGUgUHl0aG9uIERlYnVnZ2VyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBtb2R1bGUgYGBwZGJgYCBkZWZpbmVzIGFuIGludGVyYWN0aXZlIHNvdXJjZSBjb2RlIGRlYnVnZ2VyIGZvclxuUHl0aG9uIHByb2dyYW1zLiAgSXQgc3VwcG9ydHMgc2V0dGluZyAoY29uZGl0aW9uYWwpIGJyZWFrcG9pbnRzIGFuZFxuc2luZ2xlIHN0ZXBwaW5nIGF0IHRoZSBzb3VyY2UgbGluZSBsZXZlbCwgaW5zcGVjdGlvbiBvZiBzdGFjayBmcmFtZXMsXG5zb3VyY2UgY29kZSBsaXN0aW5nLCBhbmQgZXZhbHVhdGlvbiBvZiBhcmJpdHJhcnkgUHl0aG9uIGNvZGUgaW4gdGhlXG5jb250ZXh0IG9mIGFueSBzdGFjayBmcmFtZS4gIEl0IGFsc28gc3VwcG9ydHMgcG9zdC1tb3J0ZW0gZGVidWdnaW5nXG5hbmQgY2FuIGJlIGNhbGxlZCB1bmRlciBwcm9ncmFtIGNvbnRyb2wuXG5cblRoZSBkZWJ1Z2dlciBpcyBleHRlbnNpYmxlIC0tLSBpdCBpcyBhY3R1YWxseSBkZWZpbmVkIGFzIHRoZSBjbGFzc1xuYGBQZGJgYC4gVGhpcyBpcyBjdXJyZW50bHkgdW5kb2N1bWVudGVkIGJ1dCBlYXNpbHkgdW5kZXJzdG9vZCBieVxucmVhZGluZyB0aGUgc291cmNlLiAgVGhlIGV4dGVuc2lvbiBpbnRlcmZhY2UgdXNlcyB0aGUgbW9kdWxlcyBgYGJkYmBgXG5hbmQgYGBjbWRgYC5cblxuVGhlIGRlYnVnZ2VyXCdzIHByb21wdCBpcyBgYChQZGIpYGAuIFR5cGljYWwgdXNhZ2UgdG8gcnVuIGEgcHJvZ3JhbVxudW5kZXIgY29udHJvbCBvZiB0aGUgZGVidWdnZXIgaXM6XG5cbiAgID4+PiBpbXBvcnQgcGRiXG4gICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4gICA+Pj4gcGRiLnJ1bihcJ215bW9kdWxlLnRlc3QoKVwnKVxuICAgPiA8c3RyaW5nPigwKT8oKVxuICAgKFBkYikgY29udGludWVcbiAgID4gPHN0cmluZz4oMSk/KClcbiAgIChQZGIpIGNvbnRpbnVlXG4gICBOYW1lRXJyb3I6IFwnc3BhbVwnXG4gICA+IDxzdHJpbmc+KDEpPygpXG4gICAoUGRiKVxuXG5gYHBkYi5weWBgIGNhbiBhbHNvIGJlIGludm9rZWQgYXMgYSBzY3JpcHQgdG8gZGVidWcgb3RoZXIgc2NyaXB0cy5cbkZvciBleGFtcGxlOlxuXG4gICBweXRob24gLW0gcGRiIG15c2NyaXB0LnB5XG5cbldoZW4gaW52b2tlZCBhcyBhIHNjcmlwdCwgcGRiIHdpbGwgYXV0b21hdGljYWxseSBlbnRlciBwb3N0LW1vcnRlbVxuZGVidWdnaW5nIGlmIHRoZSBwcm9ncmFtIGJlaW5nIGRlYnVnZ2VkIGV4aXRzIGFibm9ybWFsbHkuIEFmdGVyIHBvc3QtXG5tb3J0ZW0gZGVidWdnaW5nIChvciBhZnRlciBub3JtYWwgZXhpdCBvZiB0aGUgcHJvZ3JhbSksIHBkYiB3aWxsXG5yZXN0YXJ0IHRoZSBwcm9ncmFtLiBBdXRvbWF0aWMgcmVzdGFydGluZyBwcmVzZXJ2ZXMgcGRiXCdzIHN0YXRlIChzdWNoXG5hcyBicmVha3BvaW50cykgYW5kIGluIG1vc3QgY2FzZXMgaXMgbW9yZSB1c2VmdWwgdGhhbiBxdWl0dGluZyB0aGVcbmRlYnVnZ2VyIHVwb24gcHJvZ3JhbVwncyBleGl0LlxuXG5OZXcgaW4gdmVyc2lvbiAyLjQ6IFJlc3RhcnRpbmcgcG9zdC1tb3J0ZW0gYmVoYXZpb3IgYWRkZWQuXG5cblRoZSB0eXBpY2FsIHVzYWdlIHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyIGZyb20gYSBydW5uaW5nIHByb2dyYW0gaXNcbnRvIGluc2VydFxuXG4gICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKClcblxuYXQgdGhlIGxvY2F0aW9uIHlvdSB3YW50IHRvIGJyZWFrIGludG8gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiB0aGVuXG5zdGVwIHRocm91Z2ggdGhlIGNvZGUgZm9sbG93aW5nIHRoaXMgc3RhdGVtZW50LCBhbmQgY29udGludWUgcnVubmluZ1xud2l0aG91dCB0aGUgZGVidWdnZXIgdXNpbmcgdGhlIGBgY2BgIGNvbW1hbmQuXG5cblRoZSB0eXBpY2FsIHVzYWdlIHRvIGluc3BlY3QgYSBjcmFzaGVkIHByb2dyYW0gaXM6XG5cbiAgID4+PiBpbXBvcnQgcGRiXG4gICA+Pj4gaW1wb3J0IG15bW9kdWxlXG4gICA+Pj4gbXltb2R1bGUudGVzdCgpXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID9cbiAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgNCwgaW4gdGVzdFxuICAgICAgIHRlc3QyKClcbiAgICAgRmlsZSAiLi9teW1vZHVsZS5weSIsIGxpbmUgMywgaW4gdGVzdDJcbiAgICAgICBwcmludCBzcGFtXG4gICBOYW1lRXJyb3I6IHNwYW1cbiAgID4+PiBwZGIucG0oKVxuICAgPiAuL215bW9kdWxlLnB5KDMpdGVzdDIoKVxuICAgLT4gcHJpbnQgc3BhbVxuICAgKFBkYilcblxuVGhlIG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOyBlYWNoIGVudGVycyB0aGUgZGVidWdnZXJcbmluIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHdheTpcblxucGRiLnJ1bihzdGF0ZW1lbnRbLCBnbG9iYWxzWywgbG9jYWxzXV0pXG5cbiAgIEV4ZWN1dGUgdGhlICpzdGF0ZW1lbnQqIChnaXZlbiBhcyBhIHN0cmluZykgdW5kZXIgZGVidWdnZXIgY29udHJvbC5cbiAgIFRoZSBkZWJ1Z2dlciBwcm9tcHQgYXBwZWFycyBiZWZvcmUgYW55IGNvZGUgaXMgZXhlY3V0ZWQ7IHlvdSBjYW5cbiAgIHNldCBicmVha3BvaW50cyBhbmQgdHlwZSBgYGNvbnRpbnVlYGAsIG9yIHlvdSBjYW4gc3RlcCB0aHJvdWdoIHRoZVxuICAgc3RhdGVtZW50IHVzaW5nIGBgc3RlcGBgIG9yIGBgbmV4dGBgIChhbGwgdGhlc2UgY29tbWFuZHMgYXJlXG4gICBleHBsYWluZWQgYmVsb3cpLiAgVGhlIG9wdGlvbmFsICpnbG9iYWxzKiBhbmQgKmxvY2FscyogYXJndW1lbnRzXG4gICBzcGVjaWZ5IHRoZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGUgY29kZSBpcyBleGVjdXRlZDsgYnkgZGVmYXVsdFxuICAgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIG1vZHVsZSBgYF9fbWFpbl9fYGAgaXMgdXNlZC4gIChTZWUgdGhlXG4gICBleHBsYW5hdGlvbiBvZiB0aGUgYGBleGVjYGAgc3RhdGVtZW50IG9yIHRoZSBgYGV2YWwoKWBgIGJ1aWx0LWluXG4gICBmdW5jdGlvbi4pXG5cbnBkYi5ydW5ldmFsKGV4cHJlc3Npb25bLCBnbG9iYWxzWywgbG9jYWxzXV0pXG5cbiAgIEV2YWx1YXRlIHRoZSAqZXhwcmVzc2lvbiogKGdpdmVuIGFzIGEgc3RyaW5nKSB1bmRlciBkZWJ1Z2dlclxuICAgY29udHJvbC4gIFdoZW4gYGBydW5ldmFsKClgYCByZXR1cm5zLCBpdCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGVcbiAgIGV4cHJlc3Npb24uICBPdGhlcndpc2UgdGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIGBgcnVuKClgYC5cblxucGRiLnJ1bmNhbGwoZnVuY3Rpb25bLCBhcmd1bWVudCwgLi4uXSlcblxuICAgQ2FsbCB0aGUgKmZ1bmN0aW9uKiAoYSBmdW5jdGlvbiBvciBtZXRob2Qgb2JqZWN0LCBub3QgYSBzdHJpbmcpXG4gICB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMuICBXaGVuIGBgcnVuY2FsbCgpYGAgcmV0dXJucywgaXQgcmV0dXJuc1xuICAgd2hhdGV2ZXIgdGhlIGZ1bmN0aW9uIGNhbGwgcmV0dXJuZWQuICBUaGUgZGVidWdnZXIgcHJvbXB0IGFwcGVhcnNcbiAgIGFzIHNvb24gYXMgdGhlIGZ1bmN0aW9uIGlzIGVudGVyZWQuXG5cbnBkYi5zZXRfdHJhY2UoKVxuXG4gICBFbnRlciB0aGUgZGVidWdnZXIgYXQgdGhlIGNhbGxpbmcgc3RhY2sgZnJhbWUuICBUaGlzIGlzIHVzZWZ1bCB0b1xuICAgaGFyZC1jb2RlIGEgYnJlYWtwb2ludCBhdCBhIGdpdmVuIHBvaW50IGluIGEgcHJvZ3JhbSwgZXZlbiBpZiB0aGVcbiAgIGNvZGUgaXMgbm90IG90aGVyd2lzZSBiZWluZyBkZWJ1Z2dlZCAoZS5nLiB3aGVuIGFuIGFzc2VydGlvblxuICAgZmFpbHMpLlxuXG5wZGIucG9zdF9tb3J0ZW0oW3RyYWNlYmFja10pXG5cbiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgZ2l2ZW4gKnRyYWNlYmFjayogb2JqZWN0LiAgSWYgbm9cbiAgICp0cmFjZWJhY2sqIGlzIGdpdmVuLCBpdCB1c2VzIHRoZSBvbmUgb2YgdGhlIGV4Y2VwdGlvbiB0aGF0IGlzXG4gICBjdXJyZW50bHkgYmVpbmcgaGFuZGxlZCAoYW4gZXhjZXB0aW9uIG11c3QgYmUgYmVpbmcgaGFuZGxlZCBpZiB0aGVcbiAgIGRlZmF1bHQgaXMgdG8gYmUgdXNlZCkuXG5cbnBkYi5wbSgpXG5cbiAgIEVudGVyIHBvc3QtbW9ydGVtIGRlYnVnZ2luZyBvZiB0aGUgdHJhY2ViYWNrIGZvdW5kIGluXG4gICBgYHN5cy5sYXN0X3RyYWNlYmFja2BgLlxuXG5UaGUgYGBydW4qYGAgZnVuY3Rpb25zIGFuZCBgYHNldF90cmFjZSgpYGAgYXJlIGFsaWFzZXMgZm9yXG5pbnN0YW50aWF0aW5nIHRoZSBgYFBkYmBgIGNsYXNzIGFuZCBjYWxsaW5nIHRoZSBtZXRob2Qgb2YgdGhlIHNhbWVcbm5hbWUuICBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgZnVydGhlciBmZWF0dXJlcywgeW91IGhhdmUgdG8gZG8gdGhpc1xueW91cnNlbGY6XG5cbmNsYXNzIGNsYXNzIHBkYi5QZGIoY29tcGxldGVrZXk9XCd0YWJcJywgc3RkaW49Tm9uZSwgc3Rkb3V0PU5vbmUsIHNraXA9Tm9uZSlcblxuICAgYGBQZGJgYCBpcyB0aGUgZGVidWdnZXIgY2xhc3MuXG5cbiAgIFRoZSAqY29tcGxldGVrZXkqLCAqc3RkaW4qIGFuZCAqc3Rkb3V0KiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byB0aGVcbiAgIHVuZGVybHlpbmcgYGBjbWQuQ21kYGAgY2xhc3M7IHNlZSB0aGUgZGVzY3JpcHRpb24gdGhlcmUuXG5cbiAgIFRoZSAqc2tpcCogYXJndW1lbnQsIGlmIGdpdmVuLCBtdXN0IGJlIGFuIGl0ZXJhYmxlIG9mIGdsb2Itc3R5bGVcbiAgIG1vZHVsZSBuYW1lIHBhdHRlcm5zLiAgVGhlIGRlYnVnZ2VyIHdpbGwgbm90IHN0ZXAgaW50byBmcmFtZXMgdGhhdFxuICAgb3JpZ2luYXRlIGluIGEgbW9kdWxlIHRoYXQgbWF0Y2hlcyBvbmUgb2YgdGhlc2UgcGF0dGVybnMuIFsxXVxuXG4gICBFeGFtcGxlIGNhbGwgdG8gZW5hYmxlIHRyYWNpbmcgd2l0aCAqc2tpcCo6XG5cbiAgICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoc2tpcD1bXCdkamFuZ28uKlwnXSkuc2V0X3RyYWNlKClcblxuICAgTmV3IGluIHZlcnNpb24gMi43OiBUaGUgKnNraXAqIGFyZ3VtZW50LlxuXG4gICBydW4oc3RhdGVtZW50WywgZ2xvYmFsc1ssIGxvY2Fsc11dKVxuICAgcnVuZXZhbChleHByZXNzaW9uWywgZ2xvYmFsc1ssIGxvY2Fsc11dKVxuICAgcnVuY2FsbChmdW5jdGlvblssIGFyZ3VtZW50LCAuLi5dKVxuICAgc2V0X3RyYWNlKClcblxuICAgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgZnVuY3Rpb25zIGV4cGxhaW5lZCBhYm92ZS5cbicsCisgJ2RlbCc6ICdcblRoZSBgYGRlbGBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGRlbF9zdG10IDo6PSAiZGVsIiB0YXJnZXRfbGlzdFxuXG5EZWxldGlvbiBpcyByZWN1cnNpdmVseSBkZWZpbmVkIHZlcnkgc2ltaWxhciB0byB0aGUgd2F5IGFzc2lnbm1lbnQgaXNcbmRlZmluZWQuIFJhdGhlciB0aGFuIHNwZWxsaW5nIGl0IG91dCBpbiBmdWxsIGRldGFpbHMsIGhlcmUgYXJlIHNvbWVcbmhpbnRzLlxuXG5EZWxldGlvbiBvZiBhIHRhcmdldCBsaXN0IHJlY3Vyc2l2ZWx5IGRlbGV0ZXMgZWFjaCB0YXJnZXQsIGZyb20gbGVmdFxudG8gcmlnaHQuXG5cbkRlbGV0aW9uIG9mIGEgbmFtZSByZW1vdmVzIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSAgZnJvbSB0aGUgbG9jYWwgb3Jcbmdsb2JhbCBuYW1lc3BhY2UsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBuYW1lIG9jY3VycyBpbiBhIGBgZ2xvYmFsYGBcbnN0YXRlbWVudCBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLiAgSWYgdGhlIG5hbWUgaXMgdW5ib3VuZCwgYVxuYGBOYW1lRXJyb3JgYCBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuXG5cbkl0IGlzIGlsbGVnYWwgdG8gZGVsZXRlIGEgbmFtZSBmcm9tIHRoZSBsb2NhbCBuYW1lc3BhY2UgaWYgaXQgb2NjdXJzXG5hcyBhIGZyZWUgdmFyaWFibGUgaW4gYSBuZXN0ZWQgYmxvY2suXG5cbkRlbGV0aW9uIG9mIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCBzdWJzY3JpcHRpb25zIGFuZCBzbGljaW5ncyBpcyBwYXNzZWRcbnRvIHRoZSBwcmltYXJ5IG9iamVjdCBpbnZvbHZlZDsgZGVsZXRpb24gb2YgYSBzbGljaW5nIGlzIGluIGdlbmVyYWxcbmVxdWl2YWxlbnQgdG8gYXNzaWdubWVudCBvZiBhbiBlbXB0eSBzbGljZSBvZiB0aGUgcmlnaHQgdHlwZSAoYnV0IGV2ZW5cbnRoaXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2xpY2VkIG9iamVjdCkuXG4nLAorICdkaWN0JzogJ1xuRGljdGlvbmFyeSBkaXNwbGF5c1xuKioqKioqKioqKioqKioqKioqKlxuXG5BIGRpY3Rpb25hcnkgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBrZXkvZGF0dW0gcGFpcnNcbmVuY2xvc2VkIGluIGN1cmx5IGJyYWNlczpcblxuICAgZGljdF9kaXNwbGF5ICAgICAgIDo6PSAieyIgW2tleV9kYXR1bV9saXN0IHwgZGljdF9jb21wcmVoZW5zaW9uXSAifSJcbiAgIGtleV9kYXR1bV9saXN0ICAgICA6Oj0ga2V5X2RhdHVtICgiLCIga2V5X2RhdHVtKSogWyIsIl1cbiAgIGtleV9kYXR1bSAgICAgICAgICA6Oj0gZXhwcmVzc2lvbiAiOiIgZXhwcmVzc2lvblxuICAgZGljdF9jb21wcmVoZW5zaW9uIDo6PSBleHByZXNzaW9uICI6IiBleHByZXNzaW9uIGNvbXBfZm9yXG5cbkEgZGljdGlvbmFyeSBkaXNwbGF5IHlpZWxkcyBhIG5ldyBkaWN0aW9uYXJ5IG9iamVjdC5cblxuSWYgYSBjb21tYS1zZXBhcmF0ZWQgc2VxdWVuY2Ugb2Yga2V5L2RhdHVtIHBhaXJzIGlzIGdpdmVuLCB0aGV5IGFyZVxuZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodCB0byBkZWZpbmUgdGhlIGVudHJpZXMgb2YgdGhlIGRpY3Rpb25hcnk6XG5lYWNoIGtleSBvYmplY3QgaXMgdXNlZCBhcyBhIGtleSBpbnRvIHRoZSBkaWN0aW9uYXJ5IHRvIHN0b3JlIHRoZVxuY29ycmVzcG9uZGluZyBkYXR1bS4gIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHNwZWNpZnkgdGhlIHNhbWUga2V5XG5tdWx0aXBsZSB0aW1lcyBpbiB0aGUga2V5L2RhdHVtIGxpc3QsIGFuZCB0aGUgZmluYWwgZGljdGlvbmFyeVwncyB2YWx1ZVxuZm9yIHRoYXQga2V5IHdpbGwgYmUgdGhlIGxhc3Qgb25lIGdpdmVuLlxuXG5BIGRpY3QgY29tcHJlaGVuc2lvbiwgaW4gY29udHJhc3QgdG8gbGlzdCBhbmQgc2V0IGNvbXByZWhlbnNpb25zLFxubmVlZHMgdHdvIGV4cHJlc3Npb25zIHNlcGFyYXRlZCB3aXRoIGEgY29sb24gZm9sbG93ZWQgYnkgdGhlIHVzdWFsXG4iZm9yIiBhbmQgImlmIiBjbGF1c2VzLiBXaGVuIHRoZSBjb21wcmVoZW5zaW9uIGlzIHJ1biwgdGhlIHJlc3VsdGluZ1xua2V5IGFuZCB2YWx1ZSBlbGVtZW50cyBhcmUgaW5zZXJ0ZWQgaW4gdGhlIG5ldyBkaWN0aW9uYXJ5IGluIHRoZSBvcmRlclxudGhleSBhcmUgcHJvZHVjZWQuXG5cblJlc3RyaWN0aW9ucyBvbiB0aGUgdHlwZXMgb2YgdGhlIGtleSB2YWx1ZXMgYXJlIGxpc3RlZCBlYXJsaWVyIGluXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqLiAgKFRvIHN1bW1hcml6ZSwgdGhlIGtleSB0eXBlXG5zaG91bGQgYmUgKmhhc2hhYmxlKiwgd2hpY2ggZXhjbHVkZXMgYWxsIG11dGFibGUgb2JqZWN0cy4pICBDbGFzaGVzXG5iZXR3ZWVuIGR1cGxpY2F0ZSBrZXlzIGFyZSBub3QgZGV0ZWN0ZWQ7IHRoZSBsYXN0IGRhdHVtICh0ZXh0dWFsbHlcbnJpZ2h0bW9zdCBpbiB0aGUgZGlzcGxheSkgc3RvcmVkIGZvciBhIGdpdmVuIGtleSB2YWx1ZSBwcmV2YWlscy5cbicsCisgJ2R5bmFtaWMtZmVhdHVyZXMnOiAnXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5JZiB0aGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYVxuZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWVcbnZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGFcbm5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhXG5gYFN5bnRheEVycm9yYGAgdW5sZXNzIHRoZSBleGVjIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBsb2NhbFxubmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZVxuaWxsZWdhbCwgYnV0IGBgZXhlYyBvYmogaW4gbnNgYCB3b3VsZCBiZSBsZWdhbC4pXG5cblRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsIGVudmlyb25tZW50IGZvclxucmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbCBhbmQgZ2xvYmFsXG5uYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFsxXSBUaGVcbmBgZXhlY2BgIHN0YXRlbWVudCBhbmQgdGhlIGBgZXZhbCgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIGZ1bmN0aW9uc1xuaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLlxuSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbicsCisgJ2Vsc2UnOiAnXG5UaGUgYGBpZmBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKipcblxuVGhlIGBgaWZgYCBzdGF0ZW1lbnQgaXMgdXNlZCBmb3IgY29uZGl0aW9uYWwgZXhlY3V0aW9uOlxuXG4gICBpZl9zdG10IDo6PSAiaWYiIGV4cHJlc3Npb24gIjoiIHN1aXRlXG4gICAgICAgICAgICAgICAoICJlbGlmIiBleHByZXNzaW9uICI6IiBzdWl0ZSApKlxuICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG5cbkl0IHNlbGVjdHMgZXhhY3RseSBvbmUgb2YgdGhlIHN1aXRlcyBieSBldmFsdWF0aW5nIHRoZSBleHByZXNzaW9ucyBvbmVcbmJ5IG9uZSB1bnRpbCBvbmUgaXMgZm91bmQgdG8gYmUgdHJ1ZSAoc2VlIHNlY3Rpb24gKkJvb2xlYW4gb3BlcmF0aW9ucypcbmZvciB0aGUgZGVmaW5pdGlvbiBvZiB0cnVlIGFuZCBmYWxzZSk7IHRoZW4gdGhhdCBzdWl0ZSBpcyBleGVjdXRlZFxuKGFuZCBubyBvdGhlciBwYXJ0IG9mIHRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIG9yIGV2YWx1YXRlZCkuXG5JZiBhbGwgZXhwcmVzc2lvbnMgYXJlIGZhbHNlLCB0aGUgc3VpdGUgb2YgdGhlIGBgZWxzZWBgIGNsYXVzZSwgaWZcbnByZXNlbnQsIGlzIGV4ZWN1dGVkLlxuJywKKyAnZXhjZXB0aW9ucyc6ICdcbkV4Y2VwdGlvbnNcbioqKioqKioqKipcblxuRXhjZXB0aW9ucyBhcmUgYSBtZWFucyBvZiBicmVha2luZyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IG9mIGNvbnRyb2xcbm9mIGEgY29kZSBibG9jayBpbiBvcmRlciB0byBoYW5kbGUgZXJyb3JzIG9yIG90aGVyIGV4Y2VwdGlvbmFsXG5jb25kaXRpb25zLiAgQW4gZXhjZXB0aW9uIGlzICpyYWlzZWQqIGF0IHRoZSBwb2ludCB3aGVyZSB0aGUgZXJyb3IgaXNcbmRldGVjdGVkOyBpdCBtYXkgYmUgKmhhbmRsZWQqIGJ5IHRoZSBzdXJyb3VuZGluZyBjb2RlIGJsb2NrIG9yIGJ5IGFueVxuY29kZSBibG9jayB0aGF0IGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW52b2tlZCB0aGUgY29kZSBibG9jayB3aGVyZVxudGhlIGVycm9yIG9jY3VycmVkLlxuXG5UaGUgUHl0aG9uIGludGVycHJldGVyIHJhaXNlcyBhbiBleGNlcHRpb24gd2hlbiBpdCBkZXRlY3RzIGEgcnVuLXRpbWVcbmVycm9yIChzdWNoIGFzIGRpdmlzaW9uIGJ5IHplcm8pLiAgQSBQeXRob24gcHJvZ3JhbSBjYW4gYWxzb1xuZXhwbGljaXRseSByYWlzZSBhbiBleGNlcHRpb24gd2l0aCB0aGUgYGByYWlzZWBgIHN0YXRlbWVudC4gRXhjZXB0aW9uXG5oYW5kbGVycyBhcmUgc3BlY2lmaWVkIHdpdGggdGhlIGBgdHJ5YGAgLi4uIGBgZXhjZXB0YGAgc3RhdGVtZW50LiAgVGhlXG5gYGZpbmFsbHlgYCBjbGF1c2Ugb2Ygc3VjaCBhIHN0YXRlbWVudCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGNsZWFudXBcbmNvZGUgd2hpY2ggZG9lcyBub3QgaGFuZGxlIHRoZSBleGNlcHRpb24sIGJ1dCBpcyBleGVjdXRlZCB3aGV0aGVyIGFuXG5leGNlcHRpb24gb2NjdXJyZWQgb3Igbm90IGluIHRoZSBwcmVjZWRpbmcgY29kZS5cblxuUHl0aG9uIHVzZXMgdGhlICJ0ZXJtaW5hdGlvbiIgbW9kZWwgb2YgZXJyb3IgaGFuZGxpbmc6IGFuIGV4Y2VwdGlvblxuaGFuZGxlciBjYW4gZmluZCBvdXQgd2hhdCBoYXBwZW5lZCBhbmQgY29udGludWUgZXhlY3V0aW9uIGF0IGFuIG91dGVyXG5sZXZlbCwgYnV0IGl0IGNhbm5vdCByZXBhaXIgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBhbmQgcmV0cnkgdGhlXG5mYWlsaW5nIG9wZXJhdGlvbiAoZXhjZXB0IGJ5IHJlLWVudGVyaW5nIHRoZSBvZmZlbmRpbmcgcGllY2Ugb2YgY29kZVxuZnJvbSB0aGUgdG9wKS5cblxuV2hlbiBhbiBleGNlcHRpb24gaXMgbm90IGhhbmRsZWQgYXQgYWxsLCB0aGUgaW50ZXJwcmV0ZXIgdGVybWluYXRlc1xuZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtLCBvciByZXR1cm5zIHRvIGl0cyBpbnRlcmFjdGl2ZSBtYWluIGxvb3AuICBJblxuZWl0aGVyIGNhc2UsIGl0IHByaW50cyBhIHN0YWNrIGJhY2t0cmFjZSwgZXhjZXB0IHdoZW4gdGhlIGV4Y2VwdGlvbiBpc1xuYGBTeXN0ZW1FeGl0YGAuXG5cbkV4Y2VwdGlvbnMgYXJlIGlkZW50aWZpZWQgYnkgY2xhc3MgaW5zdGFuY2VzLiAgVGhlIGBgZXhjZXB0YGAgY2xhdXNlXG5pcyBzZWxlY3RlZCBkZXBlbmRpbmcgb24gdGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZTogaXQgbXVzdCByZWZlcmVuY2VcbnRoZSBjbGFzcyBvZiB0aGUgaW5zdGFuY2Ugb3IgYSBiYXNlIGNsYXNzIHRoZXJlb2YuICBUaGUgaW5zdGFuY2UgY2FuXG5iZSByZWNlaXZlZCBieSB0aGUgaGFuZGxlciBhbmQgY2FuIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXRcbnRoZSBleGNlcHRpb25hbCBjb25kaXRpb24uXG5cbkV4Y2VwdGlvbnMgY2FuIGFsc28gYmUgaWRlbnRpZmllZCBieSBzdHJpbmdzLCBpbiB3aGljaCBjYXNlIHRoZVxuYGBleGNlcHRgYCBjbGF1c2UgaXMgc2VsZWN0ZWQgYnkgb2JqZWN0IGlkZW50aXR5LiAgQW4gYXJiaXRyYXJ5IHZhbHVlXG5jYW4gYmUgcmFpc2VkIGFsb25nIHdpdGggdGhlIGlkZW50aWZ5aW5nIHN0cmluZyB3aGljaCBjYW4gYmUgcGFzc2VkIHRvXG50aGUgaGFuZGxlci5cblxuTm90ZTogTWVzc2FnZXMgdG8gZXhjZXB0aW9ucyBhcmUgbm90IHBhcnQgb2YgdGhlIFB5dGhvbiBBUEkuICBUaGVpclxuICBjb250ZW50cyBtYXkgY2hhbmdlIGZyb20gb25lIHZlcnNpb24gb2YgUHl0aG9uIHRvIHRoZSBuZXh0IHdpdGhvdXRcbiAgd2FybmluZyBhbmQgc2hvdWxkIG5vdCBiZSByZWxpZWQgb24gYnkgY29kZSB3aGljaCB3aWxsIHJ1biB1bmRlclxuICBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJwcmV0ZXIuXG5cblNlZSBhbHNvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYGB0cnlgYCBzdGF0ZW1lbnQgaW4gc2VjdGlvbiAqVGhlIHRyeVxuc3RhdGVtZW50KiBhbmQgYGByYWlzZWBgIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cblxuLVsgRm9vdG5vdGVzIF0tXG5cblsxXSBUaGlzIGxpbWl0YXRpb24gb2NjdXJzIGJlY2F1c2UgdGhlIGNvZGUgdGhhdCBpcyBleGVjdXRlZCBieSB0aGVzZVxuICAgIG9wZXJhdGlvbnMgaXMgbm90IGF2YWlsYWJsZSBhdCB0aGUgdGltZSB0aGUgbW9kdWxlIGlzIGNvbXBpbGVkLlxuJywKKyAnZXhlY21vZGVsJzogJ1xuRXhlY3V0aW9uIG1vZGVsXG4qKioqKioqKioqKioqKipcblxuXG5OYW1pbmcgYW5kIGJpbmRpbmdcbj09PT09PT09PT09PT09PT09PVxuXG4qTmFtZXMqIHJlZmVyIHRvIG9iamVjdHMuICBOYW1lcyBhcmUgaW50cm9kdWNlZCBieSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuIEVhY2ggb2NjdXJyZW5jZSBvZiBhIG5hbWUgaW4gdGhlIHByb2dyYW0gdGV4dCByZWZlcnMgdG9cbnRoZSAqYmluZGluZyogb2YgdGhhdCBuYW1lIGVzdGFibGlzaGVkIGluIHRoZSBpbm5lcm1vc3QgZnVuY3Rpb24gYmxvY2tcbmNvbnRhaW5pbmcgdGhlIHVzZS5cblxuQSAqYmxvY2sqIGlzIGEgcGllY2Ugb2YgUHl0aG9uIHByb2dyYW0gdGV4dCB0aGF0IGlzIGV4ZWN1dGVkIGFzIGFcbnVuaXQuIFRoZSBmb2xsb3dpbmcgYXJlIGJsb2NrczogYSBtb2R1bGUsIGEgZnVuY3Rpb24gYm9keSwgYW5kIGEgY2xhc3NcbmRlZmluaXRpb24uIEVhY2ggY29tbWFuZCB0eXBlZCBpbnRlcmFjdGl2ZWx5IGlzIGEgYmxvY2suICBBIHNjcmlwdFxuZmlsZSAoYSBmaWxlIGdpdmVuIGFzIHN0YW5kYXJkIGlucHV0IHRvIHRoZSBpbnRlcnByZXRlciBvciBzcGVjaWZpZWRcbm9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmUgdGhlIGZpcnN0IGFyZ3VtZW50KSBpcyBhIGNvZGUgYmxvY2suXG5BIHNjcmlwdCBjb21tYW5kIChhIGNvbW1hbmQgc3BlY2lmaWVkIG9uIHRoZSBpbnRlcnByZXRlciBjb21tYW5kIGxpbmVcbndpdGggdGhlIFwnKiotYyoqXCcgb3B0aW9uKSBpcyBhIGNvZGUgYmxvY2suICBUaGUgZmlsZSByZWFkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBleGVjZmlsZSgpYGAgaXMgYSBjb2RlIGJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudFxucGFzc2VkIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGV2YWwoKWBgIGFuZCB0byB0aGUgYGBleGVjYGBcbnN0YXRlbWVudCBpcyBhIGNvZGUgYmxvY2suIFRoZSBleHByZXNzaW9uIHJlYWQgYW5kIGV2YWx1YXRlZCBieSB0aGVcbmJ1aWx0LWluIGZ1bmN0aW9uIGBgaW5wdXQoKWBgIGlzIGEgY29kZSBibG9jay5cblxuQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSBjb250YWluc1xuc29tZSBhZG1pbmlzdHJhdGl2ZSBpbmZvcm1hdGlvbiAodXNlZCBmb3IgZGVidWdnaW5nKSBhbmQgZGV0ZXJtaW5lc1xud2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrXCdzIGV4ZWN1dGlvbiBoYXNcbmNvbXBsZXRlZC5cblxuQSAqc2NvcGUqIGRlZmluZXMgdGhlIHZpc2liaWxpdHkgb2YgYSBuYW1lIHdpdGhpbiBhIGJsb2NrLiAgSWYgYSBsb2NhbFxudmFyaWFibGUgaXMgZGVmaW5lZCBpbiBhIGJsb2NrLCBpdHMgc2NvcGUgaW5jbHVkZXMgdGhhdCBibG9jay4gIElmIHRoZVxuZGVmaW5pdGlvbiBvY2N1cnMgaW4gYSBmdW5jdGlvbiBibG9jaywgdGhlIHNjb3BlIGV4dGVuZHMgdG8gYW55IGJsb2Nrc1xuY29udGFpbmVkIHdpdGhpbiB0aGUgZGVmaW5pbmcgb25lLCB1bmxlc3MgYSBjb250YWluZWQgYmxvY2sgaW50cm9kdWNlc1xuYSBkaWZmZXJlbnQgYmluZGluZyBmb3IgdGhlIG5hbWUuICBUaGUgc2NvcGUgb2YgbmFtZXMgZGVmaW5lZCBpbiBhXG5jbGFzcyBibG9jayBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzcyBibG9jazsgaXQgZG9lcyBub3QgZXh0ZW5kIHRvIHRoZVxuY29kZSBibG9ja3Mgb2YgbWV0aG9kcyAtLSB0aGlzIGluY2x1ZGVzIGdlbmVyYXRvciBleHByZXNzaW9ucyBzaW5jZVxudGhleSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgYSBmdW5jdGlvbiBzY29wZS4gIFRoaXMgbWVhbnMgdGhhdCB0aGVcbmZvbGxvd2luZyB3aWxsIGZhaWw6XG5cbiAgIGNsYXNzIEE6XG4gICAgICAgYSA9IDQyXG4gICAgICAgYiA9IGxpc3QoYSArIGkgZm9yIGkgaW4gcmFuZ2UoMTApKVxuXG5XaGVuIGEgbmFtZSBpcyB1c2VkIGluIGEgY29kZSBibG9jaywgaXQgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIG5lYXJlc3RcbmVuY2xvc2luZyBzY29wZS4gIFRoZSBzZXQgb2YgYWxsIHN1Y2ggc2NvcGVzIHZpc2libGUgdG8gYSBjb2RlIGJsb2NrXG5pcyBjYWxsZWQgdGhlIGJsb2NrXCdzICplbnZpcm9ubWVudCouXG5cbklmIGEgbmFtZSBpcyBib3VuZCBpbiBhIGJsb2NrLCBpdCBpcyBhIGxvY2FsIHZhcmlhYmxlIG9mIHRoYXQgYmxvY2suXG5JZiBhIG5hbWUgaXMgYm91bmQgYXQgdGhlIG1vZHVsZSBsZXZlbCwgaXQgaXMgYSBnbG9iYWwgdmFyaWFibGUuICAoVGhlXG52YXJpYWJsZXMgb2YgdGhlIG1vZHVsZSBjb2RlIGJsb2NrIGFyZSBsb2NhbCBhbmQgZ2xvYmFsLikgIElmIGFcbnZhcmlhYmxlIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrIGJ1dCBub3QgZGVmaW5lZCB0aGVyZSwgaXQgaXMgYSAqZnJlZVxudmFyaWFibGUqLlxuXG5XaGVuIGEgbmFtZSBpcyBub3QgZm91bmQgYXQgYWxsLCBhIGBgTmFtZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbklmIHRoZSBuYW1lIHJlZmVycyB0byBhIGxvY2FsIHZhcmlhYmxlIHRoYXQgaGFzIG5vdCBiZWVuIGJvdW5kLCBhXG5gYFVuYm91bmRMb2NhbEVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIGBgVW5ib3VuZExvY2FsRXJyb3JgYCBpcyBhXG5zdWJjbGFzcyBvZiBgYE5hbWVFcnJvcmBgLlxuXG5UaGUgZm9sbG93aW5nIGNvbnN0cnVjdHMgYmluZCBuYW1lczogZm9ybWFsIHBhcmFtZXRlcnMgdG8gZnVuY3Rpb25zLFxuYGBpbXBvcnRgYCBzdGF0ZW1lbnRzLCBjbGFzcyBhbmQgZnVuY3Rpb24gZGVmaW5pdGlvbnMgKHRoZXNlIGJpbmQgdGhlXG5jbGFzcyBvciBmdW5jdGlvbiBuYW1lIGluIHRoZSBkZWZpbmluZyBibG9jayksIGFuZCB0YXJnZXRzIHRoYXQgYXJlXG5pZGVudGlmaWVycyBpZiBvY2N1cnJpbmcgaW4gYW4gYXNzaWdubWVudCwgYGBmb3JgYCBsb29wIGhlYWRlciwgaW4gdGhlXG5zZWNvbmQgcG9zaXRpb24gb2YgYW4gYGBleGNlcHRgYCBjbGF1c2UgaGVhZGVyIG9yIGFmdGVyIGBgYXNgYCBpbiBhXG5gYHdpdGhgYCBzdGF0ZW1lbnQuICBUaGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgb2YgdGhlIGZvcm0gYGBmcm9tIC4uLlxuaW1wb3J0ICpgYCBiaW5kcyBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgaW1wb3J0ZWQgbW9kdWxlLCBleGNlcHRcbnRob3NlIGJlZ2lubmluZyB3aXRoIGFuIHVuZGVyc2NvcmUuICBUaGlzIGZvcm0gbWF5IG9ubHkgYmUgdXNlZCBhdCB0aGVcbm1vZHVsZSBsZXZlbC5cblxuQSB0YXJnZXQgb2NjdXJyaW5nIGluIGEgYGBkZWxgYCBzdGF0ZW1lbnQgaXMgYWxzbyBjb25zaWRlcmVkIGJvdW5kIGZvclxudGhpcyBwdXJwb3NlICh0aG91Z2ggdGhlIGFjdHVhbCBzZW1hbnRpY3MgYXJlIHRvIHVuYmluZCB0aGUgbmFtZSkuICBJdFxuaXMgaWxsZWdhbCB0byB1bmJpbmQgYSBuYW1lIHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhbiBlbmNsb3Npbmcgc2NvcGU7XG50aGUgY29tcGlsZXIgd2lsbCByZXBvcnQgYSBgYFN5bnRheEVycm9yYGAuXG5cbkVhY2ggYXNzaWdubWVudCBvciBpbXBvcnQgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jayBkZWZpbmVkIGJ5IGFcbmNsYXNzIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24gb3IgYXQgdGhlIG1vZHVsZSBsZXZlbCAodGhlIHRvcC1sZXZlbFxuY29kZSBibG9jaykuXG5cbklmIGEgbmFtZSBiaW5kaW5nIG9wZXJhdGlvbiBvY2N1cnMgYW55d2hlcmUgd2l0aGluIGEgY29kZSBibG9jaywgYWxsXG51c2VzIG9mIHRoZSBuYW1lIHdpdGhpbiB0aGUgYmxvY2sgYXJlIHRyZWF0ZWQgYXMgcmVmZXJlbmNlcyB0byB0aGVcbmN1cnJlbnQgYmxvY2suICBUaGlzIGNhbiBsZWFkIHRvIGVycm9ycyB3aGVuIGEgbmFtZSBpcyB1c2VkIHdpdGhpbiBhXG5ibG9jayBiZWZvcmUgaXQgaXMgYm91bmQuIFRoaXMgcnVsZSBpcyBzdWJ0bGUuICBQeXRob24gbGFja3NcbmRlY2xhcmF0aW9ucyBhbmQgYWxsb3dzIG5hbWUgYmluZGluZyBvcGVyYXRpb25zIHRvIG9jY3VyIGFueXdoZXJlXG53aXRoaW4gYSBjb2RlIGJsb2NrLiAgVGhlIGxvY2FsIHZhcmlhYmxlcyBvZiBhIGNvZGUgYmxvY2sgY2FuIGJlXG5kZXRlcm1pbmVkIGJ5IHNjYW5uaW5nIHRoZSBlbnRpcmUgdGV4dCBvZiB0aGUgYmxvY2sgZm9yIG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy5cblxuSWYgdGhlIGdsb2JhbCBzdGF0ZW1lbnQgb2NjdXJzIHdpdGhpbiBhIGJsb2NrLCBhbGwgdXNlcyBvZiB0aGUgbmFtZVxuc3BlY2lmaWVkIGluIHRoZSBzdGF0ZW1lbnQgcmVmZXIgdG8gdGhlIGJpbmRpbmcgb2YgdGhhdCBuYW1lIGluIHRoZVxudG9wLWxldmVsIG5hbWVzcGFjZS4gTmFtZXMgYXJlIHJlc29sdmVkIGluIHRoZSB0b3AtbGV2ZWwgbmFtZXNwYWNlIGJ5XG5zZWFyY2hpbmcgdGhlIGdsb2JhbCBuYW1lc3BhY2UsIGkuZS4gdGhlIG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlXG5jb250YWluaW5nIHRoZSBjb2RlIGJsb2NrLCBhbmQgdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSwgdGhlIG5hbWVzcGFjZVxub2YgdGhlIG1vZHVsZSBgYF9fYnVpbHRpbl9fYGAuICBUaGUgZ2xvYmFsIG5hbWVzcGFjZSBpcyBzZWFyY2hlZFxuZmlyc3QuICBJZiB0aGUgbmFtZSBpcyBub3QgZm91bmQgdGhlcmUsIHRoZSBidWlsdGlucyBuYW1lc3BhY2UgaXNcbnNlYXJjaGVkLiAgVGhlIGdsb2JhbCBzdGF0ZW1lbnQgbXVzdCBwcmVjZWRlIGFsbCB1c2VzIG9mIHRoZSBuYW1lLlxuXG5UaGUgYnVpbHRpbnMgbmFtZXNwYWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXhlY3V0aW9uIG9mIGEgY29kZSBibG9ja1xuaXMgYWN0dWFsbHkgZm91bmQgYnkgbG9va2luZyB1cCB0aGUgbmFtZSBgYF9fYnVpbHRpbnNfX2BgIGluIGl0c1xuZ2xvYmFsIG5hbWVzcGFjZTsgdGhpcyBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5IG9yIGEgbW9kdWxlIChpbiB0aGVcbmxhdHRlciBjYXNlIHRoZSBtb2R1bGVcJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlXG5gYF9fbWFpbl9fYGAgbW9kdWxlLCBgYF9fYnVpbHRpbnNfX2BgIGlzIHRoZSBidWlsdC1pbiBtb2R1bGVcbmBgX19idWlsdGluX19gYCAobm90ZTogbm8gXCdzXCcpOyB3aGVuIGluIGFueSBvdGhlciBtb2R1bGUsXG5gYF9fYnVpbHRpbnNfX2BgIGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUgYGBfX2J1aWx0aW5fX2BgXG5tb2R1bGUgaXRzZWxmLiAgYGBfX2J1aWx0aW5zX19gYCBjYW4gYmUgc2V0IHRvIGEgdXNlci1jcmVhdGVkXG5kaWN0aW9uYXJ5IHRvIGNyZWF0ZSBhIHdlYWsgZm9ybSBvZiByZXN0cmljdGVkIGV4ZWN1dGlvbi5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBVc2VycyBzaG91bGQgbm90IHRvdWNoXG5gYF9fYnVpbHRpbnNfX2BgOyBpdCBpcyBzdHJpY3RseSBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuICBVc2Vyc1xud2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBzaG91bGQgYGBpbXBvcnRgYFxudGhlIGBgX19idWlsdGluX19gYCAobm8gXCdzXCcpIG1vZHVsZSBhbmQgbW9kaWZ5IGl0cyBhdHRyaWJ1dGVzXG5hcHByb3ByaWF0ZWx5LlxuXG5UaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYVxubW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkXG5gYF9fbWFpbl9fYGAuXG5cblRoZSBgYGdsb2JhbGBgIHN0YXRlbWVudCBoYXMgdGhlIHNhbWUgc2NvcGUgYXMgYSBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbiBpbiB0aGUgc2FtZSBibG9jay4gIElmIHRoZSBuZWFyZXN0IGVuY2xvc2luZyBzY29wZSBmb3IgYVxuZnJlZSB2YXJpYWJsZSBjb250YWlucyBhIGdsb2JhbCBzdGF0ZW1lbnQsIHRoZSBmcmVlIHZhcmlhYmxlIGlzXG50cmVhdGVkIGFzIGEgZ2xvYmFsLlxuXG5BIGNsYXNzIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQgdGhhdCBtYXkgdXNlIGFuZCBkZWZpbmVcbm5hbWVzLiBUaGVzZSByZWZlcmVuY2VzIGZvbGxvdyB0aGUgbm9ybWFsIHJ1bGVzIGZvciBuYW1lIHJlc29sdXRpb24uXG5UaGUgbmFtZXNwYWNlIG9mIHRoZSBjbGFzcyBkZWZpbml0aW9uIGJlY29tZXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5XG5vZiB0aGUgY2xhc3MuICBOYW1lcyBkZWZpbmVkIGF0IHRoZSBjbGFzcyBzY29wZSBhcmUgbm90IHZpc2libGUgaW5cbm1ldGhvZHMuXG5cblxuSW50ZXJhY3Rpb24gd2l0aCBkeW5hbWljIGZlYXR1cmVzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuVGhlcmUgYXJlIHNldmVyYWwgY2FzZXMgd2hlcmUgUHl0aG9uIHN0YXRlbWVudHMgYXJlIGlsbGVnYWwgd2hlbiB1c2VkXG5pbiBjb25qdW5jdGlvbiB3aXRoIG5lc3RlZCBzY29wZXMgdGhhdCBjb250YWluIGZyZWUgdmFyaWFibGVzLlxuXG5JZiBhIHZhcmlhYmxlIGlzIHJlZmVyZW5jZWQgaW4gYW4gZW5jbG9zaW5nIHNjb3BlLCBpdCBpcyBpbGxlZ2FsIHRvXG5kZWxldGUgdGhlIG5hbWUuICBBbiBlcnJvciB3aWxsIGJlIHJlcG9ydGVkIGF0IGNvbXBpbGUgdGltZS5cblxuSWYgdGhlIHdpbGQgY2FyZCBmb3JtIG9mIGltcG9ydCAtLS0gYGBpbXBvcnQgKmBgIC0tLSBpcyB1c2VkIGluIGFcbmZ1bmN0aW9uIGFuZCB0aGUgZnVuY3Rpb24gY29udGFpbnMgb3IgaXMgYSBuZXN0ZWQgYmxvY2sgd2l0aCBmcmVlXG52YXJpYWJsZXMsIHRoZSBjb21waWxlciB3aWxsIHJhaXNlIGEgYGBTeW50YXhFcnJvcmBgLlxuXG5JZiBgYGV4ZWNgYCBpcyB1c2VkIGluIGEgZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhXG5uZXN0ZWQgYmxvY2sgd2l0aCBmcmVlIHZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYVxuYGBTeW50YXhFcnJvcmBgIHVubGVzcyB0aGUgZXhlYyBleHBsaWNpdGx5IHNwZWNpZmllcyB0aGUgbG9jYWxcbm5hbWVzcGFjZSBmb3IgdGhlIGBgZXhlY2BgLiAgKEluIG90aGVyIHdvcmRzLCBgYGV4ZWMgb2JqYGAgd291bGQgYmVcbmlsbGVnYWwsIGJ1dCBgYGV4ZWMgb2JqIGluIG5zYGAgd291bGQgYmUgbGVnYWwuKVxuXG5UaGUgYGBldmFsKClgYCwgYGBleGVjZmlsZSgpYGAsIGFuZCBgYGlucHV0KClgYCBmdW5jdGlvbnMgYW5kIHRoZVxuYGBleGVjYGAgc3RhdGVtZW50IGRvIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgZnVsbCBlbnZpcm9ubWVudCBmb3JcbnJlc29sdmluZyBuYW1lcy4gIE5hbWVzIG1heSBiZSByZXNvbHZlZCBpbiB0aGUgbG9jYWwgYW5kIGdsb2JhbFxubmFtZXNwYWNlcyBvZiB0aGUgY2FsbGVyLiAgRnJlZSB2YXJpYWJsZXMgYXJlIG5vdCByZXNvbHZlZCBpbiB0aGVcbm5lYXJlc3QgZW5jbG9zaW5nIG5hbWVzcGFjZSwgYnV0IGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBbMV0gVGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgYW5kIHRoZSBgYGV2YWwoKWBgIGFuZCBgYGV4ZWNmaWxlKClgYCBmdW5jdGlvbnNcbmhhdmUgb3B0aW9uYWwgYXJndW1lbnRzIHRvIG92ZXJyaWRlIHRoZSBnbG9iYWwgYW5kIGxvY2FsIG5hbWVzcGFjZS5cbklmIG9ubHkgb25lIG5hbWVzcGFjZSBpcyBzcGVjaWZpZWQsIGl0IGlzIHVzZWQgZm9yIGJvdGguXG5cblxuRXhjZXB0aW9uc1xuPT09PT09PT09PVxuXG5FeGNlcHRpb25zIGFyZSBhIG1lYW5zIG9mIGJyZWFraW5nIG91dCBvZiB0aGUgbm9ybWFsIGZsb3cgb2YgY29udHJvbFxub2YgYSBjb2RlIGJsb2NrIGluIG9yZGVyIHRvIGhhbmRsZSBlcnJvcnMgb3Igb3RoZXIgZXhjZXB0aW9uYWxcbmNvbmRpdGlvbnMuICBBbiBleGNlcHRpb24gaXMgKnJhaXNlZCogYXQgdGhlIHBvaW50IHdoZXJlIHRoZSBlcnJvciBpc1xuZGV0ZWN0ZWQ7IGl0IG1heSBiZSAqaGFuZGxlZCogYnkgdGhlIHN1cnJvdW5kaW5nIGNvZGUgYmxvY2sgb3IgYnkgYW55XG5jb2RlIGJsb2NrIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbnZva2VkIHRoZSBjb2RlIGJsb2NrIHdoZXJlXG50aGUgZXJyb3Igb2NjdXJyZWQuXG5cblRoZSBQeXRob24gaW50ZXJwcmV0ZXIgcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aGVuIGl0IGRldGVjdHMgYSBydW4tdGltZVxuZXJyb3IgKHN1Y2ggYXMgZGl2aXNpb24gYnkgemVybykuICBBIFB5dGhvbiBwcm9ncmFtIGNhbiBhbHNvXG5leHBsaWNpdGx5IHJhaXNlIGFuIGV4Y2VwdGlvbiB3aXRoIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50LiBFeGNlcHRpb25cbmhhbmRsZXJzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgYGB0cnlgYCAuLi4gYGBleGNlcHRgYCBzdGF0ZW1lbnQuICBUaGVcbmBgZmluYWxseWBgIGNsYXVzZSBvZiBzdWNoIGEgc3RhdGVtZW50IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgY2xlYW51cFxuY29kZSB3aGljaCBkb2VzIG5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbiwgYnV0IGlzIGV4ZWN1dGVkIHdoZXRoZXIgYW5cbmV4Y2VwdGlvbiBvY2N1cnJlZCBvciBub3QgaW4gdGhlIHByZWNlZGluZyBjb2RlLlxuXG5QeXRob24gdXNlcyB0aGUgInRlcm1pbmF0aW9uIiBtb2RlbCBvZiBlcnJvciBoYW5kbGluZzogYW4gZXhjZXB0aW9uXG5oYW5kbGVyIGNhbiBmaW5kIG91dCB3aGF0IGhhcHBlbmVkIGFuZCBjb250aW51ZSBleGVjdXRpb24gYXQgYW4gb3V0ZXJcbmxldmVsLCBidXQgaXQgY2Fubm90IHJlcGFpciB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGFuZCByZXRyeSB0aGVcbmZhaWxpbmcgb3BlcmF0aW9uIChleGNlcHQgYnkgcmUtZW50ZXJpbmcgdGhlIG9mZmVuZGluZyBwaWVjZSBvZiBjb2RlXG5mcm9tIHRoZSB0b3ApLlxuXG5XaGVuIGFuIGV4Y2VwdGlvbiBpcyBub3QgaGFuZGxlZCBhdCBhbGwsIHRoZSBpbnRlcnByZXRlciB0ZXJtaW5hdGVzXG5leGVjdXRpb24gb2YgdGhlIHByb2dyYW0sIG9yIHJldHVybnMgdG8gaXRzIGludGVyYWN0aXZlIG1haW4gbG9vcC4gIEluXG5laXRoZXIgY2FzZSwgaXQgcHJpbnRzIGEgc3RhY2sgYmFja3RyYWNlLCBleGNlcHQgd2hlbiB0aGUgZXhjZXB0aW9uIGlzXG5gYFN5c3RlbUV4aXRgYC5cblxuRXhjZXB0aW9ucyBhcmUgaWRlbnRpZmllZCBieSBjbGFzcyBpbnN0YW5jZXMuICBUaGUgYGBleGNlcHRgYCBjbGF1c2VcbmlzIHNlbGVjdGVkIGRlcGVuZGluZyBvbiB0aGUgY2xhc3Mgb2YgdGhlIGluc3RhbmNlOiBpdCBtdXN0IHJlZmVyZW5jZVxudGhlIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSBvciBhIGJhc2UgY2xhc3MgdGhlcmVvZi4gIFRoZSBpbnN0YW5jZSBjYW5cbmJlIHJlY2VpdmVkIGJ5IHRoZSBoYW5kbGVyIGFuZCBjYW4gY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dFxudGhlIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbi5cblxuRXhjZXB0aW9ucyBjYW4gYWxzbyBiZSBpZGVudGlmaWVkIGJ5IHN0cmluZ3MsIGluIHdoaWNoIGNhc2UgdGhlXG5gYGV4Y2VwdGBgIGNsYXVzZSBpcyBzZWxlY3RlZCBieSBvYmplY3QgaWRlbnRpdHkuICBBbiBhcmJpdHJhcnkgdmFsdWVcbmNhbiBiZSByYWlzZWQgYWxvbmcgd2l0aCB0aGUgaWRlbnRpZnlpbmcgc3RyaW5nIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG9cbnRoZSBoYW5kbGVyLlxuXG5Ob3RlOiBNZXNzYWdlcyB0byBleGNlcHRpb25zIGFyZSBub3QgcGFydCBvZiB0aGUgUHl0aG9uIEFQSS4gIFRoZWlyXG4gIGNvbnRlbnRzIG1heSBjaGFuZ2UgZnJvbSBvbmUgdmVyc2lvbiBvZiBQeXRob24gdG8gdGhlIG5leHQgd2l0aG91dFxuICB3YXJuaW5nIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBieSBjb2RlIHdoaWNoIHdpbGwgcnVuIHVuZGVyXG4gIG11bHRpcGxlIHZlcnNpb25zIG9mIHRoZSBpbnRlcnByZXRlci5cblxuU2VlIGFsc28gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYHRyeWBgIHN0YXRlbWVudCBpbiBzZWN0aW9uICpUaGUgdHJ5XG5zdGF0ZW1lbnQqIGFuZCBgYHJhaXNlYGAgc3RhdGVtZW50IGluIHNlY3Rpb24gKlRoZSByYWlzZSBzdGF0ZW1lbnQqLlxuXG4tWyBGb290bm90ZXMgXS1cblxuWzFdIFRoaXMgbGltaXRhdGlvbiBvY2N1cnMgYmVjYXVzZSB0aGUgY29kZSB0aGF0IGlzIGV4ZWN1dGVkIGJ5IHRoZXNlXG4gICAgb3BlcmF0aW9ucyBpcyBub3QgYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBtb2R1bGUgaXMgY29tcGlsZWQuXG4nLAorICdleHBybGlzdHMnOiAnXG5FeHByZXNzaW9uIGxpc3RzXG4qKioqKioqKioqKioqKioqXG5cbiAgIGV4cHJlc3Npb25fbGlzdCA6Oj0gZXhwcmVzc2lvbiAoICIsIiBleHByZXNzaW9uICkqIFsiLCJdXG5cbkFuIGV4cHJlc3Npb24gbGlzdCBjb250YWluaW5nIGF0IGxlYXN0IG9uZSBjb21tYSB5aWVsZHMgYSB0dXBsZS4gIFRoZVxubGVuZ3RoIG9mIHRoZSB0dXBsZSBpcyB0aGUgbnVtYmVyIG9mIGV4cHJlc3Npb25zIGluIHRoZSBsaXN0LiAgVGhlXG5leHByZXNzaW9ucyBhcmUgZXZhbHVhdGVkIGZyb20gbGVmdCB0byByaWdodC5cblxuVGhlIHRyYWlsaW5nIGNvbW1hIGlzIHJlcXVpcmVkIG9ubHkgdG8gY3JlYXRlIGEgc2luZ2xlIHR1cGxlIChhLmsuYS4gYVxuKnNpbmdsZXRvbiopOyBpdCBpcyBvcHRpb25hbCBpbiBhbGwgb3RoZXIgY2FzZXMuICBBIHNpbmdsZSBleHByZXNzaW9uXG53aXRob3V0IGEgdHJhaWxpbmcgY29tbWEgZG9lc25cJ3QgY3JlYXRlIGEgdHVwbGUsIGJ1dCByYXRoZXIgeWllbGRzIHRoZVxudmFsdWUgb2YgdGhhdCBleHByZXNzaW9uLiAoVG8gY3JlYXRlIGFuIGVtcHR5IHR1cGxlLCB1c2UgYW4gZW1wdHkgcGFpclxub2YgcGFyZW50aGVzZXM6IGBgKClgYC4pXG4nLAorICdmbG9hdGluZyc6ICdcbkZsb2F0aW5nIHBvaW50IGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKioqKioqKlxuXG5GbG9hdGluZyBwb2ludCBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbFxuZGVmaW5pdGlvbnM6XG5cbiAgIGZsb2F0bnVtYmVyICAgOjo9IHBvaW50ZmxvYXQgfCBleHBvbmVudGZsb2F0XG4gICBwb2ludGZsb2F0ICAgIDo6PSBbaW50cGFydF0gZnJhY3Rpb24gfCBpbnRwYXJ0ICIuIlxuICAgZXhwb25lbnRmbG9hdCA6Oj0gKGludHBhcnQgfCBwb2ludGZsb2F0KSBleHBvbmVudFxuICAgaW50cGFydCAgICAgICA6Oj0gZGlnaXQrXG4gICBmcmFjdGlvbiAgICAgIDo6PSAiLiIgZGlnaXQrXG4gICBleHBvbmVudCAgICAgIDo6PSAoImUiIHwgIkUiKSBbIisiIHwgIi0iXSBkaWdpdCtcblxuTm90ZSB0aGF0IHRoZSBpbnRlZ2VyIGFuZCBleHBvbmVudCBwYXJ0cyBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzIGNhblxubG9vayBsaWtlIG9jdGFsIGludGVnZXJzLCBidXQgYXJlIGludGVycHJldGVkIHVzaW5nIHJhZGl4IDEwLiAgRm9yXG5leGFtcGxlLCBgYDA3N2UwMTBgYCBpcyBsZWdhbCwgYW5kIGRlbm90ZXMgdGhlIHNhbWUgbnVtYmVyIGFzXG5gYDc3ZTEwYGAuIFRoZSBhbGxvd2VkIHJhbmdlIG9mIGZsb2F0aW5nIHBvaW50IGxpdGVyYWxzIGlzXG5pbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuIFNvbWUgZXhhbXBsZXMgb2YgZmxvYXRpbmcgcG9pbnQgbGl0ZXJhbHM6XG5cbiAgIDMuMTQgICAgMTAuICAgIC4wMDEgICAgMWUxMDAgICAgMy4xNGUtMTAgICAgMGUwXG5cbk5vdGUgdGhhdCBudW1lcmljIGxpdGVyYWxzIGRvIG5vdCBpbmNsdWRlIGEgc2lnbjsgYSBwaHJhc2UgbGlrZSBgYC0xYGBcbmlzIGFjdHVhbGx5IGFuIGV4cHJlc3Npb24gY29tcG9zZWQgb2YgdGhlIHVuYXJ5IG9wZXJhdG9yIGBgLWBgIGFuZCB0aGVcbmxpdGVyYWwgYGAxYGAuXG4nLAorICdmb3InOiAnXG5UaGUgYGBmb3JgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGBmb3JgYCBzdGF0ZW1lbnQgaXMgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIGVsZW1lbnRzIG9mIGFcbnNlcXVlbmNlIChzdWNoIGFzIGEgc3RyaW5nLCB0dXBsZSBvciBsaXN0KSBvciBvdGhlciBpdGVyYWJsZSBvYmplY3Q6XG5cbiAgIGZvcl9zdG10IDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIGV4cHJlc3Npb25fbGlzdCAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICBbImVsc2UiICI6IiBzdWl0ZV1cblxuVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBldmFsdWF0ZWQgb25jZTsgaXQgc2hvdWxkIHlpZWxkIGFuIGl0ZXJhYmxlXG5vYmplY3QuICBBbiBpdGVyYXRvciBpcyBjcmVhdGVkIGZvciB0aGUgcmVzdWx0IG9mIHRoZVxuYGBleHByZXNzaW9uX2xpc3RgYC4gIFRoZSBzdWl0ZSBpcyB0aGVuIGV4ZWN1dGVkIG9uY2UgZm9yIGVhY2ggaXRlbVxucHJvdmlkZWQgYnkgdGhlIGl0ZXJhdG9yLCBpbiB0aGUgb3JkZXIgb2YgYXNjZW5kaW5nIGluZGljZXMuICBFYWNoXG5pdGVtIGluIHR1cm4gaXMgYXNzaWduZWQgdG8gdGhlIHRhcmdldCBsaXN0IHVzaW5nIHRoZSBzdGFuZGFyZCBydWxlc1xuZm9yIGFzc2lnbm1lbnRzLCBhbmQgdGhlbiB0aGUgc3VpdGUgaXMgZXhlY3V0ZWQuICBXaGVuIHRoZSBpdGVtcyBhcmVcbmV4aGF1c3RlZCAod2hpY2ggaXMgaW1tZWRpYXRlbHkgd2hlbiB0aGUgc2VxdWVuY2UgaXMgZW1wdHkpLCB0aGUgc3VpdGVcbmluIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmIHByZXNlbnQsIGlzIGV4ZWN1dGVkLCBhbmQgdGhlIGxvb3BcbnRlcm1pbmF0ZXMuXG5cbkEgYGBicmVha2BgIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZVwncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmRcbmNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGl0ZW0sIG9yIHdpdGggdGhlIGBgZWxzZWBgIGNsYXVzZSBpZiB0aGVyZSB3YXNcbm5vIG5leHQgaXRlbS5cblxuVGhlIHN1aXRlIG1heSBhc3NpZ24gdG8gdGhlIHZhcmlhYmxlKHMpIGluIHRoZSB0YXJnZXQgbGlzdDsgdGhpcyBkb2VzXG5ub3QgYWZmZWN0IHRoZSBuZXh0IGl0ZW0gYXNzaWduZWQgdG8gaXQuXG5cblRoZSB0YXJnZXQgbGlzdCBpcyBub3QgZGVsZXRlZCB3aGVuIHRoZSBsb29wIGlzIGZpbmlzaGVkLCBidXQgaWYgdGhlXG5zZXF1ZW5jZSBpcyBlbXB0eSwgaXQgd2lsbCBub3QgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGF0IGFsbCBieSB0aGVcbmxvb3AuICBIaW50OiB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGByYW5nZSgpYGAgcmV0dXJucyBhIHNlcXVlbmNlIG9mXG5pbnRlZ2VycyBzdWl0YWJsZSB0byBlbXVsYXRlIHRoZSBlZmZlY3Qgb2YgUGFzY2FsXCdzIGBgZm9yIGkgOj0gYSB0byBiXG5kb2BgOyBlLmcuLCBgYHJhbmdlKDMpYGAgcmV0dXJucyB0aGUgbGlzdCBgYFswLCAxLCAyXWBgLlxuXG5Ob3RlOiBUaGVyZSBpcyBhIHN1YnRsZXR5IHdoZW4gdGhlIHNlcXVlbmNlIGlzIGJlaW5nIG1vZGlmaWVkIGJ5IHRoZSBsb29wXG4gICh0aGlzIGNhbiBvbmx5IG9jY3VyIGZvciBtdXRhYmxlIHNlcXVlbmNlcywgaS5lLiBsaXN0cykuIEFuIGludGVybmFsXG4gIGNvdW50ZXIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIGl0ZW0gaXMgdXNlZCBuZXh0LCBhbmQgdGhpc1xuICBpcyBpbmNyZW1lbnRlZCBvbiBlYWNoIGl0ZXJhdGlvbi4gIFdoZW4gdGhpcyBjb3VudGVyIGhhcyByZWFjaGVkIHRoZVxuICBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIHRoZSBsb29wIHRlcm1pbmF0ZXMuICBUaGlzIG1lYW5zIHRoYXQgaWYgdGhlXG4gIHN1aXRlIGRlbGV0ZXMgdGhlIGN1cnJlbnQgKG9yIGEgcHJldmlvdXMpIGl0ZW0gZnJvbSB0aGUgc2VxdWVuY2UsXG4gIHRoZSBuZXh0IGl0ZW0gd2lsbCBiZSBza2lwcGVkIChzaW5jZSBpdCBnZXRzIHRoZSBpbmRleCBvZiB0aGVcbiAgY3VycmVudCBpdGVtIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gdHJlYXRlZCkuICBMaWtld2lzZSwgaWYgdGhlXG4gIHN1aXRlIGluc2VydHMgYW4gaXRlbSBpbiB0aGUgc2VxdWVuY2UgYmVmb3JlIHRoZSBjdXJyZW50IGl0ZW0sIHRoZVxuICBjdXJyZW50IGl0ZW0gd2lsbCBiZSB0cmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgdGhyb3VnaCB0aGUgbG9vcC5cbiAgVGhpcyBjYW4gbGVhZCB0byBuYXN0eSBidWdzIHRoYXQgY2FuIGJlIGF2b2lkZWQgYnkgbWFraW5nIGFcbiAgdGVtcG9yYXJ5IGNvcHkgdXNpbmcgYSBzbGljZSBvZiB0aGUgd2hvbGUgc2VxdWVuY2UsIGUuZy4sXG5cbiAgICAgZm9yIHggaW4gYVs6XTpcbiAgICAgICAgIGlmIHggPCAwOiBhLnJlbW92ZSh4KVxuJywKKyAnZm9ybWF0c3RyaW5ncyc6ICdcbkZvcm1hdCBTdHJpbmcgU3ludGF4XG4qKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGBzdHIuZm9ybWF0KClgYCBtZXRob2QgYW5kIHRoZSBgYEZvcm1hdHRlcmBgIGNsYXNzIHNoYXJlIHRoZSBzYW1lXG5zeW50YXggZm9yIGZvcm1hdCBzdHJpbmdzIChhbHRob3VnaCBpbiB0aGUgY2FzZSBvZiBgYEZvcm1hdHRlcmBgLFxuc3ViY2xhc3NlcyBjYW4gZGVmaW5lIHRoZWlyIG93biBmb3JtYXQgc3RyaW5nIHN5bnRheCkuXG5cbkZvcm1hdCBzdHJpbmdzIGNvbnRhaW4gInJlcGxhY2VtZW50IGZpZWxkcyIgc3Vycm91bmRlZCBieSBjdXJseSBicmFjZXNcbmBge31gYC4gQW55dGhpbmcgdGhhdCBpcyBub3QgY29udGFpbmVkIGluIGJyYWNlcyBpcyBjb25zaWRlcmVkIGxpdGVyYWxcbnRleHQsIHdoaWNoIGlzIGNvcGllZCB1bmNoYW5nZWQgdG8gdGhlIG91dHB1dC4gIElmIHlvdSBuZWVkIHRvIGluY2x1ZGVcbmEgYnJhY2UgY2hhcmFjdGVyIGluIHRoZSBsaXRlcmFsIHRleHQsIGl0IGNhbiBiZSBlc2NhcGVkIGJ5IGRvdWJsaW5nOlxuYGB7e2BgIGFuZCBgYH19YGAuXG5cblRoZSBncmFtbWFyIGZvciBhIHJlcGxhY2VtZW50IGZpZWxkIGlzIGFzIGZvbGxvd3M6XG5cbiAgICAgIHJlcGxhY2VtZW50X2ZpZWxkIDo6PSAieyIgW2ZpZWxkX25hbWVdIFsiISIgY29udmVyc2lvbl0gWyI6IiBmb3JtYXRfc3BlY10gIn0iXG4gICAgICBmaWVsZF9uYW1lICAgICAgICA6Oj0gYXJnX25hbWUgKCIuIiBhdHRyaWJ1dGVfbmFtZSB8ICJbIiBlbGVtZW50X2luZGV4ICJdIikqXG4gICAgICBhcmdfbmFtZSAgICAgICAgICA6Oj0gW2lkZW50aWZpZXIgfCBpbnRlZ2VyXVxuICAgICAgYXR0cmlidXRlX25hbWUgICAgOjo9IGlkZW50aWZpZXJcbiAgICAgIGVsZW1lbnRfaW5kZXggICAgIDo6PSBpbnRlZ2VyIHwgaW5kZXhfc3RyaW5nXG4gICAgICBpbmRleF9zdHJpbmcgICAgICA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXSI+ICtcbiAgICAgIGNvbnZlcnNpb24gICAgICAgIDo6PSAiciIgfCAicyJcbiAgICAgIGZvcm1hdF9zcGVjICAgICAgIDo6PSA8ZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24+XG5cbkluIGxlc3MgZm9ybWFsIHRlcm1zLCB0aGUgcmVwbGFjZW1lbnQgZmllbGQgY2FuIHN0YXJ0IHdpdGggYVxuKmZpZWxkX25hbWUqIHRoYXQgc3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgaXMgdG8gYmUgZm9ybWF0dGVkXG5hbmQgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IGluc3RlYWQgb2YgdGhlIHJlcGxhY2VtZW50IGZpZWxkLiBUaGVcbipmaWVsZF9uYW1lKiBpcyBvcHRpb25hbGx5IGZvbGxvd2VkIGJ5IGEgICpjb252ZXJzaW9uKiBmaWVsZCwgd2hpY2ggaXNcbnByZWNlZGVkIGJ5IGFuIGV4Y2xhbWF0aW9uIHBvaW50IGBgXCchXCdgYCwgYW5kIGEgKmZvcm1hdF9zcGVjKiwgd2hpY2hcbmlzIHByZWNlZGVkIGJ5IGEgY29sb24gYGBcJzpcJ2BgLiAgVGhlc2Ugc3BlY2lmeSBhIG5vbi1kZWZhdWx0IGZvcm1hdFxuZm9yIHRoZSByZXBsYWNlbWVudCB2YWx1ZS5cblxuU2VlIGFsc28gdGhlICpGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlKiBzZWN0aW9uLlxuXG5UaGUgKmZpZWxkX25hbWUqIGl0c2VsZiBiZWdpbnMgd2l0aCBhbiAqYXJnX25hbWUqIHRoYXQgaXMgZWl0aGVyIGFcbm51bWJlciBvciBhIGtleXdvcmQuICBJZiBpdFwncyBhIG51bWJlciwgaXQgcmVmZXJzIHRvIGEgcG9zaXRpb25hbFxuYXJndW1lbnQsIGFuZCBpZiBpdFwncyBhIGtleXdvcmQsIGl0IHJlZmVycyB0byBhIG5hbWVkIGtleXdvcmRcbmFyZ3VtZW50LiAgSWYgdGhlIG51bWVyaWNhbCBhcmdfbmFtZXMgaW4gYSBmb3JtYXQgc3RyaW5nIGFyZSAwLCAxLCAyLFxuLi4uIGluIHNlcXVlbmNlLCB0aGV5IGNhbiBhbGwgYmUgb21pdHRlZCAobm90IGp1c3Qgc29tZSkgYW5kIHRoZVxubnVtYmVycyAwLCAxLCAyLCAuLi4gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGluIHRoYXQgb3JkZXIuXG5CZWNhdXNlICphcmdfbmFtZSogaXMgbm90IHF1b3RlLWRlbGltaXRlZCwgaXQgaXMgbm90IHBvc3NpYmxlIHRvXG5zcGVjaWZ5IGFyYml0cmFyeSBkaWN0aW9uYXJ5IGtleXMgKGUuZy4sIHRoZSBzdHJpbmdzIGBgXCcxMFwnYGAgb3JcbmBgXCc6LV1cJ2BgKSB3aXRoaW4gYSBmb3JtYXQgc3RyaW5nLiBUaGUgKmFyZ19uYW1lKiBjYW4gYmUgZm9sbG93ZWQgYnlcbmFueSBudW1iZXIgb2YgaW5kZXggb3IgYXR0cmlidXRlIGV4cHJlc3Npb25zLiBBbiBleHByZXNzaW9uIG9mIHRoZVxuZm9ybSBgYFwnLm5hbWVcJ2BgIHNlbGVjdHMgdGhlIG5hbWVkIGF0dHJpYnV0ZSB1c2luZyBgYGdldGF0dHIoKWBgLFxud2hpbGUgYW4gZXhwcmVzc2lvbiBvZiB0aGUgZm9ybSBgYFwnW2luZGV4XVwnYGAgZG9lcyBhbiBpbmRleCBsb29rdXBcbnVzaW5nIGBgX19nZXRpdGVtX18oKWBgLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBUaGUgcG9zaXRpb25hbCBhcmd1bWVudCBzcGVjaWZpZXJzIGNhbiBiZVxub21pdHRlZCwgc28gYGBcJ3t9IHt9XCdgYCBpcyBlcXVpdmFsZW50IHRvIGBgXCd7MH0gezF9XCdgYC5cblxuU29tZSBzaW1wbGUgZm9ybWF0IHN0cmluZyBleGFtcGxlczpcblxuICAgIkZpcnN0LCB0aG91IHNoYWx0IGNvdW50IHRvIHswfSIgIyBSZWZlcmVuY2VzIGZpcnN0IHBvc2l0aW9uYWwgYXJndW1lbnRcbiAgICJCcmluZyBtZSBhIHt9IiAgICAgICAgICAgICAgICAgICMgSW1wbGljaXRseSByZWZlcmVuY2VzIHRoZSBmaXJzdCBwb3NpdGlvbmFsIGFyZ3VtZW50XG4gICAiRnJvbSB7fSB0byB7fSIgICAgICAgICAgICAgICAgICAjIFNhbWUgYXMgIkZyb20gezB9IHRvIHsxfSJcbiAgICJNeSBxdWVzdCBpcyB7bmFtZX0iICAgICAgICAgICAgICMgUmVmZXJlbmNlcyBrZXl3b3JkIGFyZ3VtZW50IFwnbmFtZVwnXG4gICAiV2VpZ2h0IGluIHRvbnMgezAud2VpZ2h0fSIgICAgICAjIFwnd2VpZ2h0XCcgYXR0cmlidXRlIG9mIGZpcnN0IHBvc2l0aW9uYWwgYXJnXG4gICAiVW5pdHMgZGVzdHJveWVkOiB7cGxheWVyc1swXX0iICAjIEZpcnN0IGVsZW1lbnQgb2Yga2V5d29yZCBhcmd1bWVudCBcJ3BsYXllcnNcJy5cblxuVGhlICpjb252ZXJzaW9uKiBmaWVsZCBjYXVzZXMgYSB0eXBlIGNvZXJjaW9uIGJlZm9yZSBmb3JtYXR0aW5nLlxuTm9ybWFsbHksIHRoZSBqb2Igb2YgZm9ybWF0dGluZyBhIHZhbHVlIGlzIGRvbmUgYnkgdGhlXG5gYF9fZm9ybWF0X18oKWBgIG1ldGhvZCBvZiB0aGUgdmFsdWUgaXRzZWxmLiAgSG93ZXZlciwgaW4gc29tZSBjYXNlc1xuaXQgaXMgZGVzaXJhYmxlIHRvIGZvcmNlIGEgdHlwZSB0byBiZSBmb3JtYXR0ZWQgYXMgYSBzdHJpbmcsXG5vdmVycmlkaW5nIGl0cyBvd24gZGVmaW5pdGlvbiBvZiBmb3JtYXR0aW5nLiAgQnkgY29udmVydGluZyB0aGUgdmFsdWVcbnRvIGEgc3RyaW5nIGJlZm9yZSBjYWxsaW5nIGBgX19mb3JtYXRfXygpYGAsIHRoZSBub3JtYWwgZm9ybWF0dGluZ1xubG9naWMgaXMgYnlwYXNzZWQuXG5cblR3byBjb252ZXJzaW9uIGZsYWdzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOiBgYFwnIXNcJ2BgIHdoaWNoIGNhbGxzXG5gYHN0cigpYGAgb24gdGhlIHZhbHVlLCBhbmQgYGBcJyFyXCdgYCB3aGljaCBjYWxscyBgYHJlcHIoKWBgLlxuXG5Tb21lIGV4YW1wbGVzOlxuXG4gICAiSGFyb2xkXCdzIGEgY2xldmVyIHswIXN9IiAgICAgICAgIyBDYWxscyBzdHIoKSBvbiB0aGUgYXJndW1lbnQgZmlyc3RcbiAgICJCcmluZyBvdXQgdGhlIGhvbHkge25hbWUhcn0iICAgICMgQ2FsbHMgcmVwcigpIG9uIHRoZSBhcmd1bWVudCBmaXJzdFxuXG5UaGUgKmZvcm1hdF9zcGVjKiBmaWVsZCBjb250YWlucyBhIHNwZWNpZmljYXRpb24gb2YgaG93IHRoZSB2YWx1ZVxuc2hvdWxkIGJlIHByZXNlbnRlZCwgaW5jbHVkaW5nIHN1Y2ggZGV0YWlscyBhcyBmaWVsZCB3aWR0aCwgYWxpZ25tZW50LFxucGFkZGluZywgZGVjaW1hbCBwcmVjaXNpb24gYW5kIHNvIG9uLiAgRWFjaCB2YWx1ZSB0eXBlIGNhbiBkZWZpbmUgaXRzXG5vd24gImZvcm1hdHRpbmcgbWluaS1sYW5ndWFnZSIgb3IgaW50ZXJwcmV0YXRpb24gb2YgdGhlICpmb3JtYXRfc3BlYyouXG5cbk1vc3QgYnVpbHQtaW4gdHlwZXMgc3VwcG9ydCBhIGNvbW1vbiBmb3JtYXR0aW5nIG1pbmktbGFuZ3VhZ2UsIHdoaWNoXG5pcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbi5cblxuQSAqZm9ybWF0X3NwZWMqIGZpZWxkIGNhbiBhbHNvIGluY2x1ZGUgbmVzdGVkIHJlcGxhY2VtZW50IGZpZWxkc1xud2l0aGluIGl0LiBUaGVzZSBuZXN0ZWQgcmVwbGFjZW1lbnQgZmllbGRzIGNhbiBjb250YWluIG9ubHkgYSBmaWVsZFxubmFtZTsgY29udmVyc2lvbiBmbGFncyBhbmQgZm9ybWF0IHNwZWNpZmljYXRpb25zIGFyZSBub3QgYWxsb3dlZC4gIFRoZVxucmVwbGFjZW1lbnQgZmllbGRzIHdpdGhpbiB0aGUgZm9ybWF0X3NwZWMgYXJlIHN1YnN0aXR1dGVkIGJlZm9yZSB0aGVcbipmb3JtYXRfc3BlYyogc3RyaW5nIGlzIGludGVycHJldGVkLiBUaGlzIGFsbG93cyB0aGUgZm9ybWF0dGluZyBvZiBhXG52YWx1ZSB0byBiZSBkeW5hbWljYWxseSBzcGVjaWZpZWQuXG5cblNlZSB0aGUgKkZvcm1hdCBleGFtcGxlcyogc2VjdGlvbiBmb3Igc29tZSBleGFtcGxlcy5cblxuXG5Gb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiJGb3JtYXQgc3BlY2lmaWNhdGlvbnMiIGFyZSB1c2VkIHdpdGhpbiByZXBsYWNlbWVudCBmaWVsZHMgY29udGFpbmVkXG53aXRoaW4gYSBmb3JtYXQgc3RyaW5nIHRvIGRlZmluZSBob3cgaW5kaXZpZHVhbCB2YWx1ZXMgYXJlIHByZXNlbnRlZFxuKHNlZSAqRm9ybWF0IFN0cmluZyBTeW50YXgqKS4gIFRoZXkgY2FuIGFsc28gYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZVxuYnVpbHQtaW4gYGBmb3JtYXQoKWBgIGZ1bmN0aW9uLiAgRWFjaCBmb3JtYXR0YWJsZSB0eXBlIG1heSBkZWZpbmUgaG93XG50aGUgZm9ybWF0IHNwZWNpZmljYXRpb24gaXMgdG8gYmUgaW50ZXJwcmV0ZWQuXG5cbk1vc3QgYnVpbHQtaW4gdHlwZXMgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBmb3IgZm9ybWF0XG5zcGVjaWZpY2F0aW9ucywgYWx0aG91Z2ggc29tZSBvZiB0aGUgZm9ybWF0dGluZyBvcHRpb25zIGFyZSBvbmx5XG5zdXBwb3J0ZWQgYnkgdGhlIG51bWVyaWMgdHlwZXMuXG5cbkEgZ2VuZXJhbCBjb252ZW50aW9uIGlzIHRoYXQgYW4gZW1wdHkgZm9ybWF0IHN0cmluZyAoYGAiImBgKSBwcm9kdWNlc1xudGhlIHNhbWUgcmVzdWx0IGFzIGlmIHlvdSBoYWQgY2FsbGVkIGBgc3RyKClgYCBvbiB0aGUgdmFsdWUuIEEgbm9uLVxuZW1wdHkgZm9ybWF0IHN0cmluZyB0eXBpY2FsbHkgbW9kaWZpZXMgdGhlIHJlc3VsdC5cblxuVGhlIGdlbmVyYWwgZm9ybSBvZiBhICpzdGFuZGFyZCBmb3JtYXQgc3BlY2lmaWVyKiBpczpcblxuICAgZm9ybWF0X3NwZWMgOjo9IFtbZmlsbF1hbGlnbl1bc2lnbl1bI11bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdXG4gICBmaWxsICAgICAgICA6Oj0gPGEgY2hhcmFjdGVyIG90aGVyIHRoYW4gXCd7XCcgb3IgXCd9XCc+XG4gICBhbGlnbiAgICAgICA6Oj0gIjwiIHwgIj4iIHwgIj0iIHwgIl4iXG4gICBzaWduICAgICAgICA6Oj0gIisiIHwgIi0iIHwgIiAiXG4gICB3aWR0aCAgICAgICA6Oj0gaW50ZWdlclxuICAgcHJlY2lzaW9uICAgOjo9IGludGVnZXJcbiAgIHR5cGUgICAgICAgIDo6PSAiYiIgfCAiYyIgfCAiZCIgfCAiZSIgfCAiRSIgfCAiZiIgfCAiRiIgfCAiZyIgfCAiRyIgfCAibiIgfCAibyIgfCAicyIgfCAieCIgfCAiWCIgfCAiJSJcblxuVGhlICpmaWxsKiBjaGFyYWN0ZXIgY2FuIGJlIGFueSBjaGFyYWN0ZXIgb3RoZXIgdGhhbiBcJ3tcJyBvciBcJ31cJy4gIFRoZVxucHJlc2VuY2Ugb2YgYSBmaWxsIGNoYXJhY3RlciBpcyBzaWduYWxlZCBieSB0aGUgY2hhcmFjdGVyIGZvbGxvd2luZ1xuaXQsIHdoaWNoIG11c3QgYmUgb25lIG9mIHRoZSBhbGlnbm1lbnQgb3B0aW9ucy4gIElmIHRoZSBzZWNvbmRcbmNoYXJhY3RlciBvZiAqZm9ybWF0X3NwZWMqIGlzIG5vdCBhIHZhbGlkIGFsaWdubWVudCBvcHRpb24sIHRoZW4gaXQgaXNcbmFzc3VtZWQgdGhhdCBib3RoIHRoZSBmaWxsIGNoYXJhY3RlciBhbmQgdGhlIGFsaWdubWVudCBvcHRpb24gYXJlXG5hYnNlbnQuXG5cblRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGFsaWdubWVudCBvcHRpb25zIGlzIGFzIGZvbGxvd3M6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IE9wdGlvbiAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgYGBcJzxcJ2BgICAgfCBGb3JjZXMgdGhlIGZpZWxkIHRvIGJlIGxlZnQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgIHxcbiAgIHwgICAgICAgICAgIHwgc3BhY2UgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIG1vc3Qgb2JqZWN0cykuICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnPlwnYGAgICB8IEZvcmNlcyB0aGUgZmllbGQgdG8gYmUgcmlnaHQtYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgfFxuICAgfCAgICAgICAgICAgfCBzcGFjZSAodGhpcyBpcyB0aGUgZGVmYXVsdCBmb3IgbnVtYmVycykuICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCc9XCdgYCAgIHwgRm9yY2VzIHRoZSBwYWRkaW5nIHRvIGJlIHBsYWNlZCBhZnRlciB0aGUgc2lnbiAoaWYgYW55KSAgICB8XG4gICB8ICAgICAgICAgICB8IGJ1dCBiZWZvcmUgdGhlIGRpZ2l0cy4gIFRoaXMgaXMgdXNlZCBmb3IgcHJpbnRpbmcgZmllbGRzICAgfFxuICAgfCAgICAgICAgICAgfCBpbiB0aGUgZm9ybSBcJyswMDAwMDAxMjBcJy4gVGhpcyBhbGlnbm1lbnQgb3B0aW9uIGlzIG9ubHkgICAgfFxuICAgfCAgICAgICAgICAgfCB2YWxpZCBmb3IgbnVtZXJpYyB0eXBlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdeXCdgYCAgIHwgRm9yY2VzIHRoZSBmaWVsZCB0byBiZSBjZW50ZXJlZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuTm90ZSB0aGF0IHVubGVzcyBhIG1pbmltdW0gZmllbGQgd2lkdGggaXMgZGVmaW5lZCwgdGhlIGZpZWxkIHdpZHRoXG53aWxsIGFsd2F5cyBiZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBkYXRhIHRvIGZpbGwgaXQsIHNvIHRoYXQgdGhlXG5hbGlnbm1lbnQgb3B0aW9uIGhhcyBubyBtZWFuaW5nIGluIHRoaXMgY2FzZS5cblxuVGhlICpzaWduKiBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgbnVtYmVyIHR5cGVzLCBhbmQgY2FuIGJlIG9uZSBvZlxudGhlIGZvbGxvd2luZzpcblxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgT3B0aW9uICAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09K1xuICAgfCBgYFwnK1wnYGAgICB8IGluZGljYXRlcyB0aGF0IGEgc2lnbiBzaG91bGQgYmUgdXNlZCBmb3IgYm90aCBwb3NpdGl2ZSBhcyAgfFxuICAgfCAgICAgICAgICAgfCB3ZWxsIGFzIG5lZ2F0aXZlIG51bWJlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCctXCdgYCAgIHwgaW5kaWNhdGVzIHRoYXQgYSBzaWduIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIG5lZ2F0aXZlICAgICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlcnMgKHRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IpLiAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgc3BhY2UgICAgIHwgaW5kaWNhdGVzIHRoYXQgYSBsZWFkaW5nIHNwYWNlIHNob3VsZCBiZSB1c2VkIG9uIHBvc2l0aXZlICB8XG4gICB8ICAgICAgICAgICB8IG51bWJlcnMsIGFuZCBhIG1pbnVzIHNpZ24gb24gbmVnYXRpdmUgbnVtYmVycy4gICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuVGhlIGBgXCcjXCdgYCBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgaW50ZWdlcnMsIGFuZCBvbmx5IGZvciBiaW5hcnksXG5vY3RhbCwgb3IgaGV4YWRlY2ltYWwgb3V0cHV0LiAgSWYgcHJlc2VudCwgaXQgc3BlY2lmaWVzIHRoYXQgdGhlXG5vdXRwdXQgd2lsbCBiZSBwcmVmaXhlZCBieSBgYFwnMGJcJ2BgLCBgYFwnMG9cJ2BgLCBvciBgYFwnMHhcJ2BgLFxucmVzcGVjdGl2ZWx5LlxuXG5UaGUgYGBcJyxcJ2BgIG9wdGlvbiBzaWduYWxzIHRoZSB1c2Ugb2YgYSBjb21tYSBmb3IgYSB0aG91c2FuZHNcbnNlcGFyYXRvci4gRm9yIGEgbG9jYWxlIGF3YXJlIHNlcGFyYXRvciwgdXNlIHRoZSBgYFwnblwnYGAgaW50ZWdlclxucHJlc2VudGF0aW9uIHR5cGUgaW5zdGVhZC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogQWRkZWQgdGhlIGBgXCcsXCdgYCBvcHRpb24gKHNlZSBhbHNvICoqUEVQXG4zNzgqKikuXG5cbip3aWR0aCogaXMgYSBkZWNpbWFsIGludGVnZXIgZGVmaW5pbmcgdGhlIG1pbmltdW0gZmllbGQgd2lkdGguICBJZiBub3RcbnNwZWNpZmllZCwgdGhlbiB0aGUgZmllbGQgd2lkdGggd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBjb250ZW50LlxuXG5QcmVjZWRpbmcgdGhlICp3aWR0aCogZmllbGQgYnkgYSB6ZXJvIChgYFwnMFwnYGApIGNoYXJhY3RlciBlbmFibGVzXG5zaWduLWF3YXJlIHplcm8tcGFkZGluZyBmb3IgbnVtZXJpYyB0eXBlcy4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBhXG4qZmlsbCogY2hhcmFjdGVyIG9mIGBgXCcwXCdgYCB3aXRoIGFuICphbGlnbm1lbnQqIHR5cGUgb2YgYGBcJz1cJ2BgLlxuXG5UaGUgKnByZWNpc2lvbiogaXMgYSBkZWNpbWFsIG51bWJlciBpbmRpY2F0aW5nIGhvdyBtYW55IGRpZ2l0cyBzaG91bGRcbmJlIGRpc3BsYXllZCBhZnRlciB0aGUgZGVjaW1hbCBwb2ludCBmb3IgYSBmbG9hdGluZyBwb2ludCB2YWx1ZVxuZm9ybWF0dGVkIHdpdGggYGBcJ2ZcJ2BgIGFuZCBgYFwnRlwnYGAsIG9yIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWxcbnBvaW50IGZvciBhIGZsb2F0aW5nIHBvaW50IHZhbHVlIGZvcm1hdHRlZCB3aXRoIGBgXCdnXCdgYCBvciBgYFwnR1wnYGAuXG5Gb3Igbm9uLW51bWJlciB0eXBlcyB0aGUgZmllbGQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIGZpZWxkIHNpemUgLSBpblxub3RoZXIgd29yZHMsIGhvdyBtYW55IGNoYXJhY3RlcnMgd2lsbCBiZSB1c2VkIGZyb20gdGhlIGZpZWxkIGNvbnRlbnQuXG5UaGUgKnByZWNpc2lvbiogaXMgbm90IGFsbG93ZWQgZm9yIGludGVnZXIgdmFsdWVzLlxuXG5GaW5hbGx5LCB0aGUgKnR5cGUqIGRldGVybWluZXMgaG93IHRoZSBkYXRhIHNob3VsZCBiZSBwcmVzZW50ZWQuXG5cblRoZSBhdmFpbGFibGUgc3RyaW5nIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgYGBcJ3NcJ2BgICAgfCBTdHJpbmcgZm9ybWF0LiBUaGlzIGlzIHRoZSBkZWZhdWx0IHR5cGUgZm9yIHN0cmluZ3MgYW5kICAgIHxcbiAgIHwgICAgICAgICAgIHwgbWF5IGJlIG9taXR0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyBgYFwnc1wnYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuVGhlIGF2YWlsYWJsZSBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyBhcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgYGBcJ2JcJ2BgICAgfCBCaW5hcnkgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSAyLiAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdjXCdgYCAgIHwgQ2hhcmFjdGVyLiBDb252ZXJ0cyB0aGUgaW50ZWdlciB0byB0aGUgY29ycmVzcG9uZGluZyAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHVuaWNvZGUgY2hhcmFjdGVyIGJlZm9yZSBwcmludGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ2RcJ2BgICAgfCBEZWNpbWFsIEludGVnZXIuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDEwLiAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdvXCdgYCAgIHwgT2N0YWwgZm9ybWF0LiBPdXRwdXRzIHRoZSBudW1iZXIgaW4gYmFzZSA4LiAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwneFwnYGAgICB8IEhleCBmb3JtYXQuIE91dHB1dHMgdGhlIG51bWJlciBpbiBiYXNlIDE2LCB1c2luZyBsb3dlci0gICAgfFxuICAgfCAgICAgICAgICAgfCBjYXNlIGxldHRlcnMgZm9yIHRoZSBkaWdpdHMgYWJvdmUgOS4gICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdYXCdgYCAgIHwgSGV4IGZvcm1hdC4gT3V0cHV0cyB0aGUgbnVtYmVyIGluIGJhc2UgMTYsIHVzaW5nIHVwcGVyLSAgICB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgbGV0dGVycyBmb3IgdGhlIGRpZ2l0cyBhYm92ZSA5LiAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbiAgIHwgYGBcJ25cJ2BgICAgfCBOdW1iZXIuIFRoaXMgaXMgdGhlIHNhbWUgYXMgYGBcJ2RcJ2BgLCBleGNlcHQgdGhhdCBpdCB1c2VzICAgfFxuICAgfCAgICAgICAgICAgfCB0aGUgY3VycmVudCBsb2NhbGUgc2V0dGluZyB0byBpbnNlcnQgdGhlIGFwcHJvcHJpYXRlICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbnVtYmVyIHNlcGFyYXRvciBjaGFyYWN0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyBgYFwnZFwnYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuSW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlIHByZXNlbnRhdGlvbiB0eXBlcywgaW50ZWdlcnMgY2FuIGJlIGZvcm1hdHRlZFxud2l0aCB0aGUgZmxvYXRpbmcgcG9pbnQgcHJlc2VudGF0aW9uIHR5cGVzIGxpc3RlZCBiZWxvdyAoZXhjZXB0XG5gYFwnblwnYGAgYW5kIE5vbmUpLiBXaGVuIGRvaW5nIHNvLCBgYGZsb2F0KClgYCBpcyB1c2VkIHRvIGNvbnZlcnQgdGhlXG5pbnRlZ2VyIHRvIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGJlZm9yZSBmb3JtYXR0aW5nLlxuXG5UaGUgYXZhaWxhYmxlIHByZXNlbnRhdGlvbiB0eXBlcyBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kIGRlY2ltYWwgdmFsdWVzXG5hcmU6XG5cbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IFR5cGUgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKz09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PStcbiAgIHwgYGBcJ2VcJ2BgICAgfCBFeHBvbmVudCBub3RhdGlvbi4gUHJpbnRzIHRoZSBudW1iZXIgaW4gc2NpZW50aWZpYyAgICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgbm90YXRpb24gdXNpbmcgdGhlIGxldHRlciBcJ2VcJyB0byBpbmRpY2F0ZSB0aGUgZXhwb25lbnQuICAgIHxcbiAgIHwgICAgICAgICAgIHwgVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzIGBgNmBgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnRVwnYGAgICB8IEV4cG9uZW50IG5vdGF0aW9uLiBTYW1lIGFzIGBgXCdlXCdgYCBleGNlcHQgaXQgdXNlcyBhbiB1cHBlciB8XG4gICB8ICAgICAgICAgICB8IGNhc2UgXCdFXCcgYXMgdGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIuICAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnZlwnYGAgICB8IEZpeGVkIHBvaW50LiBEaXNwbGF5cyB0aGUgbnVtYmVyIGFzIGEgZml4ZWQtcG9pbnQgbnVtYmVyLiAgfFxuICAgfCAgICAgICAgICAgfCBUaGUgZGVmYXVsdCBwcmVjaXNpb24gaXMgYGA2YGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdGXCdgYCAgIHwgRml4ZWQgcG9pbnQuIFNhbWUgYXMgYGBcJ2ZcJ2BgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdnXCdgYCAgIHwgR2VuZXJhbCBmb3JtYXQuICBGb3IgYSBnaXZlbiBwcmVjaXNpb24gYGBwID49IDFgYCwgdGhpcyAgICB8XG4gICB8ICAgICAgICAgICB8IHJvdW5kcyB0aGUgbnVtYmVyIHRvIGBgcGBgIHNpZ25pZmljYW50IGRpZ2l0cyBhbmQgdGhlbiAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXRzIHRoZSByZXN1bHQgaW4gZWl0aGVyIGZpeGVkLXBvaW50IGZvcm1hdCBvciBpbiAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgc2NpZW50aWZpYyBub3RhdGlvbiwgZGVwZW5kaW5nIG9uIGl0cyBtYWduaXR1ZGUuICBUaGUgICAgICB8XG4gICB8ICAgICAgICAgICB8IHByZWNpc2UgcnVsZXMgYXJlIGFzIGZvbGxvd3M6IHN1cHBvc2UgdGhhdCB0aGUgcmVzdWx0ICAgICAgfFxuICAgfCAgICAgICAgICAgfCBmb3JtYXR0ZWQgd2l0aCBwcmVzZW50YXRpb24gdHlwZSBgYFwnZVwnYGAgYW5kIHByZWNpc2lvbiAgICAgfFxuICAgfCAgICAgICAgICAgfCBgYHAtMWBgIHdvdWxkIGhhdmUgZXhwb25lbnQgYGBleHBgYC4gIFRoZW4gaWYgYGAtNCA8PSBleHAgIHxcbiAgIHwgICAgICAgICAgIHwgPCBwYGAsIHRoZSBudW1iZXIgaXMgZm9ybWF0dGVkIHdpdGggcHJlc2VudGF0aW9uIHR5cGUgICAgICB8XG4gICB8ICAgICAgICAgICB8IGBgXCdmXCdgYCBhbmQgcHJlY2lzaW9uIGBgcC0xLWV4cGBgLiBPdGhlcndpc2UsIHRoZSBudW1iZXIgICB8XG4gICB8ICAgICAgICAgICB8IGlzIGZvcm1hdHRlZCB3aXRoIHByZXNlbnRhdGlvbiB0eXBlIGBgXCdlXCdgYCBhbmQgcHJlY2lzaW9uICB8XG4gICB8ICAgICAgICAgICB8IGBgcC0xYGAuIEluIGJvdGggY2FzZXMgaW5zaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcyBhcmUgICAgfFxuICAgfCAgICAgICAgICAgfCByZW1vdmVkIGZyb20gdGhlIHNpZ25pZmljYW5kLCBhbmQgdGhlIGRlY2ltYWwgcG9pbnQgaXMgICAgIHxcbiAgIHwgICAgICAgICAgIHwgYWxzbyByZW1vdmVkIGlmIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZGlnaXRzIGZvbGxvd2luZyAgICB8XG4gICB8ICAgICAgICAgICB8IGl0LiAgUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGluZmluaXR5LCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgfFxuICAgfCAgICAgICAgICAgfCB6ZXJvLCBhbmQgbmFucywgYXJlIGZvcm1hdHRlZCBhcyBgYGluZmBgLCBgYC1pbmZgYCwgYGAwYGAsIHxcbiAgIHwgICAgICAgICAgIHwgYGAtMGBgIGFuZCBgYG5hbmBgIHJlc3BlY3RpdmVseSwgcmVnYXJkbGVzcyBvZiB0aGUgICAgICAgICB8XG4gICB8ICAgICAgICAgICB8IHByZWNpc2lvbi4gIEEgcHJlY2lzaW9uIG9mIGBgMGBgIGlzIHRyZWF0ZWQgYXMgZXF1aXZhbGVudCAgfFxuICAgfCAgICAgICAgICAgfCB0byBhIHByZWNpc2lvbiBvZiBgYDFgYC4gIFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyBgYDZgYC4gIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCdHXCdgYCAgIHwgR2VuZXJhbCBmb3JtYXQuIFNhbWUgYXMgYGBcJ2dcJ2BgIGV4Y2VwdCBzd2l0Y2hlcyB0byBgYFwnRVwnYGAgfFxuICAgfCAgICAgICAgICAgfCBpZiB0aGUgbnVtYmVyIGdldHMgdG9vIGxhcmdlLiBUaGUgcmVwcmVzZW50YXRpb25zIG9mICAgICAgIHxcbiAgIHwgICAgICAgICAgIHwgaW5maW5pdHkgYW5kIE5hTiBhcmUgdXBwZXJjYXNlZCwgdG9vLiAgICAgICAgICAgICAgICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBgYFwnblwnYGAgICB8IE51bWJlci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBgYFwnZ1wnYGAsIGV4Y2VwdCB0aGF0IGl0IHVzZXMgICB8XG4gICB8ICAgICAgICAgICB8IHRoZSBjdXJyZW50IGxvY2FsZSBzZXR0aW5nIHRvIGluc2VydCB0aGUgYXBwcm9wcmlhdGUgICAgICAgfFxuICAgfCAgICAgICAgICAgfCBudW1iZXIgc2VwYXJhdG9yIGNoYXJhY3RlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbiAgICstLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG4gICB8IGBgXCclXCdgYCAgIHwgUGVyY2VudGFnZS4gTXVsdGlwbGllcyB0aGUgbnVtYmVyIGJ5IDEwMCBhbmQgZGlzcGxheXMgaW4gICB8XG4gICB8ICAgICAgICAgICB8IGZpeGVkIChgYFwnZlwnYGApIGZvcm1hdCwgZm9sbG93ZWQgYnkgYSBwZXJjZW50IHNpZ24uICAgICAgICB8XG4gICArLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuICAgfCBOb25lICAgICAgfCBUaGUgc2FtZSBhcyBgYFwnZ1wnYGAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuICAgKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcblxuXG5Gb3JtYXQgZXhhbXBsZXNcbj09PT09PT09PT09PT09PVxuXG5UaGlzIHNlY3Rpb24gY29udGFpbnMgZXhhbXBsZXMgb2YgdGhlIG5ldyBmb3JtYXQgc3ludGF4IGFuZCBjb21wYXJpc29uXG53aXRoIHRoZSBvbGQgYGAlYGAtZm9ybWF0dGluZy5cblxuSW4gbW9zdCBvZiB0aGUgY2FzZXMgdGhlIHN5bnRheCBpcyBzaW1pbGFyIHRvIHRoZSBvbGRcbmBgJWBgLWZvcm1hdHRpbmcsIHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBgYHt9YGAgYW5kIHdpdGggYGA6YGAgdXNlZFxuaW5zdGVhZCBvZiBgYCVgYC4gRm9yIGV4YW1wbGUsIGBgXCclMDMuMmZcJ2BgIGNhbiBiZSB0cmFuc2xhdGVkIHRvXG5gYFwnezowMy4yZn1cJ2BgLlxuXG5UaGUgbmV3IGZvcm1hdCBzeW50YXggYWxzbyBzdXBwb3J0cyBuZXcgYW5kIGRpZmZlcmVudCBvcHRpb25zLCBzaG93blxuaW4gdGhlIGZvbGxvdyBleGFtcGxlcy5cblxuQWNjZXNzaW5nIGFyZ3VtZW50cyBieSBwb3NpdGlvbjpcblxuICAgPj4+IFwnezB9LCB7MX0sIHsyfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdhLCBiLCBjXCdcbiAgID4+PiBcJ3t9LCB7fSwge31cJy5mb3JtYXQoXCdhXCcsIFwnYlwnLCBcJ2NcJykgICMgMi43KyBvbmx5XG4gICBcJ2EsIGIsIGNcJ1xuICAgPj4+IFwnezJ9LCB7MX0sIHswfVwnLmZvcm1hdChcJ2FcJywgXCdiXCcsIFwnY1wnKVxuICAgXCdjLCBiLCBhXCdcbiAgID4+PiBcJ3syfSwgezF9LCB7MH1cJy5mb3JtYXQoKlwnYWJjXCcpICAgICAgIyB1bnBhY2tpbmcgYXJndW1lbnQgc2VxdWVuY2VcbiAgIFwnYywgYiwgYVwnXG4gICA+Pj4gXCd7MH17MX17MH1cJy5mb3JtYXQoXCdhYnJhXCcsIFwnY2FkXCcpICAgIyBhcmd1bWVudHNcJyBpbmRpY2VzIGNhbiBiZSByZXBlYXRlZFxuICAgXCdhYnJhY2FkYWJyYVwnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHMgYnkgbmFtZTpcblxuICAgPj4+IFwnQ29vcmRpbmF0ZXM6IHtsYXRpdHVkZX0sIHtsb25naXR1ZGV9XCcuZm9ybWF0KGxhdGl0dWRlPVwnMzcuMjROXCcsIGxvbmdpdHVkZT1cJy0xMTUuODFXXCcpXG4gICBcJ0Nvb3JkaW5hdGVzOiAzNy4yNE4sIC0xMTUuODFXXCdcbiAgID4+PiBjb29yZCA9IHtcJ2xhdGl0dWRlXCc6IFwnMzcuMjROXCcsIFwnbG9uZ2l0dWRlXCc6IFwnLTExNS44MVdcJ31cbiAgID4+PiBcJ0Nvb3JkaW5hdGVzOiB7bGF0aXR1ZGV9LCB7bG9uZ2l0dWRlfVwnLmZvcm1hdCgqKmNvb3JkKVxuICAgXCdDb29yZGluYXRlczogMzcuMjROLCAtMTE1LjgxV1wnXG5cbkFjY2Vzc2luZyBhcmd1bWVudHNcJyBhdHRyaWJ1dGVzOlxuXG4gICA+Pj4gYyA9IDMtNWpcbiAgID4+PiAoXCdUaGUgY29tcGxleCBudW1iZXIgezB9IGlzIGZvcm1lZCBmcm9tIHRoZSByZWFsIHBhcnQgezAucmVhbH0gXCdcbiAgIC4uLiAgXCdhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IHswLmltYWd9LlwnKS5mb3JtYXQoYylcbiAgIFwnVGhlIGNvbXBsZXggbnVtYmVyICgzLTVqKSBpcyBmb3JtZWQgZnJvbSB0aGUgcmVhbCBwYXJ0IDMuMCBhbmQgdGhlIGltYWdpbmFyeSBwYXJ0IC01LjAuXCdcbiAgID4+PiBjbGFzcyBQb2ludChvYmplY3QpOlxuICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgeCwgeSk6XG4gICAuLi4gICAgICAgICBzZWxmLngsIHNlbGYueSA9IHgsIHlcbiAgIC4uLiAgICAgZGVmIF9fc3RyX18oc2VsZik6XG4gICAuLi4gICAgICAgICByZXR1cm4gXCdQb2ludCh7c2VsZi54fSwge3NlbGYueX0pXCcuZm9ybWF0KHNlbGY9c2VsZilcbiAgIC4uLlxuICAgPj4+IHN0cihQb2ludCg0LCAyKSlcbiAgIFwnUG9pbnQoNCwgMilcJ1xuXG5BY2Nlc3NpbmcgYXJndW1lbnRzXCcgaXRlbXM6XG5cbiAgID4+PiBjb29yZCA9ICgzLCA1KVxuICAgPj4+IFwnWDogezBbMF19OyAgWTogezBbMV19XCcuZm9ybWF0KGNvb3JkKVxuICAgXCdYOiAzOyAgWTogNVwnXG5cblJlcGxhY2luZyBgYCVzYGAgYW5kIGBgJXJgYDpcblxuICAgPj4+ICJyZXByKCkgc2hvd3MgcXVvdGVzOiB7IXJ9OyBzdHIoKSBkb2VzblwndDogeyFzfSIuZm9ybWF0KFwndGVzdDFcJywgXCd0ZXN0MlwnKVxuICAgInJlcHIoKSBzaG93cyBxdW90ZXM6IFwndGVzdDFcJzsgc3RyKCkgZG9lc25cJ3Q6IHRlc3QyIlxuXG5BbGlnbmluZyB0aGUgdGV4dCBhbmQgc3BlY2lmeWluZyBhIHdpZHRoOlxuXG4gICA+Pj4gXCd7OjwzMH1cJy5mb3JtYXQoXCdsZWZ0IGFsaWduZWRcJylcbiAgIFwnbGVmdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgXCdcbiAgID4+PiBcJ3s6PjMwfVwnLmZvcm1hdChcJ3JpZ2h0IGFsaWduZWRcJylcbiAgIFwnICAgICAgICAgICAgICAgICByaWdodCBhbGlnbmVkXCdcbiAgID4+PiBcJ3s6XjMwfVwnLmZvcm1hdChcJ2NlbnRlcmVkXCcpXG4gICBcJyAgICAgICAgICAgY2VudGVyZWQgICAgICAgICAgIFwnXG4gICA+Pj4gXCd7OipeMzB9XCcuZm9ybWF0KFwnY2VudGVyZWRcJykgICMgdXNlIFwnKlwnIGFzIGEgZmlsbCBjaGFyXG4gICBcJyoqKioqKioqKioqY2VudGVyZWQqKioqKioqKioqKlwnXG5cblJlcGxhY2luZyBgYCUrZmBgLCBgYCUtZmBgLCBhbmQgYGAlIGZgYCBhbmQgc3BlY2lmeWluZyBhIHNpZ246XG5cbiAgID4+PiBcJ3s6K2Z9OyB7OitmfVwnLmZvcm1hdCgzLjE0LCAtMy4xNCkgICMgc2hvdyBpdCBhbHdheXNcbiAgIFwnKzMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezogZn07IHs6IGZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IGEgc3BhY2UgZm9yIHBvc2l0aXZlIG51bWJlcnNcbiAgIFwnIDMuMTQwMDAwOyAtMy4xNDAwMDBcJ1xuICAgPj4+IFwnezotZn07IHs6LWZ9XCcuZm9ybWF0KDMuMTQsIC0zLjE0KSAgIyBzaG93IG9ubHkgdGhlIG1pbnVzIC0tIHNhbWUgYXMgXCd7OmZ9OyB7OmZ9XCdcbiAgIFwnMy4xNDAwMDA7IC0zLjE0MDAwMFwnXG5cblJlcGxhY2luZyBgYCV4YGAgYW5kIGBgJW9gYCBhbmQgY29udmVydGluZyB0aGUgdmFsdWUgdG8gZGlmZmVyZW50XG5iYXNlczpcblxuICAgPj4+ICMgZm9ybWF0IGFsc28gc3VwcG9ydHMgYmluYXJ5IG51bWJlcnNcbiAgID4+PiAiaW50OiB7MDpkfTsgIGhleDogezA6eH07ICBvY3Q6IHswOm99OyAgYmluOiB7MDpifSIuZm9ybWF0KDQyKVxuICAgXCdpbnQ6IDQyOyAgaGV4OiAyYTsgIG9jdDogNTI7ICBiaW46IDEwMTAxMFwnXG4gICA+Pj4gIyB3aXRoIDB4LCAwbywgb3IgMGIgYXMgcHJlZml4OlxuICAgPj4+ICJpbnQ6IHswOmR9OyAgaGV4OiB7MDojeH07ICBvY3Q6IHswOiNvfTsgIGJpbjogezA6I2J9Ii5mb3JtYXQoNDIpXG4gICBcJ2ludDogNDI7ICBoZXg6IDB4MmE7ICBvY3Q6IDBvNTI7ICBiaW46IDBiMTAxMDEwXCdcblxuVXNpbmcgdGhlIGNvbW1hIGFzIGEgdGhvdXNhbmRzIHNlcGFyYXRvcjpcblxuICAgPj4+IFwnezosfVwnLmZvcm1hdCgxMjM0NTY3ODkwKVxuICAgXCcxLDIzNCw1NjcsODkwXCdcblxuRXhwcmVzc2luZyBhIHBlcmNlbnRhZ2U6XG5cbiAgID4+PiBwb2ludHMgPSAxOS41XG4gICA+Pj4gdG90YWwgPSAyMlxuICAgPj4+IFwnQ29ycmVjdCBhbnN3ZXJzOiB7Oi4yJX1cJy5mb3JtYXQocG9pbnRzL3RvdGFsKVxuICAgXCdDb3JyZWN0IGFuc3dlcnM6IDg4LjY0JVwnXG5cblVzaW5nIHR5cGUtc3BlY2lmaWMgZm9ybWF0dGluZzpcblxuICAgPj4+IGltcG9ydCBkYXRldGltZVxuICAgPj4+IGQgPSBkYXRldGltZS5kYXRldGltZSgyMDEwLCA3LCA0LCAxMiwgMTUsIDU4KVxuICAgPj4+IFwnezolWS0lbS0lZCAlSDolTTolU31cJy5mb3JtYXQoZClcbiAgIFwnMjAxMC0wNy0wNCAxMjoxNTo1OFwnXG5cbk5lc3RpbmcgYXJndW1lbnRzIGFuZCBtb3JlIGNvbXBsZXggZXhhbXBsZXM6XG5cbiAgID4+PiBmb3IgYWxpZ24sIHRleHQgaW4gemlwKFwnPF4+XCcsIFtcJ2xlZnRcJywgXCdjZW50ZXJcJywgXCdyaWdodFwnXSk6XG4gICAuLi4gICAgIFwnezA6e2ZpbGx9e2FsaWdufTE2fVwnLmZvcm1hdCh0ZXh0LCBmaWxsPWFsaWduLCBhbGlnbj1hbGlnbilcbiAgIC4uLlxuICAgXCdsZWZ0PDw8PDw8PDw8PDw8XCdcbiAgIFwnXl5eXl5jZW50ZXJeXl5eXlwnXG4gICBcJz4+Pj4+Pj4+Pj4+cmlnaHRcJ1xuICAgPj4+XG4gICA+Pj4gb2N0ZXRzID0gWzE5MiwgMTY4LCAwLCAxXVxuICAgPj4+IFwnezowMlh9ezowMlh9ezowMlh9ezowMlh9XCcuZm9ybWF0KCpvY3RldHMpXG4gICBcJ0MwQTgwMDAxXCdcbiAgID4+PiBpbnQoXywgMTYpXG4gICAzMjMyMjM1NTIxXG4gICA+Pj5cbiAgID4+PiB3aWR0aCA9IDVcbiAgID4+PiBmb3IgbnVtIGluIHJhbmdlKDUsMTIpOlxuICAgLi4uICAgICBmb3IgYmFzZSBpbiBcJ2RYb2JcJzpcbiAgIC4uLiAgICAgICAgIHByaW50IFwnezA6e3dpZHRofXtiYXNlfX1cJy5mb3JtYXQobnVtLCBiYXNlPWJhc2UsIHdpZHRoPXdpZHRoKSxcbiAgIC4uLiAgICAgcHJpbnRcbiAgIC4uLlxuICAgICAgIDUgICAgIDUgICAgIDUgICAxMDFcbiAgICAgICA2ICAgICA2ICAgICA2ICAgMTEwXG4gICAgICAgNyAgICAgNyAgICAgNyAgIDExMVxuICAgICAgIDggICAgIDggICAgMTAgIDEwMDBcbiAgICAgICA5ICAgICA5ICAgIDExICAxMDAxXG4gICAgICAxMCAgICAgQSAgICAxMiAgMTAxMFxuICAgICAgMTEgICAgIEIgICAgMTMgIDEwMTFcbicsCisgJ2Z1bmN0aW9uJzogJ1xuRnVuY3Rpb24gZGVmaW5pdGlvbnNcbioqKioqKioqKioqKioqKioqKioqXG5cbkEgZnVuY3Rpb24gZGVmaW5pdGlvbiBkZWZpbmVzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCAoc2VlXG5zZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKTpcblxuICAgZGVjb3JhdGVkICAgICAgOjo9IGRlY29yYXRvcnMgKGNsYXNzZGVmIHwgZnVuY2RlZilcbiAgIGRlY29yYXRvcnMgICAgIDo6PSBkZWNvcmF0b3IrXG4gICBkZWNvcmF0b3IgICAgICA6Oj0gIkAiIGRvdHRlZF9uYW1lIFsiKCIgW2FyZ3VtZW50X2xpc3QgWyIsIl1dICIpIl0gTkVXTElORVxuICAgZnVuY2RlZiAgICAgICAgOjo9ICJkZWYiIGZ1bmNuYW1lICIoIiBbcGFyYW1ldGVyX2xpc3RdICIpIiAiOiIgc3VpdGVcbiAgIGRvdHRlZF9uYW1lICAgIDo6PSBpZGVudGlmaWVyICgiLiIgaWRlbnRpZmllcikqXG4gICBwYXJhbWV0ZXJfbGlzdCA6Oj0gKGRlZnBhcmFtZXRlciAiLCIpKlxuICAgICAgICAgICAgICAgICAgICAgICggICIqIiBpZGVudGlmaWVyIFsiLCIgIioqIiBpZGVudGlmaWVyXVxuICAgICAgICAgICAgICAgICAgICAgIHwgIioqIiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICAgICAgfCBkZWZwYXJhbWV0ZXIgWyIsIl0gKVxuICAgZGVmcGFyYW1ldGVyICAgOjo9IHBhcmFtZXRlciBbIj0iIGV4cHJlc3Npb25dXG4gICBzdWJsaXN0ICAgICAgICA6Oj0gcGFyYW1ldGVyICgiLCIgcGFyYW1ldGVyKSogWyIsIl1cbiAgIHBhcmFtZXRlciAgICAgIDo6PSBpZGVudGlmaWVyIHwgIigiIHN1Ymxpc3QgIikiXG4gICBmdW5jbmFtZSAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gaXMgYW4gZXhlY3V0YWJsZSBzdGF0ZW1lbnQuICBJdHMgZXhlY3V0aW9uIGJpbmRzXG50aGUgZnVuY3Rpb24gbmFtZSBpbiB0aGUgY3VycmVudCBsb2NhbCBuYW1lc3BhY2UgdG8gYSBmdW5jdGlvbiBvYmplY3RcbihhIHdyYXBwZXIgYXJvdW5kIHRoZSBleGVjdXRhYmxlIGNvZGUgZm9yIHRoZSBmdW5jdGlvbikuICBUaGlzXG5mdW5jdGlvbiBvYmplY3QgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgZ2xvYmFsIG5hbWVzcGFjZVxuYXMgdGhlIGdsb2JhbCBuYW1lc3BhY2UgdG8gYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuXG5cblRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRvZXMgbm90IGV4ZWN1dGUgdGhlIGZ1bmN0aW9uIGJvZHk7IHRoaXMgZ2V0c1xuZXhlY3V0ZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuIFszXVxuXG5BIGZ1bmN0aW9uIGRlZmluaXRpb24gbWF5IGJlIHdyYXBwZWQgYnkgb25lIG9yIG1vcmUgKmRlY29yYXRvcipcbmV4cHJlc3Npb25zLiBEZWNvcmF0b3IgZXhwcmVzc2lvbnMgYXJlIGV2YWx1YXRlZCB3aGVuIHRoZSBmdW5jdGlvbiBpc1xuZGVmaW5lZCwgaW4gdGhlIHNjb3BlIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24uICBUaGVcbnJlc3VsdCBtdXN0IGJlIGEgY2FsbGFibGUsIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgZnVuY3Rpb24gb2JqZWN0XG5hcyB0aGUgb25seSBhcmd1bWVudC4gVGhlIHJldHVybmVkIHZhbHVlIGlzIGJvdW5kIHRvIHRoZSBmdW5jdGlvbiBuYW1lXG5pbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBvYmplY3QuICBNdWx0aXBsZSBkZWNvcmF0b3JzIGFyZSBhcHBsaWVkIGluXG5uZXN0ZWQgZmFzaGlvbi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZTpcblxuICAgQGYxKGFyZylcbiAgIEBmMlxuICAgZGVmIGZ1bmMoKTogcGFzc1xuXG5pcyBlcXVpdmFsZW50IHRvOlxuXG4gICBkZWYgZnVuYygpOiBwYXNzXG4gICBmdW5jID0gZjEoYXJnKShmMihmdW5jKSlcblxuV2hlbiBvbmUgb3IgbW9yZSB0b3AtbGV2ZWwgKnBhcmFtZXRlcnMqIGhhdmUgdGhlIGZvcm0gKnBhcmFtZXRlcipcbmBgPWBgICpleHByZXNzaW9uKiwgdGhlIGZ1bmN0aW9uIGlzIHNhaWQgdG8gaGF2ZSAiZGVmYXVsdCBwYXJhbWV0ZXJcbnZhbHVlcy4iICBGb3IgYSBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUsIHRoZSBjb3JyZXNwb25kaW5nXG4qYXJndW1lbnQqIG1heSBiZSBvbWl0dGVkIGZyb20gYSBjYWxsLCBpbiB3aGljaCBjYXNlIHRoZSBwYXJhbWV0ZXJcJ3NcbmRlZmF1bHQgdmFsdWUgaXMgc3Vic3RpdHV0ZWQuICBJZiBhIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlLCBhbGxcbmZvbGxvd2luZyBwYXJhbWV0ZXJzIG11c3QgYWxzbyBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAtLS0gdGhpcyBpcyBhXG5zeW50YWN0aWMgcmVzdHJpY3Rpb24gdGhhdCBpcyBub3QgZXhwcmVzc2VkIGJ5IHRoZSBncmFtbWFyLlxuXG4qKkRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlcyBhcmUgZXZhbHVhdGVkIHdoZW4gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb25cbmlzIGV4ZWN1dGVkLioqICBUaGlzIG1lYW5zIHRoYXQgdGhlIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIG9uY2UsIHdoZW5cbnRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhhdCB0aGUgc2FtZSAicHJlLWNvbXB1dGVkIiB2YWx1ZSBpc1xudXNlZCBmb3IgZWFjaCBjYWxsLiAgVGhpcyBpcyBlc3BlY2lhbGx5IGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHdoZW4gYVxuZGVmYXVsdCBwYXJhbWV0ZXIgaXMgYSBtdXRhYmxlIG9iamVjdCwgc3VjaCBhcyBhIGxpc3Qgb3IgYSBkaWN0aW9uYXJ5OlxuaWYgdGhlIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBvYmplY3QgKGUuZy4gYnkgYXBwZW5kaW5nIGFuIGl0ZW0gdG8gYVxubGlzdCksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIGluIGVmZmVjdCBtb2RpZmllZC4gVGhpcyBpcyBnZW5lcmFsbHkgbm90XG53aGF0IHdhcyBpbnRlbmRlZC4gIEEgd2F5IGFyb3VuZCB0aGlzICBpcyB0byB1c2UgYGBOb25lYGAgYXMgdGhlXG5kZWZhdWx0LCBhbmQgZXhwbGljaXRseSB0ZXN0IGZvciBpdCBpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24sIGUuZy46XG5cbiAgIGRlZiB3aGF0c19vbl90aGVfdGVsbHkocGVuZ3Vpbj1Ob25lKTpcbiAgICAgICBpZiBwZW5ndWluIGlzIE5vbmU6XG4gICAgICAgICAgIHBlbmd1aW4gPSBbXVxuICAgICAgIHBlbmd1aW4uYXBwZW5kKCJwcm9wZXJ0eSBvZiB0aGUgem9vIilcbiAgICAgICByZXR1cm4gcGVuZ3VpblxuXG5GdW5jdGlvbiBjYWxsIHNlbWFudGljcyBhcmUgZGVzY3JpYmVkIGluIG1vcmUgZGV0YWlsIGluIHNlY3Rpb25cbipDYWxscyouIEEgZnVuY3Rpb24gY2FsbCBhbHdheXMgYXNzaWducyB2YWx1ZXMgdG8gYWxsIHBhcmFtZXRlcnNcbm1lbnRpb25lZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVpdGhlciBmcm9tIHBvc2l0aW9uIGFyZ3VtZW50cywgZnJvbVxua2V5d29yZCBhcmd1bWVudHMsIG9yIGZyb20gZGVmYXVsdCB2YWx1ZXMuICBJZiB0aGUgZm9ybVxuImBgKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSB0dXBsZSByZWNlaXZpbmdcbmFueSBleGNlc3MgcG9zaXRpb25hbCBwYXJhbWV0ZXJzLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSB0dXBsZS4gIElmXG50aGUgZm9ybSAiYGAqKmlkZW50aWZpZXJgYCIgaXMgcHJlc2VudCwgaXQgaXMgaW5pdGlhbGl6ZWQgdG8gYSBuZXdcbmRpY3Rpb25hcnkgcmVjZWl2aW5nIGFueSBleGNlc3Mga2V5d29yZCBhcmd1bWVudHMsIGRlZmF1bHRpbmcgdG8gYSBuZXdcbmVtcHR5IGRpY3Rpb25hcnkuXG5cbkl0IGlzIGFsc28gcG9zc2libGUgdG8gY3JlYXRlIGFub255bW91cyBmdW5jdGlvbnMgKGZ1bmN0aW9ucyBub3QgYm91bmRcbnRvIGEgbmFtZSksIGZvciBpbW1lZGlhdGUgdXNlIGluIGV4cHJlc3Npb25zLiAgVGhpcyB1c2VzIGxhbWJkYSBmb3JtcyxcbmRlc2NyaWJlZCBpbiBzZWN0aW9uICpMYW1iZGFzKi4gIE5vdGUgdGhhdCB0aGUgbGFtYmRhIGZvcm0gaXMgbWVyZWx5IGFcbnNob3J0aGFuZCBmb3IgYSBzaW1wbGlmaWVkIGZ1bmN0aW9uIGRlZmluaXRpb247IGEgZnVuY3Rpb24gZGVmaW5lZCBpblxuYSAiYGBkZWZgYCIgc3RhdGVtZW50IGNhbiBiZSBwYXNzZWQgYXJvdW5kIG9yIGFzc2lnbmVkIHRvIGFub3RoZXIgbmFtZVxuanVzdCBsaWtlIGEgZnVuY3Rpb24gZGVmaW5lZCBieSBhIGxhbWJkYSBmb3JtLiAgVGhlICJgYGRlZmBgIiBmb3JtIGlzXG5hY3R1YWxseSBtb3JlIHBvd2VyZnVsIHNpbmNlIGl0IGFsbG93cyB0aGUgZXhlY3V0aW9uIG9mIG11bHRpcGxlXG5zdGF0ZW1lbnRzLlxuXG4qKlByb2dyYW1tZXJcJ3Mgbm90ZToqKiBGdW5jdGlvbnMgYXJlIGZpcnN0LWNsYXNzIG9iamVjdHMuICBBICJgYGRlZmBgIlxuZm9ybSBleGVjdXRlZCBpbnNpZGUgYSBmdW5jdGlvbiBkZWZpbml0aW9uIGRlZmluZXMgYSBsb2NhbCBmdW5jdGlvblxudGhhdCBjYW4gYmUgcmV0dXJuZWQgb3IgcGFzc2VkIGFyb3VuZC4gIEZyZWUgdmFyaWFibGVzIHVzZWQgaW4gdGhlXG5uZXN0ZWQgZnVuY3Rpb24gY2FuIGFjY2VzcyB0aGUgbG9jYWwgdmFyaWFibGVzIG9mIHRoZSBmdW5jdGlvblxuY29udGFpbmluZyB0aGUgZGVmLiAgU2VlIHNlY3Rpb24gKk5hbWluZyBhbmQgYmluZGluZyogZm9yIGRldGFpbHMuXG4nLAorICdnbG9iYWwnOiAnXG5UaGUgYGBnbG9iYWxgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICBnbG9iYWxfc3RtdCA6Oj0gImdsb2JhbCIgaWRlbnRpZmllciAoIiwiIGlkZW50aWZpZXIpKlxuXG5UaGUgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgaXMgYSBkZWNsYXJhdGlvbiB3aGljaCBob2xkcyBmb3IgdGhlIGVudGlyZVxuY3VycmVudCBjb2RlIGJsb2NrLiAgSXQgbWVhbnMgdGhhdCB0aGUgbGlzdGVkIGlkZW50aWZpZXJzIGFyZSB0byBiZVxuaW50ZXJwcmV0ZWQgYXMgZ2xvYmFscy4gIEl0IHdvdWxkIGJlIGltcG9zc2libGUgdG8gYXNzaWduIHRvIGEgZ2xvYmFsXG52YXJpYWJsZSB3aXRob3V0IGBgZ2xvYmFsYGAsIGFsdGhvdWdoIGZyZWUgdmFyaWFibGVzIG1heSByZWZlciB0b1xuZ2xvYmFscyB3aXRob3V0IGJlaW5nIGRlY2xhcmVkIGdsb2JhbC5cblxuTmFtZXMgbGlzdGVkIGluIGEgYGBnbG9iYWxgYCBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgdXNlZCBpbiB0aGUgc2FtZVxuY29kZSBibG9jayB0ZXh0dWFsbHkgcHJlY2VkaW5nIHRoYXQgYGBnbG9iYWxgYCBzdGF0ZW1lbnQuXG5cbk5hbWVzIGxpc3RlZCBpbiBhIGBgZ2xvYmFsYGAgc3RhdGVtZW50IG11c3Qgbm90IGJlIGRlZmluZWQgYXMgZm9ybWFsXG5wYXJhbWV0ZXJzIG9yIGluIGEgYGBmb3JgYCBsb29wIGNvbnRyb2wgdGFyZ2V0LCBgYGNsYXNzYGAgZGVmaW5pdGlvbixcbmZ1bmN0aW9uIGRlZmluaXRpb24sIG9yIGBgaW1wb3J0YGAgc3RhdGVtZW50LlxuXG4qKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRvZXMgbm90XG5lbmZvcmNlIHRoZSBsYXR0ZXIgdHdvIHJlc3RyaWN0aW9ucywgYnV0IHByb2dyYW1zIHNob3VsZCBub3QgYWJ1c2VcbnRoaXMgZnJlZWRvbSwgYXMgZnV0dXJlIGltcGxlbWVudGF0aW9ucyBtYXkgZW5mb3JjZSB0aGVtIG9yIHNpbGVudGx5XG5jaGFuZ2UgdGhlIG1lYW5pbmcgb2YgdGhlIHByb2dyYW0uXG5cbioqUHJvZ3JhbW1lclwncyBub3RlOioqIHRoZSBgYGdsb2JhbGBgIGlzIGEgZGlyZWN0aXZlIHRvIHRoZSBwYXJzZXIuXG5JdCBhcHBsaWVzIG9ubHkgdG8gY29kZSBwYXJzZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgYGBnbG9iYWxgYFxuc3RhdGVtZW50LiBJbiBwYXJ0aWN1bGFyLCBhIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGNvbnRhaW5lZCBpbiBhblxuYGBleGVjYGAgc3RhdGVtZW50IGRvZXMgbm90IGFmZmVjdCB0aGUgY29kZSBibG9jayAqY29udGFpbmluZyogdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQsIGFuZCBjb2RlIGNvbnRhaW5lZCBpbiBhbiBgYGV4ZWNgYCBzdGF0ZW1lbnQgaXNcbnVuYWZmZWN0ZWQgYnkgYGBnbG9iYWxgYCBzdGF0ZW1lbnRzIGluIHRoZSBjb2RlIGNvbnRhaW5pbmcgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQuICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBgYGV2YWwoKWBgLFxuYGBleGVjZmlsZSgpYGAgYW5kIGBgY29tcGlsZSgpYGAgZnVuY3Rpb25zLlxuJywKKyAnaWQtY2xhc3Nlcyc6ICdcblJlc2VydmVkIGNsYXNzZXMgb2YgaWRlbnRpZmllcnNcbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQ2VydGFpbiBjbGFzc2VzIG9mIGlkZW50aWZpZXJzIChiZXNpZGVzIGtleXdvcmRzKSBoYXZlIHNwZWNpYWxcbm1lYW5pbmdzLiAgVGhlc2UgY2xhc3NlcyBhcmUgaWRlbnRpZmllZCBieSB0aGUgcGF0dGVybnMgb2YgbGVhZGluZyBhbmRcbnRyYWlsaW5nIHVuZGVyc2NvcmUgY2hhcmFjdGVyczpcblxuYGBfKmBgXG4gICBOb3QgaW1wb3J0ZWQgYnkgYGBmcm9tIG1vZHVsZSBpbXBvcnQgKmBgLiAgVGhlIHNwZWNpYWwgaWRlbnRpZmllclxuICAgYGBfYGAgaXMgdXNlZCBpbiB0aGUgaW50ZXJhY3RpdmUgaW50ZXJwcmV0ZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZlxuICAgdGhlIGxhc3QgZXZhbHVhdGlvbjsgaXQgaXMgc3RvcmVkIGluIHRoZSBgYF9fYnVpbHRpbl9fYGAgbW9kdWxlLlxuICAgV2hlbiBub3QgaW4gaW50ZXJhY3RpdmUgbW9kZSwgYGBfYGAgaGFzIG5vIHNwZWNpYWwgbWVhbmluZyBhbmQgaXNcbiAgIG5vdCBkZWZpbmVkLiBTZWUgc2VjdGlvbiAqVGhlIGltcG9ydCBzdGF0ZW1lbnQqLlxuXG4gICBOb3RlOiBUaGUgbmFtZSBgYF9gYCBpcyBvZnRlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGhcbiAgICAgaW50ZXJuYXRpb25hbGl6YXRpb247IHJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGVcbiAgICAgYGBnZXR0ZXh0YGAgbW9kdWxlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgY29udmVudGlvbi5cblxuYGBfXypfX2BgXG4gICBTeXN0ZW0tZGVmaW5lZCBuYW1lcy4gVGhlc2UgbmFtZXMgYXJlIGRlZmluZWQgYnkgdGhlIGludGVycHJldGVyXG4gICBhbmQgaXRzIGltcGxlbWVudGF0aW9uIChpbmNsdWRpbmcgdGhlIHN0YW5kYXJkIGxpYnJhcnkpLiAgQ3VycmVudFxuICAgc3lzdGVtIG5hbWVzIGFyZSBkaXNjdXNzZWQgaW4gdGhlICpTcGVjaWFsIG1ldGhvZCBuYW1lcyogc2VjdGlvblxuICAgYW5kIGVsc2V3aGVyZS4gIE1vcmUgd2lsbCBsaWtlbHkgYmUgZGVmaW5lZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2ZcbiAgIFB5dGhvbi4gICpBbnkqIHVzZSBvZiBgYF9fKl9fYGAgbmFtZXMsIGluIGFueSBjb250ZXh0LCB0aGF0IGRvZXNcbiAgIG5vdCBmb2xsb3cgZXhwbGljaXRseSBkb2N1bWVudGVkIHVzZSwgaXMgc3ViamVjdCB0byBicmVha2FnZVxuICAgd2l0aG91dCB3YXJuaW5nLlxuXG5gYF9fKmBgXG4gICBDbGFzcy1wcml2YXRlIG5hbWVzLiAgTmFtZXMgaW4gdGhpcyBjYXRlZ29yeSwgd2hlbiB1c2VkIHdpdGhpbiB0aGVcbiAgIGNvbnRleHQgb2YgYSBjbGFzcyBkZWZpbml0aW9uLCBhcmUgcmUtd3JpdHRlbiB0byB1c2UgYSBtYW5nbGVkIGZvcm1cbiAgIHRvIGhlbHAgYXZvaWQgbmFtZSBjbGFzaGVzIGJldHdlZW4gInByaXZhdGUiIGF0dHJpYnV0ZXMgb2YgYmFzZSBhbmRcbiAgIGRlcml2ZWQgY2xhc3Nlcy4gU2VlIHNlY3Rpb24gKklkZW50aWZpZXJzIChOYW1lcykqLlxuJywKKyAnaWRlbnRpZmllcnMnOiAnXG5JZGVudGlmaWVycyBhbmQga2V5d29yZHNcbioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5JZGVudGlmaWVycyAoYWxzbyByZWZlcnJlZCB0byBhcyAqbmFtZXMqKSBhcmUgZGVzY3JpYmVkIGJ5IHRoZVxuZm9sbG93aW5nIGxleGljYWwgZGVmaW5pdGlvbnM6XG5cbiAgIGlkZW50aWZpZXIgOjo9IChsZXR0ZXJ8Il8iKSAobGV0dGVyIHwgZGlnaXQgfCAiXyIpKlxuICAgbGV0dGVyICAgICA6Oj0gbG93ZXJjYXNlIHwgdXBwZXJjYXNlXG4gICBsb3dlcmNhc2UgIDo6PSAiYSIuLi4ieiJcbiAgIHVwcGVyY2FzZSAgOjo9ICJBIi4uLiJaIlxuICAgZGlnaXQgICAgICA6Oj0gIjAiLi4uIjkiXG5cbklkZW50aWZpZXJzIGFyZSB1bmxpbWl0ZWQgaW4gbGVuZ3RoLiAgQ2FzZSBpcyBzaWduaWZpY2FudC5cblxuXG5LZXl3b3Jkc1xuPT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBpZGVudGlmaWVycyBhcmUgdXNlZCBhcyByZXNlcnZlZCB3b3Jkcywgb3IgKmtleXdvcmRzKiBvZlxudGhlIGxhbmd1YWdlLCBhbmQgY2Fubm90IGJlIHVzZWQgYXMgb3JkaW5hcnkgaWRlbnRpZmllcnMuICBUaGV5IG11c3RcbmJlIHNwZWxsZWQgZXhhY3RseSBhcyB3cml0dGVuIGhlcmU6XG5cbiAgIGFuZCAgICAgICBkZWwgICAgICAgZnJvbSAgICAgIG5vdCAgICAgICB3aGlsZVxuICAgYXMgICAgICAgIGVsaWYgICAgICBnbG9iYWwgICAgb3IgICAgICAgIHdpdGhcbiAgIGFzc2VydCAgICBlbHNlICAgICAgaWYgICAgICAgIHBhc3MgICAgICB5aWVsZFxuICAgYnJlYWsgICAgIGV4Y2VwdCAgICBpbXBvcnQgICAgcHJpbnRcbiAgIGNsYXNzICAgICBleGVjICAgICAgaW4gICAgICAgIHJhaXNlXG4gICBjb250aW51ZSAgZmluYWxseSAgIGlzICAgICAgICByZXR1cm5cbiAgIGRlZiAgICAgICBmb3IgICAgICAgbGFtYmRhICAgIHRyeVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi40OiBgYE5vbmVgYCBiZWNhbWUgYSBjb25zdGFudCBhbmQgaXMgbm93XG5yZWNvZ25pemVkIGJ5IHRoZSBjb21waWxlciBhcyBhIG5hbWUgZm9yIHRoZSBidWlsdC1pbiBvYmplY3QgYGBOb25lYGAuXG5BbHRob3VnaCBpdCBpcyBub3QgYSBrZXl3b3JkLCB5b3UgY2Fubm90IGFzc2lnbiBhIGRpZmZlcmVudCBvYmplY3QgdG9cbml0LlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi41OiBVc2luZyBgYGFzYGAgYW5kIGBgd2l0aGBgIGFzIGlkZW50aWZpZXJzXG50cmlnZ2VycyBhIHdhcm5pbmcuICBUbyB1c2UgdGhlbSBhcyBrZXl3b3JkcywgZW5hYmxlIHRoZVxuYGB3aXRoX3N0YXRlbWVudGBgIGZ1dHVyZSBmZWF0dXJlIC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogYGBhc2BgIGFuZCBgYHdpdGhgYCBhcmUgZnVsbCBrZXl3b3Jkcy5cblxuXG5SZXNlcnZlZCBjbGFzc2VzIG9mIGlkZW50aWZpZXJzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbkNlcnRhaW4gY2xhc3NlcyBvZiBpZGVudGlmaWVycyAoYmVzaWRlcyBrZXl3b3JkcykgaGF2ZSBzcGVjaWFsXG5tZWFuaW5ncy4gIFRoZXNlIGNsYXNzZXMgYXJlIGlkZW50aWZpZWQgYnkgdGhlIHBhdHRlcm5zIG9mIGxlYWRpbmcgYW5kXG50cmFpbGluZyB1bmRlcnNjb3JlIGNoYXJhY3RlcnM6XG5cbmBgXypgYFxuICAgTm90IGltcG9ydGVkIGJ5IGBgZnJvbSBtb2R1bGUgaW1wb3J0ICpgYC4gIFRoZSBzcGVjaWFsIGlkZW50aWZpZXJcbiAgIGBgX2BgIGlzIHVzZWQgaW4gdGhlIGludGVyYWN0aXZlIGludGVycHJldGVyIHRvIHN0b3JlIHRoZSByZXN1bHQgb2ZcbiAgIHRoZSBsYXN0IGV2YWx1YXRpb247IGl0IGlzIHN0b3JlZCBpbiB0aGUgYGBfX2J1aWx0aW5fX2BgIG1vZHVsZS5cbiAgIFdoZW4gbm90IGluIGludGVyYWN0aXZlIG1vZGUsIGBgX2BgIGhhcyBubyBzcGVjaWFsIG1lYW5pbmcgYW5kIGlzXG4gICBub3QgZGVmaW5lZC4gU2VlIHNlY3Rpb24gKlRoZSBpbXBvcnQgc3RhdGVtZW50Ki5cblxuICAgTm90ZTogVGhlIG5hbWUgYGBfYGAgaXMgb2Z0ZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoXG4gICAgIGludGVybmF0aW9uYWxpemF0aW9uOyByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlXG4gICAgIGBgZ2V0dGV4dGBgIG1vZHVsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGNvbnZlbnRpb24uXG5cbmBgX18qX19gYFxuICAgU3lzdGVtLWRlZmluZWQgbmFtZXMuIFRoZXNlIG5hbWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBpbnRlcnByZXRlclxuICAgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiAoaW5jbHVkaW5nIHRoZSBzdGFuZGFyZCBsaWJyYXJ5KS4gIEN1cnJlbnRcbiAgIHN5c3RlbSBuYW1lcyBhcmUgZGlzY3Vzc2VkIGluIHRoZSAqU3BlY2lhbCBtZXRob2QgbmFtZXMqIHNlY3Rpb25cbiAgIGFuZCBlbHNld2hlcmUuICBNb3JlIHdpbGwgbGlrZWx5IGJlIGRlZmluZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mXG4gICBQeXRob24uICAqQW55KiB1c2Ugb2YgYGBfXypfX2BgIG5hbWVzLCBpbiBhbnkgY29udGV4dCwgdGhhdCBkb2VzXG4gICBub3QgZm9sbG93IGV4cGxpY2l0bHkgZG9jdW1lbnRlZCB1c2UsIGlzIHN1YmplY3QgdG8gYnJlYWthZ2VcbiAgIHdpdGhvdXQgd2FybmluZy5cblxuYGBfXypgYFxuICAgQ2xhc3MtcHJpdmF0ZSBuYW1lcy4gIE5hbWVzIGluIHRoaXMgY2F0ZWdvcnksIHdoZW4gdXNlZCB3aXRoaW4gdGhlXG4gICBjb250ZXh0IG9mIGEgY2xhc3MgZGVmaW5pdGlvbiwgYXJlIHJlLXdyaXR0ZW4gdG8gdXNlIGEgbWFuZ2xlZCBmb3JtXG4gICB0byBoZWxwIGF2b2lkIG5hbWUgY2xhc2hlcyBiZXR3ZWVuICJwcml2YXRlIiBhdHRyaWJ1dGVzIG9mIGJhc2UgYW5kXG4gICBkZXJpdmVkIGNsYXNzZXMuIFNlZSBzZWN0aW9uICpJZGVudGlmaWVycyAoTmFtZXMpKi5cbicsCisgJ2lmJzogJ1xuVGhlIGBgaWZgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYGlmYGAgc3RhdGVtZW50IGlzIHVzZWQgZm9yIGNvbmRpdGlvbmFsIGV4ZWN1dGlvbjpcblxuICAgaWZfc3RtdCA6Oj0gImlmIiBleHByZXNzaW9uICI6IiBzdWl0ZVxuICAgICAgICAgICAgICAgKCAiZWxpZiIgZXhwcmVzc2lvbiAiOiIgc3VpdGUgKSpcbiAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5JdCBzZWxlY3RzIGV4YWN0bHkgb25lIG9mIHRoZSBzdWl0ZXMgYnkgZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbnMgb25lXG5ieSBvbmUgdW50aWwgb25lIGlzIGZvdW5kIHRvIGJlIHRydWUgKHNlZSBzZWN0aW9uICpCb29sZWFuIG9wZXJhdGlvbnMqXG5mb3IgdGhlIGRlZmluaXRpb24gb2YgdHJ1ZSBhbmQgZmFsc2UpOyB0aGVuIHRoYXQgc3VpdGUgaXMgZXhlY3V0ZWRcbihhbmQgbm8gb3RoZXIgcGFydCBvZiB0aGUgYGBpZmBgIHN0YXRlbWVudCBpcyBleGVjdXRlZCBvciBldmFsdWF0ZWQpLlxuSWYgYWxsIGV4cHJlc3Npb25zIGFyZSBmYWxzZSwgdGhlIHN1aXRlIG9mIHRoZSBgYGVsc2VgYCBjbGF1c2UsIGlmXG5wcmVzZW50LCBpcyBleGVjdXRlZC5cbicsCisgJ2ltYWdpbmFyeSc6ICdcbkltYWdpbmFyeSBsaXRlcmFsc1xuKioqKioqKioqKioqKioqKioqXG5cbkltYWdpbmFyeSBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgaW1hZ251bWJlciA6Oj0gKGZsb2F0bnVtYmVyIHwgaW50cGFydCkgKCJqIiB8ICJKIilcblxuQW4gaW1hZ2luYXJ5IGxpdGVyYWwgeWllbGRzIGEgY29tcGxleCBudW1iZXIgd2l0aCBhIHJlYWwgcGFydCBvZiAwLjAuXG5Db21wbGV4IG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZyBwb2ludCBudW1iZXJzXG5hbmQgaGF2ZSB0aGUgc2FtZSByZXN0cmljdGlvbnMgb24gdGhlaXIgcmFuZ2UuICBUbyBjcmVhdGUgYSBjb21wbGV4XG5udW1iZXIgd2l0aCBhIG5vbnplcm8gcmVhbCBwYXJ0LCBhZGQgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgdG8gaXQsXG5lLmcuLCBgYCgzKzRqKWBgLiAgU29tZSBleGFtcGxlcyBvZiBpbWFnaW5hcnkgbGl0ZXJhbHM6XG5cbiAgIDMuMTRqICAgMTAuaiAgICAxMGogICAgIC4wMDFqICAgMWUxMDBqICAzLjE0ZS0xMGpcbicsCisgJ2ltcG9ydCc6ICdcblRoZSBgYGltcG9ydGBgIHN0YXRlbWVudFxuKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiAgIGltcG9ydF9zdG10ICAgICA6Oj0gImltcG9ydCIgbW9kdWxlIFsiYXMiIG5hbWVdICggIiwiIG1vZHVsZSBbImFzIiBuYW1lXSApKlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiBpZGVudGlmaWVyIFsiYXMiIG5hbWVdXG4gICAgICAgICAgICAgICAgICAgKCAiLCIgaWRlbnRpZmllciBbImFzIiBuYW1lXSApKlxuICAgICAgICAgICAgICAgICAgIHwgImZyb20iIHJlbGF0aXZlX21vZHVsZSAiaW1wb3J0IiAiKCIgaWRlbnRpZmllciBbImFzIiBuYW1lXVxuICAgICAgICAgICAgICAgICAgICggIiwiIGlkZW50aWZpZXIgWyJhcyIgbmFtZV0gKSogWyIsIl0gIikiXG4gICAgICAgICAgICAgICAgICAgfCAiZnJvbSIgbW9kdWxlICJpbXBvcnQiICIqIlxuICAgbW9kdWxlICAgICAgICAgIDo6PSAoaWRlbnRpZmllciAiLiIpKiBpZGVudGlmaWVyXG4gICByZWxhdGl2ZV9tb2R1bGUgOjo9ICIuIiogbW9kdWxlIHwgIi4iK1xuICAgbmFtZSAgICAgICAgICAgIDo6PSBpZGVudGlmaWVyXG5cbkltcG9ydCBzdGF0ZW1lbnRzIGFyZSBleGVjdXRlZCBpbiB0d28gc3RlcHM6ICgxKSBmaW5kIGEgbW9kdWxlLCBhbmRcbmluaXRpYWxpemUgaXQgaWYgbmVjZXNzYXJ5OyAoMikgZGVmaW5lIGEgbmFtZSBvciBuYW1lcyBpbiB0aGUgbG9jYWxcbm5hbWVzcGFjZSAob2YgdGhlIHNjb3BlIHdoZXJlIHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCBvY2N1cnMpLiBUaGVcbnN0YXRlbWVudCBjb21lcyBpbiB0d28gZm9ybXMgZGlmZmVyaW5nIG9uIHdoZXRoZXIgaXQgdXNlcyB0aGUgYGBmcm9tYGBcbmtleXdvcmQuIFRoZSBmaXJzdCBmb3JtICh3aXRob3V0IGBgZnJvbWBgKSByZXBlYXRzIHRoZXNlIHN0ZXBzIGZvclxuZWFjaCBpZGVudGlmaWVyIGluIHRoZSBsaXN0LiBUaGUgZm9ybSB3aXRoIGBgZnJvbWBgIHBlcmZvcm1zIHN0ZXAgKDEpXG5vbmNlLCBhbmQgdGhlbiBwZXJmb3JtcyBzdGVwICgyKSByZXBlYXRlZGx5LlxuXG5UbyB1bmRlcnN0YW5kIGhvdyBzdGVwICgxKSBvY2N1cnMsIG9uZSBtdXN0IGZpcnN0IHVuZGVyc3RhbmQgaG93XG5QeXRob24gaGFuZGxlcyBoaWVyYXJjaGljYWwgbmFtaW5nIG9mIG1vZHVsZXMuIFRvIGhlbHAgb3JnYW5pemVcbm1vZHVsZXMgYW5kIHByb3ZpZGUgYSBoaWVyYXJjaHkgaW4gbmFtaW5nLCBQeXRob24gaGFzIGEgY29uY2VwdCBvZlxucGFja2FnZXMuIEEgcGFja2FnZSBjYW4gY29udGFpbiBvdGhlciBwYWNrYWdlcyBhbmQgbW9kdWxlcyB3aGlsZVxubW9kdWxlcyBjYW5ub3QgY29udGFpbiBvdGhlciBtb2R1bGVzIG9yIHBhY2thZ2VzLiBGcm9tIGEgZmlsZSBzeXN0ZW1cbnBlcnNwZWN0aXZlLCBwYWNrYWdlcyBhcmUgZGlyZWN0b3JpZXMgYW5kIG1vZHVsZXMgYXJlIGZpbGVzLiBUaGVcbm9yaWdpbmFsIHNwZWNpZmljYXRpb24gZm9yIHBhY2thZ2VzIGlzIHN0aWxsIGF2YWlsYWJsZSB0byByZWFkLFxuYWx0aG91Z2ggbWlub3IgZGV0YWlscyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHdyaXRpbmcgb2YgdGhhdFxuZG9jdW1lbnQuXG5cbk9uY2UgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBpcyBrbm93biAodW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoZVxudGVybSAibW9kdWxlIiB3aWxsIHJlZmVyIHRvIGJvdGggcGFja2FnZXMgYW5kIG1vZHVsZXMpLCBzZWFyY2hpbmcgZm9yXG50aGUgbW9kdWxlIG9yIHBhY2thZ2UgY2FuIGJlZ2luLiBUaGUgZmlyc3QgcGxhY2UgY2hlY2tlZCBpc1xuYGBzeXMubW9kdWxlc2BgLCB0aGUgY2FjaGUgb2YgYWxsIG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4gaW1wb3J0ZWRcbnByZXZpb3VzbHkuIElmIHRoZSBtb2R1bGUgaXMgZm91bmQgdGhlcmUgdGhlbiBpdCBpcyB1c2VkIGluIHN0ZXAgKDIpXG5vZiBpbXBvcnQuXG5cbklmIHRoZSBtb2R1bGUgaXMgbm90IGZvdW5kIGluIHRoZSBjYWNoZSwgdGhlbiBgYHN5cy5tZXRhX3BhdGhgYCBpc1xuc2VhcmNoZWQgKHRoZSBzcGVjaWZpY2F0aW9uIGZvciBgYHN5cy5tZXRhX3BhdGhgYCBjYW4gYmUgZm91bmQgaW5cbioqUEVQIDMwMioqKS4gVGhlIG9iamVjdCBpcyBhIGxpc3Qgb2YgKmZpbmRlciogb2JqZWN0cyB3aGljaCBhcmVcbnF1ZXJpZWQgaW4gb3JkZXIgYXMgdG8gd2hldGhlciB0aGV5IGtub3cgaG93IHRvIGxvYWQgdGhlIG1vZHVsZSBieVxuY2FsbGluZyB0aGVpciBgYGZpbmRfbW9kdWxlKClgYCBtZXRob2Qgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlLiBJZlxudGhlIG1vZHVsZSBoYXBwZW5zIHRvIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlIChhcyBkZW5vdGVkIGJ5IHRoZVxuZXhpc3RlbmNlIG9mIGEgZG90IGluIHRoZSBuYW1lKSwgdGhlbiBhIHNlY29uZCBhcmd1bWVudCB0b1xuYGBmaW5kX21vZHVsZSgpYGAgaXMgZ2l2ZW4gYXMgdGhlIHZhbHVlIG9mIHRoZSBgYF9fcGF0aF9fYGAgYXR0cmlidXRlXG5mcm9tIHRoZSBwYXJlbnQgcGFja2FnZSAoZXZlcnl0aGluZyB1cCB0byB0aGUgbGFzdCBkb3QgaW4gdGhlIG5hbWUgb2ZcbnRoZSBtb2R1bGUgYmVpbmcgaW1wb3J0ZWQpLiBJZiBhIGZpbmRlciBjYW4gZmluZCB0aGUgbW9kdWxlIGl0IHJldHVybnNcbmEgKmxvYWRlciogKGRpc2N1c3NlZCBsYXRlcikgb3IgcmV0dXJucyBgYE5vbmVgYC5cblxuSWYgbm9uZSBvZiB0aGUgZmluZGVycyBvbiBgYHN5cy5tZXRhX3BhdGhgYCBhcmUgYWJsZSB0byBmaW5kIHRoZVxubW9kdWxlIHRoZW4gc29tZSBpbXBsaWNpdGx5IGRlZmluZWQgZmluZGVycyBhcmUgcXVlcmllZC5cbkltcGxlbWVudGF0aW9ucyBvZiBQeXRob24gdmFyeSBpbiB3aGF0IGltcGxpY2l0IG1ldGEgcGF0aCBmaW5kZXJzIGFyZVxuZGVmaW5lZC4gVGhlIG9uZSB0aGV5IGFsbCBkbyBkZWZpbmUsIHRob3VnaCwgaXMgb25lIHRoYXQgaGFuZGxlc1xuYGBzeXMucGF0aF9ob29rc2BgLCBgYHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYGAsIGFuZCBgYHN5cy5wYXRoYGAuXG5cblRoZSBpbXBsaWNpdCBmaW5kZXIgc2VhcmNoZXMgZm9yIHRoZSByZXF1ZXN0ZWQgbW9kdWxlIGluIHRoZSAicGF0aHMiXG5zcGVjaWZpZWQgaW4gb25lIG9mIHR3byBwbGFjZXMgKCJwYXRocyIgZG8gbm90IGhhdmUgdG8gYmUgZmlsZSBzeXN0ZW1cbnBhdGhzKS4gSWYgdGhlIG1vZHVsZSBiZWluZyBpbXBvcnRlZCBpcyBzdXBwb3NlZCB0byBiZSBjb250YWluZWRcbndpdGhpbiBhIHBhY2thZ2UgdGhlbiB0aGUgc2Vjb25kIGFyZ3VtZW50IHBhc3NlZCB0byBgYGZpbmRfbW9kdWxlKClgYCxcbmBgX19wYXRoX19gYCBvbiB0aGUgcGFyZW50IHBhY2thZ2UsIGlzIHVzZWQgYXMgdGhlIHNvdXJjZSBvZiBwYXRocy4gSWZcbnRoZSBtb2R1bGUgaXMgbm90IGNvbnRhaW5lZCBpbiBhIHBhY2thZ2UgdGhlbiBgYHN5cy5wYXRoYGAgaXMgdXNlZCBhc1xudGhlIHNvdXJjZSBvZiBwYXRocy5cblxuT25jZSB0aGUgc291cmNlIG9mIHBhdGhzIGlzIGNob3NlbiBpdCBpcyBpdGVyYXRlZCBvdmVyIHRvIGZpbmQgYVxuZmluZGVyIHRoYXQgY2FuIGhhbmRsZSB0aGF0IHBhdGguIFRoZSBkaWN0IGF0XG5gYHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYGAgY2FjaGVzIGZpbmRlcnMgZm9yIHBhdGhzIGFuZCBpcyBjaGVja2VkXG5mb3IgYSBmaW5kZXIuIElmIHRoZSBwYXRoIGRvZXMgbm90IGhhdmUgYSBmaW5kZXIgY2FjaGVkIHRoZW5cbmBgc3lzLnBhdGhfaG9va3NgYCBpcyBzZWFyY2hlZCBieSBjYWxsaW5nIGVhY2ggb2JqZWN0IGluIHRoZSBsaXN0IHdpdGhcbmEgc2luZ2xlIGFyZ3VtZW50IG9mIHRoZSBwYXRoLCByZXR1cm5pbmcgYSBmaW5kZXIgb3IgcmFpc2VzXG5gYEltcG9ydEVycm9yYGAuIElmIGEgZmluZGVyIGlzIHJldHVybmVkIHRoZW4gaXQgaXMgY2FjaGVkIGluXG5gYHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlYGAgYW5kIHRoZW4gdXNlZCBmb3IgdGhhdCBwYXRoIGVudHJ5LiBJZiBub1xuZmluZGVyIGNhbiBiZSBmb3VuZCBidXQgdGhlIHBhdGggZXhpc3RzIHRoZW4gYSB2YWx1ZSBvZiBgYE5vbmVgYCBpc1xuc3RvcmVkIGluIGBgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGVgYCB0byBzaWduaWZ5IHRoYXQgYW4gaW1wbGljaXQsXG5maWxlLWJhc2VkIGZpbmRlciB0aGF0IGhhbmRsZXMgbW9kdWxlcyBzdG9yZWQgYXMgaW5kaXZpZHVhbCBmaWxlc1xuc2hvdWxkIGJlIHVzZWQgZm9yIHRoYXQgcGF0aC4gSWYgdGhlIHBhdGggZG9lcyBub3QgZXhpc3QgdGhlbiBhIGZpbmRlclxud2hpY2ggYWx3YXlzIHJldHVybnMgYGBOb25lYGAgaXMgcGxhY2VkIGluIHRoZSBjYWNoZSBmb3IgdGhlIHBhdGguXG5cbklmIG5vIGZpbmRlciBjYW4gZmluZCB0aGUgbW9kdWxlIHRoZW4gYGBJbXBvcnRFcnJvcmBgIGlzIHJhaXNlZC5cbk90aGVyd2lzZSBzb21lIGZpbmRlciByZXR1cm5lZCBhIGxvYWRlciB3aG9zZSBgYGxvYWRfbW9kdWxlKClgYCBtZXRob2RcbmlzIGNhbGxlZCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdG8gbG9hZCAoc2VlICoqUEVQIDMwMioqIGZvciB0aGVcbm9yaWdpbmFsIGRlZmluaXRpb24gb2YgbG9hZGVycykuIEEgbG9hZGVyIGhhcyBzZXZlcmFsIHJlc3BvbnNpYmlsaXRpZXNcbnRvIHBlcmZvcm0gb24gYSBtb2R1bGUgaXQgbG9hZHMuIEZpcnN0LCBpZiB0aGUgbW9kdWxlIGFscmVhZHkgZXhpc3RzXG5pbiBgYHN5cy5tb2R1bGVzYGAgKGEgcG9zc2liaWxpdHkgaWYgdGhlIGxvYWRlciBpcyBjYWxsZWQgb3V0c2lkZSBvZlxudGhlIGltcG9ydCBtYWNoaW5lcnkpIHRoZW4gaXQgaXMgdG8gdXNlIHRoYXQgbW9kdWxlIGZvciBpbml0aWFsaXphdGlvblxuYW5kIG5vdCBhIG5ldyBtb2R1bGUuIEJ1dCBpZiB0aGUgbW9kdWxlIGRvZXMgbm90IGV4aXN0IGluXG5gYHN5cy5tb2R1bGVzYGAgdGhlbiBpdCBpcyB0byBiZSBhZGRlZCB0byB0aGF0IGRpY3QgYmVmb3JlXG5pbml0aWFsaXphdGlvbiBiZWdpbnMuIElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgbG9hZGluZyBvZiB0aGUgbW9kdWxlXG5hbmQgaXQgd2FzIGFkZGVkIHRvIGBgc3lzLm1vZHVsZXNgYCBpdCBpcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGRpY3QuXG5JZiBhbiBlcnJvciBvY2N1cnMgYnV0IHRoZSBtb2R1bGUgd2FzIGFscmVhZHkgaW4gYGBzeXMubW9kdWxlc2BgIGl0IGlzXG5sZWZ0IGluIHRoZSBkaWN0LlxuXG5UaGUgbG9hZGVyIG11c3Qgc2V0IHNldmVyYWwgYXR0cmlidXRlcyBvbiB0aGUgbW9kdWxlLiBgYF9fbmFtZV9fYGAgaXNcbnRvIGJlIHNldCB0byB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlLiBgYF9fZmlsZV9fYGAgaXMgdG8gYmUgdGhlICJwYXRoIlxudG8gdGhlIGZpbGUgdW5sZXNzIHRoZSBtb2R1bGUgaXMgYnVpbHQtaW4gKGFuZCB0aHVzIGxpc3RlZCBpblxuYGBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXNgYCkgaW4gd2hpY2ggY2FzZSB0aGUgYXR0cmlidXRlIGlzIG5vdCBzZXQuXG5JZiB3aGF0IGlzIGJlaW5nIGltcG9ydGVkIGlzIGEgcGFja2FnZSB0aGVuIGBgX19wYXRoX19gYCBpcyB0byBiZSBzZXRcbnRvIGEgbGlzdCBvZiBwYXRocyB0byBiZSBzZWFyY2hlZCB3aGVuIGxvb2tpbmcgZm9yIG1vZHVsZXMgYW5kXG5wYWNrYWdlcyBjb250YWluZWQgd2l0aGluIHRoZSBwYWNrYWdlIGJlaW5nIGltcG9ydGVkLiBgYF9fcGFja2FnZV9fYGBcbmlzIG9wdGlvbmFsIGJ1dCBzaG91bGQgYmUgc2V0IHRvIHRoZSBuYW1lIG9mIHBhY2thZ2UgdGhhdCBjb250YWlucyB0aGVcbm1vZHVsZSBvciBwYWNrYWdlICh0aGUgZW1wdHkgc3RyaW5nIGlzIHVzZWQgZm9yIG1vZHVsZSBub3QgY29udGFpbmVkXG5pbiBhIHBhY2thZ2UpLiBgYF9fbG9hZGVyX19gYCBpcyBhbHNvIG9wdGlvbmFsIGJ1dCBzaG91bGQgYmUgc2V0IHRvXG50aGUgbG9hZGVyIG9iamVjdCB0aGF0IGlzIGxvYWRpbmcgdGhlIG1vZHVsZS5cblxuSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBsb2FkaW5nIHRoZW4gdGhlIGxvYWRlciByYWlzZXNcbmBgSW1wb3J0RXJyb3JgYCBpZiBzb21lIG90aGVyIGV4Y2VwdGlvbiBpcyBub3QgYWxyZWFkeSBiZWluZ1xucHJvcGFnYXRlZC4gT3RoZXJ3aXNlIHRoZSBsb2FkZXIgcmV0dXJucyB0aGUgbW9kdWxlIHRoYXQgd2FzIGxvYWRlZFxuYW5kIGluaXRpYWxpemVkLlxuXG5XaGVuIHN0ZXAgKDEpIGZpbmlzaGVzIHdpdGhvdXQgcmFpc2luZyBhbiBleGNlcHRpb24sIHN0ZXAgKDIpIGNhblxuYmVnaW4uXG5cblRoZSBmaXJzdCBmb3JtIG9mIGBgaW1wb3J0YGAgc3RhdGVtZW50IGJpbmRzIHRoZSBtb2R1bGUgbmFtZSBpbiB0aGVcbmxvY2FsIG5hbWVzcGFjZSB0byB0aGUgbW9kdWxlIG9iamVjdCwgYW5kIHRoZW4gZ29lcyBvbiB0byBpbXBvcnQgdGhlXG5uZXh0IGlkZW50aWZpZXIsIGlmIGFueS4gIElmIHRoZSBtb2R1bGUgbmFtZSBpcyBmb2xsb3dlZCBieSBgYGFzYGAsXG50aGUgbmFtZSBmb2xsb3dpbmcgYGBhc2BgIGlzIHVzZWQgYXMgdGhlIGxvY2FsIG5hbWUgZm9yIHRoZSBtb2R1bGUuXG5cblRoZSBgYGZyb21gYCBmb3JtIGRvZXMgbm90IGJpbmQgdGhlIG1vZHVsZSBuYW1lOiBpdCBnb2VzIHRocm91Z2ggdGhlXG5saXN0IG9mIGlkZW50aWZpZXJzLCBsb29rcyBlYWNoIG9uZSBvZiB0aGVtIHVwIGluIHRoZSBtb2R1bGUgZm91bmQgaW5cbnN0ZXAgKDEpLCBhbmQgYmluZHMgdGhlIG5hbWUgaW4gdGhlIGxvY2FsIG5hbWVzcGFjZSB0byB0aGUgb2JqZWN0IHRodXNcbmZvdW5kLiAgQXMgd2l0aCB0aGUgZmlyc3QgZm9ybSBvZiBgYGltcG9ydGBgLCBhbiBhbHRlcm5hdGUgbG9jYWwgbmFtZVxuY2FuIGJlIHN1cHBsaWVkIGJ5IHNwZWNpZnlpbmcgImBgYXNgYCBsb2NhbG5hbWUiLiAgSWYgYSBuYW1lIGlzIG5vdFxuZm91bmQsIGBgSW1wb3J0RXJyb3JgYCBpcyByYWlzZWQuICBJZiB0aGUgbGlzdCBvZiBpZGVudGlmaWVycyBpc1xucmVwbGFjZWQgYnkgYSBzdGFyIChgYFwnKlwnYGApLCBhbGwgcHVibGljIG5hbWVzIGRlZmluZWQgaW4gdGhlIG1vZHVsZVxuYXJlIGJvdW5kIGluIHRoZSBsb2NhbCBuYW1lc3BhY2Ugb2YgdGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50Li5cblxuVGhlICpwdWJsaWMgbmFtZXMqIGRlZmluZWQgYnkgYSBtb2R1bGUgYXJlIGRldGVybWluZWQgYnkgY2hlY2tpbmcgdGhlXG5tb2R1bGVcJ3MgbmFtZXNwYWNlIGZvciBhIHZhcmlhYmxlIG5hbWVkIGBgX19hbGxfX2BgOyBpZiBkZWZpbmVkLCBpdFxubXVzdCBiZSBhIHNlcXVlbmNlIG9mIHN0cmluZ3Mgd2hpY2ggYXJlIG5hbWVzIGRlZmluZWQgb3IgaW1wb3J0ZWQgYnlcbnRoYXQgbW9kdWxlLiAgVGhlIG5hbWVzIGdpdmVuIGluIGBgX19hbGxfX2BgIGFyZSBhbGwgY29uc2lkZXJlZCBwdWJsaWNcbmFuZCBhcmUgcmVxdWlyZWQgdG8gZXhpc3QuICBJZiBgYF9fYWxsX19gYCBpcyBub3QgZGVmaW5lZCwgdGhlIHNldCBvZlxucHVibGljIG5hbWVzIGluY2x1ZGVzIGFsbCBuYW1lcyBmb3VuZCBpbiB0aGUgbW9kdWxlXCdzIG5hbWVzcGFjZSB3aGljaFxuZG8gbm90IGJlZ2luIHdpdGggYW4gdW5kZXJzY29yZSBjaGFyYWN0ZXIgKGBgXCdfXCdgYCkuIGBgX19hbGxfX2BgXG5zaG91bGQgY29udGFpbiB0aGUgZW50aXJlIHB1YmxpYyBBUEkuIEl0IGlzIGludGVuZGVkIHRvIGF2b2lkXG5hY2NpZGVudGFsbHkgZXhwb3J0aW5nIGl0ZW1zIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBBUEkgKHN1Y2ggYXNcbmxpYnJhcnkgbW9kdWxlcyB3aGljaCB3ZXJlIGltcG9ydGVkIGFuZCB1c2VkIHdpdGhpbiB0aGUgbW9kdWxlKS5cblxuVGhlIGBgZnJvbWBgIGZvcm0gd2l0aCBgYCpgYCBtYXkgb25seSBvY2N1ciBpbiBhIG1vZHVsZSBzY29wZS4gIElmIHRoZVxud2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYSBmdW5jdGlvblxuYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLFxudGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbldoZW4gc3BlY2lmeWluZyB3aGF0IG1vZHVsZSB0byBpbXBvcnQgeW91IGRvIG5vdCBoYXZlIHRvIHNwZWNpZnkgdGhlXG5hYnNvbHV0ZSBuYW1lIG9mIHRoZSBtb2R1bGUuIFdoZW4gYSBtb2R1bGUgb3IgcGFja2FnZSBpcyBjb250YWluZWRcbndpdGhpbiBhbm90aGVyIHBhY2thZ2UgaXQgaXMgcG9zc2libGUgdG8gbWFrZSBhIHJlbGF0aXZlIGltcG9ydCB3aXRoaW5cbnRoZSBzYW1lIHRvcCBwYWNrYWdlIHdpdGhvdXQgaGF2aW5nIHRvIG1lbnRpb24gdGhlIHBhY2thZ2UgbmFtZS4gQnlcbnVzaW5nIGxlYWRpbmcgZG90cyBpbiB0aGUgc3BlY2lmaWVkIG1vZHVsZSBvciBwYWNrYWdlIGFmdGVyIGBgZnJvbWBgXG55b3UgY2FuIHNwZWNpZnkgaG93IGhpZ2ggdG8gdHJhdmVyc2UgdXAgdGhlIGN1cnJlbnQgcGFja2FnZSBoaWVyYXJjaHlcbndpdGhvdXQgc3BlY2lmeWluZyBleGFjdCBuYW1lcy4gT25lIGxlYWRpbmcgZG90IG1lYW5zIHRoZSBjdXJyZW50XG5wYWNrYWdlIHdoZXJlIHRoZSBtb2R1bGUgbWFraW5nIHRoZSBpbXBvcnQgZXhpc3RzLiBUd28gZG90cyBtZWFucyB1cFxub25lIHBhY2thZ2UgbGV2ZWwuIFRocmVlIGRvdHMgaXMgdXAgdHdvIGxldmVscywgZXRjLiBTbyBpZiB5b3UgZXhlY3V0ZVxuYGBmcm9tIC4gaW1wb3J0IG1vZGBgIGZyb20gYSBtb2R1bGUgaW4gdGhlIGBgcGtnYGAgcGFja2FnZSB0aGVuIHlvdVxud2lsbCBlbmQgdXAgaW1wb3J0aW5nIGBgcGtnLm1vZGBgLiBJZiB5b3UgZXhlY3V0ZSBgYGZyb20gLi5zdWJwa2cyXG5pbXBvcnQgbW9kYGAgZnJvbSB3aXRoaW4gYGBwa2cuc3VicGtnMWBgIHlvdSB3aWxsIGltcG9ydFxuYGBwa2cuc3VicGtnMi5tb2RgYC4gVGhlIHNwZWNpZmljYXRpb24gZm9yIHJlbGF0aXZlIGltcG9ydHMgaXNcbmNvbnRhaW5lZCB3aXRoaW4gKipQRVAgMzI4KiouXG5cbmBgaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoKWBgIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgYXBwbGljYXRpb25zIHRoYXRcbmRldGVybWluZSB3aGljaCBtb2R1bGVzIG5lZWQgdG8gYmUgbG9hZGVkIGR5bmFtaWNhbGx5LlxuXG5cbkZ1dHVyZSBzdGF0ZW1lbnRzXG49PT09PT09PT09PT09PT09PVxuXG5BICpmdXR1cmUgc3RhdGVtZW50KiBpcyBhIGRpcmVjdGl2ZSB0byB0aGUgY29tcGlsZXIgdGhhdCBhIHBhcnRpY3VsYXJcbm1vZHVsZSBzaG91bGQgYmUgY29tcGlsZWQgdXNpbmcgc3ludGF4IG9yIHNlbWFudGljcyB0aGF0IHdpbGwgYmVcbmF2YWlsYWJsZSBpbiBhIHNwZWNpZmllZCBmdXR1cmUgcmVsZWFzZSBvZiBQeXRob24uICBUaGUgZnV0dXJlXG5zdGF0ZW1lbnQgaXMgaW50ZW5kZWQgdG8gZWFzZSBtaWdyYXRpb24gdG8gZnV0dXJlIHZlcnNpb25zIG9mIFB5dGhvblxudGhhdCBpbnRyb2R1Y2UgaW5jb21wYXRpYmxlIGNoYW5nZXMgdG8gdGhlIGxhbmd1YWdlLiAgSXQgYWxsb3dzIHVzZSBvZlxudGhlIG5ldyBmZWF0dXJlcyBvbiBhIHBlci1tb2R1bGUgYmFzaXMgYmVmb3JlIHRoZSByZWxlYXNlIGluIHdoaWNoIHRoZVxuZmVhdHVyZSBiZWNvbWVzIHN0YW5kYXJkLlxuXG4gICBmdXR1cmVfc3RhdGVtZW50IDo6PSAiZnJvbSIgIl9fZnV0dXJlX18iICJpbXBvcnQiIGZlYXR1cmUgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqXG4gICAgICAgICAgICAgICAgICAgICAgICB8ICJmcm9tIiAiX19mdXR1cmVfXyIgImltcG9ydCIgIigiIGZlYXR1cmUgWyJhcyIgbmFtZV1cbiAgICAgICAgICAgICAgICAgICAgICAgICgiLCIgZmVhdHVyZSBbImFzIiBuYW1lXSkqIFsiLCJdICIpIlxuICAgZmVhdHVyZSAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuICAgbmFtZSAgICAgICAgICAgICA6Oj0gaWRlbnRpZmllclxuXG5BIGZ1dHVyZSBzdGF0ZW1lbnQgbXVzdCBhcHBlYXIgbmVhciB0aGUgdG9wIG9mIHRoZSBtb2R1bGUuICBUaGUgb25seVxubGluZXMgdGhhdCBjYW4gYXBwZWFyIGJlZm9yZSBhIGZ1dHVyZSBzdGF0ZW1lbnQgYXJlOlxuXG4qIHRoZSBtb2R1bGUgZG9jc3RyaW5nIChpZiBhbnkpLFxuXG4qIGNvbW1lbnRzLFxuXG4qIGJsYW5rIGxpbmVzLCBhbmRcblxuKiBvdGhlciBmdXR1cmUgc3RhdGVtZW50cy5cblxuVGhlIGZlYXR1cmVzIHJlY29nbml6ZWQgYnkgUHl0aG9uIDIuNiBhcmUgYGB1bmljb2RlX2xpdGVyYWxzYGAsXG5gYHByaW50X2Z1bmN0aW9uYGAsIGBgYWJzb2x1dGVfaW1wb3J0YGAsIGBgZGl2aXNpb25gYCwgYGBnZW5lcmF0b3JzYGAsXG5gYG5lc3RlZF9zY29wZXNgYCBhbmQgYGB3aXRoX3N0YXRlbWVudGBgLiAgYGBnZW5lcmF0b3JzYGAsXG5gYHdpdGhfc3RhdGVtZW50YGAsIGBgbmVzdGVkX3Njb3Blc2BgIGFyZSByZWR1bmRhbnQgaW4gUHl0aG9uIHZlcnNpb25cbjIuNiBhbmQgYWJvdmUgYmVjYXVzZSB0aGV5IGFyZSBhbHdheXMgZW5hYmxlZC5cblxuQSBmdXR1cmUgc3RhdGVtZW50IGlzIHJlY29nbml6ZWQgYW5kIHRyZWF0ZWQgc3BlY2lhbGx5IGF0IGNvbXBpbGVcbnRpbWU6IENoYW5nZXMgdG8gdGhlIHNlbWFudGljcyBvZiBjb3JlIGNvbnN0cnVjdHMgYXJlIG9mdGVuXG5pbXBsZW1lbnRlZCBieSBnZW5lcmF0aW5nIGRpZmZlcmVudCBjb2RlLiAgSXQgbWF5IGV2ZW4gYmUgdGhlIGNhc2VcbnRoYXQgYSBuZXcgZmVhdHVyZSBpbnRyb2R1Y2VzIG5ldyBpbmNvbXBhdGlibGUgc3ludGF4IChzdWNoIGFzIGEgbmV3XG5yZXNlcnZlZCB3b3JkKSwgaW4gd2hpY2ggY2FzZSB0aGUgY29tcGlsZXIgbWF5IG5lZWQgdG8gcGFyc2UgdGhlXG5tb2R1bGUgZGlmZmVyZW50bHkuICBTdWNoIGRlY2lzaW9ucyBjYW5ub3QgYmUgcHVzaGVkIG9mZiB1bnRpbFxucnVudGltZS5cblxuRm9yIGFueSBnaXZlbiByZWxlYXNlLCB0aGUgY29tcGlsZXIga25vd3Mgd2hpY2ggZmVhdHVyZSBuYW1lcyBoYXZlXG5iZWVuIGRlZmluZWQsIGFuZCByYWlzZXMgYSBjb21waWxlLXRpbWUgZXJyb3IgaWYgYSBmdXR1cmUgc3RhdGVtZW50XG5jb250YWlucyBhIGZlYXR1cmUgbm90IGtub3duIHRvIGl0LlxuXG5UaGUgZGlyZWN0IHJ1bnRpbWUgc2VtYW50aWNzIGFyZSB0aGUgc2FtZSBhcyBmb3IgYW55IGltcG9ydCBzdGF0ZW1lbnQ6XG50aGVyZSBpcyBhIHN0YW5kYXJkIG1vZHVsZSBgYF9fZnV0dXJlX19gYCwgZGVzY3JpYmVkIGxhdGVyLCBhbmQgaXRcbndpbGwgYmUgaW1wb3J0ZWQgaW4gdGhlIHVzdWFsIHdheSBhdCB0aGUgdGltZSB0aGUgZnV0dXJlIHN0YXRlbWVudCBpc1xuZXhlY3V0ZWQuXG5cblRoZSBpbnRlcmVzdGluZyBydW50aW1lIHNlbWFudGljcyBkZXBlbmQgb24gdGhlIHNwZWNpZmljIGZlYXR1cmVcbmVuYWJsZWQgYnkgdGhlIGZ1dHVyZSBzdGF0ZW1lbnQuXG5cbk5vdGUgdGhhdCB0aGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgdGhlIHN0YXRlbWVudDpcblxuICAgaW1wb3J0IF9fZnV0dXJlX18gW2FzIG5hbWVdXG5cblRoYXQgaXMgbm90IGEgZnV0dXJlIHN0YXRlbWVudDsgaXRcJ3MgYW4gb3JkaW5hcnkgaW1wb3J0IHN0YXRlbWVudCB3aXRoXG5ubyBzcGVjaWFsIHNlbWFudGljcyBvciBzeW50YXggcmVzdHJpY3Rpb25zLlxuXG5Db2RlIGNvbXBpbGVkIGJ5IGFuIGBgZXhlY2BgIHN0YXRlbWVudCBvciBjYWxscyB0byB0aGUgYnVpbHQtaW5cbmZ1bmN0aW9ucyBgYGNvbXBpbGUoKWBgIGFuZCBgYGV4ZWNmaWxlKClgYCB0aGF0IG9jY3VyIGluIGEgbW9kdWxlXG5gYE1gYCBjb250YWluaW5nIGEgZnV0dXJlIHN0YXRlbWVudCB3aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhlIG5ld1xuc3ludGF4IG9yIHNlbWFudGljcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1dHVyZSBzdGF0ZW1lbnQuICBUaGlzIGNhbixcbnN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuMiBiZSBjb250cm9sbGVkIGJ5IG9wdGlvbmFsIGFyZ3VtZW50cyB0b1xuYGBjb21waWxlKClgYCAtLS0gc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZnVuY3Rpb24gZm9yIGRldGFpbHMuXG5cbkEgZnV0dXJlIHN0YXRlbWVudCB0eXBlZCBhdCBhbiBpbnRlcmFjdGl2ZSBpbnRlcnByZXRlciBwcm9tcHQgd2lsbFxudGFrZSBlZmZlY3QgZm9yIHRoZSByZXN0IG9mIHRoZSBpbnRlcnByZXRlciBzZXNzaW9uLiAgSWYgYW5cbmludGVycHJldGVyIGlzIHN0YXJ0ZWQgd2l0aCB0aGUgKi1pKiBvcHRpb24sIGlzIHBhc3NlZCBhIHNjcmlwdCBuYW1lXG50byBleGVjdXRlLCBhbmQgdGhlIHNjcmlwdCBpbmNsdWRlcyBhIGZ1dHVyZSBzdGF0ZW1lbnQsIGl0IHdpbGwgYmUgaW5cbmVmZmVjdCBpbiB0aGUgaW50ZXJhY3RpdmUgc2Vzc2lvbiBzdGFydGVkIGFmdGVyIHRoZSBzY3JpcHQgaXNcbmV4ZWN1dGVkLlxuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMjM2KiogLSBCYWNrIHRvIHRoZSBfX2Z1dHVyZV9fXG4gICAgICBUaGUgb3JpZ2luYWwgcHJvcG9zYWwgZm9yIHRoZSBfX2Z1dHVyZV9fIG1lY2hhbmlzbS5cbicsCisgJ2luJzogJ1xuQ29tcGFyaXNvbnNcbioqKioqKioqKioqXG5cblVubGlrZSBDLCBhbGwgY29tcGFyaXNvbiBvcGVyYXRpb25zIGluIFB5dGhvbiBoYXZlIHRoZSBzYW1lIHByaW9yaXR5LFxud2hpY2ggaXMgbG93ZXIgdGhhbiB0aGF0IG9mIGFueSBhcml0aG1ldGljLCBzaGlmdGluZyBvciBiaXR3aXNlXG5vcGVyYXRpb24uICBBbHNvIHVubGlrZSBDLCBleHByZXNzaW9ucyBsaWtlIGBgYSA8IGIgPCBjYGAgaGF2ZSB0aGVcbmludGVycHJldGF0aW9uIHRoYXQgaXMgY29udmVudGlvbmFsIGluIG1hdGhlbWF0aWNzOlxuXG4gICBjb21wYXJpc29uICAgIDo6PSBvcl9leHByICggY29tcF9vcGVyYXRvciBvcl9leHByICkqXG4gICBjb21wX29wZXJhdG9yIDo6PSAiPCIgfCAiPiIgfCAiPT0iIHwgIj49IiB8ICI8PSIgfCAiPD4iIHwgIiE9IlxuICAgICAgICAgICAgICAgICAgICAgfCAiaXMiIFsibm90Il0gfCBbIm5vdCJdICJpbiJcblxuQ29tcGFyaXNvbnMgeWllbGQgYm9vbGVhbiB2YWx1ZXM6IGBgVHJ1ZWBgIG9yIGBgRmFsc2VgYC5cblxuQ29tcGFyaXNvbnMgY2FuIGJlIGNoYWluZWQgYXJiaXRyYXJpbHksIGUuZy4sIGBgeCA8IHkgPD0gemBgIGlzXG5lcXVpdmFsZW50IHRvIGBgeCA8IHkgYW5kIHkgPD0gemBgLCBleGNlcHQgdGhhdCBgYHlgYCBpcyBldmFsdWF0ZWRcbm9ubHkgb25jZSAoYnV0IGluIGJvdGggY2FzZXMgYGB6YGAgaXMgbm90IGV2YWx1YXRlZCBhdCBhbGwgd2hlbiBgYHggPFxueWBgIGlzIGZvdW5kIHRvIGJlIGZhbHNlKS5cblxuRm9ybWFsbHksIGlmICphKiwgKmIqLCAqYyosIC4uLiwgKnkqLCAqeiogYXJlIGV4cHJlc3Npb25zIGFuZCAqb3AxKixcbipvcDIqLCAuLi4sICpvcE4qIGFyZSBjb21wYXJpc29uIG9wZXJhdG9ycywgdGhlbiBgYGEgb3AxIGIgb3AyIGMgLi4uIHlcbm9wTiB6YGAgaXMgZXF1aXZhbGVudCB0byBgYGEgb3AxIGIgYW5kIGIgb3AyIGMgYW5kIC4uLiB5IG9wTiB6YGAsXG5leGNlcHQgdGhhdCBlYWNoIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGF0IG1vc3Qgb25jZS5cblxuTm90ZSB0aGF0IGBgYSBvcDEgYiBvcDIgY2BgIGRvZXNuXCd0IGltcGx5IGFueSBraW5kIG9mIGNvbXBhcmlzb25cbmJldHdlZW4gKmEqIGFuZCAqYyosIHNvIHRoYXQsIGUuZy4sIGBgeCA8IHkgPiB6YGAgaXMgcGVyZmVjdGx5IGxlZ2FsXG4odGhvdWdoIHBlcmhhcHMgbm90IHByZXR0eSkuXG5cblRoZSBmb3JtcyBgYDw+YGAgYW5kIGBgIT1gYCBhcmUgZXF1aXZhbGVudDsgZm9yIGNvbnNpc3RlbmN5IHdpdGggQyxcbmBgIT1gYCBpcyBwcmVmZXJyZWQ7IHdoZXJlIGBgIT1gYCBpcyBtZW50aW9uZWQgYmVsb3cgYGA8PmBgIGlzIGFsc29cbmFjY2VwdGVkLiAgVGhlIGBgPD5gYCBzcGVsbGluZyBpcyBjb25zaWRlcmVkIG9ic29sZXNjZW50LlxuXG5UaGUgb3BlcmF0b3JzIGBgPGBgLCBgYD5gYCwgYGA9PWBgLCBgYD49YGAsIGBgPD1gYCwgYW5kIGBgIT1gYCBjb21wYXJlXG50aGUgdmFsdWVzIG9mIHR3byBvYmplY3RzLiAgVGhlIG9iamVjdHMgbmVlZCBub3QgaGF2ZSB0aGUgc2FtZSB0eXBlLlxuSWYgYm90aCBhcmUgbnVtYmVycywgdGhleSBhcmUgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBPdGhlcndpc2UsXG5vYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyAqYWx3YXlzKiBjb21wYXJlIHVuZXF1YWwsIGFuZCBhcmUgb3JkZXJlZFxuY29uc2lzdGVudGx5IGJ1dCBhcmJpdHJhcmlseS4gWW91IGNhbiBjb250cm9sIGNvbXBhcmlzb24gYmVoYXZpb3Igb2Zcbm9iamVjdHMgb2Ygbm9uLWJ1aWx0LWluIHR5cGVzIGJ5IGRlZmluaW5nIGEgYGBfX2NtcF9fYGAgbWV0aG9kIG9yIHJpY2hcbmNvbXBhcmlzb24gbWV0aG9kcyBsaWtlIGBgX19ndF9fYGAsIGRlc2NyaWJlZCBpbiBzZWN0aW9uICpTcGVjaWFsXG5tZXRob2QgbmFtZXMqLlxuXG4oVGhpcyB1bnVzdWFsIGRlZmluaXRpb24gb2YgY29tcGFyaXNvbiB3YXMgdXNlZCB0byBzaW1wbGlmeSB0aGVcbmRlZmluaXRpb24gb2Ygb3BlcmF0aW9ucyBsaWtlIHNvcnRpbmcgYW5kIHRoZSBgYGluYGAgYW5kIGBgbm90IGluYGBcbm9wZXJhdG9ycy4gSW4gdGhlIGZ1dHVyZSwgdGhlIGNvbXBhcmlzb24gcnVsZXMgZm9yIG9iamVjdHMgb2ZcbmRpZmZlcmVudCB0eXBlcyBhcmUgbGlrZWx5IHRvIGNoYW5nZS4pXG5cbkNvbXBhcmlzb24gb2Ygb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlIGRlcGVuZHMgb24gdGhlIHR5cGU6XG5cbiogTnVtYmVycyBhcmUgY29tcGFyZWQgYXJpdGhtZXRpY2FsbHkuXG5cbiogU3RyaW5ncyBhcmUgY29tcGFyZWQgbGV4aWNvZ3JhcGhpY2FsbHkgdXNpbmcgdGhlIG51bWVyaWMgZXF1aXZhbGVudHNcbiAgKHRoZSByZXN1bHQgb2YgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgb3JkKClgYCkgb2YgdGhlaXIgY2hhcmFjdGVycy5cbiAgVW5pY29kZSBhbmQgOC1iaXQgc3RyaW5ncyBhcmUgZnVsbHkgaW50ZXJvcGVyYWJsZSBpbiB0aGlzIGJlaGF2aW9yLlxuICBbNF1cblxuKiBUdXBsZXMgYW5kIGxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSB1c2luZyBjb21wYXJpc29uIG9mXG4gIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMuICBUaGlzIG1lYW5zIHRoYXQgdG8gY29tcGFyZSBlcXVhbCwgZWFjaFxuICBlbGVtZW50IG11c3QgY29tcGFyZSBlcXVhbCBhbmQgdGhlIHR3byBzZXF1ZW5jZXMgbXVzdCBiZSBvZiB0aGUgc2FtZVxuICB0eXBlIGFuZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC5cblxuICBJZiBub3QgZXF1YWwsIHRoZSBzZXF1ZW5jZXMgYXJlIG9yZGVyZWQgdGhlIHNhbWUgYXMgdGhlaXIgZmlyc3RcbiAgZGlmZmVyaW5nIGVsZW1lbnRzLiAgRm9yIGV4YW1wbGUsIGBgY21wKFsxLDIseF0sIFsxLDIseV0pYGAgcmV0dXJuc1xuICB0aGUgc2FtZSBhcyBgYGNtcCh4LHkpYGAuICBJZiB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGRvZXMgbm90XG4gIGV4aXN0LCB0aGUgc2hvcnRlciBzZXF1ZW5jZSBpcyBvcmRlcmVkIGZpcnN0IChmb3IgZXhhbXBsZSwgYGBbMSwyXSA8XG4gIFsxLDIsM11gYCkuXG5cbiogTWFwcGluZ3MgKGRpY3Rpb25hcmllcykgY29tcGFyZSBlcXVhbCBpZiBhbmQgb25seSBpZiB0aGVpciBzb3J0ZWRcbiAgKGtleSwgdmFsdWUpIGxpc3RzIGNvbXBhcmUgZXF1YWwuIFs1XSBPdXRjb21lcyBvdGhlciB0aGFuIGVxdWFsaXR5XG4gIGFyZSByZXNvbHZlZCBjb25zaXN0ZW50bHksIGJ1dCBhcmUgbm90IG90aGVyd2lzZSBkZWZpbmVkLiBbNl1cblxuKiBNb3N0IG90aGVyIG9iamVjdHMgb2YgYnVpbHQtaW4gdHlwZXMgY29tcGFyZSB1bmVxdWFsIHVubGVzcyB0aGV5IGFyZVxuICB0aGUgc2FtZSBvYmplY3Q7IHRoZSBjaG9pY2Ugd2hldGhlciBvbmUgb2JqZWN0IGlzIGNvbnNpZGVyZWQgc21hbGxlclxuICBvciBsYXJnZXIgdGhhbiBhbm90aGVyIG9uZSBpcyBtYWRlIGFyYml0cmFyaWx5IGJ1dCBjb25zaXN0ZW50bHlcbiAgd2l0aGluIG9uZSBleGVjdXRpb24gb2YgYSBwcm9ncmFtLlxuXG5UaGUgb3BlcmF0b3JzIGBgaW5gYCBhbmQgYGBub3QgaW5gYCB0ZXN0IGZvciBjb2xsZWN0aW9uIG1lbWJlcnNoaXAuXG5gYHggaW4gc2BgIGV2YWx1YXRlcyB0byB0cnVlIGlmICp4KiBpcyBhIG1lbWJlciBvZiB0aGUgY29sbGVjdGlvbiAqcyosXG5hbmQgZmFsc2Ugb3RoZXJ3aXNlLiAgYGB4IG5vdCBpbiBzYGAgcmV0dXJucyB0aGUgbmVnYXRpb24gb2YgYGB4IGluXG5zYGAuIFRoZSBjb2xsZWN0aW9uIG1lbWJlcnNoaXAgdGVzdCBoYXMgdHJhZGl0aW9uYWxseSBiZWVuIGJvdW5kIHRvXG5zZXF1ZW5jZXM7IGFuIG9iamVjdCBpcyBhIG1lbWJlciBvZiBhIGNvbGxlY3Rpb24gaWYgdGhlIGNvbGxlY3Rpb24gaXNcbmEgc2VxdWVuY2UgYW5kIGNvbnRhaW5zIGFuIGVsZW1lbnQgZXF1YWwgdG8gdGhhdCBvYmplY3QuICBIb3dldmVyLCBpdFxubWFrZSBzZW5zZSBmb3IgbWFueSBvdGhlciBvYmplY3QgdHlwZXMgdG8gc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RzXG53aXRob3V0IGJlaW5nIGEgc2VxdWVuY2UuICBJbiBwYXJ0aWN1bGFyLCBkaWN0aW9uYXJpZXMgKGZvciBrZXlzKSBhbmRcbnNldHMgc3VwcG9ydCBtZW1iZXJzaGlwIHRlc3RpbmcuXG5cbkZvciB0aGUgbGlzdCBhbmQgdHVwbGUgdHlwZXMsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGVyZVxuZXhpc3RzIGFuIGluZGV4ICppKiBzdWNoIHRoYXQgYGB4ID09IHlbaV1gYCBpcyB0cnVlLlxuXG5Gb3IgdGhlIFVuaWNvZGUgYW5kIHN0cmluZyB0eXBlcywgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmXG4qeCogaXMgYSBzdWJzdHJpbmcgb2YgKnkqLiAgQW4gZXF1aXZhbGVudCB0ZXN0IGlzIGBgeS5maW5kKHgpICE9IC0xYGAuXG5Ob3RlLCAqeCogYW5kICp5KiBuZWVkIG5vdCBiZSB0aGUgc2FtZSB0eXBlOyBjb25zZXF1ZW50bHksIGBgdVwnYWJcJyBpblxuXCdhYmNcJ2BgIHdpbGwgcmV0dXJuIGBgVHJ1ZWBgLiBFbXB0eSBzdHJpbmdzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB0b1xuYmUgYSBzdWJzdHJpbmcgb2YgYW55IG90aGVyIHN0cmluZywgc28gYGAiIiBpbiAiYWJjImBgIHdpbGwgcmV0dXJuXG5gYFRydWVgYC5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgKngqIHdhcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZyBvZlxubGVuZ3RoIGBgMWBgLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZGVmaW5lIHRoZSBgYF9fY29udGFpbnNfXygpYGAgbWV0aG9kLFxuYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIGBgeS5fX2NvbnRhaW5zX18oeClgYCBpcyB0cnVlLlxuXG5Gb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMgd2hpY2ggZG8gbm90IGRlZmluZSBgYF9fY29udGFpbnNfXygpYGAgYnV0IGRvXG5kZWZpbmUgYGBfX2l0ZXJfXygpYGAsIGBgeCBpbiB5YGAgaXMgdHJ1ZSBpZiBzb21lIHZhbHVlIGBgemBgIHdpdGggYGB4XG49PSB6YGAgaXMgcHJvZHVjZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgYGB5YGAuICBJZiBhbiBleGNlcHRpb24gaXNcbnJhaXNlZCBkdXJpbmcgdGhlIGl0ZXJhdGlvbiwgaXQgaXMgYXMgaWYgYGBpbmBgIHJhaXNlZCB0aGF0IGV4Y2VwdGlvbi5cblxuTGFzdGx5LCB0aGUgb2xkLXN0eWxlIGl0ZXJhdGlvbiBwcm90b2NvbCBpcyB0cmllZDogaWYgYSBjbGFzcyBkZWZpbmVzXG5gYF9fZ2V0aXRlbV9fKClgYCwgYGB4IGluIHlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGEgbm9uLVxubmVnYXRpdmUgaW50ZWdlciBpbmRleCAqaSogc3VjaCB0aGF0IGBgeCA9PSB5W2ldYGAsIGFuZCBhbGwgbG93ZXJcbmludGVnZXIgaW5kaWNlcyBkbyBub3QgcmFpc2UgYGBJbmRleEVycm9yYGAgZXhjZXB0aW9uLiAoSWYgYW55IG90aGVyXG5leGNlcHRpb24gaXMgcmFpc2VkLCBpdCBpcyBhcyBpZiBgYGluYGAgcmFpc2VkIHRoYXQgZXhjZXB0aW9uKS5cblxuVGhlIG9wZXJhdG9yIGBgbm90IGluYGAgaXMgZGVmaW5lZCB0byBoYXZlIHRoZSBpbnZlcnNlIHRydWUgdmFsdWUgb2ZcbmBgaW5gYC5cblxuVGhlIG9wZXJhdG9ycyBgYGlzYGAgYW5kIGBgaXMgbm90YGAgdGVzdCBmb3Igb2JqZWN0IGlkZW50aXR5OiBgYHggaXNcbnlgYCBpcyB0cnVlIGlmIGFuZCBvbmx5IGlmICp4KiBhbmQgKnkqIGFyZSB0aGUgc2FtZSBvYmplY3QuICBgYHggaXNcbm5vdCB5YGAgeWllbGRzIHRoZSBpbnZlcnNlIHRydXRoIHZhbHVlLiBbN11cbicsCisgJ2ludGVnZXJzJzogJ1xuSW50ZWdlciBhbmQgbG9uZyBpbnRlZ2VyIGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuSW50ZWdlciBhbmQgbG9uZyBpbnRlZ2VyIGxpdGVyYWxzIGFyZSBkZXNjcmliZWQgYnkgdGhlIGZvbGxvd2luZ1xubGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgbG9uZ2ludGVnZXIgICAgOjo9IGludGVnZXIgKCJsIiB8ICJMIilcbiAgIGludGVnZXIgICAgICAgIDo6PSBkZWNpbWFsaW50ZWdlciB8IG9jdGludGVnZXIgfCBoZXhpbnRlZ2VyIHwgYmluaW50ZWdlclxuICAgZGVjaW1hbGludGVnZXIgOjo9IG5vbnplcm9kaWdpdCBkaWdpdCogfCAiMCJcbiAgIG9jdGludGVnZXIgICAgIDo6PSAiMCIgKCJvIiB8ICJPIikgb2N0ZGlnaXQrIHwgIjAiIG9jdGRpZ2l0K1xuICAgaGV4aW50ZWdlciAgICAgOjo9ICIwIiAoIngiIHwgIlgiKSBoZXhkaWdpdCtcbiAgIGJpbmludGVnZXIgICAgIDo6PSAiMCIgKCJiIiB8ICJCIikgYmluZGlnaXQrXG4gICBub256ZXJvZGlnaXQgICA6Oj0gIjEiLi4uIjkiXG4gICBvY3RkaWdpdCAgICAgICA6Oj0gIjAiLi4uIjciXG4gICBiaW5kaWdpdCAgICAgICA6Oj0gIjAiIHwgIjEiXG4gICBoZXhkaWdpdCAgICAgICA6Oj0gZGlnaXQgfCAiYSIuLi4iZiIgfCAiQSIuLi4iRiJcblxuQWx0aG91Z2ggYm90aCBsb3dlciBjYXNlIGBgXCdsXCdgYCBhbmQgdXBwZXIgY2FzZSBgYFwnTFwnYGAgYXJlIGFsbG93ZWQgYXNcbnN1ZmZpeCBmb3IgbG9uZyBpbnRlZ2VycywgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gYWx3YXlzIHVzZVxuYGBcJ0xcJ2BgLCBzaW5jZSB0aGUgbGV0dGVyIGBgXCdsXCdgYCBsb29rcyB0b28gbXVjaCBsaWtlIHRoZSBkaWdpdFxuYGBcJzFcJ2BgLlxuXG5QbGFpbiBpbnRlZ2VyIGxpdGVyYWxzIHRoYXQgYXJlIGFib3ZlIHRoZSBsYXJnZXN0IHJlcHJlc2VudGFibGUgcGxhaW5cbmludGVnZXIgKGUuZy4sIDIxNDc0ODM2NDcgd2hlbiB1c2luZyAzMi1iaXQgYXJpdGhtZXRpYykgYXJlIGFjY2VwdGVkXG5hcyBpZiB0aGV5IHdlcmUgbG9uZyBpbnRlZ2VycyBpbnN0ZWFkLiBbMV0gIFRoZXJlIGlzIG5vIGxpbWl0IGZvciBsb25nXG5pbnRlZ2VyIGxpdGVyYWxzIGFwYXJ0IGZyb20gd2hhdCBjYW4gYmUgc3RvcmVkIGluIGF2YWlsYWJsZSBtZW1vcnkuXG5cblNvbWUgZXhhbXBsZXMgb2YgcGxhaW4gaW50ZWdlciBsaXRlcmFscyAoZmlyc3Qgcm93KSBhbmQgbG9uZyBpbnRlZ2VyXG5saXRlcmFscyAoc2Vjb25kIGFuZCB0aGlyZCByb3dzKTpcblxuICAgNyAgICAgMjE0NzQ4MzY0NyAgICAgICAgICAgICAgICAgICAgICAgIDAxNzdcbiAgIDNMICAgIDc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2TCAgICAwMzc3TCAgIDB4MTAwMDAwMDAwTFxuICAgICAgICAgNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYgICAgICAgICAgICAgMHhkZWFkYmVlZlxuJywKKyAnbGFtYmRhJzogJ1xuTGFtYmRhc1xuKioqKioqKlxuXG4gICBsYW1iZGFfZm9ybSAgICAgOjo9ICJsYW1iZGEiIFtwYXJhbWV0ZXJfbGlzdF06IGV4cHJlc3Npb25cbiAgIG9sZF9sYW1iZGFfZm9ybSA6Oj0gImxhbWJkYSIgW3BhcmFtZXRlcl9saXN0XTogb2xkX2V4cHJlc3Npb25cblxuTGFtYmRhIGZvcm1zIChsYW1iZGEgZXhwcmVzc2lvbnMpIGhhdmUgdGhlIHNhbWUgc3ludGFjdGljIHBvc2l0aW9uIGFzXG5leHByZXNzaW9ucy4gIFRoZXkgYXJlIGEgc2hvcnRoYW5kIHRvIGNyZWF0ZSBhbm9ueW1vdXMgZnVuY3Rpb25zOyB0aGVcbmV4cHJlc3Npb24gYGBsYW1iZGEgYXJndW1lbnRzOiBleHByZXNzaW9uYGAgeWllbGRzIGEgZnVuY3Rpb24gb2JqZWN0LlxuVGhlIHVubmFtZWQgb2JqZWN0IGJlaGF2ZXMgbGlrZSBhIGZ1bmN0aW9uIG9iamVjdCBkZWZpbmVkIHdpdGhcblxuICAgZGVmIG5hbWUoYXJndW1lbnRzKTpcbiAgICAgICByZXR1cm4gZXhwcmVzc2lvblxuXG5TZWUgc2VjdGlvbiAqRnVuY3Rpb24gZGVmaW5pdGlvbnMqIGZvciB0aGUgc3ludGF4IG9mIHBhcmFtZXRlciBsaXN0cy5cbk5vdGUgdGhhdCBmdW5jdGlvbnMgY3JlYXRlZCB3aXRoIGxhbWJkYSBmb3JtcyBjYW5ub3QgY29udGFpblxuc3RhdGVtZW50cy5cbicsCisgJ2xpc3RzJzogJ1xuTGlzdCBkaXNwbGF5c1xuKioqKioqKioqKioqKlxuXG5BIGxpc3QgZGlzcGxheSBpcyBhIHBvc3NpYmx5IGVtcHR5IHNlcmllcyBvZiBleHByZXNzaW9ucyBlbmNsb3NlZCBpblxuc3F1YXJlIGJyYWNrZXRzOlxuXG4gICBsaXN0X2Rpc3BsYXkgICAgICAgIDo6PSAiWyIgW2V4cHJlc3Npb25fbGlzdCB8IGxpc3RfY29tcHJlaGVuc2lvbl0gIl0iXG4gICBsaXN0X2NvbXByZWhlbnNpb24gIDo6PSBleHByZXNzaW9uIGxpc3RfZm9yXG4gICBsaXN0X2ZvciAgICAgICAgICAgIDo6PSAiZm9yIiB0YXJnZXRfbGlzdCAiaW4iIG9sZF9leHByZXNzaW9uX2xpc3QgW2xpc3RfaXRlcl1cbiAgIG9sZF9leHByZXNzaW9uX2xpc3QgOjo9IG9sZF9leHByZXNzaW9uIFsoIiwiIG9sZF9leHByZXNzaW9uKSsgWyIsIl1dXG4gICBvbGRfZXhwcmVzc2lvbiAgICAgIDo6PSBvcl90ZXN0IHwgb2xkX2xhbWJkYV9mb3JtXG4gICBsaXN0X2l0ZXIgICAgICAgICAgIDo6PSBsaXN0X2ZvciB8IGxpc3RfaWZcbiAgIGxpc3RfaWYgICAgICAgICAgICAgOjo9ICJpZiIgb2xkX2V4cHJlc3Npb24gW2xpc3RfaXRlcl1cblxuQSBsaXN0IGRpc3BsYXkgeWllbGRzIGEgbmV3IGxpc3Qgb2JqZWN0LiAgSXRzIGNvbnRlbnRzIGFyZSBzcGVjaWZpZWRcbmJ5IHByb3ZpZGluZyBlaXRoZXIgYSBsaXN0IG9mIGV4cHJlc3Npb25zIG9yIGEgbGlzdCBjb21wcmVoZW5zaW9uLlxuV2hlbiBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGlzIHN1cHBsaWVkLCBpdHMgZWxlbWVudHNcbmFyZSBldmFsdWF0ZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0IGFuZCBwbGFjZWQgaW50byB0aGUgbGlzdCBvYmplY3QgaW5cbnRoYXQgb3JkZXIuICBXaGVuIGEgbGlzdCBjb21wcmVoZW5zaW9uIGlzIHN1cHBsaWVkLCBpdCBjb25zaXN0cyBvZiBhXG5zaW5nbGUgZXhwcmVzc2lvbiBmb2xsb3dlZCBieSBhdCBsZWFzdCBvbmUgYGBmb3JgYCBjbGF1c2UgYW5kIHplcm8gb3Jcbm1vcmUgYGBmb3JgYCBvciBgYGlmYGAgY2xhdXNlcy4gIEluIHRoaXMgY2FzZSwgdGhlIGVsZW1lbnRzIG9mIHRoZSBuZXdcbmxpc3QgYXJlIHRob3NlIHRoYXQgd291bGQgYmUgcHJvZHVjZWQgYnkgY29uc2lkZXJpbmcgZWFjaCBvZiB0aGVcbmBgZm9yYGAgb3IgYGBpZmBgIGNsYXVzZXMgYSBibG9jaywgbmVzdGluZyBmcm9tIGxlZnQgdG8gcmlnaHQsIGFuZFxuZXZhbHVhdGluZyB0aGUgZXhwcmVzc2lvbiB0byBwcm9kdWNlIGEgbGlzdCBlbGVtZW50IGVhY2ggdGltZSB0aGVcbmlubmVybW9zdCBibG9jayBpcyByZWFjaGVkIFsxXS5cbicsCisgJ25hbWluZyc6ICJcbk5hbWluZyBhbmQgYmluZGluZ1xuKioqKioqKioqKioqKioqKioqXG5cbipOYW1lcyogcmVmZXIgdG8gb2JqZWN0cy4gIE5hbWVzIGFyZSBpbnRyb2R1Y2VkIGJ5IG5hbWUgYmluZGluZ1xub3BlcmF0aW9ucy4gRWFjaCBvY2N1cnJlbmNlIG9mIGEgbmFtZSBpbiB0aGUgcHJvZ3JhbSB0ZXh0IHJlZmVycyB0b1xudGhlICpiaW5kaW5nKiBvZiB0aGF0IG5hbWUgZXN0YWJsaXNoZWQgaW4gdGhlIGlubmVybW9zdCBmdW5jdGlvbiBibG9ja1xuY29udGFpbmluZyB0aGUgdXNlLlxuXG5BICpibG9jayogaXMgYSBwaWVjZSBvZiBQeXRob24gcHJvZ3JhbSB0ZXh0IHRoYXQgaXMgZXhlY3V0ZWQgYXMgYVxudW5pdC4gVGhlIGZvbGxvd2luZyBhcmUgYmxvY2tzOiBhIG1vZHVsZSwgYSBmdW5jdGlvbiBib2R5LCBhbmQgYSBjbGFzc1xuZGVmaW5pdGlvbi4gRWFjaCBjb21tYW5kIHR5cGVkIGludGVyYWN0aXZlbHkgaXMgYSBibG9jay4gIEEgc2NyaXB0XG5maWxlIChhIGZpbGUgZ2l2ZW4gYXMgc3RhbmRhcmQgaW5wdXQgdG8gdGhlIGludGVycHJldGVyIG9yIHNwZWNpZmllZFxub24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZSB0aGUgZmlyc3QgYXJndW1lbnQpIGlzIGEgY29kZSBibG9jay5cbkEgc2NyaXB0IGNvbW1hbmQgKGEgY29tbWFuZCBzcGVjaWZpZWQgb24gdGhlIGludGVycHJldGVyIGNvbW1hbmQgbGluZVxud2l0aCB0aGUgJyoqLWMqKicgb3B0aW9uKSBpcyBhIGNvZGUgYmxvY2suICBUaGUgZmlsZSByZWFkIGJ5IHRoZVxuYnVpbHQtaW4gZnVuY3Rpb24gYGBleGVjZmlsZSgpYGAgaXMgYSBjb2RlIGJsb2NrLiAgVGhlIHN0cmluZyBhcmd1bWVudFxucGFzc2VkIHRvIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGV2YWwoKWBgIGFuZCB0byB0aGUgYGBleGVjYGBcbnN0YXRlbWVudCBpcyBhIGNvZGUgYmxvY2suIFRoZSBleHByZXNzaW9uIHJlYWQgYW5kIGV2YWx1YXRlZCBieSB0aGVcbmJ1aWx0LWluIGZ1bmN0aW9uIGBgaW5wdXQoKWBgIGlzIGEgY29kZSBibG9jay5cblxuQSBjb2RlIGJsb2NrIGlzIGV4ZWN1dGVkIGluIGFuICpleGVjdXRpb24gZnJhbWUqLiAgQSBmcmFtZSBjb250YWluc1xuc29tZSBhZG1pbmlzdHJhdGl2ZSBpbmZvcm1hdGlvbiAodXNlZCBmb3IgZGVidWdnaW5nKSBhbmQgZGV0ZXJtaW5lc1xud2hlcmUgYW5kIGhvdyBleGVjdXRpb24gY29udGludWVzIGFmdGVyIHRoZSBjb2RlIGJsb2NrJ3MgZXhlY3V0aW9uIGhhc1xuY29tcGxldGVkLlxuXG5BICpzY29wZSogZGVmaW5lcyB0aGUgdmlzaWJpbGl0eSBvZiBhIG5hbWUgd2l0aGluIGEgYmxvY2suICBJZiBhIGxvY2FsXG52YXJpYWJsZSBpcyBkZWZpbmVkIGluIGEgYmxvY2ssIGl0cyBzY29wZSBpbmNsdWRlcyB0aGF0IGJsb2NrLiAgSWYgdGhlXG5kZWZpbml0aW9uIG9jY3VycyBpbiBhIGZ1bmN0aW9uIGJsb2NrLCB0aGUgc2NvcGUgZXh0ZW5kcyB0byBhbnkgYmxvY2tzXG5jb250YWluZWQgd2l0aGluIHRoZSBkZWZpbmluZyBvbmUsIHVubGVzcyBhIGNvbnRhaW5lZCBibG9jayBpbnRyb2R1Y2VzXG5hIGRpZmZlcmVudCBiaW5kaW5nIGZvciB0aGUgbmFtZS4gIFRoZSBzY29wZSBvZiBuYW1lcyBkZWZpbmVkIGluIGFcbmNsYXNzIGJsb2NrIGlzIGxpbWl0ZWQgdG8gdGhlIGNsYXNzIGJsb2NrOyBpdCBkb2VzIG5vdCBleHRlbmQgdG8gdGhlXG5jb2RlIGJsb2NrcyBvZiBtZXRob2RzIC0tIHRoaXMgaW5jbHVkZXMgZ2VuZXJhdG9yIGV4cHJlc3Npb25zIHNpbmNlXG50aGV5IGFyZSBpbXBsZW1lbnRlZCB1c2luZyBhIGZ1bmN0aW9uIHNjb3BlLiAgVGhpcyBtZWFucyB0aGF0IHRoZVxuZm9sbG93aW5nIHdpbGwgZmFpbDpcblxuICAgY2xhc3MgQTpcbiAgICAgICBhID0gNDJcbiAgICAgICBiID0gbGlzdChhICsgaSBmb3IgaSBpbiByYW5nZSgxMCkpXG5cbldoZW4gYSBuYW1lIGlzIHVzZWQgaW4gYSBjb2RlIGJsb2NrLCBpdCBpcyByZXNvbHZlZCB1c2luZyB0aGUgbmVhcmVzdFxuZW5jbG9zaW5nIHNjb3BlLiAgVGhlIHNldCBvZiBhbGwgc3VjaCBzY29wZXMgdmlzaWJsZSB0byBhIGNvZGUgYmxvY2tcbmlzIGNhbGxlZCB0aGUgYmxvY2sncyAqZW52aXJvbm1lbnQqLlxuXG5JZiBhIG5hbWUgaXMgYm91bmQgaW4gYSBibG9jaywgaXQgaXMgYSBsb2NhbCB2YXJpYWJsZSBvZiB0aGF0IGJsb2NrLlxuSWYgYSBuYW1lIGlzIGJvdW5kIGF0IHRoZSBtb2R1bGUgbGV2ZWwsIGl0IGlzIGEgZ2xvYmFsIHZhcmlhYmxlLiAgKFRoZVxudmFyaWFibGVzIG9mIHRoZSBtb2R1bGUgY29kZSBibG9jayBhcmUgbG9jYWwgYW5kIGdsb2JhbC4pICBJZiBhXG52YXJpYWJsZSBpcyB1c2VkIGluIGEgY29kZSBibG9jayBidXQgbm90IGRlZmluZWQgdGhlcmUsIGl0IGlzIGEgKmZyZWVcbnZhcmlhYmxlKi5cblxuV2hlbiBhIG5hbWUgaXMgbm90IGZvdW5kIGF0IGFsbCwgYSBgYE5hbWVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5JZiB0aGUgbmFtZSByZWZlcnMgdG8gYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGhhcyBub3QgYmVlbiBib3VuZCwgYVxuYGBVbmJvdW5kTG9jYWxFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuICBgYFVuYm91bmRMb2NhbEVycm9yYGAgaXMgYVxuc3ViY2xhc3Mgb2YgYGBOYW1lRXJyb3JgYC5cblxuVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzIGJpbmQgbmFtZXM6IGZvcm1hbCBwYXJhbWV0ZXJzIHRvIGZ1bmN0aW9ucyxcbmBgaW1wb3J0YGAgc3RhdGVtZW50cywgY2xhc3MgYW5kIGZ1bmN0aW9uIGRlZmluaXRpb25zICh0aGVzZSBiaW5kIHRoZVxuY2xhc3Mgb3IgZnVuY3Rpb24gbmFtZSBpbiB0aGUgZGVmaW5pbmcgYmxvY2spLCBhbmQgdGFyZ2V0cyB0aGF0IGFyZVxuaWRlbnRpZmllcnMgaWYgb2NjdXJyaW5nIGluIGFuIGFzc2lnbm1lbnQsIGBgZm9yYGAgbG9vcCBoZWFkZXIsIGluIHRoZVxuc2Vjb25kIHBvc2l0aW9uIG9mIGFuIGBgZXhjZXB0YGAgY2xhdXNlIGhlYWRlciBvciBhZnRlciBgYGFzYGAgaW4gYVxuYGB3aXRoYGAgc3RhdGVtZW50LiAgVGhlIGBgaW1wb3J0YGAgc3RhdGVtZW50IG9mIHRoZSBmb3JtIGBgZnJvbSAuLi5cbmltcG9ydCAqYGAgYmluZHMgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlIGltcG9ydGVkIG1vZHVsZSwgZXhjZXB0XG50aG9zZSBiZWdpbm5pbmcgd2l0aCBhbiB1bmRlcnNjb3JlLiAgVGhpcyBmb3JtIG1heSBvbmx5IGJlIHVzZWQgYXQgdGhlXG5tb2R1bGUgbGV2ZWwuXG5cbkEgdGFyZ2V0IG9jY3VycmluZyBpbiBhIGBgZGVsYGAgc3RhdGVtZW50IGlzIGFsc28gY29uc2lkZXJlZCBib3VuZCBmb3JcbnRoaXMgcHVycG9zZSAodGhvdWdoIHRoZSBhY3R1YWwgc2VtYW50aWNzIGFyZSB0byB1bmJpbmQgdGhlIG5hbWUpLiAgSXRcbmlzIGlsbGVnYWwgdG8gdW5iaW5kIGEgbmFtZSB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYW4gZW5jbG9zaW5nIHNjb3BlO1xudGhlIGNvbXBpbGVyIHdpbGwgcmVwb3J0IGEgYGBTeW50YXhFcnJvcmBgLlxuXG5FYWNoIGFzc2lnbm1lbnQgb3IgaW1wb3J0IHN0YXRlbWVudCBvY2N1cnMgd2l0aGluIGEgYmxvY2sgZGVmaW5lZCBieSBhXG5jbGFzcyBvciBmdW5jdGlvbiBkZWZpbml0aW9uIG9yIGF0IHRoZSBtb2R1bGUgbGV2ZWwgKHRoZSB0b3AtbGV2ZWxcbmNvZGUgYmxvY2spLlxuXG5JZiBhIG5hbWUgYmluZGluZyBvcGVyYXRpb24gb2NjdXJzIGFueXdoZXJlIHdpdGhpbiBhIGNvZGUgYmxvY2ssIGFsbFxudXNlcyBvZiB0aGUgbmFtZSB3aXRoaW4gdGhlIGJsb2NrIGFyZSB0cmVhdGVkIGFzIHJlZmVyZW5jZXMgdG8gdGhlXG5jdXJyZW50IGJsb2NrLiAgVGhpcyBjYW4gbGVhZCB0byBlcnJvcnMgd2hlbiBhIG5hbWUgaXMgdXNlZCB3aXRoaW4gYVxuYmxvY2sgYmVmb3JlIGl0IGlzIGJvdW5kLiBUaGlzIHJ1bGUgaXMgc3VidGxlLiAgUHl0aG9uIGxhY2tzXG5kZWNsYXJhdGlvbnMgYW5kIGFsbG93cyBuYW1lIGJpbmRpbmcgb3BlcmF0aW9ucyB0byBvY2N1ciBhbnl3aGVyZVxud2l0aGluIGEgY29kZSBibG9jay4gIFRoZSBsb2NhbCB2YXJpYWJsZXMgb2YgYSBjb2RlIGJsb2NrIGNhbiBiZVxuZGV0ZXJtaW5lZCBieSBzY2FubmluZyB0aGUgZW50aXJlIHRleHQgb2YgdGhlIGJsb2NrIGZvciBuYW1lIGJpbmRpbmdcbm9wZXJhdGlvbnMuXG5cbklmIHRoZSBnbG9iYWwgc3RhdGVtZW50IG9jY3VycyB3aXRoaW4gYSBibG9jaywgYWxsIHVzZXMgb2YgdGhlIG5hbWVcbnNwZWNpZmllZCBpbiB0aGUgc3RhdGVtZW50IHJlZmVyIHRvIHRoZSBiaW5kaW5nIG9mIHRoYXQgbmFtZSBpbiB0aGVcbnRvcC1sZXZlbCBuYW1lc3BhY2UuIE5hbWVzIGFyZSByZXNvbHZlZCBpbiB0aGUgdG9wLWxldmVsIG5hbWVzcGFjZSBieVxuc2VhcmNoaW5nIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCBpLmUuIHRoZSBuYW1lc3BhY2Ugb2YgdGhlIG1vZHVsZVxuY29udGFpbmluZyB0aGUgY29kZSBibG9jaywgYW5kIHRoZSBidWlsdGlucyBuYW1lc3BhY2UsIHRoZSBuYW1lc3BhY2Vcbm9mIHRoZSBtb2R1bGUgYGBfX2J1aWx0aW5fX2BgLiAgVGhlIGdsb2JhbCBuYW1lc3BhY2UgaXMgc2VhcmNoZWRcbmZpcnN0LiAgSWYgdGhlIG5hbWUgaXMgbm90IGZvdW5kIHRoZXJlLCB0aGUgYnVpbHRpbnMgbmFtZXNwYWNlIGlzXG5zZWFyY2hlZC4gIFRoZSBnbG9iYWwgc3RhdGVtZW50IG11c3QgcHJlY2VkZSBhbGwgdXNlcyBvZiB0aGUgbmFtZS5cblxuVGhlIGJ1aWx0aW5zIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhlIGV4ZWN1dGlvbiBvZiBhIGNvZGUgYmxvY2tcbmlzIGFjdHVhbGx5IGZvdW5kIGJ5IGxvb2tpbmcgdXAgdGhlIG5hbWUgYGBfX2J1aWx0aW5zX19gYCBpbiBpdHNcbmdsb2JhbCBuYW1lc3BhY2U7IHRoaXMgc2hvdWxkIGJlIGEgZGljdGlvbmFyeSBvciBhIG1vZHVsZSAoaW4gdGhlXG5sYXR0ZXIgY2FzZSB0aGUgbW9kdWxlJ3MgZGljdGlvbmFyeSBpcyB1c2VkKS4gIEJ5IGRlZmF1bHQsIHdoZW4gaW4gdGhlXG5gYF9fbWFpbl9fYGAgbW9kdWxlLCBgYF9fYnVpbHRpbnNfX2BgIGlzIHRoZSBidWlsdC1pbiBtb2R1bGVcbmBgX19idWlsdGluX19gYCAobm90ZTogbm8gJ3MnKTsgd2hlbiBpbiBhbnkgb3RoZXIgbW9kdWxlLFxuYGBfX2J1aWx0aW5zX19gYCBpcyBhbiBhbGlhcyBmb3IgdGhlIGRpY3Rpb25hcnkgb2YgdGhlIGBgX19idWlsdGluX19gYFxubW9kdWxlIGl0c2VsZi4gIGBgX19idWlsdGluc19fYGAgY2FuIGJlIHNldCB0byBhIHVzZXItY3JlYXRlZFxuZGljdGlvbmFyeSB0byBjcmVhdGUgYSB3ZWFrIGZvcm0gb2YgcmVzdHJpY3RlZCBleGVjdXRpb24uXG5cbioqQ1B5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWw6KiogVXNlcnMgc2hvdWxkIG5vdCB0b3VjaFxuYGBfX2J1aWx0aW5zX19gYDsgaXQgaXMgc3RyaWN0bHkgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnNcbndhbnRpbmcgdG8gb3ZlcnJpZGUgdmFsdWVzIGluIHRoZSBidWlsdGlucyBuYW1lc3BhY2Ugc2hvdWxkIGBgaW1wb3J0YGBcbnRoZSBgYF9fYnVpbHRpbl9fYGAgKG5vICdzJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXNcbmFwcHJvcHJpYXRlbHkuXG5cblRoZSBuYW1lc3BhY2UgZm9yIGEgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSBhXG5tb2R1bGUgaXMgaW1wb3J0ZWQuICBUaGUgbWFpbiBtb2R1bGUgZm9yIGEgc2NyaXB0IGlzIGFsd2F5cyBjYWxsZWRcbmBgX19tYWluX19gYC5cblxuVGhlIGBgZ2xvYmFsYGAgc3RhdGVtZW50IGhhcyB0aGUgc2FtZSBzY29wZSBhcyBhIG5hbWUgYmluZGluZ1xub3BlcmF0aW9uIGluIHRoZSBzYW1lIGJsb2NrLiAgSWYgdGhlIG5lYXJlc3QgZW5jbG9zaW5nIHNjb3BlIGZvciBhXG5mcmVlIHZhcmlhYmxlIGNvbnRhaW5zIGEgZ2xvYmFsIHN0YXRlbWVudCwgdGhlIGZyZWUgdmFyaWFibGUgaXNcbnRyZWF0ZWQgYXMgYSBnbG9iYWwuXG5cbkEgY2xhc3MgZGVmaW5pdGlvbiBpcyBhbiBleGVjdXRhYmxlIHN0YXRlbWVudCB0aGF0IG1heSB1c2UgYW5kIGRlZmluZVxubmFtZXMuIFRoZXNlIHJlZmVyZW5jZXMgZm9sbG93IHRoZSBub3JtYWwgcnVsZXMgZm9yIG5hbWUgcmVzb2x1dGlvbi5cblRoZSBuYW1lc3BhY2Ugb2YgdGhlIGNsYXNzIGRlZmluaXRpb24gYmVjb21lcyB0aGUgYXR0cmlidXRlIGRpY3Rpb25hcnlcbm9mIHRoZSBjbGFzcy4gIE5hbWVzIGRlZmluZWQgYXQgdGhlIGNsYXNzIHNjb3BlIGFyZSBub3QgdmlzaWJsZSBpblxubWV0aG9kcy5cblxuXG5JbnRlcmFjdGlvbiB3aXRoIGR5bmFtaWMgZmVhdHVyZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5UaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB3aGVyZSBQeXRob24gc3RhdGVtZW50cyBhcmUgaWxsZWdhbCB3aGVuIHVzZWRcbmluIGNvbmp1bmN0aW9uIHdpdGggbmVzdGVkIHNjb3BlcyB0aGF0IGNvbnRhaW4gZnJlZSB2YXJpYWJsZXMuXG5cbklmIGEgdmFyaWFibGUgaXMgcmVmZXJlbmNlZCBpbiBhbiBlbmNsb3Npbmcgc2NvcGUsIGl0IGlzIGlsbGVnYWwgdG9cbmRlbGV0ZSB0aGUgbmFtZS4gIEFuIGVycm9yIHdpbGwgYmUgcmVwb3J0ZWQgYXQgY29tcGlsZSB0aW1lLlxuXG5JZiB0aGUgd2lsZCBjYXJkIGZvcm0gb2YgaW1wb3J0IC0tLSBgYGltcG9ydCAqYGAgLS0tIGlzIHVzZWQgaW4gYVxuZnVuY3Rpb24gYW5kIHRoZSBmdW5jdGlvbiBjb250YWlucyBvciBpcyBhIG5lc3RlZCBibG9jayB3aXRoIGZyZWVcbnZhcmlhYmxlcywgdGhlIGNvbXBpbGVyIHdpbGwgcmFpc2UgYSBgYFN5bnRheEVycm9yYGAuXG5cbklmIGBgZXhlY2BgIGlzIHVzZWQgaW4gYSBmdW5jdGlvbiBhbmQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9yIGlzIGFcbm5lc3RlZCBibG9jayB3aXRoIGZyZWUgdmFyaWFibGVzLCB0aGUgY29tcGlsZXIgd2lsbCByYWlzZSBhXG5gYFN5bnRheEVycm9yYGAgdW5sZXNzIHRoZSBleGVjIGV4cGxpY2l0bHkgc3BlY2lmaWVzIHRoZSBsb2NhbFxubmFtZXNwYWNlIGZvciB0aGUgYGBleGVjYGAuICAoSW4gb3RoZXIgd29yZHMsIGBgZXhlYyBvYmpgYCB3b3VsZCBiZVxuaWxsZWdhbCwgYnV0IGBgZXhlYyBvYmogaW4gbnNgYCB3b3VsZCBiZSBsZWdhbC4pXG5cblRoZSBgYGV2YWwoKWBgLCBgYGV4ZWNmaWxlKClgYCwgYW5kIGBgaW5wdXQoKWBgIGZ1bmN0aW9ucyBhbmQgdGhlXG5gYGV4ZWNgYCBzdGF0ZW1lbnQgZG8gbm90IGhhdmUgYWNjZXNzIHRvIHRoZSBmdWxsIGVudmlyb25tZW50IGZvclxucmVzb2x2aW5nIG5hbWVzLiAgTmFtZXMgbWF5IGJlIHJlc29sdmVkIGluIHRoZSBsb2NhbCBhbmQgZ2xvYmFsXG5uYW1lc3BhY2VzIG9mIHRoZSBjYWxsZXIuICBGcmVlIHZhcmlhYmxlcyBhcmUgbm90IHJlc29sdmVkIGluIHRoZVxubmVhcmVzdCBlbmNsb3NpbmcgbmFtZXNwYWNlLCBidXQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UuIFsxXSBUaGVcbmBgZXhlY2BgIHN0YXRlbWVudCBhbmQgdGhlIGBgZXZhbCgpYGAgYW5kIGBgZXhlY2ZpbGUoKWBgIGZ1bmN0aW9uc1xuaGF2ZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gb3ZlcnJpZGUgdGhlIGdsb2JhbCBhbmQgbG9jYWwgbmFtZXNwYWNlLlxuSWYgb25seSBvbmUgbmFtZXNwYWNlIGlzIHNwZWNpZmllZCwgaXQgaXMgdXNlZCBmb3IgYm90aC5cbiIsCisgJ251bWJlcnMnOiAiXG5OdW1lcmljIGxpdGVyYWxzXG4qKioqKioqKioqKioqKioqXG5cblRoZXJlIGFyZSBmb3VyIHR5cGVzIG9mIG51bWVyaWMgbGl0ZXJhbHM6IHBsYWluIGludGVnZXJzLCBsb25nXG5pbnRlZ2VycywgZmxvYXRpbmcgcG9pbnQgbnVtYmVycywgYW5kIGltYWdpbmFyeSBudW1iZXJzLiAgVGhlcmUgYXJlIG5vXG5jb21wbGV4IGxpdGVyYWxzIChjb21wbGV4IG51bWJlcnMgY2FuIGJlIGZvcm1lZCBieSBhZGRpbmcgYSByZWFsXG5udW1iZXIgYW5kIGFuIGltYWdpbmFyeSBudW1iZXIpLlxuXG5Ob3RlIHRoYXQgbnVtZXJpYyBsaXRlcmFscyBkbyBub3QgaW5jbHVkZSBhIHNpZ247IGEgcGhyYXNlIGxpa2UgYGAtMWBgXG5pcyBhY3R1YWxseSBhbiBleHByZXNzaW9uIGNvbXBvc2VkIG9mIHRoZSB1bmFyeSBvcGVyYXRvciAnYGAtYGAnIGFuZFxudGhlIGxpdGVyYWwgYGAxYGAuXG4iLAorICdudW1lcmljLXR5cGVzJzogJ1xuRW11bGF0aW5nIG51bWVyaWMgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBlbXVsYXRlIG51bWVyaWMgb2JqZWN0cy5cbk1ldGhvZHMgY29ycmVzcG9uZGluZyB0byBvcGVyYXRpb25zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlXG5wYXJ0aWN1bGFyIGtpbmQgb2YgbnVtYmVyIGltcGxlbWVudGVkIChlLmcuLCBiaXR3aXNlIG9wZXJhdGlvbnMgZm9yXG5ub24taW50ZWdyYWwgbnVtYmVycykgc2hvdWxkIGJlIGxlZnQgdW5kZWZpbmVkLlxuXG5vYmplY3QuX19hZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3N1Yl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19mbG9vcmRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19kaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Bvd19fKHNlbGYsIG90aGVyWywgbW9kdWxvXSlcbm9iamVjdC5fX2xzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19hbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3hvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKGBgK2BgLCBgYC1gYCwgYGAqYGAsIGBgLy9gYCwgYGAlYGAsIGBgZGl2bW9kKClgYCxcbiAgIGBgcG93KClgYCwgYGAqKmBgLCBgYDw8YGAsIGBgPj5gYCwgYGAmYGAsIGBgXmBgLCBgYHxgYCkuICBGb3JcbiAgIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBgYHggKyB5YGAsIHdoZXJlICp4KiBpcyBhblxuICAgaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiBgYF9fYWRkX18oKWBgIG1ldGhvZCxcbiAgIGBgeC5fX2FkZF9fKHkpYGAgaXMgY2FsbGVkLiAgVGhlIGBgX19kaXZtb2RfXygpYGAgbWV0aG9kIHNob3VsZCBiZVxuICAgdGhlIGVxdWl2YWxlbnQgdG8gdXNpbmcgYGBfX2Zsb29yZGl2X18oKWBgIGFuZCBgYF9fbW9kX18oKWBgOyBpdFxuICAgc2hvdWxkIG5vdCBiZSByZWxhdGVkIHRvIGBgX190cnVlZGl2X18oKWBgIChkZXNjcmliZWQgYmVsb3cpLiAgTm90ZVxuICAgdGhhdCBgYF9fcG93X18oKWBgIHNob3VsZCBiZSBkZWZpbmVkIHRvIGFjY2VwdCBhbiBvcHRpb25hbCB0aGlyZFxuICAgYXJndW1lbnQgaWYgdGhlIHRlcm5hcnkgdmVyc2lvbiBvZiB0aGUgYnVpbHQtaW4gYGBwb3coKWBgIGZ1bmN0aW9uXG4gICBpcyB0byBiZSBzdXBwb3J0ZWQuXG5cbiAgIElmIG9uZSBvZiB0aG9zZSBtZXRob2RzIGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiB3aXRoIHRoZVxuICAgc3VwcGxpZWQgYXJndW1lbnRzLCBpdCBzaG91bGQgcmV0dXJuIGBgTm90SW1wbGVtZW50ZWRgYC5cblxub2JqZWN0Ll9fZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX190cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZSBkaXZpc2lvbiBvcGVyYXRvciAoYGAvYGApIGlzIGltcGxlbWVudGVkIGJ5IHRoZXNlIG1ldGhvZHMuICBUaGVcbiAgIGBgX190cnVlZGl2X18oKWBgIG1ldGhvZCBpcyB1c2VkIHdoZW4gYGBfX2Z1dHVyZV9fLmRpdmlzaW9uYGAgaXMgaW5cbiAgIGVmZmVjdCwgb3RoZXJ3aXNlIGBgX19kaXZfXygpYGAgaXMgdXNlZC4gIElmIG9ubHkgb25lIG9mIHRoZXNlIHR3b1xuICAgbWV0aG9kcyBpcyBkZWZpbmVkLCB0aGUgb2JqZWN0IHdpbGwgbm90IHN1cHBvcnQgZGl2aXNpb24gaW4gdGhlXG4gICBhbHRlcm5hdGUgY29udGV4dDsgYGBUeXBlRXJyb3JgYCB3aWxsIGJlIHJhaXNlZCBpbnN0ZWFkLlxuXG5vYmplY3QuX19yYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcmZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZGl2bW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycG93X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ybHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ycnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yeG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5IGFyaXRobWV0aWNcbiAgIG9wZXJhdGlvbnMgKGBgK2BgLCBgYC1gYCwgYGAqYGAsIGBgL2BgLCBgYCVgYCwgYGBkaXZtb2QoKWBgLFxuICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKSB3aXRoXG4gICByZWZsZWN0ZWQgKHN3YXBwZWQpIG9wZXJhbmRzLiAgVGhlc2UgZnVuY3Rpb25zIGFyZSBvbmx5IGNhbGxlZCBpZlxuICAgdGhlIGxlZnQgb3BlcmFuZCBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhdGlvbiBhbmRcbiAgIHRoZSBvcGVyYW5kcyBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLiBbMl0gRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZVxuICAgdGhlIGV4cHJlc3Npb24gYGB4IC0geWBgLCB3aGVyZSAqeSogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0XG4gICBoYXMgYW4gYGBfX3JzdWJfXygpYGAgbWV0aG9kLCBgYHkuX19yc3ViX18oeClgYCBpcyBjYWxsZWQgaWZcbiAgIGBgeC5fX3N1Yl9fKHkpYGAgcmV0dXJucyAqTm90SW1wbGVtZW50ZWQqLlxuXG4gICBOb3RlIHRoYXQgdGVybmFyeSBgYHBvdygpYGAgd2lsbCBub3QgdHJ5IGNhbGxpbmcgYGBfX3Jwb3dfXygpYGBcbiAgICh0aGUgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbyBjb21wbGljYXRlZCkuXG5cbiAgIE5vdGU6IElmIHRoZSByaWdodCBvcGVyYW5kXCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kXCdzXG4gICAgIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2QgZm9yIHRoZVxuICAgICBvcGVyYXRpb24sIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGJlZm9yZSB0aGUgbGVmdCBvcGVyYW5kXCdzXG4gICAgIG5vbi1yZWZsZWN0ZWQgbWV0aG9kLiAgVGhpcyBiZWhhdmlvciBhbGxvd3Mgc3ViY2xhc3NlcyB0b1xuICAgICBvdmVycmlkZSB0aGVpciBhbmNlc3RvcnNcJyBvcGVyYXRpb25zLlxuXG5vYmplY3QuX19pYWRkX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbXVsX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pdHJ1ZWRpdl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pbW9kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9faWxzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXJzaGlmdF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faWFuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faXhvcl9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9faW9yX18oc2VsZiwgb3RoZXIpXG5cbiAgIFRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGF1Z21lbnRlZCBhcml0aG1ldGljXG4gICBhc3NpZ25tZW50cyAoYGArPWBgLCBgYC09YGAsIGBgKj1gYCwgYGAvPWBgLCBgYC8vPWBgLCBgYCU9YGAsXG4gICBgYCoqPWBgLCBgYDw8PWBgLCBgYD4+PWBgLCBgYCY9YGAsIGBgXj1gYCwgYGB8PWBgKS4gIFRoZXNlIG1ldGhvZHNcbiAgIHNob3VsZCBhdHRlbXB0IHRvIGRvIHRoZSBvcGVyYXRpb24gaW4tcGxhY2UgKG1vZGlmeWluZyAqc2VsZiopIGFuZFxuICAgcmV0dXJuIHRoZSByZXN1bHQgKHdoaWNoIGNvdWxkIGJlLCBidXQgZG9lcyBub3QgaGF2ZSB0byBiZSxcbiAgICpzZWxmKikuICBJZiBhIHNwZWNpZmljIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgdGhlIGF1Z21lbnRlZFxuICAgYXNzaWdubWVudCBmYWxscyBiYWNrIHRvIHRoZSBub3JtYWwgbWV0aG9kcy4gIEZvciBpbnN0YW5jZSwgdG9cbiAgIGV4ZWN1dGUgdGhlIHN0YXRlbWVudCBgYHggKz0geWBgLCB3aGVyZSAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYVxuICAgY2xhc3MgdGhhdCBoYXMgYW4gYGBfX2lhZGRfXygpYGAgbWV0aG9kLCBgYHguX19pYWRkX18oeSlgYCBpc1xuICAgY2FsbGVkLiAgSWYgKngqIGlzIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBkb2VzIG5vdCBkZWZpbmUgYVxuICAgYGBfX2lhZGRfXygpYGAgbWV0aG9kLCBgYHguX19hZGRfXyh5KWBgIGFuZCBgYHkuX19yYWRkX18oeClgYCBhcmVcbiAgIGNvbnNpZGVyZWQsIGFzIHdpdGggdGhlIGV2YWx1YXRpb24gb2YgYGB4ICsgeWBgLlxuXG5vYmplY3QuX19uZWdfXyhzZWxmKVxub2JqZWN0Ll9fcG9zX18oc2VsZilcbm9iamVjdC5fX2Fic19fKHNlbGYpXG5vYmplY3QuX19pbnZlcnRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSB1bmFyeSBhcml0aG1ldGljIG9wZXJhdGlvbnMgKGBgLWBgLCBgYCtgYCxcbiAgIGBgYWJzKClgYCBhbmQgYGB+YGApLlxuXG5vYmplY3QuX19jb21wbGV4X18oc2VsZilcbm9iamVjdC5fX2ludF9fKHNlbGYpXG5vYmplY3QuX19sb25nX18oc2VsZilcbm9iamVjdC5fX2Zsb2F0X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25zIGBgY29tcGxleCgpYGAsXG4gICBgYGludCgpYGAsIGBgbG9uZygpYGAsIGFuZCBgYGZsb2F0KClgYC4gIFNob3VsZCByZXR1cm4gYSB2YWx1ZSBvZlxuICAgdGhlIGFwcHJvcHJpYXRlIHR5cGUuXG5cbm9iamVjdC5fX29jdF9fKHNlbGYpXG5vYmplY3QuX19oZXhfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBvY3QoKWBgIGFuZCBgYGhleCgpYGAuXG4gICBTaG91bGQgcmV0dXJuIGEgc3RyaW5nIHZhbHVlLlxuXG5vYmplY3QuX19pbmRleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYGBvcGVyYXRvci5pbmRleCgpYGAuICBBbHNvIGNhbGxlZCB3aGVuZXZlclxuICAgUHl0aG9uIG5lZWRzIGFuIGludGVnZXIgb2JqZWN0IChzdWNoIGFzIGluIHNsaWNpbmcpLiAgTXVzdCByZXR1cm5cbiAgIGFuIGludGVnZXIgKGludCBvciBsb25nKS5cblxuICAgTmV3IGluIHZlcnNpb24gMi41LlxuXG5vYmplY3QuX19jb2VyY2VfXyhzZWxmLCBvdGhlcilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCAibWl4ZWQtbW9kZSIgbnVtZXJpYyBhcml0aG1ldGljLiAgU2hvdWxkIGVpdGhlclxuICAgcmV0dXJuIGEgMi10dXBsZSBjb250YWluaW5nICpzZWxmKiBhbmQgKm90aGVyKiBjb252ZXJ0ZWQgdG8gYVxuICAgY29tbW9uIG51bWVyaWMgdHlwZSwgb3IgYGBOb25lYGAgaWYgY29udmVyc2lvbiBpcyBpbXBvc3NpYmxlLiAgV2hlblxuICAgdGhlIGNvbW1vbiB0eXBlIHdvdWxkIGJlIHRoZSB0eXBlIG9mIGBgb3RoZXJgYCwgaXQgaXMgc3VmZmljaWVudCB0b1xuICAgcmV0dXJuIGBgTm9uZWBgLCBzaW5jZSB0aGUgaW50ZXJwcmV0ZXIgd2lsbCBhbHNvIGFzayB0aGUgb3RoZXJcbiAgIG9iamVjdCB0byBhdHRlbXB0IGEgY29lcmNpb24gKGJ1dCBzb21ldGltZXMsIGlmIHRoZSBpbXBsZW1lbnRhdGlvblxuICAgb2YgdGhlIG90aGVyIHR5cGUgY2Fubm90IGJlIGNoYW5nZWQsIGl0IGlzIHVzZWZ1bCB0byBkbyB0aGVcbiAgIGNvbnZlcnNpb24gdG8gdGhlIG90aGVyIHR5cGUgaGVyZSkuICBBIHJldHVybiB2YWx1ZSBvZlxuICAgYGBOb3RJbXBsZW1lbnRlZGBgIGlzIGVxdWl2YWxlbnQgdG8gcmV0dXJuaW5nIGBgTm9uZWBgLlxuJywKKyAnb2JqZWN0cyc6ICdcbk9iamVjdHMsIHZhbHVlcyBhbmQgdHlwZXNcbioqKioqKioqKioqKioqKioqKioqKioqKipcblxuKk9iamVjdHMqIGFyZSBQeXRob25cJ3MgYWJzdHJhY3Rpb24gZm9yIGRhdGEuICBBbGwgZGF0YSBpbiBhIFB5dGhvblxucHJvZ3JhbSBpcyByZXByZXNlbnRlZCBieSBvYmplY3RzIG9yIGJ5IHJlbGF0aW9ucyBiZXR3ZWVuIG9iamVjdHMuIChJblxuYSBzZW5zZSwgYW5kIGluIGNvbmZvcm1hbmNlIHRvIFZvbiBOZXVtYW5uXCdzIG1vZGVsIG9mIGEgInN0b3JlZFxucHJvZ3JhbSBjb21wdXRlciwiIGNvZGUgaXMgYWxzbyByZXByZXNlbnRlZCBieSBvYmplY3RzLilcblxuRXZlcnkgb2JqZWN0IGhhcyBhbiBpZGVudGl0eSwgYSB0eXBlIGFuZCBhIHZhbHVlLiAgQW4gb2JqZWN0XCdzXG4qaWRlbnRpdHkqIG5ldmVyIGNoYW5nZXMgb25jZSBpdCBoYXMgYmVlbiBjcmVhdGVkOyB5b3UgbWF5IHRoaW5rIG9mIGl0XG5hcyB0aGUgb2JqZWN0XCdzIGFkZHJlc3MgaW4gbWVtb3J5LiAgVGhlIFwnYGBpc2BgXCcgb3BlcmF0b3IgY29tcGFyZXMgdGhlXG5pZGVudGl0eSBvZiB0d28gb2JqZWN0czsgdGhlIGBgaWQoKWBgIGZ1bmN0aW9uIHJldHVybnMgYW4gaW50ZWdlclxucmVwcmVzZW50aW5nIGl0cyBpZGVudGl0eSAoY3VycmVudGx5IGltcGxlbWVudGVkIGFzIGl0cyBhZGRyZXNzKS4gQW5cbm9iamVjdFwncyAqdHlwZSogaXMgYWxzbyB1bmNoYW5nZWFibGUuIFsxXSBBbiBvYmplY3RcJ3MgdHlwZSBkZXRlcm1pbmVzXG50aGUgb3BlcmF0aW9ucyB0aGF0IHRoZSBvYmplY3Qgc3VwcG9ydHMgKGUuZy4sICJkb2VzIGl0IGhhdmUgYVxubGVuZ3RoPyIpIGFuZCBhbHNvIGRlZmluZXMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3Igb2JqZWN0cyBvZiB0aGF0XG50eXBlLiAgVGhlIGBgdHlwZSgpYGAgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3RcJ3MgdHlwZSAod2hpY2ggaXMgYW5cbm9iamVjdCBpdHNlbGYpLiAgVGhlICp2YWx1ZSogb2Ygc29tZSBvYmplY3RzIGNhbiBjaGFuZ2UuICBPYmplY3RzXG53aG9zZSB2YWx1ZSBjYW4gY2hhbmdlIGFyZSBzYWlkIHRvIGJlICptdXRhYmxlKjsgb2JqZWN0cyB3aG9zZSB2YWx1ZVxuaXMgdW5jaGFuZ2VhYmxlIG9uY2UgdGhleSBhcmUgY3JlYXRlZCBhcmUgY2FsbGVkICppbW11dGFibGUqLiAoVGhlXG52YWx1ZSBvZiBhbiBpbW11dGFibGUgY29udGFpbmVyIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGFcbm11dGFibGUgb2JqZWN0IGNhbiBjaGFuZ2Ugd2hlbiB0aGUgbGF0dGVyXCdzIHZhbHVlIGlzIGNoYW5nZWQ7IGhvd2V2ZXJcbnRoZSBjb250YWluZXIgaXMgc3RpbGwgY29uc2lkZXJlZCBpbW11dGFibGUsIGJlY2F1c2UgdGhlIGNvbGxlY3Rpb24gb2Zcbm9iamVjdHMgaXQgY29udGFpbnMgY2Fubm90IGJlIGNoYW5nZWQuICBTbywgaW1tdXRhYmlsaXR5IGlzIG5vdFxuc3RyaWN0bHkgdGhlIHNhbWUgYXMgaGF2aW5nIGFuIHVuY2hhbmdlYWJsZSB2YWx1ZSwgaXQgaXMgbW9yZSBzdWJ0bGUuKVxuQW4gb2JqZWN0XCdzIG11dGFiaWxpdHkgaXMgZGV0ZXJtaW5lZCBieSBpdHMgdHlwZTsgZm9yIGluc3RhbmNlLFxubnVtYmVycywgc3RyaW5ncyBhbmQgdHVwbGVzIGFyZSBpbW11dGFibGUsIHdoaWxlIGRpY3Rpb25hcmllcyBhbmRcbmxpc3RzIGFyZSBtdXRhYmxlLlxuXG5PYmplY3RzIGFyZSBuZXZlciBleHBsaWNpdGx5IGRlc3Ryb3llZDsgaG93ZXZlciwgd2hlbiB0aGV5IGJlY29tZVxudW5yZWFjaGFibGUgdGhleSBtYXkgYmUgZ2FyYmFnZS1jb2xsZWN0ZWQuICBBbiBpbXBsZW1lbnRhdGlvbiBpc1xuYWxsb3dlZCB0byBwb3N0cG9uZSBnYXJiYWdlIGNvbGxlY3Rpb24gb3Igb21pdCBpdCBhbHRvZ2V0aGVyIC0tLSBpdCBpc1xuYSBtYXR0ZXIgb2YgaW1wbGVtZW50YXRpb24gcXVhbGl0eSBob3cgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzXG5pbXBsZW1lbnRlZCwgYXMgbG9uZyBhcyBubyBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgdGhhdCBhcmUgc3RpbGxcbnJlYWNoYWJsZS5cblxuKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBDUHl0aG9uIGN1cnJlbnRseSB1c2VzIGEgcmVmZXJlbmNlLVxuY291bnRpbmcgc2NoZW1lIHdpdGggKG9wdGlvbmFsKSBkZWxheWVkIGRldGVjdGlvbiBvZiBjeWNsaWNhbGx5IGxpbmtlZFxuZ2FyYmFnZSwgd2hpY2ggY29sbGVjdHMgbW9zdCBvYmplY3RzIGFzIHNvb24gYXMgdGhleSBiZWNvbWVcbnVucmVhY2hhYmxlLCBidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gY29sbGVjdCBnYXJiYWdlIGNvbnRhaW5pbmdcbmNpcmN1bGFyIHJlZmVyZW5jZXMuICBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIGBgZ2NgYCBtb2R1bGUgZm9yXG5pbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZyB0aGUgY29sbGVjdGlvbiBvZiBjeWNsaWMgZ2FyYmFnZS4gT3RoZXJcbmltcGxlbWVudGF0aW9ucyBhY3QgZGlmZmVyZW50bHkgYW5kIENQeXRob24gbWF5IGNoYW5nZS4gRG8gbm90IGRlcGVuZFxub24gaW1tZWRpYXRlIGZpbmFsaXphdGlvbiBvZiBvYmplY3RzIHdoZW4gdGhleSBiZWNvbWUgdW5yZWFjaGFibGUgKGV4OlxuYWx3YXlzIGNsb3NlIGZpbGVzKS5cblxuTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhlIGltcGxlbWVudGF0aW9uXCdzIHRyYWNpbmcgb3IgZGVidWdnaW5nXG5mYWNpbGl0aWVzIG1heSBrZWVwIG9iamVjdHMgYWxpdmUgdGhhdCB3b3VsZCBub3JtYWxseSBiZSBjb2xsZWN0YWJsZS5cbkFsc28gbm90ZSB0aGF0IGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgXCdgYHRyeWBgLi4uYGBleGNlcHRgYFwnXG5zdGF0ZW1lbnQgbWF5IGtlZXAgb2JqZWN0cyBhbGl2ZS5cblxuU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byAiZXh0ZXJuYWwiIHJlc291cmNlcyBzdWNoIGFzIG9wZW5cbmZpbGVzIG9yIHdpbmRvd3MuICBJdCBpcyB1bmRlcnN0b29kIHRoYXQgdGhlc2UgcmVzb3VyY2VzIGFyZSBmcmVlZFxud2hlbiB0aGUgb2JqZWN0IGlzIGdhcmJhZ2UtY29sbGVjdGVkLCBidXQgc2luY2UgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzXG5ub3QgZ3VhcmFudGVlZCB0byBoYXBwZW4sIHN1Y2ggb2JqZWN0cyBhbHNvIHByb3ZpZGUgYW4gZXhwbGljaXQgd2F5IHRvXG5yZWxlYXNlIHRoZSBleHRlcm5hbCByZXNvdXJjZSwgdXN1YWxseSBhIGBgY2xvc2UoKWBgIG1ldGhvZC4gUHJvZ3JhbXNcbmFyZSBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBleHBsaWNpdGx5IGNsb3NlIHN1Y2ggb2JqZWN0cy4gIFRoZVxuXCdgYHRyeWBgLi4uYGBmaW5hbGx5YGBcJyBzdGF0ZW1lbnQgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBkb1xudGhpcy5cblxuU29tZSBvYmplY3RzIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzOyB0aGVzZSBhcmUgY2FsbGVkXG4qY29udGFpbmVycyouIEV4YW1wbGVzIG9mIGNvbnRhaW5lcnMgYXJlIHR1cGxlcywgbGlzdHMgYW5kXG5kaWN0aW9uYXJpZXMuICBUaGUgcmVmZXJlbmNlcyBhcmUgcGFydCBvZiBhIGNvbnRhaW5lclwncyB2YWx1ZS4gIEluXG5tb3N0IGNhc2VzLCB3aGVuIHdlIHRhbGsgYWJvdXQgdGhlIHZhbHVlIG9mIGEgY29udGFpbmVyLCB3ZSBpbXBseSB0aGVcbnZhbHVlcywgbm90IHRoZSBpZGVudGl0aWVzIG9mIHRoZSBjb250YWluZWQgb2JqZWN0czsgaG93ZXZlciwgd2hlbiB3ZVxudGFsayBhYm91dCB0aGUgbXV0YWJpbGl0eSBvZiBhIGNvbnRhaW5lciwgb25seSB0aGUgaWRlbnRpdGllcyBvZiB0aGVcbmltbWVkaWF0ZWx5IGNvbnRhaW5lZCBvYmplY3RzIGFyZSBpbXBsaWVkLiAgU28sIGlmIGFuIGltbXV0YWJsZVxuY29udGFpbmVyIChsaWtlIGEgdHVwbGUpIGNvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgbXV0YWJsZSBvYmplY3QsIGl0c1xudmFsdWUgY2hhbmdlcyBpZiB0aGF0IG11dGFibGUgb2JqZWN0IGlzIGNoYW5nZWQuXG5cblR5cGVzIGFmZmVjdCBhbG1vc3QgYWxsIGFzcGVjdHMgb2Ygb2JqZWN0IGJlaGF2aW9yLiAgRXZlbiB0aGVcbmltcG9ydGFuY2Ugb2Ygb2JqZWN0IGlkZW50aXR5IGlzIGFmZmVjdGVkIGluIHNvbWUgc2Vuc2U6IGZvciBpbW11dGFibGVcbnR5cGVzLCBvcGVyYXRpb25zIHRoYXQgY29tcHV0ZSBuZXcgdmFsdWVzIG1heSBhY3R1YWxseSByZXR1cm4gYVxucmVmZXJlbmNlIHRvIGFueSBleGlzdGluZyBvYmplY3Qgd2l0aCB0aGUgc2FtZSB0eXBlIGFuZCB2YWx1ZSwgd2hpbGVcbmZvciBtdXRhYmxlIG9iamVjdHMgdGhpcyBpcyBub3QgYWxsb3dlZC4gIEUuZy4sIGFmdGVyIGBgYSA9IDE7IGIgPVxuMWBgLCBgYGFgYCBhbmQgYGBiYGAgbWF5IG9yIG1heSBub3QgcmVmZXIgdG8gdGhlIHNhbWUgb2JqZWN0IHdpdGggdGhlXG52YWx1ZSBvbmUsIGRlcGVuZGluZyBvbiB0aGUgaW1wbGVtZW50YXRpb24sIGJ1dCBhZnRlciBgYGMgPSBbXTsgZCA9XG5bXWBgLCBgYGNgYCBhbmQgYGBkYGAgYXJlIGd1YXJhbnRlZWQgdG8gcmVmZXIgdG8gdHdvIGRpZmZlcmVudCxcbnVuaXF1ZSwgbmV3bHkgY3JlYXRlZCBlbXB0eSBsaXN0cy4gKE5vdGUgdGhhdCBgYGMgPSBkID0gW11gYCBhc3NpZ25zXG50aGUgc2FtZSBvYmplY3QgdG8gYm90aCBgYGNgYCBhbmQgYGBkYGAuKVxuJywKKyAnb3BlcmF0b3Itc3VtbWFyeSc6ICdcbk9wZXJhdG9yIHByZWNlZGVuY2VcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIGZvbGxvd2luZyB0YWJsZSBzdW1tYXJpemVzIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlcyBpbiBQeXRob24sXG5mcm9tIGxvd2VzdCBwcmVjZWRlbmNlIChsZWFzdCBiaW5kaW5nKSB0byBoaWdoZXN0IHByZWNlZGVuY2UgKG1vc3RcbmJpbmRpbmcpLiBPcGVyYXRvcnMgaW4gdGhlIHNhbWUgYm94IGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZS4gIFVubGVzc1xudGhlIHN5bnRheCBpcyBleHBsaWNpdGx5IGdpdmVuLCBvcGVyYXRvcnMgYXJlIGJpbmFyeS4gIE9wZXJhdG9ycyBpblxudGhlIHNhbWUgYm94IGdyb3VwIGxlZnQgdG8gcmlnaHQgKGV4Y2VwdCBmb3IgY29tcGFyaXNvbnMsIGluY2x1ZGluZ1xudGVzdHMsIHdoaWNoIGFsbCBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UgYW5kIGNoYWluIGZyb20gbGVmdCB0byByaWdodFxuLS0tIHNlZSBzZWN0aW9uICpDb21wYXJpc29ucyogLS0tIGFuZCBleHBvbmVudGlhdGlvbiwgd2hpY2ggZ3JvdXBzXG5mcm9tIHJpZ2h0IHRvIGxlZnQpLlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IE9wZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG58IGBgbGFtYmRhYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGFtYmRhIGV4cHJlc3Npb24gICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgaWZgYCAtLSBgYGVsc2VgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgb3JgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgYW5kYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgbm90YGAgYGB4YGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQm9vbGVhbiBOT1QgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgaW5gYCwgYGBub3QgaW5gYCwgYGBpc2BgLCBgYGlzIG5vdGBgLCBgYDxgYCwgIHwgQ29tcGFyaXNvbnMsIGluY2x1ZGluZyBtZW1iZXJzaGlwICAgICB8XG58IGBgPD1gYCwgYGA+YGAsIGBgPj1gYCwgYGA8PmBgLCBgYCE9YGAsIGBgPT1gYCAgIHwgdGVzdHMgYW5kIGlkZW50aXR5IHRlc3RzICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgfGBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgXmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBYT1IgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgJmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQml0d2lzZSBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgPDxgYCwgYGA+PmBgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2hpZnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgK2BgLCBgYC1gYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgKmBgLCBgYC9gYCwgYGAvL2BgLCBgYCVgYCAgICAgICAgICAgICAgICAgICAgIHwgTXVsdGlwbGljYXRpb24sIGRpdmlzaW9uLCByZW1haW5kZXIgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgWzhdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgK3hgYCwgYGAteGBgLCBgYH54YGAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUG9zaXRpdmUsIG5lZ2F0aXZlLCBiaXR3aXNlIE5PVCAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgKipgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhwb25lbnRpYXRpb24gWzldICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgeFtpbmRleF1gYCwgYGB4W2luZGV4OmluZGV4XWBgLCAgICAgICAgICAgICAgIHwgU3Vic2NyaXB0aW9uLCBzbGljaW5nLCBjYWxsLCAgICAgICAgICB8XG58IGBgeChhcmd1bWVudHMuLi4pYGAsIGBgeC5hdHRyaWJ1dGVgYCAgICAgICAgICAgIHwgYXR0cmlidXRlIHJlZmVyZW5jZSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgKGV4cHJlc3Npb25zLi4uKWBgLCBgYFtleHByZXNzaW9ucy4uLl1gYCwgICAgIHwgQmluZGluZyBvciB0dXBsZSBkaXNwbGF5LCBsaXN0ICAgICAgICB8XG58IGBge2tleTogdmFsdWUuLi59YGAsIGBgYGV4cHJlc3Npb25zLi4uYGBgICAgICAgIHwgZGlzcGxheSwgZGljdGlvbmFyeSBkaXNwbGF5LCBzdHJpbmcgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY29udmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gSW4gUHl0aG9uIDIuMyBhbmQgbGF0ZXIgcmVsZWFzZXMsIGEgbGlzdCBjb21wcmVoZW5zaW9uICJsZWFrcyIgdGhlXG4gICAgY29udHJvbCB2YXJpYWJsZXMgb2YgZWFjaCBgYGZvcmBgIGl0IGNvbnRhaW5zIGludG8gdGhlIGNvbnRhaW5pbmdcbiAgICBzY29wZS4gIEhvd2V2ZXIsIHRoaXMgYmVoYXZpb3IgaXMgZGVwcmVjYXRlZCwgYW5kIHJlbHlpbmcgb24gaXRcbiAgICB3aWxsIG5vdCB3b3JrIGluIFB5dGhvbiAzLlxuXG5bMl0gV2hpbGUgYGBhYnMoeCV5KSA8IGFicyh5KWBgIGlzIHRydWUgbWF0aGVtYXRpY2FsbHksIGZvciBmbG9hdHMgaXRcbiAgICBtYXkgbm90IGJlIHRydWUgbnVtZXJpY2FsbHkgZHVlIHRvIHJvdW5kb2ZmLiAgRm9yIGV4YW1wbGUsIGFuZFxuICAgIGFzc3VtaW5nIGEgcGxhdGZvcm0gb24gd2hpY2ggYSBQeXRob24gZmxvYXQgaXMgYW4gSUVFRSA3NTQgZG91YmxlLVxuICAgIHByZWNpc2lvbiBudW1iZXIsIGluIG9yZGVyIHRoYXQgYGAtMWUtMTAwICUgMWUxMDBgYCBoYXZlIHRoZSBzYW1lXG4gICAgc2lnbiBhcyBgYDFlMTAwYGAsIHRoZSBjb21wdXRlZCByZXN1bHQgaXMgYGAtMWUtMTAwICsgMWUxMDBgYCxcbiAgICB3aGljaCBpcyBudW1lcmljYWxseSBleGFjdGx5IGVxdWFsIHRvIGBgMWUxMDBgYC4gIFRoZSBmdW5jdGlvblxuICAgIGBgbWF0aC5mbW9kKClgYCByZXR1cm5zIGEgcmVzdWx0IHdob3NlIHNpZ24gbWF0Y2hlcyB0aGUgc2lnbiBvZlxuICAgIHRoZSBmaXJzdCBhcmd1bWVudCBpbnN0ZWFkLCBhbmQgc28gcmV0dXJucyBgYC0xZS0xMDBgYCBpbiB0aGlzXG4gICAgY2FzZS4gV2hpY2ggYXBwcm9hY2ggaXMgbW9yZSBhcHByb3ByaWF0ZSBkZXBlbmRzIG9uIHRoZVxuICAgIGFwcGxpY2F0aW9uLlxuXG5bM10gSWYgeCBpcyB2ZXJ5IGNsb3NlIHRvIGFuIGV4YWN0IGludGVnZXIgbXVsdGlwbGUgb2YgeSwgaXRcJ3NcbiAgICBwb3NzaWJsZSBmb3IgYGBmbG9vcih4L3kpYGAgdG8gYmUgb25lIGxhcmdlciB0aGFuIGBgKHgteCV5KS95YGBcbiAgICBkdWUgdG8gcm91bmRpbmcuICBJbiBzdWNoIGNhc2VzLCBQeXRob24gcmV0dXJucyB0aGUgbGF0dGVyIHJlc3VsdCxcbiAgICBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGF0IGBgZGl2bW9kKHgseSlbMF0gKiB5ICsgeCAlIHlgYCBiZSB2ZXJ5XG4gICAgY2xvc2UgdG8gYGB4YGAuXG5cbls0XSBXaGlsZSBjb21wYXJpc29ucyBiZXR3ZWVuIHVuaWNvZGUgc3RyaW5ncyBtYWtlIHNlbnNlIGF0IHRoZSBieXRlXG4gICAgbGV2ZWwsIHRoZXkgbWF5IGJlIGNvdW50ZXItaW50dWl0aXZlIHRvIHVzZXJzLiBGb3IgZXhhbXBsZSwgdGhlXG4gICAgc3RyaW5ncyBgYHUiXFx1MDBDNyJgYCBhbmQgYGB1IlxcdTAwNDNcXHUwMzI3ImBgIGNvbXBhcmUgZGlmZmVyZW50bHksXG4gICAgZXZlbiB0aG91Z2ggdGhleSBib3RoIHJlcHJlc2VudCB0aGUgc2FtZSB1bmljb2RlIGNoYXJhY3RlciAoTEFUSU5cbiAgICBDQVBJVEFMIExFVFRFUiBDIFdJVEggQ0VESUxMQSkuIFRvIGNvbXBhcmUgc3RyaW5ncyBpbiBhIGh1bWFuXG4gICAgcmVjb2duaXphYmxlIHdheSwgY29tcGFyZSB1c2luZyBgYHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgpYGAuXG5cbls1XSBUaGUgaW1wbGVtZW50YXRpb24gY29tcHV0ZXMgdGhpcyBlZmZpY2llbnRseSwgd2l0aG91dCBjb25zdHJ1Y3RpbmdcbiAgICBsaXN0cyBvciBzb3J0aW5nLlxuXG5bNl0gRWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24gdXNlZCBsZXhpY29ncmFwaGljIGNvbXBhcmlzb24gb2YgdGhlXG4gICAgc29ydGVkIChrZXksIHZhbHVlKSBsaXN0cywgYnV0IHRoaXMgd2FzIHZlcnkgZXhwZW5zaXZlIGZvciB0aGVcbiAgICBjb21tb24gY2FzZSBvZiBjb21wYXJpbmcgZm9yIGVxdWFsaXR5LiAgQW4gZXZlbiBlYXJsaWVyIHZlcnNpb24gb2ZcbiAgICBQeXRob24gY29tcGFyZWQgZGljdGlvbmFyaWVzIGJ5IGlkZW50aXR5IG9ubHksIGJ1dCB0aGlzIGNhdXNlZFxuICAgIHN1cnByaXNlcyBiZWNhdXNlIHBlb3BsZSBleHBlY3RlZCB0byBiZSBhYmxlIHRvIHRlc3QgYSBkaWN0aW9uYXJ5XG4gICAgZm9yIGVtcHRpbmVzcyBieSBjb21wYXJpbmcgaXQgdG8gYGB7fWBgLlxuXG5bN10gRHVlIHRvIGF1dG9tYXRpYyBnYXJiYWdlLWNvbGxlY3Rpb24sIGZyZWUgbGlzdHMsIGFuZCB0aGUgZHluYW1pY1xuICAgIG5hdHVyZSBvZiBkZXNjcmlwdG9ycywgeW91IG1heSBub3RpY2Ugc2VlbWluZ2x5IHVudXN1YWwgYmVoYXZpb3VyXG4gICAgaW4gY2VydGFpbiB1c2VzIG9mIHRoZSBgYGlzYGAgb3BlcmF0b3IsIGxpa2UgdGhvc2UgaW52b2x2aW5nXG4gICAgY29tcGFyaXNvbnMgYmV0d2VlbiBpbnN0YW5jZSBtZXRob2RzLCBvciBjb25zdGFudHMuICBDaGVjayB0aGVpclxuICAgIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby5cblxuWzhdIFRoZSBgYCVgYCBvcGVyYXRvciBpcyBhbHNvIHVzZWQgZm9yIHN0cmluZyBmb3JtYXR0aW5nOyB0aGUgc2FtZVxuICAgIHByZWNlZGVuY2UgYXBwbGllcy5cblxuWzldIFRoZSBwb3dlciBvcGVyYXRvciBgYCoqYGAgYmluZHMgbGVzcyB0aWdodGx5IHRoYW4gYW4gYXJpdGhtZXRpYyBvclxuICAgIGJpdHdpc2UgdW5hcnkgb3BlcmF0b3Igb24gaXRzIHJpZ2h0LCB0aGF0IGlzLCBgYDIqKi0xYGAgaXNcbiAgICBgYDAuNWBgLlxuJywKKyAncGFzcyc6ICdcblRoZSBgYHBhc3NgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuICAgcGFzc19zdG10IDo6PSAicGFzcyJcblxuYGBwYXNzYGAgaXMgYSBudWxsIG9wZXJhdGlvbiAtLS0gd2hlbiBpdCBpcyBleGVjdXRlZCwgbm90aGluZyBoYXBwZW5zLlxuSXQgaXMgdXNlZnVsIGFzIGEgcGxhY2Vob2xkZXIgd2hlbiBhIHN0YXRlbWVudCBpcyByZXF1aXJlZFxuc3ludGFjdGljYWxseSwgYnV0IG5vIGNvZGUgbmVlZHMgdG8gYmUgZXhlY3V0ZWQsIGZvciBleGFtcGxlOlxuXG4gICBkZWYgZihhcmcpOiBwYXNzICAgICMgYSBmdW5jdGlvbiB0aGF0IGRvZXMgbm90aGluZyAoeWV0KVxuXG4gICBjbGFzcyBDOiBwYXNzICAgICAgICMgYSBjbGFzcyB3aXRoIG5vIG1ldGhvZHMgKHlldClcbicsCisgJ3Bvd2VyJzogJ1xuVGhlIHBvd2VyIG9wZXJhdG9yXG4qKioqKioqKioqKioqKioqKipcblxuVGhlIHBvd2VyIG9wZXJhdG9yIGJpbmRzIG1vcmUgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHNcbmxlZnQ7IGl0IGJpbmRzIGxlc3MgdGlnaHRseSB0aGFuIHVuYXJ5IG9wZXJhdG9ycyBvbiBpdHMgcmlnaHQuICBUaGVcbnN5bnRheCBpczpcblxuICAgcG93ZXIgOjo9IHByaW1hcnkgWyIqKiIgdV9leHByXVxuXG5UaHVzLCBpbiBhbiB1bnBhcmVudGhlc2l6ZWQgc2VxdWVuY2Ugb2YgcG93ZXIgYW5kIHVuYXJ5IG9wZXJhdG9ycywgdGhlXG5vcGVyYXRvcnMgYXJlIGV2YWx1YXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQgKHRoaXMgZG9lcyBub3QgY29uc3RyYWluXG50aGUgZXZhbHVhdGlvbiBvcmRlciBmb3IgdGhlIG9wZXJhbmRzKTogYGAtMSoqMmBgIHJlc3VsdHMgaW4gYGAtMWBgLlxuXG5UaGUgcG93ZXIgb3BlcmF0b3IgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUgYnVpbHQtaW4gYGBwb3coKWBgXG5mdW5jdGlvbiwgd2hlbiBjYWxsZWQgd2l0aCB0d28gYXJndW1lbnRzOiBpdCB5aWVsZHMgaXRzIGxlZnQgYXJndW1lbnRcbnJhaXNlZCB0byB0aGUgcG93ZXIgb2YgaXRzIHJpZ2h0IGFyZ3VtZW50LiAgVGhlIG51bWVyaWMgYXJndW1lbnRzIGFyZVxuZmlyc3QgY29udmVydGVkIHRvIGEgY29tbW9uIHR5cGUuICBUaGUgcmVzdWx0IHR5cGUgaXMgdGhhdCBvZiB0aGVcbmFyZ3VtZW50cyBhZnRlciBjb2VyY2lvbi5cblxuV2l0aCBtaXhlZCBvcGVyYW5kIHR5cGVzLCB0aGUgY29lcmNpb24gcnVsZXMgZm9yIGJpbmFyeSBhcml0aG1ldGljXG5vcGVyYXRvcnMgYXBwbHkuIEZvciBpbnQgYW5kIGxvbmcgaW50IG9wZXJhbmRzLCB0aGUgcmVzdWx0IGhhcyB0aGVcbnNhbWUgdHlwZSBhcyB0aGUgb3BlcmFuZHMgKGFmdGVyIGNvZXJjaW9uKSB1bmxlc3MgdGhlIHNlY29uZCBhcmd1bWVudFxuaXMgbmVnYXRpdmU7IGluIHRoYXQgY2FzZSwgYWxsIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHRvIGZsb2F0IGFuZCBhXG5mbG9hdCByZXN1bHQgaXMgZGVsaXZlcmVkLiBGb3IgZXhhbXBsZSwgYGAxMCoqMmBgIHJldHVybnMgYGAxMDBgYCwgYnV0XG5gYDEwKiotMmBgIHJldHVybnMgYGAwLjAxYGAuIChUaGlzIGxhc3QgZmVhdHVyZSB3YXMgYWRkZWQgaW4gUHl0aG9uXG4yLjIuIEluIFB5dGhvbiAyLjEgYW5kIGJlZm9yZSwgaWYgYm90aCBhcmd1bWVudHMgd2VyZSBvZiBpbnRlZ2VyIHR5cGVzXG5hbmQgdGhlIHNlY29uZCBhcmd1bWVudCB3YXMgbmVnYXRpdmUsIGFuIGV4Y2VwdGlvbiB3YXMgcmFpc2VkKS5cblxuUmFpc2luZyBgYDAuMGBgIHRvIGEgbmVnYXRpdmUgcG93ZXIgcmVzdWx0cyBpbiBhXG5gYFplcm9EaXZpc2lvbkVycm9yYGAuIFJhaXNpbmcgYSBuZWdhdGl2ZSBudW1iZXIgdG8gYSBmcmFjdGlvbmFsIHBvd2VyXG5yZXN1bHRzIGluIGEgYGBWYWx1ZUVycm9yYGAuXG4nLAorICdyYWlzZSc6ICdcblRoZSBgYHJhaXNlYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICByYWlzZV9zdG10IDo6PSAicmFpc2UiIFtleHByZXNzaW9uIFsiLCIgZXhwcmVzc2lvbiBbIiwiIGV4cHJlc3Npb25dXV1cblxuSWYgbm8gZXhwcmVzc2lvbnMgYXJlIHByZXNlbnQsIGBgcmFpc2VgYCByZS1yYWlzZXMgdGhlIGxhc3QgZXhjZXB0aW9uXG50aGF0IHdhcyBhY3RpdmUgaW4gdGhlIGN1cnJlbnQgc2NvcGUuICBJZiBubyBleGNlcHRpb24gaXMgYWN0aXZlIGluXG50aGUgY3VycmVudCBzY29wZSwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQgaW5kaWNhdGluZyB0aGF0XG50aGlzIGlzIGFuIGVycm9yIChpZiBydW5uaW5nIHVuZGVyIElETEUsIGEgYGBRdWV1ZS5FbXB0eWBgIGV4Y2VwdGlvblxuaXMgcmFpc2VkIGluc3RlYWQpLlxuXG5PdGhlcndpc2UsIGBgcmFpc2VgYCBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb25zIHRvIGdldCB0aHJlZSBvYmplY3RzLFxudXNpbmcgYGBOb25lYGAgYXMgdGhlIHZhbHVlIG9mIG9taXR0ZWQgZXhwcmVzc2lvbnMuICBUaGUgZmlyc3QgdHdvXG5vYmplY3RzIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgKnR5cGUqIGFuZCAqdmFsdWUqIG9mIHRoZSBleGNlcHRpb24uXG5cbklmIHRoZSBmaXJzdCBvYmplY3QgaXMgYW4gaW5zdGFuY2UsIHRoZSB0eXBlIG9mIHRoZSBleGNlcHRpb24gaXMgdGhlXG5jbGFzcyBvZiB0aGUgaW5zdGFuY2UsIHRoZSBpbnN0YW5jZSBpdHNlbGYgaXMgdGhlIHZhbHVlLCBhbmQgdGhlXG5zZWNvbmQgb2JqZWN0IG11c3QgYmUgYGBOb25lYGAuXG5cbklmIHRoZSBmaXJzdCBvYmplY3QgaXMgYSBjbGFzcywgaXQgYmVjb21lcyB0aGUgdHlwZSBvZiB0aGUgZXhjZXB0aW9uLlxuVGhlIHNlY29uZCBvYmplY3QgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGV4Y2VwdGlvbiB2YWx1ZTogSWYgaXQgaXNcbmFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcywgdGhlIGluc3RhbmNlIGJlY29tZXMgdGhlIGV4Y2VwdGlvbiB2YWx1ZS4gSWZcbnRoZSBzZWNvbmQgb2JqZWN0IGlzIGEgdHVwbGUsIGl0IGlzIHVzZWQgYXMgdGhlIGFyZ3VtZW50IGxpc3QgZm9yIHRoZVxuY2xhc3MgY29uc3RydWN0b3I7IGlmIGl0IGlzIGBgTm9uZWBgLCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0IGlzIHVzZWQsXG5hbmQgYW55IG90aGVyIG9iamVjdCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIGFyZ3VtZW50IHRvIHRoZVxuY29uc3RydWN0b3IuICBUaGUgaW5zdGFuY2Ugc28gY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBjb25zdHJ1Y3RvciBpc1xudXNlZCBhcyB0aGUgZXhjZXB0aW9uIHZhbHVlLlxuXG5JZiBhIHRoaXJkIG9iamVjdCBpcyBwcmVzZW50IGFuZCBub3QgYGBOb25lYGAsIGl0IG11c3QgYmUgYSB0cmFjZWJhY2tcbm9iamVjdCAoc2VlIHNlY3Rpb24gKlRoZSBzdGFuZGFyZCB0eXBlIGhpZXJhcmNoeSopLCBhbmQgaXQgaXNcbnN1YnN0aXR1dGVkIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgbG9jYXRpb24gYXMgdGhlIHBsYWNlIHdoZXJlIHRoZVxuZXhjZXB0aW9uIG9jY3VycmVkLiAgSWYgdGhlIHRoaXJkIG9iamVjdCBpcyBwcmVzZW50IGFuZCBub3QgYVxudHJhY2ViYWNrIG9iamVjdCBvciBgYE5vbmVgYCwgYSBgYFR5cGVFcnJvcmBgIGV4Y2VwdGlvbiBpcyByYWlzZWQuXG5UaGUgdGhyZWUtZXhwcmVzc2lvbiBmb3JtIG9mIGBgcmFpc2VgYCBpcyB1c2VmdWwgdG8gcmUtcmFpc2UgYW5cbmV4Y2VwdGlvbiB0cmFuc3BhcmVudGx5IGluIGFuIGV4Y2VwdCBjbGF1c2UsIGJ1dCBgYHJhaXNlYGAgd2l0aCBub1xuZXhwcmVzc2lvbnMgc2hvdWxkIGJlIHByZWZlcnJlZCBpZiB0aGUgZXhjZXB0aW9uIHRvIGJlIHJlLXJhaXNlZCB3YXNcbnRoZSBtb3N0IHJlY2VudGx5IGFjdGl2ZSBleGNlcHRpb24gaW4gdGhlIGN1cnJlbnQgc2NvcGUuXG5cbkFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZXhjZXB0aW9ucyBjYW4gYmUgZm91bmQgaW4gc2VjdGlvblxuKkV4Y2VwdGlvbnMqLCBhbmQgaW5mb3JtYXRpb24gYWJvdXQgaGFuZGxpbmcgZXhjZXB0aW9ucyBpcyBpbiBzZWN0aW9uXG4qVGhlIHRyeSBzdGF0ZW1lbnQqLlxuJywKKyAncmV0dXJuJzogJ1xuVGhlIGBgcmV0dXJuYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKipcblxuICAgcmV0dXJuX3N0bXQgOjo9ICJyZXR1cm4iIFtleHByZXNzaW9uX2xpc3RdXG5cbmBgcmV0dXJuYGAgbWF5IG9ubHkgb2NjdXIgc3ludGFjdGljYWxseSBuZXN0ZWQgaW4gYSBmdW5jdGlvblxuZGVmaW5pdGlvbiwgbm90IHdpdGhpbiBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uLlxuXG5JZiBhbiBleHByZXNzaW9uIGxpc3QgaXMgcHJlc2VudCwgaXQgaXMgZXZhbHVhdGVkLCBlbHNlIGBgTm9uZWBgIGlzXG5zdWJzdGl0dXRlZC5cblxuYGByZXR1cm5gYCBsZWF2ZXMgdGhlIGN1cnJlbnQgZnVuY3Rpb24gY2FsbCB3aXRoIHRoZSBleHByZXNzaW9uIGxpc3RcbihvciBgYE5vbmVgYCkgYXMgcmV0dXJuIHZhbHVlLlxuXG5XaGVuIGBgcmV0dXJuYGAgcGFzc2VzIGNvbnRyb2wgb3V0IG9mIGEgYGB0cnlgYCBzdGF0ZW1lbnQgd2l0aCBhXG5gYGZpbmFsbHlgYCBjbGF1c2UsIHRoYXQgYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGJlZm9yZSByZWFsbHlcbmxlYXZpbmcgdGhlIGZ1bmN0aW9uLlxuXG5JbiBhIGdlbmVyYXRvciBmdW5jdGlvbiwgdGhlIGBgcmV0dXJuYGAgc3RhdGVtZW50IGlzIG5vdCBhbGxvd2VkIHRvXG5pbmNsdWRlIGFuIGBgZXhwcmVzc2lvbl9saXN0YGAuICBJbiB0aGF0IGNvbnRleHQsIGEgYmFyZSBgYHJldHVybmBgXG5pbmRpY2F0ZXMgdGhhdCB0aGUgZ2VuZXJhdG9yIGlzIGRvbmUgYW5kIHdpbGwgY2F1c2UgYGBTdG9wSXRlcmF0aW9uYGBcbnRvIGJlIHJhaXNlZC5cbicsCisgJ3NlcXVlbmNlLXR5cGVzJzogIlxuRW11bGF0aW5nIGNvbnRhaW5lciB0eXBlc1xuKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgZm9sbG93aW5nIG1ldGhvZHMgY2FuIGJlIGRlZmluZWQgdG8gaW1wbGVtZW50IGNvbnRhaW5lciBvYmplY3RzLlxuQ29udGFpbmVycyB1c3VhbGx5IGFyZSBzZXF1ZW5jZXMgKHN1Y2ggYXMgbGlzdHMgb3IgdHVwbGVzKSBvciBtYXBwaW5nc1xuKGxpa2UgZGljdGlvbmFyaWVzKSwgYnV0IGNhbiByZXByZXNlbnQgb3RoZXIgY29udGFpbmVycyBhcyB3ZWxsLiAgVGhlXG5maXJzdCBzZXQgb2YgbWV0aG9kcyBpcyB1c2VkIGVpdGhlciB0byBlbXVsYXRlIGEgc2VxdWVuY2Ugb3IgdG9cbmVtdWxhdGUgYSBtYXBwaW5nOyB0aGUgZGlmZmVyZW5jZSBpcyB0aGF0IGZvciBhIHNlcXVlbmNlLCB0aGVcbmFsbG93YWJsZSBrZXlzIHNob3VsZCBiZSB0aGUgaW50ZWdlcnMgKmsqIGZvciB3aGljaCBgYDAgPD0gayA8IE5gYFxud2hlcmUgKk4qIGlzIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlLCBvciBzbGljZSBvYmplY3RzLCB3aGljaFxuZGVmaW5lIGEgcmFuZ2Ugb2YgaXRlbXMuIChGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHRoZSBtZXRob2RcbmBgX19nZXRzbGljZV9fKClgYCAoc2VlIGJlbG93KSBjYW4gYWxzbyBiZSBkZWZpbmVkIHRvIGhhbmRsZSBzaW1wbGUsXG5idXQgbm90IGV4dGVuZGVkIHNsaWNlcy4pIEl0IGlzIGFsc28gcmVjb21tZW5kZWQgdGhhdCBtYXBwaW5ncyBwcm92aWRlXG50aGUgbWV0aG9kcyBgYGtleXMoKWBgLCBgYHZhbHVlcygpYGAsIGBgaXRlbXMoKWBgLCBgYGhhc19rZXkoKWBgLFxuYGBnZXQoKWBgLCBgYGNsZWFyKClgYCwgYGBzZXRkZWZhdWx0KClgYCwgYGBpdGVya2V5cygpYGAsXG5gYGl0ZXJ2YWx1ZXMoKWBgLCBgYGl0ZXJpdGVtcygpYGAsIGBgcG9wKClgYCwgYGBwb3BpdGVtKClgYCxcbmBgY29weSgpYGAsIGFuZCBgYHVwZGF0ZSgpYGAgYmVoYXZpbmcgc2ltaWxhciB0byB0aG9zZSBmb3IgUHl0aG9uJ3NcbnN0YW5kYXJkIGRpY3Rpb25hcnkgb2JqZWN0cy4gIFRoZSBgYFVzZXJEaWN0YGAgbW9kdWxlIHByb3ZpZGVzIGFcbmBgRGljdE1peGluYGAgY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2ZcbmBgX19nZXRpdGVtX18oKWBgLCBgYF9fc2V0aXRlbV9fKClgYCwgYGBfX2RlbGl0ZW1fXygpYGAsIGFuZFxuYGBrZXlzKClgYC4gTXV0YWJsZSBzZXF1ZW5jZXMgc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyBgYGFwcGVuZCgpYGAsXG5gYGNvdW50KClgYCwgYGBpbmRleCgpYGAsIGBgZXh0ZW5kKClgYCwgYGBpbnNlcnQoKWBgLCBgYHBvcCgpYGAsXG5gYHJlbW92ZSgpYGAsIGBgcmV2ZXJzZSgpYGAgYW5kIGBgc29ydCgpYGAsIGxpa2UgUHl0aG9uIHN0YW5kYXJkIGxpc3Rcbm9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50IGFkZGl0aW9uIChtZWFuaW5nXG5jb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmcgcmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlXG5tZXRob2RzIGBgX19hZGRfXygpYGAsIGBgX19yYWRkX18oKWBgLCBgYF9faWFkZF9fKClgYCwgYGBfX211bF9fKClgYCxcbmBgX19ybXVsX18oKWBgIGFuZCBgYF9faW11bF9fKClgYCBkZXNjcmliZWQgYmVsb3c7IHRoZXkgc2hvdWxkIG5vdFxuZGVmaW5lIGBgX19jb2VyY2VfXygpYGAgb3Igb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG5gYF9fY29udGFpbnNfXygpYGAgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCB1c2Ugb2YgdGhlIGBgaW5gYFxub3BlcmF0b3I7IGZvciBtYXBwaW5ncywgYGBpbmBgIHNob3VsZCBiZSBlcXVpdmFsZW50IG9mIGBgaGFzX2tleSgpYGA7XG5mb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXJcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbmBgX19pdGVyX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlXG5jb250YWluZXI7IGZvciBtYXBwaW5ncywgYGBfX2l0ZXJfXygpYGAgc2hvdWxkIGJlIHRoZSBzYW1lIGFzXG5gYGl0ZXJrZXlzKClgYDsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsdWVzLlxuXG5vYmplY3QuX19sZW5fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAuICBTaG91bGQgcmV0dXJuXG4gICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgYGA+PWBgIDAuICBBbHNvLCBhbiBvYmplY3RcbiAgIHRoYXQgZG9lc24ndCBkZWZpbmUgYSBgYF9fbm9uemVyb19fKClgYCBtZXRob2QgYW5kIHdob3NlXG4gICBgYF9fbGVuX18oKWBgIG1ldGhvZCByZXR1cm5zIHplcm8gaXMgY29uc2lkZXJlZCB0byBiZSBmYWxzZSBpbiBhXG4gICBCb29sZWFuIGNvbnRleHQuXG5cbm9iamVjdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZXZhbHVhdGlvbiBvZiBgYHNlbGZba2V5XWBgLiBGb3Igc2VxdWVuY2VcbiAgIHR5cGVzLCB0aGUgYWNjZXB0ZWQga2V5cyBzaG91bGQgYmUgaW50ZWdlcnMgYW5kIHNsaWNlIG9iamVjdHMuXG4gICBOb3RlIHRoYXQgdGhlIHNwZWNpYWwgaW50ZXJwcmV0YXRpb24gb2YgbmVnYXRpdmUgaW5kZXhlcyAoaWYgdGhlXG4gICBjbGFzcyB3aXNoZXMgdG8gZW11bGF0ZSBhIHNlcXVlbmNlIHR5cGUpIGlzIHVwIHRvIHRoZVxuICAgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiBJZiAqa2V5KiBpcyBvZiBhbiBpbmFwcHJvcHJpYXRlIHR5cGUsXG4gICBgYFR5cGVFcnJvcmBgIG1heSBiZSByYWlzZWQ7IGlmIG9mIGEgdmFsdWUgb3V0c2lkZSB0aGUgc2V0IG9mXG4gICBpbmRleGVzIGZvciB0aGUgc2VxdWVuY2UgKGFmdGVyIGFueSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mXG4gICBuZWdhdGl2ZSB2YWx1ZXMpLCBgYEluZGV4RXJyb3JgYCBzaG91bGQgYmUgcmFpc2VkLiBGb3IgbWFwcGluZ1xuICAgdHlwZXMsIGlmICprZXkqIGlzIG1pc3NpbmcgKG5vdCBpbiB0aGUgY29udGFpbmVyKSwgYGBLZXlFcnJvcmBgXG4gICBzaG91bGQgYmUgcmFpc2VkLlxuXG4gICBOb3RlOiBgYGZvcmBgIGxvb3BzIGV4cGVjdCB0aGF0IGFuIGBgSW5kZXhFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGZvclxuICAgICBpbGxlZ2FsIGluZGV4ZXMgdG8gYWxsb3cgcHJvcGVyIGRldGVjdGlvbiBvZiB0aGUgZW5kIG9mIHRoZVxuICAgICBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYXNzaWdubWVudCB0byBgYHNlbGZba2V5XWBgLiAgU2FtZSBub3RlIGFzIGZvclxuICAgYGBfX2dldGl0ZW1fXygpYGAuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCBjaGFuZ2VzIHRvIHRoZSB2YWx1ZXMgZm9yIGtleXMsIG9yIGlmIG5ldyBrZXlzXG4gICBjYW4gYmUgYWRkZWQsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHMgY2FuIGJlIHJlcGxhY2VkLiAgVGhlXG4gICBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvclxuICAgdGhlIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC5cblxub2JqZWN0Ll9fZGVsaXRlbV9fKHNlbGYsIGtleSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiBgYHNlbGZba2V5XWBgLiAgU2FtZSBub3RlIGFzIGZvclxuICAgYGBfX2dldGl0ZW1fXygpYGAuICBUaGlzIHNob3VsZCBvbmx5IGJlIGltcGxlbWVudGVkIGZvciBtYXBwaW5ncyBpZlxuICAgdGhlIG9iamVjdHMgc3VwcG9ydCByZW1vdmFsIG9mIGtleXMsIG9yIGZvciBzZXF1ZW5jZXMgaWYgZWxlbWVudHNcbiAgIGNhbiBiZSByZW1vdmVkIGZyb20gdGhlIHNlcXVlbmNlLiAgVGhlIHNhbWUgZXhjZXB0aW9ucyBzaG91bGQgYmVcbiAgIHJhaXNlZCBmb3IgaW1wcm9wZXIgKmtleSogdmFsdWVzIGFzIGZvciB0aGUgYGBfX2dldGl0ZW1fXygpYGBcbiAgIG1ldGhvZC5cblxub2JqZWN0Ll9faXRlcl9fKHNlbGYpXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIGl0ZXJhdG9yIGlzIHJlcXVpcmVkIGZvciBhIGNvbnRhaW5lci5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXQgY2FuIGl0ZXJhdGVcbiAgIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIuICBGb3IgbWFwcGluZ3MsIGl0IHNob3VsZFxuICAgaXRlcmF0ZSBvdmVyIHRoZSBrZXlzIG9mIHRoZSBjb250YWluZXIsIGFuZCBzaG91bGQgYWxzbyBiZSBtYWRlXG4gICBhdmFpbGFibGUgYXMgdGhlIG1ldGhvZCBgYGl0ZXJrZXlzKClgYC5cblxuICAgSXRlcmF0b3Igb2JqZWN0cyBhbHNvIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kOyB0aGV5IGFyZVxuICAgcmVxdWlyZWQgdG8gcmV0dXJuIHRoZW1zZWx2ZXMuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBpdGVyYXRvclxuICAgb2JqZWN0cywgc2VlICpJdGVyYXRvciBUeXBlcyouXG5cbm9iamVjdC5fX3JldmVyc2VkX18oc2VsZilcblxuICAgQ2FsbGVkIChpZiBwcmVzZW50KSBieSB0aGUgYGByZXZlcnNlZCgpYGAgYnVpbHQtaW4gdG8gaW1wbGVtZW50XG4gICByZXZlcnNlIGl0ZXJhdGlvbi4gIEl0IHNob3VsZCByZXR1cm4gYSBuZXcgaXRlcmF0b3Igb2JqZWN0IHRoYXRcbiAgIGl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBvYmplY3RzIGluIHRoZSBjb250YWluZXIgaW4gcmV2ZXJzZSBvcmRlci5cblxuICAgSWYgdGhlIGBgX19yZXZlcnNlZF9fKClgYCBtZXRob2QgaXMgbm90IHByb3ZpZGVkLCB0aGVcbiAgIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHRoZSBzZXF1ZW5jZVxuICAgcHJvdG9jb2wgKGBgX19sZW5fXygpYGAgYW5kIGBgX19nZXRpdGVtX18oKWBgKS4gIE9iamVjdHMgdGhhdFxuICAgc3VwcG9ydCB0aGUgc2VxdWVuY2UgcHJvdG9jb2wgc2hvdWxkIG9ubHkgcHJvdmlkZVxuICAgYGBfX3JldmVyc2VkX18oKWBgIGlmIHRoZXkgY2FuIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gdGhhdCBpc1xuICAgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgb25lIHByb3ZpZGVkIGJ5IGBgcmV2ZXJzZWQoKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjYuXG5cblRoZSBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzIChgYGluYGAgYW5kIGBgbm90IGluYGApIGFyZSBub3JtYWxseVxuaW1wbGVtZW50ZWQgYXMgYW4gaXRlcmF0aW9uIHRocm91Z2ggYSBzZXF1ZW5jZS4gIEhvd2V2ZXIsIGNvbnRhaW5lclxub2JqZWN0cyBjYW4gc3VwcGx5IHRoZSBmb2xsb3dpbmcgc3BlY2lhbCBtZXRob2Qgd2l0aCBhIG1vcmUgZWZmaWNpZW50XG5pbXBsZW1lbnRhdGlvbiwgd2hpY2ggYWxzbyBkb2VzIG5vdCByZXF1aXJlIHRoZSBvYmplY3QgYmUgYSBzZXF1ZW5jZS5cblxub2JqZWN0Ll9fY29udGFpbnNfXyhzZWxmLCBpdGVtKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IG1lbWJlcnNoaXAgdGVzdCBvcGVyYXRvcnMuICBTaG91bGQgcmV0dXJuIHRydWVcbiAgIGlmICppdGVtKiBpcyBpbiAqc2VsZiosIGZhbHNlIG90aGVyd2lzZS4gIEZvciBtYXBwaW5nIG9iamVjdHMsIHRoaXNcbiAgIHNob3VsZCBjb25zaWRlciB0aGUga2V5cyBvZiB0aGUgbWFwcGluZyByYXRoZXIgdGhhbiB0aGUgdmFsdWVzIG9yXG4gICB0aGUga2V5LWl0ZW0gcGFpcnMuXG5cbiAgIEZvciBvYmplY3RzIHRoYXQgZG9uJ3QgZGVmaW5lIGBgX19jb250YWluc19fKClgYCwgdGhlIG1lbWJlcnNoaXBcbiAgIHRlc3QgZmlyc3QgdHJpZXMgaXRlcmF0aW9uIHZpYSBgYF9faXRlcl9fKClgYCwgdGhlbiB0aGUgb2xkXG4gICBzZXF1ZW5jZSBpdGVyYXRpb24gcHJvdG9jb2wgdmlhIGBgX19nZXRpdGVtX18oKWBgLCBzZWUgKnRoaXNcbiAgIHNlY3Rpb24gaW4gdGhlIGxhbmd1YWdlIHJlZmVyZW5jZSouXG4iLAorICdzaGlmdGluZyc6ICdcblNoaWZ0aW5nIG9wZXJhdGlvbnNcbioqKioqKioqKioqKioqKioqKipcblxuVGhlIHNoaWZ0aW5nIG9wZXJhdGlvbnMgaGF2ZSBsb3dlciBwcmlvcml0eSB0aGFuIHRoZSBhcml0aG1ldGljXG5vcGVyYXRpb25zOlxuXG4gICBzaGlmdF9leHByIDo6PSBhX2V4cHIgfCBzaGlmdF9leHByICggIjw8IiB8ICI+PiIgKSBhX2V4cHJcblxuVGhlc2Ugb3BlcmF0b3JzIGFjY2VwdCBwbGFpbiBvciBsb25nIGludGVnZXJzIGFzIGFyZ3VtZW50cy4gIFRoZVxuYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIFRoZXkgc2hpZnQgdGhlIGZpcnN0XG5hcmd1bWVudCB0byB0aGUgbGVmdCBvciByaWdodCBieSB0aGUgbnVtYmVyIG9mIGJpdHMgZ2l2ZW4gYnkgdGhlXG5zZWNvbmQgYXJndW1lbnQuXG5cbkEgcmlnaHQgc2hpZnQgYnkgKm4qIGJpdHMgaXMgZGVmaW5lZCBhcyBkaXZpc2lvbiBieSBgYHBvdygyLCBuKWBgLiAgQVxubGVmdCBzaGlmdCBieSAqbiogYml0cyBpcyBkZWZpbmVkIGFzIG11bHRpcGxpY2F0aW9uIHdpdGggYGBwb3coMixcbm4pYGAuICBOZWdhdGl2ZSBzaGlmdCBjb3VudHMgcmFpc2UgYSBgYFZhbHVlRXJyb3JgYCBleGNlcHRpb24uXG5cbk5vdGU6IEluIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uLCB0aGUgcmlnaHQtaGFuZCBvcGVyYW5kIGlzIHJlcXVpcmVkIHRvXG4gIGJlIGF0IG1vc3QgYGBzeXMubWF4c2l6ZWBgLiAgSWYgdGhlIHJpZ2h0LWhhbmQgb3BlcmFuZCBpcyBsYXJnZXJcbiAgdGhhbiBgYHN5cy5tYXhzaXplYGAgYW4gYGBPdmVyZmxvd0Vycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicsCisgJ3NsaWNpbmdzJzogJ1xuU2xpY2luZ3NcbioqKioqKioqXG5cbkEgc2xpY2luZyBzZWxlY3RzIGEgcmFuZ2Ugb2YgaXRlbXMgaW4gYSBzZXF1ZW5jZSBvYmplY3QgKGUuZy4sIGFcbnN0cmluZywgdHVwbGUgb3IgbGlzdCkuICBTbGljaW5ncyBtYXkgYmUgdXNlZCBhcyBleHByZXNzaW9ucyBvciBhc1xudGFyZ2V0cyBpbiBhc3NpZ25tZW50IG9yIGBgZGVsYGAgc3RhdGVtZW50cy4gIFRoZSBzeW50YXggZm9yIGFcbnNsaWNpbmc6XG5cbiAgIHNsaWNpbmcgICAgICAgICAgOjo9IHNpbXBsZV9zbGljaW5nIHwgZXh0ZW5kZWRfc2xpY2luZ1xuICAgc2ltcGxlX3NsaWNpbmcgICA6Oj0gcHJpbWFyeSAiWyIgc2hvcnRfc2xpY2UgIl0iXG4gICBleHRlbmRlZF9zbGljaW5nIDo6PSBwcmltYXJ5ICJbIiBzbGljZV9saXN0ICJdIlxuICAgc2xpY2VfbGlzdCAgICAgICA6Oj0gc2xpY2VfaXRlbSAoIiwiIHNsaWNlX2l0ZW0pKiBbIiwiXVxuICAgc2xpY2VfaXRlbSAgICAgICA6Oj0gZXhwcmVzc2lvbiB8IHByb3Blcl9zbGljZSB8IGVsbGlwc2lzXG4gICBwcm9wZXJfc2xpY2UgICAgIDo6PSBzaG9ydF9zbGljZSB8IGxvbmdfc2xpY2VcbiAgIHNob3J0X3NsaWNlICAgICAgOjo9IFtsb3dlcl9ib3VuZF0gIjoiIFt1cHBlcl9ib3VuZF1cbiAgIGxvbmdfc2xpY2UgICAgICAgOjo9IHNob3J0X3NsaWNlICI6IiBbc3RyaWRlXVxuICAgbG93ZXJfYm91bmQgICAgICA6Oj0gZXhwcmVzc2lvblxuICAgdXBwZXJfYm91bmQgICAgICA6Oj0gZXhwcmVzc2lvblxuICAgc3RyaWRlICAgICAgICAgICA6Oj0gZXhwcmVzc2lvblxuICAgZWxsaXBzaXMgICAgICAgICA6Oj0gIi4uLiJcblxuVGhlcmUgaXMgYW1iaWd1aXR5IGluIHRoZSBmb3JtYWwgc3ludGF4IGhlcmU6IGFueXRoaW5nIHRoYXQgbG9va3MgbGlrZVxuYW4gZXhwcmVzc2lvbiBsaXN0IGFsc28gbG9va3MgbGlrZSBhIHNsaWNlIGxpc3QsIHNvIGFueSBzdWJzY3JpcHRpb25cbmNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHNsaWNpbmcuICBSYXRoZXIgdGhhbiBmdXJ0aGVyIGNvbXBsaWNhdGluZyB0aGVcbnN5bnRheCwgdGhpcyBpcyBkaXNhbWJpZ3VhdGVkIGJ5IGRlZmluaW5nIHRoYXQgaW4gdGhpcyBjYXNlIHRoZVxuaW50ZXJwcmV0YXRpb24gYXMgYSBzdWJzY3JpcHRpb24gdGFrZXMgcHJpb3JpdHkgb3ZlciB0aGVcbmludGVycHJldGF0aW9uIGFzIGEgc2xpY2luZyAodGhpcyBpcyB0aGUgY2FzZSBpZiB0aGUgc2xpY2UgbGlzdFxuY29udGFpbnMgbm8gcHJvcGVyIHNsaWNlIG5vciBlbGxpcHNlcykuICBTaW1pbGFybHksIHdoZW4gdGhlIHNsaWNlXG5saXN0IGhhcyBleGFjdGx5IG9uZSBzaG9ydCBzbGljZSBhbmQgbm8gdHJhaWxpbmcgY29tbWEsIHRoZVxuaW50ZXJwcmV0YXRpb24gYXMgYSBzaW1wbGUgc2xpY2luZyB0YWtlcyBwcmlvcml0eSBvdmVyIHRoYXQgYXMgYW5cbmV4dGVuZGVkIHNsaWNpbmcuXG5cblRoZSBzZW1hbnRpY3MgZm9yIGEgc2ltcGxlIHNsaWNpbmcgYXJlIGFzIGZvbGxvd3MuICBUaGUgcHJpbWFyeSBtdXN0XG5ldmFsdWF0ZSB0byBhIHNlcXVlbmNlIG9iamVjdC4gIFRoZSBsb3dlciBhbmQgdXBwZXIgYm91bmQgZXhwcmVzc2lvbnMsXG5pZiBwcmVzZW50LCBtdXN0IGV2YWx1YXRlIHRvIHBsYWluIGludGVnZXJzOyBkZWZhdWx0cyBhcmUgemVybyBhbmQgdGhlXG5gYHN5cy5tYXhpbnRgYCwgcmVzcGVjdGl2ZWx5LiAgSWYgZWl0aGVyIGJvdW5kIGlzIG5lZ2F0aXZlLCB0aGVcbnNlcXVlbmNlXCdzIGxlbmd0aCBpcyBhZGRlZCB0byBpdC4gIFRoZSBzbGljaW5nIG5vdyBzZWxlY3RzIGFsbCBpdGVtc1xud2l0aCBpbmRleCAqayogc3VjaCB0aGF0IGBgaSA8PSBrIDwgamBgIHdoZXJlICppKiBhbmQgKmoqIGFyZSB0aGVcbnNwZWNpZmllZCBsb3dlciBhbmQgdXBwZXIgYm91bmRzLiAgVGhpcyBtYXkgYmUgYW4gZW1wdHkgc2VxdWVuY2UuICBJdFxuaXMgbm90IGFuIGVycm9yIGlmICppKiBvciAqaiogbGllIG91dHNpZGUgdGhlIHJhbmdlIG9mIHZhbGlkIGluZGV4ZXNcbihzdWNoIGl0ZW1zIGRvblwndCBleGlzdCBzbyB0aGV5IGFyZW5cJ3Qgc2VsZWN0ZWQpLlxuXG5UaGUgc2VtYW50aWNzIGZvciBhbiBleHRlbmRlZCBzbGljaW5nIGFyZSBhcyBmb2xsb3dzLiAgVGhlIHByaW1hcnlcbm11c3QgZXZhbHVhdGUgdG8gYSBtYXBwaW5nIG9iamVjdCwgYW5kIGl0IGlzIGluZGV4ZWQgd2l0aCBhIGtleSB0aGF0XG5pcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBzbGljZSBsaXN0LCBhcyBmb2xsb3dzLiAgSWYgdGhlIHNsaWNlIGxpc3RcbmNvbnRhaW5zIGF0IGxlYXN0IG9uZSBjb21tYSwgdGhlIGtleSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlXG5jb252ZXJzaW9uIG9mIHRoZSBzbGljZSBpdGVtczsgb3RoZXJ3aXNlLCB0aGUgY29udmVyc2lvbiBvZiB0aGUgbG9uZVxuc2xpY2UgaXRlbSBpcyB0aGUga2V5LiAgVGhlIGNvbnZlcnNpb24gb2YgYSBzbGljZSBpdGVtIHRoYXQgaXMgYW5cbmV4cHJlc3Npb24gaXMgdGhhdCBleHByZXNzaW9uLiAgVGhlIGNvbnZlcnNpb24gb2YgYW4gZWxsaXBzaXMgc2xpY2Vcbml0ZW0gaXMgdGhlIGJ1aWx0LWluIGBgRWxsaXBzaXNgYCBvYmplY3QuICBUaGUgY29udmVyc2lvbiBvZiBhIHByb3Blclxuc2xpY2UgaXMgYSBzbGljZSBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGUgc3RhbmRhcmQgdHlwZSBoaWVyYXJjaHkqKVxud2hvc2UgYGBzdGFydGBgLCBgYHN0b3BgYCBhbmQgYGBzdGVwYGAgYXR0cmlidXRlcyBhcmUgdGhlIHZhbHVlcyBvZlxudGhlIGV4cHJlc3Npb25zIGdpdmVuIGFzIGxvd2VyIGJvdW5kLCB1cHBlciBib3VuZCBhbmQgc3RyaWRlLFxucmVzcGVjdGl2ZWx5LCBzdWJzdGl0dXRpbmcgYGBOb25lYGAgZm9yIG1pc3NpbmcgZXhwcmVzc2lvbnMuXG4nLAorICdzcGVjaWFsYXR0cnMnOiAnXG5TcGVjaWFsIEF0dHJpYnV0ZXNcbioqKioqKioqKioqKioqKioqKlxuXG5UaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzIHRvIHNldmVyYWxcbm9iamVjdCB0eXBlcywgd2hlcmUgdGhleSBhcmUgcmVsZXZhbnQuICBTb21lIG9mIHRoZXNlIGFyZSBub3QgcmVwb3J0ZWRcbmJ5IHRoZSBgYGRpcigpYGAgYnVpbHQtaW4gZnVuY3Rpb24uXG5cbm9iamVjdC5fX2RpY3RfX1xuXG4gICBBIGRpY3Rpb25hcnkgb3Igb3RoZXIgbWFwcGluZyBvYmplY3QgdXNlZCB0byBzdG9yZSBhbiBvYmplY3RcJ3NcbiAgICh3cml0YWJsZSkgYXR0cmlidXRlcy5cblxub2JqZWN0Ll9fbWV0aG9kc19fXG5cbiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjI6IFVzZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBkaXIoKWBgXG4gICB0byBnZXQgYSBsaXN0IG9mIGFuIG9iamVjdFwncyBhdHRyaWJ1dGVzLiBUaGlzIGF0dHJpYnV0ZSBpcyBub1xuICAgbG9uZ2VyIGF2YWlsYWJsZS5cblxub2JqZWN0Ll9fbWVtYmVyc19fXG5cbiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjI6IFVzZSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gYGBkaXIoKWBgXG4gICB0byBnZXQgYSBsaXN0IG9mIGFuIG9iamVjdFwncyBhdHRyaWJ1dGVzLiBUaGlzIGF0dHJpYnV0ZSBpcyBub1xuICAgbG9uZ2VyIGF2YWlsYWJsZS5cblxuaW5zdGFuY2UuX19jbGFzc19fXG5cbiAgIFRoZSBjbGFzcyB0byB3aGljaCBhIGNsYXNzIGluc3RhbmNlIGJlbG9uZ3MuXG5cbmNsYXNzLl9fYmFzZXNfX1xuXG4gICBUaGUgdHVwbGUgb2YgYmFzZSBjbGFzc2VzIG9mIGEgY2xhc3Mgb2JqZWN0LlxuXG5jbGFzcy5fX25hbWVfX1xuXG4gICBUaGUgbmFtZSBvZiB0aGUgY2xhc3Mgb3IgdHlwZS5cblxuVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBvbmx5IHN1cHBvcnRlZCBieSAqbmV3LXN0eWxlIGNsYXNzKmVzLlxuXG5jbGFzcy5fX21yb19fXG5cbiAgIFRoaXMgYXR0cmlidXRlIGlzIGEgdHVwbGUgb2YgY2xhc3NlcyB0aGF0IGFyZSBjb25zaWRlcmVkIHdoZW5cbiAgIGxvb2tpbmcgZm9yIGJhc2UgY2xhc3NlcyBkdXJpbmcgbWV0aG9kIHJlc29sdXRpb24uXG5cbmNsYXNzLm1ybygpXG5cbiAgIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGEgbWV0YWNsYXNzIHRvIGN1c3RvbWl6ZSB0aGVcbiAgIG1ldGhvZCByZXNvbHV0aW9uIG9yZGVyIGZvciBpdHMgaW5zdGFuY2VzLiAgSXQgaXMgY2FsbGVkIGF0IGNsYXNzXG4gICBpbnN0YW50aWF0aW9uLCBhbmQgaXRzIHJlc3VsdCBpcyBzdG9yZWQgaW4gYGBfX21yb19fYGAuXG5cbmNsYXNzLl9fc3ViY2xhc3Nlc19fKClcblxuICAgRWFjaCBuZXctc3R5bGUgY2xhc3Mga2VlcHMgYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byBpdHNcbiAgIGltbWVkaWF0ZSBzdWJjbGFzc2VzLiAgVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgYWxsIHRob3NlXG4gICByZWZlcmVuY2VzIHN0aWxsIGFsaXZlLiBFeGFtcGxlOlxuXG4gICAgICA+Pj4gaW50Ll9fc3ViY2xhc3Nlc19fKClcbiAgICAgIFs8dHlwZSBcJ2Jvb2xcJz5dXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGVzZSBzcGVjaWFsIG1ldGhvZHMgbWF5IGJlIGZvdW5kIGluXG4gICAgdGhlIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsICgqQmFzaWMgY3VzdG9taXphdGlvbiopLlxuXG5bMl0gQXMgYSBjb25zZXF1ZW5jZSwgdGhlIGxpc3QgYGBbMSwgMl1gYCBpcyBjb25zaWRlcmVkIGVxdWFsIHRvXG4gICAgYGBbMS4wLCAyLjBdYGAsIGFuZCBzaW1pbGFybHkgZm9yIHR1cGxlcy5cblxuWzNdIFRoZXkgbXVzdCBoYXZlIHNpbmNlIHRoZSBwYXJzZXIgY2FuXCd0IHRlbGwgdGhlIHR5cGUgb2YgdGhlXG4gICAgb3BlcmFuZHMuXG5cbls0XSBDYXNlZCBjaGFyYWN0ZXJzIGFyZSB0aG9zZSB3aXRoIGdlbmVyYWwgY2F0ZWdvcnkgcHJvcGVydHkgYmVpbmdcbiAgICBvbmUgb2YgIkx1IiAoTGV0dGVyLCB1cHBlcmNhc2UpLCAiTGwiIChMZXR0ZXIsIGxvd2VyY2FzZSksIG9yICJMdCJcbiAgICAoTGV0dGVyLCB0aXRsZWNhc2UpLlxuXG5bNV0gVG8gZm9ybWF0IG9ubHkgYSB0dXBsZSB5b3Ugc2hvdWxkIHRoZXJlZm9yZSBwcm92aWRlIGEgc2luZ2xldG9uXG4gICAgdHVwbGUgd2hvc2Ugb25seSBlbGVtZW50IGlzIHRoZSB0dXBsZSB0byBiZSBmb3JtYXR0ZWQuXG5cbls2XSBUaGUgYWR2YW50YWdlIG9mIGxlYXZpbmcgdGhlIG5ld2xpbmUgb24gaXMgdGhhdCByZXR1cm5pbmcgYW4gZW1wdHlcbiAgICBzdHJpbmcgaXMgdGhlbiBhbiB1bmFtYmlndW91cyBFT0YgaW5kaWNhdGlvbi4gIEl0IGlzIGFsc28gcG9zc2libGVcbiAgICAoaW4gY2FzZXMgd2hlcmUgaXQgbWlnaHQgbWF0dGVyLCBmb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgdG8gbWFrZVxuICAgIGFuIGV4YWN0IGNvcHkgb2YgYSBmaWxlIHdoaWxlIHNjYW5uaW5nIGl0cyBsaW5lcykgdG8gdGVsbCB3aGV0aGVyXG4gICAgdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgZW5kZWQgaW4gYSBuZXdsaW5lIG9yIG5vdCAoeWVzIHRoaXNcbiAgICBoYXBwZW5zISkuXG4nLAorICdzcGVjaWFsbmFtZXMnOiAnXG5TcGVjaWFsIG1ldGhvZCBuYW1lc1xuKioqKioqKioqKioqKioqKioqKipcblxuQSBjbGFzcyBjYW4gaW1wbGVtZW50IGNlcnRhaW4gb3BlcmF0aW9ucyB0aGF0IGFyZSBpbnZva2VkIGJ5IHNwZWNpYWxcbnN5bnRheCAoc3VjaCBhcyBhcml0aG1ldGljIG9wZXJhdGlvbnMgb3Igc3Vic2NyaXB0aW5nIGFuZCBzbGljaW5nKSBieVxuZGVmaW5pbmcgbWV0aG9kcyB3aXRoIHNwZWNpYWwgbmFtZXMuIFRoaXMgaXMgUHl0aG9uXCdzIGFwcHJvYWNoIHRvXG4qb3BlcmF0b3Igb3ZlcmxvYWRpbmcqLCBhbGxvd2luZyBjbGFzc2VzIHRvIGRlZmluZSB0aGVpciBvd24gYmVoYXZpb3JcbndpdGggcmVzcGVjdCB0byBsYW5ndWFnZSBvcGVyYXRvcnMuICBGb3IgaW5zdGFuY2UsIGlmIGEgY2xhc3MgZGVmaW5lc1xuYSBtZXRob2QgbmFtZWQgYGBfX2dldGl0ZW1fXygpYGAsIGFuZCBgYHhgYCBpcyBhbiBpbnN0YW5jZSBvZiB0aGlzXG5jbGFzcywgdGhlbiBgYHhbaV1gYCBpcyByb3VnaGx5IGVxdWl2YWxlbnQgdG8gYGB4Ll9fZ2V0aXRlbV9fKGkpYGAgZm9yXG5vbGQtc3R5bGUgY2xhc3NlcyBhbmQgYGB0eXBlKHgpLl9fZ2V0aXRlbV9fKHgsIGkpYGAgZm9yIG5ldy1zdHlsZVxuY2xhc3Nlcy4gIEV4Y2VwdCB3aGVyZSBtZW50aW9uZWQsIGF0dGVtcHRzIHRvIGV4ZWN1dGUgYW4gb3BlcmF0aW9uXG5yYWlzZSBhbiBleGNlcHRpb24gd2hlbiBubyBhcHByb3ByaWF0ZSBtZXRob2QgaXMgZGVmaW5lZCAodHlwaWNhbGx5XG5gYEF0dHJpYnV0ZUVycm9yYGAgb3IgYGBUeXBlRXJyb3JgYCkuXG5cbldoZW4gaW1wbGVtZW50aW5nIGEgY2xhc3MgdGhhdCBlbXVsYXRlcyBhbnkgYnVpbHQtaW4gdHlwZSwgaXQgaXNcbmltcG9ydGFudCB0aGF0IHRoZSBlbXVsYXRpb24gb25seSBiZSBpbXBsZW1lbnRlZCB0byB0aGUgZGVncmVlIHRoYXQgaXRcbm1ha2VzIHNlbnNlIGZvciB0aGUgb2JqZWN0IGJlaW5nIG1vZGVsbGVkLiAgRm9yIGV4YW1wbGUsIHNvbWVcbnNlcXVlbmNlcyBtYXkgd29yayB3ZWxsIHdpdGggcmV0cmlldmFsIG9mIGluZGl2aWR1YWwgZWxlbWVudHMsIGJ1dFxuZXh0cmFjdGluZyBhIHNsaWNlIG1heSBub3QgbWFrZSBzZW5zZS4gIChPbmUgZXhhbXBsZSBvZiB0aGlzIGlzIHRoZVxuYGBOb2RlTGlzdGBgIGludGVyZmFjZSBpbiB0aGUgVzNDXCdzIERvY3VtZW50IE9iamVjdCBNb2RlbC4pXG5cblxuQmFzaWMgY3VzdG9taXphdGlvblxuPT09PT09PT09PT09PT09PT09PVxuXG5vYmplY3QuX19uZXdfXyhjbHNbLCAuLi5dKVxuXG4gICBDYWxsZWQgdG8gY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIGNsYXNzICpjbHMqLiAgYGBfX25ld19fKClgYCBpcyBhXG4gICBzdGF0aWMgbWV0aG9kIChzcGVjaWFsLWNhc2VkIHNvIHlvdSBuZWVkIG5vdCBkZWNsYXJlIGl0IGFzIHN1Y2gpXG4gICB0aGF0IHRha2VzIHRoZSBjbGFzcyBvZiB3aGljaCBhbiBpbnN0YW5jZSB3YXMgcmVxdWVzdGVkIGFzIGl0c1xuICAgZmlyc3QgYXJndW1lbnQuICBUaGUgcmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhvc2UgcGFzc2VkIHRvIHRoZVxuICAgb2JqZWN0IGNvbnN0cnVjdG9yIGV4cHJlc3Npb24gKHRoZSBjYWxsIHRvIHRoZSBjbGFzcykuICBUaGUgcmV0dXJuXG4gICB2YWx1ZSBvZiBgYF9fbmV3X18oKWBgIHNob3VsZCBiZSB0aGUgbmV3IG9iamVjdCBpbnN0YW5jZSAodXN1YWxseVxuICAgYW4gaW5zdGFuY2Ugb2YgKmNscyopLlxuXG4gICBUeXBpY2FsIGltcGxlbWVudGF0aW9ucyBjcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGJ5XG4gICBpbnZva2luZyB0aGUgc3VwZXJjbGFzc1wncyBgYF9fbmV3X18oKWBgIG1ldGhvZCB1c2luZ1xuICAgYGBzdXBlcihjdXJyZW50Y2xhc3MsIGNscykuX19uZXdfXyhjbHNbLCAuLi5dKWBgIHdpdGggYXBwcm9wcmlhdGVcbiAgIGFyZ3VtZW50cyBhbmQgdGhlbiBtb2RpZnlpbmcgdGhlIG5ld2x5LWNyZWF0ZWQgaW5zdGFuY2UgYXNcbiAgIG5lY2Vzc2FyeSBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuXG4gICBJZiBgYF9fbmV3X18oKWBgIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgKmNscyosIHRoZW4gdGhlIG5ld1xuICAgaW5zdGFuY2VcJ3MgYGBfX2luaXRfXygpYGAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBsaWtlXG4gICBgYF9faW5pdF9fKHNlbGZbLCAuLi5dKWBgLCB3aGVyZSAqc2VsZiogaXMgdGhlIG5ldyBpbnN0YW5jZSBhbmQgdGhlXG4gICByZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyB3ZXJlIHBhc3NlZCB0byBgYF9fbmV3X18oKWBgLlxuXG4gICBJZiBgYF9fbmV3X18oKWBgIGRvZXMgbm90IHJldHVybiBhbiBpbnN0YW5jZSBvZiAqY2xzKiwgdGhlbiB0aGUgbmV3XG4gICBpbnN0YW5jZVwncyBgYF9faW5pdF9fKClgYCBtZXRob2Qgd2lsbCBub3QgYmUgaW52b2tlZC5cblxuICAgYGBfX25ld19fKClgYCBpcyBpbnRlbmRlZCBtYWlubHkgdG8gYWxsb3cgc3ViY2xhc3NlcyBvZiBpbW11dGFibGVcbiAgIHR5cGVzIChsaWtlIGludCwgc3RyLCBvciB0dXBsZSkgdG8gY3VzdG9taXplIGluc3RhbmNlIGNyZWF0aW9uLiAgSXRcbiAgIGlzIGFsc28gY29tbW9ubHkgb3ZlcnJpZGRlbiBpbiBjdXN0b20gbWV0YWNsYXNzZXMgaW4gb3JkZXIgdG9cbiAgIGN1c3RvbWl6ZSBjbGFzcyBjcmVhdGlvbi5cblxub2JqZWN0Ll9faW5pdF9fKHNlbGZbLCAuLi5dKVxuXG4gICBDYWxsZWQgd2hlbiB0aGUgaW5zdGFuY2UgaXMgY3JlYXRlZC4gIFRoZSBhcmd1bWVudHMgYXJlIHRob3NlXG4gICBwYXNzZWQgdG8gdGhlIGNsYXNzIGNvbnN0cnVjdG9yIGV4cHJlc3Npb24uICBJZiBhIGJhc2UgY2xhc3MgaGFzIGFuXG4gICBgYF9faW5pdF9fKClgYCBtZXRob2QsIHRoZSBkZXJpdmVkIGNsYXNzXCdzIGBgX19pbml0X18oKWBgIG1ldGhvZCxcbiAgIGlmIGFueSwgbXVzdCBleHBsaWNpdGx5IGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBpbml0aWFsaXphdGlvbiBvZlxuICAgdGhlIGJhc2UgY2xhc3MgcGFydCBvZiB0aGUgaW5zdGFuY2U7IGZvciBleGFtcGxlOlxuICAgYGBCYXNlQ2xhc3MuX19pbml0X18oc2VsZiwgW2FyZ3MuLi5dKWBgLiAgQXMgYSBzcGVjaWFsIGNvbnN0cmFpbnRcbiAgIG9uIGNvbnN0cnVjdG9ycywgbm8gdmFsdWUgbWF5IGJlIHJldHVybmVkOyBkb2luZyBzbyB3aWxsIGNhdXNlIGFcbiAgIGBgVHlwZUVycm9yYGAgdG8gYmUgcmFpc2VkIGF0IHJ1bnRpbWUuXG5cbm9iamVjdC5fX2RlbF9fKHNlbGYpXG5cbiAgIENhbGxlZCB3aGVuIHRoZSBpbnN0YW5jZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQuICBUaGlzIGlzIGFsc29cbiAgIGNhbGxlZCBhIGRlc3RydWN0b3IuICBJZiBhIGJhc2UgY2xhc3MgaGFzIGEgYGBfX2RlbF9fKClgYCBtZXRob2QsXG4gICB0aGUgZGVyaXZlZCBjbGFzc1wncyBgYF9fZGVsX18oKWBgIG1ldGhvZCwgaWYgYW55LCBtdXN0IGV4cGxpY2l0bHlcbiAgIGNhbGwgaXQgdG8gZW5zdXJlIHByb3BlciBkZWxldGlvbiBvZiB0aGUgYmFzZSBjbGFzcyBwYXJ0IG9mIHRoZVxuICAgaW5zdGFuY2UuICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgKHRob3VnaCBub3QgcmVjb21tZW5kZWQhKSBmb3JcbiAgIHRoZSBgYF9fZGVsX18oKWBgIG1ldGhvZCB0byBwb3N0cG9uZSBkZXN0cnVjdGlvbiBvZiB0aGUgaW5zdGFuY2UgYnlcbiAgIGNyZWF0aW5nIGEgbmV3IHJlZmVyZW5jZSB0byBpdC4gIEl0IG1heSB0aGVuIGJlIGNhbGxlZCBhdCBhIGxhdGVyXG4gICB0aW1lIHdoZW4gdGhpcyBuZXcgcmVmZXJlbmNlIGlzIGRlbGV0ZWQuICBJdCBpcyBub3QgZ3VhcmFudGVlZCB0aGF0XG4gICBgYF9fZGVsX18oKWBgIG1ldGhvZHMgYXJlIGNhbGxlZCBmb3Igb2JqZWN0cyB0aGF0IHN0aWxsIGV4aXN0IHdoZW5cbiAgIHRoZSBpbnRlcnByZXRlciBleGl0cy5cblxuICAgTm90ZTogYGBkZWwgeGBgIGRvZXNuXCd0IGRpcmVjdGx5IGNhbGwgYGB4Ll9fZGVsX18oKWBgIC0tLSB0aGUgZm9ybWVyXG4gICAgIGRlY3JlbWVudHMgdGhlIHJlZmVyZW5jZSBjb3VudCBmb3IgYGB4YGAgYnkgb25lLCBhbmQgdGhlIGxhdHRlclxuICAgICBpcyBvbmx5IGNhbGxlZCB3aGVuIGBgeGBgXCdzIHJlZmVyZW5jZSBjb3VudCByZWFjaGVzIHplcm8uICBTb21lXG4gICAgIGNvbW1vbiBzaXR1YXRpb25zIHRoYXQgbWF5IHByZXZlbnQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiBhblxuICAgICBvYmplY3QgZnJvbSBnb2luZyB0byB6ZXJvIGluY2x1ZGU6IGNpcmN1bGFyIHJlZmVyZW5jZXMgYmV0d2VlblxuICAgICBvYmplY3RzIChlLmcuLCBhIGRvdWJseS1saW5rZWQgbGlzdCBvciBhIHRyZWUgZGF0YSBzdHJ1Y3R1cmUgd2l0aFxuICAgICBwYXJlbnQgYW5kIGNoaWxkIHBvaW50ZXJzKTsgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBvbiB0aGVcbiAgICAgc3RhY2sgZnJhbWUgb2YgYSBmdW5jdGlvbiB0aGF0IGNhdWdodCBhbiBleGNlcHRpb24gKHRoZSB0cmFjZWJhY2tcbiAgICAgc3RvcmVkIGluIGBgc3lzLmV4Y190cmFjZWJhY2tgYCBrZWVwcyB0aGUgc3RhY2sgZnJhbWUgYWxpdmUpOyBvclxuICAgICBhIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0IG9uIHRoZSBzdGFjayBmcmFtZSB0aGF0IHJhaXNlZCBhblxuICAgICB1bmhhbmRsZWQgZXhjZXB0aW9uIGluIGludGVyYWN0aXZlIG1vZGUgKHRoZSB0cmFjZWJhY2sgc3RvcmVkIGluXG4gICAgIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAga2VlcHMgdGhlIHN0YWNrIGZyYW1lIGFsaXZlKS4gIFRoZSBmaXJzdFxuICAgICBzaXR1YXRpb24gY2FuIG9ubHkgYmUgcmVtZWRpZWQgYnkgZXhwbGljaXRseSBicmVha2luZyB0aGUgY3ljbGVzO1xuICAgICB0aGUgbGF0dGVyIHR3byBzaXR1YXRpb25zIGNhbiBiZSByZXNvbHZlZCBieSBzdG9yaW5nIGBgTm9uZWBgIGluXG4gICAgIGBgc3lzLmV4Y190cmFjZWJhY2tgYCBvciBgYHN5cy5sYXN0X3RyYWNlYmFja2BgLiAgQ2lyY3VsYXJcbiAgICAgcmVmZXJlbmNlcyB3aGljaCBhcmUgZ2FyYmFnZSBhcmUgZGV0ZWN0ZWQgd2hlbiB0aGUgb3B0aW9uIGN5Y2xlXG4gICAgIGRldGVjdG9yIGlzIGVuYWJsZWQgKGl0XCdzIG9uIGJ5IGRlZmF1bHQpLCBidXQgY2FuIG9ubHkgYmUgY2xlYW5lZFxuICAgICB1cCBpZiB0aGVyZSBhcmUgbm8gUHl0aG9uLWxldmVsIGBgX19kZWxfXygpYGAgbWV0aG9kcyBpbnZvbHZlZC5cbiAgICAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBgYGdjYGAgbW9kdWxlIGZvciBtb3JlXG4gICAgIGluZm9ybWF0aW9uIGFib3V0IGhvdyBgYF9fZGVsX18oKWBgIG1ldGhvZHMgYXJlIGhhbmRsZWQgYnkgdGhlXG4gICAgIGN5Y2xlIGRldGVjdG9yLCBwYXJ0aWN1bGFybHkgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBgYGdhcmJhZ2VgYFxuICAgICB2YWx1ZS5cblxuICAgV2FybmluZzogRHVlIHRvIHRoZSBwcmVjYXJpb3VzIGNpcmN1bXN0YW5jZXMgdW5kZXIgd2hpY2ggYGBfX2RlbF9fKClgYFxuICAgICBtZXRob2RzIGFyZSBpbnZva2VkLCBleGNlcHRpb25zIHRoYXQgb2NjdXIgZHVyaW5nIHRoZWlyIGV4ZWN1dGlvblxuICAgICBhcmUgaWdub3JlZCwgYW5kIGEgd2FybmluZyBpcyBwcmludGVkIHRvIGBgc3lzLnN0ZGVycmBgIGluc3RlYWQuXG4gICAgIEFsc28sIHdoZW4gYGBfX2RlbF9fKClgYCBpcyBpbnZva2VkIGluIHJlc3BvbnNlIHRvIGEgbW9kdWxlIGJlaW5nXG4gICAgIGRlbGV0ZWQgKGUuZy4sIHdoZW4gZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGlzIGRvbmUpLCBvdGhlclxuICAgICBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgdGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIG1heSBhbHJlYWR5IGhhdmVcbiAgICAgYmVlbiBkZWxldGVkIG9yIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHRvcm4gZG93biAoZS5nLiB0aGVcbiAgICAgaW1wb3J0IG1hY2hpbmVyeSBzaHV0dGluZyBkb3duKS4gIEZvciB0aGlzIHJlYXNvbiwgYGBfX2RlbF9fKClgYFxuICAgICBtZXRob2RzIHNob3VsZCBkbyB0aGUgYWJzb2x1dGUgbWluaW11bSBuZWVkZWQgdG8gbWFpbnRhaW5cbiAgICAgZXh0ZXJuYWwgaW52YXJpYW50cy4gIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAxLjUsIFB5dGhvblxuICAgICBndWFyYW50ZWVzIHRoYXQgZ2xvYmFscyB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIGEgc2luZ2xlXG4gICAgIHVuZGVyc2NvcmUgYXJlIGRlbGV0ZWQgZnJvbSB0aGVpciBtb2R1bGUgYmVmb3JlIG90aGVyIGdsb2JhbHMgYXJlXG4gICAgIGRlbGV0ZWQ7IGlmIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gc3VjaCBnbG9iYWxzIGV4aXN0LCB0aGlzIG1heVxuICAgICBoZWxwIGluIGFzc3VyaW5nIHRoYXQgaW1wb3J0ZWQgbW9kdWxlcyBhcmUgc3RpbGwgYXZhaWxhYmxlIGF0IHRoZVxuICAgICB0aW1lIHdoZW4gdGhlIGBgX19kZWxfXygpYGAgbWV0aG9kIGlzIGNhbGxlZC5cblxuICAgU2VlIGFsc28gdGhlICotUiogY29tbWFuZC1saW5lIG9wdGlvbi5cblxub2JqZWN0Ll9fcmVwcl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgYGByZXByKClgYCBidWlsdC1pbiBmdW5jdGlvbiBhbmQgYnkgc3RyaW5nXG4gICBjb252ZXJzaW9ucyAocmV2ZXJzZSBxdW90ZXMpIHRvIGNvbXB1dGUgdGhlICJvZmZpY2lhbCIgc3RyaW5nXG4gICByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuICBJZiBhdCBhbGwgcG9zc2libGUsIHRoaXMgc2hvdWxkIGxvb2tcbiAgIGxpa2UgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbiB0aGF0IGNvdWxkIGJlIHVzZWQgdG8gcmVjcmVhdGUgYW5cbiAgIG9iamVjdCB3aXRoIHRoZSBzYW1lIHZhbHVlIChnaXZlbiBhbiBhcHByb3ByaWF0ZSBlbnZpcm9ubWVudCkuICBJZlxuICAgdGhpcyBpcyBub3QgcG9zc2libGUsIGEgc3RyaW5nIG9mIHRoZSBmb3JtIGBgPC4uLnNvbWUgdXNlZnVsXG4gICBkZXNjcmlwdGlvbi4uLj5gYCBzaG91bGQgYmUgcmV0dXJuZWQuICBUaGUgcmV0dXJuIHZhbHVlIG11c3QgYmUgYVxuICAgc3RyaW5nIG9iamVjdC4gSWYgYSBjbGFzcyBkZWZpbmVzIGBgX19yZXByX18oKWBgIGJ1dCBub3RcbiAgIGBgX19zdHJfXygpYGAsIHRoZW4gYGBfX3JlcHJfXygpYGAgaXMgYWxzbyB1c2VkIHdoZW4gYW4gImluZm9ybWFsIlxuICAgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIGlzIHJlcXVpcmVkLlxuXG4gICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGZvciBkZWJ1Z2dpbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZVxuICAgcmVwcmVzZW50YXRpb24gaXMgaW5mb3JtYXRpb24tcmljaCBhbmQgdW5hbWJpZ3VvdXMuXG5cbm9iamVjdC5fX3N0cl9fKHNlbGYpXG5cbiAgIENhbGxlZCBieSB0aGUgYGBzdHIoKWBgIGJ1aWx0LWluIGZ1bmN0aW9uIGFuZCBieSB0aGUgYGBwcmludGBgXG4gICBzdGF0ZW1lbnQgdG8gY29tcHV0ZSB0aGUgImluZm9ybWFsIiBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW5cbiAgIG9iamVjdC4gIFRoaXMgZGlmZmVycyBmcm9tIGBgX19yZXByX18oKWBgIGluIHRoYXQgaXQgZG9lcyBub3QgaGF2ZVxuICAgdG8gYmUgYSB2YWxpZCBQeXRob24gZXhwcmVzc2lvbjogYSBtb3JlIGNvbnZlbmllbnQgb3IgY29uY2lzZVxuICAgcmVwcmVzZW50YXRpb24gbWF5IGJlIHVzZWQgaW5zdGVhZC4gVGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlIGFcbiAgIHN0cmluZyBvYmplY3QuXG5cbm9iamVjdC5fX2x0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19sZV9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZXFfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX25lX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19ndF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fZ2VfXyhzZWxmLCBvdGhlcilcblxuICAgTmV3IGluIHZlcnNpb24gMi4xLlxuXG4gICBUaGVzZSBhcmUgdGhlIHNvLWNhbGxlZCAicmljaCBjb21wYXJpc29uIiBtZXRob2RzLCBhbmQgYXJlIGNhbGxlZFxuICAgZm9yIGNvbXBhcmlzb24gb3BlcmF0b3JzIGluIHByZWZlcmVuY2UgdG8gYGBfX2NtcF9fKClgYCBiZWxvdy4gVGhlXG4gICBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIG9wZXJhdG9yIHN5bWJvbHMgYW5kIG1ldGhvZCBuYW1lcyBpcyBhc1xuICAgZm9sbG93czogYGB4PHlgYCBjYWxscyBgYHguX19sdF9fKHkpYGAsIGBgeDw9eWBgIGNhbGxzXG4gICBgYHguX19sZV9fKHkpYGAsIGBgeD09eWBgIGNhbGxzIGBgeC5fX2VxX18oeSlgYCwgYGB4IT15YGAgYW5kXG4gICBgYHg8PnlgYCBjYWxsIGBgeC5fX25lX18oeSlgYCwgYGB4PnlgYCBjYWxscyBgYHguX19ndF9fKHkpYGAsIGFuZFxuICAgYGB4Pj15YGAgY2FsbHMgYGB4Ll9fZ2VfXyh5KWBgLlxuXG4gICBBIHJpY2ggY29tcGFyaXNvbiBtZXRob2QgbWF5IHJldHVybiB0aGUgc2luZ2xldG9uXG4gICBgYE5vdEltcGxlbWVudGVkYGAgaWYgaXQgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIGFcbiAgIGdpdmVuIHBhaXIgb2YgYXJndW1lbnRzLiBCeSBjb252ZW50aW9uLCBgYEZhbHNlYGAgYW5kIGBgVHJ1ZWBgIGFyZVxuICAgcmV0dXJuZWQgZm9yIGEgc3VjY2Vzc2Z1bCBjb21wYXJpc29uLiBIb3dldmVyLCB0aGVzZSBtZXRob2RzIGNhblxuICAgcmV0dXJuIGFueSB2YWx1ZSwgc28gaWYgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3IgaXMgdXNlZCBpbiBhXG4gICBCb29sZWFuIGNvbnRleHQgKGUuZy4sIGluIHRoZSBjb25kaXRpb24gb2YgYW4gYGBpZmBgIHN0YXRlbWVudCksXG4gICBQeXRob24gd2lsbCBjYWxsIGBgYm9vbCgpYGAgb24gdGhlIHZhbHVlIHRvIGRldGVybWluZSBpZiB0aGUgcmVzdWx0XG4gICBpcyB0cnVlIG9yIGZhbHNlLlxuXG4gICBUaGVyZSBhcmUgbm8gaW1wbGllZCByZWxhdGlvbnNoaXBzIGFtb25nIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycy5cbiAgIFRoZSB0cnV0aCBvZiBgYHg9PXlgYCBkb2VzIG5vdCBpbXBseSB0aGF0IGBgeCE9eWBgIGlzIGZhbHNlLlxuICAgQWNjb3JkaW5nbHksIHdoZW4gZGVmaW5pbmcgYGBfX2VxX18oKWBgLCBvbmUgc2hvdWxkIGFsc28gZGVmaW5lXG4gICBgYF9fbmVfXygpYGAgc28gdGhhdCB0aGUgb3BlcmF0b3JzIHdpbGwgYmVoYXZlIGFzIGV4cGVjdGVkLiAgU2VlXG4gICB0aGUgcGFyYWdyYXBoIG9uIGBgX19oYXNoX18oKWBgIGZvciBzb21lIGltcG9ydGFudCBub3RlcyBvblxuICAgY3JlYXRpbmcgKmhhc2hhYmxlKiBvYmplY3RzIHdoaWNoIHN1cHBvcnQgY3VzdG9tIGNvbXBhcmlzb25cbiAgIG9wZXJhdGlvbnMgYW5kIGFyZSB1c2FibGUgYXMgZGljdGlvbmFyeSBrZXlzLlxuXG4gICBUaGVyZSBhcmUgbm8gc3dhcHBlZC1hcmd1bWVudCB2ZXJzaW9ucyBvZiB0aGVzZSBtZXRob2RzICh0byBiZSB1c2VkXG4gICB3aGVuIHRoZSBsZWZ0IGFyZ3VtZW50IGRvZXMgbm90IHN1cHBvcnQgdGhlIG9wZXJhdGlvbiBidXQgdGhlIHJpZ2h0XG4gICBhcmd1bWVudCBkb2VzKTsgcmF0aGVyLCBgYF9fbHRfXygpYGAgYW5kIGBgX19ndF9fKClgYCBhcmUgZWFjaFxuICAgb3RoZXJcJ3MgcmVmbGVjdGlvbiwgYGBfX2xlX18oKWBgIGFuZCBgYF9fZ2VfXygpYGAgYXJlIGVhY2ggb3RoZXJcJ3NcbiAgIHJlZmxlY3Rpb24sIGFuZCBgYF9fZXFfXygpYGAgYW5kIGBgX19uZV9fKClgYCBhcmUgdGhlaXIgb3duXG4gICByZWZsZWN0aW9uLlxuXG4gICBBcmd1bWVudHMgdG8gcmljaCBjb21wYXJpc29uIG1ldGhvZHMgYXJlIG5ldmVyIGNvZXJjZWQuXG5cbiAgIFRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgb3JkZXJpbmcgb3BlcmF0aW9ucyBmcm9tIGEgc2luZ2xlIHJvb3RcbiAgIG9wZXJhdGlvbiwgc2VlIGBgZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nKClgYC5cblxub2JqZWN0Ll9fY21wX18oc2VsZiwgb3RoZXIpXG5cbiAgIENhbGxlZCBieSBjb21wYXJpc29uIG9wZXJhdGlvbnMgaWYgcmljaCBjb21wYXJpc29uIChzZWUgYWJvdmUpIGlzXG4gICBub3QgZGVmaW5lZC4gIFNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyIGlmIGBgc2VsZiA8IG90aGVyYGAsXG4gICB6ZXJvIGlmIGBgc2VsZiA9PSBvdGhlcmBgLCBhIHBvc2l0aXZlIGludGVnZXIgaWYgYGBzZWxmID4gb3RoZXJgYC5cbiAgIElmIG5vIGBgX19jbXBfXygpYGAsIGBgX19lcV9fKClgYCBvciBgYF9fbmVfXygpYGAgb3BlcmF0aW9uIGlzXG4gICBkZWZpbmVkLCBjbGFzcyBpbnN0YW5jZXMgYXJlIGNvbXBhcmVkIGJ5IG9iamVjdCBpZGVudGl0eVxuICAgKCJhZGRyZXNzIikuICBTZWUgYWxzbyB0aGUgZGVzY3JpcHRpb24gb2YgYGBfX2hhc2hfXygpYGAgZm9yIHNvbWVcbiAgIGltcG9ydGFudCBub3RlcyBvbiBjcmVhdGluZyAqaGFzaGFibGUqIG9iamVjdHMgd2hpY2ggc3VwcG9ydCBjdXN0b21cbiAgIGNvbXBhcmlzb24gb3BlcmF0aW9ucyBhbmQgYXJlIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuIChOb3RlOiB0aGVcbiAgIHJlc3RyaWN0aW9uIHRoYXQgZXhjZXB0aW9ucyBhcmUgbm90IHByb3BhZ2F0ZWQgYnkgYGBfX2NtcF9fKClgYCBoYXNcbiAgIGJlZW4gcmVtb3ZlZCBzaW5jZSBQeXRob24gMS41Lilcblxub2JqZWN0Ll9fcmNtcF9fKHNlbGYsIG90aGVyKVxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4xOiBObyBsb25nZXIgc3VwcG9ydGVkLlxuXG5vYmplY3QuX19oYXNoX18oc2VsZilcblxuICAgQ2FsbGVkIGJ5IGJ1aWx0LWluIGZ1bmN0aW9uIGBgaGFzaCgpYGAgYW5kIGZvciBvcGVyYXRpb25zIG9uXG4gICBtZW1iZXJzIG9mIGhhc2hlZCBjb2xsZWN0aW9ucyBpbmNsdWRpbmcgYGBzZXRgYCwgYGBmcm96ZW5zZXRgYCwgYW5kXG4gICBgYGRpY3RgYC4gIGBgX19oYXNoX18oKWBgIHNob3VsZCByZXR1cm4gYW4gaW50ZWdlci4gIFRoZSBvbmx5XG4gICByZXF1aXJlZCBwcm9wZXJ0eSBpcyB0aGF0IG9iamVjdHMgd2hpY2ggY29tcGFyZSBlcXVhbCBoYXZlIHRoZSBzYW1lXG4gICBoYXNoIHZhbHVlOyBpdCBpcyBhZHZpc2VkIHRvIHNvbWVob3cgbWl4IHRvZ2V0aGVyIChlLmcuIHVzaW5nXG4gICBleGNsdXNpdmUgb3IpIHRoZSBoYXNoIHZhbHVlcyBmb3IgdGhlIGNvbXBvbmVudHMgb2YgdGhlIG9iamVjdCB0aGF0XG4gICBhbHNvIHBsYXkgYSBwYXJ0IGluIGNvbXBhcmlzb24gb2Ygb2JqZWN0cy5cblxuICAgSWYgYSBjbGFzcyBkb2VzIG5vdCBkZWZpbmUgYSBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBtZXRob2RcbiAgIGl0IHNob3VsZCBub3QgZGVmaW5lIGEgYGBfX2hhc2hfXygpYGAgb3BlcmF0aW9uIGVpdGhlcjsgaWYgaXRcbiAgIGRlZmluZXMgYGBfX2NtcF9fKClgYCBvciBgYF9fZXFfXygpYGAgYnV0IG5vdCBgYF9faGFzaF9fKClgYCwgaXRzXG4gICBpbnN0YW5jZXMgd2lsbCBub3QgYmUgdXNhYmxlIGluIGhhc2hlZCBjb2xsZWN0aW9ucy4gIElmIGEgY2xhc3NcbiAgIGRlZmluZXMgbXV0YWJsZSBvYmplY3RzIGFuZCBpbXBsZW1lbnRzIGEgYGBfX2NtcF9fKClgYCBvclxuICAgYGBfX2VxX18oKWBgIG1ldGhvZCwgaXQgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYGBfX2hhc2hfXygpYGAsIHNpbmNlXG4gICBoYXNoYWJsZSBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9ucyByZXF1aXJlIHRoYXQgYSBvYmplY3RcJ3MgaGFzaFxuICAgdmFsdWUgaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0XCdzIGhhc2ggdmFsdWUgY2hhbmdlcywgaXQgd2lsbCBiZVxuICAgaW4gdGhlIHdyb25nIGhhc2ggYnVja2V0KS5cblxuICAgVXNlci1kZWZpbmVkIGNsYXNzZXMgaGF2ZSBgYF9fY21wX18oKWBgIGFuZCBgYF9faGFzaF9fKClgYCBtZXRob2RzXG4gICBieSBkZWZhdWx0OyB3aXRoIHRoZW0sIGFsbCBvYmplY3RzIGNvbXBhcmUgdW5lcXVhbCAoZXhjZXB0IHdpdGhcbiAgIHRoZW1zZWx2ZXMpIGFuZCBgYHguX19oYXNoX18oKWBgIHJldHVybnMgYGBpZCh4KWBgLlxuXG4gICBDbGFzc2VzIHdoaWNoIGluaGVyaXQgYSBgYF9faGFzaF9fKClgYCBtZXRob2QgZnJvbSBhIHBhcmVudCBjbGFzc1xuICAgYnV0IGNoYW5nZSB0aGUgbWVhbmluZyBvZiBgYF9fY21wX18oKWBgIG9yIGBgX19lcV9fKClgYCBzdWNoIHRoYXRcbiAgIHRoZSBoYXNoIHZhbHVlIHJldHVybmVkIGlzIG5vIGxvbmdlciBhcHByb3ByaWF0ZSAoZS5nLiBieSBzd2l0Y2hpbmdcbiAgIHRvIGEgdmFsdWUtYmFzZWQgY29uY2VwdCBvZiBlcXVhbGl0eSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0XG4gICBpZGVudGl0eSBiYXNlZCBlcXVhbGl0eSkgY2FuIGV4cGxpY2l0bHkgZmxhZyB0aGVtc2VsdmVzIGFzIGJlaW5nXG4gICB1bmhhc2hhYmxlIGJ5IHNldHRpbmcgYGBfX2hhc2hfXyA9IE5vbmVgYCBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi5cbiAgIERvaW5nIHNvIG1lYW5zIHRoYXQgbm90IG9ubHkgd2lsbCBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIHJhaXNlIGFuXG4gICBhcHByb3ByaWF0ZSBgYFR5cGVFcnJvcmBgIHdoZW4gYSBwcm9ncmFtIGF0dGVtcHRzIHRvIHJldHJpZXZlIHRoZWlyXG4gICBoYXNoIHZhbHVlLCBidXQgdGhleSB3aWxsIGFsc28gYmUgY29ycmVjdGx5IGlkZW50aWZpZWQgYXNcbiAgIHVuaGFzaGFibGUgd2hlbiBjaGVja2luZyBgYGlzaW5zdGFuY2Uob2JqLCBjb2xsZWN0aW9ucy5IYXNoYWJsZSlgYFxuICAgKHVubGlrZSBjbGFzc2VzIHdoaWNoIGRlZmluZSB0aGVpciBvd24gYGBfX2hhc2hfXygpYGAgdG8gZXhwbGljaXRseVxuICAgcmFpc2UgYGBUeXBlRXJyb3JgYCkuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IGBgX19oYXNoX18oKWBgIG1heSBub3cgYWxzbyByZXR1cm4gYSBsb25nXG4gICBpbnRlZ2VyIG9iamVjdDsgdGhlIDMyLWJpdCBpbnRlZ2VyIGlzIHRoZW4gZGVyaXZlZCBmcm9tIHRoZSBoYXNoIG9mXG4gICB0aGF0IG9iamVjdC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNjogYGBfX2hhc2hfX2BgIG1heSBub3cgYmUgc2V0IHRvIGBgTm9uZWBgIHRvXG4gICBleHBsaWNpdGx5IGZsYWcgaW5zdGFuY2VzIG9mIGEgY2xhc3MgYXMgdW5oYXNoYWJsZS5cblxub2JqZWN0Ll9fbm9uemVyb19fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdHJ1dGggdmFsdWUgdGVzdGluZyBhbmQgdGhlIGJ1aWx0LWluIG9wZXJhdGlvblxuICAgYGBib29sKClgYDsgc2hvdWxkIHJldHVybiBgYEZhbHNlYGAgb3IgYGBUcnVlYGAsIG9yIHRoZWlyIGludGVnZXJcbiAgIGVxdWl2YWxlbnRzIGBgMGBgIG9yIGBgMWBgLiAgV2hlbiB0aGlzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCxcbiAgIGBgX19sZW5fXygpYGAgaXMgY2FsbGVkLCBpZiBpdCBpcyBkZWZpbmVkLCBhbmQgdGhlIG9iamVjdCBpc1xuICAgY29uc2lkZXJlZCB0cnVlIGlmIGl0cyByZXN1bHQgaXMgbm9uemVyby4gSWYgYSBjbGFzcyBkZWZpbmVzXG4gICBuZWl0aGVyIGBgX19sZW5fXygpYGAgbm9yIGBgX19ub256ZXJvX18oKWBgLCBhbGwgaXRzIGluc3RhbmNlcyBhcmVcbiAgIGNvbnNpZGVyZWQgdHJ1ZS5cblxub2JqZWN0Ll9fdW5pY29kZV9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgYGB1bmljb2RlKClgYCBidWlsdC1pbjsgc2hvdWxkIHJldHVybiBhIFVuaWNvZGVcbiAgIG9iamVjdC4gV2hlbiB0aGlzIG1ldGhvZCBpcyBub3QgZGVmaW5lZCwgc3RyaW5nIGNvbnZlcnNpb24gaXNcbiAgIGF0dGVtcHRlZCwgYW5kIHRoZSByZXN1bHQgb2Ygc3RyaW5nIGNvbnZlcnNpb24gaXMgY29udmVydGVkIHRvXG4gICBVbmljb2RlIHVzaW5nIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZy5cblxuXG5DdXN0b21pemluZyBhdHRyaWJ1dGUgYWNjZXNzXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBjdXN0b21pemUgdGhlIG1lYW5pbmcgb2ZcbmF0dHJpYnV0ZSBhY2Nlc3MgKHVzZSBvZiwgYXNzaWdubWVudCB0bywgb3IgZGVsZXRpb24gb2YgYGB4Lm5hbWVgYClcbmZvciBjbGFzcyBpbnN0YW5jZXMuXG5cbm9iamVjdC5fX2dldGF0dHJfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgd2hlbiBhbiBhdHRyaWJ1dGUgbG9va3VwIGhhcyBub3QgZm91bmQgdGhlIGF0dHJpYnV0ZSBpbiB0aGVcbiAgIHVzdWFsIHBsYWNlcyAoaS5lLiBpdCBpcyBub3QgYW4gaW5zdGFuY2UgYXR0cmlidXRlIG5vciBpcyBpdCBmb3VuZFxuICAgaW4gdGhlIGNsYXNzIHRyZWUgZm9yIGBgc2VsZmBgKS4gIGBgbmFtZWBgIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZS5cbiAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIChjb21wdXRlZCkgYXR0cmlidXRlIHZhbHVlIG9yIHJhaXNlXG4gICBhbiBgYEF0dHJpYnV0ZUVycm9yYGAgZXhjZXB0aW9uLlxuXG4gICBOb3RlIHRoYXQgaWYgdGhlIGF0dHJpYnV0ZSBpcyBmb3VuZCB0aHJvdWdoIHRoZSBub3JtYWwgbWVjaGFuaXNtLFxuICAgYGBfX2dldGF0dHJfXygpYGAgaXMgbm90IGNhbGxlZC4gIChUaGlzIGlzIGFuIGludGVudGlvbmFsIGFzeW1tZXRyeVxuICAgYmV0d2VlbiBgYF9fZ2V0YXR0cl9fKClgYCBhbmQgYGBfX3NldGF0dHJfXygpYGAuKSBUaGlzIGlzIGRvbmUgYm90aFxuICAgZm9yIGVmZmljaWVuY3kgcmVhc29ucyBhbmQgYmVjYXVzZSBvdGhlcndpc2UgYGBfX2dldGF0dHJfXygpYGBcbiAgIHdvdWxkIGhhdmUgbm8gd2F5IHRvIGFjY2VzcyBvdGhlciBhdHRyaWJ1dGVzIG9mIHRoZSBpbnN0YW5jZS4gIE5vdGVcbiAgIHRoYXQgYXQgbGVhc3QgZm9yIGluc3RhbmNlIHZhcmlhYmxlcywgeW91IGNhbiBmYWtlIHRvdGFsIGNvbnRyb2wgYnlcbiAgIG5vdCBpbnNlcnRpbmcgYW55IHZhbHVlcyBpbiB0aGUgaW5zdGFuY2UgYXR0cmlidXRlIGRpY3Rpb25hcnkgKGJ1dFxuICAgaW5zdGVhZCBpbnNlcnRpbmcgdGhlbSBpbiBhbm90aGVyIG9iamVjdCkuICBTZWUgdGhlXG4gICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIG1ldGhvZCBiZWxvdyBmb3IgYSB3YXkgdG8gYWN0dWFsbHkgZ2V0IHRvdGFsXG4gICBjb250cm9sIGluIG5ldy1zdHlsZSBjbGFzc2VzLlxuXG5vYmplY3QuX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpXG5cbiAgIENhbGxlZCB3aGVuIGFuIGF0dHJpYnV0ZSBhc3NpZ25tZW50IGlzIGF0dGVtcHRlZC4gIFRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgbWVjaGFuaXNtIChpLmUuIHN0b3JlIHRoZSB2YWx1ZSBpbiB0aGVcbiAgIGluc3RhbmNlIGRpY3Rpb25hcnkpLiAgKm5hbWUqIGlzIHRoZSBhdHRyaWJ1dGUgbmFtZSwgKnZhbHVlKiBpcyB0aGVcbiAgIHZhbHVlIHRvIGJlIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBJZiBgYF9fc2V0YXR0cl9fKClgYCB3YW50cyB0byBhc3NpZ24gdG8gYW4gaW5zdGFuY2UgYXR0cmlidXRlLCBpdFxuICAgc2hvdWxkIG5vdCBzaW1wbHkgZXhlY3V0ZSBgYHNlbGYubmFtZSA9IHZhbHVlYGAgLS0tIHRoaXMgd291bGRcbiAgIGNhdXNlIGEgcmVjdXJzaXZlIGNhbGwgdG8gaXRzZWxmLiAgSW5zdGVhZCwgaXQgc2hvdWxkIGluc2VydCB0aGVcbiAgIHZhbHVlIGluIHRoZSBkaWN0aW9uYXJ5IG9mIGluc3RhbmNlIGF0dHJpYnV0ZXMsIGUuZy4sXG4gICBgYHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZWBgLiAgRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCByYXRoZXJcbiAgIHRoYW4gYWNjZXNzaW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5LCBpdCBzaG91bGQgY2FsbCB0aGUgYmFzZVxuICAgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSwgZm9yIGV4YW1wbGUsXG4gICBgYG9iamVjdC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSlgYC5cblxub2JqZWN0Ll9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpXG5cbiAgIExpa2UgYGBfX3NldGF0dHJfXygpYGAgYnV0IGZvciBhdHRyaWJ1dGUgZGVsZXRpb24gaW5zdGVhZCBvZlxuICAgYXNzaWdubWVudC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW1wbGVtZW50ZWQgaWYgYGBkZWwgb2JqLm5hbWVgYCBpc1xuICAgbWVhbmluZ2Z1bCBmb3IgdGhlIG9iamVjdC5cblxuXG5Nb3JlIGF0dHJpYnV0ZSBhY2Nlc3MgZm9yIG5ldy1zdHlsZSBjbGFzc2VzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHRvIG5ldy1zdHlsZSBjbGFzc2VzLlxuXG5vYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKVxuXG4gICBDYWxsZWQgdW5jb25kaXRpb25hbGx5IHRvIGltcGxlbWVudCBhdHRyaWJ1dGUgYWNjZXNzZXMgZm9yXG4gICBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzLiBJZiB0aGUgY2xhc3MgYWxzbyBkZWZpbmVzXG4gICBgYF9fZ2V0YXR0cl9fKClgYCwgdGhlIGxhdHRlciB3aWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzXG4gICBgYF9fZ2V0YXR0cmlidXRlX18oKWBgIGVpdGhlciBjYWxscyBpdCBleHBsaWNpdGx5IG9yIHJhaXNlcyBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSAoY29tcHV0ZWQpXG4gICBhdHRyaWJ1dGUgdmFsdWUgb3IgcmFpc2UgYW4gYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi4gSW4gb3JkZXJcbiAgIHRvIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBpbiB0aGlzIG1ldGhvZCwgaXRzIGltcGxlbWVudGF0aW9uXG4gICBzaG91bGQgYWx3YXlzIGNhbGwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZSB0b1xuICAgYWNjZXNzIGFueSBhdHRyaWJ1dGVzIGl0IG5lZWRzLCBmb3IgZXhhbXBsZSxcbiAgIGBgb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSlgYC5cblxuICAgTm90ZTogVGhpcyBtZXRob2QgbWF5IHN0aWxsIGJlIGJ5cGFzc2VkIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHNcbiAgICAgYXMgdGhlIHJlc3VsdCBvZiBpbXBsaWNpdCBpbnZvY2F0aW9uIHZpYSBsYW5ndWFnZSBzeW50YXggb3JcbiAgICAgYnVpbHQtaW4gZnVuY3Rpb25zLiBTZWUgKlNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3IgbmV3LXN0eWxlXG4gICAgIGNsYXNzZXMqLlxuXG5cbkltcGxlbWVudGluZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbmx5IGFwcGx5IHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzXG5jb250YWluaW5nIHRoZSBtZXRob2QgKGEgc28tY2FsbGVkICpkZXNjcmlwdG9yKiBjbGFzcykgYXBwZWFycyBpbiBhblxuKm93bmVyKiBjbGFzcyAodGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBpbiBlaXRoZXIgdGhlIG93bmVyXCdzIGNsYXNzXG5kaWN0aW9uYXJ5IG9yIGluIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGZvciBvbmUgb2YgaXRzIHBhcmVudHMpLiAgSW4gdGhlXG5leGFtcGxlcyBiZWxvdywgInRoZSBhdHRyaWJ1dGUiIHJlZmVycyB0byB0aGUgYXR0cmlidXRlIHdob3NlIG5hbWUgaXNcbnRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IGluIHRoZSBvd25lciBjbGFzc1wnIGBgX19kaWN0X19gYC5cblxub2JqZWN0Ll9fZ2V0X18oc2VsZiwgaW5zdGFuY2UsIG93bmVyKVxuXG4gICBDYWxsZWQgdG8gZ2V0IHRoZSBhdHRyaWJ1dGUgb2YgdGhlIG93bmVyIGNsYXNzIChjbGFzcyBhdHRyaWJ1dGVcbiAgIGFjY2Vzcykgb3Igb2YgYW4gaW5zdGFuY2Ugb2YgdGhhdCBjbGFzcyAoaW5zdGFuY2UgYXR0cmlidXRlXG4gICBhY2Nlc3MpLiAqb3duZXIqIGlzIGFsd2F5cyB0aGUgb3duZXIgY2xhc3MsIHdoaWxlICppbnN0YW5jZSogaXMgdGhlXG4gICBpbnN0YW5jZSB0aGF0IHRoZSBhdHRyaWJ1dGUgd2FzIGFjY2Vzc2VkIHRocm91Z2gsIG9yIGBgTm9uZWBgIHdoZW5cbiAgIHRoZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgKm93bmVyKi4gIFRoaXMgbWV0aG9kIHNob3VsZFxuICAgcmV0dXJuIHRoZSAoY29tcHV0ZWQpIGF0dHJpYnV0ZSB2YWx1ZSBvciByYWlzZSBhblxuICAgYGBBdHRyaWJ1dGVFcnJvcmBgIGV4Y2VwdGlvbi5cblxub2JqZWN0Ll9fc2V0X18oc2VsZiwgaW5zdGFuY2UsIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gc2V0IHRoZSBhdHRyaWJ1dGUgb24gYW4gaW5zdGFuY2UgKmluc3RhbmNlKiBvZiB0aGUgb3duZXJcbiAgIGNsYXNzIHRvIGEgbmV3IHZhbHVlLCAqdmFsdWUqLlxuXG5vYmplY3QuX19kZWxldGVfXyhzZWxmLCBpbnN0YW5jZSlcblxuICAgQ2FsbGVkIHRvIGRlbGV0ZSB0aGUgYXR0cmlidXRlIG9uIGFuIGluc3RhbmNlICppbnN0YW5jZSogb2YgdGhlXG4gICBvd25lciBjbGFzcy5cblxuXG5JbnZva2luZyBEZXNjcmlwdG9yc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuSW4gZ2VuZXJhbCwgYSBkZXNjcmlwdG9yIGlzIGFuIG9iamVjdCBhdHRyaWJ1dGUgd2l0aCAiYmluZGluZ1xuYmVoYXZpb3IiLCBvbmUgd2hvc2UgYXR0cmlidXRlIGFjY2VzcyBoYXMgYmVlbiBvdmVycmlkZGVuIGJ5IG1ldGhvZHNcbmluIHRoZSBkZXNjcmlwdG9yIHByb3RvY29sOiAgYGBfX2dldF9fKClgYCwgYGBfX3NldF9fKClgYCwgYW5kXG5gYF9fZGVsZXRlX18oKWBgLiBJZiBhbnkgb2YgdGhvc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgYW4gb2JqZWN0LFxuaXQgaXMgc2FpZCB0byBiZSBhIGRlc2NyaXB0b3IuXG5cblRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBhdHRyaWJ1dGUgYWNjZXNzIGlzIHRvIGdldCwgc2V0LCBvciBkZWxldGVcbnRoZSBhdHRyaWJ1dGUgZnJvbSBhbiBvYmplY3RcJ3MgZGljdGlvbmFyeS4gRm9yIGluc3RhbmNlLCBgYGEueGBgIGhhcyBhXG5sb29rdXAgY2hhaW4gc3RhcnRpbmcgd2l0aCBgYGEuX19kaWN0X19bXCd4XCddYGAsIHRoZW5cbmBgdHlwZShhKS5fX2RpY3RfX1tcJ3hcJ11gYCwgYW5kIGNvbnRpbnVpbmcgdGhyb3VnaCB0aGUgYmFzZSBjbGFzc2VzIG9mXG5gYHR5cGUoYSlgYCBleGNsdWRpbmcgbWV0YWNsYXNzZXMuXG5cbkhvd2V2ZXIsIGlmIHRoZSBsb29rZWQtdXAgdmFsdWUgaXMgYW4gb2JqZWN0IGRlZmluaW5nIG9uZSBvZiB0aGVcbmRlc2NyaXB0b3IgbWV0aG9kcywgdGhlbiBQeXRob24gbWF5IG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZFxuaW52b2tlIHRoZSBkZXNjcmlwdG9yIG1ldGhvZCBpbnN0ZWFkLiAgV2hlcmUgdGhpcyBvY2N1cnMgaW4gdGhlXG5wcmVjZWRlbmNlIGNoYWluIGRlcGVuZHMgb24gd2hpY2ggZGVzY3JpcHRvciBtZXRob2RzIHdlcmUgZGVmaW5lZCBhbmRcbmhvdyB0aGV5IHdlcmUgY2FsbGVkLiAgTm90ZSB0aGF0IGRlc2NyaXB0b3JzIGFyZSBvbmx5IGludm9rZWQgZm9yIG5ld1xuc3R5bGUgb2JqZWN0cyBvciBjbGFzc2VzIChvbmVzIHRoYXQgc3ViY2xhc3MgYGBvYmplY3QoKWBgIG9yXG5gYHR5cGUoKWBgKS5cblxuVGhlIHN0YXJ0aW5nIHBvaW50IGZvciBkZXNjcmlwdG9yIGludm9jYXRpb24gaXMgYSBiaW5kaW5nLCBgYGEueGBgLlxuSG93IHRoZSBhcmd1bWVudHMgYXJlIGFzc2VtYmxlZCBkZXBlbmRzIG9uIGBgYWBgOlxuXG5EaXJlY3QgQ2FsbFxuICAgVGhlIHNpbXBsZXN0IGFuZCBsZWFzdCBjb21tb24gY2FsbCBpcyB3aGVuIHVzZXIgY29kZSBkaXJlY3RseVxuICAgaW52b2tlcyBhIGRlc2NyaXB0b3IgbWV0aG9kOiAgICBgYHguX19nZXRfXyhhKWBgLlxuXG5JbnN0YW5jZSBCaW5kaW5nXG4gICBJZiBiaW5kaW5nIHRvIGEgbmV3LXN0eWxlIG9iamVjdCBpbnN0YW5jZSwgYGBhLnhgYCBpcyB0cmFuc2Zvcm1lZFxuICAgaW50byB0aGUgY2FsbDogYGB0eXBlKGEpLl9fZGljdF9fW1wneFwnXS5fX2dldF9fKGEsIHR5cGUoYSkpYGAuXG5cbkNsYXNzIEJpbmRpbmdcbiAgIElmIGJpbmRpbmcgdG8gYSBuZXctc3R5bGUgY2xhc3MsIGBgQS54YGAgaXMgdHJhbnNmb3JtZWQgaW50byB0aGVcbiAgIGNhbGw6IGBgQS5fX2RpY3RfX1tcJ3hcJ10uX19nZXRfXyhOb25lLCBBKWBgLlxuXG5TdXBlciBCaW5kaW5nXG4gICBJZiBgYGFgYCBpcyBhbiBpbnN0YW5jZSBvZiBgYHN1cGVyYGAsIHRoZW4gdGhlIGJpbmRpbmcgYGBzdXBlcihCLFxuICAgb2JqKS5tKClgYCBzZWFyY2hlcyBgYG9iai5fX2NsYXNzX18uX19tcm9fX2BgIGZvciB0aGUgYmFzZSBjbGFzc1xuICAgYGBBYGAgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIGBgQmBgIGFuZCB0aGVuIGludm9rZXMgdGhlIGRlc2NyaXB0b3JcbiAgIHdpdGggdGhlIGNhbGw6IGBgQS5fX2RpY3RfX1tcJ21cJ10uX19nZXRfXyhvYmosIG9iai5fX2NsYXNzX18pYGAuXG5cbkZvciBpbnN0YW5jZSBiaW5kaW5ncywgdGhlIHByZWNlZGVuY2Ugb2YgZGVzY3JpcHRvciBpbnZvY2F0aW9uIGRlcGVuZHNcbm9uIHRoZSB3aGljaCBkZXNjcmlwdG9yIG1ldGhvZHMgYXJlIGRlZmluZWQuICBBIGRlc2NyaXB0b3IgY2FuIGRlZmluZVxuYW55IGNvbWJpbmF0aW9uIG9mIGBgX19nZXRfXygpYGAsIGBgX19zZXRfXygpYGAgYW5kIGBgX19kZWxldGVfXygpYGAuXG5JZiBpdCBkb2VzIG5vdCBkZWZpbmUgYGBfX2dldF9fKClgYCwgdGhlbiBhY2Nlc3NpbmcgdGhlIGF0dHJpYnV0ZSB3aWxsXG5yZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2JqZWN0IGl0c2VsZiB1bmxlc3MgdGhlcmUgaXMgYSB2YWx1ZSBpbiB0aGVcbm9iamVjdFwncyBpbnN0YW5jZSBkaWN0aW9uYXJ5LiAgSWYgdGhlIGRlc2NyaXB0b3IgZGVmaW5lcyBgYF9fc2V0X18oKWBgXG5hbmQvb3IgYGBfX2RlbGV0ZV9fKClgYCwgaXQgaXMgYSBkYXRhIGRlc2NyaXB0b3I7IGlmIGl0IGRlZmluZXNcbm5laXRoZXIsIGl0IGlzIGEgbm9uLWRhdGEgZGVzY3JpcHRvci4gIE5vcm1hbGx5LCBkYXRhIGRlc2NyaXB0b3JzXG5kZWZpbmUgYm90aCBgYF9fZ2V0X18oKWBgIGFuZCBgYF9fc2V0X18oKWBgLCB3aGlsZSBub24tZGF0YVxuZGVzY3JpcHRvcnMgaGF2ZSBqdXN0IHRoZSBgYF9fZ2V0X18oKWBgIG1ldGhvZC4gIERhdGEgZGVzY3JpcHRvcnMgd2l0aFxuYGBfX3NldF9fKClgYCBhbmQgYGBfX2dldF9fKClgYCBkZWZpbmVkIGFsd2F5cyBvdmVycmlkZSBhIHJlZGVmaW5pdGlvblxuaW4gYW4gaW5zdGFuY2UgZGljdGlvbmFyeS4gIEluIGNvbnRyYXN0LCBub24tZGF0YSBkZXNjcmlwdG9ycyBjYW4gYmVcbm92ZXJyaWRkZW4gYnkgaW5zdGFuY2VzLlxuXG5QeXRob24gbWV0aG9kcyAoaW5jbHVkaW5nIGBgc3RhdGljbWV0aG9kKClgYCBhbmQgYGBjbGFzc21ldGhvZCgpYGApXG5hcmUgaW1wbGVtZW50ZWQgYXMgbm9uLWRhdGEgZGVzY3JpcHRvcnMuICBBY2NvcmRpbmdseSwgaW5zdGFuY2VzIGNhblxucmVkZWZpbmUgYW5kIG92ZXJyaWRlIG1ldGhvZHMuICBUaGlzIGFsbG93cyBpbmRpdmlkdWFsIGluc3RhbmNlcyB0b1xuYWNxdWlyZSBiZWhhdmlvcnMgdGhhdCBkaWZmZXIgZnJvbSBvdGhlciBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgY2xhc3MuXG5cblRoZSBgYHByb3BlcnR5KClgYCBmdW5jdGlvbiBpcyBpbXBsZW1lbnRlZCBhcyBhIGRhdGEgZGVzY3JpcHRvci5cbkFjY29yZGluZ2x5LCBpbnN0YW5jZXMgY2Fubm90IG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBhIHByb3BlcnR5LlxuXG5cbl9fc2xvdHNfX1xuLS0tLS0tLS0tXG5cbkJ5IGRlZmF1bHQsIGluc3RhbmNlcyBvZiBib3RoIG9sZCBhbmQgbmV3LXN0eWxlIGNsYXNzZXMgaGF2ZSBhXG5kaWN0aW9uYXJ5IGZvciBhdHRyaWJ1dGUgc3RvcmFnZS4gIFRoaXMgd2FzdGVzIHNwYWNlIGZvciBvYmplY3RzXG5oYXZpbmcgdmVyeSBmZXcgaW5zdGFuY2UgdmFyaWFibGVzLiAgVGhlIHNwYWNlIGNvbnN1bXB0aW9uIGNhbiBiZWNvbWVcbmFjdXRlIHdoZW4gY3JlYXRpbmcgbGFyZ2UgbnVtYmVycyBvZiBpbnN0YW5jZXMuXG5cblRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJ5IGRlZmluaW5nICpfX3Nsb3RzX18qIGluIGEgbmV3LXN0eWxlXG5jbGFzcyBkZWZpbml0aW9uLiAgVGhlICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHRha2VzIGEgc2VxdWVuY2Ugb2Zcbmluc3RhbmNlIHZhcmlhYmxlcyBhbmQgcmVzZXJ2ZXMganVzdCBlbm91Z2ggc3BhY2UgaW4gZWFjaCBpbnN0YW5jZSB0b1xuaG9sZCBhIHZhbHVlIGZvciBlYWNoIHZhcmlhYmxlLiAgU3BhY2UgaXMgc2F2ZWQgYmVjYXVzZSAqX19kaWN0X18qIGlzXG5ub3QgY3JlYXRlZCBmb3IgZWFjaCBpbnN0YW5jZS5cblxuX19zbG90c19fXG5cbiAgIFRoaXMgY2xhc3MgdmFyaWFibGUgY2FuIGJlIGFzc2lnbmVkIGEgc3RyaW5nLCBpdGVyYWJsZSwgb3Igc2VxdWVuY2VcbiAgIG9mIHN0cmluZ3Mgd2l0aCB2YXJpYWJsZSBuYW1lcyB1c2VkIGJ5IGluc3RhbmNlcy4gIElmIGRlZmluZWQgaW4gYVxuICAgbmV3LXN0eWxlIGNsYXNzLCAqX19zbG90c19fKiByZXNlcnZlcyBzcGFjZSBmb3IgdGhlIGRlY2xhcmVkXG4gICB2YXJpYWJsZXMgYW5kIHByZXZlbnRzIHRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgKl9fZGljdF9fKiBhbmRcbiAgICpfX3dlYWtyZWZfXyogZm9yIGVhY2ggaW5zdGFuY2UuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuTm90ZXMgb24gdXNpbmcgKl9fc2xvdHNfXypcblxuKiBXaGVuIGluaGVyaXRpbmcgZnJvbSBhIGNsYXNzIHdpdGhvdXQgKl9fc2xvdHNfXyosIHRoZSAqX19kaWN0X18qXG4gIGF0dHJpYnV0ZSBvZiB0aGF0IGNsYXNzIHdpbGwgYWx3YXlzIGJlIGFjY2Vzc2libGUsIHNvIGEgKl9fc2xvdHNfXypcbiAgZGVmaW5pdGlvbiBpbiB0aGUgc3ViY2xhc3MgaXMgbWVhbmluZ2xlc3MuXG5cbiogV2l0aG91dCBhICpfX2RpY3RfXyogdmFyaWFibGUsIGluc3RhbmNlcyBjYW5ub3QgYmUgYXNzaWduZWQgbmV3XG4gIHZhcmlhYmxlcyBub3QgbGlzdGVkIGluIHRoZSAqX19zbG90c19fKiBkZWZpbml0aW9uLiAgQXR0ZW1wdHMgdG9cbiAgYXNzaWduIHRvIGFuIHVubGlzdGVkIHZhcmlhYmxlIG5hbWUgcmFpc2VzIGBgQXR0cmlidXRlRXJyb3JgYC4gSWZcbiAgZHluYW1pYyBhc3NpZ25tZW50IG9mIG5ldyB2YXJpYWJsZXMgaXMgZGVzaXJlZCwgdGhlbiBhZGRcbiAgYGBcJ19fZGljdF9fXCdgYCB0byB0aGUgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXypcbiAgZGVjbGFyYXRpb24uXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgXCdfX2RpY3RfX1wnYGAgdG8gdGhlXG4gICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgdGhlIGFzc2lnbm1lbnQgb2YgbmV3XG4gIGF0dHJpYnV0ZXMgbm90IHNwZWNpZmljYWxseSBsaXN0ZWQgaW4gdGhlIHNlcXVlbmNlIG9mIGluc3RhbmNlXG4gIHZhcmlhYmxlIG5hbWVzLlxuXG4qIFdpdGhvdXQgYSAqX193ZWFrcmVmX18qIHZhcmlhYmxlIGZvciBlYWNoIGluc3RhbmNlLCBjbGFzc2VzIGRlZmluaW5nXG4gICpfX3Nsb3RzX18qIGRvIG5vdCBzdXBwb3J0IHdlYWsgcmVmZXJlbmNlcyB0byBpdHMgaW5zdGFuY2VzLiBJZiB3ZWFrXG4gIHJlZmVyZW5jZSBzdXBwb3J0IGlzIG5lZWRlZCwgdGhlbiBhZGQgYGBcJ19fd2Vha3JlZl9fXCdgYCB0byB0aGVcbiAgc2VxdWVuY2Ugb2Ygc3RyaW5ncyBpbiB0aGUgKl9fc2xvdHNfXyogZGVjbGFyYXRpb24uXG5cbiAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYWRkaW5nIGBgXCdfX3dlYWtyZWZfX1wnYGAgdG8gdGhlXG4gICpfX3Nsb3RzX18qIGRlY2xhcmF0aW9uIHdvdWxkIG5vdCBlbmFibGUgc3VwcG9ydCBmb3Igd2Vha1xuICByZWZlcmVuY2VzLlxuXG4qICpfX3Nsb3RzX18qIGFyZSBpbXBsZW1lbnRlZCBhdCB0aGUgY2xhc3MgbGV2ZWwgYnkgY3JlYXRpbmdcbiAgZGVzY3JpcHRvcnMgKCpJbXBsZW1lbnRpbmcgRGVzY3JpcHRvcnMqKSBmb3IgZWFjaCB2YXJpYWJsZSBuYW1lLiAgQXNcbiAgYSByZXN1bHQsIGNsYXNzIGF0dHJpYnV0ZXMgY2Fubm90IGJlIHVzZWQgdG8gc2V0IGRlZmF1bHQgdmFsdWVzIGZvclxuICBpbnN0YW5jZSB2YXJpYWJsZXMgZGVmaW5lZCBieSAqX19zbG90c19fKjsgb3RoZXJ3aXNlLCB0aGUgY2xhc3NcbiAgYXR0cmlidXRlIHdvdWxkIG92ZXJ3cml0ZSB0aGUgZGVzY3JpcHRvciBhc3NpZ25tZW50LlxuXG4qIFRoZSBhY3Rpb24gb2YgYSAqX19zbG90c19fKiBkZWNsYXJhdGlvbiBpcyBsaW1pdGVkIHRvIHRoZSBjbGFzc1xuICB3aGVyZSBpdCBpcyBkZWZpbmVkLiAgQXMgYSByZXN1bHQsIHN1YmNsYXNzZXMgd2lsbCBoYXZlIGEgKl9fZGljdF9fKlxuICB1bmxlc3MgdGhleSBhbHNvIGRlZmluZSAqX19zbG90c19fKiAod2hpY2ggbXVzdCBvbmx5IGNvbnRhaW4gbmFtZXNcbiAgb2YgYW55ICphZGRpdGlvbmFsKiBzbG90cykuXG5cbiogSWYgYSBjbGFzcyBkZWZpbmVzIGEgc2xvdCBhbHNvIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLCB0aGUgaW5zdGFuY2VcbiAgdmFyaWFibGUgZGVmaW5lZCBieSB0aGUgYmFzZSBjbGFzcyBzbG90IGlzIGluYWNjZXNzaWJsZSAoZXhjZXB0IGJ5XG4gIHJldHJpZXZpbmcgaXRzIGRlc2NyaXB0b3IgZGlyZWN0bHkgZnJvbSB0aGUgYmFzZSBjbGFzcykuIFRoaXNcbiAgcmVuZGVycyB0aGUgbWVhbmluZyBvZiB0aGUgcHJvZ3JhbSB1bmRlZmluZWQuICBJbiB0aGUgZnV0dXJlLCBhXG4gIGNoZWNrIG1heSBiZSBhZGRlZCB0byBwcmV2ZW50IHRoaXMuXG5cbiogTm9uZW1wdHkgKl9fc2xvdHNfXyogZG9lcyBub3Qgd29yayBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb21cbiAgInZhcmlhYmxlLWxlbmd0aCIgYnVpbHQtaW4gdHlwZXMgc3VjaCBhcyBgYGxvbmdgYCwgYGBzdHJgYCBhbmRcbiAgYGB0dXBsZWBgLlxuXG4qIEFueSBub24tc3RyaW5nIGl0ZXJhYmxlIG1heSBiZSBhc3NpZ25lZCB0byAqX19zbG90c19fKi4gTWFwcGluZ3MgbWF5XG4gIGFsc28gYmUgdXNlZDsgaG93ZXZlciwgaW4gdGhlIGZ1dHVyZSwgc3BlY2lhbCBtZWFuaW5nIG1heSBiZVxuICBhc3NpZ25lZCB0byB0aGUgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBrZXkuXG5cbiogKl9fY2xhc3NfXyogYXNzaWdubWVudCB3b3JrcyBvbmx5IGlmIGJvdGggY2xhc3NlcyBoYXZlIHRoZSBzYW1lXG4gICpfX3Nsb3RzX18qLlxuXG4gIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IFByZXZpb3VzbHksICpfX2NsYXNzX18qIGFzc2lnbm1lbnQgcmFpc2VkIGFuXG4gIGVycm9yIGlmIGVpdGhlciBuZXcgb3Igb2xkIGNsYXNzIGhhZCAqX19zbG90c19fKi5cblxuXG5DdXN0b21pemluZyBjbGFzcyBjcmVhdGlvblxuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuQnkgZGVmYXVsdCwgbmV3LXN0eWxlIGNsYXNzZXMgYXJlIGNvbnN0cnVjdGVkIHVzaW5nIGBgdHlwZSgpYGAuIEFcbmNsYXNzIGRlZmluaXRpb24gaXMgcmVhZCBpbnRvIGEgc2VwYXJhdGUgbmFtZXNwYWNlIGFuZCB0aGUgdmFsdWUgb2ZcbmNsYXNzIG5hbWUgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiBgYHR5cGUobmFtZSwgYmFzZXMsIGRpY3QpYGAuXG5cbldoZW4gdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgcmVhZCwgaWYgKl9fbWV0YWNsYXNzX18qIGlzIGRlZmluZWQgdGhlblxudGhlIGNhbGxhYmxlIGFzc2lnbmVkIHRvIGl0IHdpbGwgYmUgY2FsbGVkIGluc3RlYWQgb2YgYGB0eXBlKClgYC4gVGhpc1xuYWxsb3dzIGNsYXNzZXMgb3IgZnVuY3Rpb25zIHRvIGJlIHdyaXR0ZW4gd2hpY2ggbW9uaXRvciBvciBhbHRlciB0aGVcbmNsYXNzIGNyZWF0aW9uIHByb2Nlc3M6XG5cbiogTW9kaWZ5aW5nIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IHByaW9yIHRvIHRoZSBjbGFzcyBiZWluZyBjcmVhdGVkLlxuXG4qIFJldHVybmluZyBhbiBpbnN0YW5jZSBvZiBhbm90aGVyIGNsYXNzIC0tIGVzc2VudGlhbGx5IHBlcmZvcm1pbmcgdGhlXG4gIHJvbGUgb2YgYSBmYWN0b3J5IGZ1bmN0aW9uLlxuXG5UaGVzZSBzdGVwcyB3aWxsIGhhdmUgdG8gYmUgcGVyZm9ybWVkIGluIHRoZSBtZXRhY2xhc3NcJ3MgYGBfX25ld19fKClgYFxubWV0aG9kIC0tIGBgdHlwZS5fX25ld19fKClgYCBjYW4gdGhlbiBiZSBjYWxsZWQgZnJvbSB0aGlzIG1ldGhvZCB0b1xuY3JlYXRlIGEgY2xhc3Mgd2l0aCBkaWZmZXJlbnQgcHJvcGVydGllcy4gIFRoaXMgZXhhbXBsZSBhZGRzIGEgbmV3XG5lbGVtZW50IHRvIHRoZSBjbGFzcyBkaWN0aW9uYXJ5IGJlZm9yZSBjcmVhdGluZyB0aGUgY2xhc3M6XG5cbiAgIGNsYXNzIG1ldGFjbHModHlwZSk6XG4gICAgICAgZGVmIF9fbmV3X18obWNzLCBuYW1lLCBiYXNlcywgZGljdCk6XG4gICAgICAgICAgIGRpY3RbXCdmb29cJ10gPSBcJ21ldGFjbHMgd2FzIGhlcmVcJ1xuICAgICAgICAgICByZXR1cm4gdHlwZS5fX25ld19fKG1jcywgbmFtZSwgYmFzZXMsIGRpY3QpXG5cbllvdSBjYW4gb2YgY291cnNlIGFsc28gb3ZlcnJpZGUgb3RoZXIgY2xhc3MgbWV0aG9kcyAob3IgYWRkIG5ld1xubWV0aG9kcyk7IGZvciBleGFtcGxlIGRlZmluaW5nIGEgY3VzdG9tIGBgX19jYWxsX18oKWBgIG1ldGhvZCBpbiB0aGVcbm1ldGFjbGFzcyBhbGxvd3MgY3VzdG9tIGJlaGF2aW9yIHdoZW4gdGhlIGNsYXNzIGlzIGNhbGxlZCwgZS5nLiBub3RcbmFsd2F5cyBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZS5cblxuX19tZXRhY2xhc3NfX1xuXG4gICBUaGlzIHZhcmlhYmxlIGNhbiBiZSBhbnkgY2FsbGFibGUgYWNjZXB0aW5nIGFyZ3VtZW50cyBmb3IgYGBuYW1lYGAsXG4gICBgYGJhc2VzYGAsIGFuZCBgYGRpY3RgYC4gIFVwb24gY2xhc3MgY3JlYXRpb24sIHRoZSBjYWxsYWJsZSBpcyB1c2VkXG4gICBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBgYHR5cGUoKWBgLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cblRoZSBhcHByb3ByaWF0ZSBtZXRhY2xhc3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIHByZWNlZGVuY2VcbnJ1bGVzOlxuXG4qIElmIGBgZGljdFtcJ19fbWV0YWNsYXNzX19cJ11gYCBleGlzdHMsIGl0IGlzIHVzZWQuXG5cbiogT3RoZXJ3aXNlLCBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYmFzZSBjbGFzcywgaXRzIG1ldGFjbGFzcyBpc1xuICB1c2VkICh0aGlzIGxvb2tzIGZvciBhICpfX2NsYXNzX18qIGF0dHJpYnV0ZSBmaXJzdCBhbmQgaWYgbm90IGZvdW5kLFxuICB1c2VzIGl0cyB0eXBlKS5cblxuKiBPdGhlcndpc2UsIGlmIGEgZ2xvYmFsIHZhcmlhYmxlIG5hbWVkIF9fbWV0YWNsYXNzX18gZXhpc3RzLCBpdCBpc1xuICB1c2VkLlxuXG4qIE90aGVyd2lzZSwgdGhlIG9sZC1zdHlsZSwgY2xhc3NpYyBtZXRhY2xhc3MgKHR5cGVzLkNsYXNzVHlwZSkgaXNcbiAgdXNlZC5cblxuVGhlIHBvdGVudGlhbCB1c2VzIGZvciBtZXRhY2xhc3NlcyBhcmUgYm91bmRsZXNzLiBTb21lIGlkZWFzIHRoYXQgaGF2ZVxuYmVlbiBleHBsb3JlZCBpbmNsdWRpbmcgbG9nZ2luZywgaW50ZXJmYWNlIGNoZWNraW5nLCBhdXRvbWF0aWNcbmRlbGVnYXRpb24sIGF1dG9tYXRpYyBwcm9wZXJ0eSBjcmVhdGlvbiwgcHJveGllcywgZnJhbWV3b3JrcywgYW5kXG5hdXRvbWF0aWMgcmVzb3VyY2UgbG9ja2luZy9zeW5jaHJvbml6YXRpb24uXG5cblxuQ3VzdG9taXppbmcgaW5zdGFuY2UgYW5kIHN1YmNsYXNzIGNoZWNrc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5OZXcgaW4gdmVyc2lvbiAyLjYuXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGVcbmBgaXNpbnN0YW5jZSgpYGAgYW5kIGBgaXNzdWJjbGFzcygpYGAgYnVpbHQtaW4gZnVuY3Rpb25zLlxuXG5JbiBwYXJ0aWN1bGFyLCB0aGUgbWV0YWNsYXNzIGBgYWJjLkFCQ01ldGFgYCBpbXBsZW1lbnRzIHRoZXNlIG1ldGhvZHNcbmluIG9yZGVyIHRvIGFsbG93IHRoZSBhZGRpdGlvbiBvZiBBYnN0cmFjdCBCYXNlIENsYXNzZXMgKEFCQ3MpIGFzXG4idmlydHVhbCBiYXNlIGNsYXNzZXMiIHRvIGFueSBjbGFzcyBvciB0eXBlIChpbmNsdWRpbmcgYnVpbHQtaW5cbnR5cGVzKSwgaW5jbHVkaW5nIG90aGVyIEFCQ3MuXG5cbmNsYXNzLl9faW5zdGFuY2VjaGVja19fKHNlbGYsIGluc3RhbmNlKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiAqaW5zdGFuY2UqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvclxuICAgaW5kaXJlY3QpIGluc3RhbmNlIG9mICpjbGFzcyouIElmIGRlZmluZWQsIGNhbGxlZCB0byBpbXBsZW1lbnRcbiAgIGBgaXNpbnN0YW5jZShpbnN0YW5jZSwgY2xhc3MpYGAuXG5cbmNsYXNzLl9fc3ViY2xhc3NjaGVja19fKHNlbGYsIHN1YmNsYXNzKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiAqc3ViY2xhc3MqIHNob3VsZCBiZSBjb25zaWRlcmVkIGEgKGRpcmVjdCBvclxuICAgaW5kaXJlY3QpIHN1YmNsYXNzIG9mICpjbGFzcyouICBJZiBkZWZpbmVkLCBjYWxsZWQgdG8gaW1wbGVtZW50XG4gICBgYGlzc3ViY2xhc3Moc3ViY2xhc3MsIGNsYXNzKWBgLlxuXG5Ob3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgbG9va2VkIHVwIG9uIHRoZSB0eXBlIChtZXRhY2xhc3MpIG9mIGFcbmNsYXNzLiAgVGhleSBjYW5ub3QgYmUgZGVmaW5lZCBhcyBjbGFzcyBtZXRob2RzIGluIHRoZSBhY3R1YWwgY2xhc3MuXG5UaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCB0aGUgbG9va3VwIG9mIHNwZWNpYWwgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWRcbm9uIGluc3RhbmNlcywgb25seSBpbiB0aGlzIGNhc2UgdGhlIGluc3RhbmNlIGlzIGl0c2VsZiBhIGNsYXNzLlxuXG5TZWUgYWxzbzpcblxuICAgKipQRVAgMzExOSoqIC0gSW50cm9kdWNpbmcgQWJzdHJhY3QgQmFzZSBDbGFzc2VzXG4gICAgICBJbmNsdWRlcyB0aGUgc3BlY2lmaWNhdGlvbiBmb3IgY3VzdG9taXppbmcgYGBpc2luc3RhbmNlKClgYCBhbmRcbiAgICAgIGBgaXNzdWJjbGFzcygpYGAgYmVoYXZpb3IgdGhyb3VnaCBgYF9faW5zdGFuY2VjaGVja19fKClgYCBhbmRcbiAgICAgIGBgX19zdWJjbGFzc2NoZWNrX18oKWBgLCB3aXRoIG1vdGl2YXRpb24gZm9yIHRoaXMgZnVuY3Rpb25hbGl0eVxuICAgICAgaW4gdGhlIGNvbnRleHQgb2YgYWRkaW5nIEFic3RyYWN0IEJhc2UgQ2xhc3NlcyAoc2VlIHRoZSBgYGFiY2BgXG4gICAgICBtb2R1bGUpIHRvIHRoZSBsYW5ndWFnZS5cblxuXG5FbXVsYXRpbmcgY2FsbGFibGUgb2JqZWN0c1xuPT09PT09PT09PT09PT09PT09PT09PT09PT1cblxub2JqZWN0Ll9fY2FsbF9fKHNlbGZbLCBhcmdzLi4uXSlcblxuICAgQ2FsbGVkIHdoZW4gdGhlIGluc3RhbmNlIGlzICJjYWxsZWQiIGFzIGEgZnVuY3Rpb247IGlmIHRoaXMgbWV0aG9kXG4gICBpcyBkZWZpbmVkLCBgYHgoYXJnMSwgYXJnMiwgLi4uKWBgIGlzIGEgc2hvcnRoYW5kIGZvclxuICAgYGB4Ll9fY2FsbF9fKGFyZzEsIGFyZzIsIC4uLilgYC5cblxuXG5FbXVsYXRpbmcgY29udGFpbmVyIHR5cGVzXG49PT09PT09PT09PT09PT09PT09PT09PT09XG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBjYW4gYmUgZGVmaW5lZCB0byBpbXBsZW1lbnQgY29udGFpbmVyIG9iamVjdHMuXG5Db250YWluZXJzIHVzdWFsbHkgYXJlIHNlcXVlbmNlcyAoc3VjaCBhcyBsaXN0cyBvciB0dXBsZXMpIG9yIG1hcHBpbmdzXG4obGlrZSBkaWN0aW9uYXJpZXMpLCBidXQgY2FuIHJlcHJlc2VudCBvdGhlciBjb250YWluZXJzIGFzIHdlbGwuICBUaGVcbmZpcnN0IHNldCBvZiBtZXRob2RzIGlzIHVzZWQgZWl0aGVyIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSBvciB0b1xuZW11bGF0ZSBhIG1hcHBpbmc7IHRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgZm9yIGEgc2VxdWVuY2UsIHRoZVxuYWxsb3dhYmxlIGtleXMgc2hvdWxkIGJlIHRoZSBpbnRlZ2VycyAqayogZm9yIHdoaWNoIGBgMCA8PSBrIDwgTmBgXG53aGVyZSAqTiogaXMgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UsIG9yIHNsaWNlIG9iamVjdHMsIHdoaWNoXG5kZWZpbmUgYSByYW5nZSBvZiBpdGVtcy4gKEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgdGhlIG1ldGhvZFxuYGBfX2dldHNsaWNlX18oKWBgIChzZWUgYmVsb3cpIGNhbiBhbHNvIGJlIGRlZmluZWQgdG8gaGFuZGxlIHNpbXBsZSxcbmJ1dCBub3QgZXh0ZW5kZWQgc2xpY2VzLikgSXQgaXMgYWxzbyByZWNvbW1lbmRlZCB0aGF0IG1hcHBpbmdzIHByb3ZpZGVcbnRoZSBtZXRob2RzIGBga2V5cygpYGAsIGBgdmFsdWVzKClgYCwgYGBpdGVtcygpYGAsIGBgaGFzX2tleSgpYGAsXG5gYGdldCgpYGAsIGBgY2xlYXIoKWBgLCBgYHNldGRlZmF1bHQoKWBgLCBgYGl0ZXJrZXlzKClgYCxcbmBgaXRlcnZhbHVlcygpYGAsIGBgaXRlcml0ZW1zKClgYCwgYGBwb3AoKWBgLCBgYHBvcGl0ZW0oKWBgLFxuYGBjb3B5KClgYCwgYW5kIGBgdXBkYXRlKClgYCBiZWhhdmluZyBzaW1pbGFyIHRvIHRob3NlIGZvciBQeXRob25cJ3NcbnN0YW5kYXJkIGRpY3Rpb25hcnkgb2JqZWN0cy4gIFRoZSBgYFVzZXJEaWN0YGAgbW9kdWxlIHByb3ZpZGVzIGFcbmBgRGljdE1peGluYGAgY2xhc3MgdG8gaGVscCBjcmVhdGUgdGhvc2UgbWV0aG9kcyBmcm9tIGEgYmFzZSBzZXQgb2ZcbmBgX19nZXRpdGVtX18oKWBgLCBgYF9fc2V0aXRlbV9fKClgYCwgYGBfX2RlbGl0ZW1fXygpYGAsIGFuZFxuYGBrZXlzKClgYC4gTXV0YWJsZSBzZXF1ZW5jZXMgc2hvdWxkIHByb3ZpZGUgbWV0aG9kcyBgYGFwcGVuZCgpYGAsXG5gYGNvdW50KClgYCwgYGBpbmRleCgpYGAsIGBgZXh0ZW5kKClgYCwgYGBpbnNlcnQoKWBgLCBgYHBvcCgpYGAsXG5gYHJlbW92ZSgpYGAsIGBgcmV2ZXJzZSgpYGAgYW5kIGBgc29ydCgpYGAsIGxpa2UgUHl0aG9uIHN0YW5kYXJkIGxpc3Rcbm9iamVjdHMuICBGaW5hbGx5LCBzZXF1ZW5jZSB0eXBlcyBzaG91bGQgaW1wbGVtZW50IGFkZGl0aW9uIChtZWFuaW5nXG5jb25jYXRlbmF0aW9uKSBhbmQgbXVsdGlwbGljYXRpb24gKG1lYW5pbmcgcmVwZXRpdGlvbikgYnkgZGVmaW5pbmcgdGhlXG5tZXRob2RzIGBgX19hZGRfXygpYGAsIGBgX19yYWRkX18oKWBgLCBgYF9faWFkZF9fKClgYCwgYGBfX211bF9fKClgYCxcbmBgX19ybXVsX18oKWBgIGFuZCBgYF9faW11bF9fKClgYCBkZXNjcmliZWQgYmVsb3c7IHRoZXkgc2hvdWxkIG5vdFxuZGVmaW5lIGBgX19jb2VyY2VfXygpYGAgb3Igb3RoZXIgbnVtZXJpY2FsIG9wZXJhdG9ycy4gIEl0IGlzXG5yZWNvbW1lbmRlZCB0aGF0IGJvdGggbWFwcGluZ3MgYW5kIHNlcXVlbmNlcyBpbXBsZW1lbnQgdGhlXG5gYF9fY29udGFpbnNfXygpYGAgbWV0aG9kIHRvIGFsbG93IGVmZmljaWVudCB1c2Ugb2YgdGhlIGBgaW5gYFxub3BlcmF0b3I7IGZvciBtYXBwaW5ncywgYGBpbmBgIHNob3VsZCBiZSBlcXVpdmFsZW50IG9mIGBgaGFzX2tleSgpYGA7XG5mb3Igc2VxdWVuY2VzLCBpdCBzaG91bGQgc2VhcmNoIHRocm91Z2ggdGhlIHZhbHVlcy4gIEl0IGlzIGZ1cnRoZXJcbnJlY29tbWVuZGVkIHRoYXQgYm90aCBtYXBwaW5ncyBhbmQgc2VxdWVuY2VzIGltcGxlbWVudCB0aGVcbmBgX19pdGVyX18oKWBgIG1ldGhvZCB0byBhbGxvdyBlZmZpY2llbnQgaXRlcmF0aW9uIHRocm91Z2ggdGhlXG5jb250YWluZXI7IGZvciBtYXBwaW5ncywgYGBfX2l0ZXJfXygpYGAgc2hvdWxkIGJlIHRoZSBzYW1lIGFzXG5gYGl0ZXJrZXlzKClgYDsgZm9yIHNlcXVlbmNlcywgaXQgc2hvdWxkIGl0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsdWVzLlxuXG5vYmplY3QuX19sZW5fXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAuICBTaG91bGQgcmV0dXJuXG4gICB0aGUgbGVuZ3RoIG9mIHRoZSBvYmplY3QsIGFuIGludGVnZXIgYGA+PWBgIDAuICBBbHNvLCBhbiBvYmplY3RcbiAgIHRoYXQgZG9lc25cJ3QgZGVmaW5lIGEgYGBfX25vbnplcm9fXygpYGAgbWV0aG9kIGFuZCB3aG9zZVxuICAgYGBfX2xlbl9fKClgYCBtZXRob2QgcmV0dXJucyB6ZXJvIGlzIGNvbnNpZGVyZWQgdG8gYmUgZmFsc2UgaW4gYVxuICAgQm9vbGVhbiBjb250ZXh0LlxuXG5vYmplY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgYGBzZWxmW2tleV1gYC4gRm9yIHNlcXVlbmNlXG4gICB0eXBlcywgdGhlIGFjY2VwdGVkIGtleXMgc2hvdWxkIGJlIGludGVnZXJzIGFuZCBzbGljZSBvYmplY3RzLlxuICAgTm90ZSB0aGF0IHRoZSBzcGVjaWFsIGludGVycHJldGF0aW9uIG9mIG5lZ2F0aXZlIGluZGV4ZXMgKGlmIHRoZVxuICAgY2xhc3Mgd2lzaGVzIHRvIGVtdWxhdGUgYSBzZXF1ZW5jZSB0eXBlKSBpcyB1cCB0byB0aGVcbiAgIGBgX19nZXRpdGVtX18oKWBgIG1ldGhvZC4gSWYgKmtleSogaXMgb2YgYW4gaW5hcHByb3ByaWF0ZSB0eXBlLFxuICAgYGBUeXBlRXJyb3JgYCBtYXkgYmUgcmFpc2VkOyBpZiBvZiBhIHZhbHVlIG91dHNpZGUgdGhlIHNldCBvZlxuICAgaW5kZXhlcyBmb3IgdGhlIHNlcXVlbmNlIChhZnRlciBhbnkgc3BlY2lhbCBpbnRlcnByZXRhdGlvbiBvZlxuICAgbmVnYXRpdmUgdmFsdWVzKSwgYGBJbmRleEVycm9yYGAgc2hvdWxkIGJlIHJhaXNlZC4gRm9yIG1hcHBpbmdcbiAgIHR5cGVzLCBpZiAqa2V5KiBpcyBtaXNzaW5nIChub3QgaW4gdGhlIGNvbnRhaW5lciksIGBgS2V5RXJyb3JgYFxuICAgc2hvdWxkIGJlIHJhaXNlZC5cblxuICAgTm90ZTogYGBmb3JgYCBsb29wcyBleHBlY3QgdGhhdCBhbiBgYEluZGV4RXJyb3JgYCB3aWxsIGJlIHJhaXNlZCBmb3JcbiAgICAgaWxsZWdhbCBpbmRleGVzIHRvIGFsbG93IHByb3BlciBkZXRlY3Rpb24gb2YgdGhlIGVuZCBvZiB0aGVcbiAgICAgc2VxdWVuY2UuXG5cbm9iamVjdC5fX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gYGBzZWxmW2tleV1gYC4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgY2hhbmdlcyB0byB0aGUgdmFsdWVzIGZvciBrZXlzLCBvciBpZiBuZXcga2V5c1xuICAgY2FuIGJlIGFkZGVkLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzIGNhbiBiZSByZXBsYWNlZC4gIFRoZVxuICAgc2FtZSBleGNlcHRpb25zIHNob3VsZCBiZSByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3JcbiAgIHRoZSBgYF9fZ2V0aXRlbV9fKClgYCBtZXRob2QuXG5cbm9iamVjdC5fX2RlbGl0ZW1fXyhzZWxmLCBrZXkpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgZGVsZXRpb24gb2YgYGBzZWxmW2tleV1gYC4gIFNhbWUgbm90ZSBhcyBmb3JcbiAgIGBgX19nZXRpdGVtX18oKWBgLiAgVGhpcyBzaG91bGQgb25seSBiZSBpbXBsZW1lbnRlZCBmb3IgbWFwcGluZ3MgaWZcbiAgIHRoZSBvYmplY3RzIHN1cHBvcnQgcmVtb3ZhbCBvZiBrZXlzLCBvciBmb3Igc2VxdWVuY2VzIGlmIGVsZW1lbnRzXG4gICBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBzZXF1ZW5jZS4gIFRoZSBzYW1lIGV4Y2VwdGlvbnMgc2hvdWxkIGJlXG4gICByYWlzZWQgZm9yIGltcHJvcGVyICprZXkqIHZhbHVlcyBhcyBmb3IgdGhlIGBgX19nZXRpdGVtX18oKWBgXG4gICBtZXRob2QuXG5cbm9iamVjdC5fX2l0ZXJfXyhzZWxmKVxuXG4gICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhbiBpdGVyYXRvciBpcyByZXF1aXJlZCBmb3IgYSBjb250YWluZXIuXG4gICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0IGNhbiBpdGVyYXRlXG4gICBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyLiAgRm9yIG1hcHBpbmdzLCBpdCBzaG91bGRcbiAgIGl0ZXJhdGUgb3ZlciB0aGUga2V5cyBvZiB0aGUgY29udGFpbmVyLCBhbmQgc2hvdWxkIGFsc28gYmUgbWFkZVxuICAgYXZhaWxhYmxlIGFzIHRoZSBtZXRob2QgYGBpdGVya2V5cygpYGAuXG5cbiAgIEl0ZXJhdG9yIG9iamVjdHMgYWxzbyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZDsgdGhleSBhcmVcbiAgIHJlcXVpcmVkIHRvIHJldHVybiB0aGVtc2VsdmVzLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaXRlcmF0b3JcbiAgIG9iamVjdHMsIHNlZSAqSXRlcmF0b3IgVHlwZXMqLlxuXG5vYmplY3QuX19yZXZlcnNlZF9fKHNlbGYpXG5cbiAgIENhbGxlZCAoaWYgcHJlc2VudCkgYnkgdGhlIGBgcmV2ZXJzZWQoKWBgIGJ1aWx0LWluIHRvIGltcGxlbWVudFxuICAgcmV2ZXJzZSBpdGVyYXRpb24uICBJdCBzaG91bGQgcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIG9iamVjdCB0aGF0XG4gICBpdGVyYXRlcyBvdmVyIGFsbCB0aGUgb2JqZWN0cyBpbiB0aGUgY29udGFpbmVyIGluIHJldmVyc2Ugb3JkZXIuXG5cbiAgIElmIHRoZSBgYF9fcmV2ZXJzZWRfXygpYGAgbWV0aG9kIGlzIG5vdCBwcm92aWRlZCwgdGhlXG4gICBgYHJldmVyc2VkKClgYCBidWlsdC1pbiB3aWxsIGZhbGwgYmFjayB0byB1c2luZyB0aGUgc2VxdWVuY2VcbiAgIHByb3RvY29sIChgYF9fbGVuX18oKWBgIGFuZCBgYF9fZ2V0aXRlbV9fKClgYCkuICBPYmplY3RzIHRoYXRcbiAgIHN1cHBvcnQgdGhlIHNlcXVlbmNlIHByb3RvY29sIHNob3VsZCBvbmx5IHByb3ZpZGVcbiAgIGBgX19yZXZlcnNlZF9fKClgYCBpZiB0aGV5IGNhbiBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgaXNcbiAgIG1vcmUgZWZmaWNpZW50IHRoYW4gdGhlIG9uZSBwcm92aWRlZCBieSBgYHJldmVyc2VkKClgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5UaGUgbWVtYmVyc2hpcCB0ZXN0IG9wZXJhdG9ycyAoYGBpbmBgIGFuZCBgYG5vdCBpbmBgKSBhcmUgbm9ybWFsbHlcbmltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdGlvbiB0aHJvdWdoIGEgc2VxdWVuY2UuICBIb3dldmVyLCBjb250YWluZXJcbm9iamVjdHMgY2FuIHN1cHBseSB0aGUgZm9sbG93aW5nIHNwZWNpYWwgbWV0aG9kIHdpdGggYSBtb3JlIGVmZmljaWVudFxuaW1wbGVtZW50YXRpb24sIHdoaWNoIGFsc28gZG9lcyBub3QgcmVxdWlyZSB0aGUgb2JqZWN0IGJlIGEgc2VxdWVuY2UuXG5cbm9iamVjdC5fX2NvbnRhaW5zX18oc2VsZiwgaXRlbSlcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBtZW1iZXJzaGlwIHRlc3Qgb3BlcmF0b3JzLiAgU2hvdWxkIHJldHVybiB0cnVlXG4gICBpZiAqaXRlbSogaXMgaW4gKnNlbGYqLCBmYWxzZSBvdGhlcndpc2UuICBGb3IgbWFwcGluZyBvYmplY3RzLCB0aGlzXG4gICBzaG91bGQgY29uc2lkZXIgdGhlIGtleXMgb2YgdGhlIG1hcHBpbmcgcmF0aGVyIHRoYW4gdGhlIHZhbHVlcyBvclxuICAgdGhlIGtleS1pdGVtIHBhaXJzLlxuXG4gICBGb3Igb2JqZWN0cyB0aGF0IGRvblwndCBkZWZpbmUgYGBfX2NvbnRhaW5zX18oKWBgLCB0aGUgbWVtYmVyc2hpcFxuICAgdGVzdCBmaXJzdCB0cmllcyBpdGVyYXRpb24gdmlhIGBgX19pdGVyX18oKWBgLCB0aGVuIHRoZSBvbGRcbiAgIHNlcXVlbmNlIGl0ZXJhdGlvbiBwcm90b2NvbCB2aWEgYGBfX2dldGl0ZW1fXygpYGAsIHNlZSAqdGhpc1xuICAgc2VjdGlvbiBpbiB0aGUgbGFuZ3VhZ2UgcmVmZXJlbmNlKi5cblxuXG5BZGRpdGlvbmFsIG1ldGhvZHMgZm9yIGVtdWxhdGlvbiBvZiBzZXF1ZW5jZSB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBvcHRpb25hbCBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGZ1cnRoZXIgZW11bGF0ZVxuc2VxdWVuY2Ugb2JqZWN0cy4gIEltbXV0YWJsZSBzZXF1ZW5jZXMgbWV0aG9kcyBzaG91bGQgYXQgbW9zdCBvbmx5XG5kZWZpbmUgYGBfX2dldHNsaWNlX18oKWBgOyBtdXRhYmxlIHNlcXVlbmNlcyBtaWdodCBkZWZpbmUgYWxsIHRocmVlXG5tZXRob2RzLlxuXG5vYmplY3QuX19nZXRzbGljZV9fKHNlbGYsIGksIGopXG5cbiAgIERlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAyLjA6IFN1cHBvcnQgc2xpY2Ugb2JqZWN0cyBhcyBwYXJhbWV0ZXJzXG4gICB0byB0aGUgYGBfX2dldGl0ZW1fXygpYGAgbWV0aG9kLiAoSG93ZXZlciwgYnVpbHQtaW4gdHlwZXMgaW5cbiAgIENQeXRob24gY3VycmVudGx5IHN0aWxsIGltcGxlbWVudCBgYF9fZ2V0c2xpY2VfXygpYGAuICBUaGVyZWZvcmUsXG4gICB5b3UgaGF2ZSB0byBvdmVycmlkZSBpdCBpbiBkZXJpdmVkIGNsYXNzZXMgd2hlbiBpbXBsZW1lbnRpbmdcbiAgIHNsaWNpbmcuKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGV2YWx1YXRpb24gb2YgYGBzZWxmW2k6al1gYC4gVGhlIHJldHVybmVkXG4gICBvYmplY3Qgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgKnNlbGYqLiAgTm90ZSB0aGF0IG1pc3NpbmcgKmkqXG4gICBvciAqaiogaW4gdGhlIHNsaWNlIGV4cHJlc3Npb24gYXJlIHJlcGxhY2VkIGJ5IHplcm8gb3JcbiAgIGBgc3lzLm1heGludGBgLCByZXNwZWN0aXZlbHkuICBJZiBuZWdhdGl2ZSBpbmRleGVzIGFyZSB1c2VkIGluIHRoZVxuICAgc2xpY2UsIHRoZSBsZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIGFkZGVkIHRvIHRoYXQgaW5kZXguIElmIHRoZVxuICAgaW5zdGFuY2UgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBgYF9fbGVuX18oKWBgIG1ldGhvZCwgYW5cbiAgIGBgQXR0cmlidXRlRXJyb3JgYCBpcyByYWlzZWQuIE5vIGd1YXJhbnRlZSBpcyBtYWRlIHRoYXQgaW5kZXhlc1xuICAgYWRqdXN0ZWQgdGhpcyB3YXkgYXJlIG5vdCBzdGlsbCBuZWdhdGl2ZS4gIEluZGV4ZXMgd2hpY2ggYXJlXG4gICBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2UgYXJlIG5vdCBtb2RpZmllZC4gSWYgbm9cbiAgIGBgX19nZXRzbGljZV9fKClgYCBpcyBmb3VuZCwgYSBzbGljZSBvYmplY3QgaXMgY3JlYXRlZCBpbnN0ZWFkLCBhbmRcbiAgIHBhc3NlZCB0byBgYF9fZ2V0aXRlbV9fKClgYCBpbnN0ZWFkLlxuXG5vYmplY3QuX19zZXRzbGljZV9fKHNlbGYsIGksIGosIHNlcXVlbmNlKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IGFzc2lnbm1lbnQgdG8gYGBzZWxmW2k6al1gYC4gU2FtZSBub3RlcyBmb3IgKmkqXG4gICBhbmQgKmoqIGFzIGZvciBgYF9fZ2V0c2xpY2VfXygpYGAuXG5cbiAgIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIElmIG5vIGBgX19zZXRzbGljZV9fKClgYCBpcyBmb3VuZCwgb3JcbiAgIGZvciBleHRlbmRlZCBzbGljaW5nIG9mIHRoZSBmb3JtIGBgc2VsZltpOmo6a11gYCwgYSBzbGljZSBvYmplY3QgaXNcbiAgIGNyZWF0ZWQsIGFuZCBwYXNzZWQgdG8gYGBfX3NldGl0ZW1fXygpYGAsIGluc3RlYWQgb2ZcbiAgIGBgX19zZXRzbGljZV9fKClgYCBiZWluZyBjYWxsZWQuXG5cbm9iamVjdC5fX2RlbHNsaWNlX18oc2VsZiwgaSwgailcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBkZWxldGlvbiBvZiBgYHNlbGZbaTpqXWBgLiBTYW1lIG5vdGVzIGZvciAqaSpcbiAgIGFuZCAqaiogYXMgZm9yIGBgX19nZXRzbGljZV9fKClgYC4gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gSWYgbm9cbiAgIGBgX19kZWxzbGljZV9fKClgYCBpcyBmb3VuZCwgb3IgZm9yIGV4dGVuZGVkIHNsaWNpbmcgb2YgdGhlIGZvcm1cbiAgIGBgc2VsZltpOmo6a11gYCwgYSBzbGljZSBvYmplY3QgaXMgY3JlYXRlZCwgYW5kIHBhc3NlZCB0b1xuICAgYGBfX2RlbGl0ZW1fXygpYGAsIGluc3RlYWQgb2YgYGBfX2RlbHNsaWNlX18oKWBgIGJlaW5nIGNhbGxlZC5cblxuTm90aWNlIHRoYXQgdGhlc2UgbWV0aG9kcyBhcmUgb25seSBpbnZva2VkIHdoZW4gYSBzaW5nbGUgc2xpY2Ugd2l0aCBhXG5zaW5nbGUgY29sb24gaXMgdXNlZCwgYW5kIHRoZSBzbGljZSBtZXRob2QgaXMgYXZhaWxhYmxlLiAgRm9yIHNsaWNlXG5vcGVyYXRpb25zIGludm9sdmluZyBleHRlbmRlZCBzbGljZSBub3RhdGlvbiwgb3IgaW4gYWJzZW5jZSBvZiB0aGVcbnNsaWNlIG1ldGhvZHMsIGBgX19nZXRpdGVtX18oKWBgLCBgYF9fc2V0aXRlbV9fKClgYCBvclxuYGBfX2RlbGl0ZW1fXygpYGAgaXMgY2FsbGVkIHdpdGggYSBzbGljZSBvYmplY3QgYXMgYXJndW1lbnQuXG5cblRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZW1vbnN0cmF0ZSBob3cgdG8gbWFrZSB5b3VyIHByb2dyYW0gb3IgbW9kdWxlXG5jb21wYXRpYmxlIHdpdGggZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24gKGFzc3VtaW5nIHRoYXQgbWV0aG9kc1xuYGBfX2dldGl0ZW1fXygpYGAsIGBgX19zZXRpdGVtX18oKWBgIGFuZCBgYF9fZGVsaXRlbV9fKClgYCBzdXBwb3J0XG5zbGljZSBvYmplY3RzIGFzIGFyZ3VtZW50cyk6XG5cbiAgIGNsYXNzIE15Q2xhc3M6XG4gICAgICAgLi4uXG4gICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KTpcbiAgICAgICAgICAgLi4uXG4gICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCB2YWx1ZSk6XG4gICAgICAgICAgIC4uLlxuICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBpbmRleCk6XG4gICAgICAgICAgIC4uLlxuXG4gICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCAwKTpcbiAgICAgICAgICAgIyBUaGV5IHdvblwndCBiZSBkZWZpbmVkIGlmIHZlcnNpb24gaXMgYXQgbGVhc3QgMi4wIGZpbmFsXG5cbiAgICAgICAgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKTpcbiAgICAgICAgICAgICAgIHJldHVybiBzZWxmW21heCgwLCBpKTptYXgoMCwgaik6XVxuICAgICAgICAgICBkZWYgX19zZXRzbGljZV9fKHNlbGYsIGksIGosIHNlcSk6XG4gICAgICAgICAgICAgICBzZWxmW21heCgwLCBpKTptYXgoMCwgaik6XSA9IHNlcVxuICAgICAgICAgICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIGksIGopOlxuICAgICAgICAgICAgICAgZGVsIHNlbGZbbWF4KDAsIGkpOm1heCgwLCBqKTpdXG4gICAgICAgLi4uXG5cbk5vdGUgdGhlIGNhbGxzIHRvIGBgbWF4KClgYDsgdGhlc2UgYXJlIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIHRoZVxuaGFuZGxpbmcgb2YgbmVnYXRpdmUgaW5kaWNlcyBiZWZvcmUgdGhlIGBgX18qc2xpY2VfXygpYGAgbWV0aG9kcyBhcmVcbmNhbGxlZC4gIFdoZW4gbmVnYXRpdmUgaW5kZXhlcyBhcmUgdXNlZCwgdGhlIGBgX18qaXRlbV9fKClgYCBtZXRob2RzXG5yZWNlaXZlIHRoZW0gYXMgcHJvdmlkZWQsIGJ1dCB0aGUgYGBfXypzbGljZV9fKClgYCBtZXRob2RzIGdldCBhXG4iY29va2VkIiBmb3JtIG9mIHRoZSBpbmRleCB2YWx1ZXMuICBGb3IgZWFjaCBuZWdhdGl2ZSBpbmRleCB2YWx1ZSwgdGhlXG5sZW5ndGggb2YgdGhlIHNlcXVlbmNlIGlzIGFkZGVkIHRvIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgbWV0aG9kXG4od2hpY2ggbWF5IHN0aWxsIHJlc3VsdCBpbiBhIG5lZ2F0aXZlIGluZGV4KTsgdGhpcyBpcyB0aGUgY3VzdG9tYXJ5XG5oYW5kbGluZyBvZiBuZWdhdGl2ZSBpbmRleGVzIGJ5IHRoZSBidWlsdC1pbiBzZXF1ZW5jZSB0eXBlcywgYW5kIHRoZVxuYGBfXyppdGVtX18oKWBgIG1ldGhvZHMgYXJlIGV4cGVjdGVkIHRvIGRvIHRoaXMgYXMgd2VsbC4gIEhvd2V2ZXIsXG5zaW5jZSB0aGV5IHNob3VsZCBhbHJlYWR5IGJlIGRvaW5nIHRoYXQsIG5lZ2F0aXZlIGluZGV4ZXMgY2Fubm90IGJlXG5wYXNzZWQgaW47IHRoZXkgbXVzdCBiZSBjb25zdHJhaW5lZCB0byB0aGUgYm91bmRzIG9mIHRoZSBzZXF1ZW5jZVxuYmVmb3JlIGJlaW5nIHBhc3NlZCB0byB0aGUgYGBfXyppdGVtX18oKWBgIG1ldGhvZHMuIENhbGxpbmcgYGBtYXgoMCxcbmkpYGAgY29udmVuaWVudGx5IHJldHVybnMgdGhlIHByb3BlciB2YWx1ZS5cblxuXG5FbXVsYXRpbmcgbnVtZXJpYyB0eXBlc1xuPT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbiBiZSBkZWZpbmVkIHRvIGVtdWxhdGUgbnVtZXJpYyBvYmplY3RzLlxuTWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGVcbnBhcnRpY3VsYXIga2luZCBvZiBudW1iZXIgaW1wbGVtZW50ZWQgKGUuZy4sIGJpdHdpc2Ugb3BlcmF0aW9ucyBmb3Jcbm5vbi1pbnRlZ3JhbCBudW1iZXJzKSBzaG91bGQgYmUgbGVmdCB1bmRlZmluZWQuXG5cbm9iamVjdC5fX2FkZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fc3ViX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19tb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2Rpdm1vZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9fcG93X18oc2VsZiwgb3RoZXJbLCBtb2R1bG9dKVxub2JqZWN0Ll9fbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2FuZF9fKHNlbGYsIG90aGVyKVxub2JqZWN0Ll9feG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19vcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvL2BgLCBgYCVgYCwgYGBkaXZtb2QoKWBgLFxuICAgYGBwb3coKWBgLCBgYCoqYGAsIGBgPDxgYCwgYGA+PmBgLCBgYCZgYCwgYGBeYGAsIGBgfGBgKS4gIEZvclxuICAgaW5zdGFuY2UsIHRvIGV2YWx1YXRlIHRoZSBleHByZXNzaW9uIGBgeCArIHlgYCwgd2hlcmUgKngqIGlzIGFuXG4gICBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuIGBgX19hZGRfXygpYGAgbWV0aG9kLFxuICAgYGB4Ll9fYWRkX18oeSlgYCBpcyBjYWxsZWQuICBUaGUgYGBfX2Rpdm1vZF9fKClgYCBtZXRob2Qgc2hvdWxkIGJlXG4gICB0aGUgZXF1aXZhbGVudCB0byB1c2luZyBgYF9fZmxvb3JkaXZfXygpYGAgYW5kIGBgX19tb2RfXygpYGA7IGl0XG4gICBzaG91bGQgbm90IGJlIHJlbGF0ZWQgdG8gYGBfX3RydWVkaXZfXygpYGAgKGRlc2NyaWJlZCBiZWxvdykuICBOb3RlXG4gICB0aGF0IGBgX19wb3dfXygpYGAgc2hvdWxkIGJlIGRlZmluZWQgdG8gYWNjZXB0IGFuIG9wdGlvbmFsIHRoaXJkXG4gICBhcmd1bWVudCBpZiB0aGUgdGVybmFyeSB2ZXJzaW9uIG9mIHRoZSBidWlsdC1pbiBgYHBvdygpYGAgZnVuY3Rpb25cbiAgIGlzIHRvIGJlIHN1cHBvcnRlZC5cblxuICAgSWYgb25lIG9mIHRob3NlIG1ldGhvZHMgZG9lcyBub3Qgc3VwcG9ydCB0aGUgb3BlcmF0aW9uIHdpdGggdGhlXG4gICBzdXBwbGllZCBhcmd1bWVudHMsIGl0IHNob3VsZCByZXR1cm4gYGBOb3RJbXBsZW1lbnRlZGBgLlxuXG5vYmplY3QuX19kaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3RydWVkaXZfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlIGRpdmlzaW9uIG9wZXJhdG9yIChgYC9gYCkgaXMgaW1wbGVtZW50ZWQgYnkgdGhlc2UgbWV0aG9kcy4gIFRoZVxuICAgYGBfX3RydWVkaXZfXygpYGAgbWV0aG9kIGlzIHVzZWQgd2hlbiBgYF9fZnV0dXJlX18uZGl2aXNpb25gYCBpcyBpblxuICAgZWZmZWN0LCBvdGhlcndpc2UgYGBfX2Rpdl9fKClgYCBpcyB1c2VkLiAgSWYgb25seSBvbmUgb2YgdGhlc2UgdHdvXG4gICBtZXRob2RzIGlzIGRlZmluZWQsIHRoZSBvYmplY3Qgd2lsbCBub3Qgc3VwcG9ydCBkaXZpc2lvbiBpbiB0aGVcbiAgIGFsdGVybmF0ZSBjb250ZXh0OyBgYFR5cGVFcnJvcmBgIHdpbGwgYmUgcmFpc2VkIGluc3RlYWQuXG5cbm9iamVjdC5fX3JhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JtdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JkaXZtb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jwb3dfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jsc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jyc2hpZnRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3JhbmRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3J4b3JfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX3Jvcl9fKHNlbGYsIG90aGVyKVxuXG4gICBUaGVzZSBtZXRob2RzIGFyZSBjYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnkgYXJpdGhtZXRpY1xuICAgb3BlcmF0aW9ucyAoYGArYGAsIGBgLWBgLCBgYCpgYCwgYGAvYGAsIGBgJWBgLCBgYGRpdm1vZCgpYGAsXG4gICBgYHBvdygpYGAsIGBgKipgYCwgYGA8PGBgLCBgYD4+YGAsIGBgJmBgLCBgYF5gYCwgYGB8YGApIHdpdGhcbiAgIHJlZmxlY3RlZCAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmXG4gICB0aGUgbGVmdCBvcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZFxuICAgdGhlIG9wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuIFsyXSBGb3IgaW5zdGFuY2UsIHRvIGV2YWx1YXRlXG4gICB0aGUgZXhwcmVzc2lvbiBgYHggLSB5YGAsIHdoZXJlICp5KiBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXRcbiAgIGhhcyBhbiBgYF9fcnN1Yl9fKClgYCBtZXRob2QsIGBgeS5fX3JzdWJfXyh4KWBgIGlzIGNhbGxlZCBpZlxuICAgYGB4Ll9fc3ViX18oeSlgYCByZXR1cm5zICpOb3RJbXBsZW1lbnRlZCouXG5cbiAgIE5vdGUgdGhhdCB0ZXJuYXJ5IGBgcG93KClgYCB3aWxsIG5vdCB0cnkgY2FsbGluZyBgYF9fcnBvd19fKClgYFxuICAgKHRoZSBjb2VyY2lvbiBydWxlcyB3b3VsZCBiZWNvbWUgdG9vIGNvbXBsaWNhdGVkKS5cblxuICAgTm90ZTogSWYgdGhlIHJpZ2h0IG9wZXJhbmRcJ3MgdHlwZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgdHlwZSBhbmQgdGhhdCBzdWJjbGFzcyBwcm92aWRlcyB0aGUgcmVmbGVjdGVkIG1ldGhvZCBmb3IgdGhlXG4gICAgIG9wZXJhdGlvbiwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBsZWZ0IG9wZXJhbmRcJ3NcbiAgICAgbm9uLXJlZmxlY3RlZCBtZXRob2QuICBUaGlzIGJlaGF2aW9yIGFsbG93cyBzdWJjbGFzc2VzIHRvXG4gICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9yc1wnIG9wZXJhdGlvbnMuXG5cbm9iamVjdC5fX2lhZGRfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lzdWJfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltdWxfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2l0cnVlZGl2X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pZmxvb3JkaXZfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2ltb2RfXyhzZWxmLCBvdGhlcilcbm9iamVjdC5fX2lwb3dfXyhzZWxmLCBvdGhlclssIG1vZHVsb10pXG5vYmplY3QuX19pbHNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pcnNoaWZ0X18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pYW5kX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19peG9yX18oc2VsZiwgb3RoZXIpXG5vYmplY3QuX19pb3JfXyhzZWxmLCBvdGhlcilcblxuICAgVGhlc2UgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIGltcGxlbWVudCB0aGUgYXVnbWVudGVkIGFyaXRobWV0aWNcbiAgIGFzc2lnbm1lbnRzIChgYCs9YGAsIGBgLT1gYCwgYGAqPWBgLCBgYC89YGAsIGBgLy89YGAsIGBgJT1gYCxcbiAgIGBgKio9YGAsIGBgPDw9YGAsIGBgPj49YGAsIGBgJj1gYCwgYGBePWBgLCBgYHw9YGApLiAgVGhlc2UgbWV0aG9kc1xuICAgc2hvdWxkIGF0dGVtcHQgdG8gZG8gdGhlIG9wZXJhdGlvbiBpbi1wbGFjZSAobW9kaWZ5aW5nICpzZWxmKikgYW5kXG4gICByZXR1cm4gdGhlIHJlc3VsdCAod2hpY2ggY291bGQgYmUsIGJ1dCBkb2VzIG5vdCBoYXZlIHRvIGJlLFxuICAgKnNlbGYqKS4gIElmIGEgc3BlY2lmaWMgbWV0aG9kIGlzIG5vdCBkZWZpbmVkLCB0aGUgYXVnbWVudGVkXG4gICBhc3NpZ25tZW50IGZhbGxzIGJhY2sgdG8gdGhlIG5vcm1hbCBtZXRob2RzLiAgRm9yIGluc3RhbmNlLCB0b1xuICAgZXhlY3V0ZSB0aGUgc3RhdGVtZW50IGBgeCArPSB5YGAsIHdoZXJlICp4KiBpcyBhbiBpbnN0YW5jZSBvZiBhXG4gICBjbGFzcyB0aGF0IGhhcyBhbiBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2lhZGRfXyh5KWBgIGlzXG4gICBjYWxsZWQuICBJZiAqeCogaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGRvZXMgbm90IGRlZmluZSBhXG4gICBgYF9faWFkZF9fKClgYCBtZXRob2QsIGBgeC5fX2FkZF9fKHkpYGAgYW5kIGBgeS5fX3JhZGRfXyh4KWBgIGFyZVxuICAgY29uc2lkZXJlZCwgYXMgd2l0aCB0aGUgZXZhbHVhdGlvbiBvZiBgYHggKyB5YGAuXG5cbm9iamVjdC5fX25lZ19fKHNlbGYpXG5vYmplY3QuX19wb3NfXyhzZWxmKVxub2JqZWN0Ll9fYWJzX18oc2VsZilcbm9iamVjdC5fX2ludmVydF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIHVuYXJ5IGFyaXRobWV0aWMgb3BlcmF0aW9ucyAoYGAtYGAsIGBgK2BgLFxuICAgYGBhYnMoKWBgIGFuZCBgYH5gYCkuXG5cbm9iamVjdC5fX2NvbXBsZXhfXyhzZWxmKVxub2JqZWN0Ll9faW50X18oc2VsZilcbm9iamVjdC5fX2xvbmdfXyhzZWxmKVxub2JqZWN0Ll9fZmxvYXRfXyhzZWxmKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50IHRoZSBidWlsdC1pbiBmdW5jdGlvbnMgYGBjb21wbGV4KClgYCxcbiAgIGBgaW50KClgYCwgYGBsb25nKClgYCwgYW5kIGBgZmxvYXQoKWBgLiAgU2hvdWxkIHJldHVybiBhIHZhbHVlIG9mXG4gICB0aGUgYXBwcm9wcmlhdGUgdHlwZS5cblxub2JqZWN0Ll9fb2N0X18oc2VsZilcbm9iamVjdC5fX2hleF9fKHNlbGYpXG5cbiAgIENhbGxlZCB0byBpbXBsZW1lbnQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYG9jdCgpYGAgYW5kIGBgaGV4KClgYC5cbiAgIFNob3VsZCByZXR1cm4gYSBzdHJpbmcgdmFsdWUuXG5cbm9iamVjdC5fX2luZGV4X18oc2VsZilcblxuICAgQ2FsbGVkIHRvIGltcGxlbWVudCBgYG9wZXJhdG9yLmluZGV4KClgYC4gIEFsc28gY2FsbGVkIHdoZW5ldmVyXG4gICBQeXRob24gbmVlZHMgYW4gaW50ZWdlciBvYmplY3QgKHN1Y2ggYXMgaW4gc2xpY2luZykuICBNdXN0IHJldHVyblxuICAgYW4gaW50ZWdlciAoaW50IG9yIGxvbmcpLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbm9iamVjdC5fX2NvZXJjZV9fKHNlbGYsIG90aGVyKVxuXG4gICBDYWxsZWQgdG8gaW1wbGVtZW50ICJtaXhlZC1tb2RlIiBudW1lcmljIGFyaXRobWV0aWMuICBTaG91bGQgZWl0aGVyXG4gICByZXR1cm4gYSAyLXR1cGxlIGNvbnRhaW5pbmcgKnNlbGYqIGFuZCAqb3RoZXIqIGNvbnZlcnRlZCB0byBhXG4gICBjb21tb24gbnVtZXJpYyB0eXBlLCBvciBgYE5vbmVgYCBpZiBjb252ZXJzaW9uIGlzIGltcG9zc2libGUuICBXaGVuXG4gICB0aGUgY29tbW9uIHR5cGUgd291bGQgYmUgdGhlIHR5cGUgb2YgYGBvdGhlcmBgLCBpdCBpcyBzdWZmaWNpZW50IHRvXG4gICByZXR1cm4gYGBOb25lYGAsIHNpbmNlIHRoZSBpbnRlcnByZXRlciB3aWxsIGFsc28gYXNrIHRoZSBvdGhlclxuICAgb2JqZWN0IHRvIGF0dGVtcHQgYSBjb2VyY2lvbiAoYnV0IHNvbWV0aW1lcywgaWYgdGhlIGltcGxlbWVudGF0aW9uXG4gICBvZiB0aGUgb3RoZXIgdHlwZSBjYW5ub3QgYmUgY2hhbmdlZCwgaXQgaXMgdXNlZnVsIHRvIGRvIHRoZVxuICAgY29udmVyc2lvbiB0byB0aGUgb3RoZXIgdHlwZSBoZXJlKS4gIEEgcmV0dXJuIHZhbHVlIG9mXG4gICBgYE5vdEltcGxlbWVudGVkYGAgaXMgZXF1aXZhbGVudCB0byByZXR1cm5pbmcgYGBOb25lYGAuXG5cblxuQ29lcmNpb24gcnVsZXNcbj09PT09PT09PT09PT09XG5cblRoaXMgc2VjdGlvbiB1c2VkIHRvIGRvY3VtZW50IHRoZSBydWxlcyBmb3IgY29lcmNpb24uICBBcyB0aGUgbGFuZ3VhZ2VcbmhhcyBldm9sdmVkLCB0aGUgY29lcmNpb24gcnVsZXMgaGF2ZSBiZWNvbWUgaGFyZCB0byBkb2N1bWVudFxucHJlY2lzZWx5OyBkb2N1bWVudGluZyB3aGF0IG9uZSB2ZXJzaW9uIG9mIG9uZSBwYXJ0aWN1bGFyXG5pbXBsZW1lbnRhdGlvbiBkb2VzIGlzIHVuZGVzaXJhYmxlLiAgSW5zdGVhZCwgaGVyZSBhcmUgc29tZSBpbmZvcm1hbFxuZ3VpZGVsaW5lcyByZWdhcmRpbmcgY29lcmNpb24uICBJbiBQeXRob24gMywgY29lcmNpb24gd2lsbCBub3QgYmVcbnN1cHBvcnRlZC5cblxuKiBJZiB0aGUgbGVmdCBvcGVyYW5kIG9mIGEgJSBvcGVyYXRvciBpcyBhIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCxcbiAgbm8gY29lcmNpb24gdGFrZXMgcGxhY2UgYW5kIHRoZSBzdHJpbmcgZm9ybWF0dGluZyBvcGVyYXRpb24gaXNcbiAgaW52b2tlZCBpbnN0ZWFkLlxuXG4qIEl0IGlzIG5vIGxvbmdlciByZWNvbW1lbmRlZCB0byBkZWZpbmUgYSBjb2VyY2lvbiBvcGVyYXRpb24uIE1peGVkLVxuICBtb2RlIG9wZXJhdGlvbnMgb24gdHlwZXMgdGhhdCBkb25cJ3QgZGVmaW5lIGNvZXJjaW9uIHBhc3MgdGhlXG4gIG9yaWdpbmFsIGFyZ3VtZW50cyB0byB0aGUgb3BlcmF0aW9uLlxuXG4qIE5ldy1zdHlsZSBjbGFzc2VzICh0aG9zZSBkZXJpdmVkIGZyb20gYGBvYmplY3RgYCkgbmV2ZXIgaW52b2tlIHRoZVxuICBgYF9fY29lcmNlX18oKWBgIG1ldGhvZCBpbiByZXNwb25zZSB0byBhIGJpbmFyeSBvcGVyYXRvcjsgdGhlIG9ubHlcbiAgdGltZSBgYF9fY29lcmNlX18oKWBgIGlzIGludm9rZWQgaXMgd2hlbiB0aGUgYnVpbHQtaW4gZnVuY3Rpb25cbiAgYGBjb2VyY2UoKWBgIGlzIGNhbGxlZC5cblxuKiBGb3IgbW9zdCBpbnRlbnRzIGFuZCBwdXJwb3NlcywgYW4gb3BlcmF0b3IgdGhhdCByZXR1cm5zXG4gIGBgTm90SW1wbGVtZW50ZWRgYCBpcyB0cmVhdGVkIHRoZSBzYW1lIGFzIG9uZSB0aGF0IGlzIG5vdFxuICBpbXBsZW1lbnRlZCBhdCBhbGwuXG5cbiogQmVsb3csIGBgX19vcF9fKClgYCBhbmQgYGBfX3JvcF9fKClgYCBhcmUgdXNlZCB0byBzaWduaWZ5IHRoZVxuICBnZW5lcmljIG1ldGhvZCBuYW1lcyBjb3JyZXNwb25kaW5nIHRvIGFuIG9wZXJhdG9yOyBgYF9faW9wX18oKWBgIGlzXG4gIHVzZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGluLXBsYWNlIG9wZXJhdG9yLiAgRm9yIGV4YW1wbGUsIGZvciB0aGVcbiAgb3BlcmF0b3IgXCdgYCtgYFwnLCBgYF9fYWRkX18oKWBgIGFuZCBgYF9fcmFkZF9fKClgYCBhcmUgdXNlZCBmb3IgdGhlXG4gIGxlZnQgYW5kIHJpZ2h0IHZhcmlhbnQgb2YgdGhlIGJpbmFyeSBvcGVyYXRvciwgYW5kIGBgX19pYWRkX18oKWBgXG4gIGZvciB0aGUgaW4tcGxhY2UgdmFyaWFudC5cblxuKiBGb3Igb2JqZWN0cyAqeCogYW5kICp5KiwgZmlyc3QgYGB4Ll9fb3BfXyh5KWBgIGlzIHRyaWVkLiAgSWYgdGhpcyBpc1xuICBub3QgaW1wbGVtZW50ZWQgb3IgcmV0dXJucyBgYE5vdEltcGxlbWVudGVkYGAsIGBgeS5fX3JvcF9fKHgpYGAgaXNcbiAgdHJpZWQuICBJZiB0aGlzIGlzIGFsc28gbm90IGltcGxlbWVudGVkIG9yIHJldHVybnNcbiAgYGBOb3RJbXBsZW1lbnRlZGBgLCBhIGBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIEJ1dCBzZWVcbiAgdGhlIGZvbGxvd2luZyBleGNlcHRpb246XG5cbiogRXhjZXB0aW9uIHRvIHRoZSBwcmV2aW91cyBpdGVtOiBpZiB0aGUgbGVmdCBvcGVyYW5kIGlzIGFuIGluc3RhbmNlXG4gIG9mIGEgYnVpbHQtaW4gdHlwZSBvciBhIG5ldy1zdHlsZSBjbGFzcywgYW5kIHRoZSByaWdodCBvcGVyYW5kIGlzIGFuXG4gIGluc3RhbmNlIG9mIGEgcHJvcGVyIHN1YmNsYXNzIG9mIHRoYXQgdHlwZSBvciBjbGFzcyBhbmQgb3ZlcnJpZGVzXG4gIHRoZSBiYXNlXCdzIGBgX19yb3BfXygpYGAgbWV0aG9kLCB0aGUgcmlnaHQgb3BlcmFuZFwncyBgYF9fcm9wX18oKWBgXG4gIG1ldGhvZCBpcyB0cmllZCAqYmVmb3JlKiB0aGUgbGVmdCBvcGVyYW5kXCdzIGBgX19vcF9fKClgYCBtZXRob2QuXG5cbiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgYSBzdWJjbGFzcyBjYW4gY29tcGxldGVseSBvdmVycmlkZSBiaW5hcnlcbiAgb3BlcmF0b3JzLiBPdGhlcndpc2UsIHRoZSBsZWZ0IG9wZXJhbmRcJ3MgYGBfX29wX18oKWBgIG1ldGhvZCB3b3VsZFxuICBhbHdheXMgYWNjZXB0IHRoZSByaWdodCBvcGVyYW5kOiB3aGVuIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gY2xhc3NcbiAgaXMgZXhwZWN0ZWQsIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyBpcyBhbHdheXNcbiAgYWNjZXB0YWJsZS5cblxuKiBXaGVuIGVpdGhlciBvcGVyYW5kIHR5cGUgZGVmaW5lcyBhIGNvZXJjaW9uLCB0aGlzIGNvZXJjaW9uIGlzIGNhbGxlZFxuICBiZWZvcmUgdGhhdCB0eXBlXCdzIGBgX19vcF9fKClgYCBvciBgYF9fcm9wX18oKWBgIG1ldGhvZCBpcyBjYWxsZWQsXG4gIGJ1dCBubyBzb29uZXIuICBJZiB0aGUgY29lcmNpb24gcmV0dXJucyBhbiBvYmplY3Qgb2YgYSBkaWZmZXJlbnRcbiAgdHlwZSBmb3IgdGhlIG9wZXJhbmQgd2hvc2UgY29lcmNpb24gaXMgaW52b2tlZCwgcGFydCBvZiB0aGUgcHJvY2Vzc1xuICBpcyByZWRvbmUgdXNpbmcgdGhlIG5ldyBvYmplY3QuXG5cbiogV2hlbiBhbiBpbi1wbGFjZSBvcGVyYXRvciAobGlrZSBcJ2BgKz1gYFwnKSBpcyB1c2VkLCBpZiB0aGUgbGVmdFxuICBvcGVyYW5kIGltcGxlbWVudHMgYGBfX2lvcF9fKClgYCwgaXQgaXMgaW52b2tlZCB3aXRob3V0IGFueVxuICBjb2VyY2lvbi4gIFdoZW4gdGhlIG9wZXJhdGlvbiBmYWxscyBiYWNrIHRvIGBgX19vcF9fKClgYCBhbmQvb3JcbiAgYGBfX3JvcF9fKClgYCwgdGhlIG5vcm1hbCBjb2VyY2lvbiBydWxlcyBhcHBseS5cblxuKiBJbiBgYHggKyB5YGAsIGlmICp4KiBpcyBhIHNlcXVlbmNlIHRoYXQgaW1wbGVtZW50cyBzZXF1ZW5jZVxuICBjb25jYXRlbmF0aW9uLCBzZXF1ZW5jZSBjb25jYXRlbmF0aW9uIGlzIGludm9rZWQuXG5cbiogSW4gYGB4ICogeWBgLCBpZiBvbmUgb3BlcmFuZCBpcyBhIHNlcXVlbmNlIHRoYXQgaW1wbGVtZW50cyBzZXF1ZW5jZVxuICByZXBldGl0aW9uLCBhbmQgdGhlIG90aGVyIGlzIGFuIGludGVnZXIgKGBgaW50YGAgb3IgYGBsb25nYGApLFxuICBzZXF1ZW5jZSByZXBldGl0aW9uIGlzIGludm9rZWQuXG5cbiogUmljaCBjb21wYXJpc29ucyAoaW1wbGVtZW50ZWQgYnkgbWV0aG9kcyBgYF9fZXFfXygpYGAgYW5kIHNvIG9uKVxuICBuZXZlciB1c2UgY29lcmNpb24uICBUaHJlZS13YXkgY29tcGFyaXNvbiAoaW1wbGVtZW50ZWQgYnlcbiAgYGBfX2NtcF9fKClgYCkgZG9lcyB1c2UgY29lcmNpb24gdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyBhcyBvdGhlclxuICBiaW5hcnkgb3BlcmF0aW9ucyB1c2UgaXQuXG5cbiogSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBidWlsdC1pbiBudW1lcmljIHR5cGVzIGBgaW50YGAsXG4gIGBgbG9uZ2BgLCBgYGZsb2F0YGAsIGFuZCBgYGNvbXBsZXhgYCBkbyBub3QgdXNlIGNvZXJjaW9uLiBBbGwgdGhlc2VcbiAgdHlwZXMgaW1wbGVtZW50IGEgYGBfX2NvZXJjZV9fKClgYCBtZXRob2QsIGZvciB1c2UgYnkgdGhlIGJ1aWx0LWluXG4gIGBgY29lcmNlKClgYCBmdW5jdGlvbi5cblxuICBDaGFuZ2VkIGluIHZlcnNpb24gMi43LlxuXG5cbldpdGggU3RhdGVtZW50IENvbnRleHQgTWFuYWdlcnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5BICpjb250ZXh0IG1hbmFnZXIqIGlzIGFuIG9iamVjdCB0aGF0IGRlZmluZXMgdGhlIHJ1bnRpbWUgY29udGV4dCB0b1xuYmUgZXN0YWJsaXNoZWQgd2hlbiBleGVjdXRpbmcgYSBgYHdpdGhgYCBzdGF0ZW1lbnQuIFRoZSBjb250ZXh0XG5tYW5hZ2VyIGhhbmRsZXMgdGhlIGVudHJ5IGludG8sIGFuZCB0aGUgZXhpdCBmcm9tLCB0aGUgZGVzaXJlZCBydW50aW1lXG5jb250ZXh0IGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBibG9jayBvZiBjb2RlLiAgQ29udGV4dCBtYW5hZ2VycyBhcmVcbm5vcm1hbGx5IGludm9rZWQgdXNpbmcgdGhlIGBgd2l0aGBgIHN0YXRlbWVudCAoZGVzY3JpYmVkIGluIHNlY3Rpb25cbipUaGUgd2l0aCBzdGF0ZW1lbnQqKSwgYnV0IGNhbiBhbHNvIGJlIHVzZWQgYnkgZGlyZWN0bHkgaW52b2tpbmcgdGhlaXJcbm1ldGhvZHMuXG5cblR5cGljYWwgdXNlcyBvZiBjb250ZXh0IG1hbmFnZXJzIGluY2x1ZGUgc2F2aW5nIGFuZCByZXN0b3JpbmcgdmFyaW91c1xua2luZHMgb2YgZ2xvYmFsIHN0YXRlLCBsb2NraW5nIGFuZCB1bmxvY2tpbmcgcmVzb3VyY2VzLCBjbG9zaW5nIG9wZW5lZFxuZmlsZXMsIGV0Yy5cblxuRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gY29udGV4dCBtYW5hZ2Vycywgc2VlICpDb250ZXh0IE1hbmFnZXIgVHlwZXMqLlxuXG5vYmplY3QuX19lbnRlcl9fKHNlbGYpXG5cbiAgIEVudGVyIHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIGBgd2l0aGBgXG4gICBzdGF0ZW1lbnQgd2lsbCBiaW5kIHRoaXMgbWV0aG9kXCdzIHJldHVybiB2YWx1ZSB0byB0aGUgdGFyZ2V0KHMpXG4gICBzcGVjaWZpZWQgaW4gdGhlIGBgYXNgYCBjbGF1c2Ugb2YgdGhlIHN0YXRlbWVudCwgaWYgYW55LlxuXG5vYmplY3QuX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKVxuXG4gICBFeGl0IHRoZSBydW50aW1lIGNvbnRleHQgcmVsYXRlZCB0byB0aGlzIG9iamVjdC4gVGhlIHBhcmFtZXRlcnNcbiAgIGRlc2NyaWJlIHRoZSBleGNlcHRpb24gdGhhdCBjYXVzZWQgdGhlIGNvbnRleHQgdG8gYmUgZXhpdGVkLiBJZiB0aGVcbiAgIGNvbnRleHQgd2FzIGV4aXRlZCB3aXRob3V0IGFuIGV4Y2VwdGlvbiwgYWxsIHRocmVlIGFyZ3VtZW50cyB3aWxsXG4gICBiZSBgYE5vbmVgYC5cblxuICAgSWYgYW4gZXhjZXB0aW9uIGlzIHN1cHBsaWVkLCBhbmQgdGhlIG1ldGhvZCB3aXNoZXMgdG8gc3VwcHJlc3MgdGhlXG4gICBleGNlcHRpb24gKGkuZS4sIHByZXZlbnQgaXQgZnJvbSBiZWluZyBwcm9wYWdhdGVkKSwgaXQgc2hvdWxkXG4gICByZXR1cm4gYSB0cnVlIHZhbHVlLiBPdGhlcndpc2UsIHRoZSBleGNlcHRpb24gd2lsbCBiZSBwcm9jZXNzZWRcbiAgIG5vcm1hbGx5IHVwb24gZXhpdCBmcm9tIHRoaXMgbWV0aG9kLlxuXG4gICBOb3RlIHRoYXQgYGBfX2V4aXRfXygpYGAgbWV0aG9kcyBzaG91bGQgbm90IHJlcmFpc2UgdGhlIHBhc3NlZC1pblxuICAgZXhjZXB0aW9uOyB0aGlzIGlzIHRoZSBjYWxsZXJcJ3MgcmVzcG9uc2liaWxpdHkuXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAwMzQzKiogLSBUaGUgIndpdGgiIHN0YXRlbWVudFxuICAgICAgVGhlIHNwZWNpZmljYXRpb24sIGJhY2tncm91bmQsIGFuZCBleGFtcGxlcyBmb3IgdGhlIFB5dGhvblxuICAgICAgYGB3aXRoYGAgc3RhdGVtZW50LlxuXG5cblNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3Igb2xkLXN0eWxlIGNsYXNzZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuRm9yIG9sZC1zdHlsZSBjbGFzc2VzLCBzcGVjaWFsIG1ldGhvZHMgYXJlIGFsd2F5cyBsb29rZWQgdXAgaW4gZXhhY3RseVxudGhlIHNhbWUgd2F5IGFzIGFueSBvdGhlciBtZXRob2Qgb3IgYXR0cmlidXRlLiBUaGlzIGlzIHRoZSBjYXNlXG5yZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIG1ldGhvZCBpcyBiZWluZyBsb29rZWQgdXAgZXhwbGljaXRseSBhcyBpblxuYGB4Ll9fZ2V0aXRlbV9fKGkpYGAgb3IgaW1wbGljaXRseSBhcyBpbiBgYHhbaV1gYC5cblxuVGhpcyBiZWhhdmlvdXIgbWVhbnMgdGhhdCBzcGVjaWFsIG1ldGhvZHMgbWF5IGV4aGliaXQgZGlmZmVyZW50XG5iZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYSBzaW5nbGUgb2xkLXN0eWxlIGNsYXNzIGlmIHRoZVxuYXBwcm9wcmlhdGUgc3BlY2lhbCBhdHRyaWJ1dGVzIGFyZSBzZXQgZGlmZmVyZW50bHk6XG5cbiAgID4+PiBjbGFzcyBDOlxuICAgLi4uICAgICBwYXNzXG4gICAuLi5cbiAgID4+PiBjMSA9IEMoKVxuICAgPj4+IGMyID0gQygpXG4gICA+Pj4gYzEuX19sZW5fXyA9IGxhbWJkYTogNVxuICAgPj4+IGMyLl9fbGVuX18gPSBsYW1iZGE6IDlcbiAgID4+PiBsZW4oYzEpXG4gICA1XG4gICA+Pj4gbGVuKGMyKVxuICAgOVxuXG5cblNwZWNpYWwgbWV0aG9kIGxvb2t1cCBmb3IgbmV3LXN0eWxlIGNsYXNzZXNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuRm9yIG5ldy1zdHlsZSBjbGFzc2VzLCBpbXBsaWNpdCBpbnZvY2F0aW9ucyBvZiBzcGVjaWFsIG1ldGhvZHMgYXJlXG5vbmx5IGd1YXJhbnRlZWQgdG8gd29yayBjb3JyZWN0bHkgaWYgZGVmaW5lZCBvbiBhbiBvYmplY3RcJ3MgdHlwZSwgbm90XG5pbiB0aGUgb2JqZWN0XCdzIGluc3RhbmNlIGRpY3Rpb25hcnkuICBUaGF0IGJlaGF2aW91ciBpcyB0aGUgcmVhc29uIHdoeVxudGhlIGZvbGxvd2luZyBjb2RlIHJhaXNlcyBhbiBleGNlcHRpb24gKHVubGlrZSB0aGUgZXF1aXZhbGVudCBleGFtcGxlXG53aXRoIG9sZC1zdHlsZSBjbGFzc2VzKTpcblxuICAgPj4+IGNsYXNzIEMob2JqZWN0KTpcbiAgIC4uLiAgICAgcGFzc1xuICAgLi4uXG4gICA+Pj4gYyA9IEMoKVxuICAgPj4+IGMuX19sZW5fXyA9IGxhbWJkYTogNVxuICAgPj4+IGxlbihjKVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBvYmplY3Qgb2YgdHlwZSBcJ0NcJyBoYXMgbm8gbGVuKClcblxuVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcyBiZWhhdmlvdXIgbGllcyB3aXRoIGEgbnVtYmVyIG9mIHNwZWNpYWxcbm1ldGhvZHMgc3VjaCBhcyBgYF9faGFzaF9fKClgYCBhbmQgYGBfX3JlcHJfXygpYGAgdGhhdCBhcmUgaW1wbGVtZW50ZWRcbmJ5IGFsbCBvYmplY3RzLCBpbmNsdWRpbmcgdHlwZSBvYmplY3RzLiBJZiB0aGUgaW1wbGljaXQgbG9va3VwIG9mXG50aGVzZSBtZXRob2RzIHVzZWQgdGhlIGNvbnZlbnRpb25hbCBsb29rdXAgcHJvY2VzcywgdGhleSB3b3VsZCBmYWlsXG53aGVuIGludm9rZWQgb24gdGhlIHR5cGUgb2JqZWN0IGl0c2VsZjpcblxuICAgPj4+IDEgLl9faGFzaF9fKCkgPT0gaGFzaCgxKVxuICAgVHJ1ZVxuICAgPj4+IGludC5fX2hhc2hfXygpID09IGhhc2goaW50KVxuICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOlxuICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA8bW9kdWxlPlxuICAgVHlwZUVycm9yOiBkZXNjcmlwdG9yIFwnX19oYXNoX19cJyBvZiBcJ2ludFwnIG9iamVjdCBuZWVkcyBhbiBhcmd1bWVudFxuXG5JbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvIGludm9rZSBhbiB1bmJvdW5kIG1ldGhvZCBvZiBhIGNsYXNzIGluIHRoaXNcbndheSBpcyBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgXCdtZXRhY2xhc3MgY29uZnVzaW9uXCcsIGFuZCBpcyBhdm9pZGVkXG5ieSBieXBhc3NpbmcgdGhlIGluc3RhbmNlIHdoZW4gbG9va2luZyB1cCBzcGVjaWFsIG1ldGhvZHM6XG5cbiAgID4+PiB0eXBlKDEpLl9faGFzaF9fKDEpID09IGhhc2goMSlcbiAgIFRydWVcbiAgID4+PiB0eXBlKGludCkuX19oYXNoX18oaW50KSA9PSBoYXNoKGludClcbiAgIFRydWVcblxuSW4gYWRkaXRpb24gdG8gYnlwYXNzaW5nIGFueSBpbnN0YW5jZSBhdHRyaWJ1dGVzIGluIHRoZSBpbnRlcmVzdCBvZlxuY29ycmVjdG5lc3MsIGltcGxpY2l0IHNwZWNpYWwgbWV0aG9kIGxvb2t1cCBnZW5lcmFsbHkgYWxzbyBieXBhc3Nlc1xudGhlIGBgX19nZXRhdHRyaWJ1dGVfXygpYGAgbWV0aG9kIGV2ZW4gb2YgdGhlIG9iamVjdFwncyBtZXRhY2xhc3M6XG5cbiAgID4+PiBjbGFzcyBNZXRhKHR5cGUpOlxuICAgLi4uICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICBwcmludCAiTWV0YWNsYXNzIGdldGF0dHJpYnV0ZSBpbnZva2VkIlxuICAgLi4uICAgICAgIHJldHVybiB0eXBlLl9fZ2V0YXR0cmlidXRlX18oKmFyZ3MpXG4gICAuLi5cbiAgID4+PiBjbGFzcyBDKG9iamVjdCk6XG4gICAuLi4gICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhXG4gICAuLi4gICAgIGRlZiBfX2xlbl9fKHNlbGYpOlxuICAgLi4uICAgICAgICAgcmV0dXJuIDEwXG4gICAuLi4gICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKCphcmdzKTpcbiAgIC4uLiAgICAgICAgIHByaW50ICJDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZCJcbiAgIC4uLiAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXygqYXJncylcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLl9fbGVuX18oKSAgICAgICAgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIGluc3RhbmNlXG4gICBDbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiB0eXBlKGMpLl9fbGVuX18oYykgICAgICAgICAgIyBFeHBsaWNpdCBsb29rdXAgdmlhIHR5cGVcbiAgIE1ldGFjbGFzcyBnZXRhdHRyaWJ1dGUgaW52b2tlZFxuICAgMTBcbiAgID4+PiBsZW4oYykgICAgICAgICAgICAgICAgICAgICAgIyBJbXBsaWNpdCBsb29rdXBcbiAgIDEwXG5cbkJ5cGFzc2luZyB0aGUgYGBfX2dldGF0dHJpYnV0ZV9fKClgYCBtYWNoaW5lcnkgaW4gdGhpcyBmYXNoaW9uXG5wcm92aWRlcyBzaWduaWZpY2FudCBzY29wZSBmb3Igc3BlZWQgb3B0aW1pc2F0aW9ucyB3aXRoaW4gdGhlXG5pbnRlcnByZXRlciwgYXQgdGhlIGNvc3Qgb2Ygc29tZSBmbGV4aWJpbGl0eSBpbiB0aGUgaGFuZGxpbmcgb2ZcbnNwZWNpYWwgbWV0aG9kcyAodGhlIHNwZWNpYWwgbWV0aG9kICptdXN0KiBiZSBzZXQgb24gdGhlIGNsYXNzIG9iamVjdFxuaXRzZWxmIGluIG9yZGVyIHRvIGJlIGNvbnNpc3RlbnRseSBpbnZva2VkIGJ5IHRoZSBpbnRlcnByZXRlcikuXG5cbi1bIEZvb3Rub3RlcyBdLVxuXG5bMV0gSXQgKmlzKiBwb3NzaWJsZSBpbiBzb21lIGNhc2VzIHRvIGNoYW5nZSBhbiBvYmplY3RcJ3MgdHlwZSwgdW5kZXJcbiAgICBjZXJ0YWluIGNvbnRyb2xsZWQgY29uZGl0aW9ucy4gSXQgZ2VuZXJhbGx5IGlzblwndCBhIGdvb2QgaWRlYVxuICAgIHRob3VnaCwgc2luY2UgaXQgY2FuIGxlYWQgdG8gc29tZSB2ZXJ5IHN0cmFuZ2UgYmVoYXZpb3VyIGlmIGl0IGlzXG4gICAgaGFuZGxlZCBpbmNvcnJlY3RseS5cblxuWzJdIEZvciBvcGVyYW5kcyBvZiB0aGUgc2FtZSB0eXBlLCBpdCBpcyBhc3N1bWVkIHRoYXQgaWYgdGhlIG5vbi1cbiAgICByZWZsZWN0ZWQgbWV0aG9kIChzdWNoIGFzIGBgX19hZGRfXygpYGApIGZhaWxzIHRoZSBvcGVyYXRpb24gaXNcbiAgICBub3Qgc3VwcG9ydGVkLCB3aGljaCBpcyB3aHkgdGhlIHJlZmxlY3RlZCBtZXRob2QgaXMgbm90IGNhbGxlZC5cbicsCisgJ3N0cmluZy1tZXRob2RzJzogJ1xuU3RyaW5nIE1ldGhvZHNcbioqKioqKioqKioqKioqXG5cbkJlbG93IGFyZSBsaXN0ZWQgdGhlIHN0cmluZyBtZXRob2RzIHdoaWNoIGJvdGggOC1iaXQgc3RyaW5ncyBhbmRcblVuaWNvZGUgb2JqZWN0cyBzdXBwb3J0LiAgU29tZSBvZiB0aGVtIGFyZSBhbHNvIGF2YWlsYWJsZSBvblxuYGBieXRlYXJyYXlgYCBvYmplY3RzLlxuXG5JbiBhZGRpdGlvbiwgUHl0aG9uXCdzIHN0cmluZ3Mgc3VwcG9ydCB0aGUgc2VxdWVuY2UgdHlwZSBtZXRob2RzXG5kZXNjcmliZWQgaW4gdGhlICpTZXF1ZW5jZSBUeXBlcyAtLS0gc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZSxcbmJ5dGVhcnJheSwgYnVmZmVyLCB4cmFuZ2UqIHNlY3Rpb24uIFRvIG91dHB1dCBmb3JtYXR0ZWQgc3RyaW5ncyB1c2VcbnRlbXBsYXRlIHN0cmluZ3Mgb3IgdGhlIGBgJWBgIG9wZXJhdG9yIGRlc2NyaWJlZCBpbiB0aGUgKlN0cmluZ1xuRm9ybWF0dGluZyBPcGVyYXRpb25zKiBzZWN0aW9uLiBBbHNvLCBzZWUgdGhlIGBgcmVgYCBtb2R1bGUgZm9yIHN0cmluZ1xuZnVuY3Rpb25zIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG5cbnN0ci5jYXBpdGFsaXplKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZFxuICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIFBhZGRpbmcgaXMgZG9uZVxuICAgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGEgc3BhY2UpLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YipcbiAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kXG4gICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cbnN0ci5kZWNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pXG5cbiAgIERlY29kZXMgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgKmVuY29kaW5nKi5cbiAgICplbmNvZGluZyogZGVmYXVsdHMgdG8gdGhlIGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5XG4gICBiZSBnaXZlbiB0byBzZXQgYSBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGBgVW5pY29kZUVycm9yYGAuXG4gICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLCBgYFwncmVwbGFjZVwnYGAgYW5kIGFueSBvdGhlclxuICAgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZSBzZWN0aW9uICpDb2RlY1xuICAgQmFzZSBDbGFzc2VzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzXG4gICBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pXG5cbiAgIFJldHVybiBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZy4gIERlZmF1bHQgZW5jb2RpbmcgaXMgdGhlXG4gICBjdXJyZW50IGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhXG4gICBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgZm9yICplcnJvcnMqIGlzXG4gICBgYFwnc3RyaWN0XCdgYCwgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXG4gICBgYFVuaWNvZGVFcnJvcmBgLiAgT3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSBgYFwnaWdub3JlXCdgYCxcbiAgIGBgXCdyZXBsYWNlXCdgYCwgYGBcJ3htbGNoYXJyZWZyZXBsYWNlXCdgYCwgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZFxuICAgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWEgYGBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoKWBgLCBzZWVcbiAgIHNlY3Rpb24gKkNvZGVjIEJhc2UgQ2xhc3NlcyouIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWVcbiAgIHNlY3Rpb24gKlN0YW5kYXJkIEVuY29kaW5ncyouXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGBcJ3htbGNoYXJyZWZyZXBsYWNlXCdgYCBhbmRcbiAgIGBgXCdiYWNrc2xhc2hyZXBsYWNlXCdgYCBhbmQgb3RoZXIgZXJyb3IgaGFuZGxpbmcgc2NoZW1lcyBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAqc3VmZml4KixcbiAgIG90aGVyd2lzZSByZXR1cm4gYGBGYWxzZWBgLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZlxuICAgc3VmZml4ZXMgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0XG4gICB0aGF0IHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEFjY2VwdCB0dXBsZXMgYXMgKnN1ZmZpeCouXG5cbnN0ci5leHBhbmR0YWJzKFt0YWJzaXplXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWRcbiAgIGJ5IG9uZSBvciBtb3JlIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlXG4gICBnaXZlbiB0YWIgc2l6ZS4gIFRhYiBwb3NpdGlvbnMgb2NjdXIgZXZlcnkgKnRhYnNpemUqIGNoYXJhY3RlcnNcbiAgIChkZWZhdWx0IGlzIDgsIGdpdmluZyB0YWIgcG9zaXRpb25zIGF0IGNvbHVtbnMgMCwgOCwgMTYgYW5kIHNvIG9uKS5cbiAgIFRvIGV4cGFuZCB0aGUgc3RyaW5nLCB0aGUgY3VycmVudCBjb2x1bW4gaXMgc2V0IHRvIHplcm8gYW5kIHRoZVxuICAgc3RyaW5nIGlzIGV4YW1pbmVkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuICBJZiB0aGUgY2hhcmFjdGVyIGlzIGFcbiAgIHRhYiAoYGBcXHRgYCksIG9uZSBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkIGluIHRoZVxuICAgcmVzdWx0IHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgcG9zaXRpb24uXG4gICAoVGhlIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciBpcyBhXG4gICBuZXdsaW5lIChgYFxcbmBgKSBvciByZXR1cm4gKGBgXFxyYGApLCBpdCBpcyBjb3BpZWQgYW5kIHRoZSBjdXJyZW50XG4gICBjb2x1bW4gaXMgcmVzZXQgdG8gemVyby4gIEFueSBvdGhlciBjaGFyYWN0ZXIgaXMgY29waWVkIHVuY2hhbmdlZFxuICAgYW5kIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBpbmNyZW1lbnRlZCBieSBvbmUgcmVnYXJkbGVzcyBvZiBob3cgdGhlXG4gICBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgd2hlbiBwcmludGVkLlxuXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoKVxuICAgXCcwMSAgICAgIDAxMiAgICAgMDEyMyAgICAwMTIzNFwnXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoNClcbiAgIFwnMDEgIDAxMiAwMTIzICAgIDAxMjM0XCdcblxuc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIGluIHRoZSBzbGljZSBgYHNbc3RhcnQ6ZW5kXWBgLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gYGAtMWBgIGlmICpzdWIqIGlzIG5vdCBmb3VuZC5cblxuICAgTm90ZTogVGhlIGBgZmluZCgpYGAgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IG5lZWQgdG8ga25vdyB0aGVcbiAgICAgcG9zaXRpb24gb2YgKnN1YiouICBUbyBjaGVjayBpZiAqc3ViKiBpcyBhIHN1YnN0cmluZyBvciBub3QsIHVzZVxuICAgICB0aGUgYGBpbmBgIG9wZXJhdG9yOlxuXG4gICAgICAgID4+PiBcJ1B5XCcgaW4gXCdQeXRob25cJ1xuICAgICAgICBUcnVlXG5cbnN0ci5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKVxuXG4gICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzXG4gICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciByZXBsYWNlbWVudCBmaWVsZHNcbiAgIGRlbGltaXRlZCBieSBicmFjZXMgYGB7fWBgLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCBjb250YWlucyBlaXRoZXJcbiAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgb2YgYVxuICAga2V5d29yZCBhcmd1bWVudC4gIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgZWFjaFxuICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZVxuICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC5cblxuICAgPj4+ICJUaGUgc3VtIG9mIDEgKyAyIGlzIHswfSIuZm9ybWF0KDErMilcbiAgIFwnVGhlIHN1bSBvZiAxICsgMiBpcyAzXCdcblxuICAgU2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXNcbiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuXG5cbiAgIFRoaXMgbWV0aG9kIG9mIHN0cmluZyBmb3JtYXR0aW5nIGlzIHRoZSBuZXcgc3RhbmRhcmQgaW4gUHl0aG9uIDMsXG4gICBhbmQgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB0aGUgYGAlYGAgZm9ybWF0dGluZyBkZXNjcmliZWQgaW5cbiAgICpTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zKiBpbiBuZXcgY29kZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5zdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYGZpbmQoKWBgLCBidXQgcmFpc2UgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdFxuICAgZm91bmQuXG5cbnN0ci5pc2FsbnVtKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzYWxwaGEoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzZGlnaXQoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzXG4gICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNsb3dlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSBsb3dlcmNhc2VcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNzcGFjZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdGl0bGUoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0XG4gICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seVxuICAgZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLlxuICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3VwcGVyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIHVwcGVyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5qb2luKGl0ZXJhYmxlKVxuXG4gICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0cmluZ3MgaW4gdGhlXG4gICAqaXRlcmFibGUqICppdGVyYWJsZSouICBUaGUgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlXG4gICBzdHJpbmcgcHJvdmlkaW5nIHRoaXMgbWV0aG9kLlxuXG5zdHIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuICBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLmxvd2VyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XVxuICAgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5sc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5sc3RyaXAoKVxuICAgXCdzcGFjaW91cyAgIFwnXG4gICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5sc3RyaXAoXCdjbW93ei5cJylcbiAgIFwnZXhhbXBsZS5jb21cJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIucGFydGl0aW9uKHNlcClcblxuICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgZm9sbG93ZWQgYnlcbiAgIHR3byBlbXB0eSBzdHJpbmdzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yZXBsYWNlKG9sZCwgbmV3WywgY291bnRdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpvbGQqXG4gICByZXBsYWNlZCBieSAqbmV3Ki4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqY291bnQqIGlzIGdpdmVuLCBvbmx5XG4gICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG5cbnN0ci5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIHdpdGhpbiBgYHNbc3RhcnQ6ZW5kXWBgLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gYGAtMWBgIG9uIGZhaWx1cmUuXG5cbnN0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYHJmaW5kKClgYCBidXQgcmFpc2VzIGBgVmFsdWVFcnJvcmBgIHdoZW4gdGhlIHN1YnN0cmluZyAqc3ViKlxuICAgaXMgbm90IGZvdW5kLlxuXG5zdHIucmp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYVxuICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLnJwYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYVxuICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXG4gICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcbiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5XG4gICB0aGUgc3RyaW5nIGl0c2VsZi5cblxuICAgTmV3IGluIHZlcnNpb24gMi41LlxuXG5zdHIucnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHNcbiAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3JcbiAgIGBgTm9uZWBgLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuICBFeGNlcHQgZm9yXG4gICBzcGxpdHRpbmcgZnJvbSB0aGUgcmlnaHQsIGBgcnNwbGl0KClgYCBiZWhhdmVzIGxpa2UgYGBzcGxpdCgpYGBcbiAgIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNC5cblxuc3RyLnJzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHN1ZmZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5yc3RyaXAoKVxuICAgXCcgICBzcGFjaW91c1wnXG4gICA+Pj4gXCdtaXNzaXNzaXBwaVwnLnJzdHJpcChcJ2lwelwnKVxuICAgXCdtaXNzaXNzXCdcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC5cblxuc3RyLnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCpcbiAgIHNwbGl0cyBhcmUgZG9uZSAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgYGBtYXhzcGxpdCsxYGBcbiAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciBgYC0xYGAsIHRoZW4gdGhlcmUgaXNcbiAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzIGFyZSBtYWRlKS5cblxuICAgSWYgKnNlcCogaXMgZ2l2ZW4sIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXJlIG5vdCBncm91cGVkIHRvZ2V0aGVyXG4gICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLFxuICAgYGBcJzEsLDJcJy5zcGxpdChcJyxcJylgYCByZXR1cm5zIGBgW1wnMVwnLCBcJ1wnLCBcJzJcJ11gYCkuICBUaGUgKnNlcCpcbiAgIGFyZ3VtZW50IG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgYGBcJzE8PjI8PjNcJy5zcGxpdChcJzw+XCcpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyXCcsIFwnM1wnXWBgKS4gU3BsaXR0aW5nXG4gICBhbiBlbXB0eSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBzZXBhcmF0b3IgcmV0dXJucyBgYFtcJ1wnXWBgLlxuXG4gICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGBgTm9uZWBgLCBhIGRpZmZlcmVudCBzcGxpdHRpbmdcbiAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgYXJlIHJlZ2FyZGVkXG4gICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyBlbXB0eSBzdHJpbmdzXG4gICBhdCB0aGUgc3RhcnQgb3IgZW5kIGlmIHRoZSBzdHJpbmcgaGFzIGxlYWRpbmcgb3IgdHJhaWxpbmdcbiAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmdcbiAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSBgYE5vbmVgYCBzZXBhcmF0b3IgcmV0dXJuc1xuICAgYGBbXWBgLlxuXG4gICBGb3IgZXhhbXBsZSwgYGBcJyAxICAyICAgMyAgXCcuc3BsaXQoKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMlwnLCBcJzNcJ11gYCxcbiAgIGFuZCBgYFwnICAxICAyICAgMyAgXCcuc3BsaXQoTm9uZSwgMSlgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzIgICAzICBcJ11gYC5cblxuc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZVxuICAgYm91bmRhcmllcy4gVGhpcyBtZXRob2QgdXNlcyB0aGUgKnVuaXZlcnNhbCBuZXdsaW5lcyogYXBwcm9hY2ggdG9cbiAgIHNwbGl0dGluZyBsaW5lcy4gTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3RcbiAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLlxuXG4gICBGb3IgZXhhbXBsZSwgYGBcJ2FiIGNcXG5cXG5kZSBmZ1xccmtsXFxyXFxuXCcuc3BsaXRsaW5lcygpYGAgcmV0dXJuc1xuICAgYGBbXCdhYiBjXCcsIFwnXCcsIFwnZGUgZmdcJywgXCdrbFwnXWBgLCB3aGlsZSB0aGUgc2FtZSBjYWxsIHdpdGhcbiAgIGBgc3BsaXRsaW5lcyhUcnVlKWBgIHJldHVybnMgYGBbXCdhYiBjXFxuXCcsIFwnXFxuXCcsIFwnZGUgZmdcXHJcJyxcbiAgIFwna2xcXHJcXG5cJ11gYC5cblxuICAgVW5saWtlIGBgc3BsaXQoKWBgIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzXG4gICBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGZvciB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgYSB0ZXJtaW5hbFxuICAgbGluZSBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZS5cblxuc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgKnByZWZpeCosIG90aGVyd2lzZVxuICAgcmV0dXJuIGBgRmFsc2VgYC4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byBsb29rXG4gICBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqcHJlZml4Ki5cblxuc3RyLnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuICAgY2hhcmFjdGVycyByZW1vdmVkLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZVxuICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhlXG4gICAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuIFRoZSAqY2hhcnMqXG4gICBhcmd1bWVudCBpcyBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzXG4gICB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnN0cmlwKClcbiAgIFwnc3BhY2lvdXNcJ1xuICAgPj4+IFwnd3d3LmV4YW1wbGUuY29tXCcuc3RyaXAoXCdjbW93ei5cJylcbiAgIFwnZXhhbXBsZVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5zd2FwY2FzZSgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0b1xuICAgbG93ZXJjYXNlIGFuZCB2aWNlIHZlcnNhLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLnRpdGxlKClcblxuICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgc3RhcnQgd2l0aCBhblxuICAgdXBwZXJjYXNlIGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBsb3dlcmNhc2UuXG5cbiAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGFcbiAgIHdvcmQgYXMgZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGxldHRlcnMuICBUaGUgZGVmaW5pdGlvbiB3b3JrcyBpblxuICAgbWFueSBjb250ZXh0cyBidXQgaXQgbWVhbnMgdGhhdCBhcG9zdHJvcGhlcyBpbiBjb250cmFjdGlvbnMgYW5kXG4gICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgZGVzaXJlZFxuICAgcmVzdWx0OlxuXG4gICAgICA+Pj4gInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcyBmcm9tIHRoZSBVSyIudGl0bGUoKVxuICAgICAgIlRoZXlcJ1JlIEJpbGxcJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayJcblxuICAgQSB3b3JrYXJvdW5kIGZvciBhcG9zdHJvcGhlcyBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgcmVndWxhclxuICAgZXhwcmVzc2lvbnM6XG5cbiAgICAgID4+PiBpbXBvcnQgcmVcbiAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOlxuICAgICAgLi4uICAgICByZXR1cm4gcmUuc3ViKHIiW0EtWmEtel0rKFwnW0EtWmEtel0rKT8iLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtby5ncm91cCgwKVsxOl0ubG93ZXIoKSxcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKVxuICAgICAgLi4uXG4gICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMuIilcbiAgICAgICJUaGV5XCdyZSBCaWxsXCdzIEZyaWVuZHMuIlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLnRyYW5zbGF0ZSh0YWJsZVssIGRlbGV0ZWNoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGVcbiAgIG9wdGlvbmFsIGFyZ3VtZW50ICpkZWxldGVjaGFycyogYXJlIHJlbW92ZWQsIGFuZCB0aGUgcmVtYWluaW5nXG4gICBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUsXG4gICB3aGljaCBtdXN0IGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAyNTYuXG5cbiAgIFlvdSBjYW4gdXNlIHRoZSBgYG1ha2V0cmFucygpYGAgaGVscGVyIGZ1bmN0aW9uIGluIHRoZSBgYHN0cmluZ2BgXG4gICBtb2R1bGUgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gdGFibGUuIEZvciBzdHJpbmcgb2JqZWN0cywgc2V0IHRoZVxuICAgKnRhYmxlKiBhcmd1bWVudCB0byBgYE5vbmVgYCBmb3IgdHJhbnNsYXRpb25zIHRoYXQgb25seSBkZWxldGVcbiAgIGNoYXJhY3RlcnM6XG5cbiAgID4+PiBcJ3JlYWQgdGhpcyBzaG9ydCB0ZXh0XCcudHJhbnNsYXRlKE5vbmUsIFwnYWVpb3VcJylcbiAgIFwncmQgdGhzIHNocnQgdHh0XCdcblxuICAgTmV3IGluIHZlcnNpb24gMi42OiBTdXBwb3J0IGZvciBhIGBgTm9uZWBgICp0YWJsZSogYXJndW1lbnQuXG5cbiAgIEZvciBVbmljb2RlIG9iamVjdHMsIHRoZSBgYHRyYW5zbGF0ZSgpYGAgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCB0aGVcbiAgIG9wdGlvbmFsICpkZWxldGVjaGFycyogYXJndW1lbnQuICBJbnN0ZWFkLCBpdCByZXR1cm5zIGEgY29weSBvZiB0aGVcbiAgICpzKiB3aGVyZSBhbGwgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuXG4gICB0cmFuc2xhdGlvbiB0YWJsZSB3aGljaCBtdXN0IGJlIGEgbWFwcGluZyBvZiBVbmljb2RlIG9yZGluYWxzIHRvXG4gICBVbmljb2RlIG9yZGluYWxzLCBVbmljb2RlIHN0cmluZ3Mgb3IgYGBOb25lYGAuIFVubWFwcGVkIGNoYXJhY3RlcnNcbiAgIGFyZSBsZWZ0IHVudG91Y2hlZC4gQ2hhcmFjdGVycyBtYXBwZWQgdG8gYGBOb25lYGAgYXJlIGRlbGV0ZWQuXG4gICBOb3RlLCBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggaXMgdG8gY3JlYXRlIGEgY3VzdG9tIGNoYXJhY3RlclxuICAgbWFwcGluZyBjb2RlYyB1c2luZyB0aGUgYGBjb2RlY3NgYCBtb2R1bGUgKHNlZSBgYGVuY29kaW5ncy5jcDEyNTFgYFxuICAgZm9yIGFuIGV4YW1wbGUpLlxuXG5zdHIudXBwZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLiAgTm90ZSB0aGF0IGBgc3RyLnVwcGVyKCkuaXN1cHBlcigpYGAgbWlnaHRcbiAgIGJlIGBgRmFsc2VgYCBpZiBgYHNgYCBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlIFVuaWNvZGVcbiAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiIChMZXR0ZXIsXG4gICB1cHBlcmNhc2UpLCBidXQgZS5nLiAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZyBvZlxuICAgbGVuZ3RoICp3aWR0aCouICBBIHNpZ24gcHJlZml4IGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgVGhlIG9yaWdpbmFsXG4gICBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGBsZW4ocylgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLjIuXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHJlc2VudCBvbmx5IG9uIHVuaWNvZGUgb2JqZWN0czpcblxudW5pY29kZS5pc251bWVyaWMoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgbnVtZXJpYyBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBOdW1lcmljIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LFxuICAgZS5nLiBVKzIxNTUsIFZVTEdBUiBGUkFDVElPTiBPTkUgRklGVEguXG5cbnVuaWNvZGUuaXNkZWNpbWFsKClcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSBvbmx5IGRlY2ltYWwgY2hhcmFjdGVycyBpbiBTLFxuICAgYGBGYWxzZWBgIG90aGVyd2lzZS4gRGVjaW1hbCBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycyxcbiAgIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvcm0gZGVjaW1hbC1yYWRpeCBudW1iZXJzLFxuICAgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLlxuJywKKyAnc3RyaW5ncyc6ICdcblN0cmluZyBsaXRlcmFsc1xuKioqKioqKioqKioqKioqXG5cblN0cmluZyBsaXRlcmFscyBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBmb2xsb3dpbmcgbGV4aWNhbCBkZWZpbml0aW9uczpcblxuICAgc3RyaW5nbGl0ZXJhbCAgIDo6PSBbc3RyaW5ncHJlZml4XShzaG9ydHN0cmluZyB8IGxvbmdzdHJpbmcpXG4gICBzdHJpbmdwcmVmaXggICAgOjo9ICJyIiB8ICJ1IiB8ICJ1ciIgfCAiUiIgfCAiVSIgfCAiVVIiIHwgIlVyIiB8ICJ1UiJcbiAgICAgICAgICAgICAgICAgICAgfCAiYiIgfCAiQiIgfCAiYnIiIHwgIkJyIiB8ICJiUiIgfCAiQlIiXG4gICBzaG9ydHN0cmluZyAgICAgOjo9ICJcJyIgc2hvcnRzdHJpbmdpdGVtKiAiXCciIHwgXCciXCcgc2hvcnRzdHJpbmdpdGVtKiBcJyJcJ1xuICAgbG9uZ3N0cmluZyAgICAgIDo6PSAiXCdcJ1wnIiBsb25nc3RyaW5naXRlbSogIlwnXCdcJyJcbiAgICAgICAgICAgICAgICAgIHwgXCciIiJcJyBsb25nc3RyaW5naXRlbSogXCciIiJcJ1xuICAgc2hvcnRzdHJpbmdpdGVtIDo6PSBzaG9ydHN0cmluZ2NoYXIgfCBlc2NhcGVzZXFcbiAgIGxvbmdzdHJpbmdpdGVtICA6Oj0gbG9uZ3N0cmluZ2NoYXIgfCBlc2NhcGVzZXFcbiAgIHNob3J0c3RyaW5nY2hhciA6Oj0gPGFueSBzb3VyY2UgY2hhcmFjdGVyIGV4Y2VwdCAiXFwiIG9yIG5ld2xpbmUgb3IgdGhlIHF1b3RlPlxuICAgbG9uZ3N0cmluZ2NoYXIgIDo6PSA8YW55IHNvdXJjZSBjaGFyYWN0ZXIgZXhjZXB0ICJcXCI+XG4gICBlc2NhcGVzZXEgICAgICAgOjo9ICJcXCIgPGFueSBBU0NJSSBjaGFyYWN0ZXI+XG5cbk9uZSBzeW50YWN0aWMgcmVzdHJpY3Rpb24gbm90IGluZGljYXRlZCBieSB0aGVzZSBwcm9kdWN0aW9ucyBpcyB0aGF0XG53aGl0ZXNwYWNlIGlzIG5vdCBhbGxvd2VkIGJldHdlZW4gdGhlIGBgc3RyaW5ncHJlZml4YGAgYW5kIHRoZSByZXN0IG9mXG50aGUgc3RyaW5nIGxpdGVyYWwuIFRoZSBzb3VyY2UgY2hhcmFjdGVyIHNldCBpcyBkZWZpbmVkIGJ5IHRoZVxuZW5jb2RpbmcgZGVjbGFyYXRpb247IGl0IGlzIEFTQ0lJIGlmIG5vIGVuY29kaW5nIGRlY2xhcmF0aW9uIGlzIGdpdmVuXG5pbiB0aGUgc291cmNlIGZpbGU7IHNlZSBzZWN0aW9uICpFbmNvZGluZyBkZWNsYXJhdGlvbnMqLlxuXG5JbiBwbGFpbiBFbmdsaXNoOiBTdHJpbmcgbGl0ZXJhbHMgY2FuIGJlIGVuY2xvc2VkIGluIG1hdGNoaW5nIHNpbmdsZVxucXVvdGVzIChgYFwnYGApIG9yIGRvdWJsZSBxdW90ZXMgKGBgImBgKS4gIFRoZXkgY2FuIGFsc28gYmUgZW5jbG9zZWQgaW5cbm1hdGNoaW5nIGdyb3VwcyBvZiB0aHJlZSBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyAodGhlc2UgYXJlIGdlbmVyYWxseVxucmVmZXJyZWQgdG8gYXMgKnRyaXBsZS1xdW90ZWQgc3RyaW5ncyopLiAgVGhlIGJhY2tzbGFzaCAoYGBcXGBgKVxuY2hhcmFjdGVyIGlzIHVzZWQgdG8gZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBvdGhlcndpc2UgaGF2ZSBhIHNwZWNpYWxcbm1lYW5pbmcsIHN1Y2ggYXMgbmV3bGluZSwgYmFja3NsYXNoIGl0c2VsZiwgb3IgdGhlIHF1b3RlIGNoYXJhY3Rlci5cblN0cmluZyBsaXRlcmFscyBtYXkgb3B0aW9uYWxseSBiZSBwcmVmaXhlZCB3aXRoIGEgbGV0dGVyIGBgXCdyXCdgYCBvclxuYGBcJ1JcJ2BgOyBzdWNoIHN0cmluZ3MgYXJlIGNhbGxlZCAqcmF3IHN0cmluZ3MqIGFuZCB1c2UgZGlmZmVyZW50IHJ1bGVzXG5mb3IgaW50ZXJwcmV0aW5nIGJhY2tzbGFzaCBlc2NhcGUgc2VxdWVuY2VzLiAgQSBwcmVmaXggb2YgYGBcJ3VcJ2BgIG9yXG5gYFwnVVwnYGAgbWFrZXMgdGhlIHN0cmluZyBhIFVuaWNvZGUgc3RyaW5nLiAgVW5pY29kZSBzdHJpbmdzIHVzZSB0aGVcblVuaWNvZGUgY2hhcmFjdGVyIHNldCBhcyBkZWZpbmVkIGJ5IHRoZSBVbmljb2RlIENvbnNvcnRpdW0gYW5kIElTT1xuMTA2NDYuICBTb21lIGFkZGl0aW9uYWwgZXNjYXBlIHNlcXVlbmNlcywgZGVzY3JpYmVkIGJlbG93LCBhcmVcbmF2YWlsYWJsZSBpbiBVbmljb2RlIHN0cmluZ3MuIEEgcHJlZml4IG9mIGBgXCdiXCdgYCBvciBgYFwnQlwnYGAgaXNcbmlnbm9yZWQgaW4gUHl0aG9uIDI7IGl0IGluZGljYXRlcyB0aGF0IHRoZSBsaXRlcmFsIHNob3VsZCBiZWNvbWUgYVxuYnl0ZXMgbGl0ZXJhbCBpbiBQeXRob24gMyAoZS5nLiB3aGVuIGNvZGUgaXMgYXV0b21hdGljYWxseSBjb252ZXJ0ZWRcbndpdGggMnRvMykuICBBIGBgXCd1XCdgYCBvciBgYFwnYlwnYGAgcHJlZml4IG1heSBiZSBmb2xsb3dlZCBieSBhbiBgYFwnclwnYGBcbnByZWZpeC5cblxuSW4gdHJpcGxlLXF1b3RlZCBzdHJpbmdzLCB1bmVzY2FwZWQgbmV3bGluZXMgYW5kIHF1b3RlcyBhcmUgYWxsb3dlZFxuKGFuZCBhcmUgcmV0YWluZWQpLCBleGNlcHQgdGhhdCB0aHJlZSB1bmVzY2FwZWQgcXVvdGVzIGluIGEgcm93XG50ZXJtaW5hdGUgdGhlIHN0cmluZy4gIChBICJxdW90ZSIgaXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIG9wZW4gdGhlXG5zdHJpbmcsIGkuZS4gZWl0aGVyIGBgXCdgYCBvciBgYCJgYC4pXG5cblVubGVzcyBhbiBgYFwnclwnYGAgb3IgYGBcJ1JcJ2BgIHByZWZpeCBpcyBwcmVzZW50LCBlc2NhcGUgc2VxdWVuY2VzIGluXG5zdHJpbmdzIGFyZSBpbnRlcnByZXRlZCBhY2NvcmRpbmcgdG8gcnVsZXMgc2ltaWxhciB0byB0aG9zZSB1c2VkIGJ5XG5TdGFuZGFyZCBDLiAgVGhlIHJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgRXNjYXBlIFNlcXVlbmNlICAgfCBNZWFuaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgYGBcXG5ld2xpbmVgYCAgICAgIHwgSWdub3JlZCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxcXGBgICAgICAgICAgICAgfCBCYWNrc2xhc2ggKGBgXFxgYCkgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxcJ2BgICAgICAgICAgICAgfCBTaW5nbGUgcXVvdGUgKGBgXCdgYCkgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFwiYGAgICAgICAgICAgICB8IERvdWJsZSBxdW90ZSAoYGAiYGApICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcYWBgICAgICAgICAgICAgfCBBU0NJSSBCZWxsIChCRUwpICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXGJgYCAgICAgICAgICAgIHwgQVNDSUkgQmFja3NwYWNlIChCUykgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxmYGAgICAgICAgICAgICB8IEFTQ0lJIEZvcm1mZWVkIChGRikgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcbmBgICAgICAgICAgICAgfCBBU0NJSSBMaW5lZmVlZCAoTEYpICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXE57bmFtZX1gYCAgICAgIHwgQ2hhcmFjdGVyIG5hbWVkICpuYW1lKiBpbiB0aGUgICAgIHwgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgVW5pY29kZSBkYXRhYmFzZSAoVW5pY29kZSBvbmx5KSAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxyYGAgICAgICAgICAgICB8IEFTQ0lJIENhcnJpYWdlIFJldHVybiAoQ1IpICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcdGBgICAgICAgICAgICAgfCBBU0NJSSBIb3Jpem9udGFsIFRhYiAoVEFCKSAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXHV4eHh4YGAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggMTYtYml0IGhleCB2YWx1ZSAgIHwgKDEpICAgICB8XG58ICAgICAgICAgICAgICAgICAgIHwgKnh4eHgqIChVbmljb2RlIG9ubHkpICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFxVeHh4eHh4eHhgYCAgICB8IENoYXJhY3RlciB3aXRoIDMyLWJpdCBoZXggdmFsdWUgICB8ICgyKSAgICAgfFxufCAgICAgICAgICAgICAgICAgICB8ICp4eHh4eHh4eCogKFVuaWNvZGUgb25seSkgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFxcdmBgICAgICAgICAgICAgfCBBU0NJSSBWZXJ0aWNhbCBUYWIgKFZUKSAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcXG9vb2BgICAgICAgICAgIHwgQ2hhcmFjdGVyIHdpdGggb2N0YWwgdmFsdWUgKm9vbyogIHwgKDMsNSkgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXFx4aGhgYCAgICAgICAgICB8IENoYXJhY3RlciB3aXRoIGhleCB2YWx1ZSAqaGgqICAgICB8ICg0LDUpICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xuXG5Ob3RlczpcblxuMS4gSW5kaXZpZHVhbCBjb2RlIHVuaXRzIHdoaWNoIGZvcm0gcGFydHMgb2YgYSBzdXJyb2dhdGUgcGFpciBjYW4gYmVcbiAgIGVuY29kZWQgdXNpbmcgdGhpcyBlc2NhcGUgc2VxdWVuY2UuXG5cbjIuIEFueSBVbmljb2RlIGNoYXJhY3RlciBjYW4gYmUgZW5jb2RlZCB0aGlzIHdheSwgYnV0IGNoYXJhY3RlcnNcbiAgIG91dHNpZGUgdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoQk1QKSB3aWxsIGJlIGVuY29kZWQgdXNpbmcgYVxuICAgc3Vycm9nYXRlIHBhaXIgaWYgUHl0aG9uIGlzIGNvbXBpbGVkIHRvIHVzZSAxNi1iaXQgY29kZSB1bml0cyAodGhlXG4gICBkZWZhdWx0KS4gIEluZGl2aWR1YWwgY29kZSB1bml0cyB3aGljaCBmb3JtIHBhcnRzIG9mIGEgc3Vycm9nYXRlXG4gICBwYWlyIGNhbiBiZSBlbmNvZGVkIHVzaW5nIHRoaXMgZXNjYXBlIHNlcXVlbmNlLlxuXG4zLiBBcyBpbiBTdGFuZGFyZCBDLCB1cCB0byB0aHJlZSBvY3RhbCBkaWdpdHMgYXJlIGFjY2VwdGVkLlxuXG40LiBVbmxpa2UgaW4gU3RhbmRhcmQgQywgZXhhY3RseSB0d28gaGV4IGRpZ2l0cyBhcmUgcmVxdWlyZWQuXG5cbjUuIEluIGEgc3RyaW5nIGxpdGVyYWwsIGhleGFkZWNpbWFsIGFuZCBvY3RhbCBlc2NhcGVzIGRlbm90ZSB0aGUgYnl0ZVxuICAgd2l0aCB0aGUgZ2l2ZW4gdmFsdWU7IGl0IGlzIG5vdCBuZWNlc3NhcnkgdGhhdCB0aGUgYnl0ZSBlbmNvZGVzIGFcbiAgIGNoYXJhY3RlciBpbiB0aGUgc291cmNlIGNoYXJhY3RlciBzZXQuIEluIGEgVW5pY29kZSBsaXRlcmFsLCB0aGVzZVxuICAgZXNjYXBlcyBkZW5vdGUgYSBVbmljb2RlIGNoYXJhY3RlciB3aXRoIHRoZSBnaXZlbiB2YWx1ZS5cblxuVW5saWtlIFN0YW5kYXJkIEMsIGFsbCB1bnJlY29nbml6ZWQgZXNjYXBlIHNlcXVlbmNlcyBhcmUgbGVmdCBpbiB0aGVcbnN0cmluZyB1bmNoYW5nZWQsIGkuZS4sICp0aGUgYmFja3NsYXNoIGlzIGxlZnQgaW4gdGhlIHN0cmluZyouICAoVGhpc1xuYmVoYXZpb3IgaXMgdXNlZnVsIHdoZW4gZGVidWdnaW5nOiBpZiBhbiBlc2NhcGUgc2VxdWVuY2UgaXMgbWlzdHlwZWQsXG50aGUgcmVzdWx0aW5nIG91dHB1dCBpcyBtb3JlIGVhc2lseSByZWNvZ25pemVkIGFzIGJyb2tlbi4pICBJdCBpcyBhbHNvXG5pbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBlc2NhcGUgc2VxdWVuY2VzIG1hcmtlZCBhcyAiKFVuaWNvZGUgb25seSkiXG5pbiB0aGUgdGFibGUgYWJvdmUgZmFsbCBpbnRvIHRoZSBjYXRlZ29yeSBvZiB1bnJlY29nbml6ZWQgZXNjYXBlcyBmb3Jcbm5vbi1Vbmljb2RlIHN0cmluZyBsaXRlcmFscy5cblxuV2hlbiBhbiBgYFwnclwnYGAgb3IgYGBcJ1JcJ2BgIHByZWZpeCBpcyBwcmVzZW50LCBhIGNoYXJhY3RlciBmb2xsb3dpbmcgYVxuYmFja3NsYXNoIGlzIGluY2x1ZGVkIGluIHRoZSBzdHJpbmcgd2l0aG91dCBjaGFuZ2UsIGFuZCAqYWxsXG5iYWNrc2xhc2hlcyBhcmUgbGVmdCBpbiB0aGUgc3RyaW5nKi4gIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nIGxpdGVyYWxcbmBgciJcXG4iYGAgY29uc2lzdHMgb2YgdHdvIGNoYXJhY3RlcnM6IGEgYmFja3NsYXNoIGFuZCBhIGxvd2VyY2FzZVxuYGBcJ25cJ2BgLiAgU3RyaW5nIHF1b3RlcyBjYW4gYmUgZXNjYXBlZCB3aXRoIGEgYmFja3NsYXNoLCBidXQgdGhlXG5iYWNrc2xhc2ggcmVtYWlucyBpbiB0aGUgc3RyaW5nOyBmb3IgZXhhbXBsZSwgYGByIlxcIiJgYCBpcyBhIHZhbGlkXG5zdHJpbmcgbGl0ZXJhbCBjb25zaXN0aW5nIG9mIHR3byBjaGFyYWN0ZXJzOiBhIGJhY2tzbGFzaCBhbmQgYSBkb3VibGVcbnF1b3RlOyBgYHIiXFwiYGAgaXMgbm90IGEgdmFsaWQgc3RyaW5nIGxpdGVyYWwgKGV2ZW4gYSByYXcgc3RyaW5nXG5jYW5ub3QgZW5kIGluIGFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMpLiAgU3BlY2lmaWNhbGx5LCAqYSByYXdcbnN0cmluZyBjYW5ub3QgZW5kIGluIGEgc2luZ2xlIGJhY2tzbGFzaCogKHNpbmNlIHRoZSBiYWNrc2xhc2ggd291bGRcbmVzY2FwZSB0aGUgZm9sbG93aW5nIHF1b3RlIGNoYXJhY3RlcikuICBOb3RlIGFsc28gdGhhdCBhIHNpbmdsZVxuYmFja3NsYXNoIGZvbGxvd2VkIGJ5IGEgbmV3bGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aG9zZSB0d28gY2hhcmFjdGVyc1xuYXMgcGFydCBvZiB0aGUgc3RyaW5nLCAqbm90KiBhcyBhIGxpbmUgY29udGludWF0aW9uLlxuXG5XaGVuIGFuIGBgXCdyXCdgYCBvciBgYFwnUlwnYGAgcHJlZml4IGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhXG5gYFwndVwnYGAgb3IgYGBcJ1VcJ2BgIHByZWZpeCwgdGhlbiB0aGUgYGBcXHVYWFhYYGAgYW5kIGBgXFxVWFhYWFhYWFhgYFxuZXNjYXBlIHNlcXVlbmNlcyBhcmUgcHJvY2Vzc2VkIHdoaWxlICAqYWxsIG90aGVyIGJhY2tzbGFzaGVzIGFyZSBsZWZ0XG5pbiB0aGUgc3RyaW5nKi4gRm9yIGV4YW1wbGUsIHRoZSBzdHJpbmcgbGl0ZXJhbCBgYHVyIlxcdTAwNjJcXG4iYGBcbmNvbnNpc3RzIG9mIHRocmVlIFVuaWNvZGUgY2hhcmFjdGVyczogXCdMQVRJTiBTTUFMTCBMRVRURVIgQlwnLCBcJ1JFVkVSU0VcblNPTElEVVNcJywgYW5kIFwnTEFUSU4gU01BTEwgTEVUVEVSIE5cJy4gQmFja3NsYXNoZXMgY2FuIGJlIGVzY2FwZWQgd2l0aFxuYSBwcmVjZWRpbmcgYmFja3NsYXNoOyBob3dldmVyLCBib3RoIHJlbWFpbiBpbiB0aGUgc3RyaW5nLiAgQXMgYVxucmVzdWx0LCBgYFxcdVhYWFhgYCBlc2NhcGUgc2VxdWVuY2VzIGFyZSBvbmx5IHJlY29nbml6ZWQgd2hlbiB0aGVyZSBhcmVcbmFuIG9kZCBudW1iZXIgb2YgYmFja3NsYXNoZXMuXG4nLAorICdzdWJzY3JpcHRpb25zJzogJ1xuU3Vic2NyaXB0aW9uc1xuKioqKioqKioqKioqKlxuXG5BIHN1YnNjcmlwdGlvbiBzZWxlY3RzIGFuIGl0ZW0gb2YgYSBzZXF1ZW5jZSAoc3RyaW5nLCB0dXBsZSBvciBsaXN0KVxub3IgbWFwcGluZyAoZGljdGlvbmFyeSkgb2JqZWN0OlxuXG4gICBzdWJzY3JpcHRpb24gOjo9IHByaW1hcnkgIlsiIGV4cHJlc3Npb25fbGlzdCAiXSJcblxuVGhlIHByaW1hcnkgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3Qgb2YgYSBzZXF1ZW5jZSBvciBtYXBwaW5nIHR5cGUuXG5cbklmIHRoZSBwcmltYXJ5IGlzIGEgbWFwcGluZywgdGhlIGV4cHJlc3Npb24gbGlzdCBtdXN0IGV2YWx1YXRlIHRvIGFuXG5vYmplY3Qgd2hvc2UgdmFsdWUgaXMgb25lIG9mIHRoZSBrZXlzIG9mIHRoZSBtYXBwaW5nLCBhbmQgdGhlXG5zdWJzY3JpcHRpb24gc2VsZWN0cyB0aGUgdmFsdWUgaW4gdGhlIG1hcHBpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGF0XG5rZXkuICAoVGhlIGV4cHJlc3Npb24gbGlzdCBpcyBhIHR1cGxlIGV4Y2VwdCBpZiBpdCBoYXMgZXhhY3RseSBvbmVcbml0ZW0uKVxuXG5JZiB0aGUgcHJpbWFyeSBpcyBhIHNlcXVlbmNlLCB0aGUgZXhwcmVzc2lvbiAobGlzdCkgbXVzdCBldmFsdWF0ZSB0byBhXG5wbGFpbiBpbnRlZ2VyLiAgSWYgdGhpcyB2YWx1ZSBpcyBuZWdhdGl2ZSwgdGhlIGxlbmd0aCBvZiB0aGUgc2VxdWVuY2VcbmlzIGFkZGVkIHRvIGl0IChzbyB0aGF0LCBlLmcuLCBgYHhbLTFdYGAgc2VsZWN0cyB0aGUgbGFzdCBpdGVtIG9mXG5gYHhgYC4pICBUaGUgcmVzdWx0aW5nIHZhbHVlIG11c3QgYmUgYSBub25uZWdhdGl2ZSBpbnRlZ2VyIGxlc3MgdGhhblxudGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc2VxdWVuY2UsIGFuZCB0aGUgc3Vic2NyaXB0aW9uIHNlbGVjdHMgdGhlXG5pdGVtIHdob3NlIGluZGV4IGlzIHRoYXQgdmFsdWUgKGNvdW50aW5nIGZyb20gemVybykuXG5cbkEgc3RyaW5nXCdzIGl0ZW1zIGFyZSBjaGFyYWN0ZXJzLiAgQSBjaGFyYWN0ZXIgaXMgbm90IGEgc2VwYXJhdGUgZGF0YVxudHlwZSBidXQgYSBzdHJpbmcgb2YgZXhhY3RseSBvbmUgY2hhcmFjdGVyLlxuJywKKyAndHJ1dGgnOiAiXG5UcnV0aCBWYWx1ZSBUZXN0aW5nXG4qKioqKioqKioqKioqKioqKioqXG5cbkFueSBvYmplY3QgY2FuIGJlIHRlc3RlZCBmb3IgdHJ1dGggdmFsdWUsIGZvciB1c2UgaW4gYW4gYGBpZmBgIG9yXG5gYHdoaWxlYGAgY29uZGl0aW9uIG9yIGFzIG9wZXJhbmQgb2YgdGhlIEJvb2xlYW4gb3BlcmF0aW9ucyBiZWxvdy4gVGhlXG5mb2xsb3dpbmcgdmFsdWVzIGFyZSBjb25zaWRlcmVkIGZhbHNlOlxuXG4qIGBgTm9uZWBgXG5cbiogYGBGYWxzZWBgXG5cbiogemVybyBvZiBhbnkgbnVtZXJpYyB0eXBlLCBmb3IgZXhhbXBsZSwgYGAwYGAsIGBgMExgYCwgYGAwLjBgYCxcbiAgYGAwamBgLlxuXG4qIGFueSBlbXB0eSBzZXF1ZW5jZSwgZm9yIGV4YW1wbGUsIGBgJydgYCwgYGAoKWBgLCBgYFtdYGAuXG5cbiogYW55IGVtcHR5IG1hcHBpbmcsIGZvciBleGFtcGxlLCBgYHt9YGAuXG5cbiogaW5zdGFuY2VzIG9mIHVzZXItZGVmaW5lZCBjbGFzc2VzLCBpZiB0aGUgY2xhc3MgZGVmaW5lcyBhXG4gIGBgX19ub256ZXJvX18oKWBgIG9yIGBgX19sZW5fXygpYGAgbWV0aG9kLCB3aGVuIHRoYXQgbWV0aG9kIHJldHVybnNcbiAgdGhlIGludGVnZXIgemVybyBvciBgYGJvb2xgYCB2YWx1ZSBgYEZhbHNlYGAuIFsxXVxuXG5BbGwgb3RoZXIgdmFsdWVzIGFyZSBjb25zaWRlcmVkIHRydWUgLS0tIHNvIG9iamVjdHMgb2YgbWFueSB0eXBlcyBhcmVcbmFsd2F5cyB0cnVlLlxuXG5PcGVyYXRpb25zIGFuZCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGEgQm9vbGVhbiByZXN1bHQgYWx3YXlzXG5yZXR1cm4gYGAwYGAgb3IgYGBGYWxzZWBgIGZvciBmYWxzZSBhbmQgYGAxYGAgb3IgYGBUcnVlYGAgZm9yIHRydWUsXG51bmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZC4gKEltcG9ydGFudCBleGNlcHRpb246IHRoZSBCb29sZWFuIG9wZXJhdGlvbnNcbmBgb3JgYCBhbmQgYGBhbmRgYCBhbHdheXMgcmV0dXJuIG9uZSBvZiB0aGVpciBvcGVyYW5kcy4pXG4iLAorICd0cnknOiAnXG5UaGUgYGB0cnlgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKlxuXG5UaGUgYGB0cnlgYCBzdGF0ZW1lbnQgc3BlY2lmaWVzIGV4Y2VwdGlvbiBoYW5kbGVycyBhbmQvb3IgY2xlYW51cCBjb2RlXG5mb3IgYSBncm91cCBvZiBzdGF0ZW1lbnRzOlxuXG4gICB0cnlfc3RtdCAgOjo9IHRyeTFfc3RtdCB8IHRyeTJfc3RtdFxuICAgdHJ5MV9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgKCJleGNlcHQiIFtleHByZXNzaW9uIFsoImFzIiB8ICIsIikgdGFyZ2V0XV0gIjoiIHN1aXRlKStcbiAgICAgICAgICAgICAgICAgWyJlbHNlIiAiOiIgc3VpdGVdXG4gICAgICAgICAgICAgICAgIFsiZmluYWxseSIgIjoiIHN1aXRlXVxuICAgdHJ5Ml9zdG10IDo6PSAidHJ5IiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgImZpbmFsbHkiICI6IiBzdWl0ZVxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi41OiBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQeXRob24sXG5gYHRyeWBgLi4uYGBleGNlcHRgYC4uLmBgZmluYWxseWBgIGRpZCBub3Qgd29yay4gYGB0cnlgYC4uLmBgZXhjZXB0YGBcbmhhZCB0byBiZSBuZXN0ZWQgaW4gYGB0cnlgYC4uLmBgZmluYWxseWBgLlxuXG5UaGUgYGBleGNlcHRgYCBjbGF1c2Uocykgc3BlY2lmeSBvbmUgb3IgbW9yZSBleGNlcHRpb24gaGFuZGxlcnMuIFdoZW5cbm5vIGV4Y2VwdGlvbiBvY2N1cnMgaW4gdGhlIGBgdHJ5YGAgY2xhdXNlLCBubyBleGNlcHRpb24gaGFuZGxlciBpc1xuZXhlY3V0ZWQuIFdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycyBpbiB0aGUgYGB0cnlgYCBzdWl0ZSwgYSBzZWFyY2ggZm9yXG5hbiBleGNlcHRpb24gaGFuZGxlciBpcyBzdGFydGVkLiAgVGhpcyBzZWFyY2ggaW5zcGVjdHMgdGhlIGV4Y2VwdFxuY2xhdXNlcyBpbiB0dXJuIHVudGlsIG9uZSBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIGV4Y2VwdGlvbi4gIEFuXG5leHByZXNzaW9uLWxlc3MgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgbXVzdCBiZSBsYXN0OyBpdCBtYXRjaGVzXG5hbnkgZXhjZXB0aW9uLiAgRm9yIGFuIGV4Y2VwdCBjbGF1c2Ugd2l0aCBhbiBleHByZXNzaW9uLCB0aGF0XG5leHByZXNzaW9uIGlzIGV2YWx1YXRlZCwgYW5kIHRoZSBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uIGlmIHRoZVxucmVzdWx0aW5nIG9iamVjdCBpcyAiY29tcGF0aWJsZSIgd2l0aCB0aGUgZXhjZXB0aW9uLiAgQW4gb2JqZWN0IGlzXG5jb21wYXRpYmxlIHdpdGggYW4gZXhjZXB0aW9uIGlmIGl0IGlzIHRoZSBjbGFzcyBvciBhIGJhc2UgY2xhc3Mgb2YgdGhlXG5leGNlcHRpb24gb2JqZWN0LCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgYW4gaXRlbSBjb21wYXRpYmxlIHdpdGggdGhlXG5leGNlcHRpb24uXG5cbklmIG5vIGV4Y2VwdCBjbGF1c2UgbWF0Y2hlcyB0aGUgZXhjZXB0aW9uLCB0aGUgc2VhcmNoIGZvciBhbiBleGNlcHRpb25cbmhhbmRsZXIgY29udGludWVzIGluIHRoZSBzdXJyb3VuZGluZyBjb2RlIGFuZCBvbiB0aGUgaW52b2NhdGlvbiBzdGFjay5cblsxXVxuXG5JZiB0aGUgZXZhbHVhdGlvbiBvZiBhbiBleHByZXNzaW9uIGluIHRoZSBoZWFkZXIgb2YgYW4gZXhjZXB0IGNsYXVzZVxucmFpc2VzIGFuIGV4Y2VwdGlvbiwgdGhlIG9yaWdpbmFsIHNlYXJjaCBmb3IgYSBoYW5kbGVyIGlzIGNhbmNlbGVkIGFuZFxuYSBzZWFyY2ggc3RhcnRzIGZvciB0aGUgbmV3IGV4Y2VwdGlvbiBpbiB0aGUgc3Vycm91bmRpbmcgY29kZSBhbmQgb25cbnRoZSBjYWxsIHN0YWNrIChpdCBpcyB0cmVhdGVkIGFzIGlmIHRoZSBlbnRpcmUgYGB0cnlgYCBzdGF0ZW1lbnRcbnJhaXNlZCB0aGUgZXhjZXB0aW9uKS5cblxuV2hlbiBhIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2UgaXMgZm91bmQsIHRoZSBleGNlcHRpb24gaXMgYXNzaWduZWQgdG9cbnRoZSB0YXJnZXQgc3BlY2lmaWVkIGluIHRoYXQgZXhjZXB0IGNsYXVzZSwgaWYgcHJlc2VudCwgYW5kIHRoZSBleGNlcHRcbmNsYXVzZVwncyBzdWl0ZSBpcyBleGVjdXRlZC4gIEFsbCBleGNlcHQgY2xhdXNlcyBtdXN0IGhhdmUgYW5cbmV4ZWN1dGFibGUgYmxvY2suICBXaGVuIHRoZSBlbmQgb2YgdGhpcyBibG9jayBpcyByZWFjaGVkLCBleGVjdXRpb25cbmNvbnRpbnVlcyBub3JtYWxseSBhZnRlciB0aGUgZW50aXJlIHRyeSBzdGF0ZW1lbnQuICAoVGhpcyBtZWFucyB0aGF0XG5pZiB0d28gbmVzdGVkIGhhbmRsZXJzIGV4aXN0IGZvciB0aGUgc2FtZSBleGNlcHRpb24sIGFuZCB0aGUgZXhjZXB0aW9uXG5vY2N1cnMgaW4gdGhlIHRyeSBjbGF1c2Ugb2YgdGhlIGlubmVyIGhhbmRsZXIsIHRoZSBvdXRlciBoYW5kbGVyIHdpbGxcbm5vdCBoYW5kbGUgdGhlIGV4Y2VwdGlvbi4pXG5cbkJlZm9yZSBhbiBleGNlcHQgY2xhdXNlXCdzIHN1aXRlIGlzIGV4ZWN1dGVkLCBkZXRhaWxzIGFib3V0IHRoZVxuZXhjZXB0aW9uIGFyZSBhc3NpZ25lZCB0byB0aHJlZSB2YXJpYWJsZXMgaW4gdGhlIGBgc3lzYGAgbW9kdWxlOlxuYGBzeXMuZXhjX3R5cGVgYCByZWNlaXZlcyB0aGUgb2JqZWN0IGlkZW50aWZ5aW5nIHRoZSBleGNlcHRpb247XG5gYHN5cy5leGNfdmFsdWVgYCByZWNlaXZlcyB0aGUgZXhjZXB0aW9uXCdzIHBhcmFtZXRlcjtcbmBgc3lzLmV4Y190cmFjZWJhY2tgYCByZWNlaXZlcyBhIHRyYWNlYmFjayBvYmplY3QgKHNlZSBzZWN0aW9uICpUaGVcbnN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KikgaWRlbnRpZnlpbmcgdGhlIHBvaW50IGluIHRoZSBwcm9ncmFtIHdoZXJlXG50aGUgZXhjZXB0aW9uIG9jY3VycmVkLiBUaGVzZSBkZXRhaWxzIGFyZSBhbHNvIGF2YWlsYWJsZSB0aHJvdWdoIHRoZVxuYGBzeXMuZXhjX2luZm8oKWBgIGZ1bmN0aW9uLCB3aGljaCByZXR1cm5zIGEgdHVwbGUgYGAoZXhjX3R5cGUsXG5leGNfdmFsdWUsIGV4Y190cmFjZWJhY2spYGAuICBVc2Ugb2YgdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGVzIGlzXG5kZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoaXMgZnVuY3Rpb24sIHNpbmNlIHRoZWlyIHVzZSBpcyB1bnNhZmUgaW4gYVxudGhyZWFkZWQgcHJvZ3JhbS4gIEFzIG9mIFB5dGhvbiAxLjUsIHRoZSB2YXJpYWJsZXMgYXJlIHJlc3RvcmVkIHRvXG50aGVpciBwcmV2aW91cyB2YWx1ZXMgKGJlZm9yZSB0aGUgY2FsbCkgd2hlbiByZXR1cm5pbmcgZnJvbSBhIGZ1bmN0aW9uXG50aGF0IGhhbmRsZWQgYW4gZXhjZXB0aW9uLlxuXG5UaGUgb3B0aW9uYWwgYGBlbHNlYGAgY2xhdXNlIGlzIGV4ZWN1dGVkIGlmIGFuZCB3aGVuIGNvbnRyb2wgZmxvd3Mgb2ZmXG50aGUgZW5kIG9mIHRoZSBgYHRyeWBgIGNsYXVzZS4gWzJdIEV4Y2VwdGlvbnMgaW4gdGhlIGBgZWxzZWBgIGNsYXVzZVxuYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgYGBleGNlcHRgYCBjbGF1c2VzLlxuXG5JZiBgYGZpbmFsbHlgYCBpcyBwcmVzZW50LCBpdCBzcGVjaWZpZXMgYSBcJ2NsZWFudXBcJyBoYW5kbGVyLiAgVGhlXG5gYHRyeWBgIGNsYXVzZSBpcyBleGVjdXRlZCwgaW5jbHVkaW5nIGFueSBgYGV4Y2VwdGBgIGFuZCBgYGVsc2VgYFxuY2xhdXNlcy4gIElmIGFuIGV4Y2VwdGlvbiBvY2N1cnMgaW4gYW55IG9mIHRoZSBjbGF1c2VzIGFuZCBpcyBub3RcbmhhbmRsZWQsIHRoZSBleGNlcHRpb24gaXMgdGVtcG9yYXJpbHkgc2F2ZWQuIFRoZSBgYGZpbmFsbHlgYCBjbGF1c2UgaXNcbmV4ZWN1dGVkLiAgSWYgdGhlcmUgaXMgYSBzYXZlZCBleGNlcHRpb24sIGl0IGlzIHJlLXJhaXNlZCBhdCB0aGUgZW5kXG5vZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlLiBJZiB0aGUgYGBmaW5hbGx5YGAgY2xhdXNlIHJhaXNlcyBhbm90aGVyXG5leGNlcHRpb24gb3IgZXhlY3V0ZXMgYSBgYHJldHVybmBgIG9yIGBgYnJlYWtgYCBzdGF0ZW1lbnQsIHRoZSBzYXZlZFxuZXhjZXB0aW9uIGlzIGRpc2NhcmRlZDpcblxuICAgZGVmIGYoKTpcbiAgICAgICB0cnk6XG4gICAgICAgICAgIDEvMFxuICAgICAgIGZpbmFsbHk6XG4gICAgICAgICAgIHJldHVybiA0MlxuXG4gICA+Pj4gZigpXG4gICA0MlxuXG5UaGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgdG8gdGhlIHByb2dyYW0gZHVyaW5nXG5leGVjdXRpb24gb2YgdGhlIGBgZmluYWxseWBgIGNsYXVzZS5cblxuV2hlbiBhIGBgcmV0dXJuYGAsIGBgYnJlYWtgYCBvciBgYGNvbnRpbnVlYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkIGluXG50aGUgYGB0cnlgYCBzdWl0ZSBvZiBhIGBgdHJ5YGAuLi5gYGZpbmFsbHlgYCBzdGF0ZW1lbnQsIHRoZVxuYGBmaW5hbGx5YGAgY2xhdXNlIGlzIGFsc28gZXhlY3V0ZWQgXCdvbiB0aGUgd2F5IG91dC5cJyBBIGBgY29udGludWVgYFxuc3RhdGVtZW50IGlzIGlsbGVnYWwgaW4gdGhlIGBgZmluYWxseWBgIGNsYXVzZS4gKFRoZSByZWFzb24gaXMgYVxucHJvYmxlbSB3aXRoIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIC0tLSB0aGlzIHJlc3RyaWN0aW9uIG1heSBiZVxubGlmdGVkIGluIHRoZSBmdXR1cmUpLlxuXG5BZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGV4Y2VwdGlvbnMgY2FuIGJlIGZvdW5kIGluIHNlY3Rpb25cbipFeGNlcHRpb25zKiwgYW5kIGluZm9ybWF0aW9uIG9uIHVzaW5nIHRoZSBgYHJhaXNlYGAgc3RhdGVtZW50IHRvXG5nZW5lcmF0ZSBleGNlcHRpb25zIG1heSBiZSBmb3VuZCBpbiBzZWN0aW9uICpUaGUgcmFpc2Ugc3RhdGVtZW50Ki5cbicsCisgJ3R5cGVzJzogJ1xuVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5XG4qKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQmVsb3cgaXMgYSBsaXN0IG9mIHRoZSB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvIFB5dGhvbi4gIEV4dGVuc2lvblxubW9kdWxlcyAod3JpdHRlbiBpbiBDLCBKYXZhLCBvciBvdGhlciBsYW5ndWFnZXMsIGRlcGVuZGluZyBvbiB0aGVcbmltcGxlbWVudGF0aW9uKSBjYW4gZGVmaW5lIGFkZGl0aW9uYWwgdHlwZXMuICBGdXR1cmUgdmVyc2lvbnMgb2ZcblB5dGhvbiBtYXkgYWRkIHR5cGVzIHRvIHRoZSB0eXBlIGhpZXJhcmNoeSAoZS5nLiwgcmF0aW9uYWwgbnVtYmVycyxcbmVmZmljaWVudGx5IHN0b3JlZCBhcnJheXMgb2YgaW50ZWdlcnMsIGV0Yy4pLlxuXG5Tb21lIG9mIHRoZSB0eXBlIGRlc2NyaXB0aW9ucyBiZWxvdyBjb250YWluIGEgcGFyYWdyYXBoIGxpc3Rpbmdcblwnc3BlY2lhbCBhdHRyaWJ1dGVzLlwnICBUaGVzZSBhcmUgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZVxuaW1wbGVtZW50YXRpb24gYW5kIGFyZSBub3QgaW50ZW5kZWQgZm9yIGdlbmVyYWwgdXNlLiAgVGhlaXIgZGVmaW5pdGlvblxubWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLlxuXG5Ob25lXG4gICBUaGlzIHR5cGUgaGFzIGEgc2luZ2xlIHZhbHVlLiAgVGhlcmUgaXMgYSBzaW5nbGUgb2JqZWN0IHdpdGggdGhpc1xuICAgdmFsdWUuIFRoaXMgb2JqZWN0IGlzIGFjY2Vzc2VkIHRocm91Z2ggdGhlIGJ1aWx0LWluIG5hbWUgYGBOb25lYGAuXG4gICBJdCBpcyB1c2VkIHRvIHNpZ25pZnkgdGhlIGFic2VuY2Ugb2YgYSB2YWx1ZSBpbiBtYW55IHNpdHVhdGlvbnMsXG4gICBlLmcuLCBpdCBpcyByZXR1cm5lZCBmcm9tIGZ1bmN0aW9ucyB0aGF0IGRvblwndCBleHBsaWNpdGx5IHJldHVyblxuICAgYW55dGhpbmcuIEl0cyB0cnV0aCB2YWx1ZSBpcyBmYWxzZS5cblxuTm90SW1wbGVtZW50ZWRcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZVxuICAgYGBOb3RJbXBsZW1lbnRlZGBgLiBOdW1lcmljIG1ldGhvZHMgYW5kIHJpY2ggY29tcGFyaXNvbiBtZXRob2RzIG1heVxuICAgcmV0dXJuIHRoaXMgdmFsdWUgaWYgdGhleSBkbyBub3QgaW1wbGVtZW50IHRoZSBvcGVyYXRpb24gZm9yIHRoZVxuICAgb3BlcmFuZHMgcHJvdmlkZWQuICAoVGhlIGludGVycHJldGVyIHdpbGwgdGhlbiB0cnkgdGhlIHJlZmxlY3RlZFxuICAgb3BlcmF0aW9uLCBvciBzb21lIG90aGVyIGZhbGxiYWNrLCBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdG9yLikgIEl0c1xuICAgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cblxuRWxsaXBzaXNcbiAgIFRoaXMgdHlwZSBoYXMgYSBzaW5nbGUgdmFsdWUuICBUaGVyZSBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGlzXG4gICB2YWx1ZS4gVGhpcyBvYmplY3QgaXMgYWNjZXNzZWQgdGhyb3VnaCB0aGUgYnVpbHQtaW4gbmFtZVxuICAgYGBFbGxpcHNpc2BgLiBJdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiB0aGUgYGAuLi5gYFxuICAgc3ludGF4IGluIGEgc2xpY2UuICBJdHMgdHJ1dGggdmFsdWUgaXMgdHJ1ZS5cblxuYGBudW1iZXJzLk51bWJlcmBgXG4gICBUaGVzZSBhcmUgY3JlYXRlZCBieSBudW1lcmljIGxpdGVyYWxzIGFuZCByZXR1cm5lZCBhcyByZXN1bHRzIGJ5XG4gICBhcml0aG1ldGljIG9wZXJhdG9ycyBhbmQgYXJpdGhtZXRpYyBidWlsdC1pbiBmdW5jdGlvbnMuICBOdW1lcmljXG4gICBvYmplY3RzIGFyZSBpbW11dGFibGU7IG9uY2UgY3JlYXRlZCB0aGVpciB2YWx1ZSBuZXZlciBjaGFuZ2VzLlxuICAgUHl0aG9uIG51bWJlcnMgYXJlIG9mIGNvdXJzZSBzdHJvbmdseSByZWxhdGVkIHRvIG1hdGhlbWF0aWNhbFxuICAgbnVtYmVycywgYnV0IHN1YmplY3QgdG8gdGhlIGxpbWl0YXRpb25zIG9mIG51bWVyaWNhbCByZXByZXNlbnRhdGlvblxuICAgaW4gY29tcHV0ZXJzLlxuXG4gICBQeXRob24gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGludGVnZXJzLCBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhbmRcbiAgIGNvbXBsZXggbnVtYmVyczpcblxuICAgYGBudW1iZXJzLkludGVncmFsYGBcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBlbGVtZW50cyBmcm9tIHRoZSBtYXRoZW1hdGljYWwgc2V0IG9mIGludGVnZXJzXG4gICAgICAocG9zaXRpdmUgYW5kIG5lZ2F0aXZlKS5cblxuICAgICAgVGhlcmUgYXJlIHRocmVlIHR5cGVzIG9mIGludGVnZXJzOlxuXG4gICAgICBQbGFpbiBpbnRlZ2Vyc1xuICAgICAgICAgVGhlc2UgcmVwcmVzZW50IG51bWJlcnMgaW4gdGhlIHJhbmdlIC0yMTQ3NDgzNjQ4IHRocm91Z2hcbiAgICAgICAgIDIxNDc0ODM2NDcuIChUaGUgcmFuZ2UgbWF5IGJlIGxhcmdlciBvbiBtYWNoaW5lcyB3aXRoIGFcbiAgICAgICAgIGxhcmdlciBuYXR1cmFsIHdvcmQgc2l6ZSwgYnV0IG5vdCBzbWFsbGVyLikgIFdoZW4gdGhlIHJlc3VsdFxuICAgICAgICAgb2YgYW4gb3BlcmF0aW9uIHdvdWxkIGZhbGwgb3V0c2lkZSB0aGlzIHJhbmdlLCB0aGUgcmVzdWx0IGlzXG4gICAgICAgICBub3JtYWxseSByZXR1cm5lZCBhcyBhIGxvbmcgaW50ZWdlciAoaW4gc29tZSBjYXNlcywgdGhlXG4gICAgICAgICBleGNlcHRpb24gYGBPdmVyZmxvd0Vycm9yYGAgaXMgcmFpc2VkIGluc3RlYWQpLiAgRm9yIHRoZVxuICAgICAgICAgcHVycG9zZSBvZiBzaGlmdCBhbmQgbWFzayBvcGVyYXRpb25zLCBpbnRlZ2VycyBhcmUgYXNzdW1lZCB0b1xuICAgICAgICAgaGF2ZSBhIGJpbmFyeSwgMlwncyBjb21wbGVtZW50IG5vdGF0aW9uIHVzaW5nIDMyIG9yIG1vcmUgYml0cyxcbiAgICAgICAgIGFuZCBoaWRpbmcgbm8gYml0cyBmcm9tIHRoZSB1c2VyIChpLmUuLCBhbGwgNDI5NDk2NzI5NlxuICAgICAgICAgZGlmZmVyZW50IGJpdCBwYXR0ZXJucyBjb3JyZXNwb25kIHRvIGRpZmZlcmVudCB2YWx1ZXMpLlxuXG4gICAgICBMb25nIGludGVnZXJzXG4gICAgICAgICBUaGVzZSByZXByZXNlbnQgbnVtYmVycyBpbiBhbiB1bmxpbWl0ZWQgcmFuZ2UsIHN1YmplY3QgdG9cbiAgICAgICAgIGF2YWlsYWJsZSAodmlydHVhbCkgbWVtb3J5IG9ubHkuICBGb3IgdGhlIHB1cnBvc2Ugb2Ygc2hpZnRcbiAgICAgICAgIGFuZCBtYXNrIG9wZXJhdGlvbnMsIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIGlzIGFzc3VtZWQsIGFuZFxuICAgICAgICAgbmVnYXRpdmUgbnVtYmVycyBhcmUgcmVwcmVzZW50ZWQgaW4gYSB2YXJpYW50IG9mIDJcJ3NcbiAgICAgICAgIGNvbXBsZW1lbnQgd2hpY2ggZ2l2ZXMgdGhlIGlsbHVzaW9uIG9mIGFuIGluZmluaXRlIHN0cmluZyBvZlxuICAgICAgICAgc2lnbiBiaXRzIGV4dGVuZGluZyB0byB0aGUgbGVmdC5cblxuICAgICAgQm9vbGVhbnNcbiAgICAgICAgIFRoZXNlIHJlcHJlc2VudCB0aGUgdHJ1dGggdmFsdWVzIEZhbHNlIGFuZCBUcnVlLiAgVGhlIHR3b1xuICAgICAgICAgb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIHZhbHVlcyBGYWxzZSBhbmQgVHJ1ZSBhcmUgdGhlIG9ubHlcbiAgICAgICAgIEJvb2xlYW4gb2JqZWN0cy4gVGhlIEJvb2xlYW4gdHlwZSBpcyBhIHN1YnR5cGUgb2YgcGxhaW5cbiAgICAgICAgIGludGVnZXJzLCBhbmQgQm9vbGVhbiB2YWx1ZXMgYmVoYXZlIGxpa2UgdGhlIHZhbHVlcyAwIGFuZCAxLFxuICAgICAgICAgcmVzcGVjdGl2ZWx5LCBpbiBhbG1vc3QgYWxsIGNvbnRleHRzLCB0aGUgZXhjZXB0aW9uIGJlaW5nXG4gICAgICAgICB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgc3RyaW5nLCB0aGUgc3RyaW5ncyBgYCJGYWxzZSJgYCBvclxuICAgICAgICAgYGAiVHJ1ZSJgYCBhcmUgcmV0dXJuZWQsIHJlc3BlY3RpdmVseS5cblxuICAgICAgVGhlIHJ1bGVzIGZvciBpbnRlZ2VyIHJlcHJlc2VudGF0aW9uIGFyZSBpbnRlbmRlZCB0byBnaXZlIHRoZVxuICAgICAgbW9zdCBtZWFuaW5nZnVsIGludGVycHJldGF0aW9uIG9mIHNoaWZ0IGFuZCBtYXNrIG9wZXJhdGlvbnNcbiAgICAgIGludm9sdmluZyBuZWdhdGl2ZSBpbnRlZ2VycyBhbmQgdGhlIGxlYXN0IHN1cnByaXNlcyB3aGVuXG4gICAgICBzd2l0Y2hpbmcgYmV0d2VlbiB0aGUgcGxhaW4gYW5kIGxvbmcgaW50ZWdlciBkb21haW5zLiAgQW55XG4gICAgICBvcGVyYXRpb24sIGlmIGl0IHlpZWxkcyBhIHJlc3VsdCBpbiB0aGUgcGxhaW4gaW50ZWdlciBkb21haW4sXG4gICAgICB3aWxsIHlpZWxkIHRoZSBzYW1lIHJlc3VsdCBpbiB0aGUgbG9uZyBpbnRlZ2VyIGRvbWFpbiBvciB3aGVuXG4gICAgICB1c2luZyBtaXhlZCBvcGVyYW5kcy4gIFRoZSBzd2l0Y2ggYmV0d2VlbiBkb21haW5zIGlzIHRyYW5zcGFyZW50XG4gICAgICB0byB0aGUgcHJvZ3JhbW1lci5cblxuICAgYGBudW1iZXJzLlJlYWxgYCAoYGBmbG9hdGBgKVxuICAgICAgVGhlc2UgcmVwcmVzZW50IG1hY2hpbmUtbGV2ZWwgZG91YmxlIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludFxuICAgICAgbnVtYmVycy4gWW91IGFyZSBhdCB0aGUgbWVyY3kgb2YgdGhlIHVuZGVybHlpbmcgbWFjaGluZVxuICAgICAgYXJjaGl0ZWN0dXJlIChhbmQgQyBvciBKYXZhIGltcGxlbWVudGF0aW9uKSBmb3IgdGhlIGFjY2VwdGVkXG4gICAgICByYW5nZSBhbmQgaGFuZGxpbmcgb2Ygb3ZlcmZsb3cuIFB5dGhvbiBkb2VzIG5vdCBzdXBwb3J0IHNpbmdsZS1cbiAgICAgIHByZWNpc2lvbiBmbG9hdGluZyBwb2ludCBudW1iZXJzOyB0aGUgc2F2aW5ncyBpbiBwcm9jZXNzb3IgYW5kXG4gICAgICBtZW1vcnkgdXNhZ2UgdGhhdCBhcmUgdXN1YWxseSB0aGUgcmVhc29uIGZvciB1c2luZyB0aGVzZSBpc1xuICAgICAgZHdhcmZlZCBieSB0aGUgb3ZlcmhlYWQgb2YgdXNpbmcgb2JqZWN0cyBpbiBQeXRob24sIHNvIHRoZXJlIGlzXG4gICAgICBubyByZWFzb24gdG8gY29tcGxpY2F0ZSB0aGUgbGFuZ3VhZ2Ugd2l0aCB0d28ga2luZHMgb2YgZmxvYXRpbmdcbiAgICAgIHBvaW50IG51bWJlcnMuXG5cbiAgIGBgbnVtYmVycy5Db21wbGV4YGBcbiAgICAgIFRoZXNlIHJlcHJlc2VudCBjb21wbGV4IG51bWJlcnMgYXMgYSBwYWlyIG9mIG1hY2hpbmUtbGV2ZWxcbiAgICAgIGRvdWJsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gIFRoZSBzYW1lIGNhdmVhdHMgYXBwbHlcbiAgICAgIGFzIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGFcbiAgICAgIGNvbXBsZXggbnVtYmVyIGBgemBgIGNhbiBiZSByZXRyaWV2ZWQgdGhyb3VnaCB0aGUgcmVhZC1vbmx5XG4gICAgICBhdHRyaWJ1dGVzIGBgei5yZWFsYGAgYW5kIGBgei5pbWFnYGAuXG5cblNlcXVlbmNlc1xuICAgVGhlc2UgcmVwcmVzZW50IGZpbml0ZSBvcmRlcmVkIHNldHMgaW5kZXhlZCBieSBub24tbmVnYXRpdmVcbiAgIG51bWJlcnMuIFRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGxlbigpYGAgcmV0dXJucyB0aGUgbnVtYmVyIG9mXG4gICBpdGVtcyBvZiBhIHNlcXVlbmNlLiBXaGVuIHRoZSBsZW5ndGggb2YgYSBzZXF1ZW5jZSBpcyAqbiosIHRoZVxuICAgaW5kZXggc2V0IGNvbnRhaW5zIHRoZSBudW1iZXJzIDAsIDEsIC4uLiwgKm4qLTEuICBJdGVtICppKiBvZlxuICAgc2VxdWVuY2UgKmEqIGlzIHNlbGVjdGVkIGJ5IGBgYVtpXWBgLlxuXG4gICBTZXF1ZW5jZXMgYWxzbyBzdXBwb3J0IHNsaWNpbmc6IGBgYVtpOmpdYGAgc2VsZWN0cyBhbGwgaXRlbXMgd2l0aFxuICAgaW5kZXggKmsqIHN1Y2ggdGhhdCAqaSogYGA8PWBgICprKiBgYDxgYCAqaiouICBXaGVuIHVzZWQgYXMgYW5cbiAgIGV4cHJlc3Npb24sIGEgc2xpY2UgaXMgYSBzZXF1ZW5jZSBvZiB0aGUgc2FtZSB0eXBlLiAgVGhpcyBpbXBsaWVzXG4gICB0aGF0IHRoZSBpbmRleCBzZXQgaXMgcmVudW1iZXJlZCBzbyB0aGF0IGl0IHN0YXJ0cyBhdCAwLlxuXG4gICBTb21lIHNlcXVlbmNlcyBhbHNvIHN1cHBvcnQgImV4dGVuZGVkIHNsaWNpbmciIHdpdGggYSB0aGlyZCAic3RlcCJcbiAgIHBhcmFtZXRlcjogYGBhW2k6ajprXWBgIHNlbGVjdHMgYWxsIGl0ZW1zIG9mICphKiB3aXRoIGluZGV4ICp4KlxuICAgd2hlcmUgYGB4ID0gaSArIG4qa2BgLCAqbiogYGA+PWBgIGBgMGBgIGFuZCAqaSogYGA8PWBgICp4KiBgYDxgYFxuICAgKmoqLlxuXG4gICBTZXF1ZW5jZXMgYXJlIGRpc3Rpbmd1aXNoZWQgYWNjb3JkaW5nIHRvIHRoZWlyIG11dGFiaWxpdHk6XG5cbiAgIEltbXV0YWJsZSBzZXF1ZW5jZXNcbiAgICAgIEFuIG9iamVjdCBvZiBhbiBpbW11dGFibGUgc2VxdWVuY2UgdHlwZSBjYW5ub3QgY2hhbmdlIG9uY2UgaXQgaXNcbiAgICAgIGNyZWF0ZWQuICAoSWYgdGhlIG9iamVjdCBjb250YWlucyByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMsXG4gICAgICB0aGVzZSBvdGhlciBvYmplY3RzIG1heSBiZSBtdXRhYmxlIGFuZCBtYXkgYmUgY2hhbmdlZDsgaG93ZXZlcixcbiAgICAgIHRoZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgZGlyZWN0bHkgcmVmZXJlbmNlZCBieSBhbiBpbW11dGFibGVcbiAgICAgIG9iamVjdCBjYW5ub3QgY2hhbmdlLilcblxuICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlczpcblxuICAgICAgU3RyaW5nc1xuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgc3RyaW5nIGFyZSBjaGFyYWN0ZXJzLiAgVGhlcmUgaXMgbm8gc2VwYXJhdGVcbiAgICAgICAgIGNoYXJhY3RlciB0eXBlOyBhIGNoYXJhY3RlciBpcyByZXByZXNlbnRlZCBieSBhIHN0cmluZyBvZiBvbmVcbiAgICAgICAgIGl0ZW0uIENoYXJhY3RlcnMgcmVwcmVzZW50IChhdCBsZWFzdCkgOC1iaXQgYnl0ZXMuICBUaGVcbiAgICAgICAgIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYGNocigpYGAgYW5kIGBgb3JkKClgYCBjb252ZXJ0IGJldHdlZW5cbiAgICAgICAgIGNoYXJhY3RlcnMgYW5kIG5vbm5lZ2F0aXZlIGludGVnZXJzIHJlcHJlc2VudGluZyB0aGUgYnl0ZVxuICAgICAgICAgdmFsdWVzLiAgQnl0ZXMgd2l0aCB0aGUgdmFsdWVzIDAtMTI3IHVzdWFsbHkgcmVwcmVzZW50IHRoZVxuICAgICAgICAgY29ycmVzcG9uZGluZyBBU0NJSSB2YWx1ZXMsIGJ1dCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdmFsdWVzXG4gICAgICAgICBpcyB1cCB0byB0aGUgcHJvZ3JhbS4gIFRoZSBzdHJpbmcgZGF0YSB0eXBlIGlzIGFsc28gdXNlZCB0b1xuICAgICAgICAgcmVwcmVzZW50IGFycmF5cyBvZiBieXRlcywgZS5nLiwgdG8gaG9sZCBkYXRhIHJlYWQgZnJvbSBhXG4gICAgICAgICBmaWxlLlxuXG4gICAgICAgICAoT24gc3lzdGVtcyB3aG9zZSBuYXRpdmUgY2hhcmFjdGVyIHNldCBpcyBub3QgQVNDSUksIHN0cmluZ3NcbiAgICAgICAgIG1heSB1c2UgRUJDRElDIGluIHRoZWlyIGludGVybmFsIHJlcHJlc2VudGF0aW9uLCBwcm92aWRlZCB0aGVcbiAgICAgICAgIGZ1bmN0aW9ucyBgYGNocigpYGAgYW5kIGBgb3JkKClgYCBpbXBsZW1lbnQgYSBtYXBwaW5nIGJldHdlZW5cbiAgICAgICAgIEFTQ0lJIGFuZCBFQkNESUMsIGFuZCBzdHJpbmcgY29tcGFyaXNvbiBwcmVzZXJ2ZXMgdGhlIEFTQ0lJXG4gICAgICAgICBvcmRlci4gT3IgcGVyaGFwcyBzb21lb25lIGNhbiBwcm9wb3NlIGEgYmV0dGVyIHJ1bGU/KVxuXG4gICAgICBVbmljb2RlXG4gICAgICAgICBUaGUgaXRlbXMgb2YgYSBVbmljb2RlIG9iamVjdCBhcmUgVW5pY29kZSBjb2RlIHVuaXRzLiAgQVxuICAgICAgICAgVW5pY29kZSBjb2RlIHVuaXQgaXMgcmVwcmVzZW50ZWQgYnkgYSBVbmljb2RlIG9iamVjdCBvZiBvbmVcbiAgICAgICAgIGl0ZW0gYW5kIGNhbiBob2xkIGVpdGhlciBhIDE2LWJpdCBvciAzMi1iaXQgdmFsdWVcbiAgICAgICAgIHJlcHJlc2VudGluZyBhIFVuaWNvZGUgb3JkaW5hbCAodGhlIG1heGltdW0gdmFsdWUgZm9yIHRoZVxuICAgICAgICAgb3JkaW5hbCBpcyBnaXZlbiBpbiBgYHN5cy5tYXh1bmljb2RlYGAsIGFuZCBkZXBlbmRzIG9uIGhvd1xuICAgICAgICAgUHl0aG9uIGlzIGNvbmZpZ3VyZWQgYXQgY29tcGlsZSB0aW1lKS4gIFN1cnJvZ2F0ZSBwYWlycyBtYXlcbiAgICAgICAgIGJlIHByZXNlbnQgaW4gdGhlIFVuaWNvZGUgb2JqZWN0LCBhbmQgd2lsbCBiZSByZXBvcnRlZCBhcyB0d29cbiAgICAgICAgIHNlcGFyYXRlIGl0ZW1zLiAgVGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBgYHVuaWNocigpYGAgYW5kXG4gICAgICAgICBgYG9yZCgpYGAgY29udmVydCBiZXR3ZWVuIGNvZGUgdW5pdHMgYW5kIG5vbm5lZ2F0aXZlIGludGVnZXJzXG4gICAgICAgICByZXByZXNlbnRpbmcgdGhlIFVuaWNvZGUgb3JkaW5hbHMgYXMgZGVmaW5lZCBpbiB0aGUgVW5pY29kZVxuICAgICAgICAgU3RhbmRhcmQgMy4wLiBDb252ZXJzaW9uIGZyb20gYW5kIHRvIG90aGVyIGVuY29kaW5ncyBhcmVcbiAgICAgICAgIHBvc3NpYmxlIHRocm91Z2ggdGhlIFVuaWNvZGUgbWV0aG9kIGBgZW5jb2RlKClgYCBhbmQgdGhlXG4gICAgICAgICBidWlsdC1pbiBmdW5jdGlvbiBgYHVuaWNvZGUoKWBgLlxuXG4gICAgICBUdXBsZXNcbiAgICAgICAgIFRoZSBpdGVtcyBvZiBhIHR1cGxlIGFyZSBhcmJpdHJhcnkgUHl0aG9uIG9iamVjdHMuIFR1cGxlcyBvZlxuICAgICAgICAgdHdvIG9yIG1vcmUgaXRlbXMgYXJlIGZvcm1lZCBieSBjb21tYS1zZXBhcmF0ZWQgbGlzdHMgb2ZcbiAgICAgICAgIGV4cHJlc3Npb25zLiAgQSB0dXBsZSBvZiBvbmUgaXRlbSAoYSBcJ3NpbmdsZXRvblwnKSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhZmZpeGluZyBhIGNvbW1hIHRvIGFuIGV4cHJlc3Npb24gKGFuIGV4cHJlc3Npb24gYnlcbiAgICAgICAgIGl0c2VsZiBkb2VzIG5vdCBjcmVhdGUgYSB0dXBsZSwgc2luY2UgcGFyZW50aGVzZXMgbXVzdCBiZVxuICAgICAgICAgdXNhYmxlIGZvciBncm91cGluZyBvZiBleHByZXNzaW9ucykuICBBbiBlbXB0eSB0dXBsZSBjYW4gYmVcbiAgICAgICAgIGZvcm1lZCBieSBhbiBlbXB0eSBwYWlyIG9mIHBhcmVudGhlc2VzLlxuXG4gICBNdXRhYmxlIHNlcXVlbmNlc1xuICAgICAgTXV0YWJsZSBzZXF1ZW5jZXMgY2FuIGJlIGNoYW5nZWQgYWZ0ZXIgdGhleSBhcmUgY3JlYXRlZC4gIFRoZVxuICAgICAgc3Vic2NyaXB0aW9uIGFuZCBzbGljaW5nIG5vdGF0aW9ucyBjYW4gYmUgdXNlZCBhcyB0aGUgdGFyZ2V0IG9mXG4gICAgICBhc3NpZ25tZW50IGFuZCBgYGRlbGBgIChkZWxldGUpIHN0YXRlbWVudHMuXG5cbiAgICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIGludHJpbnNpYyBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzOlxuXG4gICAgICBMaXN0c1xuICAgICAgICAgVGhlIGl0ZW1zIG9mIGEgbGlzdCBhcmUgYXJiaXRyYXJ5IFB5dGhvbiBvYmplY3RzLiAgTGlzdHMgYXJlXG4gICAgICAgICBmb3JtZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGV4cHJlc3Npb25zIGluXG4gICAgICAgICBzcXVhcmUgYnJhY2tldHMuIChOb3RlIHRoYXQgdGhlcmUgYXJlIG5vIHNwZWNpYWwgY2FzZXMgbmVlZGVkXG4gICAgICAgICB0byBmb3JtIGxpc3RzIG9mIGxlbmd0aCAwIG9yIDEuKVxuXG4gICAgICBCeXRlIEFycmF5c1xuICAgICAgICAgQSBieXRlYXJyYXkgb2JqZWN0IGlzIGEgbXV0YWJsZSBhcnJheS4gVGhleSBhcmUgY3JlYXRlZCBieVxuICAgICAgICAgdGhlIGJ1aWx0LWluIGBgYnl0ZWFycmF5KClgYCBjb25zdHJ1Y3Rvci4gIEFzaWRlIGZyb20gYmVpbmdcbiAgICAgICAgIG11dGFibGUgKGFuZCBoZW5jZSB1bmhhc2hhYmxlKSwgYnl0ZSBhcnJheXMgb3RoZXJ3aXNlIHByb3ZpZGVcbiAgICAgICAgIHRoZSBzYW1lIGludGVyZmFjZSBhbmQgZnVuY3Rpb25hbGl0eSBhcyBpbW11dGFibGUgYnl0ZXNcbiAgICAgICAgIG9iamVjdHMuXG5cbiAgICAgIFRoZSBleHRlbnNpb24gbW9kdWxlIGBgYXJyYXlgYCBwcm92aWRlcyBhbiBhZGRpdGlvbmFsIGV4YW1wbGUgb2ZcbiAgICAgIGEgbXV0YWJsZSBzZXF1ZW5jZSB0eXBlLlxuXG5TZXQgdHlwZXNcbiAgIFRoZXNlIHJlcHJlc2VudCB1bm9yZGVyZWQsIGZpbml0ZSBzZXRzIG9mIHVuaXF1ZSwgaW1tdXRhYmxlXG4gICBvYmplY3RzLiBBcyBzdWNoLCB0aGV5IGNhbm5vdCBiZSBpbmRleGVkIGJ5IGFueSBzdWJzY3JpcHQuIEhvd2V2ZXIsXG4gICB0aGV5IGNhbiBiZSBpdGVyYXRlZCBvdmVyLCBhbmQgdGhlIGJ1aWx0LWluIGZ1bmN0aW9uIGBgbGVuKClgYFxuICAgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluIGEgc2V0LiBDb21tb24gdXNlcyBmb3Igc2V0cyBhcmUgZmFzdFxuICAgbWVtYmVyc2hpcCB0ZXN0aW5nLCByZW1vdmluZyBkdXBsaWNhdGVzIGZyb20gYSBzZXF1ZW5jZSwgYW5kXG4gICBjb21wdXRpbmcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMgc3VjaCBhcyBpbnRlcnNlY3Rpb24sIHVuaW9uLFxuICAgZGlmZmVyZW5jZSwgYW5kIHN5bW1ldHJpYyBkaWZmZXJlbmNlLlxuXG4gICBGb3Igc2V0IGVsZW1lbnRzLCB0aGUgc2FtZSBpbW11dGFiaWxpdHkgcnVsZXMgYXBwbHkgYXMgZm9yXG4gICBkaWN0aW9uYXJ5IGtleXMuIE5vdGUgdGhhdCBudW1lcmljIHR5cGVzIG9iZXkgdGhlIG5vcm1hbCBydWxlcyBmb3JcbiAgIG51bWVyaWMgY29tcGFyaXNvbjogaWYgdHdvIG51bWJlcnMgY29tcGFyZSBlcXVhbCAoZS5nLiwgYGAxYGAgYW5kXG4gICBgYDEuMGBgKSwgb25seSBvbmUgb2YgdGhlbSBjYW4gYmUgY29udGFpbmVkIGluIGEgc2V0LlxuXG4gICBUaGVyZSBhcmUgY3VycmVudGx5IHR3byBpbnRyaW5zaWMgc2V0IHR5cGVzOlxuXG4gICBTZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYSBtdXRhYmxlIHNldC4gVGhleSBhcmUgY3JlYXRlZCBieSB0aGUgYnVpbHQtaW5cbiAgICAgIGBgc2V0KClgYCBjb25zdHJ1Y3RvciBhbmQgY2FuIGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMgYnkgc2V2ZXJhbFxuICAgICAgbWV0aG9kcywgc3VjaCBhcyBgYGFkZCgpYGAuXG5cbiAgIEZyb3plbiBzZXRzXG4gICAgICBUaGVzZSByZXByZXNlbnQgYW4gaW1tdXRhYmxlIHNldC4gIFRoZXkgYXJlIGNyZWF0ZWQgYnkgdGhlXG4gICAgICBidWlsdC1pbiBgYGZyb3plbnNldCgpYGAgY29uc3RydWN0b3IuICBBcyBhIGZyb3plbnNldCBpc1xuICAgICAgaW1tdXRhYmxlIGFuZCAqaGFzaGFibGUqLCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBhcyBhbiBlbGVtZW50IG9mXG4gICAgICBhbm90aGVyIHNldCwgb3IgYXMgYSBkaWN0aW9uYXJ5IGtleS5cblxuTWFwcGluZ3NcbiAgIFRoZXNlIHJlcHJlc2VudCBmaW5pdGUgc2V0cyBvZiBvYmplY3RzIGluZGV4ZWQgYnkgYXJiaXRyYXJ5IGluZGV4XG4gICBzZXRzLiBUaGUgc3Vic2NyaXB0IG5vdGF0aW9uIGBgYVtrXWBgIHNlbGVjdHMgdGhlIGl0ZW0gaW5kZXhlZCBieVxuICAgYGBrYGAgZnJvbSB0aGUgbWFwcGluZyBgYGFgYDsgdGhpcyBjYW4gYmUgdXNlZCBpbiBleHByZXNzaW9ucyBhbmRcbiAgIGFzIHRoZSB0YXJnZXQgb2YgYXNzaWdubWVudHMgb3IgYGBkZWxgYCBzdGF0ZW1lbnRzLiBUaGUgYnVpbHQtaW5cbiAgIGZ1bmN0aW9uIGBgbGVuKClgYCByZXR1cm5zIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gYSBtYXBwaW5nLlxuXG4gICBUaGVyZSBpcyBjdXJyZW50bHkgYSBzaW5nbGUgaW50cmluc2ljIG1hcHBpbmcgdHlwZTpcblxuICAgRGljdGlvbmFyaWVzXG4gICAgICBUaGVzZSByZXByZXNlbnQgZmluaXRlIHNldHMgb2Ygb2JqZWN0cyBpbmRleGVkIGJ5IG5lYXJseVxuICAgICAgYXJiaXRyYXJ5IHZhbHVlcy4gIFRoZSBvbmx5IHR5cGVzIG9mIHZhbHVlcyBub3QgYWNjZXB0YWJsZSBhc1xuICAgICAga2V5cyBhcmUgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMgb3IgZGljdGlvbmFyaWVzIG9yIG90aGVyXG4gICAgICBtdXRhYmxlIHR5cGVzIHRoYXQgYXJlIGNvbXBhcmVkIGJ5IHZhbHVlIHJhdGhlciB0aGFuIGJ5IG9iamVjdFxuICAgICAgaWRlbnRpdHksIHRoZSByZWFzb24gYmVpbmcgdGhhdCB0aGUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mXG4gICAgICBkaWN0aW9uYXJpZXMgcmVxdWlyZXMgYSBrZXlcJ3MgaGFzaCB2YWx1ZSB0byByZW1haW4gY29uc3RhbnQuXG4gICAgICBOdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleSB0aGUgbm9ybWFsIHJ1bGVzIGZvciBudW1lcmljXG4gICAgICBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsIChlLmcuLCBgYDFgYCBhbmRcbiAgICAgIGBgMS4wYGApIHRoZW4gdGhleSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgdG8gaW5kZXggdGhlIHNhbWVcbiAgICAgIGRpY3Rpb25hcnkgZW50cnkuXG5cbiAgICAgIERpY3Rpb25hcmllcyBhcmUgbXV0YWJsZTsgdGhleSBjYW4gYmUgY3JlYXRlZCBieSB0aGUgYGB7Li4ufWBgXG4gICAgICBub3RhdGlvbiAoc2VlIHNlY3Rpb24gKkRpY3Rpb25hcnkgZGlzcGxheXMqKS5cblxuICAgICAgVGhlIGV4dGVuc2lvbiBtb2R1bGVzIGBgZGJtYGAsIGBgZ2RibWBgLCBhbmQgYGBic2RkYmBgIHByb3ZpZGVcbiAgICAgIGFkZGl0aW9uYWwgZXhhbXBsZXMgb2YgbWFwcGluZyB0eXBlcy5cblxuQ2FsbGFibGUgdHlwZXNcbiAgIFRoZXNlIGFyZSB0aGUgdHlwZXMgdG8gd2hpY2ggdGhlIGZ1bmN0aW9uIGNhbGwgb3BlcmF0aW9uIChzZWVcbiAgIHNlY3Rpb24gKkNhbGxzKikgY2FuIGJlIGFwcGxpZWQ6XG5cbiAgIFVzZXItZGVmaW5lZCBmdW5jdGlvbnNcbiAgICAgIEEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IGEgZnVuY3Rpb25cbiAgICAgIGRlZmluaXRpb24gKHNlZSBzZWN0aW9uICpGdW5jdGlvbiBkZWZpbml0aW9ucyopLiAgSXQgc2hvdWxkIGJlXG4gICAgICBjYWxsZWQgd2l0aCBhbiBhcmd1bWVudCBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgbnVtYmVyIG9mIGl0ZW1zXG4gICAgICBhcyB0aGUgZnVuY3Rpb25cJ3MgZm9ybWFsIHBhcmFtZXRlciBsaXN0LlxuXG4gICAgICBTcGVjaWFsIGF0dHJpYnV0ZXM6XG5cbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBBdHRyaWJ1dGUgICAgICAgICAgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArPT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PStcbiAgICAgIHwgYGBmdW5jX2RvY2BgICAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvbiAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBzdHJpbmcsIG9yIGBgTm9uZWBgIGlmICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IHVuYXZhaWxhYmxlICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBfX2RvY19fYGAgICAgICAgICAgICAgfCBBbm90aGVyIHdheSBvZiBzcGVsbGluZyAgICAgICAgIHwgV3JpdGFibGUgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgZnVuY19kb2NgYCAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLStcbiAgICAgIHwgYGBmdW5jX25hbWVgYCAgICAgICAgICAgfCBUaGUgZnVuY3Rpb25cJ3MgbmFtZSAgICAgICAgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYF9fbmFtZV9fYGAgICAgICAgICAgICB8IEFub3RoZXIgd2F5IG9mIHNwZWxsaW5nICAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBmdW5jX25hbWVgYCAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYF9fbW9kdWxlX19gYCAgICAgICAgICB8IFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgZnVuY3Rpb24gd2FzIGRlZmluZWQgaW4sIG9yICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYE5vbmVgYCBpZiB1bmF2YWlsYWJsZS4gICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgZnVuY19kZWZhdWx0c2BgICAgICAgIHwgQSB0dXBsZSBjb250YWluaW5nIGRlZmF1bHQgICAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBhcmd1bWVudCB2YWx1ZXMgZm9yIHRob3NlICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IGFyZ3VtZW50cyB0aGF0IGhhdmUgZGVmYXVsdHMsICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgb3IgYGBOb25lYGAgaWYgbm8gYXJndW1lbnRzICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSAgICAgICAgICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgZnVuY19jb2RlYGAgICAgICAgICAgIHwgVGhlIGNvZGUgb2JqZWN0IHJlcHJlc2VudGluZyAgICB8IFdyaXRhYmxlICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGUgY29tcGlsZWQgZnVuY3Rpb24gYm9keS4gICAgIHwgICAgICAgICAgICAgfFxuICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0rXG4gICAgICB8IGBgZnVuY19nbG9iYWxzYGAgICAgICAgIHwgQSByZWZlcmVuY2UgdG8gdGhlIGRpY3Rpb25hcnkgICB8IFJlYWQtb25seSAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCB0aGF0IGhvbGRzIHRoZSBmdW5jdGlvblwncyAgICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBnbG9iYWwgdmFyaWFibGVzIC0tLSB0aGUgZ2xvYmFsIHwgICAgICAgICAgICAgfFxuICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICB8IG5hbWVzcGFjZSBvZiB0aGUgbW9kdWxlIGluICAgICAgfCAgICAgICAgICAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgd2hpY2ggdGhlIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLiB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYGZ1bmNfZGljdGBgICAgICAgICAgICB8IFRoZSBuYW1lc3BhY2Ugc3VwcG9ydGluZyAgICAgICAgfCBXcml0YWJsZSAgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgYXJiaXRyYXJ5IGZ1bmN0aW9uIGF0dHJpYnV0ZXMuICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuICAgICAgfCBgYGZ1bmNfY2xvc3VyZWBgICAgICAgICB8IGBgTm9uZWBgIG9yIGEgdHVwbGUgb2YgY2VsbHMgICAgfCBSZWFkLW9ubHkgICB8XG4gICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIHwgdGhhdCBjb250YWluIGJpbmRpbmdzIGZvciB0aGUgICB8ICAgICAgICAgICAgIHxcbiAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgfCBmdW5jdGlvblwncyBmcmVlIHZhcmlhYmxlcy4gICAgICB8ICAgICAgICAgICAgIHxcbiAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tK1xuXG4gICAgICBNb3N0IG9mIHRoZSBhdHRyaWJ1dGVzIGxhYmVsbGVkICJXcml0YWJsZSIgY2hlY2sgdGhlIHR5cGUgb2YgdGhlXG4gICAgICBhc3NpZ25lZCB2YWx1ZS5cblxuICAgICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNDogYGBmdW5jX25hbWVgYCBpcyBub3cgd3JpdGFibGUuXG5cbiAgICAgIEZ1bmN0aW9uIG9iamVjdHMgYWxzbyBzdXBwb3J0IGdldHRpbmcgYW5kIHNldHRpbmcgYXJiaXRyYXJ5XG4gICAgICBhdHRyaWJ1dGVzLCB3aGljaCBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGF0dGFjaCBtZXRhZGF0YVxuICAgICAgdG8gZnVuY3Rpb25zLiAgUmVndWxhciBhdHRyaWJ1dGUgZG90LW5vdGF0aW9uIGlzIHVzZWQgdG8gZ2V0IGFuZFxuICAgICAgc2V0IHN1Y2ggYXR0cmlidXRlcy4gKk5vdGUgdGhhdCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvbmx5XG4gICAgICBzdXBwb3J0cyBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIHVzZXItZGVmaW5lZCBmdW5jdGlvbnMuIEZ1bmN0aW9uXG4gICAgICBhdHRyaWJ1dGVzIG9uIGJ1aWx0LWluIGZ1bmN0aW9ucyBtYXkgYmUgc3VwcG9ydGVkIGluIHRoZVxuICAgICAgZnV0dXJlLipcblxuICAgICAgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBhIGZ1bmN0aW9uXCdzIGRlZmluaXRpb24gY2FuIGJlXG4gICAgICByZXRyaWV2ZWQgZnJvbSBpdHMgY29kZSBvYmplY3Q7IHNlZSB0aGUgZGVzY3JpcHRpb24gb2YgaW50ZXJuYWxcbiAgICAgIHR5cGVzIGJlbG93LlxuXG4gICBVc2VyLWRlZmluZWQgbWV0aG9kc1xuICAgICAgQSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBjb21iaW5lcyBhIGNsYXNzLCBhIGNsYXNzIGluc3RhbmNlXG4gICAgICAob3IgYGBOb25lYGApIGFuZCBhbnkgY2FsbGFibGUgb2JqZWN0IChub3JtYWxseSBhIHVzZXItZGVmaW5lZFxuICAgICAgZnVuY3Rpb24pLlxuXG4gICAgICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzOiBgYGltX3NlbGZgYCBpcyB0aGUgY2xhc3MgaW5zdGFuY2VcbiAgICAgIG9iamVjdCwgYGBpbV9mdW5jYGAgaXMgdGhlIGZ1bmN0aW9uIG9iamVjdDsgYGBpbV9jbGFzc2BgIGlzIHRoZVxuICAgICAgY2xhc3Mgb2YgYGBpbV9zZWxmYGAgZm9yIGJvdW5kIG1ldGhvZHMgb3IgdGhlIGNsYXNzIHRoYXQgYXNrZWRcbiAgICAgIGZvciB0aGUgbWV0aG9kIGZvciB1bmJvdW5kIG1ldGhvZHM7IGBgX19kb2NfX2BgIGlzIHRoZSBtZXRob2RcJ3NcbiAgICAgIGRvY3VtZW50YXRpb24gKHNhbWUgYXMgYGBpbV9mdW5jLl9fZG9jX19gYCk7IGBgX19uYW1lX19gYCBpcyB0aGVcbiAgICAgIG1ldGhvZCBuYW1lIChzYW1lIGFzIGBgaW1fZnVuYy5fX25hbWVfX2BgKTsgYGBfX21vZHVsZV9fYGAgaXNcbiAgICAgIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlIG1ldGhvZCB3YXMgZGVmaW5lZCBpbiwgb3IgYGBOb25lYGAgaWZcbiAgICAgIHVuYXZhaWxhYmxlLlxuXG4gICAgICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yOiBgYGltX3NlbGZgYCB1c2VkIHRvIHJlZmVyIHRvIHRoZSBjbGFzc1xuICAgICAgdGhhdCBkZWZpbmVkIHRoZSBtZXRob2QuXG5cbiAgICAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjY6IEZvciBQeXRob24gMyBmb3J3YXJkLWNvbXBhdGliaWxpdHksXG4gICAgICBgYGltX2Z1bmNgYCBpcyBhbHNvIGF2YWlsYWJsZSBhcyBgYF9fZnVuY19fYGAsIGFuZCBgYGltX3NlbGZgYFxuICAgICAgYXMgYGBfX3NlbGZfX2BgLlxuXG4gICAgICBNZXRob2RzIGFsc28gc3VwcG9ydCBhY2Nlc3NpbmcgKGJ1dCBub3Qgc2V0dGluZykgdGhlIGFyYml0cmFyeVxuICAgICAgZnVuY3Rpb24gYXR0cmlidXRlcyBvbiB0aGUgdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3QuXG5cbiAgICAgIFVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0cyBtYXkgYmUgY3JlYXRlZCB3aGVuIGdldHRpbmcgYW5cbiAgICAgIGF0dHJpYnV0ZSBvZiBhIGNsYXNzIChwZXJoYXBzIHZpYSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzKSwgaWZcbiAgICAgIHRoYXQgYXR0cmlidXRlIGlzIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCwgYW4gdW5ib3VuZFxuICAgICAgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QsIG9yIGEgY2xhc3MgbWV0aG9kIG9iamVjdC4gV2hlbiB0aGVcbiAgICAgIGF0dHJpYnV0ZSBpcyBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0LCBhIG5ldyBtZXRob2Qgb2JqZWN0XG4gICAgICBpcyBvbmx5IGNyZWF0ZWQgaWYgdGhlIGNsYXNzIGZyb20gd2hpY2ggaXQgaXMgYmVpbmcgcmV0cmlldmVkIGlzXG4gICAgICB0aGUgc2FtZSBhcywgb3IgYSBkZXJpdmVkIGNsYXNzIG9mLCB0aGUgY2xhc3Mgc3RvcmVkIGluIHRoZVxuICAgICAgb3JpZ2luYWwgbWV0aG9kIG9iamVjdDsgb3RoZXJ3aXNlLCB0aGUgb3JpZ2luYWwgbWV0aG9kIG9iamVjdCBpc1xuICAgICAgdXNlZCBhcyBpdCBpcy5cblxuICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhXG4gICAgICB1c2VyLWRlZmluZWQgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcywgaXRzIGBgaW1fc2VsZmBgXG4gICAgICBhdHRyaWJ1dGUgaXMgYGBOb25lYGAgYW5kIHRoZSBtZXRob2Qgb2JqZWN0IGlzIHNhaWQgdG8gYmVcbiAgICAgIHVuYm91bmQuIFdoZW4gb25lIGlzIGNyZWF0ZWQgYnkgcmV0cmlldmluZyBhIHVzZXItZGVmaW5lZFxuICAgICAgZnVuY3Rpb24gb2JqZWN0IGZyb20gYSBjbGFzcyB2aWEgb25lIG9mIGl0cyBpbnN0YW5jZXMsIGl0c1xuICAgICAgYGBpbV9zZWxmYGAgYXR0cmlidXRlIGlzIHRoZSBpbnN0YW5jZSwgYW5kIHRoZSBtZXRob2Qgb2JqZWN0IGlzXG4gICAgICBzYWlkIHRvIGJlIGJvdW5kLiBJbiBlaXRoZXIgY2FzZSwgdGhlIG5ldyBtZXRob2RcJ3MgYGBpbV9jbGFzc2BgXG4gICAgICBhdHRyaWJ1dGUgaXMgdGhlIGNsYXNzIGZyb20gd2hpY2ggdGhlIHJldHJpZXZhbCB0YWtlcyBwbGFjZSwgYW5kXG4gICAgICBpdHMgYGBpbV9mdW5jYGAgYXR0cmlidXRlIGlzIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiBvYmplY3QuXG5cbiAgICAgIFdoZW4gYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHJldHJpZXZpbmdcbiAgICAgIGFub3RoZXIgbWV0aG9kIG9iamVjdCBmcm9tIGEgY2xhc3Mgb3IgaW5zdGFuY2UsIHRoZSBiZWhhdmlvdXIgaXNcbiAgICAgIHRoZSBzYW1lIGFzIGZvciBhIGZ1bmN0aW9uIG9iamVjdCwgZXhjZXB0IHRoYXQgdGhlIGBgaW1fZnVuY2BgXG4gICAgICBhdHRyaWJ1dGUgb2YgdGhlIG5ldyBpbnN0YW5jZSBpcyBub3QgdGhlIG9yaWdpbmFsIG1ldGhvZCBvYmplY3RcbiAgICAgIGJ1dCBpdHMgYGBpbV9mdW5jYGAgYXR0cmlidXRlLlxuXG4gICAgICBXaGVuIGEgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3QgaXMgY3JlYXRlZCBieSByZXRyaWV2aW5nIGFcbiAgICAgIGNsYXNzIG1ldGhvZCBvYmplY3QgZnJvbSBhIGNsYXNzIG9yIGluc3RhbmNlLCBpdHMgYGBpbV9zZWxmYGBcbiAgICAgIGF0dHJpYnV0ZSBpcyB0aGUgY2xhc3MgaXRzZWxmLCBhbmQgaXRzIGBgaW1fZnVuY2BgIGF0dHJpYnV0ZSBpc1xuICAgICAgdGhlIGZ1bmN0aW9uIG9iamVjdCB1bmRlcmx5aW5nIHRoZSBjbGFzcyBtZXRob2QuXG5cbiAgICAgIFdoZW4gYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZVxuICAgICAgdW5kZXJseWluZyBmdW5jdGlvbiAoYGBpbV9mdW5jYGApIGlzIGNhbGxlZCwgd2l0aCB0aGVcbiAgICAgIHJlc3RyaWN0aW9uIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdGhlXG4gICAgICBwcm9wZXIgY2xhc3MgKGBgaW1fY2xhc3NgYCkgb3Igb2YgYSBkZXJpdmVkIGNsYXNzIHRoZXJlb2YuXG5cbiAgICAgIFdoZW4gYSBib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdCBpcyBjYWxsZWQsIHRoZVxuICAgICAgdW5kZXJseWluZyBmdW5jdGlvbiAoYGBpbV9mdW5jYGApIGlzIGNhbGxlZCwgaW5zZXJ0aW5nIHRoZSBjbGFzc1xuICAgICAgaW5zdGFuY2UgKGBgaW1fc2VsZmBgKSBpbiBmcm9udCBvZiB0aGUgYXJndW1lbnQgbGlzdC4gIEZvclxuICAgICAgaW5zdGFuY2UsIHdoZW4gYGBDYGAgaXMgYSBjbGFzcyB3aGljaCBjb250YWlucyBhIGRlZmluaXRpb24gZm9yXG4gICAgICBhIGZ1bmN0aW9uIGBgZigpYGAsIGFuZCBgYHhgYCBpcyBhbiBpbnN0YW5jZSBvZiBgYENgYCwgY2FsbGluZ1xuICAgICAgYGB4LmYoMSlgYCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgYGBDLmYoeCwgMSlgYC5cblxuICAgICAgV2hlbiBhIHVzZXItZGVmaW5lZCBtZXRob2Qgb2JqZWN0IGlzIGRlcml2ZWQgZnJvbSBhIGNsYXNzIG1ldGhvZFxuICAgICAgb2JqZWN0LCB0aGUgImNsYXNzIGluc3RhbmNlIiBzdG9yZWQgaW4gYGBpbV9zZWxmYGAgd2lsbCBhY3R1YWxseVxuICAgICAgYmUgdGhlIGNsYXNzIGl0c2VsZiwgc28gdGhhdCBjYWxsaW5nIGVpdGhlciBgYHguZigxKWBgIG9yXG4gICAgICBgYEMuZigxKWBgIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgYGYoQywxKWBgIHdoZXJlIGBgZmBgIGlzXG4gICAgICB0aGUgdW5kZXJseWluZyBmdW5jdGlvbi5cblxuICAgICAgTm90ZSB0aGF0IHRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIGZ1bmN0aW9uIG9iamVjdCB0byAodW5ib3VuZCBvclxuICAgICAgYm91bmQpIG1ldGhvZCBvYmplY3QgaGFwcGVucyBlYWNoIHRpbWUgdGhlIGF0dHJpYnV0ZSBpc1xuICAgICAgcmV0cmlldmVkIGZyb20gdGhlIGNsYXNzIG9yIGluc3RhbmNlLiBJbiBzb21lIGNhc2VzLCBhIGZydWl0ZnVsXG4gICAgICBvcHRpbWl6YXRpb24gaXMgdG8gYXNzaWduIHRoZSBhdHRyaWJ1dGUgdG8gYSBsb2NhbCB2YXJpYWJsZSBhbmRcbiAgICAgIGNhbGwgdGhhdCBsb2NhbCB2YXJpYWJsZS4gQWxzbyBub3RpY2UgdGhhdCB0aGlzIHRyYW5zZm9ybWF0aW9uXG4gICAgICBvbmx5IGhhcHBlbnMgZm9yIHVzZXItZGVmaW5lZCBmdW5jdGlvbnM7IG90aGVyIGNhbGxhYmxlIG9iamVjdHNcbiAgICAgIChhbmQgYWxsIG5vbi1jYWxsYWJsZSBvYmplY3RzKSBhcmUgcmV0cmlldmVkIHdpdGhvdXRcbiAgICAgIHRyYW5zZm9ybWF0aW9uLiAgSXQgaXMgYWxzbyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHVzZXItZGVmaW5lZFxuICAgICAgZnVuY3Rpb25zIHdoaWNoIGFyZSBhdHRyaWJ1dGVzIG9mIGEgY2xhc3MgaW5zdGFuY2UgYXJlIG5vdFxuICAgICAgY29udmVydGVkIHRvIGJvdW5kIG1ldGhvZHM7IHRoaXMgKm9ubHkqIGhhcHBlbnMgd2hlbiB0aGVcbiAgICAgIGZ1bmN0aW9uIGlzIGFuIGF0dHJpYnV0ZSBvZiB0aGUgY2xhc3MuXG5cbiAgIEdlbmVyYXRvciBmdW5jdGlvbnNcbiAgICAgIEEgZnVuY3Rpb24gb3IgbWV0aG9kIHdoaWNoIHVzZXMgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnQgKHNlZVxuICAgICAgc2VjdGlvbiAqVGhlIHlpZWxkIHN0YXRlbWVudCopIGlzIGNhbGxlZCBhICpnZW5lcmF0b3IgZnVuY3Rpb24qLlxuICAgICAgU3VjaCBhIGZ1bmN0aW9uLCB3aGVuIGNhbGxlZCwgYWx3YXlzIHJldHVybnMgYW4gaXRlcmF0b3Igb2JqZWN0XG4gICAgICB3aGljaCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbjogIGNhbGxpbmdcbiAgICAgIHRoZSBpdGVyYXRvclwncyBgYG5leHQoKWBgIG1ldGhvZCB3aWxsIGNhdXNlIHRoZSBmdW5jdGlvbiB0b1xuICAgICAgZXhlY3V0ZSB1bnRpbCBpdCBwcm92aWRlcyBhIHZhbHVlIHVzaW5nIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50LlxuICAgICAgV2hlbiB0aGUgZnVuY3Rpb24gZXhlY3V0ZXMgYSBgYHJldHVybmBgIHN0YXRlbWVudCBvciBmYWxscyBvZmZcbiAgICAgIHRoZSBlbmQsIGEgYGBTdG9wSXRlcmF0aW9uYGAgZXhjZXB0aW9uIGlzIHJhaXNlZCBhbmQgdGhlXG4gICAgICBpdGVyYXRvciB3aWxsIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBzZXQgb2YgdmFsdWVzIHRvIGJlXG4gICAgICByZXR1cm5lZC5cblxuICAgQnVpbHQtaW4gZnVuY3Rpb25zXG4gICAgICBBIGJ1aWx0LWluIGZ1bmN0aW9uIG9iamVjdCBpcyBhIHdyYXBwZXIgYXJvdW5kIGEgQyBmdW5jdGlvbi5cbiAgICAgIEV4YW1wbGVzIG9mIGJ1aWx0LWluIGZ1bmN0aW9ucyBhcmUgYGBsZW4oKWBgIGFuZCBgYG1hdGguc2luKClgYFxuICAgICAgKGBgbWF0aGBgIGlzIGEgc3RhbmRhcmQgYnVpbHQtaW4gbW9kdWxlKS4gVGhlIG51bWJlciBhbmQgdHlwZSBvZlxuICAgICAgdGhlIGFyZ3VtZW50cyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgQyBmdW5jdGlvbi4gU3BlY2lhbCByZWFkLVxuICAgICAgb25seSBhdHRyaWJ1dGVzOiBgYF9fZG9jX19gYCBpcyB0aGUgZnVuY3Rpb25cJ3MgZG9jdW1lbnRhdGlvblxuICAgICAgc3RyaW5nLCBvciBgYE5vbmVgYCBpZiB1bmF2YWlsYWJsZTsgYGBfX25hbWVfX2BgIGlzIHRoZVxuICAgICAgZnVuY3Rpb25cJ3MgbmFtZTsgYGBfX3NlbGZfX2BgIGlzIHNldCB0byBgYE5vbmVgYCAoYnV0IHNlZSB0aGVcbiAgICAgIG5leHQgaXRlbSk7IGBgX19tb2R1bGVfX2BgIGlzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgdGhlXG4gICAgICBmdW5jdGlvbiB3YXMgZGVmaW5lZCBpbiBvciBgYE5vbmVgYCBpZiB1bmF2YWlsYWJsZS5cblxuICAgQnVpbHQtaW4gbWV0aG9kc1xuICAgICAgVGhpcyBpcyByZWFsbHkgYSBkaWZmZXJlbnQgZGlzZ3Vpc2Ugb2YgYSBidWlsdC1pbiBmdW5jdGlvbiwgdGhpc1xuICAgICAgdGltZSBjb250YWluaW5nIGFuIG9iamVjdCBwYXNzZWQgdG8gdGhlIEMgZnVuY3Rpb24gYXMgYW5cbiAgICAgIGltcGxpY2l0IGV4dHJhIGFyZ3VtZW50LiAgQW4gZXhhbXBsZSBvZiBhIGJ1aWx0LWluIG1ldGhvZCBpc1xuICAgICAgYGBhbGlzdC5hcHBlbmQoKWBgLCBhc3N1bWluZyAqYWxpc3QqIGlzIGEgbGlzdCBvYmplY3QuIEluIHRoaXNcbiAgICAgIGNhc2UsIHRoZSBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGUgYGBfX3NlbGZfX2BgIGlzIHNldCB0byB0aGVcbiAgICAgIG9iamVjdCBkZW5vdGVkIGJ5ICphbGlzdCouXG5cbiAgIENsYXNzIFR5cGVzXG4gICAgICBDbGFzcyB0eXBlcywgb3IgIm5ldy1zdHlsZSBjbGFzc2VzLCIgYXJlIGNhbGxhYmxlLiAgVGhlc2VcbiAgICAgIG9iamVjdHMgbm9ybWFsbHkgYWN0IGFzIGZhY3RvcmllcyBmb3IgbmV3IGluc3RhbmNlcyBvZlxuICAgICAgdGhlbXNlbHZlcywgYnV0IHZhcmlhdGlvbnMgYXJlIHBvc3NpYmxlIGZvciBjbGFzcyB0eXBlcyB0aGF0XG4gICAgICBvdmVycmlkZSBgYF9fbmV3X18oKWBgLiAgVGhlIGFyZ3VtZW50cyBvZiB0aGUgY2FsbCBhcmUgcGFzc2VkIHRvXG4gICAgICBgYF9fbmV3X18oKWBgIGFuZCwgaW4gdGhlIHR5cGljYWwgY2FzZSwgdG8gYGBfX2luaXRfXygpYGAgdG9cbiAgICAgIGluaXRpYWxpemUgdGhlIG5ldyBpbnN0YW5jZS5cblxuICAgQ2xhc3NpYyBDbGFzc2VzXG4gICAgICBDbGFzcyBvYmplY3RzIGFyZSBkZXNjcmliZWQgYmVsb3cuICBXaGVuIGEgY2xhc3Mgb2JqZWN0IGlzXG4gICAgICBjYWxsZWQsIGEgbmV3IGNsYXNzIGluc3RhbmNlIChhbHNvIGRlc2NyaWJlZCBiZWxvdykgaXMgY3JlYXRlZFxuICAgICAgYW5kIHJldHVybmVkLiAgVGhpcyBpbXBsaWVzIGEgY2FsbCB0byB0aGUgY2xhc3NcJ3MgYGBfX2luaXRfXygpYGBcbiAgICAgIG1ldGhvZCBpZiBpdCBoYXMgb25lLiAgQW55IGFyZ3VtZW50cyBhcmUgcGFzc2VkIG9uIHRvIHRoZVxuICAgICAgYGBfX2luaXRfXygpYGAgbWV0aG9kLiAgSWYgdGhlcmUgaXMgbm8gYGBfX2luaXRfXygpYGAgbWV0aG9kLFxuICAgICAgdGhlIGNsYXNzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLlxuXG4gICBDbGFzcyBpbnN0YW5jZXNcbiAgICAgIENsYXNzIGluc3RhbmNlcyBhcmUgZGVzY3JpYmVkIGJlbG93LiAgQ2xhc3MgaW5zdGFuY2VzIGFyZVxuICAgICAgY2FsbGFibGUgb25seSB3aGVuIHRoZSBjbGFzcyBoYXMgYSBgYF9fY2FsbF9fKClgYCBtZXRob2Q7XG4gICAgICBgYHgoYXJndW1lbnRzKWBgIGlzIGEgc2hvcnRoYW5kIGZvciBgYHguX19jYWxsX18oYXJndW1lbnRzKWBgLlxuXG5Nb2R1bGVzXG4gICBNb2R1bGVzIGFyZSBpbXBvcnRlZCBieSB0aGUgYGBpbXBvcnRgYCBzdGF0ZW1lbnQgKHNlZSBzZWN0aW9uICpUaGVcbiAgIGltcG9ydCBzdGF0ZW1lbnQqKS4gQSBtb2R1bGUgb2JqZWN0IGhhcyBhIG5hbWVzcGFjZSBpbXBsZW1lbnRlZCBieVxuICAgYSBkaWN0aW9uYXJ5IG9iamVjdCAodGhpcyBpcyB0aGUgZGljdGlvbmFyeSByZWZlcmVuY2VkIGJ5IHRoZVxuICAgZnVuY19nbG9iYWxzIGF0dHJpYnV0ZSBvZiBmdW5jdGlvbnMgZGVmaW5lZCBpbiB0aGUgbW9kdWxlKS5cbiAgIEF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSB0cmFuc2xhdGVkIHRvIGxvb2t1cHMgaW4gdGhpcyBkaWN0aW9uYXJ5LFxuICAgZS5nLiwgYGBtLnhgYCBpcyBlcXVpdmFsZW50IHRvIGBgbS5fX2RpY3RfX1sieCJdYGAuIEEgbW9kdWxlIG9iamVjdFxuICAgZG9lcyBub3QgY29udGFpbiB0aGUgY29kZSBvYmplY3QgdXNlZCB0byBpbml0aWFsaXplIHRoZSBtb2R1bGVcbiAgIChzaW5jZSBpdCBpc25cJ3QgbmVlZGVkIG9uY2UgdGhlIGluaXRpYWxpemF0aW9uIGlzIGRvbmUpLlxuXG4gICBBdHRyaWJ1dGUgYXNzaWdubWVudCB1cGRhdGVzIHRoZSBtb2R1bGVcJ3MgbmFtZXNwYWNlIGRpY3Rpb25hcnksXG4gICBlLmcuLCBgYG0ueCA9IDFgYCBpcyBlcXVpdmFsZW50IHRvIGBgbS5fX2RpY3RfX1sieCJdID0gMWBgLlxuXG4gICBTcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGU6IGBgX19kaWN0X19gYCBpcyB0aGUgbW9kdWxlXCdzIG5hbWVzcGFjZVxuICAgYXMgYSBkaWN0aW9uYXJ5IG9iamVjdC5cblxuICAgKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBCZWNhdXNlIG9mIHRoZSB3YXkgQ1B5dGhvblxuICAgY2xlYXJzIG1vZHVsZSBkaWN0aW9uYXJpZXMsIHRoZSBtb2R1bGUgZGljdGlvbmFyeSB3aWxsIGJlIGNsZWFyZWRcbiAgIHdoZW4gdGhlIG1vZHVsZSBmYWxscyBvdXQgb2Ygc2NvcGUgZXZlbiBpZiB0aGUgZGljdGlvbmFyeSBzdGlsbCBoYXNcbiAgIGxpdmUgcmVmZXJlbmNlcy4gIFRvIGF2b2lkIHRoaXMsIGNvcHkgdGhlIGRpY3Rpb25hcnkgb3Iga2VlcCB0aGVcbiAgIG1vZHVsZSBhcm91bmQgd2hpbGUgdXNpbmcgaXRzIGRpY3Rpb25hcnkgZGlyZWN0bHkuXG5cbiAgIFByZWRlZmluZWQgKHdyaXRhYmxlKSBhdHRyaWJ1dGVzOiBgYF9fbmFtZV9fYGAgaXMgdGhlIG1vZHVsZVwnc1xuICAgbmFtZTsgYGBfX2RvY19fYGAgaXMgdGhlIG1vZHVsZVwncyBkb2N1bWVudGF0aW9uIHN0cmluZywgb3IgYGBOb25lYGBcbiAgIGlmIHVuYXZhaWxhYmxlOyBgYF9fZmlsZV9fYGAgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBmaWxlIGZyb20gd2hpY2hcbiAgIHRoZSBtb2R1bGUgd2FzIGxvYWRlZCwgaWYgaXQgd2FzIGxvYWRlZCBmcm9tIGEgZmlsZS4gVGhlXG4gICBgYF9fZmlsZV9fYGAgYXR0cmlidXRlIGlzIG5vdCBwcmVzZW50IGZvciBDIG1vZHVsZXMgdGhhdCBhcmVcbiAgIHN0YXRpY2FsbHkgbGlua2VkIGludG8gdGhlIGludGVycHJldGVyOyBmb3IgZXh0ZW5zaW9uIG1vZHVsZXNcbiAgIGxvYWRlZCBkeW5hbWljYWxseSBmcm9tIGEgc2hhcmVkIGxpYnJhcnksIGl0IGlzIHRoZSBwYXRobmFtZSBvZiB0aGVcbiAgIHNoYXJlZCBsaWJyYXJ5IGZpbGUuXG5cbkNsYXNzZXNcbiAgIEJvdGggY2xhc3MgdHlwZXMgKG5ldy1zdHlsZSBjbGFzc2VzKSBhbmQgY2xhc3Mgb2JqZWN0cyAob2xkLVxuICAgc3R5bGUvY2xhc3NpYyBjbGFzc2VzKSBhcmUgdHlwaWNhbGx5IGNyZWF0ZWQgYnkgY2xhc3MgZGVmaW5pdGlvbnNcbiAgIChzZWUgc2VjdGlvbiAqQ2xhc3MgZGVmaW5pdGlvbnMqKS4gIEEgY2xhc3MgaGFzIGEgbmFtZXNwYWNlXG4gICBpbXBsZW1lbnRlZCBieSBhIGRpY3Rpb25hcnkgb2JqZWN0LiBDbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlcyBhcmVcbiAgIHRyYW5zbGF0ZWQgdG8gbG9va3VwcyBpbiB0aGlzIGRpY3Rpb25hcnksIGUuZy4sIGBgQy54YGAgaXNcbiAgIHRyYW5zbGF0ZWQgdG8gYGBDLl9fZGljdF9fWyJ4Il1gYCAoYWx0aG91Z2ggZm9yIG5ldy1zdHlsZSBjbGFzc2VzXG4gICBpbiBwYXJ0aWN1bGFyIHRoZXJlIGFyZSBhIG51bWJlciBvZiBob29rcyB3aGljaCBhbGxvdyBmb3Igb3RoZXJcbiAgIG1lYW5zIG9mIGxvY2F0aW5nIGF0dHJpYnV0ZXMpLiBXaGVuIHRoZSBhdHRyaWJ1dGUgbmFtZSBpcyBub3QgZm91bmRcbiAgIHRoZXJlLCB0aGUgYXR0cmlidXRlIHNlYXJjaCBjb250aW51ZXMgaW4gdGhlIGJhc2UgY2xhc3Nlcy4gIEZvclxuICAgb2xkLXN0eWxlIGNsYXNzZXMsIHRoZSBzZWFyY2ggaXMgZGVwdGgtZmlyc3QsIGxlZnQtdG8tcmlnaHQgaW4gdGhlXG4gICBvcmRlciBvZiBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3QuIE5ldy1zdHlsZSBjbGFzc2VzIHVzZVxuICAgdGhlIG1vcmUgY29tcGxleCBDMyBtZXRob2QgcmVzb2x1dGlvbiBvcmRlciB3aGljaCBiZWhhdmVzIGNvcnJlY3RseVxuICAgZXZlbiBpbiB0aGUgcHJlc2VuY2Ugb2YgXCdkaWFtb25kXCcgaW5oZXJpdGFuY2Ugc3RydWN0dXJlcyB3aGVyZVxuICAgdGhlcmUgYXJlIG11bHRpcGxlIGluaGVyaXRhbmNlIHBhdGhzIGxlYWRpbmcgYmFjayB0byBhIGNvbW1vblxuICAgYW5jZXN0b3IuIEFkZGl0aW9uYWwgZGV0YWlscyBvbiB0aGUgQzMgTVJPIHVzZWQgYnkgbmV3LXN0eWxlXG4gICBjbGFzc2VzIGNhbiBiZSBmb3VuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhY2NvbXBhbnlpbmcgdGhlIDIuM1xuICAgcmVsZWFzZSBhdCBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG93bmxvYWQvcmVsZWFzZXMvMi4zL21yby8uXG5cbiAgIFdoZW4gYSBjbGFzcyBhdHRyaWJ1dGUgcmVmZXJlbmNlIChmb3IgY2xhc3MgYGBDYGAsIHNheSkgd291bGQgeWllbGRcbiAgIGEgdXNlci1kZWZpbmVkIGZ1bmN0aW9uIG9iamVjdCBvciBhbiB1bmJvdW5kIHVzZXItZGVmaW5lZCBtZXRob2RcbiAgIG9iamVjdCB3aG9zZSBhc3NvY2lhdGVkIGNsYXNzIGlzIGVpdGhlciBgYENgYCBvciBvbmUgb2YgaXRzIGJhc2VcbiAgIGNsYXNzZXMsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gYW4gdW5ib3VuZCB1c2VyLWRlZmluZWQgbWV0aG9kXG4gICBvYmplY3Qgd2hvc2UgYGBpbV9jbGFzc2BgIGF0dHJpYnV0ZSBpcyBgYENgYC4gV2hlbiBpdCB3b3VsZCB5aWVsZCBhXG4gICBjbGFzcyBtZXRob2Qgb2JqZWN0LCBpdCBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgYm91bmQgdXNlci1kZWZpbmVkXG4gICBtZXRob2Qgb2JqZWN0IHdob3NlIGBgaW1fc2VsZmBgIGF0dHJpYnV0ZSBpcyBgYENgYC4gIFdoZW4gaXQgd291bGRcbiAgIHlpZWxkIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGl0IGlzIHRyYW5zZm9ybWVkIGludG8gdGhlIG9iamVjdFxuICAgd3JhcHBlZCBieSB0aGUgc3RhdGljIG1ldGhvZCBvYmplY3QuIFNlZSBzZWN0aW9uICpJbXBsZW1lbnRpbmdcbiAgIERlc2NyaXB0b3JzKiBmb3IgYW5vdGhlciB3YXkgaW4gd2hpY2ggYXR0cmlidXRlcyByZXRyaWV2ZWQgZnJvbSBhXG4gICBjbGFzcyBtYXkgZGlmZmVyIGZyb20gdGhvc2UgYWN0dWFsbHkgY29udGFpbmVkIGluIGl0cyBgYF9fZGljdF9fYGBcbiAgIChub3RlIHRoYXQgb25seSBuZXctc3R5bGUgY2xhc3NlcyBzdXBwb3J0IGRlc2NyaXB0b3JzKS5cblxuICAgQ2xhc3MgYXR0cmlidXRlIGFzc2lnbm1lbnRzIHVwZGF0ZSB0aGUgY2xhc3NcJ3MgZGljdGlvbmFyeSwgbmV2ZXJcbiAgIHRoZSBkaWN0aW9uYXJ5IG9mIGEgYmFzZSBjbGFzcy5cblxuICAgQSBjbGFzcyBvYmplY3QgY2FuIGJlIGNhbGxlZCAoc2VlIGFib3ZlKSB0byB5aWVsZCBhIGNsYXNzIGluc3RhbmNlXG4gICAoc2VlIGJlbG93KS5cblxuICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiBgYF9fbmFtZV9fYGAgaXMgdGhlIGNsYXNzIG5hbWU7IGBgX19tb2R1bGVfX2BgXG4gICBpcyB0aGUgbW9kdWxlIG5hbWUgaW4gd2hpY2ggdGhlIGNsYXNzIHdhcyBkZWZpbmVkOyBgYF9fZGljdF9fYGAgaXNcbiAgIHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIGNsYXNzXCdzIG5hbWVzcGFjZTsgYGBfX2Jhc2VzX19gYCBpcyBhXG4gICB0dXBsZSAocG9zc2libHkgZW1wdHkgb3IgYSBzaW5nbGV0b24pIGNvbnRhaW5pbmcgdGhlIGJhc2UgY2xhc3NlcyxcbiAgIGluIHRoZSBvcmRlciBvZiB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSBiYXNlIGNsYXNzIGxpc3Q7XG4gICBgYF9fZG9jX19gYCBpcyB0aGUgY2xhc3NcJ3MgZG9jdW1lbnRhdGlvbiBzdHJpbmcsIG9yIE5vbmUgaWZcbiAgIHVuZGVmaW5lZC5cblxuQ2xhc3MgaW5zdGFuY2VzXG4gICBBIGNsYXNzIGluc3RhbmNlIGlzIGNyZWF0ZWQgYnkgY2FsbGluZyBhIGNsYXNzIG9iamVjdCAoc2VlIGFib3ZlKS5cbiAgIEEgY2xhc3MgaW5zdGFuY2UgaGFzIGEgbmFtZXNwYWNlIGltcGxlbWVudGVkIGFzIGEgZGljdGlvbmFyeSB3aGljaFxuICAgaXMgdGhlIGZpcnN0IHBsYWNlIGluIHdoaWNoIGF0dHJpYnV0ZSByZWZlcmVuY2VzIGFyZSBzZWFyY2hlZC5cbiAgIFdoZW4gYW4gYXR0cmlidXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgYW5kIHRoZSBpbnN0YW5jZVwncyBjbGFzcyBoYXNcbiAgIGFuIGF0dHJpYnV0ZSBieSB0aGF0IG5hbWUsIHRoZSBzZWFyY2ggY29udGludWVzIHdpdGggdGhlIGNsYXNzXG4gICBhdHRyaWJ1dGVzLiAgSWYgYSBjbGFzcyBhdHRyaWJ1dGUgaXMgZm91bmQgdGhhdCBpcyBhIHVzZXItZGVmaW5lZFxuICAgZnVuY3Rpb24gb2JqZWN0IG9yIGFuIHVuYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3Qgd2hvc2VcbiAgIGFzc29jaWF0ZWQgY2xhc3MgaXMgdGhlIGNsYXNzIChjYWxsIGl0IGBgQ2BgKSBvZiB0aGUgaW5zdGFuY2UgZm9yXG4gICB3aGljaCB0aGUgYXR0cmlidXRlIHJlZmVyZW5jZSB3YXMgaW5pdGlhdGVkIG9yIG9uZSBvZiBpdHMgYmFzZXMsIGl0XG4gICBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgYm91bmQgdXNlci1kZWZpbmVkIG1ldGhvZCBvYmplY3Qgd2hvc2VcbiAgIGBgaW1fY2xhc3NgYCBhdHRyaWJ1dGUgaXMgYGBDYGAgYW5kIHdob3NlIGBgaW1fc2VsZmBgIGF0dHJpYnV0ZSBpc1xuICAgdGhlIGluc3RhbmNlLiBTdGF0aWMgbWV0aG9kIGFuZCBjbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgYWxzb1xuICAgdHJhbnNmb3JtZWQsIGFzIGlmIHRoZXkgaGFkIGJlZW4gcmV0cmlldmVkIGZyb20gY2xhc3MgYGBDYGA7IHNlZVxuICAgYWJvdmUgdW5kZXIgIkNsYXNzZXMiLiBTZWUgc2VjdGlvbiAqSW1wbGVtZW50aW5nIERlc2NyaXB0b3JzKiBmb3JcbiAgIGFub3RoZXIgd2F5IGluIHdoaWNoIGF0dHJpYnV0ZXMgb2YgYSBjbGFzcyByZXRyaWV2ZWQgdmlhIGl0c1xuICAgaW5zdGFuY2VzIG1heSBkaWZmZXIgZnJvbSB0aGUgb2JqZWN0cyBhY3R1YWxseSBzdG9yZWQgaW4gdGhlXG4gICBjbGFzc1wncyBgYF9fZGljdF9fYGAuIElmIG5vIGNsYXNzIGF0dHJpYnV0ZSBpcyBmb3VuZCwgYW5kIHRoZVxuICAgb2JqZWN0XCdzIGNsYXNzIGhhcyBhIGBgX19nZXRhdHRyX18oKWBgIG1ldGhvZCwgdGhhdCBpcyBjYWxsZWQgdG9cbiAgIHNhdGlzZnkgdGhlIGxvb2t1cC5cblxuICAgQXR0cmlidXRlIGFzc2lnbm1lbnRzIGFuZCBkZWxldGlvbnMgdXBkYXRlIHRoZSBpbnN0YW5jZVwnc1xuICAgZGljdGlvbmFyeSwgbmV2ZXIgYSBjbGFzc1wncyBkaWN0aW9uYXJ5LiAgSWYgdGhlIGNsYXNzIGhhcyBhXG4gICBgYF9fc2V0YXR0cl9fKClgYCBvciBgYF9fZGVsYXR0cl9fKClgYCBtZXRob2QsIHRoaXMgaXMgY2FsbGVkXG4gICBpbnN0ZWFkIG9mIHVwZGF0aW5nIHRoZSBpbnN0YW5jZSBkaWN0aW9uYXJ5IGRpcmVjdGx5LlxuXG4gICBDbGFzcyBpbnN0YW5jZXMgY2FuIHByZXRlbmQgdG8gYmUgbnVtYmVycywgc2VxdWVuY2VzLCBvciBtYXBwaW5nc1xuICAgaWYgdGhleSBoYXZlIG1ldGhvZHMgd2l0aCBjZXJ0YWluIHNwZWNpYWwgbmFtZXMuICBTZWUgc2VjdGlvblxuICAgKlNwZWNpYWwgbWV0aG9kIG5hbWVzKi5cblxuICAgU3BlY2lhbCBhdHRyaWJ1dGVzOiBgYF9fZGljdF9fYGAgaXMgdGhlIGF0dHJpYnV0ZSBkaWN0aW9uYXJ5O1xuICAgYGBfX2NsYXNzX19gYCBpcyB0aGUgaW5zdGFuY2VcJ3MgY2xhc3MuXG5cbkZpbGVzXG4gICBBIGZpbGUgb2JqZWN0IHJlcHJlc2VudHMgYW4gb3BlbiBmaWxlLiAgRmlsZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5XG4gICB0aGUgYGBvcGVuKClgYCBidWlsdC1pbiBmdW5jdGlvbiwgYW5kIGFsc28gYnkgYGBvcy5wb3BlbigpYGAsXG4gICBgYG9zLmZkb3BlbigpYGAsIGFuZCB0aGUgYGBtYWtlZmlsZSgpYGAgbWV0aG9kIG9mIHNvY2tldCBvYmplY3RzXG4gICAoYW5kIHBlcmhhcHMgYnkgb3RoZXIgZnVuY3Rpb25zIG9yIG1ldGhvZHMgcHJvdmlkZWQgYnkgZXh0ZW5zaW9uXG4gICBtb2R1bGVzKS4gIFRoZSBvYmplY3RzIGBgc3lzLnN0ZGluYGAsIGBgc3lzLnN0ZG91dGBgIGFuZFxuICAgYGBzeXMuc3RkZXJyYGAgYXJlIGluaXRpYWxpemVkIHRvIGZpbGUgb2JqZWN0cyBjb3JyZXNwb25kaW5nIHRvIHRoZVxuICAgaW50ZXJwcmV0ZXJcJ3Mgc3RhbmRhcmQgaW5wdXQsIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcy4gIFNlZSAqRmlsZVxuICAgT2JqZWN0cyogZm9yIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gb2YgZmlsZSBvYmplY3RzLlxuXG5JbnRlcm5hbCB0eXBlc1xuICAgQSBmZXcgdHlwZXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBpbnRlcnByZXRlciBhcmUgZXhwb3NlZCB0byB0aGVcbiAgIHVzZXIuIFRoZWlyIGRlZmluaXRpb25zIG1heSBjaGFuZ2Ugd2l0aCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlXG4gICBpbnRlcnByZXRlciwgYnV0IHRoZXkgYXJlIG1lbnRpb25lZCBoZXJlIGZvciBjb21wbGV0ZW5lc3MuXG5cbiAgIENvZGUgb2JqZWN0c1xuICAgICAgQ29kZSBvYmplY3RzIHJlcHJlc2VudCAqYnl0ZS1jb21waWxlZCogZXhlY3V0YWJsZSBQeXRob24gY29kZSxcbiAgICAgIG9yICpieXRlY29kZSouIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBjb2RlIG9iamVjdCBhbmQgYVxuICAgICAgZnVuY3Rpb24gb2JqZWN0IGlzIHRoYXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBjb250YWlucyBhbiBleHBsaWNpdFxuICAgICAgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvblwncyBnbG9iYWxzICh0aGUgbW9kdWxlIGluIHdoaWNoIGl0IHdhc1xuICAgICAgZGVmaW5lZCksIHdoaWxlIGEgY29kZSBvYmplY3QgY29udGFpbnMgbm8gY29udGV4dDsgYWxzbyB0aGVcbiAgICAgIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBzdG9yZWQgaW4gdGhlIGZ1bmN0aW9uIG9iamVjdCwgbm90XG4gICAgICBpbiB0aGUgY29kZSBvYmplY3QgKGJlY2F1c2UgdGhleSByZXByZXNlbnQgdmFsdWVzIGNhbGN1bGF0ZWQgYXRcbiAgICAgIHJ1bi10aW1lKS4gIFVubGlrZSBmdW5jdGlvbiBvYmplY3RzLCBjb2RlIG9iamVjdHMgYXJlIGltbXV0YWJsZVxuICAgICAgYW5kIGNvbnRhaW4gbm8gcmVmZXJlbmNlcyAoZGlyZWN0bHkgb3IgaW5kaXJlY3RseSkgdG8gbXV0YWJsZVxuICAgICAgb2JqZWN0cy5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBjb19uYW1lYGAgZ2l2ZXMgdGhlIGZ1bmN0aW9uXG4gICAgICBuYW1lOyBgYGNvX2FyZ2NvdW50YGAgaXMgdGhlIG51bWJlciBvZiBwb3NpdGlvbmFsIGFyZ3VtZW50c1xuICAgICAgKGluY2x1ZGluZyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyk7IGBgY29fbmxvY2Fsc2BgIGlzIHRoZVxuICAgICAgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbiAoaW5jbHVkaW5nXG4gICAgICBhcmd1bWVudHMpOyBgYGNvX3Zhcm5hbWVzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZlxuICAgICAgdGhlIGxvY2FsIHZhcmlhYmxlcyAoc3RhcnRpbmcgd2l0aCB0aGUgYXJndW1lbnQgbmFtZXMpO1xuICAgICAgYGBjb19jZWxsdmFyc2BgIGlzIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZXMgb2YgbG9jYWxcbiAgICAgIHZhcmlhYmxlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IG5lc3RlZCBmdW5jdGlvbnM7XG4gICAgICBgYGNvX2ZyZWV2YXJzYGAgaXMgYSB0dXBsZSBjb250YWluaW5nIHRoZSBuYW1lcyBvZiBmcmVlXG4gICAgICB2YXJpYWJsZXM7IGBgY29fY29kZWBgIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc2VxdWVuY2Ugb2ZcbiAgICAgIGJ5dGVjb2RlIGluc3RydWN0aW9uczsgYGBjb19jb25zdHNgYCBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlXG4gICAgICBsaXRlcmFscyB1c2VkIGJ5IHRoZSBieXRlY29kZTsgYGBjb19uYW1lc2BgIGlzIGEgdHVwbGVcbiAgICAgIGNvbnRhaW5pbmcgdGhlIG5hbWVzIHVzZWQgYnkgdGhlIGJ5dGVjb2RlOyBgYGNvX2ZpbGVuYW1lYGAgaXNcbiAgICAgIHRoZSBmaWxlbmFtZSBmcm9tIHdoaWNoIHRoZSBjb2RlIHdhcyBjb21waWxlZDtcbiAgICAgIGBgY29fZmlyc3RsaW5lbm9gYCBpcyB0aGUgZmlyc3QgbGluZSBudW1iZXIgb2YgdGhlIGZ1bmN0aW9uO1xuICAgICAgYGBjb19sbm90YWJgYCBpcyBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWFwcGluZyBmcm9tIGJ5dGVjb2RlXG4gICAgICBvZmZzZXRzIHRvIGxpbmUgbnVtYmVycyAoZm9yIGRldGFpbHMgc2VlIHRoZSBzb3VyY2UgY29kZSBvZiB0aGVcbiAgICAgIGludGVycHJldGVyKTsgYGBjb19zdGFja3NpemVgYCBpcyB0aGUgcmVxdWlyZWQgc3RhY2sgc2l6ZVxuICAgICAgKGluY2x1ZGluZyBsb2NhbCB2YXJpYWJsZXMpOyBgYGNvX2ZsYWdzYGAgaXMgYW4gaW50ZWdlciBlbmNvZGluZ1xuICAgICAgYSBudW1iZXIgb2YgZmxhZ3MgZm9yIHRoZSBpbnRlcnByZXRlci5cblxuICAgICAgVGhlIGZvbGxvd2luZyBmbGFnIGJpdHMgYXJlIGRlZmluZWQgZm9yIGBgY29fZmxhZ3NgYDogYml0XG4gICAgICBgYDB4MDRgYCBpcyBzZXQgaWYgdGhlIGZ1bmN0aW9uIHVzZXMgdGhlIGBgKmFyZ3VtZW50c2BgIHN5bnRheFxuICAgICAgdG8gYWNjZXB0IGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcG9zaXRpb25hbCBhcmd1bWVudHM7IGJpdFxuICAgICAgYGAweDA4YGAgaXMgc2V0IGlmIHRoZSBmdW5jdGlvbiB1c2VzIHRoZSBgYCoqa2V5d29yZHNgYCBzeW50YXhcbiAgICAgIHRvIGFjY2VwdCBhcmJpdHJhcnkga2V5d29yZCBhcmd1bWVudHM7IGJpdCBgYDB4MjBgYCBpcyBzZXQgaWZcbiAgICAgIHRoZSBmdW5jdGlvbiBpcyBhIGdlbmVyYXRvci5cblxuICAgICAgRnV0dXJlIGZlYXR1cmUgZGVjbGFyYXRpb25zIChgYGZyb20gX19mdXR1cmVfXyBpbXBvcnRcbiAgICAgIGRpdmlzaW9uYGApIGFsc28gdXNlIGJpdHMgaW4gYGBjb19mbGFnc2BgIHRvIGluZGljYXRlIHdoZXRoZXIgYVxuICAgICAgY29kZSBvYmplY3Qgd2FzIGNvbXBpbGVkIHdpdGggYSBwYXJ0aWN1bGFyIGZlYXR1cmUgZW5hYmxlZDogYml0XG4gICAgICBgYDB4MjAwMGBgIGlzIHNldCBpZiB0aGUgZnVuY3Rpb24gd2FzIGNvbXBpbGVkIHdpdGggZnV0dXJlXG4gICAgICBkaXZpc2lvbiBlbmFibGVkOyBiaXRzIGBgMHgxMGBgIGFuZCBgYDB4MTAwMGBgIHdlcmUgdXNlZCBpblxuICAgICAgZWFybGllciB2ZXJzaW9ucyBvZiBQeXRob24uXG5cbiAgICAgIE90aGVyIGJpdHMgaW4gYGBjb19mbGFnc2BgIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNlLlxuXG4gICAgICBJZiBhIGNvZGUgb2JqZWN0IHJlcHJlc2VudHMgYSBmdW5jdGlvbiwgdGhlIGZpcnN0IGl0ZW0gaW5cbiAgICAgIGBgY29fY29uc3RzYGAgaXMgdGhlIGRvY3VtZW50YXRpb24gc3RyaW5nIG9mIHRoZSBmdW5jdGlvbiwgb3JcbiAgICAgIGBgTm9uZWBgIGlmIHVuZGVmaW5lZC5cblxuICAgRnJhbWUgb2JqZWN0c1xuICAgICAgRnJhbWUgb2JqZWN0cyByZXByZXNlbnQgZXhlY3V0aW9uIGZyYW1lcy4gIFRoZXkgbWF5IG9jY3VyIGluXG4gICAgICB0cmFjZWJhY2sgb2JqZWN0cyAoc2VlIGJlbG93KS5cblxuICAgICAgU3BlY2lhbCByZWFkLW9ubHkgYXR0cmlidXRlczogYGBmX2JhY2tgYCBpcyB0byB0aGUgcHJldmlvdXNcbiAgICAgIHN0YWNrIGZyYW1lICh0b3dhcmRzIHRoZSBjYWxsZXIpLCBvciBgYE5vbmVgYCBpZiB0aGlzIGlzIHRoZVxuICAgICAgYm90dG9tIHN0YWNrIGZyYW1lOyBgYGZfY29kZWBgIGlzIHRoZSBjb2RlIG9iamVjdCBiZWluZyBleGVjdXRlZFxuICAgICAgaW4gdGhpcyBmcmFtZTsgYGBmX2xvY2Fsc2BgIGlzIHRoZSBkaWN0aW9uYXJ5IHVzZWQgdG8gbG9vayB1cFxuICAgICAgbG9jYWwgdmFyaWFibGVzOyBgYGZfZ2xvYmFsc2BgIGlzIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXM7XG4gICAgICBgYGZfYnVpbHRpbnNgYCBpcyB1c2VkIGZvciBidWlsdC1pbiAoaW50cmluc2ljKSBuYW1lcztcbiAgICAgIGBgZl9yZXN0cmljdGVkYGAgaXMgYSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgZnVuY3Rpb24gaXNcbiAgICAgIGV4ZWN1dGluZyBpbiByZXN0cmljdGVkIGV4ZWN1dGlvbiBtb2RlOyBgYGZfbGFzdGlgYCBnaXZlcyB0aGVcbiAgICAgIHByZWNpc2UgaW5zdHJ1Y3Rpb24gKHRoaXMgaXMgYW4gaW5kZXggaW50byB0aGUgYnl0ZWNvZGUgc3RyaW5nXG4gICAgICBvZiB0aGUgY29kZSBvYmplY3QpLlxuXG4gICAgICBTcGVjaWFsIHdyaXRhYmxlIGF0dHJpYnV0ZXM6IGBgZl90cmFjZWBgLCBpZiBub3QgYGBOb25lYGAsIGlzIGFcbiAgICAgIGZ1bmN0aW9uIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgY29kZSBsaW5lICh0aGlzIGlzXG4gICAgICB1c2VkIGJ5IHRoZSBkZWJ1Z2dlcik7IGBgZl9leGNfdHlwZWBgLCBgYGZfZXhjX3ZhbHVlYGAsXG4gICAgICBgYGZfZXhjX3RyYWNlYmFja2BgIHJlcHJlc2VudCB0aGUgbGFzdCBleGNlcHRpb24gcmFpc2VkIGluIHRoZVxuICAgICAgcGFyZW50IGZyYW1lIHByb3ZpZGVkIGFub3RoZXIgZXhjZXB0aW9uIHdhcyBldmVyIHJhaXNlZCBpbiB0aGVcbiAgICAgIGN1cnJlbnQgZnJhbWUgKGluIGFsbCBvdGhlciBjYXNlcyB0aGV5IGFyZSBOb25lKTsgYGBmX2xpbmVub2BgXG4gICAgICBpcyB0aGUgY3VycmVudCBsaW5lIG51bWJlciBvZiB0aGUgZnJhbWUgLS0tIHdyaXRpbmcgdG8gdGhpcyBmcm9tXG4gICAgICB3aXRoaW4gYSB0cmFjZSBmdW5jdGlvbiBqdW1wcyB0byB0aGUgZ2l2ZW4gbGluZSAob25seSBmb3IgdGhlXG4gICAgICBib3R0b20tbW9zdCBmcmFtZSkuICBBIGRlYnVnZ2VyIGNhbiBpbXBsZW1lbnQgYSBKdW1wIGNvbW1hbmRcbiAgICAgIChha2EgU2V0IE5leHQgU3RhdGVtZW50KSBieSB3cml0aW5nIHRvIGZfbGluZW5vLlxuXG4gICBUcmFjZWJhY2sgb2JqZWN0c1xuICAgICAgVHJhY2ViYWNrIG9iamVjdHMgcmVwcmVzZW50IGEgc3RhY2sgdHJhY2Ugb2YgYW4gZXhjZXB0aW9uLiAgQVxuICAgICAgdHJhY2ViYWNrIG9iamVjdCBpcyBjcmVhdGVkIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3Vycy4gIFdoZW4gdGhlXG4gICAgICBzZWFyY2ggZm9yIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIHVud2luZHMgdGhlIGV4ZWN1dGlvbiBzdGFjaywgYXRcbiAgICAgIGVhY2ggdW53b3VuZCBsZXZlbCBhIHRyYWNlYmFjayBvYmplY3QgaXMgaW5zZXJ0ZWQgaW4gZnJvbnQgb2ZcbiAgICAgIHRoZSBjdXJyZW50IHRyYWNlYmFjay4gIFdoZW4gYW4gZXhjZXB0aW9uIGhhbmRsZXIgaXMgZW50ZXJlZCxcbiAgICAgIHRoZSBzdGFjayB0cmFjZSBpcyBtYWRlIGF2YWlsYWJsZSB0byB0aGUgcHJvZ3JhbS4gKFNlZSBzZWN0aW9uXG4gICAgICAqVGhlIHRyeSBzdGF0ZW1lbnQqLikgSXQgaXMgYWNjZXNzaWJsZSBhcyBgYHN5cy5leGNfdHJhY2ViYWNrYGAsXG4gICAgICBhbmQgYWxzbyBhcyB0aGUgdGhpcmQgaXRlbSBvZiB0aGUgdHVwbGUgcmV0dXJuZWQgYnlcbiAgICAgIGBgc3lzLmV4Y19pbmZvKClgYC4gIFRoZSBsYXR0ZXIgaXMgdGhlIHByZWZlcnJlZCBpbnRlcmZhY2UsXG4gICAgICBzaW5jZSBpdCB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgcHJvZ3JhbSBpcyB1c2luZyBtdWx0aXBsZVxuICAgICAgdGhyZWFkcy4gV2hlbiB0aGUgcHJvZ3JhbSBjb250YWlucyBubyBzdWl0YWJsZSBoYW5kbGVyLCB0aGVcbiAgICAgIHN0YWNrIHRyYWNlIGlzIHdyaXR0ZW4gKG5pY2VseSBmb3JtYXR0ZWQpIHRvIHRoZSBzdGFuZGFyZCBlcnJvclxuICAgICAgc3RyZWFtOyBpZiB0aGUgaW50ZXJwcmV0ZXIgaXMgaW50ZXJhY3RpdmUsIGl0IGlzIGFsc28gbWFkZVxuICAgICAgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGFzIGBgc3lzLmxhc3RfdHJhY2ViYWNrYGAuXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgdGJfbmV4dGBgIGlzIHRoZSBuZXh0IGxldmVsIGluXG4gICAgICB0aGUgc3RhY2sgdHJhY2UgKHRvd2FyZHMgdGhlIGZyYW1lIHdoZXJlIHRoZSBleGNlcHRpb25cbiAgICAgIG9jY3VycmVkKSwgb3IgYGBOb25lYGAgaWYgdGhlcmUgaXMgbm8gbmV4dCBsZXZlbDsgYGB0Yl9mcmFtZWBgXG4gICAgICBwb2ludHMgdG8gdGhlIGV4ZWN1dGlvbiBmcmFtZSBvZiB0aGUgY3VycmVudCBsZXZlbDtcbiAgICAgIGBgdGJfbGluZW5vYGAgZ2l2ZXMgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBleGNlcHRpb25cbiAgICAgIG9jY3VycmVkOyBgYHRiX2xhc3RpYGAgaW5kaWNhdGVzIHRoZSBwcmVjaXNlIGluc3RydWN0aW9uLiAgVGhlXG4gICAgICBsaW5lIG51bWJlciBhbmQgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgdHJhY2ViYWNrIG1heSBkaWZmZXJcbiAgICAgIGZyb20gdGhlIGxpbmUgbnVtYmVyIG9mIGl0cyBmcmFtZSBvYmplY3QgaWYgdGhlIGV4Y2VwdGlvblxuICAgICAgb2NjdXJyZWQgaW4gYSBgYHRyeWBgIHN0YXRlbWVudCB3aXRoIG5vIG1hdGNoaW5nIGV4Y2VwdCBjbGF1c2VcbiAgICAgIG9yIHdpdGggYSBmaW5hbGx5IGNsYXVzZS5cblxuICAgU2xpY2Ugb2JqZWN0c1xuICAgICAgU2xpY2Ugb2JqZWN0cyBhcmUgdXNlZCB0byByZXByZXNlbnQgc2xpY2VzIHdoZW4gKmV4dGVuZGVkIHNsaWNlXG4gICAgICBzeW50YXgqIGlzIHVzZWQuIFRoaXMgaXMgYSBzbGljZSB1c2luZyB0d28gY29sb25zLCBvciBtdWx0aXBsZVxuICAgICAgc2xpY2VzIG9yIGVsbGlwc2VzIHNlcGFyYXRlZCBieSBjb21tYXMsIGUuZy4sIGBgYVtpOmo6c3RlcF1gYCxcbiAgICAgIGBgYVtpOmosIGs6bF1gYCwgb3IgYGBhWy4uLiwgaTpqXWBgLiAgVGhleSBhcmUgYWxzbyBjcmVhdGVkIGJ5XG4gICAgICB0aGUgYnVpbHQtaW4gYGBzbGljZSgpYGAgZnVuY3Rpb24uXG5cbiAgICAgIFNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXM6IGBgc3RhcnRgYCBpcyB0aGUgbG93ZXIgYm91bmQ7XG4gICAgICBgYHN0b3BgYCBpcyB0aGUgdXBwZXIgYm91bmQ7IGBgc3RlcGBgIGlzIHRoZSBzdGVwIHZhbHVlOyBlYWNoIGlzXG4gICAgICBgYE5vbmVgYCBpZiBvbWl0dGVkLiBUaGVzZSBhdHRyaWJ1dGVzIGNhbiBoYXZlIGFueSB0eXBlLlxuXG4gICAgICBTbGljZSBvYmplY3RzIHN1cHBvcnQgb25lIG1ldGhvZDpcblxuICAgICAgc2xpY2UuaW5kaWNlcyhzZWxmLCBsZW5ndGgpXG5cbiAgICAgICAgIFRoaXMgbWV0aG9kIHRha2VzIGEgc2luZ2xlIGludGVnZXIgYXJndW1lbnQgKmxlbmd0aCogYW5kXG4gICAgICAgICBjb21wdXRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5kZWQgc2xpY2UgdGhhdCB0aGUgc2xpY2VcbiAgICAgICAgIG9iamVjdCB3b3VsZCBkZXNjcmliZSBpZiBhcHBsaWVkIHRvIGEgc2VxdWVuY2Ugb2YgKmxlbmd0aCpcbiAgICAgICAgIGl0ZW1zLiAgSXQgcmV0dXJucyBhIHR1cGxlIG9mIHRocmVlIGludGVnZXJzOyByZXNwZWN0aXZlbHlcbiAgICAgICAgIHRoZXNlIGFyZSB0aGUgKnN0YXJ0KiBhbmQgKnN0b3AqIGluZGljZXMgYW5kIHRoZSAqc3RlcCogb3JcbiAgICAgICAgIHN0cmlkZSBsZW5ndGggb2YgdGhlIHNsaWNlLiBNaXNzaW5nIG9yIG91dC1vZi1ib3VuZHMgaW5kaWNlc1xuICAgICAgICAgYXJlIGhhbmRsZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHJlZ3VsYXIgc2xpY2VzLlxuXG4gICAgICAgICBOZXcgaW4gdmVyc2lvbiAyLjMuXG5cbiAgIFN0YXRpYyBtZXRob2Qgb2JqZWN0c1xuICAgICAgU3RhdGljIG1ldGhvZCBvYmplY3RzIHByb3ZpZGUgYSB3YXkgb2YgZGVmZWF0aW5nIHRoZVxuICAgICAgdHJhbnNmb3JtYXRpb24gb2YgZnVuY3Rpb24gb2JqZWN0cyB0byBtZXRob2Qgb2JqZWN0cyBkZXNjcmliZWRcbiAgICAgIGFib3ZlLiBBIHN0YXRpYyBtZXRob2Qgb2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgYW55IG90aGVyXG4gICAgICBvYmplY3QsIHVzdWFsbHkgYSB1c2VyLWRlZmluZWQgbWV0aG9kIG9iamVjdC4gV2hlbiBhIHN0YXRpY1xuICAgICAgbWV0aG9kIG9iamVjdCBpcyByZXRyaWV2ZWQgZnJvbSBhIGNsYXNzIG9yIGEgY2xhc3MgaW5zdGFuY2UsIHRoZVxuICAgICAgb2JqZWN0IGFjdHVhbGx5IHJldHVybmVkIGlzIHRoZSB3cmFwcGVkIG9iamVjdCwgd2hpY2ggaXMgbm90XG4gICAgICBzdWJqZWN0IHRvIGFueSBmdXJ0aGVyIHRyYW5zZm9ybWF0aW9uLiBTdGF0aWMgbWV0aG9kIG9iamVjdHMgYXJlXG4gICAgICBub3QgdGhlbXNlbHZlcyBjYWxsYWJsZSwgYWx0aG91Z2ggdGhlIG9iamVjdHMgdGhleSB3cmFwIHVzdWFsbHlcbiAgICAgIGFyZS4gU3RhdGljIG1ldGhvZCBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IHRoZSBidWlsdC1pblxuICAgICAgYGBzdGF0aWNtZXRob2QoKWBgIGNvbnN0cnVjdG9yLlxuXG4gICBDbGFzcyBtZXRob2Qgb2JqZWN0c1xuICAgICAgQSBjbGFzcyBtZXRob2Qgb2JqZWN0LCBsaWtlIGEgc3RhdGljIG1ldGhvZCBvYmplY3QsIGlzIGEgd3JhcHBlclxuICAgICAgYXJvdW5kIGFub3RoZXIgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSB3YXkgaW4gd2hpY2ggdGhhdCBvYmplY3RcbiAgICAgIGlzIHJldHJpZXZlZCBmcm9tIGNsYXNzZXMgYW5kIGNsYXNzIGluc3RhbmNlcy4gVGhlIGJlaGF2aW91ciBvZlxuICAgICAgY2xhc3MgbWV0aG9kIG9iamVjdHMgdXBvbiBzdWNoIHJldHJpZXZhbCBpcyBkZXNjcmliZWQgYWJvdmUsXG4gICAgICB1bmRlciAiVXNlci1kZWZpbmVkIG1ldGhvZHMiLiBDbGFzcyBtZXRob2Qgb2JqZWN0cyBhcmUgY3JlYXRlZFxuICAgICAgYnkgdGhlIGJ1aWx0LWluIGBgY2xhc3NtZXRob2QoKWBgIGNvbnN0cnVjdG9yLlxuJywKKyAndHlwZXNmdW5jdGlvbnMnOiAnXG5GdW5jdGlvbnNcbioqKioqKioqKlxuXG5GdW5jdGlvbiBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGZ1bmN0aW9uIGRlZmluaXRpb25zLiAgVGhlIG9ubHlcbm9wZXJhdGlvbiBvbiBhIGZ1bmN0aW9uIG9iamVjdCBpcyB0byBjYWxsIGl0OiBgYGZ1bmMoYXJndW1lbnQtbGlzdClgYC5cblxuVGhlcmUgYXJlIHJlYWxseSB0d28gZmxhdm9ycyBvZiBmdW5jdGlvbiBvYmplY3RzOiBidWlsdC1pbiBmdW5jdGlvbnNcbmFuZCB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLiAgQm90aCBzdXBwb3J0IHRoZSBzYW1lIG9wZXJhdGlvbiAodG8gY2FsbFxudGhlIGZ1bmN0aW9uKSwgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkaWZmZXJlbnQsIGhlbmNlIHRoZVxuZGlmZmVyZW50IG9iamVjdCB0eXBlcy5cblxuU2VlICpGdW5jdGlvbiBkZWZpbml0aW9ucyogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4nLAorICd0eXBlc21hcHBpbmcnOiAnXG5NYXBwaW5nIFR5cGVzIC0tLSBgYGRpY3RgYFxuKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQSAqbWFwcGluZyogb2JqZWN0IG1hcHMgKmhhc2hhYmxlKiB2YWx1ZXMgdG8gYXJiaXRyYXJ5IG9iamVjdHMuXG5NYXBwaW5ncyBhcmUgbXV0YWJsZSBvYmplY3RzLiAgVGhlcmUgaXMgY3VycmVudGx5IG9ubHkgb25lIHN0YW5kYXJkXG5tYXBwaW5nIHR5cGUsIHRoZSAqZGljdGlvbmFyeSouICAoRm9yIG90aGVyIGNvbnRhaW5lcnMgc2VlIHRoZSBidWlsdFxuaW4gYGBsaXN0YGAsIGBgc2V0YGAsIGFuZCBgYHR1cGxlYGAgY2xhc3NlcywgYW5kIHRoZSBgYGNvbGxlY3Rpb25zYGBcbm1vZHVsZS4pXG5cbkEgZGljdGlvbmFyeVwncyBrZXlzIGFyZSAqYWxtb3N0KiBhcmJpdHJhcnkgdmFsdWVzLiAgVmFsdWVzIHRoYXQgYXJlXG5ub3QgKmhhc2hhYmxlKiwgdGhhdCBpcywgdmFsdWVzIGNvbnRhaW5pbmcgbGlzdHMsIGRpY3Rpb25hcmllcyBvclxub3RoZXIgbXV0YWJsZSB0eXBlcyAodGhhdCBhcmUgY29tcGFyZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gYnkgb2JqZWN0XG5pZGVudGl0eSkgbWF5IG5vdCBiZSB1c2VkIGFzIGtleXMuICBOdW1lcmljIHR5cGVzIHVzZWQgZm9yIGtleXMgb2JleVxudGhlIG5vcm1hbCBydWxlcyBmb3IgbnVtZXJpYyBjb21wYXJpc29uOiBpZiB0d28gbnVtYmVycyBjb21wYXJlIGVxdWFsXG4oc3VjaCBhcyBgYDFgYCBhbmQgYGAxLjBgYCkgdGhlbiB0aGV5IGNhbiBiZSB1c2VkIGludGVyY2hhbmdlYWJseSB0b1xuaW5kZXggdGhlIHNhbWUgZGljdGlvbmFyeSBlbnRyeS4gIChOb3RlIGhvd2V2ZXIsIHRoYXQgc2luY2UgY29tcHV0ZXJzXG5zdG9yZSBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFzIGFwcHJveGltYXRpb25zIGl0IGlzIHVzdWFsbHkgdW53aXNlIHRvXG51c2UgdGhlbSBhcyBkaWN0aW9uYXJ5IGtleXMuKVxuXG5EaWN0aW9uYXJpZXMgY2FuIGJlIGNyZWF0ZWQgYnkgcGxhY2luZyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mXG5gYGtleTogdmFsdWVgYCBwYWlycyB3aXRoaW4gYnJhY2VzLCBmb3IgZXhhbXBsZTogYGB7XCdqYWNrXCc6IDQwOTgsXG5cJ3Nqb2VyZFwnOiA0MTI3fWBgIG9yIGBgezQwOTg6IFwnamFja1wnLCA0MTI3OiBcJ3Nqb2VyZFwnfWBgLCBvciBieSB0aGVcbmBgZGljdGBgIGNvbnN0cnVjdG9yLlxuXG5jbGFzcyBjbGFzcyBkaWN0KCoqa3dhcmcpXG5jbGFzcyBjbGFzcyBkaWN0KG1hcHBpbmcsICoqa3dhcmcpXG5jbGFzcyBjbGFzcyBkaWN0KGl0ZXJhYmxlLCAqKmt3YXJnKVxuXG4gICBSZXR1cm4gYSBuZXcgZGljdGlvbmFyeSBpbml0aWFsaXplZCBmcm9tIGFuIG9wdGlvbmFsIHBvc2l0aW9uYWxcbiAgIGFyZ3VtZW50IGFuZCBhIHBvc3NpYmx5IGVtcHR5IHNldCBvZiBrZXl3b3JkIGFyZ3VtZW50cy5cblxuICAgSWYgbm8gcG9zaXRpb25hbCBhcmd1bWVudCBpcyBnaXZlbiwgYW4gZW1wdHkgZGljdGlvbmFyeSBpcyBjcmVhdGVkLlxuICAgSWYgYSBwb3NpdGlvbmFsIGFyZ3VtZW50IGlzIGdpdmVuIGFuZCBpdCBpcyBhIG1hcHBpbmcgb2JqZWN0LCBhXG4gICBkaWN0aW9uYXJ5IGlzIGNyZWF0ZWQgd2l0aCB0aGUgc2FtZSBrZXktdmFsdWUgcGFpcnMgYXMgdGhlIG1hcHBpbmdcbiAgIG9iamVjdC4gIE90aGVyd2lzZSwgdGhlIHBvc2l0aW9uYWwgYXJndW1lbnQgbXVzdCBiZSBhbiAqaXRlcmF0b3IqXG4gICBvYmplY3QuICBFYWNoIGl0ZW0gaW4gdGhlIGl0ZXJhYmxlIG11c3QgaXRzZWxmIGJlIGFuIGl0ZXJhdG9yIHdpdGhcbiAgIGV4YWN0bHkgdHdvIG9iamVjdHMuICBUaGUgZmlyc3Qgb2JqZWN0IG9mIGVhY2ggaXRlbSBiZWNvbWVzIGEga2V5XG4gICBpbiB0aGUgbmV3IGRpY3Rpb25hcnksIGFuZCB0aGUgc2Vjb25kIG9iamVjdCB0aGUgY29ycmVzcG9uZGluZ1xuICAgdmFsdWUuICBJZiBhIGtleSBvY2N1cnMgbW9yZSB0aGFuIG9uY2UsIHRoZSBsYXN0IHZhbHVlIGZvciB0aGF0IGtleVxuICAgYmVjb21lcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiB0aGUgbmV3IGRpY3Rpb25hcnkuXG5cbiAgIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBnaXZlbiwgdGhlIGtleXdvcmQgYXJndW1lbnRzIGFuZCB0aGVpclxuICAgdmFsdWVzIGFyZSBhZGRlZCB0byB0aGUgZGljdGlvbmFyeSBjcmVhdGVkIGZyb20gdGhlIHBvc2l0aW9uYWxcbiAgIGFyZ3VtZW50LiAgSWYgYSBrZXkgYmVpbmcgYWRkZWQgaXMgYWxyZWFkeSBwcmVzZW50LCB0aGUgdmFsdWUgZnJvbVxuICAgdGhlIGtleXdvcmQgYXJndW1lbnQgcmVwbGFjZXMgdGhlIHZhbHVlIGZyb20gdGhlIHBvc2l0aW9uYWxcbiAgIGFyZ3VtZW50LlxuXG4gICBUbyBpbGx1c3RyYXRlLCB0aGUgZm9sbG93aW5nIGV4YW1wbGVzIGFsbCByZXR1cm4gYSBkaWN0aW9uYXJ5IGVxdWFsXG4gICB0byBgYHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9YGA6XG5cbiAgICAgID4+PiBhID0gZGljdChvbmU9MSwgdHdvPTIsIHRocmVlPTMpXG4gICAgICA+Pj4gYiA9IHtcJ29uZVwnOiAxLCBcJ3R3b1wnOiAyLCBcJ3RocmVlXCc6IDN9XG4gICAgICA+Pj4gYyA9IGRpY3QoemlwKFtcJ29uZVwnLCBcJ3R3b1wnLCBcJ3RocmVlXCddLCBbMSwgMiwgM10pKVxuICAgICAgPj4+IGQgPSBkaWN0KFsoXCd0d29cJywgMiksIChcJ29uZVwnLCAxKSwgKFwndGhyZWVcJywgMyldKVxuICAgICAgPj4+IGUgPSBkaWN0KHtcJ3RocmVlXCc6IDMsIFwnb25lXCc6IDEsIFwndHdvXCc6IDJ9KVxuICAgICAgPj4+IGEgPT0gYiA9PSBjID09IGQgPT0gZVxuICAgICAgVHJ1ZVxuXG4gICBQcm92aWRpbmcga2V5d29yZCBhcmd1bWVudHMgYXMgaW4gdGhlIGZpcnN0IGV4YW1wbGUgb25seSB3b3JrcyBmb3JcbiAgIGtleXMgdGhhdCBhcmUgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzLiAgT3RoZXJ3aXNlLCBhbnkgdmFsaWQga2V5c1xuICAgY2FuIGJlIHVzZWQuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYnVpbGRpbmcgYSBkaWN0aW9uYXJ5IGZyb21cbiAgIGtleXdvcmQgYXJndW1lbnRzIGFkZGVkLlxuXG4gICBUaGVzZSBhcmUgdGhlIG9wZXJhdGlvbnMgdGhhdCBkaWN0aW9uYXJpZXMgc3VwcG9ydCAoYW5kIHRoZXJlZm9yZSxcbiAgIGN1c3RvbSBtYXBwaW5nIHR5cGVzIHNob3VsZCBzdXBwb3J0IHRvbyk6XG5cbiAgIGxlbihkKVxuXG4gICAgICBSZXR1cm4gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgZGljdGlvbmFyeSAqZCouXG5cbiAgIGRba2V5XVxuXG4gICAgICBSZXR1cm4gdGhlIGl0ZW0gb2YgKmQqIHdpdGgga2V5ICprZXkqLiAgUmFpc2VzIGEgYGBLZXlFcnJvcmBgIGlmXG4gICAgICAqa2V5KiBpcyBub3QgaW4gdGhlIG1hcC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi41OiBJZiBhIHN1YmNsYXNzIG9mIGRpY3QgZGVmaW5lcyBhIG1ldGhvZFxuICAgICAgYGBfX21pc3NpbmdfXygpYGAsIGlmIHRoZSBrZXkgKmtleSogaXMgbm90IHByZXNlbnQsIHRoZVxuICAgICAgYGBkW2tleV1gYCBvcGVyYXRpb24gY2FsbHMgdGhhdCBtZXRob2Qgd2l0aCB0aGUga2V5ICprZXkqIGFzXG4gICAgICBhcmd1bWVudC4gIFRoZSBgYGRba2V5XWBgIG9wZXJhdGlvbiB0aGVuIHJldHVybnMgb3IgcmFpc2VzXG4gICAgICB3aGF0ZXZlciBpcyByZXR1cm5lZCBvciByYWlzZWQgYnkgdGhlIGBgX19taXNzaW5nX18oa2V5KWBgIGNhbGxcbiAgICAgIGlmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQuIE5vIG90aGVyIG9wZXJhdGlvbnMgb3IgbWV0aG9kcyBpbnZva2VcbiAgICAgIGBgX19taXNzaW5nX18oKWBgLiBJZiBgYF9fbWlzc2luZ19fKClgYCBpcyBub3QgZGVmaW5lZCxcbiAgICAgIGBgS2V5RXJyb3JgYCBpcyByYWlzZWQuICBgYF9fbWlzc2luZ19fKClgYCBtdXN0IGJlIGEgbWV0aG9kOyBpdFxuICAgICAgY2Fubm90IGJlIGFuIGluc3RhbmNlIHZhcmlhYmxlLiBGb3IgYW4gZXhhbXBsZSwgc2VlXG4gICAgICBgYGNvbGxlY3Rpb25zLmRlZmF1bHRkaWN0YGAuXG5cbiAgIGRba2V5XSA9IHZhbHVlXG5cbiAgICAgIFNldCBgYGRba2V5XWBgIHRvICp2YWx1ZSouXG5cbiAgIGRlbCBkW2tleV1cblxuICAgICAgUmVtb3ZlIGBgZFtrZXldYGAgZnJvbSAqZCouICBSYWlzZXMgYSBgYEtleUVycm9yYGAgaWYgKmtleSogaXNcbiAgICAgIG5vdCBpbiB0aGUgbWFwLlxuXG4gICBrZXkgaW4gZFxuXG4gICAgICBSZXR1cm4gYGBUcnVlYGAgaWYgKmQqIGhhcyBhIGtleSAqa2V5KiwgZWxzZSBgYEZhbHNlYGAuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuICAga2V5IG5vdCBpbiBkXG5cbiAgICAgIEVxdWl2YWxlbnQgdG8gYGBub3Qga2V5IGluIGRgYC5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBpdGVyKGQpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBrZXlzIG9mIHRoZSBkaWN0aW9uYXJ5LiAgVGhpcyBpcyBhXG4gICAgICBzaG9ydGN1dCBmb3IgYGBpdGVya2V5cygpYGAuXG5cbiAgIGNsZWFyKClcblxuICAgICAgUmVtb3ZlIGFsbCBpdGVtcyBmcm9tIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBjb3B5KClcblxuICAgICAgUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBmcm9ta2V5cyhzZXFbLCB2YWx1ZV0pXG5cbiAgICAgIENyZWF0ZSBhIG5ldyBkaWN0aW9uYXJ5IHdpdGgga2V5cyBmcm9tICpzZXEqIGFuZCB2YWx1ZXMgc2V0IHRvXG4gICAgICAqdmFsdWUqLlxuXG4gICAgICBgYGZyb21rZXlzKClgYCBpcyBhIGNsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgYSBuZXcgZGljdGlvbmFyeS5cbiAgICAgICp2YWx1ZSogZGVmYXVsdHMgdG8gYGBOb25lYGAuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMy5cblxuICAgZ2V0KGtleVssIGRlZmF1bHRdKVxuXG4gICAgICBSZXR1cm4gdGhlIHZhbHVlIGZvciAqa2V5KiBpZiAqa2V5KiBpcyBpbiB0aGUgZGljdGlvbmFyeSwgZWxzZVxuICAgICAgKmRlZmF1bHQqLiBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byBgYE5vbmVgYCxcbiAgICAgIHNvIHRoYXQgdGhpcyBtZXRob2QgbmV2ZXIgcmFpc2VzIGEgYGBLZXlFcnJvcmBgLlxuXG4gICBoYXNfa2V5KGtleSlcblxuICAgICAgVGVzdCBmb3IgdGhlIHByZXNlbmNlIG9mICprZXkqIGluIHRoZSBkaWN0aW9uYXJ5LiAgYGBoYXNfa2V5KClgYFxuICAgICAgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgYGtleSBpbiBkYGAuXG5cbiAgIGl0ZW1zKClcblxuICAgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgZGljdGlvbmFyeVwncyBsaXN0IG9mIGBgKGtleSwgdmFsdWUpYGBcbiAgICAgIHBhaXJzLlxuXG4gICAgICAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIEtleXMgYW5kIHZhbHVlcyBhcmUgbGlzdGVkIGluXG4gICAgICBhbiBhcmJpdHJhcnkgb3JkZXIgd2hpY2ggaXMgbm9uLXJhbmRvbSwgdmFyaWVzIGFjcm9zcyBQeXRob25cbiAgICAgIGltcGxlbWVudGF0aW9ucywgYW5kIGRlcGVuZHMgb24gdGhlIGRpY3Rpb25hcnlcJ3MgaGlzdG9yeSBvZlxuICAgICAgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLlxuXG4gICAgICBJZiBgYGl0ZW1zKClgYCwgYGBrZXlzKClgYCwgYGB2YWx1ZXMoKWBgLCBgYGl0ZXJpdGVtcygpYGAsXG4gICAgICBgYGl0ZXJrZXlzKClgYCwgYW5kIGBgaXRlcnZhbHVlcygpYGAgYXJlIGNhbGxlZCB3aXRoIG5vXG4gICAgICBpbnRlcnZlbmluZyBtb2RpZmljYXRpb25zIHRvIHRoZSBkaWN0aW9uYXJ5LCB0aGUgbGlzdHMgd2lsbFxuICAgICAgZGlyZWN0bHkgY29ycmVzcG9uZC4gIFRoaXMgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBgYCh2YWx1ZSxcbiAgICAgIGtleSlgYCBwYWlycyB1c2luZyBgYHppcCgpYGA6IGBgcGFpcnMgPSB6aXAoZC52YWx1ZXMoKSxcbiAgICAgIGQua2V5cygpKWBgLiAgVGhlIHNhbWUgcmVsYXRpb25zaGlwIGhvbGRzIGZvciB0aGUgYGBpdGVya2V5cygpYGBcbiAgICAgIGFuZCBgYGl0ZXJ2YWx1ZXMoKWBgIG1ldGhvZHM6IGBgcGFpcnMgPSB6aXAoZC5pdGVydmFsdWVzKCksXG4gICAgICBkLml0ZXJrZXlzKCkpYGAgcHJvdmlkZXMgdGhlIHNhbWUgdmFsdWUgZm9yIGBgcGFpcnNgYC4gQW5vdGhlclxuICAgICAgd2F5IHRvIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzIGBgcGFpcnMgPSBbKHYsIGspIGZvciAoaywgdikgaW5cbiAgICAgIGQuaXRlcml0ZW1zKCldYGAuXG5cbiAgIGl0ZXJpdGVtcygpXG5cbiAgICAgIFJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBkaWN0aW9uYXJ5XCdzIGBgKGtleSwgdmFsdWUpYGAgcGFpcnMuXG4gICAgICBTZWUgdGhlIG5vdGUgZm9yIGBgZGljdC5pdGVtcygpYGAuXG5cbiAgICAgIFVzaW5nIGBgaXRlcml0ZW1zKClgYCB3aGlsZSBhZGRpbmcgb3IgZGVsZXRpbmcgZW50cmllcyBpbiB0aGVcbiAgICAgIGRpY3Rpb25hcnkgbWF5IHJhaXNlIGEgYGBSdW50aW1lRXJyb3JgYCBvciBmYWlsIHRvIGl0ZXJhdGUgb3ZlclxuICAgICAgYWxsIGVudHJpZXMuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMi5cblxuICAgaXRlcmtleXMoKVxuXG4gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGljdGlvbmFyeVwncyBrZXlzLiAgU2VlIHRoZSBub3RlIGZvclxuICAgICAgYGBkaWN0Lml0ZW1zKClgYC5cblxuICAgICAgVXNpbmcgYGBpdGVya2V5cygpYGAgd2hpbGUgYWRkaW5nIG9yIGRlbGV0aW5nIGVudHJpZXMgaW4gdGhlXG4gICAgICBkaWN0aW9uYXJ5IG1heSByYWlzZSBhIGBgUnVudGltZUVycm9yYGAgb3IgZmFpbCB0byBpdGVyYXRlIG92ZXJcbiAgICAgIGFsbCBlbnRyaWVzLlxuXG4gICAgICBOZXcgaW4gdmVyc2lvbiAyLjIuXG5cbiAgIGl0ZXJ2YWx1ZXMoKVxuXG4gICAgICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUgZGljdGlvbmFyeVwncyB2YWx1ZXMuICBTZWUgdGhlIG5vdGVcbiAgICAgIGZvciBgYGRpY3QuaXRlbXMoKWBgLlxuXG4gICAgICBVc2luZyBgYGl0ZXJ2YWx1ZXMoKWBgIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZVxuICAgICAgZGljdGlvbmFyeSBtYXkgcmFpc2UgYSBgYFJ1bnRpbWVFcnJvcmBgIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyXG4gICAgICBhbGwgZW50cmllcy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBrZXlzKClcblxuICAgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgZGljdGlvbmFyeVwncyBsaXN0IG9mIGtleXMuICBTZWUgdGhlIG5vdGVcbiAgICAgIGZvciBgYGRpY3QuaXRlbXMoKWBgLlxuXG4gICBwb3Aoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIElmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCByZW1vdmUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICBlbHNlIHJldHVybiAqZGVmYXVsdCouICBJZiAqZGVmYXVsdCogaXMgbm90IGdpdmVuIGFuZCAqa2V5KiBpc1xuICAgICAgbm90IGluIHRoZSBkaWN0aW9uYXJ5LCBhIGBgS2V5RXJyb3JgYCBpcyByYWlzZWQuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuMy5cblxuICAgcG9waXRlbSgpXG5cbiAgICAgIFJlbW92ZSBhbmQgcmV0dXJuIGFuIGFyYml0cmFyeSBgYChrZXksIHZhbHVlKWBgIHBhaXIgZnJvbSB0aGVcbiAgICAgIGRpY3Rpb25hcnkuXG5cbiAgICAgIGBgcG9waXRlbSgpYGAgaXMgdXNlZnVsIHRvIGRlc3RydWN0aXZlbHkgaXRlcmF0ZSBvdmVyIGFcbiAgICAgIGRpY3Rpb25hcnksIGFzIG9mdGVuIHVzZWQgaW4gc2V0IGFsZ29yaXRobXMuICBJZiB0aGUgZGljdGlvbmFyeVxuICAgICAgaXMgZW1wdHksIGNhbGxpbmcgYGBwb3BpdGVtKClgYCByYWlzZXMgYSBgYEtleUVycm9yYGAuXG5cbiAgIHNldGRlZmF1bHQoa2V5WywgZGVmYXVsdF0pXG5cbiAgICAgIElmICprZXkqIGlzIGluIHRoZSBkaWN0aW9uYXJ5LCByZXR1cm4gaXRzIHZhbHVlLiAgSWYgbm90LCBpbnNlcnRcbiAgICAgICprZXkqIHdpdGggYSB2YWx1ZSBvZiAqZGVmYXVsdCogYW5kIHJldHVybiAqZGVmYXVsdCouICAqZGVmYXVsdCpcbiAgICAgIGRlZmF1bHRzIHRvIGBgTm9uZWBgLlxuXG4gICB1cGRhdGUoW290aGVyXSlcblxuICAgICAgVXBkYXRlIHRoZSBkaWN0aW9uYXJ5IHdpdGggdGhlIGtleS92YWx1ZSBwYWlycyBmcm9tICpvdGhlciosXG4gICAgICBvdmVyd3JpdGluZyBleGlzdGluZyBrZXlzLiAgUmV0dXJuIGBgTm9uZWBgLlxuXG4gICAgICBgYHVwZGF0ZSgpYGAgYWNjZXB0cyBlaXRoZXIgYW5vdGhlciBkaWN0aW9uYXJ5IG9iamVjdCBvciBhblxuICAgICAgaXRlcmFibGUgb2Yga2V5L3ZhbHVlIHBhaXJzIChhcyB0dXBsZXMgb3Igb3RoZXIgaXRlcmFibGVzIG9mXG4gICAgICBsZW5ndGggdHdvKS4gIElmIGtleXdvcmQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkaWN0aW9uYXJ5XG4gICAgICBpcyB0aGVuIHVwZGF0ZWQgd2l0aCB0aG9zZSBrZXkvdmFsdWUgcGFpcnM6IGBgZC51cGRhdGUocmVkPTEsXG4gICAgICBibHVlPTIpYGAuXG5cbiAgICAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IEFsbG93ZWQgdGhlIGFyZ3VtZW50IHRvIGJlIGFuIGl0ZXJhYmxlXG4gICAgICBvZiBrZXkvdmFsdWUgcGFpcnMgYW5kIGFsbG93ZWQga2V5d29yZCBhcmd1bWVudHMuXG5cbiAgIHZhbHVlcygpXG5cbiAgICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgbGlzdCBvZiB2YWx1ZXMuICBTZWUgdGhlIG5vdGVcbiAgICAgIGZvciBgYGRpY3QuaXRlbXMoKWBgLlxuXG4gICB2aWV3aXRlbXMoKVxuXG4gICAgICBSZXR1cm4gYSBuZXcgdmlldyBvZiB0aGUgZGljdGlvbmFyeVwncyBpdGVtcyAoYGAoa2V5LCB2YWx1ZSlgYFxuICAgICAgcGFpcnMpLiAgU2VlIGJlbG93IGZvciBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi43LlxuXG4gICB2aWV3a2V5cygpXG5cbiAgICAgIFJldHVybiBhIG5ldyB2aWV3IG9mIHRoZSBkaWN0aW9uYXJ5XCdzIGtleXMuICBTZWUgYmVsb3cgZm9yXG4gICAgICBkb2N1bWVudGF0aW9uIG9mIHZpZXcgb2JqZWN0cy5cblxuICAgICAgTmV3IGluIHZlcnNpb24gMi43LlxuXG4gICB2aWV3dmFsdWVzKClcblxuICAgICAgUmV0dXJuIGEgbmV3IHZpZXcgb2YgdGhlIGRpY3Rpb25hcnlcJ3MgdmFsdWVzLiAgU2VlIGJlbG93IGZvclxuICAgICAgZG9jdW1lbnRhdGlvbiBvZiB2aWV3IG9iamVjdHMuXG5cbiAgICAgIE5ldyBpbiB2ZXJzaW9uIDIuNy5cblxuXG5EaWN0aW9uYXJ5IHZpZXcgb2JqZWN0c1xuPT09PT09PT09PT09PT09PT09PT09PT1cblxuVGhlIG9iamVjdHMgcmV0dXJuZWQgYnkgYGBkaWN0LnZpZXdrZXlzKClgYCwgYGBkaWN0LnZpZXd2YWx1ZXMoKWBgIGFuZFxuYGBkaWN0LnZpZXdpdGVtcygpYGAgYXJlICp2aWV3IG9iamVjdHMqLiAgVGhleSBwcm92aWRlIGEgZHluYW1pYyB2aWV3XG5vbiB0aGUgZGljdGlvbmFyeVwncyBlbnRyaWVzLCB3aGljaCBtZWFucyB0aGF0IHdoZW4gdGhlIGRpY3Rpb25hcnlcbmNoYW5nZXMsIHRoZSB2aWV3IHJlZmxlY3RzIHRoZXNlIGNoYW5nZXMuXG5cbkRpY3Rpb25hcnkgdmlld3MgY2FuIGJlIGl0ZXJhdGVkIG92ZXIgdG8geWllbGQgdGhlaXIgcmVzcGVjdGl2ZSBkYXRhLFxuYW5kIHN1cHBvcnQgbWVtYmVyc2hpcCB0ZXN0czpcblxubGVuKGRpY3R2aWV3KVxuXG4gICBSZXR1cm4gdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5LlxuXG5pdGVyKGRpY3R2aWV3KVxuXG4gICBSZXR1cm4gYW4gaXRlcmF0b3Igb3ZlciB0aGUga2V5cywgdmFsdWVzIG9yIGl0ZW1zIChyZXByZXNlbnRlZCBhc1xuICAgdHVwbGVzIG9mIGBgKGtleSwgdmFsdWUpYGApIGluIHRoZSBkaWN0aW9uYXJ5LlxuXG4gICBLZXlzIGFuZCB2YWx1ZXMgYXJlIGl0ZXJhdGVkIG92ZXIgaW4gYW4gYXJiaXRyYXJ5IG9yZGVyIHdoaWNoIGlzXG4gICBub24tcmFuZG9tLCB2YXJpZXMgYWNyb3NzIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMsIGFuZCBkZXBlbmRzIG9uXG4gICB0aGUgZGljdGlvbmFyeVwncyBoaXN0b3J5IG9mIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4gSWYga2V5cyxcbiAgIHZhbHVlcyBhbmQgaXRlbXMgdmlld3MgYXJlIGl0ZXJhdGVkIG92ZXIgd2l0aCBubyBpbnRlcnZlbmluZ1xuICAgbW9kaWZpY2F0aW9ucyB0byB0aGUgZGljdGlvbmFyeSwgdGhlIG9yZGVyIG9mIGl0ZW1zIHdpbGwgZGlyZWN0bHlcbiAgIGNvcnJlc3BvbmQuICBUaGlzIGFsbG93cyB0aGUgY3JlYXRpb24gb2YgYGAodmFsdWUsIGtleSlgYCBwYWlyc1xuICAgdXNpbmcgYGB6aXAoKWBgOiBgYHBhaXJzID0gemlwKGQudmFsdWVzKCksIGQua2V5cygpKWBgLiAgQW5vdGhlclxuICAgd2F5IHRvIGNyZWF0ZSB0aGUgc2FtZSBsaXN0IGlzIGBgcGFpcnMgPSBbKHYsIGspIGZvciAoaywgdikgaW5cbiAgIGQuaXRlbXMoKV1gYC5cblxuICAgSXRlcmF0aW5nIHZpZXdzIHdoaWxlIGFkZGluZyBvciBkZWxldGluZyBlbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5XG4gICBtYXkgcmFpc2UgYSBgYFJ1bnRpbWVFcnJvcmBgIG9yIGZhaWwgdG8gaXRlcmF0ZSBvdmVyIGFsbCBlbnRyaWVzLlxuXG54IGluIGRpY3R2aWV3XG5cbiAgIFJldHVybiBgYFRydWVgYCBpZiAqeCogaXMgaW4gdGhlIHVuZGVybHlpbmcgZGljdGlvbmFyeVwncyBrZXlzLFxuICAgdmFsdWVzIG9yIGl0ZW1zIChpbiB0aGUgbGF0dGVyIGNhc2UsICp4KiBzaG91bGQgYmUgYSBgYChrZXksXG4gICB2YWx1ZSlgYCB0dXBsZSkuXG5cbktleXMgdmlld3MgYXJlIHNldC1saWtlIHNpbmNlIHRoZWlyIGVudHJpZXMgYXJlIHVuaXF1ZSBhbmQgaGFzaGFibGUuXG5JZiBhbGwgdmFsdWVzIGFyZSBoYXNoYWJsZSwgc28gdGhhdCAoa2V5LCB2YWx1ZSkgcGFpcnMgYXJlIHVuaXF1ZSBhbmRcbmhhc2hhYmxlLCB0aGVuIHRoZSBpdGVtcyB2aWV3IGlzIGFsc28gc2V0LWxpa2UuICAoVmFsdWVzIHZpZXdzIGFyZSBub3RcbnRyZWF0ZWQgYXMgc2V0LWxpa2Ugc2luY2UgdGhlIGVudHJpZXMgYXJlIGdlbmVyYWxseSBub3QgdW5pcXVlLikgIFRoZW5cbnRoZXNlIHNldCBvcGVyYXRpb25zIGFyZSBhdmFpbGFibGUgKCJvdGhlciIgcmVmZXJzIGVpdGhlciB0byBhbm90aGVyXG52aWV3IG9yIGEgc2V0KTpcblxuZGljdHZpZXcgJiBvdGhlclxuXG4gICBSZXR1cm4gdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgZGljdHZpZXcgYW5kIHRoZSBvdGhlciBvYmplY3QgYXMgYVxuICAgbmV3IHNldC5cblxuZGljdHZpZXcgfCBvdGhlclxuXG4gICBSZXR1cm4gdGhlIHVuaW9uIG9mIHRoZSBkaWN0dmlldyBhbmQgdGhlIG90aGVyIG9iamVjdCBhcyBhIG5ldyBzZXQuXG5cbmRpY3R2aWV3IC0gb3RoZXJcblxuICAgUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0XG4gICAoYWxsIGVsZW1lbnRzIGluICpkaWN0dmlldyogdGhhdCBhcmVuXCd0IGluICpvdGhlciopIGFzIGEgbmV3IHNldC5cblxuZGljdHZpZXcgXiBvdGhlclxuXG4gICBSZXR1cm4gdGhlIHN5bW1ldHJpYyBkaWZmZXJlbmNlIChhbGwgZWxlbWVudHMgZWl0aGVyIGluICpkaWN0dmlldypcbiAgIG9yICpvdGhlciosIGJ1dCBub3QgaW4gYm90aCkgb2YgdGhlIGRpY3R2aWV3IGFuZCB0aGUgb3RoZXIgb2JqZWN0XG4gICBhcyBhIG5ldyBzZXQuXG5cbkFuIGV4YW1wbGUgb2YgZGljdGlvbmFyeSB2aWV3IHVzYWdlOlxuXG4gICA+Pj4gZGlzaGVzID0ge1wnZWdnc1wnOiAyLCBcJ3NhdXNhZ2VcJzogMSwgXCdiYWNvblwnOiAxLCBcJ3NwYW1cJzogNTAwfVxuICAgPj4+IGtleXMgPSBkaXNoZXMudmlld2tleXMoKVxuICAgPj4+IHZhbHVlcyA9IGRpc2hlcy52aWV3dmFsdWVzKClcblxuICAgPj4+ICMgaXRlcmF0aW9uXG4gICA+Pj4gbiA9IDBcbiAgID4+PiBmb3IgdmFsIGluIHZhbHVlczpcbiAgIC4uLiAgICAgbiArPSB2YWxcbiAgID4+PiBwcmludChuKVxuICAgNTA0XG5cbiAgID4+PiAjIGtleXMgYW5kIHZhbHVlcyBhcmUgaXRlcmF0ZWQgb3ZlciBpbiB0aGUgc2FtZSBvcmRlclxuICAgPj4+IGxpc3Qoa2V5cylcbiAgIFtcJ2VnZ3NcJywgXCdiYWNvblwnLCBcJ3NhdXNhZ2VcJywgXCdzcGFtXCddXG4gICA+Pj4gbGlzdCh2YWx1ZXMpXG4gICBbMiwgMSwgMSwgNTAwXVxuXG4gICA+Pj4gIyB2aWV3IG9iamVjdHMgYXJlIGR5bmFtaWMgYW5kIHJlZmxlY3QgZGljdCBjaGFuZ2VzXG4gICA+Pj4gZGVsIGRpc2hlc1tcJ2VnZ3NcJ11cbiAgID4+PiBkZWwgZGlzaGVzW1wnc2F1c2FnZVwnXVxuICAgPj4+IGxpc3Qoa2V5cylcbiAgIFtcJ3NwYW1cJywgXCdiYWNvblwnXVxuXG4gICA+Pj4gIyBzZXQgb3BlcmF0aW9uc1xuICAgPj4+IGtleXMgJiB7XCdlZ2dzXCcsIFwnYmFjb25cJywgXCdzYWxhZFwnfVxuICAge1wnYmFjb25cJ31cbicsCisgJ3R5cGVzbWV0aG9kcyc6ICdcbk1ldGhvZHNcbioqKioqKipcblxuTWV0aG9kcyBhcmUgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB1c2luZyB0aGUgYXR0cmlidXRlIG5vdGF0aW9uLlxuVGhlcmUgYXJlIHR3byBmbGF2b3JzOiBidWlsdC1pbiBtZXRob2RzIChzdWNoIGFzIGBgYXBwZW5kKClgYCBvblxubGlzdHMpIGFuZCBjbGFzcyBpbnN0YW5jZSBtZXRob2RzLiAgQnVpbHQtaW4gbWV0aG9kcyBhcmUgZGVzY3JpYmVkXG53aXRoIHRoZSB0eXBlcyB0aGF0IHN1cHBvcnQgdGhlbS5cblxuVGhlIGltcGxlbWVudGF0aW9uIGFkZHMgdHdvIHNwZWNpYWwgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgdG8gY2xhc3Ncbmluc3RhbmNlIG1ldGhvZHM6IGBgbS5pbV9zZWxmYGAgaXMgdGhlIG9iamVjdCBvbiB3aGljaCB0aGUgbWV0aG9kXG5vcGVyYXRlcywgYW5kIGBgbS5pbV9mdW5jYGAgaXMgdGhlIGZ1bmN0aW9uIGltcGxlbWVudGluZyB0aGUgbWV0aG9kLlxuQ2FsbGluZyBgYG0oYXJnLTEsIGFyZy0yLCAuLi4sIGFyZy1uKWBgIGlzIGNvbXBsZXRlbHkgZXF1aXZhbGVudCB0b1xuY2FsbGluZyBgYG0uaW1fZnVuYyhtLmltX3NlbGYsIGFyZy0xLCBhcmctMiwgLi4uLCBhcmctbilgYC5cblxuQ2xhc3MgaW5zdGFuY2UgbWV0aG9kcyBhcmUgZWl0aGVyICpib3VuZCogb3IgKnVuYm91bmQqLCByZWZlcnJpbmcgdG9cbndoZXRoZXIgdGhlIG1ldGhvZCB3YXMgYWNjZXNzZWQgdGhyb3VnaCBhbiBpbnN0YW5jZSBvciBhIGNsYXNzLFxucmVzcGVjdGl2ZWx5LiAgV2hlbiBhIG1ldGhvZCBpcyB1bmJvdW5kLCBpdHMgYGBpbV9zZWxmYGAgYXR0cmlidXRlXG53aWxsIGJlIGBgTm9uZWBgIGFuZCBpZiBjYWxsZWQsIGFuIGV4cGxpY2l0IGBgc2VsZmBgIG9iamVjdCBtdXN0IGJlXG5wYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50LiAgSW4gdGhpcyBjYXNlLCBgYHNlbGZgYCBtdXN0IGJlIGFuXG5pbnN0YW5jZSBvZiB0aGUgdW5ib3VuZCBtZXRob2RcJ3MgY2xhc3MgKG9yIGEgc3ViY2xhc3Mgb2YgdGhhdCBjbGFzcyksXG5vdGhlcndpc2UgYSBgYFR5cGVFcnJvcmBgIGlzIHJhaXNlZC5cblxuTGlrZSBmdW5jdGlvbiBvYmplY3RzLCBtZXRob2RzIG9iamVjdHMgc3VwcG9ydCBnZXR0aW5nIGFyYml0cmFyeVxuYXR0cmlidXRlcy4gSG93ZXZlciwgc2luY2UgbWV0aG9kIGF0dHJpYnV0ZXMgYXJlIGFjdHVhbGx5IHN0b3JlZCBvblxudGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0IChgYG1ldGguaW1fZnVuY2BgKSwgc2V0dGluZyBtZXRob2RcbmF0dHJpYnV0ZXMgb24gZWl0aGVyIGJvdW5kIG9yIHVuYm91bmQgbWV0aG9kcyBpcyBkaXNhbGxvd2VkLlxuQXR0ZW1wdGluZyB0byBzZXQgYW4gYXR0cmlidXRlIG9uIGEgbWV0aG9kIHJlc3VsdHMgaW4gYW5cbmBgQXR0cmlidXRlRXJyb3JgYCBiZWluZyByYWlzZWQuICBJbiBvcmRlciB0byBzZXQgYSBtZXRob2QgYXR0cmlidXRlLFxueW91IG5lZWQgdG8gZXhwbGljaXRseSBzZXQgaXQgb24gdGhlIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0OlxuXG4gICA+Pj4gY2xhc3MgQzpcbiAgIC4uLiAgICAgZGVmIG1ldGhvZChzZWxmKTpcbiAgIC4uLiAgICAgICAgIHBhc3NcbiAgIC4uLlxuICAgPj4+IGMgPSBDKClcbiAgID4+PiBjLm1ldGhvZC53aG9hbWkgPSBcJ215IG5hbWUgaXMgbWV0aG9kXCcgICMgY2FuXCd0IHNldCBvbiB0aGUgbWV0aG9kXG4gICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4gICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+XG4gICBBdHRyaWJ1dGVFcnJvcjogXCdpbnN0YW5jZW1ldGhvZFwnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlIFwnd2hvYW1pXCdcbiAgID4+PiBjLm1ldGhvZC5pbV9mdW5jLndob2FtaSA9IFwnbXkgbmFtZSBpcyBtZXRob2RcJ1xuICAgPj4+IGMubWV0aG9kLndob2FtaVxuICAgXCdteSBuYW1lIGlzIG1ldGhvZFwnXG5cblNlZSAqVGhlIHN0YW5kYXJkIHR5cGUgaGllcmFyY2h5KiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicsCisgJ3R5cGVzbW9kdWxlcyc6ICJcbk1vZHVsZXNcbioqKioqKipcblxuVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczpcbmBgbS5uYW1lYGAsIHdoZXJlICptKiBpcyBhIG1vZHVsZSBhbmQgKm5hbWUqIGFjY2Vzc2VzIGEgbmFtZSBkZWZpbmVkXG5pbiAqbSoncyBzeW1ib2wgdGFibGUuIE1vZHVsZSBhdHRyaWJ1dGVzIGNhbiBiZSBhc3NpZ25lZCB0by4gIChOb3RlXG50aGF0IHRoZSBgYGltcG9ydGBgIHN0YXRlbWVudCBpcyBub3QsIHN0cmljdGx5IHNwZWFraW5nLCBhbiBvcGVyYXRpb25cbm9uIGEgbW9kdWxlIG9iamVjdDsgYGBpbXBvcnQgZm9vYGAgZG9lcyBub3QgcmVxdWlyZSBhIG1vZHVsZSBvYmplY3Rcbm5hbWVkICpmb28qIHRvIGV4aXN0LCByYXRoZXIgaXQgcmVxdWlyZXMgYW4gKGV4dGVybmFsKSAqZGVmaW5pdGlvbipcbmZvciBhIG1vZHVsZSBuYW1lZCAqZm9vKiBzb21ld2hlcmUuKVxuXG5BIHNwZWNpYWwgYXR0cmlidXRlIG9mIGV2ZXJ5IG1vZHVsZSBpcyBgYF9fZGljdF9fYGAuIFRoaXMgaXMgdGhlXG5kaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1vZHVsZSdzIHN5bWJvbCB0YWJsZS4gTW9kaWZ5aW5nIHRoaXNcbmRpY3Rpb25hcnkgd2lsbCBhY3R1YWxseSBjaGFuZ2UgdGhlIG1vZHVsZSdzIHN5bWJvbCB0YWJsZSwgYnV0IGRpcmVjdFxuYXNzaWdubWVudCB0byB0aGUgYGBfX2RpY3RfX2BgIGF0dHJpYnV0ZSBpcyBub3QgcG9zc2libGUgKHlvdSBjYW5cbndyaXRlIGBgbS5fX2RpY3RfX1snYSddID0gMWBgLCB3aGljaCBkZWZpbmVzIGBgbS5hYGAgdG8gYmUgYGAxYGAsIGJ1dFxueW91IGNhbid0IHdyaXRlIGBgbS5fX2RpY3RfXyA9IHt9YGApLiAgTW9kaWZ5aW5nIGBgX19kaWN0X19gYCBkaXJlY3RseVxuaXMgbm90IHJlY29tbWVuZGVkLlxuXG5Nb2R1bGVzIGJ1aWx0IGludG8gdGhlIGludGVycHJldGVyIGFyZSB3cml0dGVuIGxpa2UgdGhpczogYGA8bW9kdWxlXG4nc3lzJyAoYnVpbHQtaW4pPmBgLiAgSWYgbG9hZGVkIGZyb20gYSBmaWxlLCB0aGV5IGFyZSB3cml0dGVuIGFzXG5gYDxtb2R1bGUgJ29zJyBmcm9tICcvdXNyL2xvY2FsL2xpYi9weXRob25YLlkvb3MucHljJz5gYC5cbiIsCisgJ3R5cGVzc2VxJzogJ1xuU2VxdWVuY2UgVHlwZXMgLS0tIGBgc3RyYGAsIGBgdW5pY29kZWBgLCBgYGxpc3RgYCwgYGB0dXBsZWBgLCBgYGJ5dGVhcnJheWBgLCBgYGJ1ZmZlcmBgLCBgYHhyYW5nZWBgXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuVGhlcmUgYXJlIHNldmVuIHNlcXVlbmNlIHR5cGVzOiBzdHJpbmdzLCBVbmljb2RlIHN0cmluZ3MsIGxpc3RzLFxudHVwbGVzLCBieXRlYXJyYXlzLCBidWZmZXJzLCBhbmQgeHJhbmdlIG9iamVjdHMuXG5cbkZvciBvdGhlciBjb250YWluZXJzIHNlZSB0aGUgYnVpbHQgaW4gYGBkaWN0YGAgYW5kIGBgc2V0YGAgY2xhc3NlcyxcbmFuZCB0aGUgYGBjb2xsZWN0aW9uc2BgIG1vZHVsZS5cblxuU3RyaW5nIGxpdGVyYWxzIGFyZSB3cml0dGVuIGluIHNpbmdsZSBvciBkb3VibGUgcXVvdGVzOiBgYFwneHl6enlcJ2BgLFxuYGAiZnJvYm96eiJgYC4gIFNlZSAqU3RyaW5nIGxpdGVyYWxzKiBmb3IgbW9yZSBhYm91dCBzdHJpbmcgbGl0ZXJhbHMuXG5Vbmljb2RlIHN0cmluZ3MgYXJlIG11Y2ggbGlrZSBzdHJpbmdzLCBidXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgc3ludGF4XG51c2luZyBhIHByZWNlZGluZyBgYFwndVwnYGAgY2hhcmFjdGVyOiBgYHVcJ2FiY1wnYGAsIGBgdSJkZWYiYGAuIEluXG5hZGRpdGlvbiB0byB0aGUgZnVuY3Rpb25hbGl0eSBkZXNjcmliZWQgaGVyZSwgdGhlcmUgYXJlIGFsc28gc3RyaW5nLVxuc3BlY2lmaWMgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlICpTdHJpbmcgTWV0aG9kcyogc2VjdGlvbi4gTGlzdHMgYXJlXG5jb25zdHJ1Y3RlZCB3aXRoIHNxdWFyZSBicmFja2V0cywgc2VwYXJhdGluZyBpdGVtcyB3aXRoIGNvbW1hczogYGBbYSxcbmIsIGNdYGAuIFR1cGxlcyBhcmUgY29uc3RydWN0ZWQgYnkgdGhlIGNvbW1hIG9wZXJhdG9yIChub3Qgd2l0aGluXG5zcXVhcmUgYnJhY2tldHMpLCB3aXRoIG9yIHdpdGhvdXQgZW5jbG9zaW5nIHBhcmVudGhlc2VzLCBidXQgYW4gZW1wdHlcbnR1cGxlIG11c3QgaGF2ZSB0aGUgZW5jbG9zaW5nIHBhcmVudGhlc2VzLCBzdWNoIGFzIGBgYSwgYiwgY2BgIG9yXG5gYCgpYGAuICBBIHNpbmdsZSBpdGVtIHR1cGxlIG11c3QgaGF2ZSBhIHRyYWlsaW5nIGNvbW1hLCBzdWNoIGFzXG5gYChkLClgYC5cblxuQnl0ZWFycmF5IG9iamVjdHMgYXJlIGNyZWF0ZWQgd2l0aCB0aGUgYnVpbHQtaW4gZnVuY3Rpb25cbmBgYnl0ZWFycmF5KClgYC5cblxuQnVmZmVyIG9iamVjdHMgYXJlIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgUHl0aG9uIHN5bnRheCwgYnV0IGNhbiBiZVxuY3JlYXRlZCBieSBjYWxsaW5nIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBgYGJ1ZmZlcigpYGAuICBUaGV5IGRvblwndFxuc3VwcG9ydCBjb25jYXRlbmF0aW9uIG9yIHJlcGV0aXRpb24uXG5cbk9iamVjdHMgb2YgdHlwZSB4cmFuZ2UgYXJlIHNpbWlsYXIgdG8gYnVmZmVycyBpbiB0aGF0IHRoZXJlIGlzIG5vXG5zcGVjaWZpYyBzeW50YXggdG8gY3JlYXRlIHRoZW0sIGJ1dCB0aGV5IGFyZSBjcmVhdGVkIHVzaW5nIHRoZVxuYGB4cmFuZ2UoKWBgIGZ1bmN0aW9uLiAgVGhleSBkb25cJ3Qgc3VwcG9ydCBzbGljaW5nLCBjb25jYXRlbmF0aW9uIG9yXG5yZXBldGl0aW9uLCBhbmQgdXNpbmcgYGBpbmBgLCBgYG5vdCBpbmBgLCBgYG1pbigpYGAgb3IgYGBtYXgoKWBgIG9uXG50aGVtIGlzIGluZWZmaWNpZW50LlxuXG5Nb3N0IHNlcXVlbmNlIHR5cGVzIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcGVyYXRpb25zLiAgVGhlIGBgaW5gYCBhbmRcbmBgbm90IGluYGAgb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXRpZXMgYXMgdGhlIGNvbXBhcmlzb25cbm9wZXJhdGlvbnMuICBUaGUgYGArYGAgYW5kIGBgKmBgIG9wZXJhdGlvbnMgaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSBhc1xudGhlIGNvcnJlc3BvbmRpbmcgbnVtZXJpYyBvcGVyYXRpb25zLiBbM10gQWRkaXRpb25hbCBtZXRob2RzIGFyZVxucHJvdmlkZWQgZm9yICpNdXRhYmxlIFNlcXVlbmNlIFR5cGVzKi5cblxuVGhpcyB0YWJsZSBsaXN0cyB0aGUgc2VxdWVuY2Ugb3BlcmF0aW9ucyBzb3J0ZWQgaW4gYXNjZW5kaW5nIHByaW9yaXR5XG4ob3BlcmF0aW9ucyBpbiB0aGUgc2FtZSBib3ggaGF2ZSB0aGUgc2FtZSBwcmlvcml0eSkuICBJbiB0aGUgdGFibGUsXG4qcyogYW5kICp0KiBhcmUgc2VxdWVuY2VzIG9mIHRoZSBzYW1lIHR5cGU7ICpuKiwgKmkqIGFuZCAqaiogYXJlXG5pbnRlZ2VyczpcblxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09K1xufCBgYHggaW4gc2BgICAgICAgICAgfCBgYFRydWVgYCBpZiBhbiBpdGVtIG9mICpzKiBpcyAgICB8ICgxKSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgYGBGYWxzZWBgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHggbm90IGluIHNgYCAgICAgfCBgYEZhbHNlYGAgaWYgYW4gaXRlbSBvZiAqcyogaXMgICB8ICgxKSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgfCBlcXVhbCB0byAqeCosIGVsc2UgYGBUcnVlYGAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHMgKyB0YGAgICAgICAgICAgfCB0aGUgY29uY2F0ZW5hdGlvbiBvZiAqcyogYW5kICp0KiB8ICg2KSAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHMgKiBuLCBuICogc2BgICAgfCAqbiogc2hhbGxvdyBjb3BpZXMgb2YgKnMqICAgICAgICB8ICgyKSAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgfCBjb25jYXRlbmF0ZWQgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHNbaV1gYCAgICAgICAgICAgfCAqaSp0aCBpdGVtIG9mICpzKiwgb3JpZ2luIDAgICAgICB8ICgzKSAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqXWBgICAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg0KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHNbaTpqOmtdYGAgICAgICAgfCBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqICAgICB8ICgzKSg1KSAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgfCB3aXRoIHN0ZXAgKmsqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYGxlbihzKWBgICAgICAgICAgfCBsZW5ndGggb2YgKnMqICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYG1pbihzKWBgICAgICAgICAgfCBzbWFsbGVzdCBpdGVtIG9mICpzKiAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYG1heChzKWBgICAgICAgICAgfCBsYXJnZXN0IGl0ZW0gb2YgKnMqICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHMuaW5kZXgoaSlgYCAgICAgfCBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mICB8ICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgfCAqaSogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xufCBgYHMuY291bnQoaSlgYCAgICAgfCB0b3RhbCBudW1iZXIgb2Ygb2NjdXJlbmNlcyBvZiAgICB8ICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgfCAqaSogaW4gKnMqICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tK1xuXG5TZXF1ZW5jZSB0eXBlcyBhbHNvIHN1cHBvcnQgY29tcGFyaXNvbnMuIEluIHBhcnRpY3VsYXIsIHR1cGxlcyBhbmRcbmxpc3RzIGFyZSBjb21wYXJlZCBsZXhpY29ncmFwaGljYWxseSBieSBjb21wYXJpbmcgY29ycmVzcG9uZGluZ1xuZWxlbWVudHMuIFRoaXMgbWVhbnMgdGhhdCB0byBjb21wYXJlIGVxdWFsLCBldmVyeSBlbGVtZW50IG11c3QgY29tcGFyZVxuZXF1YWwgYW5kIHRoZSB0d28gc2VxdWVuY2VzIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgaGF2ZSB0aGUgc2FtZVxubGVuZ3RoLiAoRm9yIGZ1bGwgZGV0YWlscyBzZWUgKkNvbXBhcmlzb25zKiBpbiB0aGUgbGFuZ3VhZ2VcbnJlZmVyZW5jZS4pXG5cbk5vdGVzOlxuXG4xLiBXaGVuICpzKiBpcyBhIHN0cmluZyBvciBVbmljb2RlIHN0cmluZyBvYmplY3QgdGhlIGBgaW5gYCBhbmQgYGBub3RcbiAgIGluYGAgb3BlcmF0aW9ucyBhY3QgbGlrZSBhIHN1YnN0cmluZyB0ZXN0LiAgSW4gUHl0aG9uIHZlcnNpb25zXG4gICBiZWZvcmUgMi4zLCAqeCogaGFkIHRvIGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAxLiBJbiBQeXRob24gMi4zIGFuZFxuICAgYmV5b25kLCAqeCogbWF5IGJlIGEgc3RyaW5nIG9mIGFueSBsZW5ndGguXG5cbjIuIFZhbHVlcyBvZiAqbiogbGVzcyB0aGFuIGBgMGBgIGFyZSB0cmVhdGVkIGFzIGBgMGBgICh3aGljaCB5aWVsZHMgYW5cbiAgIGVtcHR5IHNlcXVlbmNlIG9mIHRoZSBzYW1lIHR5cGUgYXMgKnMqKS4gIE5vdGUgYWxzbyB0aGF0IHRoZSBjb3BpZXNcbiAgIGFyZSBzaGFsbG93OyBuZXN0ZWQgc3RydWN0dXJlcyBhcmUgbm90IGNvcGllZC4gIFRoaXMgb2Z0ZW4gaGF1bnRzXG4gICBuZXcgUHl0aG9uIHByb2dyYW1tZXJzOyBjb25zaWRlcjpcblxuICAgPj4+IGxpc3RzID0gW1tdXSAqIDNcbiAgID4+PiBsaXN0c1xuICAgW1tdLCBbXSwgW11dXG4gICA+Pj4gbGlzdHNbMF0uYXBwZW5kKDMpXG4gICA+Pj4gbGlzdHNcbiAgIFtbM10sIFszXSwgWzNdXVxuXG4gICBXaGF0IGhhcyBoYXBwZW5lZCBpcyB0aGF0IGBgW1tdXWBgIGlzIGEgb25lLWVsZW1lbnQgbGlzdCBjb250YWluaW5nXG4gICBhbiBlbXB0eSBsaXN0LCBzbyBhbGwgdGhyZWUgZWxlbWVudHMgb2YgYGBbW11dICogM2BgIGFyZSAocG9pbnRlcnNcbiAgIHRvKSB0aGlzIHNpbmdsZSBlbXB0eSBsaXN0LiAgTW9kaWZ5aW5nIGFueSBvZiB0aGUgZWxlbWVudHMgb2ZcbiAgIGBgbGlzdHNgYCBtb2RpZmllcyB0aGlzIHNpbmdsZSBsaXN0LiBZb3UgY2FuIGNyZWF0ZSBhIGxpc3Qgb2ZcbiAgIGRpZmZlcmVudCBsaXN0cyB0aGlzIHdheTpcblxuICAgPj4+IGxpc3RzID0gW1tdIGZvciBpIGluIHJhbmdlKDMpXVxuICAgPj4+IGxpc3RzWzBdLmFwcGVuZCgzKVxuICAgPj4+IGxpc3RzWzFdLmFwcGVuZCg1KVxuICAgPj4+IGxpc3RzWzJdLmFwcGVuZCg3KVxuICAgPj4+IGxpc3RzXG4gICBbWzNdLCBbNV0sIFs3XV1cblxuMy4gSWYgKmkqIG9yICpqKiBpcyBuZWdhdGl2ZSwgdGhlIGluZGV4IGlzIHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlXG4gICBzdHJpbmc6IGBgbGVuKHMpICsgaWBgIG9yIGBgbGVuKHMpICsgamBgIGlzIHN1YnN0aXR1dGVkLiAgQnV0IG5vdGVcbiAgIHRoYXQgYGAtMGBgIGlzIHN0aWxsIGBgMGBgLlxuXG40LiBUaGUgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyBkZWZpbmVkIGFzIHRoZSBzZXF1ZW5jZSBvZlxuICAgaXRlbXMgd2l0aCBpbmRleCAqayogc3VjaCB0aGF0IGBgaSA8PSBrIDwgamBgLiAgSWYgKmkqIG9yICpqKiBpc1xuICAgZ3JlYXRlciB0aGFuIGBgbGVuKHMpYGAsIHVzZSBgYGxlbihzKWBgLiAgSWYgKmkqIGlzIG9taXR0ZWQgb3JcbiAgIGBgTm9uZWBgLCB1c2UgYGAwYGAuICBJZiAqaiogaXMgb21pdHRlZCBvciBgYE5vbmVgYCwgdXNlXG4gICBgYGxlbihzKWBgLiAgSWYgKmkqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAqaiosIHRoZSBzbGljZSBpc1xuICAgZW1wdHkuXG5cbjUuIFRoZSBzbGljZSBvZiAqcyogZnJvbSAqaSogdG8gKmoqIHdpdGggc3RlcCAqayogaXMgZGVmaW5lZCBhcyB0aGVcbiAgIHNlcXVlbmNlIG9mIGl0ZW1zIHdpdGggaW5kZXggIGBgeCA9IGkgKyBuKmtgYCBzdWNoIHRoYXQgYGAwIDw9IG4gPFxuICAgKGotaSkva2BgLiAgSW4gb3RoZXIgd29yZHMsIHRoZSBpbmRpY2VzIGFyZSBgYGlgYCwgYGBpK2tgYCxcbiAgIGBgaSsyKmtgYCwgYGBpKzMqa2BgIGFuZCBzbyBvbiwgc3RvcHBpbmcgd2hlbiAqaiogaXMgcmVhY2hlZCAoYnV0XG4gICBuZXZlciBpbmNsdWRpbmcgKmoqKS4gIElmICppKiBvciAqaiogaXMgZ3JlYXRlciB0aGFuIGBgbGVuKHMpYGAsXG4gICB1c2UgYGBsZW4ocylgYC4gIElmICppKiBvciAqaiogYXJlIG9taXR0ZWQgb3IgYGBOb25lYGAsIHRoZXkgYmVjb21lXG4gICAiZW5kIiB2YWx1ZXMgKHdoaWNoIGVuZCBkZXBlbmRzIG9uIHRoZSBzaWduIG9mICprKikuICBOb3RlLCAqaypcbiAgIGNhbm5vdCBiZSB6ZXJvLiBJZiAqayogaXMgYGBOb25lYGAsIGl0IGlzIHRyZWF0ZWQgbGlrZSBgYDFgYC5cblxuNi4gKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBJZiAqcyogYW5kICp0KiBhcmUgYm90aCBzdHJpbmdzLFxuICAgc29tZSBQeXRob24gaW1wbGVtZW50YXRpb25zIHN1Y2ggYXMgQ1B5dGhvbiBjYW4gdXN1YWxseSBwZXJmb3JtIGFuXG4gICBpbi1wbGFjZSBvcHRpbWl6YXRpb24gZm9yIGFzc2lnbm1lbnRzIG9mIHRoZSBmb3JtIGBgcyA9IHMgKyB0YGAgb3JcbiAgIGBgcyArPSB0YGAuICBXaGVuIGFwcGxpY2FibGUsIHRoaXMgb3B0aW1pemF0aW9uIG1ha2VzIHF1YWRyYXRpY1xuICAgcnVuLXRpbWUgbXVjaCBsZXNzIGxpa2VseS4gIFRoaXMgb3B0aW1pemF0aW9uIGlzIGJvdGggdmVyc2lvbiBhbmRcbiAgIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gIEZvciBwZXJmb3JtYW5jZSBzZW5zaXRpdmUgY29kZSwgaXQgaXNcbiAgIHByZWZlcmFibGUgdG8gdXNlIHRoZSBgYHN0ci5qb2luKClgYCBtZXRob2Qgd2hpY2ggYXNzdXJlc1xuICAgY29uc2lzdGVudCBsaW5lYXIgY29uY2F0ZW5hdGlvbiBwZXJmb3JtYW5jZSBhY3Jvc3MgdmVyc2lvbnMgYW5kXG4gICBpbXBsZW1lbnRhdGlvbnMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IEZvcm1lcmx5LCBzdHJpbmcgY29uY2F0ZW5hdGlvbiBuZXZlclxuICAgb2NjdXJyZWQgaW4tcGxhY2UuXG5cblxuU3RyaW5nIE1ldGhvZHNcbj09PT09PT09PT09PT09XG5cbkJlbG93IGFyZSBsaXN0ZWQgdGhlIHN0cmluZyBtZXRob2RzIHdoaWNoIGJvdGggOC1iaXQgc3RyaW5ncyBhbmRcblVuaWNvZGUgb2JqZWN0cyBzdXBwb3J0LiAgU29tZSBvZiB0aGVtIGFyZSBhbHNvIGF2YWlsYWJsZSBvblxuYGBieXRlYXJyYXlgYCBvYmplY3RzLlxuXG5JbiBhZGRpdGlvbiwgUHl0aG9uXCdzIHN0cmluZ3Mgc3VwcG9ydCB0aGUgc2VxdWVuY2UgdHlwZSBtZXRob2RzXG5kZXNjcmliZWQgaW4gdGhlICpTZXF1ZW5jZSBUeXBlcyAtLS0gc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZSxcbmJ5dGVhcnJheSwgYnVmZmVyLCB4cmFuZ2UqIHNlY3Rpb24uIFRvIG91dHB1dCBmb3JtYXR0ZWQgc3RyaW5ncyB1c2VcbnRlbXBsYXRlIHN0cmluZ3Mgb3IgdGhlIGBgJWBgIG9wZXJhdG9yIGRlc2NyaWJlZCBpbiB0aGUgKlN0cmluZ1xuRm9ybWF0dGluZyBPcGVyYXRpb25zKiBzZWN0aW9uLiBBbHNvLCBzZWUgdGhlIGBgcmVgYCBtb2R1bGUgZm9yIHN0cmluZ1xuZnVuY3Rpb25zIGJhc2VkIG9uIHJlZ3VsYXIgZXhwcmVzc2lvbnMuXG5cbnN0ci5jYXBpdGFsaXplKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggaXRzIGZpcnN0IGNoYXJhY3RlciBjYXBpdGFsaXplZFxuICAgYW5kIHRoZSByZXN0IGxvd2VyY2FzZWQuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuY2VudGVyKHdpZHRoWywgZmlsbGNoYXJdKVxuXG4gICBSZXR1cm4gY2VudGVyZWQgaW4gYSBzdHJpbmcgb2YgbGVuZ3RoICp3aWR0aCouIFBhZGRpbmcgaXMgZG9uZVxuICAgdXNpbmcgdGhlIHNwZWNpZmllZCAqZmlsbGNoYXIqIChkZWZhdWx0IGlzIGEgc3BhY2UpLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLmNvdW50KHN1YlssIHN0YXJ0WywgZW5kXV0pXG5cbiAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcgKnN1YipcbiAgIGluIHRoZSByYW5nZSBbKnN0YXJ0KiwgKmVuZCpdLiAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kXG4gICAqZW5kKiBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uXG5cbnN0ci5kZWNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pXG5cbiAgIERlY29kZXMgdGhlIHN0cmluZyB1c2luZyB0aGUgY29kZWMgcmVnaXN0ZXJlZCBmb3IgKmVuY29kaW5nKi5cbiAgICplbmNvZGluZyogZGVmYXVsdHMgdG8gdGhlIGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5XG4gICBiZSBnaXZlbiB0byBzZXQgYSBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgaXNcbiAgIGBgXCdzdHJpY3RcJ2BgLCBtZWFuaW5nIHRoYXQgZW5jb2RpbmcgZXJyb3JzIHJhaXNlIGBgVW5pY29kZUVycm9yYGAuXG4gICBPdGhlciBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBgXCdpZ25vcmVcJ2BgLCBgYFwncmVwbGFjZVwnYGAgYW5kIGFueSBvdGhlclxuICAgbmFtZSByZWdpc3RlcmVkIHZpYSBgYGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigpYGAsIHNlZSBzZWN0aW9uICpDb2RlY1xuICAgQmFzZSBDbGFzc2VzKi5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBvdGhlciBlcnJvciBoYW5kbGluZyBzY2hlbWVzXG4gICBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmNvZGUoW2VuY29kaW5nWywgZXJyb3JzXV0pXG5cbiAgIFJldHVybiBhbiBlbmNvZGVkIHZlcnNpb24gb2YgdGhlIHN0cmluZy4gIERlZmF1bHQgZW5jb2RpbmcgaXMgdGhlXG4gICBjdXJyZW50IGRlZmF1bHQgc3RyaW5nIGVuY29kaW5nLiAgKmVycm9ycyogbWF5IGJlIGdpdmVuIHRvIHNldCBhXG4gICBkaWZmZXJlbnQgZXJyb3IgaGFuZGxpbmcgc2NoZW1lLiAgVGhlIGRlZmF1bHQgZm9yICplcnJvcnMqIGlzXG4gICBgYFwnc3RyaWN0XCdgYCwgbWVhbmluZyB0aGF0IGVuY29kaW5nIGVycm9ycyByYWlzZSBhXG4gICBgYFVuaWNvZGVFcnJvcmBgLiAgT3RoZXIgcG9zc2libGUgdmFsdWVzIGFyZSBgYFwnaWdub3JlXCdgYCxcbiAgIGBgXCdyZXBsYWNlXCdgYCwgYGBcJ3htbGNoYXJyZWZyZXBsYWNlXCdgYCwgYGBcJ2JhY2tzbGFzaHJlcGxhY2VcJ2BgIGFuZFxuICAgYW55IG90aGVyIG5hbWUgcmVnaXN0ZXJlZCB2aWEgYGBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoKWBgLCBzZWVcbiAgIHNlY3Rpb24gKkNvZGVjIEJhc2UgQ2xhc3NlcyouIEZvciBhIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLCBzZWVcbiAgIHNlY3Rpb24gKlN0YW5kYXJkIEVuY29kaW5ncyouXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuMC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGBcJ3htbGNoYXJyZWZyZXBsYWNlXCdgYCBhbmRcbiAgIGBgXCdiYWNrc2xhc2hyZXBsYWNlXCdgYCBhbmQgb3RoZXIgZXJyb3IgaGFuZGxpbmcgc2NoZW1lcyBhZGRlZC5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3Iga2V5d29yZCBhcmd1bWVudHMgYWRkZWQuXG5cbnN0ci5lbmRzd2l0aChzdWZmaXhbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlIHN0cmluZyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCAqc3VmZml4KixcbiAgIG90aGVyd2lzZSByZXR1cm4gYGBGYWxzZWBgLiAgKnN1ZmZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZlxuICAgc3VmZml4ZXMgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3QgYmVnaW5uaW5nIGF0XG4gICB0aGF0IHBvc2l0aW9uLiAgV2l0aCBvcHRpb25hbCAqZW5kKiwgc3RvcCBjb21wYXJpbmcgYXQgdGhhdFxuICAgcG9zaXRpb24uXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjU6IEFjY2VwdCB0dXBsZXMgYXMgKnN1ZmZpeCouXG5cbnN0ci5leHBhbmR0YWJzKFt0YWJzaXplXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCB0YWIgY2hhcmFjdGVycyBhcmUgcmVwbGFjZWRcbiAgIGJ5IG9uZSBvciBtb3JlIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiBhbmQgdGhlXG4gICBnaXZlbiB0YWIgc2l6ZS4gIFRhYiBwb3NpdGlvbnMgb2NjdXIgZXZlcnkgKnRhYnNpemUqIGNoYXJhY3RlcnNcbiAgIChkZWZhdWx0IGlzIDgsIGdpdmluZyB0YWIgcG9zaXRpb25zIGF0IGNvbHVtbnMgMCwgOCwgMTYgYW5kIHNvIG9uKS5cbiAgIFRvIGV4cGFuZCB0aGUgc3RyaW5nLCB0aGUgY3VycmVudCBjb2x1bW4gaXMgc2V0IHRvIHplcm8gYW5kIHRoZVxuICAgc3RyaW5nIGlzIGV4YW1pbmVkIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuICBJZiB0aGUgY2hhcmFjdGVyIGlzIGFcbiAgIHRhYiAoYGBcXHRgYCksIG9uZSBvciBtb3JlIHNwYWNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkIGluIHRoZVxuICAgcmVzdWx0IHVudGlsIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBlcXVhbCB0byB0aGUgbmV4dCB0YWIgcG9zaXRpb24uXG4gICAoVGhlIHRhYiBjaGFyYWN0ZXIgaXRzZWxmIGlzIG5vdCBjb3BpZWQuKSAgSWYgdGhlIGNoYXJhY3RlciBpcyBhXG4gICBuZXdsaW5lIChgYFxcbmBgKSBvciByZXR1cm4gKGBgXFxyYGApLCBpdCBpcyBjb3BpZWQgYW5kIHRoZSBjdXJyZW50XG4gICBjb2x1bW4gaXMgcmVzZXQgdG8gemVyby4gIEFueSBvdGhlciBjaGFyYWN0ZXIgaXMgY29waWVkIHVuY2hhbmdlZFxuICAgYW5kIHRoZSBjdXJyZW50IGNvbHVtbiBpcyBpbmNyZW1lbnRlZCBieSBvbmUgcmVnYXJkbGVzcyBvZiBob3cgdGhlXG4gICBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgd2hlbiBwcmludGVkLlxuXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoKVxuICAgXCcwMSAgICAgIDAxMiAgICAgMDEyMyAgICAwMTIzNFwnXG4gICA+Pj4gXCcwMVxcdDAxMlxcdDAxMjNcXHQwMTIzNFwnLmV4cGFuZHRhYnMoNClcbiAgIFwnMDEgIDAxMiAwMTIzICAgIDAxMjM0XCdcblxuc3RyLmZpbmQoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIHRoZSBsb3dlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIGluIHRoZSBzbGljZSBgYHNbc3RhcnQ6ZW5kXWBgLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gYGAtMWBgIGlmICpzdWIqIGlzIG5vdCBmb3VuZC5cblxuICAgTm90ZTogVGhlIGBgZmluZCgpYGAgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgaWYgeW91IG5lZWQgdG8ga25vdyB0aGVcbiAgICAgcG9zaXRpb24gb2YgKnN1YiouICBUbyBjaGVjayBpZiAqc3ViKiBpcyBhIHN1YnN0cmluZyBvciBub3QsIHVzZVxuICAgICB0aGUgYGBpbmBgIG9wZXJhdG9yOlxuXG4gICAgICAgID4+PiBcJ1B5XCcgaW4gXCdQeXRob25cJ1xuICAgICAgICBUcnVlXG5cbnN0ci5mb3JtYXQoKmFyZ3MsICoqa3dhcmdzKVxuXG4gICBQZXJmb3JtIGEgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgVGhlIHN0cmluZyBvbiB3aGljaCB0aGlzXG4gICBtZXRob2QgaXMgY2FsbGVkIGNhbiBjb250YWluIGxpdGVyYWwgdGV4dCBvciByZXBsYWNlbWVudCBmaWVsZHNcbiAgIGRlbGltaXRlZCBieSBicmFjZXMgYGB7fWBgLiAgRWFjaCByZXBsYWNlbWVudCBmaWVsZCBjb250YWlucyBlaXRoZXJcbiAgIHRoZSBudW1lcmljIGluZGV4IG9mIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgb3IgdGhlIG5hbWUgb2YgYVxuICAga2V5d29yZCBhcmd1bWVudC4gIFJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2hlcmUgZWFjaFxuICAgcmVwbGFjZW1lbnQgZmllbGQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZVxuICAgY29ycmVzcG9uZGluZyBhcmd1bWVudC5cblxuICAgPj4+ICJUaGUgc3VtIG9mIDEgKyAyIGlzIHswfSIuZm9ybWF0KDErMilcbiAgIFwnVGhlIHN1bSBvZiAxICsgMiBpcyAzXCdcblxuICAgU2VlICpGb3JtYXQgU3RyaW5nIFN5bnRheCogZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHZhcmlvdXNcbiAgIGZvcm1hdHRpbmcgb3B0aW9ucyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQgaW4gZm9ybWF0IHN0cmluZ3MuXG5cbiAgIFRoaXMgbWV0aG9kIG9mIHN0cmluZyBmb3JtYXR0aW5nIGlzIHRoZSBuZXcgc3RhbmRhcmQgaW4gUHl0aG9uIDMsXG4gICBhbmQgc2hvdWxkIGJlIHByZWZlcnJlZCB0byB0aGUgYGAlYGAgZm9ybWF0dGluZyBkZXNjcmliZWQgaW5cbiAgICpTdHJpbmcgRm9ybWF0dGluZyBPcGVyYXRpb25zKiBpbiBuZXcgY29kZS5cblxuICAgTmV3IGluIHZlcnNpb24gMi42LlxuXG5zdHIuaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYGZpbmQoKWBgLCBidXQgcmFpc2UgYGBWYWx1ZUVycm9yYGAgd2hlbiB0aGUgc3Vic3RyaW5nIGlzIG5vdFxuICAgZm91bmQuXG5cbnN0ci5pc2FsbnVtKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBhcmUgYWxwaGFudW1lcmljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzYWxwaGEoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBhbHBoYWJldGljIGFuZFxuICAgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzZGlnaXQoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGFyZSBkaWdpdHMgYW5kIHRoZXJlIGlzXG4gICBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNsb3dlcigpXG5cbiAgIFJldHVybiB0cnVlIGlmIGFsbCBjYXNlZCBjaGFyYWN0ZXJzIFs0XSBpbiB0aGUgc3RyaW5nIGFyZSBsb3dlcmNhc2VcbiAgIGFuZCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY2FzZWQgY2hhcmFjdGVyLCBmYWxzZSBvdGhlcndpc2UuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuaXNzcGFjZSgpXG5cbiAgIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBvbmx5IHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nXG4gICBhbmQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLmlzdGl0bGUoKVxuXG4gICBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGlzIGEgdGl0bGVjYXNlZCBzdHJpbmcgYW5kIHRoZXJlIGlzIGF0XG4gICBsZWFzdCBvbmUgY2hhcmFjdGVyLCBmb3IgZXhhbXBsZSB1cHBlcmNhc2UgY2hhcmFjdGVycyBtYXkgb25seVxuICAgZm9sbG93IHVuY2FzZWQgY2hhcmFjdGVycyBhbmQgbG93ZXJjYXNlIGNoYXJhY3RlcnMgb25seSBjYXNlZCBvbmVzLlxuICAgUmV0dXJuIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5pc3VwcGVyKClcblxuICAgUmV0dXJuIHRydWUgaWYgYWxsIGNhc2VkIGNoYXJhY3RlcnMgWzRdIGluIHRoZSBzdHJpbmcgYXJlIHVwcGVyY2FzZVxuICAgYW5kIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjYXNlZCBjaGFyYWN0ZXIsIGZhbHNlIG90aGVyd2lzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5qb2luKGl0ZXJhYmxlKVxuXG4gICBSZXR1cm4gYSBzdHJpbmcgd2hpY2ggaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0cmluZ3MgaW4gdGhlXG4gICAqaXRlcmFibGUqICppdGVyYWJsZSouICBUaGUgc2VwYXJhdG9yIGJldHdlZW4gZWxlbWVudHMgaXMgdGhlXG4gICBzdHJpbmcgcHJvdmlkaW5nIHRoaXMgbWV0aG9kLlxuXG5zdHIubGp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIGxlZnQganVzdGlmaWVkIGluIGEgc3RyaW5nIG9mIGxlbmd0aCAqd2lkdGgqLlxuICAgUGFkZGluZyBpcyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgKmZpbGxjaGFyKiAoZGVmYXVsdCBpcyBhXG4gICBzcGFjZSkuICBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLmxvd2VyKClcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggYWxsIHRoZSBjYXNlZCBjaGFyYWN0ZXJzIFs0XVxuICAgY29udmVydGVkIHRvIGxvd2VyY2FzZS5cblxuICAgRm9yIDgtYml0IHN0cmluZ3MsIHRoaXMgbWV0aG9kIGlzIGxvY2FsZS1kZXBlbmRlbnQuXG5cbnN0ci5sc3RyaXAoW2NoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdpdGggbGVhZGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHByZWZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5sc3RyaXAoKVxuICAgXCdzcGFjaW91cyAgIFwnXG4gICA+Pj4gXCd3d3cuZXhhbXBsZS5jb21cJy5sc3RyaXAoXCdjbW93ei5cJylcbiAgIFwnZXhhbXBsZS5jb21cJ1xuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4yLjI6IFN1cHBvcnQgZm9yIHRoZSAqY2hhcnMqIGFyZ3VtZW50LlxuXG5zdHIucGFydGl0aW9uKHNlcClcblxuICAgU3BsaXQgdGhlIHN0cmluZyBhdCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiAqc2VwKiwgYW5kIHJldHVybiBhXG4gICAzLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcnQgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3JcbiAgIGl0c2VsZiwgYW5kIHRoZSBwYXJ0IGFmdGVyIHRoZSBzZXBhcmF0b3IuICBJZiB0aGUgc2VwYXJhdG9yIGlzIG5vdFxuICAgZm91bmQsIHJldHVybiBhIDMtdHVwbGUgY29udGFpbmluZyB0aGUgc3RyaW5nIGl0c2VsZiwgZm9sbG93ZWQgYnlcbiAgIHR3byBlbXB0eSBzdHJpbmdzLlxuXG4gICBOZXcgaW4gdmVyc2lvbiAyLjUuXG5cbnN0ci5yZXBsYWNlKG9sZCwgbmV3WywgY291bnRdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nICpvbGQqXG4gICByZXBsYWNlZCBieSAqbmV3Ki4gIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCAqY291bnQqIGlzIGdpdmVuLCBvbmx5XG4gICB0aGUgZmlyc3QgKmNvdW50KiBvY2N1cnJlbmNlcyBhcmUgcmVwbGFjZWQuXG5cbnN0ci5yZmluZChzdWJbLCBzdGFydFssIGVuZF1dKVxuXG4gICBSZXR1cm4gdGhlIGhpZ2hlc3QgaW5kZXggaW4gdGhlIHN0cmluZyB3aGVyZSBzdWJzdHJpbmcgKnN1YiogaXNcbiAgIGZvdW5kLCBzdWNoIHRoYXQgKnN1YiogaXMgY29udGFpbmVkIHdpdGhpbiBgYHNbc3RhcnQ6ZW5kXWBgLlxuICAgT3B0aW9uYWwgYXJndW1lbnRzICpzdGFydCogYW5kICplbmQqIGFyZSBpbnRlcnByZXRlZCBhcyBpbiBzbGljZVxuICAgbm90YXRpb24uICBSZXR1cm4gYGAtMWBgIG9uIGZhaWx1cmUuXG5cbnN0ci5yaW5kZXgoc3ViWywgc3RhcnRbLCBlbmRdXSlcblxuICAgTGlrZSBgYHJmaW5kKClgYCBidXQgcmFpc2VzIGBgVmFsdWVFcnJvcmBgIHdoZW4gdGhlIHN1YnN0cmluZyAqc3ViKlxuICAgaXMgbm90IGZvdW5kLlxuXG5zdHIucmp1c3Qod2lkdGhbLCBmaWxsY2hhcl0pXG5cbiAgIFJldHVybiB0aGUgc3RyaW5nIHJpZ2h0IGp1c3RpZmllZCBpbiBhIHN0cmluZyBvZiBsZW5ndGggKndpZHRoKi5cbiAgIFBhZGRpbmcgaXMgZG9uZSB1c2luZyB0aGUgc3BlY2lmaWVkICpmaWxsY2hhciogKGRlZmF1bHQgaXMgYVxuICAgc3BhY2UpLiBUaGUgb3JpZ2luYWwgc3RyaW5nIGlzIHJldHVybmVkIGlmICp3aWR0aCogaXMgbGVzcyB0aGFuIG9yXG4gICBlcXVhbCB0byBgYGxlbihzKWBgLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciB0aGUgKmZpbGxjaGFyKiBhcmd1bWVudC5cblxuc3RyLnJwYXJ0aXRpb24oc2VwKVxuXG4gICBTcGxpdCB0aGUgc3RyaW5nIGF0IHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgKnNlcCosIGFuZCByZXR1cm4gYVxuICAgMy10dXBsZSBjb250YWluaW5nIHRoZSBwYXJ0IGJlZm9yZSB0aGUgc2VwYXJhdG9yLCB0aGUgc2VwYXJhdG9yXG4gICBpdHNlbGYsIGFuZCB0aGUgcGFydCBhZnRlciB0aGUgc2VwYXJhdG9yLiAgSWYgdGhlIHNlcGFyYXRvciBpcyBub3RcbiAgIGZvdW5kLCByZXR1cm4gYSAzLXR1cGxlIGNvbnRhaW5pbmcgdHdvIGVtcHR5IHN0cmluZ3MsIGZvbGxvd2VkIGJ5XG4gICB0aGUgc3RyaW5nIGl0c2VsZi5cblxuICAgTmV3IGluIHZlcnNpb24gMi41LlxuXG5zdHIucnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuIElmICptYXhzcGxpdCogaXMgZ2l2ZW4sIGF0IG1vc3QgKm1heHNwbGl0KiBzcGxpdHNcbiAgIGFyZSBkb25lLCB0aGUgKnJpZ2h0bW9zdCogb25lcy4gIElmICpzZXAqIGlzIG5vdCBzcGVjaWZpZWQgb3JcbiAgIGBgTm9uZWBgLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcgaXMgYSBzZXBhcmF0b3IuICBFeGNlcHQgZm9yXG4gICBzcGxpdHRpbmcgZnJvbSB0aGUgcmlnaHQsIGBgcnNwbGl0KClgYCBiZWhhdmVzIGxpa2UgYGBzcGxpdCgpYGBcbiAgIHdoaWNoIGlzIGRlc2NyaWJlZCBpbiBkZXRhaWwgYmVsb3cuXG5cbiAgIE5ldyBpbiB2ZXJzaW9uIDIuNC5cblxuc3RyLnJzdHJpcChbY2hhcnNdKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCB0cmFpbGluZyBjaGFyYWN0ZXJzIHJlbW92ZWQuICBUaGVcbiAgICpjaGFycyogYXJndW1lbnQgaXMgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmVcbiAgIHJlbW92ZWQuICBJZiBvbWl0dGVkIG9yIGBgTm9uZWBgLCB0aGUgKmNoYXJzKiBhcmd1bWVudCBkZWZhdWx0cyB0b1xuICAgcmVtb3Zpbmcgd2hpdGVzcGFjZS4gIFRoZSAqY2hhcnMqIGFyZ3VtZW50IGlzIG5vdCBhIHN1ZmZpeDsgcmF0aGVyLFxuICAgYWxsIGNvbWJpbmF0aW9ucyBvZiBpdHMgdmFsdWVzIGFyZSBzdHJpcHBlZDpcblxuICAgPj4+IFwnICAgc3BhY2lvdXMgICBcJy5yc3RyaXAoKVxuICAgXCcgICBzcGFjaW91c1wnXG4gICA+Pj4gXCdtaXNzaXNzaXBwaVwnLnJzdHJpcChcJ2lwelwnKVxuICAgXCdtaXNzaXNzXCdcblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMi4yOiBTdXBwb3J0IGZvciB0aGUgKmNoYXJzKiBhcmd1bWVudC5cblxuc3RyLnNwbGl0KFtzZXBbLCBtYXhzcGxpdF1dKVxuXG4gICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nLCB1c2luZyAqc2VwKiBhcyB0aGVcbiAgIGRlbGltaXRlciBzdHJpbmcuICBJZiAqbWF4c3BsaXQqIGlzIGdpdmVuLCBhdCBtb3N0ICptYXhzcGxpdCpcbiAgIHNwbGl0cyBhcmUgZG9uZSAodGh1cywgdGhlIGxpc3Qgd2lsbCBoYXZlIGF0IG1vc3QgYGBtYXhzcGxpdCsxYGBcbiAgIGVsZW1lbnRzKS4gIElmICptYXhzcGxpdCogaXMgbm90IHNwZWNpZmllZCBvciBgYC0xYGAsIHRoZW4gdGhlcmUgaXNcbiAgIG5vIGxpbWl0IG9uIHRoZSBudW1iZXIgb2Ygc3BsaXRzIChhbGwgcG9zc2libGUgc3BsaXRzIGFyZSBtYWRlKS5cblxuICAgSWYgKnNlcCogaXMgZ2l2ZW4sIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMgYXJlIG5vdCBncm91cGVkIHRvZ2V0aGVyXG4gICBhbmQgYXJlIGRlZW1lZCB0byBkZWxpbWl0IGVtcHR5IHN0cmluZ3MgKGZvciBleGFtcGxlLFxuICAgYGBcJzEsLDJcJy5zcGxpdChcJyxcJylgYCByZXR1cm5zIGBgW1wnMVwnLCBcJ1wnLCBcJzJcJ11gYCkuICBUaGUgKnNlcCpcbiAgIGFyZ3VtZW50IG1heSBjb25zaXN0IG9mIG11bHRpcGxlIGNoYXJhY3RlcnMgKGZvciBleGFtcGxlLFxuICAgYGBcJzE8PjI8PjNcJy5zcGxpdChcJzw+XCcpYGAgcmV0dXJucyBgYFtcJzFcJywgXCcyXCcsIFwnM1wnXWBgKS4gU3BsaXR0aW5nXG4gICBhbiBlbXB0eSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBzZXBhcmF0b3IgcmV0dXJucyBgYFtcJ1wnXWBgLlxuXG4gICBJZiAqc2VwKiBpcyBub3Qgc3BlY2lmaWVkIG9yIGlzIGBgTm9uZWBgLCBhIGRpZmZlcmVudCBzcGxpdHRpbmdcbiAgIGFsZ29yaXRobSBpcyBhcHBsaWVkOiBydW5zIG9mIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgYXJlIHJlZ2FyZGVkXG4gICBhcyBhIHNpbmdsZSBzZXBhcmF0b3IsIGFuZCB0aGUgcmVzdWx0IHdpbGwgY29udGFpbiBubyBlbXB0eSBzdHJpbmdzXG4gICBhdCB0aGUgc3RhcnQgb3IgZW5kIGlmIHRoZSBzdHJpbmcgaGFzIGxlYWRpbmcgb3IgdHJhaWxpbmdcbiAgIHdoaXRlc3BhY2UuICBDb25zZXF1ZW50bHksIHNwbGl0dGluZyBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmdcbiAgIGNvbnNpc3Rpbmcgb2YganVzdCB3aGl0ZXNwYWNlIHdpdGggYSBgYE5vbmVgYCBzZXBhcmF0b3IgcmV0dXJuc1xuICAgYGBbXWBgLlxuXG4gICBGb3IgZXhhbXBsZSwgYGBcJyAxICAyICAgMyAgXCcuc3BsaXQoKWBgIHJldHVybnMgYGBbXCcxXCcsIFwnMlwnLCBcJzNcJ11gYCxcbiAgIGFuZCBgYFwnICAxICAyICAgMyAgXCcuc3BsaXQoTm9uZSwgMSlgYCByZXR1cm5zIGBgW1wnMVwnLCBcJzIgICAzICBcJ11gYC5cblxuc3RyLnNwbGl0bGluZXMoW2tlZXBlbmRzXSlcblxuICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgbGluZXMgaW4gdGhlIHN0cmluZywgYnJlYWtpbmcgYXQgbGluZVxuICAgYm91bmRhcmllcy4gVGhpcyBtZXRob2QgdXNlcyB0aGUgKnVuaXZlcnNhbCBuZXdsaW5lcyogYXBwcm9hY2ggdG9cbiAgIHNwbGl0dGluZyBsaW5lcy4gTGluZSBicmVha3MgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVzdWx0aW5nIGxpc3RcbiAgIHVubGVzcyAqa2VlcGVuZHMqIGlzIGdpdmVuIGFuZCB0cnVlLlxuXG4gICBGb3IgZXhhbXBsZSwgYGBcJ2FiIGNcXG5cXG5kZSBmZ1xccmtsXFxyXFxuXCcuc3BsaXRsaW5lcygpYGAgcmV0dXJuc1xuICAgYGBbXCdhYiBjXCcsIFwnXCcsIFwnZGUgZmdcJywgXCdrbFwnXWBgLCB3aGlsZSB0aGUgc2FtZSBjYWxsIHdpdGhcbiAgIGBgc3BsaXRsaW5lcyhUcnVlKWBgIHJldHVybnMgYGBbXCdhYiBjXFxuXCcsIFwnXFxuXCcsIFwnZGUgZmdcXHJcJyxcbiAgIFwna2xcXHJcXG5cJ11gYC5cblxuICAgVW5saWtlIGBgc3BsaXQoKWBgIHdoZW4gYSBkZWxpbWl0ZXIgc3RyaW5nICpzZXAqIGlzIGdpdmVuLCB0aGlzXG4gICBtZXRob2QgcmV0dXJucyBhbiBlbXB0eSBsaXN0IGZvciB0aGUgZW1wdHkgc3RyaW5nLCBhbmQgYSB0ZXJtaW5hbFxuICAgbGluZSBicmVhayBkb2VzIG5vdCByZXN1bHQgaW4gYW4gZXh0cmEgbGluZS5cblxuc3RyLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSlcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgKnByZWZpeCosIG90aGVyd2lzZVxuICAgcmV0dXJuIGBgRmFsc2VgYC4gKnByZWZpeCogY2FuIGFsc28gYmUgYSB0dXBsZSBvZiBwcmVmaXhlcyB0byBsb29rXG4gICBmb3IuICBXaXRoIG9wdGlvbmFsICpzdGFydCosIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgKmVuZCosIHN0b3AgY29tcGFyaW5nIHN0cmluZyBhdCB0aGF0XG4gICBwb3NpdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNTogQWNjZXB0IHR1cGxlcyBhcyAqcHJlZml4Ki5cblxuc3RyLnN0cmlwKFtjaGFyc10pXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHRoZSBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuICAgY2hhcmFjdGVycyByZW1vdmVkLiBUaGUgKmNoYXJzKiBhcmd1bWVudCBpcyBhIHN0cmluZyBzcGVjaWZ5aW5nIHRoZVxuICAgc2V0IG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVtb3ZlZC4gSWYgb21pdHRlZCBvciBgYE5vbmVgYCwgdGhlXG4gICAqY2hhcnMqIGFyZ3VtZW50IGRlZmF1bHRzIHRvIHJlbW92aW5nIHdoaXRlc3BhY2UuIFRoZSAqY2hhcnMqXG4gICBhcmd1bWVudCBpcyBub3QgYSBwcmVmaXggb3Igc3VmZml4OyByYXRoZXIsIGFsbCBjb21iaW5hdGlvbnMgb2YgaXRzXG4gICB2YWx1ZXMgYXJlIHN0cmlwcGVkOlxuXG4gICA+Pj4gXCcgICBzcGFjaW91cyAgIFwnLnN0cmlwKClcbiAgIFwnc3BhY2lvdXNcJ1xuICAgPj4+IFwnd3d3LmV4YW1wbGUuY29tXCcuc3RyaXAoXCdjbW93ei5cJylcbiAgIFwnZXhhbXBsZVwnXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjIuMjogU3VwcG9ydCBmb3IgdGhlICpjaGFycyogYXJndW1lbnQuXG5cbnN0ci5zd2FwY2FzZSgpXG5cbiAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyB3aXRoIHVwcGVyY2FzZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0b1xuICAgbG93ZXJjYXNlIGFuZCB2aWNlIHZlcnNhLlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLnRpdGxlKClcblxuICAgUmV0dXJuIGEgdGl0bGVjYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcgd2hlcmUgd29yZHMgc3RhcnQgd2l0aCBhblxuICAgdXBwZXJjYXNlIGNoYXJhY3RlciBhbmQgdGhlIHJlbWFpbmluZyBjaGFyYWN0ZXJzIGFyZSBsb3dlcmNhc2UuXG5cbiAgIFRoZSBhbGdvcml0aG0gdXNlcyBhIHNpbXBsZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBkZWZpbml0aW9uIG9mIGFcbiAgIHdvcmQgYXMgZ3JvdXBzIG9mIGNvbnNlY3V0aXZlIGxldHRlcnMuICBUaGUgZGVmaW5pdGlvbiB3b3JrcyBpblxuICAgbWFueSBjb250ZXh0cyBidXQgaXQgbWVhbnMgdGhhdCBhcG9zdHJvcGhlcyBpbiBjb250cmFjdGlvbnMgYW5kXG4gICBwb3NzZXNzaXZlcyBmb3JtIHdvcmQgYm91bmRhcmllcywgd2hpY2ggbWF5IG5vdCBiZSB0aGUgZGVzaXJlZFxuICAgcmVzdWx0OlxuXG4gICAgICA+Pj4gInRoZXlcJ3JlIGJpbGxcJ3MgZnJpZW5kcyBmcm9tIHRoZSBVSyIudGl0bGUoKVxuICAgICAgIlRoZXlcJ1JlIEJpbGxcJ1MgRnJpZW5kcyBGcm9tIFRoZSBVayJcblxuICAgQSB3b3JrYXJvdW5kIGZvciBhcG9zdHJvcGhlcyBjYW4gYmUgY29uc3RydWN0ZWQgdXNpbmcgcmVndWxhclxuICAgZXhwcmVzc2lvbnM6XG5cbiAgICAgID4+PiBpbXBvcnQgcmVcbiAgICAgID4+PiBkZWYgdGl0bGVjYXNlKHMpOlxuICAgICAgLi4uICAgICByZXR1cm4gcmUuc3ViKHIiW0EtWmEtel0rKFwnW0EtWmEtel0rKT8iLFxuICAgICAgLi4uICAgICAgICAgICAgICAgICAgIGxhbWJkYSBtbzogbW8uZ3JvdXAoMClbMF0udXBwZXIoKSArXG4gICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtby5ncm91cCgwKVsxOl0ubG93ZXIoKSxcbiAgICAgIC4uLiAgICAgICAgICAgICAgICAgICBzKVxuICAgICAgLi4uXG4gICAgICA+Pj4gdGl0bGVjYXNlKCJ0aGV5XCdyZSBiaWxsXCdzIGZyaWVuZHMuIilcbiAgICAgICJUaGV5XCdyZSBCaWxsXCdzIEZyaWVuZHMuIlxuXG4gICBGb3IgOC1iaXQgc3RyaW5ncywgdGhpcyBtZXRob2QgaXMgbG9jYWxlLWRlcGVuZGVudC5cblxuc3RyLnRyYW5zbGF0ZSh0YWJsZVssIGRlbGV0ZWNoYXJzXSlcblxuICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHdoZXJlIGFsbCBjaGFyYWN0ZXJzIG9jY3VycmluZyBpbiB0aGVcbiAgIG9wdGlvbmFsIGFyZ3VtZW50ICpkZWxldGVjaGFycyogYXJlIHJlbW92ZWQsIGFuZCB0aGUgcmVtYWluaW5nXG4gICBjaGFyYWN0ZXJzIGhhdmUgYmVlbiBtYXBwZWQgdGhyb3VnaCB0aGUgZ2l2ZW4gdHJhbnNsYXRpb24gdGFibGUsXG4gICB3aGljaCBtdXN0IGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAyNTYuXG5cbiAgIFlvdSBjYW4gdXNlIHRoZSBgYG1ha2V0cmFucygpYGAgaGVscGVyIGZ1bmN0aW9uIGluIHRoZSBgYHN0cmluZ2BgXG4gICBtb2R1bGUgdG8gY3JlYXRlIGEgdHJhbnNsYXRpb24gdGFibGUuIEZvciBzdHJpbmcgb2JqZWN0cywgc2V0IHRoZVxuICAgKnRhYmxlKiBhcmd1bWVudCB0byBgYE5vbmVgYCBmb3IgdHJhbnNsYXRpb25zIHRoYXQgb25seSBkZWxldGVcbiAgIGNoYXJhY3RlcnM6XG5cbiAgID4+PiBcJ3JlYWQgdGhpcyBzaG9ydCB0ZXh0XCcudHJhbnNsYXRlKE5vbmUsIFwnYWVpb3VcJylcbiAgIFwncmQgdGhzIHNocnQgdHh0XCdcblxuICAgTmV3IGluIHZlcnNpb24gMi42OiBTdXBwb3J0IGZvciBhIGBgTm9uZWBgICp0YWJsZSogYXJndW1lbnQuXG5cbiAgIEZvciBVbmljb2RlIG9iamVjdHMsIHRoZSBgYHRyYW5zbGF0ZSgpYGAgbWV0aG9kIGRvZXMgbm90IGFjY2VwdCB0aGVcbiAgIG9wdGlvbmFsICpkZWxldGVjaGFycyogYXJndW1lbnQuICBJbnN0ZWFkLCBpdCByZXR1cm5zIGEgY29weSBvZiB0aGVcbiAgICpzKiB3aGVyZSBhbGwgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuXG4gICB0cmFuc2xhdGlvbiB0YWJsZSB3aGljaCBtdXN0IGJlIGEgbWFwcGluZyBvZiBVbmljb2RlIG9yZGluYWxzIHRvXG4gICBVbmljb2RlIG9yZGluYWxzLCBVbmljb2RlIHN0cmluZ3Mgb3IgYGBOb25lYGAuIFVubWFwcGVkIGNoYXJhY3RlcnNcbiAgIGFyZSBsZWZ0IHVudG91Y2hlZC4gQ2hhcmFjdGVycyBtYXBwZWQgdG8gYGBOb25lYGAgYXJlIGRlbGV0ZWQuXG4gICBOb3RlLCBhIG1vcmUgZmxleGlibGUgYXBwcm9hY2ggaXMgdG8gY3JlYXRlIGEgY3VzdG9tIGNoYXJhY3RlclxuICAgbWFwcGluZyBjb2RlYyB1c2luZyB0aGUgYGBjb2RlY3NgYCBtb2R1bGUgKHNlZSBgYGVuY29kaW5ncy5jcDEyNTFgYFxuICAgZm9yIGFuIGV4YW1wbGUpLlxuXG5zdHIudXBwZXIoKVxuXG4gICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNhc2VkIGNoYXJhY3RlcnMgWzRdXG4gICBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLiAgTm90ZSB0aGF0IGBgc3RyLnVwcGVyKCkuaXN1cHBlcigpYGAgbWlnaHRcbiAgIGJlIGBgRmFsc2VgYCBpZiBgYHNgYCBjb250YWlucyB1bmNhc2VkIGNoYXJhY3RlcnMgb3IgaWYgdGhlIFVuaWNvZGVcbiAgIGNhdGVnb3J5IG9mIHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyKHMpIGlzIG5vdCAiTHUiIChMZXR0ZXIsXG4gICB1cHBlcmNhc2UpLCBidXQgZS5nLiAiTHQiIChMZXR0ZXIsIHRpdGxlY2FzZSkuXG5cbiAgIEZvciA4LWJpdCBzdHJpbmdzLCB0aGlzIG1ldGhvZCBpcyBsb2NhbGUtZGVwZW5kZW50LlxuXG5zdHIuemZpbGwod2lkdGgpXG5cbiAgIFJldHVybiB0aGUgbnVtZXJpYyBzdHJpbmcgbGVmdCBmaWxsZWQgd2l0aCB6ZXJvcyBpbiBhIHN0cmluZyBvZlxuICAgbGVuZ3RoICp3aWR0aCouICBBIHNpZ24gcHJlZml4IGlzIGhhbmRsZWQgY29ycmVjdGx5LiAgVGhlIG9yaWdpbmFsXG4gICBzdHJpbmcgaXMgcmV0dXJuZWQgaWYgKndpZHRoKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGBsZW4ocylgYC5cblxuICAgTmV3IGluIHZlcnNpb24gMi4yLjIuXG5cblRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgcHJlc2VudCBvbmx5IG9uIHVuaWNvZGUgb2JqZWN0czpcblxudW5pY29kZS5pc251bWVyaWMoKVxuXG4gICBSZXR1cm4gYGBUcnVlYGAgaWYgdGhlcmUgYXJlIG9ubHkgbnVtZXJpYyBjaGFyYWN0ZXJzIGluIFMsXG4gICBgYEZhbHNlYGAgb3RoZXJ3aXNlLiBOdW1lcmljIGNoYXJhY3RlcnMgaW5jbHVkZSBkaWdpdCBjaGFyYWN0ZXJzLFxuICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSB0aGUgVW5pY29kZSBudW1lcmljIHZhbHVlIHByb3BlcnR5LFxuICAgZS5nLiBVKzIxNTUsIFZVTEdBUiBGUkFDVElPTiBPTkUgRklGVEguXG5cbnVuaWNvZGUuaXNkZWNpbWFsKClcblxuICAgUmV0dXJuIGBgVHJ1ZWBgIGlmIHRoZXJlIGFyZSBvbmx5IGRlY2ltYWwgY2hhcmFjdGVycyBpbiBTLFxuICAgYGBGYWxzZWBgIG90aGVyd2lzZS4gRGVjaW1hbCBjaGFyYWN0ZXJzIGluY2x1ZGUgZGlnaXQgY2hhcmFjdGVycyxcbiAgIGFuZCBhbGwgY2hhcmFjdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIGZvcm0gZGVjaW1hbC1yYWRpeCBudW1iZXJzLFxuICAgZS5nLiBVKzA2NjAsIEFSQUJJQy1JTkRJQyBESUdJVCBaRVJPLlxuXG5cblN0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnNcbj09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuU3RyaW5nIGFuZCBVbmljb2RlIG9iamVjdHMgaGF2ZSBvbmUgdW5pcXVlIGJ1aWx0LWluIG9wZXJhdGlvbjogdGhlXG5gYCVgYCBvcGVyYXRvciAobW9kdWxvKS4gIFRoaXMgaXMgYWxzbyBrbm93biBhcyB0aGUgc3RyaW5nXG4qZm9ybWF0dGluZyogb3IgKmludGVycG9sYXRpb24qIG9wZXJhdG9yLiAgR2l2ZW4gYGBmb3JtYXQgJSB2YWx1ZXNgYFxuKHdoZXJlICpmb3JtYXQqIGlzIGEgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0KSwgYGAlYGAgY29udmVyc2lvblxuc3BlY2lmaWNhdGlvbnMgaW4gKmZvcm1hdCogYXJlIHJlcGxhY2VkIHdpdGggemVybyBvciBtb3JlIGVsZW1lbnRzIG9mXG4qdmFsdWVzKi4gIFRoZSBlZmZlY3QgaXMgc2ltaWxhciB0byB0aGUgdXNpbmcgYGBzcHJpbnRmKClgYCBpbiB0aGUgQ1xubGFuZ3VhZ2UuICBJZiAqZm9ybWF0KiBpcyBhIFVuaWNvZGUgb2JqZWN0LCBvciBpZiBhbnkgb2YgdGhlIG9iamVjdHNcbmJlaW5nIGNvbnZlcnRlZCB1c2luZyB0aGUgYGAlc2BgIGNvbnZlcnNpb24gYXJlIFVuaWNvZGUgb2JqZWN0cywgdGhlXG5yZXN1bHQgd2lsbCBhbHNvIGJlIGEgVW5pY29kZSBvYmplY3QuXG5cbklmICpmb3JtYXQqIHJlcXVpcmVzIGEgc2luZ2xlIGFyZ3VtZW50LCAqdmFsdWVzKiBtYXkgYmUgYSBzaW5nbGUgbm9uLVxudHVwbGUgb2JqZWN0LiBbNV0gIE90aGVyd2lzZSwgKnZhbHVlcyogbXVzdCBiZSBhIHR1cGxlIHdpdGggZXhhY3RseVxudGhlIG51bWJlciBvZiBpdGVtcyBzcGVjaWZpZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcsIG9yIGEgc2luZ2xlXG5tYXBwaW5nIG9iamVjdCAoZm9yIGV4YW1wbGUsIGEgZGljdGlvbmFyeSkuXG5cbkEgY29udmVyc2lvbiBzcGVjaWZpZXIgY29udGFpbnMgdHdvIG9yIG1vcmUgY2hhcmFjdGVycyBhbmQgaGFzIHRoZVxuZm9sbG93aW5nIGNvbXBvbmVudHMsIHdoaWNoIG11c3Qgb2NjdXIgaW4gdGhpcyBvcmRlcjpcblxuMS4gVGhlIGBgXCclXCdgYCBjaGFyYWN0ZXIsIHdoaWNoIG1hcmtzIHRoZSBzdGFydCBvZiB0aGUgc3BlY2lmaWVyLlxuXG4yLiBNYXBwaW5nIGtleSAob3B0aW9uYWwpLCBjb25zaXN0aW5nIG9mIGEgcGFyZW50aGVzaXNlZCBzZXF1ZW5jZSBvZlxuICAgY2hhcmFjdGVycyAoZm9yIGV4YW1wbGUsIGBgKHNvbWVuYW1lKWBgKS5cblxuMy4gQ29udmVyc2lvbiBmbGFncyAob3B0aW9uYWwpLCB3aGljaCBhZmZlY3QgdGhlIHJlc3VsdCBvZiBzb21lXG4gICBjb252ZXJzaW9uIHR5cGVzLlxuXG40LiBNaW5pbXVtIGZpZWxkIHdpZHRoIChvcHRpb25hbCkuICBJZiBzcGVjaWZpZWQgYXMgYW4gYGBcJypcJ2BgXG4gICAoYXN0ZXJpc2spLCB0aGUgYWN0dWFsIHdpZHRoIGlzIHJlYWQgZnJvbSB0aGUgbmV4dCBlbGVtZW50IG9mIHRoZVxuICAgdHVwbGUgaW4gKnZhbHVlcyosIGFuZCB0aGUgb2JqZWN0IHRvIGNvbnZlcnQgY29tZXMgYWZ0ZXIgdGhlXG4gICBtaW5pbXVtIGZpZWxkIHdpZHRoIGFuZCBvcHRpb25hbCBwcmVjaXNpb24uXG5cbjUuIFByZWNpc2lvbiAob3B0aW9uYWwpLCBnaXZlbiBhcyBhIGBgXCcuXCdgYCAoZG90KSBmb2xsb3dlZCBieSB0aGVcbiAgIHByZWNpc2lvbi4gIElmIHNwZWNpZmllZCBhcyBgYFwnKlwnYGAgKGFuIGFzdGVyaXNrKSwgdGhlIGFjdHVhbCB3aWR0aFxuICAgaXMgcmVhZCBmcm9tIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlIHR1cGxlIGluICp2YWx1ZXMqLCBhbmQgdGhlXG4gICB2YWx1ZSB0byBjb252ZXJ0IGNvbWVzIGFmdGVyIHRoZSBwcmVjaXNpb24uXG5cbjYuIExlbmd0aCBtb2RpZmllciAob3B0aW9uYWwpLlxuXG43LiBDb252ZXJzaW9uIHR5cGUuXG5cbldoZW4gdGhlIHJpZ2h0IGFyZ3VtZW50IGlzIGEgZGljdGlvbmFyeSAob3Igb3RoZXIgbWFwcGluZyB0eXBlKSwgdGhlblxudGhlIGZvcm1hdHMgaW4gdGhlIHN0cmluZyAqbXVzdCogaW5jbHVkZSBhIHBhcmVudGhlc2lzZWQgbWFwcGluZyBrZXlcbmludG8gdGhhdCBkaWN0aW9uYXJ5IGluc2VydGVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBgYFwnJVwnYGAgY2hhcmFjdGVyLlxuVGhlIG1hcHBpbmcga2V5IHNlbGVjdHMgdGhlIHZhbHVlIHRvIGJlIGZvcm1hdHRlZCBmcm9tIHRoZSBtYXBwaW5nLlxuRm9yIGV4YW1wbGU6XG5cbj4+PiBwcmludCBcJyUobGFuZ3VhZ2UpcyBoYXMgJShudW1iZXIpMDNkIHF1b3RlIHR5cGVzLlwnICUgXFxcbi4uLiAgICAgICB7Imxhbmd1YWdlIjogIlB5dGhvbiIsICJudW1iZXIiOiAyfVxuUHl0aG9uIGhhcyAwMDIgcXVvdGUgdHlwZXMuXG5cbkluIHRoaXMgY2FzZSBubyBgYCpgYCBzcGVjaWZpZXJzIG1heSBvY2N1ciBpbiBhIGZvcm1hdCAoc2luY2UgdGhleVxucmVxdWlyZSBhIHNlcXVlbnRpYWwgcGFyYW1ldGVyIGxpc3QpLlxuXG5UaGUgY29udmVyc2lvbiBmbGFnIGNoYXJhY3RlcnMgYXJlOlxuXG4rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IEZsYWcgICAgICB8IE1lYW5pbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rXG58IGBgXCcjXCdgYCAgIHwgVGhlIHZhbHVlIGNvbnZlcnNpb24gd2lsbCB1c2UgdGhlICJhbHRlcm5hdGUgZm9ybSIgKHdoZXJlIGRlZmluZWQgICAgIHxcbnwgICAgICAgICAgIHwgYmVsb3cpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBcJzBcJ2BgICAgfCBUaGUgY29udmVyc2lvbiB3aWxsIGJlIHplcm8gcGFkZGVkIGZvciBudW1lcmljIHZhbHVlcy4gICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnLVwnYGAgICB8IFRoZSBjb252ZXJ0ZWQgdmFsdWUgaXMgbGVmdCBhZGp1c3RlZCAob3ZlcnJpZGVzIHRoZSBgYFwnMFwnYGAgICAgICAgICAgIHxcbnwgICAgICAgICAgIHwgY29udmVyc2lvbiBpZiBib3RoIGFyZSBnaXZlbikuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBcJyBcJ2BgICAgfCAoYSBzcGFjZSkgQSBibGFuayBzaG91bGQgYmUgbGVmdCBiZWZvcmUgYSBwb3NpdGl2ZSBudW1iZXIgKG9yIGVtcHR5ICAgfFxufCAgICAgICAgICAgfCBzdHJpbmcpIHByb2R1Y2VkIGJ5IGEgc2lnbmVkIGNvbnZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYFwnK1wnYGAgICB8IEEgc2lnbiBjaGFyYWN0ZXIgKGBgXCcrXCdgYCBvciBgYFwnLVwnYGApIHdpbGwgcHJlY2VkZSB0aGUgY29udmVyc2lvbiAgICAgfFxufCAgICAgICAgICAgfCAob3ZlcnJpZGVzIGEgInNwYWNlIiBmbGFnKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xuXG5BIGxlbmd0aCBtb2RpZmllciAoYGBoYGAsIGBgbGBgLCBvciBgYExgYCkgbWF5IGJlIHByZXNlbnQsIGJ1dCBpc1xuaWdub3JlZCBhcyBpdCBpcyBub3QgbmVjZXNzYXJ5IGZvciBQeXRob24gLS0gc28gZS5nLiBgYCVsZGBgIGlzXG5pZGVudGljYWwgdG8gYGAlZGBgLlxuXG5UaGUgY29udmVyc2lvbiB0eXBlcyBhcmU6XG5cbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgQ29udmVyc2lvbiAgIHwgTWVhbmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgIHxcbis9PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PStcbnwgYGBcJ2RcJ2BgICAgICAgfCBTaWduZWQgaW50ZWdlciBkZWNpbWFsLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnaVwnYGAgICAgICB8IFNpZ25lZCBpbnRlZ2VyIGRlY2ltYWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdvXCdgYCAgICAgIHwgU2lnbmVkIG9jdGFsIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMSkgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3VcJ2BgICAgICAgfCBPYnNvbGV0ZSB0eXBlIC0tIGl0IGlzIGlkZW50aWNhbCB0byBgYFwnZFwnYGAuICAgICAgICAgIHwgKDcpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCd4XCdgYCAgICAgIHwgU2lnbmVkIGhleGFkZWNpbWFsIChsb3dlcmNhc2UpLiAgICAgICAgICAgICAgICAgICAgICAgfCAoMikgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ1hcJ2BgICAgICAgfCBTaWduZWQgaGV4YWRlY2ltYWwgKHVwcGVyY2FzZSkuICAgICAgICAgICAgICAgICAgICAgICB8ICgyKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnZVwnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGV4cG9uZW50aWFsIGZvcm1hdCAobG93ZXJjYXNlKS4gICAgICAgIHwgKDMpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdFXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYWwgZm9ybWF0ICh1cHBlcmNhc2UpLiAgICAgICAgfCAoMykgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ2ZcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBkZWNpbWFsIGZvcm1hdC4gICAgICAgICAgICAgICAgICAgICAgICB8ICgzKSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnRlwnYGAgICAgICB8IEZsb2F0aW5nIHBvaW50IGRlY2ltYWwgZm9ybWF0LiAgICAgICAgICAgICAgICAgICAgICAgIHwgKDMpICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdnXCdgYCAgICAgIHwgRmxvYXRpbmcgcG9pbnQgZm9ybWF0LiBVc2VzIGxvd2VyY2FzZSBleHBvbmVudGlhbCAgICAgfCAoNCkgICAgIHxcbnwgICAgICAgICAgICAgIHwgZm9ybWF0IGlmIGV4cG9uZW50IGlzIGxlc3MgdGhhbiAtNCBvciBub3QgbGVzcyB0aGFuICAgfCAgICAgICAgIHxcbnwgICAgICAgICAgICAgIHwgcHJlY2lzaW9uLCBkZWNpbWFsIGZvcm1hdCBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ0dcJ2BgICAgICAgfCBGbG9hdGluZyBwb2ludCBmb3JtYXQuIFVzZXMgdXBwZXJjYXNlIGV4cG9uZW50aWFsICAgICB8ICg0KSAgICAgfFxufCAgICAgICAgICAgICAgfCBmb3JtYXQgaWYgZXhwb25lbnQgaXMgbGVzcyB0aGFuIC00IG9yIG5vdCBsZXNzIHRoYW4gICB8ICAgICAgICAgfFxufCAgICAgICAgICAgICAgfCBwcmVjaXNpb24sIGRlY2ltYWwgZm9ybWF0IG90aGVyd2lzZS4gICAgICAgICAgICAgICAgICB8ICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnY1wnYGAgICAgICB8IFNpbmdsZSBjaGFyYWN0ZXIgKGFjY2VwdHMgaW50ZWdlciBvciBzaW5nbGUgY2hhcmFjdGVyIHwgICAgICAgICB8XG58ICAgICAgICAgICAgICB8IHN0cmluZykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rXG58IGBgXCdyXCdgYCAgICAgIHwgU3RyaW5nIChjb252ZXJ0cyBhbnkgUHl0aG9uIG9iamVjdCB1c2luZyAqcmVwcigpKikuICAgfCAoNSkgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcbnwgYGBcJ3NcJ2BgICAgICAgfCBTdHJpbmcgKGNvbnZlcnRzIGFueSBQeXRob24gb2JqZWN0IHVzaW5nIGBgc3RyKClgYCkuICB8ICg2KSAgICAgfFxuKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tK1xufCBgYFwnJVwnYGAgICAgICB8IE5vIGFyZ3VtZW50IGlzIGNvbnZlcnRlZCwgcmVzdWx0cyBpbiBhIGBgXCclXCdgYCAgICAgICAgfCAgICAgICAgIHxcbnwgICAgICAgICAgICAgIHwgY2hhcmFjdGVyIGluIHRoZSByZXN1bHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLStcblxuTm90ZXM6XG5cbjEuIFRoZSBhbHRlcm5hdGUgZm9ybSBjYXVzZXMgYSBsZWFkaW5nIHplcm8gKGBgXCcwXCdgYCkgdG8gYmUgaW5zZXJ0ZWRcbiAgIGJldHdlZW4gbGVmdC1oYW5kIHBhZGRpbmcgYW5kIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBudW1iZXIgaWYgdGhlXG4gICBsZWFkaW5nIGNoYXJhY3RlciBvZiB0aGUgcmVzdWx0IGlzIG5vdCBhbHJlYWR5IGEgemVyby5cblxuMi4gVGhlIGFsdGVybmF0ZSBmb3JtIGNhdXNlcyBhIGxlYWRpbmcgYGBcJzB4XCdgYCBvciBgYFwnMFhcJ2BgIChkZXBlbmRpbmdcbiAgIG9uIHdoZXRoZXIgdGhlIGBgXCd4XCdgYCBvciBgYFwnWFwnYGAgZm9ybWF0IHdhcyB1c2VkKSB0byBiZSBpbnNlcnRlZFxuICAgYmV0d2VlbiBsZWZ0LWhhbmQgcGFkZGluZyBhbmQgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIG51bWJlciBpZiB0aGVcbiAgIGxlYWRpbmcgY2hhcmFjdGVyIG9mIHRoZSByZXN1bHQgaXMgbm90IGFscmVhZHkgYSB6ZXJvLlxuXG4zLiBUaGUgYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIHRoZSByZXN1bHQgdG8gYWx3YXlzIGNvbnRhaW4gYSBkZWNpbWFsXG4gICBwb2ludCwgZXZlbiBpZiBubyBkaWdpdHMgZm9sbG93IGl0LlxuXG4gICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWxcbiAgIHBvaW50IGFuZCBkZWZhdWx0cyB0byA2LlxuXG40LiBUaGUgYWx0ZXJuYXRlIGZvcm0gY2F1c2VzIHRoZSByZXN1bHQgdG8gYWx3YXlzIGNvbnRhaW4gYSBkZWNpbWFsXG4gICBwb2ludCwgYW5kIHRyYWlsaW5nIHplcm9lcyBhcmUgbm90IHJlbW92ZWQgYXMgdGhleSB3b3VsZCBvdGhlcndpc2VcbiAgIGJlLlxuXG4gICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgYmVmb3JlXG4gICBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQgYW5kIGRlZmF1bHRzIHRvIDYuXG5cbjUuIFRoZSBgYCVyYGAgY29udmVyc2lvbiB3YXMgYWRkZWQgaW4gUHl0aG9uIDIuMC5cblxuICAgVGhlIHByZWNpc2lvbiBkZXRlcm1pbmVzIHRoZSBtYXhpbWFsIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVzZWQuXG5cbjYuIElmIHRoZSBvYmplY3Qgb3IgZm9ybWF0IHByb3ZpZGVkIGlzIGEgYGB1bmljb2RlYGAgc3RyaW5nLCB0aGVcbiAgIHJlc3VsdGluZyBzdHJpbmcgd2lsbCBhbHNvIGJlIGBgdW5pY29kZWBgLlxuXG4gICBUaGUgcHJlY2lzaW9uIGRldGVybWluZXMgdGhlIG1heGltYWwgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXNlZC5cblxuNy4gU2VlICoqUEVQIDIzNyoqLlxuXG5TaW5jZSBQeXRob24gc3RyaW5ncyBoYXZlIGFuIGV4cGxpY2l0IGxlbmd0aCwgYGAlc2BgIGNvbnZlcnNpb25zIGRvXG5ub3QgYXNzdW1lIHRoYXQgYGBcJ1xcMFwnYGAgaXMgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLlxuXG5DaGFuZ2VkIGluIHZlcnNpb24gMi43OiBgYCVmYGAgY29udmVyc2lvbnMgZm9yIG51bWJlcnMgd2hvc2UgYWJzb2x1dGVcbnZhbHVlIGlzIG92ZXIgMWU1MCBhcmUgbm8gbG9uZ2VyIHJlcGxhY2VkIGJ5IGBgJWdgYCBjb252ZXJzaW9ucy5cblxuQWRkaXRpb25hbCBzdHJpbmcgb3BlcmF0aW9ucyBhcmUgZGVmaW5lZCBpbiBzdGFuZGFyZCBtb2R1bGVzXG5gYHN0cmluZ2BgIGFuZCBgYHJlYGAuXG5cblxuWFJhbmdlIFR5cGVcbj09PT09PT09PT09XG5cblRoZSBgYHhyYW5nZWBgIHR5cGUgaXMgYW4gaW1tdXRhYmxlIHNlcXVlbmNlIHdoaWNoIGlzIGNvbW1vbmx5IHVzZWRcbmZvciBsb29waW5nLiAgVGhlIGFkdmFudGFnZSBvZiB0aGUgYGB4cmFuZ2VgYCB0eXBlIGlzIHRoYXQgYW5cbmBgeHJhbmdlYGAgb2JqZWN0IHdpbGwgYWx3YXlzIHRha2UgdGhlIHNhbWUgYW1vdW50IG9mIG1lbW9yeSwgbm9cbm1hdHRlciB0aGUgc2l6ZSBvZiB0aGUgcmFuZ2UgaXQgcmVwcmVzZW50cy4gIFRoZXJlIGFyZSBubyBjb25zaXN0ZW50XG5wZXJmb3JtYW5jZSBhZHZhbnRhZ2VzLlxuXG5YUmFuZ2Ugb2JqZWN0cyBoYXZlIHZlcnkgbGl0dGxlIGJlaGF2aW9yOiB0aGV5IG9ubHkgc3VwcG9ydCBpbmRleGluZyxcbml0ZXJhdGlvbiwgYW5kIHRoZSBgYGxlbigpYGAgZnVuY3Rpb24uXG5cblxuTXV0YWJsZSBTZXF1ZW5jZSBUeXBlc1xuPT09PT09PT09PT09PT09PT09PT09PVxuXG5MaXN0IGFuZCBgYGJ5dGVhcnJheWBgIG9iamVjdHMgc3VwcG9ydCBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgdGhhdFxuYWxsb3cgaW4tcGxhY2UgbW9kaWZpY2F0aW9uIG9mIHRoZSBvYmplY3QuIE90aGVyIG11dGFibGUgc2VxdWVuY2VcbnR5cGVzICh3aGVuIGFkZGVkIHRvIHRoZSBsYW5ndWFnZSkgc2hvdWxkIGFsc28gc3VwcG9ydCB0aGVzZVxub3BlcmF0aW9ucy4gU3RyaW5ncyBhbmQgdHVwbGVzIGFyZSBpbW11dGFibGUgc2VxdWVuY2UgdHlwZXM6IHN1Y2hcbm9iamVjdHMgY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgY3JlYXRlZC4gVGhlIGZvbGxvd2luZyBvcGVyYXRpb25zIGFyZVxuZGVmaW5lZCBvbiBtdXRhYmxlIHNlcXVlbmNlIHR5cGVzICh3aGVyZSAqeCogaXMgYW4gYXJiaXRyYXJ5IG9iamVjdCk6XG5cbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBPcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgfCBSZXN1bHQgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzICAgICAgICAgICAgICAgICB8XG4rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PStcbnwgYGBzW2ldID0geGBgICAgICAgICAgICAgICAgICAgIHwgaXRlbSAqaSogb2YgKnMqIGlzIHJlcGxhY2VkIGJ5ICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAqeCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzW2k6al0gPSB0YGAgICAgICAgICAgICAgICAgIHwgc2xpY2Ugb2YgKnMqIGZyb20gKmkqIHRvICpqKiBpcyAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aGUgY29udGVudHMgb2YgdGhlICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGl0ZXJhYmxlICp0KiAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYGRlbCBzW2k6al1gYCAgICAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tpOmpdID0gW11gYCAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzW2k6ajprXSA9IHRgYCAgICAgICAgICAgICAgIHwgdGhlIGVsZW1lbnRzIG9mIGBgc1tpOmo6a11gYCBhcmUgfCAoMSkgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXBsYWNlZCBieSB0aG9zZSBvZiAqdCogICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBkZWwgc1tpOmo6a11gYCAgICAgICAgICAgICAgIHwgcmVtb3ZlcyB0aGUgZWxlbWVudHMgb2YgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgYHNbaTpqOmtdYGAgZnJvbSB0aGUgbGlzdCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmFwcGVuZCh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbbGVuKHMpOmxlbihzKV0gPSAgICAgfCAoMikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbeF1gYCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLmV4dGVuZCh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbbGVuKHMpOmxlbihzKV0gPSB4YGAgfCAoMykgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5jb3VudCh4KWBgICAgICAgICAgICAgICAgICB8IHJldHVybiBudW1iZXIgb2YgKmkqXCdzIGZvciB3aGljaCB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpXSA9PSB4YGAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuaW5kZXgoeFssIGlbLCBqXV0pYGAgICAgICAgfCByZXR1cm4gc21hbGxlc3QgKmsqIHN1Y2ggdGhhdCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1trXSA9PSB4YGAgYW5kIGBgaSA8PSBrIDwgamBgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuaW5zZXJ0KGksIHgpYGAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tpOmldID0gW3hdYGAgICAgICAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnBvcChbaV0pYGAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHggPSBzW2ldOyBkZWwgc1tpXTsgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXR1cm4geGBgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnJlbW92ZSh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYGRlbCBzW3MuaW5kZXgoeCldYGAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5yZXZlcnNlKClgYCAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDcpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5zb3J0KFtjbXBbLCBrZXlbLCAgICAgICAgICB8IHNvcnQgdGhlIGl0ZW1zIG9mICpzKiBpbiBwbGFjZSAgIHwgKDcpKDgpKDkpKDEwKSAgICAgICAgIHxcbnwgcmV2ZXJzZV1dXSlgYCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgIHJlcGxhY2luZy5cblxuMi4gVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQgbXVsdGlwbGVcbiAgIHBhcmFtZXRlcnMgYW5kIGltcGxpY2l0bHkgam9pbmVkIHRoZW0gaW50byBhIHR1cGxlOyB0aGlzIG5vIGxvbmdlclxuICAgd29ya3MgaW4gUHl0aG9uIDIuMC4gIFVzZSBvZiB0aGlzIG1pc2ZlYXR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuICAgc2luY2UgUHl0aG9uIDEuNC5cblxuMy4gKngqIGNhbiBiZSBhbnkgaXRlcmFibGUgb2JqZWN0LlxuXG40LiBSYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gV2hlbiBhIG5lZ2F0aXZlXG4gICBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBvciB0aGlyZCBwYXJhbWV0ZXIgdG8gdGhlIGBgaW5kZXgoKWBgXG4gICBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlIGluZGljZXMuICBJZiBpdCBpc1xuICAgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYGBpbmRleCgpYGAgZGlkblwndCBoYXZlXG4gICBhcmd1bWVudHMgZm9yIHNwZWNpZnlpbmcgc3RhcnQgYW5kIHN0b3AgcG9zaXRpb25zLlxuXG41LiBXaGVuIGEgbmVnYXRpdmUgaW5kZXggaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gdGhlXG4gICBgYGluc2VydCgpYGAgbWV0aG9kLCB0aGUgbGlzdCBsZW5ndGggaXMgYWRkZWQsIGFzIGZvciBzbGljZVxuICAgaW5kaWNlcy4gIElmIGl0IGlzIHN0aWxsIG5lZ2F0aXZlLCBpdCBpcyB0cnVuY2F0ZWQgdG8gemVybywgYXMgZm9yXG4gICBzbGljZSBpbmRpY2VzLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBQcmV2aW91c2x5LCBhbGwgbmVnYXRpdmUgaW5kaWNlcyB3ZXJlXG4gICB0cnVuY2F0ZWQgdG8gemVyby5cblxuNi4gVGhlIGBgcG9wKClgYCBtZXRob2QgaXMgb25seSBzdXBwb3J0ZWQgYnkgdGhlIGxpc3QgYW5kIGFycmF5IHR5cGVzLlxuICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50ICppKiBkZWZhdWx0cyB0byBgYC0xYGAsIHNvIHRoYXQgYnkgZGVmYXVsdFxuICAgdGhlIGxhc3QgaXRlbSBpcyByZW1vdmVkIGFuZCByZXR1cm5lZC5cblxuNy4gVGhlIGBgc29ydCgpYGAgYW5kIGBgcmV2ZXJzZSgpYGAgbWV0aG9kcyBtb2RpZnkgdGhlIGxpc3QgaW4gcGxhY2VcbiAgIGZvciBlY29ub215IG9mIHNwYWNlIHdoZW4gc29ydGluZyBvciByZXZlcnNpbmcgYSBsYXJnZSBsaXN0LiAgVG9cbiAgIHJlbWluZCB5b3UgdGhhdCB0aGV5IG9wZXJhdGUgYnkgc2lkZSBlZmZlY3QsIHRoZXkgZG9uXCd0IHJldHVybiB0aGVcbiAgIHNvcnRlZCBvciByZXZlcnNlZCBsaXN0LlxuXG44LiBUaGUgYGBzb3J0KClgYCBtZXRob2QgdGFrZXMgb3B0aW9uYWwgYXJndW1lbnRzIGZvciBjb250cm9sbGluZyB0aGVcbiAgIGNvbXBhcmlzb25zLlxuXG4gICAqY21wKiBzcGVjaWZpZXMgYSBjdXN0b20gY29tcGFyaXNvbiBmdW5jdGlvbiBvZiB0d28gYXJndW1lbnRzIChsaXN0XG4gICBpdGVtcykgd2hpY2ggc2hvdWxkIHJldHVybiBhIG5lZ2F0aXZlLCB6ZXJvIG9yIHBvc2l0aXZlIG51bWJlclxuICAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGNvbnNpZGVyZWQgc21hbGxlciB0aGFuLFxuICAgZXF1YWwgdG8sIG9yIGxhcmdlciB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQ6IGBgY21wPWxhbWJkYSB4LHk6XG4gICBjbXAoeC5sb3dlcigpLCB5Lmxvd2VyKCkpYGAuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgYE5vbmVgYC5cblxuICAgKmtleSogc3BlY2lmaWVzIGEgZnVuY3Rpb24gb2Ygb25lIGFyZ3VtZW50IHRoYXQgaXMgdXNlZCB0byBleHRyYWN0XG4gICBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQ6IGBga2V5PXN0ci5sb3dlcmBgLiAgVGhlXG4gICBkZWZhdWx0IHZhbHVlIGlzIGBgTm9uZWBgLlxuXG4gICAqcmV2ZXJzZSogaXMgYSBib29sZWFuIHZhbHVlLiAgSWYgc2V0IHRvIGBgVHJ1ZWBgLCB0aGVuIHRoZSBsaXN0XG4gICBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLlxuXG4gICBJbiBnZW5lcmFsLCB0aGUgKmtleSogYW5kICpyZXZlcnNlKiBjb252ZXJzaW9uIHByb2Nlc3NlcyBhcmUgbXVjaFxuICAgZmFzdGVyIHRoYW4gc3BlY2lmeWluZyBhbiBlcXVpdmFsZW50ICpjbXAqIGZ1bmN0aW9uLiAgVGhpcyBpc1xuICAgYmVjYXVzZSAqY21wKiBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIGVhY2ggbGlzdCBlbGVtZW50IHdoaWxlXG4gICAqa2V5KiBhbmQgKnJldmVyc2UqIHRvdWNoIGVhY2ggZWxlbWVudCBvbmx5IG9uY2UuICBVc2VcbiAgIGBgZnVuY3Rvb2xzLmNtcF90b19rZXkoKWBgIHRvIGNvbnZlcnQgYW4gb2xkLXN0eWxlICpjbXAqIGZ1bmN0aW9uXG4gICB0byBhICprZXkqIGZ1bmN0aW9uLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi4zOiBTdXBwb3J0IGZvciBgYE5vbmVgYCBhcyBhbiBlcXVpdmFsZW50IHRvXG4gICBvbWl0dGluZyAqY21wKiB3YXMgYWRkZWQuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjQ6IFN1cHBvcnQgZm9yICprZXkqIGFuZCAqcmV2ZXJzZSogd2FzIGFkZGVkLlxuXG45LiBTdGFydGluZyB3aXRoIFB5dGhvbiAyLjMsIHRoZSBgYHNvcnQoKWBgIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlXG4gICBzdGFibGUuICBBIHNvcnQgaXMgc3RhYmxlIGlmIGl0IGd1YXJhbnRlZXMgbm90IHRvIGNoYW5nZSB0aGVcbiAgIHJlbGF0aXZlIG9yZGVyIG9mIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBlcXVhbCAtLS0gdGhpcyBpcyBoZWxwZnVsXG4gICBmb3Igc29ydGluZyBpbiBtdWx0aXBsZSBwYXNzZXMgKGZvciBleGFtcGxlLCBzb3J0IGJ5IGRlcGFydG1lbnQsXG4gICB0aGVuIGJ5IHNhbGFyeSBncmFkZSkuXG5cbjEwLiAqKkNQeXRob24gaW1wbGVtZW50YXRpb24gZGV0YWlsOioqIFdoaWxlIGEgbGlzdCBpcyBiZWluZyBzb3J0ZWQsXG4gICAgdGhlIGVmZmVjdCBvZiBhdHRlbXB0aW5nIHRvIG11dGF0ZSwgb3IgZXZlbiBpbnNwZWN0LCB0aGUgbGlzdCBpc1xuICAgIHVuZGVmaW5lZC4gIFRoZSBDIGltcGxlbWVudGF0aW9uIG9mIFB5dGhvbiAyLjMgYW5kIG5ld2VyIG1ha2VzIHRoZVxuICAgIGxpc3QgYXBwZWFyIGVtcHR5IGZvciB0aGUgZHVyYXRpb24sIGFuZCByYWlzZXMgYGBWYWx1ZUVycm9yYGAgaWZcbiAgICBpdCBjYW4gZGV0ZWN0IHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LlxuJywKKyAndHlwZXNzZXEtbXV0YWJsZSc6ICJcbk11dGFibGUgU2VxdWVuY2UgVHlwZXNcbioqKioqKioqKioqKioqKioqKioqKipcblxuTGlzdCBhbmQgYGBieXRlYXJyYXlgYCBvYmplY3RzIHN1cHBvcnQgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRoYXRcbmFsbG93IGluLXBsYWNlIG1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0LiBPdGhlciBtdXRhYmxlIHNlcXVlbmNlXG50eXBlcyAod2hlbiBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UpIHNob3VsZCBhbHNvIHN1cHBvcnQgdGhlc2Vcbm9wZXJhdGlvbnMuIFN0cmluZ3MgYW5kIHR1cGxlcyBhcmUgaW1tdXRhYmxlIHNlcXVlbmNlIHR5cGVzOiBzdWNoXG5vYmplY3RzIGNhbm5vdCBiZSBtb2RpZmllZCBvbmNlIGNyZWF0ZWQuIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBhcmVcbmRlZmluZWQgb24gbXV0YWJsZSBzZXF1ZW5jZSB0eXBlcyAod2hlcmUgKngqIGlzIGFuIGFyYml0cmFyeSBvYmplY3QpOlxuXG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgT3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgIHwgUmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcyAgICAgICAgICAgICAgICAgfFxuKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT0rXG58IGBgc1tpXSA9IHhgYCAgICAgICAgICAgICAgICAgICB8IGl0ZW0gKmkqIG9mICpzKiBpcyByZXBsYWNlZCBieSAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKngqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgc1tpOmpdID0gdGBgICAgICAgICAgICAgICAgICB8IHNsaWNlIG9mICpzKiBmcm9tICppKiB0byAqaiogaXMgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpdGVyYWJsZSAqdCogICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBkZWwgc1tpOmpdYGAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHNbaTpqXSA9IFtdYGAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgc1tpOmo6a10gPSB0YGAgICAgICAgICAgICAgICB8IHRoZSBlbGVtZW50cyBvZiBgYHNbaTpqOmtdYGAgYXJlIHwgKDEpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVwbGFjZWQgYnkgdGhvc2Ugb2YgKnQqICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgZGVsIHNbaTpqOmtdYGAgICAgICAgICAgICAgICB8IHJlbW92ZXMgdGhlIGVsZW1lbnRzIG9mICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGBzW2k6ajprXWBgIGZyb20gdGhlIGxpc3QgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5hcHBlbmQoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2xlbihzKTpsZW4ocyldID0gICAgIHwgKDIpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW3hdYGAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5leHRlbmQoeClgYCAgICAgICAgICAgICAgICB8IHNhbWUgYXMgYGBzW2xlbihzKTpsZW4ocyldID0geGBgIHwgKDMpICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuY291bnQoeClgYCAgICAgICAgICAgICAgICAgfCByZXR1cm4gbnVtYmVyIG9mICppKidzIGZvciB3aGljaCB8ICAgICAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1tpXSA9PSB4YGAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuaW5kZXgoeFssIGlbLCBqXV0pYGAgICAgICAgfCByZXR1cm4gc21hbGxlc3QgKmsqIHN1Y2ggdGhhdCAgICB8ICg0KSAgICAgICAgICAgICAgICAgICB8XG58ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBgc1trXSA9PSB4YGAgYW5kIGBgaSA8PSBrIDwgamBgIHwgICAgICAgICAgICAgICAgICAgICAgIHxcbistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tK1xufCBgYHMuaW5zZXJ0KGksIHgpYGAgICAgICAgICAgICAgfCBzYW1lIGFzIGBgc1tpOmldID0gW3hdYGAgICAgICAgICB8ICg1KSAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnBvcChbaV0pYGAgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYHggPSBzW2ldOyBkZWwgc1tpXTsgICAgfCAoNikgICAgICAgICAgICAgICAgICAgfFxufCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCByZXR1cm4geGBgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICB8XG4rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLStcbnwgYGBzLnJlbW92ZSh4KWBgICAgICAgICAgICAgICAgIHwgc2FtZSBhcyBgYGRlbCBzW3MuaW5kZXgoeCldYGAgICAgfCAoNCkgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5yZXZlcnNlKClgYCAgICAgICAgICAgICAgICB8IHJldmVyc2VzIHRoZSBpdGVtcyBvZiAqcyogaW4gICAgIHwgKDcpICAgICAgICAgICAgICAgICAgIHxcbnwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcGxhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG58IGBgcy5zb3J0KFtjbXBbLCBrZXlbLCAgICAgICAgICB8IHNvcnQgdGhlIGl0ZW1zIG9mICpzKiBpbiBwbGFjZSAgIHwgKDcpKDgpKDkpKDEwKSAgICAgICAgIHxcbnwgcmV2ZXJzZV1dXSlgYCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfFxuKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rXG5cbk5vdGVzOlxuXG4xLiAqdCogbXVzdCBoYXZlIHRoZSBzYW1lIGxlbmd0aCBhcyB0aGUgc2xpY2UgaXQgaXMgIHJlcGxhY2luZy5cblxuMi4gVGhlIEMgaW1wbGVtZW50YXRpb24gb2YgUHl0aG9uIGhhcyBoaXN0b3JpY2FsbHkgYWNjZXB0ZWQgbXVsdGlwbGVcbiAgIHBhcmFtZXRlcnMgYW5kIGltcGxpY2l0bHkgam9pbmVkIHRoZW0gaW50byBhIHR1cGxlOyB0aGlzIG5vIGxvbmdlclxuICAgd29ya3MgaW4gUHl0aG9uIDIuMC4gIFVzZSBvZiB0aGlzIG1pc2ZlYXR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZFxuICAgc2luY2UgUHl0aG9uIDEuNC5cblxuMy4gKngqIGNhbiBiZSBhbnkgaXRlcmFibGUgb2JqZWN0LlxuXG40LiBSYWlzZXMgYGBWYWx1ZUVycm9yYGAgd2hlbiAqeCogaXMgbm90IGZvdW5kIGluICpzKi4gV2hlbiBhIG5lZ2F0aXZlXG4gICBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIHNlY29uZCBvciB0aGlyZCBwYXJhbWV0ZXIgdG8gdGhlIGBgaW5kZXgoKWBgXG4gICBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlIGluZGljZXMuICBJZiBpdCBpc1xuICAgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3Igc2xpY2UgaW5kaWNlcy5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogUHJldmlvdXNseSwgYGBpbmRleCgpYGAgZGlkbid0IGhhdmVcbiAgIGFyZ3VtZW50cyBmb3Igc3BlY2lmeWluZyBzdGFydCBhbmQgc3RvcCBwb3NpdGlvbnMuXG5cbjUuIFdoZW4gYSBuZWdhdGl2ZSBpbmRleCBpcyBwYXNzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byB0aGVcbiAgIGBgaW5zZXJ0KClgYCBtZXRob2QsIHRoZSBsaXN0IGxlbmd0aCBpcyBhZGRlZCwgYXMgZm9yIHNsaWNlXG4gICBpbmRpY2VzLiAgSWYgaXQgaXMgc3RpbGwgbmVnYXRpdmUsIGl0IGlzIHRydW5jYXRlZCB0byB6ZXJvLCBhcyBmb3JcbiAgIHNsaWNlIGluZGljZXMuXG5cbiAgIENoYW5nZWQgaW4gdmVyc2lvbiAyLjM6IFByZXZpb3VzbHksIGFsbCBuZWdhdGl2ZSBpbmRpY2VzIHdlcmVcbiAgIHRydW5jYXRlZCB0byB6ZXJvLlxuXG42LiBUaGUgYGBwb3AoKWBgIG1ldGhvZCBpcyBvbmx5IHN1cHBvcnRlZCBieSB0aGUgbGlzdCBhbmQgYXJyYXkgdHlwZXMuXG4gICBUaGUgb3B0aW9uYWwgYXJndW1lbnQgKmkqIGRlZmF1bHRzIHRvIGBgLTFgYCwgc28gdGhhdCBieSBkZWZhdWx0XG4gICB0aGUgbGFzdCBpdGVtIGlzIHJlbW92ZWQgYW5kIHJldHVybmVkLlxuXG43LiBUaGUgYGBzb3J0KClgYCBhbmQgYGByZXZlcnNlKClgYCBtZXRob2RzIG1vZGlmeSB0aGUgbGlzdCBpbiBwbGFjZVxuICAgZm9yIGVjb25vbXkgb2Ygc3BhY2Ugd2hlbiBzb3J0aW5nIG9yIHJldmVyc2luZyBhIGxhcmdlIGxpc3QuICBUb1xuICAgcmVtaW5kIHlvdSB0aGF0IHRoZXkgb3BlcmF0ZSBieSBzaWRlIGVmZmVjdCwgdGhleSBkb24ndCByZXR1cm4gdGhlXG4gICBzb3J0ZWQgb3IgcmV2ZXJzZWQgbGlzdC5cblxuOC4gVGhlIGBgc29ydCgpYGAgbWV0aG9kIHRha2VzIG9wdGlvbmFsIGFyZ3VtZW50cyBmb3IgY29udHJvbGxpbmcgdGhlXG4gICBjb21wYXJpc29ucy5cblxuICAgKmNtcCogc3BlY2lmaWVzIGEgY3VzdG9tIGNvbXBhcmlzb24gZnVuY3Rpb24gb2YgdHdvIGFyZ3VtZW50cyAobGlzdFxuICAgaXRlbXMpIHdoaWNoIHNob3VsZCByZXR1cm4gYSBuZWdhdGl2ZSwgemVybyBvciBwb3NpdGl2ZSBudW1iZXJcbiAgIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHNtYWxsZXIgdGhhbixcbiAgIGVxdWFsIHRvLCBvciBsYXJnZXIgdGhhbiB0aGUgc2Vjb25kIGFyZ3VtZW50OiBgYGNtcD1sYW1iZGEgeCx5OlxuICAgY21wKHgubG93ZXIoKSwgeS5sb3dlcigpKWBgLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgYGBOb25lYGAuXG5cbiAgICprZXkqIHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgdG8gZXh0cmFjdFxuICAgYSBjb21wYXJpc29uIGtleSBmcm9tIGVhY2ggbGlzdCBlbGVtZW50OiBgYGtleT1zdHIubG93ZXJgYC4gIFRoZVxuICAgZGVmYXVsdCB2YWx1ZSBpcyBgYE5vbmVgYC5cblxuICAgKnJldmVyc2UqIGlzIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHNldCB0byBgYFRydWVgYCwgdGhlbiB0aGUgbGlzdFxuICAgZWxlbWVudHMgYXJlIHNvcnRlZCBhcyBpZiBlYWNoIGNvbXBhcmlzb24gd2VyZSByZXZlcnNlZC5cblxuICAgSW4gZ2VuZXJhbCwgdGhlICprZXkqIGFuZCAqcmV2ZXJzZSogY29udmVyc2lvbiBwcm9jZXNzZXMgYXJlIG11Y2hcbiAgIGZhc3RlciB0aGFuIHNwZWNpZnlpbmcgYW4gZXF1aXZhbGVudCAqY21wKiBmdW5jdGlvbi4gIFRoaXMgaXNcbiAgIGJlY2F1c2UgKmNtcCogaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGxpc3QgZWxlbWVudCB3aGlsZVxuICAgKmtleSogYW5kICpyZXZlcnNlKiB0b3VjaCBlYWNoIGVsZW1lbnQgb25seSBvbmNlLiAgVXNlXG4gICBgYGZ1bmN0b29scy5jbXBfdG9fa2V5KClgYCB0byBjb252ZXJ0IGFuIG9sZC1zdHlsZSAqY21wKiBmdW5jdGlvblxuICAgdG8gYSAqa2V5KiBmdW5jdGlvbi5cblxuICAgQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuMzogU3VwcG9ydCBmb3IgYGBOb25lYGAgYXMgYW4gZXF1aXZhbGVudCB0b1xuICAgb21pdHRpbmcgKmNtcCogd2FzIGFkZGVkLlxuXG4gICBDaGFuZ2VkIGluIHZlcnNpb24gMi40OiBTdXBwb3J0IGZvciAqa2V5KiBhbmQgKnJldmVyc2UqIHdhcyBhZGRlZC5cblxuOS4gU3RhcnRpbmcgd2l0aCBQeXRob24gMi4zLCB0aGUgYGBzb3J0KClgYCBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZVxuICAgc3RhYmxlLiAgQSBzb3J0IGlzIHN0YWJsZSBpZiBpdCBndWFyYW50ZWVzIG5vdCB0byBjaGFuZ2UgdGhlXG4gICByZWxhdGl2ZSBvcmRlciBvZiBlbGVtZW50cyB0aGF0IGNvbXBhcmUgZXF1YWwgLS0tIHRoaXMgaXMgaGVscGZ1bFxuICAgZm9yIHNvcnRpbmcgaW4gbXVsdGlwbGUgcGFzc2VzIChmb3IgZXhhbXBsZSwgc29ydCBieSBkZXBhcnRtZW50LFxuICAgdGhlbiBieSBzYWxhcnkgZ3JhZGUpLlxuXG4xMC4gKipDUHl0aG9uIGltcGxlbWVudGF0aW9uIGRldGFpbDoqKiBXaGlsZSBhIGxpc3QgaXMgYmVpbmcgc29ydGVkLFxuICAgIHRoZSBlZmZlY3Qgb2YgYXR0ZW1wdGluZyB0byBtdXRhdGUsIG9yIGV2ZW4gaW5zcGVjdCwgdGhlIGxpc3QgaXNcbiAgICB1bmRlZmluZWQuICBUaGUgQyBpbXBsZW1lbnRhdGlvbiBvZiBQeXRob24gMi4zIGFuZCBuZXdlciBtYWtlcyB0aGVcbiAgICBsaXN0IGFwcGVhciBlbXB0eSBmb3IgdGhlIGR1cmF0aW9uLCBhbmQgcmFpc2VzIGBgVmFsdWVFcnJvcmBgIGlmXG4gICAgaXQgY2FuIGRldGVjdCB0aGF0IHRoZSBsaXN0IGhhcyBiZWVuIG11dGF0ZWQgZHVyaW5nIGEgc29ydC5cbiIsCisgJ3VuYXJ5JzogJ1xuVW5hcnkgYXJpdGhtZXRpYyBhbmQgYml0d2lzZSBvcGVyYXRpb25zXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuQWxsIHVuYXJ5IGFyaXRobWV0aWMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyBoYXZlIHRoZSBzYW1lIHByaW9yaXR5OlxuXG4gICB1X2V4cHIgOjo9IHBvd2VyIHwgIi0iIHVfZXhwciB8ICIrIiB1X2V4cHIgfCAifiIgdV9leHByXG5cblRoZSB1bmFyeSBgYC1gYCAobWludXMpIG9wZXJhdG9yIHlpZWxkcyB0aGUgbmVnYXRpb24gb2YgaXRzIG51bWVyaWNcbmFyZ3VtZW50LlxuXG5UaGUgdW5hcnkgYGArYGAgKHBsdXMpIG9wZXJhdG9yIHlpZWxkcyBpdHMgbnVtZXJpYyBhcmd1bWVudCB1bmNoYW5nZWQuXG5cblRoZSB1bmFyeSBgYH5gYCAoaW52ZXJ0KSBvcGVyYXRvciB5aWVsZHMgdGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mIGl0c1xucGxhaW4gb3IgbG9uZyBpbnRlZ2VyIGFyZ3VtZW50LiAgVGhlIGJpdHdpc2UgaW52ZXJzaW9uIG9mIGBgeGBgIGlzXG5kZWZpbmVkIGFzIGBgLSh4KzEpYGAuICBJdCBvbmx5IGFwcGxpZXMgdG8gaW50ZWdyYWwgbnVtYmVycy5cblxuSW4gYWxsIHRocmVlIGNhc2VzLCBpZiB0aGUgYXJndW1lbnQgZG9lcyBub3QgaGF2ZSB0aGUgcHJvcGVyIHR5cGUsIGFcbmBgVHlwZUVycm9yYGAgZXhjZXB0aW9uIGlzIHJhaXNlZC5cbicsCisgJ3doaWxlJzogJ1xuVGhlIGBgd2hpbGVgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKioqXG5cblRoZSBgYHdoaWxlYGAgc3RhdGVtZW50IGlzIHVzZWQgZm9yIHJlcGVhdGVkIGV4ZWN1dGlvbiBhcyBsb25nIGFzIGFuXG5leHByZXNzaW9uIGlzIHRydWU6XG5cbiAgIHdoaWxlX3N0bXQgOjo9ICJ3aGlsZSIgZXhwcmVzc2lvbiAiOiIgc3VpdGVcbiAgICAgICAgICAgICAgICAgIFsiZWxzZSIgIjoiIHN1aXRlXVxuXG5UaGlzIHJlcGVhdGVkbHkgdGVzdHMgdGhlIGV4cHJlc3Npb24gYW5kLCBpZiBpdCBpcyB0cnVlLCBleGVjdXRlcyB0aGVcbmZpcnN0IHN1aXRlOyBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSAod2hpY2ggbWF5IGJlIHRoZSBmaXJzdCB0aW1lXG5pdCBpcyB0ZXN0ZWQpIHRoZSBzdWl0ZSBvZiB0aGUgYGBlbHNlYGAgY2xhdXNlLCBpZiBwcmVzZW50LCBpc1xuZXhlY3V0ZWQgYW5kIHRoZSBsb29wIHRlcm1pbmF0ZXMuXG5cbkEgYGBicmVha2BgIHN0YXRlbWVudCBleGVjdXRlZCBpbiB0aGUgZmlyc3Qgc3VpdGUgdGVybWluYXRlcyB0aGUgbG9vcFxud2l0aG91dCBleGVjdXRpbmcgdGhlIGBgZWxzZWBgIGNsYXVzZVwncyBzdWl0ZS4gIEEgYGBjb250aW51ZWBgXG5zdGF0ZW1lbnQgZXhlY3V0ZWQgaW4gdGhlIGZpcnN0IHN1aXRlIHNraXBzIHRoZSByZXN0IG9mIHRoZSBzdWl0ZSBhbmRcbmdvZXMgYmFjayB0byB0ZXN0aW5nIHRoZSBleHByZXNzaW9uLlxuJywKKyAnd2l0aCc6ICdcblRoZSBgYHdpdGhgYCBzdGF0ZW1lbnRcbioqKioqKioqKioqKioqKioqKioqKipcblxuTmV3IGluIHZlcnNpb24gMi41LlxuXG5UaGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIHVzZWQgdG8gd3JhcCB0aGUgZXhlY3V0aW9uIG9mIGEgYmxvY2sgd2l0aFxubWV0aG9kcyBkZWZpbmVkIGJ5IGEgY29udGV4dCBtYW5hZ2VyIChzZWUgc2VjdGlvbiAqV2l0aCBTdGF0ZW1lbnRcbkNvbnRleHQgTWFuYWdlcnMqKS4gVGhpcyBhbGxvd3MgY29tbW9uXG5gYHRyeWBgLi4uYGBleGNlcHRgYC4uLmBgZmluYWxseWBgIHVzYWdlIHBhdHRlcm5zIHRvIGJlIGVuY2Fwc3VsYXRlZFxuZm9yIGNvbnZlbmllbnQgcmV1c2UuXG5cbiAgIHdpdGhfc3RtdCA6Oj0gIndpdGgiIHdpdGhfaXRlbSAoIiwiIHdpdGhfaXRlbSkqICI6IiBzdWl0ZVxuICAgd2l0aF9pdGVtIDo6PSBleHByZXNzaW9uIFsiYXMiIHRhcmdldF1cblxuVGhlIGV4ZWN1dGlvbiBvZiB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IHdpdGggb25lICJpdGVtIiBwcm9jZWVkcyBhc1xuZm9sbG93czpcblxuMS4gVGhlIGNvbnRleHQgZXhwcmVzc2lvbiAodGhlIGV4cHJlc3Npb24gZ2l2ZW4gaW4gdGhlIGBgd2l0aF9pdGVtYGApXG4gICBpcyBldmFsdWF0ZWQgdG8gb2J0YWluIGEgY29udGV4dCBtYW5hZ2VyLlxuXG4yLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19leGl0X18oKWBgIGlzIGxvYWRlZCBmb3IgbGF0ZXIgdXNlLlxuXG4zLiBUaGUgY29udGV4dCBtYW5hZ2VyXCdzIGBgX19lbnRlcl9fKClgYCBtZXRob2QgaXMgaW52b2tlZC5cblxuNC4gSWYgYSB0YXJnZXQgd2FzIGluY2x1ZGVkIGluIHRoZSBgYHdpdGhgYCBzdGF0ZW1lbnQsIHRoZSByZXR1cm5cbiAgIHZhbHVlIGZyb20gYGBfX2VudGVyX18oKWBgIGlzIGFzc2lnbmVkIHRvIGl0LlxuXG4gICBOb3RlOiBUaGUgYGB3aXRoYGAgc3RhdGVtZW50IGd1YXJhbnRlZXMgdGhhdCBpZiB0aGUgYGBfX2VudGVyX18oKWBgXG4gICAgIG1ldGhvZCByZXR1cm5zIHdpdGhvdXQgYW4gZXJyb3IsIHRoZW4gYGBfX2V4aXRfXygpYGAgd2lsbCBhbHdheXNcbiAgICAgYmUgY2FsbGVkLiBUaHVzLCBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBhc3NpZ25tZW50IHRvIHRoZVxuICAgICB0YXJnZXQgbGlzdCwgaXQgd2lsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIGFuIGVycm9yIG9jY3VycmluZ1xuICAgICB3aXRoaW4gdGhlIHN1aXRlIHdvdWxkIGJlLiBTZWUgc3RlcCA2IGJlbG93LlxuXG41LiBUaGUgc3VpdGUgaXMgZXhlY3V0ZWQuXG5cbjYuIFRoZSBjb250ZXh0IG1hbmFnZXJcJ3MgYGBfX2V4aXRfXygpYGAgbWV0aG9kIGlzIGludm9rZWQuIElmIGFuXG4gICBleGNlcHRpb24gY2F1c2VkIHRoZSBzdWl0ZSB0byBiZSBleGl0ZWQsIGl0cyB0eXBlLCB2YWx1ZSwgYW5kXG4gICB0cmFjZWJhY2sgYXJlIHBhc3NlZCBhcyBhcmd1bWVudHMgdG8gYGBfX2V4aXRfXygpYGAuIE90aGVyd2lzZSxcbiAgIHRocmVlIGBgTm9uZWBgIGFyZ3VtZW50cyBhcmUgc3VwcGxpZWQuXG5cbiAgIElmIHRoZSBzdWl0ZSB3YXMgZXhpdGVkIGR1ZSB0byBhbiBleGNlcHRpb24sIGFuZCB0aGUgcmV0dXJuIHZhbHVlXG4gICBmcm9tIHRoZSBgYF9fZXhpdF9fKClgYCBtZXRob2Qgd2FzIGZhbHNlLCB0aGUgZXhjZXB0aW9uIGlzXG4gICByZXJhaXNlZC4gSWYgdGhlIHJldHVybiB2YWx1ZSB3YXMgdHJ1ZSwgdGhlIGV4Y2VwdGlvbiBpc1xuICAgc3VwcHJlc3NlZCwgYW5kIGV4ZWN1dGlvbiBjb250aW51ZXMgd2l0aCB0aGUgc3RhdGVtZW50IGZvbGxvd2luZ1xuICAgdGhlIGBgd2l0aGBgIHN0YXRlbWVudC5cblxuICAgSWYgdGhlIHN1aXRlIHdhcyBleGl0ZWQgZm9yIGFueSByZWFzb24gb3RoZXIgdGhhbiBhbiBleGNlcHRpb24sIHRoZVxuICAgcmV0dXJuIHZhbHVlIGZyb20gYGBfX2V4aXRfXygpYGAgaXMgaWdub3JlZCwgYW5kIGV4ZWN1dGlvbiBwcm9jZWVkc1xuICAgYXQgdGhlIG5vcm1hbCBsb2NhdGlvbiBmb3IgdGhlIGtpbmQgb2YgZXhpdCB0aGF0IHdhcyB0YWtlbi5cblxuV2l0aCBtb3JlIHRoYW4gb25lIGl0ZW0sIHRoZSBjb250ZXh0IG1hbmFnZXJzIGFyZSBwcm9jZXNzZWQgYXMgaWZcbm11bHRpcGxlIGBgd2l0aGBgIHN0YXRlbWVudHMgd2VyZSBuZXN0ZWQ6XG5cbiAgIHdpdGggQSgpIGFzIGEsIEIoKSBhcyBiOlxuICAgICAgIHN1aXRlXG5cbmlzIGVxdWl2YWxlbnQgdG9cblxuICAgd2l0aCBBKCkgYXMgYTpcbiAgICAgICB3aXRoIEIoKSBhcyBiOlxuICAgICAgICAgICBzdWl0ZVxuXG5Ob3RlOiBJbiBQeXRob24gMi41LCB0aGUgYGB3aXRoYGAgc3RhdGVtZW50IGlzIG9ubHkgYWxsb3dlZCB3aGVuIHRoZVxuICBgYHdpdGhfc3RhdGVtZW50YGAgZmVhdHVyZSBoYXMgYmVlbiBlbmFibGVkLiAgSXQgaXMgYWx3YXlzIGVuYWJsZWRcbiAgaW4gUHl0aG9uIDIuNi5cblxuQ2hhbmdlZCBpbiB2ZXJzaW9uIDIuNzogU3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGV4dCBleHByZXNzaW9ucy5cblxuU2VlIGFsc286XG5cbiAgICoqUEVQIDAzNDMqKiAtIFRoZSAid2l0aCIgc3RhdGVtZW50XG4gICAgICBUaGUgc3BlY2lmaWNhdGlvbiwgYmFja2dyb3VuZCwgYW5kIGV4YW1wbGVzIGZvciB0aGUgUHl0aG9uXG4gICAgICBgYHdpdGhgYCBzdGF0ZW1lbnQuXG4nLAorICd5aWVsZCc6ICdcblRoZSBgYHlpZWxkYGAgc3RhdGVtZW50XG4qKioqKioqKioqKioqKioqKioqKioqKlxuXG4gICB5aWVsZF9zdG10IDo6PSB5aWVsZF9leHByZXNzaW9uXG5cblRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IGlzIG9ubHkgdXNlZCB3aGVuIGRlZmluaW5nIGEgZ2VuZXJhdG9yXG5mdW5jdGlvbiwgYW5kIGlzIG9ubHkgdXNlZCBpbiB0aGUgYm9keSBvZiB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLlxuVXNpbmcgYSBgYHlpZWxkYGAgc3RhdGVtZW50IGluIGEgZnVuY3Rpb24gZGVmaW5pdGlvbiBpcyBzdWZmaWNpZW50IHRvXG5jYXVzZSB0aGF0IGRlZmluaXRpb24gdG8gY3JlYXRlIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluc3RlYWQgb2YgYVxubm9ybWFsIGZ1bmN0aW9uLlxuXG5XaGVuIGEgZ2VuZXJhdG9yIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQgcmV0dXJucyBhbiBpdGVyYXRvciBrbm93biBhcyBhXG5nZW5lcmF0b3IgaXRlcmF0b3IsIG9yIG1vcmUgY29tbW9ubHksIGEgZ2VuZXJhdG9yLiAgVGhlIGJvZHkgb2YgdGhlXG5nZW5lcmF0b3IgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgYnkgY2FsbGluZyB0aGUgZ2VuZXJhdG9yXCdzIGBgbmV4dCgpYGBcbm1ldGhvZCByZXBlYXRlZGx5IHVudGlsIGl0IHJhaXNlcyBhbiBleGNlcHRpb24uXG5cbldoZW4gYSBgYHlpZWxkYGAgc3RhdGVtZW50IGlzIGV4ZWN1dGVkLCB0aGUgc3RhdGUgb2YgdGhlIGdlbmVyYXRvciBpc1xuZnJvemVuIGFuZCB0aGUgdmFsdWUgb2YgYGBleHByZXNzaW9uX2xpc3RgYCBpcyByZXR1cm5lZCB0b1xuYGBuZXh0KClgYFwncyBjYWxsZXIuICBCeSAiZnJvemVuIiB3ZSBtZWFuIHRoYXQgYWxsIGxvY2FsIHN0YXRlIGlzXG5yZXRhaW5lZCwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGJpbmRpbmdzIG9mIGxvY2FsIHZhcmlhYmxlcywgdGhlXG5pbnN0cnVjdGlvbiBwb2ludGVyLCBhbmQgdGhlIGludGVybmFsIGV2YWx1YXRpb24gc3RhY2s6IGVub3VnaFxuaW5mb3JtYXRpb24gaXMgc2F2ZWQgc28gdGhhdCB0aGUgbmV4dCB0aW1lIGBgbmV4dCgpYGAgaXMgaW52b2tlZCwgdGhlXG5mdW5jdGlvbiBjYW4gcHJvY2VlZCBleGFjdGx5IGFzIGlmIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IHdlcmUganVzdFxuYW5vdGhlciBleHRlcm5hbCBjYWxsLlxuXG5BcyBvZiBQeXRob24gdmVyc2lvbiAyLjUsIHRoZSBgYHlpZWxkYGAgc3RhdGVtZW50IGlzIG5vdyBhbGxvd2VkIGluXG50aGUgYGB0cnlgYCBjbGF1c2Ugb2YgYSBgYHRyeWBgIC4uLiAgYGBmaW5hbGx5YGAgY29uc3RydWN0LiAgSWYgdGhlXG5nZW5lcmF0b3IgaXMgbm90IHJlc3VtZWQgYmVmb3JlIGl0IGlzIGZpbmFsaXplZCAoYnkgcmVhY2hpbmcgYSB6ZXJvXG5yZWZlcmVuY2UgY291bnQgb3IgYnkgYmVpbmcgZ2FyYmFnZSBjb2xsZWN0ZWQpLCB0aGUgZ2VuZXJhdG9yLVxuaXRlcmF0b3JcJ3MgYGBjbG9zZSgpYGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkLCBhbGxvd2luZyBhbnkgcGVuZGluZ1xuYGBmaW5hbGx5YGAgY2xhdXNlcyB0byBleGVjdXRlLlxuXG5Gb3IgZnVsbCBkZXRhaWxzIG9mIGBgeWllbGRgYCBzZW1hbnRpY3MsIHJlZmVyIHRvIHRoZSAqWWllbGRcbmV4cHJlc3Npb25zKiBzZWN0aW9uLlxuXG5Ob3RlOiBJbiBQeXRob24gMi4yLCB0aGUgYGB5aWVsZGBgIHN0YXRlbWVudCB3YXMgb25seSBhbGxvd2VkIHdoZW4gdGhlXG4gIGBgZ2VuZXJhdG9yc2BgIGZlYXR1cmUgaGFzIGJlZW4gZW5hYmxlZC4gIFRoaXMgYGBfX2Z1dHVyZV9fYGAgaW1wb3J0XG4gIHN0YXRlbWVudCB3YXMgdXNlZCB0byBlbmFibGUgdGhlIGZlYXR1cmU6XG5cbiAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBnZW5lcmF0b3JzXG5cblNlZSBhbHNvOlxuXG4gICAqKlBFUCAwMjU1KiogLSBTaW1wbGUgR2VuZXJhdG9yc1xuICAgICAgVGhlIHByb3Bvc2FsIGZvciBhZGRpbmcgZ2VuZXJhdG9ycyBhbmQgdGhlIGBgeWllbGRgYCBzdGF0ZW1lbnRcbiAgICAgIHRvIFB5dGhvbi5cblxuICAgKipQRVAgMDM0MioqIC0gQ29yb3V0aW5lcyB2aWEgRW5oYW5jZWQgR2VuZXJhdG9yc1xuICAgICAgVGhlIHByb3Bvc2FsIHRoYXQsIGFtb25nIG90aGVyIGdlbmVyYXRvciBlbmhhbmNlbWVudHMsIHByb3Bvc2VkXG4gICAgICBhbGxvd2luZyBgYHlpZWxkYGAgdG8gYXBwZWFyIGluc2lkZSBhIGBgdHJ5YGAgLi4uIGBgZmluYWxseWBgXG4gICAgICBibG9jay5cbid9CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvdG9waWNzLnB5YyBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOWFjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvdG9waWNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvdG9waWNzLnB5byBiL2xpYi9weXRob24yLjcvcHlkb2NfZGF0YS90b3BpY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOWFjYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3B5ZG9jX2RhdGEvdG9waWNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3F1b3ByaS5weSBiL2xpYi9weXRob24yLjcvcXVvcHJpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3ODhhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3F1b3ByaS5weQpAQCAtMCwwICsxLDIzNyBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJDb252ZXJzaW9ucyB0by9mcm9tIHF1b3RlZC1wcmludGFibGUgdHJhbnNwb3J0IGVuY29kaW5nIGFzIHBlciBSRkMgMTUyMS4iIiIKKworIyAoRGVjIDE5OTEgdmVyc2lvbikuCisKK19fYWxsX18gPSBbImVuY29kZSIsICJkZWNvZGUiLCAiZW5jb2Rlc3RyaW5nIiwgImRlY29kZXN0cmluZyJdCisKK0VTQ0FQRSA9ICc9JworTUFYTElORVNJWkUgPSA3NgorSEVYID0gJzAxMjM0NTY3ODlBQkNERUYnCitFTVBUWVNUUklORyA9ICcnCisKK3RyeToKKyAgICBmcm9tIGJpbmFzY2lpIGltcG9ydCBhMmJfcXAsIGIyYV9xcAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGEyYl9xcCA9IE5vbmUKKyAgICBiMmFfcXAgPSBOb25lCisKKworZGVmIG5lZWRzcXVvdGluZyhjLCBxdW90ZXRhYnMsIGhlYWRlcik6CisgICAgIiIiRGVjaWRlIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGNoYXJhY3RlciBuZWVkcyB0byBiZSBxdW90ZWQuCisKKyAgICBUaGUgJ3F1b3RldGFicycgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBlbWJlZGRlZCB0YWJzIGFuZCBzcGFjZXMgc2hvdWxkIGJlCisgICAgcXVvdGVkLiAgTm90ZSB0aGF0IGxpbmUtZW5kaW5nIHRhYnMgYW5kIHNwYWNlcyBhcmUgYWx3YXlzIGVuY29kZWQsIGFzIHBlcgorICAgIFJGQyAxNTIxLgorICAgICIiIgorICAgIGlmIGMgaW4gJyBcdCc6CisgICAgICAgIHJldHVybiBxdW90ZXRhYnMKKyAgICAjIGlmIGhlYWRlciwgd2UgaGF2ZSB0byBlc2NhcGUgXyBiZWNhdXNlIF8gaXMgdXNlZCB0byBlc2NhcGUgc3BhY2UKKyAgICBpZiBjID09ICdfJzoKKyAgICAgICAgcmV0dXJuIGhlYWRlcgorICAgIHJldHVybiBjID09IEVTQ0FQRSBvciBub3QgKCcgJyA8PSBjIDw9ICd+JykKKworZGVmIHF1b3RlKGMpOgorICAgICIiIlF1b3RlIGEgc2luZ2xlIGNoYXJhY3Rlci4iIiIKKyAgICBpID0gb3JkKGMpCisgICAgcmV0dXJuIEVTQ0FQRSArIEhFWFtpLy8xNl0gKyBIRVhbaSUxNl0KKworCisKK2RlZiBlbmNvZGUoaW5wdXQsIG91dHB1dCwgcXVvdGV0YWJzLCBoZWFkZXIgPSAwKToKKyAgICAiIiJSZWFkICdpbnB1dCcsIGFwcGx5IHF1b3RlZC1wcmludGFibGUgZW5jb2RpbmcsIGFuZCB3cml0ZSB0byAnb3V0cHV0Jy4KKworICAgICdpbnB1dCcgYW5kICdvdXRwdXQnIGFyZSBmaWxlcyB3aXRoIHJlYWRsaW5lKCkgYW5kIHdyaXRlKCkgbWV0aG9kcy4KKyAgICBUaGUgJ3F1b3RldGFicycgZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBlbWJlZGRlZCB0YWJzIGFuZCBzcGFjZXMgc2hvdWxkIGJlCisgICAgcXVvdGVkLiAgTm90ZSB0aGF0IGxpbmUtZW5kaW5nIHRhYnMgYW5kIHNwYWNlcyBhcmUgYWx3YXlzIGVuY29kZWQsIGFzIHBlcgorICAgIFJGQyAxNTIxLgorICAgIFRoZSAnaGVhZGVyJyBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIGFyZSBlbmNvZGluZyBzcGFjZXMgYXMgXyBhcyBwZXIKKyAgICBSRkMgMTUyMi4KKyAgICAiIiIKKworICAgIGlmIGIyYV9xcCBpcyBub3QgTm9uZToKKyAgICAgICAgZGF0YSA9IGlucHV0LnJlYWQoKQorICAgICAgICBvZGF0YSA9IGIyYV9xcChkYXRhLCBxdW90ZXRhYnMgPSBxdW90ZXRhYnMsIGhlYWRlciA9IGhlYWRlcikKKyAgICAgICAgb3V0cHV0LndyaXRlKG9kYXRhKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiB3cml0ZShzLCBvdXRwdXQ9b3V0cHV0LCBsaW5lRW5kPSdcbicpOgorICAgICAgICAjIFJGQyAxNTIxIHJlcXVpcmVzIHRoYXQgdGhlIGxpbmUgZW5kaW5nIGluIGEgc3BhY2Ugb3IgdGFiIG11c3QgaGF2ZQorICAgICAgICAjIHRoYXQgdHJhaWxpbmcgY2hhcmFjdGVyIGVuY29kZWQuCisgICAgICAgIGlmIHMgYW5kIHNbLTE6XSBpbiAnIFx0JzoKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShzWzotMV0gKyBxdW90ZShzWy0xXSkgKyBsaW5lRW5kKQorICAgICAgICBlbGlmIHMgPT0gJy4nOgorICAgICAgICAgICAgb3V0cHV0LndyaXRlKHF1b3RlKHMpICsgbGluZUVuZCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShzICsgbGluZUVuZCkKKworICAgIHByZXZsaW5lID0gTm9uZQorICAgIHdoaWxlIDE6CisgICAgICAgIGxpbmUgPSBpbnB1dC5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgb3V0bGluZSA9IFtdCisgICAgICAgICMgU3RyaXAgb2ZmIGFueSByZWFkbGluZSBpbmR1Y2VkIHRyYWlsaW5nIG5ld2xpbmUKKyAgICAgICAgc3RyaXBwZWQgPSAnJworICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzoKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lWzotMV0KKyAgICAgICAgICAgIHN0cmlwcGVkID0gJ1xuJworICAgICAgICAjIENhbGN1bGF0ZSB0aGUgdW4tbGVuZ3RoLWxpbWl0ZWQgZW5jb2RlZCBsaW5lCisgICAgICAgIGZvciBjIGluIGxpbmU6CisgICAgICAgICAgICBpZiBuZWVkc3F1b3RpbmcoYywgcXVvdGV0YWJzLCBoZWFkZXIpOgorICAgICAgICAgICAgICAgIGMgPSBxdW90ZShjKQorICAgICAgICAgICAgaWYgaGVhZGVyIGFuZCBjID09ICcgJzoKKyAgICAgICAgICAgICAgICBvdXRsaW5lLmFwcGVuZCgnXycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG91dGxpbmUuYXBwZW5kKGMpCisgICAgICAgICMgRmlyc3QsIHdyaXRlIG91dCB0aGUgcHJldmlvdXMgbGluZQorICAgICAgICBpZiBwcmV2bGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdyaXRlKHByZXZsaW5lKQorICAgICAgICAjIE5vdyBzZWUgaWYgd2UgbmVlZCBhbnkgc29mdCBsaW5lIGJyZWFrcyBiZWNhdXNlIG9mIFJGQy1pbXBvc2VkCisgICAgICAgICMgbGVuZ3RoIGxpbWl0YXRpb25zLiAgVGhlbiBkbyB0aGUgdGhpc2xpbmUtPnByZXZsaW5lIGRhbmNlLgorICAgICAgICB0aGlzbGluZSA9IEVNUFRZU1RSSU5HLmpvaW4ob3V0bGluZSkKKyAgICAgICAgd2hpbGUgbGVuKHRoaXNsaW5lKSA+IE1BWExJTkVTSVpFOgorICAgICAgICAgICAgIyBEb24ndCBmb3JnZXQgdG8gaW5jbHVkZSB0aGUgc29mdCBsaW5lIGJyZWFrIGA9JyBzaWduIGluIHRoZQorICAgICAgICAgICAgIyBsZW5ndGggY2FsY3VsYXRpb24hCisgICAgICAgICAgICB3cml0ZSh0aGlzbGluZVs6TUFYTElORVNJWkUtMV0sIGxpbmVFbmQ9Jz1cbicpCisgICAgICAgICAgICB0aGlzbGluZSA9IHRoaXNsaW5lW01BWExJTkVTSVpFLTE6XQorICAgICAgICAjIFdyaXRlIG91dCB0aGUgY3VycmVudCBsaW5lCisgICAgICAgIHByZXZsaW5lID0gdGhpc2xpbmUKKyAgICAjIFdyaXRlIG91dCB0aGUgbGFzdCBsaW5lLCB3aXRob3V0IGEgdHJhaWxpbmcgbmV3bGluZQorICAgIGlmIHByZXZsaW5lIGlzIG5vdCBOb25lOgorICAgICAgICB3cml0ZShwcmV2bGluZSwgbGluZUVuZD1zdHJpcHBlZCkKKworZGVmIGVuY29kZXN0cmluZyhzLCBxdW90ZXRhYnMgPSAwLCBoZWFkZXIgPSAwKToKKyAgICBpZiBiMmFfcXAgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiBiMmFfcXAocywgcXVvdGV0YWJzID0gcXVvdGV0YWJzLCBoZWFkZXIgPSBoZWFkZXIpCisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgaW5mcCA9IFN0cmluZ0lPKHMpCisgICAgb3V0ZnAgPSBTdHJpbmdJTygpCisgICAgZW5jb2RlKGluZnAsIG91dGZwLCBxdW90ZXRhYnMsIGhlYWRlcikKKyAgICByZXR1cm4gb3V0ZnAuZ2V0dmFsdWUoKQorCisKKworZGVmIGRlY29kZShpbnB1dCwgb3V0cHV0LCBoZWFkZXIgPSAwKToKKyAgICAiIiJSZWFkICdpbnB1dCcsIGFwcGx5IHF1b3RlZC1wcmludGFibGUgZGVjb2RpbmcsIGFuZCB3cml0ZSB0byAnb3V0cHV0Jy4KKyAgICAnaW5wdXQnIGFuZCAnb3V0cHV0JyBhcmUgZmlsZXMgd2l0aCByZWFkbGluZSgpIGFuZCB3cml0ZSgpIG1ldGhvZHMuCisgICAgSWYgJ2hlYWRlcicgaXMgdHJ1ZSwgZGVjb2RlIHVuZGVyc2NvcmUgYXMgc3BhY2UgKHBlciBSRkMgMTUyMikuIiIiCisKKyAgICBpZiBhMmJfcXAgaXMgbm90IE5vbmU6CisgICAgICAgIGRhdGEgPSBpbnB1dC5yZWFkKCkKKyAgICAgICAgb2RhdGEgPSBhMmJfcXAoZGF0YSwgaGVhZGVyID0gaGVhZGVyKQorICAgICAgICBvdXRwdXQud3JpdGUob2RhdGEpCisgICAgICAgIHJldHVybgorCisgICAgbmV3ID0gJycKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gaW5wdXQucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgaSwgbiA9IDAsIGxlbihsaW5lKQorICAgICAgICBpZiBuID4gMCBhbmQgbGluZVtuLTFdID09ICdcbic6CisgICAgICAgICAgICBwYXJ0aWFsID0gMDsgbiA9IG4tMQorICAgICAgICAgICAgIyBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlCisgICAgICAgICAgICB3aGlsZSBuID4gMCBhbmQgbGluZVtuLTFdIGluICIgXHRcciI6CisgICAgICAgICAgICAgICAgbiA9IG4tMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFydGlhbCA9IDEKKyAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICBjID0gbGluZVtpXQorICAgICAgICAgICAgaWYgYyA9PSAnXycgYW5kIGhlYWRlcjoKKyAgICAgICAgICAgICAgICBuZXcgPSBuZXcgKyAnICc7IGkgPSBpKzEKKyAgICAgICAgICAgIGVsaWYgYyAhPSBFU0NBUEU6CisgICAgICAgICAgICAgICAgbmV3ID0gbmV3ICsgYzsgaSA9IGkrMQorICAgICAgICAgICAgZWxpZiBpKzEgPT0gbiBhbmQgbm90IHBhcnRpYWw6CisgICAgICAgICAgICAgICAgcGFydGlhbCA9IDE7IGJyZWFrCisgICAgICAgICAgICBlbGlmIGkrMSA8IG4gYW5kIGxpbmVbaSsxXSA9PSBFU0NBUEU6CisgICAgICAgICAgICAgICAgbmV3ID0gbmV3ICsgRVNDQVBFOyBpID0gaSsyCisgICAgICAgICAgICBlbGlmIGkrMiA8IG4gYW5kIGlzaGV4KGxpbmVbaSsxXSkgYW5kIGlzaGV4KGxpbmVbaSsyXSk6CisgICAgICAgICAgICAgICAgbmV3ID0gbmV3ICsgY2hyKHVuaGV4KGxpbmVbaSsxOmkrM10pKTsgaSA9IGkrMworICAgICAgICAgICAgZWxzZTogIyBCYWQgZXNjYXBlIHNlcXVlbmNlIC0tIGxlYXZlIGl0IGluCisgICAgICAgICAgICAgICAgbmV3ID0gbmV3ICsgYzsgaSA9IGkrMQorICAgICAgICBpZiBub3QgcGFydGlhbDoKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShuZXcgKyAnXG4nKQorICAgICAgICAgICAgbmV3ID0gJycKKyAgICBpZiBuZXc6CisgICAgICAgIG91dHB1dC53cml0ZShuZXcpCisKK2RlZiBkZWNvZGVzdHJpbmcocywgaGVhZGVyID0gMCk6CisgICAgaWYgYTJiX3FwIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gYTJiX3FwKHMsIGhlYWRlciA9IGhlYWRlcikKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBpbmZwID0gU3RyaW5nSU8ocykKKyAgICBvdXRmcCA9IFN0cmluZ0lPKCkKKyAgICBkZWNvZGUoaW5mcCwgb3V0ZnAsIGhlYWRlciA9IGhlYWRlcikKKyAgICByZXR1cm4gb3V0ZnAuZ2V0dmFsdWUoKQorCisKKworIyBPdGhlciBoZWxwZXIgZnVuY3Rpb25zCitkZWYgaXNoZXgoYyk6CisgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIGNoYXJhY3RlciAnYycgaXMgYSBoZXhhZGVjaW1hbCBkaWdpdC4iIiIKKyAgICByZXR1cm4gJzAnIDw9IGMgPD0gJzknIG9yICdhJyA8PSBjIDw9ICdmJyBvciAnQScgPD0gYyA8PSAnRicKKworZGVmIHVuaGV4KHMpOgorICAgICIiIkdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiBhIGhleGFkZWNpbWFsIG51bWJlci4iIiIKKyAgICBiaXRzID0gMAorICAgIGZvciBjIGluIHM6CisgICAgICAgIGlmICcwJyA8PSBjIDw9ICc5JzoKKyAgICAgICAgICAgIGkgPSBvcmQoJzAnKQorICAgICAgICBlbGlmICdhJyA8PSBjIDw9ICdmJzoKKyAgICAgICAgICAgIGkgPSBvcmQoJ2EnKS0xMAorICAgICAgICBlbGlmICdBJyA8PSBjIDw9ICdGJzoKKyAgICAgICAgICAgIGkgPSBvcmQoJ0EnKS0xMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgYml0cyA9IGJpdHMqMTYgKyAob3JkKGMpIC0gaSkKKyAgICByZXR1cm4gYml0cworCisKKworZGVmIG1haW4oKToKKyAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IGdldG9wdAorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAndGQnKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5zdGRlcnIKKyAgICAgICAgcHJpbnQgbXNnCisgICAgICAgIHByaW50ICJ1c2FnZTogcXVvcHJpIFstdCB8IC1kXSBbZmlsZV0gLi4uIgorICAgICAgICBwcmludCAiLXQ6IHF1b3RlIHRhYnMiCisgICAgICAgIHByaW50ICItZDogZGVjb2RlOyBkZWZhdWx0IGVuY29kZSIKKyAgICAgICAgc3lzLmV4aXQoMikKKyAgICBkZWNvID0gMAorICAgIHRhYnMgPSAwCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLXQnOiB0YWJzID0gMQorICAgICAgICBpZiBvID09ICctZCc6IGRlY28gPSAxCisgICAgaWYgdGFicyBhbmQgZGVjbzoKKyAgICAgICAgc3lzLnN0ZG91dCA9IHN5cy5zdGRlcnIKKyAgICAgICAgcHJpbnQgIi10IGFuZCAtZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIgorICAgICAgICBzeXMuZXhpdCgyKQorICAgIGlmIG5vdCBhcmdzOiBhcmdzID0gWyctJ10KKyAgICBzdHMgPSAwCisgICAgZm9yIGZpbGUgaW4gYXJnczoKKyAgICAgICAgaWYgZmlsZSA9PSAnLSc6CisgICAgICAgICAgICBmcCA9IHN5cy5zdGRpbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihmaWxlKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIlczogY2FuJ3Qgb3BlbiAoJXMpXG4iICUgKGZpbGUsIG1zZykpCisgICAgICAgICAgICAgICAgc3RzID0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGRlY286CisgICAgICAgICAgICBkZWNvZGUoZnAsIHN5cy5zdGRvdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGUoZnAsIHN5cy5zdGRvdXQsIHRhYnMpCisgICAgICAgIGlmIGZwIGlzIG5vdCBzeXMuc3RkaW46CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgaWYgc3RzOgorICAgICAgICBzeXMuZXhpdChzdHMpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9xdW9wcmkucHljIGIvbGliL3B5dGhvbjIuNy9xdW9wcmkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODhhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3F1b3ByaS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9xdW9wcmkucHlvIGIvbGliL3B5dGhvbjIuNy9xdW9wcmkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODhhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3F1b3ByaS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yYW5kb20ucHkgYi9saWIvcHl0aG9uMi43L3JhbmRvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0YWIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yYW5kb20ucHkKQEAgLTAsMCArMSw5MDQgQEAKKyIiIlJhbmRvbSB2YXJpYWJsZSBnZW5lcmF0b3JzLgorCisgICAgaW50ZWdlcnMKKyAgICAtLS0tLS0tLQorICAgICAgICAgICB1bmlmb3JtIHdpdGhpbiByYW5nZQorCisgICAgc2VxdWVuY2VzCisgICAgLS0tLS0tLS0tCisgICAgICAgICAgIHBpY2sgcmFuZG9tIGVsZW1lbnQKKyAgICAgICAgICAgcGljayByYW5kb20gc2FtcGxlCisgICAgICAgICAgIGdlbmVyYXRlIHJhbmRvbSBwZXJtdXRhdGlvbgorCisgICAgZGlzdHJpYnV0aW9ucyBvbiB0aGUgcmVhbCBsaW5lOgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICB1bmlmb3JtCisgICAgICAgICAgIHRyaWFuZ3VsYXIKKyAgICAgICAgICAgbm9ybWFsIChHYXVzc2lhbikKKyAgICAgICAgICAgbG9nbm9ybWFsCisgICAgICAgICAgIG5lZ2F0aXZlIGV4cG9uZW50aWFsCisgICAgICAgICAgIGdhbW1hCisgICAgICAgICAgIGJldGEKKyAgICAgICAgICAgcGFyZXRvCisgICAgICAgICAgIFdlaWJ1bGwKKworICAgIGRpc3RyaWJ1dGlvbnMgb24gdGhlIGNpcmNsZSAoYW5nbGVzIDAgdG8gMnBpKQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICBjaXJjdWxhciB1bmlmb3JtCisgICAgICAgICAgIHZvbiBNaXNlcworCitHZW5lcmFsIG5vdGVzIG9uIHRoZSB1bmRlcmx5aW5nIE1lcnNlbm5lIFR3aXN0ZXIgY29yZSBnZW5lcmF0b3I6CisKKyogVGhlIHBlcmlvZCBpcyAyKioxOTkzNy0xLgorKiBJdCBpcyBvbmUgb2YgdGhlIG1vc3QgZXh0ZW5zaXZlbHkgdGVzdGVkIGdlbmVyYXRvcnMgaW4gZXhpc3RlbmNlLgorKiBXaXRob3V0IGEgZGlyZWN0IHdheSB0byBjb21wdXRlIE4gc3RlcHMgZm9yd2FyZCwgdGhlIHNlbWFudGljcyBvZgorICBqdW1wYWhlYWQobikgYXJlIHdlYWtlbmVkIHRvIHNpbXBseSBqdW1wIHRvIGFub3RoZXIgZGlzdGFudCBzdGF0ZSBhbmQgcmVseQorICBvbiB0aGUgbGFyZ2UgcGVyaW9kIHRvIGF2b2lkIG92ZXJsYXBwaW5nIHNlcXVlbmNlcy4KKyogVGhlIHJhbmRvbSgpIG1ldGhvZCBpcyBpbXBsZW1lbnRlZCBpbiBDLCBleGVjdXRlcyBpbiBhIHNpbmdsZSBQeXRob24gc3RlcCwKKyAgYW5kIGlzLCB0aGVyZWZvcmUsIHRocmVhZHNhZmUuCisKKyIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuIGFzIF93YXJuCitmcm9tIHR5cGVzIGltcG9ydCBNZXRob2RUeXBlIGFzIF9NZXRob2RUeXBlLCBCdWlsdGluTWV0aG9kVHlwZSBhcyBfQnVpbHRpbk1ldGhvZFR5cGUKK2Zyb20gbWF0aCBpbXBvcnQgbG9nIGFzIF9sb2csIGV4cCBhcyBfZXhwLCBwaSBhcyBfcGksIGUgYXMgX2UsIGNlaWwgYXMgX2NlaWwKK2Zyb20gbWF0aCBpbXBvcnQgc3FydCBhcyBfc3FydCwgYWNvcyBhcyBfYWNvcywgY29zIGFzIF9jb3MsIHNpbiBhcyBfc2luCitmcm9tIG9zIGltcG9ydCB1cmFuZG9tIGFzIF91cmFuZG9tCitmcm9tIGJpbmFzY2lpIGltcG9ydCBoZXhsaWZ5IGFzIF9oZXhsaWZ5CitpbXBvcnQgaGFzaGxpYiBhcyBfaGFzaGxpYgorCitfX2FsbF9fID0gWyJSYW5kb20iLCJzZWVkIiwicmFuZG9tIiwidW5pZm9ybSIsInJhbmRpbnQiLCJjaG9pY2UiLCJzYW1wbGUiLAorICAgICAgICAgICAicmFuZHJhbmdlIiwic2h1ZmZsZSIsIm5vcm1hbHZhcmlhdGUiLCJsb2dub3JtdmFyaWF0ZSIsCisgICAgICAgICAgICJleHBvdmFyaWF0ZSIsInZvbm1pc2VzdmFyaWF0ZSIsImdhbW1hdmFyaWF0ZSIsInRyaWFuZ3VsYXIiLAorICAgICAgICAgICAiZ2F1c3MiLCJiZXRhdmFyaWF0ZSIsInBhcmV0b3ZhcmlhdGUiLCJ3ZWlidWxsdmFyaWF0ZSIsCisgICAgICAgICAgICJnZXRzdGF0ZSIsInNldHN0YXRlIiwianVtcGFoZWFkIiwgIldpY2htYW5uSGlsbCIsICJnZXRyYW5kYml0cyIsCisgICAgICAgICAgICJTeXN0ZW1SYW5kb20iXQorCitOVl9NQUdJQ0NPTlNUID0gNCAqIF9leHAoLTAuNSkvX3NxcnQoMi4wKQorVFdPUEkgPSAyLjAqX3BpCitMT0c0ID0gX2xvZyg0LjApCitTR19NQUdJQ0NPTlNUID0gMS4wICsgX2xvZyg0LjUpCitCUEYgPSA1MyAgICAgICAgIyBOdW1iZXIgb2YgYml0cyBpbiBhIGZsb2F0CitSRUNJUF9CUEYgPSAyKiotQlBGCisKKworIyBUcmFuc2xhdGVkIGJ5IEd1aWRvIHZhbiBSb3NzdW0gZnJvbSBDIHNvdXJjZSBwcm92aWRlZCBieQorIyBBZHJpYW4gQmFkZGVsZXkuICBBZGFwdGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyIGZvciB1c2Ugd2l0aAorIyB0aGUgTWVyc2VubmUgVHdpc3RlciAgYW5kIG9zLnVyYW5kb20oKSBjb3JlIGdlbmVyYXRvcnMuCisKK2ltcG9ydCBfcmFuZG9tCisKK2NsYXNzIFJhbmRvbShfcmFuZG9tLlJhbmRvbSk6CisgICAgIiIiUmFuZG9tIG51bWJlciBnZW5lcmF0b3IgYmFzZSBjbGFzcyB1c2VkIGJ5IGJvdW5kIG1vZHVsZSBmdW5jdGlvbnMuCisKKyAgICBVc2VkIHRvIGluc3RhbnRpYXRlIGluc3RhbmNlcyBvZiBSYW5kb20gdG8gZ2V0IGdlbmVyYXRvcnMgdGhhdCBkb24ndAorICAgIHNoYXJlIHN0YXRlLiAgRXNwZWNpYWxseSB1c2VmdWwgZm9yIG11bHRpLXRocmVhZGVkIHByb2dyYW1zLCBjcmVhdGluZworICAgIGEgZGlmZmVyZW50IGluc3RhbmNlIG9mIFJhbmRvbSBmb3IgZWFjaCB0aHJlYWQsIGFuZCB1c2luZyB0aGUganVtcGFoZWFkKCkKKyAgICBtZXRob2QgdG8gZW5zdXJlIHRoYXQgdGhlIGdlbmVyYXRlZCBzZXF1ZW5jZXMgc2VlbiBieSBlYWNoIHRocmVhZCBkb24ndAorICAgIG92ZXJsYXAuCisKKyAgICBDbGFzcyBSYW5kb20gY2FuIGFsc28gYmUgc3ViY2xhc3NlZCBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgYmFzaWMKKyAgICBnZW5lcmF0b3Igb2YgeW91ciBvd24gZGV2aXNpbmc6IGluIHRoYXQgY2FzZSwgb3ZlcnJpZGUgdGhlIGZvbGxvd2luZworICAgIG1ldGhvZHM6IHJhbmRvbSgpLCBzZWVkKCksIGdldHN0YXRlKCksIHNldHN0YXRlKCkgYW5kIGp1bXBhaGVhZCgpLgorICAgIE9wdGlvbmFsbHksIGltcGxlbWVudCBhIGdldHJhbmRiaXRzKCkgbWV0aG9kIHNvIHRoYXQgcmFuZHJhbmdlKCkgY2FuIGNvdmVyCisgICAgYXJiaXRyYXJpbHkgbGFyZ2UgcmFuZ2VzLgorCisgICAgIiIiCisKKyAgICBWRVJTSU9OID0gMyAgICAgIyB1c2VkIGJ5IGdldHN0YXRlL3NldHN0YXRlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgeD1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhbiBpbnN0YW5jZS4KKworICAgICAgICBPcHRpb25hbCBhcmd1bWVudCB4IGNvbnRyb2xzIHNlZWRpbmcsIGFzIGZvciBSYW5kb20uc2VlZCgpLgorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnNlZWQoeCkKKyAgICAgICAgc2VsZi5nYXVzc19uZXh0ID0gTm9uZQorCisgICAgZGVmIHNlZWQoc2VsZiwgYT1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZSBmcm9tIGhhc2hhYmxlIG9iamVjdC4KKworICAgICAgICBOb25lIG9yIG5vIGFyZ3VtZW50IHNlZWRzIGZyb20gY3VycmVudCB0aW1lIG9yIGZyb20gYW4gb3BlcmF0aW5nCisgICAgICAgIHN5c3RlbSBzcGVjaWZpYyByYW5kb21uZXNzIHNvdXJjZSBpZiBhdmFpbGFibGUuCisKKyAgICAgICAgSWYgYSBpcyBub3QgTm9uZSBvciBhbiBpbnQgb3IgbG9uZywgaGFzaChhKSBpcyB1c2VkIGluc3RlYWQuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGEgaXMgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhID0gbG9uZyhfaGV4bGlmeShfdXJhbmRvbSgxNikpLCAxNikKKyAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgICAgICAgICAgYSA9IGxvbmcodGltZS50aW1lKCkgKiAyNTYpICMgdXNlIGZyYWN0aW9uYWwgc2Vjb25kcworCisgICAgICAgIHN1cGVyKFJhbmRvbSwgc2VsZikuc2VlZChhKQorICAgICAgICBzZWxmLmdhdXNzX25leHQgPSBOb25lCisKKyAgICBkZWYgZ2V0c3RhdGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBpbnRlcm5hbCBzdGF0ZTsgY2FuIGJlIHBhc3NlZCB0byBzZXRzdGF0ZSgpIGxhdGVyLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5WRVJTSU9OLCBzdXBlcihSYW5kb20sIHNlbGYpLmdldHN0YXRlKCksIHNlbGYuZ2F1c3NfbmV4dAorCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgIiIiUmVzdG9yZSBpbnRlcm5hbCBzdGF0ZSBmcm9tIG9iamVjdCByZXR1cm5lZCBieSBnZXRzdGF0ZSgpLiIiIgorICAgICAgICB2ZXJzaW9uID0gc3RhdGVbMF0KKyAgICAgICAgaWYgdmVyc2lvbiA9PSAzOgorICAgICAgICAgICAgdmVyc2lvbiwgaW50ZXJuYWxzdGF0ZSwgc2VsZi5nYXVzc19uZXh0ID0gc3RhdGUKKyAgICAgICAgICAgIHN1cGVyKFJhbmRvbSwgc2VsZikuc2V0c3RhdGUoaW50ZXJuYWxzdGF0ZSkKKyAgICAgICAgZWxpZiB2ZXJzaW9uID09IDI6CisgICAgICAgICAgICB2ZXJzaW9uLCBpbnRlcm5hbHN0YXRlLCBzZWxmLmdhdXNzX25leHQgPSBzdGF0ZQorICAgICAgICAgICAgIyBJbiB2ZXJzaW9uIDIsIHRoZSBzdGF0ZSB3YXMgc2F2ZWQgYXMgc2lnbmVkIGludHMsIHdoaWNoIGNhdXNlcworICAgICAgICAgICAgIyAgIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIDMyLzY0LWJpdCBzeXN0ZW1zLiBUaGUgc3RhdGUgaXMKKyAgICAgICAgICAgICMgICByZWFsbHkgdW5zaWduZWQgMzItYml0IGludHMsIHNvIHdlIGNvbnZlcnQgbmVnYXRpdmUgaW50cyBmcm9tCisgICAgICAgICAgICAjICAgdmVyc2lvbiAyIHRvIHBvc2l0aXZlIGxvbmdzIGZvciB2ZXJzaW9uIDMuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW50ZXJuYWxzdGF0ZSA9IHR1cGxlKCBsb25nKHgpICUgKDIqKjMyKSBmb3IgeCBpbiBpbnRlcm5hbHN0YXRlICkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgZQorICAgICAgICAgICAgc3VwZXIoUmFuZG9tLCBzZWxmKS5zZXRzdGF0ZShpbnRlcm5hbHN0YXRlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RhdGUgd2l0aCB2ZXJzaW9uICVzIHBhc3NlZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5kb20uc2V0c3RhdGUoKSBvZiB2ZXJzaW9uICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBzZWxmLlZFUlNJT04pKQorCisgICAgZGVmIGp1bXBhaGVhZChzZWxmLCBuKToKKyAgICAgICAgIiIiQ2hhbmdlIHRoZSBpbnRlcm5hbCBzdGF0ZSB0byBvbmUgdGhhdCBpcyBsaWtlbHkgZmFyIGF3YXkKKyAgICAgICAgZnJvbSB0aGUgY3VycmVudCBzdGF0ZS4gIFRoaXMgbWV0aG9kIHdpbGwgbm90IGJlIGluIFB5My54LAorICAgICAgICBzbyBpdCBpcyBiZXR0ZXIgdG8gc2ltcGx5IHJlc2VlZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgVGhlIHN1cGVyLmp1bXBhaGVhZCgpIG1ldGhvZCB1c2VzIHNodWZmbGluZyB0byBjaGFuZ2Ugc3RhdGUsCisgICAgICAgICMgc28gaXQgbmVlZHMgYSBsYXJnZSBhbmQgImludGVyZXN0aW5nIiBuIHRvIHdvcmsgd2l0aC4gIEhlcmUsCisgICAgICAgICMgd2UgdXNlIGhhc2hpbmcgdG8gY3JlYXRlIGEgbGFyZ2UgbiBmb3IgdGhlIHNodWZmbGUuCisgICAgICAgIHMgPSByZXByKG4pICsgcmVwcihzZWxmLmdldHN0YXRlKCkpCisgICAgICAgIG4gPSBpbnQoX2hhc2hsaWIubmV3KCdzaGE1MTInLCBzKS5oZXhkaWdlc3QoKSwgMTYpCisgICAgICAgIHN1cGVyKFJhbmRvbSwgc2VsZikuanVtcGFoZWFkKG4pCisKKyMjIC0tLS0gTWV0aG9kcyBiZWxvdyB0aGlzIHBvaW50IGRvIG5vdCBuZWVkIHRvIGJlIG92ZXJyaWRkZW4gd2hlbgorIyMgLS0tLSBzdWJjbGFzc2luZyBmb3IgdGhlIHB1cnBvc2Ugb2YgdXNpbmcgYSBkaWZmZXJlbnQgY29yZSBnZW5lcmF0b3IuCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHBpY2tsZSBzdXBwb3J0ICAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOiAjIGZvciBwaWNrbGUKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0c3RhdGUoKQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6ICAjIGZvciBwaWNrbGUKKyAgICAgICAgc2VsZi5zZXRzdGF0ZShzdGF0ZSkKKworICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18sICgpLCBzZWxmLmdldHN0YXRlKCkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW50ZWdlciBtZXRob2RzICAtLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcmFuZHJhbmdlKHNlbGYsIHN0YXJ0LCBzdG9wPU5vbmUsIHN0ZXA9MSwgaW50PWludCwgZGVmYXVsdD1Ob25lLAorICAgICAgICAgICAgICAgICAgbWF4d2lkdGg9MUw8PEJQRik6CisgICAgICAgICIiIkNob29zZSBhIHJhbmRvbSBpdGVtIGZyb20gcmFuZ2Uoc3RhcnQsIHN0b3BbLCBzdGVwXSkuCisKKyAgICAgICAgVGhpcyBmaXhlcyB0aGUgcHJvYmxlbSB3aXRoIHJhbmRpbnQoKSB3aGljaCBpbmNsdWRlcyB0aGUKKyAgICAgICAgZW5kcG9pbnQ7IGluIFB5dGhvbiB0aGlzIGlzIHVzdWFsbHkgbm90IHdoYXQgeW91IHdhbnQuCisgICAgICAgIERvIG5vdCBzdXBwbHkgdGhlICdpbnQnLCAnZGVmYXVsdCcsIGFuZCAnbWF4d2lkdGgnIGFyZ3VtZW50cy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBUaGlzIGNvZGUgaXMgYSBiaXQgbWVzc3kgdG8gbWFrZSBpdCBmYXN0IGZvciB0aGUKKyAgICAgICAgIyBjb21tb24gY2FzZSB3aGlsZSBzdGlsbCBkb2luZyBhZGVxdWF0ZSBlcnJvciBjaGVja2luZy4KKyAgICAgICAgaXN0YXJ0ID0gaW50KHN0YXJ0KQorICAgICAgICBpZiBpc3RhcnQgIT0gc3RhcnQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibm9uLWludGVnZXIgYXJnIDEgZm9yIHJhbmRyYW5nZSgpIgorICAgICAgICBpZiBzdG9wIGlzIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiBpc3RhcnQgPiAwOgorICAgICAgICAgICAgICAgIGlmIGlzdGFydCA+PSBtYXh3aWR0aDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JhbmRiZWxvdyhpc3RhcnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGludChzZWxmLnJhbmRvbSgpICogaXN0YXJ0KQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSIKKworICAgICAgICAjIHN0b3AgYXJndW1lbnQgc3VwcGxpZWQuCisgICAgICAgIGlzdG9wID0gaW50KHN0b3ApCisgICAgICAgIGlmIGlzdG9wICE9IHN0b3A6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibm9uLWludGVnZXIgc3RvcCBmb3IgcmFuZHJhbmdlKCkiCisgICAgICAgIHdpZHRoID0gaXN0b3AgLSBpc3RhcnQKKyAgICAgICAgaWYgc3RlcCA9PSAxIGFuZCB3aWR0aCA+IDA6CisgICAgICAgICAgICAjIE5vdGUgdGhhdAorICAgICAgICAgICAgIyAgICAgaW50KGlzdGFydCArIHNlbGYucmFuZG9tKCkqd2lkdGgpCisgICAgICAgICAgICAjIGluc3RlYWQgd291bGQgYmUgaW5jb3JyZWN0LiAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGlzdGFydAorICAgICAgICAgICAgIyA9IC0yIGFuZCBpc3RvcCA9IDAuICBUaGVuIHRoZSBndXRzIHdvdWxkIGJlIGluCisgICAgICAgICAgICAjIC0yLjAgdG8gMC4wIGV4Y2x1c2l2ZSBvbiBib3RoIGVuZHMgKGlnbm9yaW5nIHRoYXQgcmFuZG9tKCkKKyAgICAgICAgICAgICMgbWlnaHQgcmV0dXJuIDAuMCksIGFuZCBiZWNhdXNlIGludCgpIHRydW5jYXRlcyB0b3dhcmQgMCwgdGhlCisgICAgICAgICAgICAjIGZpbmFsIHJlc3VsdCB3b3VsZCBiZSAtMSBvciAwIChpbnN0ZWFkIG9mIC0yIG9yIC0xKS4KKyAgICAgICAgICAgICMgICAgIGlzdGFydCArIGludChzZWxmLnJhbmRvbSgpKndpZHRoKQorICAgICAgICAgICAgIyB3b3VsZCBhbHNvIGJlIGluY29ycmVjdCwgZm9yIGEgc3VidGxlciByZWFzb246ICB0aGUgUkhTCisgICAgICAgICAgICAjIGNhbiByZXR1cm4gYSBsb25nLCBhbmQgdGhlbiByYW5kcmFuZ2UoKSB3b3VsZCBhbHNvIHJldHVybgorICAgICAgICAgICAgIyBhIGxvbmcsIGJ1dCB3ZSdyZSBzdXBwb3NlZCB0byByZXR1cm4gYW4gaW50IChmb3IgYmFja3dhcmQKKyAgICAgICAgICAgICMgY29tcGF0aWJpbGl0eSkuCisKKyAgICAgICAgICAgIGlmIHdpZHRoID49IG1heHdpZHRoOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQoaXN0YXJ0ICsgc2VsZi5fcmFuZGJlbG93KHdpZHRoKSkKKyAgICAgICAgICAgIHJldHVybiBpbnQoaXN0YXJ0ICsgaW50KHNlbGYucmFuZG9tKCkqd2lkdGgpKQorICAgICAgICBpZiBzdGVwID09IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpICglZCwlZCwgJWQpIiAlIChpc3RhcnQsIGlzdG9wLCB3aWR0aCkKKworICAgICAgICAjIE5vbi11bml0IHN0ZXAgYXJndW1lbnQgc3VwcGxpZWQuCisgICAgICAgIGlzdGVwID0gaW50KHN0ZXApCisgICAgICAgIGlmIGlzdGVwICE9IHN0ZXA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibm9uLWludGVnZXIgc3RlcCBmb3IgcmFuZHJhbmdlKCkiCisgICAgICAgIGlmIGlzdGVwID4gMDoKKyAgICAgICAgICAgIG4gPSAod2lkdGggKyBpc3RlcCAtIDEpIC8vIGlzdGVwCisgICAgICAgIGVsaWYgaXN0ZXAgPCAwOgorICAgICAgICAgICAgbiA9ICh3aWR0aCArIGlzdGVwICsgMSkgLy8gaXN0ZXAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ6ZXJvIHN0ZXAgZm9yIHJhbmRyYW5nZSgpIgorCisgICAgICAgIGlmIG4gPD0gMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkiCisKKyAgICAgICAgaWYgbiA+PSBtYXh3aWR0aDoKKyAgICAgICAgICAgIHJldHVybiBpc3RhcnQgKyBpc3RlcCpzZWxmLl9yYW5kYmVsb3cobikKKyAgICAgICAgcmV0dXJuIGlzdGFydCArIGlzdGVwKmludChzZWxmLnJhbmRvbSgpICogbikKKworICAgIGRlZiByYW5kaW50KHNlbGYsIGEsIGIpOgorICAgICAgICAiIiJSZXR1cm4gcmFuZG9tIGludGVnZXIgaW4gcmFuZ2UgW2EsIGJdLCBpbmNsdWRpbmcgYm90aCBlbmQgcG9pbnRzLgorICAgICAgICAiIiIKKworICAgICAgICByZXR1cm4gc2VsZi5yYW5kcmFuZ2UoYSwgYisxKQorCisgICAgZGVmIF9yYW5kYmVsb3coc2VsZiwgbiwgX2xvZz1fbG9nLCBpbnQ9aW50LCBfbWF4d2lkdGg9MUw8PEJQRiwKKyAgICAgICAgICAgICAgICAgICBfTWV0aG9kPV9NZXRob2RUeXBlLCBfQnVpbHRpbk1ldGhvZD1fQnVpbHRpbk1ldGhvZFR5cGUpOgorICAgICAgICAiIiJSZXR1cm4gYSByYW5kb20gaW50IGluIHRoZSByYW5nZSBbMCxuKQorCisgICAgICAgIEhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgbiBoYXMgbW9yZSBiaXRzIHRoYW4gcmV0dXJuZWQKKyAgICAgICAgYnkgYSBzaW5nbGUgY2FsbCB0byB0aGUgdW5kZXJseWluZyBnZW5lcmF0b3IuCisgICAgICAgICIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdldHJhbmRiaXRzID0gc2VsZi5nZXRyYW5kYml0cworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE9ubHkgY2FsbCBzZWxmLmdldHJhbmRiaXRzIGlmIHRoZSBvcmlnaW5hbCByYW5kb20oKSBidWlsdGluIG1ldGhvZAorICAgICAgICAgICAgIyBoYXMgbm90IGJlZW4gb3ZlcnJpZGRlbiBvciBpZiBhIG5ldyBnZXRyYW5kYml0cygpIHdhcyBzdXBwbGllZC4KKyAgICAgICAgICAgICMgVGhpcyBhc3N1cmVzIHRoYXQgdGhlIHR3byBtZXRob2RzIGNvcnJlc3BvbmQuCisgICAgICAgICAgICBpZiB0eXBlKHNlbGYucmFuZG9tKSBpcyBfQnVpbHRpbk1ldGhvZCBvciB0eXBlKGdldHJhbmRiaXRzKSBpcyBfTWV0aG9kOgorICAgICAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobi0xLCAyLjApKSAgICMgMioqayA+IG4tMSA+IDIqKihrLTIpCisgICAgICAgICAgICAgICAgciA9IGdldHJhbmRiaXRzKGspCisgICAgICAgICAgICAgICAgd2hpbGUgciA+PSBuOgorICAgICAgICAgICAgICAgICAgICByID0gZ2V0cmFuZGJpdHMoaykKKyAgICAgICAgICAgICAgICByZXR1cm4gcgorICAgICAgICBpZiBuID49IF9tYXh3aWR0aDoKKyAgICAgICAgICAgIF93YXJuKCJVbmRlcmx5aW5nIHJhbmRvbSgpIGdlbmVyYXRvciBkb2VzIG5vdCBzdXBwbHkgXG4iCisgICAgICAgICAgICAgICAgImVub3VnaCBiaXRzIHRvIGNob29zZSBmcm9tIGEgcG9wdWxhdGlvbiByYW5nZSB0aGlzIGxhcmdlIikKKyAgICAgICAgcmV0dXJuIGludChzZWxmLnJhbmRvbSgpICogbikKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2VxdWVuY2UgbWV0aG9kcyAgLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGNob2ljZShzZWxmLCBzZXEpOgorICAgICAgICAiIiJDaG9vc2UgYSByYW5kb20gZWxlbWVudCBmcm9tIGEgbm9uLWVtcHR5IHNlcXVlbmNlLiIiIgorICAgICAgICByZXR1cm4gc2VxW2ludChzZWxmLnJhbmRvbSgpICogbGVuKHNlcSkpXSAgIyByYWlzZXMgSW5kZXhFcnJvciBpZiBzZXEgaXMgZW1wdHkKKworICAgIGRlZiBzaHVmZmxlKHNlbGYsIHgsIHJhbmRvbT1Ob25lLCBpbnQ9aW50KToKKyAgICAgICAgIiIieCwgcmFuZG9tPXJhbmRvbS5yYW5kb20gLT4gc2h1ZmZsZSBsaXN0IHggaW4gcGxhY2U7IHJldHVybiBOb25lLgorCisgICAgICAgIE9wdGlvbmFsIGFyZyByYW5kb20gaXMgYSAwLWFyZ3VtZW50IGZ1bmN0aW9uIHJldHVybmluZyBhIHJhbmRvbQorICAgICAgICBmbG9hdCBpbiBbMC4wLCAxLjApOyBieSBkZWZhdWx0LCB0aGUgc3RhbmRhcmQgcmFuZG9tLnJhbmRvbS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgcmFuZG9tIGlzIE5vbmU6CisgICAgICAgICAgICByYW5kb20gPSBzZWxmLnJhbmRvbQorICAgICAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2UoMSwgbGVuKHgpKSk6CisgICAgICAgICAgICAjIHBpY2sgYW4gZWxlbWVudCBpbiB4WzppKzFdIHdpdGggd2hpY2ggdG8gZXhjaGFuZ2UgeFtpXQorICAgICAgICAgICAgaiA9IGludChyYW5kb20oKSAqIChpKzEpKQorICAgICAgICAgICAgeFtpXSwgeFtqXSA9IHhbal0sIHhbaV0KKworICAgIGRlZiBzYW1wbGUoc2VsZiwgcG9wdWxhdGlvbiwgayk6CisgICAgICAgICIiIkNob29zZXMgayB1bmlxdWUgcmFuZG9tIGVsZW1lbnRzIGZyb20gYSBwb3B1bGF0aW9uIHNlcXVlbmNlLgorCisgICAgICAgIFJldHVybnMgYSBuZXcgbGlzdCBjb250YWluaW5nIGVsZW1lbnRzIGZyb20gdGhlIHBvcHVsYXRpb24gd2hpbGUKKyAgICAgICAgbGVhdmluZyB0aGUgb3JpZ2luYWwgcG9wdWxhdGlvbiB1bmNoYW5nZWQuICBUaGUgcmVzdWx0aW5nIGxpc3QgaXMKKyAgICAgICAgaW4gc2VsZWN0aW9uIG9yZGVyIHNvIHRoYXQgYWxsIHN1Yi1zbGljZXMgd2lsbCBhbHNvIGJlIHZhbGlkIHJhbmRvbQorICAgICAgICBzYW1wbGVzLiAgVGhpcyBhbGxvd3MgcmFmZmxlIHdpbm5lcnMgKHRoZSBzYW1wbGUpIHRvIGJlIHBhcnRpdGlvbmVkCisgICAgICAgIGludG8gZ3JhbmQgcHJpemUgYW5kIHNlY29uZCBwbGFjZSB3aW5uZXJzICh0aGUgc3Vic2xpY2VzKS4KKworICAgICAgICBNZW1iZXJzIG9mIHRoZSBwb3B1bGF0aW9uIG5lZWQgbm90IGJlIGhhc2hhYmxlIG9yIHVuaXF1ZS4gIElmIHRoZQorICAgICAgICBwb3B1bGF0aW9uIGNvbnRhaW5zIHJlcGVhdHMsIHRoZW4gZWFjaCBvY2N1cnJlbmNlIGlzIGEgcG9zc2libGUKKyAgICAgICAgc2VsZWN0aW9uIGluIHRoZSBzYW1wbGUuCisKKyAgICAgICAgVG8gY2hvb3NlIGEgc2FtcGxlIGluIGEgcmFuZ2Ugb2YgaW50ZWdlcnMsIHVzZSB4cmFuZ2UgYXMgYW4gYXJndW1lbnQuCisgICAgICAgIFRoaXMgaXMgZXNwZWNpYWxseSBmYXN0IGFuZCBzcGFjZSBlZmZpY2llbnQgZm9yIHNhbXBsaW5nIGZyb20gYQorICAgICAgICBsYXJnZSBwb3B1bGF0aW9uOiAgIHNhbXBsZSh4cmFuZ2UoMTAwMDAwMDApLCA2MCkKKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBTYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50IGVudGFpbHMgdHJhY2tpbmcgZWl0aGVyIHBvdGVudGlhbAorICAgICAgICAjIHNlbGVjdGlvbnMgKHRoZSBwb29sKSBpbiBhIGxpc3Qgb3IgcHJldmlvdXMgc2VsZWN0aW9ucyBpbiBhIHNldC4KKworICAgICAgICAjIFdoZW4gdGhlIG51bWJlciBvZiBzZWxlY3Rpb25zIGlzIHNtYWxsIGNvbXBhcmVkIHRvIHRoZQorICAgICAgICAjIHBvcHVsYXRpb24sIHRoZW4gdHJhY2tpbmcgc2VsZWN0aW9ucyBpcyBlZmZpY2llbnQsIHJlcXVpcmluZworICAgICAgICAjIG9ubHkgYSBzbWFsbCBzZXQgYW5kIGFuIG9jY2FzaW9uYWwgcmVzZWxlY3Rpb24uICBGb3IKKyAgICAgICAgIyBhIGxhcmdlciBudW1iZXIgb2Ygc2VsZWN0aW9ucywgdGhlIHBvb2wgdHJhY2tpbmcgbWV0aG9kIGlzCisgICAgICAgICMgcHJlZmVycmVkIHNpbmNlIHRoZSBsaXN0IHRha2VzIGxlc3Mgc3BhY2UgdGhhbiB0aGUKKyAgICAgICAgIyBzZXQgYW5kIGl0IGRvZXNuJ3Qgc3VmZmVyIGZyb20gZnJlcXVlbnQgcmVzZWxlY3Rpb25zLgorCisgICAgICAgIG4gPSBsZW4ocG9wdWxhdGlvbikKKyAgICAgICAgaWYgbm90IDAgPD0gayA8PSBuOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2FtcGxlIGxhcmdlciB0aGFuIHBvcHVsYXRpb24iKQorICAgICAgICByYW5kb20gPSBzZWxmLnJhbmRvbQorICAgICAgICBfaW50ID0gaW50CisgICAgICAgIHJlc3VsdCA9IFtOb25lXSAqIGsKKyAgICAgICAgc2V0c2l6ZSA9IDIxICAgICAgICAjIHNpemUgb2YgYSBzbWFsbCBzZXQgbWludXMgc2l6ZSBvZiBhbiBlbXB0eSBsaXN0CisgICAgICAgIGlmIGsgPiA1OgorICAgICAgICAgICAgc2V0c2l6ZSArPSA0ICoqIF9jZWlsKF9sb2coayAqIDMsIDQpKSAjIHRhYmxlIHNpemUgZm9yIGJpZyBzZXRzCisgICAgICAgIGlmIG4gPD0gc2V0c2l6ZSBvciBoYXNhdHRyKHBvcHVsYXRpb24sICJrZXlzIik6CisgICAgICAgICAgICAjIEFuIG4tbGVuZ3RoIGxpc3QgaXMgc21hbGxlciB0aGFuIGEgay1sZW5ndGggc2V0LCBvciB0aGlzIGlzIGEKKyAgICAgICAgICAgICMgbWFwcGluZyB0eXBlIHNvIHRoZSBvdGhlciBhbGdvcml0aG0gd291bGRuJ3Qgd29yay4KKyAgICAgICAgICAgIHBvb2wgPSBsaXN0KHBvcHVsYXRpb24pCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoayk6ICAgICAgICAgIyBpbnZhcmlhbnQ6ICBub24tc2VsZWN0ZWQgYXQgWzAsbi1pKQorICAgICAgICAgICAgICAgIGogPSBfaW50KHJhbmRvbSgpICogKG4taSkpCisgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcG9vbFtqXQorICAgICAgICAgICAgICAgIHBvb2xbal0gPSBwb29sW24taS0xXSAgICMgbW92ZSBub24tc2VsZWN0ZWQgaXRlbSBpbnRvIHZhY2FuY3kKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHNldCgpCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYWRkID0gc2VsZWN0ZWQuYWRkCisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGspOgorICAgICAgICAgICAgICAgICAgICBqID0gX2ludChyYW5kb20oKSAqIG4pCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGogaW4gc2VsZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gX2ludChyYW5kb20oKSAqIG4pCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkX2FkZChqKQorICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBwb3B1bGF0aW9uW2pdCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgS2V5RXJyb3IpOiAgICMgaGFuZGxlIChhdCBsZWFzdCkgc2V0cworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocG9wdWxhdGlvbiwgbGlzdCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2FtcGxlKHR1cGxlKHBvcHVsYXRpb24pLCBrKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlYWwtdmFsdWVkIGRpc3RyaWJ1dGlvbnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gdW5pZm9ybSBkaXN0cmlidXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHVuaWZvcm0oc2VsZiwgYSwgYik6CisgICAgICAgICJHZXQgYSByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBbYSwgYikgb3IgW2EsIGJdIGRlcGVuZGluZyBvbiByb3VuZGluZy4iCisgICAgICAgIHJldHVybiBhICsgKGItYSkgKiBzZWxmLnJhbmRvbSgpCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIHRyaWFuZ3VsYXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB0cmlhbmd1bGFyKHNlbGYsIGxvdz0wLjAsIGhpZ2g9MS4wLCBtb2RlPU5vbmUpOgorICAgICAgICAiIiJUcmlhbmd1bGFyIGRpc3RyaWJ1dGlvbi4KKworICAgICAgICBDb250aW51b3VzIGRpc3RyaWJ1dGlvbiBib3VuZGVkIGJ5IGdpdmVuIGxvd2VyIGFuZCB1cHBlciBsaW1pdHMsCisgICAgICAgIGFuZCBoYXZpbmcgYSBnaXZlbiBtb2RlIHZhbHVlIGluLWJldHdlZW4uCisKKyAgICAgICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Ucmlhbmd1bGFyX2Rpc3RyaWJ1dGlvbgorCisgICAgICAgICIiIgorICAgICAgICB1ID0gc2VsZi5yYW5kb20oKQorICAgICAgICBjID0gMC41IGlmIG1vZGUgaXMgTm9uZSBlbHNlIChtb2RlIC0gbG93KSAvIChoaWdoIC0gbG93KQorICAgICAgICBpZiB1ID4gYzoKKyAgICAgICAgICAgIHUgPSAxLjAgLSB1CisgICAgICAgICAgICBjID0gMS4wIC0gYworICAgICAgICAgICAgbG93LCBoaWdoID0gaGlnaCwgbG93CisgICAgICAgIHJldHVybiBsb3cgKyAoaGlnaCAtIGxvdykgKiAodSAqIGMpICoqIDAuNQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBub3JtYWwgZGlzdHJpYnV0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgbm9ybWFsdmFyaWF0ZShzZWxmLCBtdSwgc2lnbWEpOgorICAgICAgICAiIiJOb3JtYWwgZGlzdHJpYnV0aW9uLgorCisgICAgICAgIG11IGlzIHRoZSBtZWFuLCBhbmQgc2lnbWEgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgIyBtdSA9IG1lYW4sIHNpZ21hID0gc3RhbmRhcmQgZGV2aWF0aW9uCisKKyAgICAgICAgIyBVc2VzIEtpbmRlcm1hbiBhbmQgTW9uYWhhbiBtZXRob2QuIFJlZmVyZW5jZTogS2luZGVybWFuLAorICAgICAgICAjIEEuSi4gYW5kIE1vbmFoYW4sIEouRi4sICJDb21wdXRlciBnZW5lcmF0aW9uIG9mIHJhbmRvbQorICAgICAgICAjIHZhcmlhYmxlcyB1c2luZyB0aGUgcmF0aW8gb2YgdW5pZm9ybSBkZXZpYXRlcyIsIEFDTSBUcmFucworICAgICAgICAjIE1hdGggU29mdHdhcmUsIDMsICgxOTc3KSwgcHAyNTctMjYwLgorCisgICAgICAgIHJhbmRvbSA9IHNlbGYucmFuZG9tCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB1MSA9IHJhbmRvbSgpCisgICAgICAgICAgICB1MiA9IDEuMCAtIHJhbmRvbSgpCisgICAgICAgICAgICB6ID0gTlZfTUFHSUNDT05TVCoodTEtMC41KS91MgorICAgICAgICAgICAgenogPSB6KnovNC4wCisgICAgICAgICAgICBpZiB6eiA8PSAtX2xvZyh1Mik6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIG11ICsgeipzaWdtYQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBsb2dub3JtYWwgZGlzdHJpYnV0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgbG9nbm9ybXZhcmlhdGUoc2VsZiwgbXUsIHNpZ21hKToKKyAgICAgICAgIiIiTG9nIG5vcm1hbCBkaXN0cmlidXRpb24uCisKKyAgICAgICAgSWYgeW91IHRha2UgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoaXMgZGlzdHJpYnV0aW9uLCB5b3UnbGwgZ2V0IGEKKyAgICAgICAgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aXRoIG1lYW4gbXUgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBzaWdtYS4KKyAgICAgICAgbXUgY2FuIGhhdmUgYW55IHZhbHVlLCBhbmQgc2lnbWEgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIF9leHAoc2VsZi5ub3JtYWx2YXJpYXRlKG11LCBzaWdtYSkpCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGV4cG9uZW50aWFsIGRpc3RyaWJ1dGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIGV4cG92YXJpYXRlKHNlbGYsIGxhbWJkKToKKyAgICAgICAgIiIiRXhwb25lbnRpYWwgZGlzdHJpYnV0aW9uLgorCisgICAgICAgIGxhbWJkIGlzIDEuMCBkaXZpZGVkIGJ5IHRoZSBkZXNpcmVkIG1lYW4uICBJdCBzaG91bGQgYmUKKyAgICAgICAgbm9uemVyby4gIChUaGUgcGFyYW1ldGVyIHdvdWxkIGJlIGNhbGxlZCAibGFtYmRhIiwgYnV0IHRoYXQgaXMKKyAgICAgICAgYSByZXNlcnZlZCB3b3JkIGluIFB5dGhvbi4pICBSZXR1cm5lZCB2YWx1ZXMgcmFuZ2UgZnJvbSAwIHRvCisgICAgICAgIHBvc2l0aXZlIGluZmluaXR5IGlmIGxhbWJkIGlzIHBvc2l0aXZlLCBhbmQgZnJvbSBuZWdhdGl2ZQorICAgICAgICBpbmZpbml0eSB0byAwIGlmIGxhbWJkIGlzIG5lZ2F0aXZlLgorCisgICAgICAgICIiIgorICAgICAgICAjIGxhbWJkOiByYXRlIGxhbWJkID0gMS9tZWFuCisgICAgICAgICMgKCdsYW1iZGEnIGlzIGEgUHl0aG9uIHJlc2VydmVkIHdvcmQpCisKKyAgICAgICAgIyB3ZSB1c2UgMS1yYW5kb20oKSBpbnN0ZWFkIG9mIHJhbmRvbSgpIHRvIHByZWNsdWRlIHRoZQorICAgICAgICAjIHBvc3NpYmlsaXR5IG9mIHRha2luZyB0aGUgbG9nIG9mIHplcm8uCisgICAgICAgIHJldHVybiAtX2xvZygxLjAgLSBzZWxmLnJhbmRvbSgpKS9sYW1iZAorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSB2b24gTWlzZXMgZGlzdHJpYnV0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdm9ubWlzZXN2YXJpYXRlKHNlbGYsIG11LCBrYXBwYSk6CisgICAgICAgICIiIkNpcmN1bGFyIGRhdGEgZGlzdHJpYnV0aW9uLgorCisgICAgICAgIG11IGlzIHRoZSBtZWFuIGFuZ2xlLCBleHByZXNzZWQgaW4gcmFkaWFucyBiZXR3ZWVuIDAgYW5kIDIqcGksIGFuZAorICAgICAgICBrYXBwYSBpcyB0aGUgY29uY2VudHJhdGlvbiBwYXJhbWV0ZXIsIHdoaWNoIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yCisgICAgICAgIGVxdWFsIHRvIHplcm8uICBJZiBrYXBwYSBpcyBlcXVhbCB0byB6ZXJvLCB0aGlzIGRpc3RyaWJ1dGlvbiByZWR1Y2VzCisgICAgICAgIHRvIGEgdW5pZm9ybSByYW5kb20gYW5nbGUgb3ZlciB0aGUgcmFuZ2UgMCB0byAyKnBpLgorCisgICAgICAgICIiIgorICAgICAgICAjIG11OiAgICBtZWFuIGFuZ2xlIChpbiByYWRpYW5zIGJldHdlZW4gMCBhbmQgMipwaSkKKyAgICAgICAgIyBrYXBwYTogY29uY2VudHJhdGlvbiBwYXJhbWV0ZXIga2FwcGEgKD49IDApCisgICAgICAgICMgaWYga2FwcGEgPSAwIGdlbmVyYXRlIHVuaWZvcm0gcmFuZG9tIGFuZ2xlCisKKyAgICAgICAgIyBCYXNlZCB1cG9uIGFuIGFsZ29yaXRobSBwdWJsaXNoZWQgaW46IEZpc2hlciwgTi5JLiwKKyAgICAgICAgIyAiU3RhdGlzdGljYWwgQW5hbHlzaXMgb2YgQ2lyY3VsYXIgRGF0YSIsIENhbWJyaWRnZQorICAgICAgICAjIFVuaXZlcnNpdHkgUHJlc3MsIDE5OTMuCisKKyAgICAgICAgIyBUaGFua3MgdG8gTWFnbnVzIEtlc3NsZXIgZm9yIGEgY29ycmVjdGlvbiB0byB0aGUKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBvZiBzdGVwIDQuCisKKyAgICAgICAgcmFuZG9tID0gc2VsZi5yYW5kb20KKyAgICAgICAgaWYga2FwcGEgPD0gMWUtNjoKKyAgICAgICAgICAgIHJldHVybiBUV09QSSAqIHJhbmRvbSgpCisKKyAgICAgICAgcyA9IDAuNSAvIGthcHBhCisgICAgICAgIHIgPSBzICsgX3NxcnQoMS4wICsgcyAqIHMpCisKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHUxID0gcmFuZG9tKCkKKyAgICAgICAgICAgIHogPSBfY29zKF9waSAqIHUxKQorCisgICAgICAgICAgICBkID0geiAvIChyICsgeikKKyAgICAgICAgICAgIHUyID0gcmFuZG9tKCkKKyAgICAgICAgICAgIGlmIHUyIDwgMS4wIC0gZCAqIGQgb3IgdTIgPD0gKDEuMCAtIGQpICogX2V4cChkKToKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgIHEgPSAxLjAgLyByCisgICAgICAgIGYgPSAocSArIHopIC8gKDEuMCArIHEgKiB6KQorICAgICAgICB1MyA9IHJhbmRvbSgpCisgICAgICAgIGlmIHUzID4gMC41OgorICAgICAgICAgICAgdGhldGEgPSAobXUgKyBfYWNvcyhmKSkgJSBUV09QSQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGhldGEgPSAobXUgLSBfYWNvcyhmKSkgJSBUV09QSQorCisgICAgICAgIHJldHVybiB0aGV0YQorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSBnYW1tYSBkaXN0cmlidXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBnYW1tYXZhcmlhdGUoc2VsZiwgYWxwaGEsIGJldGEpOgorICAgICAgICAiIiJHYW1tYSBkaXN0cmlidXRpb24uICBOb3QgdGhlIGdhbW1hIGZ1bmN0aW9uIQorCisgICAgICAgIENvbmRpdGlvbnMgb24gdGhlIHBhcmFtZXRlcnMgYXJlIGFscGhhID4gMCBhbmQgYmV0YSA+IDAuCisKKyAgICAgICAgVGhlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBmdW5jdGlvbiBpczoKKworICAgICAgICAgICAgICAgICAgICB4ICoqIChhbHBoYSAtIDEpICogbWF0aC5leHAoLXggLyBiZXRhKQorICAgICAgICAgIHBkZih4KSA9ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgIG1hdGguZ2FtbWEoYWxwaGEpICogYmV0YSAqKiBhbHBoYQorCisgICAgICAgICIiIgorCisgICAgICAgICMgYWxwaGEgPiAwLCBiZXRhID4gMCwgbWVhbiBpcyBhbHBoYSpiZXRhLCB2YXJpYW5jZSBpcyBhbHBoYSpiZXRhKioyCisKKyAgICAgICAgIyBXYXJuaW5nOiBhIGZldyBvbGRlciBzb3VyY2VzIGRlZmluZSB0aGUgZ2FtbWEgZGlzdHJpYnV0aW9uIGluIHRlcm1zCisgICAgICAgICMgb2YgYWxwaGEgPiAtMS4wCisgICAgICAgIGlmIGFscGhhIDw9IDAuMCBvciBiZXRhIDw9IDAuMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdnYW1tYXZhcmlhdGU6IGFscGhhIGFuZCBiZXRhIG11c3QgYmUgPiAwLjAnCisKKyAgICAgICAgcmFuZG9tID0gc2VsZi5yYW5kb20KKyAgICAgICAgaWYgYWxwaGEgPiAxLjA6CisKKyAgICAgICAgICAgICMgVXNlcyBSLkMuSC4gQ2hlbmcsICJUaGUgZ2VuZXJhdGlvbiBvZiBHYW1tYQorICAgICAgICAgICAgIyB2YXJpYWJsZXMgd2l0aCBub24taW50ZWdyYWwgc2hhcGUgcGFyYW1ldGVycyIsCisgICAgICAgICAgICAjIEFwcGxpZWQgU3RhdGlzdGljcywgKDE5NzcpLCAyNiwgTm8uIDEsIHA3MS03NAorCisgICAgICAgICAgICBhaW52ID0gX3NxcnQoMi4wICogYWxwaGEgLSAxLjApCisgICAgICAgICAgICBiYmIgPSBhbHBoYSAtIExPRzQKKyAgICAgICAgICAgIGNjYyA9IGFscGhhICsgYWludgorCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHUxID0gcmFuZG9tKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgMWUtNyA8IHUxIDwgLjk5OTk5OTk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdTIgPSAxLjAgLSByYW5kb20oKQorICAgICAgICAgICAgICAgIHYgPSBfbG9nKHUxLygxLjAtdTEpKS9haW52CisgICAgICAgICAgICAgICAgeCA9IGFscGhhKl9leHAodikKKyAgICAgICAgICAgICAgICB6ID0gdTEqdTEqdTIKKyAgICAgICAgICAgICAgICByID0gYmJiK2NjYyp2LXgKKyAgICAgICAgICAgICAgICBpZiByICsgU0dfTUFHSUNDT05TVCAtIDQuNSp6ID49IDAuMCBvciByID49IF9sb2coeik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4ICogYmV0YQorCisgICAgICAgIGVsaWYgYWxwaGEgPT0gMS4wOgorICAgICAgICAgICAgIyBleHBvdmFyaWF0ZSgxKQorICAgICAgICAgICAgdSA9IHJhbmRvbSgpCisgICAgICAgICAgICB3aGlsZSB1IDw9IDFlLTc6CisgICAgICAgICAgICAgICAgdSA9IHJhbmRvbSgpCisgICAgICAgICAgICByZXR1cm4gLV9sb2codSkgKiBiZXRhCisKKyAgICAgICAgZWxzZTogICAjIGFscGhhIGlzIGJldHdlZW4gMCBhbmQgMSAoZXhjbHVzaXZlKQorCisgICAgICAgICAgICAjIFVzZXMgQUxHT1JJVEhNIEdTIG9mIFN0YXRpc3RpY2FsIENvbXB1dGluZyAtIEtlbm5lZHkgJiBHZW50bGUKKworICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB1ID0gcmFuZG9tKCkKKyAgICAgICAgICAgICAgICBiID0gKF9lICsgYWxwaGEpL19lCisgICAgICAgICAgICAgICAgcCA9IGIqdQorICAgICAgICAgICAgICAgIGlmIHAgPD0gMS4wOgorICAgICAgICAgICAgICAgICAgICB4ID0gcCAqKiAoMS4wL2FscGhhKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHggPSAtX2xvZygoYi1wKS9hbHBoYSkKKyAgICAgICAgICAgICAgICB1MSA9IHJhbmRvbSgpCisgICAgICAgICAgICAgICAgaWYgcCA+IDEuMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgdTEgPD0geCAqKiAoYWxwaGEgLSAxLjApOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIHUxIDw9IF9leHAoLXgpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmV0dXJuIHggKiBiZXRhCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIEdhdXNzIChmYXN0ZXIgYWx0ZXJuYXRpdmUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgZ2F1c3Moc2VsZiwgbXUsIHNpZ21hKToKKyAgICAgICAgIiIiR2F1c3NpYW4gZGlzdHJpYnV0aW9uLgorCisgICAgICAgIG11IGlzIHRoZSBtZWFuLCBhbmQgc2lnbWEgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbi4gIFRoaXMgaXMKKyAgICAgICAgc2xpZ2h0bHkgZmFzdGVyIHRoYW4gdGhlIG5vcm1hbHZhcmlhdGUoKSBmdW5jdGlvbi4KKworICAgICAgICBOb3QgdGhyZWFkLXNhZmUgd2l0aG91dCBhIGxvY2sgYXJvdW5kIGNhbGxzLgorCisgICAgICAgICIiIgorCisgICAgICAgICMgV2hlbiB4IGFuZCB5IGFyZSB0d28gdmFyaWFibGVzIGZyb20gWzAsIDEpLCB1bmlmb3JtbHkKKyAgICAgICAgIyBkaXN0cmlidXRlZCwgdGhlbgorICAgICAgICAjCisgICAgICAgICMgICAgY29zKDIqcGkqeCkqc3FydCgtMipsb2coMS15KSkKKyAgICAgICAgIyAgICBzaW4oMipwaSp4KSpzcXJ0KC0yKmxvZygxLXkpKQorICAgICAgICAjCisgICAgICAgICMgYXJlIHR3byAqaW5kZXBlbmRlbnQqIHZhcmlhYmxlcyB3aXRoIG5vcm1hbCBkaXN0cmlidXRpb24KKyAgICAgICAgIyAobXUgPSAwLCBzaWdtYSA9IDEpLgorICAgICAgICAjIChMYW1iZXJ0IE1lZXJ0ZW5zKQorICAgICAgICAjIChjb3JyZWN0ZWQgdmVyc2lvbjsgYnVnIGRpc2NvdmVyZWQgYnkgTWlrZSBNaWxsZXIsIGZpeGVkIGJ5IExNKQorCisgICAgICAgICMgTXVsdGl0aHJlYWRpbmcgbm90ZTogV2hlbiB0d28gdGhyZWFkcyBjYWxsIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgIyBzaW11bHRhbmVvdXNseSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGV5IHdpbGwgcmVjZWl2ZSB0aGUKKyAgICAgICAgIyBzYW1lIHJldHVybiB2YWx1ZS4gIFRoZSB3aW5kb3cgaXMgdmVyeSBzbWFsbCB0aG91Z2guICBUbworICAgICAgICAjIGF2b2lkIHRoaXMsIHlvdSBoYXZlIHRvIHVzZSBhIGxvY2sgYXJvdW5kIGFsbCBjYWxscy4gIChJCisgICAgICAgICMgZGlkbid0IHdhbnQgdG8gc2xvdyB0aGlzIGRvd24gaW4gdGhlIHNlcmlhbCBjYXNlIGJ5IHVzaW5nIGEKKyAgICAgICAgIyBsb2NrIGhlcmUuKQorCisgICAgICAgIHJhbmRvbSA9IHNlbGYucmFuZG9tCisgICAgICAgIHogPSBzZWxmLmdhdXNzX25leHQKKyAgICAgICAgc2VsZi5nYXVzc19uZXh0ID0gTm9uZQorICAgICAgICBpZiB6IGlzIE5vbmU6CisgICAgICAgICAgICB4MnBpID0gcmFuZG9tKCkgKiBUV09QSQorICAgICAgICAgICAgZzJyYWQgPSBfc3FydCgtMi4wICogX2xvZygxLjAgLSByYW5kb20oKSkpCisgICAgICAgICAgICB6ID0gX2Nvcyh4MnBpKSAqIGcycmFkCisgICAgICAgICAgICBzZWxmLmdhdXNzX25leHQgPSBfc2luKHgycGkpICogZzJyYWQKKworICAgICAgICByZXR1cm4gbXUgKyB6KnNpZ21hCisKKyMjIC0tLS0tLS0tLS0tLS0tLS0tLS0tIGJldGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMjIFNlZQorIyMgaHR0cDovL21haWwucHl0aG9uLm9yZy9waXBlcm1haWwvcHl0aG9uLWJ1Z3MtbGlzdC8yMDAxLUphbnVhcnkvMDAzNzUyLmh0bWwKKyMjIGZvciBJdmFuIEZyb2huZSdzIGluc2lnaHRmdWwgYW5hbHlzaXMgb2Ygd2h5IHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbjoKKyMjCisjIyAgICBkZWYgYmV0YXZhcmlhdGUoc2VsZiwgYWxwaGEsIGJldGEpOgorIyMgICAgICAgICMgRGlzY3JldGUgRXZlbnQgU2ltdWxhdGlvbiBpbiBDLCBwcCA4Ny04OC4KKyMjCisjIyAgICAgICAgeSA9IHNlbGYuZXhwb3ZhcmlhdGUoYWxwaGEpCisjIyAgICAgICAgeiA9IHNlbGYuZXhwb3ZhcmlhdGUoMS4wL2JldGEpCisjIyAgICAgICAgcmV0dXJuIHovKHkreikKKyMjCisjIyB3YXMgZGVhZCB3cm9uZywgYW5kIGhvdyBpdCBwcm9iYWJseSBnb3QgdGhhdCB3YXkuCisKKyAgICBkZWYgYmV0YXZhcmlhdGUoc2VsZiwgYWxwaGEsIGJldGEpOgorICAgICAgICAiIiJCZXRhIGRpc3RyaWJ1dGlvbi4KKworICAgICAgICBDb25kaXRpb25zIG9uIHRoZSBwYXJhbWV0ZXJzIGFyZSBhbHBoYSA+IDAgYW5kIGJldGEgPiAwLgorICAgICAgICBSZXR1cm5lZCB2YWx1ZXMgcmFuZ2UgYmV0d2VlbiAwIGFuZCAxLgorCisgICAgICAgICIiIgorCisgICAgICAgICMgVGhpcyB2ZXJzaW9uIGR1ZSB0byBKYW5uZSBTaW5ra29uZW4sIGFuZCBtYXRjaGVzIGFsbCB0aGUgc3RkCisgICAgICAgICMgdGV4dHMgKGUuZy4sIEtudXRoIFZvbCAyIEVkIDMgcGcgMTM0ICJ0aGUgYmV0YSBkaXN0cmlidXRpb24iKS4KKyAgICAgICAgeSA9IHNlbGYuZ2FtbWF2YXJpYXRlKGFscGhhLCAxLikKKyAgICAgICAgaWYgeSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIDAuMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHkgLyAoeSArIHNlbGYuZ2FtbWF2YXJpYXRlKGJldGEsIDEuKSkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFyZXRvIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgcGFyZXRvdmFyaWF0ZShzZWxmLCBhbHBoYSk6CisgICAgICAgICIiIlBhcmV0byBkaXN0cmlidXRpb24uICBhbHBoYSBpcyB0aGUgc2hhcGUgcGFyYW1ldGVyLiIiIgorICAgICAgICAjIEphaW4sIHBnLiA0OTUKKworICAgICAgICB1ID0gMS4wIC0gc2VsZi5yYW5kb20oKQorICAgICAgICByZXR1cm4gMS4wIC8gcG93KHUsIDEuMC9hbHBoYSkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2VpYnVsbCAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgZGVmIHdlaWJ1bGx2YXJpYXRlKHNlbGYsIGFscGhhLCBiZXRhKToKKyAgICAgICAgIiIiV2VpYnVsbCBkaXN0cmlidXRpb24uCisKKyAgICAgICAgYWxwaGEgaXMgdGhlIHNjYWxlIHBhcmFtZXRlciBhbmQgYmV0YSBpcyB0aGUgc2hhcGUgcGFyYW1ldGVyLgorCisgICAgICAgICIiIgorICAgICAgICAjIEphaW4sIHBnLiA0OTk7IGJ1ZyBmaXggY291cnRlc3kgQmlsbCBBcm1zCisKKyAgICAgICAgdSA9IDEuMCAtIHNlbGYucmFuZG9tKCkKKyAgICAgICAgcmV0dXJuIGFscGhhICogcG93KC1fbG9nKHUpLCAxLjAvYmV0YSkKKworIyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0gV2ljaG1hbm4tSGlsbCAtLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFdpY2htYW5uSGlsbChSYW5kb20pOgorCisgICAgVkVSU0lPTiA9IDEgICAgICMgdXNlZCBieSBnZXRzdGF0ZS9zZXRzdGF0ZQorCisgICAgZGVmIHNlZWQoc2VsZiwgYT1Ob25lKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZSBmcm9tIGhhc2hhYmxlIG9iamVjdC4KKworICAgICAgICBOb25lIG9yIG5vIGFyZ3VtZW50IHNlZWRzIGZyb20gY3VycmVudCB0aW1lIG9yIGZyb20gYW4gb3BlcmF0aW5nCisgICAgICAgIHN5c3RlbSBzcGVjaWZpYyByYW5kb21uZXNzIHNvdXJjZSBpZiBhdmFpbGFibGUuCisKKyAgICAgICAgSWYgYSBpcyBub3QgTm9uZSBvciBhbiBpbnQgb3IgbG9uZywgaGFzaChhKSBpcyB1c2VkIGluc3RlYWQuCisKKyAgICAgICAgSWYgYSBpcyBhbiBpbnQgb3IgbG9uZywgYSBpcyB1c2VkIGRpcmVjdGx5LiAgRGlzdGluY3QgdmFsdWVzIGJldHdlZW4KKyAgICAgICAgMCBhbmQgMjc4MTQ0MzE0ODY1NzVMIGluY2x1c2l2ZSBhcmUgZ3VhcmFudGVlZCB0byB5aWVsZCBkaXN0aW5jdAorICAgICAgICBpbnRlcm5hbCBzdGF0ZXMgKHRoaXMgZ3VhcmFudGVlIGlzIHNwZWNpZmljIHRvIHRoZSBkZWZhdWx0CisgICAgICAgIFdpY2htYW5uLUhpbGwgZ2VuZXJhdG9yKS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgYSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGEgPSBsb25nKF9oZXhsaWZ5KF91cmFuZG9tKDE2KSksIDE2KQorICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgICAgICBhID0gbG9uZyh0aW1lLnRpbWUoKSAqIDI1NikgIyB1c2UgZnJhY3Rpb25hbCBzZWNvbmRzCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYSwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgYSA9IGhhc2goYSkKKworICAgICAgICBhLCB4ID0gZGl2bW9kKGEsIDMwMjY4KQorICAgICAgICBhLCB5ID0gZGl2bW9kKGEsIDMwMzA2KQorICAgICAgICBhLCB6ID0gZGl2bW9kKGEsIDMwMzIyKQorICAgICAgICBzZWxmLl9zZWVkID0gaW50KHgpKzEsIGludCh5KSsxLCBpbnQoeikrMQorCisgICAgICAgIHNlbGYuZ2F1c3NfbmV4dCA9IE5vbmUKKworICAgIGRlZiByYW5kb20oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBbMC4wLCAxLjApLiIiIgorCisgICAgICAgICMgV2ljaG1hbi1IaWxsIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLgorICAgICAgICAjCisgICAgICAgICMgV2ljaG1hbm4sIEIuIEEuICYgSGlsbCwgSS4gRC4gKDE5ODIpCisgICAgICAgICMgQWxnb3JpdGhtIEFTIDE4MzoKKyAgICAgICAgIyBBbiBlZmZpY2llbnQgYW5kIHBvcnRhYmxlIHBzZXVkby1yYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorICAgICAgICAjIEFwcGxpZWQgU3RhdGlzdGljcyAzMSAoMTk4MikgMTg4LTE5MAorICAgICAgICAjCisgICAgICAgICMgc2VlIGFsc286CisgICAgICAgICMgICAgICAgIENvcnJlY3Rpb24gdG8gQWxnb3JpdGhtIEFTIDE4MworICAgICAgICAjICAgICAgICBBcHBsaWVkIFN0YXRpc3RpY3MgMzMgKDE5ODQpIDEyMworICAgICAgICAjCisgICAgICAgICMgICAgICAgIE1jTGVvZCwgQS4gSS4gKDE5ODUpCisgICAgICAgICMgICAgICAgIEEgcmVtYXJrIG9uIEFsZ29yaXRobSBBUyAxODMKKyAgICAgICAgIyAgICAgICAgQXBwbGllZCBTdGF0aXN0aWNzIDM0ICgxOTg1KSwxOTgtMjAwCisKKyAgICAgICAgIyBUaGlzIHBhcnQgaXMgdGhyZWFkLXVuc2FmZToKKyAgICAgICAgIyBCRUdJTiBDUklUSUNBTCBTRUNUSU9OCisgICAgICAgIHgsIHksIHogPSBzZWxmLl9zZWVkCisgICAgICAgIHggPSAoMTcxICogeCkgJSAzMDI2OQorICAgICAgICB5ID0gKDE3MiAqIHkpICUgMzAzMDcKKyAgICAgICAgeiA9ICgxNzAgKiB6KSAlIDMwMzIzCisgICAgICAgIHNlbGYuX3NlZWQgPSB4LCB5LCB6CisgICAgICAgICMgRU5EIENSSVRJQ0FMIFNFQ1RJT04KKworICAgICAgICAjIE5vdGU6ICBvbiBhIHBsYXRmb3JtIHVzaW5nIElFRUUtNzU0IGRvdWJsZSBhcml0aG1ldGljLCB0aGlzIGNhbgorICAgICAgICAjIG5ldmVyIHJldHVybiAwLjAgKGFzc2VydGVkIGJ5IFRpbTsgcHJvb2YgdG9vIGxvbmcgZm9yIGEgY29tbWVudCkuCisgICAgICAgIHJldHVybiAoeC8zMDI2OS4wICsgeS8zMDMwNy4wICsgei8zMDMyMy4wKSAlIDEuMAorCisgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gaW50ZXJuYWwgc3RhdGU7IGNhbiBiZSBwYXNzZWQgdG8gc2V0c3RhdGUoKSBsYXRlci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuVkVSU0lPTiwgc2VsZi5fc2VlZCwgc2VsZi5nYXVzc19uZXh0CisKKyAgICBkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgorICAgICAgICAiIiJSZXN0b3JlIGludGVybmFsIHN0YXRlIGZyb20gb2JqZWN0IHJldHVybmVkIGJ5IGdldHN0YXRlKCkuIiIiCisgICAgICAgIHZlcnNpb24gPSBzdGF0ZVswXQorICAgICAgICBpZiB2ZXJzaW9uID09IDE6CisgICAgICAgICAgICB2ZXJzaW9uLCBzZWxmLl9zZWVkLCBzZWxmLmdhdXNzX25leHQgPSBzdGF0ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RhdGUgd2l0aCB2ZXJzaW9uICVzIHBhc3NlZCB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSYW5kb20uc2V0c3RhdGUoKSBvZiB2ZXJzaW9uICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2ZXJzaW9uLCBzZWxmLlZFUlNJT04pKQorCisgICAgZGVmIGp1bXBhaGVhZChzZWxmLCBuKToKKyAgICAgICAgIiIiQWN0IGFzIGlmIG4gY2FsbHMgdG8gcmFuZG9tKCkgd2VyZSBtYWRlLCBidXQgcXVpY2tseS4KKworICAgICAgICBuIGlzIGFuIGludCwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuCisKKyAgICAgICAgRXhhbXBsZSB1c2U6ICBJZiB5b3UgaGF2ZSAyIHRocmVhZHMgYW5kIGtub3cgdGhhdCBlYWNoIHdpbGwKKyAgICAgICAgY29uc3VtZSBubyBtb3JlIHRoYW4gYSBtaWxsaW9uIHJhbmRvbSBudW1iZXJzLCBjcmVhdGUgdHdvIFJhbmRvbQorICAgICAgICBvYmplY3RzIHIxIGFuZCByMiwgdGhlbiBkbworICAgICAgICAgICAgcjIuc2V0c3RhdGUocjEuZ2V0c3RhdGUoKSkKKyAgICAgICAgICAgIHIyLmp1bXBhaGVhZCgxMDAwMDAwKQorICAgICAgICBUaGVuIHIxIGFuZCByMiB3aWxsIHVzZSBndWFyYW50ZWVkLWRpc2pvaW50IHNlZ21lbnRzIG9mIHRoZSBmdWxsCisgICAgICAgIHBlcmlvZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IG4gPj0gMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm4gbXVzdCBiZSA+PSAwIikKKyAgICAgICAgeCwgeSwgeiA9IHNlbGYuX3NlZWQKKyAgICAgICAgeCA9IGludCh4ICogcG93KDE3MSwgbiwgMzAyNjkpKSAlIDMwMjY5CisgICAgICAgIHkgPSBpbnQoeSAqIHBvdygxNzIsIG4sIDMwMzA3KSkgJSAzMDMwNworICAgICAgICB6ID0gaW50KHogKiBwb3coMTcwLCBuLCAzMDMyMykpICUgMzAzMjMKKyAgICAgICAgc2VsZi5fc2VlZCA9IHgsIHksIHoKKworICAgIGRlZiBfX3doc2VlZChzZWxmLCB4PTAsIHk9MCwgej0wKToKKyAgICAgICAgIiIiU2V0IHRoZSBXaWNobWFubi1IaWxsIHNlZWQgZnJvbSAoeCwgeSwgeikuCisKKyAgICAgICAgVGhlc2UgbXVzdCBiZSBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgWzAsIDI1NikuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5vdCB0eXBlKHgpID09IHR5cGUoeSkgPT0gdHlwZSh6KSA9PSBpbnQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3NlZWRzIG11c3QgYmUgaW50ZWdlcnMnKQorICAgICAgICBpZiBub3QgKDAgPD0geCA8IDI1NiBhbmQgMCA8PSB5IDwgMjU2IGFuZCAwIDw9IHogPCAyNTYpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignc2VlZHMgbXVzdCBiZSBpbiByYW5nZSgwLCAyNTYpJykKKyAgICAgICAgaWYgMCA9PSB4ID09IHkgPT0gejoKKyAgICAgICAgICAgICMgSW5pdGlhbGl6ZSBmcm9tIGN1cnJlbnQgdGltZQorICAgICAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHQgPSBsb25nKHRpbWUudGltZSgpICogMjU2KQorICAgICAgICAgICAgdCA9IGludCgodCYweGZmZmZmZikgXiAodD4+MjQpKQorICAgICAgICAgICAgdCwgeCA9IGRpdm1vZCh0LCAyNTYpCisgICAgICAgICAgICB0LCB5ID0gZGl2bW9kKHQsIDI1NikKKyAgICAgICAgICAgIHQsIHogPSBkaXZtb2QodCwgMjU2KQorICAgICAgICAjIFplcm8gaXMgYSBwb29yIHNlZWQsIHNvIHN1YnN0aXR1dGUgMQorICAgICAgICBzZWxmLl9zZWVkID0gKHggb3IgMSwgeSBvciAxLCB6IG9yIDEpCisKKyAgICAgICAgc2VsZi5nYXVzc19uZXh0ID0gTm9uZQorCisgICAgZGVmIHdoc2VlZChzZWxmLCBhPU5vbmUpOgorICAgICAgICAiIiJTZWVkIGZyb20gaGFzaGFibGUgb2JqZWN0J3MgaGFzaCBjb2RlLgorCisgICAgICAgIE5vbmUgb3Igbm8gYXJndW1lbnQgc2VlZHMgZnJvbSBjdXJyZW50IHRpbWUuICBJdCBpcyBub3QgZ3VhcmFudGVlZAorICAgICAgICB0aGF0IG9iamVjdHMgd2l0aCBkaXN0aW5jdCBoYXNoIGNvZGVzIGxlYWQgdG8gZGlzdGluY3QgaW50ZXJuYWwKKyAgICAgICAgc3RhdGVzLgorCisgICAgICAgIFRoaXMgaXMgb2Jzb2xldGUsIHByb3ZpZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIHNlZWQgcm91dGluZQorICAgICAgICB1c2VkIHByaW9yIHRvIFB5dGhvbiAyLjEuICBVc2UgdGhlIC5zZWVkKCkgbWV0aG9kIGluc3RlYWQuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIGEgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX193aHNlZWQoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGEgPSBoYXNoKGEpCisgICAgICAgIGEsIHggPSBkaXZtb2QoYSwgMjU2KQorICAgICAgICBhLCB5ID0gZGl2bW9kKGEsIDI1NikKKyAgICAgICAgYSwgeiA9IGRpdm1vZChhLCAyNTYpCisgICAgICAgIHggPSAoeCArIGEpICUgMjU2IG9yIDEKKyAgICAgICAgeSA9ICh5ICsgYSkgJSAyNTYgb3IgMQorICAgICAgICB6ID0gKHogKyBhKSAlIDI1NiBvciAxCisgICAgICAgIHNlbGYuX193aHNlZWQoeCwgeSwgeikKKworIyMgLS0tLS0tLS0tLS0tLS0tIE9wZXJhdGluZyBTeXN0ZW0gUmFuZG9tIFNvdXJjZSAgLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFN5c3RlbVJhbmRvbShSYW5kb20pOgorICAgICIiIkFsdGVybmF0ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB1c2luZyBzb3VyY2VzIHByb3ZpZGVkCisgICAgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0gKHN1Y2ggYXMgL2Rldi91cmFuZG9tIG9uIFVuaXggb3IKKyAgICBDcnlwdEdlblJhbmRvbSBvbiBXaW5kb3dzKS4KKworICAgICBOb3QgYXZhaWxhYmxlIG9uIGFsbCBzeXN0ZW1zIChzZWUgb3MudXJhbmRvbSgpIGZvciBkZXRhaWxzKS4KKyAgICAiIiIKKworICAgIGRlZiByYW5kb20oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgbmV4dCByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBbMC4wLCAxLjApLiIiIgorICAgICAgICByZXR1cm4gKGxvbmcoX2hleGxpZnkoX3VyYW5kb20oNykpLCAxNikgPj4gMykgKiBSRUNJUF9CUEYKKworICAgIGRlZiBnZXRyYW5kYml0cyhzZWxmLCBrKToKKyAgICAgICAgIiIiZ2V0cmFuZGJpdHMoaykgLT4geC4gIEdlbmVyYXRlcyBhIGxvbmcgaW50IHdpdGggayByYW5kb20gYml0cy4iIiIKKyAgICAgICAgaWYgayA8PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignbnVtYmVyIG9mIGJpdHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybycpCisgICAgICAgIGlmIGsgIT0gaW50KGspOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdudW1iZXIgb2YgYml0cyBzaG91bGQgYmUgYW4gaW50ZWdlcicpCisgICAgICAgIGJ5dGVzID0gKGsgKyA3KSAvLyA4ICAgICAgICAgICAgICAgICAgICAjIGJpdHMgLyA4IGFuZCByb3VuZGVkIHVwCisgICAgICAgIHggPSBsb25nKF9oZXhsaWZ5KF91cmFuZG9tKGJ5dGVzKSksIDE2KQorICAgICAgICByZXR1cm4geCA+PiAoYnl0ZXMgKiA4IC0gaykgICAgICAgICAgICAgIyB0cmltIGV4Y2VzcyBiaXRzCisKKyAgICBkZWYgX3N0dWIoc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICJTdHViIG1ldGhvZC4gIE5vdCB1c2VkIGZvciBhIHN5c3RlbSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4iCisgICAgICAgIHJldHVybiBOb25lCisgICAgc2VlZCA9IGp1bXBhaGVhZCA9IF9zdHViCisKKyAgICBkZWYgX25vdGltcGxlbWVudGVkKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAiTWV0aG9kIHNob3VsZCBub3QgYmUgY2FsbGVkIGZvciBhIHN5c3RlbSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4iCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoJ1N5c3RlbSBlbnRyb3B5IHNvdXJjZSBkb2VzIG5vdCBoYXZlIHN0YXRlLicpCisgICAgZ2V0c3RhdGUgPSBzZXRzdGF0ZSA9IF9ub3RpbXBsZW1lbnRlZAorCisjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSB0ZXN0IHByb2dyYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIF90ZXN0X2dlbmVyYXRvcihuLCBmdW5jLCBhcmdzKToKKyAgICBpbXBvcnQgdGltZQorICAgIHByaW50IG4sICd0aW1lcycsIGZ1bmMuX19uYW1lX18KKyAgICB0b3RhbCA9IDAuMAorICAgIHNxc3VtID0gMC4wCisgICAgc21hbGxlc3QgPSAxZTEwCisgICAgbGFyZ2VzdCA9IC0xZTEwCisgICAgdDAgPSB0aW1lLnRpbWUoKQorICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICB4ID0gZnVuYygqYXJncykKKyAgICAgICAgdG90YWwgKz0geAorICAgICAgICBzcXN1bSA9IHNxc3VtICsgeCp4CisgICAgICAgIHNtYWxsZXN0ID0gbWluKHgsIHNtYWxsZXN0KQorICAgICAgICBsYXJnZXN0ID0gbWF4KHgsIGxhcmdlc3QpCisgICAgdDEgPSB0aW1lLnRpbWUoKQorICAgIHByaW50IHJvdW5kKHQxLXQwLCAzKSwgJ3NlYywnLAorICAgIGF2ZyA9IHRvdGFsL24KKyAgICBzdGRkZXYgPSBfc3FydChzcXN1bS9uIC0gYXZnKmF2ZykKKyAgICBwcmludCAnYXZnICVnLCBzdGRkZXYgJWcsIG1pbiAlZywgbWF4ICVnJyAlIFwKKyAgICAgICAgICAgICAgKGF2Zywgc3RkZGV2LCBzbWFsbGVzdCwgbGFyZ2VzdCkKKworCitkZWYgX3Rlc3QoTj0yMDAwKToKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgcmFuZG9tLCAoKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgbm9ybWFsdmFyaWF0ZSwgKDAuMCwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgbG9nbm9ybXZhcmlhdGUsICgwLjAsIDEuMCkpCisgICAgX3Rlc3RfZ2VuZXJhdG9yKE4sIHZvbm1pc2VzdmFyaWF0ZSwgKDAuMCwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2FtbWF2YXJpYXRlLCAoMC4wMSwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2FtbWF2YXJpYXRlLCAoMC4xLCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBnYW1tYXZhcmlhdGUsICgwLjEsIDIuMCkpCisgICAgX3Rlc3RfZ2VuZXJhdG9yKE4sIGdhbW1hdmFyaWF0ZSwgKDAuNSwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2FtbWF2YXJpYXRlLCAoMC45LCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBnYW1tYXZhcmlhdGUsICgxLjAsIDEuMCkpCisgICAgX3Rlc3RfZ2VuZXJhdG9yKE4sIGdhbW1hdmFyaWF0ZSwgKDIuMCwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2FtbWF2YXJpYXRlLCAoMjAuMCwgMS4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgZ2FtbWF2YXJpYXRlLCAoMjAwLjAsIDEuMCkpCisgICAgX3Rlc3RfZ2VuZXJhdG9yKE4sIGdhdXNzLCAoMC4wLCAxLjApKQorICAgIF90ZXN0X2dlbmVyYXRvcihOLCBiZXRhdmFyaWF0ZSwgKDMuMCwgMy4wKSkKKyAgICBfdGVzdF9nZW5lcmF0b3IoTiwgdHJpYW5ndWxhciwgKDAuMCwgMS4wLCAxLjAvMy4wKSkKKworIyBDcmVhdGUgb25lIGluc3RhbmNlLCBzZWVkZWQgZnJvbSBjdXJyZW50IHRpbWUsIGFuZCBleHBvcnQgaXRzIG1ldGhvZHMKKyMgYXMgbW9kdWxlLWxldmVsIGZ1bmN0aW9ucy4gIFRoZSBmdW5jdGlvbnMgc2hhcmUgc3RhdGUgYWNyb3NzIGFsbCB1c2VzCisjKGJvdGggaW4gdGhlIHVzZXIncyBjb2RlIGFuZCBpbiB0aGUgUHl0aG9uIGxpYnJhcmllcyksIGJ1dCB0aGF0J3MgZmluZQorIyBmb3IgbW9zdCBwcm9ncmFtcyBhbmQgaXMgZWFzaWVyIGZvciB0aGUgY2FzdWFsIHVzZXIgdGhhbiBtYWtpbmcgdGhlbQorIyBpbnN0YW50aWF0ZSB0aGVpciBvd24gUmFuZG9tKCkgaW5zdGFuY2UuCisKK19pbnN0ID0gUmFuZG9tKCkKK3NlZWQgPSBfaW5zdC5zZWVkCityYW5kb20gPSBfaW5zdC5yYW5kb20KK3VuaWZvcm0gPSBfaW5zdC51bmlmb3JtCit0cmlhbmd1bGFyID0gX2luc3QudHJpYW5ndWxhcgorcmFuZGludCA9IF9pbnN0LnJhbmRpbnQKK2Nob2ljZSA9IF9pbnN0LmNob2ljZQorcmFuZHJhbmdlID0gX2luc3QucmFuZHJhbmdlCitzYW1wbGUgPSBfaW5zdC5zYW1wbGUKK3NodWZmbGUgPSBfaW5zdC5zaHVmZmxlCitub3JtYWx2YXJpYXRlID0gX2luc3Qubm9ybWFsdmFyaWF0ZQorbG9nbm9ybXZhcmlhdGUgPSBfaW5zdC5sb2dub3JtdmFyaWF0ZQorZXhwb3ZhcmlhdGUgPSBfaW5zdC5leHBvdmFyaWF0ZQordm9ubWlzZXN2YXJpYXRlID0gX2luc3Qudm9ubWlzZXN2YXJpYXRlCitnYW1tYXZhcmlhdGUgPSBfaW5zdC5nYW1tYXZhcmlhdGUKK2dhdXNzID0gX2luc3QuZ2F1c3MKK2JldGF2YXJpYXRlID0gX2luc3QuYmV0YXZhcmlhdGUKK3BhcmV0b3ZhcmlhdGUgPSBfaW5zdC5wYXJldG92YXJpYXRlCit3ZWlidWxsdmFyaWF0ZSA9IF9pbnN0LndlaWJ1bGx2YXJpYXRlCitnZXRzdGF0ZSA9IF9pbnN0LmdldHN0YXRlCitzZXRzdGF0ZSA9IF9pbnN0LnNldHN0YXRlCitqdW1wYWhlYWQgPSBfaW5zdC5qdW1wYWhlYWQKK2dldHJhbmRiaXRzID0gX2luc3QuZ2V0cmFuZGJpdHMKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JhbmRvbS5weWMgYi9saWIvcHl0aG9uMi43L3JhbmRvbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhNTgyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmFuZG9tLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JhbmRvbS5weW8gYi9saWIvcHl0aG9uMi43L3JhbmRvbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFhNTgyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmFuZG9tLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JlLnB5IGIvbGliL3B5dGhvbjIuNy9yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWI1ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZS5weQpAQCAtMCwwICsxLDMyNCBAQAorIworIyBTZWNyZXQgTGFicycgUmVndWxhciBFeHByZXNzaW9uIEVuZ2luZQorIworIyByZS1jb21wYXRpYmxlIGludGVyZmFjZSBmb3IgdGhlIHNyZSBtYXRjaGluZyBlbmdpbmUKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgYnkgU2VjcmV0IExhYnMgQUIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHZlcnNpb24gb2YgdGhlIFNSRSBsaWJyYXJ5IGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIENOUkkncworIyBQeXRob24gMS42IGxpY2Vuc2UuICBGb3IgYW55IG90aGVyIHVzZSwgcGxlYXNlIGNvbnRhY3QgU2VjcmV0IExhYnMKKyMgQUIgKGluZm9AcHl0aG9ud2FyZS5jb20pLgorIworIyBQb3J0aW9ucyBvZiB0aGlzIGVuZ2luZSBoYXZlIGJlZW4gZGV2ZWxvcGVkIGluIGNvb3BlcmF0aW9uIHdpdGgKKyMgQ05SSS4gIEhld2xldHQtUGFja2FyZCBwcm92aWRlZCBmdW5kaW5nIGZvciAxLjYgaW50ZWdyYXRpb24gYW5kCisjIG90aGVyIGNvbXBhdGliaWxpdHkgd29yay4KKyMKKworciIiIlN1cHBvcnQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKFJFKS4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgcmVndWxhciBleHByZXNzaW9uIG1hdGNoaW5nIG9wZXJhdGlvbnMgc2ltaWxhciB0bwordGhvc2UgZm91bmQgaW4gUGVybC4gIEl0IHN1cHBvcnRzIGJvdGggOC1iaXQgYW5kIFVuaWNvZGUgc3RyaW5nczsgYm90aAordGhlIHBhdHRlcm4gYW5kIHRoZSBzdHJpbmdzIGJlaW5nIHByb2Nlc3NlZCBjYW4gY29udGFpbiBudWxsIGJ5dGVzIGFuZAorY2hhcmFjdGVycyBvdXRzaWRlIHRoZSBVUyBBU0NJSSByYW5nZS4KKworUmVndWxhciBleHByZXNzaW9ucyBjYW4gY29udGFpbiBib3RoIHNwZWNpYWwgYW5kIG9yZGluYXJ5IGNoYXJhY3RlcnMuCitNb3N0IG9yZGluYXJ5IGNoYXJhY3RlcnMsIGxpa2UgIkEiLCAiYSIsIG9yICIwIiwgYXJlIHRoZSBzaW1wbGVzdAorcmVndWxhciBleHByZXNzaW9uczsgdGhleSBzaW1wbHkgbWF0Y2ggdGhlbXNlbHZlcy4gIFlvdSBjYW4KK2NvbmNhdGVuYXRlIG9yZGluYXJ5IGNoYXJhY3RlcnMsIHNvIGxhc3QgbWF0Y2hlcyB0aGUgc3RyaW5nICdsYXN0Jy4KKworVGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmU6CisgICAgIi4iICAgICAgTWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGV4Y2VwdCBhIG5ld2xpbmUuCisgICAgIl4iICAgICAgTWF0Y2hlcyB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4KKyAgICAiJCIgICAgICBNYXRjaGVzIHRoZSBlbmQgb2YgdGhlIHN0cmluZyBvciBqdXN0IGJlZm9yZSB0aGUgbmV3bGluZSBhdAorICAgICAgICAgICAgIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgICAiKiIgICAgICBNYXRjaGVzIDAgb3IgbW9yZSAoZ3JlZWR5KSByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLgorICAgICAgICAgICAgIEdyZWVkeSBtZWFucyB0aGF0IGl0IHdpbGwgbWF0Y2ggYXMgbWFueSByZXBldGl0aW9ucyBhcyBwb3NzaWJsZS4KKyAgICAiKyIgICAgICBNYXRjaGVzIDEgb3IgbW9yZSAoZ3JlZWR5KSByZXBldGl0aW9ucyBvZiB0aGUgcHJlY2VkaW5nIFJFLgorICAgICI/IiAgICAgIE1hdGNoZXMgMCBvciAxIChncmVlZHkpIG9mIHRoZSBwcmVjZWRpbmcgUkUuCisgICAgKj8sKz8sPz8gTm9uLWdyZWVkeSB2ZXJzaW9ucyBvZiB0aGUgcHJldmlvdXMgdGhyZWUgc3BlY2lhbCBjaGFyYWN0ZXJzLgorICAgIHttLG59ICAgIE1hdGNoZXMgZnJvbSBtIHRvIG4gcmVwZXRpdGlvbnMgb2YgdGhlIHByZWNlZGluZyBSRS4KKyAgICB7bSxufT8gICBOb24tZ3JlZWR5IHZlcnNpb24gb2YgdGhlIGFib3ZlLgorICAgICJcXCIgICAgIEVpdGhlciBlc2NhcGVzIHNwZWNpYWwgY2hhcmFjdGVycyBvciBzaWduYWxzIGEgc3BlY2lhbCBzZXF1ZW5jZS4KKyAgICBbXSAgICAgICBJbmRpY2F0ZXMgYSBzZXQgb2YgY2hhcmFjdGVycy4KKyAgICAgICAgICAgICBBICJeIiBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIGluZGljYXRlcyBhIGNvbXBsZW1lbnRpbmcgc2V0LgorICAgICJ8IiAgICAgIEF8QiwgY3JlYXRlcyBhbiBSRSB0aGF0IHdpbGwgbWF0Y2ggZWl0aGVyIEEgb3IgQi4KKyAgICAoLi4uKSAgICBNYXRjaGVzIHRoZSBSRSBpbnNpZGUgdGhlIHBhcmVudGhlc2VzLgorICAgICAgICAgICAgIFRoZSBjb250ZW50cyBjYW4gYmUgcmV0cmlldmVkIG9yIG1hdGNoZWQgbGF0ZXIgaW4gdGhlIHN0cmluZy4KKyAgICAoP2lMbXN1eCkgU2V0IHRoZSBJLCBMLCBNLCBTLCBVLCBvciBYIGZsYWcgZm9yIHRoZSBSRSAoc2VlIGJlbG93KS4KKyAgICAoPzouLi4pICBOb24tZ3JvdXBpbmcgdmVyc2lvbiBvZiByZWd1bGFyIHBhcmVudGhlc2VzLgorICAgICg/UDxuYW1lPi4uLikgVGhlIHN1YnN0cmluZyBtYXRjaGVkIGJ5IHRoZSBncm91cCBpcyBhY2Nlc3NpYmxlIGJ5IG5hbWUuCisgICAgKD9QPW5hbWUpICAgICBNYXRjaGVzIHRoZSB0ZXh0IG1hdGNoZWQgZWFybGllciBieSB0aGUgZ3JvdXAgbmFtZWQgbmFtZS4KKyAgICAoPyMuLi4pICBBIGNvbW1lbnQ7IGlnbm9yZWQuCisgICAgKD89Li4uKSAgTWF0Y2hlcyBpZiAuLi4gbWF0Y2hlcyBuZXh0LCBidXQgZG9lc24ndCBjb25zdW1lIHRoZSBzdHJpbmcuCisgICAgKD8hLi4uKSAgTWF0Y2hlcyBpZiAuLi4gZG9lc24ndCBtYXRjaCBuZXh0LgorICAgICg/PD0uLi4pIE1hdGNoZXMgaWYgcHJlY2VkZWQgYnkgLi4uIChtdXN0IGJlIGZpeGVkIGxlbmd0aCkuCisgICAgKD88IS4uLikgTWF0Y2hlcyBpZiBub3QgcHJlY2VkZWQgYnkgLi4uIChtdXN0IGJlIGZpeGVkIGxlbmd0aCkuCisgICAgKD8oaWQvbmFtZSl5ZXN8bm8pIE1hdGNoZXMgeWVzIHBhdHRlcm4gaWYgdGhlIGdyb3VwIHdpdGggaWQvbmFtZSBtYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICAgICB0aGUgKG9wdGlvbmFsKSBubyBwYXR0ZXJuIG90aGVyd2lzZS4KKworVGhlIHNwZWNpYWwgc2VxdWVuY2VzIGNvbnNpc3Qgb2YgIlxcIiBhbmQgYSBjaGFyYWN0ZXIgZnJvbSB0aGUgbGlzdAorYmVsb3cuICBJZiB0aGUgb3JkaW5hcnkgY2hhcmFjdGVyIGlzIG5vdCBvbiB0aGUgbGlzdCwgdGhlbiB0aGUKK3Jlc3VsdGluZyBSRSB3aWxsIG1hdGNoIHRoZSBzZWNvbmQgY2hhcmFjdGVyLgorICAgIFxudW1iZXIgIE1hdGNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBncm91cCBvZiB0aGUgc2FtZSBudW1iZXIuCisgICAgXEEgICAgICAgTWF0Y2hlcyBvbmx5IGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLgorICAgIFxaICAgICAgIE1hdGNoZXMgb25seSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgICAgXGIgICAgICAgTWF0Y2hlcyB0aGUgZW1wdHkgc3RyaW5nLCBidXQgb25seSBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGEgd29yZC4KKyAgICBcQiAgICAgICBNYXRjaGVzIHRoZSBlbXB0eSBzdHJpbmcsIGJ1dCBub3QgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiBhIHdvcmQuCisgICAgXGQgICAgICAgTWF0Y2hlcyBhbnkgZGVjaW1hbCBkaWdpdDsgZXF1aXZhbGVudCB0byB0aGUgc2V0IFswLTldLgorICAgIFxEICAgICAgIE1hdGNoZXMgYW55IG5vbi1kaWdpdCBjaGFyYWN0ZXI7IGVxdWl2YWxlbnQgdG8gdGhlIHNldCBbXjAtOV0uCisgICAgXHMgICAgICAgTWF0Y2hlcyBhbnkgd2hpdGVzcGFjZSBjaGFyYWN0ZXI7IGVxdWl2YWxlbnQgdG8gWyBcdFxuXHJcZlx2XS4KKyAgICBcUyAgICAgICBNYXRjaGVzIGFueSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXI7IGVxdWl2LiB0byBbXiBcdFxuXHJcZlx2XS4KKyAgICBcdyAgICAgICBNYXRjaGVzIGFueSBhbHBoYW51bWVyaWMgY2hhcmFjdGVyOyBlcXVpdmFsZW50IHRvIFthLXpBLVowLTlfXS4KKyAgICAgICAgICAgICBXaXRoIExPQ0FMRSwgaXQgd2lsbCBtYXRjaCB0aGUgc2V0IFswLTlfXSBwbHVzIGNoYXJhY3RlcnMgZGVmaW5lZAorICAgICAgICAgICAgIGFzIGxldHRlcnMgZm9yIHRoZSBjdXJyZW50IGxvY2FsZS4KKyAgICBcVyAgICAgICBNYXRjaGVzIHRoZSBjb21wbGVtZW50IG9mIFx3LgorICAgIFxcICAgICAgIE1hdGNoZXMgYSBsaXRlcmFsIGJhY2tzbGFzaC4KKworVGhpcyBtb2R1bGUgZXhwb3J0cyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKyAgICBtYXRjaCAgICBNYXRjaCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBzdHJpbmcuCisgICAgc2VhcmNoICAgU2VhcmNoIGEgc3RyaW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgYSBwYXR0ZXJuLgorICAgIHN1YiAgICAgIFN1YnN0aXR1dGUgb2NjdXJyZW5jZXMgb2YgYSBwYXR0ZXJuIGZvdW5kIGluIGEgc3RyaW5nLgorICAgIHN1Ym4gICAgIFNhbWUgYXMgc3ViLCBidXQgYWxzbyByZXR1cm4gdGhlIG51bWJlciBvZiBzdWJzdGl0dXRpb25zIG1hZGUuCisgICAgc3BsaXQgICAgU3BsaXQgYSBzdHJpbmcgYnkgdGhlIG9jY3VycmVuY2VzIG9mIGEgcGF0dGVybi4KKyAgICBmaW5kYWxsICBGaW5kIGFsbCBvY2N1cnJlbmNlcyBvZiBhIHBhdHRlcm4gaW4gYSBzdHJpbmcuCisgICAgZmluZGl0ZXIgUmV0dXJuIGFuIGl0ZXJhdG9yIHlpZWxkaW5nIGEgbWF0Y2ggb2JqZWN0IGZvciBlYWNoIG1hdGNoLgorICAgIGNvbXBpbGUgIENvbXBpbGUgYSBwYXR0ZXJuIGludG8gYSBSZWdleE9iamVjdC4KKyAgICBwdXJnZSAgICBDbGVhciB0aGUgcmVndWxhciBleHByZXNzaW9uIGNhY2hlLgorICAgIGVzY2FwZSAgIEJhY2tzbGFzaCBhbGwgbm9uLWFscGhhbnVtZXJpY3MgaW4gYSBzdHJpbmcuCisKK1NvbWUgb2YgdGhlIGZ1bmN0aW9ucyBpbiB0aGlzIG1vZHVsZSB0YWtlcyBmbGFncyBhcyBvcHRpb25hbCBwYXJhbWV0ZXJzOgorICAgIEkgIElHTk9SRUNBU0UgIFBlcmZvcm0gY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaGluZy4KKyAgICBMICBMT0NBTEUgICAgICBNYWtlIFx3LCBcVywgXGIsIFxCLCBkZXBlbmRlbnQgb24gdGhlIGN1cnJlbnQgbG9jYWxlLgorICAgIE0gIE1VTFRJTElORSAgICJeIiBtYXRjaGVzIHRoZSBiZWdpbm5pbmcgb2YgbGluZXMgKGFmdGVyIGEgbmV3bGluZSkKKyAgICAgICAgICAgICAgICAgICBhcyB3ZWxsIGFzIHRoZSBzdHJpbmcuCisgICAgICAgICAgICAgICAgICAgIiQiIG1hdGNoZXMgdGhlIGVuZCBvZiBsaW5lcyAoYmVmb3JlIGEgbmV3bGluZSkgYXMgd2VsbAorICAgICAgICAgICAgICAgICAgIGFzIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKyAgICBTICBET1RBTEwgICAgICAiLiIgbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGF0IGFsbCwgaW5jbHVkaW5nIHRoZSBuZXdsaW5lLgorICAgIFggIFZFUkJPU0UgICAgIElnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBmb3IgbmljZXIgbG9va2luZyBSRSdzLgorICAgIFUgIFVOSUNPREUgICAgIE1ha2UgXHcsIFxXLCBcYiwgXEIsIGRlcGVuZGVudCBvbiB0aGUgVW5pY29kZSBsb2NhbGUuCisKK1RoaXMgbW9kdWxlIGFsc28gZGVmaW5lcyBhbiBleGNlcHRpb24gJ2Vycm9yJy4KKworIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBzcmVfY29tcGlsZQoraW1wb3J0IHNyZV9wYXJzZQorCisjIHB1YmxpYyBzeW1ib2xzCitfX2FsbF9fID0gWyAibWF0Y2giLCAic2VhcmNoIiwgInN1YiIsICJzdWJuIiwgInNwbGl0IiwgImZpbmRhbGwiLAorICAgICJjb21waWxlIiwgInB1cmdlIiwgInRlbXBsYXRlIiwgImVzY2FwZSIsICJJIiwgIkwiLCAiTSIsICJTIiwgIlgiLAorICAgICJVIiwgIklHTk9SRUNBU0UiLCAiTE9DQUxFIiwgIk1VTFRJTElORSIsICJET1RBTEwiLCAiVkVSQk9TRSIsCisgICAgIlVOSUNPREUiLCAiZXJyb3IiIF0KKworX192ZXJzaW9uX18gPSAiMi4yLjEiCisKKyMgZmxhZ3MKK0kgPSBJR05PUkVDQVNFID0gc3JlX2NvbXBpbGUuU1JFX0ZMQUdfSUdOT1JFQ0FTRSAjIGlnbm9yZSBjYXNlCitMID0gTE9DQUxFID0gc3JlX2NvbXBpbGUuU1JFX0ZMQUdfTE9DQUxFICMgYXNzdW1lIGN1cnJlbnQgOC1iaXQgbG9jYWxlCitVID0gVU5JQ09ERSA9IHNyZV9jb21waWxlLlNSRV9GTEFHX1VOSUNPREUgIyBhc3N1bWUgdW5pY29kZSBsb2NhbGUKK00gPSBNVUxUSUxJTkUgPSBzcmVfY29tcGlsZS5TUkVfRkxBR19NVUxUSUxJTkUgIyBtYWtlIGFuY2hvcnMgbG9vayBmb3IgbmV3bGluZQorUyA9IERPVEFMTCA9IHNyZV9jb21waWxlLlNSRV9GTEFHX0RPVEFMTCAjIG1ha2UgZG90IG1hdGNoIG5ld2xpbmUKK1ggPSBWRVJCT1NFID0gc3JlX2NvbXBpbGUuU1JFX0ZMQUdfVkVSQk9TRSAjIGlnbm9yZSB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cworCisjIHNyZSBleHRlbnNpb25zIChleHBlcmltZW50YWwsIGRvbid0IHJlbHkgb24gdGhlc2UpCitUID0gVEVNUExBVEUgPSBzcmVfY29tcGlsZS5TUkVfRkxBR19URU1QTEFURSAjIGRpc2FibGUgYmFja3RyYWNraW5nCitERUJVRyA9IHNyZV9jb21waWxlLlNSRV9GTEFHX0RFQlVHICMgZHVtcCBwYXR0ZXJuIGFmdGVyIGNvbXBpbGF0aW9uCisKKyMgc3JlIGV4Y2VwdGlvbgorZXJyb3IgPSBzcmVfY29tcGlsZS5lcnJvcgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHB1YmxpYyBpbnRlcmZhY2UKKworZGVmIG1hdGNoKHBhdHRlcm4sIHN0cmluZywgZmxhZ3M9MCk6CisgICAgIiIiVHJ5IHRvIGFwcGx5IHRoZSBwYXR0ZXJuIGF0IHRoZSBzdGFydCBvZiB0aGUgc3RyaW5nLCByZXR1cm5pbmcKKyAgICBhIG1hdGNoIG9iamVjdCwgb3IgTm9uZSBpZiBubyBtYXRjaCB3YXMgZm91bmQuIiIiCisgICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzKS5tYXRjaChzdHJpbmcpCisKK2RlZiBzZWFyY2gocGF0dGVybiwgc3RyaW5nLCBmbGFncz0wKToKKyAgICAiIiJTY2FuIHRocm91Z2ggc3RyaW5nIGxvb2tpbmcgZm9yIGEgbWF0Y2ggdG8gdGhlIHBhdHRlcm4sIHJldHVybmluZworICAgIGEgbWF0Y2ggb2JqZWN0LCBvciBOb25lIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4iIiIKKyAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpLnNlYXJjaChzdHJpbmcpCisKK2RlZiBzdWIocGF0dGVybiwgcmVwbCwgc3RyaW5nLCBjb3VudD0wLCBmbGFncz0wKToKKyAgICAiIiJSZXR1cm4gdGhlIHN0cmluZyBvYnRhaW5lZCBieSByZXBsYWNpbmcgdGhlIGxlZnRtb3N0CisgICAgbm9uLW92ZXJsYXBwaW5nIG9jY3VycmVuY2VzIG9mIHRoZSBwYXR0ZXJuIGluIHN0cmluZyBieSB0aGUKKyAgICByZXBsYWNlbWVudCByZXBsLiAgcmVwbCBjYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGEgY2FsbGFibGU7CisgICAgaWYgYSBzdHJpbmcsIGJhY2tzbGFzaCBlc2NhcGVzIGluIGl0IGFyZSBwcm9jZXNzZWQuICBJZiBpdCBpcworICAgIGEgY2FsbGFibGUsIGl0J3MgcGFzc2VkIHRoZSBtYXRjaCBvYmplY3QgYW5kIG11c3QgcmV0dXJuCisgICAgYSByZXBsYWNlbWVudCBzdHJpbmcgdG8gYmUgdXNlZC4iIiIKKyAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpLnN1YihyZXBsLCBzdHJpbmcsIGNvdW50KQorCitkZWYgc3VibihwYXR0ZXJuLCByZXBsLCBzdHJpbmcsIGNvdW50PTAsIGZsYWdzPTApOgorICAgICIiIlJldHVybiBhIDItdHVwbGUgY29udGFpbmluZyAobmV3X3N0cmluZywgbnVtYmVyKS4KKyAgICBuZXdfc3RyaW5nIGlzIHRoZSBzdHJpbmcgb2J0YWluZWQgYnkgcmVwbGFjaW5nIHRoZSBsZWZ0bW9zdAorICAgIG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiB0aGUgcGF0dGVybiBpbiB0aGUgc291cmNlCisgICAgc3RyaW5nIGJ5IHRoZSByZXBsYWNlbWVudCByZXBsLiAgbnVtYmVyIGlzIHRoZSBudW1iZXIgb2YKKyAgICBzdWJzdGl0dXRpb25zIHRoYXQgd2VyZSBtYWRlLiByZXBsIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYQorICAgIGNhbGxhYmxlOyBpZiBhIHN0cmluZywgYmFja3NsYXNoIGVzY2FwZXMgaW4gaXQgYXJlIHByb2Nlc3NlZC4KKyAgICBJZiBpdCBpcyBhIGNhbGxhYmxlLCBpdCdzIHBhc3NlZCB0aGUgbWF0Y2ggb2JqZWN0IGFuZCBtdXN0CisgICAgcmV0dXJuIGEgcmVwbGFjZW1lbnQgc3RyaW5nIHRvIGJlIHVzZWQuIiIiCisgICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzKS5zdWJuKHJlcGwsIHN0cmluZywgY291bnQpCisKK2RlZiBzcGxpdChwYXR0ZXJuLCBzdHJpbmcsIG1heHNwbGl0PTAsIGZsYWdzPTApOgorICAgICIiIlNwbGl0IHRoZSBzb3VyY2Ugc3RyaW5nIGJ5IHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgcGF0dGVybiwKKyAgICByZXR1cm5pbmcgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHJlc3VsdGluZyBzdWJzdHJpbmdzLiIiIgorICAgIHJldHVybiBfY29tcGlsZShwYXR0ZXJuLCBmbGFncykuc3BsaXQoc3RyaW5nLCBtYXhzcGxpdCkKKworZGVmIGZpbmRhbGwocGF0dGVybiwgc3RyaW5nLCBmbGFncz0wKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBub24tb3ZlcmxhcHBpbmcgbWF0Y2hlcyBpbiB0aGUgc3RyaW5nLgorCisgICAgSWYgb25lIG9yIG1vcmUgZ3JvdXBzIGFyZSBwcmVzZW50IGluIHRoZSBwYXR0ZXJuLCByZXR1cm4gYQorICAgIGxpc3Qgb2YgZ3JvdXBzOyB0aGlzIHdpbGwgYmUgYSBsaXN0IG9mIHR1cGxlcyBpZiB0aGUgcGF0dGVybgorICAgIGhhcyBtb3JlIHRoYW4gb25lIGdyb3VwLgorCisgICAgRW1wdHkgbWF0Y2hlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdC4iIiIKKyAgICByZXR1cm4gX2NvbXBpbGUocGF0dGVybiwgZmxhZ3MpLmZpbmRhbGwoc3RyaW5nKQorCitpZiBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDIwMDAwOgorICAgIF9fYWxsX18uYXBwZW5kKCJmaW5kaXRlciIpCisgICAgZGVmIGZpbmRpdGVyKHBhdHRlcm4sIHN0cmluZywgZmxhZ3M9MCk6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciBvdmVyIGFsbCBub24tb3ZlcmxhcHBpbmcgbWF0Y2hlcyBpbiB0aGUKKyAgICAgICAgc3RyaW5nLiAgRm9yIGVhY2ggbWF0Y2gsIHRoZSBpdGVyYXRvciByZXR1cm5zIGEgbWF0Y2ggb2JqZWN0LgorCisgICAgICAgIEVtcHR5IG1hdGNoZXMgYXJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHQuIiIiCisgICAgICAgIHJldHVybiBfY29tcGlsZShwYXR0ZXJuLCBmbGFncykuZmluZGl0ZXIoc3RyaW5nKQorCitkZWYgY29tcGlsZShwYXR0ZXJuLCBmbGFncz0wKToKKyAgICAiQ29tcGlsZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLCByZXR1cm5pbmcgYSBwYXR0ZXJuIG9iamVjdC4iCisgICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzKQorCitkZWYgcHVyZ2UoKToKKyAgICAiQ2xlYXIgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjYWNoZSIKKyAgICBfY2FjaGUuY2xlYXIoKQorICAgIF9jYWNoZV9yZXBsLmNsZWFyKCkKKworZGVmIHRlbXBsYXRlKHBhdHRlcm4sIGZsYWdzPTApOgorICAgICJDb21waWxlIGEgdGVtcGxhdGUgcGF0dGVybiwgcmV0dXJuaW5nIGEgcGF0dGVybiBvYmplY3QiCisgICAgcmV0dXJuIF9jb21waWxlKHBhdHRlcm4sIGZsYWdzfFQpCisKK19hbHBoYW51bSA9IGZyb3plbnNldCgKKyAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiKQorCitkZWYgZXNjYXBlKHBhdHRlcm4pOgorICAgICJFc2NhcGUgYWxsIG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVycyBpbiBwYXR0ZXJuLiIKKyAgICBzID0gbGlzdChwYXR0ZXJuKQorICAgIGFscGhhbnVtID0gX2FscGhhbnVtCisgICAgZm9yIGksIGMgaW4gZW51bWVyYXRlKHBhdHRlcm4pOgorICAgICAgICBpZiBjIG5vdCBpbiBhbHBoYW51bToKKyAgICAgICAgICAgIGlmIGMgPT0gIlwwMDAiOgorICAgICAgICAgICAgICAgIHNbaV0gPSAiXFwwMDAiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNbaV0gPSAiXFwiICsgYworICAgIHJldHVybiBwYXR0ZXJuWzowXS5qb2luKHMpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgaW50ZXJuYWxzCisKK19jYWNoZSA9IHt9CitfY2FjaGVfcmVwbCA9IHt9CisKK19wYXR0ZXJuX3R5cGUgPSB0eXBlKHNyZV9jb21waWxlLmNvbXBpbGUoIiIsIDApKQorCitfTUFYQ0FDSEUgPSAxMDAKKworZGVmIF9jb21waWxlKCprZXkpOgorICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgcGF0dGVybgorICAgIGNhY2hla2V5ID0gKHR5cGUoa2V5WzBdKSwpICsga2V5CisgICAgcCA9IF9jYWNoZS5nZXQoY2FjaGVrZXkpCisgICAgaWYgcCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHAKKyAgICBwYXR0ZXJuLCBmbGFncyA9IGtleQorICAgIGlmIGlzaW5zdGFuY2UocGF0dGVybiwgX3BhdHRlcm5fdHlwZSk6CisgICAgICAgIGlmIGZsYWdzOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQ2Fubm90IHByb2Nlc3MgZmxhZ3MgYXJndW1lbnQgd2l0aCBhIGNvbXBpbGVkIHBhdHRlcm4nKQorICAgICAgICByZXR1cm4gcGF0dGVybgorICAgIGlmIG5vdCBzcmVfY29tcGlsZS5pc3N0cmluZyhwYXR0ZXJuKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBzdHJpbmcgb3IgY29tcGlsZWQgcGF0dGVybiIKKyAgICB0cnk6CisgICAgICAgIHAgPSBzcmVfY29tcGlsZS5jb21waWxlKHBhdHRlcm4sIGZsYWdzKQorICAgIGV4Y2VwdCBlcnJvciwgdjoKKyAgICAgICAgcmFpc2UgZXJyb3IsIHYgIyBpbnZhbGlkIGV4cHJlc3Npb24KKyAgICBpZiBsZW4oX2NhY2hlKSA+PSBfTUFYQ0FDSEU6CisgICAgICAgIF9jYWNoZS5jbGVhcigpCisgICAgX2NhY2hlW2NhY2hla2V5XSA9IHAKKyAgICByZXR1cm4gcAorCitkZWYgX2NvbXBpbGVfcmVwbCgqa2V5KToKKyAgICAjIGludGVybmFsOiBjb21waWxlIHJlcGxhY2VtZW50IHBhdHRlcm4KKyAgICBwID0gX2NhY2hlX3JlcGwuZ2V0KGtleSkKKyAgICBpZiBwIGlzIG5vdCBOb25lOgorICAgICAgICByZXR1cm4gcAorICAgIHJlcGwsIHBhdHRlcm4gPSBrZXkKKyAgICB0cnk6CisgICAgICAgIHAgPSBzcmVfcGFyc2UucGFyc2VfdGVtcGxhdGUocmVwbCwgcGF0dGVybikKKyAgICBleGNlcHQgZXJyb3IsIHY6CisgICAgICAgIHJhaXNlIGVycm9yLCB2ICMgaW52YWxpZCBleHByZXNzaW9uCisgICAgaWYgbGVuKF9jYWNoZV9yZXBsKSA+PSBfTUFYQ0FDSEU6CisgICAgICAgIF9jYWNoZV9yZXBsLmNsZWFyKCkKKyAgICBfY2FjaGVfcmVwbFtrZXldID0gcAorICAgIHJldHVybiBwCisKK2RlZiBfZXhwYW5kKHBhdHRlcm4sIG1hdGNoLCB0ZW1wbGF0ZSk6CisgICAgIyBpbnRlcm5hbDogbWF0Y2guZXhwYW5kIGltcGxlbWVudGF0aW9uIGhvb2sKKyAgICB0ZW1wbGF0ZSA9IHNyZV9wYXJzZS5wYXJzZV90ZW1wbGF0ZSh0ZW1wbGF0ZSwgcGF0dGVybikKKyAgICByZXR1cm4gc3JlX3BhcnNlLmV4cGFuZF90ZW1wbGF0ZSh0ZW1wbGF0ZSwgbWF0Y2gpCisKK2RlZiBfc3VieChwYXR0ZXJuLCB0ZW1wbGF0ZSk6CisgICAgIyBpbnRlcm5hbDogcGF0dGVybi5zdWIvc3VibiBpbXBsZW1lbnRhdGlvbiBoZWxwZXIKKyAgICB0ZW1wbGF0ZSA9IF9jb21waWxlX3JlcGwodGVtcGxhdGUsIHBhdHRlcm4pCisgICAgaWYgbm90IHRlbXBsYXRlWzBdIGFuZCBsZW4odGVtcGxhdGVbMV0pID09IDE6CisgICAgICAgICMgbGl0ZXJhbCByZXBsYWNlbWVudAorICAgICAgICByZXR1cm4gdGVtcGxhdGVbMV1bMF0KKyAgICBkZWYgZmlsdGVyKG1hdGNoLCB0ZW1wbGF0ZT10ZW1wbGF0ZSk6CisgICAgICAgIHJldHVybiBzcmVfcGFyc2UuZXhwYW5kX3RlbXBsYXRlKHRlbXBsYXRlLCBtYXRjaCkKKyAgICByZXR1cm4gZmlsdGVyCisKKyMgcmVnaXN0ZXIgbXlzZWxmIGZvciBwaWNrbGluZworCitpbXBvcnQgY29weV9yZWcKKworZGVmIF9waWNrbGUocCk6CisgICAgcmV0dXJuIF9jb21waWxlLCAocC5wYXR0ZXJuLCBwLmZsYWdzKQorCitjb3B5X3JlZy5waWNrbGUoX3BhdHRlcm5fdHlwZSwgX3BpY2tsZSwgX2NvbXBpbGUpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZXhwZXJpbWVudGFsIHN0dWZmIChzZWUgcHl0aG9uLWRldiBkaXNjdXNzaW9ucyBmb3IgZGV0YWlscykKKworY2xhc3MgU2Nhbm5lcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGV4aWNvbiwgZmxhZ3M9MCk6CisgICAgICAgIGZyb20gc3JlX2NvbnN0YW50cyBpbXBvcnQgQlJBTkNILCBTVUJQQVRURVJOCisgICAgICAgIHNlbGYubGV4aWNvbiA9IGxleGljb24KKyAgICAgICAgIyBjb21iaW5lIHBocmFzZXMgaW50byBhIGNvbXBvdW5kIHBhdHRlcm4KKyAgICAgICAgcCA9IFtdCisgICAgICAgIHMgPSBzcmVfcGFyc2UuUGF0dGVybigpCisgICAgICAgIHMuZmxhZ3MgPSBmbGFncworICAgICAgICBmb3IgcGhyYXNlLCBhY3Rpb24gaW4gbGV4aWNvbjoKKyAgICAgICAgICAgIHAuYXBwZW5kKHNyZV9wYXJzZS5TdWJQYXR0ZXJuKHMsIFsKKyAgICAgICAgICAgICAgICAoU1VCUEFUVEVSTiwgKGxlbihwKSsxLCBzcmVfcGFyc2UucGFyc2UocGhyYXNlLCBmbGFncykpKSwKKyAgICAgICAgICAgICAgICBdKSkKKyAgICAgICAgcy5ncm91cHMgPSBsZW4ocCkrMQorICAgICAgICBwID0gc3JlX3BhcnNlLlN1YlBhdHRlcm4ocywgWyhCUkFOQ0gsIChOb25lLCBwKSldKQorICAgICAgICBzZWxmLnNjYW5uZXIgPSBzcmVfY29tcGlsZS5jb21waWxlKHApCisgICAgZGVmIHNjYW4oc2VsZiwgc3RyaW5nKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgYXBwZW5kID0gcmVzdWx0LmFwcGVuZAorICAgICAgICBtYXRjaCA9IHNlbGYuc2Nhbm5lci5zY2FubmVyKHN0cmluZykubWF0Y2gKKyAgICAgICAgaSA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIG0gPSBtYXRjaCgpCisgICAgICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaiA9IG0uZW5kKCkKKyAgICAgICAgICAgIGlmIGkgPT0gajoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgYWN0aW9uID0gc2VsZi5sZXhpY29uW20ubGFzdGluZGV4LTFdWzFdCisgICAgICAgICAgICBpZiBoYXNhdHRyKGFjdGlvbiwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICAgICAgc2VsZi5tYXRjaCA9IG0KKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBhY3Rpb24oc2VsZiwgbS5ncm91cCgpKQorICAgICAgICAgICAgaWYgYWN0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGFwcGVuZChhY3Rpb24pCisgICAgICAgICAgICBpID0gagorICAgICAgICByZXR1cm4gcmVzdWx0LCBzdHJpbmdbaTpdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JlLnB5YyBiL2xpYi9weXRob24yLjcvcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4N2Y3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JlLnB5byBiL2xpYi9weXRob24yLjcvcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4N2Y3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3JlcHIucHkgYi9saWIvcHl0aG9uMi43L3JlcHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MyNmNjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmVwci5weQpAQCAtMCwwICsxLDEzMiBAQAorIiIiUmVkbyB0aGUgYnVpbHRpbiByZXByKCkgKHJlcHJlc2VudGF0aW9uKSBidXQgd2l0aCBsaW1pdHMgb24gbW9zdCBzaXplcy4iIiIKKworX19hbGxfXyA9IFsiUmVwciIsInJlcHIiXQorCitpbXBvcnQgX19idWlsdGluX18KK2Zyb20gaXRlcnRvb2xzIGltcG9ydCBpc2xpY2UKKworY2xhc3MgUmVwcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5tYXhsZXZlbCA9IDYKKyAgICAgICAgc2VsZi5tYXh0dXBsZSA9IDYKKyAgICAgICAgc2VsZi5tYXhsaXN0ID0gNgorICAgICAgICBzZWxmLm1heGFycmF5ID0gNQorICAgICAgICBzZWxmLm1heGRpY3QgPSA0CisgICAgICAgIHNlbGYubWF4c2V0ID0gNgorICAgICAgICBzZWxmLm1heGZyb3plbnNldCA9IDYKKyAgICAgICAgc2VsZi5tYXhkZXF1ZSA9IDYKKyAgICAgICAgc2VsZi5tYXhzdHJpbmcgPSAzMAorICAgICAgICBzZWxmLm1heGxvbmcgPSA0MAorICAgICAgICBzZWxmLm1heG90aGVyID0gMjAKKworICAgIGRlZiByZXByKHNlbGYsIHgpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXByMSh4LCBzZWxmLm1heGxldmVsKQorCisgICAgZGVmIHJlcHIxKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgdHlwZW5hbWUgPSB0eXBlKHgpLl9fbmFtZV9fCisgICAgICAgIGlmICcgJyBpbiB0eXBlbmFtZToKKyAgICAgICAgICAgIHBhcnRzID0gdHlwZW5hbWUuc3BsaXQoKQorICAgICAgICAgICAgdHlwZW5hbWUgPSAnXycuam9pbihwYXJ0cykKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAncmVwcl8nICsgdHlwZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgJ3JlcHJfJyArIHR5cGVuYW1lKSh4LCBsZXZlbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSBfX2J1aWx0aW5fXy5yZXByKHgpCisgICAgICAgICAgICBpZiBsZW4ocykgPiBzZWxmLm1heG90aGVyOgorICAgICAgICAgICAgICAgIGkgPSBtYXgoMCwgKHNlbGYubWF4b3RoZXItMykvLzIpCisgICAgICAgICAgICAgICAgaiA9IG1heCgwLCBzZWxmLm1heG90aGVyLTMtaSkKKyAgICAgICAgICAgICAgICBzID0gc1s6aV0gKyAnLi4uJyArIHNbbGVuKHMpLWo6XQorICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfcmVwcl9pdGVyYWJsZShzZWxmLCB4LCBsZXZlbCwgbGVmdCwgcmlnaHQsIG1heGl0ZXIsIHRyYWlsPScnKToKKyAgICAgICAgbiA9IGxlbih4KQorICAgICAgICBpZiBsZXZlbCA8PSAwIGFuZCBuOgorICAgICAgICAgICAgcyA9ICcuLi4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuZXdsZXZlbCA9IGxldmVsIC0gMQorICAgICAgICAgICAgcmVwcjEgPSBzZWxmLnJlcHIxCisgICAgICAgICAgICBwaWVjZXMgPSBbcmVwcjEoZWxlbSwgbmV3bGV2ZWwpIGZvciBlbGVtIGluIGlzbGljZSh4LCBtYXhpdGVyKV0KKyAgICAgICAgICAgIGlmIG4gPiBtYXhpdGVyOiAgcGllY2VzLmFwcGVuZCgnLi4uJykKKyAgICAgICAgICAgIHMgPSAnLCAnLmpvaW4ocGllY2VzKQorICAgICAgICAgICAgaWYgbiA9PSAxIGFuZCB0cmFpbDogIHJpZ2h0ID0gdHJhaWwgKyByaWdodAorICAgICAgICByZXR1cm4gJyVzJXMlcycgJSAobGVmdCwgcywgcmlnaHQpCisKKyAgICBkZWYgcmVwcl90dXBsZShzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXByX2l0ZXJhYmxlKHgsIGxldmVsLCAnKCcsICcpJywgc2VsZi5tYXh0dXBsZSwgJywnKQorCisgICAgZGVmIHJlcHJfbGlzdChzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXByX2l0ZXJhYmxlKHgsIGxldmVsLCAnWycsICddJywgc2VsZi5tYXhsaXN0KQorCisgICAgZGVmIHJlcHJfYXJyYXkoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICBoZWFkZXIgPSAiYXJyYXkoJyVzJywgWyIgJSB4LnR5cGVjb2RlCisgICAgICAgIHJldHVybiBzZWxmLl9yZXByX2l0ZXJhYmxlKHgsIGxldmVsLCBoZWFkZXIsICddKScsIHNlbGYubWF4YXJyYXkpCisKKyAgICBkZWYgcmVwcl9zZXQoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICB4ID0gX3Bvc3NpYmx5X3NvcnRlZCh4KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVwcl9pdGVyYWJsZSh4LCBsZXZlbCwgJ3NldChbJywgJ10pJywgc2VsZi5tYXhzZXQpCisKKyAgICBkZWYgcmVwcl9mcm96ZW5zZXQoc2VsZiwgeCwgbGV2ZWwpOgorICAgICAgICB4ID0gX3Bvc3NpYmx5X3NvcnRlZCh4KQorICAgICAgICByZXR1cm4gc2VsZi5fcmVwcl9pdGVyYWJsZSh4LCBsZXZlbCwgJ2Zyb3plbnNldChbJywgJ10pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXhmcm96ZW5zZXQpCisKKyAgICBkZWYgcmVwcl9kZXF1ZShzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIHJldHVybiBzZWxmLl9yZXByX2l0ZXJhYmxlKHgsIGxldmVsLCAnZGVxdWUoWycsICddKScsIHNlbGYubWF4ZGVxdWUpCisKKyAgICBkZWYgcmVwcl9kaWN0KHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgbiA9IGxlbih4KQorICAgICAgICBpZiBuID09IDA6IHJldHVybiAne30nCisgICAgICAgIGlmIGxldmVsIDw9IDA6IHJldHVybiAney4uLn0nCisgICAgICAgIG5ld2xldmVsID0gbGV2ZWwgLSAxCisgICAgICAgIHJlcHIxID0gc2VsZi5yZXByMQorICAgICAgICBwaWVjZXMgPSBbXQorICAgICAgICBmb3Iga2V5IGluIGlzbGljZShfcG9zc2libHlfc29ydGVkKHgpLCBzZWxmLm1heGRpY3QpOgorICAgICAgICAgICAga2V5cmVwciA9IHJlcHIxKGtleSwgbmV3bGV2ZWwpCisgICAgICAgICAgICB2YWxyZXByID0gcmVwcjEoeFtrZXldLCBuZXdsZXZlbCkKKyAgICAgICAgICAgIHBpZWNlcy5hcHBlbmQoJyVzOiAlcycgJSAoa2V5cmVwciwgdmFscmVwcikpCisgICAgICAgIGlmIG4gPiBzZWxmLm1heGRpY3Q6IHBpZWNlcy5hcHBlbmQoJy4uLicpCisgICAgICAgIHMgPSAnLCAnLmpvaW4ocGllY2VzKQorICAgICAgICByZXR1cm4gJ3slc30nICUgKHMsKQorCisgICAgZGVmIHJlcHJfc3RyKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgcyA9IF9fYnVpbHRpbl9fLnJlcHIoeFs6c2VsZi5tYXhzdHJpbmddKQorICAgICAgICBpZiBsZW4ocykgPiBzZWxmLm1heHN0cmluZzoKKyAgICAgICAgICAgIGkgPSBtYXgoMCwgKHNlbGYubWF4c3RyaW5nLTMpLy8yKQorICAgICAgICAgICAgaiA9IG1heCgwLCBzZWxmLm1heHN0cmluZy0zLWkpCisgICAgICAgICAgICBzID0gX19idWlsdGluX18ucmVwcih4WzppXSArIHhbbGVuKHgpLWo6XSkKKyAgICAgICAgICAgIHMgPSBzWzppXSArICcuLi4nICsgc1tsZW4ocyktajpdCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgcmVwcl9sb25nKHNlbGYsIHgsIGxldmVsKToKKyAgICAgICAgcyA9IF9fYnVpbHRpbl9fLnJlcHIoeCkgIyBYWFggSG9wZSB0aGlzIGlzbid0IHRvbyBzbG93Li4uCisgICAgICAgIGlmIGxlbihzKSA+IHNlbGYubWF4bG9uZzoKKyAgICAgICAgICAgIGkgPSBtYXgoMCwgKHNlbGYubWF4bG9uZy0zKS8vMikKKyAgICAgICAgICAgIGogPSBtYXgoMCwgc2VsZi5tYXhsb25nLTMtaSkKKyAgICAgICAgICAgIHMgPSBzWzppXSArICcuLi4nICsgc1tsZW4ocyktajpdCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgcmVwcl9pbnN0YW5jZShzZWxmLCB4LCBsZXZlbCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBfX2J1aWx0aW5fXy5yZXByKHgpCisgICAgICAgICAgICAjIEJ1Z3MgaW4geC5fX3JlcHJfXygpIGNhbiBjYXVzZSBhcmJpdHJhcnkKKyAgICAgICAgICAgICMgZXhjZXB0aW9ucyAtLSB0aGVuIG1ha2UgdXAgc29tZXRoaW5nCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICByZXR1cm4gJzwlcyBpbnN0YW5jZSBhdCAleD4nICUgKHguX19jbGFzc19fLl9fbmFtZV9fLCBpZCh4KSkKKyAgICAgICAgaWYgbGVuKHMpID4gc2VsZi5tYXhzdHJpbmc6CisgICAgICAgICAgICBpID0gbWF4KDAsIChzZWxmLm1heHN0cmluZy0zKS8vMikKKyAgICAgICAgICAgIGogPSBtYXgoMCwgc2VsZi5tYXhzdHJpbmctMy1pKQorICAgICAgICAgICAgcyA9IHNbOmldICsgJy4uLicgKyBzW2xlbihzKS1qOl0KKyAgICAgICAgcmV0dXJuIHMKKworCitkZWYgX3Bvc3NpYmx5X3NvcnRlZCh4KToKKyAgICAjIFNpbmNlIG5vdCBhbGwgc2VxdWVuY2VzIG9mIGl0ZW1zIGNhbiBiZSBzb3J0ZWQgYW5kIGNvbXBhcmlzb24KKyAgICAjIGZ1bmN0aW9ucyBtYXkgcmFpc2UgYXJiaXRyYXJ5IGV4Y2VwdGlvbnMsIHJldHVybiBhbiB1bnNvcnRlZAorICAgICMgc2VxdWVuY2UgaW4gdGhhdCBjYXNlLgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHNvcnRlZCh4KQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHJldHVybiBsaXN0KHgpCisKK2FSZXByID0gUmVwcigpCityZXByID0gYVJlcHIucmVwcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZXByLnB5YyBiL2xpYi9weXRob24yLjcvcmVwci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1NWYxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmVwci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZXByLnB5byBiL2xpYi9weXRob24yLjcvcmVwci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc1NWYxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmVwci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9yZXhlYy5weSBiL2xpYi9weXRob24yLjcvcmV4ZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0NjE1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmV4ZWMucHkKQEAgLTAsMCArMSw1ODggQEAKKyIiIlJlc3RyaWN0ZWQgZXhlY3V0aW9uIGZhY2lsaXRpZXMuCisKK1RoZSBjbGFzcyBSRXhlYyBleHBvcnRzIG1ldGhvZHMgcl9leGVjKCksIHJfZXZhbCgpLCByX2V4ZWNmaWxlKCksIGFuZAorcl9pbXBvcnQoKSwgd2hpY2ggY29ycmVzcG9uZCByb3VnaGx5IHRvIHRoZSBidWlsdC1pbiBvcGVyYXRpb25zCitleGVjLCBldmFsKCksIGV4ZWNmaWxlKCkgYW5kIGltcG9ydCwgYnV0IGV4ZWN1dGluZyB0aGUgY29kZSBpbiBhbgorZW52aXJvbm1lbnQgdGhhdCBvbmx5IGV4cG9zZXMgdGhvc2UgYnVpbHQtaW4gb3BlcmF0aW9ucyB0aGF0IGFyZQorZGVlbWVkIHNhZmUuICBUbyB0aGlzIGVuZCwgYSBtb2Rlc3QgY29sbGVjdGlvbiBvZiAnZmFrZScgbW9kdWxlcyBpcworY3JlYXRlZCB3aGljaCBtaW1pY3MgdGhlIHN0YW5kYXJkIG1vZHVsZXMgYnkgdGhlIHNhbWUgbmFtZXMuICBJdCBpcyBhCitwb2xpY3kgZGVjaXNpb24gd2hpY2ggYnVpbHQtaW4gbW9kdWxlcyBhbmQgb3BlcmF0aW9ucyBhcmUgbWFkZQorYXZhaWxhYmxlOyB0aGlzIG1vZHVsZSBwcm92aWRlcyBhIHJlYXNvbmFibGUgZGVmYXVsdCwgYnV0IGRlcml2ZWQKK2NsYXNzZXMgY2FuIGNoYW5nZSB0aGUgcG9saWNpZXMgZS5nLiBieSBvdmVycmlkaW5nIG9yIGV4dGVuZGluZyBjbGFzcwordmFyaWFibGVzIGxpa2Ugb2tfYnVpbHRpbl9tb2R1bGVzIG9yIG1ldGhvZHMgbGlrZSBtYWtlX3N5cygpLgorCitYWFggVG8gZG86CistIHJfb3BlbiBzaG91bGQgYWxsb3cgd3JpdGluZyB0bXAgZGlyCistIHJfZXhlYyBldGMuIHdpdGggZXhwbGljaXQgZ2xvYmFscy9sb2NhbHM/IChVc2UgcmV4ZWMoImV4ZWMgLi4uIGluIC4uLiIpPykKKworIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSByZXhlYyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKKworaW1wb3J0IHN5cworaW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgb3MKK2ltcG9ydCBpaG9va3MKK2ltcG9ydCBpbXAKKworX19hbGxfXyA9IFsiUkV4ZWMiXQorCitjbGFzcyBGaWxlQmFzZToKKworICAgIG9rX2ZpbGVfbWV0aG9kcyA9ICgnZmlsZW5vJywgJ2ZsdXNoJywgJ2lzYXR0eScsICdyZWFkJywgJ3JlYWRsaW5lJywKKyAgICAgICAgICAgICdyZWFkbGluZXMnLCAnc2VlaycsICd0ZWxsJywgJ3dyaXRlJywgJ3dyaXRlbGluZXMnLCAneHJlYWRsaW5lcycsCisgICAgICAgICAgICAnX19pdGVyX18nKQorCisKK2NsYXNzIEZpbGVXcmFwcGVyKEZpbGVCYXNlKToKKworICAgICMgWFhYIFRoaXMgaXMganVzdCBsaWtlIGEgQmFzdGlvbiAtLSBzaG91bGQgdXNlIHRoYXQhCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgIGZvciBtIGluIHNlbGYub2tfZmlsZV9tZXRob2RzOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgbSkgYW5kIGhhc2F0dHIoZiwgbSk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtLCBnZXRhdHRyKGYsIG0pKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKworCitURU1QTEFURSA9ICIiIgorZGVmICVzKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5tb2QsIHNlbGYubmFtZSkuJXMoKmFyZ3MpCisiIiIKKworY2xhc3MgRmlsZURlbGVnYXRlKEZpbGVCYXNlKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2QsIG5hbWUpOgorICAgICAgICBzZWxmLm1vZCA9IG1vZAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBmb3IgbSBpbiBGaWxlQmFzZS5va19maWxlX21ldGhvZHMgKyAoJ2Nsb3NlJywpOgorICAgICAgICBleGVjIFRFTVBMQVRFICUgKG0sIG0pCisKKworY2xhc3MgUkhvb2tzKGlob29rcy5Ib29rcyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAjIEhhY2tzIHRvIHN1cHBvcnQgYm90aCBvbGQgYW5kIG5ldyBpbnRlcmZhY2VzOgorICAgICAgICAjIG9sZCBpbnRlcmZhY2Ugd2FzIFJIb29rcyhyZXhlY1ssIHZlcmJvc2VdKQorICAgICAgICAjIG5ldyBpbnRlcmZhY2UgaXMgUkhvb2tzKFt2ZXJib3NlXSkKKyAgICAgICAgdmVyYm9zZSA9IDAKKyAgICAgICAgcmV4ZWMgPSBOb25lCisgICAgICAgIGlmIGFyZ3MgYW5kIHR5cGUoYXJnc1stMV0pID09IHR5cGUoMCk6CisgICAgICAgICAgICB2ZXJib3NlID0gYXJnc1stMV0KKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzotMV0KKyAgICAgICAgaWYgYXJncyBhbmQgaGFzYXR0cihhcmdzWzBdLCAnX19jbGFzc19fJyk6CisgICAgICAgICAgICByZXhlYyA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzWzE6XQorICAgICAgICBpZiBhcmdzOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAidG9vIG1hbnkgYXJndW1lbnRzIgorICAgICAgICBpaG9va3MuSG9va3MuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5yZXhlYyA9IHJleGVjCisKKyAgICBkZWYgc2V0X3JleGVjKHNlbGYsIHJleGVjKToKKyAgICAgICAgIyBDYWxsZWQgYnkgUkV4ZWMgaW5zdGFuY2UgdG8gY29tcGxldGUgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgc2VsZi5yZXhlYyA9IHJleGVjCisKKyAgICBkZWYgZ2V0X3N1ZmZpeGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXhlYy5nZXRfc3VmZml4ZXMoKQorCisgICAgZGVmIGlzX2J1aWx0aW4oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnJleGVjLmlzX2J1aWx0aW4obmFtZSkKKworICAgIGRlZiBpbml0X2J1aWx0aW4oc2VsZiwgbmFtZSk6CisgICAgICAgIG0gPSBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLnJleGVjLmNvcHlfZXhjZXB0KG0sICgpKQorCisgICAgZGVmIGluaXRfZnJvemVuKHNlbGYsIG5hbWUpOiByYWlzZSBTeXN0ZW1FcnJvciwgImRvbid0IHVzZSB0aGlzIgorICAgIGRlZiBsb2FkX3NvdXJjZShzZWxmLCAqYXJncyk6IHJhaXNlIFN5c3RlbUVycm9yLCAiZG9uJ3QgdXNlIHRoaXMiCisgICAgZGVmIGxvYWRfY29tcGlsZWQoc2VsZiwgKmFyZ3MpOiByYWlzZSBTeXN0ZW1FcnJvciwgImRvbid0IHVzZSB0aGlzIgorICAgIGRlZiBsb2FkX3BhY2thZ2Uoc2VsZiwgKmFyZ3MpOiByYWlzZSBTeXN0ZW1FcnJvciwgImRvbid0IHVzZSB0aGlzIgorCisgICAgZGVmIGxvYWRfZHluYW1pYyhzZWxmLCBuYW1lLCBmaWxlbmFtZSwgZmlsZSk6CisgICAgICAgIHJldHVybiBzZWxmLnJleGVjLmxvYWRfZHluYW1pYyhuYW1lLCBmaWxlbmFtZSwgZmlsZSkKKworICAgIGRlZiBhZGRfbW9kdWxlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXhlYy5hZGRfbW9kdWxlKG5hbWUpCisKKyAgICBkZWYgbW9kdWxlc19kaWN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXhlYy5tb2R1bGVzCisKKyAgICBkZWYgZGVmYXVsdF9wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXhlYy5tb2R1bGVzWydzeXMnXS5wYXRoCisKKworIyBYWFggQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK1JNb2R1bGVMb2FkZXIgPSBpaG9va3MuRmFuY3lNb2R1bGVMb2FkZXIKK1JNb2R1bGVJbXBvcnRlciA9IGlob29rcy5Nb2R1bGVJbXBvcnRlcgorCisKK2NsYXNzIFJFeGVjKGlob29rcy5fVmVyYm9zZSk6CisgICAgIiIiQmFzaWMgcmVzdHJpY3RlZCBleGVjdXRpb24gZnJhbWV3b3JrLgorCisgICAgQ29kZSBleGVjdXRlZCBpbiB0aGlzIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQgd2lsbCBvbmx5IGhhdmUgYWNjZXNzIHRvCisgICAgbW9kdWxlcyBhbmQgZnVuY3Rpb25zIHRoYXQgYXJlIGRlZW1lZCBzYWZlOyB5b3UgY2FuIHN1YmNsYXNzIFJFeGVjIHRvCisgICAgYWRkIG9yIHJlbW92ZSBjYXBhYmlsaXRpZXMgYXMgZGVzaXJlZC4KKworICAgIFRoZSBSRXhlYyBjbGFzcyBjYW4gcHJldmVudCBjb2RlIGZyb20gcGVyZm9ybWluZyB1bnNhZmUgb3BlcmF0aW9ucyBsaWtlCisgICAgcmVhZGluZyBvciB3cml0aW5nIGRpc2sgZmlsZXMsIG9yIHVzaW5nIFRDUC9JUCBzb2NrZXRzLiAgSG93ZXZlciwgaXQgZG9lcworICAgIG5vdCBwcm90ZWN0IGFnYWluc3QgY29kZSB1c2luZyBleHRyZW1lbHkgbGFyZ2UgYW1vdW50cyBvZiBtZW1vcnkgb3IKKyAgICBwcm9jZXNzb3IgdGltZS4KKworICAgICIiIgorCisgICAgb2tfcGF0aCA9IHR1cGxlKHN5cy5wYXRoKSAgICAgICAgICAgIyBUaGF0J3MgYSBwb2xpY3kgZGVjaXNpb24KKworICAgIG9rX2J1aWx0aW5fbW9kdWxlcyA9ICgnYXVkaW9vcCcsICdhcnJheScsICdiaW5hc2NpaScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdjbWF0aCcsICdlcnJubycsICdpbWFnZW9wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ21hcnNoYWwnLCAnbWF0aCcsICdtZDUnLCAnb3BlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyc2VyJywgJ3NlbGVjdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGEnLCAnX3NyZScsICdzdHJvcCcsICdzdHJ1Y3QnLCAndGltZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdfd2Vha3JlZicpCisKKyAgICBva19wb3NpeF9uYW1lcyA9ICgnZXJyb3InLCAnZnN0YXQnLCAnbGlzdGRpcicsICdsc3RhdCcsICdyZWFkbGluaycsCisgICAgICAgICAgICAgICAgICAgICAgJ3N0YXQnLCAndGltZXMnLCAndW5hbWUnLCAnZ2V0cGlkJywgJ2dldHBwaWQnLAorICAgICAgICAgICAgICAgICAgICAgICdnZXRjd2QnLCAnZ2V0dWlkJywgJ2dldGdpZCcsICdnZXRldWlkJywgJ2dldGVnaWQnKQorCisgICAgb2tfc3lzX25hbWVzID0gKCdieXRlb3JkZXInLCAnY29weXJpZ2h0JywgJ2V4aXQnLCAnZ2V0ZGVmYXVsdGVuY29kaW5nJywKKyAgICAgICAgICAgICAgICAgICAgJ2dldHJlZmNvdW50JywgJ2hleHZlcnNpb24nLCAnbWF4aW50JywgJ21heHVuaWNvZGUnLAorICAgICAgICAgICAgICAgICAgICAncGxhdGZvcm0nLCAncHMxJywgJ3BzMicsICd2ZXJzaW9uJywgJ3ZlcnNpb25faW5mbycpCisKKyAgICBub2tfYnVpbHRpbl9uYW1lcyA9ICgnb3BlbicsICdmaWxlJywgJ3JlbG9hZCcsICdfX2ltcG9ydF9fJykKKworICAgIG9rX2ZpbGVfdHlwZXMgPSAoaW1wLkNfRVhURU5TSU9OLCBpbXAuUFlfU09VUkNFKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvb2tzID0gTm9uZSwgdmVyYm9zZSA9IDApOgorICAgICAgICAiIiJSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHRoZSBSRXhlYyBjbGFzcy4KKworICAgICAgICBUaGUgaG9va3MgcGFyYW1ldGVyIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBSSG9va3MgY2xhc3Mgb3IgYSBzdWJjbGFzcworICAgICAgICBvZiBpdC4gIElmIGl0IGlzIG9taXR0ZWQgb3IgTm9uZSwgdGhlIGRlZmF1bHQgUkhvb2tzIGNsYXNzIGlzCisgICAgICAgIGluc3RhbnRpYXRlZC4KKworICAgICAgICBXaGVuZXZlciB0aGUgUkV4ZWMgbW9kdWxlIHNlYXJjaGVzIGZvciBhIG1vZHVsZSAoZXZlbiBhIGJ1aWx0LWluIG9uZSkKKyAgICAgICAgb3IgcmVhZHMgYSBtb2R1bGUncyBjb2RlLCBpdCBkb2Vzbid0IGFjdHVhbGx5IGdvIG91dCB0byB0aGUgZmlsZQorICAgICAgICBzeXN0ZW0gaXRzZWxmLiAgUmF0aGVyLCBpdCBjYWxscyBtZXRob2RzIG9mIGFuIFJIb29rcyBpbnN0YW5jZSB0aGF0CisgICAgICAgIHdhcyBwYXNzZWQgdG8gb3IgY3JlYXRlZCBieSBpdHMgY29uc3RydWN0b3IuICAoQWN0dWFsbHksIHRoZSBSRXhlYworICAgICAgICBvYmplY3QgZG9lc24ndCBtYWtlIHRoZXNlIGNhbGxzIC0tLSB0aGV5IGFyZSBtYWRlIGJ5IGEgbW9kdWxlIGxvYWRlcgorICAgICAgICBvYmplY3QgdGhhdCdzIHBhcnQgb2YgdGhlIFJFeGVjIG9iamVjdC4gIFRoaXMgYWxsb3dzIGFub3RoZXIgbGV2ZWwgb2YKKyAgICAgICAgZmxleGliaWxpdHksIHdoaWNoIGNhbiBiZSB1c2VmdWwgd2hlbiBjaGFuZ2luZyB0aGUgbWVjaGFuaWNzIG9mCisgICAgICAgIGltcG9ydCB3aXRoaW4gdGhlIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuKQorCisgICAgICAgIEJ5IHByb3ZpZGluZyBhbiBhbHRlcm5hdGUgUkhvb2tzIG9iamVjdCwgd2UgY2FuIGNvbnRyb2wgdGhlIGZpbGUKKyAgICAgICAgc3lzdGVtIGFjY2Vzc2VzIG1hZGUgdG8gaW1wb3J0IGEgbW9kdWxlLCB3aXRob3V0IGNoYW5naW5nIHRoZQorICAgICAgICBhY3R1YWwgYWxnb3JpdGhtIHRoYXQgY29udHJvbHMgdGhlIG9yZGVyIGluIHdoaWNoIHRob3NlIGFjY2Vzc2VzIGFyZQorICAgICAgICBtYWRlLiAgRm9yIGluc3RhbmNlLCB3ZSBjb3VsZCBzdWJzdGl0dXRlIGFuIFJIb29rcyBvYmplY3QgdGhhdAorICAgICAgICBwYXNzZXMgYWxsIGZpbGVzeXN0ZW0gcmVxdWVzdHMgdG8gYSBmaWxlIHNlcnZlciBlbHNld2hlcmUsIHZpYSBzb21lCisgICAgICAgIFJQQyBtZWNoYW5pc20gc3VjaCBhcyBJTFUuICBHcmFpbCdzIGFwcGxldCBsb2FkZXIgdXNlcyB0aGlzIHRvIHN1cHBvcnQKKyAgICAgICAgaW1wb3J0aW5nIGFwcGxldHMgZnJvbSBhIFVSTCBmb3IgYSBkaXJlY3RvcnkuCisKKyAgICAgICAgSWYgdGhlIHZlcmJvc2UgcGFyYW1ldGVyIGlzIHRydWUsIGFkZGl0aW9uYWwgZGVidWdnaW5nIG91dHB1dCBtYXkgYmUKKyAgICAgICAgc2VudCB0byBzdGFuZGFyZCBvdXRwdXQuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiVGhpcyBjb2RlIGlzIG5vdCBzZWN1cmUgaW4gUHl0aG9uIDIuMiBhbmQgbGF0ZXIiCisKKyAgICAgICAgaWhvb2tzLl9WZXJib3NlLl9faW5pdF9fKHNlbGYsIHZlcmJvc2UpCisgICAgICAgICMgWFhYIFRoZXJlJ3MgYSBjaXJjdWxhciByZWZlcmVuY2UgaGVyZToKKyAgICAgICAgc2VsZi5ob29rcyA9IGhvb2tzIG9yIFJIb29rcyh2ZXJib3NlKQorICAgICAgICBzZWxmLmhvb2tzLnNldF9yZXhlYyhzZWxmKQorICAgICAgICBzZWxmLm1vZHVsZXMgPSB7fQorICAgICAgICBzZWxmLm9rX2R5bmFtaWNfbW9kdWxlcyA9IHNlbGYub2tfYnVpbHRpbl9tb2R1bGVzCisgICAgICAgIGxpc3QgPSBbXQorICAgICAgICBmb3IgbW5hbWUgaW4gc2VsZi5va19idWlsdGluX21vZHVsZXM6CisgICAgICAgICAgICBpZiBtbmFtZSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQobW5hbWUpCisgICAgICAgIHNlbGYub2tfYnVpbHRpbl9tb2R1bGVzID0gdHVwbGUobGlzdCkKKyAgICAgICAgc2VsZi5zZXRfdHJ1c3RlZF9wYXRoKCkKKyAgICAgICAgc2VsZi5tYWtlX2J1aWx0aW4oKQorICAgICAgICBzZWxmLm1ha2VfaW5pdGlhbF9tb2R1bGVzKCkKKyAgICAgICAgIyBtYWtlX3N5cyBtdXN0IGJlIGxhc3QgYmVjYXVzZSBpdCBhZGRzIHRoZSBhbHJlYWR5IGNyZWF0ZWQKKyAgICAgICAgIyBtb2R1bGVzIHRvIGl0cyBidWlsdGluX21vZHVsZV9uYW1lcworICAgICAgICBzZWxmLm1ha2Vfc3lzKCkKKyAgICAgICAgc2VsZi5sb2FkZXIgPSBSTW9kdWxlTG9hZGVyKHNlbGYuaG9va3MsIHZlcmJvc2UpCisgICAgICAgIHNlbGYuaW1wb3J0ZXIgPSBSTW9kdWxlSW1wb3J0ZXIoc2VsZi5sb2FkZXIsIHZlcmJvc2UpCisKKyAgICBkZWYgc2V0X3RydXN0ZWRfcGF0aChzZWxmKToKKyAgICAgICAgIyBTZXQgdGhlIHBhdGggZnJvbSB3aGljaCBkeW5hbWljIG1vZHVsZXMgbWF5IGJlIGxvYWRlZC4KKyAgICAgICAgIyBUaG9zZSBkeW5hbWljIG1vZHVsZXMgbXVzdCBhbHNvIG9jY3VyIGluIG9rX2J1aWx0aW5fbW9kdWxlcworICAgICAgICBzZWxmLnRydXN0ZWRfcGF0aCA9IGZpbHRlcihvcy5wYXRoLmlzYWJzLCBzeXMucGF0aCkKKworICAgIGRlZiBsb2FkX2R5bmFtaWMoc2VsZiwgbmFtZSwgZmlsZW5hbWUsIGZpbGUpOgorICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLm9rX2R5bmFtaWNfbW9kdWxlczoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAidW50cnVzdGVkIGR5bmFtaWMgbW9kdWxlOiAlcyIgJSBuYW1lCisgICAgICAgIGlmIG5hbWUgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICBzcmMgPSBzeXMubW9kdWxlc1tuYW1lXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3JjID0gaW1wLmxvYWRfZHluYW1pYyhuYW1lLCBmaWxlbmFtZSwgZmlsZSkKKyAgICAgICAgZHN0ID0gc2VsZi5jb3B5X2V4Y2VwdChzcmMsIFtdKQorICAgICAgICByZXR1cm4gZHN0CisKKyAgICBkZWYgbWFrZV9pbml0aWFsX21vZHVsZXMoc2VsZik6CisgICAgICAgIHNlbGYubWFrZV9tYWluKCkKKyAgICAgICAgc2VsZi5tYWtlX29zbmFtZSgpCisKKyAgICAjIEhlbHBlcnMgZm9yIFJIb29rcworCisgICAgZGVmIGdldF9zdWZmaXhlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtpdGVtICAgIyAoc3VmZiwgbW9kZSwgdHlwZSkKKyAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBpbXAuZ2V0X3N1ZmZpeGVzKCkKKyAgICAgICAgICAgICAgICBpZiBpdGVtWzJdIGluIHNlbGYub2tfZmlsZV90eXBlc10KKworICAgIGRlZiBpc19idWlsdGluKHNlbGYsIG1uYW1lKToKKyAgICAgICAgcmV0dXJuIG1uYW1lIGluIHNlbGYub2tfYnVpbHRpbl9tb2R1bGVzCisKKyAgICAjIFRoZSBtYWtlXyogbWV0aG9kcyBjcmVhdGUgc3BlY2lmaWMgYnVpbHQtaW4gbW9kdWxlcworCisgICAgZGVmIG1ha2VfYnVpbHRpbihzZWxmKToKKyAgICAgICAgbSA9IHNlbGYuY29weV9leGNlcHQoX19idWlsdGluX18sIHNlbGYubm9rX2J1aWx0aW5fbmFtZXMpCisgICAgICAgIG0uX19pbXBvcnRfXyA9IHNlbGYucl9pbXBvcnQKKyAgICAgICAgbS5yZWxvYWQgPSBzZWxmLnJfcmVsb2FkCisgICAgICAgIG0ub3BlbiA9IG0uZmlsZSA9IHNlbGYucl9vcGVuCisKKyAgICBkZWYgbWFrZV9tYWluKHNlbGYpOgorICAgICAgICBzZWxmLmFkZF9tb2R1bGUoJ19fbWFpbl9fJykKKworICAgIGRlZiBtYWtlX29zbmFtZShzZWxmKToKKyAgICAgICAgb3NuYW1lID0gb3MubmFtZQorICAgICAgICBzcmMgPSBfX2ltcG9ydF9fKG9zbmFtZSkKKyAgICAgICAgZHN0ID0gc2VsZi5jb3B5X29ubHkoc3JjLCBzZWxmLm9rX3Bvc2l4X25hbWVzKQorICAgICAgICBkc3QuZW52aXJvbiA9IGUgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvcy5lbnZpcm9uLml0ZW1zKCk6CisgICAgICAgICAgICBlW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIG1ha2Vfc3lzKHNlbGYpOgorICAgICAgICBtID0gc2VsZi5jb3B5X29ubHkoc3lzLCBzZWxmLm9rX3N5c19uYW1lcykKKyAgICAgICAgbS5tb2R1bGVzID0gc2VsZi5tb2R1bGVzCisgICAgICAgIG0uYXJndiA9IFsnUkVTVFJJQ1RFRCddCisgICAgICAgIG0ucGF0aCA9IG1hcChOb25lLCBzZWxmLm9rX3BhdGgpCisgICAgICAgIG0uZXhjX2luZm8gPSBzZWxmLnJfZXhjX2luZm8KKyAgICAgICAgbSA9IHNlbGYubW9kdWxlc1snc3lzJ10KKyAgICAgICAgbCA9IHNlbGYubW9kdWxlcy5rZXlzKCkgKyBsaXN0KHNlbGYub2tfYnVpbHRpbl9tb2R1bGVzKQorICAgICAgICBsLnNvcnQoKQorICAgICAgICBtLmJ1aWx0aW5fbW9kdWxlX25hbWVzID0gdHVwbGUobCkKKworICAgICMgVGhlIGNvcHlfKiBtZXRob2RzIGNvcHkgZXhpc3RpbmcgbW9kdWxlcyB3aXRoIHNvbWUgY2hhbmdlcworCisgICAgZGVmIGNvcHlfZXhjZXB0KHNlbGYsIHNyYywgZXhjZXB0aW9ucyk6CisgICAgICAgIGRzdCA9IHNlbGYuY29weV9ub25lKHNyYykKKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKHNyYyk6CisgICAgICAgICAgICBzZXRhdHRyKGRzdCwgbmFtZSwgZ2V0YXR0cihzcmMsIG5hbWUpKQorICAgICAgICBmb3IgbmFtZSBpbiBleGNlcHRpb25zOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbGF0dHIoZHN0LCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuIGRzdAorCisgICAgZGVmIGNvcHlfb25seShzZWxmLCBzcmMsIG5hbWVzKToKKyAgICAgICAgZHN0ID0gc2VsZi5jb3B5X25vbmUoc3JjKQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoc3JjLCBuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZXRhdHRyKGRzdCwgbmFtZSwgdmFsdWUpCisgICAgICAgIHJldHVybiBkc3QKKworICAgIGRlZiBjb3B5X25vbmUoc2VsZiwgc3JjKToKKyAgICAgICAgbSA9IHNlbGYuYWRkX21vZHVsZShzcmMuX19uYW1lX18pCisgICAgICAgIG0uX19kb2NfXyA9IHNyYy5fX2RvY19fCisgICAgICAgIHJldHVybiBtCisKKyAgICAjIEFkZCBhIG1vZHVsZSAtLSByZXR1cm4gYW4gZXhpc3RpbmcgbW9kdWxlIG9yIGNyZWF0ZSBvbmUKKworICAgIGRlZiBhZGRfbW9kdWxlKHNlbGYsIG1uYW1lKToKKyAgICAgICAgbSA9IHNlbGYubW9kdWxlcy5nZXQobW5hbWUpCisgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlc1ttbmFtZV0gPSBtID0gc2VsZi5ob29rcy5uZXdfbW9kdWxlKG1uYW1lKQorICAgICAgICBtLl9fYnVpbHRpbnNfXyA9IHNlbGYubW9kdWxlc1snX19idWlsdGluX18nXQorICAgICAgICByZXR1cm4gbQorCisgICAgIyBUaGUgciogbWV0aG9kcyBhcmUgcHVibGljIGludGVyZmFjZXMKKworICAgIGRlZiByX2V4ZWMoc2VsZiwgY29kZSk6CisgICAgICAgICIiIkV4ZWN1dGUgY29kZSB3aXRoaW4gYSByZXN0cmljdGVkIGVudmlyb25tZW50LgorCisgICAgICAgIFRoZSBjb2RlIHBhcmFtZXRlciBtdXN0IGVpdGhlciBiZSBhIHN0cmluZyBjb250YWluaW5nIG9uZSBvciBtb3JlCisgICAgICAgIGxpbmVzIG9mIFB5dGhvbiBjb2RlLCBvciBhIGNvbXBpbGVkIGNvZGUgb2JqZWN0LCB3aGljaCB3aWxsIGJlCisgICAgICAgIGV4ZWN1dGVkIGluIHRoZSByZXN0cmljdGVkIGVudmlyb25tZW50J3MgX19tYWluX18gbW9kdWxlLgorCisgICAgICAgICIiIgorICAgICAgICBtID0gc2VsZi5hZGRfbW9kdWxlKCdfX21haW5fXycpCisgICAgICAgIGV4ZWMgY29kZSBpbiBtLl9fZGljdF9fCisKKyAgICBkZWYgcl9ldmFsKHNlbGYsIGNvZGUpOgorICAgICAgICAiIiJFdmFsdWF0ZSBjb2RlIHdpdGhpbiBhIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgVGhlIGNvZGUgcGFyYW1ldGVyIG11c3QgZWl0aGVyIGJlIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBQeXRob24KKyAgICAgICAgZXhwcmVzc2lvbiwgb3IgYSBjb21waWxlZCBjb2RlIG9iamVjdCwgd2hpY2ggd2lsbCBiZSBldmFsdWF0ZWQgaW4KKyAgICAgICAgdGhlIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQncyBfX21haW5fXyBtb2R1bGUuICBUaGUgdmFsdWUgb2YgdGhlCisgICAgICAgIGV4cHJlc3Npb24gb3IgY29kZSBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KKworICAgICAgICAiIiIKKyAgICAgICAgbSA9IHNlbGYuYWRkX21vZHVsZSgnX19tYWluX18nKQorICAgICAgICByZXR1cm4gZXZhbChjb2RlLCBtLl9fZGljdF9fKQorCisgICAgZGVmIHJfZXhlY2ZpbGUoc2VsZiwgZmlsZSk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIFB5dGhvbiBjb2RlIGluIHRoZSBmaWxlIGluIHRoZSByZXN0cmljdGVkCisgICAgICAgIGVudmlyb25tZW50J3MgX19tYWluX18gbW9kdWxlLgorCisgICAgICAgICIiIgorICAgICAgICBtID0gc2VsZi5hZGRfbW9kdWxlKCdfX21haW5fXycpCisgICAgICAgIGV4ZWNmaWxlKGZpbGUsIG0uX19kaWN0X18pCisKKyAgICBkZWYgcl9pbXBvcnQoc2VsZiwgbW5hbWUsIGdsb2JhbHM9e30sIGxvY2Fscz17fSwgZnJvbWxpc3Q9W10pOgorICAgICAgICAiIiJJbXBvcnQgYSBtb2R1bGUsIHJhaXNpbmcgYW4gSW1wb3J0RXJyb3IgZXhjZXB0aW9uIGlmIHRoZSBtb2R1bGUKKyAgICAgICAgaXMgY29uc2lkZXJlZCB1bnNhZmUuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjYWxsZWQgYnkgY29kZSBleGVjdXRpbmcgaW4gdGhlCisgICAgICAgIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuICBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgaXMKKyAgICAgICAgdXNlZCB0byBjaGFuZ2UgdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaW1wb3J0ZXIuaW1wb3J0X21vZHVsZShtbmFtZSwgZ2xvYmFscywgbG9jYWxzLCBmcm9tbGlzdCkKKworICAgIGRlZiByX3JlbG9hZChzZWxmLCBtKToKKyAgICAgICAgIiIiUmVsb2FkIHRoZSBtb2R1bGUgb2JqZWN0LCByZS1wYXJzaW5nIGFuZCByZS1pbml0aWFsaXppbmcgaXQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjYWxsZWQgYnkgY29kZSBleGVjdXRpbmcgaW4gdGhlCisgICAgICAgIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuICBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgaXMKKyAgICAgICAgdXNlZCB0byBjaGFuZ2UgdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaW1wb3J0ZXIucmVsb2FkKG0pCisKKyAgICBkZWYgcl91bmxvYWQoc2VsZiwgbSk6CisgICAgICAgICIiIlVubG9hZCB0aGUgbW9kdWxlLgorCisgICAgICAgIFJlbW92ZXMgaXQgZnJvbSB0aGUgcmVzdHJpY3RlZCBlbnZpcm9ubWVudCdzIHN5cy5tb2R1bGVzIGRpY3Rpb25hcnkuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjYWxsZWQgYnkgY29kZSBleGVjdXRpbmcgaW4gdGhlCisgICAgICAgIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuICBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgaXMKKyAgICAgICAgdXNlZCB0byBjaGFuZ2UgdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuaW1wb3J0ZXIudW5sb2FkKG0pCisKKyAgICAjIFRoZSBzXyogbWV0aG9kcyBhcmUgc2ltaWxhciBidXQgYWxzbyBzd2FwIHN0ZHtpbixvdXQsZXJyfQorCisgICAgZGVmIG1ha2VfZGVsZWdhdGVfZmlsZXMoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLm1vZHVsZXNbJ3N5cyddCisgICAgICAgIHNlbGYuZGVsZWdhdGVfc3RkaW4gPSBGaWxlRGVsZWdhdGUocywgJ3N0ZGluJykKKyAgICAgICAgc2VsZi5kZWxlZ2F0ZV9zdGRvdXQgPSBGaWxlRGVsZWdhdGUocywgJ3N0ZG91dCcpCisgICAgICAgIHNlbGYuZGVsZWdhdGVfc3RkZXJyID0gRmlsZURlbGVnYXRlKHMsICdzdGRlcnInKQorICAgICAgICBzZWxmLnJlc3RyaWN0ZWRfc3RkaW4gPSBGaWxlV3JhcHBlcihzeXMuc3RkaW4pCisgICAgICAgIHNlbGYucmVzdHJpY3RlZF9zdGRvdXQgPSBGaWxlV3JhcHBlcihzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLnJlc3RyaWN0ZWRfc3RkZXJyID0gRmlsZVdyYXBwZXIoc3lzLnN0ZGVycikKKworICAgIGRlZiBzZXRfZmlsZXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsICdzYXZlX3N0ZGluJyk6CisgICAgICAgICAgICBzZWxmLnNhdmVfZmlsZXMoKQorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnZGVsZWdhdGVfc3RkaW4nKToKKyAgICAgICAgICAgIHNlbGYubWFrZV9kZWxlZ2F0ZV9maWxlcygpCisgICAgICAgIHMgPSBzZWxmLm1vZHVsZXNbJ3N5cyddCisgICAgICAgIHMuc3RkaW4gPSBzZWxmLnJlc3RyaWN0ZWRfc3RkaW4KKyAgICAgICAgcy5zdGRvdXQgPSBzZWxmLnJlc3RyaWN0ZWRfc3Rkb3V0CisgICAgICAgIHMuc3RkZXJyID0gc2VsZi5yZXN0cmljdGVkX3N0ZGVycgorICAgICAgICBzeXMuc3RkaW4gPSBzZWxmLmRlbGVnYXRlX3N0ZGluCisgICAgICAgIHN5cy5zdGRvdXQgPSBzZWxmLmRlbGVnYXRlX3N0ZG91dAorICAgICAgICBzeXMuc3RkZXJyID0gc2VsZi5kZWxlZ2F0ZV9zdGRlcnIKKworICAgIGRlZiByZXNldF9maWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5yZXN0b3JlX2ZpbGVzKCkKKyAgICAgICAgcyA9IHNlbGYubW9kdWxlc1snc3lzJ10KKyAgICAgICAgc2VsZi5yZXN0cmljdGVkX3N0ZGluID0gcy5zdGRpbgorICAgICAgICBzZWxmLnJlc3RyaWN0ZWRfc3Rkb3V0ID0gcy5zdGRvdXQKKyAgICAgICAgc2VsZi5yZXN0cmljdGVkX3N0ZGVyciA9IHMuc3RkZXJyCisKKworICAgIGRlZiBzYXZlX2ZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLnNhdmVfc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgc2VsZi5zYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgc2VsZi5zYXZlX3N0ZGVyciA9IHN5cy5zdGRlcnIKKworICAgIGRlZiByZXN0b3JlX2ZpbGVzKHNlbGYpOgorICAgICAgICBzeXMuc3RkaW4gPSBzZWxmLnNhdmVfc3RkaW4KKyAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuc2F2ZV9zdGRvdXQKKyAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuc2F2ZV9zdGRlcnIKKworICAgIGRlZiBzX2FwcGx5KHNlbGYsIGZ1bmMsIGFyZ3M9KCksIGt3PXt9KToKKyAgICAgICAgc2VsZi5zYXZlX2ZpbGVzKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXRfZmlsZXMoKQorICAgICAgICAgICAgciA9IGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnJlc3RvcmVfZmlsZXMoKQorICAgICAgICByZXR1cm4gcgorCisgICAgZGVmIHNfZXhlYyhzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkV4ZWN1dGUgY29kZSB3aXRoaW4gYSByZXN0cmljdGVkIGVudmlyb25tZW50LgorCisgICAgICAgIFNpbWlsYXIgdG8gdGhlIHJfZXhlYygpIG1ldGhvZCwgYnV0IHRoZSBjb2RlIHdpbGwgYmUgZ3JhbnRlZCBhY2Nlc3MKKyAgICAgICAgdG8gcmVzdHJpY3RlZCB2ZXJzaW9ucyBvZiB0aGUgc3RhbmRhcmQgSS9PIHN0cmVhbXMgc3lzLnN0ZGluLAorICAgICAgICBzeXMuc3RkZXJyLCBhbmQgc3lzLnN0ZG91dC4KKworICAgICAgICBUaGUgY29kZSBwYXJhbWV0ZXIgbXVzdCBlaXRoZXIgYmUgYSBzdHJpbmcgY29udGFpbmluZyBvbmUgb3IgbW9yZQorICAgICAgICBsaW5lcyBvZiBQeXRob24gY29kZSwgb3IgYSBjb21waWxlZCBjb2RlIG9iamVjdCwgd2hpY2ggd2lsbCBiZQorICAgICAgICBleGVjdXRlZCBpbiB0aGUgcmVzdHJpY3RlZCBlbnZpcm9ubWVudCdzIF9fbWFpbl9fIG1vZHVsZS4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc19hcHBseShzZWxmLnJfZXhlYywgYXJncykKKworICAgIGRlZiBzX2V2YWwoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJFdmFsdWF0ZSBjb2RlIHdpdGhpbiBhIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgU2ltaWxhciB0byB0aGUgcl9ldmFsKCkgbWV0aG9kLCBidXQgdGhlIGNvZGUgd2lsbCBiZSBncmFudGVkIGFjY2VzcworICAgICAgICB0byByZXN0cmljdGVkIHZlcnNpb25zIG9mIHRoZSBzdGFuZGFyZCBJL08gc3RyZWFtcyBzeXMuc3RkaW4sCisgICAgICAgIHN5cy5zdGRlcnIsIGFuZCBzeXMuc3Rkb3V0LgorCisgICAgICAgIFRoZSBjb2RlIHBhcmFtZXRlciBtdXN0IGVpdGhlciBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgUHl0aG9uCisgICAgICAgIGV4cHJlc3Npb24sIG9yIGEgY29tcGlsZWQgY29kZSBvYmplY3QsIHdoaWNoIHdpbGwgYmUgZXZhbHVhdGVkIGluCisgICAgICAgIHRoZSByZXN0cmljdGVkIGVudmlyb25tZW50J3MgX19tYWluX18gbW9kdWxlLiAgVGhlIHZhbHVlIG9mIHRoZQorICAgICAgICBleHByZXNzaW9uIG9yIGNvZGUgb2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNfYXBwbHkoc2VsZi5yX2V2YWwsIGFyZ3MpCisKKyAgICBkZWYgc19leGVjZmlsZShzZWxmLCAqYXJncyk6CisgICAgICAgICIiIkV4ZWN1dGUgdGhlIFB5dGhvbiBjb2RlIGluIHRoZSBmaWxlIGluIHRoZSByZXN0cmljdGVkCisgICAgICAgIGVudmlyb25tZW50J3MgX19tYWluX18gbW9kdWxlLgorCisgICAgICAgIFNpbWlsYXIgdG8gdGhlIHJfZXhlY2ZpbGUoKSBtZXRob2QsIGJ1dCB0aGUgY29kZSB3aWxsIGJlIGdyYW50ZWQKKyAgICAgICAgYWNjZXNzIHRvIHJlc3RyaWN0ZWQgdmVyc2lvbnMgb2YgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW1zIHN5cy5zdGRpbiwKKyAgICAgICAgc3lzLnN0ZGVyciwgYW5kIHN5cy5zdGRvdXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNfYXBwbHkoc2VsZi5yX2V4ZWNmaWxlLCBhcmdzKQorCisgICAgZGVmIHNfaW1wb3J0KHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiSW1wb3J0IGEgbW9kdWxlLCByYWlzaW5nIGFuIEltcG9ydEVycm9yIGV4Y2VwdGlvbiBpZiB0aGUgbW9kdWxlCisgICAgICAgIGlzIGNvbnNpZGVyZWQgdW5zYWZlLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGltcGxpY2l0bHkgY2FsbGVkIGJ5IGNvZGUgZXhlY3V0aW5nIGluIHRoZQorICAgICAgICByZXN0cmljdGVkIGVudmlyb25tZW50LiAgT3ZlcnJpZGluZyB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzIGlzCisgICAgICAgIHVzZWQgdG8gY2hhbmdlIHRoZSBwb2xpY2llcyBlbmZvcmNlZCBieSBhIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgU2ltaWxhciB0byB0aGUgcl9pbXBvcnQoKSBtZXRob2QsIGJ1dCBoYXMgYWNjZXNzIHRvIHJlc3RyaWN0ZWQKKyAgICAgICAgdmVyc2lvbnMgb2YgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW1zIHN5cy5zdGRpbiwgc3lzLnN0ZGVyciwgYW5kCisgICAgICAgIHN5cy5zdGRvdXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNfYXBwbHkoc2VsZi5yX2ltcG9ydCwgYXJncykKKworICAgIGRlZiBzX3JlbG9hZChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlJlbG9hZCB0aGUgbW9kdWxlIG9iamVjdCwgcmUtcGFyc2luZyBhbmQgcmUtaW5pdGlhbGl6aW5nIGl0LgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGltcGxpY2l0bHkgY2FsbGVkIGJ5IGNvZGUgZXhlY3V0aW5nIGluIHRoZQorICAgICAgICByZXN0cmljdGVkIGVudmlyb25tZW50LiAgT3ZlcnJpZGluZyB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzIGlzCisgICAgICAgIHVzZWQgdG8gY2hhbmdlIHRoZSBwb2xpY2llcyBlbmZvcmNlZCBieSBhIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgU2ltaWxhciB0byB0aGUgcl9yZWxvYWQoKSBtZXRob2QsIGJ1dCBoYXMgYWNjZXNzIHRvIHJlc3RyaWN0ZWQKKyAgICAgICAgdmVyc2lvbnMgb2YgdGhlIHN0YW5kYXJkIEkvTyBzdHJlYW1zIHN5cy5zdGRpbiwgc3lzLnN0ZGVyciwgYW5kCisgICAgICAgIHN5cy5zdGRvdXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnNfYXBwbHkoc2VsZi5yX3JlbG9hZCwgYXJncykKKworICAgIGRlZiBzX3VubG9hZChzZWxmLCAqYXJncyk6CisgICAgICAgICIiIlVubG9hZCB0aGUgbW9kdWxlLgorCisgICAgICAgIFJlbW92ZXMgaXQgZnJvbSB0aGUgcmVzdHJpY3RlZCBlbnZpcm9ubWVudCdzIHN5cy5tb2R1bGVzIGRpY3Rpb25hcnkuCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgaW1wbGljaXRseSBjYWxsZWQgYnkgY29kZSBleGVjdXRpbmcgaW4gdGhlCisgICAgICAgIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuICBPdmVycmlkaW5nIHRoaXMgbWV0aG9kIGluIGEgc3ViY2xhc3MgaXMKKyAgICAgICAgdXNlZCB0byBjaGFuZ2UgdGhlIHBvbGljaWVzIGVuZm9yY2VkIGJ5IGEgcmVzdHJpY3RlZCBlbnZpcm9ubWVudC4KKworICAgICAgICBTaW1pbGFyIHRvIHRoZSByX3VubG9hZCgpIG1ldGhvZCwgYnV0IGhhcyBhY2Nlc3MgdG8gcmVzdHJpY3RlZAorICAgICAgICB2ZXJzaW9ucyBvZiB0aGUgc3RhbmRhcmQgSS9PIHN0cmVhbXMgc3lzLnN0ZGluLCBzeXMuc3RkZXJyLCBhbmQKKyAgICAgICAgc3lzLnN0ZG91dC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc19hcHBseShzZWxmLnJfdW5sb2FkLCBhcmdzKQorCisgICAgIyBSZXN0cmljdGVkIG9wZW4oLi4uKQorCisgICAgZGVmIHJfb3BlbihzZWxmLCBmaWxlLCBtb2RlPSdyJywgYnVmPS0xKToKKyAgICAgICAgIiIiTWV0aG9kIGNhbGxlZCB3aGVuIG9wZW4oKSBpcyBjYWxsZWQgaW4gdGhlIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgVGhlIGFyZ3VtZW50cyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIG9mIHRoZSBvcGVuKCkgZnVuY3Rpb24sIGFuZCBhCisgICAgICAgIGZpbGUgb2JqZWN0IChvciBhIGNsYXNzIGluc3RhbmNlIGNvbXBhdGlibGUgd2l0aCBmaWxlIG9iamVjdHMpCisgICAgICAgIHNob3VsZCBiZSByZXR1cm5lZC4gIFJFeGVjJ3MgZGVmYXVsdCBiZWhhdmlvdXIgaXMgYWxsb3cgb3BlbmluZworICAgICAgICBhbnkgZmlsZSBmb3IgcmVhZGluZywgYnV0IGZvcmJpZGRpbmcgYW55IGF0dGVtcHQgdG8gd3JpdGUgYSBmaWxlLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGlzIGltcGxpY2l0bHkgY2FsbGVkIGJ5IGNvZGUgZXhlY3V0aW5nIGluIHRoZQorICAgICAgICByZXN0cmljdGVkIGVudmlyb25tZW50LiAgT3ZlcnJpZGluZyB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzIGlzCisgICAgICAgIHVzZWQgdG8gY2hhbmdlIHRoZSBwb2xpY2llcyBlbmZvcmNlZCBieSBhIHJlc3RyaWN0ZWQgZW52aXJvbm1lbnQuCisKKyAgICAgICAgIiIiCisgICAgICAgIG1vZGUgPSBzdHIobW9kZSkKKyAgICAgICAgaWYgbW9kZSBub3QgaW4gKCdyJywgJ3JiJyk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiY2FuJ3Qgb3BlbiBmaWxlcyBmb3Igd3JpdGluZyBpbiByZXN0cmljdGVkIG1vZGUiCisgICAgICAgIHJldHVybiBvcGVuKGZpbGUsIG1vZGUsIGJ1ZikKKworICAgICMgUmVzdHJpY3RlZCB2ZXJzaW9uIG9mIHN5cy5leGNfaW5mbygpCisKKyAgICBkZWYgcl9leGNfaW5mbyhzZWxmKToKKyAgICAgICAgdHksIHZhLCB0ciA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIHRyID0gTm9uZQorICAgICAgICByZXR1cm4gdHksIHZhLCB0cgorCisKK2RlZiB0ZXN0KCk6CisgICAgaW1wb3J0IGdldG9wdCwgdHJhY2ViYWNrCisgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAndnQ6JykKKyAgICB2ZXJib3NlID0gMAorICAgIHRydXN0ZWQgPSBbXQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy12JzoKKyAgICAgICAgICAgIHZlcmJvc2UgPSB2ZXJib3NlKzEKKyAgICAgICAgaWYgbyA9PSAnLXQnOgorICAgICAgICAgICAgdHJ1c3RlZC5hcHBlbmQoYSkKKyAgICByID0gUkV4ZWModmVyYm9zZT12ZXJib3NlKQorICAgIGlmIHRydXN0ZWQ6CisgICAgICAgIHIub2tfYnVpbHRpbl9tb2R1bGVzID0gci5va19idWlsdGluX21vZHVsZXMgKyB0dXBsZSh0cnVzdGVkKQorICAgIGlmIGFyZ3M6CisgICAgICAgIHIubW9kdWxlc1snc3lzJ10uYXJndiA9IGFyZ3MKKyAgICAgICAgci5tb2R1bGVzWydzeXMnXS5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmRpcm5hbWUoYXJnc1swXSkpCisgICAgZWxzZToKKyAgICAgICAgci5tb2R1bGVzWydzeXMnXS5wYXRoLmluc2VydCgwLCAiIikKKyAgICBmcCA9IHN5cy5zdGRpbgorICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF0gIT0gJy0nOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IG9wZW4oYXJnc1swXSkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50ICIlczogY2FuJ3Qgb3BlbiBmaWxlICVyIiAlIChzeXMuYXJndlswXSwgYXJnc1swXSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgaWYgZnAuaXNhdHR5KCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCByZWFkbGluZQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGltcG9ydCBjb2RlCisgICAgICAgIGNsYXNzIFJlc3RyaWN0ZWRDb25zb2xlKGNvZGUuSW50ZXJhY3RpdmVDb25zb2xlKToKKyAgICAgICAgICAgIGRlZiBydW5jb2RlKHNlbGYsIGNvKToKKyAgICAgICAgICAgICAgICBzZWxmLmxvY2Fsc1snX19idWlsdGluc19fJ10gPSByLm1vZHVsZXNbJ19fYnVpbHRpbl9fJ10KKyAgICAgICAgICAgICAgICByLnNfYXBwbHkoY29kZS5JbnRlcmFjdGl2ZUNvbnNvbGUucnVuY29kZSwgKHNlbGYsIGNvKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgUmVzdHJpY3RlZENvbnNvbGUoci5tb2R1bGVzWydfX21haW5fXyddLl9fZGljdF9fKS5pbnRlcmFjdCgpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBuOgorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICBlbHNlOgorICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgYyA9IGNvbXBpbGUodGV4dCwgZnAubmFtZSwgJ2V4ZWMnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByLnNfZXhlYyhjKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgbjoKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgcmV0dXJuIDEKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHN5cy5leGl0KHRlc3QoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmV4ZWMucHljIGIvbGliL3B5dGhvbjIuNy9yZXhlYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0NGQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmV4ZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmV4ZWMucHlvIGIvbGliL3B5dGhvbjIuNy9yZXhlYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0NGQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmV4ZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmZjODIyLnB5IGIvbGliL3B5dGhvbjIuNy9yZmM4MjIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1ZDhkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmZjODIyLnB5CkBAIC0wLDAgKzEsMTAxMSBAQAorIiIiUkZDIDI4MjIgbWVzc2FnZSBtYW5pcHVsYXRpb24uCisKK05vdGU6IFRoaXMgaXMgb25seSBhIHZlcnkgcm91Z2ggc2tldGNoIG9mIGEgZnVsbCBSRkMtODIyIHBhcnNlcjsgaW4gcGFydGljdWxhcgordGhlIHRva2VuaXppbmcgb2YgYWRkcmVzc2VzIGRvZXMgbm90IGFkaGVyZSB0byBhbGwgdGhlIHF1b3RpbmcgcnVsZXMuCisKK05vdGU6IFJGQyAyODIyIGlzIGEgbG9uZyBhd2FpdGVkIHVwZGF0ZSB0byBSRkMgODIyLiAgVGhpcyBtb2R1bGUgc2hvdWxkCitjb25mb3JtIHRvIFJGQyAyODIyLCBhbmQgaXMgdGh1cyBtaXMtbmFtZWQgKGl0J3Mgbm90IHdvcnRoIHJlbmFtaW5nIGl0KS4gIFNvbWUKK2VmZm9ydCBhdCBSRkMgMjgyMiB1cGRhdGVzIGhhdmUgYmVlbiBtYWRlLCBidXQgYSB0aG9yb3VnaCBhdWRpdCBoYXMgbm90IGJlZW4KK3BlcmZvcm1lZC4gIENvbnNpZGVyIGFueSBSRkMgMjgyMiBub24tY29uZm9ybWFuY2UgdG8gYmUgYSBidWcuCisKKyAgICBSRkMgMjgyMjogaHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzI4MjIuaHRtbAorICAgIFJGQyA4MjIgOiBodHRwOi8vd3d3LmZhcXMub3JnL3JmY3MvcmZjODIyLmh0bWwgKG9ic29sZXRlKQorCitEaXJlY3Rpb25zIGZvciB1c2U6CisKK1RvIGNyZWF0ZSBhIE1lc3NhZ2Ugb2JqZWN0OiBmaXJzdCBvcGVuIGEgZmlsZSwgZS5nLjoKKworICBmcCA9IG9wZW4oZmlsZSwgJ3InKQorCitZb3UgY2FuIHVzZSBhbnkgb3RoZXIgbGVnYWwgd2F5IG9mIGdldHRpbmcgYW4gb3BlbiBmaWxlIG9iamVjdCwgZS5nLiB1c2UKK3N5cy5zdGRpbiBvciBjYWxsIG9zLnBvcGVuKCkuICBUaGVuIHBhc3MgdGhlIG9wZW4gZmlsZSBvYmplY3QgdG8gdGhlIE1lc3NhZ2UoKQorY29uc3RydWN0b3I6CisKKyAgbSA9IE1lc3NhZ2UoZnApCisKK1RoaXMgY2xhc3MgY2FuIHdvcmsgd2l0aCBhbnkgaW5wdXQgb2JqZWN0IHRoYXQgc3VwcG9ydHMgYSByZWFkbGluZSBtZXRob2QuICBJZgordGhlIGlucHV0IG9iamVjdCBoYXMgc2VlayBhbmQgdGVsbCBjYXBhYmlsaXR5LCB0aGUgcmV3aW5kYm9keSBtZXRob2Qgd2lsbAord29yazsgYWxzbyBpbGxlZ2FsIGxpbmVzIHdpbGwgYmUgcHVzaGVkIGJhY2sgb250byB0aGUgaW5wdXQgc3RyZWFtLiAgSWYgdGhlCitpbnB1dCBvYmplY3QgbGFja3Mgc2VlayBidXQgaGFzIGFuIGB1bnJlYWQnIG1ldGhvZCB0aGF0IGNhbiBwdXNoIGJhY2sgYSBsaW5lCitvZiBpbnB1dCwgTWVzc2FnZSB3aWxsIHVzZSB0aGF0IHRvIHB1c2ggYmFjayBpbGxlZ2FsIGxpbmVzLiAgVGh1cyB0aGlzIGNsYXNzCitjYW4gYmUgdXNlZCB0byBwYXJzZSBtZXNzYWdlcyBjb21pbmcgZnJvbSBhIGJ1ZmZlcmVkIHN0cmVhbS4KKworVGhlIG9wdGlvbmFsIGBzZWVrYWJsZScgYXJndW1lbnQgaXMgcHJvdmlkZWQgYXMgYSB3b3JrYXJvdW5kIGZvciBjZXJ0YWluIHN0ZGlvCitsaWJyYXJpZXMgaW4gd2hpY2ggdGVsbCgpIGRpc2NhcmRzIGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGRpc2NvdmVyaW5nIHRoYXQgdGhlCitsc2VlaygpIHN5c3RlbSBjYWxsIGRvZXNuJ3Qgd29yay4gIEZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCB5b3Ugc2hvdWxkIHNldCB0aGUKK3NlZWthYmxlIGFyZ3VtZW50IHRvIHplcm8gdG8gcHJldmVudCB0aGF0IGluaXRpYWwgXGNvZGV7dGVsbH0gd2hlbiBwYXNzaW5nIGluCithbiB1bnNlZWthYmxlIG9iamVjdCBzdWNoIGFzIGEgZmlsZSBvYmplY3QgY3JlYXRlZCBmcm9tIGEgc29ja2V0IG9iamVjdC4gIElmCitpdCBpcyAxIG9uIGVudHJ5IC0tIHdoaWNoIGl0IGlzIGJ5IGRlZmF1bHQgLS0gdGhlIHRlbGwoKSBtZXRob2Qgb2YgdGhlIG9wZW4KK2ZpbGUgb2JqZWN0IGlzIGNhbGxlZCBvbmNlOyBpZiB0aGlzIHJhaXNlcyBhbiBleGNlcHRpb24sIHNlZWthYmxlIGlzIHJlc2V0IHRvCiswLiAgRm9yIG90aGVyIG5vbnplcm8gdmFsdWVzIG9mIHNlZWthYmxlLCB0aGlzIHRlc3QgaXMgbm90IG1hZGUuCisKK1RvIGdldCB0aGUgdGV4dCBvZiBhIHBhcnRpY3VsYXIgaGVhZGVyIHRoZXJlIGFyZSBzZXZlcmFsIG1ldGhvZHM6CisKKyAgc3RyID0gbS5nZXRoZWFkZXIobmFtZSkKKyAgc3RyID0gbS5nZXRyYXdoZWFkZXIobmFtZSkKKword2hlcmUgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyLCBlLmcuICdTdWJqZWN0Jy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQKK2dldGhlYWRlcigpIHN0cmlwcyB0aGUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgd2hpbGUgZ2V0cmF3aGVhZGVyKCkKK2RvZXNuJ3QuICBCb3RoIGZ1bmN0aW9ucyByZXRhaW4gZW1iZWRkZWQgd2hpdGVzcGFjZSAoaW5jbHVkaW5nIG5ld2xpbmVzKQorZXhhY3RseSBhcyB0aGV5IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGhlYWRlciwgYW5kIGxlYXZlIHRoZSBjYXNlIG9mIHRoZSB0ZXh0Cit1bmNoYW5nZWQuCisKK0ZvciBhZGRyZXNzZXMgYW5kIGFkZHJlc3MgbGlzdHMgdGhlcmUgYXJlIGZ1bmN0aW9ucworCisgIHJlYWxuYW1lLCBtYWlsYWRkcmVzcyA9IG0uZ2V0YWRkcihuYW1lKQorICBsaXN0ID0gbS5nZXRhZGRybGlzdChuYW1lKQorCit3aGVyZSB0aGUgbGF0dGVyIHJldHVybnMgYSBsaXN0IG9mIChyZWFsbmFtZSwgbWFpbGFkZHIpIHR1cGxlcy4KKworVGhlcmUgaXMgYWxzbyBhIG1ldGhvZAorCisgIHRpbWUgPSBtLmdldGRhdGUobmFtZSkKKword2hpY2ggcGFyc2VzIGEgRGF0ZS1saWtlIGZpZWxkIGFuZCByZXR1cm5zIGEgdGltZS1jb21wYXRpYmxlIHR1cGxlLAoraS5lLiBhIHR1cGxlIHN1Y2ggYXMgcmV0dXJuZWQgYnkgdGltZS5sb2NhbHRpbWUoKSBvciBhY2NlcHRlZCBieQordGltZS5ta3RpbWUoKS4KKworU2VlIHRoZSBjbGFzcyBkZWZpbml0aW9uIGZvciBsb3dlciBsZXZlbCBhY2Nlc3MgbWV0aG9kcy4KKworVGhlcmUgYXJlIGFsc28gc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBoZXJlLgorIiIiCisjIENsZWFudXAgYW5kIGV4dGVuc2lvbnMgYnkgRXJpYyBTLiBSYXltb25kIDxlc3JAdGh5cnN1cy5jb20+CisKK2ltcG9ydCB0aW1lCisKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygiaW4gMy54LCByZmM4MjIgaGFzIGJlZW4gcmVtb3ZlZCBpbiBmYXZvciBvZiB0aGUgZW1haWwgcGFja2FnZSIsCisgICAgICAgICBzdGFja2xldmVsPTIpCisKK19fYWxsX18gPSBbIk1lc3NhZ2UiLCJBZGRyZXNzTGlzdCIsInBhcnNlZGF0ZSIsInBhcnNlZGF0ZV90eiIsIm1rdGltZV90eiJdCisKK19ibGFua2xpbmVzID0gKCdcclxuJywgJ1xuJykgICAgICAgICAgICAjIE9wdGltaXphdGlvbiBmb3IgaXNsYXN0KCkKKworCitjbGFzcyBNZXNzYWdlOgorICAgICIiIlJlcHJlc2VudHMgYSBzaW5nbGUgUkZDIDI4MjItY29tcGxpYW50IG1lc3NhZ2UuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIHNlZWthYmxlID0gMSk6CisgICAgICAgICIiIkluaXRpYWxpemUgdGhlIGNsYXNzIGluc3RhbmNlIGFuZCByZWFkIHRoZSBoZWFkZXJzLiIiIgorICAgICAgICBpZiBzZWVrYWJsZSA9PSAxOgorICAgICAgICAgICAgIyBFeGVyY2lzZSB0ZWxsKCkgdG8gbWFrZSBzdXJlIGl0IHdvcmtzCisgICAgICAgICAgICAjIChhbmQgdGhlbiBhc3N1bWUgc2VlaygpIHdvcmtzLCB0b28pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAudGVsbCgpCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBJT0Vycm9yKToKKyAgICAgICAgICAgICAgICBzZWVrYWJsZSA9IDAKKyAgICAgICAgc2VsZi5mcCA9IGZwCisgICAgICAgIHNlbGYuc2Vla2FibGUgPSBzZWVrYWJsZQorICAgICAgICBzZWxmLnN0YXJ0b2ZoZWFkZXJzID0gTm9uZQorICAgICAgICBzZWxmLnN0YXJ0b2Zib2R5ID0gTm9uZQorICAgICAgICAjCisgICAgICAgIGlmIHNlbGYuc2Vla2FibGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGFydG9maGVhZGVycyA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNlZWthYmxlID0gMAorICAgICAgICAjCisgICAgICAgIHNlbGYucmVhZGhlYWRlcnMoKQorICAgICAgICAjCisgICAgICAgIGlmIHNlbGYuc2Vla2FibGU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zdGFydG9mYm9keSA9IHNlbGYuZnAudGVsbCgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNlZWthYmxlID0gMAorCisgICAgZGVmIHJld2luZGJvZHkoc2VsZik6CisgICAgICAgICIiIlJld2luZCB0aGUgZmlsZSB0byB0aGUgc3RhcnQgb2YgdGhlIGJvZHkgKGlmIHNlZWthYmxlKS4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuc2Vla2FibGU6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAidW5zZWVrYWJsZSBmaWxlIgorICAgICAgICBzZWxmLmZwLnNlZWsoc2VsZi5zdGFydG9mYm9keSkKKworICAgIGRlZiByZWFkaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiUmVhZCBoZWFkZXIgbGluZXMuCisKKyAgICAgICAgUmVhZCBoZWFkZXIgbGluZXMgdXAgdG8gdGhlIGVudGlyZWx5IGJsYW5rIGxpbmUgdGhhdCB0ZXJtaW5hdGVzIHRoZW0uCisgICAgICAgIFRoZSAobm9ybWFsbHkgYmxhbmspIGxpbmUgdGhhdCBlbmRzIHRoZSBoZWFkZXJzIGlzIHNraXBwZWQsIGJ1dCBub3QKKyAgICAgICAgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIGxpc3QuICBJZiBhIG5vbi1oZWFkZXIgbGluZSBlbmRzIHRoZSBoZWFkZXJzLAorICAgICAgICAod2hpY2ggaXMgYW4gZXJyb3IpLCBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYmFja3NwYWNlIG92ZXIgaXQ7IGl0IGlzCisgICAgICAgIG5ldmVyIGluY2x1ZGVkIGluIHRoZSByZXR1cm5lZCBsaXN0LgorCisgICAgICAgIFRoZSB2YXJpYWJsZSBzZWxmLnN0YXR1cyBpcyBzZXQgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBhbGwgd2VudCB3ZWxsLAorICAgICAgICBvdGhlcndpc2UgaXQgaXMgYW4gZXJyb3IgbWVzc2FnZS4gIFRoZSB2YXJpYWJsZSBzZWxmLmhlYWRlcnMgaXMgYQorICAgICAgICBjb21wbGV0ZWx5IHVuaW50ZXJwcmV0ZWQgbGlzdCBvZiBsaW5lcyBjb250YWluZWQgaW4gdGhlIGhlYWRlciAoc28KKyAgICAgICAgcHJpbnRpbmcgdGhlbSB3aWxsIHJlcHJvZHVjZSB0aGUgaGVhZGVyIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiB0aGUKKyAgICAgICAgZmlsZSkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmRpY3QgPSB7fQorICAgICAgICBzZWxmLnVuaXhmcm9tID0gJycKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gbHN0ID0gW10KKyAgICAgICAgc2VsZi5zdGF0dXMgPSAnJworICAgICAgICBoZWFkZXJzZWVuID0gIiIKKyAgICAgICAgZmlyc3RsaW5lID0gMQorICAgICAgICBzdGFydG9mbGluZSA9IHVucmVhZCA9IHRlbGwgPSBOb25lCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5mcCwgJ3VucmVhZCcpOgorICAgICAgICAgICAgdW5yZWFkID0gc2VsZi5mcC51bnJlYWQKKyAgICAgICAgZWxpZiBzZWxmLnNlZWthYmxlOgorICAgICAgICAgICAgdGVsbCA9IHNlbGYuZnAudGVsbAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaWYgdGVsbDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0b2ZsaW5lID0gdGVsbCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHN0YXJ0b2ZsaW5lID0gdGVsbCA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWVrYWJsZSA9IDAKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdHVzID0gJ0VPRiBpbiBoZWFkZXJzJworICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIFNraXAgdW5peCBGcm9tIG5hbWUgdGltZSBsaW5lcworICAgICAgICAgICAgaWYgZmlyc3RsaW5lIGFuZCBsaW5lLnN0YXJ0c3dpdGgoJ0Zyb20gJyk6CisgICAgICAgICAgICAgICAgc2VsZi51bml4ZnJvbSA9IHNlbGYudW5peGZyb20gKyBsaW5lCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZpcnN0bGluZSA9IDAKKyAgICAgICAgICAgIGlmIGhlYWRlcnNlZW4gYW5kIGxpbmVbMF0gaW4gJyBcdCc6CisgICAgICAgICAgICAgICAgIyBJdCdzIGEgY29udGludWF0aW9uIGxpbmUuCisgICAgICAgICAgICAgICAgbHN0LmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIHggPSAoc2VsZi5kaWN0W2hlYWRlcnNlZW5dICsgIlxuICIgKyBsaW5lLnN0cmlwKCkpCisgICAgICAgICAgICAgICAgc2VsZi5kaWN0W2hlYWRlcnNlZW5dID0geC5zdHJpcCgpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgc2VsZi5pc2NvbW1lbnQobGluZSk6CisgICAgICAgICAgICAgICAgIyBJdCdzIGEgY29tbWVudC4gIElnbm9yZSBpdC4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBzZWxmLmlzbGFzdChsaW5lKToKKyAgICAgICAgICAgICAgICAjIE5vdGUhIE5vIHB1c2hiYWNrIGhlcmUhICBUaGUgZGVsaW1pdGVyIGxpbmUgZ2V0cyBlYXRlbi4KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaGVhZGVyc2VlbiA9IHNlbGYuaXNoZWFkZXIobGluZSkKKyAgICAgICAgICAgIGlmIGhlYWRlcnNlZW46CisgICAgICAgICAgICAgICAgIyBJdCdzIGEgbGVnYWwgaGVhZGVyIGxpbmUsIHNhdmUgaXQuCisgICAgICAgICAgICAgICAgbHN0LmFwcGVuZChsaW5lKQorICAgICAgICAgICAgICAgIHNlbGYuZGljdFtoZWFkZXJzZWVuXSA9IGxpbmVbbGVuKGhlYWRlcnNlZW4pKzE6XS5zdHJpcCgpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBJdCdzIG5vdCBhIGhlYWRlciBsaW5lOyB0aHJvdyBpdCBiYWNrIGFuZCBzdG9wIGhlcmUuCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZGljdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMgPSAnTm8gaGVhZGVycycKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9ICdOb24taGVhZGVyIGxpbmUgd2hlcmUgaGVhZGVyIGV4cGVjdGVkJworICAgICAgICAgICAgICAgICMgVHJ5IHRvIHVuZG8gdGhlIHJlYWQuCisgICAgICAgICAgICAgICAgaWYgdW5yZWFkOgorICAgICAgICAgICAgICAgICAgICB1bnJlYWQobGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIHRlbGw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlayhzdGFydG9mbGluZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cyA9IHNlbGYuc3RhdHVzICsgJzsgYmFkIHNlZWsnCisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBpc2hlYWRlcihzZWxmLCBsaW5lKToKKyAgICAgICAgIiIiRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBsaW5lIGlzIGEgbGVnYWwgaGVhZGVyLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gdGhlIGhlYWRlciBuYW1lLCBzdWl0YWJseSBjYW5vbmljYWxpemVkLgorICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHVzZSBNZXNzYWdlIHBhcnNpbmcgb24gdGFnZ2VkCisgICAgICAgIGRhdGEgaW4gUkZDIDI4MjItbGlrZSBmb3JtYXRzIHdpdGggc3BlY2lhbCBoZWFkZXIgZm9ybWF0cy4KKyAgICAgICAgIiIiCisgICAgICAgIGkgPSBsaW5lLmZpbmQoJzonKQorICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgIHJldHVybiBsaW5lWzppXS5sb3dlcigpCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgaXNsYXN0KHNlbGYsIGxpbmUpOgorICAgICAgICAiIiJEZXRlcm1pbmUgd2hldGhlciBhIGxpbmUgaXMgYSBsZWdhbCBlbmQgb2YgUkZDIDI4MjIgaGVhZGVycy4KKworICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHlvdXIgYXBwbGljYXRpb24gd2FudHMgdG8gYmVuZCB0aGUKKyAgICAgICAgcnVsZXMsIGUuZy4gdG8gc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgb3IgdG8gcmVjb2duaXplIE1IIHRlbXBsYXRlCisgICAgICAgIHNlcGFyYXRvcnMgKCctLS0tLS0tLScpLiAgRm9yIGNvbnZlbmllbmNlIChlLmcuIGZvciBjb2RlIHJlYWRpbmcgZnJvbQorICAgICAgICBzb2NrZXRzKSBhIGxpbmUgY29uc2lzdGluZyBvZiBcXHJcXG4gYWxzbyBtYXRjaGVzLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGxpbmUgaW4gX2JsYW5rbGluZXMKKworICAgIGRlZiBpc2NvbW1lbnQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkRldGVybWluZSB3aGV0aGVyIGEgbGluZSBzaG91bGQgYmUgc2tpcHBlZCBlbnRpcmVseS4KKworICAgICAgICBZb3UgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIG9yZGVyIHRvIHVzZSBNZXNzYWdlIHBhcnNpbmcgb24gdGFnZ2VkCisgICAgICAgIGRhdGEgaW4gUkZDIDI4MjItbGlrZSBmb3JtYXRzIHRoYXQgc3VwcG9ydCBlbWJlZGRlZCBjb21tZW50cyBvcgorICAgICAgICBmcmVlLXRleHQgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGdldGFsbG1hdGNoaW5naGVhZGVycyhzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiRmluZCBhbGwgaGVhZGVyIGxpbmVzIG1hdGNoaW5nIGEgZ2l2ZW4gaGVhZGVyIG5hbWUuCisKKyAgICAgICAgTG9vayB0aHJvdWdoIHRoZSBsaXN0IG9mIGhlYWRlcnMgYW5kIGZpbmQgYWxsIGxpbmVzIG1hdGNoaW5nIGEgZ2l2ZW4KKyAgICAgICAgaGVhZGVyIG5hbWUgKGFuZCB0aGVpciBjb250aW51YXRpb24gbGluZXMpLiAgQSBsaXN0IG9mIHRoZSBsaW5lcyBpcworICAgICAgICByZXR1cm5lZCwgd2l0aG91dCBpbnRlcnByZXRhdGlvbi4gIElmIHRoZSBoZWFkZXIgZG9lcyBub3Qgb2NjdXIsIGFuCisgICAgICAgIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuICBJZiB0aGUgaGVhZGVyIG9jY3VycyBtdWx0aXBsZSB0aW1lcywgYWxsCisgICAgICAgIG9jY3VycmVuY2VzIGFyZSByZXR1cm5lZC4gIENhc2UgaXMgbm90IGltcG9ydGFudCBpbiB0aGUgaGVhZGVyIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpICsgJzonCisgICAgICAgIG4gPSBsZW4obmFtZSkKKyAgICAgICAgbHN0ID0gW10KKyAgICAgICAgaGl0ID0gMAorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmhlYWRlcnM6CisgICAgICAgICAgICBpZiBsaW5lWzpuXS5sb3dlcigpID09IG5hbWU6CisgICAgICAgICAgICAgICAgaGl0ID0gMQorICAgICAgICAgICAgZWxpZiBub3QgbGluZVs6MV0uaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgIGhpdCA9IDAKKyAgICAgICAgICAgIGlmIGhpdDoKKyAgICAgICAgICAgICAgICBsc3QuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiBsc3QKKworICAgIGRlZiBnZXRmaXJzdG1hdGNoaW5naGVhZGVyKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJHZXQgdGhlIGZpcnN0IGhlYWRlciBsaW5lIG1hdGNoaW5nIG5hbWUuCisKKyAgICAgICAgVGhpcyBpcyBzaW1pbGFyIHRvIGdldGFsbG1hdGNoaW5naGVhZGVycywgYnV0IGl0IHJldHVybnMgb25seSB0aGUKKyAgICAgICAgZmlyc3QgbWF0Y2hpbmcgaGVhZGVyIChhbmQgaXRzIGNvbnRpbnVhdGlvbiBsaW5lcykuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpICsgJzonCisgICAgICAgIG4gPSBsZW4obmFtZSkKKyAgICAgICAgbHN0ID0gW10KKyAgICAgICAgaGl0ID0gMAorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmhlYWRlcnM6CisgICAgICAgICAgICBpZiBoaXQ6CisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmVbOjFdLmlzc3BhY2UoKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgbGluZVs6bl0ubG93ZXIoKSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIGhpdCA9IDEKKyAgICAgICAgICAgIGlmIGhpdDoKKyAgICAgICAgICAgICAgICBsc3QuYXBwZW5kKGxpbmUpCisgICAgICAgIHJldHVybiBsc3QKKworICAgIGRlZiBnZXRyYXdoZWFkZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkEgaGlnaGVyLWxldmVsIGludGVyZmFjZSB0byBnZXRmaXJzdG1hdGNoaW5naGVhZGVyKCkuCisKKyAgICAgICAgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGxpdGVyYWwgdGV4dCBvZiB0aGUgaGVhZGVyIGJ1dCB3aXRoIHRoZQorICAgICAgICBrZXl3b3JkIHN0cmlwcGVkLiAgQWxsIGxlYWRpbmcsIHRyYWlsaW5nIGFuZCBlbWJlZGRlZCB3aGl0ZXNwYWNlIGlzCisgICAgICAgIGtlcHQgaW4gdGhlIHN0cmluZywgaG93ZXZlci4gIFJldHVybiBOb25lIGlmIHRoZSBoZWFkZXIgZG9lcyBub3QKKyAgICAgICAgb2NjdXIuCisgICAgICAgICIiIgorCisgICAgICAgIGxzdCA9IHNlbGYuZ2V0Zmlyc3RtYXRjaGluZ2hlYWRlcihuYW1lKQorICAgICAgICBpZiBub3QgbHN0OgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgbHN0WzBdID0gbHN0WzBdW2xlbihuYW1lKSArIDE6XQorICAgICAgICByZXR1cm4gJycuam9pbihsc3QpCisKKyAgICBkZWYgZ2V0aGVhZGVyKHNlbGYsIG5hbWUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIkdldCB0aGUgaGVhZGVyIHZhbHVlIGZvciBhIG5hbWUuCisKKyAgICAgICAgVGhpcyBpcyB0aGUgbm9ybWFsIGludGVyZmFjZTogaXQgcmV0dXJucyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlCisgICAgICAgIGhlYWRlciB2YWx1ZSBmb3IgYSBnaXZlbiBoZWFkZXIgbmFtZSwgb3IgTm9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAgICBUaGlzIHVzZXMgdGhlIGRpY3Rpb25hcnkgdmVyc2lvbiB3aGljaCBmaW5kcyB0aGUgKmxhc3QqIHN1Y2ggaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGljdC5nZXQobmFtZS5sb3dlcigpLCBkZWZhdWx0KQorICAgIGdldCA9IGdldGhlYWRlcgorCisgICAgZGVmIGdldGhlYWRlcnMoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkdldCBhbGwgdmFsdWVzIGZvciBhIGhlYWRlci4KKworICAgICAgICBUaGlzIHJldHVybnMgYSBsaXN0IG9mIHZhbHVlcyBmb3IgaGVhZGVycyBnaXZlbiBtb3JlIHRoYW4gb25jZTsgZWFjaAorICAgICAgICB2YWx1ZSBpbiB0aGUgcmVzdWx0IGxpc3QgaXMgc3RyaXBwZWQgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZSByZXN1bHQgb2YKKyAgICAgICAgZ2V0aGVhZGVyKCkuICBJZiB0aGUgaGVhZGVyIGlzIG5vdCBnaXZlbiwgcmV0dXJuIGFuIGVtcHR5IGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBjdXJyZW50ID0gJycKKyAgICAgICAgaGF2ZV9oZWFkZXIgPSAwCisgICAgICAgIGZvciBzIGluIHNlbGYuZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzKG5hbWUpOgorICAgICAgICAgICAgaWYgc1swXS5pc3NwYWNlKCk6CisgICAgICAgICAgICAgICAgaWYgY3VycmVudDoKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9ICIlc1xuICVzIiAlIChjdXJyZW50LCBzLnN0cmlwKCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHMuc3RyaXAoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBoYXZlX2hlYWRlcjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjdXJyZW50KQorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzW3MuZmluZCgiOiIpICsgMTpdLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBoYXZlX2hlYWRlciA9IDEKKyAgICAgICAgaWYgaGF2ZV9oZWFkZXI6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGN1cnJlbnQpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBnZXRhZGRyKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJHZXQgYSBzaW5nbGUgYWRkcmVzcyBmcm9tIGEgaGVhZGVyLCBhcyBhIHR1cGxlLgorCisgICAgICAgIEFuIGV4YW1wbGUgcmV0dXJuIHZhbHVlOgorICAgICAgICAoJ0d1aWRvIHZhbiBSb3NzdW0nLCAnZ3VpZG9AY3dpLm5sJykKKyAgICAgICAgIiIiCisgICAgICAgICMgTmV3LCBieSBCZW4gRXNjb3RvCisgICAgICAgIGFsaXN0ID0gc2VsZi5nZXRhZGRybGlzdChuYW1lKQorICAgICAgICBpZiBhbGlzdDoKKyAgICAgICAgICAgIHJldHVybiBhbGlzdFswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChOb25lLCBOb25lKQorCisgICAgZGVmIGdldGFkZHJsaXN0KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJHZXQgYSBsaXN0IG9mIGFkZHJlc3NlcyBmcm9tIGEgaGVhZGVyLgorCisgICAgICAgIFJldHJpZXZlcyBhIGxpc3Qgb2YgYWRkcmVzc2VzIGZyb20gYSBoZWFkZXIsIHdoZXJlIGVhY2ggYWRkcmVzcyBpcyBhCisgICAgICAgIHR1cGxlIGFzIHJldHVybmVkIGJ5IGdldGFkZHIoKS4gIFNjYW5zIGFsbCBuYW1lZCBoZWFkZXJzLCBzbyBpdCB3b3JrcworICAgICAgICBwcm9wZXJseSB3aXRoIG11bHRpcGxlIFRvOiBvciBDYzogaGVhZGVycyBmb3IgZXhhbXBsZS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhdyA9IFtdCisgICAgICAgIGZvciBoIGluIHNlbGYuZ2V0YWxsbWF0Y2hpbmdoZWFkZXJzKG5hbWUpOgorICAgICAgICAgICAgaWYgaFswXSBpbiAnIFx0JzoKKyAgICAgICAgICAgICAgICByYXcuYXBwZW5kKGgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHJhdzoKKyAgICAgICAgICAgICAgICAgICAgcmF3LmFwcGVuZCgnLCAnKQorICAgICAgICAgICAgICAgIGkgPSBoLmZpbmQoJzonKQorICAgICAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgICAgICBhZGRyID0gaFtpKzE6XQorICAgICAgICAgICAgICAgIHJhdy5hcHBlbmQoYWRkcikKKyAgICAgICAgYWxsYWRkcnMgPSAnJy5qb2luKHJhdykKKyAgICAgICAgYSA9IEFkZHJlc3NMaXN0KGFsbGFkZHJzKQorICAgICAgICByZXR1cm4gYS5hZGRyZXNzbGlzdAorCisgICAgZGVmIGdldGRhdGUoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHJpZXZlIGEgZGF0ZSBmaWVsZCBmcm9tIGEgaGVhZGVyLgorCisgICAgICAgIFJldHJpZXZlcyBhIGRhdGUgZmllbGQgZnJvbSB0aGUgbmFtZWQgaGVhZGVyLCByZXR1cm5pbmcgYSB0dXBsZQorICAgICAgICBjb21wYXRpYmxlIHdpdGggdGltZS5ta3RpbWUoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmW25hbWVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBwYXJzZWRhdGUoZGF0YSkKKworICAgIGRlZiBnZXRkYXRlX3R6KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXRyaWV2ZSBhIGRhdGUgZmllbGQgZnJvbSBhIGhlYWRlciBhcyBhIDEwLXR1cGxlLgorCisgICAgICAgIFRoZSBmaXJzdCA5IGVsZW1lbnRzIG1ha2UgdXAgYSB0dXBsZSBjb21wYXRpYmxlIHdpdGggdGltZS5ta3RpbWUoKSwKKyAgICAgICAgYW5kIHRoZSAxMHRoIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHBvc3RlcidzIHRpbWUgem9uZSBmcm9tIEdNVC9VVEMuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gc2VsZltuYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gcGFyc2VkYXRlX3R6KGRhdGEpCisKKworICAgICMgQWNjZXNzIGFzIGEgZGljdGlvbmFyeSAob25seSBmaW5kcyAqbGFzdCogaGVhZGVyIG9mIGVhY2ggdHlwZSk6CisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBudW1iZXIgb2YgaGVhZGVycyBpbiBhIG1lc3NhZ2UuIiIiCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kaWN0KQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJHZXQgYSBzcGVjaWZpYyBoZWFkZXIsIGFzIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5kaWN0W25hbWUubG93ZXIoKV0KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICIiIlNldCB0aGUgdmFsdWUgb2YgYSBoZWFkZXIuCisKKyAgICAgICAgTm90ZTogVGhpcyBpcyBub3QgYSBwZXJmZWN0IGludmVyc2lvbiBvZiBfX2dldGl0ZW1fXywgYmVjYXVzZSBhbnkKKyAgICAgICAgY2hhbmdlZCBoZWFkZXJzIGdldCBzdHVjayBhdCB0aGUgZW5kIG9mIHRoZSByYXctaGVhZGVycyBsaXN0IHJhdGhlcgorICAgICAgICB0aGFuIHdoZXJlIHRoZSBhbHRlcmVkIGhlYWRlciB3YXMuCisgICAgICAgICIiIgorICAgICAgICBkZWwgc2VsZltuYW1lXSAjIFdvbid0IGZhaWwgaWYgaXQgZG9lc24ndCBleGlzdAorICAgICAgICBzZWxmLmRpY3RbbmFtZS5sb3dlcigpXSA9IHZhbHVlCisgICAgICAgIHRleHQgPSBuYW1lICsgIjogIiArIHZhbHVlCisgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoIlxuIik6CisgICAgICAgICAgICBzZWxmLmhlYWRlcnMuYXBwZW5kKGxpbmUgKyAiXG4iKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJEZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIGEgc3BlY2lmaWMgaGVhZGVyLCBpZiBpdCBpcyBwcmVzZW50LiIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGlmIG5vdCBuYW1lIGluIHNlbGYuZGljdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkZWwgc2VsZi5kaWN0W25hbWVdCisgICAgICAgIG5hbWUgPSBuYW1lICsgJzonCisgICAgICAgIG4gPSBsZW4obmFtZSkKKyAgICAgICAgbHN0ID0gW10KKyAgICAgICAgaGl0ID0gMAorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5oZWFkZXJzKSk6CisgICAgICAgICAgICBsaW5lID0gc2VsZi5oZWFkZXJzW2ldCisgICAgICAgICAgICBpZiBsaW5lWzpuXS5sb3dlcigpID09IG5hbWU6CisgICAgICAgICAgICAgICAgaGl0ID0gMQorICAgICAgICAgICAgZWxpZiBub3QgbGluZVs6MV0uaXNzcGFjZSgpOgorICAgICAgICAgICAgICAgIGhpdCA9IDAKKyAgICAgICAgICAgIGlmIGhpdDoKKyAgICAgICAgICAgICAgICBsc3QuYXBwZW5kKGkpCisgICAgICAgIGZvciBpIGluIHJldmVyc2VkKGxzdCk6CisgICAgICAgICAgICBkZWwgc2VsZi5oZWFkZXJzW2ldCisKKyAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBuYW1lLCBkZWZhdWx0PSIiKToKKyAgICAgICAgbG93ZXJuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGlmIGxvd2VybmFtZSBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kaWN0W2xvd2VybmFtZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQgPSBuYW1lICsgIjogIiArIGRlZmF1bHQKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoIlxuIik6CisgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzLmFwcGVuZChsaW5lICsgIlxuIikKKyAgICAgICAgICAgIHNlbGYuZGljdFtsb3dlcm5hbWVdID0gZGVmYXVsdAorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJEZXRlcm1pbmUgd2hldGhlciBhIG1lc3NhZ2UgY29udGFpbnMgdGhlIG5hbWVkIGhlYWRlci4iIiIKKyAgICAgICAgcmV0dXJuIG5hbWUubG93ZXIoKSBpbiBzZWxmLmRpY3QKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkRldGVybWluZSB3aGV0aGVyIGEgbWVzc2FnZSBjb250YWlucyB0aGUgbmFtZWQgaGVhZGVyLiIiIgorICAgICAgICByZXR1cm4gbmFtZS5sb3dlcigpIGluIHNlbGYuZGljdAorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaXRlcihzZWxmLmRpY3QpCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgIiIiR2V0IGFsbCBvZiBhIG1lc3NhZ2UncyBoZWFkZXIgZmllbGQgbmFtZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRpY3Qua2V5cygpCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAiIiJHZXQgYWxsIG9mIGEgbWVzc2FnZSdzIGhlYWRlciBmaWVsZCB2YWx1ZXMuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRpY3QudmFsdWVzKCkKKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgIiIiR2V0IGFsbCBvZiBhIG1lc3NhZ2UncyBoZWFkZXJzLgorCisgICAgICAgIFJldHVybnMgYSBsaXN0IG9mIG5hbWUsIHZhbHVlIHR1cGxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRpY3QuaXRlbXMoKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnJy5qb2luKHNlbGYuaGVhZGVycykKKworCisjIFV0aWxpdHkgZnVuY3Rpb25zCisjIC0tLS0tLS0tLS0tLS0tLS0tCisKKyMgWFhYIFNob3VsZCBmaXggdW5xdW90ZSgpIGFuZCBxdW90ZSgpIHRvIGJlIHJlYWxseSBjb25mb3JtYW50LgorIyBYWFggVGhlIGludmVyc2VzIG9mIHRoZSBwYXJzZSBmdW5jdGlvbnMgbWF5IGFsc28gYmUgdXNlZnVsLgorCisKK2RlZiB1bnF1b3RlKHMpOgorICAgICIiIlJlbW92ZSBxdW90ZXMgZnJvbSBhIHN0cmluZy4iIiIKKyAgICBpZiBsZW4ocykgPiAxOgorICAgICAgICBpZiBzLnN0YXJ0c3dpdGgoJyInKSBhbmQgcy5lbmRzd2l0aCgnIicpOgorICAgICAgICAgICAgcmV0dXJuIHNbMTotMV0ucmVwbGFjZSgnXFxcXCcsICdcXCcpLnJlcGxhY2UoJ1xcIicsICciJykKKyAgICAgICAgaWYgcy5zdGFydHN3aXRoKCc8JykgYW5kIHMuZW5kc3dpdGgoJz4nKToKKyAgICAgICAgICAgIHJldHVybiBzWzE6LTFdCisgICAgcmV0dXJuIHMKKworCitkZWYgcXVvdGUocyk6CisgICAgIiIiQWRkIHF1b3RlcyBhcm91bmQgYSBzdHJpbmcuIiIiCisgICAgcmV0dXJuIHMucmVwbGFjZSgnXFwnLCAnXFxcXCcpLnJlcGxhY2UoJyInLCAnXFwiJykKKworCitkZWYgcGFyc2VhZGRyKGFkZHJlc3MpOgorICAgICIiIlBhcnNlIGFuIGFkZHJlc3MgaW50byBhIChyZWFsbmFtZSwgbWFpbGFkZHIpIHR1cGxlLiIiIgorICAgIGEgPSBBZGRyZXNzTGlzdChhZGRyZXNzKQorICAgIGxzdCA9IGEuYWRkcmVzc2xpc3QKKyAgICBpZiBub3QgbHN0OgorICAgICAgICByZXR1cm4gKE5vbmUsIE5vbmUpCisgICAgcmV0dXJuIGxzdFswXQorCisKK2NsYXNzIEFkZHJsaXN0Q2xhc3M6CisgICAgIiIiQWRkcmVzcyBwYXJzZXIgY2xhc3MgYnkgQmVuIEVzY290by4KKworICAgIFRvIHVuZGVyc3RhbmQgd2hhdCB0aGlzIGNsYXNzIGRvZXMsIGl0IGhlbHBzIHRvIGhhdmUgYSBjb3B5IG9mCisgICAgUkZDIDI4MjIgaW4gZnJvbnQgb2YgeW91LgorCisgICAgaHR0cDovL3d3dy5mYXFzLm9yZy9yZmNzL3JmYzI4MjIuaHRtbAorCisgICAgTm90ZTogdGhpcyBjbGFzcyBpbnRlcmZhY2UgaXMgZGVwcmVjYXRlZCBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgICBVc2UgcmZjODIyLkFkZHJlc3NMaXN0IGluc3RlYWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmllbGQpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlLgorCisgICAgICAgIGBmaWVsZCcgaXMgYW4gdW5wYXJzZWQgYWRkcmVzcyBoZWFkZXIgZmllbGQsIGNvbnRhaW5pbmcgb25lIG9yIG1vcmUKKyAgICAgICAgYWRkcmVzc2VzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zcGVjaWFscyA9ICcoKTw+QCw6Oy5cIltdJworICAgICAgICBzZWxmLnBvcyA9IDAKKyAgICAgICAgc2VsZi5MV1MgPSAnIFx0JworICAgICAgICBzZWxmLkNSID0gJ1xyXG4nCisgICAgICAgIHNlbGYuYXRvbWVuZHMgPSBzZWxmLnNwZWNpYWxzICsgc2VsZi5MV1MgKyBzZWxmLkNSCisgICAgICAgICMgTm90ZSB0aGF0IFJGQyAyODIyIG5vdyBzcGVjaWZpZXMgYC4nIGFzIG9icy1waHJhc2UsIG1lYW5pbmcgdGhhdCBpdAorICAgICAgICAjIGlzIG9ic29sZXRlIHN5bnRheC4gIFJGQyAyODIyIHJlcXVpcmVzIHRoYXQgd2UgcmVjb2duaXplIG9ic29sZXRlCisgICAgICAgICMgc3ludGF4LCBzbyBhbGxvdyBkb3RzIGluIHBocmFzZXMuCisgICAgICAgIHNlbGYucGhyYXNlZW5kcyA9IHNlbGYuYXRvbWVuZHMucmVwbGFjZSgnLicsICcnKQorICAgICAgICBzZWxmLmZpZWxkID0gZmllbGQKKyAgICAgICAgc2VsZi5jb21tZW50bGlzdCA9IFtdCisKKyAgICBkZWYgZ290b25leHQoc2VsZik6CisgICAgICAgICIiIlBhcnNlIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBhZGRyZXNzLiIiIgorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuTFdTICsgJ1xuXHInOgorICAgICAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgKyAxCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgIGVsc2U6IGJyZWFrCisKKyAgICBkZWYgZ2V0YWRkcmxpc3Qoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFsbCBhZGRyZXNzZXMuCisKKyAgICAgICAgUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyBhbGwgb2YgdGhlIGFkZHJlc3Nlcy4KKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGFkID0gc2VsZi5nZXRhZGRyZXNzKCkKKyAgICAgICAgd2hpbGUgYWQ6CisgICAgICAgICAgICByZXN1bHQgKz0gYWQKKyAgICAgICAgICAgIGFkID0gc2VsZi5nZXRhZGRyZXNzKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGdldGFkZHJlc3Moc2VsZik6CisgICAgICAgICIiIlBhcnNlIHRoZSBuZXh0IGFkZHJlc3MuIiIiCisgICAgICAgIHNlbGYuY29tbWVudGxpc3QgPSBbXQorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKworICAgICAgICBvbGRwb3MgPSBzZWxmLnBvcworICAgICAgICBvbGRjbCA9IHNlbGYuY29tbWVudGxpc3QKKyAgICAgICAgcGxpc3QgPSBzZWxmLmdldHBocmFzZWxpc3QoKQorCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICByZXR1cm5saXN0ID0gW10KKworICAgICAgICBpZiBzZWxmLnBvcyA+PSBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICAjIEJhZCBlbWFpbCBhZGRyZXNzIHRlY2huaWNhbGx5LCBubyBkb21haW4uCisgICAgICAgICAgICBpZiBwbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWygnICcuam9pbihzZWxmLmNvbW1lbnRsaXN0KSwgcGxpc3RbMF0pXQorCisgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gJy5AJzoKKyAgICAgICAgICAgICMgZW1haWwgYWRkcmVzcyBpcyBqdXN0IGFuIGFkZHJzcGVjCisgICAgICAgICAgICAjIHRoaXMgaXNuJ3QgdmVyeSBlZmZpY2llbnQgc2luY2Ugd2Ugc3RhcnQgb3ZlcgorICAgICAgICAgICAgc2VsZi5wb3MgPSBvbGRwb3MKKyAgICAgICAgICAgIHNlbGYuY29tbWVudGxpc3QgPSBvbGRjbAorICAgICAgICAgICAgYWRkcnNwZWMgPSBzZWxmLmdldGFkZHJzcGVjKCkKKyAgICAgICAgICAgIHJldHVybmxpc3QgPSBbKCcgJy5qb2luKHNlbGYuY29tbWVudGxpc3QpLCBhZGRyc3BlYyldCisKKyAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnOic6CisgICAgICAgICAgICAjIGFkZHJlc3MgaXMgYSBncm91cAorICAgICAgICAgICAgcmV0dXJubGlzdCA9IFtdCisKKyAgICAgICAgICAgIGZpZWxkbGVuID0gbGVuKHNlbGYuZmllbGQpCisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnBvcyA8IGZpZWxkbGVuIGFuZCBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnOyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gcmV0dXJubGlzdCArIHNlbGYuZ2V0YWRkcmVzcygpCisKKyAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnPCc6CisgICAgICAgICAgICAjIEFkZHJlc3MgaXMgYSBwaHJhc2UgdGhlbiBhIHJvdXRlIGFkZHIKKyAgICAgICAgICAgIHJvdXRlYWRkciA9IHNlbGYuZ2V0cm91dGVhZGRyKCkKKworICAgICAgICAgICAgaWYgc2VsZi5jb21tZW50bGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWygnICcuam9pbihwbGlzdCkgKyAnICgnICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICcgJy5qb2luKHNlbGYuY29tbWVudGxpc3QpICsgJyknLCByb3V0ZWFkZHIpXQorICAgICAgICAgICAgZWxzZTogcmV0dXJubGlzdCA9IFsoJyAnLmpvaW4ocGxpc3QpLCByb3V0ZWFkZHIpXQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwbGlzdDoKKyAgICAgICAgICAgICAgICByZXR1cm5saXN0ID0gWygnICcuam9pbihzZWxmLmNvbW1lbnRsaXN0KSwgcGxpc3RbMF0pXQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLnNwZWNpYWxzOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKworICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgaWYgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCkgYW5kIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcsJzoKKyAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgcmV0dXJuIHJldHVybmxpc3QKKworICAgIGRlZiBnZXRyb3V0ZWFkZHIoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGEgcm91dGUgYWRkcmVzcyAoUmV0dXJuLXBhdGggdmFsdWUpLgorCisgICAgICAgIFRoaXMgbWV0aG9kIGp1c3Qgc2tpcHMgYWxsIHRoZSByb3V0ZSBzdHVmZiBhbmQgcmV0dXJucyB0aGUgYWRkcnNwZWMuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSAhPSAnPCc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBleHBlY3Ryb3V0ZSA9IDAKKyAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgYWRsaXN0ID0gIiIKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBleHBlY3Ryb3V0ZToKKyAgICAgICAgICAgICAgICBzZWxmLmdldGRvbWFpbigpCisgICAgICAgICAgICAgICAgZXhwZWN0cm91dGUgPSAwCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICc+JzoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJ0AnOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgICAgICBleHBlY3Ryb3V0ZSA9IDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJzonOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWRsaXN0ID0gc2VsZi5nZXRhZGRyc3BlYygpCisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKworICAgICAgICByZXR1cm4gYWRsaXN0CisKKyAgICBkZWYgZ2V0YWRkcnNwZWMoc2VsZik6CisgICAgICAgICIiIlBhcnNlIGFuIFJGQyAyODIyIGFkZHItc3BlYy4iIiIKKyAgICAgICAgYXNsaXN0ID0gW10KKworICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKyAgICAgICAgd2hpbGUgc2VsZi5wb3MgPCBsZW4oc2VsZi5maWVsZCk6CisgICAgICAgICAgICBpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnLic6CisgICAgICAgICAgICAgICAgYXNsaXN0LmFwcGVuZCgnLicpCisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnIic6CisgICAgICAgICAgICAgICAgYXNsaXN0LmFwcGVuZCgnIiVzIicgJSBzZWxmLmdldHF1b3RlKCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuYXRvbWVuZHM6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6IGFzbGlzdC5hcHBlbmQoc2VsZi5nZXRhdG9tKCkpCisgICAgICAgICAgICBzZWxmLmdvdG9uZXh0KCkKKworICAgICAgICBpZiBzZWxmLnBvcyA+PSBsZW4oc2VsZi5maWVsZCkgb3Igc2VsZi5maWVsZFtzZWxmLnBvc10gIT0gJ0AnOgorICAgICAgICAgICAgcmV0dXJuICcnLmpvaW4oYXNsaXN0KQorCisgICAgICAgIGFzbGlzdC5hcHBlbmQoJ0AnKQorICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgIHNlbGYuZ290b25leHQoKQorICAgICAgICByZXR1cm4gJycuam9pbihhc2xpc3QpICsgc2VsZi5nZXRkb21haW4oKQorCisgICAgZGVmIGdldGRvbWFpbihzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjb21wbGV0ZSBkb21haW4gbmFtZSBmcm9tIGFuIGFkZHJlc3MuIiIiCisgICAgICAgIHNkbGlzdCA9IFtdCisgICAgICAgIHdoaWxlIHNlbGYucG9zIDwgbGVuKHNlbGYuZmllbGQpOgorICAgICAgICAgICAgaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5MV1M6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnKCc6CisgICAgICAgICAgICAgICAgc2VsZi5jb21tZW50bGlzdC5hcHBlbmQoc2VsZi5nZXRjb21tZW50KCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICdbJzoKKyAgICAgICAgICAgICAgICBzZGxpc3QuYXBwZW5kKHNlbGYuZ2V0ZG9tYWlubGl0ZXJhbCgpKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnLic6CisgICAgICAgICAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICAgICAgICAgIHNkbGlzdC5hcHBlbmQoJy4nKQorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBzZWxmLmF0b21lbmRzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOiBzZGxpc3QuYXBwZW5kKHNlbGYuZ2V0YXRvbSgpKQorICAgICAgICByZXR1cm4gJycuam9pbihzZGxpc3QpCisKKyAgICBkZWYgZ2V0ZGVsaW1pdGVkKHNlbGYsIGJlZ2luY2hhciwgZW5kY2hhcnMsIGFsbG93Y29tbWVudHMgPSAxKToKKyAgICAgICAgIiIiUGFyc2UgYSBoZWFkZXIgZnJhZ21lbnQgZGVsaW1pdGVkIGJ5IHNwZWNpYWwgY2hhcmFjdGVycy4KKworICAgICAgICBgYmVnaW5jaGFyJyBpcyB0aGUgc3RhcnQgY2hhcmFjdGVyIGZvciB0aGUgZnJhZ21lbnQuICBJZiBzZWxmIGlzIG5vdAorICAgICAgICBsb29raW5nIGF0IGFuIGluc3RhbmNlIG9mIGBiZWdpbmNoYXInIHRoZW4gZ2V0ZGVsaW1pdGVkIHJldHVybnMgdGhlCisgICAgICAgIGVtcHR5IHN0cmluZy4KKworICAgICAgICBgZW5kY2hhcnMnIGlzIGEgc2VxdWVuY2Ugb2YgYWxsb3dhYmxlIGVuZC1kZWxpbWl0aW5nIGNoYXJhY3RlcnMuCisgICAgICAgIFBhcnNpbmcgc3RvcHMgd2hlbiBvbmUgb2YgdGhlc2UgaXMgZW5jb3VudGVyZWQuCisKKyAgICAgICAgSWYgYGFsbG93Y29tbWVudHMnIGlzIG5vbi16ZXJvLCBlbWJlZGRlZCBSRkMgMjgyMiBjb21tZW50cyBhcmUgYWxsb3dlZAorICAgICAgICB3aXRoaW4gdGhlIHBhcnNlZCBmcmFnbWVudC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdICE9IGJlZ2luY2hhcjoKKyAgICAgICAgICAgIHJldHVybiAnJworCisgICAgICAgIHNsaXN0ID0gWycnXQorICAgICAgICBxdW90ZSA9IDAKKyAgICAgICAgc2VsZi5wb3MgKz0gMQorICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHF1b3RlID09IDE6CisgICAgICAgICAgICAgICAgc2xpc3QuYXBwZW5kKHNlbGYuZmllbGRbc2VsZi5wb3NdKQorICAgICAgICAgICAgICAgIHF1b3RlID0gMAorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSBpbiBlbmRjaGFyczoKKyAgICAgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgYWxsb3djb21tZW50cyBhbmQgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJygnOgorICAgICAgICAgICAgICAgIHNsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgIyBoYXZlIGFscmVhZHkgYWR2YW5jZWQgcG9zIGZyb20gZ2V0Y29tbWVudAorICAgICAgICAgICAgZWxpZiBzZWxmLmZpZWxkW3NlbGYucG9zXSA9PSAnXFwnOgorICAgICAgICAgICAgICAgIHF1b3RlID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzbGlzdC5hcHBlbmQoc2VsZi5maWVsZFtzZWxmLnBvc10pCisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oc2xpc3QpCisKKyAgICBkZWYgZ2V0cXVvdGUoc2VsZik6CisgICAgICAgICIiIkdldCBhIHF1b3RlLWRlbGltaXRlZCBmcmFnbWVudCBmcm9tIHNlbGYncyBmaWVsZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0ZGVsaW1pdGVkKCciJywgJyJccicsIDApCisKKyAgICBkZWYgZ2V0Y29tbWVudChzZWxmKToKKyAgICAgICAgIiIiR2V0IGEgcGFyZW50aGVzaXMtZGVsaW1pdGVkIGZyYWdtZW50IGZyb20gc2VsZidzIGZpZWxkLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXRkZWxpbWl0ZWQoJygnLCAnKVxyJywgMSkKKworICAgIGRlZiBnZXRkb21haW5saXRlcmFsKHNlbGYpOgorICAgICAgICAiIiJQYXJzZSBhbiBSRkMgMjgyMiBkb21haW4tbGl0ZXJhbC4iIiIKKyAgICAgICAgcmV0dXJuICdbJXNdJyAlIHNlbGYuZ2V0ZGVsaW1pdGVkKCdbJywgJ11ccicsIDApCisKKyAgICBkZWYgZ2V0YXRvbShzZWxmLCBhdG9tZW5kcz1Ob25lKToKKyAgICAgICAgIiIiUGFyc2UgYW4gUkZDIDI4MjIgYXRvbS4KKworICAgICAgICBPcHRpb25hbCBhdG9tZW5kcyBzcGVjaWZpZXMgYSBkaWZmZXJlbnQgc2V0IG9mIGVuZCB0b2tlbiBkZWxpbWl0ZXJzCisgICAgICAgICh0aGUgZGVmYXVsdCBpcyB0byB1c2Ugc2VsZi5hdG9tZW5kcykuICBUaGlzIGlzIHVzZWQgZS5nLiBpbgorICAgICAgICBnZXRwaHJhc2VsaXN0KCkgc2luY2UgcGhyYXNlIGVuZGluZ3MgbXVzdCBub3QgaW5jbHVkZSB0aGUgYC4nICh3aGljaAorICAgICAgICBpcyBsZWdhbCBpbiBwaHJhc2VzKS4iIiIKKyAgICAgICAgYXRvbWxpc3QgPSBbJyddCisgICAgICAgIGlmIGF0b21lbmRzIGlzIE5vbmU6CisgICAgICAgICAgICBhdG9tZW5kcyA9IHNlbGYuYXRvbWVuZHMKKworICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIGF0b21lbmRzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOiBhdG9tbGlzdC5hcHBlbmQoc2VsZi5maWVsZFtzZWxmLnBvc10pCisgICAgICAgICAgICBzZWxmLnBvcyArPSAxCisKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oYXRvbWxpc3QpCisKKyAgICBkZWYgZ2V0cGhyYXNlbGlzdChzZWxmKToKKyAgICAgICAgIiIiUGFyc2UgYSBzZXF1ZW5jZSBvZiBSRkMgMjgyMiBwaHJhc2VzLgorCisgICAgICAgIEEgcGhyYXNlIGlzIGEgc2VxdWVuY2Ugb2Ygd29yZHMsIHdoaWNoIGFyZSBpbiB0dXJuIGVpdGhlciBSRkMgMjgyMgorICAgICAgICBhdG9tcyBvciBxdW90ZWQtc3RyaW5ncy4gIFBocmFzZXMgYXJlIGNhbm9uaWNhbGl6ZWQgYnkgc3F1ZWV6aW5nIGFsbAorICAgICAgICBydW5zIG9mIGNvbnRpbnVvdXMgd2hpdGVzcGFjZSBpbnRvIG9uZSBzcGFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBsaXN0ID0gW10KKworICAgICAgICB3aGlsZSBzZWxmLnBvcyA8IGxlbihzZWxmLmZpZWxkKToKKyAgICAgICAgICAgIGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdIGluIHNlbGYuTFdTOgorICAgICAgICAgICAgICAgIHNlbGYucG9zICs9IDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gPT0gJyInOgorICAgICAgICAgICAgICAgIHBsaXN0LmFwcGVuZChzZWxmLmdldHF1b3RlKCkpCisgICAgICAgICAgICBlbGlmIHNlbGYuZmllbGRbc2VsZi5wb3NdID09ICcoJzoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbW1lbnRsaXN0LmFwcGVuZChzZWxmLmdldGNvbW1lbnQoKSkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5maWVsZFtzZWxmLnBvc10gaW4gc2VsZi5waHJhc2VlbmRzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBsaXN0LmFwcGVuZChzZWxmLmdldGF0b20oc2VsZi5waHJhc2VlbmRzKSkKKworICAgICAgICByZXR1cm4gcGxpc3QKKworY2xhc3MgQWRkcmVzc0xpc3QoQWRkcmxpc3RDbGFzcyk6CisgICAgIiIiQW4gQWRkcmVzc0xpc3QgZW5jYXBzdWxhdGVzIGEgbGlzdCBvZiBwYXJzZWQgUkZDIDI4MjIgYWRkcmVzc2VzLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWVsZCk6CisgICAgICAgIEFkZHJsaXN0Q2xhc3MuX19pbml0X18oc2VsZiwgZmllbGQpCisgICAgICAgIGlmIGZpZWxkOgorICAgICAgICAgICAgc2VsZi5hZGRyZXNzbGlzdCA9IHNlbGYuZ2V0YWRkcmxpc3QoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hZGRyZXNzbGlzdCA9IFtdCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmFkZHJlc3NsaXN0KQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiLCAiLmpvaW4obWFwKGR1bXBfYWRkcmVzc19wYWlyLCBzZWxmLmFkZHJlc3NsaXN0KSkKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBTZXQgdW5pb24KKyAgICAgICAgbmV3YWRkciA9IEFkZHJlc3NMaXN0KE5vbmUpCisgICAgICAgIG5ld2FkZHIuYWRkcmVzc2xpc3QgPSBzZWxmLmFkZHJlc3NsaXN0WzpdCisgICAgICAgIGZvciB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgbm90IHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBuZXdhZGRyLmFkZHJlc3NsaXN0LmFwcGVuZCh4KQorICAgICAgICByZXR1cm4gbmV3YWRkcgorCisgICAgZGVmIF9faWFkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBTZXQgdW5pb24sIGluLXBsYWNlCisgICAgICAgIGZvciB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgbm90IHggaW4gc2VsZi5hZGRyZXNzbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZHJlc3NsaXN0LmFwcGVuZCh4KQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAjIFNldCBkaWZmZXJlbmNlCisgICAgICAgIG5ld2FkZHIgPSBBZGRyZXNzTGlzdChOb25lKQorICAgICAgICBmb3IgeCBpbiBzZWxmLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgbm90IHggaW4gb3RoZXIuYWRkcmVzc2xpc3Q6CisgICAgICAgICAgICAgICAgbmV3YWRkci5hZGRyZXNzbGlzdC5hcHBlbmQoeCkKKyAgICAgICAgcmV0dXJuIG5ld2FkZHIKKworICAgIGRlZiBfX2lzdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICMgU2V0IGRpZmZlcmVuY2UsIGluLXBsYWNlCisgICAgICAgIGZvciB4IGluIG90aGVyLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgaWYgeCBpbiBzZWxmLmFkZHJlc3NsaXN0OgorICAgICAgICAgICAgICAgIHNlbGYuYWRkcmVzc2xpc3QucmVtb3ZlKHgpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAjIE1ha2UgaW5kZXhpbmcsIHNsaWNlcywgYW5kICdpbicgd29yaworICAgICAgICByZXR1cm4gc2VsZi5hZGRyZXNzbGlzdFtpbmRleF0KKworZGVmIGR1bXBfYWRkcmVzc19wYWlyKHBhaXIpOgorICAgICIiIkR1bXAgYSAobmFtZSwgYWRkcmVzcykgcGFpciBpbiBhIGNhbm9uaWNhbGl6ZWQgZm9ybS4iIiIKKyAgICBpZiBwYWlyWzBdOgorICAgICAgICByZXR1cm4gJyInICsgcGFpclswXSArICciIDwnICsgcGFpclsxXSArICc+JworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBwYWlyWzFdCisKKyMgUGFyc2UgYSBkYXRlIGZpZWxkCisKK19tb250aG5hbWVzID0gWydqYW4nLCAnZmViJywgJ21hcicsICdhcHInLCAnbWF5JywgJ2p1bicsICdqdWwnLAorICAgICAgICAgICAgICAgJ2F1ZycsICdzZXAnLCAnb2N0JywgJ25vdicsICdkZWMnLAorICAgICAgICAgICAgICAgJ2phbnVhcnknLCAnZmVicnVhcnknLCAnbWFyY2gnLCAnYXByaWwnLCAnbWF5JywgJ2p1bmUnLCAnanVseScsCisgICAgICAgICAgICAgICAnYXVndXN0JywgJ3NlcHRlbWJlcicsICdvY3RvYmVyJywgJ25vdmVtYmVyJywgJ2RlY2VtYmVyJ10KK19kYXluYW1lcyA9IFsnbW9uJywgJ3R1ZScsICd3ZWQnLCAndGh1JywgJ2ZyaScsICdzYXQnLCAnc3VuJ10KKworIyBUaGUgdGltZXpvbmUgdGFibGUgZG9lcyBub3QgaW5jbHVkZSB0aGUgbWlsaXRhcnkgdGltZSB6b25lcyBkZWZpbmVkCisjIGluIFJGQzgyMiwgb3RoZXIgdGhhbiBaLiAgQWNjb3JkaW5nIHRvIFJGQzExMjMsIHRoZSBkZXNjcmlwdGlvbiBpbgorIyBSRkM4MjIgZ2V0cyB0aGUgc2lnbnMgd3JvbmcsIHNvIHdlIGNhbid0IHJlbHkgb24gYW55IHN1Y2ggdGltZQorIyB6b25lcy4gIFJGQzExMjMgcmVjb21tZW5kcyB0aGF0IG51bWVyaWMgdGltZXpvbmUgaW5kaWNhdG9ycyBiZSB1c2VkCisjIGluc3RlYWQgb2YgdGltZXpvbmUgbmFtZXMuCisKK190aW1lem9uZXMgPSB7J1VUJzowLCAnVVRDJzowLCAnR01UJzowLCAnWic6MCwKKyAgICAgICAgICAgICAgJ0FTVCc6IC00MDAsICdBRFQnOiAtMzAwLCAgIyBBdGxhbnRpYyAodXNlZCBpbiBDYW5hZGEpCisgICAgICAgICAgICAgICdFU1QnOiAtNTAwLCAnRURUJzogLTQwMCwgICMgRWFzdGVybgorICAgICAgICAgICAgICAnQ1NUJzogLTYwMCwgJ0NEVCc6IC01MDAsICAjIENlbnRyYWwKKyAgICAgICAgICAgICAgJ01TVCc6IC03MDAsICdNRFQnOiAtNjAwLCAgIyBNb3VudGFpbgorICAgICAgICAgICAgICAnUFNUJzogLTgwMCwgJ1BEVCc6IC03MDAgICAjIFBhY2lmaWMKKyAgICAgICAgICAgICAgfQorCisKK2RlZiBwYXJzZWRhdGVfdHooZGF0YSk6CisgICAgIiIiQ29udmVydCBhIGRhdGUgc3RyaW5nIHRvIGEgdGltZSB0dXBsZS4KKworICAgIEFjY291bnRzIGZvciBtaWxpdGFyeSB0aW1lem9uZXMuCisgICAgIiIiCisgICAgaWYgbm90IGRhdGE6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZGF0YSA9IGRhdGEuc3BsaXQoKQorICAgIGlmIGRhdGFbMF1bLTFdIGluICgnLCcsICcuJykgb3IgZGF0YVswXS5sb3dlcigpIGluIF9kYXluYW1lczoKKyAgICAgICAgIyBUaGVyZSdzIGEgZGF5bmFtZSBoZXJlLiBTa2lwIGl0CisgICAgICAgIGRlbCBkYXRhWzBdCisgICAgZWxzZToKKyAgICAgICAgIyBubyBzcGFjZSBhZnRlciB0aGUgIndlZWtkYXksIj8KKyAgICAgICAgaSA9IGRhdGFbMF0ucmZpbmQoJywnKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICBkYXRhWzBdID0gZGF0YVswXVtpKzE6XQorICAgIGlmIGxlbihkYXRhKSA9PSAzOiAjIFJGQyA4NTAgZGF0ZSwgZGVwcmVjYXRlZAorICAgICAgICBzdHVmZiA9IGRhdGFbMF0uc3BsaXQoJy0nKQorICAgICAgICBpZiBsZW4oc3R1ZmYpID09IDM6CisgICAgICAgICAgICBkYXRhID0gc3R1ZmYgKyBkYXRhWzE6XQorICAgIGlmIGxlbihkYXRhKSA9PSA0OgorICAgICAgICBzID0gZGF0YVszXQorICAgICAgICBpID0gcy5maW5kKCcrJykKKyAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICBkYXRhWzM6XSA9IFtzWzppXSwgc1tpKzE6XV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKCcnKSAjIER1bW15IHR6CisgICAgaWYgbGVuKGRhdGEpIDwgNToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBkYXRhID0gZGF0YVs6NV0KKyAgICBbZGQsIG1tLCB5eSwgdG0sIHR6XSA9IGRhdGEKKyAgICBtbSA9IG1tLmxvd2VyKCkKKyAgICBpZiBub3QgbW0gaW4gX21vbnRobmFtZXM6CisgICAgICAgIGRkLCBtbSA9IG1tLCBkZC5sb3dlcigpCisgICAgICAgIGlmIG5vdCBtbSBpbiBfbW9udGhuYW1lczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgbW0gPSBfbW9udGhuYW1lcy5pbmRleChtbSkrMQorICAgIGlmIG1tID4gMTI6IG1tID0gbW0gLSAxMgorICAgIGlmIGRkWy0xXSA9PSAnLCc6CisgICAgICAgIGRkID0gZGRbOi0xXQorICAgIGkgPSB5eS5maW5kKCc6JykKKyAgICBpZiBpID4gMDoKKyAgICAgICAgeXksIHRtID0gdG0sIHl5CisgICAgaWYgeXlbLTFdID09ICcsJzoKKyAgICAgICAgeXkgPSB5eVs6LTFdCisgICAgaWYgbm90IHl5WzBdLmlzZGlnaXQoKToKKyAgICAgICAgeXksIHR6ID0gdHosIHl5CisgICAgaWYgdG1bLTFdID09ICcsJzoKKyAgICAgICAgdG0gPSB0bVs6LTFdCisgICAgdG0gPSB0bS5zcGxpdCgnOicpCisgICAgaWYgbGVuKHRtKSA9PSAyOgorICAgICAgICBbdGhoLCB0bW1dID0gdG0KKyAgICAgICAgdHNzID0gJzAnCisgICAgZWxpZiBsZW4odG0pID09IDM6CisgICAgICAgIFt0aGgsIHRtbSwgdHNzXSA9IHRtCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0cnk6CisgICAgICAgIHl5ID0gaW50KHl5KQorICAgICAgICBkZCA9IGludChkZCkKKyAgICAgICAgdGhoID0gaW50KHRoaCkKKyAgICAgICAgdG1tID0gaW50KHRtbSkKKyAgICAgICAgdHNzID0gaW50KHRzcykKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICB0em9mZnNldCA9IE5vbmUKKyAgICB0eiA9IHR6LnVwcGVyKCkKKyAgICBpZiB0eiBpbiBfdGltZXpvbmVzOgorICAgICAgICB0em9mZnNldCA9IF90aW1lem9uZXNbdHpdCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHpvZmZzZXQgPSBpbnQodHopCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICMgQ29udmVydCBhIHRpbWV6b25lIG9mZnNldCBpbnRvIHNlY29uZHMgOyAtMDUwMCAtPiAtMTgwMDAKKyAgICBpZiB0em9mZnNldDoKKyAgICAgICAgaWYgdHpvZmZzZXQgPCAwOgorICAgICAgICAgICAgdHpzaWduID0gLTEKKyAgICAgICAgICAgIHR6b2Zmc2V0ID0gLXR6b2Zmc2V0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0enNpZ24gPSAxCisgICAgICAgIHR6b2Zmc2V0ID0gdHpzaWduICogKCAodHpvZmZzZXQvLzEwMCkqMzYwMCArICh0em9mZnNldCAlIDEwMCkqNjApCisgICAgcmV0dXJuICh5eSwgbW0sIGRkLCB0aGgsIHRtbSwgdHNzLCAwLCAxLCAwLCB0em9mZnNldCkKKworCitkZWYgcGFyc2VkYXRlKGRhdGEpOgorICAgICIiIkNvbnZlcnQgYSB0aW1lIHN0cmluZyB0byBhIHRpbWUgdHVwbGUuIiIiCisgICAgdCA9IHBhcnNlZGF0ZV90eihkYXRhKQorICAgIGlmIHQgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIHQKKyAgICByZXR1cm4gdFs6OV0KKworCitkZWYgbWt0aW1lX3R6KGRhdGEpOgorICAgICIiIlR1cm4gYSAxMC10dXBsZSBhcyByZXR1cm5lZCBieSBwYXJzZWRhdGVfdHooKSBpbnRvIGEgVVRDIHRpbWVzdGFtcC4iIiIKKyAgICBpZiBkYXRhWzldIGlzIE5vbmU6CisgICAgICAgICMgTm8gem9uZSBpbmZvLCBzbyBsb2NhbHRpbWUgaXMgYmV0dGVyIGFzc3VtcHRpb24gdGhhbiBHTVQKKyAgICAgICAgcmV0dXJuIHRpbWUubWt0aW1lKGRhdGFbOjhdICsgKC0xLCkpCisgICAgZWxzZToKKyAgICAgICAgdCA9IHRpbWUubWt0aW1lKGRhdGFbOjhdICsgKDAsKSkKKyAgICAgICAgcmV0dXJuIHQgLSBkYXRhWzldIC0gdGltZS50aW1lem9uZQorCitkZWYgZm9ybWF0ZGF0ZSh0aW1ldmFsPU5vbmUpOgorICAgICIiIlJldHVybnMgdGltZSBmb3JtYXQgcHJlZmVycmVkIGZvciBJbnRlcm5ldCBzdGFuZGFyZHMuCisKKyAgICBTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5OjM3IEdNVCAgOyBSRkMgODIyLCB1cGRhdGVkIGJ5IFJGQyAxMTIzCisKKyAgICBBY2NvcmRpbmcgdG8gUkZDIDExMjMsIGRheSBhbmQgbW9udGggbmFtZXMgbXVzdCBhbHdheXMgYmUgaW4KKyAgICBFbmdsaXNoLiAgSWYgbm90IGZvciB0aGF0LCB0aGlzIGNvZGUgY291bGQgdXNlIHN0cmZ0aW1lKCkuICBJdAorICAgIGNhbid0IGJlY2F1c2Ugc3RyZnRpbWUoKSBob25vcnMgdGhlIGxvY2FsZSBhbmQgY291bGQgZ2VuZXJhdGVkCisgICAgbm9uLUVuZ2xpc2ggbmFtZXMuCisgICAgIiIiCisgICAgaWYgdGltZXZhbCBpcyBOb25lOgorICAgICAgICB0aW1ldmFsID0gdGltZS50aW1lKCkKKyAgICB0aW1ldmFsID0gdGltZS5nbXRpbWUodGltZXZhbCkKKyAgICByZXR1cm4gIiVzLCAlMDJkICVzICUwNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlICgKKyAgICAgICAgICAgICgiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiLCAiU3VuIilbdGltZXZhbFs2XV0sCisgICAgICAgICAgICB0aW1ldmFsWzJdLAorICAgICAgICAgICAgKCJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsCisgICAgICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIilbdGltZXZhbFsxXS0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhbFswXSwgdGltZXZhbFszXSwgdGltZXZhbFs0XSwgdGltZXZhbFs1XSkKKworCisjIFdoZW4gdXNlZCBhcyBzY3JpcHQsIHJ1biBhIHNtYWxsIHRlc3QgcHJvZ3JhbS4KKyMgVGhlIGZpcnN0IGNvbW1hbmQgbGluZSBhcmd1bWVudCBtdXN0IGJlIGEgZmlsZW5hbWUgY29udGFpbmluZyBvbmUKKyMgbWVzc2FnZSBpbiBSRkMtODIyIGZvcm1hdC4KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgc3lzLCBvcworICAgIGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsnSE9NRSddLCAnTWFpbC9pbmJveC8xJykKKyAgICBpZiBzeXMuYXJndlsxOl06IGZpbGUgPSBzeXMuYXJndlsxXQorICAgIGYgPSBvcGVuKGZpbGUsICdyJykKKyAgICBtID0gTWVzc2FnZShmKQorICAgIHByaW50ICdGcm9tOicsIG0uZ2V0YWRkcignZnJvbScpCisgICAgcHJpbnQgJ1RvOicsIG0uZ2V0YWRkcmxpc3QoJ3RvJykKKyAgICBwcmludCAnU3ViamVjdDonLCBtLmdldGhlYWRlcignc3ViamVjdCcpCisgICAgcHJpbnQgJ0RhdGU6JywgbS5nZXRoZWFkZXIoJ2RhdGUnKQorICAgIGRhdGUgPSBtLmdldGRhdGVfdHooJ2RhdGUnKQorICAgIHR6ID0gZGF0ZVstMV0KKyAgICBkYXRlID0gdGltZS5sb2NhbHRpbWUobWt0aW1lX3R6KGRhdGUpKQorICAgIGlmIGRhdGU6CisgICAgICAgIHByaW50ICdQYXJzZWREYXRlOicsIHRpbWUuYXNjdGltZShkYXRlKSwKKyAgICAgICAgaGhtbXNzID0gdHoKKyAgICAgICAgaGhtbSwgc3MgPSBkaXZtb2QoaGhtbXNzLCA2MCkKKyAgICAgICAgaGgsIG1tID0gZGl2bW9kKGhobW0sIDYwKQorICAgICAgICBwcmludCAiJSswM2QlMDJkIiAlIChoaCwgbW0pLAorICAgICAgICBpZiBzczogcHJpbnQgIi4lMDJkIiAlIHNzLAorICAgICAgICBwcmludAorICAgIGVsc2U6CisgICAgICAgIHByaW50ICdQYXJzZWREYXRlOicsIE5vbmUKKyAgICBtLnJld2luZGJvZHkoKQorICAgIG4gPSAwCisgICAgd2hpbGUgZi5yZWFkbGluZSgpOgorICAgICAgICBuICs9IDEKKyAgICBwcmludCAnTGluZXM6JywgbgorICAgIHByaW50ICctJyo3MAorICAgIHByaW50ICdsZW4gPScsIGxlbihtKQorICAgIGlmICdEYXRlJyBpbiBtOiBwcmludCAnRGF0ZSA9JywgbVsnRGF0ZSddCisgICAgaWYgJ1gtTm9uc2Vuc2UnIGluIG06IHBhc3MKKyAgICBwcmludCAna2V5cyA9JywgbS5rZXlzKCkKKyAgICBwcmludCAndmFsdWVzID0nLCBtLnZhbHVlcygpCisgICAgcHJpbnQgJ2l0ZW1zID0nLCBtLml0ZW1zKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmZjODIyLnB5YyBiL2xpYi9weXRob24yLjcvcmZjODIyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjhmZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZmM4MjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmZjODIyLnB5byBiL2xpYi9weXRob24yLjcvcmZjODIyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjhmZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9yZmM4MjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmxjb21wbGV0ZXIucHkgYi9saWIvcHl0aG9uMi43L3JsY29tcGxldGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NmM1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JsY29tcGxldGVyLnB5CkBAIC0wLDAgKzEsMTY2IEBACisiIiJXb3JkIGNvbXBsZXRpb24gZm9yIEdOVSByZWFkbGluZS4KKworVGhlIGNvbXBsZXRlciBjb21wbGV0ZXMga2V5d29yZHMsIGJ1aWx0LWlucyBhbmQgZ2xvYmFscyBpbiBhIHNlbGVjdGFibGUKK25hbWVzcGFjZSAod2hpY2ggZGVmYXVsdHMgdG8gX19tYWluX18pOyB3aGVuIGNvbXBsZXRpbmcgTkFNRS5OQU1FLi4uLCBpdAorZXZhbHVhdGVzICghKSB0aGUgZXhwcmVzc2lvbiB1cCB0byB0aGUgbGFzdCBkb3QgYW5kIGNvbXBsZXRlcyBpdHMgYXR0cmlidXRlcy4KKworSXQncyB2ZXJ5IGNvb2wgdG8gZG8gImltcG9ydCBzeXMiIHR5cGUgInN5cy4iLCBoaXQgdGhlIGNvbXBsZXRpb24ga2V5ICh0d2ljZSksCithbmQgc2VlIHRoZSBsaXN0IG9mIG5hbWVzIGRlZmluZWQgYnkgdGhlIHN5cyBtb2R1bGUhCisKK1RpcDogdG8gdXNlIHRoZSB0YWIga2V5IGFzIHRoZSBjb21wbGV0aW9uIGtleSwgY2FsbAorCisgICAgcmVhZGxpbmUucGFyc2VfYW5kX2JpbmQoInRhYjogY29tcGxldGUiKQorCitOb3RlczoKKworLSBFeGNlcHRpb25zIHJhaXNlZCBieSB0aGUgY29tcGxldGVyIGZ1bmN0aW9uIGFyZSAqaWdub3JlZCogKGFuZCBnZW5lcmFsbHkgY2F1c2UKKyAgdGhlIGNvbXBsZXRpb24gdG8gZmFpbCkuICBUaGlzIGlzIGEgZmVhdHVyZSAtLSBzaW5jZSByZWFkbGluZSBzZXRzIHRoZSB0dHkKKyAgZGV2aWNlIGluIHJhdyAob3IgY2JyZWFrKSBtb2RlLCBwcmludGluZyBhIHRyYWNlYmFjayB3b3VsZG4ndCB3b3JrIHdlbGwKKyAgd2l0aG91dCBzb21lIGNvbXBsaWNhdGVkIGhvb3BsYSB0byBzYXZlLCByZXNldCBhbmQgcmVzdG9yZSB0aGUgdHR5IHN0YXRlLgorCistIFRoZSBldmFsdWF0aW9uIG9mIHRoZSBOQU1FLk5BTUUuLi4gZm9ybSBtYXkgY2F1c2UgYXJiaXRyYXJ5IGFwcGxpY2F0aW9uCisgIGRlZmluZWQgY29kZSB0byBiZSBleGVjdXRlZCBpZiBhbiBvYmplY3Qgd2l0aCBhIF9fZ2V0YXR0cl9fIGhvb2sgaXMgZm91bmQuCisgIFNpbmNlIGl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYXBwbGljYXRpb24gKG9yIHRoZSB1c2VyKSB0byBlbmFibGUgdGhpcworICBmZWF0dXJlLCBJIGNvbnNpZGVyIHRoaXMgYW4gYWNjZXB0YWJsZSByaXNrLiAgTW9yZSBjb21wbGljYXRlZCBleHByZXNzaW9ucworICAoZS5nLiBmdW5jdGlvbiBjYWxscyBvciBpbmRleGluZyBvcGVyYXRpb25zKSBhcmUgKm5vdCogZXZhbHVhdGVkLgorCistIEdOVSByZWFkbGluZSBpcyBhbHNvIHVzZWQgYnkgdGhlIGJ1aWx0LWluIGZ1bmN0aW9ucyBpbnB1dCgpIGFuZAorcmF3X2lucHV0KCksIGFuZCB0aHVzIHRoZXNlIGFsc28gYmVuZWZpdC9zdWZmZXIgZnJvbSB0aGUgY29tcGxldGVyCitmZWF0dXJlcy4gIENsZWFybHkgYW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb24gY2FuIGJlbmVmaXQgYnkKK3NwZWNpZnlpbmcgaXRzIG93biBjb21wbGV0ZXIgZnVuY3Rpb24gYW5kIHVzaW5nIHJhd19pbnB1dCgpIGZvciBhbGwKK2l0cyBpbnB1dC4KKworLSBXaGVuIHRoZSBvcmlnaW5hbCBzdGRpbiBpcyBub3QgYSB0dHkgZGV2aWNlLCBHTlUgcmVhZGxpbmUgaXMgbmV2ZXIKKyAgdXNlZCwgYW5kIHRoaXMgbW9kdWxlIChhbmQgdGhlIHJlYWRsaW5lIG1vZHVsZSkgYXJlIHNpbGVudGx5IGluYWN0aXZlLgorCisiIiIKKworaW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgX19tYWluX18KKworX19hbGxfXyA9IFsiQ29tcGxldGVyIl0KKworY2xhc3MgQ29tcGxldGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2UgPSBOb25lKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IGNvbXBsZXRlciBmb3IgdGhlIGNvbW1hbmQgbGluZS4KKworICAgICAgICBDb21wbGV0ZXIoW25hbWVzcGFjZV0pIC0+IGNvbXBsZXRlciBpbnN0YW5jZS4KKworICAgICAgICBJZiB1bnNwZWNpZmllZCwgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHdoZXJlIGNvbXBsZXRpb25zIGFyZSBwZXJmb3JtZWQKKyAgICAgICAgaXMgX19tYWluX18gKHRlY2huaWNhbGx5LCBfX21haW5fXy5fX2RpY3RfXykuIE5hbWVzcGFjZXMgc2hvdWxkIGJlCisgICAgICAgIGdpdmVuIGFzIGRpY3Rpb25hcmllcy4KKworICAgICAgICBDb21wbGV0ZXIgaW5zdGFuY2VzIHNob3VsZCBiZSB1c2VkIGFzIHRoZSBjb21wbGV0aW9uIG1lY2hhbmlzbSBvZgorICAgICAgICByZWFkbGluZSB2aWEgdGhlIHNldF9jb21wbGV0ZXIoKSBjYWxsOgorCisgICAgICAgIHJlYWRsaW5lLnNldF9jb21wbGV0ZXIoQ29tcGxldGVyKG15X25hbWVzcGFjZSkuY29tcGxldGUpCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5hbWVzcGFjZSBhbmQgbm90IGlzaW5zdGFuY2UobmFtZXNwYWNlLCBkaWN0KToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwnbmFtZXNwYWNlIG11c3QgYmUgYSBkaWN0aW9uYXJ5JworCisgICAgICAgICMgRG9uJ3QgYmluZCB0byBuYW1lc3BhY2UgcXVpdGUgeWV0LCBidXQgZmxhZyB3aGV0aGVyIHRoZSB1c2VyIHdhbnRzIGEKKyAgICAgICAgIyBzcGVjaWZpYyBuYW1lc3BhY2Ugb3IgdG8gdXNlIF9fbWFpbl9fLl9fZGljdF9fLiBUaGlzIHdpbGwgYWxsb3cgdXMKKyAgICAgICAgIyB0byBiaW5kIHRvIF9fbWFpbl9fLl9fZGljdF9fIGF0IGNvbXBsZXRpb24gdGltZSwgbm90IG5vdy4KKyAgICAgICAgaWYgbmFtZXNwYWNlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnVzZV9tYWluX25zID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi51c2VfbWFpbl9ucyA9IDAKKyAgICAgICAgICAgIHNlbGYubmFtZXNwYWNlID0gbmFtZXNwYWNlCisKKyAgICBkZWYgY29tcGxldGUoc2VsZiwgdGV4dCwgc3RhdGUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgcG9zc2libGUgY29tcGxldGlvbiBmb3IgJ3RleHQnLgorCisgICAgICAgIFRoaXMgaXMgY2FsbGVkIHN1Y2Nlc3NpdmVseSB3aXRoIHN0YXRlID09IDAsIDEsIDIsIC4uLiB1bnRpbCBpdAorICAgICAgICByZXR1cm5zIE5vbmUuICBUaGUgY29tcGxldGlvbiBzaG91bGQgYmVnaW4gd2l0aCAndGV4dCcuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudXNlX21haW5fbnM6CisgICAgICAgICAgICBzZWxmLm5hbWVzcGFjZSA9IF9fbWFpbl9fLl9fZGljdF9fCisKKyAgICAgICAgaWYgc3RhdGUgPT0gMDoKKyAgICAgICAgICAgIGlmICIuIiBpbiB0ZXh0OgorICAgICAgICAgICAgICAgIHNlbGYubWF0Y2hlcyA9IHNlbGYuYXR0cl9tYXRjaGVzKHRleHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubWF0Y2hlcyA9IHNlbGYuZ2xvYmFsX21hdGNoZXModGV4dCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubWF0Y2hlc1tzdGF0ZV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9jYWxsYWJsZV9wb3N0Zml4KHNlbGYsIHZhbCwgd29yZCk6CisgICAgICAgIGlmIGhhc2F0dHIodmFsLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgIHdvcmQgPSB3b3JkICsgIigiCisgICAgICAgIHJldHVybiB3b3JkCisKKyAgICBkZWYgZ2xvYmFsX21hdGNoZXMoc2VsZiwgdGV4dCk6CisgICAgICAgICIiIkNvbXB1dGUgbWF0Y2hlcyB3aGVuIHRleHQgaXMgYSBzaW1wbGUgbmFtZS4KKworICAgICAgICBSZXR1cm4gYSBsaXN0IG9mIGFsbCBrZXl3b3JkcywgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBuYW1lcyBjdXJyZW50bHkKKyAgICAgICAgZGVmaW5lZCBpbiBzZWxmLm5hbWVzcGFjZSB0aGF0IG1hdGNoLgorCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQga2V5d29yZAorICAgICAgICBtYXRjaGVzID0gW10KKyAgICAgICAgbiA9IGxlbih0ZXh0KQorICAgICAgICBmb3Igd29yZCBpbiBrZXl3b3JkLmt3bGlzdDoKKyAgICAgICAgICAgIGlmIHdvcmRbOm5dID09IHRleHQ6CisgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQod29yZCkKKyAgICAgICAgZm9yIG5zcGFjZSBpbiBbX19idWlsdGluX18uX19kaWN0X18sIHNlbGYubmFtZXNwYWNlXToKKyAgICAgICAgICAgIGZvciB3b3JkLCB2YWwgaW4gbnNwYWNlLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gdGV4dCBhbmQgd29yZCAhPSAiX19idWlsdGluc19fIjoKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5hcHBlbmQoc2VsZi5fY2FsbGFibGVfcG9zdGZpeCh2YWwsIHdvcmQpKQorICAgICAgICByZXR1cm4gbWF0Y2hlcworCisgICAgZGVmIGF0dHJfbWF0Y2hlcyhzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiQ29tcHV0ZSBtYXRjaGVzIHdoZW4gdGV4dCBjb250YWlucyBhIGRvdC4KKworICAgICAgICBBc3N1bWluZyB0aGUgdGV4dCBpcyBvZiB0aGUgZm9ybSBOQU1FLk5BTUUuLi4uW05BTUVdLCBhbmQgaXMKKyAgICAgICAgZXZhbHVhdGFibGUgaW4gc2VsZi5uYW1lc3BhY2UsIGl0IHdpbGwgYmUgZXZhbHVhdGVkIGFuZCBpdHMgYXR0cmlidXRlcworICAgICAgICAoYXMgcmV2ZWFsZWQgYnkgZGlyKCkpIGFyZSB1c2VkIGFzIHBvc3NpYmxlIGNvbXBsZXRpb25zLiAgKEZvciBjbGFzcworICAgICAgICBpbnN0YW5jZXMsIGNsYXNzIG1lbWJlcnMgYXJlIGFsc28gY29uc2lkZXJlZC4pCisKKyAgICAgICAgV0FSTklORzogdGhpcyBjYW4gc3RpbGwgaW52b2tlIGFyYml0cmFyeSBDIGNvZGUsIGlmIGFuIG9iamVjdAorICAgICAgICB3aXRoIGEgX19nZXRhdHRyX18gaG9vayBpcyBldmFsdWF0ZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCByZQorICAgICAgICBtID0gcmUubWF0Y2gociIoXHcrKFwuXHcrKSopXC4oXHcqKSIsIHRleHQpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGV4cHIsIGF0dHIgPSBtLmdyb3VwKDEsIDMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRoaXNvYmplY3QgPSBldmFsKGV4cHIsIHNlbGYubmFtZXNwYWNlKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgIyBnZXQgdGhlIGNvbnRlbnQgb2YgdGhlIG9iamVjdCwgZXhjZXB0IF9fYnVpbHRpbnNfXworICAgICAgICB3b3JkcyA9IGRpcih0aGlzb2JqZWN0KQorICAgICAgICBpZiAiX19idWlsdGluc19fIiBpbiB3b3JkczoKKyAgICAgICAgICAgIHdvcmRzLnJlbW92ZSgiX19idWlsdGluc19fIikKKworICAgICAgICBpZiBoYXNhdHRyKHRoaXNvYmplY3QsICdfX2NsYXNzX18nKToKKyAgICAgICAgICAgIHdvcmRzLmFwcGVuZCgnX19jbGFzc19fJykKKyAgICAgICAgICAgIHdvcmRzLmV4dGVuZChnZXRfY2xhc3NfbWVtYmVycyh0aGlzb2JqZWN0Ll9fY2xhc3NfXykpCisgICAgICAgIG1hdGNoZXMgPSBbXQorICAgICAgICBuID0gbGVuKGF0dHIpCisgICAgICAgIGZvciB3b3JkIGluIHdvcmRzOgorICAgICAgICAgICAgaWYgd29yZFs6bl0gPT0gYXR0ciBhbmQgaGFzYXR0cih0aGlzb2JqZWN0LCB3b3JkKToKKyAgICAgICAgICAgICAgICB2YWwgPSBnZXRhdHRyKHRoaXNvYmplY3QsIHdvcmQpCisgICAgICAgICAgICAgICAgd29yZCA9IHNlbGYuX2NhbGxhYmxlX3Bvc3RmaXgodmFsLCAiJXMuJXMiICUgKGV4cHIsIHdvcmQpKQorICAgICAgICAgICAgICAgIG1hdGNoZXMuYXBwZW5kKHdvcmQpCisgICAgICAgIHJldHVybiBtYXRjaGVzCisKK2RlZiBnZXRfY2xhc3NfbWVtYmVycyhrbGFzcyk6CisgICAgcmV0ID0gZGlyKGtsYXNzKQorICAgIGlmIGhhc2F0dHIoa2xhc3MsJ19fYmFzZXNfXycpOgorICAgICAgICBmb3IgYmFzZSBpbiBrbGFzcy5fX2Jhc2VzX186CisgICAgICAgICAgICByZXQgPSByZXQgKyBnZXRfY2xhc3NfbWVtYmVycyhiYXNlKQorICAgIHJldHVybiByZXQKKwordHJ5OgorICAgIGltcG9ydCByZWFkbGluZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgcmVhZGxpbmUuc2V0X2NvbXBsZXRlcihDb21wbGV0ZXIoKS5jb21wbGV0ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmxjb21wbGV0ZXIucHljIGIvbGliL3B5dGhvbjIuNy9ybGNvbXBsZXRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3ZjI1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmxjb21wbGV0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcmxjb21wbGV0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy9ybGNvbXBsZXRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ3ZjI1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcmxjb21wbGV0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcm9ib3RwYXJzZXIucHkgYi9saWIvcHl0aG9uMi43L3JvYm90cGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MjI4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3JvYm90cGFyc2VyLnB5CkBAIC0wLDAgKzEsMjIyIEBACisiIiIgcm9ib3RwYXJzZXIucHkKKworICAgIENvcHlyaWdodCAoQykgMjAwMCAgQmFzdGlhbiBLbGVpbmVpZGFtCisKKyAgICBZb3UgY2FuIGNob29zZSBiZXR3ZWVuIHR3byBsaWNlbnNlcyB3aGVuIHVzaW5nIHRoaXMgcGFja2FnZToKKyAgICAxKSBHTlUgR1BMdjIKKyAgICAyKSBQU0YgbGljZW5zZSBmb3IgUHl0aG9uIDIuMgorCisgICAgVGhlIHJvYm90cy50eHQgRXhjbHVzaW9uIFByb3RvY29sIGlzIGltcGxlbWVudGVkIGFzIHNwZWNpZmllZCBpbgorICAgIGh0dHA6Ly9pbmZvLndlYmNyYXdsZXIuY29tL21hay9wcm9qZWN0cy9yb2JvdHMvbm9yb2JvdHMtcmZjLmh0bWwKKyIiIgoraW1wb3J0IHVybHBhcnNlCitpbXBvcnQgdXJsbGliCisKK19fYWxsX18gPSBbIlJvYm90RmlsZVBhcnNlciJdCisKKworY2xhc3MgUm9ib3RGaWxlUGFyc2VyOgorICAgICIiIiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc2V0IG9mIG1ldGhvZHMgdG8gcmVhZCwgcGFyc2UgYW5kIGFuc3dlcgorICAgIHF1ZXN0aW9ucyBhYm91dCBhIHNpbmdsZSByb2JvdHMudHh0IGZpbGUuCisKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmw9JycpOgorICAgICAgICBzZWxmLmVudHJpZXMgPSBbXQorICAgICAgICBzZWxmLmRlZmF1bHRfZW50cnkgPSBOb25lCisgICAgICAgIHNlbGYuZGlzYWxsb3dfYWxsID0gRmFsc2UKKyAgICAgICAgc2VsZi5hbGxvd19hbGwgPSBGYWxzZQorICAgICAgICBzZWxmLnNldF91cmwodXJsKQorICAgICAgICBzZWxmLmxhc3RfY2hlY2tlZCA9IDAKKworICAgIGRlZiBtdGltZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgdGltZSB0aGUgcm9ib3RzLnR4dCBmaWxlIHdhcyBsYXN0IGZldGNoZWQuCisKKyAgICAgICAgVGhpcyBpcyB1c2VmdWwgZm9yIGxvbmctcnVubmluZyB3ZWIgc3BpZGVycyB0aGF0IG5lZWQgdG8KKyAgICAgICAgY2hlY2sgZm9yIG5ldyByb2JvdHMudHh0IGZpbGVzIHBlcmlvZGljYWxseS4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYubGFzdF9jaGVja2VkCisKKyAgICBkZWYgbW9kaWZpZWQoc2VsZik6CisgICAgICAgICIiIlNldHMgdGhlIHRpbWUgdGhlIHJvYm90cy50eHQgZmlsZSB3YXMgbGFzdCBmZXRjaGVkIHRvIHRoZQorICAgICAgICBjdXJyZW50IHRpbWUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHNlbGYubGFzdF9jaGVja2VkID0gdGltZS50aW1lKCkKKworICAgIGRlZiBzZXRfdXJsKHNlbGYsIHVybCk6CisgICAgICAgICIiIlNldHMgdGhlIFVSTCByZWZlcnJpbmcgdG8gYSByb2JvdHMudHh0IGZpbGUuIiIiCisgICAgICAgIHNlbGYudXJsID0gdXJsCisgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wYXRoID0gdXJscGFyc2UudXJscGFyc2UodXJsKVsxOjNdCisKKyAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgIiIiUmVhZHMgdGhlIHJvYm90cy50eHQgVVJMIGFuZCBmZWVkcyBpdCB0byB0aGUgcGFyc2VyLiIiIgorICAgICAgICBvcGVuZXIgPSBVUkxvcGVuZXIoKQorICAgICAgICBmID0gb3BlbmVyLm9wZW4oc2VsZi51cmwpCisgICAgICAgIGxpbmVzID0gW2xpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBmXQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5lcnJjb2RlID0gb3BlbmVyLmVycmNvZGUKKyAgICAgICAgaWYgc2VsZi5lcnJjb2RlIGluICg0MDEsIDQwMyk6CisgICAgICAgICAgICBzZWxmLmRpc2FsbG93X2FsbCA9IFRydWUKKyAgICAgICAgZWxpZiBzZWxmLmVycmNvZGUgPj0gNDAwOgorICAgICAgICAgICAgc2VsZi5hbGxvd19hbGwgPSBUcnVlCisgICAgICAgIGVsaWYgc2VsZi5lcnJjb2RlID09IDIwMCBhbmQgbGluZXM6CisgICAgICAgICAgICBzZWxmLnBhcnNlKGxpbmVzKQorCisgICAgZGVmIF9hZGRfZW50cnkoc2VsZiwgZW50cnkpOgorICAgICAgICBpZiAiKiIgaW4gZW50cnkudXNlcmFnZW50czoKKyAgICAgICAgICAgICMgdGhlIGRlZmF1bHQgZW50cnkgaXMgY29uc2lkZXJlZCBsYXN0CisgICAgICAgICAgICBpZiBzZWxmLmRlZmF1bHRfZW50cnkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAjIHRoZSBmaXJzdCBkZWZhdWx0IGVudHJ5IHdpbnMKKyAgICAgICAgICAgICAgICBzZWxmLmRlZmF1bHRfZW50cnkgPSBlbnRyeQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5lbnRyaWVzLmFwcGVuZChlbnRyeSkKKworICAgIGRlZiBwYXJzZShzZWxmLCBsaW5lcyk6CisgICAgICAgICIiInBhcnNlIHRoZSBpbnB1dCBsaW5lcyBmcm9tIGEgcm9ib3RzLnR4dCBmaWxlLgorICAgICAgICAgICBXZSBhbGxvdyB0aGF0IGEgdXNlci1hZ2VudDogbGluZSBpcyBub3QgcHJlY2VkZWQgYnkKKyAgICAgICAgICAgb25lIG9yIG1vcmUgYmxhbmsgbGluZXMuIiIiCisgICAgICAgICMgc3RhdGVzOgorICAgICAgICAjICAgMDogc3RhcnQgc3RhdGUKKyAgICAgICAgIyAgIDE6IHNhdyB1c2VyLWFnZW50IGxpbmUKKyAgICAgICAgIyAgIDI6IHNhdyBhbiBhbGxvdyBvciBkaXNhbGxvdyBsaW5lCisgICAgICAgIHN0YXRlID0gMAorICAgICAgICBsaW5lbnVtYmVyID0gMAorICAgICAgICBlbnRyeSA9IEVudHJ5KCkKKworICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGxpbmVudW1iZXIgKz0gMQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgaWYgc3RhdGUgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBFbnRyeSgpCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMAorICAgICAgICAgICAgICAgIGVsaWYgc3RhdGUgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2VudHJ5KGVudHJ5KQorICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IEVudHJ5KCkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAwCisgICAgICAgICAgICAjIHJlbW92ZSBvcHRpb25hbCBjb21tZW50IGFuZCBzdHJpcCBsaW5lCisgICAgICAgICAgICBpID0gbGluZS5maW5kKCcjJykKKyAgICAgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgICAgICBsaW5lID0gbGluZVs6aV0KKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsaW5lID0gbGluZS5zcGxpdCgnOicsIDEpCisgICAgICAgICAgICBpZiBsZW4obGluZSkgPT0gMjoKKyAgICAgICAgICAgICAgICBsaW5lWzBdID0gbGluZVswXS5zdHJpcCgpLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBsaW5lWzFdID0gdXJsbGliLnVucXVvdGUobGluZVsxXS5zdHJpcCgpKQorICAgICAgICAgICAgICAgIGlmIGxpbmVbMF0gPT0gInVzZXItYWdlbnQiOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSA9PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2VudHJ5KGVudHJ5KQorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSBFbnRyeSgpCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LnVzZXJhZ2VudHMuYXBwZW5kKGxpbmVbMV0pCisgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMQorICAgICAgICAgICAgICAgIGVsaWYgbGluZVswXSA9PSAiZGlzYWxsb3ciOgorICAgICAgICAgICAgICAgICAgICBpZiBzdGF0ZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkucnVsZWxpbmVzLmFwcGVuZChSdWxlTGluZShsaW5lWzFdLCBGYWxzZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbMF0gPT0gImFsbG93IjoKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhdGUgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnJ1bGVsaW5lcy5hcHBlbmQoUnVsZUxpbmUobGluZVsxXSwgVHJ1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDIKKyAgICAgICAgaWYgc3RhdGUgPT0gMjoKKyAgICAgICAgICAgIHNlbGYuX2FkZF9lbnRyeShlbnRyeSkKKworCisgICAgZGVmIGNhbl9mZXRjaChzZWxmLCB1c2VyYWdlbnQsIHVybCk6CisgICAgICAgICIiInVzaW5nIHRoZSBwYXJzZWQgcm9ib3RzLnR4dCBkZWNpZGUgaWYgdXNlcmFnZW50IGNhbiBmZXRjaCB1cmwiIiIKKyAgICAgICAgaWYgc2VsZi5kaXNhbGxvd19hbGw6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5hbGxvd19hbGw6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAjIHNlYXJjaCBmb3IgZ2l2ZW4gdXNlciBhZ2VudCBtYXRjaGVzCisgICAgICAgICMgdGhlIGZpcnN0IG1hdGNoIGNvdW50cworICAgICAgICBwYXJzZWRfdXJsID0gdXJscGFyc2UudXJscGFyc2UodXJsbGliLnVucXVvdGUodXJsKSkKKyAgICAgICAgdXJsID0gdXJscGFyc2UudXJsdW5wYXJzZSgoJycsICcnLCBwYXJzZWRfdXJsLnBhdGgsCisgICAgICAgICAgICBwYXJzZWRfdXJsLnBhcmFtcywgcGFyc2VkX3VybC5xdWVyeSwgcGFyc2VkX3VybC5mcmFnbWVudCkpCisgICAgICAgIHVybCA9IHVybGxpYi5xdW90ZSh1cmwpCisgICAgICAgIGlmIG5vdCB1cmw6CisgICAgICAgICAgICB1cmwgPSAiLyIKKyAgICAgICAgZm9yIGVudHJ5IGluIHNlbGYuZW50cmllczoKKyAgICAgICAgICAgIGlmIGVudHJ5LmFwcGxpZXNfdG8odXNlcmFnZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuYWxsb3dhbmNlKHVybCkKKyAgICAgICAgIyB0cnkgdGhlIGRlZmF1bHQgZW50cnkgbGFzdAorICAgICAgICBpZiBzZWxmLmRlZmF1bHRfZW50cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0X2VudHJ5LmFsbG93YW5jZSh1cmwpCisgICAgICAgICMgYWdlbnQgbm90IGZvdW5kID09PiBhY2Nlc3MgZ3JhbnRlZAorICAgICAgICByZXR1cm4gVHJ1ZQorCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICcnLmpvaW4oW3N0cihlbnRyeSkgKyAiXG4iIGZvciBlbnRyeSBpbiBzZWxmLmVudHJpZXNdKQorCisKK2NsYXNzIFJ1bGVMaW5lOgorICAgICIiIkEgcnVsZSBsaW5lIGlzIGEgc2luZ2xlICJBbGxvdzoiIChhbGxvd2FuY2U9PVRydWUpIG9yICJEaXNhbGxvdzoiCisgICAgICAgKGFsbG93YW5jZT09RmFsc2UpIGZvbGxvd2VkIGJ5IGEgcGF0aC4iIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgYWxsb3dhbmNlKToKKyAgICAgICAgaWYgcGF0aCA9PSAnJyBhbmQgbm90IGFsbG93YW5jZToKKyAgICAgICAgICAgICMgYW4gZW1wdHkgdmFsdWUgbWVhbnMgYWxsb3cgYWxsCisgICAgICAgICAgICBhbGxvd2FuY2UgPSBUcnVlCisgICAgICAgIHNlbGYucGF0aCA9IHVybGxpYi5xdW90ZShwYXRoKQorICAgICAgICBzZWxmLmFsbG93YW5jZSA9IGFsbG93YW5jZQorCisgICAgZGVmIGFwcGxpZXNfdG8oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5wYXRoID09ICIqIiBvciBmaWxlbmFtZS5zdGFydHN3aXRoKHNlbGYucGF0aCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuYWxsb3dhbmNlIGFuZCAiQWxsb3ciIG9yICJEaXNhbGxvdyIpICsgIjogIiArIHNlbGYucGF0aAorCisKK2NsYXNzIEVudHJ5OgorICAgICIiIkFuIGVudHJ5IGhhcyBvbmUgb3IgbW9yZSB1c2VyLWFnZW50cyBhbmQgemVybyBvciBtb3JlIHJ1bGVsaW5lcyIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi51c2VyYWdlbnRzID0gW10KKyAgICAgICAgc2VsZi5ydWxlbGluZXMgPSBbXQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldCA9IFtdCisgICAgICAgIGZvciBhZ2VudCBpbiBzZWxmLnVzZXJhZ2VudHM6CisgICAgICAgICAgICByZXQuZXh0ZW5kKFsiVXNlci1hZ2VudDogIiwgYWdlbnQsICJcbiJdKQorICAgICAgICBmb3IgbGluZSBpbiBzZWxmLnJ1bGVsaW5lczoKKyAgICAgICAgICAgIHJldC5leHRlbmQoW3N0cihsaW5lKSwgIlxuIl0pCisgICAgICAgIHJldHVybiAnJy5qb2luKHJldCkKKworICAgIGRlZiBhcHBsaWVzX3RvKHNlbGYsIHVzZXJhZ2VudCk6CisgICAgICAgICIiImNoZWNrIGlmIHRoaXMgZW50cnkgYXBwbGllcyB0byB0aGUgc3BlY2lmaWVkIGFnZW50IiIiCisgICAgICAgICMgc3BsaXQgdGhlIG5hbWUgdG9rZW4gYW5kIG1ha2UgaXQgbG93ZXIgY2FzZQorICAgICAgICB1c2VyYWdlbnQgPSB1c2VyYWdlbnQuc3BsaXQoIi8iKVswXS5sb3dlcigpCisgICAgICAgIGZvciBhZ2VudCBpbiBzZWxmLnVzZXJhZ2VudHM6CisgICAgICAgICAgICBpZiBhZ2VudCA9PSAnKic6CisgICAgICAgICAgICAgICAgIyB3ZSBoYXZlIHRoZSBjYXRjaC1hbGwgYWdlbnQKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgYWdlbnQgPSBhZ2VudC5sb3dlcigpCisgICAgICAgICAgICBpZiBhZ2VudCBpbiB1c2VyYWdlbnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgYWxsb3dhbmNlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiUHJlY29uZGl0aW9uczoKKyAgICAgICAgLSBvdXIgYWdlbnQgYXBwbGllcyB0byB0aGlzIGVudHJ5CisgICAgICAgIC0gZmlsZW5hbWUgaXMgVVJMIGRlY29kZWQiIiIKKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5ydWxlbGluZXM6CisgICAgICAgICAgICBpZiBsaW5lLmFwcGxpZXNfdG8oZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lLmFsbG93YW5jZQorICAgICAgICByZXR1cm4gVHJ1ZQorCitjbGFzcyBVUkxvcGVuZXIodXJsbGliLkZhbmN5VVJMb3BlbmVyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICB1cmxsaWIuRmFuY3lVUkxvcGVuZXIuX19pbml0X18oc2VsZiwgKmFyZ3MpCisgICAgICAgIHNlbGYuZXJyY29kZSA9IDIwMAorCisgICAgZGVmIHByb21wdF91c2VyX3Bhc3N3ZChzZWxmLCBob3N0LCByZWFsbSk6CisgICAgICAgICMjIElmIHJvYm90cy50eHQgZmlsZSBpcyBhY2Nlc3NpYmxlIG9ubHkgd2l0aCBhIHBhc3N3b3JkLAorICAgICAgICAjIyB3ZSBhY3QgYXMgaWYgdGhlIGZpbGUgd2Fzbid0IHRoZXJlLgorICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCisgICAgZGVmIGh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpOgorICAgICAgICBzZWxmLmVycmNvZGUgPSBlcnJjb2RlCisgICAgICAgIHJldHVybiB1cmxsaWIuRmFuY3lVUkxvcGVuZXIuaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsIGVycmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm1zZywgaGVhZGVycykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcm9ib3RwYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy9yb2JvdHBhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1YmMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcm9ib3RwYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcm9ib3RwYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy9yb2JvdHBhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1YmMwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcm9ib3RwYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcnVucHkucHkgYi9saWIvcHl0aG9uMi43L3J1bnB5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDdjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3J1bnB5LnB5CkBAIC0wLDAgKzEsMjc4IEBACisiIiJydW5weS5weSAtIGxvY2F0aW5nIGFuZCBydW5uaW5nIFB5dGhvbiBjb2RlIHVzaW5nIHRoZSBtb2R1bGUgbmFtZXNwYWNlCisKK1Byb3ZpZGVzIHN1cHBvcnQgZm9yIGxvY2F0aW5nIGFuZCBydW5uaW5nIFB5dGhvbiBzY3JpcHRzIHVzaW5nIHRoZSBQeXRob24KK21vZHVsZSBuYW1lc3BhY2UgaW5zdGVhZCBvZiB0aGUgbmF0aXZlIGZpbGVzeXN0ZW0uCisKK1RoaXMgYWxsb3dzIFB5dGhvbiBjb2RlIHRvIHBsYXkgbmljZWx5IHdpdGggbm9uLWZpbGVzeXN0ZW0gYmFzZWQgUEVQIDMwMgoraW1wb3J0ZXJzIHdoZW4gbG9jYXRpbmcgc3VwcG9ydCBzY3JpcHRzIGFzIHdlbGwgYXMgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcy4KKyIiIgorIyBXcml0dGVuIGJ5IE5pY2sgQ29naGxhbiA8bmNvZ2hsYW4gYXQgZ21haWwuY29tPgorIyAgICB0byBpbXBsZW1lbnQgUEVQIDMzOCAoRXhlY3V0aW5nIE1vZHVsZXMgYXMgU2NyaXB0cykKKworaW1wb3J0IHN5cworaW1wb3J0IGltcAorZnJvbSBwa2d1dGlsIGltcG9ydCByZWFkX2NvZGUKK3RyeToKKyAgICBmcm9tIGltcCBpbXBvcnQgZ2V0X2xvYWRlcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2xvYWRlcgorCitfX2FsbF9fID0gWworICAgICJydW5fbW9kdWxlIiwgInJ1bl9wYXRoIiwKK10KKworY2xhc3MgX1RlbXBNb2R1bGUob2JqZWN0KToKKyAgICAiIiJUZW1wb3JhcmlseSByZXBsYWNlIGEgbW9kdWxlIGluIHN5cy5tb2R1bGVzIHdpdGggYW4gZW1wdHkgbmFtZXNwYWNlIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZF9uYW1lKToKKyAgICAgICAgc2VsZi5tb2RfbmFtZSA9IG1vZF9uYW1lCisgICAgICAgIHNlbGYubW9kdWxlID0gaW1wLm5ld19tb2R1bGUobW9kX25hbWUpCisgICAgICAgIHNlbGYuX3NhdmVkX21vZHVsZSA9IFtdCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBtb2RfbmFtZSA9IHNlbGYubW9kX25hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fc2F2ZWRfbW9kdWxlLmFwcGVuZChzeXMubW9kdWxlc1ttb2RfbmFtZV0pCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc3lzLm1vZHVsZXNbbW9kX25hbWVdID0gc2VsZi5tb2R1bGUKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuX3NhdmVkX21vZHVsZToKKyAgICAgICAgICAgIHN5cy5tb2R1bGVzW3NlbGYubW9kX25hbWVdID0gc2VsZi5fc2F2ZWRfbW9kdWxlWzBdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbc2VsZi5tb2RfbmFtZV0KKyAgICAgICAgc2VsZi5fc2F2ZWRfbW9kdWxlID0gW10KKworY2xhc3MgX01vZGlmaWVkQXJndjAob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5fc2F2ZWRfdmFsdWUgPSBzZWxmLl9zZW50aW5lbCA9IG9iamVjdCgpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9zYXZlZF92YWx1ZSBpcyBub3Qgc2VsZi5fc2VudGluZWw6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkFscmVhZHkgcHJlc2VydmluZyBzYXZlZCB2YWx1ZSIpCisgICAgICAgIHNlbGYuX3NhdmVkX3ZhbHVlID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgc3lzLmFyZ3ZbMF0gPSBzZWxmLnZhbHVlCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnZhbHVlID0gc2VsZi5fc2VudGluZWwKKyAgICAgICAgc3lzLmFyZ3ZbMF0gPSBzZWxmLl9zYXZlZF92YWx1ZQorCitkZWYgX3J1bl9jb2RlKGNvZGUsIHJ1bl9nbG9iYWxzLCBpbml0X2dsb2JhbHM9Tm9uZSwKKyAgICAgICAgICAgICAgbW9kX25hbWU9Tm9uZSwgbW9kX2ZuYW1lPU5vbmUsCisgICAgICAgICAgICAgIG1vZF9sb2FkZXI9Tm9uZSwgcGtnX25hbWU9Tm9uZSk6CisgICAgIiIiSGVscGVyIHRvIHJ1biBjb2RlIGluIG5vbWluYXRlZCBuYW1lc3BhY2UiIiIKKyAgICBpZiBpbml0X2dsb2JhbHMgaXMgbm90IE5vbmU6CisgICAgICAgIHJ1bl9nbG9iYWxzLnVwZGF0ZShpbml0X2dsb2JhbHMpCisgICAgcnVuX2dsb2JhbHMudXBkYXRlKF9fbmFtZV9fID0gbW9kX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIF9fZmlsZV9fID0gbW9kX2ZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBfX2xvYWRlcl9fID0gbW9kX2xvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgX19wYWNrYWdlX18gPSBwa2dfbmFtZSkKKyAgICBleGVjIGNvZGUgaW4gcnVuX2dsb2JhbHMKKyAgICByZXR1cm4gcnVuX2dsb2JhbHMKKworZGVmIF9ydW5fbW9kdWxlX2NvZGUoY29kZSwgaW5pdF9nbG9iYWxzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIG1vZF9uYW1lPU5vbmUsIG1vZF9mbmFtZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICBtb2RfbG9hZGVyPU5vbmUsIHBrZ19uYW1lPU5vbmUpOgorICAgICIiIkhlbHBlciB0byBydW4gY29kZSBpbiBuZXcgbmFtZXNwYWNlIHdpdGggc3lzIG1vZGlmaWVkIiIiCisgICAgd2l0aCBfVGVtcE1vZHVsZShtb2RfbmFtZSkgYXMgdGVtcF9tb2R1bGUsIF9Nb2RpZmllZEFyZ3YwKG1vZF9mbmFtZSk6CisgICAgICAgIG1vZF9nbG9iYWxzID0gdGVtcF9tb2R1bGUubW9kdWxlLl9fZGljdF9fCisgICAgICAgIF9ydW5fY29kZShjb2RlLCBtb2RfZ2xvYmFscywgaW5pdF9nbG9iYWxzLAorICAgICAgICAgICAgICAgICAgbW9kX25hbWUsIG1vZF9mbmFtZSwgbW9kX2xvYWRlciwgcGtnX25hbWUpCisgICAgIyBDb3B5IHRoZSBnbG9iYWxzIG9mIHRoZSB0ZW1wb3JhcnkgbW9kdWxlLCBhcyB0aGV5CisgICAgIyBtYXkgYmUgY2xlYXJlZCB3aGVuIHRoZSB0ZW1wb3JhcnkgbW9kdWxlIGdvZXMgYXdheQorICAgIHJldHVybiBtb2RfZ2xvYmFscy5jb3B5KCkKKworCisjIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBkdWUgdG8gYSBtaXNzaW5nIGNvbXBvbmVudCBpbiB0aGUgUEVQIDMwMgorIyBsb2FkZXIgcHJvdG9jb2wgKHNwZWNpZmljYWxseSwgImdldF9maWxlbmFtZSIgaXMgbm9uLXN0YW5kYXJkKQorIyBTaW5jZSB3ZSBjYW4ndCBpbnRyb2R1Y2UgbmV3IGZlYXR1cmVzIGluIG1haW50ZW5hbmNlIHJlbGVhc2VzLAorIyBzdXBwb3J0IHdhcyBhZGRlZCB0byB6aXBpbXBvcnRlciB1bmRlciB0aGUgbmFtZSAnX2dldF9maWxlbmFtZScKK2RlZiBfZ2V0X2ZpbGVuYW1lKGxvYWRlciwgbW9kX25hbWUpOgorICAgIGZvciBhdHRyIGluICgiZ2V0X2ZpbGVuYW1lIiwgIl9nZXRfZmlsZW5hbWUiKToKKyAgICAgICAgbWV0aCA9IGdldGF0dHIobG9hZGVyLCBhdHRyLCBOb25lKQorICAgICAgICBpZiBtZXRoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG1ldGgobW9kX25hbWUpCisgICAgcmV0dXJuIE5vbmUKKworIyBIZWxwZXIgdG8gZ2V0IHRoZSBsb2FkZXIsIGNvZGUgYW5kIGZpbGVuYW1lIGZvciBhIG1vZHVsZQorZGVmIF9nZXRfbW9kdWxlX2RldGFpbHMobW9kX25hbWUpOgorICAgIGxvYWRlciA9IGdldF9sb2FkZXIobW9kX25hbWUpCisgICAgaWYgbG9hZGVyIGlzIE5vbmU6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJObyBtb2R1bGUgbmFtZWQgJXMiICUgbW9kX25hbWUpCisgICAgaWYgbG9hZGVyLmlzX3BhY2thZ2UobW9kX25hbWUpOgorICAgICAgICBpZiBtb2RfbmFtZSA9PSAiX19tYWluX18iIG9yIG1vZF9uYW1lLmVuZHN3aXRoKCIuX19tYWluX18iKToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDYW5ub3QgdXNlIHBhY2thZ2UgYXMgX19tYWluX18gbW9kdWxlIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGtnX21haW5fbmFtZSA9IG1vZF9uYW1lICsgIi5fX21haW5fXyIKKyAgICAgICAgICAgIHJldHVybiBfZ2V0X21vZHVsZV9kZXRhaWxzKHBrZ19tYWluX25hbWUpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCgiJXM7ICVyIGlzIGEgcGFja2FnZSBhbmQgY2Fubm90ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBkaXJlY3RseSBleGVjdXRlZCIpICUoZSwgbW9kX25hbWUpKQorICAgIGNvZGUgPSBsb2FkZXIuZ2V0X2NvZGUobW9kX25hbWUpCisgICAgaWYgY29kZSBpcyBOb25lOgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiTm8gY29kZSBvYmplY3QgYXZhaWxhYmxlIGZvciAlcyIgJSBtb2RfbmFtZSkKKyAgICBmaWxlbmFtZSA9IF9nZXRfZmlsZW5hbWUobG9hZGVyLCBtb2RfbmFtZSkKKyAgICByZXR1cm4gbW9kX25hbWUsIGxvYWRlciwgY29kZSwgZmlsZW5hbWUKKworCitkZWYgX2dldF9tYWluX21vZHVsZV9kZXRhaWxzKCk6CisgICAgIyBIZWxwZXIgdGhhdCBnaXZlcyBhIG5pY2VyIGVycm9yIG1lc3NhZ2Ugd2hlbiBhdHRlbXB0aW5nIHRvCisgICAgIyBleGVjdXRlIGEgemlwZmlsZSBvciBkaXJlY3RvcnkgYnkgaW52b2tpbmcgX19tYWluX18ucHkKKyAgICBtYWluX25hbWUgPSAiX19tYWluX18iCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gX2dldF9tb2R1bGVfZGV0YWlscyhtYWluX25hbWUpCisgICAgZXhjZXB0IEltcG9ydEVycm9yIGFzIGV4YzoKKyAgICAgICAgaWYgbWFpbl9uYW1lIGluIHN0cihleGMpOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoImNhbid0IGZpbmQgJXIgbW9kdWxlIGluICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFpbl9uYW1lLCBzeXMucGF0aFswXSkpCisgICAgICAgIHJhaXNlCisKKyMgVGhpcyBmdW5jdGlvbiBpcyB0aGUgYWN0dWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSAtbSBzd2l0Y2ggYW5kIGRpcmVjdAorIyBleGVjdXRpb24gb2YgemlwZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGFuZCBpcyBkZWxpYmVyYXRlbHkga2VwdCBwcml2YXRlLgorIyBUaGlzIGF2b2lkcyBhIHJlcGVhdCBvZiB0aGUgc2l0dWF0aW9uIHdoZXJlIHJ1bl9tb2R1bGUoKSBubyBsb25nZXIgbWV0IHRoZQorIyBuZWVkcyBvZiBtYWlubW9kdWxlLmMsIGJ1dCBjb3VsZG4ndCBiZSBjaGFuZ2VkIGJlY2F1c2UgaXQgd2FzIHB1YmxpYworZGVmIF9ydW5fbW9kdWxlX2FzX21haW4obW9kX25hbWUsIGFsdGVyX2FyZ3Y9VHJ1ZSk6CisgICAgIiIiUnVucyB0aGUgZGVzaWduYXRlZCBtb2R1bGUgaW4gdGhlIF9fbWFpbl9fIG5hbWVzcGFjZQorCisgICAgICAgTm90ZSB0aGF0IHRoZSBleGVjdXRlZCBtb2R1bGUgd2lsbCBoYXZlIGZ1bGwgYWNjZXNzIHRvIHRoZQorICAgICAgIF9fbWFpbl9fIG5hbWVzcGFjZS4gSWYgdGhpcyBpcyBub3QgZGVzaXJhYmxlLCB0aGUgcnVuX21vZHVsZSgpCisgICAgICAgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgdG8gcnVuIHRoZSBtb2R1bGUgY29kZSBpbiBhIGZyZXNoIG5hbWVzcGFjZS4KKworICAgICAgIEF0IHRoZSB2ZXJ5IGxlYXN0LCB0aGVzZSB2YXJpYWJsZXMgaW4gX19tYWluX18gd2lsbCBiZSBvdmVyd3JpdHRlbjoKKyAgICAgICAgICAgX19uYW1lX18KKyAgICAgICAgICAgX19maWxlX18KKyAgICAgICAgICAgX19sb2FkZXJfXworICAgICAgICAgICBfX3BhY2thZ2VfXworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgaWYgYWx0ZXJfYXJndiBvciBtb2RfbmFtZSAhPSAiX19tYWluX18iOiAjIGkuZS4gLW0gc3dpdGNoCisgICAgICAgICAgICBtb2RfbmFtZSwgbG9hZGVyLCBjb2RlLCBmbmFtZSA9IF9nZXRfbW9kdWxlX2RldGFpbHMobW9kX25hbWUpCisgICAgICAgIGVsc2U6ICAgICAgICAgICMgaS5lLiBkaXJlY3Rvcnkgb3IgemlwZmlsZSBleGVjdXRpb24KKyAgICAgICAgICAgIG1vZF9uYW1lLCBsb2FkZXIsIGNvZGUsIGZuYW1lID0gX2dldF9tYWluX21vZHVsZV9kZXRhaWxzKCkKKyAgICBleGNlcHQgSW1wb3J0RXJyb3IgYXMgZXhjOgorICAgICAgICBtc2cgPSAiJXM6ICVzIiAlIChzeXMuZXhlY3V0YWJsZSwgc3RyKGV4YykpCisgICAgICAgIHN5cy5leGl0KG1zZykKKyAgICBwa2dfbmFtZSA9IG1vZF9uYW1lLnJwYXJ0aXRpb24oJy4nKVswXQorICAgIG1haW5fZ2xvYmFscyA9IHN5cy5tb2R1bGVzWyJfX21haW5fXyJdLl9fZGljdF9fCisgICAgaWYgYWx0ZXJfYXJndjoKKyAgICAgICAgc3lzLmFyZ3ZbMF0gPSBmbmFtZQorICAgIHJldHVybiBfcnVuX2NvZGUoY29kZSwgbWFpbl9nbG9iYWxzLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIl9fbWFpbl9fIiwgZm5hbWUsIGxvYWRlciwgcGtnX25hbWUpCisKK2RlZiBydW5fbW9kdWxlKG1vZF9uYW1lLCBpbml0X2dsb2JhbHM9Tm9uZSwKKyAgICAgICAgICAgICAgIHJ1bl9uYW1lPU5vbmUsIGFsdGVyX3N5cz1GYWxzZSk6CisgICAgIiIiRXhlY3V0ZSBhIG1vZHVsZSdzIGNvZGUgd2l0aG91dCBpbXBvcnRpbmcgaXQKKworICAgICAgIFJldHVybnMgdGhlIHJlc3VsdGluZyB0b3AgbGV2ZWwgbmFtZXNwYWNlIGRpY3Rpb25hcnkKKyAgICAiIiIKKyAgICBtb2RfbmFtZSwgbG9hZGVyLCBjb2RlLCBmbmFtZSA9IF9nZXRfbW9kdWxlX2RldGFpbHMobW9kX25hbWUpCisgICAgaWYgcnVuX25hbWUgaXMgTm9uZToKKyAgICAgICAgcnVuX25hbWUgPSBtb2RfbmFtZQorICAgIHBrZ19uYW1lID0gbW9kX25hbWUucnBhcnRpdGlvbignLicpWzBdCisgICAgaWYgYWx0ZXJfc3lzOgorICAgICAgICByZXR1cm4gX3J1bl9tb2R1bGVfY29kZShjb2RlLCBpbml0X2dsb2JhbHMsIHJ1bl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgbG9hZGVyLCBwa2dfbmFtZSkKKyAgICBlbHNlOgorICAgICAgICAjIExlYXZlIHRoZSBzeXMgbW9kdWxlIGFsb25lCisgICAgICAgIHJldHVybiBfcnVuX2NvZGUoY29kZSwge30sIGluaXRfZ2xvYmFscywgcnVuX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZm5hbWUsIGxvYWRlciwgcGtnX25hbWUpCisKKworIyBYWFggKG5jb2dobGFuKTogUGVyaGFwcyBleHBvc2UgdGhlIEMgQVBJIGZ1bmN0aW9uCisjIGFzIGltcC5nZXRfaW1wb3J0ZXIgaW5zdGVhZCBvZiByZWltcGxlbWVudGluZyBpdCBpbiBQeXRob24/CitkZWYgX2dldF9pbXBvcnRlcihwYXRoX25hbWUpOgorICAgICIiIlB5dGhvbiB2ZXJzaW9uIG9mIFB5SW1wb3J0X0dldEltcG9ydGVyIEMgQVBJIGZ1bmN0aW9uIiIiCisgICAgY2FjaGUgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0ZXIgPSBjYWNoZVtwYXRoX25hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAjIE5vdCB5ZXQgY2FjaGVkLiBGbGFnIGFzIHVzaW5nIHRoZQorICAgICAgICAjIHN0YW5kYXJkIG1hY2hpbmVyeSB1bnRpbCB3ZSBmaW5pc2gKKyAgICAgICAgIyBjaGVja2luZyB0aGUgaG9va3MKKyAgICAgICAgY2FjaGVbcGF0aF9uYW1lXSA9IE5vbmUKKyAgICAgICAgZm9yIGhvb2sgaW4gc3lzLnBhdGhfaG9va3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0ZXIgPSBob29rKHBhdGhfbmFtZSkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBjaGVjayBsb29rcyBhIGJpdCBvZGQuIFRoZSB0cmljayBpcyB0aGF0CisgICAgICAgICAgICAjIE51bGxJbXBvcnRlciByYWlzZXMgSW1wb3J0RXJyb3IgaWYgdGhlIHN1cHBsaWVkIHBhdGggaXMgYQorICAgICAgICAgICAgIyAqdmFsaWQqIGRpcmVjdG9yeSBlbnRyeSAoYW5kIGhlbmNlIGFibGUgdG8gYmUgaGFuZGxlZAorICAgICAgICAgICAgIyBieSB0aGUgc3RhbmRhcmQgaW1wb3J0IG1hY2hpbmVyeSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnRlciA9IGltcC5OdWxsSW1wb3J0ZXIocGF0aF9uYW1lKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGNhY2hlW3BhdGhfbmFtZV0gPSBpbXBvcnRlcgorICAgIHJldHVybiBpbXBvcnRlcgorCitkZWYgX2dldF9jb2RlX2Zyb21fZmlsZShmbmFtZSk6CisgICAgIyBDaGVjayBmb3IgYSBjb21waWxlZCBmaWxlIGZpcnN0CisgICAgd2l0aCBvcGVuKGZuYW1lLCAicmIiKSBhcyBmOgorICAgICAgICBjb2RlID0gcmVhZF9jb2RlKGYpCisgICAgaWYgY29kZSBpcyBOb25lOgorICAgICAgICAjIFRoYXQgZGlkbid0IHdvcmssIHNvIHRyeSBpdCBhcyBub3JtYWwgc291cmNlIGNvZGUKKyAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAiclUiKSBhcyBmOgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZi5yZWFkKCksIGZuYW1lLCAnZXhlYycpCisgICAgcmV0dXJuIGNvZGUKKworZGVmIHJ1bl9wYXRoKHBhdGhfbmFtZSwgaW5pdF9nbG9iYWxzPU5vbmUsIHJ1bl9uYW1lPU5vbmUpOgorICAgICIiIkV4ZWN1dGUgY29kZSBsb2NhdGVkIGF0IHRoZSBzcGVjaWZpZWQgZmlsZXN5c3RlbSBsb2NhdGlvbgorCisgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0aW5nIHRvcCBsZXZlbCBuYW1lc3BhY2UgZGljdGlvbmFyeQorCisgICAgICAgVGhlIGZpbGUgcGF0aCBtYXkgcmVmZXIgZGlyZWN0bHkgdG8gYSBQeXRob24gc2NyaXB0IChpLmUuCisgICAgICAgb25lIHRoYXQgY291bGQgYmUgZGlyZWN0bHkgZXhlY3V0ZWQgd2l0aCBleGVjZmlsZSkgb3IgZWxzZQorICAgICAgIGl0IG1heSByZWZlciB0byBhIHppcGZpbGUgb3IgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYSB0b3AKKyAgICAgICBsZXZlbCBfX21haW5fXy5weSBzY3JpcHQuCisgICAgIiIiCisgICAgaWYgcnVuX25hbWUgaXMgTm9uZToKKyAgICAgICAgcnVuX25hbWUgPSAiPHJ1bl9wYXRoPiIKKyAgICBpbXBvcnRlciA9IF9nZXRfaW1wb3J0ZXIocGF0aF9uYW1lKQorICAgIGlmIGlzaW5zdGFuY2UoaW1wb3J0ZXIsIGltcC5OdWxsSW1wb3J0ZXIpOgorICAgICAgICAjIE5vdCBhIHZhbGlkIHN5cy5wYXRoIGVudHJ5LCBzbyBydW4gdGhlIGNvZGUgZGlyZWN0bHkKKyAgICAgICAgIyBleGVjZmlsZSgpIGRvZXNuJ3QgaGVscCBhcyB3ZSB3YW50IHRvIGFsbG93IGNvbXBpbGVkIGZpbGVzCisgICAgICAgIGNvZGUgPSBfZ2V0X2NvZGVfZnJvbV9maWxlKHBhdGhfbmFtZSkKKyAgICAgICAgcmV0dXJuIF9ydW5fbW9kdWxlX2NvZGUoY29kZSwgaW5pdF9nbG9iYWxzLCBydW5fbmFtZSwgcGF0aF9uYW1lKQorICAgIGVsc2U6CisgICAgICAgICMgSW1wb3J0ZXIgaXMgZGVmaW5lZCBmb3IgcGF0aCwgc28gYWRkIGl0IHRvCisgICAgICAgICMgdGhlIHN0YXJ0IG9mIHN5cy5wYXRoCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBwYXRoX25hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgSGVyZSdzIHdoZXJlIHRoaW5ncyBhcmUgYSBsaXR0bGUgZGlmZmVyZW50IGZyb20gdGhlIHJ1bl9tb2R1bGUKKyAgICAgICAgICAgICMgY2FzZS4gVGhlcmUsIHdlIG9ubHkgaGFkIHRvIHJlcGxhY2UgdGhlIG1vZHVsZSBpbiBzeXMgd2hpbGUgdGhlCisgICAgICAgICAgICAjIGNvZGUgd2FzIHJ1bm5pbmcgYW5kIGRvaW5nIHNvIHdhcyBzb21ld2hhdCBvcHRpb25hbC4gSGVyZSwgd2UKKyAgICAgICAgICAgICMgaGF2ZSBubyBjaG9pY2UgYW5kIHdlIGhhdmUgdG8gcmVtb3ZlIGl0IGV2ZW4gd2hpbGUgd2UgcmVhZCB0aGUKKyAgICAgICAgICAgICMgY29kZS4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgYSBfX2xvYWRlcl9fIGF0dHJpYnV0ZSBpbiB0aGUKKyAgICAgICAgICAgICMgZXhpc3RpbmcgX19tYWluX18gbW9kdWxlIG1heSBwcmV2ZW50IGxvY2F0aW9uIG9mIHRoZSBuZXcgbW9kdWxlLgorICAgICAgICAgICAgbWFpbl9uYW1lID0gIl9fbWFpbl9fIgorICAgICAgICAgICAgc2F2ZWRfbWFpbiA9IHN5cy5tb2R1bGVzW21haW5fbmFtZV0KKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttYWluX25hbWVdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW9kX25hbWUsIGxvYWRlciwgY29kZSwgZm5hbWUgPSBfZ2V0X21haW5fbW9kdWxlX2RldGFpbHMoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzeXMubW9kdWxlc1ttYWluX25hbWVdID0gc2F2ZWRfbWFpbgorICAgICAgICAgICAgcGtnX25hbWUgPSAiIgorICAgICAgICAgICAgd2l0aCBfVGVtcE1vZHVsZShydW5fbmFtZSkgYXMgdGVtcF9tb2R1bGUsIFwKKyAgICAgICAgICAgICAgICAgX01vZGlmaWVkQXJndjAocGF0aF9uYW1lKToKKyAgICAgICAgICAgICAgICBtb2RfZ2xvYmFscyA9IHRlbXBfbW9kdWxlLm1vZHVsZS5fX2RpY3RfXworICAgICAgICAgICAgICAgIHJldHVybiBfcnVuX2NvZGUoY29kZSwgbW9kX2dsb2JhbHMsIGluaXRfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bl9uYW1lLCBmbmFtZSwgbG9hZGVyLCBwa2dfbmFtZSkuY29weSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnBhdGgucmVtb3ZlKHBhdGhfbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgUnVuIHRoZSBtb2R1bGUgc3BlY2lmaWVkIGFzIHRoZSBuZXh0IGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiTm8gbW9kdWxlIHNwZWNpZmllZCBmb3IgZXhlY3V0aW9uIgorICAgIGVsc2U6CisgICAgICAgIGRlbCBzeXMuYXJndlswXSAjIE1ha2UgdGhlIHJlcXVlc3RlZCBtb2R1bGUgc3lzLmFyZ3ZbMF0KKyAgICAgICAgX3J1bl9tb2R1bGVfYXNfbWFpbihzeXMuYXJndlswXSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcnVucHkucHljIGIvbGliL3B5dGhvbjIuNy9ydW5weS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3NjZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcnVucHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvcnVucHkucHlvIGIvbGliL3B5dGhvbjIuNy9ydW5weS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3NjZjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvcnVucHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2NoZWQucHkgYi9saWIvcHl0aG9uMi43L3NjaGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjQ2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NjaGVkLnB5CkBAIC0wLDAgKzEsMTM0IEBACisiIiJBIGdlbmVyYWxseSB1c2VmdWwgZXZlbnQgc2NoZWR1bGVyIGNsYXNzLgorCitFYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgbWFuYWdlcyBpdHMgb3duIHF1ZXVlLgorTm8gbXVsdGktdGhyZWFkaW5nIGlzIGltcGxpZWQ7IHlvdSBhcmUgc3VwcG9zZWQgdG8gaGFjayB0aGF0Cit5b3Vyc2VsZiwgb3IgdXNlIGEgc2luZ2xlIGluc3RhbmNlIHBlciBhcHBsaWNhdGlvbi4KKworRWFjaCBpbnN0YW5jZSBpcyBwYXJhbWV0cml6ZWQgd2l0aCB0d28gZnVuY3Rpb25zLCBvbmUgdGhhdCBpcworc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSBjdXJyZW50IHRpbWUsIG9uZSB0aGF0IGlzIHN1cHBvc2VkIHRvCitpbXBsZW1lbnQgYSBkZWxheS4gIFlvdSBjYW4gaW1wbGVtZW50IHJlYWwtdGltZSBzY2hlZHVsaW5nIGJ5CitzdWJzdGl0dXRpbmcgdGltZSBhbmQgc2xlZXAgZnJvbSBidWlsdC1pbiBtb2R1bGUgdGltZSwgb3IgeW91IGNhbgoraW1wbGVtZW50IHNpbXVsYXRlZCB0aW1lIGJ5IHdyaXRpbmcgeW91ciBvd24gZnVuY3Rpb25zLiAgVGhpcyBjYW4KK2Fsc28gYmUgdXNlZCB0byBpbnRlZ3JhdGUgc2NoZWR1bGluZyB3aXRoIFNURFdJTiBldmVudHM7IHRoZSBkZWxheQorZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIHF1ZXVlLiAgVGltZSBjYW4gYmUgZXhwcmVzc2VkIGFzCitpbnRlZ2VycyBvciBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBhcyBsb25nIGFzIGl0IGlzIGNvbnNpc3RlbnQuCisKK0V2ZW50cyBhcmUgc3BlY2lmaWVkIGJ5IHR1cGxlcyAodGltZSwgcHJpb3JpdHksIGFjdGlvbiwgYXJndW1lbnQpLgorQXMgaW4gVU5JWCwgbG93ZXIgcHJpb3JpdHkgbnVtYmVycyBtZWFuIGhpZ2hlciBwcmlvcml0eTsgaW4gdGhpcword2F5IHRoZSBxdWV1ZSBjYW4gYmUgbWFpbnRhaW5lZCBhcyBhIHByaW9yaXR5IHF1ZXVlLiAgRXhlY3V0aW9uIG9mIHRoZQorZXZlbnQgbWVhbnMgY2FsbGluZyB0aGUgYWN0aW9uIGZ1bmN0aW9uLCBwYXNzaW5nIGl0IHRoZSBhcmd1bWVudAorc2VxdWVuY2UgaW4gImFyZ3VtZW50IiAocmVtZW1iZXIgdGhhdCBpbiBQeXRob24sIG11bHRpcGxlIGZ1bmN0aW9uCithcmd1bWVudHMgYXJlIGJlIHBhY2tlZCBpbiBhIHNlcXVlbmNlKS4KK1RoZSBhY3Rpb24gZnVuY3Rpb24gbWF5IGJlIGFuIGluc3RhbmNlIG1ldGhvZCBzbyBpdAoraGFzIGFub3RoZXIgd2F5IHRvIHJlZmVyZW5jZSBwcml2YXRlIGRhdGEgKGJlc2lkZXMgZ2xvYmFsIHZhcmlhYmxlcykuCisiIiIKKworIyBYWFggVGhlIHRpbWVmdW5jIGFuZCBkZWxheWZ1bmMgc2hvdWxkIGhhdmUgYmVlbiBkZWZpbmVkIGFzIG1ldGhvZHMKKyMgWFhYIHNvIHlvdSBjYW4gZGVmaW5lIG5ldyBraW5kcyBvZiBzY2hlZHVsZXJzIHVzaW5nIHN1YmNsYXNzaW5nCisjIFhYWCBpbnN0ZWFkIG9mIGhhdmluZyB0byBkZWZpbmUgYSBtb2R1bGUgb3IgY2xhc3MganVzdCB0byBob2xkCisjIFhYWCB0aGUgZ2xvYmFsIHN0YXRlIG9mIHlvdXIgcGFydGljdWxhciB0aW1lIGFuZCBkZWxheSBmdW5jdGlvbnMuCisKK2ltcG9ydCBoZWFwcQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgbmFtZWR0dXBsZQorCitfX2FsbF9fID0gWyJzY2hlZHVsZXIiXQorCitFdmVudCA9IG5hbWVkdHVwbGUoJ0V2ZW50JywgJ3RpbWUsIHByaW9yaXR5LCBhY3Rpb24sIGFyZ3VtZW50JykKKworY2xhc3Mgc2NoZWR1bGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0aW1lZnVuYywgZGVsYXlmdW5jKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZSwgcGFzc2luZyB0aGUgdGltZSBhbmQgZGVsYXkKKyAgICAgICAgZnVuY3Rpb25zIiIiCisgICAgICAgIHNlbGYuX3F1ZXVlID0gW10KKyAgICAgICAgc2VsZi50aW1lZnVuYyA9IHRpbWVmdW5jCisgICAgICAgIHNlbGYuZGVsYXlmdW5jID0gZGVsYXlmdW5jCisKKyAgICBkZWYgZW50ZXJhYnMoc2VsZiwgdGltZSwgcHJpb3JpdHksIGFjdGlvbiwgYXJndW1lbnQpOgorICAgICAgICAiIiJFbnRlciBhIG5ldyBldmVudCBpbiB0aGUgcXVldWUgYXQgYW4gYWJzb2x1dGUgdGltZS4KKworICAgICAgICBSZXR1cm5zIGFuIElEIGZvciB0aGUgZXZlbnQgd2hpY2ggY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIGl0LAorICAgICAgICBpZiBuZWNlc3NhcnkuCisKKyAgICAgICAgIiIiCisgICAgICAgIGV2ZW50ID0gRXZlbnQodGltZSwgcHJpb3JpdHksIGFjdGlvbiwgYXJndW1lbnQpCisgICAgICAgIGhlYXBxLmhlYXBwdXNoKHNlbGYuX3F1ZXVlLCBldmVudCkKKyAgICAgICAgcmV0dXJuIGV2ZW50ICMgVGhlIElECisKKyAgICBkZWYgZW50ZXIoc2VsZiwgZGVsYXksIHByaW9yaXR5LCBhY3Rpb24sIGFyZ3VtZW50KToKKyAgICAgICAgIiIiQSB2YXJpYW50IHRoYXQgc3BlY2lmaWVzIHRoZSB0aW1lIGFzIGEgcmVsYXRpdmUgdGltZS4KKworICAgICAgICBUaGlzIGlzIGFjdHVhbGx5IHRoZSBtb3JlIGNvbW1vbmx5IHVzZWQgaW50ZXJmYWNlLgorCisgICAgICAgICIiIgorICAgICAgICB0aW1lID0gc2VsZi50aW1lZnVuYygpICsgZGVsYXkKKyAgICAgICAgcmV0dXJuIHNlbGYuZW50ZXJhYnModGltZSwgcHJpb3JpdHksIGFjdGlvbiwgYXJndW1lbnQpCisKKyAgICBkZWYgY2FuY2VsKHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiUmVtb3ZlIGFuIGV2ZW50IGZyb20gdGhlIHF1ZXVlLgorCisgICAgICAgIFRoaXMgbXVzdCBiZSBwcmVzZW50ZWQgdGhlIElEIGFzIHJldHVybmVkIGJ5IGVudGVyKCkuCisgICAgICAgIElmIHRoZSBldmVudCBpcyBub3QgaW4gdGhlIHF1ZXVlLCB0aGlzIHJhaXNlcyBWYWx1ZUVycm9yLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9xdWV1ZS5yZW1vdmUoZXZlbnQpCisgICAgICAgIGhlYXBxLmhlYXBpZnkoc2VsZi5fcXVldWUpCisKKyAgICBkZWYgZW1wdHkoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHdoZXRoZXIgdGhlIHF1ZXVlIGlzIGVtcHR5LiIiIgorICAgICAgICByZXR1cm4gbm90IHNlbGYuX3F1ZXVlCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiJFeGVjdXRlIGV2ZW50cyB1bnRpbCB0aGUgcXVldWUgaXMgZW1wdHkuCisKKyAgICAgICAgV2hlbiB0aGVyZSBpcyBhIHBvc2l0aXZlIGRlbGF5IHVudGlsIHRoZSBmaXJzdCBldmVudCwgdGhlCisgICAgICAgIGRlbGF5IGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgdGhlIGV2ZW50IGlzIGxlZnQgaW4gdGhlIHF1ZXVlOworICAgICAgICBvdGhlcndpc2UsIHRoZSBldmVudCBpcyByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGFuZCBleGVjdXRlZAorICAgICAgICAoaXRzIGFjdGlvbiBmdW5jdGlvbiBpcyBjYWxsZWQsIHBhc3NpbmcgaXQgdGhlIGFyZ3VtZW50KS4gIElmCisgICAgICAgIHRoZSBkZWxheSBmdW5jdGlvbiByZXR1cm5zIHByZW1hdHVyZWx5LCBpdCBpcyBzaW1wbHkKKyAgICAgICAgcmVzdGFydGVkLgorCisgICAgICAgIEl0IGlzIGxlZ2FsIGZvciBib3RoIHRoZSBkZWxheSBmdW5jdGlvbiBhbmQgdGhlIGFjdGlvbgorICAgICAgICBmdW5jdGlvbiB0byBtb2RpZnkgdGhlIHF1ZXVlIG9yIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbjsKKyAgICAgICAgZXhjZXB0aW9ucyBhcmUgbm90IGNhdWdodCBidXQgdGhlIHNjaGVkdWxlcidzIHN0YXRlIHJlbWFpbnMKKyAgICAgICAgd2VsbC1kZWZpbmVkIHNvIHJ1bigpIG1heSBiZSBjYWxsZWQgYWdhaW4uCisKKyAgICAgICAgQSBxdWVzdGlvbmFibGUgaGFjayBpcyBhZGRlZCB0byBhbGxvdyBvdGhlciB0aHJlYWRzIHRvIHJ1bjoKKyAgICAgICAganVzdCBhZnRlciBhbiBldmVudCBpcyBleGVjdXRlZCwgYSBkZWxheSBvZiAwIGlzIGV4ZWN1dGVkLCB0bworICAgICAgICBhdm9pZCBtb25vcG9saXppbmcgdGhlIENQVSB3aGVuIG90aGVyIHRocmVhZHMgYXJlIGFsc28KKyAgICAgICAgcnVubmFibGUuCisKKyAgICAgICAgIiIiCisgICAgICAgICMgbG9jYWxpemUgdmFyaWFibGUgYWNjZXNzIHRvIG1pbmltaXplIG92ZXJoZWFkCisgICAgICAgICMgYW5kIHRvIGltcHJvdmUgdGhyZWFkIHNhZmV0eQorICAgICAgICBxID0gc2VsZi5fcXVldWUKKyAgICAgICAgZGVsYXlmdW5jID0gc2VsZi5kZWxheWZ1bmMKKyAgICAgICAgdGltZWZ1bmMgPSBzZWxmLnRpbWVmdW5jCisgICAgICAgIHBvcCA9IGhlYXBxLmhlYXBwb3AKKyAgICAgICAgd2hpbGUgcToKKyAgICAgICAgICAgIHRpbWUsIHByaW9yaXR5LCBhY3Rpb24sIGFyZ3VtZW50ID0gY2hlY2tlZF9ldmVudCA9IHFbMF0KKyAgICAgICAgICAgIG5vdyA9IHRpbWVmdW5jKCkKKyAgICAgICAgICAgIGlmIG5vdyA8IHRpbWU6CisgICAgICAgICAgICAgICAgZGVsYXlmdW5jKHRpbWUgLSBub3cpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV2ZW50ID0gcG9wKHEpCisgICAgICAgICAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgZXZlbnQgd2FzIG5vdCByZW1vdmVkIG9yIGFsdGVyZWQKKyAgICAgICAgICAgICAgICAjIGJ5IGFub3RoZXIgdGhyZWFkIGFmdGVyIHdlIGxhc3QgbG9va2VkIGF0IHFbMF0uCisgICAgICAgICAgICAgICAgaWYgZXZlbnQgaXMgY2hlY2tlZF9ldmVudDoKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9uKCphcmd1bWVudCkKKyAgICAgICAgICAgICAgICAgICAgZGVsYXlmdW5jKDApICAgIyBMZXQgb3RoZXIgdGhyZWFkcyBydW4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoZWFwcS5oZWFwcHVzaChxLCBldmVudCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBxdWV1ZShzZWxmKToKKyAgICAgICAgIiIiQW4gb3JkZXJlZCBsaXN0IG9mIHVwY29taW5nIGV2ZW50cy4KKworICAgICAgICBFdmVudHMgYXJlIG5hbWVkIHR1cGxlcyB3aXRoIGZpZWxkcyBmb3I6CisgICAgICAgICAgICB0aW1lLCBwcmlvcml0eSwgYWN0aW9uLCBhcmd1bWVudHMKKworICAgICAgICAiIiIKKyAgICAgICAgIyBVc2UgaGVhcHEgdG8gc29ydCB0aGUgcXVldWUgcmF0aGVyIHRoYW4gdXNpbmcgJ3NvcnRlZChzZWxmLl9xdWV1ZSknLgorICAgICAgICAjIFdpdGggaGVhcHEsIHR3byBldmVudHMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWUgd2lsbCBzaG93IGluCisgICAgICAgICMgdGhlIGFjdHVhbCBvcmRlciB0aGV5IHdvdWxkIGJlIHJldHJpZXZlZC4KKyAgICAgICAgZXZlbnRzID0gc2VsZi5fcXVldWVbOl0KKyAgICAgICAgcmV0dXJuIG1hcChoZWFwcS5oZWFwcG9wLCBbZXZlbnRzXSpsZW4oZXZlbnRzKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2NoZWQucHljIGIvbGliL3B5dGhvbjIuNy9zY2hlZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhOTk2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2NoZWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2NoZWQucHlvIGIvbGliL3B5dGhvbjIuNy9zY2hlZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhOTk2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2NoZWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2V0cy5weSBiL2xpYi9weXRob24yLjcvc2V0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTMxYTBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zZXRzLnB5CkBAIC0wLDAgKzEsNTU3IEBACisiIiJDbGFzc2VzIHRvIHJlcHJlc2VudCBhcmJpdHJhcnkgc2V0cyAoaW5jbHVkaW5nIHNldHMgb2Ygc2V0cykuCisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgc2V0cyB1c2luZyBkaWN0aW9uYXJpZXMgd2hvc2UgdmFsdWVzIGFyZQoraWdub3JlZC4gIFRoZSB1c3VhbCBvcGVyYXRpb25zICh1bmlvbiwgaW50ZXJzZWN0aW9uLCBkZWxldGlvbiwgZXRjLikKK2FyZSBwcm92aWRlZCBhcyBib3RoIG1ldGhvZHMgYW5kIG9wZXJhdG9ycy4KKworSW1wb3J0YW50OiBzZXRzIGFyZSBub3Qgc2VxdWVuY2VzISAgV2hpbGUgdGhleSBzdXBwb3J0ICd4IGluIHMnLAorJ2xlbihzKScsIGFuZCAnZm9yIHggaW4gcycsIG5vbmUgb2YgdGhvc2Ugb3BlcmF0aW9ucyBhcmUgdW5pcXVlIGZvcgorc2VxdWVuY2VzOyBmb3IgZXhhbXBsZSwgbWFwcGluZ3Mgc3VwcG9ydCBhbGwgdGhyZWUgYXMgd2VsbC4gIFRoZQorY2hhcmFjdGVyaXN0aWMgb3BlcmF0aW9uIGZvciBzZXF1ZW5jZXMgaXMgc3Vic2NyaXB0aW5nIHdpdGggc21hbGwKK2ludGVnZXJzOiBzW2ldLCBmb3IgaSBpbiByYW5nZShsZW4ocykpLiAgU2V0cyBkb24ndCBzdXBwb3J0CitzdWJzY3JpcHRpbmcgYXQgYWxsLiAgQWxzbywgc2VxdWVuY2VzIGFsbG93IG11bHRpcGxlIG9jY3VycmVuY2VzIGFuZAordGhlaXIgZWxlbWVudHMgaGF2ZSBhIGRlZmluaXRlIG9yZGVyOyBzZXRzIG9uIHRoZSBvdGhlciBoYW5kIGRvbid0CityZWNvcmQgbXVsdGlwbGUgb2NjdXJyZW5jZXMgYW5kIGRvbid0IHJlbWVtYmVyIHRoZSBvcmRlciBvZiBlbGVtZW50CitpbnNlcnRpb24gKHdoaWNoIGlzIHdoeSB0aGV5IGRvbid0IHN1cHBvcnQgc1tpXSkuCisKK1RoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgcHJvdmlkZWQ6CisKK0Jhc2VTZXQgLS0gQWxsIHRoZSBvcGVyYXRpb25zIGNvbW1vbiB0byBib3RoIG11dGFibGUgYW5kIGltbXV0YWJsZQorICAgIHNldHMuIFRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MsIG5vdCBtZWFudCB0byBiZSBkaXJlY3RseQorICAgIGluc3RhbnRpYXRlZC4KKworU2V0IC0tIE11dGFibGUgc2V0cywgc3ViY2xhc3Mgb2YgQmFzZVNldDsgbm90IGhhc2hhYmxlLgorCitJbW11dGFibGVTZXQgLS0gSW1tdXRhYmxlIHNldHMsIHN1YmNsYXNzIG9mIEJhc2VTZXQ7IGhhc2hhYmxlLgorICAgIEFuIGl0ZXJhYmxlIGFyZ3VtZW50IGlzIG1hbmRhdG9yeSB0byBjcmVhdGUgYW4gSW1tdXRhYmxlU2V0LgorCitfVGVtcG9yYXJpbHlJbW11dGFibGVTZXQgLS0gQSB3cmFwcGVyIGFyb3VuZCBhIFNldCwgaGFzaGFibGUsCisgICAgZ2l2aW5nIHRoZSBzYW1lIGhhc2ggdmFsdWUgYXMgdGhlIGltbXV0YWJsZSBzZXQgZXF1aXZhbGVudAorICAgIHdvdWxkIGhhdmUuICBEbyBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuCisKK09ubHkgaGFzaGFibGUgb2JqZWN0cyBjYW4gYmUgYWRkZWQgdG8gYSBTZXQuIEluIHBhcnRpY3VsYXIsIHlvdSBjYW5ub3QKK3JlYWxseSBhZGQgYSBTZXQgYXMgYW4gZWxlbWVudCB0byBhbm90aGVyIFNldDsgaWYgeW91IHRyeSwgd2hhdCBpcworYWN0dWFsbHkgYWRkZWQgaXMgYW4gSW1tdXRhYmxlU2V0IGJ1aWx0IGZyb20gaXQgKGl0IGNvbXBhcmVzIGVxdWFsIHRvCit0aGUgb25lIHlvdSB0cmllZCBhZGRpbmcpLgorCitXaGVuIHlvdSBhc2sgaWYgYHggaW4geScgd2hlcmUgeCBpcyBhIFNldCBhbmQgeSBpcyBhIFNldCBvcgorSW1tdXRhYmxlU2V0LCB4IGlzIHdyYXBwZWQgaW50byBhIF9UZW1wb3JhcmlseUltbXV0YWJsZVNldCB6LCBhbmQKK3doYXQncyB0ZXN0ZWQgaXMgYWN0dWFsbHkgYHogaW4geScuCisKKyIiIgorCisjIENvZGUgaGlzdG9yeToKKyMKKyMgLSBHcmVnIFYuIFdpbHNvbiB3cm90ZSB0aGUgZmlyc3QgdmVyc2lvbiwgdXNpbmcgYSBkaWZmZXJlbnQgYXBwcm9hY2gKKyMgICB0byB0aGUgbXV0YWJsZS9pbW11dGFibGUgcHJvYmxlbSwgYW5kIGluaGVyaXRpbmcgZnJvbSBkaWN0LgorIworIyAtIEFsZXggTWFydGVsbGkgbW9kaWZpZWQgR3JlZydzIHZlcnNpb24gdG8gaW1wbGVtZW50IHRoZSBjdXJyZW50CisjICAgU2V0L0ltbXV0YWJsZVNldCBhcHByb2FjaCwgYW5kIG1ha2UgdGhlIGRhdGEgYW4gYXR0cmlidXRlLgorIworIyAtIEd1aWRvIHZhbiBSb3NzdW0gcmV3cm90ZSBtdWNoIG9mIHRoZSBjb2RlLCBtYWRlIHNvbWUgQVBJIGNoYW5nZXMsCisjICAgYW5kIGNsZWFuZWQgdXAgdGhlIGRvY3N0cmluZ3MuCisjCisjIC0gUmF5bW9uZCBIZXR0aW5nZXIgYWRkZWQgYSBudW1iZXIgb2Ygc3BlZWR1cHMgYW5kIG90aGVyCisjICAgaW1wcm92ZW1lbnRzLgorCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgaWZpbHRlciwgaWZpbHRlcmZhbHNlCisKK19fYWxsX18gPSBbJ0Jhc2VTZXQnLCAnU2V0JywgJ0ltbXV0YWJsZVNldCddCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybigidGhlIHNldHMgbW9kdWxlIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorCitjbGFzcyBCYXNlU2V0KG9iamVjdCk6CisgICAgIiIiQ29tbW9uIGJhc2UgY2xhc3MgZm9yIG11dGFibGUgYW5kIGltbXV0YWJsZSBzZXRzLiIiIgorCisgICAgX19zbG90c19fID0gWydfZGF0YSddCisKKyAgICAjIENvbnN0cnVjdG9yCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICIiIlRoaXMgaXMgYW4gYWJzdHJhY3QgY2xhc3MuIiIiCisgICAgICAgICMgRG9uJ3QgY2FsbCB0aGlzIGZyb20gYSBjb25jcmV0ZSBzdWJjbGFzcyEKKyAgICAgICAgaWYgc2VsZi5fX2NsYXNzX18gaXMgQmFzZVNldDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgKCJCYXNlU2V0IGlzIGFuIGFic3RyYWN0IGNsYXNzLiAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVzZSBTZXQgb3IgSW1tdXRhYmxlU2V0LiIpCisKKyAgICAjIFN0YW5kYXJkIHByb3RvY29sczogX19sZW5fXywgX19yZXByX18sIF9fc3RyX18sIF9faXRlcl9fCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSBzZXQuIiIiCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fZGF0YSkKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIHNldC4KKworICAgICAgICBUaGlzIGxvb2tzIGxpa2UgJ1NldChbPGxpc3Qgb2YgZWxlbWVudHM+XSknLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlcHIoKQorCisgICAgIyBfX3N0cl9fIGlzIHRoZSBzYW1lIGFzIF9fcmVwcl9fCisgICAgX19zdHJfXyA9IF9fcmVwcl9fCisKKyAgICBkZWYgX3JlcHIoc2VsZiwgc29ydGVkPUZhbHNlKToKKyAgICAgICAgZWxlbWVudHMgPSBzZWxmLl9kYXRhLmtleXMoKQorICAgICAgICBpZiBzb3J0ZWQ6CisgICAgICAgICAgICBlbGVtZW50cy5zb3J0KCkKKyAgICAgICAgcmV0dXJuICclcyglciknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBlbGVtZW50cykKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIG9yIGEgc2V0LgorCisgICAgICAgIFRoaXMgaXMgdGhlIGtleXMgaXRlcmF0b3IgZm9yIHRoZSB1bmRlcmx5aW5nIGRpY3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZGF0YS5pdGVya2V5cygpCisKKyAgICAjIFRocmVlLXdheSBjb21wYXJpc29uIGlzIG5vdCBzdXBwb3J0ZWQuICBIb3dldmVyLCBiZWNhdXNlIF9fZXFfXyBpcworICAgICMgdHJpZWQgYmVmb3JlIF9fY21wX18sIGlmIFNldCB4ID09IFNldCB5LCB4Ll9fZXFfXyh5KSByZXR1cm5zIFRydWUgYW5kCisgICAgIyB0aGVuIGNtcCh4LCB5KSByZXR1cm5zIDAgKFB5dGhvbiBkb2Vzbid0IGFjdHVhbGx5IGNhbGwgX19jbXBfXyBpbiB0aGlzCisgICAgIyBjYXNlKS4KKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiY2FuJ3QgY29tcGFyZSBzZXRzIHVzaW5nIGNtcCgpIgorCisgICAgIyBFcXVhbGl0eSBjb21wYXJpc29ucyB1c2luZyB0aGUgdW5kZXJseWluZyBkaWN0cy4gIE1peGVkLXR5cGUgY29tcGFyaXNvbnMKKyAgICAjIGFyZSBhbGxvd2VkIGhlcmUsIHdoZXJlIFNldCA9PSB6IGZvciBub24tU2V0IHogYWx3YXlzIHJldHVybnMgRmFsc2UsCisgICAgIyBhbmQgU2V0ICE9IHogYWx3YXlzIFRydWUuICBUaGlzIGFsbG93cyBleHByZXNzaW9ucyBsaWtlICJ4IGluIHkiIHRvCisgICAgIyBnaXZlIHRoZSBleHBlY3RlZCByZXN1bHQgd2hlbiB5IGlzIGEgc2VxdWVuY2Ugb2YgbWl4ZWQgdHlwZXMsIG5vdAorICAgICMgcmFpc2luZyBhIHBvaW50bGVzcyBUeXBlRXJyb3IganVzdCBiZWNhdXNlIHkgY29udGFpbnMgYSBTZXQsIG9yIHggaXMKKyAgICAjIGEgU2V0IGFuZCB5IGNvbnRhaW4ncyBhIG5vbi1zZXQgKCJpbiIgaW52b2tlcyBvbmx5IF9fZXFfXykuCisgICAgIyBTdWJ0bGU6ICBpdCB3b3VsZCBiZSBuaWNlciBpZiBfX2VxX18gYW5kIF9fbmVfXyBjb3VsZCByZXR1cm4KKyAgICAjIE5vdEltcGxlbWVudGVkIGluc3RlYWQgb2YgVHJ1ZSBvciBGYWxzZS4gIFRoZW4gdGhlIG90aGVyIGNvbXBhcmFuZAorICAgICMgd291bGQgZ2V0IGEgY2hhbmNlIHRvIGRldGVybWluZSB0aGUgcmVzdWx0LCBhbmQgaWYgdGhlIG90aGVyIGNvbXBhcmFuZAorICAgICMgYWxzbyByZXR1cm5lZCBOb3RJbXBsZW1lbnRlZCB0aGVuIGl0IHdvdWxkIGZhbGwgYmFjayB0byBvYmplY3QgYWRkcmVzcworICAgICMgY29tcGFyaXNvbiAod2hpY2ggd291bGQgYWx3YXlzIHJldHVybiBGYWxzZSBmb3IgX19lcV9fIGFuZCBhbHdheXMKKyAgICAjIFRydWUgZm9yIF9fbmVfXykuICBIb3dldmVyLCB0aGF0IGRvZXNuJ3Qgd29yaywgYmVjYXVzZSB0aGlzIHR5cGUKKyAgICAjICphbHNvKiBpbXBsZW1lbnRzIF9fY21wX186ICBpZiwgZS5nLiwgX19lcV9fIHJldHVybnMgTm90SW1wbGVtZW50ZWQsCisgICAgIyBQeXRob24gdHJpZXMgX19jbXBfXyBuZXh0LCBhbmQgdGhlIF9fY21wX18gaGVyZSB0aGVuIHJhaXNlcyBUeXBlRXJyb3IuCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGF0YSA9PSBvdGhlci5fZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQmFzZVNldCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZGF0YSAhPSBvdGhlci5fZGF0YQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICMgQ29weWluZyBvcGVyYXRpb25zCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIGEgc2V0LiIiIgorICAgICAgICByZXN1bHQgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIHJlc3VsdC5fZGF0YS51cGRhdGUoc2VsZi5fZGF0YSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgX19jb3B5X18gPSBjb3B5ICMgRm9yIHRoZSBjb3B5IG1vZHVsZQorCisgICAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vKToKKyAgICAgICAgIiIiUmV0dXJuIGEgZGVlcCBjb3B5IG9mIGEgc2V0OyB1c2VkIGJ5IGNvcHkgbW9kdWxlLiIiIgorICAgICAgICAjIFRoaXMgcHJlLWNyZWF0ZXMgdGhlIHJlc3VsdCBhbmQgaW5zZXJ0cyBpdCBpbiB0aGUgbWVtbworICAgICAgICAjIGVhcmx5LCBpbiBjYXNlIHRoZSBkZWVwIGNvcHkgcmVjdXJzZXMgaW50byBhbm90aGVyIHJlZmVyZW5jZQorICAgICAgICAjIHRvIHRoaXMgc2FtZSBzZXQuICBBIHNldCBjYW4ndCBiZSBhbiBlbGVtZW50IG9mIGl0c2VsZiwgYnV0CisgICAgICAgICMgaXQgY2FuIGNlcnRhaW5seSBjb250YWluIGFuIG9iamVjdCB0aGF0IGhhcyBhIHJlZmVyZW5jZSB0bworICAgICAgICAjIGl0c2VsZi4KKyAgICAgICAgZnJvbSBjb3B5IGltcG9ydCBkZWVwY29weQorICAgICAgICByZXN1bHQgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIG1lbW9baWQoc2VsZildID0gcmVzdWx0CisgICAgICAgIGRhdGEgPSByZXN1bHQuX2RhdGEKKyAgICAgICAgdmFsdWUgPSBUcnVlCisgICAgICAgIGZvciBlbHQgaW4gc2VsZjoKKyAgICAgICAgICAgIGRhdGFbZGVlcGNvcHkoZWx0LCBtZW1vKV0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAjIFN0YW5kYXJkIHNldCBvcGVyYXRpb25zOiB1bmlvbiwgaW50ZXJzZWN0aW9uLCBib3RoIGRpZmZlcmVuY2VzLgorICAgICMgRWFjaCBoYXMgYW4gb3BlcmF0b3IgdmVyc2lvbiAoZS5nLiBfX29yX18sIGludm9rZWQgd2l0aCB8KSBhbmQgYQorICAgICMgbWV0aG9kIHZlcnNpb24gKGUuZy4gdW5pb24pLgorICAgICMgU3VidGxlOiAgRWFjaCBwYWlyIHJlcXVpcmVzIGRpc3RpbmN0IGNvZGUgc28gdGhhdCB0aGUgb3V0Y29tZSBpcworICAgICMgY29ycmVjdCB3aGVuIHRoZSB0eXBlIG9mIG90aGVyIGlzbid0IHN1aXRhYmxlLiAgRm9yIGV4YW1wbGUsIGlmCisgICAgIyB3ZSBkaWQgInVuaW9uID0gX19vcl9fIiBpbnN0ZWFkLCB0aGVuIFNldCgpLnVuaW9uKDMpIHdvdWxkIHJldHVybgorICAgICMgTm90SW1wbGVtZW50ZWQgaW5zdGVhZCBvZiByYWlzaW5nIFR5cGVFcnJvciAoYWxiZWl0IHRoYXQgKndoeSogaXQKKyAgICAjIHJhaXNlcyBUeXBlRXJyb3IgYXMtaXMgaXMgYWxzbyBhIGJpdCBzdWJ0bGUpLgorCisgICAgZGVmIF9fb3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybiB0aGUgdW5pb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LgorCisgICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBlaXRoZXIgc2V0LikKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi51bmlvbihvdGhlcikKKworICAgIGRlZiB1bmlvbihzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybiB0aGUgdW5pb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LgorCisgICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBlaXRoZXIgc2V0LikKKyAgICAgICAgIiIiCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX19jbGFzc19fKHNlbGYpCisgICAgICAgIHJlc3VsdC5fdXBkYXRlKG90aGVyKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19hbmRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybiB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBzZXRzIGFzIGEgbmV3IHNldC4KKworICAgICAgICAoSS5lLiBhbGwgZWxlbWVudHMgdGhhdCBhcmUgaW4gYm90aCBzZXRzLikKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5pbnRlcnNlY3Rpb24ob3RoZXIpCisKKyAgICBkZWYgaW50ZXJzZWN0aW9uKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LgorCisgICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBib3RoIHNldHMuKQorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgb3RoZXIgPSBTZXQob3RoZXIpCisgICAgICAgIGlmIGxlbihzZWxmKSA8PSBsZW4ob3RoZXIpOgorICAgICAgICAgICAgbGl0dGxlLCBiaWcgPSBzZWxmLCBvdGhlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGl0dGxlLCBiaWcgPSBvdGhlciwgc2VsZgorICAgICAgICBjb21tb24gPSBpZmlsdGVyKGJpZy5fZGF0YS5fX2NvbnRhaW5zX18sIGxpdHRsZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGNvbW1vbikKKworICAgIGRlZiBfX3hvcl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzeW1tZXRyaWMgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyBhcyBhIG5ldyBzZXQuCisKKyAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIGV4YWN0bHkgb25lIG9mIHRoZSBzZXRzLikKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5zeW1tZXRyaWNfZGlmZmVyZW5jZShvdGhlcikKKworICAgIGRlZiBzeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybiB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgc2V0LgorCisgICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiBleGFjdGx5IG9uZSBvZiB0aGUgc2V0cy4pCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIGRhdGEgPSByZXN1bHQuX2RhdGEKKyAgICAgICAgdmFsdWUgPSBUcnVlCisgICAgICAgIHNlbGZkYXRhID0gc2VsZi5fZGF0YQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdGhlcmRhdGEgPSBvdGhlci5fZGF0YQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBvdGhlcmRhdGEgPSBTZXQob3RoZXIpLl9kYXRhCisgICAgICAgIGZvciBlbHQgaW4gaWZpbHRlcmZhbHNlKG90aGVyZGF0YS5fX2NvbnRhaW5zX18sIHNlbGZkYXRhKToKKyAgICAgICAgICAgIGRhdGFbZWx0XSA9IHZhbHVlCisgICAgICAgIGZvciBlbHQgaW4gaWZpbHRlcmZhbHNlKHNlbGZkYXRhLl9fY29udGFpbnNfXywgb3RoZXJkYXRhKToKKyAgICAgICAgICAgIGRhdGFbZWx0XSA9IHZhbHVlCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiAgX19zdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJldHVybiB0aGUgZGlmZmVyZW5jZSBvZiB0d28gc2V0cyBhcyBhIG5ldyBTZXQuCisKKyAgICAgICAgKEkuZS4gYWxsIGVsZW1lbnRzIHRoYXQgYXJlIGluIHRoaXMgc2V0IGFuZCBub3QgaW4gdGhlIG90aGVyLikKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBCYXNlU2V0KToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gc2VsZi5kaWZmZXJlbmNlKG90aGVyKQorCisgICAgZGVmIGRpZmZlcmVuY2Uoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHNldHMgYXMgYSBuZXcgU2V0LgorCisgICAgICAgIChJLmUuIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBpbiB0aGlzIHNldCBhbmQgbm90IGluIHRoZSBvdGhlci4pCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBzZWxmLl9fY2xhc3NfXygpCisgICAgICAgIGRhdGEgPSByZXN1bHQuX2RhdGEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3RoZXJkYXRhID0gb3RoZXIuX2RhdGEKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgb3RoZXJkYXRhID0gU2V0KG90aGVyKS5fZGF0YQorICAgICAgICB2YWx1ZSA9IFRydWUKKyAgICAgICAgZm9yIGVsdCBpbiBpZmlsdGVyZmFsc2Uob3RoZXJkYXRhLl9fY29udGFpbnNfXywgc2VsZik6CisgICAgICAgICAgICBkYXRhW2VsdF0gPSB2YWx1ZQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAjIE1lbWJlcnNoaXAgdGVzdAorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIiIiUmVwb3J0IHdoZXRoZXIgYW4gZWxlbWVudCBpcyBhIG1lbWJlciBvZiBhIHNldC4KKworICAgICAgICAoQ2FsbGVkIGluIHJlc3BvbnNlIHRvIHRoZSBleHByZXNzaW9uIGBlbGVtZW50IGluIHNlbGYnLikKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBlbGVtZW50IGluIHNlbGYuX2RhdGEKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGdldGF0dHIoZWxlbWVudCwgIl9fYXNfdGVtcG9yYXJpbHlfaW1tdXRhYmxlX18iLCBOb25lKQorICAgICAgICAgICAgaWYgdHJhbnNmb3JtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgIyByZS1yYWlzZSB0aGUgVHlwZUVycm9yIGV4Y2VwdGlvbiB3ZSBjYXVnaHQKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm0oKSBpbiBzZWxmLl9kYXRhCisKKyAgICAjIFN1YnNldCBhbmQgc3VwZXJzZXQgdGVzdAorCisgICAgZGVmIGlzc3Vic2V0KHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiUmVwb3J0IHdoZXRoZXIgYW5vdGhlciBzZXQgY29udGFpbnMgdGhpcyBzZXQuIiIiCisgICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCisgICAgICAgIGlmIGxlbihzZWxmKSA+IGxlbihvdGhlcik6ICAjIEZhc3QgY2hlY2sgZm9yIG9idmlvdXMgY2FzZXMKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBmb3IgZWx0IGluIGlmaWx0ZXJmYWxzZShvdGhlci5fZGF0YS5fX2NvbnRhaW5zX18sIHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgaXNzdXBlcnNldChzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJlcG9ydCB3aGV0aGVyIHRoaXMgc2V0IGNvbnRhaW5zIGFub3RoZXIgc2V0LiIiIgorICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQorICAgICAgICBpZiBsZW4oc2VsZikgPCBsZW4ob3RoZXIpOiAgIyBGYXN0IGNoZWNrIGZvciBvYnZpb3VzIGNhc2VzCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIGVsdCBpbiBpZmlsdGVyZmFsc2Uoc2VsZi5fZGF0YS5fX2NvbnRhaW5zX18sIG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyBJbmVxdWFsaXR5IGNvbXBhcmlzb25zIHVzaW5nIHRoZSBpcy1zdWJzZXQgcmVsYXRpb24uCisgICAgX19sZV9fID0gaXNzdWJzZXQKKyAgICBfX2dlX18gPSBpc3N1cGVyc2V0CisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi5fYmluYXJ5X3Nhbml0eV9jaGVjayhvdGhlcikKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmKSA8IGxlbihvdGhlcikgYW5kIHNlbGYuaXNzdWJzZXQob3RoZXIpCisKKyAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi5fYmluYXJ5X3Nhbml0eV9jaGVjayhvdGhlcikKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmKSA+IGxlbihvdGhlcikgYW5kIHNlbGYuaXNzdXBlcnNldChvdGhlcikKKworICAgICMgV2UgaW5oZXJpdCBvYmplY3QuX19oYXNoX18sIHNvIHdlIG11c3QgZGVueSB0aGlzIGV4cGxpY2l0bHkKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgICMgQXNzb3J0ZWQgaGVscGVycworCisgICAgZGVmIF9iaW5hcnlfc2FuaXR5X2NoZWNrKHNlbGYsIG90aGVyKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBvdGhlciBhcmd1bWVudCB0byBhIGJpbmFyeSBvcGVyYXRpb24gaXMgYWxzbworICAgICAgICAjIGEgc2V0LCByYWlzaW5nIGEgVHlwZUVycm9yIG90aGVyd2lzZS4KKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiQmluYXJ5IG9wZXJhdGlvbiBvbmx5IHBlcm1pdHRlZCBiZXR3ZWVuIHNldHMiCisKKyAgICBkZWYgX2NvbXB1dGVfaGFzaChzZWxmKToKKyAgICAgICAgIyBDYWxjdWxhdGUgaGFzaCBjb2RlIGZvciBhIHNldCBieSB4b3InaW5nIHRoZSBoYXNoIGNvZGVzIG9mCisgICAgICAgICMgdGhlIGVsZW1lbnRzLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGhhc2ggY29kZSBkb2VzIG5vdCBkZXBlbmQKKyAgICAgICAgIyBvbiB0aGUgb3JkZXIgaW4gd2hpY2ggZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZSBzZXQuICBUaGlzIGlzCisgICAgICAgICMgbm90IGNhbGxlZCBfX2hhc2hfXyBiZWNhdXNlIGEgQmFzZVNldCBzaG91bGQgbm90IGJlIGhhc2hhYmxlOworICAgICAgICAjIG9ubHkgYW4gSW1tdXRhYmxlU2V0IGlzIGhhc2hhYmxlLgorICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIGZvciBlbHQgaW4gc2VsZjoKKyAgICAgICAgICAgIHJlc3VsdCBePSBoYXNoKGVsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF91cGRhdGUoc2VsZiwgaXRlcmFibGUpOgorICAgICAgICAjIFRoZSBtYWluIGxvb3AgZm9yIHVwZGF0ZSgpIGFuZCB0aGUgc3ViY2xhc3MgX19pbml0X18oKSBtZXRob2RzLgorICAgICAgICBkYXRhID0gc2VsZi5fZGF0YQorCisgICAgICAgICMgVXNlIHRoZSBmYXN0IHVwZGF0ZSgpIG1ldGhvZCB3aGVuIGEgZGljdGlvbmFyeSBpcyBhdmFpbGFibGUuCisgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlcmFibGUsIEJhc2VTZXQpOgorICAgICAgICAgICAgZGF0YS51cGRhdGUoaXRlcmFibGUuX2RhdGEpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB2YWx1ZSA9IFRydWUKKworICAgICAgICBpZiB0eXBlKGl0ZXJhYmxlKSBpbiAobGlzdCwgdHVwbGUsIHhyYW5nZSk6CisgICAgICAgICAgICAjIE9wdGltaXplZDogd2Uga25vdyB0aGF0IF9faXRlcl9fKCkgYW5kIG5leHQoKSBjYW4ndAorICAgICAgICAgICAgIyByYWlzZSBUeXBlRXJyb3IsIHNvIHdlIGNhbiBtb3ZlICd0cnk6JyBvdXQgb2YgdGhlIGxvb3AuCisgICAgICAgICAgICBpdCA9IGl0ZXIoaXRlcmFibGUpCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2VsZW1lbnRdID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gZ2V0YXR0cihlbGVtZW50LCAiX19hc19pbW11dGFibGVfXyIsIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGlmIHRyYW5zZm9ybSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgIyByZS1yYWlzZSB0aGUgVHlwZUVycm9yIGV4Y2VwdGlvbiB3ZSBjYXVnaHQKKyAgICAgICAgICAgICAgICAgICAgZGF0YVt0cmFuc2Zvcm0oKV0gPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBTYWZlOiBvbmx5IGNhdGNoIFR5cGVFcnJvciB3aGVyZSBpbnRlbmRlZAorICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhW2VsZW1lbnRdID0gdmFsdWUKKyAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBnZXRhdHRyKGVsZW1lbnQsICJfX2FzX2ltbXV0YWJsZV9fIiwgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgdHJhbnNmb3JtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSAjIHJlLXJhaXNlIHRoZSBUeXBlRXJyb3IgZXhjZXB0aW9uIHdlIGNhdWdodAorICAgICAgICAgICAgICAgICAgICBkYXRhW3RyYW5zZm9ybSgpXSA9IHZhbHVlCisKKworY2xhc3MgSW1tdXRhYmxlU2V0KEJhc2VTZXQpOgorICAgICIiIkltbXV0YWJsZSBzZXQgY2xhc3MuIiIiCisKKyAgICBfX3Nsb3RzX18gPSBbJ19oYXNoY29kZSddCisKKyAgICAjIEJhc2VTZXQgKyBoYXNoaW5nCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaXRlcmFibGU9Tm9uZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhbiBpbW11dGFibGUgc2V0IGZyb20gYW4gb3B0aW9uYWwgaXRlcmFibGUuIiIiCisgICAgICAgIHNlbGYuX2hhc2hjb2RlID0gTm9uZQorICAgICAgICBzZWxmLl9kYXRhID0ge30KKyAgICAgICAgaWYgaXRlcmFibGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl91cGRhdGUoaXRlcmFibGUpCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2hhc2hjb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9oYXNoY29kZSA9IHNlbGYuX2NvbXB1dGVfaGFzaCgpCisgICAgICAgIHJldHVybiBzZWxmLl9oYXNoY29kZQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RhdGEsIHNlbGYuX2hhc2hjb2RlCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5fZGF0YSwgc2VsZi5faGFzaGNvZGUgPSBzdGF0ZQorCitjbGFzcyBTZXQoQmFzZVNldCk6CisgICAgIiIiIE11dGFibGUgc2V0IGNsYXNzLiIiIgorCisgICAgX19zbG90c19fID0gW10KKworICAgICMgQmFzZVNldCArIG9wZXJhdGlvbnMgcmVxdWlyaW5nIG11dGFiaWxpdHk7IG5vIGhhc2hpbmcKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVyYWJsZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgc2V0IGZyb20gYW4gb3B0aW9uYWwgaXRlcmFibGUuIiIiCisgICAgICAgIHNlbGYuX2RhdGEgPSB7fQorICAgICAgICBpZiBpdGVyYWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3VwZGF0ZShpdGVyYWJsZSkKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICMgZ2V0c3RhdGUncyByZXN1bHRzIGFyZSBpZ25vcmVkIGlmIGl0IGlzIG5vdAorICAgICAgICByZXR1cm4gc2VsZi5fZGF0YSwKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX2RhdGEsID0gZGF0YQorCisgICAgIyBJbi1wbGFjZSB1bmlvbiwgaW50ZXJzZWN0aW9uLCBkaWZmZXJlbmNlcy4KKyAgICAjIFN1YnRsZTogIFRoZSB4eXpfdXBkYXRlKCkgZnVuY3Rpb25zIGRlbGliZXJhdGVseSByZXR1cm4gTm9uZSwKKyAgICAjIGFzIGRvIGFsbCBtdXRhdGluZyBvcGVyYXRpb25zIG9uIGJ1aWx0LWluIGNvbnRhaW5lciB0eXBlcy4KKyAgICAjIFRoZSBfX3h5el9fIHNwZWxsaW5ncyBoYXZlIHRvIHJldHVybiBzZWxmLCB0aG91Z2guCisKKyAgICBkZWYgX19pb3JfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSB1bmlvbiBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCisgICAgICAgIHNlbGYuX2JpbmFyeV9zYW5pdHlfY2hlY2sob3RoZXIpCisgICAgICAgIHNlbGYuX2RhdGEudXBkYXRlKG90aGVyLl9kYXRhKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIHVuaW9uX3VwZGF0ZShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSB1bmlvbiBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCisgICAgICAgIHNlbGYuX3VwZGF0ZShvdGhlcikKKworICAgIGRlZiBfX2lhbmRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlVwZGF0ZSBhIHNldCB3aXRoIHRoZSBpbnRlcnNlY3Rpb24gb2YgaXRzZWxmIGFuZCBhbm90aGVyLiIiIgorICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQorICAgICAgICBzZWxmLl9kYXRhID0gKHNlbGYgJiBvdGhlcikuX2RhdGEKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBpbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiVXBkYXRlIGEgc2V0IHdpdGggdGhlIGludGVyc2VjdGlvbiBvZiBpdHNlbGYgYW5kIGFub3RoZXIuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgc2VsZiAmPSBvdGhlcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZGF0YSA9IChzZWxmLmludGVyc2VjdGlvbihvdGhlcikpLl9kYXRhCisKKyAgICBkZWYgX19peG9yX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgaXRzZWxmIGFuZCBhbm90aGVyLiIiIgorICAgICAgICBzZWxmLl9iaW5hcnlfc2FuaXR5X2NoZWNrKG90aGVyKQorICAgICAgICBzZWxmLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShvdGhlcikKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJVcGRhdGUgYSBzZXQgd2l0aCB0aGUgc3ltbWV0cmljIGRpZmZlcmVuY2Ugb2YgaXRzZWxmIGFuZCBhbm90aGVyLiIiIgorICAgICAgICBkYXRhID0gc2VsZi5fZGF0YQorICAgICAgICB2YWx1ZSA9IFRydWUKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgb3RoZXIgPSBTZXQob3RoZXIpCisgICAgICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICAgICAgICBzZWxmLmNsZWFyKCkKKyAgICAgICAgZm9yIGVsdCBpbiBvdGhlcjoKKyAgICAgICAgICAgIGlmIGVsdCBpbiBkYXRhOgorICAgICAgICAgICAgICAgIGRlbCBkYXRhW2VsdF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YVtlbHRdID0gdmFsdWUKKworICAgIGRlZiBfX2lzdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJlbW92ZSBhbGwgZWxlbWVudHMgb2YgYW5vdGhlciBzZXQgZnJvbSB0aGlzIHNldC4iIiIKKyAgICAgICAgc2VsZi5fYmluYXJ5X3Nhbml0eV9jaGVjayhvdGhlcikKKyAgICAgICAgc2VsZi5kaWZmZXJlbmNlX3VwZGF0ZShvdGhlcikKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBkaWZmZXJlbmNlX3VwZGF0ZShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIlJlbW92ZSBhbGwgZWxlbWVudHMgb2YgYW5vdGhlciBzZXQgZnJvbSB0aGlzIHNldC4iIiIKKyAgICAgICAgZGF0YSA9IHNlbGYuX2RhdGEKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIEJhc2VTZXQpOgorICAgICAgICAgICAgb3RoZXIgPSBTZXQob3RoZXIpCisgICAgICAgIGlmIHNlbGYgaXMgb3RoZXI6CisgICAgICAgICAgICBzZWxmLmNsZWFyKCkKKyAgICAgICAgZm9yIGVsdCBpbiBpZmlsdGVyKGRhdGEuX19jb250YWluc19fLCBvdGhlcik6CisgICAgICAgICAgICBkZWwgZGF0YVtlbHRdCisKKyAgICAjIFB5dGhvbiBkaWN0LWxpa2UgbWFzcyBtdXRhdGlvbnM6IHVwZGF0ZSwgY2xlYXIKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgaXRlcmFibGUpOgorICAgICAgICAiIiJBZGQgYWxsIHZhbHVlcyBmcm9tIGFuIGl0ZXJhYmxlIChzdWNoIGFzIGEgbGlzdCBvciBmaWxlKS4iIiIKKyAgICAgICAgc2VsZi5fdXBkYXRlKGl0ZXJhYmxlKQorCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAiIiJSZW1vdmUgYWxsIGVsZW1lbnRzIGZyb20gdGhpcyBzZXQuIiIiCisgICAgICAgIHNlbGYuX2RhdGEuY2xlYXIoKQorCisgICAgIyBTaW5nbGUtZWxlbWVudCBtdXRhdGlvbnM6IGFkZCwgcmVtb3ZlLCBkaXNjYXJkCisKKyAgICBkZWYgYWRkKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICAiIiJBZGQgYW4gZWxlbWVudCB0byBhIHNldC4KKworICAgICAgICBUaGlzIGhhcyBubyBlZmZlY3QgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBwcmVzZW50LgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZGF0YVtlbGVtZW50XSA9IFRydWUKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGdldGF0dHIoZWxlbWVudCwgIl9fYXNfaW1tdXRhYmxlX18iLCBOb25lKQorICAgICAgICAgICAgaWYgdHJhbnNmb3JtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgIyByZS1yYWlzZSB0aGUgVHlwZUVycm9yIGV4Y2VwdGlvbiB3ZSBjYXVnaHQKKyAgICAgICAgICAgIHNlbGYuX2RhdGFbdHJhbnNmb3JtKCldID0gVHJ1ZQorCisgICAgZGVmIHJlbW92ZShzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIiIiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldDsgaXQgbXVzdCBiZSBhIG1lbWJlci4KKworICAgICAgICBJZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIHJhaXNlIGEgS2V5RXJyb3IuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5fZGF0YVtlbGVtZW50XQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgdHJhbnNmb3JtID0gZ2V0YXR0cihlbGVtZW50LCAiX19hc190ZW1wb3JhcmlseV9pbW11dGFibGVfXyIsIE5vbmUpCisgICAgICAgICAgICBpZiB0cmFuc2Zvcm0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSAjIHJlLXJhaXNlIHRoZSBUeXBlRXJyb3IgZXhjZXB0aW9uIHdlIGNhdWdodAorICAgICAgICAgICAgZGVsIHNlbGYuX2RhdGFbdHJhbnNmb3JtKCldCisKKyAgICBkZWYgZGlzY2FyZChzZWxmLCBlbGVtZW50KToKKyAgICAgICAgIiIiUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhIHNldCBpZiBpdCBpcyBhIG1lbWJlci4KKworICAgICAgICBJZiB0aGUgZWxlbWVudCBpcyBub3QgYSBtZW1iZXIsIGRvIG5vdGhpbmcuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJlbW92ZShlbGVtZW50KQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgcG9wKHNlbGYpOgorICAgICAgICAiIiJSZW1vdmUgYW5kIHJldHVybiBhbiBhcmJpdHJhcnkgc2V0IGVsZW1lbnQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9kYXRhLnBvcGl0ZW0oKVswXQorCisgICAgZGVmIF9fYXNfaW1tdXRhYmxlX18oc2VsZik6CisgICAgICAgICMgUmV0dXJuIGEgY29weSBvZiBzZWxmIGFzIGFuIGltbXV0YWJsZSBzZXQKKyAgICAgICAgcmV0dXJuIEltbXV0YWJsZVNldChzZWxmKQorCisgICAgZGVmIF9fYXNfdGVtcG9yYXJpbHlfaW1tdXRhYmxlX18oc2VsZik6CisgICAgICAgICMgUmV0dXJuIHNlbGYgd3JhcHBlZCBpbiBhIHRlbXBvcmFyaWx5IGltbXV0YWJsZSBzZXQKKyAgICAgICAgcmV0dXJuIF9UZW1wb3JhcmlseUltbXV0YWJsZVNldChzZWxmKQorCisKK2NsYXNzIF9UZW1wb3JhcmlseUltbXV0YWJsZVNldChCYXNlU2V0KToKKyAgICAjIFdyYXAgYSBtdXRhYmxlIHNldCBhcyBpZiBpdCB3YXMgdGVtcG9yYXJpbHkgaW1tdXRhYmxlLgorICAgICMgVGhpcyBvbmx5IHN1cHBsaWVzIGhhc2hpbmcgYW5kIGVxdWFsaXR5IGNvbXBhcmlzb25zLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNldCk6CisgICAgICAgIHNlbGYuX3NldCA9IHNldAorICAgICAgICBzZWxmLl9kYXRhID0gc2V0Ll9kYXRhICAjIE5lZWRlZCBieSBJbW11dGFibGVTZXQuX19lcV9fKCkKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NldC5fY29tcHV0ZV9oYXNoKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2V0cy5weWMgYi9saWIvcHl0aG9uMi43L3NldHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzc3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NldHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2V0cy5weW8gYi9saWIvcHl0aG9uMi43L3NldHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzc3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NldHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2dtbGxpYi5weSBiL2xpYi9weXRob24yLjcvc2dtbGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRiMjVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zZ21sbGliLnB5CkBAIC0wLDAgKzEsNTUzIEBACisiIiJBIHBhcnNlciBmb3IgU0dNTCwgdXNpbmcgdGhlIGRlcml2ZWQgY2xhc3MgYXMgYSBzdGF0aWMgRFRELiIiIgorCisjIFhYWCBUaGlzIG9ubHkgc3VwcG9ydHMgdGhvc2UgU0dNTCBmZWF0dXJlcyB1c2VkIGJ5IEhUTUwuCisKKyMgWFhYIFRoZXJlIHNob3VsZCBiZSBhIHdheSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIFBDREFUQSAocGFyc2VkCisjIGNoYXJhY3RlciBkYXRhIC0tIHRoZSBub3JtYWwgY2FzZSksIFJDREFUQSAocmVwbGFjZWFibGUgY2hhcmFjdGVyCisjIGRhdGEgLS0gb25seSBjaGFyIGFuZCBlbnRpdHkgcmVmZXJlbmNlcyBhbmQgZW5kIHRhZ3MgYXJlIHNwZWNpYWwpCisjIGFuZCBDREFUQSAoY2hhcmFjdGVyIGRhdGEgLS0gb25seSBlbmQgdGFncyBhcmUgc3BlY2lhbCkuICBSQ0RBVEEgaXMKKyMgbm90IHN1cHBvcnRlZCBhdCBhbGwuCisKKworZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgc2dtbGxpYiBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwKKyAgICAgICAgIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCitpbXBvcnQgbWFya3VwYmFzZQoraW1wb3J0IHJlCisKK19fYWxsX18gPSBbIlNHTUxQYXJzZXIiLCAiU0dNTFBhcnNlRXJyb3IiXQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbnMgdXNlZCBmb3IgcGFyc2luZworCitpbnRlcmVzdGluZyA9IHJlLmNvbXBpbGUoJ1smPF0nKQoraW5jb21wbGV0ZSA9IHJlLmNvbXBpbGUoJyYoW2EtekEtWl1bYS16QS1aMC05XSp8I1swLTldKik/fCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICc8KFthLXpBLVpdW148Pl0qfCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvKFthLXpBLVpdW148Pl0qKT98JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyFbXjw+XSopPycpCisKK2VudGl0eXJlZiA9IHJlLmNvbXBpbGUoJyYoW2EtekEtWl1bLS5hLXpBLVowLTldKilbXmEtekEtWjAtOV0nKQorY2hhcnJlZiA9IHJlLmNvbXBpbGUoJyYjKFswLTldKylbXjAtOV0nKQorCitzdGFydHRhZ29wZW4gPSByZS5jb21waWxlKCc8Wz5hLXpBLVpdJykKK3Nob3J0dGFnb3BlbiA9IHJlLmNvbXBpbGUoJzxbYS16QS1aXVstLmEtekEtWjAtOV0qLycpCitzaG9ydHRhZyA9IHJlLmNvbXBpbGUoJzwoW2EtekEtWl1bLS5hLXpBLVowLTldKikvKFteL10qKS8nKQorcGljbG9zZSA9IHJlLmNvbXBpbGUoJz4nKQorZW5kYnJhY2tldCA9IHJlLmNvbXBpbGUoJ1s8Pl0nKQordGFnZmluZCA9IHJlLmNvbXBpbGUoJ1thLXpBLVpdWy1fLmEtekEtWjAtOV0qJykKK2F0dHJmaW5kID0gcmUuY29tcGlsZSgKKyAgICByJ1xzKihbYS16QS1aX11bLTouYS16QS1aXzAtOV0qKShccyo9XHMqJworICAgIHInKFwnW15cJ10qXCd8IlteIl0qInxbXVtcLWEtekEtWjAtOS4vLDo7KyolPyEmJFwoXClfIz1+XCciQF0qKSk/JykKKworCitjbGFzcyBTR01MUGFyc2VFcnJvcihSdW50aW1lRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiByYWlzZWQgZm9yIGFsbCBwYXJzZSBlcnJvcnMuIiIiCisgICAgcGFzcworCisKKyMgU0dNTCBwYXJzZXIgYmFzZSBjbGFzcyAtLSBmaW5kIHRhZ3MgYW5kIGNhbGwgaGFuZGxlciBmdW5jdGlvbnMuCisjIFVzYWdlOiBwID0gU0dNTFBhcnNlcigpOyBwLmZlZWQoZGF0YSk7IC4uLjsgcC5jbG9zZSgpLgorIyBUaGUgZHRkIGlzIGRlZmluZWQgYnkgZGVyaXZpbmcgYSBjbGFzcyB3aGljaCBkZWZpbmVzIG1ldGhvZHMKKyMgd2l0aCBzcGVjaWFsIG5hbWVzIHRvIGhhbmRsZSB0YWdzOiBzdGFydF9mb28gYW5kIGVuZF9mb28gdG8gaGFuZGxlCisjIDxmb28+IGFuZCA8L2Zvbz4sIHJlc3BlY3RpdmVseSwgb3IgZG9fZm9vIHRvIGhhbmRsZSA8Zm9vPiBieSBpdHNlbGYuCisjIChUYWdzIGFyZSBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBmb3IgdGhpcyBwdXJwb3NlLikgIFRoZSBkYXRhCisjIGJldHdlZW4gdGFncyBpcyBwYXNzZWQgdG8gdGhlIHBhcnNlciBieSBjYWxsaW5nIHNlbGYuaGFuZGxlX2RhdGEoKQorIyB3aXRoIHNvbWUgZGF0YSBhcyBhcmd1bWVudCAodGhlIGRhdGEgbWF5IGJlIHNwbGl0IHVwIGluIGFyYml0cmFyeQorIyBjaHVua3MpLiAgRW50aXR5IHJlZmVyZW5jZXMgYXJlIHBhc3NlZCBieSBjYWxsaW5nCisjIHNlbGYuaGFuZGxlX2VudGl0eXJlZigpIHdpdGggdGhlIGVudGl0eSByZWZlcmVuY2UgYXMgYXJndW1lbnQuCisKK2NsYXNzIFNHTUxQYXJzZXIobWFya3VwYmFzZS5QYXJzZXJCYXNlKToKKyAgICAjIERlZmluaXRpb24gb2YgZW50aXRpZXMgLS0gZGVyaXZlZCBjbGFzc2VzIG1heSBvdmVycmlkZQorICAgIGVudGl0eV9vcl9jaGFycmVmID0gcmUuY29tcGlsZSgnJig/OicKKyAgICAgICcoW2EtekEtWl1bLS5hLXpBLVowLTldKil8IyhbMC05XSspJworICAgICAgJykoOz8pJykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPTApOgorICAgICAgICAiIiJJbml0aWFsaXplIGFuZCByZXNldCB0aGlzIGluc3RhbmNlLiIiIgorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICAiIiJSZXNldCB0aGlzIGluc3RhbmNlLiBMb3NlcyBhbGwgdW5wcm9jZXNzZWQgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fX3N0YXJ0dGFnX3RleHQgPSBOb25lCisgICAgICAgIHNlbGYucmF3ZGF0YSA9ICcnCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmxhc3R0YWcgPSAnPz8/JworICAgICAgICBzZWxmLm5vbW9yZXRhZ3MgPSAwCisgICAgICAgIHNlbGYubGl0ZXJhbCA9IDAKKyAgICAgICAgbWFya3VwYmFzZS5QYXJzZXJCYXNlLnJlc2V0KHNlbGYpCisKKyAgICBkZWYgc2V0bm9tb3JldGFncyhzZWxmKToKKyAgICAgICAgIiIiRW50ZXIgbGl0ZXJhbCBtb2RlIChDREFUQSkgdGlsbCBFT0YuCisKKyAgICAgICAgSW50ZW5kZWQgZm9yIGRlcml2ZWQgY2xhc3NlcyBvbmx5LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ub21vcmV0YWdzID0gc2VsZi5saXRlcmFsID0gMQorCisgICAgZGVmIHNldGxpdGVyYWwoc2VsZiwgKmFyZ3MpOgorICAgICAgICAiIiJFbnRlciBsaXRlcmFsIG1vZGUgKENEQVRBKS4KKworICAgICAgICBJbnRlbmRlZCBmb3IgZGVyaXZlZCBjbGFzc2VzIG9ubHkuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmxpdGVyYWwgPSAxCisKKyAgICBkZWYgZmVlZChzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiRmVlZCBzb21lIGRhdGEgdG8gdGhlIHBhcnNlci4KKworICAgICAgICBDYWxsIHRoaXMgYXMgb2Z0ZW4gYXMgeW91IHdhbnQsIHdpdGggYXMgbGl0dGxlIG9yIGFzIG11Y2ggdGV4dAorICAgICAgICBhcyB5b3Ugd2FudCAobWF5IGluY2x1ZGUgJ1xuJykuICAoVGhpcyBqdXN0IHNhdmVzIHRoZSB0ZXh0LAorICAgICAgICBhbGwgdGhlIHByb2Nlc3NpbmcgaXMgZG9uZSBieSBnb2FoZWFkKCkuKQorICAgICAgICAiIiIKKworICAgICAgICBzZWxmLnJhd2RhdGEgPSBzZWxmLnJhd2RhdGEgKyBkYXRhCisgICAgICAgIHNlbGYuZ29haGVhZCgwKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgdGhlIHJlbWFpbmluZyBkYXRhLiIiIgorICAgICAgICBzZWxmLmdvYWhlYWQoMSkKKworICAgIGRlZiBlcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcmFpc2UgU0dNTFBhcnNlRXJyb3IobWVzc2FnZSkKKworICAgICMgSW50ZXJuYWwgLS0gaGFuZGxlIGRhdGEgYXMgZmFyIGFzIHJlYXNvbmFibGUuICBNYXkgbGVhdmUgc3RhdGUKKyAgICAjIGFuZCBkYXRhIHRvIGJlIHByb2Nlc3NlZCBieSBhIHN1YnNlcXVlbnQgY2FsbC4gIElmICdlbmQnIGlzCisgICAgIyB0cnVlLCBmb3JjZSBoYW5kbGluZyBhbGwgZGF0YSBhcyBpZiBmb2xsb3dlZCBieSBFT0YgbWFya2VyLgorICAgIGRlZiBnb2FoZWFkKHNlbGYsIGVuZCk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgaSA9IDAKKyAgICAgICAgbiA9IGxlbihyYXdkYXRhKQorICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgIGlmIHNlbGYubm9tb3JldGFnczoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaTpuXSkKKyAgICAgICAgICAgICAgICBpID0gbgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBtYXRjaCA9IGludGVyZXN0aW5nLnNlYXJjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgaWYgbWF0Y2g6IGogPSBtYXRjaC5zdGFydCgpCisgICAgICAgICAgICBlbHNlOiBqID0gbgorICAgICAgICAgICAgaWYgaSA8IGo6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6al0pCisgICAgICAgICAgICBpID0gagorICAgICAgICAgICAgaWYgaSA9PSBuOiBicmVhaworICAgICAgICAgICAgaWYgcmF3ZGF0YVtpXSA9PSAnPCc6CisgICAgICAgICAgICAgICAgaWYgc3RhcnR0YWdvcGVuLm1hdGNoKHJhd2RhdGEsIGkpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaV0pCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9zdGFydHRhZyhpKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhLnN0YXJ0c3dpdGgoIjwvIiwgaSk6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2VuZHRhZyhpKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saXRlcmFsID0gMAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHNlbGYubGl0ZXJhbDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbiA+IChpICsgMSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKCI8IikKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaW5jb21wbGV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhLnN0YXJ0c3dpdGgoIjwhLS0iLCBpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU3RyaWN0bHkgc3BlYWtpbmcsIGEgY29tbWVudCBpcyAtLS4qLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2l0aGluIGEgZGVjbGFyYXRpb24gdGFnIDwhLi4uPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBzaG91bGQgYmUgcmVtb3ZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYW5kIGNvbW1lbnRzIGhhbmRsZWQgb25seSBpbiBwYXJzZV9kZWNsYXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgayA9IHNlbGYucGFyc2VfY29tbWVudChpKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiByYXdkYXRhLnN0YXJ0c3dpdGgoIjw/IiwgaSk6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX3BpKGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBpID0gaStrCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YS5zdGFydHN3aXRoKCI8ISIsIGkpOgorICAgICAgICAgICAgICAgICAgICAjIFRoaXMgaXMgc29tZSBzb3J0IG9mIGRlY2xhcmF0aW9uOyBpbiAiSFRNTCBhcworICAgICAgICAgICAgICAgICAgICAjIGRlcGxveWVkLCIgdGhpcyBzaG91bGQgb25seSBiZSB0aGUgZG9jdW1lbnQgdHlwZQorICAgICAgICAgICAgICAgICAgICAjIGRlY2xhcmF0aW9uICgiPCFET0NUWVBFIGh0bWwuLi4+IikuCisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2RlY2xhcmF0aW9uKGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiByYXdkYXRhW2ldID09ICcmJzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpXSkKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIG1hdGNoID0gY2hhcnJlZi5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfY2hhcnJlZihuYW1lKQorICAgICAgICAgICAgICAgICAgICBpID0gbWF0Y2guZW5kKDApCisgICAgICAgICAgICAgICAgICAgIGlmIHJhd2RhdGFbaS0xXSAhPSAnOyc6IGkgPSBpLTEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGVudGl0eXJlZi5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZW50aXR5cmVmKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGkgPSBtYXRjaC5lbmQoMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmF3ZGF0YVtpLTFdICE9ICc7JzogaSA9IGktMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9yKCduZWl0aGVyIDwgbm9yICYgPz8nKQorICAgICAgICAgICAgIyBXZSBnZXQgaGVyZSBvbmx5IGlmIGluY29tcGxldGUgbWF0Y2hlcyBidXQKKyAgICAgICAgICAgICMgbm90aGluZyBlbHNlCisgICAgICAgICAgICBtYXRjaCA9IGluY29tcGxldGUubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJhd2RhdGFbaV0pCisgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBqID0gbWF0Y2guZW5kKDApCisgICAgICAgICAgICBpZiBqID09IG46CisgICAgICAgICAgICAgICAgYnJlYWsgIyBSZWFsbHkgaW5jb21wbGV0ZQorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6al0pCisgICAgICAgICAgICBpID0gagorICAgICAgICAjIGVuZCB3aGlsZQorICAgICAgICBpZiBlbmQgYW5kIGkgPCBuOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2k6bl0pCisgICAgICAgICAgICBpID0gbgorICAgICAgICBzZWxmLnJhd2RhdGEgPSByYXdkYXRhW2k6XQorICAgICAgICAjIFhYWCBpZiBlbmQ6IGNoZWNrIGZvciBlbXB0eSBzdGFjaworCisgICAgIyBFeHRlbnNpb25zIGZvciB0aGUgRE9DVFlQRSBzY2FubmVyOgorICAgIF9kZWNsX290aGVyY2hhcnMgPSAnPScKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgcHJvY2Vzc2luZyBpbnN0ciwgcmV0dXJuIGxlbmd0aCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgIGRlZiBwYXJzZV9waShzZWxmLCBpKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpZiByYXdkYXRhW2k6aSsyXSAhPSAnPD8nOgorICAgICAgICAgICAgc2VsZi5lcnJvcigndW5leHBlY3RlZCBjYWxsIHRvIHBhcnNlX3BpKCknKQorICAgICAgICBtYXRjaCA9IHBpY2xvc2Uuc2VhcmNoKHJhd2RhdGEsIGkrMikKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGogPSBtYXRjaC5zdGFydCgwKQorICAgICAgICBzZWxmLmhhbmRsZV9waShyYXdkYXRhW2krMjogal0pCisgICAgICAgIGogPSBtYXRjaC5lbmQoMCkKKyAgICAgICAgcmV0dXJuIGotaQorCisgICAgZGVmIGdldF9zdGFydHRhZ190ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3N0YXJ0dGFnX3RleHQKKworICAgICMgSW50ZXJuYWwgLS0gaGFuZGxlIHN0YXJ0dGFnLCByZXR1cm4gbGVuZ3RoIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX3N0YXJ0dGFnKHNlbGYsIGkpOgorICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9IE5vbmUKKyAgICAgICAgc3RhcnRfcG9zID0gaQorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGlmIHNob3J0dGFnb3Blbi5tYXRjaChyYXdkYXRhLCBpKToKKyAgICAgICAgICAgICMgU0dNTCBzaG9ydGhhbmQ6IDx0YWcvZGF0YS8gPT0gPHRhZz5kYXRhPC90YWc+CisgICAgICAgICAgICAjIFhYWCBDYW4gZGF0YSBjb250YWluICYuLi4gKGVudGl0eSBvciBjaGFyIHJlZnMpPworICAgICAgICAgICAgIyBYWFggQ2FuIGRhdGEgY29udGFpbiA8IG9yID4gKHRhZyBjaGFyYWN0ZXJzKT8KKyAgICAgICAgICAgICMgWFhYIENhbiB0aGVyZSBiZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgZmlyc3QgLz8KKyAgICAgICAgICAgIG1hdGNoID0gc2hvcnR0YWcubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIHRhZywgZGF0YSA9IG1hdGNoLmdyb3VwKDEsIDIpCisgICAgICAgICAgICBzZWxmLl9fc3RhcnR0YWdfdGV4dCA9ICc8JXMvJyAlIHRhZworICAgICAgICAgICAgdGFnID0gdGFnLmxvd2VyKCkKKyAgICAgICAgICAgIGsgPSBtYXRjaC5lbmQoMCkKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX3Nob3J0dGFnKHRhZywgZGF0YSkKKyAgICAgICAgICAgIHNlbGYuX19zdGFydHRhZ190ZXh0ID0gcmF3ZGF0YVtzdGFydF9wb3M6bWF0Y2guZW5kKDEpICsgMV0KKyAgICAgICAgICAgIHJldHVybiBrCisgICAgICAgICMgWFhYIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHNraXAgbWF0Y2hpbmcgcXVvdGVzICgnIG9yICIpCisgICAgICAgICMgQXMgYSBzaG9ydGN1dCB3YXkgdG8gZXhpdCwgdGhpcyBpc24ndCBzbyBiYWQsIGJ1dCBzaG91bGRuJ3QKKyAgICAgICAgIyBiZSB1c2VkIHRvIGxvY2F0ZSB0aGUgYWN0dWFsIGVuZCBvZiB0aGUgc3RhcnQgdGFnIHNpbmNlIHRoZQorICAgICAgICAjIDwgb3IgPiBjaGFyYWN0ZXJzIG1heSBiZSBlbWJlZGRlZCBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUuCisgICAgICAgIG1hdGNoID0gZW5kYnJhY2tldC5zZWFyY2gocmF3ZGF0YSwgaSsxKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaiA9IG1hdGNoLnN0YXJ0KDApCisgICAgICAgICMgTm93IHBhcnNlIHRoZSBkYXRhIGJldHdlZW4gaSsxIGFuZCBqIGludG8gYSB0YWcgYW5kIGF0dHJzCisgICAgICAgIGF0dHJzID0gW10KKyAgICAgICAgaWYgcmF3ZGF0YVtpOmkrMl0gPT0gJzw+JzoKKyAgICAgICAgICAgICMgU0dNTCBzaG9ydGhhbmQ6IDw+ID09IDxsYXN0IG9wZW4gdGFnIHNlZW4+CisgICAgICAgICAgICBrID0gagorICAgICAgICAgICAgdGFnID0gc2VsZi5sYXN0dGFnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXRjaCA9IHRhZ2ZpbmQubWF0Y2gocmF3ZGF0YSwgaSsxKQorICAgICAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9zdGFydHRhZycpCisgICAgICAgICAgICBrID0gbWF0Y2guZW5kKDApCisgICAgICAgICAgICB0YWcgPSByYXdkYXRhW2krMTprXS5sb3dlcigpCisgICAgICAgICAgICBzZWxmLmxhc3R0YWcgPSB0YWcKKyAgICAgICAgd2hpbGUgayA8IGo6CisgICAgICAgICAgICBtYXRjaCA9IGF0dHJmaW5kLm1hdGNoKHJhd2RhdGEsIGspCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6IGJyZWFrCisgICAgICAgICAgICBhdHRybmFtZSwgcmVzdCwgYXR0cnZhbHVlID0gbWF0Y2guZ3JvdXAoMSwgMiwgMykKKyAgICAgICAgICAgIGlmIG5vdCByZXN0OgorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJuYW1lCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIChhdHRydmFsdWVbOjFdID09ICInIiA9PSBhdHRydmFsdWVbLTE6XSBvcgorICAgICAgICAgICAgICAgICAgICBhdHRydmFsdWVbOjFdID09ICciJyA9PSBhdHRydmFsdWVbLTE6XSk6CisgICAgICAgICAgICAgICAgICAgICMgc3RyaXAgcXVvdGVzCisgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IHNlbGYuZW50aXR5X29yX2NoYXJyZWYuc3ViKAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb252ZXJ0X3JlZiwgYXR0cnZhbHVlKQorICAgICAgICAgICAgYXR0cnMuYXBwZW5kKChhdHRybmFtZS5sb3dlcigpLCBhdHRydmFsdWUpKQorICAgICAgICAgICAgayA9IG1hdGNoLmVuZCgwKQorICAgICAgICBpZiByYXdkYXRhW2pdID09ICc+JzoKKyAgICAgICAgICAgIGogPSBqKzEKKyAgICAgICAgc2VsZi5fX3N0YXJ0dGFnX3RleHQgPSByYXdkYXRhW3N0YXJ0X3BvczpqXQorICAgICAgICBzZWxmLmZpbmlzaF9zdGFydHRhZyh0YWcsIGF0dHJzKQorICAgICAgICByZXR1cm4gagorCisgICAgIyBJbnRlcm5hbCAtLSBjb252ZXJ0IGVudGl0eSBvciBjaGFyYWN0ZXIgcmVmZXJlbmNlCisgICAgZGVmIF9jb252ZXJ0X3JlZihzZWxmLCBtYXRjaCk6CisgICAgICAgIGlmIG1hdGNoLmdyb3VwKDIpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9jaGFycmVmKG1hdGNoLmdyb3VwKDIpKSBvciBcCisgICAgICAgICAgICAgICAgJyYjJXMlcycgJSBtYXRjaC5ncm91cHMoKVsxOl0KKyAgICAgICAgZWxpZiBtYXRjaC5ncm91cCgzKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnZlcnRfZW50aXR5cmVmKG1hdGNoLmdyb3VwKDEpKSBvciBcCisgICAgICAgICAgICAgICAgJyYlczsnICUgbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJiVzJyAlIG1hdGNoLmdyb3VwKDEpCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIGVuZHRhZworICAgIGRlZiBwYXJzZV9lbmR0YWcoc2VsZiwgaSk6CisgICAgICAgIHJhd2RhdGEgPSBzZWxmLnJhd2RhdGEKKyAgICAgICAgbWF0Y2ggPSBlbmRicmFja2V0LnNlYXJjaChyYXdkYXRhLCBpKzEpCisgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgdGFnID0gcmF3ZGF0YVtpKzI6al0uc3RyaXAoKS5sb3dlcigpCisgICAgICAgIGlmIHJhd2RhdGFbal0gPT0gJz4nOgorICAgICAgICAgICAgaiA9IGorMQorICAgICAgICBzZWxmLmZpbmlzaF9lbmR0YWcodGFnKQorICAgICAgICByZXR1cm4gagorCisgICAgIyBJbnRlcm5hbCAtLSBmaW5pc2ggcGFyc2luZyBvZiA8dGFnL2RhdGEvIChzYW1lIGFzIDx0YWc+ZGF0YTwvdGFnPikKKyAgICBkZWYgZmluaXNoX3Nob3J0dGFnKHNlbGYsIHRhZywgZGF0YSk6CisgICAgICAgIHNlbGYuZmluaXNoX3N0YXJ0dGFnKHRhZywgW10pCisgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgc2VsZi5maW5pc2hfZW5kdGFnKHRhZykKKworICAgICMgSW50ZXJuYWwgLS0gZmluaXNoIHByb2Nlc3Npbmcgb2Ygc3RhcnQgdGFnCisgICAgIyBSZXR1cm4gLTEgZm9yIHVua25vd24gdGFnLCAwIGZvciBvcGVuLW9ubHkgdGFnLCAxIGZvciBiYWxhbmNlZCB0YWcKKyAgICBkZWYgZmluaXNoX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdzdGFydF8nICsgdGFnKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnZG9fJyArIHRhZykKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fc3RhcnR0YWcodGFnLCBhdHRycykKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhcnR0YWcodGFnLCBtZXRob2QsIGF0dHJzKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZCh0YWcpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9zdGFydHRhZyh0YWcsIG1ldGhvZCwgYXR0cnMpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgIyBJbnRlcm5hbCAtLSBmaW5pc2ggcHJvY2Vzc2luZyBvZiBlbmQgdGFnCisgICAgZGVmIGZpbmlzaF9lbmR0YWcoc2VsZiwgdGFnKToKKyAgICAgICAgaWYgbm90IHRhZzoKKyAgICAgICAgICAgIGZvdW5kID0gbGVuKHNlbGYuc3RhY2spIC0gMQorICAgICAgICAgICAgaWYgZm91bmQgPCAwOgorICAgICAgICAgICAgICAgIHNlbGYudW5rbm93bl9lbmR0YWcodGFnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdGFnIG5vdCBpbiBzZWxmLnN0YWNrOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnZW5kXycgKyB0YWcpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fZW5kdGFnKHRhZykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydF91bmJhbGFuY2VkKHRhZykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZvdW5kID0gbGVuKHNlbGYuc3RhY2spCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShmb3VuZCk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zdGFja1tpXSA9PSB0YWc6IGZvdW5kID0gaQorICAgICAgICB3aGlsZSBsZW4oc2VsZi5zdGFjaykgPiBmb3VuZDoKKyAgICAgICAgICAgIHRhZyA9IHNlbGYuc3RhY2tbLTFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnZW5kXycgKyB0YWcpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gTm9uZQorICAgICAgICAgICAgaWYgbWV0aG9kOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2VuZHRhZyh0YWcsIG1ldGhvZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi51bmtub3duX2VuZHRhZyh0YWcpCisgICAgICAgICAgICBkZWwgc2VsZi5zdGFja1stMV0KKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIHN0YXJ0IHRhZworICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgdGFnLCBtZXRob2QsIGF0dHJzKToKKyAgICAgICAgbWV0aG9kKGF0dHJzKQorCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgZW5kIHRhZworICAgIGRlZiBoYW5kbGVfZW5kdGFnKHNlbGYsIHRhZywgbWV0aG9kKToKKyAgICAgICAgbWV0aG9kKCkKKworICAgICMgRXhhbXBsZSAtLSByZXBvcnQgYW4gdW5iYWxhbmNlZCA8Ly4uLj4gdGFnLgorICAgIGRlZiByZXBvcnRfdW5iYWxhbmNlZChzZWxmLCB0YWcpOgorICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnKioqIFVuYmFsYW5jZWQgPC8nICsgdGFnICsgJz4nCisgICAgICAgICAgICBwcmludCAnKioqIFN0YWNrOicsIHNlbGYuc3RhY2sKKworICAgIGRlZiBjb252ZXJ0X2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIkNvbnZlcnQgY2hhcmFjdGVyIHJlZmVyZW5jZSwgbWF5IGJlIG92ZXJyaWRkZW4uIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG4gPSBpbnQobmFtZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IDAgPD0gbiA8PSAxMjc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9jb2RlcG9pbnQobikKKworICAgIGRlZiBjb252ZXJ0X2NvZGVwb2ludChzZWxmLCBjb2RlcG9pbnQpOgorICAgICAgICByZXR1cm4gY2hyKGNvZGVwb2ludCkKKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiSGFuZGxlIGNoYXJhY3RlciByZWZlcmVuY2UsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCisgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5jb252ZXJ0X2NoYXJyZWYobmFtZSkKKyAgICAgICAgaWYgcmVwbGFjZW1lbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudW5rbm93bl9jaGFycmVmKG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKHJlcGxhY2VtZW50KQorCisgICAgIyBEZWZpbml0aW9uIG9mIGVudGl0aWVzIC0tIGRlcml2ZWQgY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKyAgICBlbnRpdHlkZWZzID0gXAorICAgICAgICAgICAgeydsdCc6ICc8JywgJ2d0JzogJz4nLCAnYW1wJzogJyYnLCAncXVvdCc6ICciJywgJ2Fwb3MnOiAnXCcnfQorCisgICAgZGVmIGNvbnZlcnRfZW50aXR5cmVmKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJDb252ZXJ0IGVudGl0eSByZWZlcmVuY2VzLgorCisgICAgICAgIEFzIGFuIGFsdGVybmF0aXZlIHRvIG92ZXJyaWRpbmcgdGhpcyBtZXRob2Q7IG9uZSBjYW4gdGFpbG9yIHRoZQorICAgICAgICByZXN1bHRzIGJ5IHNldHRpbmcgdXAgdGhlIHNlbGYuZW50aXR5ZGVmcyBtYXBwaW5nIGFwcHJvcHJpYXRlbHkuCisgICAgICAgICIiIgorICAgICAgICB0YWJsZSA9IHNlbGYuZW50aXR5ZGVmcworICAgICAgICBpZiBuYW1lIGluIHRhYmxlOgorICAgICAgICAgICAgcmV0dXJuIHRhYmxlW25hbWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4KKworICAgIGRlZiBoYW5kbGVfZW50aXR5cmVmKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJIYW5kbGUgZW50aXR5IHJlZmVyZW5jZXMsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCisgICAgICAgIHJlcGxhY2VtZW50ID0gc2VsZi5jb252ZXJ0X2VudGl0eXJlZihuYW1lKQorICAgICAgICBpZiByZXBsYWNlbWVudCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi51bmtub3duX2VudGl0eXJlZihuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyZXBsYWNlbWVudCkKKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgZGF0YSwgc2hvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgY29tbWVudCwgY291bGQgYmUgb3ZlcnJpZGRlbgorICAgIGRlZiBoYW5kbGVfY29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSBkZWNsYXJhdGlvbiwgY291bGQgYmUgb3ZlcnJpZGRlbgorICAgIGRlZiBoYW5kbGVfZGVjbChzZWxmLCBkZWNsKToKKyAgICAgICAgcGFzcworCisgICAgIyBFeGFtcGxlIC0tIGhhbmRsZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLCBjb3VsZCBiZSBvdmVycmlkZGVuCisgICAgZGVmIGhhbmRsZV9waShzZWxmLCBkYXRhKToKKyAgICAgICAgcGFzcworCisgICAgIyBUbyBiZSBvdmVycmlkZGVuIC0tIGhhbmRsZXJzIGZvciB1bmtub3duIG9iamVjdHMKKyAgICBkZWYgdW5rbm93bl9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKTogcGFzcworICAgIGRlZiB1bmtub3duX2VuZHRhZyhzZWxmLCB0YWcpOiBwYXNzCisgICAgZGVmIHVua25vd25fY2hhcnJlZihzZWxmLCByZWYpOiBwYXNzCisgICAgZGVmIHVua25vd25fZW50aXR5cmVmKHNlbGYsIHJlZik6IHBhc3MKKworCitjbGFzcyBUZXN0U0dNTFBhcnNlcihTR01MUGFyc2VyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPTApOgorICAgICAgICBzZWxmLnRlc3RkYXRhID0gIiIKKyAgICAgICAgU0dNTFBhcnNlci5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorCisgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnRlc3RkYXRhID0gc2VsZi50ZXN0ZGF0YSArIGRhdGEKKyAgICAgICAgaWYgbGVuKHJlcHIoc2VsZi50ZXN0ZGF0YSkpID49IDcwOgorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGRhdGEgPSBzZWxmLnRlc3RkYXRhCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBzZWxmLnRlc3RkYXRhID0gIiIKKyAgICAgICAgICAgIHByaW50ICdkYXRhOicsIHJlcHIoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfY29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHIgPSByZXByKGRhdGEpCisgICAgICAgIGlmIGxlbihyKSA+IDY4OgorICAgICAgICAgICAgciA9IHJbOjMyXSArICcuLi4nICsgclstMzI6XQorICAgICAgICBwcmludCAnY29tbWVudDonLCByCisKKyAgICBkZWYgdW5rbm93bl9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIGlmIG5vdCBhdHRyczoKKyAgICAgICAgICAgIHByaW50ICdzdGFydCB0YWc6IDwnICsgdGFnICsgJz4nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnc3RhcnQgdGFnOiA8JyArIHRhZywKKyAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBhdHRyczoKKyAgICAgICAgICAgICAgICBwcmludCBuYW1lICsgJz0nICsgJyInICsgdmFsdWUgKyAnIicsCisgICAgICAgICAgICBwcmludCAnPicKKworICAgIGRlZiB1bmtub3duX2VuZHRhZyhzZWxmLCB0YWcpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcHJpbnQgJ2VuZCB0YWc6IDwvJyArIHRhZyArICc+JworCisgICAgZGVmIHVua25vd25fZW50aXR5cmVmKHNlbGYsIHJlZik6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAnKioqIHVua25vd24gZW50aXR5IHJlZjogJicgKyByZWYgKyAnOycKKworICAgIGRlZiB1bmtub3duX2NoYXJyZWYoc2VsZiwgcmVmKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHByaW50ICcqKiogdW5rbm93biBjaGFyIHJlZjogJiMnICsgcmVmICsgJzsnCisKKyAgICBkZWYgdW5rbm93bl9kZWNsKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcHJpbnQgJyoqKiB1bmtub3duIGRlY2w6IFsnICsgZGF0YSArICddJworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBTR01MUGFyc2VyLmNsb3NlKHNlbGYpCisgICAgICAgIHNlbGYuZmx1c2goKQorCisKK2RlZiB0ZXN0KGFyZ3MgPSBOb25lKToKKyAgICBpbXBvcnQgc3lzCisKKyAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKworICAgIGlmIGFyZ3MgYW5kIGFyZ3NbMF0gPT0gJy1zJzoKKyAgICAgICAgYXJncyA9IGFyZ3NbMTpdCisgICAgICAgIGtsYXNzID0gU0dNTFBhcnNlcgorICAgIGVsc2U6CisgICAgICAgIGtsYXNzID0gVGVzdFNHTUxQYXJzZXIKKworICAgIGlmIGFyZ3M6CisgICAgICAgIGZpbGUgPSBhcmdzWzBdCisgICAgZWxzZToKKyAgICAgICAgZmlsZSA9ICd0ZXN0Lmh0bWwnCisKKyAgICBpZiBmaWxlID09ICctJzoKKyAgICAgICAgZiA9IHN5cy5zdGRpbgorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKGZpbGUsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50IGZpbGUsICI6IiwgbXNnCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgZGF0YSA9IGYucmVhZCgpCisgICAgaWYgZiBpcyBub3Qgc3lzLnN0ZGluOgorICAgICAgICBmLmNsb3NlKCkKKworICAgIHggPSBrbGFzcygpCisgICAgZm9yIGMgaW4gZGF0YToKKyAgICAgICAgeC5mZWVkKGMpCisgICAgeC5jbG9zZSgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2dtbGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3NnbWxsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGY2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NnbWxsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2dtbGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3NnbWxsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMGY2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NnbWxsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2hhLnB5IGIvbGliL3B5dGhvbjIuNy9zaGEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFkZGU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2hhLnB5CkBAIC0wLDAgKzEsMTUgQEAKKyMgJElkJAorIworIyAgQ29weXJpZ2h0IChDKSAyMDA1ICAgR3JlZ29yeSBQLiBTbWl0aCAoZ3JlZ0BrcnlwdG8ub3JnKQorIyAgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLndhcm4oInRoZSBzaGEgbW9kdWxlIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgaGFzaGxpYiBtb2R1bGUgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorCitmcm9tIGhhc2hsaWIgaW1wb3J0IHNoYTEgYXMgc2hhCituZXcgPSBzaGEKKworYmxvY2tzaXplID0gMSAgICAgICAgIyBsZWdhY3kgdmFsdWUgKHdyb25nIGluIGFueSB1c2VmdWwgc2Vuc2UpCitkaWdlc3Rfc2l6ZSA9IDIwCitkaWdlc3RzaXplID0gMjAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2hhLnB5YyBiL2xpYi9weXRob24yLjcvc2hhLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U4ZGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaGEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2hhLnB5byBiL2xpYi9weXRob24yLjcvc2hhLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2U4ZGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaGEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2hlbHZlLnB5IGIvbGliL3B5dGhvbjIuNy9zaGVsdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjYmE4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2hlbHZlLnB5CkBAIC0wLDAgKzEsMjM5IEBACisiIiJNYW5hZ2Ugc2hlbHZlcyBvZiBwaWNrbGVkIG9iamVjdHMuCisKK0EgInNoZWxmIiBpcyBhIHBlcnNpc3RlbnQsIGRpY3Rpb25hcnktbGlrZSBvYmplY3QuICBUaGUgZGlmZmVyZW5jZQord2l0aCBkYm0gZGF0YWJhc2VzIGlzIHRoYXQgdGhlIHZhbHVlcyAobm90IHRoZSBrZXlzISkgaW4gYSBzaGVsZiBjYW4KK2JlIGVzc2VudGlhbGx5IGFyYml0cmFyeSBQeXRob24gb2JqZWN0cyAtLSBhbnl0aGluZyB0aGF0IHRoZSAicGlja2xlIgorbW9kdWxlIGNhbiBoYW5kbGUuICBUaGlzIGluY2x1ZGVzIG1vc3QgY2xhc3MgaW5zdGFuY2VzLCByZWN1cnNpdmUgZGF0YQordHlwZXMsIGFuZCBvYmplY3RzIGNvbnRhaW5pbmcgbG90cyBvZiBzaGFyZWQgc3ViLW9iamVjdHMuICBUaGUga2V5cworYXJlIG9yZGluYXJ5IHN0cmluZ3MuCisKK1RvIHN1bW1hcml6ZSB0aGUgaW50ZXJmYWNlIChrZXkgaXMgYSBzdHJpbmcsIGRhdGEgaXMgYW4gYXJiaXRyYXJ5CitvYmplY3QpOgorCisgICAgICAgIGltcG9ydCBzaGVsdmUKKyAgICAgICAgZCA9IHNoZWx2ZS5vcGVuKGZpbGVuYW1lKSAjIG9wZW4sIHdpdGggKGcpZGJtIGZpbGVuYW1lIC0tIG5vIHN1ZmZpeAorCisgICAgICAgIGRba2V5XSA9IGRhdGEgICAjIHN0b3JlIGRhdGEgYXQga2V5IChvdmVyd3JpdGVzIG9sZCBkYXRhIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAjIHVzaW5nIGFuIGV4aXN0aW5nIGtleSkKKyAgICAgICAgZGF0YSA9IGRba2V5XSAgICMgcmV0cmlldmUgYSBDT1BZIG9mIHRoZSBkYXRhIGF0IGtleSAocmFpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgS2V5RXJyb3IgaWYgbm8gc3VjaCBrZXkpIC0tIE5PVEUgdGhhdCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAjIGFjY2VzcyByZXR1cm5zIGEgKmNvcHkqIG9mIHRoZSBlbnRyeSEKKyAgICAgICAgZGVsIGRba2V5XSAgICAgICMgZGVsZXRlIGRhdGEgc3RvcmVkIGF0IGtleSAocmFpc2VzIEtleUVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vIHN1Y2gga2V5KQorICAgICAgICBmbGFnID0gZC5oYXNfa2V5KGtleSkgICAjIHRydWUgaWYgdGhlIGtleSBleGlzdHM7IHNhbWUgYXMgImtleSBpbiBkIgorICAgICAgICBsaXN0ID0gZC5rZXlzKCkgIyBhIGxpc3Qgb2YgYWxsIGV4aXN0aW5nIGtleXMgKHNsb3chKQorCisgICAgICAgIGQuY2xvc2UoKSAgICAgICAjIGNsb3NlIGl0CisKK0RlcGVuZGVudCBvbiB0aGUgaW1wbGVtZW50YXRpb24sIGNsb3NpbmcgYSBwZXJzaXN0ZW50IGRpY3Rpb25hcnkgbWF5CitvciBtYXkgbm90IGJlIG5lY2Vzc2FyeSB0byBmbHVzaCBjaGFuZ2VzIHRvIGRpc2suCisKK05vcm1hbGx5LCBkW2tleV0gcmV0dXJucyBhIENPUFkgb2YgdGhlIGVudHJ5LiAgVGhpcyBuZWVkcyBjYXJlIHdoZW4KK211dGFibGUgZW50cmllcyBhcmUgbXV0YXRlZDogZm9yIGV4YW1wbGUsIGlmIGRba2V5XSBpcyBhIGxpc3QsCisgICAgICAgIGRba2V5XS5hcHBlbmQoYW5pdGVtKQorZG9lcyBOT1QgbW9kaWZ5IHRoZSBlbnRyeSBkW2tleV0gaXRzZWxmLCBhcyBzdG9yZWQgaW4gdGhlIHBlcnNpc3RlbnQKK21hcHBpbmcgLS0gaXQgb25seSBtb2RpZmllcyB0aGUgY29weSwgd2hpY2ggaXMgdGhlbiBpbW1lZGlhdGVseQorZGlzY2FyZGVkLCBzbyB0aGF0IHRoZSBhcHBlbmQgaGFzIE5PIGVmZmVjdCB3aGF0c29ldmVyLiAgVG8gYXBwZW5kIGFuCitpdGVtIHRvIGRba2V5XSBpbiBhIHdheSB0aGF0IHdpbGwgYWZmZWN0IHRoZSBwZXJzaXN0ZW50IG1hcHBpbmcsIHVzZToKKyAgICAgICAgZGF0YSA9IGRba2V5XQorICAgICAgICBkYXRhLmFwcGVuZChhbml0ZW0pCisgICAgICAgIGRba2V5XSA9IGRhdGEKKworVG8gYXZvaWQgdGhlIHByb2JsZW0gd2l0aCBtdXRhYmxlIGVudHJpZXMsIHlvdSBtYXkgcGFzcyB0aGUga2V5d29yZAorYXJndW1lbnQgd3JpdGViYWNrPVRydWUgaW4gdGhlIGNhbGwgdG8gc2hlbHZlLm9wZW4uICBXaGVuIHlvdSB1c2U6CisgICAgICAgIGQgPSBzaGVsdmUub3BlbihmaWxlbmFtZSwgd3JpdGViYWNrPVRydWUpCit0aGVuIGQga2VlcHMgYSBjYWNoZSBvZiBhbGwgZW50cmllcyB5b3UgYWNjZXNzLCBhbmQgd3JpdGVzIHRoZW0gYWxsIGJhY2sKK3RvIHRoZSBwZXJzaXN0ZW50IG1hcHBpbmcgd2hlbiB5b3UgY2FsbCBkLmNsb3NlKCkuICBUaGlzIGVuc3VyZXMgdGhhdAorc3VjaCB1c2FnZSBhcyBkW2tleV0uYXBwZW5kKGFuaXRlbSkgd29ya3MgYXMgaW50ZW5kZWQuCisKK0hvd2V2ZXIsIHVzaW5nIGtleXdvcmQgYXJndW1lbnQgd3JpdGViYWNrPVRydWUgbWF5IGNvbnN1bWUgdmFzdCBhbW91bnQKK29mIG1lbW9yeSBmb3IgdGhlIGNhY2hlLCBhbmQgaXQgbWF5IG1ha2UgZC5jbG9zZSgpIHZlcnkgc2xvdywgaWYgeW91CithY2Nlc3MgbWFueSBvZiBkJ3MgZW50cmllcyBhZnRlciBvcGVuaW5nIGl0IGluIHRoaXMgd2F5OiBkIGhhcyBubyB3YXkgdG8KK2NoZWNrIHdoaWNoIG9mIHRoZSBlbnRyaWVzIHlvdSBhY2Nlc3MgYXJlIG11dGFibGUgYW5kL29yIHdoaWNoIG9uZXMgeW91CithY3R1YWxseSBtdXRhdGUsIHNvIGl0IG11c3QgY2FjaGUsIGFuZCB3cml0ZSBiYWNrIGF0IGNsb3NlLCBhbGwgb2YgdGhlCitlbnRyaWVzIHRoYXQgeW91IGFjY2Vzcy4gIFlvdSBjYW4gY2FsbCBkLnN5bmMoKSB0byB3cml0ZSBiYWNrIGFsbCB0aGUKK2VudHJpZXMgaW4gdGhlIGNhY2hlLCBhbmQgZW1wdHkgdGhlIGNhY2hlIChkLnN5bmMoKSBhbHNvIHN5bmNocm9uaXplcwordGhlIHBlcnNpc3RlbnQgZGljdGlvbmFyeSBvbiBkaXNrLCBpZiBmZWFzaWJsZSkuCisiIiIKKworIyBUcnkgdXNpbmcgY1BpY2tsZSBhbmQgY1N0cmluZ0lPIGlmIGF2YWlsYWJsZS4KKwordHJ5OgorICAgIGZyb20gY1BpY2tsZSBpbXBvcnQgUGlja2xlciwgVW5waWNrbGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBwaWNrbGUgaW1wb3J0IFBpY2tsZXIsIFVucGlja2xlcgorCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworaW1wb3J0IFVzZXJEaWN0CisKK19fYWxsX18gPSBbIlNoZWxmIiwiQnNkRGJTaGVsZiIsIkRiZmlsZW5hbWVTaGVsZiIsIm9wZW4iXQorCitjbGFzcyBfQ2xvc2VkRGljdChVc2VyRGljdC5EaWN0TWl4aW4pOgorICAgICdNYXJrZXIgZm9yIGEgY2xvc2VkIGRpY3QuICBBY2Nlc3MgYXR0ZW1wdHMgcmFpc2UgYSBWYWx1ZUVycm9yLicKKworICAgIGRlZiBjbG9zZWQoc2VsZiwgKmFyZ3MpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbnZhbGlkIG9wZXJhdGlvbiBvbiBjbG9zZWQgc2hlbGYnKQorICAgIF9fZ2V0aXRlbV9fID0gX19zZXRpdGVtX18gPSBfX2RlbGl0ZW1fXyA9IGtleXMgPSBjbG9zZWQKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8Q2xvc2VkIERpY3Rpb25hcnk+JworCitjbGFzcyBTaGVsZihVc2VyRGljdC5EaWN0TWl4aW4pOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIHNoZWxmIGltcGxlbWVudGF0aW9ucy4KKworICAgIFRoaXMgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIGRpY3Rpb25hcnktbGlrZSBvYmplY3QuCisgICAgU2VlIHRoZSBtb2R1bGUncyBfX2RvY19fIHN0cmluZyBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIGludGVyZmFjZS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaWN0LCBwcm90b2NvbD1Ob25lLCB3cml0ZWJhY2s9RmFsc2UpOgorICAgICAgICBzZWxmLmRpY3QgPSBkaWN0CisgICAgICAgIGlmIHByb3RvY29sIGlzIE5vbmU6CisgICAgICAgICAgICBwcm90b2NvbCA9IDAKKyAgICAgICAgc2VsZi5fcHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICBzZWxmLndyaXRlYmFjayA9IHdyaXRlYmFjaworICAgICAgICBzZWxmLmNhY2hlID0ge30KKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kaWN0LmtleXMoKQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5kaWN0KQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLmRpY3QKKworICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIGtleSBpbiBzZWxmLmRpY3QKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCBkZWZhdWx0PU5vbmUpOgorICAgICAgICBpZiBrZXkgaW4gc2VsZi5kaWN0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGZba2V5XQorICAgICAgICByZXR1cm4gZGVmYXVsdAorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gc2VsZi5jYWNoZVtrZXldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGYgPSBTdHJpbmdJTyhzZWxmLmRpY3Rba2V5XSkKKyAgICAgICAgICAgIHZhbHVlID0gVW5waWNrbGVyKGYpLmxvYWQoKQorICAgICAgICAgICAgaWYgc2VsZi53cml0ZWJhY2s6CisgICAgICAgICAgICAgICAgc2VsZi5jYWNoZVtrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIGlmIHNlbGYud3JpdGViYWNrOgorICAgICAgICAgICAgc2VsZi5jYWNoZVtrZXldID0gdmFsdWUKKyAgICAgICAgZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgcCA9IFBpY2tsZXIoZiwgc2VsZi5fcHJvdG9jb2wpCisgICAgICAgIHAuZHVtcCh2YWx1ZSkKKyAgICAgICAgc2VsZi5kaWN0W2tleV0gPSBmLmdldHZhbHVlKCkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBkZWwgc2VsZi5kaWN0W2tleV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuY2FjaGVba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuc3luYygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGljdC5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBDYXRjaCBlcnJvcnMgdGhhdCBtYXkgaGFwcGVuIHdoZW4gY2xvc2UgaXMgY2FsbGVkIGZyb20gX19kZWxfXworICAgICAgICAjIGJlY2F1c2UgQ1B5dGhvbiBpcyBpbiBpbnRlcnByZXRlciBzaHV0ZG93bi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kaWN0ID0gX0Nsb3NlZERpY3QoKQorICAgICAgICBleGNlcHQgKE5hbWVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNlbGYuZGljdCA9IE5vbmUKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnd3JpdGViYWNrJyk6CisgICAgICAgICAgICAjIF9faW5pdF9fIGRpZG4ndCBzdWNjZWVkLCBzbyBkb24ndCBib3RoZXIgY2xvc2luZworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIHN5bmMoc2VsZik6CisgICAgICAgIGlmIHNlbGYud3JpdGViYWNrIGFuZCBzZWxmLmNhY2hlOgorICAgICAgICAgICAgc2VsZi53cml0ZWJhY2sgPSBGYWxzZQorICAgICAgICAgICAgZm9yIGtleSwgZW50cnkgaW4gc2VsZi5jYWNoZS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZWxmW2tleV0gPSBlbnRyeQorICAgICAgICAgICAgc2VsZi53cml0ZWJhY2sgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmNhY2hlID0ge30KKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmRpY3QsICdzeW5jJyk6CisgICAgICAgICAgICBzZWxmLmRpY3Quc3luYygpCisKKworY2xhc3MgQnNkRGJTaGVsZihTaGVsZik6CisgICAgIiIiU2hlbGYgaW1wbGVtZW50YXRpb24gdXNpbmcgdGhlICJCU0QiIGRiIGludGVyZmFjZS4KKworICAgIFRoaXMgYWRkcyBtZXRob2RzIGZpcnN0KCksIG5leHQoKSwgcHJldmlvdXMoKSwgbGFzdCgpIGFuZAorICAgIHNldF9sb2NhdGlvbigpIHRoYXQgaGF2ZSBubyBjb3VudGVycGFydCBpbiBbZ11kYm0gZGF0YWJhc2VzLgorCisgICAgVGhlIGFjdHVhbCBkYXRhYmFzZSBtdXN0IGJlIG9wZW5lZCB1c2luZyBvbmUgb2YgdGhlICJic2RkYiIKKyAgICBtb2R1bGVzICJvcGVuIiByb3V0aW5lcyAoaS5lLiBic2RkYi5oYXNob3BlbiwgYnNkZGIuYnRvcGVuIG9yCisgICAgYnNkZGIucm5vcGVuKSBhbmQgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKworICAgIFNlZSB0aGUgbW9kdWxlJ3MgX19kb2NfXyBzdHJpbmcgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBpbnRlcmZhY2UuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGljdCwgcHJvdG9jb2w9Tm9uZSwgd3JpdGViYWNrPUZhbHNlKToKKyAgICAgICAgU2hlbGYuX19pbml0X18oc2VsZiwgZGljdCwgcHJvdG9jb2wsIHdyaXRlYmFjaykKKworICAgIGRlZiBzZXRfbG9jYXRpb24oc2VsZiwga2V5KToKKyAgICAgICAgKGtleSwgdmFsdWUpID0gc2VsZi5kaWN0LnNldF9sb2NhdGlvbihrZXkpCisgICAgICAgIGYgPSBTdHJpbmdJTyh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIChrZXksIFVucGlja2xlcihmKS5sb2FkKCkpCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgKGtleSwgdmFsdWUpID0gc2VsZi5kaWN0Lm5leHQoKQorICAgICAgICBmID0gU3RyaW5nSU8odmFsdWUpCisgICAgICAgIHJldHVybiAoa2V5LCBVbnBpY2tsZXIoZikubG9hZCgpKQorCisgICAgZGVmIHByZXZpb3VzKHNlbGYpOgorICAgICAgICAoa2V5LCB2YWx1ZSkgPSBzZWxmLmRpY3QucHJldmlvdXMoKQorICAgICAgICBmID0gU3RyaW5nSU8odmFsdWUpCisgICAgICAgIHJldHVybiAoa2V5LCBVbnBpY2tsZXIoZikubG9hZCgpKQorCisgICAgZGVmIGZpcnN0KHNlbGYpOgorICAgICAgICAoa2V5LCB2YWx1ZSkgPSBzZWxmLmRpY3QuZmlyc3QoKQorICAgICAgICBmID0gU3RyaW5nSU8odmFsdWUpCisgICAgICAgIHJldHVybiAoa2V5LCBVbnBpY2tsZXIoZikubG9hZCgpKQorCisgICAgZGVmIGxhc3Qoc2VsZik6CisgICAgICAgIChrZXksIHZhbHVlKSA9IHNlbGYuZGljdC5sYXN0KCkKKyAgICAgICAgZiA9IFN0cmluZ0lPKHZhbHVlKQorICAgICAgICByZXR1cm4gKGtleSwgVW5waWNrbGVyKGYpLmxvYWQoKSkKKworCitjbGFzcyBEYmZpbGVuYW1lU2hlbGYoU2hlbGYpOgorICAgICIiIlNoZWxmIGltcGxlbWVudGF0aW9uIHVzaW5nIHRoZSAiYW55ZGJtIiBnZW5lcmljIGRibSBpbnRlcmZhY2UuCisKKyAgICBUaGlzIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGZpbGVuYW1lIGZvciB0aGUgZGJtIGRhdGFiYXNlLgorICAgIFNlZSB0aGUgbW9kdWxlJ3MgX19kb2NfXyBzdHJpbmcgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBpbnRlcmZhY2UuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUsIGZsYWc9J2MnLCBwcm90b2NvbD1Ob25lLCB3cml0ZWJhY2s9RmFsc2UpOgorICAgICAgICBpbXBvcnQgYW55ZGJtCisgICAgICAgIFNoZWxmLl9faW5pdF9fKHNlbGYsIGFueWRibS5vcGVuKGZpbGVuYW1lLCBmbGFnKSwgcHJvdG9jb2wsIHdyaXRlYmFjaykKKworCitkZWYgb3BlbihmaWxlbmFtZSwgZmxhZz0nYycsIHByb3RvY29sPU5vbmUsIHdyaXRlYmFjaz1GYWxzZSk6CisgICAgIiIiT3BlbiBhIHBlcnNpc3RlbnQgZGljdGlvbmFyeSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZy4KKworICAgIFRoZSBmaWxlbmFtZSBwYXJhbWV0ZXIgaXMgdGhlIGJhc2UgZmlsZW5hbWUgZm9yIHRoZSB1bmRlcmx5aW5nCisgICAgZGF0YWJhc2UuICBBcyBhIHNpZGUtZWZmZWN0LCBhbiBleHRlbnNpb24gbWF5IGJlIGFkZGVkIHRvIHRoZQorICAgIGZpbGVuYW1lIGFuZCBtb3JlIHRoYW4gb25lIGZpbGUgbWF5IGJlIGNyZWF0ZWQuICBUaGUgb3B0aW9uYWwgZmxhZworICAgIHBhcmFtZXRlciBoYXMgdGhlIHNhbWUgaW50ZXJwcmV0YXRpb24gYXMgdGhlIGZsYWcgcGFyYW1ldGVyIG9mCisgICAgYW55ZGJtLm9wZW4oKS4gVGhlIG9wdGlvbmFsIHByb3RvY29sIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlCisgICAgdmVyc2lvbiBvZiB0aGUgcGlja2xlIHByb3RvY29sICgwLCAxLCBvciAyKS4KKworICAgIFNlZSB0aGUgbW9kdWxlJ3MgX19kb2NfXyBzdHJpbmcgZm9yIGFuIG92ZXJ2aWV3IG9mIHRoZSBpbnRlcmZhY2UuCisgICAgIiIiCisKKyAgICByZXR1cm4gRGJmaWxlbmFtZVNoZWxmKGZpbGVuYW1lLCBmbGFnLCBwcm90b2NvbCwgd3JpdGViYWNrKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGVsdmUucHljIGIvbGliL3B5dGhvbjIuNy9zaGVsdmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTkxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NoZWx2ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGVsdmUucHlvIGIvbGliL3B5dGhvbjIuNy9zaGVsdmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTkxZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NoZWx2ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGxleC5weSBiL2xpYi9weXRob24yLjcvc2hsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdjOGFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2hsZXgucHkKQEAgLTAsMCArMSwyOTIgQEAKKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KKyIiIkEgbGV4aWNhbCBhbmFseXplciBjbGFzcyBmb3Igc2ltcGxlIHNoZWxsLWxpa2Ugc3ludGF4ZXMuIiIiCisKKyMgTW9kdWxlIGFuZCBkb2N1bWVudGF0aW9uIGJ5IEVyaWMgUy4gUmF5bW9uZCwgMjEgRGVjIDE5OTgKKyMgSW5wdXQgc3RhY2tpbmcgYW5kIGVycm9yIG1lc3NhZ2UgY2xlYW51cCBhZGRlZCBieSBFU1IsIE1hcmNoIDIwMDAKKyMgcHVzaF9zb3VyY2UoKSBhbmQgcG9wX3NvdXJjZSgpIG1hZGUgZXhwbGljaXQgYnkgRVNSLCBKYW51YXJ5IDIwMDEuCisjIFBvc2l4IGNvbXBsaWFuY2UsIHNwbGl0KCksIHN0cmluZyBhcmd1bWVudHMsIGFuZAorIyBpdGVyYXRvciBpbnRlcmZhY2UgYnkgR3VzdGF2byBOaWVtZXllciwgQXByaWwgMjAwMy4KKworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzeXMKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCisKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitfX2FsbF9fID0gWyJzaGxleCIsICJzcGxpdCJdCisKK2NsYXNzIHNobGV4OgorICAgICJBIGxleGljYWwgYW5hbHl6ZXIgY2xhc3MgZm9yIHNpbXBsZSBzaGVsbC1saWtlIHN5bnRheGVzLiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW5zdHJlYW09Tm9uZSwgaW5maWxlPU5vbmUsIHBvc2l4PUZhbHNlKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShpbnN0cmVhbSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBpbnN0cmVhbSA9IFN0cmluZ0lPKGluc3RyZWFtKQorICAgICAgICBpZiBpbnN0cmVhbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBpbnN0cmVhbQorICAgICAgICAgICAgc2VsZi5pbmZpbGUgPSBpbmZpbGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0gPSBzeXMuc3RkaW4KKyAgICAgICAgICAgIHNlbGYuaW5maWxlID0gTm9uZQorICAgICAgICBzZWxmLnBvc2l4ID0gcG9zaXgKKyAgICAgICAgaWYgcG9zaXg6CisgICAgICAgICAgICBzZWxmLmVvZiA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW9mID0gJycKKyAgICAgICAgc2VsZi5jb21tZW50ZXJzID0gJyMnCisgICAgICAgIHNlbGYud29yZGNoYXJzID0gKCdhYmNkZmVnaGlqa2xtbm9wcXJzdHV2d3h5eicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OV8nKQorICAgICAgICBpZiBzZWxmLnBvc2l4OgorICAgICAgICAgICAgc2VsZi53b3JkY2hhcnMgKz0gKCff4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb4+fr7/P3+/ycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnwMHCw8TFxsfIycrLzM3Oz9DR0tPU1dbY2drb3N3eJykKKyAgICAgICAgc2VsZi53aGl0ZXNwYWNlID0gJyBcdFxyXG4nCisgICAgICAgIHNlbGYud2hpdGVzcGFjZV9zcGxpdCA9IEZhbHNlCisgICAgICAgIHNlbGYucXVvdGVzID0gJ1wnIicKKyAgICAgICAgc2VsZi5lc2NhcGUgPSAnXFwnCisgICAgICAgIHNlbGYuZXNjYXBlZHF1b3RlcyA9ICciJworICAgICAgICBzZWxmLnN0YXRlID0gJyAnCisgICAgICAgIHNlbGYucHVzaGJhY2sgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYubGluZW5vID0gMQorICAgICAgICBzZWxmLmRlYnVnID0gMAorICAgICAgICBzZWxmLnRva2VuID0gJycKKyAgICAgICAgc2VsZi5maWxlc3RhY2sgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYuc291cmNlID0gTm9uZQorICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgcHJpbnQgJ3NobGV4OiByZWFkaW5nIGZyb20gJXMsIGxpbmUgJWQnIFwKKyAgICAgICAgICAgICAgICAgICUgKHNlbGYuaW5zdHJlYW0sIHNlbGYubGluZW5vKQorCisgICAgZGVmIHB1c2hfdG9rZW4oc2VsZiwgdG9rKToKKyAgICAgICAgIlB1c2ggYSB0b2tlbiBvbnRvIHRoZSBzdGFjayBwb3BwZWQgYnkgdGhlIGdldF90b2tlbiBtZXRob2QiCisgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMToKKyAgICAgICAgICAgIHByaW50ICJzaGxleDogcHVzaGluZyB0b2tlbiAiICsgcmVwcih0b2spCisgICAgICAgIHNlbGYucHVzaGJhY2suYXBwZW5kbGVmdCh0b2spCisKKyAgICBkZWYgcHVzaF9zb3VyY2Uoc2VsZiwgbmV3c3RyZWFtLCBuZXdmaWxlPU5vbmUpOgorICAgICAgICAiUHVzaCBhbiBpbnB1dCBzb3VyY2Ugb250byB0aGUgbGV4ZXIncyBpbnB1dCBzb3VyY2Ugc3RhY2suIgorICAgICAgICBpZiBpc2luc3RhbmNlKG5ld3N0cmVhbSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBuZXdzdHJlYW0gPSBTdHJpbmdJTyhuZXdzdHJlYW0pCisgICAgICAgIHNlbGYuZmlsZXN0YWNrLmFwcGVuZGxlZnQoKHNlbGYuaW5maWxlLCBzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykpCisgICAgICAgIHNlbGYuaW5maWxlID0gbmV3ZmlsZQorICAgICAgICBzZWxmLmluc3RyZWFtID0gbmV3c3RyZWFtCisgICAgICAgIHNlbGYubGluZW5vID0gMQorICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgaWYgbmV3ZmlsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBwcmludCAnc2hsZXg6IHB1c2hpbmcgdG8gZmlsZSAlcycgJSAoc2VsZi5pbmZpbGUsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnc2hsZXg6IHB1c2hpbmcgdG8gc3RyZWFtICVzJyAlIChzZWxmLmluc3RyZWFtLCkKKworICAgIGRlZiBwb3Bfc291cmNlKHNlbGYpOgorICAgICAgICAiUG9wIHRoZSBpbnB1dCBzb3VyY2Ugc3RhY2suIgorICAgICAgICBzZWxmLmluc3RyZWFtLmNsb3NlKCkKKyAgICAgICAgKHNlbGYuaW5maWxlLCBzZWxmLmluc3RyZWFtLCBzZWxmLmxpbmVubykgPSBzZWxmLmZpbGVzdGFjay5wb3BsZWZ0KCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50ICdzaGxleDogcG9wcGluZyB0byAlcywgbGluZSAlZCcgXAorICAgICAgICAgICAgICAgICAgJSAoc2VsZi5pbnN0cmVhbSwgc2VsZi5saW5lbm8pCisgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKKworICAgIGRlZiBnZXRfdG9rZW4oc2VsZik6CisgICAgICAgICJHZXQgYSB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0gKG9yIGZyb20gc3RhY2sgaWYgaXQncyBub25lbXB0eSkiCisgICAgICAgIGlmIHNlbGYucHVzaGJhY2s6CisgICAgICAgICAgICB0b2sgPSBzZWxmLnB1c2hiYWNrLnBvcGxlZnQoKQorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgorICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogcG9wcGluZyB0b2tlbiAiICsgcmVwcih0b2spCisgICAgICAgICAgICByZXR1cm4gdG9rCisgICAgICAgICMgTm8gcHVzaGJhY2suICBHZXQgYSB0b2tlbi4KKyAgICAgICAgcmF3ID0gc2VsZi5yZWFkX3Rva2VuKCkKKyAgICAgICAgIyBIYW5kbGUgaW5jbHVzaW9ucworICAgICAgICBpZiBzZWxmLnNvdXJjZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdoaWxlIHJhdyA9PSBzZWxmLnNvdXJjZToKKyAgICAgICAgICAgICAgICBzcGVjID0gc2VsZi5zb3VyY2Vob29rKHNlbGYucmVhZF90b2tlbigpKQorICAgICAgICAgICAgICAgIGlmIHNwZWM6CisgICAgICAgICAgICAgICAgICAgIChuZXdmaWxlLCBuZXdzdHJlYW0pID0gc3BlYworICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2hfc291cmNlKG5ld3N0cmVhbSwgbmV3ZmlsZSkKKyAgICAgICAgICAgICAgICByYXcgPSBzZWxmLmdldF90b2tlbigpCisgICAgICAgICMgTWF5YmUgd2UgZ290IEVPRiBpbnN0ZWFkPworICAgICAgICB3aGlsZSByYXcgPT0gc2VsZi5lb2Y6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5maWxlc3RhY2s6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW9mCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucG9wX3NvdXJjZSgpCisgICAgICAgICAgICAgICAgcmF3ID0gc2VsZi5nZXRfdG9rZW4oKQorICAgICAgICAjIE5laXRoZXIgaW5jbHVzaW9uIG5vciBFT0YKKyAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAxOgorICAgICAgICAgICAgaWYgcmF3ICE9IHNlbGYuZW9mOgorICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogdG9rZW49IiArIHJlcHIocmF3KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IHRva2VuPUVPRiIKKyAgICAgICAgcmV0dXJuIHJhdworCisgICAgZGVmIHJlYWRfdG9rZW4oc2VsZik6CisgICAgICAgIHF1b3RlZCA9IEZhbHNlCisgICAgICAgIGVzY2FwZWRzdGF0ZSA9ICcgJworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbmV4dGNoYXIgPSBzZWxmLmluc3RyZWFtLnJlYWQoMSkKKyAgICAgICAgICAgIGlmIG5leHRjaGFyID09ICdcbic6CisgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMzoKKyAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IGluIHN0YXRlIiwgcmVwcihzZWxmLnN0YXRlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICJJIHNlZSBjaGFyYWN0ZXI6IiwgcmVwcihuZXh0Y2hhcikKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhdGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gJycgICAgICAgICMgcGFzdCBlbmQgb2YgZmlsZQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgPT0gJyAnOgorICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IE5vbmUgICMgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSB3aGl0ZXNwYWNlIGluIHdoaXRlc3BhY2Ugc3RhdGUiCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYudG9rZW4gb3IgKHNlbGYucG9zaXggYW5kIHF1b3RlZCk6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi5jb21tZW50ZXJzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmluc3RyZWFtLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIDEKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYucG9zaXggYW5kIG5leHRjaGFyIGluIHNlbGYuZXNjYXBlOgorICAgICAgICAgICAgICAgICAgICBlc2NhcGVkc3RhdGUgPSAnYScKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLndvcmRjaGFyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKKyAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYucXVvdGVzOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wb3NpeDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBuZXh0Y2hhcgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYud2hpdGVzcGFjZV9zcGxpdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnYScKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRva2VuID0gbmV4dGNoYXIKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHNlbGYuc3RhdGUgaW4gc2VsZi5xdW90ZXM6CisgICAgICAgICAgICAgICAgcXVvdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjogICAgICAjIGVuZCBvZiBmaWxlCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogSSBzZWUgRU9GIGluIHF1b3RlcyBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgIyBYWFggd2hhdCBlcnJvciBzaG91bGQgYmUgcmFpc2VkIGhlcmU/CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJObyBjbG9zaW5nIHF1b3RhdGlvbiIKKyAgICAgICAgICAgICAgICBpZiBuZXh0Y2hhciA9PSBzZWxmLnN0YXRlOgorICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wb3NpeDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gJ2EnCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSBpbiBzZWxmLmVzY2FwZWRxdW90ZXM6CisgICAgICAgICAgICAgICAgICAgIGVzY2FwZWRzdGF0ZSA9IHNlbGYuc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgorICAgICAgICAgICAgZWxpZiBzZWxmLnN0YXRlIGluIHNlbGYuZXNjYXBlOgorICAgICAgICAgICAgICAgIGlmIG5vdCBuZXh0Y2hhcjogICAgICAjIGVuZCBvZiBmaWxlCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogSSBzZWUgRU9GIGluIGVzY2FwZSBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgIyBYWFggd2hhdCBlcnJvciBzaG91bGQgYmUgcmFpc2VkIGhlcmU/CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJObyBlc2NhcGVkIGNoYXJhY3RlciIKKyAgICAgICAgICAgICAgICAjIEluIHBvc2l4IHNoZWxscywgb25seSB0aGUgcXVvdGUgaXRzZWxmIG9yIHRoZSBlc2NhcGUKKyAgICAgICAgICAgICAgICAjIGNoYXJhY3RlciBtYXkgYmUgZXNjYXBlZCB3aXRoaW4gcXVvdGVzLgorICAgICAgICAgICAgICAgIGlmIGVzY2FwZWRzdGF0ZSBpbiBzZWxmLnF1b3RlcyBhbmQgXAorICAgICAgICAgICAgICAgICAgIG5leHRjaGFyICE9IHNlbGYuc3RhdGUgYW5kIG5leHRjaGFyICE9IGVzY2FwZWRzdGF0ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBzZWxmLnN0YXRlCisgICAgICAgICAgICAgICAgc2VsZi50b2tlbiA9IHNlbGYudG9rZW4gKyBuZXh0Y2hhcgorICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBlc2NhcGVkc3RhdGUKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdGF0ZSA9PSAnYSc6CisgICAgICAgICAgICAgICAgaWYgbm90IG5leHRjaGFyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gTm9uZSAgICMgZW5kIG9mIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIG5leHRjaGFyIGluIHNlbGYud2hpdGVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+PSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNobGV4OiBJIHNlZSB3aGl0ZXNwYWNlIGluIHdvcmQgc3RhdGUiCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSAnICcKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgIyBlbWl0IGN1cnJlbnQgdG9rZW4KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBuZXh0Y2hhciBpbiBzZWxmLmNvbW1lbnRlcnM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5zdHJlYW0ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgMQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBvc2l4OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJworICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi50b2tlbiBvciAoc2VsZi5wb3NpeCBhbmQgcXVvdGVkKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayAgICMgZW1pdCBjdXJyZW50IHRva2VuCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLnF1b3RlczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IG5leHRjaGFyCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnBvc2l4IGFuZCBuZXh0Y2hhciBpbiBzZWxmLmVzY2FwZToKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlZHN0YXRlID0gJ2EnCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBuZXh0Y2hhcgorICAgICAgICAgICAgICAgIGVsaWYgbmV4dGNoYXIgaW4gc2VsZi53b3JkY2hhcnMgb3IgbmV4dGNoYXIgaW4gc2VsZi5xdW90ZXMgXAorICAgICAgICAgICAgICAgICAgICBvciBzZWxmLndoaXRlc3BhY2Vfc3BsaXQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudG9rZW4gPSBzZWxmLnRva2VuICsgbmV4dGNoYXIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2hiYWNrLmFwcGVuZGxlZnQobmV4dGNoYXIpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWcgPj0gMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogSSBzZWUgcHVuY3R1YXRpb24gaW4gd29yZCBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGF0ZSA9ICcgJworICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRva2VuOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgICAjIGVtaXQgY3VycmVudCB0b2tlbgorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgcmVzdWx0ID0gc2VsZi50b2tlbgorICAgICAgICBzZWxmLnRva2VuID0gJycKKyAgICAgICAgaWYgc2VsZi5wb3NpeCBhbmQgbm90IHF1b3RlZCBhbmQgcmVzdWx0ID09ICcnOgorICAgICAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICBpZiBzZWxmLmRlYnVnID4gMToKKyAgICAgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBwcmludCAic2hsZXg6IHJhdyB0b2tlbj0iICsgcmVwcihyZXN1bHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJzaGxleDogcmF3IHRva2VuPUVPRiIKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHNvdXJjZWhvb2soc2VsZiwgbmV3ZmlsZSk6CisgICAgICAgICJIb29rIGNhbGxlZCBvbiBhIGZpbGVuYW1lIHRvIGJlIHNvdXJjZWQuIgorICAgICAgICBpZiBuZXdmaWxlWzBdID09ICciJzoKKyAgICAgICAgICAgIG5ld2ZpbGUgPSBuZXdmaWxlWzE6LTFdCisgICAgICAgICMgVGhpcyBpbXBsZW1lbnRzIGNwcC1saWtlIHNlbWFudGljcyBmb3IgcmVsYXRpdmUtcGF0aCBpbmNsdXNpb24uCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5pbmZpbGUsIGJhc2VzdHJpbmcpIGFuZCBub3Qgb3MucGF0aC5pc2FicyhuZXdmaWxlKToKKyAgICAgICAgICAgIG5ld2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKHNlbGYuaW5maWxlKSwgbmV3ZmlsZSkKKyAgICAgICAgcmV0dXJuIChuZXdmaWxlLCBvcGVuKG5ld2ZpbGUsICJyIikpCisKKyAgICBkZWYgZXJyb3JfbGVhZGVyKHNlbGYsIGluZmlsZT1Ob25lLCBsaW5lbm89Tm9uZSk6CisgICAgICAgICJFbWl0IGEgQy1jb21waWxlci1saWtlLCBFbWFjcy1mcmllbmRseSBlcnJvci1tZXNzYWdlIGxlYWRlci4iCisgICAgICAgIGlmIGluZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgaW5maWxlID0gc2VsZi5pbmZpbGUKKyAgICAgICAgaWYgbGluZW5vIGlzIE5vbmU6CisgICAgICAgICAgICBsaW5lbm8gPSBzZWxmLmxpbmVubworICAgICAgICByZXR1cm4gIlwiJXNcIiwgbGluZSAlZDogIiAlIChpbmZpbGUsIGxpbmVubykKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICB0b2tlbiA9IHNlbGYuZ2V0X3Rva2VuKCkKKyAgICAgICAgaWYgdG9rZW4gPT0gc2VsZi5lb2Y6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJldHVybiB0b2tlbgorCitkZWYgc3BsaXQocywgY29tbWVudHM9RmFsc2UsIHBvc2l4PVRydWUpOgorICAgIGxleCA9IHNobGV4KHMsIHBvc2l4PXBvc2l4KQorICAgIGxleC53aGl0ZXNwYWNlX3NwbGl0ID0gVHJ1ZQorICAgIGlmIG5vdCBjb21tZW50czoKKyAgICAgICAgbGV4LmNvbW1lbnRlcnMgPSAnJworICAgIHJldHVybiBsaXN0KGxleCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDE6CisgICAgICAgIGxleGVyID0gc2hsZXgoKQorICAgIGVsc2U6CisgICAgICAgIGZpbGUgPSBzeXMuYXJndlsxXQorICAgICAgICBsZXhlciA9IHNobGV4KG9wZW4oZmlsZSksIGZpbGUpCisgICAgd2hpbGUgMToKKyAgICAgICAgdHQgPSBsZXhlci5nZXRfdG9rZW4oKQorICAgICAgICBpZiB0dDoKKyAgICAgICAgICAgIHByaW50ICJUb2tlbjogIiArIHJlcHIodHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBicmVhawpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGxleC5weWMgYi9saWIvcHl0aG9uMi43L3NobGV4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTYwMmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaGxleC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaGxleC5weW8gYi9saWIvcHl0aG9uMi43L3NobGV4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTYwMmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaGxleC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zaHV0aWwucHkgYi9saWIvcHl0aG9uMi43L3NodXRpbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA4MDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaHV0aWwucHkKQEAgLTAsMCArMSw1NTYgQEAKKyIiIlV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb3B5aW5nIGFuZCBhcmNoaXZpbmcgZmlsZXMgYW5kIGRpcmVjdG9yeSB0cmVlcy4KKworWFhYIFRoZSBmdW5jdGlvbnMgaGVyZSBkb24ndCBjb3B5IHRoZSByZXNvdXJjZSBmb3JrIG9yIG90aGVyIG1ldGFkYXRhIG9uIE1hYy4KKworIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHN0YXQKK2Zyb20gb3MucGF0aCBpbXBvcnQgYWJzcGF0aAoraW1wb3J0IGZubWF0Y2gKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGVycm5vCisKK3RyeToKKyAgICBmcm9tIHB3ZCBpbXBvcnQgZ2V0cHduYW0KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnZXRwd25hbSA9IE5vbmUKKwordHJ5OgorICAgIGZyb20gZ3JwIGltcG9ydCBnZXRncm5hbQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGdldGdybmFtID0gTm9uZQorCitfX2FsbF9fID0gWyJjb3B5ZmlsZW9iaiIsICJjb3B5ZmlsZSIsICJjb3B5bW9kZSIsICJjb3B5c3RhdCIsICJjb3B5IiwgImNvcHkyIiwKKyAgICAgICAgICAgImNvcHl0cmVlIiwgIm1vdmUiLCAicm10cmVlIiwgIkVycm9yIiwgIlNwZWNpYWxGaWxlRXJyb3IiLAorICAgICAgICAgICAiRXhlY0Vycm9yIiwgIm1ha2VfYXJjaGl2ZSIsICJnZXRfYXJjaGl2ZV9mb3JtYXRzIiwKKyAgICAgICAgICAgInJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0IiwgInVucmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQiLAorICAgICAgICAgICAiaWdub3JlX3BhdHRlcm5zIl0KKworY2xhc3MgRXJyb3IoRW52aXJvbm1lbnRFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBTcGVjaWFsRmlsZUVycm9yKEVudmlyb25tZW50RXJyb3IpOgorICAgICIiIlJhaXNlZCB3aGVuIHRyeWluZyB0byBkbyBhIGtpbmQgb2Ygb3BlcmF0aW9uIChlLmcuIGNvcHlpbmcpIHdoaWNoIGlzCisgICAgbm90IHN1cHBvcnRlZCBvbiBhIHNwZWNpYWwgZmlsZSAoZS5nLiBhIG5hbWVkIHBpcGUpIiIiCisKK2NsYXNzIEV4ZWNFcnJvcihFbnZpcm9ubWVudEVycm9yKToKKyAgICAiIiJSYWlzZWQgd2hlbiBhIGNvbW1hbmQgY291bGQgbm90IGJlIGV4ZWN1dGVkIiIiCisKK3RyeToKKyAgICBXaW5kb3dzRXJyb3IKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgV2luZG93c0Vycm9yID0gTm9uZQorCitkZWYgY29weWZpbGVvYmooZnNyYywgZmRzdCwgbGVuZ3RoPTE2KjEwMjQpOgorICAgICIiImNvcHkgZGF0YSBmcm9tIGZpbGUtbGlrZSBvYmplY3QgZnNyYyB0byBmaWxlLWxpa2Ugb2JqZWN0IGZkc3QiIiIKKyAgICB3aGlsZSAxOgorICAgICAgICBidWYgPSBmc3JjLnJlYWQobGVuZ3RoKQorICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmRzdC53cml0ZShidWYpCisKK2RlZiBfc2FtZWZpbGUoc3JjLCBkc3QpOgorICAgICMgTWFjaW50b3NoLCBVbml4LgorICAgIGlmIGhhc2F0dHIob3MucGF0aCwgJ3NhbWVmaWxlJyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLnNhbWVmaWxlKHNyYywgZHN0KQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBBbGwgb3RoZXIgcGxhdGZvcm1zOiBjaGVjayBmb3Igc2FtZSBwYXRobmFtZS4KKyAgICByZXR1cm4gKG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKHNyYykpID09CisgICAgICAgICAgICBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGguYWJzcGF0aChkc3QpKSkKKworZGVmIGNvcHlmaWxlKHNyYywgZHN0KToKKyAgICAiIiJDb3B5IGRhdGEgZnJvbSBzcmMgdG8gZHN0IiIiCisgICAgaWYgX3NhbWVmaWxlKHNyYywgZHN0KToKKyAgICAgICAgcmFpc2UgRXJyb3IoImAlc2AgYW5kIGAlc2AgYXJlIHRoZSBzYW1lIGZpbGUiICUgKHNyYywgZHN0KSkKKworICAgIGZvciBmbiBpbiBbc3JjLCBkc3RdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdCA9IG9zLnN0YXQoZm4pCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgIyBGaWxlIG1vc3QgbGlrZWx5IGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFhYWCBXaGF0IGFib3V0IG90aGVyIHNwZWNpYWwgZmlsZXM/IChzb2NrZXRzLCBkZXZpY2VzLi4uKQorICAgICAgICAgICAgaWYgc3RhdC5TX0lTRklGTyhzdC5zdF9tb2RlKToKKyAgICAgICAgICAgICAgICByYWlzZSBTcGVjaWFsRmlsZUVycm9yKCJgJXNgIGlzIGEgbmFtZWQgcGlwZSIgJSBmbikKKworICAgIHdpdGggb3BlbihzcmMsICdyYicpIGFzIGZzcmM6CisgICAgICAgIHdpdGggb3Blbihkc3QsICd3YicpIGFzIGZkc3Q6CisgICAgICAgICAgICBjb3B5ZmlsZW9iaihmc3JjLCBmZHN0KQorCitkZWYgY29weW1vZGUoc3JjLCBkc3QpOgorICAgICIiIkNvcHkgbW9kZSBiaXRzIGZyb20gc3JjIHRvIGRzdCIiIgorICAgIGlmIGhhc2F0dHIob3MsICdjaG1vZCcpOgorICAgICAgICBzdCA9IG9zLnN0YXQoc3JjKQorICAgICAgICBtb2RlID0gc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpCisgICAgICAgIG9zLmNobW9kKGRzdCwgbW9kZSkKKworZGVmIGNvcHlzdGF0KHNyYywgZHN0KToKKyAgICAiIiJDb3B5IGFsbCBzdGF0IGluZm8gKG1vZGUgYml0cywgYXRpbWUsIG10aW1lLCBmbGFncykgZnJvbSBzcmMgdG8gZHN0IiIiCisgICAgc3QgPSBvcy5zdGF0KHNyYykKKyAgICBtb2RlID0gc3RhdC5TX0lNT0RFKHN0LnN0X21vZGUpCisgICAgaWYgaGFzYXR0cihvcywgJ3V0aW1lJyk6CisgICAgICAgIG9zLnV0aW1lKGRzdCwgKHN0LnN0X2F0aW1lLCBzdC5zdF9tdGltZSkpCisgICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CisgICAgICAgIG9zLmNobW9kKGRzdCwgbW9kZSkKKyAgICBpZiBoYXNhdHRyKG9zLCAnY2hmbGFncycpIGFuZCBoYXNhdHRyKHN0LCAnc3RfZmxhZ3MnKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2hmbGFncyhkc3QsIHN0LnN0X2ZsYWdzKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgd2h5OgorICAgICAgICAgICAgZm9yIGVyciBpbiAnRU9QTk9UU1VQUCcsICdFTk9UU1VQJzoKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGVycm5vLCBlcnIpIGFuZCB3aHkuZXJybm8gPT0gZ2V0YXR0cihlcnJubywgZXJyKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UKKworZGVmIGNvcHkoc3JjLCBkc3QpOgorICAgICIiIkNvcHkgZGF0YSBhbmQgbW9kZSBiaXRzICgiY3Agc3JjIGRzdCIpLgorCisgICAgVGhlIGRlc3RpbmF0aW9uIG1heSBiZSBhIGRpcmVjdG9yeS4KKworICAgICIiIgorICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKKyAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGRzdCwgb3MucGF0aC5iYXNlbmFtZShzcmMpKQorICAgIGNvcHlmaWxlKHNyYywgZHN0KQorICAgIGNvcHltb2RlKHNyYywgZHN0KQorCitkZWYgY29weTIoc3JjLCBkc3QpOgorICAgICIiIkNvcHkgZGF0YSBhbmQgYWxsIHN0YXQgaW5mbyAoImNwIC1wIHNyYyBkc3QiKS4KKworICAgIFRoZSBkZXN0aW5hdGlvbiBtYXkgYmUgYSBkaXJlY3RvcnkuCisKKyAgICAiIiIKKyAgICBpZiBvcy5wYXRoLmlzZGlyKGRzdCk6CisgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihkc3QsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKKyAgICBjb3B5ZmlsZShzcmMsIGRzdCkKKyAgICBjb3B5c3RhdChzcmMsIGRzdCkKKworZGVmIGlnbm9yZV9wYXR0ZXJucygqcGF0dGVybnMpOgorICAgICIiIkZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgY29weXRyZWUoKSBpZ25vcmUgcGFyYW1ldGVyLgorCisgICAgUGF0dGVybnMgaXMgYSBzZXF1ZW5jZSBvZiBnbG9iLXN0eWxlIHBhdHRlcm5zCisgICAgdGhhdCBhcmUgdXNlZCB0byBleGNsdWRlIGZpbGVzIiIiCisgICAgZGVmIF9pZ25vcmVfcGF0dGVybnMocGF0aCwgbmFtZXMpOgorICAgICAgICBpZ25vcmVkX25hbWVzID0gW10KKyAgICAgICAgZm9yIHBhdHRlcm4gaW4gcGF0dGVybnM6CisgICAgICAgICAgICBpZ25vcmVkX25hbWVzLmV4dGVuZChmbm1hdGNoLmZpbHRlcihuYW1lcywgcGF0dGVybikpCisgICAgICAgIHJldHVybiBzZXQoaWdub3JlZF9uYW1lcykKKyAgICByZXR1cm4gX2lnbm9yZV9wYXR0ZXJucworCitkZWYgY29weXRyZWUoc3JjLCBkc3QsIHN5bWxpbmtzPUZhbHNlLCBpZ25vcmU9Tm9uZSk6CisgICAgIiIiUmVjdXJzaXZlbHkgY29weSBhIGRpcmVjdG9yeSB0cmVlIHVzaW5nIGNvcHkyKCkuCisKKyAgICBUaGUgZGVzdGluYXRpb24gZGlyZWN0b3J5IG11c3Qgbm90IGFscmVhZHkgZXhpc3QuCisgICAgSWYgZXhjZXB0aW9uKHMpIG9jY3VyLCBhbiBFcnJvciBpcyByYWlzZWQgd2l0aCBhIGxpc3Qgb2YgcmVhc29ucy4KKworICAgIElmIHRoZSBvcHRpb25hbCBzeW1saW5rcyBmbGFnIGlzIHRydWUsIHN5bWJvbGljIGxpbmtzIGluIHRoZQorICAgIHNvdXJjZSB0cmVlIHJlc3VsdCBpbiBzeW1ib2xpYyBsaW5rcyBpbiB0aGUgZGVzdGluYXRpb24gdHJlZTsgaWYKKyAgICBpdCBpcyBmYWxzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlcyBwb2ludGVkIHRvIGJ5IHN5bWJvbGljCisgICAgbGlua3MgYXJlIGNvcGllZC4KKworICAgIFRoZSBvcHRpb25hbCBpZ25vcmUgYXJndW1lbnQgaXMgYSBjYWxsYWJsZS4gSWYgZ2l2ZW4sIGl0CisgICAgaXMgY2FsbGVkIHdpdGggdGhlIGBzcmNgIHBhcmFtZXRlciwgd2hpY2ggaXMgdGhlIGRpcmVjdG9yeQorICAgIGJlaW5nIHZpc2l0ZWQgYnkgY29weXRyZWUoKSwgYW5kIGBuYW1lc2Agd2hpY2ggaXMgdGhlIGxpc3Qgb2YKKyAgICBgc3JjYCBjb250ZW50cywgYXMgcmV0dXJuZWQgYnkgb3MubGlzdGRpcigpOgorCisgICAgICAgIGNhbGxhYmxlKHNyYywgbmFtZXMpIC0+IGlnbm9yZWRfbmFtZXMKKworICAgIFNpbmNlIGNvcHl0cmVlKCkgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5LCB0aGUgY2FsbGFibGUgd2lsbCBiZQorICAgIGNhbGxlZCBvbmNlIGZvciBlYWNoIGRpcmVjdG9yeSB0aGF0IGlzIGNvcGllZC4gSXQgcmV0dXJucyBhCisgICAgbGlzdCBvZiBuYW1lcyByZWxhdGl2ZSB0byB0aGUgYHNyY2AgZGlyZWN0b3J5IHRoYXQgc2hvdWxkCisgICAgbm90IGJlIGNvcGllZC4KKworICAgIFhYWCBDb25zaWRlciB0aGlzIGV4YW1wbGUgY29kZSByYXRoZXIgdGhhbiB0aGUgdWx0aW1hdGUgdG9vbC4KKworICAgICIiIgorICAgIG5hbWVzID0gb3MubGlzdGRpcihzcmMpCisgICAgaWYgaWdub3JlIGlzIG5vdCBOb25lOgorICAgICAgICBpZ25vcmVkX25hbWVzID0gaWdub3JlKHNyYywgbmFtZXMpCisgICAgZWxzZToKKyAgICAgICAgaWdub3JlZF9uYW1lcyA9IHNldCgpCisKKyAgICBvcy5tYWtlZGlycyhkc3QpCisgICAgZXJyb3JzID0gW10KKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgaWYgbmFtZSBpbiBpZ25vcmVkX25hbWVzOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgc3JjbmFtZSA9IG9zLnBhdGguam9pbihzcmMsIG5hbWUpCisgICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmpvaW4oZHN0LCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzeW1saW5rcyBhbmQgb3MucGF0aC5pc2xpbmsoc3JjbmFtZSk6CisgICAgICAgICAgICAgICAgbGlua3RvID0gb3MucmVhZGxpbmsoc3JjbmFtZSkKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKGxpbmt0bywgZHN0bmFtZSkKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihzcmNuYW1lKToKKyAgICAgICAgICAgICAgICBjb3B5dHJlZShzcmNuYW1lLCBkc3RuYW1lLCBzeW1saW5rcywgaWdub3JlKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFdpbGwgcmFpc2UgYSBTcGVjaWFsRmlsZUVycm9yIGZvciB1bnN1cHBvcnRlZCBmaWxlIHR5cGVzCisgICAgICAgICAgICAgICAgY29weTIoc3JjbmFtZSwgZHN0bmFtZSkKKyAgICAgICAgIyBjYXRjaCB0aGUgRXJyb3IgZnJvbSB0aGUgcmVjdXJzaXZlIGNvcHl0cmVlIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICMgY29udGludWUgd2l0aCBvdGhlciBmaWxlcworICAgICAgICBleGNlcHQgRXJyb3IsIGVycjoKKyAgICAgICAgICAgIGVycm9ycy5leHRlbmQoZXJyLmFyZ3NbMF0pCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCB3aHk6CisgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKChzcmNuYW1lLCBkc3RuYW1lLCBzdHIod2h5KSkpCisgICAgdHJ5OgorICAgICAgICBjb3B5c3RhdChzcmMsIGRzdCkKKyAgICBleGNlcHQgT1NFcnJvciwgd2h5OgorICAgICAgICBpZiBXaW5kb3dzRXJyb3IgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uod2h5LCBXaW5kb3dzRXJyb3IpOgorICAgICAgICAgICAgIyBDb3B5aW5nIGZpbGUgYWNjZXNzIHRpbWVzIG1heSBmYWlsIG9uIFdpbmRvd3MKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoKHNyYywgZHN0LCBzdHIod2h5KSkpCisgICAgaWYgZXJyb3JzOgorICAgICAgICByYWlzZSBFcnJvciwgZXJyb3JzCisKK2RlZiBybXRyZWUocGF0aCwgaWdub3JlX2Vycm9ycz1GYWxzZSwgb25lcnJvcj1Ob25lKToKKyAgICAiIiJSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkgdHJlZS4KKworICAgIElmIGlnbm9yZV9lcnJvcnMgaXMgc2V0LCBlcnJvcnMgYXJlIGlnbm9yZWQ7IG90aGVyd2lzZSwgaWYgb25lcnJvcgorICAgIGlzIHNldCwgaXQgaXMgY2FsbGVkIHRvIGhhbmRsZSB0aGUgZXJyb3Igd2l0aCBhcmd1bWVudHMgKGZ1bmMsCisgICAgcGF0aCwgZXhjX2luZm8pIHdoZXJlIGZ1bmMgaXMgb3MubGlzdGRpciwgb3MucmVtb3ZlLCBvciBvcy5ybWRpcjsKKyAgICBwYXRoIGlzIHRoZSBhcmd1bWVudCB0byB0aGF0IGZ1bmN0aW9uIHRoYXQgY2F1c2VkIGl0IHRvIGZhaWw7IGFuZAorICAgIGV4Y19pbmZvIGlzIGEgdHVwbGUgcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCkuICBJZiBpZ25vcmVfZXJyb3JzCisgICAgaXMgZmFsc2UgYW5kIG9uZXJyb3IgaXMgTm9uZSwgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZC4KKworICAgICIiIgorICAgIGlmIGlnbm9yZV9lcnJvcnM6CisgICAgICAgIGRlZiBvbmVycm9yKCphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICBlbGlmIG9uZXJyb3IgaXMgTm9uZToKKyAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgorICAgICAgICAgICAgcmFpc2UKKyAgICB0cnk6CisgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHBhdGgpOgorICAgICAgICAgICAgIyBzeW1saW5rcyB0byBkaXJlY3RvcmllcyBhcmUgZm9yYmlkZGVuLCBzZWUgYnVnICMxNjY5CisgICAgICAgICAgICByYWlzZSBPU0Vycm9yKCJDYW5ub3QgY2FsbCBybXRyZWUgb24gYSBzeW1ib2xpYyBsaW5rIikKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgb25lcnJvcihvcy5wYXRoLmlzbGluaywgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCisgICAgICAgICMgY2FuJ3QgY29udGludWUgZXZlbiBpZiBvbmVycm9yIGhvb2sgcmV0dXJucworICAgICAgICByZXR1cm4KKyAgICBuYW1lcyA9IFtdCisgICAgdHJ5OgorICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgb25lcnJvcihvcy5saXN0ZGlyLCBwYXRoLCBzeXMuZXhjX2luZm8oKSkKKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kZSA9IG9zLmxzdGF0KGZ1bGxuYW1lKS5zdF9tb2RlCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIG1vZGUgPSAwCisgICAgICAgIGlmIHN0YXQuU19JU0RJUihtb2RlKToKKyAgICAgICAgICAgIHJtdHJlZShmdWxsbmFtZSwgaWdub3JlX2Vycm9ycywgb25lcnJvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZnVsbG5hbWUpCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBvbmVycm9yKG9zLnJlbW92ZSwgZnVsbG5hbWUsIHN5cy5leGNfaW5mbygpKQorICAgIHRyeToKKyAgICAgICAgb3Mucm1kaXIocGF0aCkKKyAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgIG9uZXJyb3Iob3Mucm1kaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQorCisKK2RlZiBfYmFzZW5hbWUocGF0aCk6CisgICAgIyBBIGJhc2VuYW1lKCkgdmFyaWFudCB3aGljaCBmaXJzdCBzdHJpcHMgdGhlIHRyYWlsaW5nIHNsYXNoLCBpZiBwcmVzZW50LgorICAgICMgVGh1cyB3ZSBhbHdheXMgZ2V0IHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCwgZXZlbiBmb3IgZGlyZWN0b3JpZXMuCisgICAgcmV0dXJuIG9zLnBhdGguYmFzZW5hbWUocGF0aC5yc3RyaXAob3MucGF0aC5zZXApKQorCitkZWYgbW92ZShzcmMsIGRzdCk6CisgICAgIiIiUmVjdXJzaXZlbHkgbW92ZSBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGFub3RoZXIgbG9jYXRpb24uIFRoaXMgaXMKKyAgICBzaW1pbGFyIHRvIHRoZSBVbml4ICJtdiIgY29tbWFuZC4KKworICAgIElmIHRoZSBkZXN0aW5hdGlvbiBpcyBhIGRpcmVjdG9yeSBvciBhIHN5bWxpbmsgdG8gYSBkaXJlY3RvcnksIHRoZSBzb3VyY2UKKyAgICBpcyBtb3ZlZCBpbnNpZGUgdGhlIGRpcmVjdG9yeS4gVGhlIGRlc3RpbmF0aW9uIHBhdGggbXVzdCBub3QgYWxyZWFkeQorICAgIGV4aXN0LgorCisgICAgSWYgdGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnksIGl0IG1heSBiZQorICAgIG92ZXJ3cml0dGVuIGRlcGVuZGluZyBvbiBvcy5yZW5hbWUoKSBzZW1hbnRpY3MuCisKKyAgICBJZiB0aGUgZGVzdGluYXRpb24gaXMgb24gb3VyIGN1cnJlbnQgZmlsZXN5c3RlbSwgdGhlbiByZW5hbWUoKSBpcyB1c2VkLgorICAgIE90aGVyd2lzZSwgc3JjIGlzIGNvcGllZCB0byB0aGUgZGVzdGluYXRpb24gYW5kIHRoZW4gcmVtb3ZlZC4KKyAgICBBIGxvdCBtb3JlIGNvdWxkIGJlIGRvbmUgaGVyZS4uLiAgQSBsb29rIGF0IGEgbXYuYyBzaG93cyBhIGxvdCBvZgorICAgIHRoZSBpc3N1ZXMgdGhpcyBpbXBsZW1lbnRhdGlvbiBnbG9zc2VzIG92ZXIuCisKKyAgICAiIiIKKyAgICByZWFsX2RzdCA9IGRzdAorICAgIGlmIG9zLnBhdGguaXNkaXIoZHN0KToKKyAgICAgICAgaWYgX3NhbWVmaWxlKHNyYywgZHN0KToKKyAgICAgICAgICAgICMgV2UgbWlnaHQgYmUgb24gYSBjYXNlIGluc2Vuc2l0aXZlIGZpbGVzeXN0ZW0sCisgICAgICAgICAgICAjIHBlcmZvcm0gdGhlIHJlbmFtZSBhbnl3YXkuCisgICAgICAgICAgICBvcy5yZW5hbWUoc3JjLCBkc3QpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICByZWFsX2RzdCA9IG9zLnBhdGguam9pbihkc3QsIF9iYXNlbmFtZShzcmMpKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyZWFsX2RzdCk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgIkRlc3RpbmF0aW9uIHBhdGggJyVzJyBhbHJlYWR5IGV4aXN0cyIgJSByZWFsX2RzdAorICAgIHRyeToKKyAgICAgICAgb3MucmVuYW1lKHNyYywgcmVhbF9kc3QpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc3JjKToKKyAgICAgICAgICAgIGlmIF9kZXN0aW5zcmMoc3JjLCBkc3QpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiQ2Fubm90IG1vdmUgYSBkaXJlY3RvcnkgJyVzJyBpbnRvIGl0c2VsZiAnJXMnLiIgJSAoc3JjLCBkc3QpCisgICAgICAgICAgICBjb3B5dHJlZShzcmMsIHJlYWxfZHN0LCBzeW1saW5rcz1UcnVlKQorICAgICAgICAgICAgcm10cmVlKHNyYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvcHkyKHNyYywgcmVhbF9kc3QpCisgICAgICAgICAgICBvcy51bmxpbmsoc3JjKQorCitkZWYgX2Rlc3RpbnNyYyhzcmMsIGRzdCk6CisgICAgc3JjID0gYWJzcGF0aChzcmMpCisgICAgZHN0ID0gYWJzcGF0aChkc3QpCisgICAgaWYgbm90IHNyYy5lbmRzd2l0aChvcy5wYXRoLnNlcCk6CisgICAgICAgIHNyYyArPSBvcy5wYXRoLnNlcAorICAgIGlmIG5vdCBkc3QuZW5kc3dpdGgob3MucGF0aC5zZXApOgorICAgICAgICBkc3QgKz0gb3MucGF0aC5zZXAKKyAgICByZXR1cm4gZHN0LnN0YXJ0c3dpdGgoc3JjKQorCitkZWYgX2dldF9naWQobmFtZSk6CisgICAgIiIiUmV0dXJucyBhIGdpZCwgZ2l2ZW4gYSBncm91cCBuYW1lLiIiIgorICAgIGlmIGdldGdybmFtIGlzIE5vbmUgb3IgbmFtZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHRyeToKKyAgICAgICAgcmVzdWx0ID0gZ2V0Z3JuYW0obmFtZSkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiByZXN1bHRbMl0KKyAgICByZXR1cm4gTm9uZQorCitkZWYgX2dldF91aWQobmFtZSk6CisgICAgIiIiUmV0dXJucyBhbiB1aWQsIGdpdmVuIGEgdXNlciBuYW1lLiIiIgorICAgIGlmIGdldHB3bmFtIGlzIE5vbmUgb3IgbmFtZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHRyeToKKyAgICAgICAgcmVzdWx0ID0gZ2V0cHduYW0obmFtZSkKKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHJlc3VsdCA9IE5vbmUKKyAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgIHJldHVybiByZXN1bHRbMl0KKyAgICByZXR1cm4gTm9uZQorCitkZWYgX21ha2VfdGFyYmFsbChiYXNlX25hbWUsIGJhc2VfZGlyLCBjb21wcmVzcz0iZ3ppcCIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLAorICAgICAgICAgICAgICAgICAgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSwgbG9nZ2VyPU5vbmUpOgorICAgICIiIkNyZWF0ZSBhIChwb3NzaWJseSBjb21wcmVzc2VkKSB0YXIgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIKKyAgICAnYmFzZV9kaXInLgorCisgICAgJ2NvbXByZXNzJyBtdXN0IGJlICJnemlwIiAodGhlIGRlZmF1bHQpLCAiYnppcDIiLCBvciBOb25lLgorCisgICAgJ293bmVyJyBhbmQgJ2dyb3VwJyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYW4gb3duZXIgYW5kIGEgZ3JvdXAgZm9yIHRoZQorICAgIGFyY2hpdmUgdGhhdCBpcyBiZWluZyBidWlsdC4gSWYgbm90IHByb3ZpZGVkLCB0aGUgY3VycmVudCBvd25lciBhbmQgZ3JvdXAKKyAgICB3aWxsIGJlIHVzZWQuCisKKyAgICBUaGUgb3V0cHV0IHRhciBmaWxlIHdpbGwgYmUgbmFtZWQgJ2Jhc2VfbmFtZScgKyAgIi50YXIiLCBwb3NzaWJseSBwbHVzCisgICAgdGhlIGFwcHJvcHJpYXRlIGNvbXByZXNzaW9uIGV4dGVuc2lvbiAoIi5neiIsIG9yICIuYnoyIikuCisKKyAgICBSZXR1cm5zIHRoZSBvdXRwdXQgZmlsZW5hbWUuCisgICAgIiIiCisgICAgdGFyX2NvbXByZXNzaW9uID0geydnemlwJzogJ2d6JywgJ2J6aXAyJzogJ2J6MicsIE5vbmU6ICcnfQorICAgIGNvbXByZXNzX2V4dCA9IHsnZ3ppcCc6ICcuZ3onLCAnYnppcDInOiAnLmJ6Mid9CisKKyAgICAjIGZsYWdzIGZvciBjb21wcmVzc2lvbiBwcm9ncmFtLCBlYWNoIGVsZW1lbnQgb2YgbGlzdCB3aWxsIGJlIGFuIGFyZ3VtZW50CisgICAgaWYgY29tcHJlc3MgaXMgbm90IE5vbmUgYW5kIGNvbXByZXNzIG5vdCBpbiBjb21wcmVzc19leHQua2V5cygpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICgiYmFkIHZhbHVlIGZvciAnY29tcHJlc3MnOiBtdXN0IGJlIE5vbmUsICdnemlwJyBvciAnYnppcDInIikKKworICAgIGFyY2hpdmVfbmFtZSA9IGJhc2VfbmFtZSArICcudGFyJyArIGNvbXByZXNzX2V4dC5nZXQoY29tcHJlc3MsICcnKQorICAgIGFyY2hpdmVfZGlyID0gb3MucGF0aC5kaXJuYW1lKGFyY2hpdmVfbmFtZSkKKworICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX2Rpcik6CisgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjcmVhdGluZyAlcyIsIGFyY2hpdmVfZGlyKQorICAgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKGFyY2hpdmVfZGlyKQorCisKKyAgICAjIGNyZWF0aW5nIHRoZSB0YXJiYWxsCisgICAgaW1wb3J0IHRhcmZpbGUgICMgbGF0ZSBpbXBvcnQgc28gUHl0aG9uIGJ1aWxkIGl0c2VsZiBkb2Vzbid0IGJyZWFrCisKKyAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CisgICAgICAgIGxvZ2dlci5pbmZvKCdDcmVhdGluZyB0YXIgYXJjaGl2ZScpCisKKyAgICB1aWQgPSBfZ2V0X3VpZChvd25lcikKKyAgICBnaWQgPSBfZ2V0X2dpZChncm91cCkKKworICAgIGRlZiBfc2V0X3VpZF9naWQodGFyaW5mbyk6CisgICAgICAgIGlmIGdpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRhcmluZm8uZ2lkID0gZ2lkCisgICAgICAgICAgICB0YXJpbmZvLmduYW1lID0gZ3JvdXAKKyAgICAgICAgaWYgdWlkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGFyaW5mby51aWQgPSB1aWQKKyAgICAgICAgICAgIHRhcmluZm8udW5hbWUgPSBvd25lcgorICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihhcmNoaXZlX25hbWUsICd3fCVzJyAlIHRhcl9jb21wcmVzc2lvbltjb21wcmVzc10pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhci5hZGQoYmFzZV9kaXIsIGZpbHRlcj1fc2V0X3VpZF9naWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgcmV0dXJuIGFyY2hpdmVfbmFtZQorCitkZWYgX2NhbGxfZXh0ZXJuYWxfemlwKGJhc2VfZGlyLCB6aXBfZmlsZW5hbWUsIHZlcmJvc2U9RmFsc2UsIGRyeV9ydW49RmFsc2UpOgorICAgICMgWFhYIHNlZSBpZiB3ZSB3YW50IHRvIGtlZXAgYW4gZXh0ZXJuYWwgY2FsbCBoZXJlCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgemlwb3B0aW9ucyA9ICItciIKKyAgICBlbHNlOgorICAgICAgICB6aXBvcHRpb25zID0gIi1ycSIKKyAgICBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0V4ZWNFcnJvcgorICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorICAgIHRyeToKKyAgICAgICAgc3Bhd24oWyJ6aXAiLCB6aXBvcHRpb25zLCB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyXSwgZHJ5X3J1bj1kcnlfcnVuKQorICAgIGV4Y2VwdCBEaXN0dXRpbHNFeGVjRXJyb3I6CisgICAgICAgICMgWFhYIHJlYWxseSBzaG91bGQgZGlzdGluZ3Vpc2ggYmV0d2VlbiAiY291bGRuJ3QgZmluZAorICAgICAgICAjIGV4dGVybmFsICd6aXAnIGNvbW1hbmQiIGFuZCAiemlwIGZhaWxlZCIuCisgICAgICAgIHJhaXNlIEV4ZWNFcnJvciwgXAorICAgICAgICAgICAgKCJ1bmFibGUgdG8gY3JlYXRlIHppcCBmaWxlICclcyc6ICIKKyAgICAgICAgICAgICJjb3VsZCBuZWl0aGVyIGltcG9ydCB0aGUgJ3ppcGZpbGUnIG1vZHVsZSBub3IgIgorICAgICAgICAgICAgImZpbmQgYSBzdGFuZGFsb25lIHppcCB1dGlsaXR5IikgJSB6aXBfZmlsZW5hbWUKKworZGVmIF9tYWtlX3ppcGZpbGUoYmFzZV9uYW1lLCBiYXNlX2RpciwgdmVyYm9zZT0wLCBkcnlfcnVuPTAsIGxvZ2dlcj1Ob25lKToKKyAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4KKworICAgIFRoZSBvdXRwdXQgemlwIGZpbGUgd2lsbCBiZSBuYW1lZCAnYmFzZV9uYW1lJyArICIuemlwIi4gIFVzZXMgZWl0aGVyIHRoZQorICAgICJ6aXBmaWxlIiBQeXRob24gbW9kdWxlIChpZiBhdmFpbGFibGUpIG9yIHRoZSBJbmZvWklQICJ6aXAiIHV0aWxpdHkKKyAgICAoaWYgaW5zdGFsbGVkIGFuZCBmb3VuZCBvbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aCkuICBJZiBuZWl0aGVyIHRvb2wgaXMKKyAgICBhdmFpbGFibGUsIHJhaXNlcyBFeGVjRXJyb3IuICBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgemlwCisgICAgZmlsZS4KKyAgICAiIiIKKyAgICB6aXBfZmlsZW5hbWUgPSBiYXNlX25hbWUgKyAiLnppcCIKKyAgICBhcmNoaXZlX2RpciA9IG9zLnBhdGguZGlybmFtZShiYXNlX25hbWUpCisKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoYXJjaGl2ZV9kaXIpOgorICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsb2dnZXIuaW5mbygiY3JlYXRpbmcgJXMiLCBhcmNoaXZlX2RpcikKKyAgICAgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgICAgICBvcy5tYWtlZGlycyhhcmNoaXZlX2RpcikKKworICAgICMgSWYgemlwZmlsZSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSwgdHJ5IHNwYXduaW5nIGFuIGV4dGVybmFsICd6aXAnCisgICAgIyBjb21tYW5kLgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHppcGZpbGUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHppcGZpbGUgPSBOb25lCisKKyAgICBpZiB6aXBmaWxlIGlzIE5vbmU6CisgICAgICAgIF9jYWxsX2V4dGVybmFsX3ppcChiYXNlX2RpciwgemlwX2ZpbGVuYW1lLCB2ZXJib3NlLCBkcnlfcnVuKQorICAgIGVsc2U6CisgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJjcmVhdGluZyAnJXMnIGFuZCBhZGRpbmcgJyVzJyB0byBpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICB6aXBfZmlsZW5hbWUsIGJhc2VfZGlyKQorCisgICAgICAgIGlmIG5vdCBkcnlfcnVuOgorICAgICAgICAgICAgemlwID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlbmFtZSwgInciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uPXppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKGJhc2VfZGlyKToKKyAgICAgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJwYXRoLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6CisgICAgICAgICAgICAgICAgICAgICAgICB6aXAud3JpdGUocGF0aCwgcGF0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGxvZ2dlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiYWRkaW5nICclcyciLCBwYXRoKQorICAgICAgICAgICAgemlwLmNsb3NlKCkKKworICAgIHJldHVybiB6aXBfZmlsZW5hbWUKKworX0FSQ0hJVkVfRk9STUFUUyA9IHsKKyAgICAnZ3p0YXInOiAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnZ3ppcCcpXSwgImd6aXAnZWQgdGFyLWZpbGUiKSwKKyAgICAnYnp0YXInOiAoX21ha2VfdGFyYmFsbCwgWygnY29tcHJlc3MnLCAnYnppcDInKV0sICJiemlwMidlZCB0YXItZmlsZSIpLAorICAgICd0YXInOiAgIChfbWFrZV90YXJiYWxsLCBbKCdjb21wcmVzcycsIE5vbmUpXSwgInVuY29tcHJlc3NlZCB0YXIgZmlsZSIpLAorICAgICd6aXAnOiAgIChfbWFrZV96aXBmaWxlLCBbXSwiWklQIGZpbGUiKQorICAgIH0KKworZGVmIGdldF9hcmNoaXZlX2Zvcm1hdHMoKToKKyAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBzdXBwb3J0ZWQgZm9ybWF0cyBmb3IgYXJjaGl2aW5nIGFuZCB1bmFyY2hpdmluZy4KKworICAgIEVhY2ggZWxlbWVudCBvZiB0aGUgcmV0dXJuZWQgc2VxdWVuY2UgaXMgYSB0dXBsZSAobmFtZSwgZGVzY3JpcHRpb24pCisgICAgIiIiCisgICAgZm9ybWF0cyA9IFsobmFtZSwgcmVnaXN0cnlbMl0pIGZvciBuYW1lLCByZWdpc3RyeSBpbgorICAgICAgICAgICAgICAgX0FSQ0hJVkVfRk9STUFUUy5pdGVtcygpXQorICAgIGZvcm1hdHMuc29ydCgpCisgICAgcmV0dXJuIGZvcm1hdHMKKworZGVmIHJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KG5hbWUsIGZ1bmN0aW9uLCBleHRyYV9hcmdzPU5vbmUsIGRlc2NyaXB0aW9uPScnKToKKyAgICAiIiJSZWdpc3RlcnMgYW4gYXJjaGl2ZSBmb3JtYXQuCisKKyAgICBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmb3JtYXQuIGZ1bmN0aW9uIGlzIHRoZSBjYWxsYWJsZSB0aGF0IHdpbGwgYmUKKyAgICB1c2VkIHRvIGNyZWF0ZSBhcmNoaXZlcy4gSWYgcHJvdmlkZWQsIGV4dHJhX2FyZ3MgaXMgYSBzZXF1ZW5jZSBvZgorICAgIChuYW1lLCB2YWx1ZSkgdHVwbGVzIHRoYXQgd2lsbCBiZSBwYXNzZWQgYXMgYXJndW1lbnRzIHRvIHRoZSBjYWxsYWJsZS4KKyAgICBkZXNjcmlwdGlvbiBjYW4gYmUgcHJvdmlkZWQgdG8gZGVzY3JpYmUgdGhlIGZvcm1hdCwgYW5kIHdpbGwgYmUgcmV0dXJuZWQKKyAgICBieSB0aGUgZ2V0X2FyY2hpdmVfZm9ybWF0cygpIGZ1bmN0aW9uLgorICAgICIiIgorICAgIGlmIGV4dHJhX2FyZ3MgaXMgTm9uZToKKyAgICAgICAgZXh0cmFfYXJncyA9IFtdCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZnVuY3Rpb24sIGNvbGxlY3Rpb25zLkNhbGxhYmxlKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdUaGUgJXMgb2JqZWN0IGlzIG5vdCBjYWxsYWJsZScgJSBmdW5jdGlvbikKKyAgICBpZiBub3QgaXNpbnN0YW5jZShleHRyYV9hcmdzLCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHRyYV9hcmdzIG5lZWRzIHRvIGJlIGEgc2VxdWVuY2UnKQorICAgIGZvciBlbGVtZW50IGluIGV4dHJhX2FyZ3M6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGVsZW1lbnQsICh0dXBsZSwgbGlzdCkpIG9yIGxlbihlbGVtZW50KSAhPTIgOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdleHRyYV9hcmdzIGVsZW1lbnRzIGFyZSA6IChhcmdfbmFtZSwgdmFsdWUpJykKKworICAgIF9BUkNISVZFX0ZPUk1BVFNbbmFtZV0gPSAoZnVuY3Rpb24sIGV4dHJhX2FyZ3MsIGRlc2NyaXB0aW9uKQorCitkZWYgdW5yZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdChuYW1lKToKKyAgICBkZWwgX0FSQ0hJVkVfRk9STUFUU1tuYW1lXQorCitkZWYgbWFrZV9hcmNoaXZlKGJhc2VfbmFtZSwgZm9ybWF0LCByb290X2Rpcj1Ob25lLCBiYXNlX2Rpcj1Ob25lLCB2ZXJib3NlPTAsCisgICAgICAgICAgICAgICAgIGRyeV9ydW49MCwgb3duZXI9Tm9uZSwgZ3JvdXA9Tm9uZSwgbG9nZ2VyPU5vbmUpOgorICAgICIiIkNyZWF0ZSBhbiBhcmNoaXZlIGZpbGUgKGVnLiB6aXAgb3IgdGFyKS4KKworICAgICdiYXNlX25hbWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGNyZWF0ZSwgbWludXMgYW55IGZvcm1hdC1zcGVjaWZpYworICAgIGV4dGVuc2lvbjsgJ2Zvcm1hdCcgaXMgdGhlIGFyY2hpdmUgZm9ybWF0OiBvbmUgb2YgInppcCIsICJ0YXIiLCAiYnp0YXIiCisgICAgb3IgImd6dGFyIi4KKworICAgICdyb290X2RpcicgaXMgYSBkaXJlY3RvcnkgdGhhdCB3aWxsIGJlIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUKKyAgICBhcmNoaXZlOyBpZS4gd2UgdHlwaWNhbGx5IGNoZGlyIGludG8gJ3Jvb3RfZGlyJyBiZWZvcmUgY3JlYXRpbmcgdGhlCisgICAgYXJjaGl2ZS4gICdiYXNlX2RpcicgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB3ZSBzdGFydCBhcmNoaXZpbmcgZnJvbTsKKyAgICBpZS4gJ2Jhc2VfZGlyJyB3aWxsIGJlIHRoZSBjb21tb24gcHJlZml4IG9mIGFsbCBmaWxlcyBhbmQKKyAgICBkaXJlY3RvcmllcyBpbiB0aGUgYXJjaGl2ZS4gICdyb290X2RpcicgYW5kICdiYXNlX2RpcicgYm90aCBkZWZhdWx0CisgICAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXJjaGl2ZSBmaWxlLgorCisgICAgJ293bmVyJyBhbmQgJ2dyb3VwJyBhcmUgdXNlZCB3aGVuIGNyZWF0aW5nIGEgdGFyIGFyY2hpdmUuIEJ5IGRlZmF1bHQsCisgICAgdXNlcyB0aGUgY3VycmVudCBvd25lciBhbmQgZ3JvdXAuCisgICAgIiIiCisgICAgc2F2ZV9jd2QgPSBvcy5nZXRjd2QoKQorICAgIGlmIHJvb3RfZGlyIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBsb2dnZXIuZGVidWcoImNoYW5naW5nIGludG8gJyVzJyIsIHJvb3RfZGlyKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmFic3BhdGgoYmFzZV9uYW1lKQorICAgICAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgICAgIG9zLmNoZGlyKHJvb3RfZGlyKQorCisgICAgaWYgYmFzZV9kaXIgaXMgTm9uZToKKyAgICAgICAgYmFzZV9kaXIgPSBvcy5jdXJkaXIKKworICAgIGt3YXJncyA9IHsnZHJ5X3J1bic6IGRyeV9ydW4sICdsb2dnZXInOiBsb2dnZXJ9CisKKyAgICB0cnk6CisgICAgICAgIGZvcm1hdF9pbmZvID0gX0FSQ0hJVkVfRk9STUFUU1tmb3JtYXRdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAidW5rbm93biBhcmNoaXZlIGZvcm1hdCAnJXMnIiAlIGZvcm1hdAorCisgICAgZnVuYyA9IGZvcm1hdF9pbmZvWzBdCisgICAgZm9yIGFyZywgdmFsIGluIGZvcm1hdF9pbmZvWzFdOgorICAgICAgICBrd2FyZ3NbYXJnXSA9IHZhbAorCisgICAgaWYgZm9ybWF0ICE9ICd6aXAnOgorICAgICAgICBrd2FyZ3NbJ293bmVyJ10gPSBvd25lcgorICAgICAgICBrd2FyZ3NbJ2dyb3VwJ10gPSBncm91cAorCisgICAgdHJ5OgorICAgICAgICBmaWxlbmFtZSA9IGZ1bmMoYmFzZV9uYW1lLCBiYXNlX2RpciwgKiprd2FyZ3MpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgcm9vdF9kaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBsb2dnZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJjaGFuZ2luZyBiYWNrIHRvICclcyciLCBzYXZlX2N3ZCkKKyAgICAgICAgICAgIG9zLmNoZGlyKHNhdmVfY3dkKQorCisgICAgcmV0dXJuIGZpbGVuYW1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NodXRpbC5weWMgYi9saWIvcHl0aG9uMi43L3NodXRpbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyYmFlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2h1dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NodXRpbC5weW8gYi9saWIvcHl0aG9uMi43L3NodXRpbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMyYmFlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2h1dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NpdGUtcGFja2FnZXMvUkVBRE1FIGIvbGliL3B5dGhvbjIuNy9zaXRlLXBhY2thZ2VzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzNmNjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zaXRlLXBhY2thZ2VzL1JFQURNRQpAQCAtMCwwICsxLDIgQEAKK1RoaXMgZGlyZWN0b3J5IGV4aXN0cyBzbyB0aGF0IDNyZCBwYXJ0eSBwYWNrYWdlcyBjYW4gYmUgaW5zdGFsbGVkCitoZXJlLiAgUmVhZCB0aGUgc291cmNlIGZvciBzaXRlLnB5IGZvciBtb3JlIGRldGFpbHMuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NpdGUucHkgYi9saWIvcHl0aG9uMi43L3NpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiMGFlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc2l0ZS5weQpAQCAtMCwwICsxLDYwMCBAQAorIiIiQXBwZW5kIG1vZHVsZSBzZWFyY2ggcGF0aHMgZm9yIHRoaXJkLXBhcnR5IHBhY2thZ2VzIHRvIHN5cy5wYXRoLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIFRoaXMgbW9kdWxlIGlzIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLiAqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK0luIGVhcmxpZXIgdmVyc2lvbnMgb2YgUHl0aG9uICh1cCB0byAxLjVhMyksIHNjcmlwdHMgb3IgbW9kdWxlcyB0aGF0CituZWVkZWQgdG8gdXNlIHNpdGUtc3BlY2lmaWMgbW9kdWxlcyB3b3VsZCBwbGFjZSBgYGltcG9ydCBzaXRlJycKK3NvbWV3aGVyZSBuZWFyIHRoZSB0b3Agb2YgdGhlaXIgY29kZS4gIEJlY2F1c2Ugb2YgdGhlIGF1dG9tYXRpYworaW1wb3J0LCB0aGlzIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgKGJ1dCBjb2RlIHRoYXQgZG9lcyBpdCBzdGlsbAord29ya3MpLgorCitUaGlzIHdpbGwgYXBwZW5kIHNpdGUtc3BlY2lmaWMgcGF0aHMgdG8gdGhlIG1vZHVsZSBzZWFyY2ggcGF0aC4gIE9uCitVbml4IChpbmNsdWRpbmcgTWFjIE9TWCksIGl0IHN0YXJ0cyB3aXRoIHN5cy5wcmVmaXggYW5kCitzeXMuZXhlY19wcmVmaXggKGlmIGRpZmZlcmVudCkgYW5kIGFwcGVuZHMKK2xpYi9weXRob248dmVyc2lvbj4vc2l0ZS1wYWNrYWdlcyBhcyB3ZWxsIGFzIGxpYi9zaXRlLXB5dGhvbi4KK09uIG90aGVyIHBsYXRmb3JtcyAoc3VjaCBhcyBXaW5kb3dzKSwgaXQgdHJpZXMgZWFjaCBvZiB0aGUKK3ByZWZpeGVzIGRpcmVjdGx5LCBhcyB3ZWxsIGFzIHdpdGggbGliL3NpdGUtcGFja2FnZXMgYXBwZW5kZWQuICBUaGUKK3Jlc3VsdGluZyBkaXJlY3RvcmllcywgaWYgdGhleSBleGlzdCwgYXJlIGFwcGVuZGVkIHRvIHN5cy5wYXRoLCBhbmQKK2Fsc28gaW5zcGVjdGVkIGZvciBwYXRoIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKK0EgcGF0aCBjb25maWd1cmF0aW9uIGZpbGUgaXMgYSBmaWxlIHdob3NlIG5hbWUgaGFzIHRoZSBmb3JtCis8cGFja2FnZT4ucHRoOyBpdHMgY29udGVudHMgYXJlIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgKG9uZSBwZXIgbGluZSkKK3RvIGJlIGFkZGVkIHRvIHN5cy5wYXRoLiAgTm9uLWV4aXN0aW5nIGRpcmVjdG9yaWVzIChvcgorbm9uLWRpcmVjdG9yaWVzKSBhcmUgbmV2ZXIgYWRkZWQgdG8gc3lzLnBhdGg7IG5vIGRpcmVjdG9yeSBpcyBhZGRlZCB0bworc3lzLnBhdGggbW9yZSB0aGFuIG9uY2UuICBCbGFuayBsaW5lcyBhbmQgbGluZXMgYmVnaW5uaW5nIHdpdGgKKycjJyBhcmUgc2tpcHBlZC4gTGluZXMgc3RhcnRpbmcgd2l0aCAnaW1wb3J0JyBhcmUgZXhlY3V0ZWQuCisKK0ZvciBleGFtcGxlLCBzdXBwb3NlIHN5cy5wcmVmaXggYW5kIHN5cy5leGVjX3ByZWZpeCBhcmUgc2V0IHRvCisvdXNyL2xvY2FsIGFuZCB0aGVyZSBpcyBhIGRpcmVjdG9yeSAvdXNyL2xvY2FsL2xpYi9weXRob24yLjUvc2l0ZS1wYWNrYWdlcword2l0aCB0aHJlZSBzdWJkaXJlY3RvcmllcywgZm9vLCBiYXIgYW5kIHNwYW0sIGFuZCB0d28gcGF0aAorY29uZmlndXJhdGlvbiBmaWxlcywgZm9vLnB0aCBhbmQgYmFyLnB0aC4gIEFzc3VtZSBmb28ucHRoIGNvbnRhaW5zIHRoZQorZm9sbG93aW5nOgorCisgICMgZm9vIHBhY2thZ2UgY29uZmlndXJhdGlvbgorICBmb28KKyAgYmFyCisgIGJsZXRjaAorCithbmQgYmFyLnB0aCBjb250YWluczoKKworICAjIGJhciBwYWNrYWdlIGNvbmZpZ3VyYXRpb24KKyAgYmFyCisKK1RoZW4gdGhlIGZvbGxvd2luZyBkaXJlY3RvcmllcyBhcmUgYWRkZWQgdG8gc3lzLnBhdGgsIGluIHRoaXMgb3JkZXI6CisKKyAgL3Vzci9sb2NhbC9saWIvcHl0aG9uMi41L3NpdGUtcGFja2FnZXMvYmFyCisgIC91c3IvbG9jYWwvbGliL3B5dGhvbjIuNS9zaXRlLXBhY2thZ2VzL2ZvbworCitOb3RlIHRoYXQgYmxldGNoIGlzIG9taXR0ZWQgYmVjYXVzZSBpdCBkb2Vzbid0IGV4aXN0OyBiYXIgcHJlY2VkZXMgZm9vCitiZWNhdXNlIGJhci5wdGggY29tZXMgYWxwaGFiZXRpY2FsbHkgYmVmb3JlIGZvby5wdGg7IGFuZCBzcGFtIGlzCitvbWl0dGVkIGJlY2F1c2UgaXQgaXMgbm90IG1lbnRpb25lZCBpbiBlaXRoZXIgcGF0aCBjb25maWd1cmF0aW9uIGZpbGUuCisKK0FmdGVyIHRoZXNlIHBhdGggbWFuaXB1bGF0aW9ucywgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGltcG9ydCBhIG1vZHVsZQorbmFtZWQgc2l0ZWN1c3RvbWl6ZSwgd2hpY2ggY2FuIHBlcmZvcm0gYXJiaXRyYXJ5IGFkZGl0aW9uYWwKK3NpdGUtc3BlY2lmaWMgY3VzdG9taXphdGlvbnMuICBJZiB0aGlzIGltcG9ydCBmYWlscyB3aXRoIGFuCitJbXBvcnRFcnJvciBleGNlcHRpb24sIGl0IGlzIHNpbGVudGx5IGlnbm9yZWQuCisKKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IHRyYWNlYmFjaworCisjIFByZWZpeGVzIGZvciBzaXRlLXBhY2thZ2VzOyBhZGQgYWRkaXRpb25hbCBwcmVmaXhlcyBsaWtlIC91c3IvbG9jYWwgaGVyZQorUFJFRklYRVMgPSBbc3lzLnByZWZpeCwgc3lzLmV4ZWNfcHJlZml4XQorIyBFbmFibGUgcGVyIHVzZXIgc2l0ZS1wYWNrYWdlcyBkaXJlY3RvcnkKKyMgc2V0IGl0IHRvIEZhbHNlIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUgb3IgVHJ1ZSB0byBmb3JjZSB0aGUgZmVhdHVyZQorRU5BQkxFX1VTRVJfU0lURSA9IE5vbmUKKworIyBmb3IgZGlzdHV0aWxzLmNvbW1hbmRzLmluc3RhbGwKKyMgVGhlc2UgdmFsdWVzIGFyZSBpbml0aWFsaXplZCBieSB0aGUgZ2V0dXNlcmJhc2UoKSBhbmQgZ2V0dXNlcnNpdGVwYWNrYWdlcygpCisjIGZ1bmN0aW9ucywgdGhyb3VnaCB0aGUgbWFpbigpIGZ1bmN0aW9uIHdoZW4gUHl0aG9uIHN0YXJ0cy4KK1VTRVJfU0lURSA9IE5vbmUKK1VTRVJfQkFTRSA9IE5vbmUKKworCitkZWYgbWFrZXBhdGgoKnBhdGhzKToKKyAgICBkaXIgPSBvcy5wYXRoLmpvaW4oKnBhdGhzKQorICAgIHRyeToKKyAgICAgICAgZGlyID0gb3MucGF0aC5hYnNwYXRoKGRpcikKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcGFzcworICAgIHJldHVybiBkaXIsIG9zLnBhdGgubm9ybWNhc2UoZGlyKQorCisKK2RlZiBhYnNfX2ZpbGVfXygpOgorICAgICIiIlNldCBhbGwgbW9kdWxlJyBfX2ZpbGVfXyBhdHRyaWJ1dGUgdG8gYW4gYWJzb2x1dGUgcGF0aCIiIgorICAgIGZvciBtIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgorICAgICAgICBpZiBoYXNhdHRyKG0sICdfX2xvYWRlcl9fJyk6CisgICAgICAgICAgICBjb250aW51ZSAgICMgZG9uJ3QgbWVzcyB3aXRoIGEgUEVQIDMwMi1zdXBwbGllZCBfX2ZpbGVfXworICAgICAgICB0cnk6CisgICAgICAgICAgICBtLl9fZmlsZV9fID0gb3MucGF0aC5hYnNwYXRoKG0uX19maWxlX18pCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIE9TRXJyb3IpOgorICAgICAgICAgICAgcGFzcworCisKK2RlZiByZW1vdmVkdXBwYXRocygpOgorICAgICIiIiBSZW1vdmUgZHVwbGljYXRlIGVudHJpZXMgZnJvbSBzeXMucGF0aCBhbG9uZyB3aXRoIG1ha2luZyB0aGVtCisgICAgYWJzb2x1dGUiIiIKKyAgICAjIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBpbml0aWFsIHBhdGggcHJvdmlkZWQgYnkgdGhlIGludGVycHJldGVyIGNvbnRhaW5zCisgICAgIyBvbmx5IGFic29sdXRlIHBhdGhuYW1lcywgZXZlbiBpZiB3ZSdyZSBydW5uaW5nIGZyb20gdGhlIGJ1aWxkIGRpcmVjdG9yeS4KKyAgICBMID0gW10KKyAgICBrbm93bl9wYXRocyA9IHNldCgpCisgICAgZm9yIGRpciBpbiBzeXMucGF0aDoKKyAgICAgICAgIyBGaWx0ZXIgb3V0IGR1cGxpY2F0ZSBwYXRocyAob24gY2FzZS1pbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbXMgYWxzbworICAgICAgICAjIGlmIHRoZXkgb25seSBkaWZmZXIgaW4gY2FzZSk7IHR1cm4gcmVsYXRpdmUgcGF0aHMgaW50byBhYnNvbHV0ZQorICAgICAgICAjIHBhdGhzLgorICAgICAgICBkaXIsIGRpcmNhc2UgPSBtYWtlcGF0aChkaXIpCisgICAgICAgIGlmIG5vdCBkaXJjYXNlIGluIGtub3duX3BhdGhzOgorICAgICAgICAgICAgTC5hcHBlbmQoZGlyKQorICAgICAgICAgICAga25vd25fcGF0aHMuYWRkKGRpcmNhc2UpCisgICAgc3lzLnBhdGhbOl0gPSBMCisgICAgcmV0dXJuIGtub3duX3BhdGhzCisKKworZGVmIF9pbml0X3BhdGhpbmZvKCk6CisgICAgIiIiUmV0dXJuIGEgc2V0IGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIGRpcmVjdG9yeSBlbnRyaWVzIGZyb20gc3lzLnBhdGgiIiIKKyAgICBkID0gc2V0KCkKKyAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRpcik6CisgICAgICAgICAgICAgICAgZGlyLCBkaXJjYXNlID0gbWFrZXBhdGgoZGlyKQorICAgICAgICAgICAgICAgIGQuYWRkKGRpcmNhc2UpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorICAgIHJldHVybiBkCisKKworZGVmIGFkZHBhY2thZ2Uoc2l0ZWRpciwgbmFtZSwga25vd25fcGF0aHMpOgorICAgICIiIlByb2Nlc3MgYSAucHRoIGZpbGUgd2l0aGluIHRoZSBzaXRlLXBhY2thZ2VzIGRpcmVjdG9yeToKKyAgICAgICBGb3IgZWFjaCBsaW5lIGluIHRoZSBmaWxlLCBlaXRoZXIgY29tYmluZSBpdCB3aXRoIHNpdGVkaXIgdG8gYSBwYXRoCisgICAgICAgYW5kIGFkZCB0aGF0IHRvIGtub3duX3BhdGhzLCBvciBleGVjdXRlIGl0IGlmIGl0IHN0YXJ0cyB3aXRoICdpbXBvcnQgJy4KKyAgICAiIiIKKyAgICBpZiBrbm93bl9wYXRocyBpcyBOb25lOgorICAgICAgICBfaW5pdF9wYXRoaW5mbygpCisgICAgICAgIHJlc2V0ID0gMQorICAgIGVsc2U6CisgICAgICAgIHJlc2V0ID0gMAorICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHNpdGVkaXIsIG5hbWUpCisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihmdWxsbmFtZSwgInJVIikKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmV0dXJuCisgICAgd2l0aCBmOgorICAgICAgICBmb3IgbiwgbGluZSBpbiBlbnVtZXJhdGUoZik6CisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIiMiKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgoImltcG9ydCAiLCAiaW1wb3J0XHQiKSk6CisgICAgICAgICAgICAgICAgICAgIGV4ZWMgbGluZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgZGlyLCBkaXJjYXNlID0gbWFrZXBhdGgoc2l0ZWRpciwgbGluZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGlyY2FzZSBpbiBrbm93bl9wYXRocyBhbmQgb3MucGF0aC5leGlzdHMoZGlyKToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnBhdGguYXBwZW5kKGRpcikKKyAgICAgICAgICAgICAgICAgICAga25vd25fcGF0aHMuYWRkKGRpcmNhc2UpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGVycjoKKyAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJFcnJvciBwcm9jZXNzaW5nIGxpbmUgezpkfSBvZiB7fTpcbiIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICBuKzEsIGZ1bGxuYW1lKQorICAgICAgICAgICAgICAgIGZvciByZWNvcmQgaW4gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb24oKnN5cy5leGNfaW5mbygpKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gcmVjb3JkLnNwbGl0bGluZXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgJyAgJytsaW5lCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiXG5SZW1haW5kZXIgb2YgZmlsZSBpZ25vcmVkIgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgaWYgcmVzZXQ6CisgICAgICAgIGtub3duX3BhdGhzID0gTm9uZQorICAgIHJldHVybiBrbm93bl9wYXRocworCisKK2RlZiBhZGRzaXRlZGlyKHNpdGVkaXIsIGtub3duX3BhdGhzPU5vbmUpOgorICAgICIiIkFkZCAnc2l0ZWRpcicgYXJndW1lbnQgdG8gc3lzLnBhdGggaWYgbWlzc2luZyBhbmQgaGFuZGxlIC5wdGggZmlsZXMgaW4KKyAgICAnc2l0ZWRpciciIiIKKyAgICBpZiBrbm93bl9wYXRocyBpcyBOb25lOgorICAgICAgICBrbm93bl9wYXRocyA9IF9pbml0X3BhdGhpbmZvKCkKKyAgICAgICAgcmVzZXQgPSAxCisgICAgZWxzZToKKyAgICAgICAgcmVzZXQgPSAwCisgICAgc2l0ZWRpciwgc2l0ZWRpcmNhc2UgPSBtYWtlcGF0aChzaXRlZGlyKQorICAgIGlmIG5vdCBzaXRlZGlyY2FzZSBpbiBrbm93bl9wYXRoczoKKyAgICAgICAgc3lzLnBhdGguYXBwZW5kKHNpdGVkaXIpICAgICAgICAjIEFkZCBwYXRoIGNvbXBvbmVudAorICAgIHRyeToKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHNpdGVkaXIpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICByZXR1cm4KKyAgICBkb3RwdGggPSBvcy5leHRzZXAgKyAicHRoIgorICAgIG5hbWVzID0gW25hbWUgZm9yIG5hbWUgaW4gbmFtZXMgaWYgbmFtZS5lbmRzd2l0aChkb3RwdGgpXQorICAgIGZvciBuYW1lIGluIHNvcnRlZChuYW1lcyk6CisgICAgICAgIGFkZHBhY2thZ2Uoc2l0ZWRpciwgbmFtZSwga25vd25fcGF0aHMpCisgICAgaWYgcmVzZXQ6CisgICAgICAgIGtub3duX3BhdGhzID0gTm9uZQorICAgIHJldHVybiBrbm93bl9wYXRocworCisKK2RlZiBjaGVja19lbmFibGV1c2Vyc2l0ZSgpOgorICAgICIiIkNoZWNrIGlmIHVzZXIgc2l0ZSBkaXJlY3RvcnkgaXMgc2FmZSBmb3IgaW5jbHVzaW9uCisKKyAgICBUaGUgZnVuY3Rpb24gdGVzdHMgZm9yIHRoZSBjb21tYW5kIGxpbmUgZmxhZyAoaW5jbHVkaW5nIGVudmlyb25tZW50IHZhciksCisgICAgcHJvY2VzcyB1aWQvZ2lkIGVxdWFsIHRvIGVmZmVjdGl2ZSB1aWQvZ2lkLgorCisgICAgTm9uZTogRGlzYWJsZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMKKyAgICBGYWxzZTogRGlzYWJsZWQgYnkgdXNlciAoY29tbWFuZCBsaW5lIG9wdGlvbikKKyAgICBUcnVlOiBTYWZlIGFuZCBlbmFibGVkCisgICAgIiIiCisgICAgaWYgc3lzLmZsYWdzLm5vX3VzZXJfc2l0ZToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBpZiBoYXNhdHRyKG9zLCAiZ2V0dWlkIikgYW5kIGhhc2F0dHIob3MsICJnZXRldWlkIik6CisgICAgICAgICMgY2hlY2sgcHJvY2VzcyB1aWQgPT0gZWZmZWN0aXZlIHVpZAorICAgICAgICBpZiBvcy5nZXRldWlkKCkgIT0gb3MuZ2V0dWlkKCk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIGhhc2F0dHIob3MsICJnZXRnaWQiKSBhbmQgaGFzYXR0cihvcywgImdldGVnaWQiKToKKyAgICAgICAgIyBjaGVjayBwcm9jZXNzIGdpZCA9PSBlZmZlY3RpdmUgZ2lkCisgICAgICAgIGlmIG9zLmdldGVnaWQoKSAhPSBvcy5nZXRnaWQoKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgZ2V0dXNlcmJhc2UoKToKKyAgICAiIiJSZXR1cm5zIHRoZSBgdXNlciBiYXNlYCBkaXJlY3RvcnkgcGF0aC4KKworICAgIFRoZSBgdXNlciBiYXNlYCBkaXJlY3RvcnkgY2FuIGJlIHVzZWQgdG8gc3RvcmUgZGF0YS4gSWYgdGhlIGdsb2JhbAorICAgIHZhcmlhYmxlIGBgVVNFUl9CQVNFYGAgaXMgbm90IGluaXRpYWxpemVkIHlldCwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gc2V0CisgICAgaXQuCisgICAgIiIiCisgICAgZ2xvYmFsIFVTRVJfQkFTRQorICAgIGlmIFVTRVJfQkFTRSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIFVTRVJfQkFTRQorICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcgorICAgIFVTRVJfQkFTRSA9IGdldF9jb25maWdfdmFyKCd1c2VyYmFzZScpCisgICAgcmV0dXJuIFVTRVJfQkFTRQorCitkZWYgZ2V0dXNlcnNpdGVwYWNrYWdlcygpOgorICAgICIiIlJldHVybnMgdGhlIHVzZXItc3BlY2lmaWMgc2l0ZS1wYWNrYWdlcyBkaXJlY3RvcnkgcGF0aC4KKworICAgIElmIHRoZSBnbG9iYWwgdmFyaWFibGUgYGBVU0VSX1NJVEVgYCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0LCB0aGlzCisgICAgZnVuY3Rpb24gd2lsbCBhbHNvIHNldCBpdC4KKyAgICAiIiIKKyAgICBnbG9iYWwgVVNFUl9TSVRFCisgICAgdXNlcl9iYXNlID0gZ2V0dXNlcmJhc2UoKSAjIHRoaXMgd2lsbCBhbHNvIHNldCBVU0VSX0JBU0UKKworICAgIGlmIFVTRVJfU0lURSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIFVTRVJfU0lURQorCisgICAgZnJvbSBzeXNjb25maWcgaW1wb3J0IGdldF9wYXRoCisgICAgaW1wb3J0IG9zCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcgorICAgICAgICBpZiBnZXRfY29uZmlnX3ZhcignUFlUSE9ORlJBTUVXT1JLJyk6CisgICAgICAgICAgICBVU0VSX1NJVEUgPSBnZXRfcGF0aCgncHVyZWxpYicsICdvc3hfZnJhbWV3b3JrX3VzZXInKQorICAgICAgICAgICAgcmV0dXJuIFVTRVJfU0lURQorCisgICAgVVNFUl9TSVRFID0gZ2V0X3BhdGgoJ3B1cmVsaWInLCAnJXNfdXNlcicgJSBvcy5uYW1lKQorICAgIHJldHVybiBVU0VSX1NJVEUKKworZGVmIGFkZHVzZXJzaXRlcGFja2FnZXMoa25vd25fcGF0aHMpOgorICAgICIiIkFkZCBhIHBlciB1c2VyIHNpdGUtcGFja2FnZSB0byBzeXMucGF0aAorCisgICAgRWFjaCB1c2VyIGhhcyBpdHMgb3duIHB5dGhvbiBkaXJlY3Rvcnkgd2l0aCBzaXRlLXBhY2thZ2VzIGluIHRoZQorICAgIGhvbWUgZGlyZWN0b3J5LgorICAgICIiIgorICAgICMgZ2V0IHRoZSBwZXIgdXNlciBzaXRlLXBhY2thZ2UgcGF0aAorICAgICMgdGhpcyBjYWxsIHdpbGwgYWxzbyBtYWtlIHN1cmUgVVNFUl9CQVNFIGFuZCBVU0VSX1NJVEUgYXJlIHNldAorICAgIHVzZXJfc2l0ZSA9IGdldHVzZXJzaXRlcGFja2FnZXMoKQorCisgICAgaWYgRU5BQkxFX1VTRVJfU0lURSBhbmQgb3MucGF0aC5pc2Rpcih1c2VyX3NpdGUpOgorICAgICAgICBhZGRzaXRlZGlyKHVzZXJfc2l0ZSwga25vd25fcGF0aHMpCisgICAgcmV0dXJuIGtub3duX3BhdGhzCisKK2RlZiBnZXRzaXRlcGFja2FnZXMoKToKKyAgICAiIiJSZXR1cm5zIGEgbGlzdCBjb250YWluaW5nIGFsbCBnbG9iYWwgc2l0ZS1wYWNrYWdlcyBkaXJlY3RvcmllcworICAgIChhbmQgcG9zc2libHkgc2l0ZS1weXRob24pLgorCisgICAgRm9yIGVhY2ggZGlyZWN0b3J5IHByZXNlbnQgaW4gdGhlIGdsb2JhbCBgYFBSRUZJWEVTYGAsIHRoaXMgZnVuY3Rpb24KKyAgICB3aWxsIGZpbmQgaXRzIGBzaXRlLXBhY2thZ2VzYCBzdWJkaXJlY3RvcnkgZGVwZW5kaW5nIG9uIHRoZSBzeXN0ZW0KKyAgICBlbnZpcm9ubWVudCwgYW5kIHdpbGwgcmV0dXJuIGEgbGlzdCBvZiBmdWxsIHBhdGhzLgorICAgICIiIgorICAgIHNpdGVwYWNrYWdlcyA9IFtdCisgICAgc2VlbiA9IHNldCgpCisKKyAgICBmb3IgcHJlZml4IGluIFBSRUZJWEVTOgorICAgICAgICBpZiBub3QgcHJlZml4IG9yIHByZWZpeCBpbiBzZWVuOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgc2Vlbi5hZGQocHJlZml4KQorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ29zMmVteCcsICdyaXNjb3MnKToKKyAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIsICJzaXRlLXBhY2thZ2VzIikpCisgICAgICAgIGVsaWYgb3Muc2VwID09ICcvJzoKKyAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNpdGUtcGFja2FnZXMiKSkKKyAgICAgICAgICAgIHNpdGVwYWNrYWdlcy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXB5dGhvbiIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICBzaXRlcGFja2FnZXMuYXBwZW5kKG9zLnBhdGguam9pbihwcmVmaXgsICJsaWIiLCAic2l0ZS1wYWNrYWdlcyIpKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICAjIGZvciBmcmFtZXdvcmsgYnVpbGRzICpvbmx5KiB3ZSBhZGQgdGhlIHN0YW5kYXJkIEFwcGxlCisgICAgICAgICAgICAjIGxvY2F0aW9ucy4KKyAgICAgICAgICAgIGZyb20gc3lzY29uZmlnIGltcG9ydCBnZXRfY29uZmlnX3ZhcgorICAgICAgICAgICAgZnJhbWV3b3JrID0gZ2V0X2NvbmZpZ192YXIoIlBZVEhPTkZSQU1FV09SSyIpCisgICAgICAgICAgICBpZiBmcmFtZXdvcms6CisgICAgICAgICAgICAgICAgc2l0ZXBhY2thZ2VzLmFwcGVuZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbigiL0xpYnJhcnkiLCBmcmFtZXdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLCAic2l0ZS1wYWNrYWdlcyIpKQorICAgIHJldHVybiBzaXRlcGFja2FnZXMKKworZGVmIGFkZHNpdGVwYWNrYWdlcyhrbm93bl9wYXRocyk6CisgICAgIiIiQWRkIHNpdGUtcGFja2FnZXMgKGFuZCBwb3NzaWJseSBzaXRlLXB5dGhvbikgdG8gc3lzLnBhdGgiIiIKKyAgICBmb3Igc2l0ZWRpciBpbiBnZXRzaXRlcGFja2FnZXMoKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzaXRlZGlyKToKKyAgICAgICAgICAgIGFkZHNpdGVkaXIoc2l0ZWRpciwga25vd25fcGF0aHMpCisKKyAgICByZXR1cm4ga25vd25fcGF0aHMKKworZGVmIHNldEJFR0lOTElCUEFUSCgpOgorICAgICIiIlRoZSBPUy8yIEVNWCBwb3J0IGhhcyBvcHRpb25hbCBleHRlbnNpb24gbW9kdWxlcyB0aGF0IGRvIGRvdWJsZSBkdXR5CisgICAgYXMgRExMcyAoYW5kIG11c3QgdXNlIHRoZSAuRExMIGZpbGUgZXh0ZW5zaW9uKSBmb3Igb3RoZXIgZXh0ZW5zaW9ucy4KKyAgICBUaGUgbGlicmFyeSBzZWFyY2ggcGF0aCBuZWVkcyB0byBiZSBhbWVuZGVkIHNvIHRoZXNlIHdpbGwgYmUgZm91bmQKKyAgICBkdXJpbmcgbW9kdWxlIGltcG9ydC4gIFVzZSBCRUdJTkxJQlBBVEggc28gdGhhdCB0aGVzZSBhcmUgYXQgdGhlIHN0YXJ0CisgICAgb2YgdGhlIGxpYnJhcnkgc2VhcmNoIHBhdGguCisKKyAgICAiIiIKKyAgICBkbGxwYXRoID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICJMaWIiLCAibGliLWR5bmxvYWQiKQorICAgIGxpYnBhdGggPSBvcy5lbnZpcm9uWydCRUdJTkxJQlBBVEgnXS5zcGxpdCgnOycpCisgICAgaWYgbGlicGF0aFstMV06CisgICAgICAgIGxpYnBhdGguYXBwZW5kKGRsbHBhdGgpCisgICAgZWxzZToKKyAgICAgICAgbGlicGF0aFstMV0gPSBkbGxwYXRoCisgICAgb3MuZW52aXJvblsnQkVHSU5MSUJQQVRIJ10gPSAnOycuam9pbihsaWJwYXRoKQorCisKK2RlZiBzZXRxdWl0KCk6CisgICAgIiIiRGVmaW5lIG5ldyBidWlsdGlucyAncXVpdCcgYW5kICdleGl0Jy4KKworICAgIFRoZXNlIGFyZSBvYmplY3RzIHdoaWNoIG1ha2UgdGhlIGludGVycHJldGVyIGV4aXQgd2hlbiBjYWxsZWQuCisgICAgVGhlIHJlcHIgb2YgZWFjaCBvYmplY3QgY29udGFpbnMgYSBoaW50IGF0IGhvdyBpdCB3b3Jrcy4KKworICAgICIiIgorICAgIGlmIG9zLnNlcCA9PSAnOic6CisgICAgICAgIGVvZiA9ICdDbWQtUScKKyAgICBlbGlmIG9zLnNlcCA9PSAnXFwnOgorICAgICAgICBlb2YgPSAnQ3RybC1aIHBsdXMgUmV0dXJuJworICAgIGVsc2U6CisgICAgICAgIGVvZiA9ICdDdHJsLUQgKGkuZS4gRU9GKScKKworICAgIGNsYXNzIFF1aXR0ZXIob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gJ1VzZSAlcygpIG9yICVzIHRvIGV4aXQnICUgKHNlbGYubmFtZSwgZW9mKQorICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgY29kZT1Ob25lKToKKyAgICAgICAgICAgICMgU2hlbGxzIGxpa2UgSURMRSBjYXRjaCB0aGUgU3lzdGVtRXhpdCwgYnV0IGxpc3RlbiB3aGVuIHRoZWlyCisgICAgICAgICAgICAjIHN0ZGluIHdyYXBwZXIgaXMgY2xvc2VkLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdChjb2RlKQorICAgIF9fYnVpbHRpbl9fLnF1aXQgPSBRdWl0dGVyKCdxdWl0JykKKyAgICBfX2J1aWx0aW5fXy5leGl0ID0gUXVpdHRlcignZXhpdCcpCisKKworY2xhc3MgX1ByaW50ZXIob2JqZWN0KToKKyAgICAiIiJpbnRlcmFjdGl2ZSBwcm9tcHQgb2JqZWN0cyBmb3IgcHJpbnRpbmcgdGhlIGxpY2Vuc2UgdGV4dCwgYSBsaXN0IG9mCisgICAgY29udHJpYnV0b3JzIGFuZCB0aGUgY29weXJpZ2h0IG5vdGljZS4iIiIKKworICAgIE1BWExJTkVTID0gMjMKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBkYXRhLCBmaWxlcz0oKSwgZGlycz0oKSk6CisgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQorICAgICAgICBzZWxmLl9fZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi5fX2ZpbGVzID0gZmlsZXMKKyAgICAgICAgc2VsZi5fX2RpcnMgPSBkaXJzCisgICAgICAgIHNlbGYuX19saW5lcyA9IE5vbmUKKworICAgIGRlZiBfX3NldHVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fbGluZXM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZGF0YSA9IE5vbmUKKyAgICAgICAgZm9yIGRpciBpbiBzZWxmLl9fZGlyczoKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWxmLl9fZmlsZXM6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZwID0gZmlsZShmaWxlbmFtZSwgInJVIikKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fX2RhdGEKKyAgICAgICAgc2VsZi5fX2xpbmVzID0gZGF0YS5zcGxpdCgnXG4nKQorICAgICAgICBzZWxmLl9fbGluZWNudCA9IGxlbihzZWxmLl9fbGluZXMpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHNlbGYuX19zZXR1cCgpCisgICAgICAgIGlmIGxlbihzZWxmLl9fbGluZXMpIDw9IHNlbGYuTUFYTElORVM6CisgICAgICAgICAgICByZXR1cm4gIlxuIi5qb2luKHNlbGYuX19saW5lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiVHlwZSAlcygpIHRvIHNlZSB0aGUgZnVsbCAlcyB0ZXh0IiAlICgoc2VsZi5fX25hbWUsKSoyKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9fc2V0dXAoKQorICAgICAgICBwcm9tcHQgPSAnSGl0IFJldHVybiBmb3IgbW9yZSwgb3IgcSAoYW5kIFJldHVybikgdG8gcXVpdDogJworICAgICAgICBsaW5lbm8gPSAwCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGluZW5vLCBsaW5lbm8gKyBzZWxmLk1BWExJTkVTKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5fX2xpbmVzW2ldCisgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsaW5lbm8gKz0gc2VsZi5NQVhMSU5FUworICAgICAgICAgICAgICAgIGtleSA9IE5vbmUKKyAgICAgICAgICAgICAgICB3aGlsZSBrZXkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAga2V5ID0gcmF3X2lucHV0KHByb21wdCkKKyAgICAgICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiAoJycsICdxJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBOb25lCisgICAgICAgICAgICAgICAgaWYga2V5ID09ICdxJzoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworZGVmIHNldGNvcHlyaWdodCgpOgorICAgICIiIlNldCAnY29weXJpZ2h0JyBhbmQgJ2NyZWRpdHMnIGluIF9fYnVpbHRpbl9fIiIiCisgICAgX19idWlsdGluX18uY29weXJpZ2h0ID0gX1ByaW50ZXIoImNvcHlyaWdodCIsIHN5cy5jb3B5cmlnaHQpCisgICAgaWYgc3lzLnBsYXRmb3JtWzo0XSA9PSAnamF2YSc6CisgICAgICAgIF9fYnVpbHRpbl9fLmNyZWRpdHMgPSBfUHJpbnRlcigKKyAgICAgICAgICAgICJjcmVkaXRzIiwKKyAgICAgICAgICAgICJKeXRob24gaXMgbWFpbnRhaW5lZCBieSB0aGUgSnl0aG9uIGRldmVsb3BlcnMgKHd3dy5qeXRob24ub3JnKS4iKQorICAgIGVsc2U6CisgICAgICAgIF9fYnVpbHRpbl9fLmNyZWRpdHMgPSBfUHJpbnRlcigiY3JlZGl0cyIsICIiIlwKKyAgICBUaGFua3MgdG8gQ1dJLCBDTlJJLCBCZU9wZW4uY29tLCBab3BlIENvcnBvcmF0aW9uIGFuZCBhIGNhc3Qgb2YgdGhvdXNhbmRzCisgICAgZm9yIHN1cHBvcnRpbmcgUHl0aG9uIGRldmVsb3BtZW50LiAgU2VlIHd3dy5weXRob24ub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uLiIiIikKKyAgICBoZXJlID0gb3MucGF0aC5kaXJuYW1lKG9zLl9fZmlsZV9fKQorICAgIF9fYnVpbHRpbl9fLmxpY2Vuc2UgPSBfUHJpbnRlcigKKyAgICAgICAgImxpY2Vuc2UiLCAiU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8lLjNzL2xpY2Vuc2UuaHRtbCIgJSBzeXMudmVyc2lvbiwKKyAgICAgICAgWyJMSUNFTlNFLnR4dCIsICJMSUNFTlNFIl0sCisgICAgICAgIFtvcy5wYXRoLmpvaW4oaGVyZSwgb3MucGFyZGlyKSwgaGVyZSwgb3MuY3VyZGlyXSkKKworCitjbGFzcyBfSGVscGVyKG9iamVjdCk6CisgICAgIiIiRGVmaW5lIHRoZSBidWlsdGluICdoZWxwJy4KKyAgICBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgcHlkb2MuaGVscCAod2l0aCBhIHR3aXN0KS4KKworICAgICIiIgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIlR5cGUgaGVscCgpIGZvciBpbnRlcmFjdGl2ZSBoZWxwLCAiIFwKKyAgICAgICAgICAgICAgICJvciBoZWxwKG9iamVjdCkgZm9yIGhlbHAgYWJvdXQgb2JqZWN0LiIKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIGltcG9ydCBweWRvYworICAgICAgICByZXR1cm4gcHlkb2MuaGVscCgqYXJncywgKiprd2RzKQorCitkZWYgc2V0aGVscGVyKCk6CisgICAgX19idWlsdGluX18uaGVscCA9IF9IZWxwZXIoKQorCitkZWYgYWxpYXNtYmNzKCk6CisgICAgIiIiT24gV2luZG93cywgc29tZSBkZWZhdWx0IGVuY29kaW5ncyBhcmUgbm90IHByb3ZpZGVkIGJ5IFB5dGhvbiwKKyAgICB3aGlsZSB0aGV5IGFyZSBhbHdheXMgYXZhaWxhYmxlIGFzICJtYmNzIiBpbiBlYWNoIGxvY2FsZS4gTWFrZQorICAgIHRoZW0gdXNhYmxlIGJ5IGFsaWFzaW5nIHRvICJtYmNzIiBpbiBzdWNoIGEgY2FzZS4iIiIKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgaW1wb3J0IGxvY2FsZSwgY29kZWNzCisgICAgICAgIGVuYyA9IGxvY2FsZS5nZXRkZWZhdWx0bG9jYWxlKClbMV0KKyAgICAgICAgaWYgZW5jLnN0YXJ0c3dpdGgoJ2NwJyk6ICAgICAgICAgICAgIyAiY3AqKioiID8KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb2RlY3MubG9va3VwKGVuYykKKyAgICAgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICAgICBpbXBvcnQgZW5jb2RpbmdzCisgICAgICAgICAgICAgICAgZW5jb2RpbmdzLl9jYWNoZVtlbmNdID0gZW5jb2RpbmdzLl91bmtub3duCisgICAgICAgICAgICAgICAgZW5jb2RpbmdzLmFsaWFzZXMuYWxpYXNlc1tlbmNdID0gJ21iY3MnCisKK2RlZiBzZXRlbmNvZGluZygpOgorICAgICIiIlNldCB0aGUgc3RyaW5nIGVuY29kaW5nIHVzZWQgYnkgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24uICBUaGUKKyAgICBkZWZhdWx0IGlzICdhc2NpaScsIGJ1dCBpZiB5b3UncmUgd2lsbGluZyB0byBleHBlcmltZW50LCB5b3UgY2FuCisgICAgY2hhbmdlIHRoaXMuIiIiCisgICAgZW5jb2RpbmcgPSAiYXNjaWkiICMgRGVmYXVsdCB2YWx1ZSBzZXQgYnkgX1B5VW5pY29kZV9Jbml0KCkKKyAgICBpZiAwOgorICAgICAgICAjIEVuYWJsZSB0byBzdXBwb3J0IGxvY2FsZSBhd2FyZSBkZWZhdWx0IHN0cmluZyBlbmNvZGluZ3MuCisgICAgICAgIGltcG9ydCBsb2NhbGUKKyAgICAgICAgbG9jID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKQorICAgICAgICBpZiBsb2NbMV06CisgICAgICAgICAgICBlbmNvZGluZyA9IGxvY1sxXQorICAgIGlmIDA6CisgICAgICAgICMgRW5hYmxlIHRvIHN3aXRjaCBvZmYgc3RyaW5nIHRvIFVuaWNvZGUgY29lcmNpb24gYW5kIGltcGxpY2l0CisgICAgICAgICMgVW5pY29kZSB0byBzdHJpbmcgY29udmVyc2lvbi4KKyAgICAgICAgZW5jb2RpbmcgPSAidW5kZWZpbmVkIgorICAgIGlmIGVuY29kaW5nICE9ICJhc2NpaSI6CisgICAgICAgICMgT24gTm9uLVVuaWNvZGUgYnVpbGRzIHRoaXMgd2lsbCByYWlzZSBhbiBBdHRyaWJ1dGVFcnJvci4uLgorICAgICAgICBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKGVuY29kaW5nKSAjIE5lZWRzIFB5dGhvbiBVbmljb2RlIGJ1aWxkICEKKworCitkZWYgZXhlY3NpdGVjdXN0b21pemUoKToKKyAgICAiIiJSdW4gY3VzdG9tIHNpdGUgc3BlY2lmaWMgY29kZSwgaWYgYXZhaWxhYmxlLiIiIgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHNpdGVjdXN0b21pemUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBpZiBzeXMuZmxhZ3MudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5leGNlcHRob29rKCpzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgXAorICAgICAgICAgICAgICAgICInaW1wb3J0IHNpdGVjdXN0b21pemUnIGZhaWxlZDsgdXNlIC12IGZvciB0cmFjZWJhY2siCisKKworZGVmIGV4ZWN1c2VyY3VzdG9taXplKCk6CisgICAgIiIiUnVuIGN1c3RvbSB1c2VyIHNwZWNpZmljIGNvZGUsIGlmIGF2YWlsYWJsZS4iIiIKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB1c2VyY3VzdG9taXplCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgaWYgc3lzLmZsYWdzLnZlcmJvc2U6CisgICAgICAgICAgICBzeXMuZXhjZXB0aG9vaygqc3lzLmV4Y19pbmZvKCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludD4+c3lzLnN0ZGVyciwgXAorICAgICAgICAgICAgICAgICInaW1wb3J0IHVzZXJjdXN0b21pemUnIGZhaWxlZDsgdXNlIC12IGZvciB0cmFjZWJhY2siCisKKworZGVmIG1haW4oKToKKyAgICBnbG9iYWwgRU5BQkxFX1VTRVJfU0lURQorCisgICAgYWJzX19maWxlX18oKQorICAgIGtub3duX3BhdGhzID0gcmVtb3ZlZHVwcGF0aHMoKQorICAgIGlmIEVOQUJMRV9VU0VSX1NJVEUgaXMgTm9uZToKKyAgICAgICAgRU5BQkxFX1VTRVJfU0lURSA9IGNoZWNrX2VuYWJsZXVzZXJzaXRlKCkKKyAgICBrbm93bl9wYXRocyA9IGFkZHVzZXJzaXRlcGFja2FnZXMoa25vd25fcGF0aHMpCisgICAga25vd25fcGF0aHMgPSBhZGRzaXRlcGFja2FnZXMoa25vd25fcGF0aHMpCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdvczJlbXgnOgorICAgICAgICBzZXRCRUdJTkxJQlBBVEgoKQorICAgIHNldHF1aXQoKQorICAgIHNldGNvcHlyaWdodCgpCisgICAgc2V0aGVscGVyKCkKKyAgICBhbGlhc21iY3MoKQorICAgIHNldGVuY29kaW5nKCkKKyAgICBleGVjc2l0ZWN1c3RvbWl6ZSgpCisgICAgaWYgRU5BQkxFX1VTRVJfU0lURToKKyAgICAgICAgZXhlY3VzZXJjdXN0b21pemUoKQorICAgICMgUmVtb3ZlIHN5cy5zZXRkZWZhdWx0ZW5jb2RpbmcoKSBzbyB0aGF0IHVzZXJzIGNhbm5vdCBjaGFuZ2UgdGhlCisgICAgIyBlbmNvZGluZyBhZnRlciBpbml0aWFsaXphdGlvbi4gIFRoZSB0ZXN0IGZvciBwcmVzZW5jZSBpcyBuZWVkZWQgd2hlbgorICAgICMgdGhpcyBtb2R1bGUgaXMgcnVuIGFzIGEgc2NyaXB0LCBiZWNhdXNlIHRoaXMgY29kZSBpcyBleGVjdXRlZCB0d2ljZS4KKyAgICBpZiBoYXNhdHRyKHN5cywgInNldGRlZmF1bHRlbmNvZGluZyIpOgorICAgICAgICBkZWwgc3lzLnNldGRlZmF1bHRlbmNvZGluZworCittYWluKCkKKworZGVmIF9zY3JpcHQoKToKKyAgICBoZWxwID0gIiIiXAorICAgICVzIFstLXVzZXItYmFzZV0gWy0tdXNlci1zaXRlXQorCisgICAgV2l0aG91dCBhcmd1bWVudHMgcHJpbnQgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24KKyAgICBXaXRoIGFyZ3VtZW50cyBwcmludCB0aGUgdmFsdWUgb2YgVVNFUl9CQVNFIGFuZC9vciBVU0VSX1NJVEUgc2VwYXJhdGVkCisgICAgYnkgJyVzJy4KKworICAgIEV4aXQgY29kZXMgd2l0aCAtLXVzZXItYmFzZSBvciAtLXVzZXItc2l0ZToKKyAgICAgIDAgLSB1c2VyIHNpdGUgZGlyZWN0b3J5IGlzIGVuYWJsZWQKKyAgICAgIDEgLSB1c2VyIHNpdGUgZGlyZWN0b3J5IGlzIGRpc2FibGVkIGJ5IHVzZXIKKyAgICAgIDIgLSB1c2VzIHNpdGUgZGlyZWN0b3J5IGlzIGRpc2FibGVkIGJ5IHN1cGVyIHVzZXIKKyAgICAgICAgICBvciBmb3Igc2VjdXJpdHkgcmVhc29ucworICAgICA+MiAtIHVua25vd24gZXJyb3IKKyAgICAiIiIKKyAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisgICAgaWYgbm90IGFyZ3M6CisgICAgICAgIHByaW50ICJzeXMucGF0aCA9IFsiCisgICAgICAgIGZvciBkaXIgaW4gc3lzLnBhdGg6CisgICAgICAgICAgICBwcmludCAiICAgICVyLCIgJSAoZGlyLCkKKyAgICAgICAgcHJpbnQgIl0iCisgICAgICAgIHByaW50ICJVU0VSX0JBU0U6ICVyICglcykiICUgKFVTRVJfQkFTRSwKKyAgICAgICAgICAgICJleGlzdHMiIGlmIG9zLnBhdGguaXNkaXIoVVNFUl9CQVNFKSBlbHNlICJkb2Vzbid0IGV4aXN0IikKKyAgICAgICAgcHJpbnQgIlVTRVJfU0lURTogJXIgKCVzKSIgJSAoVVNFUl9TSVRFLAorICAgICAgICAgICAgImV4aXN0cyIgaWYgb3MucGF0aC5pc2RpcihVU0VSX1NJVEUpIGVsc2UgImRvZXNuJ3QgZXhpc3QiKQorICAgICAgICBwcmludCAiRU5BQkxFX1VTRVJfU0lURTogJXIiICUgIEVOQUJMRV9VU0VSX1NJVEUKKyAgICAgICAgc3lzLmV4aXQoMCkKKworICAgIGJ1ZmZlciA9IFtdCisgICAgaWYgJy0tdXNlci1iYXNlJyBpbiBhcmdzOgorICAgICAgICBidWZmZXIuYXBwZW5kKFVTRVJfQkFTRSkKKyAgICBpZiAnLS11c2VyLXNpdGUnIGluIGFyZ3M6CisgICAgICAgIGJ1ZmZlci5hcHBlbmQoVVNFUl9TSVRFKQorCisgICAgaWYgYnVmZmVyOgorICAgICAgICBwcmludCBvcy5wYXRoc2VwLmpvaW4oYnVmZmVyKQorICAgICAgICBpZiBFTkFCTEVfVVNFUl9TSVRFOgorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgZWxpZiBFTkFCTEVfVVNFUl9TSVRFIGlzIEZhbHNlOgorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgZWxpZiBFTkFCTEVfVVNFUl9TSVRFIGlzIE5vbmU6CisgICAgICAgICAgICBzeXMuZXhpdCgyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3lzLmV4aXQoMykKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgdGV4dHdyYXAKKyAgICAgICAgcHJpbnQgdGV4dHdyYXAuZGVkZW50KGhlbHAgJSAoc3lzLmFyZ3ZbMF0sIG9zLnBhdGhzZXApKQorICAgICAgICBzeXMuZXhpdCgxMCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBfc2NyaXB0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2l0ZS5weWMgYi9saWIvcHl0aG9uMi43L3NpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OGIxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc2l0ZS5weW8gYi9saWIvcHl0aG9uMi43L3NpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OGIxYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc210cGQucHkgYi9saWIvcHl0aG9uMi43L3NtdHBkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI0ZDIwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NtdHBkLnB5CkBAIC0wLDAgKzEsNTU1IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJBbiBSRkMgMjgyMSBzbXRwIHByb3h5LgorCitVc2FnZTogJShwcm9ncmFtKXMgW29wdGlvbnNdIFtsb2NhbGhvc3Q6bG9jYWxwb3J0IFtyZW1vdGVob3N0OnJlbW90ZXBvcnRdXQorCitPcHRpb25zOgorCisgICAgLS1ub3NldHVpZAorICAgIC1uCisgICAgICAgIFRoaXMgcHJvZ3JhbSBnZW5lcmFsbHkgdHJpZXMgdG8gc2V0dWlkIGBub2JvZHknLCB1bmxlc3MgdGhpcyBmbGFnIGlzCisgICAgICAgIHNldC4gIFRoZSBzZXR1aWQgY2FsbCB3aWxsIGZhaWwgaWYgdGhpcyBwcm9ncmFtIGlzIG5vdCBydW4gYXMgcm9vdCAoaW4KKyAgICAgICAgd2hpY2ggY2FzZSwgdXNlIHRoaXMgZmxhZykuCisKKyAgICAtLXZlcnNpb24KKyAgICAtVgorICAgICAgICBQcmludCB0aGUgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQuCisKKyAgICAtLWNsYXNzIGNsYXNzbmFtZQorICAgIC1jIGNsYXNzbmFtZQorICAgICAgICBVc2UgYGNsYXNzbmFtZScgYXMgdGhlIGNvbmNyZXRlIFNNVFAgcHJveHkgY2xhc3MuICBVc2VzIGBQdXJlUHJveHknIGJ5CisgICAgICAgIGRlZmF1bHQuCisKKyAgICAtLWRlYnVnCisgICAgLWQKKyAgICAgICAgVHVybiBvbiBkZWJ1Z2dpbmcgcHJpbnRzLgorCisgICAgLS1oZWxwCisgICAgLWgKKyAgICAgICAgUHJpbnQgdGhpcyBtZXNzYWdlIGFuZCBleGl0LgorCitWZXJzaW9uOiAlKF9fdmVyc2lvbl9fKXMKKworSWYgbG9jYWxob3N0IGlzIG5vdCBnaXZlbiB0aGVuIGBsb2NhbGhvc3QnIGlzIHVzZWQsIGFuZCBpZiBsb2NhbHBvcnQgaXMgbm90CitnaXZlbiB0aGVuIDgwMjUgaXMgdXNlZC4gIElmIHJlbW90ZWhvc3QgaXMgbm90IGdpdmVuIHRoZW4gYGxvY2FsaG9zdCcgaXMgdXNlZCwKK2FuZCBpZiByZW1vdGVwb3J0IGlzIG5vdCBnaXZlbiwgdGhlbiAyNSBpcyB1c2VkLgorIiIiCisKKyMgT3ZlcnZpZXc6CisjCisjIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBtaW5pbWFsIFNNVFAgcHJvdG9jb2wgYXMgZGVmaW5lZCBpbiBSRkMgODIxLiAgSXQKKyMgaGFzIGEgaGllcmFyY2h5IG9mIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoZSBiYWNrZW5kIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZQorIyBzbXRwZC4gIEEgbnVtYmVyIG9mIGNsYXNzZXMgYXJlIHByb3ZpZGVkOgorIworIyAgIFNNVFBTZXJ2ZXIgLSB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGJhY2tlbmQuICBSYWlzZXMgTm90SW1wbGVtZW50ZWRFcnJvcgorIyAgIGlmIHlvdSB0cnkgdG8gdXNlIGl0LgorIworIyAgIERlYnVnZ2luZ1NlcnZlciAtIHNpbXBseSBwcmludHMgZWFjaCBtZXNzYWdlIGl0IHJlY2VpdmVzIG9uIHN0ZG91dC4KKyMKKyMgICBQdXJlUHJveHkgLSBQcm94aWVzIGFsbCBtZXNzYWdlcyB0byBhIHJlYWwgc210cGQgd2hpY2ggZG9lcyBmaW5hbAorIyAgIGRlbGl2ZXJ5LiAgT25lIGtub3duIHByb2JsZW0gd2l0aCB0aGlzIGNsYXNzIGlzIHRoYXQgaXQgZG9lc24ndCBoYW5kbGUKKyMgICBTTVRQIGVycm9ycyBmcm9tIHRoZSBiYWNrZW5kIHNlcnZlciBhdCBhbGwuICBUaGlzIHNob3VsZCBiZSBmaXhlZAorIyAgIChjb250cmlidXRpb25zIGFyZSB3ZWxjb21lISkuCisjCisjICAgTWFpbG1hblByb3h5IC0gQW4gZXhwZXJpbWVudGFsIGhhY2sgdG8gd29yayB3aXRoIEdOVSBNYWlsbWFuCisjICAgPHd3dy5saXN0Lm9yZz4uICBVc2luZyB0aGlzIHNlcnZlciBhcyB5b3VyIHJlYWwgaW5jb21pbmcgc210cGQsIHlvdXIKKyMgICBtYWlsaG9zdCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVjb2duaXplIGFuZCBhY2NlcHQgbWFpbCBkZXN0aW5lZCB0byBNYWlsbWFuCisjICAgbGlzdHMgd2hlbiB0aG9zZSBsaXN0cyBhcmUgY3JlYXRlZC4gIEV2ZXJ5IG1lc3NhZ2Ugbm90IGRlc3RpbmVkIGZvciBhIGxpc3QKKyMgICBnZXRzIGZvcndhcmRlZCB0byBhIHJlYWwgYmFja2VuZCBzbXRwZCwgYXMgd2l0aCBQdXJlUHJveHkuICBBZ2FpbiwgZXJyb3JzCisjICAgYXJlIG5vdCBoYW5kbGVkIGNvcnJlY3RseSB5ZXQuCisjCisjIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBzY3JpcHQgcmVxdWlyZXMgUHl0aG9uIDIuMAorIworIyBBdXRob3I6IEJhcnJ5IFdhcnNhdyA8YmFycnlAcHl0aG9uLm9yZz4KKyMKKyMgVE9ETzoKKyMKKyMgLSBzdXBwb3J0IG1haWxib3ggZGVsaXZlcnkKKyMgLSBhbGlhcyBmaWxlcworIyAtIEVTTVRQCisjIC0gaGFuZGxlIGVycm9yIGNvZGVzIGZyb20gdGhlIGJhY2tlbmQgc210cGQKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZXJybm8KK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCB0aW1lCitpbXBvcnQgc29ja2V0CitpbXBvcnQgYXN5bmNvcmUKK2ltcG9ydCBhc3luY2hhdAorCitfX2FsbF9fID0gWyJTTVRQU2VydmVyIiwiRGVidWdnaW5nU2VydmVyIiwiUHVyZVByb3h5IiwiTWFpbG1hblByb3h5Il0KKworcHJvZ3JhbSA9IHN5cy5hcmd2WzBdCitfX3ZlcnNpb25fXyA9ICdQeXRob24gU01UUCBwcm94eSB2ZXJzaW9uIDAuMicKKworCitjbGFzcyBEZXZudWxsOgorICAgIGRlZiB3cml0ZShzZWxmLCBtc2cpOiBwYXNzCisgICAgZGVmIGZsdXNoKHNlbGYpOiBwYXNzCisKKworREVCVUdTVFJFQU0gPSBEZXZudWxsKCkKK05FV0xJTkUgPSAnXG4nCitFTVBUWVNUUklORyA9ICcnCitDT01NQVNQQUNFID0gJywgJworCisKK2RlZiB1c2FnZShjb2RlLCBtc2c9JycpOgorICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIF9fZG9jX18gJSBnbG9iYWxzKCkKKyAgICBpZiBtc2c6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIG1zZworICAgIHN5cy5leGl0KGNvZGUpCisKKworY2xhc3MgU01UUENoYW5uZWwoYXN5bmNoYXQuYXN5bmNfY2hhdCk6CisgICAgQ09NTUFORCA9IDAKKyAgICBEQVRBID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlciwgY29ubiwgYWRkcik6CisgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQuX19pbml0X18oc2VsZiwgY29ubikKKyAgICAgICAgc2VsZi5fX3NlcnZlciA9IHNlcnZlcgorICAgICAgICBzZWxmLl9fY29ubiA9IGNvbm4KKyAgICAgICAgc2VsZi5fX2FkZHIgPSBhZGRyCisgICAgICAgIHNlbGYuX19saW5lID0gW10KKyAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5DT01NQU5ECisgICAgICAgIHNlbGYuX19ncmVldGluZyA9IDAKKyAgICAgICAgc2VsZi5fX21haWxmcm9tID0gTm9uZQorICAgICAgICBzZWxmLl9fcmNwdHRvcyA9IFtdCisgICAgICAgIHNlbGYuX19kYXRhID0gJycKKyAgICAgICAgc2VsZi5fX2ZxZG4gPSBzb2NrZXQuZ2V0ZnFkbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX19wZWVyID0gY29ubi5nZXRwZWVybmFtZSgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICMgYSByYWNlIGNvbmRpdGlvbiAgbWF5IG9jY3VyIGlmIHRoZSBvdGhlciBlbmQgaXMgY2xvc2luZworICAgICAgICAgICAgIyBiZWZvcmUgd2UgY2FuIGdldCB0aGUgcGVlcm5hbWUKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgaWYgZXJyWzBdICE9IGVycm5vLkVOT1RDT05OOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdQZWVyOicsIHJlcHIoc2VsZi5fX3BlZXIpCisgICAgICAgIHNlbGYucHVzaCgnMjIwICVzICVzJyAlIChzZWxmLl9fZnFkbiwgX192ZXJzaW9uX18pKQorICAgICAgICBzZWxmLnNldF90ZXJtaW5hdG9yKCdcclxuJykKKworICAgICMgT3ZlcnJpZGVzIGJhc2UgY2xhc3MgZm9yIGNvbnZlbmllbmNlCisgICAgZGVmIHB1c2goc2VsZiwgbXNnKToKKyAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5wdXNoKHNlbGYsIG1zZyArICdcclxuJykKKworICAgICMgSW1wbGVtZW50YXRpb24gb2YgYmFzZSBjbGFzcyBhYnN0cmFjdCBtZXRob2QKKyAgICBkZWYgY29sbGVjdF9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9fbGluZS5hcHBlbmQoZGF0YSkKKworICAgICMgSW1wbGVtZW50YXRpb24gb2YgYmFzZSBjbGFzcyBhYnN0cmFjdCBtZXRob2QKKyAgICBkZWYgZm91bmRfdGVybWluYXRvcihzZWxmKToKKyAgICAgICAgbGluZSA9IEVNUFRZU1RSSU5HLmpvaW4oc2VsZi5fX2xpbmUpCisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnRGF0YTonLCByZXByKGxpbmUpCisgICAgICAgIHNlbGYuX19saW5lID0gW10KKyAgICAgICAgaWYgc2VsZi5fX3N0YXRlID09IHNlbGYuQ09NTUFORDoKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYucHVzaCgnNTAwIEVycm9yOiBiYWQgc3ludGF4JykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1ldGhvZCA9IE5vbmUKKyAgICAgICAgICAgIGkgPSBsaW5lLmZpbmQoJyAnKQorICAgICAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IGxpbmUudXBwZXIoKQorICAgICAgICAgICAgICAgIGFyZyA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IGxpbmVbOmldLnVwcGVyKCkKKyAgICAgICAgICAgICAgICBhcmcgPSBsaW5lW2krMTpdLnN0cmlwKCkKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZiwgJ3NtdHBfJyArIGNvbW1hbmQsIE5vbmUpCisgICAgICAgICAgICBpZiBub3QgbWV0aG9kOgorICAgICAgICAgICAgICAgIHNlbGYucHVzaCgnNTAyIEVycm9yOiBjb21tYW5kICIlcyIgbm90IGltcGxlbWVudGVkJyAlIGNvbW1hbmQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBtZXRob2QoYXJnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWxmLl9fc3RhdGUgIT0gc2VsZi5EQVRBOgorICAgICAgICAgICAgICAgIHNlbGYucHVzaCgnNDUxIEludGVybmFsIGNvbmZ1c2lvbicpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAjIFJlbW92ZSBleHRyYW5lb3VzIGNhcnJpYWdlIHJldHVybnMgYW5kIGRlLXRyYW5zcGFyZW5jeSBhY2NvcmRpbmcKKyAgICAgICAgICAgICMgdG8gUkZDIDgyMSwgU2VjdGlvbiA0LjUuMi4KKyAgICAgICAgICAgIGRhdGEgPSBbXQorICAgICAgICAgICAgZm9yIHRleHQgaW4gbGluZS5zcGxpdCgnXHJcbicpOgorICAgICAgICAgICAgICAgIGlmIHRleHQgYW5kIHRleHRbMF0gPT0gJy4nOgorICAgICAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZCh0ZXh0WzE6XSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkYXRhLmFwcGVuZCh0ZXh0KQorICAgICAgICAgICAgc2VsZi5fX2RhdGEgPSBORVdMSU5FLmpvaW4oZGF0YSkKKyAgICAgICAgICAgIHN0YXR1cyA9IHNlbGYuX19zZXJ2ZXIucHJvY2Vzc19tZXNzYWdlKHNlbGYuX19wZWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX21haWxmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3JjcHR0b3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZGF0YSkKKyAgICAgICAgICAgIHNlbGYuX19yY3B0dG9zID0gW10KKyAgICAgICAgICAgIHNlbGYuX19tYWlsZnJvbSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX19zdGF0ZSA9IHNlbGYuQ09NTUFORAorICAgICAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcignXHJcbicpCisgICAgICAgICAgICBpZiBub3Qgc3RhdHVzOgorICAgICAgICAgICAgICAgIHNlbGYucHVzaCgnMjUwIE9rJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKHN0YXR1cykKKworICAgICMgU01UUCBhbmQgRVNNVFAgY29tbWFuZHMKKyAgICBkZWYgc210cF9IRUxPKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIG5vdCBhcmc6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IEhFTE8gaG9zdG5hbWUnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuX19ncmVldGluZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAzIER1cGxpY2F0ZSBIRUxPL0VITE8nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fX2dyZWV0aW5nID0gYXJnCisgICAgICAgICAgICBzZWxmLnB1c2goJzI1MCAlcycgJSBzZWxmLl9fZnFkbikKKworICAgIGRlZiBzbXRwX05PT1Aoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgYXJnOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBOT09QJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnMjUwIE9rJykKKworICAgIGRlZiBzbXRwX1FVSVQoc2VsZiwgYXJnKToKKyAgICAgICAgIyBhcmdzIGlzIGlnbm9yZWQKKyAgICAgICAgc2VsZi5wdXNoKCcyMjEgQnllJykKKyAgICAgICAgc2VsZi5jbG9zZV93aGVuX2RvbmUoKQorCisgICAgIyBmYWN0b3JlZAorICAgIGRlZiBfX2dldGFkZHIoc2VsZiwga2V5d29yZCwgYXJnKToKKyAgICAgICAgYWRkcmVzcyA9IE5vbmUKKyAgICAgICAga2V5bGVuID0gbGVuKGtleXdvcmQpCisgICAgICAgIGlmIGFyZ1s6a2V5bGVuXS51cHBlcigpID09IGtleXdvcmQ6CisgICAgICAgICAgICBhZGRyZXNzID0gYXJnW2tleWxlbjpdLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCBhZGRyZXNzOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWYgYWRkcmVzc1swXSA9PSAnPCcgYW5kIGFkZHJlc3NbLTFdID09ICc+JyBhbmQgYWRkcmVzcyAhPSAnPD4nOgorICAgICAgICAgICAgICAgICMgQWRkcmVzc2VzIGNhbiBiZSBpbiB0aGUgZm9ybSA8cGVyc29uQGRvbS5jb20+IGJ1dCB3YXRjaCBvdXQKKyAgICAgICAgICAgICAgICAjIGZvciBudWxsIGFkZHJlc3MsIGUuZy4gPD4KKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gYWRkcmVzc1sxOi0xXQorICAgICAgICByZXR1cm4gYWRkcmVzcworCisgICAgZGVmIHNtdHBfTUFJTChzZWxmLCBhcmcpOgorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJz09PT4gTUFJTCcsIGFyZworICAgICAgICBhZGRyZXNzID0gc2VsZi5fX2dldGFkZHIoJ0ZST006JywgYXJnKSBpZiBhcmcgZWxzZSBOb25lCisgICAgICAgIGlmIG5vdCBhZGRyZXNzOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDEgU3ludGF4OiBNQUlMIEZST006PGFkZHJlc3M+JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9fbWFpbGZyb206CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMyBFcnJvcjogbmVzdGVkIE1BSUwgY29tbWFuZCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fX21haWxmcm9tID0gYWRkcmVzcworICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ3NlbmRlcjonLCBzZWxmLl9fbWFpbGZyb20KKyAgICAgICAgc2VsZi5wdXNoKCcyNTAgT2snKQorCisgICAgZGVmIHNtdHBfUkNQVChzZWxmLCBhcmcpOgorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJz09PT4gUkNQVCcsIGFyZworICAgICAgICBpZiBub3Qgc2VsZi5fX21haWxmcm9tOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1MDMgRXJyb3I6IG5lZWQgTUFJTCBjb21tYW5kJykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhZGRyZXNzID0gc2VsZi5fX2dldGFkZHIoJ1RPOicsIGFyZykgaWYgYXJnIGVsc2UgTm9uZQorICAgICAgICBpZiBub3QgYWRkcmVzczoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogUkNQVCBUTzogPGFkZHJlc3M+JykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9fcmNwdHRvcy5hcHBlbmQoYWRkcmVzcykKKyAgICAgICAgcHJpbnQgPj4gREVCVUdTVFJFQU0sICdyZWNpcHM6Jywgc2VsZi5fX3JjcHR0b3MKKyAgICAgICAgc2VsZi5wdXNoKCcyNTAgT2snKQorCisgICAgZGVmIHNtdHBfUlNFVChzZWxmLCBhcmcpOgorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMSBTeW50YXg6IFJTRVQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgUmVzZXRzIHRoZSBzZW5kZXIsIHJlY2lwaWVudHMsIGFuZCBkYXRhLCBidXQgbm90IHRoZSBncmVldGluZworICAgICAgICBzZWxmLl9fbWFpbGZyb20gPSBOb25lCisgICAgICAgIHNlbGYuX19yY3B0dG9zID0gW10KKyAgICAgICAgc2VsZi5fX2RhdGEgPSAnJworICAgICAgICBzZWxmLl9fc3RhdGUgPSBzZWxmLkNPTU1BTkQKKyAgICAgICAgc2VsZi5wdXNoKCcyNTAgT2snKQorCisgICAgZGVmIHNtdHBfREFUQShzZWxmLCBhcmcpOgorICAgICAgICBpZiBub3Qgc2VsZi5fX3JjcHR0b3M6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwMyBFcnJvcjogbmVlZCBSQ1BUIGNvbW1hbmQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTAxIFN5bnRheDogREFUQScpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fX3N0YXRlID0gc2VsZi5EQVRBCisgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoJ1xyXG4uXHJcbicpCisgICAgICAgIHNlbGYucHVzaCgnMzU0IEVuZCBkYXRhIHdpdGggPENSPjxMRj4uPENSPjxMRj4nKQorCisKK2NsYXNzIFNNVFBTZXJ2ZXIoYXN5bmNvcmUuZGlzcGF0Y2hlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2FsYWRkciwgcmVtb3RlYWRkcik6CisgICAgICAgIHNlbGYuX2xvY2FsYWRkciA9IGxvY2FsYWRkcgorICAgICAgICBzZWxmLl9yZW1vdGVhZGRyID0gcmVtb3RlYWRkcgorICAgICAgICBhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX3NvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICAgICAgIyB0cnkgdG8gcmUtdXNlIGEgc2VydmVyIHBvcnQgaWYgcG9zc2libGUKKyAgICAgICAgICAgIHNlbGYuc2V0X3JldXNlX2FkZHIoKQorICAgICAgICAgICAgc2VsZi5iaW5kKGxvY2FsYWRkcikKKyAgICAgICAgICAgIHNlbGYubGlzdGVuKDUpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgY2xlYW51cCBhc3luY29yZS5zb2NrZXRfbWFwIGJlZm9yZSByYWlzaW5nCisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgXAorICAgICAgICAgICAgICAgICAgJyVzIHN0YXJ0ZWQgYXQgJXNcblx0TG9jYWwgYWRkcjogJXNcblx0UmVtb3RlIGFkZHI6JXMnICUgKAorICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCB0aW1lLmN0aW1lKHRpbWUudGltZSgpKSwKKyAgICAgICAgICAgICAgICBsb2NhbGFkZHIsIHJlbW90ZWFkZHIpCisKKyAgICBkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKKyAgICAgICAgcGFpciA9IHNlbGYuYWNjZXB0KCkKKyAgICAgICAgaWYgcGFpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbm4sIGFkZHIgPSBwYWlyCisgICAgICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ0luY29taW5nIGNvbm5lY3Rpb24gZnJvbSAlcycgJSByZXByKGFkZHIpCisgICAgICAgICAgICBjaGFubmVsID0gU01UUENoYW5uZWwoc2VsZiwgY29ubiwgYWRkcikKKworICAgICMgQVBJIGZvciAiZG9pbmcgc29tZXRoaW5nIHVzZWZ1bCB3aXRoIHRoZSBtZXNzYWdlIgorICAgIGRlZiBwcm9jZXNzX21lc3NhZ2Uoc2VsZiwgcGVlciwgbWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpOgorICAgICAgICAiIiJPdmVycmlkZSB0aGlzIGFic3RyYWN0IG1ldGhvZCB0byBoYW5kbGUgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50LgorCisgICAgICAgIHBlZXIgaXMgYSB0dXBsZSBjb250YWluaW5nIChpcGFkZHIsIHBvcnQpIG9mIHRoZSBjbGllbnQgdGhhdCBtYWRlIHRoZQorICAgICAgICBzb2NrZXQgY29ubmVjdGlvbiB0byBvdXIgc210cCBwb3J0LgorCisgICAgICAgIG1haWxmcm9tIGlzIHRoZSByYXcgYWRkcmVzcyB0aGUgY2xpZW50IGNsYWltcyB0aGUgbWVzc2FnZSBpcyBjb21pbmcKKyAgICAgICAgZnJvbS4KKworICAgICAgICByY3B0dG9zIGlzIGEgbGlzdCBvZiByYXcgYWRkcmVzc2VzIHRoZSBjbGllbnQgd2lzaGVzIHRvIGRlbGl2ZXIgdGhlCisgICAgICAgIG1lc3NhZ2UgdG8uCisKKyAgICAgICAgZGF0YSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBlbnRpcmUgZnVsbCB0ZXh0IG9mIHRoZSBtZXNzYWdlLAorICAgICAgICBoZWFkZXJzIChpZiBzdXBwbGllZCkgYW5kIGFsbC4gIEl0IGhhcyBiZWVuIGBkZS10cmFuc3BhcmVuY2llZCcKKyAgICAgICAgYWNjb3JkaW5nIHRvIFJGQyA4MjEsIFNlY3Rpb24gNC41LjIuICBJbiBvdGhlciB3b3JkcywgYSBsaW5lCisgICAgICAgIGNvbnRhaW5pbmcgYSBgLicgZm9sbG93ZWQgYnkgb3RoZXIgdGV4dCBoYXMgaGFkIHRoZSBsZWFkaW5nIGRvdAorICAgICAgICByZW1vdmVkLgorCisgICAgICAgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBOb25lLCBmb3IgYSBub3JtYWwgYDI1MCBPaycgcmVzcG9uc2U7CisgICAgICAgIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBkZXNpcmVkIHJlc3BvbnNlIHN0cmluZyBpbiBSRkMgODIxIGZvcm1hdC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisKK2NsYXNzIERlYnVnZ2luZ1NlcnZlcihTTVRQU2VydmVyKToKKyAgICAjIERvIHNvbWV0aGluZyB3aXRoIHRoZSBnYXRoZXJlZCBtZXNzYWdlCisgICAgZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBwZWVyLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSk6CisgICAgICAgIGluaGVhZGVycyA9IDEKKyAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0KCdcbicpCisgICAgICAgIHByaW50ICctLS0tLS0tLS0tIE1FU1NBR0UgRk9MTE9XUyAtLS0tLS0tLS0tJworICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgICMgaGVhZGVycyBmaXJzdAorICAgICAgICAgICAgaWYgaW5oZWFkZXJzIGFuZCBub3QgbGluZToKKyAgICAgICAgICAgICAgICBwcmludCAnWC1QZWVyOicsIHBlZXJbMF0KKyAgICAgICAgICAgICAgICBpbmhlYWRlcnMgPSAwCisgICAgICAgICAgICBwcmludCBsaW5lCisgICAgICAgIHByaW50ICctLS0tLS0tLS0tLS0gRU5EIE1FU1NBR0UgLS0tLS0tLS0tLS0tJworCisKK2NsYXNzIFB1cmVQcm94eShTTVRQU2VydmVyKToKKyAgICBkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYsIHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKToKKyAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0KCdcbicpCisgICAgICAgICMgTG9vayBmb3IgdGhlIGxhc3QgaGVhZGVyCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBsaW5lcy5pbnNlcnQoaSwgJ1gtUGVlcjogJXMnICUgcGVlclswXSkKKyAgICAgICAgZGF0YSA9IE5FV0xJTkUuam9pbihsaW5lcykKKyAgICAgICAgcmVmdXNlZCA9IHNlbGYuX2RlbGl2ZXIobWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpCisgICAgICAgICMgVEJEOiB3aGF0IHRvIGRvIHdpdGggcmVmdXNlZCBhZGRyZXNzZXM/CisgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnd2UgZ290IHNvbWUgcmVmdXNhbHM6JywgcmVmdXNlZAorCisgICAgZGVmIF9kZWxpdmVyKHNlbGYsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKToKKyAgICAgICAgaW1wb3J0IHNtdHBsaWIKKyAgICAgICAgcmVmdXNlZCA9IHt9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzbXRwbGliLlNNVFAoKQorICAgICAgICAgICAgcy5jb25uZWN0KHNlbGYuX3JlbW90ZWFkZHJbMF0sIHNlbGYuX3JlbW90ZWFkZHJbMV0pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVmdXNlZCA9IHMuc2VuZG1haWwobWFpbGZyb20sIHJjcHR0b3MsIGRhdGEpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHMucXVpdCgpCisgICAgICAgIGV4Y2VwdCBzbXRwbGliLlNNVFBSZWNpcGllbnRzUmVmdXNlZCwgZToKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnZ290IFNNVFBSZWNpcGllbnRzUmVmdXNlZCcKKyAgICAgICAgICAgIHJlZnVzZWQgPSBlLnJlY2lwaWVudHMKKyAgICAgICAgZXhjZXB0IChzb2NrZXQuZXJyb3IsIHNtdHBsaWIuU01UUEV4Y2VwdGlvbiksIGU6CisgICAgICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ2dvdCcsIGUuX19jbGFzc19fCisgICAgICAgICAgICAjIEFsbCByZWNpcGllbnRzIHdlcmUgcmVmdXNlZC4gIElmIHRoZSBleGNlcHRpb24gaGFkIGFuIGFzc29jaWF0ZWQKKyAgICAgICAgICAgICMgZXJyb3IgY29kZSwgdXNlIGl0LiAgT3RoZXJ3aXNlLGZha2UgaXQgd2l0aCBhIG5vbi10cmlnZ2VyaW5nCisgICAgICAgICAgICAjIGV4Y2VwdGlvbiBjb2RlLgorICAgICAgICAgICAgZXJyY29kZSA9IGdldGF0dHIoZSwgJ3NtdHBfY29kZScsIC0xKQorICAgICAgICAgICAgZXJybXNnID0gZ2V0YXR0cihlLCAnc210cF9lcnJvcicsICdpZ25vcmUnKQorICAgICAgICAgICAgZm9yIHIgaW4gcmNwdHRvczoKKyAgICAgICAgICAgICAgICByZWZ1c2VkW3JdID0gKGVycmNvZGUsIGVycm1zZykKKyAgICAgICAgcmV0dXJuIHJlZnVzZWQKKworCitjbGFzcyBNYWlsbWFuUHJveHkoUHVyZVByb3h5KToKKyAgICBkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYsIHBlZXIsIG1haWxmcm9tLCByY3B0dG9zLCBkYXRhKToKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGZyb20gTWFpbG1hbiBpbXBvcnQgVXRpbHMKKyAgICAgICAgZnJvbSBNYWlsbWFuIGltcG9ydCBNZXNzYWdlCisgICAgICAgIGZyb20gTWFpbG1hbiBpbXBvcnQgTWFpbExpc3QKKyAgICAgICAgIyBJZiB0aGUgbWVzc2FnZSBpcyB0byBhIE1haWxtYW4gbWFpbGluZyBsaXN0LCB0aGVuIHdlJ2xsIGludm9rZSB0aGUKKyAgICAgICAgIyBNYWlsbWFuIHNjcmlwdCBkaXJlY3RseSwgd2l0aG91dCBnb2luZyB0aHJvdWdoIHRoZSByZWFsIHNtdHBkLgorICAgICAgICAjIE90aGVyd2lzZSB3ZSdsbCBmb3J3YXJkIGl0IHRvIHRoZSBsb2NhbCBwcm94eSBmb3IgZGlzcG9zaXRpb24uCisgICAgICAgIGxpc3RuYW1lcyA9IFtdCisgICAgICAgIGZvciByY3B0IGluIHJjcHR0b3M6CisgICAgICAgICAgICBsb2NhbCA9IHJjcHQubG93ZXIoKS5zcGxpdCgnQCcpWzBdCisgICAgICAgICAgICAjIFdlIGFsbG93IHRoZSBmb2xsb3dpbmcgdmFyaWF0aW9ucyBvbiB0aGUgdGhlbWUKKyAgICAgICAgICAgICMgICBsaXN0bmFtZQorICAgICAgICAgICAgIyAgIGxpc3RuYW1lLWFkbWluCisgICAgICAgICAgICAjICAgbGlzdG5hbWUtb3duZXIKKyAgICAgICAgICAgICMgICBsaXN0bmFtZS1yZXF1ZXN0CisgICAgICAgICAgICAjICAgbGlzdG5hbWUtam9pbgorICAgICAgICAgICAgIyAgIGxpc3RuYW1lLWxlYXZlCisgICAgICAgICAgICBwYXJ0cyA9IGxvY2FsLnNwbGl0KCctJykKKyAgICAgICAgICAgIGlmIGxlbihwYXJ0cykgPiAyOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBsaXN0bmFtZSA9IHBhcnRzWzBdCisgICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDI6CisgICAgICAgICAgICAgICAgY29tbWFuZCA9IHBhcnRzWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbW1hbmQgPSAnJworICAgICAgICAgICAgaWYgbm90IFV0aWxzLmxpc3RfZXhpc3RzKGxpc3RuYW1lKSBvciBjb21tYW5kIG5vdCBpbiAoCisgICAgICAgICAgICAgICAgICAgICcnLCAnYWRtaW4nLCAnb3duZXInLCAncmVxdWVzdCcsICdqb2luJywgJ2xlYXZlJyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGxpc3RuYW1lcy5hcHBlbmQoKHJjcHQsIGxpc3RuYW1lLCBjb21tYW5kKSkKKyAgICAgICAgIyBSZW1vdmUgYWxsIGxpc3QgcmVjaXBpZW50cyBmcm9tIHJjcHR0b3MgYW5kIGZvcndhcmQgd2hhdCB3ZSdyZSBub3QKKyAgICAgICAgIyBnb2luZyB0byB0YWtlIGNhcmUgb2Ygb3Vyc2VsdmVzLiAgTGluZWFyIHJlbW92YWwgc2hvdWxkIGJlIGZpbmUKKyAgICAgICAgIyBzaW5jZSB3ZSBkb24ndCBleHBlY3QgYSBsYXJnZSBudW1iZXIgb2YgcmVjaXBpZW50cy4KKyAgICAgICAgZm9yIHJjcHQsIGxpc3RuYW1lLCBjb21tYW5kIGluIGxpc3RuYW1lczoKKyAgICAgICAgICAgIHJjcHR0b3MucmVtb3ZlKHJjcHQpCisgICAgICAgICMgSWYgdGhlcmUncyBhbnkgbm9uLWxpc3QgZGVzdGluZWQgcmVjaXBpZW50cyBsZWZ0LAorICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ2ZvcndhcmRpbmcgcmVjaXBzOicsICcgJy5qb2luKHJjcHR0b3MpCisgICAgICAgIGlmIHJjcHR0b3M6CisgICAgICAgICAgICByZWZ1c2VkID0gc2VsZi5fZGVsaXZlcihtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSkKKyAgICAgICAgICAgICMgVEJEOiB3aGF0IHRvIGRvIHdpdGggcmVmdXNlZCBhZGRyZXNzZXM/CisgICAgICAgICAgICBwcmludCA+PiBERUJVR1NUUkVBTSwgJ3dlIGdvdCByZWZ1c2FsczonLCByZWZ1c2VkCisgICAgICAgICMgTm93IGRlbGl2ZXIgZGlyZWN0bHkgdG8gdGhlIGxpc3QgY29tbWFuZHMKKyAgICAgICAgbWxpc3RzID0ge30KKyAgICAgICAgcyA9IFN0cmluZ0lPKGRhdGEpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UuTWVzc2FnZShzKQorICAgICAgICAjIFRoZXNlIGhlYWRlcnMgYXJlIHJlcXVpcmVkIGZvciB0aGUgcHJvcGVyIGV4ZWN1dGlvbiBvZiBNYWlsbWFuLiAgQWxsCisgICAgICAgICMgTVRBcyBpbiBleGlzdGVuY2Ugc2VlbSB0byBhZGQgdGhlc2UgaWYgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgZG9lc24ndAorICAgICAgICAjIGhhdmUgdGhlbS4KKyAgICAgICAgaWYgbm90IG1zZy5nZXRoZWFkZXIoJ2Zyb20nKToKKyAgICAgICAgICAgIG1zZ1snRnJvbSddID0gbWFpbGZyb20KKyAgICAgICAgaWYgbm90IG1zZy5nZXRoZWFkZXIoJ2RhdGUnKToKKyAgICAgICAgICAgIG1zZ1snRGF0ZSddID0gdGltZS5jdGltZSh0aW1lLnRpbWUoKSkKKyAgICAgICAgZm9yIHJjcHQsIGxpc3RuYW1lLCBjb21tYW5kIGluIGxpc3RuYW1lczoKKyAgICAgICAgICAgIHByaW50ID4+IERFQlVHU1RSRUFNLCAnc2VuZGluZyBtZXNzYWdlIHRvJywgcmNwdAorICAgICAgICAgICAgbWxpc3QgPSBtbGlzdHMuZ2V0KGxpc3RuYW1lKQorICAgICAgICAgICAgaWYgbm90IG1saXN0OgorICAgICAgICAgICAgICAgIG1saXN0ID0gTWFpbExpc3QuTWFpbExpc3QobGlzdG5hbWUsIGxvY2s9MCkKKyAgICAgICAgICAgICAgICBtbGlzdHNbbGlzdG5hbWVdID0gbWxpc3QKKyAgICAgICAgICAgICMgZGlzcGF0Y2ggb24gdGhlIHR5cGUgb2YgY29tbWFuZAorICAgICAgICAgICAgaWYgY29tbWFuZCA9PSAnJzoKKyAgICAgICAgICAgICAgICAjIHBvc3QKKyAgICAgICAgICAgICAgICBtc2cuRW5xdWV1ZShtbGlzdCwgdG9saXN0PTEpCisgICAgICAgICAgICBlbGlmIGNvbW1hbmQgPT0gJ2FkbWluJzoKKyAgICAgICAgICAgICAgICBtc2cuRW5xdWV1ZShtbGlzdCwgdG9hZG1pbj0xKQorICAgICAgICAgICAgZWxpZiBjb21tYW5kID09ICdvd25lcic6CisgICAgICAgICAgICAgICAgbXNnLkVucXVldWUobWxpc3QsIHRvb3duZXI9MSkKKyAgICAgICAgICAgIGVsaWYgY29tbWFuZCA9PSAncmVxdWVzdCc6CisgICAgICAgICAgICAgICAgbXNnLkVucXVldWUobWxpc3QsIHRvcmVxdWVzdD0xKQorICAgICAgICAgICAgZWxpZiBjb21tYW5kIGluICgnam9pbicsICdsZWF2ZScpOgorICAgICAgICAgICAgICAgICMgVEJEOiB0aGlzIGlzIGEgaGFjayEKKyAgICAgICAgICAgICAgICBpZiBjb21tYW5kID09ICdqb2luJzoKKyAgICAgICAgICAgICAgICAgICAgbXNnWydTdWJqZWN0J10gPSAnc3Vic2NyaWJlJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1zZ1snU3ViamVjdCddID0gJ3Vuc3Vic2NyaWJlJworICAgICAgICAgICAgICAgIG1zZy5FbnF1ZXVlKG1saXN0LCB0b3JlcXVlc3Q9MSkKKworCitjbGFzcyBPcHRpb25zOgorICAgIHNldHVpZCA9IDEKKyAgICBjbGFzc25hbWUgPSAnUHVyZVByb3h5JworCisKK2RlZiBwYXJzZWFyZ3MoKToKKyAgICBnbG9iYWwgREVCVUdTVFJFQU0KKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KAorICAgICAgICAgICAgc3lzLmFyZ3ZbMTpdLCAnblZoYzpkJywKKyAgICAgICAgICAgIFsnY2xhc3M9JywgJ25vc2V0dWlkJywgJ3ZlcnNpb24nLCAnaGVscCcsICdkZWJ1ZyddKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIGU6CisgICAgICAgIHVzYWdlKDEsIGUpCisKKyAgICBvcHRpb25zID0gT3B0aW9ucygpCisgICAgZm9yIG9wdCwgYXJnIGluIG9wdHM6CisgICAgICAgIGlmIG9wdCBpbiAoJy1oJywgJy0taGVscCcpOgorICAgICAgICAgICAgdXNhZ2UoMCkKKyAgICAgICAgZWxpZiBvcHQgaW4gKCctVicsICctLXZlcnNpb24nKToKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIF9fdmVyc2lvbl9fCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorICAgICAgICBlbGlmIG9wdCBpbiAoJy1uJywgJy0tbm9zZXR1aWQnKToKKyAgICAgICAgICAgIG9wdGlvbnMuc2V0dWlkID0gMAorICAgICAgICBlbGlmIG9wdCBpbiAoJy1jJywgJy0tY2xhc3MnKToKKyAgICAgICAgICAgIG9wdGlvbnMuY2xhc3NuYW1lID0gYXJnCisgICAgICAgIGVsaWYgb3B0IGluICgnLWQnLCAnLS1kZWJ1ZycpOgorICAgICAgICAgICAgREVCVUdTVFJFQU0gPSBzeXMuc3RkZXJyCisKKyAgICAjIHBhcnNlIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMKKyAgICBpZiBsZW4oYXJncykgPCAxOgorICAgICAgICBsb2NhbHNwZWMgPSAnbG9jYWxob3N0OjgwMjUnCisgICAgICAgIHJlbW90ZXNwZWMgPSAnbG9jYWxob3N0OjI1JworICAgIGVsaWYgbGVuKGFyZ3MpIDwgMjoKKyAgICAgICAgbG9jYWxzcGVjID0gYXJnc1swXQorICAgICAgICByZW1vdGVzcGVjID0gJ2xvY2FsaG9zdDoyNScKKyAgICBlbGlmIGxlbihhcmdzKSA8IDM6CisgICAgICAgIGxvY2Fsc3BlYyA9IGFyZ3NbMF0KKyAgICAgICAgcmVtb3Rlc3BlYyA9IGFyZ3NbMV0KKyAgICBlbHNlOgorICAgICAgICB1c2FnZSgxLCAnSW52YWxpZCBhcmd1bWVudHM6ICVzJyAlIENPTU1BU1BBQ0Uuam9pbihhcmdzKSkKKworICAgICMgc3BsaXQgaW50byBob3N0L3BvcnQgcGFpcnMKKyAgICBpID0gbG9jYWxzcGVjLmZpbmQoJzonKQorICAgIGlmIGkgPCAwOgorICAgICAgICB1c2FnZSgxLCAnQmFkIGxvY2FsIHNwZWM6ICVzJyAlIGxvY2Fsc3BlYykKKyAgICBvcHRpb25zLmxvY2FsaG9zdCA9IGxvY2Fsc3BlY1s6aV0KKyAgICB0cnk6CisgICAgICAgIG9wdGlvbnMubG9jYWxwb3J0ID0gaW50KGxvY2Fsc3BlY1tpKzE6XSkKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgdXNhZ2UoMSwgJ0JhZCBsb2NhbCBwb3J0OiAlcycgJSBsb2NhbHNwZWMpCisgICAgaSA9IHJlbW90ZXNwZWMuZmluZCgnOicpCisgICAgaWYgaSA8IDA6CisgICAgICAgIHVzYWdlKDEsICdCYWQgcmVtb3RlIHNwZWM6ICVzJyAlIHJlbW90ZXNwZWMpCisgICAgb3B0aW9ucy5yZW1vdGVob3N0ID0gcmVtb3Rlc3BlY1s6aV0KKyAgICB0cnk6CisgICAgICAgIG9wdGlvbnMucmVtb3RlcG9ydCA9IGludChyZW1vdGVzcGVjW2krMTpdKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICB1c2FnZSgxLCAnQmFkIHJlbW90ZSBwb3J0OiAlcycgJSByZW1vdGVzcGVjKQorICAgIHJldHVybiBvcHRpb25zCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBvcHRpb25zID0gcGFyc2VhcmdzKCkKKyAgICAjIEJlY29tZSBub2JvZHkKKyAgICBjbGFzc25hbWUgPSBvcHRpb25zLmNsYXNzbmFtZQorICAgIGlmICIuIiBpbiBjbGFzc25hbWU6CisgICAgICAgIGxhc3Rkb3QgPSBjbGFzc25hbWUucmZpbmQoIi4iKQorICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKGNsYXNzbmFtZVs6bGFzdGRvdF0sIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsiIl0pCisgICAgICAgIGNsYXNzbmFtZSA9IGNsYXNzbmFtZVtsYXN0ZG90KzE6XQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCBfX21haW5fXyBhcyBtb2QKKyAgICBjbGFzc18gPSBnZXRhdHRyKG1vZCwgY2xhc3NuYW1lKQorICAgIHByb3h5ID0gY2xhc3NfKChvcHRpb25zLmxvY2FsaG9zdCwgb3B0aW9ucy5sb2NhbHBvcnQpLAorICAgICAgICAgICAgICAgICAgIChvcHRpb25zLnJlbW90ZWhvc3QsIG9wdGlvbnMucmVtb3RlcG9ydCkpCisgICAgaWYgb3B0aW9ucy5zZXR1aWQ6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBwd2QKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgXAorICAgICAgICAgICAgICAgICAgJ0Nhbm5vdCBpbXBvcnQgbW9kdWxlICJwd2QiOyB0cnkgcnVubmluZyB3aXRoIC1uIG9wdGlvbi4nCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBub2JvZHkgPSBwd2QuZ2V0cHduYW0oJ25vYm9keScpWzJdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnNldHVpZChub2JvZHkpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FUEVSTTogcmFpc2UKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIFwKKyAgICAgICAgICAgICAgICAgICdDYW5ub3Qgc2V0dWlkICJub2JvZHkiOyB0cnkgcnVubmluZyB3aXRoIC1uIG9wdGlvbi4nCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgIHRyeToKKyAgICAgICAgYXN5bmNvcmUubG9vcCgpCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NtdHBkLnB5YyBiL2xpYi9weXRob24yLjcvc210cGQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDY1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NtdHBkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NtdHBkLnB5byBiL2xpYi9weXRob24yLjcvc210cGQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDY1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NtdHBkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NtdHBsaWIucHkgYi9saWIvcHl0aG9uMi43L3NtdHBsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTMyMTNiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc210cGxpYi5weQpAQCAtMCwwICsxLDg1OCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisnJydTTVRQL0VTTVRQIGNsaWVudCBjbGFzcy4KKworVGhpcyBzaG91bGQgZm9sbG93IFJGQyA4MjEgKFNNVFApLCBSRkMgMTg2OSAoRVNNVFApLCBSRkMgMjU1NCAoU01UUAorQXV0aGVudGljYXRpb24pIGFuZCBSRkMgMjQ4NyAoU2VjdXJlIFNNVFAgb3ZlciBUTFMpLgorCitOb3RlczoKKworUGxlYXNlIHJlbWVtYmVyLCB3aGVuIGRvaW5nIEVTTVRQLCB0aGF0IHRoZSBuYW1lcyBvZiB0aGUgU01UUCBzZXJ2aWNlCitleHRlbnNpb25zIGFyZSBOT1QgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIG9wdGlvbiBrZXl3b3JkcyBmb3IgdGhlIFJDUFQKK2FuZCBNQUlMIGNvbW1hbmRzIQorCitFeGFtcGxlOgorCisgID4+PiBpbXBvcnQgc210cGxpYgorICA+Pj4gcz1zbXRwbGliLlNNVFAoImxvY2FsaG9zdCIpCisgID4+PiBwcmludCBzLmhlbHAoKQorICBUaGlzIGlzIFNlbmRtYWlsIHZlcnNpb24gOC44LjQKKyAgVG9waWNzOgorICAgICAgSEVMTyAgICBFSExPICAgIE1BSUwgICAgUkNQVCAgICBEQVRBCisgICAgICBSU0VUICAgIE5PT1AgICAgUVVJVCAgICBIRUxQICAgIFZSRlkKKyAgICAgIEVYUE4gICAgVkVSQiAgICBFVFJOICAgIERTTgorICBGb3IgbW9yZSBpbmZvIHVzZSAiSEVMUCA8dG9waWM+Ii4KKyAgVG8gcmVwb3J0IGJ1Z3MgaW4gdGhlIGltcGxlbWVudGF0aW9uIHNlbmQgZW1haWwgdG8KKyAgICAgIHNlbmRtYWlsLWJ1Z3NAc2VuZG1haWwub3JnLgorICBGb3IgbG9jYWwgaW5mb3JtYXRpb24gc2VuZCBlbWFpbCB0byBQb3N0bWFzdGVyIGF0IHlvdXIgc2l0ZS4KKyAgRW5kIG9mIEhFTFAgaW5mbworICA+Pj4gcy5wdXRjbWQoInZyZnkiLCJzb21lb25lQGhlcmUiKQorICA+Pj4gcy5nZXRyZXBseSgpCisgICgyNTAsICJTb21lYm9keSBPdmVySGVyZSA8c29tZWJvZHlAaGVyZS5teS5vcmc+IikKKyAgPj4+IHMucXVpdCgpCisnJycKKworIyBBdXRob3I6IFRoZSBEcmFnb24gRGUgTW9uc3luZSA8ZHJhZ29uZG1AaW50ZWdyYWwub3JnPgorIyBFU01UUCBzdXBwb3J0LCB0ZXN0IGNvZGUgYW5kIGRvYyBmaXhlcyBhZGRlZCBieQorIyAgICAgRXJpYyBTLiBSYXltb25kIDxlc3JAdGh5cnN1cy5jb20+CisjIEJldHRlciBSRkMgODIxIGNvbXBsaWFuY2UgKE1BSUwgYW5kIFJDUFQsIGFuZCBDUkxGIGluIGRhdGEpCisjICAgICBieSBDYXJleSBFdmFucyA8Yy5ldmFuc0BjbGVhci5uZXQubno+LCBmb3IgcGlja3kgbWFpbCBzZXJ2ZXJzLgorIyBSRkMgMjU1NCAoYXV0aGVudGljYXRpb24pIHN1cHBvcnQgYnkgR2VyaGFyZCBIYWVyaW5nIDxnZXJoYXJkQGJpZ2Zvb3QuZGU+LgorIworIyBUaGlzIHdhcyBtb2RpZmllZCBmcm9tIHRoZSBQeXRob24gMS41IGxpYnJhcnkgSFRUUCBsaWIuCisKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCByZQoraW1wb3J0IGVtYWlsLnV0aWxzCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgaG1hYworZnJvbSBlbWFpbC5iYXNlNjRtaW1lIGltcG9ydCBlbmNvZGUgYXMgZW5jb2RlX2Jhc2U2NAorZnJvbSBzeXMgaW1wb3J0IHN0ZGVycgorCitfX2FsbF9fID0gWyJTTVRQRXhjZXB0aW9uIiwgIlNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWQiLCAiU01UUFJlc3BvbnNlRXhjZXB0aW9uIiwKKyAgICAgICAgICAgIlNNVFBTZW5kZXJSZWZ1c2VkIiwgIlNNVFBSZWNpcGllbnRzUmVmdXNlZCIsICJTTVRQRGF0YUVycm9yIiwKKyAgICAgICAgICAgIlNNVFBDb25uZWN0RXJyb3IiLCAiU01UUEhlbG9FcnJvciIsICJTTVRQQXV0aGVudGljYXRpb25FcnJvciIsCisgICAgICAgICAgICJxdW90ZWFkZHIiLCAicXVvdGVkYXRhIiwgIlNNVFAiXQorCitTTVRQX1BPUlQgPSAyNQorU01UUF9TU0xfUE9SVCA9IDQ2NQorQ1JMRiA9ICJcclxuIgorCitPTERTVFlMRV9BVVRIID0gcmUuY29tcGlsZShyImF1dGg9KC4qKSIsIHJlLkkpCisKKworIyBFeGNlcHRpb24gY2xhc3NlcyB1c2VkIGJ5IHRoaXMgbW9kdWxlLgorY2xhc3MgU01UUEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFsbCBleGNlcHRpb25zIHJhaXNlZCBieSB0aGlzIG1vZHVsZS4iIiIKKworY2xhc3MgU01UUFNlcnZlckRpc2Nvbm5lY3RlZChTTVRQRXhjZXB0aW9uKToKKyAgICAiIiJOb3QgY29ubmVjdGVkIHRvIGFueSBTTVRQIHNlcnZlci4KKworICAgIFRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIHRoZSBzZXJ2ZXIgdW5leHBlY3RlZGx5IGRpc2Nvbm5lY3RzLAorICAgIG9yIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSB0aGUgU01UUCBpbnN0YW5jZSBiZWZvcmUKKyAgICBjb25uZWN0aW5nIGl0IHRvIGEgc2VydmVyLgorICAgICIiIgorCitjbGFzcyBTTVRQUmVzcG9uc2VFeGNlcHRpb24oU01UUEV4Y2VwdGlvbik6CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIGV4Y2VwdGlvbnMgdGhhdCBpbmNsdWRlIGFuIFNNVFAgZXJyb3IgY29kZS4KKworICAgIFRoZXNlIGV4Y2VwdGlvbnMgYXJlIGdlbmVyYXRlZCBpbiBzb21lIGluc3RhbmNlcyB3aGVuIHRoZSBTTVRQCisgICAgc2VydmVyIHJldHVybnMgYW4gZXJyb3IgY29kZS4gIFRoZSBlcnJvciBjb2RlIGlzIHN0b3JlZCBpbiB0aGUKKyAgICBgc210cF9jb2RlJyBhdHRyaWJ1dGUgb2YgdGhlIGVycm9yLCBhbmQgdGhlIGBzbXRwX2Vycm9yJyBhdHRyaWJ1dGUKKyAgICBpcyBzZXQgdG8gdGhlIGVycm9yIG1lc3NhZ2UuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSwgbXNnKToKKyAgICAgICAgc2VsZi5zbXRwX2NvZGUgPSBjb2RlCisgICAgICAgIHNlbGYuc210cF9lcnJvciA9IG1zZworICAgICAgICBzZWxmLmFyZ3MgPSAoY29kZSwgbXNnKQorCitjbGFzcyBTTVRQU2VuZGVyUmVmdXNlZChTTVRQUmVzcG9uc2VFeGNlcHRpb24pOgorICAgICIiIlNlbmRlciBhZGRyZXNzIHJlZnVzZWQuCisKKyAgICBJbiBhZGRpdGlvbiB0byB0aGUgYXR0cmlidXRlcyBzZXQgYnkgb24gYWxsIFNNVFBSZXNwb25zZUV4Y2VwdGlvbgorICAgIGV4Y2VwdGlvbnMsIHRoaXMgc2V0cyBgc2VuZGVyJyB0byB0aGUgc3RyaW5nIHRoYXQgdGhlIFNNVFAgcmVmdXNlZC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb2RlLCBtc2csIHNlbmRlcik6CisgICAgICAgIHNlbGYuc210cF9jb2RlID0gY29kZQorICAgICAgICBzZWxmLnNtdHBfZXJyb3IgPSBtc2cKKyAgICAgICAgc2VsZi5zZW5kZXIgPSBzZW5kZXIKKyAgICAgICAgc2VsZi5hcmdzID0gKGNvZGUsIG1zZywgc2VuZGVyKQorCitjbGFzcyBTTVRQUmVjaXBpZW50c1JlZnVzZWQoU01UUEV4Y2VwdGlvbik6CisgICAgIiIiQWxsIHJlY2lwaWVudCBhZGRyZXNzZXMgcmVmdXNlZC4KKworICAgIFRoZSBlcnJvcnMgZm9yIGVhY2ggcmVjaXBpZW50IGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIGF0dHJpYnV0ZQorICAgICdyZWNpcGllbnRzJywgd2hpY2ggaXMgYSBkaWN0aW9uYXJ5IG9mIGV4YWN0bHkgdGhlIHNhbWUgc29ydCBhcworICAgIFNNVFAuc2VuZG1haWwoKSByZXR1cm5zLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlY2lwaWVudHMpOgorICAgICAgICBzZWxmLnJlY2lwaWVudHMgPSByZWNpcGllbnRzCisgICAgICAgIHNlbGYuYXJncyA9IChyZWNpcGllbnRzLCkKKworCitjbGFzcyBTTVRQRGF0YUVycm9yKFNNVFBSZXNwb25zZUV4Y2VwdGlvbik6CisgICAgIiIiVGhlIFNNVFAgc2VydmVyIGRpZG4ndCBhY2NlcHQgdGhlIGRhdGEuIiIiCisKK2NsYXNzIFNNVFBDb25uZWN0RXJyb3IoU01UUFJlc3BvbnNlRXhjZXB0aW9uKToKKyAgICAiIiJFcnJvciBkdXJpbmcgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50LiIiIgorCitjbGFzcyBTTVRQSGVsb0Vycm9yKFNNVFBSZXNwb25zZUV4Y2VwdGlvbik6CisgICAgIiIiVGhlIHNlcnZlciByZWZ1c2VkIG91ciBIRUxPIHJlcGx5LiIiIgorCitjbGFzcyBTTVRQQXV0aGVudGljYXRpb25FcnJvcihTTVRQUmVzcG9uc2VFeGNlcHRpb24pOgorICAgICIiIkF1dGhlbnRpY2F0aW9uIGVycm9yLgorCisgICAgTW9zdCBwcm9iYWJseSB0aGUgc2VydmVyIGRpZG4ndCBhY2NlcHQgdGhlIHVzZXJuYW1lL3Bhc3N3b3JkCisgICAgY29tYmluYXRpb24gcHJvdmlkZWQuCisgICAgIiIiCisKKworZGVmIHF1b3RlYWRkcihhZGRyKToKKyAgICAiIiJRdW90ZSBhIHN1YnNldCBvZiB0aGUgZW1haWwgYWRkcmVzc2VzIGRlZmluZWQgYnkgUkZDIDgyMS4KKworICAgIFNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBhbnl0aGluZyByZmM4MjIucGFyc2VhZGRyIGNhbiBoYW5kbGUuCisgICAgIiIiCisgICAgbSA9IChOb25lLCBOb25lKQorICAgIHRyeToKKyAgICAgICAgbSA9IGVtYWlsLnV0aWxzLnBhcnNlYWRkcihhZGRyKVsxXQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGlmIG0gPT0gKE5vbmUsIE5vbmUpOiAgIyBJbmRpY2F0ZXMgcGFyc2UgZmFpbHVyZSBvciBBdHRyaWJ1dGVFcnJvcgorICAgICAgICAjIHNvbWV0aGluZyB3ZWlyZCBoZXJlLi4gcHVudCAtZGRtCisgICAgICAgIHJldHVybiAiPCVzPiIgJSBhZGRyCisgICAgZWxpZiBtIGlzIE5vbmU6CisgICAgICAgICMgdGhlIHNlbmRlciB3YW50cyBhbiBlbXB0eSByZXR1cm4gYWRkcmVzcworICAgICAgICByZXR1cm4gIjw+IgorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAiPCVzPiIgJSBtCisKK2RlZiBfYWRkcl9vbmx5KGFkZHJzdHJpbmcpOgorICAgIGRpc3BsYXluYW1lLCBhZGRyID0gZW1haWwudXRpbHMucGFyc2VhZGRyKGFkZHJzdHJpbmcpCisgICAgaWYgKGRpc3BsYXluYW1lLCBhZGRyKSA9PSAoJycsICcnKToKKyAgICAgICAgIyBwYXJzZWFkZHIgY291bGRuJ3QgcGFyc2UgaXQsIHNvIHVzZSBpdCBhcyBpcy4KKyAgICAgICAgcmV0dXJuIGFkZHJzdHJpbmcKKyAgICByZXR1cm4gYWRkcgorCitkZWYgcXVvdGVkYXRhKGRhdGEpOgorICAgICIiIlF1b3RlIGRhdGEgZm9yIGVtYWlsLgorCisgICAgRG91YmxlIGxlYWRpbmcgJy4nLCBhbmQgY2hhbmdlIFVuaXggbmV3bGluZSAnXFxuJywgb3IgTWFjICdcXHInIGludG8KKyAgICBJbnRlcm5ldCBDUkxGIGVuZC1vZi1saW5lLgorICAgICIiIgorICAgIHJldHVybiByZS5zdWIocicoP20pXlwuJywgJy4uJywKKyAgICAgICAgcmUuc3ViKHInKD86XHJcbnxcbnxccig/IVxuKSknLCBDUkxGLCBkYXRhKSkKKworCit0cnk6CisgICAgaW1wb3J0IHNzbAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9oYXZlX3NzbCA9IEZhbHNlCitlbHNlOgorICAgIGNsYXNzIFNTTEZha2VGaWxlOgorICAgICAgICAiIiJBIGZha2UgZmlsZSBsaWtlIG9iamVjdCB0aGF0IHJlYWxseSB3cmFwcyBhIFNTTE9iamVjdC4KKworICAgICAgICBJdCBvbmx5IHN1cHBvcnRzIHdoYXQgaXMgbmVlZGVkIGluIHNtdHBsaWIuCisgICAgICAgICIiIgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc3Nsb2JqKToKKyAgICAgICAgICAgIHNlbGYuc3Nsb2JqID0gc3Nsb2JqCisKKyAgICAgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICAgICAgc3RyID0gIiIKKyAgICAgICAgICAgIGNociA9IE5vbmUKKyAgICAgICAgICAgIHdoaWxlIGNociAhPSAiXG4iOgorICAgICAgICAgICAgICAgIGNociA9IHNlbGYuc3Nsb2JqLnJlYWQoMSkKKyAgICAgICAgICAgICAgICBpZiBub3QgY2hyOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHN0ciArPSBjaHIKKyAgICAgICAgICAgIHJldHVybiBzdHIKKworICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICBwYXNzCisKKyAgICBfaGF2ZV9zc2wgPSBUcnVlCisKK2NsYXNzIFNNVFA6CisgICAgIiIiVGhpcyBjbGFzcyBtYW5hZ2VzIGEgY29ubmVjdGlvbiB0byBhbiBTTVRQIG9yIEVTTVRQIHNlcnZlci4KKyAgICBTTVRQIE9iamVjdHM6CisgICAgICAgIFNNVFAgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgICAgICAgICAgIGhlbG9fcmVzcAorICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG1lc3NhZ2UgZ2l2ZW4gYnkgdGhlIHNlcnZlciBpbiByZXNwb25zZSB0byB0aGUKKyAgICAgICAgICAgICAgICBtb3N0IHJlY2VudCBIRUxPIGNvbW1hbmQuCisKKyAgICAgICAgICAgIGVobG9fcmVzcAorICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIG1lc3NhZ2UgZ2l2ZW4gYnkgdGhlIHNlcnZlciBpbiByZXNwb25zZSB0byB0aGUKKyAgICAgICAgICAgICAgICBtb3N0IHJlY2VudCBFSExPIGNvbW1hbmQuIFRoaXMgaXMgdXN1YWxseSBtdWx0aWxpbmUuCisKKyAgICAgICAgICAgIGRvZXNfZXNtdHAKKyAgICAgICAgICAgICAgICBUaGlzIGlzIGEgVHJ1ZSB2YWx1ZSBfYWZ0ZXIgeW91IGRvIGFuIEVITE8gY29tbWFuZF8sIGlmIHRoZQorICAgICAgICAgICAgICAgIHNlcnZlciBzdXBwb3J0cyBFU01UUC4KKworICAgICAgICAgICAgZXNtdHBfZmVhdHVyZXMKKyAgICAgICAgICAgICAgICBUaGlzIGlzIGEgZGljdGlvbmFyeSwgd2hpY2gsIGlmIHRoZSBzZXJ2ZXIgc3VwcG9ydHMgRVNNVFAsCisgICAgICAgICAgICAgICAgd2lsbCBfYWZ0ZXIgeW91IGRvIGFuIEVITE8gY29tbWFuZF8sIGNvbnRhaW4gdGhlIG5hbWVzIG9mIHRoZQorICAgICAgICAgICAgICAgIFNNVFAgc2VydmljZSBleHRlbnNpb25zIHRoaXMgc2VydmVyIHN1cHBvcnRzLCBhbmQgdGhlaXIKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIChpZiBhbnkpLgorCisgICAgICAgICAgICAgICAgTm90ZSwgYWxsIGV4dGVuc2lvbiBuYW1lcyBhcmUgbWFwcGVkIHRvIGxvd2VyIGNhc2UgaW4gdGhlCisgICAgICAgICAgICAgICAgZGljdGlvbmFyeS4KKworICAgICAgICBTZWUgZWFjaCBtZXRob2QncyBkb2NzdHJpbmdzIGZvciBkZXRhaWxzLiAgSW4gZ2VuZXJhbCwgdGhlcmUgaXMgYQorICAgICAgICBtZXRob2Qgb2YgdGhlIHNhbWUgbmFtZSB0byBwZXJmb3JtIGVhY2ggU01UUCBjb21tYW5kLiAgVGhlcmUgaXMgYWxzbyBhCisgICAgICAgIG1ldGhvZCBjYWxsZWQgJ3NlbmRtYWlsJyB0aGF0IHdpbGwgZG8gYW4gZW50aXJlIG1haWwgdHJhbnNhY3Rpb24uCisgICAgICAgICIiIgorICAgIGRlYnVnbGV2ZWwgPSAwCisgICAgZmlsZSA9IE5vbmUKKyAgICBoZWxvX3Jlc3AgPSBOb25lCisgICAgZWhsb19tc2cgPSAiZWhsbyIKKyAgICBlaGxvX3Jlc3AgPSBOb25lCisgICAgZG9lc19lc210cCA9IDAKKyAgICBkZWZhdWx0X3BvcnQgPSBTTVRQX1BPUlQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCBwb3J0PTAsIGxvY2FsX2hvc3RuYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBhIG5ldyBpbnN0YW5jZS4KKworICAgICAgICBJZiBzcGVjaWZpZWQsIGBob3N0JyBpcyB0aGUgbmFtZSBvZiB0aGUgcmVtb3RlIGhvc3QgdG8gd2hpY2ggdG8KKyAgICAgICAgY29ubmVjdC4gIElmIHNwZWNpZmllZCwgYHBvcnQnIHNwZWNpZmllcyB0aGUgcG9ydCB0byB3aGljaCB0byBjb25uZWN0LgorICAgICAgICBCeSBkZWZhdWx0LCBzbXRwbGliLlNNVFBfUE9SVCBpcyB1c2VkLiAgSWYgYSBob3N0IGlzIHNwZWNpZmllZCB0aGUKKyAgICAgICAgY29ubmVjdCBtZXRob2QgaXMgY2FsbGVkLCBhbmQgaWYgaXQgcmV0dXJucyBhbnl0aGluZyBvdGhlciB0aGFuCisgICAgICAgIGEgc3VjY2VzcyBjb2RlIGFuIFNNVFBDb25uZWN0RXJyb3IgaXMgcmFpc2VkLiAgSWYgc3BlY2lmaWVkLAorICAgICAgICBgbG9jYWxfaG9zdG5hbWVgIGlzIHVzZWQgYXMgdGhlIEZRRE4gb2YgdGhlIGxvY2FsIGhvc3QuICBCeSBkZWZhdWx0LAorICAgICAgICB0aGUgbG9jYWwgaG9zdG5hbWUgaXMgZm91bmQgdXNpbmcgc29ja2V0LmdldGZxZG4oKS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLmVzbXRwX2ZlYXR1cmVzID0ge30KKyAgICAgICAgaWYgaG9zdDoKKyAgICAgICAgICAgIChjb2RlLCBtc2cpID0gc2VsZi5jb25uZWN0KGhvc3QsIHBvcnQpCisgICAgICAgICAgICBpZiBjb2RlICE9IDIyMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTTVRQQ29ubmVjdEVycm9yKGNvZGUsIG1zZykKKyAgICAgICAgaWYgbG9jYWxfaG9zdG5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmxvY2FsX2hvc3RuYW1lID0gbG9jYWxfaG9zdG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUkZDIDI4MjEgc2F5cyB3ZSBzaG91bGQgdXNlIHRoZSBmcWRuIGluIHRoZSBFSExPL0hFTE8gdmVyYiwgYW5kCisgICAgICAgICAgICAjIGlmIHRoYXQgY2FuJ3QgYmUgY2FsY3VsYXRlZCwgdGhhdCB3ZSBzaG91bGQgdXNlIGEgZG9tYWluIGxpdGVyYWwKKyAgICAgICAgICAgICMgaW5zdGVhZCAoZXNzZW50aWFsbHkgYW4gZW5jb2RlZCBJUCBhZGRyZXNzIGxpa2UgW0EuQi5DLkRdKS4KKyAgICAgICAgICAgIGZxZG4gPSBzb2NrZXQuZ2V0ZnFkbigpCisgICAgICAgICAgICBpZiAnLicgaW4gZnFkbjoKKyAgICAgICAgICAgICAgICBzZWxmLmxvY2FsX2hvc3RuYW1lID0gZnFkbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFdlIGNhbid0IGZpbmQgYW4gZnFkbiBob3N0bmFtZSwgc28gdXNlIGEgZG9tYWluIGxpdGVyYWwKKyAgICAgICAgICAgICAgICBhZGRyID0gJzEyNy4wLjAuMScKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGFkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgc2VsZi5sb2NhbF9ob3N0bmFtZSA9ICdbJXNdJyAlIGFkZHIKKworICAgIGRlZiBzZXRfZGVidWdsZXZlbChzZWxmLCBkZWJ1Z2xldmVsKToKKyAgICAgICAgIiIiU2V0IHRoZSBkZWJ1ZyBvdXRwdXQgbGV2ZWwuCisKKyAgICAgICAgQSBub24tZmFsc2UgdmFsdWUgcmVzdWx0cyBpbiBkZWJ1ZyBtZXNzYWdlcyBmb3IgY29ubmVjdGlvbiBhbmQgZm9yIGFsbAorICAgICAgICBtZXNzYWdlcyBzZW50IHRvIGFuZCByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGVidWdsZXZlbCA9IGRlYnVnbGV2ZWwKKworICAgIGRlZiBfZ2V0X3NvY2tldChzZWxmLCBob3N0LCBwb3J0LCB0aW1lb3V0KToKKyAgICAgICAgIyBUaGlzIG1ha2VzIGl0IHNpbXBsZXIgZm9yIFNNVFBfU1NMIHRvIHVzZSB0aGUgU01UUCBjb25uZWN0IGNvZGUKKyAgICAgICAgIyBhbmQganVzdCBhbHRlciB0aGUgc29ja2V0IGNvbm5lY3Rpb24gYml0LgorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgJ2Nvbm5lY3Q6JywgKGhvc3QsIHBvcnQpCisgICAgICAgIHJldHVybiBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGhvc3QsIHBvcnQpLCB0aW1lb3V0KQorCisgICAgZGVmIGNvbm5lY3Qoc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD0wKToKKyAgICAgICAgIiIiQ29ubmVjdCB0byBhIGhvc3Qgb24gYSBnaXZlbiBwb3J0LgorCisgICAgICAgIElmIHRoZSBob3N0bmFtZSBlbmRzIHdpdGggYSBjb2xvbiAoYDonKSBmb2xsb3dlZCBieSBhIG51bWJlciwgYW5kCisgICAgICAgIHRoZXJlIGlzIG5vIHBvcnQgc3BlY2lmaWVkLCB0aGF0IHN1ZmZpeCB3aWxsIGJlIHN0cmlwcGVkIG9mZiBhbmQgdGhlCisgICAgICAgIG51bWJlciBpbnRlcnByZXRlZCBhcyB0aGUgcG9ydCBudW1iZXIgdG8gdXNlLgorCisgICAgICAgIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgaW52b2tlZCBieSBfX2luaXRfXywgaWYgYSBob3N0IGlzCisgICAgICAgIHNwZWNpZmllZCBkdXJpbmcgaW5zdGFudGlhdGlvbi4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHBvcnQgYW5kIChob3N0LmZpbmQoJzonKSA9PSBob3N0LnJmaW5kKCc6JykpOgorICAgICAgICAgICAgaSA9IGhvc3QucmZpbmQoJzonKQorICAgICAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgICAgIGhvc3QsIHBvcnQgPSBob3N0WzppXSwgaG9zdFtpICsgMTpdCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnQpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNvY2tldC5lcnJvciwgIm5vbm51bWVyaWMgcG9ydCIKKyAgICAgICAgaWYgbm90IHBvcnQ6CisgICAgICAgICAgICBwb3J0ID0gc2VsZi5kZWZhdWx0X3BvcnQKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICdjb25uZWN0OicsIChob3N0LCBwb3J0KQorICAgICAgICBzZWxmLnNvY2sgPSBzZWxmLl9nZXRfc29ja2V0KGhvc3QsIHBvcnQsIHNlbGYudGltZW91dCkKKyAgICAgICAgKGNvZGUsIG1zZykgPSBzZWxmLmdldHJlcGx5KCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICJjb25uZWN0OiIsIG1zZworICAgICAgICByZXR1cm4gKGNvZGUsIG1zZykKKworICAgIGRlZiBzZW5kKHNlbGYsIHN0cik6CisgICAgICAgICIiIlNlbmQgYHN0cicgdG8gdGhlIHNlcnZlci4iIiIKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICdzZW5kOicsIHJlcHIoc3RyKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdzb2NrJykgYW5kIHNlbGYuc29jazoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2suc2VuZGFsbChzdHIpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJhaXNlIFNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWQoJ1NlcnZlciBub3QgY29ubmVjdGVkJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWQoJ3BsZWFzZSBydW4gY29ubmVjdCgpIGZpcnN0JykKKworICAgIGRlZiBwdXRjbWQoc2VsZiwgY21kLCBhcmdzPSIiKToKKyAgICAgICAgIiIiU2VuZCBhIGNvbW1hbmQgdG8gdGhlIHNlcnZlci4iIiIKKyAgICAgICAgaWYgYXJncyA9PSAiIjoKKyAgICAgICAgICAgIHN0ciA9ICclcyVzJyAlIChjbWQsIENSTEYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdHIgPSAnJXMgJXMlcycgJSAoY21kLCBhcmdzLCBDUkxGKQorICAgICAgICBzZWxmLnNlbmQoc3RyKQorCisgICAgZGVmIGdldHJlcGx5KHNlbGYpOgorICAgICAgICAiIiJHZXQgYSByZXBseSBmcm9tIHRoZSBzZXJ2ZXIuCisKKyAgICAgICAgUmV0dXJucyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2Y6CisKKyAgICAgICAgICAtIHNlcnZlciByZXNwb25zZSBjb2RlIChlLmcuICcyNTAnLCBvciBzdWNoLCBpZiBhbGwgZ29lcyB3ZWxsKQorICAgICAgICAgICAgTm90ZTogcmV0dXJucyAtMSBpZiBpdCBjYW4ndCByZWFkIHJlc3BvbnNlIGNvZGUuCisKKyAgICAgICAgICAtIHNlcnZlciByZXNwb25zZSBzdHJpbmcgY29ycmVzcG9uZGluZyB0byByZXNwb25zZSBjb2RlIChtdWx0aWxpbmUKKyAgICAgICAgICAgIHJlc3BvbnNlcyBhcmUgY29udmVydGVkIHRvIGEgc2luZ2xlLCBtdWx0aWxpbmUgc3RyaW5nKS4KKworICAgICAgICBSYWlzZXMgU01UUFNlcnZlckRpc2Nvbm5lY3RlZCBpZiBlbmQtb2YtZmlsZSBpcyByZWFjaGVkLgorICAgICAgICAiIiIKKyAgICAgICAgcmVzcCA9IFtdCisgICAgICAgIGlmIHNlbGYuZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5maWxlID0gc2VsZi5zb2NrLm1ha2VmaWxlKCdyYicpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UgU01UUFNlcnZlckRpc2Nvbm5lY3RlZCgiQ29ubmVjdGlvbiB1bmV4cGVjdGVkbHkgY2xvc2VkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cihlKSkKKyAgICAgICAgICAgIGlmIGxpbmUgPT0gJyc6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UgU01UUFNlcnZlckRpc2Nvbm5lY3RlZCgiQ29ubmVjdGlvbiB1bmV4cGVjdGVkbHkgY2xvc2VkIikKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgJ3JlcGx5OicsIHJlcHIobGluZSkKKyAgICAgICAgICAgIHJlc3AuYXBwZW5kKGxpbmVbNDpdLnN0cmlwKCkpCisgICAgICAgICAgICBjb2RlID0gbGluZVs6M10KKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgZXJyb3IgY29kZSBpcyBzeW50YWN0aWNhbGx5IGNvcnJlY3QuCisgICAgICAgICAgICAjIERvbid0IGF0dGVtcHQgdG8gcmVhZCBhIGNvbnRpbnVhdGlvbiBsaW5lIGlmIGl0IGlzIGJyb2tlbi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBlcnJjb2RlID0gaW50KGNvZGUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBlcnJjb2RlID0gLTEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBDaGVjayBpZiBtdWx0aWxpbmUgcmVzcG9uc2UuCisgICAgICAgICAgICBpZiBsaW5lWzM6NF0gIT0gIi0iOgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgZXJybXNnID0gIlxuIi5qb2luKHJlc3ApCisgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICBwcmludD4+c3RkZXJyLCAncmVwbHk6IHJldGNvZGUgKCVzKTsgTXNnOiAlcycgJSAoZXJyY29kZSwgZXJybXNnKQorICAgICAgICByZXR1cm4gZXJyY29kZSwgZXJybXNnCisKKyAgICBkZWYgZG9jbWQoc2VsZiwgY21kLCBhcmdzPSIiKToKKyAgICAgICAgIiIiU2VuZCBhIGNvbW1hbmQsIGFuZCByZXR1cm4gaXRzIHJlc3BvbnNlIGNvZGUuIiIiCisgICAgICAgIHNlbGYucHV0Y21kKGNtZCwgYXJncykKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVwbHkoKQorCisgICAgIyBzdGQgc210cCBjb21tYW5kcworICAgIGRlZiBoZWxvKHNlbGYsIG5hbWU9JycpOgorICAgICAgICAiIiJTTVRQICdoZWxvJyBjb21tYW5kLgorICAgICAgICBIb3N0bmFtZSB0byBzZW5kIGZvciB0aGlzIGNvbW1hbmQgZGVmYXVsdHMgdG8gdGhlIEZRRE4gb2YgdGhlIGxvY2FsCisgICAgICAgIGhvc3QuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnB1dGNtZCgiaGVsbyIsIG5hbWUgb3Igc2VsZi5sb2NhbF9ob3N0bmFtZSkKKyAgICAgICAgKGNvZGUsIG1zZykgPSBzZWxmLmdldHJlcGx5KCkKKyAgICAgICAgc2VsZi5oZWxvX3Jlc3AgPSBtc2cKKyAgICAgICAgcmV0dXJuIChjb2RlLCBtc2cpCisKKyAgICBkZWYgZWhsbyhzZWxmLCBuYW1lPScnKToKKyAgICAgICAgIiIiIFNNVFAgJ2VobG8nIGNvbW1hbmQuCisgICAgICAgIEhvc3RuYW1lIHRvIHNlbmQgZm9yIHRoaXMgY29tbWFuZCBkZWZhdWx0cyB0byB0aGUgRlFETiBvZiB0aGUgbG9jYWwKKyAgICAgICAgaG9zdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZXNtdHBfZmVhdHVyZXMgPSB7fQorICAgICAgICBzZWxmLnB1dGNtZChzZWxmLmVobG9fbXNnLCBuYW1lIG9yIHNlbGYubG9jYWxfaG9zdG5hbWUpCisgICAgICAgIChjb2RlLCBtc2cpID0gc2VsZi5nZXRyZXBseSgpCisgICAgICAgICMgQWNjb3JkaW5nIHRvIFJGQzE4Njkgc29tZSAoYmFkbHkgd3JpdHRlbikKKyAgICAgICAgIyBNVEEncyB3aWxsIGRpc2Nvbm5lY3Qgb24gYW4gZWhsby4gVG9zcyBhbiBleGNlcHRpb24gaWYKKyAgICAgICAgIyB0aGF0IGhhcHBlbnMgLWRkbQorICAgICAgICBpZiBjb2RlID09IC0xIGFuZCBsZW4obXNnKSA9PSAwOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZSBTTVRQU2VydmVyRGlzY29ubmVjdGVkKCJTZXJ2ZXIgbm90IGNvbm5lY3RlZCIpCisgICAgICAgIHNlbGYuZWhsb19yZXNwID0gbXNnCisgICAgICAgIGlmIGNvZGUgIT0gMjUwOgorICAgICAgICAgICAgcmV0dXJuIChjb2RlLCBtc2cpCisgICAgICAgIHNlbGYuZG9lc19lc210cCA9IDEKKyAgICAgICAgI3BhcnNlIHRoZSBlaGxvIHJlc3BvbnNlIC1kZG0KKyAgICAgICAgcmVzcCA9IHNlbGYuZWhsb19yZXNwLnNwbGl0KCdcbicpCisgICAgICAgIGRlbCByZXNwWzBdCisgICAgICAgIGZvciBlYWNoIGluIHJlc3A6CisgICAgICAgICAgICAjIFRvIGJlIGFibGUgdG8gY29tbXVuaWNhdGUgd2l0aCBhcyBtYW55IFNNVFAgc2VydmVycyBhcyBwb3NzaWJsZSwKKyAgICAgICAgICAgICMgd2UgaGF2ZSB0byB0YWtlIHRoZSBvbGQtc3R5bGUgYXV0aCBhZHZlcnRpc2VtZW50IGludG8gYWNjb3VudCwKKyAgICAgICAgICAgICMgYmVjYXVzZToKKyAgICAgICAgICAgICMgMSkgRWxzZSBvdXIgU01UUCBmZWF0dXJlIHBhcnNlciBnZXRzIGNvbmZ1c2VkLgorICAgICAgICAgICAgIyAyKSBUaGVyZSBhcmUgc29tZSBzZXJ2ZXJzIHRoYXQgb25seSBhZHZlcnRpc2UgdGhlIGF1dGggbWV0aG9kcyB3ZQorICAgICAgICAgICAgIyAgICBzdXBwb3J0IHVzaW5nIHRoZSBvbGQgc3R5bGUuCisgICAgICAgICAgICBhdXRoX21hdGNoID0gT0xEU1RZTEVfQVVUSC5tYXRjaChlYWNoKQorICAgICAgICAgICAgaWYgYXV0aF9tYXRjaDoKKyAgICAgICAgICAgICAgICAjIFRoaXMgZG9lc24ndCByZW1vdmUgZHVwbGljYXRlcywgYnV0IHRoYXQncyBubyBwcm9ibGVtCisgICAgICAgICAgICAgICAgc2VsZi5lc210cF9mZWF0dXJlc1siYXV0aCJdID0gc2VsZi5lc210cF9mZWF0dXJlcy5nZXQoImF1dGgiLCAiIikgXAorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICIgKyBhdXRoX21hdGNoLmdyb3VwcygwKVswXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgUkZDIDE4NjkgcmVxdWlyZXMgYSBzcGFjZSBiZXR3ZWVuIGVobG8ga2V5d29yZCBhbmQgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICMgSXQncyBhY3R1YWxseSBzdHJpY3RlciwgaW4gdGhhdCBvbmx5IHNwYWNlcyBhcmUgYWxsb3dlZCBiZXR3ZWVuCisgICAgICAgICAgICAjIHBhcmFtZXRlcnMsIGJ1dCB3ZXJlIG5vdCBnb2luZyB0byBjaGVjayBmb3IgdGhhdCBoZXJlLiAgTm90ZQorICAgICAgICAgICAgIyB0aGF0IHRoZSBzcGFjZSBpc24ndCBwcmVzZW50IGlmIHRoZXJlIGFyZSBubyBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInKD9QPGZlYXR1cmU+W0EtWmEtejAtOV1bQS1aYS16MC05XC1dKikgPycsIGVhY2gpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIGZlYXR1cmUgPSBtLmdyb3VwKCJmZWF0dXJlIikubG93ZXIoKQorICAgICAgICAgICAgICAgIHBhcmFtcyA9IG0uc3RyaW5nW20uZW5kKCJmZWF0dXJlIik6XS5zdHJpcCgpCisgICAgICAgICAgICAgICAgaWYgZmVhdHVyZSA9PSAiYXV0aCI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXNtdHBfZmVhdHVyZXNbZmVhdHVyZV0gPSBzZWxmLmVzbXRwX2ZlYXR1cmVzLmdldChmZWF0dXJlLCAiIikgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAiICsgcGFyYW1zCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5lc210cF9mZWF0dXJlc1tmZWF0dXJlXSA9IHBhcmFtcworICAgICAgICByZXR1cm4gKGNvZGUsIG1zZykKKworICAgIGRlZiBoYXNfZXh0bihzZWxmLCBvcHQpOgorICAgICAgICAiIiJEb2VzIHRoZSBzZXJ2ZXIgc3VwcG9ydCBhIGdpdmVuIFNNVFAgc2VydmljZSBleHRlbnNpb24/IiIiCisgICAgICAgIHJldHVybiBvcHQubG93ZXIoKSBpbiBzZWxmLmVzbXRwX2ZlYXR1cmVzCisKKyAgICBkZWYgaGVscChzZWxmLCBhcmdzPScnKToKKyAgICAgICAgIiIiU01UUCAnaGVscCcgY29tbWFuZC4KKyAgICAgICAgUmV0dXJucyBoZWxwIHRleHQgZnJvbSBzZXJ2ZXIuIiIiCisgICAgICAgIHNlbGYucHV0Y21kKCJoZWxwIiwgYXJncykKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVwbHkoKVsxXQorCisgICAgZGVmIHJzZXQoc2VsZik6CisgICAgICAgICIiIlNNVFAgJ3JzZXQnIGNvbW1hbmQgLS0gcmVzZXRzIHNlc3Npb24uIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRvY21kKCJyc2V0IikKKworICAgIGRlZiBub29wKHNlbGYpOgorICAgICAgICAiIiJTTVRQICdub29wJyBjb21tYW5kIC0tIGRvZXNuJ3QgZG8gYW55dGhpbmcgOj4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZG9jbWQoIm5vb3AiKQorCisgICAgZGVmIG1haWwoc2VsZiwgc2VuZGVyLCBvcHRpb25zPVtdKToKKyAgICAgICAgIiIiU01UUCAnbWFpbCcgY29tbWFuZCAtLSBiZWdpbnMgbWFpbCB4ZmVyIHNlc3Npb24uIiIiCisgICAgICAgIG9wdGlvbmxpc3QgPSAnJworICAgICAgICBpZiBvcHRpb25zIGFuZCBzZWxmLmRvZXNfZXNtdHA6CisgICAgICAgICAgICBvcHRpb25saXN0ID0gJyAnICsgJyAnLmpvaW4ob3B0aW9ucykKKyAgICAgICAgc2VsZi5wdXRjbWQoIm1haWwiLCAiRlJPTTolcyVzIiAlIChxdW90ZWFkZHIoc2VuZGVyKSwgb3B0aW9ubGlzdCkpCisgICAgICAgIHJldHVybiBzZWxmLmdldHJlcGx5KCkKKworICAgIGRlZiByY3B0KHNlbGYsIHJlY2lwLCBvcHRpb25zPVtdKToKKyAgICAgICAgIiIiU01UUCAncmNwdCcgY29tbWFuZCAtLSBpbmRpY2F0ZXMgMSByZWNpcGllbnQgZm9yIHRoaXMgbWFpbC4iIiIKKyAgICAgICAgb3B0aW9ubGlzdCA9ICcnCisgICAgICAgIGlmIG9wdGlvbnMgYW5kIHNlbGYuZG9lc19lc210cDoKKyAgICAgICAgICAgIG9wdGlvbmxpc3QgPSAnICcgKyAnICcuam9pbihvcHRpb25zKQorICAgICAgICBzZWxmLnB1dGNtZCgicmNwdCIsICJUTzolcyVzIiAlIChxdW90ZWFkZHIocmVjaXApLCBvcHRpb25saXN0KSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVwbHkoKQorCisgICAgZGVmIGRhdGEoc2VsZiwgbXNnKToKKyAgICAgICAgIiIiU01UUCAnREFUQScgY29tbWFuZCAtLSBzZW5kcyBtZXNzYWdlIGRhdGEgdG8gc2VydmVyLgorCisgICAgICAgIEF1dG9tYXRpY2FsbHkgcXVvdGVzIGxpbmVzIGJlZ2lubmluZyB3aXRoIGEgcGVyaW9kIHBlciByZmM4MjEuCisgICAgICAgIFJhaXNlcyBTTVRQRGF0YUVycm9yIGlmIHRoZXJlIGlzIGFuIHVuZXhwZWN0ZWQgcmVwbHkgdG8gdGhlCisgICAgICAgIERBVEEgY29tbWFuZDsgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzIHRoZSBmaW5hbAorICAgICAgICByZXNwb25zZSBjb2RlIHJlY2VpdmVkIHdoZW4gdGhlIGFsbCBkYXRhIGlzIHNlbnQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnB1dGNtZCgiZGF0YSIpCisgICAgICAgIChjb2RlLCByZXBsKSA9IHNlbGYuZ2V0cmVwbHkoKQorICAgICAgICBpZiBzZWxmLmRlYnVnbGV2ZWwgPiAwOgorICAgICAgICAgICAgcHJpbnQ+PnN0ZGVyciwgImRhdGE6IiwgKGNvZGUsIHJlcGwpCisgICAgICAgIGlmIGNvZGUgIT0gMzU0OgorICAgICAgICAgICAgcmFpc2UgU01UUERhdGFFcnJvcihjb2RlLCByZXBsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcSA9IHF1b3RlZGF0YShtc2cpCisgICAgICAgICAgICBpZiBxWy0yOl0gIT0gQ1JMRjoKKyAgICAgICAgICAgICAgICBxID0gcSArIENSTEYKKyAgICAgICAgICAgIHEgPSBxICsgIi4iICsgQ1JMRgorICAgICAgICAgICAgc2VsZi5zZW5kKHEpCisgICAgICAgICAgICAoY29kZSwgbXNnKSA9IHNlbGYuZ2V0cmVwbHkoKQorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgICAgICBwcmludD4+c3RkZXJyLCAiZGF0YToiLCAoY29kZSwgbXNnKQorICAgICAgICAgICAgcmV0dXJuIChjb2RlLCBtc2cpCisKKyAgICBkZWYgdmVyaWZ5KHNlbGYsIGFkZHJlc3MpOgorICAgICAgICAiIiJTTVRQICd2ZXJpZnknIGNvbW1hbmQgLS0gY2hlY2tzIGZvciBhZGRyZXNzIHZhbGlkaXR5LiIiIgorICAgICAgICBzZWxmLnB1dGNtZCgidnJmeSIsIF9hZGRyX29ubHkoYWRkcmVzcykpCisgICAgICAgIHJldHVybiBzZWxmLmdldHJlcGx5KCkKKyAgICAjIGEuay5hLgorICAgIHZyZnkgPSB2ZXJpZnkKKworICAgIGRlZiBleHBuKHNlbGYsIGFkZHJlc3MpOgorICAgICAgICAiIiJTTVRQICdleHBuJyBjb21tYW5kIC0tIGV4cGFuZHMgYSBtYWlsaW5nIGxpc3QuIiIiCisgICAgICAgIHNlbGYucHV0Y21kKCJleHBuIiwgX2FkZHJfb25seShhZGRyZXNzKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0cmVwbHkoKQorCisgICAgIyBzb21lIHVzZWZ1bCBtZXRob2RzCisKKyAgICBkZWYgZWhsb19vcl9oZWxvX2lmX25lZWRlZChzZWxmKToKKyAgICAgICAgIiIiQ2FsbCBzZWxmLmVobG8oKSBhbmQvb3Igc2VsZi5oZWxvKCkgaWYgbmVlZGVkLgorCisgICAgICAgIElmIHRoZXJlIGhhcyBiZWVuIG5vIHByZXZpb3VzIEVITE8gb3IgSEVMTyBjb21tYW5kIHRoaXMgc2Vzc2lvbiwgdGhpcworICAgICAgICBtZXRob2QgdHJpZXMgRVNNVFAgRUhMTyBmaXJzdC4KKworICAgICAgICBUaGlzIG1ldGhvZCBtYXkgcmFpc2UgdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorCisgICAgICAgICBTTVRQSGVsb0Vycm9yICAgICAgICAgICAgVGhlIHNlcnZlciBkaWRuJ3QgcmVwbHkgcHJvcGVybHkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGVsbyBncmVldGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuaGVsb19yZXNwIGlzIE5vbmUgYW5kIHNlbGYuZWhsb19yZXNwIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBub3QgKDIwMCA8PSBzZWxmLmVobG8oKVswXSA8PSAyOTkpOgorICAgICAgICAgICAgICAgIChjb2RlLCByZXNwKSA9IHNlbGYuaGVsbygpCisgICAgICAgICAgICAgICAgaWYgbm90ICgyMDAgPD0gY29kZSA8PSAyOTkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTTVRQSGVsb0Vycm9yKGNvZGUsIHJlc3ApCisKKyAgICBkZWYgbG9naW4oc2VsZiwgdXNlciwgcGFzc3dvcmQpOgorICAgICAgICAiIiJMb2cgaW4gb24gYW4gU01UUCBzZXJ2ZXIgdGhhdCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbi4KKworICAgICAgICBUaGUgYXJndW1lbnRzIGFyZToKKyAgICAgICAgICAgIC0gdXNlcjogICAgIFRoZSB1c2VyIG5hbWUgdG8gYXV0aGVudGljYXRlIHdpdGguCisgICAgICAgICAgICAtIHBhc3N3b3JkOiBUaGUgcGFzc3dvcmQgZm9yIHRoZSBhdXRoZW50aWNhdGlvbi4KKworICAgICAgICBJZiB0aGVyZSBoYXMgYmVlbiBubyBwcmV2aW91cyBFSExPIG9yIEhFTE8gY29tbWFuZCB0aGlzIHNlc3Npb24sIHRoaXMKKyAgICAgICAgbWV0aG9kIHRyaWVzIEVTTVRQIEVITE8gZmlyc3QuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbm9ybWFsbHkgaWYgdGhlIGF1dGhlbnRpY2F0aW9uIHdhcyBzdWNjZXNzZnVsLgorCisgICAgICAgIFRoaXMgbWV0aG9kIG1heSByYWlzZSB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnM6CisKKyAgICAgICAgIFNNVFBIZWxvRXJyb3IgICAgICAgICAgICBUaGUgc2VydmVyIGRpZG4ndCByZXBseSBwcm9wZXJseSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWxvIGdyZWV0aW5nLgorICAgICAgICAgU01UUEF1dGhlbnRpY2F0aW9uRXJyb3IgIFRoZSBzZXJ2ZXIgZGlkbid0IGFjY2VwdCB0aGUgdXNlcm5hbWUvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgY29tYmluYXRpb24uCisgICAgICAgICBTTVRQRXhjZXB0aW9uICAgICAgICAgICAgTm8gc3VpdGFibGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLgorICAgICAgICAiIiIKKworICAgICAgICBkZWYgZW5jb2RlX2NyYW1fbWQ1KGNoYWxsZW5nZSwgdXNlciwgcGFzc3dvcmQpOgorICAgICAgICAgICAgY2hhbGxlbmdlID0gYmFzZTY0LmRlY29kZXN0cmluZyhjaGFsbGVuZ2UpCisgICAgICAgICAgICByZXNwb25zZSA9IHVzZXIgKyAiICIgKyBobWFjLkhNQUMocGFzc3dvcmQsIGNoYWxsZW5nZSkuaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGVfYmFzZTY0KHJlc3BvbnNlLCBlb2w9IiIpCisKKyAgICAgICAgZGVmIGVuY29kZV9wbGFpbih1c2VyLCBwYXNzd29yZCk6CisgICAgICAgICAgICByZXR1cm4gZW5jb2RlX2Jhc2U2NCgiXDAlc1wwJXMiICUgKHVzZXIsIHBhc3N3b3JkKSwgZW9sPSIiKQorCisKKyAgICAgICAgQVVUSF9QTEFJTiA9ICJQTEFJTiIKKyAgICAgICAgQVVUSF9DUkFNX01ENSA9ICJDUkFNLU1ENSIKKyAgICAgICAgQVVUSF9MT0dJTiA9ICJMT0dJTiIKKworICAgICAgICBzZWxmLmVobG9fb3JfaGVsb19pZl9uZWVkZWQoKQorCisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19leHRuKCJhdXRoIik6CisgICAgICAgICAgICByYWlzZSBTTVRQRXhjZXB0aW9uKCJTTVRQIEFVVEggZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQgYnkgc2VydmVyLiIpCisKKyAgICAgICAgIyBBdXRoZW50aWNhdGlvbiBtZXRob2RzIHRoZSBzZXJ2ZXIgc3VwcG9ydHM6CisgICAgICAgIGF1dGhsaXN0ID0gc2VsZi5lc210cF9mZWF0dXJlc1siYXV0aCJdLnNwbGl0KCkKKworICAgICAgICAjIExpc3Qgb2YgYXV0aGVudGljYXRpb24gbWV0aG9kcyB3ZSBzdXBwb3J0OiBmcm9tIHByZWZlcnJlZCB0bworICAgICAgICAjIGxlc3MgcHJlZmVycmVkIG1ldGhvZHMuIEV4Y2VwdCBmb3IgdGhlIHB1cnBvc2Ugb2YgdGVzdGluZyB0aGUgd2Vha2VyCisgICAgICAgICMgb25lcywgd2UgcHJlZmVyIHN0cm9uZ2VyIG1ldGhvZHMgbGlrZSBDUkFNLU1ENToKKyAgICAgICAgcHJlZmVycmVkX2F1dGhzID0gW0FVVEhfQ1JBTV9NRDUsIEFVVEhfUExBSU4sIEFVVEhfTE9HSU5dCisKKyAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCB3ZSdsbCB1c2UKKyAgICAgICAgYXV0aG1ldGhvZCA9IE5vbmUKKyAgICAgICAgZm9yIG1ldGhvZCBpbiBwcmVmZXJyZWRfYXV0aHM6CisgICAgICAgICAgICBpZiBtZXRob2QgaW4gYXV0aGxpc3Q6CisgICAgICAgICAgICAgICAgYXV0aG1ldGhvZCA9IG1ldGhvZAorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgYXV0aG1ldGhvZCA9PSBBVVRIX0NSQU1fTUQ1OgorICAgICAgICAgICAgKGNvZGUsIHJlc3ApID0gc2VsZi5kb2NtZCgiQVVUSCIsIEFVVEhfQ1JBTV9NRDUpCisgICAgICAgICAgICBpZiBjb2RlID09IDUwMzoKKyAgICAgICAgICAgICAgICAjIDUwMyA9PSAnRXJyb3I6IGFscmVhZHkgYXV0aGVudGljYXRlZCcKKyAgICAgICAgICAgICAgICByZXR1cm4gKGNvZGUsIHJlc3ApCisgICAgICAgICAgICAoY29kZSwgcmVzcCkgPSBzZWxmLmRvY21kKGVuY29kZV9jcmFtX21kNShyZXNwLCB1c2VyLCBwYXNzd29yZCkpCisgICAgICAgIGVsaWYgYXV0aG1ldGhvZCA9PSBBVVRIX1BMQUlOOgorICAgICAgICAgICAgKGNvZGUsIHJlc3ApID0gc2VsZi5kb2NtZCgiQVVUSCIsCisgICAgICAgICAgICAgICAgQVVUSF9QTEFJTiArICIgIiArIGVuY29kZV9wbGFpbih1c2VyLCBwYXNzd29yZCkpCisgICAgICAgIGVsaWYgYXV0aG1ldGhvZCA9PSBBVVRIX0xPR0lOOgorICAgICAgICAgICAgKGNvZGUsIHJlc3ApID0gc2VsZi5kb2NtZCgiQVVUSCIsCisgICAgICAgICAgICAgICAgIiVzICVzIiAlIChBVVRIX0xPR0lOLCBlbmNvZGVfYmFzZTY0KHVzZXIsIGVvbD0iIikpKQorICAgICAgICAgICAgaWYgY29kZSAhPSAzMzQ6CisgICAgICAgICAgICAgICAgcmFpc2UgU01UUEF1dGhlbnRpY2F0aW9uRXJyb3IoY29kZSwgcmVzcCkKKyAgICAgICAgICAgIChjb2RlLCByZXNwKSA9IHNlbGYuZG9jbWQoZW5jb2RlX2Jhc2U2NChwYXNzd29yZCwgZW9sPSIiKSkKKyAgICAgICAgZWxpZiBhdXRobWV0aG9kIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBTTVRQRXhjZXB0aW9uKCJObyBzdWl0YWJsZSBhdXRoZW50aWNhdGlvbiBtZXRob2QgZm91bmQuIikKKyAgICAgICAgaWYgY29kZSBub3QgaW4gKDIzNSwgNTAzKToKKyAgICAgICAgICAgICMgMjM1ID09ICdBdXRoZW50aWNhdGlvbiBzdWNjZXNzZnVsJworICAgICAgICAgICAgIyA1MDMgPT0gJ0Vycm9yOiBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQnCisgICAgICAgICAgICByYWlzZSBTTVRQQXV0aGVudGljYXRpb25FcnJvcihjb2RlLCByZXNwKQorICAgICAgICByZXR1cm4gKGNvZGUsIHJlc3ApCisKKyAgICBkZWYgc3RhcnR0bHMoc2VsZiwga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lKToKKyAgICAgICAgIiIiUHV0cyB0aGUgY29ubmVjdGlvbiB0byB0aGUgU01UUCBzZXJ2ZXIgaW50byBUTFMgbW9kZS4KKworICAgICAgICBJZiB0aGVyZSBoYXMgYmVlbiBubyBwcmV2aW91cyBFSExPIG9yIEhFTE8gY29tbWFuZCB0aGlzIHNlc3Npb24sIHRoaXMKKyAgICAgICAgbWV0aG9kIHRyaWVzIEVTTVRQIEVITE8gZmlyc3QuCisKKyAgICAgICAgSWYgdGhlIHNlcnZlciBzdXBwb3J0cyBUTFMsIHRoaXMgd2lsbCBlbmNyeXB0IHRoZSByZXN0IG9mIHRoZSBTTVRQCisgICAgICAgIHNlc3Npb24uIElmIHlvdSBwcm92aWRlIHRoZSBrZXlmaWxlIGFuZCBjZXJ0ZmlsZSBwYXJhbWV0ZXJzLAorICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdGhlIFNNVFAgc2VydmVyIGFuZCBjbGllbnQgY2FuIGJlIGNoZWNrZWQuIFRoaXMsCisgICAgICAgIGhvd2V2ZXIsIGRlcGVuZHMgb24gd2hldGhlciB0aGUgc29ja2V0IG1vZHVsZSByZWFsbHkgY2hlY2tzIHRoZQorICAgICAgICBjZXJ0aWZpY2F0ZXMuCisKKyAgICAgICAgVGhpcyBtZXRob2QgbWF5IHJhaXNlIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uczoKKworICAgICAgICAgU01UUEhlbG9FcnJvciAgICAgICAgICAgIFRoZSBzZXJ2ZXIgZGlkbid0IHJlcGx5IHByb3Blcmx5IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhlbG8gZ3JlZXRpbmcuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmVobG9fb3JfaGVsb19pZl9uZWVkZWQoKQorICAgICAgICBpZiBub3Qgc2VsZi5oYXNfZXh0bigic3RhcnR0bHMiKToKKyAgICAgICAgICAgIHJhaXNlIFNNVFBFeGNlcHRpb24oIlNUQVJUVExTIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkIGJ5IHNlcnZlci4iKQorICAgICAgICAocmVzcCwgcmVwbHkpID0gc2VsZi5kb2NtZCgiU1RBUlRUTFMiKQorICAgICAgICBpZiByZXNwID09IDIyMDoKKyAgICAgICAgICAgIGlmIG5vdCBfaGF2ZV9zc2w6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJObyBTU0wgc3VwcG9ydCBpbmNsdWRlZCBpbiB0aGlzIFB5dGhvbiIpCisgICAgICAgICAgICBzZWxmLnNvY2sgPSBzc2wud3JhcF9zb2NrZXQoc2VsZi5zb2NrLCBrZXlmaWxlLCBjZXJ0ZmlsZSkKKyAgICAgICAgICAgIHNlbGYuZmlsZSA9IFNTTEZha2VGaWxlKHNlbGYuc29jaykKKyAgICAgICAgICAgICMgUkZDIDMyMDc6CisgICAgICAgICAgICAjIFRoZSBjbGllbnQgTVVTVCBkaXNjYXJkIGFueSBrbm93bGVkZ2Ugb2J0YWluZWQgZnJvbQorICAgICAgICAgICAgIyB0aGUgc2VydmVyLCBzdWNoIGFzIHRoZSBsaXN0IG9mIFNNVFAgc2VydmljZSBleHRlbnNpb25zLAorICAgICAgICAgICAgIyB3aGljaCB3YXMgbm90IG9idGFpbmVkIGZyb20gdGhlIFRMUyBuZWdvdGlhdGlvbiBpdHNlbGYuCisgICAgICAgICAgICBzZWxmLmhlbG9fcmVzcCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZWhsb19yZXNwID0gTm9uZQorICAgICAgICAgICAgc2VsZi5lc210cF9mZWF0dXJlcyA9IHt9CisgICAgICAgICAgICBzZWxmLmRvZXNfZXNtdHAgPSAwCisgICAgICAgIHJldHVybiAocmVzcCwgcmVwbHkpCisKKyAgICBkZWYgc2VuZG1haWwoc2VsZiwgZnJvbV9hZGRyLCB0b19hZGRycywgbXNnLCBtYWlsX29wdGlvbnM9W10sCisgICAgICAgICAgICAgICAgIHJjcHRfb3B0aW9ucz1bXSk6CisgICAgICAgICIiIlRoaXMgY29tbWFuZCBwZXJmb3JtcyBhbiBlbnRpcmUgbWFpbCB0cmFuc2FjdGlvbi4KKworICAgICAgICBUaGUgYXJndW1lbnRzIGFyZToKKyAgICAgICAgICAgIC0gZnJvbV9hZGRyICAgIDogVGhlIGFkZHJlc3Mgc2VuZGluZyB0aGlzIG1haWwuCisgICAgICAgICAgICAtIHRvX2FkZHJzICAgICA6IEEgbGlzdCBvZiBhZGRyZXNzZXMgdG8gc2VuZCB0aGlzIG1haWwgdG8uICBBIGJhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHdpbGwgYmUgdHJlYXRlZCBhcyBhIGxpc3Qgd2l0aCAxIGFkZHJlc3MuCisgICAgICAgICAgICAtIG1zZyAgICAgICAgICA6IFRoZSBtZXNzYWdlIHRvIHNlbmQuCisgICAgICAgICAgICAtIG1haWxfb3B0aW9ucyA6IExpc3Qgb2YgRVNNVFAgb3B0aW9ucyAoc3VjaCBhcyA4Yml0bWltZSkgZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlsIGNvbW1hbmQuCisgICAgICAgICAgICAtIHJjcHRfb3B0aW9ucyA6IExpc3Qgb2YgRVNNVFAgb3B0aW9ucyAoc3VjaCBhcyBEU04gY29tbWFuZHMpIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgdGhlIHJjcHQgY29tbWFuZHMuCisKKyAgICAgICAgSWYgdGhlcmUgaGFzIGJlZW4gbm8gcHJldmlvdXMgRUhMTyBvciBIRUxPIGNvbW1hbmQgdGhpcyBzZXNzaW9uLCB0aGlzCisgICAgICAgIG1ldGhvZCB0cmllcyBFU01UUCBFSExPIGZpcnN0LiAgSWYgdGhlIHNlcnZlciBkb2VzIEVTTVRQLCBtZXNzYWdlIHNpemUKKyAgICAgICAgYW5kIGVhY2ggb2YgdGhlIHNwZWNpZmllZCBvcHRpb25zIHdpbGwgYmUgcGFzc2VkIHRvIGl0LiAgSWYgRUhMTworICAgICAgICBmYWlscywgSEVMTyB3aWxsIGJlIHRyaWVkIGFuZCBFU01UUCBvcHRpb25zIHN1cHByZXNzZWQuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gbm9ybWFsbHkgaWYgdGhlIG1haWwgaXMgYWNjZXB0ZWQgZm9yIGF0IGxlYXN0CisgICAgICAgIG9uZSByZWNpcGllbnQuICBJdCByZXR1cm5zIGEgZGljdGlvbmFyeSwgd2l0aCBvbmUgZW50cnkgZm9yIGVhY2gKKyAgICAgICAgcmVjaXBpZW50IHRoYXQgd2FzIHJlZnVzZWQuICBFYWNoIGVudHJ5IGNvbnRhaW5zIGEgdHVwbGUgb2YgdGhlIFNNVFAKKyAgICAgICAgZXJyb3IgY29kZSBhbmQgdGhlIGFjY29tcGFueWluZyBlcnJvciBtZXNzYWdlIHNlbnQgYnkgdGhlIHNlcnZlci4KKworICAgICAgICBUaGlzIG1ldGhvZCBtYXkgcmFpc2UgdGhlIGZvbGxvd2luZyBleGNlcHRpb25zOgorCisgICAgICAgICBTTVRQSGVsb0Vycm9yICAgICAgICAgIFRoZSBzZXJ2ZXIgZGlkbid0IHJlcGx5IHByb3Blcmx5IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBoZWxvIGdyZWV0aW5nLgorICAgICAgICAgU01UUFJlY2lwaWVudHNSZWZ1c2VkICBUaGUgc2VydmVyIHJlamVjdGVkIEFMTCByZWNpcGllbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChubyBtYWlsIHdhcyBzZW50KS4KKyAgICAgICAgIFNNVFBTZW5kZXJSZWZ1c2VkICAgICAgVGhlIHNlcnZlciBkaWRuJ3QgYWNjZXB0IHRoZSBmcm9tX2FkZHIuCisgICAgICAgICBTTVRQRGF0YUVycm9yICAgICAgICAgIFRoZSBzZXJ2ZXIgcmVwbGllZCB3aXRoIGFuIHVuZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgY29kZSAob3RoZXIgdGhhbiBhIHJlZnVzYWwgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSByZWNpcGllbnQpLgorCisgICAgICAgIE5vdGU6IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgb3BlbiBldmVuIGFmdGVyIGFuIGV4Y2VwdGlvbiBpcyByYWlzZWQuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICAgPj4+IGltcG9ydCBzbXRwbGliCisgICAgICAgICA+Pj4gcz1zbXRwbGliLlNNVFAoImxvY2FsaG9zdCIpCisgICAgICAgICA+Pj4gdG9saXN0PVsib25lQG9uZS5vcmciLCJ0d29AdHdvLm9yZyIsInRocmVlQHRocmVlLm9yZyIsImZvdXJAZm91ci5vcmciXQorICAgICAgICAgPj4+IG1zZyA9ICcnJ1xcCisgICAgICAgICAuLi4gRnJvbTogTWVAbXkub3JnCisgICAgICAgICAuLi4gU3ViamVjdDogdGVzdGluJy4uLgorICAgICAgICAgLi4uCisgICAgICAgICAuLi4gVGhpcyBpcyBhIHRlc3QgJycnCisgICAgICAgICA+Pj4gcy5zZW5kbWFpbCgibWVAbXkub3JnIix0b2xpc3QsbXNnKQorICAgICAgICAgeyAidGhyZWVAdGhyZWUub3JnIiA6ICggNTUwICwiVXNlciB1bmtub3duIiApIH0KKyAgICAgICAgID4+PiBzLnF1aXQoKQorCisgICAgICAgIEluIHRoZSBhYm92ZSBleGFtcGxlLCB0aGUgbWVzc2FnZSB3YXMgYWNjZXB0ZWQgZm9yIGRlbGl2ZXJ5IHRvIHRocmVlCisgICAgICAgIG9mIHRoZSBmb3VyIGFkZHJlc3NlcywgYW5kIG9uZSB3YXMgcmVqZWN0ZWQsIHdpdGggdGhlIGVycm9yIGNvZGUKKyAgICAgICAgNTUwLiAgSWYgYWxsIGFkZHJlc3NlcyBhcmUgYWNjZXB0ZWQsIHRoZW4gdGhlIG1ldGhvZCB3aWxsIHJldHVybiBhbgorICAgICAgICBlbXB0eSBkaWN0aW9uYXJ5LgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmVobG9fb3JfaGVsb19pZl9uZWVkZWQoKQorICAgICAgICBlc210cF9vcHRzID0gW10KKyAgICAgICAgaWYgc2VsZi5kb2VzX2VzbXRwOgorICAgICAgICAgICAgIyBIbW1tPyB3aGF0J3MgdGhpcz8gLWRkbQorICAgICAgICAgICAgIyBzZWxmLmVzbXRwX2ZlYXR1cmVzWyc3Yml0J109IiIKKyAgICAgICAgICAgIGlmIHNlbGYuaGFzX2V4dG4oJ3NpemUnKToKKyAgICAgICAgICAgICAgICBlc210cF9vcHRzLmFwcGVuZCgic2l6ZT0lZCIgJSBsZW4obXNnKSkKKyAgICAgICAgICAgIGZvciBvcHRpb24gaW4gbWFpbF9vcHRpb25zOgorICAgICAgICAgICAgICAgIGVzbXRwX29wdHMuYXBwZW5kKG9wdGlvbikKKworICAgICAgICAoY29kZSwgcmVzcCkgPSBzZWxmLm1haWwoZnJvbV9hZGRyLCBlc210cF9vcHRzKQorICAgICAgICBpZiBjb2RlICE9IDI1MDoKKyAgICAgICAgICAgIHNlbGYucnNldCgpCisgICAgICAgICAgICByYWlzZSBTTVRQU2VuZGVyUmVmdXNlZChjb2RlLCByZXNwLCBmcm9tX2FkZHIpCisgICAgICAgIHNlbmRlcnJzID0ge30KKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0b19hZGRycywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB0b19hZGRycyA9IFt0b19hZGRyc10KKyAgICAgICAgZm9yIGVhY2ggaW4gdG9fYWRkcnM6CisgICAgICAgICAgICAoY29kZSwgcmVzcCkgPSBzZWxmLnJjcHQoZWFjaCwgcmNwdF9vcHRpb25zKQorICAgICAgICAgICAgaWYgKGNvZGUgIT0gMjUwKSBhbmQgKGNvZGUgIT0gMjUxKToKKyAgICAgICAgICAgICAgICBzZW5kZXJyc1tlYWNoXSA9IChjb2RlLCByZXNwKQorICAgICAgICBpZiBsZW4oc2VuZGVycnMpID09IGxlbih0b19hZGRycyk6CisgICAgICAgICAgICAjIHRoZSBzZXJ2ZXIgcmVmdXNlZCBhbGwgb3VyIHJlY2lwaWVudHMKKyAgICAgICAgICAgIHNlbGYucnNldCgpCisgICAgICAgICAgICByYWlzZSBTTVRQUmVjaXBpZW50c1JlZnVzZWQoc2VuZGVycnMpCisgICAgICAgIChjb2RlLCByZXNwKSA9IHNlbGYuZGF0YShtc2cpCisgICAgICAgIGlmIGNvZGUgIT0gMjUwOgorICAgICAgICAgICAgc2VsZi5yc2V0KCkKKyAgICAgICAgICAgIHJhaXNlIFNNVFBEYXRhRXJyb3IoY29kZSwgcmVzcCkKKyAgICAgICAgI2lmIHdlIGdvdCBoZXJlIHRoZW4gc29tZWJvZHkgZ290IG91ciBtYWlsCisgICAgICAgIHJldHVybiBzZW5kZXJycworCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBTTVRQIHNlcnZlci4iIiIKKyAgICAgICAgaWYgc2VsZi5maWxlOgorICAgICAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5maWxlID0gTm9uZQorICAgICAgICBpZiBzZWxmLnNvY2s6CisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICBzZWxmLnNvY2sgPSBOb25lCisKKworICAgIGRlZiBxdWl0KHNlbGYpOgorICAgICAgICAiIiJUZXJtaW5hdGUgdGhlIFNNVFAgc2Vzc2lvbi4iIiIKKyAgICAgICAgcmVzID0gc2VsZi5kb2NtZCgicXVpdCIpCisgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gcmVzCisKK2lmIF9oYXZlX3NzbDoKKworICAgIGNsYXNzIFNNVFBfU1NMKFNNVFApOgorICAgICAgICAiIiIgVGhpcyBpcyBhIHN1YmNsYXNzIGRlcml2ZWQgZnJvbSBTTVRQIHRoYXQgY29ubmVjdHMgb3ZlciBhbiBTU0wgZW5jcnlwdGVkCisgICAgICAgIHNvY2tldCAodG8gdXNlIHRoaXMgY2xhc3MgeW91IG5lZWQgYSBzb2NrZXQgbW9kdWxlIHRoYXQgd2FzIGNvbXBpbGVkIHdpdGggU1NMCisgICAgICAgIHN1cHBvcnQpLiBJZiBob3N0IGlzIG5vdCBzcGVjaWZpZWQsICcnICh0aGUgbG9jYWwgaG9zdCkgaXMgdXNlZC4gSWYgcG9ydCBpcworICAgICAgICBvbWl0dGVkLCB0aGUgc3RhbmRhcmQgU01UUC1vdmVyLVNTTCBwb3J0ICg0NjUpIGlzIHVzZWQuIGtleWZpbGUgYW5kIGNlcnRmaWxlCisgICAgICAgIGFyZSBhbHNvIG9wdGlvbmFsIC0gdGhleSBjYW4gY29udGFpbiBhIFBFTSBmb3JtYXR0ZWQgcHJpdmF0ZSBrZXkgYW5kCisgICAgICAgIGNlcnRpZmljYXRlIGNoYWluIGZpbGUgZm9yIHRoZSBTU0wgY29ubmVjdGlvbi4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZGVmYXVsdF9wb3J0ID0gU01UUF9TU0xfUE9SVAorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PScnLCBwb3J0PTAsIGxvY2FsX2hvc3RuYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgICAgICBzZWxmLmtleWZpbGUgPSBrZXlmaWxlCisgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgICAgIFNNVFAuX19pbml0X18oc2VsZiwgaG9zdCwgcG9ydCwgbG9jYWxfaG9zdG5hbWUsIHRpbWVvdXQpCisKKyAgICAgICAgZGVmIF9nZXRfc29ja2V0KHNlbGYsIGhvc3QsIHBvcnQsIHRpbWVvdXQpOgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgICAgICBwcmludD4+c3RkZXJyLCAnY29ubmVjdDonLCAoaG9zdCwgcG9ydCkKKyAgICAgICAgICAgIG5ld19zb2NrZXQgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGhvc3QsIHBvcnQpLCB0aW1lb3V0KQorICAgICAgICAgICAgbmV3X3NvY2tldCA9IHNzbC53cmFwX3NvY2tldChuZXdfc29ja2V0LCBzZWxmLmtleWZpbGUsIHNlbGYuY2VydGZpbGUpCisgICAgICAgICAgICBzZWxmLmZpbGUgPSBTU0xGYWtlRmlsZShuZXdfc29ja2V0KQorICAgICAgICAgICAgcmV0dXJuIG5ld19zb2NrZXQKKworICAgIF9fYWxsX18uYXBwZW5kKCJTTVRQX1NTTCIpCisKKyMKKyMgTE1UUCBleHRlbnNpb24KKyMKK0xNVFBfUE9SVCA9IDIwMDMKKworY2xhc3MgTE1UUChTTVRQKToKKyAgICAiIiJMTVRQIC0gTG9jYWwgTWFpbCBUcmFuc2ZlciBQcm90b2NvbAorCisgICAgVGhlIExNVFAgcHJvdG9jb2wsIHdoaWNoIGlzIHZlcnkgc2ltaWxhciB0byBFU01UUCwgaXMgaGVhdmlseSBiYXNlZAorICAgIG9uIHRoZSBzdGFuZGFyZCBTTVRQIGNsaWVudC4gSXQncyBjb21tb24gdG8gdXNlIFVuaXggc29ja2V0cyBmb3IgTE1UUCwKKyAgICBzbyBvdXIgY29ubmVjdCgpIG1ldGhvZCBtdXN0IHN1cHBvcnQgdGhhdCBhcyB3ZWxsIGFzIGEgcmVndWxhcgorICAgIGhvc3Q6cG9ydCBzZXJ2ZXIuIFRvIHNwZWNpZnkgYSBVbml4IHNvY2tldCwgeW91IG11c3QgdXNlIGFuIGFic29sdXRlCisgICAgcGF0aCBhcyB0aGUgaG9zdCwgc3RhcnRpbmcgd2l0aCBhICcvJy4KKworICAgIEF1dGhlbnRpY2F0aW9uIGlzIHN1cHBvcnRlZCwgdXNpbmcgdGhlIHJlZ3VsYXIgU01UUCBtZWNoYW5pc20uIFdoZW4KKyAgICB1c2luZyBhIFVuaXggc29ja2V0LCBMTVRQIGdlbmVyYWxseSBkb24ndCBzdXBwb3J0IG9yIHJlcXVpcmUgYW55CisgICAgYXV0aGVudGljYXRpb24sIGJ1dCB5b3VyIG1pbGVhZ2UgbWlnaHQgdmFyeS4iIiIKKworICAgIGVobG9fbXNnID0gImxobG8iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG9zdD0nJywgcG9ydD1MTVRQX1BPUlQsIGxvY2FsX2hvc3RuYW1lPU5vbmUpOgorICAgICAgICAiIiJJbml0aWFsaXplIGEgbmV3IGluc3RhbmNlLiIiIgorICAgICAgICBTTVRQLl9faW5pdF9fKHNlbGYsIGhvc3QsIHBvcnQsIGxvY2FsX2hvc3RuYW1lKQorCisgICAgZGVmIGNvbm5lY3Qoc2VsZiwgaG9zdD0nbG9jYWxob3N0JywgcG9ydD0wKToKKyAgICAgICAgIiIiQ29ubmVjdCB0byB0aGUgTE1UUCBkYWVtb24sIG9uIGVpdGhlciBhIFVuaXggb3IgYSBUQ1Agc29ja2V0LiIiIgorICAgICAgICBpZiBob3N0WzBdICE9ICcvJzoKKyAgICAgICAgICAgIHJldHVybiBTTVRQLmNvbm5lY3Qoc2VsZiwgaG9zdCwgcG9ydCkKKworICAgICAgICAjIEhhbmRsZSBVbml4LWRvbWFpbiBzb2NrZXRzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBzZWxmLnNvY2suY29ubmVjdChob3N0KQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgICAgICBwcmludD4+c3RkZXJyLCAnY29ubmVjdCBmYWlsOicsIGhvc3QKKyAgICAgICAgICAgIGlmIHNlbGYuc29jazoKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zb2NrID0gTm9uZQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgKGNvZGUsIG1zZykgPSBzZWxmLmdldHJlcGx5KCkKKyAgICAgICAgaWYgc2VsZi5kZWJ1Z2xldmVsID4gMDoKKyAgICAgICAgICAgIHByaW50Pj5zdGRlcnIsICJjb25uZWN0OiIsIG1zZworICAgICAgICByZXR1cm4gKGNvZGUsIG1zZykKKworCisjIFRlc3QgdGhlIHNlbmRtYWlsIG1ldGhvZCwgd2hpY2ggdGVzdHMgbW9zdCBvZiB0aGUgb3RoZXJzLgorIyBOb3RlOiBUaGlzIGFsd2F5cyBzZW5kcyB0byBsb2NhbGhvc3QuCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKworICAgIGRlZiBwcm9tcHQocHJvbXB0KToKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShwcm9tcHQgKyAiOiAiKQorICAgICAgICByZXR1cm4gc3lzLnN0ZGluLnJlYWRsaW5lKCkuc3RyaXAoKQorCisgICAgZnJvbWFkZHIgPSBwcm9tcHQoIkZyb20iKQorICAgIHRvYWRkcnMgPSBwcm9tcHQoIlRvIikuc3BsaXQoJywnKQorICAgIHByaW50ICJFbnRlciBtZXNzYWdlLCBlbmQgd2l0aCBeRDoiCisgICAgbXNnID0gJycKKyAgICB3aGlsZSAxOgorICAgICAgICBsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICBicmVhaworICAgICAgICBtc2cgPSBtc2cgKyBsaW5lCisgICAgcHJpbnQgIk1lc3NhZ2UgbGVuZ3RoIGlzICVkIiAlIGxlbihtc2cpCisKKyAgICBzZXJ2ZXIgPSBTTVRQKCdsb2NhbGhvc3QnKQorICAgIHNlcnZlci5zZXRfZGVidWdsZXZlbCgxKQorICAgIHNlcnZlci5zZW5kbWFpbChmcm9tYWRkciwgdG9hZGRycywgbXNnKQorICAgIHNlcnZlci5xdWl0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc210cGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3NtdHBsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDkzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NtdHBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc210cGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3NtdHBsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNDkzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NtdHBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc25kaGRyLnB5IGIvbGliL3B5dGhvbjIuNy9zbmRoZHIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyZDZiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc25kaGRyLnB5CkBAIC0wLDAgKzEsMjI4IEBACisiIiJSb3V0aW5lcyB0byBoZWxwIHJlY29nbml6aW5nIHNvdW5kIGZpbGVzLgorCitGdW5jdGlvbiB3aGF0aGRyKCkgcmVjb2duaXplcyB2YXJpb3VzIHR5cGVzIG9mIHNvdW5kIGZpbGUgaGVhZGVycy4KK0l0IHVuZGVyc3RhbmRzIGFsbW9zdCBhbGwgaGVhZGVycyB0aGF0IFNPWCBjYW4gZGVjb2RlLgorCitUaGUgcmV0dXJuIHR1cGxlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaXRlbXMsIGluIHRoaXMgb3JkZXI6CistIGZpbGUgdHlwZSAoYXMgU09YIHVuZGVyc3RhbmRzIGl0KQorLSBzYW1wbGluZyByYXRlICgwIGlmIHVua25vd24gb3IgaGFyZCB0byBkZWNvZGUpCistIG51bWJlciBvZiBjaGFubmVscyAoMCBpZiB1bmtub3duIG9yIGhhcmQgdG8gZGVjb2RlKQorLSBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBmaWxlICgtMSBpZiB1bmtub3duIG9yIGhhcmQgdG8gZGVjb2RlKQorLSBudW1iZXIgb2YgYml0cy9zYW1wbGUsIG9yICdVJyBmb3IgVS1MQVcsIG9yICdBJyBmb3IgQS1MQVcKKworSWYgdGhlIGZpbGUgZG9lc24ndCBoYXZlIGEgcmVjb2duaXphYmxlIHR5cGUsIGl0IHJldHVybnMgTm9uZS4KK0lmIHRoZSBmaWxlIGNhbid0IGJlIG9wZW5lZCwgSU9FcnJvciBpcyByYWlzZWQuCisKK1RvIGNvbXB1dGUgdGhlIHRvdGFsIHRpbWUsIGRpdmlkZSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBieSB0aGUKK3NhbXBsaW5nIHJhdGUgKGEgZnJhbWUgY29udGFpbnMgYSBzYW1wbGUgZm9yIGVhY2ggY2hhbm5lbCkuCisKK0Z1bmN0aW9uIHdoYXQoKSBjYWxscyB3aGF0aGRyKCkuICAoSXQgdXNlZCB0byBhbHNvIHVzZSBzb21lCitoZXVyaXN0aWNzIGZvciByYXcgZGF0YSwgYnV0IHRoaXMgZG9lc24ndCB3b3JrIHZlcnkgd2VsbC4pCisKK0ZpbmFsbHksIHRoZSBmdW5jdGlvbiB0ZXN0KCkgaXMgYSBzaW1wbGUgbWFpbiBwcm9ncmFtIHRoYXQgY2FsbHMKK3doYXQoKSBmb3IgYWxsIGZpbGVzIG1lbnRpb25lZCBvbiB0aGUgYXJndW1lbnQgbGlzdC4gIEZvciBkaXJlY3RvcnkKK2FyZ3VtZW50cyBpdCBjYWxscyB3aGF0KCkgZm9yIGFsbCBmaWxlcyBpbiB0aGF0IGRpcmVjdG9yeS4gIERlZmF1bHQKK2FyZ3VtZW50IGlzICIuIiAodGVzdGluZyBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5KS4gIFRoZQorb3B0aW9uIC1yIHRlbGxzIGl0IHRvIHJlY3Vyc2UgZG93biBkaXJlY3RvcmllcyBmb3VuZCBpbnNpZGUKK2V4cGxpY2l0bHkgZ2l2ZW4gZGlyZWN0b3JpZXMuCisiIiIKKworIyBUaGUgZmlsZSBzdHJ1Y3R1cmUgaXMgdG9wLWRvd24gZXhjZXB0IHRoYXQgdGhlIHRlc3QgcHJvZ3JhbSBhbmQgaXRzCisjIHN1YnJvdXRpbmUgY29tZSBsYXN0LgorCitfX2FsbF9fID0gWyJ3aGF0Iiwid2hhdGhkciJdCisKK2RlZiB3aGF0KGZpbGVuYW1lKToKKyAgICAiIiJHdWVzcyB0aGUgdHlwZSBvZiBhIHNvdW5kIGZpbGUiIiIKKyAgICByZXMgPSB3aGF0aGRyKGZpbGVuYW1lKQorICAgIHJldHVybiByZXMKKworCitkZWYgd2hhdGhkcihmaWxlbmFtZSk6CisgICAgIiIiUmVjb2duaXplIHNvdW5kIGhlYWRlcnMiIiIKKyAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3JiJykKKyAgICBoID0gZi5yZWFkKDUxMikKKyAgICBmb3IgdGYgaW4gdGVzdHM6CisgICAgICAgIHJlcyA9IHRmKGgsIGYpCisgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgIHJldHVybiByZXMKKyAgICByZXR1cm4gTm9uZQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKyMgU3Vicm91dGluZXMgcGVyIHNvdW5kIGhlYWRlciB0eXBlICMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKwordGVzdHMgPSBbXQorCitkZWYgdGVzdF9haWZjKGgsIGYpOgorICAgIGltcG9ydCBhaWZjCisgICAgaWYgaFs6NF0gIT0gJ0ZPUk0nOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIGhbODoxMl0gPT0gJ0FJRkMnOgorICAgICAgICBmbXQgPSAnYWlmYycKKyAgICBlbGlmIGhbODoxMl0gPT0gJ0FJRkYnOgorICAgICAgICBmbXQgPSAnYWlmZicKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGYuc2VlaygwKQorICAgIHRyeToKKyAgICAgICAgYSA9IGFpZmMub3BlbmZwKGYsICdyJykKKyAgICBleGNlcHQgKEVPRkVycm9yLCBhaWZjLkVycm9yKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICByZXR1cm4gKGZtdCwgYS5nZXRmcmFtZXJhdGUoKSwgYS5nZXRuY2hhbm5lbHMoKSwgXAorICAgICAgICAgICAgYS5nZXRuZnJhbWVzKCksIDgqYS5nZXRzYW1wd2lkdGgoKSkKKwordGVzdHMuYXBwZW5kKHRlc3RfYWlmYykKKworCitkZWYgdGVzdF9hdShoLCBmKToKKyAgICBpZiBoWzo0XSA9PSAnLnNuZCc6CisgICAgICAgIGYgPSBnZXRfbG9uZ19iZQorICAgIGVsaWYgaFs6NF0gaW4gKCdcMGRzLicsICdkbnMuJyk6CisgICAgICAgIGYgPSBnZXRfbG9uZ19sZQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCisgICAgdHlwZSA9ICdhdScKKyAgICBoZHJfc2l6ZSA9IGYoaFs0OjhdKQorICAgIGRhdGFfc2l6ZSA9IGYoaFs4OjEyXSkKKyAgICBlbmNvZGluZyA9IGYoaFsxMjoxNl0pCisgICAgcmF0ZSA9IGYoaFsxNjoyMF0pCisgICAgbmNoYW5uZWxzID0gZihoWzIwOjI0XSkKKyAgICBzYW1wbGVfc2l6ZSA9IDEgIyBkZWZhdWx0CisgICAgaWYgZW5jb2RpbmcgPT0gMToKKyAgICAgICAgc2FtcGxlX2JpdHMgPSAnVScKKyAgICBlbGlmIGVuY29kaW5nID09IDI6CisgICAgICAgIHNhbXBsZV9iaXRzID0gOAorICAgIGVsaWYgZW5jb2RpbmcgPT0gMzoKKyAgICAgICAgc2FtcGxlX2JpdHMgPSAxNgorICAgICAgICBzYW1wbGVfc2l6ZSA9IDIKKyAgICBlbHNlOgorICAgICAgICBzYW1wbGVfYml0cyA9ICc/JworICAgIGZyYW1lX3NpemUgPSBzYW1wbGVfc2l6ZSAqIG5jaGFubmVscworICAgIHJldHVybiB0eXBlLCByYXRlLCBuY2hhbm5lbHMsIGRhdGFfc2l6ZS8vZnJhbWVfc2l6ZSwgc2FtcGxlX2JpdHMKKwordGVzdHMuYXBwZW5kKHRlc3RfYXUpCisKKworZGVmIHRlc3RfaGNvbShoLCBmKToKKyAgICBpZiBoWzY1OjY5XSAhPSAnRlNTRCcgb3IgaFsxMjg6MTMyXSAhPSAnSENPTSc6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZGl2aXNvciA9IGdldF9sb25nX2JlKGhbMTI4KzE2OjEyOCsyMF0pCisgICAgcmV0dXJuICdoY29tJywgMjIwNTAvL2Rpdmlzb3IsIDEsIC0xLCA4CisKK3Rlc3RzLmFwcGVuZCh0ZXN0X2hjb20pCisKKworZGVmIHRlc3Rfdm9jKGgsIGYpOgorICAgIGlmIGhbOjIwXSAhPSAnQ3JlYXRpdmUgVm9pY2UgRmlsZVwwMzInOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHNic2VlayA9IGdldF9zaG9ydF9sZShoWzIwOjIyXSkKKyAgICByYXRlID0gMAorICAgIGlmIDAgPD0gc2JzZWVrIDwgNTAwIGFuZCBoW3Nic2Vla10gPT0gJ1wxJzoKKyAgICAgICAgcmF0ZWNvZGUgPSBvcmQoaFtzYnNlZWsrNF0pCisgICAgICAgIHJhdGUgPSBpbnQoMTAwMDAwMC4wIC8gKDI1NiAtIHJhdGVjb2RlKSkKKyAgICByZXR1cm4gJ3ZvYycsIHJhdGUsIDEsIC0xLCA4CisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3ZvYykKKworCitkZWYgdGVzdF93YXYoaCwgZik6CisgICAgIyAnUklGRicgPGxlbj4gJ1dBVkUnICdmbXQgJyA8bGVuPgorICAgIGlmIGhbOjRdICE9ICdSSUZGJyBvciBoWzg6MTJdICE9ICdXQVZFJyBvciBoWzEyOjE2XSAhPSAnZm10ICc6CisgICAgICAgIHJldHVybiBOb25lCisgICAgc3R5bGUgPSBnZXRfc2hvcnRfbGUoaFsyMDoyMl0pCisgICAgbmNoYW5uZWxzID0gZ2V0X3Nob3J0X2xlKGhbMjI6MjRdKQorICAgIHJhdGUgPSBnZXRfbG9uZ19sZShoWzI0OjI4XSkKKyAgICBzYW1wbGVfYml0cyA9IGdldF9zaG9ydF9sZShoWzM0OjM2XSkKKyAgICByZXR1cm4gJ3dhdicsIHJhdGUsIG5jaGFubmVscywgLTEsIHNhbXBsZV9iaXRzCisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3dhdikKKworCitkZWYgdGVzdF84c3Z4KGgsIGYpOgorICAgIGlmIGhbOjRdICE9ICdGT1JNJyBvciBoWzg6MTJdICE9ICc4U1ZYJzoKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAjIFNob3VsZCBkZWNvZGUgaXQgdG8gZ2V0ICNjaGFubmVscyAtLSBhc3N1bWUgYWx3YXlzIDEKKyAgICByZXR1cm4gJzhzdngnLCAwLCAxLCAwLCA4CisKK3Rlc3RzLmFwcGVuZCh0ZXN0XzhzdngpCisKKworZGVmIHRlc3Rfc25kdChoLCBmKToKKyAgICBpZiBoWzo1XSA9PSAnU09VTkQnOgorICAgICAgICBuc2FtcGxlcyA9IGdldF9sb25nX2xlKGhbODoxMl0pCisgICAgICAgIHJhdGUgPSBnZXRfc2hvcnRfbGUoaFsyMDoyMl0pCisgICAgICAgIHJldHVybiAnc25kdCcsIHJhdGUsIDEsIG5zYW1wbGVzLCA4CisKK3Rlc3RzLmFwcGVuZCh0ZXN0X3NuZHQpCisKKworZGVmIHRlc3Rfc25kcihoLCBmKToKKyAgICBpZiBoWzoyXSA9PSAnXDBcMCc6CisgICAgICAgIHJhdGUgPSBnZXRfc2hvcnRfbGUoaFsyOjRdKQorICAgICAgICBpZiA0MDAwIDw9IHJhdGUgPD0gMjUwMDA6CisgICAgICAgICAgICByZXR1cm4gJ3NuZHInLCByYXRlLCAxLCAtMSwgOAorCit0ZXN0cy5hcHBlbmQodGVzdF9zbmRyKQorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0jCisjIFN1YnJvdXRpbmVzIHRvIGV4dHJhY3QgbnVtYmVycyBmcm9tIHN0cmluZ3MgIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSMKKworZGVmIGdldF9sb25nX2JlKHMpOgorICAgIHJldHVybiAob3JkKHNbMF0pPDwyNCkgfCAob3JkKHNbMV0pPDwxNikgfCAob3JkKHNbMl0pPDw4KSB8IG9yZChzWzNdKQorCitkZWYgZ2V0X2xvbmdfbGUocyk6CisgICAgcmV0dXJuIChvcmQoc1szXSk8PDI0KSB8IChvcmQoc1syXSk8PDE2KSB8IChvcmQoc1sxXSk8PDgpIHwgb3JkKHNbMF0pCisKK2RlZiBnZXRfc2hvcnRfYmUocyk6CisgICAgcmV0dXJuIChvcmQoc1swXSk8PDgpIHwgb3JkKHNbMV0pCisKK2RlZiBnZXRfc2hvcnRfbGUocyk6CisgICAgcmV0dXJuIChvcmQoc1sxXSk8PDgpIHwgb3JkKHNbMF0pCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tIworIyBTbWFsbCB0ZXN0IHByb2dyYW0gIworIy0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitkZWYgdGVzdCgpOgorICAgIGltcG9ydCBzeXMKKyAgICByZWN1cnNpdmUgPSAwCisgICAgaWYgc3lzLmFyZ3ZbMTpdIGFuZCBzeXMuYXJndlsxXSA9PSAnLXInOgorICAgICAgICBkZWwgc3lzLmFyZ3ZbMToyXQorICAgICAgICByZWN1cnNpdmUgPSAxCisgICAgdHJ5OgorICAgICAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgICAgICB0ZXN0YWxsKHN5cy5hcmd2WzE6XSwgcmVjdXJzaXZlLCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGVzdGFsbChbJy4nXSwgcmVjdXJzaXZlLCAxKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnXG5bSW50ZXJydXB0ZWRdXG4nKQorICAgICAgICBzeXMuZXhpdCgxKQorCitkZWYgdGVzdGFsbChsaXN0LCByZWN1cnNpdmUsIHRvcGxldmVsKToKKyAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IG9zCisgICAgZm9yIGZpbGVuYW1lIGluIGxpc3Q6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgorICAgICAgICAgICAgcHJpbnQgZmlsZW5hbWUgKyAnLzonLAorICAgICAgICAgICAgaWYgcmVjdXJzaXZlIG9yIHRvcGxldmVsOgorICAgICAgICAgICAgICAgIHByaW50ICdyZWN1cnNpbmcgZG93bjonCisgICAgICAgICAgICAgICAgaW1wb3J0IGdsb2IKKyAgICAgICAgICAgICAgICBuYW1lcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZmlsZW5hbWUsICcqJykpCisgICAgICAgICAgICAgICAgdGVzdGFsbChuYW1lcywgcmVjdXJzaXZlLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnKioqIGRpcmVjdG9yeSAodXNlIC1yKSAqKionCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCBmaWxlbmFtZSArICc6JywKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByaW50IHdoYXQoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnKioqIG5vdCBmb3VuZCAqKionCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NuZGhkci5weWMgYi9saWIvcHl0aG9uMi43L3NuZGhkci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkMWVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc25kaGRyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NuZGhkci5weW8gYi9saWIvcHl0aG9uMi43L3NuZGhkci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNkMWVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc25kaGRyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NvY2tldC5weSBiL2xpYi9weXRob24yLjcvc29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYzA0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NvY2tldC5weQpAQCAtMCwwICsxLDU3MyBAQAorIyBXcmFwcGVyIG1vZHVsZSBmb3IgX3NvY2tldCwgcHJvdmlkaW5nIHNvbWUgYWRkaXRpb25hbCBmYWNpbGl0aWVzCisjIGltcGxlbWVudGVkIGluIFB5dGhvbi4KKworIiIiXAorVGhpcyBtb2R1bGUgcHJvdmlkZXMgc29ja2V0IG9wZXJhdGlvbnMgYW5kIHNvbWUgcmVsYXRlZCBmdW5jdGlvbnMuCitPbiBVbml4LCBpdCBzdXBwb3J0cyBJUCAoSW50ZXJuZXQgUHJvdG9jb2wpIGFuZCBVbml4IGRvbWFpbiBzb2NrZXRzLgorT24gb3RoZXIgc3lzdGVtcywgaXQgb25seSBzdXBwb3J0cyBJUC4gRnVuY3Rpb25zIHNwZWNpZmljIGZvciBhCitzb2NrZXQgYXJlIGF2YWlsYWJsZSBhcyBtZXRob2RzIG9mIHRoZSBzb2NrZXQgb2JqZWN0LgorCitGdW5jdGlvbnM6CisKK3NvY2tldCgpIC0tIGNyZWF0ZSBhIG5ldyBzb2NrZXQgb2JqZWN0Citzb2NrZXRwYWlyKCkgLS0gY3JlYXRlIGEgcGFpciBvZiBuZXcgc29ja2V0IG9iamVjdHMgWypdCitmcm9tZmQoKSAtLSBjcmVhdGUgYSBzb2NrZXQgb2JqZWN0IGZyb20gYW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgWypdCitnZXRob3N0bmFtZSgpIC0tIHJldHVybiB0aGUgY3VycmVudCBob3N0bmFtZQorZ2V0aG9zdGJ5bmFtZSgpIC0tIG1hcCBhIGhvc3RuYW1lIHRvIGl0cyBJUCBudW1iZXIKK2dldGhvc3RieWFkZHIoKSAtLSBtYXAgYW4gSVAgbnVtYmVyIG9yIGhvc3RuYW1lIHRvIEROUyBpbmZvCitnZXRzZXJ2YnluYW1lKCkgLS0gbWFwIGEgc2VydmljZSBuYW1lIGFuZCBhIHByb3RvY29sIG5hbWUgdG8gYSBwb3J0IG51bWJlcgorZ2V0cHJvdG9ieW5hbWUoKSAtLSBtYXAgYSBwcm90b2NvbCBuYW1lIChlLmcuICd0Y3AnKSB0byBhIG51bWJlcgorbnRvaHMoKSwgbnRvaGwoKSAtLSBjb252ZXJ0IDE2LCAzMiBiaXQgaW50IGZyb20gbmV0d29yayB0byBob3N0IGJ5dGUgb3JkZXIKK2h0b25zKCksIGh0b25sKCkgLS0gY29udmVydCAxNiwgMzIgYml0IGludCBmcm9tIGhvc3QgdG8gbmV0d29yayBieXRlIG9yZGVyCitpbmV0X2F0b24oKSAtLSBjb252ZXJ0IElQIGFkZHIgc3RyaW5nICgxMjMuNDUuNjcuODkpIHRvIDMyLWJpdCBwYWNrZWQgZm9ybWF0CitpbmV0X250b2EoKSAtLSBjb252ZXJ0IDMyLWJpdCBwYWNrZWQgZm9ybWF0IElQIHRvIHN0cmluZyAoMTIzLjQ1LjY3Ljg5KQorc3NsKCkgLS0gc2VjdXJlIHNvY2tldCBsYXllciBzdXBwb3J0IChvbmx5IGF2YWlsYWJsZSBpZiBjb25maWd1cmVkKQorc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgLS0gZ2V0IHRoZSBkZWZhdWx0IHRpbWVvdXQgdmFsdWUKK3NvY2tldC5zZXRkZWZhdWx0dGltZW91dCgpIC0tIHNldCB0aGUgZGVmYXVsdCB0aW1lb3V0IHZhbHVlCitjcmVhdGVfY29ubmVjdGlvbigpIC0tIGNvbm5lY3RzIHRvIGFuIGFkZHJlc3MsIHdpdGggYW4gb3B0aW9uYWwgdGltZW91dCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgc291cmNlIGFkZHJlc3MuCisKKyBbKl0gbm90IGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zIQorCitTcGVjaWFsIG9iamVjdHM6CisKK1NvY2tldFR5cGUgLS0gdHlwZSBvYmplY3QgZm9yIHNvY2tldCBvYmplY3RzCitlcnJvciAtLSBleGNlcHRpb24gcmFpc2VkIGZvciBJL08gZXJyb3JzCitoYXNfaXB2NiAtLSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgaWYgSVB2NiBpcyBzdXBwb3J0ZWQKKworSW50ZWdlciBjb25zdGFudHM6CisKK0FGX0lORVQsIEFGX1VOSVggLS0gc29ja2V0IGRvbWFpbnMgKGZpcnN0IGFyZ3VtZW50IHRvIHNvY2tldCgpIGNhbGwpCitTT0NLX1NUUkVBTSwgU09DS19ER1JBTSwgU09DS19SQVcgLS0gc29ja2V0IHR5cGVzIChzZWNvbmQgYXJndW1lbnQpCisKK01hbnkgb3RoZXIgY29uc3RhbnRzIG1heSBiZSBkZWZpbmVkOyB0aGVzZSBtYXkgYmUgdXNlZCBpbiBjYWxscyB0bwordGhlIHNldHNvY2tvcHQoKSBhbmQgZ2V0c29ja29wdCgpIG1ldGhvZHMuCisiIiIKKworaW1wb3J0IF9zb2NrZXQKK2Zyb20gX3NvY2tldCBpbXBvcnQgKgorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHBhcnRpYWwKK2Zyb20gdHlwZXMgaW1wb3J0IE1ldGhvZFR5cGUKKwordHJ5OgorICAgIGltcG9ydCBfc3NsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBubyBTU0wgc3VwcG9ydAorICAgIHBhc3MKK2Vsc2U6CisgICAgZGVmIHNzbChzb2NrLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUpOgorICAgICAgICAjIHdlIGRvIGFuIGludGVybmFsIGltcG9ydCBoZXJlIGJlY2F1c2UgdGhlIHNzbAorICAgICAgICAjIG1vZHVsZSBpbXBvcnRzIHRoZSBzb2NrZXQgbW9kdWxlCisgICAgICAgIGltcG9ydCBzc2wgYXMgX3JlYWxzc2wKKyAgICAgICAgd2FybmluZ3Mud2Fybigic29ja2V0LnNzbCgpIGlzIGRlcHJlY2F0ZWQuICBVc2Ugc3NsLndyYXBfc29ja2V0KCkgaW5zdGVhZC4iLAorICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yKQorICAgICAgICByZXR1cm4gX3JlYWxzc2wuc3Nsd3JhcF9zaW1wbGUoc29jaywga2V5ZmlsZSwgY2VydGZpbGUpCisKKyAgICAjIHdlIG5lZWQgdG8gaW1wb3J0IHRoZSBzYW1lIGNvbnN0YW50cyB3ZSB1c2VkIHRvLi4uCisgICAgZnJvbSBfc3NsIGltcG9ydCBTU0xFcnJvciBhcyBzc2xlcnJvcgorICAgIGZyb20gX3NzbCBpbXBvcnQgXAorICAgICAgICAgUkFORF9hZGQsIFwKKyAgICAgICAgIFJBTkRfZWdkLCBcCisgICAgICAgICBSQU5EX3N0YXR1cywgXAorICAgICAgICAgU1NMX0VSUk9SX1pFUk9fUkVUVVJOLCBcCisgICAgICAgICBTU0xfRVJST1JfV0FOVF9SRUFELCBcCisgICAgICAgICBTU0xfRVJST1JfV0FOVF9XUklURSwgXAorICAgICAgICAgU1NMX0VSUk9SX1dBTlRfWDUwOV9MT09LVVAsIFwKKyAgICAgICAgIFNTTF9FUlJPUl9TWVNDQUxMLCBcCisgICAgICAgICBTU0xfRVJST1JfU1NMLCBcCisgICAgICAgICBTU0xfRVJST1JfV0FOVF9DT05ORUNULCBcCisgICAgICAgICBTU0xfRVJST1JfRU9GLCBcCisgICAgICAgICBTU0xfRVJST1JfSU5WQUxJRF9FUlJPUl9DT0RFCisKK2ltcG9ydCBvcywgc3lzLCB3YXJuaW5ncworCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKwordHJ5OgorICAgIGltcG9ydCBlcnJubworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGVycm5vID0gTm9uZQorRUJBREYgPSBnZXRhdHRyKGVycm5vLCAnRUJBREYnLCA5KQorRUlOVFIgPSBnZXRhdHRyKGVycm5vLCAnRUlOVFInLCA0KQorCitfX2FsbF9fID0gWyJnZXRmcWRuIiwgImNyZWF0ZV9jb25uZWN0aW9uIl0KK19fYWxsX18uZXh0ZW5kKG9zLl9nZXRfZXhwb3J0c19saXN0KF9zb2NrZXQpKQorCisKK19yZWFsc29ja2V0ID0gc29ja2V0CisKKyMgV1NBIGVycm9yIGNvZGVzCitpZiBzeXMucGxhdGZvcm0ubG93ZXIoKS5zdGFydHN3aXRoKCJ3aW4iKToKKyAgICBlcnJvclRhYiA9IHt9CisgICAgZXJyb3JUYWJbMTAwMDRdID0gIlRoZSBvcGVyYXRpb24gd2FzIGludGVycnVwdGVkLiIKKyAgICBlcnJvclRhYlsxMDAwOV0gPSAiQSBiYWQgZmlsZSBoYW5kbGUgd2FzIHBhc3NlZC4iCisgICAgZXJyb3JUYWJbMTAwMTNdID0gIlBlcm1pc3Npb24gZGVuaWVkLiIKKyAgICBlcnJvclRhYlsxMDAxNF0gPSAiQSBmYXVsdCBvY2N1cnJlZCBvbiB0aGUgbmV0d29yaz8/IiAjIFdTQUVGQVVMVAorICAgIGVycm9yVGFiWzEwMDIyXSA9ICJBbiBpbnZhbGlkIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkLiIKKyAgICBlcnJvclRhYlsxMDAzNV0gPSAiVGhlIHNvY2tldCBvcGVyYXRpb24gd291bGQgYmxvY2siCisgICAgZXJyb3JUYWJbMTAwMzZdID0gIkEgYmxvY2tpbmcgb3BlcmF0aW9uIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MuIgorICAgIGVycm9yVGFiWzEwMDQ4XSA9ICJUaGUgbmV0d29yayBhZGRyZXNzIGlzIGluIHVzZS4iCisgICAgZXJyb3JUYWJbMTAwNTRdID0gIlRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIHJlc2V0LiIKKyAgICBlcnJvclRhYlsxMDA1OF0gPSAiVGhlIG5ldHdvcmsgaGFzIGJlZW4gc2h1dCBkb3duLiIKKyAgICBlcnJvclRhYlsxMDA2MF0gPSAiVGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQuIgorICAgIGVycm9yVGFiWzEwMDYxXSA9ICJDb25uZWN0aW9uIHJlZnVzZWQuIgorICAgIGVycm9yVGFiWzEwMDYzXSA9ICJUaGUgbmFtZSBpcyB0b28gbG9uZy4iCisgICAgZXJyb3JUYWJbMTAwNjRdID0gIlRoZSBob3N0IGlzIGRvd24uIgorICAgIGVycm9yVGFiWzEwMDY1XSA9ICJUaGUgaG9zdCBpcyB1bnJlYWNoYWJsZS4iCisgICAgX19hbGxfXy5hcHBlbmQoImVycm9yVGFiIikKKworCisKK2RlZiBnZXRmcWRuKG5hbWU9JycpOgorICAgICIiIkdldCBmdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUgZnJvbSBuYW1lLgorCisgICAgQW4gZW1wdHkgYXJndW1lbnQgaXMgaW50ZXJwcmV0ZWQgYXMgbWVhbmluZyB0aGUgbG9jYWwgaG9zdC4KKworICAgIEZpcnN0IHRoZSBob3N0bmFtZSByZXR1cm5lZCBieSBnZXRob3N0YnlhZGRyKCkgaXMgY2hlY2tlZCwgdGhlbgorICAgIHBvc3NpYmx5IGV4aXN0aW5nIGFsaWFzZXMuIEluIGNhc2Ugbm8gRlFETiBpcyBhdmFpbGFibGUsIGhvc3RuYW1lCisgICAgZnJvbSBnZXRob3N0bmFtZSgpIGlzIHJldHVybmVkLgorICAgICIiIgorICAgIG5hbWUgPSBuYW1lLnN0cmlwKCkKKyAgICBpZiBub3QgbmFtZSBvciBuYW1lID09ICcwLjAuMC4wJzoKKyAgICAgICAgbmFtZSA9IGdldGhvc3RuYW1lKCkKKyAgICB0cnk6CisgICAgICAgIGhvc3RuYW1lLCBhbGlhc2VzLCBpcGFkZHJzID0gZ2V0aG9zdGJ5YWRkcihuYW1lKQorICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGFsaWFzZXMuaW5zZXJ0KDAsIGhvc3RuYW1lKQorICAgICAgICBmb3IgbmFtZSBpbiBhbGlhc2VzOgorICAgICAgICAgICAgaWYgJy4nIGluIG5hbWU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSBob3N0bmFtZQorICAgIHJldHVybiBuYW1lCisKKworX3NvY2tldG1ldGhvZHMgPSAoCisgICAgJ2JpbmQnLCAnY29ubmVjdCcsICdjb25uZWN0X2V4JywgJ2ZpbGVubycsICdsaXN0ZW4nLAorICAgICdnZXRwZWVybmFtZScsICdnZXRzb2NrbmFtZScsICdnZXRzb2Nrb3B0JywgJ3NldHNvY2tvcHQnLAorICAgICdzZW5kYWxsJywgJ3NldGJsb2NraW5nJywKKyAgICAnc2V0dGltZW91dCcsICdnZXR0aW1lb3V0JywgJ3NodXRkb3duJykKKworaWYgb3MubmFtZSA9PSAibnQiOgorICAgIF9zb2NrZXRtZXRob2RzID0gX3NvY2tldG1ldGhvZHMgKyAoJ2lvY3RsJywpCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAicmlzY29zIjoKKyAgICBfc29ja2V0bWV0aG9kcyA9IF9zb2NrZXRtZXRob2RzICsgKCdzbGVlcHRhc2t3JywpCisKKyMgQWxsIHRoZSBtZXRob2QgbmFtZXMgdGhhdCBtdXN0IGJlIGRlbGVnYXRlZCB0byBlaXRoZXIgdGhlIHJlYWwgc29ja2V0CisjIG9iamVjdCBvciB0aGUgX2Nsb3NlZHNvY2tldCBvYmplY3QuCitfZGVsZWdhdGVfbWV0aG9kcyA9ICgicmVjdiIsICJyZWN2ZnJvbSIsICJyZWN2X2ludG8iLCAicmVjdmZyb21faW50byIsCisgICAgICAgICAgICAgICAgICAgICAic2VuZCIsICJzZW5kdG8iKQorCitjbGFzcyBfY2xvc2Vkc29ja2V0KG9iamVjdCk6CisgICAgX19zbG90c19fID0gW10KKyAgICBkZWYgX2R1bW15KCphcmdzKToKKyAgICAgICAgcmFpc2UgZXJyb3IoRUJBREYsICdCYWQgZmlsZSBkZXNjcmlwdG9yJykKKyAgICAjIEFsbCBfZGVsZWdhdGVfbWV0aG9kcyBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQgaGVyZS4KKyAgICBzZW5kID0gcmVjdiA9IHJlY3ZfaW50byA9IHNlbmR0byA9IHJlY3Zmcm9tID0gcmVjdmZyb21faW50byA9IF9kdW1teQorICAgIF9fZ2V0YXR0cl9fID0gX2R1bW15CisKKyMgV3JhcHBlciBhcm91bmQgcGxhdGZvcm0gc29ja2V0IG9iamVjdHMuIFRoaXMgaW1wbGVtZW50cworIyBhIHBsYXRmb3JtLWluZGVwZW5kZW50IGR1cCgpIGZ1bmN0aW9uYWxpdHkuIFRoZQorIyBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgcmVsaWVzIG9uIHJlZmVyZW5jZSBjb3VudGluZworIyB0byBjbG9zZSB0aGUgdW5kZXJseWluZyBzb2NrZXQgb2JqZWN0LgorY2xhc3MgX3NvY2tldG9iamVjdChvYmplY3QpOgorCisgICAgX19kb2NfXyA9IF9yZWFsc29ja2V0Ll9fZG9jX18KKworICAgIF9fc2xvdHNfXyA9IFsiX3NvY2siLCAiX193ZWFrcmVmX18iXSArIGxpc3QoX2RlbGVnYXRlX21ldGhvZHMpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmFtaWx5PUFGX0lORVQsIHR5cGU9U09DS19TVFJFQU0sIHByb3RvPTAsIF9zb2NrPU5vbmUpOgorICAgICAgICBpZiBfc29jayBpcyBOb25lOgorICAgICAgICAgICAgX3NvY2sgPSBfcmVhbHNvY2tldChmYW1pbHksIHR5cGUsIHByb3RvKQorICAgICAgICBzZWxmLl9zb2NrID0gX3NvY2sKKyAgICAgICAgZm9yIG1ldGhvZCBpbiBfZGVsZWdhdGVfbWV0aG9kczoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbWV0aG9kLCBnZXRhdHRyKF9zb2NrLCBtZXRob2QpKQorCisgICAgZGVmIGNsb3NlKHNlbGYsIF9jbG9zZWRzb2NrZXQ9X2Nsb3NlZHNvY2tldCwKKyAgICAgICAgICAgICAgX2RlbGVnYXRlX21ldGhvZHM9X2RlbGVnYXRlX21ldGhvZHMsIHNldGF0dHI9c2V0YXR0cik6CisgICAgICAgICMgVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IHJlZmVyZW5jZSBhbnkgZ2xvYmFscy4gU2VlIGlzc3VlICM4MDgxNjQuCisgICAgICAgIHNlbGYuX3NvY2sgPSBfY2xvc2Vkc29ja2V0KCkKKyAgICAgICAgZHVtbXkgPSBzZWxmLl9zb2NrLl9kdW1teQorICAgICAgICBmb3IgbWV0aG9kIGluIF9kZWxlZ2F0ZV9tZXRob2RzOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtZXRob2QsIGR1bW15KQorICAgIGNsb3NlLl9fZG9jX18gPSBfcmVhbHNvY2tldC5jbG9zZS5fX2RvY19fCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorICAgICAgICBzb2NrLCBhZGRyID0gc2VsZi5fc29jay5hY2NlcHQoKQorICAgICAgICByZXR1cm4gX3NvY2tldG9iamVjdChfc29jaz1zb2NrKSwgYWRkcgorICAgIGFjY2VwdC5fX2RvY19fID0gX3JlYWxzb2NrZXQuYWNjZXB0Ll9fZG9jX18KKworICAgIGRlZiBkdXAoc2VsZik6CisgICAgICAgICIiImR1cCgpIC0+IHNvY2tldCBvYmplY3QKKworICAgICAgICBSZXR1cm4gYSBuZXcgc29ja2V0IG9iamVjdCBjb25uZWN0ZWQgdG8gdGhlIHNhbWUgc3lzdGVtIHJlc291cmNlLiIiIgorICAgICAgICByZXR1cm4gX3NvY2tldG9iamVjdChfc29jaz1zZWxmLl9zb2NrKQorCisgICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGU9J3InLCBidWZzaXplPS0xKToKKyAgICAgICAgIiIibWFrZWZpbGUoW21vZGVbLCBidWZzaXplXV0pIC0+IGZpbGUgb2JqZWN0CisKKyAgICAgICAgUmV0dXJuIGEgcmVndWxhciBmaWxlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzb2NrZXQuICBUaGUgbW9kZQorICAgICAgICBhbmQgYnVmc2l6ZSBhcmd1bWVudHMgYXJlIGFzIGZvciB0aGUgYnVpbHQtaW4gb3BlbigpIGZ1bmN0aW9uLiIiIgorICAgICAgICByZXR1cm4gX2ZpbGVvYmplY3Qoc2VsZi5fc29jaywgbW9kZSwgYnVmc2l6ZSkKKworICAgIGZhbWlseSA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9zb2NrLmZhbWlseSwgZG9jPSJ0aGUgc29ja2V0IGZhbWlseSIpCisgICAgdHlwZSA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9zb2NrLnR5cGUsIGRvYz0idGhlIHNvY2tldCB0eXBlIikKKyAgICBwcm90byA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9zb2NrLnByb3RvLCBkb2M9InRoZSBzb2NrZXQgcHJvdG9jb2wiKQorCitkZWYgbWV0aChuYW1lLHNlbGYsKmFyZ3MpOgorICAgIHJldHVybiBnZXRhdHRyKHNlbGYuX3NvY2ssbmFtZSkoKmFyZ3MpCisKK2ZvciBfbSBpbiBfc29ja2V0bWV0aG9kczoKKyAgICBwID0gcGFydGlhbChtZXRoLF9tKQorICAgIHAuX19uYW1lX18gPSBfbQorICAgIHAuX19kb2NfXyA9IGdldGF0dHIoX3JlYWxzb2NrZXQsX20pLl9fZG9jX18KKyAgICBtID0gTWV0aG9kVHlwZShwLE5vbmUsX3NvY2tldG9iamVjdCkKKyAgICBzZXRhdHRyKF9zb2NrZXRvYmplY3QsX20sbSkKKworc29ja2V0ID0gU29ja2V0VHlwZSA9IF9zb2NrZXRvYmplY3QKKworY2xhc3MgX2ZpbGVvYmplY3Qob2JqZWN0KToKKyAgICAiIiJGYXV4IGZpbGUgb2JqZWN0IGF0dGFjaGVkIHRvIGEgc29ja2V0IG9iamVjdC4iIiIKKworICAgIGRlZmF1bHRfYnVmc2l6ZSA9IDgxOTIKKyAgICBuYW1lID0gIjxzb2NrZXQ+IgorCisgICAgX19zbG90c19fID0gWyJtb2RlIiwgImJ1ZnNpemUiLCAic29mdHNwYWNlIiwKKyAgICAgICAgICAgICAgICAgIyAiY2xvc2VkIiBpcyBhIHByb3BlcnR5LCBzZWUgYmVsb3cKKyAgICAgICAgICAgICAgICAgIl9zb2NrIiwgIl9yYnVmc2l6ZSIsICJfd2J1ZnNpemUiLCAiX3JidWYiLCAiX3didWYiLCAiX3didWZfbGVuIiwKKyAgICAgICAgICAgICAgICAgIl9jbG9zZSJdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29jaywgbW9kZT0ncmInLCBidWZzaXplPS0xLCBjbG9zZT1GYWxzZSk6CisgICAgICAgIHNlbGYuX3NvY2sgPSBzb2NrCisgICAgICAgIHNlbGYubW9kZSA9IG1vZGUgIyBOb3QgYWN0dWFsbHkgdXNlZCBpbiB0aGlzIHZlcnNpb24KKyAgICAgICAgaWYgYnVmc2l6ZSA8IDA6CisgICAgICAgICAgICBidWZzaXplID0gc2VsZi5kZWZhdWx0X2J1ZnNpemUKKyAgICAgICAgc2VsZi5idWZzaXplID0gYnVmc2l6ZQorICAgICAgICBzZWxmLnNvZnRzcGFjZSA9IEZhbHNlCisgICAgICAgICMgX3JidWZzaXplIGlzIHRoZSBzdWdnZXN0ZWQgcmVjdiBidWZmZXIgc2l6ZS4gIEl0IGlzICpzdHJpY3RseSoKKyAgICAgICAgIyBvYmV5ZWQgd2l0aGluIHJlYWRsaW5lKCkgZm9yIHJlY3YgY2FsbHMuICBJZiBpdCBpcyBsYXJnZXIgdGhhbgorICAgICAgICAjIGRlZmF1bHRfYnVmc2l6ZSBpdCB3aWxsIGJlIHVzZWQgZm9yIHJlY3YgY2FsbHMgd2l0aGluIHJlYWQoKS4KKyAgICAgICAgaWYgYnVmc2l6ZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5fcmJ1ZnNpemUgPSAxCisgICAgICAgIGVsaWYgYnVmc2l6ZSA9PSAxOgorICAgICAgICAgICAgc2VsZi5fcmJ1ZnNpemUgPSBzZWxmLmRlZmF1bHRfYnVmc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fcmJ1ZnNpemUgPSBidWZzaXplCisgICAgICAgIHNlbGYuX3didWZzaXplID0gYnVmc2l6ZQorICAgICAgICAjIFdlIHVzZSBTdHJpbmdJTyBmb3IgdGhlIHJlYWQgYnVmZmVyIHRvIGF2b2lkIGhvbGRpbmcgYSBsaXN0CisgICAgICAgICMgb2YgdmFyaW91c2x5IHNpemVkIHN0cmluZyBvYmplY3RzIHdoaWNoIGhhdmUgYmVlbiBrbm93biB0bworICAgICAgICAjIGZyYWdtZW50IHRoZSBoZWFwIGR1ZSB0byBob3cgdGhleSBhcmUgbWFsbG9jKCllZCBhbmQgb2Z0ZW4KKyAgICAgICAgIyByZWFsbG9jKCllZCBkb3duIG11Y2ggc21hbGxlciB0aGFuIHRoZWlyIG9yaWdpbmFsIGFsbG9jYXRpb24uCisgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuX3didWYgPSBbXSAjIEEgbGlzdCBvZiBzdHJpbmdzCisgICAgICAgIHNlbGYuX3didWZfbGVuID0gMAorICAgICAgICBzZWxmLl9jbG9zZSA9IGNsb3NlCisKKyAgICBkZWYgX2dldGNsb3NlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2sgaXMgTm9uZQorICAgIGNsb3NlZCA9IHByb3BlcnR5KF9nZXRjbG9zZWQsIGRvYz0iVHJ1ZSBpZiB0aGUgZmlsZSBpcyBjbG9zZWQiKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzZWxmLl9zb2NrOgorICAgICAgICAgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgc2VsZi5fY2xvc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fc29jay5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9zb2NrID0gTm9uZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAjIGNsb3NlKCkgbWF5IGZhaWwgaWYgX19pbml0X18gZGlkbid0IGNvbXBsZXRlCisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3didWY6CisgICAgICAgICAgICBkYXRhID0gIiIuam9pbihzZWxmLl93YnVmKQorICAgICAgICAgICAgc2VsZi5fd2J1ZiA9IFtdCisgICAgICAgICAgICBzZWxmLl93YnVmX2xlbiA9IDAKKyAgICAgICAgICAgIGJ1ZmZlcl9zaXplID0gbWF4KHNlbGYuX3JidWZzaXplLCBzZWxmLmRlZmF1bHRfYnVmc2l6ZSkKKyAgICAgICAgICAgIGRhdGFfc2l6ZSA9IGxlbihkYXRhKQorICAgICAgICAgICAgd3JpdGVfb2Zmc2V0ID0gMAorICAgICAgICAgICAgdmlldyA9IG1lbW9yeXZpZXcoZGF0YSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSB3cml0ZV9vZmZzZXQgPCBkYXRhX3NpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NvY2suc2VuZGFsbCh2aWV3W3dyaXRlX29mZnNldDp3cml0ZV9vZmZzZXQrYnVmZmVyX3NpemVdKQorICAgICAgICAgICAgICAgICAgICB3cml0ZV9vZmZzZXQgKz0gYnVmZmVyX3NpemUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgd3JpdGVfb2Zmc2V0IDwgZGF0YV9zaXplOgorICAgICAgICAgICAgICAgICAgICByZW1haW5kZXIgPSBkYXRhW3dyaXRlX29mZnNldDpdCisgICAgICAgICAgICAgICAgICAgIGRlbCB2aWV3LCBkYXRhICAjIGV4cGxpY2l0IGZyZWUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd2J1Zi5hcHBlbmQocmVtYWluZGVyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl93YnVmX2xlbiA9IGxlbihyZW1haW5kZXIpCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc29jay5maWxlbm8oKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBkYXRhID0gc3RyKGRhdGEpICMgWFhYIFNob3VsZCByZWFsbHkgcmVqZWN0IG5vbi1zdHJpbmcgbm9uLWJ1ZmZlcnMKKyAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fd2J1Zi5hcHBlbmQoZGF0YSkKKyAgICAgICAgc2VsZi5fd2J1Zl9sZW4gKz0gbGVuKGRhdGEpCisgICAgICAgIGlmIChzZWxmLl93YnVmc2l6ZSA9PSAwIG9yCisgICAgICAgICAgICAoc2VsZi5fd2J1ZnNpemUgPT0gMSBhbmQgJ1xuJyBpbiBkYXRhKSBvcgorICAgICAgICAgICAgKHNlbGYuX3didWZzaXplID4gMSBhbmQgc2VsZi5fd2J1Zl9sZW4gPj0gc2VsZi5fd2J1ZnNpemUpKToKKyAgICAgICAgICAgIHNlbGYuZmx1c2goKQorCisgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgbGlzdCk6CisgICAgICAgICMgWFhYIFdlIGNvdWxkIGRvIGJldHRlciBoZXJlIGZvciB2ZXJ5IGxvbmcgbGlzdHMKKyAgICAgICAgIyBYWFggU2hvdWxkIHJlYWxseSByZWplY3Qgbm9uLXN0cmluZyBub24tYnVmZmVycworICAgICAgICBsaW5lcyA9IGZpbHRlcihOb25lLCBtYXAoc3RyLCBsaXN0KSkKKyAgICAgICAgc2VsZi5fd2J1Zl9sZW4gKz0gc3VtKG1hcChsZW4sIGxpbmVzKSkKKyAgICAgICAgc2VsZi5fd2J1Zi5leHRlbmQobGluZXMpCisgICAgICAgIGlmIChzZWxmLl93YnVmc2l6ZSA8PSAxIG9yCisgICAgICAgICAgICBzZWxmLl93YnVmX2xlbiA+PSBzZWxmLl93YnVmc2l6ZSk6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9LTEpOgorICAgICAgICAjIFVzZSBtYXgsIGRpc2FsbG93IHRpbnkgcmVhZHMgaW4gYSBsb29wIGFzIHRoZXkgYXJlIHZlcnkgaW5lZmZpY2llbnQuCisgICAgICAgICMgV2UgbmV2ZXIgbGVhdmUgcmVhZCgpIHdpdGggYW55IGxlZnRvdmVyIGRhdGEgZnJvbSBhIG5ldyByZWN2KCkgY2FsbAorICAgICAgICAjIGluIG91ciBpbnRlcm5hbCBidWZmZXIuCisgICAgICAgIHJidWZzaXplID0gbWF4KHNlbGYuX3JidWZzaXplLCBzZWxmLmRlZmF1bHRfYnVmc2l6ZSkKKyAgICAgICAgIyBPdXIgdXNlIG9mIFN0cmluZ0lPIHJhdGhlciB0aGFuIGxpc3RzIG9mIHN0cmluZyBvYmplY3RzIHJldHVybmVkIGJ5CisgICAgICAgICMgcmVjdigpIG1pbmltaXplcyBtZW1vcnkgdXNhZ2UgYW5kIGZyYWdtZW50YXRpb24gdGhhdCBvY2N1cnMgd2hlbgorICAgICAgICAjIHJidWZzaXplIGlzIGxhcmdlIGNvbXBhcmVkIHRvIHRoZSB0eXBpY2FsIHJldHVybiB2YWx1ZSBvZiByZWN2KCkuCisgICAgICAgIGJ1ZiA9IHNlbGYuX3JidWYKKyAgICAgICAgYnVmLnNlZWsoMCwgMikgICMgc2VlayBlbmQKKyAgICAgICAgaWYgc2l6ZSA8IDA6CisgICAgICAgICAgICAjIFJlYWQgdW50aWwgRU9GCisgICAgICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKSAgIyByZXNldCBfcmJ1Zi4gIHdlIGNvbnN1bWUgaXQgdmlhIGJ1Zi4KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fc29jay5yZWN2KHJidWZzaXplKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBlcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdID09IEVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBidWYuZ2V0dmFsdWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSZWFkIHVudGlsIHNpemUgYnl0ZXMgb3IgRU9GIHNlZW4sIHdoaWNoZXZlciBjb21lcyBmaXJzdAorICAgICAgICAgICAgYnVmX2xlbiA9IGJ1Zi50ZWxsKCkKKyAgICAgICAgICAgIGlmIGJ1Zl9sZW4gPj0gc2l6ZToKKyAgICAgICAgICAgICAgICAjIEFscmVhZHkgaGF2ZSBzaXplIGJ5dGVzIGluIG91ciBidWZmZXI/ICBFeHRyYWN0IGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgYnVmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBydiA9IGJ1Zi5yZWFkKHNpemUpCisgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9yYnVmLndyaXRlKGJ1Zi5yZWFkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJ2CisKKyAgICAgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpICAjIHJlc2V0IF9yYnVmLiAgd2UgY29uc3VtZSBpdCB2aWEgYnVmLgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBsZWZ0ID0gc2l6ZSAtIGJ1Zl9sZW4KKyAgICAgICAgICAgICAgICAjIHJlY3YoKSB3aWxsIG1hbGxvYyB0aGUgYW1vdW50IG9mIG1lbW9yeSBnaXZlbiBhcyBpdHMKKyAgICAgICAgICAgICAgICAjIHBhcmFtZXRlciBldmVuIHRob3VnaCBpdCBvZnRlbiByZXR1cm5zIG11Y2ggbGVzcyBkYXRhCisgICAgICAgICAgICAgICAgIyB0aGFuIHRoYXQuICBUaGUgcmV0dXJuZWQgZGF0YSBzdHJpbmcgaXMgc2hvcnQgbGl2ZWQKKyAgICAgICAgICAgICAgICAjIGFzIHdlIGNvcHkgaXQgaW50byBhIFN0cmluZ0lPIGFuZCBmcmVlIGl0LiAgVGhpcyBhdm9pZHMKKyAgICAgICAgICAgICAgICAjIGZyYWdtZW50YXRpb24gaXNzdWVzIG9uIG1hbnkgcGxhdGZvcm1zLgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHNlbGYuX3NvY2sucmVjdihsZWZ0KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBlcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdID09IEVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBuID0gbGVuKGRhdGEpCisgICAgICAgICAgICAgICAgaWYgbiA9PSBzaXplIGFuZCBub3QgYnVmX2xlbjoKKyAgICAgICAgICAgICAgICAgICAgIyBTaG9ydGN1dC4gIEF2b2lkIGJ1ZmZlciBkYXRhIGNvcGllcyB3aGVuOgorICAgICAgICAgICAgICAgICAgICAjIC0gV2UgaGF2ZSBubyBkYXRhIGluIG91ciBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgICMgQU5ECisgICAgICAgICAgICAgICAgICAgICMgLSBPdXIgY2FsbCB0byByZWN2IHJldHVybmVkIGV4YWN0bHkgdGhlCisgICAgICAgICAgICAgICAgICAgICMgICBudW1iZXIgb2YgYnl0ZXMgd2Ugd2VyZSBhc2tlZCB0byByZWFkLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICAgICAgICAgIGlmIG4gPT0gbGVmdDoKKyAgICAgICAgICAgICAgICAgICAgYnVmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGRlbCBkYXRhICAjIGV4cGxpY2l0IGZyZWUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBhc3NlcnQgbiA8PSBsZWZ0LCAicmVjdiglZCkgcmV0dXJuZWQgJWQgYnl0ZXMiICUgKGxlZnQsIG4pCisgICAgICAgICAgICAgICAgYnVmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgYnVmX2xlbiArPSBuCisgICAgICAgICAgICAgICAgZGVsIGRhdGEgICMgZXhwbGljaXQgZnJlZQorICAgICAgICAgICAgICAgICNhc3NlcnQgYnVmX2xlbiA9PSBidWYudGVsbCgpCisgICAgICAgICAgICByZXR1cm4gYnVmLmdldHZhbHVlKCkKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKKyAgICAgICAgYnVmID0gc2VsZi5fcmJ1ZgorICAgICAgICBidWYuc2VlaygwLCAyKSAgIyBzZWVrIGVuZAorICAgICAgICBpZiBidWYudGVsbCgpID4gMDoKKyAgICAgICAgICAgICMgY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBidWZmZXIKKyAgICAgICAgICAgIGJ1Zi5zZWVrKDApCisgICAgICAgICAgICBibGluZSA9IGJ1Zi5yZWFkbGluZShzaXplKQorICAgICAgICAgICAgaWYgYmxpbmUuZW5kc3dpdGgoJ1xuJykgb3IgbGVuKGJsaW5lKSA9PSBzaXplOgorICAgICAgICAgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAgICAgc2VsZi5fcmJ1Zi53cml0ZShidWYucmVhZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBibGluZQorICAgICAgICAgICAgZGVsIGJsaW5lCisgICAgICAgIGlmIHNpemUgPCAwOgorICAgICAgICAgICAgIyBSZWFkIHVudGlsIFxuIG9yIEVPRiwgd2hpY2hldmVyIGNvbWVzIGZpcnN0CisgICAgICAgICAgICBpZiBzZWxmLl9yYnVmc2l6ZSA8PSAxOgorICAgICAgICAgICAgICAgICMgU3BlZWQgdXAgdW5idWZmZXJlZCBjYXNlCisgICAgICAgICAgICAgICAgYnVmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBidWZmZXJzID0gW2J1Zi5yZWFkKCldCisgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkgICMgcmVzZXQgX3JidWYuICB3ZSBjb25zdW1lIGl0IHZpYSBidWYuCisgICAgICAgICAgICAgICAgZGF0YSA9IE5vbmUKKyAgICAgICAgICAgICAgICByZWN2ID0gc2VsZi5fc29jay5yZWN2CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgZGF0YSAhPSAiXG4iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByZWN2KDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVycy5hcHBlbmQoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgdHJ5Li5leGNlcHQgdG8gY2F0Y2ggRUlOVFIgd2FzIG1vdmVkIG91dHNpZGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAjIHJlY3YgbG9vcCB0byBhdm9pZCB0aGUgcGVyIGJ5dGUgb3ZlcmhlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgcmV0dXJuICIiLmpvaW4oYnVmZmVycykKKworICAgICAgICAgICAgYnVmLnNlZWsoMCwgMikgICMgc2VlayBlbmQKKyAgICAgICAgICAgIHNlbGYuX3JidWYgPSBTdHJpbmdJTygpICAjIHJlc2V0IF9yYnVmLiAgd2UgY29uc3VtZSBpdCB2aWEgYnVmLgorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9zb2NrLnJlY3Yoc2VsZi5fcmJ1ZnNpemUpCisgICAgICAgICAgICAgICAgZXhjZXB0IGVycm9yLCBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gPT0gRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIG5sID0gZGF0YS5maW5kKCdcbicpCisgICAgICAgICAgICAgICAgaWYgbmwgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgbmwgKz0gMQorICAgICAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YVs6bmxdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yYnVmLndyaXRlKGRhdGFbbmw6XSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBidWYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHJldHVybiBidWYuZ2V0dmFsdWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBSZWFkIHVudGlsIHNpemUgYnl0ZXMgb3IgXG4gb3IgRU9GIHNlZW4sIHdoaWNoZXZlciBjb21lcyBmaXJzdAorICAgICAgICAgICAgYnVmLnNlZWsoMCwgMikgICMgc2VlayBlbmQKKyAgICAgICAgICAgIGJ1Zl9sZW4gPSBidWYudGVsbCgpCisgICAgICAgICAgICBpZiBidWZfbGVuID49IHNpemU6CisgICAgICAgICAgICAgICAgYnVmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBydiA9IGJ1Zi5yZWFkKHNpemUpCisgICAgICAgICAgICAgICAgc2VsZi5fcmJ1ZiA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9yYnVmLndyaXRlKGJ1Zi5yZWFkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJ2CisgICAgICAgICAgICBzZWxmLl9yYnVmID0gU3RyaW5nSU8oKSAgIyByZXNldCBfcmJ1Zi4gIHdlIGNvbnN1bWUgaXQgdmlhIGJ1Zi4KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fc29jay5yZWN2KHNlbGYuX3JidWZzaXplKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBlcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdID09IEVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gc2l6ZSAtIGJ1Zl9sZW4KKyAgICAgICAgICAgICAgICAjIGRpZCB3ZSBqdXN0IHJlY2VpdmUgYSBuZXdsaW5lPworICAgICAgICAgICAgICAgIG5sID0gZGF0YS5maW5kKCdcbicsIDAsIGxlZnQpCisgICAgICAgICAgICAgICAgaWYgbmwgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgbmwgKz0gMQorICAgICAgICAgICAgICAgICAgICAjIHNhdmUgdGhlIGV4Y2VzcyBkYXRhIHRvIF9yYnVmCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JidWYud3JpdGUoZGF0YVtubDpdKQorICAgICAgICAgICAgICAgICAgICBpZiBidWZfbGVuOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmLndyaXRlKGRhdGFbOm5sXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNob3J0Y3V0LiAgQXZvaWQgZGF0YSBjb3B5IHRocm91Z2ggYnVmIHdoZW4gcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAjIGEgc3Vic3RyaW5nIG9mIG91ciBmaXJzdCByZWN2KCkuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVs6bmxdCisgICAgICAgICAgICAgICAgbiA9IGxlbihkYXRhKQorICAgICAgICAgICAgICAgIGlmIG4gPT0gc2l6ZSBhbmQgbm90IGJ1Zl9sZW46CisgICAgICAgICAgICAgICAgICAgICMgU2hvcnRjdXQuICBBdm9pZCBkYXRhIGNvcHkgdGhyb3VnaCBidWYgd2hlbgorICAgICAgICAgICAgICAgICAgICAjIHJldHVybmluZyBleGFjdGx5IGFsbCBvZiBvdXIgZmlyc3QgcmVjdigpLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICAgICAgICAgIGlmIG4gPj0gbGVmdDoKKyAgICAgICAgICAgICAgICAgICAgYnVmLndyaXRlKGRhdGFbOmxlZnRdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9yYnVmLndyaXRlKGRhdGFbbGVmdDpdKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGJ1Zi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGJ1Zl9sZW4gKz0gbgorICAgICAgICAgICAgICAgICNhc3NlcnQgYnVmX2xlbiA9PSBidWYudGVsbCgpCisgICAgICAgICAgICByZXR1cm4gYnVmLmdldHZhbHVlKCkKKworICAgIGRlZiByZWFkbGluZXMoc2VsZiwgc2l6ZWhpbnQ9MCk6CisgICAgICAgIHRvdGFsID0gMAorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBsaXN0LmFwcGVuZChsaW5lKQorICAgICAgICAgICAgdG90YWwgKz0gbGVuKGxpbmUpCisgICAgICAgICAgICBpZiBzaXplaGludCBhbmQgdG90YWwgPj0gc2l6ZWhpbnQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgcmV0dXJuIGxpc3QKKworICAgICMgSXRlcmF0b3IgcHJvdG9jb2xzCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmV0dXJuIGxpbmUKKworX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQgPSBvYmplY3QoKQorCitkZWYgY3JlYXRlX2Nvbm5lY3Rpb24oYWRkcmVzcywgdGltZW91dD1fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz1Ob25lKToKKyAgICAiIiJDb25uZWN0IHRvICphZGRyZXNzKiBhbmQgcmV0dXJuIHRoZSBzb2NrZXQgb2JqZWN0LgorCisgICAgQ29udmVuaWVuY2UgZnVuY3Rpb24uICBDb25uZWN0IHRvICphZGRyZXNzKiAoYSAyLXR1cGxlIGBgKGhvc3QsCisgICAgcG9ydClgYCkgYW5kIHJldHVybiB0aGUgc29ja2V0IG9iamVjdC4gIFBhc3NpbmcgdGhlIG9wdGlvbmFsCisgICAgKnRpbWVvdXQqIHBhcmFtZXRlciB3aWxsIHNldCB0aGUgdGltZW91dCBvbiB0aGUgc29ja2V0IGluc3RhbmNlCisgICAgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY29ubmVjdC4gIElmIG5vICp0aW1lb3V0KiBpcyBzdXBwbGllZCwgdGhlCisgICAgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBzZXR0aW5nIHJldHVybmVkIGJ5IDpmdW5jOmBnZXRkZWZhdWx0dGltZW91dGAKKyAgICBpcyB1c2VkLiAgSWYgKnNvdXJjZV9hZGRyZXNzKiBpcyBzZXQgaXQgbXVzdCBiZSBhIHR1cGxlIG9mIChob3N0LCBwb3J0KQorICAgIGZvciB0aGUgc29ja2V0IHRvIGJpbmQgYXMgYSBzb3VyY2UgYWRkcmVzcyBiZWZvcmUgbWFraW5nIHRoZSBjb25uZWN0aW9uLgorICAgIEFuIGhvc3Qgb2YgJycgb3IgcG9ydCAwIHRlbGxzIHRoZSBPUyB0byB1c2UgdGhlIGRlZmF1bHQuCisgICAgIiIiCisKKyAgICBob3N0LCBwb3J0ID0gYWRkcmVzcworICAgIGVyciA9IE5vbmUKKyAgICBmb3IgcmVzIGluIGdldGFkZHJpbmZvKGhvc3QsIHBvcnQsIDAsIFNPQ0tfU1RSRUFNKToKKyAgICAgICAgYWYsIHNvY2t0eXBlLCBwcm90bywgY2Fub25uYW1lLCBzYSA9IHJlcworICAgICAgICBzb2NrID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb2NrID0gc29ja2V0KGFmLCBzb2NrdHlwZSwgcHJvdG8pCisgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBfR0xPQkFMX0RFRkFVTFRfVElNRU9VVDoKKyAgICAgICAgICAgICAgICBzb2NrLnNldHRpbWVvdXQodGltZW91dCkKKyAgICAgICAgICAgIGlmIHNvdXJjZV9hZGRyZXNzOgorICAgICAgICAgICAgICAgIHNvY2suYmluZChzb3VyY2VfYWRkcmVzcykKKyAgICAgICAgICAgIHNvY2suY29ubmVjdChzYSkKKyAgICAgICAgICAgIHJldHVybiBzb2NrCisKKyAgICAgICAgZXhjZXB0IGVycm9yIGFzIF86CisgICAgICAgICAgICBlcnIgPSBfCisgICAgICAgICAgICBpZiBzb2NrIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNvY2suY2xvc2UoKQorCisgICAgaWYgZXJyIGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBlcnIKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBlcnJvcigiZ2V0YWRkcmluZm8gcmV0dXJucyBhbiBlbXB0eSBsaXN0IikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc29ja2V0LnB5YyBiL2xpYi9weXRob24yLjcvc29ja2V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDdiNjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zb2NrZXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc29ja2V0LnB5byBiL2xpYi9weXRob24yLjcvc29ja2V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODEyYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zb2NrZXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWVmMmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjQgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvX19pbml0X18ucHk6IHRoZSBweXNxbGl0ZTIgcGFja2FnZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitmcm9tIGRiYXBpMiBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhZjJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJhZjJjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL2RiYXBpMi5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBhNzk4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHkKQEAgLTAsMCArMSw4OCBAQAorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvZGJhcGkyLnB5OiB0aGUgREItQVBJIDIuMCBpbnRlcmZhY2UKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBkYXRldGltZQoraW1wb3J0IHRpbWUKKworZnJvbSBfc3FsaXRlMyBpbXBvcnQgKgorCitwYXJhbXN0eWxlID0gInFtYXJrIgorCit0aHJlYWRzYWZldHkgPSAxCisKK2FwaWxldmVsID0gIjIuMCIKKworRGF0ZSA9IGRhdGV0aW1lLmRhdGUKKworVGltZSA9IGRhdGV0aW1lLnRpbWUKKworVGltZXN0YW1wID0gZGF0ZXRpbWUuZGF0ZXRpbWUKKworZGVmIERhdGVGcm9tVGlja3ModGlja3MpOgorICAgIHJldHVybiBEYXRlKCp0aW1lLmxvY2FsdGltZSh0aWNrcylbOjNdKQorCitkZWYgVGltZUZyb21UaWNrcyh0aWNrcyk6CisgICAgcmV0dXJuIFRpbWUoKnRpbWUubG9jYWx0aW1lKHRpY2tzKVszOjZdKQorCitkZWYgVGltZXN0YW1wRnJvbVRpY2tzKHRpY2tzKToKKyAgICByZXR1cm4gVGltZXN0YW1wKCp0aW1lLmxvY2FsdGltZSh0aWNrcylbOjZdKQorCit2ZXJzaW9uX2luZm8gPSB0dXBsZShbaW50KHgpIGZvciB4IGluIHZlcnNpb24uc3BsaXQoIi4iKV0pCitzcWxpdGVfdmVyc2lvbl9pbmZvID0gdHVwbGUoW2ludCh4KSBmb3IgeCBpbiBzcWxpdGVfdmVyc2lvbi5zcGxpdCgiLiIpXSkKKworQmluYXJ5ID0gYnVmZmVyCisKK2RlZiByZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpOgorICAgIGRlZiBhZGFwdF9kYXRlKHZhbCk6CisgICAgICAgIHJldHVybiB2YWwuaXNvZm9ybWF0KCkKKworICAgIGRlZiBhZGFwdF9kYXRldGltZSh2YWwpOgorICAgICAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgiICIpCisKKyAgICBkZWYgY29udmVydF9kYXRlKHZhbCk6CisgICAgICAgIHJldHVybiBkYXRldGltZS5kYXRlKCptYXAoaW50LCB2YWwuc3BsaXQoIi0iKSkpCisKKyAgICBkZWYgY29udmVydF90aW1lc3RhbXAodmFsKToKKyAgICAgICAgZGF0ZXBhcnQsIHRpbWVwYXJ0ID0gdmFsLnNwbGl0KCIgIikKKyAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IG1hcChpbnQsIGRhdGVwYXJ0LnNwbGl0KCItIikpCisgICAgICAgIHRpbWVwYXJ0X2Z1bGwgPSB0aW1lcGFydC5zcGxpdCgiLiIpCisgICAgICAgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzID0gbWFwKGludCwgdGltZXBhcnRfZnVsbFswXS5zcGxpdCgiOiIpKQorICAgICAgICBpZiBsZW4odGltZXBhcnRfZnVsbCkgPT0gMjoKKyAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IGludCgnezowPDYuNn0nLmZvcm1hdCh0aW1lcGFydF9mdWxsWzFdLmRlY29kZSgpKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IDAKKworICAgICAgICB2YWwgPSBkYXRldGltZS5kYXRldGltZSh5ZWFyLCBtb250aCwgZGF5LCBob3VycywgbWludXRlcywgc2Vjb25kcywgbWljcm9zZWNvbmRzKQorICAgICAgICByZXR1cm4gdmFsCisKKworICAgIHJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZSwgYWRhcHRfZGF0ZSkKKyAgICByZWdpc3Rlcl9hZGFwdGVyKGRhdGV0aW1lLmRhdGV0aW1lLCBhZGFwdF9kYXRldGltZSkKKyAgICByZWdpc3Rlcl9jb252ZXJ0ZXIoImRhdGUiLCBjb252ZXJ0X2RhdGUpCisgICAgcmVnaXN0ZXJfY29udmVydGVyKCJ0aW1lc3RhbXAiLCBjb252ZXJ0X3RpbWVzdGFtcCkKKworcmVnaXN0ZXJfYWRhcHRlcnNfYW5kX2NvbnZlcnRlcnMoKQorCisjIENsZWFuIHVwIG5hbWVzcGFjZQorCitkZWwocmVnaXN0ZXJfYWRhcHRlcnNfYW5kX2NvbnZlcnRlcnMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZGJhcGkyLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTFmODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZGJhcGkyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZGJhcGkyLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kYmFwaTIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTFmODQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZGJhcGkyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZHVtcC5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzVlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZHVtcC5weQpAQCAtMCwwICsxLDcwIEBACisjIE1pbWljIHRoZSBzcWxpdGUzIGNvbnNvbGUgc2hlbGwncyAuZHVtcCBjb21tYW5kCisjIEF1dGhvcjogUGF1bCBLaXBwZXMgPGtpcHBlc3BAZ21haWwuY29tPgorCisjIEV2ZXJ5IGlkZW50aWZpZXIgaW4gc3FsIGlzIHF1b3RlZCBiYXNlZCBvbiBhIGNvbW1lbnQgaW4gc3FsaXRlCisjIGRvY3VtZW50YXRpb24gIlNRTGl0ZSBhZGRzIG5ldyBrZXl3b3JkcyBmcm9tIHRpbWUgdG8gdGltZSB3aGVuIGl0CisjIHRha2VzIG9uIG5ldyBmZWF0dXJlcy4gU28gdG8gcHJldmVudCB5b3VyIGNvZGUgZnJvbSBiZWluZyBicm9rZW4gYnkKKyMgZnV0dXJlIGVuaGFuY2VtZW50cywgeW91IHNob3VsZCBub3JtYWxseSBxdW90ZSBhbnkgaWRlbnRpZmllciB0aGF0CisjIGlzIGFuIEVuZ2xpc2ggbGFuZ3VhZ2Ugd29yZCwgZXZlbiBpZiB5b3UgZG8gbm90IGhhdmUgdG8uIgorCitkZWYgX2l0ZXJkdW1wKGNvbm5lY3Rpb24pOgorICAgICIiIgorICAgIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGR1bXAgb2YgdGhlIGRhdGFiYXNlIGluIGFuIFNRTCB0ZXh0IGZvcm1hdC4KKworICAgIFVzZWQgdG8gcHJvZHVjZSBhbiBTUUwgZHVtcCBvZiB0aGUgZGF0YWJhc2UuICBVc2VmdWwgdG8gc2F2ZSBhbiBpbi1tZW1vcnkKKyAgICBkYXRhYmFzZSBmb3IgbGF0ZXIgcmVzdG9yYXRpb24uICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgZGlyZWN0bHkgYnV0IGluc3RlYWQgY2FsbGVkIGZyb20gdGhlIENvbm5lY3Rpb24gbWV0aG9kLCBpdGVyZHVtcCgpLgorICAgICIiIgorCisgICAgY3UgPSBjb25uZWN0aW9uLmN1cnNvcigpCisgICAgeWllbGQoJ0JFR0lOIFRSQU5TQUNUSU9OOycpCisKKyAgICAjIHNxbGl0ZV9tYXN0ZXIgdGFibGUgY29udGFpbnMgdGhlIFNRTCBDUkVBVEUgc3RhdGVtZW50cyBmb3IgdGhlIGRhdGFiYXNlLgorICAgIHEgPSAiIiIKKyAgICAgICAgU0VMRUNUICJuYW1lIiwgInR5cGUiLCAic3FsIgorICAgICAgICBGUk9NICJzcWxpdGVfbWFzdGVyIgorICAgICAgICAgICAgV0hFUkUgInNxbCIgTk9UIE5VTEwgQU5ECisgICAgICAgICAgICAidHlwZSIgPT0gJ3RhYmxlJworICAgICAgICAgICAgT1JERVIgQlkgIm5hbWUiCisgICAgICAgICIiIgorICAgIHNjaGVtYV9yZXMgPSBjdS5leGVjdXRlKHEpCisgICAgZm9yIHRhYmxlX25hbWUsIHR5cGUsIHNxbCBpbiBzY2hlbWFfcmVzLmZldGNoYWxsKCk6CisgICAgICAgIGlmIHRhYmxlX25hbWUgPT0gJ3NxbGl0ZV9zZXF1ZW5jZSc6CisgICAgICAgICAgICB5aWVsZCgnREVMRVRFIEZST00gInNxbGl0ZV9zZXF1ZW5jZSI7JykKKyAgICAgICAgZWxpZiB0YWJsZV9uYW1lID09ICdzcWxpdGVfc3RhdDEnOgorICAgICAgICAgICAgeWllbGQoJ0FOQUxZWkUgInNxbGl0ZV9tYXN0ZXIiOycpCisgICAgICAgIGVsaWYgdGFibGVfbmFtZS5zdGFydHN3aXRoKCdzcWxpdGVfJyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAjIE5PVEU6IFZpcnR1YWwgdGFibGUgc3VwcG9ydCBub3QgaW1wbGVtZW50ZWQKKyAgICAgICAgI2VsaWYgc3FsLnN0YXJ0c3dpdGgoJ0NSRUFURSBWSVJUVUFMIFRBQkxFJyk6CisgICAgICAgICMgICAgcXRhYmxlID0gdGFibGVfbmFtZS5yZXBsYWNlKCInIiwgIicnIikKKyAgICAgICAgIyAgICB5aWVsZCgiSU5TRVJUIElOVE8gc3FsaXRlX21hc3Rlcih0eXBlLG5hbWUsdGJsX25hbWUscm9vdHBhZ2Usc3FsKSJcCisgICAgICAgICMgICAgICAgICJWQUxVRVMoJ3RhYmxlJywnezB9JywnezB9JywwLCd7MX0nKTsiLmZvcm1hdCgKKyAgICAgICAgIyAgICAgICAgcXRhYmxlLAorICAgICAgICAjICAgICAgICBzcWwucmVwbGFjZSgiJyciKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB5aWVsZCgnJXM7JyAlIHNxbCkKKworICAgICAgICAjIEJ1aWxkIHRoZSBpbnNlcnQgc3RhdGVtZW50IGZvciBlYWNoIHJvdyBvZiB0aGUgY3VycmVudCB0YWJsZQorICAgICAgICB0YWJsZV9uYW1lX2lkZW50ID0gdGFibGVfbmFtZS5yZXBsYWNlKCciJywgJyIiJykKKyAgICAgICAgcmVzID0gY3UuZXhlY3V0ZSgnUFJBR01BIHRhYmxlX2luZm8oInswfSIpJy5mb3JtYXQodGFibGVfbmFtZV9pZGVudCkpCisgICAgICAgIGNvbHVtbl9uYW1lcyA9IFtzdHIodGFibGVfaW5mb1sxXSkgZm9yIHRhYmxlX2luZm8gaW4gcmVzLmZldGNoYWxsKCldCisgICAgICAgIHEgPSAiIiJTRUxFQ1QgJ0lOU0VSVCBJTlRPICJ7MH0iIFZBTFVFUyh7MX0pJyBGUk9NICJ7MH0iOyIiIi5mb3JtYXQoCisgICAgICAgICAgICB0YWJsZV9uYW1lX2lkZW50LAorICAgICAgICAgICAgIiwiLmpvaW4oIiIiJ3x8cXVvdGUoInswfSIpfHwnIiIiLmZvcm1hdChjb2wucmVwbGFjZSgnIicsICciIicpKSBmb3IgY29sIGluIGNvbHVtbl9uYW1lcykpCisgICAgICAgIHF1ZXJ5X3JlcyA9IGN1LmV4ZWN1dGUocSkKKyAgICAgICAgZm9yIHJvdyBpbiBxdWVyeV9yZXM6CisgICAgICAgICAgICB5aWVsZCgiJXM7IiAlIHJvd1swXSkKKworICAgICMgTm93IHdoZW4gdGhlIHR5cGUgaXMgJ2luZGV4JywgJ3RyaWdnZXInLCBvciAndmlldycKKyAgICBxID0gIiIiCisgICAgICAgIFNFTEVDVCAibmFtZSIsICJ0eXBlIiwgInNxbCIKKyAgICAgICAgRlJPTSAic3FsaXRlX21hc3RlciIKKyAgICAgICAgICAgIFdIRVJFICJzcWwiIE5PVCBOVUxMIEFORAorICAgICAgICAgICAgInR5cGUiIElOICgnaW5kZXgnLCAndHJpZ2dlcicsICd2aWV3JykKKyAgICAgICAgIiIiCisgICAgc2NoZW1hX3JlcyA9IGN1LmV4ZWN1dGUocSkKKyAgICBmb3IgbmFtZSwgdHlwZSwgc3FsIGluIHNjaGVtYV9yZXMuZmV0Y2hhbGwoKToKKyAgICAgICAgeWllbGQoJyVzOycgJSBzcWwpCisKKyAgICB5aWVsZCgnQ09NTUlUOycpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZHVtcC5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZHVtcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhODI5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZHVtcC5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvZHVtcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhODI5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy9kdW1wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTA1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTA1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZGJhcGkucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kYmFwaS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzU2ZDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZGJhcGkucHkKQEAgLTAsMCArMSw4ODkgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9kYmFwaS5weTogdGVzdHMgZm9yIERCLUFQSSBjb21wbGlhbmNlCisjCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK2NsYXNzIE1vZHVsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tBUElMZXZlbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUuYXBpbGV2ZWwsICIyLjAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhcGlsZXZlbCBpcyAlcywgc2hvdWxkIGJlIDIuMCIgJSBzcWxpdGUuYXBpbGV2ZWwpCisKKyAgICBkZWYgQ2hlY2tUaHJlYWRTYWZldHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3FsaXRlLnRocmVhZHNhZmV0eSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhyZWFkc2FmZXR5IGlzICVkLCBzaG91bGQgYmUgMSIgJSBzcWxpdGUudGhyZWFkc2FmZXR5KQorCisgICAgZGVmIENoZWNrUGFyYW1TdHlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUucGFyYW1zdHlsZSwgInFtYXJrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW1zdHlsZSBpcyAnJXMnLCBzaG91bGQgYmUgJ3FtYXJrJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5wYXJhbXN0eWxlKQorCisgICAgZGVmIENoZWNrV2FybmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLldhcm5pbmcsIFN0YW5kYXJkRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmcgaXMgbm90IGEgc3ViY2xhc3Mgb2YgU3RhbmRhcmRFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkVycm9yLCBTdGFuZGFyZEVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBTdGFuZGFyZEVycm9yIikKKworICAgIGRlZiBDaGVja0ludGVyZmFjZUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJmYWNlRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRXJyb3IiKQorCisgICAgZGVmIENoZWNrRGF0YWJhc2VFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFiYXNlRXJyb3IsIHNxbGl0ZS5FcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YWJhc2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tEYXRhRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNxbGl0ZS5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tPcGVyYXRpb25hbEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9wZXJhdGlvbmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tJbnRlZ3JpdHlFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLkludGVncml0eUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZWdyaXR5RXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tJbnRlcm5hbEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZXJuYWxFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tQcm9ncmFtbWluZ0Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIlByb2dyYW1taW5nRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tOb3RTdXBwb3J0ZWRFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiTm90U3VwcG9ydGVkRXJyb3IgaXMgbm90IGEgc3ViY2xhc3Mgb2YgRGF0YWJhc2VFcnJvciIpCisKK2NsYXNzIENvbm5lY3Rpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCisgICAgICAgIGN1LmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCkiKQorICAgICAgICBjdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jeC5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tDb21taXQoc2VsZik6CisgICAgICAgIHNlbGYuY3guY29tbWl0KCkKKworICAgIGRlZiBDaGVja0NvbW1pdEFmdGVyTm9DaGFuZ2VzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSBjb21taXQgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3guY29tbWl0KCkKKyAgICAgICAgc2VsZi5jeC5jb21taXQoKQorCisgICAgZGVmIENoZWNrUm9sbGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorCisgICAgZGVmIENoZWNrUm9sbGJhY2tBZnRlck5vQ2hhbmdlcyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIEEgcm9sbGJhY2sgc2hvdWxkIGFsc28gd29yayB3aGVuIG5vIGNoYW5nZXMgd2VyZSBtYWRlIHRvIHRoZSBkYXRhYmFzZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorICAgICAgICBzZWxmLmN4LnJvbGxiYWNrKCkKKworICAgIGRlZiBDaGVja0N1cnNvcihzZWxmKToKKyAgICAgICAgY3UgPSBzZWxmLmN4LmN1cnNvcigpCisKKyAgICBkZWYgQ2hlY2tGYWlsZWRPcGVuKHNlbGYpOgorICAgICAgICBZT1VfQ0FOTk9UX09QRU5fVEhJUyA9ICIvZm9vL2Jhci9ibGEvMjM1MzQvbXlkYi5kYiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoWU9VX0NBTk5PVF9PUEVOX1RISVMpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmN4LmNsb3NlKCkKKworICAgIGRlZiBDaGVja0V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lldhcm5pbmcsIHNxbGl0ZS5XYXJuaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guRXJyb3IsIHNxbGl0ZS5FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LkludGVyZmFjZUVycm9yLCBzcWxpdGUuSW50ZXJmYWNlRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LkRhdGFFcnJvciwgc3FsaXRlLkRhdGFFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4Lk9wZXJhdGlvbmFsRXJyb3IsIHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN4LkludGVybmFsRXJyb3IsIHNxbGl0ZS5JbnRlcm5hbEVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3guUHJvZ3JhbW1pbmdFcnJvciwgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jeC5Ob3RTdXBwb3J0ZWRFcnJvciwgc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKQorCitjbGFzcyBDdXJzb3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdSA9IHNlbGYuY3guY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGluY29tZSBudW1iZXIpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdS5jbG9zZSgpCisgICAgICAgIHNlbGYuY3guY2xvc2UoKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZU5vQXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVJbGxlZ2FsU3FsKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBhc2RmIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IHNlbGVjdCA0KzUiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBXYXJuaW5nIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5XYXJuaW5nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbDIoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IDUrNDsgLS0gZm9vIGJhciIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbDMoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIHNlbGVjdCA1KzQ7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBmb28KKyAgICAgICAgICAgICovCisgICAgICAgICAgICAiIiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdTcWxBcmcoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSg0MikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZUFyZ0ludChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnRmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCAoMjUwMC4zMiwpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZUFyZ1N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoIkh1Z28iLCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnU3RyaW5nV2l0aFplcm9CeXRlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiSHVceDAwZ28iLCkpCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgaWQ9PyIsIChzZWxmLmN1Lmxhc3Ryb3dpZCwpKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJIdVx4MDBnbyIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczEoc2VsZik6CisgICAgICAgICMgdG9vIG1hbnkgcGFyYW1ldGVycworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoMTcsICJFZ29uIikpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MyKHNlbGYpOgorICAgICAgICAjIHRvbyBsaXR0bGUgcGFyYW1ldGVycworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMyhzZWxmKToKKyAgICAgICAgIyBubyBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlUGFyYW1MaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPT8iLCBbImZvbyJdKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZVBhcmFtU2VxdWVuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEwob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHggPT0gMAorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9PyIsIEwoKSkKKyAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIsIHsibmFtZSI6ICJmb28ifSkKKyAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiZm9vIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ19NYXBwaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3Qgb25seSB3b3JrcyB3aXRoIFB5dGhvbiAyLjUgb3IgbGF0ZXIKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA1LCAwKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNsYXNzIEQoZGljdCk6CisgICAgICAgICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKKworICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCB3aGVyZSBuYW1lPTpuYW1lIiwgRCgpKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVG9vTGl0dGxlQXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSBhbmQgaWQ9OmlkIiwgeyJuYW1lIjogImZvbyJ9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ05vQXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVW5uYW1lZChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgeyJuYW1lIjogImZvbyJ9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmNsb3NlKCkKKworICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJ1cGRhdGUgdGVzdCBzZXQgbmFtZT0nYmFyJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5yb3djb3VudCwgMikKKworICAgIGRlZiBDaGVja1Jvd2NvdW50U2VsZWN0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcHlzcWxpdGUgZG9lcyBub3Qga25vdyB0aGUgcm93Y291bnQgb2YgU0VMRUNUIHN0YXRlbWVudHMsIGJlY2F1c2Ugd2UKKyAgICAgICAgZG9uJ3QgZmV0Y2ggYWxsIHJvd3MgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBzZWxlY3Qgc3RhdGVtZW50LiBUaGUgcm93Y291bnQKKyAgICAgICAgaGFzIHRodXMgdG8gYmUgLTEuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1IHVuaW9uIHNlbGVjdCA2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAtMSkKKworICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZW1hbnkoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsIFsoMSwpLCAoMiwpLCAoMywpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1LnJvd2NvdW50LCAzKQorCisgICAgZGVmIENoZWNrVG90YWxDaGFuZ2VzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBpZiBzZWxmLmN4LnRvdGFsX2NoYW5nZXMgPCAyOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ0b3RhbCBjaGFuZ2VzIHJlcG9ydGVkIHdyb25nIHZhbHVlIikKKworICAgICMgQ2hlY2tzIGZvciBleGVjdXRlbWFueToKKyAgICAjIFNlcXVlbmNlcyBhcmUgcmVxdWlyZWQgYnkgdGhlIERCLUFQSSwgaXRlcmF0b3JzCisgICAgIyBlbmhhbmNlbWVudHMgaW4gcHlzcWxpdGUuCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVNlcXVlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIFsoeCwpIGZvciB4IGluIHJhbmdlKDEwMCwgMTEwKV0pCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUl0ZXJhdG9yKHNlbGYpOgorICAgICAgICBjbGFzcyBNeUl0ZXI6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IDUKKworICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi52YWx1ZSA9PSAxMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgKz0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYudmFsdWUsKQorCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgTXlJdGVyKCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueUdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZGVmIG15Z2VuKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICB5aWVsZCAoaSwpCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBteWdlbigpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZU1hbnlXcm9uZ1NxbEFyZyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSg0MiwgWygzLCldKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVNlbGVjdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgic2VsZWN0ID8iLCBbKDMsKV0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueU5vdEl0ZXJhYmxlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIDQyKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBUeXBlRXJyb3IiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBwcmludCAicmFpc2VkIiwgZS5fX2NsYXNzX18KKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIENoZWNrRmV0Y2hJdGVyKHNlbGYpOgorICAgICAgICAjIE9wdGlvbmFsIERCLUFQSSBleHRlbnNpb24uCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg1LCkpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpZCkgdmFsdWVzICg/KSIsICg2LCkpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IGlkIGZyb20gdGVzdCBvcmRlciBieSBpZCIpCisgICAgICAgIGxzdCA9IFtdCisgICAgICAgIGZvciByb3cgaW4gc2VsZi5jdToKKyAgICAgICAgICAgIGxzdC5hcHBlbmQocm93WzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdFswXSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3RbMV0sIDYpCisKKyAgICBkZWYgQ2hlY2tGZXRjaG9uZShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sICJmb28iKQorICAgICAgICByb3cgPSBzZWxmLmN1LmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3csIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tGZXRjaG9uZU5vU3RhdGVtZW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmN4LmN1cnNvcigpCisgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCBOb25lKQorCisgICAgZGVmIENoZWNrQXJyYXlTaXplKHNlbGYpOgorICAgICAgICAjIG11c3QgZGVmYXVsdCBvdCAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jdS5hcnJheXNpemUsIDEpCisKKyAgICAgICAgIyBub3cgc2V0IHRvIDIKKyAgICAgICAgc2VsZi5jdS5hcnJheXNpemUgPSAyCisKKyAgICAgICAgIyBub3cgbWFrZSB0aGUgcXVlcnkgcmV0dXJuIDMgcm93cworICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQScpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0InKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdDJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAyKQorCisgICAgZGVmIENoZWNrRmV0Y2htYW55KHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgW10pCisKKyAgICBkZWYgQ2hlY2tGZXRjaG1hbnlLd0FyZyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2tzIGlmIGZldGNobWFueSB3b3JrcyB3aXRoIGtleXdvcmQgYXJndW1lbnRzIiIiCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoc2l6ZT0xMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisKKyAgICBkZWYgQ2hlY2tGZXRjaGFsbChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1LmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKKworICAgIGRlZiBDaGVja1NldGlucHV0c2l6ZXMoc2VsZik6CisgICAgICAgIHNlbGYuY3Uuc2V0aW5wdXRzaXplcyhbMywgNCwgNV0pCisKKyAgICBkZWYgQ2hlY2tTZXRvdXRwdXRzaXplKHNlbGYpOgorICAgICAgICBzZWxmLmN1LnNldG91dHB1dHNpemUoNSwgMCkKKworICAgIGRlZiBDaGVja1NldG91dHB1dHNpemVOb0NvbHVtbihzZWxmKToKKyAgICAgICAgc2VsZi5jdS5zZXRvdXRwdXRzaXplKDQyKQorCisgICAgZGVmIENoZWNrQ3Vyc29yQ29ubmVjdGlvbihzZWxmKToKKyAgICAgICAgIyBPcHRpb25hbCBEQi1BUEkgZXh0ZW5zaW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3UuY29ubmVjdGlvbiwgc2VsZi5jeCkKKworICAgIGRlZiBDaGVja1dyb25nQ3Vyc29yQ2FsbGFibGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlZiBmKCk6IHBhc3MKKyAgICAgICAgICAgIGN1ciA9IHNlbGYuY3guY3Vyc29yKGYpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKworICAgIGRlZiBDaGVja0N1cnNvcldyb25nQ2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEZvbzogcGFzcworICAgICAgICBmb28gPSBGb28oKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIgPSBzcWxpdGUuQ3Vyc29yKGZvbykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RoaXMgdGVzdCByZXF1aXJlcyB0aHJlYWRpbmcuJykKK2NsYXNzIFRocmVhZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGJpbiBiaW5hcnksIHJhdGlvIG51bWJlciwgdHMgdGltZXN0YW1wKSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ29uQ3Vyc29yKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvbkNvbW1pdChzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29uLmNvbW1pdCgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKKyAgICBkZWYgQ2hlY2tDb25Sb2xsYmFjayhzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjb24sIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY29uLnJvbGxiYWNrKCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvbkNsb3NlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VySW1wbGljaXRCZWdpbihzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnYScpIikKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0N1ckNsb3NlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIuY2xvc2UoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VyRXhlY3V0ZShzZWxmKToKKyAgICAgICAgZGVmIHJ1bihjdXIsIGVycm9ycyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0N1ckl0ZXJOZXh0KHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdhJykiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3QiKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKK2NsYXNzIENvbnN0cnVjdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja0RhdGUoc2VsZik6CisgICAgICAgIGQgPSBzcWxpdGUuRGF0ZSgyMDA0LCAxMCwgMjgpCisKKyAgICBkZWYgQ2hlY2tUaW1lKHNlbGYpOgorICAgICAgICB0ID0gc3FsaXRlLlRpbWUoMTIsIDM5LCAzNSkKKworICAgIGRlZiBDaGVja1RpbWVzdGFtcChzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDEwLCAyOCwgMTIsIDM5LCAzNSkKKworICAgIGRlZiBDaGVja0RhdGVGcm9tVGlja3Moc2VsZik6CisgICAgICAgIGQgPSBzcWxpdGUuRGF0ZUZyb21UaWNrcyg0MikKKworICAgIGRlZiBDaGVja1RpbWVGcm9tVGlja3Moc2VsZik6CisgICAgICAgIHQgPSBzcWxpdGUuVGltZUZyb21UaWNrcyg0MikKKworICAgIGRlZiBDaGVja1RpbWVzdGFtcEZyb21UaWNrcyhzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wRnJvbVRpY2tzKDQyKQorCisgICAgZGVmIENoZWNrQmluYXJ5KHNlbGYpOgorICAgICAgICBiID0gc3FsaXRlLkJpbmFyeShjaHIoMCkgKyAiJyIpCisKK2NsYXNzIEV4dGVuc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tTY3JpcHRTdHJpbmdTcWwoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiIiIKKyAgICAgICAgICAgIC0tIGJsYSBibGEKKyAgICAgICAgICAgIC8qIGEgc3R1cGlkIGNvbW1lbnQgKi8KKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBhKGkpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDUpOworICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSBhIikKKyAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIDUpCisKKyAgICBkZWYgQ2hlY2tTY3JpcHRTdHJpbmdVbmljb2RlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQodSIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGEoaSk7CisgICAgICAgICAgICBpbnNlcnQgaW50byBhKGkpIHZhbHVlcyAoNSk7CisgICAgICAgICAgICBzZWxlY3QgaSBmcm9tIGE7CisgICAgICAgICAgICBkZWxldGUgZnJvbSBhOworICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDYpOworICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSBhIikKKyAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIDYpCisKKyAgICBkZWYgQ2hlY2tTY3JpcHRTeW50YXhFcnJvcihzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIHJhaXNlZCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdCh4KTsgYXNkZjsgY3JlYXRlIHRhYmxlIHRlc3QyKHgpIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcmFpc2VkID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhaXNlZCwgVHJ1ZSwgInNob3VsZCBoYXZlIHJhaXNlZCBhbiBleGNlcHRpb24iKQorCisgICAgZGVmIENoZWNrU2NyaXB0RXJyb3JOb3JtYWwoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICByYWlzZWQgPSBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3Qoc2FkZnNhZGZkc2EpOyBzZWxlY3QgZm9vIGZyb20gaHVyejsiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICByYWlzZWQgPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFpc2VkLCBUcnVlLCAic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tDb25uZWN0aW9uRXhlY3V0ZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCA1IikuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlIikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlbWFueShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGZvbykiKQorICAgICAgICBjb24uZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgWygzLCksICg0LCldKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3Qgb3JkZXIgYnkgZm9vIikuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXVswXSwgMywgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlbWFueSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzFdWzBdLCA0LCAiQmFzaWMgdGVzdCBvZiBDb25uZWN0aW9uLmV4ZWN1dGVtYW55IikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlc2NyaXB0KHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uZXhlY3V0ZXNjcmlwdCgiY3JlYXRlIHRhYmxlIHRlc3QoZm9vKTsgaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoNSk7IikKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlc2NyaXB0IikKKworY2xhc3MgQ2xvc2VkQ29uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDb25DdXJzb3Ioc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkQ29uQ29tbWl0KHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY29tbWl0KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZENvblJvbGxiYWNrKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24ucm9sbGJhY2soKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkQ3VyRXhlY3V0ZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDcmVhdGVGdW5jdGlvbihzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgZGVmIGYoeCk6IHJldHVybiAxNworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY3JlYXRlX2Z1bmN0aW9uKCJmb28iLCAxLCBmKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkQ3JlYXRlQWdncmVnYXRlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICBjbGFzcyBBZ2c6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHN0ZXAoc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAxNworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZm9vIiwgMSwgQWdnKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkU2V0QXV0aG9yaXplcihzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgZGVmIGF1dGhvcml6ZXIoKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIHNxbGl0ZS5ERU5ZCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5zZXRfYXV0aG9yaXplcihhdXRob3JpemVyKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkU2V0UHJvZ3Jlc3NDYWxsYmFjayhzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNsb3NlKCkKKyAgICAgICAgZGVmIHByb2dyZXNzKCk6IHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxMDApCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDYWxsKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24oKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCitjbGFzcyBDbG9zZWRDdXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0Nsb3NlZChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5jbG9zZSgpCisKKyAgICAgICAgZm9yIG1ldGhvZF9uYW1lIGluICgiZXhlY3V0ZSIsICJleGVjdXRlbWFueSIsICJleGVjdXRlc2NyaXB0IiwgImZldGNoYWxsIiwgImZldGNobWFueSIsICJmZXRjaG9uZSIpOgorICAgICAgICAgICAgaWYgbWV0aG9kX25hbWUgaW4gKCJleGVjdXRlIiwgImV4ZWN1dGVzY3JpcHQiKToKKyAgICAgICAgICAgICAgICBwYXJhbXMgPSAoInNlbGVjdCA0IHVuaW9uIHNlbGVjdCA1IiwpCisgICAgICAgICAgICBlbGlmIG1ldGhvZF9uYW1lID09ICJleGVjdXRlbWFueSI6CisgICAgICAgICAgICAgICAgcGFyYW1zID0gKCJpbnNlcnQgaW50byBmb28oYmFyKSB2YWx1ZXMgKD8pIiwgWygzLCksICg0LCldKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJhbXMgPSBbXQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihjdXIsIG1ldGhvZF9uYW1lKQorCisgICAgICAgICAgICAgICAgbWV0aG9kKCpwYXJhbXMpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yOiBtZXRob2QgIiArIG1ldGhvZF9uYW1lKQorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3I6ICIgKyBtZXRob2RfbmFtZSkKKworZGVmIHN1aXRlKCk6CisgICAgbW9kdWxlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKE1vZHVsZVRlc3RzLCAiQ2hlY2siKQorICAgIGNvbm5lY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29ubmVjdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JUZXN0cywgIkNoZWNrIikKKyAgICB0aHJlYWRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGhyZWFkVGVzdHMsICJDaGVjayIpCisgICAgY29uc3RydWN0b3Jfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29uc3RydWN0b3JUZXN0cywgIkNoZWNrIikKKyAgICBleHRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRXh0ZW5zaW9uVGVzdHMsICJDaGVjayIpCisgICAgY2xvc2VkX2Nvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDbG9zZWRDb25UZXN0cywgIkNoZWNrIikKKyAgICBjbG9zZWRfY3VyX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENsb3NlZEN1clRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKG1vZHVsZV9zdWl0ZSwgY29ubmVjdGlvbl9zdWl0ZSwgY3Vyc29yX3N1aXRlLCB0aHJlYWRfc3VpdGUsIGNvbnN0cnVjdG9yX3N1aXRlLCBleHRfc3VpdGUsIGNsb3NlZF9jb25fc3VpdGUsIGNsb3NlZF9jdXJfc3VpdGUpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kYmFwaS5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kYmFwaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkOTA2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2RiYXBpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kYmFwaS5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kYmFwaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5MTJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2RiYXBpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kdW1wLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZHVtcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2RlODEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZHVtcC5weQpAQCAtMCwwICsxLDgzIEBACisjIEF1dGhvcjogUGF1bCBLaXBwZXMgPGtpcHBlc3BAZ21haWwuY29tPgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitjbGFzcyBEdW1wVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jeCA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY3UgPSBzZWxmLmN4LmN1cnNvcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3guY2xvc2UoKQorCisgICAgZGVmIENoZWNrVGFibGVEdW1wKHNlbGYpOgorICAgICAgICBleHBlY3RlZF9zcWxzID0gWworICAgICAgICAgICAgICAgICIiIkNSRUFURSBUQUJMRSAiaW5kZXgiKCJpbmRleCIgYmxvYik7IiIiCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICIiIklOU0VSVCBJTlRPICJpbmRleCIgVkFMVUVTKFgnMDEnKTsiIiIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIiIiQ1JFQVRFIFRBQkxFICJxdW90ZWQiInRhYmxlIigicXVvdGVkIiJmaWVsZCIgdGV4dCk7IiIiCisgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICIiIklOU0VSVCBJTlRPICJxdW90ZWQiInRhYmxlIiBWQUxVRVMoJ3F1b3RlZCcndmFsdWUnKTsiIiIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIkNSRUFURSBUQUJMRSB0MShpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBzMSB0ZXh0LCAiIFwKKyAgICAgICAgICAgICAgICAidDFfaTEgaW50ZWdlciBub3QgbnVsbCwgaTIgaW50ZWdlciwgdW5pcXVlIChzMSksICIgXAorICAgICAgICAgICAgICAgICJjb25zdHJhaW50IHQxX2lkeDEgdW5pcXVlIChpMikpOyIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIklOU0VSVCBJTlRPIFwidDFcIiBWQUxVRVMoMSwnZm9vJywxMCwyMCk7IgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAiSU5TRVJUIElOVE8gXCJ0MVwiIFZBTFVFUygyLCdmb28yJywzMCwzMCk7IgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICB1IklOU0VSVCBJTlRPIFwidDFcIiBWQUxVRVMoMywnZlx4YzNceGI2Jyw0MCwxMCk7IgorICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAiQ1JFQVRFIFRBQkxFIHQyKGlkIGludGVnZXIsIHQyX2kxIGludGVnZXIsICIgXAorICAgICAgICAgICAgICAgICJ0Ml9pMiBpbnRlZ2VyLCBwcmltYXJ5IGtleSAoaWQpLCIgXAorICAgICAgICAgICAgICAgICJmb3JlaWduIGtleSh0Ml9pMSkgcmVmZXJlbmNlcyB0MSh0MV9pMSkpOyIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIkNSRUFURSBUUklHR0VSIHRyaWdnZXJfMSB1cGRhdGUgb2YgdDFfaTEgb24gdDEgIiBcCisgICAgICAgICAgICAgICAgImJlZ2luICIgXAorICAgICAgICAgICAgICAgICJ1cGRhdGUgdDIgc2V0IHQyX2kxID0gbmV3LnQxX2kxIHdoZXJlIHQyX2kxID0gb2xkLnQxX2kxOyAiIFwKKyAgICAgICAgICAgICAgICAiZW5kOyIKKyAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgIkNSRUFURSBWSUVXIHYxIGFzIHNlbGVjdCAqIGZyb20gdDEgbGVmdCBqb2luIHQyICIgXAorICAgICAgICAgICAgICAgICJ1c2luZyAoaWQpOyIKKyAgICAgICAgICAgICAgICBdCisgICAgICAgIFtzZWxmLmN1LmV4ZWN1dGUocykgZm9yIHMgaW4gZXhwZWN0ZWRfc3Fsc10KKyAgICAgICAgaSA9IHNlbGYuY3guaXRlcmR1bXAoKQorICAgICAgICBhY3R1YWxfc3FscyA9IFtzIGZvciBzIGluIGldCisgICAgICAgIGV4cGVjdGVkX3NxbHMgPSBbJ0JFR0lOIFRSQU5TQUNUSU9OOyddICsgZXhwZWN0ZWRfc3FscyArIFwKKyAgICAgICAgICAgIFsnQ09NTUlUOyddCisgICAgICAgIFtzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3NxbHNbaV0sIGFjdHVhbF9zcWxzW2ldKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihleHBlY3RlZF9zcWxzKSldCisKKyAgICBkZWYgQ2hlY2tVbm9yZGVyYWJsZVJvdyhzZWxmKToKKyAgICAgICAgIyBpdGVyZHVtcCgpIHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgd2l0aCB1bm9yZGVyYWJsZSByb3cgdHlwZXMgKGlzc3VlICMxNTU0NSkKKyAgICAgICAgY2xhc3MgVW5vcmRlcmFibGVSb3c6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY3Vyc29yLCByb3cpOgorICAgICAgICAgICAgICAgIHNlbGYucm93ID0gcm93CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnJvd1tpbmRleF0KKyAgICAgICAgc2VsZi5jeC5yb3dfZmFjdG9yeSA9IFVub3JkZXJhYmxlUm93CisgICAgICAgIENSRUFURV9BTFBIQSA9ICIiIkNSRUFURSBUQUJMRSAiYWxwaGEiICgib25lIik7IiIiCisgICAgICAgIENSRUFURV9CRVRBID0gIiIiQ1JFQVRFIFRBQkxFICJiZXRhIiAoInR3byIpOyIiIgorICAgICAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgICJCRUdJTiBUUkFOU0FDVElPTjsiLAorICAgICAgICAgICAgQ1JFQVRFX0FMUEhBLAorICAgICAgICAgICAgQ1JFQVRFX0JFVEEsCisgICAgICAgICAgICAiQ09NTUlUOyIKKyAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKENSRUFURV9CRVRBKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoQ1JFQVRFX0FMUEhBKQorICAgICAgICBnb3QgPSBsaXN0KHNlbGYuY3guaXRlcmR1bXAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCitkZWYgc3VpdGUoKToKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKHVuaXR0ZXN0Lm1ha2VTdWl0ZShEdW1wVGVzdHMsICJDaGVjayIpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kdW1wLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2R1bXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTJiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kdW1wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kdW1wLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2R1bXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZTJiNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9kdW1wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9mYWN0b3J5LnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mjg1NGJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQpAQCAtMCwwICsxLDI0NCBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L2ZhY3RvcnkucHk6IHRlc3RzIGZvciB0aGUgdmFyaW91cyBmYWN0b3JpZXMgaW4gcHlzcWxpdGUKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1LTIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2NsYXNzIE15Q29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNxbGl0ZS5Db25uZWN0aW9uLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKworZGVmIGRpY3RfZmFjdG9yeShjdXJzb3IsIHJvdyk6CisgICAgZCA9IHt9CisgICAgZm9yIGlkeCwgY29sIGluIGVudW1lcmF0ZShjdXJzb3IuZGVzY3JpcHRpb24pOgorICAgICAgICBkW2NvbFswXV0gPSByb3dbaWR4XQorICAgIHJldHVybiBkCisKK2NsYXNzIE15Q3Vyc29yKHNxbGl0ZS5DdXJzb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzcWxpdGUuQ3Vyc29yLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5yb3dfZmFjdG9yeSA9IGRpY3RfZmFjdG9yeQorCitjbGFzcyBDb25uZWN0aW9uRmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZmFjdG9yeT1NeUNvbm5lY3Rpb24pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja0lzSW5zdGFuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYuY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeUNvbm5lY3Rpb24pLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbm5lY3Rpb24gaXMgbm90IGluc3RhbmNlIG9mIE15Q29ubmVjdGlvbiIpCisKK2NsYXNzIEN1cnNvckZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja0lzSW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PU15Q3Vyc29yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15Q3Vyc29yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjdXJzb3IgaXMgbm90IGluc3RhbmNlIG9mIE15Q3Vyc29yIikKKworY2xhc3MgUm93RmFjdG9yeVRlc3RzQmFja3dhcmRzQ29tcGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiBDaGVja0lzUHJvZHVjZWRCeUZhY3Rvcnkoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcihmYWN0b3J5PU15Q3Vyc29yKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDQrNSBhcyBmb28iKQorICAgICAgICByb3cgPSBjdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgInJvdyBpcyBub3QgaW5zdGFuY2Ugb2YgZGljdCIpCisgICAgICAgIGN1ci5jbG9zZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworY2xhc3MgUm93RmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiBDaGVja0N1c3RvbUZhY3Rvcnkoc2VsZik6CisgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gbGFtYmRhIGN1ciwgcm93OiBsaXN0KHJvdykKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEsIDIiKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBsaXN0IikKKworICAgIGRlZiBDaGVja1NxbGl0ZVJvd0luZGV4KHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5Sb3cpLAorICAgICAgICAgICAgICAgICAgICAgICAgInJvdyBpcyBub3QgaW5zdGFuY2Ugb2Ygc3FsaXRlLlJvdyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1siYSJdLCByb3dbImIiXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdhJyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1siQSJdLCByb3dbIkIiXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29sMSA9PSAxLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0EnIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbDIgPT0gMiwgImJ5IG5hbWU6IHdyb25nIHJlc3VsdCBmb3IgY29sdW1uICdCJyIpCisKKyAgICAgICAgY29sMSwgY29sMiA9IHJvd1swXSwgcm93WzFdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wxID09IDEsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2wyID09IDIsICJieSBpbmRleDogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gMSIpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVSb3dJdGVyKHNlbGYpOgorICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgaXMgaXRlcmFibGUiIiIKKyAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKKyAgICAgICAgZm9yIGNvbCBpbiByb3c6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc1R1cGxlKHNlbGYpOgorICAgICAgICAiIiJDaGVja3MgaWYgdGhlIHJvdyBvYmplY3QgY2FuIGJlIGNvbnZlcnRlZCB0byBhIHR1cGxlIiIiCisgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdworICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCisgICAgICAgIHQgPSB0dXBsZShyb3cpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVSb3dBc0RpY3Qoc2VsZik6CisgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjYW4gYmUgY29ycmVjdGx5IGNvbnZlcnRlZCB0byBhIGRpY3Rpb25hcnkiIiIKKyAgICAgICAgc2VsZi5jb24ucm93X2ZhY3RvcnkgPSBzcWxpdGUuUm93CisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDIgYXMgYiIpLmZldGNob25lKCkKKyAgICAgICAgZCA9IGRpY3Qocm93KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbImEiXSwgcm93WyJhIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsiYiJdLCByb3dbImIiXSkKKworICAgIGRlZiBDaGVja1NxbGl0ZVJvd0hhc2hDbXAoc2VsZik6CisgICAgICAgICIiIkNoZWNrcyBpZiB0aGUgcm93IG9iamVjdCBjb21wYXJlcyBhbmQgaGFzaGVzIGNvcnJlY3RseSIiIgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IHNxbGl0ZS5Sb3cKKyAgICAgICAgcm93XzEgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCisgICAgICAgIHJvd18yID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IDEgYXMgYSwgMiBhcyBiIikuZmV0Y2hvbmUoKQorICAgICAgICByb3dfMyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxIGFzIGEsIDMgYXMgYiIpLmZldGNob25lKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUocm93XzEgPT0gcm93XzEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyb3dfMSA9PSByb3dfMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd18yICE9IHJvd18zKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzEgIT0gcm93XzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzEgIT0gcm93XzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocm93XzIgPT0gcm93XzMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dfMSwgcm93XzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChyb3dfMSksIGhhc2gocm93XzIpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJvd18xLCByb3dfMykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChoYXNoKHJvd18xKSwgaGFzaChyb3dfMykpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworY2xhc3MgVGV4dEZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgorICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLCkpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKworICAgIGRlZiBDaGVja1N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3RyCisgICAgICAgIGF1c3RyaWEgPSB1bmljb2RlKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyb3dbMF0pID09IHN0ciwgInR5cGUgb2Ygcm93WzBdIG11c3QgYmUgc3RyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd1swXSA9PSBhdXN0cmlhLmVuY29kZSgidXRmLTgiKSwgImNvbHVtbiBtdXN0IGVxdWFsIG9yaWdpbmFsIGRhdGEgaW4gVVRGLTgiKQorCisgICAgZGVmIENoZWNrQ3VzdG9tKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogdW5pY29kZSh4LCAidXRmLTgiLCAiaWdub3JlIikKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYS5lbmNvZGUoImxhdGluMSIpLCkpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSB1bmljb2RlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJvd1swXS5lbmRzd2l0aCh1InJlaWNoIiksICJjb2x1bW4gbXVzdCBjb250YWluIG9yaWdpbmFsIGRhdGEiKQorCisgICAgZGVmIENoZWNrT3B0aW1pemVkVW5pY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgZ2VybWFueSA9IHVuaWNvZGUoIkRldXRjaGxhbmQiKQorICAgICAgICBhX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBkX3JvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGdlcm1hbnksKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShhX3Jvd1swXSkgPT0gdW5pY29kZSwgInR5cGUgb2Ygbm9uLUFTQ0lJIHJvdyBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShkX3Jvd1swXSkgPT0gc3RyLCAidHlwZSBvZiBBU0NJSS1vbmx5IHJvdyBtdXN0IGJlIHN0ciIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworY2xhc3MgVGV4dEZhY3RvcnlUZXN0c1dpdGhFbWJlZGRlZFplcm9CeXRlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0ICh2YWx1ZSB0ZXh0KSIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QgKHZhbHVlKSB2YWx1ZXMgKD8pIiwgKCJhXHgwMGIiLCkpCisKKyAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CisgICAgICAgICMgdGV4dF9mYWN0b3J5IGRlZmF1bHRzIHRvIHVuaWNvZGUKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiYVx4MDBiIikKKworICAgIGRlZiBDaGVja0N1c3RvbShzZWxmKToKKyAgICAgICAgIyBBIGN1c3RvbSBmYWN0b3J5IHNob3VsZCByZWNlaXZlIGFuIHN0ciBhcmd1bWVudAorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBsYW1iZGEgeDogeAorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgdmFsdWUgZnJvbSB0ZXN0IikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydElzKHR5cGUocm93WzBdKSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImFceDAwYiIpCisKKyAgICBkZWYgQ2hlY2tPcHRpbWl6ZWRVbmljb2RlQXNTdHJpbmcoc2VsZik6CisgICAgICAgICMgQVNDSUkgLT4gc3RyIGFyZ3VtZW50CisgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IHNxbGl0ZS5PcHRpbWl6ZWRVbmljb2RlCisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCB2YWx1ZSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShyb3dbMF0pLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCAiYVx4MDBiIikKKworICAgIGRlZiBDaGVja09wdGltaXplZFVuaWNvZGVBc1VuaWNvZGUoc2VsZik6CisgICAgICAgICMgTm9uLUFTQ0lJIC0+IHVuaWNvZGUgYXJndW1lbnQKKyAgICAgICAgc2VsZi5jb24udGV4dF9mYWN0b3J5ID0gc3FsaXRlLk9wdGltaXplZFVuaWNvZGUKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QgKHZhbHVlKSB2YWx1ZXMgKD8pIiwgKHUn5Fww9icsKSkKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IHZhbHVlIGZyb20gdGVzdCIpLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKHJvd1swXSksIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB1IuRceDAw9iIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworZGVmIHN1aXRlKCk6CisgICAgY29ubmVjdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb25uZWN0aW9uRmFjdG9yeVRlc3RzLCAiQ2hlY2siKQorICAgIGN1cnNvcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDdXJzb3JGYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgcm93X3N1aXRlX2NvbXBhdCA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSb3dGYWN0b3J5VGVzdHNCYWNrd2FyZHNDb21wYXQsICJDaGVjayIpCisgICAgcm93X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0cywgIkNoZWNrIikKKyAgICB0ZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgdGV4dF96ZXJvX2J5dGVzX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRleHRGYWN0b3J5VGVzdHNXaXRoRW1iZWRkZWRaZXJvQnl0ZXMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29ubmVjdGlvbl9zdWl0ZSwgY3Vyc29yX3N1aXRlLCByb3dfc3VpdGVfY29tcGF0LCByb3dfc3VpdGUsIHRleHRfc3VpdGUsIHRleHRfemVyb19ieXRlc19zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHljIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyNjFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHlvIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyNjFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvaG9va3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJmYWUxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CkBAIC0wLDAgKzEsMjA3IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcworIworIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IG9zLCB1bml0dGVzdAoraW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2NsYXNzIENvbGxhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90Q2FsbGFibGUoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJYIiwgNDIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInBhcmFtZXRlciBtdXN0IGJlIGNhbGxhYmxlIikKKworICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdEFzY2lpKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiY29sbOQiLCBjbXApCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3IsIGU6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDb2xsYXRpb25Jc1VzZWQoc2VsZik6CisgICAgICAgIGlmIHNxbGl0ZS52ZXJzaW9uX2luZm8gPCAoMywgMiwgMSk6ICAjIG9sZCBTUUxpdGUgdmVyc2lvbnMgY3Jhc2ggb24gdGhpcyB0ZXN0CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKKyAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKworICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbXljb2xsKQorICAgICAgICBzcWwgPSAiIiIKKyAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKAorICAgICAgICAgICAgc2VsZWN0ICdhJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdiJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CisgICAgICAgICAgICApIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKKyAgICAgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKKyAgICAgICAgaWYgcmVzdWx0WzBdWzBdICE9ICJjIiBvciByZXN1bHRbMV1bMF0gIT0gImIiIG9yIHJlc3VsdFsyXVswXSAhPSAiYSI6CisgICAgICAgICAgICBzZWxmLmZhaWwoInRoZSBleHBlY3RlZCBvcmRlciB3YXMgbm90IHJldHVybmVkIikKKworICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0ubG93ZXIoKSwgIm5vIHN1Y2ggY29sbGF0aW9uIHNlcXVlbmNlOiBteWNvbGwiKQorCisgICAgZGVmIENoZWNrQ29sbGF0aW9uUmV0dXJuc0xhcmdlSW50ZWdlcihzZWxmKToKKyAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKKyAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgcmV0dXJuIC0oKHggPiB5KSAtICh4IDwgeSkpICogMioqMzIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIG15Y29sbCkKKyAgICAgICAgc3FsID0gIiIiCisgICAgICAgICAgICBzZWxlY3QgeCBmcm9tICgKKyAgICAgICAgICAgIHNlbGVjdCAnYScgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYicgYXMgeAorICAgICAgICAgICAgdW5pb24KKyAgICAgICAgICAgIHNlbGVjdCAnYycgYXMgeAorICAgICAgICAgICAgKSBvcmRlciBieSB4IGNvbGxhdGUgbXljb2xsCisgICAgICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbKCdjJywpLCAoJ2InLCksICgnYScsKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSJ0aGUgZXhwZWN0ZWQgb3JkZXIgd2FzIG5vdCByZXR1cm5lZCIpCisKKyAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZWdpc3RlclR3aWNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVnaXN0ZXIgdHdvIGRpZmZlcmVudCBjb2xsYXRpb24gZnVuY3Rpb25zIHVuZGVyIHRoZSBzYW1lIG5hbWUuCisgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBsYXN0IG9uZSBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGNtcCkKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGxhbWJkYSB4LCB5OiAtY21wKHgsIHkpKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKHNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHgpIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKKyAgICAgICAgICAgICIiIikuZmV0Y2hhbGwoKQorICAgICAgICBpZiByZXN1bHRbMF1bMF0gIT0gJ2InIG9yIHJlc3VsdFsxXVswXSAhPSAnYSc6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGNvbGxhdGlvbiBmdW5jdGlvbiBpcyB1c2VkIikKKworICAgIGRlZiBDaGVja0RlcmVnaXN0ZXJDb2xsYXRpb24oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZWdpc3RlciBhIGNvbGxhdGlvbiwgdGhlbiBkZXJlZ2lzdGVyIGl0LiBNYWtlIHN1cmUgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHdlIHRyeQorICAgICAgICB0byB1c2UgaXQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgY21wKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmV4ZWN1dGUoInNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHggb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5zdGFydHN3aXRoKCJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgT3BlcmF0aW9uYWxFcnJvciByYWlzZWQiKQorCitjbGFzcyBQcm9ncmVzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgQ2hlY2tQcm9ncmVzc0hhbmRsZXJVc2VkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGF0IHRoZSBwcm9ncmVzcyBoYW5kbGVyIGlzIGludm9rZWQgb25jZSBpdCBpcyBzZXQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCisgICAgICAgIGRlZiBwcm9ncmVzcygpOgorICAgICAgICAgICAgcHJvZ3Jlc3NfY2FsbHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCisgICAgICAgIGNvbi5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGZvbyhhLCBiKQorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3Jlc3NfY2FsbHMpCisKKworICAgIGRlZiBDaGVja09wY29kZUNvdW50KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVGVzdCB0aGF0IHRoZSBvcGNvZGUgYXJndW1lbnQgaXMgcmVzcGVjdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgcHJvZ3Jlc3NfY2FsbHMgPSBbXQorICAgICAgICBkZWYgcHJvZ3Jlc3MoKToKKyAgICAgICAgICAgIHByb2dyZXNzX2NhbGxzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgY29uLnNldF9wcm9ncmVzc19oYW5kbGVyKHByb2dyZXNzLCAxKQorICAgICAgICBjdXJzID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1cnMuZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSBmb28gKGEsIGIpCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGZpcnN0X2NvdW50ID0gbGVuKHByb2dyZXNzX2NhbGxzKQorICAgICAgICBwcm9ncmVzc19jYWxscyA9IFtdCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMikKKyAgICAgICAgY3Vycy5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGJhciAoYSwgYikKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2Vjb25kX2NvdW50ID0gbGVuKHByb2dyZXNzX2NhbGxzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlyc3RfY291bnQgPiBzZWNvbmRfY291bnQpCisKKyAgICBkZWYgQ2hlY2tDYW5jZWxPcGVyYXRpb24oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBUZXN0IHRoYXQgcmV0dXJuaW5nIGEgbm9uLXplcm8gdmFsdWUgc3RvcHMgdGhlIG9wZXJhdGlvbiBpbiBwcm9ncmVzcy4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHByb2dyZXNzX2NhbGxzID0gW10KKyAgICAgICAgZGVmIHByb2dyZXNzKCk6CisgICAgICAgICAgICBwcm9ncmVzc19jYWxscy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihwcm9ncmVzcywgMSkKKyAgICAgICAgY3VycyA9IGNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLAorICAgICAgICAgICAgY3Vycy5leGVjdXRlLAorICAgICAgICAgICAgImNyZWF0ZSB0YWJsZSBiYXIgKGEsIGIpIikKKworICAgIGRlZiBDaGVja0NsZWFySGFuZGxlcihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRlc3QgdGhhdCBzZXR0aW5nIHRoZSBwcm9ncmVzcyBoYW5kbGVyIHRvIE5vbmUgY2xlYXJzIHRoZSBwcmV2aW91c2x5IHNldCBoYW5kbGVyLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgYWN0aW9uID0gW10KKyAgICAgICAgZGVmIHByb2dyZXNzKCk6CisgICAgICAgICAgICBhY3Rpb24uYXBwZW5kKDEpCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBjb24uc2V0X3Byb2dyZXNzX2hhbmRsZXIocHJvZ3Jlc3MsIDEpCisgICAgICAgIGNvbi5zZXRfcHJvZ3Jlc3NfaGFuZGxlcihOb25lLCAxKQorICAgICAgICBjb24uZXhlY3V0ZSgic2VsZWN0IDEgdW5pb24gc2VsZWN0IDIgdW5pb24gc2VsZWN0IDMiKS5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFjdGlvbiksIDAsICJwcm9ncmVzcyBoYW5kbGVyIHdhcyBub3QgY2xlYXJlZCIpCisKK2RlZiBzdWl0ZSgpOgorICAgIGNvbGxhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xsYXRpb25UZXN0cywgIkNoZWNrIikKKyAgICBwcm9ncmVzc19zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShQcm9ncmVzc1Rlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGNvbGxhdGlvbl9zdWl0ZSwgcHJvZ3Jlc3Nfc3VpdGUpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9ob29rcy5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9ob29rcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmNWEwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9ob29rcy5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9ob29rcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmNWEwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L2hvb2tzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9weTI1dGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9weTI1dGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkM2MwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weQpAQCAtMCwwICsxLDgwIEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cworIworIyBDb3B5cmlnaHQgKEMpIDIwMDcgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNxbGl0ZTMgYXMgc3FsaXRlCisKK2RpZF9yb2xsYmFjayA9IEZhbHNlCisKK2NsYXNzIE15Q29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CisgICAgZGVmIHJvbGxiYWNrKHNlbGYpOgorICAgICAgICBnbG9iYWwgZGlkX3JvbGxiYWNrCisgICAgICAgIGRpZF9yb2xsYmFjayA9IFRydWUKKyAgICAgICAgc3FsaXRlLkNvbm5lY3Rpb24ucm9sbGJhY2soc2VsZikKKworY2xhc3MgQ29udGV4dFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGdsb2JhbCBkaWRfcm9sbGJhY2sKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBmYWN0b3J5PU15Q29ubmVjdGlvbikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoYyB1bmlxdWUpIikKKyAgICAgICAgZGlkX3JvbGxiYWNrID0gRmFsc2UKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrQ29udGV4dE1hbmFnZXIoc2VsZik6CisgICAgICAgICIiIkNhbiB0aGUgY29ubmVjdGlvbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyIGF0IGFsbD8iIiIKKyAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0NvbnRleHRNYW5hZ2VyQ29tbWl0KHNlbGYpOgorICAgICAgICAiIiJJcyBhIGNvbW1pdCBjYWxsZWQgaW4gdGhlIGNvbnRleHQgbWFuYWdlcj8iIiIKKyAgICAgICAgd2l0aCBzZWxmLmNvbjoKKyAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYykgdmFsdWVzICgnZm9vJykiKQorICAgICAgICBzZWxmLmNvbi5yb2xsYmFjaygpCisgICAgICAgIGNvdW50ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGNvdW50KCopIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgMSkKKworICAgIGRlZiBDaGVja0NvbnRleHRNYW5hZ2VyUm9sbGJhY2soc2VsZik6CisgICAgICAgICIiIklzIGEgcm9sbGJhY2sgY2FsbGVkIGluIHRoZSBjb250ZXh0IG1hbmFnZXI/IiIiCisgICAgICAgIGdsb2JhbCBkaWRfcm9sbGJhY2sKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWRfcm9sbGJhY2ssIEZhbHNlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuY29uOgorICAgICAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYykgdmFsdWVzICg0KSIpCisgICAgICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChjKSB2YWx1ZXMgKDQpIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWRfcm9sbGJhY2ssIFRydWUpCisKK2RlZiBzdWl0ZSgpOgorICAgIGN0eF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb250ZXh0VGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY3R4X3N1aXRlLCkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9weTI1dGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTc5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9weTI1dGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3B5MjV0ZXN0cy5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9weTI1dGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NTc5NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9weTI1dGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMzlkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CkBAIC0wLDAgKzEsMzI0IEBACisjLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvcmVncmVzc2lvbi5weTogcHlzcWxpdGUgcmVncmVzc2lvbiB0ZXN0cworIworIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitjbGFzcyBSZWdyZXNzaW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tQcmFnbWFVc2VyVmVyc2lvbihzZWxmKToKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gY3Jhc2ggcHlzcWxpdGUgYmVjYXVzZSB0aGlzIHByYWdtYSBjb21tYW5kIHJldHVybnMgTlVMTCBmb3IgdGhlIGNvbHVtbiBuYW1lCisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJwcmFnbWEgdXNlcl92ZXJzaW9uIikKKworICAgIGRlZiBDaGVja1ByYWdtYVNjaGVtYVZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGhpcyBzdGlsbCBjcmFzaGVkIHB5c3FsaXRlIDw9IDIuMi4xCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHNjaGVtYV92ZXJzaW9uIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGN1ci5jbG9zZSgpCisgICAgICAgICAgICBjb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3RhdGVtZW50UmVzZXQoc2VsZik6CisgICAgICAgICMgcHlzcWxpdGUgMi4xLjAgdG8gMi4yLjAgaGF2ZSB0aGUgcHJvYmxlbSB0aGF0IG5vdCBhbGwgc3RhdGVtZW50cyBhcmUKKyAgICAgICAgIyByZXNldCBiZWZvcmUgYSByb2xsYmFjaywgYnV0IG9ubHkgdGhvc2UgdGhhdCBhcmUgc3RpbGwgaW4gdGhlCisgICAgICAgICMgc3RhdGVtZW50IGNhY2hlLiBUaGUgb3RoZXJzIGFyZSBub3QgYWNjZXNzaWJsZSBmcm9tIHRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgY2FjaGVkX3N0YXRlbWVudHM9NSkKKyAgICAgICAgY3Vyc29ycyA9IFtjb24uY3Vyc29yKCkgZm9yIHggaW4geHJhbmdlKDUpXQorICAgICAgICBjdXJzb3JzWzBdLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHgpIikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgY3Vyc29yc1swXS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgWyh4LCkgZm9yIHggaW4geHJhbmdlKDEwKV0pCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBjdXJzb3JzW2ldLmV4ZWN1dGUoIiAiICogaSArICJzZWxlY3QgeCBmcm9tIHRlc3QiKQorCisgICAgICAgIGNvbi5yb2xsYmFjaygpCisKKyAgICBkZWYgQ2hlY2tDb2x1bW5OYW1lV2l0aFNwYWNlcyhzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoJ3NlbGVjdCAxIGFzICJmb28gYmFyIFtkYXRldGltZV0iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmFyIikKKworICAgICAgICBjdXIuZXhlY3V0ZSgnc2VsZWN0IDEgYXMgImZvbyBiYXoiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdXIuZGVzY3JpcHRpb25bMF1bMF0sICJmb28gYmF6IikKKworICAgIGRlZiBDaGVja1N0YXRlbWVudEZpbmFsaXphdGlvbk9uQ2xvc2VEYihzZWxmKToKKyAgICAgICAgIyBweXNxbGl0ZSB2ZXJzaW9ucyA8PSAyLjMuMyBvbmx5IGZpbmFsaXplZCBzdGF0ZW1lbnRzIGluIHRoZSBzdGF0ZW1lbnQKKyAgICAgICAgIyBjYWNoZSB3aGVuIGNsb3NpbmcgdGhlIGRhdGFiYXNlLiBzdGF0ZW1lbnRzIHRoYXQgd2VyZSBzdGlsbAorICAgICAgICAjIHJlZmVyZW5jZWQgaW4gY3Vyc29ycyB3ZXJlbid0IGNsb3NlZCBhbiBjb3VsZCBwcm92b2tlICIKKyAgICAgICAgIyAiT3BlcmF0aW9uYWxFcnJvcjogVW5hYmxlIHRvIGNsb3NlIGR1ZSB0byB1bmZpbmFsaXNlZCBzdGF0ZW1lbnRzIi4KKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3Vyc29ycyA9IFtdCisgICAgICAgICMgZGVmYXVsdCBzdGF0ZW1lbnQgY2FjaGUgc2l6ZSBpcyAxMDAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTA1KToKKyAgICAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICAgICAgY3Vyc29ycy5hcHBlbmQoY3VyKQorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCAxIHggdW5pb24gc2VsZWN0ICIgKyBzdHIoaSkpCisgICAgICAgIGNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tPbkNvbmZsaWN0Um9sbGJhY2soc2VsZik6CisgICAgICAgIGlmIHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDIsIDIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKHgsIHVuaXF1ZSh4KSBvbiBjb25mbGljdCByb2xsYmFjaykiKQorICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoMSkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uZXhlY3V0ZSgiaW5zZXJ0IGludG8gZm9vKHgpIHZhbHVlcyAoMSkiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNvbi5leGVjdXRlKCJpbnNlcnQgaW50byBmb28oeCkgdmFsdWVzICgyKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jb21taXQoKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoInB5c3FsaXRlIGtuZXcgbm90aGluZyBhYm91dCB0aGUgaW1wbGljaXQgUk9MTEJBQ0siKQorCisgICAgZGVmIENoZWNrV29ya2Fyb3VuZEZvckJ1Z2d5U3FsaXRlVHJhbnNmZXJCaW5kaW5ncyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHB5c3FsaXRlIHdvdWxkIGNyYXNoIHdpdGggb2xkZXIgU1FMaXRlIHZlcnNpb25zIHVubGVzcworICAgICAgICBhIHdvcmthcm91bmQgaXMgaW1wbGVtZW50ZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJjcmVhdGUgdGFibGUgZm9vKGJhcikiKQorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJkcm9wIHRhYmxlIGZvbyIpCisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyKSIpCisKKyAgICBkZWYgQ2hlY2tFbXB0eVN0YXRlbWVudChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHB5c3FsaXRlIHVzZWQgdG8gc2VnZmF1bHQgd2l0aCBTUUxpdGUgdmVyc2lvbnMgMy41LnguIFRoZXNlIHJldHVybiBOVUxMCisgICAgICAgIGZvciAibm8tb3BlcmF0aW9uIiBzdGF0ZW1lbnRzCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCIiKQorCisgICAgZGVmIENoZWNrVW5pY29kZUNvbm5lY3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBXaXRoIHB5c3FsaXRlIDIuNC4wIHlvdSBuZWVkZWQgdG8gdXNlIGEgc3RyaW5nIG9yIGEgQVBTVyBjb25uZWN0aW9uCisgICAgICAgIG9iamVjdCBmb3Igb3BlbmluZyBkYXRhYmFzZSBjb25uZWN0aW9ucy4KKworICAgICAgICBGb3JtZXJseSwgYm90aCBieXRlc3RyaW5ncyBhbmQgdW5pY29kZSBzdHJpbmdzIHVzZWQgdG8gd29yay4KKworICAgICAgICBMZXQncyBtYWtlIHN1cmUgdW5pY29kZSBzdHJpbmdzIHdvcmsgaW4gdGhlIGZ1dHVyZS4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KHUiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrVHlwZU1hcFVzYWdlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcHlzcWxpdGUgdW50aWwgMi40LjEgZGlkIG5vdCByZWJ1aWxkIHRoZSByb3dfY2FzdF9tYXAgd2hlbiByZWNvbXBpbGluZworICAgICAgICBhIHN0YXRlbWVudC4gVGhpcyB0ZXN0IGV4aGliaXRzIHRoZSBwcm9ibGVtLgorICAgICAgICAiIiIKKyAgICAgICAgU0VMRUNUID0gInNlbGVjdCAqIGZyb20gZm9vIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQorICAgICAgICBjb24uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIGZvbyhiYXIgdGltZXN0YW1wKSIpCisgICAgICAgIGNvbi5leGVjdXRlKCJpbnNlcnQgaW50byBmb28oYmFyKSB2YWx1ZXMgKD8pIiwgKGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpLCkpCisgICAgICAgIGNvbi5leGVjdXRlKFNFTEVDVCkKKyAgICAgICAgY29uLmV4ZWN1dGUoImRyb3AgdGFibGUgZm9vIikKKyAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyIGludGVnZXIpIikKKyAgICAgICAgY29uLmV4ZWN1dGUoImluc2VydCBpbnRvIGZvbyhiYXIpIHZhbHVlcyAoNSkiKQorICAgICAgICBjb24uZXhlY3V0ZShTRUxFQ1QpCisKKyAgICBkZWYgQ2hlY2tSZWdpc3RlckFkYXB0ZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZWUgaXNzdWUgMzMxMi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3FsaXRlLnJlZ2lzdGVyX2FkYXB0ZXIsIHt9LCBOb25lKQorCisgICAgZGVmIENoZWNrU2V0SXNvbGF0aW9uTGV2ZWwoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBTZWUgaXNzdWUgMzMxMi4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc2V0YXR0ciwgY29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNvbGF0aW9uX2xldmVsIiwgdSJceGU5IikKKworICAgIGRlZiBDaGVja0N1cnNvckNvbnN0cnVjdG9yQ2FsbENoZWNrKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVmVyaWZpZXMgdGhhdCBjdXJzb3IgbWV0aG9kcyBjaGVjayB3ZXRoZXIgYmFzZSBjbGFzcyBfX2luaXRfXyB3YXMgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQ3Vyc29yKHNxbGl0ZS5DdXJzb3IpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IEN1cnNvcihjb24pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCs1IikuZmV0Y2hhbGwoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tDb25uZWN0aW9uQ29uc3RydWN0b3JDYWxsQ2hlY2soc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBWZXJpZmllcyB0aGF0IGNvbm5lY3Rpb24gbWV0aG9kcyBjaGVjayB3ZXRoZXIgYmFzZSBjbGFzcyBfX2luaXRfXyB3YXMgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgY2xhc3MgQ29ubmVjdGlvbihzcWxpdGUuQ29ubmVjdGlvbik6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNvbiA9IENvbm5lY3Rpb24oIjptZW1vcnk6IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0N1cnNvclJlZ2lzdHJhdGlvbihzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFZlcmlmaWVzIHRoYXQgc3ViY2xhc3NlZCBjdXJzb3IgY2xhc3NlcyBhcmUgY29ycmVjdGx5IHJlZ2lzdGVyZWQgd2l0aAorICAgICAgICB0aGUgY29ubmVjdGlvbiBvYmplY3QsIHRvby4gIChmZXRjaC1hY3Jvc3Mtcm9sbGJhY2sgcHJvYmxlbSkKKyAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIENvbm5lY3Rpb24oc3FsaXRlLkNvbm5lY3Rpb24pOgorICAgICAgICAgICAgZGVmIGN1cnNvcihzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gQ3Vyc29yKHNlbGYpCisKKyAgICAgICAgY2xhc3MgQ3Vyc29yKHNxbGl0ZS5DdXJzb3IpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbik6CisgICAgICAgICAgICAgICAgc3FsaXRlLkN1cnNvci5fX2luaXRfXyhzZWxmLCBjb24pCisKKyAgICAgICAgY29uID0gQ29ubmVjdGlvbigiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oeCkiKQorICAgICAgICBjdXIuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIGZvbyh4KSB2YWx1ZXMgKD8pIiwgWygzLCksICg0LCksICg1LCldKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHggZnJvbSBmb28iKQorICAgICAgICBjb24ucm9sbGJhY2soKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZmV0Y2hhbGwoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgSW50ZXJmYWNlRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBJbnRlcmZhY2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tBdXRvQ29tbWl0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVmVyaWZpZXMgdGhhdCBjcmVhdGluZyBhIGNvbm5lY3Rpb24gaW4gYXV0b2NvbW1pdCBtb2RlIHdvcmtzLgorICAgICAgICAyLjUuMyBpbnRyb2R1Y2VkIGEgcmVncmVzc2lvbiBzbyB0aGF0IHRoZXNlIGNvdWxkIG5vIGxvbmdlcgorICAgICAgICBiZSBjcmVhdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgaXNvbGF0aW9uX2xldmVsPU5vbmUpCisKKyAgICBkZWYgQ2hlY2tQcmFnbWFBdXRvY29tbWl0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgVmVyaWZpZXMgdGhhdCBydW5uaW5nIGEgUFJBR01BIHN0YXRlbWVudCB0aGF0IGRvZXMgYW4gYXV0b2NvbW1pdCBkb2VzCisgICAgICAgIHdvcmsuIFRoaXMgZGlkIG5vdCB3b3JrIGluIDIuNS4zLzIuNS40LgorICAgICAgICAiIiIKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBmb28oYmFyKSIpCisgICAgICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byBmb28oYmFyKSB2YWx1ZXMgKDUpIikKKworICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHBhZ2Vfc2l6ZSIpCisgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisKKyAgICBkZWYgQ2hlY2tTZXREaWN0KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3NDc4CisKKyAgICAgICAgSXQgd2FzIHBvc3NpYmxlIHRvIHN1Y2Nlc3NmdWxseSByZWdpc3RlciBjYWxsYmFja3MgdGhhdCBjb3VsZCBub3QgYmUKKyAgICAgICAgaGFzaGVkLiBSZXR1cm4gY29kZXMgb2YgUHlEaWN0X1NldEl0ZW0gd2VyZSBub3QgY2hlY2tlZCBwcm9wZXJseS4KKyAgICAgICAgIiIiCisgICAgICAgIGNsYXNzIE5vdEhhc2hhYmxlOgorICAgICAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCkKKyAgICAgICAgdmFyID0gTm90SGFzaGFibGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbiwgdmFyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUsIHZhcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmNvbi5zZXRfYXV0aG9yaXplciwgdmFyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuY29uLnNldF9wcm9ncmVzc19oYW5kbGVyLCB2YXIpCisKKyAgICBkZWYgQ2hlY2tDb25uZWN0aW9uQ2FsbChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIENhbGwgYSBjb25uZWN0aW9uIHdpdGggYSBub24tc3RyaW5nIFNRTCByZXF1ZXN0OiBjaGVjayBlcnJvciBoYW5kbGluZworICAgICAgICBvZiB0aGUgc3RhdGVtZW50IGNvbnN0cnVjdG9yLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3FsaXRlLldhcm5pbmcsIHNlbGYuY29uLCAxKQorCisgICAgZGVmIENoZWNrUmVjdXJzaXZlQ3Vyc29yVXNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwODExCisKKyAgICAgICAgUmVjdXJzaXZlbHkgdXNpbmcgYSBjdXJzb3IsIHN1Y2ggYXMgd2hlbiByZXVzaW5nIGl0IGZyb20gYSBnZW5lcmF0b3IgbGVkIHRvIHNlZ2ZhdWx0cy4KKyAgICAgICAgTm93IHdlIGNhdGNoIHJlY3Vyc2l2ZSBjdXJzb3IgdXNhZ2UgYW5kIHJhaXNlIGEgUHJvZ3JhbW1pbmdFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgYSAoYmFyKSIpCisgICAgICAgIGN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgYiAoYmF6KSIpCisKKyAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIGEgKGJhcikgdmFsdWVzICg/KSIsICgxLCkpCisgICAgICAgICAgICB5aWVsZCAxCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcik6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIGIgKGJheikgdmFsdWVzICg/KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChpLCkgZm9yIGkgaW4gZm9vKCkpKQorCisgICAgZGVmIENoZWNrQ29udmVydFRpbWVzdGFtcE1pY3Jvc2Vjb25kUGFkZGluZyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNDcyMAorCisgICAgICAgIFRoZSBtaWNyb3NlY29uZCBwYXJzaW5nIG9mIGNvbnZlcnRfdGltZXN0YW1wKCkgc2hvdWxkIHBhZCB3aXRoIHplcm9zLAorICAgICAgICBzaW5jZSB0aGUgbWljcm9zZWNvbmQgc3RyaW5nICI0NTYiIGFjdHVhbGx5IHJlcHJlc2VudHMgIjQ1NjAwMCIuCisgICAgICAgICIiIgorCisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfREVDTFRZUEVTKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoIkNSRUFURSBUQUJMRSB0ICh4IFRJTUVTVEFNUCkiKQorCisgICAgICAgICMgTWljcm9zZWNvbmRzIHNob3VsZCBiZSA0NTYwMDAKKyAgICAgICAgY3VyLmV4ZWN1dGUoIklOU0VSVCBJTlRPIHQgKHgpIFZBTFVFUyAoJzIwMTItMDQtMDQgMTU6MDY6MDAuNDU2JykiKQorCisgICAgICAgICMgTWljcm9zZWNvbmRzIHNob3VsZCBiZSB0cnVuY2F0ZWQgdG8gMTIzNDU2CisgICAgICAgIGN1ci5leGVjdXRlKCJJTlNFUlQgSU5UTyB0ICh4KSBWQUxVRVMgKCcyMDEyLTA0LTA0IDE1OjA2OjAwLjEyMzQ1Njc4OScpIikKKworICAgICAgICBjdXIuZXhlY3V0ZSgiU0VMRUNUICogRlJPTSB0IikKKyAgICAgICAgdmFsdWVzID0gW3hbMF0gZm9yIHggaW4gY3VyLmZldGNoYWxsKCldCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIFsKKyAgICAgICAgICAgIGRhdGV0aW1lLmRhdGV0aW1lKDIwMTIsIDQsIDQsIDE1LCA2LCAwLCA0NTYwMDApLAorICAgICAgICAgICAgZGF0ZXRpbWUuZGF0ZXRpbWUoMjAxMiwgNCwgNCwgMTUsIDYsIDAsIDEyMzQ1NiksCisgICAgICAgIF0pCisKKworZGVmIHN1aXRlKCk6CisgICAgcmVncmVzc2lvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShSZWdyZXNzaW9uVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgocmVncmVzc2lvbl9zdWl0ZSwpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5YyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTU1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5byBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MTU1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczMjI1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQpAQCAtMCwwICsxLDIwNSBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L3RyYW5zYWN0aW9ucy5weTogdGVzdHMgdHJhbnNhY3Rpb25zCisjCisjIENvcHlyaWdodCAoQykgMjAwNS0yMDA3IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MsIHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworZGVmIGdldF9kYl9wYXRoKCk6CisgICAgcmV0dXJuICJzcWxpdGVfdGVzdGRiIgorCitjbGFzcyBUcmFuc2FjdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShnZXRfZGJfcGF0aCgpKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmNvbjEgPSBzcWxpdGUuY29ubmVjdChnZXRfZGJfcGF0aCgpLCB0aW1lb3V0PTAuMSkKKyAgICAgICAgc2VsZi5jdXIxID0gc2VsZi5jb24xLmN1cnNvcigpCisKKyAgICAgICAgc2VsZi5jb24yID0gc3FsaXRlLmNvbm5lY3QoZ2V0X2RiX3BhdGgoKSwgdGltZW91dD0wLjEpCisgICAgICAgIHNlbGYuY3VyMiA9IHNlbGYuY29uMi5jdXJzb3IoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbjEuY2xvc2UoKQorCisgICAgICAgIHNlbGYuY3VyMi5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uMi5jbG9zZSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKGdldF9kYl9wYXRoKCkpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRE1MZG9lc0F1dG9Db21taXRCZWZvcmUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QyKGopIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisKKyAgICBkZWYgQ2hlY2tJbnNlcnRTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAwKQorCisgICAgZGVmIENoZWNrVXBkYXRlU3RhcnRzVHJhbnNhY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmNvbjEuY29tbWl0KCkKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoInVwZGF0ZSB0ZXN0IHNldCBpPTYiKQorICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIDUpCisKKyAgICBkZWYgQ2hlY2tEZWxldGVTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5jb21taXQoKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorCisgICAgZGVmIENoZWNrUmVwbGFjZVN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJyZXBsYWNlIGludG8gdGVzdChpKSB2YWx1ZXMgKDYpIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzBdWzBdLCA1KQorCisgICAgZGVmIENoZWNrVG9nZ2xlQXV0b0NvbW1pdChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCwgTm9uZSkKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisKKyAgICAgICAgc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCA9ICJERUZFUlJFRCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbjEuaXNvbGF0aW9uX2xldmVsICwgIkRFRkVSUkVEIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAxKQorCisgICAgZGVmIENoZWNrUmFpc2VUaW1lb3V0KHNlbGYpOgorICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAyLCAyKToKKyAgICAgICAgICAgICMgVGhpcyB3aWxsIGZhaWwgKGhhbmcpIG9uIGVhcmxpZXIgdmVyc2lvbnMgb2Ygc3FsaXRlLgorICAgICAgICAgICAgIyBEZXRlcm1pbmUgZXhhY3QgdmVyc2lvbiBpdCB3YXMgZml4ZWQuIDMuMi4xIGhhbmdzLgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorCisgICAgZGVmIENoZWNrTG9ja2luZyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFRoaXMgdGVzdHMgdGhlIGltcHJvdmVkIGNvbmN1cnJlbmN5IHdpdGggcHlzcWxpdGUgMi4zLjQuIFlvdSBuZWVkZWQKKyAgICAgICAgdG8gcm9sbCBiYWNrIGNvbjIgYmVmb3JlIHlvdSBjb3VsZCBjb21taXQgY29uMS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDIsIDIpOgorICAgICAgICAgICAgIyBUaGlzIHdpbGwgZmFpbCAoaGFuZykgb24gZWFybGllciB2ZXJzaW9ucyBvZiBzcWxpdGUuCisgICAgICAgICAgICAjIERldGVybWluZSBleGFjdCB2ZXJzaW9uIGl0IHdhcyBmaXhlZC4gMy4yLjEgaGFuZ3MuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgICMgTk8gc2VsZi5jb24yLnJvbGxiYWNrKCkgSEVSRSEhIQorICAgICAgICBzZWxmLmNvbjEuY29tbWl0KCkKKworICAgIGRlZiBDaGVja1JvbGxiYWNrQ3Vyc29yQ29uc2lzdGVuY3koc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBDaGVja3MgaWYgY3Vyc29ycyBvbiB0aGUgY29ubmVjdGlvbiBhcmUgc2V0IGludG8gYSAicmVzZXQiIHN0YXRlCisgICAgICAgIHdoZW4gYSByb2xsYmFjayBpcyBkb25lIG9uIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdCh4KSIpCisgICAgICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoNSkiKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IDEgdW5pb24gc2VsZWN0IDIgdW5pb24gc2VsZWN0IDMiKQorCisgICAgICAgIGNvbi5yb2xsYmFjaygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5mZXRjaGFsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkludGVyZmFjZUVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlcmZhY2VFcnJvciwgZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJJbnRlcmZhY2VFcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCIpCisKK2NsYXNzIFNwZWNpYWxDb21tYW5kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisKKyAgICBkZWYgQ2hlY2tWYWN1dW0oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgidmFjdXVtIikKKworICAgIGRlZiBDaGVja0Ryb3BUYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJkcm9wIHRhYmxlIHRlc3QiKQorCisgICAgZGVmIENoZWNrUHJhZ21hKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInByYWdtYSBjb3VudF9jaGFuZ2VzPTEiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworZGVmIHN1aXRlKCk6CisgICAgZGVmYXVsdF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShUcmFuc2FjdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIHNwZWNpYWxfY29tbWFuZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShTcGVjaWFsQ29tbWFuZFRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGRlZmF1bHRfc3VpdGUsIHNwZWNpYWxfY29tbWFuZF9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZGE2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZGE2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVhYjM5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CkBAIC0wLDAgKzEsNDE4IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvdHlwZXMucHk6IHRlc3RzIGZvciB0eXBlIGNvbnZlcnNpb24gYW5kIGRldGVjdGlvbgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQordHJ5OgorICAgIGltcG9ydCB6bGliCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgemxpYiA9IE5vbmUKKworCitjbGFzcyBTcWxpdGVUeXBlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkgaW50ZWdlciwgcyB2YXJjaGFyLCBmIG51bWJlciwgYiBibG9iKSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAodSLWc3RlcnJlaWNoIiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgcyBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB1ItZzdGVycmVpY2giKQorCisgICAgZGVmIENoZWNrU21hbGxJbnQoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsICg0MiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCA0MikKKworICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgorICAgICAgICBudW0gPSAyKio0MAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAobnVtLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIG51bSkKKworICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgorICAgICAgICB2YWwgPSAzLjE0CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGYgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrQmxvYihzZWxmKToKKyAgICAgICAgdmFsID0gYnVmZmVyKCJHdWdsaHVwZiIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdmFsKQorCisgICAgZGVmIENoZWNrVW5pY29kZUV4ZWN1dGUoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUodSJzZWxlY3QgJ9ZzdGVycmVpY2gnIikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgdSLWc3RlcnJlaWNoIikKKworICAgIGRlZiBDaGVja05vblV0ZjhfRGVmYXVsdChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoY2hyKDE1MCksKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja05vblV0ZjhfVGV4dEZhY3RvcnlTdHJpbmcoc2VsZik6CisgICAgICAgIG9yaWdfdGV4dF9mYWN0b3J5ID0gc2VsZi5jb24udGV4dF9mYWN0b3J5CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IHN0cgorICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoY2hyKDE1MCksKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IG9yaWdfdGV4dF9mYWN0b3J5CisKKyAgICBkZWYgQ2hlY2tOb25VdGY4X1RleHRGYWN0b3J5T3B0aW1pemVkVW5pY29kZShzZWxmKToKKyAgICAgICAgb3JpZ190ZXh0X2ZhY3RvcnkgPSBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IHNxbGl0ZS5PcHRpbWl6ZWRVbmljb2RlCisgICAgICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoY2hyKDE1MCksKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IG9yaWdfdGV4dF9mYWN0b3J5CisKK2NsYXNzIERlY2xUeXBlc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBjbGFzcyBGb286CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfdmFsKToKKyAgICAgICAgICAgIHNlbGYudmFsID0gX3ZhbAorCisgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBEZWNsVHlwZXNUZXN0cy5Gb28pOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGlmIHNlbGYudmFsID09IG90aGVyLnZhbDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGRlZiBfX2NvbmZvcm1fXyhzZWxmLCBwcm90b2NvbCk6CisgICAgICAgICAgICBpZiBwcm90b2NvbCBpcyBzcWxpdGUuUHJlcGFyZVByb3RvY29sOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICI8JXM+IiAlIHNlbGYudmFsCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSBpbnQsIHMgc3RyLCBmIGZsb2F0LCBiIGJvb2wsIHUgdW5pY29kZSwgZm9vIGZvbywgYmluIGJsb2IsIG4xIG51bWJlciwgbjIgbnVtYmVyKDUpKSIpCisKKyAgICAgICAgIyBvdmVycmlkZSBmbG9hdCwgbWFrZSB0aGVtIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgbnVtYmVyCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGTE9BVCJdID0gbGFtYmRhIHg6IDQ3LjIKKworICAgICAgICAjIGFuZCBpbXBsZW1lbnQgdHdvIGN1c3RvbSBvbmVzCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCT09MIl0gPSBsYW1iZGEgeDogYm9vbChpbnQoeCkpCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXSA9IERlY2xUeXBlc1Rlc3RzLkZvbworICAgICAgICBzcWxpdGUuY29udmVydGVyc1siV1JPTkciXSA9IGxhbWJkYSB4OiAiV1JPTkciCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJOVU1CRVIiXSA9IGZsb2F0CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRkxPQVQiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJPT0wiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siTlVNQkVSIl0KKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgnc2VsZWN0IHMgYXMgInMgW1dST05HXSIgZnJvbSB0ZXN0JykKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgImZvbyIpCisKKyAgICBkZWYgQ2hlY2tTbWFsbEludChzZWxmKToKKyAgICAgICAgIyBkZWZhdWx0CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsICg0MiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCA0MikKKworICAgIGRlZiBDaGVja0xhcmdlSW50KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgbnVtID0gMioqNDAKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgKG51bSwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCBudW0pCisKKyAgICBkZWYgQ2hlY2tGbG9hdChzZWxmKToKKyAgICAgICAgIyBjdXN0b20KKyAgICAgICAgdmFsID0gMy4xNAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIDQ3LjIpCisKKyAgICBkZWYgQ2hlY2tCb29sKHNlbGYpOgorICAgICAgICAjIGN1c3RvbQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGIpIHZhbHVlcyAoPykiLCAoRmFsc2UsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvd1swXSwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYikgdmFsdWVzICg/KSIsIChUcnVlLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIFRydWUpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgdmFsID0gdSJceGQ2c3RlcnJlaWNoIgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHUpIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB1IGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKKworICAgIGRlZiBDaGVja0ZvbyhzZWxmKToKKyAgICAgICAgdmFsID0gRGVjbFR5cGVzVGVzdHMuRm9vKCJibGEiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tVbnN1cHBvcnRlZFNlcShzZWxmKToKKyAgICAgICAgY2xhc3MgQmFyOiBwYXNzCisgICAgICAgIHZhbCA9IEJhcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEludGVyZmFjZUVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5JbnRlcmZhY2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorCisgICAgZGVmIENoZWNrVW5zdXBwb3J0ZWREaWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBCYXI6IHBhc3MKKyAgICAgICAgdmFsID0gQmFyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKDp2YWwpIiwgeyJ2YWwiOiB2YWx9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tCbG9iKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgdmFsID0gYnVmZmVyKCJHdWdsaHVwZiIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoYmluKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgYmluIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3dbMF0sIHZhbCkKKworICAgIGRlZiBDaGVja051bWJlcjEoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobjEpIHZhbHVlcyAoNSkiKQorICAgICAgICB2YWx1ZSA9IHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuMSBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCisgICAgICAgICMgaWYgdGhlIGNvbnZlcnRlciBpcyBub3QgdXNlZCwgaXQncyBhbiBpbnQgaW5zdGVhZCBvZiBhIGZsb2F0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGZsb2F0KQorCisgICAgZGVmIENoZWNrTnVtYmVyMihzZWxmKToKKyAgICAgICAgIiIiQ2hlY2tzIHdldGhlciBjb252ZXJ0ZXIgbmFtZXMgYXJlIGN1dCBvZmYgYXQgJygnIGNoYXJhY3RlcnMiIiIKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuMikgdmFsdWVzICg1KSIpCisgICAgICAgIHZhbHVlID0gc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IG4yIGZyb20gdGVzdCIpLmZldGNob25lKClbMF0KKyAgICAgICAgIyBpZiB0aGUgY29udmVydGVyIGlzIG5vdCB1c2VkLCBpdCdzIGFuIGludCBpbnN0ZWFkIG9mIGEgZmxvYXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHZhbHVlKSwgZmxvYXQpCisKK2NsYXNzIENvbE5hbWVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0NPTE5BTUVTKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KHggZm9vKSIpCisKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkZPTyJdID0gbGFtYmRhIHg6ICJbJXNdIiAlIHgKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkJBUiJdID0gbGFtYmRhIHg6ICI8JXM+IiAlIHgKKyAgICAgICAgc3FsaXRlLmNvbnZlcnRlcnNbIkVYQyJdID0gbGFtYmRhIHg6IDUgLy8gMAorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siQjFCMSJdID0gbGFtYmRhIHg6ICJNQVJLRVIiCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRk9PIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkVYQyJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siQjFCMSJdCisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrRGVjbFR5cGVOb3RVc2VkKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQXNzdXJlcyB0aGF0IHRoZSBkZWNsYXJlZCB0eXBlIGlzIG5vdCB1c2VkIHdoZW4gUEFSU0VfREVDTFRZUEVTCisgICAgICAgIGlzIG5vdCBzZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCAoInh4eCIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHggZnJvbSB0ZXN0IikKKyAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgInh4eCIpCisKKyAgICBkZWYgQ2hlY2tOb25lKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHgpIHZhbHVlcyAoPykiLCAoTm9uZSwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgeCBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrQ29sTmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCB4IGFzICJ4IFtiYXJdIiBmcm9tIHRlc3QnKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAiPHh4eD4iKQorCisgICAgICAgICMgQ2hlY2sgaWYgdGhlIHN0cmlwcGluZyBvZiBjb2xuYW1lcyB3b3Jrcy4gRXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QKKyAgICAgICAgIyB3aGl0ZXNwYWNlIHNob3VsZCBiZSBzdHJpcHBlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1ci5kZXNjcmlwdGlvblswXVswXSwgIngiKQorCisgICAgZGVmIENoZWNrQ2FzZUluQ29udmVydGVyTmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiIiJzZWxlY3QgJ290aGVyJyBhcyAieCBbYjFiMV1cIiIiIikKKyAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgIk1BUktFUiIpCisKKyAgICBkZWYgQ2hlY2tDdXJzb3JEZXNjcmlwdGlvbk5vUm93KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgY3Vyc29yLmRlc2NyaXB0aW9uIHNob3VsZCBhdCBsZWFzdCBwcm92aWRlIHRoZSBjb2x1bW4gbmFtZShzKSwgZXZlbiBpZgorICAgICAgICBubyByb3cgcmV0dXJuZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHRlc3Qgd2hlcmUgMCA9IDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAieCIpCisKK2NsYXNzIE9iamVjdEFkYXB0YXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNhc3Qob2JqKToKKyAgICAgICAgcmV0dXJuIGZsb2F0KG9iaikKKyAgICBjYXN0ID0gc3RhdGljbWV0aG9kKGNhc3QpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNxbGl0ZS5hZGFwdGVyc1tpbnRdCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc3FsaXRlLnJlZ2lzdGVyX2FkYXB0ZXIoaW50LCBPYmplY3RBZGFwdGF0aW9uVGVzdHMuY2FzdCkKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBkZWwgc3FsaXRlLmFkYXB0ZXJzWyhpbnQsIHNxbGl0ZS5QcmVwYXJlUHJvdG9jb2wpXQorICAgICAgICBzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja0Nhc3RlcklzVXNlZChzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0ID8iLCAoNCwpKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorY2xhc3MgQmluYXJ5Q29udmVydGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjb252ZXJ0KHMpOgorICAgICAgICByZXR1cm4gemxpYi5kZWNvbXByZXNzKHMpCisgICAgY29udmVydCA9IHN0YXRpY21ldGhvZChjb252ZXJ0KQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVMpCisgICAgICAgIHNxbGl0ZS5yZWdpc3Rlcl9jb252ZXJ0ZXIoImJpbiIsIEJpbmFyeUNvbnZlcnRlclRlc3RzLmNvbnZlcnQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja0JpbmFyeUlucHV0Rm9yQ29udmVydGVyKHNlbGYpOgorICAgICAgICB0ZXN0ZGF0YSA9ICJhYmNkZWZnIiAqIDEwCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uLmV4ZWN1dGUoJ3NlbGVjdCA/IGFzICJ4IFtiaW5dIicsIChidWZmZXIoemxpYi5jb21wcmVzcyh0ZXN0ZGF0YSkpLCkpLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZGF0YSwgcmVzdWx0KQorCitjbGFzcyBEYXRlVGltZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZCBkYXRlLCB0cyB0aW1lc3RhbXApIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVEYXRlKHNlbGYpOgorICAgICAgICBkID0gc3FsaXRlLkRhdGUoMjAwNCwgMiwgMTQpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZCkgdmFsdWVzICg/KSIsIChkLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBkIGZyb20gdGVzdCIpCisgICAgICAgIGQyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQyKQorCisgICAgZGVmIENoZWNrU3FsaXRlVGltZXN0YW1wKHNlbGYpOgorICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKD8pIiwgKHRzLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQorICAgICAgICB0czIgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMsIHRzMikKKworICAgIGRlZiBDaGVja1NxbFRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgIyBUaGUgZGF0ZSBmdW5jdGlvbnMgYXJlIG9ubHkgYXZhaWxhYmxlIGluIFNRTGl0ZSB2ZXJzaW9uIDMuMSBvciBsYXRlcgorICAgICAgICBpZiBzcWxpdGUuc3FsaXRlX3ZlcnNpb25faW5mbyA8ICgzLCAxKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgU1FMaXRlJ3MgY3VycmVudF90aW1lc3RhbXAgdXNlcyBVVEMgdGltZSwgd2hpbGUgZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkgdXNlcyBsb2NhbCB0aW1lLgorICAgICAgICBub3cgPSBkYXRldGltZS5kYXRldGltZS5ub3coKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHRzKSB2YWx1ZXMgKGN1cnJlbnRfdGltZXN0YW1wKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB0cyBmcm9tIHRlc3QiKQorICAgICAgICB0cyA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHRzKSwgZGF0ZXRpbWUuZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMueWVhciwgbm93LnllYXIpCisKKyAgICBkZWYgQ2hlY2tEYXRlVGltZVN1YlNlY29uZHMoc2VsZik6CisgICAgICAgIHRzID0gc3FsaXRlLlRpbWVzdGFtcCgyMDA0LCAyLCAxNCwgNywgMTUsIDAsIDUwMDAwMCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKKyAgICAgICAgdHMyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLCB0czIpCisKKyAgICBkZWYgQ2hlY2tEYXRlVGltZVN1YlNlY29uZHNGbG9hdGluZ1BvaW50KHNlbGYpOgorICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwLCA1MTAyNDEpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCisgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cywgdHMyKQorCitkZWYgc3VpdGUoKToKKyAgICBzcWxpdGVfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShTcWxpdGVUeXBlVGVzdHMsICJDaGVjayIpCisgICAgZGVjbHR5cGVzX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGVjbFR5cGVzVGVzdHMsICJDaGVjayIpCisgICAgY29sbmFtZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDb2xOYW1lc1Rlc3RzLCAiQ2hlY2siKQorICAgIGFkYXB0YXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoT2JqZWN0QWRhcHRhdGlvblRlc3RzLCAiQ2hlY2siKQorICAgIGJpbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShCaW5hcnlDb252ZXJ0ZXJUZXN0cywgIkNoZWNrIikKKyAgICBkYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERhdGVUaW1lVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoc3FsaXRlX3R5cGVfc3VpdGUsIGRlY2x0eXBlc190eXBlX3N1aXRlLCBjb2xuYW1lc190eXBlX3N1aXRlLCBhZGFwdGF0aW9uX3N1aXRlLCBiaW5fc3VpdGUsIGRhdGVfc3VpdGUpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90eXBlcy5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90eXBlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyOTFhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90eXBlcy5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC90eXBlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyOTFhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3FsaXRlMy90ZXN0L3R5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5IGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzQ4MTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQpAQCAtMCwwICsxLDQ2NyBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L3VzZXJmdW5jdGlvbnMucHk6IHRlc3RzIGZvciB1c2VyLWRlZmluZWQgZnVuY3Rpb25zIGFuZAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVzLgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworZGVmIGZ1bmNfcmV0dXJudGV4dCgpOgorICAgIHJldHVybiAiZm9vIgorZGVmIGZ1bmNfcmV0dXJudW5pY29kZSgpOgorICAgIHJldHVybiB1ImJhciIKK2RlZiBmdW5jX3JldHVybmludCgpOgorICAgIHJldHVybiA0MgorZGVmIGZ1bmNfcmV0dXJuZmxvYXQoKToKKyAgICByZXR1cm4gMy4xNAorZGVmIGZ1bmNfcmV0dXJubnVsbCgpOgorICAgIHJldHVybiBOb25lCitkZWYgZnVuY19yZXR1cm5ibG9iKCk6CisgICAgcmV0dXJuIGJ1ZmZlcigiYmxvYiIpCitkZWYgZnVuY19yZXR1cm5sb25nbG9uZygpOgorICAgIHJldHVybiAxPDwzMQorZGVmIGZ1bmNfcmFpc2VleGNlcHRpb24oKToKKyAgICA1IC8vIDAKKworZGVmIGZ1bmNfaXNzdHJpbmcodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgdW5pY29kZQorZGVmIGZ1bmNfaXNpbnQodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgaW50CitkZWYgZnVuY19pc2Zsb2F0KHYpOgorICAgIHJldHVybiB0eXBlKHYpIGlzIGZsb2F0CitkZWYgZnVuY19pc25vbmUodik6CisgICAgcmV0dXJuIHR5cGUodikgaXMgdHlwZShOb25lKQorZGVmIGZ1bmNfaXNibG9iKHYpOgorICAgIHJldHVybiB0eXBlKHYpIGlzIGJ1ZmZlcgorZGVmIGZ1bmNfaXNsb25nbG9uZyh2KToKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh2LCAoaW50LCBsb25nKSkgYW5kIHYgPj0gMTw8MzEKKworY2xhc3MgQWdnck5vU3RlcDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKworY2xhc3MgQWdnck5vRmluYWxpemU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgcGFzcworCitjbGFzcyBBZ2dyRXhjZXB0aW9uSW5Jbml0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgNSAvLyAwCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEFnZ3JFeGNlcHRpb25JblN0ZXA6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgNSAvLyAwCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIHJldHVybiA0MgorCitjbGFzcyBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzdGVwKHNlbGYsIHgpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIDUgLy8gMAorCitjbGFzcyBBZ2dyQ2hlY2tUeXBlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWwgPSBOb25lCisKKyAgICBkZWYgc3RlcChzZWxmLCB3aGljaFR5cGUsIHZhbCk6CisgICAgICAgIHRoZVR5cGUgPSB7InN0ciI6IHVuaWNvZGUsICJpbnQiOiBpbnQsICJmbG9hdCI6IGZsb2F0LCAiTm9uZSI6IHR5cGUoTm9uZSksICJibG9iIjogYnVmZmVyfQorICAgICAgICBzZWxmLnZhbCA9IGludCh0aGVUeXBlW3doaWNoVHlwZV0gaXMgdHlwZSh2YWwpKQorCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWwKKworY2xhc3MgQWdnclN1bToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsID0gMC4wCisKKyAgICBkZWYgc3RlcChzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCArPSB2YWwKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsCisKK2NsYXNzIEZ1bmN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudGV4dCIsIDAsIGZ1bmNfcmV0dXJudGV4dCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm51bmljb2RlIiwgMCwgZnVuY19yZXR1cm51bmljb2RlKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmludCIsIDAsIGZ1bmNfcmV0dXJuaW50KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmZsb2F0IiwgMCwgZnVuY19yZXR1cm5mbG9hdCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5udWxsIiwgMCwgZnVuY19yZXR1cm5udWxsKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmJsb2IiLCAwLCBmdW5jX3JldHVybmJsb2IpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJubG9uZ2xvbmciLCAwLCBmdW5jX3JldHVybmxvbmdsb25nKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJhaXNlZXhjZXB0aW9uIiwgMCwgZnVuY19yYWlzZWV4Y2VwdGlvbikKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzc3RyaW5nIiwgMSwgZnVuY19pc3N0cmluZykKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2ludCIsIDEsIGZ1bmNfaXNpbnQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNmbG9hdCIsIDEsIGZ1bmNfaXNmbG9hdCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc25vbmUiLCAxLCBmdW5jX2lzbm9uZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Jsb2IiLCAxLCBmdW5jX2lzYmxvYikKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2xvbmdsb25nIiwgMSwgZnVuY19pc2xvbmdsb25nKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tGdW5jRXJyb3JPbkNyZWF0ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJibGEiLCAtMTAwLCBsYW1iZGEgeDogMip4KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0Z1bmNSZWZDb3VudChzZWxmKToKKyAgICAgICAgZGVmIGdldGZ1bmMoKToKKyAgICAgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIHJldHVybiBmCisgICAgICAgIGYgPSBnZXRmdW5jKCkKKyAgICAgICAgZ2xvYmFscygpWyJmb28iXSA9IGYKKyAgICAgICAgIyBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJlZnRlc3QiLCAwLCBnZXRmdW5jKCkpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGYpCisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmVmdGVzdCgpIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5UZXh0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybnRleHQoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgImZvbyIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuVW5pY29kZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm51bmljb2RlKCkiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIHUiYmFyIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5JbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuaW50KCkiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsKSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgNDIpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmV0dXJuRmxvYXQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuZmxvYXQoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKKyAgICAgICAgaWYgdmFsIDwgMy4xMzkgb3IgdmFsID4gMy4xNDE6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIHZhbHVlIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5OdWxsKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybm51bGwoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCB0eXBlKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgTm9uZSkKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5CbG9iKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybmJsb2IoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWwpLCBidWZmZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCBidWZmZXIoImJsb2IiKSkKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5Mb25nTG9uZyhzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5sb25nbG9uZygpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDE8PDMxKQorCisgICAgZGVmIENoZWNrRnVuY0V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByYWlzZWV4Y2VwdGlvbigpIikKKyAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICd1c2VyLWRlZmluZWQgZnVuY3Rpb24gcmFpc2VkIGV4Y2VwdGlvbicpCisKKyAgICBkZWYgQ2hlY2tQYXJhbVN0cmluZyhzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc3N0cmluZyg/KSIsICgiZm9vIiwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja1BhcmFtSW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzaW50KD8pIiwgKDQyLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1GbG9hdChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2Zsb2F0KD8pIiwgKDMuMTQsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tQYXJhbU5vbmUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNub25lKD8pIiwgKE5vbmUsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNibG9iKD8pIiwgKGJ1ZmZlcigiYmxvYiIpLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1Mb25nTG9uZyhzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2xvbmdsb25nKD8pIiwgKDE8PDQyLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQorCitjbGFzcyBBZ2dyZWdhdGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHRlc3QoCisgICAgICAgICAgICAgICAgdCB0ZXh0LAorICAgICAgICAgICAgICAgIGkgaW50ZWdlciwKKyAgICAgICAgICAgICAgICBmIGZsb2F0LAorICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgYiBibG9iCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0LCBpLCBmLCBuLCBiKSB2YWx1ZXMgKD8sID8sID8sID8sID8pIiwKKyAgICAgICAgICAgICgiZm9vIiwgNSwgMy4xNCwgTm9uZSwgYnVmZmVyKCJibG9iIiksKSkKKworICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub3N0ZXAiLCAxLCBBZ2dyTm9TdGVwKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJub2ZpbmFsaXplIiwgMSwgQWdnck5vRmluYWxpemUpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y0luaXQiLCAxLCBBZ2dyRXhjZXB0aW9uSW5Jbml0KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNTdGVwIiwgMSwgQWdnckV4Y2VwdGlvbkluU3RlcCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjRmluYWxpemUiLCAxLCBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiY2hlY2tUeXBlIiwgMiwgQWdnckNoZWNrVHlwZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgibXlzdW0iLCAxLCBBZ2dyU3VtKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICAjc2VsZi5jb24uY2xvc2UoKQorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXJyb3JPbkNyZWF0ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJibGEiLCAtMTAwLCBBZ2dyU3VtKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0FnZ3JOb1N0ZXAoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBBdHRyaWJ1dGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAiQWdnck5vU3RlcCBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCisKKyAgICBkZWYgQ2hlY2tBZ2dyTm9GaW5hbGl6ZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub2ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIpCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5Jbml0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0luaXQodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ19faW5pdF9fJyBtZXRob2QgcmFpc2VkIGVycm9yIikKKworICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JblN0ZXAoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjU3RlcCh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnc3RlcCcgbWV0aG9kIHJhaXNlZCBlcnJvciIpCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNGaW5hbGl6ZSh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1TdHIoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdzdHInLCA/KSIsICgiZm9vIiwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtSW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnaW50JywgPykiLCAoNDIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnZmxvYXQnLCA/KSIsICgzLjE0LCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1Ob25lKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnTm9uZScsID8pIiwgKE5vbmUsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUJsb2Ioc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdibG9iJywgPykiLCAoYnVmZmVyKCJibG9iIiksKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tBZ2dyU3VtKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgWygxMCwpLCAoMjAsKSwgKDMwLCldKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG15c3VtKGkpIGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsLCA2MCkKKworY2xhc3MgQXV0aG9yaXplclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKKyAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKKyAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKKyAgICAgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKKyAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmNvbi5leGVjdXRlc2NyaXB0KCIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHQxIChjMSwgYzIpOworICAgICAgICAgICAgY3JlYXRlIHRhYmxlIHQyIChjMSwgYzIpOworICAgICAgICAgICAgaW5zZXJ0IGludG8gdDEgKGMxLCBjMikgdmFsdWVzICgxLCAyKTsKKyAgICAgICAgICAgIGluc2VydCBpbnRvIHQyIChjMSwgYzIpIHZhbHVlcyAoNCwgNSk7CisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgIyBGb3Igb3VyIHNlY3VyaXR5IHRlc3Q6CisgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCBjMiBmcm9tIHQyIikKKworICAgICAgICBzZWxmLmNvbi5zZXRfYXV0aG9yaXplcihzZWxmLmF1dGhvcml6ZXJfY2IpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3RhYmxlX2FjY2VzcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ICogZnJvbSB0MiIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuRGF0YWJhc2VFcnJvciwgZToKKyAgICAgICAgICAgIGlmIG5vdCBlLmFyZ3NbMF0uZW5kc3dpdGgoInByb2hpYml0ZWQiKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiB0ZXh0OiAlcyIgJSBlLmFyZ3NbMF0pCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIGR1ZSB0byBtaXNzaW5nIHByaXZpbGVnZXMiKQorCisgICAgZGVmIHRlc3RfY29sdW1uX2FjY2VzcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDEiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBub3QgZS5hcmdzWzBdLmVuZHN3aXRoKCJwcm9oaWJpdGVkIik6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24gdGV4dDogJXMiICUgZS5hcmdzWzBdKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiBkdWUgdG8gbWlzc2luZyBwcml2aWxlZ2VzIikKKworY2xhc3MgQXV0aG9yaXplclJhaXNlRXhjZXB0aW9uVGVzdHMoQXV0aG9yaXplclRlc3RzKToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKKworY2xhc3MgQXV0aG9yaXplcklsbGVnYWxUeXBlVGVzdHMoQXV0aG9yaXplclRlc3RzKToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGF1dGhvcml6ZXJfY2IoYWN0aW9uLCBhcmcxLCBhcmcyLCBkYm5hbWUsIHNvdXJjZSk6CisgICAgICAgIGlmIGFjdGlvbiAhPSBzcWxpdGUuU1FMSVRFX1NFTEVDVDoKKyAgICAgICAgICAgIHJldHVybiAwLjAKKyAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKKyAgICAgICAgICAgIHJldHVybiAwLjAKKyAgICAgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKKworY2xhc3MgQXV0aG9yaXplckxhcmdlSW50ZWdlclRlc3RzKEF1dGhvcml6ZXJUZXN0cyk6CisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBhdXRob3JpemVyX2NiKGFjdGlvbiwgYXJnMSwgYXJnMiwgZGJuYW1lLCBzb3VyY2UpOgorICAgICAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CisgICAgICAgICAgICByZXR1cm4gMioqMzIKKyAgICAgICAgaWYgYXJnMiA9PSAnYzInIG9yIGFyZzEgPT0gJ3QyJzoKKyAgICAgICAgICAgIHJldHVybiAyKiozMgorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9PSworCisKK2RlZiBzdWl0ZSgpOgorICAgIGZ1bmN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEZ1bmN0aW9uVGVzdHMsICJDaGVjayIpCisgICAgYWdncmVnYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEFnZ3JlZ2F0ZVRlc3RzLCAiQ2hlY2siKQorICAgIGF1dGhvcml6ZXJfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplclRlc3RzKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKAorICAgICAgICAgICAgZnVuY3Rpb25fc3VpdGUsCisgICAgICAgICAgICBhZ2dyZWdhdGVfc3VpdGUsCisgICAgICAgICAgICBhdXRob3JpemVyX3N1aXRlLAorICAgICAgICAgICAgdW5pdHRlc3QubWFrZVN1aXRlKEF1dGhvcml6ZXJSYWlzZUV4Y2VwdGlvblRlc3RzKSwKKyAgICAgICAgICAgIHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVySWxsZWdhbFR5cGVUZXN0cyksCisgICAgICAgICAgICB1bml0dGVzdC5tYWtlU3VpdGUoQXV0aG9yaXplckxhcmdlSW50ZWdlclRlc3RzKSwKKyAgICAgICAgKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQxYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQxYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmUucHkgYi9saWIvcHl0aG9uMi43L3NyZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDQ1NzZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmUucHkKQEAgLTAsMCArMSwxMyBAQAorIiIiVGhpcyBmaWxlIGlzIG9ubHkgcmV0YWluZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuICBzcmUgd2FzIG1vdmVkIHRvIHJlIGluIHZlcnNpb24gMi41LgorIiIiCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3Mud2FybigiVGhlIHNyZSBtb2R1bGUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIGltcG9ydCByZS4iLAorICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIDIpCisKK2Zyb20gcmUgaW1wb3J0ICoKK2Zyb20gcmUgaW1wb3J0IF9fYWxsX18KKworIyBvbGQgcGlja2xlcyBleHBlY3QgdGhlIF9jb21waWxlKCkgcmVjb25zdHJ1Y3RvciBpbiB0aGlzIG1vZHVsZQorZnJvbSByZSBpbXBvcnQgX2NvbXBpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlLnB5YyBiL2xpYi9weXRob24yLjcvc3JlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhlMTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlLnB5byBiL2xpYi9weXRob24yLjcvc3JlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjhlMTczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlX2NvbXBpbGUucHkgYi9saWIvcHl0aG9uMi43L3NyZV9jb21waWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGEyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3NyZV9jb21waWxlLnB5CkBAIC0wLDAgKzEsNTI1IEBACisjCisjIFNlY3JldCBMYWJzJyBSZWd1bGFyIEV4cHJlc3Npb24gRW5naW5lCisjCisjIGNvbnZlcnQgdGVtcGxhdGUgdG8gaW50ZXJuYWwgZm9ybWF0CisjCisjIENvcHlyaWdodCAoYykgMTk5Ny0yMDAxIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgU2VlIHRoZSBzcmUucHkgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uLgorIworCisiIiJJbnRlcm5hbCBzdXBwb3J0IG1vZHVsZSBmb3Igc3JlIiIiCisKK2ltcG9ydCBfc3JlLCBzeXMKK2ltcG9ydCBzcmVfcGFyc2UKK2Zyb20gc3JlX2NvbnN0YW50cyBpbXBvcnQgKgorZnJvbSBfc3JlIGltcG9ydCBNQVhSRVBFQVQKKworYXNzZXJ0IF9zcmUuTUFHSUMgPT0gTUFHSUMsICJTUkUgbW9kdWxlIG1pc21hdGNoIgorCitpZiBfc3JlLkNPREVTSVpFID09IDI6CisgICAgTUFYQ09ERSA9IDY1NTM1CitlbHNlOgorICAgIE1BWENPREUgPSAweEZGRkZGRkZGTAorCitkZWYgX2lkZW50aXR5ZnVuY3Rpb24oeCk6CisgICAgcmV0dXJuIHgKKworX0xJVEVSQUxfQ09ERVMgPSBzZXQoW0xJVEVSQUwsIE5PVF9MSVRFUkFMXSkKK19SRVBFQVRJTkdfQ09ERVMgPSBzZXQoW1JFUEVBVCwgTUlOX1JFUEVBVCwgTUFYX1JFUEVBVF0pCitfU1VDQ0VTU19DT0RFUyA9IHNldChbU1VDQ0VTUywgRkFJTFVSRV0pCitfQVNTRVJUX0NPREVTID0gc2V0KFtBU1NFUlQsIEFTU0VSVF9OT1RdKQorCitkZWYgX2NvbXBpbGUoY29kZSwgcGF0dGVybiwgZmxhZ3MpOgorICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgYSAoc3ViKXBhdHRlcm4KKyAgICBlbWl0ID0gY29kZS5hcHBlbmQKKyAgICBfbGVuID0gbGVuCisgICAgTElURVJBTF9DT0RFUyA9IF9MSVRFUkFMX0NPREVTCisgICAgUkVQRUFUSU5HX0NPREVTID0gX1JFUEVBVElOR19DT0RFUworICAgIFNVQ0NFU1NfQ09ERVMgPSBfU1VDQ0VTU19DT0RFUworICAgIEFTU0VSVF9DT0RFUyA9IF9BU1NFUlRfQ09ERVMKKyAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm46CisgICAgICAgIGlmIG9wIGluIExJVEVSQUxfQ09ERVM6CisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0U6CisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW09QX0lHTk9SRVtvcF1dKQorICAgICAgICAgICAgICAgIGVtaXQoX3NyZS5nZXRsb3dlcihhdiwgZmxhZ3MpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQorICAgICAgICAgICAgICAgIGVtaXQoYXYpCisgICAgICAgIGVsaWYgb3AgaXMgSU46CisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0U6CisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW09QX0lHTk9SRVtvcF1dKQorICAgICAgICAgICAgICAgIGRlZiBmaXh1cChsaXRlcmFsLCBmbGFncz1mbGFncyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfc3JlLmdldGxvd2VyKGxpdGVyYWwsIGZsYWdzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQorICAgICAgICAgICAgICAgIGZpeHVwID0gX2lkZW50aXR5ZnVuY3Rpb24KKyAgICAgICAgICAgIHNraXAgPSBfbGVuKGNvZGUpOyBlbWl0KDApCisgICAgICAgICAgICBfY29tcGlsZV9jaGFyc2V0KGF2LCBmbGFncywgY29kZSwgZml4dXApCisgICAgICAgICAgICBjb2RlW3NraXBdID0gX2xlbihjb2RlKSAtIHNraXAKKyAgICAgICAgZWxpZiBvcCBpcyBBTlk6CisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0RPVEFMTDoKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbQU5ZX0FMTF0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tBTlldKQorICAgICAgICBlbGlmIG9wIGluIFJFUEVBVElOR19DT0RFUzoKKyAgICAgICAgICAgIGlmIGZsYWdzICYgU1JFX0ZMQUdfVEVNUExBVEU6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJpbnRlcm5hbDogdW5zdXBwb3J0ZWQgdGVtcGxhdGUgb3BlcmF0b3IiCisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1JFUEVBVF0pCisgICAgICAgICAgICAgICAgc2tpcCA9IF9sZW4oY29kZSk7IGVtaXQoMCkKKyAgICAgICAgICAgICAgICBlbWl0KGF2WzBdKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMV0pCisgICAgICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKKyAgICAgICAgICAgICAgICBjb2RlW3NraXBdID0gX2xlbihjb2RlKSAtIHNraXAKKyAgICAgICAgICAgIGVsaWYgX3NpbXBsZShhdikgYW5kIG9wIGlzIG5vdCBSRVBFQVQ6CisgICAgICAgICAgICAgICAgaWYgb3AgaXMgTUFYX1JFUEVBVDoKKyAgICAgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1JFUEVBVF9PTkVdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tNSU5fUkVQRUFUX09ORV0pCisgICAgICAgICAgICAgICAgc2tpcCA9IF9sZW4oY29kZSk7IGVtaXQoMCkKKyAgICAgICAgICAgICAgICBlbWl0KGF2WzBdKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMV0pCisgICAgICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tTVUNDRVNTXSkKKyAgICAgICAgICAgICAgICBjb2RlW3NraXBdID0gX2xlbihjb2RlKSAtIHNraXAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW1JFUEVBVF0pCisgICAgICAgICAgICAgICAgc2tpcCA9IF9sZW4oY29kZSk7IGVtaXQoMCkKKyAgICAgICAgICAgICAgICBlbWl0KGF2WzBdKQorICAgICAgICAgICAgICAgIGVtaXQoYXZbMV0pCisgICAgICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQorICAgICAgICAgICAgICAgIGNvZGVbc2tpcF0gPSBfbGVuKGNvZGUpIC0gc2tpcAorICAgICAgICAgICAgICAgIGlmIG9wIGlzIE1BWF9SRVBFQVQ6CisgICAgICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tNQVhfVU5USUxdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tNSU5fVU5USUxdKQorICAgICAgICBlbGlmIG9wIGlzIFNVQlBBVFRFUk46CisgICAgICAgICAgICBpZiBhdlswXToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbTUFSS10pCisgICAgICAgICAgICAgICAgZW1pdCgoYXZbMF0tMSkqMikKKyAgICAgICAgICAgICMgX2NvbXBpbGVfaW5mbyhjb2RlLCBhdlsxXSwgZmxhZ3MpCisgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsxXSwgZmxhZ3MpCisgICAgICAgICAgICBpZiBhdlswXToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbTUFSS10pCisgICAgICAgICAgICAgICAgZW1pdCgoYXZbMF0tMSkqMisxKQorICAgICAgICBlbGlmIG9wIGluIFNVQ0NFU1NfQ09ERVM6CisgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQorICAgICAgICBlbGlmIG9wIGluIEFTU0VSVF9DT0RFUzoKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICBza2lwID0gX2xlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgaWYgYXZbMF0gPj0gMDoKKyAgICAgICAgICAgICAgICBlbWl0KDApICMgbG9vayBhaGVhZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsbywgaGkgPSBhdlsxXS5nZXR3aWR0aCgpCisgICAgICAgICAgICAgICAgaWYgbG8gIT0gaGk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAibG9vay1iZWhpbmQgcmVxdWlyZXMgZml4ZWQtd2lkdGggcGF0dGVybiIKKyAgICAgICAgICAgICAgICBlbWl0KGxvKSAjIGxvb2sgYmVoaW5kCisgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdlsxXSwgZmxhZ3MpCisgICAgICAgICAgICBlbWl0KE9QQ09ERVNbU1VDQ0VTU10pCisgICAgICAgICAgICBjb2RlW3NraXBdID0gX2xlbihjb2RlKSAtIHNraXAKKyAgICAgICAgZWxpZiBvcCBpcyBDQUxMOgorICAgICAgICAgICAgZW1pdChPUENPREVTW29wXSkKKyAgICAgICAgICAgIHNraXAgPSBfbGVuKGNvZGUpOyBlbWl0KDApCisgICAgICAgICAgICBfY29tcGlsZShjb2RlLCBhdiwgZmxhZ3MpCisgICAgICAgICAgICBlbWl0KE9QQ09ERVNbU1VDQ0VTU10pCisgICAgICAgICAgICBjb2RlW3NraXBdID0gX2xlbihjb2RlKSAtIHNraXAKKyAgICAgICAgZWxpZiBvcCBpcyBBVDoKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX01VTFRJTElORToKKyAgICAgICAgICAgICAgICBhdiA9IEFUX01VTFRJTElORS5nZXQoYXYsIGF2KQorICAgICAgICAgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19MT0NBTEU6CisgICAgICAgICAgICAgICAgYXYgPSBBVF9MT0NBTEUuZ2V0KGF2LCBhdikKKyAgICAgICAgICAgIGVsaWYgZmxhZ3MgJiBTUkVfRkxBR19VTklDT0RFOgorICAgICAgICAgICAgICAgIGF2ID0gQVRfVU5JQ09ERS5nZXQoYXYsIGF2KQorICAgICAgICAgICAgZW1pdChBVENPREVTW2F2XSkKKyAgICAgICAgZWxpZiBvcCBpcyBCUkFOQ0g6CisgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQorICAgICAgICAgICAgdGFpbCA9IFtdCisgICAgICAgICAgICB0YWlsYXBwZW5kID0gdGFpbC5hcHBlbmQKKyAgICAgICAgICAgIGZvciBhdiBpbiBhdlsxXToKKyAgICAgICAgICAgICAgICBza2lwID0gX2xlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgICAgICMgX2NvbXBpbGVfaW5mbyhjb2RlLCBhdiwgZmxhZ3MpCisgICAgICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXYsIGZsYWdzKQorICAgICAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tKVU1QXSkKKyAgICAgICAgICAgICAgICB0YWlsYXBwZW5kKF9sZW4oY29kZSkpOyBlbWl0KDApCisgICAgICAgICAgICAgICAgY29kZVtza2lwXSA9IF9sZW4oY29kZSkgLSBza2lwCisgICAgICAgICAgICBlbWl0KDApICMgZW5kIG9mIGJyYW5jaAorICAgICAgICAgICAgZm9yIHRhaWwgaW4gdGFpbDoKKyAgICAgICAgICAgICAgICBjb2RlW3RhaWxdID0gX2xlbihjb2RlKSAtIHRhaWwKKyAgICAgICAgZWxpZiBvcCBpcyBDQVRFR09SWToKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0xPQ0FMRToKKyAgICAgICAgICAgICAgICBhdiA9IENIX0xPQ0FMRVthdl0KKyAgICAgICAgICAgIGVsaWYgZmxhZ3MgJiBTUkVfRkxBR19VTklDT0RFOgorICAgICAgICAgICAgICAgIGF2ID0gQ0hfVU5JQ09ERVthdl0KKyAgICAgICAgICAgIGVtaXQoQ0hDT0RFU1thdl0pCisgICAgICAgIGVsaWYgb3AgaXMgR1JPVVBSRUY6CisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0lHTk9SRUNBU0U6CisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW09QX0lHTk9SRVtvcF1dKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbWl0KE9QQ09ERVNbb3BdKQorICAgICAgICAgICAgZW1pdChhdi0xKQorICAgICAgICBlbGlmIG9wIGlzIEdST1VQUkVGX0VYSVNUUzoKKyAgICAgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgICAgICBlbWl0KGF2WzBdLTEpCisgICAgICAgICAgICBza2lweWVzID0gX2xlbihjb2RlKTsgZW1pdCgwKQorICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXZbMV0sIGZsYWdzKQorICAgICAgICAgICAgaWYgYXZbMl06CisgICAgICAgICAgICAgICAgZW1pdChPUENPREVTW0pVTVBdKQorICAgICAgICAgICAgICAgIHNraXBubyA9IF9sZW4oY29kZSk7IGVtaXQoMCkKKyAgICAgICAgICAgICAgICBjb2RlW3NraXB5ZXNdID0gX2xlbihjb2RlKSAtIHNraXB5ZXMgKyAxCisgICAgICAgICAgICAgICAgX2NvbXBpbGUoY29kZSwgYXZbMl0sIGZsYWdzKQorICAgICAgICAgICAgICAgIGNvZGVbc2tpcG5vXSA9IF9sZW4oY29kZSkgLSBza2lwbm8KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29kZVtza2lweWVzXSA9IF9sZW4oY29kZSkgLSBza2lweWVzICsgMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgKCJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUiLCBvcCkKKworZGVmIF9jb21waWxlX2NoYXJzZXQoY2hhcnNldCwgZmxhZ3MsIGNvZGUsIGZpeHVwPU5vbmUpOgorICAgICMgY29tcGlsZSBjaGFyc2V0IHN1YnByb2dyYW0KKyAgICBlbWl0ID0gY29kZS5hcHBlbmQKKyAgICBpZiBmaXh1cCBpcyBOb25lOgorICAgICAgICBmaXh1cCA9IF9pZGVudGl0eWZ1bmN0aW9uCisgICAgZm9yIG9wLCBhdiBpbiBfb3B0aW1pemVfY2hhcnNldChjaGFyc2V0LCBmaXh1cCk6CisgICAgICAgIGVtaXQoT1BDT0RFU1tvcF0pCisgICAgICAgIGlmIG9wIGlzIE5FR0FURToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgZW1pdChmaXh1cChhdikpCisgICAgICAgIGVsaWYgb3AgaXMgUkFOR0U6CisgICAgICAgICAgICBlbWl0KGZpeHVwKGF2WzBdKSkKKyAgICAgICAgICAgIGVtaXQoZml4dXAoYXZbMV0pKQorICAgICAgICBlbGlmIG9wIGlzIENIQVJTRVQ6CisgICAgICAgICAgICBjb2RlLmV4dGVuZChhdikKKyAgICAgICAgZWxpZiBvcCBpcyBCSUdDSEFSU0VUOgorICAgICAgICAgICAgY29kZS5leHRlbmQoYXYpCisgICAgICAgIGVsaWYgb3AgaXMgQ0FURUdPUlk6CisgICAgICAgICAgICBpZiBmbGFncyAmIFNSRV9GTEFHX0xPQ0FMRToKKyAgICAgICAgICAgICAgICBlbWl0KENIQ09ERVNbQ0hfTE9DQUxFW2F2XV0pCisgICAgICAgICAgICBlbGlmIGZsYWdzICYgU1JFX0ZMQUdfVU5JQ09ERToKKyAgICAgICAgICAgICAgICBlbWl0KENIQ09ERVNbQ0hfVU5JQ09ERVthdl1dKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbWl0KENIQ09ERVNbYXZdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJpbnRlcm5hbDogdW5zdXBwb3J0ZWQgc2V0IG9wZXJhdG9yIgorICAgIGVtaXQoT1BDT0RFU1tGQUlMVVJFXSkKKworZGVmIF9vcHRpbWl6ZV9jaGFyc2V0KGNoYXJzZXQsIGZpeHVwKToKKyAgICAjIGludGVybmFsOiBvcHRpbWl6ZSBjaGFyYWN0ZXIgc2V0CisgICAgb3V0ID0gW10KKyAgICBvdXRhcHBlbmQgPSBvdXQuYXBwZW5kCisgICAgY2hhcm1hcCA9IFswXSoyNTYKKyAgICB0cnk6CisgICAgICAgIGZvciBvcCwgYXYgaW4gY2hhcnNldDoKKyAgICAgICAgICAgIGlmIG9wIGlzIE5FR0FURToKKyAgICAgICAgICAgICAgICBvdXRhcHBlbmQoKG9wLCBhdikpCisgICAgICAgICAgICBlbGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgY2hhcm1hcFtmaXh1cChhdildID0gMQorICAgICAgICAgICAgZWxpZiBvcCBpcyBSQU5HRToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShmaXh1cChhdlswXSksIGZpeHVwKGF2WzFdKSsxKToKKyAgICAgICAgICAgICAgICAgICAgY2hhcm1hcFtpXSA9IDEKKyAgICAgICAgICAgIGVsaWYgb3AgaXMgQ0FURUdPUlk6CisgICAgICAgICAgICAgICAgIyBYWFg6IGNvdWxkIGFwcGVuZCB0byBjaGFybWFwIHRhaWwKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hhcnNldCAjIGNhbm5vdCBjb21wcmVzcworICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAjIGNoYXJhY3RlciBzZXQgY29udGFpbnMgdW5pY29kZSBjaGFyYWN0ZXJzCisgICAgICAgIHJldHVybiBfb3B0aW1pemVfdW5pY29kZShjaGFyc2V0LCBmaXh1cCkKKyAgICAjIGNvbXByZXNzIGNoYXJhY3RlciBtYXAKKyAgICBpID0gcCA9IG4gPSAwCisgICAgcnVucyA9IFtdCisgICAgcnVuc2FwcGVuZCA9IHJ1bnMuYXBwZW5kCisgICAgZm9yIGMgaW4gY2hhcm1hcDoKKyAgICAgICAgaWYgYzoKKyAgICAgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgICAgICBwID0gaQorICAgICAgICAgICAgbiA9IG4gKyAxCisgICAgICAgIGVsaWYgbjoKKyAgICAgICAgICAgIHJ1bnNhcHBlbmQoKHAsIG4pKQorICAgICAgICAgICAgbiA9IDAKKyAgICAgICAgaSA9IGkgKyAxCisgICAgaWYgbjoKKyAgICAgICAgcnVuc2FwcGVuZCgocCwgbikpCisgICAgaWYgbGVuKHJ1bnMpIDw9IDI6CisgICAgICAgICMgdXNlIGxpdGVyYWwvcmFuZ2UKKyAgICAgICAgZm9yIHAsIG4gaW4gcnVuczoKKyAgICAgICAgICAgIGlmIG4gPT0gMToKKyAgICAgICAgICAgICAgICBvdXRhcHBlbmQoKExJVEVSQUwsIHApKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvdXRhcHBlbmQoKFJBTkdFLCAocCwgcCtuLTEpKSkKKyAgICAgICAgaWYgbGVuKG91dCkgPCBsZW4oY2hhcnNldCk6CisgICAgICAgICAgICByZXR1cm4gb3V0CisgICAgZWxzZToKKyAgICAgICAgIyB1c2UgYml0bWFwCisgICAgICAgIGRhdGEgPSBfbWtfYml0bWFwKGNoYXJtYXApCisgICAgICAgIG91dGFwcGVuZCgoQ0hBUlNFVCwgZGF0YSkpCisgICAgICAgIHJldHVybiBvdXQKKyAgICByZXR1cm4gY2hhcnNldAorCitkZWYgX21rX2JpdG1hcChiaXRzKToKKyAgICBkYXRhID0gW10KKyAgICBkYXRhYXBwZW5kID0gZGF0YS5hcHBlbmQKKyAgICBpZiBfc3JlLkNPREVTSVpFID09IDI6CisgICAgICAgIHN0YXJ0ID0gKDEsIDApCisgICAgZWxzZToKKyAgICAgICAgc3RhcnQgPSAoMUwsIDBMKQorICAgIG0sIHYgPSBzdGFydAorICAgIGZvciBjIGluIGJpdHM6CisgICAgICAgIGlmIGM6CisgICAgICAgICAgICB2ID0gdiArIG0KKyAgICAgICAgbSA9IG0gKyBtCisgICAgICAgIGlmIG0gPiBNQVhDT0RFOgorICAgICAgICAgICAgZGF0YWFwcGVuZCh2KQorICAgICAgICAgICAgbSwgdiA9IHN0YXJ0CisgICAgcmV0dXJuIGRhdGEKKworIyBUbyByZXByZXNlbnQgYSBiaWcgY2hhcnNldCwgZmlyc3QgYSBiaXRtYXAgb2YgYWxsIGNoYXJhY3RlcnMgaW4gdGhlCisjIHNldCBpcyBjb25zdHJ1Y3RlZC4gVGhlbiwgdGhpcyBiaXRtYXAgaXMgc2xpY2VkIGludG8gY2h1bmtzIG9mIDI1NgorIyBjaGFyYWN0ZXJzLCBkdXBsaWNhdGUgY2h1bmtzIGFyZSBlbGltaW5hdGVkLCBhbmQgZWFjaCBjaHVuayBpcworIyBnaXZlbiBhIG51bWJlci4gSW4gdGhlIGNvbXBpbGVkIGV4cHJlc3Npb24sIHRoZSBjaGFyc2V0IGlzCisjIHJlcHJlc2VudGVkIGJ5IGEgMTYtYml0IHdvcmQgc2VxdWVuY2UsIGNvbnNpc3Rpbmcgb2Ygb25lIHdvcmQgZm9yCisjIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGNodW5rcywgYSBzZXF1ZW5jZSBvZiAyNTYgYnl0ZXMgKDEyOCB3b3JkcykKKyMgb2YgY2h1bmsgbnVtYmVycyBpbmRleGVkIGJ5IHRoZWlyIG9yaWdpbmFsIGNodW5rIHBvc2l0aW9uLCBhbmQgYQorIyBzZXF1ZW5jZSBvZiBjaHVua3MgKDE2IHdvcmRzIGVhY2gpLgorCisjIENvbXByZXNzaW9uIGlzIG5vcm1hbGx5IGdvb2Q6IGluIGEgdHlwaWNhbCBjaGFyc2V0LCBsYXJnZSByYW5nZXMgb2YKKyMgVW5pY29kZSB3aWxsIGJlIGVpdGhlciBjb21wbGV0ZWx5IGV4Y2x1ZGVkIChlLmcuIGlmIG9ubHkgY3lyaWxsaWMKKyMgbGV0dGVycyBhcmUgdG8gYmUgbWF0Y2hlZCksIG9yIGNvbXBsZXRlbHkgaW5jbHVkZWQgKGUuZy4gaWYgbGFyZ2UKKyMgc3VicmFuZ2VzIG9mIEthbmppIG1hdGNoKS4gVGhlc2UgcmFuZ2VzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkKKyMgY2h1bmtzIG9mIGFsbCBvbmUtYml0cyBvciBhbGwgemVyby1iaXRzLgorCisjIE1hdGNoaW5nIGNhbiBiZSBhbHNvIGRvbmUgZWZmaWNpZW50bHk6IHRoZSBtb3JlIHNpZ25pZmljYW50IGJ5dGUgb2YKKyMgdGhlIFVuaWNvZGUgY2hhcmFjdGVyIGlzIGFuIGluZGV4IGludG8gdGhlIGNodW5rIG51bWJlciwgYW5kIHRoZQorIyBsZXNzIHNpZ25pZmljYW50IGJ5dGUgaXMgYSBiaXQgaW5kZXggaW4gdGhlIGNodW5rIChqdXN0IGxpa2UgdGhlCisjIENIQVJTRVQgbWF0Y2hpbmcpLgorCisjIEluIFVDUy00IG1vZGUsIHRoZSBCSUdDSEFSU0VUIG9wY29kZSBzdGlsbCBzdXBwb3J0cyBvbmx5IHN1YnNldHMKKyMgb2YgdGhlIGJhc2ljIG11bHRpbGluZ3VhbCBwbGFuZTsgYW4gZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uCisjIGZvciBhbGwgb2YgVVRGLTE2IGhhcyBub3QgeWV0IGJlZW4gZGV2ZWxvcGVkLiBUaGlzIG1lYW5zLAorIyBpbiBwYXJ0aWN1bGFyLCB0aGF0IG5lZ2F0ZWQgY2hhcnNldHMgY2Fubm90IGJlIHJlcHJlc2VudGVkIGFzCisjIGJpZ2NoYXJzZXRzLgorCitkZWYgX29wdGltaXplX3VuaWNvZGUoY2hhcnNldCwgZml4dXApOgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGFycmF5CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICByZXR1cm4gY2hhcnNldAorICAgIGNoYXJtYXAgPSBbMF0qNjU1MzYKKyAgICBuZWdhdGUgPSAwCisgICAgdHJ5OgorICAgICAgICBmb3Igb3AsIGF2IGluIGNoYXJzZXQ6CisgICAgICAgICAgICBpZiBvcCBpcyBORUdBVEU6CisgICAgICAgICAgICAgICAgbmVnYXRlID0gMQorICAgICAgICAgICAgZWxpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgIGNoYXJtYXBbZml4dXAoYXYpXSA9IDEKKyAgICAgICAgICAgIGVsaWYgb3AgaXMgUkFOR0U6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGZpeHVwKGF2WzBdKSwgZml4dXAoYXZbMV0pKzEpOgorICAgICAgICAgICAgICAgICAgICBjaGFybWFwW2ldID0gMQorICAgICAgICAgICAgZWxpZiBvcCBpcyBDQVRFR09SWToKKyAgICAgICAgICAgICAgICAjIFhYWDogY291bGQgZXhwYW5kIGNhdGVnb3J5CisgICAgICAgICAgICAgICAgcmV0dXJuIGNoYXJzZXQgIyBjYW5ub3QgY29tcHJlc3MKKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgIyBub24tQk1QIGNoYXJhY3RlcnMKKyAgICAgICAgcmV0dXJuIGNoYXJzZXQKKyAgICBpZiBuZWdhdGU6CisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlICE9IDY1NTM1OgorICAgICAgICAgICAgIyBYWFg6IG5lZ2F0aW9uIGRvZXMgbm90IHdvcmsgd2l0aCBiaWcgY2hhcnNldHMKKyAgICAgICAgICAgIHJldHVybiBjaGFyc2V0CisgICAgICAgIGZvciBpIGluIHhyYW5nZSg2NTUzNik6CisgICAgICAgICAgICBjaGFybWFwW2ldID0gbm90IGNoYXJtYXBbaV0KKyAgICBjb21wcyA9IHt9CisgICAgbWFwcGluZyA9IFswXSoyNTYKKyAgICBibG9jayA9IDAKKyAgICBkYXRhID0gW10KKyAgICBmb3IgaSBpbiB4cmFuZ2UoMjU2KToKKyAgICAgICAgY2h1bmsgPSB0dXBsZShjaGFybWFwW2kqMjU2OihpKzEpKjI1Nl0pCisgICAgICAgIG5ldyA9IGNvbXBzLnNldGRlZmF1bHQoY2h1bmssIGJsb2NrKQorICAgICAgICBtYXBwaW5nW2ldID0gbmV3CisgICAgICAgIGlmIG5ldyA9PSBibG9jazoKKyAgICAgICAgICAgIGJsb2NrID0gYmxvY2sgKyAxCisgICAgICAgICAgICBkYXRhID0gZGF0YSArIF9ta19iaXRtYXAoY2h1bmspCisgICAgaGVhZGVyID0gW2Jsb2NrXQorICAgIGlmIF9zcmUuQ09ERVNJWkUgPT0gMjoKKyAgICAgICAgY29kZSA9ICdIJworICAgIGVsc2U6CisgICAgICAgIGNvZGUgPSAnSScKKyAgICAjIENvbnZlcnQgYmxvY2sgaW5kaWNlcyB0byBieXRlIGFycmF5IG9mIDI1NiBieXRlcworICAgIG1hcHBpbmcgPSBhcnJheS5hcnJheSgnYicsIG1hcHBpbmcpLnRvc3RyaW5nKCkKKyAgICAjIENvbnZlcnQgYnl0ZSBhcnJheSB0byB3b3JkIGFycmF5CisgICAgbWFwcGluZyA9IGFycmF5LmFycmF5KGNvZGUsIG1hcHBpbmcpCisgICAgYXNzZXJ0IG1hcHBpbmcuaXRlbXNpemUgPT0gX3NyZS5DT0RFU0laRQorICAgIGhlYWRlciA9IGhlYWRlciArIG1hcHBpbmcudG9saXN0KCkKKyAgICBkYXRhWzA6MF0gPSBoZWFkZXIKKyAgICByZXR1cm4gWyhCSUdDSEFSU0VULCBkYXRhKV0KKworZGVmIF9zaW1wbGUoYXYpOgorICAgICMgY2hlY2sgaWYgYXYgaXMgYSAic2ltcGxlIiBvcGVyYXRvcgorICAgIGxvLCBoaSA9IGF2WzJdLmdldHdpZHRoKCkKKyAgICBpZiBsbyA9PSAwIGFuZCBoaSA9PSBNQVhSRVBFQVQ6CisgICAgICAgIHJhaXNlIGVycm9yLCAibm90aGluZyB0byByZXBlYXQiCisgICAgcmV0dXJuIGxvID09IGhpID09IDEgYW5kIGF2WzJdWzBdWzBdICE9IFNVQlBBVFRFUk4KKworZGVmIF9jb21waWxlX2luZm8oY29kZSwgcGF0dGVybiwgZmxhZ3MpOgorICAgICMgaW50ZXJuYWw6IGNvbXBpbGUgYW4gaW5mbyBibG9jay4gIGluIHRoZSBjdXJyZW50IHZlcnNpb24sCisgICAgIyB0aGlzIGNvbnRhaW5zIG1pbi9tYXggcGF0dGVybiB3aWR0aCwgYW5kIGFuIG9wdGlvbmFsIGxpdGVyYWwKKyAgICAjIHByZWZpeCBvciBhIGNoYXJhY3RlciBtYXAKKyAgICBsbywgaGkgPSBwYXR0ZXJuLmdldHdpZHRoKCkKKyAgICBpZiBsbyA9PSAwOgorICAgICAgICByZXR1cm4gIyBub3Qgd29ydGggaXQKKyAgICAjIGxvb2sgZm9yIGEgbGl0ZXJhbCBwcmVmaXgKKyAgICBwcmVmaXggPSBbXQorICAgIHByZWZpeGFwcGVuZCA9IHByZWZpeC5hcHBlbmQKKyAgICBwcmVmaXhfc2tpcCA9IDAKKyAgICBjaGFyc2V0ID0gW10gIyBub3QgdXNlZAorICAgIGNoYXJzZXRhcHBlbmQgPSBjaGFyc2V0LmFwcGVuZAorICAgIGlmIG5vdCAoZmxhZ3MgJiBTUkVfRkxBR19JR05PUkVDQVNFKToKKyAgICAgICAgIyBsb29rIGZvciBsaXRlcmFsIHByZWZpeAorICAgICAgICBmb3Igb3AsIGF2IGluIHBhdHRlcm4uZGF0YToKKyAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgaWYgbGVuKHByZWZpeCkgPT0gcHJlZml4X3NraXA6CisgICAgICAgICAgICAgICAgICAgIHByZWZpeF9za2lwID0gcHJlZml4X3NraXAgKyAxCisgICAgICAgICAgICAgICAgcHJlZml4YXBwZW5kKGF2KQorICAgICAgICAgICAgZWxpZiBvcCBpcyBTVUJQQVRURVJOIGFuZCBsZW4oYXZbMV0pID09IDE6CisgICAgICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KKyAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhhcHBlbmQoYXYpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgIyBpZiBubyBwcmVmaXgsIGxvb2sgZm9yIGNoYXJzZXQgcHJlZml4CisgICAgICAgIGlmIG5vdCBwcmVmaXggYW5kIHBhdHRlcm4uZGF0YToKKyAgICAgICAgICAgIG9wLCBhdiA9IHBhdHRlcm4uZGF0YVswXQorICAgICAgICAgICAgaWYgb3AgaXMgU1VCUEFUVEVSTiBhbmQgYXZbMV06CisgICAgICAgICAgICAgICAgb3AsIGF2ID0gYXZbMV1bMF0KKyAgICAgICAgICAgICAgICBpZiBvcCBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgICAgICBjaGFyc2V0YXBwZW5kKChvcCwgYXYpKQorICAgICAgICAgICAgICAgIGVsaWYgb3AgaXMgQlJBTkNIOgorICAgICAgICAgICAgICAgICAgICBjID0gW10KKyAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCA9IGMuYXBwZW5kCisgICAgICAgICAgICAgICAgICAgIGZvciBwIGluIGF2WzFdOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wLCBhdiA9IHBbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwcGVuZCgob3AsIGF2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjCisgICAgICAgICAgICBlbGlmIG9wIGlzIEJSQU5DSDoKKyAgICAgICAgICAgICAgICBjID0gW10KKyAgICAgICAgICAgICAgICBjYXBwZW5kID0gYy5hcHBlbmQKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiBhdlsxXToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHA6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBvcCwgYXYgPSBwWzBdCisgICAgICAgICAgICAgICAgICAgIGlmIG9wIGlzIExJVEVSQUw6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBwZW5kKChvcCwgYXYpKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYworICAgICAgICAgICAgZWxpZiBvcCBpcyBJTjoKKyAgICAgICAgICAgICAgICBjaGFyc2V0ID0gYXYKKyMjICAgICBpZiBwcmVmaXg6CisjIyAgICAgICAgIHByaW50ICIqKiogUFJFRklYIiwgcHJlZml4LCBwcmVmaXhfc2tpcAorIyMgICAgIGlmIGNoYXJzZXQ6CisjIyAgICAgICAgIHByaW50ICIqKiogQ0hBUlNFVCIsIGNoYXJzZXQKKyAgICAjIGFkZCBhbiBpbmZvIGJsb2NrCisgICAgZW1pdCA9IGNvZGUuYXBwZW5kCisgICAgZW1pdChPUENPREVTW0lORk9dKQorICAgIHNraXAgPSBsZW4oY29kZSk7IGVtaXQoMCkKKyAgICAjIGxpdGVyYWwgZmxhZworICAgIG1hc2sgPSAwCisgICAgaWYgcHJlZml4OgorICAgICAgICBtYXNrID0gU1JFX0lORk9fUFJFRklYCisgICAgICAgIGlmIGxlbihwcmVmaXgpID09IHByZWZpeF9za2lwID09IGxlbihwYXR0ZXJuLmRhdGEpOgorICAgICAgICAgICAgbWFzayA9IG1hc2sgKyBTUkVfSU5GT19MSVRFUkFMCisgICAgZWxpZiBjaGFyc2V0OgorICAgICAgICBtYXNrID0gbWFzayArIFNSRV9JTkZPX0NIQVJTRVQKKyAgICBlbWl0KG1hc2spCisgICAgIyBwYXR0ZXJuIGxlbmd0aAorICAgIGlmIGxvIDwgTUFYQ09ERToKKyAgICAgICAgZW1pdChsbykKKyAgICBlbHNlOgorICAgICAgICBlbWl0KE1BWENPREUpCisgICAgICAgIHByZWZpeCA9IHByZWZpeFs6TUFYQ09ERV0KKyAgICBpZiBoaSA8IE1BWENPREU6CisgICAgICAgIGVtaXQoaGkpCisgICAgZWxzZToKKyAgICAgICAgZW1pdCgwKQorICAgICMgYWRkIGxpdGVyYWwgcHJlZml4CisgICAgaWYgcHJlZml4OgorICAgICAgICBlbWl0KGxlbihwcmVmaXgpKSAjIGxlbmd0aAorICAgICAgICBlbWl0KHByZWZpeF9za2lwKSAjIHNraXAKKyAgICAgICAgY29kZS5leHRlbmQocHJlZml4KQorICAgICAgICAjIGdlbmVyYXRlIG92ZXJsYXAgdGFibGUKKyAgICAgICAgdGFibGUgPSBbLTFdICsgKFswXSpsZW4ocHJlZml4KSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihwcmVmaXgpKToKKyAgICAgICAgICAgIHRhYmxlW2krMV0gPSB0YWJsZVtpXSsxCisgICAgICAgICAgICB3aGlsZSB0YWJsZVtpKzFdID4gMCBhbmQgcHJlZml4W2ldICE9IHByZWZpeFt0YWJsZVtpKzFdLTFdOgorICAgICAgICAgICAgICAgIHRhYmxlW2krMV0gPSB0YWJsZVt0YWJsZVtpKzFdLTFdKzEKKyAgICAgICAgY29kZS5leHRlbmQodGFibGVbMTpdKSAjIGRvbid0IHN0b3JlIGZpcnN0IGVudHJ5CisgICAgZWxpZiBjaGFyc2V0OgorICAgICAgICBfY29tcGlsZV9jaGFyc2V0KGNoYXJzZXQsIGZsYWdzLCBjb2RlKQorICAgIGNvZGVbc2tpcF0gPSBsZW4oY29kZSkgLSBza2lwCisKK3RyeToKKyAgICB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgIFNUUklOR19UWVBFUyA9ICh0eXBlKCIiKSwpCitlbHNlOgorICAgIFNUUklOR19UWVBFUyA9ICh0eXBlKCIiKSwgdHlwZSh1bmljb2RlKCIiKSkpCisKK2RlZiBpc3N0cmluZyhvYmopOgorICAgIGZvciB0cCBpbiBTVFJJTkdfVFlQRVM6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCB0cCk6CisgICAgICAgICAgICByZXR1cm4gMQorICAgIHJldHVybiAwCisKK2RlZiBfY29kZShwLCBmbGFncyk6CisKKyAgICBmbGFncyA9IHAucGF0dGVybi5mbGFncyB8IGZsYWdzCisgICAgY29kZSA9IFtdCisKKyAgICAjIGNvbXBpbGUgaW5mbyBibG9jaworICAgIF9jb21waWxlX2luZm8oY29kZSwgcCwgZmxhZ3MpCisKKyAgICAjIGNvbXBpbGUgdGhlIHBhdHRlcm4KKyAgICBfY29tcGlsZShjb2RlLCBwLmRhdGEsIGZsYWdzKQorCisgICAgY29kZS5hcHBlbmQoT1BDT0RFU1tTVUNDRVNTXSkKKworICAgIHJldHVybiBjb2RlCisKK2RlZiBjb21waWxlKHAsIGZsYWdzPTApOgorICAgICMgaW50ZXJuYWw6IGNvbnZlcnQgcGF0dGVybiBsaXN0IHRvIGludGVybmFsIGZvcm1hdAorCisgICAgaWYgaXNzdHJpbmcocCk6CisgICAgICAgIHBhdHRlcm4gPSBwCisgICAgICAgIHAgPSBzcmVfcGFyc2UucGFyc2UocCwgZmxhZ3MpCisgICAgZWxzZToKKyAgICAgICAgcGF0dGVybiA9IE5vbmUKKworICAgIGNvZGUgPSBfY29kZShwLCBmbGFncykKKworICAgICMgcHJpbnQgY29kZQorCisgICAgIyBYWFg6IDxmbD4gZ2V0IHJpZCBvZiB0aGlzIGxpbWl0YXRpb24hCisgICAgaWYgcC5wYXR0ZXJuLmdyb3VwcyA+IDEwMDoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAic29ycnksIGJ1dCB0aGlzIHZlcnNpb24gb25seSBzdXBwb3J0cyAxMDAgbmFtZWQgZ3JvdXBzIgorICAgICAgICAgICAgKQorCisgICAgIyBtYXAgaW4gZWl0aGVyIGRpcmVjdGlvbgorICAgIGdyb3VwaW5kZXggPSBwLnBhdHRlcm4uZ3JvdXBkaWN0CisgICAgaW5kZXhncm91cCA9IFtOb25lXSAqIHAucGF0dGVybi5ncm91cHMKKyAgICBmb3IgaywgaSBpbiBncm91cGluZGV4Lml0ZW1zKCk6CisgICAgICAgIGluZGV4Z3JvdXBbaV0gPSBrCisKKyAgICByZXR1cm4gX3NyZS5jb21waWxlKAorICAgICAgICBwYXR0ZXJuLCBmbGFncyB8IHAucGF0dGVybi5mbGFncywgY29kZSwKKyAgICAgICAgcC5wYXR0ZXJuLmdyb3Vwcy0xLAorICAgICAgICBncm91cGluZGV4LCBpbmRleGdyb3VwCisgICAgICAgICkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlX2NvbXBpbGUucHljIGIvbGliL3B5dGhvbjIuNy9zcmVfY29tcGlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmOWYxZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3JlX2NvbXBpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlX2NvbXBpbGUucHlvIGIvbGliL3B5dGhvbjIuNy9zcmVfY29tcGlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1YjYyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3JlX2NvbXBpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlX2NvbnN0YW50cy5weSBiL2xpYi9weXRob24yLjcvc3JlX2NvbnN0YW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDE3NWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5CkBAIC0wLDAgKzEsMjU5IEBACisjCisjIFNlY3JldCBMYWJzJyBSZWd1bGFyIEV4cHJlc3Npb24gRW5naW5lCisjCisjIHZhcmlvdXMgc3ltYm9scyB1c2VkIGJ5IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZW5naW5lLgorIyBydW4gdGhpcyBzY3JpcHQgdG8gdXBkYXRlIHRoZSBfc3JlIGluY2x1ZGUgZmlsZXMhCisjCisjIENvcHlyaWdodCAoYykgMTk5OC0yMDAxIGJ5IFNlY3JldCBMYWJzIEFCLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgU2VlIHRoZSBzcmUucHkgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uLgorIworCisiIiJJbnRlcm5hbCBzdXBwb3J0IG1vZHVsZSBmb3Igc3JlIiIiCisKKyMgdXBkYXRlIHdoZW4gY29uc3RhbnRzIGFyZSBhZGRlZCBvciByZW1vdmVkCisKK01BR0lDID0gMjAwMzEwMTcKKworZnJvbSBfc3JlIGltcG9ydCBNQVhSRVBFQVQKKworIyBTUkUgc3RhbmRhcmQgZXhjZXB0aW9uIChhY2Nlc3MgYXMgc3JlLmVycm9yKQorIyBzaG91bGQgdGhpcyByZWFsbHkgYmUgaGVyZT8KKworY2xhc3MgZXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKyMgb3BlcmF0b3JzCisKK0ZBSUxVUkUgPSAiZmFpbHVyZSIKK1NVQ0NFU1MgPSAic3VjY2VzcyIKKworQU5ZID0gImFueSIKK0FOWV9BTEwgPSAiYW55X2FsbCIKK0FTU0VSVCA9ICJhc3NlcnQiCitBU1NFUlRfTk9UID0gImFzc2VydF9ub3QiCitBVCA9ICJhdCIKK0JJR0NIQVJTRVQgPSAiYmlnY2hhcnNldCIKK0JSQU5DSCA9ICJicmFuY2giCitDQUxMID0gImNhbGwiCitDQVRFR09SWSA9ICJjYXRlZ29yeSIKK0NIQVJTRVQgPSAiY2hhcnNldCIKK0dST1VQUkVGID0gImdyb3VwcmVmIgorR1JPVVBSRUZfSUdOT1JFID0gImdyb3VwcmVmX2lnbm9yZSIKK0dST1VQUkVGX0VYSVNUUyA9ICJncm91cHJlZl9leGlzdHMiCitJTiA9ICJpbiIKK0lOX0lHTk9SRSA9ICJpbl9pZ25vcmUiCitJTkZPID0gImluZm8iCitKVU1QID0gImp1bXAiCitMSVRFUkFMID0gImxpdGVyYWwiCitMSVRFUkFMX0lHTk9SRSA9ICJsaXRlcmFsX2lnbm9yZSIKK01BUksgPSAibWFyayIKK01BWF9SRVBFQVQgPSAibWF4X3JlcGVhdCIKK01BWF9VTlRJTCA9ICJtYXhfdW50aWwiCitNSU5fUkVQRUFUID0gIm1pbl9yZXBlYXQiCitNSU5fVU5USUwgPSAibWluX3VudGlsIgorTkVHQVRFID0gIm5lZ2F0ZSIKK05PVF9MSVRFUkFMID0gIm5vdF9saXRlcmFsIgorTk9UX0xJVEVSQUxfSUdOT1JFID0gIm5vdF9saXRlcmFsX2lnbm9yZSIKK1JBTkdFID0gInJhbmdlIgorUkVQRUFUID0gInJlcGVhdCIKK1JFUEVBVF9PTkUgPSAicmVwZWF0X29uZSIKK1NVQlBBVFRFUk4gPSAic3VicGF0dGVybiIKK01JTl9SRVBFQVRfT05FID0gIm1pbl9yZXBlYXRfb25lIgorCisjIHBvc2l0aW9ucworQVRfQkVHSU5OSU5HID0gImF0X2JlZ2lubmluZyIKK0FUX0JFR0lOTklOR19MSU5FID0gImF0X2JlZ2lubmluZ19saW5lIgorQVRfQkVHSU5OSU5HX1NUUklORyA9ICJhdF9iZWdpbm5pbmdfc3RyaW5nIgorQVRfQk9VTkRBUlkgPSAiYXRfYm91bmRhcnkiCitBVF9OT05fQk9VTkRBUlkgPSAiYXRfbm9uX2JvdW5kYXJ5IgorQVRfRU5EID0gImF0X2VuZCIKK0FUX0VORF9MSU5FID0gImF0X2VuZF9saW5lIgorQVRfRU5EX1NUUklORyA9ICJhdF9lbmRfc3RyaW5nIgorQVRfTE9DX0JPVU5EQVJZID0gImF0X2xvY19ib3VuZGFyeSIKK0FUX0xPQ19OT05fQk9VTkRBUlkgPSAiYXRfbG9jX25vbl9ib3VuZGFyeSIKK0FUX1VOSV9CT1VOREFSWSA9ICJhdF91bmlfYm91bmRhcnkiCitBVF9VTklfTk9OX0JPVU5EQVJZID0gImF0X3VuaV9ub25fYm91bmRhcnkiCisKKyMgY2F0ZWdvcmllcworQ0FURUdPUllfRElHSVQgPSAiY2F0ZWdvcnlfZGlnaXQiCitDQVRFR09SWV9OT1RfRElHSVQgPSAiY2F0ZWdvcnlfbm90X2RpZ2l0IgorQ0FURUdPUllfU1BBQ0UgPSAiY2F0ZWdvcnlfc3BhY2UiCitDQVRFR09SWV9OT1RfU1BBQ0UgPSAiY2F0ZWdvcnlfbm90X3NwYWNlIgorQ0FURUdPUllfV09SRCA9ICJjYXRlZ29yeV93b3JkIgorQ0FURUdPUllfTk9UX1dPUkQgPSAiY2F0ZWdvcnlfbm90X3dvcmQiCitDQVRFR09SWV9MSU5FQlJFQUsgPSAiY2F0ZWdvcnlfbGluZWJyZWFrIgorQ0FURUdPUllfTk9UX0xJTkVCUkVBSyA9ICJjYXRlZ29yeV9ub3RfbGluZWJyZWFrIgorQ0FURUdPUllfTE9DX1dPUkQgPSAiY2F0ZWdvcnlfbG9jX3dvcmQiCitDQVRFR09SWV9MT0NfTk9UX1dPUkQgPSAiY2F0ZWdvcnlfbG9jX25vdF93b3JkIgorQ0FURUdPUllfVU5JX0RJR0lUID0gImNhdGVnb3J5X3VuaV9kaWdpdCIKK0NBVEVHT1JZX1VOSV9OT1RfRElHSVQgPSAiY2F0ZWdvcnlfdW5pX25vdF9kaWdpdCIKK0NBVEVHT1JZX1VOSV9TUEFDRSA9ICJjYXRlZ29yeV91bmlfc3BhY2UiCitDQVRFR09SWV9VTklfTk9UX1NQQUNFID0gImNhdGVnb3J5X3VuaV9ub3Rfc3BhY2UiCitDQVRFR09SWV9VTklfV09SRCA9ICJjYXRlZ29yeV91bmlfd29yZCIKK0NBVEVHT1JZX1VOSV9OT1RfV09SRCA9ICJjYXRlZ29yeV91bmlfbm90X3dvcmQiCitDQVRFR09SWV9VTklfTElORUJSRUFLID0gImNhdGVnb3J5X3VuaV9saW5lYnJlYWsiCitDQVRFR09SWV9VTklfTk9UX0xJTkVCUkVBSyA9ICJjYXRlZ29yeV91bmlfbm90X2xpbmVicmVhayIKKworT1BDT0RFUyA9IFsKKworICAgICMgZmFpbHVyZT0wIHN1Y2Nlc3M9MSAoanVzdCBiZWNhdXNlIGl0IGxvb2tzIGJldHRlciB0aGF0IHdheSA6LSkKKyAgICBGQUlMVVJFLCBTVUNDRVNTLAorCisgICAgQU5ZLCBBTllfQUxMLAorICAgIEFTU0VSVCwgQVNTRVJUX05PVCwKKyAgICBBVCwKKyAgICBCUkFOQ0gsCisgICAgQ0FMTCwKKyAgICBDQVRFR09SWSwKKyAgICBDSEFSU0VULCBCSUdDSEFSU0VULAorICAgIEdST1VQUkVGLCBHUk9VUFJFRl9FWElTVFMsIEdST1VQUkVGX0lHTk9SRSwKKyAgICBJTiwgSU5fSUdOT1JFLAorICAgIElORk8sCisgICAgSlVNUCwKKyAgICBMSVRFUkFMLCBMSVRFUkFMX0lHTk9SRSwKKyAgICBNQVJLLAorICAgIE1BWF9VTlRJTCwKKyAgICBNSU5fVU5USUwsCisgICAgTk9UX0xJVEVSQUwsIE5PVF9MSVRFUkFMX0lHTk9SRSwKKyAgICBORUdBVEUsCisgICAgUkFOR0UsCisgICAgUkVQRUFULAorICAgIFJFUEVBVF9PTkUsCisgICAgU1VCUEFUVEVSTiwKKyAgICBNSU5fUkVQRUFUX09ORQorCitdCisKK0FUQ09ERVMgPSBbCisgICAgQVRfQkVHSU5OSU5HLCBBVF9CRUdJTk5JTkdfTElORSwgQVRfQkVHSU5OSU5HX1NUUklORywgQVRfQk9VTkRBUlksCisgICAgQVRfTk9OX0JPVU5EQVJZLCBBVF9FTkQsIEFUX0VORF9MSU5FLCBBVF9FTkRfU1RSSU5HLAorICAgIEFUX0xPQ19CT1VOREFSWSwgQVRfTE9DX05PTl9CT1VOREFSWSwgQVRfVU5JX0JPVU5EQVJZLAorICAgIEFUX1VOSV9OT05fQk9VTkRBUlkKK10KKworQ0hDT0RFUyA9IFsKKyAgICBDQVRFR09SWV9ESUdJVCwgQ0FURUdPUllfTk9UX0RJR0lULCBDQVRFR09SWV9TUEFDRSwKKyAgICBDQVRFR09SWV9OT1RfU1BBQ0UsIENBVEVHT1JZX1dPUkQsIENBVEVHT1JZX05PVF9XT1JELAorICAgIENBVEVHT1JZX0xJTkVCUkVBSywgQ0FURUdPUllfTk9UX0xJTkVCUkVBSywgQ0FURUdPUllfTE9DX1dPUkQsCisgICAgQ0FURUdPUllfTE9DX05PVF9XT1JELCBDQVRFR09SWV9VTklfRElHSVQsIENBVEVHT1JZX1VOSV9OT1RfRElHSVQsCisgICAgQ0FURUdPUllfVU5JX1NQQUNFLCBDQVRFR09SWV9VTklfTk9UX1NQQUNFLCBDQVRFR09SWV9VTklfV09SRCwKKyAgICBDQVRFR09SWV9VTklfTk9UX1dPUkQsIENBVEVHT1JZX1VOSV9MSU5FQlJFQUssCisgICAgQ0FURUdPUllfVU5JX05PVF9MSU5FQlJFQUsKK10KKworZGVmIG1ha2VkaWN0KGxpc3QpOgorICAgIGQgPSB7fQorICAgIGkgPSAwCisgICAgZm9yIGl0ZW0gaW4gbGlzdDoKKyAgICAgICAgZFtpdGVtXSA9IGkKKyAgICAgICAgaSA9IGkgKyAxCisgICAgcmV0dXJuIGQKKworT1BDT0RFUyA9IG1ha2VkaWN0KE9QQ09ERVMpCitBVENPREVTID0gbWFrZWRpY3QoQVRDT0RFUykKK0NIQ09ERVMgPSBtYWtlZGljdChDSENPREVTKQorCisjIHJlcGxhY2VtZW50IG9wZXJhdGlvbnMgZm9yICJpZ25vcmUgY2FzZSIgbW9kZQorT1BfSUdOT1JFID0geworICAgIEdST1VQUkVGOiBHUk9VUFJFRl9JR05PUkUsCisgICAgSU46IElOX0lHTk9SRSwKKyAgICBMSVRFUkFMOiBMSVRFUkFMX0lHTk9SRSwKKyAgICBOT1RfTElURVJBTDogTk9UX0xJVEVSQUxfSUdOT1JFCit9CisKK0FUX01VTFRJTElORSA9IHsKKyAgICBBVF9CRUdJTk5JTkc6IEFUX0JFR0lOTklOR19MSU5FLAorICAgIEFUX0VORDogQVRfRU5EX0xJTkUKK30KKworQVRfTE9DQUxFID0geworICAgIEFUX0JPVU5EQVJZOiBBVF9MT0NfQk9VTkRBUlksCisgICAgQVRfTk9OX0JPVU5EQVJZOiBBVF9MT0NfTk9OX0JPVU5EQVJZCit9CisKK0FUX1VOSUNPREUgPSB7CisgICAgQVRfQk9VTkRBUlk6IEFUX1VOSV9CT1VOREFSWSwKKyAgICBBVF9OT05fQk9VTkRBUlk6IEFUX1VOSV9OT05fQk9VTkRBUlkKK30KKworQ0hfTE9DQUxFID0geworICAgIENBVEVHT1JZX0RJR0lUOiBDQVRFR09SWV9ESUdJVCwKKyAgICBDQVRFR09SWV9OT1RfRElHSVQ6IENBVEVHT1JZX05PVF9ESUdJVCwKKyAgICBDQVRFR09SWV9TUEFDRTogQ0FURUdPUllfU1BBQ0UsCisgICAgQ0FURUdPUllfTk9UX1NQQUNFOiBDQVRFR09SWV9OT1RfU1BBQ0UsCisgICAgQ0FURUdPUllfV09SRDogQ0FURUdPUllfTE9DX1dPUkQsCisgICAgQ0FURUdPUllfTk9UX1dPUkQ6IENBVEVHT1JZX0xPQ19OT1RfV09SRCwKKyAgICBDQVRFR09SWV9MSU5FQlJFQUs6IENBVEVHT1JZX0xJTkVCUkVBSywKKyAgICBDQVRFR09SWV9OT1RfTElORUJSRUFLOiBDQVRFR09SWV9OT1RfTElORUJSRUFLCit9CisKK0NIX1VOSUNPREUgPSB7CisgICAgQ0FURUdPUllfRElHSVQ6IENBVEVHT1JZX1VOSV9ESUdJVCwKKyAgICBDQVRFR09SWV9OT1RfRElHSVQ6IENBVEVHT1JZX1VOSV9OT1RfRElHSVQsCisgICAgQ0FURUdPUllfU1BBQ0U6IENBVEVHT1JZX1VOSV9TUEFDRSwKKyAgICBDQVRFR09SWV9OT1RfU1BBQ0U6IENBVEVHT1JZX1VOSV9OT1RfU1BBQ0UsCisgICAgQ0FURUdPUllfV09SRDogQ0FURUdPUllfVU5JX1dPUkQsCisgICAgQ0FURUdPUllfTk9UX1dPUkQ6IENBVEVHT1JZX1VOSV9OT1RfV09SRCwKKyAgICBDQVRFR09SWV9MSU5FQlJFQUs6IENBVEVHT1JZX1VOSV9MSU5FQlJFQUssCisgICAgQ0FURUdPUllfTk9UX0xJTkVCUkVBSzogQ0FURUdPUllfVU5JX05PVF9MSU5FQlJFQUsKK30KKworIyBmbGFncworU1JFX0ZMQUdfVEVNUExBVEUgPSAxICMgdGVtcGxhdGUgbW9kZSAoZGlzYWJsZSBiYWNrdHJhY2tpbmcpCitTUkVfRkxBR19JR05PUkVDQVNFID0gMiAjIGNhc2UgaW5zZW5zaXRpdmUKK1NSRV9GTEFHX0xPQ0FMRSA9IDQgIyBob25vdXIgc3lzdGVtIGxvY2FsZQorU1JFX0ZMQUdfTVVMVElMSU5FID0gOCAjIHRyZWF0IHRhcmdldCBhcyBtdWx0aWxpbmUgc3RyaW5nCitTUkVfRkxBR19ET1RBTEwgPSAxNiAjIHRyZWF0IHRhcmdldCBhcyBhIHNpbmdsZSBzdHJpbmcKK1NSRV9GTEFHX1VOSUNPREUgPSAzMiAjIHVzZSB1bmljb2RlIGxvY2FsZQorU1JFX0ZMQUdfVkVSQk9TRSA9IDY0ICMgaWdub3JlIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzCitTUkVfRkxBR19ERUJVRyA9IDEyOCAjIGRlYnVnZ2luZworCisjIGZsYWdzIGZvciBJTkZPIHByaW1pdGl2ZQorU1JFX0lORk9fUFJFRklYID0gMSAjIGhhcyBwcmVmaXgKK1NSRV9JTkZPX0xJVEVSQUwgPSAyICMgZW50aXJlIHBhdHRlcm4gaXMgbGl0ZXJhbCAoZ2l2ZW4gYnkgcHJlZml4KQorU1JFX0lORk9fQ0hBUlNFVCA9IDQgIyBwYXR0ZXJuIHN0YXJ0cyB3aXRoIGNoYXJhY3RlciBmcm9tIGdpdmVuIHNldAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGRlZiBkdW1wKGYsIGQsIHByZWZpeCk6CisgICAgICAgIGl0ZW1zID0gZC5pdGVtcygpCisgICAgICAgIGl0ZW1zLnNvcnQoa2V5PWxhbWJkYSBhOiBhWzFdKQorICAgICAgICBmb3IgaywgdiBpbiBpdGVtczoKKyAgICAgICAgICAgIGYud3JpdGUoIiNkZWZpbmUgJXNfJXMgJXNcbiIgJSAocHJlZml4LCBrLnVwcGVyKCksIHYpKQorICAgIGYgPSBvcGVuKCJzcmVfY29uc3RhbnRzLmgiLCAidyIpCisgICAgZi53cml0ZSgiIiJcCisvKgorICogU2VjcmV0IExhYnMnIFJlZ3VsYXIgRXhwcmVzc2lvbiBFbmdpbmUKKyAqCisgKiByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hpbmcgZW5naW5lCisgKgorICogTk9URTogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBieSBzcmVfY29uc3RhbnRzLnB5LiAgSWYgeW91IG5lZWQKKyAqIHRvIGNoYW5nZSBhbnl0aGluZyBpbiBoZXJlLCBlZGl0IHNyZV9jb25zdGFudHMucHkgYW5kIHJ1biBpdC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMSBieSBTZWNyZXQgTGFicyBBQi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU2VlIHRoZSBfc3JlLmMgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gdXNhZ2UgYW5kIHJlZGlzdHJpYnV0aW9uLgorICovCisKKyIiIikKKworICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX01BR0lDICVkXG4iICUgTUFHSUMpCisKKyAgICBkdW1wKGYsIE9QQ09ERVMsICJTUkVfT1AiKQorICAgIGR1bXAoZiwgQVRDT0RFUywgIlNSRSIpCisgICAgZHVtcChmLCBDSENPREVTLCAiU1JFIikKKworICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfVEVNUExBVEUgJWRcbiIgJSBTUkVfRkxBR19URU1QTEFURSkKKyAgICBmLndyaXRlKCIjZGVmaW5lIFNSRV9GTEFHX0lHTk9SRUNBU0UgJWRcbiIgJSBTUkVfRkxBR19JR05PUkVDQVNFKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfTE9DQUxFICVkXG4iICUgU1JFX0ZMQUdfTE9DQUxFKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfTVVMVElMSU5FICVkXG4iICUgU1JFX0ZMQUdfTVVMVElMSU5FKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfRE9UQUxMICVkXG4iICUgU1JFX0ZMQUdfRE9UQUxMKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0ZMQUdfVU5JQ09ERSAlZFxuIiAlIFNSRV9GTEFHX1VOSUNPREUpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfRkxBR19WRVJCT1NFICVkXG4iICUgU1JFX0ZMQUdfVkVSQk9TRSkKKworICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0lORk9fUFJFRklYICVkXG4iICUgU1JFX0lORk9fUFJFRklYKQorICAgIGYud3JpdGUoIiNkZWZpbmUgU1JFX0lORk9fTElURVJBTCAlZFxuIiAlIFNSRV9JTkZPX0xJVEVSQUwpCisgICAgZi53cml0ZSgiI2RlZmluZSBTUkVfSU5GT19DSEFSU0VUICVkXG4iICUgU1JFX0lORk9fQ0hBUlNFVCkKKworICAgIGYuY2xvc2UoKQorICAgIHByaW50ICJkb25lIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5YyBiL2xpYi9weXRob24yLjcvc3JlX2NvbnN0YW50cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0MzdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3JlX2NvbnN0YW50cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfY29uc3RhbnRzLnB5byBiL2xpYi9weXRob24yLjcvc3JlX2NvbnN0YW50cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0MzdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3JlX2NvbnN0YW50cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHkgYi9saWIvcHl0aG9uMi43L3NyZV9wYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY4Yzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHkKQEAgLTAsMCArMSw4MDMgQEAKKyMKKyMgU2VjcmV0IExhYnMnIFJlZ3VsYXIgRXhwcmVzc2lvbiBFbmdpbmUKKyMKKyMgY29udmVydCByZS1zdHlsZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc3JlIHBhdHRlcm4KKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDEgYnkgU2VjcmV0IExhYnMgQUIuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBTZWUgdGhlIHNyZS5weSBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiB1c2FnZSBhbmQgcmVkaXN0cmlidXRpb24uCisjCisKKyIiIkludGVybmFsIHN1cHBvcnQgbW9kdWxlIGZvciBzcmUiIiIKKworIyBYWFg6IHNob3cgc3RyaW5nIG9mZnNldCBhbmQgb2ZmZW5kaW5nIGNoYXJhY3RlciBmb3IgYWxsIGVycm9ycworCitpbXBvcnQgc3lzCisKK2Zyb20gc3JlX2NvbnN0YW50cyBpbXBvcnQgKgorZnJvbSBfc3JlIGltcG9ydCBNQVhSRVBFQVQKKworU1BFQ0lBTF9DSEFSUyA9ICIuXFxbeygpKis/XiR8IgorUkVQRUFUX0NIQVJTID0gIiorP3siCisKK0RJR0lUUyA9IHNldCgiMDEyMzQ1Njc4OSIpCisKK09DVERJR0lUUyA9IHNldCgiMDEyMzQ1NjciKQorSEVYRElHSVRTID0gc2V0KCIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGIikKKworV0hJVEVTUEFDRSA9IHNldCgiIFx0XG5cclx2XGYiKQorCitFU0NBUEVTID0geworICAgIHIiXGEiOiAoTElURVJBTCwgb3JkKCJcYSIpKSwKKyAgICByIlxiIjogKExJVEVSQUwsIG9yZCgiXGIiKSksCisgICAgciJcZiI6IChMSVRFUkFMLCBvcmQoIlxmIikpLAorICAgIHIiXG4iOiAoTElURVJBTCwgb3JkKCJcbiIpKSwKKyAgICByIlxyIjogKExJVEVSQUwsIG9yZCgiXHIiKSksCisgICAgciJcdCI6IChMSVRFUkFMLCBvcmQoIlx0IikpLAorICAgIHIiXHYiOiAoTElURVJBTCwgb3JkKCJcdiIpKSwKKyAgICByIlxcIjogKExJVEVSQUwsIG9yZCgiXFwiKSkKK30KKworQ0FURUdPUklFUyA9IHsKKyAgICByIlxBIjogKEFULCBBVF9CRUdJTk5JTkdfU1RSSU5HKSwgIyBzdGFydCBvZiBzdHJpbmcKKyAgICByIlxiIjogKEFULCBBVF9CT1VOREFSWSksCisgICAgciJcQiI6IChBVCwgQVRfTk9OX0JPVU5EQVJZKSwKKyAgICByIlxkIjogKElOLCBbKENBVEVHT1JZLCBDQVRFR09SWV9ESUdJVCldKSwKKyAgICByIlxEIjogKElOLCBbKENBVEVHT1JZLCBDQVRFR09SWV9OT1RfRElHSVQpXSksCisgICAgciJccyI6IChJTiwgWyhDQVRFR09SWSwgQ0FURUdPUllfU1BBQ0UpXSksCisgICAgciJcUyI6IChJTiwgWyhDQVRFR09SWSwgQ0FURUdPUllfTk9UX1NQQUNFKV0pLAorICAgIHIiXHciOiAoSU4sIFsoQ0FURUdPUlksIENBVEVHT1JZX1dPUkQpXSksCisgICAgciJcVyI6IChJTiwgWyhDQVRFR09SWSwgQ0FURUdPUllfTk9UX1dPUkQpXSksCisgICAgciJcWiI6IChBVCwgQVRfRU5EX1NUUklORyksICMgZW5kIG9mIHN0cmluZworfQorCitGTEFHUyA9IHsKKyAgICAjIHN0YW5kYXJkIGZsYWdzCisgICAgImkiOiBTUkVfRkxBR19JR05PUkVDQVNFLAorICAgICJMIjogU1JFX0ZMQUdfTE9DQUxFLAorICAgICJtIjogU1JFX0ZMQUdfTVVMVElMSU5FLAorICAgICJzIjogU1JFX0ZMQUdfRE9UQUxMLAorICAgICJ4IjogU1JFX0ZMQUdfVkVSQk9TRSwKKyAgICAjIGV4dGVuc2lvbnMKKyAgICAidCI6IFNSRV9GTEFHX1RFTVBMQVRFLAorICAgICJ1IjogU1JFX0ZMQUdfVU5JQ09ERSwKK30KKworY2xhc3MgUGF0dGVybjoKKyAgICAjIG1hc3RlciBwYXR0ZXJuIG9iamVjdC4gIGtlZXBzIHRyYWNrIG9mIGdsb2JhbCBhdHRyaWJ1dGVzCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmZsYWdzID0gMAorICAgICAgICBzZWxmLm9wZW4gPSBbXQorICAgICAgICBzZWxmLmdyb3VwcyA9IDEKKyAgICAgICAgc2VsZi5ncm91cGRpY3QgPSB7fQorICAgIGRlZiBvcGVuZ3JvdXAoc2VsZiwgbmFtZT1Ob25lKToKKyAgICAgICAgZ2lkID0gc2VsZi5ncm91cHMKKyAgICAgICAgc2VsZi5ncm91cHMgPSBnaWQgKyAxCisgICAgICAgIGlmIG5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvZ2lkID0gc2VsZi5ncm91cGRpY3QuZ2V0KG5hbWUsIE5vbmUpCisgICAgICAgICAgICBpZiBvZ2lkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAoInJlZGVmaW5pdGlvbiBvZiBncm91cCBuYW1lICVzIGFzIGdyb3VwICVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2FzIGdyb3VwICVkIiAlIChyZXByKG5hbWUpLCBnaWQsICBvZ2lkKSkKKyAgICAgICAgICAgIHNlbGYuZ3JvdXBkaWN0W25hbWVdID0gZ2lkCisgICAgICAgIHNlbGYub3Blbi5hcHBlbmQoZ2lkKQorICAgICAgICByZXR1cm4gZ2lkCisgICAgZGVmIGNsb3NlZ3JvdXAoc2VsZiwgZ2lkKToKKyAgICAgICAgc2VsZi5vcGVuLnJlbW92ZShnaWQpCisgICAgZGVmIGNoZWNrZ3JvdXAoc2VsZiwgZ2lkKToKKyAgICAgICAgcmV0dXJuIGdpZCA8IHNlbGYuZ3JvdXBzIGFuZCBnaWQgbm90IGluIHNlbGYub3BlbgorCitjbGFzcyBTdWJQYXR0ZXJuOgorICAgICMgYSBzdWJwYXR0ZXJuLCBpbiBpbnRlcm1lZGlhdGUgZm9ybQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXR0ZXJuLCBkYXRhPU5vbmUpOgorICAgICAgICBzZWxmLnBhdHRlcm4gPSBwYXR0ZXJuCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBzZWxmLmRhdGEgPSBkYXRhCisgICAgICAgIHNlbGYud2lkdGggPSBOb25lCisgICAgZGVmIGR1bXAoc2VsZiwgbGV2ZWw9MCk6CisgICAgICAgIG5sID0gMQorICAgICAgICBzZXF0eXBlcyA9IHR5cGUoKCkpLCB0eXBlKFtdKQorICAgICAgICBmb3Igb3AsIGF2IGluIHNlbGYuZGF0YToKKyAgICAgICAgICAgIHByaW50IGxldmVsKiIgICIgKyBvcCw7IG5sID0gMAorICAgICAgICAgICAgaWYgb3AgPT0gImluIjoKKyAgICAgICAgICAgICAgICAjIG1lbWJlciBzdWJsYW5ndWFnZQorICAgICAgICAgICAgICAgIHByaW50OyBubCA9IDEKKyAgICAgICAgICAgICAgICBmb3Igb3AsIGEgaW4gYXY6CisgICAgICAgICAgICAgICAgICAgIHByaW50IChsZXZlbCsxKSoiICAiICsgb3AsIGEKKyAgICAgICAgICAgIGVsaWYgb3AgPT0gImJyYW5jaCI6CisgICAgICAgICAgICAgICAgcHJpbnQ7IG5sID0gMQorICAgICAgICAgICAgICAgIGkgPSAwCisgICAgICAgICAgICAgICAgZm9yIGEgaW4gYXZbMV06CisgICAgICAgICAgICAgICAgICAgIGlmIGkgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgbGV2ZWwqIiAgIiArICJvciIKKyAgICAgICAgICAgICAgICAgICAgYS5kdW1wKGxldmVsKzEpOyBubCA9IDEKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgICAgICBlbGlmIHR5cGUoYXYpIGluIHNlcXR5cGVzOgorICAgICAgICAgICAgICAgIGZvciBhIGluIGF2OgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGEsIFN1YlBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG5sOiBwcmludAorICAgICAgICAgICAgICAgICAgICAgICAgYS5kdW1wKGxldmVsKzEpOyBubCA9IDEKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IGEsIDsgbmwgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50IGF2LCA7IG5sID0gMAorICAgICAgICAgICAgaWYgbm90IG5sOiBwcmludAorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi5kYXRhKQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGF0YSkKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICBkZWwgc2VsZi5kYXRhW2luZGV4XQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5kZXgsIHNsaWNlKToKKyAgICAgICAgICAgIHJldHVybiBTdWJQYXR0ZXJuKHNlbGYucGF0dGVybiwgc2VsZi5kYXRhW2luZGV4XSkKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtpbmRleF0KKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIGNvZGUpOgorICAgICAgICBzZWxmLmRhdGFbaW5kZXhdID0gY29kZQorICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGNvZGUpOgorICAgICAgICBzZWxmLmRhdGEuaW5zZXJ0KGluZGV4LCBjb2RlKQorICAgIGRlZiBhcHBlbmQoc2VsZiwgY29kZSk6CisgICAgICAgIHNlbGYuZGF0YS5hcHBlbmQoY29kZSkKKyAgICBkZWYgZ2V0d2lkdGgoc2VsZik6CisgICAgICAgICMgZGV0ZXJtaW5lIHRoZSB3aWR0aCAobWluLCBtYXgpIGZvciB0aGlzIHN1YnBhdHRlcm4KKyAgICAgICAgaWYgc2VsZi53aWR0aDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndpZHRoCisgICAgICAgIGxvID0gaGkgPSAwTAorICAgICAgICBVTklUQ09ERVMgPSAoQU5ZLCBSQU5HRSwgSU4sIExJVEVSQUwsIE5PVF9MSVRFUkFMLCBDQVRFR09SWSkKKyAgICAgICAgUkVQRUFUQ09ERVMgPSAoTUlOX1JFUEVBVCwgTUFYX1JFUEVBVCkKKyAgICAgICAgZm9yIG9wLCBhdiBpbiBzZWxmLmRhdGE6CisgICAgICAgICAgICBpZiBvcCBpcyBCUkFOQ0g6CisgICAgICAgICAgICAgICAgaSA9IHN5cy5tYXhpbnQKKyAgICAgICAgICAgICAgICBqID0gMAorICAgICAgICAgICAgICAgIGZvciBhdiBpbiBhdlsxXToKKyAgICAgICAgICAgICAgICAgICAgbCwgaCA9IGF2LmdldHdpZHRoKCkKKyAgICAgICAgICAgICAgICAgICAgaSA9IG1pbihpLCBsKQorICAgICAgICAgICAgICAgICAgICBqID0gbWF4KGosIGgpCisgICAgICAgICAgICAgICAgbG8gPSBsbyArIGkKKyAgICAgICAgICAgICAgICBoaSA9IGhpICsgagorICAgICAgICAgICAgZWxpZiBvcCBpcyBDQUxMOgorICAgICAgICAgICAgICAgIGksIGogPSBhdi5nZXR3aWR0aCgpCisgICAgICAgICAgICAgICAgbG8gPSBsbyArIGkKKyAgICAgICAgICAgICAgICBoaSA9IGhpICsgagorICAgICAgICAgICAgZWxpZiBvcCBpcyBTVUJQQVRURVJOOgorICAgICAgICAgICAgICAgIGksIGogPSBhdlsxXS5nZXR3aWR0aCgpCisgICAgICAgICAgICAgICAgbG8gPSBsbyArIGkKKyAgICAgICAgICAgICAgICBoaSA9IGhpICsgagorICAgICAgICAgICAgZWxpZiBvcCBpbiBSRVBFQVRDT0RFUzoKKyAgICAgICAgICAgICAgICBpLCBqID0gYXZbMl0uZ2V0d2lkdGgoKQorICAgICAgICAgICAgICAgIGxvID0gbG8gKyBsb25nKGkpICogYXZbMF0KKyAgICAgICAgICAgICAgICBoaSA9IGhpICsgbG9uZyhqKSAqIGF2WzFdCisgICAgICAgICAgICBlbGlmIG9wIGluIFVOSVRDT0RFUzoKKyAgICAgICAgICAgICAgICBsbyA9IGxvICsgMQorICAgICAgICAgICAgICAgIGhpID0gaGkgKyAxCisgICAgICAgICAgICBlbGlmIG9wID09IFNVQ0NFU1M6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi53aWR0aCA9IGludChtaW4obG8sIHN5cy5tYXhpbnQpKSwgaW50KG1pbihoaSwgc3lzLm1heGludCkpCisgICAgICAgIHJldHVybiBzZWxmLndpZHRoCisKK2NsYXNzIFRva2VuaXplcjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyaW5nKToKKyAgICAgICAgc2VsZi5zdHJpbmcgPSBzdHJpbmcKKyAgICAgICAgc2VsZi5pbmRleCA9IDAKKyAgICAgICAgc2VsZi5fX25leHQoKQorICAgIGRlZiBfX25leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaW5kZXggPj0gbGVuKHNlbGYuc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYubmV4dCA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjaGFyID0gc2VsZi5zdHJpbmdbc2VsZi5pbmRleF0KKyAgICAgICAgaWYgY2hhclswXSA9PSAiXFwiOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGMgPSBzZWxmLnN0cmluZ1tzZWxmLmluZGV4ICsgMV0KKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlIChlbmQgb2YgbGluZSkiCisgICAgICAgICAgICBjaGFyID0gY2hhciArIGMKKyAgICAgICAgc2VsZi5pbmRleCA9IHNlbGYuaW5kZXggKyBsZW4oY2hhcikKKyAgICAgICAgc2VsZi5uZXh0ID0gY2hhcgorICAgIGRlZiBtYXRjaChzZWxmLCBjaGFyLCBza2lwPTEpOgorICAgICAgICBpZiBjaGFyID09IHNlbGYubmV4dDoKKyAgICAgICAgICAgIGlmIHNraXA6CisgICAgICAgICAgICAgICAgc2VsZi5fX25leHQoKQorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuIDAKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICB0aGlzID0gc2VsZi5uZXh0CisgICAgICAgIHNlbGYuX19uZXh0KCkKKyAgICAgICAgcmV0dXJuIHRoaXMKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXgsIHNlbGYubmV4dAorICAgIGRlZiBzZWVrKHNlbGYsIGluZGV4KToKKyAgICAgICAgc2VsZi5pbmRleCwgc2VsZi5uZXh0ID0gaW5kZXgKKworZGVmIGlzaWRlbnQoY2hhcik6CisgICAgcmV0dXJuICJhIiA8PSBjaGFyIDw9ICJ6IiBvciAiQSIgPD0gY2hhciA8PSAiWiIgb3IgY2hhciA9PSAiXyIKKworZGVmIGlzZGlnaXQoY2hhcik6CisgICAgcmV0dXJuICIwIiA8PSBjaGFyIDw9ICI5IgorCitkZWYgaXNuYW1lKG5hbWUpOgorICAgICMgY2hlY2sgdGhhdCBncm91cCBuYW1lIGlzIGEgdmFsaWQgc3RyaW5nCisgICAgaWYgbm90IGlzaWRlbnQobmFtZVswXSk6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZvciBjaGFyIGluIG5hbWVbMTpdOgorICAgICAgICBpZiBub3QgaXNpZGVudChjaGFyKSBhbmQgbm90IGlzZGlnaXQoY2hhcik6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICByZXR1cm4gVHJ1ZQorCitkZWYgX2NsYXNzX2VzY2FwZShzb3VyY2UsIGVzY2FwZSk6CisgICAgIyBoYW5kbGUgZXNjYXBlIGNvZGUgaW5zaWRlIGNoYXJhY3RlciBjbGFzcworICAgIGNvZGUgPSBFU0NBUEVTLmdldChlc2NhcGUpCisgICAgaWYgY29kZToKKyAgICAgICAgcmV0dXJuIGNvZGUKKyAgICBjb2RlID0gQ0FURUdPUklFUy5nZXQoZXNjYXBlKQorICAgIGlmIGNvZGUgYW5kIGNvZGVbMF0gPT0gSU46CisgICAgICAgIHJldHVybiBjb2RlCisgICAgdHJ5OgorICAgICAgICBjID0gZXNjYXBlWzE6Ml0KKyAgICAgICAgaWYgYyA9PSAieCI6CisgICAgICAgICAgICAjIGhleGFkZWNpbWFsIGVzY2FwZSAoZXhhY3RseSB0d28gZGlnaXRzKQorICAgICAgICAgICAgd2hpbGUgc291cmNlLm5leHQgaW4gSEVYRElHSVRTIGFuZCBsZW4oZXNjYXBlKSA8IDQ6CisgICAgICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCisgICAgICAgICAgICBlc2NhcGUgPSBlc2NhcGVbMjpdCisgICAgICAgICAgICBpZiBsZW4oZXNjYXBlKSAhPSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgZXNjYXBlOiAlcyIgJSByZXByKCJcXCIgKyBlc2NhcGUpCisgICAgICAgICAgICByZXR1cm4gTElURVJBTCwgaW50KGVzY2FwZSwgMTYpICYgMHhmZgorICAgICAgICBlbGlmIGMgaW4gT0NURElHSVRTOgorICAgICAgICAgICAgIyBvY3RhbCBlc2NhcGUgKHVwIHRvIHRocmVlIGRpZ2l0cykKKyAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUyBhbmQgbGVuKGVzY2FwZSkgPCA0OgorICAgICAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQorICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlWzE6XQorICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGUsIDgpICYgMHhmZgorICAgICAgICBlbGlmIGMgaW4gRElHSVRTOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJib2d1cyBlc2NhcGU6ICVzIiAlIHJlcHIoZXNjYXBlKQorICAgICAgICBpZiBsZW4oZXNjYXBlKSA9PSAyOgorICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIG9yZChlc2NhcGVbMV0pCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByYWlzZSBlcnJvciwgImJvZ3VzIGVzY2FwZTogJXMiICUgcmVwcihlc2NhcGUpCisKK2RlZiBfZXNjYXBlKHNvdXJjZSwgZXNjYXBlLCBzdGF0ZSk6CisgICAgIyBoYW5kbGUgZXNjYXBlIGNvZGUgaW4gZXhwcmVzc2lvbgorICAgIGNvZGUgPSBDQVRFR09SSUVTLmdldChlc2NhcGUpCisgICAgaWYgY29kZToKKyAgICAgICAgcmV0dXJuIGNvZGUKKyAgICBjb2RlID0gRVNDQVBFUy5nZXQoZXNjYXBlKQorICAgIGlmIGNvZGU6CisgICAgICAgIHJldHVybiBjb2RlCisgICAgdHJ5OgorICAgICAgICBjID0gZXNjYXBlWzE6Ml0KKyAgICAgICAgaWYgYyA9PSAieCI6CisgICAgICAgICAgICAjIGhleGFkZWNpbWFsIGVzY2FwZQorICAgICAgICAgICAgd2hpbGUgc291cmNlLm5leHQgaW4gSEVYRElHSVRTIGFuZCBsZW4oZXNjYXBlKSA8IDQ6CisgICAgICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCisgICAgICAgICAgICBpZiBsZW4oZXNjYXBlKSAhPSA0OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBpbnQoZXNjYXBlWzI6XSwgMTYpICYgMHhmZgorICAgICAgICBlbGlmIGMgPT0gIjAiOgorICAgICAgICAgICAgIyBvY3RhbCBlc2NhcGUKKyAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUyBhbmQgbGVuKGVzY2FwZSkgPCA0OgorICAgICAgICAgICAgICAgIGVzY2FwZSA9IGVzY2FwZSArIHNvdXJjZS5nZXQoKQorICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIGludChlc2NhcGVbMTpdLCA4KSAmIDB4ZmYKKyAgICAgICAgZWxpZiBjIGluIERJR0lUUzoKKyAgICAgICAgICAgICMgb2N0YWwgZXNjYXBlICpvciogZGVjaW1hbCBncm91cCByZWZlcmVuY2UgKHNpZ2gpCisgICAgICAgICAgICBpZiBzb3VyY2UubmV4dCBpbiBESUdJVFM6CisgICAgICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCisgICAgICAgICAgICAgICAgaWYgKGVzY2FwZVsxXSBpbiBPQ1RESUdJVFMgYW5kIGVzY2FwZVsyXSBpbiBPQ1RESUdJVFMgYW5kCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5uZXh0IGluIE9DVERJR0lUUyk6CisgICAgICAgICAgICAgICAgICAgICMgZ290IHRocmVlIG9jdGFsIGRpZ2l0czsgdGhpcyBpcyBhbiBvY3RhbCBlc2NhcGUKKyAgICAgICAgICAgICAgICAgICAgZXNjYXBlID0gZXNjYXBlICsgc291cmNlLmdldCgpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBMSVRFUkFMLCBpbnQoZXNjYXBlWzE6XSwgOCkgJiAweGZmCisgICAgICAgICAgICAjIG5vdCBhbiBvY3RhbCBlc2NhcGUsIHNvIHRoaXMgaXMgYSBncm91cCByZWZlcmVuY2UKKyAgICAgICAgICAgIGdyb3VwID0gaW50KGVzY2FwZVsxOl0pCisgICAgICAgICAgICBpZiBncm91cCA8IHN0YXRlLmdyb3VwczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc3RhdGUuY2hlY2tncm91cChncm91cCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiY2Fubm90IHJlZmVyIHRvIG9wZW4gZ3JvdXAiCisgICAgICAgICAgICAgICAgcmV0dXJuIEdST1VQUkVGLCBncm91cAorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBpZiBsZW4oZXNjYXBlKSA9PSAyOgorICAgICAgICAgICAgcmV0dXJuIExJVEVSQUwsIG9yZChlc2NhcGVbMV0pCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByYWlzZSBlcnJvciwgImJvZ3VzIGVzY2FwZTogJXMiICUgcmVwcihlc2NhcGUpCisKK2RlZiBfcGFyc2Vfc3ViKHNvdXJjZSwgc3RhdGUsIG5lc3RlZD0xKToKKyAgICAjIHBhcnNlIGFuIGFsdGVybmF0aW9uOiBhfGJ8YworCisgICAgaXRlbXMgPSBbXQorICAgIGl0ZW1zYXBwZW5kID0gaXRlbXMuYXBwZW5kCisgICAgc291cmNlbWF0Y2ggPSBzb3VyY2UubWF0Y2gKKyAgICB3aGlsZSAxOgorICAgICAgICBpdGVtc2FwcGVuZChfcGFyc2Uoc291cmNlLCBzdGF0ZSkpCisgICAgICAgIGlmIHNvdXJjZW1hdGNoKCJ8Iik6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBub3QgbmVzdGVkOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IHNvdXJjZS5uZXh0IG9yIHNvdXJjZW1hdGNoKCIpIiwgMCk6CisgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJwYXR0ZXJuIG5vdCBwcm9wZXJseSBjbG9zZWQiCisKKyAgICBpZiBsZW4oaXRlbXMpID09IDE6CisgICAgICAgIHJldHVybiBpdGVtc1swXQorCisgICAgc3VicGF0dGVybiA9IFN1YlBhdHRlcm4oc3RhdGUpCisgICAgc3VicGF0dGVybmFwcGVuZCA9IHN1YnBhdHRlcm4uYXBwZW5kCisKKyAgICAjIGNoZWNrIGlmIGFsbCBpdGVtcyBzaGFyZSBhIGNvbW1vbiBwcmVmaXgKKyAgICB3aGlsZSAxOgorICAgICAgICBwcmVmaXggPSBOb25lCisgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgaWYgbm90IGl0ZW06CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHByZWZpeCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHByZWZpeCA9IGl0ZW1bMF0KKyAgICAgICAgICAgIGVsaWYgaXRlbVswXSAhPSBwcmVmaXg6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgYWxsIHN1Yml0ZW1zIHN0YXJ0IHdpdGggYSBjb21tb24gInByZWZpeCIuCisgICAgICAgICAgICAjIG1vdmUgaXQgb3V0IG9mIHRoZSBicmFuY2gKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgICAgIGRlbCBpdGVtWzBdCisgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKHByZWZpeCkKKyAgICAgICAgICAgIGNvbnRpbnVlICMgY2hlY2sgbmV4dCBvbmUKKyAgICAgICAgYnJlYWsKKworICAgICMgY2hlY2sgaWYgdGhlIGJyYW5jaCBjYW4gYmUgcmVwbGFjZWQgYnkgYSBjaGFyYWN0ZXIgc2V0CisgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgIGlmIGxlbihpdGVtKSAhPSAxIG9yIGl0ZW1bMF1bMF0gIT0gTElURVJBTDoKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgIyB3ZSBjYW4gc3RvcmUgdGhpcyBhcyBhIGNoYXJhY3RlciBzZXQgaW5zdGVhZCBvZiBhCisgICAgICAgICMgYnJhbmNoICh0aGUgY29tcGlsZXIgbWF5IG9wdGltaXplIHRoaXMgZXZlbiBtb3JlKQorICAgICAgICBzZXQgPSBbXQorICAgICAgICBzZXRhcHBlbmQgPSBzZXQuYXBwZW5kCisgICAgICAgIGZvciBpdGVtIGluIGl0ZW1zOgorICAgICAgICAgICAgc2V0YXBwZW5kKGl0ZW1bMF0pCisgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKElOLCBzZXQpKQorICAgICAgICByZXR1cm4gc3VicGF0dGVybgorCisgICAgc3VicGF0dGVybi5hcHBlbmQoKEJSQU5DSCwgKE5vbmUsIGl0ZW1zKSkpCisgICAgcmV0dXJuIHN1YnBhdHRlcm4KKworZGVmIF9wYXJzZV9zdWJfY29uZChzb3VyY2UsIHN0YXRlLCBjb25kZ3JvdXApOgorICAgIGl0ZW1feWVzID0gX3BhcnNlKHNvdXJjZSwgc3RhdGUpCisgICAgaWYgc291cmNlLm1hdGNoKCJ8Iik6CisgICAgICAgIGl0ZW1fbm8gPSBfcGFyc2Uoc291cmNlLCBzdGF0ZSkKKyAgICAgICAgaWYgc291cmNlLm1hdGNoKCJ8Iik6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgImNvbmRpdGlvbmFsIGJhY2tyZWYgd2l0aCBtb3JlIHRoYW4gdHdvIGJyYW5jaGVzIgorICAgIGVsc2U6CisgICAgICAgIGl0ZW1fbm8gPSBOb25lCisgICAgaWYgc291cmNlLm5leHQgYW5kIG5vdCBzb3VyY2UubWF0Y2goIikiLCAwKToKKyAgICAgICAgcmFpc2UgZXJyb3IsICJwYXR0ZXJuIG5vdCBwcm9wZXJseSBjbG9zZWQiCisgICAgc3VicGF0dGVybiA9IFN1YlBhdHRlcm4oc3RhdGUpCisgICAgc3VicGF0dGVybi5hcHBlbmQoKEdST1VQUkVGX0VYSVNUUywgKGNvbmRncm91cCwgaXRlbV95ZXMsIGl0ZW1fbm8pKSkKKyAgICByZXR1cm4gc3VicGF0dGVybgorCitfUEFUVEVSTkVOREVSUyA9IHNldCgifCkiKQorX0FTU0VSVENIQVJTID0gc2V0KCI9ITwiKQorX0xPT0tCRUhJTkRBU1NFUlRDSEFSUyA9IHNldCgiPSEiKQorX1JFUEVBVENPREVTID0gc2V0KFtNSU5fUkVQRUFULCBNQVhfUkVQRUFUXSkKKworZGVmIF9wYXJzZShzb3VyY2UsIHN0YXRlKToKKyAgICAjIHBhcnNlIGEgc2ltcGxlIHBhdHRlcm4KKyAgICBzdWJwYXR0ZXJuID0gU3ViUGF0dGVybihzdGF0ZSkKKworICAgICMgcHJlY29tcHV0ZSBjb25zdGFudHMgaW50byBsb2NhbCB2YXJpYWJsZXMKKyAgICBzdWJwYXR0ZXJuYXBwZW5kID0gc3VicGF0dGVybi5hcHBlbmQKKyAgICBzb3VyY2VnZXQgPSBzb3VyY2UuZ2V0CisgICAgc291cmNlbWF0Y2ggPSBzb3VyY2UubWF0Y2gKKyAgICBfbGVuID0gbGVuCisgICAgUEFUVEVSTkVOREVSUyA9IF9QQVRURVJORU5ERVJTCisgICAgQVNTRVJUQ0hBUlMgPSBfQVNTRVJUQ0hBUlMKKyAgICBMT09LQkVISU5EQVNTRVJUQ0hBUlMgPSBfTE9PS0JFSElOREFTU0VSVENIQVJTCisgICAgUkVQRUFUQ09ERVMgPSBfUkVQRUFUQ09ERVMKKworICAgIHdoaWxlIDE6CisKKyAgICAgICAgaWYgc291cmNlLm5leHQgaW4gUEFUVEVSTkVOREVSUzoKKyAgICAgICAgICAgIGJyZWFrICMgZW5kIG9mIHN1YnBhdHRlcm4KKyAgICAgICAgdGhpcyA9IHNvdXJjZWdldCgpCisgICAgICAgIGlmIHRoaXMgaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrICMgZW5kIG9mIHBhdHRlcm4KKworICAgICAgICBpZiBzdGF0ZS5mbGFncyAmIFNSRV9GTEFHX1ZFUkJPU0U6CisgICAgICAgICAgICAjIHNraXAgd2hpdGVzcGFjZSBhbmQgY29tbWVudHMKKyAgICAgICAgICAgIGlmIHRoaXMgaW4gV0hJVEVTUEFDRToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgdGhpcyA9PSAiIyI6CisgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRoaXMgaW4gKE5vbmUsICJcbiIpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIHRoaXMgYW5kIHRoaXNbMF0gbm90IGluIFNQRUNJQUxfQ0hBUlM6CisgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChMSVRFUkFMLCBvcmQodGhpcykpKQorCisgICAgICAgIGVsaWYgdGhpcyA9PSAiWyI6CisgICAgICAgICAgICAjIGNoYXJhY3RlciBzZXQKKyAgICAgICAgICAgIHNldCA9IFtdCisgICAgICAgICAgICBzZXRhcHBlbmQgPSBzZXQuYXBwZW5kCisjIyAgICAgICAgICBpZiBzb3VyY2VtYXRjaCgiOiIpOgorIyMgICAgICAgICAgICAgIHBhc3MgIyBoYW5kbGUgY2hhcmFjdGVyIGNsYXNzZXMKKyAgICAgICAgICAgIGlmIHNvdXJjZW1hdGNoKCJeIik6CisgICAgICAgICAgICAgICAgc2V0YXBwZW5kKChORUdBVEUsIE5vbmUpKQorICAgICAgICAgICAgIyBjaGVjayByZW1haW5pbmcgY2hhcmFjdGVycworICAgICAgICAgICAgc3RhcnQgPSBzZXRbOl0KKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdGhpcyA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgaWYgdGhpcyA9PSAiXSIgYW5kIHNldCAhPSBzdGFydDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIHRoaXMgYW5kIHRoaXNbMF0gPT0gIlxcIjoKKyAgICAgICAgICAgICAgICAgICAgY29kZTEgPSBfY2xhc3NfZXNjYXBlKHNvdXJjZSwgdGhpcykKKyAgICAgICAgICAgICAgICBlbGlmIHRoaXM6CisgICAgICAgICAgICAgICAgICAgIGNvZGUxID0gTElURVJBTCwgb3JkKHRoaXMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmV4cGVjdGVkIGVuZCBvZiByZWd1bGFyIGV4cHJlc3Npb24iCisgICAgICAgICAgICAgICAgaWYgc291cmNlbWF0Y2goIi0iKToKKyAgICAgICAgICAgICAgICAgICAgIyBwb3RlbnRpYWwgcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgIGlmIHRoaXMgPT0gIl0iOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29kZTFbMF0gaXMgSU46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTEgPSBjb2RlMVsxXVswXQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXBwZW5kKGNvZGUxKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXBwZW5kKChMSVRFUkFMLCBvcmQoIi0iKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbGlmIHRoaXM6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGlzWzBdID09ICJcXCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTIgPSBfY2xhc3NfZXNjYXBlKHNvdXJjZSwgdGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZTIgPSBMSVRFUkFMLCBvcmQodGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNvZGUxWzBdICE9IExJVEVSQUwgb3IgY29kZTJbMF0gIT0gTElURVJBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgImJhZCBjaGFyYWN0ZXIgcmFuZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICBsbyA9IGNvZGUxWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IGNvZGUyWzFdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBoaSA8IGxvOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAiYmFkIGNoYXJhY3RlciByYW5nZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldGFwcGVuZCgoUkFOR0UsIChsbywgaGkpKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5leHBlY3RlZCBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIGNvZGUxWzBdIGlzIElOOgorICAgICAgICAgICAgICAgICAgICAgICAgY29kZTEgPSBjb2RlMVsxXVswXQorICAgICAgICAgICAgICAgICAgICBzZXRhcHBlbmQoY29kZTEpCisKKyAgICAgICAgICAgICMgWFhYOiA8Zmw+IHNob3VsZCBtb3ZlIHNldCBvcHRpbWl6YXRpb24gdG8gY29tcGlsZXIhCisgICAgICAgICAgICBpZiBfbGVuKHNldCk9PTEgYW5kIHNldFswXVswXSBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoc2V0WzBdKSAjIG9wdGltaXphdGlvbgorICAgICAgICAgICAgZWxpZiBfbGVuKHNldCk9PTIgYW5kIHNldFswXVswXSBpcyBORUdBVEUgYW5kIHNldFsxXVswXSBpcyBMSVRFUkFMOgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKE5PVF9MSVRFUkFMLCBzZXRbMV1bMV0pKSAjIG9wdGltaXphdGlvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFhYWDogPGZsPiBzaG91bGQgYWRkIGNoYXJtYXAgb3B0aW1pemF0aW9uIGhlcmUKKyAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChJTiwgc2V0KSkKKworICAgICAgICBlbGlmIHRoaXMgYW5kIHRoaXNbMF0gaW4gUkVQRUFUX0NIQVJTOgorICAgICAgICAgICAgIyByZXBlYXQgcHJldmlvdXMgaXRlbQorICAgICAgICAgICAgaWYgdGhpcyA9PSAiPyI6CisgICAgICAgICAgICAgICAgbWluLCBtYXggPSAwLCAxCisgICAgICAgICAgICBlbGlmIHRoaXMgPT0gIioiOgorICAgICAgICAgICAgICAgIG1pbiwgbWF4ID0gMCwgTUFYUkVQRUFUCisKKyAgICAgICAgICAgIGVsaWYgdGhpcyA9PSAiKyI6CisgICAgICAgICAgICAgICAgbWluLCBtYXggPSAxLCBNQVhSRVBFQVQKKyAgICAgICAgICAgIGVsaWYgdGhpcyA9PSAieyI6CisgICAgICAgICAgICAgICAgaWYgc291cmNlLm5leHQgPT0gIn0iOgorICAgICAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChMSVRFUkFMLCBvcmQodGhpcykpKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGhlcmUgPSBzb3VyY2UudGVsbCgpCisgICAgICAgICAgICAgICAgbWluLCBtYXggPSAwLCBNQVhSRVBFQVQKKyAgICAgICAgICAgICAgICBsbyA9IGhpID0gIiIKKyAgICAgICAgICAgICAgICB3aGlsZSBzb3VyY2UubmV4dCBpbiBESUdJVFM6CisgICAgICAgICAgICAgICAgICAgIGxvID0gbG8gKyBzb3VyY2UuZ2V0KCkKKyAgICAgICAgICAgICAgICBpZiBzb3VyY2VtYXRjaCgiLCIpOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBzb3VyY2UubmV4dCBpbiBESUdJVFM6CisgICAgICAgICAgICAgICAgICAgICAgICBoaSA9IGhpICsgc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBoaSA9IGxvCisgICAgICAgICAgICAgICAgaWYgbm90IHNvdXJjZW1hdGNoKCJ9Iik6CisgICAgICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKExJVEVSQUwsIG9yZCh0aGlzKSkpCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5zZWVrKGhlcmUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbG86CisgICAgICAgICAgICAgICAgICAgIG1pbiA9IGludChsbykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWluID49IE1BWFJFUEVBVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IoInRoZSByZXBldGl0aW9uIG51bWJlciBpcyB0b28gbGFyZ2UiKQorICAgICAgICAgICAgICAgIGlmIGhpOgorICAgICAgICAgICAgICAgICAgICBtYXggPSBpbnQoaGkpCisgICAgICAgICAgICAgICAgICAgIGlmIG1heCA+PSBNQVhSRVBFQVQ6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBPdmVyZmxvd0Vycm9yKCJ0aGUgcmVwZXRpdGlvbiBudW1iZXIgaXMgdG9vIGxhcmdlIikKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF4IDwgbWluOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoImJhZCByZXBlYXQgaW50ZXJ2YWwiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgIm5vdCBzdXBwb3J0ZWQiCisgICAgICAgICAgICAjIGZpZ3VyZSBvdXQgd2hpY2ggaXRlbSB0byByZXBlYXQKKyAgICAgICAgICAgIGlmIHN1YnBhdHRlcm46CisgICAgICAgICAgICAgICAgaXRlbSA9IHN1YnBhdHRlcm5bLTE6XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVtID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IGl0ZW0gb3IgKF9sZW4oaXRlbSkgPT0gMSBhbmQgaXRlbVswXVswXSA9PSBBVCk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJub3RoaW5nIHRvIHJlcGVhdCIKKyAgICAgICAgICAgIGlmIGl0ZW1bMF1bMF0gaW4gUkVQRUFUQ09ERVM6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJtdWx0aXBsZSByZXBlYXQiCisgICAgICAgICAgICBpZiBzb3VyY2VtYXRjaCgiPyIpOgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5bLTFdID0gKE1JTl9SRVBFQVQsIChtaW4sIG1heCwgaXRlbSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN1YnBhdHRlcm5bLTFdID0gKE1BWF9SRVBFQVQsIChtaW4sIG1heCwgaXRlbSkpCisKKyAgICAgICAgZWxpZiB0aGlzID09ICIuIjoKKyAgICAgICAgICAgIHN1YnBhdHRlcm5hcHBlbmQoKEFOWSwgTm9uZSkpCisKKyAgICAgICAgZWxpZiB0aGlzID09ICIoIjoKKyAgICAgICAgICAgIGdyb3VwID0gMQorICAgICAgICAgICAgbmFtZSA9IE5vbmUKKyAgICAgICAgICAgIGNvbmRncm91cCA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNvdXJjZW1hdGNoKCI/Iik6CisgICAgICAgICAgICAgICAgZ3JvdXAgPSAwCisgICAgICAgICAgICAgICAgIyBvcHRpb25zCisgICAgICAgICAgICAgICAgaWYgc291cmNlbWF0Y2goIlAiKToKKyAgICAgICAgICAgICAgICAgICAgIyBweXRob24gZXh0ZW5zaW9ucworICAgICAgICAgICAgICAgICAgICBpZiBzb3VyY2VtYXRjaCgiPCIpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBuYW1lZCBncm91cDogc2tpcCBmb3J3YXJkIHRvIGVuZCBvZiBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gIiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVudGVybWluYXRlZCBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgPT0gIj4iOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgY2hhcgorICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAgPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigibWlzc2luZyBncm91cCBuYW1lIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpc25hbWUobmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoImJhZCBjaGFyYWN0ZXIgaW4gZ3JvdXAgbmFtZSAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgc291cmNlbWF0Y2goIj0iKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbmFtZWQgYmFja3JlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICIiCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgPSBzb3VyY2VnZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bnRlcm1pbmF0ZWQgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyID09ICIpIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZSArIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKCJtaXNzaW5nIGdyb3VwIG5hbWUiKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzbmFtZShuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigiYmFkIGNoYXJhY3RlciBpbiBiYWNrcmVmIGdyb3VwIG5hbWUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlciIgJSBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZ2lkID0gc3RhdGUuZ3JvdXBkaWN0LmdldChuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ2lkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmtub3duIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChHUk9VUFJFRiwgZ2lkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuZXhwZWN0ZWQgZW5kIG9mIHBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVua25vd24gc3BlY2lmaWVyOiA/UCVzIiAlIGNoYXIKKyAgICAgICAgICAgICAgICBlbGlmIHNvdXJjZW1hdGNoKCI6Iik6CisgICAgICAgICAgICAgICAgICAgICMgbm9uLWNhcHR1cmluZyBncm91cAorICAgICAgICAgICAgICAgICAgICBncm91cCA9IDIKKyAgICAgICAgICAgICAgICBlbGlmIHNvdXJjZW1hdGNoKCIjIik6CisgICAgICAgICAgICAgICAgICAgICMgY29tbWVudAorICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc291cmNlLm5leHQgaXMgTm9uZSBvciBzb3VyY2UubmV4dCA9PSAiKSI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzb3VyY2VtYXRjaCgiKSIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmJhbGFuY2VkIHBhcmVudGhlc2lzIgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsaWYgc291cmNlLm5leHQgaW4gQVNTRVJUQ0hBUlM6CisgICAgICAgICAgICAgICAgICAgICMgbG9va2FoZWFkIGFzc2VydGlvbnMKKyAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgIGRpciA9IDEKKyAgICAgICAgICAgICAgICAgICAgaWYgY2hhciA9PSAiPCI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzb3VyY2UubmV4dCBub3QgaW4gTE9PS0JFSElOREFTU0VSVENIQVJTOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAic3ludGF4IGVycm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gLTEgIyBsb29rYmVoaW5kCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyID0gc291cmNlZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgcCA9IF9wYXJzZV9zdWIoc291cmNlLCBzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNvdXJjZW1hdGNoKCIpIik6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuYmFsYW5jZWQgcGFyZW50aGVzaXMiCisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgPT0gIj0iOgorICAgICAgICAgICAgICAgICAgICAgICAgc3VicGF0dGVybmFwcGVuZCgoQVNTRVJULCAoZGlyLCBwKSkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKChBU1NFUlRfTk9ULCAoZGlyLCBwKSkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBzb3VyY2VtYXRjaCgiKCIpOgorICAgICAgICAgICAgICAgICAgICAjIGNvbmRpdGlvbmFsIGJhY2tyZWZlcmVuY2UgZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgY29uZG5hbWUgPSAiIgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciA9IHNvdXJjZWdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBjaGFyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bnRlcm1pbmF0ZWQgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgPT0gIikiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBjb25kbmFtZSA9IGNvbmRuYW1lICsgY2hhcgorICAgICAgICAgICAgICAgICAgICBncm91cCA9IDIKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGNvbmRuYW1lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoIm1pc3NpbmcgZ3JvdXAgbmFtZSIpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzbmFtZShjb25kbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICBjb25kZ3JvdXAgPSBzdGF0ZS5ncm91cGRpY3QuZ2V0KGNvbmRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY29uZGdyb3VwIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmtub3duIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGdyb3VwID0gaW50KGNvbmRuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJiYWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBmbGFncworICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc291cmNlLm5leHQgaW4gRkxBR1M6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuZXhwZWN0ZWQgZW5kIG9mIHBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIHNvdXJjZS5uZXh0IGluIEZMQUdTOgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmxhZ3MgPSBzdGF0ZS5mbGFncyB8IEZMQUdTW3NvdXJjZWdldCgpXQorICAgICAgICAgICAgaWYgZ3JvdXA6CisgICAgICAgICAgICAgICAgIyBwYXJzZSBncm91cCBjb250ZW50cworICAgICAgICAgICAgICAgIGlmIGdyb3VwID09IDI6CisgICAgICAgICAgICAgICAgICAgICMgYW5vbnltb3VzIGdyb3VwCisgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gc3RhdGUub3Blbmdyb3VwKG5hbWUpCisgICAgICAgICAgICAgICAgaWYgY29uZGdyb3VwOgorICAgICAgICAgICAgICAgICAgICBwID0gX3BhcnNlX3N1Yl9jb25kKHNvdXJjZSwgc3RhdGUsIGNvbmRncm91cCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwID0gX3BhcnNlX3N1Yihzb3VyY2UsIHN0YXRlKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzb3VyY2VtYXRjaCgiKSIpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuYmFsYW5jZWQgcGFyZW50aGVzaXMiCisgICAgICAgICAgICAgICAgaWYgZ3JvdXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLmNsb3NlZ3JvdXAoZ3JvdXApCisgICAgICAgICAgICAgICAgc3VicGF0dGVybmFwcGVuZCgoU1VCUEFUVEVSTiwgKGdyb3VwLCBwKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGNoYXIgPSBzb3VyY2VnZXQoKQorICAgICAgICAgICAgICAgICAgICBpZiBjaGFyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVuZXhwZWN0ZWQgZW5kIG9mIHBhdHRlcm4iCisgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgPT0gIikiOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJ1bmtub3duIGV4dGVuc2lvbiIKKworICAgICAgICBlbGlmIHRoaXMgPT0gIl4iOgorICAgICAgICAgICAgc3VicGF0dGVybmFwcGVuZCgoQVQsIEFUX0JFR0lOTklORykpCisKKyAgICAgICAgZWxpZiB0aGlzID09ICIkIjoKKyAgICAgICAgICAgIHN1YnBhdHRlcm4uYXBwZW5kKChBVCwgQVRfRU5EKSkKKworICAgICAgICBlbGlmIHRoaXMgYW5kIHRoaXNbMF0gPT0gIlxcIjoKKyAgICAgICAgICAgIGNvZGUgPSBfZXNjYXBlKHNvdXJjZSwgdGhpcywgc3RhdGUpCisgICAgICAgICAgICBzdWJwYXR0ZXJuYXBwZW5kKGNvZGUpCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIGVycm9yLCAicGFyc2VyIGVycm9yIgorCisgICAgcmV0dXJuIHN1YnBhdHRlcm4KKworZGVmIHBhcnNlKHN0ciwgZmxhZ3M9MCwgcGF0dGVybj1Ob25lKToKKyAgICAjIHBhcnNlICdyZScgcGF0dGVybiBpbnRvIGxpc3Qgb2YgKG9wY29kZSwgYXJndW1lbnQpIHR1cGxlcworCisgICAgc291cmNlID0gVG9rZW5pemVyKHN0cikKKworICAgIGlmIHBhdHRlcm4gaXMgTm9uZToKKyAgICAgICAgcGF0dGVybiA9IFBhdHRlcm4oKQorICAgIHBhdHRlcm4uZmxhZ3MgPSBmbGFncworICAgIHBhdHRlcm4uc3RyID0gc3RyCisKKyAgICBwID0gX3BhcnNlX3N1Yihzb3VyY2UsIHBhdHRlcm4sIDApCisKKyAgICB0YWlsID0gc291cmNlLmdldCgpCisgICAgaWYgdGFpbCA9PSAiKSI6CisgICAgICAgIHJhaXNlIGVycm9yLCAidW5iYWxhbmNlZCBwYXJlbnRoZXNpcyIKKyAgICBlbGlmIHRhaWw6CisgICAgICAgIHJhaXNlIGVycm9yLCAiYm9ndXMgY2hhcmFjdGVycyBhdCBlbmQgb2YgcmVndWxhciBleHByZXNzaW9uIgorCisgICAgaWYgZmxhZ3MgJiBTUkVfRkxBR19ERUJVRzoKKyAgICAgICAgcC5kdW1wKCkKKworICAgIGlmIG5vdCAoZmxhZ3MgJiBTUkVfRkxBR19WRVJCT1NFKSBhbmQgcC5wYXR0ZXJuLmZsYWdzICYgU1JFX0ZMQUdfVkVSQk9TRToKKyAgICAgICAgIyB0aGUgVkVSQk9TRSBmbGFnIHdhcyBzd2l0Y2hlZCBvbiBpbnNpZGUgdGhlIHBhdHRlcm4uICB0byBiZQorICAgICAgICAjIG9uIHRoZSBzYWZlIHNpZGUsIHdlJ2xsIHBhcnNlIHRoZSB3aG9sZSB0aGluZyBhZ2Fpbi4uLgorICAgICAgICByZXR1cm4gcGFyc2Uoc3RyLCBwLnBhdHRlcm4uZmxhZ3MpCisKKyAgICByZXR1cm4gcAorCitkZWYgcGFyc2VfdGVtcGxhdGUoc291cmNlLCBwYXR0ZXJuKToKKyAgICAjIHBhcnNlICdyZScgcmVwbGFjZW1lbnQgc3RyaW5nIGludG8gbGlzdCBvZiBsaXRlcmFscyBhbmQKKyAgICAjIGdyb3VwIHJlZmVyZW5jZXMKKyAgICBzID0gVG9rZW5pemVyKHNvdXJjZSkKKyAgICBzZ2V0ID0gcy5nZXQKKyAgICBwID0gW10KKyAgICBhID0gcC5hcHBlbmQKKyAgICBkZWYgbGl0ZXJhbChsaXRlcmFsLCBwPXAsIHBhcHBlbmQ9YSk6CisgICAgICAgIGlmIHAgYW5kIHBbLTFdWzBdIGlzIExJVEVSQUw6CisgICAgICAgICAgICBwWy0xXSA9IExJVEVSQUwsIHBbLTFdWzFdICsgbGl0ZXJhbAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFwcGVuZCgoTElURVJBTCwgbGl0ZXJhbCkpCisgICAgc2VwID0gc291cmNlWzowXQorICAgIGlmIHR5cGUoc2VwKSBpcyB0eXBlKCIiKToKKyAgICAgICAgbWFrZWNoYXIgPSBjaHIKKyAgICBlbHNlOgorICAgICAgICBtYWtlY2hhciA9IHVuaWNocgorICAgIHdoaWxlIDE6CisgICAgICAgIHRoaXMgPSBzZ2V0KCkKKyAgICAgICAgaWYgdGhpcyBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsgIyBlbmQgb2YgcmVwbGFjZW1lbnQgc3RyaW5nCisgICAgICAgIGlmIHRoaXMgYW5kIHRoaXNbMF0gPT0gIlxcIjoKKyAgICAgICAgICAgICMgZ3JvdXAKKyAgICAgICAgICAgIGMgPSB0aGlzWzE6Ml0KKyAgICAgICAgICAgIGlmIGMgPT0gImciOgorICAgICAgICAgICAgICAgIG5hbWUgPSAiIgorICAgICAgICAgICAgICAgIGlmIHMubWF0Y2goIjwiKToKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgPSBzZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoYXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgInVudGVybWluYXRlZCBncm91cCBuYW1lIgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhciA9PSAiPiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgY2hhcgorICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwgIm1pc3NpbmcgZ3JvdXAgbmFtZSIKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gaW50KG5hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIGluZGV4IDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAibmVnYXRpdmUgZ3JvdXAgbnVtYmVyIgorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNuYW1lKG5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IsICJiYWQgY2hhcmFjdGVyIGluIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gcGF0dGVybi5ncm91cGluZGV4W25hbWVdCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IsICJ1bmtub3duIGdyb3VwIG5hbWUiCisgICAgICAgICAgICAgICAgYSgoTUFSSywgaW5kZXgpKQorICAgICAgICAgICAgZWxpZiBjID09ICIwIjoKKyAgICAgICAgICAgICAgICBpZiBzLm5leHQgaW4gT0NURElHSVRTOgorICAgICAgICAgICAgICAgICAgICB0aGlzID0gdGhpcyArIHNnZXQoKQorICAgICAgICAgICAgICAgICAgICBpZiBzLm5leHQgaW4gT0NURElHSVRTOgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHRoaXMgKyBzZ2V0KCkKKyAgICAgICAgICAgICAgICBsaXRlcmFsKG1ha2VjaGFyKGludCh0aGlzWzE6XSwgOCkgJiAweGZmKSkKKyAgICAgICAgICAgIGVsaWYgYyBpbiBESUdJVFM6CisgICAgICAgICAgICAgICAgaXNvY3RhbCA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgcy5uZXh0IGluIERJR0lUUzoKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHRoaXMgKyBzZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMgaW4gT0NURElHSVRTIGFuZCB0aGlzWzJdIGluIE9DVERJR0lUUyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHMubmV4dCBpbiBPQ1RESUdJVFMpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyA9IHRoaXMgKyBzZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzb2N0YWwgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICAgICBsaXRlcmFsKG1ha2VjaGFyKGludCh0aGlzWzE6XSwgOCkgJiAweGZmKSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNvY3RhbDoKKyAgICAgICAgICAgICAgICAgICAgYSgoTUFSSywgaW50KHRoaXNbMTpdKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdGhpcyA9IG1ha2VjaGFyKEVTQ0FQRVNbdGhpc11bMV0pCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgbGl0ZXJhbCh0aGlzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbGl0ZXJhbCh0aGlzKQorICAgICMgY29udmVydCB0ZW1wbGF0ZSB0byBncm91cHMgYW5kIGxpdGVyYWxzIGxpc3RzCisgICAgaSA9IDAKKyAgICBncm91cHMgPSBbXQorICAgIGdyb3Vwc2FwcGVuZCA9IGdyb3Vwcy5hcHBlbmQKKyAgICBsaXRlcmFscyA9IFtOb25lXSAqIGxlbihwKQorICAgIGZvciBjLCBzIGluIHA6CisgICAgICAgIGlmIGMgaXMgTUFSSzoKKyAgICAgICAgICAgIGdyb3Vwc2FwcGVuZCgoaSwgcykpCisgICAgICAgICAgICAjIGxpdGVyYWxbaV0gaXMgYWxyZWFkeSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaXRlcmFsc1tpXSA9IHMKKyAgICAgICAgaSA9IGkgKyAxCisgICAgcmV0dXJuIGdyb3VwcywgbGl0ZXJhbHMKKworZGVmIGV4cGFuZF90ZW1wbGF0ZSh0ZW1wbGF0ZSwgbWF0Y2gpOgorICAgIGcgPSBtYXRjaC5ncm91cAorICAgIHNlcCA9IG1hdGNoLnN0cmluZ1s6MF0KKyAgICBncm91cHMsIGxpdGVyYWxzID0gdGVtcGxhdGUKKyAgICBsaXRlcmFscyA9IGxpdGVyYWxzWzpdCisgICAgdHJ5OgorICAgICAgICBmb3IgaW5kZXgsIGdyb3VwIGluIGdyb3VwczoKKyAgICAgICAgICAgIGxpdGVyYWxzW2luZGV4XSA9IHMgPSBnKGdyb3VwKQorICAgICAgICAgICAgaWYgcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yLCAidW5tYXRjaGVkIGdyb3VwIgorICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICByYWlzZSBlcnJvciwgImludmFsaWQgZ3JvdXAgcmVmZXJlbmNlIgorICAgIHJldHVybiBzZXAuam9pbihsaXRlcmFscykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlX3BhcnNlLnB5YyBiL2xpYi9weXRob24yLjcvc3JlX3BhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY2NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3JlX3BhcnNlLnB5byBiL2xpYi9weXRob24yLjcvc3JlX3BhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTY2NDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zcmVfcGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3NsLnB5IGIvbGliL3B5dGhvbjIuNy9zc2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI5YjlkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3NsLnB5CkBAIC0wLDAgKzEsNDc5IEBACisjIFdyYXBwZXIgbW9kdWxlIGZvciBfc3NsLCBwcm92aWRpbmcgc29tZSBhZGRpdGlvbmFsIGZhY2lsaXRpZXMKKyMgaW1wbGVtZW50ZWQgaW4gUHl0aG9uLiAgV3JpdHRlbiBieSBCaWxsIEphbnNzZW4uCisKKyIiIlwKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIHNvbWUgbW9yZSBQeXRob25pYyBzdXBwb3J0IGZvciBTU0wuCisKK09iamVjdCB0eXBlczoKKworICBTU0xTb2NrZXQgLS0gc3VidHlwZSBvZiBzb2NrZXQuc29ja2V0IHdoaWNoIGRvZXMgU1NMIG92ZXIgdGhlIHNvY2tldAorCitFeGNlcHRpb25zOgorCisgIFNTTEVycm9yIC0tIGV4Y2VwdGlvbiByYWlzZWQgZm9yIEkvTyBlcnJvcnMKKworRnVuY3Rpb25zOgorCisgIGNlcnRfdGltZV90b19zZWNvbmRzIC0tIGNvbnZlcnQgdGltZSBzdHJpbmcgdXNlZCBmb3IgY2VydGlmaWNhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm90QmVmb3JlIGFuZCBub3RBZnRlciBmdW5jdGlvbnMgdG8gaW50ZWdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIHBhc3QgdGhlIEVwb2NoICh0aGUgdGltZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgZnJvbSB0aW1lLnRpbWUoKSkKKworICBmZXRjaF9zZXJ2ZXJfY2VydGlmaWNhdGUgKEhPU1QsIFBPUlQpIC0tIGZldGNoIHRoZSBjZXJ0aWZpY2F0ZSBwcm92aWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgc2VydmVyIHJ1bm5pbmcgb24gSE9TVCBhdCBwb3J0IFBPUlQuICBObworICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZSBpcyBwZXJmb3JtZWQuCisKK0ludGVnZXIgY29uc3RhbnRzOgorCitTU0xfRVJST1JfWkVST19SRVRVUk4KK1NTTF9FUlJPUl9XQU5UX1JFQUQKK1NTTF9FUlJPUl9XQU5UX1dSSVRFCitTU0xfRVJST1JfV0FOVF9YNTA5X0xPT0tVUAorU1NMX0VSUk9SX1NZU0NBTEwKK1NTTF9FUlJPUl9TU0wKK1NTTF9FUlJPUl9XQU5UX0NPTk5FQ1QKKworU1NMX0VSUk9SX0VPRgorU1NMX0VSUk9SX0lOVkFMSURfRVJST1JfQ09ERQorCitUaGUgZm9sbG93aW5nIGdyb3VwIGRlZmluZSBjZXJ0aWZpY2F0ZSByZXF1aXJlbWVudHMgdGhhdCBvbmUgc2lkZSBpcworYWxsb3dpbmcvcmVxdWlyaW5nIGZyb20gdGhlIG90aGVyIHNpZGU6CisKK0NFUlRfTk9ORSAtIG5vIGNlcnRpZmljYXRlcyBmcm9tIHRoZSBvdGhlciBzaWRlIGFyZSByZXF1aXJlZCAob3Igd2lsbAorICAgICAgICAgICAgYmUgbG9va2VkIGF0IGlmIHByb3ZpZGVkKQorQ0VSVF9PUFRJT05BTCAtIGNlcnRpZmljYXRlcyBhcmUgbm90IHJlcXVpcmVkLCBidXQgaWYgcHJvdmlkZWQgd2lsbCBiZQorICAgICAgICAgICAgICAgIHZhbGlkYXRlZCwgYW5kIGlmIHZhbGlkYXRpb24gZmFpbHMsIHRoZSBjb25uZWN0aW9uIHdpbGwKKyAgICAgICAgICAgICAgICBhbHNvIGZhaWwKK0NFUlRfUkVRVUlSRUQgLSBjZXJ0aWZpY2F0ZXMgYXJlIHJlcXVpcmVkLCBhbmQgd2lsbCBiZSB2YWxpZGF0ZWQsIGFuZAorICAgICAgICAgICAgICAgIGlmIHZhbGlkYXRpb24gZmFpbHMsIHRoZSBjb25uZWN0aW9uIHdpbGwgYWxzbyBmYWlsCisKK1RoZSBmb2xsb3dpbmcgY29uc3RhbnRzIGlkZW50aWZ5IHZhcmlvdXMgU1NMIHByb3RvY29sIHZhcmlhbnRzOgorCitQUk9UT0NPTF9TU0x2MgorUFJPVE9DT0xfU1NMdjMKK1BST1RPQ09MX1NTTHYyMworUFJPVE9DT0xfVExTdjEKKyIiIgorCitpbXBvcnQgdGV4dHdyYXAKKworaW1wb3J0IF9zc2wgICAgICAgICAgICAgIyBpZiB3ZSBjYW4ndCBpbXBvcnQgaXQsIGxldCB0aGUgZXJyb3IgcHJvcGFnYXRlCisKK2Zyb20gX3NzbCBpbXBvcnQgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiwgT1BFTlNTTF9WRVJTSU9OX0lORk8sIE9QRU5TU0xfVkVSU0lPTgorZnJvbSBfc3NsIGltcG9ydCBTU0xFcnJvcgorZnJvbSBfc3NsIGltcG9ydCBDRVJUX05PTkUsIENFUlRfT1BUSU9OQUwsIENFUlRfUkVRVUlSRUQKK2Zyb20gX3NzbCBpbXBvcnQgUkFORF9zdGF0dXMsIFJBTkRfZWdkLCBSQU5EX2FkZAorZnJvbSBfc3NsIGltcG9ydCBcCisgICAgIFNTTF9FUlJPUl9aRVJPX1JFVFVSTiwgXAorICAgICBTU0xfRVJST1JfV0FOVF9SRUFELCBcCisgICAgIFNTTF9FUlJPUl9XQU5UX1dSSVRFLCBcCisgICAgIFNTTF9FUlJPUl9XQU5UX1g1MDlfTE9PS1VQLCBcCisgICAgIFNTTF9FUlJPUl9TWVNDQUxMLCBcCisgICAgIFNTTF9FUlJPUl9TU0wsIFwKKyAgICAgU1NMX0VSUk9SX1dBTlRfQ09OTkVDVCwgXAorICAgICBTU0xfRVJST1JfRU9GLCBcCisgICAgIFNTTF9FUlJPUl9JTlZBTElEX0VSUk9SX0NPREUKK2Zyb20gX3NzbCBpbXBvcnQgUFJPVE9DT0xfU1NMdjMsIFBST1RPQ09MX1NTTHYyMywgUFJPVE9DT0xfVExTdjEKK19QUk9UT0NPTF9OQU1FUyA9IHsKKyAgICBQUk9UT0NPTF9UTFN2MTogIlRMU3YxIiwKKyAgICBQUk9UT0NPTF9TU0x2MjM6ICJTU0x2MjMiLAorICAgIFBST1RPQ09MX1NTTHYzOiAiU1NMdjMiLAorfQordHJ5OgorICAgIGZyb20gX3NzbCBpbXBvcnQgUFJPVE9DT0xfU1NMdjIKKyAgICBfU1NMdjJfSUZfRVhJU1RTID0gUFJPVE9DT0xfU1NMdjIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfU1NMdjJfSUZfRVhJU1RTID0gTm9uZQorZWxzZToKKyAgICBfUFJPVE9DT0xfTkFNRVNbUFJPVE9DT0xfU1NMdjJdID0gIlNTTHYyIgorCitmcm9tIHNvY2tldCBpbXBvcnQgc29ja2V0LCBfZmlsZW9iamVjdCwgX2RlbGVnYXRlX21ldGhvZHMsIGVycm9yIGFzIHNvY2tldF9lcnJvcgorZnJvbSBzb2NrZXQgaW1wb3J0IGdldG5hbWVpbmZvIGFzIF9nZXRuYW1laW5mbworaW1wb3J0IGJhc2U2NCAgICAgICAgIyBmb3IgREVSLXRvLVBFTSB0cmFuc2xhdGlvbgoraW1wb3J0IGVycm5vCisKKyMgRGlzYWJsZSB3ZWFrIG9yIGluc2VjdXJlIGNpcGhlcnMgYnkgZGVmYXVsdAorIyAoT3BlblNTTCdzIGRlZmF1bHQgc2V0dGluZyBpcyAnREVGQVVMVDohYU5VTEw6IWVOVUxMJykKK19ERUZBVUxUX0NJUEhFUlMgPSAnREVGQVVMVDohYU5VTEw6IWVOVUxMOiFMT1c6IUVYUE9SVDohU1NMdjInCisKKworY2xhc3MgU1NMU29ja2V0KHNvY2tldCk6CisKKyAgICAiIiJUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzdWJ0eXBlIG9mIHNvY2tldC5zb2NrZXQgdGhhdCB3cmFwcworICAgIHRoZSB1bmRlcmx5aW5nIE9TIHNvY2tldCBpbiBhbiBTU0wgY29udGV4dCB3aGVuIG5lY2Vzc2FyeSwgYW5kCisgICAgcHJvdmlkZXMgcmVhZCBhbmQgd3JpdGUgbWV0aG9kcyBvdmVyIHRoYXQgY2hhbm5lbC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzb2NrLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUsCisgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPUZhbHNlLCBjZXJ0X3JlcXM9Q0VSVF9OT05FLAorICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1QUk9UT0NPTF9TU0x2MjMsIGNhX2NlcnRzPU5vbmUsCisgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PVRydWUsCisgICAgICAgICAgICAgICAgIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUsIGNpcGhlcnM9Tm9uZSk6CisgICAgICAgIHNvY2tldC5fX2luaXRfXyhzZWxmLCBfc29jaz1zb2NrLl9zb2NrKQorICAgICAgICAjIFRoZSBpbml0aWFsaXplciBmb3Igc29ja2V0IG92ZXJyaWRlcyB0aGUgbWV0aG9kcyBzZW5kKCksIHJlY3YoKSwgZXRjLgorICAgICAgICAjIGluIHRoZSBpbnN0YW5jY2UsIHdoaWNoIHdlIGRvbid0IG5lZWQgLS0gYnV0IHdlIHdhbnQgdG8gcHJvdmlkZSB0aGUKKyAgICAgICAgIyBtZXRob2RzIGRlZmluZWQgaW4gU1NMU29ja2V0LgorICAgICAgICBmb3IgYXR0ciBpbiBfZGVsZWdhdGVfbWV0aG9kczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWxhdHRyKHNlbGYsIGF0dHIpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGlmIGNpcGhlcnMgaXMgTm9uZSBhbmQgc3NsX3ZlcnNpb24gIT0gX1NTTHYyX0lGX0VYSVNUUzoKKyAgICAgICAgICAgIGNpcGhlcnMgPSBfREVGQVVMVF9DSVBIRVJTCisKKyAgICAgICAgaWYgY2VydGZpbGUgYW5kIG5vdCBrZXlmaWxlOgorICAgICAgICAgICAga2V5ZmlsZSA9IGNlcnRmaWxlCisgICAgICAgICMgc2VlIGlmIGl0J3MgY29ubmVjdGVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2tldC5nZXRwZWVybmFtZShzZWxmKQorICAgICAgICBleGNlcHQgc29ja2V0X2Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FTk9UQ09OTjoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgIyBubywgbm8gY29ubmVjdGlvbiB5ZXQKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3RlZCA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLl9zc2xvYmogPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHllcywgY3JlYXRlIHRoZSBTU0wgb2JqZWN0CisgICAgICAgICAgICBzZWxmLl9jb25uZWN0ZWQgPSBUcnVlCisgICAgICAgICAgICBzZWxmLl9zc2xvYmogPSBfc3NsLnNzbHdyYXAoc2VsZi5fc29jaywgc2VydmVyX3NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZmlsZSwgY2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzLCBzc2xfdmVyc2lvbiwgY2FfY2VydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycykKKyAgICAgICAgICAgIGlmIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0OgorICAgICAgICAgICAgICAgIHNlbGYuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgc2VsZi5rZXlmaWxlID0ga2V5ZmlsZQorICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgc2VsZi5jZXJ0X3JlcXMgPSBjZXJ0X3JlcXMKKyAgICAgICAgc2VsZi5zc2xfdmVyc2lvbiA9IHNzbF92ZXJzaW9uCisgICAgICAgIHNlbGYuY2FfY2VydHMgPSBjYV9jZXJ0cworICAgICAgICBzZWxmLmNpcGhlcnMgPSBjaXBoZXJzCisgICAgICAgIHNlbGYuZG9faGFuZHNoYWtlX29uX2Nvbm5lY3QgPSBkb19oYW5kc2hha2Vfb25fY29ubmVjdAorICAgICAgICBzZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzID0gc3VwcHJlc3NfcmFnZ2VkX2VvZnMKKyAgICAgICAgc2VsZi5fbWFrZWZpbGVfcmVmcyA9IDAKKworICAgIGRlZiByZWFkKHNlbGYsIGxlbj0xMDI0KToKKworICAgICAgICAiIiJSZWFkIHVwIHRvIExFTiBieXRlcyBhbmQgcmV0dXJuIHRoZW0uCisgICAgICAgIFJldHVybiB6ZXJvLWxlbmd0aCBzdHJpbmcgb24gRU9GLiIiIgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zc2xvYmoucmVhZChsZW4pCisgICAgICAgIGV4Y2VwdCBTU0xFcnJvciwgeDoKKyAgICAgICAgICAgIGlmIHguYXJnc1swXSA9PSBTU0xfRVJST1JfRU9GIGFuZCBzZWxmLnN1cHByZXNzX3JhZ2dlZF9lb2ZzOgorICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorCisgICAgICAgICIiIldyaXRlIERBVEEgdG8gdGhlIHVuZGVybHlpbmcgU1NMIGNoYW5uZWwuICBSZXR1cm5zCisgICAgICAgIG51bWJlciBvZiBieXRlcyBvZiBEQVRBIGFjdHVhbGx5IHRyYW5zbWl0dGVkLiIiIgorCisgICAgICAgIHJldHVybiBzZWxmLl9zc2xvYmoud3JpdGUoZGF0YSkKKworICAgIGRlZiBnZXRwZWVyY2VydChzZWxmLCBiaW5hcnlfZm9ybT1GYWxzZSk6CisKKyAgICAgICAgIiIiUmV0dXJucyBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBkYXRhIGluIHRoZQorICAgICAgICBjZXJ0aWZpY2F0ZSBwcm92aWRlZCBieSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBTU0wgY2hhbm5lbC4KKyAgICAgICAgUmV0dXJuIE5vbmUgaWYgbm8gY2VydGlmaWNhdGUgd2FzIHByb3ZpZGVkLCB7fSBpZiBhCisgICAgICAgIGNlcnRpZmljYXRlIHdhcyBwcm92aWRlZCwgYnV0IG5vdCB2YWxpZGF0ZWQuIiIiCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NzbG9iai5wZWVyX2NlcnRpZmljYXRlKGJpbmFyeV9mb3JtKQorCisgICAgZGVmIGNpcGhlcihzZWxmKToKKworICAgICAgICBpZiBub3Qgc2VsZi5fc3Nsb2JqOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zc2xvYmouY2lwaGVyKCkKKworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEsIGZsYWdzPTApOgorICAgICAgICBpZiBzZWxmLl9zc2xvYmo6CisgICAgICAgICAgICBpZiBmbGFncyAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJub24temVybyBmbGFncyBub3QgYWxsb3dlZCBpbiBjYWxscyB0byBzZW5kKCkgb24gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18pCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHNlbGYuX3NzbG9iai53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTU0xFcnJvciwgeDoKKyAgICAgICAgICAgICAgICAgICAgaWYgeC5hcmdzWzBdID09IFNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgICAgICAgICBlbGlmIHguYXJnc1swXSA9PSBTU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc29jay5zZW5kKGRhdGEsIGZsYWdzKQorCisgICAgZGVmIHNlbmR0byhzZWxmLCBkYXRhLCBmbGFnc19vcl9hZGRyLCBhZGRyPU5vbmUpOgorICAgICAgICBpZiBzZWxmLl9zc2xvYmo6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZW5kdG8gbm90IGFsbG93ZWQgb24gaW5zdGFuY2VzIG9mICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fKQorICAgICAgICBlbGlmIGFkZHIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zb2NrLnNlbmR0byhkYXRhLCBmbGFnc19vcl9hZGRyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2suc2VuZHRvKGRhdGEsIGZsYWdzX29yX2FkZHIsIGFkZHIpCisKKyAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhLCBmbGFncz0wKToKKyAgICAgICAgaWYgc2VsZi5fc3Nsb2JqOgorICAgICAgICAgICAgaWYgZmxhZ3MgIT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAibm9uLXplcm8gZmxhZ3Mgbm90IGFsbG93ZWQgaW4gY2FsbHMgdG8gc2VuZGFsbCgpIG9uICVzIiAlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fKQorICAgICAgICAgICAgYW1vdW50ID0gbGVuKGRhdGEpCisgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IGFtb3VudCk6CisgICAgICAgICAgICAgICAgdiA9IHNlbGYuc2VuZChkYXRhW2NvdW50Ol0pCisgICAgICAgICAgICAgICAgY291bnQgKz0gdgorICAgICAgICAgICAgcmV0dXJuIGFtb3VudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNvY2tldC5zZW5kYWxsKHNlbGYsIGRhdGEsIGZsYWdzKQorCisgICAgZGVmIHJlY3Yoc2VsZiwgYnVmbGVuPTEwMjQsIGZsYWdzPTApOgorICAgICAgICBpZiBzZWxmLl9zc2xvYmo6CisgICAgICAgICAgICBpZiBmbGFncyAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJub24temVybyBmbGFncyBub3QgYWxsb3dlZCBpbiBjYWxscyB0byByZWN2KCkgb24gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5yZWFkKGJ1ZmxlbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zb2NrLnJlY3YoYnVmbGVuLCBmbGFncykKKworICAgIGRlZiByZWN2X2ludG8oc2VsZiwgYnVmZmVyLCBuYnl0ZXM9Tm9uZSwgZmxhZ3M9MCk6CisgICAgICAgIGlmIGJ1ZmZlciBhbmQgKG5ieXRlcyBpcyBOb25lKToKKyAgICAgICAgICAgIG5ieXRlcyA9IGxlbihidWZmZXIpCisgICAgICAgIGVsaWYgbmJ5dGVzIGlzIE5vbmU6CisgICAgICAgICAgICBuYnl0ZXMgPSAxMDI0CisgICAgICAgIGlmIHNlbGYuX3NzbG9iajoKKyAgICAgICAgICAgIGlmIGZsYWdzICE9IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICJub24temVybyBmbGFncyBub3QgYWxsb3dlZCBpbiBjYWxscyB0byByZWN2X2ludG8oKSBvbiAlcyIgJQorICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18pCisgICAgICAgICAgICB0bXBfYnVmZmVyID0gc2VsZi5yZWFkKG5ieXRlcykKKyAgICAgICAgICAgIHYgPSBsZW4odG1wX2J1ZmZlcikKKyAgICAgICAgICAgIGJ1ZmZlcls6dl0gPSB0bXBfYnVmZmVyCisgICAgICAgICAgICByZXR1cm4gdgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NvY2sucmVjdl9pbnRvKGJ1ZmZlciwgbmJ5dGVzLCBmbGFncykKKworICAgIGRlZiByZWN2ZnJvbShzZWxmLCBidWZsZW49MTAyNCwgZmxhZ3M9MCk6CisgICAgICAgIGlmIHNlbGYuX3NzbG9iajoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInJlY3Zmcm9tIG5vdCBhbGxvd2VkIG9uIGluc3RhbmNlcyBvZiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zb2NrLnJlY3Zmcm9tKGJ1ZmxlbiwgZmxhZ3MpCisKKyAgICBkZWYgcmVjdmZyb21faW50byhzZWxmLCBidWZmZXIsIG5ieXRlcz1Ob25lLCBmbGFncz0wKToKKyAgICAgICAgaWYgc2VsZi5fc3Nsb2JqOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicmVjdmZyb21faW50byBub3QgYWxsb3dlZCBvbiBpbnN0YW5jZXMgb2YgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc29jay5yZWN2ZnJvbV9pbnRvKGJ1ZmZlciwgbmJ5dGVzLCBmbGFncykKKworICAgIGRlZiBwZW5kaW5nKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9zc2xvYmo6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3Nsb2JqLnBlbmRpbmcoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiB1bndyYXAoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3NzbG9iajoKKyAgICAgICAgICAgIHMgPSBzZWxmLl9zc2xvYmouc2h1dGRvd24oKQorICAgICAgICAgICAgc2VsZi5fc3Nsb2JqID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vIFNTTCB3cmFwcGVyIGFyb3VuZCAiICsgc3RyKHNlbGYpKQorCisgICAgZGVmIHNodXRkb3duKHNlbGYsIGhvdyk6CisgICAgICAgIHNlbGYuX3NzbG9iaiA9IE5vbmUKKyAgICAgICAgc29ja2V0LnNodXRkb3duKHNlbGYsIGhvdykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbWFrZWZpbGVfcmVmcyA8IDE6CisgICAgICAgICAgICBzZWxmLl9zc2xvYmogPSBOb25lCisgICAgICAgICAgICBzb2NrZXQuY2xvc2Uoc2VsZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgLT0gMQorCisgICAgZGVmIGRvX2hhbmRzaGFrZShzZWxmKToKKworICAgICAgICAiIiJQZXJmb3JtIGEgVExTL1NTTCBoYW5kc2hha2UuIiIiCisKKyAgICAgICAgc2VsZi5fc3Nsb2JqLmRvX2hhbmRzaGFrZSgpCisKKyAgICBkZWYgX3JlYWxfY29ubmVjdChzZWxmLCBhZGRyLCByZXR1cm5fZXJybm8pOgorICAgICAgICAjIEhlcmUgd2UgYXNzdW1lIHRoYXQgdGhlIHNvY2tldCBpcyBjbGllbnQtc2lkZSwgYW5kIG5vdAorICAgICAgICAjIGNvbm5lY3RlZCBhdCB0aGUgdGltZSBvZiB0aGUgY2FsbC4gIFdlIGNvbm5lY3QgaXQsIHRoZW4gd3JhcCBpdC4KKyAgICAgICAgaWYgc2VsZi5fY29ubmVjdGVkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiYXR0ZW1wdCB0byBjb25uZWN0IGFscmVhZHktY29ubmVjdGVkIFNTTFNvY2tldCEiKQorICAgICAgICBzZWxmLl9zc2xvYmogPSBfc3NsLnNzbHdyYXAoc2VsZi5fc29jaywgRmFsc2UsIHNlbGYua2V5ZmlsZSwgc2VsZi5jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2VydF9yZXFzLCBzZWxmLnNzbF92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYV9jZXJ0cywgc2VsZi5jaXBoZXJzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiByZXR1cm5fZXJybm86CisgICAgICAgICAgICAgICAgcmMgPSBzb2NrZXQuY29ubmVjdF9leChzZWxmLCBhZGRyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYyA9IE5vbmUKKyAgICAgICAgICAgICAgICBzb2NrZXQuY29ubmVjdChzZWxmLCBhZGRyKQorICAgICAgICAgICAgaWYgbm90IHJjOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9jb25uZWN0ZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gcmMKKyAgICAgICAgZXhjZXB0IHNvY2tldF9lcnJvcjoKKyAgICAgICAgICAgIHNlbGYuX3NzbG9iaiA9IE5vbmUKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgY29ubmVjdChzZWxmLCBhZGRyKToKKyAgICAgICAgIiIiQ29ubmVjdHMgdG8gcmVtb3RlIEFERFIsIGFuZCB0aGVuIHdyYXBzIHRoZSBjb25uZWN0aW9uIGluCisgICAgICAgIGFuIFNTTCBjaGFubmVsLiIiIgorICAgICAgICBzZWxmLl9yZWFsX2Nvbm5lY3QoYWRkciwgRmFsc2UpCisKKyAgICBkZWYgY29ubmVjdF9leChzZWxmLCBhZGRyKToKKyAgICAgICAgIiIiQ29ubmVjdHMgdG8gcmVtb3RlIEFERFIsIGFuZCB0aGVuIHdyYXBzIHRoZSBjb25uZWN0aW9uIGluCisgICAgICAgIGFuIFNTTCBjaGFubmVsLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fcmVhbF9jb25uZWN0KGFkZHIsIFRydWUpCisKKyAgICBkZWYgYWNjZXB0KHNlbGYpOgorCisgICAgICAgICIiIkFjY2VwdHMgYSBuZXcgY29ubmVjdGlvbiBmcm9tIGEgcmVtb3RlIGNsaWVudCwgYW5kIHJldHVybnMKKyAgICAgICAgYSB0dXBsZSBjb250YWluaW5nIHRoYXQgbmV3IGNvbm5lY3Rpb24gd3JhcHBlZCB3aXRoIGEgc2VydmVyLXNpZGUKKyAgICAgICAgU1NMIGNoYW5uZWwsIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUgcmVtb3RlIGNsaWVudC4iIiIKKworICAgICAgICBuZXdzb2NrLCBhZGRyID0gc29ja2V0LmFjY2VwdChzZWxmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gKFNTTFNvY2tldChuZXdzb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZmlsZT1zZWxmLmtleWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1zZWxmLmNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyX3NpZGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zZWxmLmNlcnRfcmVxcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNlbGYuc3NsX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1zZWxmLmNhX2NlcnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycz1zZWxmLmNpcGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1zZWxmLmRvX2hhbmRzaGFrZV9vbl9jb25uZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9c2VsZi5zdXBwcmVzc19yYWdnZWRfZW9mcyksCisgICAgICAgICAgICAgICAgICAgIGFkZHIpCisgICAgICAgIGV4Y2VwdCBzb2NrZXRfZXJyb3IgYXMgZToKKyAgICAgICAgICAgIG5ld3NvY2suY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UgZQorCisgICAgZGVmIG1ha2VmaWxlKHNlbGYsIG1vZGU9J3InLCBidWZzaXplPS0xKToKKworICAgICAgICAiIiJNYWtlIGFuZCByZXR1cm4gYSBmaWxlLWxpa2Ugb2JqZWN0IHRoYXQKKyAgICAgICAgd29ya3Mgd2l0aCB0aGUgU1NMIGNvbm5lY3Rpb24uICBKdXN0IHVzZSB0aGUgY29kZQorICAgICAgICBmcm9tIHRoZSBzb2NrZXQgbW9kdWxlLiIiIgorCisgICAgICAgIHNlbGYuX21ha2VmaWxlX3JlZnMgKz0gMQorICAgICAgICAjIGNsb3NlPVRydWUgc28gYXMgdG8gZGVjcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgd2hlbiBkb25lIHdpdGgKKyAgICAgICAgIyB0aGUgZmlsZS1saWtlIG9iamVjdC4KKyAgICAgICAgcmV0dXJuIF9maWxlb2JqZWN0KHNlbGYsIG1vZGUsIGJ1ZnNpemUsIGNsb3NlPVRydWUpCisKKworCitkZWYgd3JhcF9zb2NrZXQoc29jaywga2V5ZmlsZT1Ob25lLCBjZXJ0ZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPUZhbHNlLCBjZXJ0X3JlcXM9Q0VSVF9OT05FLAorICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPVBST1RPQ09MX1NTTHYyMywgY2FfY2VydHM9Tm9uZSwKKyAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1UcnVlLAorICAgICAgICAgICAgICAgIHN1cHByZXNzX3JhZ2dlZF9lb2ZzPVRydWUsIGNpcGhlcnM9Tm9uZSk6CisKKyAgICByZXR1cm4gU1NMU29ja2V0KHNvY2ssIGtleWZpbGU9a2V5ZmlsZSwgY2VydGZpbGU9Y2VydGZpbGUsCisgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfc2lkZT1zZXJ2ZXJfc2lkZSwgY2VydF9yZXFzPWNlcnRfcmVxcywKKyAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbF92ZXJzaW9uLCBjYV9jZXJ0cz1jYV9jZXJ0cywKKyAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PWRvX2hhbmRzaGFrZV9vbl9jb25uZWN0LAorICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NfcmFnZ2VkX2VvZnM9c3VwcHJlc3NfcmFnZ2VkX2VvZnMsCisgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPWNpcGhlcnMpCisKKworIyBzb21lIHV0aWxpdHkgZnVuY3Rpb25zCisKK2RlZiBjZXJ0X3RpbWVfdG9fc2Vjb25kcyhjZXJ0X3RpbWUpOgorCisgICAgIiIiVGFrZXMgYSBkYXRlLXRpbWUgc3RyaW5nIGluIHN0YW5kYXJkIEFTTjFfcHJpbnQgZm9ybQorICAgICgiTU9OIERBWSAyNEhPVVI6TUlOVVRFOlNFQyBZRUFSIFRJTUVaT05FIikgYW5kIHJldHVybgorICAgIGEgUHl0aG9uIHRpbWUgdmFsdWUgaW4gc2Vjb25kcyBwYXN0IHRoZSBlcG9jaC4iIiIKKworICAgIGltcG9ydCB0aW1lCisgICAgcmV0dXJuIHRpbWUubWt0aW1lKHRpbWUuc3RycHRpbWUoY2VydF90aW1lLCAiJWIgJWQgJUg6JU06JVMgJVkgR01UIikpCisKK1BFTV9IRUFERVIgPSAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tIgorUEVNX0ZPT1RFUiA9ICItLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tIgorCitkZWYgREVSX2NlcnRfdG9fUEVNX2NlcnQoZGVyX2NlcnRfYnl0ZXMpOgorCisgICAgIiIiVGFrZXMgYSBjZXJ0aWZpY2F0ZSBpbiBiaW5hcnkgREVSIGZvcm1hdCBhbmQgcmV0dXJucyB0aGUKKyAgICBQRU0gdmVyc2lvbiBvZiBpdCBhcyBhIHN0cmluZy4iIiIKKworICAgIGlmIGhhc2F0dHIoYmFzZTY0LCAnc3RhbmRhcmRfYjY0ZW5jb2RlJyk6CisgICAgICAgICMgcHJlZmVycmVkIGJlY2F1c2Ugb2xkZXIgQVBJIGdldHMgbGluZS1sZW5ndGggd3JvbmcKKyAgICAgICAgZiA9IGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoZGVyX2NlcnRfYnl0ZXMpCisgICAgICAgIHJldHVybiAoUEVNX0hFQURFUiArICdcbicgKworICAgICAgICAgICAgICAgIHRleHR3cmFwLmZpbGwoZiwgNjQpICsgJ1xuJyArCisgICAgICAgICAgICAgICAgUEVNX0ZPT1RFUiArICdcbicpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIChQRU1fSEVBREVSICsgJ1xuJyArCisgICAgICAgICAgICAgICAgYmFzZTY0LmVuY29kZXN0cmluZyhkZXJfY2VydF9ieXRlcykgKworICAgICAgICAgICAgICAgIFBFTV9GT09URVIgKyAnXG4nKQorCitkZWYgUEVNX2NlcnRfdG9fREVSX2NlcnQocGVtX2NlcnRfc3RyaW5nKToKKworICAgICIiIlRha2VzIGEgY2VydGlmaWNhdGUgaW4gQVNDSUkgUEVNIGZvcm1hdCBhbmQgcmV0dXJucyB0aGUKKyAgICBERVItZW5jb2RlZCB2ZXJzaW9uIG9mIGl0IGFzIGEgYnl0ZSBzZXF1ZW5jZSIiIgorCisgICAgaWYgbm90IHBlbV9jZXJ0X3N0cmluZy5zdGFydHN3aXRoKFBFTV9IRUFERVIpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIFBFTSBlbmNvZGluZzsgbXVzdCBzdGFydCB3aXRoICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgUEVNX0hFQURFUikKKyAgICBpZiBub3QgcGVtX2NlcnRfc3RyaW5nLnN0cmlwKCkuZW5kc3dpdGgoUEVNX0ZPT1RFUik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgUEVNIGVuY29kaW5nOyBtdXN0IGVuZCB3aXRoICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgUEVNX0ZPT1RFUikKKyAgICBkID0gcGVtX2NlcnRfc3RyaW5nLnN0cmlwKClbbGVuKFBFTV9IRUFERVIpOi1sZW4oUEVNX0ZPT1RFUildCisgICAgcmV0dXJuIGJhc2U2NC5kZWNvZGVzdHJpbmcoZCkKKworZGVmIGdldF9zZXJ2ZXJfY2VydGlmaWNhdGUoYWRkciwgc3NsX3ZlcnNpb249UFJPVE9DT0xfU1NMdjMsIGNhX2NlcnRzPU5vbmUpOgorCisgICAgIiIiUmV0cmlldmUgdGhlIGNlcnRpZmljYXRlIGZyb20gdGhlIHNlcnZlciBhdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MsCisgICAgYW5kIHJldHVybiBpdCBhcyBhIFBFTS1lbmNvZGVkIHN0cmluZy4KKyAgICBJZiAnY2FfY2VydHMnIGlzIHNwZWNpZmllZCwgdmFsaWRhdGUgdGhlIHNlcnZlciBjZXJ0IGFnYWluc3QgaXQuCisgICAgSWYgJ3NzbF92ZXJzaW9uJyBpcyBzcGVjaWZpZWQsIHVzZSBpdCBpbiB0aGUgY29ubmVjdGlvbiBhdHRlbXB0LiIiIgorCisgICAgaG9zdCwgcG9ydCA9IGFkZHIKKyAgICBpZiAoY2FfY2VydHMgaXMgbm90IE5vbmUpOgorICAgICAgICBjZXJ0X3JlcXMgPSBDRVJUX1JFUVVJUkVECisgICAgZWxzZToKKyAgICAgICAgY2VydF9yZXFzID0gQ0VSVF9OT05FCisgICAgcyA9IHdyYXBfc29ja2V0KHNvY2tldCgpLCBzc2xfdmVyc2lvbj1zc2xfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPWNlcnRfcmVxcywgY2FfY2VydHM9Y2FfY2VydHMpCisgICAgcy5jb25uZWN0KGFkZHIpCisgICAgZGVyY2VydCA9IHMuZ2V0cGVlcmNlcnQoVHJ1ZSkKKyAgICBzLmNsb3NlKCkKKyAgICByZXR1cm4gREVSX2NlcnRfdG9fUEVNX2NlcnQoZGVyY2VydCkKKworZGVmIGdldF9wcm90b2NvbF9uYW1lKHByb3RvY29sX2NvZGUpOgorICAgIHJldHVybiBfUFJPVE9DT0xfTkFNRVMuZ2V0KHByb3RvY29sX2NvZGUsICc8dW5rbm93bj4nKQorCisKKyMgYSByZXBsYWNlbWVudCBmb3IgdGhlIG9sZCBzb2NrZXQuc3NsIGZ1bmN0aW9uCisKK2RlZiBzc2x3cmFwX3NpbXBsZShzb2NrLCBrZXlmaWxlPU5vbmUsIGNlcnRmaWxlPU5vbmUpOgorCisgICAgIiIiQSByZXBsYWNlbWVudCBmb3IgdGhlIG9sZCBzb2NrZXQuc3NsIGZ1bmN0aW9uLiAgRGVzaWduZWQKKyAgICBmb3IgY29tcGFiaWxpdHkgd2l0aCBQeXRob24gMi41IGFuZCBlYXJsaWVyLiAgV2lsbCBkaXNhcHBlYXIgaW4KKyAgICBQeXRob24gMy4wLiIiIgorCisgICAgaWYgaGFzYXR0cihzb2NrLCAiX3NvY2siKToKKyAgICAgICAgc29jayA9IHNvY2suX3NvY2sKKworICAgIHNzbF9zb2NrID0gX3NzbC5zc2x3cmFwKHNvY2ssIDAsIGtleWZpbGUsIGNlcnRmaWxlLCBDRVJUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPVE9DT0xfU1NMdjIzLCBOb25lKQorICAgIHRyeToKKyAgICAgICAgc29jay5nZXRwZWVybmFtZSgpCisgICAgZXhjZXB0IHNvY2tldF9lcnJvcjoKKyAgICAgICAgIyBubywgbm8gY29ubmVjdGlvbiB5ZXQKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgICMgeWVzLCBkbyB0aGUgaGFuZHNoYWtlCisgICAgICAgIHNzbF9zb2NrLmRvX2hhbmRzaGFrZSgpCisKKyAgICByZXR1cm4gc3NsX3NvY2sKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3NsLnB5YyBiL2xpYi9weXRob24yLjcvc3NsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzVlZDZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zc2wucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3NsLnB5byBiL2xpYi9weXRob24yLjcvc3NsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzVlZDZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zc2wucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RhdC5weSBiL2xpYi9weXRob24yLjcvc3RhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmVkNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdGF0LnB5CkBAIC0wLDAgKzEsOTYgQEAKKyIiIkNvbnN0YW50cy9mdW5jdGlvbnMgZm9yIGludGVycHJldGluZyByZXN1bHRzIG9mIG9zLnN0YXQoKSBhbmQgb3MubHN0YXQoKS4KKworU3VnZ2VzdGVkIHVzYWdlOiBmcm9tIHN0YXQgaW1wb3J0ICoKKyIiIgorCisjIEluZGljZXMgZm9yIHN0YXQgc3RydWN0IG1lbWJlcnMgaW4gdGhlIHR1cGxlIHJldHVybmVkIGJ5IG9zLnN0YXQoKQorCitTVF9NT0RFICA9IDAKK1NUX0lOTyAgID0gMQorU1RfREVWICAgPSAyCitTVF9OTElOSyA9IDMKK1NUX1VJRCAgID0gNAorU1RfR0lEICAgPSA1CitTVF9TSVpFICA9IDYKK1NUX0FUSU1FID0gNworU1RfTVRJTUUgPSA4CitTVF9DVElNRSA9IDkKKworIyBFeHRyYWN0IGJpdHMgZnJvbSB0aGUgbW9kZQorCitkZWYgU19JTU9ERShtb2RlKToKKyAgICByZXR1cm4gbW9kZSAmIDA3Nzc3CisKK2RlZiBTX0lGTVQobW9kZSk6CisgICAgcmV0dXJuIG1vZGUgJiAwMTcwMDAwCisKKyMgQ29uc3RhbnRzIHVzZWQgYXMgU19JRk1UKCkgZm9yIHZhcmlvdXMgZmlsZSB0eXBlcworIyAobm90IGFsbCBhcmUgaW1wbGVtZW50ZWQgb24gYWxsIHN5c3RlbXMpCisKK1NfSUZESVIgID0gMDA0MDAwMAorU19JRkNIUiAgPSAwMDIwMDAwCitTX0lGQkxLICA9IDAwNjAwMDAKK1NfSUZSRUcgID0gMDEwMDAwMAorU19JRklGTyAgPSAwMDEwMDAwCitTX0lGTE5LICA9IDAxMjAwMDAKK1NfSUZTT0NLID0gMDE0MDAwMAorCisjIEZ1bmN0aW9ucyB0byB0ZXN0IGZvciBlYWNoIGZpbGUgdHlwZQorCitkZWYgU19JU0RJUihtb2RlKToKKyAgICByZXR1cm4gU19JRk1UKG1vZGUpID09IFNfSUZESVIKKworZGVmIFNfSVNDSFIobW9kZSk6CisgICAgcmV0dXJuIFNfSUZNVChtb2RlKSA9PSBTX0lGQ0hSCisKK2RlZiBTX0lTQkxLKG1vZGUpOgorICAgIHJldHVybiBTX0lGTVQobW9kZSkgPT0gU19JRkJMSworCitkZWYgU19JU1JFRyhtb2RlKToKKyAgICByZXR1cm4gU19JRk1UKG1vZGUpID09IFNfSUZSRUcKKworZGVmIFNfSVNGSUZPKG1vZGUpOgorICAgIHJldHVybiBTX0lGTVQobW9kZSkgPT0gU19JRklGTworCitkZWYgU19JU0xOSyhtb2RlKToKKyAgICByZXR1cm4gU19JRk1UKG1vZGUpID09IFNfSUZMTksKKworZGVmIFNfSVNTT0NLKG1vZGUpOgorICAgIHJldHVybiBTX0lGTVQobW9kZSkgPT0gU19JRlNPQ0sKKworIyBOYW1lcyBmb3IgcGVybWlzc2lvbiBiaXRzCisKK1NfSVNVSUQgPSAwNDAwMAorU19JU0dJRCA9IDAyMDAwCitTX0VORk1UID0gU19JU0dJRAorU19JU1ZUWCA9IDAxMDAwCitTX0lSRUFEID0gMDA0MDAKK1NfSVdSSVRFID0gMDAyMDAKK1NfSUVYRUMgPSAwMDEwMAorU19JUldYVSA9IDAwNzAwCitTX0lSVVNSID0gMDA0MDAKK1NfSVdVU1IgPSAwMDIwMAorU19JWFVTUiA9IDAwMTAwCitTX0lSV1hHID0gMDAwNzAKK1NfSVJHUlAgPSAwMDA0MAorU19JV0dSUCA9IDAwMDIwCitTX0lYR1JQID0gMDAwMTAKK1NfSVJXWE8gPSAwMDAwNworU19JUk9USCA9IDAwMDA0CitTX0lXT1RIID0gMDAwMDIKK1NfSVhPVEggPSAwMDAwMQorCisjIE5hbWVzIGZvciBmaWxlIGZsYWdzCisKK1VGX05PRFVNUCAgICA9IDB4MDAwMDAwMDEKK1VGX0lNTVVUQUJMRSA9IDB4MDAwMDAwMDIKK1VGX0FQUEVORCAgICA9IDB4MDAwMDAwMDQKK1VGX09QQVFVRSAgICA9IDB4MDAwMDAwMDgKK1VGX05PVU5MSU5LICA9IDB4MDAwMDAwMTAKK1VGX0NPTVBSRVNTRUQgPSAweDAwMDAwMDIwICAjIE9TIFg6IGZpbGUgaXMgaGZzLWNvbXByZXNzZWQKK1VGX0hJRERFTiAgICA9IDB4MDAwMDgwMDAgICAjIE9TIFg6IGZpbGUgc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQKK1NGX0FSQ0hJVkVEICA9IDB4MDAwMTAwMDAKK1NGX0lNTVVUQUJMRSA9IDB4MDAwMjAwMDAKK1NGX0FQUEVORCAgICA9IDB4MDAwNDAwMDAKK1NGX05PVU5MSU5LICA9IDB4MDAxMDAwMDAKK1NGX1NOQVBTSE9UICA9IDB4MDAyMDAwMDAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RhdC5weWMgYi9saWIvcHl0aG9uMi43L3N0YXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjY1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0YXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RhdC5weW8gYi9saWIvcHl0aG9uMi43L3N0YXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYjY1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0YXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3RhdHZmcy5weSBiL2xpYi9weXRob24yLjcvc3RhdHZmcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTcyNDIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdGF0dmZzLnB5CkBAIC0wLDAgKzEsMTggQEAKKyIiIkNvbnN0YW50cyBmb3IgaW50ZXJwcmV0aW5nIHRoZSByZXN1bHRzIG9mIG9zLnN0YXR2ZnMoKSBhbmQgb3MuZnN0YXR2ZnMoKS4iIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIHN0YXR2ZnMgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCisjIEluZGljZXMgZm9yIHN0YXR2ZnMgc3RydWN0IG1lbWJlcnMgaW4gdGhlIHR1cGxlIHJldHVybmVkIGJ5CisjIG9zLnN0YXR2ZnMoKSBhbmQgb3MuZnN0YXR2ZnMoKS4KKworRl9CU0laRSAgID0gMCAgICAgICAgICAgIyBQcmVmZXJyZWQgZmlsZSBzeXN0ZW0gYmxvY2sgc2l6ZQorRl9GUlNJWkUgID0gMSAgICAgICAgICAgIyBGdW5kYW1lbnRhbCBmaWxlIHN5c3RlbSBibG9jayBzaXplCitGX0JMT0NLUyAgPSAyICAgICAgICAgICAjIFRvdGFsIG51bWJlciBvZiBmaWxlIHN5c3RlbSBibG9ja3MgKEZSU0laRSkKK0ZfQkZSRUUgICA9IDMgICAgICAgICAgICMgVG90YWwgbnVtYmVyIG9mIGZyZWUgYmxvY2tzCitGX0JBVkFJTCAgPSA0ICAgICAgICAgICAjIEZyZWUgYmxvY2tzIGF2YWlsYWJsZSB0byBub24tc3VwZXJ1c2VyCitGX0ZJTEVTICAgPSA1ICAgICAgICAgICAjIFRvdGFsIG51bWJlciBvZiBmaWxlIG5vZGVzCitGX0ZGUkVFICAgPSA2ICAgICAgICAgICAjIFRvdGFsIG51bWJlciBvZiBmcmVlIGZpbGUgbm9kZXMKK0ZfRkFWQUlMICA9IDcgICAgICAgICAgICMgRnJlZSBub2RlcyBhdmFpbGFibGUgdG8gbm9uLXN1cGVydXNlcgorRl9GTEFHICAgID0gOCAgICAgICAgICAgIyBGbGFncyAoc2VlIHlvdXIgbG9jYWwgc3RhdHZmcyBtYW4gcGFnZSkKK0ZfTkFNRU1BWCA9IDkgICAgICAgICAgICMgTWF4aW11bSBmaWxlIG5hbWUgbGVuZ3RoCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0YXR2ZnMucHljIGIvbGliL3B5dGhvbjIuNy9zdGF0dmZzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTEwMjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdGF0dmZzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0YXR2ZnMucHlvIGIvbGliL3B5dGhvbjIuNy9zdGF0dmZzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTEwMjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdGF0dmZzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZy5weSBiL2xpYi9weXRob24yLjcvc3RyaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Mjc4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0cmluZy5weQpAQCAtMCwwICsxLDY0MiBAQAorIiIiQSBjb2xsZWN0aW9uIG9mIHN0cmluZyBvcGVyYXRpb25zIChtb3N0IGFyZSBubyBsb25nZXIgdXNlZCkuCisKK1dhcm5pbmc6IG1vc3Qgb2YgdGhlIGNvZGUgeW91IHNlZSBoZXJlIGlzbid0IG5vcm1hbGx5IHVzZWQgbm93YWRheXMuCitCZWdpbm5pbmcgd2l0aCBQeXRob24gMS42LCBtYW55IG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYXMKK21ldGhvZHMgb24gdGhlIHN0YW5kYXJkIHN0cmluZyBvYmplY3QuIFRoZXkgdXNlZCB0byBiZSBpbXBsZW1lbnRlZCBieQorYSBidWlsdC1pbiBtb2R1bGUgY2FsbGVkIHN0cm9wLCBidXQgc3Ryb3AgaXMgbm93IG9ic29sZXRlIGl0c2VsZi4KKworUHVibGljIG1vZHVsZSB2YXJpYWJsZXM6CisKK3doaXRlc3BhY2UgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIHdoaXRlc3BhY2UKK2xvd2VyY2FzZSAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgbG93ZXJjYXNlIGxldHRlcnMKK3VwcGVyY2FzZSAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgdXBwZXJjYXNlIGxldHRlcnMKK2xldHRlcnMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGxldHRlcnMKK2RpZ2l0cyAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgZGVjaW1hbCBkaWdpdHMKK2hleGRpZ2l0cyAtLSBhIHN0cmluZyBjb250YWluaW5nIGFsbCBjaGFyYWN0ZXJzIGNvbnNpZGVyZWQgaGV4YWRlY2ltYWwgZGlnaXRzCitvY3RkaWdpdHMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIG9jdGFsIGRpZ2l0cworcHVuY3R1YXRpb24gLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIHB1bmN0dWF0aW9uCitwcmludGFibGUgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIHByaW50YWJsZQorCisiIiIKKworIyBTb21lIHN0cmluZ3MgZm9yIGN0eXBlLXN0eWxlIGNoYXJhY3RlciBjbGFzc2lmaWNhdGlvbgord2hpdGVzcGFjZSA9ICcgXHRcblxyXHZcZicKK2xvd2VyY2FzZSA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicKK3VwcGVyY2FzZSA9ICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWicKK2xldHRlcnMgPSBsb3dlcmNhc2UgKyB1cHBlcmNhc2UKK2FzY2lpX2xvd2VyY2FzZSA9IGxvd2VyY2FzZQorYXNjaWlfdXBwZXJjYXNlID0gdXBwZXJjYXNlCithc2NpaV9sZXR0ZXJzID0gYXNjaWlfbG93ZXJjYXNlICsgYXNjaWlfdXBwZXJjYXNlCitkaWdpdHMgPSAnMDEyMzQ1Njc4OScKK2hleGRpZ2l0cyA9IGRpZ2l0cyArICdhYmNkZWYnICsgJ0FCQ0RFRicKK29jdGRpZ2l0cyA9ICcwMTIzNDU2NycKK3B1bmN0dWF0aW9uID0gIiIiISIjJCUmJygpKissLS4vOjs8PT4/QFtcXV5fYHt8fX4iIiIKK3ByaW50YWJsZSA9IGRpZ2l0cyArIGxldHRlcnMgKyBwdW5jdHVhdGlvbiArIHdoaXRlc3BhY2UKKworIyBDYXNlIGNvbnZlcnNpb24gaGVscGVycworIyBVc2Ugc3RyIHRvIGNvbnZlcnQgVW5pY29kZSBsaXRlcmFsIGluIGNhc2Ugb2YgLVUKK2wgPSBtYXAoY2hyLCB4cmFuZ2UoMjU2KSkKK19pZG1hcCA9IHN0cignJykuam9pbihsKQorZGVsIGwKKworIyBGdW5jdGlvbnMgd2hpY2ggYXJlbid0IGF2YWlsYWJsZSBhcyBzdHJpbmcgbWV0aG9kcy4KKworIyBDYXBpdGFsaXplIHRoZSB3b3JkcyBpbiBhIHN0cmluZywgZS5nLiAiIGFCYyAgZEVmICIgLT4gIkFiYyBEZWYiLgorZGVmIGNhcHdvcmRzKHMsIHNlcD1Ob25lKToKKyAgICAiIiJjYXB3b3JkcyhzIFssc2VwXSkgLT4gc3RyaW5nCisKKyAgICBTcGxpdCB0aGUgYXJndW1lbnQgaW50byB3b3JkcyB1c2luZyBzcGxpdCwgY2FwaXRhbGl6ZSBlYWNoCisgICAgd29yZCB1c2luZyBjYXBpdGFsaXplLCBhbmQgam9pbiB0aGUgY2FwaXRhbGl6ZWQgd29yZHMgdXNpbmcKKyAgICBqb2luLiAgSWYgdGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBzZXAgaXMgYWJzZW50IG9yIE5vbmUsCisgICAgcnVucyBvZiB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIGJ5IGEgc2luZ2xlIHNwYWNlCisgICAgYW5kIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgYXJlIHJlbW92ZWQsIG90aGVyd2lzZQorICAgIHNlcCBpcyB1c2VkIHRvIHNwbGl0IGFuZCBqb2luIHRoZSB3b3Jkcy4KKworICAgICIiIgorICAgIHJldHVybiAoc2VwIG9yICcgJykuam9pbih4LmNhcGl0YWxpemUoKSBmb3IgeCBpbiBzLnNwbGl0KHNlcCkpCisKKworIyBDb25zdHJ1Y3QgYSB0cmFuc2xhdGlvbiBzdHJpbmcKK19pZG1hcEwgPSBOb25lCitkZWYgbWFrZXRyYW5zKGZyb21zdHIsIHRvc3RyKToKKyAgICAiIiJtYWtldHJhbnMoZnJtLCB0bykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSB0cmFuc2xhdGlvbiB0YWJsZSAoYSBzdHJpbmcgb2YgMjU2IGJ5dGVzIGxvbmcpCisgICAgc3VpdGFibGUgZm9yIHVzZSBpbiBzdHJpbmcudHJhbnNsYXRlLiAgVGhlIHN0cmluZ3MgZnJtIGFuZCB0bworICAgIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgorCisgICAgIiIiCisgICAgaWYgbGVuKGZyb21zdHIpICE9IGxlbih0b3N0cik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtYWtldHJhbnMgYXJndW1lbnRzIG11c3QgaGF2ZSBzYW1lIGxlbmd0aCIKKyAgICBnbG9iYWwgX2lkbWFwTAorICAgIGlmIG5vdCBfaWRtYXBMOgorICAgICAgICBfaWRtYXBMID0gbGlzdChfaWRtYXApCisgICAgTCA9IF9pZG1hcExbOl0KKyAgICBmcm9tc3RyID0gbWFwKG9yZCwgZnJvbXN0cikKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oZnJvbXN0cikpOgorICAgICAgICBMW2Zyb21zdHJbaV1dID0gdG9zdHJbaV0KKyAgICByZXR1cm4gJycuam9pbihMKQorCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ltcG9ydCByZSBhcyBfcmUKKworY2xhc3MgX211bHRpbWFwOgorICAgICIiIkhlbHBlciBjbGFzcyBmb3IgY29tYmluaW5nIG11bHRpcGxlIG1hcHBpbmdzLgorCisgICAgVXNlZCBieSAue3NhZmVfLH1zdWJzdGl0dXRlKCkgdG8gY29tYmluZSB0aGUgbWFwcGluZyBhbmQga2V5d29yZAorICAgIGFyZ3VtZW50cy4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJpbWFyeSwgc2Vjb25kYXJ5KToKKyAgICAgICAgc2VsZi5fcHJpbWFyeSA9IHByaW1hcnkKKyAgICAgICAgc2VsZi5fc2Vjb25kYXJ5ID0gc2Vjb25kYXJ5CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByaW1hcnlba2V5XQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2Vjb25kYXJ5W2tleV0KKworCitjbGFzcyBfVGVtcGxhdGVNZXRhY2xhc3ModHlwZSk6CisgICAgcGF0dGVybiA9IHIiIiIKKyAgICAlKGRlbGltKXMoPzoKKyAgICAgICg/UDxlc2NhcGVkPiUoZGVsaW0pcykgfCAgICMgRXNjYXBlIHNlcXVlbmNlIG9mIHR3byBkZWxpbWl0ZXJzCisgICAgICAoP1A8bmFtZWQ+JShpZClzKSAgICAgIHwgICAjIGRlbGltaXRlciBhbmQgYSBQeXRob24gaWRlbnRpZmllcgorICAgICAgeyg/UDxicmFjZWQ+JShpZClzKX0gICB8ICAgIyBkZWxpbWl0ZXIgYW5kIGEgYnJhY2VkIGlkZW50aWZpZXIKKyAgICAgICg/UDxpbnZhbGlkPikgICAgICAgICAgICAgICMgT3RoZXIgaWxsLWZvcm1lZCBkZWxpbWl0ZXIgZXhwcnMKKyAgICApCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGN0KToKKyAgICAgICAgc3VwZXIoX1RlbXBsYXRlTWV0YWNsYXNzLCBjbHMpLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBkY3QpCisgICAgICAgIGlmICdwYXR0ZXJuJyBpbiBkY3Q6CisgICAgICAgICAgICBwYXR0ZXJuID0gY2xzLnBhdHRlcm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdHRlcm4gPSBfVGVtcGxhdGVNZXRhY2xhc3MucGF0dGVybiAlIHsKKyAgICAgICAgICAgICAgICAnZGVsaW0nIDogX3JlLmVzY2FwZShjbHMuZGVsaW1pdGVyKSwKKyAgICAgICAgICAgICAgICAnaWQnICAgIDogY2xzLmlkcGF0dGVybiwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIGNscy5wYXR0ZXJuID0gX3JlLmNvbXBpbGUocGF0dGVybiwgX3JlLklHTk9SRUNBU0UgfCBfcmUuVkVSQk9TRSkKKworCitjbGFzcyBUZW1wbGF0ZToKKyAgICAiIiJBIHN0cmluZyBjbGFzcyBmb3Igc3VwcG9ydGluZyAkLXN1YnN0aXR1dGlvbnMuIiIiCisgICAgX19tZXRhY2xhc3NfXyA9IF9UZW1wbGF0ZU1ldGFjbGFzcworCisgICAgZGVsaW1pdGVyID0gJyQnCisgICAgaWRwYXR0ZXJuID0gcidbX2Etel1bX2EtejAtOV0qJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlbXBsYXRlKToKKyAgICAgICAgc2VsZi50ZW1wbGF0ZSA9IHRlbXBsYXRlCisKKyAgICAjIFNlYXJjaCBmb3IgJCQsICRpZGVudGlmaWVyLCAke2lkZW50aWZpZXJ9LCBhbmQgYW55IGJhcmUgJCdzCisKKyAgICBkZWYgX2ludmFsaWQoc2VsZiwgbW8pOgorICAgICAgICBpID0gbW8uc3RhcnQoJ2ludmFsaWQnKQorICAgICAgICBsaW5lcyA9IHNlbGYudGVtcGxhdGVbOmldLnNwbGl0bGluZXMoVHJ1ZSkKKyAgICAgICAgaWYgbm90IGxpbmVzOgorICAgICAgICAgICAgY29sbm8gPSAxCisgICAgICAgICAgICBsaW5lbm8gPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb2xubyA9IGkgLSBsZW4oJycuam9pbihsaW5lc1s6LTFdKSkKKyAgICAgICAgICAgIGxpbmVubyA9IGxlbihsaW5lcykKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBwbGFjZWhvbGRlciBpbiBzdHJpbmc6IGxpbmUgJWQsIGNvbCAlZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lbm8sIGNvbG5vKSkKKworICAgIGRlZiBzdWJzdGl0dXRlKHNlbGYsICphcmdzLCAqKmt3cyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzJykKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBtYXBwaW5nID0ga3dzCisgICAgICAgIGVsaWYga3dzOgorICAgICAgICAgICAgbWFwcGluZyA9IF9tdWx0aW1hcChrd3MsIGFyZ3NbMF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXBwaW5nID0gYXJnc1swXQorICAgICAgICAjIEhlbHBlciBmdW5jdGlvbiBmb3IgLnN1YigpCisgICAgICAgIGRlZiBjb252ZXJ0KG1vKToKKyAgICAgICAgICAgICMgQ2hlY2sgdGhlIG1vc3QgY29tbW9uIHBhdGggZmlyc3QuCisgICAgICAgICAgICBuYW1lZCA9IG1vLmdyb3VwKCduYW1lZCcpIG9yIG1vLmdyb3VwKCdicmFjZWQnKQorICAgICAgICAgICAgaWYgbmFtZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgdmFsID0gbWFwcGluZ1tuYW1lZF0KKyAgICAgICAgICAgICAgICAjIFdlIHVzZSB0aGlzIGlkaW9tIGluc3RlYWQgb2Ygc3RyKCkgYmVjYXVzZSB0aGUgbGF0dGVyIHdpbGwKKyAgICAgICAgICAgICAgICAjIGZhaWwgaWYgdmFsIGlzIGEgVW5pY29kZSBjb250YWluaW5nIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKHZhbCwpCisgICAgICAgICAgICBpZiBtby5ncm91cCgnZXNjYXBlZCcpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlcgorICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2ludmFsaWQnKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9pbnZhbGlkKG1vKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5yZWNvZ25pemVkIG5hbWVkIGdyb3VwIGluIHBhdHRlcm4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdHRlcm4pCisgICAgICAgIHJldHVybiBzZWxmLnBhdHRlcm4uc3ViKGNvbnZlcnQsIHNlbGYudGVtcGxhdGUpCisKKyAgICBkZWYgc2FmZV9zdWJzdGl0dXRlKHNlbGYsICphcmdzLCAqKmt3cyk6CisgICAgICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1RvbyBtYW55IHBvc2l0aW9uYWwgYXJndW1lbnRzJykKKyAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICBtYXBwaW5nID0ga3dzCisgICAgICAgIGVsaWYga3dzOgorICAgICAgICAgICAgbWFwcGluZyA9IF9tdWx0aW1hcChrd3MsIGFyZ3NbMF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXBwaW5nID0gYXJnc1swXQorICAgICAgICAjIEhlbHBlciBmdW5jdGlvbiBmb3IgLnN1YigpCisgICAgICAgIGRlZiBjb252ZXJ0KG1vKToKKyAgICAgICAgICAgIG5hbWVkID0gbW8uZ3JvdXAoJ25hbWVkJykKKyAgICAgICAgICAgIGlmIG5hbWVkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyBXZSB1c2UgdGhpcyBpZGlvbSBpbnN0ZWFkIG9mIHN0cigpIGJlY2F1c2UgdGhlIGxhdHRlcgorICAgICAgICAgICAgICAgICAgICAjIHdpbGwgZmFpbCBpZiB2YWwgaXMgYSBVbmljb2RlIGNvbnRhaW5pbmcgbm9uLUFTQ0lJCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbbmFtZWRdLCkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlciArIG5hbWVkCisgICAgICAgICAgICBicmFjZWQgPSBtby5ncm91cCgnYnJhY2VkJykKKyAgICAgICAgICAgIGlmIGJyYWNlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgKG1hcHBpbmdbYnJhY2VkXSwpCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWxpbWl0ZXIgKyAneycgKyBicmFjZWQgKyAnfScKKyAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdlc2NhcGVkJykgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyCisgICAgICAgICAgICBpZiBtby5ncm91cCgnaW52YWxpZCcpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlcgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5yZWNvZ25pemVkIG5hbWVkIGdyb3VwIGluIHBhdHRlcm4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdHRlcm4pCisgICAgICAgIHJldHVybiBzZWxmLnBhdHRlcm4uc3ViKGNvbnZlcnQsIHNlbGYudGVtcGxhdGUpCisKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBOT1RFOiBFdmVyeXRoaW5nIGJlbG93IGhlcmUgaXMgZGVwcmVjYXRlZC4gIFVzZSBzdHJpbmcgbWV0aG9kcyBpbnN0ZWFkLgorIyBUaGlzIHN0dWZmIHdpbGwgZ28gYXdheSBpbiBQeXRob24gMy4wLgorCisjIEJhY2t3YXJkIGNvbXBhdGlibGUgbmFtZXMgZm9yIGV4Y2VwdGlvbnMKK2luZGV4X2Vycm9yID0gVmFsdWVFcnJvcgorYXRvaV9lcnJvciA9IFZhbHVlRXJyb3IKK2F0b2ZfZXJyb3IgPSBWYWx1ZUVycm9yCithdG9sX2Vycm9yID0gVmFsdWVFcnJvcgorCisjIGNvbnZlcnQgVVBQRVIgQ0FTRSBsZXR0ZXJzIHRvIGxvd2VyIGNhc2UKK2RlZiBsb3dlcihzKToKKyAgICAiIiJsb3dlcihzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5sb3dlcigpCisKKyMgQ29udmVydCBsb3dlciBjYXNlIGxldHRlcnMgdG8gVVBQRVIgQ0FTRQorZGVmIHVwcGVyKHMpOgorICAgICIiInVwcGVyKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgY29udmVydGVkIHRvIHVwcGVyY2FzZS4KKworICAgICIiIgorICAgIHJldHVybiBzLnVwcGVyKCkKKworIyBTd2FwIGxvd2VyIGNhc2UgbGV0dGVycyBhbmQgVVBQRVIgQ0FTRQorZGVmIHN3YXBjYXNlKHMpOgorICAgICIiInN3YXBjYXNlKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCB1cHBlciBjYXNlIGNoYXJhY3RlcnMKKyAgICBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIGFuZCB2aWNlIHZlcnNhLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMuc3dhcGNhc2UoKQorCisjIFN0cmlwIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHRhYnMgYW5kIHNwYWNlcworZGVmIHN0cmlwKHMsIGNoYXJzPU5vbmUpOgorICAgICIiInN0cmlwKHMgWyxjaGFyc10pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBsZWFkaW5nIGFuZCB0cmFpbGluZworICAgIHdoaXRlc3BhY2UgcmVtb3ZlZC4KKyAgICBJZiBjaGFycyBpcyBnaXZlbiBhbmQgbm90IE5vbmUsIHJlbW92ZSBjaGFyYWN0ZXJzIGluIGNoYXJzIGluc3RlYWQuCisgICAgSWYgY2hhcnMgaXMgdW5pY29kZSwgUyB3aWxsIGJlIGNvbnZlcnRlZCB0byB1bmljb2RlIGJlZm9yZSBzdHJpcHBpbmcuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5zdHJpcChjaGFycykKKworIyBTdHJpcCBsZWFkaW5nIHRhYnMgYW5kIHNwYWNlcworZGVmIGxzdHJpcChzLCBjaGFycz1Ob25lKToKKyAgICAiIiJsc3RyaXAocyBbLGNoYXJzXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZSByZW1vdmVkLgorICAgIElmIGNoYXJzIGlzIGdpdmVuIGFuZCBub3QgTm9uZSwgcmVtb3ZlIGNoYXJhY3RlcnMgaW4gY2hhcnMgaW5zdGVhZC4KKworICAgICIiIgorICAgIHJldHVybiBzLmxzdHJpcChjaGFycykKKworIyBTdHJpcCB0cmFpbGluZyB0YWJzIGFuZCBzcGFjZXMKK2RlZiByc3RyaXAocywgY2hhcnM9Tm9uZSk6CisgICAgIiIicnN0cmlwKHMgWyxjaGFyc10pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCB0cmFpbGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuCisgICAgSWYgY2hhcnMgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCByZW1vdmUgY2hhcmFjdGVycyBpbiBjaGFycyBpbnN0ZWFkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMucnN0cmlwKGNoYXJzKQorCisKKyMgU3BsaXQgYSBzdHJpbmcgaW50byBhIGxpc3Qgb2Ygc3BhY2UvdGFiLXNlcGFyYXRlZCB3b3JkcworZGVmIHNwbGl0KHMsIHNlcD1Ob25lLCBtYXhzcGxpdD0tMSk6CisgICAgIiIic3BsaXQocyBbLHNlcCBbLG1heHNwbGl0XV0pIC0+IGxpc3Qgb2Ygc3RyaW5ncworCisgICAgUmV0dXJuIGEgbGlzdCBvZiB0aGUgd29yZHMgaW4gdGhlIHN0cmluZyBzLCB1c2luZyBzZXAgYXMgdGhlCisgICAgZGVsaW1pdGVyIHN0cmluZy4gIElmIG1heHNwbGl0IGlzIGdpdmVuLCBzcGxpdHMgYXQgbm8gbW9yZSB0aGFuCisgICAgbWF4c3BsaXQgcGxhY2VzIChyZXN1bHRpbmcgaW4gYXQgbW9zdCBtYXhzcGxpdCsxIHdvcmRzKS4gIElmIHNlcAorICAgIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgTm9uZSwgYW55IHdoaXRlc3BhY2Ugc3RyaW5nIGlzIGEgc2VwYXJhdG9yLgorCisgICAgKHNwbGl0IGFuZCBzcGxpdGZpZWxkcyBhcmUgc3lub255bW91cykKKworICAgICIiIgorICAgIHJldHVybiBzLnNwbGl0KHNlcCwgbWF4c3BsaXQpCitzcGxpdGZpZWxkcyA9IHNwbGl0CisKKyMgU3BsaXQgYSBzdHJpbmcgaW50byBhIGxpc3Qgb2Ygc3BhY2UvdGFiLXNlcGFyYXRlZCB3b3JkcworZGVmIHJzcGxpdChzLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9LTEpOgorICAgICIiInJzcGxpdChzIFssc2VwIFssbWF4c3BsaXRdXSkgLT4gbGlzdCBvZiBzdHJpbmdzCisKKyAgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nIHMsIHVzaW5nIHNlcCBhcyB0aGUKKyAgICBkZWxpbWl0ZXIgc3RyaW5nLCBzdGFydGluZyBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgYW5kIHdvcmtpbmcKKyAgICB0byB0aGUgZnJvbnQuICBJZiBtYXhzcGxpdCBpcyBnaXZlbiwgYXQgbW9zdCBtYXhzcGxpdCBzcGxpdHMgYXJlCisgICAgZG9uZS4gSWYgc2VwIGlzIG5vdCBzcGVjaWZpZWQgb3IgaXMgTm9uZSwgYW55IHdoaXRlc3BhY2Ugc3RyaW5nCisgICAgaXMgYSBzZXBhcmF0b3IuCisgICAgIiIiCisgICAgcmV0dXJuIHMucnNwbGl0KHNlcCwgbWF4c3BsaXQpCisKKyMgSm9pbiBmaWVsZHMgd2l0aCBvcHRpb25hbCBzZXBhcmF0b3IKK2RlZiBqb2luKHdvcmRzLCBzZXAgPSAnICcpOgorICAgICIiImpvaW4obGlzdCBbLHNlcF0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgc3RyaW5nIGNvbXBvc2VkIG9mIHRoZSB3b3JkcyBpbiBsaXN0LCB3aXRoCisgICAgaW50ZXJ2ZW5pbmcgb2NjdXJyZW5jZXMgb2Ygc2VwLiAgVGhlIGRlZmF1bHQgc2VwYXJhdG9yIGlzIGEKKyAgICBzaW5nbGUgc3BhY2UuCisKKyAgICAoam9pbmZpZWxkcyBhbmQgam9pbiBhcmUgc3lub255bW91cykKKworICAgICIiIgorICAgIHJldHVybiBzZXAuam9pbih3b3JkcykKK2pvaW5maWVsZHMgPSBqb2luCisKKyMgRmluZCBzdWJzdHJpbmcsIHJhaXNlIGV4Y2VwdGlvbiBpZiBub3QgZm91bmQKK2RlZiBpbmRleChzLCAqYXJncyk6CisgICAgIiIiaW5kZXgocywgc3ViIFssc3RhcnQgWyxlbmRdXSkgLT4gaW50CisKKyAgICBMaWtlIGZpbmQgYnV0IHJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5pbmRleCgqYXJncykKKworIyBGaW5kIGxhc3Qgc3Vic3RyaW5nLCByYWlzZSBleGNlcHRpb24gaWYgbm90IGZvdW5kCitkZWYgcmluZGV4KHMsICphcmdzKToKKyAgICAiIiJyaW5kZXgocywgc3ViIFssc3RhcnQgWyxlbmRdXSkgLT4gaW50CisKKyAgICBMaWtlIHJmaW5kIGJ1dCByYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMucmluZGV4KCphcmdzKQorCisjIENvdW50IG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcKK2RlZiBjb3VudChzLCAqYXJncyk6CisgICAgIiIiY291bnQocywgc3ViWywgc3RhcnRbLGVuZF1dKSAtPiBpbnQKKworICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBzdWIgaW4gc3RyaW5nCisgICAgc1tzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlCisgICAgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5jb3VudCgqYXJncykKKworIyBGaW5kIHN1YnN0cmluZywgcmV0dXJuIC0xIGlmIG5vdCBmb3VuZAorZGVmIGZpbmQocywgKmFyZ3MpOgorICAgICIiImZpbmQocywgc3ViIFssc3RhcnQgWyxlbmRdXSkgLT4gaW4KKworICAgIFJldHVybiB0aGUgbG93ZXN0IGluZGV4IGluIHMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCwKKyAgICBzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gc1tzdGFydCxlbmRdLiAgT3B0aW9uYWwKKyAgICBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICBSZXR1cm4gLTEgb24gZmFpbHVyZS4KKworICAgICIiIgorICAgIHJldHVybiBzLmZpbmQoKmFyZ3MpCisKKyMgRmluZCBsYXN0IHN1YnN0cmluZywgcmV0dXJuIC0xIGlmIG5vdCBmb3VuZAorZGVmIHJmaW5kKHMsICphcmdzKToKKyAgICAiIiJyZmluZChzLCBzdWIgWyxzdGFydCBbLGVuZF1dKSAtPiBpbnQKKworICAgIFJldHVybiB0aGUgaGlnaGVzdCBpbmRleCBpbiBzIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsCisgICAgc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIHNbc3RhcnQsZW5kXS4gIE9wdGlvbmFsCisgICAgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLgorCisgICAgUmV0dXJuIC0xIG9uIGZhaWx1cmUuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5yZmluZCgqYXJncykKKworIyBmb3IgYSBiaXQgb2Ygc3BlZWQKK19mbG9hdCA9IGZsb2F0CitfaW50ID0gaW50CitfbG9uZyA9IGxvbmcKKworIyBDb252ZXJ0IHN0cmluZyB0byBmbG9hdAorZGVmIGF0b2Yocyk6CisgICAgIiIiYXRvZihzKSAtPiBmbG9hdAorCisgICAgUmV0dXJuIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBzLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9mbG9hdChzKQorCisKKyMgQ29udmVydCBzdHJpbmcgdG8gaW50ZWdlcgorZGVmIGF0b2kocyAsIGJhc2U9MTApOgorICAgICIiImF0b2kocyBbLGJhc2VdKSAtPiBpbnQKKworICAgIFJldHVybiB0aGUgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIHMgaW4gdGhlIGdpdmVuCisgICAgYmFzZSwgd2hpY2ggZGVmYXVsdHMgdG8gMTAuICBUaGUgc3RyaW5nIHMgbXVzdCBjb25zaXN0IG9mIG9uZQorICAgIG9yIG1vcmUgZGlnaXRzLCBwb3NzaWJseSBwcmVjZWRlZCBieSBhIHNpZ24uICBJZiBiYXNlIGlzIDAsIGl0CisgICAgaXMgY2hvc2VuIGZyb20gdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBvZiBzLCAwIGZvciBvY3RhbCwgMHggb3IKKyAgICAwWCBmb3IgaGV4YWRlY2ltYWwuICBJZiBiYXNlIGlzIDE2LCBhIHByZWNlZGluZyAweCBvciAwWCBpcworICAgIGFjY2VwdGVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9pbnQocywgYmFzZSkKKworCisjIENvbnZlcnQgc3RyaW5nIHRvIGxvbmcgaW50ZWdlcgorZGVmIGF0b2wocywgYmFzZT0xMCk6CisgICAgIiIiYXRvbChzIFssYmFzZV0pIC0+IGxvbmcKKworICAgIFJldHVybiB0aGUgbG9uZyBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgcyBpbiB0aGUKKyAgICBnaXZlbiBiYXNlLCB3aGljaCBkZWZhdWx0cyB0byAxMC4gIFRoZSBzdHJpbmcgcyBtdXN0IGNvbnNpc3QKKyAgICBvZiBvbmUgb3IgbW9yZSBkaWdpdHMsIHBvc3NpYmx5IHByZWNlZGVkIGJ5IGEgc2lnbi4gIElmIGJhc2UKKyAgICBpcyAwLCBpdCBpcyBjaG9zZW4gZnJvbSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIG9mIHMsIDAgZm9yCisgICAgb2N0YWwsIDB4IG9yIDBYIGZvciBoZXhhZGVjaW1hbC4gIElmIGJhc2UgaXMgMTYsIGEgcHJlY2VkaW5nCisgICAgMHggb3IgMFggaXMgYWNjZXB0ZWQuICBBIHRyYWlsaW5nIEwgb3IgbCBpcyBub3QgYWNjZXB0ZWQsCisgICAgdW5sZXNzIGJhc2UgaXMgMC4KKworICAgICIiIgorICAgIHJldHVybiBfbG9uZyhzLCBiYXNlKQorCisKKyMgTGVmdC1qdXN0aWZ5IGEgc3RyaW5nCitkZWYgbGp1c3Qocywgd2lkdGgsICphcmdzKToKKyAgICAiIiJsanVzdChzLCB3aWR0aFssIGZpbGxjaGFyXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBsZWZ0LWp1c3RpZmllZCB2ZXJzaW9uIG9mIHMsIGluIGEgZmllbGQgb2YgdGhlCisgICAgc3BlY2lmaWVkIHdpZHRoLCBwYWRkZWQgd2l0aCBzcGFjZXMgYXMgbmVlZGVkLiAgVGhlIHN0cmluZyBpcworICAgIG5ldmVyIHRydW5jYXRlZC4gIElmIHNwZWNpZmllZCB0aGUgZmlsbGNoYXIgaXMgdXNlZCBpbnN0ZWFkIG9mIHNwYWNlcy4KKworICAgICIiIgorICAgIHJldHVybiBzLmxqdXN0KHdpZHRoLCAqYXJncykKKworIyBSaWdodC1qdXN0aWZ5IGEgc3RyaW5nCitkZWYgcmp1c3Qocywgd2lkdGgsICphcmdzKToKKyAgICAiIiJyanVzdChzLCB3aWR0aFssIGZpbGxjaGFyXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSByaWdodC1qdXN0aWZpZWQgdmVyc2lvbiBvZiBzLCBpbiBhIGZpZWxkIG9mIHRoZQorICAgIHNwZWNpZmllZCB3aWR0aCwgcGFkZGVkIHdpdGggc3BhY2VzIGFzIG5lZWRlZC4gIFRoZSBzdHJpbmcgaXMKKyAgICBuZXZlciB0cnVuY2F0ZWQuICBJZiBzcGVjaWZpZWQgdGhlIGZpbGxjaGFyIGlzIHVzZWQgaW5zdGVhZCBvZiBzcGFjZXMuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5yanVzdCh3aWR0aCwgKmFyZ3MpCisKKyMgQ2VudGVyIGEgc3RyaW5nCitkZWYgY2VudGVyKHMsIHdpZHRoLCAqYXJncyk6CisgICAgIiIiY2VudGVyKHMsIHdpZHRoWywgZmlsbGNoYXJdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNlbnRlciB2ZXJzaW9uIG9mIHMsIGluIGEgZmllbGQgb2YgdGhlIHNwZWNpZmllZAorICAgIHdpZHRoLiBwYWRkZWQgd2l0aCBzcGFjZXMgYXMgbmVlZGVkLiAgVGhlIHN0cmluZyBpcyBuZXZlcgorICAgIHRydW5jYXRlZC4gIElmIHNwZWNpZmllZCB0aGUgZmlsbGNoYXIgaXMgdXNlZCBpbnN0ZWFkIG9mIHNwYWNlcy4KKworICAgICIiIgorICAgIHJldHVybiBzLmNlbnRlcih3aWR0aCwgKmFyZ3MpCisKKyMgWmVyby1maWxsIGEgbnVtYmVyLCBlLmcuLCAoMTIsIDMpIC0tPiAnMDEyJyBhbmQgKC0zLCAzKSAtLT4gJy0wMycKKyMgRGVjYWRlbnQgZmVhdHVyZTogdGhlIGFyZ3VtZW50IG1heSBiZSBhIHN0cmluZyBvciBhIG51bWJlcgorIyAoVXNlIG9mIHRoaXMgaXMgZGVwcmVjYXRlZDsgaXQgc2hvdWxkIGJlIGEgc3RyaW5nIGFzIHdpdGggbGp1c3QgYy5zLikKK2RlZiB6ZmlsbCh4LCB3aWR0aCk6CisgICAgIiIiemZpbGwoeCwgd2lkdGgpIC0+IHN0cmluZworCisgICAgUGFkIGEgbnVtZXJpYyBzdHJpbmcgeCB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGQKKyAgICBvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgVGhlIHN0cmluZyB4IGlzIG5ldmVyIHRydW5jYXRlZC4KKworICAgICIiIgorICAgIGlmIG5vdCBpc2luc3RhbmNlKHgsIGJhc2VzdHJpbmcpOgorICAgICAgICB4ID0gcmVwcih4KQorICAgIHJldHVybiB4LnpmaWxsKHdpZHRoKQorCisjIEV4cGFuZCB0YWJzIGluIGEgc3RyaW5nLgorIyBEb2Vzbid0IHRha2Ugbm9uLXByaW50aW5nIGNoYXJzIGludG8gYWNjb3VudCwgYnV0IGRvZXMgdW5kZXJzdGFuZCBcbi4KK2RlZiBleHBhbmR0YWJzKHMsIHRhYnNpemU9OCk6CisgICAgIiIiZXhwYW5kdGFicyhzIFssdGFic2l6ZV0pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgd2l0aCBhbGwgdGFiIGNoYXJhY3RlcnMgcmVwbGFjZWQKKyAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIHNwYWNlcywgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50CisgICAgY29sdW1uLCBhbmQgdGhlIHRhYnNpemUgKGRlZmF1bHQgOCkuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5leHBhbmR0YWJzKHRhYnNpemUpCisKKyMgQ2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRocm91Z2ggbG9vay11cCB0YWJsZS4KK2RlZiB0cmFuc2xhdGUocywgdGFibGUsIGRlbGV0aW9ucz0iIik6CisgICAgIiIidHJhbnNsYXRlKHMsdGFibGUgWyxkZWxldGlvbnNdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzLCB3aGVyZSBhbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcKKyAgICBpbiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgZGVsZXRpb25zIGFyZSByZW1vdmVkLCBhbmQgdGhlCisgICAgcmVtYWluaW5nIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIG1hcHBlZCB0aHJvdWdoIHRoZSBnaXZlbgorICAgIHRyYW5zbGF0aW9uIHRhYmxlLCB3aGljaCBtdXN0IGJlIGEgc3RyaW5nIG9mIGxlbmd0aCAyNTYuICBUaGUKKyAgICBkZWxldGlvbnMgYXJndW1lbnQgaXMgbm90IGFsbG93ZWQgZm9yIFVuaWNvZGUgc3RyaW5ncy4KKworICAgICIiIgorICAgIGlmIGRlbGV0aW9ucyBvciB0YWJsZSBpcyBOb25lOgorICAgICAgICByZXR1cm4gcy50cmFuc2xhdGUodGFibGUsIGRlbGV0aW9ucykKKyAgICBlbHNlOgorICAgICAgICAjIEFkZCBzWzowXSBzbyB0aGF0IGlmIHMgaXMgVW5pY29kZSBhbmQgdGFibGUgaXMgYW4gOC1iaXQgc3RyaW5nLAorICAgICAgICAjIHRhYmxlIGlzIGNvbnZlcnRlZCB0byBVbmljb2RlLiAgVGhpcyBtZWFucyB0aGF0IHRhYmxlICpjYW5ub3QqCisgICAgICAgICMgYmUgYSBkaWN0aW9uYXJ5IC0tIGZvciB0aGF0IGZlYXR1cmUsIHVzZSB1LnRyYW5zbGF0ZSgpIGRpcmVjdGx5LgorICAgICAgICByZXR1cm4gcy50cmFuc2xhdGUodGFibGUgKyBzWzowXSkKKworIyBDYXBpdGFsaXplIGEgc3RyaW5nLCBlLmcuICJhQmMgIGRFZiIgLT4gIkFiYyAgZGVmIi4KK2RlZiBjYXBpdGFsaXplKHMpOgorICAgICIiImNhcGl0YWxpemUocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIG9ubHkgaXRzIGZpcnN0IGNoYXJhY3RlcgorICAgIGNhcGl0YWxpemVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMuY2FwaXRhbGl6ZSgpCisKKyMgU3Vic3RyaW5nIHJlcGxhY2VtZW50IChnbG9iYWwpCitkZWYgcmVwbGFjZShzLCBvbGQsIG5ldywgbWF4cmVwbGFjZT0tMSk6CisgICAgIiIicmVwbGFjZSAoc3RyLCBvbGQsIG5ld1ssIG1heHJlcGxhY2VdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2Ygc3RyaW5nIHN0ciB3aXRoIGFsbCBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcKKyAgICBvbGQgcmVwbGFjZWQgYnkgbmV3LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgbWF4cmVwbGFjZSBpcworICAgIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBtYXhyZXBsYWNlIG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC4KKworICAgICIiIgorICAgIHJldHVybiBzLnJlcGxhY2Uob2xkLCBuZXcsIG1heHJlcGxhY2UpCisKKworIyBUcnkgaW1wb3J0aW5nIG9wdGlvbmFsIGJ1aWx0LWluIG1vZHVsZSAic3Ryb3AiIC0tIGlmIGl0IGV4aXN0cywKKyMgaXQgcmVkZWZpbmVzIHNvbWUgc3RyaW5nIG9wZXJhdGlvbnMgdGhhdCBhcmUgMTAwLTEwMDAgdGltZXMgZmFzdGVyLgorIyBJdCBhbHNvIGRlZmluZXMgdmFsdWVzIGZvciB3aGl0ZXNwYWNlLCBsb3dlcmNhc2UgYW5kIHVwcGVyY2FzZQorIyB0aGF0IG1hdGNoIDxjdHlwZS5oPidzIGRlZmluaXRpb25zLgorCit0cnk6CisgICAgZnJvbSBzdHJvcCBpbXBvcnQgbWFrZXRyYW5zLCBsb3dlcmNhc2UsIHVwcGVyY2FzZSwgd2hpdGVzcGFjZQorICAgIGxldHRlcnMgPSBsb3dlcmNhc2UgKyB1cHBlcmNhc2UKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgdGhlIG9yaWdpbmFsIHZlcnNpb25zCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0aGUgRm9ybWF0dGVyIGNsYXNzCisjIHNlZSBQRVAgMzEwMSBmb3IgZGV0YWlscyBhbmQgcHVycG9zZSBvZiB0aGlzIGNsYXNzCisKKyMgVGhlIGhhcmQgcGFydHMgYXJlIHJldXNlZCBmcm9tIHRoZSBDIGltcGxlbWVudGF0aW9uLiAgVGhleSdyZSBleHBvc2VkIGFzICJfIgorIyBwcmVmaXhlZCBtZXRob2RzIG9mIHN0ciBhbmQgdW5pY29kZS4KKworIyBUaGUgb3ZlcmFsbCBwYXJzZXIgaXMgaW1wbGVtZW50ZWQgaW4gc3RyLl9mb3JtYXR0ZXJfcGFyc2VyLgorIyBUaGUgZmllbGQgbmFtZSBwYXJzZXIgaXMgaW1wbGVtZW50ZWQgaW4gc3RyLl9mb3JtYXR0ZXJfZmllbGRfbmFtZV9zcGxpdAorCitjbGFzcyBGb3JtYXR0ZXIob2JqZWN0KToKKyAgICBkZWYgZm9ybWF0KHNlbGYsIGZvcm1hdF9zdHJpbmcsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLnZmb3JtYXQoZm9ybWF0X3N0cmluZywgYXJncywga3dhcmdzKQorCisgICAgZGVmIHZmb3JtYXQoc2VsZiwgZm9ybWF0X3N0cmluZywgYXJncywga3dhcmdzKToKKyAgICAgICAgdXNlZF9hcmdzID0gc2V0KCkKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5fdmZvcm1hdChmb3JtYXRfc3RyaW5nLCBhcmdzLCBrd2FyZ3MsIHVzZWRfYXJncywgMikKKyAgICAgICAgc2VsZi5jaGVja191bnVzZWRfYXJncyh1c2VkX2FyZ3MsIGFyZ3MsIGt3YXJncykKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF92Zm9ybWF0KHNlbGYsIGZvcm1hdF9zdHJpbmcsIGFyZ3MsIGt3YXJncywgdXNlZF9hcmdzLCByZWN1cnNpb25fZGVwdGgpOgorICAgICAgICBpZiByZWN1cnNpb25fZGVwdGggPCAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTWF4IHN0cmluZyByZWN1cnNpb24gZXhjZWVkZWQnKQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBmb3IgbGl0ZXJhbF90ZXh0LCBmaWVsZF9uYW1lLCBmb3JtYXRfc3BlYywgY29udmVyc2lvbiBpbiBcCisgICAgICAgICAgICAgICAgc2VsZi5wYXJzZShmb3JtYXRfc3RyaW5nKToKKworICAgICAgICAgICAgIyBvdXRwdXQgdGhlIGxpdGVyYWwgdGV4dAorICAgICAgICAgICAgaWYgbGl0ZXJhbF90ZXh0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGl0ZXJhbF90ZXh0KQorCisgICAgICAgICAgICAjIGlmIHRoZXJlJ3MgYSBmaWVsZCwgb3V0cHV0IGl0CisgICAgICAgICAgICBpZiBmaWVsZF9uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICMgdGhpcyBpcyBzb21lIG1hcmt1cCwgZmluZCB0aGUgb2JqZWN0IGFuZCBkbworICAgICAgICAgICAgICAgICMgIHRoZSBmb3JtYXR0aW5nCisKKyAgICAgICAgICAgICAgICAjIGdpdmVuIHRoZSBmaWVsZF9uYW1lLCBmaW5kIHRoZSBvYmplY3QgaXQgcmVmZXJlbmNlcworICAgICAgICAgICAgICAgICMgIGFuZCB0aGUgYXJndW1lbnQgaXQgY2FtZSBmcm9tCisgICAgICAgICAgICAgICAgb2JqLCBhcmdfdXNlZCA9IHNlbGYuZ2V0X2ZpZWxkKGZpZWxkX25hbWUsIGFyZ3MsIGt3YXJncykKKyAgICAgICAgICAgICAgICB1c2VkX2FyZ3MuYWRkKGFyZ191c2VkKQorCisgICAgICAgICAgICAgICAgIyBkbyBhbnkgY29udmVyc2lvbiBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdAorICAgICAgICAgICAgICAgIG9iaiA9IHNlbGYuY29udmVydF9maWVsZChvYmosIGNvbnZlcnNpb24pCisKKyAgICAgICAgICAgICAgICAjIGV4cGFuZCB0aGUgZm9ybWF0IHNwZWMsIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIGZvcm1hdF9zcGVjID0gc2VsZi5fdmZvcm1hdChmb3JtYXRfc3BlYywgYXJncywga3dhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX2FyZ3MsIHJlY3Vyc2lvbl9kZXB0aC0xKQorCisgICAgICAgICAgICAgICAgIyBmb3JtYXQgdGhlIG9iamVjdCBhbmQgYXBwZW5kIHRvIHRoZSByZXN1bHQKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZm9ybWF0X2ZpZWxkKG9iaiwgZm9ybWF0X3NwZWMpKQorCisgICAgICAgIHJldHVybiAnJy5qb2luKHJlc3VsdCkKKworCisgICAgZGVmIGdldF92YWx1ZShzZWxmLCBrZXksIGFyZ3MsIGt3YXJncyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICByZXR1cm4gYXJnc1trZXldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4ga3dhcmdzW2tleV0KKworCisgICAgZGVmIGNoZWNrX3VudXNlZF9hcmdzKHNlbGYsIHVzZWRfYXJncywgYXJncywga3dhcmdzKToKKyAgICAgICAgcGFzcworCisKKyAgICBkZWYgZm9ybWF0X2ZpZWxkKHNlbGYsIHZhbHVlLCBmb3JtYXRfc3BlYyk6CisgICAgICAgIHJldHVybiBmb3JtYXQodmFsdWUsIGZvcm1hdF9zcGVjKQorCisKKyAgICBkZWYgY29udmVydF9maWVsZChzZWxmLCB2YWx1ZSwgY29udmVyc2lvbik6CisgICAgICAgICMgZG8gYW55IGNvbnZlcnNpb24gb24gdGhlIHJlc3VsdGluZyBvYmplY3QKKyAgICAgICAgaWYgY29udmVyc2lvbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHZhbHVlCisgICAgICAgIGVsaWYgY29udmVyc2lvbiA9PSAncyc6CisgICAgICAgICAgICByZXR1cm4gc3RyKHZhbHVlKQorICAgICAgICBlbGlmIGNvbnZlcnNpb24gPT0gJ3InOgorICAgICAgICAgICAgcmV0dXJuIHJlcHIodmFsdWUpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlVua25vd24gY29udmVyc2lvbiBzcGVjaWZpZXIgezAhc30iLmZvcm1hdChjb252ZXJzaW9uKSkKKworCisgICAgIyByZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgY29udGFpbnMgdHVwbGVzIG9mIHRoZSBmb3JtOgorICAgICMgKGxpdGVyYWxfdGV4dCwgZmllbGRfbmFtZSwgZm9ybWF0X3NwZWMsIGNvbnZlcnNpb24pCisgICAgIyBsaXRlcmFsX3RleHQgY2FuIGJlIHplcm8gbGVuZ3RoCisgICAgIyBmaWVsZF9uYW1lIGNhbiBiZSBOb25lLCBpbiB3aGljaCBjYXNlIHRoZXJlJ3Mgbm8KKyAgICAjICBvYmplY3QgdG8gZm9ybWF0IGFuZCBvdXRwdXQKKyAgICAjIGlmIGZpZWxkX25hbWUgaXMgbm90IE5vbmUsIGl0IGlzIGxvb2tlZCB1cCwgZm9ybWF0dGVkCisgICAgIyAgd2l0aCBmb3JtYXRfc3BlYyBhbmQgY29udmVyc2lvbiBhbmQgdGhlbiB1c2VkCisgICAgZGVmIHBhcnNlKHNlbGYsIGZvcm1hdF9zdHJpbmcpOgorICAgICAgICByZXR1cm4gZm9ybWF0X3N0cmluZy5fZm9ybWF0dGVyX3BhcnNlcigpCisKKworICAgICMgZ2l2ZW4gYSBmaWVsZF9uYW1lLCBmaW5kIHRoZSBvYmplY3QgaXQgcmVmZXJlbmNlcy4KKyAgICAjICBmaWVsZF9uYW1lOiAgIHRoZSBmaWVsZCBiZWluZyBsb29rZWQgdXAsIGUuZy4gIjAubmFtZSIKKyAgICAjICAgICAgICAgICAgICAgICBvciAibG9va3VwWzNdIgorICAgICMgIHVzZWRfYXJnczogICAgYSBzZXQgb2Ygd2hpY2ggYXJncyBoYXZlIGJlZW4gdXNlZAorICAgICMgIGFyZ3MsIGt3YXJnczogYXMgcGFzc2VkIGluIHRvIHZmb3JtYXQKKyAgICBkZWYgZ2V0X2ZpZWxkKHNlbGYsIGZpZWxkX25hbWUsIGFyZ3MsIGt3YXJncyk6CisgICAgICAgIGZpcnN0LCByZXN0ID0gZmllbGRfbmFtZS5fZm9ybWF0dGVyX2ZpZWxkX25hbWVfc3BsaXQoKQorCisgICAgICAgIG9iaiA9IHNlbGYuZ2V0X3ZhbHVlKGZpcnN0LCBhcmdzLCBrd2FyZ3MpCisKKyAgICAgICAgIyBsb29wIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGZpZWxkX25hbWUsIGRvaW5nCisgICAgICAgICMgIGdldGF0dHIgb3IgZ2V0aXRlbSBhcyBuZWVkZWQKKyAgICAgICAgZm9yIGlzX2F0dHIsIGkgaW4gcmVzdDoKKyAgICAgICAgICAgIGlmIGlzX2F0dHI6CisgICAgICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihvYmosIGkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9iaiA9IG9ialtpXQorCisgICAgICAgIHJldHVybiBvYmosIGZpcnN0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZy5weWMgYi9saWIvcHl0aG9uMi43L3N0cmluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZDJhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZy5weW8gYi9saWIvcHl0aG9uMi43L3N0cmluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZDJhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZ29sZC5weSBiL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZmUzODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0cmluZ29sZC5weQpAQCAtMCwwICsxLDQzMiBAQAorIyBtb2R1bGUgJ3N0cmluZycgLS0gQSBjb2xsZWN0aW9uIG9mIHN0cmluZyBvcGVyYXRpb25zCisKKyMgV2FybmluZzogbW9zdCBvZiB0aGUgY29kZSB5b3Ugc2VlIGhlcmUgaXNuJ3Qgbm9ybWFsbHkgdXNlZCBub3dhZGF5cy4gIFdpdGgKKyMgUHl0aG9uIDEuNiwgbWFueSBvZiB0aGVzZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGFzIG1ldGhvZHMgb24gdGhlCisjIHN0YW5kYXJkIHN0cmluZyBvYmplY3QuIFRoZXkgdXNlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBhIGJ1aWx0LWluIG1vZHVsZQorIyBjYWxsZWQgc3Ryb3AsIGJ1dCBzdHJvcCBpcyBub3cgb2Jzb2xldGUgaXRzZWxmLgorCisiIiJDb21tb24gc3RyaW5nIG1hbmlwdWxhdGlvbnMuCisKK1B1YmxpYyBtb2R1bGUgdmFyaWFibGVzOgorCit3aGl0ZXNwYWNlIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCB3aGl0ZXNwYWNlCitsb3dlcmNhc2UgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGxvd2VyY2FzZSBsZXR0ZXJzCit1cHBlcmNhc2UgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIHVwcGVyY2FzZSBsZXR0ZXJzCitsZXR0ZXJzIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBsZXR0ZXJzCitkaWdpdHMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGRlY2ltYWwgZGlnaXRzCitoZXhkaWdpdHMgLS0gYSBzdHJpbmcgY29udGFpbmluZyBhbGwgY2hhcmFjdGVycyBjb25zaWRlcmVkIGhleGFkZWNpbWFsIGRpZ2l0cworb2N0ZGlnaXRzIC0tIGEgc3RyaW5nIGNvbnRhaW5pbmcgYWxsIGNoYXJhY3RlcnMgY29uc2lkZXJlZCBvY3RhbCBkaWdpdHMKKworIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSBzdHJpbmdvbGQgbW9kdWxlIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCisjIFNvbWUgc3RyaW5ncyBmb3IgY3R5cGUtc3R5bGUgY2hhcmFjdGVyIGNsYXNzaWZpY2F0aW9uCit3aGl0ZXNwYWNlID0gJyBcdFxuXHJcdlxmJworbG93ZXJjYXNlID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JwordXBwZXJjYXNlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworbGV0dGVycyA9IGxvd2VyY2FzZSArIHVwcGVyY2FzZQorZGlnaXRzID0gJzAxMjM0NTY3ODknCitoZXhkaWdpdHMgPSBkaWdpdHMgKyAnYWJjZGVmJyArICdBQkNERUYnCitvY3RkaWdpdHMgPSAnMDEyMzQ1NjcnCisKKyMgQ2FzZSBjb252ZXJzaW9uIGhlbHBlcnMKK19pZG1hcCA9ICcnCitmb3IgaSBpbiByYW5nZSgyNTYpOiBfaWRtYXAgPSBfaWRtYXAgKyBjaHIoaSkKK2RlbCBpCisKKyMgQmFja3dhcmQgY29tcGF0aWJsZSBuYW1lcyBmb3IgZXhjZXB0aW9ucworaW5kZXhfZXJyb3IgPSBWYWx1ZUVycm9yCithdG9pX2Vycm9yID0gVmFsdWVFcnJvcgorYXRvZl9lcnJvciA9IFZhbHVlRXJyb3IKK2F0b2xfZXJyb3IgPSBWYWx1ZUVycm9yCisKKyMgY29udmVydCBVUFBFUiBDQVNFIGxldHRlcnMgdG8gbG93ZXIgY2FzZQorZGVmIGxvd2VyKHMpOgorICAgICIiImxvd2VyKHMpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY29weSBvZiB0aGUgc3RyaW5nIHMgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKworICAgICIiIgorICAgIHJldHVybiBzLmxvd2VyKCkKKworIyBDb252ZXJ0IGxvd2VyIGNhc2UgbGV0dGVycyB0byBVUFBFUiBDQVNFCitkZWYgdXBwZXIocyk6CisgICAgIiIidXBwZXIocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMudXBwZXIoKQorCisjIFN3YXAgbG93ZXIgY2FzZSBsZXR0ZXJzIGFuZCBVUFBFUiBDQVNFCitkZWYgc3dhcGNhc2Uocyk6CisgICAgIiIic3dhcGNhc2UocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIHVwcGVyIGNhc2UgY2hhcmFjdGVycworICAgIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UgYW5kIHZpY2UgdmVyc2EuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5zd2FwY2FzZSgpCisKKyMgU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgdGFicyBhbmQgc3BhY2VzCitkZWYgc3RyaXAocyk6CisgICAgIiIic3RyaXAocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIGxlYWRpbmcgYW5kIHRyYWlsaW5nCisgICAgd2hpdGVzcGFjZSByZW1vdmVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMuc3RyaXAoKQorCisjIFN0cmlwIGxlYWRpbmcgdGFicyBhbmQgc3BhY2VzCitkZWYgbHN0cmlwKHMpOgorICAgICIiImxzdHJpcChzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggbGVhZGluZyB3aGl0ZXNwYWNlIHJlbW92ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5sc3RyaXAoKQorCisjIFN0cmlwIHRyYWlsaW5nIHRhYnMgYW5kIHNwYWNlcworZGVmIHJzdHJpcChzKToKKyAgICAiIiJyc3RyaXAocykgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzdHJpbmcgcyB3aXRoIHRyYWlsaW5nIHdoaXRlc3BhY2UKKyAgICByZW1vdmVkLgorCisgICAgIiIiCisgICAgcmV0dXJuIHMucnN0cmlwKCkKKworCisjIFNwbGl0IGEgc3RyaW5nIGludG8gYSBsaXN0IG9mIHNwYWNlL3RhYi1zZXBhcmF0ZWQgd29yZHMKK2RlZiBzcGxpdChzLCBzZXA9Tm9uZSwgbWF4c3BsaXQ9MCk6CisgICAgIiIic3BsaXQoc3RyIFssc2VwIFssbWF4c3BsaXRdXSkgLT4gbGlzdCBvZiBzdHJpbmdzCisKKyAgICBSZXR1cm4gYSBsaXN0IG9mIHRoZSB3b3JkcyBpbiB0aGUgc3RyaW5nIHMsIHVzaW5nIHNlcCBhcyB0aGUKKyAgICBkZWxpbWl0ZXIgc3RyaW5nLiAgSWYgbWF4c3BsaXQgaXMgbm9uemVybywgc3BsaXRzIGludG8gYXQgbW9zdAorICAgIG1heHNwbGl0IHdvcmRzIElmIHNlcCBpcyBub3Qgc3BlY2lmaWVkLCBhbnkgd2hpdGVzcGFjZSBzdHJpbmcKKyAgICBpcyBhIHNlcGFyYXRvci4gIE1heHNwbGl0IGRlZmF1bHRzIHRvIDAuCisKKyAgICAoc3BsaXQgYW5kIHNwbGl0ZmllbGRzIGFyZSBzeW5vbnltb3VzKQorCisgICAgIiIiCisgICAgcmV0dXJuIHMuc3BsaXQoc2VwLCBtYXhzcGxpdCkKK3NwbGl0ZmllbGRzID0gc3BsaXQKKworIyBKb2luIGZpZWxkcyB3aXRoIG9wdGlvbmFsIHNlcGFyYXRvcgorZGVmIGpvaW4od29yZHMsIHNlcCA9ICcgJyk6CisgICAgIiIiam9pbihsaXN0IFssc2VwXSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBzdHJpbmcgY29tcG9zZWQgb2YgdGhlIHdvcmRzIGluIGxpc3QsIHdpdGgKKyAgICBpbnRlcnZlbmluZyBvY2N1cnJlbmNlcyBvZiBzZXAuICBUaGUgZGVmYXVsdCBzZXBhcmF0b3IgaXMgYQorICAgIHNpbmdsZSBzcGFjZS4KKworICAgIChqb2luZmllbGRzIGFuZCBqb2luIGFyZSBzeW5vbnltb3VzKQorCisgICAgIiIiCisgICAgcmV0dXJuIHNlcC5qb2luKHdvcmRzKQoram9pbmZpZWxkcyA9IGpvaW4KKworIyBmb3IgYSBsaXR0bGUgYml0IG9mIHNwZWVkCitfYXBwbHkgPSBhcHBseQorCisjIEZpbmQgc3Vic3RyaW5nLCByYWlzZSBleGNlcHRpb24gaWYgbm90IGZvdW5kCitkZWYgaW5kZXgocywgKmFyZ3MpOgorICAgICIiImluZGV4KHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGludAorCisgICAgTGlrZSBmaW5kIGJ1dCByYWlzZXMgVmFsdWVFcnJvciB3aGVuIHRoZSBzdWJzdHJpbmcgaXMgbm90IGZvdW5kLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9hcHBseShzLmluZGV4LCBhcmdzKQorCisjIEZpbmQgbGFzdCBzdWJzdHJpbmcsIHJhaXNlIGV4Y2VwdGlvbiBpZiBub3QgZm91bmQKK2RlZiByaW5kZXgocywgKmFyZ3MpOgorICAgICIiInJpbmRleChzLCBzdWIgWyxzdGFydCBbLGVuZF1dKSAtPiBpbnQKKworICAgIExpa2UgcmZpbmQgYnV0IHJhaXNlcyBWYWx1ZUVycm9yIHdoZW4gdGhlIHN1YnN0cmluZyBpcyBub3QgZm91bmQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2FwcGx5KHMucmluZGV4LCBhcmdzKQorCisjIENvdW50IG5vbi1vdmVybGFwcGluZyBvY2N1cnJlbmNlcyBvZiBzdWJzdHJpbmcKK2RlZiBjb3VudChzLCAqYXJncyk6CisgICAgIiIiY291bnQocywgc3ViWywgc3RhcnRbLGVuZF1dKSAtPiBpbnQKKworICAgIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIHN1YnN0cmluZyBzdWIgaW4gc3RyaW5nCisgICAgc1tzdGFydDplbmRdLiAgT3B0aW9uYWwgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlCisgICAgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2FwcGx5KHMuY291bnQsIGFyZ3MpCisKKyMgRmluZCBzdWJzdHJpbmcsIHJldHVybiAtMSBpZiBub3QgZm91bmQKK2RlZiBmaW5kKHMsICphcmdzKToKKyAgICAiIiJmaW5kKHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGluCisKKyAgICBSZXR1cm4gdGhlIGxvd2VzdCBpbmRleCBpbiBzIHdoZXJlIHN1YnN0cmluZyBzdWIgaXMgZm91bmQsCisgICAgc3VjaCB0aGF0IHN1YiBpcyBjb250YWluZWQgd2l0aGluIHNbc3RhcnQsZW5kXS4gIE9wdGlvbmFsCisgICAgYXJndW1lbnRzIHN0YXJ0IGFuZCBlbmQgYXJlIGludGVycHJldGVkIGFzIGluIHNsaWNlIG5vdGF0aW9uLgorCisgICAgUmV0dXJuIC0xIG9uIGZhaWx1cmUuCisKKyAgICAiIiIKKyAgICByZXR1cm4gX2FwcGx5KHMuZmluZCwgYXJncykKKworIyBGaW5kIGxhc3Qgc3Vic3RyaW5nLCByZXR1cm4gLTEgaWYgbm90IGZvdW5kCitkZWYgcmZpbmQocywgKmFyZ3MpOgorICAgICIiInJmaW5kKHMsIHN1YiBbLHN0YXJ0IFssZW5kXV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBoaWdoZXN0IGluZGV4IGluIHMgd2hlcmUgc3Vic3RyaW5nIHN1YiBpcyBmb3VuZCwKKyAgICBzdWNoIHRoYXQgc3ViIGlzIGNvbnRhaW5lZCB3aXRoaW4gc1tzdGFydCxlbmRdLiAgT3B0aW9uYWwKKyAgICBhcmd1bWVudHMgc3RhcnQgYW5kIGVuZCBhcmUgaW50ZXJwcmV0ZWQgYXMgaW4gc2xpY2Ugbm90YXRpb24uCisKKyAgICBSZXR1cm4gLTEgb24gZmFpbHVyZS4KKworICAgICIiIgorICAgIHJldHVybiBfYXBwbHkocy5yZmluZCwgYXJncykKKworIyBmb3IgYSBiaXQgb2Ygc3BlZWQKK19mbG9hdCA9IGZsb2F0CitfaW50ID0gaW50CitfbG9uZyA9IGxvbmcKK19TdHJpbmdUeXBlID0gdHlwZSgnJykKKworIyBDb252ZXJ0IHN0cmluZyB0byBmbG9hdAorZGVmIGF0b2Yocyk6CisgICAgIiIiYXRvZihzKSAtPiBmbG9hdAorCisgICAgUmV0dXJuIHRoZSBmbG9hdGluZyBwb2ludCBudW1iZXIgcmVwcmVzZW50ZWQgYnkgdGhlIHN0cmluZyBzLgorCisgICAgIiIiCisgICAgaWYgdHlwZShzKSA9PSBfU3RyaW5nVHlwZToKKyAgICAgICAgcmV0dXJuIF9mbG9hdChzKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXJndW1lbnQgMTogZXhwZWN0ZWQgc3RyaW5nLCAlcyBmb3VuZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShzKS5fX25hbWVfXykKKworIyBDb252ZXJ0IHN0cmluZyB0byBpbnRlZ2VyCitkZWYgYXRvaSgqYXJncyk6CisgICAgIiIiYXRvaShzIFssYmFzZV0pIC0+IGludAorCisgICAgUmV0dXJuIHRoZSBpbnRlZ2VyIHJlcHJlc2VudGVkIGJ5IHRoZSBzdHJpbmcgcyBpbiB0aGUgZ2l2ZW4KKyAgICBiYXNlLCB3aGljaCBkZWZhdWx0cyB0byAxMC4gIFRoZSBzdHJpbmcgcyBtdXN0IGNvbnNpc3Qgb2Ygb25lCisgICAgb3IgbW9yZSBkaWdpdHMsIHBvc3NpYmx5IHByZWNlZGVkIGJ5IGEgc2lnbi4gIElmIGJhc2UgaXMgMCwgaXQKKyAgICBpcyBjaG9zZW4gZnJvbSB0aGUgbGVhZGluZyBjaGFyYWN0ZXJzIG9mIHMsIDAgZm9yIG9jdGFsLCAweCBvcgorICAgIDBYIGZvciBoZXhhZGVjaW1hbC4gIElmIGJhc2UgaXMgMTYsIGEgcHJlY2VkaW5nIDB4IG9yIDBYIGlzCisgICAgYWNjZXB0ZWQuCisKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHMgPSBhcmdzWzBdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZnVuY3Rpb24gcmVxdWlyZXMgYXQgbGVhc3QgMSBhcmd1bWVudDogJWQgZ2l2ZW4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSkKKyAgICAjIERvbid0IGNhdGNoIHR5cGUgZXJyb3IgcmVzdWx0aW5nIGZyb20gdG9vIG1hbnkgYXJndW1lbnRzIHRvIGludCgpLiAgVGhlCisgICAgIyBlcnJvciBtZXNzYWdlIGlzbid0IGNvbXBhdGlibGUgYnV0IHRoZSBlcnJvciB0eXBlIGlzLCBhbmQgdGhpcyBmdW5jdGlvbgorICAgICMgaXMgY29tcGxpY2F0ZWQgZW5vdWdoIGFscmVhZHkuCisgICAgaWYgdHlwZShzKSA9PSBfU3RyaW5nVHlwZToKKyAgICAgICAgcmV0dXJuIF9hcHBseShfaW50LCBhcmdzKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignYXJndW1lbnQgMTogZXhwZWN0ZWQgc3RyaW5nLCAlcyBmb3VuZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShzKS5fX25hbWVfXykKKworCisjIENvbnZlcnQgc3RyaW5nIHRvIGxvbmcgaW50ZWdlcgorZGVmIGF0b2woKmFyZ3MpOgorICAgICIiImF0b2wocyBbLGJhc2VdKSAtPiBsb25nCisKKyAgICBSZXR1cm4gdGhlIGxvbmcgaW50ZWdlciByZXByZXNlbnRlZCBieSB0aGUgc3RyaW5nIHMgaW4gdGhlCisgICAgZ2l2ZW4gYmFzZSwgd2hpY2ggZGVmYXVsdHMgdG8gMTAuICBUaGUgc3RyaW5nIHMgbXVzdCBjb25zaXN0CisgICAgb2Ygb25lIG9yIG1vcmUgZGlnaXRzLCBwb3NzaWJseSBwcmVjZWRlZCBieSBhIHNpZ24uICBJZiBiYXNlCisgICAgaXMgMCwgaXQgaXMgY2hvc2VuIGZyb20gdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBvZiBzLCAwIGZvcgorICAgIG9jdGFsLCAweCBvciAwWCBmb3IgaGV4YWRlY2ltYWwuICBJZiBiYXNlIGlzIDE2LCBhIHByZWNlZGluZworICAgIDB4IG9yIDBYIGlzIGFjY2VwdGVkLiAgQSB0cmFpbGluZyBMIG9yIGwgaXMgbm90IGFjY2VwdGVkLAorICAgIHVubGVzcyBiYXNlIGlzIDAuCisKKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHMgPSBhcmdzWzBdCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZnVuY3Rpb24gcmVxdWlyZXMgYXQgbGVhc3QgMSBhcmd1bWVudDogJWQgZ2l2ZW4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcmdzKSkKKyAgICAjIERvbid0IGNhdGNoIHR5cGUgZXJyb3IgcmVzdWx0aW5nIGZyb20gdG9vIG1hbnkgYXJndW1lbnRzIHRvIGxvbmcoKS4gIFRoZQorICAgICMgZXJyb3IgbWVzc2FnZSBpc24ndCBjb21wYXRpYmxlIGJ1dCB0aGUgZXJyb3IgdHlwZSBpcywgYW5kIHRoaXMgZnVuY3Rpb24KKyAgICAjIGlzIGNvbXBsaWNhdGVkIGVub3VnaCBhbHJlYWR5LgorICAgIGlmIHR5cGUocykgPT0gX1N0cmluZ1R5cGU6CisgICAgICAgIHJldHVybiBfYXBwbHkoX2xvbmcsIGFyZ3MpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdhcmd1bWVudCAxOiBleHBlY3RlZCBzdHJpbmcsICVzIGZvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHMpLl9fbmFtZV9fKQorCisKKyMgTGVmdC1qdXN0aWZ5IGEgc3RyaW5nCitkZWYgbGp1c3Qocywgd2lkdGgpOgorICAgICIiImxqdXN0KHMsIHdpZHRoKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGxlZnQtanVzdGlmaWVkIHZlcnNpb24gb2YgcywgaW4gYSBmaWVsZCBvZiB0aGUKKyAgICBzcGVjaWZpZWQgd2lkdGgsIHBhZGRlZCB3aXRoIHNwYWNlcyBhcyBuZWVkZWQuICBUaGUgc3RyaW5nIGlzCisgICAgbmV2ZXIgdHJ1bmNhdGVkLgorCisgICAgIiIiCisgICAgbiA9IHdpZHRoIC0gbGVuKHMpCisgICAgaWYgbiA8PSAwOiByZXR1cm4gcworICAgIHJldHVybiBzICsgJyAnKm4KKworIyBSaWdodC1qdXN0aWZ5IGEgc3RyaW5nCitkZWYgcmp1c3Qocywgd2lkdGgpOgorICAgICIiInJqdXN0KHMsIHdpZHRoKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIHJpZ2h0LWp1c3RpZmllZCB2ZXJzaW9uIG9mIHMsIGluIGEgZmllbGQgb2YgdGhlCisgICAgc3BlY2lmaWVkIHdpZHRoLCBwYWRkZWQgd2l0aCBzcGFjZXMgYXMgbmVlZGVkLiAgVGhlIHN0cmluZyBpcworICAgIG5ldmVyIHRydW5jYXRlZC4KKworICAgICIiIgorICAgIG4gPSB3aWR0aCAtIGxlbihzKQorICAgIGlmIG4gPD0gMDogcmV0dXJuIHMKKyAgICByZXR1cm4gJyAnKm4gKyBzCisKKyMgQ2VudGVyIGEgc3RyaW5nCitkZWYgY2VudGVyKHMsIHdpZHRoKToKKyAgICAiIiJjZW50ZXIocywgd2lkdGgpIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgY2VudGVyIHZlcnNpb24gb2YgcywgaW4gYSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkCisgICAgd2lkdGguIHBhZGRlZCB3aXRoIHNwYWNlcyBhcyBuZWVkZWQuICBUaGUgc3RyaW5nIGlzIG5ldmVyCisgICAgdHJ1bmNhdGVkLgorCisgICAgIiIiCisgICAgbiA9IHdpZHRoIC0gbGVuKHMpCisgICAgaWYgbiA8PSAwOiByZXR1cm4gcworICAgIGhhbGYgPSBuLzIKKyAgICBpZiBuJTIgYW5kIHdpZHRoJTI6CisgICAgICAgICMgVGhpcyBlbnN1cmVzIHRoYXQgY2VudGVyKGNlbnRlcihzLCBpKSwgaikgPSBjZW50ZXIocywgaikKKyAgICAgICAgaGFsZiA9IGhhbGYrMQorICAgIHJldHVybiAnICcqaGFsZiArICBzICsgJyAnKihuLWhhbGYpCisKKyMgWmVyby1maWxsIGEgbnVtYmVyLCBlLmcuLCAoMTIsIDMpIC0tPiAnMDEyJyBhbmQgKC0zLCAzKSAtLT4gJy0wMycKKyMgRGVjYWRlbnQgZmVhdHVyZTogdGhlIGFyZ3VtZW50IG1heSBiZSBhIHN0cmluZyBvciBhIG51bWJlcgorIyAoVXNlIG9mIHRoaXMgaXMgZGVwcmVjYXRlZDsgaXQgc2hvdWxkIGJlIGEgc3RyaW5nIGFzIHdpdGggbGp1c3QgYy5zLikKK2RlZiB6ZmlsbCh4LCB3aWR0aCk6CisgICAgIiIiemZpbGwoeCwgd2lkdGgpIC0+IHN0cmluZworCisgICAgUGFkIGEgbnVtZXJpYyBzdHJpbmcgeCB3aXRoIHplcm9zIG9uIHRoZSBsZWZ0LCB0byBmaWxsIGEgZmllbGQKKyAgICBvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLiAgVGhlIHN0cmluZyB4IGlzIG5ldmVyIHRydW5jYXRlZC4KKworICAgICIiIgorICAgIGlmIHR5cGUoeCkgPT0gdHlwZSgnJyk6IHMgPSB4CisgICAgZWxzZTogcyA9IHJlcHIoeCkKKyAgICBuID0gbGVuKHMpCisgICAgaWYgbiA+PSB3aWR0aDogcmV0dXJuIHMKKyAgICBzaWduID0gJycKKyAgICBpZiBzWzBdIGluICgnLScsICcrJyk6CisgICAgICAgIHNpZ24sIHMgPSBzWzBdLCBzWzE6XQorICAgIHJldHVybiBzaWduICsgJzAnKih3aWR0aC1uKSArIHMKKworIyBFeHBhbmQgdGFicyBpbiBhIHN0cmluZy4KKyMgRG9lc24ndCB0YWtlIG5vbi1wcmludGluZyBjaGFycyBpbnRvIGFjY291bnQsIGJ1dCBkb2VzIHVuZGVyc3RhbmQgXG4uCitkZWYgZXhwYW5kdGFicyhzLCB0YWJzaXplPTgpOgorICAgICIiImV4cGFuZHRhYnMocyBbLHRhYnNpemVdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggYWxsIHRhYiBjaGFyYWN0ZXJzIHJlcGxhY2VkCisgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBzcGFjZXMsIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudAorICAgIGNvbHVtbiwgYW5kIHRoZSB0YWJzaXplIChkZWZhdWx0IDgpLgorCisgICAgIiIiCisgICAgcmVzID0gbGluZSA9ICcnCisgICAgZm9yIGMgaW4gczoKKyAgICAgICAgaWYgYyA9PSAnXHQnOgorICAgICAgICAgICAgYyA9ICcgJyoodGFic2l6ZSAtIGxlbihsaW5lKSAlIHRhYnNpemUpCisgICAgICAgIGxpbmUgPSBsaW5lICsgYworICAgICAgICBpZiBjID09ICdcbic6CisgICAgICAgICAgICByZXMgPSByZXMgKyBsaW5lCisgICAgICAgICAgICBsaW5lID0gJycKKyAgICByZXR1cm4gcmVzICsgbGluZQorCisjIENoYXJhY3RlciB0cmFuc2xhdGlvbiB0aHJvdWdoIGxvb2stdXAgdGFibGUuCitkZWYgdHJhbnNsYXRlKHMsIHRhYmxlLCBkZWxldGlvbnM9IiIpOgorICAgICIiInRyYW5zbGF0ZShzLHRhYmxlIFssZGVsZXRlY2hhcnNdKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzLCB3aGVyZSBhbGwgY2hhcmFjdGVycyBvY2N1cnJpbmcKKyAgICBpbiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgZGVsZXRlY2hhcnMgYXJlIHJlbW92ZWQsIGFuZCB0aGUKKyAgICByZW1haW5pbmcgY2hhcmFjdGVycyBoYXZlIGJlZW4gbWFwcGVkIHRocm91Z2ggdGhlIGdpdmVuCisgICAgdHJhbnNsYXRpb24gdGFibGUsIHdoaWNoIG11c3QgYmUgYSBzdHJpbmcgb2YgbGVuZ3RoIDI1Ni4KKworICAgICIiIgorICAgIHJldHVybiBzLnRyYW5zbGF0ZSh0YWJsZSwgZGVsZXRpb25zKQorCisjIENhcGl0YWxpemUgYSBzdHJpbmcsIGUuZy4gImFCYyAgZEVmIiAtPiAiQWJjICBkZWYiLgorZGVmIGNhcGl0YWxpemUocyk6CisgICAgIiIiY2FwaXRhbGl6ZShzKSAtPiBzdHJpbmcKKworICAgIFJldHVybiBhIGNvcHkgb2YgdGhlIHN0cmluZyBzIHdpdGggb25seSBpdHMgZmlyc3QgY2hhcmFjdGVyCisgICAgY2FwaXRhbGl6ZWQuCisKKyAgICAiIiIKKyAgICByZXR1cm4gcy5jYXBpdGFsaXplKCkKKworIyBDYXBpdGFsaXplIHRoZSB3b3JkcyBpbiBhIHN0cmluZywgZS5nLiAiIGFCYyAgZEVmICIgLT4gIkFiYyBEZWYiLgorZGVmIGNhcHdvcmRzKHMsIHNlcD1Ob25lKToKKyAgICAiIiJjYXB3b3JkcyhzLCBbc2VwXSkgLT4gc3RyaW5nCisKKyAgICBTcGxpdCB0aGUgYXJndW1lbnQgaW50byB3b3JkcyB1c2luZyBzcGxpdCwgY2FwaXRhbGl6ZSBlYWNoCisgICAgd29yZCB1c2luZyBjYXBpdGFsaXplLCBhbmQgam9pbiB0aGUgY2FwaXRhbGl6ZWQgd29yZHMgdXNpbmcKKyAgICBqb2luLiBOb3RlIHRoYXQgdGhpcyByZXBsYWNlcyBydW5zIG9mIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBieQorICAgIGEgc2luZ2xlIHNwYWNlLgorCisgICAgIiIiCisgICAgcmV0dXJuIGpvaW4obWFwKGNhcGl0YWxpemUsIHMuc3BsaXQoc2VwKSksIHNlcCBvciAnICcpCisKKyMgQ29uc3RydWN0IGEgdHJhbnNsYXRpb24gc3RyaW5nCitfaWRtYXBMID0gTm9uZQorZGVmIG1ha2V0cmFucyhmcm9tc3RyLCB0b3N0cik6CisgICAgIiIibWFrZXRyYW5zKGZybSwgdG8pIC0+IHN0cmluZworCisgICAgUmV0dXJuIGEgdHJhbnNsYXRpb24gdGFibGUgKGEgc3RyaW5nIG9mIDI1NiBieXRlcyBsb25nKQorICAgIHN1aXRhYmxlIGZvciB1c2UgaW4gc3RyaW5nLnRyYW5zbGF0ZS4gIFRoZSBzdHJpbmdzIGZybSBhbmQgdG8KKyAgICBtdXN0IGJlIG9mIHRoZSBzYW1lIGxlbmd0aC4KKworICAgICIiIgorICAgIGlmIGxlbihmcm9tc3RyKSAhPSBsZW4odG9zdHIpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWFrZXRyYW5zIGFyZ3VtZW50cyBtdXN0IGhhdmUgc2FtZSBsZW5ndGgiCisgICAgZ2xvYmFsIF9pZG1hcEwKKyAgICBpZiBub3QgX2lkbWFwTDoKKyAgICAgICAgX2lkbWFwTCA9IGxpc3QoX2lkbWFwKQorICAgIEwgPSBfaWRtYXBMWzpdCisgICAgZnJvbXN0ciA9IG1hcChvcmQsIGZyb21zdHIpCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGZyb21zdHIpKToKKyAgICAgICAgTFtmcm9tc3RyW2ldXSA9IHRvc3RyW2ldCisgICAgcmV0dXJuIGpvaW4oTCwgIiIpCisKKyMgU3Vic3RyaW5nIHJlcGxhY2VtZW50IChnbG9iYWwpCitkZWYgcmVwbGFjZShzLCBvbGQsIG5ldywgbWF4c3BsaXQ9MCk6CisgICAgIiIicmVwbGFjZSAoc3RyLCBvbGQsIG5ld1ssIG1heHNwbGl0XSkgLT4gc3RyaW5nCisKKyAgICBSZXR1cm4gYSBjb3B5IG9mIHN0cmluZyBzdHIgd2l0aCBhbGwgb2NjdXJyZW5jZXMgb2Ygc3Vic3RyaW5nCisgICAgb2xkIHJlcGxhY2VkIGJ5IG5ldy4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IG1heHNwbGl0IGlzCisgICAgZ2l2ZW4sIG9ubHkgdGhlIGZpcnN0IG1heHNwbGl0IG9jY3VycmVuY2VzIGFyZSByZXBsYWNlZC4KKworICAgICIiIgorICAgIHJldHVybiBzLnJlcGxhY2Uob2xkLCBuZXcsIG1heHNwbGl0KQorCisKKyMgWFhYOiB0cmFuc2l0aW9uYWwKKyMKKyMgSWYgc3RyaW5nIG9iamVjdHMgZG8gbm90IGhhdmUgbWV0aG9kcywgdGhlbiB3ZSBuZWVkIHRvIHVzZSB0aGUgb2xkIHN0cmluZy5weQorIyBsaWJyYXJ5LCB3aGljaCB1c2VzIHN0cm9wIGZvciBtYW55IG1vcmUgdGhpbmdzIHRoYW4ganVzdCB0aGUgZmV3IG91dGxpbmVkCisjIGJlbG93LgordHJ5OgorICAgICcnLnVwcGVyCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgZnJvbSBzdHJpbmdvbGQgaW1wb3J0ICoKKworIyBUcnkgaW1wb3J0aW5nIG9wdGlvbmFsIGJ1aWx0LWluIG1vZHVsZSAic3Ryb3AiIC0tIGlmIGl0IGV4aXN0cywKKyMgaXQgcmVkZWZpbmVzIHNvbWUgc3RyaW5nIG9wZXJhdGlvbnMgdGhhdCBhcmUgMTAwLTEwMDAgdGltZXMgZmFzdGVyLgorIyBJdCBhbHNvIGRlZmluZXMgdmFsdWVzIGZvciB3aGl0ZXNwYWNlLCBsb3dlcmNhc2UgYW5kIHVwcGVyY2FzZQorIyB0aGF0IG1hdGNoIDxjdHlwZS5oPidzIGRlZmluaXRpb25zLgorCit0cnk6CisgICAgZnJvbSBzdHJvcCBpbXBvcnQgbWFrZXRyYW5zLCBsb3dlcmNhc2UsIHVwcGVyY2FzZSwgd2hpdGVzcGFjZQorICAgIGxldHRlcnMgPSBsb3dlcmNhc2UgKyB1cHBlcmNhc2UKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc2UgdGhlIG9yaWdpbmFsIHZlcnNpb25zCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZ29sZC5weWMgYi9saWIvcHl0aG9uMi43L3N0cmluZ29sZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzZTZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZ29sZC5weW8gYi9saWIvcHl0aG9uMi43L3N0cmluZ29sZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzZTZhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5nb2xkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3N0cmluZ3ByZXAucHkgYi9saWIvcHl0aG9uMi43L3N0cmluZ3ByZXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0OWRkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5ncHJlcC5weQpAQCAtMCwwICsxLDI3MiBAQAorIyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IG1rc3RyaW5ncHJlcC5weS4gRE8gTk9UIEVESVQuCisiIiJMaWJyYXJ5IHRoYXQgZXhwb3NlcyB2YXJpb3VzIHRhYmxlcyBmb3VuZCBpbiB0aGUgU3RyaW5nUHJlcCBSRkMgMzQ1NC4KKworVGhlcmUgYXJlIHR3byBraW5kcyBvZiB0YWJsZXM6IHNldHMsIGZvciB3aGljaCBhIG1lbWJlciB0ZXN0IGlzIHByb3ZpZGVkLAorYW5kIG1hcHBpbmdzLCBmb3Igd2hpY2ggYSBtYXBwaW5nIGZ1bmN0aW9uIGlzIHByb3ZpZGVkLgorIiIiCisKK2Zyb20gdW5pY29kZWRhdGEgaW1wb3J0IHVjZF8zXzJfMCBhcyB1bmljb2RlZGF0YQorCithc3NlcnQgdW5pY29kZWRhdGEudW5pZGF0YV92ZXJzaW9uID09ICczLjIuMCcKKworZGVmIGluX3RhYmxlX2ExKGNvZGUpOgorICAgIGlmIHVuaWNvZGVkYXRhLmNhdGVnb3J5KGNvZGUpICE9ICdDbic6IHJldHVybiBGYWxzZQorICAgIGMgPSBvcmQoY29kZSkKKyAgICBpZiAweEZERDAgPD0gYyA8IDB4RkRGMDogcmV0dXJuIEZhbHNlCisgICAgcmV0dXJuIChjICYgMHhGRkZGKSBub3QgaW4gKDB4RkZGRSwgMHhGRkZGKQorCisKK2IxX3NldCA9IHNldChbMTczLCA4NDcsIDYxNTAsIDYxNTUsIDYxNTYsIDYxNTcsIDgyMDMsIDgyMDQsIDgyMDUsIDgyODgsIDY1Mjc5XSArIHJhbmdlKDY1MDI0LDY1MDQwKSkKK2RlZiBpbl90YWJsZV9iMShjb2RlKToKKyAgICByZXR1cm4gb3JkKGNvZGUpIGluIGIxX3NldAorCisKK2IzX2V4Y2VwdGlvbnMgPSB7CisweGI1OnUnXHUwM2JjJywgMHhkZjp1J3NzJywgMHgxMzA6dSdpXHUwMzA3JywgMHgxNDk6dSdcdTAyYmNuJywKKzB4MTdmOnUncycsIDB4MWYwOnUnalx1MDMwYycsIDB4MzQ1OnUnXHUwM2I5JywgMHgzN2E6dScgXHUwM2I5JywKKzB4MzkwOnUnXHUwM2I5XHUwMzA4XHUwMzAxJywgMHgzYjA6dSdcdTAzYzVcdTAzMDhcdTAzMDEnLCAweDNjMjp1J1x1MDNjMycsIDB4M2QwOnUnXHUwM2IyJywKKzB4M2QxOnUnXHUwM2I4JywgMHgzZDI6dSdcdTAzYzUnLCAweDNkMzp1J1x1MDNjZCcsIDB4M2Q0OnUnXHUwM2NiJywKKzB4M2Q1OnUnXHUwM2M2JywgMHgzZDY6dSdcdTAzYzAnLCAweDNmMDp1J1x1MDNiYScsIDB4M2YxOnUnXHUwM2MxJywKKzB4M2YyOnUnXHUwM2MzJywgMHgzZjU6dSdcdTAzYjUnLCAweDU4Nzp1J1x1MDU2NVx1MDU4MicsIDB4MWU5Njp1J2hcdTAzMzEnLAorMHgxZTk3OnUndFx1MDMwOCcsIDB4MWU5ODp1J3dcdTAzMGEnLCAweDFlOTk6dSd5XHUwMzBhJywgMHgxZTlhOnUnYVx1MDJiZScsCisweDFlOWI6dSdcdTFlNjEnLCAweDFmNTA6dSdcdTAzYzVcdTAzMTMnLCAweDFmNTI6dSdcdTAzYzVcdTAzMTNcdTAzMDAnLCAweDFmNTQ6dSdcdTAzYzVcdTAzMTNcdTAzMDEnLAorMHgxZjU2OnUnXHUwM2M1XHUwMzEzXHUwMzQyJywgMHgxZjgwOnUnXHUxZjAwXHUwM2I5JywgMHgxZjgxOnUnXHUxZjAxXHUwM2I5JywgMHgxZjgyOnUnXHUxZjAyXHUwM2I5JywKKzB4MWY4Mzp1J1x1MWYwM1x1MDNiOScsIDB4MWY4NDp1J1x1MWYwNFx1MDNiOScsIDB4MWY4NTp1J1x1MWYwNVx1MDNiOScsIDB4MWY4Njp1J1x1MWYwNlx1MDNiOScsCisweDFmODc6dSdcdTFmMDdcdTAzYjknLCAweDFmODg6dSdcdTFmMDBcdTAzYjknLCAweDFmODk6dSdcdTFmMDFcdTAzYjknLCAweDFmOGE6dSdcdTFmMDJcdTAzYjknLAorMHgxZjhiOnUnXHUxZjAzXHUwM2I5JywgMHgxZjhjOnUnXHUxZjA0XHUwM2I5JywgMHgxZjhkOnUnXHUxZjA1XHUwM2I5JywgMHgxZjhlOnUnXHUxZjA2XHUwM2I5JywKKzB4MWY4Zjp1J1x1MWYwN1x1MDNiOScsIDB4MWY5MDp1J1x1MWYyMFx1MDNiOScsIDB4MWY5MTp1J1x1MWYyMVx1MDNiOScsIDB4MWY5Mjp1J1x1MWYyMlx1MDNiOScsCisweDFmOTM6dSdcdTFmMjNcdTAzYjknLCAweDFmOTQ6dSdcdTFmMjRcdTAzYjknLCAweDFmOTU6dSdcdTFmMjVcdTAzYjknLCAweDFmOTY6dSdcdTFmMjZcdTAzYjknLAorMHgxZjk3OnUnXHUxZjI3XHUwM2I5JywgMHgxZjk4OnUnXHUxZjIwXHUwM2I5JywgMHgxZjk5OnUnXHUxZjIxXHUwM2I5JywgMHgxZjlhOnUnXHUxZjIyXHUwM2I5JywKKzB4MWY5Yjp1J1x1MWYyM1x1MDNiOScsIDB4MWY5Yzp1J1x1MWYyNFx1MDNiOScsIDB4MWY5ZDp1J1x1MWYyNVx1MDNiOScsIDB4MWY5ZTp1J1x1MWYyNlx1MDNiOScsCisweDFmOWY6dSdcdTFmMjdcdTAzYjknLCAweDFmYTA6dSdcdTFmNjBcdTAzYjknLCAweDFmYTE6dSdcdTFmNjFcdTAzYjknLCAweDFmYTI6dSdcdTFmNjJcdTAzYjknLAorMHgxZmEzOnUnXHUxZjYzXHUwM2I5JywgMHgxZmE0OnUnXHUxZjY0XHUwM2I5JywgMHgxZmE1OnUnXHUxZjY1XHUwM2I5JywgMHgxZmE2OnUnXHUxZjY2XHUwM2I5JywKKzB4MWZhNzp1J1x1MWY2N1x1MDNiOScsIDB4MWZhODp1J1x1MWY2MFx1MDNiOScsIDB4MWZhOTp1J1x1MWY2MVx1MDNiOScsIDB4MWZhYTp1J1x1MWY2Mlx1MDNiOScsCisweDFmYWI6dSdcdTFmNjNcdTAzYjknLCAweDFmYWM6dSdcdTFmNjRcdTAzYjknLCAweDFmYWQ6dSdcdTFmNjVcdTAzYjknLCAweDFmYWU6dSdcdTFmNjZcdTAzYjknLAorMHgxZmFmOnUnXHUxZjY3XHUwM2I5JywgMHgxZmIyOnUnXHUxZjcwXHUwM2I5JywgMHgxZmIzOnUnXHUwM2IxXHUwM2I5JywgMHgxZmI0OnUnXHUwM2FjXHUwM2I5JywKKzB4MWZiNjp1J1x1MDNiMVx1MDM0MicsIDB4MWZiNzp1J1x1MDNiMVx1MDM0Mlx1MDNiOScsIDB4MWZiYzp1J1x1MDNiMVx1MDNiOScsIDB4MWZiZTp1J1x1MDNiOScsCisweDFmYzI6dSdcdTFmNzRcdTAzYjknLCAweDFmYzM6dSdcdTAzYjdcdTAzYjknLCAweDFmYzQ6dSdcdTAzYWVcdTAzYjknLCAweDFmYzY6dSdcdTAzYjdcdTAzNDInLAorMHgxZmM3OnUnXHUwM2I3XHUwMzQyXHUwM2I5JywgMHgxZmNjOnUnXHUwM2I3XHUwM2I5JywgMHgxZmQyOnUnXHUwM2I5XHUwMzA4XHUwMzAwJywgMHgxZmQzOnUnXHUwM2I5XHUwMzA4XHUwMzAxJywKKzB4MWZkNjp1J1x1MDNiOVx1MDM0MicsIDB4MWZkNzp1J1x1MDNiOVx1MDMwOFx1MDM0MicsIDB4MWZlMjp1J1x1MDNjNVx1MDMwOFx1MDMwMCcsIDB4MWZlMzp1J1x1MDNjNVx1MDMwOFx1MDMwMScsCisweDFmZTQ6dSdcdTAzYzFcdTAzMTMnLCAweDFmZTY6dSdcdTAzYzVcdTAzNDInLCAweDFmZTc6dSdcdTAzYzVcdTAzMDhcdTAzNDInLCAweDFmZjI6dSdcdTFmN2NcdTAzYjknLAorMHgxZmYzOnUnXHUwM2M5XHUwM2I5JywgMHgxZmY0OnUnXHUwM2NlXHUwM2I5JywgMHgxZmY2OnUnXHUwM2M5XHUwMzQyJywgMHgxZmY3OnUnXHUwM2M5XHUwMzQyXHUwM2I5JywKKzB4MWZmYzp1J1x1MDNjOVx1MDNiOScsIDB4MjBhODp1J3JzJywgMHgyMTAyOnUnYycsIDB4MjEwMzp1J1x4YjBjJywKKzB4MjEwNzp1J1x1MDI1YicsIDB4MjEwOTp1J1x4YjBmJywgMHgyMTBiOnUnaCcsIDB4MjEwYzp1J2gnLAorMHgyMTBkOnUnaCcsIDB4MjExMDp1J2knLCAweDIxMTE6dSdpJywgMHgyMTEyOnUnbCcsCisweDIxMTU6dSduJywgMHgyMTE2OnUnbm8nLCAweDIxMTk6dSdwJywgMHgyMTFhOnUncScsCisweDIxMWI6dSdyJywgMHgyMTFjOnUncicsIDB4MjExZDp1J3InLCAweDIxMjA6dSdzbScsCisweDIxMjE6dSd0ZWwnLCAweDIxMjI6dSd0bScsIDB4MjEyNDp1J3onLCAweDIxMjg6dSd6JywKKzB4MjEyYzp1J2InLCAweDIxMmQ6dSdjJywgMHgyMTMwOnUnZScsIDB4MjEzMTp1J2YnLAorMHgyMTMzOnUnbScsIDB4MjEzZTp1J1x1MDNiMycsIDB4MjEzZjp1J1x1MDNjMCcsIDB4MjE0NTp1J2QnLAorMHgzMzcxOnUnaHBhJywgMHgzMzczOnUnYXUnLCAweDMzNzU6dSdvdicsIDB4MzM4MDp1J3BhJywKKzB4MzM4MTp1J25hJywgMHgzMzgyOnUnXHUwM2JjYScsIDB4MzM4Mzp1J21hJywgMHgzMzg0OnUna2EnLAorMHgzMzg1OnUna2InLCAweDMzODY6dSdtYicsIDB4MzM4Nzp1J2diJywgMHgzMzhhOnUncGYnLAorMHgzMzhiOnUnbmYnLCAweDMzOGM6dSdcdTAzYmNmJywgMHgzMzkwOnUnaHonLCAweDMzOTE6dSdraHonLAorMHgzMzkyOnUnbWh6JywgMHgzMzkzOnUnZ2h6JywgMHgzMzk0OnUndGh6JywgMHgzM2E5OnUncGEnLAorMHgzM2FhOnUna3BhJywgMHgzM2FiOnUnbXBhJywgMHgzM2FjOnUnZ3BhJywgMHgzM2I0OnUncHYnLAorMHgzM2I1OnUnbnYnLCAweDMzYjY6dSdcdTAzYmN2JywgMHgzM2I3OnUnbXYnLCAweDMzYjg6dSdrdicsCisweDMzYjk6dSdtdicsIDB4MzNiYTp1J3B3JywgMHgzM2JiOnUnbncnLCAweDMzYmM6dSdcdTAzYmN3JywKKzB4MzNiZDp1J213JywgMHgzM2JlOnUna3cnLCAweDMzYmY6dSdtdycsIDB4MzNjMDp1J2tcdTAzYzknLAorMHgzM2MxOnUnbVx1MDNjOScsIDB4MzNjMzp1J2JxJywgMHgzM2M2OnUnY1x1MjIxNWtnJywgMHgzM2M3OnUnY28uJywKKzB4MzNjODp1J2RiJywgMHgzM2M5OnUnZ3knLCAweDMzY2I6dSdocCcsIDB4MzNjZDp1J2trJywKKzB4MzNjZTp1J2ttJywgMHgzM2Q3OnUncGgnLCAweDMzZDk6dSdwcG0nLCAweDMzZGE6dSdwcicsCisweDMzZGM6dSdzdicsIDB4MzNkZDp1J3diJywgMHhmYjAwOnUnZmYnLCAweGZiMDE6dSdmaScsCisweGZiMDI6dSdmbCcsIDB4ZmIwMzp1J2ZmaScsIDB4ZmIwNDp1J2ZmbCcsIDB4ZmIwNTp1J3N0JywKKzB4ZmIwNjp1J3N0JywgMHhmYjEzOnUnXHUwNTc0XHUwNTc2JywgMHhmYjE0OnUnXHUwNTc0XHUwNTY1JywgMHhmYjE1OnUnXHUwNTc0XHUwNTZiJywKKzB4ZmIxNjp1J1x1MDU3ZVx1MDU3NicsIDB4ZmIxNzp1J1x1MDU3NFx1MDU2ZCcsIDB4MWQ0MDA6dSdhJywgMHgxZDQwMTp1J2InLAorMHgxZDQwMjp1J2MnLCAweDFkNDAzOnUnZCcsIDB4MWQ0MDQ6dSdlJywgMHgxZDQwNTp1J2YnLAorMHgxZDQwNjp1J2cnLCAweDFkNDA3OnUnaCcsIDB4MWQ0MDg6dSdpJywgMHgxZDQwOTp1J2onLAorMHgxZDQwYTp1J2snLCAweDFkNDBiOnUnbCcsIDB4MWQ0MGM6dSdtJywgMHgxZDQwZDp1J24nLAorMHgxZDQwZTp1J28nLCAweDFkNDBmOnUncCcsIDB4MWQ0MTA6dSdxJywgMHgxZDQxMTp1J3InLAorMHgxZDQxMjp1J3MnLCAweDFkNDEzOnUndCcsIDB4MWQ0MTQ6dSd1JywgMHgxZDQxNTp1J3YnLAorMHgxZDQxNjp1J3cnLCAweDFkNDE3OnUneCcsIDB4MWQ0MTg6dSd5JywgMHgxZDQxOTp1J3onLAorMHgxZDQzNDp1J2EnLCAweDFkNDM1OnUnYicsIDB4MWQ0MzY6dSdjJywgMHgxZDQzNzp1J2QnLAorMHgxZDQzODp1J2UnLCAweDFkNDM5OnUnZicsIDB4MWQ0M2E6dSdnJywgMHgxZDQzYjp1J2gnLAorMHgxZDQzYzp1J2knLCAweDFkNDNkOnUnaicsIDB4MWQ0M2U6dSdrJywgMHgxZDQzZjp1J2wnLAorMHgxZDQ0MDp1J20nLCAweDFkNDQxOnUnbicsIDB4MWQ0NDI6dSdvJywgMHgxZDQ0Mzp1J3AnLAorMHgxZDQ0NDp1J3EnLCAweDFkNDQ1OnUncicsIDB4MWQ0NDY6dSdzJywgMHgxZDQ0Nzp1J3QnLAorMHgxZDQ0ODp1J3UnLCAweDFkNDQ5OnUndicsIDB4MWQ0NGE6dSd3JywgMHgxZDQ0Yjp1J3gnLAorMHgxZDQ0Yzp1J3knLCAweDFkNDRkOnUneicsIDB4MWQ0Njg6dSdhJywgMHgxZDQ2OTp1J2InLAorMHgxZDQ2YTp1J2MnLCAweDFkNDZiOnUnZCcsIDB4MWQ0NmM6dSdlJywgMHgxZDQ2ZDp1J2YnLAorMHgxZDQ2ZTp1J2cnLCAweDFkNDZmOnUnaCcsIDB4MWQ0NzA6dSdpJywgMHgxZDQ3MTp1J2onLAorMHgxZDQ3Mjp1J2snLCAweDFkNDczOnUnbCcsIDB4MWQ0NzQ6dSdtJywgMHgxZDQ3NTp1J24nLAorMHgxZDQ3Njp1J28nLCAweDFkNDc3OnUncCcsIDB4MWQ0Nzg6dSdxJywgMHgxZDQ3OTp1J3InLAorMHgxZDQ3YTp1J3MnLCAweDFkNDdiOnUndCcsIDB4MWQ0N2M6dSd1JywgMHgxZDQ3ZDp1J3YnLAorMHgxZDQ3ZTp1J3cnLCAweDFkNDdmOnUneCcsIDB4MWQ0ODA6dSd5JywgMHgxZDQ4MTp1J3onLAorMHgxZDQ5Yzp1J2EnLCAweDFkNDllOnUnYycsIDB4MWQ0OWY6dSdkJywgMHgxZDRhMjp1J2cnLAorMHgxZDRhNTp1J2onLCAweDFkNGE2OnUnaycsIDB4MWQ0YTk6dSduJywgMHgxZDRhYTp1J28nLAorMHgxZDRhYjp1J3AnLCAweDFkNGFjOnUncScsIDB4MWQ0YWU6dSdzJywgMHgxZDRhZjp1J3QnLAorMHgxZDRiMDp1J3UnLCAweDFkNGIxOnUndicsIDB4MWQ0YjI6dSd3JywgMHgxZDRiMzp1J3gnLAorMHgxZDRiNDp1J3knLCAweDFkNGI1OnUneicsIDB4MWQ0ZDA6dSdhJywgMHgxZDRkMTp1J2InLAorMHgxZDRkMjp1J2MnLCAweDFkNGQzOnUnZCcsIDB4MWQ0ZDQ6dSdlJywgMHgxZDRkNTp1J2YnLAorMHgxZDRkNjp1J2cnLCAweDFkNGQ3OnUnaCcsIDB4MWQ0ZDg6dSdpJywgMHgxZDRkOTp1J2onLAorMHgxZDRkYTp1J2snLCAweDFkNGRiOnUnbCcsIDB4MWQ0ZGM6dSdtJywgMHgxZDRkZDp1J24nLAorMHgxZDRkZTp1J28nLCAweDFkNGRmOnUncCcsIDB4MWQ0ZTA6dSdxJywgMHgxZDRlMTp1J3InLAorMHgxZDRlMjp1J3MnLCAweDFkNGUzOnUndCcsIDB4MWQ0ZTQ6dSd1JywgMHgxZDRlNTp1J3YnLAorMHgxZDRlNjp1J3cnLCAweDFkNGU3OnUneCcsIDB4MWQ0ZTg6dSd5JywgMHgxZDRlOTp1J3onLAorMHgxZDUwNDp1J2EnLCAweDFkNTA1OnUnYicsIDB4MWQ1MDc6dSdkJywgMHgxZDUwODp1J2UnLAorMHgxZDUwOTp1J2YnLCAweDFkNTBhOnUnZycsIDB4MWQ1MGQ6dSdqJywgMHgxZDUwZTp1J2snLAorMHgxZDUwZjp1J2wnLCAweDFkNTEwOnUnbScsIDB4MWQ1MTE6dSduJywgMHgxZDUxMjp1J28nLAorMHgxZDUxMzp1J3AnLCAweDFkNTE0OnUncScsIDB4MWQ1MTY6dSdzJywgMHgxZDUxNzp1J3QnLAorMHgxZDUxODp1J3UnLCAweDFkNTE5OnUndicsIDB4MWQ1MWE6dSd3JywgMHgxZDUxYjp1J3gnLAorMHgxZDUxYzp1J3knLCAweDFkNTM4OnUnYScsIDB4MWQ1Mzk6dSdiJywgMHgxZDUzYjp1J2QnLAorMHgxZDUzYzp1J2UnLCAweDFkNTNkOnUnZicsIDB4MWQ1M2U6dSdnJywgMHgxZDU0MDp1J2knLAorMHgxZDU0MTp1J2onLCAweDFkNTQyOnUnaycsIDB4MWQ1NDM6dSdsJywgMHgxZDU0NDp1J20nLAorMHgxZDU0Njp1J28nLCAweDFkNTRhOnUncycsIDB4MWQ1NGI6dSd0JywgMHgxZDU0Yzp1J3UnLAorMHgxZDU0ZDp1J3YnLCAweDFkNTRlOnUndycsIDB4MWQ1NGY6dSd4JywgMHgxZDU1MDp1J3knLAorMHgxZDU2Yzp1J2EnLCAweDFkNTZkOnUnYicsIDB4MWQ1NmU6dSdjJywgMHgxZDU2Zjp1J2QnLAorMHgxZDU3MDp1J2UnLCAweDFkNTcxOnUnZicsIDB4MWQ1NzI6dSdnJywgMHgxZDU3Mzp1J2gnLAorMHgxZDU3NDp1J2knLCAweDFkNTc1OnUnaicsIDB4MWQ1NzY6dSdrJywgMHgxZDU3Nzp1J2wnLAorMHgxZDU3ODp1J20nLCAweDFkNTc5OnUnbicsIDB4MWQ1N2E6dSdvJywgMHgxZDU3Yjp1J3AnLAorMHgxZDU3Yzp1J3EnLCAweDFkNTdkOnUncicsIDB4MWQ1N2U6dSdzJywgMHgxZDU3Zjp1J3QnLAorMHgxZDU4MDp1J3UnLCAweDFkNTgxOnUndicsIDB4MWQ1ODI6dSd3JywgMHgxZDU4Mzp1J3gnLAorMHgxZDU4NDp1J3knLCAweDFkNTg1OnUneicsIDB4MWQ1YTA6dSdhJywgMHgxZDVhMTp1J2InLAorMHgxZDVhMjp1J2MnLCAweDFkNWEzOnUnZCcsIDB4MWQ1YTQ6dSdlJywgMHgxZDVhNTp1J2YnLAorMHgxZDVhNjp1J2cnLCAweDFkNWE3OnUnaCcsIDB4MWQ1YTg6dSdpJywgMHgxZDVhOTp1J2onLAorMHgxZDVhYTp1J2snLCAweDFkNWFiOnUnbCcsIDB4MWQ1YWM6dSdtJywgMHgxZDVhZDp1J24nLAorMHgxZDVhZTp1J28nLCAweDFkNWFmOnUncCcsIDB4MWQ1YjA6dSdxJywgMHgxZDViMTp1J3InLAorMHgxZDViMjp1J3MnLCAweDFkNWIzOnUndCcsIDB4MWQ1YjQ6dSd1JywgMHgxZDViNTp1J3YnLAorMHgxZDViNjp1J3cnLCAweDFkNWI3OnUneCcsIDB4MWQ1Yjg6dSd5JywgMHgxZDViOTp1J3onLAorMHgxZDVkNDp1J2EnLCAweDFkNWQ1OnUnYicsIDB4MWQ1ZDY6dSdjJywgMHgxZDVkNzp1J2QnLAorMHgxZDVkODp1J2UnLCAweDFkNWQ5OnUnZicsIDB4MWQ1ZGE6dSdnJywgMHgxZDVkYjp1J2gnLAorMHgxZDVkYzp1J2knLCAweDFkNWRkOnUnaicsIDB4MWQ1ZGU6dSdrJywgMHgxZDVkZjp1J2wnLAorMHgxZDVlMDp1J20nLCAweDFkNWUxOnUnbicsIDB4MWQ1ZTI6dSdvJywgMHgxZDVlMzp1J3AnLAorMHgxZDVlNDp1J3EnLCAweDFkNWU1OnUncicsIDB4MWQ1ZTY6dSdzJywgMHgxZDVlNzp1J3QnLAorMHgxZDVlODp1J3UnLCAweDFkNWU5OnUndicsIDB4MWQ1ZWE6dSd3JywgMHgxZDVlYjp1J3gnLAorMHgxZDVlYzp1J3knLCAweDFkNWVkOnUneicsIDB4MWQ2MDg6dSdhJywgMHgxZDYwOTp1J2InLAorMHgxZDYwYTp1J2MnLCAweDFkNjBiOnUnZCcsIDB4MWQ2MGM6dSdlJywgMHgxZDYwZDp1J2YnLAorMHgxZDYwZTp1J2cnLCAweDFkNjBmOnUnaCcsIDB4MWQ2MTA6dSdpJywgMHgxZDYxMTp1J2onLAorMHgxZDYxMjp1J2snLCAweDFkNjEzOnUnbCcsIDB4MWQ2MTQ6dSdtJywgMHgxZDYxNTp1J24nLAorMHgxZDYxNjp1J28nLCAweDFkNjE3OnUncCcsIDB4MWQ2MTg6dSdxJywgMHgxZDYxOTp1J3InLAorMHgxZDYxYTp1J3MnLCAweDFkNjFiOnUndCcsIDB4MWQ2MWM6dSd1JywgMHgxZDYxZDp1J3YnLAorMHgxZDYxZTp1J3cnLCAweDFkNjFmOnUneCcsIDB4MWQ2MjA6dSd5JywgMHgxZDYyMTp1J3onLAorMHgxZDYzYzp1J2EnLCAweDFkNjNkOnUnYicsIDB4MWQ2M2U6dSdjJywgMHgxZDYzZjp1J2QnLAorMHgxZDY0MDp1J2UnLCAweDFkNjQxOnUnZicsIDB4MWQ2NDI6dSdnJywgMHgxZDY0Mzp1J2gnLAorMHgxZDY0NDp1J2knLCAweDFkNjQ1OnUnaicsIDB4MWQ2NDY6dSdrJywgMHgxZDY0Nzp1J2wnLAorMHgxZDY0ODp1J20nLCAweDFkNjQ5OnUnbicsIDB4MWQ2NGE6dSdvJywgMHgxZDY0Yjp1J3AnLAorMHgxZDY0Yzp1J3EnLCAweDFkNjRkOnUncicsIDB4MWQ2NGU6dSdzJywgMHgxZDY0Zjp1J3QnLAorMHgxZDY1MDp1J3UnLCAweDFkNjUxOnUndicsIDB4MWQ2NTI6dSd3JywgMHgxZDY1Mzp1J3gnLAorMHgxZDY1NDp1J3knLCAweDFkNjU1OnUneicsIDB4MWQ2NzA6dSdhJywgMHgxZDY3MTp1J2InLAorMHgxZDY3Mjp1J2MnLCAweDFkNjczOnUnZCcsIDB4MWQ2NzQ6dSdlJywgMHgxZDY3NTp1J2YnLAorMHgxZDY3Njp1J2cnLCAweDFkNjc3OnUnaCcsIDB4MWQ2Nzg6dSdpJywgMHgxZDY3OTp1J2onLAorMHgxZDY3YTp1J2snLCAweDFkNjdiOnUnbCcsIDB4MWQ2N2M6dSdtJywgMHgxZDY3ZDp1J24nLAorMHgxZDY3ZTp1J28nLCAweDFkNjdmOnUncCcsIDB4MWQ2ODA6dSdxJywgMHgxZDY4MTp1J3InLAorMHgxZDY4Mjp1J3MnLCAweDFkNjgzOnUndCcsIDB4MWQ2ODQ6dSd1JywgMHgxZDY4NTp1J3YnLAorMHgxZDY4Njp1J3cnLCAweDFkNjg3OnUneCcsIDB4MWQ2ODg6dSd5JywgMHgxZDY4OTp1J3onLAorMHgxZDZhODp1J1x1MDNiMScsIDB4MWQ2YTk6dSdcdTAzYjInLCAweDFkNmFhOnUnXHUwM2IzJywgMHgxZDZhYjp1J1x1MDNiNCcsCisweDFkNmFjOnUnXHUwM2I1JywgMHgxZDZhZDp1J1x1MDNiNicsIDB4MWQ2YWU6dSdcdTAzYjcnLCAweDFkNmFmOnUnXHUwM2I4JywKKzB4MWQ2YjA6dSdcdTAzYjknLCAweDFkNmIxOnUnXHUwM2JhJywgMHgxZDZiMjp1J1x1MDNiYicsIDB4MWQ2YjM6dSdcdTAzYmMnLAorMHgxZDZiNDp1J1x1MDNiZCcsIDB4MWQ2YjU6dSdcdTAzYmUnLCAweDFkNmI2OnUnXHUwM2JmJywgMHgxZDZiNzp1J1x1MDNjMCcsCisweDFkNmI4OnUnXHUwM2MxJywgMHgxZDZiOTp1J1x1MDNiOCcsIDB4MWQ2YmE6dSdcdTAzYzMnLCAweDFkNmJiOnUnXHUwM2M0JywKKzB4MWQ2YmM6dSdcdTAzYzUnLCAweDFkNmJkOnUnXHUwM2M2JywgMHgxZDZiZTp1J1x1MDNjNycsIDB4MWQ2YmY6dSdcdTAzYzgnLAorMHgxZDZjMDp1J1x1MDNjOScsIDB4MWQ2ZDM6dSdcdTAzYzMnLCAweDFkNmUyOnUnXHUwM2IxJywgMHgxZDZlMzp1J1x1MDNiMicsCisweDFkNmU0OnUnXHUwM2IzJywgMHgxZDZlNTp1J1x1MDNiNCcsIDB4MWQ2ZTY6dSdcdTAzYjUnLCAweDFkNmU3OnUnXHUwM2I2JywKKzB4MWQ2ZTg6dSdcdTAzYjcnLCAweDFkNmU5OnUnXHUwM2I4JywgMHgxZDZlYTp1J1x1MDNiOScsIDB4MWQ2ZWI6dSdcdTAzYmEnLAorMHgxZDZlYzp1J1x1MDNiYicsIDB4MWQ2ZWQ6dSdcdTAzYmMnLCAweDFkNmVlOnUnXHUwM2JkJywgMHgxZDZlZjp1J1x1MDNiZScsCisweDFkNmYwOnUnXHUwM2JmJywgMHgxZDZmMTp1J1x1MDNjMCcsIDB4MWQ2ZjI6dSdcdTAzYzEnLCAweDFkNmYzOnUnXHUwM2I4JywKKzB4MWQ2ZjQ6dSdcdTAzYzMnLCAweDFkNmY1OnUnXHUwM2M0JywgMHgxZDZmNjp1J1x1MDNjNScsIDB4MWQ2Zjc6dSdcdTAzYzYnLAorMHgxZDZmODp1J1x1MDNjNycsIDB4MWQ2Zjk6dSdcdTAzYzgnLCAweDFkNmZhOnUnXHUwM2M5JywgMHgxZDcwZDp1J1x1MDNjMycsCisweDFkNzFjOnUnXHUwM2IxJywgMHgxZDcxZDp1J1x1MDNiMicsIDB4MWQ3MWU6dSdcdTAzYjMnLCAweDFkNzFmOnUnXHUwM2I0JywKKzB4MWQ3MjA6dSdcdTAzYjUnLCAweDFkNzIxOnUnXHUwM2I2JywgMHgxZDcyMjp1J1x1MDNiNycsIDB4MWQ3MjM6dSdcdTAzYjgnLAorMHgxZDcyNDp1J1x1MDNiOScsIDB4MWQ3MjU6dSdcdTAzYmEnLCAweDFkNzI2OnUnXHUwM2JiJywgMHgxZDcyNzp1J1x1MDNiYycsCisweDFkNzI4OnUnXHUwM2JkJywgMHgxZDcyOTp1J1x1MDNiZScsIDB4MWQ3MmE6dSdcdTAzYmYnLCAweDFkNzJiOnUnXHUwM2MwJywKKzB4MWQ3MmM6dSdcdTAzYzEnLCAweDFkNzJkOnUnXHUwM2I4JywgMHgxZDcyZTp1J1x1MDNjMycsIDB4MWQ3MmY6dSdcdTAzYzQnLAorMHgxZDczMDp1J1x1MDNjNScsIDB4MWQ3MzE6dSdcdTAzYzYnLCAweDFkNzMyOnUnXHUwM2M3JywgMHgxZDczMzp1J1x1MDNjOCcsCisweDFkNzM0OnUnXHUwM2M5JywgMHgxZDc0Nzp1J1x1MDNjMycsIDB4MWQ3NTY6dSdcdTAzYjEnLCAweDFkNzU3OnUnXHUwM2IyJywKKzB4MWQ3NTg6dSdcdTAzYjMnLCAweDFkNzU5OnUnXHUwM2I0JywgMHgxZDc1YTp1J1x1MDNiNScsIDB4MWQ3NWI6dSdcdTAzYjYnLAorMHgxZDc1Yzp1J1x1MDNiNycsIDB4MWQ3NWQ6dSdcdTAzYjgnLCAweDFkNzVlOnUnXHUwM2I5JywgMHgxZDc1Zjp1J1x1MDNiYScsCisweDFkNzYwOnUnXHUwM2JiJywgMHgxZDc2MTp1J1x1MDNiYycsIDB4MWQ3NjI6dSdcdTAzYmQnLCAweDFkNzYzOnUnXHUwM2JlJywKKzB4MWQ3NjQ6dSdcdTAzYmYnLCAweDFkNzY1OnUnXHUwM2MwJywgMHgxZDc2Njp1J1x1MDNjMScsIDB4MWQ3Njc6dSdcdTAzYjgnLAorMHgxZDc2ODp1J1x1MDNjMycsIDB4MWQ3Njk6dSdcdTAzYzQnLCAweDFkNzZhOnUnXHUwM2M1JywgMHgxZDc2Yjp1J1x1MDNjNicsCisweDFkNzZjOnUnXHUwM2M3JywgMHgxZDc2ZDp1J1x1MDNjOCcsIDB4MWQ3NmU6dSdcdTAzYzknLCAweDFkNzgxOnUnXHUwM2MzJywKKzB4MWQ3OTA6dSdcdTAzYjEnLCAweDFkNzkxOnUnXHUwM2IyJywgMHgxZDc5Mjp1J1x1MDNiMycsIDB4MWQ3OTM6dSdcdTAzYjQnLAorMHgxZDc5NDp1J1x1MDNiNScsIDB4MWQ3OTU6dSdcdTAzYjYnLCAweDFkNzk2OnUnXHUwM2I3JywgMHgxZDc5Nzp1J1x1MDNiOCcsCisweDFkNzk4OnUnXHUwM2I5JywgMHgxZDc5OTp1J1x1MDNiYScsIDB4MWQ3OWE6dSdcdTAzYmInLCAweDFkNzliOnUnXHUwM2JjJywKKzB4MWQ3OWM6dSdcdTAzYmQnLCAweDFkNzlkOnUnXHUwM2JlJywgMHgxZDc5ZTp1J1x1MDNiZicsIDB4MWQ3OWY6dSdcdTAzYzAnLAorMHgxZDdhMDp1J1x1MDNjMScsIDB4MWQ3YTE6dSdcdTAzYjgnLCAweDFkN2EyOnUnXHUwM2MzJywgMHgxZDdhMzp1J1x1MDNjNCcsCisweDFkN2E0OnUnXHUwM2M1JywgMHgxZDdhNTp1J1x1MDNjNicsIDB4MWQ3YTY6dSdcdTAzYzcnLCAweDFkN2E3OnUnXHUwM2M4JywKKzB4MWQ3YTg6dSdcdTAzYzknLCAweDFkN2JiOnUnXHUwM2MzJywgfQorCitkZWYgbWFwX3RhYmxlX2IzKGNvZGUpOgorICAgIHIgPSBiM19leGNlcHRpb25zLmdldChvcmQoY29kZSkpCisgICAgaWYgciBpcyBub3QgTm9uZTogcmV0dXJuIHIKKyAgICByZXR1cm4gY29kZS5sb3dlcigpCisKKworZGVmIG1hcF90YWJsZV9iMihhKToKKyAgICBhbCA9IG1hcF90YWJsZV9iMyhhKQorICAgIGIgPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GS0MiLCBhbCkKKyAgICBibCA9IHUiIi5qb2luKFttYXBfdGFibGVfYjMoY2gpIGZvciBjaCBpbiBiXSkKKyAgICBjID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORktDIiwgYmwpCisgICAgaWYgYiAhPSBjOgorICAgICAgICByZXR1cm4gYworICAgIGVsc2U6CisgICAgICAgIHJldHVybiBhbAorCisKK2RlZiBpbl90YWJsZV9jMTEoY29kZSk6CisgICAgcmV0dXJuIGNvZGUgPT0gdSIgIgorCisKK2RlZiBpbl90YWJsZV9jMTIoY29kZSk6CisgICAgcmV0dXJuIHVuaWNvZGVkYXRhLmNhdGVnb3J5KGNvZGUpID09ICJacyIgYW5kIGNvZGUgIT0gdSIgIgorCitkZWYgaW5fdGFibGVfYzExX2MxMihjb2RlKToKKyAgICByZXR1cm4gdW5pY29kZWRhdGEuY2F0ZWdvcnkoY29kZSkgPT0gIlpzIgorCisKK2RlZiBpbl90YWJsZV9jMjEoY29kZSk6CisgICAgcmV0dXJuIG9yZChjb2RlKSA8IDEyOCBhbmQgdW5pY29kZWRhdGEuY2F0ZWdvcnkoY29kZSkgPT0gIkNjIgorCitjMjJfc3BlY2lhbHMgPSBzZXQoWzE3NTcsIDE4MDcsIDYxNTgsIDgyMDQsIDgyMDUsIDgyMzIsIDgyMzMsIDY1Mjc5XSArIHJhbmdlKDgyODgsODI5MikgKyByYW5nZSg4Mjk4LDgzMDQpICsgcmFuZ2UoNjU1MjksNjU1MzMpICsgcmFuZ2UoMTE5MTU1LDExOTE2MykpCitkZWYgaW5fdGFibGVfYzIyKGNvZGUpOgorICAgIGMgPSBvcmQoY29kZSkKKyAgICBpZiBjIDwgMTI4OiByZXR1cm4gRmFsc2UKKyAgICBpZiB1bmljb2RlZGF0YS5jYXRlZ29yeShjb2RlKSA9PSAiQ2MiOiByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBjIGluIGMyMl9zcGVjaWFscworCitkZWYgaW5fdGFibGVfYzIxX2MyMihjb2RlKToKKyAgICByZXR1cm4gdW5pY29kZWRhdGEuY2F0ZWdvcnkoY29kZSkgPT0gIkNjIiBvciBcCisgICAgICAgICAgIG9yZChjb2RlKSBpbiBjMjJfc3BlY2lhbHMKKworCitkZWYgaW5fdGFibGVfYzMoY29kZSk6CisgICAgcmV0dXJuIHVuaWNvZGVkYXRhLmNhdGVnb3J5KGNvZGUpID09ICJDbyIKKworCitkZWYgaW5fdGFibGVfYzQoY29kZSk6CisgICAgYyA9IG9yZChjb2RlKQorICAgIGlmIGMgPCAweEZERDA6IHJldHVybiBGYWxzZQorICAgIGlmIGMgPCAweEZERjA6IHJldHVybiBUcnVlCisgICAgcmV0dXJuIChvcmQoY29kZSkgJiAweEZGRkYpIGluICgweEZGRkUsIDB4RkZGRikKKworCitkZWYgaW5fdGFibGVfYzUoY29kZSk6CisgICAgcmV0dXJuIHVuaWNvZGVkYXRhLmNhdGVnb3J5KGNvZGUpID09ICJDcyIKKworCitjNl9zZXQgPSBzZXQocmFuZ2UoNjU1MjksNjU1MzQpKQorZGVmIGluX3RhYmxlX2M2KGNvZGUpOgorICAgIHJldHVybiBvcmQoY29kZSkgaW4gYzZfc2V0CisKKworYzdfc2V0ID0gc2V0KHJhbmdlKDEyMjcyLDEyMjg0KSkKK2RlZiBpbl90YWJsZV9jNyhjb2RlKToKKyAgICByZXR1cm4gb3JkKGNvZGUpIGluIGM3X3NldAorCisKK2M4X3NldCA9IHNldChbODMyLCA4MzMsIDgyMDYsIDgyMDddICsgcmFuZ2UoODIzNCw4MjM5KSArIHJhbmdlKDgyOTgsODMwNCkpCitkZWYgaW5fdGFibGVfYzgoY29kZSk6CisgICAgcmV0dXJuIG9yZChjb2RlKSBpbiBjOF9zZXQKKworCitjOV9zZXQgPSBzZXQoWzkxNzUwNV0gKyByYW5nZSg5MTc1MzYsOTE3NjMyKSkKK2RlZiBpbl90YWJsZV9jOShjb2RlKToKKyAgICByZXR1cm4gb3JkKGNvZGUpIGluIGM5X3NldAorCisKK2RlZiBpbl90YWJsZV9kMShjb2RlKToKKyAgICByZXR1cm4gdW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbChjb2RlKSBpbiAoIlIiLCJBTCIpCisKKworZGVmIGluX3RhYmxlX2QyKGNvZGUpOgorICAgIHJldHVybiB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKGNvZGUpID09ICJMIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdHJpbmdwcmVwLnB5YyBiL2xpYi9weXRob24yLjcvc3RyaW5ncHJlcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlODMyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5ncHJlcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdHJpbmdwcmVwLnB5byBiL2xpYi9weXRob24yLjcvc3RyaW5ncHJlcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAzMjFmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3RyaW5ncHJlcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdHJ1Y3QucHkgYi9saWIvcHl0aG9uMi43L3N0cnVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDIyMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdHJ1Y3QucHkKQEAgLTAsMCArMSwzIEBACitmcm9tIF9zdHJ1Y3QgaW1wb3J0ICoKK2Zyb20gX3N0cnVjdCBpbXBvcnQgX2NsZWFyY2FjaGUKK2Zyb20gX3N0cnVjdCBpbXBvcnQgX19kb2NfXwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdHJ1Y3QucHljIGIvbGliL3B5dGhvbjIuNy9zdHJ1Y3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWQyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0cnVjdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdHJ1Y3QucHlvIGIvbGliL3B5dGhvbjIuNy9zdHJ1Y3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMWQyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N0cnVjdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdWJwcm9jZXNzLnB5IGIvbGliL3B5dGhvbjIuNy9zdWJwcm9jZXNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwOWY5YTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N1YnByb2Nlc3MucHkKQEAgLTAsMCArMSwxNjAyIEBACisjIHN1YnByb2Nlc3MgLSBTdWJwcm9jZXNzZXMgd2l0aCBhY2Nlc3NpYmxlIEkvTyBzdHJlYW1zCisjCisjIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbW9kdWxlLCBzZWUgUEVQIDMyNC4KKyMKKyMgVGhpcyBtb2R1bGUgc2hvdWxkIHJlbWFpbiBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMiwgc2VlIFBFUCAyOTEuCisjCisjIENvcHlyaWdodCAoYykgMjAwMy0yMDA1IGJ5IFBldGVyIEFzdHJhbmQgPGFzdHJhbmRAbHlzYXRvci5saXUuc2U+CisjCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKyMgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjQvbGljZW5zZSBmb3IgbGljZW5zaW5nIGRldGFpbHMuCisKK3IiIiJzdWJwcm9jZXNzIC0gU3VicHJvY2Vzc2VzIHdpdGggYWNjZXNzaWJsZSBJL08gc3RyZWFtcworCitUaGlzIG1vZHVsZSBhbGxvd3MgeW91IHRvIHNwYXduIHByb2Nlc3NlcywgY29ubmVjdCB0byB0aGVpcgoraW5wdXQvb3V0cHV0L2Vycm9yIHBpcGVzLCBhbmQgb2J0YWluIHRoZWlyIHJldHVybiBjb2Rlcy4gIFRoaXMgbW9kdWxlCitpbnRlbmRzIHRvIHJlcGxhY2Ugc2V2ZXJhbCBvdGhlciwgb2xkZXIgbW9kdWxlcyBhbmQgZnVuY3Rpb25zLCBsaWtlOgorCitvcy5zeXN0ZW0KK29zLnNwYXduKgorb3MucG9wZW4qCitwb3BlbjIuKgorY29tbWFuZHMuKgorCitJbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIHN1YnByb2Nlc3MgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlc2UKK21vZHVsZXMgYW5kIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgYmVsb3cuCisKKworCitVc2luZyB0aGUgc3VicHJvY2VzcyBtb2R1bGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBtb2R1bGUgZGVmaW5lcyBvbmUgY2xhc3MgY2FsbGVkIFBvcGVuOgorCitjbGFzcyBQb3BlbihhcmdzLCBidWZzaXplPTAsIGV4ZWN1dGFibGU9Tm9uZSwKKyAgICAgICAgICAgIHN0ZGluPU5vbmUsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwKKyAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPUZhbHNlLCBzaGVsbD1GYWxzZSwKKyAgICAgICAgICAgIGN3ZD1Ob25lLCBlbnY9Tm9uZSwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlLAorICAgICAgICAgICAgc3RhcnR1cGluZm89Tm9uZSwgY3JlYXRpb25mbGFncz0wKToKKworCitBcmd1bWVudHMgYXJlOgorCithcmdzIHNob3VsZCBiZSBhIHN0cmluZywgb3IgYSBzZXF1ZW5jZSBvZiBwcm9ncmFtIGFyZ3VtZW50cy4gIFRoZQorcHJvZ3JhbSB0byBleGVjdXRlIGlzIG5vcm1hbGx5IHRoZSBmaXJzdCBpdGVtIGluIHRoZSBhcmdzIHNlcXVlbmNlIG9yCitzdHJpbmcsIGJ1dCBjYW4gYmUgZXhwbGljaXRseSBzZXQgYnkgdXNpbmcgdGhlIGV4ZWN1dGFibGUgYXJndW1lbnQuCisKK09uIFVOSVgsIHdpdGggc2hlbGw9RmFsc2UgKGRlZmF1bHQpOiBJbiB0aGlzIGNhc2UsIHRoZSBQb3BlbiBjbGFzcwordXNlcyBvcy5leGVjdnAoKSB0byBleGVjdXRlIHRoZSBjaGlsZCBwcm9ncmFtLiAgYXJncyBzaG91bGQgbm9ybWFsbHkKK2JlIGEgc2VxdWVuY2UuICBBIHN0cmluZyB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzZXF1ZW5jZSB3aXRoIHRoZSBzdHJpbmcKK2FzIHRoZSBvbmx5IGl0ZW0gKHRoZSBwcm9ncmFtIHRvIGV4ZWN1dGUpLgorCitPbiBVTklYLCB3aXRoIHNoZWxsPVRydWU6IElmIGFyZ3MgaXMgYSBzdHJpbmcsIGl0IHNwZWNpZmllcyB0aGUKK2NvbW1hbmQgc3RyaW5nIHRvIGV4ZWN1dGUgdGhyb3VnaCB0aGUgc2hlbGwuICBJZiBhcmdzIGlzIGEgc2VxdWVuY2UsCit0aGUgZmlyc3QgaXRlbSBzcGVjaWZpZXMgdGhlIGNvbW1hbmQgc3RyaW5nLCBhbmQgYW55IGFkZGl0aW9uYWwgaXRlbXMKK3dpbGwgYmUgdHJlYXRlZCBhcyBhZGRpdGlvbmFsIHNoZWxsIGFyZ3VtZW50cy4KKworT24gV2luZG93czogdGhlIFBvcGVuIGNsYXNzIHVzZXMgQ3JlYXRlUHJvY2VzcygpIHRvIGV4ZWN1dGUgdGhlIGNoaWxkCitwcm9ncmFtLCB3aGljaCBvcGVyYXRlcyBvbiBzdHJpbmdzLiAgSWYgYXJncyBpcyBhIHNlcXVlbmNlLCBpdCB3aWxsIGJlCitjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGxpc3QyY21kbGluZSBtZXRob2QuICBQbGVhc2Ugbm90ZSB0aGF0Citub3QgYWxsIE1TIFdpbmRvd3MgYXBwbGljYXRpb25zIGludGVycHJldCB0aGUgY29tbWFuZCBsaW5lIHRoZSBzYW1lCit3YXk6IFRoZSBsaXN0MmNtZGxpbmUgaXMgZGVzaWduZWQgZm9yIGFwcGxpY2F0aW9ucyB1c2luZyB0aGUgc2FtZQorcnVsZXMgYXMgdGhlIE1TIEMgcnVudGltZS4KKworYnVmc2l6ZSwgaWYgZ2l2ZW4sIGhhcyB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50Cit0byB0aGUgYnVpbHQtaW4gb3BlbigpIGZ1bmN0aW9uOiAwIG1lYW5zIHVuYnVmZmVyZWQsIDEgbWVhbnMgbGluZQorYnVmZmVyZWQsIGFueSBvdGhlciBwb3NpdGl2ZSB2YWx1ZSBtZWFucyB1c2UgYSBidWZmZXIgb2YKKyhhcHByb3hpbWF0ZWx5KSB0aGF0IHNpemUuICBBIG5lZ2F0aXZlIGJ1ZnNpemUgbWVhbnMgdG8gdXNlIHRoZSBzeXN0ZW0KK2RlZmF1bHQsIHdoaWNoIHVzdWFsbHkgbWVhbnMgZnVsbHkgYnVmZmVyZWQuICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IKK2J1ZnNpemUgaXMgMCAodW5idWZmZXJlZCkuCisKK3N0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciBzcGVjaWZ5IHRoZSBleGVjdXRlZCBwcm9ncmFtcycgc3RhbmRhcmQKK2lucHV0LCBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yIGZpbGUgaGFuZGxlcywgcmVzcGVjdGl2ZWx5LgorVmFsaWQgdmFsdWVzIGFyZSBQSVBFLCBhbiBleGlzdGluZyBmaWxlIGRlc2NyaXB0b3IgKGEgcG9zaXRpdmUKK2ludGVnZXIpLCBhbiBleGlzdGluZyBmaWxlIG9iamVjdCwgYW5kIE5vbmUuICBQSVBFIGluZGljYXRlcyB0aGF0IGEKK25ldyBwaXBlIHRvIHRoZSBjaGlsZCBzaG91bGQgYmUgY3JlYXRlZC4gIFdpdGggTm9uZSwgbm8gcmVkaXJlY3Rpb24KK3dpbGwgb2NjdXI7IHRoZSBjaGlsZCdzIGZpbGUgaGFuZGxlcyB3aWxsIGJlIGluaGVyaXRlZCBmcm9tIHRoZQorcGFyZW50LiAgQWRkaXRpb25hbGx5LCBzdGRlcnIgY2FuIGJlIFNURE9VVCwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlCitzdGRlcnIgZGF0YSBmcm9tIHRoZSBhcHBsaWNhdGlvbnMgc2hvdWxkIGJlIGNhcHR1cmVkIGludG8gdGhlIHNhbWUKK2ZpbGUgaGFuZGxlIGFzIGZvciBzdGRvdXQuCisKK0lmIHByZWV4ZWNfZm4gaXMgc2V0IHRvIGEgY2FsbGFibGUgb2JqZWN0LCB0aGlzIG9iamVjdCB3aWxsIGJlIGNhbGxlZAoraW4gdGhlIGNoaWxkIHByb2Nlc3MganVzdCBiZWZvcmUgdGhlIGNoaWxkIGlzIGV4ZWN1dGVkLgorCitJZiBjbG9zZV9mZHMgaXMgdHJ1ZSwgYWxsIGZpbGUgZGVzY3JpcHRvcnMgZXhjZXB0IDAsIDEgYW5kIDIgd2lsbCBiZQorY2xvc2VkIGJlZm9yZSB0aGUgY2hpbGQgcHJvY2VzcyBpcyBleGVjdXRlZC4KKworaWYgc2hlbGwgaXMgdHJ1ZSwgdGhlIHNwZWNpZmllZCBjb21tYW5kIHdpbGwgYmUgZXhlY3V0ZWQgdGhyb3VnaCB0aGUKK3NoZWxsLgorCitJZiBjd2QgaXMgbm90IE5vbmUsIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIGNoYW5nZWQgdG8gY3dkCitiZWZvcmUgdGhlIGNoaWxkIGlzIGV4ZWN1dGVkLgorCitJZiBlbnYgaXMgbm90IE5vbmUsIGl0IGRlZmluZXMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBmb3IgdGhlIG5ldworcHJvY2Vzcy4KKworSWYgdW5pdmVyc2FsX25ld2xpbmVzIGlzIHRydWUsIHRoZSBmaWxlIG9iamVjdHMgc3Rkb3V0IGFuZCBzdGRlcnIgYXJlCitvcGVuZWQgYXMgYSB0ZXh0IGZpbGVzLCBidXQgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9mICdcbicsCit0aGUgVW5peCBlbmQtb2YtbGluZSBjb252ZW50aW9uLCAnXHInLCB0aGUgTWFjaW50b3NoIGNvbnZlbnRpb24gb3IKKydcclxuJywgdGhlIFdpbmRvd3MgY29udmVudGlvbi4gIEFsbCBvZiB0aGVzZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbnMKK2FyZSBzZWVuIGFzICdcbicgYnkgdGhlIFB5dGhvbiBwcm9ncmFtLiAgTm90ZTogVGhpcyBmZWF0dXJlIGlzIG9ubHkKK2F2YWlsYWJsZSBpZiBQeXRob24gaXMgYnVpbHQgd2l0aCB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0ICh0aGUKK2RlZmF1bHQpLiAgQWxzbywgdGhlIG5ld2xpbmVzIGF0dHJpYnV0ZSBvZiB0aGUgZmlsZSBvYmplY3RzIHN0ZG91dCwKK3N0ZGluIGFuZCBzdGRlcnIgYXJlIG5vdCB1cGRhdGVkIGJ5IHRoZSBjb21tdW5pY2F0ZSgpIG1ldGhvZC4KKworVGhlIHN0YXJ0dXBpbmZvIGFuZCBjcmVhdGlvbmZsYWdzLCBpZiBnaXZlbiwgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCit1bmRlcmx5aW5nIENyZWF0ZVByb2Nlc3MoKSBmdW5jdGlvbi4gIFRoZXkgY2FuIHNwZWNpZnkgdGhpbmdzIHN1Y2ggYXMKK2FwcGVhcmFuY2Ugb2YgdGhlIG1haW4gd2luZG93IGFuZCBwcmlvcml0eSBmb3IgdGhlIG5ldyBwcm9jZXNzLgorKFdpbmRvd3Mgb25seSkKKworCitUaGlzIG1vZHVsZSBhbHNvIGRlZmluZXMgc29tZSBzaG9ydGN1dCBmdW5jdGlvbnM6CisKK2NhbGwoKnBvcGVuYXJncywgKiprd2FyZ3MpOgorICAgIFJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZSwgdGhlbgorICAgIHJldHVybiB0aGUgcmV0dXJuY29kZSBhdHRyaWJ1dGUuCisKKyAgICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgdGhlIFBvcGVuIGNvbnN0cnVjdG9yLiAgRXhhbXBsZToKKworICAgIHJldGNvZGUgPSBjYWxsKFsibHMiLCAiLWwiXSkKKworY2hlY2tfY2FsbCgqcG9wZW5hcmdzLCAqKmt3YXJncyk6CisgICAgUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLiAgSWYgdGhlCisgICAgZXhpdCBjb2RlIHdhcyB6ZXJvIHRoZW4gcmV0dXJuLCBvdGhlcndpc2UgcmFpc2UKKyAgICBDYWxsZWRQcm9jZXNzRXJyb3IuICBUaGUgQ2FsbGVkUHJvY2Vzc0Vycm9yIG9iamVjdCB3aWxsIGhhdmUgdGhlCisgICAgcmV0dXJuIGNvZGUgaW4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlLgorCisgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CisKKyAgICBjaGVja19jYWxsKFsibHMiLCAiLWwiXSkKKworY2hlY2tfb3V0cHV0KCpwb3BlbmFyZ3MsICoqa3dhcmdzKToKKyAgICBSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cyBhbmQgcmV0dXJuIGl0cyBvdXRwdXQgYXMgYSBieXRlIHN0cmluZy4KKworICAgIElmIHRoZSBleGl0IGNvZGUgd2FzIG5vbi16ZXJvIGl0IHJhaXNlcyBhIENhbGxlZFByb2Nlc3NFcnJvci4gIFRoZQorICAgIENhbGxlZFByb2Nlc3NFcnJvciBvYmplY3Qgd2lsbCBoYXZlIHRoZSByZXR1cm4gY29kZSBpbiB0aGUgcmV0dXJuY29kZQorICAgIGF0dHJpYnV0ZSBhbmQgb3V0cHV0IGluIHRoZSBvdXRwdXQgYXR0cmlidXRlLgorCisgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CisKKyAgICBvdXRwdXQgPSBjaGVja19vdXRwdXQoWyJscyIsICItbCIsICIvZGV2L251bGwiXSkKKworCitFeGNlcHRpb25zCistLS0tLS0tLS0tCitFeGNlcHRpb25zIHJhaXNlZCBpbiB0aGUgY2hpbGQgcHJvY2VzcywgYmVmb3JlIHRoZSBuZXcgcHJvZ3JhbSBoYXMKK3N0YXJ0ZWQgdG8gZXhlY3V0ZSwgd2lsbCBiZSByZS1yYWlzZWQgaW4gdGhlIHBhcmVudC4gIEFkZGl0aW9uYWxseSwKK3RoZSBleGNlcHRpb24gb2JqZWN0IHdpbGwgaGF2ZSBvbmUgZXh0cmEgYXR0cmlidXRlIGNhbGxlZAorJ2NoaWxkX3RyYWNlYmFjaycsIHdoaWNoIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdHJhY2ViYWNrIGluZm9ybWF0aW9uCitmcm9tIHRoZSBjaGlsZHMgcG9pbnQgb2Ygdmlldy4KKworVGhlIG1vc3QgY29tbW9uIGV4Y2VwdGlvbiByYWlzZWQgaXMgT1NFcnJvci4gIFRoaXMgb2NjdXJzLCBmb3IKK2V4YW1wbGUsIHdoZW4gdHJ5aW5nIHRvIGV4ZWN1dGUgYSBub24tZXhpc3RlbnQgZmlsZS4gIEFwcGxpY2F0aW9ucworc2hvdWxkIHByZXBhcmUgZm9yIE9TRXJyb3JzLgorCitBIFZhbHVlRXJyb3Igd2lsbCBiZSByYWlzZWQgaWYgUG9wZW4gaXMgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHMuCisKK2NoZWNrX2NhbGwoKSBhbmQgY2hlY2tfb3V0cHV0KCkgd2lsbCByYWlzZSBDYWxsZWRQcm9jZXNzRXJyb3IsIGlmIHRoZQorY2FsbGVkIHByb2Nlc3MgcmV0dXJucyBhIG5vbi16ZXJvIHJldHVybiBjb2RlLgorCisKK1NlY3VyaXR5CistLS0tLS0tLQorVW5saWtlIHNvbWUgb3RoZXIgcG9wZW4gZnVuY3Rpb25zLCB0aGlzIGltcGxlbWVudGF0aW9uIHdpbGwgbmV2ZXIgY2FsbAorL2Jpbi9zaCBpbXBsaWNpdGx5LiAgVGhpcyBtZWFucyB0aGF0IGFsbCBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgc2hlbGwKK21ldGFjaGFyYWN0ZXJzLCBjYW4gc2FmZWx5IGJlIHBhc3NlZCB0byBjaGlsZCBwcm9jZXNzZXMuCisKKworUG9wZW4gb2JqZWN0cworPT09PT09PT09PT09PQorSW5zdGFuY2VzIG9mIHRoZSBQb3BlbiBjbGFzcyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKworcG9sbCgpCisgICAgQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQorICAgIGF0dHJpYnV0ZS4KKword2FpdCgpCisgICAgV2FpdCBmb3IgY2hpbGQgcHJvY2VzcyB0byB0ZXJtaW5hdGUuICBSZXR1cm5zIHJldHVybmNvZGUgYXR0cmlidXRlLgorCitjb21tdW5pY2F0ZShpbnB1dD1Ob25lKQorICAgIEludGVyYWN0IHdpdGggcHJvY2VzczogU2VuZCBkYXRhIHRvIHN0ZGluLiAgUmVhZCBkYXRhIGZyb20gc3Rkb3V0CisgICAgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yIHByb2Nlc3MgdG8KKyAgICB0ZXJtaW5hdGUuICBUaGUgb3B0aW9uYWwgaW5wdXQgYXJndW1lbnQgc2hvdWxkIGJlIGEgc3RyaW5nIHRvIGJlCisgICAgc2VudCB0byB0aGUgY2hpbGQgcHJvY2Vzcywgb3IgTm9uZSwgaWYgbm8gZGF0YSBzaG91bGQgYmUgc2VudCB0bworICAgIHRoZSBjaGlsZC4KKworICAgIGNvbW11bmljYXRlKCkgcmV0dXJucyBhIHR1cGxlIChzdGRvdXQsIHN0ZGVycikuCisKKyAgICBOb3RlOiBUaGUgZGF0YSByZWFkIGlzIGJ1ZmZlcmVkIGluIG1lbW9yeSwgc28gZG8gbm90IHVzZSB0aGlzCisgICAgbWV0aG9kIGlmIHRoZSBkYXRhIHNpemUgaXMgbGFyZ2Ugb3IgdW5saW1pdGVkLgorCitUaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIGFsc28gYXZhaWxhYmxlOgorCitzdGRpbgorICAgIElmIHRoZSBzdGRpbiBhcmd1bWVudCBpcyBQSVBFLCB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZpbGUgb2JqZWN0CisgICAgdGhhdCBwcm92aWRlcyBpbnB1dCB0byB0aGUgY2hpbGQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgaXQgaXMgTm9uZS4KKworc3Rkb3V0CisgICAgSWYgdGhlIHN0ZG91dCBhcmd1bWVudCBpcyBQSVBFLCB0aGlzIGF0dHJpYnV0ZSBpcyBhIGZpbGUgb2JqZWN0CisgICAgdGhhdCBwcm92aWRlcyBvdXRwdXQgZnJvbSB0aGUgY2hpbGQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgaXQgaXMKKyAgICBOb25lLgorCitzdGRlcnIKKyAgICBJZiB0aGUgc3RkZXJyIGFyZ3VtZW50IGlzIFBJUEUsIHRoaXMgYXR0cmlidXRlIGlzIGZpbGUgb2JqZWN0IHRoYXQKKyAgICBwcm92aWRlcyBlcnJvciBvdXRwdXQgZnJvbSB0aGUgY2hpbGQgcHJvY2Vzcy4gIE90aGVyd2lzZSwgaXQgaXMKKyAgICBOb25lLgorCitwaWQKKyAgICBUaGUgcHJvY2VzcyBJRCBvZiB0aGUgY2hpbGQgcHJvY2Vzcy4KKworcmV0dXJuY29kZQorICAgIFRoZSBjaGlsZCByZXR1cm4gY29kZS4gIEEgTm9uZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHJvY2VzcworICAgIGhhc24ndCB0ZXJtaW5hdGVkIHlldC4gIEEgbmVnYXRpdmUgdmFsdWUgLU4gaW5kaWNhdGVzIHRoYXQgdGhlCisgICAgY2hpbGQgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsIE4gKFVOSVggb25seSkuCisKKworUmVwbGFjaW5nIG9sZGVyIGZ1bmN0aW9ucyB3aXRoIHRoZSBzdWJwcm9jZXNzIG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW4gdGhpcyBzZWN0aW9uLCAiYSA9PT4gYiIgbWVhbnMgdGhhdCBiIGNhbiBiZSB1c2VkIGFzIGEgcmVwbGFjZW1lbnQKK2ZvciBhLgorCitOb3RlOiBBbGwgZnVuY3Rpb25zIGluIHRoaXMgc2VjdGlvbiBmYWlsIChtb3JlIG9yIGxlc3MpIHNpbGVudGx5IGlmCit0aGUgZXhlY3V0ZWQgcHJvZ3JhbSBjYW5ub3QgYmUgZm91bmQ7IHRoaXMgbW9kdWxlIHJhaXNlcyBhbiBPU0Vycm9yCitleGNlcHRpb24uCisKK0luIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMsIHdlIGFzc3VtZSB0aGF0IHRoZSBzdWJwcm9jZXNzIG1vZHVsZSBpcworaW1wb3J0ZWQgd2l0aCAiZnJvbSBzdWJwcm9jZXNzIGltcG9ydCAqIi4KKworCitSZXBsYWNpbmcgL2Jpbi9zaCBzaGVsbCBiYWNrcXVvdGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorb3V0cHV0PWBteWNtZCBteWFyZ2AKKz09Pgorb3V0cHV0ID0gUG9wZW4oWyJteWNtZCIsICJteWFyZyJdLCBzdGRvdXQ9UElQRSkuY29tbXVuaWNhdGUoKVswXQorCisKK1JlcGxhY2luZyBzaGVsbCBwaXBlIGxpbmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK291dHB1dD1gZG1lc2cgfCBncmVwIGhkYWAKKz09PgorcDEgPSBQb3BlbihbImRtZXNnIl0sIHN0ZG91dD1QSVBFKQorcDIgPSBQb3BlbihbImdyZXAiLCAiaGRhIl0sIHN0ZGluPXAxLnN0ZG91dCwgc3Rkb3V0PVBJUEUpCitvdXRwdXQgPSBwMi5jb21tdW5pY2F0ZSgpWzBdCisKKworUmVwbGFjaW5nIG9zLnN5c3RlbSgpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cyA9IG9zLnN5c3RlbSgibXljbWQiICsgIiBteWFyZyIpCis9PT4KK3AgPSBQb3BlbigibXljbWQiICsgIiBteWFyZyIsIHNoZWxsPVRydWUpCitwaWQsIHN0cyA9IG9zLndhaXRwaWQocC5waWQsIDApCisKK05vdGU6CisKKyogQ2FsbGluZyB0aGUgcHJvZ3JhbSB0aHJvdWdoIHRoZSBzaGVsbCBpcyB1c3VhbGx5IG5vdCByZXF1aXJlZC4KKworKiBJdCdzIGVhc2llciB0byBsb29rIGF0IHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZSB0aGFuIHRoZQorICBleGl0c3RhdHVzLgorCitBIG1vcmUgcmVhbC13b3JsZCBleGFtcGxlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorCit0cnk6CisgICAgcmV0Y29kZSA9IGNhbGwoIm15Y21kIiArICIgbXlhcmciLCBzaGVsbD1UcnVlKQorICAgIGlmIHJldGNvZGUgPCAwOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJDaGlsZCB3YXMgdGVybWluYXRlZCBieSBzaWduYWwiLCAtcmV0Y29kZQorICAgIGVsc2U6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkNoaWxkIHJldHVybmVkIiwgcmV0Y29kZQorZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiRXhlY3V0aW9uIGZhaWxlZDoiLCBlCisKKworUmVwbGFjaW5nIG9zLnNwYXduKgorLS0tLS0tLS0tLS0tLS0tLS0tLQorUF9OT1dBSVQgZXhhbXBsZToKKworcGlkID0gb3Muc3Bhd25scChvcy5QX05PV0FJVCwgIi9iaW4vbXljbWQiLCAibXljbWQiLCAibXlhcmciKQorPT0+CitwaWQgPSBQb3BlbihbIi9iaW4vbXljbWQiLCAibXlhcmciXSkucGlkCisKKworUF9XQUlUIGV4YW1wbGU6CisKK3JldGNvZGUgPSBvcy5zcGF3bmxwKG9zLlBfV0FJVCwgIi9iaW4vbXljbWQiLCAibXljbWQiLCAibXlhcmciKQorPT0+CityZXRjb2RlID0gY2FsbChbIi9iaW4vbXljbWQiLCAibXlhcmciXSkKKworCitWZWN0b3IgZXhhbXBsZToKKworb3Muc3Bhd252cChvcy5QX05PV0FJVCwgcGF0aCwgYXJncykKKz09PgorUG9wZW4oW3BhdGhdICsgYXJnc1sxOl0pCisKKworRW52aXJvbm1lbnQgZXhhbXBsZToKKworb3Muc3Bhd25scGUob3MuUF9OT1dBSVQsICIvYmluL215Y21kIiwgIm15Y21kIiwgIm15YXJnIiwgZW52KQorPT0+CitQb3BlbihbIi9iaW4vbXljbWQiLCAibXlhcmciXSwgZW52PXsiUEFUSCI6ICIvdXNyL2JpbiJ9KQorCisKK1JlcGxhY2luZyBvcy5wb3BlbioKKy0tLS0tLS0tLS0tLS0tLS0tLS0KK3BpcGUgPSBvcy5wb3BlbigiY21kIiwgbW9kZT0ncicsIGJ1ZnNpemUpCis9PT4KK3BpcGUgPSBQb3BlbigiY21kIiwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLCBzdGRvdXQ9UElQRSkuc3Rkb3V0CisKK3BpcGUgPSBvcy5wb3BlbigiY21kIiwgbW9kZT0ndycsIGJ1ZnNpemUpCis9PT4KK3BpcGUgPSBQb3BlbigiY21kIiwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplLCBzdGRpbj1QSVBFKS5zdGRpbgorCisKKyhjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0KSA9IG9zLnBvcGVuMigiY21kIiwgbW9kZSwgYnVmc2l6ZSkKKz09PgorcCA9IFBvcGVuKCJjbWQiLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXQpID0gKHAuc3RkaW4sIHAuc3Rkb3V0KQorCisKKyhjaGlsZF9zdGRpbiwKKyBjaGlsZF9zdGRvdXQsCisgY2hpbGRfc3RkZXJyKSA9IG9zLnBvcGVuMygiY21kIiwgbW9kZSwgYnVmc2l6ZSkKKz09PgorcCA9IFBvcGVuKCJjbWQiLCBzaGVsbD1UcnVlLCBidWZzaXplPWJ1ZnNpemUsCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIHN0ZGVycj1QSVBFLCBjbG9zZV9mZHM9VHJ1ZSkKKyhjaGlsZF9zdGRpbiwKKyBjaGlsZF9zdGRvdXQsCisgY2hpbGRfc3RkZXJyKSA9IChwLnN0ZGluLCBwLnN0ZG91dCwgcC5zdGRlcnIpCisKKworKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXRfYW5kX3N0ZGVycikgPSBvcy5wb3BlbjQoImNtZCIsIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplKQorPT0+CitwID0gUG9wZW4oImNtZCIsIHNoZWxsPVRydWUsIGJ1ZnNpemU9YnVmc2l6ZSwKKyAgICAgICAgICBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSwgc3RkZXJyPVNURE9VVCwgY2xvc2VfZmRzPVRydWUpCisoY2hpbGRfc3RkaW4sIGNoaWxkX3N0ZG91dF9hbmRfc3RkZXJyKSA9IChwLnN0ZGluLCBwLnN0ZG91dCkKKworT24gVW5peCwgb3MucG9wZW4yLCBvcy5wb3BlbjMgYW5kIG9zLnBvcGVuNCBhbHNvIGFjY2VwdCBhIHNlcXVlbmNlIGFzCit0aGUgY29tbWFuZCB0byBleGVjdXRlLCBpbiB3aGljaCBjYXNlIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZAorZGlyZWN0bHkgdG8gdGhlIHByb2dyYW0gd2l0aG91dCBzaGVsbCBpbnRlcnZlbnRpb24uICBUaGlzIHVzYWdlIGNhbiBiZQorcmVwbGFjZWQgYXMgZm9sbG93czoKKworKGNoaWxkX3N0ZGluLCBjaGlsZF9zdGRvdXQpID0gb3MucG9wZW4yKFsiL2Jpbi9scyIsICItbCJdLCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUpCis9PT4KK3AgPSBQb3BlbihbIi9iaW4vbHMiLCAiLWwiXSwgYnVmc2l6ZT1idWZzaXplLCBzdGRpbj1QSVBFLCBzdGRvdXQ9UElQRSkKKyhjaGlsZF9zdGRpbiwgY2hpbGRfc3Rkb3V0KSA9IChwLnN0ZGluLCBwLnN0ZG91dCkKKworUmV0dXJuIGNvZGUgaGFuZGxpbmcgdHJhbnNsYXRlcyBhcyBmb2xsb3dzOgorCitwaXBlID0gb3MucG9wZW4oImNtZCIsICd3JykKKy4uLgorcmMgPSBwaXBlLmNsb3NlKCkKK2lmIHJjIGlzIG5vdCBOb25lIGFuZCByYyAlIDI1NjoKKyAgICBwcmludCAiVGhlcmUgd2VyZSBzb21lIGVycm9ycyIKKz09PgorcHJvY2VzcyA9IFBvcGVuKCJjbWQiLCAndycsIHNoZWxsPVRydWUsIHN0ZGluPVBJUEUpCisuLi4KK3Byb2Nlc3Muc3RkaW4uY2xvc2UoKQoraWYgcHJvY2Vzcy53YWl0KCkgIT0gMDoKKyAgICBwcmludCAiVGhlcmUgd2VyZSBzb21lIGVycm9ycyIKKworCitSZXBsYWNpbmcgcG9wZW4yLioKKy0tLS0tLS0tLS0tLS0tLS0tLQorKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gcG9wZW4yLnBvcGVuMigic29tZXN0cmluZyIsIGJ1ZnNpemUsIG1vZGUpCis9PT4KK3AgPSBQb3BlbihbInNvbWVzdHJpbmciXSwgc2hlbGw9VHJ1ZSwgYnVmc2l6ZT1idWZzaXplCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gKHAuc3Rkb3V0LCBwLnN0ZGluKQorCitPbiBVbml4LCBwb3BlbjIgYWxzbyBhY2NlcHRzIGEgc2VxdWVuY2UgYXMgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSwgaW4KK3doaWNoIGNhc2UgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBwcm9ncmFtIHdpdGhvdXQKK3NoZWxsIGludGVydmVudGlvbi4gIFRoaXMgdXNhZ2UgY2FuIGJlIHJlcGxhY2VkIGFzIGZvbGxvd3M6CisKKyhjaGlsZF9zdGRvdXQsIGNoaWxkX3N0ZGluKSA9IHBvcGVuMi5wb3BlbjIoWyJteWNtZCIsICJteWFyZyJdLCBidWZzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlKQorPT0+CitwID0gUG9wZW4oWyJteWNtZCIsICJteWFyZyJdLCBidWZzaXplPWJ1ZnNpemUsCisgICAgICAgICAgc3RkaW49UElQRSwgc3Rkb3V0PVBJUEUsIGNsb3NlX2Zkcz1UcnVlKQorKGNoaWxkX3N0ZG91dCwgY2hpbGRfc3RkaW4pID0gKHAuc3Rkb3V0LCBwLnN0ZGluKQorCitUaGUgcG9wZW4yLlBvcGVuMyBhbmQgcG9wZW4yLlBvcGVuNCBiYXNpY2FsbHkgd29ya3MgYXMgc3VicHJvY2Vzcy5Qb3BlbiwKK2V4Y2VwdCB0aGF0OgorCisqIHN1YnByb2Nlc3MuUG9wZW4gcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZXhlY3V0aW9uIGZhaWxzCisqIHRoZSBjYXB0dXJlc3RkZXJyIGFyZ3VtZW50IGlzIHJlcGxhY2VkIHdpdGggdGhlIHN0ZGVyciBhcmd1bWVudC4KKyogc3RkaW49UElQRSBhbmQgc3Rkb3V0PVBJUEUgbXVzdCBiZSBzcGVjaWZpZWQuCisqIHBvcGVuMiBjbG9zZXMgYWxsIGZpbGVkZXNjcmlwdG9ycyBieSBkZWZhdWx0LCBidXQgeW91IGhhdmUgdG8gc3BlY2lmeQorICBjbG9zZV9mZHM9VHJ1ZSB3aXRoIHN1YnByb2Nlc3MuUG9wZW4uCisiIiIKKworaW1wb3J0IHN5cworbXN3aW5kb3dzID0gKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiKQorCitpbXBvcnQgb3MKK2ltcG9ydCB0eXBlcworaW1wb3J0IHRyYWNlYmFjaworaW1wb3J0IGdjCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgZXJybm8KKworIyBFeGNlcHRpb24gY2xhc3NlcyB1c2VkIGJ5IHRoaXMgbW9kdWxlLgorY2xhc3MgQ2FsbGVkUHJvY2Vzc0Vycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBwcm9jZXNzIHJ1biBieSBjaGVja19jYWxsKCkgb3IKKyAgICBjaGVja19vdXRwdXQoKSByZXR1cm5zIGEgbm9uLXplcm8gZXhpdCBzdGF0dXMuCisgICAgVGhlIGV4aXQgc3RhdHVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZTsKKyAgICBjaGVja19vdXRwdXQoKSB3aWxsIGFsc28gc3RvcmUgdGhlIG91dHB1dCBpbiB0aGUgb3V0cHV0IGF0dHJpYnV0ZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmV0dXJuY29kZSwgY21kLCBvdXRwdXQ9Tm9uZSk6CisgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IHJldHVybmNvZGUKKyAgICAgICAgc2VsZi5jbWQgPSBjbWQKKyAgICAgICAgc2VsZi5vdXRwdXQgPSBvdXRwdXQKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJDb21tYW5kICclcycgcmV0dXJuZWQgbm9uLXplcm8gZXhpdCBzdGF0dXMgJWQiICUgKHNlbGYuY21kLCBzZWxmLnJldHVybmNvZGUpCisKKworaWYgbXN3aW5kb3dzOgorICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICBpbXBvcnQgbXN2Y3J0CisgICAgaW1wb3J0IF9zdWJwcm9jZXNzCisgICAgY2xhc3MgU1RBUlRVUElORk86CisgICAgICAgIGR3RmxhZ3MgPSAwCisgICAgICAgIGhTdGRJbnB1dCA9IE5vbmUKKyAgICAgICAgaFN0ZE91dHB1dCA9IE5vbmUKKyAgICAgICAgaFN0ZEVycm9yID0gTm9uZQorICAgICAgICB3U2hvd1dpbmRvdyA9IDAKKyAgICBjbGFzcyBweXdpbnR5cGVzOgorICAgICAgICBlcnJvciA9IElPRXJyb3IKK2Vsc2U6CisgICAgaW1wb3J0IHNlbGVjdAorICAgIF9oYXNfcG9sbCA9IGhhc2F0dHIoc2VsZWN0LCAncG9sbCcpCisgICAgaW1wb3J0IGZjbnRsCisgICAgaW1wb3J0IHBpY2tsZQorCisgICAgIyBXaGVuIHNlbGVjdCBvciBwb2xsIGhhcyBpbmRpY2F0ZWQgdGhhdCB0aGUgZmlsZSBpcyB3cml0YWJsZSwKKyAgICAjIHdlIGNhbiB3cml0ZSB1cCB0byBfUElQRV9CVUYgYnl0ZXMgd2l0aG91dCByaXNrIG9mIGJsb2NraW5nLgorICAgICMgUE9TSVggZGVmaW5lcyBQSVBFX0JVRiBhcyA+PSA1MTIuCisgICAgX1BJUEVfQlVGID0gZ2V0YXR0cihzZWxlY3QsICdQSVBFX0JVRicsIDUxMikKKworCitfX2FsbF9fID0gWyJQb3BlbiIsICJQSVBFIiwgIlNURE9VVCIsICJjYWxsIiwgImNoZWNrX2NhbGwiLAorICAgICAgICAgICAiY2hlY2tfb3V0cHV0IiwgIkNhbGxlZFByb2Nlc3NFcnJvciJdCisKK2lmIG1zd2luZG93czoKKyAgICBmcm9tIF9zdWJwcm9jZXNzIGltcG9ydCAoQ1JFQVRFX05FV19DT05TT0xFLCBDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNURF9JTlBVVF9IQU5ETEUsIFNURF9PVVRQVVRfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVERfRVJST1JfSEFORExFLCBTV19ISURFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVEFSVEZfVVNFU1RESEFORExFUywgU1RBUlRGX1VTRVNIT1dXSU5ET1cpCisKKyAgICBfX2FsbF9fLmV4dGVuZChbIkNSRUFURV9ORVdfQ09OU09MRSIsICJDUkVBVEVfTkVXX1BST0NFU1NfR1JPVVAiLAorICAgICAgICAgICAgICAgICAgICAiU1REX0lOUFVUX0hBTkRMRSIsICJTVERfT1VUUFVUX0hBTkRMRSIsCisgICAgICAgICAgICAgICAgICAgICJTVERfRVJST1JfSEFORExFIiwgIlNXX0hJREUiLAorICAgICAgICAgICAgICAgICAgICAiU1RBUlRGX1VTRVNUREhBTkRMRVMiLCAiU1RBUlRGX1VTRVNIT1dXSU5ET1ciXSkKK3RyeToKKyAgICBNQVhGRCA9IG9zLnN5c2NvbmYoIlNDX09QRU5fTUFYIikKK2V4Y2VwdDoKKyAgICBNQVhGRCA9IDI1NgorCitfYWN0aXZlID0gW10KKworZGVmIF9jbGVhbnVwKCk6CisgICAgZm9yIGluc3QgaW4gX2FjdGl2ZVs6XToKKyAgICAgICAgcmVzID0gaW5zdC5faW50ZXJuYWxfcG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpCisgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShpbnN0KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gaWYgdHdvIHRocmVhZHMgY3JlYXRlIGEgbmV3IFBvcGVuIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICMgSXQncyBoYXJtbGVzcyB0aGF0IGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQsIHNvIGlnbm9yZS4KKyAgICAgICAgICAgICAgICBwYXNzCisKK1BJUEUgPSAtMQorU1RET1VUID0gLTIKKworCitkZWYgX2VpbnRyX3JldHJ5X2NhbGwoZnVuYywgKmFyZ3MpOgorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzKQorICAgICAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpIGFzIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByYWlzZQorCisKKyMgWFhYIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGJ5IG11bHRpcHJvY2Vzc2luZyBhbmQgdGhlIHRlc3Qgc3VpdGUsCisjIGJ1dCBpdCdzIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgaW1wb3J0ZWQgd2hlbiBQeXRob24gaXMgY29tcGlsZWQgd2l0aG91dAorIyB0aHJlYWRzLgorCitkZWYgX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgY29tbWFuZC1saW5lIGFyZ3VtZW50cyByZXByb2R1Y2luZyB0aGUgY3VycmVudAorICAgIHNldHRpbmdzIGluIHN5cy5mbGFncyBhbmQgc3lzLndhcm5vcHRpb25zLiIiIgorICAgIGZsYWdfb3B0X21hcCA9IHsKKyAgICAgICAgJ2RlYnVnJzogJ2QnLAorICAgICAgICAjICdpbnNwZWN0JzogJ2knLAorICAgICAgICAjICdpbnRlcmFjdGl2ZSc6ICdpJywKKyAgICAgICAgJ29wdGltaXplJzogJ08nLAorICAgICAgICAnZG9udF93cml0ZV9ieXRlY29kZSc6ICdCJywKKyAgICAgICAgJ25vX3VzZXJfc2l0ZSc6ICdzJywKKyAgICAgICAgJ25vX3NpdGUnOiAnUycsCisgICAgICAgICdpZ25vcmVfZW52aXJvbm1lbnQnOiAnRScsCisgICAgICAgICd2ZXJib3NlJzogJ3YnLAorICAgICAgICAnYnl0ZXNfd2FybmluZyc6ICdiJywKKyAgICAgICAgJ2hhc2hfcmFuZG9taXphdGlvbic6ICdSJywKKyAgICAgICAgJ3B5M2tfd2FybmluZyc6ICczJywKKyAgICB9CisgICAgYXJncyA9IFtdCisgICAgZm9yIGZsYWcsIG9wdCBpbiBmbGFnX29wdF9tYXAuaXRlbXMoKToKKyAgICAgICAgdiA9IGdldGF0dHIoc3lzLmZsYWdzLCBmbGFnKQorICAgICAgICBpZiB2ID4gMDoKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCctJyArIG9wdCAqIHYpCisgICAgZm9yIG9wdCBpbiBzeXMud2Fybm9wdGlvbnM6CisgICAgICAgIGFyZ3MuYXBwZW5kKCctVycgKyBvcHQpCisgICAgcmV0dXJuIGFyZ3MKKworCitkZWYgY2FsbCgqcG9wZW5hcmdzLCAqKmt3YXJncyk6CisgICAgIiIiUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMuICBXYWl0IGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLCB0aGVuCisgICAgcmV0dXJuIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KKworICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgorCisgICAgcmV0Y29kZSA9IGNhbGwoWyJscyIsICItbCJdKQorICAgICIiIgorICAgIHJldHVybiBQb3BlbigqcG9wZW5hcmdzLCAqKmt3YXJncykud2FpdCgpCisKKworZGVmIGNoZWNrX2NhbGwoKnBvcGVuYXJncywgKiprd2FyZ3MpOgorICAgICIiIlJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4gIElmCisgICAgdGhlIGV4aXQgY29kZSB3YXMgemVybyB0aGVuIHJldHVybiwgb3RoZXJ3aXNlIHJhaXNlCisgICAgQ2FsbGVkUHJvY2Vzc0Vycm9yLiAgVGhlIENhbGxlZFByb2Nlc3NFcnJvciBvYmplY3Qgd2lsbCBoYXZlIHRoZQorICAgIHJldHVybiBjb2RlIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KKworICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgorCisgICAgY2hlY2tfY2FsbChbImxzIiwgIi1sIl0pCisgICAgIiIiCisgICAgcmV0Y29kZSA9IGNhbGwoKnBvcGVuYXJncywgKiprd2FyZ3MpCisgICAgaWYgcmV0Y29kZToKKyAgICAgICAgY21kID0ga3dhcmdzLmdldCgiYXJncyIpCisgICAgICAgIGlmIGNtZCBpcyBOb25lOgorICAgICAgICAgICAgY21kID0gcG9wZW5hcmdzWzBdCisgICAgICAgIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvcihyZXRjb2RlLCBjbWQpCisgICAgcmV0dXJuIDAKKworCitkZWYgY2hlY2tfb3V0cHV0KCpwb3BlbmFyZ3MsICoqa3dhcmdzKToKKyAgICByIiIiUnVuIGNvbW1hbmQgd2l0aCBhcmd1bWVudHMgYW5kIHJldHVybiBpdHMgb3V0cHV0IGFzIGEgYnl0ZSBzdHJpbmcuCisKKyAgICBJZiB0aGUgZXhpdCBjb2RlIHdhcyBub24temVybyBpdCByYWlzZXMgYSBDYWxsZWRQcm9jZXNzRXJyb3IuICBUaGUKKyAgICBDYWxsZWRQcm9jZXNzRXJyb3Igb2JqZWN0IHdpbGwgaGF2ZSB0aGUgcmV0dXJuIGNvZGUgaW4gdGhlIHJldHVybmNvZGUKKyAgICBhdHRyaWJ1dGUgYW5kIG91dHB1dCBpbiB0aGUgb3V0cHV0IGF0dHJpYnV0ZS4KKworICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgorCisgICAgPj4+IGNoZWNrX291dHB1dChbImxzIiwgIi1sIiwgIi9kZXYvbnVsbCJdKQorICAgICdjcnctcnctcnctIDEgcm9vdCByb290IDEsIDMgT2N0IDE4ICAyMDA3IC9kZXYvbnVsbFxuJworCisgICAgVGhlIHN0ZG91dCBhcmd1bWVudCBpcyBub3QgYWxsb3dlZCBhcyBpdCBpcyB1c2VkIGludGVybmFsbHkuCisgICAgVG8gY2FwdHVyZSBzdGFuZGFyZCBlcnJvciBpbiB0aGUgcmVzdWx0LCB1c2Ugc3RkZXJyPVNURE9VVC4KKworICAgID4+PiBjaGVja19vdXRwdXQoWyIvYmluL3NoIiwgIi1jIiwKKyAgICAuLi4gICAgICAgICAgICAgICAibHMgLWwgbm9uX2V4aXN0ZW50X2ZpbGUgOyBleGl0IDAiXSwKKyAgICAuLi4gICAgICAgICAgICAgIHN0ZGVycj1TVERPVVQpCisgICAgJ2xzOiBub25fZXhpc3RlbnRfZmlsZTogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeVxuJworICAgICIiIgorICAgIGlmICdzdGRvdXQnIGluIGt3YXJnczoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignc3Rkb3V0IGFyZ3VtZW50IG5vdCBhbGxvd2VkLCBpdCB3aWxsIGJlIG92ZXJyaWRkZW4uJykKKyAgICBwcm9jZXNzID0gUG9wZW4oc3Rkb3V0PVBJUEUsICpwb3BlbmFyZ3MsICoqa3dhcmdzKQorICAgIG91dHB1dCwgdW51c2VkX2VyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgIHJldGNvZGUgPSBwcm9jZXNzLnBvbGwoKQorICAgIGlmIHJldGNvZGU6CisgICAgICAgIGNtZCA9IGt3YXJncy5nZXQoImFyZ3MiKQorICAgICAgICBpZiBjbWQgaXMgTm9uZToKKyAgICAgICAgICAgIGNtZCA9IHBvcGVuYXJnc1swXQorICAgICAgICByYWlzZSBDYWxsZWRQcm9jZXNzRXJyb3IocmV0Y29kZSwgY21kLCBvdXRwdXQ9b3V0cHV0KQorICAgIHJldHVybiBvdXRwdXQKKworCitkZWYgbGlzdDJjbWRsaW5lKHNlcSk6CisgICAgIiIiCisgICAgVHJhbnNsYXRlIGEgc2VxdWVuY2Ugb2YgYXJndW1lbnRzIGludG8gYSBjb21tYW5kIGxpbmUKKyAgICBzdHJpbmcsIHVzaW5nIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBNUyBDIHJ1bnRpbWU6CisKKyAgICAxKSBBcmd1bWVudHMgYXJlIGRlbGltaXRlZCBieSB3aGl0ZSBzcGFjZSwgd2hpY2ggaXMgZWl0aGVyIGEKKyAgICAgICBzcGFjZSBvciBhIHRhYi4KKworICAgIDIpIEEgc3RyaW5nIHN1cnJvdW5kZWQgYnkgZG91YmxlIHF1b3RhdGlvbiBtYXJrcyBpcworICAgICAgIGludGVycHJldGVkIGFzIGEgc2luZ2xlIGFyZ3VtZW50LCByZWdhcmRsZXNzIG9mIHdoaXRlIHNwYWNlCisgICAgICAgY29udGFpbmVkIHdpdGhpbi4gIEEgcXVvdGVkIHN0cmluZyBjYW4gYmUgZW1iZWRkZWQgaW4gYW4KKyAgICAgICBhcmd1bWVudC4KKworICAgIDMpIEEgZG91YmxlIHF1b3RhdGlvbiBtYXJrIHByZWNlZGVkIGJ5IGEgYmFja3NsYXNoIGlzCisgICAgICAgaW50ZXJwcmV0ZWQgYXMgYSBsaXRlcmFsIGRvdWJsZSBxdW90YXRpb24gbWFyay4KKworICAgIDQpIEJhY2tzbGFzaGVzIGFyZSBpbnRlcnByZXRlZCBsaXRlcmFsbHksIHVubGVzcyB0aGV5CisgICAgICAgaW1tZWRpYXRlbHkgcHJlY2VkZSBhIGRvdWJsZSBxdW90YXRpb24gbWFyay4KKworICAgIDUpIElmIGJhY2tzbGFzaGVzIGltbWVkaWF0ZWx5IHByZWNlZGUgYSBkb3VibGUgcXVvdGF0aW9uIG1hcmssCisgICAgICAgZXZlcnkgcGFpciBvZiBiYWNrc2xhc2hlcyBpcyBpbnRlcnByZXRlZCBhcyBhIGxpdGVyYWwKKyAgICAgICBiYWNrc2xhc2guICBJZiB0aGUgbnVtYmVyIG9mIGJhY2tzbGFzaGVzIGlzIG9kZCwgdGhlIGxhc3QKKyAgICAgICBiYWNrc2xhc2ggZXNjYXBlcyB0aGUgbmV4dCBkb3VibGUgcXVvdGF0aW9uIG1hcmsgYXMKKyAgICAgICBkZXNjcmliZWQgaW4gcnVsZSAzLgorICAgICIiIgorCisgICAgIyBTZWUKKyAgICAjIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS8xN3c1eWtmdC5hc3B4CisgICAgIyBvciBzZWFyY2ggaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbSBmb3IKKyAgICAjICJQYXJzaW5nIEMrKyBDb21tYW5kLUxpbmUgQXJndW1lbnRzIgorICAgIHJlc3VsdCA9IFtdCisgICAgbmVlZHF1b3RlID0gRmFsc2UKKyAgICBmb3IgYXJnIGluIHNlcToKKyAgICAgICAgYnNfYnVmID0gW10KKworICAgICAgICAjIEFkZCBhIHNwYWNlIHRvIHNlcGFyYXRlIHRoaXMgYXJndW1lbnQgZnJvbSB0aGUgb3RoZXJzCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyAnKQorCisgICAgICAgIG5lZWRxdW90ZSA9ICgiICIgaW4gYXJnKSBvciAoIlx0IiBpbiBhcmcpIG9yIG5vdCBhcmcKKyAgICAgICAgaWYgbmVlZHF1b3RlOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnIicpCisKKyAgICAgICAgZm9yIGMgaW4gYXJnOgorICAgICAgICAgICAgaWYgYyA9PSAnXFwnOgorICAgICAgICAgICAgICAgICMgRG9uJ3Qga25vdyBpZiB3ZSBuZWVkIHRvIGRvdWJsZSB5ZXQuCisgICAgICAgICAgICAgICAgYnNfYnVmLmFwcGVuZChjKQorICAgICAgICAgICAgZWxpZiBjID09ICciJzoKKyAgICAgICAgICAgICAgICAjIERvdWJsZSBiYWNrc2xhc2hlcy4KKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCdcXCcgKiBsZW4oYnNfYnVmKSoyKQorICAgICAgICAgICAgICAgIGJzX2J1ZiA9IFtdCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXFwiJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBOb3JtYWwgY2hhcgorICAgICAgICAgICAgICAgIGlmIGJzX2J1ZjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmV4dGVuZChic19idWYpCisgICAgICAgICAgICAgICAgICAgIGJzX2J1ZiA9IFtdCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjKQorCisgICAgICAgICMgQWRkIHJlbWFpbmluZyBiYWNrc2xhc2hlcywgaWYgYW55LgorICAgICAgICBpZiBic19idWY6CisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKworICAgICAgICBpZiBuZWVkcXVvdGU6CisgICAgICAgICAgICByZXN1bHQuZXh0ZW5kKGJzX2J1ZikKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJyInKQorCisgICAgcmV0dXJuICcnLmpvaW4ocmVzdWx0KQorCisKK2NsYXNzIFBvcGVuKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3MsIGJ1ZnNpemU9MCwgZXhlY3V0YWJsZT1Ob25lLAorICAgICAgICAgICAgICAgICBzdGRpbj1Ob25lLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsCisgICAgICAgICAgICAgICAgIHByZWV4ZWNfZm49Tm9uZSwgY2xvc2VfZmRzPUZhbHNlLCBzaGVsbD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgY3dkPU5vbmUsIGVudj1Ob25lLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UsCisgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvPU5vbmUsIGNyZWF0aW9uZmxhZ3M9MCk6CisgICAgICAgICIiIkNyZWF0ZSBuZXcgUG9wZW4gaW5zdGFuY2UuIiIiCisgICAgICAgIF9jbGVhbnVwKCkKKworICAgICAgICBzZWxmLl9jaGlsZF9jcmVhdGVkID0gRmFsc2UKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmc2l6ZSwgKGludCwgbG9uZykpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJidWZzaXplIG11c3QgYmUgYW4gaW50ZWdlciIpCisKKyAgICAgICAgaWYgbXN3aW5kb3dzOgorICAgICAgICAgICAgaWYgcHJlZXhlY19mbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJwcmVleGVjX2ZuIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1zIikKKyAgICAgICAgICAgIGlmIGNsb3NlX2ZkcyBhbmQgKHN0ZGluIGlzIG5vdCBOb25lIG9yIHN0ZG91dCBpcyBub3QgTm9uZSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyIGlzIG5vdCBOb25lKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjbG9zZV9mZHMgaXMgbm90IHN1cHBvcnRlZCBvbiBXaW5kb3dzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybXMgaWYgeW91IHJlZGlyZWN0IHN0ZGluL3N0ZG91dC9zdGRlcnIiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBQT1NJWAorICAgICAgICAgICAgaWYgc3RhcnR1cGluZm8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RhcnR1cGluZm8gaXMgb25seSBzdXBwb3J0ZWQgb24gV2luZG93cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGxhdGZvcm1zIikKKyAgICAgICAgICAgIGlmIGNyZWF0aW9uZmxhZ3MgIT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJjcmVhdGlvbmZsYWdzIGlzIG9ubHkgc3VwcG9ydGVkIG9uIFdpbmRvd3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBsYXRmb3JtcyIpCisKKyAgICAgICAgc2VsZi5zdGRpbiA9IE5vbmUKKyAgICAgICAgc2VsZi5zdGRvdXQgPSBOb25lCisgICAgICAgIHNlbGYuc3RkZXJyID0gTm9uZQorICAgICAgICBzZWxmLnBpZCA9IE5vbmUKKyAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gTm9uZQorICAgICAgICBzZWxmLnVuaXZlcnNhbF9uZXdsaW5lcyA9IHVuaXZlcnNhbF9uZXdsaW5lcworCisgICAgICAgICMgSW5wdXQgYW5kIG91dHB1dCBvYmplY3RzLiBUaGUgZ2VuZXJhbCBwcmluY2lwbGUgaXMgbGlrZQorICAgICAgICAjIHRoaXM6CisgICAgICAgICMKKyAgICAgICAgIyBQYXJlbnQgICAgICAgICAgICAgICAgICAgQ2hpbGQKKyAgICAgICAgIyAtLS0tLS0gICAgICAgICAgICAgICAgICAgLS0tLS0KKyAgICAgICAgIyBwMmN3cml0ZSAgIC0tLXN0ZGluLS0tPiAgcDJjcmVhZAorICAgICAgICAjIGMycHJlYWQgICAgPC0tc3Rkb3V0LS0tICBjMnB3cml0ZQorICAgICAgICAjIGVycnJlYWQgICAgPC0tc3RkZXJyLS0tICBlcnJ3cml0ZQorICAgICAgICAjCisgICAgICAgICMgT24gUE9TSVgsIHRoZSBjaGlsZCBvYmplY3RzIGFyZSBmaWxlIGRlc2NyaXB0b3JzLiAgT24KKyAgICAgICAgIyBXaW5kb3dzLCB0aGVzZSBhcmUgV2luZG93cyBmaWxlIGhhbmRsZXMuICBUaGUgcGFyZW50IG9iamVjdHMKKyAgICAgICAgIyBhcmUgZmlsZSBkZXNjcmlwdG9ycyBvbiBib3RoIHBsYXRmb3Jtcy4gIFRoZSBwYXJlbnQgb2JqZWN0cworICAgICAgICAjIGFyZSBOb25lIHdoZW4gbm90IHVzaW5nIFBJUEVzLiBUaGUgY2hpbGQgb2JqZWN0cyBhcmUgTm9uZQorICAgICAgICAjIHdoZW4gbm90IHJlZGlyZWN0aW5nLgorCisgICAgICAgIChwMmNyZWFkLCBwMmN3cml0ZSwKKyAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpID0gc2VsZi5fZ2V0X2hhbmRsZXMoc3RkaW4sIHN0ZG91dCwgc3RkZXJyKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2V4ZWN1dGVfY2hpbGQoYXJncywgZXhlY3V0YWJsZSwgcHJlZXhlY19mbiwgY2xvc2VfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsIGVudiwgdW5pdmVyc2FsX25ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbywgY3JlYXRpb25mbGFncywgc2hlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAjIFByZXNlcnZlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpbiBjYXNlIG9zLmNsb3NlIHJhaXNlcy4KKyAgICAgICAgICAgIGV4Y190eXBlLCBleGNfdmFsdWUsIGV4Y190cmFjZSA9IHN5cy5leGNfaW5mbygpCisKKyAgICAgICAgICAgIHRvX2Nsb3NlID0gW10KKyAgICAgICAgICAgICMgT25seSBjbG9zZSB0aGUgcGlwZXMgd2UgY3JlYXRlZC4KKyAgICAgICAgICAgIGlmIHN0ZGluID09IFBJUEU6CisgICAgICAgICAgICAgICAgdG9fY2xvc2UuZXh0ZW5kKChwMmNyZWFkLCBwMmN3cml0ZSkpCisgICAgICAgICAgICBpZiBzdGRvdXQgPT0gUElQRToKKyAgICAgICAgICAgICAgICB0b19jbG9zZS5leHRlbmQoKGMycHJlYWQsIGMycHdyaXRlKSkKKyAgICAgICAgICAgIGlmIHN0ZGVyciA9PSBQSVBFOgorICAgICAgICAgICAgICAgIHRvX2Nsb3NlLmV4dGVuZCgoZXJycmVhZCwgZXJyd3JpdGUpKQorCisgICAgICAgICAgICBmb3IgZmQgaW4gdG9fY2xvc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICByYWlzZSBleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdHJhY2UKKworICAgICAgICBpZiBtc3dpbmRvd3M6CisgICAgICAgICAgICBpZiBwMmN3cml0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBwMmN3cml0ZSA9IG1zdmNydC5vcGVuX29zZmhhbmRsZShwMmN3cml0ZS5EZXRhY2goKSwgMCkKKyAgICAgICAgICAgIGlmIGMycHJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYzJwcmVhZCA9IG1zdmNydC5vcGVuX29zZmhhbmRsZShjMnByZWFkLkRldGFjaCgpLCAwKQorICAgICAgICAgICAgaWYgZXJycmVhZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBlcnJyZWFkID0gbXN2Y3J0Lm9wZW5fb3NmaGFuZGxlKGVycnJlYWQuRGV0YWNoKCksIDApCisKKyAgICAgICAgaWYgcDJjd3JpdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnN0ZGluID0gb3MuZmRvcGVuKHAyY3dyaXRlLCAnd2InLCBidWZzaXplKQorICAgICAgICBpZiBjMnByZWFkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgdW5pdmVyc2FsX25ld2xpbmVzOgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gb3MuZmRvcGVuKGMycHJlYWQsICdyVScsIGJ1ZnNpemUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3Rkb3V0ID0gb3MuZmRvcGVuKGMycHJlYWQsICdyYicsIGJ1ZnNpemUpCisgICAgICAgIGlmIGVycnJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiB1bml2ZXJzYWxfbmV3bGluZXM6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBvcy5mZG9wZW4oZXJycmVhZCwgJ3JVJywgYnVmc2l6ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIgPSBvcy5mZG9wZW4oZXJycmVhZCwgJ3JiJywgYnVmc2l6ZSkKKworCisgICAgZGVmIF90cmFuc2xhdGVfbmV3bGluZXMoc2VsZiwgZGF0YSk6CisgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcciIsICJcbiIpCisgICAgICAgIHJldHVybiBkYXRhCisKKworICAgIGRlZiBfX2RlbF9fKHNlbGYsIF9tYXhpbnQ9c3lzLm1heGludCwgX2FjdGl2ZT1fYWN0aXZlKToKKyAgICAgICAgIyBJZiBfX2luaXRfXyBoYXNuJ3QgaGFkIGEgY2hhbmNlIHRvIGV4ZWN1dGUgKGUuZy4gaWYgaXQKKyAgICAgICAgIyB3YXMgcGFzc2VkIGFuIHVuZGVjbGFyZWQga2V5d29yZCBhcmd1bWVudCksIHdlIGRvbid0CisgICAgICAgICMgaGF2ZSBhIF9jaGlsZF9jcmVhdGVkIGF0dHJpYnV0ZSBhdCBhbGwuCisgICAgICAgIGlmIG5vdCBnZXRhdHRyKHNlbGYsICdfY2hpbGRfY3JlYXRlZCcsIEZhbHNlKToKKyAgICAgICAgICAgICMgV2UgZGlkbid0IGdldCB0byBzdWNjZXNzZnVsbHkgY3JlYXRlIGEgY2hpbGQgcHJvY2Vzcy4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgorICAgICAgICBzZWxmLl9pbnRlcm5hbF9wb2xsKF9kZWFkc3RhdGU9X21heGludCkKKyAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmUgYW5kIF9hY3RpdmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIENoaWxkIGlzIHN0aWxsIHJ1bm5pbmcsIGtlZXAgdXMgYWxpdmUgdW50aWwgd2UgY2FuIHdhaXQgb24gaXQuCisgICAgICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQorCisKKyAgICBkZWYgY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQ9Tm9uZSk6CisgICAgICAgICIiIkludGVyYWN0IHdpdGggcHJvY2VzczogU2VuZCBkYXRhIHRvIHN0ZGluLiAgUmVhZCBkYXRhIGZyb20KKyAgICAgICAgc3Rkb3V0IGFuZCBzdGRlcnIsIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQuICBXYWl0IGZvcgorICAgICAgICBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFRoZSBvcHRpb25hbCBpbnB1dCBhcmd1bWVudCBzaG91bGQgYmUgYQorICAgICAgICBzdHJpbmcgdG8gYmUgc2VudCB0byB0aGUgY2hpbGQgcHJvY2Vzcywgb3IgTm9uZSwgaWYgbm8gZGF0YQorICAgICAgICBzaG91bGQgYmUgc2VudCB0byB0aGUgY2hpbGQuCisKKyAgICAgICAgY29tbXVuaWNhdGUoKSByZXR1cm5zIGEgdHVwbGUgKHN0ZG91dCwgc3RkZXJyKS4iIiIKKworICAgICAgICAjIE9wdGltaXphdGlvbjogSWYgd2UgYXJlIG9ubHkgdXNpbmcgb25lIHBpcGUsIG9yIG5vIHBpcGUgYXQKKyAgICAgICAgIyBhbGwsIHVzaW5nIHNlbGVjdCgpIG9yIHRocmVhZHMgaXMgdW5uZWNlc3NhcnkuCisgICAgICAgIGlmIFtzZWxmLnN0ZGluLCBzZWxmLnN0ZG91dCwgc2VsZi5zdGRlcnJdLmNvdW50KE5vbmUpID49IDI6CisgICAgICAgICAgICBzdGRvdXQgPSBOb25lCisgICAgICAgICAgICBzdGRlcnIgPSBOb25lCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluOgorICAgICAgICAgICAgICAgIGlmIGlucHV0OgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLndyaXRlKGlucHV0KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FUElQRSBhbmQgZS5lcnJubyAhPSBlcnJuby5FSU5WQUw6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICAgICAgc3Rkb3V0ID0gX2VpbnRyX3JldHJ5X2NhbGwoc2VsZi5zdGRvdXQucmVhZCkKKyAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5jbG9zZSgpCisgICAgICAgICAgICBlbGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9IF9laW50cl9yZXRyeV9jYWxsKHNlbGYuc3RkZXJyLnJlYWQpCisgICAgICAgICAgICAgICAgc2VsZi5zdGRlcnIuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi53YWl0KCkKKyAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCisKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbW11bmljYXRlKGlucHV0KQorCisKKyAgICBkZWYgcG9sbChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ludGVybmFsX3BvbGwoKQorCisKKyAgICBpZiBtc3dpbmRvd3M6CisgICAgICAgICMKKyAgICAgICAgIyBXaW5kb3dzIG1ldGhvZHMKKyAgICAgICAgIworICAgICAgICBkZWYgX2dldF9oYW5kbGVzKHNlbGYsIHN0ZGluLCBzdGRvdXQsIHN0ZGVycik6CisgICAgICAgICAgICAiIiJDb25zdHJ1Y3QgYW5kIHJldHVybiB0dXBsZSB3aXRoIElPIG9iamVjdHM6CisgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSwgYzJwcmVhZCwgYzJwd3JpdGUsIGVycnJlYWQsIGVycndyaXRlCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIHN0ZGluIGlzIE5vbmUgYW5kIHN0ZG91dCBpcyBOb25lIGFuZCBzdGRlcnIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gTm9uZSwgTm9uZQorICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBOb25lLCBOb25lCisgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IE5vbmUsIE5vbmUKKworICAgICAgICAgICAgaWYgc3RkaW4gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwMmNyZWFkID0gX3N1YnByb2Nlc3MuR2V0U3RkSGFuZGxlKF9zdWJwcm9jZXNzLlNURF9JTlBVVF9IQU5ETEUpCisgICAgICAgICAgICAgICAgaWYgcDJjcmVhZCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBwMmNyZWFkLCBfID0gX3N1YnByb2Nlc3MuQ3JlYXRlUGlwZShOb25lLCAwKQorICAgICAgICAgICAgZWxpZiBzdGRpbiA9PSBQSVBFOgorICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gX3N1YnByb2Nlc3MuQ3JlYXRlUGlwZShOb25lLCAwKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0ZGluLCBpbnQpOgorICAgICAgICAgICAgICAgIHAyY3JlYWQgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRpbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgcDJjcmVhZCA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZGluLmZpbGVubygpKQorICAgICAgICAgICAgcDJjcmVhZCA9IHNlbGYuX21ha2VfaW5oZXJpdGFibGUocDJjcmVhZCkKKworICAgICAgICAgICAgaWYgc3Rkb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBfc3VicHJvY2Vzcy5HZXRTdGRIYW5kbGUoX3N1YnByb2Nlc3MuU1REX09VVFBVVF9IQU5ETEUpCisgICAgICAgICAgICAgICAgaWYgYzJwd3JpdGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgXywgYzJwd3JpdGUgPSBfc3VicHJvY2Vzcy5DcmVhdGVQaXBlKE5vbmUsIDApCisgICAgICAgICAgICBlbGlmIHN0ZG91dCA9PSBQSVBFOgorICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gX3N1YnByb2Nlc3MuQ3JlYXRlUGlwZShOb25lLCAwKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0ZG91dCwgaW50KToKKyAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IG1zdmNydC5nZXRfb3NmaGFuZGxlKHN0ZG91dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRvdXQuZmlsZW5vKCkpCisgICAgICAgICAgICBjMnB3cml0ZSA9IHNlbGYuX21ha2VfaW5oZXJpdGFibGUoYzJwd3JpdGUpCisKKyAgICAgICAgICAgIGlmIHN0ZGVyciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gX3N1YnByb2Nlc3MuR2V0U3RkSGFuZGxlKF9zdWJwcm9jZXNzLlNURF9FUlJPUl9IQU5ETEUpCisgICAgICAgICAgICAgICAgaWYgZXJyd3JpdGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgXywgZXJyd3JpdGUgPSBfc3VicHJvY2Vzcy5DcmVhdGVQaXBlKE5vbmUsIDApCisgICAgICAgICAgICBlbGlmIHN0ZGVyciA9PSBQSVBFOgorICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlID0gX3N1YnByb2Nlc3MuQ3JlYXRlUGlwZShOb25lLCAwKQorICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gU1RET1VUOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gYzJwd3JpdGUKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzdGRlcnIsIGludCk6CisgICAgICAgICAgICAgICAgZXJyd3JpdGUgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShzdGRlcnIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQXNzdW1pbmcgZmlsZS1saWtlIG9iamVjdAorICAgICAgICAgICAgICAgIGVycndyaXRlID0gbXN2Y3J0LmdldF9vc2ZoYW5kbGUoc3RkZXJyLmZpbGVubygpKQorICAgICAgICAgICAgZXJyd3JpdGUgPSBzZWxmLl9tYWtlX2luaGVyaXRhYmxlKGVycndyaXRlKQorCisgICAgICAgICAgICByZXR1cm4gKHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUpCisKKworICAgICAgICBkZWYgX21ha2VfaW5oZXJpdGFibGUoc2VsZiwgaGFuZGxlKToKKyAgICAgICAgICAgICIiIlJldHVybiBhIGR1cGxpY2F0ZSBvZiBoYW5kbGUsIHdoaWNoIGlzIGluaGVyaXRhYmxlIiIiCisgICAgICAgICAgICByZXR1cm4gX3N1YnByb2Nlc3MuRHVwbGljYXRlSGFuZGxlKF9zdWJwcm9jZXNzLkdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgX3N1YnByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKSwgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N1YnByb2Nlc3MuRFVQTElDQVRFX1NBTUVfQUNDRVNTKQorCisKKyAgICAgICAgZGVmIF9maW5kX3c5eHBvcGVuKHNlbGYpOgorICAgICAgICAgICAgIiIiRmluZCBhbmQgcmV0dXJuIGFic29sdXQgcGF0aCB0byB3OXhwb3Blbi5leGUiIiIKKyAgICAgICAgICAgIHc5eHBvcGVuID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShfc3VicHJvY2Vzcy5HZXRNb2R1bGVGaWxlTmFtZSgwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidzl4cG9wZW4uZXhlIikKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh3OXhwb3Blbik6CisgICAgICAgICAgICAgICAgIyBFZWVrIC0gZmlsZS1ub3QtZm91bmQgLSBwb3NzaWJseSBhbiBlbWJlZGRpbmcKKyAgICAgICAgICAgICAgICAjIHNpdHVhdGlvbiAtIHNlZSBpZiB3ZSBjYW4gbG9jYXRlIGl0IGluIHN5cy5leGVjX3ByZWZpeAorICAgICAgICAgICAgICAgIHc5eHBvcGVuID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuZXhlY19wcmVmaXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3OXhwb3Blbi5leGUiKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh3OXhwb3Blbik6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IGxvY2F0ZSB3OXhwb3Blbi5leGUsIHdoaWNoIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkZWQgZm9yIFBvcGVuIHRvIHdvcmsgd2l0aCB5b3VyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaGVsbCBvciBwbGF0Zm9ybS4iKQorICAgICAgICAgICAgcmV0dXJuIHc5eHBvcGVuCisKKworICAgICAgICBkZWYgX2V4ZWN1dGVfY2hpbGQoc2VsZiwgYXJncywgZXhlY3V0YWJsZSwgcHJlZXhlY19mbiwgY2xvc2VfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLCBlbnYsIHVuaXZlcnNhbF9uZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLCBjcmVhdGlvbmZsYWdzLCBzaGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSk6CisgICAgICAgICAgICAiIiJFeGVjdXRlIHByb2dyYW0gKE1TIFdpbmRvd3MgdmVyc2lvbikiIiIKKworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYXJncywgdHlwZXMuU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgICAgIGFyZ3MgPSBsaXN0MmNtZGxpbmUoYXJncykKKworICAgICAgICAgICAgIyBQcm9jZXNzIHN0YXJ0dXAgZGV0YWlscworICAgICAgICAgICAgaWYgc3RhcnR1cGluZm8gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mbyA9IFNUQVJUVVBJTkZPKCkKKyAgICAgICAgICAgIGlmIE5vbmUgbm90IGluIChwMmNyZWFkLCBjMnB3cml0ZSwgZXJyd3JpdGUpOgorICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLmR3RmxhZ3MgfD0gX3N1YnByb2Nlc3MuU1RBUlRGX1VTRVNUREhBTkRMRVMKKyAgICAgICAgICAgICAgICBzdGFydHVwaW5mby5oU3RkSW5wdXQgPSBwMmNyZWFkCisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uaFN0ZE91dHB1dCA9IGMycHdyaXRlCisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uaFN0ZEVycm9yID0gZXJyd3JpdGUKKworICAgICAgICAgICAgaWYgc2hlbGw6CisgICAgICAgICAgICAgICAgc3RhcnR1cGluZm8uZHdGbGFncyB8PSBfc3VicHJvY2Vzcy5TVEFSVEZfVVNFU0hPV1dJTkRPVworICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLndTaG93V2luZG93ID0gX3N1YnByb2Nlc3MuU1dfSElERQorICAgICAgICAgICAgICAgIGNvbXNwZWMgPSBvcy5lbnZpcm9uLmdldCgiQ09NU1BFQyIsICJjbWQuZXhlIikKKyAgICAgICAgICAgICAgICBhcmdzID0gJ3t9IC9jICJ7fSInLmZvcm1hdCAoY29tc3BlYywgYXJncykKKyAgICAgICAgICAgICAgICBpZiAoX3N1YnByb2Nlc3MuR2V0VmVyc2lvbigpID49IDB4ODAwMDAwMDAgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoY29tc3BlYykubG93ZXIoKSA9PSAiY29tbWFuZC5jb20iKToKKyAgICAgICAgICAgICAgICAgICAgIyBXaW45eCwgb3IgdXNpbmcgY29tbWFuZC5jb20gb24gTlQuIFdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgIyB1c2UgdGhlIHc5eHBvcGVuIGludGVybWVkaWF0ZSBwcm9ncmFtLiBGb3IgbW9yZQorICAgICAgICAgICAgICAgICAgICAjIGluZm9ybWF0aW9uLCBzZWUgS0IgUTE1MDk1NgorICAgICAgICAgICAgICAgICAgICAjIChodHRwOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDAxMTEwNTA4NDAwMi9odHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL3N1cHBvcnQva2IvYXJ0aWNsZXMvUTE1MC85LzU2LmFzcCkKKyAgICAgICAgICAgICAgICAgICAgdzl4cG9wZW4gPSBzZWxmLl9maW5kX3c5eHBvcGVuKCkKKyAgICAgICAgICAgICAgICAgICAgYXJncyA9ICciJXMiICVzJyAlICh3OXhwb3BlbiwgYXJncykKKyAgICAgICAgICAgICAgICAgICAgIyBOb3QgcGFzc2luZyBDUkVBVEVfTkVXX0NPTlNPTEUgaGFzIGJlZW4ga25vd24gdG8KKyAgICAgICAgICAgICAgICAgICAgIyBjYXVzZSByYW5kb20gZmFpbHVyZXMgb24gd2luOXguICBTcGVjaWZpY2FsbHkgYQorICAgICAgICAgICAgICAgICAgICAjIGRpYWxvZzogIllvdXIgcHJvZ3JhbSBhY2Nlc3NlZCBtZW0gY3VycmVudGx5IGluCisgICAgICAgICAgICAgICAgICAgICMgdXNlIGF0IHh4eCIgYW5kIGEgaG9wZWZ1bCB3YXJuaW5nIGFib3V0IHRoZQorICAgICAgICAgICAgICAgICAgICAjIHN0YWJpbGl0eSBvZiB5b3VyIHN5c3RlbS4gIENvc3QgaXMgQ3RybCtDIHdvbnQKKyAgICAgICAgICAgICAgICAgICAgIyBraWxsIGNoaWxkcmVuLgorICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbmZsYWdzIHw9IF9zdWJwcm9jZXNzLkNSRUFURV9ORVdfQ09OU09MRQorCisgICAgICAgICAgICAjIFN0YXJ0IHRoZSBwcm9jZXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaHAsIGh0LCBwaWQsIHRpZCA9IF9zdWJwcm9jZXNzLkNyZWF0ZVByb2Nlc3MoZXhlY3V0YWJsZSwgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBubyBzcGVjaWFsIHNlY3VyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludChub3QgY2xvc2VfZmRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvKQorICAgICAgICAgICAgZXhjZXB0IHB5d2ludHlwZXMuZXJyb3IsIGU6CisgICAgICAgICAgICAgICAgIyBUcmFuc2xhdGUgcHl3aW50eXBlcy5lcnJvciB0byBXaW5kb3dzRXJyb3IsIHdoaWNoIGlzCisgICAgICAgICAgICAgICAgIyBhIHN1YmNsYXNzIG9mIE9TRXJyb3IuICBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseQorICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIGVycm5vIHVzaW5nIF9zeXNfZXJybGlzdCAob3Igc2ltaWxhciksIGJ1dAorICAgICAgICAgICAgICAgICMgaG93IGNhbiB0aGlzIGJlIGRvbmUgZnJvbSBQeXRob24/CisgICAgICAgICAgICAgICAgcmFpc2UgV2luZG93c0Vycm9yKCplLmFyZ3MpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICMgQ2hpbGQgaXMgbGF1bmNoZWQuIENsb3NlIHRoZSBwYXJlbnQncyBjb3B5IG9mIHRob3NlIHBpcGUKKyAgICAgICAgICAgICAgICAjIGhhbmRsZXMgdGhhdCBvbmx5IHRoZSBjaGlsZCBzaG91bGQgaGF2ZSBvcGVuLiAgWW91IG5lZWQKKyAgICAgICAgICAgICAgICAjIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIGhhbmRsZXMgdG8gdGhlIHdyaXRlIGVuZCBvZiB0aGUKKyAgICAgICAgICAgICAgICAjIG91dHB1dCBwaXBlIGFyZSBtYWludGFpbmVkIGluIHRoaXMgcHJvY2VzcyBvciBlbHNlIHRoZQorICAgICAgICAgICAgICAgICMgcGlwZSB3aWxsIG5vdCBjbG9zZSB3aGVuIHRoZSBjaGlsZCBwcm9jZXNzIGV4aXRzIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAjIFJlYWRGaWxlIHdpbGwgaGFuZy4KKyAgICAgICAgICAgICAgICBpZiBwMmNyZWFkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwMmNyZWFkLkNsb3NlKCkKKyAgICAgICAgICAgICAgICBpZiBjMnB3cml0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgYzJwd3JpdGUuQ2xvc2UoKQorICAgICAgICAgICAgICAgIGlmIGVycndyaXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBlcnJ3cml0ZS5DbG9zZSgpCisKKyAgICAgICAgICAgICMgUmV0YWluIHRoZSBwcm9jZXNzIGhhbmRsZSwgYnV0IGNsb3NlIHRoZSB0aHJlYWQgaGFuZGxlCisgICAgICAgICAgICBzZWxmLl9jaGlsZF9jcmVhdGVkID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5faGFuZGxlID0gaHAKKyAgICAgICAgICAgIHNlbGYucGlkID0gcGlkCisgICAgICAgICAgICBodC5DbG9zZSgpCisKKyAgICAgICAgZGVmIF9pbnRlcm5hbF9wb2xsKHNlbGYsIF9kZWFkc3RhdGU9Tm9uZSwKKyAgICAgICAgICAgICAgICBfV2FpdEZvclNpbmdsZU9iamVjdD1fc3VicHJvY2Vzcy5XYWl0Rm9yU2luZ2xlT2JqZWN0LAorICAgICAgICAgICAgICAgIF9XQUlUX09CSkVDVF8wPV9zdWJwcm9jZXNzLldBSVRfT0JKRUNUXzAsCisgICAgICAgICAgICAgICAgX0dldEV4aXRDb2RlUHJvY2Vzcz1fc3VicHJvY2Vzcy5HZXRFeGl0Q29kZVByb2Nlc3MpOgorICAgICAgICAgICAgIiIiQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLgorCisgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgX19kZWxfXywgc28gaXQgY2FuIG9ubHkgcmVmZXIgdG8gb2JqZWN0cworICAgICAgICAgICAgaW4gaXRzIGxvY2FsIHNjb3BlLgorCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIF9XYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYuX2hhbmRsZSwgMCkgPT0gX1dBSVRfT0JKRUNUXzA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IF9HZXRFeGl0Q29kZVByb2Nlc3Moc2VsZi5faGFuZGxlKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQorCisKKyAgICAgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgICAgICAiIiJXYWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLiIiIgorICAgICAgICAgICAgaWYgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgX3N1YnByb2Nlc3MuV2FpdEZvclNpbmdsZU9iamVjdChzZWxmLl9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3VicHJvY2Vzcy5JTkZJTklURSkKKyAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBfc3VicHJvY2Vzcy5HZXRFeGl0Q29kZVByb2Nlc3Moc2VsZi5faGFuZGxlKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQorCisKKyAgICAgICAgZGVmIF9yZWFkZXJ0aHJlYWQoc2VsZiwgZmgsIGJ1ZmZlcik6CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGZoLnJlYWQoKSkKKworCisgICAgICAgIGRlZiBfY29tbXVuaWNhdGUoc2VsZiwgaW5wdXQpOgorICAgICAgICAgICAgc3Rkb3V0ID0gTm9uZSAjIFJldHVybgorICAgICAgICAgICAgc3RkZXJyID0gTm9uZSAjIFJldHVybgorCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzdGRvdXQgPSBbXQorICAgICAgICAgICAgICAgIHN0ZG91dF90aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLl9yZWFkZXJ0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oc2VsZi5zdGRvdXQsIHN0ZG91dCkpCisgICAgICAgICAgICAgICAgc3Rkb3V0X3RocmVhZC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgICAgICAgICBzdGRvdXRfdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9IFtdCisgICAgICAgICAgICAgICAgc3RkZXJyX3RocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuX3JlYWRlcnRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShzZWxmLnN0ZGVyciwgc3RkZXJyKSkKKyAgICAgICAgICAgICAgICBzdGRlcnJfdGhyZWFkLnNldERhZW1vbihUcnVlKQorICAgICAgICAgICAgICAgIHN0ZGVycl90aHJlYWQuc3RhcnQoKQorCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluOgorICAgICAgICAgICAgICAgIGlmIGlucHV0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLndyaXRlKGlucHV0KQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FUElQRToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorCisgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dDoKKyAgICAgICAgICAgICAgICBzdGRvdXRfdGhyZWFkLmpvaW4oKQorICAgICAgICAgICAgaWYgc2VsZi5zdGRlcnI6CisgICAgICAgICAgICAgICAgc3RkZXJyX3RocmVhZC5qb2luKCkKKworICAgICAgICAgICAgIyBBbGwgZGF0YSBleGNoYW5nZWQuICBUcmFuc2xhdGUgbGlzdHMgaW50byBzdHJpbmdzLgorICAgICAgICAgICAgaWYgc3Rkb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0ZG91dCA9IHN0ZG91dFswXQorICAgICAgICAgICAgaWYgc3RkZXJyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9IHN0ZGVyclswXQorCisgICAgICAgICAgICAjIFRyYW5zbGF0ZSBuZXdsaW5lcywgaWYgcmVxdWVzdGVkLiAgV2UgY2Fubm90IGxldCB0aGUgZmlsZQorICAgICAgICAgICAgIyBvYmplY3QgZG8gdGhlIHRyYW5zbGF0aW9uOiBJdCBpcyBiYXNlZCBvbiBzdGRpbywgd2hpY2ggaXMKKyAgICAgICAgICAgICMgaW1wb3NzaWJsZSB0byBjb21iaW5lIHdpdGggc2VsZWN0ICh1bmxlc3MgZm9yY2luZyBubworICAgICAgICAgICAgIyBidWZmZXJpbmcpLgorICAgICAgICAgICAgaWYgc2VsZi51bml2ZXJzYWxfbmV3bGluZXMgYW5kIGhhc2F0dHIoZmlsZSwgJ25ld2xpbmVzJyk6CisgICAgICAgICAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgICAgICAgICBzdGRvdXQgPSBzZWxmLl90cmFuc2xhdGVfbmV3bGluZXMoc3Rkb3V0KQorICAgICAgICAgICAgICAgIGlmIHN0ZGVycjoKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZGVycikKKworICAgICAgICAgICAgc2VsZi53YWl0KCkKKyAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCisKKyAgICAgICAgZGVmIHNlbmRfc2lnbmFsKHNlbGYsIHNpZyk6CisgICAgICAgICAgICAiIiJTZW5kIGEgc2lnbmFsIHRvIHRoZSBwcm9jZXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIHNpZyA9PSBzaWduYWwuU0lHVEVSTToKKyAgICAgICAgICAgICAgICBzZWxmLnRlcm1pbmF0ZSgpCisgICAgICAgICAgICBlbGlmIHNpZyA9PSBzaWduYWwuQ1RSTF9DX0VWRU5UOgorICAgICAgICAgICAgICAgIG9zLmtpbGwoc2VsZi5waWQsIHNpZ25hbC5DVFJMX0NfRVZFTlQpCisgICAgICAgICAgICBlbGlmIHNpZyA9PSBzaWduYWwuQ1RSTF9CUkVBS19FVkVOVDoKKyAgICAgICAgICAgICAgICBvcy5raWxsKHNlbGYucGlkLCBzaWduYWwuQ1RSTF9CUkVBS19FVkVOVCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVW5zdXBwb3J0ZWQgc2lnbmFsOiB7fSIuZm9ybWF0KHNpZykpCisKKyAgICAgICAgZGVmIHRlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgICAgICIiIlRlcm1pbmF0ZXMgdGhlIHByb2Nlc3MKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9zdWJwcm9jZXNzLlRlcm1pbmF0ZVByb2Nlc3Moc2VsZi5faGFuZGxlLCAxKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAjIEVSUk9SX0FDQ0VTU19ERU5JRUQgKHdpbmVycm9yIDUpIGlzIHJlY2VpdmVkIHdoZW4gdGhlCisgICAgICAgICAgICAgICAgIyBwcm9jZXNzIGFscmVhZHkgZGllZC4KKyAgICAgICAgICAgICAgICBpZiBlLndpbmVycm9yICE9IDU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgcmMgPSBfc3VicHJvY2Vzcy5HZXRFeGl0Q29kZVByb2Nlc3Moc2VsZi5faGFuZGxlKQorICAgICAgICAgICAgICAgIGlmIHJjID09IF9zdWJwcm9jZXNzLlNUSUxMX0FDVElWRToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSByYworCisgICAgICAgIGtpbGwgPSB0ZXJtaW5hdGUKKworICAgIGVsc2U6CisgICAgICAgICMKKyAgICAgICAgIyBQT1NJWCBtZXRob2RzCisgICAgICAgICMKKyAgICAgICAgZGVmIF9nZXRfaGFuZGxlcyhzZWxmLCBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIpOgorICAgICAgICAgICAgIiIiQ29uc3RydWN0IGFuZCByZXR1cm4gdHVwbGUgd2l0aCBJTyBvYmplY3RzOgorICAgICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUsIGMycHJlYWQsIGMycHdyaXRlLCBlcnJyZWFkLCBlcnJ3cml0ZQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBwMmNyZWFkLCBwMmN3cml0ZSA9IE5vbmUsIE5vbmUKKyAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gTm9uZSwgTm9uZQorICAgICAgICAgICAgZXJycmVhZCwgZXJyd3JpdGUgPSBOb25lLCBOb25lCisKKyAgICAgICAgICAgIGlmIHN0ZGluIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBzdGRpbiA9PSBQSVBFOgorICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gc2VsZi5waXBlX2Nsb2V4ZWMoKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN0ZGluLCBpbnQpOgorICAgICAgICAgICAgICAgIHAyY3JlYWQgPSBzdGRpbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEFzc3VtaW5nIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgICAgICAgICBwMmNyZWFkID0gc3RkaW4uZmlsZW5vKCkKKworICAgICAgICAgICAgaWYgc3Rkb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBzdGRvdXQgPT0gUElQRToKKyAgICAgICAgICAgICAgICBjMnByZWFkLCBjMnB3cml0ZSA9IHNlbGYucGlwZV9jbG9leGVjKCkKKyAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzdGRvdXQsIGludCk6CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBzdGRvdXQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBc3N1bWluZyBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgICAgICAgICAgYzJwd3JpdGUgPSBzdGRvdXQuZmlsZW5vKCkKKworICAgICAgICAgICAgaWYgc3RkZXJyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBzdGRlcnIgPT0gUElQRToKKyAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSA9IHNlbGYucGlwZV9jbG9leGVjKCkKKyAgICAgICAgICAgIGVsaWYgc3RkZXJyID09IFNURE9VVDoKKyAgICAgICAgICAgICAgICBlcnJ3cml0ZSA9IGMycHdyaXRlCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3RkZXJyLCBpbnQpOgorICAgICAgICAgICAgICAgIGVycndyaXRlID0gc3RkZXJyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQXNzdW1pbmcgZmlsZS1saWtlIG9iamVjdAorICAgICAgICAgICAgICAgIGVycndyaXRlID0gc3RkZXJyLmZpbGVubygpCisKKyAgICAgICAgICAgIHJldHVybiAocDJjcmVhZCwgcDJjd3JpdGUsCisgICAgICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkKKworCisgICAgICAgIGRlZiBfc2V0X2Nsb2V4ZWNfZmxhZyhzZWxmLCBmZCwgY2xvZXhlYz1UcnVlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbG9leGVjX2ZsYWcgPSBmY250bC5GRF9DTE9FWEVDCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgY2xvZXhlY19mbGFnID0gMQorCisgICAgICAgICAgICBvbGQgPSBmY250bC5mY250bChmZCwgZmNudGwuRl9HRVRGRCkKKyAgICAgICAgICAgIGlmIGNsb2V4ZWM6CisgICAgICAgICAgICAgICAgZmNudGwuZmNudGwoZmQsIGZjbnRsLkZfU0VURkQsIG9sZCB8IGNsb2V4ZWNfZmxhZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmNudGwuZmNudGwoZmQsIGZjbnRsLkZfU0VURkQsIG9sZCAmIH5jbG9leGVjX2ZsYWcpCisKKworICAgICAgICBkZWYgcGlwZV9jbG9leGVjKHNlbGYpOgorICAgICAgICAgICAgIiIiQ3JlYXRlIGEgcGlwZSB3aXRoIEZEcyBzZXQgQ0xPRVhFQy4iIiIKKyAgICAgICAgICAgICMgUGlwZXMnIEZEcyBhcmUgc2V0IENMT0VYRUMgYnkgZGVmYXVsdCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlbQorICAgICAgICAgICAgIyB0byBiZSBpbmhlcml0ZWQgYnkgb3RoZXIgc3VicHJvY2Vzc2VzOiB0aGUgQ0xPRVhFQyBmbGFnIGlzIHJlbW92ZWQKKyAgICAgICAgICAgICMgZnJvbSB0aGUgY2hpbGQncyBGRHMgYnkgX2R1cDIoKSwgYmV0d2VlbiBmb3JrKCkgYW5kIGV4ZWMoKS4KKyAgICAgICAgICAgICMgVGhpcyBpcyBub3QgYXRvbWljOiB3ZSB3b3VsZCBuZWVkIHRoZSBwaXBlMigpIHN5c2NhbGwgZm9yIHRoYXQuCisgICAgICAgICAgICByLCB3ID0gb3MucGlwZSgpCisgICAgICAgICAgICBzZWxmLl9zZXRfY2xvZXhlY19mbGFnKHIpCisgICAgICAgICAgICBzZWxmLl9zZXRfY2xvZXhlY19mbGFnKHcpCisgICAgICAgICAgICByZXR1cm4gciwgdworCisKKyAgICAgICAgZGVmIF9jbG9zZV9mZHMoc2VsZiwgYnV0KToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICdjbG9zZXJhbmdlJyk6CisgICAgICAgICAgICAgICAgb3MuY2xvc2VyYW5nZSgzLCBidXQpCisgICAgICAgICAgICAgICAgb3MuY2xvc2VyYW5nZShidXQgKyAxLCBNQVhGRCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDMsIE1BWEZEKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaSA9PSBidXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShpKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICAgICBkZWYgX2V4ZWN1dGVfY2hpbGQoc2VsZiwgYXJncywgZXhlY3V0YWJsZSwgcHJlZXhlY19mbiwgY2xvc2VfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3dkLCBlbnYsIHVuaXZlcnNhbF9uZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLCBjcmVhdGlvbmZsYWdzLCBzaGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSk6CisgICAgICAgICAgICAiIiJFeGVjdXRlIHByb2dyYW0gKFBPU0lYIHZlcnNpb24pIiIiCisKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgdHlwZXMuU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgICAgIGFyZ3MgPSBbYXJnc10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXJncyA9IGxpc3QoYXJncykKKworICAgICAgICAgICAgaWYgc2hlbGw6CisgICAgICAgICAgICAgICAgYXJncyA9IFsiL2Jpbi9zaCIsICItYyJdICsgYXJncworICAgICAgICAgICAgICAgIGlmIGV4ZWN1dGFibGU6CisgICAgICAgICAgICAgICAgICAgIGFyZ3NbMF0gPSBleGVjdXRhYmxlCisKKyAgICAgICAgICAgIGlmIGV4ZWN1dGFibGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gYXJnc1swXQorCisgICAgICAgICAgICAjIEZvciB0cmFuc2ZlcnJpbmcgcG9zc2libGUgZXhlYyBmYWlsdXJlIGZyb20gY2hpbGQgdG8gcGFyZW50CisgICAgICAgICAgICAjIFRoZSBmaXJzdCBjaGFyIHNwZWNpZmllcyB0aGUgZXhjZXB0aW9uIHR5cGU6IDAgbWVhbnMKKyAgICAgICAgICAgICMgT1NFcnJvciwgMSBtZWFucyBzb21lIG90aGVyIGVycm9yLgorICAgICAgICAgICAgZXJycGlwZV9yZWFkLCBlcnJwaXBlX3dyaXRlID0gc2VsZi5waXBlX2Nsb2V4ZWMoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZ2Nfd2FzX2VuYWJsZWQgPSBnYy5pc2VuYWJsZWQoKQorICAgICAgICAgICAgICAgICAgICAjIERpc2FibGUgZ2MgdG8gYXZvaWQgYnVnIHdoZXJlIGdjIC0+IGZpbGVfZGVhbGxvYyAtPgorICAgICAgICAgICAgICAgICAgICAjIHdyaXRlIHRvIHN0ZGVyciAtPiBoYW5nLiAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEzMzYKKyAgICAgICAgICAgICAgICAgICAgZ2MuZGlzYWJsZSgpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGdjX3dhc19lbmFibGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdjLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jaGlsZF9jcmVhdGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBpZCA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGlsZAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2xvc2UgcGFyZW50J3MgcGlwZSBlbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcDJjd3JpdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKHAyY3dyaXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGMycHJlYWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGMycHJlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJycmVhZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJycmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShlcnJwaXBlX3JlYWQpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFdoZW4gZHVwaW5nIGZkcywgaWYgdGhlcmUgYXJpc2VzIGEgc2l0dWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGVyZSBvbmUgb2YgdGhlIGZkcyBpcyBlaXRoZXIgMCwgMSBvciAyLCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgaXMgcG9zc2libGUgdGhhdCBpdCBpcyBvdmVyd3JpdHRlbiAoIzEyNjA3KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjMnB3cml0ZSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMnB3cml0ZSA9IG9zLmR1cChjMnB3cml0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnJ3cml0ZSA9PSAwIG9yIGVycndyaXRlID09IDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycndyaXRlID0gb3MuZHVwKGVycndyaXRlKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBEdXAgZmRzIGZvciBjaGlsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZiBfZHVwMihhLCBiKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkdXAyKCkgcmVtb3ZlcyB0aGUgQ0xPRVhFQyBmbGFnIGJ1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdlIG11c3QgZG8gaXQgb3Vyc2VsdmVzIGlmIGR1cDIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvdWxkIGJlIGEgbm8tb3AgKGlzc3VlICMxMDgwNikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGEgPT0gYjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NldF9jbG9leGVjX2ZsYWcoYSwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgYSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmR1cDIoYSwgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVwMihwMmNyZWFkLCAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdXAyKGMycHdyaXRlLCAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdXAyKGVycndyaXRlLCAyKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBwaXBlIGZkcy4gIE1ha2Ugc3VyZSB3ZSBkb24ndCBjbG9zZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNhbWUgZmQgbW9yZSB0aGFuIG9uY2UsIG9yIHN0YW5kYXJkIGZkcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWQgPSB7IE5vbmUgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmZCBpbiBbcDJjcmVhZCwgYzJwd3JpdGUsIGVycndyaXRlXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmQgbm90IGluIGNsb3NlZCBhbmQgZmQgPiAyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWQuYWRkKGZkKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBDbG9zZSBhbGwgb3RoZXIgZmRzLCBpZiBhc2tlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjbG9zZV9mZHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Nsb3NlX2ZkcyhidXQ9ZXJycGlwZV93cml0ZSkKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGN3ZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgcHJlZXhlY19mbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZXhlY19mbigpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZXhlY3ZwKGV4ZWN1dGFibGUsIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZXhlY3ZwZShleGVjdXRhYmxlLCBhcmdzLCBlbnYpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTYXZlIHRoZSB0cmFjZWJhY2sgYW5kIGF0dGFjaCBpdCB0byB0aGUgZXhjZXB0aW9uIG9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y19saW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKGV4Y190eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y192YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfdmFsdWUuY2hpbGRfdHJhY2ViYWNrID0gJycuam9pbihleGNfbGluZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Mud3JpdGUoZXJycGlwZV93cml0ZSwgcGlja2xlLmR1bXBzKGV4Y192YWx1ZSkpCisKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBleGl0Y29kZSB3b24ndCBiZSByZXBvcnRlZCB0byBhcHBsaWNhdGlvbnMsIHNvIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAjIHJlYWxseSBkb2Vzbid0IG1hdHRlciB3aGF0IHdlIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KDI1NSkKKworICAgICAgICAgICAgICAgICAgICAjIFBhcmVudAorICAgICAgICAgICAgICAgICAgICBpZiBnY193YXNfZW5hYmxlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdjLmVuYWJsZSgpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgIyBiZSBzdXJlIHRoZSBGRCBpcyBjbG9zZWQgbm8gbWF0dGVyIHdoYXQKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJycGlwZV93cml0ZSkKKworICAgICAgICAgICAgICAgIGlmIHAyY3JlYWQgaXMgbm90IE5vbmUgYW5kIHAyY3dyaXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShwMmNyZWFkKQorICAgICAgICAgICAgICAgIGlmIGMycHdyaXRlIGlzIG5vdCBOb25lIGFuZCBjMnByZWFkIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZShjMnB3cml0ZSkKKyAgICAgICAgICAgICAgICBpZiBlcnJ3cml0ZSBpcyBub3QgTm9uZSBhbmQgZXJycmVhZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoZXJyd3JpdGUpCisKKyAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIGV4ZWMgdG8gZmFpbCBvciBzdWNjZWVkOyBwb3NzaWJseSByYWlzaW5nIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICMgRXhjZXB0aW9uIGxpbWl0ZWQgdG8gMU0KKyAgICAgICAgICAgICAgICBkYXRhID0gX2VpbnRyX3JldHJ5X2NhbGwob3MucmVhZCwgZXJycGlwZV9yZWFkLCAxMDQ4NTc2KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAjIGJlIHN1cmUgdGhlIEZEIGlzIGNsb3NlZCBubyBtYXR0ZXIgd2hhdAorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGVycnBpcGVfcmVhZCkKKworICAgICAgICAgICAgaWYgZGF0YSAhPSAiIjoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIF9laW50cl9yZXRyeV9jYWxsKG9zLndhaXRwaWQsIHNlbGYucGlkLCAwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUNISUxEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBjaGlsZF9leGNlcHRpb24gPSBwaWNrbGUubG9hZHMoZGF0YSkKKyAgICAgICAgICAgICAgICByYWlzZSBjaGlsZF9leGNlcHRpb24KKworCisgICAgICAgIGRlZiBfaGFuZGxlX2V4aXRzdGF0dXMoc2VsZiwgc3RzLCBfV0lGU0lHTkFMRUQ9b3MuV0lGU0lHTkFMRUQsCisgICAgICAgICAgICAgICAgX1dURVJNU0lHPW9zLldURVJNU0lHLCBfV0lGRVhJVEVEPW9zLldJRkVYSVRFRCwKKyAgICAgICAgICAgICAgICBfV0VYSVRTVEFUVVM9b3MuV0VYSVRTVEFUVVMpOgorICAgICAgICAgICAgIyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgKGluZGlyZWN0bHkpIGJ5IF9fZGVsX18sIHNvIGl0IGNhbm5vdAorICAgICAgICAgICAgIyByZWZlciB0byBhbnl0aGluZyBvdXRzaWRlIG9mIGl0cyBsb2NhbCBzY29wZS4iIiIKKyAgICAgICAgICAgIGlmIF9XSUZTSUdOQUxFRChzdHMpOgorICAgICAgICAgICAgICAgIHNlbGYucmV0dXJuY29kZSA9IC1fV1RFUk1TSUcoc3RzKQorICAgICAgICAgICAgZWxpZiBfV0lGRVhJVEVEKHN0cyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gX1dFWElUU1RBVFVTKHN0cykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBTaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJVbmtub3duIGNoaWxkIGV4aXQgc3RhdHVzISIpCisKKworICAgICAgICBkZWYgX2ludGVybmFsX3BvbGwoc2VsZiwgX2RlYWRzdGF0ZT1Ob25lLCBfd2FpdHBpZD1vcy53YWl0cGlkLAorICAgICAgICAgICAgICAgIF9XTk9IQU5HPW9zLldOT0hBTkcsIF9vc19lcnJvcj1vcy5lcnJvciwgX0VDSElMRD1lcnJuby5FQ0hJTEQpOgorICAgICAgICAgICAgIiIiQ2hlY2sgaWYgY2hpbGQgcHJvY2VzcyBoYXMgdGVybWluYXRlZC4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLgorCisgICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgX19kZWxfXywgc28gaXQgY2Fubm90IHJlZmVyZW5jZSBhbnl0aGluZworICAgICAgICAgICAgb3V0c2lkZSBvZiB0aGUgbG9jYWwgc2NvcGUgKG5vciBjYW4gYW55IG1ldGhvZHMgaXQgY2FsbHMpLgorCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGlkLCBzdHMgPSBfd2FpdHBpZChzZWxmLnBpZCwgX1dOT0hBTkcpCisgICAgICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZV9leGl0c3RhdHVzKHN0cykKKyAgICAgICAgICAgICAgICBleGNlcHQgX29zX2Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIF9kZWFkc3RhdGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBfZGVhZHN0YXRlCisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gX0VDSElMRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBoYXBwZW5zIGlmIFNJR0NMRCBpcyBzZXQgdG8gYmUgaWdub3JlZCBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIyB3YWl0aW5nIGZvciBjaGlsZCBwcm9jZXNzZXMgaGFzIG90aGVyd2lzZSBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAjIGRpc2FibGVkIGZvciBvdXIgcHJvY2Vzcy4gIFRoaXMgY2hpbGQgaXMgZGVhZCwgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY2FuJ3QgZ2V0IHRoZSBzdGF0dXMuCisgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNTc1NgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gMAorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQorCisKKyAgICAgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgICAgICAiIiJXYWl0IGZvciBjaGlsZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZS4gIFJldHVybnMgcmV0dXJuY29kZQorICAgICAgICAgICAgYXR0cmlidXRlLiIiIgorICAgICAgICAgICAgd2hpbGUgc2VsZi5yZXR1cm5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWQsIHN0cyA9IF9laW50cl9yZXRyeV9jYWxsKG9zLndhaXRwaWQsIHNlbGYucGlkLCAwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUNISUxEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGhhcHBlbnMgaWYgU0lHQ0xEIGlzIHNldCB0byBiZSBpZ25vcmVkIG9yIHdhaXRpbmcKKyAgICAgICAgICAgICAgICAgICAgIyBmb3IgY2hpbGQgcHJvY2Vzc2VzIGhhcyBvdGhlcndpc2UgYmVlbiBkaXNhYmxlZCBmb3Igb3VyCisgICAgICAgICAgICAgICAgICAgICMgcHJvY2Vzcy4gIFRoaXMgY2hpbGQgaXMgZGVhZCwgd2UgY2FuJ3QgZ2V0IHRoZSBzdGF0dXMuCisgICAgICAgICAgICAgICAgICAgIHBpZCA9IHNlbGYucGlkCisgICAgICAgICAgICAgICAgICAgIHN0cyA9IDAKKyAgICAgICAgICAgICAgICAjIENoZWNrIHRoZSBwaWQgYW5kIGxvb3AgYXMgd2FpdHBpZCBoYXMgYmVlbiBrbm93biB0byByZXR1cm4KKyAgICAgICAgICAgICAgICAjIDAgZXZlbiB3aXRob3V0IFdOT0hBTkcgaW4gb2RkIHNpdHVhdGlvbnMuICBpc3N1ZTE0Mzk2LgorICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2V4aXRzdGF0dXMoc3RzKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQorCisKKyAgICAgICAgZGVmIF9jb21tdW5pY2F0ZShzZWxmLCBpbnB1dCk6CisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluOgorICAgICAgICAgICAgICAgICMgRmx1c2ggc3RkaW8gYnVmZmVyLiAgVGhpcyBtaWdodCBibG9jaywgaWYgdGhlIHVzZXIgaGFzCisgICAgICAgICAgICAgICAgIyBiZWVuIHdyaXRpbmcgdG8gLnN0ZGluIGluIGFuIHVuY29udHJvbGxlZCBmYXNoaW9uLgorICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uZmx1c2goKQorICAgICAgICAgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGRpbi5jbG9zZSgpCisKKyAgICAgICAgICAgIGlmIF9oYXNfcG9sbDoKKyAgICAgICAgICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHNlbGYuX2NvbW11bmljYXRlX3dpdGhfcG9sbChpbnB1dCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBzZWxmLl9jb21tdW5pY2F0ZV93aXRoX3NlbGVjdChpbnB1dCkKKworICAgICAgICAgICAgIyBBbGwgZGF0YSBleGNoYW5nZWQuICBUcmFuc2xhdGUgbGlzdHMgaW50byBzdHJpbmdzLgorICAgICAgICAgICAgaWYgc3Rkb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0ZG91dCA9ICcnLmpvaW4oc3Rkb3V0KQorICAgICAgICAgICAgaWYgc3RkZXJyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0ZGVyciA9ICcnLmpvaW4oc3RkZXJyKQorCisgICAgICAgICAgICAjIFRyYW5zbGF0ZSBuZXdsaW5lcywgaWYgcmVxdWVzdGVkLiAgV2UgY2Fubm90IGxldCB0aGUgZmlsZQorICAgICAgICAgICAgIyBvYmplY3QgZG8gdGhlIHRyYW5zbGF0aW9uOiBJdCBpcyBiYXNlZCBvbiBzdGRpbywgd2hpY2ggaXMKKyAgICAgICAgICAgICMgaW1wb3NzaWJsZSB0byBjb21iaW5lIHdpdGggc2VsZWN0ICh1bmxlc3MgZm9yY2luZyBubworICAgICAgICAgICAgIyBidWZmZXJpbmcpLgorICAgICAgICAgICAgaWYgc2VsZi51bml2ZXJzYWxfbmV3bGluZXMgYW5kIGhhc2F0dHIoZmlsZSwgJ25ld2xpbmVzJyk6CisgICAgICAgICAgICAgICAgaWYgc3Rkb3V0OgorICAgICAgICAgICAgICAgICAgICBzdGRvdXQgPSBzZWxmLl90cmFuc2xhdGVfbmV3bGluZXMoc3Rkb3V0KQorICAgICAgICAgICAgICAgIGlmIHN0ZGVycjoKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gc2VsZi5fdHJhbnNsYXRlX25ld2xpbmVzKHN0ZGVycikKKworICAgICAgICAgICAgc2VsZi53YWl0KCkKKyAgICAgICAgICAgIHJldHVybiAoc3Rkb3V0LCBzdGRlcnIpCisKKworICAgICAgICBkZWYgX2NvbW11bmljYXRlX3dpdGhfcG9sbChzZWxmLCBpbnB1dCk6CisgICAgICAgICAgICBzdGRvdXQgPSBOb25lICMgUmV0dXJuCisgICAgICAgICAgICBzdGRlcnIgPSBOb25lICMgUmV0dXJuCisgICAgICAgICAgICBmZDJmaWxlID0ge30KKyAgICAgICAgICAgIGZkMm91dHB1dCA9IHt9CisKKyAgICAgICAgICAgIHBvbGxlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgICAgIGRlZiByZWdpc3Rlcl9hbmRfYXBwZW5kKGZpbGVfb2JqLCBldmVudG1hc2spOgorICAgICAgICAgICAgICAgIHBvbGxlci5yZWdpc3RlcihmaWxlX29iai5maWxlbm8oKSwgZXZlbnRtYXNrKQorICAgICAgICAgICAgICAgIGZkMmZpbGVbZmlsZV9vYmouZmlsZW5vKCldID0gZmlsZV9vYmoKKworICAgICAgICAgICAgZGVmIGNsb3NlX3VucmVnaXN0ZXJfYW5kX3JlbW92ZShmZCk6CisgICAgICAgICAgICAgICAgcG9sbGVyLnVucmVnaXN0ZXIoZmQpCisgICAgICAgICAgICAgICAgZmQyZmlsZVtmZF0uY2xvc2UoKQorICAgICAgICAgICAgICAgIGZkMmZpbGUucG9wKGZkKQorCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGluIGFuZCBpbnB1dDoKKyAgICAgICAgICAgICAgICByZWdpc3Rlcl9hbmRfYXBwZW5kKHNlbGYuc3RkaW4sIHNlbGVjdC5QT0xMT1VUKQorCisgICAgICAgICAgICBzZWxlY3RfUE9MTElOX1BPTExQUkkgPSBzZWxlY3QuUE9MTElOIHwgc2VsZWN0LlBPTExQUkkKKyAgICAgICAgICAgIGlmIHNlbGYuc3Rkb3V0OgorICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2FuZF9hcHBlbmQoc2VsZi5zdGRvdXQsIHNlbGVjdF9QT0xMSU5fUE9MTFBSSSkKKyAgICAgICAgICAgICAgICBmZDJvdXRwdXRbc2VsZi5zdGRvdXQuZmlsZW5vKCldID0gc3Rkb3V0ID0gW10KKyAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyOgorICAgICAgICAgICAgICAgIHJlZ2lzdGVyX2FuZF9hcHBlbmQoc2VsZi5zdGRlcnIsIHNlbGVjdF9QT0xMSU5fUE9MTFBSSSkKKyAgICAgICAgICAgICAgICBmZDJvdXRwdXRbc2VsZi5zdGRlcnIuZmlsZW5vKCldID0gc3RkZXJyID0gW10KKworICAgICAgICAgICAgaW5wdXRfb2Zmc2V0ID0gMAorICAgICAgICAgICAgd2hpbGUgZmQyZmlsZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlYWR5ID0gcG9sbGVyLnBvbGwoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBzZWxlY3QuZXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuYXJnc1swXSA9PSBlcnJuby5FSU5UUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgICAgICAgICBmb3IgZmQsIG1vZGUgaW4gcmVhZHk6CisgICAgICAgICAgICAgICAgICAgIGlmIG1vZGUgJiBzZWxlY3QuUE9MTE9VVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rID0gaW5wdXRbaW5wdXRfb2Zmc2V0IDogaW5wdXRfb2Zmc2V0ICsgX1BJUEVfQlVGXQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X29mZnNldCArPSBvcy53cml0ZShmZCwgY2h1bmspCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRVBJUEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX3VucmVnaXN0ZXJfYW5kX3JlbW92ZShmZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnB1dF9vZmZzZXQgPj0gbGVuKGlucHV0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfdW5yZWdpc3Rlcl9hbmRfcmVtb3ZlKGZkKQorICAgICAgICAgICAgICAgICAgICBlbGlmIG1vZGUgJiBzZWxlY3RfUE9MTElOX1BPTExQUkk6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gb3MucmVhZChmZCwgNDA5NikKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX3VucmVnaXN0ZXJfYW5kX3JlbW92ZShmZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZkMm91dHB1dFtmZF0uYXBwZW5kKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAjIElnbm9yZSBoYW5nIHVwIG9yIGVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX3VucmVnaXN0ZXJfYW5kX3JlbW92ZShmZCkKKworICAgICAgICAgICAgcmV0dXJuIChzdGRvdXQsIHN0ZGVycikKKworCisgICAgICAgIGRlZiBfY29tbXVuaWNhdGVfd2l0aF9zZWxlY3Qoc2VsZiwgaW5wdXQpOgorICAgICAgICAgICAgcmVhZF9zZXQgPSBbXQorICAgICAgICAgICAgd3JpdGVfc2V0ID0gW10KKyAgICAgICAgICAgIHN0ZG91dCA9IE5vbmUgIyBSZXR1cm4KKyAgICAgICAgICAgIHN0ZGVyciA9IE5vbmUgIyBSZXR1cm4KKworICAgICAgICAgICAgaWYgc2VsZi5zdGRpbiBhbmQgaW5wdXQ6CisgICAgICAgICAgICAgICAgd3JpdGVfc2V0LmFwcGVuZChzZWxmLnN0ZGluKQorICAgICAgICAgICAgaWYgc2VsZi5zdGRvdXQ6CisgICAgICAgICAgICAgICAgcmVhZF9zZXQuYXBwZW5kKHNlbGYuc3Rkb3V0KQorICAgICAgICAgICAgICAgIHN0ZG91dCA9IFtdCisgICAgICAgICAgICBpZiBzZWxmLnN0ZGVycjoKKyAgICAgICAgICAgICAgICByZWFkX3NldC5hcHBlbmQoc2VsZi5zdGRlcnIpCisgICAgICAgICAgICAgICAgc3RkZXJyID0gW10KKworICAgICAgICAgICAgaW5wdXRfb2Zmc2V0ID0gMAorICAgICAgICAgICAgd2hpbGUgcmVhZF9zZXQgb3Igd3JpdGVfc2V0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmxpc3QsIHdsaXN0LCB4bGlzdCA9IHNlbGVjdC5zZWxlY3QocmVhZF9zZXQsIHdyaXRlX3NldCwgW10pCisgICAgICAgICAgICAgICAgZXhjZXB0IHNlbGVjdC5lcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZS5hcmdzWzBdID09IGVycm5vLkVJTlRSOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RkaW4gaW4gd2xpc3Q6CisgICAgICAgICAgICAgICAgICAgIGNodW5rID0gaW5wdXRbaW5wdXRfb2Zmc2V0IDogaW5wdXRfb2Zmc2V0ICsgX1BJUEVfQlVGXQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc193cml0dGVuID0gb3Mud3JpdGUoc2VsZi5zdGRpbi5maWxlbm8oKSwgY2h1bmspCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVQSVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkaW4uY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlX3NldC5yZW1vdmUoc2VsZi5zdGRpbikKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X29mZnNldCArPSBieXRlc193cml0dGVuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbnB1dF9vZmZzZXQgPj0gbGVuKGlucHV0KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9zZXQucmVtb3ZlKHNlbGYuc3RkaW4pCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnN0ZG91dCBpbiBybGlzdDoKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG9zLnJlYWQoc2VsZi5zdGRvdXQuZmlsZW5vKCksIDEwMjQpCisgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0ZG91dC5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX3NldC5yZW1vdmUoc2VsZi5zdGRvdXQpCisgICAgICAgICAgICAgICAgICAgIHN0ZG91dC5hcHBlbmQoZGF0YSkKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuc3RkZXJyIGluIHJsaXN0OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gb3MucmVhZChzZWxmLnN0ZGVyci5maWxlbm8oKSwgMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGF0YSA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfc2V0LnJlbW92ZShzZWxmLnN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyLmFwcGVuZChkYXRhKQorCisgICAgICAgICAgICByZXR1cm4gKHN0ZG91dCwgc3RkZXJyKQorCisKKyAgICAgICAgZGVmIHNlbmRfc2lnbmFsKHNlbGYsIHNpZyk6CisgICAgICAgICAgICAiIiJTZW5kIGEgc2lnbmFsIHRvIHRoZSBwcm9jZXNzCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIG9zLmtpbGwoc2VsZi5waWQsIHNpZykKKworICAgICAgICBkZWYgdGVybWluYXRlKHNlbGYpOgorICAgICAgICAgICAgIiIiVGVybWluYXRlIHRoZSBwcm9jZXNzIHdpdGggU0lHVEVSTQorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBzZWxmLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdURVJNKQorCisgICAgICAgIGRlZiBraWxsKHNlbGYpOgorICAgICAgICAgICAgIiIiS2lsbCB0aGUgcHJvY2VzcyB3aXRoIFNJR0tJTEwKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgc2VsZi5zZW5kX3NpZ25hbChzaWduYWwuU0lHS0lMTCkKKworCitkZWYgX2RlbW9fcG9zaXgoKToKKyAgICAjCisgICAgIyBFeGFtcGxlIDE6IFNpbXBsZSByZWRpcmVjdGlvbjogR2V0IHByb2Nlc3MgbGlzdAorICAgICMKKyAgICBwbGlzdCA9IFBvcGVuKFsicHMiXSwgc3Rkb3V0PVBJUEUpLmNvbW11bmljYXRlKClbMF0KKyAgICBwcmludCAiUHJvY2VzcyBsaXN0OiIKKyAgICBwcmludCBwbGlzdAorCisgICAgIworICAgICMgRXhhbXBsZSAyOiBDaGFuZ2UgdWlkIGJlZm9yZSBleGVjdXRpbmcgY2hpbGQKKyAgICAjCisgICAgaWYgb3MuZ2V0dWlkKCkgPT0gMDoKKyAgICAgICAgcCA9IFBvcGVuKFsiaWQiXSwgcHJlZXhlY19mbj1sYW1iZGE6IG9zLnNldHVpZCgxMDApKQorICAgICAgICBwLndhaXQoKQorCisgICAgIworICAgICMgRXhhbXBsZSAzOiBDb25uZWN0aW5nIHNldmVyYWwgc3VicHJvY2Vzc2VzCisgICAgIworICAgIHByaW50ICJMb29raW5nIGZvciAnaGRhJy4uLiIKKyAgICBwMSA9IFBvcGVuKFsiZG1lc2ciXSwgc3Rkb3V0PVBJUEUpCisgICAgcDIgPSBQb3BlbihbImdyZXAiLCAiaGRhIl0sIHN0ZGluPXAxLnN0ZG91dCwgc3Rkb3V0PVBJUEUpCisgICAgcHJpbnQgcmVwcihwMi5jb21tdW5pY2F0ZSgpWzBdKQorCisgICAgIworICAgICMgRXhhbXBsZSA0OiBDYXRjaCBleGVjdXRpb24gZXJyb3IKKyAgICAjCisgICAgcHJpbnQKKyAgICBwcmludCAiVHJ5aW5nIGEgd2VpcmQgZmlsZS4uLiIKKyAgICB0cnk6CisgICAgICAgIHByaW50IFBvcGVuKFsiL3RoaXMvcGF0aC9kb2VzL25vdC9leGlzdCJdKS5jb21tdW5pY2F0ZSgpCisgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgcHJpbnQgIlRoZSBmaWxlIGRpZG4ndCBleGlzdC4gIEkgdGhvdWdodCBzby4uLiIKKyAgICAgICAgICAgIHByaW50ICJDaGlsZCB0cmFjZWJhY2s6IgorICAgICAgICAgICAgcHJpbnQgZS5jaGlsZF90cmFjZWJhY2sKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJFcnJvciIsIGUuZXJybm8KKyAgICBlbHNlOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJHb3NoLiAgTm8gZXJyb3IuIgorCisKK2RlZiBfZGVtb193aW5kb3dzKCk6CisgICAgIworICAgICMgRXhhbXBsZSAxOiBDb25uZWN0aW5nIHNldmVyYWwgc3VicHJvY2Vzc2VzCisgICAgIworICAgIHByaW50ICJMb29raW5nIGZvciAnUFJPTVBUJyBpbiBzZXQgb3V0cHV0Li4uIgorICAgIHAxID0gUG9wZW4oInNldCIsIHN0ZG91dD1QSVBFLCBzaGVsbD1UcnVlKQorICAgIHAyID0gUG9wZW4oJ2ZpbmQgIlBST01QVCInLCBzdGRpbj1wMS5zdGRvdXQsIHN0ZG91dD1QSVBFKQorICAgIHByaW50IHJlcHIocDIuY29tbXVuaWNhdGUoKVswXSkKKworICAgICMKKyAgICAjIEV4YW1wbGUgMjogU2ltcGxlIGV4ZWN1dGlvbiBvZiBwcm9ncmFtCisgICAgIworICAgIHByaW50ICJFeGVjdXRpbmcgY2FsYy4uLiIKKyAgICBwID0gUG9wZW4oImNhbGMiKQorICAgIHAud2FpdCgpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBpZiBtc3dpbmRvd3M6CisgICAgICAgIF9kZW1vX3dpbmRvd3MoKQorICAgIGVsc2U6CisgICAgICAgIF9kZW1vX3Bvc2l4KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3VicHJvY2Vzcy5weWMgYi9saWIvcHl0aG9uMi43L3N1YnByb2Nlc3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTE4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N1YnByb2Nlc3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3VicHJvY2Vzcy5weW8gYi9saWIvcHl0aG9uMi43L3N1YnByb2Nlc3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNTE4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N1YnByb2Nlc3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3VuYXUucHkgYi9saWIvcHl0aG9uMi43L3N1bmF1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNGQ4YzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N1bmF1LnB5CkBAIC0wLDAgKzEsNDc1IEBACisiIiJTdHVmZiB0byBwYXJzZSBTdW4gYW5kIE5lWFQgYXVkaW8gZmlsZXMuCisKK0FuIGF1ZGlvIGZpbGUgY29uc2lzdHMgb2YgYSBoZWFkZXIgZm9sbG93ZWQgYnkgdGhlIGRhdGEuICBUaGUgc3RydWN0dXJlCitvZiB0aGUgaGVhZGVyIGlzIGFzIGZvbGxvd3MuCisKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBtYWdpYyB3b3JkICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBoZWFkZXIgc2l6ZSAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBkYXRhIHNpemUgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBlbmNvZGluZyAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBzYW1wbGUgcmF0ZSAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCAjIG9mIGNoYW5uZWxzIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAgfCBpbmZvICAgICAgICAgIHwKKyAgICAgICAgfCAgICAgICAgICAgICAgIHwKKyAgICAgICAgKy0tLS0tLS0tLS0tLS0tLSsKKworVGhlIG1hZ2ljIHdvcmQgY29uc2lzdHMgb2YgdGhlIDQgY2hhcmFjdGVycyAnLnNuZCcuICBBcGFydCBmcm9tIHRoZQoraW5mbyBmaWVsZCwgYWxsIGhlYWRlciBmaWVsZHMgYXJlIDQgYnl0ZXMgaW4gc2l6ZS4gIFRoZXkgYXJlIGFsbAorMzItYml0IHVuc2lnbmVkIGludGVnZXJzIGVuY29kZWQgaW4gYmlnLWVuZGlhbiBieXRlIG9yZGVyLgorCitUaGUgaGVhZGVyIHNpemUgcmVhbGx5IGdpdmVzIHRoZSBzdGFydCBvZiB0aGUgZGF0YS4KK1RoZSBkYXRhIHNpemUgaXMgdGhlIHBoeXNpY2FsIHNpemUgb2YgdGhlIGRhdGEuICBGcm9tIHRoZSBvdGhlcgorcGFyYW1ldGVycyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBjYW4gYmUgY2FsY3VsYXRlZC4KK1RoZSBlbmNvZGluZyBnaXZlcyB0aGUgd2F5IGluIHdoaWNoIGF1ZGlvIHNhbXBsZXMgYXJlIGVuY29kZWQuCitQb3NzaWJsZSB2YWx1ZXMgYXJlIGxpc3RlZCBiZWxvdy4KK1RoZSBpbmZvIGZpZWxkIGN1cnJlbnRseSBjb25zaXN0cyBvZiBhbiBBU0NJSSBzdHJpbmcgZ2l2aW5nIGEKK2h1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBhdWRpbyBmaWxlLiAgVGhlIGluZm8gZmllbGQgaXMKK3BhZGRlZCB3aXRoIE5VTCBieXRlcyB0byB0aGUgaGVhZGVyIHNpemUuCisKK1VzYWdlLgorCitSZWFkaW5nIGF1ZGlvIGZpbGVzOgorICAgICAgICBmID0gc3VuYXUub3BlbihmaWxlLCAncicpCit3aGVyZSBmaWxlIGlzIGVpdGhlciB0aGUgbmFtZSBvZiBhIGZpbGUgb3IgYW4gb3BlbiBmaWxlIHBvaW50ZXIuCitUaGUgb3BlbiBmaWxlIHBvaW50ZXIgbXVzdCBoYXZlIG1ldGhvZHMgcmVhZCgpLCBzZWVrKCksIGFuZCBjbG9zZSgpLgorV2hlbiB0aGUgc2V0cG9zKCkgYW5kIHJld2luZCgpIG1ldGhvZHMgYXJlIG5vdCB1c2VkLCB0aGUgc2VlaygpCittZXRob2QgaXMgbm90ICBuZWNlc3NhcnkuCisKK1RoaXMgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kczoKKyAgICAgICAgZ2V0bmNoYW5uZWxzKCkgIC0tIHJldHVybnMgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzICgxIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ubywgMiBmb3Igc3RlcmVvKQorICAgICAgICBnZXRzYW1wd2lkdGgoKSAgLS0gcmV0dXJucyBzYW1wbGUgd2lkdGggaW4gYnl0ZXMKKyAgICAgICAgZ2V0ZnJhbWVyYXRlKCkgIC0tIHJldHVybnMgc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgICAgIGdldG5mcmFtZXMoKSAgICAtLSByZXR1cm5zIG51bWJlciBvZiBhdWRpbyBmcmFtZXMKKyAgICAgICAgZ2V0Y29tcHR5cGUoKSAgIC0tIHJldHVybnMgY29tcHJlc3Npb24gdHlwZSAoJ05PTkUnIG9yICdVTEFXJykKKyAgICAgICAgZ2V0Y29tcG5hbWUoKSAgIC0tIHJldHVybnMgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24gdHlwZSAoJ25vdCBjb21wcmVzc2VkJyBtYXRjaGVzICdOT05FJykKKyAgICAgICAgZ2V0cGFyYW1zKCkgICAgIC0tIHJldHVybnMgYSB0dXBsZSBjb25zaXN0aW5nIG9mIGFsbCBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGluIHRoZSBhYm92ZSBvcmRlcgorICAgICAgICBnZXRtYXJrZXJzKCkgICAgLS0gcmV0dXJucyBOb25lIChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlmYyBtb2R1bGUpCisgICAgICAgIGdldG1hcmsoaWQpICAgICAtLSByYWlzZXMgYW4gZXJyb3Igc2luY2UgdGhlIG1hcmsgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IChmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBhaWZjIG1vZHVsZSkKKyAgICAgICAgcmVhZGZyYW1lcyhuKSAgIC0tIHJldHVybnMgYXQgbW9zdCBuIGZyYW1lcyBvZiBhdWRpbworICAgICAgICByZXdpbmQoKSAgICAgICAgLS0gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHN0cmVhbQorICAgICAgICBzZXRwb3MocG9zKSAgICAgLS0gc2VlayB0byB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgICAgICAgIHRlbGwoKSAgICAgICAgICAtLSByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgY2xvc2UoKSAgICAgICAgIC0tIGNsb3NlIHRoZSBpbnN0YW5jZSAobWFrZSBpdCB1bnVzYWJsZSkKK1RoZSBwb3NpdGlvbiByZXR1cm5lZCBieSB0ZWxsKCkgYW5kIHRoZSBwb3NpdGlvbiBnaXZlbiB0byBzZXRwb3MoKQorYXJlIGNvbXBhdGlibGUgYW5kIGhhdmUgbm90aGluZyB0byBkbyB3aXRoIHRoZSBhY3R1YWwgcG9zaXRpb24gaW4gdGhlCitmaWxlLgorVGhlIGNsb3NlKCkgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNsYXNzIGluc3RhbmNlCitpcyBkZXN0cm95ZWQuCisKK1dyaXRpbmcgYXVkaW8gZmlsZXM6CisgICAgICAgIGYgPSBzdW5hdS5vcGVuKGZpbGUsICd3JykKK3doZXJlIGZpbGUgaXMgZWl0aGVyIHRoZSBuYW1lIG9mIGEgZmlsZSBvciBhbiBvcGVuIGZpbGUgcG9pbnRlci4KK1RoZSBvcGVuIGZpbGUgcG9pbnRlciBtdXN0IGhhdmUgbWV0aG9kcyB3cml0ZSgpLCB0ZWxsKCksIHNlZWsoKSwgYW5kCitjbG9zZSgpLgorCitUaGlzIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aXRoIHRoZSBmb2xsb3dpbmcgcHVibGljIG1ldGhvZHM6CisgICAgICAgIHNldG5jaGFubmVscyhuKSAtLSBzZXQgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICBzZXRzYW1wd2lkdGgobikgLS0gc2V0IHRoZSBzYW1wbGUgd2lkdGgKKyAgICAgICAgc2V0ZnJhbWVyYXRlKG4pIC0tIHNldCB0aGUgZnJhbWUgcmF0ZQorICAgICAgICBzZXRuZnJhbWVzKG4pICAgLS0gc2V0IHRoZSBudW1iZXIgb2YgZnJhbWVzCisgICAgICAgIHNldGNvbXB0eXBlKHR5cGUsIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAtLSBzZXQgdGhlIGNvbXByZXNzaW9uIHR5cGUgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVtYW4tcmVhZGFibGUgY29tcHJlc3Npb24gdHlwZQorICAgICAgICBzZXRwYXJhbXModHVwbGUpLS0gc2V0IGFsbCBwYXJhbWV0ZXJzIGF0IG9uY2UKKyAgICAgICAgdGVsbCgpICAgICAgICAgIC0tIHJldHVybiBjdXJyZW50IHBvc2l0aW9uIGluIG91dHB1dCBmaWxlCisgICAgICAgIHdyaXRlZnJhbWVzcmF3KGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICAtLSB3cml0ZSBhdWRpbyBmcmFtZXMgd2l0aG91dCBwYXRoaW5nIHVwIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBoZWFkZXIKKyAgICAgICAgd3JpdGVmcmFtZXMoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tIHdyaXRlIGF1ZGlvIGZyYW1lcyBhbmQgcGF0Y2ggdXAgdGhlIGZpbGUgaGVhZGVyCisgICAgICAgIGNsb3NlKCkgICAgICAgICAtLSBwYXRjaCB1cCB0aGUgZmlsZSBoZWFkZXIgYW5kIGNsb3NlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUKK1lvdSBzaG91bGQgc2V0IHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGVmcmFtZXNyYXcgb3IKK3dyaXRlZnJhbWVzLiAgVGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQsCitidXQgd2hlbiBpdCBpcyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIHRoZSBoZWFkZXIgZG9lcyBub3QgaGF2ZSB0bworYmUgcGF0Y2hlZCB1cC4KK0l0IGlzIGJlc3QgdG8gZmlyc3Qgc2V0IGFsbCBwYXJhbWV0ZXJzLCBwZXJoYXBzIHBvc3NpYmx5IHRoZQorY29tcHJlc3Npb24gdHlwZSwgYW5kIHRoZW4gd3JpdGUgYXVkaW8gZnJhbWVzIHVzaW5nIHdyaXRlZnJhbWVzcmF3LgorV2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiB3cml0dGVuLCBlaXRoZXIgY2FsbCB3cml0ZWZyYW1lcygnJykgb3IKK2Nsb3NlKCkgdG8gcGF0Y2ggdXAgdGhlIHNpemVzIGluIHRoZSBoZWFkZXIuCitUaGUgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2xhc3MgaW5zdGFuY2UKK2lzIGRlc3Ryb3llZC4KKyIiIgorCisjIGZyb20gPG11bHRpbWVkaWEvYXVkaW9fZmlsZWhkci5oPgorQVVESU9fRklMRV9NQUdJQyA9IDB4MmU3MzZlNjQKK0FVRElPX0ZJTEVfRU5DT0RJTkdfTVVMQVdfOCA9IDEKK0FVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzggPSAyCitBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8xNiA9IDMKK0FVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzI0ID0gNAorQVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfMzIgPSA1CitBVURJT19GSUxFX0VOQ09ESU5HX0ZMT0FUID0gNgorQVVESU9fRklMRV9FTkNPRElOR19ET1VCTEUgPSA3CitBVURJT19GSUxFX0VOQ09ESU5HX0FEUENNX0c3MjEgPSAyMworQVVESU9fRklMRV9FTkNPRElOR19BRFBDTV9HNzIyID0gMjQKK0FVRElPX0ZJTEVfRU5DT0RJTkdfQURQQ01fRzcyM18zID0gMjUKK0FVRElPX0ZJTEVfRU5DT0RJTkdfQURQQ01fRzcyM181ID0gMjYKK0FVRElPX0ZJTEVfRU5DT0RJTkdfQUxBV184ID0gMjcKKworIyBmcm9tIDxtdWx0aW1lZGlhL2F1ZGlvX2hkci5oPgorQVVESU9fVU5LTk9XTl9TSVpFID0gMHhGRkZGRkZGRkwgICAgICAgICMgKCh1bnNpZ25lZCkofjApKQorCitfc2ltcGxlX2VuY29kaW5ncyA9IFtBVURJT19GSUxFX0VOQ09ESU5HX01VTEFXXzgsCisgICAgICAgICAgICAgICAgICAgICBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl84LAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfMTYsCisgICAgICAgICAgICAgICAgICAgICBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8yNCwKKyAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZJTEVfRU5DT0RJTkdfTElORUFSXzMyLAorICAgICAgICAgICAgICAgICAgICAgQVVESU9fRklMRV9FTkNPRElOR19BTEFXXzhdCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitkZWYgX3JlYWRfdTMyKGZpbGUpOgorICAgIHggPSAwTAorICAgIGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICBieXRlID0gZmlsZS5yZWFkKDEpCisgICAgICAgIGlmIGJ5dGUgPT0gJyc6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICB4ID0geCoyNTYgKyBvcmQoYnl0ZSkKKyAgICByZXR1cm4geAorCitkZWYgX3dyaXRlX3UzMihmaWxlLCB4KToKKyAgICBkYXRhID0gW10KKyAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgZCwgbSA9IGRpdm1vZCh4LCAyNTYpCisgICAgICAgIGRhdGEuaW5zZXJ0KDAsIG0pCisgICAgICAgIHggPSBkCisgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CisgICAgICAgIGZpbGUud3JpdGUoY2hyKGludChkYXRhW2ldKSkpCisKK2NsYXNzIEF1X3JlYWQ6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgIGlmIHR5cGUoZikgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBpbXBvcnQgX19idWlsdGluX18KKyAgICAgICAgICAgIGYgPSBfX2J1aWx0aW5fXy5vcGVuKGYsICdyYicpCisgICAgICAgIHNlbGYuaW5pdGZwKGYpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZmlsZToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGluaXRmcChzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSAwCisgICAgICAgIG1hZ2ljID0gaW50KF9yZWFkX3UzMihmaWxlKSkKKyAgICAgICAgaWYgbWFnaWMgIT0gQVVESU9fRklMRV9NQUdJQzoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIG1hZ2ljIG51bWJlcicKKyAgICAgICAgc2VsZi5faGRyX3NpemUgPSBpbnQoX3JlYWRfdTMyKGZpbGUpKQorICAgICAgICBpZiBzZWxmLl9oZHJfc2l6ZSA8IDI0OgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdoZWFkZXIgc2l6ZSB0b28gc21hbGwnCisgICAgICAgIGlmIHNlbGYuX2hkcl9zaXplID4gMTAwOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdoZWFkZXIgc2l6ZSByaWRpY3Vsb3VzbHkgbGFyZ2UnCisgICAgICAgIHNlbGYuX2RhdGFfc2l6ZSA9IF9yZWFkX3UzMihmaWxlKQorICAgICAgICBpZiBzZWxmLl9kYXRhX3NpemUgIT0gQVVESU9fVU5LTk9XTl9TSVpFOgorICAgICAgICAgICAgc2VsZi5fZGF0YV9zaXplID0gaW50KHNlbGYuX2RhdGFfc2l6ZSkKKyAgICAgICAgc2VsZi5fZW5jb2RpbmcgPSBpbnQoX3JlYWRfdTMyKGZpbGUpKQorICAgICAgICBpZiBzZWxmLl9lbmNvZGluZyBub3QgaW4gX3NpbXBsZV9lbmNvZGluZ3M6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2VuY29kaW5nIG5vdCAoeWV0KSBzdXBwb3J0ZWQnCisgICAgICAgIGlmIHNlbGYuX2VuY29kaW5nIGluIChBVURJT19GSUxFX0VOQ09ESU5HX01VTEFXXzgsCisgICAgICAgICAgICAgICAgICBBVURJT19GSUxFX0VOQ09ESU5HX0FMQVdfOCk6CisgICAgICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAyCisgICAgICAgICAgICBzZWxmLl9mcmFtZXNpemUgPSAxCisgICAgICAgIGVsaWYgc2VsZi5fZW5jb2RpbmcgPT0gQVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfODoKKyAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX3NhbXB3aWR0aCA9IDEKKyAgICAgICAgZWxpZiBzZWxmLl9lbmNvZGluZyA9PSBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8xNjoKKyAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX3NhbXB3aWR0aCA9IDIKKyAgICAgICAgZWxpZiBzZWxmLl9lbmNvZGluZyA9PSBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8yNDoKKyAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX3NhbXB3aWR0aCA9IDMKKyAgICAgICAgZWxpZiBzZWxmLl9lbmNvZGluZyA9PSBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8zMjoKKyAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX3NhbXB3aWR0aCA9IDQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5rbm93biBlbmNvZGluZycKKyAgICAgICAgc2VsZi5fZnJhbWVyYXRlID0gaW50KF9yZWFkX3UzMihmaWxlKSkKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gaW50KF9yZWFkX3UzMihmaWxlKSkKKyAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fZnJhbWVzaXplICogc2VsZi5fbmNoYW5uZWxzCisgICAgICAgIGlmIHNlbGYuX2hkcl9zaXplID4gMjQ6CisgICAgICAgICAgICBzZWxmLl9pbmZvID0gZmlsZS5yZWFkKHNlbGYuX2hkcl9zaXplIC0gMjQpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5faW5mbykpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX2luZm9baV0gPT0gJ1wwJzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW5mbyA9IHNlbGYuX2luZm9bOmldCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9pbmZvID0gJycKKworICAgIGRlZiBnZXRmcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUKKworICAgIGRlZiBnZXRuY2hhbm5lbHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMKKworICAgIGRlZiBnZXRzYW1wd2lkdGgoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zYW1wd2lkdGgKKworICAgIGRlZiBnZXRmcmFtZXJhdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9mcmFtZXJhdGUKKworICAgIGRlZiBnZXRuZnJhbWVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9kYXRhX3NpemUgPT0gQVVESU9fVU5LTk9XTl9TSVpFOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX1VOS05PV05fU0laRQorICAgICAgICBpZiBzZWxmLl9lbmNvZGluZyBpbiBfc2ltcGxlX2VuY29kaW5nczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhX3NpemUgLyBzZWxmLl9mcmFtZXNpemUKKyAgICAgICAgcmV0dXJuIDAgICAgICAgICAgICAgICAgIyBYWFgtLW11c3QgZG8gc29tZSBhcml0aG1ldGljIGhlcmUKKworICAgIGRlZiBnZXRjb21wdHlwZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZW5jb2RpbmcgPT0gQVVESU9fRklMRV9FTkNPRElOR19NVUxBV184OgorICAgICAgICAgICAgcmV0dXJuICdVTEFXJworICAgICAgICBlbGlmIHNlbGYuX2VuY29kaW5nID09IEFVRElPX0ZJTEVfRU5DT0RJTkdfQUxBV184OgorICAgICAgICAgICAgcmV0dXJuICdBTEFXJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdOT05FJworCisgICAgZGVmIGdldGNvbXBuYW1lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9lbmNvZGluZyA9PSBBVURJT19GSUxFX0VOQ09ESU5HX01VTEFXXzg6CisgICAgICAgICAgICByZXR1cm4gJ0NDSVRUIEcuNzExIHUtbGF3JworICAgICAgICBlbGlmIHNlbGYuX2VuY29kaW5nID09IEFVRElPX0ZJTEVfRU5DT0RJTkdfQUxBV184OgorICAgICAgICAgICAgcmV0dXJuICdDQ0lUVCBHLjcxMSBBLWxhdycKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnbm90IGNvbXByZXNzZWQnCisKKyAgICBkZWYgZ2V0cGFyYW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5nZXRuY2hhbm5lbHMoKSwgc2VsZi5nZXRzYW1wd2lkdGgoKSwgXAorICAgICAgICAgICAgICAgICAgc2VsZi5nZXRmcmFtZXJhdGUoKSwgc2VsZi5nZXRuZnJhbWVzKCksIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuZ2V0Y29tcHR5cGUoKSwgc2VsZi5nZXRjb21wbmFtZSgpCisKKyAgICBkZWYgZ2V0bWFya2VycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXRtYXJrKHNlbGYsIGlkKToKKyAgICAgICAgcmFpc2UgRXJyb3IsICdubyBtYXJrcycKKworICAgIGRlZiByZWFkZnJhbWVzKHNlbGYsIG5mcmFtZXMpOgorICAgICAgICBpZiBzZWxmLl9lbmNvZGluZyBpbiBfc2ltcGxlX2VuY29kaW5nczoKKyAgICAgICAgICAgIGlmIG5mcmFtZXMgPT0gQVVESU9fVU5LTk9XTl9TSVpFOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9maWxlLnJlYWQoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5fZmlsZS5yZWFkKG5mcmFtZXMgKiBzZWxmLl9mcmFtZXNpemUgKiBzZWxmLl9uY2hhbm5lbHMpCisgICAgICAgICAgICBpZiBzZWxmLl9lbmNvZGluZyA9PSBBVURJT19GSUxFX0VOQ09ESU5HX01VTEFXXzg6CisgICAgICAgICAgICAgICAgaW1wb3J0IGF1ZGlvb3AKKyAgICAgICAgICAgICAgICBkYXRhID0gYXVkaW9vcC51bGF3MmxpbihkYXRhLCBzZWxmLl9zYW1wd2lkdGgpCisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICByZXR1cm4gTm9uZSAgICAgICAgICAgICAjIFhYWC0tbm90IGltcGxlbWVudGVkIHlldAorCisgICAgZGVmIHJld2luZChzZWxmKToKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSAwCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhzZWxmLl9oZHJfc2l6ZSkKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc291bmRwb3MKKworICAgIGRlZiBzZXRwb3Moc2VsZiwgcG9zKToKKyAgICAgICAgaWYgcG9zIDwgMCBvciBwb3MgPiBzZWxmLmdldG5mcmFtZXMoKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAncG9zaXRpb24gbm90IGluIHJhbmdlJworICAgICAgICBzZWxmLl9maWxlLnNlZWsocG9zICogc2VsZi5fZnJhbWVzaXplICsgc2VsZi5faGRyX3NpemUpCisgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gcG9zCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUgPSBOb25lCisKK2NsYXNzIEF1X3dyaXRlOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYpOgorICAgICAgICBpZiB0eXBlKGYpID09IHR5cGUoJycpOgorICAgICAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgICAgICBmID0gX19idWlsdGluX18ub3BlbihmLCAnd2InKQorICAgICAgICBzZWxmLmluaXRmcChmKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2ZpbGU6CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBpbml0ZnAoc2VsZiwgZmlsZSk6CisgICAgICAgIHNlbGYuX2ZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuX2ZyYW1lcmF0ZSA9IDAKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gMAorICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAwCisgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IDAKKyAgICAgICAgc2VsZi5fbmZyYW1lcyA9IEFVRElPX1VOS05PV05fU0laRQorICAgICAgICBzZWxmLl9uZnJhbWVzd3JpdHRlbiA9IDAKKyAgICAgICAgc2VsZi5fZGF0YXdyaXR0ZW4gPSAwCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSAwCisgICAgICAgIHNlbGYuX2luZm8gPSAnJworICAgICAgICBzZWxmLl9jb21wdHlwZSA9ICdVTEFXJyAjIGRlZmF1bHQgaXMgVS1sYXcKKworICAgIGRlZiBzZXRuY2hhbm5lbHMoc2VsZiwgbmNoYW5uZWxzKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgbmNoYW5uZWxzIG5vdCBpbiAoMSwgMiwgNCk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ29ubHkgMSwgMiwgb3IgNCBjaGFubmVscyBzdXBwb3J0ZWQnCisgICAgICAgIHNlbGYuX25jaGFubmVscyA9IG5jaGFubmVscworCisgICAgZGVmIGdldG5jaGFubmVscyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25jaGFubmVsczoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnbnVtYmVyIG9mIGNoYW5uZWxzIG5vdCBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMKKworICAgIGRlZiBzZXRzYW1wd2lkdGgoc2VsZiwgc2FtcHdpZHRoKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgaWYgc2FtcHdpZHRoIG5vdCBpbiAoMSwgMiwgNCk6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2JhZCBzYW1wbGUgd2lkdGgnCisgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IHNhbXB3aWR0aAorCisgICAgZGVmIGdldHNhbXB3aWR0aChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2ZyYW1lcmF0ZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnc2FtcGxlIHdpZHRoIG5vdCBzcGVjaWZpZWQnCisgICAgICAgIHJldHVybiBzZWxmLl9zYW1wd2lkdGgKKworICAgIGRlZiBzZXRmcmFtZXJhdGUoc2VsZiwgZnJhbWVyYXRlKToKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lc3dyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgc2VsZi5fZnJhbWVyYXRlID0gZnJhbWVyYXRlCisKKyAgICBkZWYgZ2V0ZnJhbWVyYXRlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZnJhbWVyYXRlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdmcmFtZSByYXRlIG5vdCBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9mcmFtZXJhdGUKKworICAgIGRlZiBzZXRuZnJhbWVzKHNlbGYsIG5mcmFtZXMpOgorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBuZnJhbWVzIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnIyBvZiBmcmFtZXMgY2Fubm90IGJlIG5lZ2F0aXZlJworICAgICAgICBzZWxmLl9uZnJhbWVzID0gbmZyYW1lcworCisgICAgZGVmIGdldG5mcmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uZnJhbWVzd3JpdHRlbgorCisgICAgZGVmIHNldGNvbXB0eXBlKHNlbGYsIHR5cGUsIG5hbWUpOgorICAgICAgICBpZiB0eXBlIGluICgnTk9ORScsICdVTEFXJyk6CisgICAgICAgICAgICBzZWxmLl9jb21wdHlwZSA9IHR5cGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAndW5rbm93biBjb21wcmVzc2lvbiB0eXBlJworCisgICAgZGVmIGdldGNvbXB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29tcHR5cGUKKworICAgIGRlZiBnZXRjb21wbmFtZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY29tcHR5cGUgPT0gJ1VMQVcnOgorICAgICAgICAgICAgcmV0dXJuICdDQ0lUVCBHLjcxMSB1LWxhdycKKyAgICAgICAgZWxpZiBzZWxmLl9jb21wdHlwZSA9PSAnQUxBVyc6CisgICAgICAgICAgICByZXR1cm4gJ0NDSVRUIEcuNzExIEEtbGF3JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICdub3QgY29tcHJlc3NlZCcKKworICAgIGRlZiBzZXRwYXJhbXMoc2VsZiwgcGFyYW1zKToKKyAgICAgICAgbmNoYW5uZWxzLCBzYW1wd2lkdGgsIGZyYW1lcmF0ZSwgbmZyYW1lcywgY29tcHR5cGUsIGNvbXBuYW1lID0gcGFyYW1zCisgICAgICAgIHNlbGYuc2V0bmNoYW5uZWxzKG5jaGFubmVscykKKyAgICAgICAgc2VsZi5zZXRzYW1wd2lkdGgoc2FtcHdpZHRoKQorICAgICAgICBzZWxmLnNldGZyYW1lcmF0ZShmcmFtZXJhdGUpCisgICAgICAgIHNlbGYuc2V0bmZyYW1lcyhuZnJhbWVzKQorICAgICAgICBzZWxmLnNldGNvbXB0eXBlKGNvbXB0eXBlLCBjb21wbmFtZSkKKworICAgIGRlZiBnZXRwYXJhbXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmdldG5jaGFubmVscygpLCBzZWxmLmdldHNhbXB3aWR0aCgpLCBcCisgICAgICAgICAgICAgICAgICBzZWxmLmdldGZyYW1lcmF0ZSgpLCBzZWxmLmdldG5mcmFtZXMoKSwgXAorICAgICAgICAgICAgICAgICAgc2VsZi5nZXRjb21wdHlwZSgpLCBzZWxmLmdldGNvbXBuYW1lKCkKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmZyYW1lc3dyaXR0ZW4KKworICAgIGRlZiB3cml0ZWZyYW1lc3JhdyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKCkKKyAgICAgICAgbmZyYW1lcyA9IGxlbihkYXRhKSAvIHNlbGYuX2ZyYW1lc2l6ZQorICAgICAgICBpZiBzZWxmLl9jb21wdHlwZSA9PSAnVUxBVyc6CisgICAgICAgICAgICBpbXBvcnQgYXVkaW9vcAorICAgICAgICAgICAgZGF0YSA9IGF1ZGlvb3AubGluMnVsYXcoZGF0YSwgc2VsZi5fc2FtcHdpZHRoKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKGRhdGEpCisgICAgICAgIHNlbGYuX25mcmFtZXN3cml0dGVuID0gc2VsZi5fbmZyYW1lc3dyaXR0ZW4gKyBuZnJhbWVzCisgICAgICAgIHNlbGYuX2RhdGF3cml0dGVuID0gc2VsZi5fZGF0YXdyaXR0ZW4gKyBsZW4oZGF0YSkKKworICAgIGRlZiB3cml0ZWZyYW1lcyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi53cml0ZWZyYW1lc3JhdyhkYXRhKQorICAgICAgICBpZiBzZWxmLl9uZnJhbWVzd3JpdHRlbiAhPSBzZWxmLl9uZnJhbWVzIG9yIFwKKyAgICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggIT0gc2VsZi5fZGF0YXdyaXR0ZW46CisgICAgICAgICAgICBzZWxmLl9wYXRjaGhlYWRlcigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX2Vuc3VyZV9oZWFkZXJfd3JpdHRlbigpCisgICAgICAgIGlmIHNlbGYuX25mcmFtZXN3cml0dGVuICE9IHNlbGYuX25mcmFtZXMgb3IgXAorICAgICAgICAgICAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCAhPSBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKKyAgICAgICAgc2VsZi5fZmlsZS5mbHVzaCgpCisgICAgICAgIHNlbGYuX2ZpbGUgPSBOb25lCisKKyAgICAjCisgICAgIyBwcml2YXRlIG1ldGhvZHMKKyAgICAjCisKKyAgICBkZWYgX2Vuc3VyZV9oZWFkZXJfd3JpdHRlbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25mcmFtZXN3cml0dGVuOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX25jaGFubmVsczoKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJyMgb2YgY2hhbm5lbHMgbm90IHNwZWNpZmllZCcKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9zYW1wd2lkdGg6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzYW1wbGUgd2lkdGggbm90IHNwZWNpZmllZCcKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9mcmFtZXJhdGU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdmcmFtZSByYXRlIG5vdCBzcGVjaWZpZWQnCisgICAgICAgICAgICBzZWxmLl93cml0ZV9oZWFkZXIoKQorCisgICAgZGVmIF93cml0ZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NvbXB0eXBlID09ICdOT05FJzoKKyAgICAgICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCA9PSAxOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gQVVESU9fRklMRV9FTkNPRElOR19MSU5FQVJfOAorICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IDEKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fc2FtcHdpZHRoID09IDI6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8xNgorICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IDIKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fc2FtcHdpZHRoID09IDQ6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSBBVURJT19GSUxFX0VOQ09ESU5HX0xJTkVBUl8zMgorICAgICAgICAgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IDQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdpbnRlcm5hbCBlcnJvcicKKyAgICAgICAgZWxpZiBzZWxmLl9jb21wdHlwZSA9PSAnVUxBVyc6CisgICAgICAgICAgICBlbmNvZGluZyA9IEFVRElPX0ZJTEVfRU5DT0RJTkdfTVVMQVdfOAorICAgICAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdpbnRlcm5hbCBlcnJvcicKKyAgICAgICAgc2VsZi5fZnJhbWVzaXplID0gc2VsZi5fZnJhbWVzaXplICogc2VsZi5fbmNoYW5uZWxzCisgICAgICAgIF93cml0ZV91MzIoc2VsZi5fZmlsZSwgQVVESU9fRklMRV9NQUdJQykKKyAgICAgICAgaGVhZGVyX3NpemUgPSAyNSArIGxlbihzZWxmLl9pbmZvKQorICAgICAgICBoZWFkZXJfc2l6ZSA9IChoZWFkZXJfc2l6ZSArIDcpICYgfjcKKyAgICAgICAgX3dyaXRlX3UzMihzZWxmLl9maWxlLCBoZWFkZXJfc2l6ZSkKKyAgICAgICAgaWYgc2VsZi5fbmZyYW1lcyA9PSBBVURJT19VTktOT1dOX1NJWkU6CisgICAgICAgICAgICBsZW5ndGggPSBBVURJT19VTktOT1dOX1NJWkUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYuX25mcmFtZXMgKiBzZWxmLl9mcmFtZXNpemUKKyAgICAgICAgX3dyaXRlX3UzMihzZWxmLl9maWxlLCBsZW5ndGgpCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBsZW5ndGgKKyAgICAgICAgX3dyaXRlX3UzMihzZWxmLl9maWxlLCBlbmNvZGluZykKKyAgICAgICAgX3dyaXRlX3UzMihzZWxmLl9maWxlLCBzZWxmLl9mcmFtZXJhdGUpCisgICAgICAgIF93cml0ZV91MzIoc2VsZi5fZmlsZSwgc2VsZi5fbmNoYW5uZWxzKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKHNlbGYuX2luZm8pCisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ1wwJyooaGVhZGVyX3NpemUgLSBsZW4oc2VsZi5faW5mbykgLSAyNCkpCisKKyAgICBkZWYgX3BhdGNoaGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLnNlZWsoOCkKKyAgICAgICAgX3dyaXRlX3UzMihzZWxmLl9maWxlLCBzZWxmLl9kYXRhd3JpdHRlbikKKyAgICAgICAgc2VsZi5fZGF0YWxlbmd0aCA9IHNlbGYuX2RhdGF3cml0dGVuCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlaygwLCAyKQorCitkZWYgb3BlbihmLCBtb2RlPU5vbmUpOgorICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgaWYgaGFzYXR0cihmLCAnbW9kZScpOgorICAgICAgICAgICAgbW9kZSA9IGYubW9kZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kZSA9ICdyYicKKyAgICBpZiBtb2RlIGluICgncicsICdyYicpOgorICAgICAgICByZXR1cm4gQXVfcmVhZChmKQorICAgIGVsaWYgbW9kZSBpbiAoJ3cnLCAnd2InKToKKyAgICAgICAgcmV0dXJuIEF1X3dyaXRlKGYpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgRXJyb3IsICJtb2RlIG11c3QgYmUgJ3InLCAncmInLCAndycsIG9yICd3YiciCisKK29wZW5mcCA9IG9wZW4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3VuYXUucHljIGIvbGliL3B5dGhvbjIuNy9zdW5hdS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2ZTliMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3VuYXUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3VuYXUucHlvIGIvbGliL3B5dGhvbjIuNy9zdW5hdS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU2ZTliMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3VuYXUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3VuYXVkaW8ucHkgYi9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDczMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5CkBAIC0wLDAgKzEsNDkgQEAKKyIiIkludGVycHJldCBzdW4gYXVkaW8gaGVhZGVycy4iIiIKK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIHN1bmF1ZGlvIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjA7ICIKKyAgICAgICAgICJ1c2UgdGhlIHN1bmF1IG1vZHVsZSBpbnN0ZWFkIiwgc3RhY2tsZXZlbD0yKQorZGVsIHdhcm5weTNrCisKKworTUFHSUMgPSAnLnNuZCcKKworY2xhc3MgZXJyb3IoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworZGVmIGdldF9sb25nX2JlKHMpOgorICAgICIiIkNvbnZlcnQgYSA0LWNoYXIgdmFsdWUgdG8gaW50ZWdlci4iIiIKKyAgICByZXR1cm4gKG9yZChzWzBdKTw8MjQpIHwgKG9yZChzWzFdKTw8MTYpIHwgKG9yZChzWzJdKTw8OCkgfCBvcmQoc1szXSkKKworCitkZWYgZ2V0aGRyKGZwKToKKyAgICAiIiJSZWFkIGEgc291bmQgaGVhZGVyIGZyb20gYW4gb3BlbiBmaWxlLiIiIgorICAgIGlmIGZwLnJlYWQoNCkgIT0gTUFHSUM6CisgICAgICAgIHJhaXNlIGVycm9yLCAnZ2V0aGRyOiBiYWQgbWFnaWMgd29yZCcKKyAgICBoZHJfc2l6ZSA9IGdldF9sb25nX2JlKGZwLnJlYWQoNCkpCisgICAgZGF0YV9zaXplID0gZ2V0X2xvbmdfYmUoZnAucmVhZCg0KSkKKyAgICBlbmNvZGluZyA9IGdldF9sb25nX2JlKGZwLnJlYWQoNCkpCisgICAgc2FtcGxlX3JhdGUgPSBnZXRfbG9uZ19iZShmcC5yZWFkKDQpKQorICAgIGNoYW5uZWxzID0gZ2V0X2xvbmdfYmUoZnAucmVhZCg0KSkKKyAgICBleGNlc3MgPSBoZHJfc2l6ZSAtIDI0CisgICAgaWYgZXhjZXNzIDwgMDoKKyAgICAgICAgcmFpc2UgZXJyb3IsICdnZXRoZHI6IGJhZCBoZHJfc2l6ZScKKyAgICBpZiBleGNlc3MgPiAwOgorICAgICAgICBpbmZvID0gZnAucmVhZChleGNlc3MpCisgICAgZWxzZToKKyAgICAgICAgaW5mbyA9ICcnCisgICAgcmV0dXJuIChkYXRhX3NpemUsIGVuY29kaW5nLCBzYW1wbGVfcmF0ZSwgY2hhbm5lbHMsIGluZm8pCisKKworZGVmIHByaW50aGRyKGZpbGUpOgorICAgICIiIlJlYWQgYW5kIHByaW50IHRoZSBzb3VuZCBoZWFkZXIgb2YgYSBuYW1lZCBmaWxlLiIiIgorICAgIGhkciA9IGdldGhkcihvcGVuKGZpbGUsICdyJykpCisgICAgZGF0YV9zaXplLCBlbmNvZGluZywgc2FtcGxlX3JhdGUsIGNoYW5uZWxzLCBpbmZvID0gaGRyCisgICAgd2hpbGUgaW5mb1stMTpdID09ICdcMCc6CisgICAgICAgIGluZm8gPSBpbmZvWzotMV0KKyAgICBwcmludCAnRmlsZSBuYW1lOiAgJywgZmlsZQorICAgIHByaW50ICdEYXRhIHNpemU6ICAnLCBkYXRhX3NpemUKKyAgICBwcmludCAnRW5jb2Rpbmc6ICAgJywgZW5jb2RpbmcKKyAgICBwcmludCAnU2FtcGxlIHJhdGU6Jywgc2FtcGxlX3JhdGUKKyAgICBwcmludCAnQ2hhbm5lbHM6ICAgJywgY2hhbm5lbHMKKyAgICBwcmludCAnSW5mbzogICAgICAgJywgcmVwcihpbmZvKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdW5hdWRpby5weWMgYi9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM4MzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdW5hdWRpby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zdW5hdWRpby5weW8gYi9saWIvcHl0aG9uMi43L3N1bmF1ZGlvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWM4MzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zdW5hdWRpby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy9zeW1ib2wucHkgYi9saWIvcHl0aG9uMi43L3N5bWJvbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNGQ0ZTEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeW1ib2wucHkKQEAgLTAsMCArMSwxMTQgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworIiIiTm9uLXRlcm1pbmFsIHN5bWJvbHMgb2YgUHl0aG9uIGdyYW1tYXIgKGZyb20gImdyYW1pbml0LmgiKS4iIiIKKworIyAgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG9uJ3QgbXVjayBpdCB1cCEKKyMKKyMgIFRvIHVwZGF0ZSB0aGUgc3ltYm9scyBpbiB0aGlzIGZpbGUsICdjZCcgdG8gdGhlIHRvcCBkaXJlY3Rvcnkgb2YKKyMgIHRoZSBweXRob24gc291cmNlIHRyZWUgYWZ0ZXIgYnVpbGRpbmcgdGhlIGludGVycHJldGVyIGFuZCBydW46CisjCisjICAgIC4vcHl0aG9uIExpYi9zeW1ib2wucHkKKworIy0tc3RhcnQgY29uc3RhbnRzLS0KK3NpbmdsZV9pbnB1dCA9IDI1NgorZmlsZV9pbnB1dCA9IDI1NworZXZhbF9pbnB1dCA9IDI1OAorZGVjb3JhdG9yID0gMjU5CitkZWNvcmF0b3JzID0gMjYwCitkZWNvcmF0ZWQgPSAyNjEKK2Z1bmNkZWYgPSAyNjIKK3BhcmFtZXRlcnMgPSAyNjMKK3ZhcmFyZ3NsaXN0ID0gMjY0CitmcGRlZiA9IDI2NQorZnBsaXN0ID0gMjY2CitzdG10ID0gMjY3CitzaW1wbGVfc3RtdCA9IDI2OAorc21hbGxfc3RtdCA9IDI2OQorZXhwcl9zdG10ID0gMjcwCithdWdhc3NpZ24gPSAyNzEKK3ByaW50X3N0bXQgPSAyNzIKK2RlbF9zdG10ID0gMjczCitwYXNzX3N0bXQgPSAyNzQKK2Zsb3dfc3RtdCA9IDI3NQorYnJlYWtfc3RtdCA9IDI3NgorY29udGludWVfc3RtdCA9IDI3NworcmV0dXJuX3N0bXQgPSAyNzgKK3lpZWxkX3N0bXQgPSAyNzkKK3JhaXNlX3N0bXQgPSAyODAKK2ltcG9ydF9zdG10ID0gMjgxCitpbXBvcnRfbmFtZSA9IDI4MgoraW1wb3J0X2Zyb20gPSAyODMKK2ltcG9ydF9hc19uYW1lID0gMjg0Citkb3R0ZWRfYXNfbmFtZSA9IDI4NQoraW1wb3J0X2FzX25hbWVzID0gMjg2Citkb3R0ZWRfYXNfbmFtZXMgPSAyODcKK2RvdHRlZF9uYW1lID0gMjg4CitnbG9iYWxfc3RtdCA9IDI4OQorZXhlY19zdG10ID0gMjkwCithc3NlcnRfc3RtdCA9IDI5MQorY29tcG91bmRfc3RtdCA9IDI5MgoraWZfc3RtdCA9IDI5Mword2hpbGVfc3RtdCA9IDI5NAorZm9yX3N0bXQgPSAyOTUKK3RyeV9zdG10ID0gMjk2Cit3aXRoX3N0bXQgPSAyOTcKK3dpdGhfaXRlbSA9IDI5OAorZXhjZXB0X2NsYXVzZSA9IDI5OQorc3VpdGUgPSAzMDAKK3Rlc3RsaXN0X3NhZmUgPSAzMDEKK29sZF90ZXN0ID0gMzAyCitvbGRfbGFtYmRlZiA9IDMwMwordGVzdCA9IDMwNAorb3JfdGVzdCA9IDMwNQorYW5kX3Rlc3QgPSAzMDYKK25vdF90ZXN0ID0gMzA3Citjb21wYXJpc29uID0gMzA4Citjb21wX29wID0gMzA5CitleHByID0gMzEwCit4b3JfZXhwciA9IDMxMQorYW5kX2V4cHIgPSAzMTIKK3NoaWZ0X2V4cHIgPSAzMTMKK2FyaXRoX2V4cHIgPSAzMTQKK3Rlcm0gPSAzMTUKK2ZhY3RvciA9IDMxNgorcG93ZXIgPSAzMTcKK2F0b20gPSAzMTgKK2xpc3RtYWtlciA9IDMxOQordGVzdGxpc3RfY29tcCA9IDMyMAorbGFtYmRlZiA9IDMyMQordHJhaWxlciA9IDMyMgorc3Vic2NyaXB0bGlzdCA9IDMyMworc3Vic2NyaXB0ID0gMzI0CitzbGljZW9wID0gMzI1CitleHBybGlzdCA9IDMyNgordGVzdGxpc3QgPSAzMjcKK2RpY3RvcnNldG1ha2VyID0gMzI4CitjbGFzc2RlZiA9IDMyOQorYXJnbGlzdCA9IDMzMAorYXJndW1lbnQgPSAzMzEKK2xpc3RfaXRlciA9IDMzMgorbGlzdF9mb3IgPSAzMzMKK2xpc3RfaWYgPSAzMzQKK2NvbXBfaXRlciA9IDMzNQorY29tcF9mb3IgPSAzMzYKK2NvbXBfaWYgPSAzMzcKK3Rlc3RsaXN0MSA9IDMzOAorZW5jb2RpbmdfZGVjbCA9IDMzOQoreWllbGRfZXhwciA9IDM0MAorIy0tZW5kIGNvbnN0YW50cy0tCisKK3N5bV9uYW1lID0ge30KK2ZvciBfbmFtZSwgX3ZhbHVlIGluIGdsb2JhbHMoKS5pdGVtcygpOgorICAgIGlmIHR5cGUoX3ZhbHVlKSBpcyB0eXBlKDApOgorICAgICAgICBzeW1fbmFtZVtfdmFsdWVdID0gX25hbWUKKworCitkZWYgbWFpbigpOgorICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgdG9rZW4KKyAgICBpZiBsZW4oc3lzLmFyZ3YpID09IDE6CisgICAgICAgIHN5cy5hcmd2ID0gc3lzLmFyZ3YgKyBbIkluY2x1ZGUvZ3JhbWluaXQuaCIsICJMaWIvc3ltYm9sLnB5Il0KKyAgICB0b2tlbi5tYWluKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3ltYm9sLnB5YyBiL2xpYi9weXRob24yLjcvc3ltYm9sLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY5N2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeW1ib2wucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3ltYm9sLnB5byBiL2xpYi9weXRob24yLjcvc3ltYm9sLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWY5N2M1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeW1ib2wucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3ltdGFibGUucHkgYi9saWIvcHl0aG9uMi43L3N5bXRhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzNmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3N5bXRhYmxlLnB5CkBAIC0wLDAgKzEsMjQyIEBACisiIiJJbnRlcmZhY2UgdG8gdGhlIGNvbXBpbGVyJ3MgaW50ZXJuYWwgc3ltYm9sIHRhYmxlcyIiIgorCitpbXBvcnQgX3N5bXRhYmxlCitmcm9tIF9zeW10YWJsZSBpbXBvcnQgKFVTRSwgREVGX0dMT0JBTCwgREVGX0xPQ0FMLCBERUZfUEFSQU0sCisgICAgIERFRl9JTVBPUlQsIERFRl9CT1VORCwgT1BUX0lNUE9SVF9TVEFSLCBPUFRfRVhFQywgT1BUX0JBUkVfRVhFQywKKyAgICAgU0NPUEVfT0ZGLCBTQ09QRV9NQVNLLCBGUkVFLCBHTE9CQUxfSU1QTElDSVQsIEdMT0JBTF9FWFBMSUNJVCwgQ0VMTCwgTE9DQUwpCisKK2ltcG9ydCB3ZWFrcmVmCisKK19fYWxsX18gPSBbInN5bXRhYmxlIiwgIlN5bWJvbFRhYmxlIiwgIkNsYXNzIiwgIkZ1bmN0aW9uIiwgIlN5bWJvbCJdCisKK2RlZiBzeW10YWJsZShjb2RlLCBmaWxlbmFtZSwgY29tcGlsZV90eXBlKToKKyAgICByYXcgPSBfc3ltdGFibGUuc3ltdGFibGUoY29kZSwgZmlsZW5hbWUsIGNvbXBpbGVfdHlwZSkKKyAgICBmb3IgdG9wIGluIHJhdy5pdGVydmFsdWVzKCk6CisgICAgICAgIGlmIHRvcC5uYW1lID09ICd0b3AnOgorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gX25ld1N5bWJvbFRhYmxlKHRvcCwgZmlsZW5hbWUpCisKK2NsYXNzIFN5bWJvbFRhYmxlRmFjdG9yeToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX19tZW1vID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKKworICAgIGRlZiBuZXcoc2VsZiwgdGFibGUsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgdGFibGUudHlwZSA9PSBfc3ltdGFibGUuVFlQRV9GVU5DVElPTjoKKyAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbih0YWJsZSwgZmlsZW5hbWUpCisgICAgICAgIGlmIHRhYmxlLnR5cGUgPT0gX3N5bXRhYmxlLlRZUEVfQ0xBU1M6CisgICAgICAgICAgICByZXR1cm4gQ2xhc3ModGFibGUsIGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gU3ltYm9sVGFibGUodGFibGUsIGZpbGVuYW1lKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHRhYmxlLCBmaWxlbmFtZSk6CisgICAgICAgIGtleSA9IHRhYmxlLCBmaWxlbmFtZQorICAgICAgICBvYmogPSBzZWxmLl9fbWVtby5nZXQoa2V5LCBOb25lKQorICAgICAgICBpZiBvYmogaXMgTm9uZToKKyAgICAgICAgICAgIG9iaiA9IHNlbGYuX19tZW1vW2tleV0gPSBzZWxmLm5ldyh0YWJsZSwgZmlsZW5hbWUpCisgICAgICAgIHJldHVybiBvYmoKKworX25ld1N5bWJvbFRhYmxlID0gU3ltYm9sVGFibGVGYWN0b3J5KCkKKworCitjbGFzcyBTeW1ib2xUYWJsZShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJhd190YWJsZSwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLl90YWJsZSA9IHJhd190YWJsZQorICAgICAgICBzZWxmLl9maWxlbmFtZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYuX3N5bWJvbHMgPSB7fQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fY2xhc3NfXyA9PSBTeW1ib2xUYWJsZToKKyAgICAgICAgICAgIGtpbmQgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAga2luZCA9ICIlcyAiICUgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKworICAgICAgICBpZiBzZWxmLl90YWJsZS5uYW1lID09ICJnbG9iYWwiOgorICAgICAgICAgICAgcmV0dXJuICI8ezB9U3ltYm9sVGFibGUgZm9yIG1vZHVsZSB7MX0+Ii5mb3JtYXQoa2luZCwgc2VsZi5fZmlsZW5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIjx7MH1TeW1ib2xUYWJsZSBmb3IgezF9IGluIHsyfT4iLmZvcm1hdChraW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGFibGUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2ZpbGVuYW1lKQorCisgICAgZGVmIGdldF90eXBlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl90YWJsZS50eXBlID09IF9zeW10YWJsZS5UWVBFX01PRFVMRToKKyAgICAgICAgICAgIHJldHVybiAibW9kdWxlIgorICAgICAgICBpZiBzZWxmLl90YWJsZS50eXBlID09IF9zeW10YWJsZS5UWVBFX0ZVTkNUSU9OOgorICAgICAgICAgICAgcmV0dXJuICJmdW5jdGlvbiIKKyAgICAgICAgaWYgc2VsZi5fdGFibGUudHlwZSA9PSBfc3ltdGFibGUuVFlQRV9DTEFTUzoKKyAgICAgICAgICAgIHJldHVybiAiY2xhc3MiCisgICAgICAgIGFzc2VydCBzZWxmLl90YWJsZS50eXBlIGluICgxLCAyLCAzKSwgXAorICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgdHlwZTogezB9Ii5mb3JtYXQoc2VsZi5fdGFibGUudHlwZSkKKworICAgIGRlZiBnZXRfaWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90YWJsZS5pZAorCisgICAgZGVmIGdldF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGFibGUubmFtZQorCisgICAgZGVmIGdldF9saW5lbm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90YWJsZS5saW5lbm8KKworICAgIGRlZiBpc19vcHRpbWl6ZWQoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYmxlLnR5cGUgPT0gX3N5bXRhYmxlLlRZUEVfRlVOQ1RJT04KKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBzZWxmLl90YWJsZS5vcHRpbWl6ZWQpCisKKyAgICBkZWYgaXNfbmVzdGVkKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWJsZS5uZXN0ZWQpCisKKyAgICBkZWYgaGFzX2NoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWJsZS5jaGlsZHJlbikKKworICAgIGRlZiBoYXNfZXhlYyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIHNjb3BlIHVzZXMgZXhlYyIiIgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWJsZS5vcHRpbWl6ZWQgJiAoT1BUX0VYRUMgfCBPUFRfQkFSRV9FWEVDKSkKKworICAgIGRlZiBoYXNfaW1wb3J0X3N0YXIoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBzY29wZSB1c2VzIGltcG9ydCAqIiIiCisgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYmxlLm9wdGltaXplZCAmIE9QVF9JTVBPUlRfU1RBUikKKworICAgIGRlZiBnZXRfaWRlbnRpZmllcnMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl90YWJsZS5zeW1ib2xzLmtleXMoKQorCisgICAgZGVmIGxvb2t1cChzZWxmLCBuYW1lKToKKyAgICAgICAgc3ltID0gc2VsZi5fc3ltYm9scy5nZXQobmFtZSkKKyAgICAgICAgaWYgc3ltIGlzIE5vbmU6CisgICAgICAgICAgICBmbGFncyA9IHNlbGYuX3RhYmxlLnN5bWJvbHNbbmFtZV0KKyAgICAgICAgICAgIG5hbWVzcGFjZXMgPSBzZWxmLl9fY2hlY2tfY2hpbGRyZW4obmFtZSkKKyAgICAgICAgICAgIHN5bSA9IHNlbGYuX3N5bWJvbHNbbmFtZV0gPSBTeW1ib2wobmFtZSwgZmxhZ3MsIG5hbWVzcGFjZXMpCisgICAgICAgIHJldHVybiBzeW0KKworICAgIGRlZiBnZXRfc3ltYm9scyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtzZWxmLmxvb2t1cChpZGVudCkgZm9yIGlkZW50IGluIHNlbGYuZ2V0X2lkZW50aWZpZXJzKCldCisKKyAgICBkZWYgX19jaGVja19jaGlsZHJlbihzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIFtfbmV3U3ltYm9sVGFibGUoc3QsIHNlbGYuX2ZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGZvciBzdCBpbiBzZWxmLl90YWJsZS5jaGlsZHJlbgorICAgICAgICAgICAgICAgIGlmIHN0Lm5hbWUgPT0gbmFtZV0KKworICAgIGRlZiBnZXRfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBbX25ld1N5bWJvbFRhYmxlKHN0LCBzZWxmLl9maWxlbmFtZSkKKyAgICAgICAgICAgICAgICBmb3Igc3QgaW4gc2VsZi5fdGFibGUuY2hpbGRyZW5dCisKKworY2xhc3MgRnVuY3Rpb24oU3ltYm9sVGFibGUpOgorCisgICAgIyBEZWZhdWx0IHZhbHVlcyBmb3IgaW5zdGFuY2UgdmFyaWFibGVzCisgICAgX19wYXJhbXMgPSBOb25lCisgICAgX19sb2NhbHMgPSBOb25lCisgICAgX19mcmVlcyA9IE5vbmUKKyAgICBfX2dsb2JhbHMgPSBOb25lCisKKyAgICBkZWYgX19pZGVudHNfbWF0Y2hpbmcoc2VsZiwgdGVzdF9mdW5jKToKKyAgICAgICAgcmV0dXJuIHR1cGxlKFtpZGVudCBmb3IgaWRlbnQgaW4gc2VsZi5nZXRfaWRlbnRpZmllcnMoKQorICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3RfZnVuYyhzZWxmLl90YWJsZS5zeW1ib2xzW2lkZW50XSldKQorCisgICAgZGVmIGdldF9wYXJhbWV0ZXJzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fcGFyYW1zIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9fcGFyYW1zID0gc2VsZi5fX2lkZW50c19tYXRjaGluZyhsYW1iZGEgeDp4ICYgREVGX1BBUkFNKQorICAgICAgICByZXR1cm4gc2VsZi5fX3BhcmFtcworCisgICAgZGVmIGdldF9sb2NhbHMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX19sb2NhbHMgaXMgTm9uZToKKyAgICAgICAgICAgIGxvY3MgPSAoTE9DQUwsIENFTEwpCisgICAgICAgICAgICB0ZXN0ID0gbGFtYmRhIHg6ICgoeCA+PiBTQ09QRV9PRkYpICYgU0NPUEVfTUFTSykgaW4gbG9jcworICAgICAgICAgICAgc2VsZi5fX2xvY2FscyA9IHNlbGYuX19pZGVudHNfbWF0Y2hpbmcodGVzdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19sb2NhbHMKKworICAgIGRlZiBnZXRfZ2xvYmFscyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX2dsb2JhbHMgaXMgTm9uZToKKyAgICAgICAgICAgIGdsb2IgPSAoR0xPQkFMX0lNUExJQ0lULCBHTE9CQUxfRVhQTElDSVQpCisgICAgICAgICAgICB0ZXN0ID0gbGFtYmRhIHg6KCh4ID4+IFNDT1BFX09GRikgJiBTQ09QRV9NQVNLKSBpbiBnbG9iCisgICAgICAgICAgICBzZWxmLl9fZ2xvYmFscyA9IHNlbGYuX19pZGVudHNfbWF0Y2hpbmcodGVzdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19nbG9iYWxzCisKKyAgICBkZWYgZ2V0X2ZyZWVzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fZnJlZXMgaXMgTm9uZToKKyAgICAgICAgICAgIGlzX2ZyZWUgPSBsYW1iZGEgeDooKHggPj4gU0NPUEVfT0ZGKSAmIFNDT1BFX01BU0spID09IEZSRUUKKyAgICAgICAgICAgIHNlbGYuX19mcmVlcyA9IHNlbGYuX19pZGVudHNfbWF0Y2hpbmcoaXNfZnJlZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuX19mcmVlcworCisKK2NsYXNzIENsYXNzKFN5bWJvbFRhYmxlKToKKworICAgIF9fbWV0aG9kcyA9IE5vbmUKKworICAgIGRlZiBnZXRfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX21ldGhvZHMgaXMgTm9uZToKKyAgICAgICAgICAgIGQgPSB7fQorICAgICAgICAgICAgZm9yIHN0IGluIHNlbGYuX3RhYmxlLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIGRbc3QubmFtZV0gPSAxCisgICAgICAgICAgICBzZWxmLl9fbWV0aG9kcyA9IHR1cGxlKGQpCisgICAgICAgIHJldHVybiBzZWxmLl9fbWV0aG9kcworCisKK2NsYXNzIFN5bWJvbChvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZsYWdzLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5fX2ZsYWdzID0gZmxhZ3MKKyAgICAgICAgc2VsZi5fX3Njb3BlID0gKGZsYWdzID4+IFNDT1BFX09GRikgJiBTQ09QRV9NQVNLICMgbGlrZSBQeVNUX0dldFNjb3BlKCkKKyAgICAgICAgc2VsZi5fX25hbWVzcGFjZXMgPSBuYW1lc3BhY2VzIG9yICgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPHN5bWJvbCB7MCFyfT4iLmZvcm1hdChzZWxmLl9fbmFtZSkKKworICAgIGRlZiBnZXRfbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lCisKKyAgICBkZWYgaXNfcmVmZXJlbmNlZChzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX2ZsYWdzICYgX3N5bXRhYmxlLlVTRSkKKworICAgIGRlZiBpc19wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX19mbGFncyAmIERFRl9QQVJBTSkKKworICAgIGRlZiBpc19nbG9iYWwoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX19zY29wZSBpbiAoR0xPQkFMX0lNUExJQ0lULCBHTE9CQUxfRVhQTElDSVQpKQorCisgICAgZGVmIGlzX2RlY2xhcmVkX2dsb2JhbChzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX3Njb3BlID09IEdMT0JBTF9FWFBMSUNJVCkKKworICAgIGRlZiBpc19sb2NhbChzZWxmKToKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX2ZsYWdzICYgREVGX0JPVU5EKQorCisgICAgZGVmIGlzX2ZyZWUoc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYuX19zY29wZSA9PSBGUkVFKQorCisgICAgZGVmIGlzX2ltcG9ydGVkKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fZmxhZ3MgJiBERUZfSU1QT1JUKQorCisgICAgZGVmIGlzX2Fzc2lnbmVkKHNlbGYpOgorICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9fZmxhZ3MgJiBERUZfTE9DQUwpCisKKyAgICBkZWYgaXNfbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRydWUgaWYgbmFtZSBiaW5kaW5nIGludHJvZHVjZXMgbmV3IG5hbWVzcGFjZS4KKworICAgICAgICBJZiB0aGUgbmFtZSBpcyB1c2VkIGFzIHRoZSB0YXJnZXQgb2YgYSBmdW5jdGlvbiBvciBjbGFzcworICAgICAgICBzdGF0ZW1lbnQsIHRoaXMgd2lsbCBiZSB0cnVlLgorCisgICAgICAgIE5vdGUgdGhhdCBhIHNpbmdsZSBuYW1lIGNhbiBiZSBib3VuZCB0byBtdWx0aXBsZSBvYmplY3RzLiAgSWYKKyAgICAgICAgaXNfbmFtZXNwYWNlKCkgaXMgdHJ1ZSwgdGhlIG5hbWUgbWF5IGFsc28gYmUgYm91bmQgdG8gb3RoZXIKKyAgICAgICAgb2JqZWN0cywgbGlrZSBhbiBpbnQgb3IgbGlzdCwgdGhhdCBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBuZXcKKyAgICAgICAgbmFtZXNwYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fX25hbWVzcGFjZXMpCisKKyAgICBkZWYgZ2V0X25hbWVzcGFjZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbmFtZXNwYWNlcyBib3VuZCB0byB0aGlzIG5hbWUiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19uYW1lc3BhY2VzCisKKyAgICBkZWYgZ2V0X25hbWVzcGFjZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgc2luZ2xlIG5hbWVzcGFjZSBib3VuZCB0byB0aGlzIG5hbWUuCisKKyAgICAgICAgUmFpc2VzIFZhbHVlRXJyb3IgaWYgdGhlIG5hbWUgaXMgYm91bmQgdG8gbXVsdGlwbGUgbmFtZXNwYWNlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihzZWxmLl9fbmFtZXNwYWNlcykgIT0gMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJuYW1lIGlzIGJvdW5kIHRvIG11bHRpcGxlIG5hbWVzcGFjZXMiCisgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZXNwYWNlc1swXQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCBvcywgc3lzCisgICAgc3JjID0gb3BlbihzeXMuYXJndlswXSkucmVhZCgpCisgICAgbW9kID0gc3ltdGFibGUoc3JjLCBvcy5wYXRoLnNwbGl0KHN5cy5hcmd2WzBdKVsxXSwgImV4ZWMiKQorICAgIGZvciBpZGVudCBpbiBtb2QuZ2V0X2lkZW50aWZpZXJzKCk6CisgICAgICAgIGluZm8gPSBtb2QubG9va3VwKGlkZW50KQorICAgICAgICBwcmludCBpbmZvLCBpbmZvLmlzX2xvY2FsKCksIGluZm8uaXNfbmFtZXNwYWNlKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3ltdGFibGUucHljIGIvbGliL3B5dGhvbjIuNy9zeW10YWJsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2ODQzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3ltdGFibGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3ltdGFibGUucHlvIGIvbGliL3B5dGhvbjIuNy9zeW10YWJsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNlMTg2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3ltdGFibGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3lzY29uZmlnLnB5IGIvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkYmUwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvc3lzY29uZmlnLnB5CkBAIC0wLDAgKzEsNjUyIEBACisiIiJQcm92aWRlIGFjY2VzcyB0byBQeXRob24ncyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorCisiIiIKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworZnJvbSBvcy5wYXRoIGltcG9ydCBwYXJkaXIsIHJlYWxwYXRoCisKK19JTlNUQUxMX1NDSEVNRVMgPSB7CisgICAgJ3Bvc2l4X3ByZWZpeCc6IHsKKyAgICAgICAgJ3N0ZGxpYic6ICd7YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwbGF0c3RkbGliJzogJ3twbGF0YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwdXJlbGliJzogJ3tiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAncGxhdGxpYic6ICd7cGxhdGJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdpbmNsdWRlJzogJ3tiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwbGF0aW5jbHVkZSc6ICd7cGxhdGJhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3NjcmlwdHMnOiAne2Jhc2V9L2JpbicsCisgICAgICAgICdkYXRhJzogJ3tiYXNlfScsCisgICAgICAgIH0sCisgICAgJ3Bvc2l4X2hvbWUnOiB7CisgICAgICAgICdzdGRsaWInOiAne2Jhc2V9L2xpYi9weXRob24nLAorICAgICAgICAncGxhdHN0ZGxpYic6ICd7YmFzZX0vbGliL3B5dGhvbicsCisgICAgICAgICdwdXJlbGliJzogJ3tiYXNlfS9saWIvcHl0aG9uJywKKyAgICAgICAgJ3BsYXRsaWInOiAne2Jhc2V9L2xpYi9weXRob24nLAorICAgICAgICAnaW5jbHVkZSc6ICd7YmFzZX0vaW5jbHVkZS9weXRob24nLAorICAgICAgICAncGxhdGluY2x1ZGUnOiAne2Jhc2V9L2luY2x1ZGUvcHl0aG9uJywKKyAgICAgICAgJ3NjcmlwdHMnOiAne2Jhc2V9L2JpbicsCisgICAgICAgICdkYXRhJyAgIDogJ3tiYXNlfScsCisgICAgICAgIH0sCisgICAgJ250JzogeworICAgICAgICAnc3RkbGliJzogJ3tiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRzdGRsaWInOiAne2Jhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAncHVyZWxpYic6ICd7YmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwbGF0bGliJzogJ3tiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ2luY2x1ZGUnOiAne2Jhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRpbmNsdWRlJzogJ3tiYXNlfS9pbmNsdWRlL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdzY3JpcHRzJzogJ3tiYXNlfS9iaW4nLAorICAgICAgICAnZGF0YScgICA6ICd7YmFzZX0nLAorICAgICAgICB9LAorICAgICdvczInOiB7CisgICAgICAgICdzdGRsaWInOiAne2Jhc2V9L0xpYicsCisgICAgICAgICdwbGF0c3RkbGliJzogJ3tiYXNlfS9MaWInLAorICAgICAgICAncHVyZWxpYic6ICd7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMnLAorICAgICAgICAncGxhdGxpYic6ICd7YmFzZX0vTGliL3NpdGUtcGFja2FnZXMnLAorICAgICAgICAnaW5jbHVkZSc6ICd7YmFzZX0vSW5jbHVkZScsCisgICAgICAgICdwbGF0aW5jbHVkZSc6ICd7YmFzZX0vSW5jbHVkZScsCisgICAgICAgICdzY3JpcHRzJzogJ3tiYXNlfS9TY3JpcHRzJywKKyAgICAgICAgJ2RhdGEnICAgOiAne2Jhc2V9JywKKyAgICAgICAgfSwKKyAgICAnb3MyX2hvbWUnOiB7CisgICAgICAgICdzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3BsYXRzdGRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3B1cmVsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAncGxhdGxpYic6ICd7dXNlcmJhc2V9L2xpYi9weXRob257cHlfdmVyc2lvbl9zaG9ydH0vc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICdpbmNsdWRlJzogJ3t1c2VyYmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAnc2NyaXB0cyc6ICd7dXNlcmJhc2V9L2JpbicsCisgICAgICAgICdkYXRhJyAgIDogJ3t1c2VyYmFzZX0nLAorICAgICAgICB9LAorICAgICdudF91c2VyJzogeworICAgICAgICAnc3RkbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwbGF0c3RkbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwdXJlbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwbGF0bGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdpbmNsdWRlJzogJ3t1c2VyYmFzZX0vaW5jbHVkZS9weXRob257cHlfdmVyc2lvbl9zaG9ydH0nLAorICAgICAgICAnc2NyaXB0cyc6ICd7dXNlcmJhc2V9L2JpbicsCisgICAgICAgICdkYXRhJyAgIDogJ3t1c2VyYmFzZX0nLAorICAgICAgICB9LAorICAgICdwb3NpeF91c2VyJzogeworICAgICAgICAnc3RkbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwbGF0c3RkbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fScsCisgICAgICAgICdwdXJlbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbntweV92ZXJzaW9uX3Nob3J0fS9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgJ3BsYXRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9L3NpdGUtcGFja2FnZXMnLAorICAgICAgICAnaW5jbHVkZSc6ICd7dXNlcmJhc2V9L2luY2x1ZGUvcHl0aG9ue3B5X3ZlcnNpb25fc2hvcnR9JywKKyAgICAgICAgJ3NjcmlwdHMnOiAne3VzZXJiYXNlfS9iaW4nLAorICAgICAgICAnZGF0YScgICA6ICd7dXNlcmJhc2V9JywKKyAgICAgICAgfSwKKyAgICAnb3N4X2ZyYW1ld29ya191c2VyJzogeworICAgICAgICAnc3RkbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbicsCisgICAgICAgICdwbGF0c3RkbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbicsCisgICAgICAgICdwdXJlbGliJzogJ3t1c2VyYmFzZX0vbGliL3B5dGhvbi9zaXRlLXBhY2thZ2VzJywKKyAgICAgICAgJ3BsYXRsaWInOiAne3VzZXJiYXNlfS9saWIvcHl0aG9uL3NpdGUtcGFja2FnZXMnLAorICAgICAgICAnaW5jbHVkZSc6ICd7dXNlcmJhc2V9L2luY2x1ZGUnLAorICAgICAgICAnc2NyaXB0cyc6ICd7dXNlcmJhc2V9L2JpbicsCisgICAgICAgICdkYXRhJyAgIDogJ3t1c2VyYmFzZX0nLAorICAgICAgICB9LAorICAgIH0KKworX1NDSEVNRV9LRVlTID0gKCdzdGRsaWInLCAncGxhdHN0ZGxpYicsICdwdXJlbGliJywgJ3BsYXRsaWInLCAnaW5jbHVkZScsCisgICAgICAgICAgICAgICAgJ3NjcmlwdHMnLCAnZGF0YScpCitfUFlfVkVSU0lPTiA9IHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KK19QWV9WRVJTSU9OX1NIT1JUID0gc3lzLnZlcnNpb25bOjNdCitfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QgPSBfUFlfVkVSU0lPTlswXSArIF9QWV9WRVJTSU9OWzJdCitfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMucHJlZml4KQorX0VYRUNfUFJFRklYID0gb3MucGF0aC5ub3JtcGF0aChzeXMuZXhlY19wcmVmaXgpCitfQ09ORklHX1ZBUlMgPSBOb25lCitfVVNFUl9CQVNFID0gTm9uZQorCitkZWYgX3NhZmVfcmVhbHBhdGgocGF0aCk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gcmVhbHBhdGgocGF0aCkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcmV0dXJuIHBhdGgKKworaWYgc3lzLmV4ZWN1dGFibGU6CisgICAgX1BST0pFQ1RfQkFTRSA9IG9zLnBhdGguZGlybmFtZShfc2FmZV9yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkpCitlbHNlOgorICAgICMgc3lzLmV4ZWN1dGFibGUgY2FuIGJlIGVtcHR5IGlmIGFyZ3ZbMF0gaGFzIGJlZW4gY2hhbmdlZCBhbmQgUHl0aG9uIGlzCisgICAgIyB1bmFibGUgdG8gcmV0cmlldmUgdGhlIHJlYWwgcHJvZ3JhbSBuYW1lCisgICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLmdldGN3ZCgpKQorCitpZiBvcy5uYW1lID09ICJudCIgYW5kICJwY2J1aWxkIiBpbiBfUFJPSkVDVF9CQVNFWy04Ol0ubG93ZXIoKToKKyAgICBfUFJPSkVDVF9CQVNFID0gX3NhZmVfcmVhbHBhdGgob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsIHBhcmRpcikpCisjIFBDL1ZTNy4xCitpZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjXFx2IiBpbiBfUFJPSkVDVF9CQVNFWy0xMDpdLmxvd2VyKCk6CisgICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCBwYXJkaXIsIHBhcmRpcikpCisjIFBDL0FNRDY0CitpZiBvcy5uYW1lID09ICJudCIgYW5kICJcXHBjYnVpbGRcXGFtZDY0IiBpbiBfUFJPSkVDVF9CQVNFWy0xNDpdLmxvd2VyKCk6CisgICAgX1BST0pFQ1RfQkFTRSA9IF9zYWZlX3JlYWxwYXRoKG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCBwYXJkaXIsIHBhcmRpcikpCisKKyMgc2V0IGZvciBjcm9zcyBidWlsZHMKK2lmICJfUFlUSE9OX1BST0pFQ1RfQkFTRSIgaW4gb3MuZW52aXJvbjoKKyAgICAjIHRoZSBidWlsZCBkaXJlY3RvcnkgZm9yIHBvc2l4IGJ1aWxkcworICAgIF9QUk9KRUNUX0JBU0UgPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguYWJzcGF0aCgiLiIpKQorZGVmIGlzX3B5dGhvbl9idWlsZCgpOgorICAgIGZvciBmbiBpbiAoIlNldHVwLmRpc3QiLCAiU2V0dXAubG9jYWwiKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKF9QUk9KRUNUX0JBU0UsICJNb2R1bGVzIiwgZm4pKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKK19QWVRIT05fQlVJTEQgPSBpc19weXRob25fYnVpbGQoKQorCitpZiBfUFlUSE9OX0JVSUxEOgorICAgIGZvciBzY2hlbWUgaW4gKCdwb3NpeF9wcmVmaXgnLCAncG9zaXhfaG9tZScpOgorICAgICAgICBfSU5TVEFMTF9TQ0hFTUVTW3NjaGVtZV1bJ2luY2x1ZGUnXSA9ICd7c3JjZGlyfS9JbmNsdWRlJworICAgICAgICBfSU5TVEFMTF9TQ0hFTUVTW3NjaGVtZV1bJ3BsYXRpbmNsdWRlJ10gPSAne3Byb2plY3RiYXNlfScKKworICAgICMgR0NDKG1pbmd3KSB1c2UgcG9zaXggYnVpbGQgc3lzdGVtCisgICAgaWYgb3MubmFtZSA9PSAibnQiIGFuZCBzeXMudmVyc2lvbi5maW5kKCdHQ0MnKSA+PSAwOgorICAgICAgICBfSU5TVEFMTF9TQ0hFTUVTWydudCddWydpbmNsdWRlJ10gPSAne3NyY2Rpcn0vSW5jbHVkZScKKyAgICAgICAgX0lOU1RBTExfU0NIRU1FU1snbnQnXVsncGxhdGluY2x1ZGUnXSA9ICd7cHJvamVjdGJhc2V9JworCitkZWYgX3N1YnN0X3ZhcnMocywgbG9jYWxfdmFycyk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gcy5mb3JtYXQoKipsb2NhbF92YXJzKQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHMuZm9ybWF0KCoqb3MuZW52aXJvbikKKyAgICAgICAgZXhjZXB0IEtleUVycm9yLCB2YXI6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigneyVzfScgJSB2YXIpCisKK2RlZiBfZXh0ZW5kX2RpY3QodGFyZ2V0X2RpY3QsIG90aGVyX2RpY3QpOgorICAgIHRhcmdldF9rZXlzID0gdGFyZ2V0X2RpY3Qua2V5cygpCisgICAgZm9yIGtleSwgdmFsdWUgaW4gb3RoZXJfZGljdC5pdGVtcygpOgorICAgICAgICBpZiBrZXkgaW4gdGFyZ2V0X2tleXM6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0YXJnZXRfZGljdFtrZXldID0gdmFsdWUKKworZGVmIF9leHBhbmRfdmFycyhzY2hlbWUsIHZhcnMpOgorICAgIHJlcyA9IHt9CisgICAgaWYgdmFycyBpcyBOb25lOgorICAgICAgICB2YXJzID0ge30KKyAgICBfZXh0ZW5kX2RpY3QodmFycywgZ2V0X2NvbmZpZ192YXJzKCkpCisKKyAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfSU5TVEFMTF9TQ0hFTUVTW3NjaGVtZV0uaXRlbXMoKToKKyAgICAgICAgaWYgb3MubmFtZSBpbiAoJ3Bvc2l4JywgJ250Jyk6CisgICAgICAgICAgICB2YWx1ZSA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWx1ZSkKKyAgICAgICAgcmVzW2tleV0gPSBvcy5wYXRoLm5vcm1wYXRoKF9zdWJzdF92YXJzKHZhbHVlLCB2YXJzKSkKKyAgICByZXR1cm4gcmVzCisKK2RlZiBfZ2V0X2RlZmF1bHRfc2NoZW1lKCk6CisgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAjIHRoZSBkZWZhdWx0IHNjaGVtZSBmb3IgcG9zaXggaXMgcG9zaXhfcHJlZml4CisgICAgICAgIHJldHVybiAncG9zaXhfcHJlZml4JworICAgIHJldHVybiBvcy5uYW1lCisKK2RlZiBfZ2V0dXNlcmJhc2UoKToKKyAgICBlbnZfYmFzZSA9IG9zLmVudmlyb24uZ2V0KCJQWVRIT05VU0VSQkFTRSIsIE5vbmUpCisgICAgZGVmIGpvaW51c2VyKCphcmdzKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcihvcy5wYXRoLmpvaW4oKmFyZ3MpKQorCisgICAgIyB3aGF0IGFib3V0ICdvczJlbXgnLCAncmlzY29zJyA/CisgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICBiYXNlID0gb3MuZW52aXJvbi5nZXQoIkFQUERBVEEiKSBvciAifiIKKyAgICAgICAgcmV0dXJuIGVudl9iYXNlIGlmIGVudl9iYXNlIGVsc2Ugam9pbnVzZXIoYmFzZSwgIlB5dGhvbiIpCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgIGZyYW1ld29yayA9IGdldF9jb25maWdfdmFyKCJQWVRIT05GUkFNRVdPUksiKQorICAgICAgICBpZiBmcmFtZXdvcms6CisgICAgICAgICAgICByZXR1cm4gZW52X2Jhc2UgaWYgZW52X2Jhc2UgZWxzZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgam9pbnVzZXIoIn4iLCAiTGlicmFyeSIsIGZyYW1ld29yaywgIiVkLiVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzeXMudmVyc2lvbl9pbmZvWzoyXSkpCisKKyAgICByZXR1cm4gZW52X2Jhc2UgaWYgZW52X2Jhc2UgZWxzZSBqb2ludXNlcigifiIsICIubG9jYWwiKQorCisKK2RlZiBfcGFyc2VfbWFrZWZpbGUoZmlsZW5hbWUsIHZhcnM9Tm9uZSk6CisgICAgIiIiUGFyc2UgYSBNYWtlZmlsZS1zdHlsZSBmaWxlLgorCisgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpcyByZXR1cm5lZC4gIElmIGFuCisgICAgb3B0aW9uYWwgZGljdGlvbmFyeSBpcyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgaXQgaXMKKyAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KKyAgICAiIiIKKyAgICBpbXBvcnQgcmUKKyAgICAjIFJlZ2V4ZXMgbmVlZGVkIGZvciBwYXJzaW5nIE1ha2VmaWxlIChhbmQgc2ltaWxhciBzeW50YXhlcywKKyAgICAjIGxpa2Ugb2xkLXN0eWxlIFNldHVwIGZpbGVzKS4KKyAgICBfdmFyaWFibGVfcnggPSByZS5jb21waWxlKCIoW2EtekEtWl1bYS16QS1aMC05X10rKVxzKj1ccyooLiopIikKKyAgICBfZmluZHZhcjFfcnggPSByZS5jb21waWxlKHIiXCRcKChbQS1aYS16XVtBLVphLXowLTlfXSopXCkiKQorICAgIF9maW5kdmFyMl9yeCA9IHJlLmNvbXBpbGUociJcJHsoW0EtWmEtel1bQS1aYS16MC05X10qKX0iKQorCisgICAgaWYgdmFycyBpcyBOb25lOgorICAgICAgICB2YXJzID0ge30KKyAgICBkb25lID0ge30KKyAgICBub3Rkb25lID0ge30KKworICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZjoKKyAgICAgICAgbGluZXMgPSBmLnJlYWRsaW5lcygpCisKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCcjJykgb3IgbGluZS5zdHJpcCgpID09ICcnOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbSA9IF92YXJpYWJsZV9yeC5tYXRjaChsaW5lKQorICAgICAgICBpZiBtOgorICAgICAgICAgICAgbiwgdiA9IG0uZ3JvdXAoMSwgMikKKyAgICAgICAgICAgIHYgPSB2LnN0cmlwKCkKKyAgICAgICAgICAgICMgYCQkJyBpcyBhIGxpdGVyYWwgYCQnIGluIG1ha2UKKyAgICAgICAgICAgIHRtcHYgPSB2LnJlcGxhY2UoJyQkJywgJycpCisKKyAgICAgICAgICAgIGlmICIkIiBpbiB0bXB2OgorICAgICAgICAgICAgICAgIG5vdGRvbmVbbl0gPSB2CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdiA9IGludCh2KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIGluc2VydCBsaXRlcmFsIGAkJworICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gdi5yZXBsYWNlKCckJCcsICckJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gdgorCisgICAgIyBkbyB2YXJpYWJsZSBpbnRlcnBvbGF0aW9uIGhlcmUKKyAgICB3aGlsZSBub3Rkb25lOgorICAgICAgICBmb3IgbmFtZSBpbiBub3Rkb25lLmtleXMoKToKKyAgICAgICAgICAgIHZhbHVlID0gbm90ZG9uZVtuYW1lXQorICAgICAgICAgICAgbSA9IF9maW5kdmFyMV9yeC5zZWFyY2godmFsdWUpIG9yIF9maW5kdmFyMl9yeC5zZWFyY2godmFsdWUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIG4gPSBtLmdyb3VwKDEpCisgICAgICAgICAgICAgICAgZm91bmQgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgbiBpbiBkb25lOgorICAgICAgICAgICAgICAgICAgICBpdGVtID0gc3RyKGRvbmVbbl0pCisgICAgICAgICAgICAgICAgZWxpZiBuIGluIG5vdGRvbmU6CisgICAgICAgICAgICAgICAgICAgICMgZ2V0IGl0IG9uIGEgc3Vic2VxdWVudCByb3VuZAorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxpZiBuIGluIG9zLmVudmlyb246CisgICAgICAgICAgICAgICAgICAgICMgZG8gaXQgbGlrZSBtYWtlOiBmYWxsIGJhY2sgdG8gZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgaXRlbSA9IG9zLmVudmlyb25bbl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkb25lW25dID0gaXRlbSA9ICIiCisgICAgICAgICAgICAgICAgaWYgZm91bmQ6CisgICAgICAgICAgICAgICAgICAgIGFmdGVyID0gdmFsdWVbbS5lbmQoKTpdCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVbOm0uc3RhcnQoKV0gKyBpdGVtICsgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgIiQiIGluIGFmdGVyOgorICAgICAgICAgICAgICAgICAgICAgICAgbm90ZG9uZVtuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6IHZhbHVlID0gaW50KHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlLnN0cmlwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVtuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgbm90ZG9uZVtuYW1lXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGJvZ3VzIHZhcmlhYmxlIHJlZmVyZW5jZTsganVzdCBkcm9wIGl0IHNpbmNlIHdlIGNhbid0IGRlYWwKKyAgICAgICAgICAgICAgICBkZWwgbm90ZG9uZVtuYW1lXQorICAgICMgc3RyaXAgc3B1cmlvdXMgc3BhY2VzCisgICAgZm9yIGssIHYgaW4gZG9uZS5pdGVtcygpOgorICAgICAgICBpZiBpc2luc3RhbmNlKHYsIHN0cik6CisgICAgICAgICAgICBkb25lW2tdID0gdi5zdHJpcCgpCisKKyAgICAjIHNhdmUgdGhlIHJlc3VsdHMgaW4gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5CisgICAgdmFycy51cGRhdGUoZG9uZSkKKyAgICByZXR1cm4gdmFycworCisKK2RlZiBfZ2V0X21ha2VmaWxlX2ZpbGVuYW1lKCk6CisgICAgaWYgX1BZVEhPTl9CVUlMRDoKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiTWFrZWZpbGUiKQorICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZ2V0X3BhdGgoJ3BsYXRzdGRsaWInKSwgImNvbmZpZyIsICJNYWtlZmlsZSIpCisKK2RlZiBfZ2VuZXJhdGVfcG9zaXhfdmFycygpOgorICAgICIiIkdlbmVyYXRlIHRoZSBQeXRob24gbW9kdWxlIGNvbnRhaW5pbmcgYnVpbGQtdGltZSB2YXJpYWJsZXMuIiIiCisgICAgaW1wb3J0IHBwcmludAorICAgIHZhcnMgPSB7fQorICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIE1ha2VmaWxlOgorICAgIG1ha2VmaWxlID0gX2dldF9tYWtlZmlsZV9maWxlbmFtZSgpCisgICAgdHJ5OgorICAgICAgICBfcGFyc2VfbWFrZWZpbGUobWFrZWZpbGUsIHZhcnMpCisgICAgZXhjZXB0IElPRXJyb3IsIGU6CisgICAgICAgIG1zZyA9ICJpbnZhbGlkIFB5dGhvbiBpbnN0YWxsYXRpb246IHVuYWJsZSB0byBvcGVuICVzIiAlIG1ha2VmaWxlCisgICAgICAgIGlmIGhhc2F0dHIoZSwgInN0cmVycm9yIik6CisgICAgICAgICAgICBtc2cgPSBtc2cgKyAiICglcykiICUgZS5zdHJlcnJvcgorICAgICAgICByYWlzZSBJT0Vycm9yKG1zZykKKworICAgICMgbG9hZCB0aGUgaW5zdGFsbGVkIHB5Y29uZmlnLmg6CisgICAgY29uZmlnX2ggPSBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKQorICAgIHRyeToKKyAgICAgICAgd2l0aCBvcGVuKGNvbmZpZ19oKSBhcyBmOgorICAgICAgICAgICAgcGFyc2VfY29uZmlnX2goZiwgdmFycykKKyAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgbXNnID0gImludmFsaWQgUHl0aG9uIGluc3RhbGxhdGlvbjogdW5hYmxlIHRvIG9wZW4gJXMiICUgY29uZmlnX2gKKyAgICAgICAgaWYgaGFzYXR0cihlLCAic3RyZXJyb3IiKToKKyAgICAgICAgICAgIG1zZyA9IG1zZyArICIgKCVzKSIgJSBlLnN0cmVycm9yCisgICAgICAgIHJhaXNlIElPRXJyb3IobXNnKQorCisgICAgIyBPbiBBSVgsIHRoZXJlIGFyZSB3cm9uZyBwYXRocyB0byB0aGUgbGlua2VyIHNjcmlwdHMgaW4gdGhlIE1ha2VmaWxlCisgICAgIyAtLSB0aGVzZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIFB5dGhvbiBzb3VyY2UsIGJ1dCB3aGVuIGluc3RhbGxlZAorICAgICMgdGhlIHNjcmlwdHMgYXJlIGluIGFub3RoZXIgZGlyZWN0b3J5LgorICAgIGlmIF9QWVRIT05fQlVJTEQ6CisgICAgICAgIHZhcnNbJ0xEU0hBUkVEJ10gPSB2YXJzWydCTERTSEFSRUQnXQorCisgICAgIyBUaGVyZSdzIGEgY2hpY2tlbi1hbmQtZWdnIHNpdHVhdGlvbiBvbiBPUyBYIHdpdGggcmVnYXJkcyB0byB0aGUKKyAgICAjIF9zeXNjb25maWdkYXRhIG1vZHVsZSBhZnRlciB0aGUgY2hhbmdlcyBpbnRyb2R1Y2VkIGJ5ICMxNTI5ODoKKyAgICAjIGdldF9jb25maWdfdmFycygpIGlzIGNhbGxlZCBieSBnZXRfcGxhdGZvcm0oKSBhcyBwYXJ0IG9mIHRoZQorICAgICMgYG1ha2UgcHlidWlsZGRpci50eHRgIHRhcmdldCAtLSB3aGljaCBpcyBhIHByZWN1cnNvciB0byB0aGUKKyAgICAjIF9zeXNjb25maWdkYXRhLnB5IG1vZHVsZSBiZWluZyBjb25zdHJ1Y3RlZC4gIFVuZm9ydHVuYXRlbHksCisgICAgIyBnZXRfY29uZmlnX3ZhcnMoKSBldmVudHVhbGx5IGNhbGxzIF9pbml0X3Bvc2l4KCksIHdoaWNoIGF0dGVtcHRzCisgICAgIyB0byBpbXBvcnQgX3N5c2NvbmZpZ2RhdGEsIHdoaWNoIHdlIHdvbid0IGhhdmUgYnVpbHQgeWV0LiAgSW4gb3JkZXIKKyAgICAjIGZvciBfaW5pdF9wb3NpeCgpIHRvIHdvcmssIGlmIHdlJ3JlIG9uIERhcndpbiwganVzdCBtb2NrIHVwIHRoZQorICAgICMgX3N5c2NvbmZpZ2RhdGEgbW9kdWxlIG1hbnVhbGx5IGFuZCBwb3B1bGF0ZSBpdCB3aXRoIHRoZSBidWlsZCB2YXJzLgorICAgICMgVGhpcyBpcyBtb3JlIHRoYW4gc3VmZmljaWVudCBmb3IgZW5zdXJpbmcgdGhlIHN1YnNlcXVlbnQgY2FsbCB0bworICAgICMgZ2V0X3BsYXRmb3JtKCkgc3VjY2VlZHMuCisgICAgbmFtZSA9ICdfc3lzY29uZmlnZGF0YScKKyAgICBpZiAnZGFyd2luJyBpbiBzeXMucGxhdGZvcm06CisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgbW9kdWxlID0gaW1wLm5ld19tb2R1bGUobmFtZSkKKyAgICAgICAgbW9kdWxlLmJ1aWxkX3RpbWVfdmFycyA9IHZhcnMKKyAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGUKKworICAgIHB5YnVpbGRkaXIgPSAnYnVpbGQvbGliLiVzLSVzJyAlIChnZXRfcGxhdGZvcm0oKSwgc3lzLnZlcnNpb25bOjNdKQorICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBweWJ1aWxkZGlyICs9ICctcHlkZWJ1ZycKKyAgICB0cnk6CisgICAgICAgIG9zLm1ha2VkaXJzKHB5YnVpbGRkaXIpCisgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBkZXN0ZmlsZSA9IG9zLnBhdGguam9pbihweWJ1aWxkZGlyLCBuYW1lICsgJy5weScpCisKKyAgICB3aXRoIG9wZW4oZGVzdGZpbGUsICd3YicpIGFzIGY6CisgICAgICAgIGYud3JpdGUoJyMgc3lzdGVtIGNvbmZpZ3VyYXRpb24gZ2VuZXJhdGVkIGFuZCB1c2VkIGJ5JworICAgICAgICAgICAgICAgICcgdGhlIHN5c2NvbmZpZyBtb2R1bGVcbicpCisgICAgICAgIGYud3JpdGUoJ2J1aWxkX3RpbWVfdmFycyA9ICcpCisgICAgICAgIHBwcmludC5wcHJpbnQodmFycywgc3RyZWFtPWYpCisKKyAgICAjIENyZWF0ZSBmaWxlIHVzZWQgZm9yIHN5cy5wYXRoIGZpeHVwIC0tIHNlZSBNb2R1bGVzL2dldHBhdGguYworICAgIHdpdGggb3BlbigncHlidWlsZGRpci50eHQnLCAndycpIGFzIGY6CisgICAgICAgIGYud3JpdGUocHlidWlsZGRpcikKKworZGVmIF9pbml0X3Bvc2l4KHZhcnMpOgorICAgICIiIkluaXRpYWxpemUgdGhlIG1vZHVsZSBhcyBhcHByb3ByaWF0ZSBmb3IgUE9TSVggc3lzdGVtcy4iIiIKKyAgICAjIF9zeXNjb25maWdkYXRhIGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lLCBzZWUgX2dlbmVyYXRlX3Bvc2l4X3ZhcnMoKQorICAgIGZyb20gX3N5c2NvbmZpZ2RhdGEgaW1wb3J0IGJ1aWxkX3RpbWVfdmFycworICAgIHZhcnMudXBkYXRlKGJ1aWxkX3RpbWVfdmFycykKKworZGVmIF9pbml0X25vbl9wb3NpeCh2YXJzKToKKyAgICAiIiJJbml0aWFsaXplIHRoZSBtb2R1bGUgYXMgYXBwcm9wcmlhdGUgZm9yIE5UIiIiCisgICAgIyBzZXQgYmFzaWMgaW5zdGFsbCBkaXJlY3RvcmllcworICAgIHZhcnNbJ0xJQkRFU1QnXSA9IGdldF9wYXRoKCdzdGRsaWInKQorICAgIHZhcnNbJ0JJTkxJQkRFU1QnXSA9IGdldF9wYXRoKCdwbGF0c3RkbGliJykKKyAgICB2YXJzWydJTkNMVURFUFknXSA9IGdldF9wYXRoKCdpbmNsdWRlJykKKyAgICB2YXJzWydTTyddID0gJy5weWQnCisgICAgdmFyc1snRVhFJ10gPSAnLmV4ZScKKyAgICB2YXJzWydWRVJTSU9OJ10gPSBfUFlfVkVSU0lPTl9TSE9SVF9OT19ET1QKKyAgICB2YXJzWydCSU5ESVInXSA9IG9zLnBhdGguZGlybmFtZShfc2FmZV9yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkpCisKKyMKKyMgcHVibGljIEFQSXMKKyMKKworCitkZWYgcGFyc2VfY29uZmlnX2goZnAsIHZhcnM9Tm9uZSk6CisgICAgIiIiUGFyc2UgYSBjb25maWcuaC1zdHlsZSBmaWxlLgorCisgICAgQSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgbmFtZS92YWx1ZSBwYWlycyBpcyByZXR1cm5lZC4gIElmIGFuCisgICAgb3B0aW9uYWwgZGljdGlvbmFyeSBpcyBwYXNzZWQgaW4gYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgaXQgaXMKKyAgICB1c2VkIGluc3RlYWQgb2YgYSBuZXcgZGljdGlvbmFyeS4KKyAgICAiIiIKKyAgICBpbXBvcnQgcmUKKyAgICBpZiB2YXJzIGlzIE5vbmU6CisgICAgICAgIHZhcnMgPSB7fQorICAgIGRlZmluZV9yeCA9IHJlLmNvbXBpbGUoIiNkZWZpbmUgKFtBLVpdW0EtWmEtejAtOV9dKykgKC4qKVxuIikKKyAgICB1bmRlZl9yeCA9IHJlLmNvbXBpbGUoIi9bKl0gI3VuZGVmIChbQS1aXVtBLVphLXowLTlfXSspIFsqXS9cbiIpCisKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIG0gPSBkZWZpbmVfcngubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIG4sIHYgPSBtLmdyb3VwKDEsIDIpCisgICAgICAgICAgICB0cnk6IHYgPSBpbnQodikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgICAgICB2YXJzW25dID0gdgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbSA9IHVuZGVmX3J4Lm1hdGNoKGxpbmUpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIHZhcnNbbS5ncm91cCgxKV0gPSAwCisgICAgcmV0dXJuIHZhcnMKKworZGVmIGdldF9jb25maWdfaF9maWxlbmFtZSgpOgorICAgICIiIlJldHVybnMgdGhlIHBhdGggb2YgcHljb25maWcuaC4iIiIKKyAgICBpZiBfUFlUSE9OX0JVSUxEOgorICAgICAgICAjIEdDQyhtaW5ndyk6IG9zLm5hbWUgaXMgIm50IiBidXQgYnVpbGQgc3lzdGVtIGlzIHBvc2l4CisgICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IiBhbmQgc3lzLnZlcnNpb24uZmluZCgnR0NDJykgPCAwOgorICAgICAgICAgICAgaW5jX2RpciA9IG9zLnBhdGguam9pbihfUFJPSkVDVF9CQVNFLCAiUEMiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5jX2RpciA9IF9QUk9KRUNUX0JBU0UKKyAgICBlbHNlOgorICAgICAgICBpbmNfZGlyID0gZ2V0X3BhdGgoJ3BsYXRpbmNsdWRlJykKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKGluY19kaXIsICdweWNvbmZpZy5oJykKKworZGVmIGdldF9zY2hlbWVfbmFtZXMoKToKKyAgICAiIiJSZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0aGUgc2NoZW1lcyBuYW1lcy4iIiIKKyAgICBzY2hlbWVzID0gX0lOU1RBTExfU0NIRU1FUy5rZXlzKCkKKyAgICBzY2hlbWVzLnNvcnQoKQorICAgIHJldHVybiB0dXBsZShzY2hlbWVzKQorCitkZWYgZ2V0X3BhdGhfbmFtZXMoKToKKyAgICAiIiJSZXR1cm5zIGEgdHVwbGUgY29udGFpbmluZyB0aGUgcGF0aHMgbmFtZXMuIiIiCisgICAgcmV0dXJuIF9TQ0hFTUVfS0VZUworCitkZWYgZ2V0X3BhdGhzKHNjaGVtZT1fZ2V0X2RlZmF1bHRfc2NoZW1lKCksIHZhcnM9Tm9uZSwgZXhwYW5kPVRydWUpOgorICAgICIiIlJldHVybnMgYSBtYXBwaW5nIGNvbnRhaW5pbmcgYW4gaW5zdGFsbCBzY2hlbWUuCisKKyAgICBgYHNjaGVtZWBgIGlzIHRoZSBpbnN0YWxsIHNjaGVtZSBuYW1lLiBJZiBub3QgcHJvdmlkZWQsIGl0IHdpbGwKKyAgICByZXR1cm4gdGhlIGRlZmF1bHQgc2NoZW1lIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyAgICAiIiIKKyAgICBpZiBleHBhbmQ6CisgICAgICAgIHJldHVybiBfZXhwYW5kX3ZhcnMoc2NoZW1lLCB2YXJzKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBfSU5TVEFMTF9TQ0hFTUVTW3NjaGVtZV0KKworZGVmIGdldF9wYXRoKG5hbWUsIHNjaGVtZT1fZ2V0X2RlZmF1bHRfc2NoZW1lKCksIHZhcnM9Tm9uZSwgZXhwYW5kPVRydWUpOgorICAgICIiIlJldHVybnMgYSBwYXRoIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjaGVtZS4KKworICAgIGBgc2NoZW1lYGAgaXMgdGhlIGluc3RhbGwgc2NoZW1lIG5hbWUuCisgICAgIiIiCisgICAgcmV0dXJuIGdldF9wYXRocyhzY2hlbWUsIHZhcnMsIGV4cGFuZClbbmFtZV0KKworZGVmIGdldF9jb25maWdfdmFycygqYXJncyk6CisgICAgIiIiV2l0aCBubyBhcmd1bWVudHMsIHJldHVybiBhIGRpY3Rpb25hcnkgb2YgYWxsIGNvbmZpZ3VyYXRpb24KKyAgICB2YXJpYWJsZXMgcmVsZXZhbnQgZm9yIHRoZSBjdXJyZW50IHBsYXRmb3JtLgorCisgICAgT24gVW5peCwgdGhpcyBtZWFucyBldmVyeSB2YXJpYWJsZSBkZWZpbmVkIGluIFB5dGhvbidzIGluc3RhbGxlZCBNYWtlZmlsZTsKKyAgICBPbiBXaW5kb3dzIGFuZCBNYWMgT1MgaXQncyBhIG11Y2ggc21hbGxlciBzZXQuCisKKyAgICBXaXRoIGFyZ3VtZW50cywgcmV0dXJuIGEgbGlzdCBvZiB2YWx1ZXMgdGhhdCByZXN1bHQgZnJvbSBsb29raW5nIHVwCisgICAgZWFjaCBhcmd1bWVudCBpbiB0aGUgY29uZmlndXJhdGlvbiB2YXJpYWJsZSBkaWN0aW9uYXJ5LgorICAgICIiIgorICAgIGltcG9ydCByZQorICAgIGdsb2JhbCBfQ09ORklHX1ZBUlMKKyAgICBpZiBfQ09ORklHX1ZBUlMgaXMgTm9uZToKKyAgICAgICAgX0NPTkZJR19WQVJTID0ge30KKyAgICAgICAgIyBOb3JtYWxpemVkIHZlcnNpb25zIG9mIHByZWZpeCBhbmQgZXhlY19wcmVmaXggYXJlIGhhbmR5IHRvIGhhdmU7CisgICAgICAgICMgaW4gZmFjdCwgdGhlc2UgYXJlIHRoZSBzdGFuZGFyZCB2ZXJzaW9ucyB1c2VkIG1vc3QgcGxhY2VzIGluIHRoZQorICAgICAgICAjIERpc3R1dGlscy4KKyAgICAgICAgX0NPTkZJR19WQVJTWydwcmVmaXgnXSA9IF9QUkVGSVgKKyAgICAgICAgX0NPTkZJR19WQVJTWydleGVjX3ByZWZpeCddID0gX0VYRUNfUFJFRklYCisgICAgICAgIF9DT05GSUdfVkFSU1sncHlfdmVyc2lvbiddID0gX1BZX1ZFUlNJT04KKyAgICAgICAgX0NPTkZJR19WQVJTWydweV92ZXJzaW9uX3Nob3J0J10gPSBfUFlfVkVSU0lPTl9TSE9SVAorICAgICAgICBfQ09ORklHX1ZBUlNbJ3B5X3ZlcnNpb25fbm9kb3QnXSA9IF9QWV9WRVJTSU9OWzBdICsgX1BZX1ZFUlNJT05bMl0KKyAgICAgICAgX0NPTkZJR19WQVJTWydiYXNlJ10gPSBfUFJFRklYCisgICAgICAgIF9DT05GSUdfVkFSU1sncGxhdGJhc2UnXSA9IF9FWEVDX1BSRUZJWAorICAgICAgICBfQ09ORklHX1ZBUlNbJ3Byb2plY3RiYXNlJ10gPSBfUFJPSkVDVF9CQVNFCisKKyAgICAgICAgIyBHQ0MobWluZ3cpIHVzZSBwb3NpeCBidWlsZCBzeXN0ZW0KKyAgICAgICAgcG9zaXhfYnVpbGQgPSBOb25lCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHBvc2l4X2J1aWxkID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb3MubmFtZSBpbiAoJ250JywgJ29zMicpOgorICAgICAgICAgICAgICAgIGlmIHN5cy52ZXJzaW9uLmZpbmQoJ0dDQycpID49IDA6CisgICAgICAgICAgICAgICAgICAgIHBvc2l4X2J1aWxkID0gVHJ1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBvc2l4X2J1aWxkID0gRmFsc2UKKyAgICAgICAgaWYgcG9zaXhfYnVpbGQgPT0gRmFsc2U6CisgICAgICAgICAgICBfaW5pdF9ub25fcG9zaXgoX0NPTkZJR19WQVJTKQorICAgICAgICBpZiBwb3NpeF9idWlsZCA9PSBUcnVlOgorICAgICAgICAgICAgX2luaXRfcG9zaXgoX0NPTkZJR19WQVJTKQorCisgICAgICAgICMgU2V0dGluZyAndXNlcmJhc2UnIGlzIGRvbmUgYmVsb3cgdGhlIGNhbGwgdG8gdGhlCisgICAgICAgICMgaW5pdCBmdW5jdGlvbiB0byBlbmFibGUgdXNpbmcgJ2dldF9jb25maWdfdmFyJyBpbgorICAgICAgICAjIHRoZSBpbml0LWZ1bmN0aW9uLgorICAgICAgICBfQ09ORklHX1ZBUlNbJ3VzZXJiYXNlJ10gPSBfZ2V0dXNlcmJhc2UoKQorCisgICAgICAgIGlmICdzcmNkaXInIG5vdCBpbiBfQ09ORklHX1ZBUlM6CisgICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gX1BST0pFQ1RfQkFTRQorCisgICAgICAgICMgQ29udmVydCBzcmNkaXIgaW50byBhbiBhYnNvbHV0ZSBwYXRoIGlmIGl0IGFwcGVhcnMgbmVjZXNzYXJ5LgorICAgICAgICAjIE5vcm1hbGx5IGl0IGlzIHJlbGF0aXZlIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuICBIb3dldmVyLCBkdXJpbmcKKyAgICAgICAgIyB0ZXN0aW5nLCBmb3IgZXhhbXBsZSwgd2UgbWlnaHQgYmUgcnVubmluZyBhIG5vbi1pbnN0YWxsZWQgcHl0aG9uCisgICAgICAgICMgZnJvbSBhIGRpZmZlcmVudCBkaXJlY3RvcnkuCisgICAgICAgIGlmIF9QWVRIT05fQlVJTEQgYW5kIHBvc2l4X2J1aWxkID09IFRydWU6CisgICAgICAgICAgICBiYXNlID0gX1BST0pFQ1RfQkFTRQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBjd2QgPSBOb25lCisgICAgICAgICAgICBpZiAobm90IG9zLnBhdGguaXNhYnMoX0NPTkZJR19WQVJTWydzcmNkaXInXSkgYW5kCisgICAgICAgICAgICAgICAgYmFzZSAhPSBjd2QpOgorICAgICAgICAgICAgICAgICMgc3JjZGlyIGlzIHJlbGF0aXZlIGFuZCB3ZSBhcmUgbm90IGluIHRoZSBzYW1lIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgICMgYXMgdGhlIGV4ZWN1dGFibGUuIEFzc3VtZSBleGVjdXRhYmxlIGlzIGluIHRoZSBidWlsZAorICAgICAgICAgICAgICAgICMgZGlyZWN0b3J5IGFuZCBtYWtlIHNyY2RpciBhYnNvbHV0ZS4KKyAgICAgICAgICAgICAgICBzcmNkaXIgPSBvcy5wYXRoLmpvaW4oYmFzZSwgX0NPTkZJR19WQVJTWydzcmNkaXInXSkKKyAgICAgICAgICAgICAgICBfQ09ORklHX1ZBUlNbJ3NyY2RpciddID0gb3MucGF0aC5ub3JtcGF0aChzcmNkaXIpCisKKyAgICAgICAgIyBPUyBYIHBsYXRmb3JtcyByZXF1aXJlIHNwZWNpYWwgY3VzdG9taXphdGlvbiB0byBoYW5kbGUKKyAgICAgICAgIyBtdWx0aS1hcmNoaXRlY3R1cmUsIG11bHRpLW9zLXZlcnNpb24gaW5zdGFsbGVycworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICBpbXBvcnQgX29zeF9zdXBwb3J0CisgICAgICAgICAgICBfb3N4X3N1cHBvcnQuY3VzdG9taXplX2NvbmZpZ192YXJzKF9DT05GSUdfVkFSUykKKworICAgIGlmIGFyZ3M6CisgICAgICAgIHZhbHMgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBhcmdzOgorICAgICAgICAgICAgdmFscy5hcHBlbmQoX0NPTkZJR19WQVJTLmdldChuYW1lKSkKKyAgICAgICAgcmV0dXJuIHZhbHMKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gX0NPTkZJR19WQVJTCisKK2RlZiBnZXRfY29uZmlnX3ZhcihuYW1lKToKKyAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIGEgc2luZ2xlIHZhcmlhYmxlIHVzaW5nIHRoZSBkaWN0aW9uYXJ5IHJldHVybmVkIGJ5CisgICAgJ2dldF9jb25maWdfdmFycygpJy4KKworICAgIEVxdWl2YWxlbnQgdG8gZ2V0X2NvbmZpZ192YXJzKCkuZ2V0KG5hbWUpCisgICAgIiIiCisgICAgcmV0dXJuIGdldF9jb25maWdfdmFycygpLmdldChuYW1lKQorCitkZWYgZ2V0X3BsYXRmb3JtKCk6CisgICAgIiIiUmV0dXJuIGEgc3RyaW5nIHRoYXQgaWRlbnRpZmllcyB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKworICAgIFRoaXMgaXMgdXNlZCBtYWlubHkgdG8gZGlzdGluZ3Vpc2ggcGxhdGZvcm0tc3BlY2lmaWMgYnVpbGQgZGlyZWN0b3JpZXMgYW5kCisgICAgcGxhdGZvcm0tc3BlY2lmaWMgYnVpbHQgZGlzdHJpYnV0aW9ucy4gIFR5cGljYWxseSBpbmNsdWRlcyB0aGUgT1MgbmFtZQorICAgIGFuZCB2ZXJzaW9uIGFuZCB0aGUgYXJjaGl0ZWN0dXJlIChhcyBzdXBwbGllZCBieSAnb3MudW5hbWUoKScpLAorICAgIGFsdGhvdWdoIHRoZSBleGFjdCBpbmZvcm1hdGlvbiBpbmNsdWRlZCBkZXBlbmRzIG9uIHRoZSBPUzsgZWcuIGZvciBJUklYCisgICAgdGhlIGFyY2hpdGVjdHVyZSBpc24ndCBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IChJUklYIG9ubHkgcnVucyBvbiBTR0kKKyAgICBoYXJkd2FyZSksIGJ1dCBmb3IgTGludXggdGhlIGtlcm5lbCB2ZXJzaW9uIGlzbid0IHBhcnRpY3VsYXJseQorICAgIGltcG9ydGFudC4KKworICAgIEV4YW1wbGVzIG9mIHJldHVybmVkIHZhbHVlczoKKyAgICAgICBsaW51eC1pNTg2CisgICAgICAgbGludXgtYWxwaGEgKD8pCisgICAgICAgc29sYXJpcy0yLjYtc3VuNHUKKyAgICAgICBpcml4LTUuMworICAgICAgIGlyaXg2NC02LjIKKworICAgIFdpbmRvd3Mgd2lsbCByZXR1cm4gb25lIG9mOgorICAgICAgIHdpbi1hbWQ2NCAoNjRiaXQgV2luZG93cyBvbiBBTUQ2NCAoYWthIHg4Nl82NCwgSW50ZWw2NCwgRU02NFQsIGV0YykKKyAgICAgICB3aW4taWE2NCAoNjRiaXQgV2luZG93cyBvbiBJdGFuaXVtKQorICAgICAgIHdpbjMyIChhbGwgb3RoZXJzIC0gc3BlY2lmaWNhbGx5LCBzeXMucGxhdGZvcm0gaXMgcmV0dXJuZWQpCisKKyAgICBGb3Igb3RoZXIgbm9uLVBPU0lYIHBsYXRmb3JtcywgY3VycmVudGx5IGp1c3QgcmV0dXJucyAnc3lzLnBsYXRmb3JtJy4KKyAgICAiIiIKKyAgICBpbXBvcnQgcmUKKyAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICMgc25pZmYgc3lzLnZlcnNpb24gZm9yIGFyY2hpdGVjdHVyZS4KKyAgICAgICAgcHJlZml4ID0gIiBiaXQgKCIKKyAgICAgICAgaSA9IHN5cy52ZXJzaW9uLmZpbmQocHJlZml4KQorICAgICAgICBpZiBpID09IC0xOgorICAgICAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQorICAgICAgICBqID0gc3lzLnZlcnNpb24uZmluZCgiKSIsIGkpCisgICAgICAgIGxvb2sgPSBzeXMudmVyc2lvbltpK2xlbihwcmVmaXgpOmpdLmxvd2VyKCkKKyAgICAgICAgaWYgbG9vayA9PSAnYW1kNjQnOgorICAgICAgICAgICAgcmV0dXJuICd3aW4tYW1kNjQnCisgICAgICAgIGlmIGxvb2sgPT0gJ2l0YW5pdW0nOgorICAgICAgICAgICAgcmV0dXJuICd3aW4taWE2NCcKKyAgICAgICAgcmV0dXJuIHN5cy5wbGF0Zm9ybQorCisgICAgIyBTZXQgZm9yIGNyb3NzIGJ1aWxkcyBleHBsaWNpdGx5CisgICAgaWYgIl9QWVRIT05fSE9TVF9QTEFURk9STSIgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bIl9QWVRIT05fSE9TVF9QTEFURk9STSJdCisKKyAgICBpZiBvcy5uYW1lICE9ICJwb3NpeCIgb3Igbm90IGhhc2F0dHIob3MsICd1bmFtZScpOgorICAgICAgICAjIFhYWCB3aGF0IGFib3V0IHRoZSBhcmNoaXRlY3R1cmU/IE5UIGlzIEludGVsIG9yIEFscGhhLAorICAgICAgICAjIE1hYyBPUyBpcyBNNjhrIG9yIFBQQywgZXRjLgorICAgICAgICByZXR1cm4gc3lzLnBsYXRmb3JtCisKKyAgICAjIFRyeSB0byBkaXN0aW5ndWlzaCB2YXJpb3VzIGZsYXZvdXJzIG9mIFVuaXgKKyAgICBvc25hbWUsIGhvc3QsIHJlbGVhc2UsIHZlcnNpb24sIG1hY2hpbmUgPSBvcy51bmFtZSgpCisKKyAgICAjIENvbnZlcnQgdGhlIE9TIG5hbWUgdG8gbG93ZXJjYXNlLCByZW1vdmUgJy8nIGNoYXJhY3RlcnMKKyAgICAjICh0byBhY2NvbW1vZGF0ZSBCU0QvT1MpLCBhbmQgdHJhbnNsYXRlIHNwYWNlcyAoZm9yICJQb3dlciBNYWNpbnRvc2giKQorICAgIG9zbmFtZSA9IG9zbmFtZS5sb3dlcigpLnJlcGxhY2UoJy8nLCAnJykKKyAgICBtYWNoaW5lID0gbWFjaGluZS5yZXBsYWNlKCcgJywgJ18nKQorICAgIG1hY2hpbmUgPSBtYWNoaW5lLnJlcGxhY2UoJy8nLCAnLScpCisKKyAgICBpZiBvc25hbWVbOjVdID09ICJsaW51eCI6CisgICAgICAgICMgQXQgbGVhc3Qgb24gTGludXgvSW50ZWwsICdtYWNoaW5lJyBpcyB0aGUgcHJvY2Vzc29yIC0tCisgICAgICAgICMgaTM4NiwgZXRjLgorICAgICAgICAjIFhYWCB3aGF0IGFib3V0IEFscGhhLCBTUEFSQywgZXRjPworICAgICAgICByZXR1cm4gICIlcy0lcyIgJSAob3NuYW1lLCBtYWNoaW5lKQorICAgIGVsaWYgb3NuYW1lWzo1XSA9PSAic3Vub3MiOgorICAgICAgICBpZiByZWxlYXNlWzBdID49ICI1IjogICAgICAgICAgICMgU3VuT1MgNSA9PSBTb2xhcmlzIDIKKyAgICAgICAgICAgIG9zbmFtZSA9ICJzb2xhcmlzIgorICAgICAgICAgICAgcmVsZWFzZSA9ICIlZC4lcyIgJSAoaW50KHJlbGVhc2VbMF0pIC0gMywgcmVsZWFzZVsyOl0pCisgICAgICAgICAgICAjIFdlIGNhbid0IHVzZSAicGxhdGZvcm0uYXJjaGl0ZWN0dXJlKClbMF0iIGJlY2F1c2UgYQorICAgICAgICAgICAgIyBib290c3RyYXAgcHJvYmxlbS4gV2UgdXNlIGEgZGljdCB0byBnZXQgYW4gZXJyb3IKKyAgICAgICAgICAgICMgaWYgc29tZSBzdXNwaWNpb3VzIGhhcHBlbnMuCisgICAgICAgICAgICBiaXRuZXNzID0gezIxNDc0ODM2NDc6IjMyYml0IiwgOTIyMzM3MjAzNjg1NDc3NTgwNzoiNjRiaXQifQorICAgICAgICAgICAgbWFjaGluZSArPSAiLiVzIiAlIGJpdG5lc3Nbc3lzLm1heGludF0KKyAgICAgICAgIyBmYWxsIHRocm91Z2ggdG8gc3RhbmRhcmQgb3NuYW1lLXJlbGVhc2UtbWFjaGluZSByZXByZXNlbnRhdGlvbgorICAgIGVsaWYgb3NuYW1lWzo0XSA9PSAiaXJpeCI6ICAgICAgICAgICAgICAjIGNvdWxkIGJlICJpcml4NjQiIQorICAgICAgICByZXR1cm4gIiVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UpCisgICAgZWxpZiBvc25hbWVbOjNdID09ICJhaXgiOgorICAgICAgICByZXR1cm4gIiVzLSVzLiVzIiAlIChvc25hbWUsIHZlcnNpb24sIHJlbGVhc2UpCisgICAgZWxpZiBvc25hbWVbOjZdID09ICJjeWd3aW4iOgorICAgICAgICBvc25hbWUgPSAiY3lnd2luIgorICAgICAgICByZWxfcmUgPSByZS5jb21waWxlIChyJ1tcZC5dKycpCisgICAgICAgIG0gPSByZWxfcmUubWF0Y2gocmVsZWFzZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIHJlbGVhc2UgPSBtLmdyb3VwKCkKKyAgICBlbGlmIG9zbmFtZVs6Nl0gPT0gImRhcndpbiI6CisgICAgICAgIGltcG9ydCBfb3N4X3N1cHBvcnQKKyAgICAgICAgb3NuYW1lLCByZWxlYXNlLCBtYWNoaW5lID0gX29zeF9zdXBwb3J0LmdldF9wbGF0Zm9ybV9vc3goCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jb25maWdfdmFycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCisKKyAgICByZXR1cm4gIiVzLSVzLSVzIiAlIChvc25hbWUsIHJlbGVhc2UsIG1hY2hpbmUpCisKKworZGVmIGdldF9weXRob25fdmVyc2lvbigpOgorICAgIHJldHVybiBfUFlfVkVSU0lPTl9TSE9SVAorCisKK2RlZiBfcHJpbnRfZGljdCh0aXRsZSwgZGF0YSk6CisgICAgZm9yIGluZGV4LCAoa2V5LCB2YWx1ZSkgaW4gZW51bWVyYXRlKHNvcnRlZChkYXRhLml0ZW1zKCkpKToKKyAgICAgICAgaWYgaW5kZXggPT0gMDoKKyAgICAgICAgICAgIHByaW50ICclczogJyAlICh0aXRsZSkKKyAgICAgICAgcHJpbnQgJ1x0JXMgPSAiJXMiJyAlIChrZXksIHZhbHVlKQorCisKK2RlZiBfbWFpbigpOgorICAgICIiIkRpc3BsYXkgYWxsIGluZm9ybWF0aW9uIHN5c2NvbmZpZyBkZXRhaW5zLiIiIgorICAgIGlmICctLWdlbmVyYXRlLXBvc2l4LXZhcnMnIGluIHN5cy5hcmd2OgorICAgICAgICBfZ2VuZXJhdGVfcG9zaXhfdmFycygpCisgICAgICAgIHJldHVybgorICAgIHByaW50ICdQbGF0Zm9ybTogIiVzIicgJSBnZXRfcGxhdGZvcm0oKQorICAgIHByaW50ICdQeXRob24gdmVyc2lvbjogIiVzIicgJSBnZXRfcHl0aG9uX3ZlcnNpb24oKQorICAgIHByaW50ICdDdXJyZW50IGluc3RhbGxhdGlvbiBzY2hlbWU6ICIlcyInICUgX2dldF9kZWZhdWx0X3NjaGVtZSgpCisgICAgcHJpbnQKKyAgICBfcHJpbnRfZGljdCgnUGF0aHMnLCBnZXRfcGF0aHMoKSkKKyAgICBwcmludAorICAgIF9wcmludF9kaWN0KCdWYXJpYWJsZXMnLCBnZXRfY29uZmlnX3ZhcnMoKSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3lzY29uZmlnLnB5YyBiL2xpYi9weXRob24yLjcvc3lzY29uZmlnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RkNWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvc3lzY29uZmlnLnB5byBiL2xpYi9weXRob24yLjcvc3lzY29uZmlnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2RkNWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy9zeXNjb25maWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGFibmFubnkucHkgYi9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc2NjY1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5CkBAIC0wLDAgKzEsMzI5IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlRoZSBUYWIgTmFubnkgZGVzcGlzZXMgYW1iaWd1b3VzIGluZGVudGF0aW9uLiAgU2hlIGtub3dzIG5vIG1lcmN5LgorCit0YWJuYW5ueSAtLSBEZXRlY3Rpb24gb2YgYW1iaWd1b3VzIGluZGVudGF0aW9uCisKK0ZvciB0aGUgdGltZSBiZWluZyB0aGlzIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgYXMgYSBzY3JpcHQuCitIb3dldmVyIGl0IGlzIHBvc3NpYmxlIHRvIGltcG9ydCBpdCBpbnRvIGFuIElERSBhbmQgdXNlIHRoZSBmdW5jdGlvbgorY2hlY2soKSBkZXNjcmliZWQgYmVsb3cuCisKK1dhcm5pbmc6IFRoZSBBUEkgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUgaXMgbGlrZWx5IHRvIGNoYW5nZSBpbiBmdXR1cmUKK3JlbGVhc2VzOyBzdWNoIGNoYW5nZXMgbWF5IG5vdCBiZSBiYWNrd2FyZCBjb21wYXRpYmxlLgorIiIiCisKKyMgUmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGJ5IFRpbSBQZXRlcnMsIDE1IEFwcmlsIDE5OTguCisKKyMgWFhYIE5vdGU6IHRoaXMgaXMgbm93IGEgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGUuCisjIFhYWCBUaGUgQVBJIG5lZWRzIHRvIHVuZGVyZ28gY2hhbmdlcyBob3dldmVyOyB0aGUgY3VycmVudCBjb2RlIGlzIHRvbworIyBYWFggc2NyaXB0LWxpa2UuICBUaGlzIHdpbGwgYmUgYWRkcmVzc2VkIGxhdGVyLgorCitfX3ZlcnNpb25fXyA9ICI2IgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCB0b2tlbml6ZQoraWYgbm90IGhhc2F0dHIodG9rZW5pemUsICdOTCcpOgorICAgIHJhaXNlIFZhbHVlRXJyb3IoInRva2VuaXplLk5MIGRvZXNuJ3QgZXhpc3QgLS0gdG9rZW5pemUgbW9kdWxlIHRvbyBvbGQiKQorCitfX2FsbF9fID0gWyJjaGVjayIsICJOYW5ueU5hZyIsICJwcm9jZXNzX3Rva2VucyJdCisKK3ZlcmJvc2UgPSAwCitmaWxlbmFtZV9vbmx5ID0gMAorCitkZWYgZXJycHJpbnQoKmFyZ3MpOgorICAgIHNlcCA9ICIiCisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHNlcCArIHN0cihhcmcpKQorICAgICAgICBzZXAgPSAiICIKKyAgICBzeXMuc3RkZXJyLndyaXRlKCJcbiIpCisKK2RlZiBtYWluKCk6CisgICAgZ2xvYmFsIHZlcmJvc2UsIGZpbGVuYW1lX29ubHkKKyAgICB0cnk6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgInF2IikKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIGVycnByaW50KG1zZykKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLXEnOgorICAgICAgICAgICAgZmlsZW5hbWVfb25seSA9IGZpbGVuYW1lX29ubHkgKyAxCisgICAgICAgIGlmIG8gPT0gJy12JzoKKyAgICAgICAgICAgIHZlcmJvc2UgPSB2ZXJib3NlICsgMQorICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBlcnJwcmludCgiVXNhZ2U6Iiwgc3lzLmFyZ3ZbMF0sICJbLXZdIGZpbGVfb3JfZGlyZWN0b3J5IC4uLiIpCisgICAgICAgIHJldHVybgorICAgIGZvciBhcmcgaW4gYXJnczoKKyAgICAgICAgY2hlY2soYXJnKQorCitjbGFzcyBOYW5ueU5hZyhFeGNlcHRpb24pOgorICAgICIiIgorICAgIFJhaXNlZCBieSB0b2tlbmVhdGVyKCkgaWYgZGV0ZWN0aW5nIGFuIGFtYmlndW91cyBpbmRlbnQuCisgICAgQ2FwdHVyZWQgYW5kIGhhbmRsZWQgaW4gY2hlY2soKS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbGluZW5vLCBtc2csIGxpbmUpOgorICAgICAgICBzZWxmLmxpbmVubywgc2VsZi5tc2csIHNlbGYubGluZSA9IGxpbmVubywgbXNnLCBsaW5lCisgICAgZGVmIGdldF9saW5lbm8oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxpbmVubworICAgIGRlZiBnZXRfbXNnKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5tc2cKKyAgICBkZWYgZ2V0X2xpbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmxpbmUKKworZGVmIGNoZWNrKGZpbGUpOgorICAgICIiImNoZWNrKGZpbGVfb3JfZGlyKQorCisgICAgSWYgZmlsZV9vcl9kaXIgaXMgYSBkaXJlY3RvcnkgYW5kIG5vdCBhIHN5bWJvbGljIGxpbmssIHRoZW4gcmVjdXJzaXZlbHkKKyAgICBkZXNjZW5kIHRoZSBkaXJlY3RvcnkgdHJlZSBuYW1lZCBieSBmaWxlX29yX2RpciwgY2hlY2tpbmcgYWxsIC5weSBmaWxlcworICAgIGFsb25nIHRoZSB3YXkuIElmIGZpbGVfb3JfZGlyIGlzIGFuIG9yZGluYXJ5IFB5dGhvbiBzb3VyY2UgZmlsZSwgaXQgaXMKKyAgICBjaGVja2VkIGZvciB3aGl0ZXNwYWNlIHJlbGF0ZWQgcHJvYmxlbXMuIFRoZSBkaWFnbm9zdGljIG1lc3NhZ2VzIGFyZQorICAgIHdyaXR0ZW4gdG8gc3RhbmRhcmQgb3V0cHV0IHVzaW5nIHRoZSBwcmludCBzdGF0ZW1lbnQuCisgICAgIiIiCisKKyAgICBpZiBvcy5wYXRoLmlzZGlyKGZpbGUpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZmlsZSk6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXI6IGxpc3RpbmcgZGlyZWN0b3J5IiAlIChmaWxlLCkKKyAgICAgICAgbmFtZXMgPSBvcy5saXN0ZGlyKGZpbGUpCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZmlsZSwgbmFtZSkKKyAgICAgICAgICAgIGlmIChvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKSBhbmQKKyAgICAgICAgICAgICAgICBub3Qgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpIG9yCisgICAgICAgICAgICAgICAgb3MucGF0aC5ub3JtY2FzZShuYW1lWy0zOl0pID09ICIucHkiKToKKyAgICAgICAgICAgICAgICBjaGVjayhmdWxsbmFtZSkKKyAgICAgICAgcmV0dXJuCisKKyAgICB0cnk6CisgICAgICAgIGYgPSBvcGVuKGZpbGUpCisgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgZXJycHJpbnQoIiVyOiBJL08gRXJyb3I6ICVzIiAlIChmaWxlLCBtc2cpKQorICAgICAgICByZXR1cm4KKworICAgIGlmIHZlcmJvc2UgPiAxOgorICAgICAgICBwcmludCAiY2hlY2tpbmcgJXIgLi4uIiAlIGZpbGUKKworICAgIHRyeToKKyAgICAgICAgcHJvY2Vzc190b2tlbnModG9rZW5pemUuZ2VuZXJhdGVfdG9rZW5zKGYucmVhZGxpbmUpKQorCisgICAgZXhjZXB0IHRva2VuaXplLlRva2VuRXJyb3IsIG1zZzoKKyAgICAgICAgZXJycHJpbnQoIiVyOiBUb2tlbiBFcnJvcjogJXMiICUgKGZpbGUsIG1zZykpCisgICAgICAgIHJldHVybgorCisgICAgZXhjZXB0IEluZGVudGF0aW9uRXJyb3IsIG1zZzoKKyAgICAgICAgZXJycHJpbnQoIiVyOiBJbmRlbnRhdGlvbiBFcnJvcjogJXMiICUgKGZpbGUsIG1zZykpCisgICAgICAgIHJldHVybgorCisgICAgZXhjZXB0IE5hbm55TmFnLCBuYWc6CisgICAgICAgIGJhZGxpbmUgPSBuYWcuZ2V0X2xpbmVubygpCisgICAgICAgIGxpbmUgPSBuYWcuZ2V0X2xpbmUoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiVyOiAqKiogTGluZSAlZDogdHJvdWJsZSBpbiB0YWIgY2l0eSEgKioqIiAlIChmaWxlLCBiYWRsaW5lKQorICAgICAgICAgICAgcHJpbnQgIm9mZmVuZGluZyBsaW5lOiAlciIgJSAobGluZSwpCisgICAgICAgICAgICBwcmludCBuYWcuZ2V0X21zZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiAnICcgaW4gZmlsZTogZmlsZSA9ICciJyArIGZpbGUgKyAnIicKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lX29ubHk6IHByaW50IGZpbGUKKyAgICAgICAgICAgIGVsc2U6IHByaW50IGZpbGUsIGJhZGxpbmUsIHJlcHIobGluZSkKKyAgICAgICAgcmV0dXJuCisKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAiJXI6IENsZWFuIGJpbGwgb2YgaGVhbHRoLiIgJSAoZmlsZSwpCisKK2NsYXNzIFdoaXRlc3BhY2U6CisgICAgIyB0aGUgY2hhcmFjdGVycyB1c2VkIGZvciBzcGFjZSBhbmQgdGFiCisgICAgUywgVCA9ICcgXHQnCisKKyAgICAjIG1lbWJlcnM6CisgICAgIyAgIHJhdworICAgICMgICAgICAgdGhlIG9yaWdpbmFsIHN0cmluZworICAgICMgICBuCisgICAgIyAgICAgICB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGluIHJhdworICAgICMgICBudAorICAgICMgICAgICAgdGhlIG51bWJlciBvZiB0YWJzIGluIHJhd1s6bl0KKyAgICAjICAgbm9ybQorICAgICMgICAgICAgdGhlIG5vcm1hbCBmb3JtIGFzIGEgcGFpciAoY291bnQsIHRyYWlsaW5nKSwgd2hlcmU6CisgICAgIyAgICAgICBjb3VudAorICAgICMgICAgICAgICAgIGEgdHVwbGUgc3VjaCB0aGF0IHJhd1s6bl0gY29udGFpbnMgY291bnRbaV0KKyAgICAjICAgICAgICAgICBpbnN0YW5jZXMgb2YgUyAqIGkgKyBUCisgICAgIyAgICAgICB0cmFpbGluZworICAgICMgICAgICAgICAgIHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgc3BhY2VzIGluIHJhd1s6bl0KKyAgICAjICAgICAgIEl0J3MgQSBUaGVvcmVtIHRoYXQgbS5pbmRlbnRfbGV2ZWwodCkgPT0KKyAgICAjICAgICAgIG4uaW5kZW50X2xldmVsKHQpIGZvciBhbGwgdCA+PSAxIGlmZiBtLm5vcm0gPT0gbi5ub3JtLgorICAgICMgICBpc19zaW1wbGUKKyAgICAjICAgICAgIHRydWUgaWZmIHJhd1s6bl0gaXMgb2YgdGhlIGZvcm0gKFQqKShTKikKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3cyk6CisgICAgICAgIHNlbGYucmF3ICA9IHdzCisgICAgICAgIFMsIFQgPSBXaGl0ZXNwYWNlLlMsIFdoaXRlc3BhY2UuVAorICAgICAgICBjb3VudCA9IFtdCisgICAgICAgIGIgPSBuID0gbnQgPSAwCisgICAgICAgIGZvciBjaCBpbiBzZWxmLnJhdzoKKyAgICAgICAgICAgIGlmIGNoID09IFM6CisgICAgICAgICAgICAgICAgbiA9IG4gKyAxCisgICAgICAgICAgICAgICAgYiA9IGIgKyAxCisgICAgICAgICAgICBlbGlmIGNoID09IFQ6CisgICAgICAgICAgICAgICAgbiA9IG4gKyAxCisgICAgICAgICAgICAgICAgbnQgPSBudCArIDEKKyAgICAgICAgICAgICAgICBpZiBiID49IGxlbihjb3VudCk6CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyBbMF0gKiAoYiAtIGxlbihjb3VudCkgKyAxKQorICAgICAgICAgICAgICAgIGNvdW50W2JdID0gY291bnRbYl0gKyAxCisgICAgICAgICAgICAgICAgYiA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5uICAgID0gbgorICAgICAgICBzZWxmLm50ICAgPSBudAorICAgICAgICBzZWxmLm5vcm0gPSB0dXBsZShjb3VudCksIGIKKyAgICAgICAgc2VsZi5pc19zaW1wbGUgPSBsZW4oY291bnQpIDw9IDEKKworICAgICMgcmV0dXJuIGxlbmd0aCBvZiBsb25nZXN0IGNvbnRpZ3VvdXMgcnVuIG9mIHNwYWNlcyAod2hldGhlciBvciBub3QKKyAgICAjIHByZWNlZGluZyBhIHRhYikKKyAgICBkZWYgbG9uZ2VzdF9ydW5fb2Zfc3BhY2VzKHNlbGYpOgorICAgICAgICBjb3VudCwgdHJhaWxpbmcgPSBzZWxmLm5vcm0KKyAgICAgICAgcmV0dXJuIG1heChsZW4oY291bnQpLTEsIHRyYWlsaW5nKQorCisgICAgZGVmIGluZGVudF9sZXZlbChzZWxmLCB0YWJzaXplKToKKyAgICAgICAgIyBjb3VudCwgaWwgPSBzZWxmLm5vcm0KKyAgICAgICAgIyBmb3IgaSBpbiByYW5nZShsZW4oY291bnQpKToKKyAgICAgICAgIyAgICBpZiBjb3VudFtpXToKKyAgICAgICAgIyAgICAgICAgaWwgPSBpbCArIChpL3RhYnNpemUgKyAxKSp0YWJzaXplICogY291bnRbaV0KKyAgICAgICAgIyByZXR1cm4gaWwKKworICAgICAgICAjIHF1aWNrZXI6CisgICAgICAgICMgaWwgPSB0cmFpbGluZyArIHN1bSAoaS90cyArIDEpKnRzKmNvdW50W2ldID0KKyAgICAgICAgIyB0cmFpbGluZyArIHRzICogc3VtIChpL3RzICsgMSkqY291bnRbaV0gPQorICAgICAgICAjIHRyYWlsaW5nICsgdHMgKiBzdW0gaS90cypjb3VudFtpXSArIGNvdW50W2ldID0KKyAgICAgICAgIyB0cmFpbGluZyArIHRzICogWyhzdW0gaS90cypjb3VudFtpXSkgKyAoc3VtIGNvdW50W2ldKV0gPQorICAgICAgICAjIHRyYWlsaW5nICsgdHMgKiBbKHN1bSBpL3RzKmNvdW50W2ldKSArIG51bV90YWJzXQorICAgICAgICAjIGFuZCBub3RlIHRoYXQgaS90cypjb3VudFtpXSBpcyAwIHdoZW4gaSA8IHRzCisKKyAgICAgICAgY291bnQsIHRyYWlsaW5nID0gc2VsZi5ub3JtCisgICAgICAgIGlsID0gMAorICAgICAgICBmb3IgaSBpbiByYW5nZSh0YWJzaXplLCBsZW4oY291bnQpKToKKyAgICAgICAgICAgIGlsID0gaWwgKyBpL3RhYnNpemUgKiBjb3VudFtpXQorICAgICAgICByZXR1cm4gdHJhaWxpbmcgKyB0YWJzaXplICogKGlsICsgc2VsZi5udCkKKworICAgICMgcmV0dXJuIHRydWUgaWZmIHNlbGYuaW5kZW50X2xldmVsKHQpID09IG90aGVyLmluZGVudF9sZXZlbCh0KQorICAgICMgZm9yIGFsbCB0ID49IDEKKyAgICBkZWYgZXF1YWwoc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5ub3JtID09IG90aGVyLm5vcm0KKworICAgICMgcmV0dXJuIGEgbGlzdCBvZiB0dXBsZXMgKHRzLCBpMSwgaTIpIHN1Y2ggdGhhdAorICAgICMgaTEgPT0gc2VsZi5pbmRlbnRfbGV2ZWwodHMpICE9IG90aGVyLmluZGVudF9sZXZlbCh0cykgPT0gaTIuCisgICAgIyBJbnRlbmRlZCB0byBiZSB1c2VkIGFmdGVyIG5vdCBzZWxmLmVxdWFsKG90aGVyKSBpcyBrbm93biwgaW4gd2hpY2gKKyAgICAjIGNhc2UgaXQgd2lsbCByZXR1cm4gYXQgbGVhc3Qgb25lIHdpdG5lc3NpbmcgdGFiIHNpemUuCisgICAgZGVmIG5vdF9lcXVhbF93aXRuZXNzKHNlbGYsIG90aGVyKToKKyAgICAgICAgbiA9IG1heChzZWxmLmxvbmdlc3RfcnVuX29mX3NwYWNlcygpLAorICAgICAgICAgICAgICAgIG90aGVyLmxvbmdlc3RfcnVuX29mX3NwYWNlcygpKSArIDEKKyAgICAgICAgYSA9IFtdCisgICAgICAgIGZvciB0cyBpbiByYW5nZSgxLCBuKzEpOgorICAgICAgICAgICAgaWYgc2VsZi5pbmRlbnRfbGV2ZWwodHMpICE9IG90aGVyLmluZGVudF9sZXZlbCh0cyk6CisgICAgICAgICAgICAgICAgYS5hcHBlbmQoICh0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50X2xldmVsKHRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmluZGVudF9sZXZlbCh0cykpICkKKyAgICAgICAgcmV0dXJuIGEKKworICAgICMgUmV0dXJuIFRydWUgaWZmIHNlbGYuaW5kZW50X2xldmVsKHQpIDwgb3RoZXIuaW5kZW50X2xldmVsKHQpCisgICAgIyBmb3IgYWxsIHQgPj0gMS4KKyAgICAjIFRoZSBhbGdvcml0aG0gaXMgZHVlIHRvIFZpbmNlbnQgQnJvbWFuLgorICAgICMgRWFzeSB0byBwcm92ZSBpdCdzIGNvcnJlY3QuCisgICAgIyBYWFhwb3N0IHRoYXQuCisgICAgIyBUcml2aWFsIHRvIHByb3ZlIG4gaXMgc2hhcnAgKGNvbnNpZGVyIFQgdnMgU1QpLgorICAgICMgVW5rbm93biB3aGV0aGVyIHRoZXJlJ3MgYSBmYXN0ZXIgZ2VuZXJhbCB3YXkuICBJIHN1c3BlY3RlZCBzbyBhdAorICAgICMgZmlyc3QsIGJ1dCBubyBsb25nZXIuCisgICAgIyBGb3IgdGhlIHNwZWNpYWwgKGJ1dCBjb21tb24hKSBjYXNlIHdoZXJlIE0gYW5kIE4gYXJlIGJvdGggb2YgdGhlCisgICAgIyBmb3JtIChUKikoUyopLCBNLmxlc3MoTikgaWZmIE0ubGVuKCkgPCBOLmxlbigpIGFuZAorICAgICMgTS5udW1fdGFicygpIDw9IE4ubnVtX3RhYnMoKS4gUHJvb2YgaXMgZWFzeSBidXQga2luZGEgbG9uZy13aW5kZWQuCisgICAgIyBYWFh3cml0ZSB0aGF0IHVwLgorICAgICMgTm90ZSB0aGF0IE0gaXMgb2YgdGhlIGZvcm0gKFQqKShTKikgaWZmIGxlbihNLm5vcm1bMF0pIDw9IDEuCisgICAgZGVmIGxlc3Moc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBzZWxmLm4gPj0gb3RoZXIubjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBzZWxmLmlzX3NpbXBsZSBhbmQgb3RoZXIuaXNfc2ltcGxlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubnQgPD0gb3RoZXIubnQKKyAgICAgICAgbiA9IG1heChzZWxmLmxvbmdlc3RfcnVuX29mX3NwYWNlcygpLAorICAgICAgICAgICAgICAgIG90aGVyLmxvbmdlc3RfcnVuX29mX3NwYWNlcygpKSArIDEKKyAgICAgICAgIyB0aGUgc2VsZi5uID49IG90aGVyLm4gdGVzdCBhbHJlYWR5IGRpZCBpdCBmb3IgdHM9MQorICAgICAgICBmb3IgdHMgaW4gcmFuZ2UoMiwgbisxKToKKyAgICAgICAgICAgIGlmIHNlbGYuaW5kZW50X2xldmVsKHRzKSA+PSBvdGhlci5pbmRlbnRfbGV2ZWwodHMpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgIyByZXR1cm4gYSBsaXN0IG9mIHR1cGxlcyAodHMsIGkxLCBpMikgc3VjaCB0aGF0CisgICAgIyBpMSA9PSBzZWxmLmluZGVudF9sZXZlbCh0cykgPj0gb3RoZXIuaW5kZW50X2xldmVsKHRzKSA9PSBpMi4KKyAgICAjIEludGVuZGVkIHRvIGJlIHVzZWQgYWZ0ZXIgbm90IHNlbGYubGVzcyhvdGhlcikgaXMga25vd24sIGluIHdoaWNoCisgICAgIyBjYXNlIGl0IHdpbGwgcmV0dXJuIGF0IGxlYXN0IG9uZSB3aXRuZXNzaW5nIHRhYiBzaXplLgorICAgIGRlZiBub3RfbGVzc193aXRuZXNzKHNlbGYsIG90aGVyKToKKyAgICAgICAgbiA9IG1heChzZWxmLmxvbmdlc3RfcnVuX29mX3NwYWNlcygpLAorICAgICAgICAgICAgICAgIG90aGVyLmxvbmdlc3RfcnVuX29mX3NwYWNlcygpKSArIDEKKyAgICAgICAgYSA9IFtdCisgICAgICAgIGZvciB0cyBpbiByYW5nZSgxLCBuKzEpOgorICAgICAgICAgICAgaWYgc2VsZi5pbmRlbnRfbGV2ZWwodHMpID49IG90aGVyLmluZGVudF9sZXZlbCh0cyk6CisgICAgICAgICAgICAgICAgYS5hcHBlbmQoICh0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5kZW50X2xldmVsKHRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmluZGVudF9sZXZlbCh0cykpICkKKyAgICAgICAgcmV0dXJuIGEKKworZGVmIGZvcm1hdF93aXRuZXNzZXModyk6CisgICAgZmlyc3RzID0gbWFwKGxhbWJkYSB0dXA6IHN0cih0dXBbMF0pLCB3KQorICAgIHByZWZpeCA9ICJhdCB0YWIgc2l6ZSIKKyAgICBpZiBsZW4odykgPiAxOgorICAgICAgICBwcmVmaXggPSBwcmVmaXggKyAicyIKKyAgICByZXR1cm4gcHJlZml4ICsgIiAiICsgJywgJy5qb2luKGZpcnN0cykKKworZGVmIHByb2Nlc3NfdG9rZW5zKHRva2Vucyk6CisgICAgSU5ERU5UID0gdG9rZW5pemUuSU5ERU5UCisgICAgREVERU5UID0gdG9rZW5pemUuREVERU5UCisgICAgTkVXTElORSA9IHRva2VuaXplLk5FV0xJTkUKKyAgICBKVU5LID0gdG9rZW5pemUuQ09NTUVOVCwgdG9rZW5pemUuTkwKKyAgICBpbmRlbnRzID0gW1doaXRlc3BhY2UoIiIpXQorICAgIGNoZWNrX2VxdWFsID0gMAorCisgICAgZm9yICh0eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSkgaW4gdG9rZW5zOgorICAgICAgICBpZiB0eXBlID09IE5FV0xJTkU6CisgICAgICAgICAgICAjIGEgcHJvZ3JhbSBzdGF0ZW1lbnQsIG9yIEVORE1BUktFUiwgd2lsbCBldmVudHVhbGx5IGZvbGxvdywKKyAgICAgICAgICAgICMgYWZ0ZXIgc29tZSAocG9zc2libHkgZW1wdHkpIHJ1biBvZiB0b2tlbnMgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICMgICAgIChOTCB8IENPTU1FTlQpKiAoSU5ERU5UIHwgREVERU5UKyk/CisgICAgICAgICAgICAjIElmIGFuIElOREVOVCBhcHBlYXJzLCBzZXR0aW5nIGNoZWNrX2VxdWFsIGlzIHdyb25nLCBhbmQgd2lsbAorICAgICAgICAgICAgIyBiZSB1bmRvbmUgd2hlbiB3ZSBzZWUgdGhlIElOREVOVC4KKyAgICAgICAgICAgIGNoZWNrX2VxdWFsID0gMQorCisgICAgICAgIGVsaWYgdHlwZSA9PSBJTkRFTlQ6CisgICAgICAgICAgICBjaGVja19lcXVhbCA9IDAKKyAgICAgICAgICAgIHRoaXNndXkgPSBXaGl0ZXNwYWNlKHRva2VuKQorICAgICAgICAgICAgaWYgbm90IGluZGVudHNbLTFdLmxlc3ModGhpc2d1eSk6CisgICAgICAgICAgICAgICAgd2l0bmVzcyA9IGluZGVudHNbLTFdLm5vdF9sZXNzX3dpdG5lc3ModGhpc2d1eSkKKyAgICAgICAgICAgICAgICBtc2cgPSAiaW5kZW50IG5vdCBncmVhdGVyIGUuZy4gIiArIGZvcm1hdF93aXRuZXNzZXMod2l0bmVzcykKKyAgICAgICAgICAgICAgICByYWlzZSBOYW5ueU5hZyhzdGFydFswXSwgbXNnLCBsaW5lKQorICAgICAgICAgICAgaW5kZW50cy5hcHBlbmQodGhpc2d1eSkKKworICAgICAgICBlbGlmIHR5cGUgPT0gREVERU5UOgorICAgICAgICAgICAgIyB0aGVyZSdzIG5vdGhpbmcgd2UgbmVlZCB0byBjaGVjayBoZXJlISAgd2hhdCdzIGltcG9ydGFudCBpcworICAgICAgICAgICAgIyB0aGF0IHdoZW4gdGhlIHJ1biBvZiBERURFTlRzIGVuZHMsIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICMgcHJvZ3JhbSBzdGF0ZW1lbnQgKG9yIEVORE1BUktFUikgdGhhdCB0cmlnZ2VyZWQgdGhlIHJ1biBpcworICAgICAgICAgICAgIyBlcXVhbCB0byB3aGF0J3MgbGVmdCBhdCB0aGUgdG9wIG9mIHRoZSBpbmRlbnRzIHN0YWNrCisKKyAgICAgICAgICAgICMgT3VjaCEgIFRoaXMgYXNzZXJ0IHRyaWdnZXJzIGlmIHRoZSBsYXN0IGxpbmUgb2YgdGhlIHNvdXJjZQorICAgICAgICAgICAgIyBpcyBpbmRlbnRlZCAqYW5kKiBsYWNrcyBhIG5ld2xpbmUgLS0gdGhlbiBERURFTlRzIHBvcCBvdXQKKyAgICAgICAgICAgICMgb2YgdGhpbiBhaXIuCisgICAgICAgICAgICAjIGFzc2VydCBjaGVja19lcXVhbCAgIyBlbHNlIG5vIGVhcmxpZXIgTkVXTElORSwgb3IgYW4gZWFybGllciBJTkRFTlQKKyAgICAgICAgICAgIGNoZWNrX2VxdWFsID0gMQorCisgICAgICAgICAgICBkZWwgaW5kZW50c1stMV0KKworICAgICAgICBlbGlmIGNoZWNrX2VxdWFsIGFuZCB0eXBlIG5vdCBpbiBKVU5LOgorICAgICAgICAgICAgIyB0aGlzIGlzIHRoZSBmaXJzdCAicmVhbCB0b2tlbiIgZm9sbG93aW5nIGEgTkVXTElORSwgc28gaXQKKyAgICAgICAgICAgICMgbXVzdCBiZSB0aGUgZmlyc3QgdG9rZW4gb2YgdGhlIG5leHQgcHJvZ3JhbSBzdGF0ZW1lbnQsIG9yIGFuCisgICAgICAgICAgICAjIEVORE1BUktFUjsgdGhlICJsaW5lIiBhcmd1bWVudCBleHBvc2VzIHRoZSBsZWFkaW5nIHdoaXRlc3BhY2UKKyAgICAgICAgICAgICMgZm9yIHRoaXMgc3RhdGVtZW50OyBpbiB0aGUgY2FzZSBvZiBFTkRNQVJLRVIsIGxpbmUgaXMgYW4gZW1wdHkKKyAgICAgICAgICAgICMgc3RyaW5nLCBzbyB3aWxsIHByb3Blcmx5IG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcgd2l0aCB3aGljaCB0aGUKKyAgICAgICAgICAgICMgImluZGVudHMiIHN0YWNrIHdhcyBzZWVkZWQKKyAgICAgICAgICAgIGNoZWNrX2VxdWFsID0gMAorICAgICAgICAgICAgdGhpc2d1eSA9IFdoaXRlc3BhY2UobGluZSkKKyAgICAgICAgICAgIGlmIG5vdCBpbmRlbnRzWy0xXS5lcXVhbCh0aGlzZ3V5KToKKyAgICAgICAgICAgICAgICB3aXRuZXNzID0gaW5kZW50c1stMV0ubm90X2VxdWFsX3dpdG5lc3ModGhpc2d1eSkKKyAgICAgICAgICAgICAgICBtc2cgPSAiaW5kZW50IG5vdCBlcXVhbCBlLmcuICIgKyBmb3JtYXRfd2l0bmVzc2VzKHdpdG5lc3MpCisgICAgICAgICAgICAgICAgcmFpc2UgTmFubnlOYWcoc3RhcnRbMF0sIG1zZywgbGluZSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90YWJuYW5ueS5weWMgYi9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTgyY2YyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90YWJuYW5ueS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90YWJuYW5ueS5weW8gYi9saWIvcHl0aG9uMi43L3RhYm5hbm55LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTgyY2YyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90YWJuYW5ueS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90YXJmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy90YXJmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YTZlODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RhcmZpbGUucHkKQEAgLTAsMCArMSwyNTkyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRhcmZpbGUucHkKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvcHlyaWdodCAoQykgMjAwMiBMYXJzIEd1c3TkYmVsIDxsYXJzQGd1c3RhZWJlbC5kZT4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUGVybWlzc2lvbiAgaXMgIGhlcmVieSBncmFudGVkLCAgZnJlZSAgb2YgY2hhcmdlLCAgdG8gIGFueSBwZXJzb24KKyMgb2J0YWluaW5nIGEgIGNvcHkgb2YgIHRoaXMgc29mdHdhcmUgIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24KKyMgZmlsZXMgICh0aGUgICJTb2Z0d2FyZSIpLCAgdG8gICBkZWFsICBpbiAgdGhlICBTb2Z0d2FyZSAgIHdpdGhvdXQKKyMgcmVzdHJpY3Rpb24sICBpbmNsdWRpbmcgIHdpdGhvdXQgbGltaXRhdGlvbiAgdGhlICByaWdodHMgdG8gIHVzZSwKKyMgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKKyMgY29waWVzICBvZiAgdGhlICBTb2Z0d2FyZSwgIGFuZCB0byAgcGVybWl0ICBwZXJzb25zICB0byAgd2hvbSB0aGUKKyMgU29mdHdhcmUgIGlzICBmdXJuaXNoZWQgIHRvICBkbyAgc28sICBzdWJqZWN0ICB0byAgdGhlICBmb2xsb3dpbmcKKyMgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCAgbm90aWNlIGFuZCB0aGlzICBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCAgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgIEtJTkQsCisjIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HICBCVVQgTk9UIExJTUlURUQgVE8gIFRIRSBXQVJSQU5USUVTCisjIE9GICBNRVJDSEFOVEFCSUxJVFksICBGSVRORVNTICAgRk9SICBBICBQQVJUSUNVTEFSICAgUFVSUE9TRSAgQU5ECisjIE5PTklORlJJTkdFTUVOVC4gIElOICBOTyAgRVZFTlQgU0hBTEwgIFRIRSAgQVVUSE9SUyAgT1IgQ09QWVJJR0hUCisjIEhPTERFUlMgIEJFIExJQUJMRSAgRk9SIEFOWSAgQ0xBSU0sIERBTUFHRVMgIE9SIE9USEVSICBMSUFCSUxJVFksCisjIFdIRVRIRVIgIElOIEFOICBBQ1RJT04gT0YgIENPTlRSQUNULCBUT1JUICBPUiBPVEhFUldJU0UsICBBUklTSU5HCisjIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKKyMgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorIworIiIiUmVhZCBmcm9tIGFuZCB3cml0ZSB0byB0YXIgZm9ybWF0IGFyY2hpdmVzLgorIiIiCisKK19fdmVyc2lvbl9fID0gIiRSZXZpc2lvbjogODUyMTMgJCIKKyMgJFNvdXJjZSQKKwordmVyc2lvbiAgICAgPSAiMC45LjAiCitfX2F1dGhvcl9fICA9ICJMYXJzIEd1c3TkYmVsIChsYXJzQGd1c3RhZWJlbC5kZSkiCitfX2RhdGVfXyAgICA9ICIkRGF0ZSQiCitfX2N2c2lkX18gICA9ICIkSWQkIgorX19jcmVkaXRzX18gPSAiR3VzdGF2byBOaWVtZXllciwgTmllbHMgR3VzdORiZWwsIFJpY2hhcmQgVG93bnNlbmQuIgorCisjLS0tLS0tLS0tCisjIEltcG9ydHMKKyMtLS0tLS0tLS0KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN0YXQKK2ltcG9ydCBlcnJubworaW1wb3J0IHRpbWUKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBjb3B5CitpbXBvcnQgcmUKK2ltcG9ydCBvcGVyYXRvcgorCit0cnk6CisgICAgaW1wb3J0IGdycCwgcHdkCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZ3JwID0gcHdkID0gTm9uZQorCisjIGZyb20gdGFyZmlsZSBpbXBvcnQgKgorX19hbGxfXyA9IFsiVGFyRmlsZSIsICJUYXJJbmZvIiwgImlzX3RhcmZpbGUiLCAiVGFyRXJyb3IiXQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRhciBjb25zdGFudHMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05VTCA9ICJcMCIgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgbnVsbCBjaGFyYWN0ZXIKK0JMT0NLU0laRSA9IDUxMiAgICAgICAgICAgICAgICAgIyBsZW5ndGggb2YgcHJvY2Vzc2luZyBibG9ja3MKK1JFQ09SRFNJWkUgPSBCTE9DS1NJWkUgKiAyMCAgICAgIyBsZW5ndGggb2YgcmVjb3JkcworR05VX01BR0lDID0gInVzdGFyICBcMCIgICAgICAgICAjIG1hZ2ljIGdudSB0YXIgc3RyaW5nCitQT1NJWF9NQUdJQyA9ICJ1c3Rhclx4MDAwMCIgICAgICMgbWFnaWMgcG9zaXggdGFyIHN0cmluZworCitMRU5HVEhfTkFNRSA9IDEwMCAgICAgICAgICAgICAgICMgbWF4aW11bSBsZW5ndGggb2YgYSBmaWxlbmFtZQorTEVOR1RIX0xJTksgPSAxMDAgICAgICAgICAgICAgICAjIG1heGltdW0gbGVuZ3RoIG9mIGEgbGlua25hbWUKK0xFTkdUSF9QUkVGSVggPSAxNTUgICAgICAgICAgICAgIyBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgcHJlZml4IGZpZWxkCisKK1JFR1RZUEUgPSAiMCIgICAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKK0FSRUdUWVBFID0gIlwwIiAgICAgICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUKK0xOS1RZUEUgPSAiMSIgICAgICAgICAgICAgICAgICAgIyBsaW5rIChpbnNpZGUgdGFyZmlsZSkKK1NZTVRZUEUgPSAiMiIgICAgICAgICAgICAgICAgICAgIyBzeW1ib2xpYyBsaW5rCitDSFJUWVBFID0gIjMiICAgICAgICAgICAgICAgICAgICMgY2hhcmFjdGVyIHNwZWNpYWwgZGV2aWNlCitCTEtUWVBFID0gIjQiICAgICAgICAgICAgICAgICAgICMgYmxvY2sgc3BlY2lhbCBkZXZpY2UKK0RJUlRZUEUgPSAiNSIgICAgICAgICAgICAgICAgICAgIyBkaXJlY3RvcnkKK0ZJRk9UWVBFID0gIjYiICAgICAgICAgICAgICAgICAgIyBmaWZvIHNwZWNpYWwgZGV2aWNlCitDT05UVFlQRSA9ICI3IiAgICAgICAgICAgICAgICAgICMgY29udGlndW91cyBmaWxlCisKK0dOVVRZUEVfTE9OR05BTUUgPSAiTCIgICAgICAgICAgIyBHTlUgdGFyIGxvbmduYW1lCitHTlVUWVBFX0xPTkdMSU5LID0gIksiICAgICAgICAgICMgR05VIHRhciBsb25nbGluaworR05VVFlQRV9TUEFSU0UgPSAiUyIgICAgICAgICAgICAjIEdOVSB0YXIgc3BhcnNlIGZpbGUKKworWEhEVFlQRSA9ICJ4IiAgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSBleHRlbmRlZCBoZWFkZXIKK1hHTFRZUEUgPSAiZyIgICAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTIwMDEgZ2xvYmFsIGhlYWRlcgorU09MQVJJU19YSERUWVBFID0gIlgiICAgICAgICAgICAjIFNvbGFyaXMgZXh0ZW5kZWQgaGVhZGVyCisKK1VTVEFSX0ZPUk1BVCA9IDAgICAgICAgICAgICAgICAgIyBQT1NJWC4xLTE5ODggKHVzdGFyKSBmb3JtYXQKK0dOVV9GT1JNQVQgPSAxICAgICAgICAgICAgICAgICAgIyBHTlUgdGFyIGZvcm1hdAorUEFYX0ZPUk1BVCA9IDIgICAgICAgICAgICAgICAgICAjIFBPU0lYLjEtMjAwMSAocGF4KSBmb3JtYXQKK0RFRkFVTFRfRk9STUFUID0gR05VX0ZPUk1BVAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHRhcmZpbGUgY29uc3RhbnRzCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbGUgdHlwZXMgdGhhdCB0YXJmaWxlIHN1cHBvcnRzOgorU1VQUE9SVEVEX1RZUEVTID0gKFJFR1RZUEUsIEFSRUdUWVBFLCBMTktUWVBFLAorICAgICAgICAgICAgICAgICAgIFNZTVRZUEUsIERJUlRZUEUsIEZJRk9UWVBFLAorICAgICAgICAgICAgICAgICAgIENPTlRUWVBFLCBDSFJUWVBFLCBCTEtUWVBFLAorICAgICAgICAgICAgICAgICAgIEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCisgICAgICAgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCisKKyMgRmlsZSB0eXBlcyB0aGF0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIHJlZ3VsYXIgZmlsZS4KK1JFR1VMQVJfVFlQRVMgPSAoUkVHVFlQRSwgQVJFR1RZUEUsCisgICAgICAgICAgICAgICAgIENPTlRUWVBFLCBHTlVUWVBFX1NQQVJTRSkKKworIyBGaWxlIHR5cGVzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIEdOVSB0YXIgZm9ybWF0LgorR05VX1RZUEVTID0gKEdOVVRZUEVfTE9OR05BTUUsIEdOVVRZUEVfTE9OR0xJTkssCisgICAgICAgICAgICAgR05VVFlQRV9TUEFSU0UpCisKKyMgRmllbGRzIGZyb20gYSBwYXggaGVhZGVyIHRoYXQgb3ZlcnJpZGUgYSBUYXJJbmZvIGF0dHJpYnV0ZS4KK1BBWF9GSUVMRFMgPSAoInBhdGgiLCAibGlua3BhdGgiLCAic2l6ZSIsICJtdGltZSIsCisgICAgICAgICAgICAgICJ1aWQiLCAiZ2lkIiwgInVuYW1lIiwgImduYW1lIikKKworIyBGaWVsZHMgaW4gYSBwYXggaGVhZGVyIHRoYXQgYXJlIG51bWJlcnMsIGFsbCBvdGhlciBmaWVsZHMKKyMgYXJlIHRyZWF0ZWQgYXMgc3RyaW5ncy4KK1BBWF9OVU1CRVJfRklFTERTID0geworICAgICJhdGltZSI6IGZsb2F0LAorICAgICJjdGltZSI6IGZsb2F0LAorICAgICJtdGltZSI6IGZsb2F0LAorICAgICJ1aWQiOiBpbnQsCisgICAgImdpZCI6IGludCwKKyAgICAic2l6ZSI6IGludAorfQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJpdHMgdXNlZCBpbiB0aGUgbW9kZSBmaWVsZCwgdmFsdWVzIGluIG9jdGFsLgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU19JRkxOSyA9IDAxMjAwMDAgICAgICAgICMgc3ltYm9saWMgbGluaworU19JRlJFRyA9IDAxMDAwMDAgICAgICAgICMgcmVndWxhciBmaWxlCitTX0lGQkxLID0gMDA2MDAwMCAgICAgICAgIyBibG9jayBkZXZpY2UKK1NfSUZESVIgPSAwMDQwMDAwICAgICAgICAjIGRpcmVjdG9yeQorU19JRkNIUiA9IDAwMjAwMDAgICAgICAgICMgY2hhcmFjdGVyIGRldmljZQorU19JRklGTyA9IDAwMTAwMDAgICAgICAgICMgZmlmbworCitUU1VJRCAgID0gMDQwMDAgICAgICAgICAgIyBzZXQgVUlEIG9uIGV4ZWN1dGlvbgorVFNHSUQgICA9IDAyMDAwICAgICAgICAgICMgc2V0IEdJRCBvbiBleGVjdXRpb24KK1RTVlRYICAgPSAwMTAwMCAgICAgICAgICAjIHJlc2VydmVkCisKK1RVUkVBRCAgPSAwNDAwICAgICAgICAgICAjIHJlYWQgYnkgb3duZXIKK1RVV1JJVEUgPSAwMjAwICAgICAgICAgICAjIHdyaXRlIGJ5IG93bmVyCitUVUVYRUMgID0gMDEwMCAgICAgICAgICAgIyBleGVjdXRlL3NlYXJjaCBieSBvd25lcgorVEdSRUFEICA9IDAwNDAgICAgICAgICAgICMgcmVhZCBieSBncm91cAorVEdXUklURSA9IDAwMjAgICAgICAgICAgICMgd3JpdGUgYnkgZ3JvdXAKK1RHRVhFQyAgPSAwMDEwICAgICAgICAgICAjIGV4ZWN1dGUvc2VhcmNoIGJ5IGdyb3VwCitUT1JFQUQgID0gMDAwNCAgICAgICAgICAgIyByZWFkIGJ5IG90aGVyCitUT1dSSVRFID0gMDAwMiAgICAgICAgICAgIyB3cml0ZSBieSBvdGhlcgorVE9FWEVDICA9IDAwMDEgICAgICAgICAgICMgZXhlY3V0ZS9zZWFyY2ggYnkgb3RoZXIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbml0aWFsaXphdGlvbgorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorRU5DT0RJTkcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKK2lmIEVOQ09ESU5HIGlzIE5vbmU6CisgICAgRU5DT0RJTkcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTb21lIHVzZWZ1bCBmdW5jdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHN0bihzLCBsZW5ndGgpOgorICAgICIiIkNvbnZlcnQgYSBweXRob24gc3RyaW5nIHRvIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBidWZmZXIuCisgICAgIiIiCisgICAgcmV0dXJuIHNbOmxlbmd0aF0gKyAobGVuZ3RoIC0gbGVuKHMpKSAqIE5VTAorCitkZWYgbnRzKHMpOgorICAgICIiIkNvbnZlcnQgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGZpZWxkIHRvIGEgcHl0aG9uIHN0cmluZy4KKyAgICAiIiIKKyAgICAjIFVzZSB0aGUgc3RyaW5nIHVwIHRvIHRoZSBmaXJzdCBudWxsIGNoYXIuCisgICAgcCA9IHMuZmluZCgiXDAiKQorICAgIGlmIHAgPT0gLTE6CisgICAgICAgIHJldHVybiBzCisgICAgcmV0dXJuIHNbOnBdCisKK2RlZiBudGkocyk6CisgICAgIiIiQ29udmVydCBhIG51bWJlciBmaWVsZCB0byBhIHB5dGhvbiBudW1iZXIuCisgICAgIiIiCisgICAgIyBUaGVyZSBhcmUgdHdvIHBvc3NpYmxlIGVuY29kaW5ncyBmb3IgYSBudW1iZXIgZmllbGQsIHNlZQorICAgICMgaXRuKCkgYmVsb3cuCisgICAgaWYgc1swXSAhPSBjaHIoMDIwMCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG4gPSBpbnQobnRzKHMpIG9yICIwIiwgOCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyRXJyb3IoImludmFsaWQgaGVhZGVyIikKKyAgICBlbHNlOgorICAgICAgICBuID0gMEwKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihzKSAtIDEpOgorICAgICAgICAgICAgbiA8PD0gOAorICAgICAgICAgICAgbiArPSBvcmQoc1tpICsgMV0pCisgICAgcmV0dXJuIG4KKworZGVmIGl0bihuLCBkaWdpdHM9OCwgZm9ybWF0PURFRkFVTFRfRk9STUFUKToKKyAgICAiIiJDb252ZXJ0IGEgcHl0aG9uIG51bWJlciB0byBhIG51bWJlciBmaWVsZC4KKyAgICAiIiIKKyAgICAjIFBPU0lYIDEwMDMuMS0xOTg4IHJlcXVpcmVzIG51bWJlcnMgdG8gYmUgZW5jb2RlZCBhcyBhIHN0cmluZyBvZgorICAgICMgb2N0YWwgZGlnaXRzIGZvbGxvd2VkIGJ5IGEgbnVsbC1ieXRlLCB0aGlzIGFsbG93cyB2YWx1ZXMgdXAgdG8KKyAgICAjICg4KiooZGlnaXRzLTEpKS0xLiBHTlUgdGFyIGFsbG93cyBzdG9yaW5nIG51bWJlcnMgZ3JlYXRlciB0aGFuCisgICAgIyB0aGF0IGlmIG5lY2Vzc2FyeS4gQSBsZWFkaW5nIDAyMDAgYnl0ZSBpbmRpY2F0ZXMgdGhpcyBwYXJ0aWN1bGFyCisgICAgIyBlbmNvZGluZywgdGhlIGZvbGxvd2luZyBkaWdpdHMtMSBieXRlcyBhcmUgYSBiaWctZW5kaWFuCisgICAgIyByZXByZXNlbnRhdGlvbi4gVGhpcyBhbGxvd3MgdmFsdWVzIHVwIHRvICgyNTYqKihkaWdpdHMtMSkpLTEuCisgICAgaWYgMCA8PSBuIDwgOCAqKiAoZGlnaXRzIC0gMSk6CisgICAgICAgIHMgPSAiJTAqbyIgJSAoZGlnaXRzIC0gMSwgbikgKyBOVUwKKyAgICBlbHNlOgorICAgICAgICBpZiBmb3JtYXQgIT0gR05VX0ZPUk1BVCBvciBuID49IDI1NiAqKiAoZGlnaXRzIC0gMSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJvdmVyZmxvdyBpbiBudW1iZXIgZmllbGQiKQorCisgICAgICAgIGlmIG4gPCAwOgorICAgICAgICAgICAgIyBYWFggV2UgbWltaWMgR05VIHRhcidzIGJlaGF2aW91ciB3aXRoIG5lZ2F0aXZlIG51bWJlcnMsCisgICAgICAgICAgICAjIHRoaXMgY291bGQgcmFpc2UgT3ZlcmZsb3dFcnJvci4KKyAgICAgICAgICAgIG4gPSBzdHJ1Y3QudW5wYWNrKCJMIiwgc3RydWN0LnBhY2soImwiLCBuKSlbMF0KKworICAgICAgICBzID0gIiIKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGRpZ2l0cyAtIDEpOgorICAgICAgICAgICAgcyA9IGNocihuICYgMDM3NykgKyBzCisgICAgICAgICAgICBuID4+PSA4CisgICAgICAgIHMgPSBjaHIoMDIwMCkgKyBzCisgICAgcmV0dXJuIHMKKworZGVmIHV0cyhzLCBlbmNvZGluZywgZXJyb3JzKToKKyAgICAiIiJDb252ZXJ0IGEgdW5pY29kZSBvYmplY3QgdG8gYSBzdHJpbmcuCisgICAgIiIiCisgICAgaWYgZXJyb3JzID09ICJ1dGYtOCI6CisgICAgICAgICMgQW4gZXh0cmEgZXJyb3IgaGFuZGxlciBzaW1pbGFyIHRvIHRoZSAtbyBpbnZhbGlkPVVURi04IG9wdGlvbgorICAgICAgICAjIGluIFBPU0lYLjEtMjAwMS4gUmVwbGFjZSB1bnRyYW5zbGF0YWJsZSBjaGFyYWN0ZXJzIHdpdGggdGhlaXIKKyAgICAgICAgIyBVVEYtOCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHMuZW5jb2RlKGVuY29kaW5nLCAic3RyaWN0IikKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgIHggPSBbXQorICAgICAgICAgICAgZm9yIGMgaW4gczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHguYXBwZW5kKGMuZW5jb2RlKGVuY29kaW5nLCAic3RyaWN0IikpCisgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFbmNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgeC5hcHBlbmQoYy5lbmNvZGUoInV0ZjgiKSkKKyAgICAgICAgICAgIHJldHVybiAiIi5qb2luKHgpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHMuZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpCisKK2RlZiBjYWxjX2Noa3N1bXMoYnVmKToKKyAgICAiIiJDYWxjdWxhdGUgdGhlIGNoZWNrc3VtIGZvciBhIG1lbWJlcidzIGhlYWRlciBieSBzdW1taW5nIHVwIGFsbAorICAgICAgIGNoYXJhY3RlcnMgZXhjZXB0IGZvciB0aGUgY2hrc3VtIGZpZWxkIHdoaWNoIGlzIHRyZWF0ZWQgYXMgaWYKKyAgICAgICBpdCB3YXMgZmlsbGVkIHdpdGggc3BhY2VzLiBBY2NvcmRpbmcgdG8gdGhlIEdOVSB0YXIgc291cmNlcywKKyAgICAgICBzb21lIHRhcnMgKFN1biBhbmQgTmVYVCkgY2FsY3VsYXRlIGNoa3N1bSB3aXRoIHNpZ25lZCBjaGFyLAorICAgICAgIHdoaWNoIHdpbGwgYmUgZGlmZmVyZW50IGlmIHRoZXJlIGFyZSBjaGFycyBpbiB0aGUgYnVmZmVyIHdpdGgKKyAgICAgICB0aGUgaGlnaCBiaXQgc2V0LiBTbyB3ZSBjYWxjdWxhdGUgdHdvIGNoZWNrc3VtcywgdW5zaWduZWQgYW5kCisgICAgICAgc2lnbmVkLgorICAgICIiIgorICAgIHVuc2lnbmVkX2Noa3N1bSA9IDI1NiArIHN1bShzdHJ1Y3QudW5wYWNrKCIxNDhCIiwgYnVmWzoxNDhdKSArIHN0cnVjdC51bnBhY2soIjM1NkIiLCBidWZbMTU2OjUxMl0pKQorICAgIHNpZ25lZF9jaGtzdW0gPSAyNTYgKyBzdW0oc3RydWN0LnVucGFjaygiMTQ4YiIsIGJ1Zls6MTQ4XSkgKyBzdHJ1Y3QudW5wYWNrKCIzNTZiIiwgYnVmWzE1Njo1MTJdKSkKKyAgICByZXR1cm4gdW5zaWduZWRfY2hrc3VtLCBzaWduZWRfY2hrc3VtCisKK2RlZiBjb3B5ZmlsZW9iaihzcmMsIGRzdCwgbGVuZ3RoPU5vbmUpOgorICAgICIiIkNvcHkgbGVuZ3RoIGJ5dGVzIGZyb20gZmlsZW9iaiBzcmMgdG8gZmlsZW9iaiBkc3QuCisgICAgICAgSWYgbGVuZ3RoIGlzIE5vbmUsIGNvcHkgdGhlIGVudGlyZSBjb250ZW50LgorICAgICIiIgorICAgIGlmIGxlbmd0aCA9PSAwOgorICAgICAgICByZXR1cm4KKyAgICBpZiBsZW5ndGggaXMgTm9uZToKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlb2JqKHNyYywgZHN0KQorICAgICAgICByZXR1cm4KKworICAgIEJVRlNJWkUgPSAxNiAqIDEwMjQKKyAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW5ndGgsIEJVRlNJWkUpCisgICAgZm9yIGIgaW4geHJhbmdlKGJsb2Nrcyk6CisgICAgICAgIGJ1ZiA9IHNyYy5yZWFkKEJVRlNJWkUpCisgICAgICAgIGlmIGxlbihidWYpIDwgQlVGU0laRToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoImVuZCBvZiBmaWxlIHJlYWNoZWQiKQorICAgICAgICBkc3Qud3JpdGUoYnVmKQorCisgICAgaWYgcmVtYWluZGVyICE9IDA6CisgICAgICAgIGJ1ZiA9IHNyYy5yZWFkKHJlbWFpbmRlcikKKyAgICAgICAgaWYgbGVuKGJ1ZikgPCByZW1haW5kZXI6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCJlbmQgb2YgZmlsZSByZWFjaGVkIikKKyAgICAgICAgZHN0LndyaXRlKGJ1ZikKKyAgICByZXR1cm4KKworZmlsZW1vZGVfdGFibGUgPSAoCisgICAgKChTX0lGTE5LLCAgICAgICJsIiksCisgICAgIChTX0lGUkVHLCAgICAgICItIiksCisgICAgIChTX0lGQkxLLCAgICAgICJiIiksCisgICAgIChTX0lGRElSLCAgICAgICJkIiksCisgICAgIChTX0lGQ0hSLCAgICAgICJjIiksCisgICAgIChTX0lGSUZPLCAgICAgICJwIikpLAorCisgICAgKChUVVJFQUQsICAgICAgICJyIiksKSwKKyAgICAoKFRVV1JJVEUsICAgICAgInciKSwpLAorICAgICgoVFVFWEVDfFRTVUlELCAicyIpLAorICAgICAoVFNVSUQsICAgICAgICAiUyIpLAorICAgICAoVFVFWEVDLCAgICAgICAieCIpKSwKKworICAgICgoVEdSRUFELCAgICAgICAiciIpLCksCisgICAgKChUR1dSSVRFLCAgICAgICJ3IiksKSwKKyAgICAoKFRHRVhFQ3xUU0dJRCwgInMiKSwKKyAgICAgKFRTR0lELCAgICAgICAgIlMiKSwKKyAgICAgKFRHRVhFQywgICAgICAgIngiKSksCisKKyAgICAoKFRPUkVBRCwgICAgICAgInIiKSwpLAorICAgICgoVE9XUklURSwgICAgICAidyIpLCksCisgICAgKChUT0VYRUN8VFNWVFgsICJ0IiksCisgICAgIChUU1ZUWCwgICAgICAgICJUIiksCisgICAgIChUT0VYRUMsICAgICAgICJ4IikpCispCisKK2RlZiBmaWxlbW9kZShtb2RlKToKKyAgICAiIiJDb252ZXJ0IGEgZmlsZSdzIG1vZGUgdG8gYSBzdHJpbmcgb2YgdGhlIGZvcm0KKyAgICAgICAtcnd4cnd4cnd4LgorICAgICAgIFVzZWQgYnkgVGFyRmlsZS5saXN0KCkKKyAgICAiIiIKKyAgICBwZXJtID0gW10KKyAgICBmb3IgdGFibGUgaW4gZmlsZW1vZGVfdGFibGU6CisgICAgICAgIGZvciBiaXQsIGNoYXIgaW4gdGFibGU6CisgICAgICAgICAgICBpZiBtb2RlICYgYml0ID09IGJpdDoKKyAgICAgICAgICAgICAgICBwZXJtLmFwcGVuZChjaGFyKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwZXJtLmFwcGVuZCgiLSIpCisgICAgcmV0dXJuICIiLmpvaW4ocGVybSkKKworY2xhc3MgVGFyRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJCYXNlIGV4Y2VwdGlvbi4iIiIKKyAgICBwYXNzCitjbGFzcyBFeHRyYWN0RXJyb3IoVGFyRXJyb3IpOgorICAgICIiIkdlbmVyYWwgZXhjZXB0aW9uIGZvciBleHRyYWN0IGVycm9ycy4iIiIKKyAgICBwYXNzCitjbGFzcyBSZWFkRXJyb3IoVGFyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5yZWFkYmxlIHRhciBhcmNoaXZlcy4iIiIKKyAgICBwYXNzCitjbGFzcyBDb21wcmVzc2lvbkVycm9yKFRhckVycm9yKToKKyAgICAiIiJFeGNlcHRpb24gZm9yIHVuYXZhaWxhYmxlIGNvbXByZXNzaW9uIG1ldGhvZHMuIiIiCisgICAgcGFzcworY2xhc3MgU3RyZWFtRXJyb3IoVGFyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgdW5zdXBwb3J0ZWQgb3BlcmF0aW9ucyBvbiBzdHJlYW0tbGlrZSBUYXJGaWxlcy4iIiIKKyAgICBwYXNzCitjbGFzcyBIZWFkZXJFcnJvcihUYXJFcnJvcik6CisgICAgIiIiQmFzZSBleGNlcHRpb24gZm9yIGhlYWRlciBlcnJvcnMuIiIiCisgICAgcGFzcworY2xhc3MgRW1wdHlIZWFkZXJFcnJvcihIZWFkZXJFcnJvcik6CisgICAgIiIiRXhjZXB0aW9uIGZvciBlbXB0eSBoZWFkZXJzLiIiIgorICAgIHBhc3MKK2NsYXNzIFRydW5jYXRlZEhlYWRlckVycm9yKEhlYWRlckVycm9yKToKKyAgICAiIiJFeGNlcHRpb24gZm9yIHRydW5jYXRlZCBoZWFkZXJzLiIiIgorICAgIHBhc3MKK2NsYXNzIEVPRkhlYWRlckVycm9yKEhlYWRlckVycm9yKToKKyAgICAiIiJFeGNlcHRpb24gZm9yIGVuZCBvZiBmaWxlIGhlYWRlcnMuIiIiCisgICAgcGFzcworY2xhc3MgSW52YWxpZEhlYWRlckVycm9yKEhlYWRlckVycm9yKToKKyAgICAiIiJFeGNlcHRpb24gZm9yIGludmFsaWQgaGVhZGVycy4iIiIKKyAgICBwYXNzCitjbGFzcyBTdWJzZXF1ZW50SGVhZGVyRXJyb3IoSGVhZGVyRXJyb3IpOgorICAgICIiIkV4Y2VwdGlvbiBmb3IgbWlzc2luZyBhbmQgaW52YWxpZCBleHRlbmRlZCBoZWFkZXJzLiIiIgorICAgIHBhc3MKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBpbnRlcm5hbCBzdHJlYW0gaW50ZXJmYWNlCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGFzcyBfTG93TGV2ZWxGaWxlOgorICAgICIiIkxvdy1sZXZlbCBmaWxlIG9iamVjdC4gU3VwcG9ydHMgcmVhZGluZyBhbmQgd3JpdGluZy4KKyAgICAgICBJdCBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWd1bGFyIGZpbGUgb2JqZWN0IGZvciBzdHJlYW1pbmcKKyAgICAgICBhY2Nlc3MuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZSk6CisgICAgICAgIG1vZGUgPSB7CisgICAgICAgICAgICAiciI6IG9zLk9fUkRPTkxZLAorICAgICAgICAgICAgInciOiBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQgfCBvcy5PX1RSVU5DLAorICAgICAgICB9W21vZGVdCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJPX0JJTkFSWSIpOgorICAgICAgICAgICAgbW9kZSB8PSBvcy5PX0JJTkFSWQorICAgICAgICBzZWxmLmZkID0gb3Mub3BlbihuYW1lLCBtb2RlLCAwNjY2KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBvcy5jbG9zZShzZWxmLmZkKQorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBvcy5yZWFkKHNlbGYuZmQsIHNpemUpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIG9zLndyaXRlKHNlbGYuZmQsIHMpCisKK2NsYXNzIF9TdHJlYW06CisgICAgIiIiQ2xhc3MgdGhhdCBzZXJ2ZXMgYXMgYW4gYWRhcHRlciBiZXR3ZWVuIFRhckZpbGUgYW5kCisgICAgICAgYSBzdHJlYW0tbGlrZSBvYmplY3QuICBUaGUgc3RyZWFtLWxpa2Ugb2JqZWN0IG9ubHkKKyAgICAgICBuZWVkcyB0byBoYXZlIGEgcmVhZCgpIG9yIHdyaXRlKCkgbWV0aG9kIGFuZCBpcyBhY2Nlc3NlZAorICAgICAgIGJsb2Nrd2lzZS4gIFVzZSBvZiBnemlwIG9yIGJ6aXAyIGNvbXByZXNzaW9uIGlzIHBvc3NpYmxlLgorICAgICAgIEEgc3RyZWFtLWxpa2Ugb2JqZWN0IGNvdWxkIGJlIGZvciBleGFtcGxlOiBzeXMuc3RkaW4sCisgICAgICAgc3lzLnN0ZG91dCwgYSBzb2NrZXQsIGEgdGFwZSBkZXZpY2UgZXRjLgorCisgICAgICAgX1N0cmVhbSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW50ZXJuYWxseS4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2RlLCBjb21wdHlwZSwgZmlsZW9iaiwgYnVmc2l6ZSk6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIF9TdHJlYW0gb2JqZWN0LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZXh0ZmlsZW9iaiA9IFRydWUKKyAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgZmlsZW9iaiA9IF9Mb3dMZXZlbEZpbGUobmFtZSwgbW9kZSkKKyAgICAgICAgICAgIHNlbGYuX2V4dGZpbGVvYmogPSBGYWxzZQorCisgICAgICAgIGlmIGNvbXB0eXBlID09ICcqJzoKKyAgICAgICAgICAgICMgRW5hYmxlIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uIGRldGVjdGlvbiBmb3IgdGhlCisgICAgICAgICAgICAjIHN0cmVhbSBpbnRlcmZhY2UKKyAgICAgICAgICAgIGZpbGVvYmogPSBfU3RyZWFtUHJveHkoZmlsZW9iaikKKyAgICAgICAgICAgIGNvbXB0eXBlID0gZmlsZW9iai5nZXRjb21wdHlwZSgpCisKKyAgICAgICAgc2VsZi5uYW1lICAgICA9IG5hbWUgb3IgIiIKKyAgICAgICAgc2VsZi5tb2RlICAgICA9IG1vZGUKKyAgICAgICAgc2VsZi5jb21wdHlwZSA9IGNvbXB0eXBlCisgICAgICAgIHNlbGYuZmlsZW9iaiAgPSBmaWxlb2JqCisgICAgICAgIHNlbGYuYnVmc2l6ZSAgPSBidWZzaXplCisgICAgICAgIHNlbGYuYnVmICAgICAgPSAiIgorICAgICAgICBzZWxmLnBvcyAgICAgID0gMEwKKyAgICAgICAgc2VsZi5jbG9zZWQgICA9IEZhbHNlCisKKyAgICAgICAgaWYgY29tcHR5cGUgPT0gImd6IjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIENvbXByZXNzaW9uRXJyb3IoInpsaWIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQorICAgICAgICAgICAgc2VsZi56bGliID0gemxpYgorICAgICAgICAgICAgc2VsZi5jcmMgPSB6bGliLmNyYzMyKCIiKSAmIDB4ZmZmZmZmZmZMCisgICAgICAgICAgICBpZiBtb2RlID09ICJyIjoKKyAgICAgICAgICAgICAgICBzZWxmLl9pbml0X3JlYWRfZ3ooKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9pbml0X3dyaXRlX2d6KCkKKworICAgICAgICBpZiBjb21wdHlwZSA9PSAiYnoyIjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgYnoyCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiYnoyIG1vZHVsZSBpcyBub3QgYXZhaWxhYmxlIikKKyAgICAgICAgICAgIGlmIG1vZGUgPT0gInIiOgorICAgICAgICAgICAgICAgIHNlbGYuZGJ1ZiA9ICIiCisgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyRGVjb21wcmVzc29yKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jbXAgPSBiejIuQloyQ29tcHJlc3NvcigpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiY2xvc2VkIikgYW5kIG5vdCBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIF9pbml0X3dyaXRlX2d6KHNlbGYpOgorICAgICAgICAiIiJJbml0aWFsaXplIGZvciB3cml0aW5nIHdpdGggZ3ppcCBjb21wcmVzc2lvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY21wID0gc2VsZi56bGliLmNvbXByZXNzb2JqKDksIHNlbGYuemxpYi5ERUZMQVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLXNlbGYuemxpYi5NQVhfV0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuemxpYi5ERUZfTUVNX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgICAgICB0aW1lc3RhbXAgPSBzdHJ1Y3QucGFjaygiPEwiLCBsb25nKHRpbWUudGltZSgpKSkKKyAgICAgICAgc2VsZi5fX3dyaXRlKCJcMDM3XDIxM1wwMTBcMDEwJXNcMDAyXDM3NyIgJSB0aW1lc3RhbXApCisgICAgICAgIGlmIHR5cGUoc2VsZi5uYW1lKSBpcyB1bmljb2RlOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gc2VsZi5uYW1lLmVuY29kZSgiaXNvLTg4NTktMSIsICJyZXBsYWNlIikKKyAgICAgICAgaWYgc2VsZi5uYW1lLmVuZHN3aXRoKCIuZ3oiKToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IHNlbGYubmFtZVs6LTNdCisgICAgICAgIHNlbGYuX193cml0ZShzZWxmLm5hbWUgKyBOVUwpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgICIiIldyaXRlIHN0cmluZyBzIHRvIHRoZSBzdHJlYW0uCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNvbXB0eXBlID09ICJneiI6CisgICAgICAgICAgICBzZWxmLmNyYyA9IHNlbGYuemxpYi5jcmMzMihzLCBzZWxmLmNyYykgJiAweGZmZmZmZmZmTAorICAgICAgICBzZWxmLnBvcyArPSBsZW4ocykKKyAgICAgICAgaWYgc2VsZi5jb21wdHlwZSAhPSAidGFyIjoKKyAgICAgICAgICAgIHMgPSBzZWxmLmNtcC5jb21wcmVzcyhzKQorICAgICAgICBzZWxmLl9fd3JpdGUocykKKworICAgIGRlZiBfX3dyaXRlKHNlbGYsIHMpOgorICAgICAgICAiIiJXcml0ZSBzdHJpbmcgcyB0byB0aGUgc3RyZWFtIGlmIGEgd2hvbGUgbmV3IGJsb2NrCisgICAgICAgICAgIGlzIHJlYWR5IHRvIGJlIHdyaXR0ZW4uCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmJ1ZiArPSBzCisgICAgICAgIHdoaWxlIGxlbihzZWxmLmJ1ZikgPiBzZWxmLmJ1ZnNpemU6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5idWZbOnNlbGYuYnVmc2l6ZV0pCisgICAgICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NlbGYuYnVmc2l6ZTpdCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBfU3RyZWFtIG9iamVjdC4gTm8gb3BlcmF0aW9uIHNob3VsZCBiZQorICAgICAgICAgICBkb25lIG9uIGl0IGFmdGVyd2FyZHMuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyIgYW5kIHNlbGYuY29tcHR5cGUgIT0gInRhciI6CisgICAgICAgICAgICBzZWxmLmJ1ZiArPSBzZWxmLmNtcC5mbHVzaCgpCisKKyAgICAgICAgaWYgc2VsZi5tb2RlID09ICJ3IiBhbmQgc2VsZi5idWY6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5idWYpCisgICAgICAgICAgICBzZWxmLmJ1ZiA9ICIiCisgICAgICAgICAgICBpZiBzZWxmLmNvbXB0eXBlID09ICJneiI6CisgICAgICAgICAgICAgICAgIyBUaGUgbmF0aXZlIHpsaWIgY3JjIGlzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCBidXQKKyAgICAgICAgICAgICAgICAjIHRoZSBQeXRob24gd3JhcHBlciBpbXBsaWNpdGx5IGNhc3RzIHRoYXQgdG8gYSBzaWduZWQgQworICAgICAgICAgICAgICAgICMgbG9uZy4gIFNvLCBvbiBhIDMyLWJpdCBib3ggc2VsZi5jcmMgbWF5ICJsb29rIG5lZ2F0aXZlIiwKKyAgICAgICAgICAgICAgICAjIHdoaWxlIHRoZSBzYW1lIGNyYyBvbiBhIDY0LWJpdCBib3ggbWF5ICJsb29rIHBvc2l0aXZlIi4KKyAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGlya3NvbWUgd2FybmluZ3MgZnJvbSB0aGUgYHN0cnVjdGAgbW9kdWxlLCBmb3JjZQorICAgICAgICAgICAgICAgICMgaXQgdG8gbG9vayBwb3NpdGl2ZSBvbiBhbGwgYm94ZXMuCisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHNlbGYuY3JjICYgMHhmZmZmZmZmZkwpKQorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCBzZWxmLnBvcyAmIDB4ZmZmZkZGRkZMKSkKKworICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisKKyAgICBkZWYgX2luaXRfcmVhZF9neihzZWxmKToKKyAgICAgICAgIiIiSW5pdGlhbGl6ZSBmb3IgcmVhZGluZyBhIGd6aXAgY29tcHJlc3NlZCBmaWxlb2JqLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jbXAgPSBzZWxmLnpsaWIuZGVjb21wcmVzc29iaigtc2VsZi56bGliLk1BWF9XQklUUykKKyAgICAgICAgc2VsZi5kYnVmID0gIiIKKworICAgICAgICAjIHRha2VuIGZyb20gZ3ppcC5HemlwRmlsZSB3aXRoIHNvbWUgYWx0ZXJhdGlvbnMKKyAgICAgICAgaWYgc2VsZi5fX3JlYWQoMikgIT0gIlwwMzdcMjEzIjoKKyAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcigibm90IGEgZ3ppcCBmaWxlIikKKyAgICAgICAgaWYgc2VsZi5fX3JlYWQoMSkgIT0gIlwwMTAiOgorICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigidW5zdXBwb3J0ZWQgY29tcHJlc3Npb24gbWV0aG9kIikKKworICAgICAgICBmbGFnID0gb3JkKHNlbGYuX19yZWFkKDEpKQorICAgICAgICBzZWxmLl9fcmVhZCg2KQorCisgICAgICAgIGlmIGZsYWcgJiA0OgorICAgICAgICAgICAgeGxlbiA9IG9yZChzZWxmLl9fcmVhZCgxKSkgKyAyNTYgKiBvcmQoc2VsZi5fX3JlYWQoMSkpCisgICAgICAgICAgICBzZWxmLnJlYWQoeGxlbikKKyAgICAgICAgaWYgZmxhZyAmIDg6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLl9fcmVhZCgxKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHMgPT0gTlVMOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBmbGFnICYgMTY6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLl9fcmVhZCgxKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzIG9yIHMgPT0gTlVMOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBmbGFnICYgMjoKKyAgICAgICAgICAgIHNlbGYuX19yZWFkKDIpCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBzdHJlYW0ncyBmaWxlIHBvaW50ZXIgcG9zaXRpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wb3MKKworICAgIGRlZiBzZWVrKHNlbGYsIHBvcz0wKToKKyAgICAgICAgIiIiU2V0IHRoZSBzdHJlYW0ncyBmaWxlIHBvaW50ZXIgdG8gcG9zLiBOZWdhdGl2ZSBzZWVraW5nCisgICAgICAgICAgIGlzIGZvcmJpZGRlbi4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHBvcyAtIHNlbGYucG9zID49IDA6CisgICAgICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChwb3MgLSBzZWxmLnBvcywgc2VsZi5idWZzaXplKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGJsb2Nrcyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkKHNlbGYuYnVmc2l6ZSkKKyAgICAgICAgICAgIHNlbGYucmVhZChyZW1haW5kZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTdHJlYW1FcnJvcigic2Vla2luZyBiYWNrd2FyZHMgaXMgbm90IGFsbG93ZWQiKQorICAgICAgICByZXR1cm4gc2VsZi5wb3MKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgbmV4dCBzaXplIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzdHJlYW0uCisgICAgICAgICAgIElmIHNpemUgaXMgbm90IGRlZmluZWQsIHJldHVybiBhbGwgYnl0ZXMgb2YgdGhlIHN0cmVhbQorICAgICAgICAgICB1cCB0byBFT0YuCisgICAgICAgICIiIgorICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICB0ID0gW10KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi5fcmVhZChzZWxmLmJ1ZnNpemUpCisgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0LmFwcGVuZChidWYpCisgICAgICAgICAgICBidWYgPSAiIi5qb2luKHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWYgPSBzZWxmLl9yZWFkKHNpemUpCisgICAgICAgIHNlbGYucG9zICs9IGxlbihidWYpCisgICAgICAgIHJldHVybiBidWYKKworICAgIGRlZiBfcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgIiIiUmV0dXJuIHNpemUgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAidGFyIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fcmVhZChzaXplKQorCisgICAgICAgIGMgPSBsZW4oc2VsZi5kYnVmKQorICAgICAgICB0ID0gW3NlbGYuZGJ1Zl0KKyAgICAgICAgd2hpbGUgYyA8IHNpemU6CisgICAgICAgICAgICBidWYgPSBzZWxmLl9fcmVhZChzZWxmLmJ1ZnNpemUpCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi5jbXAuZGVjb21wcmVzcyhidWYpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImludmFsaWQgY29tcHJlc3NlZCBkYXRhIikKKyAgICAgICAgICAgIHQuYXBwZW5kKGJ1ZikKKyAgICAgICAgICAgIGMgKz0gbGVuKGJ1ZikKKyAgICAgICAgdCA9ICIiLmpvaW4odCkKKyAgICAgICAgc2VsZi5kYnVmID0gdFtzaXplOl0KKyAgICAgICAgcmV0dXJuIHRbOnNpemVdCisKKyAgICBkZWYgX19yZWFkKHNlbGYsIHNpemUpOgorICAgICAgICAiIiJSZXR1cm4gc2l6ZSBieXRlcyBmcm9tIHN0cmVhbS4gSWYgaW50ZXJuYWwgYnVmZmVyIGlzIGVtcHR5LAorICAgICAgICAgICByZWFkIGFub3RoZXIgYmxvY2sgZnJvbSB0aGUgc3RyZWFtLgorICAgICAgICAiIiIKKyAgICAgICAgYyA9IGxlbihzZWxmLmJ1ZikKKyAgICAgICAgdCA9IFtzZWxmLmJ1Zl0KKyAgICAgICAgd2hpbGUgYyA8IHNpemU6CisgICAgICAgICAgICBidWYgPSBzZWxmLmZpbGVvYmoucmVhZChzZWxmLmJ1ZnNpemUpCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0LmFwcGVuZChidWYpCisgICAgICAgICAgICBjICs9IGxlbihidWYpCisgICAgICAgIHQgPSAiIi5qb2luKHQpCisgICAgICAgIHNlbGYuYnVmID0gdFtzaXplOl0KKyAgICAgICAgcmV0dXJuIHRbOnNpemVdCisjIGNsYXNzIF9TdHJlYW0KKworY2xhc3MgX1N0cmVhbVByb3h5KG9iamVjdCk6CisgICAgIiIiU21hbGwgcHJveHkgY2xhc3MgdGhhdCBlbmFibGVzIHRyYW5zcGFyZW50IGNvbXByZXNzaW9uCisgICAgICAgZGV0ZWN0aW9uIGZvciB0aGUgU3RyZWFtIGludGVyZmFjZSAobW9kZSAncnwqJykuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW9iaik6CisgICAgICAgIHNlbGYuZmlsZW9iaiA9IGZpbGVvYmoKKyAgICAgICAgc2VsZi5idWYgPSBzZWxmLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisKKyAgICBkZWYgcmVhZChzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5maWxlb2JqLnJlYWQKKyAgICAgICAgcmV0dXJuIHNlbGYuYnVmCisKKyAgICBkZWYgZ2V0Y29tcHR5cGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnVmLnN0YXJ0c3dpdGgoIlwwMzdcMjEzXDAxMCIpOgorICAgICAgICAgICAgcmV0dXJuICJneiIKKyAgICAgICAgaWYgc2VsZi5idWZbMDozXSA9PSAiQlpoIiBhbmQgc2VsZi5idWZbNDoxMF0gPT0gIjFBWSZTWSI6CisgICAgICAgICAgICByZXR1cm4gImJ6MiIKKyAgICAgICAgcmV0dXJuICJ0YXIiCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCisjIGNsYXNzIFN0cmVhbVByb3h5CisKK2NsYXNzIF9CWjJQcm94eShvYmplY3QpOgorICAgICIiIlNtYWxsIHByb3h5IGNsYXNzIHRoYXQgZW5hYmxlcyBleHRlcm5hbCBmaWxlIG9iamVjdAorICAgICAgIHN1cHBvcnQgZm9yICJyOmJ6MiIgYW5kICJ3OmJ6MiIgbW9kZXMuIFRoaXMgaXMgYWN0dWFsbHkKKyAgICAgICBhIHdvcmthcm91bmQgZm9yIGEgbGltaXRhdGlvbiBpbiBiejIgbW9kdWxlJ3MgQloyRmlsZQorICAgICAgIGNsYXNzIHdoaWNoICh1bmxpa2UgZ3ppcC5HemlwRmlsZSkgaGFzIG5vIHN1cHBvcnQgZm9yCisgICAgICAgYSBmaWxlIG9iamVjdCBhcmd1bWVudC4KKyAgICAiIiIKKworICAgIGJsb2Nrc2l6ZSA9IDE2ICogMTAyNAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUpOgorICAgICAgICBzZWxmLmZpbGVvYmogPSBmaWxlb2JqCisgICAgICAgIHNlbGYubW9kZSA9IG1vZGUKKyAgICAgICAgc2VsZi5uYW1lID0gZ2V0YXR0cihzZWxmLmZpbGVvYmosICJuYW1lIiwgTm9uZSkKKyAgICAgICAgc2VsZi5pbml0KCkKKworICAgIGRlZiBpbml0KHNlbGYpOgorICAgICAgICBpbXBvcnQgYnoyCisgICAgICAgIHNlbGYucG9zID0gMAorICAgICAgICBpZiBzZWxmLm1vZGUgPT0gInIiOgorICAgICAgICAgICAgc2VsZi5iejJvYmogPSBiejIuQloyRGVjb21wcmVzc29yKCkKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmJ1ZiA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJ6Mm9iaiA9IGJ6Mi5CWjJDb21wcmVzc29yKCkKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemUpOgorICAgICAgICBiID0gW3NlbGYuYnVmXQorICAgICAgICB4ID0gbGVuKHNlbGYuYnVmKQorICAgICAgICB3aGlsZSB4IDwgc2l6ZToKKyAgICAgICAgICAgIHJhdyA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYmxvY2tzaXplKQorICAgICAgICAgICAgaWYgbm90IHJhdzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZGF0YSA9IHNlbGYuYnoyb2JqLmRlY29tcHJlc3MocmF3KQorICAgICAgICAgICAgYi5hcHBlbmQoZGF0YSkKKyAgICAgICAgICAgIHggKz0gbGVuKGRhdGEpCisgICAgICAgIHNlbGYuYnVmID0gIiIuam9pbihiKQorCisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmWzpzaXplXQorICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmW3NpemU6XQorICAgICAgICBzZWxmLnBvcyArPSBsZW4oYnVmKQorICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MpOgorICAgICAgICBpZiBwb3MgPCBzZWxmLnBvczoKKyAgICAgICAgICAgIHNlbGYuaW5pdCgpCisgICAgICAgIHNlbGYucmVhZChwb3MgLSBzZWxmLnBvcykKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5wb3MKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5wb3MgKz0gbGVuKGRhdGEpCisgICAgICAgIHJhdyA9IHNlbGYuYnoyb2JqLmNvbXByZXNzKGRhdGEpCisgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShyYXcpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAidyI6CisgICAgICAgICAgICByYXcgPSBzZWxmLmJ6Mm9iai5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUocmF3KQorIyBjbGFzcyBfQloyUHJveHkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFeHRyYWN0aW9uIGZpbGUgb2JqZWN0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitjbGFzcyBfRmlsZUluRmlsZShvYmplY3QpOgorICAgICIiIkEgdGhpbiB3cmFwcGVyIGFyb3VuZCBhbiBleGlzdGluZyBmaWxlIG9iamVjdCB0aGF0CisgICAgICAgcHJvdmlkZXMgYSBwYXJ0IG9mIGl0cyBkYXRhIGFzIGFuIGluZGl2aWR1YWwgZmlsZQorICAgICAgIG9iamVjdC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlb2JqLCBvZmZzZXQsIHNpemUsIHNwYXJzZT1Ob25lKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLnNpemUgPSBzaXplCisgICAgICAgIHNlbGYuc3BhcnNlID0gc3BhcnNlCisgICAgICAgIHNlbGYucG9zaXRpb24gPSAwCisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5wb3NpdGlvbgorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zaXRpb24pOgorICAgICAgICAiIiJTZWVrIHRvIGEgcG9zaXRpb24gaW4gdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnBvc2l0aW9uID0gcG9zaXRpb24KKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgZGF0YSBmcm9tIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgc2l6ZSA9IHNlbGYuc2l6ZSAtIHNlbGYucG9zaXRpb24KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpemUgPSBtaW4oc2l6ZSwgc2VsZi5zaXplIC0gc2VsZi5wb3NpdGlvbikKKworICAgICAgICBpZiBzZWxmLnNwYXJzZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVhZG5vcm1hbChzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYucmVhZHNwYXJzZShzaXplKQorCisgICAgZGVmIHJlYWRub3JtYWwoc2VsZiwgc2l6ZSk6CisgICAgICAgICIiIlJlYWQgb3BlcmF0aW9uIGZvciByZWd1bGFyIGZpbGVzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQgKyBzZWxmLnBvc2l0aW9uKQorICAgICAgICBzZWxmLnBvc2l0aW9uICs9IHNpemUKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW9iai5yZWFkKHNpemUpCisKKyAgICBkZWYgcmVhZHNwYXJzZShzZWxmLCBzaXplKToKKyAgICAgICAgIiIiUmVhZCBvcGVyYXRpb24gZm9yIHNwYXJzZSBmaWxlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICB3aGlsZSBzaXplID4gMDoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYucmVhZHNwYXJzZXNlY3Rpb24oc2l6ZSkKKyAgICAgICAgICAgIGlmIG5vdCBidWY6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNpemUgLT0gbGVuKGJ1ZikKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKGJ1ZikKKyAgICAgICAgcmV0dXJuICIiLmpvaW4oZGF0YSkKKworICAgIGRlZiByZWFkc3BhcnNlc2VjdGlvbihzZWxmLCBzaXplKToKKyAgICAgICAgIiIiUmVhZCBhIHNpbmdsZSBzZWN0aW9uIG9mIGEgc3BhcnNlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBzZWN0aW9uID0gc2VsZi5zcGFyc2UuZmluZChzZWxmLnBvc2l0aW9uKQorCisgICAgICAgIGlmIHNlY3Rpb24gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiIgorCisgICAgICAgIHNpemUgPSBtaW4oc2l6ZSwgc2VjdGlvbi5vZmZzZXQgKyBzZWN0aW9uLnNpemUgLSBzZWxmLnBvc2l0aW9uKQorCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VjdGlvbiwgX2RhdGEpOgorICAgICAgICAgICAgcmVhbHBvcyA9IHNlY3Rpb24ucmVhbHBvcyArIHNlbGYucG9zaXRpb24gLSBzZWN0aW9uLm9mZnNldAorICAgICAgICAgICAgc2VsZi5maWxlb2JqLnNlZWsoc2VsZi5vZmZzZXQgKyByZWFscG9zKQorICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiArPSBzaXplCisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqLnJlYWQoc2l6ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucG9zaXRpb24gKz0gc2l6ZQorICAgICAgICAgICAgcmV0dXJuIE5VTCAqIHNpemUKKyNjbGFzcyBfRmlsZUluRmlsZQorCisKK2NsYXNzIEV4RmlsZU9iamVjdChvYmplY3QpOgorICAgICIiIkZpbGUtbGlrZSBvYmplY3QgZm9yIHJlYWRpbmcgYW4gYXJjaGl2ZSBtZW1iZXIuCisgICAgICAgSXMgcmV0dXJuZWQgYnkgVGFyRmlsZS5leHRyYWN0ZmlsZSgpLgorICAgICIiIgorICAgIGJsb2Nrc2l6ZSA9IDEwMjQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJmaWxlLCB0YXJpbmZvKToKKyAgICAgICAgc2VsZi5maWxlb2JqID0gX0ZpbGVJbkZpbGUodGFyZmlsZS5maWxlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLm9mZnNldF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJpbmZvLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIodGFyaW5mbywgInNwYXJzZSIsIE5vbmUpKQorICAgICAgICBzZWxmLm5hbWUgPSB0YXJpbmZvLm5hbWUKKyAgICAgICAgc2VsZi5tb2RlID0gInIiCisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5zaXplID0gdGFyaW5mby5zaXplCisKKyAgICAgICAgc2VsZi5wb3NpdGlvbiA9IDAKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIgorCisgICAgZGVmIHJlYWQoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgIiIiUmVhZCBhdCBtb3N0IHNpemUgYnl0ZXMgZnJvbSB0aGUgZmlsZS4gSWYgc2l6ZSBpcyBub3QKKyAgICAgICAgICAgcHJlc2VudCBvciBOb25lLCByZWFkIGFsbCBkYXRhIHVudGlsIEVPRiBpcyByZWFjaGVkLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKKworICAgICAgICBidWYgPSAiIgorICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgIGlmIHNpemUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmJ1ZmZlcgorICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnVmID0gc2VsZi5idWZmZXJbOnNpemVdCisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltzaXplOl0KKworICAgICAgICBpZiBzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBidWYgKz0gc2VsZi5maWxlb2JqLnJlYWQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVmICs9IHNlbGYuZmlsZW9iai5yZWFkKHNpemUgLSBsZW4oYnVmKSkKKworICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihidWYpCisgICAgICAgIHJldHVybiBidWYKKworICAgIGRlZiByZWFkbGluZShzZWxmLCBzaXplPS0xKToKKyAgICAgICAgIiIiUmVhZCBvbmUgZW50aXJlIGxpbmUgZnJvbSB0aGUgZmlsZS4gSWYgc2l6ZSBpcyBwcmVzZW50CisgICAgICAgICAgIGFuZCBub24tbmVnYXRpdmUsIHJldHVybiBhIHN0cmluZyB3aXRoIGF0IG1vc3QgdGhhdAorICAgICAgICAgICBzaXplLCB3aGljaCBtYXkgYmUgYW4gaW5jb21wbGV0ZSBsaW5lLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJL08gb3BlcmF0aW9uIG9uIGNsb3NlZCBmaWxlIikKKworICAgICAgICBpZiAiXG4iIGluIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgcG9zID0gc2VsZi5idWZmZXIuZmluZCgiXG4iKSArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJ1ZmZlcnMgPSBbc2VsZi5idWZmZXJdCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYuZmlsZW9iai5yZWFkKHNlbGYuYmxvY2tzaXplKQorICAgICAgICAgICAgICAgIGJ1ZmZlcnMuYXBwZW5kKGJ1ZikKKyAgICAgICAgICAgICAgICBpZiBub3QgYnVmIG9yICJcbiIgaW4gYnVmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiLmpvaW4oYnVmZmVycykKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gc2VsZi5idWZmZXIuZmluZCgiXG4iKSArIDEKKyAgICAgICAgICAgICAgICAgICAgaWYgcG9zID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIG5ld2xpbmUgZm91bmQuCisgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBsZW4oc2VsZi5idWZmZXIpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgaWYgc2l6ZSAhPSAtMToKKyAgICAgICAgICAgIHBvcyA9IG1pbihzaXplLCBwb3MpCisKKyAgICAgICAgYnVmID0gc2VsZi5idWZmZXJbOnBvc10KKyAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlcltwb3M6XQorICAgICAgICBzZWxmLnBvc2l0aW9uICs9IGxlbihidWYpCisgICAgICAgIHJldHVybiBidWYKKworICAgIGRlZiByZWFkbGluZXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgd2l0aCBhbGwgcmVtYWluaW5nIGxpbmVzLgorICAgICAgICAiIiIKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgdGVsbChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24uCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkkvTyBvcGVyYXRpb24gb24gY2xvc2VkIGZpbGUiKQorCisgICAgICAgIHJldHVybiBzZWxmLnBvc2l0aW9uCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZT1vcy5TRUVLX1NFVCk6CisgICAgICAgICIiIlNlZWsgdG8gYSBwb3NpdGlvbiBpbiB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSS9PIG9wZXJhdGlvbiBvbiBjbG9zZWQgZmlsZSIpCisKKyAgICAgICAgaWYgd2hlbmNlID09IG9zLlNFRUtfU0VUOgorICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IG1pbihtYXgocG9zLCAwKSwgc2VsZi5zaXplKQorICAgICAgICBlbGlmIHdoZW5jZSA9PSBvcy5TRUVLX0NVUjoKKyAgICAgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICAgICAgc2VsZi5wb3NpdGlvbiA9IG1heChzZWxmLnBvc2l0aW9uICsgcG9zLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWluKHNlbGYucG9zaXRpb24gKyBwb3MsIHNlbGYuc2l6ZSkKKyAgICAgICAgZWxpZiB3aGVuY2UgPT0gb3MuU0VFS19FTkQ6CisgICAgICAgICAgICBzZWxmLnBvc2l0aW9uID0gbWF4KG1pbihzZWxmLnNpemUgKyBwb3MsIHNlbGYuc2l6ZSksIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IikKKworICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiCisgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYucG9zaXRpb24pCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBmaWxlIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAiIiJHZXQgYW4gaXRlcmF0b3Igb3ZlciB0aGUgZmlsZSdzIGxpbmVzLgorICAgICAgICAiIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB5aWVsZCBsaW5lCisjY2xhc3MgRXhGaWxlT2JqZWN0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0KKyMgRXhwb3J0ZWQgQ2xhc3NlcworIy0tLS0tLS0tLS0tLS0tLS0tLQorY2xhc3MgVGFySW5mbyhvYmplY3QpOgorICAgICIiIkluZm9ybWF0aW9uYWwgY2xhc3Mgd2hpY2ggaG9sZHMgdGhlIGRldGFpbHMgYWJvdXQgYW4KKyAgICAgICBhcmNoaXZlIG1lbWJlciBnaXZlbiBieSBhIHRhciBoZWFkZXIgYmxvY2suCisgICAgICAgVGFySW5mbyBvYmplY3RzIGFyZSByZXR1cm5lZCBieSBUYXJGaWxlLmdldG1lbWJlcigpLAorICAgICAgIFRhckZpbGUuZ2V0bWVtYmVycygpIGFuZCBUYXJGaWxlLmdldHRhcmluZm8oKSBhbmQgYXJlCisgICAgICAgdXN1YWxseSBjcmVhdGVkIGludGVybmFsbHkuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iIik6CisgICAgICAgICIiIkNvbnN0cnVjdCBhIFRhckluZm8gb2JqZWN0LiBuYW1lIGlzIHRoZSBvcHRpb25hbCBuYW1lCisgICAgICAgICAgIG9mIHRoZSBtZW1iZXIuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lICAgICAgICAjIG1lbWJlciBuYW1lCisgICAgICAgIHNlbGYubW9kZSA9IDA2NDQgICAgICAgICMgZmlsZSBwZXJtaXNzaW9ucworICAgICAgICBzZWxmLnVpZCA9IDAgICAgICAgICAgICAjIHVzZXIgaWQKKyAgICAgICAgc2VsZi5naWQgPSAwICAgICAgICAgICAgIyBncm91cCBpZAorICAgICAgICBzZWxmLnNpemUgPSAwICAgICAgICAgICAjIGZpbGUgc2l6ZQorICAgICAgICBzZWxmLm10aW1lID0gMCAgICAgICAgICAjIG1vZGlmaWNhdGlvbiB0aW1lCisgICAgICAgIHNlbGYuY2hrc3VtID0gMCAgICAgICAgICMgaGVhZGVyIGNoZWNrc3VtCisgICAgICAgIHNlbGYudHlwZSA9IFJFR1RZUEUgICAgICMgbWVtYmVyIHR5cGUKKyAgICAgICAgc2VsZi5saW5rbmFtZSA9ICIiICAgICAgIyBsaW5rIG5hbWUKKyAgICAgICAgc2VsZi51bmFtZSA9ICIiICAgICAgICAgIyB1c2VyIG5hbWUKKyAgICAgICAgc2VsZi5nbmFtZSA9ICIiICAgICAgICAgIyBncm91cCBuYW1lCisgICAgICAgIHNlbGYuZGV2bWFqb3IgPSAwICAgICAgICMgZGV2aWNlIG1ham9yIG51bWJlcgorICAgICAgICBzZWxmLmRldm1pbm9yID0gMCAgICAgICAjIGRldmljZSBtaW5vciBudW1iZXIKKworICAgICAgICBzZWxmLm9mZnNldCA9IDAgICAgICAgICAjIHRoZSB0YXIgaGVhZGVyIHN0YXJ0cyBoZXJlCisgICAgICAgIHNlbGYub2Zmc2V0X2RhdGEgPSAwICAgICMgdGhlIGZpbGUncyBkYXRhIHN0YXJ0cyBoZXJlCisKKyAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9ICAgIyBwYXggaGVhZGVyIGluZm9ybWF0aW9uCisKKyAgICAjIEluIHBheCBoZWFkZXJzIHRoZSAibmFtZSIgYW5kICJsaW5rbmFtZSIgZmllbGQgYXJlIGNhbGxlZAorICAgICMgInBhdGgiIGFuZCAibGlua3BhdGgiLgorICAgIGRlZiBfZ2V0cGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorICAgIGRlZiBfc2V0cGF0aChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgIHBhdGggPSBwcm9wZXJ0eShfZ2V0cGF0aCwgX3NldHBhdGgpCisKKyAgICBkZWYgX2dldGxpbmtwYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5saW5rbmFtZQorICAgIGRlZiBfc2V0bGlua3BhdGgoc2VsZiwgbGlua25hbWUpOgorICAgICAgICBzZWxmLmxpbmtuYW1lID0gbGlua25hbWUKKyAgICBsaW5rcGF0aCA9IHByb3BlcnR5KF9nZXRsaW5rcGF0aCwgX3NldGxpbmtwYXRoKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjwlcyAlciBhdCAlI3g+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXyxzZWxmLm5hbWUsaWQoc2VsZikpCisKKyAgICBkZWYgZ2V0X2luZm8oc2VsZiwgZW5jb2RpbmcsIGVycm9ycyk6CisgICAgICAgICIiIlJldHVybiB0aGUgVGFySW5mbydzIGF0dHJpYnV0ZXMgYXMgYSBkaWN0aW9uYXJ5LgorICAgICAgICAiIiIKKyAgICAgICAgaW5mbyA9IHsKKyAgICAgICAgICAgICJuYW1lIjogICAgIHNlbGYubmFtZSwKKyAgICAgICAgICAgICJtb2RlIjogICAgIHNlbGYubW9kZSAmIDA3Nzc3LAorICAgICAgICAgICAgInVpZCI6ICAgICAgc2VsZi51aWQsCisgICAgICAgICAgICAiZ2lkIjogICAgICBzZWxmLmdpZCwKKyAgICAgICAgICAgICJzaXplIjogICAgIHNlbGYuc2l6ZSwKKyAgICAgICAgICAgICJtdGltZSI6ICAgIHNlbGYubXRpbWUsCisgICAgICAgICAgICAiY2hrc3VtIjogICBzZWxmLmNoa3N1bSwKKyAgICAgICAgICAgICJ0eXBlIjogICAgIHNlbGYudHlwZSwKKyAgICAgICAgICAgICJsaW5rbmFtZSI6IHNlbGYubGlua25hbWUsCisgICAgICAgICAgICAidW5hbWUiOiAgICBzZWxmLnVuYW1lLAorICAgICAgICAgICAgImduYW1lIjogICAgc2VsZi5nbmFtZSwKKyAgICAgICAgICAgICJkZXZtYWpvciI6IHNlbGYuZGV2bWFqb3IsCisgICAgICAgICAgICAiZGV2bWlub3IiOiBzZWxmLmRldm1pbm9yCisgICAgICAgIH0KKworICAgICAgICBpZiBpbmZvWyJ0eXBlIl0gPT0gRElSVFlQRSBhbmQgbm90IGluZm9bIm5hbWUiXS5lbmRzd2l0aCgiLyIpOgorICAgICAgICAgICAgaW5mb1sibmFtZSJdICs9ICIvIgorCisgICAgICAgIGZvciBrZXkgaW4gKCJuYW1lIiwgImxpbmtuYW1lIiwgInVuYW1lIiwgImduYW1lIik6CisgICAgICAgICAgICBpZiB0eXBlKGluZm9ba2V5XSkgaXMgdW5pY29kZToKKyAgICAgICAgICAgICAgICBpbmZvW2tleV0gPSBpbmZvW2tleV0uZW5jb2RlKGVuY29kaW5nLCBlcnJvcnMpCisKKyAgICAgICAgcmV0dXJuIGluZm8KKworICAgIGRlZiB0b2J1ZihzZWxmLCBmb3JtYXQ9REVGQVVMVF9GT1JNQVQsIGVuY29kaW5nPUVOQ09ESU5HLCBlcnJvcnM9InN0cmljdCIpOgorICAgICAgICAiIiJSZXR1cm4gYSB0YXIgaGVhZGVyIGFzIGEgc3RyaW5nIG9mIDUxMiBieXRlIGJsb2Nrcy4KKyAgICAgICAgIiIiCisgICAgICAgIGluZm8gPSBzZWxmLmdldF9pbmZvKGVuY29kaW5nLCBlcnJvcnMpCisKKyAgICAgICAgaWYgZm9ybWF0ID09IFVTVEFSX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV91c3Rhcl9oZWFkZXIoaW5mbykKKyAgICAgICAgZWxpZiBmb3JtYXQgPT0gR05VX0ZPUk1BVDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNyZWF0ZV9nbnVfaGVhZGVyKGluZm8pCisgICAgICAgIGVsaWYgZm9ybWF0ID09IFBBWF9GT1JNQVQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jcmVhdGVfcGF4X2hlYWRlcihpbmZvLCBlbmNvZGluZywgZXJyb3JzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBmb3JtYXQiKQorCisgICAgZGVmIGNyZWF0ZV91c3Rhcl9oZWFkZXIoc2VsZiwgaW5mbyk6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgdXN0YXIgaGVhZGVyIGJsb2NrLgorICAgICAgICAiIiIKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IFBPU0lYX01BR0lDCisKKyAgICAgICAgaWYgbGVuKGluZm9bImxpbmtuYW1lIl0pID4gTEVOR1RIX0xJTks6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJsaW5rbmFtZSBpcyB0b28gbG9uZyIpCisKKyAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIGluZm9bInByZWZpeCJdLCBpbmZvWyJuYW1lIl0gPSBzZWxmLl9wb3NpeF9zcGxpdF9uYW1lKGluZm9bIm5hbWUiXSkKKworICAgICAgICByZXR1cm4gc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBVU1RBUl9GT1JNQVQpCisKKyAgICBkZWYgY3JlYXRlX2dudV9oZWFkZXIoc2VsZiwgaW5mbyk6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgR05VIGhlYWRlciBibG9jayBzZXF1ZW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBHTlVfTUFHSUMKKworICAgICAgICBidWYgPSAiIgorICAgICAgICBpZiBsZW4oaW5mb1sibGlua25hbWUiXSkgPiBMRU5HVEhfTElOSzoKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bImxpbmtuYW1lIl0sIEdOVVRZUEVfTE9OR0xJTkspCisKKyAgICAgICAgaWYgbGVuKGluZm9bIm5hbWUiXSkgPiBMRU5HVEhfTkFNRToKKyAgICAgICAgICAgIGJ1ZiArPSBzZWxmLl9jcmVhdGVfZ251X2xvbmdfaGVhZGVyKGluZm9bIm5hbWUiXSwgR05VVFlQRV9MT05HTkFNRSkKKworICAgICAgICByZXR1cm4gYnVmICsgc2VsZi5fY3JlYXRlX2hlYWRlcihpbmZvLCBHTlVfRk9STUFUKQorCisgICAgZGVmIGNyZWF0ZV9wYXhfaGVhZGVyKHNlbGYsIGluZm8sIGVuY29kaW5nLCBlcnJvcnMpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG9iamVjdCBhcyBhIHVzdGFyIGhlYWRlciBibG9jay4gSWYgaXQgY2Fubm90IGJlCisgICAgICAgICAgIHJlcHJlc2VudGVkIHRoaXMgd2F5LCBwcmVwZW5kIGEgcGF4IGV4dGVuZGVkIGhlYWRlciBzZXF1ZW5jZQorICAgICAgICAgICB3aXRoIHN1cHBsZW1lbnQgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBpbmZvWyJtYWdpYyJdID0gUE9TSVhfTUFHSUMKKyAgICAgICAgcGF4X2hlYWRlcnMgPSBzZWxmLnBheF9oZWFkZXJzLmNvcHkoKQorCisgICAgICAgICMgVGVzdCBzdHJpbmcgZmllbGRzIGZvciB2YWx1ZXMgdGhhdCBleGNlZWQgdGhlIGZpZWxkIGxlbmd0aCBvciBjYW5ub3QKKyAgICAgICAgIyBiZSByZXByZXNlbnRlZCBpbiBBU0NJSSBlbmNvZGluZy4KKyAgICAgICAgZm9yIG5hbWUsIGhuYW1lLCBsZW5ndGggaW4gKAorICAgICAgICAgICAgICAgICgibmFtZSIsICJwYXRoIiwgTEVOR1RIX05BTUUpLCAoImxpbmtuYW1lIiwgImxpbmtwYXRoIiwgTEVOR1RIX0xJTkspLAorICAgICAgICAgICAgICAgICgidW5hbWUiLCAidW5hbWUiLCAzMiksICgiZ25hbWUiLCAiZ25hbWUiLCAzMikpOgorCisgICAgICAgICAgICBpZiBobmFtZSBpbiBwYXhfaGVhZGVyczoKKyAgICAgICAgICAgICAgICAjIFRoZSBwYXggaGVhZGVyIGhhcyBwcmlvcml0eS4KKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdLmRlY29kZShlbmNvZGluZywgZXJyb3JzKQorCisgICAgICAgICAgICAjIFRyeSB0byBlbmNvZGUgdGhlIHN0cmluZyBhcyBBU0NJSS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWwuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW2huYW1lXSA9IHZhbAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIGxlbihpbmZvW25hbWVdKSA+IGxlbmd0aDoKKyAgICAgICAgICAgICAgICBwYXhfaGVhZGVyc1tobmFtZV0gPSB2YWwKKworICAgICAgICAjIFRlc3QgbnVtYmVyIGZpZWxkcyBmb3IgdmFsdWVzIHRoYXQgZXhjZWVkIHRoZSBmaWVsZCBsaW1pdCBvciB2YWx1ZXMKKyAgICAgICAgIyB0aGF0IGxpa2UgdG8gYmUgc3RvcmVkIGFzIGZsb2F0LgorICAgICAgICBmb3IgbmFtZSwgZGlnaXRzIGluICgoInVpZCIsIDgpLCAoImdpZCIsIDgpLCAoInNpemUiLCAxMiksICgibXRpbWUiLCAxMikpOgorICAgICAgICAgICAgaWYgbmFtZSBpbiBwYXhfaGVhZGVyczoKKyAgICAgICAgICAgICAgICAjIFRoZSBwYXggaGVhZGVyIGhhcyBwcmlvcml0eS4gQXZvaWQgb3ZlcmZsb3cuCisgICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB2YWwgPSBpbmZvW25hbWVdCisgICAgICAgICAgICBpZiBub3QgMCA8PSB2YWwgPCA4ICoqIChkaWdpdHMgLSAxKSBvciBpc2luc3RhbmNlKHZhbCwgZmxvYXQpOgorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzW25hbWVdID0gdW5pY29kZSh2YWwpCisgICAgICAgICAgICAgICAgaW5mb1tuYW1lXSA9IDAKKworICAgICAgICAjIENyZWF0ZSBhIHBheCBleHRlbmRlZCBoZWFkZXIgaWYgbmVjZXNzYXJ5LgorICAgICAgICBpZiBwYXhfaGVhZGVyczoKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuX2NyZWF0ZV9wYXhfZ2VuZXJpY19oZWFkZXIocGF4X2hlYWRlcnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWYgPSAiIgorCisgICAgICAgIHJldHVybiBidWYgKyBzZWxmLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoY2xzLCBwYXhfaGVhZGVycyk6CisgICAgICAgICIiIlJldHVybiB0aGUgb2JqZWN0IGFzIGEgcGF4IGdsb2JhbCBoZWFkZXIgYmxvY2sgc2VxdWVuY2UuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKHBheF9oZWFkZXJzLCB0eXBlPVhHTFRZUEUpCisKKyAgICBkZWYgX3Bvc2l4X3NwbGl0X25hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlNwbGl0IGEgbmFtZSBsb25nZXIgdGhhbiAxMDAgY2hhcnMgaW50byBhIHByZWZpeAorICAgICAgICAgICBhbmQgYSBuYW1lIHBhcnQuCisgICAgICAgICIiIgorICAgICAgICBwcmVmaXggPSBuYW1lWzpMRU5HVEhfUFJFRklYICsgMV0KKyAgICAgICAgd2hpbGUgcHJlZml4IGFuZCBwcmVmaXhbLTFdICE9ICIvIjoKKyAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeFs6LTFdCisKKyAgICAgICAgbmFtZSA9IG5hbWVbbGVuKHByZWZpeCk6XQorICAgICAgICBwcmVmaXggPSBwcmVmaXhbOi0xXQorCisgICAgICAgIGlmIG5vdCBwcmVmaXggb3IgbGVuKG5hbWUpID4gTEVOR1RIX05BTUU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJuYW1lIGlzIHRvbyBsb25nIikKKyAgICAgICAgcmV0dXJuIHByZWZpeCwgbmFtZQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY3JlYXRlX2hlYWRlcihpbmZvLCBmb3JtYXQpOgorICAgICAgICAiIiJSZXR1cm4gYSBoZWFkZXIgYmxvY2suIGluZm8gaXMgYSBkaWN0aW9uYXJ5IHdpdGggZmlsZQorICAgICAgICAgICBpbmZvcm1hdGlvbiwgZm9ybWF0IG11c3QgYmUgb25lIG9mIHRoZSAqX0ZPUk1BVCBjb25zdGFudHMuCisgICAgICAgICIiIgorICAgICAgICBwYXJ0cyA9IFsKKyAgICAgICAgICAgIHN0bihpbmZvLmdldCgibmFtZSIsICIiKSwgMTAwKSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgibW9kZSIsIDApICYgMDc3NzcsIDgsIGZvcm1hdCksCisgICAgICAgICAgICBpdG4oaW5mby5nZXQoInVpZCIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJnaWQiLCAwKSwgOCwgZm9ybWF0KSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgic2l6ZSIsIDApLCAxMiwgZm9ybWF0KSwKKyAgICAgICAgICAgIGl0bihpbmZvLmdldCgibXRpbWUiLCAwKSwgMTIsIGZvcm1hdCksCisgICAgICAgICAgICAiICAgICAgICAiLCAjIGNoZWNrc3VtIGZpZWxkCisgICAgICAgICAgICBpbmZvLmdldCgidHlwZSIsIFJFR1RZUEUpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJsaW5rbmFtZSIsICIiKSwgMTAwKSwKKyAgICAgICAgICAgIHN0bihpbmZvLmdldCgibWFnaWMiLCBQT1NJWF9NQUdJQyksIDgpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJ1bmFtZSIsICIiKSwgMzIpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJnbmFtZSIsICIiKSwgMzIpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtYWpvciIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgaXRuKGluZm8uZ2V0KCJkZXZtaW5vciIsIDApLCA4LCBmb3JtYXQpLAorICAgICAgICAgICAgc3RuKGluZm8uZ2V0KCJwcmVmaXgiLCAiIiksIDE1NSkKKyAgICAgICAgXQorCisgICAgICAgIGJ1ZiA9IHN0cnVjdC5wYWNrKCIlZHMiICUgQkxPQ0tTSVpFLCAiIi5qb2luKHBhcnRzKSkKKyAgICAgICAgY2hrc3VtID0gY2FsY19jaGtzdW1zKGJ1ZlstQkxPQ0tTSVpFOl0pWzBdCisgICAgICAgIGJ1ZiA9IGJ1Zls6LTM2NF0gKyAiJTA2b1wwIiAlIGNoa3N1bSArIGJ1ZlstMzU3Ol0KKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBfY3JlYXRlX3BheWxvYWQocGF5bG9hZCk6CisgICAgICAgICIiIlJldHVybiB0aGUgc3RyaW5nIHBheWxvYWQgZmlsbGVkIHdpdGggemVybyBieXRlcworICAgICAgICAgICB1cCB0byB0aGUgbmV4dCA1MTIgYnl0ZSBib3JkZXIuCisgICAgICAgICIiIgorICAgICAgICBibG9ja3MsIHJlbWFpbmRlciA9IGRpdm1vZChsZW4ocGF5bG9hZCksIEJMT0NLU0laRSkKKyAgICAgICAgaWYgcmVtYWluZGVyID4gMDoKKyAgICAgICAgICAgIHBheWxvYWQgKz0gKEJMT0NLU0laRSAtIHJlbWFpbmRlcikgKiBOVUwKKyAgICAgICAgcmV0dXJuIHBheWxvYWQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfY3JlYXRlX2dudV9sb25nX2hlYWRlcihjbHMsIG5hbWUsIHR5cGUpOgorICAgICAgICAiIiJSZXR1cm4gYSBHTlVUWVBFX0xPTkdOQU1FIG9yIEdOVVRZUEVfTE9OR0xJTksgc2VxdWVuY2UKKyAgICAgICAgICAgZm9yIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBuYW1lICs9IE5VTAorCisgICAgICAgIGluZm8gPSB7fQorICAgICAgICBpbmZvWyJuYW1lIl0gPSAiLi8uL0BMb25nTGluayIKKyAgICAgICAgaW5mb1sidHlwZSJdID0gdHlwZQorICAgICAgICBpbmZvWyJzaXplIl0gPSBsZW4obmFtZSkKKyAgICAgICAgaW5mb1sibWFnaWMiXSA9IEdOVV9NQUdJQworCisgICAgICAgICMgY3JlYXRlIGV4dGVuZGVkIGhlYWRlciArIG5hbWUgYmxvY2tzLgorICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkgKyBcCisgICAgICAgICAgICAgICAgY2xzLl9jcmVhdGVfcGF5bG9hZChuYW1lKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9jcmVhdGVfcGF4X2dlbmVyaWNfaGVhZGVyKGNscywgcGF4X2hlYWRlcnMsIHR5cGU9WEhEVFlQRSk6CisgICAgICAgICIiIlJldHVybiBhIFBPU0lYLjEtMjAwMSBleHRlbmRlZCBvciBnbG9iYWwgaGVhZGVyIHNlcXVlbmNlCisgICAgICAgICAgIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGtleXdvcmQsIHZhbHVlIHBhaXJzLiBUaGUgdmFsdWVzCisgICAgICAgICAgIG11c3QgYmUgdW5pY29kZSBvYmplY3RzLgorICAgICAgICAiIiIKKyAgICAgICAgcmVjb3JkcyA9IFtdCisgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGtleXdvcmQgPSBrZXl3b3JkLmVuY29kZSgidXRmOCIpCisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLmVuY29kZSgidXRmOCIpCisgICAgICAgICAgICBsID0gbGVuKGtleXdvcmQpICsgbGVuKHZhbHVlKSArIDMgICAjICcgJyArICc9JyArICdcbicKKyAgICAgICAgICAgIG4gPSBwID0gMAorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBuID0gbCArIGxlbihzdHIocCkpCisgICAgICAgICAgICAgICAgaWYgbiA9PSBwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHAgPSBuCisgICAgICAgICAgICByZWNvcmRzLmFwcGVuZCgiJWQgJXM9JXNcbiIgJSAocCwga2V5d29yZCwgdmFsdWUpKQorICAgICAgICByZWNvcmRzID0gIiIuam9pbihyZWNvcmRzKQorCisgICAgICAgICMgV2UgdXNlIGEgaGFyZGNvZGVkICIuLy4vQFBheEhlYWRlciIgbmFtZSBsaWtlIHN0YXIgZG9lcworICAgICAgICAjIGluc3RlYWQgb2YgdGhlIG9uZSB0aGF0IFBPU0lYIHJlY29tbWVuZHMuCisgICAgICAgIGluZm8gPSB7fQorICAgICAgICBpbmZvWyJuYW1lIl0gPSAiLi8uL0BQYXhIZWFkZXIiCisgICAgICAgIGluZm9bInR5cGUiXSA9IHR5cGUKKyAgICAgICAgaW5mb1sic2l6ZSJdID0gbGVuKHJlY29yZHMpCisgICAgICAgIGluZm9bIm1hZ2ljIl0gPSBQT1NJWF9NQUdJQworCisgICAgICAgICMgQ3JlYXRlIHBheCBoZWFkZXIgKyByZWNvcmQgYmxvY2tzLgorICAgICAgICByZXR1cm4gY2xzLl9jcmVhdGVfaGVhZGVyKGluZm8sIFVTVEFSX0ZPUk1BVCkgKyBcCisgICAgICAgICAgICAgICAgY2xzLl9jcmVhdGVfcGF5bG9hZChyZWNvcmRzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21idWYoY2xzLCBidWYpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJbmZvIG9iamVjdCBmcm9tIGEgNTEyIGJ5dGUgc3RyaW5nIGJ1ZmZlci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihidWYpID09IDA6CisgICAgICAgICAgICByYWlzZSBFbXB0eUhlYWRlckVycm9yKCJlbXB0eSBoZWFkZXIiKQorICAgICAgICBpZiBsZW4oYnVmKSAhPSBCTE9DS1NJWkU6CisgICAgICAgICAgICByYWlzZSBUcnVuY2F0ZWRIZWFkZXJFcnJvcigidHJ1bmNhdGVkIGhlYWRlciIpCisgICAgICAgIGlmIGJ1Zi5jb3VudChOVUwpID09IEJMT0NLU0laRToKKyAgICAgICAgICAgIHJhaXNlIEVPRkhlYWRlckVycm9yKCJlbmQgb2YgZmlsZSBoZWFkZXIiKQorCisgICAgICAgIGNoa3N1bSA9IG50aShidWZbMTQ4OjE1Nl0pCisgICAgICAgIGlmIGNoa3N1bSBub3QgaW4gY2FsY19jaGtzdW1zKGJ1Zik6CisgICAgICAgICAgICByYWlzZSBJbnZhbGlkSGVhZGVyRXJyb3IoImJhZCBjaGVja3N1bSIpCisKKyAgICAgICAgb2JqID0gY2xzKCkKKyAgICAgICAgb2JqLmJ1ZiA9IGJ1ZgorICAgICAgICBvYmoubmFtZSA9IG50cyhidWZbMDoxMDBdKQorICAgICAgICBvYmoubW9kZSA9IG50aShidWZbMTAwOjEwOF0pCisgICAgICAgIG9iai51aWQgPSBudGkoYnVmWzEwODoxMTZdKQorICAgICAgICBvYmouZ2lkID0gbnRpKGJ1ZlsxMTY6MTI0XSkKKyAgICAgICAgb2JqLnNpemUgPSBudGkoYnVmWzEyNDoxMzZdKQorICAgICAgICBvYmoubXRpbWUgPSBudGkoYnVmWzEzNjoxNDhdKQorICAgICAgICBvYmouY2hrc3VtID0gY2hrc3VtCisgICAgICAgIG9iai50eXBlID0gYnVmWzE1NjoxNTddCisgICAgICAgIG9iai5saW5rbmFtZSA9IG50cyhidWZbMTU3OjI1N10pCisgICAgICAgIG9iai51bmFtZSA9IG50cyhidWZbMjY1OjI5N10pCisgICAgICAgIG9iai5nbmFtZSA9IG50cyhidWZbMjk3OjMyOV0pCisgICAgICAgIG9iai5kZXZtYWpvciA9IG50aShidWZbMzI5OjMzN10pCisgICAgICAgIG9iai5kZXZtaW5vciA9IG50aShidWZbMzM3OjM0NV0pCisgICAgICAgIHByZWZpeCA9IG50cyhidWZbMzQ1OjUwMF0pCisKKyAgICAgICAgIyBPbGQgVjcgdGFyIGZvcm1hdCByZXByZXNlbnRzIGEgZGlyZWN0b3J5IGFzIGEgcmVndWxhcgorICAgICAgICAjIGZpbGUgd2l0aCBhIHRyYWlsaW5nIHNsYXNoLgorICAgICAgICBpZiBvYmoudHlwZSA9PSBBUkVHVFlQRSBhbmQgb2JqLm5hbWUuZW5kc3dpdGgoIi8iKToKKyAgICAgICAgICAgIG9iai50eXBlID0gRElSVFlQRQorCisgICAgICAgICMgUmVtb3ZlIHJlZHVuZGFudCBzbGFzaGVzIGZyb20gZGlyZWN0b3JpZXMuCisgICAgICAgIGlmIG9iai5pc2RpcigpOgorICAgICAgICAgICAgb2JqLm5hbWUgPSBvYmoubmFtZS5yc3RyaXAoIi8iKQorCisgICAgICAgICMgUmVjb25zdHJ1Y3QgYSB1c3RhciBsb25nbmFtZS4KKyAgICAgICAgaWYgcHJlZml4IGFuZCBvYmoudHlwZSBub3QgaW4gR05VX1RZUEVTOgorICAgICAgICAgICAgb2JqLm5hbWUgPSBwcmVmaXggKyAiLyIgKyBvYmoubmFtZQorICAgICAgICByZXR1cm4gb2JqCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbXRhcmZpbGUoY2xzLCB0YXJmaWxlKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBuZXh0IFRhckluZm8gb2JqZWN0IGZyb20gVGFyRmlsZSBvYmplY3QKKyAgICAgICAgICAgdGFyZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKEJMT0NLU0laRSkKKyAgICAgICAgb2JqID0gY2xzLmZyb21idWYoYnVmKQorICAgICAgICBvYmoub2Zmc2V0ID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKSAtIEJMT0NLU0laRQorICAgICAgICByZXR1cm4gb2JqLl9wcm9jX21lbWJlcih0YXJmaWxlKQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUaGUgZm9sbG93aW5nIGFyZSBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgYQorICAgICMgbWVtYmVyLiBUaGUgZW50cnkgcG9pbnQgaXMgX3Byb2NfbWVtYmVyKCkgd2hpY2ggY2FuIGJlIG92ZXJyaWRkZW4gaW4gYQorICAgICMgc3ViY2xhc3MgdG8gYWRkIGN1c3RvbSBfcHJvY18qKCkgbWV0aG9kcy4gQSBfcHJvY18qKCkgbWV0aG9kIE1VU1QKKyAgICAjIGltcGxlbWVudCB0aGUgZm9sbG93aW5nCisgICAgIyBvcGVyYXRpb25zOgorICAgICMgMS4gU2V0IHNlbGYub2Zmc2V0X2RhdGEgdG8gdGhlIHBvc2l0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBiZWdpbiwKKyAgICAjICAgIGlmIHRoZXJlIGlzIGRhdGEgdGhhdCBmb2xsb3dzLgorICAgICMgMi4gU2V0IHRhcmZpbGUub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgbmV4dCBtZW1iZXIncyBoZWFkZXIgd2lsbAorICAgICMgICAgYmVnaW4uCisgICAgIyAzLiBSZXR1cm4gc2VsZiBvciBhbm90aGVyIHZhbGlkIFRhckluZm8gb2JqZWN0LgorICAgIGRlZiBfcHJvY19tZW1iZXIoc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIkNob29zZSB0aGUgcmlnaHQgcHJvY2Vzc2luZyBtZXRob2QgZGVwZW5kaW5nIG9uCisgICAgICAgICAgIHRoZSB0eXBlIGFuZCBjYWxsIGl0LgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi50eXBlIGluIChHTlVUWVBFX0xPTkdOQU1FLCBHTlVUWVBFX0xPTkdMSU5LKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX2dudWxvbmcodGFyZmlsZSkKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgPT0gR05VVFlQRV9TUEFSU0U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19zcGFyc2UodGFyZmlsZSkKKyAgICAgICAgZWxpZiBzZWxmLnR5cGUgaW4gKFhIRFRZUEUsIFhHTFRZUEUsIFNPTEFSSVNfWEhEVFlQRSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJvY19wYXgodGFyZmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcm9jX2J1aWx0aW4odGFyZmlsZSkKKworICAgIGRlZiBfcHJvY19idWlsdGluKHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIGEgYnVpbHRpbiB0eXBlIG9yIGFuIHVua25vd24gdHlwZSB3aGljaAorICAgICAgICAgICB3aWxsIGJlIHRyZWF0ZWQgYXMgYSByZWd1bGFyIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm9mZnNldF9kYXRhID0gdGFyZmlsZS5maWxlb2JqLnRlbGwoKQorICAgICAgICBvZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhCisgICAgICAgIGlmIHNlbGYuaXNyZWcoKSBvciBzZWxmLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgICMgU2tpcCB0aGUgZm9sbG93aW5nIGRhdGEgYmxvY2tzLgorICAgICAgICAgICAgb2Zmc2V0ICs9IHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkKKyAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBvZmZzZXQKKworICAgICAgICAjIFBhdGNoIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoIHNhdmVkIGdsb2JhbAorICAgICAgICAjIGhlYWRlciBpbmZvcm1hdGlvbi4KKyAgICAgICAgc2VsZi5fYXBwbHlfcGF4X2luZm8odGFyZmlsZS5wYXhfaGVhZGVycywgdGFyZmlsZS5lbmNvZGluZywgdGFyZmlsZS5lcnJvcnMpCisKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfcHJvY19nbnVsb25nKHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIHRoZSBibG9ja3MgdGhhdCBob2xkIGEgR05VIGxvbmduYW1lCisgICAgICAgICAgIG9yIGxvbmdsaW5rIG1lbWJlci4KKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHRhcmZpbGUuZmlsZW9iai5yZWFkKHNlbGYuX2Jsb2NrKHNlbGYuc2l6ZSkpCisKKyAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIgYW5kIHByb2Nlc3MgaXQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHQgPSBzZWxmLmZyb210YXJmaWxlKHRhcmZpbGUpCisgICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFN1YnNlcXVlbnRIZWFkZXJFcnJvcigibWlzc2luZyBvciBiYWQgc3Vic2VxdWVudCBoZWFkZXIiKQorCisgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IGZyb20gdGhlIG5leHQgaGVhZGVyIHdpdGgKKyAgICAgICAgIyB0aGUgbG9uZ25hbWUgaW5mb3JtYXRpb24uCisgICAgICAgIG5leHQub2Zmc2V0ID0gc2VsZi5vZmZzZXQKKyAgICAgICAgaWYgc2VsZi50eXBlID09IEdOVVRZUEVfTE9OR05BTUU6CisgICAgICAgICAgICBuZXh0Lm5hbWUgPSBudHMoYnVmKQorICAgICAgICBlbGlmIHNlbGYudHlwZSA9PSBHTlVUWVBFX0xPTkdMSU5LOgorICAgICAgICAgICAgbmV4dC5saW5rbmFtZSA9IG50cyhidWYpCisKKyAgICAgICAgcmV0dXJuIG5leHQKKworICAgIGRlZiBfcHJvY19zcGFyc2Uoc2VsZiwgdGFyZmlsZSk6CisgICAgICAgICIiIlByb2Nlc3MgYSBHTlUgc3BhcnNlIGhlYWRlciBwbHVzIGV4dHJhIGhlYWRlcnMuCisgICAgICAgICIiIgorICAgICAgICBidWYgPSBzZWxmLmJ1ZgorICAgICAgICBzcCA9IF9yaW5nYnVmZmVyKCkKKyAgICAgICAgcG9zID0gMzg2CisgICAgICAgIGxhc3Rwb3MgPSAwTAorICAgICAgICByZWFscG9zID0gMEwKKyAgICAgICAgIyBUaGVyZSBhcmUgNCBwb3NzaWJsZSBzcGFyc2Ugc3RydWN0cyBpbiB0aGUKKyAgICAgICAgIyBmaXJzdCBoZWFkZXIuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSg0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBudGkoYnVmW3Bvczpwb3MgKyAxMl0pCisgICAgICAgICAgICAgICAgbnVtYnl0ZXMgPSBudGkoYnVmW3BvcyArIDEyOnBvcyArIDI0XSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBvZmZzZXQgPiBsYXN0cG9zOgorICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgIHNwLmFwcGVuZChfZGF0YShvZmZzZXQsIG51bWJ5dGVzLCByZWFscG9zKSkKKyAgICAgICAgICAgIHJlYWxwb3MgKz0gbnVtYnl0ZXMKKyAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgcG9zICs9IDI0CisKKyAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNDgyXSkKKyAgICAgICAgb3JpZ3NpemUgPSBudGkoYnVmWzQ4Mzo0OTVdKQorCisgICAgICAgICMgSWYgdGhlIGlzZXh0ZW5kZWQgZmxhZyBpcyBnaXZlbiwKKyAgICAgICAgIyB0aGVyZSBhcmUgZXh0cmEgaGVhZGVycyB0byBwcm9jZXNzLgorICAgICAgICB3aGlsZSBpc2V4dGVuZGVkID09IDE6CisgICAgICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChCTE9DS1NJWkUpCisgICAgICAgICAgICBwb3MgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjEpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gbnRpKGJ1Zltwb3M6cG9zICsgMTJdKQorICAgICAgICAgICAgICAgICAgICBudW1ieXRlcyA9IG50aShidWZbcG9zICsgMTI6cG9zICsgMjRdKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIG9mZnNldCA+IGxhc3Rwb3M6CisgICAgICAgICAgICAgICAgICAgIHNwLmFwcGVuZChfaG9sZShsYXN0cG9zLCBvZmZzZXQgLSBsYXN0cG9zKSkKKyAgICAgICAgICAgICAgICBzcC5hcHBlbmQoX2RhdGEob2Zmc2V0LCBudW1ieXRlcywgcmVhbHBvcykpCisgICAgICAgICAgICAgICAgcmVhbHBvcyArPSBudW1ieXRlcworICAgICAgICAgICAgICAgIGxhc3Rwb3MgPSBvZmZzZXQgKyBudW1ieXRlcworICAgICAgICAgICAgICAgIHBvcyArPSAyNAorICAgICAgICAgICAgaXNleHRlbmRlZCA9IG9yZChidWZbNTA0XSkKKworICAgICAgICBpZiBsYXN0cG9zIDwgb3JpZ3NpemU6CisgICAgICAgICAgICBzcC5hcHBlbmQoX2hvbGUobGFzdHBvcywgb3JpZ3NpemUgLSBsYXN0cG9zKSkKKworICAgICAgICBzZWxmLnNwYXJzZSA9IHNwCisKKyAgICAgICAgc2VsZi5vZmZzZXRfZGF0YSA9IHRhcmZpbGUuZmlsZW9iai50ZWxsKCkKKyAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBzZWxmLm9mZnNldF9kYXRhICsgc2VsZi5fYmxvY2soc2VsZi5zaXplKQorICAgICAgICBzZWxmLnNpemUgPSBvcmlnc2l6ZQorCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX3Byb2NfcGF4KHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJQcm9jZXNzIGFuIGV4dGVuZGVkIG9yIGdsb2JhbCBoZWFkZXIgYXMgZGVzY3JpYmVkIGluCisgICAgICAgICAgIFBPU0lYLjEtMjAwMS4KKyAgICAgICAgIiIiCisgICAgICAgICMgUmVhZCB0aGUgaGVhZGVyIGluZm9ybWF0aW9uLgorICAgICAgICBidWYgPSB0YXJmaWxlLmZpbGVvYmoucmVhZChzZWxmLl9ibG9jayhzZWxmLnNpemUpKQorCisgICAgICAgICMgQSBwYXggaGVhZGVyIHN0b3JlcyBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gZm9yIGVpdGhlcgorICAgICAgICAjIHRoZSBmb2xsb3dpbmcgZmlsZSAoZXh0ZW5kZWQpIG9yIGFsbCBmb2xsb3dpbmcgZmlsZXMKKyAgICAgICAgIyAoZ2xvYmFsKS4KKyAgICAgICAgaWYgc2VsZi50eXBlID09IFhHTFRZUEU6CisgICAgICAgICAgICBwYXhfaGVhZGVycyA9IHRhcmZpbGUucGF4X2hlYWRlcnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBheF9oZWFkZXJzID0gdGFyZmlsZS5wYXhfaGVhZGVycy5jb3B5KCkKKworICAgICAgICAjIFBhcnNlIHBheCBoZWFkZXIgaW5mb3JtYXRpb24uIEEgcmVjb3JkIGxvb2tzIGxpa2UgdGhhdDoKKyAgICAgICAgIyAiJWQgJXM9JXNcbiIgJSAobGVuZ3RoLCBrZXl3b3JkLCB2YWx1ZSkuIGxlbmd0aCBpcyB0aGUgc2l6ZQorICAgICAgICAjIG9mIHRoZSBjb21wbGV0ZSByZWNvcmQgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQgaXRzZWxmIGFuZAorICAgICAgICAjIHRoZSBuZXdsaW5lLiBrZXl3b3JkIGFuZCB2YWx1ZSBhcmUgYm90aCBVVEYtOCBlbmNvZGVkIHN0cmluZ3MuCisgICAgICAgIHJlZ2V4ID0gcmUuY29tcGlsZShyIihcZCspIChbXj1dKyk9IiwgcmUuVSkKKyAgICAgICAgcG9zID0gMAorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgbWF0Y2ggPSByZWdleC5tYXRjaChidWYsIHBvcykKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBsZW5ndGgsIGtleXdvcmQgPSBtYXRjaC5ncm91cHMoKQorICAgICAgICAgICAgbGVuZ3RoID0gaW50KGxlbmd0aCkKKyAgICAgICAgICAgIHZhbHVlID0gYnVmW21hdGNoLmVuZCgyKSArIDE6bWF0Y2guc3RhcnQoMSkgKyBsZW5ndGggLSAxXQorCisgICAgICAgICAgICBrZXl3b3JkID0ga2V5d29yZC5kZWNvZGUoInV0ZjgiKQorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5kZWNvZGUoInV0ZjgiKQorCisgICAgICAgICAgICBwYXhfaGVhZGVyc1trZXl3b3JkXSA9IHZhbHVlCisgICAgICAgICAgICBwb3MgKz0gbGVuZ3RoCisKKyAgICAgICAgIyBGZXRjaCB0aGUgbmV4dCBoZWFkZXIuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5leHQgPSBzZWxmLmZyb210YXJmaWxlKHRhcmZpbGUpCisgICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIFN1YnNlcXVlbnRIZWFkZXJFcnJvcigibWlzc2luZyBvciBiYWQgc3Vic2VxdWVudCBoZWFkZXIiKQorCisgICAgICAgIGlmIHNlbGYudHlwZSBpbiAoWEhEVFlQRSwgU09MQVJJU19YSERUWVBFKToKKyAgICAgICAgICAgICMgUGF0Y2ggdGhlIFRhckluZm8gb2JqZWN0IHdpdGggdGhlIGV4dGVuZGVkIGhlYWRlciBpbmZvLgorICAgICAgICAgICAgbmV4dC5fYXBwbHlfcGF4X2luZm8ocGF4X2hlYWRlcnMsIHRhcmZpbGUuZW5jb2RpbmcsIHRhcmZpbGUuZXJyb3JzKQorICAgICAgICAgICAgbmV4dC5vZmZzZXQgPSBzZWxmLm9mZnNldAorCisgICAgICAgICAgICBpZiAic2l6ZSIgaW4gcGF4X2hlYWRlcnM6CisgICAgICAgICAgICAgICAgIyBJZiB0aGUgZXh0ZW5kZWQgaGVhZGVyIHJlcGxhY2VzIHRoZSBzaXplIGZpZWxkLAorICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byByZWNhbGN1bGF0ZSB0aGUgb2Zmc2V0IHdoZXJlIHRoZSBuZXh0CisgICAgICAgICAgICAgICAgIyBoZWFkZXIgc3RhcnRzLgorICAgICAgICAgICAgICAgIG9mZnNldCA9IG5leHQub2Zmc2V0X2RhdGEKKyAgICAgICAgICAgICAgICBpZiBuZXh0LmlzcmVnKCkgb3IgbmV4dC50eXBlIG5vdCBpbiBTVVBQT1JURURfVFlQRVM6CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBuZXh0Ll9ibG9jayhuZXh0LnNpemUpCisgICAgICAgICAgICAgICAgdGFyZmlsZS5vZmZzZXQgPSBvZmZzZXQKKworICAgICAgICByZXR1cm4gbmV4dAorCisgICAgZGVmIF9hcHBseV9wYXhfaW5mbyhzZWxmLCBwYXhfaGVhZGVycywgZW5jb2RpbmcsIGVycm9ycyk6CisgICAgICAgICIiIlJlcGxhY2UgZmllbGRzIHdpdGggc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIGZyb20gYSBwcmV2aW91cworICAgICAgICAgICBwYXggZXh0ZW5kZWQgb3IgZ2xvYmFsIGhlYWRlci4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBrZXl3b3JkLCB2YWx1ZSBpbiBwYXhfaGVhZGVycy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleXdvcmQgbm90IGluIFBBWF9GSUVMRFM6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYga2V5d29yZCA9PSAicGF0aCI6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yc3RyaXAoIi8iKQorCisgICAgICAgICAgICBpZiBrZXl3b3JkIGluIFBBWF9OVU1CRVJfRklFTERTOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBQQVhfTlVNQkVSX0ZJRUxEU1trZXl3b3JkXSh2YWx1ZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbHVlID0gdXRzKHZhbHVlLCBlbmNvZGluZywgZXJyb3JzKQorCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGtleXdvcmQsIHZhbHVlKQorCisgICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycy5jb3B5KCkKKworICAgIGRlZiBfYmxvY2soc2VsZiwgY291bnQpOgorICAgICAgICAiIiJSb3VuZCB1cCBhIGJ5dGUgY291bnQgYnkgQkxPQ0tTSVpFIGFuZCByZXR1cm4gaXQsCisgICAgICAgICAgIGUuZy4gX2Jsb2NrKDgzNCkgPT4gMTAyNC4KKyAgICAgICAgIiIiCisgICAgICAgIGJsb2NrcywgcmVtYWluZGVyID0gZGl2bW9kKGNvdW50LCBCTE9DS1NJWkUpCisgICAgICAgIGlmIHJlbWFpbmRlcjoKKyAgICAgICAgICAgIGJsb2NrcyArPSAxCisgICAgICAgIHJldHVybiBibG9ja3MgKiBCTE9DS1NJWkUKKworICAgIGRlZiBpc3JlZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSBpbiBSRUdVTEFSX1RZUEVTCisgICAgZGVmIGlzZmlsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXNyZWcoKQorICAgIGRlZiBpc2RpcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBESVJUWVBFCisgICAgZGVmIGlzc3ltKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IFNZTVRZUEUKKyAgICBkZWYgaXNsbmsoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnR5cGUgPT0gTE5LVFlQRQorICAgIGRlZiBpc2NocihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudHlwZSA9PSBDSFJUWVBFCisgICAgZGVmIGlzYmxrKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEJMS1RZUEUKKyAgICBkZWYgaXNmaWZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEZJRk9UWVBFCisgICAgZGVmIGlzc3BhcnNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlID09IEdOVVRZUEVfU1BBUlNFCisgICAgZGVmIGlzZGV2KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50eXBlIGluIChDSFJUWVBFLCBCTEtUWVBFLCBGSUZPVFlQRSkKKyMgY2xhc3MgVGFySW5mbworCitjbGFzcyBUYXJGaWxlKG9iamVjdCk6CisgICAgIiIiVGhlIFRhckZpbGUgQ2xhc3MgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIHRhciBhcmNoaXZlcy4KKyAgICAiIiIKKworICAgIGRlYnVnID0gMCAgICAgICAgICAgICAgICAgICAjIE1heSBiZSBzZXQgZnJvbSAwIChubyBtc2dzKSB0byAzIChhbGwgbXNncykKKworICAgIGRlcmVmZXJlbmNlID0gRmFsc2UgICAgICAgICAjIElmIHRydWUsIGFkZCBjb250ZW50IG9mIGxpbmtlZCBmaWxlIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRhciBmaWxlLCBlbHNlIHRoZSBsaW5rLgorCisgICAgaWdub3JlX3plcm9zID0gRmFsc2UgICAgICAgICMgSWYgdHJ1ZSwgc2tpcHMgZW1wdHkgb3IgaW52YWxpZCBibG9ja3MgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVzIHByb2Nlc3NpbmcuCisKKyAgICBlcnJvcmxldmVsID0gMSAgICAgICAgICAgICAgIyBJZiAwLCBmYXRhbCBlcnJvcnMgb25seSBhcHBlYXIgaW4gZGVidWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBtZXNzYWdlcyAoaWYgZGVidWcgPj0gMCkuIElmID4gMCwgZXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXJlIHBhc3NlZCB0byB0aGUgY2FsbGVyIGFzIGV4Y2VwdGlvbnMuCisKKyAgICBmb3JtYXQgPSBERUZBVUxUX0ZPUk1BVCAgICAgIyBUaGUgZm9ybWF0IHRvIHVzZSB3aGVuIGNyZWF0aW5nIGFuIGFyY2hpdmUuCisKKyAgICBlbmNvZGluZyA9IEVOQ09ESU5HICAgICAgICAgIyBFbmNvZGluZyBmb3IgOC1iaXQgY2hhcmFjdGVyIHN0cmluZ3MuCisKKyAgICBlcnJvcnMgPSBOb25lICAgICAgICAgICAgICAgIyBFcnJvciBoYW5kbGVyIGZvciB1bmljb2RlIGNvbnZlcnNpb24uCisKKyAgICB0YXJpbmZvID0gVGFySW5mbyAgICAgICAgICAgIyBUaGUgZGVmYXVsdCBUYXJJbmZvIGNsYXNzIHRvIHVzZS4KKworICAgIGZpbGVvYmplY3QgPSBFeEZpbGVPYmplY3QgICAjIFRoZSBkZWZhdWx0IEV4RmlsZU9iamVjdCBjbGFzcyB0byB1c2UuCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBmb3JtYXQ9Tm9uZSwKKyAgICAgICAgICAgIHRhcmluZm89Tm9uZSwgZGVyZWZlcmVuY2U9Tm9uZSwgaWdub3JlX3plcm9zPU5vbmUsIGVuY29kaW5nPU5vbmUsCisgICAgICAgICAgICBlcnJvcnM9Tm9uZSwgcGF4X2hlYWRlcnM9Tm9uZSwgZGVidWc9Tm9uZSwgZXJyb3JsZXZlbD1Ob25lKToKKyAgICAgICAgIiIiT3BlbiBhbiAodW5jb21wcmVzc2VkKSB0YXIgYXJjaGl2ZSBgbmFtZScuIGBtb2RlJyBpcyBlaXRoZXIgJ3InIHRvCisgICAgICAgICAgIHJlYWQgZnJvbSBhbiBleGlzdGluZyBhcmNoaXZlLCAnYScgdG8gYXBwZW5kIGRhdGEgdG8gYW4gZXhpc3RpbmcKKyAgICAgICAgICAgZmlsZSBvciAndycgdG8gY3JlYXRlIGEgbmV3IGZpbGUgb3ZlcndyaXRpbmcgYW4gZXhpc3Rpbmcgb25lLiBgbW9kZScKKyAgICAgICAgICAgZGVmYXVsdHMgdG8gJ3InLgorICAgICAgICAgICBJZiBgZmlsZW9iaicgaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyBkYXRhLiBJZiBpdAorICAgICAgICAgICBjYW4gYmUgZGV0ZXJtaW5lZCwgYG1vZGUnIGlzIG92ZXJyaWRkZW4gYnkgYGZpbGVvYmoncyBtb2RlLgorICAgICAgICAgICBgZmlsZW9iaicgaXMgbm90IGNsb3NlZCwgd2hlbiBUYXJGaWxlIGlzIGNsb3NlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIikKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLl9tb2RlID0geyJyIjogInJiIiwgImEiOiAicitiIiwgInciOiAid2IifVttb2RlXQorCisgICAgICAgIGlmIG5vdCBmaWxlb2JqOgorICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJhIiBhbmQgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgICAgICMgQ3JlYXRlIG5vbmV4aXN0ZW50IGZpbGVzIGluIGFwcGVuZCBtb2RlLgorICAgICAgICAgICAgICAgIHNlbGYubW9kZSA9ICJ3IgorICAgICAgICAgICAgICAgIHNlbGYuX21vZGUgPSAid2IiCisgICAgICAgICAgICBmaWxlb2JqID0gYmx0bl9vcGVuKG5hbWUsIHNlbGYuX21vZGUpCisgICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5hbWUgaXMgTm9uZSBhbmQgaGFzYXR0cihmaWxlb2JqLCAibmFtZSIpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBmaWxlb2JqLm5hbWUKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZmlsZW9iaiwgIm1vZGUiKToKKyAgICAgICAgICAgICAgICBzZWxmLl9tb2RlID0gZmlsZW9iai5tb2RlCisgICAgICAgICAgICBzZWxmLl9leHRmaWxlb2JqID0gVHJ1ZQorICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLmFic3BhdGgobmFtZSkgaWYgbmFtZSBlbHNlIE5vbmUKKyAgICAgICAgc2VsZi5maWxlb2JqID0gZmlsZW9iagorCisgICAgICAgICMgSW5pdCBhdHRyaWJ1dGVzLgorICAgICAgICBpZiBmb3JtYXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdAorICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi50YXJpbmZvID0gdGFyaW5mbworICAgICAgICBpZiBkZXJlZmVyZW5jZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZGVyZWZlcmVuY2UgPSBkZXJlZmVyZW5jZQorICAgICAgICBpZiBpZ25vcmVfemVyb3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmlnbm9yZV96ZXJvcyA9IGlnbm9yZV96ZXJvcworICAgICAgICBpZiBlbmNvZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBlbmNvZGluZworCisgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3JzID0gZXJyb3JzCisgICAgICAgIGVsaWYgbW9kZSA9PSAiciI6CisgICAgICAgICAgICBzZWxmLmVycm9ycyA9ICJ1dGYtOCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3JzID0gInN0cmljdCIKKworICAgICAgICBpZiBwYXhfaGVhZGVycyBpcyBub3QgTm9uZSBhbmQgc2VsZi5mb3JtYXQgPT0gUEFYX0ZPUk1BVDoKKyAgICAgICAgICAgIHNlbGYucGF4X2hlYWRlcnMgPSBwYXhfaGVhZGVycworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wYXhfaGVhZGVycyA9IHt9CisKKyAgICAgICAgaWYgZGVidWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmRlYnVnID0gZGVidWcKKyAgICAgICAgaWYgZXJyb3JsZXZlbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZXJyb3JsZXZlbCA9IGVycm9ybGV2ZWwKKworICAgICAgICAjIEluaXQgZGF0YXN0cnVjdHVyZXMuCisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5tZW1iZXJzID0gW10gICAgICAgIyBsaXN0IG9mIG1lbWJlcnMgYXMgVGFySW5mbyBvYmplY3RzCisgICAgICAgIHNlbGYuX2xvYWRlZCA9IEZhbHNlICAgICMgZmxhZyBpZiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZAorICAgICAgICBzZWxmLm9mZnNldCA9IHNlbGYuZmlsZW9iai50ZWxsKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBhcmNoaXZlIGZpbGUKKyAgICAgICAgc2VsZi5pbm9kZXMgPSB7fSAgICAgICAgIyBkaWN0aW9uYXJ5IGNhY2hpbmcgdGhlIGlub2RlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFyY2hpdmUgbWVtYmVycyBhbHJlYWR5IGFkZGVkCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5tb2RlID09ICJyIjoKKyAgICAgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQorICAgICAgICAgICAgICAgIHNlbGYuZmlyc3RtZW1iZXIgPSBzZWxmLm5leHQoKQorCisgICAgICAgICAgICBpZiBzZWxmLm1vZGUgPT0gImEiOgorICAgICAgICAgICAgICAgICMgTW92ZSB0byB0aGUgZW5kIG9mIHRoZSBhcmNoaXZlLAorICAgICAgICAgICAgICAgICMgYmVmb3JlIHRoZSBmaXJzdCBlbXB0eSBibG9jay4KKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyaW5mby5mcm9tdGFyZmlsZShzZWxmKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRU9GSGVhZGVyRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVvYmouc2VlayhzZWxmLm9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBIZWFkZXJFcnJvciwgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJlYWRFcnJvcihzdHIoZSkpCisKKyAgICAgICAgICAgIGlmIHNlbGYubW9kZSBpbiAiYXciOgorICAgICAgICAgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKKworICAgICAgICAgICAgICAgIGlmIHNlbGYucGF4X2hlYWRlcnM6CisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IHNlbGYudGFyaW5mby5jcmVhdGVfcGF4X2dsb2JhbF9oZWFkZXIoc2VsZi5wYXhfaGVhZGVycy5jb3B5KCkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShidWYpCisgICAgICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ICs9IGxlbihidWYpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgX2dldHBvc2l4KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQgPT0gVVNUQVJfRk9STUFUCisgICAgZGVmIF9zZXRwb3NpeChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICB3YXJuaW5ncy53YXJuKCJ1c2UgdGhlIGZvcm1hdCBhdHRyaWJ1dGUgaW5zdGVhZCIsIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAyKQorICAgICAgICBpZiB2YWx1ZToKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0ID0gVVNUQVJfRk9STUFUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IEdOVV9GT1JNQVQKKyAgICBwb3NpeCA9IHByb3BlcnR5KF9nZXRwb3NpeCwgX3NldHBvc2l4KQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBCZWxvdyBhcmUgdGhlIGNsYXNzbWV0aG9kcyB3aGljaCBhY3QgYXMgYWx0ZXJuYXRlIGNvbnN0cnVjdG9ycyB0byB0aGUKKyAgICAjIFRhckZpbGUgY2xhc3MuIFRoZSBvcGVuKCkgbWV0aG9kIGlzIHRoZSBvbmx5IG9uZSB0aGF0IGlzIG5lZWRlZCBmb3IKKyAgICAjIHB1YmxpYyB1c2U7IGl0IGlzIHRoZSAic3VwZXIiLWNvbnN0cnVjdG9yIGFuZCBpcyBhYmxlIHRvIHNlbGVjdCBhbgorICAgICMgYWRlcXVhdGUgInN1YiItY29uc3RydWN0b3IgZm9yIGEgcGFydGljdWxhciBjb21wcmVzc2lvbiB1c2luZyB0aGUgbWFwcGluZworICAgICMgZnJvbSBPUEVOX01FVEguCisgICAgIworICAgICMgVGhpcyBjb25jZXB0IGFsbG93cyBvbmUgdG8gc3ViY2xhc3MgVGFyRmlsZSB3aXRob3V0IGxvc2luZyB0aGUgY29tZm9ydCBvZgorICAgICMgdGhlIHN1cGVyLWNvbnN0cnVjdG9yLiBBIHN1Yi1jb25zdHJ1Y3RvciBpcyByZWdpc3RlcmVkIGFuZCBtYWRlIGF2YWlsYWJsZQorICAgICMgYnkgYWRkaW5nIGl0IHRvIHRoZSBtYXBwaW5nIGluIE9QRU5fTUVUSC4KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBvcGVuKGNscywgbmFtZT1Ob25lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBidWZzaXplPVJFQ09SRFNJWkUsICoqa3dhcmdzKToKKyAgICAgICAgIiIiT3BlbiBhIHRhciBhcmNoaXZlIGZvciByZWFkaW5nLCB3cml0aW5nIG9yIGFwcGVuZGluZy4gUmV0dXJuCisgICAgICAgICAgIGFuIGFwcHJvcHJpYXRlIFRhckZpbGUgY2xhc3MuCisKKyAgICAgICAgICAgbW9kZToKKyAgICAgICAgICAgJ3InIG9yICdyOionIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCB0cmFuc3BhcmVudCBjb21wcmVzc2lvbgorICAgICAgICAgICAncjonICAgICAgICAgb3BlbiBmb3IgcmVhZGluZyBleGNsdXNpdmVseSB1bmNvbXByZXNzZWQKKyAgICAgICAgICAgJ3I6Z3onICAgICAgIG9wZW4gZm9yIHJlYWRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uCisgICAgICAgICAgICdyOmJ6MicgICAgICBvcGVuIGZvciByZWFkaW5nIHdpdGggYnppcDIgY29tcHJlc3Npb24KKyAgICAgICAgICAgJ2EnIG9yICdhOicgIG9wZW4gZm9yIGFwcGVuZGluZywgY3JlYXRpbmcgdGhlIGZpbGUgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICd3JyBvciAndzonICBvcGVuIGZvciB3cml0aW5nIHdpdGhvdXQgY29tcHJlc3Npb24KKyAgICAgICAgICAgJ3c6Z3onICAgICAgIG9wZW4gZm9yIHdyaXRpbmcgd2l0aCBnemlwIGNvbXByZXNzaW9uCisgICAgICAgICAgICd3OmJ6MicgICAgICBvcGVuIGZvciB3cml0aW5nIHdpdGggYnppcDIgY29tcHJlc3Npb24KKworICAgICAgICAgICAncnwqJyAgICAgICAgb3BlbiBhIHN0cmVhbSBvZiB0YXIgYmxvY2tzIHdpdGggdHJhbnNwYXJlbnQgY29tcHJlc3Npb24KKyAgICAgICAgICAgJ3J8JyAgICAgICAgIG9wZW4gYW4gdW5jb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzIGZvciByZWFkaW5nCisgICAgICAgICAgICdyfGd6JyAgICAgICBvcGVuIGEgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbSBvZiB0YXIgYmxvY2tzCisgICAgICAgICAgICdyfGJ6MicgICAgICBvcGVuIGEgYnppcDIgY29tcHJlc3NlZCBzdHJlYW0gb2YgdGFyIGJsb2NrcworICAgICAgICAgICAnd3wnICAgICAgICAgb3BlbiBhbiB1bmNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCisgICAgICAgICAgICd3fGd6JyAgICAgICBvcGVuIGEgZ3ppcCBjb21wcmVzc2VkIHN0cmVhbSBmb3Igd3JpdGluZworICAgICAgICAgICAnd3xiejInICAgICAgb3BlbiBhIGJ6aXAyIGNvbXByZXNzZWQgc3RyZWFtIGZvciB3cml0aW5nCisgICAgICAgICIiIgorCisgICAgICAgIGlmIG5vdCBuYW1lIGFuZCBub3QgZmlsZW9iajoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdGhpbmcgdG8gb3BlbiIpCisKKyAgICAgICAgaWYgbW9kZSBpbiAoInIiLCAicjoqIik6CisgICAgICAgICAgICAjIEZpbmQgb3V0IHdoaWNoICpvcGVuKCkgaXMgYXBwcm9wcmlhdGUgZm9yIG9wZW5pbmcgdGhlIGZpbGUuCisgICAgICAgICAgICBmb3IgY29tcHR5cGUgaW4gY2xzLk9QRU5fTUVUSDoKKyAgICAgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihjbHMsIGNscy5PUEVOX01FVEhbY29tcHR5cGVdKQorICAgICAgICAgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNhdmVkX3BvcyA9IGZpbGVvYmoudGVsbCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuYyhuYW1lLCAiciIsIGZpbGVvYmosICoqa3dhcmdzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoUmVhZEVycm9yLCBDb21wcmVzc2lvbkVycm9yKSwgZToKKyAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlayhzYXZlZF9wb3MpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoImZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBzdWNjZXNzZnVsbHkiKQorCisgICAgICAgIGVsaWYgIjoiIGluIG1vZGU6CisgICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCI6IiwgMSkKKyAgICAgICAgICAgIGZpbGVtb2RlID0gZmlsZW1vZGUgb3IgInIiCisgICAgICAgICAgICBjb21wdHlwZSA9IGNvbXB0eXBlIG9yICJ0YXIiCisKKyAgICAgICAgICAgICMgU2VsZWN0IHRoZSAqb3BlbigpIGZ1bmN0aW9uIGFjY29yZGluZyB0bworICAgICAgICAgICAgIyBnaXZlbiBjb21wcmVzc2lvbi4KKyAgICAgICAgICAgIGlmIGNvbXB0eXBlIGluIGNscy5PUEVOX01FVEg6CisgICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoY2xzLCBjbHMuT1BFTl9NRVRIW2NvbXB0eXBlXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigidW5rbm93biBjb21wcmVzc2lvbiB0eXBlICVyIiAlIGNvbXB0eXBlKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMobmFtZSwgZmlsZW1vZGUsIGZpbGVvYmosICoqa3dhcmdzKQorCisgICAgICAgIGVsaWYgInwiIGluIG1vZGU6CisgICAgICAgICAgICBmaWxlbW9kZSwgY29tcHR5cGUgPSBtb2RlLnNwbGl0KCJ8IiwgMSkKKyAgICAgICAgICAgIGZpbGVtb2RlID0gZmlsZW1vZGUgb3IgInIiCisgICAgICAgICAgICBjb21wdHlwZSA9IGNvbXB0eXBlIG9yICJ0YXIiCisKKyAgICAgICAgICAgIGlmIGZpbGVtb2RlIG5vdCBpbiAicnciOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnIikKKworICAgICAgICAgICAgdCA9IGNscyhuYW1lLCBmaWxlbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgX1N0cmVhbShuYW1lLCBmaWxlbW9kZSwgY29tcHR5cGUsIGZpbGVvYmosIGJ1ZnNpemUpLAorICAgICAgICAgICAgICAgICAgICAqKmt3YXJncykKKyAgICAgICAgICAgIHQuX2V4dGZpbGVvYmogPSBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIHQKKworICAgICAgICBlbGlmIG1vZGUgaW4gImF3IjoKKyAgICAgICAgICAgIHJldHVybiBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKKworICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmRpc2Nlcm5pYmxlIG1vZGUiKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHRhcm9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgICIiIk9wZW4gdW5jb21wcmVzc2VkIHRhciBhcmNoaXZlIG5hbWUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJhdyI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InLCAnYScgb3IgJ3cnIikKKyAgICAgICAgcmV0dXJuIGNscyhuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBnem9wZW4oY2xzLCBuYW1lLCBtb2RlPSJyIiwgZmlsZW9iaj1Ob25lLCBjb21wcmVzc2xldmVsPTksICoqa3dhcmdzKToKKyAgICAgICAgIiIiT3BlbiBnemlwIGNvbXByZXNzZWQgdGFyIGFyY2hpdmUgbmFtZSBmb3IgcmVhZGluZyBvciB3cml0aW5nLgorICAgICAgICAgICBBcHBlbmRpbmcgaXMgbm90IGFsbG93ZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBsZW4obW9kZSkgPiAxIG9yIG1vZGUgbm90IGluICJydyI6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJtb2RlIG11c3QgYmUgJ3InIG9yICd3JyIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGd6aXAKKyAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUKKyAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgcmFpc2UgQ29tcHJlc3Npb25FcnJvcigiZ3ppcCBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIpCisKKyAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgZmlsZW9iaiA9IGJsdG5fb3BlbihuYW1lLCBtb2RlICsgImIiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQgPSBjbHMudGFyb3BlbihuYW1lLCBtb2RlLAorICAgICAgICAgICAgICAgIGd6aXAuR3ppcEZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbCwgZmlsZW9iaiksCisgICAgICAgICAgICAgICAgKiprd2FyZ3MpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJub3QgYSBnemlwIGZpbGUiKQorICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIHQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBiejJvcGVuKGNscywgbmFtZSwgbW9kZT0iciIsIGZpbGVvYmo9Tm9uZSwgY29tcHJlc3NsZXZlbD05LCAqKmt3YXJncyk6CisgICAgICAgICIiIk9wZW4gYnppcDIgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSBuYW1lIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuCisgICAgICAgICAgIEFwcGVuZGluZyBpcyBub3QgYWxsb3dlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxlbihtb2RlKSA+IDEgb3IgbW9kZSBub3QgaW4gInJ3IjoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm1vZGUgbXVzdCBiZSAncicgb3IgJ3cnLiIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGJ6MgorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByYWlzZSBDb21wcmVzc2lvbkVycm9yKCJiejIgbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUiKQorCisgICAgICAgIGlmIGZpbGVvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmaWxlb2JqID0gX0JaMlByb3h5KGZpbGVvYmosIG1vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlb2JqID0gYnoyLkJaMkZpbGUobmFtZSwgbW9kZSwgY29tcHJlc3NsZXZlbD1jb21wcmVzc2xldmVsKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQgPSBjbHMudGFyb3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqLCAqKmt3YXJncykKKyAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBFT0ZFcnJvcik6CisgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3IoIm5vdCBhIGJ6aXAyIGZpbGUiKQorICAgICAgICB0Ll9leHRmaWxlb2JqID0gRmFsc2UKKyAgICAgICAgcmV0dXJuIHQKKworICAgICMgQWxsICpvcGVuKCkgbWV0aG9kcyBhcmUgcmVnaXN0ZXJlZCBoZXJlLgorICAgIE9QRU5fTUVUSCA9IHsKKyAgICAgICAgInRhciI6ICJ0YXJvcGVuIiwgICAjIHVuY29tcHJlc3NlZCB0YXIKKyAgICAgICAgImd6IjogICJnem9wZW4iLCAgICAjIGd6aXAgY29tcHJlc3NlZCB0YXIKKyAgICAgICAgImJ6MiI6ICJiejJvcGVuIiAgICAjIGJ6aXAyIGNvbXByZXNzZWQgdGFyCisgICAgfQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIyBUaGUgcHVibGljIG1ldGhvZHMgd2hpY2ggVGFyRmlsZSBwcm92aWRlczoKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIFRhckZpbGUuIEluIHdyaXRlLW1vZGUsIHR3byBmaW5pc2hpbmcgemVybyBibG9ja3MgYXJlCisgICAgICAgICAgIGFwcGVuZGVkIHRvIHRoZSBhcmNoaXZlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLm1vZGUgaW4gImF3IjoKKyAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoQkxPQ0tTSVpFICogMikpCisgICAgICAgICAgICBzZWxmLm9mZnNldCArPSAoQkxPQ0tTSVpFICogMikKKyAgICAgICAgICAgICMgZmlsbCB1cCB0aGUgZW5kIHdpdGggemVyby1ibG9ja3MKKyAgICAgICAgICAgICMgKGxpa2Ugb3B0aW9uIC1iMjAgZm9yIHRhciBkb2VzKQorICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2Qoc2VsZi5vZmZzZXQsIFJFQ09SRFNJWkUpCisgICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoUkVDT1JEU0laRSAtIHJlbWFpbmRlcikpCisKKyAgICAgICAgaWYgbm90IHNlbGYuX2V4dGZpbGVvYmo6CisgICAgICAgICAgICBzZWxmLmZpbGVvYmouY2xvc2UoKQorICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKworICAgIGRlZiBnZXRtZW1iZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIFRhckluZm8gb2JqZWN0IGZvciBtZW1iZXIgYG5hbWUnLiBJZiBgbmFtZScgY2FuIG5vdCBiZQorICAgICAgICAgICBmb3VuZCBpbiB0aGUgYXJjaGl2ZSwgS2V5RXJyb3IgaXMgcmFpc2VkLiBJZiBhIG1lbWJlciBvY2N1cnMgbW9yZQorICAgICAgICAgICB0aGFuIG9uY2UgaW4gdGhlIGFyY2hpdmUsIGl0cyBsYXN0IG9jY3VycmVuY2UgaXMgYXNzdW1lZCB0byBiZSB0aGUKKyAgICAgICAgICAgbW9zdCB1cC10by1kYXRlIHZlcnNpb24uCisgICAgICAgICIiIgorICAgICAgICB0YXJpbmZvID0gc2VsZi5fZ2V0bWVtYmVyKG5hbWUpCisgICAgICAgIGlmIHRhcmluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJmaWxlbmFtZSAlciBub3QgZm91bmQiICUgbmFtZSkKKyAgICAgICAgcmV0dXJuIHRhcmluZm8KKworICAgIGRlZiBnZXRtZW1iZXJzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIFRhckluZm8gb2JqZWN0cy4gVGhlCisgICAgICAgICAgIGxpc3QgaGFzIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBtZW1iZXJzIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2soKQorICAgICAgICBpZiBub3Qgc2VsZi5fbG9hZGVkOiAgICAjIGlmIHdlIHdhbnQgdG8gb2J0YWluIGEgbGlzdCBvZgorICAgICAgICAgICAgc2VsZi5fbG9hZCgpICAgICAgICAjIGFsbCBtZW1iZXJzLCB3ZSBmaXJzdCBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2NhbiB0aGUgd2hvbGUgYXJjaGl2ZS4KKyAgICAgICAgcmV0dXJuIHNlbGYubWVtYmVycworCisgICAgZGVmIGdldG5hbWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG1lbWJlcnMgb2YgdGhlIGFyY2hpdmUgYXMgYSBsaXN0IG9mIHRoZWlyIG5hbWVzLiBJdCBoYXMKKyAgICAgICAgICAgdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGxpc3QgcmV0dXJuZWQgYnkgZ2V0bWVtYmVycygpLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFt0YXJpbmZvLm5hbWUgZm9yIHRhcmluZm8gaW4gc2VsZi5nZXRtZW1iZXJzKCldCisKKyAgICBkZWYgZ2V0dGFyaW5mbyhzZWxmLCBuYW1lPU5vbmUsIGFyY25hbWU9Tm9uZSwgZmlsZW9iaj1Ob25lKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgVGFySW5mbyBvYmplY3QgZm9yIGVpdGhlciB0aGUgZmlsZSBgbmFtZScgb3IgdGhlIGZpbGUKKyAgICAgICAgICAgb2JqZWN0IGBmaWxlb2JqJyAodXNpbmcgb3MuZnN0YXQgb24gaXRzIGZpbGUgZGVzY3JpcHRvcikuIFlvdSBjYW4KKyAgICAgICAgICAgbW9kaWZ5IHNvbWUgb2YgdGhlIFRhckluZm8ncyBhdHRyaWJ1dGVzIGJlZm9yZSB5b3UgYWRkIGl0IHVzaW5nCisgICAgICAgICAgIGFkZGZpbGUoKS4gSWYgZ2l2ZW4sIGBhcmNuYW1lJyBzcGVjaWZpZXMgYW4gYWx0ZXJuYXRpdmUgbmFtZSBmb3IgdGhlCisgICAgICAgICAgIGZpbGUgaW4gdGhlIGFyY2hpdmUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygiYXciKQorCisgICAgICAgICMgV2hlbiBmaWxlb2JqIGlzIGdpdmVuLCByZXBsYWNlIG5hbWUgYnkKKyAgICAgICAgIyBmaWxlb2JqJ3MgcmVhbCBuYW1lLgorICAgICAgICBpZiBmaWxlb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmFtZSA9IGZpbGVvYmoubmFtZQorCisgICAgICAgICMgQnVpbGRpbmcgdGhlIG5hbWUgb2YgdGhlIG1lbWJlciBpbiB0aGUgYXJjaGl2ZS4KKyAgICAgICAgIyBCYWNrd2FyZCBzbGFzaGVzIGFyZSBjb252ZXJ0ZWQgdG8gZm9yd2FyZCBzbGFzaGVzLAorICAgICAgICAjIEFic29sdXRlIHBhdGhzIGFyZSB0dXJuZWQgdG8gcmVsYXRpdmUgcGF0aHMuCisgICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGFyY25hbWUgPSBuYW1lCisgICAgICAgIGRydiwgYXJjbmFtZSA9IG9zLnBhdGguc3BsaXRkcml2ZShhcmNuYW1lKQorICAgICAgICBhcmNuYW1lID0gYXJjbmFtZS5yZXBsYWNlKG9zLnNlcCwgIi8iKQorICAgICAgICBhcmNuYW1lID0gYXJjbmFtZS5sc3RyaXAoIi8iKQorCisgICAgICAgICMgTm93LCBmaWxsIHRoZSBUYXJJbmZvIG9iamVjdCB3aXRoCisgICAgICAgICMgaW5mb3JtYXRpb24gc3BlY2lmaWMgZm9yIHRoZSBmaWxlLgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJpbmZvKCkKKyAgICAgICAgdGFyaW5mby50YXJmaWxlID0gc2VsZgorCisgICAgICAgICMgVXNlIG9zLnN0YXQgb3Igb3MubHN0YXQsIGRlcGVuZGluZyBvbiBwbGF0Zm9ybQorICAgICAgICAjIGFuZCBpZiBzeW1saW5rcyBzaGFsbCBiZSByZXNvbHZlZC4KKyAgICAgICAgaWYgZmlsZW9iaiBpcyBOb25lOgorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgImxzdGF0IikgYW5kIG5vdCBzZWxmLmRlcmVmZXJlbmNlOgorICAgICAgICAgICAgICAgIHN0YXRyZXMgPSBvcy5sc3RhdChuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGF0cmVzID0gb3Muc3RhdChuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhdHJlcyA9IG9zLmZzdGF0KGZpbGVvYmouZmlsZW5vKCkpCisgICAgICAgIGxpbmtuYW1lID0gIiIKKworICAgICAgICBzdG1kID0gc3RhdHJlcy5zdF9tb2RlCisgICAgICAgIGlmIHN0YXQuU19JU1JFRyhzdG1kKToKKyAgICAgICAgICAgIGlub2RlID0gKHN0YXRyZXMuc3RfaW5vLCBzdGF0cmVzLnN0X2RldikKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRlcmVmZXJlbmNlIGFuZCBzdGF0cmVzLnN0X25saW5rID4gMSBhbmQgXAorICAgICAgICAgICAgICAgICAgICBpbm9kZSBpbiBzZWxmLmlub2RlcyBhbmQgYXJjbmFtZSAhPSBzZWxmLmlub2Rlc1tpbm9kZV06CisgICAgICAgICAgICAgICAgIyBJcyBpdCBhIGhhcmRsaW5rIHRvIGFuIGFscmVhZHkKKyAgICAgICAgICAgICAgICAjIGFyY2hpdmVkIGZpbGU/CisgICAgICAgICAgICAgICAgdHlwZSA9IExOS1RZUEUKKyAgICAgICAgICAgICAgICBsaW5rbmFtZSA9IHNlbGYuaW5vZGVzW2lub2RlXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFRoZSBpbm9kZSBpcyBhZGRlZCBvbmx5IGlmIGl0cyB2YWxpZC4KKyAgICAgICAgICAgICAgICAjIEZvciB3aW4zMiBpdCBpcyBhbHdheXMgMC4KKyAgICAgICAgICAgICAgICB0eXBlID0gUkVHVFlQRQorICAgICAgICAgICAgICAgIGlmIGlub2RlWzBdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmlub2Rlc1tpbm9kZV0gPSBhcmNuYW1lCisgICAgICAgIGVsaWYgc3RhdC5TX0lTRElSKHN0bWQpOgorICAgICAgICAgICAgdHlwZSA9IERJUlRZUEUKKyAgICAgICAgZWxpZiBzdGF0LlNfSVNGSUZPKHN0bWQpOgorICAgICAgICAgICAgdHlwZSA9IEZJRk9UWVBFCisgICAgICAgIGVsaWYgc3RhdC5TX0lTTE5LKHN0bWQpOgorICAgICAgICAgICAgdHlwZSA9IFNZTVRZUEUKKyAgICAgICAgICAgIGxpbmtuYW1lID0gb3MucmVhZGxpbmsobmFtZSkKKyAgICAgICAgZWxpZiBzdGF0LlNfSVNDSFIoc3RtZCk6CisgICAgICAgICAgICB0eXBlID0gQ0hSVFlQRQorICAgICAgICBlbGlmIHN0YXQuU19JU0JMSyhzdG1kKToKKyAgICAgICAgICAgIHR5cGUgPSBCTEtUWVBFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgRmlsbCB0aGUgVGFySW5mbyBvYmplY3Qgd2l0aCBhbGwKKyAgICAgICAgIyBpbmZvcm1hdGlvbiB3ZSBjYW4gZ2V0LgorICAgICAgICB0YXJpbmZvLm5hbWUgPSBhcmNuYW1lCisgICAgICAgIHRhcmluZm8ubW9kZSA9IHN0bWQKKyAgICAgICAgdGFyaW5mby51aWQgPSBzdGF0cmVzLnN0X3VpZAorICAgICAgICB0YXJpbmZvLmdpZCA9IHN0YXRyZXMuc3RfZ2lkCisgICAgICAgIGlmIHR5cGUgPT0gUkVHVFlQRToKKyAgICAgICAgICAgIHRhcmluZm8uc2l6ZSA9IHN0YXRyZXMuc3Rfc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyaW5mby5zaXplID0gMEwKKyAgICAgICAgdGFyaW5mby5tdGltZSA9IHN0YXRyZXMuc3RfbXRpbWUKKyAgICAgICAgdGFyaW5mby50eXBlID0gdHlwZQorICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGlua25hbWUKKyAgICAgICAgaWYgcHdkOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhcmluZm8udW5hbWUgPSBwd2QuZ2V0cHd1aWQodGFyaW5mby51aWQpWzBdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBpZiBncnA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSA9IGdycC5nZXRncmdpZCh0YXJpbmZvLmdpZClbMF0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgaWYgdHlwZSBpbiAoQ0hSVFlQRSwgQkxLVFlQRSk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWFqb3IiKSBhbmQgaGFzYXR0cihvcywgIm1pbm9yIik6CisgICAgICAgICAgICAgICAgdGFyaW5mby5kZXZtYWpvciA9IG9zLm1ham9yKHN0YXRyZXMuc3RfcmRldikKKyAgICAgICAgICAgICAgICB0YXJpbmZvLmRldm1pbm9yID0gb3MubWlub3Ioc3RhdHJlcy5zdF9yZGV2KQorICAgICAgICByZXR1cm4gdGFyaW5mbworCisgICAgZGVmIGxpc3Qoc2VsZiwgdmVyYm9zZT1UcnVlKToKKyAgICAgICAgIiIiUHJpbnQgYSB0YWJsZSBvZiBjb250ZW50cyB0byBzeXMuc3Rkb3V0LiBJZiBgdmVyYm9zZScgaXMgRmFsc2UsIG9ubHkKKyAgICAgICAgICAgdGhlIG5hbWVzIG9mIHRoZSBtZW1iZXJzIGFyZSBwcmludGVkLiBJZiBpdCBpcyBUcnVlLCBhbiBgbHMgLWwnLWxpa2UKKyAgICAgICAgICAgb3V0cHV0IGlzIHByb2R1Y2VkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2soKQorCisgICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGY6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50IGZpbGVtb2RlKHRhcmluZm8ubW9kZSksCisgICAgICAgICAgICAgICAgcHJpbnQgIiVzLyVzIiAlICh0YXJpbmZvLnVuYW1lIG9yIHRhcmluZm8udWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyaW5mby5nbmFtZSBvciB0YXJpbmZvLmdpZCksCisgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc2NocigpIG9yIHRhcmluZm8uaXNibGsoKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiUxMHMiICUgKCIlZCwlZCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAodGFyaW5mby5kZXZtYWpvciwgdGFyaW5mby5kZXZtaW5vcikpLAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIlMTBkIiAlIHRhcmluZm8uc2l6ZSwKKyAgICAgICAgICAgICAgICBwcmludCAiJWQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiBcCisgICAgICAgICAgICAgICAgICAgICAgJSB0aW1lLmxvY2FsdGltZSh0YXJpbmZvLm10aW1lKVs6Nl0sCisKKyAgICAgICAgICAgIHByaW50IHRhcmluZm8ubmFtZSArICgiLyIgaWYgdGFyaW5mby5pc2RpcigpIGVsc2UgIiIpLAorCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIi0+IiwgdGFyaW5mby5saW5rbmFtZSwKKyAgICAgICAgICAgICAgICBpZiB0YXJpbmZvLmlzbG5rKCk6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJsaW5rIHRvIiwgdGFyaW5mby5saW5rbmFtZSwKKyAgICAgICAgICAgIHByaW50CisKKyAgICBkZWYgYWRkKHNlbGYsIG5hbWUsIGFyY25hbWU9Tm9uZSwgcmVjdXJzaXZlPVRydWUsIGV4Y2x1ZGU9Tm9uZSwgZmlsdGVyPU5vbmUpOgorICAgICAgICAiIiJBZGQgdGhlIGZpbGUgYG5hbWUnIHRvIHRoZSBhcmNoaXZlLiBgbmFtZScgbWF5IGJlIGFueSB0eXBlIG9mIGZpbGUKKyAgICAgICAgICAgKGRpcmVjdG9yeSwgZmlmbywgc3ltYm9saWMgbGluaywgZXRjLikuIElmIGdpdmVuLCBgYXJjbmFtZScKKyAgICAgICAgICAgc3BlY2lmaWVzIGFuIGFsdGVybmF0aXZlIG5hbWUgZm9yIHRoZSBmaWxlIGluIHRoZSBhcmNoaXZlLgorICAgICAgICAgICBEaXJlY3RvcmllcyBhcmUgYWRkZWQgcmVjdXJzaXZlbHkgYnkgZGVmYXVsdC4gVGhpcyBjYW4gYmUgYXZvaWRlZCBieQorICAgICAgICAgICBzZXR0aW5nIGByZWN1cnNpdmUnIHRvIEZhbHNlLiBgZXhjbHVkZScgaXMgYSBmdW5jdGlvbiB0aGF0IHNob3VsZAorICAgICAgICAgICByZXR1cm4gVHJ1ZSBmb3IgZWFjaCBmaWxlbmFtZSB0byBiZSBleGNsdWRlZC4gYGZpbHRlcicgaXMgYSBmdW5jdGlvbgorICAgICAgICAgICB0aGF0IGV4cGVjdHMgYSBUYXJJbmZvIG9iamVjdCBhcmd1bWVudCBhbmQgcmV0dXJucyB0aGUgY2hhbmdlZAorICAgICAgICAgICBUYXJJbmZvIG9iamVjdCwgaWYgaXQgcmV0dXJucyBOb25lIHRoZSBUYXJJbmZvIG9iamVjdCB3aWxsIGJlCisgICAgICAgICAgIGV4Y2x1ZGVkIGZyb20gdGhlIGFyY2hpdmUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygiYXciKQorCisgICAgICAgIGlmIGFyY25hbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGFyY25hbWUgPSBuYW1lCisKKyAgICAgICAgIyBFeGNsdWRlIHBhdGhuYW1lcy4KKyAgICAgICAgaWYgZXhjbHVkZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCB3YXJuaW5ncworICAgICAgICAgICAgd2FybmluZ3Mud2FybigidXNlIHRoZSBmaWx0ZXIgYXJndW1lbnQgaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICAgICAgICAgIGlmIGV4Y2x1ZGUobmFtZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICJ0YXJmaWxlOiBFeGNsdWRlZCAlciIgJSBuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgU2tpcCBpZiBzb21lYm9keSB0cmllcyB0byBhcmNoaXZlIHRoZSBhcmNoaXZlLi4uCisgICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZSBhbmQgb3MucGF0aC5hYnNwYXRoKG5hbWUpID09IHNlbGYubmFtZToKKyAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogU2tpcHBlZCAlciIgJSBuYW1lKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgc2VsZi5fZGJnKDEsIG5hbWUpCisKKyAgICAgICAgIyBDcmVhdGUgYSBUYXJJbmZvIG9iamVjdCBmcm9tIHRoZSBmaWxlLgorICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXR0YXJpbmZvKG5hbWUsIGFyY25hbWUpCisKKyAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBVbnN1cHBvcnRlZCB0eXBlICVyIiAlIG5hbWUpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIENoYW5nZSBvciBleGNsdWRlIHRoZSBUYXJJbmZvIG9iamVjdC4KKyAgICAgICAgaWYgZmlsdGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdGFyaW5mbyA9IGZpbHRlcih0YXJpbmZvKQorICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAidGFyZmlsZTogRXhjbHVkZWQgJXIiICUgbmFtZSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIEFwcGVuZCB0aGUgdGFyIGhlYWRlciBhbmQgZGF0YSB0byB0aGUgYXJjaGl2ZS4KKyAgICAgICAgaWYgdGFyaW5mby5pc3JlZygpOgorICAgICAgICAgICAgd2l0aCBibHRuX29wZW4obmFtZSwgInJiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbywgZikKKworICAgICAgICBlbGlmIHRhcmluZm8uaXNkaXIoKToKKyAgICAgICAgICAgIHNlbGYuYWRkZmlsZSh0YXJpbmZvKQorICAgICAgICAgICAgaWYgcmVjdXJzaXZlOgorICAgICAgICAgICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIobmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKG9zLnBhdGguam9pbihuYW1lLCBmKSwgb3MucGF0aC5qb2luKGFyY25hbWUsIGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZSwgZXhjbHVkZSwgZmlsdGVyKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFkZGZpbGUodGFyaW5mbykKKworICAgIGRlZiBhZGRmaWxlKHNlbGYsIHRhcmluZm8sIGZpbGVvYmo9Tm9uZSk6CisgICAgICAgICIiIkFkZCB0aGUgVGFySW5mbyBvYmplY3QgYHRhcmluZm8nIHRvIHRoZSBhcmNoaXZlLiBJZiBgZmlsZW9iaicgaXMKKyAgICAgICAgICAgZ2l2ZW4sIHRhcmluZm8uc2l6ZSBieXRlcyBhcmUgcmVhZCBmcm9tIGl0IGFuZCBhZGRlZCB0byB0aGUgYXJjaGl2ZS4KKyAgICAgICAgICAgWW91IGNhbiBjcmVhdGUgVGFySW5mbyBvYmplY3RzIHVzaW5nIGdldHRhcmluZm8oKS4KKyAgICAgICAgICAgT24gV2luZG93cyBwbGF0Zm9ybXMsIGBmaWxlb2JqJyBzaG91bGQgYWx3YXlzIGJlIG9wZW5lZCB3aXRoIG1vZGUKKyAgICAgICAgICAgJ3JiJyB0byBhdm9pZCBpcnJpdGF0aW9uIGFib3V0IHRoZSBmaWxlIHNpemUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygiYXciKQorCisgICAgICAgIHRhcmluZm8gPSBjb3B5LmNvcHkodGFyaW5mbykKKworICAgICAgICBidWYgPSB0YXJpbmZvLnRvYnVmKHNlbGYuZm9ybWF0LCBzZWxmLmVuY29kaW5nLCBzZWxmLmVycm9ycykKKyAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKGJ1ZikKKyAgICAgICAgc2VsZi5vZmZzZXQgKz0gbGVuKGJ1ZikKKworICAgICAgICAjIElmIHRoZXJlJ3MgZGF0YSB0byBmb2xsb3csIGFwcGVuZCBpdC4KKyAgICAgICAgaWYgZmlsZW9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvcHlmaWxlb2JqKGZpbGVvYmosIHNlbGYuZmlsZW9iaiwgdGFyaW5mby5zaXplKQorICAgICAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QodGFyaW5mby5zaXplLCBCTE9DS1NJWkUpCisgICAgICAgICAgICBpZiByZW1haW5kZXIgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShOVUwgKiAoQkxPQ0tTSVpFIC0gcmVtYWluZGVyKSkKKyAgICAgICAgICAgICAgICBibG9ja3MgKz0gMQorICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gYmxvY2tzICogQkxPQ0tTSVpFCisKKyAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQorCisgICAgZGVmIGV4dHJhY3RhbGwoc2VsZiwgcGF0aD0iLiIsIG1lbWJlcnM9Tm9uZSk6CisgICAgICAgICIiIkV4dHJhY3QgYWxsIG1lbWJlcnMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCisgICAgICAgICAgIGRpcmVjdG9yeSBhbmQgc2V0IG93bmVyLCBtb2RpZmljYXRpb24gdGltZSBhbmQgcGVybWlzc2lvbnMgb24KKyAgICAgICAgICAgZGlyZWN0b3JpZXMgYWZ0ZXJ3YXJkcy4gYHBhdGgnIHNwZWNpZmllcyBhIGRpZmZlcmVudCBkaXJlY3RvcnkKKyAgICAgICAgICAgdG8gZXh0cmFjdCB0by4gYG1lbWJlcnMnIGlzIG9wdGlvbmFsIGFuZCBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZQorICAgICAgICAgICBsaXN0IHJldHVybmVkIGJ5IGdldG1lbWJlcnMoKS4KKyAgICAgICAgIiIiCisgICAgICAgIGRpcmVjdG9yaWVzID0gW10KKworICAgICAgICBpZiBtZW1iZXJzIGlzIE5vbmU6CisgICAgICAgICAgICBtZW1iZXJzID0gc2VsZgorCisgICAgICAgIGZvciB0YXJpbmZvIGluIG1lbWJlcnM6CisgICAgICAgICAgICBpZiB0YXJpbmZvLmlzZGlyKCk6CisgICAgICAgICAgICAgICAgIyBFeHRyYWN0IGRpcmVjdG9yaWVzIHdpdGggYSBzYWZlIG1vZGUuCisgICAgICAgICAgICAgICAgZGlyZWN0b3JpZXMuYXBwZW5kKHRhcmluZm8pCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IGNvcHkuY29weSh0YXJpbmZvKQorICAgICAgICAgICAgICAgIHRhcmluZm8ubW9kZSA9IDA3MDAKKyAgICAgICAgICAgIHNlbGYuZXh0cmFjdCh0YXJpbmZvLCBwYXRoKQorCisgICAgICAgICMgUmV2ZXJzZSBzb3J0IGRpcmVjdG9yaWVzLgorICAgICAgICBkaXJlY3Rvcmllcy5zb3J0KGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJykpCisgICAgICAgIGRpcmVjdG9yaWVzLnJldmVyc2UoKQorCisgICAgICAgICMgU2V0IGNvcnJlY3Qgb3duZXIsIG10aW1lIGFuZCBmaWxlbW9kZSBvbiBkaXJlY3Rvcmllcy4KKyAgICAgICAgZm9yIHRhcmluZm8gaW4gZGlyZWN0b3JpZXM6CisgICAgICAgICAgICBkaXJwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmNob3duKHRhcmluZm8sIGRpcnBhdGgpCisgICAgICAgICAgICAgICAgc2VsZi51dGltZSh0YXJpbmZvLCBkaXJwYXRoKQorICAgICAgICAgICAgICAgIHNlbGYuY2htb2QodGFyaW5mbywgZGlycGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeHRyYWN0RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzIiAlIGUpCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBtZW1iZXIsIHBhdGg9IiIpOgorICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCisgICAgICAgICAgIHVzaW5nIGl0cyBmdWxsIG5hbWUuIEl0cyBmaWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBhY2N1cmF0ZWx5CisgICAgICAgICAgIGFzIHBvc3NpYmxlLiBgbWVtYmVyJyBtYXkgYmUgYSBmaWxlbmFtZSBvciBhIFRhckluZm8gb2JqZWN0LiBZb3UgY2FuCisgICAgICAgICAgIHNwZWNpZnkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHVzaW5nIGBwYXRoJy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX2NoZWNrKCJyIikKKworICAgICAgICBpZiBpc2luc3RhbmNlKG1lbWJlciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi5nZXRtZW1iZXIobWVtYmVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyaW5mbyA9IG1lbWJlcgorCisgICAgICAgICMgUHJlcGFyZSB0aGUgbGluayB0YXJnZXQgZm9yIG1ha2VsaW5rKCkuCisgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKToKKyAgICAgICAgICAgIHRhcmluZm8uX2xpbmtfdGFyZ2V0ID0gb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubGlua25hbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIodGFyaW5mbywgb3MucGF0aC5qb2luKHBhdGgsIHRhcmluZm8ubmFtZSkpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgorICAgICAgICAgICAgaWYgc2VsZi5lcnJvcmxldmVsID4gMDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBlLmZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogJXMiICUgZS5zdHJlcnJvcikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9kYmcoMSwgInRhcmZpbGU6ICVzICVyIiAlIChlLnN0cmVycm9yLCBlLmZpbGVuYW1lKSkKKyAgICAgICAgZXhjZXB0IEV4dHJhY3RFcnJvciwgZToKKyAgICAgICAgICAgIGlmIHNlbGYuZXJyb3JsZXZlbCA+IDE6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiAlcyIgJSBlKQorCisgICAgZGVmIGV4dHJhY3RmaWxlKHNlbGYsIG1lbWJlcik6CisgICAgICAgICIiIkV4dHJhY3QgYSBtZW1iZXIgZnJvbSB0aGUgYXJjaGl2ZSBhcyBhIGZpbGUgb2JqZWN0LiBgbWVtYmVyJyBtYXkgYmUKKyAgICAgICAgICAgYSBmaWxlbmFtZSBvciBhIFRhckluZm8gb2JqZWN0LiBJZiBgbWVtYmVyJyBpcyBhIHJlZ3VsYXIgZmlsZSwgYQorICAgICAgICAgICBmaWxlLWxpa2Ugb2JqZWN0IGlzIHJldHVybmVkLiBJZiBgbWVtYmVyJyBpcyBhIGxpbmssIGEgZmlsZS1saWtlCisgICAgICAgICAgIG9iamVjdCBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsaW5rJ3MgdGFyZ2V0LiBJZiBgbWVtYmVyJyBpcyBub25lIG9mCisgICAgICAgICAgIHRoZSBhYm92ZSwgTm9uZSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgVGhlIGZpbGUtbGlrZSBvYmplY3QgaXMgcmVhZC1vbmx5IGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCisgICAgICAgICAgIG1ldGhvZHM6IHJlYWQoKSwgcmVhZGxpbmUoKSwgcmVhZGxpbmVzKCksIHNlZWsoKSBhbmQgdGVsbCgpCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jaGVjaygiciIpCisKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtZW1iZXIsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgdGFyaW5mbyA9IHNlbGYuZ2V0bWVtYmVyKG1lbWJlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRhcmluZm8gPSBtZW1iZXIKKworICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqZWN0KHNlbGYsIHRhcmluZm8pCisKKyAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgICMgSWYgYSBtZW1iZXIncyB0eXBlIGlzIHVua25vd24sIGl0IGlzIHRyZWF0ZWQgYXMgYQorICAgICAgICAgICAgIyByZWd1bGFyIGZpbGUuCisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlb2JqZWN0KHNlbGYsIHRhcmluZm8pCisKKyAgICAgICAgZWxpZiB0YXJpbmZvLmlzbG5rKCkgb3IgdGFyaW5mby5pc3N5bSgpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmZpbGVvYmosIF9TdHJlYW0pOgorICAgICAgICAgICAgICAgICMgQSBzbWFsbCBidXQgdWdseSB3b3JrYXJvdW5kIGZvciB0aGUgY2FzZSB0aGF0IHNvbWVvbmUgdHJpZXMKKyAgICAgICAgICAgICAgICAjIHRvIGV4dHJhY3QgYSAoc3ltKWxpbmsgYXMgYSBmaWxlLW9iamVjdCBmcm9tIGEgbm9uLXNlZWthYmxlCisgICAgICAgICAgICAgICAgIyBzdHJlYW0gb2YgdGFyIGJsb2Nrcy4KKyAgICAgICAgICAgICAgICByYWlzZSBTdHJlYW1FcnJvcigiY2Fubm90IGV4dHJhY3QgKHN5bSlsaW5rIGFzIGZpbGUgb2JqZWN0IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBIChzeW0pbGluaydzIGZpbGUgb2JqZWN0IGlzIGl0cyB0YXJnZXQncyBmaWxlIG9iamVjdC4KKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5leHRyYWN0ZmlsZShzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBJZiB0aGVyZSdzIG5vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1iZXIgKGRpcmVjdG9yeSwgY2hyZGV2LAorICAgICAgICAgICAgIyBibGtkZXYsIGV0Yy4pLCByZXR1cm4gTm9uZSBpbnN0ZWFkIG9mIGEgZmlsZSBvYmplY3QuCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9leHRyYWN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiRXh0cmFjdCB0aGUgVGFySW5mbyBvYmplY3QgdGFyaW5mbyB0byBhIHBoeXNpY2FsCisgICAgICAgICAgIGZpbGUgY2FsbGVkIHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICAjIEZldGNoIHRoZSBUYXJJbmZvIG9iamVjdCBmb3IgdGhlIGdpdmVuIG5hbWUKKyAgICAgICAgIyBhbmQgYnVpbGQgdGhlIGRlc3RpbmF0aW9uIHBhdGhuYW1lLCByZXBsYWNpbmcKKyAgICAgICAgIyBmb3J3YXJkIHNsYXNoZXMgdG8gcGxhdGZvcm0gc3BlY2lmaWMgc2VwYXJhdG9ycy4KKyAgICAgICAgdGFyZ2V0cGF0aCA9IHRhcmdldHBhdGgucnN0cmlwKCIvIikKKyAgICAgICAgdGFyZ2V0cGF0aCA9IHRhcmdldHBhdGgucmVwbGFjZSgiLyIsIG9zLnNlcCkKKworICAgICAgICAjIENyZWF0ZSBhbGwgdXBwZXIgZGlyZWN0b3JpZXMuCisgICAgICAgIHVwcGVyZGlycyA9IG9zLnBhdGguZGlybmFtZSh0YXJnZXRwYXRoKQorICAgICAgICBpZiB1cHBlcmRpcnMgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyh1cHBlcmRpcnMpOgorICAgICAgICAgICAgIyBDcmVhdGUgZGlyZWN0b3JpZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIGFyY2hpdmUgd2l0aAorICAgICAgICAgICAgIyBkZWZhdWx0IHBlcm1pc3Npb25zLgorICAgICAgICAgICAgb3MubWFrZWRpcnModXBwZXJkaXJzKQorCisgICAgICAgIGlmIHRhcmluZm8uaXNsbmsoKSBvciB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICBzZWxmLl9kYmcoMSwgIiVzIC0+ICVzIiAlICh0YXJpbmZvLm5hbWUsIHRhcmluZm8ubGlua25hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZGJnKDEsIHRhcmluZm8ubmFtZSkKKworICAgICAgICBpZiB0YXJpbmZvLmlzcmVnKCk6CisgICAgICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGVsaWYgdGFyaW5mby5pc2RpcigpOgorICAgICAgICAgICAgc2VsZi5tYWtlZGlyKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGVsaWYgdGFyaW5mby5pc2ZpZm8oKToKKyAgICAgICAgICAgIHNlbGYubWFrZWZpZm8odGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxpZiB0YXJpbmZvLmlzY2hyKCkgb3IgdGFyaW5mby5pc2JsaygpOgorICAgICAgICAgICAgc2VsZi5tYWtlZGV2KHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGVsaWYgdGFyaW5mby5pc2xuaygpIG9yIHRhcmluZm8uaXNzeW0oKToKKyAgICAgICAgICAgIHNlbGYubWFrZWxpbmsodGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxpZiB0YXJpbmZvLnR5cGUgbm90IGluIFNVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgICAgIHNlbGYubWFrZXVua25vd24odGFyaW5mbywgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubWFrZWZpbGUodGFyaW5mbywgdGFyZ2V0cGF0aCkKKworICAgICAgICBzZWxmLmNob3duKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIGlmIG5vdCB0YXJpbmZvLmlzc3ltKCk6CisgICAgICAgICAgICBzZWxmLmNobW9kKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgICAgICBzZWxmLnV0aW1lKHRhcmluZm8sIHRhcmdldHBhdGgpCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIEJlbG93IGFyZSB0aGUgZGlmZmVyZW50IGZpbGUgbWV0aG9kcy4gVGhleSBhcmUgY2FsbGVkIHZpYQorICAgICMgX2V4dHJhY3RfbWVtYmVyKCkgd2hlbiBleHRyYWN0KCkgaXMgY2FsbGVkLiBUaGV5IGNhbiBiZSByZXBsYWNlZCBpbiBhCisgICAgIyBzdWJjbGFzcyB0byBpbXBsZW1lbnQgb3RoZXIgZnVuY3Rpb25hbGl0eS4KKworICAgIGRlZiBtYWtlZGlyKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgZGlyZWN0b3J5IGNhbGxlZCB0YXJnZXRwYXRoLgorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBVc2UgYSBzYWZlIG1vZGUgZm9yIHRoZSBkaXJlY3RvcnksIHRoZSByZWFsIG1vZGUgaXMgc2V0CisgICAgICAgICAgICAjIGxhdGVyIGluIF9leHRyYWN0X21lbWJlcigpLgorICAgICAgICAgICAgb3MubWtkaXIodGFyZ2V0cGF0aCwgMDcwMCkKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIG1ha2VmaWxlKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgZmlsZSBjYWxsZWQgdGFyZ2V0cGF0aC4KKyAgICAgICAgIiIiCisgICAgICAgIHNvdXJjZSA9IHNlbGYuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBibHRuX29wZW4odGFyZ2V0cGF0aCwgIndiIikgYXMgdGFyZ2V0OgorICAgICAgICAgICAgICAgIGNvcHlmaWxlb2JqKHNvdXJjZSwgdGFyZ2V0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc291cmNlLmNsb3NlKCkKKworICAgIGRlZiBtYWtldW5rbm93bihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiTWFrZSBhIGZpbGUgZnJvbSBhIFRhckluZm8gb2JqZWN0IHdpdGggYW4gdW5rbm93biB0eXBlCisgICAgICAgICAgIGF0IHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICBzZWxmLm1ha2VmaWxlKHRhcmluZm8sIHRhcmdldHBhdGgpCisgICAgICAgIHNlbGYuX2RiZygxLCAidGFyZmlsZTogVW5rbm93biBmaWxlIHR5cGUgJXIsICIgXAorICAgICAgICAgICAgICAgICAgICAgImV4dHJhY3RlZCBhcyByZWd1bGFyIGZpbGUuIiAlIHRhcmluZm8udHlwZSkKKworICAgIGRlZiBtYWtlZmlmbyhzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiTWFrZSBhIGZpZm8gY2FsbGVkIHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAibWtmaWZvIik6CisgICAgICAgICAgICBvcy5ta2ZpZm8odGFyZ2V0cGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigiZmlmbyBub3Qgc3VwcG9ydGVkIGJ5IHN5c3RlbSIpCisKKyAgICBkZWYgbWFrZWRldihzZWxmLCB0YXJpbmZvLCB0YXJnZXRwYXRoKToKKyAgICAgICAgIiIiTWFrZSBhIGNoYXJhY3RlciBvciBibG9jayBkZXZpY2UgY2FsbGVkIHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgIm1rbm9kIikgb3Igbm90IGhhc2F0dHIob3MsICJtYWtlZGV2Iik6CisgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoInNwZWNpYWwgZGV2aWNlcyBub3Qgc3VwcG9ydGVkIGJ5IHN5c3RlbSIpCisKKyAgICAgICAgbW9kZSA9IHRhcmluZm8ubW9kZQorICAgICAgICBpZiB0YXJpbmZvLmlzYmxrKCk6CisgICAgICAgICAgICBtb2RlIHw9IHN0YXQuU19JRkJMSworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kZSB8PSBzdGF0LlNfSUZDSFIKKworICAgICAgICBvcy5ta25vZCh0YXJnZXRwYXRoLCBtb2RlLAorICAgICAgICAgICAgICAgICBvcy5tYWtlZGV2KHRhcmluZm8uZGV2bWFqb3IsIHRhcmluZm8uZGV2bWlub3IpKQorCisgICAgZGVmIG1ha2VsaW5rKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJNYWtlIGEgKHN5bWJvbGljKSBsaW5rIGNhbGxlZCB0YXJnZXRwYXRoLiBJZiBpdCBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAgICAgIChwbGF0Zm9ybSBsaW1pdGF0aW9uKSwgd2UgdHJ5IHRvIG1ha2UgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2VkIGZpbGUKKyAgICAgICAgICBpbnN0ZWFkIG9mIGEgbGluay4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIikgYW5kIGhhc2F0dHIob3MsICJsaW5rIik6CisgICAgICAgICAgICAjIEZvciBzeXN0ZW1zIHRoYXQgc3VwcG9ydCBzeW1ib2xpYyBhbmQgaGFyZCBsaW5rcy4KKyAgICAgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmxleGlzdHModGFyZ2V0cGF0aCk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayh0YXJnZXRwYXRoKQorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsodGFyaW5mby5saW5rbmFtZSwgdGFyZ2V0cGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBTZWUgZXh0cmFjdCgpLgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmluZm8uX2xpbmtfdGFyZ2V0KToKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5sZXhpc3RzKHRhcmdldHBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKHRhcmdldHBhdGgpCisgICAgICAgICAgICAgICAgICAgIG9zLmxpbmsodGFyaW5mby5fbGlua190YXJnZXQsIHRhcmdldHBhdGgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9tZW1iZXIoc2VsZi5fZmluZF9saW5rX3RhcmdldCh0YXJpbmZvKSwgdGFyZ2V0cGF0aCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLl9leHRyYWN0X21lbWJlcihzZWxmLl9maW5kX2xpbmtfdGFyZ2V0KHRhcmluZm8pLCB0YXJnZXRwYXRoKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4dHJhY3RFcnJvcigidW5hYmxlIHRvIHJlc29sdmUgbGluayBpbnNpZGUgYXJjaGl2ZSIpCisKKyAgICBkZWYgY2hvd24oc2VsZiwgdGFyaW5mbywgdGFyZ2V0cGF0aCk6CisgICAgICAgICIiIlNldCBvd25lciBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgcHdkIGFuZCBoYXNhdHRyKG9zLCAiZ2V0ZXVpZCIpIGFuZCBvcy5nZXRldWlkKCkgPT0gMDoKKyAgICAgICAgICAgICMgV2UgaGF2ZSB0byBiZSByb290IHRvIGRvIHNvLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGcgPSBncnAuZ2V0Z3JuYW0odGFyaW5mby5nbmFtZSlbMl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBnID0gdGFyaW5mby5naWQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1ID0gcHdkLmdldHB3bmFtKHRhcmluZm8udW5hbWUpWzJdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgdSA9IHRhcmluZm8udWlkCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgdGFyaW5mby5pc3N5bSgpIGFuZCBoYXNhdHRyKG9zLCAibGNob3duIik6CisgICAgICAgICAgICAgICAgICAgIG9zLmxjaG93bih0YXJnZXRwYXRoLCB1LCBnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAib3MyZW14IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNob3duKHRhcmdldHBhdGgsIHUsIGcpCisgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvciwgZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeHRyYWN0RXJyb3IoImNvdWxkIG5vdCBjaGFuZ2Ugb3duZXIiKQorCisgICAgZGVmIGNobW9kKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJTZXQgZmlsZSBwZXJtaXNzaW9ucyBvZiB0YXJnZXRwYXRoIGFjY29yZGluZyB0byB0YXJpbmZvLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ2NobW9kJyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0cGF0aCwgdGFyaW5mby5tb2RlKQorICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG1vZGUiKQorCisgICAgZGVmIHV0aW1lKHNlbGYsIHRhcmluZm8sIHRhcmdldHBhdGgpOgorICAgICAgICAiIiJTZXQgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGFyZ2V0cGF0aCBhY2NvcmRpbmcgdG8gdGFyaW5mby4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAndXRpbWUnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51dGltZSh0YXJnZXRwYXRoLCAodGFyaW5mby5tdGltZSwgdGFyaW5mby5tdGltZSkpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yLCBlOgorICAgICAgICAgICAgcmFpc2UgRXh0cmFjdEVycm9yKCJjb3VsZCBub3QgY2hhbmdlIG1vZGlmaWNhdGlvbiB0aW1lIikKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgbWVtYmVyIG9mIHRoZSBhcmNoaXZlIGFzIGEgVGFySW5mbyBvYmplY3QsIHdoZW4KKyAgICAgICAgICAgVGFyRmlsZSBpcyBvcGVuZWQgZm9yIHJlYWRpbmcuIFJldHVybiBOb25lIGlmIHRoZXJlIGlzIG5vIG1vcmUKKyAgICAgICAgICAgYXZhaWxhYmxlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fY2hlY2soInJhIikKKyAgICAgICAgaWYgc2VsZi5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG0gPSBzZWxmLmZpcnN0bWVtYmVyCisgICAgICAgICAgICBzZWxmLmZpcnN0bWVtYmVyID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIG0KKworICAgICAgICAjIFJlYWQgdGhlIG5leHQgYmxvY2suCisgICAgICAgIHNlbGYuZmlsZW9iai5zZWVrKHNlbGYub2Zmc2V0KQorICAgICAgICB0YXJpbmZvID0gTm9uZQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmluZm8uZnJvbXRhcmZpbGUoc2VsZikKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZIZWFkZXJFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmlnbm9yZV96ZXJvczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDIsICIweCVYOiAlcyIgJSAoc2VsZi5vZmZzZXQsIGUpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSBCTE9DS1NJWkUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGV4Y2VwdCBJbnZhbGlkSGVhZGVyRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pZ25vcmVfemVyb3M6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RiZygyLCAiMHglWDogJXMiICUgKHNlbGYub2Zmc2V0LCBlKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXQgKz0gQkxPQ0tTSVpFCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLm9mZnNldCA9PSAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQorICAgICAgICAgICAgZXhjZXB0IEVtcHR5SGVhZGVyRXJyb3I6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5vZmZzZXQgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUmVhZEVycm9yKCJlbXB0eSBmaWxlIikKKyAgICAgICAgICAgIGV4Y2VwdCBUcnVuY2F0ZWRIZWFkZXJFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLm9mZnNldCA9PSAwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQorICAgICAgICAgICAgZXhjZXB0IFN1YnNlcXVlbnRIZWFkZXJFcnJvciwgZToKKyAgICAgICAgICAgICAgICByYWlzZSBSZWFkRXJyb3Ioc3RyKGUpKQorICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5tZW1iZXJzLmFwcGVuZCh0YXJpbmZvKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbG9hZGVkID0gVHJ1ZQorCisgICAgICAgIHJldHVybiB0YXJpbmZvCisKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIExpdHRsZSBoZWxwZXIgbWV0aG9kczoKKworICAgIGRlZiBfZ2V0bWVtYmVyKHNlbGYsIG5hbWUsIHRhcmluZm89Tm9uZSwgbm9ybWFsaXplPUZhbHNlKToKKyAgICAgICAgIiIiRmluZCBhbiBhcmNoaXZlIG1lbWJlciBieSBuYW1lIGZyb20gYm90dG9tIHRvIHRvcC4KKyAgICAgICAgICAgSWYgdGFyaW5mbyBpcyBnaXZlbiwgaXQgaXMgdXNlZCBhcyB0aGUgc3RhcnRpbmcgcG9pbnQuCisgICAgICAgICIiIgorICAgICAgICAjIEVuc3VyZSB0aGF0IGFsbCBtZW1iZXJzIGhhdmUgYmVlbiBsb2FkZWQuCisgICAgICAgIG1lbWJlcnMgPSBzZWxmLmdldG1lbWJlcnMoKQorCisgICAgICAgICMgTGltaXQgdGhlIG1lbWJlciBzZWFyY2ggbGlzdCB1cCB0byB0YXJpbmZvLgorICAgICAgICBpZiB0YXJpbmZvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbWVtYmVycyA9IG1lbWJlcnNbOm1lbWJlcnMuaW5kZXgodGFyaW5mbyldCisKKyAgICAgICAgaWYgbm9ybWFsaXplOgorICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgobmFtZSkKKworICAgICAgICBmb3IgbWVtYmVyIGluIHJldmVyc2VkKG1lbWJlcnMpOgorICAgICAgICAgICAgaWYgbm9ybWFsaXplOgorICAgICAgICAgICAgICAgIG1lbWJlcl9uYW1lID0gb3MucGF0aC5ub3JtcGF0aChtZW1iZXIubmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWVtYmVyX25hbWUgPSBtZW1iZXIubmFtZQorCisgICAgICAgICAgICBpZiBuYW1lID09IG1lbWJlcl9uYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXIKKworICAgIGRlZiBfbG9hZChzZWxmKToKKyAgICAgICAgIiIiUmVhZCB0aHJvdWdoIHRoZSBlbnRpcmUgYXJjaGl2ZSBmaWxlIGFuZCBsb29rIGZvciByZWFkYWJsZQorICAgICAgICAgICBtZW1iZXJzLgorICAgICAgICAiIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLm5leHQoKQorICAgICAgICAgICAgaWYgdGFyaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuX2xvYWRlZCA9IFRydWUKKworICAgIGRlZiBfY2hlY2soc2VsZiwgbW9kZT1Ob25lKToKKyAgICAgICAgIiIiQ2hlY2sgaWYgVGFyRmlsZSBpcyBzdGlsbCBvcGVuLCBhbmQgaWYgdGhlIG9wZXJhdGlvbidzIG1vZGUKKyAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gVGFyRmlsZSdzIG1vZGUuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIiVzIGlzIGNsb3NlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXykKKyAgICAgICAgaWYgbW9kZSBpcyBub3QgTm9uZSBhbmQgc2VsZi5tb2RlIG5vdCBpbiBtb2RlOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigiYmFkIG9wZXJhdGlvbiBmb3IgbW9kZSAlciIgJSBzZWxmLm1vZGUpCisKKyAgICBkZWYgX2ZpbmRfbGlua190YXJnZXQoc2VsZiwgdGFyaW5mbyk6CisgICAgICAgICIiIkZpbmQgdGhlIHRhcmdldCBtZW1iZXIgb2YgYSBzeW1saW5rIG9yIGhhcmRsaW5rIG1lbWJlciBpbiB0aGUKKyAgICAgICAgICAgYXJjaGl2ZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHRhcmluZm8uaXNzeW0oKToKKyAgICAgICAgICAgICMgQWx3YXlzIHNlYXJjaCB0aGUgZW50aXJlIGFyY2hpdmUuCisgICAgICAgICAgICBsaW5rbmFtZSA9ICIvIi5qb2luKGZpbHRlcihOb25lLCAob3MucGF0aC5kaXJuYW1lKHRhcmluZm8ubmFtZSksIHRhcmluZm8ubGlua25hbWUpKSkKKyAgICAgICAgICAgIGxpbWl0ID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBTZWFyY2ggdGhlIGFyY2hpdmUgYmVmb3JlIHRoZSBsaW5rLCBiZWNhdXNlIGEgaGFyZCBsaW5rIGlzCisgICAgICAgICAgICAjIGp1c3QgYSByZWZlcmVuY2UgdG8gYW4gYWxyZWFkeSBhcmNoaXZlZCBmaWxlLgorICAgICAgICAgICAgbGlua25hbWUgPSB0YXJpbmZvLmxpbmtuYW1lCisgICAgICAgICAgICBsaW1pdCA9IHRhcmluZm8KKworICAgICAgICBtZW1iZXIgPSBzZWxmLl9nZXRtZW1iZXIobGlua25hbWUsIHRhcmluZm89bGltaXQsIG5vcm1hbGl6ZT1UcnVlKQorICAgICAgICBpZiBtZW1iZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJsaW5rbmFtZSAlciBub3QgZm91bmQiICUgbGlua25hbWUpCisgICAgICAgIHJldHVybiBtZW1iZXIKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiUHJvdmlkZSBhbiBpdGVyYXRvciBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9sb2FkZWQ6CisgICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLm1lbWJlcnMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVGFySXRlcihzZWxmKQorCisgICAgZGVmIF9kYmcoc2VsZiwgbGV2ZWwsIG1zZyk6CisgICAgICAgICIiIldyaXRlIGRlYnVnZ2luZyBvdXRwdXQgdG8gc3lzLnN0ZGVyci4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGxldmVsIDw9IHNlbGYuZGVidWc6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtc2cKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrKCkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgaWYgdHlwZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEFuIGV4Y2VwdGlvbiBvY2N1cnJlZC4gV2UgbXVzdCBub3QgY2FsbCBjbG9zZSgpIGJlY2F1c2UKKyAgICAgICAgICAgICMgaXQgd291bGQgdHJ5IHRvIHdyaXRlIGVuZC1vZi1hcmNoaXZlIGJsb2NrcyBhbmQgcGFkZGluZy4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9leHRmaWxlb2JqOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKyMgY2xhc3MgVGFyRmlsZQorCitjbGFzcyBUYXJJdGVyOgorICAgICIiIkl0ZXJhdG9yIENsYXNzLgorCisgICAgICAgZm9yIHRhcmluZm8gaW4gVGFyRmlsZSguLi4pOgorICAgICAgICAgICBzdWl0ZS4uLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmZpbGUpOgorICAgICAgICAiIiJDb25zdHJ1Y3QgYSBUYXJJdGVyIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudGFyZmlsZSA9IHRhcmZpbGUKKyAgICAgICAgc2VsZi5pbmRleCA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiBpdGVyYXRvciBvYmplY3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIG5leHQgaXRlbSB1c2luZyBUYXJGaWxlJ3MgbmV4dCgpIG1ldGhvZC4KKyAgICAgICAgICAgV2hlbiBhbGwgbWVtYmVycyBoYXZlIGJlZW4gcmVhZCwgc2V0IFRhckZpbGUgYXMgX2xvYWRlZC4KKyAgICAgICAgIiIiCisgICAgICAgICMgRml4IGZvciBTRiAjMTEwMDQyOTogVW5kZXIgcmFyZSBjaXJjdW1zdGFuY2VzIGl0IGNhbgorICAgICAgICAjIGhhcHBlbiB0aGF0IGdldG1lbWJlcnMoKSBpcyBjYWxsZWQgZHVyaW5nIGl0ZXJhdGlvbiwKKyAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIFRhckl0ZXIgdG8gc3RvcCBwcmVtYXR1cmVseS4KKworICAgICAgICBpZiBzZWxmLmluZGV4ID09IDAgYW5kIHNlbGYudGFyZmlsZS5maXJzdG1lbWJlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhcmZpbGUubmV4dCgpCisgICAgICAgIGVsaWYgc2VsZi5pbmRleCA8IGxlbihzZWxmLnRhcmZpbGUubWVtYmVycyk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm1lbWJlcnNbc2VsZi5pbmRleF0KKyAgICAgICAgZWxpZiBub3Qgc2VsZi50YXJmaWxlLl9sb2FkZWQ6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXJmaWxlLm5leHQoKQorICAgICAgICAgICAgaWYgbm90IHRhcmluZm86CisgICAgICAgICAgICAgICAgc2VsZi50YXJmaWxlLl9sb2FkZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBzZWxmLmluZGV4ICs9IDEKKyAgICAgICAgcmV0dXJuIHRhcmluZm8KKworIyBIZWxwZXIgY2xhc3NlcyBmb3Igc3BhcnNlIGZpbGUgc3VwcG9ydAorY2xhc3MgX3NlY3Rpb246CisgICAgIiIiQmFzZSBjbGFzcyBmb3IgX2RhdGEgYW5kIF9ob2xlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUpOgorICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorICAgICAgICBzZWxmLnNpemUgPSBzaXplCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBvZmZzZXQpOgorICAgICAgICByZXR1cm4gc2VsZi5vZmZzZXQgPD0gb2Zmc2V0IDwgc2VsZi5vZmZzZXQgKyBzZWxmLnNpemUKKworY2xhc3MgX2RhdGEoX3NlY3Rpb24pOgorICAgICIiIlJlcHJlc2VudCBhIGRhdGEgc2VjdGlvbiBpbiBhIHNwYXJzZSBmaWxlLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUsIHJlYWxwb3MpOgorICAgICAgICBfc2VjdGlvbi5fX2luaXRfXyhzZWxmLCBvZmZzZXQsIHNpemUpCisgICAgICAgIHNlbGYucmVhbHBvcyA9IHJlYWxwb3MKKworY2xhc3MgX2hvbGUoX3NlY3Rpb24pOgorICAgICIiIlJlcHJlc2VudCBhIGhvbGUgc2VjdGlvbiBpbiBhIHNwYXJzZSBmaWxlLgorICAgICIiIgorICAgIHBhc3MKKworY2xhc3MgX3JpbmdidWZmZXIobGlzdCk6CisgICAgIiIiUmluZ2J1ZmZlciBjbGFzcyB3aGljaCBpbmNyZWFzZXMgcGVyZm9ybWFuY2UKKyAgICAgICBvdmVyIGEgcmVndWxhciBsaXN0LgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5pZHggPSAwCisgICAgZGVmIGZpbmQoc2VsZiwgb2Zmc2V0KToKKyAgICAgICAgaWR4ID0gc2VsZi5pZHgKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmW2lkeF0KKyAgICAgICAgICAgIGlmIG9mZnNldCBpbiBpdGVtOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZHggKz0gMQorICAgICAgICAgICAgaWYgaWR4ID09IGxlbihzZWxmKToKKyAgICAgICAgICAgICAgICBpZHggPSAwCisgICAgICAgICAgICBpZiBpZHggPT0gc2VsZi5pZHg6CisgICAgICAgICAgICAgICAgIyBFbmQgb2YgRmlsZQorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuaWR4ID0gaWR4CisgICAgICAgIHJldHVybiBpdGVtCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgemlwZmlsZSBjb21wYXRpYmxlIFRhckZpbGUgY2xhc3MKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RBUl9QTEFJTiA9IDAgICAgICAgICAgICMgemlwZmlsZS5aSVBfU1RPUkVECitUQVJfR1pJUFBFRCA9IDggICAgICAgICAjIHppcGZpbGUuWklQX0RFRkxBVEVECitjbGFzcyBUYXJGaWxlQ29tcGF0OgorICAgICIiIlRhckZpbGUgY2xhc3MgY29tcGF0aWJsZSB3aXRoIHN0YW5kYXJkIG1vZHVsZSB6aXBmaWxlJ3MKKyAgICAgICBaaXBGaWxlIGNsYXNzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249VEFSX1BMQUlOKToKKyAgICAgICAgZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKKyAgICAgICAgd2FybnB5M2soInRoZSBUYXJGaWxlQ29tcGF0IGNsYXNzIGhhcyBiZWVuIHJlbW92ZWQgaW4gUHl0aG9uIDMuMCIsCisgICAgICAgICAgICAgICAgc3RhY2tsZXZlbD0yKQorICAgICAgICBpZiBjb21wcmVzc2lvbiA9PSBUQVJfUExBSU46CisgICAgICAgICAgICBzZWxmLnRhcmZpbGUgPSBUYXJGaWxlLnRhcm9wZW4oZmlsZSwgbW9kZSkKKyAgICAgICAgZWxpZiBjb21wcmVzc2lvbiA9PSBUQVJfR1pJUFBFRDoKKyAgICAgICAgICAgIHNlbGYudGFyZmlsZSA9IFRhckZpbGUuZ3pvcGVuKGZpbGUsIG1vZGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGNvbXByZXNzaW9uIGNvbnN0YW50IikKKyAgICAgICAgaWYgbW9kZVswOjFdID09ICJyIjoKKyAgICAgICAgICAgIG1lbWJlcnMgPSBzZWxmLnRhcmZpbGUuZ2V0bWVtYmVycygpCisgICAgICAgICAgICBmb3IgbSBpbiBtZW1iZXJzOgorICAgICAgICAgICAgICAgIG0uZmlsZW5hbWUgPSBtLm5hbWUKKyAgICAgICAgICAgICAgICBtLmZpbGVfc2l6ZSA9IG0uc2l6ZQorICAgICAgICAgICAgICAgIG0uZGF0ZV90aW1lID0gdGltZS5nbXRpbWUobS5tdGltZSlbOjZdCisgICAgZGVmIG5hbWVsaXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gbWFwKGxhbWJkYSBtOiBtLm5hbWUsIHNlbGYuaW5mb2xpc3QoKSkKKyAgICBkZWYgaW5mb2xpc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBmaWx0ZXIobGFtYmRhIG06IG0udHlwZSBpbiBSRUdVTEFSX1RZUEVTLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGFyZmlsZS5nZXRtZW1iZXJzKCkpCisgICAgZGVmIHByaW50ZGlyKHNlbGYpOgorICAgICAgICBzZWxmLnRhcmZpbGUubGlzdCgpCisgICAgZGVmIHRlc3R6aXAoc2VsZik6CisgICAgICAgIHJldHVybgorICAgIGRlZiBnZXRpbmZvKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi50YXJmaWxlLmdldG1lbWJlcihuYW1lKQorICAgIGRlZiByZWFkKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi50YXJmaWxlLmV4dHJhY3RmaWxlKHNlbGYudGFyZmlsZS5nZXRtZW1iZXIobmFtZSkpLnJlYWQoKQorICAgIGRlZiB3cml0ZShzZWxmLCBmaWxlbmFtZSwgYXJjbmFtZT1Ob25lLCBjb21wcmVzc190eXBlPU5vbmUpOgorICAgICAgICBzZWxmLnRhcmZpbGUuYWRkKGZpbGVuYW1lLCBhcmNuYW1lKQorICAgIGRlZiB3cml0ZXN0cihzZWxmLCB6aW5mbywgYnl0ZXMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgaW1wb3J0IGNhbGVuZGFyCisgICAgICAgIHRpbmZvID0gVGFySW5mbyh6aW5mby5maWxlbmFtZSkKKyAgICAgICAgdGluZm8uc2l6ZSA9IGxlbihieXRlcykKKyAgICAgICAgdGluZm8ubXRpbWUgPSBjYWxlbmRhci50aW1lZ20oemluZm8uZGF0ZV90aW1lKQorICAgICAgICBzZWxmLnRhcmZpbGUuYWRkZmlsZSh0aW5mbywgU3RyaW5nSU8oYnl0ZXMpKQorICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi50YXJmaWxlLmNsb3NlKCkKKyNjbGFzcyBUYXJGaWxlQ29tcGF0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBleHBvcnRlZCBmdW5jdGlvbnMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVmIGlzX3RhcmZpbGUobmFtZSk6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgbmFtZSBwb2ludHMgdG8gYSB0YXIgYXJjaGl2ZSB0aGF0IHdlCisgICAgICAgYXJlIGFibGUgdG8gaGFuZGxlLCBlbHNlIHJldHVybiBGYWxzZS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAgIHQgPSBvcGVuKG5hbWUpCisgICAgICAgIHQuY2xvc2UoKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIGV4Y2VwdCBUYXJFcnJvcjoKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2JsdG5fb3BlbiA9IG9wZW4KK29wZW4gPSBUYXJGaWxlLm9wZW4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGFyZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3RhcmZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNDU5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RhcmZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGFyZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3RhcmZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNDU5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RhcmZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZWxuZXRsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3ZThmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5CkBAIC0wLDAgKzEsNzg3IEBACityIiIiVEVMTkVUIGNsaWVudCBjbGFzcy4KKworQmFzZWQgb24gUkZDIDg1NDogVEVMTkVUIFByb3RvY29sIFNwZWNpZmljYXRpb24sIGJ5IEouIFBvc3RlbCBhbmQKK0ouIFJleW5vbGRzCisKK0V4YW1wbGU6CisKKz4+PiBmcm9tIHRlbG5ldGxpYiBpbXBvcnQgVGVsbmV0Cis+Pj4gdG4gPSBUZWxuZXQoJ3d3dy5weXRob24ub3JnJywgNzkpICAgIyBjb25uZWN0IHRvIGZpbmdlciBwb3J0Cis+Pj4gdG4ud3JpdGUoJ2d1aWRvXHJcbicpCis+Pj4gcHJpbnQgdG4ucmVhZF9hbGwoKQorTG9naW4gICAgICAgTmFtZSAgICAgICAgICAgICAgIFRUWSAgICAgICAgIElkbGUgICAgV2hlbiAgICBXaGVyZQorZ3VpZG8gICAgR3VpZG8gdmFuIFJvc3N1bSAgICAgIHB0cy8yICAgICAgICA8RGVjICAyIDExOjEwPiBzbmFnLmNucmkucmVzdG9uLi4KKworPj4+CisKK05vdGUgdGhhdCByZWFkX2FsbCgpIHdvbid0IHJlYWQgdW50aWwgZW9mIC0tIGl0IGp1c3QgcmVhZHMgc29tZSBkYXRhCistLSBidXQgaXQgZ3VhcmFudGVlcyB0byByZWFkIGF0IGxlYXN0IG9uZSBieXRlIHVubGVzcyBFT0YgaXMgaGl0LgorCitJdCBpcyBwb3NzaWJsZSB0byBwYXNzIGEgVGVsbmV0IG9iamVjdCB0byBzZWxlY3Quc2VsZWN0KCkgaW4gb3JkZXIgdG8KK3dhaXQgdW50aWwgbW9yZSBkYXRhIGlzIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2UsCityZWFkX2VhZ2VyKCkgbWF5IHJldHVybiAnJyBldmVuIGlmIHRoZXJlIHdhcyBkYXRhIG9uIHRoZSBzb2NrZXQsCitiZWNhdXNlIHRoZSBwcm90b2NvbCBuZWdvdGlhdGlvbiBtYXkgaGF2ZSBlYXRlbiB0aGUgZGF0YS4gIFRoaXMgaXMgd2h5CitFT0ZFcnJvciBpcyBuZWVkZWQgaW4gc29tZSBjYXNlcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuICJubyBkYXRhIiBhbmQKKyJjb25uZWN0aW9uIGNsb3NlZCIgKHNpbmNlIHRoZSBzb2NrZXQgYWxzbyBhcHBlYXJzIHJlYWR5IGZvciByZWFkaW5nCit3aGVuIGl0IGlzIGNsb3NlZCkuCisKK1RvIGRvOgorLSBvcHRpb24gbmVnb3RpYXRpb24KKy0gdGltZW91dCBzaG91bGQgYmUgaW50cmluc2ljIHRvIHRoZSBjb25uZWN0aW9uIG9iamVjdCBpbnN0ZWFkIG9mIGFuCisgIG9wdGlvbiBvbiBvbmUgb2YgdGhlIHJlYWQgY2FsbHMgb25seQorCisiIiIKKworCisjIEltcG9ydGVkIG1vZHVsZXMKK2ltcG9ydCBlcnJubworaW1wb3J0IHN5cworaW1wb3J0IHNvY2tldAoraW1wb3J0IHNlbGVjdAorCitfX2FsbF9fID0gWyJUZWxuZXQiXQorCisjIFR1bmFibGUgcGFyYW1ldGVycworREVCVUdMRVZFTCA9IDAKKworIyBUZWxuZXQgcHJvdG9jb2wgZGVmYXVsdHMKK1RFTE5FVF9QT1JUID0gMjMKKworIyBUZWxuZXQgcHJvdG9jb2wgY2hhcmFjdGVycyAoZG9uJ3QgY2hhbmdlKQorSUFDICA9IGNocigyNTUpICMgIkludGVycHJldCBBcyBDb21tYW5kIgorRE9OVCA9IGNocigyNTQpCitETyAgID0gY2hyKDI1MykKK1dPTlQgPSBjaHIoMjUyKQorV0lMTCA9IGNocigyNTEpCit0aGVOVUxMID0gY2hyKDApCisKK1NFICA9IGNocigyNDApICAjIFN1Ym5lZ290aWF0aW9uIEVuZAorTk9QID0gY2hyKDI0MSkgICMgTm8gT3BlcmF0aW9uCitETSAgPSBjaHIoMjQyKSAgIyBEYXRhIE1hcmsKK0JSSyA9IGNocigyNDMpICAjIEJyZWFrCitJUCAgPSBjaHIoMjQ0KSAgIyBJbnRlcnJ1cHQgcHJvY2VzcworQU8gID0gY2hyKDI0NSkgICMgQWJvcnQgb3V0cHV0CitBWVQgPSBjaHIoMjQ2KSAgIyBBcmUgWW91IFRoZXJlCitFQyAgPSBjaHIoMjQ3KSAgIyBFcmFzZSBDaGFyYWN0ZXIKK0VMICA9IGNocigyNDgpICAjIEVyYXNlIExpbmUKK0dBICA9IGNocigyNDkpICAjIEdvIEFoZWFkCitTQiA9ICBjaHIoMjUwKSAgIyBTdWJuZWdvdGlhdGlvbiBCZWdpbgorCisKKyMgVGVsbmV0IHByb3RvY29sIG9wdGlvbnMgY29kZSAoZG9uJ3QgY2hhbmdlKQorIyBUaGVzZSBvbmVzIGFsbCBjb21lIGZyb20gYXJwYS90ZWxuZXQuaAorQklOQVJZID0gY2hyKDApICMgOC1iaXQgZGF0YSBwYXRoCitFQ0hPID0gY2hyKDEpICMgZWNobworUkNQID0gY2hyKDIpICMgcHJlcGFyZSB0byByZWNvbm5lY3QKK1NHQSA9IGNocigzKSAjIHN1cHByZXNzIGdvIGFoZWFkCitOQU1TID0gY2hyKDQpICMgYXBwcm94aW1hdGUgbWVzc2FnZSBzaXplCitTVEFUVVMgPSBjaHIoNSkgIyBnaXZlIHN0YXR1cworVE0gPSBjaHIoNikgIyB0aW1pbmcgbWFyaworUkNURSA9IGNocig3KSAjIHJlbW90ZSBjb250cm9sbGVkIHRyYW5zbWlzc2lvbiBhbmQgZWNobworTkFPTCA9IGNocig4KSAjIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgbGluZSB3aWR0aAorTkFPUCA9IGNocig5KSAjIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgcGFnZSBzaXplCitOQU9DUkQgPSBjaHIoMTApICMgbmVnb3RpYXRlIGFib3V0IENSIGRpc3Bvc2l0aW9uCitOQU9IVFMgPSBjaHIoMTEpICMgbmVnb3RpYXRlIGFib3V0IGhvcml6b250YWwgdGFic3RvcHMKK05BT0hURCA9IGNocigxMikgIyBuZWdvdGlhdGUgYWJvdXQgaG9yaXpvbnRhbCB0YWIgZGlzcG9zaXRpb24KK05BT0ZGRCA9IGNocigxMykgIyBuZWdvdGlhdGUgYWJvdXQgZm9ybWZlZWQgZGlzcG9zaXRpb24KK05BT1ZUUyA9IGNocigxNCkgIyBuZWdvdGlhdGUgYWJvdXQgdmVydGljYWwgdGFiIHN0b3BzCitOQU9WVEQgPSBjaHIoMTUpICMgbmVnb3RpYXRlIGFib3V0IHZlcnRpY2FsIHRhYiBkaXNwb3NpdGlvbgorTkFPTEZEID0gY2hyKDE2KSAjIG5lZ290aWF0ZSBhYm91dCBvdXRwdXQgTEYgZGlzcG9zaXRpb24KK1hBU0NJSSA9IGNocigxNykgIyBleHRlbmRlZCBhc2NpaSBjaGFyYWN0ZXIgc2V0CitMT0dPVVQgPSBjaHIoMTgpICMgZm9yY2UgbG9nb3V0CitCTSA9IGNocigxOSkgIyBieXRlIG1hY3JvCitERVQgPSBjaHIoMjApICMgZGF0YSBlbnRyeSB0ZXJtaW5hbAorU1VQRFVQID0gY2hyKDIxKSAjIHN1cGR1cCBwcm90b2NvbAorU1VQRFVQT1VUUFVUID0gY2hyKDIyKSAjIHN1cGR1cCBvdXRwdXQKK1NORExPQyA9IGNocigyMykgIyBzZW5kIGxvY2F0aW9uCitUVFlQRSA9IGNocigyNCkgIyB0ZXJtaW5hbCB0eXBlCitFT1IgPSBjaHIoMjUpICMgZW5kIG9yIHJlY29yZAorVFVJRCA9IGNocigyNikgIyBUQUNBQ1MgdXNlciBpZGVudGlmaWNhdGlvbgorT1VUTVJLID0gY2hyKDI3KSAjIG91dHB1dCBtYXJraW5nCitUVFlMT0MgPSBjaHIoMjgpICMgdGVybWluYWwgbG9jYXRpb24gbnVtYmVyCitWVDMyNzBSRUdJTUUgPSBjaHIoMjkpICMgMzI3MCByZWdpbWUKK1gzUEFEID0gY2hyKDMwKSAjIFguMyBQQUQKK05BV1MgPSBjaHIoMzEpICMgd2luZG93IHNpemUKK1RTUEVFRCA9IGNocigzMikgIyB0ZXJtaW5hbCBzcGVlZAorTEZMT1cgPSBjaHIoMzMpICMgcmVtb3RlIGZsb3cgY29udHJvbAorTElORU1PREUgPSBjaHIoMzQpICMgTGluZW1vZGUgb3B0aW9uCitYRElTUExPQyA9IGNocigzNSkgIyBYIERpc3BsYXkgTG9jYXRpb24KK09MRF9FTlZJUk9OID0gY2hyKDM2KSAjIE9sZCAtIEVudmlyb25tZW50IHZhcmlhYmxlcworQVVUSEVOVElDQVRJT04gPSBjaHIoMzcpICMgQXV0aGVudGljYXRlCitFTkNSWVBUID0gY2hyKDM4KSAjIEVuY3J5cHRpb24gb3B0aW9uCitORVdfRU5WSVJPTiA9IGNocigzOSkgIyBOZXcgLSBFbnZpcm9ubWVudCB2YXJpYWJsZXMKKyMgdGhlIGZvbGxvd2luZyBvbmVzIGNvbWUgZnJvbQorIyBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL3RlbG5ldC1vcHRpb25zCisjIFVuZm9ydHVuYXRlbHksIHRoYXQgZG9jdW1lbnQgZG9lcyBub3QgYXNzaWduIGlkZW50aWZpZXJzCisjIHRvIGFsbCBvZiB0aGVtLCBzbyB3ZSBhcmUgbWFraW5nIHRoZW0gdXAKK1ROMzI3MEUgPSBjaHIoNDApICMgVE4zMjcwRQorWEFVVEggPSBjaHIoNDEpICMgWEFVVEgKK0NIQVJTRVQgPSBjaHIoNDIpICMgQ0hBUlNFVAorUlNQID0gY2hyKDQzKSAjIFRlbG5ldCBSZW1vdGUgU2VyaWFsIFBvcnQKK0NPTV9QT1JUX09QVElPTiA9IGNocig0NCkgIyBDb20gUG9ydCBDb250cm9sIE9wdGlvbgorU1VQUFJFU1NfTE9DQUxfRUNITyA9IGNocig0NSkgIyBUZWxuZXQgU3VwcHJlc3MgTG9jYWwgRWNobworVExTID0gY2hyKDQ2KSAjIFRlbG5ldCBTdGFydCBUTFMKK0tFUk1JVCA9IGNocig0NykgIyBLRVJNSVQKK1NFTkRfVVJMID0gY2hyKDQ4KSAjIFNFTkQtVVJMCitGT1JXQVJEX1ggPSBjaHIoNDkpICMgRk9SV0FSRF9YCitQUkFHTUFfTE9HT04gPSBjaHIoMTM4KSAjIFRFTE9QVCBQUkFHTUEgTE9HT04KK1NTUElfTE9HT04gPSBjaHIoMTM5KSAjIFRFTE9QVCBTU1BJIExPR09OCitQUkFHTUFfSEVBUlRCRUFUID0gY2hyKDE0MCkgIyBURUxPUFQgUFJBR01BIEhFQVJUQkVBVAorRVhPUEwgPSBjaHIoMjU1KSAjIEV4dGVuZGVkLU9wdGlvbnMtTGlzdAorTk9PUFQgPSBjaHIoMCkKKworY2xhc3MgVGVsbmV0OgorCisgICAgIiIiVGVsbmV0IGludGVyZmFjZSBjbGFzcy4KKworICAgIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvbm5lY3Rpb24gdG8gYSB0ZWxuZXQKKyAgICBzZXJ2ZXIuICBUaGUgaW5zdGFuY2UgaXMgaW5pdGlhbGx5IG5vdCBjb25uZWN0ZWQ7IHRoZSBvcGVuKCkKKyAgICBtZXRob2QgbXVzdCBiZSB1c2VkIHRvIGVzdGFibGlzaCBhIGNvbm5lY3Rpb24uICBBbHRlcm5hdGl2ZWx5LCB0aGUKKyAgICBob3N0IG5hbWUgYW5kIG9wdGlvbmFsIHBvcnQgbnVtYmVyIGNhbiBiZSBwYXNzZWQgdG8gdGhlCisgICAgY29uc3RydWN0b3IsIHRvby4KKworICAgIERvbid0IHRyeSB0byByZW9wZW4gYW4gYWxyZWFkeSBjb25uZWN0ZWQgaW5zdGFuY2UuCisKKyAgICBUaGlzIGNsYXNzIGhhcyBtYW55IHJlYWRfKigpIG1ldGhvZHMuICBOb3RlIHRoYXQgc29tZSBvZiB0aGVtCisgICAgcmFpc2UgRU9GRXJyb3Igd2hlbiB0aGUgZW5kIG9mIHRoZSBjb25uZWN0aW9uIGlzIHJlYWQsIGJlY2F1c2UKKyAgICB0aGV5IGNhbiByZXR1cm4gYW4gZW1wdHkgc3RyaW5nIGZvciBvdGhlciByZWFzb25zLiAgU2VlIHRoZQorICAgIGluZGl2aWR1YWwgZG9jIHN0cmluZ3MuCisKKyAgICByZWFkX3VudGlsKGV4cGVjdGVkLCBbdGltZW91dF0pCisgICAgICAgIFJlYWQgdW50aWwgdGhlIGV4cGVjdGVkIHN0cmluZyBoYXMgYmVlbiBzZWVuLCBvciBhIHRpbWVvdXQgaXMKKyAgICAgICAgaGl0IChkZWZhdWx0IGlzIG5vIHRpbWVvdXQpOyBtYXkgYmxvY2suCisKKyAgICByZWFkX2FsbCgpCisgICAgICAgIFJlYWQgYWxsIGRhdGEgdW50aWwgRU9GOyBtYXkgYmxvY2suCisKKyAgICByZWFkX3NvbWUoKQorICAgICAgICBSZWFkIGF0IGxlYXN0IG9uZSBieXRlIG9yIEVPRjsgbWF5IGJsb2NrLgorCisgICAgcmVhZF92ZXJ5X2VhZ2VyKCkKKyAgICAgICAgUmVhZCBhbGwgZGF0YSBhdmFpbGFibGUgYWxyZWFkeSBxdWV1ZWQgb3Igb24gdGhlIHNvY2tldCwKKyAgICAgICAgd2l0aG91dCBibG9ja2luZy4KKworICAgIHJlYWRfZWFnZXIoKQorICAgICAgICBSZWFkIGVpdGhlciBkYXRhIGFscmVhZHkgcXVldWVkIG9yIHNvbWUgZGF0YSBhdmFpbGFibGUgb24gdGhlCisgICAgICAgIHNvY2tldCwgd2l0aG91dCBibG9ja2luZy4KKworICAgIHJlYWRfbGF6eSgpCisgICAgICAgIFJlYWQgYWxsIGRhdGEgaW4gdGhlIHJhdyBxdWV1ZSAocHJvY2Vzc2luZyBpdCBmaXJzdCksIHdpdGhvdXQKKyAgICAgICAgZG9pbmcgYW55IHNvY2tldCBJL08uCisKKyAgICByZWFkX3ZlcnlfbGF6eSgpCisgICAgICAgIFJlYWRzIGFsbCBkYXRhIGluIHRoZSBjb29rZWQgcXVldWUsIHdpdGhvdXQgZG9pbmcgYW55IHNvY2tldAorICAgICAgICBJL08uCisKKyAgICByZWFkX3NiX2RhdGEoKQorICAgICAgICBSZWFkcyBhdmFpbGFibGUgZGF0YSBiZXR3ZWVuIFNCIC4uLiBTRSBzZXF1ZW5jZS4gRG9uJ3QgYmxvY2suCisKKyAgICBzZXRfb3B0aW9uX25lZ290aWF0aW9uX2NhbGxiYWNrKGNhbGxiYWNrKQorICAgICAgICBFYWNoIHRpbWUgYSB0ZWxuZXQgb3B0aW9uIGlzIHJlYWQgb24gdGhlIGlucHV0IGZsb3csIHRoaXMgY2FsbGJhY2sKKyAgICAgICAgKGlmIHNldCkgaXMgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIDoKKyAgICAgICAgY2FsbGJhY2sodGVsbmV0IHNvY2tldCwgY29tbWFuZCwgb3B0aW9uKQorICAgICAgICAgICAgb3B0aW9uIHdpbGwgYmUgY2hyKDApIHdoZW4gdGhlcmUgaXMgbm8gb3B0aW9uLgorICAgICAgICBObyBvdGhlciBhY3Rpb24gaXMgZG9uZSBhZnRlcndhcmRzIGJ5IHRlbG5ldGxpYi4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgcG9ydD0wLAorICAgICAgICAgICAgICAgICB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgICIiIkNvbnN0cnVjdG9yLgorCisgICAgICAgIFdoZW4gY2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzLCBjcmVhdGUgYW4gdW5jb25uZWN0ZWQgaW5zdGFuY2UuCisgICAgICAgIFdpdGggYSBob3N0bmFtZSBhcmd1bWVudCwgaXQgY29ubmVjdHMgdGhlIGluc3RhbmNlOyBwb3J0IG51bWJlcgorICAgICAgICBhbmQgdGltZW91dCBhcmUgb3B0aW9uYWwuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmRlYnVnbGV2ZWwgPSBERUJVR0xFVkVMCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHNlbGYuc29jayA9IE5vbmUKKyAgICAgICAgc2VsZi5yYXdxID0gJycKKyAgICAgICAgc2VsZi5pcmF3cSA9IDAKKyAgICAgICAgc2VsZi5jb29rZWRxID0gJycKKyAgICAgICAgc2VsZi5lb2YgPSAwCisgICAgICAgIHNlbGYuaWFjc2VxID0gJycgIyBCdWZmZXIgZm9yIElBQyBzZXF1ZW5jZS4KKyAgICAgICAgc2VsZi5zYiA9IDAgIyBmbGFnIGZvciBTQiBhbmQgU0Ugc2VxdWVuY2UuCisgICAgICAgIHNlbGYuc2JkYXRhcSA9ICcnCisgICAgICAgIHNlbGYub3B0aW9uX2NhbGxiYWNrID0gTm9uZQorICAgICAgICBzZWxmLl9oYXNfcG9sbCA9IGhhc2F0dHIoc2VsZWN0LCAncG9sbCcpCisgICAgICAgIGlmIGhvc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLm9wZW4oaG9zdCwgcG9ydCwgdGltZW91dCkKKworICAgIGRlZiBvcGVuKHNlbGYsIGhvc3QsIHBvcnQ9MCwgdGltZW91dD1zb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQpOgorICAgICAgICAiIiJDb25uZWN0IHRvIGEgaG9zdC4KKworICAgICAgICBUaGUgb3B0aW9uYWwgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBwb3J0IG51bWJlciwgd2hpY2gKKyAgICAgICAgZGVmYXVsdHMgdG8gdGhlIHN0YW5kYXJkIHRlbG5ldCBwb3J0ICgyMykuCisKKyAgICAgICAgRG9uJ3QgdHJ5IHRvIHJlb3BlbiBhbiBhbHJlYWR5IGNvbm5lY3RlZCBpbnN0YW5jZS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZW9mID0gMAorICAgICAgICBpZiBub3QgcG9ydDoKKyAgICAgICAgICAgIHBvcnQgPSBURUxORVRfUE9SVAorICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisgICAgICAgIHNlbGYucG9ydCA9IHBvcnQKKyAgICAgICAgc2VsZi50aW1lb3V0ID0gdGltZW91dAorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGhvc3QsIHBvcnQpLCB0aW1lb3V0KQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICIiIkRlc3RydWN0b3IgLS0gY2xvc2UgdGhlIGNvbm5lY3Rpb24uIiIiCisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIG1zZyhzZWxmLCBtc2csICphcmdzKToKKyAgICAgICAgIiIiUHJpbnQgYSBkZWJ1ZyBtZXNzYWdlLCB3aGVuIHRoZSBkZWJ1ZyBsZXZlbCBpcyA+IDAuCisKKyAgICAgICAgSWYgZXh0cmEgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGFyZSBzdWJzdGl0dXRlZCBpbiB0aGUKKyAgICAgICAgbWVzc2FnZSB1c2luZyB0aGUgc3RhbmRhcmQgc3RyaW5nIGZvcm1hdHRpbmcgb3BlcmF0b3IuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuZGVidWdsZXZlbCA+IDA6CisgICAgICAgICAgICBwcmludCAnVGVsbmV0KCVzLCVzKTonICUgKHNlbGYuaG9zdCwgc2VsZi5wb3J0KSwKKyAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgcHJpbnQgbXNnICUgYXJncworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCBtc2cKKworICAgIGRlZiBzZXRfZGVidWdsZXZlbChzZWxmLCBkZWJ1Z2xldmVsKToKKyAgICAgICAgIiIiU2V0IHRoZSBkZWJ1ZyBsZXZlbC4KKworICAgICAgICBUaGUgaGlnaGVyIGl0IGlzLCB0aGUgbW9yZSBkZWJ1ZyBvdXRwdXQgeW91IGdldCAob24gc3lzLnN0ZG91dCkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuZGVidWdsZXZlbCA9IGRlYnVnbGV2ZWwKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGNvbm5lY3Rpb24uIiIiCisgICAgICAgIGlmIHNlbGYuc29jazoKKyAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisgICAgICAgIHNlbGYuc29jayA9IDAKKyAgICAgICAgc2VsZi5lb2YgPSAxCisgICAgICAgIHNlbGYuaWFjc2VxID0gJycKKyAgICAgICAgc2VsZi5zYiA9IDAKKworICAgIGRlZiBnZXRfc29ja2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIHNvY2tldCBvYmplY3QgdXNlZCBpbnRlcm5hbGx5LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5zb2NrCisKKyAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGZpbGVubygpIG9mIHRoZSBzb2NrZXQgb2JqZWN0IHVzZWQgaW50ZXJuYWxseS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc29jay5maWxlbm8oKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGJ1ZmZlcik6CisgICAgICAgICIiIldyaXRlIGEgc3RyaW5nIHRvIHRoZSBzb2NrZXQsIGRvdWJsaW5nIGFueSBJQUMgY2hhcmFjdGVycy4KKworICAgICAgICBDYW4gYmxvY2sgaWYgdGhlIGNvbm5lY3Rpb24gaXMgYmxvY2tlZC4gIE1heSByYWlzZQorICAgICAgICBzb2NrZXQuZXJyb3IgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBJQUMgaW4gYnVmZmVyOgorICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyLnJlcGxhY2UoSUFDLCBJQUMrSUFDKQorICAgICAgICBzZWxmLm1zZygic2VuZCAlciIsIGJ1ZmZlcikKKyAgICAgICAgc2VsZi5zb2NrLnNlbmRhbGwoYnVmZmVyKQorCisgICAgZGVmIHJlYWRfdW50aWwoc2VsZiwgbWF0Y2gsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgdW50aWwgYSBnaXZlbiBzdHJpbmcgaXMgZW5jb3VudGVyZWQgb3IgdW50aWwgdGltZW91dC4KKworICAgICAgICBXaGVuIG5vIG1hdGNoIGlzIGZvdW5kLCByZXR1cm4gd2hhdGV2ZXIgaXMgYXZhaWxhYmxlIGluc3RlYWQsCisgICAgICAgIHBvc3NpYmx5IHRoZSBlbXB0eSBzdHJpbmcuICBSYWlzZSBFT0ZFcnJvciBpZiB0aGUgY29ubmVjdGlvbgorICAgICAgICBpcyBjbG9zZWQgYW5kIG5vIGNvb2tlZCBkYXRhIGlzIGF2YWlsYWJsZS4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faGFzX3BvbGw6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF91bnRpbF93aXRoX3BvbGwobWF0Y2gsIHRpbWVvdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVhZF91bnRpbF93aXRoX3NlbGVjdChtYXRjaCwgdGltZW91dCkKKworICAgIGRlZiBfcmVhZF91bnRpbF93aXRoX3BvbGwoc2VsZiwgbWF0Y2gsIHRpbWVvdXQpOgorICAgICAgICAiIiJSZWFkIHVudGlsIGEgZ2l2ZW4gc3RyaW5nIGlzIGVuY291bnRlcmVkIG9yIHVudGlsIHRpbWVvdXQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgdXNlcyBzZWxlY3QucG9sbCgpIHRvIGltcGxlbWVudCB0aGUgdGltZW91dC4KKyAgICAgICAgIiIiCisgICAgICAgIG4gPSBsZW4obWF0Y2gpCisgICAgICAgIGNhbGxfdGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICAgICAgdGltZV9zdGFydCA9IHRpbWUoKQorICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIGkgPSBzZWxmLmNvb2tlZHEuZmluZChtYXRjaCkKKyAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICBwb2xsZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgICAgICBwb2xsX2luX29yX3ByaW9yaXR5X2ZsYWdzID0gc2VsZWN0LlBPTExJTiB8IHNlbGVjdC5QT0xMUFJJCisgICAgICAgICAgICBwb2xsZXIucmVnaXN0ZXIoc2VsZiwgcG9sbF9pbl9vcl9wcmlvcml0eV9mbGFncykKKyAgICAgICAgICAgIHdoaWxlIGkgPCAwIGFuZCBub3Qgc2VsZi5lb2Y6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZWFkeSA9IHBvbGxlci5wb2xsKGNhbGxfdGltZW91dCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPSB0aW1lKCkgLSB0aW1lX3N0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dC1lbGFwc2VkCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGZvciBmZCwgbW9kZSBpbiByZWFkeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSAmIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICBpID0gbWF4KDAsIGxlbihzZWxmLmNvb2tlZHEpLW4pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gc2VsZi5jb29rZWRxLmZpbmQobWF0Y2gsIGkpCisgICAgICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgaWYgZWxhcHNlZCA+PSB0aW1lb3V0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dC1lbGFwc2VkCisgICAgICAgICAgICBwb2xsZXIudW5yZWdpc3RlcihzZWxmKQorICAgICAgICBpZiBpID49IDA6CisgICAgICAgICAgICBpID0gaSArIG4KKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuY29va2VkcVs6aV0KKyAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtpOl0KKyAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZF92ZXJ5X2xhenkoKQorCisgICAgZGVmIF9yZWFkX3VudGlsX3dpdGhfc2VsZWN0KHNlbGYsIG1hdGNoLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJSZWFkIHVudGlsIGEgZ2l2ZW4gc3RyaW5nIGlzIGVuY291bnRlcmVkIG9yIHVudGlsIHRpbWVvdXQuCisKKyAgICAgICAgVGhlIHRpbWVvdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgc2VsZWN0LnNlbGVjdCgpLgorICAgICAgICAiIiIKKyAgICAgICAgbiA9IGxlbihtYXRjaCkKKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICBpID0gc2VsZi5jb29rZWRxLmZpbmQobWF0Y2gpCisgICAgICAgIGlmIGkgPj0gMDoKKyAgICAgICAgICAgIGkgPSBpK24KKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuY29va2VkcVs6aV0KKyAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtpOl0KKyAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgc19yZXBseSA9IChbc2VsZl0sIFtdLCBbXSkKKyAgICAgICAgc19hcmdzID0gc19yZXBseQorICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc19hcmdzID0gc19hcmdzICsgKHRpbWVvdXQsKQorICAgICAgICAgICAgZnJvbSB0aW1lIGltcG9ydCB0aW1lCisgICAgICAgICAgICB0aW1lX3N0YXJ0ID0gdGltZSgpCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmVvZiBhbmQgc2VsZWN0LnNlbGVjdCgqc19hcmdzKSA9PSBzX3JlcGx5OgorICAgICAgICAgICAgaSA9IG1heCgwLCBsZW4oc2VsZi5jb29rZWRxKS1uKQorICAgICAgICAgICAgc2VsZi5maWxsX3Jhd3EoKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICAgICAgaSA9IHNlbGYuY29va2VkcS5maW5kKG1hdGNoLCBpKQorICAgICAgICAgICAgaWYgaSA+PSAwOgorICAgICAgICAgICAgICAgIGkgPSBpK24KKyAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmNvb2tlZHFbOmldCisgICAgICAgICAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxW2k6XQorICAgICAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc19hcmdzID0gc19yZXBseSArICh0aW1lb3V0LWVsYXBzZWQsKQorICAgICAgICByZXR1cm4gc2VsZi5yZWFkX3ZlcnlfbGF6eSgpCisKKyAgICBkZWYgcmVhZF9hbGwoc2VsZik6CisgICAgICAgICIiIlJlYWQgYWxsIGRhdGEgdW50aWwgRU9GOyBibG9jayB1bnRpbCBjb25uZWN0aW9uIGNsb3NlZC4iIiIKKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICB3aGlsZSBub3Qgc2VsZi5lb2Y6CisgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIGJ1ZiA9IHNlbGYuY29va2VkcQorICAgICAgICBzZWxmLmNvb2tlZHEgPSAnJworICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgcmVhZF9zb21lKHNlbGYpOgorICAgICAgICAiIiJSZWFkIGF0IGxlYXN0IG9uZSBieXRlIG9mIGNvb2tlZCBkYXRhIHVubGVzcyBFT0YgaXMgaGl0LgorCisgICAgICAgIFJldHVybiAnJyBpZiBFT0YgaXMgaGl0LiAgQmxvY2sgaWYgbm8gZGF0YSBpcyBpbW1lZGlhdGVseQorICAgICAgICBhdmFpbGFibGUuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuY29va2VkcSBhbmQgbm90IHNlbGYuZW9mOgorICAgICAgICAgICAgc2VsZi5maWxsX3Jhd3EoKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICBidWYgPSBzZWxmLmNvb2tlZHEKKyAgICAgICAgc2VsZi5jb29rZWRxID0gJycKKyAgICAgICAgcmV0dXJuIGJ1ZgorCisgICAgZGVmIHJlYWRfdmVyeV9lYWdlcihzZWxmKToKKyAgICAgICAgIiIiUmVhZCBldmVyeXRoaW5nIHRoYXQncyBwb3NzaWJsZSB3aXRob3V0IGJsb2NraW5nIGluIEkvTyAoZWFnZXIpLgorCisgICAgICAgIFJhaXNlIEVPRkVycm9yIGlmIGNvbm5lY3Rpb24gY2xvc2VkIGFuZCBubyBjb29rZWQgZGF0YQorICAgICAgICBhdmFpbGFibGUuICBSZXR1cm4gJycgaWYgbm8gY29va2VkIGRhdGEgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyAgICAgICAgRG9uJ3QgYmxvY2sgdW5sZXNzIGluIHRoZSBtaWRzdCBvZiBhbiBJQUMgc2VxdWVuY2UuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuZW9mIGFuZCBzZWxmLnNvY2tfYXZhaWwoKToKKyAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKKyAgICAgICAgcmV0dXJuIHNlbGYucmVhZF92ZXJ5X2xhenkoKQorCisgICAgZGVmIHJlYWRfZWFnZXIoc2VsZik6CisgICAgICAgICIiIlJlYWQgcmVhZGlseSBhdmFpbGFibGUgZGF0YS4KKworICAgICAgICBSYWlzZSBFT0ZFcnJvciBpZiBjb25uZWN0aW9uIGNsb3NlZCBhbmQgbm8gY29va2VkIGRhdGEKKyAgICAgICAgYXZhaWxhYmxlLiAgUmV0dXJuICcnIGlmIG5vIGNvb2tlZCBkYXRhIGF2YWlsYWJsZSBvdGhlcndpc2UuCisgICAgICAgIERvbid0IGJsb2NrIHVubGVzcyBpbiB0aGUgbWlkc3Qgb2YgYW4gSUFDIHNlcXVlbmNlLgorCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLmNvb2tlZHEgYW5kIG5vdCBzZWxmLmVvZiBhbmQgc2VsZi5zb2NrX2F2YWlsKCk6CisgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgIHJldHVybiBzZWxmLnJlYWRfdmVyeV9sYXp5KCkKKworICAgIGRlZiByZWFkX2xhenkoc2VsZik6CisgICAgICAgICIiIlByb2Nlc3MgYW5kIHJldHVybiBkYXRhIHRoYXQncyBhbHJlYWR5IGluIHRoZSBxdWV1ZXMgKGxhenkpLgorCisgICAgICAgIFJhaXNlIEVPRkVycm9yIGlmIGNvbm5lY3Rpb24gY2xvc2VkIGFuZCBubyBkYXRhIGF2YWlsYWJsZS4KKyAgICAgICAgUmV0dXJuICcnIGlmIG5vIGNvb2tlZCBkYXRhIGF2YWlsYWJsZSBvdGhlcndpc2UuICBEb24ndCBibG9jaworICAgICAgICB1bmxlc3MgaW4gdGhlIG1pZHN0IG9mIGFuIElBQyBzZXF1ZW5jZS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICByZXR1cm4gc2VsZi5yZWFkX3ZlcnlfbGF6eSgpCisKKyAgICBkZWYgcmVhZF92ZXJ5X2xhenkoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbnkgZGF0YSBhdmFpbGFibGUgaW4gdGhlIGNvb2tlZCBxdWV1ZSAodmVyeSBsYXp5KS4KKworICAgICAgICBSYWlzZSBFT0ZFcnJvciBpZiBjb25uZWN0aW9uIGNsb3NlZCBhbmQgbm8gZGF0YSBhdmFpbGFibGUuCisgICAgICAgIFJldHVybiAnJyBpZiBubyBjb29rZWQgZGF0YSBhdmFpbGFibGUgb3RoZXJ3aXNlLiAgRG9uJ3QgYmxvY2suCisKKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHNlbGYuY29va2VkcQorICAgICAgICBzZWxmLmNvb2tlZHEgPSAnJworICAgICAgICBpZiBub3QgYnVmIGFuZCBzZWxmLmVvZiBhbmQgbm90IHNlbGYucmF3cToKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yLCAndGVsbmV0IGNvbm5lY3Rpb24gY2xvc2VkJworICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgcmVhZF9zYl9kYXRhKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYW55IGRhdGEgYXZhaWxhYmxlIGluIHRoZSBTQiAuLi4gU0UgcXVldWUuCisKKyAgICAgICAgUmV0dXJuICcnIGlmIG5vIFNCIC4uLiBTRSBhdmFpbGFibGUuIFNob3VsZCBvbmx5IGJlIGNhbGxlZAorICAgICAgICBhZnRlciBzZWVpbmcgYSBTQiBvciBTRSBjb21tYW5kLiBXaGVuIGEgbmV3IFNCIGNvbW1hbmQgaXMKKyAgICAgICAgZm91bmQsIG9sZCB1bnJlYWQgU0IgZGF0YSB3aWxsIGJlIGRpc2NhcmRlZC4gRG9uJ3QgYmxvY2suCisKKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IHNlbGYuc2JkYXRhcQorICAgICAgICBzZWxmLnNiZGF0YXEgPSAnJworICAgICAgICByZXR1cm4gYnVmCisKKyAgICBkZWYgc2V0X29wdGlvbl9uZWdvdGlhdGlvbl9jYWxsYmFjayhzZWxmLCBjYWxsYmFjayk6CisgICAgICAgICIiIlByb3ZpZGUgYSBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgYWZ0ZXIgZWFjaCByZWNlaXB0IG9mIGEgdGVsbmV0IG9wdGlvbi4iIiIKKyAgICAgICAgc2VsZi5vcHRpb25fY2FsbGJhY2sgPSBjYWxsYmFjaworCisgICAgZGVmIHByb2Nlc3NfcmF3cShzZWxmKToKKyAgICAgICAgIiIiVHJhbnNmZXIgZnJvbSByYXcgcXVldWUgdG8gY29va2VkIHF1ZXVlLgorCisgICAgICAgIFNldCBzZWxmLmVvZiB3aGVuIGNvbm5lY3Rpb24gaXMgY2xvc2VkLiAgRG9uJ3QgYmxvY2sgdW5sZXNzIGluCisgICAgICAgIHRoZSBtaWRzdCBvZiBhbiBJQUMgc2VxdWVuY2UuCisKKyAgICAgICAgIiIiCisgICAgICAgIGJ1ZiA9IFsnJywgJyddCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIHNlbGYucmF3cToKKyAgICAgICAgICAgICAgICBjID0gc2VsZi5yYXdxX2dldGNoYXIoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmlhY3NlcToKKyAgICAgICAgICAgICAgICAgICAgaWYgYyA9PSB0aGVOVUxMOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaWYgYyA9PSAiXDAyMSI6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBpZiBjICE9IElBQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltzZWxmLnNiXSA9IGJ1ZltzZWxmLnNiXSArIGMKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlhY3NlcSArPSBjCisgICAgICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pYWNzZXEpID09IDE6CisgICAgICAgICAgICAgICAgICAgICMgJ0lBQzogSUFDIENNRCBbT1BUSU9OIG9ubHkgZm9yIFdJTEwvV09OVC9ETy9ET05UXScKKyAgICAgICAgICAgICAgICAgICAgaWYgYyBpbiAoRE8sIERPTlQsIFdJTEwsIFdPTlQpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pYWNzZXEgKz0gYworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgICAgICBzZWxmLmlhY3NlcSA9ICcnCisgICAgICAgICAgICAgICAgICAgIGlmIGMgPT0gSUFDOgorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW3NlbGYuc2JdID0gYnVmW3NlbGYuc2JdICsgYworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYyA9PSBTQjogIyBTQiAuLi4gU0Ugc3RhcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zYiA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNiZGF0YXEgPSAnJworICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBjID09IFNFOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2IgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zYmRhdGFxID0gc2VsZi5zYmRhdGFxICsgYnVmWzFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmWzFdID0gJycKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub3B0aW9uX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgQ2FsbGJhY2sgaXMgc3VwcG9zZWQgdG8gbG9vayBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgc2JkYXRhcQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uX2NhbGxiYWNrKHNlbGYuc29jaywgYywgTk9PUFQpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgV2UgY2FuJ3Qgb2ZmZXIgYXV0b21hdGljIHByb2Nlc3Npbmcgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN1Ym9wdGlvbnMuIEFsYXMsIHdlIHNob3VsZCBub3QgZ2V0IGFueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5sZXNzIHdlIGRpZCBhIFdJTEwvRE8gYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXNnKCdJQUMgJWQgbm90IHJlY29nbml6ZWQnICUgb3JkKGMpKQorICAgICAgICAgICAgICAgIGVsaWYgbGVuKHNlbGYuaWFjc2VxKSA9PSAyOgorICAgICAgICAgICAgICAgICAgICBjbWQgPSBzZWxmLmlhY3NlcVsxXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmlhY3NlcSA9ICcnCisgICAgICAgICAgICAgICAgICAgIG9wdCA9IGMKKyAgICAgICAgICAgICAgICAgICAgaWYgY21kIGluIChETywgRE9OVCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1zZygnSUFDICVzICVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWQgPT0gRE8gYW5kICdETycgb3IgJ0RPTlQnLCBvcmQob3B0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub3B0aW9uX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uX2NhbGxiYWNrKHNlbGYuc29jaywgY21kLCBvcHQpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKElBQyArIFdPTlQgKyBvcHQpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgY21kIGluIChXSUxMLCBXT05UKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXNnKCdJQUMgJXMgJWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZCA9PSBXSUxMIGFuZCAnV0lMTCcgb3IgJ1dPTlQnLCBvcmQob3B0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYub3B0aW9uX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3B0aW9uX2NhbGxiYWNrKHNlbGYuc29jaywgY21kLCBvcHQpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc29jay5zZW5kYWxsKElBQyArIERPTlQgKyBvcHQpCisgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjogIyByYWlzZWQgYnkgc2VsZi5yYXdxX2dldGNoYXIoKQorICAgICAgICAgICAgc2VsZi5pYWNzZXEgPSAnJyAjIFJlc2V0IG9uIEVPRgorICAgICAgICAgICAgc2VsZi5zYiA9IDAKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxICsgYnVmWzBdCisgICAgICAgIHNlbGYuc2JkYXRhcSA9IHNlbGYuc2JkYXRhcSArIGJ1ZlsxXQorCisgICAgZGVmIHJhd3FfZ2V0Y2hhcihzZWxmKToKKyAgICAgICAgIiIiR2V0IG5leHQgY2hhciBmcm9tIHJhdyBxdWV1ZS4KKworICAgICAgICBCbG9jayBpZiBubyBkYXRhIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4gIFJhaXNlIEVPRkVycm9yCisgICAgICAgIHdoZW4gY29ubmVjdGlvbiBpcyBjbG9zZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnJhd3E6CisgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICBpZiBzZWxmLmVvZjoKKyAgICAgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICBjID0gc2VsZi5yYXdxW3NlbGYuaXJhd3FdCisgICAgICAgIHNlbGYuaXJhd3EgPSBzZWxmLmlyYXdxICsgMQorICAgICAgICBpZiBzZWxmLmlyYXdxID49IGxlbihzZWxmLnJhd3EpOgorICAgICAgICAgICAgc2VsZi5yYXdxID0gJycKKyAgICAgICAgICAgIHNlbGYuaXJhd3EgPSAwCisgICAgICAgIHJldHVybiBjCisKKyAgICBkZWYgZmlsbF9yYXdxKHNlbGYpOgorICAgICAgICAiIiJGaWxsIHJhdyBxdWV1ZSBmcm9tIGV4YWN0bHkgb25lIHJlY3YoKSBzeXN0ZW0gY2FsbC4KKworICAgICAgICBCbG9jayBpZiBubyBkYXRhIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4gIFNldCBzZWxmLmVvZiB3aGVuCisgICAgICAgIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmlyYXdxID49IGxlbihzZWxmLnJhd3EpOgorICAgICAgICAgICAgc2VsZi5yYXdxID0gJycKKyAgICAgICAgICAgIHNlbGYuaXJhd3EgPSAwCisgICAgICAgICMgVGhlIGJ1ZmZlciBzaXplIHNob3VsZCBiZSBmYWlybHkgc21hbGwgc28gYXMgdG8gYXZvaWQgcXVhZHJhdGljCisgICAgICAgICMgYmVoYXZpb3IgaW4gcHJvY2Vzc19yYXdxKCkgYWJvdmUKKyAgICAgICAgYnVmID0gc2VsZi5zb2NrLnJlY3YoNTApCisgICAgICAgIHNlbGYubXNnKCJyZWN2ICVyIiwgYnVmKQorICAgICAgICBzZWxmLmVvZiA9IChub3QgYnVmKQorICAgICAgICBzZWxmLnJhd3EgPSBzZWxmLnJhd3EgKyBidWYKKworICAgIGRlZiBzb2NrX2F2YWlsKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHdoZXRoZXIgZGF0YSBpcyBhdmFpbGFibGUgb24gdGhlIHNvY2tldC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGVjdC5zZWxlY3QoW3NlbGZdLCBbXSwgW10sIDApID09IChbc2VsZl0sIFtdLCBbXSkKKworICAgIGRlZiBpbnRlcmFjdChzZWxmKToKKyAgICAgICAgIiIiSW50ZXJhY3Rpb24gZnVuY3Rpb24sIGVtdWxhdGVzIGEgdmVyeSBkdW1iIHRlbG5ldCBjbGllbnQuIiIiCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICAgICAgICAgc2VsZi5tdF9pbnRlcmFjdCgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHJmZCwgd2ZkLCB4ZmQgPSBzZWxlY3Quc2VsZWN0KFtzZWxmLCBzeXMuc3RkaW5dLCBbXSwgW10pCisgICAgICAgICAgICBpZiBzZWxmIGluIHJmZDoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLnJlYWRfZWFnZXIoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyoqKiBDb25uZWN0aW9uIGNsb3NlZCBieSByZW1vdGUgaG9zdCAqKionCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSh0ZXh0KQorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgIGlmIHN5cy5zdGRpbiBpbiByZmQ6CisgICAgICAgICAgICAgICAgbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZShsaW5lKQorCisgICAgZGVmIG10X2ludGVyYWN0KHNlbGYpOgorICAgICAgICAiIiJNdWx0aXRocmVhZGVkIHZlcnNpb24gb2YgaW50ZXJhY3QoKS4iIiIKKyAgICAgICAgaW1wb3J0IHRocmVhZAorICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZChzZWxmLmxpc3RlbmVyLCAoKSkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYud3JpdGUobGluZSkKKworICAgIGRlZiBsaXN0ZW5lcihzZWxmKToKKyAgICAgICAgIiIiSGVscGVyIGZvciBtdF9pbnRlcmFjdCgpIC0tIHRoaXMgZXhlY3V0ZXMgaW4gdGhlIG90aGVyIHRocmVhZC4iIiIKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWFkX2VhZ2VyKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBwcmludCAnKioqIENvbm5lY3Rpb24gY2xvc2VkIGJ5IHJlbW90ZSBob3N0ICoqKicKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShkYXRhKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKworICAgIGRlZiBleHBlY3Qoc2VsZiwgbGlzdCwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiUmVhZCB1bnRpbCBvbmUgZnJvbSBhIGxpc3Qgb2YgYSByZWd1bGFyIGV4cHJlc3Npb25zIG1hdGNoZXMuCisKKyAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgbGlzdCBvZiByZWd1bGFyIGV4cHJlc3Npb25zLCBlaXRoZXIKKyAgICAgICAgY29tcGlsZWQgKHJlLlJlZ2V4T2JqZWN0IGluc3RhbmNlcykgb3IgdW5jb21waWxlZCAoc3RyaW5ncykuCisgICAgICAgIFRoZSBvcHRpb25hbCBzZWNvbmQgYXJndW1lbnQgaXMgYSB0aW1lb3V0LCBpbiBzZWNvbmRzOyBkZWZhdWx0CisgICAgICAgIGlzIG5vIHRpbWVvdXQuCisKKyAgICAgICAgUmV0dXJuIGEgdHVwbGUgb2YgdGhyZWUgaXRlbXM6IHRoZSBpbmRleCBpbiB0aGUgbGlzdCBvZiB0aGUKKyAgICAgICAgZmlyc3QgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlczsgdGhlIG1hdGNoIG9iamVjdAorICAgICAgICByZXR1cm5lZDsgYW5kIHRoZSB0ZXh0IHJlYWQgdXAgdGlsbCBhbmQgaW5jbHVkaW5nIHRoZSBtYXRjaC4KKworICAgICAgICBJZiBFT0YgaXMgcmVhZCBhbmQgbm8gdGV4dCB3YXMgcmVhZCwgcmFpc2UgRU9GRXJyb3IuCisgICAgICAgIE90aGVyd2lzZSwgd2hlbiBub3RoaW5nIG1hdGNoZXMsIHJldHVybiAoLTEsIE5vbmUsIHRleHQpIHdoZXJlCisgICAgICAgIHRleHQgaXMgdGhlIHRleHQgcmVjZWl2ZWQgc28gZmFyIChtYXkgYmUgdGhlIGVtcHR5IHN0cmluZyBpZiBhCisgICAgICAgIHRpbWVvdXQgaGFwcGVuZWQpLgorCisgICAgICAgIElmIGEgcmVndWxhciBleHByZXNzaW9uIGVuZHMgd2l0aCBhIGdyZWVkeSBtYXRjaCAoZS5nLiAnLionKQorICAgICAgICBvciBpZiBtb3JlIHRoYW4gb25lIGV4cHJlc3Npb24gY2FuIG1hdGNoIHRoZSBzYW1lIGlucHV0LCB0aGUKKyAgICAgICAgcmVzdWx0cyBhcmUgdW5kZXRlcm1pbmlzdGljLCBhbmQgbWF5IGRlcGVuZCBvbiB0aGUgSS9PIHRpbWluZy4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi5faGFzX3BvbGw6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZXhwZWN0X3dpdGhfcG9sbChsaXN0LCB0aW1lb3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2V4cGVjdF93aXRoX3NlbGVjdChsaXN0LCB0aW1lb3V0KQorCisgICAgZGVmIF9leHBlY3Rfd2l0aF9wb2xsKHNlbGYsIGV4cGVjdF9saXN0LCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJSZWFkIHVudGlsIG9uZSBmcm9tIGEgbGlzdCBvZiBhIHJlZ3VsYXIgZXhwcmVzc2lvbnMgbWF0Y2hlcy4KKworICAgICAgICBUaGlzIG1ldGhvZCB1c2VzIHNlbGVjdC5wb2xsKCkgdG8gaW1wbGVtZW50IHRoZSB0aW1lb3V0LgorICAgICAgICAiIiIKKyAgICAgICAgcmUgPSBOb25lCisgICAgICAgIGV4cGVjdF9saXN0ID0gZXhwZWN0X2xpc3RbOl0KKyAgICAgICAgaW5kaWNlcyA9IHJhbmdlKGxlbihleHBlY3RfbGlzdCkpCisgICAgICAgIGZvciBpIGluIGluZGljZXM6CisgICAgICAgICAgICBpZiBub3QgaGFzYXR0cihleHBlY3RfbGlzdFtpXSwgInNlYXJjaCIpOgorICAgICAgICAgICAgICAgIGlmIG5vdCByZTogaW1wb3J0IHJlCisgICAgICAgICAgICAgICAgZXhwZWN0X2xpc3RbaV0gPSByZS5jb21waWxlKGV4cGVjdF9saXN0W2ldKQorICAgICAgICBjYWxsX3RpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSB0aW1lKCkKKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICBtID0gTm9uZQorICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgbSA9IGV4cGVjdF9saXN0W2ldLnNlYXJjaChzZWxmLmNvb2tlZHEpCisgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgIGUgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgdGV4dCA9IHNlbGYuY29va2VkcVs6ZV0KKyAgICAgICAgICAgICAgICBzZWxmLmNvb2tlZHEgPSBzZWxmLmNvb2tlZHFbZTpdCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgaWYgbm90IG06CisgICAgICAgICAgICBwb2xsZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgICAgICBwb2xsX2luX29yX3ByaW9yaXR5X2ZsYWdzID0gc2VsZWN0LlBPTExJTiB8IHNlbGVjdC5QT0xMUFJJCisgICAgICAgICAgICBwb2xsZXIucmVnaXN0ZXIoc2VsZiwgcG9sbF9pbl9vcl9wcmlvcml0eV9mbGFncykKKyAgICAgICAgICAgIHdoaWxlIG5vdCBtIGFuZCBub3Qgc2VsZi5lb2Y6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZWFkeSA9IHBvbGxlci5wb2xsKGNhbGxfdGltZW91dCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZWN0LmVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsYXBzZWQgPSB0aW1lKCkgLSB0aW1lX3N0YXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbF90aW1lb3V0ID0gdGltZW91dC1lbGFwc2VkCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGZvciBmZCwgbW9kZSBpbiByZWFkeToKKyAgICAgICAgICAgICAgICAgICAgaWYgbW9kZSAmIHBvbGxfaW5fb3JfcHJpb3JpdHlfZmxhZ3M6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGxfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfcmF3cSgpCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBleHBlY3RfbGlzdFtpXS5zZWFyY2goc2VsZi5jb29rZWRxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmNvb2tlZHFbOmVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtlOl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBlbGFwc2VkID0gdGltZSgpIC0gdGltZV9zdGFydAorICAgICAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBjYWxsX3RpbWVvdXQgPSB0aW1lb3V0LWVsYXBzZWQKKyAgICAgICAgICAgIHBvbGxlci51bnJlZ2lzdGVyKHNlbGYpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICByZXR1cm4gKGksIG0sIHRleHQpCisgICAgICAgIHRleHQgPSBzZWxmLnJlYWRfdmVyeV9sYXp5KCkKKyAgICAgICAgaWYgbm90IHRleHQgYW5kIHNlbGYuZW9mOgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgcmV0dXJuICgtMSwgTm9uZSwgdGV4dCkKKworICAgIGRlZiBfZXhwZWN0X3dpdGhfc2VsZWN0KHNlbGYsIGxpc3QsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICIiIlJlYWQgdW50aWwgb25lIGZyb20gYSBsaXN0IG9mIGEgcmVndWxhciBleHByZXNzaW9ucyBtYXRjaGVzLgorCisgICAgICAgIFRoZSB0aW1lb3V0IGlzIGltcGxlbWVudGVkIHVzaW5nIHNlbGVjdC5zZWxlY3QoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJlID0gTm9uZQorICAgICAgICBsaXN0ID0gbGlzdFs6XQorICAgICAgICBpbmRpY2VzID0gcmFuZ2UobGVuKGxpc3QpKQorICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIobGlzdFtpXSwgInNlYXJjaCIpOgorICAgICAgICAgICAgICAgIGlmIG5vdCByZTogaW1wb3J0IHJlCisgICAgICAgICAgICAgICAgbGlzdFtpXSA9IHJlLmNvbXBpbGUobGlzdFtpXSkKKyAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICAgICAgdGltZV9zdGFydCA9IHRpbWUoKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgc2VsZi5wcm9jZXNzX3Jhd3EoKQorICAgICAgICAgICAgZm9yIGkgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICBtID0gbGlzdFtpXS5zZWFyY2goc2VsZi5jb29rZWRxKQorICAgICAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgICAgIGUgPSBtLmVuZCgpCisgICAgICAgICAgICAgICAgICAgIHRleHQgPSBzZWxmLmNvb2tlZHFbOmVdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29va2VkcSA9IHNlbGYuY29va2VkcVtlOl0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpLCBtLCB0ZXh0KQorICAgICAgICAgICAgaWYgc2VsZi5lb2Y6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc19hcmdzID0gKFtzZWxmLmZpbGVubygpXSwgW10sIFtdLCB0aW1lb3V0LWVsYXBzZWQpCisgICAgICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoKnNfYXJncykKKyAgICAgICAgICAgICAgICBpZiBub3QgcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKKyAgICAgICAgdGV4dCA9IHNlbGYucmVhZF92ZXJ5X2xhenkoKQorICAgICAgICBpZiBub3QgdGV4dCBhbmQgc2VsZi5lb2Y6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICByZXR1cm4gKC0xLCBOb25lLCB0ZXh0KQorCisKK2RlZiB0ZXN0KCk6CisgICAgIiIiVGVzdCBwcm9ncmFtIGZvciB0ZWxuZXRsaWIuCisKKyAgICBVc2FnZTogcHl0aG9uIHRlbG5ldGxpYi5weSBbLWRdIC4uLiBbaG9zdCBbcG9ydF1dCisKKyAgICBEZWZhdWx0IGhvc3QgaXMgbG9jYWxob3N0OyBkZWZhdWx0IHBvcnQgaXMgMjMuCisKKyAgICAiIiIKKyAgICBkZWJ1Z2xldmVsID0gMAorICAgIHdoaWxlIHN5cy5hcmd2WzE6XSBhbmQgc3lzLmFyZ3ZbMV0gPT0gJy1kJzoKKyAgICAgICAgZGVidWdsZXZlbCA9IGRlYnVnbGV2ZWwrMQorICAgICAgICBkZWwgc3lzLmFyZ3ZbMV0KKyAgICBob3N0ID0gJ2xvY2FsaG9zdCcKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgIGhvc3QgPSBzeXMuYXJndlsxXQorICAgIHBvcnQgPSAwCisgICAgaWYgc3lzLmFyZ3ZbMjpdOgorICAgICAgICBwb3J0c3RyID0gc3lzLmFyZ3ZbMl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcG9ydCA9IGludChwb3J0c3RyKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBvcnQgPSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShwb3J0c3RyLCAndGNwJykKKyAgICB0biA9IFRlbG5ldCgpCisgICAgdG4uc2V0X2RlYnVnbGV2ZWwoZGVidWdsZXZlbCkKKyAgICB0bi5vcGVuKGhvc3QsIHBvcnQsIHRpbWVvdXQ9MC41KQorICAgIHRuLmludGVyYWN0KCkKKyAgICB0bi5jbG9zZSgpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RlbG5ldGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3RlbG5ldGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZjdiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RlbG5ldGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3RlbG5ldGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZjdiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVsbmV0bGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RlbXBmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZW1wZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmRkYmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZW1wZmlsZS5weQpAQCAtMCwwICsxLDYxOCBAQAorIiIiVGVtcG9yYXJ5IGZpbGVzLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBnZW5lcmljLCBsb3ctIGFuZCBoaWdoLWxldmVsIGludGVyZmFjZXMgZm9yCitjcmVhdGluZyB0ZW1wb3JhcnkgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLiAgVGhlIGludGVyZmFjZXMgbGlzdGVkCithcyAic2FmZSIganVzdCBiZWxvdyBjYW4gYmUgdXNlZCB3aXRob3V0IGZlYXIgb2YgcmFjZSBjb25kaXRpb25zLgorVGhvc2UgbGlzdGVkIGFzICJ1bnNhZmUiIGNhbm5vdCwgYW5kIGFyZSBwcm92aWRlZCBmb3IgYmFja3dhcmQKK2NvbXBhdGliaWxpdHkgb25seS4KKworVGhpcyBtb2R1bGUgYWxzbyBwcm92aWRlcyBzb21lIGRhdGEgaXRlbXMgdG8gdGhlIHVzZXI6CisKKyAgVE1QX01BWCAgLSBtYXhpbXVtIG51bWJlciBvZiBuYW1lcyB0aGF0IHdpbGwgYmUgdHJpZWQgYmVmb3JlCisgICAgICAgICAgICAgZ2l2aW5nIHVwLgorICB0ZW1wbGF0ZSAtIHRoZSBkZWZhdWx0IHByZWZpeCBmb3IgYWxsIHRlbXBvcmFyeSBuYW1lcy4KKyAgICAgICAgICAgICBZb3UgbWF5IGNoYW5nZSB0aGlzIHRvIGNvbnRyb2wgdGhlIGRlZmF1bHQgcHJlZml4LgorICB0ZW1wZGlyICAtIElmIHRoaXMgaXMgc2V0IHRvIGEgc3RyaW5nIGJlZm9yZSB0aGUgZmlyc3QgdXNlIG9mCisgICAgICAgICAgICAgYW55IHJvdXRpbmUgZnJvbSB0aGlzIG1vZHVsZSwgaXQgd2lsbCBiZSBjb25zaWRlcmVkIGFzCisgICAgICAgICAgICAgYW5vdGhlciBjYW5kaWRhdGUgbG9jYXRpb24gdG8gc3RvcmUgdGVtcG9yYXJ5IGZpbGVzLgorIiIiCisKK19fYWxsX18gPSBbCisgICAgIk5hbWVkVGVtcG9yYXJ5RmlsZSIsICJUZW1wb3JhcnlGaWxlIiwgIyBoaWdoIGxldmVsIHNhZmUgaW50ZXJmYWNlcworICAgICJTcG9vbGVkVGVtcG9yYXJ5RmlsZSIsCisgICAgIm1rc3RlbXAiLCAibWtkdGVtcCIsICAgICAgICAgICAgICAgICAgIyBsb3cgbGV2ZWwgc2FmZSBpbnRlcmZhY2VzCisgICAgIm1rdGVtcCIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkZXByZWNhdGVkIHVuc2FmZSBpbnRlcmZhY2UKKyAgICAiVE1QX01BWCIsICJnZXR0ZW1wcHJlZml4IiwgICAgICAgICAgICAjIGNvbnN0YW50cworICAgICJ0ZW1wZGlyIiwgImdldHRlbXBkaXIiCisgICBdCisKKworIyBJbXBvcnRzLgorCitpbXBvcnQgaW8gYXMgX2lvCitpbXBvcnQgb3MgYXMgX29zCitpbXBvcnQgZXJybm8gYXMgX2Vycm5vCitmcm9tIHJhbmRvbSBpbXBvcnQgUmFuZG9tIGFzIF9SYW5kb20KKwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTyBhcyBfU3RyaW5nSU8KKwordHJ5OgorICAgIGltcG9ydCBmY250bCBhcyBfZmNudGwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkZWYgX3NldF9jbG9leGVjKGZkKToKKyAgICAgICAgcGFzcworZWxzZToKKyAgICBkZWYgX3NldF9jbG9leGVjKGZkKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmxhZ3MgPSBfZmNudGwuZmNudGwoZmQsIF9mY250bC5GX0dFVEZELCAwKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZmxhZ3MgcmVhZCBzdWNjZXNzZnVsbHksIG1vZGlmeQorICAgICAgICAgICAgZmxhZ3MgfD0gX2ZjbnRsLkZEX0NMT0VYRUMKKyAgICAgICAgICAgIF9mY250bC5mY250bChmZCwgX2ZjbnRsLkZfU0VURkQsIGZsYWdzKQorCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkIGFzIF90aHJlYWQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgZHVtbXlfdGhyZWFkIGFzIF90aHJlYWQKK19hbGxvY2F0ZV9sb2NrID0gX3RocmVhZC5hbGxvY2F0ZV9sb2NrCisKK190ZXh0X29wZW5mbGFncyA9IF9vcy5PX1JEV1IgfCBfb3MuT19DUkVBVCB8IF9vcy5PX0VYQ0wKK2lmIGhhc2F0dHIoX29zLCAnT19OT0lOSEVSSVQnKToKKyAgICBfdGV4dF9vcGVuZmxhZ3MgfD0gX29zLk9fTk9JTkhFUklUCitpZiBoYXNhdHRyKF9vcywgJ09fTk9GT0xMT1cnKToKKyAgICBfdGV4dF9vcGVuZmxhZ3MgfD0gX29zLk9fTk9GT0xMT1cKKworX2Jpbl9vcGVuZmxhZ3MgPSBfdGV4dF9vcGVuZmxhZ3MKK2lmIGhhc2F0dHIoX29zLCAnT19CSU5BUlknKToKKyAgICBfYmluX29wZW5mbGFncyB8PSBfb3MuT19CSU5BUlkKKworaWYgaGFzYXR0cihfb3MsICdUTVBfTUFYJyk6CisgICAgVE1QX01BWCA9IF9vcy5UTVBfTUFYCitlbHNlOgorICAgIFRNUF9NQVggPSAxMDAwMAorCit0ZW1wbGF0ZSA9ICJ0bXAiCisKKyMgSW50ZXJuYWwgcm91dGluZXMuCisKK19vbmNlX2xvY2sgPSBfYWxsb2NhdGVfbG9jaygpCisKK2lmIGhhc2F0dHIoX29zLCAibHN0YXQiKToKKyAgICBfc3RhdCA9IF9vcy5sc3RhdAorZWxpZiBoYXNhdHRyKF9vcywgInN0YXQiKToKKyAgICBfc3RhdCA9IF9vcy5zdGF0CitlbHNlOgorICAgICMgRmFsbGJhY2suICBBbGwgd2UgbmVlZCBpcyBzb21ldGhpbmcgdGhhdCByYWlzZXMgb3MuZXJyb3IgaWYgdGhlCisgICAgIyBmaWxlIGRvZXNuJ3QgZXhpc3QuCisgICAgZGVmIF9zdGF0KGZuKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4oZm4pCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcmFpc2UgX29zLmVycm9yCisgICAgICAgIGYuY2xvc2UoKQorCitkZWYgX2V4aXN0cyhmbik6CisgICAgdHJ5OgorICAgICAgICBfc3RhdChmbikKKyAgICBleGNlcHQgX29zLmVycm9yOgorICAgICAgICByZXR1cm4gRmFsc2UKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gVHJ1ZQorCitjbGFzcyBfUmFuZG9tTmFtZVNlcXVlbmNlOgorICAgICIiIkFuIGluc3RhbmNlIG9mIF9SYW5kb21OYW1lU2VxdWVuY2UgZ2VuZXJhdGVzIGFuIGVuZGxlc3MKKyAgICBzZXF1ZW5jZSBvZiB1bnByZWRpY3RhYmxlIHN0cmluZ3Mgd2hpY2ggY2FuIHNhZmVseSBiZSBpbmNvcnBvcmF0ZWQKKyAgICBpbnRvIGZpbGUgbmFtZXMuICBFYWNoIHN0cmluZyBpcyBzaXggY2hhcmFjdGVycyBsb25nLiAgTXVsdGlwbGUKKyAgICB0aHJlYWRzIGNhbiBzYWZlbHkgdXNlIHRoZSBzYW1lIGluc3RhbmNlIGF0IHRoZSBzYW1lIHRpbWUuCisKKyAgICBfUmFuZG9tTmFtZVNlcXVlbmNlIGlzIGFuIGl0ZXJhdG9yLiIiIgorCisgICAgY2hhcmFjdGVycyA9ICgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiICsKKyAgICAgICAgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIgKworICAgICAgICAgICAgICAgICAgIjAxMjM0NTY3ODlfIikKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5tdXRleCA9IF9hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgc2VsZi5ub3JtY2FzZSA9IF9vcy5wYXRoLm5vcm1jYXNlCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcm5nKHNlbGYpOgorICAgICAgICBjdXJfcGlkID0gX29zLmdldHBpZCgpCisgICAgICAgIGlmIGN1cl9waWQgIT0gZ2V0YXR0cihzZWxmLCAnX3JuZ19waWQnLCBOb25lKToKKyAgICAgICAgICAgIHNlbGYuX3JuZyA9IF9SYW5kb20oKQorICAgICAgICAgICAgc2VsZi5fcm5nX3BpZCA9IGN1cl9waWQKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JuZworCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIG0gPSBzZWxmLm11dGV4CisgICAgICAgIGMgPSBzZWxmLmNoYXJhY3RlcnMKKyAgICAgICAgY2hvb3NlID0gc2VsZi5ybmcuY2hvaWNlCisKKyAgICAgICAgbS5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGV0dGVycyA9IFtjaG9vc2UoYykgZm9yIGR1bW15IGluICIxMjM0NTYiXQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbS5yZWxlYXNlKCkKKworICAgICAgICByZXR1cm4gc2VsZi5ub3JtY2FzZSgnJy5qb2luKGxldHRlcnMpKQorCitkZWYgX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QoKToKKyAgICAiIiJHZW5lcmF0ZSBhIGxpc3Qgb2YgY2FuZGlkYXRlIHRlbXBvcmFyeSBkaXJlY3RvcmllcyB3aGljaAorICAgIF9nZXRfZGVmYXVsdF90ZW1wZGlyIHdpbGwgdHJ5LiIiIgorCisgICAgZGlybGlzdCA9IFtdCisKKyAgICAjIEZpcnN0LCB0cnkgdGhlIGVudmlyb25tZW50LgorICAgIGZvciBlbnZuYW1lIGluICdUTVBESVInLCAnVEVNUCcsICdUTVAnOgorICAgICAgICBkaXJuYW1lID0gX29zLmdldGVudihlbnZuYW1lKQorICAgICAgICBpZiBkaXJuYW1lOiBkaXJsaXN0LmFwcGVuZChkaXJuYW1lKQorCisgICAgIyBGYWlsaW5nIHRoYXQsIHRyeSBPUy1zcGVjaWZpYyBsb2NhdGlvbnMuCisgICAgaWYgX29zLm5hbWUgPT0gJ3Jpc2Nvcyc6CisgICAgICAgIGRpcm5hbWUgPSBfb3MuZ2V0ZW52KCdXaW1wJFNjcmFwRGlyJykKKyAgICAgICAgaWYgZGlybmFtZTogZGlybGlzdC5hcHBlbmQoZGlybmFtZSkKKyAgICBlbGlmIF9vcy5uYW1lID09ICdudCc6CisgICAgICAgIGRpcmxpc3QuZXh0ZW5kKFsgcidjOlx0ZW1wJywgcidjOlx0bXAnLCByJ1x0ZW1wJywgcidcdG1wJyBdKQorICAgIGVsc2U6CisgICAgICAgIGRpcmxpc3QuZXh0ZW5kKFsgJy90bXAnLCAnL3Zhci90bXAnLCAnL3Vzci90bXAnIF0pCisKKyAgICAjIEFzIGEgbGFzdCByZXNvcnQsIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KKyAgICB0cnk6CisgICAgICAgIGRpcmxpc3QuYXBwZW5kKF9vcy5nZXRjd2QoKSkKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBfb3MuZXJyb3IpOgorICAgICAgICBkaXJsaXN0LmFwcGVuZChfb3MuY3VyZGlyKQorCisgICAgcmV0dXJuIGRpcmxpc3QKKworZGVmIF9nZXRfZGVmYXVsdF90ZW1wZGlyKCk6CisgICAgIiIiQ2FsY3VsYXRlIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSB0byB1c2UgZm9yIHRlbXBvcmFyeSBmaWxlcy4KKyAgICBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCisKKyAgICBXZSBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgYSBjYW5kaWRhdGUgdGVtcCBkaXIgaXMgdXNhYmxlIGJ5CisgICAgdHJ5aW5nIHRvIGNyZWF0ZSBhbmQgd3JpdGUgdG8gYSBmaWxlIGluIHRoYXQgZGlyZWN0b3J5LiAgSWYgdGhpcworICAgIGlzIHN1Y2Nlc3NmdWwsIHRoZSB0ZXN0IGZpbGUgaXMgZGVsZXRlZC4gIFRvIHByZXZlbnQgZGVuaWFsIG9mCisgICAgc2VydmljZSwgdGhlIG5hbWUgb2YgdGhlIHRlc3QgZmlsZSBtdXN0IGJlIHJhbmRvbWl6ZWQuIiIiCisKKyAgICBuYW1lciA9IF9SYW5kb21OYW1lU2VxdWVuY2UoKQorICAgIGRpcmxpc3QgPSBfY2FuZGlkYXRlX3RlbXBkaXJfbGlzdCgpCisgICAgZmxhZ3MgPSBfdGV4dF9vcGVuZmxhZ3MKKworICAgIGZvciBkaXIgaW4gZGlybGlzdDoKKyAgICAgICAgaWYgZGlyICE9IF9vcy5jdXJkaXI6CisgICAgICAgICAgICBkaXIgPSBfb3MucGF0aC5ub3JtY2FzZShfb3MucGF0aC5hYnNwYXRoKGRpcikpCisgICAgICAgICMgVHJ5IG9ubHkgYSBmZXcgbmFtZXMgcGVyIGRpcmVjdG9yeS4KKyAgICAgICAgZm9yIHNlcSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lci5uZXh0KCkKKyAgICAgICAgICAgIGZpbGVuYW1lID0gX29zLnBhdGguam9pbihkaXIsIG5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmQgPSBfb3Mub3BlbihmaWxlbmFtZSwgZmxhZ3MsIDBvNjAwKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBfaW8ub3BlbihmZCwgJ3diJywgY2xvc2VmZD1GYWxzZSkgYXMgZnA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnAud3JpdGUoYidibGF0JykKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIF9vcy5jbG9zZShmZCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBfb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBkaXIKKyAgICAgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlLmFyZ3NbMF0gIT0gX2Vycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgIyBubyBwb2ludCB0cnlpbmcgbW9yZSBuYW1lcyBpbiB0aGlzIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIHBhc3MKKyAgICByYWlzZSBJT0Vycm9yLCAoX2Vycm5vLkVOT0VOVCwKKyAgICAgICAgICAgICAgICAgICAgKCJObyB1c2FibGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBmb3VuZCBpbiAlcyIgJSBkaXJsaXN0KSkKKworX25hbWVfc2VxdWVuY2UgPSBOb25lCisKK2RlZiBfZ2V0X2NhbmRpZGF0ZV9uYW1lcygpOgorICAgICIiIkNvbW1vbiBzZXR1cCBzZXF1ZW5jZSBmb3IgYWxsIHVzZXItY2FsbGFibGUgaW50ZXJmYWNlcy4iIiIKKworICAgIGdsb2JhbCBfbmFtZV9zZXF1ZW5jZQorICAgIGlmIF9uYW1lX3NlcXVlbmNlIGlzIE5vbmU6CisgICAgICAgIF9vbmNlX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIF9uYW1lX3NlcXVlbmNlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgX25hbWVfc2VxdWVuY2UgPSBfUmFuZG9tTmFtZVNlcXVlbmNlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIF9vbmNlX2xvY2sucmVsZWFzZSgpCisgICAgcmV0dXJuIF9uYW1lX3NlcXVlbmNlCisKKworZGVmIF9ta3N0ZW1wX2lubmVyKGRpciwgcHJlLCBzdWYsIGZsYWdzKToKKyAgICAiIiJDb2RlIGNvbW1vbiB0byBta3N0ZW1wLCBUZW1wb3JhcnlGaWxlLCBhbmQgTmFtZWRUZW1wb3JhcnlGaWxlLiIiIgorCisgICAgbmFtZXMgPSBfZ2V0X2NhbmRpZGF0ZV9uYW1lcygpCisKKyAgICBmb3Igc2VxIGluIHhyYW5nZShUTVBfTUFYKToKKyAgICAgICAgbmFtZSA9IG5hbWVzLm5leHQoKQorICAgICAgICBmaWxlID0gX29zLnBhdGguam9pbihkaXIsIHByZSArIG5hbWUgKyBzdWYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZkID0gX29zLm9wZW4oZmlsZSwgZmxhZ3MsIDA2MDApCisgICAgICAgICAgICBfc2V0X2Nsb2V4ZWMoZmQpCisgICAgICAgICAgICByZXR1cm4gKGZkLCBfb3MucGF0aC5hYnNwYXRoKGZpbGUpKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gX2Vycm5vLkVFWElTVDoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAjIHRyeSBhZ2FpbgorICAgICAgICAgICAgcmFpc2UKKworICAgIHJhaXNlIElPRXJyb3IsIChfZXJybm8uRUVYSVNULCAiTm8gdXNhYmxlIHRlbXBvcmFyeSBmaWxlIG5hbWUgZm91bmQiKQorCisKKyMgVXNlciB2aXNpYmxlIGludGVyZmFjZXMuCisKK2RlZiBnZXR0ZW1wcHJlZml4KCk6CisgICAgIiIiQWNjZXNzb3IgZm9yIHRlbXBkaXIudGVtcGxhdGUuIiIiCisgICAgcmV0dXJuIHRlbXBsYXRlCisKK3RlbXBkaXIgPSBOb25lCisKK2RlZiBnZXR0ZW1wZGlyKCk6CisgICAgIiIiQWNjZXNzb3IgZm9yIHRlbXBmaWxlLnRlbXBkaXIuIiIiCisgICAgZ2xvYmFsIHRlbXBkaXIKKyAgICBpZiB0ZW1wZGlyIGlzIE5vbmU6CisgICAgICAgIF9vbmNlX2xvY2suYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHRlbXBkaXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB0ZW1wZGlyID0gX2dldF9kZWZhdWx0X3RlbXBkaXIoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgX29uY2VfbG9jay5yZWxlYXNlKCkKKyAgICByZXR1cm4gdGVtcGRpcgorCitkZWYgbWtzdGVtcChzdWZmaXg9IiIsIHByZWZpeD10ZW1wbGF0ZSwgZGlyPU5vbmUsIHRleHQ9RmFsc2UpOgorICAgICIiIlVzZXItY2FsbGFibGUgZnVuY3Rpb24gdG8gY3JlYXRlIGFuZCByZXR1cm4gYSB1bmlxdWUgdGVtcG9yYXJ5CisgICAgZmlsZS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBwYWlyIChmZCwgbmFtZSkgd2hlcmUgZmQgaXMgdGhlCisgICAgZmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IG9zLm9wZW4sIGFuZCBuYW1lIGlzIHRoZSBmaWxlbmFtZS4KKworICAgIElmICdzdWZmaXgnIGlzIHNwZWNpZmllZCwgdGhlIGZpbGUgbmFtZSB3aWxsIGVuZCB3aXRoIHRoYXQgc3VmZml4LAorICAgIG90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIG5vIHN1ZmZpeC4KKworICAgIElmICdwcmVmaXgnIGlzIHNwZWNpZmllZCwgdGhlIGZpbGUgbmFtZSB3aWxsIGJlZ2luIHdpdGggdGhhdCBwcmVmaXgsCisgICAgb3RoZXJ3aXNlIGEgZGVmYXVsdCBwcmVmaXggaXMgdXNlZC4KKworICAgIElmICdkaXInIGlzIHNwZWNpZmllZCwgdGhlIGZpbGUgd2lsbCBiZSBjcmVhdGVkIGluIHRoYXQgZGlyZWN0b3J5LAorICAgIG90aGVyd2lzZSBhIGRlZmF1bHQgZGlyZWN0b3J5IGlzIHVzZWQuCisKKyAgICBJZiAndGV4dCcgaXMgc3BlY2lmaWVkIGFuZCB0cnVlLCB0aGUgZmlsZSBpcyBvcGVuZWQgaW4gdGV4dAorICAgIG1vZGUuICBFbHNlICh0aGUgZGVmYXVsdCkgdGhlIGZpbGUgaXMgb3BlbmVkIGluIGJpbmFyeSBtb2RlLiAgT24KKyAgICBzb21lIG9wZXJhdGluZyBzeXN0ZW1zLCB0aGlzIG1ha2VzIG5vIGRpZmZlcmVuY2UuCisKKyAgICBUaGUgZmlsZSBpcyByZWFkYWJsZSBhbmQgd3JpdGFibGUgb25seSBieSB0aGUgY3JlYXRpbmcgdXNlciBJRC4KKyAgICBJZiB0aGUgb3BlcmF0aW5nIHN5c3RlbSB1c2VzIHBlcm1pc3Npb24gYml0cyB0byBpbmRpY2F0ZSB3aGV0aGVyIGEKKyAgICBmaWxlIGlzIGV4ZWN1dGFibGUsIHRoZSBmaWxlIGlzIGV4ZWN1dGFibGUgYnkgbm8gb25lLiBUaGUgZmlsZQorICAgIGRlc2NyaXB0b3IgaXMgbm90IGluaGVyaXRlZCBieSBjaGlsZHJlbiBvZiB0aGlzIHByb2Nlc3MuCisKKyAgICBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZSBmaWxlIHdoZW4gZG9uZSB3aXRoIGl0LgorICAgICIiIgorCisgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgIGRpciA9IGdldHRlbXBkaXIoKQorCisgICAgaWYgdGV4dDoKKyAgICAgICAgZmxhZ3MgPSBfdGV4dF9vcGVuZmxhZ3MKKyAgICBlbHNlOgorICAgICAgICBmbGFncyA9IF9iaW5fb3BlbmZsYWdzCisKKyAgICByZXR1cm4gX21rc3RlbXBfaW5uZXIoZGlyLCBwcmVmaXgsIHN1ZmZpeCwgZmxhZ3MpCisKKworZGVmIG1rZHRlbXAoc3VmZml4PSIiLCBwcmVmaXg9dGVtcGxhdGUsIGRpcj1Ob25lKToKKyAgICAiIiJVc2VyLWNhbGxhYmxlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbmQgcmV0dXJuIGEgdW5pcXVlIHRlbXBvcmFyeQorICAgIGRpcmVjdG9yeS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHBhdGhuYW1lIG9mIHRoZSBkaXJlY3RvcnkuCisKKyAgICBBcmd1bWVudHMgYXJlIGFzIGZvciBta3N0ZW1wLCBleGNlcHQgdGhhdCB0aGUgJ3RleHQnIGFyZ3VtZW50IGlzCisgICAgbm90IGFjY2VwdGVkLgorCisgICAgVGhlIGRpcmVjdG9yeSBpcyByZWFkYWJsZSwgd3JpdGFibGUsIGFuZCBzZWFyY2hhYmxlIG9ubHkgYnkgdGhlCisgICAgY3JlYXRpbmcgdXNlci4KKworICAgIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgdGhlIGRpcmVjdG9yeSB3aGVuIGRvbmUgd2l0aCBpdC4KKyAgICAiIiIKKworICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICBkaXIgPSBnZXR0ZW1wZGlyKCkKKworICAgIG5hbWVzID0gX2dldF9jYW5kaWRhdGVfbmFtZXMoKQorCisgICAgZm9yIHNlcSBpbiB4cmFuZ2UoVE1QX01BWCk6CisgICAgICAgIG5hbWUgPSBuYW1lcy5uZXh0KCkKKyAgICAgICAgZmlsZSA9IF9vcy5wYXRoLmpvaW4oZGlyLCBwcmVmaXggKyBuYW1lICsgc3VmZml4KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfb3MubWtkaXIoZmlsZSwgMDcwMCkKKyAgICAgICAgICAgIHJldHVybiBmaWxlCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBfZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgdHJ5IGFnYWluCisgICAgICAgICAgICByYWlzZQorCisgICAgcmFpc2UgSU9FcnJvciwgKF9lcnJuby5FRVhJU1QsICJObyB1c2FibGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBuYW1lIGZvdW5kIikKKworZGVmIG1rdGVtcChzdWZmaXg9IiIsIHByZWZpeD10ZW1wbGF0ZSwgZGlyPU5vbmUpOgorICAgICIiIlVzZXItY2FsbGFibGUgZnVuY3Rpb24gdG8gcmV0dXJuIGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUuICBUaGUKKyAgICBmaWxlIGlzIG5vdCBjcmVhdGVkLgorCisgICAgQXJndW1lbnRzIGFyZSBhcyBmb3IgbWtzdGVtcCwgZXhjZXB0IHRoYXQgdGhlICd0ZXh0JyBhcmd1bWVudCBpcworICAgIG5vdCBhY2NlcHRlZC4KKworICAgIFRoaXMgZnVuY3Rpb24gaXMgdW5zYWZlIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuICBUaGUgZmlsZSBuYW1lCisgICAgcmVmZXJzIHRvIGEgZmlsZSB0aGF0IGRpZCBub3QgZXhpc3QgYXQgc29tZSBwb2ludCwgYnV0IGJ5IHRoZSB0aW1lCisgICAgeW91IGdldCBhcm91bmQgdG8gY3JlYXRpbmcgaXQsIHNvbWVvbmUgZWxzZSBtYXkgaGF2ZSBiZWF0ZW4geW91IHRvCisgICAgdGhlIHB1bmNoLgorICAgICIiIgorCisjIyAgICBmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJuIGFzIF93YXJuCisjIyAgICBfd2FybigibWt0ZW1wIGlzIGEgcG90ZW50aWFsIHNlY3VyaXR5IHJpc2sgdG8geW91ciBwcm9ncmFtIiwKKyMjICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nLCBzdGFja2xldmVsPTIpCisKKyAgICBpZiBkaXIgaXMgTm9uZToKKyAgICAgICAgZGlyID0gZ2V0dGVtcGRpcigpCisKKyAgICBuYW1lcyA9IF9nZXRfY2FuZGlkYXRlX25hbWVzKCkKKyAgICBmb3Igc2VxIGluIHhyYW5nZShUTVBfTUFYKToKKyAgICAgICAgbmFtZSA9IG5hbWVzLm5leHQoKQorICAgICAgICBmaWxlID0gX29zLnBhdGguam9pbihkaXIsIHByZWZpeCArIG5hbWUgKyBzdWZmaXgpCisgICAgICAgIGlmIG5vdCBfZXhpc3RzKGZpbGUpOgorICAgICAgICAgICAgcmV0dXJuIGZpbGUKKworICAgIHJhaXNlIElPRXJyb3IsIChfZXJybm8uRUVYSVNULCAiTm8gdXNhYmxlIHRlbXBvcmFyeSBmaWxlbmFtZSBmb3VuZCIpCisKKworY2xhc3MgX1RlbXBvcmFyeUZpbGVXcmFwcGVyOgorICAgICIiIlRlbXBvcmFyeSBmaWxlIHdyYXBwZXIKKworICAgIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBmaWxlcyBvcGVuZWQgZm9yCisgICAgdGVtcG9yYXJ5IHVzZS4gIEluIHBhcnRpY3VsYXIsIGl0IHNlZWtzIHRvIGF1dG9tYXRpY2FsbHkKKyAgICByZW1vdmUgdGhlIGZpbGUgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIG5hbWUsIGRlbGV0ZT1UcnVlKToKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuY2xvc2VfY2FsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5kZWxldGUgPSBkZWxldGUKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIyBBdHRyaWJ1dGUgbG9va3VwcyBhcmUgZGVsZWdhdGVkIHRvIHRoZSB1bmRlcmx5aW5nIGZpbGUKKyAgICAgICAgIyBhbmQgY2FjaGVkIGZvciBub24tbnVtZXJpYyByZXN1bHRzCisgICAgICAgICMgKGkuZS4gbWV0aG9kcyBhcmUgY2FjaGVkLCBjbG9zZWQgYW5kIGZyaWVuZHMgYXJlIG5vdCkKKyAgICAgICAgZmlsZSA9IHNlbGYuX19kaWN0X19bJ2ZpbGUnXQorICAgICAgICBhID0gZ2V0YXR0cihmaWxlLCBuYW1lKQorICAgICAgICBpZiBub3QgaXNzdWJjbGFzcyh0eXBlKGEpLCB0eXBlKDApKToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZSwgYSkKKyAgICAgICAgcmV0dXJuIGEKKworICAgICMgVGhlIHVuZGVybHlpbmcgX19lbnRlcl9fIG1ldGhvZCByZXR1cm5zIHRoZSB3cm9uZyBvYmplY3QKKyAgICAjIChzZWxmLmZpbGUpIHNvIG92ZXJyaWRlIGl0IHRvIHJldHVybiB0aGUgd3JhcHBlcgorICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuZmlsZS5fX2VudGVyX18oKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgIyBOVCBwcm92aWRlcyBkZWxldGUtb24tY2xvc2UgYXMgYSBwcmltaXRpdmUsIHNvIHdlIGRvbid0IG5lZWQKKyAgICAjIHRoZSB3cmFwcGVyIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwuICBXZSBzdGlsbCB1c2UgaXQgc28gdGhhdAorICAgICMgZmlsZS5uYW1lIGlzIHVzZWZ1bCAoaS5lLiBub3QgIihmZG9wZW4pIikgd2l0aCBOYW1lZFRlbXBvcmFyeUZpbGUuCisgICAgaWYgX29zLm5hbWUgIT0gJ250JzoKKyAgICAgICAgIyBDYWNoZSB0aGUgdW5saW5rZXIgc28gd2UgZG9uJ3QgZ2V0IHNwdXJpb3VzIGVycm9ycyBhdAorICAgICAgICAjIHNodXRkb3duIHdoZW4gdGhlIG1vZHVsZS1sZXZlbCAib3MiIGlzIE5vbmUnZCBvdXQuICBOb3RlCisgICAgICAgICMgdGhhdCB0aGlzIG11c3QgYmUgcmVmZXJlbmNlZCBhcyBzZWxmLnVubGluaywgYmVjYXVzZSB0aGUKKyAgICAgICAgIyBuYW1lIFRlbXBvcmFyeUZpbGVXcmFwcGVyIG1heSBhbHNvIGdldCBOb25lJ2Qgb3V0IGJlZm9yZQorICAgICAgICAjIF9fZGVsX18gaXMgY2FsbGVkLgorICAgICAgICB1bmxpbmsgPSBfb3MudW5saW5rCisKKyAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VfY2FsbGVkOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfY2FsbGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5kZWxldGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5saW5rKHNlbGYubmFtZSkKKworICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgICAgICMgTmVlZCB0byB0cmFwIF9fZXhpdF9fIGFzIHdlbGwgdG8gZW5zdXJlIHRoZSBmaWxlIGdldHMKKyAgICAgICAgIyBkZWxldGVkIHdoZW4gdXNlZCBpbiBhIHdpdGggc3RhdGVtZW50CisgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGMsIHZhbHVlLCB0Yik6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmZpbGUuX19leGl0X18oZXhjLCB2YWx1ZSwgdGIpCisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBlbHNlOgorICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjLCB2YWx1ZSwgdGIpOgorICAgICAgICAgICAgc2VsZi5maWxlLl9fZXhpdF9fKGV4YywgdmFsdWUsIHRiKQorCisKK2RlZiBOYW1lZFRlbXBvcmFyeUZpbGUobW9kZT0ndytiJywgYnVmc2l6ZT0tMSwgc3VmZml4PSIiLAorICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9dGVtcGxhdGUsIGRpcj1Ob25lLCBkZWxldGU9VHJ1ZSk6CisgICAgIiIiQ3JlYXRlIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICBBcmd1bWVudHM6CisgICAgJ3ByZWZpeCcsICdzdWZmaXgnLCAnZGlyJyAtLSBhcyBmb3IgbWtzdGVtcC4KKyAgICAnbW9kZScgLS0gdGhlIG1vZGUgYXJndW1lbnQgdG8gb3MuZmRvcGVuIChkZWZhdWx0ICJ3K2IiKS4KKyAgICAnYnVmc2l6ZScgLS0gdGhlIGJ1ZmZlciBzaXplIGFyZ3VtZW50IHRvIG9zLmZkb3BlbiAoZGVmYXVsdCAtMSkuCisgICAgJ2RlbGV0ZScgLS0gd2hldGhlciB0aGUgZmlsZSBpcyBkZWxldGVkIG9uIGNsb3NlIChkZWZhdWx0IFRydWUpLgorICAgIFRoZSBmaWxlIGlzIGNyZWF0ZWQgYXMgbWtzdGVtcCgpIHdvdWxkIGRvIGl0LgorCisgICAgUmV0dXJucyBhbiBvYmplY3Qgd2l0aCBhIGZpbGUtbGlrZSBpbnRlcmZhY2U7IHRoZSBuYW1lIG9mIHRoZSBmaWxlCisgICAgaXMgYWNjZXNzaWJsZSBhcyBmaWxlLm5hbWUuICBUaGUgZmlsZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZGVsZXRlZAorICAgIHdoZW4gaXQgaXMgY2xvc2VkIHVubGVzcyB0aGUgJ2RlbGV0ZScgYXJndW1lbnQgaXMgc2V0IHRvIEZhbHNlLgorICAgICIiIgorCisgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgIGRpciA9IGdldHRlbXBkaXIoKQorCisgICAgaWYgJ2InIGluIG1vZGU6CisgICAgICAgIGZsYWdzID0gX2Jpbl9vcGVuZmxhZ3MKKyAgICBlbHNlOgorICAgICAgICBmbGFncyA9IF90ZXh0X29wZW5mbGFncworCisgICAgIyBTZXR0aW5nIE9fVEVNUE9SQVJZIGluIHRoZSBmbGFncyBjYXVzZXMgdGhlIE9TIHRvIGRlbGV0ZQorICAgICMgdGhlIGZpbGUgd2hlbiBpdCBpcyBjbG9zZWQuICBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFdpbmRvd3MuCisgICAgaWYgX29zLm5hbWUgPT0gJ250JyBhbmQgZGVsZXRlOgorICAgICAgICBmbGFncyB8PSBfb3MuT19URU1QT1JBUlkKKworICAgIChmZCwgbmFtZSkgPSBfbWtzdGVtcF9pbm5lcihkaXIsIHByZWZpeCwgc3VmZml4LCBmbGFncykKKyAgICBmaWxlID0gX29zLmZkb3BlbihmZCwgbW9kZSwgYnVmc2l6ZSkKKyAgICByZXR1cm4gX1RlbXBvcmFyeUZpbGVXcmFwcGVyKGZpbGUsIG5hbWUsIGRlbGV0ZSkKKworaWYgX29zLm5hbWUgIT0gJ3Bvc2l4JyBvciBfb3Muc3lzLnBsYXRmb3JtID09ICdjeWd3aW4nOgorICAgICMgT24gbm9uLVBPU0lYIGFuZCBDeWd3aW4gc3lzdGVtcywgYXNzdW1lIHRoYXQgd2UgY2Fubm90IHVubGluayBhIGZpbGUKKyAgICAjIHdoaWxlIGl0IGlzIG9wZW4uCisgICAgVGVtcG9yYXJ5RmlsZSA9IE5hbWVkVGVtcG9yYXJ5RmlsZQorCitlbHNlOgorICAgIGRlZiBUZW1wb3JhcnlGaWxlKG1vZGU9J3crYicsIGJ1ZnNpemU9LTEsIHN1ZmZpeD0iIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9dGVtcGxhdGUsIGRpcj1Ob25lKToKKyAgICAgICAgIiIiQ3JlYXRlIGFuZCByZXR1cm4gYSB0ZW1wb3JhcnkgZmlsZS4KKyAgICAgICAgQXJndW1lbnRzOgorICAgICAgICAncHJlZml4JywgJ3N1ZmZpeCcsICdkaXInIC0tIGFzIGZvciBta3N0ZW1wLgorICAgICAgICAnbW9kZScgLS0gdGhlIG1vZGUgYXJndW1lbnQgdG8gb3MuZmRvcGVuIChkZWZhdWx0ICJ3K2IiKS4KKyAgICAgICAgJ2J1ZnNpemUnIC0tIHRoZSBidWZmZXIgc2l6ZSBhcmd1bWVudCB0byBvcy5mZG9wZW4gKGRlZmF1bHQgLTEpLgorICAgICAgICBUaGUgZmlsZSBpcyBjcmVhdGVkIGFzIG1rc3RlbXAoKSB3b3VsZCBkbyBpdC4KKworICAgICAgICBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGEgZmlsZS1saWtlIGludGVyZmFjZS4gIFRoZSBmaWxlIGhhcyBubworICAgICAgICBuYW1lLCBhbmQgd2lsbCBjZWFzZSB0byBleGlzdCB3aGVuIGl0IGlzIGNsb3NlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBkaXIgPSBnZXR0ZW1wZGlyKCkKKworICAgICAgICBpZiAnYicgaW4gbW9kZToKKyAgICAgICAgICAgIGZsYWdzID0gX2Jpbl9vcGVuZmxhZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZsYWdzID0gX3RleHRfb3BlbmZsYWdzCisKKyAgICAgICAgKGZkLCBuYW1lKSA9IF9ta3N0ZW1wX2lubmVyKGRpciwgcHJlZml4LCBzdWZmaXgsIGZsYWdzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfb3MudW5saW5rKG5hbWUpCisgICAgICAgICAgICByZXR1cm4gX29zLmZkb3BlbihmZCwgbW9kZSwgYnVmc2l6ZSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgX29zLmNsb3NlKGZkKQorICAgICAgICAgICAgcmFpc2UKKworY2xhc3MgU3Bvb2xlZFRlbXBvcmFyeUZpbGU6CisgICAgIiIiVGVtcG9yYXJ5IGZpbGUgd3JhcHBlciwgc3BlY2lhbGl6ZWQgdG8gc3dpdGNoIGZyb20KKyAgICBTdHJpbmdJTyB0byBhIHJlYWwgZmlsZSB3aGVuIGl0IGV4Y2VlZHMgYSBjZXJ0YWluIHNpemUgb3IKKyAgICB3aGVuIGEgZmlsZW5vIGlzIG5lZWRlZC4KKyAgICAiIiIKKyAgICBfcm9sbGVkID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhfc2l6ZT0wLCBtb2RlPSd3K2InLCBidWZzaXplPS0xLAorICAgICAgICAgICAgICAgICBzdWZmaXg9IiIsIHByZWZpeD10ZW1wbGF0ZSwgZGlyPU5vbmUpOgorICAgICAgICBzZWxmLl9maWxlID0gX1N0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fbWF4X3NpemUgPSBtYXhfc2l6ZQorICAgICAgICBzZWxmLl9yb2xsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9UZW1wb3JhcnlGaWxlQXJncyA9IChtb2RlLCBidWZzaXplLCBzdWZmaXgsIHByZWZpeCwgZGlyKQorCisgICAgZGVmIF9jaGVjayhzZWxmLCBmaWxlKToKKyAgICAgICAgaWYgc2VsZi5fcm9sbGVkOiByZXR1cm4KKyAgICAgICAgbWF4X3NpemUgPSBzZWxmLl9tYXhfc2l6ZQorICAgICAgICBpZiBtYXhfc2l6ZSBhbmQgZmlsZS50ZWxsKCkgPiBtYXhfc2l6ZToKKyAgICAgICAgICAgIHNlbGYucm9sbG92ZXIoKQorCisgICAgZGVmIHJvbGxvdmVyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9yb2xsZWQ6IHJldHVybgorICAgICAgICBmaWxlID0gc2VsZi5fZmlsZQorICAgICAgICBuZXdmaWxlID0gc2VsZi5fZmlsZSA9IFRlbXBvcmFyeUZpbGUoKnNlbGYuX1RlbXBvcmFyeUZpbGVBcmdzKQorICAgICAgICBkZWwgc2VsZi5fVGVtcG9yYXJ5RmlsZUFyZ3MKKworICAgICAgICBuZXdmaWxlLndyaXRlKGZpbGUuZ2V0dmFsdWUoKSkKKyAgICAgICAgbmV3ZmlsZS5zZWVrKGZpbGUudGVsbCgpLCAwKQorCisgICAgICAgIHNlbGYuX3JvbGxlZCA9IFRydWUKKworICAgICMgVGhlIG1ldGhvZCBjYWNoaW5nIHRyaWNrIGZyb20gTmFtZWRUZW1wb3JhcnlGaWxlCisgICAgIyB3b24ndCB3b3JrIGhlcmUsIGJlY2F1c2UgX2ZpbGUgbWF5IGNoYW5nZSBmcm9tIGEKKyAgICAjIF9TdHJpbmdJTyBpbnN0YW5jZSB0byBhIHJlYWwgZmlsZS4gU28gd2UgbGlzdAorICAgICMgYWxsIHRoZSBtZXRob2RzIGRpcmVjdGx5LgorCisgICAgIyBDb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9maWxlLmNsb3NlZDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkNhbm5vdCBlbnRlciBjb250ZXh0IHdpdGggY2xvc2VkIGZpbGUiKQorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGV4YywgdmFsdWUsIHRiKToKKyAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisKKyAgICAjIGZpbGUgcHJvdG9jb2wKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLl9faXRlcl9fKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgY2xvc2VkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5jbG9zZWQKKworICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgIHNlbGYucm9sbG92ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5maWxlbm8oKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKKworICAgIGRlZiBpc2F0dHkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlLmlzYXR0eSgpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgbW9kZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUubW9kZQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fVGVtcG9yYXJ5RmlsZUFyZ3NbMF0KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5uYW1lCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUubmV4dAorCisgICAgZGVmIHJlYWQoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5yZWFkKCphcmdzKQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUucmVhZGxpbmUoKmFyZ3MpCisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZpbGUucmVhZGxpbmVzKCphcmdzKQorCisgICAgZGVmIHNlZWsoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9maWxlLnNlZWsoKmFyZ3MpCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc29mdHNwYWNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS5zb2Z0c3BhY2UKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS50ZWxsKCkKKworICAgIGRlZiB0cnVuY2F0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS50cnVuY2F0ZSgpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CisgICAgICAgIGZpbGUgPSBzZWxmLl9maWxlCisgICAgICAgIHJ2ID0gZmlsZS53cml0ZShzKQorICAgICAgICBzZWxmLl9jaGVjayhmaWxlKQorICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIGl0ZXJhYmxlKToKKyAgICAgICAgZmlsZSA9IHNlbGYuX2ZpbGUKKyAgICAgICAgcnYgPSBmaWxlLndyaXRlbGluZXMoaXRlcmFibGUpCisgICAgICAgIHNlbGYuX2NoZWNrKGZpbGUpCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIHhyZWFkbGluZXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZmlsZS54cmVhZGxpbmVzKCphcmdzKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLl9maWxlLnJlYWRsaW5lcygqYXJncykpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RlbXBmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVtcGZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RlbXBmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RlbXBmaWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVtcGZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDFhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RlbXBmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvMTg1dGVzdC5kYiBiL2xpYi9weXRob24yLjcvdGVzdC8xODV0ZXN0LmRiCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0Y2I1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvMTg1dGVzdC5kYgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvU2luZS0xMDAwSHotMzAwbXMuYWlmIGIvbGliL3B5dGhvbjIuNy90ZXN0L1NpbmUtMTAwMEh6LTMwMG1zLmFpZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA4ZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L1NpbmUtMTAwMEh6LTMwMG1zLmFpZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzMDU0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisjIER1bW15IGZpbGUgdG8gbWFrZSB0aGlzIGRpcmVjdG9yeSBhIHBhY2thZ2UuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FlZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2FlZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYXVkaW90ZXN0LmF1IGIvbGliL3B5dGhvbjIuNy90ZXN0L2F1ZGlvdGVzdC5hdQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzZiMDUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2F1ZGlvdGVzdC5hdQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjMjA4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9hdXRvdGVzdC5weQpAQCAtMCwwICsxLDYgQEAKKyMgVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byBydW5uaW5nIHJlZ3J0ZXN0LnB5IGZyb20gdGhlIGNtZGxpbmUuCisjIEl0IGNhbiBiZSBlc3BlY2lhbGx5IGhhbmR5IGlmIHlvdSdyZSBpbiBhbiBpbnRlcmFjdGl2ZSBzaGVsbCwgZS5nLiwKKyMgZnJvbSB0ZXN0IGltcG9ydCBhdXRvdGVzdC4KKworZnJvbSB0ZXN0IGltcG9ydCByZWdydGVzdAorcmVncnRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2F1dG90ZXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRmYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2F1dG90ZXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYXV0b3Rlc3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2F1dG90ZXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTRmYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2F1dG90ZXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkX2NvZGluZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRfY29kaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MWIwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkX2NvZGluZy5weQpAQCAtMCwwICsxIEBACisjIC0qLSBjb2Rpbmc6IHVmdC04IC0qLQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2JhZF9jb2RpbmcyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZF9jb2RpbmcyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTAxYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkX2NvZGluZzIucHkKQEAgLTAsMCArMSwyIEBACivvu78jY29kaW5nOiB1dGY4CitwcmludCAn5oiRJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2JhZGNlcnQucGVtIGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZGNlcnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTkxNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkY2VydC5wZW0KQEAgLTAsMCArMSwzNiBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1h3SUJBQUtCZ1FDOGRkcmhtK0x1dEJ2alljUWxuSDIxUFBJc2VKMUpWRzJITW1OMkNtWmsyWXVrTys5TAorb3BkSmhUdmJHZkVqMERRczFJRThNK2tUVXlPbXVLZlZyRk1Ld3RWZUNKcGhyQW5ob3o3VFlPdUxCU3F0N2xWSAorZmhpL1Z3b3ZFU0psYUJPcCtXTW5maGNkdVBFWUhZeC82Y25WYXBJa1puTHQzMHp1MnVtK0R6QTlqUUlEQVFBQgorQW9HQkFLMEZacGFLajZXbkpaTjBScWhoSytnZ3RCV3dCbmMwVS9vemdLejJqMXMzZnNTaFllaUd0VzZDSzVuVQorRDFkWjV3emhiR1RoSTdMaU9YRHZSdWNjOW43dlVnaTBhbHFQUS9QRm9kUHhBTi9lRVlrbVhRN1cyazd6d3NEQQorSVVLMEtVaGt0UWJMdThxRi9tOHFNODZiYTl5OS85WWtYdVFiWjNDT2w1YWhUWnJoQWtFQTMwMVAwOFJLdjNLTQorb1huR1UyVUhUdUoxTUFEMmhPclB4akQ0L3d4QS8zOUVXRzliWmN6Ykp5Z2dCNFJIdTBJM05PU0ZqQW0zSFFtMAorQU5PdTVRSzlvd0pCQU5nT2VMZk5OY0Y0cHArVWlrUkZxeGs1aFVMcVJBV3pWeFZyV2U4NUZsUG0wVlZtSGJiLworbG9pZjdtcWpVOG8xalRkL0xNN1JEOWYydXNaeUUycHNhdzhDUVFDTkxoa3BYM0tPNWtLSm1TOU43Sk1aU2M0agorb29nNTh5ZVlPOEJCcUtLenB1ZzBMWHVRdWx0WXYySzR2ZWFJTzA0aUw5VkxlNXo5Uy9RMWphQ0hCQnVYQWtFQQorejhnakdvaTFBT3A2UEJCTFpOc25jQ3ZjVi8wYUMrMXNlNEh4VE5vMitkdUtTRG5icStsanFPTStFN29kVStOcQorZXd2SVdPRy8vZThmc3NkMG1xM0h5d0pCQUo4bC9jOEdWbXJwRlR4OHIvbloyUHl5anQzZEgxd2lkb29EWFlTVgorcTZHYmY0MUxsbzVzWUF0bXhkbmRUTEFTdUhLZWNhY1RnWlZoeTBGcnlacExLclU9CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitKdXN0IGJhZCBjZXJ0IGRhdGEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKy0tLS0tQkVHSU4gUlNBIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNYd0lCQUFLQmdRQzhkZHJobStMdXRCdmpZY1FsbkgyMVBQSXNlSjFKVkcySE1tTjJDbVprMll1a08rOUwKK29wZEpoVHZiR2ZFajBEUXMxSUU4TStrVFV5T211S2ZWckZNS3d0VmVDSnBockFuaG96N1RZT3VMQlNxdDdsVkgKK2ZoaS9Wd292RVNKbGFCT3ArV01uZmhjZHVQRVlIWXgvNmNuVmFwSWtabkx0MzB6dTJ1bStEekE5alFJREFRQUIKK0FvR0JBSzBGWnBhS2o2V25KWk4wUnFoaEsrZ2d0Qld3Qm5jMFUvb3pnS3oyajFzM2ZzU2hZZWlHdFc2Q0s1blUKK0QxZFo1d3poYkdUaEk3TGlPWER2UnVjYzluN3ZVZ2kwYWxxUFEvUEZvZFB4QU4vZUVZa21YUTdXMms3endzREEKK0lVSzBLVWhrdFFiTHU4cUYvbThxTTg2YmE5eTkvOVlrWHVRYlozQ09sNWFoVFpyaEFrRUEzMDFQMDhSS3YzS00KK29YbkdVMlVIVHVKMU1BRDJoT3JQeGpENC93eEEvMzlFV0c5YlpjemJKeWdnQjRSSHUwSTNOT1NGakFtM0hRbTAKK0FOT3U1UUs5b3dKQkFOZ09lTGZOTmNGNHBwK1Vpa1JGcXhrNWhVTHFSQVd6VnhWcldlODVGbFBtMFZWbUhiYi8KK2xvaWY3bXFqVThvMWpUZC9MTTdSRDlmMnVzWnlFMnBzYXc4Q1FRQ05MaGtwWDNLTzVrS0ptUzlON0pNWlNjNGoKK29vZzU4eWVZTzhCQnFLS3pwdWcwTFh1UXVsdFl2Mks0dmVhSU8wNGlMOVZMZTV6OVMvUTFqYUNIQkJ1WEFrRUEKK3o4Z2pHb2kxQU9wNlBCQkxaTnNuY0N2Y1YvMGFDKzFzZTRIeFRObzIrZHVLU0RuYnErbGpxT00rRTdvZFUrTnEKK2V3dklXT0cvL2U4ZnNzZDBtcTNIeXdKQkFKOGwvYzhHVm1ycEZUeDhyL25aMlB5eWp0M2RIMXdpZG9vRFhZU1YKK3E2R2JmNDFMbG81c1lBdG14ZG5kVExBU3VIS2VjYWNUZ1pWaHkwRnJ5WnBMS3JVPQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorSnVzdCBiYWQgY2VydCBkYXRhCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFka2V5LnBlbSBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRrZXkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOGE5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFka2V5LnBlbQpAQCAtMCwwICsxLDQwIEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitCYWQgS2V5LCB0aG91Z2ggdGhlIGNlcnQgc2hvdWxkIGJlIE9LCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDcHpDQ0FoQ2dBd0lCQWdJSkFQK3FTdHYxY0lHTk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHSk1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNCTUlSR1ZzWVhkaGNtVXhFekFSQmdOVkJBY1RDbGRwYkcxcGJtZDBiMjR4CitJekFoQmdOVkJBb1RHbEI1ZEdodmJpQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXVNUXd3Q2dZRFZRUUxFd05UCitVMHd4SHpBZEJnTlZCQU1URm5OdmJXVnRZV05vYVc1bExuQjVkR2h2Ymk1dmNtY3dIaGNOTURjd09ESTNNVFkxCitORFV3V2hjTk1UTXdNakUyTVRZMU5EVXdXakNCaVRFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ1RDRVJsCitiR0YzWVhKbE1STXdFUVlEVlFRSEV3cFhhV3h0YVc1bmRHOXVNU013SVFZRFZRUUtFeHBRZVhSb2IyNGdVMjltCitkSGRoY21VZ1JtOTFibVJoZEdsdmJqRU1NQW9HQTFVRUN4TURVMU5NTVI4d0hRWURWUVFERXhaemIyMWxiV0ZqCithR2x1WlM1d2VYUm9iMjR1YjNKbk1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQzhkZHJoCittK0x1dEJ2alljUWxuSDIxUFBJc2VKMUpWRzJITW1OMkNtWmsyWXVrTys5TG9wZEpoVHZiR2ZFajBEUXMxSUU4CitNK2tUVXlPbXVLZlZyRk1Ld3RWZUNKcGhyQW5ob3o3VFlPdUxCU3F0N2xWSGZoaS9Wd292RVNKbGFCT3ArV01uCitmaGNkdVBFWUhZeC82Y25WYXBJa1puTHQzMHp1MnVtK0R6QTlqUUlEQVFBQm94VXdFekFSQmdsZ2hrZ0JodmhDCitBUUVFQkFNQ0JrQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFGNFE1QlZxbUNPTHYxbjhqZS9KdzlLNjY5VlhiCiswOGh5R3pRaGtlbUVCWVFkNmZ6UTlBLzFaekhrSktiMVA2eXJlT0xTRWg0S2N4WVB5ckxSQzFsbDhucjVPbEN4CitDTWhLa1RuUjZxQnNkTlYwWHRkVTIrTjI1aHFXK01hNFplcXNOL2lpSlZDR05PWkdudlF1dkNBR1dGOCtKL2YvCitpSGtDNmdHZEJKaG9nczQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitCYWQgS2V5LCB0aG91Z2ggdGhlIGNlcnQgc2hvdWxkIGJlIE9LCistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlDcHpDQ0FoQ2dBd0lCQWdJSkFQK3FTdHYxY0lHTk1BMEdDU3FHU0liM0RRRUJCUVVBTUlHSk1Rc3dDUVlECitWUVFHRXdKVlV6RVJNQThHQTFVRUNCTUlSR1ZzWVhkaGNtVXhFekFSQmdOVkJBY1RDbGRwYkcxcGJtZDBiMjR4CitJekFoQmdOVkJBb1RHbEI1ZEdodmJpQlRiMlowZDJGeVpTQkdiM1Z1WkdGMGFXOXVNUXd3Q2dZRFZRUUxFd05UCitVMHd4SHpBZEJnTlZCQU1URm5OdmJXVnRZV05vYVc1bExuQjVkR2h2Ymk1dmNtY3dIaGNOTURjd09ESTNNVFkxCitORFV3V2hjTk1UTXdNakUyTVRZMU5EVXdXakNCaVRFTE1Ba0dBMVVFQmhNQ1ZWTXhFVEFQQmdOVkJBZ1RDRVJsCitiR0YzWVhKbE1STXdFUVlEVlFRSEV3cFhhV3h0YVc1bmRHOXVNU013SVFZRFZRUUtFeHBRZVhSb2IyNGdVMjltCitkSGRoY21VZ1JtOTFibVJoZEdsdmJqRU1NQW9HQTFVRUN4TURVMU5NTVI4d0hRWURWUVFERXhaemIyMWxiV0ZqCithR2x1WlM1d2VYUm9iMjR1YjNKbk1JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQmdRQzhkZHJoCittK0x1dEJ2alljUWxuSDIxUFBJc2VKMUpWRzJITW1OMkNtWmsyWXVrTys5TG9wZEpoVHZiR2ZFajBEUXMxSUU4CitNK2tUVXlPbXVLZlZyRk1Ld3RWZUNKcGhyQW5ob3o3VFlPdUxCU3F0N2xWSGZoaS9Wd292RVNKbGFCT3ArV01uCitmaGNkdVBFWUhZeC82Y25WYXBJa1puTHQzMHp1MnVtK0R6QTlqUUlEQVFBQm94VXdFekFSQmdsZ2hrZ0JodmhDCitBUUVFQkFNQ0JrQXdEUVlKS29aSWh2Y05BUUVGQlFBRGdZRUFGNFE1QlZxbUNPTHYxbjhqZS9KdzlLNjY5VlhiCiswOGh5R3pRaGtlbUVCWVFkNmZ6UTlBLzFaekhrSktiMVA2eXJlT0xTRWg0S2N4WVB5ckxSQzFsbDhucjVPbEN4CitDTWhLa1RuUjZxQnNkTlYwWHRkVTIrTjI1aHFXK01hNFplcXNOL2lpSlZDR05PWkdudlF1dkNBR1dGOCtKL2YvCitpSGtDNmdHZEJKaG9nczQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjODQxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlMy5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHJlc3RlZF9zbm9wZXMKKworZGVmIGYoeCk6CisgICAgZGVmIGcoeSk6CisgICAgICAgIHJldHVybiB4ICsgeQorICAgIHJldHVybiBnCisKK3Jlc3VsdCA9IGYoMikoNCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlNC5weSBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY0Yzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU0LnB5CkBAIC0wLDAgKzEsMTAgQEAKKyIiIlRoaXMgaXMgYSB0ZXN0IiIiCitpbXBvcnQgX19mdXR1cmVfXworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCityZXN1bHQgPSBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3ZTVmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlNS5weQpAQCAtMCwwICsxLDEyIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzCitpbXBvcnQgZm9vCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMKKworCitkZWYgZih4KToKKyAgICBkZWYgZyh5KToKKyAgICAgICAgcmV0dXJuIHggKyB5CisgICAgcmV0dXJuIGcKKworcmVzdWx0ID0gZigyKSg0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU2LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhOGI1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTYucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiVGhpcyBpcyBhIHRlc3QiIiIKKyJ0aGlzIGlzbid0IGEgZG9jIHN0cmluZyIKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcworCitkZWYgZih4KToKKyAgICBkZWYgZyh5KToKKyAgICAgICAgcmV0dXJuIHggKyB5CisgICAgcmV0dXJuIGcKKworcmVzdWx0ID0gZigyKSg0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU3LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU3LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWRiMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTcucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiVGhpcyBpcyBhIHRlc3QiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzOyBpbXBvcnQgc3RyaW5nOyBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IFwKKyAgICAgbmVzdGVkX3Njb3BlcworCitkZWYgZih4KToKKyAgICBkZWYgZyh5KToKKyAgICAgICAgcmV0dXJuIHggKyB5CisgICAgcmV0dXJuIGcKKworcmVzdWx0ID0gZigyKSg0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU4LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9mdXR1cmU4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNjdiMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTgucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiVGhpcyBpcyBhIHRlc3QiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAqCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCitwcmludCBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X2Z1dHVyZTkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjZTMyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9iYWRzeW50YXhfZnV0dXJlOS5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUaGlzIGlzIGEgdGVzdCIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMsIGJyYWNlcworCitkZWYgZih4KToKKyAgICBkZWYgZyh5KToKKyAgICAgICAgcmV0dXJuIHggKyB5CisgICAgcmV0dXJuIGcKKworcHJpbnQgZigyKSg0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9ub2NhcmV0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2JhZHN5bnRheF9ub2NhcmV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZWM5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYmFkc3ludGF4X25vY2FyZXQucHkKQEAgLTAsMCArMSwyIEBACitkZWYgZih4KToKKyAgICBbeCBmb3IgeCBpbiB4XSA9IHgKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvYnVmZmVyX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZDhhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYnVmZmVyX3Rlc3RzLnB5CkBAIC0wLDAgKzEsMjA2IEBACisjIFRlc3RzIHRoYXQgd29yayBmb3IgYm90aCBieXRlcyBhbmQgYnVmZmVyIG9iamVjdHMuCisjIFNlZSBQRVAgMzEzNy4KKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cworCitjbGFzcyBNaXhpbkJ5dGVzQnVmZmVyQ29tbW9uVGVzdHMob2JqZWN0KToKKyAgICAiIiJUZXN0cyB0aGF0IHdvcmsgZm9yIGJvdGggYnl0ZXMgYW5kIGJ1ZmZlciBvYmplY3RzLgorICAgIFNlZSBQRVAgMzEzNy4KKyAgICAiIiIKKworICAgIGRlZiBtYXJzaGFsKHNlbGYsIHgpOgorICAgICAgICAiIiJDb252ZXJ0IHggaW50byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBmb3IgdGhlc2UgdGVzdHMuIiIiCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigndGVzdCBjbGFzcyBtdXN0IHByb3ZpZGUgYSBtYXJzaGFsIG1ldGhvZCcpCisKKyAgICBkZWYgdGVzdF9pc2xvd2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJycpLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ2EnKS5pc2xvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInQScpLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidcbicpLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ2FiYycpLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidhQmMnKS5pc2xvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidhYmNcbicpLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5pc2xvd2VyLCA0MikKKworICAgIGRlZiB0ZXN0X2lzdXBwZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInJykuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ2EnKS5pc3VwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidBJykuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ1xuJykuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInQUJDJykuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ0FiQycpLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ0FCQ1xuJykuaXN1cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2FiYycpLmlzdXBwZXIsIDQyKQorCisgICAgZGVmIHRlc3RfaXN0aXRsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYicnKS5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInYScpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ0EnKS5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInXG4nKS5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidBIFRpdGxlY2FzZWQgTGluZScpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ0FcblRpdGxlY2FzZWQgTGluZScpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ0EgVGl0bGVjYXNlZCwgTGluZScpLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidOb3QgYSBjYXBpdGFsaXplZCBTdHJpbmcnKS5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInTm90XHRhIFRpdGxlY2FzZSBTdHJpbmcnKS5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInTm90LS1hIFRpdGxlY2FzZSBTdHJpbmcnKS5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInTk9UJykuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2FiYycpLmlzdGl0bGUsIDQyKQorCisgICAgZGVmIHRlc3RfaXNzcGFjZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYicnKS5pc3NwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInYScpLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJyAnKS5pc3NwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidcdCcpLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ1xyJykuaXNzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInXG4nKS5pc3NwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYicgXHRcclxuJykuaXNzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJyBcdFxyXG5hJykuaXNzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2FiYycpLmlzc3BhY2UsIDQyKQorCisgICAgZGVmIHRlc3RfaXNhbHBoYShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYicnKS5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidhJykuaXNhbHBoYSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInQScpLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidcbicpLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ2FiYycpLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidhQmMxMjMnKS5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInYWJjXG4nKS5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykuaXNhbHBoYSwgNDIpCisKKyAgICBkZWYgdGVzdF9pc2FsbnVtKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJycpLmlzYWxudW0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWFyc2hhbChiJ2EnKS5pc2FsbnVtKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYidBJykuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ1xuJykuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInMTIzYWJjNDU2JykuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInYTFiM2MnKS5pc2FsbnVtKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInYUJjMDAwICcpLmlzYWxudW0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYidhYmNcbicpLmlzYWxudW0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5pc2FsbnVtLCA0MikKKworICAgIGRlZiB0ZXN0X2lzZGlnaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5tYXJzaGFsKGInJykuaXNkaWdpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYubWFyc2hhbChiJ2EnKS5pc2RpZ2l0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1hcnNoYWwoYicwJykuaXNkaWdpdCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYXJzaGFsKGInMDEyMzQ1Njc4OScpLmlzZGlnaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLm1hcnNoYWwoYicwMTIzNDU2Nzg5YScpLmlzZGlnaXQoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2FiYycpLmlzZGlnaXQsIDQyKQorCisgICAgZGVmIHRlc3RfbG93ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidoZWxsbycsIHNlbGYubWFyc2hhbChiJ0hlTExvJykubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2hlbGxvJywgc2VsZi5tYXJzaGFsKGInaGVsbG8nKS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2hlbGxvJykubG93ZXIsIDQyKQorCisgICAgZGVmIHRlc3RfdXBwZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidIRUxMTycsIHNlbGYubWFyc2hhbChiJ0hlTExvJykudXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ0hFTExPJywgc2VsZi5tYXJzaGFsKGInSEVMTE8nKS51cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2hlbGxvJykudXBwZXIsIDQyKQorCisgICAgZGVmIHRlc3RfY2FwaXRhbGl6ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyBoZWxsbyAnLCBzZWxmLm1hcnNoYWwoYicgaGVsbG8gJykuY2FwaXRhbGl6ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInSGVsbG8gJywgc2VsZi5tYXJzaGFsKGInSGVsbG8gJykuY2FwaXRhbGl6ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInSGVsbG8gJywgc2VsZi5tYXJzaGFsKGInaGVsbG8gJykuY2FwaXRhbGl6ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInQWFhYScsIHNlbGYubWFyc2hhbChiJ2FhYWEnKS5jYXBpdGFsaXplKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidBYWFhJywgc2VsZi5tYXJzaGFsKGInQWFBYScpLmNhcGl0YWxpemUoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2hlbGxvJykuY2FwaXRhbGl6ZSwgNDIpCisKKyAgICBkZWYgdGVzdF9sanVzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiYyAgICAgICAnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5sanVzdCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmMgICAnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5sanVzdCg2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiYycsIHNlbGYubWFyc2hhbChiJ2FiYycpLmxqdXN0KDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJywgc2VsZi5tYXJzaGFsKGInYWJjJykubGp1c3QoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmMqKioqKioqJywgc2VsZi5tYXJzaGFsKGInYWJjJykubGp1c3QoMTAsICcqJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykubGp1c3QpCisKKyAgICBkZWYgdGVzdF9yanVzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyAgICAgICBhYmMnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5yanVzdCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicgICBhYmMnLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5yanVzdCg2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiYycsIHNlbGYubWFyc2hhbChiJ2FiYycpLnJqdXN0KDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjJywgc2VsZi5tYXJzaGFsKGInYWJjJykucmp1c3QoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicqKioqKioqYWJjJywgc2VsZi5tYXJzaGFsKGInYWJjJykucmp1c3QoMTAsICcqJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykucmp1c3QpCisKKyAgICBkZWYgdGVzdF9jZW50ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicgICBhYmMgICAgJywgc2VsZi5tYXJzaGFsKGInYWJjJykuY2VudGVyKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyBhYmMgICcsIHNlbGYubWFyc2hhbChiJ2FiYycpLmNlbnRlcig2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiYycsIHNlbGYubWFyc2hhbChiJ2FiYycpLmNlbnRlcigzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiYycsIHNlbGYubWFyc2hhbChiJ2FiYycpLmNlbnRlcigyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJyoqKmFiYyoqKionLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5jZW50ZXIoMTAsICcqJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInYWJjJykuY2VudGVyKQorCisgICAgZGVmIHRlc3Rfc3dhcGNhc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidoRWxsTyBDb01QdVRFclMnLAorICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInSGVMTG8gY09tcFV0ZVJzJykuc3dhcGNhc2UoKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2hlbGxvJykuc3dhcGNhc2UsIDQyKQorCisgICAgZGVmIHRlc3RfemZpbGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicxMjMnLCBzZWxmLm1hcnNoYWwoYicxMjMnKS56ZmlsbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJzEyMycsIHNlbGYubWFyc2hhbChiJzEyMycpLnpmaWxsKDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInMDEyMycsIHNlbGYubWFyc2hhbChiJzEyMycpLnpmaWxsKDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInKzEyMycsIHNlbGYubWFyc2hhbChiJysxMjMnKS56ZmlsbCgzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJysxMjMnLCBzZWxmLm1hcnNoYWwoYicrMTIzJykuemZpbGwoNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicrMDEyMycsIHNlbGYubWFyc2hhbChiJysxMjMnKS56ZmlsbCg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJy0xMjMnLCBzZWxmLm1hcnNoYWwoYictMTIzJykuemZpbGwoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYictMTIzJywgc2VsZi5tYXJzaGFsKGInLTEyMycpLnpmaWxsKDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInLTAxMjMnLCBzZWxmLm1hcnNoYWwoYictMTIzJykuemZpbGwoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicwMDAnLCBzZWxmLm1hcnNoYWwoYicnKS56ZmlsbCgzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJzM0Jywgc2VsZi5tYXJzaGFsKGInMzQnKS56ZmlsbCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJzAwMzQnLCBzZWxmLm1hcnNoYWwoYiczNCcpLnpmaWxsKDQpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tYXJzaGFsKGInMTIzJykuemZpbGwpCisKKyAgICBkZWYgdGVzdF9leHBhbmR0YWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXHJhYlx0ZGVmXG5nXHRoaScpLmV4cGFuZHRhYnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2FiY1xyYWJcdGRlZlxuZ1x0aGknKS5leHBhbmR0YWJzKDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjXHJhYiAgZGVmXG5nICAgaGknLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2FiY1xyYWJcdGRlZlxuZ1x0aGknKS5leHBhbmR0YWJzKDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYWJjXHJcbmFiICBkZWZcbmcgICBoaScsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXHJcbmFiXHRkZWZcbmdcdGhpJykuZXhwYW5kdGFicyg0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2FiY1xyYWJcdGRlZlxuZ1x0aGknKS5leHBhbmR0YWJzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNccmFiXHRkZWZcbmdcdGhpJykuZXhwYW5kdGFicyg4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2FiY1xyXG5hYlxyXG5kZWZcbmdcclxuaGknLAorICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXHJcbmFiXHJcbmRlZlxuZ1xyXG5oaScpLmV4cGFuZHRhYnMoNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicgIGFcbiBiJywgc2VsZi5tYXJzaGFsKGInIFx0YVxuXHRiJykuZXhwYW5kdGFicygxKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2hlbGxvJykuZXhwYW5kdGFicywgNDIsIDQyKQorICAgICAgICAjIFRoaXMgdGVzdCBpcyBvbmx5IHZhbGlkIHdoZW4gc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHZvaWQqKSA9PSA0LgorICAgICAgICBpZiBzeXMubWF4aW50IDwgKDEgPDwgMzIpIGFuZCBzdHJ1Y3QuY2FsY3NpemUoJ1AnKSA9PSA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ1x0YVxuXHRiJykuZXhwYW5kdGFicywgc3lzLm1heGludCkKKworICAgIGRlZiB0ZXN0X3RpdGxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInIEhlbGxvICcsIHNlbGYubWFyc2hhbChiJyBoZWxsbyAnKS50aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInSGVsbG8gJywgc2VsZi5tYXJzaGFsKGInaGVsbG8gJykudGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ0hlbGxvICcsIHNlbGYubWFyc2hhbChiJ0hlbGxvICcpLnRpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidGb3JtYXQgVGhpcyBBcyBUaXRsZSBTdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2ZPck1hVCB0aElzIGFTIHRpdExlIFN0cmluZycpLnRpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidGb3JtYXQsVGhpcy1BcypUaXRsZTtTdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2ZPck1hVCx0aElzLWFTKnRpdExlO1N0cmluZycpLnRpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYidHZXRpbnQnLCBzZWxmLm1hcnNoYWwoYidnZXRJbnQnKS50aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubWFyc2hhbChiJ2hlbGxvJykudGl0bGUsIDQyKQorCisgICAgZGVmIHRlc3Rfc3BsaXRsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYidhYmMnLCBiJ2RlZicsIGInJywgYidnaGknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1hcnNoYWwoYidhYmNcbmRlZlxuXHJnaGknKS5zcGxpdGxpbmVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2InYWJjJywgYidkZWYnLCBiJycsIGInZ2hpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXG5kZWZcblxyXG5naGknKS5zcGxpdGxpbmVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2InYWJjJywgYidkZWYnLCBiJ2doaSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ2FiY1xuZGVmXHJcbmdoaScpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYidhYmMnLCBiJ2RlZicsIGInZ2hpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXG5kZWZcclxuZ2hpXG4nKS5zcGxpdGxpbmVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2InYWJjJywgYidkZWYnLCBiJ2doaScsIGInJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXJzaGFsKGInYWJjXG5kZWZcclxuZ2hpXG5ccicpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYicnLCBiJ2FiYycsIGInZGVmJywgYidnaGknLCBiJyddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ1xuYWJjXG5kZWZcclxuZ2hpXG5ccicpLnNwbGl0bGluZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYidcbicsIGInYWJjXG4nLCBiJ2RlZlxyXG4nLCBiJ2doaVxuJywgYidcciddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWFyc2hhbChiJ1xuYWJjXG5kZWZcclxuZ2hpXG5ccicpLnNwbGl0bGluZXMoMSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1hcnNoYWwoYidhYmMnKS5zcGxpdGxpbmVzLCA0MiwgNDIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYnVmZmVyX3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDJkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYnVmZmVyX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvYnVmZmVyX3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9idWZmZXJfdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkZDJkZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvYnVmZmVyX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2ZncGFyc2VyLjEgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2ZncGFyc2VyLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4N2Y1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jZmdwYXJzZXIuMQpAQCAtMCwwICsxLDIgQEAKK1tGb28gQmFyXQorZm9vPW5ld2JhcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2NoZWNrX3NvdW5kY2FyZC52YnMgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2hlY2tfc291bmRjYXJkLnZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIxODUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2NoZWNrX3NvdW5kY2FyZC52YnMKQEAgLTAsMCArMSwxMyBAQAorcmVtIENoZWNrIGZvciBhIHdvcmtpbmcgc291bmQtY2FyZCAtIGV4aXQgd2l0aCAwIGlmIE9LLCAxIG90aGVyd2lzZS4KK3NldCB3bWkgPSBHZXRPYmplY3QoIndpbm1nbXRzOiIpCitzZXQgc2NzID0gd21pLkluc3RhbmNlc09mKCJ3aW4zMl9zb3VuZGRldmljZSIpCitmb3IgZWFjaCBzYyBpbiBzY3MKKyAgIHNldCBzdGF0dXMgPSBzYy5Qcm9wZXJ0aWVzXygiU3RhdHVzIikKKyAgIHdzY3JpcHQuRWNobyhzYy5Qcm9wZXJ0aWVzXygiTmFtZSIpICsgIi8iICsgc3RhdHVzKQorICAgaWYgc3RhdHVzID0gIk9LIiB0aGVuCisgICAgICAgd3NjcmlwdC5RdWl0IDAgcmVtIG5vcm1hbCBleGl0CisgICBlbmQgaWYKK25leHQKK3JlbSBObyBzb3VuZCBjYXJkIGZvdW5kIC0gZXhpdCB3aXRoIHN0YXR1cyBjb2RlIG9mIDEKK3dzY3JpcHQuUXVpdCAxCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNS11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNS11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE1MzRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1LXV0ZjgudHh0CkBAIC0wLDAgKzEsOSBAQAor5aaC5L2V5ZyoIFB5dGhvbiDkuK3kvb/nlKjml6LmnInnmoQgQyBsaWJyYXJ5Pwor44CA5Zyo6LOH6KiK56eR5oqA5b+r6YCf55m85bGV55qE5LuK5aSpLCDplovnmbzlj4rmuKzoqabou5/pq5TnmoTpgJ/luqbmmK/kuI3lrrnlv73oppbnmoQKK+iqsumhjC4g54K65Yqg5b+r6ZaL55m85Y+K5ris6Kmm55qE6YCf5bqmLCDmiJHlgJHkvr/luLjluIzmnJvog73liKnnlKjkuIDkupvlt7Lplovnmbzlpb3nmoQKK2xpYnJhcnksIOS4puacieS4gOWAiyBmYXN0IHByb3RvdHlwaW5nIOeahCBwcm9ncmFtbWluZyBsYW5ndWFnZSDlj68KK+S+m+S9v+eUqC4g55uu5YmN5pyJ6Kix6Kix5aSa5aSa55qEIGxpYnJhcnkg5piv5LulIEMg5a+r5oiQLCDogIwgUHl0aG9uIOaYr+S4gOWAiworZmFzdCBwcm90b3R5cGluZyDnmoQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIOaVheaIkeWAkeW4jOacm+iDveWwh+aXouacieeahAorQyBsaWJyYXJ5IOaLv+WIsCBQeXRob24g55qE55Kw5aKD5Lit5ris6Kmm5Y+K5pW05ZCILiDlhbbkuK3mnIDkuLvopoHkuZ/mmK/miJHlgJHmiYAKK+imgeiojuirlueahOWVj+mhjOWwseaYrzoKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9iaWc1LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ0MjQ5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNS50eHQKQEAgLTAsMCArMSw5IEBACiumcKbzpmIgUHl0aG9uIKSkqM+lzqxKprOquiBDIGxpYnJhcnk/CiuhQKZiuOqwVKzsp96n1rN0tW+uaaq6pLWk0Swgtn21b6TOtPq41bNuxemqurN0q9esT6SjrmWpv7X4qroKK73Sw0QuIKywpVun1rZ9tW+kzrT6uNWqurN0q9csIKfarcyrS7Fgp8ax5q/gp1GlzqRAqMekd7Z9tW+mbqq6CitsaWJyYXJ5LCCow6azpECt0yBmYXN0IHByb3RvdHlwaW5nIKq6IHByb2dyYW1taW5nIGxhbmd1YWdlIKVpCiuo0ajPpc4uIKXYq2Wms7Ncs1ymaKZoqrogbGlicmFyeSCsT6VIIEMgvGemqCwgptMgUHl0aG9uIKxPpECt0worZmFzdCBwcm90b3R5cGluZyCquiBwcm9ncmFtbWluZyBsYW5ndWFnZS4grEen2q3Mp8ax5q/gsU6sSqazqroKK0MgbGlicmFyeSCus6jsIFB5dGhvbiCqusD0udKkpLT6uNWkzr7jplguIKjkpKSzzKVErW6kXaxPp9qtzKnSCiutbrBRvdequrDdw0S0TqxPOgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2JpZzVoa3Njcy11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNWhrc2NzLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDRjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2JpZzVoa3Njcy11dGY4LnR4dApAQCAtMCwwICsxLDIgQEAKK/CghIzEmum1rue9k+a0hgorw4rDisyEw6ogw6rDqsyECmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2JpZzVoa3Njcy50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2JpZzVoa3Njcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjNDJiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvYmlnNWhrc2NzLnR4dApAQCAtMCwwICsxLDIgQEAKK4hFiFyKc4vajdgKK4hmiGKIpyCIp4ijCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2NwOTQ5LXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9jcDk0OS11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU1ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9jcDk0OS11dGY4LnR4dApAQCAtMCwwICsxLDkgQEAKK+uYoOuwqeqwge2VmCDtjrLsi5zsvZzrnbwKKwor44mv44mv64KpISEg5Zug5Lmd5pyI7Yyo66+k66aU6raIIOKToeKTlu2bgMK/wr/CvyDquI3rkpkg4pOU646oIOOJry4gLgor5Lqe7JiB4pOU64ql7Zq5IC4gLiAuIC4g7ISc7Jq466SEIOuOkO2VmeS5mSDlrrbtm4AgISAhICHjhaAu44WgCivtnZDtnZDtnZAg44Sx44Sx44Sx4piG44WgX+OFoCDslrTrpqgg7YO47L2w6riQIOuOjOydkSDsuZHkuZ3rk6TkuZkg44mv65Oc6riQCivshKTrpowg5a627ZuAIC4gLiAuIC4g6rW07JWg7ImMIOKTlOq2iCDik6HrppjjibHquJAg5Zug5LuB5bed76aB5Lit6rmM7Ka8CivsmYDskoDtm4AgISAhIOS6nuyYgeKTlCDlrrbriqXqtogg4piG5LiK6rSAIOyXhuuKpeq2iOuKpSDkup7riqXrkojtm4Ag6riA7JWg65O0Civik6HroKTrk4DkuZ0g7IuA7ZKU7Ii07ZuAIOyWtOumqCDlm6Dku4Hlt53vpoHkuK3si4Hikajrk6TslZwhISDjia/jia/rgqnimaEg4oyS4oySKgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2NwOTQ5LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvY3A5NDkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTQ5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2NwOTQ5LnR4dApAQCAtMCwwICsxLDkgQEAKK4xjueawosfPILyEvcPE3bbzCisKK6jAqMCzsyEhIOzXzvrqxcbQkuaQcLHFIKjeqNPEUqKvoq+iryCx4IqWIKjRtbMgqMAuIC4KK+Ssv7Wo0bTJyMIgLiAuIC4gLiC8rb/vt+8gta/H0OvgIMqrxFIgISAhICGk0C6k0AoryOXI5cjlIKShpKGkoaHZpNBfpNAgvu6QiiDFy8Tig08gta7AwCCvaM76tenr4CCowLXlg08KK7yzkGogyqvEUiAuIC4gLiAuILG8vtaaZiCo0bHFIKjekHSowoNPIOzX7NL0ueX88emx7qOOCiu/zb6sxFIgISAhIOSsv7Wo0SDKq7TJscUgodnfvrD8IL74tMmxxbTJIOSstMm12MRSILHbvtaK2worqN63wbXgzvogmsPHtL2kxFIgvu6QiiDs1+zS9Lnl/PHpmsSo77XpndohISCowKjAs7OivSCh0qHSKgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2ppc3gwMjEzLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNTZhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy11dGY4LnR4dApAQCAtMCwwICsxLDggQEAKK1B5dGhvbiDjga7plovnmbrjga/jgIExOTkwIOW5tOOBlOOCjeOBi+OCiemWi+Wni+OBleOCjOOBpuOBhOOBvuOBmeOAggor6ZaL55m66ICF44GuIEd1aWRvIHZhbiBSb3NzdW0g44Gv5pWZ6IKy55So44Gu44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44CMQUJD44CN44Gu6ZaL55m644Gr5Y+C5Yqg44GX44Gm44GE44G+44GX44Gf44GM44CBQUJDIOOBr+Wun+eUqOS4iuOBruebrueahOOBq+OBr+OBguOBvuOCiumBqeOBl+OBpuOBhOOBvuOBm+OCk+OBp+OBl+OBn+OAggor44GT44Gu44Gf44KB44CBR3VpZG8g44Gv44KI44KK5a6f55So55qE44Gq44OX44Ot44Kw44Op44Of44Oz44Kw6KiA6Kqe44Gu6ZaL55m644KS6ZaL5aeL44GX44CB6Iux5Zu9IEJCUyDmlL7pgIHjga7jgrPjg6Hjg4fjgqPnlarntYTjgIzjg6Ljg7Pjg4bjgqMg44OR44Kk44K944Oz44CN44Gu44OV44Kh44Oz44Gn44GC44KLIEd1aWRvIOOBr+OBk+OBruiogOiqnuOCkuOAjFB5dGhvbuOAjeOBqOWQjeOBpeOBkeOBvuOBl+OBn+OAggor44GT44Gu44KI44GG44Gq6IOM5pmv44GL44KJ55Sf44G+44KM44GfIFB5dGhvbiDjga7oqIDoqp7oqK3oqIjjga/jgIHjgIzjgrfjg7Pjg5fjg6vjgI3jgafjgIznv5LlvpfjgYzlrrnmmJPjgI3jgajjgYTjgYbnm67mqJnjgavph43ngrnjgYznva7jgYvjgozjgabjgYTjgb7jgZnjgIIKK+WkmuOBj+OBruOCueOCr+ODquODl+ODiOezu+iogOiqnuOBp+OBr+ODpuODvOOCtuOBruebruWFiOOBruWIqeS+v+aAp+OCkuWEquWFiOOBl+OBpuiJsuOAheOBquapn+iDveOCkuiogOiqnuimgee0oOOBqOOBl+OBpuWPluOCiuWFpeOCjOOCi+WgtOWQiOOBjOWkmuOBhOOBruOBp+OBmeOBjOOAgVB5dGhvbiDjgafjga/jgZ3jgYbjgYTjgaPjgZ/lsI/ntLDlt6XjgYzov73liqDjgZXjgozjgovjgZPjgajjga/jgYLjgb7jgorjgYLjgorjgb7jgZvjgpPjgIIKK+iogOiqnuiHquS9k+OBruapn+iDveOBr+acgOWwj+mZkOOBq+aKvOOBleOBiOOAgeW/heimgeOBquapn+iDveOBr+aLoeW8teODouOCuOODpeODvOODq+OBqOOBl+OBpui/veWKoOOBmeOCi+OAgeOBqOOBhOOBhuOBruOBjCBQeXRob24g44Gu44Od44Oq44K344O844Gn44GZ44CCCisKK+ODjuOBi+OCmiDjg4jjgpog44OI44Kt76i276i5IPChmrTwqo6MIOm6gOm9gfCpm7AKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2ppc3gwMjEzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWU5MjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfamlzeDAyMTMudHh0CkBAIC0wLDAgKzEsOCBAQAorUHl0aG9uIKTOs6vIr6TPoaIxOTkwIMevpLSk7aSrpOmzq7vPpLWk7KTGpKSk3qS5oaMKK7OryK+81KTOIEd1aWRvIHZhbiBSb3NzdW0gpM+2tbDpzdGkzqXXpe2lsKXppd+l86WwuMC47KHWQUJDodekzrOryK+ky7uyssOkt6TGpKSk3qS3pL+krKGiQUJDIKTPvMLN0b7lpM7M3MWqpMukz6SipN6k6sWspLekxqSkpN6ku6TzpMekt6S/oaMKK6SzpM6kv6ThoaJHdWlkbyCkz6TopOq8ws3RxaqkyqXXpe2lsKXppd+l86WwuMC47KTOs6vIr6Tys6u7z6S3oaKx0bnxIEJCUyDK/MH3pM6ls6Xhpcelo8jWwcih1qXipfOlxqWjIKXRpaSlvaXzodekzqXVpaGl86THpKKk6yBHdWlkbyCkz6SzpM64wLjspPKh1lB5dGhvbqHXpMjMvqTFpLGk3qS3pL+howorpLOkzqTopKakysfYt8qkq6TpwLik3qTspL8gUHl0aG9uIKTOuMC47MDft9ekz6Giodalt6Xzpdel66HXpMeh1r2sxsCkrM3GsNeh16TIpKSkpszcybiky73FxcCkrMPWpKuk7KTGpKSk3qS5oaMKK8K/pK+kzqW5pa+l6qXXpci3z7jAuOykx6TPpeahvKW2pM7M3MDopM7N+MrYwK2k8s2lwOikt6TGv6ehuaTKtaHHvaTyuMC47M3XwcekyKS3pMa86KTqxv6k7KTrvuy556Sswr+kpKTOpMekuaSsoaJQeXRob24gpMekz6S9pKakpKTDpL++rrrZuamkrMTJssOktaTspOuks6TIpM+koqTepOqkoqTqpN6ku6TzoaMKK7jAuOy8q8LOpM61oce9pM+6x76uuMKky7KhpLWkqKGiyazN16TKtaHHvaTPs8jEpaXipbil5aG8peukyKS3pMbEybLDpLmk66GipMikpKSmpM6krCBQeXRob24gpM6l3aXqpbehvKTHpLmhoworCiulzqT3IKX+IKXIpa2vrK/aIM/jj/7YII/+1I/+6I/81gpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfanAtdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qcC11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzYzMjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfanAtdXRmOC50eHQKQEAgLTAsMCArMSw3IEBACitQeXRob24g44Gu6ZaL55m644Gv44CBMTk5MCDlubTjgZTjgo3jgYvjgonplovlp4vjgZXjgozjgabjgYTjgb7jgZnjgIIKK+mWi+eZuuiAheOBriBHdWlkbyB2YW4gUm9zc3VtIOOBr+aVmeiCsueUqOOBruODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOAjEFCQ+OAjeOBrumWi+eZuuOBq+WPguWKoOOBl+OBpuOBhOOBvuOBl+OBn+OBjOOAgUFCQyDjga/lrp/nlKjkuIrjga7nm67nmoTjgavjga/jgYLjgb7jgorpganjgZfjgabjgYTjgb7jgZvjgpPjgafjgZfjgZ/jgIIKK+OBk+OBruOBn+OCgeOAgUd1aWRvIOOBr+OCiOOCiuWun+eUqOeahOOBquODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOBrumWi+eZuuOCkumWi+Wni+OBl+OAgeiLseWbvSBCQlMg5pS+6YCB44Gu44Kz44Oh44OH44Kj55Wq57WE44CM44Oi44Oz44OG44KjIOODkeOCpOOCveODs+OAjeOBruODleOCoeODs+OBp+OBguOCiyBHdWlkbyDjga/jgZPjga7oqIDoqp7jgpLjgIxQeXRob27jgI3jgajlkI3jgaXjgZHjgb7jgZfjgZ/jgIIKK+OBk+OBruOCiOOBhuOBquiDjOaZr+OBi+OCieeUn+OBvuOCjOOBnyBQeXRob24g44Gu6KiA6Kqe6Kit6KiI44Gv44CB44CM44K344Oz44OX44Or44CN44Gn44CM57+S5b6X44GM5a655piT44CN44Go44GE44GG55uu5qiZ44Gr6YeN54K544GM572u44GL44KM44Gm44GE44G+44GZ44CCCivlpJrjgY/jga7jgrnjgq/jg6rjg5fjg4jns7voqIDoqp7jgafjga/jg6bjg7zjgrbjga7nm67lhYjjga7liKnkvr/mgKfjgpLlhKrlhYjjgZfjgaboibLjgIXjgarmqZ/og73jgpLoqIDoqp7opoHntKDjgajjgZfjgablj5bjgorlhaXjgozjgovloLTlkIjjgYzlpJrjgYTjga7jgafjgZnjgYzjgIFQeXRob24g44Gn44Gv44Gd44GG44GE44Gj44Gf5bCP57Sw5bel44GM6L+95Yqg44GV44KM44KL44GT44Go44Gv44GC44G+44KK44GC44KK44G+44Gb44KT44CCCivoqIDoqp7oh6rkvZPjga7mqZ/og73jga/mnIDlsI/pmZDjgavmirzjgZXjgYjjgIHlv4XopoHjgarmqZ/og73jga/mi6HlvLXjg6Ljgrjjg6Xjg7zjg6vjgajjgZfjgabov73liqDjgZnjgovjgIHjgajjgYTjgYbjga7jgYwgUHl0aG9uIOOBruODneODquOCt+ODvOOBp+OBmeOAggorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qcC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19qcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhNmI1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2pwLnR4dApAQCAtMCwwICsxLDcgQEAKK1B5dGhvbiCkzrOryK+kz6GiMTk5MCDHr6S0pO2kq6Tps6u7z6S1pOykxqSkpN6kuaGjCiuzq8ivvNSkziBHdWlkbyB2YW4gUm9zc3VtIKTPtrWw6c3RpM6l16XtpbCl6aXfpfOlsLjAuOyh1kFCQ6HXpM6zq8ivpMu7srLDpLekxqSkpN6kt6S/pKyhokFCQyCkz7zCzdG+5aTOzNzFqqTLpM+koqTepOrFrKS3pMakpKTepLuk86THpLekv6GjCiuks6TOpL+k4aGiR3VpZG8gpM+k6KTqvMLN0cWqpMql16XtpbCl6aXfpfOlsLjAuOykzrOryK+k8rOru8+kt6GisdG58SBCQlMgyvzB96TOpbOl4aXHpaPI1sHIodal4qXzpcaloyCl0aWkpb2l86HXpM6l1aWhpfOkx6SipOsgR3VpZG8gpM+ks6TOuMC47KTyodZQeXRob26h16TIzL6kxaSxpN6kt6S/oaMKK6SzpM6k6KSmpMrH2LfKpKuk6cC4pN6k7KS/IFB5dGhvbiCkzrjAuOzA37fXpM+hoqHWpbel86XXpeuh16THoda9rMbApKzNxrDXodekyKSkpKbM3Mm4pMu9xcXApKzD1qSrpOykxqSkpN6kuaGjCivCv6SvpM6luaWvpeql16XIt8+4wLjspMekz6XmobyltqTOzNzA6KTOzfjK2MCtpPLNpcDopLekxr+nobmkyrWhx72k8rjAuOzN18HHpMikt6TGvOik6sb+pOyk677sueekrMK/pKSkzqTHpLmkrKGiUHl0aG9uIKTHpM+kvaSmpKSkw6S/vq662bmppKzEybLDpLWk7KTrpLOkyKTPpKKk3qTqpKKk6qTepLuk86GjCiu4wLjsvKvCzqTOtaHHvaTPuse+rrjCpMuyoaS1pKihosmszdekyrWhx72kz7PIxKWl4qW4peWhvKXrpMikt6TGxMmyw6S5pOuhoqTIpKSkpqTOpKwgUHl0aG9uIKTOpd2l6qW3obykx6S5oaMKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfa3ItdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2V1Y19rci11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMzNzQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfa3ItdXRmOC50eHQKQEAgLTAsMCArMSw3IEBACivil44g7YyM7J207I2sKFB5dGhvbinsnYAg67Cw7Jqw6riwIOyJveqzoCwg6rCV66Cl7ZWcIO2UhOuhnOq3uOuemOuwjSDslrjslrTsnoXri4jri6QuIO2MjOydtOyNrOydgAor7Zqo7Jyo7KCB7J24IOqzoOyImOykgCDrjbDsnbTthLAg6rWs7KGw7JmAIOqwhOuLqO2VmOyngOunjCDtmqjsnKjsoIHsnbgg6rCd7LK07KeA7Zal7ZSE66Gc6re4656Y67CN7J2ECivsp4Dsm5Dtlanri4jri6QuIO2MjOydtOyNrOydmCDsmrDslYQo5YSq6ZuFKe2VnCDrrLjrspXqs7wg64+Z7KCBIO2DgOydtO2VkSwg6re466as6rOgIOyduO2EsO2UhOumrO2MhQor7ZmY6rK97J2AIO2MjOydtOyNrOydhCDsiqTtgazrpr3tjIXqs7wg7Jes65+sIOu2hOyVvOyXkOyEnOyZgCDrjIDrtoDrtoTsnZgg7ZSM656r7Y+87JeQ7ISc7J2YIOu5oOuluAor7JWg7ZSM66as7LyA7J207IWYIOqwnOuwnOydhCDtlaAg7IiYIOyeiOuKlCDsnbTsg4HsoIHsnbgg7Ja47Ja066GcIOunjOuTpOyWtOykjeuLiOuLpC4KKwor4piG7LKr6rCA64GdOiDrgqDslYTrnbwg7JOU7JOU7JOpfiDri4HtgbwhIOucveq4iOyXhuydtCDsoITtmaXri4jri6QuIOu3gS4g6re465+w6rGwIOydjuuLpC4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2tyLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZXVjX2tyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhkZDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9ldWNfa3IudHh0CkBAIC0wLDAgKzEsNyBAQAorod0gxsTAzL3jKFB5dGhvbinAuiC56L/sseIgvbGw7SwgsK23wsfRIMfBt86x17ehudYgvvC+7sDUtM+02S4gxsTAzL3jwLoKK8i/wLLA+8DOILDtvPbB2CC1pcDMxc0gsbjBtr/NILCjtNzHz8H2uLggyL/AssD7wM4gsLTDvMH2x+LHwbfOsde3obnWwLsKK8H2v/jH1bTPtNkuIMbEwMy948DHIL/svsYo6dDkuinH0SC5rrn9sPogtb/A+yDFuMDMx84sILHXuK6w7SDAzsXNx8G4rsbDCivIr7DmwLogxsTAzL3jwLsgvbrFqbizxsOw+iC/qbevILrQvt+/obytv80gtOu6zrrQwMcgx8O3p8b7v6G8rcDHILr8uKUKK77Wx8O4rsTJwMy8xyCws7nfwLsgx9IgvPYgwNa0wiDAzLvzwPvAziC+8L7ut84guLi16b7uwd20z7TZLgorCiuh2cO5sKGzoTogs6++xrbzIKTUpLak0KTUpNSktqTQpNS+sX4gpNSkpKTSpLfFrSEgpNSkqKTRpLex3b74wMwgwPyk1KS+pMiksrTPtNkuIKTUpLKkzqSqLiCx17exsMUgpNSkt6TRpLS02S4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IxODAzMC11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IxODAzMC11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDYwZDI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjE4MDMwLXV0ZjgudHh0CkBAIC0wLDAgKzEsMTUgQEAKK1B5dGhvbu+8iOa0vuajru+8ieivreiogOaYr+S4gOenjeWKn+iDveW8uuWkp+iAjOWujOWWhOeahOmAmueUqOWei+iuoeeul+acuueoi+W6j+iuvuiuoeivreiogO+8jAor5bey57uP5YW35pyJ5Y2B5aSa5bm055qE5Y+R5bGV5Y6G5Y+y77yM5oiQ54af5LiU56iz5a6a44CC6L+Z56eN6K+t6KiA5YW35pyJ6Z2e5bi4566A5o236ICM5riF5pmwCivnmoTor63ms5XnibnngrnvvIzpgILlkIjlrozmiJDlkITnp43pq5jlsYLku7vliqHvvIzlh6DkuY7lj6/ku6XlnKjmiYDmnInnmoTmk43kvZzns7vnu5/kuK0KK+i/kOihjOOAgui/meenjeivreiogOeugOWNleiAjOW8uuWkp++8jOmAguWQiOWQhOenjeS6uuWjq+WtpuS5oOS9v+eUqOOAguebruWJje+8jOWfuuS6jui/mQor56eN6K+t6KiA55qE55u45YWz5oqA5pyv5q2j5Zyo6aOe6YCf55qE5Y+R5bGV77yM55So5oi35pWw6YeP5oCl5Ymn5omp5aSn77yM55u45YWz55qE6LWE5rqQ6Z2e5bi45aSa44CCCivlpoLkvZXlnKggUHl0aG9uIOS4reS9v+eUqOaXouacieeahCBDIGxpYnJhcnk/CivjgIDlnKjos4foqIrnp5HmioDlv6vpgJ/nmbzlsZXnmoTku4rlpKksIOmWi+eZvOWPiua4rOippui7n+mrlOeahOmAn+W6puaYr+S4jeWuueW/veimlueahAor6Kqy6aGMLiDngrrliqDlv6vplovnmbzlj4rmuKzoqabnmoTpgJ/luqYsIOaIkeWAkeS+v+W4uOW4jOacm+iDveWIqeeUqOS4gOS6m+W3sumWi+eZvOWlveeahAorbGlicmFyeSwg5Lim5pyJ5LiA5YCLIGZhc3QgcHJvdG90eXBpbmcg55qEIHByb2dyYW1taW5nIGxhbmd1YWdlIOWPrwor5L6b5L2/55SoLiDnm67liY3mnInoqLHoqLHlpJrlpJrnmoQgbGlicmFyeSDmmK/ku6UgQyDlr6vmiJAsIOiAjCBQeXRob24g5piv5LiA5YCLCitmYXN0IHByb3RvdHlwaW5nIOeahCBwcm9ncmFtbWluZyBsYW5ndWFnZS4g5pWF5oiR5YCR5biM5pyb6IO95bCH5pei5pyJ55qECitDIGxpYnJhcnkg5ou/5YiwIFB5dGhvbiDnmoTnkrDlooPkuK3muKzoqablj4rmlbTlkIguIOWFtuS4reacgOS4u+imgeS5n+aYr+aIkeWAkeaJgAor6KaB6KiO6KuW55qE5ZWP6aGM5bCx5pivOgor7YyM7J207I2s7J2AIOqwleugpe2VnCDquLDriqXsnYQg7KeA64uMIOuylOyaqSDsu7Ttk6jthLAg7ZSE66Gc6re4656Y67CNIOyWuOyWtOuLpC4KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjE4MDMwLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IxODAzMC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxZjZkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IxODAzMC50eHQKQEAgLTAsMCArMSwxNSBAQAorUHl0aG9uo6jFycmto6nT79HUysfSu9bWuabE3Me/tPO2+M3qyca1xM2o08PQzbzGy+O7+rPM0PLJ6LzG0+/R1KOsCivS0b6tvt/T0MqutuDE6rXEt6LVucD6yrejrLPJyuzH0s7Itqiho9Xi1tbT79HUvt/T0LfHs6O88r3dtvjH5c76Ciu1xNPvt6jM2LXjo6zKyrrPzeqzybj31ta437LjyM7O8aOsvLi69b/J0tTU2sv509C1xLLZ1/fPtc2z1tAKK9TL0NCho9Xi1tbT79HUvPK1pbb4x7+086Osysq6z7j31tbIy8q/0afPsMq508Oho8S/x7CjrLv509rV4gor1tbT79HUtcTP4LnYvLzK9dX91Nq3ycvZtcS3otW5o6zTw7unyv3Bv7yxvufAqbTzo6zP4LnYtcTXytS0t8ezo7bgoaMKK8jnus7U2iBQeXRob24g1tDKudPDvMjT0LXEIEMgbGlicmFyeT8KK6Gh1NrZWdONv8a8vL/sy9mwbNW5tcS98czsLCDpX7BsvLCcedSH3Jvzd7XEy9m2yMrHsrvI3br20pW1xAor1W7ufS4gnum807/s6V+wbLywnHnUh7XEy9m2yCwgztKCg7Hjs6PPo837xNzA+9PD0rvQqdLR6V+wbLrDtcQKK2xpYnJhcnksIIFL09DSu4KAIGZhc3QgcHJvdG90eXBpbmcgtcQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugv8kKK7mpyrnTwy4gxL/HsNPQ1FPUU7bgtuC1xCBsaWJyYXJ5IMrH0tQgQyCMkbPJLCC2+CBQeXRob24gysfSu4KACitmYXN0IHByb3RvdHlwaW5nILXEIHByb2dyYW1taW5nIGxhbmd1YWdlLiC5ys7SgoPPo837xNyMorzI09C1xAorQyBsaWJyYXJ5IMTDtb0gUHl0aG9uILXErWi+s9bQnHnUh7yw1fu6zy4gxuTW0Nfu1vfSqtKyysfO0oKDy/kKK9Kq05HVk7XEhpbufb7Nysc6CiuDNccxgzOaM4MysTGDM5UxIII30TaDMIw0gzaEMyCCOIk1gjj7NoMzlTUggzPVMYI5gTUggzD9OYMzhjAggzTcM4M19jeDNZc1IIM1+TWDMJE5gjiDOYI5/DODMPA0IIMy6zmDMus1gjmDOS4KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjIzMTItdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diMjMxMi11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmI3ZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYjIzMTItdXRmOC50eHQKQEAgLTAsMCArMSw2IEBACitQeXRob27vvIjmtL7mo67vvInor63oqIDmmK/kuIDnp43lip/og73lvLrlpKfogIzlrozlloTnmoTpgJrnlKjlnovorqHnrpfmnLrnqIvluo/orr7orqHor63oqIDvvIwKK+W3sue7j+WFt+acieWNgeWkmuW5tOeahOWPkeWxleWOhuWPsu+8jOaIkOeGn+S4lOeos+WumuOAgui/meenjeivreiogOWFt+aciemdnuW4uOeugOaNt+iAjOa4heaZsAor55qE6K+t5rOV54m554K577yM6YCC5ZCI5a6M5oiQ5ZCE56eN6auY5bGC5Lu75Yqh77yM5Yeg5LmO5Y+v5Lul5Zyo5omA5pyJ55qE5pON5L2c57O757uf5LitCivov5DooYzjgILov5nnp43or63oqIDnroDljZXogIzlvLrlpKfvvIzpgILlkIjlkITnp43kurrlo6vlrabkuaDkvb/nlKjjgILnm67liY3vvIzln7rkuo7ov5kKK+enjeivreiogOeahOebuOWFs+aKgOacr+ato+WcqOmjnumAn+eahOWPkeWxle+8jOeUqOaIt+aVsOmHj+aApeWJp+aJqeWkp++8jOebuOWFs+eahOi1hOa6kOmdnuW4uOWkmuOAggorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diMjMxMi50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diMjMxMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzNmFjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2IyMzEyLnR4dApAQCAtMCwwICsxLDYgQEAKK1B5dGhvbqOoxcnJraOp0+/R1MrH0rvW1rmmxNzHv7TztvjN6snGtcTNqNPD0M28xsvju/qzzNDyyei8xtPv0dSjrAor0tG+rb7f09DKrrbgxOq1xLei1bnA+sq3o6yzycrsx9LOyLaooaPV4tbW0+/R1L7f09C3x7OjvPK93bb4x+XO+gortcTT77eozNi146Osysq6z83qs8m499bWuN+y48jOzvGjrLy4uvW/ydLU1NrL+dPQtcSy2df3z7XNs9bQCivUy9DQoaPV4tbW0+/R1LzytaW2+Me/tPOjrMrKus+499bWyMvKv9Gnz7DKudPDoaPEv8ewo6y7+dPa1eIKK9bW0+/R1LXEz+C52Ly8yvXV/dTat8nL2bXEt6LVuaOs08O7p8r9wb+8sb7nwKm086Osz+C52LXE18rUtLfHs6O24KGjCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2JrLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9nYmstdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViYmQzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2JrLXV0ZjgudHh0CkBAIC0wLDAgKzEsMTQgQEAKK1B5dGhvbu+8iOa0vuajru+8ieivreiogOaYr+S4gOenjeWKn+iDveW8uuWkp+iAjOWujOWWhOeahOmAmueUqOWei+iuoeeul+acuueoi+W6j+iuvuiuoeivreiogO+8jAor5bey57uP5YW35pyJ5Y2B5aSa5bm055qE5Y+R5bGV5Y6G5Y+y77yM5oiQ54af5LiU56iz5a6a44CC6L+Z56eN6K+t6KiA5YW35pyJ6Z2e5bi4566A5o236ICM5riF5pmwCivnmoTor63ms5XnibnngrnvvIzpgILlkIjlrozmiJDlkITnp43pq5jlsYLku7vliqHvvIzlh6DkuY7lj6/ku6XlnKjmiYDmnInnmoTmk43kvZzns7vnu5/kuK0KK+i/kOihjOOAgui/meenjeivreiogOeugOWNleiAjOW8uuWkp++8jOmAguWQiOWQhOenjeS6uuWjq+WtpuS5oOS9v+eUqOOAguebruWJje+8jOWfuuS6jui/mQor56eN6K+t6KiA55qE55u45YWz5oqA5pyv5q2j5Zyo6aOe6YCf55qE5Y+R5bGV77yM55So5oi35pWw6YeP5oCl5Ymn5omp5aSn77yM55u45YWz55qE6LWE5rqQ6Z2e5bi45aSa44CCCivlpoLkvZXlnKggUHl0aG9uIOS4reS9v+eUqOaXouacieeahCBDIGxpYnJhcnk/CivjgIDlnKjos4foqIrnp5HmioDlv6vpgJ/nmbzlsZXnmoTku4rlpKksIOmWi+eZvOWPiua4rOippui7n+mrlOeahOmAn+W6puaYr+S4jeWuueW/veimlueahAor6Kqy6aGMLiDngrrliqDlv6vplovnmbzlj4rmuKzoqabnmoTpgJ/luqYsIOaIkeWAkeS+v+W4uOW4jOacm+iDveWIqeeUqOS4gOS6m+W3sumWi+eZvOWlveeahAorbGlicmFyeSwg5Lim5pyJ5LiA5YCLIGZhc3QgcHJvdG90eXBpbmcg55qEIHByb2dyYW1taW5nIGxhbmd1YWdlIOWPrwor5L6b5L2/55SoLiDnm67liY3mnInoqLHoqLHlpJrlpJrnmoQgbGlicmFyeSDmmK/ku6UgQyDlr6vmiJAsIOiAjCBQeXRob24g5piv5LiA5YCLCitmYXN0IHByb3RvdHlwaW5nIOeahCBwcm9ncmFtbWluZyBsYW5ndWFnZS4g5pWF5oiR5YCR5biM5pyb6IO95bCH5pei5pyJ55qECitDIGxpYnJhcnkg5ou/5YiwIFB5dGhvbiDnmoTnkrDlooPkuK3muKzoqablj4rmlbTlkIguIOWFtuS4reacgOS4u+imgeS5n+aYr+aIkeWAkeaJgAor6KaB6KiO6KuW55qE5ZWP6aGM5bCx5pivOgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diay50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2diay50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4OGY4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvZ2JrLnR4dApAQCAtMCwwICsxLDE0IEBACitQeXRob26jqMXJya2jqdPv0dTKx9K71ta5psTcx7+087b4zerJxrXEzajTw9DNvMbL47v6s8zQ8snovMbT79HUo6wKK9LRvq2+39PQyq624MTqtcS3otW5wPrKt6Oss8nK7MfSzsi2qKGj1eLW1tPv0dS+39PQt8ezo7zyvd22+MflzvoKK7XE0++3qMzYteOjrMrKus/N6rPJuPfW1rjfsuPIzs7xo6y8uLr1v8nS1NTay/nT0LXEstnX98+1zbPW0Aor1MvQ0KGj1eLW1tPv0dS88rWltvjHv7Tzo6zKyrrPuPfW1sjLyr/Rp8+wyrnTw6GjxL/HsKOsu/nT2tXiCivW1tPv0dS1xM/gudi8vMr11f3U2rfJy9m1xLei1bmjrNPDu6fK/cG/vLG+58CptPOjrM/gudi1xNfK1LS3x7OjtuChoworyOe6ztTaIFB5dGhvbiDW0Mq508O8yNPQtcQgQyBsaWJyYXJ5PworoaHU2tlZ042/xry8v+zL2bBs1bm1xL3xzOwsIOlfsGy8sJx51Ifcm/N3tcTL2bbIyseyu8jduvbSlbXECivVbu59LiCe6bzTv+zpX7BsvLCcedSHtcTL2bbILCDO0oKDseOzo8+jzfvE3MD708PSu9Cp0tHpX7BsusO1xAorbGlicmFyeSwggUvT0NK7goAgZmFzdCBwcm90b3R5cGluZyC1xCBwcm9ncmFtbWluZyBsYW5ndWFnZSC/yQoruanKudPDLiDEv8ew09DUU9RTtuC24LXEIGxpYnJhcnkgysfS1CBDIIyRs8ksILb4IFB5dGhvbiDKx9K7goAKK2Zhc3QgcHJvdG90eXBpbmcgtcQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuILnKztKCg8+jzfvE3IyivMjT0LXECitDIGxpYnJhcnkgxMO1vSBQeXRob24gtcStaL6z1tCcedSHvLDV+7rPLiDG5NbQ1+7W99Kq0rLKx87SgoPL+Qor0qrTkdWTtcSGlu59vs3KxzoKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9oei11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvaHotdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxMTczNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3MvaHotdXRmOC50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIHNlbnRlbmNlIGlzIGluIEFTQ0lJLgorVGhlIG5leHQgc2VudGVuY2UgaXMgaW4gR0Iu5bex5omA5LiN5qyy77yM5Yu/5pa95pa85Lq644CCQnllLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9oei50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2h6LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODgyZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9oei50eHQKQEAgLTAsMCArMSwyIEBACitUaGlzIHNlbnRlbmNlIGlzIGluIEFTQ0lJLgorVGhlIG5leHQgc2VudGVuY2UgaXMgaW4gR0Iufns8Okt5MjtTeyMsTnBKKWw2SEshI359QnllLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2pwLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2pwLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjMyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfanAtdXRmOC50eHQKQEAgLTAsMCArMSw3IEBACitQeXRob24g44Gu6ZaL55m644Gv44CBMTk5MCDlubTjgZTjgo3jgYvjgonplovlp4vjgZXjgozjgabjgYTjgb7jgZnjgIIKK+mWi+eZuuiAheOBriBHdWlkbyB2YW4gUm9zc3VtIOOBr+aVmeiCsueUqOOBruODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOAjEFCQ+OAjeOBrumWi+eZuuOBq+WPguWKoOOBl+OBpuOBhOOBvuOBl+OBn+OBjOOAgUFCQyDjga/lrp/nlKjkuIrjga7nm67nmoTjgavjga/jgYLjgb7jgorpganjgZfjgabjgYTjgb7jgZvjgpPjgafjgZfjgZ/jgIIKK+OBk+OBruOBn+OCgeOAgUd1aWRvIOOBr+OCiOOCiuWun+eUqOeahOOBquODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOBrumWi+eZuuOCkumWi+Wni+OBl+OAgeiLseWbvSBCQlMg5pS+6YCB44Gu44Kz44Oh44OH44Kj55Wq57WE44CM44Oi44Oz44OG44KjIOODkeOCpOOCveODs+OAjeOBruODleOCoeODs+OBp+OBguOCiyBHdWlkbyDjga/jgZPjga7oqIDoqp7jgpLjgIxQeXRob27jgI3jgajlkI3jgaXjgZHjgb7jgZfjgZ/jgIIKK+OBk+OBruOCiOOBhuOBquiDjOaZr+OBi+OCieeUn+OBvuOCjOOBnyBQeXRob24g44Gu6KiA6Kqe6Kit6KiI44Gv44CB44CM44K344Oz44OX44Or44CN44Gn44CM57+S5b6X44GM5a655piT44CN44Go44GE44GG55uu5qiZ44Gr6YeN54K544GM572u44GL44KM44Gm44GE44G+44GZ44CCCivlpJrjgY/jga7jgrnjgq/jg6rjg5fjg4jns7voqIDoqp7jgafjga/jg6bjg7zjgrbjga7nm67lhYjjga7liKnkvr/mgKfjgpLlhKrlhYjjgZfjgaboibLjgIXjgarmqZ/og73jgpLoqIDoqp7opoHntKDjgajjgZfjgablj5bjgorlhaXjgozjgovloLTlkIjjgYzlpJrjgYTjga7jgafjgZnjgYzjgIFQeXRob24g44Gn44Gv44Gd44GG44GE44Gj44Gf5bCP57Sw5bel44GM6L+95Yqg44GV44KM44KL44GT44Go44Gv44GC44G+44KK44GC44KK44G+44Gb44KT44CCCivoqIDoqp7oh6rkvZPjga7mqZ/og73jga/mnIDlsI/pmZDjgavmirzjgZXjgYjjgIHlv4XopoHjgarmqZ/og73jga/mi6HlvLXjg6Ljgrjjg6Xjg7zjg6vjgajjgZfjgabov73liqDjgZnjgovjgIHjgajjgYTjgYbjga7jgYwgUHl0aG9uIOOBruODneODquOCt+ODvOOBp+OBmeOAggorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfanAudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2pwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzM5OGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2pwLnR4dApAQCAtMCwwICsxLDcgQEAKK1B5dGhvbiAbJEIkTjMrSC8kTyEiGyhCMTk5MCAbJEJHLyQ0JG0kKyRpMys7TyQ1JGwkRiQkJF4kOSEjGyhCCisbJEIzK0gvPFQkThsoQiBHdWlkbyB2YW4gUm9zc3VtIBskQiRPNjUwaU1RJE4lVyVtJTAlaSVfJXMlMDhAOGwhVhsoQkFCQxskQiFXJE4zK0gvJEs7MjJDJDckRiQkJF4kNyQ/JCwhIhsoQkFCQyAbJEIkTzxCTVE+ZSROTFxFKiRLJE8kIiReJGpFLCQ3JEYkJCReJDskcyRHJDckPyEjGyhCCisbJEIkMyROJD8kYSEiGyhCR3VpZG8gGyRCJE8kaCRqPEJNUUUqJEolVyVtJTAlaSVfJXMlMDhAOGwkTjMrSC8kcjMrO08kNyEiMVE5cRsoQiBCQlMgGyRCSnxBdyROJTMlYSVHJSNIVkFIIVYlYiVzJUYlIxsoQiAbJEIlUSUkJT0lcyFXJE4lVSUhJXMkRyQiJGsbKEIgR3VpZG8gGyRCJE8kMyROOEA4bCRyIVYbKEJQeXRob24bJEIhVyRITD4kRSQxJF4kNyQ/ISMbKEIKKxskQiQzJE4kaCQmJEpHWDdKJCskaUA4JF4kbCQ/GyhCIFB5dGhvbiAbJEIkTjhAOGxAXzdXJE8hIiFWJTclcyVXJWshVyRHIVY9LEZAJCxNRjBXIVckSCQkJCZMXEk4JEs9RUVAJCxDViQrJGwkRiQkJF4kOSEjGyhCCisbJEJCPyQvJE4lOSUvJWolVyVIN084QDhsJEckTyVmITwlNiROTFxAaCROTXhKWEAtJHJNJUBoJDckRj8nITkkSjUhRz0kcjhAOGxNV0FHJEgkNyRGPGgkakZ+JGwkaz5sOWckLEI/JCQkTiRHJDkkLCEiGyhCUHl0aG9uIBskQiRHJE8kPSQmJCQkQyQ/Pi46WTkpJCxESTJDJDUkbCRrJDMkSCRPJCIkXiRqJCIkaiReJDskcyEjGyhCCisbJEI4QDhsPCtCTiRONSFHPSRPOkc+LjhCJEsyISQ1JCghIkksTVckSjUhRz0kTzNIRCUlYiU4JWUhPCVrJEgkNyRGREkyQyQ5JGshIiRIJCQkJiROJCwbKEIgUHl0aG9uIBskQiROJV0laiU3ITwkRyQ5ISMbKEIKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2tyLXV0ZjgudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2tyLXV0ZjgudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YzlkNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfa3ItdXRmOC50eHQKQEAgLTAsMCArMSw3IEBACivil44g7YyM7J207I2sKFB5dGhvbinsnYAg67Cw7Jqw6riwIOyJveqzoCwg6rCV66Cl7ZWcIO2UhOuhnOq3uOuemOuwjSDslrjslrTsnoXri4jri6QuIO2MjOydtOyNrOydgAor7Zqo7Jyo7KCB7J24IOqzoOyImOykgCDrjbDsnbTthLAg6rWs7KGw7JmAIOqwhOuLqO2VmOyngOunjCDtmqjsnKjsoIHsnbgg6rCd7LK07KeA7Zal7ZSE66Gc6re4656Y67CN7J2ECivsp4Dsm5Dtlanri4jri6QuIO2MjOydtOyNrOydmCDsmrDslYQo5YSq6ZuFKe2VnCDrrLjrspXqs7wg64+Z7KCBIO2DgOydtO2VkSwg6re466as6rOgIOyduO2EsO2UhOumrO2MhQor7ZmY6rK97J2AIO2MjOydtOyNrOydhCDsiqTtgazrpr3tjIXqs7wg7Jes65+sIOu2hOyVvOyXkOyEnOyZgCDrjIDrtoDrtoTsnZgg7ZSM656r7Y+87JeQ7ISc7J2YIOu5oOuluAor7JWg7ZSM66as7LyA7J207IWYIOqwnOuwnOydhCDtlaAg7IiYIOyeiOuKlCDsnbTsg4HsoIHsnbgg7Ja47Ja066GcIOunjOuTpOyWtOykjeuLiOuLpC4KKwor4piG7LKr6rCA64GdOiDrgqDslYTrnbwg7JOpfiDtgbwhIOq4iOyXhuydtCDsoITri4jri6QuIOq3uOufsOqxsCDri6QuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2lzbzIwMjJfa3IudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2tyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2VjZTIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9pc28yMDIyX2tyLnR4dApAQCAtMCwwICsxLDcgQEAKKxskKUMOIV0PIA5GREBMPWMPKFB5dGhvbikOQDoPIA45aD9sMWIPIA49MTBtDywgDjAtN0JHUQ8gDkdBN04xVzchOVYPIA4+cD5uQFQ0TzRZDy4gDkZEQEw9Y0A6DworDkg/QDJAe0BODyAOMG08dkFYDyAONSVATEVNDyAOMThBNj9NDyAOMCM0XEdPQXY4OA8gDkg/QDJAe0BODyAOMDRDPEF2R2JHQTdOMVc3ITlWQDsPCisOQXY/eEdVNE80WQ8uIA5GREBMPWNARw8gDj9sPkYPKA5pUGQ6DykOR1EPIA45Ljl9MHoPIA41P0B7DyAORThATEdODywgDjFXOC4wbQ8gDkBORU1HQTguRkMPCisOSC8wZkA6DyAORkRATD1jQDsPIA49OkUpODNGQzB6DyAOPyk3Lw8gDjpQPl8/ITwtP00PIA40azpOOlBARw8gDkdDNydGez8hPC1ARw8gDjp8OCUPCisOPlZHQzguRElATDxHDyAOMDM5X0A7DyAOR1IPIA48dg8gDkBWNEIPIA5ATDtzQHtATg8gDj5wPm43Tg8gDjg4NWk+bkFdNE80WQ8uCisKKw4hWUM5MCEzIQ86IA4zLz5GNnMPIA4+MQ9+IA5FLQ8hIA4xXT54QEwPIA5AfDRPNFkPLiAOMVc3MTBFDyAONFkPLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9qb2hhYi11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvam9oYWItdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY1NWUzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvam9oYWItdXRmOC50eHQKQEAgLTAsMCArMSw5IEBACivrmKDrsKnqsIHtlZgg7Y6y7Iuc7L2c6528CisKK+OJr+OJr+uCqSEhIOWboOS5neaciO2MqOuvpOumlOq2iCDik6Hik5btm4DCv8K/wr8g6riN65KZIOKTlOuOqCDjia8uIC4KK+S6nuyYgeKTlOuKpe2auSAuIC4gLiAuIOyEnOyauOukhCDrjpDtlZnkuZkg5a627ZuAICEgISAh44WgLuOFoAor7Z2Q7Z2Q7Z2QIOOEseOEseOEseKYhuOFoF/jhaAg7Ja066aoIO2DuOy9sOq4kCDrjozsnZEg7LmR5Lmd65Ok5LmZIOOJr+uTnOq4kAor7ISk66aMIOWutu2bgCAuIC4gLiAuIOq1tOyVoOyJjCDik5Tqtogg4pOh66aY44mx6riQIOWboOS7geW3ne+mgeS4req5jOymvAor7JmA7JKA7ZuAICEgISDkup7smIHik5Qg5a6264ql6raIIOKYhuS4iuq0gCDsl4briqXqtojriqUg5Lqe64ql65KI7ZuAIOq4gOyVoOuTtAor4pOh66Ck65OA5LmdIOyLgO2SlOyItO2bgCDslrTrpqgg5Zug5LuB5bed76aB5Lit7IuB4pGo65Ok7JWcISEg44mv44mv64Kp4pmhIOKMkuKMkioKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9qb2hhYi50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL2pvaGFiLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjc3ODFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9qb2hhYi50eHQKQEAgLTAsMCArMSw5IEBACiuZsaR3iGLQYSDNXK+hxamcYQorCivcwNzAkHMhISDxZ+Kc8FXMgaOJn4WKoSDc3tzT0nrZr9mv2a8gi3eW0yDc0ZWBINzALiAuCivtPLV33NGTd9JzIC4gLiAuIC4grOG2iZ6hIJVl0GLw4CDgO9J6ICEgISAhh0Euh0EKK9Nh02HTYSCIQYhBiEHZaYdBX4dBILThn5ogyKHFwYt6IJVht3cgw5finJdp8OAg3MCXYYt6Cius6Z96IOA70nogLiAuIC4gLiCKibSBrrog3NGKoSDc3p+J3MKLeiDxZ/Fi9Unt/PPpjGG7mgortcGyodJ6ICEgISDtPLV33NEg4DuTd4qhINlp6r6JxSC09JN3iqGTdyDtPJN3lsHSeiCLabSBl3oKK9zenWGXQeKcIK+BzqGuodJ6ILThn5og8WfxYvVJ7fzz6a+C3O+XabR6ISEg3MDcwJBz2b0g2WLZYioKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9zaGlmdF9qaXMtdXRmOC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppcy11dGY4LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzYzMjUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9zaGlmdF9qaXMtdXRmOC50eHQKQEAgLTAsMCArMSw3IEBACitQeXRob24g44Gu6ZaL55m644Gv44CBMTk5MCDlubTjgZTjgo3jgYvjgonplovlp4vjgZXjgozjgabjgYTjgb7jgZnjgIIKK+mWi+eZuuiAheOBriBHdWlkbyB2YW4gUm9zc3VtIOOBr+aVmeiCsueUqOOBruODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOAjEFCQ+OAjeOBrumWi+eZuuOBq+WPguWKoOOBl+OBpuOBhOOBvuOBl+OBn+OBjOOAgUFCQyDjga/lrp/nlKjkuIrjga7nm67nmoTjgavjga/jgYLjgb7jgorpganjgZfjgabjgYTjgb7jgZvjgpPjgafjgZfjgZ/jgIIKK+OBk+OBruOBn+OCgeOAgUd1aWRvIOOBr+OCiOOCiuWun+eUqOeahOOBquODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOBrumWi+eZuuOCkumWi+Wni+OBl+OAgeiLseWbvSBCQlMg5pS+6YCB44Gu44Kz44Oh44OH44Kj55Wq57WE44CM44Oi44Oz44OG44KjIOODkeOCpOOCveODs+OAjeOBruODleOCoeODs+OBp+OBguOCiyBHdWlkbyDjga/jgZPjga7oqIDoqp7jgpLjgIxQeXRob27jgI3jgajlkI3jgaXjgZHjgb7jgZfjgZ/jgIIKK+OBk+OBruOCiOOBhuOBquiDjOaZr+OBi+OCieeUn+OBvuOCjOOBnyBQeXRob24g44Gu6KiA6Kqe6Kit6KiI44Gv44CB44CM44K344Oz44OX44Or44CN44Gn44CM57+S5b6X44GM5a655piT44CN44Go44GE44GG55uu5qiZ44Gr6YeN54K544GM572u44GL44KM44Gm44GE44G+44GZ44CCCivlpJrjgY/jga7jgrnjgq/jg6rjg5fjg4jns7voqIDoqp7jgafjga/jg6bjg7zjgrbjga7nm67lhYjjga7liKnkvr/mgKfjgpLlhKrlhYjjgZfjgaboibLjgIXjgarmqZ/og73jgpLoqIDoqp7opoHntKDjgajjgZfjgablj5bjgorlhaXjgozjgovloLTlkIjjgYzlpJrjgYTjga7jgafjgZnjgYzjgIFQeXRob24g44Gn44Gv44Gd44GG44GE44Gj44Gf5bCP57Sw5bel44GM6L+95Yqg44GV44KM44KL44GT44Go44Gv44GC44G+44KK44GC44KK44G+44Gb44KT44CCCivoqIDoqp7oh6rkvZPjga7mqZ/og73jga/mnIDlsI/pmZDjgavmirzjgZXjgYjjgIHlv4XopoHjgarmqZ/og73jga/mi6HlvLXjg6Ljgrjjg6Xjg7zjg6vjgajjgZfjgabov73liqDjgZnjgovjgIHjgajjgYTjgYbjga7jgYwgUHl0aG9uIOOBruODneODquOCt+ODvOOBp+OBmeOAggorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppcy50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBiNzYwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzLnR4dApAQCAtMCwwICsxLDcgQEAKK1B5dGhvbiCCzIpKlK2CzYFBMTk5MCCUToKyguuCqYLnikqOboKzguqCxIKigtyCt4FCCiuKSpStjtKCzCBHdWlkbyB2YW4gUm9zc3VtIILNi7OI55dwgsyDdoONg0+DiYN+g5ODT4y+jOqBdUFCQ4F2gsyKSpStgsmOUYnBgrWCxIKigtyCtYK9gqqBQUFCQyCCzY7Al3CP44LMltqTSYLJgs2CoILcguiTS4K1gsSCooLcgrmC8YLFgrWCvYFCCiuCsYLMgr2C34FBR3VpZG8ggs2C5oLojsCXcJNJgsiDdoONg0+DiYN+g5ODT4y+jOqCzIpKlK2C8IpKjm6CtYFBiXCNkSBCQlMglfqRl4LMg1KDgYNmg0KU1JFngXWDgoOTg2WDQiCDcINDg1yDk4F2gsyDdINAg5OCxYKggukgR3VpZG8ggs2CsYLMjL6M6oLwgXVQeXRob26BdoLGlryCw4KvgtyCtYK9gUIKK4KxgsyC5oKkgsiUd4xpgqmC55C2gtyC6oK9IFB5dGhvbiCCzIy+jOqQ3Yx2gs2BQYF1g1aDk4N2g4uBdoLFgXWPS5O+gqqXZYjVgXaCxoKigqSW2pVXgsmPZJNfgqqSdYKpguqCxIKigtyCt4FCCiuRvYKtgsyDWINOg4qDdoNnjG6MvozqgsWCzYOGgVuDVYLMltqQ5oLMl5iV1pCrgvCXRJDmgrWCxJBGgViCyItAlFyC8Iy+jOqXdpFmgsaCtYLEjuaC6JP8guqC6Y/qjYeCqpG9gqKCzILFgreCqoFBUHl0aG9uIILFgs2Cu4KkgqKCwYK9j6yN141IgqqSx4nBgrOC6oLpgrGCxoLNgqCC3ILogqCC6ILcgrmC8YFCCiuMvozqjqmRzILMi0CUXILNjcWPrIzAgsmJn4KzgqaBQZVLl3aCyItAlFyCzYpnkqODgoNXg4WBW4OLgsaCtYLEkseJwYK3gumBQYLGgqKCpILMgqogUHl0aG9uIILMg3yDioNWgVuCxYK3gUIKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Nqa2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy11dGY4LnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMtdXRmOC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE1NmEyZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMtdXRmOC50eHQKQEAgLTAsMCArMSw4IEBACitQeXRob24g44Gu6ZaL55m644Gv44CBMTk5MCDlubTjgZTjgo3jgYvjgonplovlp4vjgZXjgozjgabjgYTjgb7jgZnjgIIKK+mWi+eZuuiAheOBriBHdWlkbyB2YW4gUm9zc3VtIOOBr+aVmeiCsueUqOOBruODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOAjEFCQ+OAjeOBrumWi+eZuuOBq+WPguWKoOOBl+OBpuOBhOOBvuOBl+OBn+OBjOOAgUFCQyDjga/lrp/nlKjkuIrjga7nm67nmoTjgavjga/jgYLjgb7jgorpganjgZfjgabjgYTjgb7jgZvjgpPjgafjgZfjgZ/jgIIKK+OBk+OBruOBn+OCgeOAgUd1aWRvIOOBr+OCiOOCiuWun+eUqOeahOOBquODl+ODreOCsOODqeODn+ODs+OCsOiogOiqnuOBrumWi+eZuuOCkumWi+Wni+OBl+OAgeiLseWbvSBCQlMg5pS+6YCB44Gu44Kz44Oh44OH44Kj55Wq57WE44CM44Oi44Oz44OG44KjIOODkeOCpOOCveODs+OAjeOBruODleOCoeODs+OBp+OBguOCiyBHdWlkbyDjga/jgZPjga7oqIDoqp7jgpLjgIxQeXRob27jgI3jgajlkI3jgaXjgZHjgb7jgZfjgZ/jgIIKK+OBk+OBruOCiOOBhuOBquiDjOaZr+OBi+OCieeUn+OBvuOCjOOBnyBQeXRob24g44Gu6KiA6Kqe6Kit6KiI44Gv44CB44CM44K344Oz44OX44Or44CN44Gn44CM57+S5b6X44GM5a655piT44CN44Go44GE44GG55uu5qiZ44Gr6YeN54K544GM572u44GL44KM44Gm44GE44G+44GZ44CCCivlpJrjgY/jga7jgrnjgq/jg6rjg5fjg4jns7voqIDoqp7jgafjga/jg6bjg7zjgrbjga7nm67lhYjjga7liKnkvr/mgKfjgpLlhKrlhYjjgZfjgaboibLjgIXjgarmqZ/og73jgpLoqIDoqp7opoHntKDjgajjgZfjgablj5bjgorlhaXjgozjgovloLTlkIjjgYzlpJrjgYTjga7jgafjgZnjgYzjgIFQeXRob24g44Gn44Gv44Gd44GG44GE44Gj44Gf5bCP57Sw5bel44GM6L+95Yqg44GV44KM44KL44GT44Go44Gv44GC44G+44KK44GC44KK44G+44Gb44KT44CCCivoqIDoqp7oh6rkvZPjga7mqZ/og73jga/mnIDlsI/pmZDjgavmirzjgZXjgYjjgIHlv4XopoHjgarmqZ/og73jga/mi6HlvLXjg6Ljgrjjg6Xjg7zjg6vjgajjgZfjgabov73liqDjgZnjgovjgIHjgajjgYTjgYbjga7jgYwgUHl0aG9uIOOBruODneODquOCt+ODvOOBp+OBmeOAggorCivjg47jgYvjgpog44OI44KaIOODiOOCre+otu+ouSDwoZq08KqOjCDpuoDpvYHwqZuwCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9jamtlbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YzllZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvY2prZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnR4dApAQCAtMCwwICsxLDggQEAKK1B5dGhvbiCCzIpKlK2CzYFBMTk5MCCUToKyguuCqYLnikqOboKzguqCxIKigtyCt4FCCiuKSpStjtKCzCBHdWlkbyB2YW4gUm9zc3VtIILNi7OI55dwgsyDdoONg0+DiYN+g5ODT4y+jOqBdUFCQ4F2gsyKSpStgsmOUYnBgrWCxIKigtyCtYK9gqqBQUFCQyCCzY7Al3CP44LMltqTSYLJgs2CoILcguiTS4K1gsSCooLcgrmC8YLFgrWCvYFCCiuCsYLMgr2C34FBR3VpZG8ggs2C5oLojsCXcJNJgsiDdoONg0+DiYN+g5ODT4y+jOqCzIpKlK2C8IpKjm6CtYFBiXCNkSBCQlMglfqRl4LMg1KDgYNmg0KU1JFngXWDgoOTg2WDQiCDcINDg1yDk4F2gsyDdINAg5OCxYKggukgR3VpZG8ggs2CsYLMjL6M6oLwgXVQeXRob26BdoLGlryCw4KvgtyCtYK9gUIKK4KxgsyC5oKkgsiUd4xpgqmC55C2gtyC6oK9IFB5dGhvbiCCzIy+jOqQ3Yx2gs2BQYF1g1aDk4N2g4uBdoLFgXWPS5O+gqqXZYjVgXaCxoKigqSW2pVXgsmPZJNfgqqSdYKpguqCxIKigtyCt4FCCiuRvYKtgsyDWINOg4qDdoNnjG6MvozqgsWCzYOGgVuDVYLMltqQ5oLMl5iV1pCrgvCXRJDmgrWCxJBGgViCyItAlFyC8Iy+jOqXdpFmgsaCtYLEjuaC6JP8guqC6Y/qjYeCqpG9gqKCzILFgreCqoFBUHl0aG9uIILFgs2Cu4KkgqKCwYK9j6yN141IgqqSx4nBgrOC6oLpgrGCxoLNgqCC3ILogqCC6ILcgrmC8YFCCiuMvozqjqmRzILMi0CUXILNjcWPrIzAgsmJn4KzgqaBQZVLl3aCyItAlFyCzYpnkqODgoNXg4WBW4OLgsaCtYLEkseJwYK3gumBQYLGgqKCpILMgqogUHl0aG9uIILMg3yDioNWgVuCxYK3gUIKKworg22C9SCDniCDZ4NMiEuIeSCYg/zWIPzS/Ob71ApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2NtYXRoX3Rlc3RjYXNlcy50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvY21hdGhfdGVzdGNhc2VzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTU5MzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2NtYXRoX3Rlc3RjYXNlcy50eHQKQEAgLTAsMCArMSwyMzY1IEBACistLSBUZXN0Y2FzZXMgZm9yIGZ1bmN0aW9ucyBpbiBjbWF0aC4KKy0tCistLSBFYWNoIGxpbmUgdGFrZXMgdGhlIGZvcm06CistLQorLS0gPHRlc3RpZD4gPGZ1bmN0aW9uPiA8aW5wdXRfdmFsdWU+IC0+IDxvdXRwdXRfdmFsdWU+IDxmbGFncz4KKy0tCistLSB3aGVyZToKKy0tCistLSAgIDx0ZXN0aWQ+IGlzIGEgc2hvcnQgbmFtZSBpZGVudGlmeWluZyB0aGUgdGVzdCwKKy0tCistLSAgIDxmdW5jdGlvbj4gaXMgdGhlIGZ1bmN0aW9uIHRvIGJlIHRlc3RlZCAoZXhwLCBjb3MsIGFzaW5oLCAuLi4pLAorLS0KKy0tICAgPGlucHV0X3ZhbHVlPiBpcyBhIHBhaXIgb2YgZmxvYXRzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlCistLSAgICAgcmVwcmVzZW50aW5nIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhIGNvbXBsZXggbnVtYmVyLCBhbmQKKy0tCistLSAgIDxvdXRwdXRfdmFsdWU+IGlzIHRoZSBleHBlY3RlZCAoaWRlYWwpIG91dHB1dCB2YWx1ZSwgYWdhaW4KKy0tICAgICByZXByZXNlbnRlZCBhcyBhIHBhaXIgb2YgZmxvYXRzLgorLS0KKy0tICAgPGZsYWdzPiBpcyBhIGxpc3Qgb2YgdGhlIGZsb2F0aW5nLXBvaW50IGZsYWdzIHJlcXVpcmVkIGJ5IEM5OQorLS0KKy0tIFRoZSBwb3NzaWJsZSBmbGFncyBhcmU6CistLQorLS0gICBkaXZpZGUtYnktemVybyA6IHJhaXNlZCB3aGVuIGEgZmluaXRlIGlucHV0IGdpdmVzIGEKKy0tICAgICBtYXRoZW1hdGljYWxseSBpbmZpbml0ZSByZXN1bHQuCistLQorLS0gICBvdmVyZmxvdyA6IHJhaXNlZCB3aGVuIGEgZmluaXRlIGlucHV0IGdpdmVzIGEgZmluaXRlIHJlc3VsdCB3aG9zZQorLS0gICAgIHJlYWwgb3IgaW1hZ2luYXJ5IHBhcnQgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiB0aGUgdXN1YWwgcmFuZ2UKKy0tICAgICBvZiBhbiBJRUVFIDc1NCBkb3VibGUuCistLQorLS0gICBpbnZhbGlkIDogcmFpc2VkIGZvciBpbnZhbGlkIGlucHV0cy4KKy0tCistLSAgIGlnbm9yZS1yZWFsLXNpZ24gOiBpbmRpY2F0ZXMgdGhhdCB0aGUgc2lnbiBvZiB0aGUgcmVhbCBwYXJ0IG9mCistLSAgICAgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZDsgaWYgdGhlIHJlYWwgcGFydCBvZiB0aGUgcmVzdWx0IGlzCistLSAgICAgZ2l2ZW4gYXMgaW5mLCB0aGVuIGJvdGggLWluZiBhbmQgaW5mIHNob3VsZCBiZSBhY2NlcHRlZCBhcworLS0gICAgIGNvcnJlY3QuCistLQorLS0gICBpZ25vcmUtaW1hZy1zaWduIDogaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ24gb2YgdGhlIGltYWdpbmFyeSBwYXJ0CistLSAgICAgb2YgdGhlIHJlc3VsdCBpcyB1bnNwZWNpZmllZC4KKy0tCistLSBGbGFncyBtYXkgYXBwZWFyIGluIGFueSBvcmRlci4KKy0tCistLSBMaW5lcyBiZWdpbm5pbmcgd2l0aCAnLS0nIChsaWtlIHRoaXMgb25lKSBzdGFydCBhIGNvbW1lbnQsIGFuZCBhcmUKKy0tIGlnbm9yZWQuICBCbGFuayBsaW5lcywgb3IgbGluZXMgY29udGFpbmluZyBvbmx5IHdoaXRlc3BhY2UsIGFyZSBhbHNvCistLSBpZ25vcmVkLgorCistLSBUaGUgbWFqb3JpdHkgb2YgdGhlIHZhbHVlcyBiZWxvdyB3ZXJlIGNvbXB1dGVkIHdpdGggdGhlIGhlbHAgb2YKKy0tIHZlcnNpb24gMi4zIG9mIHRoZSBNUEZSIGxpYnJhcnkgZm9yIG11bHRpcGxlLXByZWNpc2lvbgorLS0gZmxvYXRpbmctcG9pbnQgY29tcHV0YXRpb25zIHdpdGggY29ycmVjdCByb3VuZGluZy4gIEFsbCBvdXRwdXQKKy0tIHZhbHVlcyBpbiB0aGlzIGZpbGUgYXJlIChtb2R1bG8geWV0LXRvLWJlLWRpc2NvdmVyZWQgYnVncykKKy0tIGNvcnJlY3RseSByb3VuZGVkLCBwcm92aWRlZCB0aGF0IGVhY2ggaW5wdXQgYW5kIG91dHB1dCBkZWNpbWFsCistLSBmbG9hdGluZy1wb2ludCB2YWx1ZSBiZWxvdyBpcyBpbnRlcnByZXRlZCBhcyBhIHJlcHJlc2VudGF0aW9uIG9mCistLSB0aGUgY29ycmVzcG9uZGluZyBuZWFyZXN0IElFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gdmFsdWUuICBTZWUgdGhlCistLSBNUEZSIGhvbWVwYWdlIGF0IGh0dHA6Ly93d3cubXBmci5vcmcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCistLSBNUEZSIHByb2plY3QuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGFjb3M6IEludmVyc2UgY29zaW5lIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworYWNvczAwMDAgYWNvcyAwLjAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDAwMSBhY29zIDAuMCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2Fjb3MwMDAyIGFjb3MgLTAuMCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMDAzIGFjb3MgLTAuMCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKKworLS0gYnJhbmNoIHBvaW50czogKy8tMQorYWNvczAwMTAgYWNvcyAxLjAgMC4wIC0+IDAuMCAtMC4wCithY29zMDAxMSBhY29zIDEuMCAtMC4wIC0+IDAuMCAwLjAKK2Fjb3MwMDEyIGFjb3MgLTEuMCAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC0wLjAKK2Fjb3MwMDEzIGFjb3MgLTEuMCAtMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAwLjAKKworLS0gdmFsdWVzIGFsb25nIGJvdGggc2lkZXMgb2YgcmVhbCBheGlzCithY29zMDAyMCBhY29zIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2Fjb3MwMDIxIGFjb3MgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYWNvczAwMjIgYWNvcyAtMWUtMzA1IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYWNvczAwMjMgYWNvcyAtMWUtMzA1IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYWNvczAwMjQgYWNvcyAtMWUtMTUwIDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYWNvczAwMjUgYWNvcyAtMWUtMTUwIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYWNvczAwMjYgYWNvcyAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY4IC0wLjAKK2Fjb3MwMDI3IGFjb3MgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjggMC4wCithY29zMDAyOCBhY29zIC0wLjAwMSAwLjAgLT4gMS41NzE3OTYzMjY5NjE1NjM0IC0wLjAKK2Fjb3MwMDI5IGFjb3MgLTAuMDAxIC0wLjAgLT4gMS41NzE3OTYzMjY5NjE1NjM0IDAuMAorYWNvczAwMzAgYWNvcyAtMC41Nzg5OTk5OTk5OTk5OTk5NiAwLjAgLT4gMi4xODgyOTc5ODE2MTIwNjY3IC0wLjAKK2Fjb3MwMDMxIGFjb3MgLTAuNTc4OTk5OTk5OTk5OTk5OTYgLTAuMCAtPiAyLjE4ODI5Nzk4MTYxMjA2NjcgMC4wCithY29zMDAzMiBhY29zIC0wLjk5OTk5OTk5OTk5OTk5OTg5IDAuMCAtPiAzLjE0MTU5MjYzODY4ODYzMTkgLTAuMAorYWNvczAwMzMgYWNvcyAtMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IDMuMTQxNTkyNjM4Njg4NjMxOSAwLjAKK2Fjb3MwMDM0IGFjb3MgLTEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC0yLjEwNzM0MjQyNTU0NDcwMTRlLTA4CithY29zMDAzNSBhY29zIC0xLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgMi4xMDczNDI0MjU1NDQ3MDE0ZS0wOAorYWNvczAwMzYgYWNvcyAtMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLTAuMDQ0NzE3NjMzNjA4MzA2ODQ5CithY29zMDAzNyBhY29zIC0xLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgMC4wNDQ3MTc2MzM2MDgzMDY4NDkKK2Fjb3MwMDM4IGFjb3MgLTIuMCAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC0xLjMxNjk1Nzg5NjkyNDgxNjgKK2Fjb3MwMDM5IGFjb3MgLTIuMCAtMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAxLjMxNjk1Nzg5NjkyNDgxNjgKK2Fjb3MwMDQwIGFjb3MgLTIzLjAgMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAtMy44MjgxNjg0NzEzMzMxMDEyCithY29zMDA0MSBhY29zIC0yMy4wIC0wLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIDMuODI4MTY4NDcxMzMzMTAxMgorYWNvczAwNDIgYWNvcyAtMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC0zNy41MzQ1MDg2Njg0NjQ2NzQKK2Fjb3MwMDQzIGFjb3MgLTEwMDAwMDAwMDAwMDAwMDAwLjAgLTAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgMzcuNTM0NTA4NjY4NDY0Njc0CithY29zMDA0NCBhY29zIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC0zNDYuMDgwOTExMTI5NjY2NzkKK2Fjb3MwMDQ1IGFjb3MgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIDM0Ni4wODA5MTExMjk2NjY3OQorYWNvczAwNDYgYWNvcyAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSAtNjg5LjE2NjA4OTk4NTc3OTY1CithY29zMDA0NyBhY29zIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDMuMTQxNTkyNjUzNTg5NzkzMSA2ODkuMTY2MDg5OTg1Nzc5NjUKK2Fjb3MwMDQ4IGFjb3MgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDA0OSBhY29zIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYWNvczAwNTAgYWNvcyAxZS0zMDUgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDA1MSBhY29zIDFlLTMwNSAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2Fjb3MwMDUyIGFjb3MgMWUtMTUwIDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYWNvczAwNTMgYWNvcyAxZS0xNTAgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMDA1NCBhY29zIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDA1NSBhY29zIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMDA1NiBhY29zIDAuMDAxIDAuMCAtPiAxLjU2OTc5NjMyNjYyODIzIC0wLjAKK2Fjb3MwMDU3IGFjb3MgMC4wMDEgLTAuMCAtPiAxLjU2OTc5NjMyNjYyODIzIDAuMAorYWNvczAwNTggYWNvcyAwLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAwLjk1MzI5NDY3MTk3NzcyNjU1IC0wLjAKK2Fjb3MwMDU5IGFjb3MgMC41Nzg5OTk5OTk5OTk5OTk5NiAtMC4wIC0+IDAuOTUzMjk0NjcxOTc3NzI2NTUgMC4wCithY29zMDA2MCBhY29zIDAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IDEuNDkwMTE2MTE5Mzg0NzY1NmUtMDggLTAuMAorYWNvczAwNjEgYWNvcyAwLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gMS40OTAxMTYxMTkzODQ3NjU2ZS0wOCAwLjAKK2Fjb3MwMDYyIGFjb3MgMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAwLjAgLTIuMTA3MzQyNDI1NTQ0NzAxNGUtMDgKK2Fjb3MwMDYzIGFjb3MgMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gMC4wIDIuMTA3MzQyNDI1NTQ0NzAxNGUtMDgKK2Fjb3MwMDY0IGFjb3MgMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAwLjAgLTAuMDQ0NzE3NjMzNjA4MzA2ODQ5CithY29zMDA2NSBhY29zIDEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDAuMCAwLjA0NDcxNzYzMzYwODMwNjg0OQorYWNvczAwNjYgYWNvcyAyLjAgMC4wIC0+IDAuMCAtMS4zMTY5NTc4OTY5MjQ4MTY4CithY29zMDA2NyBhY29zIDIuMCAtMC4wIC0+IDAuMCAxLjMxNjk1Nzg5NjkyNDgxNjgKK2Fjb3MwMDY4IGFjb3MgMjMuMCAwLjAgLT4gMC4wIC0zLjgyODE2ODQ3MTMzMzEwMTIKK2Fjb3MwMDY5IGFjb3MgMjMuMCAtMC4wIC0+IDAuMCAzLjgyODE2ODQ3MTMzMzEwMTIKK2Fjb3MwMDcwIGFjb3MgMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMC4wIC0zNy41MzQ1MDg2Njg0NjQ2NzQKK2Fjb3MwMDcxIGFjb3MgMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDAuMCAzNy41MzQ1MDg2Njg0NjQ2NzQKK2Fjb3MwMDcyIGFjb3MgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDAuMCAtMzQ2LjA4MDkxMTEyOTY2Njc5CithY29zMDA3MyBhY29zIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gMC4wIDM0Ni4wODA5MTExMjk2NjY3OQorYWNvczAwNzQgYWNvcyAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gMC4wIC02ODkuMTY2MDg5OTg1Nzc5NjUKK2Fjb3MwMDc1IGFjb3MgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLTAuMCAtPiAwLjAgNjg5LjE2NjA4OTk4NTc3OTY1CisKKy0tIHJhbmRvbSBpbnB1dHMKK2Fjb3MwMTAwIGFjb3MgLTMuMzMwNzExMzMyNDU5NjY4MiAtMTAuNzMyMDA3NTMwODYzMjY2IC0+IDEuODcwNjA4NTY5NDQ4MjMzOSAzLjExMzk4NjgwNjU1NDYxMworYWNvczAxMDEgYWNvcyAtMjg2My45NTI5OTE3NDMyOTEgLTI2ODEwMTMzMTUuMjU3MTIzOSAtPiAxLjU3MDc5NzM5NTAzMDE2OTkgMjIuNDAyNjA3ODQzMjc0NzU4CithY29zMDEwMiBhY29zIC0wLjMzMDcyNjM5NzkzMjIwMDg4IC0wLjg1MDU1NDY0NjU4MjUzMDU1IC0+IDEuODIxOTQyNjg5NTkyMjYwMSAwLjc5MjUwMTY2NzI5MzExOTY2CithY29zMDEwMyBhY29zIC0yLjU3MjIzMjU4NDIwOTc4MDIgLTEyLjcwMzk0MDgwOTgyMTU3NCAtPiAxLjc2OTk5NDI0MTMxMDc0MDggMy4yNTY1MTcwMTU2NTI3MzI1CithY29zMDEwNCBhY29zIC00Mi40OTUyMzM3ODU0NTk1ODMgLTAuNTQwMzkzMjA3NTEzMzcxNjEgLT4gMy4xMjg4NzMyNTczMTUzMzA0IDQuNDQyNDgxNTUxOTczNTYwMQorYWNvczAxMDUgYWNvcyAtMS4xMzYzODE4NjI1ODU2NDAxIDk2NDEuMTMyNTQ5ODYzMDM3NiAtPiAxLjU3MDkxNDE5NDg4MjAwNDkgLTkuODY2OTQxMDU1MzI1NDI4NAorYWNvczAxMDYgYWNvcyAtMi40Mzk4NDI2ODI0MTU3ODY2ZS0xMSAwLjMzMDAyMDUxODkwMjY2MTY1IC0+IDEuNTcwNzk2MzI2ODE4MDY2IC0wLjMyNDMwNTc4MDQxNTc4NjY3CithY29zMDEwNyBhY29zIC0xLjM1MjEzNDA0MjgxODY1NTIgMi45MzY5NzM3OTEyMDc2NzcyIC0+IDEuOTg0OTA1OTE5MjMzOTMzOCAtMS44ODIyODkzNjc0MTE3OTQyCithY29zMDEwOCBhY29zIC0xLjgyNzM2NDcwNjQ3NzkxNSAxLjAzNTU0NTkyMzIxNDc1NTcgLT4gMi41NzMyMjQ2MzA3OTYwMDMyIC0xLjQwOTA2ODgyNjc4NTQ5NjkKK2Fjb3MwMTA5IGFjb3MgLTAuMjU5NzgzNzM3MDY0MDM1NDYgMTAuMDk3MTI2NjkxODU4MzMgLT4gMS41OTYzOTQwMzg2Mzc4MzA2IC0zLjAwODE2NzMwNTAxOTYwNjMKK2Fjb3MwMTEwIGFjb3MgMC4zMzU2MTc3ODQ3MTA3MjU1MSAtNDU4NzM1MC42ODIzOTk5MTE4IC0+IDEuNTcwNzk2MjUzNjMzMzI1MSAxNi4wMzE5NjA0MDI1Nzk1MzkKK2Fjb3MwMTExIGFjb3MgMC40OTEzMzQ0NDYxMDk5ODQ0NSAtMC44MDcxNDIyMzYyOTkwMDE1IC0+IDEuMTkwODc2MTcxMjgwMTc4OCAwLjc4NTczMzQ1ODEzMTg3ODY3CithY29zMDExMiBhY29zIDAuNDIxOTY3MzQ1MDc4MjM5NzQgLTIuNDgxMjk2NTQzMTc0NTExNSAtPiAxLjQxNDA5MTE4NjEwMDY5MiAxLjY1MTcwNzI2MDk4ODE3MgorYWNvczAxMTMgYWNvcyAyLjk2MTQyNjIxMDEwMDY1NSAtMjE5LjAzMjk1Njk1MjQ4NjY0IC0+IDEuNTU3Mjc2ODMxOTgyMjc3OCA2LjA4MjQ2NTk4ODU4MjczMDQKK2Fjb3MwMTE0IGFjb3MgMi44ODYyMDkwNjM2NTI2NDEgLTIwLjM4MDExMjA3MjIwNjA2IC0+IDEuNDMwMjc2NTI1MjI5Nzg4OSAzLjcxODIwMTg1MzE0NzY0MgorYWNvczAxMTUgYWNvcyAwLjQxODA1NjgwNzUyNzY1MDkgMS40ODMzNDMzOTkwODIzNDg0IC0+IDEuMzM5MzgzNDU1ODMwMzA0MiAtMS4yMDc5ODQ3NzU4MzAxNTc2CithY29zMDExNiBhY29zIDUyLjM3NjExMTQwNTkyNDcxOCAwLjAxMzkzMDQyOTAwMTk0MTAwMSAtPiAwLjAwMDI2NjAxNzYxODA0MDI0MTg4IC00LjY1MTUwNjY2OTEyMDQ3MTQKK2Fjb3MwMTE3IGFjb3MgNDE2Mzc5NDgzODcuNjI1OTY5IDEuNTYzNDE4MjkyODk0MDQxIC0+IDMuNzU0NzkxODUwNzg4MzU0OGUtMTEgLTI1LjE0NTQyNDk4OTgwOTM4MQorYWNvczAxMTggYWNvcyAwLjA2MTIyNjY1OTEyMjI0OTUyNiAwLjg0NDcyMzQzOTQ2MTUxNTQgLT4gMS41MjQwMjgwMzA2MzY3MzE1IC0wLjc2NzkxNzk4OTcxMTQwODEyCithY29zMDExOSBhY29zIDIuNDQ4MDQ2NjQyMDQ0Mjk1OWUrMjYgMC4xODAwMjMzOTIwMTM4NDY2MiAtPiA3LjM1Mzc1NjYyMDU2NDc5OGUtMjggLTYxLjQ1NTY1MDAxNTk5NjM3NgorCistLSB2YWx1ZXMgbmVhciBpbmZpbml0eQorYWNvczAyMDAgYWNvcyAxLjYyMDY4NjA1MTg2ODMwMjFlKzMwOCAxLjAzMDg0MjYyMjYyODUyODNlKzMwOCAtPiAwLjU2NjUwODI2MDkzODI2MjIzIC03MTAuNTQyMDY4NzQyNDE1NjEKK2Fjb3MwMjAxIGFjb3MgMS4yMDY3NzM1ODc1MDcwMDYyZSszMDggLTEuMzQyOTE3MzcyNDM5MDI3NmUrMzA4IC0+IDAuODM4NzQzNjkzOTA4NjQ4ODkgNzEwLjQ4MDE3Nzk0MDI3NDk4CithY29zMDIwMiBhY29zIC03LjQxMzAxNDUxMzI1NDkwNDdlKzMwNyAxLjE3NTkxMzA1NDM5Mjc2NDVlKzMwOCAtPiAyLjEzMzI3MjkzNDY0Nzg1MzYgLTcxMC4yMTg3MTExNTY5ODc1MgorYWNvczAyMDMgYWNvcyAtOC42MzI5NDI2NDQyMjU3MjQ5ZSszMDcgLTEuMjMxNjI4Mjk1MjE4NDEzM2UrMzA4IC0+IDIuMTgyMTUxMTAzMjQ0NDgzOCA3MTAuMjk3NTIxNDU2OTcxNDgKK2Fjb3MwMjA0IGFjb3MgMC4wIDEuNDI4OTcxMzg1NTg0OTc0NmUrMzA4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtNzEwLjI0NjMxMDY5NzM4OTk2CithY29zMDIwNSBhY29zIC0wLjAgMS4zMTUzNTI0NTQ1OTg3NDMyZSszMDggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC03MTAuMTYzNDYwNDc4NzUzOQorYWNvczAyMDYgYWNvcyAwLjAgLTkuNjIyOTAzNzY2OTI2OTMyMWUrMzA3IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA3MDkuODUwOTE2Nzk1NzM2OTEKK2Fjb3MwMjA3IGFjb3MgLTAuMCAtNC45NzgzNjE2NDIxMTA3MDg4ZSszMDcgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDcwOS4xOTE4NzE1NzkxMTIzMworYWNvczAyMDggYWNvcyAxLjM5Mzc1NDE5MjU3MzkzODllKzMwOCAwLjAgLT4gMC4wIC03MTAuMjIxMzU2Nzg3MDcyNjQKK2Fjb3MwMjA5IGFjb3MgOS4xMzYyMzg4OTY3MzcxNTM2ZSszMDcgLTAuMCAtPiAwLjAgNzA5Ljc5OTAxOTUzMTI0NjEzCithY29zMDIxMCBhY29zIC0xLjM0NTczNjEyMjA2OTc0MzZlKzMwOCAwLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC03MTAuMTg2Mjk2OTg4NzE4NDgKK2Fjb3MwMjExIGFjb3MgLTUuNDY5OTA5MDA1NjE0NDI4NGUrMzA3IC0wLjAgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIDcwOS4yODYwMzI3MTA4NTY0OQorYWNvczAyMTIgYWNvcyAxLjU4ODA3MTY5MzIzNTg5MDFlKzMwOCA1LjU2Mzg0MDEyNTIzMzk5MjkgLT4gMy41MDM1MTk0ODc3NzM4NzNlLTMwOCAtNzEwLjM1MTg3NjMzMTQwNTgzCithY29zMDIxMyBhY29zIDEuMjQ5NzIxMTY2MzQ2MzE2NGUrMzA4IC0zLjA0NTY0Nzc3MTc5MTEwMjQgLT4gMi40MzcwNjE4NDUzMTk3NDg2ZS0zMDggNzEwLjExMjI3NjI4MjIzNDEyCithY29zMDIxNCBhY29zIC05LjkwMTYyMjQwMDYwMjk1MjhlKzMwNyA0Ljk1NzA0MjczNDA3ODkwNTYgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIC03MDkuODc5NDY5MzUyMjk0NjgKK2Fjb3MwMjE1IGFjb3MgLTEuNTg1NDA3MTA2Njg3NDEzOWUrMzA4IC00LjQyMzM1Nzc3NDE0OTc3ODMgLT4gMy4xNDE1OTI2NTM1ODk3OTMxIDcxMC4zNTAxOTcwNDY3MjAwNAorYWNvczAyMTYgYWNvcyA5LjM2NzQ2MjMwODM2NDc2MjggMS41MjA5NTU5MDUxODc3OTc5ZSszMDggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC03MTAuMzA4Njk0ODQ0OTEwODYKK2Fjb3MwMjE3IGFjb3MgOC4xNzczODMyMDIxNzg0MzgzIC02LjYwOTM0NDU3OTUwMDAwNTZlKzMwNyAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgNzA5LjQ3NTI1NTIyMjc3OTIKK2Fjb3MwMjE4IGFjb3MgLTMuMTg0NTkzNTAwMDY2NTEwNCAxLjU3Njg4NTYzOTY2NTA4OTNlKzMwOCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTcxMC4zNDQ4MDc2MTA0MjY4NworYWNvczAyMTkgYWNvcyAtMS4wNTc3MzAzODgwOTUzOTAzIC02LjQ1NzQ2MjY4MTU3MzU2MTNlKzMwNyAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgNzA5LjQ1MjAwNzE5NjYyMDQ2CisKKy0tIHZhbHVlcyBuZWFyIDAKK2Fjb3MwMjIwIGFjb3MgMS44NTY2OTg2OTcwNzE0MDQ1ZS0zMjAgMy4xODY3MjM0MTU2NzYwNDAyZS0zMjEgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0zLjE4NjcyMzQxNTY3NjA0MDJlLTMyMQorYWNvczAyMjEgYWNvcyA3LjkwNTA1MDMzMzQ1OTk0NDdlLTMyMyAtOC44OTMxODE2MjUxNDI0Mzc4ZS0zMjMgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDguODkzMTgxNjI1MTQyNDM3OGUtMzIzCithY29zMDIyMiBhY29zIC00LjQ0NjU5MDgxMjU3MTIxODllLTMyMyAyLjQ2NTQwNjUwOTcyMjI3MjdlLTMxMSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTIuNDY1NDA2NTA5NzIyMjcyN2UtMzExCithY29zMDIyMyBhY29zIC02LjEwMTY5MTY0MDgxOTI2MTllLTMxMSAtMi40NzAzMjgyMjkyMDYyMzI3ZS0zMjMgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDIuNDcwMzI4MjI5MjA2MjMyN2UtMzIzCithY29zMDIyNCBhY29zIDAuMCAzLjQzMDU3ODM2MjE4NDI3MjllLTMxMSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTMuNDMwNTc4MzYyMTg0MjcyOWUtMzExCithY29zMDIyNSBhY29zIC0wLjAgMS42MTE3NDA5NDk4NjMzMTQ1ZS0zMTkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0xLjYxMTc0MDk0OTg2MzMxNDVlLTMxOQorYWNvczAyMjYgYWNvcyAwLjAgLTQuOTkwMDYzMDIyOTk2NTkwMWUtMzIyIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA0Ljk5MDA2MzAyMjk5NjU5MDFlLTMyMgorYWNvczAyMjcgYWNvcyAtMC4wIC00LjQ4ODkyNzkyMTA1OTI4MThlLTMxMSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgNC40ODg5Mjc5MjEwNTkyODE4ZS0zMTEKK2Fjb3MwMjI4IGFjb3MgNS4zMjk3Njc4NjgxNDc3MjE0ZS0zMTIgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDIyOSBhY29zIDYuMjA3MzQyNTg5NzIxMTYxNGUtMzEzIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYWNvczAyMzAgYWNvcyAtNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMDIzMSBhY29zIC0xLjcxMDc1MTcwNTI4OTkwMDNlLTMxOCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2Fjb3MxMDAwIGFjb3MgMC4wIDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYWNvczEwMDEgYWNvcyAwLjAgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMTAwMiBhY29zIC0wLjAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithY29zMTAwMyBhY29zIC0wLjAgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithY29zMTAwNCBhY29zIDAuMCBuYW4gLT4gMS41NzA3OTYzMjY3OTQ4OTY2IG5hbgorYWNvczEwMDUgYWNvcyAtMC4wIG5hbiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgbmFuCithY29zMTAwNiBhY29zIC0yLjMgaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtaW5mCithY29zMTAwNyBhY29zIC0wLjAgaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtaW5mCithY29zMTAwOCBhY29zIDAuMCBpbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC1pbmYKK2Fjb3MxMDA5IGFjb3MgMi4zIGluZiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLWluZgorYWNvczEwMTAgYWNvcyAtMi4zIG5hbiAtPiBuYW4gbmFuCithY29zMTAxMSBhY29zIDIuMyBuYW4gLT4gbmFuIG5hbgorYWNvczEwMTIgYWNvcyAtaW5mIDIuMyAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLWluZgorYWNvczEwMTMgYWNvcyAtaW5mIDAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgLWluZgorYWNvczEwMTQgYWNvcyBpbmYgMi4zIC0+IDAuMCAtaW5mCithY29zMTAxNSBhY29zIGluZiAwLjAgLT4gMC4wIC1pbmYKK2Fjb3MxMDE2IGFjb3MgLWluZiBpbmYgLT4gMi4zNTYxOTQ0OTAxOTIzNDQ4IC1pbmYKK2Fjb3MxMDE3IGFjb3MgaW5mIGluZiAtPiAwLjc4NTM5ODE2MzM5NzQ0ODI4IC1pbmYKK2Fjb3MxMDE4IGFjb3MgaW5mIG5hbiAtPiBuYW4gaW5mICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlLWltYWctc2lnbgorYWNvczEwMTkgYWNvcyAtaW5mIG5hbiAtPiBuYW4gaW5mICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmUtaW1hZy1zaWduCithY29zMTAyMCBhY29zIG5hbiAwLjAgLT4gbmFuIG5hbgorYWNvczEwMjEgYWNvcyBuYW4gMi4zIC0+IG5hbiBuYW4KK2Fjb3MxMDIyIGFjb3MgbmFuIGluZiAtPiBuYW4gLWluZgorYWNvczEwMjMgYWNvcyBuYW4gbmFuIC0+IG5hbiBuYW4KK2Fjb3MxMDI0IGFjb3MgLTIuMyAtaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiBpbmYKK2Fjb3MxMDI1IGFjb3MgLTAuMCAtaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiBpbmYKK2Fjb3MxMDI2IGFjb3MgMC4wIC1pbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IGluZgorYWNvczEwMjcgYWNvcyAyLjMgLWluZiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgaW5mCithY29zMTAyOCBhY29zIC1pbmYgLTIuMyAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgaW5mCithY29zMTAyOSBhY29zIC1pbmYgLTAuMCAtPiAzLjE0MTU5MjY1MzU4OTc5MzEgaW5mCithY29zMTAzMCBhY29zIGluZiAtMi4zIC0+IDAuMCBpbmYKK2Fjb3MxMDMxIGFjb3MgaW5mIC0wLjAgLT4gMC4wIGluZgorYWNvczEwMzIgYWNvcyAtaW5mIC1pbmYgLT4gMi4zNTYxOTQ0OTAxOTIzNDQ4IGluZgorYWNvczEwMzMgYWNvcyBpbmYgLWluZiAtPiAwLjc4NTM5ODE2MzM5NzQ0ODI4IGluZgorYWNvczEwMzQgYWNvcyBuYW4gLTAuMCAtPiBuYW4gbmFuCithY29zMTAzNSBhY29zIG5hbiAtMi4zIC0+IG5hbiBuYW4KK2Fjb3MxMDM2IGFjb3MgbmFuIC1pbmYgLT4gbmFuIGluZgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBhY29zaDogSW52ZXJzZSBoeXBlcmJvbGljIGNvc2luZSAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK2Fjb3NoMDAwMCBhY29zaCAwLjAgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDAwMSBhY29zaCAwLjAgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDAyIGFjb3NoIC0wLjAgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDAwMyBhY29zaCAtMC4wIC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gYnJhbmNoIHBvaW50czogKy8tMQorYWNvc2gwMDEwIGFjb3NoIDEuMCAwLjAgLT4gMC4wIDAuMAorYWNvc2gwMDExIGFjb3NoIDEuMCAtMC4wIC0+IDAuMCAtMC4wCithY29zaDAwMTIgYWNvc2ggLTEuMCAwLjAgLT4gMC4wIDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDEzIGFjb3NoIC0xLjAgLTAuMCAtPiAwLjAgLTMuMTQxNTkyNjUzNTg5NzkzMQorCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiByZWFsIGF4aXMKK2Fjb3NoMDAyMCBhY29zaCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDAyMSBhY29zaCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDIyIGFjb3NoIC0xZS0zMDUgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDAyMyBhY29zaCAtMWUtMzA1IC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDAyNCBhY29zaCAtMWUtMTUwIDAuMCAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAwMjUgYWNvc2ggLTFlLTE1MCAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAwMjYgYWNvc2ggLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjgKK2Fjb3NoMDAyNyBhY29zaCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY4CithY29zaDAwMjggYWNvc2ggLTAuMDAxIDAuMCAtPiAwLjAgMS41NzE3OTYzMjY5NjE1NjM0CithY29zaDAwMjkgYWNvc2ggLTAuMDAxIC0wLjAgLT4gMC4wIC0xLjU3MTc5NjMyNjk2MTU2MzQKK2Fjb3NoMDAzMCBhY29zaCAtMC41Nzg5OTk5OTk5OTk5OTk5NiAwLjAgLT4gMC4wIDIuMTg4Mjk3OTgxNjEyMDY2NworYWNvc2gwMDMxIGFjb3NoIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gMC4wIC0yLjE4ODI5Nzk4MTYxMjA2NjcKK2Fjb3NoMDAzMiBhY29zaCAtMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gMC4wIDMuMTQxNTkyNjM4Njg4NjMxOQorYWNvc2gwMDMzIGFjb3NoIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gMC4wIC0zLjE0MTU5MjYzODY4ODYzMTkKK2Fjb3NoMDAzNCBhY29zaCAtMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4IDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDM1IGFjb3NoIC0xLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDAzNiBhY29zaCAtMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAwLjA0NDcxNzYzMzYwODMwNjg0OSAzLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDAzNyBhY29zaCAtMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMC4wNDQ3MTc2MzM2MDgzMDY4NDkgLTMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDM4IGFjb3NoIC0yLjAgMC4wIC0+IDEuMzE2OTU3ODk2OTI0ODE2OCAzLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDAzOSBhY29zaCAtMi4wIC0wLjAgLT4gMS4zMTY5NTc4OTY5MjQ4MTY4IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDA0MCBhY29zaCAtMjMuMCAwLjAgLT4gMy44MjgxNjg0NzEzMzMxMDEyIDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQxIGFjb3NoIC0yMy4wIC0wLjAgLT4gMy44MjgxNjg0NzEzMzMxMDEyIC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDA0MiBhY29zaCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMzcuNTM0NTA4NjY4NDY0Njc0IDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQzIGFjb3NoIC0xMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMzcuNTM0NTA4NjY4NDY0Njc0IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDA0NCBhY29zaCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDM0Ni4wODA5MTExMjk2NjY3OSAzLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDA0NSBhY29zaCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiAzNDYuMDgwOTExMTI5NjY2NzkgLTMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQ2IGFjb3NoIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gNjg5LjE2NjA4OTk4NTc3OTY1IDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMDQ3IGFjb3NoIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDY4OS4xNjYwODk5ODU3Nzk2NSAtMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAwNDggYWNvc2ggOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDA0OSBhY29zaCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAwNTAgYWNvc2ggMWUtMzA1IDAuMCAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAwNTEgYWNvc2ggMWUtMzA1IC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDA1MiBhY29zaCAxZS0xNTAgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDA1MyBhY29zaCAxZS0xNTAgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMDU0IGFjb3NoIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDA1NSBhY29zaCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDA1NiBhY29zaCAwLjAwMSAwLjAgLT4gMC4wIDEuNTY5Nzk2MzI2NjI4MjMKK2Fjb3NoMDA1NyBhY29zaCAwLjAwMSAtMC4wIC0+IDAuMCAtMS41Njk3OTYzMjY2MjgyMworYWNvc2gwMDU4IGFjb3NoIDAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IDAuMCAwLjk1MzI5NDY3MTk3NzcyNjU1CithY29zaDAwNTkgYWNvc2ggMC41Nzg5OTk5OTk5OTk5OTk5NiAtMC4wIC0+IDAuMCAtMC45NTMyOTQ2NzE5Nzc3MjY1NQorYWNvc2gwMDYwIGFjb3NoIDAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IDAuMCAxLjQ5MDExNjExOTM4NDc2NTZlLTA4CithY29zaDAwNjEgYWNvc2ggMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IDAuMCAtMS40OTAxMTYxMTkzODQ3NjU2ZS0wOAorYWNvc2gwMDYyIGFjb3NoIDEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gMi4xMDczNDI0MjU1NDQ3MDE0ZS0wOCAwLjAKK2Fjb3NoMDA2MyBhY29zaCAxLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4IC0wLjAKK2Fjb3NoMDA2NCBhY29zaCAxLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuMDQ0NzE3NjMzNjA4MzA2ODQ5IDAuMAorYWNvc2gwMDY1IGFjb3NoIDEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDAuMDQ0NzE3NjMzNjA4MzA2ODQ5IC0wLjAKK2Fjb3NoMDA2NiBhY29zaCAyLjAgMC4wIC0+IDEuMzE2OTU3ODk2OTI0ODE2OCAwLjAKK2Fjb3NoMDA2NyBhY29zaCAyLjAgLTAuMCAtPiAxLjMxNjk1Nzg5NjkyNDgxNjggLTAuMAorYWNvc2gwMDY4IGFjb3NoIDIzLjAgMC4wIC0+IDMuODI4MTY4NDcxMzMzMTAxMiAwLjAKK2Fjb3NoMDA2OSBhY29zaCAyMy4wIC0wLjAgLT4gMy44MjgxNjg0NzEzMzMxMDEyIC0wLjAKK2Fjb3NoMDA3MCBhY29zaCAxMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAzNy41MzQ1MDg2Njg0NjQ2NzQgMC4wCithY29zaDAwNzEgYWNvc2ggMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDM3LjUzNDUwODY2ODQ2NDY3NCAtMC4wCithY29zaDAwNzIgYWNvc2ggOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDM0Ni4wODA5MTExMjk2NjY3OSAwLjAKK2Fjb3NoMDA3MyBhY29zaCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDM0Ni4wODA5MTExMjk2NjY3OSAtMC4wCithY29zaDAwNzQgYWNvc2ggMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDY4OS4xNjYwODk5ODU3Nzk2NSAwLjAKK2Fjb3NoMDA3NSBhY29zaCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDY4OS4xNjYwODk5ODU3Nzk2NSAtMC4wCisKKy0tIHJhbmRvbSBpbnB1dHMKK2Fjb3NoMDEwMCBhY29zaCAtMS40MzI4NTg5NTgxMjUwODQzIC0xLjgzNzAzNDc3NzU1NTgzMDkgLT4gMS41NTI2OTYyNjQ2NTQ5NTg3IC0yLjE5MDI1MDE2ODQzNTc4NgorYWNvc2gwMTAxIGFjb3NoIC0wLjMxMDc1ODE5MTU2MjIwOTU3IC0xLjA3NzI1NTU3ODY4MzkyOTcgLT4gMC45NTEzOTE2ODI4NjE5MzcwOSAtMS43ODEyMjI4MDg5NjM2NDc5CithY29zaDAxMDIgYWNvc2ggLTEuOTA0NDc3NjU3ODA3MDQ1MyAtMjAuNDg1MzcwMTU4OTMyMTI0IC0+IDMuNzE3NzQxMTA4ODkzMjM1OSAtMS42NjMzODg4NzQ1ODYxMjI3CithY29zaDAxMDMgYWNvc2ggLTAuMDc1NjQyNTA2MDAwODU4NzQyIC0yMTk2NTk3NjMyMC44NzMwNTEgLT4gMjQuNTA1OTA3NzQyODgxOTkxIC0xLjU3MDc5NjMyNjc5ODM0MDIKK2Fjb3NoMDEwNCBhY29zaCAtMS42MTYyMjcxMTgxMDU2MzA3IC0zLjAzNjkzNDM0NTg2OTYwOTkgLT4gMS45NDA3MDU3MjYyODYxMjI3IC0yLjA0Mjk1NDk0NjE3NTAyMDkKK2Fjb3NoMDEwNSBhY29zaCAtMC4zMTAzNzgwMjgwMjk4MDYzIDAuMDAwMTgwNTQ4ODAwMTgwNzg5ODcgLT4gMC4wMDAxODk5Mjg3NzA1ODc2MTQxNiAxLjg4NjM4Njk5NTA5NjcyOAorYWNvc2gwMTA2IGFjb3NoIC05MTU5NDY4NzUxLjU4OTc2NTUgNS44MDE0NzQ3NjY0MjczNjQ5IC0+IDIzLjYzMTIwMTE5Nzk1OTE5MyAzLjE0MTU5MjY1Mjk1NjQwNzgKK2Fjb3NoMDEwNyBhY29zaCAtMC4wMzc3MzkxNTc1NTA5MzM4ODQgMC4yMTg0MTM1NzQ5MzUxMDcwNSAtPiAwLjIxNjg1ODQ0OTYwNjAyNDg4IDEuNjA3NjczNTEzMzQ0OTQwMgorYWNvc2gwMTA4IGFjb3NoIC04MjI1OTkxLjA1MDgzOTQyOTcgMC4yODMxODU0MzAwODkxMzY0NCAtPiAxNi42MTU5NTY1MjA0MjAyODcgMy4xNDE1OTI2MTkxNjQxMDE5CithY29zaDAxMDkgYWNvc2ggLTM1LjYyMDA3MDUwMjMwMjYzOSAwLjMxMzAzMjM3MDA1MDE1IC0+IDQuMjY1ODk4MDAwNjk0Mzk2NSAzLjEzMjgwMTMyNTU1NDE4NzMKK2Fjb3NoMDExMCBhY29zaCA5Ni43Mjk5Mzk5MDY4MjA5MTcgLTAuMDI5MzQ1MjI4MzcyMzY1MzM0IC0+IDUuMjY1MDQzNDc3NTg2MzU0OCAtMC4wMDAzMDMzODg5NTg2Njk3Mjg0MworYWNvc2gwMTExIGFjb3NoIDAuNTk2NTYwMjQwMDc5NjY0OTEgLTIuMDQxMjI5NDY1NDE2Mzk3OCAtPiAxLjQ5MjMwMDIwMjQyODc4MzUgLTEuMzEyNTY4NDIxOTAwMzM4CithY29zaDAxMTIgYWNvc2ggMTA5LjI5Mzg0MTEyNjc3ODI4IC0wLjAwMDE1NDU0ODYzMDYxNTMzODEyIC0+IDUuMzg3MTY2Mjk2MTU0NTQ3NyAtMS40MTQxMjQ1MTU0MDYxMjE0ZS0wNgorYWNvc2gwMTEzIGFjb3NoIDguNjcwNTY1MTk2OTM2MTU5NyAtMy42NzIzNjMxNjQ5Nzg3NDY1IC0+IDIuOTMzNjE4MDk1ODM2MzU0NSAtMC40MDI2NzM2MjAzMTg3Mjg2MQorYWNvc2gwMTE0IGFjb3NoIDEuODEwMTY0NjQ0NTA1MjY4NiAtMC4wMTIzNDUxMzI3MjE4NTU0NzggLT4gMS4xOTk3MTQ4NTY2Mjg1NzY5IC0wLjAwODE4MTM5MTI3NjAxNTAyNjUKK2Fjb3NoMDExNSBhY29zaCA1Mi41Njg5NzE5NTAyNTI4OCAwLjAwMTExMzkxNjA2NTk4NTQ0MyAtPiA0LjY1NTE4Mjc2MjIyNjQxMzUgMi4xMTkzNDQ1ODcyMDQwMzA3ZS0wNQorYWNvc2gwMTE2IGFjb3NoIDAuMjgzMzY3ODYxNjQyMTQ3MzkgMzU1NjQzOTkyNDU3LjQwNDg1IC0+IDI3LjI5MDM0MzIyNjgxNjUyOCAxLjU3MDc5NjMyNjc5NDA5OTkKK2Fjb3NoMDExNyBhY29zaCAwLjczODc2NjIxMjkxOTExNDM3IDIuODgyODU5NDU0MTEwNDMyMmUtMjAgLT4gNC4yNzc0ODIwOTc4MTU5MDY3ZS0yMCAwLjczOTU1ODQ1ODM2ODI3OTI3CithY29zaDAxMTggYWNvc2ggMC4wMjU4NjU0NzE3ODE3MTg4NzggMzcxMjU3NDYwNjQzMTguNDkyIC0+IDMxLjkzODQ3ODk4OTQxODAxMiAxLjU3MDc5NjMyNjc5NDg5NTkKK2Fjb3NoMDExOSBhY29zaCAyLjIwNDczNTM1MTE3ODAxMzIgMC4wNzQ3MTIyNDgxNDM0ODkyNzEgLT4gMS40Mjg2NDAzMjQ4Njk4MDIxIDAuMDM3OTk3OTA0OTcxNjI2NTk4CisKKy0tIHZhbHVlcyBuZWFyIGluZmluaXR5CithY29zaDAyMDAgYWNvc2ggOC4xNTQ4NTkyODc2NDY3Nzg1ZSszMDcgOS4wOTQzNzc5MzM1OTUxMTI4ZSszMDcgLT4gNzEwLjA4OTQ0NjIwODAwNjA1IDAuODM5ODExNjU0MjU0Nzg5NTQKK2Fjb3NoMDIwMSBhY29zaCAxLjQyMzcyMjk2ODA5NzI1MzFlKzMwOCAtMS4wMzM2OTY2NjE3ODc0ODU4ZSszMDggLT4gNzEwLjQ1NDMzMzEwOTQ3NTkgLTAuNjI3OTk3Mjg3NjM0ODc1NQorYWNvc2gwMjAyIGFjb3NoIC0xLjUwMTQ1MjY4OTk3Mzg5MzllKzMwOCAxLjU2NzA3MDAzNzg0NDg3OTJlKzMwOCAtPiA3MTAuNjY0MjA3MDY3OTU0NjQgMi4zMzQ4MTM3Mjk5MTA2Njk3CithY29zaDAyMDMgYWNvc2ggLTEuMDkzOTA0MDM3NTIxMzkyOGUrMzA4IC0xLjA0MTY5NjAzNTExMjc5NzhlKzMwOCAtPiA3MTAuMzAxODI4NjMxMTU4ODYgLTIuMzgwNjM2MTQ3Nzg3MDI3CithY29zaDAyMDQgYWNvc2ggMC4wIDEuNDc2MDYyNDMzNTU5NTg4ZSszMDggLT4gNzEwLjI3ODczMzg0NzE2OTI5IDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjA1IGFjb3NoIC0wLjAgNi4yMDc3MjEwMzI2MjIxMDk0ZSszMDcgLT4gNzA5LjQxMjU2NDU3NDg0NzY5IDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjA2IGFjb3NoIDAuMCAtMS41NjIxODk5OTA5OTY4MzA4ZSszMDggLT4gNzEwLjMzNTQ0NDQ5OTkwNzM0IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIwNyBhY29zaCAtMC4wIC04LjM1NTY2MjQ4MzM4MzkxMjJlKzMwNyAtPiA3MDkuNzA5NzEwMTgwNDgzMTcgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjA4IGFjb3NoIDEuMzA2NzA3OTc1MjQ5OTM0MmUrMzA4IDAuMCAtPiA3MTAuMTU2ODY2ODAxMDcyMjggMC4wCithY29zaDAyMDkgYWNvc2ggMS41NjUzNjQwMzQwMjE0MDI2ZSszMDggLTAuMCAtPiA3MTAuMzM3NDc0MjI5MjY3MDYgLTAuMAorYWNvc2gwMjEwIGFjb3NoIC02LjkwMTEzNzU5OTIyOTA2MzZlKzMwNyAwLjAgLT4gNzA5LjUxODQ1Njk5NzE5OTIyIDMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMjExIGFjb3NoIC05Ljk1Mzk1NzY4MDk5MjY5NzNlKzMwNyAtMC4wIC0+IDcwOS44ODQ3NDA5NTg3MDE4NSAtMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDAyMTIgYWNvc2ggNy42NDQ5NTk4NTE4OTE0OTI1ZSszMDcgOS41NzA2NTQwNzY4MjY4MzU4IC0+IDcwOS42MjA4MTczMTc1NDgwMiAxLjI1MTg5MDY5MTY3NjkzNDVlLTMwNworYWNvc2gwMjEzIGFjb3NoIDUuNDMyNTQxMDk3MjYwMjE5N2UrMzA3IC03LjgwNjQ4MDc4MTY1MjI3MDYgLT4gNzA5LjI3OTE3NzcyNzkyNSAtMS40MzY5ODUxMzEyNDcxOTc0ZS0zMDcKK2Fjb3NoMDIxNCBhY29zaCAtMS4xNTIzNjI2MTEyMzYwNDY1ZSszMDggNy4wNjE3NTEwMDM4ODY5MzM2IC0+IDcxMC4wMzExNzAxMDIxNjkwOSAzLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMDIxNSBhY29zaCAtMS4xNjg1MDI3Nzg2ODYyNTk5ZSszMDggLTUuMTU2ODU1ODM1NzkyNTYyNSAtPiA3MTAuMDQ1MDc5MDc1NzE0MTcgLTMuMTQxNTkyNjUzNTg5NzkzMQorYWNvc2gwMjE2IGFjb3NoIDMuMDIzNjM3MDMzOTc4ODcyMSAxLjc1MDMyNDg3MjAwOTY0MTdlKzMwOCAtPiA3MTAuNDQ5MTU3MjM0NTgwNjQgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMTcgYWNvc2ggNi42MTA4MDA3OTI2MDMxMTQ5IC05LjE0Njk5NjgyMjU4MDYxNDllKzMwNyAtPiA3MDkuODAwMTk2MzM5MDMzMjggLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjE4IGFjb3NoIC01LjEwOTYyNjI5MDU2MjM5NTkgNi40NDg0OTI2Nzg1NDEyMzk1ZSszMDcgLT4gNzA5LjQ1MDYxNzEzOTk3OTczIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjE5IGFjb3NoIC0yLjgwODA5MjA2MDg3MzU4NDYgLTEuNzcxNjExODgzNjUxOTM2OGUrMzA4IC0+IDcxMC40NjEyNDU2MjM2MzQ0NSAtMS41NzA3OTYzMjY3OTQ4OTY2CisKKy0tIHZhbHVlcyBuZWFyIDAKK2Fjb3NoMDIyMCBhY29zaCA0LjU1NjA1MzAzMjY2OTkzMDRlLTMxNyA3LjMwNDg5ODkxMjE0MzY2NTdlLTMxOCAtPiA3LjMwNDg5ODkxMjE0MzY2NTdlLTMxOCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyMSBhY29zaCA0Ljg3NTQyNzQxMzM1ODUzMzFlLTMxNCAtOS44NDY5Nzk0ODk3Njg0MTk5ZS0zMTUgLT4gOS44NDY5Nzk0ODk3Njg0MTk5ZS0zMTUgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gwMjIyIGFjb3NoIC00LjY3NDg4NzYwMDk5NjAwOTdlLTMxMiA5Ljc5MDAzNDI4ODc1NTc2MDZlLTMxOCAtPiA5Ljc5MDAzNDI4ODc1NTc2MDZlLTMxOCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyMyBhY29zaCAtNC4zMTM2ODcxNTM4Mzk5MjM2ZS0zMjAgLTQuOTQwNjU2NDU4NDEyNDY1NGUtMzIzIC0+IDQuOTQwNjU2NDU4NDEyNDY1NGUtMzIzIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyNCBhY29zaCAwLjAgNC4zNDMxMDEzODY2NDk2Nzc0ZS0zMTQgLT4gNC4zNDMxMDEzODY2NDk2Nzc0ZS0zMTQgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMjUgYWNvc2ggLTAuMCA2LjAxNDczMzQzMzU4MjkxODRlLTMxNyAtPiA2LjAxNDczMzQzMzU4MjkxODRlLTMxNyAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyNiBhY29zaCAwLjAgLTEuMjg4MDI5MTM4NzA4MTI5N2UtMzIwIC0+IDEuMjg4MDI5MTM4NzA4MTI5N2UtMzIwIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyNyBhY29zaCAtMC4wIC0xLjQ0MDE1NjM5NzY1MzQ2MjFlLTMxNyAtPiAxLjQ0MDE1NjM5NzY1MzQ2MjFlLTMxNyAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMjggYWNvc2ggMS4zNjg5NjgwNTcwODYzMDkxZS0zMTMgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMDIyOSBhY29zaCAxLjUzMDQzNDY4OTM0OTQzNzFlLTMxMiAtMC4wIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMzAgYWNvc2ggLTMuNzQ1MDE3NTk1NDc2NjQ4OGUtMzIwIDAuMCAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDAyMzEgYWNvc2ggLTguNDI1MDU2MzA4MDg4NTgwMWUtMzExIC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2Fjb3NoMTAwMCBhY29zaCAwLjAgMC4wIC0+IDAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAwMSBhY29zaCAtMC4wIDAuMCAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMDIgYWNvc2ggMC4wIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMDMgYWNvc2ggMi4zIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMDQgYWNvc2ggLTAuMCBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gxMDA1IGFjb3NoIC0yLjMgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAwNiBhY29zaCAwLjAgbmFuIC0+IG5hbiBuYW4KK2Fjb3NoMTAwNyBhY29zaCAyLjMgbmFuIC0+IG5hbiBuYW4KK2Fjb3NoMTAwOCBhY29zaCAtMC4wIG5hbiAtPiBuYW4gbmFuCithY29zaDEwMDkgYWNvc2ggLTIuMyBuYW4gLT4gbmFuIG5hbgorYWNvc2gxMDEwIGFjb3NoIC1pbmYgMC4wIC0+IGluZiAzLjE0MTU5MjY1MzU4OTc5MzEKK2Fjb3NoMTAxMSBhY29zaCAtaW5mIDIuMyAtPiBpbmYgMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDEwMTIgYWNvc2ggaW5mIDAuMCAtPiBpbmYgMC4wCithY29zaDEwMTMgYWNvc2ggaW5mIDIuMyAtPiBpbmYgMC4wCithY29zaDEwMTQgYWNvc2ggLWluZiBpbmYgLT4gaW5mIDIuMzU2MTk0NDkwMTkyMzQ0OAorYWNvc2gxMDE1IGFjb3NoIGluZiBpbmYgLT4gaW5mIDAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2Fjb3NoMTAxNiBhY29zaCBpbmYgbmFuIC0+IGluZiBuYW4KK2Fjb3NoMTAxNyBhY29zaCAtaW5mIG5hbiAtPiBpbmYgbmFuCithY29zaDEwMTggYWNvc2ggbmFuIDAuMCAtPiBuYW4gbmFuCithY29zaDEwMTkgYWNvc2ggbmFuIDIuMyAtPiBuYW4gbmFuCithY29zaDEwMjAgYWNvc2ggbmFuIGluZiAtPiBpbmYgbmFuCithY29zaDEwMjEgYWNvc2ggbmFuIG5hbiAtPiBuYW4gbmFuCithY29zaDEwMjIgYWNvc2ggMC4wIC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAyMyBhY29zaCAtMC4wIC0wLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2Fjb3NoMTAyNCBhY29zaCAwLjAgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYWNvc2gxMDI1IGFjb3NoIDIuMyAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMjYgYWNvc2ggLTAuMCAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMjcgYWNvc2ggLTIuMyAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2CithY29zaDEwMjggYWNvc2ggLWluZiAtMC4wIC0+IGluZiAtMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDEwMjkgYWNvc2ggLWluZiAtMi4zIC0+IGluZiAtMy4xNDE1OTI2NTM1ODk3OTMxCithY29zaDEwMzAgYWNvc2ggaW5mIC0wLjAgLT4gaW5mIC0wLjAKK2Fjb3NoMTAzMSBhY29zaCBpbmYgLTIuMyAtPiBpbmYgLTAuMAorYWNvc2gxMDMyIGFjb3NoIC1pbmYgLWluZiAtPiBpbmYgLTIuMzU2MTk0NDkwMTkyMzQ0OAorYWNvc2gxMDMzIGFjb3NoIGluZiAtaW5mIC0+IGluZiAtMC43ODUzOTgxNjMzOTc0NDgyOAorYWNvc2gxMDM0IGFjb3NoIG5hbiAtMC4wIC0+IG5hbiBuYW4KK2Fjb3NoMTAzNSBhY29zaCBuYW4gLTIuMyAtPiBuYW4gbmFuCithY29zaDEwMzYgYWNvc2ggbmFuIC1pbmYgLT4gaW5mIG5hbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gYXNpbjogSW52ZXJzZSBzaW5lIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK2FzaW4wMDAwIGFzaW4gMC4wIDAuMCAtPiAwLjAgMC4wCithc2luMDAwMSBhc2luIDAuMCAtMC4wIC0+IDAuMCAtMC4wCithc2luMDAwMiBhc2luIC0wLjAgMC4wIC0+IC0wLjAgMC4wCithc2luMDAwMyBhc2luIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKKworLS0gYnJhbmNoIHBvaW50czogKy8tMQorYXNpbjAwMTAgYXNpbiAxLjAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2FzaW4wMDExIGFzaW4gMS4wIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2FzaW4wMDEyIGFzaW4gLTEuMCAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2FzaW4wMDEzIGFzaW4gLTEuMCAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiByZWFsIGF4aXMKK2FzaW4wMDIwIGFzaW4gLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wCithc2luMDAyMSBhc2luIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wIC0+IC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wCithc2luMDAyMiBhc2luIC0xZS0zMDUgMC4wIC0+IC0xZS0zMDUgMC4wCithc2luMDAyMyBhc2luIC0xZS0zMDUgLTAuMCAtPiAtMWUtMzA1IC0wLjAKK2FzaW4wMDI0IGFzaW4gLTFlLTE1MCAwLjAgLT4gLTFlLTE1MCAwLjAKK2FzaW4wMDI1IGFzaW4gLTFlLTE1MCAtMC4wIC0+IC0xZS0xNTAgLTAuMAorYXNpbjAwMjYgYXNpbiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wCithc2luMDAyNyBhc2luIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMAorYXNpbjAwMjggYXNpbiAtMC4wMDEgMC4wIC0+IC0wLjAwMTAwMDAwMDE2NjY2Njc0MTYgMC4wCithc2luMDAyOSBhc2luIC0wLjAwMSAtMC4wIC0+IC0wLjAwMTAwMDAwMDE2NjY2Njc0MTYgLTAuMAorYXNpbjAwMzAgYXNpbiAtMC41Nzg5OTk5OTk5OTk5OTk5NiAwLjAgLT4gLTAuNjE3NTAxNjU0ODE3MTcwMDEgMC4wCithc2luMDAzMSBhc2luIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gLTAuNjE3NTAxNjU0ODE3MTcwMDEgLTAuMAorYXNpbjAwMzIgYXNpbiAtMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gLTEuNTcwNzk2MzExODkzNzM1NCAwLjAKK2FzaW4wMDMzIGFzaW4gLTAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAtMS41NzA3OTYzMTE4OTM3MzU0IC0wLjAKK2FzaW4wMDM0IGFzaW4gLTEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4Cithc2luMDAzNSBhc2luIC0xLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0yLjEwNzM0MjQyNTU0NDcwMTRlLTA4Cithc2luMDAzNiBhc2luIC0xLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMC4wNDQ3MTc2MzM2MDgzMDY4NDkKK2FzaW4wMDM3IGFzaW4gLTEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuMDQ0NzE3NjMzNjA4MzA2ODQ5Cithc2luMDAzOCBhc2luIC0yLjAgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMS4zMTY5NTc4OTY5MjQ4MTY4Cithc2luMDAzOSBhc2luIC0yLjAgLTAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0xLjMxNjk1Nzg5NjkyNDgxNjgKK2FzaW4wMDQwIGFzaW4gLTIzLjAgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMy44MjgxNjg0NzEzMzMxMDEyCithc2luMDA0MSBhc2luIC0yMy4wIC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMy44MjgxNjg0NzEzMzMxMDEyCithc2luMDA0MiBhc2luIC0xMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDM3LjUzNDUwODY2ODQ2NDY3NAorYXNpbjAwNDMgYXNpbiAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTM3LjUzNDUwODY2ODQ2NDY3NAorYXNpbjAwNDQgYXNpbiAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgMzQ2LjA4MDkxMTEyOTY2Njc5Cithc2luMDA0NSBhc2luIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTM0Ni4wODA5MTExMjk2NjY3OQorYXNpbjAwNDYgYXNpbiAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgNjg5LjE2NjA4OTk4NTc3OTY1Cithc2luMDA0NyBhc2luIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTY4OS4xNjYwODk5ODU3Nzk2NQorYXNpbjAwNDggYXNpbiA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wCithc2luMDA0OSBhc2luIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMAorYXNpbjAwNTAgYXNpbiAxZS0zMDUgMC4wIC0+IDFlLTMwNSAwLjAKK2FzaW4wMDUxIGFzaW4gMWUtMzA1IC0wLjAgLT4gMWUtMzA1IC0wLjAKK2FzaW4wMDUyIGFzaW4gMWUtMTUwIDAuMCAtPiAxZS0xNTAgMC4wCithc2luMDA1MyBhc2luIDFlLTE1MCAtMC4wIC0+IDFlLTE1MCAtMC4wCithc2luMDA1NCBhc2luIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wCithc2luMDA1NSBhc2luIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAKK2FzaW4wMDU2IGFzaW4gMC4wMDEgMC4wIC0+IDAuMDAxMDAwMDAwMTY2NjY2NzQxNiAwLjAKK2FzaW4wMDU3IGFzaW4gMC4wMDEgLTAuMCAtPiAwLjAwMTAwMDAwMDE2NjY2Njc0MTYgLTAuMAorYXNpbjAwNTggYXNpbiAwLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAwLjYxNzUwMTY1NDgxNzE3MDAxIDAuMAorYXNpbjAwNTkgYXNpbiAwLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gMC42MTc1MDE2NTQ4MTcxNzAwMSAtMC4wCithc2luMDA2MCBhc2luIDAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IDEuNTcwNzk2MzExODkzNzM1NCAwLjAKK2FzaW4wMDYxIGFzaW4gMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IDEuNTcwNzk2MzExODkzNzM1NCAtMC4wCithc2luMDA2MiBhc2luIDEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDIuMTA3MzQyNDI1NTQ0NzAxNGUtMDgKK2FzaW4wMDYzIGFzaW4gMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0yLjEwNzM0MjQyNTU0NDcwMTRlLTA4Cithc2luMDA2NCBhc2luIDEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMDQ0NzE3NjMzNjA4MzA2ODQ5Cithc2luMDA2NSBhc2luIDEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wNDQ3MTc2MzM2MDgzMDY4NDkKK2FzaW4wMDY2IGFzaW4gMi4wIDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMS4zMTY5NTc4OTY5MjQ4MTY4Cithc2luMDA2NyBhc2luIDIuMCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMS4zMTY5NTc4OTY5MjQ4MTY4Cithc2luMDA2OCBhc2luIDIzLjAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAzLjgyODE2ODQ3MTMzMzEwMTIKK2FzaW4wMDY5IGFzaW4gMjMuMCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMy44MjgxNjg0NzEzMzMxMDEyCithc2luMDA3MCBhc2luIDEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAzNy41MzQ1MDg2Njg0NjQ2NzQKK2FzaW4wMDcxIGFzaW4gMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMzcuNTM0NTA4NjY4NDY0Njc0Cithc2luMDA3MiBhc2luIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMzQ2LjA4MDkxMTEyOTY2Njc5Cithc2luMDA3MyBhc2luIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0zNDYuMDgwOTExMTI5NjY2NzkKK2FzaW4wMDc0IGFzaW4gMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA2ODkuMTY2MDg5OTg1Nzc5NjUKK2FzaW4wMDc1IGFzaW4gMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTY4OS4xNjYwODk5ODU3Nzk2NQorCistLSByYW5kb20gaW5wdXRzCithc2luMDEwMCBhc2luIC0xLjU5Nzk1NTU4MzUwODYwODMgLTAuMTUwMDMwMDk4MTQ1OTUyNDcgLT4gLTEuNDUxNTM2OTU1NzQwNTc4OCAtMS4wNTQ0NDc2Mzk5NzkwODIzCithc2luMDEwMSBhc2luIC0wLjU3NDg4MjI1ODk1MzE3Njc5IC05LjYwODAzOTc4Mzg5NTI3NDNlLTEzIC0+IC0wLjYxMjQ2MDI0NDYwNDEyODUxIC0xLjE3NDIzODAwNTQwMDQwM2UtMTIKK2FzaW4wMTAyIGFzaW4gLTMuNjUwODA4NzkzMDUxNjI0OSAtMC4zNjAyNzUyNzA5MzIyMDE1MiAtPiAtMS40Njg1ODkwNjA1MzA1ODc0IC0xLjk3NDIyNzMwMDcxNTIwMzgKK2FzaW4wMTAzIGFzaW4gLTEuNTIzODY1OTc5MjMyNjgxOSAtMS4xMzYwODEzNTE2OTk2MzY0IC0+IC0wLjg2MDgwMDUxNjkxMTQ3Mjc1IC0xLjMyMjM3NDIyMDU2ODkxOTUKK2FzaW4wMTA0IGFzaW4gLTE1OTIuMDYzOTA0NTU1NTMwNiAtMC43MjM2MjQyNzkzNTAxODIzNiAtPiAtMS41NzAzNDE4MDcxMTc1MTc5IC04LjA2NTkzMzY5MTg3MjkyMjgKK2FzaW4wMTA1IGFzaW4gLTAuMTk4MzU0NzEzNzEzMTIwMTkgNC4yMTMxNTA4NDE2Njk3NzA5IC0+IC0wLjA0NTc3NzgzMTAxOTkzNTE0OSAyLjE0NjE3MzI3NTE5MzMxNzEKK2FzaW4wMTA2IGFzaW4gLTEuOTE4NDcxMDU0NDMwMjEzIDAuNDA2MDMzMDUwNzk3NzkyMzQgLT4gLTEuMzMwMTM5NjU4NTc5MTU1NiAxLjMwMjYzNjQyMzE0OTgxCithc2luMDEwNyBhc2luIC0yNTQ0OTUuMDE2MjMzNzM2NDIgMC43MTA4NDQxNDQzNDQ3MDgyMiAtPiAtMS41NzA3OTM1MzM2Mzk0MzU5IDEzLjE0MDE4MzcxMjc2MjMyMQorYXNpbjAxMDggYXNpbiAtMC4zMTMxNTg4MjcxNTY5MTE1NyAzLjk2NDc5OTQyODg0Mjk4NjYgLT4gLTAuMDc2NDUwNDAzODQwOTE2MDA0IDIuMDg4OTc2MjEzODcxMzQ1NworYXNpbjAxMDkgYXNpbiAtMC45MDAxNzA2NDI4NDcyMDgxNiAxLjI1MzA2NTk0ODU5MDcxMDUgLT4gLTAuNTM0NjY1MDk3NDE5NDM0NDcgMS4xNzAyODExNTU3NTc3Cithc2luMDExMCBhc2luIDIuMTYxNTE4MTY5NjU3MTA3NSAtMC4xNDA1ODY0NzQ4ODIyOTUyMyAtPiAxLjQ5NzYxNjYzMjM4OTY4NzEgLTEuNDA4NTgxMTAzOTMzNDYwNAorYXNpbjAxMTEgYXNpbiAxLjIxMDQ3NDkyMTA3MDc3OTUgLTAuODU3MzI0ODQ0ODUyOTg5OTkgLT4gMC44MzkxMzA3MTU4ODM0MzkyNCAtMS4wNjgxNzE5MjUwNTI1OTAxCithc2luMDExMiBhc2luIDEuNzA1OTczMzE4NTEyODg5MSAtMC44NDAzMjk2NjM3MzE1NjU4MSAtPiAxLjA1MTA5MDA4MTU4MTYyMjkgLTEuMjk2Nzk3OTc5MTM2MTY1MgorYXNpbjAxMTMgYXNpbiA5LjkxMzcwODUwMTcyOTA2ODcgLTEuNDYwODM4Mzk3MDI1MDg5MyAtPiAxLjQyMzc3MDQ4MjAxMjg4OTEgLTIuOTk1NDE0Njc3NTYwNjg2Cithc2luMDExNCBhc2luIDExNy4xMjM0NDc1MTA0MTQ5NSAtNTQ1MzkwODA5MS41MzM0MDE1IC0+IDIuMTQ3NTE0MTQxMTM5MjAxMmUtMDggLTIzLjExMjc0NTQ1MDIxNzA2NgorYXNpbjAxMTUgYXNpbiAwLjA4MTA0MTE4Nzc5ODAyOTIyNyAwLjA2NzA1NDM0OTg2MDE3MzE5NiAtPiAwLjA4MDk0Njc4Njg1Njc3MTgxMyAwLjA2NzIyMzk5MTA2MDYzOTY5OAorYXNpbjAxMTYgYXNpbiA0Ni42MzU0NzIzMjIwNDk5NDkgMi4zODM1MTkwNzE4MDU2Njc4IC0+IDEuNTE5NzE5NDk0MDAxMDc3OSA0LjUzNjY5ODk2MDA5NzIwODMKK2FzaW4wMTE3IGFzaW4gMzkwNy4wNjg3OTYxMTI3MTA1IDE5LjE0NDAyMTg4NjM5MDE4MSAtPiAxLjU2NTg5NjUyMzMwODMyMzUgOC45NjM3MDE4NzE1OTI0MjE3Cithc2luMDExOCBhc2luIDEuMDg4OTMxMjMyMjMwODI3MyA1MDkuMDE1Nzc4ODM1NTQ3NjggLT4gMC4wMDIxMzkyODAzODE3ODI5MzE2IDYuOTI1NjI5NDQ5NDUyNDcwNgorYXNpbjAxMTkgYXNpbiAwLjEwODUxNTE4Mjc3NTA5MjI0IDEuNTYxMjUxMDkwODIxNzQ3NiAtPiAwLjA1ODQ5MTAxNDI0MzkwMjYyMSAxLjIyOTcwNzU3MjU2MjEzMjcKKworLS0gdmFsdWVzIG5lYXIgaW5maW5pdHkKK2FzaW4wMjAwIGFzaW4gMS41MjMwMjQxOTk4ODIxNDk5ZSszMDggNS41NzA3MjI4OTk0MDg0NTI1ZSszMDcgLT4gMS4yMjAxNDQ2MzcwODkyMDY4IDcxMC4zNzI4MzQ4NjUzNTk2NgorYXNpbjAyMDEgYXNpbiA4LjEzMzQzMTc2OTg2NzIyMDRlKzMwNyAtOS4yMjQ5NDI1MTk3ODcyNDUxZSszMDcgLT4gMC43MjI1OTk5MTI4NDAyMDA0MiAtNzEwLjA5NjI0NTMwNDkwMjYKK2FzaW4wMjAyIGFzaW4gLTkuOTEzODUwNjY1OTI0MTc2OGUrMzA3IDYuNzAxNTQ0NTI2NDM0OTk1ZSszMDcgLT4gLTAuOTc2Mzc1MTE3NDIxOTQ1OTQgNzEwLjA2ODg3NDg2NjcxMzcxCithc2luMDIwMyBhc2luIC0xLjQxNDEyOTg4NjgxNzM4NDJlKzMwOCAtNS40MDE1MDUxMzQ1MTQxOTFlKzMwNyAtPiAtMS4yMDU5MzE5MDU1MTYwNTg3IC03MTAuMzAzOTY0Nzg5NTQ2MjgKK2FzaW4wMjA0IGFzaW4gMC4wIDkuMTYxODA5Mjk3Nzg5NzQzMWUrMzA3IC0+IDAuMCA3MDkuODAxODE0NDEwNTA1OTMKK2FzaW4wMjA1IGFzaW4gLTAuMCA2LjgwNjQzNDI1NTE5Mzk3NTVlKzMwNyAtPiAtMC4wIDcwOS41MDQ2MzkxMDg1MzQ4OQorYXNpbjAyMDYgYXNpbiAwLjAgLTYuNDk5NzUxNjQ1NDc5ODIxNWUrMzA3IC0+IDAuMCAtNzA5LjQ1ODUzNDY5NzUxNTkyCithc2luMDIwNyBhc2luIC0wLjAgLTEuNjc2NzQ0OTA1MzM0NTI0MmUrMzA4IC0+IC0wLjAgLTcxMC40MDYyMTAxODAzMDIyCithc2luMDIwOCBhc2luIDUuNDI0Mjc0OTk1NzM3ODkxNmUrMzA3IDAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgNzA5LjI3NzY1NDk3ODg4OTAyCithc2luMDIwOSBhc2luIDkuNTM0MjE0NTEyMTE2NDc0OWUrMzA3IC0wLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC03MDkuODQxNjU3NTg1OTU5MDcKK2FzaW4wMjEwIGFzaW4gLTcuMDQ0NTY5ODAwNjIwMTg0N2UrMzA3IDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDcwOS41MzkwMjc4MDg3MjEzNgorYXNpbjAyMTEgYXNpbiAtMS4wMDE2MDI1NTY5NzY5NzA2ZSszMDggLTAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC03MDkuODkwOTU3MDk2OTc4ODEKK2FzaW4wMjEyIGFzaW4gMS42NTUyMjAzNzc4ODc3MjA0ZSszMDggMC40ODc2MTU0MzMzNjI0OTQ5MSAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgNzEwLjM5MzI4OTk4MTUzNDc0Cithc2luMDIxMyBhc2luIDEuMjQ4NTcxMjgzMDM4NDg2OWUrMzA4IC00LjM0ODkzMTExNjEyNzg4OTkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC03MTAuMTExMzU1NzQ2Nzc4NgorYXNpbjAyMTQgYXNpbiAtMS41MTE3ODQyODEzMzUzMTI1ZSszMDggNS4xMjM0NTI2NjYxMDI0MzQgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiA3MTAuMzAyNjQ2NDE5MjMwMzEKK2FzaW4wMjE1IGFzaW4gLTEuMzE2NzYzNDMxMzAwODAxNmUrMzA4IC0wLjUyOTM5Njc5NzkzNTI4OTgyIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTcxMC4xNjQ1MzI2MDIzOTc2OAorYXNpbjAyMTYgYXNpbiAwLjgwODQzOTI5MTc2OTg1OTA3IDEuMDE1MDg1MTgyNzc2Nzg3NmUrMzA4IC0+IDcuOTY0MjUwNzM5NjExMzg3NWUtMzA5IDcwOS45MDQzMjgzNTU2MTYzNworYXNpbjAyMTcgYXNpbiA4LjI1NDQ4MDk4Mjk2ODA5MDEgLTEuNzQyMzU0ODE0MDUzOTQ3NGUrMzA4IC0+IDQuNzM3NTQzMDc0Njg2NTczM2UtMzA4IC03MTAuNDQ0NTkzMzYyNDIxNjQKK2FzaW4wMjE4IGFzaW4gLTUuMjQ5OTAwMDExODgyNDI5NSA0LjY2NTU1Nzg5Nzc1MTIyMTRlKzMwNyAtPiAtMS4xMjUyNDU5MjQ5MTEzMjkyZS0zMDcgNzA5LjEyNjk3ODE0OTExMDMKK2FzaW4wMjE5IGFzaW4gLTUuOTkwNDc4Mjc2MDgzMzQzMyAtNC43MzE1Njg5MzE0NzgxMTYzZSszMDcgLT4gLTEuMjY2MDY1OTQxOTM5NDYzN2UtMzA3IC03MDkuMTQxMDI3NTc1MjIzMTIKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2FzaW4xMDAwIGFzaW4gLTAuMCAwLjAgLT4gLTAuMCAwLjAKK2FzaW4xMDAxIGFzaW4gMC4wIDAuMCAtPiAwLjAgMC4wCithc2luMTAwMiBhc2luIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKK2FzaW4xMDAzIGFzaW4gMC4wIC0wLjAgLT4gMC4wIC0wLjAKK2FzaW4xMDA0IGFzaW4gLWluZiAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiBpbmYKK2FzaW4xMDA1IGFzaW4gLWluZiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiBpbmYKK2FzaW4xMDA2IGFzaW4gbmFuIDAuMCAtPiBuYW4gbmFuCithc2luMTAwNyBhc2luIG5hbiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgorYXNpbjEwMDggYXNpbiAtMC4wIGluZiAtPiAtMC4wIGluZgorYXNpbjEwMDkgYXNpbiAtMi4yOTk5OTk5OTk5OTk5OTk4IGluZiAtPiAtMC4wIGluZgorYXNpbjEwMTAgYXNpbiAtaW5mIGluZiAtPiAtMC43ODUzOTgxNjMzOTc0NDgyOCBpbmYKK2FzaW4xMDExIGFzaW4gbmFuIGluZiAtPiBuYW4gaW5mCithc2luMTAxMiBhc2luIC0wLjAgbmFuIC0+IC0wLjAgbmFuCithc2luMTAxMyBhc2luIC0yLjI5OTk5OTk5OTk5OTk5OTggbmFuIC0+IG5hbiBuYW4KK2FzaW4xMDE0IGFzaW4gLWluZiBuYW4gLT4gbmFuIGluZiBpZ25vcmUtaW1hZy1zaWduCithc2luMTAxNSBhc2luIG5hbiBuYW4gLT4gbmFuIG5hbgorYXNpbjEwMTYgYXNpbiBpbmYgMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiBpbmYKK2FzaW4xMDE3IGFzaW4gaW5mIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgaW5mCithc2luMTAxOCBhc2luIDAuMCBpbmYgLT4gMC4wIGluZgorYXNpbjEwMTkgYXNpbiAyLjI5OTk5OTk5OTk5OTk5OTggaW5mIC0+IDAuMCBpbmYKK2FzaW4xMDIwIGFzaW4gaW5mIGluZiAtPiAwLjc4NTM5ODE2MzM5NzQ0ODI4IGluZgorYXNpbjEwMjEgYXNpbiAwLjAgbmFuIC0+IDAuMCBuYW4KK2FzaW4xMDIyIGFzaW4gMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCithc2luMTAyMyBhc2luIGluZiBuYW4gLT4gbmFuIGluZiBpZ25vcmUtaW1hZy1zaWduCithc2luMTAyNCBhc2luIGluZiAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtaW5mCithc2luMTAyNSBhc2luIGluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtaW5mCithc2luMTAyNiBhc2luIG5hbiAtMC4wIC0+IG5hbiBuYW4KK2FzaW4xMDI3IGFzaW4gbmFuIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgorYXNpbjEwMjggYXNpbiAwLjAgLWluZiAtPiAwLjAgLWluZgorYXNpbjEwMjkgYXNpbiAyLjI5OTk5OTk5OTk5OTk5OTggLWluZiAtPiAwLjAgLWluZgorYXNpbjEwMzAgYXNpbiBpbmYgLWluZiAtPiAwLjc4NTM5ODE2MzM5NzQ0ODI4IC1pbmYKK2FzaW4xMDMxIGFzaW4gbmFuIC1pbmYgLT4gbmFuIC1pbmYKK2FzaW4xMDMyIGFzaW4gLWluZiAtMC4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLWluZgorYXNpbjEwMzMgYXNpbiAtaW5mIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtaW5mCithc2luMTAzNCBhc2luIC0wLjAgLWluZiAtPiAtMC4wIC1pbmYKK2FzaW4xMDM1IGFzaW4gLTIuMjk5OTk5OTk5OTk5OTk5OCAtaW5mIC0+IC0wLjAgLWluZgorYXNpbjEwMzYgYXNpbiAtaW5mIC1pbmYgLT4gLTAuNzg1Mzk4MTYzMzk3NDQ4MjggLWluZgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gYXNpbmg6IEludmVyc2UgaHlwZXJib2xpYyBzaW5lIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK2FzaW5oMDAwMCBhc2luaCAwLjAgMC4wIC0+IDAuMCAwLjAKK2FzaW5oMDAwMSBhc2luaCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorYXNpbmgwMDAyIGFzaW5oIC0wLjAgMC4wIC0+IC0wLjAgMC4wCithc2luaDAwMDMgYXNpbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorCistLSBicmFuY2ggcG9pbnRzOiArLy1pCithc2luaDAwMTAgYXNpbmggMC4wIDEuMCAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwMTEgYXNpbmggMC4wIC0xLjAgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDAxMiBhc2luaCAtMC4wIDEuMCAtPiAtMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDEzIGFzaW5oIC0wLjAgLTEuMCAtPiAtMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gdmFsdWVzIGFsb25nIGJvdGggc2lkZXMgb2YgaW1hZ2luYXJ5IGF4aXMKK2FzaW5oMDAyMCBhc2luaCAwLjAgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0+IDAuMCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQKK2FzaW5oMDAyMSBhc2luaCAtMC4wIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtPiAtMC4wIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXNpbmgwMDIyIGFzaW5oIDAuMCAtMWUtMzA1IC0+IDAuMCAtMWUtMzA1Cithc2luaDAwMjMgYXNpbmggLTAuMCAtMWUtMzA1IC0+IC0wLjAgLTFlLTMwNQorYXNpbmgwMDI0IGFzaW5oIDAuMCAtMWUtMTUwIC0+IDAuMCAtMWUtMTUwCithc2luaDAwMjUgYXNpbmggLTAuMCAtMWUtMTUwIC0+IC0wLjAgLTFlLTE1MAorYXNpbmgwMDI2IGFzaW5oIDAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtPiAwLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2FzaW5oMDAyNyBhc2luaCAtMC4wIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0+IC0wLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2FzaW5oMDAyOCBhc2luaCAwLjAgLTAuMDAxIC0+IDAuMCAtMC4wMDEwMDAwMDAxNjY2NjY3NDE2Cithc2luaDAwMjkgYXNpbmggLTAuMCAtMC4wMDEgLT4gLTAuMCAtMC4wMDEwMDAwMDAxNjY2NjY3NDE2Cithc2luaDAwMzAgYXNpbmggMC4wIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0+IDAuMCAtMC42MTc1MDE2NTQ4MTcxNzAwMQorYXNpbmgwMDMxIGFzaW5oIC0wLjAgLTAuNTc4OTk5OTk5OTk5OTk5OTYgLT4gLTAuMCAtMC42MTc1MDE2NTQ4MTcxNzAwMQorYXNpbmgwMDMyIGFzaW5oIDAuMCAtMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAwLjAgLTEuNTcwNzk2MzExODkzNzM1NAorYXNpbmgwMDMzIGFzaW5oIC0wLjAgLTAuOTk5OTk5OTk5OTk5OTk5ODkgLT4gLTAuMCAtMS41NzA3OTYzMTE4OTM3MzU0Cithc2luaDAwMzQgYXNpbmggMC4wIC0xLjAwMDAwMDAwMDAwMDAwMDIgLT4gMi4xMDczNDI0MjU1NDQ3MDE0ZS0wOCAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwMzUgYXNpbmggLTAuMCAtMS4wMDAwMDAwMDAwMDAwMDAyIC0+IC0yLjEwNzM0MjQyNTU0NDcwMTRlLTA4IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDAzNiBhc2luaCAwLjAgLTEuMDAwOTk5OTk5OTk5OTk5OSAtPiAwLjA0NDcxNzYzMzYwODMwNjg0OSAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwMzcgYXNpbmggLTAuMCAtMS4wMDA5OTk5OTk5OTk5OTk5IC0+IC0wLjA0NDcxNzYzMzYwODMwNjg0OSAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwMzggYXNpbmggMC4wIC0yLjAgLT4gMS4zMTY5NTc4OTY5MjQ4MTY4IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDAzOSBhc2luaCAtMC4wIC0yLjAgLT4gLTEuMzE2OTU3ODk2OTI0ODE2OCAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNDAgYXNpbmggMC4wIC0yMC4wIC0+IDMuNjg4MjUzODY3MzYxMjk2NiAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNDEgYXNpbmggLTAuMCAtMjAuMCAtPiAtMy42ODgyNTM4NjczNjEyOTY2IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0MiBhc2luaCAwLjAgLTEwMDAwMDAwMDAwMDAwMDAwLjAgLT4gMzcuNTM0NTA4NjY4NDY0Njc0IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0MyBhc2luaCAtMC4wIC0xMDAwMDAwMDAwMDAwMDAwMC4wIC0+IC0zNy41MzQ1MDg2Njg0NjQ2NzQgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDQ0IGFzaW5oIDAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLT4gMzQ2LjA4MDkxMTEyOTY2Njc5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0NSBhc2luaCAtMC4wIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtPiAtMzQ2LjA4MDkxMTEyOTY2Njc5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA0NiBhc2luaCAwLjAgLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0+IDY4OS4xNjYwODk5ODU3Nzk2NSAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNDcgYXNpbmggLTAuMCAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gLTY4OS4xNjYwODk5ODU3Nzk2NSAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNDggYXNpbmggMC4wIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0+IDAuMCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXNpbmgwMDQ5IGFzaW5oIC0wLjAgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLT4gLTAuMCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXNpbmgwMDUwIGFzaW5oIDAuMCAxZS0zMDUgLT4gMC4wIDFlLTMwNQorYXNpbmgwMDUxIGFzaW5oIC0wLjAgMWUtMzA1IC0+IC0wLjAgMWUtMzA1Cithc2luaDAwNTIgYXNpbmggMC4wIDFlLTE1MCAtPiAwLjAgMWUtMTUwCithc2luaDAwNTMgYXNpbmggLTAuMCAxZS0xNTAgLT4gLTAuMCAxZS0xNTAKK2FzaW5oMDA1NCBhc2luaCAwLjAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtPiAwLjAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXNpbmgwMDU1IGFzaW5oIC0wLjAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtPiAtMC4wIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2FzaW5oMDA1NiBhc2luaCAwLjAgMC4wMDEgLT4gMC4wIDAuMDAxMDAwMDAwMTY2NjY2NzQxNgorYXNpbmgwMDU3IGFzaW5oIC0wLjAgMC4wMDEgLT4gLTAuMCAwLjAwMTAwMDAwMDE2NjY2Njc0MTYKK2FzaW5oMDA1OCBhc2luaCAwLjAgMC41Nzg5OTk5OTk5OTk5OTk5NiAtPiAwLjAgMC42MTc1MDE2NTQ4MTcxNzAwMQorYXNpbmgwMDU5IGFzaW5oIC0wLjAgMC41Nzg5OTk5OTk5OTk5OTk5NiAtPiAtMC4wIDAuNjE3NTAxNjU0ODE3MTcwMDEKK2FzaW5oMDA2MCBhc2luaCAwLjAgMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAwLjAgMS41NzA3OTYzMTE4OTM3MzU0Cithc2luaDAwNjEgYXNpbmggLTAuMCAwLjk5OTk5OTk5OTk5OTk5OTg5IC0+IC0wLjAgMS41NzA3OTYzMTE4OTM3MzU0Cithc2luaDAwNjIgYXNpbmggMC4wIDEuMDAwMDAwMDAwMDAwMDAwMiAtPiAyLjEwNzM0MjQyNTU0NDcwMTRlLTA4IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDYzIGFzaW5oIC0wLjAgMS4wMDAwMDAwMDAwMDAwMDAyIC0+IC0yLjEwNzM0MjQyNTU0NDcwMTRlLTA4IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDY0IGFzaW5oIDAuMCAxLjAwMDk5OTk5OTk5OTk5OTkgLT4gMC4wNDQ3MTc2MzM2MDgzMDY4NDkgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNjUgYXNpbmggLTAuMCAxLjAwMDk5OTk5OTk5OTk5OTkgLT4gLTAuMDQ0NzE3NjMzNjA4MzA2ODQ5IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDY2IGFzaW5oIDAuMCAyLjAgLT4gMS4zMTY5NTc4OTY5MjQ4MTY4IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDY3IGFzaW5oIC0wLjAgMi4wIC0+IC0xLjMxNjk1Nzg5NjkyNDgxNjggMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAwNjggYXNpbmggMC4wIDIwLjAgLT4gMy42ODgyNTM4NjczNjEyOTY2IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDY5IGFzaW5oIC0wLjAgMjAuMCAtPiAtMy42ODgyNTM4NjczNjEyOTY2IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDcwIGFzaW5oIDAuMCAxMDAwMDAwMDAwMDAwMDAwMC4wIC0+IDM3LjUzNDUwODY2ODQ2NDY3NCAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA3MSBhc2luaCAtMC4wIDEwMDAwMDAwMDAwMDAwMDAwLjAgLT4gLTM3LjUzNDUwODY2ODQ2NDY3NCAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA3MiBhc2luaCAwLjAgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLT4gMzQ2LjA4MDkxMTEyOTY2Njc5IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDczIGFzaW5oIC0wLjAgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLT4gLTM0Ni4wODA5MTExMjk2NjY3OSAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDA3NCBhc2luaCAwLjAgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gNjg5LjE2NjA4OTk4NTc3OTY1IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgwMDc1IGFzaW5oIC0wLjAgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gLTY4OS4xNjYwODk5ODU3Nzk2NSAxLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gcmFuZG9tIGlucHV0cworYXNpbmgwMTAwIGFzaW5oIC0wLjU5NDY0MDI4NTM3MTA0MjMgLTAuMDQ0NTA2NTQ4OTEwMDAwMTQ1IC0+IC0wLjU2NDU5Nzc1MzkyNjUzMDIyIC0wLjAzODI1NjIyMTQ0MTUzNjM1NgorYXNpbmgwMTAxIGFzaW5oIC0wLjE5MzUzOTU4MDQ2MTgwOTE2IC0wLjAxNzQ4OTYyNDc5MzE5MzQ1NCAtPiAtMC4xOTIzNzkyNjgwNDE5NjY1MSAtMC4wMTcxNzE3NDE4OTUzMzY3OTIKK2FzaW5oMDEwMiBhc2luaCAtMC4wMzMxMTc1ODUxMzg5NTU4OTMgLTguNTI1NjQxNDAxNTkzMzc1NyAtPiAtMi44MzI3NzU4MzQ4NjUwOTY5IC0xLjU2Njg4NDg3OTEwOTI0MTEKK2FzaW5oMDEwMyBhc2luaCAtMS41MTg0MDQzMTg0MDM1NzE2IC0wLjczNDkxMjQ1MzM5MDczMjc1IC0+IC0xLjI3MTU4OTE0MTk3NjQwMDUgLTAuMzkyMDQ2MjQ0MDg1NDIzNTUKK2FzaW5oMDEwNCBhc2luaCAtMC42MDcxNjEyMDI3MTIwODgxOCAtMC4yODkwMDc0Mzk1ODQzNjU0MiAtPiAtMC41OTExOTI5OTQyMTE4NzIzMiAtMC4yNDc0NTkzMTY3ODExODEzNQorYXNpbmgwMTA1IGFzaW5oIC0wLjAyMzcxNzc4NjUxMTI0MjkgMi44ODMyNjAxMDUyMTY2MzEzIC0+IC0xLjcyMDU4MjA3NzI0MTMyMzYgMS41NjIwMjYxNzAyOTYzMDk0Cithc2luaDAxMDYgYXNpbmggLTIuMzkwNjgxMjM0Mjc0Mzk3OSAyLjYzNDkyMTY4NDg1NzQwMTMgLT4gLTEuOTYwOTYzNjI0OTQ0NTEyNCAwLjgxNDIxNDI2NjA1NzQ3MDYKK2FzaW5oMDEwNyBhc2luaCAtMC4wMDI3NjA1MDE5Nzg3NjIwNTE3IDE4My44NTU4ODQ3NjU1MDU1NSAtPiAtNS45MDcyOTIwMDA1NDQ1MDY2IDEuNTcwNzgxMzEyMDg0Nzg3MQorYXNpbmgwMTA4IGFzaW5oIC0wLjk5MDgzNjYxMTY0NDA0NzEzIDAuMDI4MDA2Nzk3MDUxNjE3NjQ4IC0+IC0wLjg3NTAxODUyNTEyODM5OTUgMC4wMTk4OTQwOTk2MTU5OTQ2NTMKK2FzaW5oMDEwOSBhc2luaCAtMy4wMzYyOTUxOTM3OTg2MzkzIDAuODYzNzcyNjY3NTg1MDQ4NjcgLT4gLTEuODYzNjAzMDcxNDY4NTIyMSAwLjI2NDc1MDU4ODU5OTUwMTY4Cithc2luaDAxMTAgYXNpbmggMC4zNDQzODQ2NDUzNjE1Mjc2OSAtMC43MTYwMzc5MDE3NDg4NTAyOSAtPiAwLjQzOTg1NDE1NjkwNzM0MTY0IC0wLjcxMDE1MDM3NDA5Mjk0MzI0Cithc2luaDAxMTEgYXNpbmggNC40OTI1MTI0NDEzODc2MjU2IC02MDYwNDU5NTM1Mi44NzE2MTMgLT4gMjUuNTIwNzgzNzM4NjEyMDc4IC0xLjU3MDc5NjMyNjcyMDc2ODMKK2FzaW5oMDExMiBhc2luaCAyLjMyMTM5OTE0MjgxNzAzMzcgLTcuNTQ1OTY2NzAwNzMwNzI1OCAtPiAyLjc1NjA0NjQ5OTM0NTE2NDMgLTEuMjcwMDczMjEwODU2MTE3Cithc2luaDAxMTMgYXNpbmggMC4yMTI5MTkzOTc0MTY4MjAyOCAtMS4yNzIwNDI4ODE0Nzg0NDA4IC0+IDAuNzcyNzUwODgxMzczMzgyNjYgLTEuMzE4MjA5OTI1MDg5Njg5NQorYXNpbmgwMTE0IGFzaW5oIDYuNjQ0NzM1OTM3OTQ1NTk1NyAtMC45NzE5NjE5MTY2Njk0Njk5NiAtPiAyLjYwMjgzMDY5NTEzOTY3MiAtMC4xNDM2ODI0NzQxMjMxOTk2NQorYXNpbmgwMTE1IGFzaW5oIDcuMTMyNjI1NjY1NTA4Mzc0NiAyLjE1MTYzNjA0NTI3MDY4NTcgLT4gMi43MDUxMTQ2Mzc0MzY3MjEyIDAuMjkwNTE3MDE2Njk3Mjc1ODEKK2FzaW5oMDExNiBhc2luaCAwLjE4ODQ2NTUwOTA1MDYzNDQyIDMuNDcwNTM0ODU4NTMzOTgzMiAtPiAxLjkxNzY5Nzg3NTc5OTI5NiAxLjUxNDE1NTU5MzM0NzkyNAorYXNpbmgwMTE3IGFzaW5oIDAuMTkwNjUwNzUzMDMyODE1OTggMC4yNjIxNjgxNDU0ODIyMjAxMiAtPiAwLjE5NjAzMDUwNzg1OTMyNDc0IDAuMjYwMTM0MjI4MDk2MTQxMTcKK2FzaW5oMDExOCBhc2luaCAyLjAyNDIwMDQ2NjU3Mzk3MTkgMC43MDUxMDI4MTY0NzQ5NTc4NyAtPiAxLjQ5NzAzNjYyMTI4OTYwMDIgMC4zMDUyNjAwNzIwMDQ4MTQ1MworYXNpbmgwMTE5IGFzaW5oIDM3LjMzNjU5NjQ2MTU3NjA1NyA3MTcuMjkxNTczOTE2NzgyMzQgLT4gNy4yNjk5ODE5OTc5NDUyOTQgMS41MTg3OTEwMjE5NTc2MDMzCisKKy0tIHZhbHVlcyBuZWFyIGluZmluaXR5Cithc2luaDAyMDAgYXNpbmggMS4wNzYwNTE3NTAwODc0NTQxZSszMDggMS4xNDk3Nzg2MjQxMjQwMTY3ZSszMDggLT4gNzEwLjM0MzQ2MDU1NjUxODE1IDAuODE4NTA5MzY5NjE3OTM0NzUKK2FzaW5oMDIwMSBhc2luaCAxLjE3ODQ4MzkzMjg4NDU1MjllKzMwOCAtMS42NDc4NDI5NTg2NzE2NjM4ZSszMDggLT4gNzEwLjU5NTM2MjU1NzgzNjc4IC0wLjk0OTk2MzExNzM1NjA3Njk3Cithc2luaDAyMDIgYXNpbmggLTQuODc3NzY4MjI0ODkwOTE5M2UrMzA3IDEuNDEwMzczNjIxNzUzODQ3NGUrMzA4IC0+IC03MTAuMjg5NzAxNDczNzY5OTIgMS4yMzc4MjM5NTE5MDk2NDQzCithc2luaDAyMDMgYXNpbmggLTEuMjgzMjQ3ODkwMzIzMzEwOGUrMzA4IC0xLjU3MzIzOTI2MTMxNTU2OThlKzMwOCAtPiAtNzEwLjU5NzUwMTY0MjkwNzQ1IC0wLjg4NjU3MTgxNDM5MzIyNDUyCithc2luaDAyMDQgYXNpbmggMC4wIDYuODQzMTM4Mzg1NjM0NTM3MmUrMzA3IC0+IDcwOS41MTAwMTcxODQ0NDYwNCAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDIwNSBhc2luaCAtMC4wIDguNjAxODIyNDMyMjM4MDUxZSszMDcgLT4gLTcwOS43Mzg3NDQ4MjEyNjY4OSAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDIwNiBhc2luaCAwLjAgLTUuNTY5ODM5NjA2NzMwMzc4MmUrMzA3IC0+IDcwOS4zMDQxMzY5ODczMzc0MiAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAyMDcgYXNpbmggLTAuMCAtNy4xNTA3Nzc3NzM0NjIxODA0ZSszMDcgLT4gLTcwOS41NTM5OTE4NjAwMjcwNSAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAyMDggYXNpbmggMS42MDI1MTM2MTEwMDE5MzQ5ZSszMDggMC4wIC0+IDcxMC4zNjA5MjkyMjYxMDc2IDAuMAorYXNpbmgwMjA5IGFzaW5oIDEuMzkyNzgxOTg1ODIzOTExNGUrMzA4IC0wLjAgLT4gNzEwLjIyMDY1ODk5ODMyODk5IC0wLjAKK2FzaW5oMDIxMCBhc2luaCAtNi4wNDQyOTk0MDU2MjEwOTk1ZSszMDcgMC4wIC0+IC03MDkuMzg1ODg2MzEwNTc2MjEgMC4wCithc2luaDAyMTEgYXNpbmggLTEuMjc3NTI3MTk3OTA0MjYzNGUrMzA4IC0wLjAgLT4gLTcxMC4xMzQyODIxNTU1Mzk3MiAtMC4wCithc2luaDAyMTIgYXNpbmggMS4wNjg3NDk2MjYwMjY4NDg5ZSszMDggMS4wMjU1NjE1Njk5NDc2OTYxIC0+IDcwOS45NTU4NDUyMTQwNzg0MSA5LjU5NTkwMTA4ODI2NzkwOTNlLTMwOQorYXNpbmgwMjEzIGFzaW5oIDEuMDA1MDk2NzMzMzM3MDk2MmUrMzA4IC0wLjg3NjY4OTcwMTE3MzMzNDMzIC0+IDcwOS44OTQ0Mzk2MTE2ODE4MyAtOC43MjI0NDEwNTU2MjQyODgyZS0zMDkKK2FzaW5oMDIxNCBhc2luaCAtNS43MTYxNDUyODE0ODYyMzkyZSszMDcgOC4yMzc3ODA4NDEzNDUwMTIyIC0+IC03MDkuMzMwMDY1NDA2MTExNjYgMS40NDExNDI2NjQ0NTAxMTE2ZS0zMDcKK2FzaW5oMDIxNSBhc2luaCAtOC4yMDA5MDQwNzI3NjUzMzE1ZSszMDcgLTYuNDA3NDA5NTI2NjU0OTc2IC0+IC03MDkuNjkxMDE1MTMwNzAxMDkgLTcuODEzMDUyNjQ2MTUxMDA4OGUtMzA4Cithc2luaDAyMTYgYXNpbmggNi40MjM5MzY4NDk2NDgzOTgyIDEuNjM2NTk5MDgyMTU1MTQyN2UrMzA4IC0+IDcxMC4zODE5NzYxODEwMTI4NyAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMDIxNyBhc2luaCA1LjQ3MjkxMTE0MjMzMTU4ODIgLTEuMTIyNzIzNzQzODE0NDIxMWUrMzA4IC0+IDcxMC4wMDUxMTM0Njk4MzU0NiAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAyMTggYXNpbmggLTguMzQ1NTgxODI5NzQxMjcyMyAxLjQ0MzE3MjAyMDE4MjAxOWUrMzA4IC0+IC03MTAuMjU2MTk5MzA1NTE4MTggMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDAyMTkgYXNpbmggLTIuNjA0OTcyNjIzMDM3MjQ0MSAtMS43OTUyMjkxMTQ0MDIyNzAyZSszMDggLT4gLTcxMC40NzQ0ODg0NzY4NTY0NCAtMS41NzA3OTYzMjY3OTQ4OTY2CisKKy0tIHZhbHVlcyBuZWFyIDAKK2FzaW5oMDIyMCBhc2luaCAxLjI5NDAxMTMzMzk2NjQwODhlLTMxNCA2LjkxNjkxOTA0MTc3NzQ1MTZlLTMyMyAtPiAxLjI5NDAxMTMzMzk2NjQwODhlLTMxNCA2LjkxNjkxOTA0MTc3NzQ1MTZlLTMyMworYXNpbmgwMjIxIGFzaW5oIDIuMzg0ODQ3ODg2Mzg3NDY0OWUtMzE1IC0zLjE5MDc2NTUwMjU3MTc3MTdlLTMxMCAtPiAyLjM4NDg0Nzg4NjM4NzQ2NDllLTMxNSAtMy4xOTA3NjU1MDI1NzE3NzE3ZS0zMTAKK2FzaW5oMDIyMiBhc2luaCAtMy4wMDk3NjQzNjc5NjQxNjIyZS0zMTYgNC42OTM2MjM2MzU0OTE4NDIyZS0zMjIgLT4gLTMuMDA5NzY0MzY3OTY0MTYyMmUtMzE2IDQuNjkzNjIzNjM1NDkxODQyMmUtMzIyCithc2luaDAyMjMgYXNpbmggLTEuNzg3OTk3MDg3NzU1NzUxZS0zMDggLTguNTYxOTYyMjgzNDkwMjM0MWUtMzEwIC0+IC0xLjc4Nzk5NzA4Nzc1NTc1MWUtMzA4IC04LjU2MTk2MjI4MzQ5MDIzNDFlLTMxMAorYXNpbmgwMjI0IGFzaW5oIDAuMCAxLjI0OTE0MzM0NDg0MjczMjVlLTMxNCAtPiAwLjAgMS4yNDkxNDMzNDQ4NDI3MzI1ZS0zMTQKK2FzaW5oMDIyNSBhc2luaCAtMC4wIDIuNTAyNDA3MjE1NDUzODA2MmUtMzA4IC0+IC0wLjAgMi41MDI0MDcyMTU0NTM4MDYyZS0zMDgKK2FzaW5oMDIyNiBhc2luaCAwLjAgLTIuOTY0MzkzODc1MDQ3NDc5M2UtMzIzIC0+IDAuMCAtMi45NjQzOTM4NzUwNDc0NzkzZS0zMjMKK2FzaW5oMDIyNyBhc2luaCAtMC4wIC0yLjkzOTY5MDU5Mjc1NTQxNjllLTMyMCAtPiAtMC4wIC0yLjkzOTY5MDU5Mjc1NTQxNjllLTMyMAorYXNpbmgwMjI4IGFzaW5oIDUuNjQwNDI5MzAwMjkzNTllLTMxNyAwLjAgLT4gNS42NDA0MjkzMDAyOTM1OWUtMzE3IDAuMAorYXNpbmgwMjI5IGFzaW5oIDMuMzgzMzkxMTg2NjU5NjA2OGUtMzE4IC0wLjAgLT4gMy4zODMzOTExODY2NTk2MDY4ZS0zMTggLTAuMAorYXNpbmgwMjMwIGFzaW5oIC00Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNCAwLjAgLT4gLTQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0IDAuMAorYXNpbmgwMjMxIGFzaW5oIC0yLjIyMTEzNzkyMjc5OTQ4NDVlLTMwOCAtMC4wIC0+IC0yLjIyMTEzNzkyMjc5OTQ4NDVlLTMwOCAtMC4wCisKKy0tIHNwZWNpYWwgdmFsdWVzCithc2luaDEwMDAgYXNpbmggMC4wIDAuMCAtPiAwLjAgMC4wCithc2luaDEwMDEgYXNpbmggMC4wIC0wLjAgLT4gMC4wIC0wLjAKK2FzaW5oMTAwMiBhc2luaCAtMC4wIDAuMCAtPiAtMC4wIDAuMAorYXNpbmgxMDAzIGFzaW5oIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKK2FzaW5oMTAwNCBhc2luaCAwLjAgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMTAwNSBhc2luaCAyLjMgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMTAwNiBhc2luaCAwLjAgbmFuIC0+IG5hbiBuYW4KK2FzaW5oMTAwNyBhc2luaCAyLjMgbmFuIC0+IG5hbiBuYW4KK2FzaW5oMTAwOCBhc2luaCBpbmYgMC4wIC0+IGluZiAwLjAKK2FzaW5oMTAwOSBhc2luaCBpbmYgMi4zIC0+IGluZiAwLjAKK2FzaW5oMTAxMCBhc2luaCBpbmYgaW5mIC0+IGluZiAwLjc4NTM5ODE2MzM5NzQ0ODI4Cithc2luaDEwMTEgYXNpbmggaW5mIG5hbiAtPiBpbmYgbmFuCithc2luaDEwMTIgYXNpbmggbmFuIDAuMCAtPiBuYW4gMC4wCithc2luaDEwMTMgYXNpbmggbmFuIDIuMyAtPiBuYW4gbmFuCithc2luaDEwMTQgYXNpbmggbmFuIGluZiAtPiBpbmYgbmFuICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK2FzaW5oMTAxNSBhc2luaCBuYW4gbmFuIC0+IG5hbiBuYW4KK2FzaW5oMTAxNiBhc2luaCAwLjAgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgxMDE3IGFzaW5oIDIuMyAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDEwMTggYXNpbmggaW5mIC0wLjAgLT4gaW5mIC0wLjAKK2FzaW5oMTAxOSBhc2luaCBpbmYgLTIuMyAtPiBpbmYgLTAuMAorYXNpbmgxMDIwIGFzaW5oIGluZiAtaW5mIC0+IGluZiAtMC43ODUzOTgxNjMzOTc0NDgyOAorYXNpbmgxMDIxIGFzaW5oIG5hbiAtMC4wIC0+IG5hbiAtMC4wCithc2luaDEwMjIgYXNpbmggbmFuIC0yLjMgLT4gbmFuIG5hbgorYXNpbmgxMDIzIGFzaW5oIG5hbiAtaW5mIC0+IGluZiBuYW4gICAgICAgICAgICAgICAgICAgICBpZ25vcmUtcmVhbC1zaWduCithc2luaDEwMjQgYXNpbmggLTAuMCAtaW5mIC0+IC1pbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXNpbmgxMDI1IGFzaW5oIC0yLjMgLWluZiAtPiAtaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMTAyNiBhc2luaCAtMC4wIG5hbiAtPiBuYW4gbmFuCithc2luaDEwMjcgYXNpbmggLTIuMyBuYW4gLT4gbmFuIG5hbgorYXNpbmgxMDI4IGFzaW5oIC1pbmYgLTAuMCAtPiAtaW5mIC0wLjAKK2FzaW5oMTAyOSBhc2luaCAtaW5mIC0yLjMgLT4gLWluZiAtMC4wCithc2luaDEwMzAgYXNpbmggLWluZiAtaW5mIC0+IC1pbmYgLTAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2FzaW5oMTAzMSBhc2luaCAtaW5mIG5hbiAtPiAtaW5mIG5hbgorYXNpbmgxMDMyIGFzaW5oIC0wLjAgaW5mIC0+IC1pbmYgMS41NzA3OTYzMjY3OTQ4OTY2Cithc2luaDEwMzMgYXNpbmggLTIuMyBpbmYgLT4gLWluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2FzaW5oMTAzNCBhc2luaCAtaW5mIDAuMCAtPiAtaW5mIDAuMAorYXNpbmgxMDM1IGFzaW5oIC1pbmYgMi4zIC0+IC1pbmYgMC4wCithc2luaDEwMzYgYXNpbmggLWluZiBpbmYgLT4gLWluZiAwLjc4NTM5ODE2MzM5NzQ0ODI4CisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBhdGFuOiBJbnZlcnNlIHRhbmdlbnQgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworYXRhbjAwMDAgYXRhbiAwLjAgMC4wIC0+IDAuMCAwLjAKK2F0YW4wMDAxIGF0YW4gMC4wIC0wLjAgLT4gMC4wIC0wLjAKK2F0YW4wMDAyIGF0YW4gLTAuMCAwLjAgLT4gLTAuMCAwLjAKK2F0YW4wMDAzIGF0YW4gLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiBpbWFnaW5hcnkgYXhpcworYXRhbjAwMTAgYXRhbiAwLjAgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0+IDAuMCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQKK2F0YW4wMDExIGF0YW4gLTAuMCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLT4gLTAuMCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQKK2F0YW4wMDEyIGF0YW4gMC4wIC0xZS0zMDUgLT4gMC4wIC0xZS0zMDUKK2F0YW4wMDEzIGF0YW4gLTAuMCAtMWUtMzA1IC0+IC0wLjAgLTFlLTMwNQorYXRhbjAwMTQgYXRhbiAwLjAgLTFlLTE1MCAtPiAwLjAgLTFlLTE1MAorYXRhbjAwMTUgYXRhbiAtMC4wIC0xZS0xNTAgLT4gLTAuMCAtMWUtMTUwCithdGFuMDAxNiBhdGFuIDAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtPiAwLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2F0YW4wMDE3IGF0YW4gLTAuMCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtPiAtMC4wIC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3CithdGFuMDAxOCBhdGFuIDAuMCAtMC4wMDEgLT4gMC4wIC0wLjAwMTAwMDAwMDMzMzMzMzUzMzMKK2F0YW4wMDE5IGF0YW4gLTAuMCAtMC4wMDEgLT4gLTAuMCAtMC4wMDEwMDAwMDAzMzMzMzM1MzMzCithdGFuMDAyMCBhdGFuIDAuMCAtMC41Nzg5OTk5OTk5OTk5OTk5NiAtPiAwLjAgLTAuNjYwOTU3MDkwMjg2NjMwMworYXRhbjAwMjEgYXRhbiAtMC4wIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0+IC0wLjAgLTAuNjYwOTU3MDkwMjg2NjMwMworYXRhbjAwMjIgYXRhbiAwLjAgLTAuOTk5OTk5OTk5OTk5OTk5ODkgLT4gMC4wIC0xOC43MTQ5NzM4NzUxMTg1MjQKK2F0YW4wMDIzIGF0YW4gLTAuMCAtMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAtMC4wIC0xOC43MTQ5NzM4NzUxMTg1MjQKK2F0YW4wMDI0IGF0YW4gMC4wIC0xLjAwMDAwMDAwMDAwMDAwMDIgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0xOC4zNjg0MDAyODQ4Mzg1NQorYXRhbjAwMjUgYXRhbiAtMC4wIC0xLjAwMDAwMDAwMDAwMDAwMDIgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMTguMzY4NDAwMjg0ODM4NTUKK2F0YW4wMDI2IGF0YW4gMC4wIC0xLjAwMDk5OTk5OTk5OTk5OTkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0zLjgwMDcwMTE2NzI5MTkyMTgKK2F0YW4wMDI3IGF0YW4gLTAuMCAtMS4wMDA5OTk5OTk5OTk5OTk5IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTMuODAwNzAxMTY3MjkxOTIxOAorYXRhbjAwMjggYXRhbiAwLjAgLTIuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuNTQ5MzA2MTQ0MzM0MDU0ODkKK2F0YW4wMDI5IGF0YW4gLTAuMCAtMi4wIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuNTQ5MzA2MTQ0MzM0MDU0ODkKK2F0YW4wMDMwIGF0YW4gMC4wIC0yMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wNTAwNDE3MjkyNzg0OTEyNjUKK2F0YW4wMDMxIGF0YW4gLTAuMCAtMjAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjA1MDA0MTcyOTI3ODQ5MTI2NQorYXRhbjAwMzIgYXRhbiAwLjAgLTEwMDAwMDAwMDAwMDAwMDAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3CithdGFuMDAzMyBhdGFuIC0wLjAgLTEwMDAwMDAwMDAwMDAwMDAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXRhbjAwMzQgYXRhbiAwLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMWUtMTUwCithdGFuMDAzNSBhdGFuIC0wLjAgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTFlLTE1MAorYXRhbjAwMzYgYXRhbiAwLjAgLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtOS45OTk5OTk5OTk5OTk5OTk5ZS0zMDAKK2F0YW4wMDM3IGF0YW4gLTAuMCAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtOS45OTk5OTk5OTk5OTk5OTk5ZS0zMDAKK2F0YW4wMDM4IGF0YW4gMC4wIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0+IDAuMCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorYXRhbjAwMzkgYXRhbiAtMC4wIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0+IC0wLjAgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQKK2F0YW4wMDQwIGF0YW4gMC4wIDFlLTMwNSAtPiAwLjAgMWUtMzA1CithdGFuMDA0MSBhdGFuIC0wLjAgMWUtMzA1IC0+IC0wLjAgMWUtMzA1CithdGFuMDA0MiBhdGFuIDAuMCAxZS0xNTAgLT4gMC4wIDFlLTE1MAorYXRhbjAwNDMgYXRhbiAtMC4wIDFlLTE1MCAtPiAtMC4wIDFlLTE1MAorYXRhbjAwNDQgYXRhbiAwLjAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtPiAwLjAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNworYXRhbjAwNDUgYXRhbiAtMC4wIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLT4gLTAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3CithdGFuMDA0NiBhdGFuIDAuMCAwLjAwMSAtPiAwLjAgMC4wMDEwMDAwMDAzMzMzMzM1MzMzCithdGFuMDA0NyBhdGFuIC0wLjAgMC4wMDEgLT4gLTAuMCAwLjAwMTAwMDAwMDMzMzMzMzUzMzMKK2F0YW4wMDQ4IGF0YW4gMC4wIDAuNTc4OTk5OTk5OTk5OTk5OTYgLT4gMC4wIDAuNjYwOTU3MDkwMjg2NjMwMworYXRhbjAwNDkgYXRhbiAtMC4wIDAuNTc4OTk5OTk5OTk5OTk5OTYgLT4gLTAuMCAwLjY2MDk1NzA5MDI4NjYzMDMKK2F0YW4wMDUwIGF0YW4gMC4wIDAuOTk5OTk5OTk5OTk5OTk5ODkgLT4gMC4wIDE4LjcxNDk3Mzg3NTExODUyNAorYXRhbjAwNTEgYXRhbiAtMC4wIDAuOTk5OTk5OTk5OTk5OTk5ODkgLT4gLTAuMCAxOC43MTQ5NzM4NzUxMTg1MjQKK2F0YW4wMDUyIGF0YW4gMC4wIDEuMDAwMDAwMDAwMDAwMDAwMiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMTguMzY4NDAwMjg0ODM4NTUKK2F0YW4wMDUzIGF0YW4gLTAuMCAxLjAwMDAwMDAwMDAwMDAwMDIgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAxOC4zNjg0MDAyODQ4Mzg1NQorYXRhbjAwNTQgYXRhbiAwLjAgMS4wMDA5OTk5OTk5OTk5OTk5IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAzLjgwMDcwMTE2NzI5MTkyMTgKK2F0YW4wMDU1IGF0YW4gLTAuMCAxLjAwMDk5OTk5OTk5OTk5OTkgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAzLjgwMDcwMTE2NzI5MTkyMTgKK2F0YW4wMDU2IGF0YW4gMC4wIDIuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC41NDkzMDYxNDQzMzQwNTQ4OQorYXRhbjAwNTcgYXRhbiAtMC4wIDIuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuNTQ5MzA2MTQ0MzM0MDU0ODkKK2F0YW4wMDU4IGF0YW4gMC4wIDIwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMDUwMDQxNzI5Mjc4NDkxMjY1CithdGFuMDA1OSBhdGFuIC0wLjAgMjAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMDUwMDQxNzI5Mjc4NDkxMjY1CithdGFuMDA2MCBhdGFuIDAuMCAxMDAwMDAwMDAwMDAwMDAwMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3CithdGFuMDA2MSBhdGFuIC0wLjAgMTAwMDAwMDAwMDAwMDAwMDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcKK2F0YW4wMDYyIGF0YW4gMC4wIDkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAxZS0xNTAKK2F0YW4wMDYzIGF0YW4gLTAuMCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDFlLTE1MAorYXRhbjAwNjQgYXRhbiAwLjAgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDkuOTk5OTk5OTk5OTk5OTk5OWUtMzAwCithdGFuMDA2NSBhdGFuIC0wLjAgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiA5Ljk5OTk5OTk5OTk5OTk5OTllLTMwMAorCistLSByYW5kb20gaW5wdXRzCithdGFuMDEwMCBhdGFuIC0wLjMyNTM4ODczNjYxMDYwMjE0IC0xLjU1MzA0NjE1NTA0MTI1NzggLT4gLTEuMzY4MjcyODQyNzU1NDIyNyAtMC42OTQ1MTQwMTU5ODc2MjA0MQorYXRhbjAxMDEgYXRhbiAtMC40NTg2MzM5MzQ5NTE5NzkyOSAtNDc5OS4xNzQ3MDk0OTAzNTk0IC0+IC0xLjU3MDc5NjMwNjg4MjA2MjMgLTAuMDAwMjA4MzY5MTYwNTA2MzYxNDUKK2F0YW4wMTAyIGF0YW4gLTguMzAwNjk5OTY4NTk3NjE2MiAtMi42Nzg4ODkwMjUxNzkwOTM4IC0+IC0xLjQ2MTk4NjI3NzE4MTAxOTkgLTAuMDM0ODExNjY5NjUzMzI3ODI2CithdGFuMDEwMyBhdGFuIC0xLjg4MzYzMDc2ODI5ODUzMTQgLTEuMTQ0MTk3NjYzODg2MTc3MSAtPiAtMS4xODM5OTg0MzcwODcxNjEyIC0wLjIwNjMwOTU2MTU3MzEyNzk2CithdGFuMDEwNCBhdGFuIC0wLjAwMDYzMjMwNDgyNDA3NDkxNjY5IC00LjkzMTI1MjA5NjE4Mjk0ODUgLT4gLTEuNTcwNzY5MjA5MzIyMzE0NyAtMC4yMDU2Mzg2Nzc0MzAwODMwNAorYXRhbjAxMDUgYXRhbiAtMC44NDI3ODEzNzE1MDA2NTk0NiAxNzkwMTIuMzc0OTMxNDY5OTcgLT4gLTEuNTcwNzk2MzI2NzY4NTk2OSA1LjU4NjIwNTk4MzY0MjUyNzJlLTA2CithdGFuMDEwNiBhdGFuIC0wLjk1NDg3ODUzOTg0MDQ5Mjg3IDE0LjMxMTMzNDUzOTg4NjE3NyAtPiAtMS41NjYxMzIyODU5NDM0NTYxIDAuMDY5Njc2MDI0NTI2MjMyMDA1CithdGFuMDEwNyBhdGFuIC0xLjM1MTMyNTI1Mzk2NjMyMzkgNi4wNTAwNzI3MDIxNjMyMTk4ZS0wOCAtPiAtMC45MzM3MTY3NjMxNTIyMDk3NSAyLjE0MDgwMDI2OTc0MjY1NmUtMDgKK2F0YW4wMTA4IGF0YW4gLTAuMjA1NjYyNTQ0NTg1OTU3OTUgMC4xMTkzMzc3MTk0NDE1OTgyMyAtPiAtMC4yMDU1NjQ2MzcxMTE3NDkxNiAwLjExNDkzNDA1Mzg3MTQxNzMyCithdGFuMDEwOSBhdGFuIC0wLjU4NTYzNzE4Nzk1NDA4NTU5IDAuNjQ0Mzg5NjU0MjMyMTI4NjggLT4gLTAuNjgzNjEwODkzMDAyMzMxMjQgMC40Njc1OTc2Mjc1MTgwMDI0OQorYXRhbjAxMTAgYXRhbiA0OC40NzkyNjc3NTE5NDgyOTIgLTc4LjM4NjM4MjQ2MDExMjU0MyAtPiAxLjU2NTA4ODg3NzA5MTA1MjMgLTAuMDA5MjI3NjgxMTM3MzI5NzU4NAorYXRhbjAxMTEgYXRhbiAxLjA1NzUzNzM5MTQwNTYwNjEgLTAuNzU5ODgwMTIzNzcyOTY5ODcgLT4gMC45NDQzMDg4NjcyMjA0MzU5NCAtMC4zMTkxNTY5ODEyNjcwMzExOAorYXRhbjAxMTIgYXRhbiA0NDQ0ODEwLjQzMTQ2NzcyMDMgLTAuNTY1NTM0MDQ1OTM5NDI1NTggLT4gMS41NzA3OTYxMDE4MTM0MjMxIC0yLjg2MjU0NDY0Mzc3MDE5MDllLTE0CithdGFuMDExMyBhdGFuIDAuMDEwMTAxNDA1MDgyNTIwMDA5IC0wLjAzMjkzMjY2ODU1MDI4MjQ3OCAtPiAwLjAxMDExMjAyNjc2NjQ2MzM0IC0wLjAzMjk0MTIxNDc3NjgzNDk5NgorYXRhbjAxMTQgYXRhbiAxLjUzNTM1ODUzMDAxNTQ5MTEgLTIuMTk0NzA5OTM0Njc5NjUxOSAtPiAxLjM0MDAzMTA3MzkyMDYzOTQgLTAuMjk5OTYwMDM2MDc0NDkwNDUKK2F0YW4wMTE1IGF0YW4gMC4yMTg2OTQ1NzA1NTY3MDg4MiA5Ljk5MTU2ODQyNTQwMDcwOTMgLT4gMS41Njg1ODQ2MDc4ODc2NDQ0IDAuMTAwMzcxNjg4MTc1OTQzOQorYXRhbjAxMTYgYXRhbiAwLjE3NzgzMjkwMTUwMjQ2ODM2IDAuMDY0MzM0Njg5ODYzNjUwOTU3IC0+IDAuMTc2Njg3MjgwNjQyODYyNzcgMC4wNjI0MzU4MDg3Mjg4NzM4NDYKK2F0YW4wMTE3IGF0YW4gMTUuNzU3NDc0MDg3NjE1OTE4IDM4My41NzI2MjE0MjUzNCAtPiAxLjU3MDY4OTQwNjAzNjk2MjEgMC4wMDI2MDI2ODE3Mjc4ODI2NjAzCithdGFuMDExOCBhdGFuIDEwLjU4NzAxNzQwODUzMzMxNyAwLjIxNzIwMjM4MDgxODQzNDM4IC0+IDEuNDc2NjU5NDY4MTMzNjIzNiAwLjAwMTkxOTkwOTczODMwMTAwNjEKK2F0YW4wMTE5IGF0YW4gMC44NjAyNjA3ODY3ODc4MTIwNCAwLjEyMzAxNDg2MDkzNTk1MDIgLT4gMC43MTQ3MjU5MzIyNTM0OTI5IDAuMDcwNTUxMjIxOTU0Mjg2NjA1CisKKy0tIHZhbHVlcyBuZWFyIGluZmluaXR5CithdGFuMDIwMCBhdGFuIDcuODc2NDM5NzAxMTE5NTc5OGUrMzA3IDguMTY0NzkyMTEzNzc0NjMwOGUrMzA3IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA2LjM0Mzk0NDY5Mzk2MDQ0OTNlLTMwOQorYXRhbjAyMDEgYXRhbiAxLjU4NzM2OTg2OTYxMzE0ODdlKzMwOCAtMS4wNzgwMzY3NDIyOTYwNjQxZSszMDggLT4gMS41NzA3OTYzMjY3OTQ4OTY2IC0yLjkyNzkzMDkzNjg1MzA3ODFlLTMwOQorYXRhbjAyMDIgYXRhbiAtMS41ODQ0NTUxODY0ODI1ODM0ZSszMDggMS4wMjkwNjU3ODA5MDk4Njc1ZSszMDggLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAyLjg4Mjk2MTQ3MzY5NjE0MTdlLTMwOQorYXRhbjAyMDMgYXRhbiAtMS4zMTY4NzkyNTYyNTI0MDMyZSszMDggLTkuMDg4NDMyMzQxNjE0ODI1ZSszMDcgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMy41NDk5MzczMDU3MzkwMDU2ZS0zMDkKK2F0YW4wMjA0IGF0YW4gMC4wIDEuMDM2MDQ2NTc0MjI1ODMzN2UrMzA4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiA5LjY1MjA3NTczNTU2NDYwMThlLTMwOQorYXRhbjAyMDUgYXRhbiAtMC4wIDEuMDA0NTA2MzIxMDM3MzE5NmUrMzA4IC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgOS45NTUxMzg5NDc5Mjk1MDNlLTMwOQorYXRhbjAyMDYgYXRhbiAwLjAgLTkuNTE1NTI5NjcxNTc2MzY5NmUrMzA3IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMS4wNTA5MTM2NDgwMjAxMThlLTMwOAorYXRhbjAyMDcgYXRhbiAtMC4wIC0xLjU1NjU3MDA0OTA0OTY1MDFlKzMwOCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC02LjQyNDM4MTYxMTQxODkwNzFlLTMwOQorYXRhbjAyMDggYXRhbiAxLjI5NTYzMzkzODk1MjUyNDRlKzMwOCAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjAyMDkgYXRhbiAxLjQ0MDgxMjYyNDM3NzIxNTFlKzMwOCAtMC4wIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMDIxMCBhdGFuIC0xLjA2MzE3ODY0NjE5MzY0MTdlKzMwOCAwLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4wMjExIGF0YW4gLTEuMDUxNjA1Njk2NDE3MTA2OWUrMzA4IC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMDIxMiBhdGFuIDEuMjM2MTYyMzE5NjAzODM4ZSszMDggNC42ODI3OTUzNDk2MjQyOTM2IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4wMjEzIGF0YW4gNy4wMDA1MTY0NzI4OTcyMThlKzMwNyAtNS44NjMxNjA4MDE3ODQ0MTYzIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMDIxNCBhdGFuIC0xLjUwNTM0NDQwMDMzMzg1MDhlKzMwOCA1LjExOTkxOTcyNjg0MjAzMTMgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4wMjE1IGF0YW4gLTEuMzk5MTcyNTE4MTQ3MjU5ZSszMDggLTMuNTY4Nzc2NjQ3MjkxMzY3MyAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4wMjE2IGF0YW4gOC4xMjUyODMzMDcwODAzMDIxIDYuMjc4Mjk1MzkxNzM0MzgyMmUrMzA3IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAxLjU5Mjc4OTAyNTY5MDg1NjRlLTMwOAorYXRhbjAyMTcgYXRhbiAyLjgwMzQyODU5NDc1MTUxNjcgLTEuMzM3ODA0OTc3NTc1Mzg3OGUrMzA4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtNy40NzQ5MzEwNzU2MjE5NTYyZS0zMDkKK2F0YW4wMjE4IGF0YW4gLTEuNDA3MzUwOTk4ODk3NDk1MyAxLjY3NzYzODE3ODU5NjgzNTVlKzMwOCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDUuOTYwNzYwODY0NjM2NDU2OWUtMzA5CithdGFuMDIxOSBhdGFuIC0yLjcxMzU1NTE1Mjc1OTIxMTkgLTEuMjgxNTY3NDQ1NTI1NzM4ZSszMDggLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtNy44MDI5NDQ3NzI3NTY1MzI2ZS0zMDkKKworLS0gaW1hZ2luYXJ5IHBhcnQgPSArLy0xLCByZWFsIHBhcnQgdGlueQorYXRhbjAzMDAgYXRhbiAtMWUtMTUwIC0xLjAgLT4gLTAuNzg1Mzk4MTYzMzk3NDQ4MjggLTE3My4wNDA0NTU1NjQ4MzMzOQorYXRhbjAzMDEgYXRhbiAxZS0xNTUgMS4wIC0+IDAuNzg1Mzk4MTYzMzk3NDQ4MjggMTc4Ljc5NjkxODI5NzMxODUxCithdGFuMDMwMiBhdGFuIDkuOTk5OTk5OTk5OTk5OTk5OWUtMTYxIC0xLjAgLT4gMC43ODUzOTgxNjMzOTc0NDgyOCAtMTg0LjU1MzM4MTAyOTgwMzYzCithdGFuMDMwMyBhdGFuIC0xZS0xNjUgMS4wIC0+IC0wLjc4NTM5ODE2MzM5NzQ0ODI4IDE5MC4zMDk4NDM3NjIyODg3NQorYXRhbjAzMDQgYXRhbiAtOS45OTk4ODg2NzE4MjY4MzAxZS0zMjEgLTEuMCAtPiAtMC43ODUzOTgxNjMzOTc0NDgyOCAtMzY4Ljc2MDE5NDAzNTc2NjkyCisKKy0tIHNwZWNpYWwgdmFsdWVzCithdGFuMTAwMCBhdGFuIC0wLjAgMC4wIC0+IC0wLjAgMC4wCithdGFuMTAwMSBhdGFuIG5hbiAwLjAgLT4gbmFuIDAuMAorYXRhbjEwMDIgYXRhbiAtMC4wIDEuMCAtPiAtMC4wIGluZiBkaXZpZGUtYnktemVybworYXRhbjEwMDMgYXRhbiAtaW5mIDAuMCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMDQgYXRhbiAtaW5mIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMDUgYXRhbiBuYW4gMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4KK2F0YW4xMDA2IGF0YW4gLTAuMCBpbmYgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4xMDA3IGF0YW4gLTIuMjk5OTk5OTk5OTk5OTk5OCBpbmYgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4xMDA4IGF0YW4gLWluZiBpbmYgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4xMDA5IGF0YW4gbmFuIGluZiAtPiBuYW4gMC4wCithdGFuMTAxMCBhdGFuIC0wLjAgbmFuIC0+IG5hbiBuYW4KK2F0YW4xMDExIGF0YW4gLTIuMjk5OTk5OTk5OTk5OTk5OCBuYW4gLT4gbmFuIG5hbgorYXRhbjEwMTIgYXRhbiAtaW5mIG5hbiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IDAuMCBpZ25vcmUtaW1hZy1zaWduCithdGFuMTAxMyBhdGFuIG5hbiBuYW4gLT4gbmFuIG5hbgorYXRhbjEwMTQgYXRhbiAwLjAgMC4wIC0+IDAuMCAwLjAKK2F0YW4xMDE1IGF0YW4gMC4wIDEuMCAtPiAwLjAgaW5mIGRpdmlkZS1ieS16ZXJvCithdGFuMTAxNiBhdGFuIGluZiAwLjAgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMTcgYXRhbiBpbmYgMi4yOTk5OTk5OTk5OTk5OTk4IC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4xMDE4IGF0YW4gMC4wIGluZiAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgMC4wCithdGFuMTAxOSBhdGFuIDIuMjk5OTk5OTk5OTk5OTk5OCBpbmYgLT4gMS41NzA3OTYzMjY3OTQ4OTY2IDAuMAorYXRhbjEwMjAgYXRhbiBpbmYgaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAKK2F0YW4xMDIxIGF0YW4gMC4wIG5hbiAtPiBuYW4gbmFuCithdGFuMTAyMiBhdGFuIDIuMjk5OTk5OTk5OTk5OTk5OCBuYW4gLT4gbmFuIG5hbgorYXRhbjEwMjMgYXRhbiBpbmYgbmFuIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAwLjAgaWdub3JlLWltYWctc2lnbgorYXRhbjEwMjQgYXRhbiAwLjAgLTAuMCAtPiAwLjAgLTAuMAorYXRhbjEwMjUgYXRhbiBuYW4gLTAuMCAtPiBuYW4gLTAuMAorYXRhbjEwMjYgYXRhbiAwLjAgLTEuMCAtPiAwLjAgLWluZiBkaXZpZGUtYnktemVybworYXRhbjEwMjcgYXRhbiBpbmYgLTAuMCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYXRhbjEwMjggYXRhbiBpbmYgLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiAxLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYXRhbjEwMjkgYXRhbiBuYW4gLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuCithdGFuMTAzMCBhdGFuIDAuMCAtaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTAzMSBhdGFuIDIuMjk5OTk5OTk5OTk5OTk5OCAtaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTAzMiBhdGFuIGluZiAtaW5mIC0+IDEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTAzMyBhdGFuIG5hbiAtaW5mIC0+IG5hbiAtMC4wCithdGFuMTAzNCBhdGFuIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKK2F0YW4xMDM1IGF0YW4gLTAuMCAtMS4wIC0+IC0wLjAgLWluZiBkaXZpZGUtYnktemVybworYXRhbjEwMzYgYXRhbiAtaW5mIC0wLjAgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTAzNyBhdGFuIC1pbmYgLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKK2F0YW4xMDM4IGF0YW4gLTAuMCAtaW5mIC0+IC0xLjU3MDc5NjMyNjc5NDg5NjYgLTAuMAorYXRhbjEwMzkgYXRhbiAtMi4yOTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gLTEuNTcwNzk2MzI2Nzk0ODk2NiAtMC4wCithdGFuMTA0MCBhdGFuIC1pbmYgLWluZiAtPiAtMS41NzA3OTYzMjY3OTQ4OTY2IC0wLjAKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGF0YW5oOiBJbnZlcnNlIGh5cGVyYm9saWMgdGFuZ2VudCAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHplcm9zCithdGFuaDAwMDAgYXRhbmggMC4wIDAuMCAtPiAwLjAgMC4wCithdGFuaDAwMDEgYXRhbmggMC4wIC0wLjAgLT4gMC4wIC0wLjAKK2F0YW5oMDAwMiBhdGFuaCAtMC4wIDAuMCAtPiAtMC4wIDAuMAorYXRhbmgwMDAzIGF0YW5oIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKKworLS0gdmFsdWVzIGFsb25nIGJvdGggc2lkZXMgb2YgcmVhbCBheGlzCithdGFuaDAwMTAgYXRhbmggLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wCithdGFuaDAwMTEgYXRhbmggLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAKK2F0YW5oMDAxMiBhdGFuaCAtMWUtMzA1IDAuMCAtPiAtMWUtMzA1IDAuMAorYXRhbmgwMDEzIGF0YW5oIC0xZS0zMDUgLTAuMCAtPiAtMWUtMzA1IC0wLjAKK2F0YW5oMDAxNCBhdGFuaCAtMWUtMTUwIDAuMCAtPiAtMWUtMTUwIDAuMAorYXRhbmgwMDE1IGF0YW5oIC0xZS0xNTAgLTAuMCAtPiAtMWUtMTUwIC0wLjAKK2F0YW5oMDAxNiBhdGFuaCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wCithdGFuaDAwMTcgYXRhbmggLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wCithdGFuaDAwMTggYXRhbmggLTAuMDAxIDAuMCAtPiAtMC4wMDEwMDAwMDAzMzMzMzM1MzMzIDAuMAorYXRhbmgwMDE5IGF0YW5oIC0wLjAwMSAtMC4wIC0+IC0wLjAwMTAwMDAwMDMzMzMzMzUzMzMgLTAuMAorYXRhbmgwMDIwIGF0YW5oIC0wLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAtMC42NjA5NTcwOTAyODY2MzAzIDAuMAorYXRhbmgwMDIxIGF0YW5oIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gLTAuNjYwOTU3MDkwMjg2NjMwMyAtMC4wCithdGFuaDAwMjIgYXRhbmggLTAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IC0xOC43MTQ5NzM4NzUxMTg1MjQgMC4wCithdGFuaDAwMjMgYXRhbmggLTAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAtMTguNzE0OTczODc1MTE4NTI0IC0wLjAKK2F0YW5oMDAyNCBhdGFuaCAtMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAtMTguMzY4NDAwMjg0ODM4NTUgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMjUgYXRhbmggLTEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IC0xOC4zNjg0MDAyODQ4Mzg1NSAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMjYgYXRhbmggLTEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gLTMuODAwNzAxMTY3MjkxOTIxOCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAyNyBhdGFuaCAtMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gLTMuODAwNzAxMTY3MjkxOTIxOCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMjggYXRhbmggLTIuMCAwLjAgLT4gLTAuNTQ5MzA2MTQ0MzM0MDU0ODkgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMjkgYXRhbmggLTIuMCAtMC4wIC0+IC0wLjU0OTMwNjE0NDMzNDA1NDg5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAzMCBhdGFuaCAtMjMuMCAwLjAgLT4gLTAuMDQzNTA1Njg4NDk0ODE0ODg0IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDMxIGF0YW5oIC0yMy4wIC0wLjAgLT4gLTAuMDQzNTA1Njg4NDk0ODE0ODg0IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDAzMiBhdGFuaCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMzMgYXRhbmggLTEwMDAwMDAwMDAwMDAwMDAwLjAgLTAuMCAtPiAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMzQgYXRhbmggLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IDAuMCAtPiAtMWUtMTUwIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDM1IGF0YW5oIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IC0xZS0xNTAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDM2IGF0YW5oIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OWUtMzAwIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDM3IGF0YW5oIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTllLTMwMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwMzggYXRhbmggOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMAorYXRhbmgwMDM5IGF0YW5oIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMAorYXRhbmgwMDQwIGF0YW5oIDFlLTMwNSAwLjAgLT4gMWUtMzA1IDAuMAorYXRhbmgwMDQxIGF0YW5oIDFlLTMwNSAtMC4wIC0+IDFlLTMwNSAtMC4wCithdGFuaDAwNDIgYXRhbmggMWUtMTUwIDAuMCAtPiAxZS0xNTAgMC4wCithdGFuaDAwNDMgYXRhbmggMWUtMTUwIC0wLjAgLT4gMWUtMTUwIC0wLjAKK2F0YW5oMDA0NCBhdGFuaCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IDAuMAorYXRhbmgwMDQ1IGF0YW5oIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAKK2F0YW5oMDA0NiBhdGFuaCAwLjAwMSAwLjAgLT4gMC4wMDEwMDAwMDAzMzMzMzM1MzMzIDAuMAorYXRhbmgwMDQ3IGF0YW5oIDAuMDAxIC0wLjAgLT4gMC4wMDEwMDAwMDAzMzMzMzM1MzMzIC0wLjAKK2F0YW5oMDA0OCBhdGFuaCAwLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAwLjY2MDk1NzA5MDI4NjYzMDMgMC4wCithdGFuaDAwNDkgYXRhbmggMC41Nzg5OTk5OTk5OTk5OTk5NiAtMC4wIC0+IDAuNjYwOTU3MDkwMjg2NjMwMyAtMC4wCithdGFuaDAwNTAgYXRhbmggMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gMTguNzE0OTczODc1MTE4NTI0IDAuMAorYXRhbmgwMDUxIGF0YW5oIDAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAxOC43MTQ5NzM4NzUxMTg1MjQgLTAuMAorYXRhbmgwMDUyIGF0YW5oIDEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gMTguMzY4NDAwMjg0ODM4NTUgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNTMgYXRhbmggMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gMTguMzY4NDAwMjg0ODM4NTUgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDU0IGF0YW5oIDEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gMy44MDA3MDExNjcyOTE5MjE4IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDU1IGF0YW5oIDEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDMuODAwNzAxMTY3MjkxOTIxOCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNTYgYXRhbmggMi4wIDAuMCAtPiAwLjU0OTMwNjE0NDMzNDA1NDg5IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDU3IGF0YW5oIDIuMCAtMC4wIC0+IDAuNTQ5MzA2MTQ0MzM0MDU0ODkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDU4IGF0YW5oIDIzLjAgMC4wIC0+IDAuMDQzNTA1Njg4NDk0ODE0ODg0IDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDU5IGF0YW5oIDIzLjAgLTAuMCAtPiAwLjA0MzUwNTY4ODQ5NDgxNDg4NCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNjAgYXRhbmggMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDA2MSBhdGFuaCAxMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNjIgYXRhbmggOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDFlLTE1MCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDA2MyBhdGFuaCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDFlLTE1MCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAwNjQgYXRhbmggMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDkuOTk5OTk5OTk5OTk5OTk5OWUtMzAwIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMDY1IGF0YW5oIDEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gOS45OTk5OTk5OTk5OTk5OTk5ZS0zMDAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorCistLSByYW5kb20gaW5wdXRzCithdGFuaDAxMDAgYXRhbmggLTAuNTQ0NjA5MjU5ODA2MzM1MDEgLTAuNTQwMzgwNTAxMjY3MjEwMjcgLT4gLTAuNDE5ODQyNjU4MDg0NDY5NzQgLTAuNjAzNTQxNTM5MzgzNTI4MjgKK2F0YW5oMDEwMSBhdGFuaCAtMS42OTM0NjE0MjY5ODI5MDUxIC0wLjQ4ODA3Mzg2MTA4MTEzNjIxIC0+IC0wLjU4NTkyNzY5MTAyMjQzMjgxIC0xLjM1Mzc4Mzc0NzA5NzU4OTgKK2F0YW5oMDEwMiBhdGFuaCAtMS4zNDY3MjkzOTg1NTAxMjA3IC0wLjQ3ODY4MzU0ODk1Mzk1ODc2IC0+IC0wLjY5OTYxNjI0MzcwNzA5OTg1IC0xLjE5OTQ0NTAxNTY1NzAwNzYKK2F0YW5oMDEwMyBhdGFuaCAtNS42MTQyMjMyNDE4OTg0ODg4IC01NDQ1NTE2MTMuMzkzMDc3MDIgLT4gLTEuODkzMjY1NzU1MDkyNTc0NGUtMTcgLTEuNTcwNzk2MzI0OTU4NTIzNQorYXRhbmgwMTA0IGF0YW5oIC0wLjAxMTg0MTQ2MDM4MTI2MzY1MSAtMy4yNTk5Nzg4OTk4MjMzODUgLT4gLTAuMDAxMDE4MzkzNjU0NzQwNTE4OCAtMS4yNzMxNjE0MDIwNzQzODM4CithdGFuaDAxMDUgYXRhbmggLTAuMDA3MzM0NTczNjk1MDAyOTUzMiAwLjM1ODIxOTQ5NjcwOTIyMjQ4IC0+IC0wLjAwNjUwMDQ4NjkwMjQ2ODI0NjYgMC4zNDM5OTM1OTk3MTkyMDg5NQorYXRhbmgwMTA2IGF0YW5oIC0xMy44NjY3ODIyNDQzMjAwMTQgMC45NTQxMTI5NTQ1ODYwMjczIC0+IC0wLjA3MTg5Njg1MjA1NTA1ODg5OSAxLjU2NTgzMjI3MDQ2MzE0MDkKK2F0YW5oMDEwNyBhdGFuaCAtNzA4LjU5OTY0OTgyNzgwNzc1IDIxLjk4NDgwMjE1OTI2NjY3NSAtPiAtMC4wMDE0MDk4Nzc5MDc0MTg5NzQxIDEuNTcwNzUyNTg0MjgzODk1OQorYXRhbmgwMTA4IGF0YW5oIC0zMC45MTY4MzIwNzYwMzA2MDIgMS4zNjkxODk3MTM4ODI5ODQzIC0+IC0wLjAzMjI5MjY4MjA0NTc0MzY3NiAxLjU2OTM2NTIwOTQ4NDcxMTUKK2F0YW5oMDEwOSBhdGFuaCAtMC41NzQ2MTgwNjMzOTg2MTc1NCAwLjI5NTM0Nzk3NDQzOTEzMDYzIC0+IC0wLjU2NDY3NDY0NDcyNDgyNzY1IDAuMzk2MTU2MTI4MjQxNzI2MjUKK2F0YW5oMDExMCBhdGFuaCAwLjQwMDg5MjQ2NzM3NDE1Njg1IC0xLjYzMjI4NTk4NDMwMDY1OSAtPiAwLjEwNjM4MzI3MDc4OTA2MDggLTEuMDQwMjgyMTMzNTMyNjQ4MgorYXRhbmgwMTExIGF0YW5oIDIxMTkuNjE2NzY4ODI2MjE3NiAtMS41MzgzNjUzNDM3Mzc3MjQyZSsxNyAtPiA4Ljk1NjUwMDg1MTgzODIwNDllLTMyIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDExMiBhdGFuaCA3NTYuODYwMTc4NTA5NDE2NDEgLTYuNjA2NDA4NzEzMzIyMzgxNyAtPiAwLjAwMTMyMTE0ODExMzY4MjAwNDYgLTEuNTcwNzg0Nzk0ODcwMjIzNAorYXRhbmgwMTEzIGF0YW5oIDQuMDQ5MDYxNzcxODA0MTYwMiAtMi41Nzg0NDU2NzkxMDQwNjUyZS0xMiAtPiAwLjI1MjE4NDI1NTM4NTUzNjE4IC0xLjU3MDc5NjMyNjc5NDcyOTEKK2F0YW5oMDExNCBhdGFuaCAxMC41ODkyNTQ5NTcxNzM1MjMgLTAuMTM5NTYzOTExNDk2MjQ1MDkgLT4gMC4wOTQ3MDA4OTAyODIxOTc2NjQgLTEuNTY5NTQwNzE0MDIxNzYyMworYXRhbmgwMTE1IGF0YW5oIDEuMDE3MTE4NzU1MzE2MDQ5OSAwLjcwNzY2MTEzNDY1MzU0MDE5IC0+IDAuNTUyNjAyNTE5NzUzNjc3OTEgMC45NjYxOTcxMTExNjY0MTY4MgorYXRhbmgwMTE2IGF0YW5oIDAuMDMxNjQ1NTAyNTI3NzUwODQ5IDAuMDY3MzE5OTgzNzI2NTQ0Mzk0IC0+IDAuMDMxNTEzMDE4MzQ0MDg2NzQyIDAuMDY3Mjg1NDM3NjcwNTQ5MDM2CithdGFuaDAxMTcgYXRhbmggMC4xMzY3MDE3NzYyNDk5NDUxNyAwLjQzMjQwMDg5MzYxODU3OTQ3IC0+IDAuMTE1Mzg5MzMxNTEwMTcyNTMgMC40MTM5MjAwODE0NTMzNjIxMgorYXRhbmgwMTE4IGF0YW5oIDAuNjQxNzM4OTkyNDM1OTY2ODggMi45MDA4NTc3Njg2Njk1MjU2IC0+IDAuMDY1NjgwMTQyNDI0MTM0NDA1IDEuMjUxODUzNTcyNDA1MzkyMQorYXRhbmgwMTE5IGF0YW5oIDAuMTkzMTM4MTM1MjgwMjU5NDIgMzguNzk5NjE5MTUwNzQxODY5IC0+IDAuMDAwMTI4MjA3NjU5MTczNjY2NDQgMS41NDUwMjkyMjAyODIzNjEyCisKKy0tIHZhbHVlcyBuZWFyIGluZmluaXR5CithdGFuaDAyMDAgYXRhbmggNS4zMjQyNjQ2ODMxMzQ3OTU0ZSszMDcgMS4zNzQwMzk2MDgwMDg0MTUzZSszMDggLT4gMi40NTE5MjUzNjE2Njk1NTc2ZS0zMDkgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMDEgYXRhbmggMS4xNTg3MDE2NDEyNDEzNThlKzMwOCAtNi41NTc5MjY4ODczMzc1ODUzZSszMDcgLT4gNi41MzY1Mzc1MjY3Nzk1MDk4ZS0zMDkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjAyIGF0YW5oIC0xLjM0MzUzMjU3MzU3NjIyNDdlKzMwOCA5Ljg5NDczNjkyNTk2MDE1NDdlKzMwNyAtPiAtNC44MjU2NjgwOTA2NTg5OTU2ZS0zMDkgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMDMgYXRhbmggLTEuNDM1OTg1NzUyMjU5ODk0MmUrMzA4IC05LjQ3MDEyMDQ3MDIzOTEwMDRlKzMwNyAtPiAtNC44NTMxMjgyMjYyODcyNjQ1ZS0zMDkgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjA0IGF0YW5oIDAuMCA1LjY2MTQxODEwNjgwOTg0OTdlKzMwNyAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMDUgYXRhbmggLTAuMCA2Ljk4MTMyMTI3MjE0NTAxMzllKzMwNyAtPiAtMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjA2IGF0YW5oIDAuMCAtNy40OTcwNjEzMDYwMzExNDUzZSszMDcgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIwNyBhdGFuaCAtMC4wIC0xLjUyODA2MDE4ODAzMTQwNjhlKzMwOCAtPiAtMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIwOCBhdGFuaCA4LjIyMTk0NzIzMzYwMDA3NDVlKzMwNyAwLjAgLT4gMS4yMTYyNTY4OTMzOTU0ODEzZS0zMDggMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMDkgYXRhbmggMS40ODExNTE5NjE3MjgwODk5ZSszMDggLTAuMCAtPiA2Ljc1MTUwMTcwODM5NTEzMjVlLTMwOSAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMTAgYXRhbmggLTEuMjI4MjAxNjI2MzU5ODc4NWUrMzA4IDAuMCAtPiAtOC4xNDE5ODU2MzYwNTM3NjE1ZS0zMDkgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMTEgYXRhbmggLTEuMDYxNjQyNzc2MDE1NDQyNmUrMzA4IC0wLjAgLT4gLTkuNDE5MzY0MjM5OTQ4OTU2M2UtMzA5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxMiBhdGFuaCAxLjI5NzE1MzY1MTAxODA2ODJlKzMwOCA1LjI4NDc5NDg0NTIzMzMyOTMgLT4gNy43MDkxODY5NTEwOTk4MzI4ZS0zMDkgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMTMgYXRhbmggMS4xODQ5ODYwOTc3NDExODUxZSszMDggLTcuOTc4MTkwNjQ0NzQ1OTk0OSAtPiA4LjQzODkxNzU2OTYzMzkwMTRlLTMwOSAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMTQgYXRhbmggLTEuNDAyOTk2OTQyMjU4NjYzNWUrMzA4IDAuOTM4OTE5ODY1NDM2NjMzNzUgLT4gLTcuMTI3NTk5MjgzMjE4MDczZS0zMDkgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMTUgYXRhbmggLTQuNzUwODA5ODkxMjI0ODIxMWUrMzA3IC04LjI3MDI0MjEyNDcwMzk5MDggLT4gLTIuMTA0OTA0MjY0NTI3ODA0M2UtMzA4IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxNiBhdGFuaCA4LjI2ODA3NDIxMTU3Njk5OTggOC4xMTUzODk4NDEwOTE4MDY1ZSszMDcgLT4gMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgwMjE3IGF0YW5oIDEuMjU3NTMyNTE0NjIxODg4NSAtMS40NzQ2Njc5MTQ3NjYxNjQ5ZSszMDggLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMDIxOCBhdGFuaCAtMi40NjE4ODAzNjgyMzEwODk5IDEuMzc4MTUyMjcxNzAwNTU2OGUrMzA4IC0+IC0wLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDAyMTkgYXRhbmggLTQuMDk1MjM4NjY5NDc4ODExMiAtMS4yMzEwODMzNzYzNTM3MDNlKzMwOCAtPiAtMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gdmFsdWVzIG5lYXIgMAorYXRhbmgwMjIwIGF0YW5oIDMuODAxNzU2MzY1OTgxMTYyOGUtMzE0IDIuNjYzNTQ4NDIzOTA3NDMxOWUtMzEyIC0+IDMuODAxNzU2MzY1OTgxMTYyOGUtMzE0IDIuNjYzNTQ4NDIzOTA3NDMxOWUtMzEyCithdGFuaDAyMjEgYXRhbmggMS43MzkxMTEwNzMzNjExODc4ZS0zMjEgLTQuMzU0NzgwMDY3MjU0MTQxOWUtMzEzIC0+IDEuNzM5MTExMDczMzYxMTg3OGUtMzIxIC00LjM1NDc4MDA2NzI1NDE0MTllLTMxMworYXRhbmgwMjIyIGF0YW5oIC01Ljk2NTY4MTYwODEzMjUwNzhlLTMxNyA5Ljk2OTIyNTM1NTU0MTYyNjNlLTMxMyAtPiAtNS45NjU2ODE2MDgxMzI1MDc4ZS0zMTcgOS45NjkyMjUzNTU1NDE2MjYzZS0zMTMKK2F0YW5oMDIyMyBhdGFuaCAtNi41NjA2NjcxMTc4NDAwMjM5ZS0zMTMgLTIuMTY4MDkzNjQwNjM1NzMzNWUtMzA5IC0+IC02LjU2MDY2NzExNzg0MDAyMzllLTMxMyAtMi4xNjgwOTM2NDA2MzU3MzM1ZS0zMDkKK2F0YW5oMDIyNCBhdGFuaCAwLjAgMi41MjMwOTQ0NDAxODIwNzc5ZS0zMTkgLT4gMC4wIDIuNTIzMDk0NDQwMTgyMDc3OWUtMzE5CithdGFuaDAyMjUgYXRhbmggLTAuMCA1LjYwNjY1Njk0OTAwNjQ2NThlLTMyMCAtPiAtMC4wIDUuNjA2NjU2OTQ5MDA2NDY1OGUtMzIwCithdGFuaDAyMjYgYXRhbmggMC4wIC0yLjQyMjI0ODcyNDk0NjgzNzdlLTMxNyAtPiAwLjAgLTIuNDIyMjQ4NzI0OTQ2ODM3N2UtMzE3CithdGFuaDAyMjcgYXRhbmggLTAuMCAtMy4wODYxMTAxMDg5MjA2MDM3ZS0zMTYgLT4gLTAuMCAtMy4wODYxMTAxMDg5MjA2MDM3ZS0zMTYKK2F0YW5oMDIyOCBhdGFuaCAzLjEyMTkyMjI4ODQzOTM5ODZlLTMxMCAwLjAgLT4gMy4xMjE5MjIyODg0MzkzOTg2ZS0zMTAgMC4wCithdGFuaDAyMjkgYXRhbmggOS44OTI2MzM3NTY0OTc2MTk2ZS0zMDkgLTAuMCAtPiA5Ljg5MjYzMzc1NjQ5NzYxOTZlLTMwOSAtMC4wCithdGFuaDAyMzAgYXRhbmggLTEuNTQ2MjUzNTA5MjkxODE1NGUtMzEyIDAuMCAtPiAtMS41NDYyNTM1MDkyOTE4MTU0ZS0zMTIgMC4wCithdGFuaDAyMzEgYXRhbmggLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAKKworLS0gcmVhbCBwYXJ0ID0gKy8tMSwgaW1hZ2luYXJ5IHBhcnQgdGlueQorYXRhbmgwMzAwIGF0YW5oIDEuMCAxZS0xNTMgLT4gMTc2LjQ5NDMzMzIwNDMyNDQ4IDAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2F0YW5oMDMwMSBhdGFuaCAxLjAgOS45OTk5OTk5OTk5OTk5OTk3ZS0xNTUgLT4gMTc3LjY0NTYyNTc1MDgyMTQ5IDAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2F0YW5oMDMwMiBhdGFuaCAtMS4wIDFlLTE2MSAtPiAtMTg1LjcwNDY3MzU3NjMwMDY1IDAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2F0YW5oMDMwMyBhdGFuaCAxLjAgLTFlLTE2NSAtPiAxOTAuMzA5ODQzNzYyMjg4NzUgLTAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2F0YW5oMDMwNCBhdGFuaCAtMS4wIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtPiAtMzcyLjIyMDAzNTk2MDY5MDYxIC0wLjc4NTM5ODE2MzM5NzQ0ODI4CisKKy0tIHNwZWNpYWwgdmFsdWVzCithdGFuaDEwMDAgYXRhbmggMC4wIDAuMCAtPiAwLjAgMC4wCithdGFuaDEwMDEgYXRhbmggMC4wIG5hbiAtPiAwLjAgbmFuCithdGFuaDEwMDIgYXRhbmggMS4wIDAuMCAtPiBpbmYgMC4wICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCithdGFuaDEwMDMgYXRhbmggMC4wIGluZiAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMDQgYXRhbmggMi4zIGluZiAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMDUgYXRhbmggMi4zIG5hbiAtPiBuYW4gbmFuCithdGFuaDEwMDYgYXRhbmggaW5mIDAuMCAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMDcgYXRhbmggaW5mIDIuMyAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMDggYXRhbmggaW5mIGluZiAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMDkgYXRhbmggaW5mIG5hbiAtPiAwLjAgbmFuCithdGFuaDEwMTAgYXRhbmggbmFuIDAuMCAtPiBuYW4gbmFuCithdGFuaDEwMTEgYXRhbmggbmFuIDIuMyAtPiBuYW4gbmFuCithdGFuaDEwMTIgYXRhbmggbmFuIGluZiAtPiAwLjAgMS41NzA3OTYzMjY3OTQ4OTY2ICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK2F0YW5oMTAxMyBhdGFuaCBuYW4gbmFuIC0+IG5hbiBuYW4KK2F0YW5oMTAxNCBhdGFuaCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorYXRhbmgxMDE1IGF0YW5oIDEuMCAtMC4wIC0+IGluZiAtMC4wICAgICAgICAgICAgICAgICAgICBkaXZpZGUtYnktemVybworYXRhbmgxMDE2IGF0YW5oIDAuMCAtaW5mIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMTcgYXRhbmggMi4zIC1pbmYgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAxOCBhdGFuaCBpbmYgLTAuMCAtPiAwLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDE5IGF0YW5oIGluZiAtMi4zIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMjAgYXRhbmggaW5mIC1pbmYgLT4gMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAyMSBhdGFuaCBuYW4gLTAuMCAtPiBuYW4gbmFuCithdGFuaDEwMjIgYXRhbmggbmFuIC0yLjMgLT4gbmFuIG5hbgorYXRhbmgxMDIzIGF0YW5oIG5hbiAtaW5mIC0+IDAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2ICAgICBpZ25vcmUtcmVhbC1zaWduCithdGFuaDEwMjQgYXRhbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorYXRhbmgxMDI1IGF0YW5oIC0wLjAgbmFuIC0+IC0wLjAgbmFuCithdGFuaDEwMjYgYXRhbmggLTEuMCAtMC4wIC0+IC1pbmYgLTAuMCAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCithdGFuaDEwMjcgYXRhbmggLTAuMCAtaW5mIC0+IC0wLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDI4IGF0YW5oIC0yLjMgLWluZiAtPiAtMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAyOSBhdGFuaCAtMi4zIG5hbiAtPiBuYW4gbmFuCithdGFuaDEwMzAgYXRhbmggLWluZiAtMC4wIC0+IC0wLjAgLTEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDMxIGF0YW5oIC1pbmYgLTIuMyAtPiAtMC4wIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAzMiBhdGFuaCAtaW5mIC1pbmYgLT4gLTAuMCAtMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMzMgYXRhbmggLWluZiBuYW4gLT4gLTAuMCBuYW4KK2F0YW5oMTAzNCBhdGFuaCAtMC4wIDAuMCAtPiAtMC4wIDAuMAorYXRhbmgxMDM1IGF0YW5oIC0xLjAgMC4wIC0+IC1pbmYgMC4wICAgICAgICAgICAgICAgICAgICBkaXZpZGUtYnktemVybworYXRhbmgxMDM2IGF0YW5oIC0wLjAgaW5mIC0+IC0wLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwMzcgYXRhbmggLTIuMyBpbmYgLT4gLTAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKK2F0YW5oMTAzOCBhdGFuaCAtaW5mIDAuMCAtPiAtMC4wIDEuNTcwNzk2MzI2Nzk0ODk2NgorYXRhbmgxMDM5IGF0YW5oIC1pbmYgMi4zIC0+IC0wLjAgMS41NzA3OTYzMjY3OTQ4OTY2CithdGFuaDEwNDAgYXRhbmggLWluZiBpbmYgLT4gLTAuMCAxLjU3MDc5NjMyNjc5NDg5NjYKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBsb2c6IE5hdHVyYWwgbG9nYXJpdGhtIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2xvZzAwMDAgbG9nIDEuMCAwLjAgLT4gMC4wIDAuMAorbG9nMDAwMSBsb2cgMS4wIC0wLjAgLT4gMC4wIC0wLjAKK2xvZzAwMDIgbG9nIC0xLjAgMC4wIC0+IDAuMCAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMDMgbG9nIC0xLjAgLTAuMCAtPiAwLjAgLTMuMTQxNTkyNjUzNTg5NzkzMQorLS0gdmFsdWVzIGFsb25nIGJvdGggc2lkZXMgb2YgcmVhbCBheGlzCitsb2cwMDEwIGxvZyAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IC03NDMuNzQ2OTI0NzQwODIxMzMgMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDExIGxvZyAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAtNzQzLjc0NjkyNDc0MDgyMTMzIC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMTIgbG9nIC0xZS0zMDUgMC4wIC0+IC03MDIuMjg4NDUzMzYzMTgzOTggMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDEzIGxvZyAtMWUtMzA1IC0wLjAgLT4gLTcwMi4yODg0NTMzNjMxODM5OCAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDE0IGxvZyAtMWUtMTUwIDAuMCAtPiAtMzQ1LjM4Nzc2Mzk0OTEwNjg0IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAxNSBsb2cgLTFlLTE1MCAtMC4wIC0+IC0zNDUuMzg3NzYzOTQ5MTA2ODQgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAxNiBsb2cgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IC0zNi44NDEzNjE0ODc5MDQ3MzQgMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDE3IGxvZyAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAtMC4wIC0+IC0zNi44NDEzNjE0ODc5MDQ3MzQgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAxOCBsb2cgLTAuMDAxIDAuMCAtPiAtNi45MDc3NTUyNzg5ODIxMzY4IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAxOSBsb2cgLTAuMDAxIC0wLjAgLT4gLTYuOTA3NzU1Mjc4OTgyMTM2OCAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDIwIGxvZyAtMC41Nzg5OTk5OTk5OTk5OTk5NiAwLjAgLT4gLTAuNTQ2NDUyODAxNDA5MTQxODggMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDIxIGxvZyAtMC41Nzg5OTk5OTk5OTk5OTk5NiAtMC4wIC0+IC0wLjU0NjQ1MjgwMTQwOTE0MTg4IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjIgbG9nIC0wLjk5OTk5OTk5OTk5OTk5OTg5IDAuMCAtPiAtMS4xMTAyMjMwMjQ2MjUxNTY1ZS0xNiAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjMgbG9nIC0wLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAgLT4gLTEuMTEwMjIzMDI0NjI1MTU2NWUtMTYgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAyNCBsb2cgLTEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gMi4yMjA0NDYwNDkyNTAzMTI4ZS0xNiAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjUgbG9nIC0xLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiAyLjIyMDQ0NjA0OTI1MDMxMjhlLTE2IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMjYgbG9nIC0xLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuMDAwOTk5NTAwMzMzMDgzNDIzMjEgMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDI3IGxvZyAtMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMC4wMDA5OTk1MDAzMzMwODM0MjMyMSAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDI4IGxvZyAtMi4wIDAuMCAtPiAwLjY5MzE0NzE4MDU1OTk0NTI5IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAyOSBsb2cgLTIuMCAtMC4wIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MjkgLTMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDAzMCBsb2cgLTIzLjAgMC4wIC0+IDMuMTM1NDk0MjE1OTI5MTQ5NyAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzEgbG9nIC0yMy4wIC0wLjAgLT4gMy4xMzU0OTQyMTU5MjkxNDk3IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzIgbG9nIC0xMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAzNi44NDEzNjE0ODc5MDQ3MzQgMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDMzIGxvZyAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDM2Ljg0MTM2MTQ4NzkwNDczNCAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDM0IGxvZyAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDM0NS4zODc3NjM5NDkxMDY4NCAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzUgbG9nIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDM0NS4zODc3NjM5NDkxMDY4NCAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDM2IGxvZyAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDY4OC40NzI5NDI4MDUyMTk2NSAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAwMzcgbG9nIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDY4OC40NzI5NDI4MDUyMTk2NSAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMDM4IGxvZyA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gLTc0My43NDY5MjQ3NDA4MjEzMyAwLjAKK2xvZzAwMzkgbG9nIDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gLTc0My43NDY5MjQ3NDA4MjEzMyAtMC4wCitsb2cwMDQwIGxvZyAxZS0zMDUgMC4wIC0+IC03MDIuMjg4NDUzMzYzMTgzOTggMC4wCitsb2cwMDQxIGxvZyAxZS0zMDUgLTAuMCAtPiAtNzAyLjI4ODQ1MzM2MzE4Mzk4IC0wLjAKK2xvZzAwNDIgbG9nIDFlLTE1MCAwLjAgLT4gLTM0NS4zODc3NjM5NDkxMDY4NCAwLjAKK2xvZzAwNDMgbG9nIDFlLTE1MCAtMC4wIC0+IC0zNDUuMzg3NzYzOTQ5MTA2ODQgLTAuMAorbG9nMDA0NCBsb2cgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gLTM2Ljg0MTM2MTQ4NzkwNDczNCAwLjAKK2xvZzAwNDUgbG9nIDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAtMzYuODQxMzYxNDg3OTA0NzM0IC0wLjAKK2xvZzAwNDYgbG9nIDAuMDAxIDAuMCAtPiAtNi45MDc3NTUyNzg5ODIxMzY4IDAuMAorbG9nMDA0NyBsb2cgMC4wMDEgLTAuMCAtPiAtNi45MDc3NTUyNzg5ODIxMzY4IC0wLjAKK2xvZzAwNDggbG9nIDAuNTc4OTk5OTk5OTk5OTk5OTYgMC4wIC0+IC0wLjU0NjQ1MjgwMTQwOTE0MTg4IDAuMAorbG9nMDA0OSBsb2cgMC41Nzg5OTk5OTk5OTk5OTk5NiAtMC4wIC0+IC0wLjU0NjQ1MjgwMTQwOTE0MTg4IC0wLjAKK2xvZzAwNTAgbG9nIDAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IC0xLjExMDIyMzAyNDYyNTE1NjVlLTE2IDAuMAorbG9nMDA1MSBsb2cgMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IC0xLjExMDIyMzAyNDYyNTE1NjVlLTE2IC0wLjAKK2xvZzAwNTIgbG9nIDEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gMi4yMjA0NDYwNDkyNTAzMTI4ZS0xNiAwLjAKK2xvZzAwNTMgbG9nIDEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDIuMjIwNDQ2MDQ5MjUwMzEyOGUtMTYgLTAuMAorbG9nMDA1NCBsb2cgMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAwLjAwMDk5OTUwMDMzMzA4MzQyMzIxIDAuMAorbG9nMDA1NSBsb2cgMS4wMDA5OTk5OTk5OTk5OTk5IC0wLjAgLT4gMC4wMDA5OTk1MDAzMzMwODM0MjMyMSAtMC4wCitsb2cwMDU2IGxvZyAyLjAgMC4wIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MjkgMC4wCitsb2cwMDU3IGxvZyAyLjAgLTAuMCAtPiAwLjY5MzE0NzE4MDU1OTk0NTI5IC0wLjAKK2xvZzAwNTggbG9nIDIzLjAgMC4wIC0+IDMuMTM1NDk0MjE1OTI5MTQ5NyAwLjAKK2xvZzAwNTkgbG9nIDIzLjAgLTAuMCAtPiAzLjEzNTQ5NDIxNTkyOTE0OTcgLTAuMAorbG9nMDA2MCBsb2cgMTAwMDAwMDAwMDAwMDAwMDAuMCAwLjAgLT4gMzYuODQxMzYxNDg3OTA0NzM0IDAuMAorbG9nMDA2MSBsb2cgMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDM2Ljg0MTM2MTQ4NzkwNDczNCAtMC4wCitsb2cwMDYyIGxvZyA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gMzQ1LjM4Nzc2Mzk0OTEwNjg0IDAuMAorbG9nMDA2MyBsb2cgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiAzNDUuMzg3NzYzOTQ5MTA2ODQgLTAuMAorbG9nMDA2NCBsb2cgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDY4OC40NzI5NDI4MDUyMTk2NSAwLjAKK2xvZzAwNjUgbG9nIDEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gNjg4LjQ3Mjk0MjgwNTIxOTY1IC0wLjAKKworLS0gcmFuZG9tIGlucHV0cworbG9nMDA2NiBsb2cgLTEuOTgzMDQ1NDk0NTE4NjE5MWUtMTYgLTIuMDMzNDQ0ODAyNTY3MzM0NiAtPiAwLjcwOTczMTMwMTk0MzI5ODAzIC0xLjU3MDc5NjMyNjc5NDg5NjgKK2xvZzAwNjcgbG9nIC0wLjk2NzQ1ODUzMDI0NzQxODU3IC0wLjg0OTk1ODE2MjI4Mjk5NjkyIC0+IDAuMjUyOTI4MTEzOTg3MjIzODcgLTIuNDIwNzU3MDQzODUzNjkwNQorbG9nMDA2OCBsb2cgLTAuMTYwMzY0NDMxMzk0ODQxOCAtMC4yOTI5OTQyMTExMDQxODM1IC0+IC0xLjA5NjU4NTc4NzI0MjczNzQgLTIuMDcxNTg3MDg1OTk3MTQxOQorbG9nMDA2OSBsb2cgLTAuMTU5MTc5MTMxNjg0Mzg2OTkgLTAuMjUyMzg3OTkyNTExMzIxNzcgLT4gLTEuMjA5MzQ3NzMxMzI0OTkwMSAtMi4xMzM0Nzg0MjMyMDMzODYzCitsb2cwMDcwIGxvZyAtMC42ODkwNzgxODUzNTA3ODgwMiAtMy4wNjkzMTA1ODUzNDc2MzQ2IC0+IDEuMTQ2MDM5ODYyOTE4NDU2NSAtMS43OTE2NDAzODEzOTEzMjExCitsb2cwMDcxIGxvZyAtMTcuMjY4MTMzNDQ3NTY1NTg5IDYuODE2NTEyMDAxNDYwNDc1NiAtPiAyLjkyMTI2OTQ0NjU5NzQ4MzYgMi43NjU2MjQ1MDgxNjAzMTY0Citsb2cwMDcyIGxvZyAtMS43MTUzODk0NDc5NjkwMzI4IDI2LjQzNDA1NTM3MjgwMjYzNiAtPiAzLjI3Njc1NDI5NTM3MTgwMDMgMS42MzU1OTg2Mjc2MzQxNzM0Citsb2cwMDczIGxvZyAtOC4wNDU2Nzk0NjQ4OTM2NTc4ZS0wNiAwLjE5NzIyNzU4MDU3NTcwMjA4IC0+IC0xLjYyMzM5Njk4NDgyOTYwNzUgMS41NzA4MzcxMjA2ODEwMTAxCitsb2cwMDc0IGxvZyAtMi40MzA2NDQyNjkxMzIzMTczIDAuNjg0NjkxOTc1MDcwMDk5NiAtPiAwLjkyNjMzNTkyMDAxOTY5NTg5IDIuODY3MDE2MDU3NjcxODMzMQorbG9nMDA3NSBsb2cgLTMuNTQ4ODA0OTI1MDg4ODE5NCAwLjQ1MzI0MDQwNjQzMTg1MjU0IC0+IDEuMjc0NzAwODM3NDI1NjQyNiAzLjAxNDU2NDAwMDc4ODUxMTEKK2xvZzAwNzYgbG9nIDAuMTg0MTg1MTY4NTE1MTAxODkgLTAuMjYwNjI1MTg4MzYyMTI2MTcgLT4gLTEuMTQyMTI4NzEyMTk0MDM0NCAtMC45NTU1ODQ0MDg0MTE4MzQzNAorbG9nMDA3NyBsb2cgMi43MTI0ODM3Nzk1NjM4Mzk5IC0xMy4xNDg3NjkwNjcxMzMzODcgLT4gMi41OTcxNjU5OTc1NzA2ODAyIC0xLjM2NzM1ODMwNDUyMDk0MzkKK2xvZzAwNzggbG9nIDMuNjUyMTI3NTQ3NjE2OTE0OWUtMTMgLTMuNzgyMDU0MzAyMzE3MDY3M2UtMDUgLT4gLTEwLjE4MjY1ODEzNjc0MTU2OSAtMS41NzA3OTYzMTcxMzg0MzE2Citsb2cwMDc5IGxvZyA1LjA4Nzc1NDU4MTM4NjIyMzkgLTEuMjgzNDk3ODMyNjc4Njg1MiAtPiAxLjY1NzY4NTYyMTMwNzYzMjggLTAuMjQ3MTE1ODM0OTc3Mzg0ODUKK2xvZzAwODAgbG9nIDAuMjY0Nzc5ODY4MDg0NjE1MTIgLTAuNjc2NTkwMDExOTQxODc0MjkgLT4gLTAuMzE5NDQwODUyMDc5OTk5NzMgLTEuMTk3NzczNjcxOTg3MTIxCitsb2cwMDgxIGxvZyAwLjAwMTQ3NTQyNjEzOTgwNzE5NjIgNS4zNTE0NjkxNjA4MjA1NDQyIC0+IDEuNjc3MzcxMTcwNzE1MzgyOSAxLjU3MDUyMDYyMTkyNjE4MDIKK2xvZzAwODIgbG9nIDAuMjk2NjczMzQ0NjIxNTc4ODUgMC4wMDAyMDA1NjA0NTA0MjU4NDc5NSAtPiAtMS4yMTUxMjMzNjY3MDc5NTg4IDAuMDAwNjc2MDMxMTQxNjg2ODkyMDQKK2xvZzAwODMgbG9nIDAuODIxMDQyMzM2NzEwOTk0MjUgMy45MDA1Mzg3MTMwMTMzMTAyIC0+IDEuMzgyNzkxODk2NTI5OTU5MyAxLjM2MzMzMDQ3MDE4NDgzNjMKK2xvZzAwODQgbG9nIDAuMjcyNjgxMzUzNTgxODA2NjcgMTI0LjQyMDg4MTEwOTQ1ODA0IC0+IDQuODIzNjcyNDIyMzU1OTIyOSAxLjU2ODYwNDcyNTg3ODkwMTUKK2xvZzAwODUgbG9nIDAuMDAyNjI4Njk1OTE2ODI2NzQ4NSAwLjQ3Nzk1ODA4MTgwNTczMDEzIC0+IC0wLjczODIxNzEyMTM3ODA5MTI2IDEuNTY1Mjk2NTM2MDk2MDA4NworCistLSB2YWx1ZXMgbmVhciBpbmZpbml0eQorbG9nMDEwMCBsb2cgMS4wNTEyMDI1NzQ0MDAzMTcyZSszMDggNy4yNjIxNjY5NzUwNjY0NjExZSszMDcgLT4gNzA5LjQ0MTIzOTY3ODE0NDk0IDAuNjA0NTU0MzQwNDgzMzI5NjgKK2xvZzAxMDEgbG9nIDUuNTM0NDI0OTAzNDM3MjEyNmUrMzA3IC0xLjIxNTU4NTkxNTg0MzEyNzVlKzMwOCAtPiA3MDkuNDg1NjIzMDAzNDU2NzkgLTEuMTQzNTUzMDU2NzE3OTczCitsb2cwMTAyIGxvZyAtMS4zMTU1NTc1NDAzNDY5NDA4ZSszMDggMS4xNjEwNzkzNTQxNjYzODY0ZSszMDggLT4gNzA5Ljc1ODQ3ODA5NTQ2NDI4IDIuNDE4NDg3OTY1MDQ5NzQKK2xvZzAxMDMgbG9nIC0xLjYzMjM2NjcyMDk3MzIzNWUrMzA4IC0xLjU0Mjk5NDQ2MjExNDQ4ZSszMDggLT4gNzEwLjAwNTQ1MjM2NTE1NTg2IC0yLjM4NDMzMjYwMjg0NTUwODcKK2xvZzAxMDQgbG9nIDAuMCA1Ljk0NDkyNzY2OTIzMjc3MTJlKzMwNyAtPiA3MDguNjc2MTYxOTEyNTg1MjYgMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cwMTA1IGxvZyAtMC4wIDEuMTIwMTg1MDQ1OTAyNTY5MmUrMzA4IC0+IDcwOS4zMDk3MDI1MzMzODE3MSAxLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMDYgbG9nIDAuMCAtMS42MjE0MjI1OTMzNDY2NTI4ZSszMDggLT4gNzA5LjY3OTUxMjU1MDEwODYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDEwNyBsb2cgLTAuMCAtMS43NDUzMjY5NzkxNTkxMDU4ZSszMDggLT4gNzA5Ljc1MzE1MDU2MDg3Mzc5IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMDggbG9nIDEuNDQwODYwNTc3NjAxNDI4ZSszMDggMC4wIC0+IDcwOS41NjE0NDkyMDA1ODI2MiAwLjAKK2xvZzAxMDkgbG9nIDEuMzkxNTE1MTc2MTQ4MjgyZSszMDggLTAuMCAtPiA3MDkuNTI2NjAxODUwNDEzMjcgLTAuMAorbG9nMDExMCBsb2cgLTEuMjAxMzU0NDAxMjk1Mjk2ZSszMDggMC4wIC0+IDcwOS4zNzk2NTgyMzAyMzk1NiAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAxMTEgbG9nIC0xLjY3MDQzMzc4MjU5NzY4MDRlKzMwOCAtMC4wIC0+IDcwOS43MDkyOTE5ODQ5MjM5OSAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cwMTEyIGxvZyA3LjIyNzY5NzQ2NTUxOTAyMjNlKzMwNyA3Ljk0ODc5NzExMzY5MTY0IC0+IDcwOC44NzE1NDQwNjUxMjEwNCAxLjA5OTc2ODkzMDc4NTA0NThlLTMwNworbG9nMDExMyBsb2cgMS4xMjA3ODU5NTkzNzE2MDc2ZSszMDggLTYuMTk1NjIwMDg2ODIyMTE0NyAtPiA3MDkuMzEwMjM4ODMwODAxMDQgLTUuNTI3OTI0NDMxMDgwMzI4NmUtMzA4Citsb2cwMTE0IGxvZyAtNC42Njc4OTMzODc0NDcxMDQ1ZSszMDcgOS45NDcxMDc4OTMyMjAzODIgLT4gNzA4LjQzNDMzMTQyNDMxMzg4IDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDExNSBsb2cgLTEuNTEwODAxMjQ1Mzk1MDE0MmUrMzA4IC01LjMxMTcxOTcxNzkzNzU2MTkgLT4gNzA5LjYwODg0ODc3ODM1MDA4IC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzAxMTYgbG9nIDcuNDkwMzc1MDg3MTUwNDQzNSAxLjUzMjA3MDM3NzY2MjYzNTJlKzMwOCAtPiA3MDkuNjIyODI4NjUwODUxMzcgMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cwMTE3IGxvZyA1Ljk3NjAzMjU1MjU2NTQ3NzggLTguMDE0OTQ3Mzk5NzM0OTEyM2UrMzA3IC0+IDcwOC45NzQ5MzE3NzI0ODM5NiAtMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cwMTE4IGxvZyAtNy44ODAxOTQyMDYzODY2MjkgMS43ODYxODQ1ODE0NzY3NDQxZSszMDggLT4gNzA5Ljc3NjI5MDQ2ODM3MTM3IDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDExOSBsb2cgLTkuODg2NDM4OTkzODUyODY1IC02LjE5MjM1NzgxMDgwNzQ3ZSszMDcgLT4gNzA4LjcxNjkzOTQ2OTc3MzAyIC0xLjU3MDc5NjMyNjc5NDg5NjYKKworLS0gdmFsdWVzIG5lYXIgMAorbG9nMDEyMCBsb2cgMi4yOTk2ODY3NTc5MjI3Nzc5ZS0zMDggNi43ODYxODQwNzcwOTM5MTI1ZS0zMTIgLT4gLTcwOC4zNjM0MzU2NzcxNzM5MiAwLjAwMDI5NTA5MTY2MjIzMzM5ODE1Citsb2cwMTIxIGxvZyA2LjkxNjkxOTA0MTc3NzQ1MTZlLTMyMyAtOS4wNDE0MDEzMTg4OTQ4MTE4ZS0zMjIgLT4gLTczOS4yMjc2Njc5NjQ2ODM4NiAtMS40OTQ0NDIzMjEwMDAxNjY5Citsb2cwMTIyIGxvZyAtMS41Mzc4MDY0OTYyOTE0MDExZS0zMTYgMS44MjQzNjI4Mzg5MzU0NjM1ZS0zMTAgLT4gLTcxMy4yMDAxNDgwMzE0Mjk2NSAxLjU3MDc5NzE2OTcyMjg4NDIKK2xvZzAxMjMgbG9nIC0yLjMzMTk4OTg0ODM3MDY4MzdlLTMyMSAtMi4yMzU4NzYzOTQxODY2MzcxZS0zMTMgLT4gLTcxOS45MDQ1MDA4MzMyNTIyIC0xLjU3MDc5NjMzNzIyNDc2NgorbG9nMDEyNCBsb2cgMC4wIDMuODcyNzcwMTAxMDgxMTIxZS0zMTUgLT4gLTcyMy45NjAzMzQyNTM3NDQwMSAxLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMjUgbG9nIC0wLjAgOS42MzQyODAwOTM5MDQzMDc2ZS0zMjIgLT4gLTczOS4xNjcwNzIzNjI4MTc1MiAxLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMjYgbG9nIDAuMCAtMi4yNjYwOTkzOTM0Mjc4MzRlLTMwOCAtPiAtNzA4LjM3ODE0ODYxNzU3OTY1IC0xLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzAxMjcgbG9nIC0wLjAgLTIuMTE4NDY5NTY3Mzc2NjYyNmUtMzE1IC0+IC03MjQuNTYzNjEwMzY3MzE4MTIgLTEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMDEyOCBsb2cgMS4xMzYzNTA5ODU0MzQ4NjcxZS0zMjIgMC4wIC0+IC03NDEuMzA0NTc3NzA1NDUyMDYgMC4wCitsb2cwMTI5IGxvZyAzLjU1NzI3MjY1MDA1Njk3NTFlLTMyMiAtMC4wIC0+IC03NDAuMTYzNDA1ODAyMzY1MjIgLTAuMAorbG9nMDEzMCBsb2cgLTIuMzY5NjA3MTA3NDA0MDU5M2UtMzEwIDAuMCAtPiAtNzEyLjkzODY1NDY2NDIxNjQxIDMuMTQxNTkyNjUzNTg5NzkzMQorbG9nMDEzMSBsb2cgLTIuODEzMjgzODk3MjY2OTM0ZS0zMTcgLTAuMCAtPiAtNzI4Ljg4NTEyMjAzMTM4ODYyIC0zLjE0MTU5MjY1MzU4OTc5MzEKKworLS0gdmFsdWVzIG5lYXIgdGhlIHVuaXQgY2lyY2xlCitsb2cwMjAwIGxvZyAtMC41OTk5OTk5OTk5OTk5OTk5OCAwLjgwMDAwMDAwMDAwMDAwMDA0IC0+IDIuMjIwNDQ2MDQ5MjUwMzEzMmUtMTcgMi4yMTQyOTc0MzU1ODgxODA4Citsb2cwMjAxIGxvZyAwLjc5OTk5OTk5OTk5OTk5OTkzIDAuNjAwMDAwMDAwMDAwMDAwMDkgLT4gNi4xNjI5NzU4MjIwMzkxNTQ3ZS0zMyAwLjY0MzUwMTEwODc5MzI4NDQ4CisKKy0tIHNwZWNpYWwgdmFsdWVzCitsb2cxMDAwIGxvZyAtMC4wIDAuMCAtPiAtaW5mIDMuMTQxNTkyNjUzNTg5NzkzMSAgICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2cxMDAxIGxvZyAwLjAgMC4wIC0+IC1pbmYgMC4wICAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2cxMDAyIGxvZyAwLjAgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzEwMDMgbG9nIDIuMyBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMTAwNCBsb2cgLTAuMCBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMTAwNSBsb2cgLTIuMyBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMTAwNiBsb2cgMC4wIG5hbiAtPiBuYW4gbmFuCitsb2cxMDA3IGxvZyAyLjMgbmFuIC0+IG5hbiBuYW4KK2xvZzEwMDggbG9nIC0wLjAgbmFuIC0+IG5hbiBuYW4KK2xvZzEwMDkgbG9nIC0yLjMgbmFuIC0+IG5hbiBuYW4KK2xvZzEwMTAgbG9nIC1pbmYgMC4wIC0+IGluZiAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzEwMTEgbG9nIC1pbmYgMi4zIC0+IGluZiAzLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzEwMTIgbG9nIGluZiAwLjAgLT4gaW5mIDAuMAorbG9nMTAxMyBsb2cgaW5mIDIuMyAtPiBpbmYgMC4wCitsb2cxMDE0IGxvZyAtaW5mIGluZiAtPiBpbmYgMi4zNTYxOTQ0OTAxOTIzNDQ4Citsb2cxMDE1IGxvZyBpbmYgaW5mIC0+IGluZiAwLjc4NTM5ODE2MzM5NzQ0ODI4Citsb2cxMDE2IGxvZyBpbmYgbmFuIC0+IGluZiBuYW4KK2xvZzEwMTcgbG9nIC1pbmYgbmFuIC0+IGluZiBuYW4KK2xvZzEwMTggbG9nIG5hbiAwLjAgLT4gbmFuIG5hbgorbG9nMTAxOSBsb2cgbmFuIDIuMyAtPiBuYW4gbmFuCitsb2cxMDIwIGxvZyBuYW4gaW5mIC0+IGluZiBuYW4KK2xvZzEwMjEgbG9nIG5hbiBuYW4gLT4gbmFuIG5hbgorbG9nMTAyMiBsb2cgLTAuMCAtMC4wIC0+IC1pbmYgLTMuMTQxNTkyNjUzNTg5NzkzMSAgICAgICBkaXZpZGUtYnktemVybworbG9nMTAyMyBsb2cgMC4wIC0wLjAgLT4gLWluZiAtMC4wICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGUtYnktemVybworbG9nMTAyNCBsb2cgMC4wIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzEwMjUgbG9nIDIuMyAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2Citsb2cxMDI2IGxvZyAtMC4wIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK2xvZzEwMjcgbG9nIC0yLjMgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorbG9nMTAyOCBsb2cgLWluZiAtMC4wIC0+IGluZiAtMy4xNDE1OTI2NTM1ODk3OTMxCitsb2cxMDI5IGxvZyAtaW5mIC0yLjMgLT4gaW5mIC0zLjE0MTU5MjY1MzU4OTc5MzEKK2xvZzEwMzAgbG9nIGluZiAtMC4wIC0+IGluZiAtMC4wCitsb2cxMDMxIGxvZyBpbmYgLTIuMyAtPiBpbmYgLTAuMAorbG9nMTAzMiBsb2cgLWluZiAtaW5mIC0+IGluZiAtMi4zNTYxOTQ0OTAxOTIzNDQ4Citsb2cxMDMzIGxvZyBpbmYgLWluZiAtPiBpbmYgLTAuNzg1Mzk4MTYzMzk3NDQ4MjgKK2xvZzEwMzQgbG9nIG5hbiAtMC4wIC0+IG5hbiBuYW4KK2xvZzEwMzUgbG9nIG5hbiAtMi4zIC0+IG5hbiBuYW4KK2xvZzEwMzYgbG9nIG5hbiAtaW5mIC0+IGluZiBuYW4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGxvZzEwOiBMb2dhcml0aG0gYmFzZSAxMCAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2xvZ3QwMDAwIGxvZzEwIDEuMCAwLjAgLT4gMC4wIDAuMAorbG9ndDAwMDEgbG9nMTAgMS4wIC0wLjAgLT4gMC4wIC0wLjAKK2xvZ3QwMDAyIGxvZzEwIC0xLjAgMC4wIC0+IDAuMCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDAzIGxvZzEwIC0xLjAgLTAuMCAtPiAwLjAgLTEuMzY0Mzc2MzUzODQxODQxNAorLS0gdmFsdWVzIGFsb25nIGJvdGggc2lkZXMgb2YgcmVhbCBheGlzCitsb2d0MDAxMCBsb2cxMCAtOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgMC4wIC0+IC0zMjMuMDA1MTg1MzQ3NDUxOCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDExIGxvZzEwIC05Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAtMC4wIC0+IC0zMjMuMDA1MTg1MzQ3NDUxOCAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAxMiBsb2cxMCAtMWUtMzA1IDAuMCAtPiAtMzA1LjAgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAxMyBsb2cxMCAtMWUtMzA1IC0wLjAgLT4gLTMwNS4wIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDE0IGxvZzEwIC0xZS0xNTAgMC4wIC0+IC0xNTAuMCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDE1IGxvZzEwIC0xZS0xNTAgLTAuMCAtPiAtMTUwLjAgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMTYgbG9nMTAgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IC0xNi4wIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMTcgbG9nMTAgLTkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgLTAuMCAtPiAtMTYuMCAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAxOCBsb2cxMCAtMC4wMDEgMC4wIC0+IC0zLjAgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAxOSBsb2cxMCAtMC4wMDEgLTAuMCAtPiAtMy4wIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDIwIGxvZzEwIC0wLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAtMC4yMzczMjE0MzYyNzI1NjM4MyAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDIxIGxvZzEwIC0wLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gLTAuMjM3MzIxNDM2MjcyNTYzODMgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjIgbG9nMTAgLTAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IC00LjgyMTYzNzMzMjc2NjQzNmUtMTcgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAyMyBsb2cxMCAtMC45OTk5OTk5OTk5OTk5OTk4OSAtMC4wIC0+IC00LjgyMTYzNzMzMjc2NjQzNmUtMTcgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjQgbG9nMTAgLTEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gOS42NDMyNzQ2NjU1MzI4Njk2ZS0xNyAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDI1IGxvZzEwIC0xLjAwMDAwMDAwMDAwMDAwMDIgLTAuMCAtPiA5LjY0MzI3NDY2NTUzMjg2OTZlLTE3IC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDI2IGxvZzEwIC0xLjAwMDk5OTk5OTk5OTk5OTkgMC4wIC0+IDAuMDAwNDM0MDc3NDc5MzE4NTkyOSAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDI3IGxvZzEwIC0xLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAwLjAwMDQzNDA3NzQ3OTMxODU5MjkgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjggbG9nMTAgLTIuMCAwLjAgLT4gMC4zMDEwMjk5OTU2NjM5ODEyIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMjkgbG9nMTAgLTIuMCAtMC4wIC0+IDAuMzAxMDI5OTk1NjYzOTgxMiAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAzMCBsb2cxMCAtMjMuMCAwLjAgLT4gMS4zNjE3Mjc4MzYwMTc1OTI4IDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMzEgbG9nMTAgLTIzLjAgLTAuMCAtPiAxLjM2MTcyNzgzNjAxNzU5MjggLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMzIgbG9nMTAgLTEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IDE2LjAgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAzMyBsb2cxMCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDE2LjAgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAwMzQgbG9nMTAgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IDAuMCAtPiAxNTAuMCAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDM1IGxvZzEwIC05Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAtMC4wIC0+IDE1MC4wIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMDM2IGxvZzEwIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gMjk5LjAgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAzNyBsb2cxMCAtMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgLTAuMCAtPiAyOTkuMCAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDAzOCBsb2cxMCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gLTMyMy4wMDUxODUzNDc0NTE4IDAuMAorbG9ndDAwMzkgbG9nMTAgOS44ODEzMTI5MTY4MjQ5MzA5ZS0zMjQgLTAuMCAtPiAtMzIzLjAwNTE4NTM0NzQ1MTggLTAuMAorbG9ndDAwNDAgbG9nMTAgMWUtMzA1IDAuMCAtPiAtMzA1LjAgMC4wCitsb2d0MDA0MSBsb2cxMCAxZS0zMDUgLTAuMCAtPiAtMzA1LjAgLTAuMAorbG9ndDAwNDIgbG9nMTAgMWUtMTUwIDAuMCAtPiAtMTUwLjAgMC4wCitsb2d0MDA0MyBsb2cxMCAxZS0xNTAgLTAuMCAtPiAtMTUwLjAgLTAuMAorbG9ndDAwNDQgbG9nMTAgOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gLTE2LjAgMC4wCitsb2d0MDA0NSBsb2cxMCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAgLT4gLTE2LjAgLTAuMAorbG9ndDAwNDYgbG9nMTAgMC4wMDEgMC4wIC0+IC0zLjAgMC4wCitsb2d0MDA0NyBsb2cxMCAwLjAwMSAtMC4wIC0+IC0zLjAgLTAuMAorbG9ndDAwNDggbG9nMTAgMC41Nzg5OTk5OTk5OTk5OTk5NiAwLjAgLT4gLTAuMjM3MzIxNDM2MjcyNTYzODMgMC4wCitsb2d0MDA0OSBsb2cxMCAwLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gLTAuMjM3MzIxNDM2MjcyNTYzODMgLTAuMAorbG9ndDAwNTAgbG9nMTAgMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gLTQuODIxNjM3MzMyNzY2NDM2ZS0xNyAwLjAKK2xvZ3QwMDUxIGxvZzEwIDAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAtNC44MjE2MzczMzI3NjY0MzZlLTE3IC0wLjAKK2xvZ3QwMDUyIGxvZzEwIDEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gOS42NDMyNzQ2NjU1MzI4Njk2ZS0xNyAwLjAKK2xvZ3QwMDUzIGxvZzEwIDEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDkuNjQzMjc0NjY1NTMyODY5NmUtMTcgLTAuMAorbG9ndDAwNTQgbG9nMTAgMS4wMDA5OTk5OTk5OTk5OTk5IDAuMCAtPiAwLjAwMDQzNDA3NzQ3OTMxODU5MjkgMC4wCitsb2d0MDA1NSBsb2cxMCAxLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAwLjAwMDQzNDA3NzQ3OTMxODU5MjkgLTAuMAorbG9ndDAwNTYgbG9nMTAgMi4wIDAuMCAtPiAwLjMwMTAyOTk5NTY2Mzk4MTIgMC4wCitsb2d0MDA1NyBsb2cxMCAyLjAgLTAuMCAtPiAwLjMwMTAyOTk5NTY2Mzk4MTIgLTAuMAorbG9ndDAwNTggbG9nMTAgMjMuMCAwLjAgLT4gMS4zNjE3Mjc4MzYwMTc1OTI4IDAuMAorbG9ndDAwNTkgbG9nMTAgMjMuMCAtMC4wIC0+IDEuMzYxNzI3ODM2MDE3NTkyOCAtMC4wCitsb2d0MDA2MCBsb2cxMCAxMDAwMDAwMDAwMDAwMDAwMC4wIDAuMCAtPiAxNi4wIDAuMAorbG9ndDAwNjEgbG9nMTAgMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDE2LjAgLTAuMAorbG9ndDAwNjIgbG9nMTAgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgMC4wIC0+IDE1MC4wIDAuMAorbG9ndDAwNjMgbG9nMTAgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiAxNTAuMCAtMC4wCitsb2d0MDA2NCBsb2cxMCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAwLjAgLT4gMjk5LjAgMC4wCitsb2d0MDA2NSBsb2cxMCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDI5OS4wIC0wLjAKKworLS0gcmFuZG9tIGlucHV0cworbG9ndDAwNjYgbG9nMTAgLTEuOTgzMDQ1NDk0NTE4NjE5MWUtMTYgLTIuMDMzNDQ0ODAyNTY3MzM0NiAtPiAwLjMwODIzMjM4ODA2Nzk4NTAzIC0wLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDA2NyBsb2cxMCAtMC45Njc0NTg1MzAyNDc0MTg1NyAtMC44NDk5NTgxNjIyODI5OTY5MiAtPiAwLjEwOTg0NTI4NDIyMjg0ODAyIC0xLjA1MTMyMTQyNjE3NDA4NgorbG9ndDAwNjggbG9nMTAgLTAuMTYwMzY0NDMxMzk0ODQxOCAtMC4yOTI5OTQyMTExMDQxODM1IC0+IC0wLjQ3NjI0MTE1NjMzMzA1NDE5IC0wLjg5OTY3ODg0MDIzMDU5NTk3Citsb2d0MDA2OSBsb2cxMCAtMC4xNTkxNzkxMzE2ODQzODY5OSAtMC4yNTIzODc5OTI1MTEzMjE3NyAtPiAtMC41MjUyMTMwNDY0MTY2NTk1NiAtMC45MjY1NTc5MDY0NTY4ODExOQorbG9ndDAwNzAgbG9nMTAgLTAuNjg5MDc4MTg1MzUwNzg4MDIgLTMuMDY5MzEwNTg1MzQ3NjM0NiAtPiAwLjQ5NzcxODc4ODUwNjY0NDggLTAuNzc4MDk5NTMxMTkzMjg4MjMKK2xvZ3QwMDcxIGxvZzEwIC0xNy4yNjgxMzM0NDc1NjU1ODkgNi44MTY1MTIwMDE0NjA0NzU2IC0+IDEuMjY4NjkxMjAwODA5ODUzNCAxLjIwMTA5NTQ2MjkxMDQyMDIKK2xvZ3QwMDcyIGxvZzEwIC0xLjcxNTM4OTQ0Nzk2OTAzMjggMjYuNDM0MDU1MzcyODAyNjM2IC0+IDEuNDIzMDc2MzA5MDMyNzUxIDAuNzEwMzMxNDU4NTkwMDUzMDkKK2xvZ3QwMDczIGxvZzEwIC04LjA0NTY3OTQ2NDg5MzY1NzhlLTA2IDAuMTk3MjI3NTgwNTc1NzAyMDggLT4gLTAuNzA1MDMyMzUyNDQ5ODc1NjEgMC42ODIyMDU4OTM0ODA1NTUxNgorbG9ndDAwNzQgbG9nMTAgLTIuNDMwNjQ0MjY5MTMyMzE3MyAwLjY4NDY5MTk3NTA3MDA5OTYgLT4gMC40MDIzMDI1Nzg0NTMzMjU5NSAxLjI0NTEyOTI1MzM3NDg5MjMKK2xvZ3QwMDc1IGxvZzEwIC0zLjU0ODgwNDkyNTA4ODgxOTQgMC40NTMyNDA0MDY0MzE4NTI1NCAtPiAwLjU1MzU5NTUzOTc3MTQxMDYzIDEuMzA5MjA4NTEwODg2NjQwNQorbG9ndDAwNzYgbG9nMTAgMC4xODQxODUxNjg1MTUxMDE4OSAtMC4yNjA2MjUxODgzNjIxMjYxNyAtPiAtMC40OTYwMjAxOTczMjkxMzYzOCAtMC40MTUwMDUwMzU1NjYwNDMwMQorbG9ndDAwNzcgbG9nMTAgMi43MTI0ODM3Nzk1NjM4Mzk5IC0xMy4xNDg3NjkwNjcxMzMzODcgLT4gMS4xMjc5MzQ4NjEzMzE3MDA4IC0wLjU5MzgzNjE2NjQzODAzMjE2Citsb2d0MDA3OCBsb2cxMCAzLjY1MjEyNzU0NzYxNjkxNDllLTEzIC0zLjc4MjA1NDMwMjMxNzA2NzNlLTA1IC0+IC00LjQyMjI3MjIzOTg5NDExMTIgLTAuNjgyMTg4MTcyNzI3MTcxMTQKK2xvZ3QwMDc5IGxvZzEwIDUuMDg3NzU0NTgxMzg2MjIzOSAtMS4yODM0OTc4MzI2Nzg2ODUyIC0+IDAuNzE5OTIzNzE4MDY0MjY4NDcgLTAuMTA3MzIxMDQzNTIxNTkyODMKK2xvZ3QwMDgwIGxvZzEwIDAuMjY0Nzc5ODY4MDg0NjE1MTIgLTAuNjc2NTkwMDExOTQxODc0MjkgLT4gLTAuMTM4NzMxMzk5MzUyODE2ODEgLTAuNTIwMTg2NDk2MzEzMDAyMjkKK2xvZ3QwMDgxIGxvZzEwIDAuMDAxNDc1NDI2MTM5ODA3MTk2MiA1LjM1MTQ2OTE2MDgyMDU0NDIgLT4gMC43Mjg0NzMwNDM1NDUyODgxOSAwLjY4MjA2ODQzOTgxNzgwMzMKK2xvZ3QwMDgyIGxvZzEwIDAuMjk2NjczMzQ0NjIxNTc4ODUgMC4wMDAyMDA1NjA0NTA0MjU4NDc5NSAtPiAtMC41Mjc3MjEzNzI5OTI5NjgwNiAwLjAwMDI5MzU5NjU5NDQyOTM3MjYxCitsb2d0MDA4MyBsb2cxMCAwLjgyMTA0MjMzNjcxMDk5NDI1IDMuOTAwNTM4NzEzMDEzMzEwMiAtPiAwLjYwMDUzODg5MDI4MzQ5MzYxIDAuNTkyMDg2OTAwMjExODQwMTgKK2xvZ3QwMDg0IGxvZzEwIDAuMjcyNjgxMzUzNTgxODA2NjcgMTI0LjQyMDg4MTEwOTQ1ODA0IC0+IDIuMDk0ODk0MzE1NTM4MDY5IDAuNjgxMjM2Mzc2NzM2NTY5ODkKK2xvZ3QwMDg1IGxvZzEwIDAuMDAyNjI4Njk1OTE2ODI2NzQ4NSAwLjQ3Nzk1ODA4MTgwNTczMDEzIC0+IC0wLjMyMDYwMzYyMjI2MTAwODE0IDAuNjc5Nzk5NjQ4MTY4NzcwODEKKworLS0gdmFsdWVzIG5lYXIgaW5maW5pdHkKK2xvZ3QwMTAwIGxvZzEwIDEuMDUxMjAyNTc0NDAwMzE3MmUrMzA4IDcuMjYyMTY2OTc1MDY2NDYxMWUrMzA3IC0+IDMwOC4xMDY0MTU2MjY4MjA2NSAwLjI2MjU1NDYxNDA4MjU2OTc1Citsb2d0MDEwMSBsb2cxMCA1LjUzNDQyNDkwMzQzNzIxMjZlKzMwNyAtMS4yMTU1ODU5MTU4NDMxMjc1ZSszMDggLT4gMzA4LjEyNTY5MTA2MDA5MjA5IC0wLjQ5NjYzODc4MjI5NjIxMgorbG9ndDAxMDIgbG9nMTAgLTEuMzE1NTU3NTQwMzQ2OTQwOGUrMzA4IDEuMTYxMDc5MzU0MTY2Mzg2NGUrMzA4IC0+IDMwOC4yNDQxOTA1MjA5MTAxOSAxLjA1MDMzNTk3Nzc3MDUyNjYKK2xvZ3QwMTAzIGxvZzEwIC0xLjYzMjM2NjcyMDk3MzIzNWUrMzA4IC0xLjU0Mjk5NDQ2MjExNDQ4ZSszMDggLT4gMzA4LjM1MTQ1MDA4MzQwOTMgLTEuMDM1NTAyNDkyNDM3ODIyMgorbG9ndDAxMDQgbG9nMTAgMC4wIDUuOTQ0OTI3NjY5MjMyNzcxMmUrMzA3IC0+IDMwNy43NzQxNDY1NzUwMTExNyAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDEwNSBsb2cxMCAtMC4wIDEuMTIwMTg1MDQ1OTAyNTY5MmUrMzA4IC0+IDMwOC4wNDkyODk3NzA2ODQ2NSAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDEwNiBsb2cxMCAwLjAgLTEuNjIxNDIyNTkzMzQ2NjUyOGUrMzA4IC0+IDMwOC4yMDk4OTYyMjAzMDE3NCAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDAxMDcgbG9nMTAgLTAuMCAtMS43NDUzMjY5NzkxNTkxMDU4ZSszMDggLT4gMzA4LjI0MTg3NjgwMjAzNTM5IC0wLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDEwOCBsb2cxMCAxLjQ0MDg2MDU3NzYwMTQyOGUrMzA4IDAuMCAtPiAzMDguMTU4NjIxOTU5MDg3NTUgMC4wCitsb2d0MDEwOSBsb2cxMCAxLjM5MTUxNTE3NjE0ODI4MmUrMzA4IC0wLjAgLT4gMzA4LjE0MzQ4Nzk0NzIwMDA3IC0wLjAKK2xvZ3QwMTEwIGxvZzEwIC0xLjIwMTM1NDQwMTI5NTI5NmUrMzA4IDAuMCAtPiAzMDguMDc5NjcxMTQzODA3NzMgMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MDExMSBsb2cxMCAtMS42NzA0MzM3ODI1OTc2ODA0ZSszMDggLTAuMCAtPiAzMDguMjIyODI5MjY0NTE2MjQgLTEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDAxMTIgbG9nMTAgNy4yMjc2OTc0NjU1MTkwMjIzZSszMDcgNy45NDg3OTcxMTM2OTE2NCAtPiAzMDcuODU4OTk5OTY1NzE5OTMgNC43NzYyMzU3ODAwODU4NDYzZS0zMDgKK2xvZ3QwMTEzIGxvZzEwIDEuMTIwNzg1OTU5MzcxNjA3NmUrMzA4IC02LjE5NTYyMDA4NjgyMjExNDcgLT4gMzA4LjA0OTUyMjY4MTY5NDU1IC0yLjQwMDc0NzA3Njc5NjM1OTdlLTMwOAorbG9ndDAxMTQgbG9nMTAgLTQuNjY3ODkzMzg3NDQ3MTA0NWUrMzA3IDkuOTQ3MTA3ODkzMjIwMzgyIC0+IDMwNy42NjkxMjA5MjgzOTkwMiAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMTE1IGxvZzEwIC0xLjUxMDgwMTI0NTM5NTAxNDJlKzMwOCAtNS4zMTE3MTk3MTc5Mzc1NjE5IC0+IDMwOC4xNzkyMDczMzQxNTY1IC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMTE2IGxvZzEwIDcuNDkwMzc1MDg3MTUwNDQzNSAxLjUzMjA3MDM3NzY2MjYzNTJlKzMwOCAtPiAzMDguMTg1Mjc4NzE1NjQxNTcgMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDAxMTcgbG9nMTAgNS45NzYwMzI1NTI1NjU0Nzc4IC04LjAxNDk0NzM5OTczNDkxMjNlKzMwNyAtPiAzMDcuOTAzOTAwNjc2NTI0MjQgLTAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMTE4IGxvZzEwIC03Ljg4MDE5NDIwNjM4NjYyOSAxLjc4NjE4NDU4MTQ3Njc0NDFlKzMwOCAtPiAzMDguMjUxOTI2MzM2MTczMzEgMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDAxMTkgbG9nMTAgLTkuODg2NDM4OTkzODUyODY1IC02LjE5MjM1NzgxMDgwNzQ3ZSszMDcgLT4gMzA3Ljc5MTg1NjA0MzA4MzM4IC0wLjY4MjE4ODE3NjkyMDkyMDcxCisKKy0tIHZhbHVlcyBuZWFyIDAKK2xvZ3QwMTIwIGxvZzEwIDIuMjk5Njg2NzU3OTIyNzc3OWUtMzA4IDYuNzg2MTg0MDc3MDkzOTEyNWUtMzEyIC0+IC0zMDcuNjM4MzMxMjk2NjI1NzIgMC4wMDAxMjgxNTY2ODA1NjM2MjMwNQorbG9ndDAxMjEgbG9nMTAgNi45MTY5MTkwNDE3Nzc0NTE2ZS0zMjMgLTkuMDQxNDAxMzE4ODk0ODExOGUtMzIyIC0+IC0zMjEuMDQyNDk3MDY3MjcxNDggLTAuNjQ5MDI4MDUzNTMzMDYwNTkKK2xvZ3QwMTIyIGxvZzEwIC0xLjUzNzgwNjQ5NjI5MTQwMTFlLTMxNiAxLjgyNDM2MjgzODkzNTQ2MzVlLTMxMCAtPiAtMzA5LjczODg4ODc4MjYzMjIyIDAuNjgyMTg4NTQyOTk5ODk0MjkKK2xvZ3QwMTIzIGxvZzEwIC0yLjMzMTk4OTg0ODM3MDY4MzdlLTMyMSAtMi4yMzU4NzYzOTQxODY2MzcxZS0zMTMgLT4gLTMxMi42NTA1NTIyMDkxOTY0MSAtMC42ODIxODgxODE0NTA1NTUzOAorbG9ndDAxMjQgbG9nMTAgMC4wIDMuODcyNzcwMTAxMDgxMTIxZS0zMTUgLT4gLTMxNC40MTE5NzgyODMyMzQ3NiAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MDEyNSBsb2cxMCAtMC4wIDkuNjM0MjgwMDkzOTA0MzA3NmUtMzIyIC0+IC0zMjEuMDE2MTgwNzMxNzUzMzEgMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDAxMjYgbG9nMTAgMC4wIC0yLjI2NjA5OTM5MzQyNzgzNGUtMzA4IC0+IC0zMDcuNjQ0NzIxMDQ1NDU2NDkgLTAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMTI3IGxvZzEwIC0wLjAgLTIuMTE4NDY5NTY3Mzc2NjYyNmUtMzE1IC0+IC0zMTQuNjczOTc3NzcwNDI0MDcgLTAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QwMTI4IGxvZzEwIDEuMTM2MzUwOTg1NDM0ODY3MWUtMzIyIDAuMCAtPiAtMzIxLjk0NDQ4NzUwNzA5ODE5IDAuMAorbG9ndDAxMjkgbG9nMTAgMy41NTcyNzI2NTAwNTY5NzUxZS0zMjIgLTAuMCAtPiAtMzIxLjQ0ODg4Mjg0NjY4NDUxIC0wLjAKK2xvZ3QwMTMwIGxvZzEwIC0yLjM2OTYwNzEwNzQwNDA1OTNlLTMxMCAwLjAgLT4gLTMwOS42MjUzMjM2NTYxOTcyMiAxLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QwMTMxIGxvZzEwIC0yLjgxMzI4Mzg5NzI2NjkzNGUtMzE3IC0wLjAgLT4gLTMxNi41NTA3ODY0Mzk2MTA0MiAtMS4zNjQzNzYzNTM4NDE4NDE0CisKKy0tIHZhbHVlcyBuZWFyIHRoZSB1bml0IGNpcmNsZQorbG9ndDAyMDAgbG9nMTAgLTAuNTk5OTk5OTk5OTk5OTk5OTggMC44MDAwMDAwMDAwMDAwMDAwNCAtPiA5LjY0MzI3NDY2NTUzMjg3MDllLTE4IDAuOTYxNjU3MTU3NTY4NDY4MTUKK2xvZ3QwMjAxIGxvZzEwIDAuNzk5OTk5OTk5OTk5OTk5OTMgMC42MDAwMDAwMDAwMDAwMDAwOSAtPiAyLjY3NjU0NjM5MTYxNDc2MjJlLTMzIDAuMjc5NDY4OTgwNjQ3NTQ3NgorCistLSBzcGVjaWFsIHZhbHVlcworbG9ndDEwMDAgbG9nMTAgLTAuMCAwLjAgLT4gLWluZiAxLjM2NDM3NjM1Mzg0MTg0MTQgICAgICAgICBkaXZpZGUtYnktemVybworbG9ndDEwMDEgbG9nMTAgMC4wIDAuMCAtPiAtaW5mIDAuMCAgICAgICAgICAgICAgICAgICAgICAgICBkaXZpZGUtYnktemVybworbG9ndDEwMDIgbG9nMTAgMC4wIGluZiAtPiBpbmYgMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDEwMDMgbG9nMTAgMi4zIGluZiAtPiBpbmYgMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDEwMDQgbG9nMTAgLTAuMCBpbmYgLT4gaW5mIDAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QxMDA1IGxvZzEwIC0yLjMgaW5mIC0+IGluZiAwLjY4MjE4ODE3NjkyMDkyMDcxCitsb2d0MTAwNiBsb2cxMCAwLjAgbmFuIC0+IG5hbiBuYW4KK2xvZ3QxMDA3IGxvZzEwIDIuMyBuYW4gLT4gbmFuIG5hbgorbG9ndDEwMDggbG9nMTAgLTAuMCBuYW4gLT4gbmFuIG5hbgorbG9ndDEwMDkgbG9nMTAgLTIuMyBuYW4gLT4gbmFuIG5hbgorbG9ndDEwMTAgbG9nMTAgLWluZiAwLjAgLT4gaW5mIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDEwMTEgbG9nMTAgLWluZiAyLjMgLT4gaW5mIDEuMzY0Mzc2MzUzODQxODQxNAorbG9ndDEwMTIgbG9nMTAgaW5mIDAuMCAtPiBpbmYgMC4wCitsb2d0MTAxMyBsb2cxMCBpbmYgMi4zIC0+IGluZiAwLjAKK2xvZ3QxMDE0IGxvZzEwIC1pbmYgaW5mIC0+IGluZiAxLjAyMzI4MjI2NTM4MTM4MTEKK2xvZ3QxMDE1IGxvZzEwIGluZiBpbmYgLT4gaW5mIDAuMzQxMDk0MDg4NDYwNDYwMzUKK2xvZ3QxMDE2IGxvZzEwIGluZiBuYW4gLT4gaW5mIG5hbgorbG9ndDEwMTcgbG9nMTAgLWluZiBuYW4gLT4gaW5mIG5hbgorbG9ndDEwMTggbG9nMTAgbmFuIDAuMCAtPiBuYW4gbmFuCitsb2d0MTAxOSBsb2cxMCBuYW4gMi4zIC0+IG5hbiBuYW4KK2xvZ3QxMDIwIGxvZzEwIG5hbiBpbmYgLT4gaW5mIG5hbgorbG9ndDEwMjEgbG9nMTAgbmFuIG5hbiAtPiBuYW4gbmFuCitsb2d0MTAyMiBsb2cxMCAtMC4wIC0wLjAgLT4gLWluZiAtMS4zNjQzNzYzNTM4NDE4NDE0ICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2d0MTAyMyBsb2cxMCAwLjAgLTAuMCAtPiAtaW5mIC0wLjAgICAgICAgICAgICAgICAgICAgICAgIGRpdmlkZS1ieS16ZXJvCitsb2d0MTAyNCBsb2cxMCAwLjAgLWluZiAtPiBpbmYgLTAuNjgyMTg4MTc2OTIwOTIwNzEKK2xvZ3QxMDI1IGxvZzEwIDIuMyAtaW5mIC0+IGluZiAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDEwMjYgbG9nMTAgLTAuMCAtaW5mIC0+IGluZiAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDEwMjcgbG9nMTAgLTIuMyAtaW5mIC0+IGluZiAtMC42ODIxODgxNzY5MjA5MjA3MQorbG9ndDEwMjggbG9nMTAgLWluZiAtMC4wIC0+IGluZiAtMS4zNjQzNzYzNTM4NDE4NDE0Citsb2d0MTAyOSBsb2cxMCAtaW5mIC0yLjMgLT4gaW5mIC0xLjM2NDM3NjM1Mzg0MTg0MTQKK2xvZ3QxMDMwIGxvZzEwIGluZiAtMC4wIC0+IGluZiAtMC4wCitsb2d0MTAzMSBsb2cxMCBpbmYgLTIuMyAtPiBpbmYgLTAuMAorbG9ndDEwMzIgbG9nMTAgLWluZiAtaW5mIC0+IGluZiAtMS4wMjMyODIyNjUzODEzODExCitsb2d0MTAzMyBsb2cxMCBpbmYgLWluZiAtPiBpbmYgLTAuMzQxMDk0MDg4NDYwNDYwMzUKK2xvZ3QxMDM0IGxvZzEwIG5hbiAtMC4wIC0+IG5hbiBuYW4KK2xvZ3QxMDM1IGxvZzEwIG5hbiAtMi4zIC0+IG5hbiBuYW4KK2xvZ3QxMDM2IGxvZzEwIG5hbiAtaW5mIC0+IGluZiBuYW4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gc3FydDogU3F1YXJlIHJvb3QgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHplcm9zCitzcXJ0MDAwMCBzcXJ0IDAuMCAwLjAgLT4gMC4wIDAuMAorc3FydDAwMDEgc3FydCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorc3FydDAwMDIgc3FydCAtMC4wIDAuMCAtPiAwLjAgMC4wCitzcXJ0MDAwMyBzcXJ0IC0wLjAgLTAuMCAtPiAwLjAgLTAuMAorCistLSB2YWx1ZXMgYWxvbmcgYm90aCBzaWRlcyBvZiByZWFsIGF4aXMKK3NxcnQwMDEwIHNxcnQgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IDAuMCAtPiAwLjAgMy4xNDM0NTU1Njk0MDUyNTc2ZS0xNjIKK3NxcnQwMDExIHNxcnQgLTkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gMC4wIC0zLjE0MzQ1NTU2OTQwNTI1NzZlLTE2Mgorc3FydDAwMTIgc3FydCAtMWUtMzA1IDAuMCAtPiAwLjAgMy4xNjIyNzc2NjAxNjgzNzkxZS0xNTMKK3NxcnQwMDEzIHNxcnQgLTFlLTMwNSAtMC4wIC0+IDAuMCAtMy4xNjIyNzc2NjAxNjgzNzkxZS0xNTMKK3NxcnQwMDE0IHNxcnQgLTFlLTE1MCAwLjAgLT4gMC4wIDkuOTk5OTk5OTk5OTk5OTk5NmUtNzYKK3NxcnQwMDE1IHNxcnQgLTFlLTE1MCAtMC4wIC0+IDAuMCAtOS45OTk5OTk5OTk5OTk5OTk2ZS03Ngorc3FydDAwMTYgc3FydCAtOS45OTk5OTk5OTk5OTk5OTk4ZS0xNyAwLjAgLT4gMC4wIDFlLTA4CitzcXJ0MDAxNyBzcXJ0IC05Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAgLT4gMC4wIC0xZS0wOAorc3FydDAwMTggc3FydCAtMC4wMDEgMC4wIC0+IDAuMCAwLjAzMTYyMjc3NjYwMTY4Mzc5MQorc3FydDAwMTkgc3FydCAtMC4wMDEgLTAuMCAtPiAwLjAgLTAuMDMxNjIyNzc2NjAxNjgzNzkxCitzcXJ0MDAyMCBzcXJ0IC0wLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAwLjAgMC43NjA5MjA0OTUxODk4NzE5Mworc3FydDAwMjEgc3FydCAtMC41Nzg5OTk5OTk5OTk5OTk5NiAtMC4wIC0+IDAuMCAtMC43NjA5MjA0OTUxODk4NzE5Mworc3FydDAwMjIgc3FydCAtMC45OTk5OTk5OTk5OTk5OTk4OSAwLjAgLT4gMC4wIDAuOTk5OTk5OTk5OTk5OTk5ODkKK3NxcnQwMDIzIHNxcnQgLTAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAwLjAgLTAuOTk5OTk5OTk5OTk5OTk5ODkKK3NxcnQwMDI0IHNxcnQgLTEuMDAwMDAwMDAwMDAwMDAwMiAwLjAgLT4gMC4wIDEuMAorc3FydDAwMjUgc3FydCAtMS4wMDAwMDAwMDAwMDAwMDAyIC0wLjAgLT4gMC4wIC0xLjAKK3NxcnQwMDI2IHNxcnQgLTEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gMC4wIDEuMDAwNDk5ODc1MDYyNDYxCitzcXJ0MDAyNyBzcXJ0IC0xLjAwMDk5OTk5OTk5OTk5OTkgLTAuMCAtPiAwLjAgLTEuMDAwNDk5ODc1MDYyNDYxCitzcXJ0MDAyOCBzcXJ0IC0yLjAgMC4wIC0+IDAuMCAxLjQxNDIxMzU2MjM3MzA5NTEKK3NxcnQwMDI5IHNxcnQgLTIuMCAtMC4wIC0+IDAuMCAtMS40MTQyMTM1NjIzNzMwOTUxCitzcXJ0MDAzMCBzcXJ0IC0yMy4wIDAuMCAtPiAwLjAgNC43OTU4MzE1MjMzMTI3MTkxCitzcXJ0MDAzMSBzcXJ0IC0yMy4wIC0wLjAgLT4gMC4wIC00Ljc5NTgzMTUyMzMxMjcxOTEKK3NxcnQwMDMyIHNxcnQgLTEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IDAuMCAxMDAwMDAwMDAuMAorc3FydDAwMzMgc3FydCAtMTAwMDAwMDAwMDAwMDAwMDAuMCAtMC4wIC0+IDAuMCAtMTAwMDAwMDAwLjAKK3NxcnQwMDM0IHNxcnQgLTkuOTk5OTk5OTk5OTk5OTk5OGUrMTQ5IDAuMCAtPiAwLjAgOS45OTk5OTk5OTk5OTk5OTkzZSs3NAorc3FydDAwMzUgc3FydCAtOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiAwLjAgLTkuOTk5OTk5OTk5OTk5OTk5M2UrNzQKK3NxcnQwMDM2IHNxcnQgLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IDAuMCAtPiAwLjAgMy4xNjIyNzc2NjAxNjgzNzk2ZSsxNDkKK3NxcnQwMDM3IHNxcnQgLTEuMDAwMDAwMDAwMDAwMDAwMWUrMjk5IC0wLjAgLT4gMC4wIC0zLjE2MjI3NzY2MDE2ODM3OTZlKzE0OQorc3FydDAwMzggc3FydCA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNCAwLjAgLT4gMy4xNDM0NTU1Njk0MDUyNTc2ZS0xNjIgMC4wCitzcXJ0MDAzOSBzcXJ0IDkuODgxMzEyOTE2ODI0OTMwOWUtMzI0IC0wLjAgLT4gMy4xNDM0NTU1Njk0MDUyNTc2ZS0xNjIgLTAuMAorc3FydDAwNDAgc3FydCAxZS0zMDUgMC4wIC0+IDMuMTYyMjc3NjYwMTY4Mzc5MWUtMTUzIDAuMAorc3FydDAwNDEgc3FydCAxZS0zMDUgLTAuMCAtPiAzLjE2MjI3NzY2MDE2ODM3OTFlLTE1MyAtMC4wCitzcXJ0MDA0MiBzcXJ0IDFlLTE1MCAwLjAgLT4gOS45OTk5OTk5OTk5OTk5OTk2ZS03NiAwLjAKK3NxcnQwMDQzIHNxcnQgMWUtMTUwIC0wLjAgLT4gOS45OTk5OTk5OTk5OTk5OTk2ZS03NiAtMC4wCitzcXJ0MDA0NCBzcXJ0IDkuOTk5OTk5OTk5OTk5OTk5OGUtMTcgMC4wIC0+IDFlLTA4IDAuMAorc3FydDAwNDUgc3FydCA5Ljk5OTk5OTk5OTk5OTk5OThlLTE3IC0wLjAgLT4gMWUtMDggLTAuMAorc3FydDAwNDYgc3FydCAwLjAwMSAwLjAgLT4gMC4wMzE2MjI3NzY2MDE2ODM3OTEgMC4wCitzcXJ0MDA0NyBzcXJ0IDAuMDAxIC0wLjAgLT4gMC4wMzE2MjI3NzY2MDE2ODM3OTEgLTAuMAorc3FydDAwNDggc3FydCAwLjU3ODk5OTk5OTk5OTk5OTk2IDAuMCAtPiAwLjc2MDkyMDQ5NTE4OTg3MTkzIDAuMAorc3FydDAwNDkgc3FydCAwLjU3ODk5OTk5OTk5OTk5OTk2IC0wLjAgLT4gMC43NjA5MjA0OTUxODk4NzE5MyAtMC4wCitzcXJ0MDA1MCBzcXJ0IDAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wIC0+IDAuOTk5OTk5OTk5OTk5OTk5ODkgMC4wCitzcXJ0MDA1MSBzcXJ0IDAuOTk5OTk5OTk5OTk5OTk5ODkgLTAuMCAtPiAwLjk5OTk5OTk5OTk5OTk5OTg5IC0wLjAKK3NxcnQwMDUyIHNxcnQgMS4wMDAwMDAwMDAwMDAwMDAyIDAuMCAtPiAxLjAgMC4wCitzcXJ0MDA1MyBzcXJ0IDEuMDAwMDAwMDAwMDAwMDAwMiAtMC4wIC0+IDEuMCAtMC4wCitzcXJ0MDA1NCBzcXJ0IDEuMDAwOTk5OTk5OTk5OTk5OSAwLjAgLT4gMS4wMDA0OTk4NzUwNjI0NjEgMC4wCitzcXJ0MDA1NSBzcXJ0IDEuMDAwOTk5OTk5OTk5OTk5OSAtMC4wIC0+IDEuMDAwNDk5ODc1MDYyNDYxIC0wLjAKK3NxcnQwMDU2IHNxcnQgMi4wIDAuMCAtPiAxLjQxNDIxMzU2MjM3MzA5NTEgMC4wCitzcXJ0MDA1NyBzcXJ0IDIuMCAtMC4wIC0+IDEuNDE0MjEzNTYyMzczMDk1MSAtMC4wCitzcXJ0MDA1OCBzcXJ0IDIzLjAgMC4wIC0+IDQuNzk1ODMxNTIzMzEyNzE5MSAwLjAKK3NxcnQwMDU5IHNxcnQgMjMuMCAtMC4wIC0+IDQuNzk1ODMxNTIzMzEyNzE5MSAtMC4wCitzcXJ0MDA2MCBzcXJ0IDEwMDAwMDAwMDAwMDAwMDAwLjAgMC4wIC0+IDEwMDAwMDAwMC4wIDAuMAorc3FydDAwNjEgc3FydCAxMDAwMDAwMDAwMDAwMDAwMC4wIC0wLjAgLT4gMTAwMDAwMDAwLjAgLTAuMAorc3FydDAwNjIgc3FydCA5Ljk5OTk5OTk5OTk5OTk5OThlKzE0OSAwLjAgLT4gOS45OTk5OTk5OTk5OTk5OTkzZSs3NCAwLjAKK3NxcnQwMDYzIHNxcnQgOS45OTk5OTk5OTk5OTk5OTk4ZSsxNDkgLTAuMCAtPiA5Ljk5OTk5OTk5OTk5OTk5OTNlKzc0IC0wLjAKK3NxcnQwMDY0IHNxcnQgMS4wMDAwMDAwMDAwMDAwMDAxZSsyOTkgMC4wIC0+IDMuMTYyMjc3NjYwMTY4Mzc5NmUrMTQ5IDAuMAorc3FydDAwNjUgc3FydCAxLjAwMDAwMDAwMDAwMDAwMDFlKzI5OSAtMC4wIC0+IDMuMTYyMjc3NjYwMTY4Mzc5NmUrMTQ5IC0wLjAKKworLS0gcmFuZG9tIGlucHV0cworc3FydDAxMDAgc3FydCAtMC4zNDI1MjU0MjU0MTU0OTkxMyAtMjIzMDM5ODgwLjE1MDc2MjExIC0+IDEwNTYwLjMwMDE4MDU4NzU5MiAtMTA1NjAuMzAwMTk2ODA1MTkyCitzcXJ0MDEwMSBzcXJ0IC0wLjg4NzkwNzkxMzkzMDE4OTA5IC01LjMzMDc3NTE3MzA4Mjc0MDIgLT4gMS41MDI3MTU0NjEzNjg5MDA0IC0xLjc3MzcxNDA4OTYzNDMyOTEKK3NxcnQwMTAyIHNxcnQgLTExMzkxNi44OTI5MTMxMDc2NyAtMC4wMTgxNDMzNzQ2MjYxNTM4NTggLT4gMi42ODc3ODE3ODc1MzUxMTc4ZS0wNSAtMzM3LjUxNTc2NjkxMDM4OTUyCitzcXJ0MDEwMyBzcXJ0IC0wLjYzMTg3MTcyMzg2MTk3MTIxIC0wLjI2MjkzOTEzMzY2NjE3Njk0IC0+IDAuMTYyMDU3MDc0OTUyNjYxNTMgLTAuODExMjU0NzE5MTg3NjE5NzEKK3NxcnQwMTA0IHNxcnQgLTAuMDU4MTg1MTY5MzA4OTA2MjE1IC0yLjM1NDgzMTI5OTA0MzA5OTEgLT4gMS4wNzE3NjYwMzQyNDIwMDcyIC0xLjA5ODU3NTI1OTgwODY5NjYKK3NxcnQwMTA1IHNxcnQgLTEuMDU4MDU4NDc2NTkzNTg5NiAwLjE0NDAwMzE5MjU5MTUxNzM2IC0+IDAuMDY5ODM3NDg5MjcwMTExMjQyIDEuMDMwOTg3NzU1MjYyNDY4CitzcXJ0MDEwNiBzcXJ0IC0xLjE2Njc1OTU5NDc1MDQ5MzIgMC4xMTE1OTcxMTQ3Mzk1MzY3OCAtPiAwLjA1MTU5ODUzMTMxOTMxNTI1MSAxLjA4MTM5ODE3MDUxMTEyMjkKK3NxcnQwMTA3IHNxcnQgLTAuNTEyMzcyODQxMTQ0OTkwNiAwLjAyNjE3NTQzMzY0ODMzOTA4NSAtPiAwLjAxODI3ODAyNjI2MjQxODcxOCAwLjcxNjAzNTU2MjkzNTk3NjE0CitzcXJ0MDEwOCBzcXJ0IC0zLjc0NTM0MDAwNjAwNjcyMjggMS4wOTQ2NTAwMzE0ODA5NjM1IC0+IDAuMjc5OTAwODg1NDE2OTI0OTggMS45NTU0MjQzODE0NzQyMzY3CitzcXJ0MDEwOSBzcXJ0IC0wLjAwMjc3MzYxMjE1NzUwOTc2NzMgMS4wMzY3OTQzMDAwODM5ODE3IC0+IDAuNzE5MDM1NjAzMzg3MTkxNzUgMC43MjA5NjE3MjY1MTI1MDU0NQorc3FydDAxMTAgc3FydCAxNTAxLjI1NTk2OTk0NTMxODggLTEuMTk5NzMyNTIwNzI4MzU4OSAtPiAzOC43NDYwNDc2NjQ3MzA5NTkgLTAuMDE1NDgxOTk4NzIwMzU1MDI0CitzcXJ0MDExMSBzcXJ0IDEuNDgzMDA3NTMyNjg1MDU3OCAtMC42NDEwMDg3ODQzNjc1NTM0OSAtPiAxLjI0NDcxMjgxNTc0MTA5NiAtMC4yNTc0OTI2NDI1ODQzNDU4NAorc3FydDAxMTIgc3FydCAwLjA5NTM5NTYxODQ5OTczNDYwMiAtMC40ODIyNjU2NTcwMTYzOTU5NSAtPiAwLjU0MTc1OTA0MDUzNDcyODc5IC0wLjQ0NTA5MjM5NDM0MjMxNTUxCitzcXJ0MDExMyBzcXJ0IDAuNTAxMDkxODU2ODE4NjMyNzcgLTAuNTQwNTQwMzczNzk4OTI1NjEgLT4gMC43ODY4MTc5ODU4MzMyMzg3IC0wLjM0MzQ5NzcyMzQ0NTIwOTc5CitzcXJ0MDExNCBzcXJ0IDAuOTg3Nzk4MDc1OTUzNjc4OTcgLTAuMDAwMTk4NDg3NTg0MzcyMjUxOTEgLT4gMC45OTM4ODAzMTc3MDY2NTE1MyAtOS45ODU0ODcyMjc5OTIxOTY4ZS0wNQorc3FydDAxMTUgc3FydCAxMS44NDU0NzIzODA3OTIyNTkgMC4wMDEwMDUxMTA0NTgxNTA2NzYxIC0+IDMuNDQxNzI1MjA3MjM0NTM5NyAwLjAwMDE0NjAxODQwNjEyMzQ2NDUxCitzcXJ0MDExNiBzcXJ0IDIuMzU1ODI0OTY4NjczNTk3NSAwLjI1NjA1MTU3MzcxNzQ0NDAzIC0+IDEuNTM3MTI3ODQ3NzM4NjY0NyAwLjA4MzI4ODk2NDU3NTc2MTQwNAorc3FydDAxMTcgc3FydCAwLjc3NTg0ODk0MTIzMTU5MDk4IDEuMDQ5NjQyMDYyNzAxNjA3NiAtPiAxLjAyMDA3NDQzODYzOTA4ODUgMC41MTQ0OTI4NzU2ODc1NjU1Mgorc3FydDAxMTggc3FydCAxLjg5NjE3MTU2Njk2MDQ4OTMgMC4zNDk0MDc5MzQ2NzE1ODg1NCAtPiAxLjM4Mjc5OTE3ODE0MTE2MTUgMC4xMjYzNDA4MDkzNTA2NjkwMgorc3FydDAxMTkgc3FydCAwLjk2MDI1Mzc4MzE2NTY1ODAxIDAuNjk1NzMyMjQ4NjAxNDA1MTUgLT4gMS4wMzU4NzEwMzQyMjA5OTk4IDAuMzM1ODE5OTE2NTgwOTM0NTcKKworLS0gdmFsdWVzIG5lYXIgMAorc3FydDAxMjAgc3FydCA3LjM1Nzc5MzgzNjUwODY4NjZlLTMxMyA4LjExODE0MDg0NjUxMTI3NDNlLTMxOSAtPiA4LjU3Nzc1ODM1MzE1NDM1MTZlLTE1NyA0LjczMjA4NzYzNDI1MTE2OGUtMTYzCitzcXJ0MDEyMSBzcXJ0IDEuMjQwNjg4Mzg3NDg5MjEwOGUtMzEwIC01LjEyMTAxMzMzMjQyNjk3NzZlLTMxMiAtPiAxLjExNDA5OTAwNTc0NjgwNTJlLTE1NSAtMi4yOTgyNzU2OTQ1MzQ5OTczZS0xNTcKK3NxcnQwMTIyIHNxcnQgLTcuMTE0NTQ1MzAwMTEzOTUwMmUtMzIyIDIuOTU2MTM3OTI0NDcwMzczNWUtMzE0IC0+IDEuMjE1NzU4NTgwNzQ4MDI4NmUtMTU3IDEuMjE1NzU4NjEwMDA3NzI0MmUtMTU3CitzcXJ0MDEyMyBzcXJ0IC00Ljk5NjMyNDQyMDY4MDEyMThlLTMxNCAtOC40NzE4NDI0NDIzNjkwMjI3ZS0zMTkgLT4gMS44OTUwNTgyMzEyNTQwNDM3ZS0xNjIgLTIuMjM1MjQ1OTQxOTU3ODk3MWUtMTU3CitzcXJ0MDEyNCBzcXJ0IDAuMCA3LjY5OTU1MzYwOTM4NTE5NWUtMzE4IC0+IDEuOTYyMDg0ODEwNzc5NzQ3NmUtMTU5IDEuOTYyMDg0ODEwNzc5NzQ3NmUtMTU5CitzcXJ0MDEyNSBzcXJ0IC0wLjAgMy4zOTAwODI2NjA2NDk5NDE1ZS0zMDkgLT4gNC4xMTcwODc5NjM5OTIyMzI3ZS0xNTUgNC4xMTcwODc5NjM5OTIyMzI3ZS0xNTUKK3NxcnQwMTI2IHNxcnQgMC4wIC05Ljg5MDc5ODk3NzIyNTA4MjhlLTMxOSAtPiA3LjAzMjM1MzQzODY1MjM0MmUtMTYwIC03LjAzMjM1MzQzODY1MjM0MmUtMTYwCitzcXJ0MDEyNyBzcXJ0IC0wLjAgLTEuMzcyMjkzOTM2NzU5MDkwOGUtMzE1IC0+IDIuNjE5NDQwNzE5NjU2NjcwMmUtMTU4IC0yLjYxOTQ0MDcxOTY1NjY3MDJlLTE1OAorc3FydDAxMjggc3FydCA3LjkwNTA1MDMzMzQ1OTk0NDdlLTMyMyAwLjAgLT4gOC44OTEwMzQ5OTc5NDAzMDk5ZS0xNjIgMC4wCitzcXJ0MDEyOSBzcXJ0IDEuODYyMzI0MTc2ODM0OTQ4NmUtMzA5IC0wLjAgLT4gNC4zMTU0NjU0MTczNTA2NTc5ZS0xNTUgLTAuMAorc3FydDAxMzAgc3FydCAtMi42NjU5NzExMzQ0OTk4ODdlLTMwOCAwLjAgLT4gMC4wIDEuNjMyNzgwMTg1NjAzNjQ5MWUtMTU0CitzcXJ0MDEzMSBzcXJ0IC0xLjU0NzcwNjY2OTQ0NjcyNDVlLTMxMCAtMC4wIC0+IDAuMCAtMS4yNDQwNjg1OTUxNTMzMDc3ZS0xNTUKKworLS0gaW5wdXRzIHdob3NlIGFic29sdXRlIHZhbHVlIG92ZXJmbG93cworc3FydDAxNDAgc3FydCAxLjY5OTk5OTk5OTk5OTk5OTllKzMwOCAtMS42OTk5OTk5OTk5OTk5OTk5ZSszMDggLT4gMS40MzI1MDg4MjMwMTU0NTczZSsxNTQgLTUuOTMzNjQ1ODI3MTIxMjIwN2UrMTUzCitzcXJ0MDE0MSBzcXJ0IC0xLjc5N2UrMzA4IC05Ljk5OTk5OTk5OTk5OTk5OTllKzMwNiAtPiAzLjcyODQ0NzY0MzIwNTczMDdlKzE1MiAtMS4zNDEwNDA2ODk5ODAyOTAxZSsxNTQKKworLS0gc3BlY2lhbCB2YWx1ZXMKK3NxcnQxMDAwIHNxcnQgMC4wIDAuMCAtPiAwLjAgMC4wCitzcXJ0MTAwMSBzcXJ0IC0wLjAgMC4wIC0+IDAuMCAwLjAKK3NxcnQxMDAyIHNxcnQgMC4wIGluZiAtPiBpbmYgaW5mCitzcXJ0MTAwMyBzcXJ0IDIuMyBpbmYgLT4gaW5mIGluZgorc3FydDEwMDQgc3FydCBpbmYgaW5mIC0+IGluZiBpbmYKK3NxcnQxMDA1IHNxcnQgLTAuMCBpbmYgLT4gaW5mIGluZgorc3FydDEwMDYgc3FydCAtMi4zIGluZiAtPiBpbmYgaW5mCitzcXJ0MTAwNyBzcXJ0IC1pbmYgaW5mIC0+IGluZiBpbmYKK3NxcnQxMDA4IHNxcnQgbmFuIGluZiAtPiBpbmYgaW5mCitzcXJ0MTAwOSBzcXJ0IDAuMCBuYW4gLT4gbmFuIG5hbgorc3FydDEwMTAgc3FydCAyLjMgbmFuIC0+IG5hbiBuYW4KK3NxcnQxMDExIHNxcnQgLTAuMCBuYW4gLT4gbmFuIG5hbgorc3FydDEwMTIgc3FydCAtMi4zIG5hbiAtPiBuYW4gbmFuCitzcXJ0MTAxMyBzcXJ0IC1pbmYgMC4wIC0+IDAuMCBpbmYKK3NxcnQxMDE0IHNxcnQgLWluZiAyLjMgLT4gMC4wIGluZgorc3FydDEwMTUgc3FydCBpbmYgMC4wIC0+IGluZiAwLjAKK3NxcnQxMDE2IHNxcnQgaW5mIDIuMyAtPiBpbmYgMC4wCitzcXJ0MTAxNyBzcXJ0IC1pbmYgbmFuIC0+IG5hbiBpbmYgICAgICAgaWdub3JlLWltYWctc2lnbgorc3FydDEwMTggc3FydCBpbmYgbmFuIC0+IGluZiBuYW4KK3NxcnQxMDE5IHNxcnQgbmFuIDAuMCAtPiBuYW4gbmFuCitzcXJ0MTAyMCBzcXJ0IG5hbiAyLjMgLT4gbmFuIG5hbgorc3FydDEwMjEgc3FydCBuYW4gbmFuIC0+IG5hbiBuYW4KK3NxcnQxMDIyIHNxcnQgMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3NxcnQxMDIzIHNxcnQgLTAuMCAtMC4wIC0+IDAuMCAtMC4wCitzcXJ0MTAyNCBzcXJ0IDAuMCAtaW5mIC0+IGluZiAtaW5mCitzcXJ0MTAyNSBzcXJ0IDIuMyAtaW5mIC0+IGluZiAtaW5mCitzcXJ0MTAyNiBzcXJ0IGluZiAtaW5mIC0+IGluZiAtaW5mCitzcXJ0MTAyNyBzcXJ0IC0wLjAgLWluZiAtPiBpbmYgLWluZgorc3FydDEwMjggc3FydCAtMi4zIC1pbmYgLT4gaW5mIC1pbmYKK3NxcnQxMDI5IHNxcnQgLWluZiAtaW5mIC0+IGluZiAtaW5mCitzcXJ0MTAzMCBzcXJ0IG5hbiAtaW5mIC0+IGluZiAtaW5mCitzcXJ0MTAzMSBzcXJ0IC1pbmYgLTAuMCAtPiAwLjAgLWluZgorc3FydDEwMzIgc3FydCAtaW5mIC0yLjMgLT4gMC4wIC1pbmYKK3NxcnQxMDMzIHNxcnQgaW5mIC0wLjAgLT4gaW5mIC0wLjAKK3NxcnQxMDM0IHNxcnQgaW5mIC0yLjMgLT4gaW5mIC0wLjAKK3NxcnQxMDM1IHNxcnQgbmFuIC0wLjAgLT4gbmFuIG5hbgorc3FydDEwMzYgc3FydCBuYW4gLTIuMyAtPiBuYW4gbmFuCisKKworLS0gRm9yIGV4cCwgY29zaCwgc2luaCwgdGFuaCB3ZSBsaW1pdCB0ZXN0cyB0byBhcmd1bWVudHMgd2hvc2UKKy0tIGltYWdpbmFyeSBwYXJ0IGlzIGxlc3MgdGhhbiAxMCBpbiBhYnNvbHV0ZSB2YWx1ZTogIG1vc3QgbWF0aAorLS0gbGlicmFyaWVzIGhhdmUgcG9vciBhY2N1cmFjeSBmb3IgKHJlYWwpIHNpbmUgYW5kIGNvc2luZSBmb3IKKy0tIGxhcmdlIGFyZ3VtZW50cywgYW5kIHRoZSBhY2N1cmFjeSBvZiB0aGVzZSBjb21wbGV4IGZ1bmN0aW9ucworLS0gc3VmZmVyIGNvcnJlc3BvbmRpbmdseS4KKy0tCistLSBTaW1pbGFybHksIGZvciBjb3MsIHNpbiBhbmQgdGFuIHdlIGxpbWl0IHRlc3RzIHRvIGFyZ3VtZW50cworLS0gd2l0aCByZWxhdGl2ZWx5IHNtYWxsIHJlYWwgcGFydC4KKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBleHA6IEV4cG9uZW50aWFsIGZ1bmN0aW9uIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHplcm9zCitleHAwMDAwIGV4cCAwLjAgMC4wIC0+IDEuMCAwLjAKK2V4cDAwMDEgZXhwIDAuMCAtMC4wIC0+IDEuMCAtMC4wCitleHAwMDAyIGV4cCAtMC4wIDAuMCAtPiAxLjAgMC4wCitleHAwMDAzIGV4cCAtMC4wIC0wLjAgLT4gMS4wIC0wLjAKKworLS0gcmFuZG9tIGlucHV0cworZXhwMDAwNCBleHAgLTE3Ljk1NzM1OTAwOTU2NDY4NCAtMS4xMDg2MTM4OTU3OTUyNzQgLT4gNy4wODY5MjkyNTc2MjI2NjExZS0wOSAtMS40MjI1OTI5MjAyMzc3ODMzZS0wOAorZXhwMDAwNSBleHAgLTEuNDQ1NjE0OTY2MzM2ODY0MmUtMTUgLTAuNzUzNTk4MTczMzE3NzIyMzkgLT4gMC43MjkyMzE0ODMyMzkxNzk5NyAtMC42ODQyNjcwODUxNzQxOTAzMworZXhwMDAwNiBleHAgLTAuNzYwMDg2NTQ4ODM1MTI2NjEgLTAuNDY2NTcyMzU0ODAxMDUwMTkgLT4gMC40MTc2NDM5MzEwOTkyODY2NiAtMC4yMTAzNTEwODM5Njc5Mjg1NAorZXhwMDAwNyBleHAgLTUuNzA3MTYxNDY5NzczNTczMSAtMi4zNzQ0MTYxODE4MTE1ODE2ZS0xMSAtPiAwLjAwMzMyMjA4OTAyNDIwNjgzNTYgLTcuODg4MDIxOTM2NDk1MzU3OGUtMTQKK2V4cDAwMDggZXhwIC0wLjQ2NTM5ODEzMjc5MjcwOTcgLTUuMjIzNjcwNjY2NzQ0NTU4N2UtMjEgLT4gMC42Mjc4ODUwNzM3ODIxNjY2MyAtMy4yNzk4NjQ4NDIwMDI2NDY4ZS0yMQorZXhwMDAwOSBleHAgLTMuMjQ0NDU2NTI0MjI5NTUxOCAxLjE1MzU2MjUzMDQyNDM5NTkgLT4gMC4wMTU3OTk5MzY5MzE0NTc2NDEgMC4wMzU2NDQ5NTAzODAwMjQ3NDkKK2V4cDAwMTAgZXhwIC0zLjA2NTE0NTYzMzc5Nzc3MjcgMC44Nzc2NTA4NjUzMjM5MTg3OCAtPiAwLjAyOTgwNTU5NTYyOTg1NTk1MyAwLjAzNTg4Mjc3NTE4MDg1NTY2OQorZXhwMDAxMSBleHAgLTAuMTEwODA4MjM3NTMyMzM5MjYgMC45NjQ4NjM4NjMwMDg3MzEwNiAtPiAwLjUwOTc5MTEyNTM0Mzc2MzE0IDAuNzM1NzU1MTI0MTk1NjE1NjIKK2V4cDAwMTIgZXhwIC0yLjU2Mjk3MjI1OTg5Mjg2NDggMC4wMTk2MzYyMzU3NTQ3MDgwNzkgLT4gMC4wNzcwNjA0NTI4NTM5MTczOTcgMC4wMDE1MTMzNzE3MzQxMTM3Njg0CitleHAwMDEzIGV4cCAtMy4zMjAxNzA5OTU3OTgzMzU3ZS0xMCAxLjI2ODQwMTczNDQ0ODcyNjggLT4gMC4yOTc4MDY5OTg1NTQzNDg4OSAwLjk1NDYyNjEwMDA3Njg5MTg2CitleHAwMDE0IGV4cCAwLjg4NzY3Mjc2MDU3OTkzMjcyIC0wLjE4OTUzNDIyOTg2ODk1NTU3IC0+IDIuMzg1OTYyNDA0OTg1ODA5NSAtMC40NTc3MTU1OTEzMjA0NDQyNgorZXhwMDAxNSBleHAgMS41NzM4MzMzNDg2Nzk0NzQyIC0yLjI1NzY4MDMwNzU1NDQzMjhlLTExIC0+IDQuODI1MTA5MTEzMjQ1ODY1NCAtMS4wODkzNTUzODI2Nzc2NjIzZS0xMAorZXhwMDAxNiBleHAgMS42NDA4NzAyMzQxODEzNzk1IC0xLjQzODg3OTQ4NDM4MDgzNyAtPiAwLjY3ODY3MzM1OTA2ODkwNDggLTUuMTE0ODI4NDE3MzE2ODgyNQorZXhwMDAxNyBleHAgMS44MjAyNzk0MjQyMDIwMzMgLTAuMDIwODEyMDQwMzcwNzg1NzIyIC0+IDYuMTcyMjQ2Mjg5NjQyMDkwMiAtMC4xMjg0NzU1ODg4NDM1MDUxCitleHAwMDE4IGV4cCAxLjcyNzM5NjU3MzU5NDU4NzMgLTAuNjExNDA2MjEzMjg5NTQ5NDcgLT4gNC42MDY3OTMxODk4Nzk5OTc2IC0zLjIyOTQyNjc2OTQ0NDEzMDgKK2V4cDAwMTkgZXhwIDIuNTYwNjAzNDMwNjg2Mjk5NSAwLjA5ODE1MzEzNjAwODQzNTUwNCAtPiAxMi44ODEzMjU4ODk5NjY2MjkgMS4yNjg0MTg0ODEyODY0NDk0CitleHAwMDIwIGV4cCAxMC4yODAzNjg2MTk0ODMwMjkgMy40NTY0NjIyNTU5NzQ4NTM1IC0+IC0yNzcyMS4yODMzMjE1NTE1MDIgLTkwMjguOTY2MzIxNTU2ODgzNQorZXhwMDAyMSBleHAgMS4xMDQwMDc0MDUxMjk3NDFlLTE1NSAwLjIxMjU4ODAzMDY3MzE3Mjc4IC0+IDAuOTc3NDg4MTM5MzM1MzE3NjQgMC4yMTA5OTAzNzI5MDU0NDQ3OAorZXhwMDAyMiBleHAgMC4wMjczNjQ3Nzc4MDkyOTUxNzIgMC4wMDA1OTIyNjYwMzUwMDYyMzM2MyAtPiAxLjAyNzc0MjQ1MTg0NTE4NzYgMC4wMDA2MDg2OTcwMTgxMzQ2NTc5CitleHAwMDIzIGV4cCAwLjk0MzU2MzEzNDI5MjU1MjQ1IDMuNDE4NTMwNDYzNTE4NTkyIC0+IC0yLjQ3MTIyODU2OTUzNDYxOTQgLTAuNzAyNDI2NTQ5MDAyMTgzNDkKKworLS0gY2FzZXMgd2hlcmUgZXhwKHopIHJlcHJlc2VudGFibGUsIGV4cCh6LnJlYWwpIG5vdAorZXhwMDAzMCBleHAgNzEwLjAgMC43ODUwMDAwMDAwMDAwMDAwMyAtPiAxLjU4MDMwMTY5MDk2MzcxNThlKzMwOCAxLjU3OTA0Mzc1NTE4MDY5MTFlKzMwOAorZXhwMDAzMSBleHAgNzEwLjAgLTAuNzg1MDAwMDAwMDAwMDAwMDMgLT4gMS41ODAzMDE2OTA5NjM3MTU4ZSszMDggLTEuNTc5MDQzNzU1MTgwNjkxMWUrMzA4CisKKy0tIHZhbHVlcyBmb3Igd2hpY2ggZXhwKHgpIGlzIHN1Ym5vcm1hbCwgb3IgdW5kZXJmbG93cyB0byAwCitleHAwMDQwIGV4cCAtNzM1LjAgMC43ODUwMDAwMDAwMDAwMDAwMyAtPiA0LjM5NzY3ODMxMzYzMjkzNTVlLTMyMCA0LjM5NDIxOTg1NDExMjA0NjhlLTMyMAorZXhwMDA0MSBleHAgLTczNS4wIC0yLjM1NTk5OTk5OTk5OTk5OTkgLT4gLTQuMzk1MjA3OTg1NDAzNzI5M2UtMzIwIC00LjM5NjY5MDE4MjM0MTI1M2UtMzIwCitleHAwMDQyIGV4cCAtNzQ1LjAgMC4wIC0+IDQuOTQwNjU2NDU4NDEyNDY1NGUtMzI0IDAuMAorZXhwMDA0MyBleHAgLTc0NS4wIDAuNyAtPiAwLjAgMC4wCitleHAwMDQ0IGV4cCAtNzQ1LjAgMi4xIC0+IC0wLjAgMC4wCitleHAwMDQ1IGV4cCAtNzQ1LjAgMy43IC0+IC0wLjAgLTAuMAorZXhwMDA0NiBleHAgLTc0NS4wIDUuMyAtPiAwLjAgLTAuMAorCistLSB2YWx1ZXMgZm9yIHdoaWNoIGV4cCh6KSBvdmVyZmxvd3MKK2V4cDAwNTAgZXhwIDcxMC4wIDAuMCAtPiBpbmYgMC4wICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cKK2V4cDAwNTEgZXhwIDcxMS4wIDAuNyAtPiBpbmYgaW5mICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmZsb3cKK2V4cDAwNTIgZXhwIDcxMC4wIDEuNSAtPiAxLjU4MDI2NTM4Mjk4NTczNzZlKzMwNyBpbmYgICAgb3ZlcmZsb3cKK2V4cDAwNTMgZXhwIDcxMC4wIDEuNiAtPiAtNi41MjMxNTc5OTk1NTAxMzcyZSszMDYgaW5mICAgb3ZlcmZsb3cKK2V4cDAwNTQgZXhwIDcxMC4wIDIuOCAtPiAtaW5mIDcuNDgzNjE3NzQxNzQ0ODUyOGUrMzA3ICAgb3ZlcmZsb3cKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2V4cDEwMDAgZXhwIDAuMCAwLjAgLT4gMS4wIDAuMAorZXhwMTAwMSBleHAgLTAuMCAwLjAgLT4gMS4wIDAuMAorZXhwMTAwMiBleHAgMC4wIGluZiAtPiBuYW4gbmFuICAgICAgICAgIGludmFsaWQKK2V4cDEwMDMgZXhwIDIuMyBpbmYgLT4gbmFuIG5hbiAgICAgICAgICBpbnZhbGlkCitleHAxMDA0IGV4cCAtMC4wIGluZiAtPiBuYW4gbmFuICAgICAgICAgaW52YWxpZAorZXhwMTAwNSBleHAgLTIuMyBpbmYgLT4gbmFuIG5hbiAgICAgICAgIGludmFsaWQKK2V4cDEwMDYgZXhwIDAuMCBuYW4gLT4gbmFuIG5hbgorZXhwMTAwNyBleHAgMi4zIG5hbiAtPiBuYW4gbmFuCitleHAxMDA4IGV4cCAtMC4wIG5hbiAtPiBuYW4gbmFuCitleHAxMDA5IGV4cCAtMi4zIG5hbiAtPiBuYW4gbmFuCitleHAxMDEwIGV4cCAtaW5mIDAuMCAtPiAwLjAgMC4wCitleHAxMDExIGV4cCAtaW5mIDEuNCAtPiAwLjAgMC4wCitleHAxMDEyIGV4cCAtaW5mIDIuOCAtPiAtMC4wIDAuMAorZXhwMTAxMyBleHAgLWluZiA0LjIgLT4gLTAuMCAtMC4wCitleHAxMDE0IGV4cCAtaW5mIDUuNiAtPiAwLjAgLTAuMAorZXhwMTAxNSBleHAgLWluZiA3LjAgLT4gMC4wIDAuMAorZXhwMTAxNiBleHAgaW5mIDAuMCAtPiBpbmYgMC4wCitleHAxMDE3IGV4cCBpbmYgMS40IC0+IGluZiBpbmYKK2V4cDEwMTggZXhwIGluZiAyLjggLT4gLWluZiBpbmYKK2V4cDEwMTkgZXhwIGluZiA0LjIgLT4gLWluZiAtaW5mCitleHAxMDIwIGV4cCBpbmYgNS42IC0+IGluZiAtaW5mCitleHAxMDIxIGV4cCBpbmYgNy4wIC0+IGluZiBpbmYKK2V4cDEwMjIgZXhwIC1pbmYgaW5mIC0+IDAuMCAwLjAgICAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK2V4cDEwMjMgZXhwIGluZiBpbmYgLT4gaW5mIG5hbiAgICAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK2V4cDEwMjQgZXhwIC1pbmYgbmFuIC0+IDAuMCAwLjAgICAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK2V4cDEwMjUgZXhwIGluZiBuYW4gLT4gaW5mIG5hbiAgICAgICAgICBpZ25vcmUtcmVhbC1zaWduCitleHAxMDI2IGV4cCBuYW4gMC4wIC0+IG5hbiAwLjAKK2V4cDEwMjcgZXhwIG5hbiAyLjMgLT4gbmFuIG5hbgorZXhwMTAyOCBleHAgbmFuIGluZiAtPiBuYW4gbmFuCitleHAxMDI5IGV4cCBuYW4gbmFuIC0+IG5hbiBuYW4KK2V4cDEwMzAgZXhwIDAuMCAtMC4wIC0+IDEuMCAtMC4wCitleHAxMDMxIGV4cCAtMC4wIC0wLjAgLT4gMS4wIC0wLjAKK2V4cDEwMzIgZXhwIDAuMCAtaW5mIC0+IG5hbiBuYW4gICAgICAgICBpbnZhbGlkCitleHAxMDMzIGV4cCAyLjMgLWluZiAtPiBuYW4gbmFuICAgICAgICAgaW52YWxpZAorZXhwMTAzNCBleHAgLTAuMCAtaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKK2V4cDEwMzUgZXhwIC0yLjMgLWluZiAtPiBuYW4gbmFuICAgICAgICBpbnZhbGlkCitleHAxMDM2IGV4cCAtaW5mIC0wLjAgLT4gMC4wIC0wLjAKK2V4cDEwMzcgZXhwIC1pbmYgLTEuNCAtPiAwLjAgLTAuMAorZXhwMTAzOCBleHAgLWluZiAtMi44IC0+IC0wLjAgLTAuMAorZXhwMTAzOSBleHAgLWluZiAtNC4yIC0+IC0wLjAgMC4wCitleHAxMDQwIGV4cCAtaW5mIC01LjYgLT4gMC4wIDAuMAorZXhwMTA0MSBleHAgLWluZiAtNy4wIC0+IDAuMCAtMC4wCitleHAxMDQyIGV4cCBpbmYgLTAuMCAtPiBpbmYgLTAuMAorZXhwMTA0MyBleHAgaW5mIC0xLjQgLT4gaW5mIC1pbmYKK2V4cDEwNDQgZXhwIGluZiAtMi44IC0+IC1pbmYgLWluZgorZXhwMTA0NSBleHAgaW5mIC00LjIgLT4gLWluZiBpbmYKK2V4cDEwNDYgZXhwIGluZiAtNS42IC0+IGluZiBpbmYKK2V4cDEwNDcgZXhwIGluZiAtNy4wIC0+IGluZiAtaW5mCitleHAxMDQ4IGV4cCAtaW5mIC1pbmYgLT4gMC4wIDAuMCAgICAgICAgaWdub3JlLXJlYWwtc2lnbiBpZ25vcmUtaW1hZy1zaWduCitleHAxMDQ5IGV4cCBpbmYgLWluZiAtPiBpbmYgbmFuICAgICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitleHAxMDUwIGV4cCBuYW4gLTAuMCAtPiBuYW4gLTAuMAorZXhwMTA1MSBleHAgbmFuIC0yLjMgLT4gbmFuIG5hbgorZXhwMTA1MiBleHAgbmFuIC1pbmYgLT4gbmFuIG5hbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjb3NoOiBIeXBlcmJvbGljIENvc2luZSAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK2Nvc2gwMDAwIGNvc2ggMC4wIDAuMCAtPiAxLjAgMC4wCitjb3NoMDAwMSBjb3NoIDAuMCAtMC4wIC0+IDEuMCAtMC4wCitjb3NoMDAwMiBjb3NoIC0wLjAgMC4wIC0+IDEuMCAtMC4wCitjb3NoMDAwMyBjb3NoIC0wLjAgLTAuMCAtPiAxLjAgMC4wCisKKy0tIHJhbmRvbSBpbnB1dHMKK2Nvc2gwMDA0IGNvc2ggLTAuODUzOTUyNjQyOTc0MTQyNTMgLTguODU1Mzc1NjE0ODY3MTk1OCAtPiAtMS4xNjg0MzQwMzQ4MDIxMTg1IDAuNTE4NDIxOTUzNTk3ODc0MzUKK2Nvc2gwMDA1IGNvc2ggLTE5LjU4NDkwNDIzNzIxMTIyMyAtMC4wNjY1ODI2Mjc5OTQ5MDYxNzcgLT4gMTU5ODE2ODEyLjIzMzM2OTkyIDEwNjU2Nzc2LjA1MDQwNjI0NgorY29zaDAwMDYgY29zaCAtMC4xMTA3MjYxODQwMTEzMDc3MiAtMS40ODQ4MjAyMTUwNzMyNDcgLT4gMC4wODYzOTcxNjQ3NDQ5NDk1MDMgMC4xMTA1NDI3NTYzNzcxNzI4NAorY29zaDAwMDcgY29zaCAtMy40NzY0ODQwMjUwNjgxNzUyIC0wLjQ4NDQwMzQ4Mjg4Mjc1Mjc2IC0+IDE0LjMyNTkzMTk1NTE5MDg0NCA3LjUyNDIwNTM1NDg3Mzc5NTUKK2Nvc2gwMDA4IGNvc2ggLTAuNTIwNDcwNjM2MDQ1MjQ2MDIgLTAuMzYwMzgwNTM4Mjc3NTU4NSAtPiAxLjA2NTM5NDAzNTQ2ODM4MDIgMC4xOTE5MzI5MzYwNjI1MjQ3MworY29zaDAwMDkgY29zaCAtMS4zOTUxODk2Mjk3NTk5NSAwLjAwNzQ3Mzg2MDQ3MDA3MDI5MDYgLT4gMi4xNDE3MDMxMDI3MjM1OTY5IC0wLjAxNDE1NTE4NzEyMjk2MzA4Citjb3NoMDAxMCBjb3NoIC0wLjM3MTA3MDY0NzU3NjUzNTQxIDAuMTQ3MjgwODUzMDc4NTY2MDkgLT4gMS4wNTgwNjAxNDk2Nzc2OTkxIC0wLjA1NTcxMjUzMTk2NDU2ODU4NworY29zaDAwMTEgY29zaCAtNS44NDcwMjAwOTU4NzM5NjUzIDQuMDAyMTcyMjM4ODMzNjI5MiAtPiAtMTEyLjg2MjIwNjY3NjE4Mjg1IDEzMS4yNDczNDAzMzU0NTAxMworY29zaDAwMTIgY29zaCAtMC4xNzAwMjYxNDQ0ODUxODgzIDAuOTcxNjc1NDAxMzUzNTQ1MTMgLT4gMC41NzIwODc0ODI1MzU3Nzk0NiAtMC4xNDEwOTA0ODIwMjQwMjAzCitjb3NoMDAxMyBjb3NoIC0wLjQ0MDQyMzk3OTAyNjQ4NzgzIDEuMDkwNDc5MTk2NDEzOTc0MiAtPiAwLjUwNzYwMzIyMzkzMDU4MTMzIC0wLjQwMzMzOTY2NjUyMDEwODE2Citjb3NoMDAxNCBjb3NoIDAuMDUyMjY3NTUyNDkxODY3Mjk5IC0zLjg4ODkwMTE0MzA2NDQxNzQgLT4gLTAuNzM0NTIzMDM0MTQ2MzkyOTcgMC4wMzU1NDA3MDQ4MzM1MzcxMzQKK2Nvc2gwMDE1IGNvc2ggMC45ODAwMDc2NDE3NzEyNzQ1MyAtMS4yNTQ4ODI5MjQ3Nzg0MDk3IC0+IDAuNDcyMjA3NDczNDE0MTYxNDIgLTEuMDg3OTQyMTQzMjE4MDMxNgorY29zaDAwMTYgY29zaCAwLjA4MzU5NDcwMTIyMjY0NDAwOCAtMC44ODg0Nzg5OTkzMDE4MTI4NCAtPiAwLjYzMjc5NzgyNDE5MzEyNjEzIC0wLjA2NDk1NDU2NjgxNjAwMjI4NQorY29zaDAwMTcgY29zaCAxLjM4MTczNTMxNzgzNzc2IC0wLjQzMTg1MDQwODE2NzMyMjI5IC0+IDEuOTIyMTY2MzM3NDY3MTY0NyAtMC43ODA3MzgzMDg1ODg0OTM0NworY29zaDAwMTggY29zaCAwLjU3MzE1NjgxMTIwMTQ4NDY1IC0wLjIyMjU1NzYwOTUxMDI3OTQyIC0+IDEuMTM5OTczMzEyNTE3MzAwNCAtMC4xMzM1NTEyMzQzNjA1OTU2Citjb3NoMDAxOSBjb3NoIDEuODg4MjUxMjMzMzA2MjM0NyA0LjUwMjQ5MzIxODIzODM3OTcgLT4gLTAuNzA0MTYwMjA2NTM2MjY5MSAtMy4xNTczODIyMTMxOTY0NjE1Citjb3NoMDAyMCBjb3NoIDAuNTYxODIxOTIwNjg1ODMxNyAwLjkyNjIwNDUyMTI5NTc1MzQ4IC0+IDAuNjk4MjIzODA0MDUzNzgzODEgMC40NzMwOTA2NzQ3MTA1NDUyMgorY29zaDAwMjEgY29zaCAwLjU0MzYxNDQyODQ3MDYyNTkxIDAuNjQxNzY0ODM1ODMwMTg0NjIgLT4gMC45MjIzNDQ2MjA3NDE5MzQ5MSAwLjM0MTY3OTA2NDk1ODQ1NTAxCitjb3NoMDAyMiBjb3NoIDAuMDAxNDc3NzQwMzEwNzkyMDMzMSAxLjM2ODIwMjgxMjI2Nzc2NjEgLT4gMC4yMDEyMTA2OTYzODk5NTQ5IDAuMDAxNDQ3NTE4MTM3ODYzMjE5Citjb3NoMDAyMyBjb3NoIDIuMjE4ODg1OTQ0MzYzNTAxIDIuMDAxNTcyNzM5NTg4MzY4NyAtPiAtMS45NDI5NDMyMTA4MTk2OCA0LjEyOTAyNjkxNzYwODMxOTYKKworLS0gbGFyZ2UgcmVhbCBwYXJ0Citjb3NoMDAzMCBjb3NoIDcxMC41IDIuMzUxOTk5OTk5OTk5OTk5OSAtPiAtMS4yOTY3NDY1MjM5MzU1OTk4ZSszMDggMS4zMDc2NzA3OTA4ODU3MzMzZSszMDgKK2Nvc2gwMDMxIGNvc2ggLTcxMC41IDAuNjk5OTk5OTk5OTk5OTk5OTYgLT4gMS40MDg1NDY2MzgxMzkyNDk5ZSszMDggLTEuMTg2NDAyNDY2NjQ1MDIzOWUrMzA4CisKKy0tIHNwZWNpYWwgdmFsdWVzCitjb3NoMTAwMCBjb3NoIDAuMCAwLjAgLT4gMS4wIDAuMAorY29zaDEwMDEgY29zaCAwLjAgaW5mIC0+IG5hbiAwLjAgICAgICAgIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorY29zaDEwMDIgY29zaCAwLjAgbmFuIC0+IG5hbiAwLjAgICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK2Nvc2gxMDAzIGNvc2ggMi4zIGluZiAtPiBuYW4gbmFuICAgICAgICBpbnZhbGlkCitjb3NoMTAwNCBjb3NoIDIuMyBuYW4gLT4gbmFuIG5hbgorY29zaDEwMDUgY29zaCBpbmYgMC4wIC0+IGluZiAwLjAKK2Nvc2gxMDA2IGNvc2ggaW5mIDEuNCAtPiBpbmYgaW5mCitjb3NoMTAwNyBjb3NoIGluZiAyLjggLT4gLWluZiBpbmYKK2Nvc2gxMDA4IGNvc2ggaW5mIDQuMiAtPiAtaW5mIC1pbmYKK2Nvc2gxMDA5IGNvc2ggaW5mIDUuNiAtPiBpbmYgLWluZgorY29zaDEwMTAgY29zaCBpbmYgNy4wIC0+IGluZiBpbmYKK2Nvc2gxMDExIGNvc2ggaW5mIGluZiAtPiBpbmYgbmFuICAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK2Nvc2gxMDEyIGNvc2ggaW5mIG5hbiAtPiBpbmYgbmFuCitjb3NoMTAxMyBjb3NoIG5hbiAwLjAgLT4gbmFuIDAuMCAgICAgICAgaWdub3JlLWltYWctc2lnbgorY29zaDEwMTQgY29zaCBuYW4gMi4zIC0+IG5hbiBuYW4KK2Nvc2gxMDE1IGNvc2ggbmFuIGluZiAtPiBuYW4gbmFuCitjb3NoMTAxNiBjb3NoIG5hbiBuYW4gLT4gbmFuIG5hbgorY29zaDEwMTcgY29zaCAwLjAgLTAuMCAtPiAxLjAgLTAuMAorY29zaDEwMTggY29zaCAwLjAgLWluZiAtPiBuYW4gMC4wICAgICAgIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorY29zaDEwMTkgY29zaCAyLjMgLWluZiAtPiBuYW4gbmFuICAgICAgIGludmFsaWQKK2Nvc2gxMDIwIGNvc2ggaW5mIC0wLjAgLT4gaW5mIC0wLjAKK2Nvc2gxMDIxIGNvc2ggaW5mIC0xLjQgLT4gaW5mIC1pbmYKK2Nvc2gxMDIyIGNvc2ggaW5mIC0yLjggLT4gLWluZiAtaW5mCitjb3NoMTAyMyBjb3NoIGluZiAtNC4yIC0+IC1pbmYgaW5mCitjb3NoMTAyNCBjb3NoIGluZiAtNS42IC0+IGluZiBpbmYKK2Nvc2gxMDI1IGNvc2ggaW5mIC03LjAgLT4gaW5mIC1pbmYKK2Nvc2gxMDI2IGNvc2ggaW5mIC1pbmYgLT4gaW5mIG5hbiAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK2Nvc2gxMDI3IGNvc2ggbmFuIC0wLjAgLT4gbmFuIDAuMCAgICAgICBpZ25vcmUtaW1hZy1zaWduCitjb3NoMTAyOCBjb3NoIG5hbiAtMi4zIC0+IG5hbiBuYW4KK2Nvc2gxMDI5IGNvc2ggbmFuIC1pbmYgLT4gbmFuIG5hbgorY29zaDEwMzAgY29zaCAtMC4wIC0wLjAgLT4gMS4wIDAuMAorY29zaDEwMzEgY29zaCAtMC4wIC1pbmYgLT4gbmFuIDAuMCAgICAgIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorY29zaDEwMzIgY29zaCAtMC4wIG5hbiAtPiBuYW4gMC4wICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK2Nvc2gxMDMzIGNvc2ggLTIuMyAtaW5mIC0+IG5hbiBuYW4gICAgICBpbnZhbGlkCitjb3NoMTAzNCBjb3NoIC0yLjMgbmFuIC0+IG5hbiBuYW4KK2Nvc2gxMDM1IGNvc2ggLWluZiAtMC4wIC0+IGluZiAwLjAKK2Nvc2gxMDM2IGNvc2ggLWluZiAtMS40IC0+IGluZiBpbmYKK2Nvc2gxMDM3IGNvc2ggLWluZiAtMi44IC0+IC1pbmYgaW5mCitjb3NoMTAzOCBjb3NoIC1pbmYgLTQuMiAtPiAtaW5mIC1pbmYKK2Nvc2gxMDM5IGNvc2ggLWluZiAtNS42IC0+IGluZiAtaW5mCitjb3NoMTA0MCBjb3NoIC1pbmYgLTcuMCAtPiBpbmYgaW5mCitjb3NoMTA0MSBjb3NoIC1pbmYgLWluZiAtPiBpbmYgbmFuICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitjb3NoMTA0MiBjb3NoIC1pbmYgbmFuIC0+IGluZiBuYW4KK2Nvc2gxMDQzIGNvc2ggLTAuMCAwLjAgLT4gMS4wIC0wLjAKK2Nvc2gxMDQ0IGNvc2ggLTAuMCBpbmYgLT4gbmFuIDAuMCAgICAgICBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK2Nvc2gxMDQ1IGNvc2ggLTIuMyBpbmYgLT4gbmFuIG5hbiAgICAgICBpbnZhbGlkCitjb3NoMTA0NiBjb3NoIC1pbmYgMC4wIC0+IGluZiAtMC4wCitjb3NoMTA0NyBjb3NoIC1pbmYgMS40IC0+IGluZiAtaW5mCitjb3NoMTA0OCBjb3NoIC1pbmYgMi44IC0+IC1pbmYgLWluZgorY29zaDEwNDkgY29zaCAtaW5mIDQuMiAtPiAtaW5mIGluZgorY29zaDEwNTAgY29zaCAtaW5mIDUuNiAtPiBpbmYgaW5mCitjb3NoMTA1MSBjb3NoIC1pbmYgNy4wIC0+IGluZiAtaW5mCitjb3NoMTA1MiBjb3NoIC1pbmYgaW5mIC0+IGluZiBuYW4gICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBzaW5oOiBIeXBlcmJvbGljIFNpbmUgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSB6ZXJvcworc2luaDAwMDAgc2luaCAwLjAgMC4wIC0+IDAuMCAwLjAKK3NpbmgwMDAxIHNpbmggMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3NpbmgwMDAyIHNpbmggLTAuMCAwLjAgLT4gLTAuMCAwLjAKK3NpbmgwMDAzIHNpbmggLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorCistLSByYW5kb20gaW5wdXRzCitzaW5oMDAwNCBzaW5oIC0xNy4yODI1ODgwOTE0NjI3NDIgLTAuMzgxODc5NDg2OTQxMDM1NDYgLT4gLTE0ODY3Mzg2Ljg1NzI0ODM5NiAtNTk3MDY0OC42NTUzNTE2NjM5CitzaW5oMDAwNSBzaW5oIC0zNDMuOTE5NzEyMDMxNDMyMDggLTUuMDE3Mjg2ODg3Nzc3MTUyNWUtMjIgLT4gLTEuMTUxODY5MTc3NjUyMTczNWUrMTQ5IC01Ljc3OTI1ODEyMTQ2ODkwMjFlKzEyNworc2luaDAwMDYgc2luaCAtMTQuMTc4MTIyMjUzMzAwOTIyIC0xLjkzODcxNTc1NzkzNTEyOTMgLT4gMjU4NDQwLjM3OTA5MDM0ODI2IC02NzA0NTIuNTg1MDA5NDY0NDEKK3NpbmgwMDA3IHNpbmggLTEuMDM0MzgxMDU4MTY4NjIzOSAtMS4wOTcwMjM1MjY2MzY5OTA1IC0+IC0wLjU2MDcwODU4Mjc4MDkyNzM5IC0xLjQwOTg4ODMyNTgwNDY2OTcKK3NpbmgwMDA4IHNpbmggLTAuMDY2MTI2NTYxNDE2MzY4MjA0IC0wLjA3MDQ2MTU4NDE2OTk2MTg3MiAtPiAtMC4wNjYwMTA1NTg3MDA5MzgxMjQgLTAuMDcwNTU3Mjc2NzM4NjM3NTQyCitzaW5oMDAwOSBzaW5oIC0wLjM3NjMwMTQ5MTUwMzA4NDg0IDMuMzYyMTczNDY5MjE2MjE3MyAtPiAwLjM3NTkxMTE4MTE5MzMyNjE3IC0wLjIzNDQ3MTE1OTI2MzY5MzgzCitzaW5oMDAxMCBzaW5oIC0wLjA0OTk0MTk2MDk3ODY3MDA1NSAwLjQwMzIzNzY3MDIwNDE0NjI1IC0+IC0wLjA0NTk1NTQ4MjEzNjMyOTAwOSAwLjM5Mjg4Nzg0OTQ0MzA2NDYKK3NpbmgwMDExIHNpbmggLTE2LjY0Nzg1MjYwMzkwMzcxNSAwLjAwMjY4NTIyMTkxMjkwODIwOTggLT4gLTg0OTI1NjYuNTczOTM4MjU2MSAyMjgwNC40ODA2NzExMzM1NjIKK3NpbmgwMDEyIHNpbmggLTEuNDc2NjI1MzE0MzAzNjk0IDAuODk0NzM3NzMxMTY2ODMzODYgLT4gLTEuMjk4Mjk0MzMzNDM4MjIyNCAxLjc5NjY1OTMzNjc3OTEyMDQKK3NpbmgwMDEzIHNpbmggLTQyMi4zNjQyOTU3NzU1NjkxMyAwLjEwMzY2NjM0NTAyMzA3OTEyIC0+IC0xLjM0MDAzMjEwMDg5MjAwNDRlKzE4MyAxLjM5NDE2MDA5NDgwNDU1OTllKzE4Mgorc2luaDAwMTQgc2luaCAwLjA5MTA4MzQwNzQ1NjQxOTgxIC0wLjQwNDA4MjI3NDE2MDcwMzUzIC0+IDAuMDgzODYzNzI0ODAyMjM3OTAyIC0wLjM5NDgwNzE2NTUzOTM1NjAyCitzaW5oMDAxNSBzaW5oIDIuMDM2MDY0MTMyMDY3Mzg2IC0yLjY4MzE3Mjk5NjEzODYyMzkgLT4gLTMuMzc2MjExMjQzNjMxNzUgLTEuNzIzODY4MzMwMDAyODE3CitzaW5oMDAxNiBzaW5oIDIuNTYxNjcxNzIyMzA2MzMxNyAtMC4wMDc4OTc4NDk4NjIyNzE3NzY3IC0+IDYuNDM5OTQxNTg1MzgxNTg2OSAtMC4wNTE0NzIyNjQ0MDA3MjIxMzMKK3NpbmgwMDE3IHNpbmggMC4zMzY4MDQwMTE5ODUxODggLTYuNTY1NDYyMjk3MTY0OTMzNyAtPiAwLjMyOTYyNDk5MzA3NTc0NTc4IC0wLjI5NDQ5MTcwMTU5OTk1MTk3CitzaW5oMDAxOCBzaW5oIDAuMjM3NzQ2MDM3NTU2NDk2OTMgLTAuOTI0NjcxOTU3OTkyMzIwNDkgLT4gMC4xNDQ0OTgzOTQ5MDYwMzM4OSAtMC44MjEwOTQ0OTA1MzU1Njc5Mworc2luaDAwMTkgc2luaCAwLjAwMTEzODgyNzM1NDE0NjU0OTQgMS45Njc2MTk2ODgyOTQ5ODU1IC0+IC0wLjAwMDQ0MDE0NjA1Mzg5NjM0OTk5IDAuOTIyMjkzOTg0MDcwOTg4MDYKK3NpbmgwMDIwIHNpbmggMy4yNDQzODcwMTA1NjYzNzU5IDAuODA1NDI4NzU1OTYxNjg5NSAtPiA4Ljg3MDI4OTA3Nzg1Mjc0MjYgOS4yNjEwNzQ4NTk3MDQyMTk2CitzaW5oMDAyMSBzaW5oIDAuMDQwNjI4OTA4ODU3MDU0NzM4IDAuMDk4MjA2MzkxMTkwOTQ0OTU4IC0+IDAuMDQwNDQ0MjY4NDE2NzEyMzMgMC4wOTgxMjk1NDQ3Mzk3MDczOTIKK3NpbmgwMDIyIHNpbmggNC43MjUyMjgzOTE4MjE3Njk2ZS0zMCA5LjExOTgxNTU2NDI2NTY2OTcgLT4gLTQuNTA3MTk4MDU2MTY0NDQwNGUtMzAgMC4zMDAyNTczMDcwMTY2MTcxMworc2luaDAwMjMgc2luaCAwLjA0MzcxMzY5MzY3ODQyMDA2OCAwLjIyNTEyNTQ5ODg3NTMyNjU3IC0+IDAuMDQyNjI0MTk4NjczNDE2NzEzIDAuMjIzNDQyMDEyMzEyMTc5NjEKKworLS0gbGFyZ2UgcmVhbCBwYXJ0CitzaW5oMDAzMCBzaW5oIDcxMC41IC0yLjM5OTk5OTk5OTk5OTk5OTkgLT4gLTEuMzU3OTk3MDU2NDg4NTkxOWUrMzA4IC0xLjI0Mzk0NDcwOTA3Nzk4ZSszMDgKK3NpbmgwMDMxIHNpbmggLTcxMC41IDAuODAwMDAwMDAwMDAwMDAwMDQgLT4gLTEuMjgzMDY3MTYwMTczNTE2NGUrMzA4IDEuMzIxMDk1NDE5Mzk5NzY3OGUrMzA4CisKKy0tIHNwZWNpYWwgdmFsdWVzCitzaW5oMTAwMCBzaW5oIDAuMCAwLjAgLT4gMC4wIDAuMAorc2luaDEwMDEgc2luaCAwLjAgaW5mIC0+IDAuMCBuYW4gICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorc2luaDEwMDIgc2luaCAwLjAgbmFuIC0+IDAuMCBuYW4gICAgICAgIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDAzIHNpbmggMi4zIGluZiAtPiBuYW4gbmFuICAgICAgICBpbnZhbGlkCitzaW5oMTAwNCBzaW5oIDIuMyBuYW4gLT4gbmFuIG5hbgorc2luaDEwMDUgc2luaCBpbmYgMC4wIC0+IGluZiAwLjAKK3NpbmgxMDA2IHNpbmggaW5mIDEuNCAtPiBpbmYgaW5mCitzaW5oMTAwNyBzaW5oIGluZiAyLjggLT4gLWluZiBpbmYKK3NpbmgxMDA4IHNpbmggaW5mIDQuMiAtPiAtaW5mIC1pbmYKK3NpbmgxMDA5IHNpbmggaW5mIDUuNiAtPiBpbmYgLWluZgorc2luaDEwMTAgc2luaCBpbmYgNy4wIC0+IGluZiBpbmYKK3NpbmgxMDExIHNpbmggaW5mIGluZiAtPiBpbmYgbmFuICAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDEyIHNpbmggaW5mIG5hbiAtPiBpbmYgbmFuICAgICAgICBpZ25vcmUtcmVhbC1zaWduCitzaW5oMTAxMyBzaW5oIG5hbiAwLjAgLT4gbmFuIDAuMAorc2luaDEwMTQgc2luaCBuYW4gMi4zIC0+IG5hbiBuYW4KK3NpbmgxMDE1IHNpbmggbmFuIGluZiAtPiBuYW4gbmFuCitzaW5oMTAxNiBzaW5oIG5hbiBuYW4gLT4gbmFuIG5hbgorc2luaDEwMTcgc2luaCAwLjAgLTAuMCAtPiAwLjAgLTAuMAorc2luaDEwMTggc2luaCAwLjAgLWluZiAtPiAwLjAgbmFuICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorc2luaDEwMTkgc2luaCAyLjMgLWluZiAtPiBuYW4gbmFuICAgICAgIGludmFsaWQKK3NpbmgxMDIwIHNpbmggaW5mIC0wLjAgLT4gaW5mIC0wLjAKK3NpbmgxMDIxIHNpbmggaW5mIC0xLjQgLT4gaW5mIC1pbmYKK3NpbmgxMDIyIHNpbmggaW5mIC0yLjggLT4gLWluZiAtaW5mCitzaW5oMTAyMyBzaW5oIGluZiAtNC4yIC0+IC1pbmYgaW5mCitzaW5oMTAyNCBzaW5oIGluZiAtNS42IC0+IGluZiBpbmYKK3NpbmgxMDI1IHNpbmggaW5mIC03LjAgLT4gaW5mIC1pbmYKK3NpbmgxMDI2IHNpbmggaW5mIC1pbmYgLT4gaW5mIG5hbiAgICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDI3IHNpbmggbmFuIC0wLjAgLT4gbmFuIC0wLjAKK3NpbmgxMDI4IHNpbmggbmFuIC0yLjMgLT4gbmFuIG5hbgorc2luaDEwMjkgc2luaCBuYW4gLWluZiAtPiBuYW4gbmFuCitzaW5oMTAzMCBzaW5oIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKK3NpbmgxMDMxIHNpbmggLTAuMCAtaW5mIC0+IDAuMCBuYW4gICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDMyIHNpbmggLTAuMCBuYW4gLT4gMC4wIG5hbiAgICAgICBpZ25vcmUtcmVhbC1zaWduCitzaW5oMTAzMyBzaW5oIC0yLjMgLWluZiAtPiBuYW4gbmFuICAgICAgaW52YWxpZAorc2luaDEwMzQgc2luaCAtMi4zIG5hbiAtPiBuYW4gbmFuCitzaW5oMTAzNSBzaW5oIC1pbmYgLTAuMCAtPiAtaW5mIC0wLjAKK3NpbmgxMDM2IHNpbmggLWluZiAtMS40IC0+IC1pbmYgLWluZgorc2luaDEwMzcgc2luaCAtaW5mIC0yLjggLT4gaW5mIC1pbmYKK3NpbmgxMDM4IHNpbmggLWluZiAtNC4yIC0+IGluZiBpbmYKK3NpbmgxMDM5IHNpbmggLWluZiAtNS42IC0+IC1pbmYgaW5mCitzaW5oMTA0MCBzaW5oIC1pbmYgLTcuMCAtPiAtaW5mIC1pbmYKK3NpbmgxMDQxIHNpbmggLWluZiAtaW5mIC0+IGluZiBuYW4gICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK3NpbmgxMDQyIHNpbmggLWluZiBuYW4gLT4gaW5mIG5hbiAgICAgICBpZ25vcmUtcmVhbC1zaWduCitzaW5oMTA0MyBzaW5oIC0wLjAgMC4wIC0+IC0wLjAgMC4wCitzaW5oMTA0NCBzaW5oIC0wLjAgaW5mIC0+IDAuMCBuYW4gICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitzaW5oMTA0NSBzaW5oIC0yLjMgaW5mIC0+IG5hbiBuYW4gICAgICAgaW52YWxpZAorc2luaDEwNDYgc2luaCAtaW5mIDAuMCAtPiAtaW5mIDAuMAorc2luaDEwNDcgc2luaCAtaW5mIDEuNCAtPiAtaW5mIGluZgorc2luaDEwNDggc2luaCAtaW5mIDIuOCAtPiBpbmYgaW5mCitzaW5oMTA0OSBzaW5oIC1pbmYgNC4yIC0+IGluZiAtaW5mCitzaW5oMTA1MCBzaW5oIC1pbmYgNS42IC0+IC1pbmYgLWluZgorc2luaDEwNTEgc2luaCAtaW5mIDcuMCAtPiAtaW5mIGluZgorc2luaDEwNTIgc2luaCAtaW5mIGluZiAtPiBpbmYgbmFuICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gdGFuaDogSHlwZXJib2xpYyBUYW5nZW50IC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK3RhbmgwMDAwIHRhbmggMC4wIDAuMCAtPiAwLjAgMC4wCit0YW5oMDAwMSB0YW5oIDAuMCAtMC4wIC0+IDAuMCAtMC4wCit0YW5oMDAwMiB0YW5oIC0wLjAgMC4wIC0+IC0wLjAgMC4wCit0YW5oMDAwMyB0YW5oIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKKworLS0gcmFuZG9tIGlucHV0cwordGFuaDAwMDQgdGFuaCAtMjEuMjAwNTAwNDUwNjY0OTkzIC0xLjY5NzA3Mjk0ODAzNDI5OTYgLT4gLTEuMCAxLjkyNDEzNTIzNDQ4NDkzOTllLTE5Cit0YW5oMDAwNSB0YW5oIC0wLjM0MTU4NzcxNTA0MjUxOTI4IC04LjA4NDg1MDQ5NTE3NDcxMzEgLT4gLTIuMTIzNzExMjI1ODU1NjEzIDEuMjgyNzUyNjc4MjAyNjAwNgordGFuaDAwMDYgdGFuaCAtMTUuNDU0MTQ0NzI1MTkzNjg5IC0wLjIzNjE5NTgyMjg4MjY1NjE3IC0+IC0wLjk5OTk5OTk5OTk5OTkzMjgzIC0zLjQzMzY2ODQyNDgyNjAwMzZlLTE0Cit0YW5oMDAwNyB0YW5oIC03LjYxMDMxNjMxMTk2NjE5NTIgLTAuNzgwMjc0ODMyMDMwNzAwOCAtPiAtMC45OTk5OTk5OTQ5NzIxOTQzOCAtNC45MDY0ODQ1MzQzNzU1NDM3ZS0wNwordGFuaDAwMDggdGFuaCAtMC4xNTM3NDcxNzIzNTc5MjEyOSAtMC42MzUxMDg2MzI3MzA2MTM4IC0+IC0wLjIzMjQ2MDgxNzAzNTYxODY5IC0wLjcxMDgzNDY3NDMzOTEwMjE5Cit0YW5oMDAwOSB0YW5oIC0wLjQ5MTAxMTE1NDc0MzkyNDY1IDAuMDk3MjMwMDEyNjQ4ODYzMDEgLT4gLTAuNDU4NDQ0NDU3MTU0OTIxMzMgMC4wNzcxOTExNTg1NDE4MDU4ODgKK3RhbmgwMDEwIHRhbmggLTAuMTA2OTA2MTIxNTc2NjQ0OTEgMi44NjE2MTI4MDA4NTYzOTUgLT4gLTAuMTE1MTk3NjE2MjYyNTczNTggLTAuMjg0MDA0ODgzNTU2NDc1MDcKK3RhbmgwMDExIHRhbmggLTAuOTE1MDU3NzQxOTIwNjY3MDIgMS41NDMxMTc0NTk3NzI3MDA3IC0+IC0xLjM4MTEwOTg5MzA2ODExNCAwLjAyNTE2MDgxOTY2MzcwOTM1NgordGFuaDAwMTIgdGFuaCAtMC4wNTc0MzMzNjcwOTM3OTIyMjMgMC4zNTQ5MTE1OTU0MTI0NjQ1OSAtPiAtMC4wNjUyMjA0OTkwNDY2OTY5NTMgMC4zNjkyMTc4ODMzMjM2OTQ5OAordGFuaDAwMTMgdGFuaCAtMS4zNTQwNDE4NjIxMjMzNTE0IDAuMTg5Njk0MTU2NDIyNDI1MzUgLT4gLTAuODgyMzU2NDI4NjExNTEzODcgMC4wNDM3NjQwNjk5ODQ0MTE3MjEKK3RhbmgwMDE0IHRhbmggMC45NDg2NDc4Mzk2MTAwMzUyOSAtMC4xMTMzMzY4OTU3ODg2NzcxNyAtPiAwLjc0MzQ4NDAxODYxODYxMzY4IC0wLjA1MTI3MTA0MjU0Mzg1NTIyMQordGFuaDAwMTUgdGFuaCAxLjk1OTE2OTgxMzM4NDU0ODggLTAuMDAyOTY1NDQ0NDkwNDU3ODMzOSAtPiAwLjk2MTAyNzA3NzY5NjgxMzUgLTAuMDAwMjI2NjQyNDAwNDkyMTI5MzMKK3RhbmgwMDE2IHRhbmggMS4wOTQ5NzE1Nzk2NjY5MTk3IC0wLjI0NzA2NjQyODUzOTg0NDU2IC0+IDAuODE2MzY1NzQ1MDEzNjkzODYgLTAuMDg3NzY3NDM2OTE0MTQ5OTU0Cit0YW5oMDAxNyB0YW5oIDU3NzA0MjguMjExMzczMTA0NyAtMy43MTYwNTgwMzM5ODMzMTY1IC0+IDEuMCAtMC4wCit0YW5oMDAxOCB0YW5oIDEuNTU3Njc4MjMyMTM5OTYyOSAtMS4wMzU3OTQzNzg3OTY2NDY4IC0+IDEuMDQwMzAwMjM4NDg5NTM4OCAtMC4wODExMjYzNDc4OTQ2NzE0NjMKK3RhbmgwMDE5IHRhbmggMC42MjM3ODUzNjIzMDU1Mjk2MSAyLjM0NzEzOTM1Nzk1NjAyMTYgLT4gMC44NTU4MjQ5OTIzODk2MDM2MyAtMC41MzU2OTQ3MzY0Njg0Mjg2OQordGFuaDAwMjAgdGFuaCAxNy40MDA2Mjg2MDI1MDgwMjUgOS4zOTg3MDU5NTMzODQxOTc5IC0+IDAuOTk5OTk5OTk5OTk5OTk4NDUgLTguMDE3NTg2NzcyMDUzMDgzMmUtMTcKK3RhbmgwMDIxIHRhbmggMC4xNTAyNjE3NzUwOTg3MTg5NiAwLjUwNjMwMzQ5MTU5NTA1NDcyIC0+IDAuMTkzNjc1MzY1NzE4Mjc3NjggMC41Mzg0OTg0Nzg1ODg1MzY2MQordGFuaDAwMjIgdGFuaCAwLjU3NDMzOTc3NTMwNzExMTY3IDEuMDA3MTYwNDU0NjI2NTYyNyAtPiAxLjA4NTc4NDgxNTkyNjI4NDQgMC42OTEzOTIxMzk1NTg3MjIxNAordGFuaDAwMjMgdGFuaCAwLjE2MjkxMTgxNTAwNDQ5NDU2IDAuMDA2OTcyODEwMjQxNTY3NTQ0IC0+IDAuMTYxNDkzMzU5MDc1NTExNTcgMC4wMDY3OTEwNzcyOTAzNDY3ODE3CisKKy0tIGxhcmdlIHJlYWwgcGFydAordGFuaDAwMzAgdGFuaCA3MTAgMC4xMyAtPiAxLjAgMC4wCit0YW5oMDAzMSB0YW5oIC03MTEgNy40MDAwMDAwMDAwMDAwMDA0IC0+IC0xLjAgMC4wCit0YW5oMDAzMiB0YW5oIDEwMDAgLTIuMzE5OTk5OTk5OTk5OTk5OCAtPiAxLjAgMC4wCit0YW5oMDAzMyB0YW5oIC0xLjAwMDAwMDAwMDAwMDAwMDFlKzMwMCAtOS42Njk5OTk5OTk5OTk5OTk5IC0+IC0xLjAgLTAuMAorCistLXNwZWNpYWwgdmFsdWVzCit0YW5oMTAwMCB0YW5oIDAuMCAwLjAgLT4gMC4wIDAuMAordGFuaDEwMDEgdGFuaCAwLjAgaW5mIC0+IG5hbiBuYW4gICAgICAgIGludmFsaWQKK3RhbmgxMDAyIHRhbmggMi4zIGluZiAtPiBuYW4gbmFuICAgICAgICBpbnZhbGlkCit0YW5oMTAwMyB0YW5oIDAuMCBuYW4gLT4gbmFuIG5hbgordGFuaDEwMDQgdGFuaCAyLjMgbmFuIC0+IG5hbiBuYW4KK3RhbmgxMDA1IHRhbmggaW5mIDAuMCAtPiAxLjAgMC4wCit0YW5oMTAwNiB0YW5oIGluZiAwLjcgLT4gMS4wIDAuMAordGFuaDEwMDcgdGFuaCBpbmYgMS40IC0+IDEuMCAwLjAKK3RhbmgxMDA4IHRhbmggaW5mIDIuMSAtPiAxLjAgLTAuMAordGFuaDEwMDkgdGFuaCBpbmYgMi44IC0+IDEuMCAtMC4wCit0YW5oMTAxMCB0YW5oIGluZiAzLjUgLT4gMS4wIDAuMAordGFuaDEwMTEgdGFuaCBpbmYgaW5mIC0+IDEuMCAwLjAgICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK3RhbmgxMDEyIHRhbmggaW5mIG5hbiAtPiAxLjAgMC4wICAgICAgICBpZ25vcmUtaW1hZy1zaWduCit0YW5oMTAxMyB0YW5oIG5hbiAwLjAgLT4gbmFuIDAuMAordGFuaDEwMTQgdGFuaCBuYW4gMi4zIC0+IG5hbiBuYW4KK3RhbmgxMDE1IHRhbmggbmFuIGluZiAtPiBuYW4gbmFuCit0YW5oMTAxNiB0YW5oIG5hbiBuYW4gLT4gbmFuIG5hbgordGFuaDEwMTcgdGFuaCAwLjAgLTAuMCAtPiAwLjAgLTAuMAordGFuaDEwMTggdGFuaCAwLjAgLWluZiAtPiBuYW4gbmFuICAgICAgIGludmFsaWQKK3RhbmgxMDE5IHRhbmggMi4zIC1pbmYgLT4gbmFuIG5hbiAgICAgICBpbnZhbGlkCit0YW5oMTAyMCB0YW5oIGluZiAtMC4wIC0+IDEuMCAtMC4wCit0YW5oMTAyMSB0YW5oIGluZiAtMC43IC0+IDEuMCAtMC4wCit0YW5oMTAyMiB0YW5oIGluZiAtMS40IC0+IDEuMCAtMC4wCit0YW5oMTAyMyB0YW5oIGluZiAtMi4xIC0+IDEuMCAwLjAKK3RhbmgxMDI0IHRhbmggaW5mIC0yLjggLT4gMS4wIDAuMAordGFuaDEwMjUgdGFuaCBpbmYgLTMuNSAtPiAxLjAgLTAuMAordGFuaDEwMjYgdGFuaCBpbmYgLWluZiAtPiAxLjAgMC4wICAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK3RhbmgxMDI3IHRhbmggbmFuIC0wLjAgLT4gbmFuIC0wLjAKK3RhbmgxMDI4IHRhbmggbmFuIC0yLjMgLT4gbmFuIG5hbgordGFuaDEwMjkgdGFuaCBuYW4gLWluZiAtPiBuYW4gbmFuCit0YW5oMTAzMCB0YW5oIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKK3RhbmgxMDMxIHRhbmggLTAuMCAtaW5mIC0+IG5hbiBuYW4gICAgICBpbnZhbGlkCit0YW5oMTAzMiB0YW5oIC0yLjMgLWluZiAtPiBuYW4gbmFuICAgICAgaW52YWxpZAordGFuaDEwMzMgdGFuaCAtMC4wIG5hbiAtPiBuYW4gbmFuCit0YW5oMTAzNCB0YW5oIC0yLjMgbmFuIC0+IG5hbiBuYW4KK3RhbmgxMDM1IHRhbmggLWluZiAtMC4wIC0+IC0xLjAgLTAuMAordGFuaDEwMzYgdGFuaCAtaW5mIC0wLjcgLT4gLTEuMCAtMC4wCit0YW5oMTAzNyB0YW5oIC1pbmYgLTEuNCAtPiAtMS4wIC0wLjAKK3RhbmgxMDM4IHRhbmggLWluZiAtMi4xIC0+IC0xLjAgMC4wCit0YW5oMTAzOSB0YW5oIC1pbmYgLTIuOCAtPiAtMS4wIDAuMAordGFuaDEwNDAgdGFuaCAtaW5mIC0zLjUgLT4gLTEuMCAtMC4wCit0YW5oMTA0MSB0YW5oIC1pbmYgLWluZiAtPiAtMS4wIDAuMCAgICAgaWdub3JlLWltYWctc2lnbgordGFuaDEwNDIgdGFuaCAtaW5mIG5hbiAtPiAtMS4wIDAuMCAgICAgIGlnbm9yZS1pbWFnLXNpZ24KK3RhbmgxMDQzIHRhbmggLTAuMCAwLjAgLT4gLTAuMCAwLjAKK3RhbmgxMDQ0IHRhbmggLTAuMCBpbmYgLT4gbmFuIG5hbiAgICAgICBpbnZhbGlkCit0YW5oMTA0NSB0YW5oIC0yLjMgaW5mIC0+IG5hbiBuYW4gICAgICAgaW52YWxpZAordGFuaDEwNDYgdGFuaCAtaW5mIDAuMCAtPiAtMS4wIDAuMAordGFuaDEwNDcgdGFuaCAtaW5mIDAuNyAtPiAtMS4wIDAuMAordGFuaDEwNDggdGFuaCAtaW5mIDEuNCAtPiAtMS4wIDAuMAordGFuaDEwNDkgdGFuaCAtaW5mIDIuMSAtPiAtMS4wIC0wLjAKK3RhbmgxMDUwIHRhbmggLWluZiAyLjggLT4gLTEuMCAtMC4wCit0YW5oMTA1MSB0YW5oIC1pbmYgMy41IC0+IC0xLjAgMC4wCit0YW5oMTA1MiB0YW5oIC1pbmYgaW5mIC0+IC0xLjAgMC4wICAgICAgaWdub3JlLWltYWctc2lnbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tCistLSBjb3M6IENvc2luZSAtLQorLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK2NvczAwMDAgY29zIDAuMCAwLjAgLT4gMS4wIC0wLjAKK2NvczAwMDEgY29zIDAuMCAtMC4wIC0+IDEuMCAwLjAKK2NvczAwMDIgY29zIC0wLjAgMC4wIC0+IDEuMCAwLjAKK2NvczAwMDMgY29zIC0wLjAgLTAuMCAtPiAxLjAgLTAuMAorCistLSByYW5kb20gaW5wdXRzCitjb3MwMDA0IGNvcyAtMi4wNjg5MTk0NjkyMDczMDM0IC0wLjAwMTY4MDIxODE3NTE3MzQzMTMgLT4gLTAuNDc3Nzc4MjcyMDg1NjE0NjkgLTAuMDAxNDc2MDQwMTUwMTY5NTk3MQorY29zMDAwNSBjb3MgLTAuNDIwOTYyNzMxODE3Nzk3NyAtMS44MjM4NTE2Nzc0MjU4MDI3IC0+IDIuOTAxMDQwMjIwMTQ0NDEwOCAtMS4yMzI5MjA3MDQyMzI5NjE3Citjb3MwMDA2IGNvcyAtMS45NDAyMTgxNjMwNjk0NTU3IC0yLjk3NTE4NTczOTI4OTEyMTcgLT4gLTMuNTQ2NTQ1OTI5Nzk3MDk4NSAtOS4xMTE5MTYzNTg2MjgyMjQ4Citjb3MwMDA3IGNvcyAtMy4zMTE4MzIwMjkwMTkxNjE2IC0wLjg3ODcxMzAyOTA5Mjg2MTQyIC0+IC0xLjM5MTE1Mjg2MzY1NjU0OTggMC4xNjg3ODE0MTUxNzM5MTcwMQorY29zMDAwOCBjb3MgLTQuOTU0MDQwNDYyMzM3Njg3MiAtMC41Nzk0OTIzMjIzOTAyNjgyNyAtPiAwLjI4MDYyNDQ1NTg2NTUyMDY1IDAuNTk0Njc4NjEzMDg1MDgwMDgKK2NvczAwMDkgY29zIC0wLjQ1Mzc0NTg0MzE2MjQ1MDI2IDEuMzk1MDI4MzQ0ODM3MzkzNSAtPiAxLjkyNDc2NjU1NzQyOTA1NzggMC44MzAwNDU3MjIwNDc2MTEwNworY29zMDAxMCBjb3MgLTAuNDI1NzgxNzIwNDAxNzY4NDMgMS4yNzE1ODgxNjE1NDEzMDQ5IC0+IDEuNzUxNzE2MTQ1OTQ4OTE0OCAwLjY3ODYzOTAyNjk3MzYzMzMyCitjb3MwMDExIGNvcyAtMC4xMzg2Mjk4NTM1NDMwMDEzNiAwLjQzNTg3NjM1ODc3NjcwMzI4IC0+IDEuMDg1OTg4MDI5MDM2MTkxMiAwLjA2MjE1NzU0ODE0NjY3MjI3MgorY29zMDAxMiBjb3MgLTAuMTEwNzMyMjEzMDg5NjY1ODQgOS45Mzg0MDgyMzA3MzI2NDc1ZS0xNSAtPiAwLjk5Mzg3NTQ1MDQwNzIyOTQ3IDEuMDk4MjU0MzI2NDA2NTQ3OWUtMTUKK2NvczAwMTMgY29zIC0xLjUwMjc2MzM2NjIwNTQ2MjNlLTA3IDAuMDA2OTY2ODA2MDI0OTk1NTQ5OCAtPiAxLjAwMDAyNDI2ODI5MTI0MTIgMS4wNDY5NTQ1NTY1NjYwOTk1ZS0wOQorY29zMDAxNCBjb3MgNC45NzI4NjQ1NDkwNTAzMDUyIC0wLjAwMDI3NDc5ODA4ODYwOTUyODIyIC0+IDAuMjU3NTQwMTE3MzE5NzU1MDEgLTAuMDAwMjY1NTI4NDk1NDkwODMxODYKK2NvczAwMTUgY29zIDcuODE5NjkzMDM0ODY3MTkgLTAuNzk2MjE1MjM0NDU4Nzg3ODMgLT4gMC4wNDU3MzQ4ODI1MDE1ODUwNjMgMC44ODI1MzEzOTkzMzA4Mjk5MQorY29zMDAxNiBjb3MgMC4xMzI3MjQyMTg4MDc2NjcxNiAtMC43NDY2ODQ0NTMwODcxODIwMSAtPiAxLjI4MDYwMTIyNDQ0MzI4NDcgMC4xMDgyNTM3MzI2NzQzNzAwNQorY29zMDAxNyBjb3MgNC4yMzk2NTIxOTg1OTczMjc0IC0yLjIxNzg4NDgzODA4ODQ4ODEgLT4gLTIuMTE2NTExNzA1NzA1Njg1NSAtNC4wNDE2NDkyNDQ0NjQxNDAxCitjb3MwMDE4IGNvcyAxLjE2MjIyMDY2MjQ5MjcyOTYgLTAuNTA0MDAxMTU0NjExOTcwODEgLT4gMC40NDg4NDA3MjYxMzM3MDM3OSAwLjQ4MjM0Njk5MTUwMzQzMTgKK2NvczAwMTkgY29zIDEuNjI4NzcyODY0NjIwODg0ZS0wOCAwLjU4MjA1NzA1NDI4OTc5MjgyIC0+IDEuMTc0MjMxOTk5NTc5MTQzNSAtMS4wMDI0ODM5NDgxOTU2NjA0ZS0wOAorY29zMDAyMCBjb3MgMi42Mzg1MjEyNjA2MTExMjQxIDIuOTg4NjEwNzEwMDkzNzI5NiAtPiAtOC43MjA5NDc1OTI3MTYxNDE3IC00Ljc3NDgzNTIxMDcxOTk3OTYKK2NvczAwMjEgY29zIDQuODA0ODM3NTI2Mzc3NTI1NiAwLjAwNjIyNDg4NTI4OTg1MTU2NTggLT4gMC4wOTIzMTg3MDIwMTU4NDYyNDMgMC4wMDYxOTgzNDMwNDIyMzA2MTQyCitjb3MwMDIyIGNvcyA3Ljk5MTQ1MTU0MzM4NTg1MTUgMC43MTY1OTk2NjYxNTUwMTQzNiAtPiAtMC4xNzM3NTQzOTkwNjkzNjU2NiAtMC43NzIxNzA0MzUyNzI5NDU4MgorY29zMDAyMyBjb3MgMC40NTEyNDM1MTE1MjU0MDIyNiAxLjY5OTI2OTM5OTM4MTIxNTggLT4gMi41NDM0Nzc5NDg5NzIyMzcgLTEuMTUyODE5MzY5NDg3NTQ3NworCistLSBzcGVjaWFsIHZhbHVlcworY29zMTAwMCBjb3MgLTAuMCAwLjAgLT4gMS4wIDAuMAorY29zMTAwMSBjb3MgLWluZiAwLjAgLT4gbmFuIDAuMCBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK2NvczEwMDIgY29zIG5hbiAwLjAgLT4gbmFuIDAuMCBpZ25vcmUtaW1hZy1zaWduCitjb3MxMDAzIGNvcyAtaW5mIDIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK2NvczEwMDQgY29zIG5hbiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgorY29zMTAwNSBjb3MgLTAuMCBpbmYgLT4gaW5mIDAuMAorY29zMTAwNiBjb3MgLTEuMzk5OTk5OTk5OTk5OTk5OSBpbmYgLT4gaW5mIGluZgorY29zMTAwNyBjb3MgLTIuNzk5OTk5OTk5OTk5OTk5OCBpbmYgLT4gLWluZiBpbmYKK2NvczEwMDggY29zIC00LjIwMDAwMDAwMDAwMDAwMDIgaW5mIC0+IC1pbmYgLWluZgorY29zMTAwOSBjb3MgLTUuNTk5OTk5OTk5OTk5OTk5NiBpbmYgLT4gaW5mIC1pbmYKK2NvczEwMTAgY29zIC03LjAgaW5mIC0+IGluZiBpbmYKK2NvczEwMTEgY29zIC1pbmYgaW5mIC0+IGluZiBuYW4gaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCitjb3MxMDEyIGNvcyBuYW4gaW5mIC0+IGluZiBuYW4KK2NvczEwMTMgY29zIC0wLjAgbmFuIC0+IG5hbiAwLjAgaWdub3JlLWltYWctc2lnbgorY29zMTAxNCBjb3MgLTIuMjk5OTk5OTk5OTk5OTk5OCBuYW4gLT4gbmFuIG5hbgorY29zMTAxNSBjb3MgLWluZiBuYW4gLT4gbmFuIG5hbgorY29zMTAxNiBjb3MgbmFuIG5hbiAtPiBuYW4gbmFuCitjb3MxMDE3IGNvcyAwLjAgMC4wIC0+IDEuMCAtMC4wCitjb3MxMDE4IGNvcyBpbmYgMC4wIC0+IG5hbiAwLjAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitjb3MxMDE5IGNvcyBpbmYgMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAorY29zMTAyMCBjb3MgMC4wIGluZiAtPiBpbmYgLTAuMAorY29zMTAyMSBjb3MgMS4zOTk5OTk5OTk5OTk5OTk5IGluZiAtPiBpbmYgLWluZgorY29zMTAyMiBjb3MgMi43OTk5OTk5OTk5OTk5OTk4IGluZiAtPiAtaW5mIC1pbmYKK2NvczEwMjMgY29zIDQuMjAwMDAwMDAwMDAwMDAwMiBpbmYgLT4gLWluZiBpbmYKK2NvczEwMjQgY29zIDUuNTk5OTk5OTk5OTk5OTk5NiBpbmYgLT4gaW5mIGluZgorY29zMTAyNSBjb3MgNy4wIGluZiAtPiBpbmYgLWluZgorY29zMTAyNiBjb3MgaW5mIGluZiAtPiBpbmYgbmFuIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorY29zMTAyNyBjb3MgMC4wIG5hbiAtPiBuYW4gMC4wIGlnbm9yZS1pbWFnLXNpZ24KK2NvczEwMjggY29zIDIuMjk5OTk5OTk5OTk5OTk5OCBuYW4gLT4gbmFuIG5hbgorY29zMTAyOSBjb3MgaW5mIG5hbiAtPiBuYW4gbmFuCitjb3MxMDMwIGNvcyAwLjAgLTAuMCAtPiAxLjAgMC4wCitjb3MxMDMxIGNvcyBpbmYgLTAuMCAtPiBuYW4gMC4wIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorY29zMTAzMiBjb3MgbmFuIC0wLjAgLT4gbmFuIDAuMCBpZ25vcmUtaW1hZy1zaWduCitjb3MxMDMzIGNvcyBpbmYgLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK2NvczEwMzQgY29zIG5hbiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4KK2NvczEwMzUgY29zIDAuMCAtaW5mIC0+IGluZiAwLjAKK2NvczEwMzYgY29zIDEuMzk5OTk5OTk5OTk5OTk5OSAtaW5mIC0+IGluZiBpbmYKK2NvczEwMzcgY29zIDIuNzk5OTk5OTk5OTk5OTk5OCAtaW5mIC0+IC1pbmYgaW5mCitjb3MxMDM4IGNvcyA0LjIwMDAwMDAwMDAwMDAwMDIgLWluZiAtPiAtaW5mIC1pbmYKK2NvczEwMzkgY29zIDUuNTk5OTk5OTk5OTk5OTk5NiAtaW5mIC0+IGluZiAtaW5mCitjb3MxMDQwIGNvcyA3LjAgLWluZiAtPiBpbmYgaW5mCitjb3MxMDQxIGNvcyBpbmYgLWluZiAtPiBpbmYgbmFuIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorY29zMTA0MiBjb3MgbmFuIC1pbmYgLT4gaW5mIG5hbgorY29zMTA0MyBjb3MgLTAuMCAtMC4wIC0+IDEuMCAtMC4wCitjb3MxMDQ0IGNvcyAtaW5mIC0wLjAgLT4gbmFuIDAuMCBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK2NvczEwNDUgY29zIC1pbmYgLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK2NvczEwNDYgY29zIC0wLjAgLWluZiAtPiBpbmYgLTAuMAorY29zMTA0NyBjb3MgLTEuMzk5OTk5OTk5OTk5OTk5OSAtaW5mIC0+IGluZiAtaW5mCitjb3MxMDQ4IGNvcyAtMi43OTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gLWluZiAtaW5mCitjb3MxMDQ5IGNvcyAtNC4yMDAwMDAwMDAwMDAwMDAyIC1pbmYgLT4gLWluZiBpbmYKK2NvczEwNTAgY29zIC01LjU5OTk5OTk5OTk5OTk5OTYgLWluZiAtPiBpbmYgaW5mCitjb3MxMDUxIGNvcyAtNy4wIC1pbmYgLT4gaW5mIC1pbmYKK2NvczEwNTIgY29zIC1pbmYgLWluZiAtPiBpbmYgbmFuIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorCisKKy0tLS0tLS0tLS0tLS0tLQorLS0gc2luOiBTaW5lIC0tCistLS0tLS0tLS0tLS0tLS0KKworLS0gemVyb3MKK3NpbjAwMDAgc2luIDAuMCAwLjAgLT4gMC4wIDAuMAorc2luMDAwMSBzaW4gMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3NpbjAwMDIgc2luIC0wLjAgMC4wIC0+IC0wLjAgMC4wCitzaW4wMDAzIHNpbiAtMC4wIC0wLjAgLT4gLTAuMCAtMC4wCisKKy0tIHJhbmRvbSBpbnB1dHMKK3NpbjAwMDQgc2luIC0wLjE4NjkxODI5MTYzMTYzNzU5IC0wLjc0Mzg4NzQxOTg1NTA3MDM0IC0+IC0wLjIzOTY2MzY3MzM3NzM0NDQgLTAuODAwMjMyMzExMDE4NTY3NTEKK3NpbjAwMDUgc2luIC0wLjQ1MTI3NDUzNzAyNDU5MTU4IC00NjEuODEzMzk5MjA3MTYxNjQgLT4gLTcuOTcyMjI5OTMzMTA3Nzg3N2UrMTk5IC0xLjY0NTAyMDU4MTEwMDQ2MjhlKzIwMAorc2luMDAwNiBzaW4gLTAuNDc2NjkyMjgzNDU3Njg5MjEgLTIuNzM2OTkzNjU2NDk4NzUxNCAtPiAtMy41NTcyMzgwMjIyNjcxMjQgLTYuODMwODAzMDc3MTIyNjYxNQorc2luMDAwNyBzaW4gLTAuMzEwMjQyODU1MjU5NTA4NTcgLTEuNDg2OTIxOTkzOTE4ODI5NiAtPiAtMC43MDk3MjY3NjA0NzE3NTIwOSAtMS45OTg1MDI5NjM1NDI2ODM5CitzaW4wMDA4IHNpbiAtNC40MTk0NTczNDA3MDI1NjA4IC0xLjQwNTk5OTIxMDk4OTI4OCAtPiAyLjA3MDI0ODA4MDA4MDI2ODUgMC41NTM2MjI1MDc5MjE4MDYwMQorc2luMDAwOSBzaW4gLTEuNzgxMDgzMjA0NjQzNDg5OGUtMDUgMC4wMDE2NDM5NTU1Mzg0Mzc5MDgzIC0+IC0xLjc4MTA4NTYxMTMxODUyNjFlLTA1IDAuMDAxNjQzOTU2Mjc4NjY2ODM3NQorc2luMDAxMCBzaW4gLTAuODIwMDAxNzg3NDg5NzY2NiAwLjYxNzI0ODc2ODg3NzcxOTI5IC0+IC0wLjg3NDkwNzgxOTU5NDg4NjUgMC40NDgzNTI5NTU1MDk4Nzc1OAorc2luMDAxMSBzaW4gLTEuNDUzNjUwMjgwNjEwNzExNCAwLjYzOTk4NTc1NTM0MTUwNDE1IC0+IC0xLjIwMzU3MDk5Mjk0Mzc2NzkgMC4wODAwMTIxODc0ODkxNjM3MDgKK3NpbjAwMTIgc2luIC0yLjI2NTM0MTIxNTU1MDYwNzkgMC4xMzE3Mjc2MDY4NTU4MzcyOSAtPiAtMC43NzUwMjA5MzgwOTE5MDQzMSAtMC4wODQ1NTQ0MjY4NjgyMjk1MzIKK3NpbjAwMTMgc2luIC0wLjAyNjEzOTgzMDY5NDkxODU4IDAuMTg0MDQ3NjY1OTc3NzYwNzMgLT4gLTAuMDI2NTgwNzc4ODYzMTI3OTQzIDAuMTg1MDI1MjUzOTY3MzU2NDIKK3NpbjAwMTQgc2luIDEuNTc0MzA2NTAwMTA1NDYxNyAtMC41MzEyNTU3NDI3MjY0MjAyOSAtPiAxLjE0NDQ1OTYzMzIwOTI3MjUgMC4wMDE5NTM3NTk4MDk5MzUyMDc3CitzaW4wMDE1IHNpbiA3LjM4MzMxMDE3OTEyODMyODllLTIwIC0wLjE2NDUzMjIxMzI0MjM2MjE3IC0+IDcuNDgzNDcyMDY3NDM3OTQyOWUtMjAgLTAuMTY1Mjc1NTU2NDY0NjY5MTUKK3NpbjAwMTYgc2luIDAuMzQ3NjM4MzQ2NDEyNTQwMzggLTIuODM3NzQxNjQyMTA4OTU2NSAtPiAyLjkxODg4MzU0MTUwNDY2MyAtOC4wMDAyNzE4MDUzMjUwMjI0CitzaW4wMDE3IHNpbiAwLjA3NzEwNTc4NTE4MDQyMTU2MyAtMC4wOTAwNTYwMjczMTYyMDA2NzQgLT4gMC4wNzczNDE5NzM4MTQ0NzEzMDQgLTAuMDg5OTA5ODY5MzgwNTI0NTg3CitzaW4wMDE4IHNpbiAzLjkwNjMyMjc3OTgxNDIzMjllLTE3IC0wLjA1OTU0MDk4NjU0Mjk1NTI0IC0+IDMuOTEzMjQ5MDM0ODk1NjUxMmUtMTcgLTAuMDU5NTc2MTcyODU5ODM3MzUxCitzaW4wMDE5IHNpbiAwLjU3MzMzOTE3OTMyNTQ0NTk4IDguNzc4NTIyMTQzMDU5NDY5NmUtMDYgLT4gMC41NDI0NDAyOTMzODMwMjkzNSA3LjM3NDc4NjkxMjUzMDEzNjhlLTA2CitzaW4wMDIwIHNpbiAwLjAyNDg2MTcyMjgxNjUxMzE2OSAwLjMzMDQ0NjIwNzU2MTE4NTE1IC0+IDAuMDI2MjI4ODAxMzY5NjUxIDAuMzM2Mzg4OTY3MTU3MDY4OQorc2luMDAyMSBzaW4gMS40MzQyNzI3Mzg3NDkyNjcxIDAuODEzNjE4ODk3OTAyODQzNDcgLT4gMS4zMzcwOTYwMDYwOTQ3OTIzIDAuMTIzMzYxMzc5NjEzODcxNjMKK3NpbjAwMjIgc2luIDEuMTUxODA4NzM1NDQwMzcyNSA0Ljg1OTcyMzU5NjYxNTA1NTggLT4gNTguOTE5MTQxOTg5NjAzMDQxIDI2LjIzNzAwMzQwMzc1ODg1Mgorc2luMDAyMyBzaW4gMC4wMDA4Nzc3MzA3ODQwNjY0OTE5MiAzNC43OTIzNzkyMTEzMTIwOTUgLT4gNTY1NTQ4MTQ1NTY5LjM4MjQ1IDY0NDMyOTY4NTgyMjcwMC42MgorCistLSBzcGVjaWFsIHZhbHVlcworc2luMTAwMCBzaW4gLTAuMCAwLjAgLT4gLTAuMCAwLjAKK3NpbjEwMDEgc2luIC1pbmYgMC4wIC0+IG5hbiAwLjAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDAyIHNpbiBuYW4gMC4wIC0+IG5hbiAwLjAgaWdub3JlLWltYWctc2lnbgorc2luMTAwMyBzaW4gLWluZiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCitzaW4xMDA0IHNpbiBuYW4gMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4KK3NpbjEwMDUgc2luIC0wLjAgaW5mIC0+IC0wLjAgaW5mCitzaW4xMDA2IHNpbiAtMS4zOTk5OTk5OTk5OTk5OTk5IGluZiAtPiAtaW5mIGluZgorc2luMTAwNyBzaW4gLTIuNzk5OTk5OTk5OTk5OTk5OCBpbmYgLT4gLWluZiAtaW5mCitzaW4xMDA4IHNpbiAtNC4yMDAwMDAwMDAwMDAwMDAyIGluZiAtPiBpbmYgLWluZgorc2luMTAwOSBzaW4gLTUuNTk5OTk5OTk5OTk5OTk5NiBpbmYgLT4gaW5mIGluZgorc2luMTAxMCBzaW4gLTcuMCBpbmYgLT4gLWluZiBpbmYKK3NpbjEwMTEgc2luIC1pbmYgaW5mIC0+IG5hbiBpbmYgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDEyIHNpbiBuYW4gaW5mIC0+IG5hbiBpbmYgaWdub3JlLWltYWctc2lnbgorc2luMTAxMyBzaW4gLTAuMCBuYW4gLT4gLTAuMCBuYW4KK3NpbjEwMTQgc2luIC0yLjI5OTk5OTk5OTk5OTk5OTggbmFuIC0+IG5hbiBuYW4KK3NpbjEwMTUgc2luIC1pbmYgbmFuIC0+IG5hbiBuYW4KK3NpbjEwMTYgc2luIG5hbiBuYW4gLT4gbmFuIG5hbgorc2luMTAxNyBzaW4gMC4wIDAuMCAtPiAwLjAgMC4wCitzaW4xMDE4IHNpbiBpbmYgMC4wIC0+IG5hbiAwLjAgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDE5IHNpbiBpbmYgMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAorc2luMTAyMCBzaW4gMC4wIGluZiAtPiAwLjAgaW5mCitzaW4xMDIxIHNpbiAxLjM5OTk5OTk5OTk5OTk5OTkgaW5mIC0+IGluZiBpbmYKK3NpbjEwMjIgc2luIDIuNzk5OTk5OTk5OTk5OTk5OCBpbmYgLT4gaW5mIC1pbmYKK3NpbjEwMjMgc2luIDQuMjAwMDAwMDAwMDAwMDAwMiBpbmYgLT4gLWluZiAtaW5mCitzaW4xMDI0IHNpbiA1LjU5OTk5OTk5OTk5OTk5OTYgaW5mIC0+IC1pbmYgaW5mCitzaW4xMDI1IHNpbiA3LjAgaW5mIC0+IGluZiBpbmYKK3NpbjEwMjYgc2luIGluZiBpbmYgLT4gbmFuIGluZiBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KK3NpbjEwMjcgc2luIDAuMCBuYW4gLT4gMC4wIG5hbgorc2luMTAyOCBzaW4gMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCitzaW4xMDI5IHNpbiBpbmYgbmFuIC0+IG5hbiBuYW4KK3NpbjEwMzAgc2luIDAuMCAtMC4wIC0+IDAuMCAtMC4wCitzaW4xMDMxIHNpbiBpbmYgLTAuMCAtPiBuYW4gMC4wIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorc2luMTAzMiBzaW4gbmFuIC0wLjAgLT4gbmFuIDAuMCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDMzIHNpbiBpbmYgLTIuMjk5OTk5OTk5OTk5OTk5OCAtPiBuYW4gbmFuIGludmFsaWQKK3NpbjEwMzQgc2luIG5hbiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4KK3NpbjEwMzUgc2luIDAuMCAtaW5mIC0+IDAuMCAtaW5mCitzaW4xMDM2IHNpbiAxLjM5OTk5OTk5OTk5OTk5OTkgLWluZiAtPiBpbmYgLWluZgorc2luMTAzNyBzaW4gMi43OTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gaW5mIGluZgorc2luMTAzOCBzaW4gNC4yMDAwMDAwMDAwMDAwMDAyIC1pbmYgLT4gLWluZiBpbmYKK3NpbjEwMzkgc2luIDUuNTk5OTk5OTk5OTk5OTk5NiAtaW5mIC0+IC1pbmYgLWluZgorc2luMTA0MCBzaW4gNy4wIC1pbmYgLT4gaW5mIC1pbmYKK3NpbjEwNDEgc2luIGluZiAtaW5mIC0+IG5hbiBpbmYgaW52YWxpZCBpZ25vcmUtaW1hZy1zaWduCitzaW4xMDQyIHNpbiBuYW4gLWluZiAtPiBuYW4gaW5mIGlnbm9yZS1pbWFnLXNpZ24KK3NpbjEwNDMgc2luIC0wLjAgLTAuMCAtPiAtMC4wIC0wLjAKK3NpbjEwNDQgc2luIC1pbmYgLTAuMCAtPiBuYW4gMC4wIGludmFsaWQgaWdub3JlLWltYWctc2lnbgorc2luMTA0NSBzaW4gLWluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAorc2luMTA0NiBzaW4gLTAuMCAtaW5mIC0+IC0wLjAgLWluZgorc2luMTA0NyBzaW4gLTEuMzk5OTk5OTk5OTk5OTk5OSAtaW5mIC0+IC1pbmYgLWluZgorc2luMTA0OCBzaW4gLTIuNzk5OTk5OTk5OTk5OTk5OCAtaW5mIC0+IC1pbmYgaW5mCitzaW4xMDQ5IHNpbiAtNC4yMDAwMDAwMDAwMDAwMDAyIC1pbmYgLT4gaW5mIGluZgorc2luMTA1MCBzaW4gLTUuNTk5OTk5OTk5OTk5OTk5NiAtaW5mIC0+IGluZiAtaW5mCitzaW4xMDUxIHNpbiAtNy4wIC1pbmYgLT4gLWluZiAtaW5mCitzaW4xMDUyIHNpbiAtaW5mIC1pbmYgLT4gbmFuIGluZiBpbnZhbGlkIGlnbm9yZS1pbWFnLXNpZ24KKworCistLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHRhbjogVGFuZ2VudCAtLQorLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHplcm9zCit0YW4wMDAwIHRhbiAwLjAgMC4wIC0+IDAuMCAwLjAKK3RhbjAwMDEgdGFuIDAuMCAtMC4wIC0+IDAuMCAtMC4wCit0YW4wMDAyIHRhbiAtMC4wIDAuMCAtPiAtMC4wIDAuMAordGFuMDAwMyB0YW4gLTAuMCAtMC4wIC0+IC0wLjAgLTAuMAorCistLSByYW5kb20gaW5wdXRzCit0YW4wMDA0IHRhbiAtMC41NjM3ODU2MTgzMzg2MTA3NCAtMS43MTEwMjc2MjM3MTg3NjY0ZSs3MyAtPiAtMC4wIC0xLjAKK3RhbjAwMDUgdGFuIC0zLjU0NTE2MzM5OTM0NzE5MTVlLTEyIC0yLjg1NTQ3MTg2MzU2NDA1OSAtPiAtNC42NjIyNDQxMzA0ODg5NTc1ZS0xNCAtMC45OTM0MDI3Mzg0MzA5Mzk1MQordGFuMDAwNiB0YW4gLTIuNTAyNDQyNzE5NjM4Njk2IC0wLjI2NzQyMjM0MzkwNTA0MjIxIC0+IDAuNjY3MzUyMTUyNTI5OTQ5OTUgLTAuMzkwNzg5OTc5MzU0MjA5NTYKK3RhbjAwMDcgdGFuIC0wLjg3NjM5NTk3NzIwMzcxMzY1IC01NS41ODYyMjU1MjMyODAyMDYgLT4gLTEuMDI4NTI2NDU2NTk0ODE3NmUtNDggLTEuMAordGFuMDAwOCB0YW4gLTAuMDE1NzgzODY5NTk2NDI3MjQzIC01MjAuMDU5NDQ0MzYwMzkyNzIgLT4gLTAuMCAtMS4wCit0YW4wMDA5IHRhbiAtMC44NDY0MzU0OTk5MDcyNTE2NCAyLjA3NDkwOTc5MzUzOTYzNDMgLT4gLTAuMDMxNDEyNjYxNjc2OTU5NTczIDEuMDAzMzU0ODQ3OTUyNjc2NAordGFuMDAxMCB0YW4gLTAuNDM2MTM3OTIyNDg1NTk2NDYgOC4xMDgyNzQxNjI5NDU4MDU5IC0+IC0xLjM4Nzk4NDg0NDQ2NDQ1OTNlLTA3IDAuOTk5OTk5ODgzNDQyMjQwMTEKK3RhbjAwMTEgdGFuIC0xLjA4MjA5MDYzNjc4MzMxMTQgMC4yODU3MTg2ODk5MjQ4MDI0OCAtPiAtMS4zNjIyNDg1NzM3OTM2NTM2IDAuOTkwODkyNjkzNzc5NzEyNDUKK3RhbjAwMTIgdGFuIC0xLjE0Nzc4NTk1ODAyMjAwODQgMS45MDIxNjM3MDAyNzA4MDQxIC0+IC0wLjAzNDM0ODQ1MDA0MjA3MTE5NiAxLjAyOTM5NTQwOTc5MDE2ODcKK3RhbjAwMTMgdGFuIC0wLjEyNDY1NTQzMTc2OTUzNDA5IDMuMDYwNjg1MTAxNjM0NDgxNWUtMDUgLT4gLTAuMTI1MzA1MTQyOTAzODczNDMgMy4xMDg3NDIwNzY5OTQ1NDc5ZS0wNQordGFuMDAxNCB0YW4gMy43NTgyODQ4NzE3NTI1MzQzIC02OTI3ODcwMjAuNDQwMzg5MzkgLT4gMC4wIC0xLjAKK3RhbjAwMTUgdGFuIDIuMjMyMTk2NzY1NTE0MjE3NmUtMDYgLTEwLjA5MDA2OTQyMzAwODE2OSAtPiAxLjUzNjk4NDYxMjA2MjI2NDNlLTE0IC0wLjk5OTk5OTk5NjU1NzIzNzU5Cit0YW4wMDE2IHRhbiAwLjg4MzcxMTcyMzkwMjQ1MDEyIC0xLjE2MzUwNTM2MzAxMzI4MjMgLT4gMC4xOTcwNTAxNzExODYyNTg4OSAtMS4wMTk2NDUyMjgwODQzMTI5Cit0YW4wMDE3IHRhbiAyLjEzNDc0MTQyMzE4NDkyNjcgLTEuOTMxMTMzOTk2MDQxNjgzMSAtPiAtMC4wMzg2NjM1NzY5MTU5ODI1MjQgLTEuMDE3NDM5OTk5Mzk4MDc3OAordGFuMDAxOCB0YW4gNS45MDI3OTQ1MjU1ODk5OTc0IC0yLjE1NzQxOTU2ODQ2MDcxMzVlLTE4MyAtPiAtMC4zOTk4NjU5MTUzOTI4MTQ5NiAtMi41MDIzNzUzMTY3OTc2OTE1ZS0xODMKK3RhbjAwMTkgdGFuIDAuNDQ4MTE0ODk0OTA4MDUzNjIgNjgzMjE2MDc1NjcwLjA3NTU2IC0+IDAuMCAxLjAKK3RhbjAwMjAgdGFuIDQuMTQ1OTc2NjM5NjA2ODMyNSAxMi41MjMwMTcyMDU2MDU3NTYgLT4gMi40MDIyNTE0NzU4OTg4MDY4ZS0xMSAxLjAwMDAwMDAwMDAxMTI0OTkKK3RhbjAwMjEgdGFuIDEuNzgwOTYxNzk2ODQ0MzI3MiAxLjUwNTIzODE3MDI4NTMzNzkgLT4gLTAuMDQ0MDY2MjIyMTE4OTQ2OTAzIDEuMDkzMjY4NDUxNzcwMjc3OAordGFuMDAyMiB0YW4gMS4xNjE1MzEzOTAwODgwNTc3IDEuNzk1NjI5ODcyODY0NzEwNyAtPiAwLjA0MTc5MzE4NjgyNjM5MDM2MiAxLjAzNzUzMzk1NDYwMzQ3OTIKK3RhbjAwMjMgdGFuIDAuMDY3MDE0Nzc5NDc3OTA4OTQ1IDUuODUxNzM2MTU3NzQ1NzA5NyAtPiAyLjIwODg2Mzk3NTQ4MDAwMzRlLTA2IDAuOTk5OTgzNjE4MjQyMDA2MQorCistLSBzcGVjaWFsIHZhbHVlcwordGFuMTAwMCB0YW4gLTAuMCAwLjAgLT4gLTAuMCAwLjAKK3RhbjEwMDEgdGFuIC1pbmYgMC4wIC0+IG5hbiBuYW4gaW52YWxpZAordGFuMTAwMiB0YW4gLWluZiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCit0YW4xMDAzIHRhbiBuYW4gMC4wIC0+IG5hbiBuYW4KK3RhbjEwMDQgdGFuIG5hbiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgordGFuMTAwNSB0YW4gLTAuMCBpbmYgLT4gLTAuMCAxLjAKK3RhbjEwMDYgdGFuIC0wLjY5OTk5OTk5OTk5OTk5OTk2IGluZiAtPiAtMC4wIDEuMAordGFuMTAwNyB0YW4gLTEuMzk5OTk5OTk5OTk5OTk5OSBpbmYgLT4gLTAuMCAxLjAKK3RhbjEwMDggdGFuIC0yLjEwMDAwMDAwMDAwMDAwMDEgaW5mIC0+IDAuMCAxLjAKK3RhbjEwMDkgdGFuIC0yLjc5OTk5OTk5OTk5OTk5OTggaW5mIC0+IDAuMCAxLjAKK3RhbjEwMTAgdGFuIC0zLjUgaW5mIC0+IC0wLjAgMS4wCit0YW4xMDExIHRhbiAtaW5mIGluZiAtPiAtMC4wIDEuMCBpZ25vcmUtcmVhbC1zaWduCit0YW4xMDEyIHRhbiBuYW4gaW5mIC0+IC0wLjAgMS4wIGlnbm9yZS1yZWFsLXNpZ24KK3RhbjEwMTMgdGFuIC0wLjAgbmFuIC0+IC0wLjAgbmFuCit0YW4xMDE0IHRhbiAtMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCit0YW4xMDE1IHRhbiAtaW5mIG5hbiAtPiBuYW4gbmFuCit0YW4xMDE2IHRhbiBuYW4gbmFuIC0+IG5hbiBuYW4KK3RhbjEwMTcgdGFuIDAuMCAwLjAgLT4gMC4wIDAuMAordGFuMTAxOCB0YW4gaW5mIDAuMCAtPiBuYW4gbmFuIGludmFsaWQKK3RhbjEwMTkgdGFuIGluZiAyLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCit0YW4xMDIwIHRhbiAwLjAgaW5mIC0+IDAuMCAxLjAKK3RhbjEwMjEgdGFuIDAuNjk5OTk5OTk5OTk5OTk5OTYgaW5mIC0+IDAuMCAxLjAKK3RhbjEwMjIgdGFuIDEuMzk5OTk5OTk5OTk5OTk5OSBpbmYgLT4gMC4wIDEuMAordGFuMTAyMyB0YW4gMi4xMDAwMDAwMDAwMDAwMDAxIGluZiAtPiAtMC4wIDEuMAordGFuMTAyNCB0YW4gMi43OTk5OTk5OTk5OTk5OTk4IGluZiAtPiAtMC4wIDEuMAordGFuMTAyNSB0YW4gMy41IGluZiAtPiAwLjAgMS4wCit0YW4xMDI2IHRhbiBpbmYgaW5mIC0+IC0wLjAgMS4wIGlnbm9yZS1yZWFsLXNpZ24KK3RhbjEwMjcgdGFuIDAuMCBuYW4gLT4gMC4wIG5hbgordGFuMTAyOCB0YW4gMi4yOTk5OTk5OTk5OTk5OTk4IG5hbiAtPiBuYW4gbmFuCit0YW4xMDI5IHRhbiBpbmYgbmFuIC0+IG5hbiBuYW4KK3RhbjEwMzAgdGFuIDAuMCAtMC4wIC0+IDAuMCAtMC4wCit0YW4xMDMxIHRhbiBpbmYgLTAuMCAtPiBuYW4gbmFuIGludmFsaWQKK3RhbjEwMzIgdGFuIGluZiAtMi4yOTk5OTk5OTk5OTk5OTk4IC0+IG5hbiBuYW4gaW52YWxpZAordGFuMTAzMyB0YW4gbmFuIC0wLjAgLT4gbmFuIG5hbgordGFuMTAzNCB0YW4gbmFuIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbgordGFuMTAzNSB0YW4gMC4wIC1pbmYgLT4gMC4wIC0xLjAKK3RhbjEwMzYgdGFuIDAuNjk5OTk5OTk5OTk5OTk5OTYgLWluZiAtPiAwLjAgLTEuMAordGFuMTAzNyB0YW4gMS4zOTk5OTk5OTk5OTk5OTk5IC1pbmYgLT4gMC4wIC0xLjAKK3RhbjEwMzggdGFuIDIuMTAwMDAwMDAwMDAwMDAwMSAtaW5mIC0+IC0wLjAgLTEuMAordGFuMTAzOSB0YW4gMi43OTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gLTAuMCAtMS4wCit0YW4xMDQwIHRhbiAzLjUgLWluZiAtPiAwLjAgLTEuMAordGFuMTA0MSB0YW4gaW5mIC1pbmYgLT4gLTAuMCAtMS4wIGlnbm9yZS1yZWFsLXNpZ24KK3RhbjEwNDIgdGFuIG5hbiAtaW5mIC0+IC0wLjAgLTEuMCBpZ25vcmUtcmVhbC1zaWduCit0YW4xMDQzIHRhbiAtMC4wIC0wLjAgLT4gLTAuMCAtMC4wCit0YW4xMDQ0IHRhbiAtaW5mIC0wLjAgLT4gbmFuIG5hbiBpbnZhbGlkCit0YW4xMDQ1IHRhbiAtaW5mIC0yLjI5OTk5OTk5OTk5OTk5OTggLT4gbmFuIG5hbiBpbnZhbGlkCit0YW4xMDQ2IHRhbiAtMC4wIC1pbmYgLT4gLTAuMCAtMS4wCit0YW4xMDQ3IHRhbiAtMC42OTk5OTk5OTk5OTk5OTk5NiAtaW5mIC0+IC0wLjAgLTEuMAordGFuMTA0OCB0YW4gLTEuMzk5OTk5OTk5OTk5OTk5OSAtaW5mIC0+IC0wLjAgLTEuMAordGFuMTA0OSB0YW4gLTIuMTAwMDAwMDAwMDAwMDAwMSAtaW5mIC0+IDAuMCAtMS4wCit0YW4xMDUwIHRhbiAtMi43OTk5OTk5OTk5OTk5OTk4IC1pbmYgLT4gMC4wIC0xLjAKK3RhbjEwNTEgdGFuIC0zLjUgLWluZiAtPiAtMC4wIC0xLjAKK3RhbjEwNTIgdGFuIC1pbmYgLWluZiAtPiAtMC4wIC0xLjAgaWdub3JlLXJlYWwtc2lnbgorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcmVjdDogQ29udmVyc2lvbiBmcm9tIHBvbGFyIGNvb3JkaW5hdGVzIHRvIHJlY3Rhbmd1bGFyIGNvb3JkaW5hdGVzIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tCistLSBGb3IgY21hdGgucmVjdCwgd2UgY2FuIHVzZSB0aGUgc2FtZSB0ZXN0Y2FzZSBzeW50YXggYXMgZm9yIHRoZQorLS0gY29tcGxleCAtPiBjb21wbGV4IGZ1bmN0aW9ucyBhYm92ZSwgYnV0IGhlcmUgdGhlIGlucHV0IGFyZ3VtZW50cworLS0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgcGFpciBvZiBmbG9hdGluZy1wb2ludCBudW1iZXJzIHJhdGhlcgorLS0gdGhhbiB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIG9mIGEgY29tcGxleCBudW1iZXIuCistLQorLS0gSGVyZSBhcmUgdGhlICdzcGlyaXQgb2YgQzk5JyBydWxlcyBmb3IgcmVjdC4gIEZpcnN0LCB0aGUgc2hvcnQKKy0tIHZlcnNpb246CistLQorLS0gICAgcmVjdCh4LCB0KSA9IGV4cChsb2coeCkraXQpIGZvciBwb3NpdGl2ZS1zaWduZWQgeAorLS0gICAgcmVjdCh4LCB0KSA9IC1leHAobG9nKC14KStpdCkgZm9yIG5lZ2F0aXZlLXNpZ25lZCB4CistLSAgICByZWN0KG5hbiwgdCkgPSBleHAobmFuICsgaXQpLCBleGNlcHQgdGhhdCBpbiByZWN0KG5hbiwgKy0wKSB0aGUKKy0tICAgICAgc2lnbiBvZiB0aGUgaW1hZ2luYXJ5IHBhcnQgaXMgdW5zcGVjaWZpZWQuCistLQorLS0gYW5kIG5vdyB0aGUgbG9uZyB2ZXJzaW9uOgorLS0KKy0tICAgcmVjdCh4LCAtdCkgPSBjb25qKHJlY3QoeCwgdCkpIGZvciBhbGwgeCBhbmQgdAorLS0gICByZWN0KC14LCB0KSA9IC1yZWN0KHgsIHQpIGZvciBhbGwgeCBhbmQgdAorLS0gICByZWN0KCswLCArMCkgcmV0dXJucyArMCArIGkwCistLSAgIHJlY3QoKzAsIGluZikgcmV0dXJucyArLSAwICstIGkwLCB3aGVyZSB0aGUgc2lnbnMgb2YgdGhlIHJlYWwgYW5kCistLSAgICAgaW1hZ2luYXJ5IHBhcnRzIGFyZSB1bnNwZWNpZmllZC4KKy0tICAgcmVjdCh4LCBpbmYpIHJldHVybnMgTmFOICsgaSBOYU4gYW5kIHJhaXNlcyB0aGUgImludmFsaWQiCistLSAgICAgZmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uLCBmb3IgZmluaXRlIG5vbnplcm8geC4KKy0tICAgcmVjdChpbmYsIGluZikgcmV0dXJucyArLWluZiArIGkgTmFOIGFuZCByYWlzZXMgdGhlICJpbnZhbGlkIgorLS0gICAgIGZsb2F0aW5nLXBvaW50IGV4Y2VwdGlvbiAod2hlcmUgdGhlIHNpZ24gb2YgdGhlIHJlYWwgcGFydCBvZiB0aGUKKy0tICAgICByZXN1bHQgaXMgdW5zcGVjaWZpZWQpLgorLS0gICByZWN0KGluZiwgKzApIHJldHVybnMgaW5mK2kwCistLSAgIHJlY3QoaW5mLCB4KSByZXR1cm5zIGluZipjaXMoeCksIGZvciBmaW5pdGUgbm9uemVybyB4CistLSAgIHJlY3QoaW5mLCBOYU4pIHJldHVybnMgKy1pbmYraSBOYU4sIHdoZXJlIHRoZSBzaWduIG9mIHRoZSByZWFsIHBhcnQKKy0tICAgICBvZiB0aGUgcmVzdWx0IGlzIHVuc3BlY2lmaWVkLgorLS0gICByZWN0KE5hTiwgeCkgcmV0dXJucyBOYU4gKyBpIE5hTiBmb3IgYWxsIG5vbnplcm8gbnVtYmVycyAoaW5jbHVkaW5nCistLSAgICAgaW5maW5pdGllcykgeAorLS0gICByZWN0KE5hTiwgMCkgcmV0dXJucyBOYU4gKy0gaTAsIHdoZXJlIHRoZSBzaWduIG9mIHRoZSBpbWFnaW5hcnkKKy0tICAgICBwYXJ0IGlzIHVuc3BlY2lmaWVkCistLSAgIHJlY3QoTmFOLCBOYU4pIHJldHVybnMgTmFOICsgaSBOYU4KKy0tICAgcmVjdCh4LCBOYU4pIHJldHVybnMgTmFOICsgaSBOYU4gZm9yIGZpbml0ZSBub256ZXJvIHgKKy0tICAgcmVjdCgrMCwgTmFOKSByZXR1cm4gKy0wICstIGkwLCB3aGVyZSB0aGUgc2lnbnMgb2YgdGhlIHJlYWwgYW5kCistLSAgICAgaW1hZ2luYXJ5IHBhcnRzIGFyZSB1bnNwZWNpZmllZC4KKworLS0gc3BlY2lhbCB2YWx1ZXMKK3JlY3QxMDAwIHJlY3QgMC4wIDAuMCAtPiAwLjAgMC4wCityZWN0MTAwMSByZWN0IDAuMCBpbmYgLT4gMC4wIDAuMCAgICAgICAgaWdub3JlLXJlYWwtc2lnbiBpZ25vcmUtaW1hZy1zaWduCityZWN0MTAwMiByZWN0IDIuMyBpbmYgLT4gbmFuIG5hbiAgICAgICAgaW52YWxpZAorcmVjdDEwMDMgcmVjdCBpbmYgaW5mIC0+IGluZiBuYW4gICAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorcmVjdDEwMDQgcmVjdCBpbmYgMC4wIC0+IGluZiAwLjAKK3JlY3QxMDA1IHJlY3QgaW5mIDEuNCAtPiBpbmYgaW5mCityZWN0MTAwNiByZWN0IGluZiAyLjggLT4gLWluZiBpbmYKK3JlY3QxMDA3IHJlY3QgaW5mIDQuMiAtPiAtaW5mIC1pbmYKK3JlY3QxMDA4IHJlY3QgaW5mIDUuNiAtPiBpbmYgLWluZgorcmVjdDEwMDkgcmVjdCBpbmYgNy4wIC0+IGluZiBpbmYKK3JlY3QxMDEwIHJlY3QgbmFuIDAuMCAtPiBuYW4gMC4wICAgICAgICBpZ25vcmUtaW1hZy1zaWduCityZWN0MTAxMSByZWN0IG5hbiAyLjMgLT4gbmFuIG5hbgorcmVjdDEwMTIgcmVjdCBuYW4gaW5mIC0+IG5hbiBuYW4KK3JlY3QxMDEzIHJlY3QgbmFuIG5hbiAtPiBuYW4gbmFuCityZWN0MTAxNCByZWN0IGluZiBuYW4gLT4gaW5mIG5hbiAgICAgICAgaWdub3JlLXJlYWwtc2lnbgorcmVjdDEwMTUgcmVjdCAyLjMgbmFuIC0+IG5hbiBuYW4KK3JlY3QxMDE2IHJlY3QgMC4wIG5hbiAtPiAwLjAgMC4wICAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK3JlY3QxMDE3IHJlY3QgMC4wIC0wLjAgLT4gMC4wIC0wLjAKK3JlY3QxMDE4IHJlY3QgMC4wIC1pbmYgLT4gMC4wIDAuMCAgICAgICBpZ25vcmUtcmVhbC1zaWduIGlnbm9yZS1pbWFnLXNpZ24KK3JlY3QxMDE5IHJlY3QgMi4zIC1pbmYgLT4gbmFuIG5hbiAgICAgICBpbnZhbGlkCityZWN0MTAyMCByZWN0IGluZiAtaW5mIC0+IGluZiBuYW4gICAgICAgaW52YWxpZCBpZ25vcmUtcmVhbC1zaWduCityZWN0MTAyMSByZWN0IGluZiAtMC4wIC0+IGluZiAtMC4wCityZWN0MTAyMiByZWN0IGluZiAtMS40IC0+IGluZiAtaW5mCityZWN0MTAyMyByZWN0IGluZiAtMi44IC0+IC1pbmYgLWluZgorcmVjdDEwMjQgcmVjdCBpbmYgLTQuMiAtPiAtaW5mIGluZgorcmVjdDEwMjUgcmVjdCBpbmYgLTUuNiAtPiBpbmYgaW5mCityZWN0MTAyNiByZWN0IGluZiAtNy4wIC0+IGluZiAtaW5mCityZWN0MTAyNyByZWN0IG5hbiAtMC4wIC0+IG5hbiAwLjAgICAgICAgaWdub3JlLWltYWctc2lnbgorcmVjdDEwMjggcmVjdCBuYW4gLTIuMyAtPiBuYW4gbmFuCityZWN0MTAyOSByZWN0IG5hbiAtaW5mIC0+IG5hbiBuYW4KK3JlY3QxMDMwIHJlY3QgLTAuMCAwLjAgLT4gLTAuMCAtMC4wCityZWN0MTAzMSByZWN0IC0wLjAgaW5mIC0+IDAuMCAwLjAgICAgICAgaWdub3JlLXJlYWwtc2lnbiBpZ25vcmUtaW1hZy1zaWduCityZWN0MTAzMiByZWN0IC0yLjMgaW5mIC0+IG5hbiBuYW4gICAgICAgaW52YWxpZAorcmVjdDEwMzMgcmVjdCAtaW5mIGluZiAtPiAtaW5mIG5hbiAgICAgIGludmFsaWQgaWdub3JlLXJlYWwtc2lnbgorcmVjdDEwMzQgcmVjdCAtaW5mIDAuMCAtPiAtaW5mIC0wLjAKK3JlY3QxMDM1IHJlY3QgLWluZiAxLjQgLT4gLWluZiAtaW5mCityZWN0MTAzNiByZWN0IC1pbmYgMi44IC0+IGluZiAtaW5mCityZWN0MTAzNyByZWN0IC1pbmYgNC4yIC0+IGluZiBpbmYKK3JlY3QxMDM4IHJlY3QgLWluZiA1LjYgLT4gLWluZiBpbmYKK3JlY3QxMDM5IHJlY3QgLWluZiA3LjAgLT4gLWluZiAtaW5mCityZWN0MTA0MCByZWN0IC1pbmYgbmFuIC0+IGluZiBuYW4gICAgICAgaWdub3JlLXJlYWwtc2lnbgorcmVjdDEwNDEgcmVjdCAtMi4zIG5hbiAtPiBuYW4gbmFuCityZWN0MTA0MiByZWN0IC0wLjAgbmFuIC0+IDAuMCAwLjAgICAgICAgaWdub3JlLXJlYWwtc2lnbiBpZ25vcmUtaW1hZy1zaWduCityZWN0MTA0MyByZWN0IC0wLjAgLTAuMCAtPiAtMC4wIDAuMAorcmVjdDEwNDQgcmVjdCAtMC4wIC1pbmYgLT4gMC4wIDAuMCAgICAgIGlnbm9yZS1yZWFsLXNpZ24gaWdub3JlLWltYWctc2lnbgorcmVjdDEwNDUgcmVjdCAtMi4zIC1pbmYgLT4gbmFuIG5hbiAgICAgIGludmFsaWQKK3JlY3QxMDQ2IHJlY3QgLWluZiAtaW5mIC0+IC1pbmYgbmFuICAgICBpbnZhbGlkIGlnbm9yZS1yZWFsLXNpZ24KK3JlY3QxMDQ3IHJlY3QgLWluZiAtMC4wIC0+IC1pbmYgMC4wCityZWN0MTA0OCByZWN0IC1pbmYgLTEuNCAtPiAtaW5mIGluZgorcmVjdDEwNDkgcmVjdCAtaW5mIC0yLjggLT4gaW5mIGluZgorcmVjdDEwNTAgcmVjdCAtaW5mIC00LjIgLT4gaW5mIC1pbmYKK3JlY3QxMDUxIHJlY3QgLWluZiAtNS42IC0+IC1pbmYgLWluZgorcmVjdDEwNTIgcmVjdCAtaW5mIC03LjAgLT4gLWluZiBpbmYKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcG9sYXI6IENvbnZlcnNpb24gZnJvbSByZWN0YW5ndWxhciBjb29yZGluYXRlcyB0byBwb2xhciBjb29yZGluYXRlcyAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0KKy0tIEZvciBjbWF0aC5wb2xhciwgd2UgY2FuIHVzZSB0aGUgc2FtZSB0ZXN0Y2FzZSBzeW50YXggYXMgZm9yIHRoZQorLS0gY29tcGxleCAtPiBjb21wbGV4IGZ1bmN0aW9ucyBhYm92ZSwgYnV0IGhlcmUgdGhlIG91dHB1dCBhcmd1bWVudHMKKy0tIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBhIHBhaXIgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycyByYXRoZXIKKy0tIHRoYW4gdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBvZiBhIGNvbXBsZXggbnVtYmVyLgorLS0KKy0tIEFubmV4IEcgb2YgdGhlIEM5OSBzdGFuZGFyZCBkZXNjcmliZXMgZnVsbHkgYm90aCB0aGUgcmVhbCBhbmQKKy0tIGltYWdpbmFyeSBwYXJ0cyBvZiBwb2xhciAoYXMgY2FicyBhbmQgY2FyZywgcmVzcGVjdGl2ZWx5LCB3aGljaCBpbiB0dXJuCistLSBhcmUgZGVmaW5lZCBpbiB0ZXJtcyBvZiB0aGUgZnVuY3Rpb25zIGh5cG90IGFuZCBhdGFuMikuCisKKy0tIG92ZXJmbG93Citwb2xhcjAxMDAgcG9sYXIgMS40ZTMwOCAxLjRlMzA4IC0+IGluZiAwLjc4NTM5ODE2MzM5NzQ0ODI4ICAgICAgb3ZlcmZsb3cKKworLS0gc3BlY2lhbCB2YWx1ZXMKK3BvbGFyMTAwMCBwb2xhciAwLjAgMC4wIC0+IDAuMCAwLjAKK3BvbGFyMTAwMSBwb2xhciAwLjAgLTAuMCAtPiAwLjAgLTAuMAorcG9sYXIxMDAyIHBvbGFyIC0wLjAgMC4wIC0+IDAuMCAzLjE0MTU5MjY1MzU4OTc5MzEKK3BvbGFyMTAwMyBwb2xhciAtMC4wIC0wLjAgLT4gMC4wIC0zLjE0MTU5MjY1MzU4OTc5MzEKK3BvbGFyMTAwNCBwb2xhciBpbmYgMC4wIC0+IGluZiAwLjAKK3BvbGFyMTAwNSBwb2xhciBpbmYgMi4zIC0+IGluZiAwLjAKK3BvbGFyMTAwNiBwb2xhciBpbmYgaW5mIC0+IGluZiAwLjc4NTM5ODE2MzM5NzQ0ODI4Citwb2xhcjEwMDcgcG9sYXIgMi4zIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2Citwb2xhcjEwMDggcG9sYXIgMC4wIGluZiAtPiBpbmYgMS41NzA3OTYzMjY3OTQ4OTY2Citwb2xhcjEwMDkgcG9sYXIgLTAuMCBpbmYgLT4gaW5mIDEuNTcwNzk2MzI2Nzk0ODk2NgorcG9sYXIxMDEwIHBvbGFyIC0yLjMgaW5mIC0+IGluZiAxLjU3MDc5NjMyNjc5NDg5NjYKK3BvbGFyMTAxMSBwb2xhciAtaW5mIGluZiAtPiBpbmYgMi4zNTYxOTQ0OTAxOTIzNDQ4Citwb2xhcjEwMTIgcG9sYXIgLWluZiAyLjMgLT4gaW5mIDMuMTQxNTkyNjUzNTg5NzkzMQorcG9sYXIxMDEzIHBvbGFyIC1pbmYgMC4wIC0+IGluZiAzLjE0MTU5MjY1MzU4OTc5MzEKK3BvbGFyMTAxNCBwb2xhciAtaW5mIC0wLjAgLT4gaW5mIC0zLjE0MTU5MjY1MzU4OTc5MzEKK3BvbGFyMTAxNSBwb2xhciAtaW5mIC0yLjMgLT4gaW5mIC0zLjE0MTU5MjY1MzU4OTc5MzEKK3BvbGFyMTAxNiBwb2xhciAtaW5mIC1pbmYgLT4gaW5mIC0yLjM1NjE5NDQ5MDE5MjM0NDgKK3BvbGFyMTAxNyBwb2xhciAtMi4zIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK3BvbGFyMTAxOCBwb2xhciAtMC4wIC1pbmYgLT4gaW5mIC0xLjU3MDc5NjMyNjc5NDg5NjYKK3BvbGFyMTAxOSBwb2xhciAwLjAgLWluZiAtPiBpbmYgLTEuNTcwNzk2MzI2Nzk0ODk2NgorcG9sYXIxMDIwIHBvbGFyIDIuMyAtaW5mIC0+IGluZiAtMS41NzA3OTYzMjY3OTQ4OTY2Citwb2xhcjEwMjEgcG9sYXIgaW5mIC1pbmYgLT4gaW5mIC0wLjc4NTM5ODE2MzM5NzQ0ODI4Citwb2xhcjEwMjIgcG9sYXIgaW5mIC0yLjMgLT4gaW5mIC0wLjAKK3BvbGFyMTAyMyBwb2xhciBpbmYgLTAuMCAtPiBpbmYgLTAuMAorcG9sYXIxMDI0IHBvbGFyIG5hbiAtaW5mIC0+IGluZiBuYW4KK3BvbGFyMTAyNSBwb2xhciBuYW4gLTIuMyAtPiBuYW4gbmFuCitwb2xhcjEwMjYgcG9sYXIgbmFuIC0wLjAgLT4gbmFuIG5hbgorcG9sYXIxMDI3IHBvbGFyIG5hbiAwLjAgLT4gbmFuIG5hbgorcG9sYXIxMDI4IHBvbGFyIG5hbiAyLjMgLT4gbmFuIG5hbgorcG9sYXIxMDI5IHBvbGFyIG5hbiBpbmYgLT4gaW5mIG5hbgorcG9sYXIxMDMwIHBvbGFyIG5hbiBuYW4gLT4gbmFuIG5hbgorcG9sYXIxMDMxIHBvbGFyIGluZiBuYW4gLT4gaW5mIG5hbgorcG9sYXIxMDMyIHBvbGFyIDIuMyBuYW4gLT4gbmFuIG5hbgorcG9sYXIxMDMzIHBvbGFyIDAuMCBuYW4gLT4gbmFuIG5hbgorcG9sYXIxMDM0IHBvbGFyIC0wLjAgbmFuIC0+IG5hbiBuYW4KK3BvbGFyMTAzNSBwb2xhciAtMi4zIG5hbiAtPiBuYW4gbmFuCitwb2xhcjEwMzYgcG9sYXIgLWluZiBuYW4gLT4gaW5mIG5hbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2N1cnNlc190ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9jdXJzZXNfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlZGJiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9jdXJzZXNfdGVzdHMucHkKQEAgLTAsMCArMSw0NiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjICRJZDogbmN1cnNlcy5weSAzNjU1OSAyMDA0LTA3LTE4IDA1OjU2OjA5WiB0aW1fb25lICQKKyMKKyMgSW50ZXJhY3RpdmUgdGVzdCBzdWl0ZSBmb3IgdGhlIGN1cnNlcyBtb2R1bGUuCisjIFRoaXMgc2NyaXB0IGRpc3BsYXlzIHZhcmlvdXMgdGhpbmdzIGFuZCB0aGUgdXNlciBzaG91bGQgdmVyaWZ5IHdoZXRoZXIKKyMgdGhleSBkaXNwbGF5IGNvcnJlY3RseS4KKyMKKworaW1wb3J0IGN1cnNlcworZnJvbSBjdXJzZXMgaW1wb3J0IHRleHRwYWQKKworZGVmIHRlc3RfdGV4dHBhZChzdGRzY3IsIGluc2VydF9tb2RlPUZhbHNlKToKKyAgICBuY29scywgbmxpbmVzID0gOCwgMworICAgIHVseSwgdWx4ID0gMywgMgorICAgIGlmIGluc2VydF9tb2RlOgorICAgICAgICBtb2RlID0gJ2luc2VydCBtb2RlJworICAgIGVsc2U6CisgICAgICAgIG1vZGUgPSAnb3ZlcndyaXRlIG1vZGUnCisKKyAgICBzdGRzY3IuYWRkc3RyKHVseS0zLCB1bHgsICJVc2UgQ3RybC1HIHRvIGVuZCBlZGl0aW5nICglcykuIiAlIG1vZGUpCisgICAgc3Rkc2NyLmFkZHN0cih1bHktMiwgdWx4LCAiQmUgc3VyZSB0byB0cnkgdHlwaW5nIGluIHRoZSBsb3dlci1yaWdodCBjb3JuZXIuIikKKyAgICB3aW4gPSBjdXJzZXMubmV3d2luKG5saW5lcywgbmNvbHMsIHVseSwgdWx4KQorICAgIHRleHRwYWQucmVjdGFuZ2xlKHN0ZHNjciwgdWx5LTEsIHVseC0xLCB1bHkgKyBubGluZXMsIHVseCArIG5jb2xzKQorICAgIHN0ZHNjci5yZWZyZXNoKCkKKworICAgIGJveCA9IHRleHRwYWQuVGV4dGJveCh3aW4sIGluc2VydF9tb2RlKQorICAgIGNvbnRlbnRzID0gYm94LmVkaXQoKQorICAgIHN0ZHNjci5hZGRzdHIodWx5K25jb2xzKzIsIDAsICJUZXh0IGVudGVyZWQgaW4gdGhlIGJveFxuIikKKyAgICBzdGRzY3IuYWRkc3RyKHJlcHIoY29udGVudHMpKQorICAgIHN0ZHNjci5hZGRzdHIoJ1xuJykKKyAgICBzdGRzY3IuYWRkc3RyKCdQcmVzcyBhbnkga2V5JykKKyAgICBzdGRzY3IuZ2V0Y2goKQorCisgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgIHN0ZHNjci5tb3ZlKHVseStuY29scysyICsgaSwgMCkKKyAgICAgICAgc3Rkc2NyLmNscnRvZW9sKCkKKworZGVmIG1haW4oc3Rkc2NyKToKKyAgICBzdGRzY3IuY2xlYXIoKQorICAgIHRlc3RfdGV4dHBhZChzdGRzY3IsIEZhbHNlKQorICAgIHRlc3RfdGV4dHBhZChzdGRzY3IsIFRydWUpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBjdXJzZXMud3JhcHBlcihtYWluKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2N1cnNlc190ZXN0cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNhYjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2N1cnNlc190ZXN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2N1cnNlc190ZXN0cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvY3Vyc2VzX3Rlc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzNhYjczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2N1cnNlc190ZXN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RhdGEvUkVBRE1FIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RhdGEvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjhjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGF0YS9SRUFETUUKQEAgLTAsMCArMSwyIEBACitUaGlzIGVtcHR5IGRpcmVjdG9yeSBzZXJ2ZXMgYXMgZGVzdGluYXRpb24gZm9yIHRlbXBvcmFyeSBmaWxlcworY3JlYXRlZCBieSBzb21lIHRlc3RzLgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9hYnMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYWJzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmNzNkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYWJzLmRlY1Rlc3QKQEAgLTAsMCArMSwxNjEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gYWJzLmRlY1Rlc3QgLS0gZGVjaW1hbCBhYnNvbHV0ZSB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBwcmltYXJpbHkgdGVzdHMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgb3BlcmF0b3IuCistLSBBZGRpdG9uLCBzdWJ0cmFjdGlvbiwgcm91bmRpbmcsIGFuZCBtb3JlIG92ZXJmbG93cyBhcmUgdGVzdGVkCistLSBlbHNld2hlcmUuCisKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAxCisKK2Fic3gwMDEgYWJzICcxJyAgICAgIC0+ICcxJworYWJzeDAwMiBhYnMgJy0xJyAgICAgLT4gJzEnCithYnN4MDAzIGFicyAnMS4wMCcgICAtPiAnMS4wMCcKK2Fic3gwMDQgYWJzICctMS4wMCcgIC0+ICcxLjAwJworYWJzeDAwNSBhYnMgJzAnICAgICAgLT4gJzAnCithYnN4MDA2IGFicyAnMC4wMCcgICAtPiAnMC4wMCcKK2Fic3gwMDcgYWJzICcwMC4wJyAgIC0+ICcwLjAnCithYnN4MDA4IGFicyAnMDAuMDAnICAtPiAnMC4wMCcKK2Fic3gwMDkgYWJzICcwMCcgICAgIC0+ICcwJworCithYnN4MDEwIGFicyAnLTInICAgICAtPiAnMicKK2Fic3gwMTEgYWJzICcyJyAgICAgIC0+ICcyJworYWJzeDAxMiBhYnMgJy0yLjAwJyAgLT4gJzIuMDAnCithYnN4MDEzIGFicyAnMi4wMCcgICAtPiAnMi4wMCcKK2Fic3gwMTQgYWJzICctMCcgICAgIC0+ICcwJworYWJzeDAxNSBhYnMgJy0wLjAwJyAgLT4gJzAuMDAnCithYnN4MDE2IGFicyAnLTAwLjAnICAtPiAnMC4wJworYWJzeDAxNyBhYnMgJy0wMC4wMCcgLT4gJzAuMDAnCithYnN4MDE4IGFicyAnLTAwJyAgICAtPiAnMCcKKworYWJzeDAyMCBhYnMgJy0yMDAwMDAwJyAtPiAnMjAwMDAwMCcKK2Fic3gwMjEgYWJzICcyMDAwMDAwJyAgLT4gJzIwMDAwMDAnCitwcmVjaXNpb246IDcKK2Fic3gwMjIgYWJzICctMjAwMDAwMCcgLT4gJzIwMDAwMDAnCithYnN4MDIzIGFicyAnMjAwMDAwMCcgIC0+ICcyMDAwMDAwJworcHJlY2lzaW9uOiA2CithYnN4MDI0IGFicyAnLTIwMDAwMDAnIC0+ICcyLjAwMDAwRSs2JyBSb3VuZGVkCithYnN4MDI1IGFicyAnMjAwMDAwMCcgIC0+ICcyLjAwMDAwRSs2JyBSb3VuZGVkCitwcmVjaXNpb246IDMKK2Fic3gwMjYgYWJzICctMjAwMDAwMCcgLT4gJzIuMDBFKzYnIFJvdW5kZWQKK2Fic3gwMjcgYWJzICcyMDAwMDAwJyAgLT4gJzIuMDBFKzYnIFJvdW5kZWQKKworYWJzeDAzMCBhYnMgJyswLjEnICAgICAgICAgICAgLT4gJzAuMScKK2Fic3gwMzEgYWJzICctMC4xJyAgICAgICAgICAgIC0+ICcwLjEnCithYnN4MDMyIGFicyAnKzAuMDEnICAgICAgICAgICAtPiAnMC4wMScKK2Fic3gwMzMgYWJzICctMC4wMScgICAgICAgICAgIC0+ICcwLjAxJworYWJzeDAzNCBhYnMgJyswLjAwMScgICAgICAgICAgLT4gJzAuMDAxJworYWJzeDAzNSBhYnMgJy0wLjAwMScgICAgICAgICAgLT4gJzAuMDAxJworYWJzeDAzNiBhYnMgJyswLjAwMDAwMScgICAgICAgLT4gJzAuMDAwMDAxJworYWJzeDAzNyBhYnMgJy0wLjAwMDAwMScgICAgICAgLT4gJzAuMDAwMDAxJworYWJzeDAzOCBhYnMgJyswLjAwMDAwMDAwMDAwMScgLT4gJzFFLTEyJworYWJzeDAzOSBhYnMgJy0wLjAwMDAwMDAwMDAwMScgLT4gJzFFLTEyJworCistLSBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCitwcmVjaXNpb246IDkKK2Fic3gwNDAgYWJzICcyLjEnICAgICAtPiAgJzIuMScKK2Fic3gwNDEgYWJzICctMTAwJyAgICAtPiAgJzEwMCcKK2Fic3gwNDIgYWJzICcxMDEuNScgICAtPiAgJzEwMS41JworYWJzeDA0MyBhYnMgJy0xMDEuNScgIC0+ICAnMTAxLjUnCisKKy0tIG1vcmUgZml4ZWQsIHBvdGVudGlhbCBMSFMgc3dhcHMvb3ZlcmxheXMgaWYgZG9uZSBieSBzdWJ0cmFjdCAwCitwcmVjaXNpb246IDkKK2Fic3gwNjAgYWJzICctNTYyNjdFLTEwJyAgLT4gJzAuMDAwMDA1NjI2NycKK2Fic3gwNjEgYWJzICctNTYyNjdFLTUnICAgLT4gJzAuNTYyNjcnCithYnN4MDYyIGFicyAnLTU2MjY3RS0yJyAgIC0+ICc1NjIuNjcnCithYnN4MDYzIGFicyAnLTU2MjY3RS0xJyAgIC0+ICc1NjI2LjcnCithYnN4MDY1IGFicyAnLTU2MjY3RS0wJyAgIC0+ICc1NjI2NycKKworLS0gb3ZlcmZsb3cgdGVzdHMKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDMKK2Fic3gxMjAgYWJzIDkuOTk5RSs5OTk5OTk5OTkgLT4gSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdworcHJlY2lzaW9uOiAzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorYWJzeDIxMCBhYnMgIDEuMDBFLTk5OSAgICAgICAgLT4gICAxLjAwRS05OTkKK2Fic3gyMTEgYWJzICAwLjFFLTk5OSAgICAgICAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorYWJzeDIxMiBhYnMgIDAuMTBFLTk5OSAgICAgICAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsCithYnN4MjEzIGFicyAgMC4xMDBFLTk5OSAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorYWJzeDIxNCBhYnMgIDAuMDFFLTk5OSAgICAgICAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorYWJzeDIxNSBhYnMgIDAuOTk5RS05OTkgICAgICAgLT4gICAxLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2Fic3gyMTYgYWJzICAwLjA5OUUtOTk5ICAgICAgIC0+ICAgMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithYnN4MjE3IGFicyAgMC4wMDlFLTk5OSAgICAgICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWJzeDIxOCBhYnMgIDAuMDAxRS05OTkgICAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorYWJzeDIxOSBhYnMgIDAuMDAwOUUtOTk5ICAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorYWJzeDIyMCBhYnMgIDAuMDAwMUUtOTk5ICAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCithYnN4MjMwIGFicyAtMS4wMEUtOTk5ICAgICAgICAtPiAgIDEuMDBFLTk5OQorYWJzeDIzMSBhYnMgLTAuMUUtOTk5ICAgICAgICAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsCithYnN4MjMyIGFicyAtMC4xMEUtOTk5ICAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK2Fic3gyMzMgYWJzIC0wLjEwMEUtOTk5ICAgICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCithYnN4MjM0IGFicyAtMC4wMUUtOTk5ICAgICAgICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCithYnN4MjM1IGFicyAtMC45OTlFLTk5OSAgICAgICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWJzeDIzNiBhYnMgLTAuMDk5RS05OTkgICAgICAgLT4gICAxLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2Fic3gyMzcgYWJzIC0wLjAwOUUtOTk5ICAgICAgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithYnN4MjM4IGFicyAtMC4wMDFFLTk5OSAgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCithYnN4MjM5IGFicyAtMC4wMDA5RS05OTkgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCithYnN4MjQwIGFicyAtMC4wMDAxRS05OTkgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIGxvbmcgb3BlcmFuZCB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorYWJzeDMwMSBhYnMgMTIzNDU2NzgwMDAgIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK2Fic3gzMDIgYWJzIDEyMzQ1Njc4MDAgICAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2Fic3gzMDMgYWJzIDEyMzQ1Njc4OTAgICAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK2Fic3gzMDQgYWJzIDEyMzQ1Njc4OTEgICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorYWJzeDMwNSBhYnMgMTIzNDU2Nzg5MDEgIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorYWJzeDMwNiBhYnMgMTIzNDU2Nzg5NiAgIC0+IDEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMTUKK2Fic3gzMjEgYWJzIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorYWJzeDMyMiBhYnMgMTIzNDU2NzgwMCAgIC0+IDEyMzQ1Njc4MDAKK2Fic3gzMjMgYWJzIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCithYnN4MzI0IGFicyAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorYWJzeDMyNSBhYnMgMTIzNDU2Nzg5MDEgIC0+IDEyMzQ1Njc4OTAxCithYnN4MzI2IGFicyAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorCisKKy0tIFNwZWNpYWxzCitwcmVjaXNpb246ICAgOQorCistLSBzcGVjaWFscworYWJzeDUyMCBhYnMgJ0luZicgICAgLT4gJ0luZmluaXR5JworYWJzeDUyMSBhYnMgJy1JbmYnICAgLT4gJ0luZmluaXR5JworYWJzeDUyMiBhYnMgICBOYU4gICAgLT4gIE5hTgorYWJzeDUyMyBhYnMgIHNOYU4gICAgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCithYnN4NTI0IGFicyAgIE5hTjIyICAtPiAgTmFOMjIKK2Fic3g1MjUgYWJzICBzTmFOMzMgIC0+ICBOYU4zMyBJbnZhbGlkX29wZXJhdGlvbgorYWJzeDUyNiBhYnMgIC1OYU4yMiAgLT4gLU5hTjIyCithYnN4NTI3IGFicyAtc05hTjMzICAtPiAtTmFOMzMgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworYWJzeDkwMCBhYnMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYWRkLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2FkZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjFjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2FkZC5kZWNUZXN0CkBAIC0wLDAgKzEsMjcxNiBAQAorLS0tLS0tL2NhbmNlbGwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBhZGQuZGVjVGVzdCAtLSBkZWNpbWFsIGFkZGl0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCisKKy0tIFtmaXJzdCBncm91cCBhcmUgJ3F1aWNrIGNvbmZpZGVuY2UgY2hlY2snXQorYWRkeDAwMSBhZGQgMSAgICAgICAxICAgICAgIC0+ICAyCithZGR4MDAyIGFkZCAyICAgICAgIDMgICAgICAgLT4gIDUKK2FkZHgwMDMgYWRkICc1Ljc1JyAgJzMuMycgICAtPiAgOS4wNQorYWRkeDAwNCBhZGQgJzUnICAgICAnLTMnICAgIC0+ICAyCithZGR4MDA1IGFkZCAnLTUnICAgICctMycgICAgLT4gIC04CithZGR4MDA2IGFkZCAnLTcnICAgICcyLjUnICAgLT4gIC00LjUKK2FkZHgwMDcgYWRkICcwLjcnICAgJzAuMycgICAtPiAgMS4wCithZGR4MDA4IGFkZCAnMS4yNScgICcxLjI1JyAgLT4gIDIuNTAKK2FkZHgwMDkgYWRkICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcyLjIzNDU2Nzg5JworYWRkeDAxMCBhZGQgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAxMScgLT4gJzIuMjM0NTY4MDAnCisKK2FkZHgwMTEgYWRkICcwLjQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4MDEyIGFkZCAnMC40NDQ0NDQ0NDQwJyAgJzAuNTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorYWRkeDAxMyBhZGQgJzAuNDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTAnIC0+ICcwLjk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCithZGR4MDE0IGFkZCAnMC40NDQ0NDQ0NDQ0OScgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCithZGR4MDE1IGFkZCAnMC40NDQ0NDQ0NDQ0OTknICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCithZGR4MDE2IGFkZCAnMC40NDQ0NDQ0NDQ0OTk5JyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCithZGR4MDE3IGFkZCAnMC40NDQ0NDQ0NDQ1MDAwJyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCithZGR4MDE4IGFkZCAnMC40NDQ0NDQ0NDQ1MDAxJyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCithZGR4MDE5IGFkZCAnMC40NDQ0NDQ0NDQ1MDEnICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCithZGR4MDIwIGFkZCAnMC40NDQ0NDQ0NDQ1MScgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK2FkZHgwMjEgYWRkIDAgMSAtPiAxCithZGR4MDIyIGFkZCAxIDEgLT4gMgorYWRkeDAyMyBhZGQgMiAxIC0+IDMKK2FkZHgwMjQgYWRkIDMgMSAtPiA0CithZGR4MDI1IGFkZCA0IDEgLT4gNQorYWRkeDAyNiBhZGQgNSAxIC0+IDYKK2FkZHgwMjcgYWRkIDYgMSAtPiA3CithZGR4MDI4IGFkZCA3IDEgLT4gOAorYWRkeDAyOSBhZGQgOCAxIC0+IDkKK2FkZHgwMzAgYWRkIDkgMSAtPiAxMAorCistLSBzb21lIGNhcnJ5aW5nIGVmZmVjdHMKK2FkZHgwMzEgYWRkICcwLjk5OTgnICAnMC4wMDAwJyAtPiAnMC45OTk4JworYWRkeDAzMiBhZGQgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTknCithZGR4MDMzIGFkZCAnMC45OTk4JyAgJzAuMDAwMicgLT4gJzEuMDAwMCcKK2FkZHgwMzQgYWRkICcwLjk5OTgnICAnMC4wMDAzJyAtPiAnMS4wMDAxJworCithZGR4MDM1IGFkZCAnNzAnICAnMTAwMDBlKzknIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDM2IGFkZCAnNzAwJyAgJzEwMDAwZSs5JyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorYWRkeDAzNyBhZGQgJzcwMDAnICAnMTAwMDBlKzknIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDM4IGFkZCAnNzAwMDAnICAnMTAwMDBlKzknIC0+ICcxLjAwMDAwMDAxRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDM5IGFkZCAnNzAwMDAwJyAgJzEwMDAwZSs5JyAtPiAnMS4wMDAwMDAwN0UrMTMnIFJvdW5kZWQKKworLS0gc3ltbWV0cnk6CithZGR4MDQwIGFkZCAnMTAwMDBlKzknICAnNzAnIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDQxIGFkZCAnMTAwMDBlKzknICAnNzAwJyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorYWRkeDA0MiBhZGQgJzEwMDAwZSs5JyAgJzcwMDAnIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDQ0IGFkZCAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICcxLjAwMDAwMDAxRSsxMycgSW5leGFjdCBSb3VuZGVkCithZGR4MDQ1IGFkZCAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMS4wMDAwMDAwN0UrMTMnIFJvdW5kZWQKKworLS0gc2FtZSwgaGlnaGVyIHByZWNpc2lvbgorcHJlY2lzaW9uOiAxNQorYWRkeDA0NiBhZGQgJzEwMDAwZSs5JyAgJzcnIC0+ICcxMDAwMDAwMDAwMDAwNycKK2FkZHgwNDcgYWRkICcxMDAwMGUrOScgICc3MCcgLT4gJzEwMDAwMDAwMDAwMDcwJworYWRkeDA0OCBhZGQgJzEwMDAwZSs5JyAgJzcwMCcgLT4gJzEwMDAwMDAwMDAwNzAwJworYWRkeDA0OSBhZGQgJzEwMDAwZSs5JyAgJzcwMDAnIC0+ICcxMDAwMDAwMDAwNzAwMCcKK2FkZHgwNTAgYWRkICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEwMDAwMDAwMDcwMDAwJworYWRkeDA1MSBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwMCcgLT4gJzEwMDAwMDAwNzAwMDAwJworYWRkeDA1MiBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwMDAnIC0+ICcxMDAwMDAwNzAwMDAwMCcKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorYWRkeDA1MyBhZGQgJzEyJyAnNy4wMCcgLT4gJzE5LjAwJworYWRkeDA1NCBhZGQgJzEuMycgJy0xLjA3JyAtPiAnMC4yMycKK2FkZHgwNTUgYWRkICcxLjMnICctMS4zMCcgLT4gJzAuMDAnCithZGR4MDU2IGFkZCAnMS4zJyAnLTIuMDcnIC0+ICctMC43NycKK2FkZHgwNTcgYWRkICcxRSsyJyAnMUUrNCcgLT4gJzEuMDFFKzQnCisKKy0tIHplcm8gcHJlc2VydmF0aW9uCitwcmVjaXNpb246IDYKK2FkZHgwNjAgYWRkICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEuMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwNjEgYWRkIDEgJzAuMDAwMScgLT4gJzEuMDAwMScKK2FkZHgwNjIgYWRkIDEgJzAuMDAwMDEnIC0+ICcxLjAwMDAxJworYWRkeDA2MyBhZGQgMSAnMC4wMDAwMDEnIC0+ICcxLjAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgwNjQgYWRkIDEgJzAuMDAwMDAwMScgLT4gJzEuMDAwMDAnIEluZXhhY3QgUm91bmRlZAorYWRkeDA2NSBhZGQgMSAnMC4wMDAwMDAwMScgLT4gJzEuMDAwMDAnIEluZXhhY3QgUm91bmRlZAorCistLSBzb21lIGZ1bm55IHplcm9zIFtpbiBjYXNlIG9mIGJhZCBzaWdudW1dCithZGR4MDcwIGFkZCAxICAwICAgIC0+IDEKK2FkZHgwNzEgYWRkIDEgMC4gICAgLT4gMQorYWRkeDA3MiBhZGQgMSAgLjAgICAtPiAxLjAKK2FkZHgwNzMgYWRkIDEgMC4wICAgLT4gMS4wCithZGR4MDc0IGFkZCAxIDAuMDAgIC0+IDEuMDAKK2FkZHgwNzUgYWRkICAwICAxICAgLT4gMQorYWRkeDA3NiBhZGQgMC4gIDEgICAtPiAxCithZGR4MDc3IGFkZCAgLjAgMSAgIC0+IDEuMAorYWRkeDA3OCBhZGQgMC4wIDEgICAtPiAxLjAKK2FkZHgwNzkgYWRkIDAuMDAgMSAgLT4gMS4wMAorCitwcmVjaXNpb246IDkKKworLS0gc29tZSBjYXJyaWVzCithZGR4MDgwIGFkZCA5OTk5OTk5OTggMSAgLT4gOTk5OTk5OTk5CithZGR4MDgxIGFkZCA5OTk5OTk5OTkgMSAgLT4gMS4wMDAwMDAwMEUrOSBSb3VuZGVkCithZGR4MDgyIGFkZCAgOTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwCithZGR4MDgzIGFkZCAgIDk5OTk5OTkgMSAgLT4gMTAwMDAwMDAKK2FkZHgwODQgYWRkICAgIDk5OTk5OSAxICAtPiAxMDAwMDAwCithZGR4MDg1IGFkZCAgICAgOTk5OTkgMSAgLT4gMTAwMDAwCithZGR4MDg2IGFkZCAgICAgIDk5OTkgMSAgLT4gMTAwMDAKK2FkZHgwODcgYWRkICAgICAgIDk5OSAxICAtPiAxMDAwCithZGR4MDg4IGFkZCAgICAgICAgOTkgMSAgLT4gMTAwCithZGR4MDg5IGFkZCAgICAgICAgIDkgMSAgLT4gMTAKKworCistLSBtb3JlIExIUyBzd2FwcworYWRkeDA5MCBhZGQgJy01NjI2N0UtMTAnICAgMCAtPiAgJy0wLjAwMDAwNTYyNjcnCithZGR4MDkxIGFkZCAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3JworYWRkeDA5MiBhZGQgJy01NjI2N0UtNScgICAgMCAtPiAgJy0wLjU2MjY3JworYWRkeDA5MyBhZGQgJy01NjI2N0UtNCcgICAgMCAtPiAgJy01LjYyNjcnCithZGR4MDk0IGFkZCAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK2FkZHgwOTUgYWRkICctNTYyNjdFLTInICAgIDAgLT4gICctNTYyLjY3JworYWRkeDA5NiBhZGQgJy01NjI2N0UtMScgICAgMCAtPiAgJy01NjI2LjcnCithZGR4MDk3IGFkZCAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3JworYWRkeDA5OCBhZGQgJy01RS0xMCcgICAgICAgMCAtPiAgJy01RS0xMCcKK2FkZHgwOTkgYWRkICctNUUtNycgICAgICAgIDAgLT4gICctNUUtNycKK2FkZHgxMDAgYWRkICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCithZGR4MTAxIGFkZCAnLTVFLTUnICAgICAgICAwIC0+ICAnLTAuMDAwMDUnCithZGR4MTAyIGFkZCAnLTVFLTQnICAgICAgICAwIC0+ICAnLTAuMDAwNScKK2FkZHgxMDMgYWRkICctNUUtMScgICAgICAgIDAgLT4gICctMC41JworYWRkeDEwNCBhZGQgJy01RTAnICAgICAgICAgMCAtPiAgJy01JworYWRkeDEwNSBhZGQgJy01RTEnICAgICAgICAgMCAtPiAgJy01MCcKK2FkZHgxMDYgYWRkICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworYWRkeDEwNyBhZGQgJy01RTgnICAgICAgICAgMCAtPiAgJy01MDAwMDAwMDAnCithZGR4MTA4IGFkZCAnLTVFOScgICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzknICAgUm91bmRlZAorYWRkeDEwOSBhZGQgJy01RTEwJyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSsxMCcgIFJvdW5kZWQKK2FkZHgxMTAgYWRkICctNUUxMScgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMEUrMTEnICBSb3VuZGVkCithZGR4MTExIGFkZCAnLTVFMTAwJyAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzEwMCcgUm91bmRlZAorCistLSBtb3JlIFJIUyBzd2FwcworYWRkeDExMyBhZGQgMCAgJy01NjI2N0UtMTAnIC0+ICAnLTAuMDAwMDA1NjI2NycKK2FkZHgxMTQgYWRkIDAgICctNTYyNjdFLTYnICAtPiAgJy0wLjA1NjI2NycKK2FkZHgxMTYgYWRkIDAgICctNTYyNjdFLTUnICAtPiAgJy0wLjU2MjY3JworYWRkeDExNyBhZGQgMCAgJy01NjI2N0UtNCcgIC0+ICAnLTUuNjI2NycKK2FkZHgxMTkgYWRkIDAgICctNTYyNjdFLTMnICAtPiAgJy01Ni4yNjcnCithZGR4MTIwIGFkZCAwICAnLTU2MjY3RS0yJyAgLT4gICctNTYyLjY3JworYWRkeDEyMSBhZGQgMCAgJy01NjI2N0UtMScgIC0+ICAnLTU2MjYuNycKK2FkZHgxMjIgYWRkIDAgICctNTYyNjdFLTAnICAtPiAgJy01NjI2NycKK2FkZHgxMjMgYWRkIDAgICctNUUtMTAnICAgICAtPiAgJy01RS0xMCcKK2FkZHgxMjQgYWRkIDAgICctNUUtNycgICAgICAtPiAgJy01RS03JworYWRkeDEyNSBhZGQgMCAgJy01RS02JyAgICAgIC0+ICAnLTAuMDAwMDA1JworYWRkeDEyNiBhZGQgMCAgJy01RS01JyAgICAgIC0+ICAnLTAuMDAwMDUnCithZGR4MTI3IGFkZCAwICAnLTVFLTQnICAgICAgLT4gICctMC4wMDA1JworYWRkeDEyOCBhZGQgMCAgJy01RS0xJyAgICAgIC0+ICAnLTAuNScKK2FkZHgxMjkgYWRkIDAgICctNUUwJyAgICAgICAtPiAgJy01JworYWRkeDEzMCBhZGQgMCAgJy01RTEnICAgICAgIC0+ICAnLTUwJworYWRkeDEzMSBhZGQgMCAgJy01RTUnICAgICAgIC0+ICAnLTUwMDAwMCcKK2FkZHgxMzIgYWRkIDAgICctNUU4JyAgICAgICAtPiAgJy01MDAwMDAwMDAnCithZGR4MTMzIGFkZCAwICAnLTVFOScgICAgICAgLT4gICctNS4wMDAwMDAwMEUrOScgICAgUm91bmRlZAorYWRkeDEzNCBhZGQgMCAgJy01RTEwJyAgICAgIC0+ICAnLTUuMDAwMDAwMDBFKzEwJyAgIFJvdW5kZWQKK2FkZHgxMzUgYWRkIDAgICctNUUxMScgICAgICAtPiAgJy01LjAwMDAwMDAwRSsxMScgICBSb3VuZGVkCithZGR4MTM2IGFkZCAwICAnLTVFMTAwJyAgICAgLT4gICctNS4wMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCistLSByZWxhdGVkCithZGR4MTM3IGFkZCAgMSAgJzBFLTEyJyAgICAgIC0+ICAnMS4wMDAwMDAwMCcgIFJvdW5kZWQKK2FkZHgxMzggYWRkIC0xICAnMEUtMTInICAgICAgLT4gICctMS4wMDAwMDAwMCcgUm91bmRlZAorYWRkeDEzOSBhZGQgJzBFLTEyJyAxICAgICAgICAtPiAgJzEuMDAwMDAwMDAnICBSb3VuZGVkCithZGR4MTQwIGFkZCAnMEUtMTInIC0xICAgICAgIC0+ICAnLTEuMDAwMDAwMDAnIFJvdW5kZWQKK2FkZHgxNDEgYWRkIDFFKzQgICAgMC4wMDAwICAgLT4gICcxMDAwMC4wMDAwJworYWRkeDE0MiBhZGQgMUUrNCAgICAwLjAwMDAwICAtPiAgJzEwMDAwLjAwMDAnICBSb3VuZGVkCithZGR4MTQzIGFkZCAwLjAwMCAgIDFFKzUgICAgIC0+ICAnMTAwMDAwLjAwMCcKK2FkZHgxNDQgYWRkIDAuMDAwMCAgMUUrNSAgICAgLT4gICcxMDAwMDAuMDAwJyAgUm91bmRlZAorCistLSBbc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzXQorYWRkeDE0NiBhZGQgJzAwLjAnICAwICAgICAgIC0+ICAnMC4wJworYWRkeDE0NyBhZGQgJzAuMDAnICAwICAgICAgIC0+ICAnMC4wMCcKK2FkZHgxNDggYWRkICAwICAgICAgJzAuMDAnICAtPiAgJzAuMDAnCithZGR4MTQ5IGFkZCAgMCAgICAgICcwMC4wJyAgLT4gICcwLjAnCithZGR4MTUwIGFkZCAnMDAuMCcgICcwLjAwJyAgLT4gICcwLjAwJworYWRkeDE1MSBhZGQgJzAuMDAnICAnMDAuMCcgIC0+ICAnMC4wMCcKK2FkZHgxNTIgYWRkICczJyAgICAgJy4zJyAgICAtPiAgJzMuMycKK2FkZHgxNTMgYWRkICczLicgICAgJy4zJyAgICAtPiAgJzMuMycKK2FkZHgxNTQgYWRkICczLjAnICAgJy4zJyAgICAtPiAgJzMuMycKK2FkZHgxNTUgYWRkICczLjAwJyAgJy4zJyAgICAtPiAgJzMuMzAnCithZGR4MTU2IGFkZCAnMycgICAgICczJyAgICAgLT4gICc2JworYWRkeDE1NyBhZGQgJzMnICAgICAnKzMnICAgIC0+ICAnNicKK2FkZHgxNTggYWRkICczJyAgICAgJy0zJyAgICAtPiAgJzAnCithZGR4MTU5IGFkZCAnMC4zJyAgICctMC4zJyAgLT4gICcwLjAnCithZGR4MTYwIGFkZCAnMC4wMycgICctMC4wMycgLT4gICcwLjAwJworCistLSB0cnkgYm9yZGVybGluZSBwcmVjaXNpb24sIHdpdGggY2FycmllcywgZXRjLgorcHJlY2lzaW9uOiAxNQorYWRkeDE2MSBhZGQgJzFFKzEyJyAnLTEnICAgIC0+ICc5OTk5OTk5OTk5OTknCithZGR4MTYyIGFkZCAnMUUrMTInICAnMS4xMScgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCithZGR4MTYzIGFkZCAnMS4xMScgICcxRSsxMicgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCithZGR4MTY0IGFkZCAnLTEnICAgICcxRSsxMicgLT4gJzk5OTk5OTk5OTk5OScKK2FkZHgxNjUgYWRkICc3RSsxMicgJy0xJyAgICAtPiAnNjk5OTk5OTk5OTk5OScKK2FkZHgxNjYgYWRkICc3RSsxMicgICcxLjExJyAtPiAnNzAwMDAwMDAwMDAwMS4xMScKK2FkZHgxNjcgYWRkICcxLjExJyAgJzdFKzEyJyAtPiAnNzAwMDAwMDAwMDAwMS4xMScKK2FkZHgxNjggYWRkICctMScgICAgJzdFKzEyJyAtPiAnNjk5OTk5OTk5OTk5OScKKworLS0gICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1ICAgICAgMTIzNDU2Nzg5MDEyMzQ1ICAgICAgMSAyMzQ1Njc4OTAxMjM0NQorYWRkeDE3MCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTYzJyAtPiAnMS4wMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCithZGR4MTcxIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NjInIC0+ICcxLjAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxNzIgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU2MScgLT4gJzEuMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorYWRkeDE3MyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTYwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4MTc0IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTknIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxNzUgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1OCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorYWRkeDE3NiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU3JyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4MTc3IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCithZGR4MTc4IGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OScKK2FkZHgxNzkgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk4JworYWRkeDE4MCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTUzJyAtPiAnMC45OTk5OTk5OTk5OTk5OTcnCithZGR4MTgxIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTInIC0+ICcwLjk5OTk5OTk5OTk5OTk5NicKK2FkZHgxODIgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1MScgLT4gJzAuOTk5OTk5OTk5OTk5OTk1JworYWRkeDE4MyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTk5OTk5OTQnCisKKy0tIGFuZCBzb21lIG1vcmUsIGluY2x1ZGluZyByZXNpZHVlIGVmZmVjdHMgYW5kIGRpZmZlcmVudCByb3VuZGluZ3MKK3ByZWNpc2lvbjogOQorcm91bmRpbmc6IGhhbGZfdXAKK2FkZHgyMDAgYWRkICcxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScKK2FkZHgyMDEgYWRkICcxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjAyIGFkZCAnMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIwMyBhZGQgJzEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMDQgYWRkICcxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjA1IGFkZCAnMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIwNiBhZGQgJzEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMDcgYWRkICcxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjA4IGFkZCAnMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIwOSBhZGQgJzEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMTAgYWRkICcxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjExIGFkZCAnMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIxMiBhZGQgJzEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMTMgYWRkICcxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjE0IGFkZCAnMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIxNSBhZGQgJzEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMTYgYWRkICcxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcKK2FkZHgyMTcgYWRkICcxMjM0NTY3ODknIDEuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjE4IGFkZCAnMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIxOSBhZGQgJzEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorYWRkeDIyMCBhZGQgJzEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JworYWRkeDIyMSBhZGQgJzEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMjIgYWRkICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjIzIGFkZCAnMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIyNCBhZGQgJzEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMjUgYWRkICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjI2IGFkZCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDIyNyBhZGQgJzEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMjggYWRkICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjI5IGFkZCAnMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIzMCBhZGQgJzEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMzEgYWRkICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjMyIGFkZCAnMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIzMyBhZGQgJzEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMzQgYWRkICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjM1IGFkZCAnMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDIzNiBhZGQgJzEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2NzkwJworYWRkeDIzNyBhZGQgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyMzggYWRkICcxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjM5IGFkZCAnMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK2FkZHgyNDAgYWRkICcxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjQxIGFkZCAnMTIzNDU2Nzg4JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorYWRkeDI0MiBhZGQgJzEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2FkZHgyNTAgYWRkICcxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScKK2FkZHgyNTEgYWRkICcxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjUyIGFkZCAnMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI1MyBhZGQgJzEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNTQgYWRkICcxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjU1IGFkZCAnMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI1NiBhZGQgJzEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNTcgYWRkICcxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjU4IGFkZCAnMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI1OSBhZGQgJzEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNjAgYWRkICcxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjYxIGFkZCAnMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI2MiBhZGQgJzEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNjMgYWRkICcxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4MjY0IGFkZCAnMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDI2NSBhZGQgJzEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNjYgYWRkICcxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcKK2FkZHgyNjcgYWRkICcxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjY4IGFkZCAnMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDI2OSBhZGQgJzEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gaW5wdXQgcHJlcGFyYXRpb24gdGVzdHMgKG9wZXJhbmRzIHNob3VsZCBub3QgYmUgcm91bmRlZCkKK3ByZWNpc2lvbjogMworcm91bmRpbmc6IGhhbGZfdXAKKworYWRkeDI3MCBhZGQgJzEyMzQ1Njc4OTAwMDAwJyAgOTk5OTk5OTk5OTk5OSAtPiAgJzIuMjNFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNzEgYWRkICAnOTk5OTk5OTk5OTk5OScgMTIzNDU2Nzg5MDAwMDAgLT4gICcyLjIzRSsxMycgSW5leGFjdCBSb3VuZGVkCisKK2FkZHgyNzIgYWRkICcxMkUrMycgICczNDQ0JyAgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjczIGFkZCAnMTJFKzMnICAnMzQ0NicgICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI3NCBhZGQgJzEyRSszJyAgJzM0NDkuOScgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNzUgYWRkICcxMkUrMycgICczNDUwLjAnIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4Mjc2IGFkZCAnMTJFKzMnICAnMzQ1MC4xJyAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI3NyBhZGQgJzEyRSszJyAgJzM0NTQnICAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyNzggYWRkICcxMkUrMycgICczNDU2JyAgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCisKK2FkZHgyODEgYWRkICczNDQ0JyAgICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjgyIGFkZCAnMzQ0NicgICAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI4MyBhZGQgJzM0NDkuOScgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyODQgYWRkICczNDUwLjAnICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4Mjg1IGFkZCAnMzQ1MC4xJyAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI4NiBhZGQgJzM0NTQnICAgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyODcgYWRkICczNDU2JyAgICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2FkZHgyOTEgYWRkICczNDQ0JyAgICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4MjkyIGFkZCAnMzQ0NicgICAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI5MyBhZGQgJzM0NDkuOScgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyOTQgYWRkICczNDUwLjAnICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCithZGR4Mjk1IGFkZCAnMzQ1MC4xJyAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorYWRkeDI5NiBhZGQgJzM0NTQnICAgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgyOTcgYWRkICczNDU2JyAgICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIDEgaW4gbGFzdCBwbGFjZSB0ZXN0cworcm91bmRpbmc6IGhhbGZfdXAKK2FkZHgzMDEgYWRkICAtMSAgIDEgICAgICAtPiAgIDAKK2FkZHgzMDIgYWRkICAgMCAgIDEgICAgICAtPiAgIDEKK2FkZHgzMDMgYWRkICAgMSAgIDEgICAgICAtPiAgIDIKK2FkZHgzMDQgYWRkICAxMiAgIDEgICAgICAtPiAgMTMKK2FkZHgzMDUgYWRkICA5OCAgIDEgICAgICAtPiAgOTkKK2FkZHgzMDYgYWRkICA5OSAgIDEgICAgICAtPiAxMDAKK2FkZHgzMDcgYWRkIDEwMCAgIDEgICAgICAtPiAxMDEKK2FkZHgzMDggYWRkIDEwMSAgIDEgICAgICAtPiAxMDIKK2FkZHgzMDkgYWRkICAtMSAgLTEgICAgICAtPiAgLTIKK2FkZHgzMTAgYWRkICAgMCAgLTEgICAgICAtPiAgLTEKK2FkZHgzMTEgYWRkICAgMSAgLTEgICAgICAtPiAgIDAKK2FkZHgzMTIgYWRkICAxMiAgLTEgICAgICAtPiAgMTEKK2FkZHgzMTMgYWRkICA5OCAgLTEgICAgICAtPiAgOTcKK2FkZHgzMTQgYWRkICA5OSAgLTEgICAgICAtPiAgOTgKK2FkZHgzMTUgYWRkIDEwMCAgLTEgICAgICAtPiAgOTkKK2FkZHgzMTYgYWRkIDEwMSAgLTEgICAgICAtPiAxMDAKKworYWRkeDMyMSBhZGQgLTAuMDEgIDAuMDEgICAgLT4gIDAuMDAKK2FkZHgzMjIgYWRkICAwLjAwICAwLjAxICAgIC0+ICAwLjAxCithZGR4MzIzIGFkZCAgMC4wMSAgMC4wMSAgICAtPiAgMC4wMgorYWRkeDMyNCBhZGQgIDAuMTIgIDAuMDEgICAgLT4gIDAuMTMKK2FkZHgzMjUgYWRkICAwLjk4ICAwLjAxICAgIC0+ICAwLjk5CithZGR4MzI2IGFkZCAgMC45OSAgMC4wMSAgICAtPiAgMS4wMAorYWRkeDMyNyBhZGQgIDEuMDAgIDAuMDEgICAgLT4gIDEuMDEKK2FkZHgzMjggYWRkICAxLjAxICAwLjAxICAgIC0+ICAxLjAyCithZGR4MzI5IGFkZCAtMC4wMSAtMC4wMSAgICAtPiAtMC4wMgorYWRkeDMzMCBhZGQgIDAuMDAgLTAuMDEgICAgLT4gLTAuMDEKK2FkZHgzMzEgYWRkICAwLjAxIC0wLjAxICAgIC0+ICAwLjAwCithZGR4MzMyIGFkZCAgMC4xMiAtMC4wMSAgICAtPiAgMC4xMQorYWRkeDMzMyBhZGQgIDAuOTggLTAuMDEgICAgLT4gIDAuOTcKK2FkZHgzMzQgYWRkICAwLjk5IC0wLjAxICAgIC0+ICAwLjk4CithZGR4MzM1IGFkZCAgMS4wMCAtMC4wMSAgICAtPiAgMC45OQorYWRkeDMzNiBhZGQgIDEuMDEgLTAuMDEgICAgLT4gIDEuMDAKKworLS0gc29tZSBtb3JlIGNhc2VzIHdoZXJlIGFkZGluZyAwIGFmZmVjdHMgdGhlIGNvZWZmaWNpZW50CitwcmVjaXNpb246IDkKK2FkZHgzNDAgYWRkIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2FkZHgzNDEgYWRkIDFFKzggICAgMCAgICAtPiAgICAxMDAwMDAwMDAKK2FkZHgzNDIgYWRkIDFFKzkgICAgMCAgICAtPiAgIDEuMDAwMDAwMDBFKzkgICBSb3VuZGVkCithZGR4MzQzIGFkZCAxRSsxMCAgIDAgICAgLT4gICAxLjAwMDAwMDAwRSsxMCAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorYWRkeDM0NCBhZGQgMUUrMyAgICAxICAgIC0+ICAgICAgICAgMTAwMQorYWRkeDM0NSBhZGQgMUUrOCAgICAxICAgIC0+ICAgIDEwMDAwMDAwMQorYWRkeDM0NiBhZGQgMUUrOSAgICAxICAgIC0+ICAgMS4wMDAwMDAwMEUrOSAgIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NyBhZGQgMUUrMTAgICAxICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgIEluZXhhY3QgUm91bmRlZAorYWRkeDM0OCBhZGQgMUUrMyAgICA3ICAgIC0+ICAgICAgICAgMTAwNworYWRkeDM0OSBhZGQgMUUrOCAgICA3ICAgIC0+ICAgIDEwMDAwMDAwNworYWRkeDM1MCBhZGQgMUUrOSAgICA3ICAgIC0+ICAgMS4wMDAwMDAwMUUrOSAgIEluZXhhY3QgUm91bmRlZAorYWRkeDM1MSBhZGQgMUUrMTAgICA3ICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgIEluZXhhY3QgUm91bmRlZAorCistLSB0cnl6ZXJvcyBjYXNlcworcHJlY2lzaW9uOiAgIDcKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTIKK21pbmV4cG9uZW50OiAtOTIKK2FkZHgzNjEgIGFkZCAwRSs1MCAxMDAwMEUrMSAgLT4gMS4wMDAwRSs1CithZGR4MzYyICBhZGQgMTAwMDBFKzEgMEUtNTAgIC0+IDEwMDAwMC4wICBSb3VuZGVkCithZGR4MzYzICBhZGQgMTAwMDBFKzEgMTAwMDBFLTUwICAtPiAxMDAwMDAuMCAgUm91bmRlZCBJbmV4YWN0CithZGR4MzY0ICBhZGQgOS45OTk5OTlFKzkyIC05Ljk5OTk5OUUrOTIgLT4gMEUrODYKKworLS0gYSBjdXJpb3NpdHkgZnJvbSBKU1IgMTMgdGVzdGluZworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorcHJlY2lzaW9uOiAgIDEwCithZGR4MzcwIGFkZCA5OTk5OTk5OSA4MTUxMiAtPiAxMDAwODE1MTEKK3ByZWNpc2lvbjogICAgICA2CithZGR4MzcxIGFkZCA5OTk5OTk5OSA4MTUxMiAtPiAxLjAwMDgyRSs4IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK3ByZWNpc2lvbjogICAxMAorYWRkeDM3MiBhZGQgOTk5OTk5OTkgODE1MTIgLT4gMTAwMDgxNTExCitwcmVjaXNpb246ICAgICAgNgorYWRkeDM3MyBhZGQgOTk5OTk5OTkgODE1MTIgLT4gMS4wMDA4MkUrOCBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK3ByZWNpc2lvbjogICAxMAorYWRkeDM3NCBhZGQgOTk5OTk5OTkgODE1MTIgLT4gMTAwMDgxNTExCitwcmVjaXNpb246ICAgICAgNgorYWRkeDM3NSBhZGQgOTk5OTk5OTkgODE1MTIgLT4gMS4wMDA4MkUrOCBSb3VuZGVkIEluZXhhY3QKKworLS0gdWxwIHJlcGxhY2VtZW50IHRlc3RzCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CithZGR4NDAwIGFkZCAgIDEgICA3N2UtNyAgICAgICAtPiAgMS4wMDAwMDc3CithZGR4NDAxIGFkZCAgIDEgICA3N2UtOCAgICAgICAtPiAgMS4wMDAwMDA3NworYWRkeDQwMiBhZGQgICAxICAgNzdlLTkgICAgICAgLT4gIDEuMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCithZGR4NDAzIGFkZCAgIDEgICA3N2UtMTAgICAgICAtPiAgMS4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MDQgYWRkICAgMSAgIDc3ZS0xMSAgICAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQwNSBhZGQgICAxICAgNzdlLTEyICAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDA2IGFkZCAgIDEgICA3N2UtOTk5ICAgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MDcgYWRkICAgMSAgIDc3ZS05OTk5OTk5IC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCithZGR4NDEwIGFkZCAgMTAgICA3N2UtNyAgICAgICAtPiAgMTAuMDAwMDA3NworYWRkeDQxMSBhZGQgIDEwICAgNzdlLTggICAgICAgLT4gIDEwLjAwMDAwMDggSW5leGFjdCBSb3VuZGVkCithZGR4NDEyIGFkZCAgMTAgICA3N2UtOSAgICAgICAtPiAgMTAuMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MTMgYWRkICAxMCAgIDc3ZS0xMCAgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQxNCBhZGQgIDEwICAgNzdlLTExICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDE1IGFkZCAgMTAgICA3N2UtMTIgICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MTYgYWRkICAxMCAgIDc3ZS05OTkgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQxNyBhZGQgIDEwICAgNzdlLTk5OTk5OTkgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg0MjAgYWRkICA3N2UtNyAgICAgICAgMSAgIC0+ICAxLjAwMDAwNzcKK2FkZHg0MjEgYWRkICA3N2UtOCAgICAgICAgMSAgIC0+ICAxLjAwMDAwMDc3CithZGR4NDIyIGFkZCAgNzdlLTkgICAgICAgIDEgICAtPiAgMS4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MjMgYWRkICA3N2UtMTAgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDQyNCBhZGQgIDc3ZS0xMSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDI1IGFkZCAgNzdlLTEyICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MjYgYWRkICA3N2UtOTk5ICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQyNyBhZGQgIDc3ZS05OTk5OTk5ICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg0MzAgYWRkICA3N2UtNyAgICAgICAxMCAgIC0+ICAxMC4wMDAwMDc3CithZGR4NDMxIGFkZCAgNzdlLTggICAgICAgMTAgICAtPiAgMTAuMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MzIgYWRkICA3N2UtOSAgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDQzMyBhZGQgIDc3ZS0xMCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDM0IGFkZCAgNzdlLTExICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0MzUgYWRkICA3N2UtMTIgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQzNiBhZGQgIDc3ZS05OTkgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDM3IGFkZCAgNzdlLTk5OTk5OTkgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworYWRkeDQ0MCBhZGQgICAxICAgLTc3ZS03ICAgICAgIC0+ICAwLjk5OTk5MjMKK2FkZHg0NDEgYWRkICAgMSAgIC03N2UtOCAgICAgICAtPiAgMC45OTk5OTkyMworYWRkeDQ0MiBhZGQgICAxICAgLTc3ZS05ICAgICAgIC0+ICAwLjk5OTk5OTkyMworYWRkeDQ0MyBhZGQgICAxICAgLTc3ZS0xMCAgICAgIC0+ICAwLjk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NDQgYWRkICAgMSAgIC03N2UtMTEgICAgICAtPiAgMC45OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NDQ1IGFkZCAgIDEgICAtNzdlLTEyICAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDQ2IGFkZCAgIDEgICAtNzdlLTk5OSAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDQ3IGFkZCAgIDEgICAtNzdlLTk5OTk5OTkgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg0NTAgYWRkICAxMCAgIC03N2UtNyAgICAgICAtPiAgIDkuOTk5OTkyMworYWRkeDQ1MSBhZGQgIDEwICAgLTc3ZS04ICAgICAgIC0+ICAgOS45OTk5OTkyMworYWRkeDQ1MiBhZGQgIDEwICAgLTc3ZS05ICAgICAgIC0+ICAgOS45OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0NTMgYWRkICAxMCAgIC03N2UtMTAgICAgICAtPiAgIDkuOTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NDU0IGFkZCAgMTAgICAtNzdlLTExICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDU1IGFkZCAgMTAgICAtNzdlLTEyICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDU2IGFkZCAgMTAgICAtNzdlLTk5OSAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDU3IGFkZCAgMTAgICAtNzdlLTk5OTk5OTkgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg0NjAgYWRkICAtNzdlLTcgICAgICAgIDEgICAtPiAgMC45OTk5OTIzCithZGR4NDYxIGFkZCAgLTc3ZS04ICAgICAgICAxICAgLT4gIDAuOTk5OTk5MjMKK2FkZHg0NjIgYWRkICAtNzdlLTkgICAgICAgIDEgICAtPiAgMC45OTk5OTk5MjMKK2FkZHg0NjMgYWRkICAtNzdlLTEwICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NDY0IGFkZCAgLTc3ZS0xMSAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDQ2NSBhZGQgIC03N2UtMTIgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ2NiBhZGQgIC03N2UtOTk5ICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ2NyBhZGQgIC03N2UtOTk5OTk5OSAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCithZGR4NDcwIGFkZCAgLTc3ZS03ICAgICAgIDEwICAgLT4gICA5Ljk5OTk5MjMKK2FkZHg0NzEgYWRkICAtNzdlLTggICAgICAgMTAgICAtPiAgIDkuOTk5OTk5MjMKK2FkZHg0NzIgYWRkICAtNzdlLTkgICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NDczIGFkZCAgLTc3ZS0xMCAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDQ3NCBhZGQgIC03N2UtMTEgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ3NSBhZGQgIC03N2UtMTIgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ3NiBhZGQgIC03N2UtOTk5ICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ3NyBhZGQgIC03N2UtOTk5OTk5OSAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCithZGR4NDgwIGFkZCAgLTEgICAgNzdlLTcgICAgICAgLT4gIC0wLjk5OTk5MjMKK2FkZHg0ODEgYWRkICAtMSAgICA3N2UtOCAgICAgICAtPiAgLTAuOTk5OTk5MjMKK2FkZHg0ODIgYWRkICAtMSAgICA3N2UtOSAgICAgICAtPiAgLTAuOTk5OTk5OTIzCithZGR4NDgzIGFkZCAgLTEgICAgNzdlLTEwICAgICAgLT4gIC0wLjk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0ODQgYWRkICAtMSAgICA3N2UtMTEgICAgICAtPiAgLTAuOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDQ4NSBhZGQgIC0xICAgIDc3ZS0xMiAgICAgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0ODYgYWRkICAtMSAgICA3N2UtOTk5ICAgICAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDg3IGFkZCAgLTEgICAgNzdlLTk5OTk5OTkgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCithZGR4NDkwIGFkZCAtMTAgICAgNzdlLTcgICAgICAgLT4gICAtOS45OTk5OTIzCithZGR4NDkxIGFkZCAtMTAgICAgNzdlLTggICAgICAgLT4gICAtOS45OTk5OTkyMworYWRkeDQ5MiBhZGQgLTEwICAgIDc3ZS05ICAgICAgIC0+ICAgLTkuOTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NDkzIGFkZCAtMTAgICAgNzdlLTEwICAgICAgLT4gICAtOS45OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0OTQgYWRkIC0xMCAgICA3N2UtMTEgICAgICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NDk1IGFkZCAtMTAgICAgNzdlLTEyICAgICAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDQ5NiBhZGQgLTEwICAgIDc3ZS05OTkgICAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg0OTcgYWRkIC0xMCAgICA3N2UtOTk5OTk5OSAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg1MDAgYWRkICAgNzdlLTcgICAgICAgLTEgICAtPiAgLTAuOTk5OTkyMworYWRkeDUwMSBhZGQgICA3N2UtOCAgICAgICAtMSAgIC0+ICAtMC45OTk5OTkyMworYWRkeDUwMiBhZGQgICA3N2UtOSAgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5MjMKK2FkZHg1MDMgYWRkICAgNzdlLTEwICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorYWRkeDUwNCBhZGQgICA3N2UtMTEgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NTA1IGFkZCAgIDc3ZS0xMiAgICAgIC0xICAgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDUwNiBhZGQgICA3N2UtOTk5ICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MDcgYWRkICAgNzdlLTk5OTk5OTkgLTEgICAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg1MTAgYWRkICAgNzdlLTcgICAgICAgLTEwICAtPiAgIC05Ljk5OTk5MjMKK2FkZHg1MTEgYWRkICAgNzdlLTggICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTIzCithZGR4NTEyIGFkZCAgIDc3ZS05ICAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MTMgYWRkICAgNzdlLTEwICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDUxNCBhZGQgICA3N2UtMTEgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MTUgYWRkICAgNzdlLTEyICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NTE2IGFkZCAgIDc3ZS05OTkgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDUxNyBhZGQgICA3N2UtOTk5OTk5OSAtMTAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworCistLSBsb25nIG9wZXJhbmRzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CithZGR4NTIxIGFkZCAxMjM0NTY3ODAwMCAwIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK2FkZHg1MjIgYWRkIDAgMTIzNDU2NzgwMDAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorYWRkeDUyMyBhZGQgMTIzNDU2NzgwMCAgMCAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK2FkZHg1MjQgYWRkIDAgMTIzNDU2NzgwMCAgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCithZGR4NTI1IGFkZCAxMjM0NTY3ODkwICAwIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorYWRkeDUyNiBhZGQgMCAxMjM0NTY3ODkwICAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK2FkZHg1MjcgYWRkIDEyMzQ1Njc4OTEgIDAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MjggYWRkIDAgMTIzNDU2Nzg5MSAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg1MjkgYWRkIDEyMzQ1Njc4OTAxIDAgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCithZGR4NTMwIGFkZCAwIDEyMzQ1Njc4OTAxIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorYWRkeDUzMSBhZGQgMTIzNDU2Nzg5NiAgMCAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorYWRkeDUzMiBhZGQgMCAxMjM0NTY3ODk2ICAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDE1CistLSBzdGlsbCBjaGVja2luZworYWRkeDU0MSBhZGQgMTIzNDU2NzgwMDAgMCAtPiAxMjM0NTY3ODAwMAorYWRkeDU0MiBhZGQgMCAxMjM0NTY3ODAwMCAtPiAxMjM0NTY3ODAwMAorYWRkeDU0MyBhZGQgMTIzNDU2NzgwMCAgMCAtPiAxMjM0NTY3ODAwCithZGR4NTQ0IGFkZCAwIDEyMzQ1Njc4MDAgIC0+IDEyMzQ1Njc4MDAKK2FkZHg1NDUgYWRkIDEyMzQ1Njc4OTAgIDAgLT4gMTIzNDU2Nzg5MAorYWRkeDU0NiBhZGQgMCAxMjM0NTY3ODkwICAtPiAxMjM0NTY3ODkwCithZGR4NTQ3IGFkZCAxMjM0NTY3ODkxICAwIC0+IDEyMzQ1Njc4OTEKK2FkZHg1NDggYWRkIDAgMTIzNDU2Nzg5MSAgLT4gMTIzNDU2Nzg5MQorYWRkeDU0OSBhZGQgMTIzNDU2Nzg5MDEgMCAtPiAxMjM0NTY3ODkwMQorYWRkeDU1MCBhZGQgMCAxMjM0NTY3ODkwMSAtPiAxMjM0NTY3ODkwMQorYWRkeDU1MSBhZGQgMTIzNDU2Nzg5NiAgMCAtPiAxMjM0NTY3ODk2CithZGR4NTUyIGFkZCAwIDEyMzQ1Njc4OTYgIC0+IDEyMzQ1Njc4OTYKKworLS0gdmVyaWZ5IGEgcXVlcnkKK3ByZWNpc2lvbjogICAgMTYKK21heEV4cG9uZW50OiArMzk0CittaW5FeHBvbmVudDogLTM5Mworcm91bmRpbmc6ICAgICBkb3duCithZGR4NTYxIGFkZCAxZS0zOTggOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDU2MiBhZGQgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBSb3VuZGVkCistLSBhbmQgdXNpbmcgZGVjaW1hbDY0IGJvdW5kcyAoc2VlIGFsc28gZGRhZGQuZGVjVGVzdCkKK3ByZWNpc2lvbjogICAgMTYKK21heEV4cG9uZW50OiArMzg0CittaW5FeHBvbmVudDogLTM4Mworcm91bmRpbmc6ICAgICBkb3duCithZGR4NTYzIGFkZCAxZS0zODggOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IEluZXhhY3QgUm91bmRlZAorYWRkeDU2NCBhZGQgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCBSb3VuZGVkCisKKworLS0gc29tZSBtb3JlIHJlc2lkdWUgZWZmZWN0cyB3aXRoIGV4dHJlbWUgcm91bmRpbmcKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogaGFsZl91cAorYWRkeDYwMSBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCithZGR4NjAyIGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2FkZHg2MDMgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCithZGR4NjA0IGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCithZGR4NjA1IGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorYWRkeDYwNiBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorYWRkeDYwNyBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCithZGR4NjExIGFkZCAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2FkZHg2MTIgYWRkIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorYWRkeDYxMyBhZGQgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2FkZHg2MTQgYWRkIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2FkZHg2MTUgYWRkIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCithZGR4NjE2IGFkZCAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCithZGR4NjE3IGFkZCAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2FkZHg2MjEgYWRkIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorYWRkeDYyMiBhZGQgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCithZGR4NjIzIGFkZCAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorYWRkeDYyNCBhZGQgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworYWRkeDYyNSBhZGQgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2FkZHg2MjYgYWRkIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2FkZHg2MjcgYWRkIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorYWRkeDYzMSBhZGQgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCithZGR4NjMyIGFkZCAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2FkZHg2MzMgYWRkIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCithZGR4NjM0IGFkZCAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCithZGR4NjM1IGFkZCAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorYWRkeDYzNiBhZGQgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorYWRkeDYzNyBhZGQgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCithZGR4NjQxIGFkZCAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2FkZHg2NDIgYWRkIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorYWRkeDY0MyBhZGQgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2FkZHg2NDQgYWRkIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2FkZHg2NDUgYWRkIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCithZGR4NjQ2IGFkZCAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCithZGR4NjQ3IGFkZCAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2FkZHg2NTEgYWRkIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorYWRkeDY1MiBhZGQgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCithZGR4NjUzIGFkZCAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorYWRkeDY1NCBhZGQgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworYWRkeDY1NSBhZGQgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2FkZHg2NTYgYWRkIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2FkZHg2NTcgYWRkIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorCistLSBsb25nIG9wZXJhbmQgdHJpYW5nbGUKK3JvdW5kaW5nOiBoYWxmX3VwCitwcmVjaXNpb246ICAzNworYWRkeDY2MCBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODM0NTM4CitwcmVjaXNpb246ICAzNgorYWRkeDY2MSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODM0NTQgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzUKK2FkZHg2NjIgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNDgzNDUgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDM0CithZGR4NjYzIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MzUgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzMworYWRkeDY2NCBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODMgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzIKK2FkZHg2NjUgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNDggICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMxCithZGR4NjY2IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTUgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzMAorYWRkeDY2NyBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTEgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjkKK2FkZHg2NjggYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzEgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI4CithZGR4NjY5IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyNworYWRkeDY3MCBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzQgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjYKK2FkZHg2NzEgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI1CithZGR4NjcyIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyNAorYWRkeDY3MyBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjMKK2FkZHg2NzQgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDIyCithZGR4Njc1IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2MzkgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyMQorYWRkeDY3NiBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjQgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjAKK2FkZHg2NzcgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE5CithZGR4Njc4IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjQgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxOAorYWRkeDY3OSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTcKK2FkZHg2ODAgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE2CithZGR4NjgxIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxNQorYWRkeDY4MiBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjEgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTQKK2FkZHg2ODMgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEzCithZGR4Njg0IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxMgorYWRkeDY4NSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTEKK2FkZHg2ODYgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEwCithZGR4Njg3IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMTc0MTdFKzEwICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgOQorYWRkeDY4OCBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuODQ3MTE3NDJFKzEwICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDgKK2FkZHg2ODkgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzExNzRFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA3CithZGR4NjkwIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMTdFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA2CithZGR4NjkxIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMkUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDUKK2FkZHg2OTIgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzFFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA0CithZGR4NjkzIGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDdFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAzCithZGR4Njk0IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NUUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDIKK2FkZHg2OTUgYWRkIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5LjhFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxCithZGR4Njk2IGFkZCA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gMUUrMTEgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl91cAorcHJlY2lzaW9uOiAgIDkKKworYWRkeDcwMSBhZGQgNS4wMCAxLjAwRS0zIC0+IDUuMDAxMDAKK2FkZHg3MDIgYWRkIDAwLjAwIDAuMDAwICAtPiAwLjAwMAorYWRkeDcwMyBhZGQgMDAuMDAgMEUtMyAgIC0+IDAuMDAwCithZGR4NzA0IGFkZCAwRS0zICAwMC4wMCAgLT4gMC4wMDAKKworYWRkeDcxMCBhZGQgMEUrMyAgMDAuMDAgIC0+IDAuMDAKK2FkZHg3MTEgYWRkIDBFKzMgIDAwLjAgICAtPiAwLjAKK2FkZHg3MTIgYWRkIDBFKzMgIDAwLiAgICAtPiAwCithZGR4NzEzIGFkZCAwRSszICAwMC5FKzEgLT4gMEUrMQorYWRkeDcxNCBhZGQgMEUrMyAgMDAuRSsyIC0+IDBFKzIKK2FkZHg3MTUgYWRkIDBFKzMgIDAwLkUrMyAtPiAwRSszCithZGR4NzE2IGFkZCAwRSszICAwMC5FKzQgLT4gMEUrMworYWRkeDcxNyBhZGQgMEUrMyAgMDAuRSs1IC0+IDBFKzMKK2FkZHg3MTggYWRkIDBFKzMgIC0wMC4wICAgLT4gMC4wCithZGR4NzE5IGFkZCAwRSszICAtMDAuICAgIC0+IDAKK2FkZHg3MzEgYWRkIDBFKzMgIC0wMC5FKzEgLT4gMEUrMQorCithZGR4NzIwIGFkZCAwMC4wMCAgMEUrMyAgLT4gMC4wMAorYWRkeDcyMSBhZGQgMDAuMCAgIDBFKzMgIC0+IDAuMAorYWRkeDcyMiBhZGQgMDAuICAgIDBFKzMgIC0+IDAKK2FkZHg3MjMgYWRkIDAwLkUrMSAwRSszICAtPiAwRSsxCithZGR4NzI0IGFkZCAwMC5FKzIgMEUrMyAgLT4gMEUrMgorYWRkeDcyNSBhZGQgMDAuRSszIDBFKzMgIC0+IDBFKzMKK2FkZHg3MjYgYWRkIDAwLkUrNCAwRSszICAtPiAwRSszCithZGR4NzI3IGFkZCAwMC5FKzUgMEUrMyAgLT4gMEUrMworYWRkeDcyOCBhZGQgLTAwLjAwIDBFKzMgIC0+IDAuMDAKK2FkZHg3MjkgYWRkIC0wMC4wICAwRSszICAtPiAwLjAKK2FkZHg3MzAgYWRkIC0wMC4gICAwRSszICAtPiAwCisKK2FkZHg3MzIgYWRkICAwICAgICAwICAgICAtPiAgMAorYWRkeDczMyBhZGQgIDAgICAgLTAgICAgIC0+ICAwCithZGR4NzM0IGFkZCAtMCAgICAgMCAgICAgLT4gIDAKK2FkZHg3MzUgYWRkIC0wICAgIC0wICAgICAtPiAtMCAgICAgLS0gSUVFRSA4NTQgc3BlY2lhbCBjYXNlCisKK2FkZHg3MzYgYWRkICAxICAgIC0xICAgICAtPiAgMAorYWRkeDczNyBhZGQgLTEgICAgLTEgICAgIC0+IC0yCithZGR4NzM4IGFkZCAgMSAgICAgMSAgICAgLT4gIDIKK2FkZHg3MzkgYWRkIC0xICAgICAxICAgICAtPiAgMAorCithZGR4NzQxIGFkZCAgMCAgICAtMSAgICAgLT4gLTEKK2FkZHg3NDIgYWRkIC0wICAgIC0xICAgICAtPiAtMQorYWRkeDc0MyBhZGQgIDAgICAgIDEgICAgIC0+ICAxCithZGR4NzQ0IGFkZCAtMCAgICAgMSAgICAgLT4gIDEKK2FkZHg3NDUgYWRkIC0xICAgICAwICAgICAtPiAtMQorYWRkeDc0NiBhZGQgLTEgICAgLTAgICAgIC0+IC0xCithZGR4NzQ3IGFkZCAgMSAgICAgMCAgICAgLT4gIDEKK2FkZHg3NDggYWRkICAxICAgIC0wICAgICAtPiAgMQorCithZGR4NzUxIGFkZCAgMC4wICAtMSAgICAgLT4gLTEuMAorYWRkeDc1MiBhZGQgLTAuMCAgLTEgICAgIC0+IC0xLjAKK2FkZHg3NTMgYWRkICAwLjAgICAxICAgICAtPiAgMS4wCithZGR4NzU0IGFkZCAtMC4wICAgMSAgICAgLT4gIDEuMAorYWRkeDc1NSBhZGQgLTEuMCAgIDAgICAgIC0+IC0xLjAKK2FkZHg3NTYgYWRkIC0xLjAgIC0wICAgICAtPiAtMS4wCithZGR4NzU3IGFkZCAgMS4wICAgMCAgICAgLT4gIDEuMAorYWRkeDc1OCBhZGQgIDEuMCAgLTAgICAgIC0+ICAxLjAKKworYWRkeDc2MSBhZGQgIDAgICAgLTEuMCAgIC0+IC0xLjAKK2FkZHg3NjIgYWRkIC0wICAgIC0xLjAgICAtPiAtMS4wCithZGR4NzYzIGFkZCAgMCAgICAgMS4wICAgLT4gIDEuMAorYWRkeDc2NCBhZGQgLTAgICAgIDEuMCAgIC0+ICAxLjAKK2FkZHg3NjUgYWRkIC0xICAgICAwLjAgICAtPiAtMS4wCithZGR4NzY2IGFkZCAtMSAgICAtMC4wICAgLT4gLTEuMAorYWRkeDc2NyBhZGQgIDEgICAgIDAuMCAgIC0+ICAxLjAKK2FkZHg3NjggYWRkICAxICAgIC0wLjAgICAtPiAgMS4wCisKK2FkZHg3NzEgYWRkICAwLjAgIC0xLjAgICAtPiAtMS4wCithZGR4NzcyIGFkZCAtMC4wICAtMS4wICAgLT4gLTEuMAorYWRkeDc3MyBhZGQgIDAuMCAgIDEuMCAgIC0+ICAxLjAKK2FkZHg3NzQgYWRkIC0wLjAgICAxLjAgICAtPiAgMS4wCithZGR4Nzc1IGFkZCAtMS4wICAgMC4wICAgLT4gLTEuMAorYWRkeDc3NiBhZGQgLTEuMCAgLTAuMCAgIC0+IC0xLjAKK2FkZHg3NzcgYWRkICAxLjAgICAwLjAgICAtPiAgMS4wCithZGR4Nzc4IGFkZCAgMS4wICAtMC4wICAgLT4gIDEuMAorCistLSBTcGVjaWFscworYWRkeDc4MCBhZGQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc4MSBhZGQgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorYWRkeDc4MiBhZGQgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorYWRkeDc4MyBhZGQgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorYWRkeDc4NCBhZGQgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorYWRkeDc4NSBhZGQgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorYWRkeDc4NiBhZGQgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorYWRkeDc4NyBhZGQgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc4OCBhZGQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc4OSBhZGQgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc5MCBhZGQgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc5MSBhZGQgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc5MiBhZGQgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc5MyBhZGQgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDc5NCBhZGQgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2FkZHg4MDAgYWRkICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDgwMSBhZGQgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorYWRkeDgwMiBhZGQgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorYWRkeDgwMyBhZGQgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorYWRkeDgwNCBhZGQgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorYWRkeDgwNSBhZGQgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorYWRkeDgwNiBhZGQgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorYWRkeDgwNyBhZGQgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorYWRkeDgwOCBhZGQgLTEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorYWRkeDgwOSBhZGQgLUluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODEwIGFkZCAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4ODExIGFkZCAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4ODEyIGFkZCAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4ODEzIGFkZCAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4ODE0IGFkZCAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CithZGR4ODE1IGFkZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2FkZHg4MjEgYWRkICBOYU4gLUluZiAgICAtPiAgTmFOCithZGR4ODIyIGFkZCAgTmFOIC0xMDAwICAgLT4gIE5hTgorYWRkeDgyMyBhZGQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2FkZHg4MjQgYWRkICBOYU4gLTAgICAgICAtPiAgTmFOCithZGR4ODI1IGFkZCAgTmFOICAwICAgICAgLT4gIE5hTgorYWRkeDgyNiBhZGQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2FkZHg4MjcgYWRkICBOYU4gIDEwMDAgICAtPiAgTmFOCithZGR4ODI4IGFkZCAgTmFOICBJbmYgICAgLT4gIE5hTgorYWRkeDgyOSBhZGQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2FkZHg4MzAgYWRkIC1JbmYgIE5hTiAgICAtPiAgTmFOCithZGR4ODMxIGFkZCAtMTAwMCBOYU4gICAgLT4gIE5hTgorYWRkeDgzMiBhZGQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2FkZHg4MzMgYWRkIC0wICAgIE5hTiAgICAtPiAgTmFOCithZGR4ODM0IGFkZCAgMCAgICBOYU4gICAgLT4gIE5hTgorYWRkeDgzNSBhZGQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2FkZHg4MzYgYWRkICAxMDAwIE5hTiAgICAtPiAgTmFOCithZGR4ODM3IGFkZCAgSW5mICBOYU4gICAgLT4gIE5hTgorCithZGR4ODQxIGFkZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NDIgYWRkICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg0MyBhZGQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODQ0IGFkZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NDUgYWRkICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg0NiBhZGQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODQ3IGFkZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NDggYWRkICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg0OSBhZGQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODUwIGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NTEgYWRkIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg1MiBhZGQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODUzIGFkZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NTQgYWRkIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg1NSBhZGQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODU2IGFkZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NTcgYWRkICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg1OCBhZGQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODU5IGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworYWRkeDg2MSBhZGQgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCithZGR4ODYyIGFkZCArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2FkZHg4NjMgYWRkICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworYWRkeDg2NCBhZGQgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CithZGR4ODY1IGFkZCAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2FkZHg4NjYgYWRkIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworYWRkeDg2NyBhZGQgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CithZGR4ODY4IGFkZCAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2FkZHg4NjkgYWRkICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2FkZHg4NzEgYWRkICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODcyIGFkZCAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg3MyBhZGQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NzQgYWRkICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODc1IGFkZCAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg3NiBhZGQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4NzcgYWRkIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODc4IGFkZCAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg3OSBhZGQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4ODAgYWRkICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCithZGR4ODgxIGFkZCArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDg4MiBhZGQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorYWRkeDg4MyBhZGQgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg4ODQgYWRkICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2FkZHg4ODUgYWRkICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93LCB1bmRlcmZsb3cgYW5kIHN1Ym5vcm1hbCB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogOQorYWRkeDg5MCBhZGQgMUUrOTk5OTk5OTk5ICAgICA5RSs5OTk5OTk5OTkgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg4OTEgYWRkIDlFKzk5OTk5OTk5OSAgICAgMUUrOTk5OTk5OTk5ICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4ODkyIGFkZCAtMS4xRS05OTk5OTk5OTkgIDFFLTk5OTk5OTk5OSAgIC0+IC0xRS0xMDAwMDAwMDAwICAgIFN1Ym5vcm1hbAorYWRkeDg5MyBhZGQgMUUtOTk5OTk5OTk5ICAgIC0xLjFlLTk5OTk5OTk5OSAtPiAtMUUtMTAwMDAwMDAwMCAgICBTdWJub3JtYWwKK2FkZHg4OTQgYWRkIC0xLjAwMDFFLTk5OTk5OTk5OSAgMUUtOTk5OTk5OTk5ICAgLT4gLTFFLTEwMDAwMDAwMDMgU3Vibm9ybWFsCithZGR4ODk1IGFkZCAxRS05OTk5OTk5OTkgICAgLTEuMDAwMWUtOTk5OTk5OTk5IC0+IC0xRS0xMDAwMDAwMDAzIFN1Ym5vcm1hbAorYWRkeDg5NiBhZGQgLTFFKzk5OTk5OTk5OSAgIC05RSs5OTk5OTk5OTkgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4ODk3IGFkZCAtOUUrOTk5OTk5OTk5ICAgLTFFKzk5OTk5OTk5OSAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg4OTggYWRkICsxLjFFLTk5OTk5OTk5OSAtMUUtOTk5OTk5OTk5ICAgLT4gMUUtMTAwMDAwMDAwMCAgICBTdWJub3JtYWwKK2FkZHg4OTkgYWRkIC0xRS05OTk5OTk5OTkgICArMS4xZS05OTk5OTk5OTkgLT4gMUUtMTAwMDAwMDAwMCAgICBTdWJub3JtYWwKK2FkZHg5MDAgYWRkICsxLjAwMDFFLTk5OTk5OTk5OSAtMUUtOTk5OTk5OTk5ICAgLT4gMUUtMTAwMDAwMDAwMyBTdWJub3JtYWwKK2FkZHg5MDEgYWRkIC0xRS05OTk5OTk5OTkgICArMS4wMDAxZS05OTk5OTk5OTkgLT4gMUUtMTAwMDAwMDAwMyBTdWJub3JtYWwKK2FkZHg5MDIgYWRkIC0xRSs5OTk5OTk5OTkgICArOUUrOTk5OTk5OTk5ICAgLT4gIDhFKzk5OTk5OTk5OQorYWRkeDkwMyBhZGQgLTlFKzk5OTk5OTk5OSAgICsxRSs5OTk5OTk5OTkgICAtPiAtOEUrOTk5OTk5OTk5CisKK3ByZWNpc2lvbjogMworYWRkeDkwNCBhZGQgICAgICAwIC05Ljk5OUUrOTk5OTk5OTk5ICAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorYWRkeDkwNSBhZGQgICAgICAgIC05Ljk5OUUrOTk5OTk5OTk5IDAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorYWRkeDkwNiBhZGQgICAgICAwICA5Ljk5OUUrOTk5OTk5OTk5ICAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorYWRkeDkwNyBhZGQgICAgICAgICA5Ljk5OUUrOTk5OTk5OTk5IDAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CithZGR4OTEwIGFkZCAgMS4wMEUtOTk5ICAgMCAgICAtPiAgIDEuMDBFLTk5OQorYWRkeDkxMSBhZGQgIDAuMUUtOTk5ICAgIDAgICAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsCithZGR4OTEyIGFkZCAgMC4xMEUtOTk5ICAgMCAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK2FkZHg5MTMgYWRkICAwLjEwMEUtOTk5ICAwICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCithZGR4OTE0IGFkZCAgMC4wMUUtOTk5ICAgMCAgICAtPiAgIDFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBObWluCithZGR4OTE1IGFkZCAgMC45OTlFLTk5OSAgMCAgICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDkxNiBhZGQgIDAuMDk5RS05OTkgIDAgICAgLT4gICAxLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5MTcgYWRkICAwLjAwOUUtOTk5ICAwICAgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTE4IGFkZCAgMC4wMDFFLTk5OSAgMCAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4OTE5IGFkZCAgMC4wMDA5RS05OTkgMCAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4OTIwIGFkZCAgMC4wMDAxRS05OTkgMCAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKK2FkZHg5MzAgYWRkIC0xLjAwRS05OTkgICAwICAgIC0+ICAtMS4wMEUtOTk5CithZGR4OTMxIGFkZCAtMC4xRS05OTkgICAgMCAgICAtPiAgLTFFLTEwMDAgICBTdWJub3JtYWwKK2FkZHg5MzIgYWRkIC0wLjEwRS05OTkgICAwICAgIC0+ICAtMS4wRS0xMDAwIFN1Ym5vcm1hbAorYWRkeDkzMyBhZGQgLTAuMTAwRS05OTkgIDAgICAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK2FkZHg5MzQgYWRkIC0wLjAxRS05OTkgICAwICAgIC0+ICAtMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIE5taW4KK2FkZHg5MzUgYWRkIC0wLjk5OUUtOTk5ICAwICAgIC0+ICAtMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTM2IGFkZCAtMC4wOTlFLTk5OSAgMCAgICAtPiAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDkzNyBhZGQgLTAuMDA5RS05OTkgIDAgICAgLT4gIC0xRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5MzggYWRkIC0wLjAwMUUtOTk5ICAwICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg5MzkgYWRkIC0wLjAwMDlFLTk5OSAwICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg5NDAgYWRkIC0wLjAwMDFFLTk5OSAwICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworLS0gc29tZSBub24temVybyBzdWJub3JtYWwgYWRkcworYWRkeDk1MCBhZGQgIDEuMDBFLTk5OSAgICAwLjFFLTk5OSAgLT4gICAxLjEwRS05OTkKK2FkZHg5NTEgYWRkICAwLjFFLTk5OSAgICAgMC4xRS05OTkgIC0+ICAgMkUtMTAwMCAgICBTdWJub3JtYWwKK2FkZHg5NTIgYWRkICAwLjEwRS05OTkgICAgMC4xRS05OTkgIC0+ICAgMi4wRS0xMDAwICBTdWJub3JtYWwKK2FkZHg5NTMgYWRkICAwLjEwMEUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMi4wRS0xMDAwICBTdWJub3JtYWwgUm91bmRlZAorYWRkeDk1NCBhZGQgIDAuMDFFLTk5OSAgICAwLjFFLTk5OSAgLT4gICAxLjFFLTEwMDAgIFN1Ym5vcm1hbAorYWRkeDk1NSBhZGQgIDAuOTk5RS05OTkgICAwLjFFLTk5OSAgLT4gICAxLjEwRS05OTkgIEluZXhhY3QgUm91bmRlZAorYWRkeDk1NiBhZGQgIDAuMDk5RS05OTkgICAwLjFFLTk5OSAgLT4gICAyLjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTU3IGFkZCAgMC4wMDlFLTk5OSAgIDAuMUUtOTk5ICAtPiAgIDEuMUUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5NTggYWRkICAwLjAwMUUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDk1OSBhZGQgIDAuMDAwOUUtOTk5ICAwLjFFLTk5OSAgLT4gICAxLjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTYwIGFkZCAgMC4wMDAxRS05OTkgIDAuMUUtOTk5ICAtPiAgIDEuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKy0tIG5lZ2F0aXZlcy4uLgorYWRkeDk2MSBhZGQgIDEuMDBFLTk5OSAgIC0wLjFFLTk5OSAgLT4gICA5LjBFLTEwMDAgIFN1Ym5vcm1hbAorYWRkeDk2MiBhZGQgIDAuMUUtOTk5ICAgIC0wLjFFLTk5OSAgLT4gICAwRS0xMDAwCithZGR4OTYzIGFkZCAgMC4xMEUtOTk5ICAgLTAuMUUtOTk5ICAtPiAgIDBFLTEwMDEKK2FkZHg5NjQgYWRkICAwLjEwMEUtOTk5ICAtMC4xRS05OTkgIC0+ICAgMEUtMTAwMSAgICBDbGFtcGVkCithZGR4OTY1IGFkZCAgMC4wMUUtOTk5ICAgLTAuMUUtOTk5ICAtPiAgIC05RS0xMDAxICAgU3Vibm9ybWFsCithZGR4OTY2IGFkZCAgMC45OTlFLTk5OSAgLTAuMUUtOTk5ICAtPiAgIDkuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5NjcgYWRkICAwLjA5OUUtOTk5ICAtMC4xRS05OTkgIC0+ICAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4OTY4IGFkZCAgMC4wMDlFLTk5OSAgLTAuMUUtOTk5ICAtPiAgIC05RS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHg5NjkgYWRkICAwLjAwMUUtOTk5ICAtMC4xRS05OTkgIC0+ICAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDk3MCBhZGQgIDAuMDAwOUUtOTk5IC0wLjFFLTk5OSAgLT4gICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4OTcxIGFkZCAgMC4wMDAxRS05OTkgLTAuMUUtOTk5ICAtPiAgIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gc29tZSAncmVhbCcgbnVtYmVycworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3ByZWNpc2lvbjogOAorYWRkeDU2NiBhZGQgOTk5OTkwNjE3MzVFLTM5NCAgMEUtMzk0IC0+IDkuOTk5OTA2RS0zODQgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3ByZWNpc2lvbjogNworYWRkeDU2NyBhZGQgOTk5OTkwNjE3MzVFLTM5NCAgMEUtMzk0IC0+IDkuOTk5OTFFLTM4NCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcHJlY2lzaW9uOiA2CithZGR4NTY4IGFkZCA5OTk5OTA2MTczNUUtMzk0ICAwRS0zOTQgLT4gOS45OTk5RS0zODQgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKKworLS0gbm93IHRoZSBjYXNlIHdoZXJlIHdlIGNhbiBnZXQgdW5kZXJmbG93IGJ1dCB0aGUgcmVzdWx0IGlzIG5vcm1hbAorLS0gW25vdGUgdGhpcyBjYW4ndCBoYXBwZW4gaWYgdGhlIG9wZXJhbmRzIGFyZSBhbHNvIGJvdW5kZWQsIGFzIHdlCistLSBjYW5ub3QgcmVwcmVzZW50IDFFLTM5OSwgZm9yIGV4YW1wbGVdCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworCithZGR4NTcxIGFkZCAgICAgICAxRS0zODMgICAgICAgMCAgLT4gMUUtMzgzCithZGR4NTcyIGFkZCAgICAgICAxRS0zODQgICAgICAgMCAgLT4gMUUtMzg0ICAgU3Vibm9ybWFsCithZGR4NTczIGFkZCAgICAgICAxRS0zODMgIDFFLTM4NCAgLT4gMS4xRS0zODMKK2FkZHg1NzQgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzg0ICAtPiAgIDlFLTM4NCBTdWJub3JtYWwKKworLS0gSGVyZSB3ZSBleHBsb3JlIHRoZSBib3VuZGFyeSBvZiByb3VuZGluZyBhIHN1Ym5vcm1hbCB0byBObWluCithZGR4NTc1IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OCAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorYWRkeDU3NiBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zOTggIC0+ICAgOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBTdWJub3JtYWwKK2FkZHg1Nzcgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk5ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2FkZHg1Nzggc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAwICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2FkZHg1Nzkgc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAxICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2FkZHg1ODAgc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAyICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKworLS0gY2hlY2sgb3ZlcmZsb3cgZWRnZSBjYXNlCitwcmVjaXNpb246ICAgNworcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5NgorbWluRXhwb25lbnQ6IC05NQorYWRkeDk3MiBhcHBseSAgIDkuOTk5OTk5RSs5NiAgICAgICAgIC0+IDkuOTk5OTk5RSs5NgorYWRkeDk3MyBhZGQgICAgIDkuOTk5OTk5RSs5NiAgMSAgICAgIC0+IDkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5NzQgYWRkICAgICAgOTk5OTk5OUUrOTAgIDEgICAgICAtPiA5Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCithZGR4OTc1IGFkZCAgICAgIDk5OTk5OTlFKzkwICAxRSs5MCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTc2IGFkZCAgICAgIDk5OTk5OTlFKzkwICA5RSs4OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTc3IGFkZCAgICAgIDk5OTk5OTlFKzkwICA4RSs4OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTc4IGFkZCAgICAgIDk5OTk5OTlFKzkwICA3RSs4OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTc5IGFkZCAgICAgIDk5OTk5OTlFKzkwICA2RSs4OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTgwIGFkZCAgICAgIDk5OTk5OTlFKzkwICA1RSs4OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTgxIGFkZCAgICAgIDk5OTk5OTlFKzkwICA0RSs4OSAgLT4gOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorYWRkeDk4MiBhZGQgICAgICA5OTk5OTk5RSs5MCAgM0UrODkgIC0+IDkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5ODMgYWRkICAgICAgOTk5OTk5OUUrOTAgIDJFKzg5ICAtPiA5Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCithZGR4OTg0IGFkZCAgICAgIDk5OTk5OTlFKzkwICAxRSs4OSAgLT4gOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorCithZGR4OTg1IGFwcGx5ICAtOS45OTk5OTlFKzk2ICAgICAgICAgLT4gLTkuOTk5OTk5RSs5NgorYWRkeDk4NiBhZGQgICAgLTkuOTk5OTk5RSs5NiAtMSAgICAgIC0+IC05Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCithZGR4OTg3IGFkZCAgICAgLTk5OTk5OTlFKzkwIC0xICAgICAgLT4gLTkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5ODggYWRkICAgICAtOTk5OTk5OUUrOTAgLTFFKzkwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTg5IGFkZCAgICAgLTk5OTk5OTlFKzkwIC05RSs4OSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDk5MCBhZGQgICAgIC05OTk5OTk5RSs5MCAtOEUrODkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5OTEgYWRkICAgICAtOTk5OTk5OUUrOTAgLTdFKzg5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4OTkyIGFkZCAgICAgLTk5OTk5OTlFKzkwIC02RSs4OSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDk5MyBhZGQgICAgIC05OTk5OTk5RSs5MCAtNUUrODkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5OTQgYWRkICAgICAtOTk5OTk5OUUrOTAgLTRFKzg5ICAtPiAtOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorYWRkeDk5NSBhZGQgICAgIC05OTk5OTk5RSs5MCAtM0UrODkgIC0+IC05Ljk5OTk5OUUrOTYgSW5leGFjdCBSb3VuZGVkCithZGR4OTk2IGFkZCAgICAgLTk5OTk5OTlFKzkwIC0yRSs4OSAgLT4gLTkuOTk5OTk5RSs5NiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg5OTcgYWRkICAgICAtOTk5OTk5OUUrOTAgLTFFKzg5ICAtPiAtOS45OTk5OTlFKzk2IEluZXhhY3QgUm91bmRlZAorCistLSBjaGVjayBmb3IgZG91YmxlLXJvdW5kZWQgc3Vibm9ybWFscworcHJlY2lzaW9uOiAgIDUKK21heGV4cG9uZW50OiA3OQorbWluZXhwb25lbnQ6IC03OQorLS0gQWRkOiBsaHMgYW5kIHJocyAwCithZGR4MTAwMSBhZGQgICAgICAgMS41MjQ0NEUtODAgMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDAyIGFkZCAgICAgICAxLjUyNDQ1RS04MCAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMDMgYWRkICAgICAgIDEuNTI0NDZFLTgwIDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAwNCBhZGQgICAgICAgMCAxLjUyNDQ0RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDA1IGFkZCAgICAgICAwIDEuNTI0NDVFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMDYgYWRkICAgICAgIDAgMS41MjQ0NkUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIEFkZDogbGhzID4+IHJocyBhbmQgdmljZSB2ZXJzYQorYWRkeDEwMTEgYWRkICAgICAgIDEuNTI0NDRFLTgwIDFFLTEwMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDEyIGFkZCAgICAgICAxLjUyNDQ1RS04MCAxRS0xMDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAxMyBhZGQgICAgICAgMS41MjQ0NkUtODAgMUUtMTAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMTQgYWRkICAgICAgIDFFLTEwMCAxLjUyNDQ0RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDE1IGFkZCAgICAgICAxRS0xMDAgMS41MjQ0NUUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAxNiBhZGQgICAgICAgMUUtMTAwIDEuNTI0NDZFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBBZGQ6IGxocyArIHJocyBhZGRpdGlvbiBjYXJyaWVkIG91dAorYWRkeDEwMjEgYWRkICAgICAgIDEuNTI0NDNFLTgwIDEuMDAwMDFFLTgwICAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDIyIGFkZCAgICAgICAxLjUyNDQ0RS04MCAxLjAwMDAxRS04MCAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAyMyBhZGQgICAgICAgMS41MjQ0NUUtODAgMS4wMDAwMUUtODAgIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDEwMjQgYWRkICAgICAgIDEuMDAwMDFFLTgwICAxLjUyNDQzRS04MCAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMDI1IGFkZCAgICAgICAxLjAwMDAxRS04MCAgMS41MjQ0NEUtODAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTAyNiBhZGQgICAgICAgMS4wMDAwMUUtODAgIDEuNTI0NDVFLTgwIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBBbmQgZm9yIHJvdW5kIGRvd24gZnVsbCBhbmQgc3Vibm9ybWFsIHJlc3VsdHMKK3ByZWNpc2lvbjogICAgMTYKK21heEV4cG9uZW50OiArMzg0CittaW5FeHBvbmVudDogLTM4Mworcm91bmRpbmc6ICAgICBkb3duCisKK2FkZHgxMTAwIGFkZCAxZSsyIC0xZS0zODMgICAgLT4gOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CithZGR4MTEwMSBhZGQgMWUrMSAtMWUtMzgzICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTAzIGFkZCAgICsxIC0xZS0zODMgICAgLT4gMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTA0IGFkZCAxZS0xIC0xZS0zODMgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEwNSBhZGQgMWUtMiAtMWUtMzgzICAgIC0+IDAuMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTA2IGFkZCAxZS0zIC0xZS0zODMgICAgLT4gMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTA3IGFkZCAxZS00IC0xZS0zODMgICAgLT4gMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEwOCBhZGQgMWUtNSAtMWUtMzgzICAgIC0+IDAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTA5IGFkZCAxZS02IC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorCityb3VuZGluZzogICAgIGNlaWxpbmcKK2FkZHgxMTEwIGFkZCAtMWUrMiArMWUtMzgzICAgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTEgYWRkIC0xZSsxICsxZS0zODMgICAtPiAtOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTMgYWRkICAgIC0xICsxZS0zODMgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTE0IGFkZCAtMWUtMSArMWUtMzgzICAgLT4gLTAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTUgYWRkIC0xZS0yICsxZS0zODMgICAtPiAtMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTYgYWRkIC0xZS0zICsxZS0zODMgICAtPiAtMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTE3IGFkZCAtMWUtNCArMWUtMzgzICAgLT4gLTAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTggYWRkIC0xZS01ICsxZS0zODMgICAtPiAtMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMTkgYWRkIC0xZS02ICsxZS0zODMgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMjAgYWRkICsxZS0zODMgLTFlKzIgICAtPiAtOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyMSBhZGQgKzFlLTM4MyAtMWUrMSAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyMyBhZGQgKzFlLTM4MyAgICAtMSAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMjQgYWRkICsxZS0zODMgLTFlLTEgICAtPiAtMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyNSBhZGQgKzFlLTM4MyAtMWUtMiAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyNiBhZGQgKzFlLTM4MyAtMWUtMyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDExMjcgYWRkICsxZS0zODMgLTFlLTQgICAtPiAtMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyOCBhZGQgKzFlLTM4MyAtMWUtNSAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEyOSBhZGQgKzFlLTM4MyAtMWUtNiAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgZG93bgorcHJlY2lzaW9uOiAgICA3CittYXhFeHBvbmVudDogKzk2CittaW5FeHBvbmVudDogLTk1CithZGR4MTEzMCBhZGQgICAxICAgICAgICAgICAgLTFlLTIwMCAgLT4gMC45OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKKy0tIHN1Ym5vcm1hbCBib3VuZGFyeQorYWRkeDExMzEgYWRkICAgMS4wMDAwMDBFLTk0ICAtMWUtMjAwICAtPiAgOS45OTk5OTlFLTk1ICBSb3VuZGVkIEluZXhhY3QKK2FkZHgxMTMyIGFkZCAgIDEuMDAwMDAxRS05NSAgLTFlLTIwMCAgLT4gIDEuMDAwMDAwRS05NSAgUm91bmRlZCBJbmV4YWN0CithZGR4MTEzMyBhZGQgICAxLjAwMDAwMEUtOTUgIC0xZS0yMDAgIC0+ICA5Ljk5OTk5RS05NiAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMTM0IGFkZCAgIDAuOTk5OTk5RS05NSAgLTFlLTIwMCAgLT4gIDkuOTk5OThFLTk2ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworYWRkeDExMzUgYWRkICAgMC4wMDEwMDBFLTk1ICAtMWUtMjAwICAtPiAgOS45OUUtOTkgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CithZGR4MTEzNiBhZGQgICAwLjAwMDk5OUUtOTUgIC0xZS0yMDAgIC0+ICA5Ljk4RS05OSAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2FkZHgxMTM3IGFkZCAgIDEuMDAwMDAwRS05NSAgLTFlLTEwMSAgLT4gIDkuOTk5OTlFLTk2ICBTdWJub3JtYWwKK2FkZHgxMTM4IGFkZCAgICAgIDEwMDAwRS0xMDEgLTFlLTIwMCAgLT4gIDkuOTk5RS05OCAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxMTM5IGFkZCAgICAgICAxMDAwRS0xMDEgLTFlLTIwMCAgLT4gIDkuOTlFLTk5ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxMTQwIGFkZCAgICAgICAgMTAwRS0xMDEgLTFlLTIwMCAgLT4gIDkuOUUtMTAwICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxMTQxIGFkZCAgICAgICAgIDEwRS0xMDEgLTFlLTIwMCAgLT4gIDlFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxMTQyIGFkZCAgICAgICAgICAxRS0xMDEgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDExNDMgYWRkICAgICAgICAgIDBFLTEwMSAtMWUtMjAwICAtPiAtMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTE0NCBhZGQgICAgICAgICAgMUUtMTAyIC0xZS0yMDAgIC0+ICAwRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworYWRkeDExNTEgYWRkICAgICAgMTAwMDBFLTEwMiAtMWUtMjAwICAtPiAgOS45OUUtOTkgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4MTE1MiBhZGQgICAgICAgMTAwMEUtMTAyIC0xZS0yMDAgIC0+ICA5LjlFLTEwMCAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxMTUzIGFkZCAgICAgICAgMTAwRS0xMDIgLTFlLTIwMCAgLT4gIDlFLTEwMSAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4MTE1NCBhZGQgICAgICAgICAxMEUtMTAyIC0xZS0yMDAgIC0+ICAwRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxMTU1IGFkZCAgICAgICAgICAxRS0xMDIgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDExNTYgYWRkICAgICAgICAgIDBFLTEwMiAtMWUtMjAwICAtPiAtMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTE1NyBhZGQgICAgICAgICAgMUUtMTAzIC0xZS0yMDAgIC0+ICAwRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworYWRkeDExNjAgYWRkICAgICAgICAxMDBFLTEwNSAtMWUtMTAxICAtPiAtMEUtMTAxIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxMTYxIGFkZCAgICAgICAgMTAwRS0xMDUgLTFlLTIwMSAgLT4gIDBFLTEwMSBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCitwcmVjaXNpb246ICAgMTUKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCithZGR4MTIwMCBhZGQgMUUxNSAgLTAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDBFKzE1IEluZXhhY3QgUm91bmRlZAorYWRkeDEyMDEgYWRkIDFFMTUgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwRSsxNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjEwIGFkZCAxRTE1ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIxMSBhZGQgMUUxNSAgLTAuNTAxICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMTIgYWRkIDFFMTUgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjEzIGFkZCAxRTE1ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIxNCBhZGQgMUUxNSAgLTAuNTAwMDAxICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMTUgYWRkIDFFMTUgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjE2IGFkZCAxRTE1ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIxNyBhZGQgMUUxNSAgLTAuNTAwMDAwMDAxICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMTggYWRkIDFFMTUgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjE5IGFkZCAxRTE1ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIyMCBhZGQgMUUxNSAgLTAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMjEgYWRkIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjIyIGFkZCAxRTE1ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTIyMyBhZGQgMUUxNSAgLTAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEyMjQgYWRkIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMjI1IGFkZCAxRTE1ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMEUrMTUgSW5leGFjdCBSb3VuZGVkCithZGR4MTIzMCBhZGQgMUUxNSAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246ICAgMTYKKworYWRkeDEzMDAgYWRkIDFFMTYgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMxMCBhZGQgMUUxNiAgLTAuNTEgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzExIGFkZCAxRTE2ICAtMC41MDEgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMTIgYWRkIDFFMTYgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMxMyBhZGQgMUUxNiAgLTAuNTAwMDEgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzE0IGFkZCAxRTE2ICAtMC41MDAwMDEgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMTUgYWRkIDFFMTYgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMxNiBhZGQgMUUxNiAgLTAuNTAwMDAwMDEgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzE3IGFkZCAxRTE2ICAtMC41MDAwMDAwMDEgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMTggYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMxOSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzIwIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDEgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMjEgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMyMiBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzIzIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzMjQgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4MTMyNSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzI2IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMjcgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMyOCBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzI5IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMzAgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMzMSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzMyIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMzMgYWRkIDFFMTYgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMzNCBhZGQgMUUxNiAgLTAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzM1IGFkZCAxRTE2ICAtMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMzYgYWRkIDFFMTYgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4MTMzNyBhZGQgMUUxNiAgLTAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzM4IGFkZCAxRTE2ICAtMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDEzMzkgYWRkIDFFMTYgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKK2FkZHgxMzQwIGFkZCAxRTE2ICAtNTAwMDAwMC4wMDAwMTAwMDEgICAtPiAgOTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDEzNDEgYWRkIDFFMTYgIC01MDAwMDAwLjAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHgxMzQ5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzUwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDkgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzUxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5ICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzUyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzUzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTkgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzU0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5ICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzU1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzU2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTkgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzU3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5ICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzU4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzU5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTkgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzYwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5ICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzYxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzYyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTkgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzYzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5ICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzY0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzY1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzY3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzY4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzY5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzcwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzcxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzcyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzczIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzc0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzc1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzc2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzc3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzc4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzc5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzgwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzgxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzgyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzgzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzg0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzg1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzg2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzg3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzg4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzg5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzkwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDEgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzkxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMSAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzkyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzkzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDEgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzk0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMSAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzk1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgxMzk2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTEgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKKworLS0gTW9yZSBHRCBlZGdlIGNhc2VzLCB3aGVyZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHVuYWRqdXN0ZWQKKy0tIGV4cG9uZW50cyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBwcmVjaXNpb24gYW5kIG9uZSBzaWRlIGlzIDAKK3ByZWNpc2lvbjogICAxNQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK2FkZHgxNDAwIGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjIzNDU2Nzg5MDEyMzQ1CithZGR4MTQwMSBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDAyIGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDAzIGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQwNCBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDA1IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDA2IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQwNyBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtNworYWRkeDE0MDggYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTgKK2FkZHgxNDA5IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS05CithZGR4MTQxMCBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTAKK2FkZHgxNDExIGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xMQorYWRkeDE0MTIgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTEyCithZGR4MTQxMyBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTMKK2FkZHgxNDE0IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xNAorYWRkeDE0MTUgYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE1CithZGR4MTQxNiBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTYKK2FkZHgxNDE3IGFkZCAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xNworYWRkeDE0MTggYWRkICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE4CithZGR4MTQxOSBhZGQgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTkKKworLS0gc2FtZSwgcHJlY2lzaW9uIDE2Li4KK3ByZWNpc2lvbjogICAxNgorYWRkeDE0MjAgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MjEgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xICAtPiAwLjExMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDIyIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MjMgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MjQgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS00ICAtPiAwLjAwMDExMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDI1IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MjYgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0MjcgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS03ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtNworYWRkeDE0MjggYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorYWRkeDE0MjkgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOQorYWRkeDE0MzAgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAKK2FkZHgxNDMxIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCithZGR4MTQzMiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMgorYWRkeDE0MzMgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMyAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMKK2FkZHgxNDM0IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CithZGR4MTQzNSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNQorYWRkeDE0MzYgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNiAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYKK2FkZHgxNDM3IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CithZGR4MTQzOCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOAorYWRkeDE0MzkgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkKKworLS0gc2FtZSwgcmV2ZXJzZWQgMAorYWRkeDE0NDAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ0MSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ0MiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTIgIDAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NDMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ0NCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ0NSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTUgIDAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NDYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ0NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2FkZHgxNDQ4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtOCAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorYWRkeDE0NDkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CithZGR4MTQ1MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCithZGR4MTQ1MSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTExIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCithZGR4MTQ1MiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCithZGR4MTQ1MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCithZGR4MTQ1NCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE0IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CithZGR4MTQ1NSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CithZGR4MTQ1NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CithZGR4MTQ1NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE3IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CithZGR4MTQ1OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CithZGR4MTQ1OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCithZGR4MTQ2MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NjEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDYyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ2MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTMgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NjQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS00ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDY1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ2NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTYgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NjcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS03ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDY4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ2OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTkgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NzAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDcxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ3MiBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEyICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDE0NzMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHgxNDc0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4MTQ3NSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE1ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorLS0gbmV4dCBmb3VyIGZsYWcgUm91bmRlZCBiZWNhdXNlIHRoZSAwIGV4dGVuZHMgdGhlIHJlc3VsdAorYWRkeDE0NzYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorYWRkeDE0NzcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorYWRkeDE0NzggYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorYWRkeDE0NzkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorCistLSBzdW0gb2YgdHdvIG9wcG9zaXRlLXNpZ24gb3BlcmFuZHMgaXMgZXhhY3RseSAwIGFuZCBmbG9vciA9PiAtMAorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCityb3VuZGluZzogICAgaGFsZl91cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDE1MDAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTUwMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTAyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1MDMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4MTUwNCBhZGQgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTA1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1MDYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTUwNyBhZGQgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2FkZHgxNTExIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1MTIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTUxMyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTE0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDE1MTUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTUxNiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTE3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1MTggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2FkZHgxNTIwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1MjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTUyMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTIzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDE1MjQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTUyNSBhZGQgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTI2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1MjcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4MTUzMSBhZGQgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTMyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1MzMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTUzNCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHgxNTM1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1MzYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTUzNyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTM4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl9ldmVuCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4MTU0MCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTQxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1NDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4MTU0MyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2FkZHgxNTQ0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1NDUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU0NiBhZGQgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTQ3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDE1NTEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTU1MiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTUzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1NTQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4MTU1NSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTU2IGFkZCAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1NTcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU1OCBhZGQgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIHVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4MTU2MCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTYxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1NjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4MTU2MyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2FkZHgxNTY0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1NjUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU2NiBhZGQgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTY3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDE1NzEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDE1NzIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDE1NzMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDE1NzQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDE1NzUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDE1NzYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU3NyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTc4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworcm91bmRpbmc6ICAgIGRvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2FkZHgxNTgwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE1ODEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTU4MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNTgzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDE1ODQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU4NSBhZGQgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTg2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE1ODcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4MTU5MSBhZGQgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNTkyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1OTMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTU5NCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHgxNTk1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE1OTYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTU5NyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNTk4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgY2VpbGluZworLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDE2MDAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4MTYwMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNjAyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDE2MDMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4MTYwNCBhZGQgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNjA1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE2MDYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4MTYwNyBhZGQgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2FkZHgxNjExIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxNjEyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxNjEzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE2MTQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4MTYxNSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4MTYxNiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHgxNjE3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE2MTggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIGFuZCB0aGUgZXh0cmEtc3BlY2lhbCB1Z2x5IGNhc2U7IHVudXN1YWwgbWludXNlcyBtYXJrZWQgYnkgLS0gKgorcm91bmRpbmc6ICAgIGZsb29yCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4MTYyMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHgxNjIxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorYWRkeDE2MjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCithZGR4MTYyMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2FkZHgxNjI0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDE2MjUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCithZGR4MTYyNiBhZGQgIDBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2FkZHgxNjI3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDE2MzEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4MTYzMiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHgxNjMzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHgxNjM0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHgxNjM1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDE2MzYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCithZGR4MTYzNyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2FkZHgxNjM4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworLS0gQmlnRGVjaW1hbCBwcm9ibGVtIHRlc3RjYXNlcyAyMDA2LjAxLjIzCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK3JvdW5kaW5nOiAgZG93bgorcHJlY2lzaW9uOiA3CithZGR4MTY1MSBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDA4RSs2CitwcmVjaXNpb246IDYKK2FkZHgxNjUyIGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNQorYWRkeDE2NTMgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwRSs2ICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQKK2FkZHgxNjU0IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwRSs2ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzCithZGR4MTY1NSBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwRSs2ICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMgorYWRkeDE2NTYgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wRSs2ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEKK2FkZHgxNjU3IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDFFKzYgICAgICAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogIGhhbGZfZXZlbgorcHJlY2lzaW9uOiA3CithZGR4MTY2MSBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDA4RSs2CitwcmVjaXNpb246IDYKK2FkZHgxNjYyIGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNQorYWRkeDE2NjMgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAxRSs2ICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQKK2FkZHgxNjY0IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwRSs2ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzCithZGR4MTY2NSBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwRSs2ICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMgorYWRkeDE2NjYgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wRSs2ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEKK2FkZHgxNjY3IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDFFKzYgICAgICAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogIHVwCitwcmVjaXNpb246IDcKK2FkZHgxNjcxIGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNgorYWRkeDE2NzIgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA1CithZGR4MTY3MyBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDFFKzYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorYWRkeDE2NzQgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDFFKzYgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK2FkZHgxNjc1IGFkZCAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDFFKzYgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyCithZGR4MTY3NiBhZGQgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjFFKzYgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorYWRkeDE2NzcgYWRkICAxMDAwMUUrMiAgLTJFKzEgLT4gMkUrNiAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogICAzNAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorYWRkeDE3MDEgIGFkZCAxMzBFLTIgICAgMTIwRS0yICAgIC0+IDIuNTAKK2FkZHgxNzAyICBhZGQgMTMwRS0yICAgIDEyRS0xICAgICAtPiAyLjUwCithZGR4MTcwMyAgYWRkIDEzMEUtMiAgICAxRTAgICAgICAgLT4gMi4zMAorYWRkeDE3MDQgIGFkZCAxRTIgICAgICAgMUU0ICAgICAgIC0+IDEuMDFFKzQKK2FkZHgxNzA1ICBzdWJ0cmFjdCAxMzBFLTIgIDEyMEUtMiAtPiAwLjEwCithZGR4MTcwNiAgc3VidHJhY3QgMTMwRS0yICAxMkUtMSAgLT4gMC4xMAorYWRkeDE3MDcgIHN1YnRyYWN0IDEzMEUtMiAgMUUwICAgIC0+IDAuMzAKK2FkZHgxNzA4ICBzdWJ0cmFjdCAxRTIgICAgIDFFNCAgICAtPiAtOS45RSszCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gU2FtZSBhcyBhYm92ZSwgdXNpbmcgZGVjaW1hbDY0IGRlZmF1bHQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCithZGR4NjAwMSBhZGQgMSAgICAgICAxICAgICAgIC0+ICAyCithZGR4NjAwMiBhZGQgMiAgICAgICAzICAgICAgIC0+ICA1CithZGR4NjAwMyBhZGQgJzUuNzUnICAnMy4zJyAgIC0+ICA5LjA1CithZGR4NjAwNCBhZGQgJzUnICAgICAnLTMnICAgIC0+ICAyCithZGR4NjAwNSBhZGQgJy01JyAgICAnLTMnICAgIC0+ICAtOAorYWRkeDYwMDYgYWRkICctNycgICAgJzIuNScgICAtPiAgLTQuNQorYWRkeDYwMDcgYWRkICcwLjcnICAgJzAuMycgICAtPiAgMS4wCithZGR4NjAwOCBhZGQgJzEuMjUnICAnMS4yNScgIC0+ICAyLjUwCithZGR4NjAwOSBhZGQgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzIuMjM0NTY3ODknCithZGR4NjAxMCBhZGQgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAxMScgLT4gJzIuMjM0NTY4MDAnCisKK2FkZHg2MDExIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYwMTIgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQwJyAgJzAuNTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxMyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1MCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxNCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ5JyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxNSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ5OScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxNiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ5OTknICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxNyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUwMDAnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxOCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUwMDEnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCithZGR4NjAxOSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUwMScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCithZGR4NjAyMCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDUxJyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2MDIxIGFkZCAwIDEgLT4gMQorYWRkeDYwMjIgYWRkIDEgMSAtPiAyCithZGR4NjAyMyBhZGQgMiAxIC0+IDMKK2FkZHg2MDI0IGFkZCAzIDEgLT4gNAorYWRkeDYwMjUgYWRkIDQgMSAtPiA1CithZGR4NjAyNiBhZGQgNSAxIC0+IDYKK2FkZHg2MDI3IGFkZCA2IDEgLT4gNworYWRkeDYwMjggYWRkIDcgMSAtPiA4CithZGR4NjAyOSBhZGQgOCAxIC0+IDkKK2FkZHg2MDMwIGFkZCA5IDEgLT4gMTAKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCithZGR4NjAzMSBhZGQgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCithZGR4NjAzMiBhZGQgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTknCithZGR4NjAzMyBhZGQgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcxLjAwMDAnCithZGR4NjAzNCBhZGQgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcxLjAwMDEnCisKK2FkZHg2MDM1IGFkZCAnNzAnICAgICAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAzNiBhZGQgJzcwMCcgICAgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYwMzcgYWRkICc3MDAwJyAgICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MDM4IGFkZCAnNzAwMDAnICAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjAzOSBhZGQgJzcwMDAwMCcgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwN0UrMjAnIFJvdW5kZWQKKworLS0gc3ltbWV0cnk6CithZGR4NjA0MCBhZGQgJzEwMDAwZSsxNicgICc3MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjA0MSBhZGQgJzEwMDAwZSsxNicgICc3MDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYwNDIgYWRkICcxMDAwMGUrMTYnICAnNzAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjA0NCBhZGQgJzEwMDAwZSsxNicgICc3MDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjA0NSBhZGQgJzEwMDAwZSsxNicgICc3MDAwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwN0UrMjAnIFJvdW5kZWQKKworYWRkeDYwNDYgYWRkICcxMDAwMGUrOScgICc3JyAtPiAnMTAwMDAwMDAwMDAwMDcnCithZGR4NjA0NyBhZGQgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMTAwMDAwMDAwMDAwNzAnCithZGR4NjA0OCBhZGQgJzEwMDAwZSs5JyAgJzcwMCcgLT4gJzEwMDAwMDAwMDAwNzAwJworYWRkeDYwNDkgYWRkICcxMDAwMGUrOScgICc3MDAwJyAtPiAnMTAwMDAwMDAwMDcwMDAnCithZGR4NjA1MCBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMTAwMDAwMDAwNzAwMDAnCithZGR4NjA1MSBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwMCcgLT4gJzEwMDAwMDAwNzAwMDAwJworCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCithZGR4NjA1MyBhZGQgJzEyJyAnNy4wMCcgLT4gJzE5LjAwJworYWRkeDYwNTQgYWRkICcxLjMnICctMS4wNycgLT4gJzAuMjMnCithZGR4NjA1NSBhZGQgJzEuMycgJy0xLjMwJyAtPiAnMC4wMCcKK2FkZHg2MDU2IGFkZCAnMS4zJyAnLTIuMDcnIC0+ICctMC43NycKK2FkZHg2MDU3IGFkZCAnMUUrMicgJzFFKzQnIC0+ICcxLjAxRSs0JworCistLSBmcm9tIGFib3ZlCithZGR4NjA2MCBhZGQgMSAnMC4xJyAtPiAnMS4xJworYWRkeDYwNjEgYWRkIDEgJzAuMDEnIC0+ICcxLjAxJworYWRkeDYwNjIgYWRkIDEgJzAuMDAxJyAtPiAnMS4wMDEnCithZGR4NjA2MyBhZGQgMSAnMC4wMDAxJyAtPiAnMS4wMDAxJworYWRkeDYwNjQgYWRkIDEgJzAuMDAwMDEnIC0+ICcxLjAwMDAxJworYWRkeDYwNjUgYWRkIDEgJzAuMDAwMDAxJyAtPiAnMS4wMDAwMDEnCithZGR4NjA2NiBhZGQgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMDAxJworYWRkeDYwNjcgYWRkIDEgJzAuMDAwMDAwMDEnIC0+ICcxLjAwMDAwMDAxJworCistLSBjYW5jZWxsYXRpb24gdG8gaW50ZWdlcgorYWRkeDYwNjggYWRkIDk5OTk5OTk5OTk5OTk5MTIzNDU2Nzg5IC05OTk5OTk5OTk5OTk5OUUrOSAtPiAxMjM0NTY3ODkKKy0tIHNpbWlsYXIgZnJvbSBGTUEgZnVuCithZGR4NjA2OSBhZGQgIi0xMjM0NTY3ODkwMTIzNDU1LjIzNDU2Nzg5MDEyMzQ1NCIgIjEyMzQ1Njc4OTAxMjM0NTYiIC0+IDAuNzY1NDMyMTA5ODc2NTQ2CisKKy0tIHNvbWUgZnVubnkgemVyb3MgW2luIGNhc2Ugb2YgYmFkIHNpZ251bV0KK2FkZHg2MDcwIGFkZCAxICAwICAgIC0+IDEKK2FkZHg2MDcxIGFkZCAxIDAuICAgIC0+IDEKK2FkZHg2MDcyIGFkZCAxICAuMCAgIC0+IDEuMAorYWRkeDYwNzMgYWRkIDEgMC4wICAgLT4gMS4wCithZGR4NjA3NCBhZGQgMSAwLjAwICAtPiAxLjAwCithZGR4NjA3NSBhZGQgIDAgIDEgICAtPiAxCithZGR4NjA3NiBhZGQgMC4gIDEgICAtPiAxCithZGR4NjA3NyBhZGQgIC4wIDEgICAtPiAxLjAKK2FkZHg2MDc4IGFkZCAwLjAgMSAgIC0+IDEuMAorYWRkeDYwNzkgYWRkIDAuMDAgMSAgLT4gMS4wMAorCistLSBzb21lIGNhcnJpZXMKK2FkZHg2MDgwIGFkZCA5OTk5OTk5OTk5OTk5OTk4IDEgIC0+IDk5OTk5OTk5OTk5OTk5OTkKK2FkZHg2MDgxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBSb3VuZGVkCithZGR4NjA4MiBhZGQgIDk5OTk5OTk5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAwMDAwMDAwCithZGR4NjA4MyBhZGQgICAgOTk5OTk5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAwMDAwMAorYWRkeDYwODQgYWRkICAgICAgOTk5OTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwMDAwCithZGR4NjA4NSBhZGQgICAgICAgIDk5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAwCithZGR4NjA4NiBhZGQgICAgICAgICAgOTk5OTk5OSAxICAtPiAxMDAwMDAwMAorYWRkeDYwODcgYWRkICAgICAgICAgICAgOTk5OTkgMSAgLT4gMTAwMDAwCithZGR4NjA4OCBhZGQgICAgICAgICAgICAgIDk5OSAxICAtPiAxMDAwCithZGR4NjA4OSBhZGQgICAgICAgICAgICAgICAgOSAxICAtPiAxMAorCisKKy0tIG1vcmUgTEhTIHN3YXBzCithZGR4NjA5MCBhZGQgJy01NjI2N0UtMTAnICAgMCAtPiAgJy0wLjAwMDAwNTYyNjcnCithZGR4NjA5MSBhZGQgJy01NjI2N0UtNicgICAgMCAtPiAgJy0wLjA1NjI2NycKK2FkZHg2MDkyIGFkZCAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCithZGR4NjA5MyBhZGQgJy01NjI2N0UtNCcgICAgMCAtPiAgJy01LjYyNjcnCithZGR4NjA5NCBhZGQgJy01NjI2N0UtMycgICAgMCAtPiAgJy01Ni4yNjcnCithZGR4NjA5NSBhZGQgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCithZGR4NjA5NiBhZGQgJy01NjI2N0UtMScgICAgMCAtPiAgJy01NjI2LjcnCithZGR4NjA5NyBhZGQgJy01NjI2N0UtMCcgICAgMCAtPiAgJy01NjI2NycKK2FkZHg2MDk4IGFkZCAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworYWRkeDYwOTkgYWRkICctNUUtNycgICAgICAgIDAgLT4gICctNUUtNycKK2FkZHg2MTAwIGFkZCAnLTVFLTYnICAgICAgICAwIC0+ICAnLTAuMDAwMDA1JworYWRkeDYxMDEgYWRkICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK2FkZHg2MTAyIGFkZCAnLTVFLTQnICAgICAgICAwIC0+ICAnLTAuMDAwNScKK2FkZHg2MTAzIGFkZCAnLTVFLTEnICAgICAgICAwIC0+ICAnLTAuNScKK2FkZHg2MTA0IGFkZCAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCithZGR4NjEwNSBhZGQgJy01RTEnICAgICAgICAgMCAtPiAgJy01MCcKK2FkZHg2MTA2IGFkZCAnLTVFNScgICAgICAgICAwIC0+ICAnLTUwMDAwMCcKK2FkZHg2MTA3IGFkZCAnLTVFMTUnICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAnCithZGR4NjEwOCBhZGQgJy01RTE2JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTYnICAgUm91bmRlZAorYWRkeDYxMDkgYWRkICctNUUxNycgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE3JyAgUm91bmRlZAorYWRkeDYxMTAgYWRkICctNUUxOCcgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgUm91bmRlZAorYWRkeDYxMTEgYWRkICctNUUxMDAnICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzEwMCcgUm91bmRlZAorCistLSBtb3JlIFJIUyBzd2FwcworYWRkeDYxMTMgYWRkIDAgICctNTYyNjdFLTEwJyAtPiAgJy0wLjAwMDAwNTYyNjcnCithZGR4NjExNCBhZGQgMCAgJy01NjI2N0UtNicgIC0+ICAnLTAuMDU2MjY3JworYWRkeDYxMTYgYWRkIDAgICctNTYyNjdFLTUnICAtPiAgJy0wLjU2MjY3JworYWRkeDYxMTcgYWRkIDAgICctNTYyNjdFLTQnICAtPiAgJy01LjYyNjcnCithZGR4NjExOSBhZGQgMCAgJy01NjI2N0UtMycgIC0+ICAnLTU2LjI2NycKK2FkZHg2MTIwIGFkZCAwICAnLTU2MjY3RS0yJyAgLT4gICctNTYyLjY3JworYWRkeDYxMjEgYWRkIDAgICctNTYyNjdFLTEnICAtPiAgJy01NjI2LjcnCithZGR4NjEyMiBhZGQgMCAgJy01NjI2N0UtMCcgIC0+ICAnLTU2MjY3JworYWRkeDYxMjMgYWRkIDAgICctNUUtMTAnICAgICAtPiAgJy01RS0xMCcKK2FkZHg2MTI0IGFkZCAwICAnLTVFLTcnICAgICAgLT4gICctNUUtNycKK2FkZHg2MTI1IGFkZCAwICAnLTVFLTYnICAgICAgLT4gICctMC4wMDAwMDUnCithZGR4NjEyNiBhZGQgMCAgJy01RS01JyAgICAgIC0+ICAnLTAuMDAwMDUnCithZGR4NjEyNyBhZGQgMCAgJy01RS00JyAgICAgIC0+ICAnLTAuMDAwNScKK2FkZHg2MTI4IGFkZCAwICAnLTVFLTEnICAgICAgLT4gICctMC41JworYWRkeDYxMjkgYWRkIDAgICctNUUwJyAgICAgICAtPiAgJy01JworYWRkeDYxMzAgYWRkIDAgICctNUUxJyAgICAgICAtPiAgJy01MCcKK2FkZHg2MTMxIGFkZCAwICAnLTVFNScgICAgICAgLT4gICctNTAwMDAwJworYWRkeDYxMzIgYWRkIDAgICctNUUxNScgICAgICAtPiAgJy01MDAwMDAwMDAwMDAwMDAwJworYWRkeDYxMzMgYWRkIDAgICctNUUxNicgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTYnICAgUm91bmRlZAorYWRkeDYxMzQgYWRkIDAgICctNUUxNycgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTcnICAgUm91bmRlZAorYWRkeDYxMzUgYWRkIDAgICctNUUxOCcgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTgnICAgUm91bmRlZAorYWRkeDYxMzYgYWRkIDAgICctNUUxMDAnICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCistLSByZWxhdGVkCithZGR4NjEzNyBhZGQgIDEgICcwRS0xOScgICAgICAtPiAgJzEuMDAwMDAwMDAwMDAwMDAwJyAgUm91bmRlZAorYWRkeDYxMzggYWRkIC0xICAnMEUtMTknICAgICAgLT4gICctMS4wMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2FkZHg2MTM5IGFkZCAnMEUtMTknIDEgICAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCithZGR4NjE0MCBhZGQgJzBFLTE5JyAtMSAgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorYWRkeDYxNDEgYWRkIDFFKzExICAgMC4wMDAwICAgLT4gICcxMDAwMDAwMDAwMDAuMDAwMCcKK2FkZHg2MTQyIGFkZCAxRSsxMSAgIDAuMDAwMDAgIC0+ICAnMTAwMDAwMDAwMDAwLjAwMDAnICBSb3VuZGVkCithZGR4NjE0MyBhZGQgMC4wMDAgICAxRSsxMiAgICAtPiAgJzEwMDAwMDAwMDAwMDAuMDAwJworYWRkeDYxNDQgYWRkIDAuMDAwMCAgMUUrMTIgICAgLT4gICcxMDAwMDAwMDAwMDAwLjAwMCcgIFJvdW5kZWQKKworLS0gW3NvbWUgb2YgdGhlIG5leHQgZ3JvdXAgYXJlIHJlYWxseSBjb25zdHJ1Y3RvciB0ZXN0c10KK2FkZHg2MTQ2IGFkZCAnMDAuMCcgIDAgICAgICAgLT4gICcwLjAnCithZGR4NjE0NyBhZGQgJzAuMDAnICAwICAgICAgIC0+ICAnMC4wMCcKK2FkZHg2MTQ4IGFkZCAgMCAgICAgICcwLjAwJyAgLT4gICcwLjAwJworYWRkeDYxNDkgYWRkICAwICAgICAgJzAwLjAnICAtPiAgJzAuMCcKK2FkZHg2MTUwIGFkZCAnMDAuMCcgICcwLjAwJyAgLT4gICcwLjAwJworYWRkeDYxNTEgYWRkICcwLjAwJyAgJzAwLjAnICAtPiAgJzAuMDAnCithZGR4NjE1MiBhZGQgJzMnICAgICAnLjMnICAgIC0+ICAnMy4zJworYWRkeDYxNTMgYWRkICczLicgICAgJy4zJyAgICAtPiAgJzMuMycKK2FkZHg2MTU0IGFkZCAnMy4wJyAgICcuMycgICAgLT4gICczLjMnCithZGR4NjE1NSBhZGQgJzMuMDAnICAnLjMnICAgIC0+ICAnMy4zMCcKK2FkZHg2MTU2IGFkZCAnMycgICAgICczJyAgICAgLT4gICc2JworYWRkeDYxNTcgYWRkICczJyAgICAgJyszJyAgICAtPiAgJzYnCithZGR4NjE1OCBhZGQgJzMnICAgICAnLTMnICAgIC0+ICAnMCcKK2FkZHg2MTU5IGFkZCAnMC4zJyAgICctMC4zJyAgLT4gICcwLjAnCithZGR4NjE2MCBhZGQgJzAuMDMnICAnLTAuMDMnIC0+ICAnMC4wMCcKKworLS0gdHJ5IGJvcmRlcmxpbmUgcHJlY2lzaW9uLCB3aXRoIGNhcnJpZXMsIGV0Yy4KK2FkZHg2MTYxIGFkZCAnMUUrMTMnICctMScgICAgLT4gJzk5OTk5OTk5OTk5OTknCithZGR4NjE2MiBhZGQgJzFFKzEzJyAgJzEuMTEnIC0+ICcxMDAwMDAwMDAwMDAwMS4xMScKK2FkZHg2MTYzIGFkZCAnMS4xMScgICcxRSsxMycgLT4gJzEwMDAwMDAwMDAwMDAxLjExJworYWRkeDYxNjQgYWRkICctMScgICAgJzFFKzEzJyAtPiAnOTk5OTk5OTk5OTk5OScKK2FkZHg2MTY1IGFkZCAnN0UrMTMnICctMScgICAgLT4gJzY5OTk5OTk5OTk5OTk5JworYWRkeDYxNjYgYWRkICc3RSsxMycgICcxLjExJyAtPiAnNzAwMDAwMDAwMDAwMDEuMTEnCithZGR4NjE2NyBhZGQgJzEuMTEnICAnN0UrMTMnIC0+ICc3MDAwMDAwMDAwMDAwMS4xMScKK2FkZHg2MTY4IGFkZCAnLTEnICAgICc3RSsxMycgLT4gJzY5OTk5OTk5OTk5OTk5JworCistLSAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEgMjM0NTY3ODkwMTIzNDU2CithZGR4NjE3MCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjMnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCithZGR4NjE3MSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjInIC0+ICcxLjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCithZGR4NjE3MiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjEnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjE3MyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjE3NCBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTknIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjE3NSBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTgnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjE3NiBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTcnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjE3NyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorYWRkeDYxNzggYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5JworYWRkeDYxNzkgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU0JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk4JworYWRkeDYxODAgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUzJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk3JworYWRkeDYxODEgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUyJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk2JworYWRkeDYxODIgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk1JworYWRkeDYxODMgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk0JworCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorYWRkeDYyMDAgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JworYWRkeDYyMDEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwOSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMTAgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjExIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIxMiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMTMgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjE0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIxNSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMTYgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJworYWRkeDYyMTcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjE4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIxOSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCithZGR4NjIyMCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCithZGR4NjIyMSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMjIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjIzIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIyNCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMjUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjI2IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjIyNyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMjggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjI5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIzMCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMzEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjMyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIzMyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMzQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjM1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjIzNiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCithZGR4NjIzNyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMzggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjM5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorYWRkeDYyNDAgYWRkICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjQxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjI0MiBhZGQgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorYWRkeDYyNTAgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JworYWRkeDYyNTEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjUyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI1MyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNTQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjU1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI1NiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNTcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjU4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI1OSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNjAgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjYxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI2MiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNjMgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjY0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCithZGR4NjI2NSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorYWRkeDYyNjYgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJworYWRkeDYyNjcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjY4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCithZGR4NjI2OSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSAxIGluIGxhc3QgcGxhY2UgdGVzdHMKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2FkZHg2MzAxIGFkZCAgLTEgICAxICAgICAgLT4gICAwCithZGR4NjMwMiBhZGQgICAwICAgMSAgICAgIC0+ICAgMQorYWRkeDYzMDMgYWRkICAgMSAgIDEgICAgICAtPiAgIDIKK2FkZHg2MzA0IGFkZCAgMTIgICAxICAgICAgLT4gIDEzCithZGR4NjMwNSBhZGQgIDk4ICAgMSAgICAgIC0+ICA5OQorYWRkeDYzMDYgYWRkICA5OSAgIDEgICAgICAtPiAxMDAKK2FkZHg2MzA3IGFkZCAxMDAgICAxICAgICAgLT4gMTAxCithZGR4NjMwOCBhZGQgMTAxICAgMSAgICAgIC0+IDEwMgorYWRkeDYzMDkgYWRkICAtMSAgLTEgICAgICAtPiAgLTIKK2FkZHg2MzEwIGFkZCAgIDAgIC0xICAgICAgLT4gIC0xCithZGR4NjMxMSBhZGQgICAxICAtMSAgICAgIC0+ICAgMAorYWRkeDYzMTIgYWRkICAxMiAgLTEgICAgICAtPiAgMTEKK2FkZHg2MzEzIGFkZCAgOTggIC0xICAgICAgLT4gIDk3CithZGR4NjMxNCBhZGQgIDk5ICAtMSAgICAgIC0+ICA5OAorYWRkeDYzMTUgYWRkIDEwMCAgLTEgICAgICAtPiAgOTkKK2FkZHg2MzE2IGFkZCAxMDEgIC0xICAgICAgLT4gMTAwCisKK2FkZHg2MzIxIGFkZCAtMC4wMSAgMC4wMSAgICAtPiAgMC4wMAorYWRkeDYzMjIgYWRkICAwLjAwICAwLjAxICAgIC0+ICAwLjAxCithZGR4NjMyMyBhZGQgIDAuMDEgIDAuMDEgICAgLT4gIDAuMDIKK2FkZHg2MzI0IGFkZCAgMC4xMiAgMC4wMSAgICAtPiAgMC4xMworYWRkeDYzMjUgYWRkICAwLjk4ICAwLjAxICAgIC0+ICAwLjk5CithZGR4NjMyNiBhZGQgIDAuOTkgIDAuMDEgICAgLT4gIDEuMDAKK2FkZHg2MzI3IGFkZCAgMS4wMCAgMC4wMSAgICAtPiAgMS4wMQorYWRkeDYzMjggYWRkICAxLjAxICAwLjAxICAgIC0+ICAxLjAyCithZGR4NjMyOSBhZGQgLTAuMDEgLTAuMDEgICAgLT4gLTAuMDIKK2FkZHg2MzMwIGFkZCAgMC4wMCAtMC4wMSAgICAtPiAtMC4wMQorYWRkeDYzMzEgYWRkICAwLjAxIC0wLjAxICAgIC0+ICAwLjAwCithZGR4NjMzMiBhZGQgIDAuMTIgLTAuMDEgICAgLT4gIDAuMTEKK2FkZHg2MzMzIGFkZCAgMC45OCAtMC4wMSAgICAtPiAgMC45NworYWRkeDYzMzQgYWRkICAwLjk5IC0wLjAxICAgIC0+ICAwLjk4CithZGR4NjMzNSBhZGQgIDEuMDAgLTAuMDEgICAgLT4gIDAuOTkKK2FkZHg2MzM2IGFkZCAgMS4wMSAtMC4wMSAgICAtPiAgMS4wMAorCistLSBzb21lIG1vcmUgY2FzZXMgd2hlcmUgYWRkaW5nIDAgYWZmZWN0cyB0aGUgY29lZmZpY2llbnQKK2FkZHg2MzQwIGFkZCAxRSszICAgIDAgICAgLT4gICAgICAgICAxMDAwCithZGR4NjM0MSBhZGQgMUUrMTUgICAwICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAKK2FkZHg2MzQyIGFkZCAxRSsxNiAgIDAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgIFJvdW5kZWQKK2FkZHg2MzQzIGFkZCAxRSsxNyAgIDAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMTcgIFJvdW5kZWQKKy0tIHdoaWNoIHNpbXBseSBmb2xsb3cgZnJvbSB0aGVzZSBjYXNlcyAuLi4KK2FkZHg2MzQ0IGFkZCAxRSszICAgIDEgICAgLT4gICAgICAgICAxMDAxCithZGR4NjM0NSBhZGQgMUUrMTUgICAxICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDEKK2FkZHg2MzQ2IGFkZCAxRSsxNiAgIDEgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYzNDcgYWRkIDFFKzE3ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgSW5leGFjdCBSb3VuZGVkCithZGR4NjM0OCBhZGQgMUUrMyAgICA3ICAgIC0+ICAgICAgICAgMTAwNworYWRkeDYzNDkgYWRkIDFFKzE1ICAgNyAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDA3CithZGR4NjM1MCBhZGQgMUUrMTYgICA3ICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDFFKzE2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MzUxIGFkZCAxRSsxNyAgIDcgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMTcgIEluZXhhY3QgUm91bmRlZAorCistLSB0cnl6ZXJvcyBjYXNlcworYWRkeDYzNjEgIGFkZCAwRSs1MCAxMDAwMEUrMSAgLT4gMS4wMDAwRSs1CithZGR4NjM2MiAgYWRkIDEwMDAwRSsxIDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMCAgUm91bmRlZAorYWRkeDYzNjMgIGFkZCAxMDAwMEUrMSAxMDAwMEUtNTAgIC0+IDEwMDAwMC4wMDAwMDAwMDAwICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MzY0ICBhZGQgMTIuMzQgICAgMGUtMzk4ICAtPiAxMi4zNDAwMDAwMDAwMDAwMCAgUm91bmRlZAorCistLSB1bHAgcmVwbGFjZW1lbnQgdGVzdHMKK2FkZHg2NDAwIGFkZCAgIDEgICA3N2UtMTQgICAgICAtPiAgMS4wMDAwMDAwMDAwMDA3NworYWRkeDY0MDEgYWRkICAgMSAgIDc3ZS0xNSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDA3NworYWRkeDY0MDIgYWRkICAgMSAgIDc3ZS0xNiAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDAzIGFkZCAgIDEgICA3N2UtMTcgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjQwNCBhZGQgICAxICAgNzdlLTE4ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MDUgYWRkICAgMSAgIDc3ZS0xOSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDA2IGFkZCAgIDEgICA3N2UtOTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2NDEwIGFkZCAgMTAgICA3N2UtMTQgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwNzcKK2FkZHg2NDExIGFkZCAgMTAgICA3N2UtMTUgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCithZGR4NjQxMiBhZGQgIDEwICAgNzdlLTE2ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MTMgYWRkICAxMCAgIDc3ZS0xNyAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDE0IGFkZCAgMTAgICA3N2UtMTggICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQxNSBhZGQgIDEwICAgNzdlLTE5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MTYgYWRkICAxMCAgIDc3ZS05OSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDY0MjAgYWRkICA3N2UtMTQgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDc3CithZGR4NjQyMSBhZGQgIDc3ZS0xNSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDc3CithZGR4NjQyMiBhZGQgIDc3ZS0xNiAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDY0MjMgYWRkICA3N2UtMTcgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDI0IGFkZCAgNzdlLTE4ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQyNSBhZGQgIDc3ZS0xOSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MjYgYWRkICA3N2UtOTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworYWRkeDY0MzAgYWRkICA3N2UtMTQgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDA3NworYWRkeDY0MzEgYWRkICA3N2UtMTUgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDMyIGFkZCAgNzdlLTE2ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjQzMyBhZGQgIDc3ZS0xNyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0MzQgYWRkICA3N2UtMTggICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDM1IGFkZCAgNzdlLTE5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQzNiBhZGQgIDc3ZS05OSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCithZGR4NjQ0MCBhZGQgICAxICAgLTc3ZS0xNCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTIzCithZGR4NjQ0MSBhZGQgICAxICAgLTc3ZS0xNSAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTkyMworYWRkeDY0NDIgYWRkICAgMSAgIC03N2UtMTYgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTIzCithZGR4NjQ0MyBhZGQgICAxICAgLTc3ZS0xNyAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ0NCBhZGQgICAxICAgLTc3ZS0xOCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ0NSBhZGQgICAxICAgLTc3ZS0xOSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDQ2IGFkZCAgIDEgICAtNzdlLTk5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCithZGR4NjQ1MCBhZGQgIDEwICAgLTc3ZS0xNCAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTkyMworYWRkeDY0NTEgYWRkICAxMCAgIC03N2UtMTUgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTIzCithZGR4NjQ1MiBhZGQgIDEwICAgLTc3ZS0xNiAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ1MyBhZGQgIDEwICAgLTc3ZS0xNyAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ1NCBhZGQgIDEwICAgLTc3ZS0xOCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDU1IGFkZCAgMTAgICAtNzdlLTE5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0NTYgYWRkICAxMCAgIC03N2UtOTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2NDYwIGFkZCAgLTc3ZS0xNCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5MjMKK2FkZHg2NDYxIGFkZCAgLTc3ZS0xNSAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIzCithZGR4NjQ2MiBhZGQgIC03N2UtMTYgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5MjMKK2FkZHg2NDYzIGFkZCAgLTc3ZS0xNyAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDY0IGFkZCAgLTc3ZS0xOCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDY1IGFkZCAgLTc3ZS0xOSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0NjYgYWRkICAtNzdlLTk5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2NDcwIGFkZCAgLTc3ZS0xNCAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTIzCithZGR4NjQ3MSBhZGQgIC03N2UtMTUgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5MjMKK2FkZHg2NDcyIGFkZCAgLTc3ZS0xNiAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDczIGFkZCAgLTc3ZS0xNyAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDc0IGFkZCAgLTc3ZS0xOCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY0NzUgYWRkICAtNzdlLTE5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ3NiBhZGQgIC03N2UtOTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworYWRkeDY0ODAgYWRkICAtMSAgICA3N2UtMTQgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5MjMKK2FkZHg2NDgxIGFkZCAgLTEgICAgNzdlLTE1ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTkyMworYWRkeDY0ODIgYWRkICAtMSAgICA3N2UtMTYgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTkyMworYWRkeDY0ODMgYWRkICAtMSAgICA3N2UtMTcgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDg0IGFkZCAgLTEgICAgNzdlLTE4ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ4NSBhZGQgIC0xICAgIDc3ZS0xOSAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ4NiBhZGQgIC0xICAgIDc3ZS05OSAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2NDkwIGFkZCAtMTAgICAgNzdlLTE0ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTkyMworYWRkeDY0OTEgYWRkIC0xMCAgICA3N2UtMTUgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTkyMworYWRkeDY0OTIgYWRkIC0xMCAgICA3N2UtMTYgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NDkzIGFkZCAtMTAgICAgNzdlLTE3ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ5NCBhZGQgLTEwICAgIDc3ZS0xOCAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ5NSBhZGQgLTEwICAgIDc3ZS0xOSAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjQ5NiBhZGQgLTEwICAgIDc3ZS05OSAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2NTAwIGFkZCAgIDc3ZS0xNCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTIzCithZGR4NjUwMSBhZGQgICA3N2UtMTUgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5MjMKK2FkZHg2NTAyIGFkZCAgIDc3ZS0xNiAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5MjMKK2FkZHg2NTAzIGFkZCAgIDc3ZS0xNyAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NjUwNCBhZGQgICA3N2UtMTggICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDY1MDUgYWRkICAgNzdlLTE5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY1MDYgYWRkICAgNzdlLTk5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCithZGR4NjUxMCBhZGQgICA3N2UtMTQgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5MjMKK2FkZHg2NTExIGFkZCAgIDc3ZS0xNSAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5MjMKK2FkZHg2NTEyIGFkZCAgIDc3ZS0xNiAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCithZGR4NjUxMyBhZGQgICA3N2UtMTcgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorYWRkeDY1MTQgYWRkICAgNzdlLTE4ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY1MTUgYWRkICAgNzdlLTE5ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorYWRkeDY1MTYgYWRkICAgNzdlLTk5ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCisKKy0tIGxvbmcgb3BlcmFuZHMKK2FkZHg2NTIxIGFkZCAxMDEyMzQ1NjIzNDU2NzgwMDAgMCAtPiAxLjAxMjM0NTYyMzQ1Njc4MEUrMTcgUm91bmRlZAorYWRkeDY1MjIgYWRkIDAgMTAxMjM0NTYyMzQ1Njc4MDAwIC0+IDEuMDEyMzQ1NjIzNDU2NzgwRSsxNyBSb3VuZGVkCithZGR4NjUyMyBhZGQgMTAxMjM0NTYyMzQ1Njc4MDAgIDAgLT4gMS4wMTIzNDU2MjM0NTY3ODBFKzE2IFJvdW5kZWQKK2FkZHg2NTI0IGFkZCAwIDEwMTIzNDU2MjM0NTY3ODAwICAtPiAxLjAxMjM0NTYyMzQ1Njc4MEUrMTYgUm91bmRlZAorYWRkeDY1MjUgYWRkIDEwMTIzNDU2MjM0NTY3ODkwICAwIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNiBSb3VuZGVkCithZGR4NjUyNiBhZGQgMCAxMDEyMzQ1NjIzNDU2Nzg5MCAgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE2IFJvdW5kZWQKK2FkZHg2NTI3IGFkZCAxMDEyMzQ1NjIzNDU2Nzg5MSAgMCAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjUyOCBhZGQgMCAxMDEyMzQ1NjIzNDU2Nzg5MSAgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDY1MjkgYWRkIDEwMTIzNDU2MjM0NTY3ODkwMSAwIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NTMwIGFkZCAwIDEwMTIzNDU2MjM0NTY3ODkwMSAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTcgSW5leGFjdCBSb3VuZGVkCithZGR4NjUzMSBhZGQgMTAxMjM0NTYyMzQ1Njc4OTYgIDAgLT4gMS4wMTIzNDU2MjM0NTY3OTBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDY1MzIgYWRkIDAgMTAxMjM0NTYyMzQ1Njc4OTYgIC0+IDEuMDEyMzQ1NjIzNDU2NzkwRSsxNiBJbmV4YWN0IFJvdW5kZWQKKworLS0gdmVyaWZ5IGEgcXVlcnkKK3JvdW5kaW5nOiAgICAgZG93bgorYWRkeDY1NjEgYWRkIDFlLTM5OCA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgSW5leGFjdCBSb3VuZGVkCithZGR4NjU2MiBhZGQgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBSb3VuZGVkCistLSBhbmQgdXNpbmcgZGVjaW1hbDY0IGJvdW5kcy4uLgorcm91bmRpbmc6ICAgICBkb3duCithZGR4NjU2MyBhZGQgMWUtMzg4IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2NTY0IGFkZCAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IFJvdW5kZWQKKworLS0gbW9yZSB6ZXJvcywgZXRjLgorcm91bmRpbmc6IGhhbGZfZXZlbgorCithZGR4NjcwMSBhZGQgNS4wMCAxLjAwRS0zIC0+IDUuMDAxMDAKK2FkZHg2NzAyIGFkZCAwMC4wMCAwLjAwMCAgLT4gMC4wMDAKK2FkZHg2NzAzIGFkZCAwMC4wMCAwRS0zICAgLT4gMC4wMDAKK2FkZHg2NzA0IGFkZCAwRS0zICAwMC4wMCAgLT4gMC4wMDAKKworYWRkeDY3MTAgYWRkIDBFKzMgIDAwLjAwICAtPiAwLjAwCithZGR4NjcxMSBhZGQgMEUrMyAgMDAuMCAgIC0+IDAuMAorYWRkeDY3MTIgYWRkIDBFKzMgIDAwLiAgICAtPiAwCithZGR4NjcxMyBhZGQgMEUrMyAgMDAuRSsxIC0+IDBFKzEKK2FkZHg2NzE0IGFkZCAwRSszICAwMC5FKzIgLT4gMEUrMgorYWRkeDY3MTUgYWRkIDBFKzMgIDAwLkUrMyAtPiAwRSszCithZGR4NjcxNiBhZGQgMEUrMyAgMDAuRSs0IC0+IDBFKzMKK2FkZHg2NzE3IGFkZCAwRSszICAwMC5FKzUgLT4gMEUrMworYWRkeDY3MTggYWRkIDBFKzMgIC0wMC4wICAgLT4gMC4wCithZGR4NjcxOSBhZGQgMEUrMyAgLTAwLiAgICAtPiAwCithZGR4NjczMSBhZGQgMEUrMyAgLTAwLkUrMSAtPiAwRSsxCisKK2FkZHg2NzIwIGFkZCAwMC4wMCAgMEUrMyAgLT4gMC4wMAorYWRkeDY3MjEgYWRkIDAwLjAgICAwRSszICAtPiAwLjAKK2FkZHg2NzIyIGFkZCAwMC4gICAgMEUrMyAgLT4gMAorYWRkeDY3MjMgYWRkIDAwLkUrMSAwRSszICAtPiAwRSsxCithZGR4NjcyNCBhZGQgMDAuRSsyIDBFKzMgIC0+IDBFKzIKK2FkZHg2NzI1IGFkZCAwMC5FKzMgMEUrMyAgLT4gMEUrMworYWRkeDY3MjYgYWRkIDAwLkUrNCAwRSszICAtPiAwRSszCithZGR4NjcyNyBhZGQgMDAuRSs1IDBFKzMgIC0+IDBFKzMKK2FkZHg2NzI4IGFkZCAtMDAuMDAgMEUrMyAgLT4gMC4wMAorYWRkeDY3MjkgYWRkIC0wMC4wICAwRSszICAtPiAwLjAKK2FkZHg2NzMwIGFkZCAtMDAuICAgMEUrMyAgLT4gMAorCithZGR4NjczMiBhZGQgIDAgICAgIDAgICAgIC0+ICAwCithZGR4NjczMyBhZGQgIDAgICAgLTAgICAgIC0+ICAwCithZGR4NjczNCBhZGQgLTAgICAgIDAgICAgIC0+ICAwCithZGR4NjczNSBhZGQgLTAgICAgLTAgICAgIC0+IC0wICAgICAtLSBJRUVFIDg1NCBzcGVjaWFsIGNhc2UKKworYWRkeDY3MzYgYWRkICAxICAgIC0xICAgICAtPiAgMAorYWRkeDY3MzcgYWRkIC0xICAgIC0xICAgICAtPiAtMgorYWRkeDY3MzggYWRkICAxICAgICAxICAgICAtPiAgMgorYWRkeDY3MzkgYWRkIC0xICAgICAxICAgICAtPiAgMAorCithZGR4Njc0MSBhZGQgIDAgICAgLTEgICAgIC0+IC0xCithZGR4Njc0MiBhZGQgLTAgICAgLTEgICAgIC0+IC0xCithZGR4Njc0MyBhZGQgIDAgICAgIDEgICAgIC0+ICAxCithZGR4Njc0NCBhZGQgLTAgICAgIDEgICAgIC0+ICAxCithZGR4Njc0NSBhZGQgLTEgICAgIDAgICAgIC0+IC0xCithZGR4Njc0NiBhZGQgLTEgICAgLTAgICAgIC0+IC0xCithZGR4Njc0NyBhZGQgIDEgICAgIDAgICAgIC0+ICAxCithZGR4Njc0OCBhZGQgIDEgICAgLTAgICAgIC0+ICAxCisKK2FkZHg2NzUxIGFkZCAgMC4wICAtMSAgICAgLT4gLTEuMAorYWRkeDY3NTIgYWRkIC0wLjAgIC0xICAgICAtPiAtMS4wCithZGR4Njc1MyBhZGQgIDAuMCAgIDEgICAgIC0+ICAxLjAKK2FkZHg2NzU0IGFkZCAtMC4wICAgMSAgICAgLT4gIDEuMAorYWRkeDY3NTUgYWRkIC0xLjAgICAwICAgICAtPiAtMS4wCithZGR4Njc1NiBhZGQgLTEuMCAgLTAgICAgIC0+IC0xLjAKK2FkZHg2NzU3IGFkZCAgMS4wICAgMCAgICAgLT4gIDEuMAorYWRkeDY3NTggYWRkICAxLjAgIC0wICAgICAtPiAgMS4wCisKK2FkZHg2NzYxIGFkZCAgMCAgICAtMS4wICAgLT4gLTEuMAorYWRkeDY3NjIgYWRkIC0wICAgIC0xLjAgICAtPiAtMS4wCithZGR4Njc2MyBhZGQgIDAgICAgIDEuMCAgIC0+ICAxLjAKK2FkZHg2NzY0IGFkZCAtMCAgICAgMS4wICAgLT4gIDEuMAorYWRkeDY3NjUgYWRkIC0xICAgICAwLjAgICAtPiAtMS4wCithZGR4Njc2NiBhZGQgLTEgICAgLTAuMCAgIC0+IC0xLjAKK2FkZHg2NzY3IGFkZCAgMSAgICAgMC4wICAgLT4gIDEuMAorYWRkeDY3NjggYWRkICAxICAgIC0wLjAgICAtPiAgMS4wCisKK2FkZHg2NzcxIGFkZCAgMC4wICAtMS4wICAgLT4gLTEuMAorYWRkeDY3NzIgYWRkIC0wLjAgIC0xLjAgICAtPiAtMS4wCithZGR4Njc3MyBhZGQgIDAuMCAgIDEuMCAgIC0+ICAxLjAKK2FkZHg2Nzc0IGFkZCAtMC4wICAgMS4wICAgLT4gIDEuMAorYWRkeDY3NzUgYWRkIC0xLjAgICAwLjAgICAtPiAtMS4wCithZGR4Njc3NiBhZGQgLTEuMCAgLTAuMCAgIC0+IC0xLjAKK2FkZHg2Nzc3IGFkZCAgMS4wICAgMC4wICAgLT4gIDEuMAorYWRkeDY3NzggYWRkICAxLjAgIC0wLjAgICAtPiAgMS4wCisKKy0tIFNwZWNpYWxzCithZGR4Njc4MCBhZGQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDY3ODEgYWRkIC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2FkZHg2NzgyIGFkZCAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CithZGR4Njc4MyBhZGQgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorYWRkeDY3ODQgYWRkIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2FkZHg2Nzg1IGFkZCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CithZGR4Njc4NiBhZGQgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorYWRkeDY3ODcgYWRkIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2FkZHg2Nzg4IGFkZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Njc4OSBhZGQgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDY3OTAgYWRkIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2FkZHg2NzkxIGFkZCAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CithZGR4Njc5MiBhZGQgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorYWRkeDY3OTMgYWRkICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2FkZHg2Nzk0IGFkZCAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworYWRkeDY4MDAgYWRkICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4MDEgYWRkICBJbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2FkZHg2ODAyIGFkZCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CithZGR4NjgwMyBhZGQgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorYWRkeDY4MDQgYWRkICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2FkZHg2ODA1IGFkZCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CithZGR4NjgwNiBhZGQgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorYWRkeDY4MDcgYWRkICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg2ODA4IGFkZCAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CithZGR4NjgwOSBhZGQgLUluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithZGR4NjgxMCBhZGQgLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorYWRkeDY4MTEgYWRkIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg2ODEyIGFkZCAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CithZGR4NjgxMyBhZGQgIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorYWRkeDY4MTQgYWRkICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2FkZHg2ODE1IGFkZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2FkZHg2ODIxIGFkZCAgTmFOIC1JbmYgICAgLT4gIE5hTgorYWRkeDY4MjIgYWRkICBOYU4gLTEwMDAgICAtPiAgTmFOCithZGR4NjgyMyBhZGQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2FkZHg2ODI0IGFkZCAgTmFOIC0wICAgICAgLT4gIE5hTgorYWRkeDY4MjUgYWRkICBOYU4gIDAgICAgICAtPiAgTmFOCithZGR4NjgyNiBhZGQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2FkZHg2ODI3IGFkZCAgTmFOICAxMDAwICAgLT4gIE5hTgorYWRkeDY4MjggYWRkICBOYU4gIEluZiAgICAtPiAgTmFOCithZGR4NjgyOSBhZGQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2FkZHg2ODMwIGFkZCAtSW5mICBOYU4gICAgLT4gIE5hTgorYWRkeDY4MzEgYWRkIC0xMDAwIE5hTiAgICAtPiAgTmFOCithZGR4NjgzMiBhZGQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2FkZHg2ODMzIGFkZCAtMCAgICBOYU4gICAgLT4gIE5hTgorYWRkeDY4MzQgYWRkICAwICAgIE5hTiAgICAtPiAgTmFOCithZGR4NjgzNSBhZGQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2FkZHg2ODM2IGFkZCAgMTAwMCBOYU4gICAgLT4gIE5hTgorYWRkeDY4MzcgYWRkICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2FkZHg2ODQxIGFkZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQyIGFkZCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQzIGFkZCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQ0IGFkZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQ1IGFkZCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQ2IGFkZCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQ3IGFkZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQ4IGFkZCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODQ5IGFkZCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODUwIGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODUxIGFkZCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODUyIGFkZCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODUzIGFkZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODU0IGFkZCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODU1IGFkZCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODU2IGFkZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODU3IGFkZCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODU4IGFkZCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODU5IGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworYWRkeDY4NjEgYWRkICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorYWRkeDY4NjIgYWRkICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorYWRkeDY4NjMgYWRkICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworYWRkeDY4NjQgYWRkICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorYWRkeDY4NjUgYWRkICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorYWRkeDY4NjYgYWRkIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworYWRkeDY4NjcgYWRkIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorYWRkeDY4NjggYWRkICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorYWRkeDY4NjkgYWRkICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2FkZHg2ODcxIGFkZCAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NzIgYWRkICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg3MyBhZGQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODc0IGFkZCAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NzUgYWRkICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg3NiBhZGQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODc3IGFkZCAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4NzggYWRkIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg3OSBhZGQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2FkZHg2ODgwIGFkZCAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDY4ODEgYWRkICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg4MiBhZGQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorYWRkeDY4ODMgYWRkIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCithZGR4Njg4NCBhZGQgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorYWRkeDY4ODUgYWRkICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG5vdyB0aGUgY2FzZSB3aGVyZSB3ZSBjYW4gZ2V0IHVuZGVyZmxvdyBidXQgdGhlIHJlc3VsdCBpcyBub3JtYWwKKy0tIFtub3RlIHRoaXMgY2FuJ3QgaGFwcGVuIGlmIHRoZSBvcGVyYW5kcyBhcmUgYWxzbyBib3VuZGVkLCBhcyB3ZQorLS0gY2Fubm90IHJlcHJlc2VudCAxRS0zOTksIGZvciBleGFtcGxlXQorCithZGR4NjU3MSBhZGQgICAgICAgMUUtMzgzICAgICAgIDAgIC0+IDFFLTM4MworYWRkeDY1NzIgYWRkICAgICAgIDFFLTM4NCAgICAgICAwICAtPiAxRS0zODQgICBTdWJub3JtYWwKK2FkZHg2NTczIGFkZCAgICAgICAxRS0zODMgIDFFLTM4NCAgLT4gMS4xRS0zODMKK2FkZHg2NTc0IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM4NCAgLT4gICA5RS0zODQgU3Vibm9ybWFsCisKKy0tIEhlcmUgd2UgZXhwbG9yZSB0aGUgYm91bmRhcnkgb2Ygcm91bmRpbmcgYSBzdWJub3JtYWwgdG8gTm1pbgorYWRkeDY1NzUgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk4ICAtPiAgIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCithZGR4NjU3NiBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zOTggIC0+ICAgOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBTdWJub3JtYWwKK2FkZHg2NTc3IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCithZGR4NjU3OCBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorYWRkeDY1Nzkgc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAxICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2FkZHg2NTgwIHN1YnRyYWN0ICAxRS0zODMgIDFFLTQwMiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCisKKy0tIGNoZWNrIG92ZXJmbG93IGVkZ2UgY2FzZQorLS0gICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CithZGR4Njk3MiBhcHBseSAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CithZGR4Njk3MyBhZGQgICAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIDEgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5NzQgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTc1IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTc2IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTc3IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOEUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTc4IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgN0UrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTc5IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNkUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTgwIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNUUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTgxIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNEUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorYWRkeDY5ODIgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAzRSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCithZGR4Njk4MyBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDJFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTg0IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCithZGR4Njk4NSBhcHBseSAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorYWRkeDY5ODYgYWRkICAgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0xICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCithZGR4Njk4NyBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTg4IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMUUrMzY5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4Njk4OSBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5OTAgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC04RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTkxIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtN0UrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCithZGR4Njk5MiBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTZFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYWRkeDY5OTMgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC01RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTk0IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNEUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTk1IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtM0UrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTk2IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMkUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2OTk3IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMUUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQW5kIGZvciByb3VuZCBkb3duIGZ1bGwgYW5kIHN1Ym5vcm1hbCByZXN1bHRzCityb3VuZGluZzogICAgIGRvd24KK2FkZHg2MTEwMCBhZGQgMWUrMiAtMWUtMzgzICAgIC0+IDk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTAxIGFkZCAxZSsxIC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTAzIGFkZCAgICsxIC0xZS0zODMgICAgLT4gMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTEwNCBhZGQgMWUtMSAtMWUtMzgzICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTA1IGFkZCAxZS0yIC0xZS0zODMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTA2IGFkZCAxZS0zIC0xZS0zODMgICAgLT4gMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTEwNyBhZGQgMWUtNCAtMWUtMzgzICAgIC0+IDAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTA4IGFkZCAxZS01IC0xZS0zODMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorYWRkeDYxMTA5IGFkZCAxZS02IC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorCityb3VuZGluZzogICAgIGNlaWxpbmcKK2FkZHg2MTExMCBhZGQgLTFlKzIgKzFlLTM4MyAgIC0+IC05OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExMSBhZGQgLTFlKzEgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMTMgYWRkICAgIC0xICsxZS0zODMgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExNCBhZGQgLTFlLTEgKzFlLTM4MyAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExNSBhZGQgLTFlLTIgKzFlLTM4MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMTYgYWRkIC0xZS0zICsxZS0zODMgICAtPiAtMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExNyBhZGQgLTFlLTQgKzFlLTM4MyAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2FkZHg2MTExOCBhZGQgLTFlLTUgKzFlLTM4MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CithZGR4NjExMTkgYWRkIC0xZS02ICsxZS0zODMgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorCistLSB0ZXN0cyBiYXNlZCBvbiBHdW5uYXIgRGVnbmJvbCdzIGVkZ2UgY2FzZQorcm91bmRpbmc6ICAgICBoYWxmX2V2ZW4KKworYWRkeDYxMzAwIGFkZCAxRTE2ICAtMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzEwIGFkZCAxRTE2ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzExIGFkZCAxRTE2ICAtMC41MDEgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzEyIGFkZCAxRTE2ICAtMC41MDAxICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzEzIGFkZCAxRTE2ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzE0IGFkZCAxRTE2ICAtMC41MDAwMDEgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzE1IGFkZCAxRTE2ICAtMC41MDAwMDAxICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzE2IGFkZCAxRTE2ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzE3IGFkZCAxRTE2ICAtMC41MDAwMDAwMDEgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzE4IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAxICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzE5IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzIwIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDEgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzIxIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAxICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzIyIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzIzIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzI0IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzI1IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzI2IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzI3IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzI4IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzI5IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzMwIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzMxIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzMyIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzMzIGFkZCAxRTE2ICAtMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzM0IGFkZCAxRTE2ICAtMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzM1IGFkZCAxRTE2ICAtMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzM2IGFkZCAxRTE2ICAtMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzM3IGFkZCAxRTE2ICAtMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzM4IGFkZCAxRTE2ICAtMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzM5IGFkZCAxRTE2ICAtMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCithZGR4NjEzNDAgYWRkIDFFMTYgIC01MDAwMDAwLjAwMDAxMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNDEgYWRkIDFFMTYgIC01MDAwMDAwLjAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2FkZHg2MTM0OSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQgICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNTAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzUxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5ICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM1MiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTkgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNTMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzU0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5ICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM1NSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTkgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNTYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzU3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5ICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM1OCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTkgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNTkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzYwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5ICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM2MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNjIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzYzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5ICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM2NCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OTkgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNjUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzY3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM2OCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNjkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzcwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM3MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNzIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzczIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM3NCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNzUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzc2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM3NyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzNzggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzc5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM4MCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzODEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzgyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM4MyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzODQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzg1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM4NiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzODcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMSAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzg4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM4OSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMSAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzOTAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMSAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzkxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMSAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM5MiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMSAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzOTMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMSAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorYWRkeDYxMzk0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMSAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MTM5NSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMSAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCithZGR4NjEzOTYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MSAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSBNb3JlIEdEIGVkZ2UgY2FzZXMsIHdoZXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW5hZGp1c3RlZAorLS0gZXhwb25lbnRzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBhbmQgb25lIHNpZGUgaXMgMAorYWRkeDYxNDIwIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NSAgICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQyMSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDIyIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDIzIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMyAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQyNCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDI1IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDI2IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNiAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQyNyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CithZGR4NjE0MjggYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorYWRkeDYxNDI5IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2FkZHg2MTQzMCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorYWRkeDYxNDMxIGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCithZGR4NjE0MzIgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMiAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2FkZHg2MTQzMyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworYWRkeDYxNDM0IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CithZGR4NjE0MzUgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2FkZHg2MTQzNiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorYWRkeDYxNDM3IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CithZGR4NjE0MzggYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2FkZHg2MTQzOSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCByZXZlcnNlZCAwCithZGR4NjE0NDAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NDEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xICAwIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDQyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NDMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NDQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS00ICAwIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDQ1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NDYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NDcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS03ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CithZGR4NjE0NDggYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CithZGR4NjE0NDkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CithZGR4NjE0NTAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorYWRkeDYxNDUxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2FkZHg2MTQ1MiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCithZGR4NjE0NTMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMyAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworYWRkeDYxNDU0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2FkZHg2MTQ1NSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CithZGR4NjE0NTYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNiAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorYWRkeDYxNDU3IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2FkZHg2MTQ1OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CithZGR4NjE0NTkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCBFcyBvbiB0aGUgMAorYWRkeDYxNDYwIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NjEgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ2MiBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTIgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDYzIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMyAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NjQgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS00ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ2NSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTUgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDY2IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NjcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS03ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ2OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTggICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDY5IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NzAgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ3MSBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTExICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDcyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTIgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CithZGR4NjE0NzMgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2FkZHg2MTQ3NCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE0ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorYWRkeDYxNDc1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTUgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CistLSBuZXh0IGZvdXIgZmxhZyBSb3VuZGVkIGJlY2F1c2UgdGhlIDAgZXh0ZW5kcyB0aGUgcmVzdWx0CithZGR4NjE0NzYgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorYWRkeDYxNDc3IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2FkZHg2MTQ3OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCithZGR4NjE0NzkgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorCistLSBzdW0gb2YgdHdvIG9wcG9zaXRlLXNpZ24gb3BlcmFuZHMgaXMgZXhhY3RseSAwIGFuZCBmbG9vciA9PiAtMAorcm91bmRpbmc6ICAgIGhhbGZfdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2FkZHg2MTUwMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHg2MTUwMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2FkZHg2MTUwMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2FkZHg2MTUwMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2FkZHg2MTUwNCBhZGQgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTUwNSBhZGQgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTUwNiBhZGQgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTUwNyBhZGQgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2FkZHg2MTUxMSBhZGQgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTUxMiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTUxMyBhZGQgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTUxNCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHg2MTUxNSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2FkZHg2MTUxNiBhZGQgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTUxNyBhZGQgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2FkZHg2MTUxOCBhZGQgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDYxNTIwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTIxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTIyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTIzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDYxNTI0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTI1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTI2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTI3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDYxNTMxIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTMyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTMzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTM0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDYxNTM1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTM2IGFkZCAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTM3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTM4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl9ldmVuCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCithZGR4NjE1NDAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1NDEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1NDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CithZGR4NjE1NDMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CithZGR4NjE1NDQgYWRkICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NDUgYWRkIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NDYgYWRkICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NDcgYWRkIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCithZGR4NjE1NTEgYWRkICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1NTIgYWRkIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1NTMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1NTQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4NjE1NTUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE1NTYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NTcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NTggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICB1cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDYxNTYwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTYxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTYyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTYzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDYxNTY0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTY1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTY2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTY3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDYxNTcxIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHg2MTU3MiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4NjE1NzMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDYxNTc0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2FkZHg2MTU3NSBhZGQgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4NjE1NzYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NzcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCithZGR4NjE1NzggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCityb3VuZGluZzogICAgZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDYxNTgwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTgxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTgyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNTgzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDYxNTg0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTg1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTg2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTg3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDYxNTkxIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTkyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTkzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTk0IGFkZCAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworYWRkeDYxNTk1IGFkZCAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNTk2IGFkZCAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTk3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNTk4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgY2VpbGluZworLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDYxNjAwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNjAxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNjAyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNjAzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDYxNjA0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNjA1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNjA2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNjA3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDYxNjExIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHg2MTYxMiBhZGQgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CithZGR4NjE2MTMgYWRkICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE2MTQgYWRkIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4NjE2MTUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworYWRkeDYxNjE2IGFkZCAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNjE3IGFkZCAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNjE4IGFkZCAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBhbmQgdGhlIGV4dHJhLXNwZWNpYWwgdWdseSBjYXNlOyB1bnVzdWFsIG1pbnVzZXMgbWFya2VkIGJ5IC0tICoKK3JvdW5kaW5nOiAgICBmbG9vcgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworYWRkeDYxNjIwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorYWRkeDYxNjIxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorYWRkeDYxNjIyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorYWRkeDYxNjIzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorYWRkeDYxNjI0IGFkZCAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorYWRkeDYxNjI1IGFkZCAtMEUtNDAwICAgMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorYWRkeDYxNjI2IGFkZCAgMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorYWRkeDYxNjI3IGFkZCAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworYWRkeDYxNjMxIGFkZCAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNjMyIGFkZCAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorYWRkeDYxNjMzIGFkZCAgMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2FkZHg2MTYzNCBhZGQgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCithZGR4NjE2MzUgYWRkICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCithZGR4NjE2MzYgYWRkIC0xRS00MDEgICAxRS00MDEgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCithZGR4NjE2MzcgYWRkICAxRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCithZGR4NjE2MzggYWRkIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK2FkZHg2MTcwMSBhZGQgMTMwRS0yICAgIDEyMEUtMiAgICAtPiAyLjUwCithZGR4NjE3MDIgYWRkIDEzMEUtMiAgICAxMkUtMSAgICAgLT4gMi41MAorYWRkeDYxNzAzIGFkZCAxMzBFLTIgICAgMUUwICAgICAgIC0+IDIuMzAKK2FkZHg2MTcwNCBhZGQgMUUyICAgICAgIDFFNCAgICAgICAtPiAxLjAxRSs0CithZGR4NjE3MDUgc3VidHJhY3QgMTMwRS0yICAxMjBFLTIgLT4gMC4xMAorYWRkeDYxNzA2IHN1YnRyYWN0IDEzMEUtMiAgMTJFLTEgIC0+IDAuMTAKK2FkZHg2MTcwNyBzdWJ0cmFjdCAxMzBFLTIgIDFFMCAgICAtPiAwLjMwCithZGR4NjE3MDggc3VidHJhY3QgMUUyICAgICAxRTQgICAgLT4gLTkuOUUrMworCistLSBHYXBweSBjb2VmZmljaWVudHM7IGNoZWNrIHJlc2lkdWUgaGFuZGxpbmcgZXZlbiB3aXRoIGZ1bGwgY29lZmZpY2llbnQgZ2FwCityb3VuZGluZzogaGFsZl9ldmVuCisKK2FkZHg2MjAwMSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiAxICAgICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NworYWRkeDYyMDAyIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDAuNiAgICAtPiAxMjM0NTY3ODkwMTIzNDU3ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAwMyBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiAwLjA2ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMDQgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDA1IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTQgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAwNiBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS01ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMDcgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDA4IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTcgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAwOSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS04ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMTAgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtOSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDExIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTEwICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAxMiBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMTMgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTIgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDE0IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTEzICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAxNSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMTYgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTUgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDE3IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE2ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAxOCBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwMTkgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTggIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDIwIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE5ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjAyMSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0yMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHdpZGVuaW5nIHNlY29uZCBhcmd1bWVudCBhdCBnYXAKK2FkZHg2MjAzMCBhZGQgMTIzNDU2NzggMSAgICAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzkKK2FkZHg2MjAzMSBhZGQgMTIzNDU2NzggMC4xICAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMQorYWRkeDYyMDMyIGFkZCAxMjM0NTY3OCAwLjEyICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMgorYWRkeDYyMDMzIGFkZCAxMjM0NTY3OCAwLjEyMyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjMKK2FkZHg2MjAzNCBhZGQgMTIzNDU2NzggMC4xMjM0ICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNAorYWRkeDYyMDM1IGFkZCAxMjM0NTY3OCAwLjEyMzQ1ICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NQorYWRkeDYyMDM2IGFkZCAxMjM0NTY3OCAwLjEyMzQ1NiAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTYKK2FkZHg2MjAzNyBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NworYWRkeDYyMDM4IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4ICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OAorYWRkeDYyMDM5IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4OSAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA0MCBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNDEgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MCAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQyIGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTEgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA0MyBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMSAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNDQgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAxICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQ1IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDEgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA0NiBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMSAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNDcgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAxICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDQ4IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA0OSBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDEyMzQ1Ngorcm91bmRpbmc6IGhhbGZfZXZlbgorYWRkeDYyMDUwIGFkZCAxMjM0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA1MSBhZGQgMTIzNDU2NzggMC4wMDM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNTIgYWRkIDEyMzQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDUzIGFkZCAxMjM0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA1NCBhZGQgMTIzNDU2NzggMC4wMDAwMDY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNTUgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDU2IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA1NyBhZGQgMTIzNDU2NzggMC4wMDAwMDAwMDUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNjAgYWRkIDEyMzQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDYxIGFkZCAxMjM0NTY3OCAwLjAwMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA2MiBhZGQgMTIzNDU2NzggMC4wMDA0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNjMgYWRkIDEyMzQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDY0IGFkZCAxMjM0NTY3OCAwLjAwMDAwNjc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDY3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA2NSBhZGQgMTIzNDU2NzggMC4wMDAwMDA3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNjYgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDY3IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDAwNTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKy0tIGZhci1vdXQgcmVzaWR1ZXMgKGZ1bGwgY29lZmZpY2llbnQgZ2FwIGlzIDE2KzE1IGRpZ2l0cykKK3JvdW5kaW5nOiB1cAorYWRkeDYyMDcwIGFkZCAxMjM0NTY3OCAxRS04ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMQorYWRkeDYyMDcxIGFkZCAxMjM0NTY3OCAxRS05ICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA3MiBhZGQgMTIzNDU2NzggMUUtMTAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNzMgYWRkIDEyMzQ1Njc4IDFFLTExICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDc0IGFkZCAxMjM0NTY3OCAxRS0xMiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA3NSBhZGQgMTIzNDU2NzggMUUtMTMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNzYgYWRkIDEyMzQ1Njc4IDFFLTE0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDc3IGFkZCAxMjM0NTY3OCAxRS0xNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA3OCBhZGQgMTIzNDU2NzggMUUtMTYgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwNzkgYWRkIDEyMzQ1Njc4IDFFLTE3ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDgwIGFkZCAxMjM0NTY3OCAxRS0xOCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA4MSBhZGQgMTIzNDU2NzggMUUtMTkgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwODIgYWRkIDEyMzQ1Njc4IDFFLTIwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDgzIGFkZCAxMjM0NTY3OCAxRS0yNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA4NCBhZGQgMTIzNDU2NzggMUUtMzAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwODUgYWRkIDEyMzQ1Njc4IDFFLTMxICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDg2IGFkZCAxMjM0NTY3OCAxRS0zMiAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHg2MjA4NyBhZGQgMTIzNDU2NzggMUUtMzMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCithZGR4NjIwODggYWRkIDEyMzQ1Njc4IDFFLTM0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorYWRkeDYyMDg5IGFkZCAxMjM0NTY3OCAxRS0zNSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlCitwcmVjaXNpb246IDUKK2FkZHg2MjEwMCBhZGQgICAgICAxMSAgc05hTjEyMzQ1Njc4OSAtPiAgTmFONTY3ODkgIEludmFsaWRfb3BlcmF0aW9uCithZGR4NjIxMDEgYWRkICAgICAtMTEgLXNOYU4xMjM0NTY3ODkgLT4gLU5hTjU2Nzg5ICBJbnZhbGlkX29wZXJhdGlvbgorYWRkeDYyMTAyIGFkZCAgICAgIDExICAgTmFOMTIzNDU2Nzg5IC0+ICBOYU41Njc4OQorYWRkeDYyMTAzIGFkZCAgICAgLTExICAtTmFOMTIzNDU2Nzg5IC0+IC1OYU41Njc4OQorCistLSBOdWxsIHRlc3RzCithZGR4OTk5MCBhZGQgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithZGR4OTk5MSBhZGQgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2FuZC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9hbmQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNjNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9hbmQuZGVjVGVzdApAQCAtMCwwICsxLDMzOCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBhbmQuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBBTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpCithbmR4MDAxIGFuZCAgICAgICAgICAgICAwICAgIDAgLT4gICAgMAorYW5keDAwMiBhbmQgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDAKK2FuZHgwMDMgYW5kICAgICAgICAgICAgIDEgICAgMCAtPiAgICAwCithbmR4MDA0IGFuZCAgICAgICAgICAgICAxICAgIDEgLT4gICAgMQorYW5keDAwNSBhbmQgICAgICAgICAgMTEwMCAxMDEwIC0+IDEwMDAKK2FuZHgwMDYgYW5kICAgICAgICAgIDExMTEgICAxMCAtPiAgIDEwCithbmR4MDA3IGFuZCAgICAgICAgICAxMTExIDEwMTAgLT4gMTAxMAorCistLSBhbmQgYXQgbXNkIGFuZCBtc2QtMQorYW5keDAxMCBhbmQgMDAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorYW5keDAxMSBhbmQgMDAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgICAgICAgICAgMAorYW5keDAxMiBhbmQgMTAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorYW5keDAxMyBhbmQgMTAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMAorYW5keDAxNCBhbmQgMDAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorYW5keDAxNSBhbmQgMDAwMDAwMDAwIDAxMDAwMDAwMCAtPiAgICAgICAgICAgMAorYW5keDAxNiBhbmQgMDEwMDAwMDAwIDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorYW5keDAxNyBhbmQgMDEwMDAwMDAwIDAxMDAwMDAwMCAtPiAgICAxMDAwMDAwMAorCistLSBWYXJpb3VzIGxlbmd0aHMKKy0tICAgICAgICAgIDEyMzQ1Njc4OSAgICAgMTIzNDU2Nzg5ICAgICAgMTIzNDU2Nzg5CithbmR4MDIxIGFuZCAxMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gIDExMTExMTExMQorYW5keDAyMiBhbmQgMTExMTExMTExMTExICAxMTExMTExMTEgIC0+ICAxMTExMTExMTEKK2FuZHgwMjMgYW5kIDExMTExMTExMTExMSAgIDExMTExMTExICAtPiAgIDExMTExMTExCithbmR4MDI0IGFuZCAxMTExMTExMTEgICAgICAxMTExMTExMSAgLT4gICAxMTExMTExMQorYW5keDAyNSBhbmQgMTExMTExMTExICAgICAgIDExMTExMTEgIC0+ICAgIDExMTExMTEKK2FuZHgwMjYgYW5kIDExMTExMTExMTExMSAgICAgMTExMTExICAtPiAgICAgMTExMTExCithbmR4MDI3IGFuZCAxMTExMTExMTExMTEgICAgICAxMTExMSAgLT4gICAgICAxMTExMQorYW5keDAyOCBhbmQgMTExMTExMTExMTExICAgICAgIDExMTEgIC0+ICAgICAgIDExMTEKK2FuZHgwMjkgYW5kIDExMTExMTExMTExMSAgICAgICAgMTExICAtPiAgICAgICAgMTExCithbmR4MDMxIGFuZCAxMTExMTExMTExMTEgICAgICAgICAxMSAgLT4gICAgICAgICAxMQorYW5keDAzMiBhbmQgMTExMTExMTExMTExICAgICAgICAgIDEgIC0+ICAgICAgICAgIDEKK2FuZHgwMzMgYW5kIDExMTExMTExMTExMSAxMTExMTExMTExICAtPiAgMTExMTExMTExCithbmR4MDM0IGFuZCAxMTExMTExMTExMSAxMTExMTExMTExMSAgLT4gIDExMTExMTExMQorYW5keDAzNSBhbmQgMTExMTExMTExMSAxMTExMTExMTExMTEgIC0+ICAxMTExMTExMTEKK2FuZHgwMzYgYW5kIDExMTExMTExMSAxMTExMTExMTExMTExICAtPiAgMTExMTExMTExCisKK2FuZHgwNDAgYW5kIDExMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTExMTExMTExCithbmR4MDQxIGFuZCAgMTExMTExMTEgIDExMTExMTExMTExMSAgLT4gICAxMTExMTExMQorYW5keDA0MiBhbmQgIDExMTExMTExICAgICAxMTExMTExMTEgIC0+ICAgMTExMTExMTEKK2FuZHgwNDMgYW5kICAgMTExMTExMSAgICAgMTExMTExMTExICAtPiAgICAxMTExMTExCithbmR4MDQ0IGFuZCAgICAxMTExMTEgICAgIDExMTExMTExMSAgLT4gICAgIDExMTExMQorYW5keDA0NSBhbmQgICAgIDExMTExICAgICAxMTExMTExMTEgIC0+ICAgICAgMTExMTEKK2FuZHgwNDYgYW5kICAgICAgMTExMSAgICAgMTExMTExMTExICAtPiAgICAgICAxMTExCithbmR4MDQ3IGFuZCAgICAgICAxMTEgICAgIDExMTExMTExMSAgLT4gICAgICAgIDExMQorYW5keDA0OCBhbmQgICAgICAgIDExICAgICAxMTExMTExMTEgIC0+ICAgICAgICAgMTEKK2FuZHgwNDkgYW5kICAgICAgICAgMSAgICAgMTExMTExMTExICAtPiAgICAgICAgICAxCisKK2FuZHgwNTAgYW5kIDExMTExMTExMTEgIDEgIC0+ICAxCithbmR4MDUxIGFuZCAgMTExMTExMTExICAxICAtPiAgMQorYW5keDA1MiBhbmQgICAxMTExMTExMSAgMSAgLT4gIDEKK2FuZHgwNTMgYW5kICAgIDExMTExMTEgIDEgIC0+ICAxCithbmR4MDU0IGFuZCAgICAgMTExMTExICAxICAtPiAgMQorYW5keDA1NSBhbmQgICAgICAxMTExMSAgMSAgLT4gIDEKK2FuZHgwNTYgYW5kICAgICAgIDExMTEgIDEgIC0+ICAxCithbmR4MDU3IGFuZCAgICAgICAgMTExICAxICAtPiAgMQorYW5keDA1OCBhbmQgICAgICAgICAxMSAgMSAgLT4gIDEKK2FuZHgwNTkgYW5kICAgICAgICAgIDEgIDEgIC0+ICAxCisKK2FuZHgwNjAgYW5kIDExMTExMTExMTEgIDAgIC0+ICAwCithbmR4MDYxIGFuZCAgMTExMTExMTExICAwICAtPiAgMAorYW5keDA2MiBhbmQgICAxMTExMTExMSAgMCAgLT4gIDAKK2FuZHgwNjMgYW5kICAgIDExMTExMTEgIDAgIC0+ICAwCithbmR4MDY0IGFuZCAgICAgMTExMTExICAwICAtPiAgMAorYW5keDA2NSBhbmQgICAgICAxMTExMSAgMCAgLT4gIDAKK2FuZHgwNjYgYW5kICAgICAgIDExMTEgIDAgIC0+ICAwCithbmR4MDY3IGFuZCAgICAgICAgMTExICAwICAtPiAgMAorYW5keDA2OCBhbmQgICAgICAgICAxMSAgMCAgLT4gIDAKK2FuZHgwNjkgYW5kICAgICAgICAgIDEgIDAgIC0+ICAwCisKK2FuZHgwNzAgYW5kIDEgIDExMTExMTExMTEgIC0+ICAxCithbmR4MDcxIGFuZCAxICAgMTExMTExMTExICAtPiAgMQorYW5keDA3MiBhbmQgMSAgICAxMTExMTExMSAgLT4gIDEKK2FuZHgwNzMgYW5kIDEgICAgIDExMTExMTEgIC0+ICAxCithbmR4MDc0IGFuZCAxICAgICAgMTExMTExICAtPiAgMQorYW5keDA3NSBhbmQgMSAgICAgICAxMTExMSAgLT4gIDEKK2FuZHgwNzYgYW5kIDEgICAgICAgIDExMTEgIC0+ICAxCithbmR4MDc3IGFuZCAxICAgICAgICAgMTExICAtPiAgMQorYW5keDA3OCBhbmQgMSAgICAgICAgICAxMSAgLT4gIDEKK2FuZHgwNzkgYW5kIDEgICAgICAgICAgIDEgIC0+ICAxCisKK2FuZHgwODAgYW5kIDAgIDExMTExMTExMTEgIC0+ICAwCithbmR4MDgxIGFuZCAwICAgMTExMTExMTExICAtPiAgMAorYW5keDA4MiBhbmQgMCAgICAxMTExMTExMSAgLT4gIDAKK2FuZHgwODMgYW5kIDAgICAgIDExMTExMTEgIC0+ICAwCithbmR4MDg0IGFuZCAwICAgICAgMTExMTExICAtPiAgMAorYW5keDA4NSBhbmQgMCAgICAgICAxMTExMSAgLT4gIDAKK2FuZHgwODYgYW5kIDAgICAgICAgIDExMTEgIC0+ICAwCithbmR4MDg3IGFuZCAwICAgICAgICAgMTExICAtPiAgMAorYW5keDA4OCBhbmQgMCAgICAgICAgICAxMSAgLT4gIDAKK2FuZHgwODkgYW5kIDAgICAgICAgICAgIDEgIC0+ICAwCisKK2FuZHgwOTAgYW5kIDAxMTExMTExMSAgMTExMTExMTExICAtPiAgIDExMTExMTExCithbmR4MDkxIGFuZCAxMDExMTExMTEgIDExMTExMTExMSAgLT4gIDEwMTExMTExMQorYW5keDA5MiBhbmQgMTEwMTExMTExICAxMTExMTExMTEgIC0+ICAxMTAxMTExMTEKK2FuZHgwOTMgYW5kIDExMTAxMTExMSAgMTExMTExMTExICAtPiAgMTExMDExMTExCithbmR4MDk0IGFuZCAxMTExMDExMTEgIDExMTExMTExMSAgLT4gIDExMTEwMTExMQorYW5keDA5NSBhbmQgMTExMTEwMTExICAxMTExMTExMTEgIC0+ICAxMTExMTAxMTEKK2FuZHgwOTYgYW5kIDExMTExMTAxMSAgMTExMTExMTExICAtPiAgMTExMTExMDExCithbmR4MDk3IGFuZCAxMTExMTExMDEgIDExMTExMTExMSAgLT4gIDExMTExMTEwMQorYW5keDA5OCBhbmQgMTExMTExMTEwICAxMTExMTExMTEgIC0+ICAxMTExMTExMTAKKworYW5keDEwMCBhbmQgMTExMTExMTExICAwMTExMTExMTEgIC0+ICAgMTExMTExMTEKK2FuZHgxMDEgYW5kIDExMTExMTExMSAgMTAxMTExMTExICAtPiAgMTAxMTExMTExCithbmR4MTAyIGFuZCAxMTExMTExMTEgIDExMDExMTExMSAgLT4gIDExMDExMTExMQorYW5keDEwMyBhbmQgMTExMTExMTExICAxMTEwMTExMTEgIC0+ICAxMTEwMTExMTEKK2FuZHgxMDQgYW5kIDExMTExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTAxMTExCithbmR4MTA1IGFuZCAxMTExMTExMTEgIDExMTExMDExMSAgLT4gIDExMTExMDExMQorYW5keDEwNiBhbmQgMTExMTExMTExICAxMTExMTEwMTEgIC0+ICAxMTExMTEwMTEKK2FuZHgxMDcgYW5kIDExMTExMTExMSAgMTExMTExMTAxICAtPiAgMTExMTExMTAxCithbmR4MTA4IGFuZCAxMTExMTExMTEgIDExMTExMTExMCAgLT4gIDExMTExMTExMAorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK2FuZHgyMjAgYW5kIDExMTExMTExMiAgMTExMTExMTExICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjIxIGFuZCAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIyMiBhbmQgNTU1NTU1NTU1ICA1NTU1NTU1NTUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMjMgYW5kIDc3Nzc3Nzc3NyAgNzc3Nzc3Nzc3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjI0IGFuZCA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIyNSBhbmQgMjIyMjIyMjIyICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMjYgYW5kIDQ0NDQ0NDQ0NCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjI3IGFuZCA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIyOCBhbmQgODg4ODg4ODg4ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMjkgYW5kIDk5OTk5OTk5OSAgMjIyMjIyMjIyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjMwIGFuZCA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDIzMSBhbmQgOTk5OTk5OTk5ICA2NjY2NjY2NjYgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyMzIgYW5kIDk5OTk5OTk5OSAgODg4ODg4ODg4ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCithbmR4MjQwIGFuZCAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI0MSBhbmQgIDU2NzM2NzY4OSAgOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyNDIgYW5kIC02MzE5MTc3NzIgLTcwNjAxNDYzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjQzIGFuZCAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI0NCBhbmQgIDgzNTU5MDE0OSAgNTY3NDM1NDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECithbmR4MjUwIGFuZCAgMjAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjUxIGFuZCAgNzAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjUyIGFuZCAgODAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjUzIGFuZCAgOTAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjU0IGFuZCAgMjAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjU1IGFuZCAgNzAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjU2IGFuZCAgODAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjU3IGFuZCAgOTAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjU4IGFuZCAgMTAwMDAwMDAwIDIwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjU5IGFuZCAgMTAwMDAwMDAwIDcwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjYwIGFuZCAgMTAwMDAwMDAwIDgwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjYxIGFuZCAgMTAwMDAwMDAwIDkwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjYyIGFuZCAgMDAwMDAwMDAwIDIwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjYzIGFuZCAgMDAwMDAwMDAwIDcwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjY0IGFuZCAgMDAwMDAwMDAwIDgwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjY1IGFuZCAgMDAwMDAwMDAwIDkwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRC0xCithbmR4MjcwIGFuZCAgMDIwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjcxIGFuZCAgMDcwMTAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjcyIGFuZCAgMDgwMDEwMDAwIDEwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MjczIGFuZCAgMDkwMDAxMDAwIDEwMDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjc0IGFuZCAgMTAwMDAwMTAwIDAyMDAxMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjc1IGFuZCAgMTAwMDAwMDAwIDA3MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjc2IGFuZCAgMTAwMDAwMDEwIDA4MDAxMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjc3IGFuZCAgMTAwMDAwMDAwIDA5MDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAorYW5keDI4MCBhbmQgIDAwMTAwMDAwMiAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4MSBhbmQgIDAwMDAwMDAwNyAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4MiBhbmQgIDAwMDAwMDAwOCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4MyBhbmQgIDAwMDAwMDAwOSAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4NCBhbmQgIDEwMDAwMDAwMCAwMDAxMDAwMDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4NSBhbmQgIDEwMDEwMDAwMCAwMDEwMDAwMDcgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4NiBhbmQgIDEwMDAxMDAwMCAwMTAwMDAwMDggLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI4NyBhbmQgIDEwMDAwMTAwMCAxMDAwMDAwMDkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNaWRkaWUKK2FuZHgyODggYW5kICAwMDEwMjAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyODkgYW5kICAwMDAwNzAwMDEgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTAgYW5kICAwMDAwODAwMDAgMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTEgYW5kICAwMDAwOTAwMDAgMTAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTIgYW5kICAxMDAwMDAwMTAgMDAwMDIwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTMgYW5kICAxMDAxMDAwMDAgMDAwMDcwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTQgYW5kICAxMDAwMTAxMDAgMDAwMDgwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTUgYW5kICAxMDAwMDEwMDAgMDAwMDkwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHNpZ25zCithbmR4Mjk2IGFuZCAtMTAwMDAxMDAwIC0wMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDI5NyBhbmQgLTEwMDAwMTAwMCAgMDAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgyOTggYW5kICAxMDAwMDEwMDAgLTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mjk5IGFuZCAgMTAwMDAxMDAwICAwMDAwMTEwMDAgLT4gIDEwMDAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2FuZHgzMzEgYW5kICAyICAgOS45OTk5OTk5OUUrOTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzMzIgYW5kICAzICAgMUUtOTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzMzMgYW5kICA0ICAgMS4wMDAwMDAwMEUtOTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzMzQgYW5kICA1ICAgMUUtMTAwNyAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzMzUgYW5kICA2ICAgLTFFLTEwMDcgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzMzYgYW5kICA3ICAgLTEuMDAwMDAwMDBFLTk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzMzcgYW5kICA4ICAgLTFFLTk5OSAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzMzggYW5kICA5ICAgLTkuOTk5OTk5OTlFKzk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDEgYW5kICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDIgYW5kICAxRS05OTkgICAgICAgICAgICAgICAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDMgYW5kICAxLjAwMDAwMDAwRS05OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDQgYW5kICAxRS0xMDA3ICAgICAgICAgICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDUgYW5kICAtMUUtMTAwNyAgICAgICAgICAgIC0xMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDYgYW5kICAtMS4wMDAwMDAwMEUtOTk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDcgYW5kICAtMUUtOTk5ICAgICAgICAgICAgICAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHgzNDggYW5kICAtOS45OTk5OTk5OUUrOTk5ICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCithbmR4MzYxIGFuZCAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzYyIGFuZCAgMUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzYzIGFuZCAgMC4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzY0IGFuZCAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzY1IGFuZCAgOS45ICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzY2IGFuZCAgOUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzcxIGFuZCAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzcyIGFuZCAgMCAxRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4MzczIGFuZCAgMCAwLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mzc0IGFuZCAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mzc1IGFuZCAgMCA5LjkgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4Mzc2IGFuZCAgMCA5RSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK2FuZHg3ODAgYW5kIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODEgYW5kIC1JbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODIgYW5kIC1JbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODMgYW5kIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODQgYW5kIC1JbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODUgYW5kIC1JbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODYgYW5kIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODcgYW5kIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODggYW5kIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3ODkgYW5kIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3OTAgYW5kIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3OTEgYW5kICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3OTIgYW5kICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3OTMgYW5kICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2FuZHg3OTQgYW5kICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworYW5keDgwMCBhbmQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwMSBhbmQgIEluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwMiBhbmQgIEluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwMyBhbmQgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwNCBhbmQgIEluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwNSBhbmQgIEluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwNiBhbmQgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwNyBhbmQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwOCBhbmQgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgwOSBhbmQgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgxMCBhbmQgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgxMSBhbmQgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgxMiBhbmQgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgxMyBhbmQgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgxNCBhbmQgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorYW5keDgxNSBhbmQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCithbmR4ODIxIGFuZCAgTmFOIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODIyIGFuZCAgTmFOIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODIzIGFuZCAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODI0IGFuZCAgTmFOIC0wICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODI1IGFuZCAgTmFOICAwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODI2IGFuZCAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODI3IGFuZCAgTmFOICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODI4IGFuZCAgTmFOICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODI5IGFuZCAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODMwIGFuZCAtSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODMxIGFuZCAtMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODMyIGFuZCAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODMzIGFuZCAtMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODM0IGFuZCAgMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODM1IGFuZCAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODM2IGFuZCAgMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODM3IGFuZCAgSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2FuZHg4NDEgYW5kICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg0MiBhbmQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODQzIGFuZCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NDQgYW5kICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg0NSBhbmQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODQ2IGFuZCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NDcgYW5kICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg0OCBhbmQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODQ5IGFuZCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NTAgYW5kICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg1MSBhbmQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODUyIGFuZCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NTMgYW5kIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg1NCBhbmQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODU1IGFuZCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NTYgYW5kICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorYW5keDg1NyBhbmQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODU4IGFuZCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2FuZHg4NTkgYW5kICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCithbmR4ODYxIGFuZCAgTmFOMSAgIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODYyIGFuZCArTmFOMiAgIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODYzIGFuZCAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODY0IGFuZCAgTmFONCAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODY1IGFuZCAgTmFONSAgICtOYU42ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODY2IGFuZCAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODY3IGFuZCAtMTAwMCAgICBOYU44ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODY4IGFuZCAgMTAwMCAgICBOYU45ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODY5IGFuZCAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODcxIGFuZCAgc05hTjExICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODcyIGFuZCAgc05hTjEyICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODczIGFuZCAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODc0IGFuZCAgc05hTjE0ICAgTmFOMTcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODc1IGFuZCAgc05hTjE1ICBzTmFOMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODc2IGFuZCAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODc3IGFuZCAtSW5mICAgICtzTmFOMjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODc4IGFuZCAtMTAwMCAgICBzTmFOMjEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODc5IGFuZCAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODgwIGFuZCAgSW5mICAgICBzTmFOMjMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODgxIGFuZCArTmFOMjUgICtzTmFOMjQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODgyIGFuZCAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODgzIGFuZCAtc05hTjI3ICBzTmFOMjkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODg0IGFuZCAgMTAwMCAgICAtTmFOMzAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCithbmR4ODg1IGFuZCAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2Jhc2UuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvYmFzZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNGNlZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2Jhc2UuZGVjVGVzdApAQCAtMCwwICsxLDE0MTEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gYmFzZS5kZWNUZXN0IC0tIGJhc2UgZGVjaW1hbCA8LS0+IHN0cmluZyBjb252ZXJzaW9ucyAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorZXh0ZW5kZWQ6ICAgIDEKKworLS0gVGhpcyBmaWxlIHRlc3RzIGJhc2UgY29udmVyc2lvbnMgZnJvbSBzdHJpbmcgdG8gYSBkZWNpbWFsIG51bWJlcgorLS0gYW5kIGJhY2sgdG8gYSBzdHJpbmcgKGluIGVpdGhlciBTY2llbnRpZmljIG9yIEVuZ2luZWVyaW5nIGZvcm0pCisKKy0tIE5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgb3BlcmF0aW9ucyB0aGUgb3BlcmFuZCBpcyBzdWJqZWN0IHRvIHJvdW5kaW5nCistLSB0byBjb25mb3JtIHRvIGVtYXggYW5kIHByZWNpc2lvbiBzZXR0aW5ncyAodGhhdCBpcywgbnVtYmVycyB3aWxsCistLSBjb25mb3JtIHRvIHJ1bGVzIGFuZCBleHBvbmVudCB3aWxsIGJlIGluIHBlcm1pdHRlZCByYW5nZSkuCisKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKK2Jhc3gwMDEgdG9TY2kgICAgICAgMCAtPiAwCitiYXN4MDAyIHRvU2NpICAgICAgIDEgLT4gMQorYmFzeDAwMyB0b1NjaSAgICAgMS4wIC0+IDEuMAorYmFzeDAwNCB0b1NjaSAgICAxLjAwIC0+IDEuMDAKK2Jhc3gwMDUgdG9TY2kgICAgICAxMCAtPiAxMAorYmFzeDAwNiB0b1NjaSAgICAxMDAwIC0+IDEwMDAKK2Jhc3gwMDcgdG9TY2kgICAgMTAuMCAtPiAxMC4wCitiYXN4MDA4IHRvU2NpICAgIDEwLjEgLT4gMTAuMQorYmFzeDAwOSB0b1NjaSAgICAxMC40IC0+IDEwLjQKK2Jhc3gwMTAgdG9TY2kgICAgMTAuNSAtPiAxMC41CitiYXN4MDExIHRvU2NpICAgIDEwLjYgLT4gMTAuNgorYmFzeDAxMiB0b1NjaSAgICAxMC45IC0+IDEwLjkKK2Jhc3gwMTMgdG9TY2kgICAgMTEuMCAtPiAxMS4wCitiYXN4MDE0IHRvU2NpICAxLjIzNCAtPiAxLjIzNAorYmFzeDAxNSB0b1NjaSAgMC4xMjMgLT4gMC4xMjMKK2Jhc3gwMTYgdG9TY2kgIDAuMDEyIC0+IDAuMDEyCitiYXN4MDE3IHRvU2NpICAtMCAgICAtPiAtMAorYmFzeDAxOCB0b1NjaSAgLTAuMCAgLT4gLTAuMAorYmFzeDAxOSB0b1NjaSAtMDAuMDAgLT4gLTAuMDAKKworYmFzeDAyMSB0b1NjaSAgICAgLTEgLT4gLTEKK2Jhc3gwMjIgdG9TY2kgICAtMS4wIC0+IC0xLjAKK2Jhc3gwMjMgdG9TY2kgICAtMC4xIC0+IC0wLjEKK2Jhc3gwMjQgdG9TY2kgICAtOS4xIC0+IC05LjEKK2Jhc3gwMjUgdG9TY2kgICAtOS4xMSAtPiAtOS4xMQorYmFzeDAyNiB0b1NjaSAgIC05LjExOSAtPiAtOS4xMTkKK2Jhc3gwMjcgdG9TY2kgICAtOS45OTkgLT4gLTkuOTk5CisKK2Jhc3gwMzAgdG9TY2kgICcxMjM0NTY3ODkuMTIzNDU2JyAgIC0+ICcxMjM0NTY3ODkuMTIzNDU2JworYmFzeDAzMSB0b1NjaSAgJzEyMzQ1Njc4OS4wMDAwMDAnICAgLT4gJzEyMzQ1Njc4OS4wMDAwMDAnCitiYXN4MDMyIHRvU2NpICAgJzEyMzQ1Njc4OTEyMzQ1NicgICAtPiAnMTIzNDU2Nzg5MTIzNDU2JworYmFzeDAzMyB0b1NjaSAgICcwLjAwMDAxMjM0NTY3ODknICAgLT4gJzAuMDAwMDEyMzQ1Njc4OScKK2Jhc3gwMzQgdG9TY2kgICcwLjAwMDAwMTIzNDU2Nzg5JyAgIC0+ICcwLjAwMDAwMTIzNDU2Nzg5JworYmFzeDAzNSB0b1NjaSAnMC4wMDAwMDAxMjM0NTY3ODknICAgLT4gJzEuMjM0NTY3ODlFLTcnCitiYXN4MDM2IHRvU2NpICcwLjAwMDAwMDAxMjM0NTY3ODknICAtPiAnMS4yMzQ1Njc4OUUtOCcKKworYmFzeDAzNyB0b1NjaSAnMC4xMjM0NTY3ODkwMTIzNDQnICAgLT4gJzAuMTIzNDU2Nzg5MDEyMzQ0JworYmFzeDAzOCB0b1NjaSAnMC4xMjM0NTY3ODkwMTIzNDUnICAgLT4gJzAuMTIzNDU2Nzg5MDEyMzQ1JworCistLSBTdHJpbmcgW21hbnkgbW9yZSBleGFtcGxlcyBhcmUgaW1wbGljaXRseSB0ZXN0ZWQgZWxzZXdoZXJlXQorLS0gc3RyaW5ncyB3aXRob3V0IEUgY2Fubm90IGdlbmVyYXRlIEUgaW4gcmVzdWx0CitiYXN4MDQwIHRvU2NpICIxMiIgICAgICAgIC0+ICcxMicKK2Jhc3gwNDEgdG9TY2kgIi03NiIgICAgICAgLT4gJy03NicKK2Jhc3gwNDIgdG9TY2kgIjEyLjc2IiAgICAgLT4gJzEyLjc2JworYmFzeDA0MyB0b1NjaSAiKzEyLjc2IiAgICAtPiAnMTIuNzYnCitiYXN4MDQ0IHRvU2NpICIwMTIuNzYiICAgIC0+ICcxMi43NicKK2Jhc3gwNDUgdG9TY2kgIiswLjAwMyIgICAgLT4gJzAuMDAzJworYmFzeDA0NiB0b1NjaSAiMTcuIiAgICAgICAtPiAnMTcnCitiYXN4MDQ3IHRvU2NpICIuNSIgICAgICAgIC0+ICcwLjUnCitiYXN4MDQ4IHRvU2NpICIwNDQiICAgICAgIC0+ICc0NCcKK2Jhc3gwNDkgdG9TY2kgIjAwNDQiICAgICAgLT4gJzQ0JworYmFzeDA1MCB0b1NjaSAiMC4wMDA1IiAgICAgIC0+ICcwLjAwMDUnCitiYXN4MDUxIHRvU2NpICIwMC4wMDAwNSIgICAgLT4gJzAuMDAwMDUnCitiYXN4MDUyIHRvU2NpICIwLjAwMDAwNSIgICAgLT4gJzAuMDAwMDA1JworYmFzeDA1MyB0b1NjaSAiMC4wMDAwMDUwIiAgIC0+ICcwLjAwMDAwNTAnCitiYXN4MDU0IHRvU2NpICIwLjAwMDAwMDUiICAgLT4gJzVFLTcnCitiYXN4MDU1IHRvU2NpICIwLjAwMDAwMDA1IiAgLT4gJzVFLTgnCitiYXN4MDU2IHRvU2NpICIxMjM0NTY3OC41NDMyMTAiIC0+ICcxMjM0NTY3OC41NDMyMTAnCitiYXN4MDU3IHRvU2NpICIyMzQ1Njc4LjU0MzIxMCIgLT4gJzIzNDU2NzguNTQzMjEwJworYmFzeDA1OCB0b1NjaSAiMzQ1Njc4LjU0MzIxMCIgLT4gJzM0NTY3OC41NDMyMTAnCitiYXN4MDU5IHRvU2NpICIwMzQ1Njc4LjU0MzIxIiAtPiAnMzQ1Njc4LjU0MzIxJworYmFzeDA2MCB0b1NjaSAiMzQ1Njc4LjU0MzIiIC0+ICczNDU2NzguNTQzMicKK2Jhc3gwNjEgdG9TY2kgIiszNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworYmFzeDA2MiB0b1NjaSAiKzAzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworYmFzeDA2MyB0b1NjaSAiKzAwMzQ1Njc4LjU0MzIiIC0+ICczNDU2NzguNTQzMicKK2Jhc3gwNjQgdG9TY2kgIi0zNDU2NzguNTQzMiIgIC0+ICctMzQ1Njc4LjU0MzInCitiYXN4MDY1IHRvU2NpICItMDM0NTY3OC41NDMyIiAgLT4gJy0zNDU2NzguNTQzMicKK2Jhc3gwNjYgdG9TY2kgIi0wMDM0NTY3OC41NDMyIiAgLT4gJy0zNDU2NzguNTQzMicKKy0tIGV4YW1wbGVzCitiYXN4MDY3IHRvU2NpICI1RS02IiAgICAgICAgLT4gJzAuMDAwMDA1JworYmFzeDA2OCB0b1NjaSAiNTBFLTciICAgICAgIC0+ICcwLjAwMDAwNTAnCitiYXN4MDY5IHRvU2NpICI1RS03IiAgICAgICAgLT4gJzVFLTcnCisKKy0tIFtObyBleG90aWNzIGFzIG5vIFVuaWNvZGVdCisKKy0tIHJvdW5kZWQgd2l0aCBkb3RzIGluIGFsbCAoaW5jbHVkaW5nIGVkZ2UpIHBsYWNlcworYmFzeDA3MSB0b1NjaSAgLjEyMzQ1Njc4OTAxMjM0NTYxMjMgIC0+IDAuMTIzNDU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzIgdG9TY2kgIDEuMjM0NTY3ODkwMTIzNDU2MTIzICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzMgdG9TY2kgIDEyLjM0NTY3ODkwMTIzNDU2MTIzICAtPiAxMi4zNDU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzQgdG9TY2kgIDEyMy40NTY3ODkwMTIzNDU2MTIzICAtPiAxMjMuNDU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzUgdG9TY2kgIDEyMzQuNTY3ODkwMTIzNDU2MTIzICAtPiAxMjM0LjU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzYgdG9TY2kgIDEyMzQ1LjY3ODkwMTIzNDU2MTIzICAtPiAxMjM0NS42Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzcgdG9TY2kgIDEyMzQ1Ni43ODkwMTIzNDU2MTIzICAtPiAxMjM0NTYuNzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzggdG9TY2kgIDEyMzQ1NjcuODkwMTIzNDU2MTIzICAtPiAxMjM0NTY3Ljg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwNzkgdG9TY2kgIDEyMzQ1Njc4LjkwMTIzNDU2MTIzICAtPiAxMjM0NTY3OC45MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODAgdG9TY2kgIDEyMzQ1Njc4OS4wMTIzNDU2MTIzICAtPiAxMjM0NTY3ODkuMDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODEgdG9TY2kgIDEyMzQ1Njc4OTAuMTIzNDU2MTIzICAtPiAxMjM0NTY3ODkwLjEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODIgdG9TY2kgIDEyMzQ1Njc4OTAxLjIzNDU2MTIzICAtPiAxMjM0NTY3ODkwMS4yMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODMgdG9TY2kgIDEyMzQ1Njc4OTAxMi4zNDU2MTIzICAtPiAxMjM0NTY3ODkwMTIuMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODQgdG9TY2kgIDEyMzQ1Njc4OTAxMjMuNDU2MTIzICAtPiAxMjM0NTY3ODkwMTIzLjQ1NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODUgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0LjU2MTIzICAtPiAxMjM0NTY3ODkwMTIzNC41NiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODYgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NS42MTIzICAtPiAxMjM0NTY3ODkwMTIzNDUuNiBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODcgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NTYuMTIzICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gwODggdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NTYxLjIzICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUrMTYgSW5leGFjdCBSb3VuZGVkCitiYXN4MDg5IHRvU2NpICAxMjM0NTY3ODkwMTIzNDU2MTIuMyAgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFKzE3IEluZXhhY3QgUm91bmRlZAorYmFzeDA5MCB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1NjEyMy4gIC0+IDEuMjM0NTY3ODkwMTIzNDU2RSsxOCBJbmV4YWN0IFJvdW5kZWQKKworLS0gTnVtYmVycyB3aXRoIEUKK2Jhc3gxMzAgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2Jhc3gxMzEgdG9TY2kgIjAuMDAwRS0yIiAgLT4gJzAuMDAwMDAnCitiYXN4MTMyIHRvU2NpICIwLjAwMEUtMyIgIC0+ICcwLjAwMDAwMCcKK2Jhc3gxMzMgdG9TY2kgIjAuMDAwRS00IiAgLT4gJzBFLTcnCitiYXN4MTM0IHRvU2NpICIwLjAwRS0yIiAgIC0+ICcwLjAwMDAnCitiYXN4MTM1IHRvU2NpICIwLjAwRS0zIiAgIC0+ICcwLjAwMDAwJworYmFzeDEzNiB0b1NjaSAiMC4wMEUtNCIgICAtPiAnMC4wMDAwMDAnCitiYXN4MTM3IHRvU2NpICIwLjAwRS01IiAgIC0+ICcwRS03JworYmFzeDEzOCB0b1NjaSAiKzBFKzkiICAgICAtPiAnMEUrOScKK2Jhc3gxMzkgdG9TY2kgIi0wRSs5IiAgICAgLT4gJy0wRSs5JworYmFzeDE0MCB0b1NjaSAiMUUrOSIgICAgICAtPiAnMUUrOScKK2Jhc3gxNDEgdG9TY2kgIjFlKzA5IiAgICAgLT4gJzFFKzknCitiYXN4MTQyIHRvU2NpICIxRSs5MCIgICAgIC0+ICcxRSs5MCcKK2Jhc3gxNDMgdG9TY2kgIisxRSswMDkiICAgLT4gJzFFKzknCitiYXN4MTQ0IHRvU2NpICIwRSs5IiAgICAgIC0+ICcwRSs5JworYmFzeDE0NSB0b1NjaSAiMUUrOSIgICAgICAtPiAnMUUrOScKK2Jhc3gxNDYgdG9TY2kgIjFFKzA5IiAgICAgLT4gJzFFKzknCitiYXN4MTQ3IHRvU2NpICIxZSs5MCIgICAgIC0+ICcxRSs5MCcKK2Jhc3gxNDggdG9TY2kgIjFFKzAwOSIgICAgLT4gJzFFKzknCitiYXN4MTQ5IHRvU2NpICIwMDBFKzkiICAgIC0+ICcwRSs5JworYmFzeDE1MCB0b1NjaSAiMUU5IiAgICAgICAtPiAnMUUrOScKK2Jhc3gxNTEgdG9TY2kgIjFlMDkiICAgICAgLT4gJzFFKzknCitiYXN4MTUyIHRvU2NpICIxRTkwIiAgICAgIC0+ICcxRSs5MCcKK2Jhc3gxNTMgdG9TY2kgIjFFMDA5IiAgICAgLT4gJzFFKzknCitiYXN4MTU0IHRvU2NpICIwRTkiICAgICAgIC0+ICcwRSs5JworYmFzeDE1NSB0b1NjaSAiMC4wMDBlKzAiICAtPiAnMC4wMDAnCitiYXN4MTU2IHRvU2NpICIwLjAwMEUtMSIgIC0+ICcwLjAwMDAnCitiYXN4MTU3IHRvU2NpICI0RSs5IiAgICAgIC0+ICc0RSs5JworYmFzeDE1OCB0b1NjaSAiNDRFKzkiICAgICAtPiAnNC40RSsxMCcKK2Jhc3gxNTkgdG9TY2kgIjAuNzNlLTciICAgLT4gJzcuM0UtOCcKK2Jhc3gxNjAgdG9TY2kgIjAwRSs5IiAgICAgLT4gJzBFKzknCitiYXN4MTYxIHRvU2NpICIwMEUtOSIgICAgIC0+ICcwRS05JworYmFzeDE2MiB0b1NjaSAiMTBFKzkiICAgICAtPiAnMS4wRSsxMCcKK2Jhc3gxNjMgdG9TY2kgIjEwRSswOSIgICAgLT4gJzEuMEUrMTAnCitiYXN4MTY0IHRvU2NpICIxMGUrOTAiICAgIC0+ICcxLjBFKzkxJworYmFzeDE2NSB0b1NjaSAiMTBFKzAwOSIgICAtPiAnMS4wRSsxMCcKK2Jhc3gxNjYgdG9TY2kgIjEwMGUrOSIgICAgLT4gJzEuMDBFKzExJworYmFzeDE2NyB0b1NjaSAiMTAwZSswOSIgICAtPiAnMS4wMEUrMTEnCitiYXN4MTY4IHRvU2NpICIxMDBFKzkwIiAgIC0+ICcxLjAwRSs5MicKK2Jhc3gxNjkgdG9TY2kgIjEwMGUrMDA5IiAgLT4gJzEuMDBFKzExJworCitiYXN4MTcwIHRvU2NpICIxLjI2NSIgICAgIC0+ICcxLjI2NScKK2Jhc3gxNzEgdG9TY2kgIjEuMjY1RS0yMCIgLT4gJzEuMjY1RS0yMCcKK2Jhc3gxNzIgdG9TY2kgIjEuMjY1RS04IiAgLT4gJzEuMjY1RS04JworYmFzeDE3MyB0b1NjaSAiMS4yNjVFLTQiICAtPiAnMC4wMDAxMjY1JworYmFzeDE3NCB0b1NjaSAiMS4yNjVFLTMiICAtPiAnMC4wMDEyNjUnCitiYXN4MTc1IHRvU2NpICIxLjI2NUUtMiIgIC0+ICcwLjAxMjY1JworYmFzeDE3NiB0b1NjaSAiMS4yNjVFLTEiICAtPiAnMC4xMjY1JworYmFzeDE3NyB0b1NjaSAiMS4yNjVFLTAiICAtPiAnMS4yNjUnCitiYXN4MTc4IHRvU2NpICIxLjI2NUUrMSIgIC0+ICcxMi42NScKK2Jhc3gxNzkgdG9TY2kgIjEuMjY1RSsyIiAgLT4gJzEyNi41JworYmFzeDE4MCB0b1NjaSAiMS4yNjVFKzMiICAtPiAnMTI2NScKK2Jhc3gxODEgdG9TY2kgIjEuMjY1RSs0IiAgLT4gJzEuMjY1RSs0JworYmFzeDE4MiB0b1NjaSAiMS4yNjVFKzgiICAtPiAnMS4yNjVFKzgnCitiYXN4MTgzIHRvU2NpICIxLjI2NUUrMjAiIC0+ICcxLjI2NUUrMjAnCisKK2Jhc3gxOTAgdG9TY2kgIjEyLjY1IiAgICAgLT4gJzEyLjY1JworYmFzeDE5MSB0b1NjaSAiMTIuNjVFLTIwIiAtPiAnMS4yNjVFLTE5JworYmFzeDE5MiB0b1NjaSAiMTIuNjVFLTgiICAtPiAnMS4yNjVFLTcnCitiYXN4MTkzIHRvU2NpICIxMi42NUUtNCIgIC0+ICcwLjAwMTI2NScKK2Jhc3gxOTQgdG9TY2kgIjEyLjY1RS0zIiAgLT4gJzAuMDEyNjUnCitiYXN4MTk1IHRvU2NpICIxMi42NUUtMiIgIC0+ICcwLjEyNjUnCitiYXN4MTk2IHRvU2NpICIxMi42NUUtMSIgIC0+ICcxLjI2NScKK2Jhc3gxOTcgdG9TY2kgIjEyLjY1RS0wIiAgLT4gJzEyLjY1JworYmFzeDE5OCB0b1NjaSAiMTIuNjVFKzEiICAtPiAnMTI2LjUnCitiYXN4MTk5IHRvU2NpICIxMi42NUUrMiIgIC0+ICcxMjY1JworYmFzeDIwMCB0b1NjaSAiMTIuNjVFKzMiICAtPiAnMS4yNjVFKzQnCitiYXN4MjAxIHRvU2NpICIxMi42NUUrNCIgIC0+ICcxLjI2NUUrNScKK2Jhc3gyMDIgdG9TY2kgIjEyLjY1RSs4IiAgLT4gJzEuMjY1RSs5JworYmFzeDIwMyB0b1NjaSAiMTIuNjVFKzIwIiAtPiAnMS4yNjVFKzIxJworCitiYXN4MjEwIHRvU2NpICIxMjYuNSIgICAgIC0+ICcxMjYuNScKK2Jhc3gyMTEgdG9TY2kgIjEyNi41RS0yMCIgLT4gJzEuMjY1RS0xOCcKK2Jhc3gyMTIgdG9TY2kgIjEyNi41RS04IiAgLT4gJzAuMDAwMDAxMjY1JworYmFzeDIxMyB0b1NjaSAiMTI2LjVFLTQiICAtPiAnMC4wMTI2NScKK2Jhc3gyMTQgdG9TY2kgIjEyNi41RS0zIiAgLT4gJzAuMTI2NScKK2Jhc3gyMTUgdG9TY2kgIjEyNi41RS0yIiAgLT4gJzEuMjY1JworYmFzeDIxNiB0b1NjaSAiMTI2LjVFLTEiICAtPiAnMTIuNjUnCitiYXN4MjE3IHRvU2NpICIxMjYuNUUtMCIgIC0+ICcxMjYuNScKK2Jhc3gyMTggdG9TY2kgIjEyNi41RSsxIiAgLT4gJzEyNjUnCitiYXN4MjE5IHRvU2NpICIxMjYuNUUrMiIgIC0+ICcxLjI2NUUrNCcKK2Jhc3gyMjAgdG9TY2kgIjEyNi41RSszIiAgLT4gJzEuMjY1RSs1JworYmFzeDIyMSB0b1NjaSAiMTI2LjVFKzQiICAtPiAnMS4yNjVFKzYnCitiYXN4MjIyIHRvU2NpICIxMjYuNUUrOCIgIC0+ICcxLjI2NUUrMTAnCitiYXN4MjIzIHRvU2NpICIxMjYuNUUrMjAiIC0+ICcxLjI2NUUrMjInCisKK2Jhc3gyMzAgdG9TY2kgIjEyNjUiICAgICAtPiAnMTI2NScKK2Jhc3gyMzEgdG9TY2kgIjEyNjVFLTIwIiAtPiAnMS4yNjVFLTE3JworYmFzeDIzMiB0b1NjaSAiMTI2NUUtOCIgIC0+ICcwLjAwMDAxMjY1JworYmFzeDIzMyB0b1NjaSAiMTI2NUUtNCIgIC0+ICcwLjEyNjUnCitiYXN4MjM0IHRvU2NpICIxMjY1RS0zIiAgLT4gJzEuMjY1JworYmFzeDIzNSB0b1NjaSAiMTI2NUUtMiIgIC0+ICcxMi42NScKK2Jhc3gyMzYgdG9TY2kgIjEyNjVFLTEiICAtPiAnMTI2LjUnCitiYXN4MjM3IHRvU2NpICIxMjY1RS0wIiAgLT4gJzEyNjUnCitiYXN4MjM4IHRvU2NpICIxMjY1RSsxIiAgLT4gJzEuMjY1RSs0JworYmFzeDIzOSB0b1NjaSAiMTI2NUUrMiIgIC0+ICcxLjI2NUUrNScKK2Jhc3gyNDAgdG9TY2kgIjEyNjVFKzMiICAtPiAnMS4yNjVFKzYnCitiYXN4MjQxIHRvU2NpICIxMjY1RSs0IiAgLT4gJzEuMjY1RSs3JworYmFzeDI0MiB0b1NjaSAiMTI2NUUrOCIgIC0+ICcxLjI2NUUrMTEnCitiYXN4MjQzIHRvU2NpICIxMjY1RSsyMCIgLT4gJzEuMjY1RSsyMycKKworYmFzeDI1MCB0b1NjaSAiMC4xMjY1IiAgICAgLT4gJzAuMTI2NScKK2Jhc3gyNTEgdG9TY2kgIjAuMTI2NUUtMjAiIC0+ICcxLjI2NUUtMjEnCitiYXN4MjUyIHRvU2NpICIwLjEyNjVFLTgiICAtPiAnMS4yNjVFLTknCitiYXN4MjUzIHRvU2NpICIwLjEyNjVFLTQiICAtPiAnMC4wMDAwMTI2NScKK2Jhc3gyNTQgdG9TY2kgIjAuMTI2NUUtMyIgIC0+ICcwLjAwMDEyNjUnCitiYXN4MjU1IHRvU2NpICIwLjEyNjVFLTIiICAtPiAnMC4wMDEyNjUnCitiYXN4MjU2IHRvU2NpICIwLjEyNjVFLTEiICAtPiAnMC4wMTI2NScKK2Jhc3gyNTcgdG9TY2kgIjAuMTI2NUUtMCIgIC0+ICcwLjEyNjUnCitiYXN4MjU4IHRvU2NpICIwLjEyNjVFKzEiICAtPiAnMS4yNjUnCitiYXN4MjU5IHRvU2NpICIwLjEyNjVFKzIiICAtPiAnMTIuNjUnCitiYXN4MjYwIHRvU2NpICIwLjEyNjVFKzMiICAtPiAnMTI2LjUnCitiYXN4MjYxIHRvU2NpICIwLjEyNjVFKzQiICAtPiAnMTI2NScKK2Jhc3gyNjIgdG9TY2kgIjAuMTI2NUUrOCIgIC0+ICcxLjI2NUUrNycKK2Jhc3gyNjMgdG9TY2kgIjAuMTI2NUUrMjAiIC0+ICcxLjI2NUUrMTknCisKKy0tIHNvbWUgbW9yZSBuZWdhdGl2ZSB6ZXJvcyBbc3lzdGVtYXRpYyB0ZXN0cyBiZWxvd10KK2Jhc3gyOTAgdG9TY2kgIi0wLjAwMEUtMSIgIC0+ICctMC4wMDAwJworYmFzeDI5MSB0b1NjaSAiLTAuMDAwRS0yIiAgLT4gJy0wLjAwMDAwJworYmFzeDI5MiB0b1NjaSAiLTAuMDAwRS0zIiAgLT4gJy0wLjAwMDAwMCcKK2Jhc3gyOTMgdG9TY2kgIi0wLjAwMEUtNCIgIC0+ICctMEUtNycKK2Jhc3gyOTQgdG9TY2kgIi0wLjAwRS0yIiAgIC0+ICctMC4wMDAwJworYmFzeDI5NSB0b1NjaSAiLTAuMDBFLTMiICAgLT4gJy0wLjAwMDAwJworYmFzeDI5NiB0b1NjaSAiLTAuMEUtMiIgICAgLT4gJy0wLjAwMCcKK2Jhc3gyOTcgdG9TY2kgIi0wLjBFLTMiICAgIC0+ICctMC4wMDAwJworYmFzeDI5OCB0b1NjaSAiLTBFLTIiICAgICAgLT4gJy0wLjAwJworYmFzeDI5OSB0b1NjaSAiLTBFLTMiICAgICAgLT4gJy0wLjAwMCcKKworLS0gRW5naW5lZXJpbmcgbm90YXRpb24gdGVzdHMKK2Jhc3gzMDEgIHRvU2NpIDEwZTEyICAtPiAxLjBFKzEzCitiYXN4MzAyICB0b0VuZyAxMGUxMiAgLT4gMTBFKzEyCitiYXN4MzAzICB0b1NjaSAxMGUxMSAgLT4gMS4wRSsxMgorYmFzeDMwNCAgdG9FbmcgMTBlMTEgIC0+IDEuMEUrMTIKK2Jhc3gzMDUgIHRvU2NpIDEwZTEwICAtPiAxLjBFKzExCitiYXN4MzA2ICB0b0VuZyAxMGUxMCAgLT4gMTAwRSs5CitiYXN4MzA3ICB0b1NjaSAxMGU5ICAgLT4gMS4wRSsxMAorYmFzeDMwOCAgdG9FbmcgMTBlOSAgIC0+IDEwRSs5CitiYXN4MzA5ICB0b1NjaSAxMGU4ICAgLT4gMS4wRSs5CitiYXN4MzEwICB0b0VuZyAxMGU4ICAgLT4gMS4wRSs5CitiYXN4MzExICB0b1NjaSAxMGU3ICAgLT4gMS4wRSs4CitiYXN4MzEyICB0b0VuZyAxMGU3ICAgLT4gMTAwRSs2CitiYXN4MzEzICB0b1NjaSAxMGU2ICAgLT4gMS4wRSs3CitiYXN4MzE0ICB0b0VuZyAxMGU2ICAgLT4gMTBFKzYKK2Jhc3gzMTUgIHRvU2NpIDEwZTUgICAtPiAxLjBFKzYKK2Jhc3gzMTYgIHRvRW5nIDEwZTUgICAtPiAxLjBFKzYKK2Jhc3gzMTcgIHRvU2NpIDEwZTQgICAtPiAxLjBFKzUKK2Jhc3gzMTggIHRvRW5nIDEwZTQgICAtPiAxMDBFKzMKK2Jhc3gzMTkgIHRvU2NpIDEwZTMgICAtPiAxLjBFKzQKK2Jhc3gzMjAgIHRvRW5nIDEwZTMgICAtPiAxMEUrMworYmFzeDMyMSAgdG9TY2kgMTBlMiAgIC0+IDEuMEUrMworYmFzeDMyMiAgdG9FbmcgMTBlMiAgIC0+IDEuMEUrMworYmFzeDMyMyAgdG9TY2kgMTBlMSAgIC0+IDEuMEUrMgorYmFzeDMyNCAgdG9FbmcgMTBlMSAgIC0+IDEwMAorYmFzeDMyNSAgdG9TY2kgMTBlMCAgIC0+IDEwCitiYXN4MzI2ICB0b0VuZyAxMGUwICAgLT4gMTAKK2Jhc3gzMjcgIHRvU2NpIDEwZS0xICAtPiAxLjAKK2Jhc3gzMjggIHRvRW5nIDEwZS0xICAtPiAxLjAKK2Jhc3gzMjkgIHRvU2NpIDEwZS0yICAtPiAwLjEwCitiYXN4MzMwICB0b0VuZyAxMGUtMiAgLT4gMC4xMAorYmFzeDMzMSAgdG9TY2kgMTBlLTMgIC0+IDAuMDEwCitiYXN4MzMyICB0b0VuZyAxMGUtMyAgLT4gMC4wMTAKK2Jhc3gzMzMgIHRvU2NpIDEwZS00ICAtPiAwLjAwMTAKK2Jhc3gzMzQgIHRvRW5nIDEwZS00ICAtPiAwLjAwMTAKK2Jhc3gzMzUgIHRvU2NpIDEwZS01ICAtPiAwLjAwMDEwCitiYXN4MzM2ICB0b0VuZyAxMGUtNSAgLT4gMC4wMDAxMAorYmFzeDMzNyAgdG9TY2kgMTBlLTYgIC0+IDAuMDAwMDEwCitiYXN4MzM4ICB0b0VuZyAxMGUtNiAgLT4gMC4wMDAwMTAKK2Jhc3gzMzkgIHRvU2NpIDEwZS03ICAtPiAwLjAwMDAwMTAKK2Jhc3gzNDAgIHRvRW5nIDEwZS03ICAtPiAwLjAwMDAwMTAKK2Jhc3gzNDEgIHRvU2NpIDEwZS04ICAtPiAxLjBFLTcKK2Jhc3gzNDIgIHRvRW5nIDEwZS04ICAtPiAxMDBFLTkKK2Jhc3gzNDMgIHRvU2NpIDEwZS05ICAtPiAxLjBFLTgKK2Jhc3gzNDQgIHRvRW5nIDEwZS05ICAtPiAxMEUtOQorYmFzeDM0NSAgdG9TY2kgMTBlLTEwIC0+IDEuMEUtOQorYmFzeDM0NiAgdG9FbmcgMTBlLTEwIC0+IDEuMEUtOQorYmFzeDM0NyAgdG9TY2kgMTBlLTExIC0+IDEuMEUtMTAKK2Jhc3gzNDggIHRvRW5nIDEwZS0xMSAtPiAxMDBFLTEyCitiYXN4MzQ5ICB0b1NjaSAxMGUtMTIgLT4gMS4wRS0xMQorYmFzeDM1MCAgdG9FbmcgMTBlLTEyIC0+IDEwRS0xMgorYmFzeDM1MSAgdG9TY2kgMTBlLTEzIC0+IDEuMEUtMTIKK2Jhc3gzNTIgIHRvRW5nIDEwZS0xMyAtPiAxLjBFLTEyCisKK2Jhc3gzNjEgIHRvU2NpIDdFMTIgIC0+IDdFKzEyCitiYXN4MzYyICB0b0VuZyA3RTEyICAtPiA3RSsxMgorYmFzeDM2MyAgdG9TY2kgN0UxMSAgLT4gN0UrMTEKK2Jhc3gzNjQgIHRvRW5nIDdFMTEgIC0+IDcwMEUrOQorYmFzeDM2NSAgdG9TY2kgN0UxMCAgLT4gN0UrMTAKK2Jhc3gzNjYgIHRvRW5nIDdFMTAgIC0+IDcwRSs5CitiYXN4MzY3ICB0b1NjaSA3RTkgICAtPiA3RSs5CitiYXN4MzY4ICB0b0VuZyA3RTkgICAtPiA3RSs5CitiYXN4MzY5ICB0b1NjaSA3RTggICAtPiA3RSs4CitiYXN4MzcwICB0b0VuZyA3RTggICAtPiA3MDBFKzYKK2Jhc3gzNzEgIHRvU2NpIDdFNyAgIC0+IDdFKzcKK2Jhc3gzNzIgIHRvRW5nIDdFNyAgIC0+IDcwRSs2CitiYXN4MzczICB0b1NjaSA3RTYgICAtPiA3RSs2CitiYXN4Mzc0ICB0b0VuZyA3RTYgICAtPiA3RSs2CitiYXN4Mzc1ICB0b1NjaSA3RTUgICAtPiA3RSs1CitiYXN4Mzc2ICB0b0VuZyA3RTUgICAtPiA3MDBFKzMKK2Jhc3gzNzcgIHRvU2NpIDdFNCAgIC0+IDdFKzQKK2Jhc3gzNzggIHRvRW5nIDdFNCAgIC0+IDcwRSszCitiYXN4Mzc5ICB0b1NjaSA3RTMgICAtPiA3RSszCitiYXN4MzgwICB0b0VuZyA3RTMgICAtPiA3RSszCitiYXN4MzgxICB0b1NjaSA3RTIgICAtPiA3RSsyCitiYXN4MzgyICB0b0VuZyA3RTIgICAtPiA3MDAKK2Jhc3gzODMgIHRvU2NpIDdFMSAgIC0+IDdFKzEKK2Jhc3gzODQgIHRvRW5nIDdFMSAgIC0+IDcwCitiYXN4Mzg1ICB0b1NjaSA3RTAgICAtPiA3CitiYXN4Mzg2ICB0b0VuZyA3RTAgICAtPiA3CitiYXN4Mzg3ICB0b1NjaSA3RS0xICAtPiAwLjcKK2Jhc3gzODggIHRvRW5nIDdFLTEgIC0+IDAuNworYmFzeDM4OSAgdG9TY2kgN0UtMiAgLT4gMC4wNworYmFzeDM5MCAgdG9FbmcgN0UtMiAgLT4gMC4wNworYmFzeDM5MSAgdG9TY2kgN0UtMyAgLT4gMC4wMDcKK2Jhc3gzOTIgIHRvRW5nIDdFLTMgIC0+IDAuMDA3CitiYXN4MzkzICB0b1NjaSA3RS00ICAtPiAwLjAwMDcKK2Jhc3gzOTQgIHRvRW5nIDdFLTQgIC0+IDAuMDAwNworYmFzeDM5NSAgdG9TY2kgN0UtNSAgLT4gMC4wMDAwNworYmFzeDM5NiAgdG9FbmcgN0UtNSAgLT4gMC4wMDAwNworYmFzeDM5NyAgdG9TY2kgN0UtNiAgLT4gMC4wMDAwMDcKK2Jhc3gzOTggIHRvRW5nIDdFLTYgIC0+IDAuMDAwMDA3CitiYXN4Mzk5ICB0b1NjaSA3RS03ICAtPiA3RS03CitiYXN4NDAwICB0b0VuZyA3RS03ICAtPiA3MDBFLTkKK2Jhc3g0MDEgIHRvU2NpIDdFLTggIC0+IDdFLTgKK2Jhc3g0MDIgIHRvRW5nIDdFLTggIC0+IDcwRS05CitiYXN4NDAzICB0b1NjaSA3RS05ICAtPiA3RS05CitiYXN4NDA0ICB0b0VuZyA3RS05ICAtPiA3RS05CitiYXN4NDA1ICB0b1NjaSA3RS0xMCAtPiA3RS0xMAorYmFzeDQwNiAgdG9FbmcgN0UtMTAgLT4gNzAwRS0xMgorYmFzeDQwNyAgdG9TY2kgN0UtMTEgLT4gN0UtMTEKK2Jhc3g0MDggIHRvRW5nIDdFLTExIC0+IDcwRS0xMgorYmFzeDQwOSAgdG9TY2kgN0UtMTIgLT4gN0UtMTIKK2Jhc3g0MTAgIHRvRW5nIDdFLTEyIC0+IDdFLTEyCitiYXN4NDExICB0b1NjaSA3RS0xMyAtPiA3RS0xMworYmFzeDQxMiAgdG9FbmcgN0UtMTMgLT4gNzAwRS0xNQorCistLSBFeGFjdHMgcmVtYWluIGV4YWN0IHVwIHRvIHByZWNpc2lvbiAuLgorcHJlY2lzaW9uOiA5CitiYXN4NDIwICB0b1NjaSAgICAxMDAgLT4gMTAwCitiYXN4NDIxICB0b0VuZyAgICAxMDAgLT4gMTAwCitiYXN4NDIyICB0b1NjaSAgIDEwMDAgLT4gMTAwMAorYmFzeDQyMyAgdG9FbmcgICAxMDAwIC0+IDEwMDAKK2Jhc3g0MjQgIHRvU2NpICA5OTkuOSAtPiAgOTk5LjkKK2Jhc3g0MjUgIHRvRW5nICA5OTkuOSAtPiAgOTk5LjkKK2Jhc3g0MjYgIHRvU2NpIDEwMDAuMCAtPiAxMDAwLjAKK2Jhc3g0MjcgIHRvRW5nIDEwMDAuMCAtPiAxMDAwLjAKK2Jhc3g0MjggIHRvU2NpIDEwMDAuMSAtPiAxMDAwLjEKK2Jhc3g0MjkgIHRvRW5nIDEwMDAuMSAtPiAxMDAwLjEKK2Jhc3g0MzAgIHRvU2NpIDEwMDAwIC0+IDEwMDAwCitiYXN4NDMxICB0b0VuZyAxMDAwMCAtPiAxMDAwMAorYmFzeDQzMiAgdG9TY2kgMTAwMDAwIC0+IDEwMDAwMAorYmFzeDQzMyAgdG9FbmcgMTAwMDAwIC0+IDEwMDAwMAorYmFzeDQzNCAgdG9TY2kgMTAwMDAwMCAtPiAxMDAwMDAwCitiYXN4NDM1ICB0b0VuZyAxMDAwMDAwIC0+IDEwMDAwMDAKK2Jhc3g0MzYgIHRvU2NpIDEwMDAwMDAwIC0+IDEwMDAwMDAwCitiYXN4NDM3ICB0b0VuZyAxMDAwMDAwMCAtPiAxMDAwMDAwMAorYmFzeDQzOCAgdG9TY2kgMTAwMDAwMDAwIC0+IDEwMDAwMDAwMAorYmFzeDQzOSAgdG9FbmcgMTAwMDAwMDAwIC0+IDEwMDAwMDAwMAorYmFzeDQ0MCAgdG9TY2kgMTAwMDAwMDAwMCAgICAtPiAxLjAwMDAwMDAwRSs5ICAgIFJvdW5kZWQKK2Jhc3g0NDEgIHRvRW5nIDEwMDAwMDAwMDAgICAgLT4gMS4wMDAwMDAwMEUrOSAgICBSb3VuZGVkCitiYXN4NDQyICB0b1NjaSAxMDAwMDAwMDAwICAgIC0+IDEuMDAwMDAwMDBFKzkgICAgUm91bmRlZAorYmFzeDQ0MyAgdG9FbmcgMTAwMDAwMDAwMCAgICAtPiAxLjAwMDAwMDAwRSs5ICAgIFJvdW5kZWQKK2Jhc3g0NDQgIHRvU2NpIDEwMDAwMDAwMDMgICAgLT4gMS4wMDAwMDAwMEUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NDUgIHRvRW5nIDEwMDAwMDAwMDMgICAgLT4gMS4wMDAwMDAwMEUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NDYgIHRvU2NpIDEwMDAwMDAwMDUgICAgLT4gMS4wMDAwMDAwMUUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NDcgIHRvRW5nIDEwMDAwMDAwMDUgICAgLT4gMS4wMDAwMDAwMUUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NDggIHRvU2NpIDEwMDAwMDAwMDUwICAgLT4gMS4wMDAwMDAwMUUrMTAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NDkgIHRvRW5nIDEwMDAwMDAwMDUwICAgLT4gMTAuMDAwMDAwMUUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NTAgIHRvU2NpIDEwMDAwMDAwMDkgICAgLT4gMS4wMDAwMDAwMUUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NTEgIHRvRW5nIDEwMDAwMDAwMDkgICAgLT4gMS4wMDAwMDAwMUUrOSAgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NTIgIHRvU2NpIDEwMDAwMDAwMDAwICAgLT4gMS4wMDAwMDAwMEUrMTAgICBSb3VuZGVkCitiYXN4NDUzICB0b0VuZyAxMDAwMDAwMDAwMCAgIC0+IDEwLjAwMDAwMDBFKzkgICAgUm91bmRlZAorYmFzeDQ1NCAgdG9TY2kgMTAwMDAwMDAwMDMgICAtPiAxLjAwMDAwMDAwRSsxMCAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1NSAgdG9FbmcgMTAwMDAwMDAwMDMgICAtPiAxMC4wMDAwMDAwRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1NiAgdG9TY2kgMTAwMDAwMDAwMDUgICAtPiAxLjAwMDAwMDAwRSsxMCAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1NyAgdG9FbmcgMTAwMDAwMDAwMDUgICAtPiAxMC4wMDAwMDAwRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1OCAgdG9TY2kgMTAwMDAwMDAwMDkgICAtPiAxLjAwMDAwMDAwRSsxMCAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ1OSAgdG9FbmcgMTAwMDAwMDAwMDkgICAtPiAxMC4wMDAwMDAwRSs5ICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDQ2MCAgdG9TY2kgMTAwMDAwMDAwMDAwICAtPiAxLjAwMDAwMDAwRSsxMSAgIFJvdW5kZWQKK2Jhc3g0NjEgIHRvRW5nIDEwMDAwMDAwMDAwMCAgLT4gMTAwLjAwMDAwMEUrOSAgICBSb3VuZGVkCitiYXN4NDYyICB0b1NjaSAxMDAwMDAwMDAzMDAgIC0+IDEuMDAwMDAwMDBFKzExICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDYzICB0b0VuZyAxMDAwMDAwMDAzMDAgIC0+IDEwMC4wMDAwMDBFKzkgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDY0ICB0b1NjaSAxMDAwMDAwMDA1MDAgIC0+IDEuMDAwMDAwMDFFKzExICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDY1ICB0b0VuZyAxMDAwMDAwMDA1MDAgIC0+IDEwMC4wMDAwMDFFKzkgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDY2ICB0b1NjaSAxMDAwMDAwMDA5MDAgIC0+IDEuMDAwMDAwMDFFKzExICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDY3ICB0b0VuZyAxMDAwMDAwMDA5MDAgIC0+IDEwMC4wMDAwMDFFKzkgICAgUm91bmRlZCBJbmV4YWN0CitiYXN4NDY4ICB0b1NjaSAxMDAwMDAwMDAwMDAwIC0+IDEuMDAwMDAwMDBFKzEyICAgUm91bmRlZAorYmFzeDQ2OSAgdG9FbmcgMTAwMDAwMDAwMDAwMCAtPiAxLjAwMDAwMDAwRSsxMiAgIFJvdW5kZWQKK2Jhc3g0NzAgIHRvU2NpIDEwMDAwMDAwMDMwMDAgLT4gMS4wMDAwMDAwMEUrMTIgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NzEgIHRvRW5nIDEwMDAwMDAwMDMwMDAgLT4gMS4wMDAwMDAwMEUrMTIgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NzIgIHRvU2NpIDEwMDAwMDAwMDUwMDAgLT4gMS4wMDAwMDAwMUUrMTIgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NzMgIHRvRW5nIDEwMDAwMDAwMDUwMDAgLT4gMS4wMDAwMDAwMUUrMTIgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NzQgIHRvU2NpIDEwMDAwMDAwMDkwMDAgLT4gMS4wMDAwMDAwMUUrMTIgICBSb3VuZGVkIEluZXhhY3QKK2Jhc3g0NzUgIHRvRW5nIDEwMDAwMDAwMDkwMDAgLT4gMS4wMDAwMDAwMUUrMTIgICBSb3VuZGVkIEluZXhhY3QKKworLS0gYWxsLW5pbmVzIHJvdW5kaW5nCitwcmVjaXNpb246IDkKK3JvdW5kaW5nOiAgaGFsZl91cAorYmFzeDI3MCAgdG9TY2kgOTk5OTk5OTk5ICAgICAgICAgIC0+ICAgOTk5OTk5OTk5CitiYXN4MjcxICB0b1NjaSA5OTk5OTk5OTkwICAgICAgICAgLT4gICA5Ljk5OTk5OTk5RSs5ICAgICAgUm91bmRlZAorYmFzeDI3MiAgdG9TY2kgOTk5OTk5OTk5MSAgICAgICAgIC0+ICAgOS45OTk5OTk5OUUrOSAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI3MyAgdG9TY2kgOTk5OTk5OTk5MiAgICAgICAgIC0+ICAgOS45OTk5OTk5OUUrOSAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI3NCAgdG9TY2kgOTk5OTk5OTk5MyAgICAgICAgIC0+ICAgOS45OTk5OTk5OUUrOSAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI3NSAgdG9TY2kgOTk5OTk5OTk5NCAgICAgICAgIC0+ICAgOS45OTk5OTk5OUUrOSAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI3NiAgdG9TY2kgOTk5OTk5OTk5NSAgICAgICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI3NyAgdG9TY2kgOTk5OTk5OTk5NiAgICAgICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI3OCAgdG9TY2kgOTk5OTk5OTk5NyAgICAgICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI3OSAgdG9TY2kgOTk5OTk5OTk5OCAgICAgICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI4MCAgdG9TY2kgOTk5OTk5OTk5OSAgICAgICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgICAgIFJvdW5kZWQgSW5leGFjdAorYmFzeDI4MSAgdG9TY2kgOTk5OTk5OTk5OTk5OTk5OSAgIC0+ICAgMS4wMDAwMDAwMEUrMTYgICAgIFJvdW5kZWQgSW5leGFjdAorCistLSBjaGVjayByb3VuZGluZyBtb2RlcyBoZWVkZWQKK3ByZWNpc2lvbjogNQorcm91bmRpbmc6ICBjZWlsaW5nCitic3J4NDAxICB0b1NjaSAgMS4yMzQ1MCAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkCitic3J4NDAyICB0b1NjaSAgMS4yMzQ1NDkgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MDMgIHRvU2NpICAxLjIzNDU1MCAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQwNCAgdG9TY2kgIDEuMjM0NTUxICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitic3J4NDA1ICB0b1NjaSAgMS4yMzQ1MCAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkCitic3J4NDA2ICB0b1NjaSAgMS4yMzQ1NDkgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MDcgIHRvU2NpICAxLjIzNDU1MCAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQwOCAgdG9TY2kgIDEuMjM0NTUxICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGZsb29yCitic3J4NDEwICB0b1NjaSAgMS4yMzQ1MCAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkCitic3J4NDExICB0b1NjaSAgMS4yMzQ1NDkgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MTIgIHRvU2NpICAxLjIzNDU1MCAgIC0+ICAxLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQxMyAgdG9TY2kgIDEuMjM0NTUxICAgLT4gIDEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZG93bgorYnNyeDQxNSAgdG9TY2kgIDEuMjM0NTAgICAgLT4gIDEuMjM0NSAgUm91bmRlZAorYnNyeDQxNiAgdG9TY2kgIDEuMjM0NTQ5ICAgLT4gIDEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NDE3ICB0b1NjaSAgMS4yMzQ1NTAgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MTggIHRvU2NpICAxLjIzNDY1MCAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQxOSAgdG9TY2kgIDEuMjM0NTUxICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZXZlbgorYnNyeDQyMSAgdG9TY2kgIDEuMjM0NTAgICAgLT4gIDEuMjM0NSAgUm91bmRlZAorYnNyeDQyMiAgdG9TY2kgIDEuMjM0NTQ5ICAgLT4gIDEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NDIzICB0b1NjaSAgMS4yMzQ1NTAgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MjQgIHRvU2NpICAxLjIzNDY1MCAgIC0+ICAxLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQyNSAgdG9TY2kgIDEuMjM0NTUxICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2Jzcng0MjYgIHRvU2NpICAxLjIzNDUwICAgIC0+ICAxLjIzNDUgIFJvdW5kZWQKK2Jzcng0MjcgIHRvU2NpICAxLjIzNDU0OSAgIC0+ICAxLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQyOCAgdG9TY2kgIDEuMjM0NTUwICAgLT4gIDEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NDI5ICB0b1NjaSAgMS4yMzQ1NTEgICAtPiAgMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl91cAorYnNyeDQzMSAgdG9TY2kgIDEuMjM0NTAgICAgLT4gIDEuMjM0NSAgUm91bmRlZAorYnNyeDQzMiAgdG9TY2kgIDEuMjM0NTQ5ICAgLT4gIDEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NDMzICB0b1NjaSAgMS4yMzQ1NTAgICAtPiAgMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng0MzQgIHRvU2NpICAxLjIzNDY1MCAgIC0+ICAxLjIzNDcgIFJvdW5kZWQgSW5leGFjdAorYnNyeDQzNSAgdG9TY2kgIDEuMjM0NTUxICAgLT4gIDEuMjM0NiAgUm91bmRlZCBJbmV4YWN0CistLSBuZWdhdGl2ZXMKK3JvdW5kaW5nOiAgY2VpbGluZworYnNyeDUwMSAgdG9TY2kgLTEuMjM0NTAgICAgLT4gLTEuMjM0NSAgUm91bmRlZAorYnNyeDUwMiAgdG9TY2kgLTEuMjM0NTQ5ICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NTAzICB0b1NjaSAtMS4yMzQ1NTAgICAtPiAtMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MDQgIHRvU2NpIC0xLjIzNDU1MSAgIC0+IC0xLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICB1cAorYnNyeDUwNSAgdG9TY2kgLTEuMjM0NTAgICAgLT4gLTEuMjM0NSAgUm91bmRlZAorYnNyeDUwNiAgdG9TY2kgLTEuMjM0NTQ5ICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NTA3ICB0b1NjaSAtMS4yMzQ1NTAgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MDggIHRvU2NpIC0xLjIzNDU1MSAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBmbG9vcgorYnNyeDUxMCAgdG9TY2kgLTEuMjM0NTAgICAgLT4gLTEuMjM0NSAgUm91bmRlZAorYnNyeDUxMSAgdG9TY2kgLTEuMjM0NTQ5ICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NTEyICB0b1NjaSAtMS4yMzQ1NTAgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MTMgIHRvU2NpIC0xLjIzNDU1MSAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2Rvd24KK2Jzcng1MTUgIHRvU2NpIC0xLjIzNDUwICAgIC0+IC0xLjIzNDUgIFJvdW5kZWQKK2Jzcng1MTYgIHRvU2NpIC0xLjIzNDU0OSAgIC0+IC0xLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUxNyAgdG9TY2kgLTEuMjM0NTUwICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Citic3J4NTE4ICB0b1NjaSAtMS4yMzQ2NTAgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MTkgIHRvU2NpIC0xLjIzNDU1MSAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2V2ZW4KK2Jzcng1MjEgIHRvU2NpIC0xLjIzNDUwICAgIC0+IC0xLjIzNDUgIFJvdW5kZWQKK2Jzcng1MjIgIHRvU2NpIC0xLjIzNDU0OSAgIC0+IC0xLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUyMyAgdG9TY2kgLTEuMjM0NTUwICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NTI0ICB0b1NjaSAtMS4yMzQ2NTAgICAtPiAtMS4yMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MjUgIHRvU2NpIC0xLjIzNDU1MSAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBkb3duCitic3J4NTI2ICB0b1NjaSAtMS4yMzQ1MCAgICAtPiAtMS4yMzQ1ICBSb3VuZGVkCitic3J4NTI3ICB0b1NjaSAtMS4yMzQ1NDkgICAtPiAtMS4yMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MjggIHRvU2NpIC0xLjIzNDU1MCAgIC0+IC0xLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUyOSAgdG9TY2kgLTEuMjM0NTUxICAgLT4gLTEuMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfdXAKK2Jzcng1MzEgIHRvU2NpIC0xLjIzNDUwICAgIC0+IC0xLjIzNDUgIFJvdW5kZWQKK2Jzcng1MzIgIHRvU2NpIC0xLjIzNDU0OSAgIC0+IC0xLjIzNDUgIFJvdW5kZWQgSW5leGFjdAorYnNyeDUzMyAgdG9TY2kgLTEuMjM0NTUwICAgLT4gLTEuMjM0NiAgUm91bmRlZCBJbmV4YWN0Citic3J4NTM0ICB0b1NjaSAtMS4yMzQ2NTAgICAtPiAtMS4yMzQ3ICBSb3VuZGVkIEluZXhhY3QKK2Jzcng1MzUgIHRvU2NpIC0xLjIzNDU1MSAgIC0+IC0xLjIzNDYgIFJvdW5kZWQgSW5leGFjdAorCistLSBhIGZldyBsYXJnZXIgZXhwb25lbnRzCittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5FeHBvbmVudDogLTk5OTk5OTk5OQorYmFzeDQ4MCB0b1NjaSAiMC4wOWU5OTkiICAtPiAnOUUrOTk3JworYmFzeDQ4MSB0b1NjaSAiMC45ZTk5OSIgICAtPiAnOUUrOTk4JworYmFzeDQ4MiB0b1NjaSAiOWU5OTkiICAgICAtPiAnOUUrOTk5JworYmFzeDQ4MyB0b1NjaSAiOS45ZTk5OSIgICAtPiAnOS45RSs5OTknCitiYXN4NDg0IHRvU2NpICI5Ljk5ZTk5OSIgIC0+ICc5Ljk5RSs5OTknCitiYXN4NDg1IHRvU2NpICI5Ljk5ZS05OTkiIC0+ICc5Ljk5RS05OTknCitiYXN4NDg2IHRvU2NpICI5LjllLTk5OSIgIC0+ICc5LjlFLTk5OScKK2Jhc3g0ODcgdG9TY2kgIjllLTk5OSIgICAgLT4gJzlFLTk5OScKK2Jhc3g0ODkgdG9TY2kgIjk5ZS05OTkiICAgLT4gJzkuOUUtOTk4JworYmFzeDQ5MCB0b1NjaSAiOTk5ZS05OTkiICAtPiAnOS45OUUtOTk3JworYmFzeDQ5MSB0b1NjaSAnMC45ZS05OTgnICAtPiAnOUUtOTk5JworYmFzeDQ5MiB0b1NjaSAnMC4wOWUtOTk3JyAtPiAnOUUtOTk5JworYmFzeDQ5MyB0b1NjaSAnMC4xZTEwMDAnICAtPiAnMUUrOTk5JworYmFzeDQ5NCB0b1NjaSAnMTBlLTEwMDAnICAtPiAnMS4wRS05OTknCisKK3JvdW5kaW5nOiAgaGFsZl91cAorcHJlY2lzaW9uOiA5CisKKy0tIFRoZSAnYmFkZGllcycgdGVzdHMgZnJvbSBEaWFnQmlnRGVjaW1hbCwgcGx1cyBzb21lIG5ldyBvbmVzCitiYXN4NTAwIHRvU2NpICcxLi4yJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUwMSB0b1NjaSAnLicgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MDIgdG9TY2kgJy4uJyAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTAzIHRvU2NpICcrKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUwNCB0b1NjaSAnLS0xJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MDUgdG9TY2kgJy0rMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTA2IHRvU2NpICcrLTEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUwNyB0b1NjaSAnMTJlJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MDggdG9TY2kgJzEyZSsrJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTA5IHRvU2NpICcxMmY0JyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUxMCB0b1NjaSAnICsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MTEgdG9TY2kgJysgMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTEyIHRvU2NpICcxMiAnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUxMyB0b1NjaSAnICsgMScgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MTQgdG9TY2kgJyAtIDEgJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTE1IHRvU2NpICd4JyAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUxNiB0b1NjaSAnLTEtJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MTcgdG9TY2kgJzEyLScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTE4IHRvU2NpICczKycgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUxOSB0b1NjaSAnJyAgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MjAgdG9TY2kgJzFlLScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTIxIHRvU2NpICc3ZTk5OTk5YScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUyMiB0b1NjaSAnN2UxMjM1Njc4OTB4JyAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MjMgdG9TY2kgJzdlMTIzNTY3ODkwMTJ4JyAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTI0IHRvU2NpICcnICAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUyNSB0b1NjaSAnZTEwMCcgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MjYgdG9TY2kgJ1x1MGU1YScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTI3IHRvU2NpICdcdTBiNjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUyOCB0b1NjaSAnMTIzLDY1JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MjkgdG9TY2kgJzEuMzQuNScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTMwIHRvU2NpICcuMTIzLjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUzMSB0b1NjaSAnMDEuMzUuJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MzIgdG9TY2kgJzAxLjM1LScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTMzIHRvU2NpICcwMDAwLi4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUzNCB0b1NjaSAnLjAwMDAuJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MzUgdG9TY2kgJzAwLi4wMCcgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTM2IHRvU2NpICcxMTFlKjEyMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDUzNyB0b1NjaSAnMTExZTEyMy0nICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1MzggdG9TY2kgJzExMWUrMTIrJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTM5IHRvU2NpICcxMTFlMS0zLScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU0MCB0b1NjaSAnMTExZTEqMjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NDEgdG9TY2kgJzExMWUxZSszJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTQyIHRvU2NpICcxZTEuMCcgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU0MyB0b1NjaSAnMWUxMjNlJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NDQgdG9TY2kgJ3RlbicgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTQ1IHRvU2NpICdPTkUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU0NiB0b1NjaSAnMWUuMScgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NDcgdG9TY2kgJzFlMS4nICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTQ4IHRvU2NpICcxZWUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU0OSB0b1NjaSAnZSsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NTAgdG9TY2kgJzEuMjMuNCcgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTUxIHRvU2NpICcxLjIuMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU1MiB0b1NjaSAnMUUrMS4yJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NTMgdG9TY2kgJzFFKzEuMi4zJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTU0IHRvU2NpICcxRSsrMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU1NSB0b1NjaSAnMUUtLTEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NTYgdG9TY2kgJzFFKy0xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTU3IHRvU2NpICcxRS0rMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU1OCB0b1NjaSAnMUUnJzEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NTkgdG9TY2kgIjFFIiIxIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTYwIHRvU2NpICIxRSIiIiIiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorLS0gTmVhci1zcGVjaWFscworYmFzeDU2MSB0b1NjaSAicU5hTiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NjIgdG9TY2kgIk5hTnEiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTYzIHRvU2NpICJOYU5zIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU2NCB0b1NjaSAiSW5maSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NjUgdG9TY2kgIkluZmluIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTY2IHRvU2NpICJJbmZpbmkiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU2NyB0b1NjaSAiSW5maW5pdCIgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NjggdG9TY2kgIi1JbmZpbml0IiAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTY5IHRvU2NpICIwSW5mIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU3MCB0b1NjaSAiOUluZiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NzEgdG9TY2kgIi0wSW5mIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTcyIHRvU2NpICItOUluZiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU3MyB0b1NjaSAiLXNOYSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NzQgdG9TY2kgInhOYU4iICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTc1IHRvU2NpICIwc05hTiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBzb21lIGJhZGRpZXMgd2l0aCBkb3RzIGFuZCBFcyBhbmQgZG90cyBhbmQgc3BlY2lhbHMKK2Jhc3g1NzYgdG9TY2kgICdlKzEnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU3NyB0b1NjaSAgJy5lKzEnICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTc4IHRvU2NpICAnKy5lKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1NzkgdG9TY2kgICctLmUrJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU4MCB0b1NjaSAgJy0uZScgICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTgxIHRvU2NpICAnRSsxJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1ODIgdG9TY2kgICcuRSsxJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU4MyB0b1NjaSAgJysuRSsxJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTg0IHRvU2NpICAnLS5FKycgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1ODUgdG9TY2kgICctLkUnICAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitiYXN4NTg2IHRvU2NpICAnLk5hTicgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1ODcgdG9TY2kgICctLk5hTicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDU4OCB0b1NjaSAgJysuc05hTicgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NTg5IHRvU2NpICAnKy5JbmYnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g1OTAgdG9TY2kgICcuSW5maW5pdHknICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBaZXJvcworYmFzeDYwMSB0b1NjaSAwLjAwMDAwMDAwMCAgICAgICAtPiAwRS05CitiYXN4NjAyIHRvU2NpIDAuMDAwMDAwMDAgICAgICAgIC0+IDBFLTgKK2Jhc3g2MDMgdG9TY2kgMC4wMDAwMDAwICAgICAgICAgLT4gMEUtNworYmFzeDYwNCB0b1NjaSAwLjAwMDAwMCAgICAgICAgICAtPiAwLjAwMDAwMAorYmFzeDYwNSB0b1NjaSAwLjAwMDAwICAgICAgICAgICAtPiAwLjAwMDAwCitiYXN4NjA2IHRvU2NpIDAuMDAwMCAgICAgICAgICAgIC0+IDAuMDAwMAorYmFzeDYwNyB0b1NjaSAwLjAwMCAgICAgICAgICAgICAtPiAwLjAwMAorYmFzeDYwOCB0b1NjaSAwLjAwICAgICAgICAgICAgICAtPiAwLjAwCitiYXN4NjA5IHRvU2NpIDAuMCAgICAgICAgICAgICAgIC0+IDAuMAorYmFzeDYxMCB0b1NjaSAgLjAgICAgICAgICAgICAgICAtPiAwLjAKK2Jhc3g2MTEgdG9TY2kgMC4gICAgICAgICAgICAgICAgLT4gMAorYmFzeDYxMiB0b1NjaSAtLjAgICAgICAgICAgICAgICAtPiAtMC4wCitiYXN4NjEzIHRvU2NpIC0wLiAgICAgICAgICAgICAgIC0+IC0wCitiYXN4NjE0IHRvU2NpIC0wLjAgICAgICAgICAgICAgIC0+IC0wLjAKK2Jhc3g2MTUgdG9TY2kgLTAuMDAgICAgICAgICAgICAgLT4gLTAuMDAKK2Jhc3g2MTYgdG9TY2kgLTAuMDAwICAgICAgICAgICAgLT4gLTAuMDAwCitiYXN4NjE3IHRvU2NpIC0wLjAwMDAgICAgICAgICAgIC0+IC0wLjAwMDAKK2Jhc3g2MTggdG9TY2kgLTAuMDAwMDAgICAgICAgICAgLT4gLTAuMDAwMDAKK2Jhc3g2MTkgdG9TY2kgLTAuMDAwMDAwICAgICAgICAgLT4gLTAuMDAwMDAwCitiYXN4NjIwIHRvU2NpIC0wLjAwMDAwMDAgICAgICAgIC0+IC0wRS03CitiYXN4NjIxIHRvU2NpIC0wLjAwMDAwMDAwICAgICAgIC0+IC0wRS04CitiYXN4NjIyIHRvU2NpIC0wLjAwMDAwMDAwMCAgICAgIC0+IC0wRS05CisKK2Jhc3g2MzAgdG9TY2kgIDAuMDBFKzAgICAgICAgICAgLT4gMC4wMAorYmFzeDYzMSB0b1NjaSAgMC4wMEUrMSAgICAgICAgICAtPiAwLjAKK2Jhc3g2MzIgdG9TY2kgIDAuMDBFKzIgICAgICAgICAgLT4gMAorYmFzeDYzMyB0b1NjaSAgMC4wMEUrMyAgICAgICAgICAtPiAwRSsxCitiYXN4NjM0IHRvU2NpICAwLjAwRSs0ICAgICAgICAgIC0+IDBFKzIKK2Jhc3g2MzUgdG9TY2kgIDAuMDBFKzUgICAgICAgICAgLT4gMEUrMworYmFzeDYzNiB0b1NjaSAgMC4wMEUrNiAgICAgICAgICAtPiAwRSs0CitiYXN4NjM3IHRvU2NpICAwLjAwRSs3ICAgICAgICAgIC0+IDBFKzUKK2Jhc3g2MzggdG9TY2kgIDAuMDBFKzggICAgICAgICAgLT4gMEUrNgorYmFzeDYzOSB0b1NjaSAgMC4wMEUrOSAgICAgICAgICAtPiAwRSs3CisKK2Jhc3g2NDAgdG9TY2kgIDAuMEUrMCAgICAgICAgICAgLT4gMC4wCitiYXN4NjQxIHRvU2NpICAwLjBFKzEgICAgICAgICAgIC0+IDAKK2Jhc3g2NDIgdG9TY2kgIDAuMEUrMiAgICAgICAgICAgLT4gMEUrMQorYmFzeDY0MyB0b1NjaSAgMC4wRSszICAgICAgICAgICAtPiAwRSsyCitiYXN4NjQ0IHRvU2NpICAwLjBFKzQgICAgICAgICAgIC0+IDBFKzMKK2Jhc3g2NDUgdG9TY2kgIDAuMEUrNSAgICAgICAgICAgLT4gMEUrNAorYmFzeDY0NiB0b1NjaSAgMC4wRSs2ICAgICAgICAgICAtPiAwRSs1CitiYXN4NjQ3IHRvU2NpICAwLjBFKzcgICAgICAgICAgIC0+IDBFKzYKK2Jhc3g2NDggdG9TY2kgIDAuMEUrOCAgICAgICAgICAgLT4gMEUrNworYmFzeDY0OSB0b1NjaSAgMC4wRSs5ICAgICAgICAgICAtPiAwRSs4CisKK2Jhc3g2NTAgdG9TY2kgIDBFKzAgICAgICAgICAgICAgLT4gMAorYmFzeDY1MSB0b1NjaSAgMEUrMSAgICAgICAgICAgICAtPiAwRSsxCitiYXN4NjUyIHRvU2NpICAwRSsyICAgICAgICAgICAgIC0+IDBFKzIKK2Jhc3g2NTMgdG9TY2kgIDBFKzMgICAgICAgICAgICAgLT4gMEUrMworYmFzeDY1NCB0b1NjaSAgMEUrNCAgICAgICAgICAgICAtPiAwRSs0CitiYXN4NjU1IHRvU2NpICAwRSs1ICAgICAgICAgICAgIC0+IDBFKzUKK2Jhc3g2NTYgdG9TY2kgIDBFKzYgICAgICAgICAgICAgLT4gMEUrNgorYmFzeDY1NyB0b1NjaSAgMEUrNyAgICAgICAgICAgICAtPiAwRSs3CitiYXN4NjU4IHRvU2NpICAwRSs4ICAgICAgICAgICAgIC0+IDBFKzgKK2Jhc3g2NTkgdG9TY2kgIDBFKzkgICAgICAgICAgICAgLT4gMEUrOQorCitiYXN4NjYwIHRvU2NpICAwLjBFLTAgICAgICAgICAgIC0+IDAuMAorYmFzeDY2MSB0b1NjaSAgMC4wRS0xICAgICAgICAgICAtPiAwLjAwCitiYXN4NjYyIHRvU2NpICAwLjBFLTIgICAgICAgICAgIC0+IDAuMDAwCitiYXN4NjYzIHRvU2NpICAwLjBFLTMgICAgICAgICAgIC0+IDAuMDAwMAorYmFzeDY2NCB0b1NjaSAgMC4wRS00ICAgICAgICAgICAtPiAwLjAwMDAwCitiYXN4NjY1IHRvU2NpICAwLjBFLTUgICAgICAgICAgIC0+IDAuMDAwMDAwCitiYXN4NjY2IHRvU2NpICAwLjBFLTYgICAgICAgICAgIC0+IDBFLTcKK2Jhc3g2NjcgdG9TY2kgIDAuMEUtNyAgICAgICAgICAgLT4gMEUtOAorYmFzeDY2OCB0b1NjaSAgMC4wRS04ICAgICAgICAgICAtPiAwRS05CitiYXN4NjY5IHRvU2NpICAwLjBFLTkgICAgICAgICAgIC0+IDBFLTEwCisKK2Jhc3g2NzAgdG9TY2kgIDAuMDBFLTAgICAgICAgICAgLT4gMC4wMAorYmFzeDY3MSB0b1NjaSAgMC4wMEUtMSAgICAgICAgICAtPiAwLjAwMAorYmFzeDY3MiB0b1NjaSAgMC4wMEUtMiAgICAgICAgICAtPiAwLjAwMDAKK2Jhc3g2NzMgdG9TY2kgIDAuMDBFLTMgICAgICAgICAgLT4gMC4wMDAwMAorYmFzeDY3NCB0b1NjaSAgMC4wMEUtNCAgICAgICAgICAtPiAwLjAwMDAwMAorYmFzeDY3NSB0b1NjaSAgMC4wMEUtNSAgICAgICAgICAtPiAwRS03CitiYXN4Njc2IHRvU2NpICAwLjAwRS02ICAgICAgICAgIC0+IDBFLTgKK2Jhc3g2NzcgdG9TY2kgIDAuMDBFLTcgICAgICAgICAgLT4gMEUtOQorYmFzeDY3OCB0b1NjaSAgMC4wMEUtOCAgICAgICAgICAtPiAwRS0xMAorYmFzeDY3OSB0b1NjaSAgMC4wMEUtOSAgICAgICAgICAtPiAwRS0xMQorCitiYXN4NjgwIHRvU2NpICAwMDAwMDAuICAgICAgICAgIC0+ICAwCitiYXN4NjgxIHRvU2NpICAgMDAwMDAuICAgICAgICAgIC0+ICAwCitiYXN4NjgyIHRvU2NpICAgIDAwMDAuICAgICAgICAgIC0+ICAwCitiYXN4NjgzIHRvU2NpICAgICAwMDAuICAgICAgICAgIC0+ICAwCitiYXN4Njg0IHRvU2NpICAgICAgMDAuICAgICAgICAgIC0+ICAwCitiYXN4Njg1IHRvU2NpICAgICAgIDAuICAgICAgICAgIC0+ICAwCitiYXN4Njg2IHRvU2NpICArMDAwMDAuICAgICAgICAgIC0+ICAwCitiYXN4Njg3IHRvU2NpICAtMDAwMDAuICAgICAgICAgIC0+IC0wCitiYXN4Njg4IHRvU2NpICArMC4gICAgICAgICAgICAgIC0+ICAwCitiYXN4Njg5IHRvU2NpICAtMC4gICAgICAgICAgICAgIC0+IC0wCisKKy0tIFNwZWNpYWxzCitwcmVjaXNpb246IDQKK2Jhc3g3MDAgdG9TY2kgIk5hTiIgICAgICAgICAgICAgLT4gTmFOCitiYXN4NzAxIHRvU2NpICJuYW4iICAgICAgICAgICAgIC0+IE5hTgorYmFzeDcwMiB0b1NjaSAibkFuIiAgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3MDMgdG9TY2kgIk5BTiIgICAgICAgICAgICAgLT4gTmFOCitiYXN4NzA0IHRvU2NpICIrTmFOIiAgICAgICAgICAgIC0+IE5hTgorYmFzeDcwNSB0b1NjaSAiK25hbiIgICAgICAgICAgICAtPiBOYU4KK2Jhc3g3MDYgdG9TY2kgIituQW4iICAgICAgICAgICAgLT4gTmFOCitiYXN4NzA3IHRvU2NpICIrTkFOIiAgICAgICAgICAgIC0+IE5hTgorYmFzeDcwOCB0b1NjaSAiLU5hTiIgICAgICAgICAgICAtPiAtTmFOCitiYXN4NzA5IHRvU2NpICItbmFuIiAgICAgICAgICAgIC0+IC1OYU4KK2Jhc3g3MTAgdG9TY2kgIi1uQW4iICAgICAgICAgICAgLT4gLU5hTgorYmFzeDcxMSB0b1NjaSAiLU5BTiIgICAgICAgICAgICAtPiAtTmFOCitiYXN4NzEyIHRvU2NpICdOYU4wJyAgICAgICAgICAgIC0+IE5hTgorYmFzeDcxMyB0b1NjaSAnTmFOMScgICAgICAgICAgICAtPiBOYU4xCitiYXN4NzE0IHRvU2NpICdOYU4xMicgICAgICAgICAgIC0+IE5hTjEyCitiYXN4NzE1IHRvU2NpICdOYU4xMjMnICAgICAgICAgIC0+IE5hTjEyMworYmFzeDcxNiB0b1NjaSAnTmFOMTIzNCcgICAgICAgICAtPiBOYU4xMjM0CitiYXN4NzE3IHRvU2NpICdOYU4wMScgICAgICAgICAgIC0+IE5hTjEKK2Jhc3g3MTggdG9TY2kgJ05hTjAxMicgICAgICAgICAgLT4gTmFOMTIKK2Jhc3g3MTkgdG9TY2kgJ05hTjAxMjMnICAgICAgICAgLT4gTmFOMTIzCitiYXN4NzIwIHRvU2NpICdOYU4wMTIzNCcgICAgICAgIC0+IE5hTjEyMzQKK2Jhc3g3MjEgdG9TY2kgJ05hTjAwMScgICAgICAgICAgLT4gTmFOMQorYmFzeDcyMiB0b1NjaSAnTmFOMDAxMicgICAgICAgICAtPiBOYU4xMgorYmFzeDcyMyB0b1NjaSAnTmFOMDAxMjMnICAgICAgICAtPiBOYU4xMjMKK2Jhc3g3MjQgdG9TY2kgJ05hTjAwMTIzNCcgICAgICAgLT4gTmFOMTIzNAorYmFzeDcyNSB0b1NjaSAnTmFOMTIzNDUnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g3MjYgdG9TY2kgJ05hTjEyM2UrMScgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NzI3IHRvU2NpICdOYU4xMi40NScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDcyOCB0b1NjaSAnTmFOLTEyJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2Jhc3g3MjkgdG9TY2kgJ05hTisxMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2Jhc3g3MzAgdG9TY2kgInNOYU4iICAgICAgICAgICAgLT4gc05hTgorYmFzeDczMSB0b1NjaSAic25hbiIgICAgICAgICAgICAtPiBzTmFOCitiYXN4NzMyIHRvU2NpICJTbkFuIiAgICAgICAgICAgIC0+IHNOYU4KK2Jhc3g3MzMgdG9TY2kgIlNOQU4iICAgICAgICAgICAgLT4gc05hTgorYmFzeDczNCB0b1NjaSAiK3NOYU4iICAgICAgICAgICAtPiBzTmFOCitiYXN4NzM1IHRvU2NpICIrc25hbiIgICAgICAgICAgIC0+IHNOYU4KK2Jhc3g3MzYgdG9TY2kgIitTbkFuIiAgICAgICAgICAgLT4gc05hTgorYmFzeDczNyB0b1NjaSAiK1NOQU4iICAgICAgICAgICAtPiBzTmFOCitiYXN4NzM4IHRvU2NpICItc05hTiIgICAgICAgICAgIC0+IC1zTmFOCitiYXN4NzM5IHRvU2NpICItc25hbiIgICAgICAgICAgIC0+IC1zTmFOCitiYXN4NzQwIHRvU2NpICItU25BbiIgICAgICAgICAgIC0+IC1zTmFOCitiYXN4NzQxIHRvU2NpICItU05BTiIgICAgICAgICAgIC0+IC1zTmFOCitiYXN4NzQyIHRvU2NpICdzTmFOMDAwMCcgICAgICAgIC0+IHNOYU4KK2Jhc3g3NDMgdG9TY2kgJ3NOYU43JyAgICAgICAgICAgLT4gc05hTjcKK2Jhc3g3NDQgdG9TY2kgJ3NOYU4wMDcyMzQnICAgICAgLT4gc05hTjcyMzQKK2Jhc3g3NDUgdG9TY2kgJ3NOYU43MjM0NScgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitiYXN4NzQ2IHRvU2NpICdzTmFONzIuNDUnICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorYmFzeDc0NyB0b1NjaSAnc05hTi03MicgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworYmFzeDc0OCB0b1NjaSAiSW5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc0OSB0b1NjaSAiaW5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc1MCB0b1NjaSAiaU5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc1MSB0b1NjaSAiSU5GIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc1MiB0b1NjaSAiK0luZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc1MyB0b1NjaSAiK2luZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc1NCB0b1NjaSAiK2lOZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc1NSB0b1NjaSAiK0lORiIgICAgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc1NiB0b1NjaSAiLUluZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2Jhc3g3NTcgdG9TY2kgIi1pbmYiICAgICAgICAgICAgLT4gLUluZmluaXR5CitiYXN4NzU4IHRvU2NpICItaU5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorYmFzeDc1OSB0b1NjaSAiLUlORiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKKworYmFzeDc2MCB0b1NjaSAiSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2MSB0b1NjaSAiaW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2MiB0b1NjaSAiaU5mSW5JdFkiICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2MyB0b1NjaSAiSU5GSU5JVFkiICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2NCB0b1NjaSAiK0luZmluaXR5IiAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2NSB0b1NjaSAiK2luZmluaXR5IiAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2NiB0b1NjaSAiK2lOZkluSXRZIiAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2NyB0b1NjaSAiK0lORklOSVRZIiAgICAgICAtPiBJbmZpbml0eQorYmFzeDc2OCB0b1NjaSAiLUluZmluaXR5IiAgICAgICAtPiAtSW5maW5pdHkKK2Jhc3g3NjkgdG9TY2kgIi1pbmZpbml0eSIgICAgICAgLT4gLUluZmluaXR5CitiYXN4NzcwIHRvU2NpICItaU5mSW5JdFkiICAgICAgIC0+IC1JbmZpbml0eQorYmFzeDc3MSB0b1NjaSAiLUlORklOSVRZIiAgICAgICAtPiAtSW5maW5pdHkKKworLS0gU3BlY2lhbHMgYW5kIHplcm9zIGZvciB0b0VuZworYmFzeDc3MiB0b0VuZyAiTmFOIiAgICAgICAgICAgICAgLT4gTmFOCitiYXN4NzczIHRvRW5nICItSW5maW5pdHkiICAgICAgICAtPiAtSW5maW5pdHkKK2Jhc3g3NzQgdG9FbmcgIi1zTmFOIiAgICAgICAgICAgIC0+IC1zTmFOCitiYXN4Nzc1IHRvRW5nICItTmFOIiAgICAgICAgICAgICAtPiAtTmFOCitiYXN4Nzc2IHRvRW5nICIrSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc3OCB0b0VuZyAiK3NOYU4iICAgICAgICAgICAgLT4gc05hTgorYmFzeDc3OSB0b0VuZyAiK05hTiIgICAgICAgICAgICAgLT4gTmFOCitiYXN4NzgwIHRvRW5nICJJTkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc4MSB0b0VuZyAiU05BTiIgICAgICAgICAgICAgLT4gc05hTgorYmFzeDc4MiB0b0VuZyAiTkFOIiAgICAgICAgICAgICAgLT4gTmFOCitiYXN4NzgzIHRvRW5nICJpbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc4NCB0b0VuZyAic25hbiIgICAgICAgICAgICAgLT4gc05hTgorYmFzeDc4NSB0b0VuZyAibmFuIiAgICAgICAgICAgICAgLT4gTmFOCitiYXN4Nzg2IHRvRW5nICJJbkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc4NyB0b0VuZyAiU25BTiIgICAgICAgICAgICAgLT4gc05hTgorYmFzeDc4OCB0b0VuZyAibkFOIiAgICAgICAgICAgICAgLT4gTmFOCitiYXN4Nzg5IHRvRW5nICJpTmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc5MCB0b0VuZyAic05hbiIgICAgICAgICAgICAgLT4gc05hTgorYmFzeDc5MSB0b0VuZyAiTmFuIiAgICAgICAgICAgICAgLT4gTmFOCitiYXN4NzkyIHRvRW5nICJJbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorYmFzeDc5MyB0b0VuZyAic05hTiIgICAgICAgICAgICAgLT4gc05hTgorCistLSBaZXJvIHRvRW5nLCBldGMuCitiYXN4ODAwIHRvRW5nIDBlKzEgICAgICAgICAgICAgIC0+ICIwLjAwRSszIiAgLS0gZG9jIGV4YW1wbGUKKworYmFzeDgwMSB0b0VuZyAwLjAwMDAwMDAwMCAgICAgICAtPiAwRS05CitiYXN4ODAyIHRvRW5nIDAuMDAwMDAwMDAgICAgICAgIC0+IDAuMDBFLTYKK2Jhc3g4MDMgdG9FbmcgMC4wMDAwMDAwICAgICAgICAgLT4gMC4wRS02CitiYXN4ODA0IHRvRW5nIDAuMDAwMDAwICAgICAgICAgIC0+IDAuMDAwMDAwCitiYXN4ODA1IHRvRW5nIDAuMDAwMDAgICAgICAgICAgIC0+IDAuMDAwMDAKK2Jhc3g4MDYgdG9FbmcgMC4wMDAwICAgICAgICAgICAgLT4gMC4wMDAwCitiYXN4ODA3IHRvRW5nIDAuMDAwICAgICAgICAgICAgIC0+IDAuMDAwCitiYXN4ODA4IHRvRW5nIDAuMDAgICAgICAgICAgICAgIC0+IDAuMDAKK2Jhc3g4MDkgdG9FbmcgMC4wICAgICAgICAgICAgICAgLT4gMC4wCitiYXN4ODEwIHRvRW5nICAuMCAgICAgICAgICAgICAgIC0+IDAuMAorYmFzeDgxMSB0b0VuZyAwLiAgICAgICAgICAgICAgICAtPiAwCitiYXN4ODEyIHRvRW5nIC0uMCAgICAgICAgICAgICAgIC0+IC0wLjAKK2Jhc3g4MTMgdG9FbmcgLTAuICAgICAgICAgICAgICAgLT4gLTAKK2Jhc3g4MTQgdG9FbmcgLTAuMCAgICAgICAgICAgICAgLT4gLTAuMAorYmFzeDgxNSB0b0VuZyAtMC4wMCAgICAgICAgICAgICAtPiAtMC4wMAorYmFzeDgxNiB0b0VuZyAtMC4wMDAgICAgICAgICAgICAtPiAtMC4wMDAKK2Jhc3g4MTcgdG9FbmcgLTAuMDAwMCAgICAgICAgICAgLT4gLTAuMDAwMAorYmFzeDgxOCB0b0VuZyAtMC4wMDAwMCAgICAgICAgICAtPiAtMC4wMDAwMAorYmFzeDgxOSB0b0VuZyAtMC4wMDAwMDAgICAgICAgICAtPiAtMC4wMDAwMDAKK2Jhc3g4MjAgdG9FbmcgLTAuMDAwMDAwMCAgICAgICAgLT4gLTAuMEUtNgorYmFzeDgyMSB0b0VuZyAtMC4wMDAwMDAwMCAgICAgICAtPiAtMC4wMEUtNgorYmFzeDgyMiB0b0VuZyAtMC4wMDAwMDAwMDAgICAgICAtPiAtMEUtOQorCitiYXN4ODMwIHRvRW5nICAwLjAwRSswICAgICAgICAgIC0+IDAuMDAKK2Jhc3g4MzEgdG9FbmcgIDAuMDBFKzEgICAgICAgICAgLT4gMC4wCitiYXN4ODMyIHRvRW5nICAwLjAwRSsyICAgICAgICAgIC0+IDAKK2Jhc3g4MzMgdG9FbmcgIDAuMDBFKzMgICAgICAgICAgLT4gMC4wMEUrMworYmFzeDgzNCB0b0VuZyAgMC4wMEUrNCAgICAgICAgICAtPiAwLjBFKzMKK2Jhc3g4MzUgdG9FbmcgIDAuMDBFKzUgICAgICAgICAgLT4gMEUrMworYmFzeDgzNiB0b0VuZyAgMC4wMEUrNiAgICAgICAgICAtPiAwLjAwRSs2CitiYXN4ODM3IHRvRW5nICAwLjAwRSs3ICAgICAgICAgIC0+IDAuMEUrNgorYmFzeDgzOCB0b0VuZyAgMC4wMEUrOCAgICAgICAgICAtPiAwRSs2CitiYXN4ODM5IHRvRW5nICAwLjAwRSs5ICAgICAgICAgIC0+IDAuMDBFKzkKKworYmFzeDg0MCB0b0VuZyAgMC4wRSswICAgICAgICAgICAtPiAwLjAKK2Jhc3g4NDEgdG9FbmcgIDAuMEUrMSAgICAgICAgICAgLT4gMAorYmFzeDg0MiB0b0VuZyAgMC4wRSsyICAgICAgICAgICAtPiAwLjAwRSszCitiYXN4ODQzIHRvRW5nICAwLjBFKzMgICAgICAgICAgIC0+IDAuMEUrMworYmFzeDg0NCB0b0VuZyAgMC4wRSs0ICAgICAgICAgICAtPiAwRSszCitiYXN4ODQ1IHRvRW5nICAwLjBFKzUgICAgICAgICAgIC0+IDAuMDBFKzYKK2Jhc3g4NDYgdG9FbmcgIDAuMEUrNiAgICAgICAgICAgLT4gMC4wRSs2CitiYXN4ODQ3IHRvRW5nICAwLjBFKzcgICAgICAgICAgIC0+IDBFKzYKK2Jhc3g4NDggdG9FbmcgIDAuMEUrOCAgICAgICAgICAgLT4gMC4wMEUrOQorYmFzeDg0OSB0b0VuZyAgMC4wRSs5ICAgICAgICAgICAtPiAwLjBFKzkKKworYmFzeDg1MCB0b0VuZyAgMEUrMCAgICAgICAgICAgICAtPiAwCitiYXN4ODUxIHRvRW5nICAwRSsxICAgICAgICAgICAgIC0+IDAuMDBFKzMKK2Jhc3g4NTIgdG9FbmcgIDBFKzIgICAgICAgICAgICAgLT4gMC4wRSszCitiYXN4ODUzIHRvRW5nICAwRSszICAgICAgICAgICAgIC0+IDBFKzMKK2Jhc3g4NTQgdG9FbmcgIDBFKzQgICAgICAgICAgICAgLT4gMC4wMEUrNgorYmFzeDg1NSB0b0VuZyAgMEUrNSAgICAgICAgICAgICAtPiAwLjBFKzYKK2Jhc3g4NTYgdG9FbmcgIDBFKzYgICAgICAgICAgICAgLT4gMEUrNgorYmFzeDg1NyB0b0VuZyAgMEUrNyAgICAgICAgICAgICAtPiAwLjAwRSs5CitiYXN4ODU4IHRvRW5nICAwRSs4ICAgICAgICAgICAgIC0+IDAuMEUrOQorYmFzeDg1OSB0b0VuZyAgMEUrOSAgICAgICAgICAgICAtPiAwRSs5CisKK2Jhc3g4NjAgdG9FbmcgIDAuMEUtMCAgICAgICAgICAgLT4gMC4wCitiYXN4ODYxIHRvRW5nICAwLjBFLTEgICAgICAgICAgIC0+IDAuMDAKK2Jhc3g4NjIgdG9FbmcgIDAuMEUtMiAgICAgICAgICAgLT4gMC4wMDAKK2Jhc3g4NjMgdG9FbmcgIDAuMEUtMyAgICAgICAgICAgLT4gMC4wMDAwCitiYXN4ODY0IHRvRW5nICAwLjBFLTQgICAgICAgICAgIC0+IDAuMDAwMDAKK2Jhc3g4NjUgdG9FbmcgIDAuMEUtNSAgICAgICAgICAgLT4gMC4wMDAwMDAKK2Jhc3g4NjYgdG9FbmcgIDAuMEUtNiAgICAgICAgICAgLT4gMC4wRS02CitiYXN4ODY3IHRvRW5nICAwLjBFLTcgICAgICAgICAgIC0+IDAuMDBFLTYKK2Jhc3g4NjggdG9FbmcgIDAuMEUtOCAgICAgICAgICAgLT4gMEUtOQorYmFzeDg2OSB0b0VuZyAgMC4wRS05ICAgICAgICAgICAtPiAwLjBFLTkKKworYmFzeDg3MCB0b0VuZyAgMC4wMEUtMCAgICAgICAgICAtPiAwLjAwCitiYXN4ODcxIHRvRW5nICAwLjAwRS0xICAgICAgICAgIC0+IDAuMDAwCitiYXN4ODcyIHRvRW5nICAwLjAwRS0yICAgICAgICAgIC0+IDAuMDAwMAorYmFzeDg3MyB0b0VuZyAgMC4wMEUtMyAgICAgICAgICAtPiAwLjAwMDAwCitiYXN4ODc0IHRvRW5nICAwLjAwRS00ICAgICAgICAgIC0+IDAuMDAwMDAwCitiYXN4ODc1IHRvRW5nICAwLjAwRS01ICAgICAgICAgIC0+IDAuMEUtNgorYmFzeDg3NiB0b0VuZyAgMC4wMEUtNiAgICAgICAgICAtPiAwLjAwRS02CitiYXN4ODc3IHRvRW5nICAwLjAwRS03ICAgICAgICAgIC0+IDBFLTkKK2Jhc3g4NzggdG9FbmcgIDAuMDBFLTggICAgICAgICAgLT4gMC4wRS05CitiYXN4ODc5IHRvRW5nICAwLjAwRS05ICAgICAgICAgIC0+IDAuMDBFLTkKKworCityb3VuZGluZzogIGhhbGZfdXAKK3ByZWNpc2lvbjogOQorLS0gc3Vibm9ybWFscyBhbmQgb3ZlcmZsb3dzCitiYXN4OTA2IHRvU2NpICc5OWU5OTk5OTk5OTknICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3g5MDcgdG9TY2kgJzk5OWU5OTk5OTk5OTknICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkwOCB0b1NjaSAnMC45ZS05OTk5OTk5OTknICAgICAtPiA5RS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorYmFzeDkwOSB0b1NjaSAnMC4wOWUtOTk5OTk5OTk5JyAgICAtPiA5RS0xMDAwMDAwMDAxIFN1Ym5vcm1hbAorYmFzeDkxMCB0b1NjaSAnMC4xZTEwMDAwMDAwMDAnICAgICAtPiAxRSs5OTk5OTk5OTkKK2Jhc3g5MTEgdG9TY2kgJzEwZS0xMDAwMDAwMDAwJyAgICAgLT4gMS4wRS05OTk5OTk5OTkKK2Jhc3g5MTIgdG9TY2kgJzAuOWU5OTk5OTk5OTk5JyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkxMyB0b1NjaSAnOTllLTk5OTk5OTk5OTknICAgICAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3g5MTQgdG9TY2kgJzExMWU5OTk5OTk5OTk5JyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkxNSB0b1NjaSAnMTExMWUtOTk5OTk5OTk5OScgICAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3g5MTYgdG9TY2kgJzExMTFlLTk5OTk5OTk5OTk5JyAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitiYXN4OTE3IHRvU2NpICc3ZTEwMDAwMDAwMDAnICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5lZ2F0aXZlcyB0aGUgc2FtZQorYmFzeDkxOCB0b1NjaSAnLTk5ZTk5OTk5OTk5OScgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkxOSB0b1NjaSAnLTk5OWU5OTk5OTk5OTknICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkyMCB0b1NjaSAnLTAuOWUtOTk5OTk5OTk5JyAgICAtPiAtOUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK2Jhc3g5MjEgdG9TY2kgJy0wLjA5ZS05OTk5OTk5OTknICAgLT4gLTlFLTEwMDAwMDAwMDEgU3Vibm9ybWFsCitiYXN4OTIyIHRvU2NpICctMC4xZTEwMDAwMDAwMDAnICAgIC0+IC0xRSs5OTk5OTk5OTkKK2Jhc3g5MjMgdG9TY2kgJy0xMGUtMTAwMDAwMDAwMCcgICAgLT4gLTEuMEUtOTk5OTk5OTk5CitiYXN4OTI0IHRvU2NpICctMC45ZTk5OTk5OTk5OTknICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTI1IHRvU2NpICctOTllLTk5OTk5OTk5OTknICAgIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3g5MjYgdG9TY2kgJy0xMTFlOTk5OTk5OTk5OScgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3g5MjcgdG9TY2kgJy0xMTExZS05OTk5OTk5OTk5JyAgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorYmFzeDkyOCB0b1NjaSAnLTExMTFlLTk5OTk5OTk5OTk5JyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitiYXN4OTI5IHRvU2NpICctN2UxMDAwMDAwMDAwJyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgY2VpbGluZworYmFzeDkzMCB0b1NjaSAgJzdlMTAwMDAwMDAwMCcgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkzMSB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgdXAKK2Jhc3g5MzIgdG9TY2kgICc3ZTEwMDAwMDAwMDAnICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3g5MzMgdG9TY2kgJy03ZTEwMDAwMDAwMDAnICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgZG93bgorYmFzeDkzNCB0b1NjaSAgJzdlMTAwMDAwMDAwMCcgICAgICAtPiAgOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3g5MzUgdG9TY2kgJy03ZTEwMDAwMDAwMDAnICAgICAgLT4gLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGZsb29yCitiYXN4OTM2IHRvU2NpICAnN2UxMDAwMDAwMDAwJyAgICAgIC0+ICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDkzNyB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogIGhhbGZfdXAKK2Jhc3g5MzggdG9TY2kgICc3ZTEwMDAwMDAwMDAnICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2Jhc3g5MzkgdG9TY2kgJy03ZTEwMDAwMDAwMDAnICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitiYXN4OTQwIHRvU2NpICAnN2UxMDAwMDAwMDAwJyAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitiYXN4OTQxIHRvU2NpICctN2UxMDAwMDAwMDAwJyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGhhbGZfZG93bgorYmFzeDk0MiB0b1NjaSAgJzdlMTAwMDAwMDAwMCcgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorYmFzeDk0MyB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogIGhhbGZfZXZlbgorCisKKy0tIEdpZ2EgZXhwb25lbnQgaW5pdGlhbCB0ZXN0cworbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluRXhwb25lbnQ6IC05OTk5OTk5OTkKKworYmFzeDk1MSB0b1NjaSAnOTllOTk5JyAgICAgICAgICAtPiAnOS45RSsxMDAwJworYmFzeDk1MiB0b1NjaSAnOTk5ZTk5OScgICAgICAgICAtPiAnOS45OUUrMTAwMScKK2Jhc3g5NTMgdG9TY2kgJzAuOWUtOTk5JyAgICAgICAgLT4gJzlFLTEwMDAnCitiYXN4OTU0IHRvU2NpICcwLjA5ZS05OTknICAgICAgIC0+ICc5RS0xMDAxJworYmFzeDk1NSB0b1NjaSAnMC4xZTEwMDEnICAgICAgICAtPiAnMUUrMTAwMCcKK2Jhc3g5NTYgdG9TY2kgJzEwZS0xMDAxJyAgICAgICAgLT4gJzEuMEUtMTAwMCcKK2Jhc3g5NTcgdG9TY2kgJzAuOWU5OTk5JyAgICAgICAgLT4gJzlFKzk5OTgnCitiYXN4OTU4IHRvU2NpICc5OWUtOTk5OScgICAgICAgIC0+ICc5LjlFLTk5OTgnCitiYXN4OTU5IHRvU2NpICcxMTFlOTk5NycgICAgICAgIC0+ICcxLjExRSs5OTk5JworYmFzeDk2MCB0b1NjaSAnMTExMWUtOTk5OScgICAgICAtPiAnMS4xMTFFLTk5OTYnCitiYXN4OTYxIHRvU2NpICc5OWU5OTk5JyAgICAgICAgIC0+ICc5LjlFKzEwMDAwJworYmFzeDk2MiB0b1NjaSAnOTk5ZTk5OTknICAgICAgICAtPiAnOS45OUUrMTAwMDEnCitiYXN4OTYzIHRvU2NpICcwLjllLTk5OTknICAgICAgIC0+ICc5RS0xMDAwMCcKK2Jhc3g5NjQgdG9TY2kgJzAuMDllLTk5OTknICAgICAgLT4gJzlFLTEwMDAxJworYmFzeDk2NSB0b1NjaSAnMC4xZTEwMDAxJyAgICAgICAtPiAnMUUrMTAwMDAnCitiYXN4OTY2IHRvU2NpICcxMGUtMTAwMDEnICAgICAgIC0+ICcxLjBFLTEwMDAwJworYmFzeDk2NyB0b1NjaSAnMC45ZTk5OTk5JyAgICAgICAtPiAnOUUrOTk5OTgnCitiYXN4OTY4IHRvU2NpICc5OWUtOTk5OTknICAgICAgIC0+ICc5LjlFLTk5OTk4JworYmFzeDk2OSB0b1NjaSAnMTExZTk5OTk5JyAgICAgICAtPiAnMS4xMUUrMTAwMDAxJworYmFzeDk3MCB0b1NjaSAnMTExMWUtOTk5OTknICAgICAtPiAnMS4xMTFFLTk5OTk2JworYmFzeDk3MSB0b1NjaSAiMC4wOWU5OTk5OTk5OTkiICAtPiAnOUUrOTk5OTk5OTk3JworYmFzeDk3MiB0b1NjaSAiMC45ZTk5OTk5OTk5OSIgICAtPiAnOUUrOTk5OTk5OTk4JworYmFzeDk3MyB0b1NjaSAiOWU5OTk5OTk5OTkiICAgICAtPiAnOUUrOTk5OTk5OTk5JworYmFzeDk3NCB0b1NjaSAiOS45ZTk5OTk5OTk5OSIgICAtPiAnOS45RSs5OTk5OTk5OTknCitiYXN4OTc1IHRvU2NpICI5Ljk5ZTk5OTk5OTk5OSIgIC0+ICc5Ljk5RSs5OTk5OTk5OTknCitiYXN4OTc2IHRvU2NpICI5Ljk5ZS05OTk5OTk5OTkiIC0+ICc5Ljk5RS05OTk5OTk5OTknCitiYXN4OTc3IHRvU2NpICI5LjllLTk5OTk5OTk5OSIgIC0+ICc5LjlFLTk5OTk5OTk5OScKK2Jhc3g5NzggdG9TY2kgIjllLTk5OTk5OTk5OSIgICAgLT4gJzlFLTk5OTk5OTk5OScKK2Jhc3g5NzkgdG9TY2kgIjk5ZS05OTk5OTk5OTkiICAgLT4gJzkuOUUtOTk5OTk5OTk4JworYmFzeDk4MCB0b1NjaSAiOTk5ZS05OTk5OTk5OTkiICAtPiAnOS45OUUtOTk5OTk5OTk3JworCistLSBWYXJ5aW5nIGV4cG9uZW50IG1heGltdW1zCitwcmVjaXNpb246IDUKK21heGV4cG9uZW50OiAwCittaW5leHBvbmVudDogMAorZW1heDAwMSB0b1NjaSAtMUUrMiAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDAwMiB0b1NjaSAtMTAwICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDAwMyB0b1NjaSAgLTEwICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDAwNCB0b1NjaSAgIC05LjkgLT4gLTkuOQorZW1heDAwNSB0b1NjaSAgIC05ICAgLT4gLTkKK2VtYXgwMDYgdG9TY2kgICAtMSAgIC0+IC0xCitlbWF4MDA3IHRvU2NpICAgIDAgICAtPiAgMAorZW1heDAwOCB0b1NjaSAgICAxICAgLT4gIDEKK2VtYXgwMDkgdG9TY2kgICAgOSAgIC0+ICA5CitlbWF4MDEwIHRvU2NpICAgIDkuOSAtPiAgOS45CitlbWF4MDExIHRvU2NpICAgMTAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MDEyIHRvU2NpICAxMDAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MDEzIHRvU2NpICAxRSsyICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MDE0IHRvU2NpICAgMC45OSAtPiAgMC45OSBTdWJub3JtYWwKK2VtYXgwMTUgdG9TY2kgICAwLjEgIC0+ICAwLjEgU3Vibm9ybWFsCitlbWF4MDE2IHRvU2NpICAgMC4wMSAtPiAgMC4wMSBTdWJub3JtYWwKK2VtYXgwMTcgdG9TY2kgIDFFLTEgIC0+ICAwLjEgU3Vibm9ybWFsCitlbWF4MDE4IHRvU2NpICAxRS0yICAtPiAgMC4wMSBTdWJub3JtYWwKKworbWF4ZXhwb25lbnQ6IDEKK21pbmV4cG9uZW50OiAtMQorZW1heDEwMCB0b1NjaSAtMUUrMyAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDEwMSB0b1NjaSAtMUUrMiAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDEwMiB0b1NjaSAtMTAwICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDEwMyB0b1NjaSAgLTEwICAgLT4gLTEwCitlbWF4MTA0IHRvU2NpICAgLTkuOSAtPiAtOS45CitlbWF4MTA1IHRvU2NpICAgLTkgICAtPiAtOQorZW1heDEwNiB0b1NjaSAgIC0xICAgLT4gLTEKK2VtYXgxMDcgdG9TY2kgICAgMCAgIC0+ICAwCitlbWF4MTA4IHRvU2NpICAgIDEgICAtPiAgMQorZW1heDEwOSB0b1NjaSAgICA5ICAgLT4gIDkKK2VtYXgxMTAgdG9TY2kgICAgOS45IC0+ICA5LjkKK2VtYXgxMTEgdG9TY2kgICAxMCAgIC0+IDEwCitlbWF4MTEyIHRvU2NpICAxMDAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTEzIHRvU2NpICAxRSsyICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTE0IHRvU2NpICAxRSszICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTE1IHRvU2NpICAgMC45OSAtPiAgMC45OQorZW1heDExNiB0b1NjaSAgIDAuMSAgLT4gIDAuMQorZW1heDExNyB0b1NjaSAgIDAuMDEgLT4gIDAuMDEgU3Vibm9ybWFsCitlbWF4MTE4IHRvU2NpICAxRS0xICAtPiAgMC4xCitlbWF4MTE5IHRvU2NpICAxRS0yICAtPiAgMC4wMSBTdWJub3JtYWwKK2VtYXgxMjAgdG9TY2kgIDFFLTMgIC0+ICAwLjAwMSBTdWJub3JtYWwKK2VtYXgxMjEgdG9TY2kgIDEuMUUtMyAgLT4gIDAuMDAxMSBTdWJub3JtYWwKK2VtYXgxMjIgdG9TY2kgIDEuMTFFLTMgIC0+ICAwLjAwMTExIFN1Ym5vcm1hbAorZW1heDEyMyB0b1NjaSAgMS4xMTFFLTMgIC0+ICAwLjAwMTExIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTI0IHRvU2NpICAxLjExMTFFLTMgIC0+ICAwLjAwMTExIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MTI1IHRvU2NpICAxLjExMTExRS0zICAtPiAgMC4wMDExMSBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorCittYXhleHBvbmVudDogMgorbWluZXhwb25lbnQ6IC0yCitwcmVjaXNpb246IDkKK2VtYXgyMDAgdG9TY2kgLTFFKzMgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgyMDEgdG9TY2kgLTFFKzIgIC0+IC0xRSsyCitlbWF4MjAyIHRvU2NpIC0xMDAgICAtPiAtMTAwCitlbWF4MjAzIHRvU2NpICAtMTAgICAtPiAtMTAKK2VtYXgyMDQgdG9TY2kgICAtOS45IC0+IC05LjkKK2VtYXgyMDUgdG9TY2kgICAtOSAgIC0+IC05CitlbWF4MjA2IHRvU2NpICAgLTEgICAtPiAtMQorZW1heDIwNyB0b1NjaSAgICAwICAgLT4gIDAKK2VtYXgyMDggdG9TY2kgICAgMSAgIC0+ICAxCitlbWF4MjA5IHRvU2NpICAgIDkgICAtPiAgOQorZW1heDIxMCB0b1NjaSAgICA5LjkgLT4gIDkuOQorZW1heDIxMSB0b1NjaSAgIDEwICAgLT4gMTAKK2VtYXgyMTIgdG9TY2kgIDEwMCAgIC0+IDEwMAorZW1heDIxMyB0b1NjaSAgMUUrMiAgLT4gMUUrMgorZW1heDIxNCB0b1NjaSAgMUUrMyAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDIxNSB0b1NjaSAgIDAuOTkgLT4gIDAuOTkKK2VtYXgyMTYgdG9TY2kgICAwLjEgIC0+ICAwLjEKK2VtYXgyMTcgdG9TY2kgICAwLjAxIC0+ICAwLjAxCitlbWF4MjE4IHRvU2NpICAwLjAwMSAtPiAgMC4wMDEgU3Vibm9ybWFsCitlbWF4MjE5IHRvU2NpICAxRS0xICAtPiAgMC4xCitlbWF4MjIwIHRvU2NpICAxRS0yICAtPiAgMC4wMQorZW1heDIyMSB0b1NjaSAgMUUtMyAgLT4gIDAuMDAxIFN1Ym5vcm1hbAorZW1heDIyMiB0b1NjaSAgMUUtNCAgLT4gIDAuMDAwMSBTdWJub3JtYWwKK2VtYXgyMjMgdG9TY2kgIDFFLTUgIC0+ICAwLjAwMDAxIFN1Ym5vcm1hbAorZW1heDIyNCB0b1NjaSAgMUUtNiAgLT4gIDAuMDAwMDAxIFN1Ym5vcm1hbAorZW1heDIyNSB0b1NjaSAgMUUtNyAgLT4gIDFFLTcgIFN1Ym5vcm1hbAorZW1heDIyNiB0b1NjaSAgMUUtOCAgLT4gIDFFLTggIFN1Ym5vcm1hbAorZW1heDIyNyB0b1NjaSAgMUUtOSAgLT4gIDFFLTkgIFN1Ym5vcm1hbAorZW1heDIyOCB0b1NjaSAgMUUtMTAgLT4gIDFFLTEwIFN1Ym5vcm1hbAorZW1heDIyOSB0b1NjaSAgMUUtMTEgLT4gIDBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXgyMzAgdG9TY2kgIDFFLTEyIC0+ICAwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK21heGV4cG9uZW50OiA3CittaW5leHBvbmVudDogLTcKK2VtYXgyMzEgdG9TY2kgIDFFLTggIC0+ICAxRS04IFN1Ym5vcm1hbAorZW1heDIzMiB0b1NjaSAgMUUtNyAgLT4gIDFFLTcKK2VtYXgyMzMgdG9TY2kgIDFFLTYgIC0+ICAwLjAwMDAwMQorZW1heDIzNCB0b1NjaSAgMUUtNSAgLT4gIDAuMDAwMDEKK2VtYXgyMzUgdG9TY2kgIDFFKzUgIC0+ICAxRSs1CitlbWF4MjM2IHRvU2NpICAxRSs2ICAtPiAgMUUrNgorZW1heDIzNyB0b1NjaSAgMUUrNyAgLT4gIDFFKzcKK2VtYXgyMzggdG9TY2kgIDFFKzggIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworbWF4ZXhwb25lbnQ6IDkKK21pbmV4cG9uZW50OiAtOQorZW1heDI0MCB0b1NjaSAgMUUtMjEgLT4gIDBFLTE3IFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXgyNDEgdG9TY2kgIDFFLTEwIC0+ICAxRS0xMCBTdWJub3JtYWwKK2VtYXgyNDIgdG9TY2kgIDFFLTkgIC0+ICAxRS05CitlbWF4MjQzIHRvU2NpICAxRS04ICAtPiAgMUUtOAorZW1heDI0NCB0b1NjaSAgMUUtNyAgLT4gIDFFLTcKK2VtYXgyNDUgdG9TY2kgIDFFKzcgIC0+ICAxRSs3CitlbWF4MjQ2IHRvU2NpICAxRSs4ICAtPiAgMUUrOAorZW1heDI0NyB0b1NjaSAgMUUrOSAgLT4gIDFFKzkKK2VtYXgyNDggdG9TY2kgIDFFKzEwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworbWF4ZXhwb25lbnQ6IDEwICAtLSBib3VuZGFyeQorbWluZXhwb25lbnQ6IC0xMAorZW1heDI1MCB0b1NjaSAgMUUtMjEgLT4gIDBFLTE4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXgyNTEgdG9TY2kgIDFFLTExIC0+ICAxRS0xMSBTdWJub3JtYWwKK2VtYXgyNTIgdG9TY2kgIDFFLTEwIC0+ICAxRS0xMAorZW1heDI1MyB0b1NjaSAgMUUtOSAgLT4gIDFFLTkKK2VtYXgyNTQgdG9TY2kgIDFFLTggIC0+ICAxRS04CitlbWF4MjU1IHRvU2NpICAxRSs4ICAtPiAgMUUrOAorZW1heDI1NiB0b1NjaSAgMUUrOSAgLT4gIDFFKzkKK2VtYXgyNTcgdG9TY2kgIDFFKzEwIC0+ICAxRSsxMAorZW1heDI1OCB0b1NjaSAgMUUrMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitlbWF4MjYwIHRvU2NpICAxLjAwRS0yMSAtPiAgMEUtMTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDI2MSB0b1NjaSAgMS4wMEUtMTEgLT4gIDEuMDBFLTExIFN1Ym5vcm1hbAorZW1heDI2MiB0b1NjaSAgMS4wMEUtMTAgLT4gIDEuMDBFLTEwCitlbWF4MjYzIHRvU2NpICAxLjAwRS05ICAtPiAgMS4wMEUtOQorZW1heDI2NCB0b1NjaSAgMS4wMEUtOCAgLT4gIDEuMDBFLTgKK2VtYXgyNjUgdG9TY2kgIDEuMDBFKzggIC0+ICAxLjAwRSs4CitlbWF4MjY2IHRvU2NpICAxLjAwRSs5ICAtPiAgMS4wMEUrOQorZW1heDI2NyB0b1NjaSAgMS4wMEUrMTAgLT4gIDEuMDBFKzEwCitlbWF4MjY4IHRvU2NpICAxLjAwRSsxMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MjcwIHRvU2NpICA5Ljk5RS0yMSAtPiAgMEUtMTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDI3MSB0b1NjaSAgOS45OUUtMTEgLT4gIDkuOTlFLTExIFN1Ym5vcm1hbAorZW1heDI3MiB0b1NjaSAgOS45OUUtMTAgLT4gIDkuOTlFLTEwCitlbWF4MjczIHRvU2NpICA5Ljk5RS05ICAtPiAgOS45OUUtOQorZW1heDI3NCB0b1NjaSAgOS45OUUtOCAgLT4gIDkuOTlFLTgKK2VtYXgyNzUgdG9TY2kgIDkuOTlFKzggIC0+ICA5Ljk5RSs4CitlbWF4Mjc2IHRvU2NpICA5Ljk5RSs5ICAtPiAgOS45OUUrOQorZW1heDI3NyB0b1NjaSAgOS45OUUrMTAgLT4gIDkuOTlFKzEwCitlbWF4Mjc4IHRvU2NpICA5Ljk5RSsxMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK21heGV4cG9uZW50OiA5OQorbWluZXhwb25lbnQ6IC05OQorZW1heDI4MCB0b1NjaSAgMUUtMTIwIC0+ICAwRS0xMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDI4MSB0b1NjaSAgMUUtMTAwIC0+ICAxRS0xMDAgU3Vibm9ybWFsCitlbWF4MjgyIHRvU2NpICAxRS05OSAgLT4gIDFFLTk5CitlbWF4MjgzIHRvU2NpICAxRS05OCAgLT4gIDFFLTk4CitlbWF4Mjg0IHRvU2NpICAxRSs5OCAgLT4gIDFFKzk4CitlbWF4Mjg1IHRvU2NpICAxRSs5OSAgLT4gIDFFKzk5CitlbWF4Mjg2IHRvU2NpICAxRSsxMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorZW1heDI5MSB0b1NjaSAgMUUtMTAwMCAtPiAgMUUtMTAwMCBTdWJub3JtYWwKK2VtYXgyOTIgdG9TY2kgIDFFLTk5OSAgLT4gIDFFLTk5OQorZW1heDI5MyB0b1NjaSAgMUUrOTk5ICAtPiAgMUUrOTk5CitlbWF4Mjk0IHRvU2NpICAxRSsxMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK21heGV4cG9uZW50OiA5OTk5CittaW5leHBvbmVudDogLTk5OTkKK2VtYXgzMDEgdG9TY2kgIDFFLTEwMDAwIC0+ICAxRS0xMDAwMCBTdWJub3JtYWwKK2VtYXgzMDIgdG9TY2kgIDFFLTk5OTkgIC0+ICAxRS05OTk5CitlbWF4MzAzIHRvU2NpICAxRSs5OTk5ICAtPiAgMUUrOTk5OQorZW1heDMwNCB0b1NjaSAgMUUrMTAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbWF4ZXhwb25lbnQ6IDk5OTk5CittaW5leHBvbmVudDogLTk5OTk5CitlbWF4MzExIHRvU2NpICAxRS0xMDAwMDAgLT4gIDFFLTEwMDAwMCBTdWJub3JtYWwKK2VtYXgzMTIgdG9TY2kgIDFFLTk5OTk5ICAtPiAgMUUtOTk5OTkKK2VtYXgzMTMgdG9TY2kgIDFFKzk5OTk5ICAtPiAgMUUrOTk5OTkKK2VtYXgzMTQgdG9TY2kgIDFFKzEwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittYXhleHBvbmVudDogOTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OQorZW1heDMyMSB0b1NjaSAgMUUtMTAwMDAwMCAtPiAgMUUtMTAwMDAwMCBTdWJub3JtYWwKK2VtYXgzMjIgdG9TY2kgIDFFLTk5OTk5OSAgLT4gIDFFLTk5OTk5OQorZW1heDMyMyB0b1NjaSAgMUUrOTk5OTk5ICAtPiAgMUUrOTk5OTk5CitlbWF4MzI0IHRvU2NpICAxRSsxMDAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK21heGV4cG9uZW50OiA5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTkKK2VtYXgzMzEgdG9TY2kgIDFFLTEwMDAwMDAwIC0+ICAxRS0xMDAwMDAwMCBTdWJub3JtYWwKK2VtYXgzMzIgdG9TY2kgIDFFLTk5OTk5OTkgIC0+ICAxRS05OTk5OTk5CitlbWF4MzMzIHRvU2NpICAxRSs5OTk5OTk5ICAtPiAgMUUrOTk5OTk5OQorZW1heDMzNCB0b1NjaSAgMUUrMTAwMDAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5CitlbWF4MzQxIHRvU2NpICAxRS0xMDAwMDAwMDAgLT4gIDFFLTEwMDAwMDAwMCBTdWJub3JtYWwKK2VtYXgzNDIgdG9TY2kgIDFFLTk5OTk5OTk5ICAtPiAgMUUtOTk5OTk5OTkKK2VtYXgzNDMgdG9TY2kgIDFFKzk5OTk5OTk5ICAtPiAgMUUrOTk5OTk5OTkKK2VtYXgzNDQgdG9TY2kgIDFFKzEwMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitlbWF4MzQ3IHRvU2NpICAxRS0xMDAwMDAwMDA4ICAgICAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4MzQ4IHRvU2NpICAxRS0xMDAwMDAwMDA3ICAgICAtPiAgMUUtMTAwMDAwMDAwNyBTdWJub3JtYWwKK2VtYXgzNDkgdG9TY2kgIDFFLTEwMDAwMDAwMDAgICAgIC0+ICAxRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorZW1heDM1MCB0b1NjaSAgMUUtOTk5OTk5OTk5ICAgICAgLT4gIDFFLTk5OTk5OTk5OQorZW1heDM1MSB0b1NjaSAgMUUrOTk5OTk5OTk5ICAgICAgLT4gIDFFKzk5OTk5OTk5OQorZW1heDM1MiB0b1NjaSAgMUUrMTAwMDAwMDAwMCAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDM1MyB0b1NjaSAgMS4wMDBFLTEwMDAwMDAwMDAgLT4gIDEuMDAwRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorZW1heDM1NCB0b1NjaSAgMS4wMDBFLTk5OTk5OTk5OSAgLT4gIDEuMDAwRS05OTk5OTk5OTkKK2VtYXgzNTUgdG9TY2kgIDEuMDAwRSs5OTk5OTk5OTkgIC0+ICAxLjAwMEUrOTk5OTk5OTk5CitlbWF4MzU2IHRvU2NpICAxLjAwMEUrMTAwMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MzU3IHRvU2NpICAxLjAwMUUtMTAwMDAwMDAwOCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4MzU4IHRvU2NpICAxLjAwMUUtMTAwMDAwMDAwNyAtPiAgMUUtMTAwMDAwMDAwNyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZW1heDM1OSB0b1NjaSAgMS4wMDFFLTEwMDAwMDAwMDAgLT4gIDEuMDAxRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorZW1heDM2MCB0b1NjaSAgMS4wMDFFLTk5OTk5OTk5OSAgLT4gIDEuMDAxRS05OTk5OTk5OTkKK2VtYXgzNjEgdG9TY2kgIDEuMDAxRSs5OTk5OTk5OTkgIC0+ICAxLjAwMUUrOTk5OTk5OTk5CitlbWF4MzYyIHRvU2NpICAxLjAwMUUrMTAwMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MzYzIHRvU2NpICA5LjAwMEUtMTAwMDAwMDAwMCAtPiAgOS4wMDBFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitlbWF4MzY0IHRvU2NpICA5LjAwMEUtOTk5OTk5OTk5ICAtPiAgOS4wMDBFLTk5OTk5OTk5OQorZW1heDM2NSB0b1NjaSAgOS4wMDBFKzk5OTk5OTk5OSAgLT4gIDkuMDAwRSs5OTk5OTk5OTkKK2VtYXgzNjYgdG9TY2kgIDkuMDAwRSsxMDAwMDAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzNjcgdG9TY2kgIDkuOTk5RS0xMDAwMDAwMDA5IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXgzNjggdG9TY2kgIDkuOTk5RS0xMDAwMDAwMDA4IC0+ICAxRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4MzY5IHRvU2NpICA5Ljk5OUUtMTAwMDAwMDAwNyAtPiAgMS4wRS0xMDAwMDAwMDA2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4MzcwIHRvU2NpICA5Ljk5OUUtMTAwMDAwMDAwMCAtPiAgOS45OTlFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitlbWF4MzcxIHRvU2NpICA5Ljk5OUUtOTk5OTk5OTk5ICAtPiAgOS45OTlFLTk5OTk5OTk5OQorZW1heDM3MiB0b1NjaSAgOS45OTlFKzk5OTk5OTk5OSAgLT4gIDkuOTk5RSs5OTk5OTk5OTkKKworZW1heDM3MyB0b1NjaSAgOS45OTlFKzEwMDAwMDAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDM3NCB0b1NjaSAtMUUtMTAwMDAwMDAwMCAgICAgLT4gLTFFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitlbWF4Mzc1IHRvU2NpIC0xRS05OTk5OTk5OTkgICAgICAtPiAtMUUtOTk5OTk5OTk5CitlbWF4Mzc2IHRvU2NpIC0xRSs5OTk5OTk5OTkgICAgICAtPiAtMUUrOTk5OTk5OTk5CitlbWF4Mzc3IHRvU2NpIC0xRSsxMDAwMDAwMDAwICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4Mzc4IHRvU2NpIC0xLjAwMEUtMTAwMDAwMDAwMCAtPiAtMS4wMDBFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitlbWF4Mzc5IHRvU2NpIC0xLjAwMEUtOTk5OTk5OTk5ICAtPiAtMS4wMDBFLTk5OTk5OTk5OQorZW1heDM4MCB0b1NjaSAtMS4wMDBFKzk5OTk5OTk5OSAgLT4gLTEuMDAwRSs5OTk5OTk5OTkKK2VtYXgzODEgdG9TY2kgLTEuMDAwRSsxMDAwMDAwMDAwIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2VtYXgzODIgdG9TY2kgLTEuMDAxRS0xMDAwMDAwMDA4IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXgzODMgdG9TY2kgLTEuMDAxRS05OTk5OTk5OTkgIC0+IC0xLjAwMUUtOTk5OTk5OTk5CitlbWF4Mzg0IHRvU2NpIC0xLjAwMUUrOTk5OTk5OTk5ICAtPiAtMS4wMDFFKzk5OTk5OTk5OQorZW1heDM4NSB0b1NjaSAtMS4wMDFFKzEwMDAwMDAwMDAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZW1heDM4NiB0b1NjaSAtOS4wMDBFLTEwMDAwMDAxMjMgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDM4NyB0b1NjaSAtOS4wMDBFLTk5OTk5OTk5OSAgLT4gLTkuMDAwRS05OTk5OTk5OTkKK2VtYXgzODggdG9TY2kgLTkuMDAwRSs5OTk5OTk5OTkgIC0+IC05LjAwMEUrOTk5OTk5OTk5CitlbWF4Mzg5IHRvU2NpIC05LjAwMEUrMTAwMDAwMDAwMCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitlbWF4MzkwIHRvU2NpIC05Ljk5OUUtMTAwMDAwMDAwOCAtPiAtMUUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDM5MSB0b1NjaSAtOS45OTlFLTk5OTk5OTk5OSAgLT4gLTkuOTk5RS05OTk5OTk5OTkKK2VtYXgzOTIgdG9TY2kgLTkuOTk5RSs5OTk5OTk5OTkgIC0+IC05Ljk5OUUrOTk5OTk5OTk5CitlbWF4MzkzIHRvU2NpIC05Ljk5OUUrMTAwMDAwMDAwMCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIE5vdyBjaGVjayA4NTQgcm91bmRpbmcgb2Ygc3Vibm9ybWFscyBhbmQgcHJvcGVyIHVuZGVyZmxvdyB0byAwCitwcmVjaXNpb246ICAgNQorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZW1heDQwMCB0b1NjaSAgMS4wMDAwRS05OTkgICAgIC0+IDEuMDAwMEUtOTk5CitlbWF4NDAxIHRvU2NpICAwLjFFLTk5OSAgICAgICAgLT4gMUUtMTAwMCAgICAgU3Vibm9ybWFsCitlbWF4NDAyIHRvU2NpICAwLjEwMDBFLTk5OSAgICAgLT4gMS4wMDBFLTEwMDAgU3Vibm9ybWFsCitlbWF4NDAzIHRvU2NpICAwLjAxMDBFLTk5OSAgICAgLT4gMS4wMEUtMTAwMSAgU3Vibm9ybWFsCitlbWF4NDA0IHRvU2NpICAwLjAwMTBFLTk5OSAgICAgLT4gMS4wRS0xMDAyICAgU3Vibm9ybWFsCitlbWF4NDA1IHRvU2NpICAwLjAwMDFFLTk5OSAgICAgLT4gMUUtMTAwMyAgICAgU3Vibm9ybWFsCitlbWF4NDA2IHRvU2NpICAwLjAwMDEwRS05OTkgICAgLT4gMUUtMTAwMyAgICAgU3Vibm9ybWFsIFJvdW5kZWQKK2VtYXg0MDcgdG9TY2kgIDAuMDAwMTNFLTk5OSAgICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQwOCB0b1NjaSAgMC4wMDAxNUUtOTk5ICAgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDA5IHRvU2NpICAwLjAwMDE3RS05OTkgICAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MTAgdG9TY2kgIDAuMDAwMjNFLTk5OSAgICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQxMSB0b1NjaSAgMC4wMDAyNUUtOTk5ICAgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDEyIHRvU2NpICAwLjAwMDI3RS05OTkgICAgLT4gM0UtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MTMgdG9TY2kgIDAuMDAwMTQ5RS05OTkgICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQxNCB0b1NjaSAgMC4wMDAxNTBFLTk5OSAgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDE1IHRvU2NpICAwLjAwMDE1MUUtOTk5ICAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MTYgdG9TY2kgIDAuMDAwMjQ5RS05OTkgICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQxNyB0b1NjaSAgMC4wMDAyNTBFLTk5OSAgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDE4IHRvU2NpICAwLjAwMDI1MUUtOTk5ICAgLT4gM0UtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MTkgdG9TY2kgIDAuMDAwMDlFLTk5OSAgICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQyMCB0b1NjaSAgMC4wMDAwNUUtOTk5ICAgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXg0MjEgdG9TY2kgIDAuMDAwMDNFLTk5OSAgICAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitlbWF4NDIyIHRvU2NpICAwLjAwMDAwOUUtOTk5ICAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDQyMyB0b1NjaSAgMC4wMDAwMDVFLTk5OSAgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXg0MjQgdG9TY2kgIDAuMDAwMDAzRS05OTkgICAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2VtYXg0MjUgdG9TY2kgIDAuMDAxMDQ5RS05OTkgICAtPiAxLjBFLTEwMDIgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQyNiB0b1NjaSAgMC4wMDEwNTBFLTk5OSAgIC0+IDEuMEUtMTAwMiAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDI3IHRvU2NpICAwLjAwMTA1MUUtOTk5ICAgLT4gMS4xRS0xMDAyICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MjggdG9TY2kgIDAuMDAxMTQ5RS05OTkgICAtPiAxLjFFLTEwMDIgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQyOSB0b1NjaSAgMC4wMDExNTBFLTk5OSAgIC0+IDEuMkUtMTAwMiAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDMwIHRvU2NpICAwLjAwMTE1MUUtOTk5ICAgLT4gMS4yRS0xMDAyICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZW1heDQzMiB0b1NjaSAgMC4wMTAwNDlFLTk5OSAgIC0+IDEuMDBFLTEwMDEgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDMzIHRvU2NpICAwLjAxMDA1MEUtOTk5ICAgLT4gMS4wMEUtMTAwMSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MzQgdG9TY2kgIDAuMDEwMDUxRS05OTkgICAtPiAxLjAxRS0xMDAxICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQzNSB0b1NjaSAgMC4wMTAxNDlFLTk5OSAgIC0+IDEuMDFFLTEwMDEgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDM2IHRvU2NpICAwLjAxMDE1MEUtOTk5ICAgLT4gMS4wMkUtMTAwMSAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0MzcgdG9TY2kgIDAuMDEwMTUxRS05OTkgICAtPiAxLjAyRS0xMDAxICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitlbWF4NDQwIHRvU2NpICAwLjEwMTAzRS05OTkgICAgLT4gMS4wMTBFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NDEgdG9TY2kgIDAuMTAxMDVFLTk5OSAgICAtPiAxLjAxMEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ0MiB0b1NjaSAgMC4xMDEwN0UtOTk5ICAgIC0+IDEuMDExRS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDQzIHRvU2NpICAwLjEwMTEzRS05OTkgICAgLT4gMS4wMTFFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NDQgdG9TY2kgIDAuMTAxMTVFLTk5OSAgICAtPiAxLjAxMkUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ0NSB0b1NjaSAgMC4xMDExN0UtOTk5ICAgIC0+IDEuMDEyRS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2VtYXg0NTAgdG9TY2kgIDEuMTA3MzBFLTEwMDAgICAtPiAxLjEwN0UtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ1MSB0b1NjaSAgMS4xMDc1MEUtMTAwMCAgIC0+IDEuMTA4RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDUyIHRvU2NpICAxLjEwNzcwRS0xMDAwICAgLT4gMS4xMDhFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NTMgdG9TY2kgIDEuMTA4MzBFLTEwMDAgICAtPiAxLjEwOEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZW1heDQ1NCB0b1NjaSAgMS4xMDg1MEUtMTAwMCAgIC0+IDEuMTA4RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDU1IHRvU2NpICAxLjEwODcwRS0xMDAwICAgLT4gMS4xMDlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbWFrZSBzdXJlIHNpZ24gT0sKK2VtYXg0NTYgdG9TY2kgIC0wLjEwMTAzRS05OTkgICAtPiAtMS4wMTBFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NTcgdG9TY2kgIC0wLjEwMTA1RS05OTkgICAtPiAtMS4wMTBFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NTggdG9TY2kgIC0wLjEwMTA3RS05OTkgICAtPiAtMS4wMTFFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NTkgdG9TY2kgIC0wLjEwMTEzRS05OTkgICAtPiAtMS4wMTFFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NjAgdG9TY2kgIC0wLjEwMTE1RS05OTkgICAtPiAtMS4wMTJFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2VtYXg0NjEgdG9TY2kgIC0wLjEwMTE3RS05OTkgICAtPiAtMS4wMTJFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gJzk5OXMnIGNhc2VzCitlbWF4NDY0IHRvU2NpICA5OTk5OTlFLTk5OSAgICAgICAgIC0+IDEuMDAwMEUtOTkzIEluZXhhY3QgUm91bmRlZAorZW1heDQ2NSB0b1NjaSAgOTk5OTkuMEUtOTk5ICAgICAgICAtPiA5Ljk5OTlFLTk5NSBSb3VuZGVkCitlbWF4NDY2IHRvU2NpICA5OTk5OS5FLTk5OSAgICAgICAgIC0+IDkuOTk5OUUtOTk1CitlbWF4NDY3IHRvU2NpICA5OTk5LjlFLTk5OSAgICAgICAgIC0+IDkuOTk5OUUtOTk2CitlbWF4NDY4IHRvU2NpICA5OTkuOTlFLTk5OSAgICAgICAgIC0+IDkuOTk5OUUtOTk3CitlbWF4NDY5IHRvU2NpICA5OS45OTlFLTk5OSAgICAgICAgIC0+IDkuOTk5OUUtOTk4CitlbWF4NDcwIHRvU2NpICA5Ljk5OTlFLTk5OSAgICAgICAgIC0+IDkuOTk5OUUtOTk5CitlbWF4NDcxIHRvU2NpICAwLjk5OTk5RS05OTkgICAgICAgIC0+IDEuMDAwMEUtOTk5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDcyIHRvU2NpICAwLjA5OTk5OUUtOTk5ICAgICAgIC0+IDEuMDAwRS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDczIHRvU2NpICAwLjAwOTk5OTlFLTk5OSAgICAgIC0+IDEuMDBFLTEwMDEgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDc0IHRvU2NpICAwLjAwMDk5OTk5RS05OTkgICAgIC0+IDEuMEUtMTAwMiAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDc1IHRvU2NpICAwLjAwMDA5OTk5OUUtOTk5ICAgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitlbWF4NDc2IHRvU2NpICAwLjAwMDAwOTk5OTlFLTk5OSAgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2VtYXg0NzcgdG9TY2kgIDAuMDAwMDAwOTk5OTlFLTk5OSAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZW1heDQ3OCB0b1NjaSAgMC4wMDAwMDAwOTk5OTlFLTk5OSAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIEV4cG9uZW50cyB3aXRoIGluc2lnbmlmaWNhbnQgbGVhZGluZyB6ZXJvcworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorYmFzeDEwMDEgdG9TY2kgIDFlOTk5OTk5OTk5IC0+IDFFKzk5OTk5OTk5OQorYmFzeDEwMDIgdG9TY2kgIDFlMDk5OTk5OTk5OSAtPiAxRSs5OTk5OTk5OTkKK2Jhc3gxMDAzIHRvU2NpICAxZTAwOTk5OTk5OTk5IC0+IDFFKzk5OTk5OTk5OQorYmFzeDEwMDQgdG9TY2kgIDFlMDAwOTk5OTk5OTk5IC0+IDFFKzk5OTk5OTk5OQorYmFzeDEwMDUgdG9TY2kgIDFlMDAwMDAwMDAwMDAwOTk5OTk5OTk5IC0+IDFFKzk5OTk5OTk5OQorYmFzeDEwMDYgdG9TY2kgIDFlMDAwMDAwMDAwMDAxMDAwMDAwMDA3IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYmFzeDEwMDcgdG9TY2kgIDFlLTk5OTk5OTk5OSAtPiAxRS05OTk5OTk5OTkKK2Jhc3gxMDA4IHRvU2NpICAxZS0wOTk5OTk5OTk5IC0+IDFFLTk5OTk5OTk5OQorYmFzeDEwMDkgdG9TY2kgIDFlLTAwOTk5OTk5OTk5IC0+IDFFLTk5OTk5OTk5OQorYmFzeDEwMTAgdG9TY2kgIDFlLTAwMDk5OTk5OTk5OSAtPiAxRS05OTk5OTk5OTkKK2Jhc3gxMDExIHRvU2NpICAxZS0wMDAwMDAwMDAwMDA5OTk5OTk5OTkgLT4gMUUtOTk5OTk5OTk5CitiYXN4MTAxMiB0b1NjaSAgMWUtMDAwMDAwMDAwMDAxMDAwMDAwMDA3IC0+IDFFLTEwMDAwMDAwMDcgU3Vibm9ybWFsCisKKy0tIEVkZ2UgY2FzZXMgZm9yIGludDMyIGV4cG9uZW50cy4uLgorYmFzeDEwMjEgdG9zY2kgMWUrMjE0NzQ4MzY0OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gxMDIyIHRvc2NpIDFlKzIxNDc0ODM2NDggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitiYXN4MTAyMyB0b3NjaSAxZSsyMTQ3NDgzNjQ3IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYmFzeDEwMjQgdG9zY2kgMWUtMjE0NzQ4MzY0NyAtPiAwRS0xMDAwMDAwMDE0IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Jhc3gxMDI1IHRvc2NpIDFlLTIxNDc0ODM2NDggLT4gMEUtMTAwMDAwMDAxNCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitiYXN4MTAyNiB0b3NjaSAxZS0yMTQ3NDgzNjQ5IC0+IDBFLTEwMDAwMDAwMTQgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gc2FtZSB1bmJhbGFuY2VkCitwcmVjaXNpb246ICAgNworbWF4RXhwb25lbnQ6IDk2CittaW5leHBvbmVudDogLTk1CitiYXN4MTAzMSB0b3NjaSAxZSsyMTQ3NDgzNjQ5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorYmFzeDEwMzIgdG9zY2kgMWUrMjE0NzQ4MzY0OCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Jhc3gxMDMzIHRvc2NpIDFlKzIxNDc0ODM2NDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitiYXN4MTAzNCB0b3NjaSAxZS0yMTQ3NDgzNjQ3IC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitiYXN4MTAzNSB0b3NjaSAxZS0yMTQ3NDgzNjQ4IC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitiYXN4MTAzNiB0b3NjaSAxZS0yMTQ3NDgzNjQ5IC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitwcmVjaXNpb246ICAgNQorbWF4ZXhwb25lbnQ6IDc5CittaW5leHBvbmVudDogLTc5CitiYXN4MTA0MSB0b1NjaSAgICAgMS41MjQ0NEUtODAgIC0+ICAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2Jhc3gxMDQyIHRvU2NpICAgICAxLjUyNDQ1RS04MCAgLT4gIDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworYmFzeDEwNDMgdG9TY2kgICAgIDEuNTI0NDZFLTgwICAtPiAgMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIGNsYW1wZWQgemVyb3MgW3NlZSBhbHNvIGNsYW1wLmRlY1Rlc3RdCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKKworYmFzeDEwNjEgYXBwbHkgICAwZSsxMDAwMCAgLT4gIDBFKzYxNDQgQ2xhbXBlZAorYmFzeDEwNjIgYXBwbHkgICAwZS0xMDAwMCAgLT4gIDBFLTYxNzYgQ2xhbXBlZAorYmFzeDEwNjMgYXBwbHkgIC0wZSsxMDAwMCAgLT4gLTBFKzYxNDQgQ2xhbXBlZAorYmFzeDEwNjQgYXBwbHkgIC0wZS0xMDAwMCAgLT4gLTBFLTYxNzYgQ2xhbXBlZAorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKK2Jhc3gxMDY1IGFwcGx5ICAgMGUrMTAwMDAgIC0+ICAwRSszODQgIENsYW1wZWQKK2Jhc3gxMDY2IGFwcGx5ICAgMGUtMTAwMDAgIC0+ICAwRS0zOTggIENsYW1wZWQKK2Jhc3gxMDY3IGFwcGx5ICAtMGUrMTAwMDAgIC0+IC0wRSszODQgIENsYW1wZWQKK2Jhc3gxMDY4IGFwcGx5ICAtMGUtMTAwMDAgIC0+IC0wRS0zOTggIENsYW1wZWQKKworLS0gc2FtZSB3aXRoIElFRUUgY2xhbXBpbmcKK2NsYW1wOiAgICAgICAxCisKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworCitiYXN4MTA3MSBhcHBseSAgIDBlKzEwMDAwICAtPiAgMEUrNjExMSBDbGFtcGVkCitiYXN4MTA3MiBhcHBseSAgIDBlLTEwMDAwICAtPiAgMEUtNjE3NiBDbGFtcGVkCitiYXN4MTA3MyBhcHBseSAgLTBlKzEwMDAwICAtPiAtMEUrNjExMSBDbGFtcGVkCitiYXN4MTA3NCBhcHBseSAgLTBlLTEwMDAwICAtPiAtMEUtNjE3NiBDbGFtcGVkCisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworYmFzeDEwNzUgYXBwbHkgICAwZSsxMDAwMCAgLT4gIDBFKzM2OSAgQ2xhbXBlZAorYmFzeDEwNzYgYXBwbHkgICAwZS0xMDAwMCAgLT4gIDBFLTM5OCAgQ2xhbXBlZAorYmFzeDEwNzcgYXBwbHkgIC0wZSsxMDAwMCAgLT4gLTBFKzM2OSAgQ2xhbXBlZAorYmFzeDEwNzggYXBwbHkgIC0wZS0xMDAwMCAgLT4gLTBFLTM5OCAgQ2xhbXBlZAorCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY2xhbXAuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY2xhbXAuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmM2NjQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jbGFtcC5kZWNUZXN0CkBAIC0wLDAgKzEsMjExIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNsYW1wLmRlY1Rlc3QgLS0gY2xhbXBlZCBleHBvbmVudCB0ZXN0cyAoZm9ybWF0LWluZGVwZW5kZW50KSAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDAsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgdXNlcyB0aGUgc2FtZSBsaW1pdHMgYXMgdGhlIDgtYnl0ZSBjb25jcmV0ZQorLS0gcmVwcmVzZW50YXRpb24sIGJ1dCBhcHBsaWVzIGNsYW1waW5nIHdpdGhvdXQgdXNpbmcgZm9ybWF0LXNwZWNpZmljCistLSBjb252ZXJzaW9ucy4KKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2NsYW1wOiAgICAgICAxCisKKy0tIEdlbmVyYWwgdGVzdGNhc2VzCisKKy0tIE5vcm1hbGl0eQorY2xhbTAxMCBhcHBseSAgIDEyMzQ1Njc4OTAxMjM0NTYgICAtPiAgMTIzNDU2Nzg5MDEyMzQ1NgorY2xhbTAxMSBhcHBseSAgIDEyMzQ1Njc4OTAxMjM0NTYuMCAtPiAgMTIzNDU2Nzg5MDEyMzQ1NiBSb3VuZGVkCitjbGFtMDEyIGFwcGx5ICAgMTIzNDU2Nzg5MDEyMzQ1Ni4xIC0+ICAxMjM0NTY3ODkwMTIzNDU2IFJvdW5kZWQgSW5leGFjdAorY2xhbTAxMyBhcHBseSAgLTEyMzQ1Njc4OTAxMjM0NTYgICAtPiAtMTIzNDU2Nzg5MDEyMzQ1NgorY2xhbTAxNCBhcHBseSAgLTEyMzQ1Njc4OTAxMjM0NTYuMCAtPiAtMTIzNDU2Nzg5MDEyMzQ1NiBSb3VuZGVkCitjbGFtMDE1IGFwcGx5ICAtMTIzNDU2Nzg5MDEyMzQ1Ni4xIC0+IC0xMjM0NTY3ODkwMTIzNDU2IFJvdW5kZWQgSW5leGFjdAorCisKKy0tIE5tYXggYW5kIHNpbWlsYXIKK2NsYW0wMjIgYXBwbHkgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitjbGFtMDI0IGFwcGx5ICAgMS4yMzQ1Njc4OTAxMjM0NTZFKzM4NCAgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFKzM4NAorLS0gZm9sZC1kb3ducyAobW9yZSBiZWxvdykKK2NsYW0wMzAgYXBwbHkgICAxLjIzRSszODQgICAgICAgICAgICAgICAtPiAxLjIzMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKK2NsYW0wMzIgYXBwbHkgICAxRSszODQgICAgICAgICAgICAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKKworY2xhbTA1MSBhcHBseSAgIDEyMzQ1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1CitjbGFtMDUzIGFwcGx5ICAgMTIzNCAgICAgICAgICAgICAgICAgICAgLT4gMTIzNAorY2xhbTA1NSBhcHBseSAgIDEyMyAgICAgICAgICAgICAgICAgICAgIC0+IDEyMworY2xhbTA1NyBhcHBseSAgIDEyICAgICAgICAgICAgICAgICAgICAgIC0+IDEyCitjbGFtMDU5IGFwcGx5ICAgMSAgICAgICAgICAgICAgICAgICAgICAgLT4gMQorY2xhbTA2MSBhcHBseSAgIDEuMjMgICAgICAgICAgICAgICAgICAgIC0+IDEuMjMKK2NsYW0wNjMgYXBwbHkgICAxMjMuNDUgICAgICAgICAgICAgICAgICAtPiAxMjMuNDUKKworLS0gTm1pbiBhbmQgYmVsb3cKK2NsYW0wNzEgYXBwbHkgICAxRS0zODMgICAgICAgICAgICAgICAgICAtPiAxRS0zODMKK2NsYW0wNzMgYXBwbHkgICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitjbGFtMDc1IGFwcGx5ICAgMS4wMDAwMDAwMDAwMDAwMDFFLTM4MyAgLT4gMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworCitjbGFtMDc3IGFwcGx5ICAgMC4xMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0ICBTdWJub3JtYWwKK2NsYW0wNzkgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAxMEUtMzgzICAtPiAxLjBFLTM5NyAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorY2xhbTA4MSBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDFFLTM4MyAgIC0+IDFFLTM5NyAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCitjbGFtMDgzIGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMDFFLTM4MyAgLT4gMUUtMzk4ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKKworLS0gdW5kZXJmbG93cworY2xhbTA5MCBhcHBseSAgIDFlLTM5OCAgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwKK2NsYW0wOTEgYXBwbHkgICAxLjllLTM5OCAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMiAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0wOTIgYXBwbHkgICAxLjFlLTM5OCAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0wOTMgYXBwbHkgICAxLjAwMDAwMDAwMDAxZS0zOTggICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0wOTQgYXBwbHkgICAxLjAwMDAwMDAwMDAwMDAxZS0zOTggICAtPiAjMDAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0wOTUgYXBwbHkgICAxLjAwMDAwMDAwMDAwMDAwMWUtMzk4ICAtPiAjMDAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0wOTYgYXBwbHkgICAwLjFlLTM5OCAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMCAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorY2xhbTA5NyBhcHBseSAgIDAuMDAwMDAwMDAwMDFlLTM5OCAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAwICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitjbGFtMDk4IGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMWUtMzk4ICAgLT4gIzAwMDAwMDAwMDAwMDAwMDAgIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2NsYW0wOTkgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAwMWUtMzk4ICAtPiAjMDAwMDAwMDAwMDAwMDAwMCAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBTYW1lIGFnYWluLCBuZWdhdGl2ZXMKKy0tIE5tYXggYW5kIHNpbWlsYXIKK2NsYW0xMjIgYXBwbHkgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorY2xhbTEyNCBhcHBseSAgLTEuMjM0NTY3ODkwMTIzNDU2RSszODQgIC0+IC0xLjIzNDU2Nzg5MDEyMzQ1NkUrMzg0CistLSBmb2xkLWRvd25zIChtb3JlIGJlbG93KQorY2xhbTEzMCBhcHBseSAgLTEuMjNFKzM4NCAgICAgICAgICAgICAgIC0+IC0xLjIzMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKK2NsYW0xMzIgYXBwbHkgIC0xRSszODQgICAgICAgICAgICAgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBDbGFtcGVkCisKK2NsYW0xNTEgYXBwbHkgIC0xMjM0NSAgICAgICAgICAgICAgICAgICAtPiAtMTIzNDUKK2NsYW0xNTMgYXBwbHkgIC0xMjM0ICAgICAgICAgICAgICAgICAgICAtPiAtMTIzNAorY2xhbTE1NSBhcHBseSAgLTEyMyAgICAgICAgICAgICAgICAgICAgIC0+IC0xMjMKK2NsYW0xNTcgYXBwbHkgIC0xMiAgICAgICAgICAgICAgICAgICAgICAtPiAtMTIKK2NsYW0xNTkgYXBwbHkgIC0xICAgICAgICAgICAgICAgICAgICAgICAtPiAtMQorY2xhbTE2MSBhcHBseSAgLTEuMjMgICAgICAgICAgICAgICAgICAgIC0+IC0xLjIzCitjbGFtMTYzIGFwcGx5ICAtMTIzLjQ1ICAgICAgICAgICAgICAgICAgLT4gLTEyMy40NQorCistLSBObWluIGFuZCBiZWxvdworY2xhbTE3MSBhcHBseSAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IC0xRS0zODMKK2NsYW0xNzMgYXBwbHkgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworY2xhbTE3NSBhcHBseSAgLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMUUtMzgzCisKK2NsYW0xNzcgYXBwbHkgIC0wLjEwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAtMS4wMDAwMDAwMDAwMDAwMEUtMzg0ICBTdWJub3JtYWwKK2NsYW0xNzkgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAxMEUtMzgzICAtPiAtMS4wRS0zOTcgICAgICAgICAgICAgICBTdWJub3JtYWwKK2NsYW0xODEgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAxRS0zODMgICAtPiAtMUUtMzk3ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKK2NsYW0xODMgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAwMUUtMzgzICAtPiAtMUUtMzk4ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKKworLS0gdW5kZXJmbG93cworY2xhbTE4OSBhcHBseSAgIC0xZS0zOTggICAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwKK2NsYW0xOTAgYXBwbHkgICAtMS4wZS0zOTggICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFJvdW5kZWQKK2NsYW0xOTEgYXBwbHkgICAtMS45ZS0zOTggICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMiAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0xOTIgYXBwbHkgICAtMS4xZS0zOTggICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0xOTMgYXBwbHkgICAtMS4wMDAwMDAwMDAwMWUtMzk4ICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0xOTQgYXBwbHkgICAtMS4wMDAwMDAwMDAwMDAwMWUtMzk4ICAtPiAjODAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0xOTUgYXBwbHkgICAtMS4wMDAwMDAwMDAwMDAwMDFlLTM5OCAtPiAjODAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW0xOTYgYXBwbHkgICAtMC4xZS0zOTggICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMCAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorY2xhbTE5NyBhcHBseSAgIC0wLjAwMDAwMDAwMDAxZS0zOTggICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAwICBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitjbGFtMTk4IGFwcGx5ICAgLTAuMDAwMDAwMDAwMDAwMDFlLTM5OCAgLT4gIzgwMDAwMDAwMDAwMDAwMDAgIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2NsYW0xOTkgYXBwbHkgICAtMC4wMDAwMDAwMDAwMDAwMDFlLTM5OCAtPiAjODAwMDAwMDAwMDAwMDAwMCAgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSB6ZXJvcworY2xhbTQwMSBhcHBseSAgIDBFLTUwMCAgICAgICAgICAgICAgICAgIC0+IDBFLTM5OCAgQ2xhbXBlZAorY2xhbTQwMiBhcHBseSAgIDBFLTQwMCAgICAgICAgICAgICAgICAgIC0+IDBFLTM5OCAgQ2xhbXBlZAorY2xhbTQwMyBhcHBseSAgIDBFLTM5OCAgICAgICAgICAgICAgICAgIC0+IDBFLTM5OAorY2xhbTQwNCBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IDBFLTM5OAorY2xhbTQwNSBhcHBseSAgIDBFLTIgICAgICAgICAgICAgICAgICAgIC0+ICAwLjAwCitjbGFtNDA2IGFwcGx5ICAgMCAgICAgICAgICAgICAgICAgICAgICAgLT4gMAorY2xhbTQwNyBhcHBseSAgIDBFKzMgICAgICAgICAgICAgICAgICAgIC0+IDBFKzMKK2NsYW00MDggYXBwbHkgICAwRSszNjkgICAgICAgICAgICAgICAgICAtPiAwRSszNjkKKy0tIGNsYW1wZWQgemVyb3MuLi4KK2NsYW00MTAgYXBwbHkgICAwRSszNzAgICAgICAgICAgICAgICAgICAtPiAwRSszNjkgQ2xhbXBlZAorY2xhbTQxMSBhcHBseSAgIDBFKzM4NCAgICAgICAgICAgICAgICAgIC0+IDBFKzM2OSBDbGFtcGVkCitjbGFtNDEyIGFwcGx5ICAgMEUrNDAwICAgICAgICAgICAgICAgICAgLT4gMEUrMzY5IENsYW1wZWQKK2NsYW00MTMgYXBwbHkgICAwRSs1MDAgICAgICAgICAgICAgICAgICAtPiAwRSszNjkgQ2xhbXBlZAorCistLSBuZWdhdGl2ZSB6ZXJvcworY2xhbTQyMCBhcHBseSAgIC0wRS01MDAgICAgICAgICAgICAgICAgIC0+IC0wRS0zOTggQ2xhbXBlZAorY2xhbTQyMSBhcHBseSAgIC0wRS00MDAgICAgICAgICAgICAgICAgIC0+IC0wRS0zOTggQ2xhbXBlZAorY2xhbTQyMiBhcHBseSAgIC0wRS0zOTggICAgICAgICAgICAgICAgIC0+IC0wRS0zOTgKK2NsYW00MjMgYXBwbHkgICAtMC4wMDAwMDAwMDAwMDAwMDBFLTM4MyAtPiAtMEUtMzk4CitjbGFtNDI0IGFwcGx5ICAgLTBFLTIgICAgICAgICAgICAgICAgICAgLT4gLTAuMDAKK2NsYW00MjUgYXBwbHkgICAtMCAgICAgICAgICAgICAgICAgICAgICAtPiAtMAorY2xhbTQyNiBhcHBseSAgIC0wRSszICAgICAgICAgICAgICAgICAgIC0+IC0wRSszCitjbGFtNDI3IGFwcGx5ICAgLTBFKzM2OSAgICAgICAgICAgICAgICAgLT4gLTBFKzM2OQorLS0gY2xhbXBlZCB6ZXJvcy4uLgorY2xhbTQzMSBhcHBseSAgIC0wRSszNzAgICAgICAgICAgICAgICAgIC0+IC0wRSszNjkgQ2xhbXBlZAorY2xhbTQzMiBhcHBseSAgIC0wRSszODQgICAgICAgICAgICAgICAgIC0+IC0wRSszNjkgQ2xhbXBlZAorY2xhbTQzMyBhcHBseSAgIC0wRSs0MDAgICAgICAgICAgICAgICAgIC0+IC0wRSszNjkgQ2xhbXBlZAorY2xhbTQzNCBhcHBseSAgIC0wRSs1MDAgICAgICAgICAgICAgICAgIC0+IC0wRSszNjkgQ2xhbXBlZAorCistLSBmb2xkLWRvd24gZnVsbCBzZXF1ZW5jZQorY2xhbTYwMSBhcHBseSAgIDFFKzM4NCAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQgQ2xhbXBlZAorY2xhbTYwMyBhcHBseSAgIDFFKzM4MyAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitjbGFtNjA1IGFwcGx5ICAgMUUrMzgyICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwRSszODIgQ2xhbXBlZAorY2xhbTYwNyBhcHBseSAgIDFFKzM4MSAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwRSszODEgQ2xhbXBlZAorY2xhbTYwOSBhcHBseSAgIDFFKzM4MCAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwMDAwMDBFKzM4MCBDbGFtcGVkCitjbGFtNjExIGFwcGx5ICAgMUUrMzc5ICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwRSszNzkgQ2xhbXBlZAorY2xhbTYxMyBhcHBseSAgIDFFKzM3OCAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwMDAwRSszNzggQ2xhbXBlZAorY2xhbTYxNSBhcHBseSAgIDFFKzM3NyAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwMDBFKzM3NyBDbGFtcGVkCitjbGFtNjE3IGFwcGx5ICAgMUUrMzc2ICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwMDAwRSszNzYgQ2xhbXBlZAorY2xhbTYxOSBhcHBseSAgIDFFKzM3NSAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDAwRSszNzUgQ2xhbXBlZAorY2xhbTYyMSBhcHBseSAgIDFFKzM3NCAgICAgICAgICAgICAgICAgIC0+IDEuMDAwMDBFKzM3NCBDbGFtcGVkCitjbGFtNjIzIGFwcGx5ICAgMUUrMzczICAgICAgICAgICAgICAgICAgLT4gMS4wMDAwRSszNzMgQ2xhbXBlZAorY2xhbTYyNSBhcHBseSAgIDFFKzM3MiAgICAgICAgICAgICAgICAgIC0+IDEuMDAwRSszNzIgQ2xhbXBlZAorY2xhbTYyNyBhcHBseSAgIDFFKzM3MSAgICAgICAgICAgICAgICAgIC0+IDEuMDBFKzM3MSBDbGFtcGVkCitjbGFtNjI5IGFwcGx5ICAgMUUrMzcwICAgICAgICAgICAgICAgICAgLT4gMS4wRSszNzAgQ2xhbXBlZAorY2xhbTYzMSBhcHBseSAgIDFFKzM2OSAgICAgICAgICAgICAgICAgIC0+IDFFKzM2OQorY2xhbTYzMyBhcHBseSAgIDFFKzM2OCAgICAgICAgICAgICAgICAgIC0+IDFFKzM2OAorLS0gc2FtZSB3aXRoIDlzCitjbGFtNjQxIGFwcGx5ICAgOUUrMzg0ICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBDbGFtcGVkCitjbGFtNjQzIGFwcGx5ICAgOUUrMzgzICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2NsYW02NDUgYXBwbHkgICA5RSszODIgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwMDBFKzM4MiBDbGFtcGVkCitjbGFtNjQ3IGFwcGx5ICAgOUUrMzgxICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDBFKzM4MSBDbGFtcGVkCitjbGFtNjQ5IGFwcGx5ICAgOUUrMzgwICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMDAwMDAwMEUrMzgwIENsYW1wZWQKK2NsYW02NTEgYXBwbHkgICA5RSszNzkgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDBFKzM3OSBDbGFtcGVkCitjbGFtNjUzIGFwcGx5ICAgOUUrMzc4ICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMDAwMDBFKzM3OCBDbGFtcGVkCitjbGFtNjU1IGFwcGx5ICAgOUUrMzc3ICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMDAwMEUrMzc3IENsYW1wZWQKK2NsYW02NTcgYXBwbHkgICA5RSszNzYgICAgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDBFKzM3NiBDbGFtcGVkCitjbGFtNjU5IGFwcGx5ICAgOUUrMzc1ICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMDBFKzM3NSBDbGFtcGVkCitjbGFtNjYxIGFwcGx5ICAgOUUrMzc0ICAgICAgICAgICAgICAgICAgLT4gOS4wMDAwMEUrMzc0IENsYW1wZWQKK2NsYW02NjMgYXBwbHkgICA5RSszNzMgICAgICAgICAgICAgICAgICAtPiA5LjAwMDBFKzM3MyBDbGFtcGVkCitjbGFtNjY1IGFwcGx5ICAgOUUrMzcyICAgICAgICAgICAgICAgICAgLT4gOS4wMDBFKzM3MiBDbGFtcGVkCitjbGFtNjY3IGFwcGx5ICAgOUUrMzcxICAgICAgICAgICAgICAgICAgLT4gOS4wMEUrMzcxIENsYW1wZWQKK2NsYW02NjkgYXBwbHkgICA5RSszNzAgICAgICAgICAgICAgICAgICAtPiA5LjBFKzM3MCBDbGFtcGVkCitjbGFtNjcxIGFwcGx5ICAgOUUrMzY5ICAgICAgICAgICAgICAgICAgLT4gOUUrMzY5CitjbGFtNjczIGFwcGx5ICAgOUUrMzY4ICAgICAgICAgICAgICAgICAgLT4gOUUrMzY4CisKKy0tIHN1Ym5vcm1hbHMgY2xhbXBlZCB0byAwLUV0aW55CitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitjbGFtNjgxIGFwcGx5IDdFLTM5OCAgICAgLT4gN0UtMzk4IFN1Ym5vcm1hbAorY2xhbTY4MiBhcHBseSAwRS0zOTggICAgIC0+IDBFLTM5OAorY2xhbTY4MyBhcHBseSA3RS0zOTkgICAgIC0+IDFFLTM5OCBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTY4NCBhcHBseSA0RS0zOTkgICAgIC0+IDBFLTM5OCBDbGFtcGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitjbGFtNjg1IGFwcGx5IDdFLTQwMCAgICAgLT4gMEUtMzk4IENsYW1wZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW02ODYgYXBwbHkgN0UtNDAxICAgICAtPiAwRS0zOTggQ2xhbXBlZCBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbTY4NyBhcHBseSAwRS0zOTkgICAgIC0+IDBFLTM5OCBDbGFtcGVkCitjbGFtNjg4IGFwcGx5IDBFLTQwMCAgICAgLT4gMEUtMzk4IENsYW1wZWQKK2NsYW02ODkgYXBwbHkgMEUtNDAxICAgICAtPiAwRS0zOTggQ2xhbXBlZAorCistLSBleGFtcGxlIGZyb20gZG9jdW1lbnRhdGlvbgorcHJlY2lzaW9uOiAgIDcKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiArOTYKK21pbkV4cG9uZW50OiAtOTUKKworY2xhbXA6ICAgICAgIDAKK2NsYW03MDAgYXBwbHkgICAxLjIzRSs5NiAgICAgICAgICAgICAgICAtPiAxLjIzRSs5NgorCitjbGFtcDogICAgICAgMQorY2xhbTcwMSBhcHBseSAgIDEuMjNFKzk2ICAgICAgICAgICAgICAgIC0+IDEuMjMwMDAwRSs5NiBDbGFtcGVkCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NsYXNzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NsYXNzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE1YmMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY2xhc3MuZGVjVGVzdApAQCAtMCwwICsxLDEzMSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjbGFzcy5kZWNUZXN0IC0tIENsYXNzIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFtOZXcgMjAwNi4xMS4yN10KKworcHJlY2lzaW9uOiAgIDkKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworY2xhc3gwMDEgIGNsYXNzICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworY2xhc3gwMDIgIGNsYXNzICAgIDAuMDAgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworY2xhc3gwMDMgIGNsYXNzICAgIDBFKzUgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworY2xhc3gwMDQgIGNsYXNzICAgIDFFLTEwMDcgICAgICAgICAgICAgICAgICAtPiArU3Vibm9ybWFsCitjbGFzeDAwNSAgY2xhc3MgIDAuMUUtOTk5ICAgICAgICAgICAgICAgICAgIC0+ICtTdWJub3JtYWwKK2NsYXN4MDA2ICBjbGFzcyAgMC45OTk5OTk5OUUtOTk5ICAgICAgICAgICAgLT4gK1N1Ym5vcm1hbAorY2xhc3gwMDcgIGNsYXNzICAxLjAwMDAwMDAwRS05OTkgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDAwOCAgY2xhc3MgICAxRS05OTkgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDA5ICBjbGFzcyAgIDFFLTEwMCAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gwMTAgIGNsYXNzICAgMUUtMTAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDAxMiAgY2xhc3MgICAxRS0xICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDEzICBjbGFzcyAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gwMTQgIGNsYXNzICAgMi41MCAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDAxNSAgY2xhc3MgICAxMDAuMTAwICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDE2ICBjbGFzcyAgIDFFKzMwICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gwMTcgIGNsYXNzICAgMUUrOTk5ICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDAxOCAgY2xhc3MgICA5Ljk5OTk5OTk5RSs5OTkgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MDE5ICBjbGFzcyAgIEluZiAgICAgICAgICAgICAgICAgICAgICAgLT4gK0luZmluaXR5CisKK2NsYXN4MDIxICBjbGFzcyAgIC0wICAgICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2NsYXN4MDIyICBjbGFzcyAgIC0wLjAwICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2NsYXN4MDIzICBjbGFzcyAgIC0wRSs1ICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2NsYXN4MDI0ICBjbGFzcyAgIC0xRS0xMDA3ICAgICAgICAgICAgICAgICAgLT4gLVN1Ym5vcm1hbAorY2xhc3gwMjUgIGNsYXNzICAtMC4xRS05OTkgICAgICAgICAgICAgICAgICAtPiAtU3Vibm9ybWFsCitjbGFzeDAyNiAgY2xhc3MgIC0wLjk5OTk5OTk5RS05OTkgICAgICAgICAgIC0+IC1TdWJub3JtYWwKK2NsYXN4MDI3ICBjbGFzcyAgLTEuMDAwMDAwMDBFLTk5OSAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gwMjggIGNsYXNzICAtMUUtOTk5ICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAyOSAgY2xhc3MgIC0xRS0xMDAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MDMwICBjbGFzcyAgLTFFLTEwICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gwMzIgIGNsYXNzICAtMUUtMSAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAzMyAgY2xhc3MgIC0xICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MDM0ICBjbGFzcyAgLTIuNTAgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gwMzUgIGNsYXNzICAtMTAwLjEwMCAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAzNiAgY2xhc3MgIC0xRSszMCAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MDM3ICBjbGFzcyAgLTFFKzk5OSAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gwMzggIGNsYXNzICAtOS45OTk5OTk5OUUrOTk5ICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDAzOSAgY2xhc3MgIC1JbmYgICAgICAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorCitjbGFzeDA0MSAgY2xhc3MgICBOYU4gICAgICAgICAgICAgICAgICAgICAgIC0+IE5hTgorY2xhc3gwNDIgIGNsYXNzICAtTmFOICAgICAgICAgICAgICAgICAgICAgICAtPiBOYU4KK2NsYXN4MDQzICBjbGFzcyAgK05hTjEyMzQ1ICAgICAgICAgICAgICAgICAgLT4gTmFOCitjbGFzeDA0NCAgY2xhc3MgICBzTmFOICAgICAgICAgICAgICAgICAgICAgIC0+IHNOYU4KK2NsYXN4MDQ1ICBjbGFzcyAgLXNOYU4gICAgICAgICAgICAgICAgICAgICAgLT4gc05hTgorY2xhc3gwNDYgIGNsYXNzICArc05hTjEyMzQ1ICAgICAgICAgICAgICAgICAtPiBzTmFOCisKKworLS0gZGVjaW1hbDY0IGJvdW5kcworCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitjbGFzeDIwMSAgY2xhc3MgICAgMCAgICAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitjbGFzeDIwMiAgY2xhc3MgICAgMC4wMCAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitjbGFzeDIwMyAgY2xhc3MgICAgMEUrNSAgICAgICAgICAgICAgICAgICAgIC0+ICtaZXJvCitjbGFzeDIwNCAgY2xhc3MgICAgMUUtMzk2ICAgICAgICAgICAgICAgICAgIC0+ICtTdWJub3JtYWwKK2NsYXN4MjA1ICBjbGFzcyAgMC4xRS0zODMgICAgICAgICAgICAgICAgICAgLT4gK1N1Ym5vcm1hbAorY2xhc3gyMDYgIGNsYXNzICAwLjk5OTk5OTk5OTk5OTk5OUUtMzgzICAgICAtPiArU3Vibm9ybWFsCitjbGFzeDIwNyAgY2xhc3MgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0+ICtOb3JtYWwKK2NsYXN4MjA4ICBjbGFzcyAgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gyMDkgIGNsYXNzICAgMUUtMTAwICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDIxMCAgY2xhc3MgICAxRS0xMCAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MjEyICBjbGFzcyAgIDFFLTEgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gyMTMgIGNsYXNzICAgMSAgICAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDIxNCAgY2xhc3MgICAyLjUwICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MjE1ICBjbGFzcyAgIDEwMC4xMDAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorY2xhc3gyMTYgIGNsYXNzICAgMUUrMzAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitjbGFzeDIxNyAgY2xhc3MgICAxRSszODQgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2NsYXN4MjE4ICBjbGFzcyAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgLT4gK05vcm1hbAorY2xhc3gyMTkgIGNsYXNzICAgSW5mICAgICAgICAgICAgICAgICAgICAgICAtPiArSW5maW5pdHkKKworY2xhc3gyMjEgIGNsYXNzICAgLTAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworY2xhc3gyMjIgIGNsYXNzICAgLTAuMDAgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworY2xhc3gyMjMgIGNsYXNzICAgLTBFKzUgICAgICAgICAgICAgICAgICAgICAtPiAtWmVybworY2xhc3gyMjQgIGNsYXNzICAgLTFFLTM5NiAgICAgICAgICAgICAgICAgICAtPiAtU3Vibm9ybWFsCitjbGFzeDIyNSAgY2xhc3MgIC0wLjFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IC1TdWJub3JtYWwKK2NsYXN4MjI2ICBjbGFzcyAgLTAuOTk5OTk5OTk5OTk5OTk5RS0zODMgICAgLT4gLVN1Ym5vcm1hbAorY2xhc3gyMjcgIGNsYXNzICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAtPiAtTm9ybWFsCitjbGFzeDIyOCAgY2xhc3MgIC0xRS0zODMgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjI5ICBjbGFzcyAgLTFFLTEwMCAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gyMzAgIGNsYXNzICAtMUUtMTAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDIzMiAgY2xhc3MgIC0xRS0xICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjMzICBjbGFzcyAgLTEgICAgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gyMzQgIGNsYXNzICAtMi41MCAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDIzNSAgY2xhc3MgIC0xMDAuMTAwICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjM2ICBjbGFzcyAgLTFFKzMwICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorY2xhc3gyMzcgIGNsYXNzICAtMUUrMzg0ICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitjbGFzeDIzOCAgY2xhc3MgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgIC0+IC1Ob3JtYWwKK2NsYXN4MjM5ICBjbGFzcyAgLUluZiAgICAgICAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CisKK2NsYXN4MjQxICBjbGFzcyAgIE5hTiAgICAgICAgICAgICAgICAgICAgICAgLT4gTmFOCitjbGFzeDI0MiAgY2xhc3MgIC1OYU4gICAgICAgICAgICAgICAgICAgICAgIC0+IE5hTgorY2xhc3gyNDMgIGNsYXNzICArTmFOMTIzNDUgICAgICAgICAgICAgICAgICAtPiBOYU4KK2NsYXN4MjQ0ICBjbGFzcyAgIHNOYU4gICAgICAgICAgICAgICAgICAgICAgLT4gc05hTgorY2xhc3gyNDUgIGNsYXNzICAtc05hTiAgICAgICAgICAgICAgICAgICAgICAtPiBzTmFOCitjbGFzeDI0NiAgY2xhc3MgICtzTmFOMTIzNDUgICAgICAgICAgICAgICAgIC0+IHNOYU4KKworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29tcGFyZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb21wYXJlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc3MTMwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29tcGFyZS5kZWNUZXN0CkBAIC0wLDAgKzEsNzU4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNvbXBhcmUuZGVjVGVzdCAtLSBkZWNpbWFsIGNvbXBhcmlzb24gdGhhdCBhbGxvd3MgcXVpZXQgTmFOcyAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gTm90ZSB0aGF0IHdlIGNhbm5vdCBhc3N1bWUgYWRkL3N1YnRyYWN0IHRlc3RzIGNvdmVyIHBhdGhzIGFkZXF1YXRlbHksCistLSBoZXJlLCBiZWNhdXNlIHRoZSBjb2RlIG1pZ2h0IGJlIHF1aXRlIGRpZmZlcmVudCAoY29tcGFyaXNvbiBjYW5ub3QKKy0tIG92ZXJmbG93IG9yIHVuZGVyZmxvdywgc28gYWN0dWFsIHN1YnRyYWN0aW9ucyBhcmUgbm90IG5lY2Vzc2FyeSkuCisKK2V4dGVuZGVkOiAxCisKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworLS0gc2FuaXR5IGNoZWNrcworY29teDAwMSBjb21wYXJlICAtMiAgLTIgIC0+IDAKK2NvbXgwMDIgY29tcGFyZSAgLTIgIC0xICAtPiAtMQorY29teDAwMyBjb21wYXJlICAtMiAgIDAgIC0+IC0xCitjb214MDA0IGNvbXBhcmUgIC0yICAgMSAgLT4gLTEKK2NvbXgwMDUgY29tcGFyZSAgLTIgICAyICAtPiAtMQorY29teDAwNiBjb21wYXJlICAtMSAgLTIgIC0+IDEKK2NvbXgwMDcgY29tcGFyZSAgLTEgIC0xICAtPiAwCitjb214MDA4IGNvbXBhcmUgIC0xICAgMCAgLT4gLTEKK2NvbXgwMDkgY29tcGFyZSAgLTEgICAxICAtPiAtMQorY29teDAxMCBjb21wYXJlICAtMSAgIDIgIC0+IC0xCitjb214MDExIGNvbXBhcmUgICAwICAtMiAgLT4gMQorY29teDAxMiBjb21wYXJlICAgMCAgLTEgIC0+IDEKK2NvbXgwMTMgY29tcGFyZSAgIDAgICAwICAtPiAwCitjb214MDE0IGNvbXBhcmUgICAwICAgMSAgLT4gLTEKK2NvbXgwMTUgY29tcGFyZSAgIDAgICAyICAtPiAtMQorY29teDAxNiBjb21wYXJlICAgMSAgLTIgIC0+IDEKK2NvbXgwMTcgY29tcGFyZSAgIDEgIC0xICAtPiAxCitjb214MDE4IGNvbXBhcmUgICAxICAgMCAgLT4gMQorY29teDAxOSBjb21wYXJlICAgMSAgIDEgIC0+IDAKK2NvbXgwMjAgY29tcGFyZSAgIDEgICAyICAtPiAtMQorY29teDAyMSBjb21wYXJlICAgMiAgLTIgIC0+IDEKK2NvbXgwMjIgY29tcGFyZSAgIDIgIC0xICAtPiAxCitjb214MDIzIGNvbXBhcmUgICAyICAgMCAgLT4gMQorY29teDAyNSBjb21wYXJlICAgMiAgIDEgIC0+IDEKK2NvbXgwMjYgY29tcGFyZSAgIDIgICAyICAtPiAwCisKK2NvbXgwMzEgY29tcGFyZSAgLTIwICAtMjAgIC0+IDAKK2NvbXgwMzIgY29tcGFyZSAgLTIwICAtMTAgIC0+IC0xCitjb214MDMzIGNvbXBhcmUgIC0yMCAgIDAwICAtPiAtMQorY29teDAzNCBjb21wYXJlICAtMjAgICAxMCAgLT4gLTEKK2NvbXgwMzUgY29tcGFyZSAgLTIwICAgMjAgIC0+IC0xCitjb214MDM2IGNvbXBhcmUgIC0xMCAgLTIwICAtPiAxCitjb214MDM3IGNvbXBhcmUgIC0xMCAgLTEwICAtPiAwCitjb214MDM4IGNvbXBhcmUgIC0xMCAgIDAwICAtPiAtMQorY29teDAzOSBjb21wYXJlICAtMTAgICAxMCAgLT4gLTEKK2NvbXgwNDAgY29tcGFyZSAgLTEwICAgMjAgIC0+IC0xCitjb214MDQxIGNvbXBhcmUgICAwMCAgLTIwICAtPiAxCitjb214MDQyIGNvbXBhcmUgICAwMCAgLTEwICAtPiAxCitjb214MDQzIGNvbXBhcmUgICAwMCAgIDAwICAtPiAwCitjb214MDQ0IGNvbXBhcmUgICAwMCAgIDEwICAtPiAtMQorY29teDA0NSBjb21wYXJlICAgMDAgICAyMCAgLT4gLTEKK2NvbXgwNDYgY29tcGFyZSAgIDEwICAtMjAgIC0+IDEKK2NvbXgwNDcgY29tcGFyZSAgIDEwICAtMTAgIC0+IDEKK2NvbXgwNDggY29tcGFyZSAgIDEwICAgMDAgIC0+IDEKK2NvbXgwNDkgY29tcGFyZSAgIDEwICAgMTAgIC0+IDAKK2NvbXgwNTAgY29tcGFyZSAgIDEwICAgMjAgIC0+IC0xCitjb214MDUxIGNvbXBhcmUgICAyMCAgLTIwICAtPiAxCitjb214MDUyIGNvbXBhcmUgICAyMCAgLTEwICAtPiAxCitjb214MDUzIGNvbXBhcmUgICAyMCAgIDAwICAtPiAxCitjb214MDU1IGNvbXBhcmUgICAyMCAgIDEwICAtPiAxCitjb214MDU2IGNvbXBhcmUgICAyMCAgIDIwICAtPiAwCisKK2NvbXgwNjEgY29tcGFyZSAgLTIuMCAgLTIuMCAgLT4gMAorY29teDA2MiBjb21wYXJlICAtMi4wICAtMS4wICAtPiAtMQorY29teDA2MyBjb21wYXJlICAtMi4wICAgMC4wICAtPiAtMQorY29teDA2NCBjb21wYXJlICAtMi4wICAgMS4wICAtPiAtMQorY29teDA2NSBjb21wYXJlICAtMi4wICAgMi4wICAtPiAtMQorY29teDA2NiBjb21wYXJlICAtMS4wICAtMi4wICAtPiAxCitjb214MDY3IGNvbXBhcmUgIC0xLjAgIC0xLjAgIC0+IDAKK2NvbXgwNjggY29tcGFyZSAgLTEuMCAgIDAuMCAgLT4gLTEKK2NvbXgwNjkgY29tcGFyZSAgLTEuMCAgIDEuMCAgLT4gLTEKK2NvbXgwNzAgY29tcGFyZSAgLTEuMCAgIDIuMCAgLT4gLTEKK2NvbXgwNzEgY29tcGFyZSAgIDAuMCAgLTIuMCAgLT4gMQorY29teDA3MiBjb21wYXJlICAgMC4wICAtMS4wICAtPiAxCitjb214MDczIGNvbXBhcmUgICAwLjAgICAwLjAgIC0+IDAKK2NvbXgwNzQgY29tcGFyZSAgIDAuMCAgIDEuMCAgLT4gLTEKK2NvbXgwNzUgY29tcGFyZSAgIDAuMCAgIDIuMCAgLT4gLTEKK2NvbXgwNzYgY29tcGFyZSAgIDEuMCAgLTIuMCAgLT4gMQorY29teDA3NyBjb21wYXJlICAgMS4wICAtMS4wICAtPiAxCitjb214MDc4IGNvbXBhcmUgICAxLjAgICAwLjAgIC0+IDEKK2NvbXgwNzkgY29tcGFyZSAgIDEuMCAgIDEuMCAgLT4gMAorY29teDA4MCBjb21wYXJlICAgMS4wICAgMi4wICAtPiAtMQorY29teDA4MSBjb21wYXJlICAgMi4wICAtMi4wICAtPiAxCitjb214MDgyIGNvbXBhcmUgICAyLjAgIC0xLjAgIC0+IDEKK2NvbXgwODMgY29tcGFyZSAgIDIuMCAgIDAuMCAgLT4gMQorY29teDA4NSBjb21wYXJlICAgMi4wICAgMS4wICAtPiAxCitjb214MDg2IGNvbXBhcmUgICAyLjAgICAyLjAgIC0+IDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorY29teDA5NSBjb21wYXJlICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgOS45OTk5OTk5OUUrOTk5OTk5OTk5ICAtPiAwCitjb214MDk2IGNvbXBhcmUgLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgIC0+IC0xCitjb214MDk3IGNvbXBhcmUgIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IC0+IDEKK2NvbXgwOTggY29tcGFyZSAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgLT4gMAorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKK2NvbXgxMDAgY29tcGFyZSAgIDcuMCAgICA3LjAgICAgLT4gMAorY29teDEwMSBjb21wYXJlICAgNy4wICAgIDcgICAgICAtPiAwCitjb214MTAyIGNvbXBhcmUgICA3ICAgICAgNy4wICAgIC0+IDAKK2NvbXgxMDMgY29tcGFyZSAgIDdFKzAgICA3LjAgICAgLT4gMAorY29teDEwNCBjb21wYXJlICAgNzBFLTEgIDcuMCAgICAtPiAwCitjb214MTA1IGNvbXBhcmUgICAwLjdFKzEgNyAgICAgIC0+IDAKK2NvbXgxMDYgY29tcGFyZSAgIDcwRS0xICA3ICAgICAgLT4gMAorY29teDEwNyBjb21wYXJlICAgNy4wICAgIDdFKzAgICAtPiAwCitjb214MTA4IGNvbXBhcmUgICA3LjAgICAgNzBFLTEgIC0+IDAKK2NvbXgxMDkgY29tcGFyZSAgIDcgICAgICAwLjdFKzEgLT4gMAorY29teDExMCBjb21wYXJlICAgNyAgICAgIDcwRS0xICAtPiAwCisKK2NvbXgxMjAgY29tcGFyZSAgIDguMCAgICA3LjAgICAgLT4gMQorY29teDEyMSBjb21wYXJlICAgOC4wICAgIDcgICAgICAtPiAxCitjb214MTIyIGNvbXBhcmUgICA4ICAgICAgNy4wICAgIC0+IDEKK2NvbXgxMjMgY29tcGFyZSAgIDhFKzAgICA3LjAgICAgLT4gMQorY29teDEyNCBjb21wYXJlICAgODBFLTEgIDcuMCAgICAtPiAxCitjb214MTI1IGNvbXBhcmUgICAwLjhFKzEgNyAgICAgIC0+IDEKK2NvbXgxMjYgY29tcGFyZSAgIDgwRS0xICA3ICAgICAgLT4gMQorY29teDEyNyBjb21wYXJlICAgOC4wICAgIDdFKzAgICAtPiAxCitjb214MTI4IGNvbXBhcmUgICA4LjAgICAgNzBFLTEgIC0+IDEKK2NvbXgxMjkgY29tcGFyZSAgIDggICAgICAwLjdFKzEgIC0+IDEKK2NvbXgxMzAgY29tcGFyZSAgIDggICAgICA3MEUtMSAgLT4gMQorCitjb214MTQwIGNvbXBhcmUgICA4LjAgICAgOS4wICAgIC0+IC0xCitjb214MTQxIGNvbXBhcmUgICA4LjAgICAgOSAgICAgIC0+IC0xCitjb214MTQyIGNvbXBhcmUgICA4ICAgICAgOS4wICAgIC0+IC0xCitjb214MTQzIGNvbXBhcmUgICA4RSswICAgOS4wICAgIC0+IC0xCitjb214MTQ0IGNvbXBhcmUgICA4MEUtMSAgOS4wICAgIC0+IC0xCitjb214MTQ1IGNvbXBhcmUgICAwLjhFKzEgOSAgICAgIC0+IC0xCitjb214MTQ2IGNvbXBhcmUgICA4MEUtMSAgOSAgICAgIC0+IC0xCitjb214MTQ3IGNvbXBhcmUgICA4LjAgICAgOUUrMCAgIC0+IC0xCitjb214MTQ4IGNvbXBhcmUgICA4LjAgICAgOTBFLTEgIC0+IC0xCitjb214MTQ5IGNvbXBhcmUgICA4ICAgICAgMC45RSsxIC0+IC0xCitjb214MTUwIGNvbXBhcmUgICA4ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2NvbXgyMDAgY29tcGFyZSAgLTcuMCAgICA3LjAgICAgLT4gLTEKK2NvbXgyMDEgY29tcGFyZSAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2NvbXgyMDIgY29tcGFyZSAgLTcgICAgICA3LjAgICAgLT4gLTEKK2NvbXgyMDMgY29tcGFyZSAgLTdFKzAgICA3LjAgICAgLT4gLTEKK2NvbXgyMDQgY29tcGFyZSAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2NvbXgyMDUgY29tcGFyZSAgLTAuN0UrMSA3ICAgICAgLT4gLTEKK2NvbXgyMDYgY29tcGFyZSAgLTcwRS0xICA3ICAgICAgLT4gLTEKK2NvbXgyMDcgY29tcGFyZSAgLTcuMCAgICA3RSswICAgLT4gLTEKK2NvbXgyMDggY29tcGFyZSAgLTcuMCAgICA3MEUtMSAgLT4gLTEKK2NvbXgyMDkgY29tcGFyZSAgLTcgICAgICAwLjdFKzEgLT4gLTEKK2NvbXgyMTAgY29tcGFyZSAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworY29teDIyMCBjb21wYXJlICAtOC4wICAgIDcuMCAgICAtPiAtMQorY29teDIyMSBjb21wYXJlICAtOC4wICAgIDcgICAgICAtPiAtMQorY29teDIyMiBjb21wYXJlICAtOCAgICAgIDcuMCAgICAtPiAtMQorY29teDIyMyBjb21wYXJlICAtOEUrMCAgIDcuMCAgICAtPiAtMQorY29teDIyNCBjb21wYXJlICAtODBFLTEgIDcuMCAgICAtPiAtMQorY29teDIyNSBjb21wYXJlICAtMC44RSsxIDcgICAgICAtPiAtMQorY29teDIyNiBjb21wYXJlICAtODBFLTEgIDcgICAgICAtPiAtMQorY29teDIyNyBjb21wYXJlICAtOC4wICAgIDdFKzAgICAtPiAtMQorY29teDIyOCBjb21wYXJlICAtOC4wICAgIDcwRS0xICAtPiAtMQorY29teDIyOSBjb21wYXJlICAtOCAgICAgIDAuN0UrMSAtPiAtMQorY29teDIzMCBjb21wYXJlICAtOCAgICAgIDcwRS0xICAtPiAtMQorCitjb214MjQwIGNvbXBhcmUgIC04LjAgICAgOS4wICAgIC0+IC0xCitjb214MjQxIGNvbXBhcmUgIC04LjAgICAgOSAgICAgIC0+IC0xCitjb214MjQyIGNvbXBhcmUgIC04ICAgICAgOS4wICAgIC0+IC0xCitjb214MjQzIGNvbXBhcmUgIC04RSswICAgOS4wICAgIC0+IC0xCitjb214MjQ0IGNvbXBhcmUgIC04MEUtMSAgOS4wICAgIC0+IC0xCitjb214MjQ1IGNvbXBhcmUgIC0wLjhFKzEgOSAgICAgIC0+IC0xCitjb214MjQ2IGNvbXBhcmUgIC04MEUtMSAgOSAgICAgIC0+IC0xCitjb214MjQ3IGNvbXBhcmUgIC04LjAgICAgOUUrMCAgIC0+IC0xCitjb214MjQ4IGNvbXBhcmUgIC04LjAgICAgOTBFLTEgIC0+IC0xCitjb214MjQ5IGNvbXBhcmUgIC04ICAgICAgMC45RSsxIC0+IC0xCitjb214MjUwIGNvbXBhcmUgIC04ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2NvbXgzMDAgY29tcGFyZSAgIDcuMCAgICAtNy4wICAgIC0+IDEKK2NvbXgzMDEgY29tcGFyZSAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2NvbXgzMDIgY29tcGFyZSAgIDcgICAgICAtNy4wICAgIC0+IDEKK2NvbXgzMDMgY29tcGFyZSAgIDdFKzAgICAtNy4wICAgIC0+IDEKK2NvbXgzMDQgY29tcGFyZSAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2NvbXgzMDUgY29tcGFyZSAgIC43RSsxICAtNyAgICAgIC0+IDEKK2NvbXgzMDYgY29tcGFyZSAgIDcwRS0xICAtNyAgICAgIC0+IDEKK2NvbXgzMDcgY29tcGFyZSAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2NvbXgzMDggY29tcGFyZSAgIDcuMCAgICAtNzBFLTEgIC0+IDEKK2NvbXgzMDkgY29tcGFyZSAgIDcgICAgICAtLjdFKzEgIC0+IDEKK2NvbXgzMTAgY29tcGFyZSAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworY29teDMyMCBjb21wYXJlICAgOC4wICAgIC03LjAgICAgLT4gMQorY29teDMyMSBjb21wYXJlICAgOC4wICAgIC03ICAgICAgLT4gMQorY29teDMyMiBjb21wYXJlICAgOCAgICAgIC03LjAgICAgLT4gMQorY29teDMyMyBjb21wYXJlICAgOEUrMCAgIC03LjAgICAgLT4gMQorY29teDMyNCBjb21wYXJlICAgODBFLTEgIC03LjAgICAgLT4gMQorY29teDMyNSBjb21wYXJlICAgLjhFKzEgIC03ICAgICAgLT4gMQorY29teDMyNiBjb21wYXJlICAgODBFLTEgIC03ICAgICAgLT4gMQorY29teDMyNyBjb21wYXJlICAgOC4wICAgIC03RSswICAgLT4gMQorY29teDMyOCBjb21wYXJlICAgOC4wICAgIC03MEUtMSAgLT4gMQorY29teDMyOSBjb21wYXJlICAgOCAgICAgIC0uN0UrMSAgLT4gMQorY29teDMzMCBjb21wYXJlICAgOCAgICAgIC03MEUtMSAgLT4gMQorCitjb214MzQwIGNvbXBhcmUgICA4LjAgICAgLTkuMCAgICAtPiAxCitjb214MzQxIGNvbXBhcmUgICA4LjAgICAgLTkgICAgICAtPiAxCitjb214MzQyIGNvbXBhcmUgICA4ICAgICAgLTkuMCAgICAtPiAxCitjb214MzQzIGNvbXBhcmUgICA4RSswICAgLTkuMCAgICAtPiAxCitjb214MzQ0IGNvbXBhcmUgICA4MEUtMSAgLTkuMCAgICAtPiAxCitjb214MzQ1IGNvbXBhcmUgICAuOEUrMSAgLTkgICAgICAtPiAxCitjb214MzQ2IGNvbXBhcmUgICA4MEUtMSAgLTkgICAgICAtPiAxCitjb214MzQ3IGNvbXBhcmUgICA4LjAgICAgLTlFKzAgICAtPiAxCitjb214MzQ4IGNvbXBhcmUgICA4LjAgICAgLTkwRS0xICAtPiAxCitjb214MzQ5IGNvbXBhcmUgICA4ICAgICAgLS45RSsxICAtPiAxCitjb214MzUwIGNvbXBhcmUgICA4ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2NvbXg0MDAgY29tcGFyZSAgIC03LjAgICAgLTcuMCAgICAtPiAwCitjb214NDAxIGNvbXBhcmUgICAtNy4wICAgIC03ICAgICAgLT4gMAorY29teDQwMiBjb21wYXJlICAgLTcgICAgICAtNy4wICAgIC0+IDAKK2NvbXg0MDMgY29tcGFyZSAgIC03RSswICAgLTcuMCAgICAtPiAwCitjb214NDA0IGNvbXBhcmUgICAtNzBFLTEgIC03LjAgICAgLT4gMAorY29teDQwNSBjb21wYXJlICAgLS43RSsxICAtNyAgICAgIC0+IDAKK2NvbXg0MDYgY29tcGFyZSAgIC03MEUtMSAgLTcgICAgICAtPiAwCitjb214NDA3IGNvbXBhcmUgICAtNy4wICAgIC03RSswICAgLT4gMAorY29teDQwOCBjb21wYXJlICAgLTcuMCAgICAtNzBFLTEgIC0+IDAKK2NvbXg0MDkgY29tcGFyZSAgIC03ICAgICAgLS43RSsxICAtPiAwCitjb214NDEwIGNvbXBhcmUgICAtNyAgICAgIC03MEUtMSAgLT4gMAorCitjb214NDIwIGNvbXBhcmUgICAtOC4wICAgIC03LjAgICAgLT4gLTEKK2NvbXg0MjEgY29tcGFyZSAgIC04LjAgICAgLTcgICAgICAtPiAtMQorY29teDQyMiBjb21wYXJlICAgLTggICAgICAtNy4wICAgIC0+IC0xCitjb214NDIzIGNvbXBhcmUgICAtOEUrMCAgIC03LjAgICAgLT4gLTEKK2NvbXg0MjQgY29tcGFyZSAgIC04MEUtMSAgLTcuMCAgICAtPiAtMQorY29teDQyNSBjb21wYXJlICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitjb214NDI2IGNvbXBhcmUgICAtODBFLTEgIC03ICAgICAgLT4gLTEKK2NvbXg0MjcgY29tcGFyZSAgIC04LjAgICAgLTdFKzAgICAtPiAtMQorY29teDQyOCBjb21wYXJlICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitjb214NDI5IGNvbXBhcmUgICAtOCAgICAgIC0uN0UrMSAgLT4gLTEKK2NvbXg0MzAgY29tcGFyZSAgIC04ICAgICAgLTcwRS0xICAtPiAtMQorCitjb214NDQwIGNvbXBhcmUgICAtOC4wICAgIC05LjAgICAgLT4gMQorY29teDQ0MSBjb21wYXJlICAgLTguMCAgICAtOSAgICAgIC0+IDEKK2NvbXg0NDIgY29tcGFyZSAgIC04ICAgICAgLTkuMCAgICAtPiAxCitjb214NDQzIGNvbXBhcmUgICAtOEUrMCAgIC05LjAgICAgLT4gMQorY29teDQ0NCBjb21wYXJlICAgLTgwRS0xICAtOS4wICAgIC0+IDEKK2NvbXg0NDUgY29tcGFyZSAgIC0uOEUrMSAgLTkgICAgICAtPiAxCitjb214NDQ2IGNvbXBhcmUgICAtODBFLTEgIC05ICAgICAgLT4gMQorY29teDQ0NyBjb21wYXJlICAgLTguMCAgICAtOUUrMCAgIC0+IDEKK2NvbXg0NDggY29tcGFyZSAgIC04LjAgICAgLTkwRS0xICAtPiAxCitjb214NDQ5IGNvbXBhcmUgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorY29teDQ1MCBjb21wYXJlICAgLTggICAgICAtOTBFLTEgIC0+IDEKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitjb214NDUxIGNvbXBhcmUgICAgICAxLjAgICAgICAgMC4xICAtPiAxCitjb214NDUyIGNvbXBhcmUgICAgICAwLjEgICAgICAgMS4wICAtPiAtMQorY29teDQ1MyBjb21wYXJlICAgICAxMC4wICAgICAgIDAuMSAgLT4gMQorY29teDQ1NCBjb21wYXJlICAgICAgMC4xICAgICAgMTAuMCAgLT4gLTEKK2NvbXg0NTUgY29tcGFyZSAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEKK2NvbXg0NTYgY29tcGFyZSAgICAgIDEuMCAgICAgICAxMDAgIC0+IC0xCitjb214NDU3IGNvbXBhcmUgICAgIDEwMDAgICAgICAxMC4wICAtPiAxCitjb214NDU4IGNvbXBhcmUgICAgIDEwLjAgICAgICAxMDAwICAtPiAtMQorY29teDQ1OSBjb21wYXJlICAgIDEwMDAwICAgICAxMDAuMCAgLT4gMQorY29teDQ2MCBjb21wYXJlICAgIDEwMC4wICAgICAxMDAwMCAgLT4gLTEKK2NvbXg0NjEgY29tcGFyZSAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEKK2NvbXg0NjIgY29tcGFyZSAgIDEwMDAuMCAgICAxMDAwMDAgIC0+IC0xCitjb214NDYzIGNvbXBhcmUgIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxCitjb214NDY0IGNvbXBhcmUgIDEwMDAwLjAgICAxMDAwMDAwICAtPiAtMQorCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK3ByZWNpc2lvbjogNDAKK2NvbXg0NzAgY29tcGFyZSAxMjMuNDU2MDAwMDAwMDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorY29teDQ3MSBjb21wYXJlIDEyMy40NTYwMDAwMDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2NvbXg0NzIgY29tcGFyZSAxMjMuNDU2MDAwMDAwMDAwMDBFNzg5IDEyMy40NTZFNzg5IC0+IDAKK2NvbXg0NzMgY29tcGFyZSAxMjMuNDU2MDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorY29teDQ3NCBjb21wYXJlIDEyMy40NTYwMDAwMDAwMDBFNzg5IDEyMy40NTZFNzg5IC0+IDAKK2NvbXg0NzUgY29tcGFyZSAxMjMuNDU2MDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2NvbXg0NzYgY29tcGFyZSAxMjMuNDU2MDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorY29teDQ3NyBjb21wYXJlIDEyMy40NTYwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2NvbXg0NzggY29tcGFyZSAxMjMuNDU2MDAwMDBFNzg5IDEyMy40NTZFNzg5IC0+IDAKK2NvbXg0NzkgY29tcGFyZSAxMjMuNDU2MDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorY29teDQ4MCBjb21wYXJlIDEyMy40NTYwMDBFNzg5IDEyMy40NTZFNzg5IC0+IDAKK2NvbXg0ODEgY29tcGFyZSAxMjMuNDU2MDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2NvbXg0ODIgY29tcGFyZSAxMjMuNDU2MEU3ODkgMTIzLjQ1NkU3ODkgLT4gMAorY29teDQ4MyBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2NvbXg0ODQgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwMDAwMEUtODkgLT4gMAorY29teDQ4NSBjb21wYXJlIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDAwMDAwMDBFNzg5IC0+IDAKK2NvbXg0ODYgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwMDBFLTg5IC0+IDAKK2NvbXg0ODcgY29tcGFyZSAxMjMuNDU2RTc4OSAxMjMuNDU2MDAwMDAwMDAwMEU3ODkgLT4gMAorY29teDQ4OCBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDBFLTg5IC0+IDAKK2NvbXg0ODkgY29tcGFyZSAxMjMuNDU2RTc4OSAxMjMuNDU2MDAwMDAwMDBFNzg5IC0+IDAKK2NvbXg0OTAgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMEUtODkgLT4gMAorY29teDQ5MSBjb21wYXJlIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDBFNzg5IC0+IDAKK2NvbXg0OTIgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDBFLTg5IC0+IDAKK2NvbXg0OTMgY29tcGFyZSAxMjMuNDU2RTc4OSAxMjMuNDU2MDAwMEU3ODkgLT4gMAorY29teDQ5NCBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDBFLTg5IC0+IDAKK2NvbXg0OTUgY29tcGFyZSAxMjMuNDU2RTc4OSAxMjMuNDU2MDBFNzg5IC0+IDAKK2NvbXg0OTYgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MEUtODkgLT4gMAorY29teDQ5NyBjb21wYXJlIDEyMy40NTZFNzg5IDEyMy40NTZFNzg5IC0+IDAKKworLS0gd2lkZS1yYW5naW5nLCBhcm91bmQgcHJlY2lzaW9uOyBzaWducyBlcXVhbAorcHJlY2lzaW9uOiA5Citjb214NTAwIGNvbXBhcmUgICAgMSAgICAgMUUtMTUgICAgLT4gMQorY29teDUwMSBjb21wYXJlICAgIDEgICAgIDFFLTE0ICAgIC0+IDEKK2NvbXg1MDIgY29tcGFyZSAgICAxICAgICAxRS0xMyAgICAtPiAxCitjb214NTAzIGNvbXBhcmUgICAgMSAgICAgMUUtMTIgICAgLT4gMQorY29teDUwNCBjb21wYXJlICAgIDEgICAgIDFFLTExICAgIC0+IDEKK2NvbXg1MDUgY29tcGFyZSAgICAxICAgICAxRS0xMCAgICAtPiAxCitjb214NTA2IGNvbXBhcmUgICAgMSAgICAgMUUtOSAgICAgLT4gMQorY29teDUwNyBjb21wYXJlICAgIDEgICAgIDFFLTggICAgIC0+IDEKK2NvbXg1MDggY29tcGFyZSAgICAxICAgICAxRS03ICAgICAtPiAxCitjb214NTA5IGNvbXBhcmUgICAgMSAgICAgMUUtNiAgICAgLT4gMQorY29teDUxMCBjb21wYXJlICAgIDEgICAgIDFFLTUgICAgIC0+IDEKK2NvbXg1MTEgY29tcGFyZSAgICAxICAgICAxRS00ICAgICAtPiAxCitjb214NTEyIGNvbXBhcmUgICAgMSAgICAgMUUtMyAgICAgLT4gMQorY29teDUxMyBjb21wYXJlICAgIDEgICAgIDFFLTIgICAgIC0+IDEKK2NvbXg1MTQgY29tcGFyZSAgICAxICAgICAxRS0xICAgICAtPiAxCitjb214NTE1IGNvbXBhcmUgICAgMSAgICAgMUUtMCAgICAgLT4gMAorY29teDUxNiBjb21wYXJlICAgIDEgICAgIDFFKzEgICAgIC0+IC0xCitjb214NTE3IGNvbXBhcmUgICAgMSAgICAgMUUrMiAgICAgLT4gLTEKK2NvbXg1MTggY29tcGFyZSAgICAxICAgICAxRSszICAgICAtPiAtMQorY29teDUxOSBjb21wYXJlICAgIDEgICAgIDFFKzQgICAgIC0+IC0xCitjb214NTIxIGNvbXBhcmUgICAgMSAgICAgMUUrNSAgICAgLT4gLTEKK2NvbXg1MjIgY29tcGFyZSAgICAxICAgICAxRSs2ICAgICAtPiAtMQorY29teDUyMyBjb21wYXJlICAgIDEgICAgIDFFKzcgICAgIC0+IC0xCitjb214NTI0IGNvbXBhcmUgICAgMSAgICAgMUUrOCAgICAgLT4gLTEKK2NvbXg1MjUgY29tcGFyZSAgICAxICAgICAxRSs5ICAgICAtPiAtMQorY29teDUyNiBjb21wYXJlICAgIDEgICAgIDFFKzEwICAgIC0+IC0xCitjb214NTI3IGNvbXBhcmUgICAgMSAgICAgMUUrMTEgICAgLT4gLTEKK2NvbXg1MjggY29tcGFyZSAgICAxICAgICAxRSsxMiAgICAtPiAtMQorY29teDUyOSBjb21wYXJlICAgIDEgICAgIDFFKzEzICAgIC0+IC0xCitjb214NTMwIGNvbXBhcmUgICAgMSAgICAgMUUrMTQgICAgLT4gLTEKK2NvbXg1MzEgY29tcGFyZSAgICAxICAgICAxRSsxNSAgICAtPiAtMQorLS0gTFIgc3dhcAorY29teDU0MCBjb21wYXJlICAgIDFFLTE1ICAxICAgICAgIC0+IC0xCitjb214NTQxIGNvbXBhcmUgICAgMUUtMTQgIDEgICAgICAgLT4gLTEKK2NvbXg1NDIgY29tcGFyZSAgICAxRS0xMyAgMSAgICAgICAtPiAtMQorY29teDU0MyBjb21wYXJlICAgIDFFLTEyICAxICAgICAgIC0+IC0xCitjb214NTQ0IGNvbXBhcmUgICAgMUUtMTEgIDEgICAgICAgLT4gLTEKK2NvbXg1NDUgY29tcGFyZSAgICAxRS0xMCAgMSAgICAgICAtPiAtMQorY29teDU0NiBjb21wYXJlICAgIDFFLTkgICAxICAgICAgIC0+IC0xCitjb214NTQ3IGNvbXBhcmUgICAgMUUtOCAgIDEgICAgICAgLT4gLTEKK2NvbXg1NDggY29tcGFyZSAgICAxRS03ICAgMSAgICAgICAtPiAtMQorY29teDU0OSBjb21wYXJlICAgIDFFLTYgICAxICAgICAgIC0+IC0xCitjb214NTUwIGNvbXBhcmUgICAgMUUtNSAgIDEgICAgICAgLT4gLTEKK2NvbXg1NTEgY29tcGFyZSAgICAxRS00ICAgMSAgICAgICAtPiAtMQorY29teDU1MiBjb21wYXJlICAgIDFFLTMgICAxICAgICAgIC0+IC0xCitjb214NTUzIGNvbXBhcmUgICAgMUUtMiAgIDEgICAgICAgLT4gLTEKK2NvbXg1NTQgY29tcGFyZSAgICAxRS0xICAgMSAgICAgICAtPiAtMQorY29teDU1NSBjb21wYXJlICAgIDFFLTAgICAxICAgICAgIC0+ICAwCitjb214NTU2IGNvbXBhcmUgICAgMUUrMSAgIDEgICAgICAgLT4gIDEKK2NvbXg1NTcgY29tcGFyZSAgICAxRSsyICAgMSAgICAgICAtPiAgMQorY29teDU1OCBjb21wYXJlICAgIDFFKzMgICAxICAgICAgIC0+ICAxCitjb214NTU5IGNvbXBhcmUgICAgMUUrNCAgIDEgICAgICAgLT4gIDEKK2NvbXg1NjEgY29tcGFyZSAgICAxRSs1ICAgMSAgICAgICAtPiAgMQorY29teDU2MiBjb21wYXJlICAgIDFFKzYgICAxICAgICAgIC0+ICAxCitjb214NTYzIGNvbXBhcmUgICAgMUUrNyAgIDEgICAgICAgLT4gIDEKK2NvbXg1NjQgY29tcGFyZSAgICAxRSs4ICAgMSAgICAgICAtPiAgMQorY29teDU2NSBjb21wYXJlICAgIDFFKzkgICAxICAgICAgIC0+ICAxCitjb214NTY2IGNvbXBhcmUgICAgMUUrMTAgIDEgICAgICAgLT4gIDEKK2NvbXg1NjcgY29tcGFyZSAgICAxRSsxMSAgMSAgICAgICAtPiAgMQorY29teDU2OCBjb21wYXJlICAgIDFFKzEyICAxICAgICAgIC0+ICAxCitjb214NTY5IGNvbXBhcmUgICAgMUUrMTMgIDEgICAgICAgLT4gIDEKK2NvbXg1NzAgY29tcGFyZSAgICAxRSsxNCAgMSAgICAgICAtPiAgMQorY29teDU3MSBjb21wYXJlICAgIDFFKzE1ICAxICAgICAgIC0+ICAxCistLSBzaW1pbGFyIHdpdGggYSB1c2VmdWwgY29lZmZpY2llbnQsIG9uZSBzaWRlIG9ubHkKK2NvbXg1ODAgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE1ICAgIC0+IDEKK2NvbXg1ODEgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgIC0+IDEKK2NvbXg1ODIgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEzICAgIC0+IDEKK2NvbXg1ODMgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEyICAgIC0+IDEKK2NvbXg1ODQgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgIC0+IDEKK2NvbXg1ODUgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEwICAgIC0+IDEKK2NvbXg1ODYgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTkgICAgIC0+IDEKK2NvbXg1ODcgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgIC0+IDEKK2NvbXg1ODggY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTcgICAgIC0+IDEKK2NvbXg1ODkgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTYgICAgIC0+IC0xCitjb214NTkwIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAtPiAtMQorY29teDU5MSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNCAgICAgLT4gLTEKK2NvbXg1OTIgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTMgICAgIC0+IC0xCitjb214NTkzIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAtPiAtMQorY29teDU5NCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMSAgICAgLT4gLTEKK2NvbXg1OTUgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTAgICAgIC0+IC0xCitjb214NTk2IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAtPiAtMQorY29teDU5NyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMiAgICAgLT4gLTEKK2NvbXg1OTggY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzMgICAgIC0+IC0xCitjb214NTk5IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAtPiAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworcHJlY2lzaW9uOiAyMAorY29teDYwMCBjb21wYXJlICAgMTIgICAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitjb214NjAxIGNvbXBhcmUgICAxMi4wICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvbXg2MDIgY29tcGFyZSAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAtPiAtMQorY29teDYwMyBjb21wYXJlICAgMTIuMDAwICAgICAgICAxMi4yMzQ1IC0+IC0xCitjb214NjA0IGNvbXBhcmUgICAxMi4wMDAwICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvbXg2MDUgY29tcGFyZSAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAtPiAtMQorY29teDYwNiBjb21wYXJlICAgMTIuMDAwMDAwICAgICAxMi4yMzQ1IC0+IC0xCitjb214NjA3IGNvbXBhcmUgICAxMi4wMDAwMDAwICAgIDEyLjIzNDUgLT4gLTEKK2NvbXg2MDggY29tcGFyZSAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAtPiAtMQorY29teDYwOSBjb21wYXJlICAgMTIuMDAwMDAwMDAwICAxMi4yMzQ1IC0+IC0xCitjb214NjEwIGNvbXBhcmUgICAxMi4xMjM0IDEyICAgICAgICAgICAgLT4gIDEKK2NvbXg2MTEgY29tcGFyZSAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAtPiAgMQorY29teDYxMiBjb21wYXJlICAgMTIuMTIzNCAxMi4wMCAgICAgICAgIC0+ICAxCitjb214NjEzIGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMCAgICAgICAgLT4gIDEKK2NvbXg2MTQgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAtPiAgMQorY29teDYxNSBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMCAgICAgIC0+ICAxCitjb214NjE2IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwMCAgICAgLT4gIDEKK2NvbXg2MTcgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAtPiAgMQorY29teDYxOCBjb21wYXJlICAgMTIuMTIzNCAxMi4wMDAwMDAwMCAgIC0+ICAxCitjb214NjE5IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwMDAwMCAgLT4gIDEKK2NvbXg2MjAgY29tcGFyZSAgLTEyICAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorY29teDYyMSBjb21wYXJlICAtMTIuMCAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb214NjIyIGNvbXBhcmUgIC0xMi4wMCAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2NvbXg2MjMgY29tcGFyZSAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAtPiAgMQorY29teDYyNCBjb21wYXJlICAtMTIuMDAwMCAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb214NjI1IGNvbXBhcmUgIC0xMi4wMDAwMCAgICAgLTEyLjIzNDUgLT4gIDEKK2NvbXg2MjYgY29tcGFyZSAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAtPiAgMQorY29teDYyNyBjb21wYXJlICAtMTIuMDAwMDAwMCAgIC0xMi4yMzQ1IC0+ICAxCitjb214NjI4IGNvbXBhcmUgIC0xMi4wMDAwMDAwMCAgLTEyLjIzNDUgLT4gIDEKK2NvbXg2MjkgY29tcGFyZSAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAtPiAgMQorY29teDYzMCBjb21wYXJlICAtMTIuMTIzNCAtMTIgICAgICAgICAgIC0+IC0xCitjb214NjMxIGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wICAgICAgICAgLT4gLTEKK2NvbXg2MzIgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAtPiAtMQorY29teDYzMyBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwICAgICAgIC0+IC0xCitjb214NjM0IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwICAgICAgLT4gLTEKK2NvbXg2MzUgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAtPiAtMQorY29teDYzNiBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAwICAgIC0+IC0xCitjb214NjM3IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMDAwICAgLT4gLTEKK2NvbXg2MzggY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAtPiAtMQorY29teDYzOSBjb21wYXJlICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAwIC0+IC0xCitwcmVjaXNpb246IDkKKworLS0gZXh0ZW5kZWQgemVyb3MKK2NvbXg2NDAgY29tcGFyZSAgIDAgICAgIDAgICAtPiAwCitjb214NjQxIGNvbXBhcmUgICAwICAgIC0wICAgLT4gMAorY29teDY0MiBjb21wYXJlICAgMCAgICAtMC4wIC0+IDAKK2NvbXg2NDMgY29tcGFyZSAgIDAgICAgIDAuMCAtPiAwCitjb214NjQ0IGNvbXBhcmUgIC0wICAgICAwICAgLT4gMAorY29teDY0NSBjb21wYXJlICAtMCAgICAtMCAgIC0+IDAKK2NvbXg2NDYgY29tcGFyZSAgLTAgICAgLTAuMCAtPiAwCitjb214NjQ3IGNvbXBhcmUgIC0wICAgICAwLjAgLT4gMAorY29teDY0OCBjb21wYXJlICAgMC4wICAgMCAgIC0+IDAKK2NvbXg2NDkgY29tcGFyZSAgIDAuMCAgLTAgICAtPiAwCitjb214NjUwIGNvbXBhcmUgICAwLjAgIC0wLjAgLT4gMAorY29teDY1MSBjb21wYXJlICAgMC4wICAgMC4wIC0+IDAKK2NvbXg2NTIgY29tcGFyZSAgLTAuMCAgIDAgICAtPiAwCitjb214NjUzIGNvbXBhcmUgIC0wLjAgIC0wICAgLT4gMAorY29teDY1NCBjb21wYXJlICAtMC4wICAtMC4wIC0+IDAKK2NvbXg2NTUgY29tcGFyZSAgLTAuMCAgIDAuMCAtPiAwCisKK2NvbXg2NTYgY29tcGFyZSAgLTBFMSAgIDAuMCAtPiAwCitjb214NjU3IGNvbXBhcmUgIC0wRTIgICAwLjAgLT4gMAorY29teDY1OCBjb21wYXJlICAgMEUxICAgMC4wIC0+IDAKK2NvbXg2NTkgY29tcGFyZSAgIDBFMiAgIDAuMCAtPiAwCitjb214NjYwIGNvbXBhcmUgIC0wRTEgICAwICAgLT4gMAorY29teDY2MSBjb21wYXJlICAtMEUyICAgMCAgIC0+IDAKK2NvbXg2NjIgY29tcGFyZSAgIDBFMSAgIDAgICAtPiAwCitjb214NjYzIGNvbXBhcmUgICAwRTIgICAwICAgLT4gMAorY29teDY2NCBjb21wYXJlICAtMEUxICAtMEUxIC0+IDAKK2NvbXg2NjUgY29tcGFyZSAgLTBFMiAgLTBFMSAtPiAwCitjb214NjY2IGNvbXBhcmUgICAwRTEgIC0wRTEgLT4gMAorY29teDY2NyBjb21wYXJlICAgMEUyICAtMEUxIC0+IDAKK2NvbXg2NjggY29tcGFyZSAgLTBFMSAgLTBFMiAtPiAwCitjb214NjY5IGNvbXBhcmUgIC0wRTIgIC0wRTIgLT4gMAorY29teDY3MCBjb21wYXJlICAgMEUxICAtMEUyIC0+IDAKK2NvbXg2NzEgY29tcGFyZSAgIDBFMiAgLTBFMiAtPiAwCitjb214NjcyIGNvbXBhcmUgIC0wRTEgICAwRTEgLT4gMAorY29teDY3MyBjb21wYXJlICAtMEUyICAgMEUxIC0+IDAKK2NvbXg2NzQgY29tcGFyZSAgIDBFMSAgIDBFMSAtPiAwCitjb214Njc1IGNvbXBhcmUgICAwRTIgICAwRTEgLT4gMAorY29teDY3NiBjb21wYXJlICAtMEUxICAgMEUyIC0+IDAKK2NvbXg2NzcgY29tcGFyZSAgLTBFMiAgIDBFMiAtPiAwCitjb214Njc4IGNvbXBhcmUgICAwRTEgICAwRTIgLT4gMAorY29teDY3OSBjb21wYXJlICAgMEUyICAgMEUyIC0+IDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorcHJlY2lzaW9uOiAyMAorY29teDY4MCBjb21wYXJlICAgMTIgICAgMTIgICAgICAgICAgIC0+IDAKK2NvbXg2ODEgY29tcGFyZSAgIDEyICAgIDEyLjAgICAgICAgICAtPiAwCitjb214NjgyIGNvbXBhcmUgICAxMiAgICAxMi4wMCAgICAgICAgLT4gMAorY29teDY4MyBjb21wYXJlICAgMTIgICAgMTIuMDAwICAgICAgIC0+IDAKK2NvbXg2ODQgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAgICAgICAtPiAwCitjb214Njg1IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMCAgICAgLT4gMAorY29teDY4NiBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwICAgIC0+IDAKK2NvbXg2ODcgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMDAgICAtPiAwCitjb214Njg4IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAwMCAgLT4gMAorY29teDY4OSBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwMDAwIC0+IDAKK2NvbXg2OTAgY29tcGFyZSAgIDEyICAgICAgICAgICAgICAxMiAtPiAwCitjb214NjkxIGNvbXBhcmUgICAxMi4wICAgICAgICAgICAgMTIgLT4gMAorY29teDY5MiBjb21wYXJlICAgMTIuMDAgICAgICAgICAgIDEyIC0+IDAKK2NvbXg2OTMgY29tcGFyZSAgIDEyLjAwMCAgICAgICAgICAxMiAtPiAwCitjb214Njk0IGNvbXBhcmUgICAxMi4wMDAwICAgICAgICAgMTIgLT4gMAorY29teDY5NSBjb21wYXJlICAgMTIuMDAwMDAgICAgICAgIDEyIC0+IDAKK2NvbXg2OTYgY29tcGFyZSAgIDEyLjAwMDAwMCAgICAgICAxMiAtPiAwCitjb214Njk3IGNvbXBhcmUgICAxMi4wMDAwMDAwICAgICAgMTIgLT4gMAorY29teDY5OCBjb21wYXJlICAgMTIuMDAwMDAwMDAgICAgIDEyIC0+IDAKK2NvbXg2OTkgY29tcGFyZSAgIDEyLjAwMDAwMDAwMCAgICAxMiAtPiAwCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK2NvbXg3MDEgY29tcGFyZSAxMjM0NTY3ODAwMCAgMSAtPiAgMQorY29teDcwMiBjb21wYXJlIDEgMTIzNDU2NzgwMDAgIC0+IC0xCitjb214NzAzIGNvbXBhcmUgMTIzNDU2NzgwMCAgIDEgLT4gIDEKK2NvbXg3MDQgY29tcGFyZSAxIDEyMzQ1Njc4MDAgICAtPiAtMQorY29teDcwNSBjb21wYXJlIDEyMzQ1Njc4OTAgICAxIC0+ICAxCitjb214NzA2IGNvbXBhcmUgMSAxMjM0NTY3ODkwICAgLT4gLTEKK2NvbXg3MDcgY29tcGFyZSAxMjM0NTY3ODkxICAgMSAtPiAgMQorY29teDcwOCBjb21wYXJlIDEgMTIzNDU2Nzg5MSAgIC0+IC0xCitjb214NzA5IGNvbXBhcmUgMTIzNDU2Nzg5MDEgIDEgLT4gIDEKK2NvbXg3MTAgY29tcGFyZSAxIDEyMzQ1Njc4OTAxICAtPiAtMQorY29teDcxMSBjb21wYXJlIDEyMzQ1Njc4OTYgICAxIC0+ICAxCitjb214NzEyIGNvbXBhcmUgMSAxMjM0NTY3ODk2ICAgLT4gLTEKK2NvbXg3MTMgY29tcGFyZSAtMTIzNDU2Nzg5MSAgMSAtPiAtMQorY29teDcxNCBjb21wYXJlIDEgLTEyMzQ1Njc4OTEgIC0+ICAxCitjb214NzE1IGNvbXBhcmUgLTEyMzQ1Njc4OTAxIDEgLT4gLTEKK2NvbXg3MTYgY29tcGFyZSAxIC0xMjM0NTY3ODkwMSAtPiAgMQorY29teDcxNyBjb21wYXJlIC0xMjM0NTY3ODk2ICAxIC0+IC0xCitjb214NzE4IGNvbXBhcmUgMSAtMTIzNDU2Nzg5NiAgLT4gIDEKKworcHJlY2lzaW9uOiAxNQorLS0gc2FtZSB3aXRoIHBsZW50eSBvZiBwcmVjaXNpb24KK2NvbXg3MjEgY29tcGFyZSAxMjM0NTY3ODAwMCAxIC0+IDEKK2NvbXg3MjIgY29tcGFyZSAxIDEyMzQ1Njc4MDAwIC0+IC0xCitjb214NzIzIGNvbXBhcmUgMTIzNDU2NzgwMCAgMSAtPiAxCitjb214NzI0IGNvbXBhcmUgMSAxMjM0NTY3ODAwICAtPiAtMQorY29teDcyNSBjb21wYXJlIDEyMzQ1Njc4OTAgIDEgLT4gMQorY29teDcyNiBjb21wYXJlIDEgMTIzNDU2Nzg5MCAgLT4gLTEKK2NvbXg3MjcgY29tcGFyZSAxMjM0NTY3ODkxICAxIC0+IDEKK2NvbXg3MjggY29tcGFyZSAxIDEyMzQ1Njc4OTEgIC0+IC0xCitjb214NzI5IGNvbXBhcmUgMTIzNDU2Nzg5MDEgMSAtPiAxCitjb214NzMwIGNvbXBhcmUgMSAxMjM0NTY3ODkwMSAtPiAtMQorY29teDczMSBjb21wYXJlIDEyMzQ1Njc4OTYgIDEgLT4gMQorY29teDczMiBjb21wYXJlIDEgMTIzNDU2Nzg5NiAgLT4gLTEKKworLS0gcmVzaWR1ZSBjYXNlcworcHJlY2lzaW9uOiA1Citjb214NzQwIGNvbXBhcmUgIDEgIDAuOTk5OTk5OSAgLT4gMQorY29teDc0MSBjb21wYXJlICAxICAwLjk5OTk5OSAgIC0+IDEKK2NvbXg3NDIgY29tcGFyZSAgMSAgMC45OTk5OSAgICAtPiAxCitjb214NzQzIGNvbXBhcmUgIDEgIDEuMDAwMCAgICAgLT4gMAorY29teDc0NCBjb21wYXJlICAxICAxLjAwMDAxICAgIC0+IC0xCitjb214NzQ1IGNvbXBhcmUgIDEgIDEuMDAwMDAxICAgLT4gLTEKK2NvbXg3NDYgY29tcGFyZSAgMSAgMS4wMDAwMDAxICAtPiAtMQorY29teDc1MCBjb21wYXJlICAwLjk5OTk5OTkgIDEgIC0+IC0xCitjb214NzUxIGNvbXBhcmUgIDAuOTk5OTk5ICAgMSAgLT4gLTEKK2NvbXg3NTIgY29tcGFyZSAgMC45OTk5OSAgICAxICAtPiAtMQorY29teDc1MyBjb21wYXJlICAxLjAwMDAgICAgIDEgIC0+IDAKK2NvbXg3NTQgY29tcGFyZSAgMS4wMDAwMSAgICAxICAtPiAxCitjb214NzU1IGNvbXBhcmUgIDEuMDAwMDAxICAgMSAgLT4gMQorY29teDc1NiBjb21wYXJlICAxLjAwMDAwMDEgIDEgIC0+IDEKKworLS0gYSBzZWxlY3Rpb24gb2YgbG9uZ2llcworY29teDc2MCBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzU2NTYwMzU3OTQwIC0+IC0xCitjb214NzYxIGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMAorY29teDc2MiBjb21wYXJlIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IC0xCitjb214NzYzIGNvbXBhcmUgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorLS0gcHJlY2lzaW9ucyBhYm92ZSBvciBiZWxvdyB0aGUgZGlmZmVyZW5jZSBzaG91bGQgaGF2ZSBubyBlZmZlY3QKK3ByZWNpc2lvbjogICAxMQorY29teDc2NCBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAxMAorY29teDc2NSBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgOQorY29teDc2NiBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgOAorY29teDc2NyBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgNworY29teDc2OCBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgNgorY29teDc2OSBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgNQorY29teDc3MCBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgNAorY29teDc3MSBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgMworY29teDc3MiBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgMgorY29teDc3MyBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgMQorY29teDc3NCBjb21wYXJlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKKworLS0gU3BlY2lhbHMKK3ByZWNpc2lvbjogICA5Citjb214NzgwIGNvbXBhcmUgIEluZiAgLUluZiAgIC0+ICAxCitjb214NzgxIGNvbXBhcmUgIEluZiAgLTEwMDAgIC0+ICAxCitjb214NzgyIGNvbXBhcmUgIEluZiAgLTEgICAgIC0+ICAxCitjb214NzgzIGNvbXBhcmUgIEluZiAgLTAgICAgIC0+ICAxCitjb214Nzg0IGNvbXBhcmUgIEluZiAgIDAgICAgIC0+ICAxCitjb214Nzg1IGNvbXBhcmUgIEluZiAgIDEgICAgIC0+ICAxCitjb214Nzg2IGNvbXBhcmUgIEluZiAgIDEwMDAgIC0+ICAxCitjb214Nzg3IGNvbXBhcmUgIEluZiAgIEluZiAgIC0+ICAwCitjb214Nzg4IGNvbXBhcmUgLTEwMDAgIEluZiAgIC0+IC0xCitjb214Nzg5IGNvbXBhcmUgLUluZiAgIEluZiAgIC0+IC0xCitjb214NzkwIGNvbXBhcmUgLTEgICAgIEluZiAgIC0+IC0xCitjb214NzkxIGNvbXBhcmUgLTAgICAgIEluZiAgIC0+IC0xCitjb214NzkyIGNvbXBhcmUgIDAgICAgIEluZiAgIC0+IC0xCitjb214NzkzIGNvbXBhcmUgIDEgICAgIEluZiAgIC0+IC0xCitjb214Nzk0IGNvbXBhcmUgIDEwMDAgIEluZiAgIC0+IC0xCitjb214Nzk1IGNvbXBhcmUgIEluZiAgIEluZiAgIC0+ICAwCisKK2NvbXg4MDAgY29tcGFyZSAtSW5mICAtSW5mICAgLT4gIDAKK2NvbXg4MDEgY29tcGFyZSAtSW5mICAtMTAwMCAgLT4gLTEKK2NvbXg4MDIgY29tcGFyZSAtSW5mICAtMSAgICAgLT4gLTEKK2NvbXg4MDMgY29tcGFyZSAtSW5mICAtMCAgICAgLT4gLTEKK2NvbXg4MDQgY29tcGFyZSAtSW5mICAgMCAgICAgLT4gLTEKK2NvbXg4MDUgY29tcGFyZSAtSW5mICAgMSAgICAgLT4gLTEKK2NvbXg4MDYgY29tcGFyZSAtSW5mICAgMTAwMCAgLT4gLTEKK2NvbXg4MDcgY29tcGFyZSAtSW5mICAgSW5mICAgLT4gLTEKK2NvbXg4MDggY29tcGFyZSAtSW5mICAtSW5mICAgLT4gIDAKK2NvbXg4MDkgY29tcGFyZSAtMTAwMCAtSW5mICAgLT4gIDEKK2NvbXg4MTAgY29tcGFyZSAtMSAgICAtSW5mICAgLT4gIDEKK2NvbXg4MTEgY29tcGFyZSAtMCAgICAtSW5mICAgLT4gIDEKK2NvbXg4MTIgY29tcGFyZSAgMCAgICAtSW5mICAgLT4gIDEKK2NvbXg4MTMgY29tcGFyZSAgMSAgICAtSW5mICAgLT4gIDEKK2NvbXg4MTQgY29tcGFyZSAgMTAwMCAtSW5mICAgLT4gIDEKK2NvbXg4MTUgY29tcGFyZSAgSW5mICAtSW5mICAgLT4gIDEKKworY29teDgyMSBjb21wYXJlICBOYU4gLUluZiAgICAtPiAgTmFOCitjb214ODIyIGNvbXBhcmUgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2NvbXg4MjMgY29tcGFyZSAgTmFOIC0xICAgICAgLT4gIE5hTgorY29teDgyNCBjb21wYXJlICBOYU4gLTAgICAgICAtPiAgTmFOCitjb214ODI1IGNvbXBhcmUgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2NvbXg4MjYgY29tcGFyZSAgTmFOICAxICAgICAgLT4gIE5hTgorY29teDgyNyBjb21wYXJlICBOYU4gIDEwMDAgICAtPiAgTmFOCitjb214ODI4IGNvbXBhcmUgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2NvbXg4MjkgY29tcGFyZSAgTmFOICBOYU4gICAgLT4gIE5hTgorY29teDgzMCBjb21wYXJlIC1JbmYgIE5hTiAgICAtPiAgTmFOCitjb214ODMxIGNvbXBhcmUgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2NvbXg4MzIgY29tcGFyZSAtMSAgICBOYU4gICAgLT4gIE5hTgorY29teDgzMyBjb21wYXJlIC0wICAgIE5hTiAgICAtPiAgTmFOCitjb214ODM0IGNvbXBhcmUgIDAgICAgTmFOICAgIC0+ICBOYU4KK2NvbXg4MzUgY29tcGFyZSAgMSAgICBOYU4gICAgLT4gIE5hTgorY29teDgzNiBjb21wYXJlICAxMDAwIE5hTiAgICAtPiAgTmFOCitjb214ODM3IGNvbXBhcmUgIEluZiAgTmFOICAgIC0+ICBOYU4KK2NvbXg4MzggY29tcGFyZSAtTmFOIC1OYU4gICAgLT4gLU5hTgorY29teDgzOSBjb21wYXJlICtOYU4gLU5hTiAgICAtPiAgTmFOCitjb214ODQwIGNvbXBhcmUgLU5hTiArTmFOICAgIC0+IC1OYU4KKworY29teDg0MSBjb21wYXJlICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0MiBjb21wYXJlICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0MyBjb21wYXJlICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0NCBjb21wYXJlICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0NSBjb21wYXJlICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0NiBjb21wYXJlICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0NyBjb21wYXJlICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0OCBjb21wYXJlICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg0OSBjb21wYXJlICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1MCBjb21wYXJlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1MSBjb21wYXJlIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1MiBjb21wYXJlIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1MyBjb21wYXJlIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1NCBjb21wYXJlIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1NSBjb21wYXJlICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1NiBjb21wYXJlICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1NyBjb21wYXJlICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1OCBjb21wYXJlICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorY29teDg1OSBjb21wYXJlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitjb214ODYwIGNvbXBhcmUgIE5hTjkgLUluZiAgIC0+ICBOYU45Citjb214ODYxIGNvbXBhcmUgIE5hTjggIDk5OSAgIC0+ICBOYU44Citjb214ODYyIGNvbXBhcmUgIE5hTjc3IEluZiAgIC0+ICBOYU43NworY29teDg2MyBjb21wYXJlIC1OYU42NyBOYU41ICAtPiAtTmFONjcKK2NvbXg4NjQgY29tcGFyZSAtSW5mICAtTmFONCAgLT4gLU5hTjQKK2NvbXg4NjUgY29tcGFyZSAtOTk5ICAtTmFOMzMgLT4gLU5hTjMzCitjb214ODY2IGNvbXBhcmUgIEluZiAgIE5hTjIgIC0+ICBOYU4yCitjb214ODY3IGNvbXBhcmUgLU5hTjQxIC1OYU40MiAtPiAtTmFONDEKK2NvbXg4NjggY29tcGFyZSArTmFONDEgLU5hTjQyIC0+ICBOYU40MQorY29teDg2OSBjb21wYXJlIC1OYU40MSArTmFONDIgLT4gLU5hTjQxCitjb214ODcwIGNvbXBhcmUgK05hTjQxICtOYU40MiAtPiAgTmFONDEKKworY29teDg3MSBjb21wYXJlIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2NvbXg4NzIgY29tcGFyZSAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitjb214ODczIGNvbXBhcmUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorY29teDg3NCBjb21wYXJlICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2NvbXg4NzUgY29tcGFyZSAgTmFOODUgIHNOYU44MyAgLT4gIE5hTjgzIEludmFsaWRfb3BlcmF0aW9uCitjb214ODc2IGNvbXBhcmUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorY29teDg3NyBjb21wYXJlICAwODggICAgc05hTjgxICAtPiAgTmFOODEgSW52YWxpZF9vcGVyYXRpb24KK2NvbXg4NzggY29tcGFyZSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitjb214ODc5IGNvbXBhcmUgIE5hTiAgIC1zTmFOODkgIC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIHN1Ym5vcm1hbCByZXN1bHRzIG5vdyBhbGxvd2VkCittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorY29teDg4MCBjb21wYXJlICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtMQorY29teDg4MSBjb21wYXJlIDlFKzk5OTk5OTk5OSArMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorY29teDg4MiBjb21wYXJlICswLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAgMQorY29teDg4MyBjb21wYXJlIDlFLTk5OTk5OTk5OSArMC4xMDAgICAgICAgICAgICAgICAtPiAtMQorY29teDg4NSBjb21wYXJlIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtMQorY29teDg4NiBjb21wYXJlIDlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorY29teDg4NyBjb21wYXJlIC0wLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAtMQorY29teDg4OCBjb21wYXJlIDlFLTk5OTk5OTk5OSAtMC4xMDAgICAgICAgICAgICAgICAtPiAgMQorCitjb214ODg5IGNvbXBhcmUgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMSAgIC0+IC0xCitjb214ODkwIGNvbXBhcmUgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMCAgIC0+IC0xCitjb214ODkxIGNvbXBhcmUgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwMCAgIC0+IC0xCitjb214ODkyIGNvbXBhcmUgOWUtOTk5OTk5OTk4IDAuMDEgICAgICAgICAgIC0+IC0xCitjb214ODkzIGNvbXBhcmUgOWUtOTk5OTk5OTk4IDAuMSAgICAgICAgICAgIC0+IC0xCitjb214ODk0IGNvbXBhcmUgMC4wMSA5ZS05OTk5OTk5OTggICAgICAgICAgIC0+ICAxCitjb214ODk1IGNvbXBhcmUgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDEgICAgIC0+ICAxCitjb214ODk2IGNvbXBhcmUgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDAgICAgIC0+ICAxCitjb214ODk3IGNvbXBhcmUgMWU2MDAwMDAwMDAgMWU0MDAwMDAwMDAgICAgIC0+ICAxCitjb214ODk4IGNvbXBhcmUgOWU5OTk5OTk5OTggMTAwICAgICAgICAgICAgIC0+ICAxCitjb214ODk5IGNvbXBhcmUgOWU5OTk5OTk5OTggMTAgICAgICAgICAgICAgIC0+ICAxCitjb214OTAwIGNvbXBhcmUgMTAwICA5ZTk5OTk5OTk5OCAgICAgICAgICAgIC0+IC0xCistLSBzaWducworY29teDkwMSBjb21wYXJlICAxZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAgMQorY29teDkwMiBjb21wYXJlICAxZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAgMQorY29teDkwMyBjb21wYXJlIC0xZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAtMQorY29teDkwNCBjb21wYXJlIC0xZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAtMQorY29teDkwNSBjb21wYXJlICAxZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAtMQorY29teDkwNiBjb21wYXJlICAxZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAgMQorY29teDkwNyBjb21wYXJlIC0xZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAtMQorY29teDkwOCBjb21wYXJlIC0xZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAgMQorCistLSBzcHJlYWQgemVyb3MKK2NvbXg5MTAgY29tcGFyZSAgIDBFLTM4MyAgMCAgICAgICAtPiAgMAorY29teDkxMSBjb21wYXJlICAgMEUtMzgzIC0wICAgICAgIC0+ICAwCitjb214OTEyIGNvbXBhcmUgIC0wRS0zODMgIDAgICAgICAgLT4gIDAKK2NvbXg5MTMgY29tcGFyZSAgLTBFLTM4MyAtMCAgICAgICAtPiAgMAorY29teDkxNCBjb21wYXJlICAgMEUtMzgzICAwRSszODQgIC0+ICAwCitjb214OTE1IGNvbXBhcmUgICAwRS0zODMgLTBFKzM4NCAgLT4gIDAKK2NvbXg5MTYgY29tcGFyZSAgLTBFLTM4MyAgMEUrMzg0ICAtPiAgMAorY29teDkxNyBjb21wYXJlICAtMEUtMzgzIC0wRSszODQgIC0+ICAwCitjb214OTE4IGNvbXBhcmUgICAwICAgICAgIDBFKzM4NCAgLT4gIDAKK2NvbXg5MTkgY29tcGFyZSAgIDAgICAgICAtMEUrMzg0ICAtPiAgMAorY29teDkyMCBjb21wYXJlICAtMCAgICAgICAwRSszODQgIC0+ICAwCitjb214OTIxIGNvbXBhcmUgIC0wICAgICAgLTBFKzM4NCAgLT4gIDAKK2NvbXg5MzAgY29tcGFyZSAgIDBFKzM4NCAgMCAgICAgICAtPiAgMAorY29teDkzMSBjb21wYXJlICAgMEUrMzg0IC0wICAgICAgIC0+ICAwCitjb214OTMyIGNvbXBhcmUgIC0wRSszODQgIDAgICAgICAgLT4gIDAKK2NvbXg5MzMgY29tcGFyZSAgLTBFKzM4NCAtMCAgICAgICAtPiAgMAorY29teDkzNCBjb21wYXJlICAgMEUrMzg0ICAwRS0zODMgIC0+ICAwCitjb214OTM1IGNvbXBhcmUgICAwRSszODQgLTBFLTM4MyAgLT4gIDAKK2NvbXg5MzYgY29tcGFyZSAgLTBFKzM4NCAgMEUtMzgzICAtPiAgMAorY29teDkzNyBjb21wYXJlICAtMEUrMzg0IC0wRS0zODMgIC0+ICAwCitjb214OTM4IGNvbXBhcmUgICAwICAgICAgIDBFLTM4MyAgLT4gIDAKK2NvbXg5MzkgY29tcGFyZSAgIDAgICAgICAtMEUtMzgzICAtPiAgMAorY29teDk0MCBjb21wYXJlICAtMCAgICAgICAwRS0zODMgIC0+ICAwCitjb214OTQxIGNvbXBhcmUgIC0wICAgICAgLTBFLTM4MyAgLT4gIDAKKworLS0gTnVsbCB0ZXN0cworY29teDk5MCBjb21wYXJlIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorY29teDk5MSBjb21wYXJlICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb21wYXJldG90YWwuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29tcGFyZXRvdGFsLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyYzQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29tcGFyZXRvdGFsLmRlY1Rlc3QKQEAgLTAsMCArMSw3OTggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY29tcGFyZXRvdGFsLmRlY1Rlc3QgLS0gZGVjaW1hbCBjb21wYXJpc29uIHVzaW5nIHRvdGFsIG9yZGVyaW5nICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKy0tIFNpbWlsYXJseSwgY29tcGFyZXRvdGFsIHdpbGwgaGF2ZSBzb21lIHJhZGljYWxseSBkaWZmZXJlbnQgcGF0aHMKKy0tIHRoYW4gY29tcGFyZS4KKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MKK2NvdHgwMDEgY29tcGFyZXRvdGFsICAtMiAgLTIgIC0+IDAKK2NvdHgwMDIgY29tcGFyZXRvdGFsICAtMiAgLTEgIC0+IC0xCitjb3R4MDAzIGNvbXBhcmV0b3RhbCAgLTIgICAwICAtPiAtMQorY290eDAwNCBjb21wYXJldG90YWwgIC0yICAgMSAgLT4gLTEKK2NvdHgwMDUgY29tcGFyZXRvdGFsICAtMiAgIDIgIC0+IC0xCitjb3R4MDA2IGNvbXBhcmV0b3RhbCAgLTEgIC0yICAtPiAxCitjb3R4MDA3IGNvbXBhcmV0b3RhbCAgLTEgIC0xICAtPiAwCitjb3R4MDA4IGNvbXBhcmV0b3RhbCAgLTEgICAwICAtPiAtMQorY290eDAwOSBjb21wYXJldG90YWwgIC0xICAgMSAgLT4gLTEKK2NvdHgwMTAgY29tcGFyZXRvdGFsICAtMSAgIDIgIC0+IC0xCitjb3R4MDExIGNvbXBhcmV0b3RhbCAgIDAgIC0yICAtPiAxCitjb3R4MDEyIGNvbXBhcmV0b3RhbCAgIDAgIC0xICAtPiAxCitjb3R4MDEzIGNvbXBhcmV0b3RhbCAgIDAgICAwICAtPiAwCitjb3R4MDE0IGNvbXBhcmV0b3RhbCAgIDAgICAxICAtPiAtMQorY290eDAxNSBjb21wYXJldG90YWwgICAwICAgMiAgLT4gLTEKK2NvdHgwMTYgY29tcGFyZXRvdGFsICAgMSAgLTIgIC0+IDEKK2NvdHgwMTcgY29tcGFyZXRvdGFsICAgMSAgLTEgIC0+IDEKK2NvdHgwMTggY29tcGFyZXRvdGFsICAgMSAgIDAgIC0+IDEKK2NvdHgwMTkgY29tcGFyZXRvdGFsICAgMSAgIDEgIC0+IDAKK2NvdHgwMjAgY29tcGFyZXRvdGFsICAgMSAgIDIgIC0+IC0xCitjb3R4MDIxIGNvbXBhcmV0b3RhbCAgIDIgIC0yICAtPiAxCitjb3R4MDIyIGNvbXBhcmV0b3RhbCAgIDIgIC0xICAtPiAxCitjb3R4MDIzIGNvbXBhcmV0b3RhbCAgIDIgICAwICAtPiAxCitjb3R4MDI1IGNvbXBhcmV0b3RhbCAgIDIgICAxICAtPiAxCitjb3R4MDI2IGNvbXBhcmV0b3RhbCAgIDIgICAyICAtPiAwCisKK2NvdHgwMzEgY29tcGFyZXRvdGFsICAtMjAgIC0yMCAgLT4gMAorY290eDAzMiBjb21wYXJldG90YWwgIC0yMCAgLTEwICAtPiAtMQorY290eDAzMyBjb21wYXJldG90YWwgIC0yMCAgIDAwICAtPiAtMQorY290eDAzNCBjb21wYXJldG90YWwgIC0yMCAgIDEwICAtPiAtMQorY290eDAzNSBjb21wYXJldG90YWwgIC0yMCAgIDIwICAtPiAtMQorY290eDAzNiBjb21wYXJldG90YWwgIC0xMCAgLTIwICAtPiAxCitjb3R4MDM3IGNvbXBhcmV0b3RhbCAgLTEwICAtMTAgIC0+IDAKK2NvdHgwMzggY29tcGFyZXRvdGFsICAtMTAgICAwMCAgLT4gLTEKK2NvdHgwMzkgY29tcGFyZXRvdGFsICAtMTAgICAxMCAgLT4gLTEKK2NvdHgwNDAgY29tcGFyZXRvdGFsICAtMTAgICAyMCAgLT4gLTEKK2NvdHgwNDEgY29tcGFyZXRvdGFsICAgMDAgIC0yMCAgLT4gMQorY290eDA0MiBjb21wYXJldG90YWwgICAwMCAgLTEwICAtPiAxCitjb3R4MDQzIGNvbXBhcmV0b3RhbCAgIDAwICAgMDAgIC0+IDAKK2NvdHgwNDQgY29tcGFyZXRvdGFsICAgMDAgICAxMCAgLT4gLTEKK2NvdHgwNDUgY29tcGFyZXRvdGFsICAgMDAgICAyMCAgLT4gLTEKK2NvdHgwNDYgY29tcGFyZXRvdGFsICAgMTAgIC0yMCAgLT4gMQorY290eDA0NyBjb21wYXJldG90YWwgICAxMCAgLTEwICAtPiAxCitjb3R4MDQ4IGNvbXBhcmV0b3RhbCAgIDEwICAgMDAgIC0+IDEKK2NvdHgwNDkgY29tcGFyZXRvdGFsICAgMTAgICAxMCAgLT4gMAorY290eDA1MCBjb21wYXJldG90YWwgICAxMCAgIDIwICAtPiAtMQorY290eDA1MSBjb21wYXJldG90YWwgICAyMCAgLTIwICAtPiAxCitjb3R4MDUyIGNvbXBhcmV0b3RhbCAgIDIwICAtMTAgIC0+IDEKK2NvdHgwNTMgY29tcGFyZXRvdGFsICAgMjAgICAwMCAgLT4gMQorY290eDA1NSBjb21wYXJldG90YWwgICAyMCAgIDEwICAtPiAxCitjb3R4MDU2IGNvbXBhcmV0b3RhbCAgIDIwICAgMjAgIC0+IDAKKworY290eDA2MSBjb21wYXJldG90YWwgIC0yLjAgIC0yLjAgIC0+IDAKK2NvdHgwNjIgY29tcGFyZXRvdGFsICAtMi4wICAtMS4wICAtPiAtMQorY290eDA2MyBjb21wYXJldG90YWwgIC0yLjAgICAwLjAgIC0+IC0xCitjb3R4MDY0IGNvbXBhcmV0b3RhbCAgLTIuMCAgIDEuMCAgLT4gLTEKK2NvdHgwNjUgY29tcGFyZXRvdGFsICAtMi4wICAgMi4wICAtPiAtMQorY290eDA2NiBjb21wYXJldG90YWwgIC0xLjAgIC0yLjAgIC0+IDEKK2NvdHgwNjcgY29tcGFyZXRvdGFsICAtMS4wICAtMS4wICAtPiAwCitjb3R4MDY4IGNvbXBhcmV0b3RhbCAgLTEuMCAgIDAuMCAgLT4gLTEKK2NvdHgwNjkgY29tcGFyZXRvdGFsICAtMS4wICAgMS4wICAtPiAtMQorY290eDA3MCBjb21wYXJldG90YWwgIC0xLjAgICAyLjAgIC0+IC0xCitjb3R4MDcxIGNvbXBhcmV0b3RhbCAgIDAuMCAgLTIuMCAgLT4gMQorY290eDA3MiBjb21wYXJldG90YWwgICAwLjAgIC0xLjAgIC0+IDEKK2NvdHgwNzMgY29tcGFyZXRvdGFsICAgMC4wICAgMC4wICAtPiAwCitjb3R4MDc0IGNvbXBhcmV0b3RhbCAgIDAuMCAgIDEuMCAgLT4gLTEKK2NvdHgwNzUgY29tcGFyZXRvdGFsICAgMC4wICAgMi4wICAtPiAtMQorY290eDA3NiBjb21wYXJldG90YWwgICAxLjAgIC0yLjAgIC0+IDEKK2NvdHgwNzcgY29tcGFyZXRvdGFsICAgMS4wICAtMS4wICAtPiAxCitjb3R4MDc4IGNvbXBhcmV0b3RhbCAgIDEuMCAgIDAuMCAgLT4gMQorY290eDA3OSBjb21wYXJldG90YWwgICAxLjAgICAxLjAgIC0+IDAKK2NvdHgwODAgY29tcGFyZXRvdGFsICAgMS4wICAgMi4wICAtPiAtMQorY290eDA4MSBjb21wYXJldG90YWwgICAyLjAgIC0yLjAgIC0+IDEKK2NvdHgwODIgY29tcGFyZXRvdGFsICAgMi4wICAtMS4wICAtPiAxCitjb3R4MDgzIGNvbXBhcmV0b3RhbCAgIDIuMCAgIDAuMCAgLT4gMQorY290eDA4NSBjb21wYXJldG90YWwgICAyLjAgICAxLjAgIC0+IDEKK2NvdHgwODYgY29tcGFyZXRvdGFsICAgMi4wICAgMi4wICAtPiAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK2NvdHgwOTAgY29tcGFyZXRvdGFsICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgOS45OTk5OTk5OUUrOTk5OTk5OTk5ICAtPiAwCitjb3R4MDkxIGNvbXBhcmV0b3RhbCAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IDkuOTk5OTk5OTlFKzk5OTk5OTk5OSAgLT4gLTEKK2NvdHgwOTIgY29tcGFyZXRvdGFsICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgLTkuOTk5OTk5OTlFKzk5OTk5OTk5OSAtPiAxCitjb3R4MDkzIGNvbXBhcmV0b3RhbCAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgLT4gMAorCistLSBFeGFtcGxlcworY290eDA5NCBjb21wYXJldG90YWwgIDEyLjczICAxMjcuOSAgLT4gLTEKK2NvdHgwOTUgY29tcGFyZXRvdGFsICAtMTI3ICAgMTIgICAgIC0+IC0xCitjb3R4MDk2IGNvbXBhcmV0b3RhbCAgMTIuMzAgIDEyLjMgICAtPiAtMQorY290eDA5NyBjb21wYXJldG90YWwgIDEyLjMwICAxMi4zMCAgLT4gIDAKK2NvdHgwOTggY29tcGFyZXRvdGFsICAxMi4zICAgMTIuMzAwIC0+ICAxCitjb3R4MDk5IGNvbXBhcmV0b3RhbCAgMTIuMyAgIE5hTiAgICAtPiAtMQorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKKy0tIGluIHRoaXMgZmlyc3QgZ3JvdXAsIGNvbXBhcmUgd291bGQgY29tcGFyZSBhbGwgZXF1YWwKK2NvdHgxMDAgY29tcGFyZXRvdGFsICAgNy4wICAgIDcuMCAgICAtPiAwCitjb3R4MTAxIGNvbXBhcmV0b3RhbCAgIDcuMCAgICA3ICAgICAgLT4gLTEKK2NvdHgxMDIgY29tcGFyZXRvdGFsICAgNyAgICAgIDcuMCAgICAtPiAxCitjb3R4MTAzIGNvbXBhcmV0b3RhbCAgIDdFKzAgICA3LjAgICAgLT4gMQorY290eDEwNCBjb21wYXJldG90YWwgICA3MEUtMSAgNy4wICAgIC0+IDAKK2NvdHgxMDUgY29tcGFyZXRvdGFsICAgMC43RSsxIDcgICAgICAtPiAwCitjb3R4MTA2IGNvbXBhcmV0b3RhbCAgIDcwRS0xICA3ICAgICAgLT4gLTEKK2NvdHgxMDcgY29tcGFyZXRvdGFsICAgNy4wICAgIDdFKzAgICAtPiAtMQorY290eDEwOCBjb21wYXJldG90YWwgICA3LjAgICAgNzBFLTEgIC0+IDAKK2NvdHgxMDkgY29tcGFyZXRvdGFsICAgNyAgICAgIDAuN0UrMSAtPiAwCitjb3R4MTEwIGNvbXBhcmV0b3RhbCAgIDcgICAgICA3MEUtMSAgLT4gMQorCitjb3R4MTIwIGNvbXBhcmV0b3RhbCAgIDguMCAgICA3LjAgICAgLT4gMQorY290eDEyMSBjb21wYXJldG90YWwgICA4LjAgICAgNyAgICAgIC0+IDEKK2NvdHgxMjIgY29tcGFyZXRvdGFsICAgOCAgICAgIDcuMCAgICAtPiAxCitjb3R4MTIzIGNvbXBhcmV0b3RhbCAgIDhFKzAgICA3LjAgICAgLT4gMQorY290eDEyNCBjb21wYXJldG90YWwgICA4MEUtMSAgNy4wICAgIC0+IDEKK2NvdHgxMjUgY29tcGFyZXRvdGFsICAgMC44RSsxIDcgICAgICAtPiAxCitjb3R4MTI2IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA3ICAgICAgLT4gMQorY290eDEyNyBjb21wYXJldG90YWwgICA4LjAgICAgN0UrMCAgIC0+IDEKK2NvdHgxMjggY29tcGFyZXRvdGFsICAgOC4wICAgIDcwRS0xICAtPiAxCitjb3R4MTI5IGNvbXBhcmV0b3RhbCAgIDggICAgICAwLjdFKzEgIC0+IDEKK2NvdHgxMzAgY29tcGFyZXRvdGFsICAgOCAgICAgIDcwRS0xICAtPiAxCisKK2NvdHgxNDAgY29tcGFyZXRvdGFsICAgOC4wICAgIDkuMCAgICAtPiAtMQorY290eDE0MSBjb21wYXJldG90YWwgICA4LjAgICAgOSAgICAgIC0+IC0xCitjb3R4MTQyIGNvbXBhcmV0b3RhbCAgIDggICAgICA5LjAgICAgLT4gLTEKK2NvdHgxNDMgY29tcGFyZXRvdGFsICAgOEUrMCAgIDkuMCAgICAtPiAtMQorY290eDE0NCBjb21wYXJldG90YWwgICA4MEUtMSAgOS4wICAgIC0+IC0xCitjb3R4MTQ1IGNvbXBhcmV0b3RhbCAgIDAuOEUrMSA5ICAgICAgLT4gLTEKK2NvdHgxNDYgY29tcGFyZXRvdGFsICAgODBFLTEgIDkgICAgICAtPiAtMQorY290eDE0NyBjb21wYXJldG90YWwgICA4LjAgICAgOUUrMCAgIC0+IC0xCitjb3R4MTQ4IGNvbXBhcmV0b3RhbCAgIDguMCAgICA5MEUtMSAgLT4gLTEKK2NvdHgxNDkgY29tcGFyZXRvdGFsICAgOCAgICAgIDAuOUUrMSAtPiAtMQorY290eDE1MCBjb21wYXJldG90YWwgICA4ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2NvdHgyMDAgY29tcGFyZXRvdGFsICAtNy4wICAgIDcuMCAgICAtPiAtMQorY290eDIwMSBjb21wYXJldG90YWwgIC03LjAgICAgNyAgICAgIC0+IC0xCitjb3R4MjAyIGNvbXBhcmV0b3RhbCAgLTcgICAgICA3LjAgICAgLT4gLTEKK2NvdHgyMDMgY29tcGFyZXRvdGFsICAtN0UrMCAgIDcuMCAgICAtPiAtMQorY290eDIwNCBjb21wYXJldG90YWwgIC03MEUtMSAgNy4wICAgIC0+IC0xCitjb3R4MjA1IGNvbXBhcmV0b3RhbCAgLTAuN0UrMSA3ICAgICAgLT4gLTEKK2NvdHgyMDYgY29tcGFyZXRvdGFsICAtNzBFLTEgIDcgICAgICAtPiAtMQorY290eDIwNyBjb21wYXJldG90YWwgIC03LjAgICAgN0UrMCAgIC0+IC0xCitjb3R4MjA4IGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3MEUtMSAgLT4gLTEKK2NvdHgyMDkgY29tcGFyZXRvdGFsICAtNyAgICAgIDAuN0UrMSAtPiAtMQorY290eDIxMCBjb21wYXJldG90YWwgIC03ICAgICAgNzBFLTEgIC0+IC0xCisKK2NvdHgyMjAgY29tcGFyZXRvdGFsICAtOC4wICAgIDcuMCAgICAtPiAtMQorY290eDIyMSBjb21wYXJldG90YWwgIC04LjAgICAgNyAgICAgIC0+IC0xCitjb3R4MjIyIGNvbXBhcmV0b3RhbCAgLTggICAgICA3LjAgICAgLT4gLTEKK2NvdHgyMjMgY29tcGFyZXRvdGFsICAtOEUrMCAgIDcuMCAgICAtPiAtMQorY290eDIyNCBjb21wYXJldG90YWwgIC04MEUtMSAgNy4wICAgIC0+IC0xCitjb3R4MjI1IGNvbXBhcmV0b3RhbCAgLTAuOEUrMSA3ICAgICAgLT4gLTEKK2NvdHgyMjYgY29tcGFyZXRvdGFsICAtODBFLTEgIDcgICAgICAtPiAtMQorY290eDIyNyBjb21wYXJldG90YWwgIC04LjAgICAgN0UrMCAgIC0+IC0xCitjb3R4MjI4IGNvbXBhcmV0b3RhbCAgLTguMCAgICA3MEUtMSAgLT4gLTEKK2NvdHgyMjkgY29tcGFyZXRvdGFsICAtOCAgICAgIDAuN0UrMSAtPiAtMQorY290eDIzMCBjb21wYXJldG90YWwgIC04ICAgICAgNzBFLTEgIC0+IC0xCisKK2NvdHgyNDAgY29tcGFyZXRvdGFsICAtOC4wICAgIDkuMCAgICAtPiAtMQorY290eDI0MSBjb21wYXJldG90YWwgIC04LjAgICAgOSAgICAgIC0+IC0xCitjb3R4MjQyIGNvbXBhcmV0b3RhbCAgLTggICAgICA5LjAgICAgLT4gLTEKK2NvdHgyNDMgY29tcGFyZXRvdGFsICAtOEUrMCAgIDkuMCAgICAtPiAtMQorY290eDI0NCBjb21wYXJldG90YWwgIC04MEUtMSAgOS4wICAgIC0+IC0xCitjb3R4MjQ1IGNvbXBhcmV0b3RhbCAgLTAuOEUrMSA5ICAgICAgLT4gLTEKK2NvdHgyNDYgY29tcGFyZXRvdGFsICAtODBFLTEgIDkgICAgICAtPiAtMQorY290eDI0NyBjb21wYXJldG90YWwgIC04LjAgICAgOUUrMCAgIC0+IC0xCitjb3R4MjQ4IGNvbXBhcmV0b3RhbCAgLTguMCAgICA5MEUtMSAgLT4gLTEKK2NvdHgyNDkgY29tcGFyZXRvdGFsICAtOCAgICAgIDAuOUUrMSAtPiAtMQorY290eDI1MCBjb21wYXJldG90YWwgIC04ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2NvdHgzMDAgY29tcGFyZXRvdGFsICAgNy4wICAgIC03LjAgICAgLT4gMQorY290eDMwMSBjb21wYXJldG90YWwgICA3LjAgICAgLTcgICAgICAtPiAxCitjb3R4MzAyIGNvbXBhcmV0b3RhbCAgIDcgICAgICAtNy4wICAgIC0+IDEKK2NvdHgzMDMgY29tcGFyZXRvdGFsICAgN0UrMCAgIC03LjAgICAgLT4gMQorY290eDMwNCBjb21wYXJldG90YWwgICA3MEUtMSAgLTcuMCAgICAtPiAxCitjb3R4MzA1IGNvbXBhcmV0b3RhbCAgIC43RSsxICAtNyAgICAgIC0+IDEKK2NvdHgzMDYgY29tcGFyZXRvdGFsICAgNzBFLTEgIC03ICAgICAgLT4gMQorY290eDMwNyBjb21wYXJldG90YWwgICA3LjAgICAgLTdFKzAgICAtPiAxCitjb3R4MzA4IGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNzBFLTEgIC0+IDEKK2NvdHgzMDkgY29tcGFyZXRvdGFsICAgNyAgICAgIC0uN0UrMSAgLT4gMQorY290eDMxMCBjb21wYXJldG90YWwgICA3ICAgICAgLTcwRS0xICAtPiAxCisKK2NvdHgzMjAgY29tcGFyZXRvdGFsICAgOC4wICAgIC03LjAgICAgLT4gMQorY290eDMyMSBjb21wYXJldG90YWwgICA4LjAgICAgLTcgICAgICAtPiAxCitjb3R4MzIyIGNvbXBhcmV0b3RhbCAgIDggICAgICAtNy4wICAgIC0+IDEKK2NvdHgzMjMgY29tcGFyZXRvdGFsICAgOEUrMCAgIC03LjAgICAgLT4gMQorY290eDMyNCBjb21wYXJldG90YWwgICA4MEUtMSAgLTcuMCAgICAtPiAxCitjb3R4MzI1IGNvbXBhcmV0b3RhbCAgIC44RSsxICAtNyAgICAgIC0+IDEKK2NvdHgzMjYgY29tcGFyZXRvdGFsICAgODBFLTEgIC03ICAgICAgLT4gMQorY290eDMyNyBjb21wYXJldG90YWwgICA4LjAgICAgLTdFKzAgICAtPiAxCitjb3R4MzI4IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtNzBFLTEgIC0+IDEKK2NvdHgzMjkgY29tcGFyZXRvdGFsICAgOCAgICAgIC0uN0UrMSAgLT4gMQorY290eDMzMCBjb21wYXJldG90YWwgICA4ICAgICAgLTcwRS0xICAtPiAxCisKK2NvdHgzNDAgY29tcGFyZXRvdGFsICAgOC4wICAgIC05LjAgICAgLT4gMQorY290eDM0MSBjb21wYXJldG90YWwgICA4LjAgICAgLTkgICAgICAtPiAxCitjb3R4MzQyIGNvbXBhcmV0b3RhbCAgIDggICAgICAtOS4wICAgIC0+IDEKK2NvdHgzNDMgY29tcGFyZXRvdGFsICAgOEUrMCAgIC05LjAgICAgLT4gMQorY290eDM0NCBjb21wYXJldG90YWwgICA4MEUtMSAgLTkuMCAgICAtPiAxCitjb3R4MzQ1IGNvbXBhcmV0b3RhbCAgIC44RSsxICAtOSAgICAgIC0+IDEKK2NvdHgzNDYgY29tcGFyZXRvdGFsICAgODBFLTEgIC05ICAgICAgLT4gMQorY290eDM0NyBjb21wYXJldG90YWwgICA4LjAgICAgLTlFKzAgICAtPiAxCitjb3R4MzQ4IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtOTBFLTEgIC0+IDEKK2NvdHgzNDkgY29tcGFyZXRvdGFsICAgOCAgICAgIC0uOUUrMSAgLT4gMQorY290eDM1MCBjb21wYXJldG90YWwgICA4ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2NvdHg0MDAgY29tcGFyZXRvdGFsICAgLTcuMCAgICAtNy4wICAgIC0+IDAKK2NvdHg0MDEgY29tcGFyZXRvdGFsICAgLTcuMCAgICAtNyAgICAgIC0+IDEKK2NvdHg0MDIgY29tcGFyZXRvdGFsICAgLTcgICAgICAtNy4wICAgIC0+IC0xCitjb3R4NDAzIGNvbXBhcmV0b3RhbCAgIC03RSswICAgLTcuMCAgICAtPiAtMQorY290eDQwNCBjb21wYXJldG90YWwgICAtNzBFLTEgIC03LjAgICAgLT4gMAorY290eDQwNSBjb21wYXJldG90YWwgICAtLjdFKzEgIC03ICAgICAgLT4gMAorY290eDQwNiBjb21wYXJldG90YWwgICAtNzBFLTEgIC03ICAgICAgLT4gMQorY290eDQwNyBjb21wYXJldG90YWwgICAtNy4wICAgIC03RSswICAgLT4gMQorY290eDQwOCBjb21wYXJldG90YWwgICAtNy4wICAgIC03MEUtMSAgLT4gMAorY290eDQwOSBjb21wYXJldG90YWwgICAtNyAgICAgIC0uN0UrMSAgLT4gMAorY290eDQxMCBjb21wYXJldG90YWwgICAtNyAgICAgIC03MEUtMSAgLT4gLTEKKworY290eDQyMCBjb21wYXJldG90YWwgICAtOC4wICAgIC03LjAgICAgLT4gLTEKK2NvdHg0MjEgY29tcGFyZXRvdGFsICAgLTguMCAgICAtNyAgICAgIC0+IC0xCitjb3R4NDIyIGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLTcuMCAgICAtPiAtMQorY290eDQyMyBjb21wYXJldG90YWwgICAtOEUrMCAgIC03LjAgICAgLT4gLTEKK2NvdHg0MjQgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtNy4wICAgIC0+IC0xCitjb3R4NDI1IGNvbXBhcmV0b3RhbCAgIC0uOEUrMSAgLTcgICAgICAtPiAtMQorY290eDQyNiBjb21wYXJldG90YWwgICAtODBFLTEgIC03ICAgICAgLT4gLTEKK2NvdHg0MjcgY29tcGFyZXRvdGFsICAgLTguMCAgICAtN0UrMCAgIC0+IC0xCitjb3R4NDI4IGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTcwRS0xICAtPiAtMQorY290eDQyOSBjb21wYXJldG90YWwgICAtOCAgICAgIC0uN0UrMSAgLT4gLTEKK2NvdHg0MzAgY29tcGFyZXRvdGFsICAgLTggICAgICAtNzBFLTEgIC0+IC0xCisKK2NvdHg0NDAgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOS4wICAgIC0+IDEKK2NvdHg0NDEgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOSAgICAgIC0+IDEKK2NvdHg0NDIgY29tcGFyZXRvdGFsICAgLTggICAgICAtOS4wICAgIC0+IDEKK2NvdHg0NDMgY29tcGFyZXRvdGFsICAgLThFKzAgICAtOS4wICAgIC0+IDEKK2NvdHg0NDQgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtOS4wICAgIC0+IDEKK2NvdHg0NDUgY29tcGFyZXRvdGFsICAgLS44RSsxICAtOSAgICAgIC0+IDEKK2NvdHg0NDYgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtOSAgICAgIC0+IDEKK2NvdHg0NDcgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOUUrMCAgIC0+IDEKK2NvdHg0NDggY29tcGFyZXRvdGFsICAgLTguMCAgICAtOTBFLTEgIC0+IDEKK2NvdHg0NDkgY29tcGFyZXRvdGFsICAgLTggICAgICAtLjlFKzEgIC0+IDEKK2NvdHg0NTAgY29tcGFyZXRvdGFsICAgLTggICAgICAtOTBFLTEgIC0+IDEKKworCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK3ByZWNpc2lvbjogNDAKK2NvdHg0NzAgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAtMQorY290eDQ3MSBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2NvdHg0NzIgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gLTEKK2NvdHg0NzMgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorY290eDQ3NCBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gLTEKK2NvdHg0NzUgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2NvdHg0NzYgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAtPiAtMQorY290eDQ3NyBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2NvdHg0NzggY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gLTEKK2NvdHg0NzkgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorY290eDQ4MCBjb21wYXJldG90YWwgMTIzLjQ1NjAwMEU3ODkgMTIzLjQ1NkU3ODkgLT4gLTEKK2NvdHg0ODEgY29tcGFyZXRvdGFsIDEyMy40NTYwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2NvdHg0ODIgY29tcGFyZXRvdGFsIDEyMy40NTYwRTc4OSAxMjMuNDU2RTc4OSAtPiAtMQorY290eDQ4MyBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NkUtODkgLT4gMAorY290eDQ4NCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMDAwMDBFLTg5IC0+IDEKK2NvdHg0ODUgY29tcGFyZXRvdGFsIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDAwMDAwMDBFNzg5IC0+IDEKK2NvdHg0ODYgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDAwMEUtODkgLT4gMQorY290eDQ4NyBjb21wYXJldG90YWwgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMDAwMDBFNzg5IC0+IDEKK2NvdHg0ODggY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDBFLTg5IC0+IDEKK2NvdHg0ODkgY29tcGFyZXRvdGFsIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDAwMEU3ODkgLT4gMQorY290eDQ5MCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDBFLTg5IC0+IDEKK2NvdHg0OTEgY29tcGFyZXRvdGFsIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDBFNzg5IC0+IDEKK2NvdHg0OTIgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMEUtODkgLT4gMQorY290eDQ5MyBjb21wYXJldG90YWwgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDBFNzg5IC0+IDEKK2NvdHg0OTQgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDBFLTg5IC0+IDEKK2NvdHg0OTUgY29tcGFyZXRvdGFsIDEyMy40NTZFNzg5IDEyMy40NTYwMEU3ODkgLT4gMQorY290eDQ5NiBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjBFLTg5IC0+IDEKK2NvdHg0OTcgY29tcGFyZXRvdGFsIDEyMy40NTZFNzg5IDEyMy40NTZFNzg5IC0+IDAKKworLS0gd2lkZS1yYW5naW5nLCBhcm91bmQgcHJlY2lzaW9uOyBzaWducyBlcXVhbAorcHJlY2lzaW9uOiA5Citjb3R4NTAwIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNSAgICAtPiAxCitjb3R4NTAxIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNCAgICAtPiAxCitjb3R4NTAyIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMyAgICAtPiAxCitjb3R4NTAzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMiAgICAtPiAxCitjb3R4NTA0IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMSAgICAtPiAxCitjb3R4NTA1IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMCAgICAtPiAxCitjb3R4NTA2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS05ICAgICAtPiAxCitjb3R4NTA3IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS04ICAgICAtPiAxCitjb3R4NTA4IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS03ICAgICAtPiAxCitjb3R4NTA5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS02ICAgICAtPiAxCitjb3R4NTEwIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS01ICAgICAtPiAxCitjb3R4NTExIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS00ICAgICAtPiAxCitjb3R4NTEyIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0zICAgICAtPiAxCitjb3R4NTEzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0yICAgICAtPiAxCitjb3R4NTE0IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xICAgICAtPiAxCitjb3R4NTE1IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0wICAgICAtPiAwCitjb3R4NTE2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxICAgICAtPiAtMQorY290eDUxNyBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMiAgICAgLT4gLTEKK2NvdHg1MTggY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzMgICAgIC0+IC0xCitjb3R4NTE5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs0ICAgICAtPiAtMQorY290eDUyMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrNSAgICAgLT4gLTEKK2NvdHg1MjIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzYgICAgIC0+IC0xCitjb3R4NTIzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs3ICAgICAtPiAtMQorY290eDUyNCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrOCAgICAgLT4gLTEKK2NvdHg1MjUgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzkgICAgIC0+IC0xCitjb3R4NTI2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMCAgICAtPiAtMQorY290eDUyNyBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTEgICAgLT4gLTEKK2NvdHg1MjggY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEyICAgIC0+IC0xCitjb3R4NTI5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMyAgICAtPiAtMQorY290eDUzMCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTQgICAgLT4gLTEKK2NvdHg1MzEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzE1ICAgIC0+IC0xCistLSBMUiBzd2FwCitjb3R4NTQwIGNvbXBhcmV0b3RhbCAgICAxRS0xNSAgMSAgICAgICAtPiAtMQorY290eDU0MSBjb21wYXJldG90YWwgICAgMUUtMTQgIDEgICAgICAgLT4gLTEKK2NvdHg1NDIgY29tcGFyZXRvdGFsICAgIDFFLTEzICAxICAgICAgIC0+IC0xCitjb3R4NTQzIGNvbXBhcmV0b3RhbCAgICAxRS0xMiAgMSAgICAgICAtPiAtMQorY290eDU0NCBjb21wYXJldG90YWwgICAgMUUtMTEgIDEgICAgICAgLT4gLTEKK2NvdHg1NDUgY29tcGFyZXRvdGFsICAgIDFFLTEwICAxICAgICAgIC0+IC0xCitjb3R4NTQ2IGNvbXBhcmV0b3RhbCAgICAxRS05ICAgMSAgICAgICAtPiAtMQorY290eDU0NyBjb21wYXJldG90YWwgICAgMUUtOCAgIDEgICAgICAgLT4gLTEKK2NvdHg1NDggY29tcGFyZXRvdGFsICAgIDFFLTcgICAxICAgICAgIC0+IC0xCitjb3R4NTQ5IGNvbXBhcmV0b3RhbCAgICAxRS02ICAgMSAgICAgICAtPiAtMQorY290eDU1MCBjb21wYXJldG90YWwgICAgMUUtNSAgIDEgICAgICAgLT4gLTEKK2NvdHg1NTEgY29tcGFyZXRvdGFsICAgIDFFLTQgICAxICAgICAgIC0+IC0xCitjb3R4NTUyIGNvbXBhcmV0b3RhbCAgICAxRS0zICAgMSAgICAgICAtPiAtMQorY290eDU1MyBjb21wYXJldG90YWwgICAgMUUtMiAgIDEgICAgICAgLT4gLTEKK2NvdHg1NTQgY29tcGFyZXRvdGFsICAgIDFFLTEgICAxICAgICAgIC0+IC0xCitjb3R4NTU1IGNvbXBhcmV0b3RhbCAgICAxRS0wICAgMSAgICAgICAtPiAgMAorY290eDU1NiBjb21wYXJldG90YWwgICAgMUUrMSAgIDEgICAgICAgLT4gIDEKK2NvdHg1NTcgY29tcGFyZXRvdGFsICAgIDFFKzIgICAxICAgICAgIC0+ICAxCitjb3R4NTU4IGNvbXBhcmV0b3RhbCAgICAxRSszICAgMSAgICAgICAtPiAgMQorY290eDU1OSBjb21wYXJldG90YWwgICAgMUUrNCAgIDEgICAgICAgLT4gIDEKK2NvdHg1NjEgY29tcGFyZXRvdGFsICAgIDFFKzUgICAxICAgICAgIC0+ICAxCitjb3R4NTYyIGNvbXBhcmV0b3RhbCAgICAxRSs2ICAgMSAgICAgICAtPiAgMQorY290eDU2MyBjb21wYXJldG90YWwgICAgMUUrNyAgIDEgICAgICAgLT4gIDEKK2NvdHg1NjQgY29tcGFyZXRvdGFsICAgIDFFKzggICAxICAgICAgIC0+ICAxCitjb3R4NTY1IGNvbXBhcmV0b3RhbCAgICAxRSs5ICAgMSAgICAgICAtPiAgMQorY290eDU2NiBjb21wYXJldG90YWwgICAgMUUrMTAgIDEgICAgICAgLT4gIDEKK2NvdHg1NjcgY29tcGFyZXRvdGFsICAgIDFFKzExICAxICAgICAgIC0+ICAxCitjb3R4NTY4IGNvbXBhcmV0b3RhbCAgICAxRSsxMiAgMSAgICAgICAtPiAgMQorY290eDU2OSBjb21wYXJldG90YWwgICAgMUUrMTMgIDEgICAgICAgLT4gIDEKK2NvdHg1NzAgY29tcGFyZXRvdGFsICAgIDFFKzE0ICAxICAgICAgIC0+ICAxCitjb3R4NTcxIGNvbXBhcmV0b3RhbCAgICAxRSsxNSAgMSAgICAgICAtPiAgMQorLS0gc2ltaWxhciB3aXRoIGFuIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorY290eDU4MCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNSAgICAtPiAxCitjb3R4NTgxIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgIC0+IDEKK2NvdHg1ODIgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgLT4gMQorY290eDU4MyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMiAgICAtPiAxCitjb3R4NTg0IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgIC0+IDEKK2NvdHg1ODUgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgLT4gMQorY290eDU4NiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS05ICAgICAtPiAxCitjb3R4NTg3IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgIC0+IDEKK2NvdHg1ODggY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgLT4gMQorY290eDU4OSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS02ICAgICAtPiAtMQorY290eDU5MCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAtPiAtMQorY290eDU5MSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAtPiAtMQorY290eDU5MiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0zICAgICAtPiAtMQorY290eDU5MyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAtPiAtMQorY290eDU5NCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAtPiAtMQorY290eDU5NSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0wICAgICAtPiAtMQorY290eDU5NiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAtPiAtMQorY290eDU5NyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAtPiAtMQorY290eDU5OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSszICAgICAtPiAtMQorY290eDU5OSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAtPiAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworcHJlY2lzaW9uOiAyMAorY290eDYwMCBjb21wYXJldG90YWwgICAxMiAgICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvdHg2MDEgY29tcGFyZXRvdGFsICAgMTIuMCAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitjb3R4NjAyIGNvbXBhcmV0b3RhbCAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAtPiAtMQorY290eDYwMyBjb21wYXJldG90YWwgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2NvdHg2MDQgY29tcGFyZXRvdGFsICAgMTIuMDAwMCAgICAgICAxMi4yMzQ1IC0+IC0xCitjb3R4NjA1IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAtPiAtMQorY290eDYwNiBjb21wYXJldG90YWwgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgLT4gLTEKK2NvdHg2MDcgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMCAgICAxMi4yMzQ1IC0+IC0xCitjb3R4NjA4IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAtPiAtMQorY290eDYwOSBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgLT4gLTEKK2NvdHg2MTAgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMiAgICAgICAgICAgIC0+ICAxCitjb3R4NjExIGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAtPiAgMQorY290eDYxMiBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwICAgICAgICAgLT4gIDEKK2NvdHg2MTMgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAgICAgICAgIC0+ICAxCitjb3R4NjE0IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAtPiAgMQorY290eDYxNSBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgLT4gIDEKK2NvdHg2MTYgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAgICAgIC0+ICAxCitjb3R4NjE3IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAtPiAgMQorY290eDYxOCBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgLT4gIDEKK2NvdHg2MTkgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAwMDAgIC0+ICAxCitjb3R4NjIwIGNvbXBhcmV0b3RhbCAgLTEyICAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorY290eDYyMSBjb21wYXJldG90YWwgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2NvdHg2MjIgY29tcGFyZXRvdGFsICAtMTIuMDAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb3R4NjIzIGNvbXBhcmV0b3RhbCAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAtPiAgMQorY290eDYyNCBjb21wYXJldG90YWwgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgLT4gIDEKK2NvdHg2MjUgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAgICAgIC0xMi4yMzQ1IC0+ICAxCitjb3R4NjI2IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAtPiAgMQorY290eDYyNyBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgLT4gIDEKK2NvdHg2MjggY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwMDAgIC0xMi4yMzQ1IC0+ICAxCitjb3R4NjI5IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAtPiAgMQorY290eDYzMCBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgLT4gLTEKK2NvdHg2MzEgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMCAgICAgICAgIC0+IC0xCitjb3R4NjMyIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAtPiAtMQorY290eDYzMyBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgLT4gLTEKK2NvdHg2MzQgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMCAgICAgIC0+IC0xCitjb3R4NjM1IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAtPiAtMQorY290eDYzNiBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgLT4gLTEKK2NvdHg2MzcgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAwMCAgIC0+IC0xCitjb3R4NjM4IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAtPiAtMQorY290eDYzOSBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgLT4gLTEKK3ByZWNpc2lvbjogOQorCistLSBleHRlbmRlZCB6ZXJvcworY290eDY0MCBjb21wYXJldG90YWwgICAwICAgICAwICAgLT4gMAorY290eDY0MSBjb21wYXJldG90YWwgICAwICAgIC0wICAgLT4gMQorY290eDY0MiBjb21wYXJldG90YWwgICAwICAgIC0wLjAgLT4gMQorY290eDY0MyBjb21wYXJldG90YWwgICAwICAgICAwLjAgLT4gMQorY290eDY0NCBjb21wYXJldG90YWwgIC0wICAgICAwICAgLT4gLTEKK2NvdHg2NDUgY29tcGFyZXRvdGFsICAtMCAgICAtMCAgIC0+IDAKK2NvdHg2NDYgY29tcGFyZXRvdGFsICAtMCAgICAtMC4wIC0+IC0xCitjb3R4NjQ3IGNvbXBhcmV0b3RhbCAgLTAgICAgIDAuMCAtPiAtMQorY290eDY0OCBjb21wYXJldG90YWwgICAwLjAgICAwICAgLT4gLTEKK2NvdHg2NDkgY29tcGFyZXRvdGFsICAgMC4wICAtMCAgIC0+IDEKK2NvdHg2NTAgY29tcGFyZXRvdGFsICAgMC4wICAtMC4wIC0+IDEKK2NvdHg2NTEgY29tcGFyZXRvdGFsICAgMC4wICAgMC4wIC0+IDAKK2NvdHg2NTIgY29tcGFyZXRvdGFsICAtMC4wICAgMCAgIC0+IC0xCitjb3R4NjUzIGNvbXBhcmV0b3RhbCAgLTAuMCAgLTAgICAtPiAxCitjb3R4NjU0IGNvbXBhcmV0b3RhbCAgLTAuMCAgLTAuMCAtPiAwCitjb3R4NjU1IGNvbXBhcmV0b3RhbCAgLTAuMCAgIDAuMCAtPiAtMQorCitjb3R4NjU2IGNvbXBhcmV0b3RhbCAgLTBFMSAgIDAuMCAtPiAtMQorY290eDY1NyBjb21wYXJldG90YWwgIC0wRTIgICAwLjAgLT4gLTEKK2NvdHg2NTggY29tcGFyZXRvdGFsICAgMEUxICAgMC4wIC0+IDEKK2NvdHg2NTkgY29tcGFyZXRvdGFsICAgMEUyICAgMC4wIC0+IDEKK2NvdHg2NjAgY29tcGFyZXRvdGFsICAtMEUxICAgMCAgIC0+IC0xCitjb3R4NjYxIGNvbXBhcmV0b3RhbCAgLTBFMiAgIDAgICAtPiAtMQorY290eDY2MiBjb21wYXJldG90YWwgICAwRTEgICAwICAgLT4gMQorY290eDY2MyBjb21wYXJldG90YWwgICAwRTIgICAwICAgLT4gMQorY290eDY2NCBjb21wYXJldG90YWwgIC0wRTEgIC0wRTEgLT4gMAorY290eDY2NSBjb21wYXJldG90YWwgIC0wRTIgIC0wRTEgLT4gLTEKK2NvdHg2NjYgY29tcGFyZXRvdGFsICAgMEUxICAtMEUxIC0+IDEKK2NvdHg2NjcgY29tcGFyZXRvdGFsICAgMEUyICAtMEUxIC0+IDEKK2NvdHg2NjggY29tcGFyZXRvdGFsICAtMEUxICAtMEUyIC0+IDEKK2NvdHg2NjkgY29tcGFyZXRvdGFsICAtMEUyICAtMEUyIC0+IDAKK2NvdHg2NzAgY29tcGFyZXRvdGFsICAgMEUxICAtMEUyIC0+IDEKK2NvdHg2NzEgY29tcGFyZXRvdGFsICAgMEUyICAtMEUyIC0+IDEKK2NvdHg2NzIgY29tcGFyZXRvdGFsICAtMEUxICAgMEUxIC0+IC0xCitjb3R4NjczIGNvbXBhcmV0b3RhbCAgLTBFMiAgIDBFMSAtPiAtMQorY290eDY3NCBjb21wYXJldG90YWwgICAwRTEgICAwRTEgLT4gMAorY290eDY3NSBjb21wYXJldG90YWwgICAwRTIgICAwRTEgLT4gMQorY290eDY3NiBjb21wYXJldG90YWwgIC0wRTEgICAwRTIgLT4gLTEKK2NvdHg2NzcgY29tcGFyZXRvdGFsICAtMEUyICAgMEUyIC0+IC0xCitjb3R4Njc4IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDBFMiAtPiAtMQorY290eDY3OSBjb21wYXJldG90YWwgICAwRTIgICAwRTIgLT4gMAorCistLSB0cmFpbGluZyB6ZXJvczsgdW5pdC15CitwcmVjaXNpb246IDIwCitjb3R4NjgwIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyICAgICAgICAgICAtPiAwCitjb3R4NjgxIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAgICAgICAgICAtPiAxCitjb3R4NjgyIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwICAgICAgICAtPiAxCitjb3R4NjgzIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMCAgICAgICAtPiAxCitjb3R4Njg0IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAgICAgICAtPiAxCitjb3R4Njg1IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwICAgICAtPiAxCitjb3R4Njg2IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMCAgICAtPiAxCitjb3R4Njg3IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMDAgICAtPiAxCitjb3R4Njg4IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMDAwICAtPiAxCitjb3R4Njg5IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMDAwMCAtPiAxCitjb3R4NjkwIGNvbXBhcmV0b3RhbCAgIDEyICAgICAgICAgICAgICAxMiAtPiAwCitjb3R4NjkxIGNvbXBhcmV0b3RhbCAgIDEyLjAgICAgICAgICAgICAxMiAtPiAtMQorY290eDY5MiBjb21wYXJldG90YWwgICAxMi4wMCAgICAgICAgICAgMTIgLT4gLTEKK2NvdHg2OTMgY29tcGFyZXRvdGFsICAgMTIuMDAwICAgICAgICAgIDEyIC0+IC0xCitjb3R4Njk0IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAgICAgICAgICAxMiAtPiAtMQorY290eDY5NSBjb21wYXJldG90YWwgICAxMi4wMDAwMCAgICAgICAgMTIgLT4gLTEKK2NvdHg2OTYgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwICAgICAgIDEyIC0+IC0xCitjb3R4Njk3IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAgICAgICAxMiAtPiAtMQorY290eDY5OCBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMCAgICAgMTIgLT4gLTEKK2NvdHg2OTkgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMDAwICAgIDEyIC0+IC0xCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK2NvdHg3MDEgY29tcGFyZXRvdGFsIDEyMzQ1Njc4MDAwICAxIC0+ICAxCitjb3R4NzAyIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4MDAwICAtPiAtMQorY290eDcwMyBjb21wYXJldG90YWwgMTIzNDU2NzgwMCAgIDEgLT4gIDEKK2NvdHg3MDQgY29tcGFyZXRvdGFsIDEgMTIzNDU2NzgwMCAgIC0+IC0xCitjb3R4NzA1IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkwICAgMSAtPiAgMQorY290eDcwNiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkwICAgLT4gLTEKK2NvdHg3MDcgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTEgICAxIC0+ICAxCitjb3R4NzA4IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTEgICAtPiAtMQorY290eDcwOSBjb21wYXJldG90YWwgMTIzNDU2Nzg5MDEgIDEgLT4gIDEKK2NvdHg3MTAgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MDEgIC0+IC0xCitjb3R4NzExIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODk2ICAgMSAtPiAgMQorY290eDcxMiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODk2ICAgLT4gLTEKK2NvdHg3MTMgY29tcGFyZXRvdGFsIC0xMjM0NTY3ODkxICAxIC0+IC0xCitjb3R4NzE0IGNvbXBhcmV0b3RhbCAxIC0xMjM0NTY3ODkxICAtPiAgMQorY290eDcxNSBjb21wYXJldG90YWwgLTEyMzQ1Njc4OTAxIDEgLT4gLTEKK2NvdHg3MTYgY29tcGFyZXRvdGFsIDEgLTEyMzQ1Njc4OTAxIC0+ICAxCitjb3R4NzE3IGNvbXBhcmV0b3RhbCAtMTIzNDU2Nzg5NiAgMSAtPiAtMQorY290eDcxOCBjb21wYXJldG90YWwgMSAtMTIzNDU2Nzg5NiAgLT4gIDEKKworcHJlY2lzaW9uOiAxNQorLS0gc2FtZSB3aXRoIHBsZW50eSBvZiBwcmVjaXNpb24KK2NvdHg3MjEgY29tcGFyZXRvdGFsIDEyMzQ1Njc4MDAwIDEgLT4gMQorY290eDcyMiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODAwMCAtPiAtMQorY290eDcyMyBjb21wYXJldG90YWwgMTIzNDU2NzgwMCAgMSAtPiAxCitjb3R4NzI0IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4MDAgIC0+IC0xCitjb3R4NzI1IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkwICAxIC0+IDEKK2NvdHg3MjYgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MCAgLT4gLTEKK2NvdHg3MjcgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTEgIDEgLT4gMQorY290eDcyOCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkxICAtPiAtMQorY290eDcyOSBjb21wYXJldG90YWwgMTIzNDU2Nzg5MDEgMSAtPiAxCitjb3R4NzMwIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTAxIC0+IC0xCitjb3R4NzMxIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODk2ICAxIC0+IDEKK2NvdHg3MzIgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5NiAgLT4gLTEKKworLS0gcmVzaWR1ZSBjYXNlcworcHJlY2lzaW9uOiA1Citjb3R4NzQwIGNvbXBhcmV0b3RhbCAgMSAgMC45OTk5OTk5ICAtPiAxCitjb3R4NzQxIGNvbXBhcmV0b3RhbCAgMSAgMC45OTk5OTkgICAtPiAxCitjb3R4NzQyIGNvbXBhcmV0b3RhbCAgMSAgMC45OTk5OSAgICAtPiAxCitjb3R4NzQzIGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwICAgICAtPiAxCitjb3R4NzQ0IGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwMSAgICAtPiAtMQorY290eDc0NSBjb21wYXJldG90YWwgIDEgIDEuMDAwMDAxICAgLT4gLTEKK2NvdHg3NDYgY29tcGFyZXRvdGFsICAxICAxLjAwMDAwMDEgIC0+IC0xCitjb3R4NzUwIGNvbXBhcmV0b3RhbCAgMC45OTk5OTk5ICAxICAtPiAtMQorY290eDc1MSBjb21wYXJldG90YWwgIDAuOTk5OTk5ICAgMSAgLT4gLTEKK2NvdHg3NTIgY29tcGFyZXRvdGFsICAwLjk5OTk5ICAgIDEgIC0+IC0xCitjb3R4NzUzIGNvbXBhcmV0b3RhbCAgMS4wMDAwICAgICAxICAtPiAtMQorY290eDc1NCBjb21wYXJldG90YWwgIDEuMDAwMDEgICAgMSAgLT4gMQorY290eDc1NSBjb21wYXJldG90YWwgIDEuMDAwMDAxICAgMSAgLT4gMQorY290eDc1NiBjb21wYXJldG90YWwgIDEuMDAwMDAwMSAgMSAgLT4gMQorCistLSBhIHNlbGVjdGlvbiBvZiBsb25naWVzCitjb3R4NzYwIGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTU4MzA2MjkuODM0NzA4NTAyNTgwODc1NjU2MDM1Nzk0MCAtPiAtMQorY290eDc2MSBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMAorY290eDc2MiBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gLTEKK2NvdHg3NjMgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKKy0tIHByZWNpc2lvbnMgYWJvdmUgb3IgYmVsb3cgdGhlIGRpZmZlcmVuY2Ugc2hvdWxkIGhhdmUgbm8gZWZmZWN0CitwcmVjaXNpb246ICAgMTEKK2NvdHg3NjQgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAxMAorY290eDc2NSBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA5Citjb3R4NzY2IGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCitwcmVjaXNpb246ICAgIDgKK2NvdHg3NjcgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgNworY290eDc2OCBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICA2Citjb3R4NzY5IGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCitwcmVjaXNpb246ICAgIDUKK2NvdHg3NzAgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgNAorY290eDc3MSBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorcHJlY2lzaW9uOiAgICAzCitjb3R4NzcyIGNvbXBhcmV0b3RhbCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljk0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAtPiAxCitwcmVjaXNpb246ICAgIDIKK2NvdHg3NzMgY29tcGFyZXRvdGFsIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgIC0+IDEKK3ByZWNpc2lvbjogICAgMQorY290eDc3NCBjb21wYXJldG90YWwgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgLT4gMQorCistLSBTcGVjaWFscworcHJlY2lzaW9uOiAgIDkKK2NvdHg3ODAgY29tcGFyZXRvdGFsICBJbmYgIC1JbmYgICAtPiAgMQorY290eDc4MSBjb21wYXJldG90YWwgIEluZiAgLTEwMDAgIC0+ICAxCitjb3R4NzgyIGNvbXBhcmV0b3RhbCAgSW5mICAtMSAgICAgLT4gIDEKK2NvdHg3ODMgY29tcGFyZXRvdGFsICBJbmYgIC0wICAgICAtPiAgMQorY290eDc4NCBjb21wYXJldG90YWwgIEluZiAgIDAgICAgIC0+ICAxCitjb3R4Nzg1IGNvbXBhcmV0b3RhbCAgSW5mICAgMSAgICAgLT4gIDEKK2NvdHg3ODYgY29tcGFyZXRvdGFsICBJbmYgICAxMDAwICAtPiAgMQorY290eDc4NyBjb21wYXJldG90YWwgIEluZiAgIEluZiAgIC0+ICAwCitjb3R4Nzg4IGNvbXBhcmV0b3RhbCAtMTAwMCAgSW5mICAgLT4gLTEKK2NvdHg3ODkgY29tcGFyZXRvdGFsIC1JbmYgICBJbmYgICAtPiAtMQorY290eDc5MCBjb21wYXJldG90YWwgLTEgICAgIEluZiAgIC0+IC0xCitjb3R4NzkxIGNvbXBhcmV0b3RhbCAtMCAgICAgSW5mICAgLT4gLTEKK2NvdHg3OTIgY29tcGFyZXRvdGFsICAwICAgICBJbmYgICAtPiAtMQorY290eDc5MyBjb21wYXJldG90YWwgIDEgICAgIEluZiAgIC0+IC0xCitjb3R4Nzk0IGNvbXBhcmV0b3RhbCAgMTAwMCAgSW5mICAgLT4gLTEKK2NvdHg3OTUgY29tcGFyZXRvdGFsICBJbmYgICBJbmYgICAtPiAgMAorCitjb3R4ODAwIGNvbXBhcmV0b3RhbCAtSW5mICAtSW5mICAgLT4gIDAKK2NvdHg4MDEgY29tcGFyZXRvdGFsIC1JbmYgIC0xMDAwICAtPiAtMQorY290eDgwMiBjb21wYXJldG90YWwgLUluZiAgLTEgICAgIC0+IC0xCitjb3R4ODAzIGNvbXBhcmV0b3RhbCAtSW5mICAtMCAgICAgLT4gLTEKK2NvdHg4MDQgY29tcGFyZXRvdGFsIC1JbmYgICAwICAgICAtPiAtMQorY290eDgwNSBjb21wYXJldG90YWwgLUluZiAgIDEgICAgIC0+IC0xCitjb3R4ODA2IGNvbXBhcmV0b3RhbCAtSW5mICAgMTAwMCAgLT4gLTEKK2NvdHg4MDcgY29tcGFyZXRvdGFsIC1JbmYgICBJbmYgICAtPiAtMQorY290eDgwOCBjb21wYXJldG90YWwgLUluZiAgLUluZiAgIC0+ICAwCitjb3R4ODA5IGNvbXBhcmV0b3RhbCAtMTAwMCAtSW5mICAgLT4gIDEKK2NvdHg4MTAgY29tcGFyZXRvdGFsIC0xICAgIC1JbmYgICAtPiAgMQorY290eDgxMSBjb21wYXJldG90YWwgLTAgICAgLUluZiAgIC0+ICAxCitjb3R4ODEyIGNvbXBhcmV0b3RhbCAgMCAgICAtSW5mICAgLT4gIDEKK2NvdHg4MTMgY29tcGFyZXRvdGFsICAxICAgIC1JbmYgICAtPiAgMQorY290eDgxNCBjb21wYXJldG90YWwgIDEwMDAgLUluZiAgIC0+ICAxCitjb3R4ODE1IGNvbXBhcmV0b3RhbCAgSW5mICAtSW5mICAgLT4gIDEKKworY290eDgyMSBjb21wYXJldG90YWwgIE5hTiAtSW5mICAgIC0+ICAxCitjb3R4ODIyIGNvbXBhcmV0b3RhbCAgTmFOIC0xMDAwICAgLT4gIDEKK2NvdHg4MjMgY29tcGFyZXRvdGFsICBOYU4gLTEgICAgICAtPiAgMQorY290eDgyNCBjb21wYXJldG90YWwgIE5hTiAtMCAgICAgIC0+ICAxCitjb3R4ODI1IGNvbXBhcmV0b3RhbCAgTmFOICAwICAgICAgLT4gIDEKK2NvdHg4MjYgY29tcGFyZXRvdGFsICBOYU4gIDEgICAgICAtPiAgMQorY290eDgyNyBjb21wYXJldG90YWwgIE5hTiAgMTAwMCAgIC0+ICAxCitjb3R4ODI4IGNvbXBhcmV0b3RhbCAgTmFOICBJbmYgICAgLT4gIDEKK2NvdHg4MjkgY29tcGFyZXRvdGFsICBOYU4gIE5hTiAgICAtPiAgMAorY290eDgzMCBjb21wYXJldG90YWwgLUluZiAgTmFOICAgIC0+ICAtMQorY290eDgzMSBjb21wYXJldG90YWwgLTEwMDAgTmFOICAgIC0+ICAtMQorY290eDgzMiBjb21wYXJldG90YWwgLTEgICAgTmFOICAgIC0+ICAtMQorY290eDgzMyBjb21wYXJldG90YWwgLTAgICAgTmFOICAgIC0+ICAtMQorY290eDgzNCBjb21wYXJldG90YWwgIDAgICAgTmFOICAgIC0+ICAtMQorY290eDgzNSBjb21wYXJldG90YWwgIDEgICAgTmFOICAgIC0+ICAtMQorY290eDgzNiBjb21wYXJldG90YWwgIDEwMDAgTmFOICAgIC0+ICAtMQorY290eDgzNyBjb21wYXJldG90YWwgIEluZiAgTmFOICAgIC0+ICAtMQorY290eDgzOCBjb21wYXJldG90YWwgLU5hTiAtTmFOICAgIC0+ICAwCitjb3R4ODM5IGNvbXBhcmV0b3RhbCArTmFOIC1OYU4gICAgLT4gIDEKK2NvdHg4NDAgY29tcGFyZXRvdGFsIC1OYU4gK05hTiAgICAtPiAgLTEKKworY290eDg0MSBjb21wYXJldG90YWwgIHNOYU4gLXNOYU4gIC0+ICAxCitjb3R4ODQyIGNvbXBhcmV0b3RhbCAgc05hTiAtTmFOICAgLT4gIDEKK2NvdHg4NDMgY29tcGFyZXRvdGFsICBzTmFOIC1JbmYgICAtPiAgMQorY290eDg0NCBjb21wYXJldG90YWwgIHNOYU4gLTEwMDAgIC0+ICAxCitjb3R4ODQ1IGNvbXBhcmV0b3RhbCAgc05hTiAtMSAgICAgLT4gIDEKK2NvdHg4NDYgY29tcGFyZXRvdGFsICBzTmFOIC0wICAgICAtPiAgMQorY290eDg0NyBjb21wYXJldG90YWwgIHNOYU4gIDAgICAgIC0+ICAxCitjb3R4ODQ4IGNvbXBhcmV0b3RhbCAgc05hTiAgMSAgICAgLT4gIDEKK2NvdHg4NDkgY29tcGFyZXRvdGFsICBzTmFOICAxMDAwICAtPiAgMQorY290eDg1MCBjb21wYXJldG90YWwgIHNOYU4gIE5hTiAgIC0+ICAtMQorY290eDg1MSBjb21wYXJldG90YWwgIHNOYU4gc05hTiAgIC0+ICAwCisKK2NvdHg4NTIgY29tcGFyZXRvdGFsIC1zTmFOIHNOYU4gICAtPiAgLTEKK2NvdHg4NTMgY29tcGFyZXRvdGFsIC1OYU4gIHNOYU4gICAtPiAgLTEKK2NvdHg4NTQgY29tcGFyZXRvdGFsIC1JbmYgIHNOYU4gICAtPiAgLTEKK2NvdHg4NTUgY29tcGFyZXRvdGFsIC0xMDAwIHNOYU4gICAtPiAgLTEKK2NvdHg4NTYgY29tcGFyZXRvdGFsIC0xICAgIHNOYU4gICAtPiAgLTEKK2NvdHg4NTcgY29tcGFyZXRvdGFsIC0wICAgIHNOYU4gICAtPiAgLTEKK2NvdHg4NTggY29tcGFyZXRvdGFsICAwICAgIHNOYU4gICAtPiAgLTEKK2NvdHg4NTkgY29tcGFyZXRvdGFsICAxICAgIHNOYU4gICAtPiAgLTEKK2NvdHg4NjAgY29tcGFyZXRvdGFsICAxMDAwIHNOYU4gICAtPiAgLTEKK2NvdHg4NjEgY29tcGFyZXRvdGFsICBJbmYgIHNOYU4gICAtPiAgLTEKK2NvdHg4NjIgY29tcGFyZXRvdGFsICBOYU4gIHNOYU4gICAtPiAgMQorY290eDg2MyBjb21wYXJldG90YWwgIHNOYU4gc05hTiAgIC0+ICAwCisKK2NvdHg4NzEgY29tcGFyZXRvdGFsICAtc05hTiAtc05hTiAgLT4gIDAKK2NvdHg4NzIgY29tcGFyZXRvdGFsICAtc05hTiAtTmFOICAgLT4gIDEKK2NvdHg4NzMgY29tcGFyZXRvdGFsICAtc05hTiAtSW5mICAgLT4gIC0xCitjb3R4ODc0IGNvbXBhcmV0b3RhbCAgLXNOYU4gLTEwMDAgIC0+ICAtMQorY290eDg3NSBjb21wYXJldG90YWwgIC1zTmFOIC0xICAgICAtPiAgLTEKK2NvdHg4NzYgY29tcGFyZXRvdGFsICAtc05hTiAtMCAgICAgLT4gIC0xCitjb3R4ODc3IGNvbXBhcmV0b3RhbCAgLXNOYU4gIDAgICAgIC0+ICAtMQorY290eDg3OCBjb21wYXJldG90YWwgIC1zTmFOICAxICAgICAtPiAgLTEKK2NvdHg4NzkgY29tcGFyZXRvdGFsICAtc05hTiAgMTAwMCAgLT4gIC0xCitjb3R4ODgwIGNvbXBhcmV0b3RhbCAgLXNOYU4gIE5hTiAgIC0+ICAtMQorY290eDg4MSBjb21wYXJldG90YWwgIC1zTmFOIHNOYU4gICAtPiAgLTEKKworY290eDg4MiBjb21wYXJldG90YWwgLXNOYU4gLXNOYU4gICAtPiAgMAorY290eDg4MyBjb21wYXJldG90YWwgLU5hTiAgLXNOYU4gICAtPiAgLTEKK2NvdHg4ODQgY29tcGFyZXRvdGFsIC1JbmYgIC1zTmFOICAgLT4gIDEKK2NvdHg4ODUgY29tcGFyZXRvdGFsIC0xMDAwIC1zTmFOICAgLT4gIDEKK2NvdHg4ODYgY29tcGFyZXRvdGFsIC0xICAgIC1zTmFOICAgLT4gIDEKK2NvdHg4ODcgY29tcGFyZXRvdGFsIC0wICAgIC1zTmFOICAgLT4gIDEKK2NvdHg4ODggY29tcGFyZXRvdGFsICAwICAgIC1zTmFOICAgLT4gIDEKK2NvdHg4ODkgY29tcGFyZXRvdGFsICAxICAgIC1zTmFOICAgLT4gIDEKK2NvdHg4OTAgY29tcGFyZXRvdGFsICAxMDAwIC1zTmFOICAgLT4gIDEKK2NvdHg4OTEgY29tcGFyZXRvdGFsICBJbmYgIC1zTmFOICAgLT4gIDEKK2NvdHg4OTIgY29tcGFyZXRvdGFsICBOYU4gIC1zTmFOICAgLT4gIDEKK2NvdHg4OTMgY29tcGFyZXRvdGFsICBzTmFOIC1zTmFOICAgLT4gIDEKKworLS0gTmFOcyB3aXRoIHBheWxvYWQKK2NvdHg5NjAgY29tcGFyZXRvdGFsICBOYU45IC1JbmYgICAtPiAgMQorY290eDk2MSBjb21wYXJldG90YWwgIE5hTjggIDk5OSAgIC0+ICAxCitjb3R4OTYyIGNvbXBhcmV0b3RhbCAgTmFONzcgSW5mICAgLT4gIDEKK2NvdHg5NjMgY29tcGFyZXRvdGFsIC1OYU42NyBOYU41ICAtPiAgLTEKK2NvdHg5NjQgY29tcGFyZXRvdGFsIC1JbmYgIC1OYU40ICAtPiAgMQorY290eDk2NSBjb21wYXJldG90YWwgLTk5OSAgLU5hTjMzIC0+ICAxCitjb3R4OTY2IGNvbXBhcmV0b3RhbCAgSW5mICAgTmFOMiAgLT4gIC0xCisKK2NvdHg5NzAgY29tcGFyZXRvdGFsIC1OYU40MSAtTmFONDIgLT4gMQorY290eDk3MSBjb21wYXJldG90YWwgK05hTjQxIC1OYU40MiAtPiAxCitjb3R4OTcyIGNvbXBhcmV0b3RhbCAtTmFONDEgK05hTjQyIC0+IC0xCitjb3R4OTczIGNvbXBhcmV0b3RhbCArTmFONDEgK05hTjQyIC0+IC0xCitjb3R4OTc0IGNvbXBhcmV0b3RhbCAtTmFONDIgLU5hTjAxIC0+IC0xCitjb3R4OTc1IGNvbXBhcmV0b3RhbCArTmFONDIgLU5hTjAxIC0+ICAxCitjb3R4OTc2IGNvbXBhcmV0b3RhbCAtTmFONDIgK05hTjAxIC0+IC0xCitjb3R4OTc3IGNvbXBhcmV0b3RhbCArTmFONDIgK05hTjAxIC0+ICAxCisKK2NvdHg5ODAgY29tcGFyZXRvdGFsIC1zTmFONzcxIC1zTmFONzcyIC0+IDEKK2NvdHg5ODEgY29tcGFyZXRvdGFsICtzTmFONzcxIC1zTmFONzcyIC0+IDEKK2NvdHg5ODIgY29tcGFyZXRvdGFsIC1zTmFONzcxICtzTmFONzcyIC0+IC0xCitjb3R4OTgzIGNvbXBhcmV0b3RhbCArc05hTjc3MSArc05hTjc3MiAtPiAtMQorY290eDk4NCBjb21wYXJldG90YWwgLXNOYU43NzIgLXNOYU43NzEgLT4gLTEKK2NvdHg5ODUgY29tcGFyZXRvdGFsICtzTmFONzcyIC1zTmFONzcxIC0+ICAxCitjb3R4OTg2IGNvbXBhcmV0b3RhbCAtc05hTjc3MiArc05hTjc3MSAtPiAtMQorY290eDk4NyBjb21wYXJldG90YWwgK3NOYU43NzIgK3NOYU43NzEgLT4gIDEKKworY290eDk5MSBjb21wYXJldG90YWwgLXNOYU45OSAtSW5mICAgIC0+IC0xCitjb3R4OTkyIGNvbXBhcmV0b3RhbCAgc05hTjk4IC0xMSAgICAgLT4gIDEKK2NvdHg5OTMgY29tcGFyZXRvdGFsICBzTmFOOTcgIE5hTiAgICAtPiAtMQorY290eDk5NCBjb21wYXJldG90YWwgIHNOYU4xNiBzTmFOOTQgIC0+IC0xCitjb3R4OTk1IGNvbXBhcmV0b3RhbCAgTmFOODUgIHNOYU44MyAgLT4gIDEKK2NvdHg5OTYgY29tcGFyZXRvdGFsIC1JbmYgICAgc05hTjkyICAtPiAtMQorY290eDk5NyBjb21wYXJldG90YWwgIDA4OCAgICBzTmFOODEgIC0+IC0xCitjb3R4OTk4IGNvbXBhcmV0b3RhbCAgSW5mICAgIHNOYU45MCAgLT4gLTEKK2NvdHg5OTkgY29tcGFyZXRvdGFsICBOYU4gICAtc05hTjg5ICAtPiAgMQorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIHN1Ym5vcm1hbCByZXN1bHRzIG5vdyBhbGxvd2VkCittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorY290eDEwODAgY29tcGFyZXRvdGFsICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtMQorY290eDEwODEgY29tcGFyZXRvdGFsIDlFKzk5OTk5OTk5OSArMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorY290eDEwODIgY29tcGFyZXRvdGFsICswLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAgMQorY290eDEwODMgY29tcGFyZXRvdGFsIDlFLTk5OTk5OTk5OSArMC4xMDAgICAgICAgICAgICAgICAtPiAtMQorY290eDEwODUgY29tcGFyZXRvdGFsIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtMQorY290eDEwODYgY29tcGFyZXRvdGFsIDlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorY290eDEwODcgY29tcGFyZXRvdGFsIC0wLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAtMQorY290eDEwODggY29tcGFyZXRvdGFsIDlFLTk5OTk5OTk5OSAtMC4xMDAgICAgICAgICAgICAgICAtPiAgMQorCitjb3R4MTA4OSBjb21wYXJldG90YWwgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMSAgIC0+IC0xCitjb3R4MTA5MCBjb21wYXJldG90YWwgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMCAgIC0+IC0xCitjb3R4MTA5MSBjb21wYXJldG90YWwgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwMCAgIC0+IC0xCitjb3R4MTA5MiBjb21wYXJldG90YWwgOWUtOTk5OTk5OTk4IDAuMDEgICAgICAgICAgIC0+IC0xCitjb3R4MTA5MyBjb21wYXJldG90YWwgOWUtOTk5OTk5OTk4IDAuMSAgICAgICAgICAgIC0+IC0xCitjb3R4MTA5NCBjb21wYXJldG90YWwgMC4wMSA5ZS05OTk5OTk5OTggICAgICAgICAgIC0+ICAxCitjb3R4MTA5NSBjb21wYXJldG90YWwgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDEgICAgIC0+ICAxCitjb3R4MTA5NiBjb21wYXJldG90YWwgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDAgICAgIC0+ICAxCitjb3R4MTA5NyBjb21wYXJldG90YWwgMWU2MDAwMDAwMDAgMWU0MDAwMDAwMDAgICAgIC0+ICAxCitjb3R4MTA5OCBjb21wYXJldG90YWwgOWU5OTk5OTk5OTggMTAwICAgICAgICAgICAgIC0+ICAxCitjb3R4MTA5OSBjb21wYXJldG90YWwgOWU5OTk5OTk5OTggMTAgICAgICAgICAgICAgIC0+ICAxCitjb3R4MTEwMCBjb21wYXJldG90YWwgMTAwICA5ZTk5OTk5OTk5OCAgICAgICAgICAgIC0+IC0xCistLSBzaWducworY290eDExMDEgY29tcGFyZXRvdGFsICAxZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAgMQorY290eDExMDIgY29tcGFyZXRvdGFsICAxZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAgMQorY290eDExMDMgY29tcGFyZXRvdGFsIC0xZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAtMQorY290eDExMDQgY29tcGFyZXRvdGFsIC0xZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAtMQorY290eDExMDUgY29tcGFyZXRvdGFsICAxZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAtMQorY290eDExMDYgY29tcGFyZXRvdGFsICAxZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAgMQorY290eDExMDcgY29tcGFyZXRvdGFsIC0xZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAtMQorY290eDExMDggY29tcGFyZXRvdGFsIC0xZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAgMQorCistLSBzcHJlYWQgemVyb3MKK2NvdHgxMTEwIGNvbXBhcmV0b3RhbCAgIDBFLTM4MyAgMCAgICAgICAtPiAtMQorY290eDExMTEgY29tcGFyZXRvdGFsICAgMEUtMzgzIC0wICAgICAgIC0+ICAxCitjb3R4MTExMiBjb21wYXJldG90YWwgIC0wRS0zODMgIDAgICAgICAgLT4gLTEKK2NvdHgxMTEzIGNvbXBhcmV0b3RhbCAgLTBFLTM4MyAtMCAgICAgICAtPiAgMQorY290eDExMTQgY29tcGFyZXRvdGFsICAgMEUtMzgzICAwRSszODQgIC0+IC0xCitjb3R4MTExNSBjb21wYXJldG90YWwgICAwRS0zODMgLTBFKzM4NCAgLT4gIDEKK2NvdHgxMTE2IGNvbXBhcmV0b3RhbCAgLTBFLTM4MyAgMEUrMzg0ICAtPiAtMQorY290eDExMTcgY29tcGFyZXRvdGFsICAtMEUtMzgzIC0wRSszODQgIC0+ICAxCitjb3R4MTExOCBjb21wYXJldG90YWwgICAwICAgICAgIDBFKzM4NCAgLT4gLTEKK2NvdHgxMTE5IGNvbXBhcmV0b3RhbCAgIDAgICAgICAtMEUrMzg0ICAtPiAgMQorY290eDExMjAgY29tcGFyZXRvdGFsICAtMCAgICAgICAwRSszODQgIC0+IC0xCitjb3R4MTEyMSBjb21wYXJldG90YWwgIC0wICAgICAgLTBFKzM4NCAgLT4gIDEKKworY290eDExMzAgY29tcGFyZXRvdGFsICAgMEUrMzg0ICAwICAgICAgIC0+ICAxCitjb3R4MTEzMSBjb21wYXJldG90YWwgICAwRSszODQgLTAgICAgICAgLT4gIDEKK2NvdHgxMTMyIGNvbXBhcmV0b3RhbCAgLTBFKzM4NCAgMCAgICAgICAtPiAtMQorY290eDExMzMgY29tcGFyZXRvdGFsICAtMEUrMzg0IC0wICAgICAgIC0+IC0xCitjb3R4MTEzNCBjb21wYXJldG90YWwgICAwRSszODQgIDBFLTM4MyAgLT4gIDEKK2NvdHgxMTM1IGNvbXBhcmV0b3RhbCAgIDBFKzM4NCAtMEUtMzgzICAtPiAgMQorY290eDExMzYgY29tcGFyZXRvdGFsICAtMEUrMzg0ICAwRS0zODMgIC0+IC0xCitjb3R4MTEzNyBjb21wYXJldG90YWwgIC0wRSszODQgLTBFLTM4MyAgLT4gLTEKK2NvdHgxMTM4IGNvbXBhcmV0b3RhbCAgIDAgICAgICAgMEUtMzgzICAtPiAgMQorY290eDExMzkgY29tcGFyZXRvdGFsICAgMCAgICAgIC0wRS0zODMgIC0+ICAxCitjb3R4MTE0MCBjb21wYXJldG90YWwgIC0wICAgICAgIDBFLTM4MyAgLT4gLTEKK2NvdHgxMTQxIGNvbXBhcmV0b3RhbCAgLTAgICAgICAtMEUtMzgzICAtPiAtMQorCistLSBOdWxsIHRlc3RzCitjb3R4OTk5MCBjb21wYXJldG90YWwgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitjb3R4OTk5MSBjb21wYXJldG90YWwgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvbXBhcmV0b3RtYWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29tcGFyZXRvdG1hZy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZGZkZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvbXBhcmV0b3RtYWcuZGVjVGVzdApAQCAtMCwwICsxLDc5MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjb21wYXJldG90bWFnLmRlY1Rlc3QgLS0gZGVjaW1hbCBjb21wYXJpc29uLCBhYnMuIHRvdGFsIG9yZGVyaW5nICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCBpdCBjYW5ub3QgYmUgYXNzdW1lZCB0aGF0IGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocworLS0gZm9yIHRoaXMgb3BlcmF0aW9uIGFkZXF1YXRlbHksIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUKKy0tIHF1aXRlIGRpZmZlcmVudCAoY29tcGFyaXNvbiBjYW5ub3Qgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbworLS0gYWN0dWFsIHN1YnRyYWN0aW9ucyBhcmUgbm90IG5lY2Vzc2FyeSkuIFNpbWlsYXJseSwgY29tcGFyZXRvdGFsCistLSB3aWxsIGhhdmUgc29tZSByYWRpY2FsbHkgZGlmZmVyZW50IHBhdGhzIHRoYW4gY29tcGFyZS4KKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MKK2N0bXgwMDEgY29tcGFyZXRvdG1hZyAgLTIgIC0yICAgLT4gICAwCitjdG14MDAyIGNvbXBhcmV0b3RtYWcgIC0yICAtMSAgIC0+ICAgMQorY3RteDAwMyBjb21wYXJldG90bWFnICAtMiAgIDAgICAtPiAgIDEKK2N0bXgwMDQgY29tcGFyZXRvdG1hZyAgLTIgICAxICAgLT4gICAxCitjdG14MDA1IGNvbXBhcmV0b3RtYWcgIC0yICAgMiAgIC0+ICAgMAorY3RteDAwNiBjb21wYXJldG90bWFnICAtMSAgLTIgICAtPiAgLTEKK2N0bXgwMDcgY29tcGFyZXRvdG1hZyAgLTEgIC0xICAgLT4gICAwCitjdG14MDA4IGNvbXBhcmV0b3RtYWcgIC0xICAgMCAgIC0+ICAgMQorY3RteDAwOSBjb21wYXJldG90bWFnICAtMSAgIDEgICAtPiAgIDAKK2N0bXgwMTAgY29tcGFyZXRvdG1hZyAgLTEgICAyICAgLT4gIC0xCitjdG14MDExIGNvbXBhcmV0b3RtYWcgICAwICAtMiAgIC0+ICAtMQorY3RteDAxMiBjb21wYXJldG90bWFnICAgMCAgLTEgICAtPiAgLTEKK2N0bXgwMTMgY29tcGFyZXRvdG1hZyAgIDAgICAwICAgLT4gICAwCitjdG14MDE0IGNvbXBhcmV0b3RtYWcgICAwICAgMSAgIC0+ICAtMQorY3RteDAxNSBjb21wYXJldG90bWFnICAgMCAgIDIgICAtPiAgLTEKK2N0bXgwMTYgY29tcGFyZXRvdG1hZyAgIDEgIC0yICAgLT4gIC0xCitjdG14MDE3IGNvbXBhcmV0b3RtYWcgICAxICAtMSAgIC0+ICAgMAorY3RteDAxOCBjb21wYXJldG90bWFnICAgMSAgIDAgICAtPiAgIDEKK2N0bXgwMTkgY29tcGFyZXRvdG1hZyAgIDEgICAxICAgLT4gICAwCitjdG14MDIwIGNvbXBhcmV0b3RtYWcgICAxICAgMiAgIC0+ICAtMQorY3RteDAyMSBjb21wYXJldG90bWFnICAgMiAgLTIgICAtPiAgIDAKK2N0bXgwMjIgY29tcGFyZXRvdG1hZyAgIDIgIC0xICAgLT4gICAxCitjdG14MDIzIGNvbXBhcmV0b3RtYWcgICAyICAgMCAgIC0+ICAgMQorY3RteDAyNSBjb21wYXJldG90bWFnICAgMiAgIDEgICAtPiAgIDEKK2N0bXgwMjYgY29tcGFyZXRvdG1hZyAgIDIgICAyICAgLT4gICAwCisKK2N0bXgwMzEgY29tcGFyZXRvdG1hZyAgLTIwICAtMjAgICAtPiAgIDAKK2N0bXgwMzIgY29tcGFyZXRvdG1hZyAgLTIwICAtMTAgICAtPiAgIDEKK2N0bXgwMzMgY29tcGFyZXRvdG1hZyAgLTIwICAgMDAgICAtPiAgIDEKK2N0bXgwMzQgY29tcGFyZXRvdG1hZyAgLTIwICAgMTAgICAtPiAgIDEKK2N0bXgwMzUgY29tcGFyZXRvdG1hZyAgLTIwICAgMjAgICAtPiAgIDAKK2N0bXgwMzYgY29tcGFyZXRvdG1hZyAgLTEwICAtMjAgICAtPiAgLTEKK2N0bXgwMzcgY29tcGFyZXRvdG1hZyAgLTEwICAtMTAgICAtPiAgIDAKK2N0bXgwMzggY29tcGFyZXRvdG1hZyAgLTEwICAgMDAgICAtPiAgIDEKK2N0bXgwMzkgY29tcGFyZXRvdG1hZyAgLTEwICAgMTAgICAtPiAgIDAKK2N0bXgwNDAgY29tcGFyZXRvdG1hZyAgLTEwICAgMjAgICAtPiAgLTEKK2N0bXgwNDEgY29tcGFyZXRvdG1hZyAgIDAwICAtMjAgICAtPiAgLTEKK2N0bXgwNDIgY29tcGFyZXRvdG1hZyAgIDAwICAtMTAgICAtPiAgLTEKK2N0bXgwNDMgY29tcGFyZXRvdG1hZyAgIDAwICAgMDAgICAtPiAgIDAKK2N0bXgwNDQgY29tcGFyZXRvdG1hZyAgIDAwICAgMTAgICAtPiAgLTEKK2N0bXgwNDUgY29tcGFyZXRvdG1hZyAgIDAwICAgMjAgICAtPiAgLTEKK2N0bXgwNDYgY29tcGFyZXRvdG1hZyAgIDEwICAtMjAgICAtPiAgLTEKK2N0bXgwNDcgY29tcGFyZXRvdG1hZyAgIDEwICAtMTAgICAtPiAgIDAKK2N0bXgwNDggY29tcGFyZXRvdG1hZyAgIDEwICAgMDAgICAtPiAgIDEKK2N0bXgwNDkgY29tcGFyZXRvdG1hZyAgIDEwICAgMTAgICAtPiAgIDAKK2N0bXgwNTAgY29tcGFyZXRvdG1hZyAgIDEwICAgMjAgICAtPiAgLTEKK2N0bXgwNTEgY29tcGFyZXRvdG1hZyAgIDIwICAtMjAgICAtPiAgIDAKK2N0bXgwNTIgY29tcGFyZXRvdG1hZyAgIDIwICAtMTAgICAtPiAgIDEKK2N0bXgwNTMgY29tcGFyZXRvdG1hZyAgIDIwICAgMDAgICAtPiAgIDEKK2N0bXgwNTUgY29tcGFyZXRvdG1hZyAgIDIwICAgMTAgICAtPiAgIDEKK2N0bXgwNTYgY29tcGFyZXRvdG1hZyAgIDIwICAgMjAgICAtPiAgIDAKKworY3RteDA2MSBjb21wYXJldG90bWFnICAtMi4wICAtMi4wICAgLT4gICAwCitjdG14MDYyIGNvbXBhcmV0b3RtYWcgIC0yLjAgIC0xLjAgICAtPiAgIDEKK2N0bXgwNjMgY29tcGFyZXRvdG1hZyAgLTIuMCAgIDAuMCAgIC0+ICAgMQorY3RteDA2NCBjb21wYXJldG90bWFnICAtMi4wICAgMS4wICAgLT4gICAxCitjdG14MDY1IGNvbXBhcmV0b3RtYWcgIC0yLjAgICAyLjAgICAtPiAgIDAKK2N0bXgwNjYgY29tcGFyZXRvdG1hZyAgLTEuMCAgLTIuMCAgIC0+ICAtMQorY3RteDA2NyBjb21wYXJldG90bWFnICAtMS4wICAtMS4wICAgLT4gICAwCitjdG14MDY4IGNvbXBhcmV0b3RtYWcgIC0xLjAgICAwLjAgICAtPiAgIDEKK2N0bXgwNjkgY29tcGFyZXRvdG1hZyAgLTEuMCAgIDEuMCAgIC0+ICAgMAorY3RteDA3MCBjb21wYXJldG90bWFnICAtMS4wICAgMi4wICAgLT4gIC0xCitjdG14MDcxIGNvbXBhcmV0b3RtYWcgICAwLjAgIC0yLjAgICAtPiAgLTEKK2N0bXgwNzIgY29tcGFyZXRvdG1hZyAgIDAuMCAgLTEuMCAgIC0+ICAtMQorY3RteDA3MyBjb21wYXJldG90bWFnICAgMC4wICAgMC4wICAgLT4gICAwCitjdG14MDc0IGNvbXBhcmV0b3RtYWcgICAwLjAgICAxLjAgICAtPiAgLTEKK2N0bXgwNzUgY29tcGFyZXRvdG1hZyAgIDAuMCAgIDIuMCAgIC0+ICAtMQorY3RteDA3NiBjb21wYXJldG90bWFnICAgMS4wICAtMi4wICAgLT4gIC0xCitjdG14MDc3IGNvbXBhcmV0b3RtYWcgICAxLjAgIC0xLjAgICAtPiAgIDAKK2N0bXgwNzggY29tcGFyZXRvdG1hZyAgIDEuMCAgIDAuMCAgIC0+ICAgMQorY3RteDA3OSBjb21wYXJldG90bWFnICAgMS4wICAgMS4wICAgLT4gICAwCitjdG14MDgwIGNvbXBhcmV0b3RtYWcgICAxLjAgICAyLjAgICAtPiAgLTEKK2N0bXgwODEgY29tcGFyZXRvdG1hZyAgIDIuMCAgLTIuMCAgIC0+ICAgMAorY3RteDA4MiBjb21wYXJldG90bWFnICAgMi4wICAtMS4wICAgLT4gICAxCitjdG14MDgzIGNvbXBhcmV0b3RtYWcgICAyLjAgICAwLjAgICAtPiAgIDEKK2N0bXgwODUgY29tcGFyZXRvdG1hZyAgIDIuMCAgIDEuMCAgIC0+ICAgMQorY3RteDA4NiBjb21wYXJldG90bWFnICAgMi4wICAgMi4wICAgLT4gICAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK2N0bXgwOTAgY29tcGFyZXRvdG1hZyAgOS45OTk5OTk5OUUrOTk5OTk5OTk5IDkuOTk5OTk5OTlFKzk5OTk5OTk5OSAgIC0+ICAgMAorY3RteDA5MSBjb21wYXJldG90bWFnIC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgOS45OTk5OTk5OUUrOTk5OTk5OTk5ICAgLT4gICAwCitjdG14MDkyIGNvbXBhcmV0b3RtYWcgIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSAtOS45OTk5OTk5OUUrOTk5OTk5OTk5ICAtPiAgIDAKK2N0bXgwOTMgY29tcGFyZXRvdG1hZyAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgIC0+ICAgMAorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKKy0tIGluIHRoaXMgZmlyc3QgZ3JvdXAsIGNvbXBhcmUgd291bGQgY29tcGFyZSBhbGwgZXF1YWwKK2N0bXgxMDAgY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3LjAgICAgIC0+ICAgMAorY3RteDEwMSBjb21wYXJldG90bWFnICAgNy4wICAgIDcgICAgICAgLT4gIC0xCitjdG14MTAyIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgNy4wICAgICAtPiAgIDEKK2N0bXgxMDMgY29tcGFyZXRvdG1hZyAgIDdFKzAgICA3LjAgICAgIC0+ICAgMQorY3RteDEwNCBjb21wYXJldG90bWFnICAgNzBFLTEgIDcuMCAgICAgLT4gICAwCitjdG14MTA1IGNvbXBhcmV0b3RtYWcgICAwLjdFKzEgNyAgICAgICAtPiAgIDAKK2N0bXgxMDYgY29tcGFyZXRvdG1hZyAgIDcwRS0xICA3ICAgICAgIC0+ICAtMQorY3RteDEwNyBjb21wYXJldG90bWFnICAgNy4wICAgIDdFKzAgICAgLT4gIC0xCitjdG14MTA4IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgNzBFLTEgICAtPiAgIDAKK2N0bXgxMDkgY29tcGFyZXRvdG1hZyAgIDcgICAgICAwLjdFKzEgIC0+ICAgMAorY3RteDExMCBjb21wYXJldG90bWFnICAgNyAgICAgIDcwRS0xICAgLT4gICAxCisKK2N0bXgxMjAgY29tcGFyZXRvdG1hZyAgIDguMCAgICA3LjAgICAgIC0+ICAgMQorY3RteDEyMSBjb21wYXJldG90bWFnICAgOC4wICAgIDcgICAgICAgLT4gICAxCitjdG14MTIyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgNy4wICAgICAtPiAgIDEKK2N0bXgxMjMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICA3LjAgICAgIC0+ICAgMQorY3RteDEyNCBjb21wYXJldG90bWFnICAgODBFLTEgIDcuMCAgICAgLT4gICAxCitjdG14MTI1IGNvbXBhcmV0b3RtYWcgICAwLjhFKzEgNyAgICAgICAtPiAgIDEKK2N0bXgxMjYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICA3ICAgICAgIC0+ICAgMQorY3RteDEyNyBjb21wYXJldG90bWFnICAgOC4wICAgIDdFKzAgICAgLT4gICAxCitjdG14MTI4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgNzBFLTEgICAtPiAgIDEKK2N0bXgxMjkgY29tcGFyZXRvdG1hZyAgIDggICAgICAwLjdFKzEgICAtPiAgIDEKK2N0bXgxMzAgY29tcGFyZXRvdG1hZyAgIDggICAgICA3MEUtMSAgIC0+ICAgMQorCitjdG14MTQwIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgOS4wICAgICAtPiAgLTEKK2N0bXgxNDEgY29tcGFyZXRvdG1hZyAgIDguMCAgICA5ICAgICAgIC0+ICAtMQorY3RteDE0MiBjb21wYXJldG90bWFnICAgOCAgICAgIDkuMCAgICAgLT4gIC0xCitjdG14MTQzIGNvbXBhcmV0b3RtYWcgICA4RSswICAgOS4wICAgICAtPiAgLTEKK2N0bXgxNDQgY29tcGFyZXRvdG1hZyAgIDgwRS0xICA5LjAgICAgIC0+ICAtMQorY3RteDE0NSBjb21wYXJldG90bWFnICAgMC44RSsxIDkgICAgICAgLT4gIC0xCitjdG14MTQ2IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgOSAgICAgICAtPiAgLTEKK2N0bXgxNDcgY29tcGFyZXRvdG1hZyAgIDguMCAgICA5RSswICAgIC0+ICAtMQorY3RteDE0OCBjb21wYXJldG90bWFnICAgOC4wICAgIDkwRS0xICAgLT4gIC0xCitjdG14MTQ5IGNvbXBhcmV0b3RtYWcgICA4ICAgICAgMC45RSsxICAtPiAgLTEKK2N0bXgxNTAgY29tcGFyZXRvdG1hZyAgIDggICAgICA5MEUtMSAgIC0+ICAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0rIC4uCitjdG14MjAwIGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNy4wICAgICAtPiAgIDAKK2N0bXgyMDEgY29tcGFyZXRvdG1hZyAgLTcuMCAgICA3ICAgICAgIC0+ICAtMQorY3RteDIwMiBjb21wYXJldG90bWFnICAtNyAgICAgIDcuMCAgICAgLT4gICAxCitjdG14MjAzIGNvbXBhcmV0b3RtYWcgIC03RSswICAgNy4wICAgICAtPiAgIDEKK2N0bXgyMDQgY29tcGFyZXRvdG1hZyAgLTcwRS0xICA3LjAgICAgIC0+ICAgMAorY3RteDIwNSBjb21wYXJldG90bWFnICAtMC43RSsxIDcgICAgICAgLT4gICAwCitjdG14MjA2IGNvbXBhcmV0b3RtYWcgIC03MEUtMSAgNyAgICAgICAtPiAgLTEKK2N0bXgyMDcgY29tcGFyZXRvdG1hZyAgLTcuMCAgICA3RSswICAgIC0+ICAtMQorY3RteDIwOCBjb21wYXJldG90bWFnICAtNy4wICAgIDcwRS0xICAgLT4gICAwCitjdG14MjA5IGNvbXBhcmV0b3RtYWcgIC03ICAgICAgMC43RSsxICAtPiAgIDAKK2N0bXgyMTAgY29tcGFyZXRvdG1hZyAgLTcgICAgICA3MEUtMSAgIC0+ICAgMQorCitjdG14MjIwIGNvbXBhcmV0b3RtYWcgIC04LjAgICAgNy4wICAgICAtPiAgIDEKK2N0bXgyMjEgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3ICAgICAgIC0+ICAgMQorY3RteDIyMiBjb21wYXJldG90bWFnICAtOCAgICAgIDcuMCAgICAgLT4gICAxCitjdG14MjIzIGNvbXBhcmV0b3RtYWcgIC04RSswICAgNy4wICAgICAtPiAgIDEKK2N0bXgyMjQgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA3LjAgICAgIC0+ICAgMQorY3RteDIyNSBjb21wYXJldG90bWFnICAtMC44RSsxIDcgICAgICAgLT4gICAxCitjdG14MjI2IGNvbXBhcmV0b3RtYWcgIC04MEUtMSAgNyAgICAgICAtPiAgIDEKK2N0bXgyMjcgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3RSswICAgIC0+ICAgMQorY3RteDIyOCBjb21wYXJldG90bWFnICAtOC4wICAgIDcwRS0xICAgLT4gICAxCitjdG14MjI5IGNvbXBhcmV0b3RtYWcgIC04ICAgICAgMC43RSsxICAtPiAgIDEKK2N0bXgyMzAgY29tcGFyZXRvdG1hZyAgLTggICAgICA3MEUtMSAgIC0+ICAgMQorCitjdG14MjQwIGNvbXBhcmV0b3RtYWcgIC04LjAgICAgOS4wICAgICAtPiAgLTEKK2N0bXgyNDEgY29tcGFyZXRvdG1hZyAgLTguMCAgICA5ICAgICAgIC0+ICAtMQorY3RteDI0MiBjb21wYXJldG90bWFnICAtOCAgICAgIDkuMCAgICAgLT4gIC0xCitjdG14MjQzIGNvbXBhcmV0b3RtYWcgIC04RSswICAgOS4wICAgICAtPiAgLTEKK2N0bXgyNDQgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA5LjAgICAgIC0+ICAtMQorY3RteDI0NSBjb21wYXJldG90bWFnICAtMC44RSsxIDkgICAgICAgLT4gIC0xCitjdG14MjQ2IGNvbXBhcmV0b3RtYWcgIC04MEUtMSAgOSAgICAgICAtPiAgLTEKK2N0bXgyNDcgY29tcGFyZXRvdG1hZyAgLTguMCAgICA5RSswICAgIC0+ICAtMQorY3RteDI0OCBjb21wYXJldG90bWFnICAtOC4wICAgIDkwRS0xICAgLT4gIC0xCitjdG14MjQ5IGNvbXBhcmV0b3RtYWcgIC04ICAgICAgMC45RSsxICAtPiAgLTEKK2N0bXgyNTAgY29tcGFyZXRvdG1hZyAgLTggICAgICA5MEUtMSAgIC0+ICAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzICstIC4uCitjdG14MzAwIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTcuMCAgICAgLT4gICAwCitjdG14MzAxIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTcgICAgICAgLT4gIC0xCitjdG14MzAyIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgLTcuMCAgICAgLT4gICAxCitjdG14MzAzIGNvbXBhcmV0b3RtYWcgICA3RSswICAgLTcuMCAgICAgLT4gICAxCitjdG14MzA0IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgLTcuMCAgICAgLT4gICAwCitjdG14MzA1IGNvbXBhcmV0b3RtYWcgICAuN0UrMSAgLTcgICAgICAgLT4gICAwCitjdG14MzA2IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgLTcgICAgICAgLT4gIC0xCitjdG14MzA3IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTdFKzAgICAgLT4gIC0xCitjdG14MzA4IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTcwRS0xICAgLT4gICAwCitjdG14MzA5IGNvbXBhcmV0b3RtYWcgICA3ICAgICAgLS43RSsxICAgLT4gICAwCitjdG14MzEwIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2N0bXgzMjAgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtNy4wICAgICAtPiAgIDEKK2N0bXgzMjEgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtNyAgICAgICAtPiAgIDEKK2N0bXgzMjIgY29tcGFyZXRvdG1hZyAgIDggICAgICAtNy4wICAgICAtPiAgIDEKK2N0bXgzMjMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICAtNy4wICAgICAtPiAgIDEKK2N0bXgzMjQgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtNy4wICAgICAtPiAgIDEKK2N0bXgzMjUgY29tcGFyZXRvdG1hZyAgIC44RSsxICAtNyAgICAgICAtPiAgIDEKK2N0bXgzMjYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtNyAgICAgICAtPiAgIDEKK2N0bXgzMjcgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtN0UrMCAgICAtPiAgIDEKK2N0bXgzMjggY29tcGFyZXRvdG1hZyAgIDguMCAgICAtNzBFLTEgICAtPiAgIDEKK2N0bXgzMjkgY29tcGFyZXRvdG1hZyAgIDggICAgICAtLjdFKzEgICAtPiAgIDEKK2N0bXgzMzAgY29tcGFyZXRvdG1hZyAgIDggICAgICAtNzBFLTEgICAtPiAgIDEKKworY3RteDM0MCBjb21wYXJldG90bWFnICAgOC4wICAgIC05LjAgICAgIC0+ICAtMQorY3RteDM0MSBjb21wYXJldG90bWFnICAgOC4wICAgIC05ICAgICAgIC0+ICAtMQorY3RteDM0MiBjb21wYXJldG90bWFnICAgOCAgICAgIC05LjAgICAgIC0+ICAtMQorY3RteDM0MyBjb21wYXJldG90bWFnICAgOEUrMCAgIC05LjAgICAgIC0+ICAtMQorY3RteDM0NCBjb21wYXJldG90bWFnICAgODBFLTEgIC05LjAgICAgIC0+ICAtMQorY3RteDM0NSBjb21wYXJldG90bWFnICAgLjhFKzEgIC05ICAgICAgIC0+ICAtMQorY3RteDM0NiBjb21wYXJldG90bWFnICAgODBFLTEgIC05ICAgICAgIC0+ICAtMQorY3RteDM0NyBjb21wYXJldG90bWFnICAgOC4wICAgIC05RSswICAgIC0+ICAtMQorY3RteDM0OCBjb21wYXJldG90bWFnICAgOC4wICAgIC05MEUtMSAgIC0+ICAtMQorY3RteDM0OSBjb21wYXJldG90bWFnICAgOCAgICAgIC0uOUUrMSAgIC0+ICAtMQorY3RteDM1MCBjb21wYXJldG90bWFnICAgOCAgICAgIC05MEUtMSAgIC0+ICAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0tIC4uCitjdG14NDAwIGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03LjAgICAgIC0+ICAgMAorY3RteDQwMSBjb21wYXJldG90bWFnICAgLTcuMCAgICAtNyAgICAgICAtPiAgLTEKK2N0bXg0MDIgY29tcGFyZXRvdG1hZyAgIC03ICAgICAgLTcuMCAgICAgLT4gICAxCitjdG14NDAzIGNvbXBhcmV0b3RtYWcgICAtN0UrMCAgIC03LjAgICAgIC0+ICAgMQorY3RteDQwNCBjb21wYXJldG90bWFnICAgLTcwRS0xICAtNy4wICAgICAtPiAgIDAKK2N0bXg0MDUgY29tcGFyZXRvdG1hZyAgIC0uN0UrMSAgLTcgICAgICAgLT4gICAwCitjdG14NDA2IGNvbXBhcmV0b3RtYWcgICAtNzBFLTEgIC03ICAgICAgIC0+ICAtMQorY3RteDQwNyBjb21wYXJldG90bWFnICAgLTcuMCAgICAtN0UrMCAgICAtPiAgLTEKK2N0bXg0MDggY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTcwRS0xICAgLT4gICAwCitjdG14NDA5IGNvbXBhcmV0b3RtYWcgICAtNyAgICAgIC0uN0UrMSAgIC0+ICAgMAorY3RteDQxMCBjb21wYXJldG90bWFnICAgLTcgICAgICAtNzBFLTEgICAtPiAgIDEKKworY3RteDQyMCBjb21wYXJldG90bWFnICAgLTguMCAgICAtNy4wICAgICAtPiAgIDEKK2N0bXg0MjEgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTcgICAgICAgLT4gICAxCitjdG14NDIyIGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC03LjAgICAgIC0+ICAgMQorY3RteDQyMyBjb21wYXJldG90bWFnICAgLThFKzAgICAtNy4wICAgICAtPiAgIDEKK2N0bXg0MjQgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTcuMCAgICAgLT4gICAxCitjdG14NDI1IGNvbXBhcmV0b3RtYWcgICAtLjhFKzEgIC03ICAgICAgIC0+ICAgMQorY3RteDQyNiBjb21wYXJldG90bWFnICAgLTgwRS0xICAtNyAgICAgICAtPiAgIDEKK2N0bXg0MjcgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTdFKzAgICAgLT4gICAxCitjdG14NDI4IGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC03MEUtMSAgIC0+ICAgMQorY3RteDQyOSBjb21wYXJldG90bWFnICAgLTggICAgICAtLjdFKzEgICAtPiAgIDEKK2N0bXg0MzAgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2N0bXg0NDAgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTkuMCAgICAgLT4gIC0xCitjdG14NDQxIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05ICAgICAgIC0+ICAtMQorY3RteDQ0MiBjb21wYXJldG90bWFnICAgLTggICAgICAtOS4wICAgICAtPiAgLTEKK2N0bXg0NDMgY29tcGFyZXRvdG1hZyAgIC04RSswICAgLTkuMCAgICAgLT4gIC0xCitjdG14NDQ0IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC05LjAgICAgIC0+ICAtMQorY3RteDQ0NSBjb21wYXJldG90bWFnICAgLS44RSsxICAtOSAgICAgICAtPiAgLTEKK2N0bXg0NDYgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTkgICAgICAgLT4gIC0xCitjdG14NDQ3IGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05RSswICAgIC0+ICAtMQorY3RteDQ0OCBjb21wYXJldG90bWFnICAgLTguMCAgICAtOTBFLTEgICAtPiAgLTEKK2N0bXg0NDkgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLS45RSsxICAgLT4gIC0xCitjdG14NDUwIGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC05MEUtMSAgIC0+ICAtMQorCisKKy0tIHRlc3RjYXNlcyB0aGF0IHN1YnRyYWN0IHRvIGxvdHMgb2YgemVyb3MgYXQgYm91bmRhcmllcyBbcGdyXQorcHJlY2lzaW9uOiA0MAorY3RteDQ3MCBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAgLT4gIC0xCitjdG14NDcxIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorY3RteDQ3MiBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgIC0+ICAtMQorY3RteDQ3MyBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitjdG14NDc0IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgIC0+ICAtMQorY3RteDQ3NSBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorY3RteDQ3NiBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwRTc4OSAxMjMuNDU2RTc4OSAgLT4gIC0xCitjdG14NDc3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorY3RteDQ3OCBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMEU3ODkgMTIzLjQ1NkU3ODkgIC0+ICAtMQorY3RteDQ3OSBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitjdG14NDgwIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMEU3ODkgMTIzLjQ1NkU3ODkgIC0+ICAtMQorY3RteDQ4MSBjb21wYXJldG90bWFnIDEyMy40NTYwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorY3RteDQ4MiBjb21wYXJldG90bWFnIDEyMy40NTYwRTc4OSAxMjMuNDU2RTc4OSAgLT4gIC0xCitjdG14NDgzIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NkUtODkgIC0+ICAgMAorY3RteDQ4NCBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDAwMDAwRS04OSAgLT4gICAxCitjdG14NDg1IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMDAwMDAwMEU3ODkgIC0+ICAgMQorY3RteDQ4NiBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDAwMEUtODkgIC0+ICAgMQorY3RteDQ4NyBjb21wYXJldG90bWFnIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDAwMDAwRTc4OSAgLT4gICAxCitjdG14NDg4IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMEUtODkgIC0+ICAgMQorY3RteDQ4OSBjb21wYXJldG90bWFnIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwMDAwMEU3ODkgIC0+ICAgMQorY3RteDQ5MCBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwRS04OSAgLT4gICAxCitjdG14NDkxIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkU3ODkgMTIzLjQ1NjAwMDAwMEU3ODkgIC0+ICAgMQorY3RteDQ5MiBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMEUtODkgIC0+ICAgMQorY3RteDQ5MyBjb21wYXJldG90bWFnIDEyMy40NTZFNzg5IDEyMy40NTYwMDAwRTc4OSAgLT4gICAxCitjdG14NDk0IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMEUtODkgIC0+ICAgMQorY3RteDQ5NSBjb21wYXJldG90bWFnIDEyMy40NTZFNzg5IDEyMy40NTYwMEU3ODkgIC0+ICAgMQorY3RteDQ5NiBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwRS04OSAgLT4gICAxCitjdG14NDk3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkU3ODkgMTIzLjQ1NkU3ODkgIC0+ICAgMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitwcmVjaXNpb246IDkKK2N0bXg1MDAgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xNSAgICAgLT4gICAxCitjdG14NTAxIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTQgICAgIC0+ICAgMQorY3RteDUwMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEzICAgICAtPiAgIDEKK2N0bXg1MDMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xMiAgICAgLT4gICAxCitjdG14NTA0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTEgICAgIC0+ICAgMQorY3RteDUwNSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEwICAgICAtPiAgIDEKK2N0bXg1MDYgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS05ICAgICAgLT4gICAxCitjdG14NTA3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtOCAgICAgIC0+ICAgMQorY3RteDUwOCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTcgICAgICAtPiAgIDEKK2N0bXg1MDkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS02ICAgICAgLT4gICAxCitjdG14NTEwIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNSAgICAgIC0+ICAgMQorY3RteDUxMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTQgICAgICAtPiAgIDEKK2N0bXg1MTIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0zICAgICAgLT4gICAxCitjdG14NTEzIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMiAgICAgIC0+ICAgMQorY3RteDUxNCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEgICAgICAtPiAgIDEKK2N0bXg1MTUgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0wICAgICAgLT4gICAwCitjdG14NTE2IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMSAgICAgIC0+ICAtMQorY3RteDUxNyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzIgICAgICAtPiAgLTEKK2N0bXg1MTggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSszICAgICAgLT4gIC0xCitjdG14NTE5IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNCAgICAgIC0+ICAtMQorY3RteDUyMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzUgICAgICAtPiAgLTEKK2N0bXg1MjIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs2ICAgICAgLT4gIC0xCitjdG14NTIzIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNyAgICAgIC0+ICAtMQorY3RteDUyNCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzggICAgICAtPiAgLTEKK2N0bXg1MjUgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs5ICAgICAgLT4gIC0xCitjdG14NTI2IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTAgICAgIC0+ICAtMQorY3RteDUyNyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzExICAgICAtPiAgLTEKK2N0bXg1MjggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMiAgICAgLT4gIC0xCitjdG14NTI5IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTMgICAgIC0+ICAtMQorY3RteDUzMCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzE0ICAgICAtPiAgLTEKK2N0bXg1MzEgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxNSAgICAgLT4gIC0xCistLSBMUiBzd2FwCitjdG14NTQwIGNvbXBhcmV0b3RtYWcgICAgMUUtMTUgIDEgICAgICAgIC0+ICAtMQorY3RteDU0MSBjb21wYXJldG90bWFnICAgIDFFLTE0ICAxICAgICAgICAtPiAgLTEKK2N0bXg1NDIgY29tcGFyZXRvdG1hZyAgICAxRS0xMyAgMSAgICAgICAgLT4gIC0xCitjdG14NTQzIGNvbXBhcmV0b3RtYWcgICAgMUUtMTIgIDEgICAgICAgIC0+ICAtMQorY3RteDU0NCBjb21wYXJldG90bWFnICAgIDFFLTExICAxICAgICAgICAtPiAgLTEKK2N0bXg1NDUgY29tcGFyZXRvdG1hZyAgICAxRS0xMCAgMSAgICAgICAgLT4gIC0xCitjdG14NTQ2IGNvbXBhcmV0b3RtYWcgICAgMUUtOSAgIDEgICAgICAgIC0+ICAtMQorY3RteDU0NyBjb21wYXJldG90bWFnICAgIDFFLTggICAxICAgICAgICAtPiAgLTEKK2N0bXg1NDggY29tcGFyZXRvdG1hZyAgICAxRS03ICAgMSAgICAgICAgLT4gIC0xCitjdG14NTQ5IGNvbXBhcmV0b3RtYWcgICAgMUUtNiAgIDEgICAgICAgIC0+ICAtMQorY3RteDU1MCBjb21wYXJldG90bWFnICAgIDFFLTUgICAxICAgICAgICAtPiAgLTEKK2N0bXg1NTEgY29tcGFyZXRvdG1hZyAgICAxRS00ICAgMSAgICAgICAgLT4gIC0xCitjdG14NTUyIGNvbXBhcmV0b3RtYWcgICAgMUUtMyAgIDEgICAgICAgIC0+ICAtMQorY3RteDU1MyBjb21wYXJldG90bWFnICAgIDFFLTIgICAxICAgICAgICAtPiAgLTEKK2N0bXg1NTQgY29tcGFyZXRvdG1hZyAgICAxRS0xICAgMSAgICAgICAgLT4gIC0xCitjdG14NTU1IGNvbXBhcmV0b3RtYWcgICAgMUUtMCAgIDEgICAgICAgIC0+ICAgMAorY3RteDU1NiBjb21wYXJldG90bWFnICAgIDFFKzEgICAxICAgICAgICAtPiAgIDEKK2N0bXg1NTcgY29tcGFyZXRvdG1hZyAgICAxRSsyICAgMSAgICAgICAgLT4gICAxCitjdG14NTU4IGNvbXBhcmV0b3RtYWcgICAgMUUrMyAgIDEgICAgICAgIC0+ICAgMQorY3RteDU1OSBjb21wYXJldG90bWFnICAgIDFFKzQgICAxICAgICAgICAtPiAgIDEKK2N0bXg1NjEgY29tcGFyZXRvdG1hZyAgICAxRSs1ICAgMSAgICAgICAgLT4gICAxCitjdG14NTYyIGNvbXBhcmV0b3RtYWcgICAgMUUrNiAgIDEgICAgICAgIC0+ICAgMQorY3RteDU2MyBjb21wYXJldG90bWFnICAgIDFFKzcgICAxICAgICAgICAtPiAgIDEKK2N0bXg1NjQgY29tcGFyZXRvdG1hZyAgICAxRSs4ICAgMSAgICAgICAgLT4gICAxCitjdG14NTY1IGNvbXBhcmV0b3RtYWcgICAgMUUrOSAgIDEgICAgICAgIC0+ICAgMQorY3RteDU2NiBjb21wYXJldG90bWFnICAgIDFFKzEwICAxICAgICAgICAtPiAgIDEKK2N0bXg1NjcgY29tcGFyZXRvdG1hZyAgICAxRSsxMSAgMSAgICAgICAgLT4gICAxCitjdG14NTY4IGNvbXBhcmV0b3RtYWcgICAgMUUrMTIgIDEgICAgICAgIC0+ICAgMQorY3RteDU2OSBjb21wYXJldG90bWFnICAgIDFFKzEzICAxICAgICAgICAtPiAgIDEKK2N0bXg1NzAgY29tcGFyZXRvdG1hZyAgICAxRSsxNCAgMSAgICAgICAgLT4gICAxCitjdG14NTcxIGNvbXBhcmV0b3RtYWcgICAgMUUrMTUgIDEgICAgICAgIC0+ICAgMQorLS0gc2ltaWxhciB3aXRoIGFuIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorY3RteDU4MCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgIC0+ICAgMQorY3RteDU4MSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTQgICAgIC0+ICAgMQorY3RteDU4MiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgIC0+ICAgMQorY3RteDU4MyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgIC0+ICAgMQorY3RteDU4NCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTEgICAgIC0+ICAgMQorY3RteDU4NSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgIC0+ICAgMQorY3RteDU4NiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgIC0+ICAgMQorY3RteDU4NyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOCAgICAgIC0+ICAgMQorY3RteDU4OCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgIC0+ICAgMQorY3RteDU4OSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgIC0+ICAtMQorY3RteDU5MCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNSAgICAgIC0+ICAtMQorY3RteDU5MSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNCAgICAgIC0+ICAtMQorY3RteDU5MiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgIC0+ICAtMQorY3RteDU5MyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMiAgICAgIC0+ICAtMQorY3RteDU5NCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMSAgICAgIC0+ICAtMQorY3RteDU5NSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgIC0+ICAtMQorY3RteDU5NiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMSAgICAgIC0+ICAtMQorY3RteDU5NyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMiAgICAgIC0+ICAtMQorY3RteDU5OCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgIC0+ICAtMQorY3RteDU5OSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrNCAgICAgIC0+ICAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworcHJlY2lzaW9uOiAyMAorY3RteDYwMCBjb21wYXJldG90bWFnICAgMTIgICAgICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MDEgY29tcGFyZXRvdG1hZyAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitjdG14NjAyIGNvbXBhcmV0b3RtYWcgICAxMi4wMCAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorY3RteDYwMyBjb21wYXJldG90bWFnICAgMTIuMDAwICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MDQgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitjdG14NjA1IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMCAgICAgIDEyLjIzNDUgIC0+ICAtMQorY3RteDYwNiBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwICAgICAxMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MDcgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAgLT4gIC0xCitjdG14NjA4IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMCAgIDEyLjIzNDUgIC0+ICAtMQorY3RteDYwOSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAwICAxMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MTAgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIgICAgICAgICAgICAgLT4gICAxCitjdG14NjExIGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAgICAgICAgICAgIC0+ICAgMQorY3RteDYxMiBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMCAgICAgICAgICAtPiAgIDEKK2N0bXg2MTMgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAgLT4gICAxCitjdG14NjE0IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAgICAgICAgIC0+ICAgMQorY3RteDYxNSBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMCAgICAgICAtPiAgIDEKK2N0bXg2MTYgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAgLT4gICAxCitjdG14NjE3IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwMDAgICAgIC0+ICAgMQorY3RteDYxOCBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAwMCAgICAtPiAgIDEKK2N0bXg2MTkgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAgLT4gICAxCitjdG14NjIwIGNvbXBhcmV0b3RtYWcgIC0xMiAgICAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorY3RteDYyMSBjb21wYXJldG90bWFnICAtMTIuMCAgICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MjIgY29tcGFyZXRvdG1hZyAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitjdG14NjIzIGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorY3RteDYyNCBjb21wYXJldG90bWFnICAtMTIuMDAwMCAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MjUgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAgLT4gIC0xCitjdG14NjI2IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAgICAgLTEyLjIzNDUgIC0+ICAtMQorY3RteDYyNyBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwMCAgIC0xMi4yMzQ1ICAtPiAgLTEKK2N0bXg2MjggY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAgLT4gIC0xCitjdG14NjI5IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAwMDAgLTEyLjIzNDUgIC0+ICAtMQorY3RteDYzMCBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIgICAgICAgICAgICAtPiAgIDEKK2N0bXg2MzEgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAgLT4gICAxCitjdG14NjMyIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMCAgICAgICAgIC0+ICAgMQorY3RteDYzMyBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwICAgICAgICAtPiAgIDEKK2N0bXg2MzQgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAgLT4gICAxCitjdG14NjM1IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMCAgICAgIC0+ICAgMQorY3RteDYzNiBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwICAgICAtPiAgIDEKK2N0bXg2MzcgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAgLT4gICAxCitjdG14NjM4IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMCAgIC0+ICAgMQorY3RteDYzOSBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAwICAtPiAgIDEKK3ByZWNpc2lvbjogOQorCistLSBleHRlbmRlZCB6ZXJvcworY3RteDY0MCBjb21wYXJldG90bWFnICAgMCAgICAgMCAgICAtPiAgIDAKK2N0bXg2NDEgY29tcGFyZXRvdG1hZyAgIDAgICAgLTAgICAgLT4gICAwCitjdG14NjQyIGNvbXBhcmV0b3RtYWcgICAwICAgIC0wLjAgIC0+ICAgMQorY3RteDY0MyBjb21wYXJldG90bWFnICAgMCAgICAgMC4wICAtPiAgIDEKK2N0bXg2NDQgY29tcGFyZXRvdG1hZyAgLTAgICAgIDAgICAgLT4gICAwCitjdG14NjQ1IGNvbXBhcmV0b3RtYWcgIC0wICAgIC0wICAgIC0+ICAgMAorY3RteDY0NiBjb21wYXJldG90bWFnICAtMCAgICAtMC4wICAtPiAgIDEKK2N0bXg2NDcgY29tcGFyZXRvdG1hZyAgLTAgICAgIDAuMCAgLT4gICAxCitjdG14NjQ4IGNvbXBhcmV0b3RtYWcgICAwLjAgICAwICAgIC0+ICAtMQorY3RteDY0OSBjb21wYXJldG90bWFnICAgMC4wICAtMCAgICAtPiAgLTEKK2N0bXg2NTAgY29tcGFyZXRvdG1hZyAgIDAuMCAgLTAuMCAgLT4gICAwCitjdG14NjUxIGNvbXBhcmV0b3RtYWcgICAwLjAgICAwLjAgIC0+ICAgMAorY3RteDY1MiBjb21wYXJldG90bWFnICAtMC4wICAgMCAgICAtPiAgLTEKK2N0bXg2NTMgY29tcGFyZXRvdG1hZyAgLTAuMCAgLTAgICAgLT4gIC0xCitjdG14NjU0IGNvbXBhcmV0b3RtYWcgIC0wLjAgIC0wLjAgIC0+ICAgMAorY3RteDY1NSBjb21wYXJldG90bWFnICAtMC4wICAgMC4wICAtPiAgIDAKKworY3RteDY1NiBjb21wYXJldG90bWFnICAtMEUxICAgMC4wICAtPiAgIDEKK2N0bXg2NTcgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDAuMCAgLT4gICAxCitjdG14NjU4IGNvbXBhcmV0b3RtYWcgICAwRTEgICAwLjAgIC0+ICAgMQorY3RteDY1OSBjb21wYXJldG90bWFnICAgMEUyICAgMC4wICAtPiAgIDEKK2N0bXg2NjAgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDAgICAgLT4gICAxCitjdG14NjYxIGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwICAgIC0+ICAgMQorY3RteDY2MiBjb21wYXJldG90bWFnICAgMEUxICAgMCAgICAtPiAgIDEKK2N0bXg2NjMgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDAgICAgLT4gICAxCitjdG14NjY0IGNvbXBhcmV0b3RtYWcgIC0wRTEgIC0wRTEgIC0+ICAgMAorY3RteDY2NSBjb21wYXJldG90bWFnICAtMEUyICAtMEUxICAtPiAgIDEKK2N0bXg2NjYgY29tcGFyZXRvdG1hZyAgIDBFMSAgLTBFMSAgLT4gICAwCitjdG14NjY3IGNvbXBhcmV0b3RtYWcgICAwRTIgIC0wRTEgIC0+ICAgMQorY3RteDY2OCBjb21wYXJldG90bWFnICAtMEUxICAtMEUyICAtPiAgLTEKK2N0bXg2NjkgY29tcGFyZXRvdG1hZyAgLTBFMiAgLTBFMiAgLT4gICAwCitjdG14NjcwIGNvbXBhcmV0b3RtYWcgICAwRTEgIC0wRTIgIC0+ICAtMQorY3RteDY3MSBjb21wYXJldG90bWFnICAgMEUyICAtMEUyICAtPiAgIDAKK2N0bXg2NzIgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDBFMSAgLT4gICAwCitjdG14NjczIGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwRTEgIC0+ICAgMQorY3RteDY3NCBjb21wYXJldG90bWFnICAgMEUxICAgMEUxICAtPiAgIDAKK2N0bXg2NzUgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDBFMSAgLT4gICAxCitjdG14Njc2IGNvbXBhcmV0b3RtYWcgIC0wRTEgICAwRTIgIC0+ICAtMQorY3RteDY3NyBjb21wYXJldG90bWFnICAtMEUyICAgMEUyICAtPiAgIDAKK2N0bXg2NzggY29tcGFyZXRvdG1hZyAgIDBFMSAgIDBFMiAgLT4gIC0xCitjdG14Njc5IGNvbXBhcmV0b3RtYWcgICAwRTIgICAwRTIgIC0+ICAgMAorCistLSB0cmFpbGluZyB6ZXJvczsgdW5pdC15CitwcmVjaXNpb246IDIwCitjdG14NjgwIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMiAgICAgICAgICAgIC0+ICAgMAorY3RteDY4MSBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMCAgICAgICAgICAtPiAgIDEKK2N0bXg2ODIgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwICAgICAgICAgLT4gICAxCitjdG14NjgzIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAgICAgICAgIC0+ICAgMQorY3RteDY4NCBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMCAgICAgICAtPiAgIDEKK2N0bXg2ODUgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwICAgICAgLT4gICAxCitjdG14Njg2IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAgICAgIC0+ICAgMQorY3RteDY4NyBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAwMCAgICAtPiAgIDEKK2N0bXg2ODggY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMDAwICAgLT4gICAxCitjdG14Njg5IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAwMDAgIC0+ICAgMQorY3RteDY5MCBjb21wYXJldG90bWFnICAgMTIgICAgICAgICAgICAgIDEyICAtPiAgIDAKK2N0bXg2OTEgY29tcGFyZXRvdG1hZyAgIDEyLjAgICAgICAgICAgICAxMiAgLT4gIC0xCitjdG14NjkyIGNvbXBhcmV0b3RtYWcgICAxMi4wMCAgICAgICAgICAgMTIgIC0+ICAtMQorY3RteDY5MyBjb21wYXJldG90bWFnICAgMTIuMDAwICAgICAgICAgIDEyICAtPiAgLTEKK2N0bXg2OTQgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAgICAgICAgICAxMiAgLT4gIC0xCitjdG14Njk1IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMCAgICAgICAgMTIgIC0+ICAtMQorY3RteDY5NiBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwICAgICAgIDEyICAtPiAgLTEKK2N0bXg2OTcgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAgICAgICAxMiAgLT4gIC0xCitjdG14Njk4IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMCAgICAgMTIgIC0+ICAtMQorY3RteDY5OSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAwICAgIDEyICAtPiAgLTEKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorY3RteDcwMSBjb21wYXJldG90bWFnIDEyMzQ1Njc4MDAwICAxICAtPiAgIDEKK2N0bXg3MDIgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4MDAwICAgLT4gIC0xCitjdG14NzAzIGNvbXBhcmV0b3RtYWcgMTIzNDU2NzgwMCAgIDEgIC0+ICAgMQorY3RteDcwNCBjb21wYXJldG90bWFnIDEgMTIzNDU2NzgwMCAgICAtPiAgLTEKK2N0bXg3MDUgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODkwICAgMSAgLT4gICAxCitjdG14NzA2IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkwICAgIC0+ICAtMQorY3RteDcwNyBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTEgICAxICAtPiAgIDEKK2N0bXg3MDggY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTEgICAgLT4gIC0xCitjdG14NzA5IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MDEgIDEgIC0+ICAgMQorY3RteDcxMCBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MDEgICAtPiAgLTEKK2N0bXg3MTEgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODk2ICAgMSAgLT4gICAxCitjdG14NzEyIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODk2ICAgIC0+ICAtMQorY3RteDcxMyBjb21wYXJldG90bWFnIC0xMjM0NTY3ODkxICAxICAtPiAgIDEKK2N0bXg3MTQgY29tcGFyZXRvdG1hZyAxIC0xMjM0NTY3ODkxICAgLT4gIC0xCitjdG14NzE1IGNvbXBhcmV0b3RtYWcgLTEyMzQ1Njc4OTAxIDEgIC0+ICAgMQorY3RteDcxNiBjb21wYXJldG90bWFnIDEgLTEyMzQ1Njc4OTAxICAtPiAgLTEKK2N0bXg3MTcgY29tcGFyZXRvdG1hZyAtMTIzNDU2Nzg5NiAgMSAgLT4gICAxCitjdG14NzE4IGNvbXBhcmV0b3RtYWcgMSAtMTIzNDU2Nzg5NiAgIC0+ICAtMQorCitwcmVjaXNpb246IDE1CistLSBzYW1lIHdpdGggcGxlbnR5IG9mIHByZWNpc2lvbgorY3RteDcyMSBjb21wYXJldG90bWFnIDEyMzQ1Njc4MDAwIDEgIC0+ICAgMQorY3RteDcyMiBjb21wYXJldG90bWFnIDEgMTIzNDU2NzgwMDAgIC0+ICAtMQorY3RteDcyMyBjb21wYXJldG90bWFnIDEyMzQ1Njc4MDAgIDEgIC0+ICAgMQorY3RteDcyNCBjb21wYXJldG90bWFnIDEgMTIzNDU2NzgwMCAgIC0+ICAtMQorY3RteDcyNSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTAgIDEgIC0+ICAgMQorY3RteDcyNiBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MCAgIC0+ICAtMQorY3RteDcyNyBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTEgIDEgIC0+ICAgMQorY3RteDcyOCBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MSAgIC0+ICAtMQorY3RteDcyOSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTAxIDEgIC0+ICAgMQorY3RteDczMCBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MDEgIC0+ICAtMQorY3RteDczMSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTYgIDEgIC0+ICAgMQorY3RteDczMiBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5NiAgIC0+ICAtMQorCistLSByZXNpZHVlIGNhc2VzCitwcmVjaXNpb246IDUKK2N0bXg3NDAgY29tcGFyZXRvdG1hZyAgMSAgMC45OTk5OTk5ICAgLT4gICAxCitjdG14NzQxIGNvbXBhcmV0b3RtYWcgIDEgIDAuOTk5OTk5ICAgIC0+ICAgMQorY3RteDc0MiBjb21wYXJldG90bWFnICAxICAwLjk5OTk5ICAgICAtPiAgIDEKK2N0bXg3NDMgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwICAgICAgLT4gICAxCitjdG14NzQ0IGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMDEgICAgIC0+ICAtMQorY3RteDc0NSBjb21wYXJldG90bWFnICAxICAxLjAwMDAwMSAgICAtPiAgLTEKK2N0bXg3NDYgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwMDAxICAgLT4gIC0xCitjdG14NzUwIGNvbXBhcmV0b3RtYWcgIDAuOTk5OTk5OSAgMSAgIC0+ICAtMQorY3RteDc1MSBjb21wYXJldG90bWFnICAwLjk5OTk5OSAgIDEgICAtPiAgLTEKK2N0bXg3NTIgY29tcGFyZXRvdG1hZyAgMC45OTk5OSAgICAxICAgLT4gIC0xCitjdG14NzUzIGNvbXBhcmV0b3RtYWcgIDEuMDAwMCAgICAgMSAgIC0+ICAtMQorY3RteDc1NCBjb21wYXJldG90bWFnICAxLjAwMDAxICAgIDEgICAtPiAgIDEKK2N0bXg3NTUgY29tcGFyZXRvdG1hZyAgMS4wMDAwMDEgICAxICAgLT4gICAxCitjdG14NzU2IGNvbXBhcmV0b3RtYWcgIDEuMDAwMDAwMSAgMSAgIC0+ICAgMQorCistLSBhIHNlbGVjdGlvbiBvZiBsb25naWVzCitjdG14NzYwIGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC01ODMwNjI5LjgzNDcwODUwMjU4MDg3NTY1NjAzNTc5NDAgIC0+ICAgMQorY3RteDc2MSBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgIDAKK2N0bXg3NjIgY29tcGFyZXRvdG1hZyAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxICAgLT4gICAxCitjdG14NzYzIGNvbXBhcmV0b3RtYWcgLTM2ODUyMTM0Ljg0MTk0Mjk2MjUwODQzNTc5NDI4OTMxIC0zNjg1MjEzNC45NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAgIC0+ICAtMQorLS0gcHJlY2lzaW9ucyBhYm92ZSBvciBiZWxvdyB0aGUgZGlmZmVyZW5jZSBzaG91bGQgaGF2ZSBubyBlZmZlY3QKK3ByZWNpc2lvbjogICAxMQorY3RteDc2NCBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAxMAorY3RteDc2NSBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgOQorY3RteDc2NiBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgOAorY3RteDc2NyBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgNworY3RteDc2OCBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgNgorY3RteDc2OSBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgNQorY3RteDc3MCBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgNAorY3RteDc3MSBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgMworY3RteDc3MiBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgMgorY3RteDc3MyBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKK3ByZWNpc2lvbjogICAgMQorY3RteDc3NCBjb21wYXJldG90bWFnIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtMzY4NTIxMzQuOTQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgICAtPiAgLTEKKworLS0gU3BlY2lhbHMKK3ByZWNpc2lvbjogICA5CitjdG14NzgwIGNvbXBhcmV0b3RtYWcgIEluZiAgLUluZiAgIC0+ICAwCitjdG14NzgxIGNvbXBhcmV0b3RtYWcgIEluZiAgLTEwMDAgIC0+ICAxCitjdG14NzgyIGNvbXBhcmV0b3RtYWcgIEluZiAgLTEgICAgIC0+ICAxCitjdG14NzgzIGNvbXBhcmV0b3RtYWcgIEluZiAgLTAgICAgIC0+ICAxCitjdG14Nzg0IGNvbXBhcmV0b3RtYWcgIEluZiAgIDAgICAgIC0+ICAxCitjdG14Nzg1IGNvbXBhcmV0b3RtYWcgIEluZiAgIDEgICAgIC0+ICAxCitjdG14Nzg2IGNvbXBhcmV0b3RtYWcgIEluZiAgIDEwMDAgIC0+ICAxCitjdG14Nzg3IGNvbXBhcmV0b3RtYWcgIEluZiAgIEluZiAgIC0+ICAwCitjdG14Nzg4IGNvbXBhcmV0b3RtYWcgLTEwMDAgIEluZiAgIC0+IC0xCitjdG14Nzg5IGNvbXBhcmV0b3RtYWcgLUluZiAgIEluZiAgIC0+ICAwCitjdG14NzkwIGNvbXBhcmV0b3RtYWcgLTEgICAgIEluZiAgIC0+IC0xCitjdG14NzkxIGNvbXBhcmV0b3RtYWcgLTAgICAgIEluZiAgIC0+IC0xCitjdG14NzkyIGNvbXBhcmV0b3RtYWcgIDAgICAgIEluZiAgIC0+IC0xCitjdG14NzkzIGNvbXBhcmV0b3RtYWcgIDEgICAgIEluZiAgIC0+IC0xCitjdG14Nzk0IGNvbXBhcmV0b3RtYWcgIDEwMDAgIEluZiAgIC0+IC0xCitjdG14Nzk1IGNvbXBhcmV0b3RtYWcgIEluZiAgIEluZiAgIC0+ICAwCisKK2N0bXg4MDAgY29tcGFyZXRvdG1hZyAtSW5mICAtSW5mICAgLT4gIDAKK2N0bXg4MDEgY29tcGFyZXRvdG1hZyAtSW5mICAtMTAwMCAgLT4gIDEKK2N0bXg4MDIgY29tcGFyZXRvdG1hZyAtSW5mICAtMSAgICAgLT4gIDEKK2N0bXg4MDMgY29tcGFyZXRvdG1hZyAtSW5mICAtMCAgICAgLT4gIDEKK2N0bXg4MDQgY29tcGFyZXRvdG1hZyAtSW5mICAgMCAgICAgLT4gIDEKK2N0bXg4MDUgY29tcGFyZXRvdG1hZyAtSW5mICAgMSAgICAgLT4gIDEKK2N0bXg4MDYgY29tcGFyZXRvdG1hZyAtSW5mICAgMTAwMCAgLT4gIDEKK2N0bXg4MDcgY29tcGFyZXRvdG1hZyAtSW5mICAgSW5mICAgLT4gIDAKK2N0bXg4MDggY29tcGFyZXRvdG1hZyAtSW5mICAtSW5mICAgLT4gIDAKK2N0bXg4MDkgY29tcGFyZXRvdG1hZyAtMTAwMCAtSW5mICAgLT4gLTEKK2N0bXg4MTAgY29tcGFyZXRvdG1hZyAtMSAgICAtSW5mICAgLT4gLTEKK2N0bXg4MTEgY29tcGFyZXRvdG1hZyAtMCAgICAtSW5mICAgLT4gLTEKK2N0bXg4MTIgY29tcGFyZXRvdG1hZyAgMCAgICAtSW5mICAgLT4gLTEKK2N0bXg4MTMgY29tcGFyZXRvdG1hZyAgMSAgICAtSW5mICAgLT4gLTEKK2N0bXg4MTQgY29tcGFyZXRvdG1hZyAgMTAwMCAtSW5mICAgLT4gLTEKK2N0bXg4MTUgY29tcGFyZXRvdG1hZyAgSW5mICAtSW5mICAgLT4gIDAKKworY3RteDgyMSBjb21wYXJldG90bWFnICBOYU4gLUluZiAgICAtPiAgMQorY3RteDgyMiBjb21wYXJldG90bWFnICBOYU4gLTEwMDAgICAtPiAgMQorY3RteDgyMyBjb21wYXJldG90bWFnICBOYU4gLTEgICAgICAtPiAgMQorY3RteDgyNCBjb21wYXJldG90bWFnICBOYU4gLTAgICAgICAtPiAgMQorY3RteDgyNSBjb21wYXJldG90bWFnICBOYU4gIDAgICAgICAtPiAgMQorY3RteDgyNiBjb21wYXJldG90bWFnICBOYU4gIDEgICAgICAtPiAgMQorY3RteDgyNyBjb21wYXJldG90bWFnICBOYU4gIDEwMDAgICAtPiAgMQorY3RteDgyOCBjb21wYXJldG90bWFnICBOYU4gIEluZiAgICAtPiAgMQorY3RteDgyOSBjb21wYXJldG90bWFnICBOYU4gIE5hTiAgICAtPiAgMAorY3RteDgzMCBjb21wYXJldG90bWFnIC1JbmYgIE5hTiAgICAtPiAgLTEKK2N0bXg4MzEgY29tcGFyZXRvdG1hZyAtMTAwMCBOYU4gICAgLT4gIC0xCitjdG14ODMyIGNvbXBhcmV0b3RtYWcgLTEgICAgTmFOICAgIC0+ICAtMQorY3RteDgzMyBjb21wYXJldG90bWFnIC0wICAgIE5hTiAgICAtPiAgLTEKK2N0bXg4MzQgY29tcGFyZXRvdG1hZyAgMCAgICBOYU4gICAgLT4gIC0xCitjdG14ODM1IGNvbXBhcmV0b3RtYWcgIDEgICAgTmFOICAgIC0+ICAtMQorY3RteDgzNiBjb21wYXJldG90bWFnICAxMDAwIE5hTiAgICAtPiAgLTEKK2N0bXg4MzcgY29tcGFyZXRvdG1hZyAgSW5mICBOYU4gICAgLT4gIC0xCitjdG14ODM4IGNvbXBhcmV0b3RtYWcgLU5hTiAtTmFOICAgIC0+ICAwCitjdG14ODM5IGNvbXBhcmV0b3RtYWcgK05hTiAtTmFOICAgIC0+ICAwCitjdG14ODQwIGNvbXBhcmV0b3RtYWcgLU5hTiArTmFOICAgIC0+ICAwCisKK2N0bXg4NDEgY29tcGFyZXRvdG1hZyAgc05hTiAtc05hTiAgLT4gIDAKK2N0bXg4NDIgY29tcGFyZXRvdG1hZyAgc05hTiAtTmFOICAgLT4gIC0xCitjdG14ODQzIGNvbXBhcmV0b3RtYWcgIHNOYU4gLUluZiAgIC0+ICAxCitjdG14ODQ0IGNvbXBhcmV0b3RtYWcgIHNOYU4gLTEwMDAgIC0+ICAxCitjdG14ODQ1IGNvbXBhcmV0b3RtYWcgIHNOYU4gLTEgICAgIC0+ICAxCitjdG14ODQ2IGNvbXBhcmV0b3RtYWcgIHNOYU4gLTAgICAgIC0+ICAxCitjdG14ODQ3IGNvbXBhcmV0b3RtYWcgIHNOYU4gIDAgICAgIC0+ICAxCitjdG14ODQ4IGNvbXBhcmV0b3RtYWcgIHNOYU4gIDEgICAgIC0+ICAxCitjdG14ODQ5IGNvbXBhcmV0b3RtYWcgIHNOYU4gIDEwMDAgIC0+ICAxCitjdG14ODUwIGNvbXBhcmV0b3RtYWcgIHNOYU4gIE5hTiAgIC0+ICAtMQorY3RteDg1MSBjb21wYXJldG90bWFnICBzTmFOIHNOYU4gICAtPiAgMAorCitjdG14ODUyIGNvbXBhcmV0b3RtYWcgLXNOYU4gc05hTiAgIC0+ICAwCitjdG14ODUzIGNvbXBhcmV0b3RtYWcgLU5hTiAgc05hTiAgIC0+ICAxCitjdG14ODU0IGNvbXBhcmV0b3RtYWcgLUluZiAgc05hTiAgIC0+ICAtMQorY3RteDg1NSBjb21wYXJldG90bWFnIC0xMDAwIHNOYU4gICAtPiAgLTEKK2N0bXg4NTYgY29tcGFyZXRvdG1hZyAtMSAgICBzTmFOICAgLT4gIC0xCitjdG14ODU3IGNvbXBhcmV0b3RtYWcgLTAgICAgc05hTiAgIC0+ICAtMQorY3RteDg1OCBjb21wYXJldG90bWFnICAwICAgIHNOYU4gICAtPiAgLTEKK2N0bXg4NTkgY29tcGFyZXRvdG1hZyAgMSAgICBzTmFOICAgLT4gIC0xCitjdG14ODYwIGNvbXBhcmV0b3RtYWcgIDEwMDAgc05hTiAgIC0+ICAtMQorY3RteDg2MSBjb21wYXJldG90bWFnICBJbmYgIHNOYU4gICAtPiAgLTEKK2N0bXg4NjIgY29tcGFyZXRvdG1hZyAgTmFOICBzTmFOICAgLT4gIDEKK2N0bXg4NjMgY29tcGFyZXRvdG1hZyAgc05hTiBzTmFOICAgLT4gIDAKKworY3RteDg3MSBjb21wYXJldG90bWFnICAtc05hTiAtc05hTiAgLT4gIDAKK2N0bXg4NzIgY29tcGFyZXRvdG1hZyAgLXNOYU4gLU5hTiAgIC0+ICAtMQorY3RteDg3MyBjb21wYXJldG90bWFnICAtc05hTiAtSW5mICAgLT4gIDEKK2N0bXg4NzQgY29tcGFyZXRvdG1hZyAgLXNOYU4gLTEwMDAgIC0+ICAxCitjdG14ODc1IGNvbXBhcmV0b3RtYWcgIC1zTmFOIC0xICAgICAtPiAgMQorY3RteDg3NiBjb21wYXJldG90bWFnICAtc05hTiAtMCAgICAgLT4gIDEKK2N0bXg4NzcgY29tcGFyZXRvdG1hZyAgLXNOYU4gIDAgICAgIC0+ICAxCitjdG14ODc4IGNvbXBhcmV0b3RtYWcgIC1zTmFOICAxICAgICAtPiAgMQorY3RteDg3OSBjb21wYXJldG90bWFnICAtc05hTiAgMTAwMCAgLT4gIDEKK2N0bXg4ODAgY29tcGFyZXRvdG1hZyAgLXNOYU4gIE5hTiAgIC0+ICAtMQorY3RteDg4MSBjb21wYXJldG90bWFnICAtc05hTiBzTmFOICAgLT4gIDAKKworY3RteDg4MiBjb21wYXJldG90bWFnIC1zTmFOIC1zTmFOICAgLT4gIDAKK2N0bXg4ODMgY29tcGFyZXRvdG1hZyAtTmFOICAtc05hTiAgIC0+ICAxCitjdG14ODg0IGNvbXBhcmV0b3RtYWcgLUluZiAgLXNOYU4gICAtPiAgLTEKK2N0bXg4ODUgY29tcGFyZXRvdG1hZyAtMTAwMCAtc05hTiAgIC0+ICAtMQorY3RteDg4NiBjb21wYXJldG90bWFnIC0xICAgIC1zTmFOICAgLT4gIC0xCitjdG14ODg3IGNvbXBhcmV0b3RtYWcgLTAgICAgLXNOYU4gICAtPiAgLTEKK2N0bXg4ODggY29tcGFyZXRvdG1hZyAgMCAgICAtc05hTiAgIC0+ICAtMQorY3RteDg4OSBjb21wYXJldG90bWFnICAxICAgIC1zTmFOICAgLT4gIC0xCitjdG14ODkwIGNvbXBhcmV0b3RtYWcgIDEwMDAgLXNOYU4gICAtPiAgLTEKK2N0bXg4OTEgY29tcGFyZXRvdG1hZyAgSW5mICAtc05hTiAgIC0+ICAtMQorY3RteDg5MiBjb21wYXJldG90bWFnICBOYU4gIC1zTmFOICAgLT4gIDEKK2N0bXg4OTMgY29tcGFyZXRvdG1hZyAgc05hTiAtc05hTiAgIC0+ICAwCisKKy0tIE5hTnMgd2l0aCBwYXlsb2FkCitjdG14OTYwIGNvbXBhcmV0b3RtYWcgIE5hTjkgLUluZiAgIC0+ICAxCitjdG14OTYxIGNvbXBhcmV0b3RtYWcgIE5hTjggIDk5OSAgIC0+ICAxCitjdG14OTYyIGNvbXBhcmV0b3RtYWcgIE5hTjc3IEluZiAgIC0+ICAxCitjdG14OTYzIGNvbXBhcmV0b3RtYWcgLU5hTjY3IE5hTjUgIC0+ICAxCitjdG14OTY0IGNvbXBhcmV0b3RtYWcgLUluZiAgLU5hTjQgIC0+ICAtMQorY3RteDk2NSBjb21wYXJldG90bWFnIC05OTkgIC1OYU4zMyAtPiAgLTEKK2N0bXg5NjYgY29tcGFyZXRvdG1hZyAgSW5mICAgTmFOMiAgLT4gIC0xCisKK2N0bXg5NzAgY29tcGFyZXRvdG1hZyAtTmFONDEgLU5hTjQyIC0+IC0xCitjdG14OTcxIGNvbXBhcmV0b3RtYWcgK05hTjQxIC1OYU40MiAtPiAtMQorY3RteDk3MiBjb21wYXJldG90bWFnIC1OYU40MSArTmFONDIgLT4gLTEKK2N0bXg5NzMgY29tcGFyZXRvdG1hZyArTmFONDEgK05hTjQyIC0+IC0xCitjdG14OTc0IGNvbXBhcmV0b3RtYWcgLU5hTjQyIC1OYU4wMSAtPiAgMQorY3RteDk3NSBjb21wYXJldG90bWFnICtOYU40MiAtTmFOMDEgLT4gIDEKK2N0bXg5NzYgY29tcGFyZXRvdG1hZyAtTmFONDIgK05hTjAxIC0+ICAxCitjdG14OTc3IGNvbXBhcmV0b3RtYWcgK05hTjQyICtOYU4wMSAtPiAgMQorCitjdG14OTgwIGNvbXBhcmV0b3RtYWcgLXNOYU43NzEgLXNOYU43NzIgLT4gLTEKK2N0bXg5ODEgY29tcGFyZXRvdG1hZyArc05hTjc3MSAtc05hTjc3MiAtPiAtMQorY3RteDk4MiBjb21wYXJldG90bWFnIC1zTmFONzcxICtzTmFONzcyIC0+IC0xCitjdG14OTgzIGNvbXBhcmV0b3RtYWcgK3NOYU43NzEgK3NOYU43NzIgLT4gLTEKK2N0bXg5ODQgY29tcGFyZXRvdG1hZyAtc05hTjc3MiAtc05hTjc3MSAtPiAgMQorY3RteDk4NSBjb21wYXJldG90bWFnICtzTmFONzcyIC1zTmFONzcxIC0+ICAxCitjdG14OTg2IGNvbXBhcmV0b3RtYWcgLXNOYU43NzIgK3NOYU43NzEgLT4gIDEKK2N0bXg5ODcgY29tcGFyZXRvdG1hZyArc05hTjc3MiArc05hTjc3MSAtPiAgMQorCitjdG14OTkxIGNvbXBhcmV0b3RtYWcgLXNOYU45OSAtSW5mICAgIC0+ICAxCitjdG14OTkyIGNvbXBhcmV0b3RtYWcgIHNOYU45OCAtMTEgICAgIC0+ICAxCitjdG14OTkzIGNvbXBhcmV0b3RtYWcgIHNOYU45NyAgTmFOICAgIC0+IC0xCitjdG14OTk0IGNvbXBhcmV0b3RtYWcgIHNOYU4xNiBzTmFOOTQgIC0+IC0xCitjdG14OTk1IGNvbXBhcmV0b3RtYWcgIE5hTjg1ICBzTmFOODMgIC0+ICAxCitjdG14OTk2IGNvbXBhcmV0b3RtYWcgLUluZiAgICBzTmFOOTIgIC0+IC0xCitjdG14OTk3IGNvbXBhcmV0b3RtYWcgIDA4OCAgICBzTmFOODEgIC0+IC0xCitjdG14OTk4IGNvbXBhcmV0b3RtYWcgIEluZiAgICBzTmFOOTAgIC0+IC0xCitjdG14OTk5IGNvbXBhcmV0b3RtYWcgIE5hTiAgIC1zTmFOODkgIC0+ICAxCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gc3Vibm9ybWFsIHJlc3VsdHMgbm93IGFsbG93ZWQKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitjdG14MTA4MCBjb21wYXJldG90bWFnICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAgLT4gIC0xCitjdG14MTA4MSBjb21wYXJldG90bWFnIDlFKzk5OTk5OTk5OSArMS4yMzQ1Njc4OTAxMjM0NUUtMCAgLT4gICAxCitjdG14MTA4MiBjb21wYXJldG90bWFnICswLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAgLT4gICAxCitjdG14MTA4MyBjb21wYXJldG90bWFnIDlFLTk5OTk5OTk5OSArMC4xMDAgICAgICAgICAgICAgICAgLT4gIC0xCitjdG14MTA4NSBjb21wYXJldG90bWFnIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAgLT4gIC0xCitjdG14MTA4NiBjb21wYXJldG90bWFnIDlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAgLT4gICAxCitjdG14MTA4NyBjb21wYXJldG90bWFnIC0wLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAgLT4gICAxCitjdG14MTA4OCBjb21wYXJldG90bWFnIDlFLTk5OTk5OTk5OSAtMC4xMDAgICAgICAgICAgICAgICAgLT4gIC0xCisKK2N0bXgxMDg5IGNvbXBhcmV0b3RtYWcgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMSAgICAtPiAgLTEKK2N0bXgxMDkwIGNvbXBhcmV0b3RtYWcgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMCAgICAtPiAgLTEKK2N0bXgxMDkxIGNvbXBhcmV0b3RtYWcgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwMCAgICAtPiAgLTEKK2N0bXgxMDkyIGNvbXBhcmV0b3RtYWcgOWUtOTk5OTk5OTk4IDAuMDEgICAgICAgICAgICAtPiAgLTEKK2N0bXgxMDkzIGNvbXBhcmV0b3RtYWcgOWUtOTk5OTk5OTk4IDAuMSAgICAgICAgICAgICAtPiAgLTEKK2N0bXgxMDk0IGNvbXBhcmV0b3RtYWcgMC4wMSA5ZS05OTk5OTk5OTggICAgICAgICAgICAtPiAgIDEKK2N0bXgxMDk1IGNvbXBhcmV0b3RtYWcgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDEgICAgICAtPiAgIDEKK2N0bXgxMDk2IGNvbXBhcmV0b3RtYWcgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDAgICAgICAtPiAgIDEKK2N0bXgxMDk3IGNvbXBhcmV0b3RtYWcgMWU2MDAwMDAwMDAgMWU0MDAwMDAwMDAgICAgICAtPiAgIDEKK2N0bXgxMDk4IGNvbXBhcmV0b3RtYWcgOWU5OTk5OTk5OTggMTAwICAgICAgICAgICAgICAtPiAgIDEKK2N0bXgxMDk5IGNvbXBhcmV0b3RtYWcgOWU5OTk5OTk5OTggMTAgICAgICAgICAgICAgICAtPiAgIDEKK2N0bXgxMTAwIGNvbXBhcmV0b3RtYWcgMTAwICA5ZTk5OTk5OTk5OCAgICAgICAgICAgICAtPiAgLTEKKy0tIHNpZ25zCitjdG14MTEwMSBjb21wYXJldG90bWFnICAxZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAgLT4gICAxCitjdG14MTEwMiBjb21wYXJldG90bWFnICAxZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAgLT4gICAxCitjdG14MTEwMyBjb21wYXJldG90bWFnIC0xZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAgLT4gICAxCitjdG14MTEwNCBjb21wYXJldG90bWFnIC0xZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAgLT4gICAxCitjdG14MTEwNSBjb21wYXJldG90bWFnICAxZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAgLT4gIC0xCitjdG14MTEwNiBjb21wYXJldG90bWFnICAxZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAgLT4gIC0xCitjdG14MTEwNyBjb21wYXJldG90bWFnIC0xZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAgLT4gIC0xCitjdG14MTEwOCBjb21wYXJldG90bWFnIC0xZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAgLT4gIC0xCisKKy0tIHNwcmVhZCB6ZXJvcworY3RteDExMTAgY29tcGFyZXRvdG1hZyAgIDBFLTM4MyAgMCAgICAgICAgLT4gIC0xCitjdG14MTExMSBjb21wYXJldG90bWFnICAgMEUtMzgzIC0wICAgICAgICAtPiAgLTEKK2N0bXgxMTEyIGNvbXBhcmV0b3RtYWcgIC0wRS0zODMgIDAgICAgICAgIC0+ICAtMQorY3RteDExMTMgY29tcGFyZXRvdG1hZyAgLTBFLTM4MyAtMCAgICAgICAgLT4gIC0xCitjdG14MTExNCBjb21wYXJldG90bWFnICAgMEUtMzgzICAwRSszODQgICAtPiAgLTEKK2N0bXgxMTE1IGNvbXBhcmV0b3RtYWcgICAwRS0zODMgLTBFKzM4NCAgIC0+ICAtMQorY3RteDExMTYgY29tcGFyZXRvdG1hZyAgLTBFLTM4MyAgMEUrMzg0ICAgLT4gIC0xCitjdG14MTExNyBjb21wYXJldG90bWFnICAtMEUtMzgzIC0wRSszODQgICAtPiAgLTEKK2N0bXgxMTE4IGNvbXBhcmV0b3RtYWcgICAwICAgICAgIDBFKzM4NCAgIC0+ICAtMQorY3RteDExMTkgY29tcGFyZXRvdG1hZyAgIDAgICAgICAtMEUrMzg0ICAgLT4gIC0xCitjdG14MTEyMCBjb21wYXJldG90bWFnICAtMCAgICAgICAwRSszODQgICAtPiAgLTEKK2N0bXgxMTIxIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgLTBFKzM4NCAgIC0+ICAtMQorCitjdG14MTEzMCBjb21wYXJldG90bWFnICAgMEUrMzg0ICAwICAgICAgICAtPiAgIDEKK2N0bXgxMTMxIGNvbXBhcmV0b3RtYWcgICAwRSszODQgLTAgICAgICAgIC0+ICAgMQorY3RteDExMzIgY29tcGFyZXRvdG1hZyAgLTBFKzM4NCAgMCAgICAgICAgLT4gICAxCitjdG14MTEzMyBjb21wYXJldG90bWFnICAtMEUrMzg0IC0wICAgICAgICAtPiAgIDEKK2N0bXgxMTM0IGNvbXBhcmV0b3RtYWcgICAwRSszODQgIDBFLTM4MyAgIC0+ICAgMQorY3RteDExMzUgY29tcGFyZXRvdG1hZyAgIDBFKzM4NCAtMEUtMzgzICAgLT4gICAxCitjdG14MTEzNiBjb21wYXJldG90bWFnICAtMEUrMzg0ICAwRS0zODMgICAtPiAgIDEKK2N0bXgxMTM3IGNvbXBhcmV0b3RtYWcgIC0wRSszODQgLTBFLTM4MyAgIC0+ICAgMQorY3RteDExMzggY29tcGFyZXRvdG1hZyAgIDAgICAgICAgMEUtMzgzICAgLT4gICAxCitjdG14MTEzOSBjb21wYXJldG90bWFnICAgMCAgICAgIC0wRS0zODMgICAtPiAgIDEKK2N0bXgxMTQwIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgIDBFLTM4MyAgIC0+ICAgMQorY3RteDExNDEgY29tcGFyZXRvdG1hZyAgLTAgICAgICAtMEUtMzgzICAgLT4gICAxCisKKy0tIE51bGwgdGVzdHMKK2N0bXg5OTkwIGNvbXBhcmV0b3RtYWcgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitjdG14OTk5MSBjb21wYXJldG90bWFnICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHkuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWYyOTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5LmRlY1Rlc3QKQEAgLTAsMCArMSw4NiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBjb3B5LmRlY1Rlc3QgLS0gcXVpZXQgY29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNhbml0eSBjaGVjaworY3B5eDAwMSBjb3B5ICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2NweXgwMTEgY29weSAgSW5maW5pdHkgICAgLT4gSW5maW5pdHkKK2NweXgwMTIgY29weSAgLUluZmluaXR5ICAgLT4gLUluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorY3B5eDAyMSBjb3B5ICAgICAgICAgTmFOICAtPiBOYU4KK2NweXgwMjIgY29weSAgICAgICAgLU5hTiAgLT4gLU5hTgorY3B5eDAyMyBjb3B5ICAgICAgICBzTmFOICAtPiBzTmFOCitjcHl4MDI0IGNvcHkgICAgICAgLXNOYU4gIC0+IC1zTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2NweXgwMzEgY29weSAgICAgICBOYU4xMCAgLT4gTmFOMTAKK2NweXgwMzIgY29weSAgICAgIC1OYU4xMCAgLT4gLU5hTjEwCitjcHl4MDMzIGNvcHkgICAgICBzTmFOMTAgIC0+IHNOYU4xMAorY3B5eDAzNCBjb3B5ICAgICAtc05hTjEwICAtPiAtc05hTjEwCitjcHl4MDM1IGNvcHkgICAgICAgTmFONyAgIC0+IE5hTjcKK2NweXgwMzYgY29weSAgICAgIC1OYU43ICAgLT4gLU5hTjcKK2NweXgwMzcgY29weSAgICAgIHNOYU4xMDEgLT4gc05hTjEwMQorY3B5eDAzOCBjb3B5ICAgICAtc05hTjEwMSAtPiAtc05hTjEwMQorCistLSBmaW5pdGVzCitjcHl4MTAxIGNvcHkgICAgICAgICAgNyAgIC0+IDcKK2NweXgxMDIgY29weSAgICAgICAgIC03ICAgLT4gLTcKK2NweXgxMDMgY29weSAgICAgICAgIDc1ICAgLT4gNzUKK2NweXgxMDQgY29weSAgICAgICAgLTc1ICAgLT4gLTc1CitjcHl4MTA1IGNvcHkgICAgICAgNy41MCAgIC0+IDcuNTAKK2NweXgxMDYgY29weSAgICAgIC03LjUwICAgLT4gLTcuNTAKK2NweXgxMDcgY29weSAgICAgICA3LjUwMCAgLT4gNy41MDAKK2NweXgxMDggY29weSAgICAgIC03LjUwMCAgLT4gLTcuNTAwCisKKy0tIHplcm9zCitjcHl4MTExIGNvcHkgICAgICAgICAgMCAgIC0+IDAKK2NweXgxMTIgY29weSAgICAgICAgIC0wICAgLT4gLTAKK2NweXgxMTMgY29weSAgICAgICAwRSs0ICAgLT4gMEUrNAorY3B5eDExNCBjb3B5ICAgICAgLTBFKzQgICAtPiAtMEUrNAorY3B5eDExNSBjb3B5ICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2NweXgxMTYgY29weSAgICAtMC4wMDAwICAgLT4gLTAuMDAwMAorY3B5eDExNyBjb3B5ICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2NweXgxMTggY29weSAgICAgLTBFLTE0MSAgLT4gLTBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworY3B5eDEyMSBjb3B5ICAgMjY4MjY4MjY4ICAgICAgICAtPiAyNjgyNjgyNjgKK2NweXgxMjIgY29weSAgLTI2ODI2ODI2OCAgICAgICAgLT4gLTI2ODI2ODI2OAorY3B5eDEyMyBjb3B5ICAgMTM0MTM0MTM0ICAgICAgICAtPiAxMzQxMzQxMzQKK2NweXgxMjQgY29weSAgLTEzNDEzNDEzNCAgICAgICAgLT4gLTEzNDEzNDEzNAorCistLSBObWF4LCBObWluLCBOdGlueQorY3B5eDEzMSBjb3B5ICA5Ljk5OTk5OTk5RSs5OTkgICAtPiA5Ljk5OTk5OTk5RSs5OTkKK2NweXgxMzIgY29weSAgMUUtOTk5ICAgICAgICAgICAgLT4gMUUtOTk5CitjcHl4MTMzIGNvcHkgIDEuMDAwMDAwMDBFLTk5OSAgIC0+IDEuMDAwMDAwMDBFLTk5OQorY3B5eDEzNCBjb3B5ICAxRS0xMDA3ICAgICAgICAgICAtPiAxRS0xMDA3CisKK2NweXgxMzUgY29weSAgLTFFLTEwMDcgICAgICAgICAgLT4gLTFFLTEwMDcKK2NweXgxMzYgY29weSAgLTEuMDAwMDAwMDBFLTk5OSAgLT4gLTEuMDAwMDAwMDBFLTk5OQorY3B5eDEzNyBjb3B5ICAtMUUtOTk5ICAgICAgICAgICAtPiAtMUUtOTk5CitjcHl4MTM4IGNvcHkgIC05Ljk5OTk5OTk5RSs5OTkgIC0+IC05Ljk5OTk5OTk5RSs5OTkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29weWFicy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5YWJzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwMDJkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29weWFicy5kZWNUZXN0CkBAIC0wLDAgKzEsODYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY29weUFicy5kZWNUZXN0IC0tIHF1aWV0IGNvcHkgYW5kIHNldCBzaWduIHRvIHplcm8gICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCistLSBTYW5pdHkgY2hlY2sKK2NwYXgwMDEgY29weWFicyAgICAgICArNy41MCAgLT4gNy41MAorCistLSBJbmZpbml0aWVzCitjcGF4MDExIGNvcHlhYnMgIEluZmluaXR5ICAgIC0+IEluZmluaXR5CitjcGF4MDEyIGNvcHlhYnMgIC1JbmZpbml0eSAgIC0+IEluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorY3BheDAyMSBjb3B5YWJzICAgICAgICAgTmFOICAtPiBOYU4KK2NwYXgwMjIgY29weWFicyAgICAgICAgLU5hTiAgLT4gTmFOCitjcGF4MDIzIGNvcHlhYnMgICAgICAgIHNOYU4gIC0+IHNOYU4KK2NwYXgwMjQgY29weWFicyAgICAgICAtc05hTiAgLT4gc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitjcGF4MDMxIGNvcHlhYnMgICAgICAgTmFOMTAgIC0+IE5hTjEwCitjcGF4MDMyIGNvcHlhYnMgICAgICAtTmFOMTUgIC0+IE5hTjE1CitjcGF4MDMzIGNvcHlhYnMgICAgICBzTmFOMTUgIC0+IHNOYU4xNQorY3BheDAzNCBjb3B5YWJzICAgICAtc05hTjEwICAtPiBzTmFOMTAKK2NwYXgwMzUgY29weWFicyAgICAgICBOYU43ICAgLT4gTmFONworY3BheDAzNiBjb3B5YWJzICAgICAgLU5hTjcgICAtPiBOYU43CitjcGF4MDM3IGNvcHlhYnMgICAgICBzTmFOMTAxIC0+IHNOYU4xMDEKK2NwYXgwMzggY29weWFicyAgICAgLXNOYU4xMDEgLT4gc05hTjEwMQorCistLSBmaW5pdGVzCitjcGF4MTAxIGNvcHlhYnMgICAgICAgICAgNyAgIC0+IDcKK2NwYXgxMDIgY29weWFicyAgICAgICAgIC03ICAgLT4gNworY3BheDEwMyBjb3B5YWJzICAgICAgICAgNzUgICAtPiA3NQorY3BheDEwNCBjb3B5YWJzICAgICAgICAtNzUgICAtPiA3NQorY3BheDEwNSBjb3B5YWJzICAgICAgIDcuMTAgICAtPiA3LjEwCitjcGF4MTA2IGNvcHlhYnMgICAgICAtNy4xMCAgIC0+IDcuMTAKK2NwYXgxMDcgY29weWFicyAgICAgICA3LjUwMCAgLT4gNy41MDAKK2NwYXgxMDggY29weWFicyAgICAgIC03LjUwMCAgLT4gNy41MDAKKworLS0gemVyb3MKK2NwYXgxMTEgY29weWFicyAgICAgICAgICAwICAgLT4gMAorY3BheDExMiBjb3B5YWJzICAgICAgICAgLTAgICAtPiAwCitjcGF4MTEzIGNvcHlhYnMgICAgICAgMEUrNiAgIC0+IDBFKzYKK2NwYXgxMTQgY29weWFicyAgICAgIC0wRSs2ICAgLT4gMEUrNgorY3BheDExNSBjb3B5YWJzICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2NwYXgxMTYgY29weWFicyAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitjcGF4MTE3IGNvcHlhYnMgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorY3BheDExOCBjb3B5YWJzICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2NwYXgxMjEgY29weWFicyAgIDI2ODI2ODI2OCAgICAgICAgLT4gMjY4MjY4MjY4CitjcGF4MTIyIGNvcHlhYnMgIC0yNjgyNjgyNjggICAgICAgIC0+IDI2ODI2ODI2OAorY3BheDEyMyBjb3B5YWJzICAgMTM0MTM0MTM0ICAgICAgICAtPiAxMzQxMzQxMzQKK2NwYXgxMjQgY29weWFicyAgLTEzNDEzNDEzNCAgICAgICAgLT4gMTM0MTM0MTM0CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitjcGF4MTMxIGNvcHlhYnMgIDkuOTk5OTk5OTlFKzk5OSAgIC0+IDkuOTk5OTk5OTlFKzk5OQorY3BheDEzMiBjb3B5YWJzICAxRS05OTkgICAgICAgICAgICAtPiAxRS05OTkKK2NwYXgxMzMgY29weWFicyAgMS4wMDAwMDAwMEUtOTk5ICAgLT4gMS4wMDAwMDAwMEUtOTk5CitjcGF4MTM0IGNvcHlhYnMgIDFFLTEwMDcgICAgICAgICAgIC0+IDFFLTEwMDcKKworY3BheDEzNSBjb3B5YWJzICAtMUUtMTAwNyAgICAgICAgICAtPiAxRS0xMDA3CitjcGF4MTM2IGNvcHlhYnMgIC0xLjAwMDAwMDAwRS05OTkgIC0+IDEuMDAwMDAwMDBFLTk5OQorY3BheDEzNyBjb3B5YWJzICAtMUUtOTk5ICAgICAgICAgICAtPiAxRS05OTkKK2NwYXgxOTkgY29weWFicyAgLTkuOTk5OTk5OTlFKzk5OSAgLT4gOS45OTk5OTk5OUUrOTk5CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHluZWdhdGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvY29weW5lZ2F0ZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOGRlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHluZWdhdGUuZGVjVGVzdApAQCAtMCwwICsxLDg2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGNvcHlOZWdhdGUuZGVjVGVzdCAtLSBxdWlldCBjb3B5IGFuZCBuZWdhdGUgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU2FuaXR5IGNoZWNrCitjcG54MDAxIGNvcHluZWdhdGUgICAgICAgKzcuNTAgIC0+IC03LjUwCisKKy0tIEluZmluaXRpZXMKK2NwbngwMTEgY29weW5lZ2F0ZSAgSW5maW5pdHkgICAgLT4gLUluZmluaXR5CitjcG54MDEyIGNvcHluZWdhdGUgIC1JbmZpbml0eSAgIC0+IEluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorY3BueDAyMSBjb3B5bmVnYXRlICAgICAgICAgTmFOICAtPiAtTmFOCitjcG54MDIyIGNvcHluZWdhdGUgICAgICAgIC1OYU4gIC0+IE5hTgorY3BueDAyMyBjb3B5bmVnYXRlICAgICAgICBzTmFOICAtPiAtc05hTgorY3BueDAyNCBjb3B5bmVnYXRlICAgICAgIC1zTmFOICAtPiBzTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2NwbngwMzEgY29weW5lZ2F0ZSAgICAgICBOYU4xMyAgLT4gLU5hTjEzCitjcG54MDMyIGNvcHluZWdhdGUgICAgICAtTmFOMTMgIC0+IE5hTjEzCitjcG54MDMzIGNvcHluZWdhdGUgICAgICBzTmFOMTMgIC0+IC1zTmFOMTMKK2NwbngwMzQgY29weW5lZ2F0ZSAgICAgLXNOYU4xMyAgLT4gc05hTjEzCitjcG54MDM1IGNvcHluZWdhdGUgICAgICAgTmFONzAgIC0+IC1OYU43MAorY3BueDAzNiBjb3B5bmVnYXRlICAgICAgLU5hTjcwICAtPiBOYU43MAorY3BueDAzNyBjb3B5bmVnYXRlICAgICAgc05hTjEwMSAtPiAtc05hTjEwMQorY3BueDAzOCBjb3B5bmVnYXRlICAgICAtc05hTjEwMSAtPiBzTmFOMTAxCisKKy0tIGZpbml0ZXMKK2NwbngxMDEgY29weW5lZ2F0ZSAgICAgICAgICA3ICAgLT4gLTcKK2NwbngxMDIgY29weW5lZ2F0ZSAgICAgICAgIC03ICAgLT4gNworY3BueDEwMyBjb3B5bmVnYXRlICAgICAgICAgNzUgICAtPiAtNzUKK2NwbngxMDQgY29weW5lZ2F0ZSAgICAgICAgLTc1ICAgLT4gNzUKK2NwbngxMDUgY29weW5lZ2F0ZSAgICAgICA3LjUwICAgLT4gLTcuNTAKK2NwbngxMDYgY29weW5lZ2F0ZSAgICAgIC03LjUwICAgLT4gNy41MAorY3BueDEwNyBjb3B5bmVnYXRlICAgICAgIDcuNTAwICAtPiAtNy41MDAKK2NwbngxMDggY29weW5lZ2F0ZSAgICAgIC03LjUwMCAgLT4gNy41MDAKKworLS0gemVyb3MKK2NwbngxMTEgY29weW5lZ2F0ZSAgICAgICAgICAwICAgLT4gLTAKK2NwbngxMTIgY29weW5lZ2F0ZSAgICAgICAgIC0wICAgLT4gMAorY3BueDExMyBjb3B5bmVnYXRlICAgICAgIDBFKzQgICAtPiAtMEUrNAorY3BueDExNCBjb3B5bmVnYXRlICAgICAgLTBFKzQgICAtPiAwRSs0CitjcG54MTE1IGNvcHluZWdhdGUgICAgIDAuMDAwMCAgIC0+IC0wLjAwMDAKK2NwbngxMTYgY29weW5lZ2F0ZSAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitjcG54MTE3IGNvcHluZWdhdGUgICAgICAwRS0xNDEgIC0+IC0wRS0xNDEKK2NwbngxMTggY29weW5lZ2F0ZSAgICAgLTBFLTE0MSAgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitjcG54MTIxIGNvcHluZWdhdGUgIDI2ODI2ODI2OCAgICAgICAgIC0+IC0yNjgyNjgyNjgKK2NwbngxMjIgY29weW5lZ2F0ZSAgLTI2ODI2ODI2OCAgICAgICAgLT4gMjY4MjY4MjY4CitjcG54MTIzIGNvcHluZWdhdGUgIDEzNDEzNDEzNCAgICAgICAgIC0+IC0xMzQxMzQxMzQKK2NwbngxMjQgY29weW5lZ2F0ZSAgLTEzNDEzNDEzNCAgICAgICAgLT4gMTM0MTM0MTM0CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitjcG54MTMxIGNvcHluZWdhdGUgIDkuOTk5OTk5OTlFKzk5OSAgIC0+IC05Ljk5OTk5OTk5RSs5OTkKK2NwbngxMzIgY29weW5lZ2F0ZSAgMUUtOTk5ICAgICAgICAgICAgICAgICAgICAgLT4gLTFFLTk5OQorY3BueDEzMyBjb3B5bmVnYXRlICAxLjAwMDAwMDAwRS05OTkgICAtPiAtMS4wMDAwMDAwMEUtOTk5CitjcG54MTM0IGNvcHluZWdhdGUgIDFFLTEwMDcgICAgICAgICAgICAgICAgICAgIC0+IC0xRS0xMDA3CisKK2NwbngxMzUgY29weW5lZ2F0ZSAgLTFFLTEwMDcgICAgICAgICAgICAgICAgICAgLT4gMUUtMTAwNworY3BueDEzNiBjb3B5bmVnYXRlICAtMS4wMDAwMDAwMEUtOTk5ICAtPiAxLjAwMDAwMDAwRS05OTkKK2NwbngxMzcgY29weW5lZ2F0ZSAgLTFFLTk5OSAgICAgICAgICAgICAgICAgICAgLT4gMUUtOTk5CitjcG54MTM4IGNvcHluZWdhdGUgIC05Ljk5OTk5OTk5RSs5OTkgIC0+IDkuOTk5OTk5OTlFKzk5OQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5c2lnbi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9jb3B5c2lnbi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZGQ2NzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2NvcHlzaWduLmRlY1Rlc3QKQEAgLTAsMCArMSwxNzcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gY29weXNpZ24uZGVjVGVzdCAtLSBxdWlldCBjb3B5IHdpdGggc2lnbiBmcm9tIHJocyAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCistLSBTYW5pdHkgY2hlY2ssIGFuZCBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCitjcHN4MDAxIGNvcHlzaWduICAgKzcuNTAgICAgICAgMTEgIC0+IDcuNTAKK2Nwc3gwMDIgY29weXNpZ24gICAnMS41MCcgICAnNy4zMycgLT4gMS41MAorY3BzeDAwMyBjb3B5c2lnbiAgJy0xLjUwJyAgICc3LjMzJyAtPiAxLjUwCitjcHN4MDA0IGNvcHlzaWduICAgJzEuNTAnICAnLTcuMzMnIC0+IC0xLjUwCitjcHN4MDA1IGNvcHlzaWduICAnLTEuNTAnICAnLTcuMzMnIC0+IC0xLjUwCisKKy0tIEluZmluaXRpZXMKK2Nwc3gwMTEgY29weXNpZ24gIEluZmluaXR5ICAgICAgIDExIC0+IEluZmluaXR5CitjcHN4MDEyIGNvcHlzaWduICAtSW5maW5pdHkgICAgICAxMSAtPiBJbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2Nwc3gwMjEgY29weXNpZ24gICAgICAgICBOYU4gICAgIDExIC0+IE5hTgorY3BzeDAyMiBjb3B5c2lnbiAgICAgICAgLU5hTiAgICAgMTEgLT4gTmFOCitjcHN4MDIzIGNvcHlzaWduICAgICAgICBzTmFOICAgICAxMSAtPiBzTmFOCitjcHN4MDI0IGNvcHlzaWduICAgICAgIC1zTmFOICAgICAxMSAtPiBzTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2Nwc3gwMzEgY29weXNpZ24gICAgICAgTmFOMTAgICAgIDExIC0+IE5hTjEwCitjcHN4MDMyIGNvcHlzaWduICAgICAgLU5hTjEwICAgICAxMSAtPiBOYU4xMAorY3BzeDAzMyBjb3B5c2lnbiAgICAgIHNOYU4xMCAgICAgMTEgLT4gc05hTjEwCitjcHN4MDM0IGNvcHlzaWduICAgICAtc05hTjEwICAgICAxMSAtPiBzTmFOMTAKK2Nwc3gwMzUgY29weXNpZ24gICAgICAgTmFONyAgICAgIDExIC0+IE5hTjcKK2Nwc3gwMzYgY29weXNpZ24gICAgICAtTmFONyAgICAgIDExIC0+IE5hTjcKK2Nwc3gwMzcgY29weXNpZ24gICAgICBzTmFOMTAxICAgIDExIC0+IHNOYU4xMDEKK2Nwc3gwMzggY29weXNpZ24gICAgIC1zTmFOMTAxICAgIDExIC0+IHNOYU4xMDEKKworLS0gZmluaXRlcworY3BzeDEwMSBjb3B5c2lnbiAgICAgICAgICA3ICAgICAgMTEgLT4gNworY3BzeDEwMiBjb3B5c2lnbiAgICAgICAgIC03ICAgICAgMTEgLT4gNworY3BzeDEwMyBjb3B5c2lnbiAgICAgICAgIDc1ICAgICAgMTEgLT4gNzUKK2Nwc3gxMDQgY29weXNpZ24gICAgICAgIC03NSAgICAgIDExIC0+IDc1CitjcHN4MTA1IGNvcHlzaWduICAgICAgIDcuNTAgICAgICAxMSAtPiA3LjUwCitjcHN4MTA2IGNvcHlzaWduICAgICAgLTcuNTAgICAgICAxMSAtPiA3LjUwCitjcHN4MTA3IGNvcHlzaWduICAgICAgIDcuNTAwICAgICAxMSAtPiA3LjUwMAorY3BzeDEwOCBjb3B5c2lnbiAgICAgIC03LjUwMCAgICAgMTEgLT4gNy41MDAKKworLS0gemVyb3MKK2Nwc3gxMTEgY29weXNpZ24gICAgICAgICAgMCAgICAgIDExIC0+IDAKK2Nwc3gxMTIgY29weXNpZ24gICAgICAgICAtMCAgICAgIDExIC0+IDAKK2Nwc3gxMTMgY29weXNpZ24gICAgICAgMEUrNCAgICAgIDExIC0+IDBFKzQKK2Nwc3gxMTQgY29weXNpZ24gICAgICAtMEUrNCAgICAgIDExIC0+IDBFKzQKK2Nwc3gxMTUgY29weXNpZ24gICAgIDAuMDAwMCAgICAgIDExIC0+IDAuMDAwMAorY3BzeDExNiBjb3B5c2lnbiAgICAtMC4wMDAwICAgICAgMTEgLT4gMC4wMDAwCitjcHN4MTE3IGNvcHlzaWduICAgICAgMEUtMTQxICAgICAxMSAtPiAwRS0xNDEKK2Nwc3gxMTggY29weXNpZ24gICAgIC0wRS0xNDEgICAgIDExIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworY3BzeDEyMSBjb3B5c2lnbiAgIDI2ODI2ODI2OCAgICAgICAgICAgMTEgLT4gMjY4MjY4MjY4CitjcHN4MTIyIGNvcHlzaWduICAtMjY4MjY4MjY4ICAgICAgICAgICAxMSAtPiAyNjgyNjgyNjgKK2Nwc3gxMjMgY29weXNpZ24gICAxMzQxMzQxMzQgICAgICAgICAgIDExIC0+IDEzNDEzNDEzNAorY3BzeDEyNCBjb3B5c2lnbiAgLTEzNDEzNDEzNCAgICAgICAgICAgMTEgLT4gMTM0MTM0MTM0CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitjcHN4MTMxIGNvcHlzaWduICA5Ljk5OTk5OTk5RSs5OTkgICAgICAxMSAtPiA5Ljk5OTk5OTk5RSs5OTkKK2Nwc3gxMzIgY29weXNpZ24gIDFFLTk5OSAgICAgICAgICAgICAgIDExIC0+IDFFLTk5OQorY3BzeDEzMyBjb3B5c2lnbiAgMS4wMDAwMDAwMEUtOTk5ICAgICAgMTEgLT4gMS4wMDAwMDAwMEUtOTk5CitjcHN4MTM0IGNvcHlzaWduICAxRS0xMDA3ICAgICAgICAgICAgICAxMSAtPiAxRS0xMDA3CisKK2Nwc3gxMzUgY29weXNpZ24gIC0xRS0xMDA3ICAgICAgICAgICAgIDExIC0+IDFFLTEwMDcKK2Nwc3gxMzYgY29weXNpZ24gIC0xLjAwMDAwMDAwRS05OTkgICAgIDExIC0+IDEuMDAwMDAwMDBFLTk5OQorY3BzeDEzNyBjb3B5c2lnbiAgLTFFLTk5OSAgICAgICAgICAgICAgMTEgLT4gMUUtOTk5CitjcHN4MTM4IGNvcHlzaWduICAtOS45OTk5OTk5OUUrOTk5ICAgICAxMSAtPiA5Ljk5OTk5OTk5RSs5OTkKKworLS0gcmVwZWF0IHdpdGggbmVnYXRpdmUgUkhTCisKKy0tIEluZmluaXRpZXMKK2Nwc3gyMTEgY29weXNpZ24gIEluZmluaXR5ICAgICAgIC0zNCAtPiAtSW5maW5pdHkKK2Nwc3gyMTIgY29weXNpZ24gIC1JbmZpbml0eSAgICAgIC0zNCAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitjcHN4MjIxIGNvcHlzaWduICAgICAgICAgTmFOICAgICAtMzQgLT4gLU5hTgorY3BzeDIyMiBjb3B5c2lnbiAgICAgICAgLU5hTiAgICAgLTM0IC0+IC1OYU4KK2Nwc3gyMjMgY29weXNpZ24gICAgICAgIHNOYU4gICAgIC0zNCAtPiAtc05hTgorY3BzeDIyNCBjb3B5c2lnbiAgICAgICAtc05hTiAgICAgLTM0IC0+IC1zTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2Nwc3gyMzEgY29weXNpZ24gICAgICAgTmFOMTAgICAgIC0zNCAtPiAtTmFOMTAKK2Nwc3gyMzIgY29weXNpZ24gICAgICAtTmFOMTAgICAgIC0zNCAtPiAtTmFOMTAKK2Nwc3gyMzMgY29weXNpZ24gICAgICBzTmFOMTAgICAgIC0zNCAtPiAtc05hTjEwCitjcHN4MjM0IGNvcHlzaWduICAgICAtc05hTjEwICAgICAtMzQgLT4gLXNOYU4xMAorY3BzeDIzNSBjb3B5c2lnbiAgICAgICBOYU43ICAgICAgLTM0IC0+IC1OYU43CitjcHN4MjM2IGNvcHlzaWduICAgICAgLU5hTjcgICAgICAtMzQgLT4gLU5hTjcKK2Nwc3gyMzcgY29weXNpZ24gICAgICBzTmFOMTAxICAgIC0zNCAtPiAtc05hTjEwMQorY3BzeDIzOCBjb3B5c2lnbiAgICAgLXNOYU4xMDEgICAgLTM0IC0+IC1zTmFOMTAxCisKKy0tIGZpbml0ZXMKK2Nwc3gzMDEgY29weXNpZ24gICAgICAgICAgNyAgICAgIC0zNCAtPiAtNworY3BzeDMwMiBjb3B5c2lnbiAgICAgICAgIC03ICAgICAgLTM0IC0+IC03CitjcHN4MzAzIGNvcHlzaWduICAgICAgICAgNzUgICAgICAtMzQgLT4gLTc1CitjcHN4MzA0IGNvcHlzaWduICAgICAgICAtNzUgICAgICAtMzQgLT4gLTc1CitjcHN4MzA1IGNvcHlzaWduICAgICAgIDcuNTAgICAgICAtMzQgLT4gLTcuNTAKK2Nwc3gzMDYgY29weXNpZ24gICAgICAtNy41MCAgICAgIC0zNCAtPiAtNy41MAorY3BzeDMwNyBjb3B5c2lnbiAgICAgICA3LjUwMCAgICAgLTM0IC0+IC03LjUwMAorY3BzeDMwOCBjb3B5c2lnbiAgICAgIC03LjUwMCAgICAgLTM0IC0+IC03LjUwMAorCistLSB6ZXJvcworY3BzeDMxMSBjb3B5c2lnbiAgICAgICAgICAwICAgICAgLTM0IC0+IC0wCitjcHN4MzEyIGNvcHlzaWduICAgICAgICAgLTAgICAgICAtMzQgLT4gLTAKK2Nwc3gzMTMgY29weXNpZ24gICAgICAgMEUrNCAgICAgIC0zNCAtPiAtMEUrNAorY3BzeDMxNCBjb3B5c2lnbiAgICAgIC0wRSs0ICAgICAgLTM0IC0+IC0wRSs0CitjcHN4MzE1IGNvcHlzaWduICAgICAwLjAwMDAgICAgICAtMzQgLT4gLTAuMDAwMAorY3BzeDMxNiBjb3B5c2lnbiAgICAtMC4wMDAwICAgICAgLTM0IC0+IC0wLjAwMDAKK2Nwc3gzMTcgY29weXNpZ24gICAgICAwRS0xNDEgICAgIC0zNCAtPiAtMEUtMTQxCitjcHN4MzE4IGNvcHlzaWduICAgICAtMEUtMTQxICAgICAtMzQgLT4gLTBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworY3BzeDMyMSBjb3B5c2lnbiAgIDI2ODI2ODI2OCAgICAgICAgICAtMTggLT4gLTI2ODI2ODI2OAorY3BzeDMyMiBjb3B5c2lnbiAgLTI2ODI2ODI2OCAgICAgICAgICAtMTggLT4gLTI2ODI2ODI2OAorY3BzeDMyMyBjb3B5c2lnbiAgIDEzNDEzNDEzNCAgICAgICAgICAtMTggLT4gLTEzNDEzNDEzNAorY3BzeDMyNCBjb3B5c2lnbiAgLTEzNDEzNDEzNCAgICAgICAgICAtMTggLT4gLTEzNDEzNDEzNAorCistLSBObWF4LCBObWluLCBOdGlueQorY3BzeDMzMSBjb3B5c2lnbiAgOS45OTk5OTk5OUUrOTk5ICAgICAtMTggLT4gLTkuOTk5OTk5OTlFKzk5OQorY3BzeDMzMiBjb3B5c2lnbiAgMUUtOTk5ICAgICAgICAgICAgICAtMTggLT4gLTFFLTk5OQorY3BzeDMzMyBjb3B5c2lnbiAgMS4wMDAwMDAwMEUtOTk5ICAgICAtMTggLT4gLTEuMDAwMDAwMDBFLTk5OQorY3BzeDMzNCBjb3B5c2lnbiAgMUUtMTAwNyAgICAgICAgICAgICAtMTggLT4gLTFFLTEwMDcKKworY3BzeDMzNSBjb3B5c2lnbiAgLTFFLTEwMDcgICAgICAgICAgICAtMTggLT4gLTFFLTEwMDcKK2Nwc3gzMzYgY29weXNpZ24gIC0xLjAwMDAwMDAwRS05OTkgICAgLTE4IC0+IC0xLjAwMDAwMDAwRS05OTkKK2Nwc3gzMzcgY29weXNpZ24gIC0xRS05OTkgICAgICAgICAgICAgLTE4IC0+IC0xRS05OTkKK2Nwc3gzMzggY29weXNpZ24gIC05Ljk5OTk5OTk5RSs5OTkgICAgLTE4IC0+IC05Ljk5OTk5OTk5RSs5OTkKKworLS0gT3RoZXIga2luZHMgb2YgUkhTCitjcHN4NDAxIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtMzQgLT4gLTcwMQorY3BzeDQwMiBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLTM0IC0+IC03MjAKK2Nwc3g0MDMgY29weXNpZ24gICAgICAgICAgNzAxICAgIC0wICAtPiAtNzAxCitjcHN4NDA0IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtMCAgLT4gLTcyMAorY3BzeDQwNSBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgKzAgIC0+ICA3MDEKK2Nwc3g0MDYgY29weXNpZ24gICAgICAgICAtNzIwICAgICswICAtPiAgNzIwCitjcHN4NDA3IGNvcHlzaWduICAgICAgICAgIDcwMSAgICArMzQgLT4gIDcwMQorY3BzeDQwOCBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgKzM0IC0+ICA3MjAKKworY3BzeDQxMyBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgLUluZiAgLT4gLTcwMQorY3BzeDQxNCBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLUluZiAgLT4gLTcyMAorY3BzeDQxNSBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK0luZiAgLT4gIDcwMQorY3BzeDQxNiBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgK0luZiAgLT4gIDcyMAorCitjcHN4NDIwIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtTmFOICAtPiAtNzAxCitjcHN4NDIxIGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtTmFOICAtPiAtNzIwCitjcHN4NDIyIGNvcHlzaWduICAgICAgICAgIDcwMSAgICArTmFOICAtPiAgNzAxCitjcHN4NDIzIGNvcHlzaWduICAgICAgICAgLTcyMCAgICArTmFOICAtPiAgNzIwCitjcHN4NDI1IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArTmFOOCAtPiAgNzIwCisKK2Nwc3g0MjYgY29weXNpZ24gICAgICAgICAgNzAxICAgIC1zTmFOICAtPiAtNzAxCitjcHN4NDI3IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtc05hTiAgLT4gLTcyMAorY3BzeDQyOCBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgK3NOYU4gIC0+ICA3MDEKK2Nwc3g0MjkgY29weXNpZ24gICAgICAgICAtNzIwICAgICtzTmFOICAtPiAgNzIwCitjcHN4NDMwIGNvcHlzaWduICAgICAgICAgLTcyMCAgICArc05hTjMgLT4gIDcyMAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQWJzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQWJzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk4ZDY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRBYnMuZGVjVGVzdApAQCAtMCwwICsxLDEyNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZEFicy5kZWNUZXN0IC0tIGRlY0RvdWJsZSBhYnNvbHV0ZSB2YWx1ZSwgaGVlZGluZyBzTmFOICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZGFiczAwMSBhYnMgJzEnICAgICAgLT4gJzEnCitkZGFiczAwMiBhYnMgJy0xJyAgICAgLT4gJzEnCitkZGFiczAwMyBhYnMgJzEuMDAnICAgLT4gJzEuMDAnCitkZGFiczAwNCBhYnMgJy0xLjAwJyAgLT4gJzEuMDAnCitkZGFiczAwNSBhYnMgJzAnICAgICAgLT4gJzAnCitkZGFiczAwNiBhYnMgJzAuMDAnICAgLT4gJzAuMDAnCitkZGFiczAwNyBhYnMgJzAwLjAnICAgLT4gJzAuMCcKK2RkYWJzMDA4IGFicyAnMDAuMDAnICAtPiAnMC4wMCcKK2RkYWJzMDA5IGFicyAnMDAnICAgICAtPiAnMCcKKworZGRhYnMwMTAgYWJzICctMicgICAgIC0+ICcyJworZGRhYnMwMTEgYWJzICcyJyAgICAgIC0+ICcyJworZGRhYnMwMTIgYWJzICctMi4wMCcgIC0+ICcyLjAwJworZGRhYnMwMTMgYWJzICcyLjAwJyAgIC0+ICcyLjAwJworZGRhYnMwMTQgYWJzICctMCcgICAgIC0+ICcwJworZGRhYnMwMTUgYWJzICctMC4wMCcgIC0+ICcwLjAwJworZGRhYnMwMTYgYWJzICctMDAuMCcgIC0+ICcwLjAnCitkZGFiczAxNyBhYnMgJy0wMC4wMCcgLT4gJzAuMDAnCitkZGFiczAxOCBhYnMgJy0wMCcgICAgLT4gJzAnCisKK2RkYWJzMDIwIGFicyAnLTIwMDAwMDAnIC0+ICcyMDAwMDAwJworZGRhYnMwMjEgYWJzICcyMDAwMDAwJyAgLT4gJzIwMDAwMDAnCisKK2RkYWJzMDMwIGFicyAnKzAuMScgICAgICAgICAgICAtPiAnMC4xJworZGRhYnMwMzEgYWJzICctMC4xJyAgICAgICAgICAgIC0+ICcwLjEnCitkZGFiczAzMiBhYnMgJyswLjAxJyAgICAgICAgICAgLT4gJzAuMDEnCitkZGFiczAzMyBhYnMgJy0wLjAxJyAgICAgICAgICAgLT4gJzAuMDEnCitkZGFiczAzNCBhYnMgJyswLjAwMScgICAgICAgICAgLT4gJzAuMDAxJworZGRhYnMwMzUgYWJzICctMC4wMDEnICAgICAgICAgIC0+ICcwLjAwMScKK2RkYWJzMDM2IGFicyAnKzAuMDAwMDAxJyAgICAgICAtPiAnMC4wMDAwMDEnCitkZGFiczAzNyBhYnMgJy0wLjAwMDAwMScgICAgICAgLT4gJzAuMDAwMDAxJworZGRhYnMwMzggYWJzICcrMC4wMDAwMDAwMDAwMDEnIC0+ICcxRS0xMicKK2RkYWJzMDM5IGFicyAnLTAuMDAwMDAwMDAwMDAxJyAtPiAnMUUtMTInCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK2RkYWJzMDQwIGFicyAnMi4xJyAgICAgLT4gICcyLjEnCitkZGFiczA0MSBhYnMgJy0xMDAnICAgIC0+ICAnMTAwJworZGRhYnMwNDIgYWJzICcxMDEuNScgICAtPiAgJzEwMS41JworZGRhYnMwNDMgYWJzICctMTAxLjUnICAtPiAgJzEwMS41JworCistLSBtb3JlIGZpeGVkLCBwb3RlbnRpYWwgTEhTIHN3YXBzL292ZXJsYXlzIGlmIGRvbmUgYnkgc3VidHJhY3QgMAorZGRhYnMwNjAgYWJzICctNTYyNjdFLTEwJyAgLT4gJzAuMDAwMDA1NjI2NycKK2RkYWJzMDYxIGFicyAnLTU2MjY3RS01JyAgIC0+ICcwLjU2MjY3JworZGRhYnMwNjIgYWJzICctNTYyNjdFLTInICAgLT4gJzU2Mi42NycKK2RkYWJzMDYzIGFicyAnLTU2MjY3RS0xJyAgIC0+ICc1NjI2LjcnCitkZGFiczA2NSBhYnMgJy01NjI2N0UtMCcgICAtPiAnNTYyNjcnCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdworCistLSBsb25nIG9wZXJhbmQgdGVzdHMKK2RkYWJzMzIxIGFicyAxMjM0NTY3ODkwMTIzNDU2ICAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZGFiczMyMiBhYnMgMTIzNDU2NzgwMDAgIC0+IDEyMzQ1Njc4MDAwCitkZGFiczMyMyBhYnMgMTIzNDU2NzgwMCAgIC0+IDEyMzQ1Njc4MDAKK2RkYWJzMzI0IGFicyAxMjM0NTY3ODkwICAgLT4gMTIzNDU2Nzg5MAorZGRhYnMzMjUgYWJzIDEyMzQ1Njc4OTEgICAtPiAxMjM0NTY3ODkxCitkZGFiczMyNiBhYnMgMTIzNDU2Nzg5MDEgIC0+IDEyMzQ1Njc4OTAxCitkZGFiczMyNyBhYnMgMTIzNDU2Nzg5NiAgIC0+IDEyMzQ1Njc4OTYKKworLS0gemVyb3MKK2RkYWJzMTExIGFicyAgICAgICAgICAwICAgLT4gMAorZGRhYnMxMTIgYWJzICAgICAgICAgLTAgICAtPiAwCitkZGFiczExMyBhYnMgICAgICAgMEUrNiAgIC0+IDBFKzYKK2RkYWJzMTE0IGFicyAgICAgIC0wRSs2ICAgLT4gMEUrNgorZGRhYnMxMTUgYWJzICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RkYWJzMTE2IGFicyAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitkZGFiczExNyBhYnMgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZGRhYnMxMTggYWJzICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RkYWJzMTIxIGFicyAgMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgIC0+IDI2ODI2ODI2ODI2ODI2ODIKK2RkYWJzMTIyIGFicyAgLTI2ODI2ODI2ODI2ODI2ODIgICAgICAgIC0+IDI2ODI2ODI2ODI2ODI2ODIKK2RkYWJzMTIzIGFicyAgMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgIC0+IDEzNDEzNDEzNDEzNDEzNDEKK2RkYWJzMTI0IGFicyAgLTEzNDEzNDEzNDEzNDEzNDEgICAgICAgIC0+IDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RkYWJzMTMxIGFicyAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkYWJzMTMyIGFicyAgMUUtMzgzICAgICAgICAgICAgICAgICAgIC0+IDFFLTM4MworZGRhYnMxMzMgYWJzICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRhYnMxMzQgYWJzICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4IFN1Ym5vcm1hbAorCitkZGFiczEzNSBhYnMgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAxRS0zOTggU3Vibm9ybWFsCitkZGFiczEzNiBhYnMgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGFiczEzNyBhYnMgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAxRS0zODMKK2RkYWJzMTM4IGFicyAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKKworLS0gc3BlY2lhbHMKK2RkYWJzNTIwIGFicyAnSW5mJyAgICAtPiAnSW5maW5pdHknCitkZGFiczUyMSBhYnMgJy1JbmYnICAgLT4gJ0luZmluaXR5JworZGRhYnM1MjIgYWJzICAgTmFOICAgIC0+ICBOYU4KK2RkYWJzNTIzIGFicyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWJzNTI0IGFicyAgIE5hTjIyICAtPiAgTmFOMjIKK2RkYWJzNTI1IGFicyAgc05hTjMzICAtPiAgTmFOMzMgSW52YWxpZF9vcGVyYXRpb24KK2RkYWJzNTI2IGFicyAgLU5hTjIyICAtPiAtTmFOMjIKK2RkYWJzNTI3IGFicyAtc05hTjMzICAtPiAtTmFOMzMgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworZGRhYnM5MDAgYWJzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQWRkLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQWRkLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxMmNlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRBZGQuZGVjVGVzdApAQCAtMCwwICsxLDEzMjggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRBZGQuZGVjVGVzdCAtLSBkZWNEb3VibGUgYWRkaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBhcmUgZm9yIGRlY0RvdWJsZXMgb25seTsgYWxsIGFyZ3VtZW50cyBhcmUKKy0tIHJlcHJlc2VudGFibGUgaW4gYSBkZWNEb3VibGUKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBbZmlyc3QgZ3JvdXAgYXJlICdxdWljayBjb25maWRlbmNlIGNoZWNrJ10KK2RkYWRkMDAxIGFkZCAxICAgICAgIDEgICAgICAgLT4gIDIKK2RkYWRkMDAyIGFkZCAyICAgICAgIDMgICAgICAgLT4gIDUKK2RkYWRkMDAzIGFkZCAnNS43NScgICczLjMnICAgLT4gIDkuMDUKK2RkYWRkMDA0IGFkZCAnNScgICAgICctMycgICAgLT4gIDIKK2RkYWRkMDA1IGFkZCAnLTUnICAgICctMycgICAgLT4gIC04CitkZGFkZDAwNiBhZGQgJy03JyAgICAnMi41JyAgIC0+ICAtNC41CitkZGFkZDAwNyBhZGQgJzAuNycgICAnMC4zJyAgIC0+ICAxLjAKK2RkYWRkMDA4IGFkZCAnMS4yNScgICcxLjI1JyAgLT4gIDIuNTAKK2RkYWRkMDA5IGFkZCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDAwJyAtPiAnMi4yMzQ1Njc4OScKK2RkYWRkMDEwIGFkZCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMi4yMzQ1NjgwMCcKKworLS0gICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkYWRkMDExIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ2JyAgJzAuNTU1NTU1NTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDEyIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ1JyAgJzAuNTU1NTU1NTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkZGFkZDAxMyBhZGQgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTUnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTknCitkZGFkZDAxNCBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNDknICAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZGRhZGQwMTUgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjQ5OScgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDE2IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OTk5JyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAxNyBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTAwMCcgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZGRhZGQwMTggYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUwMDEnIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMDE5IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDEnICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAyMCBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTEnICAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorCitkZGFkZDAyMSBhZGQgMCAxIC0+IDEKK2RkYWRkMDIyIGFkZCAxIDEgLT4gMgorZGRhZGQwMjMgYWRkIDIgMSAtPiAzCitkZGFkZDAyNCBhZGQgMyAxIC0+IDQKK2RkYWRkMDI1IGFkZCA0IDEgLT4gNQorZGRhZGQwMjYgYWRkIDUgMSAtPiA2CitkZGFkZDAyNyBhZGQgNiAxIC0+IDcKK2RkYWRkMDI4IGFkZCA3IDEgLT4gOAorZGRhZGQwMjkgYWRkIDggMSAtPiA5CitkZGFkZDAzMCBhZGQgOSAxIC0+IDEwCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworZGRhZGQwMzEgYWRkICcwLjk5OTgnICAnMC4wMDAwJyAtPiAnMC45OTk4JworZGRhZGQwMzIgYWRkICcwLjk5OTgnICAnMC4wMDAxJyAtPiAnMC45OTk5JworZGRhZGQwMzMgYWRkICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMS4wMDAwJworZGRhZGQwMzQgYWRkICcwLjk5OTgnICAnMC4wMDAzJyAtPiAnMS4wMDAxJworCitkZGFkZDAzNSBhZGQgJzcwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAzNiBhZGQgJzcwMCcgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQwMzcgYWRkICc3MDAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAzOCBhZGQgJzcwMDAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDAzOSBhZGQgJzcwMDAwMCcgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwN0UrMjAnIFJvdW5kZWQKKworLS0gc3ltbWV0cnk6CitkZGFkZDA0MCBhZGQgJzEwMDAwZSsxNicgICc3MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDA0MSBhZGQgJzEwMDAwZSsxNicgICc3MDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQwNDIgYWRkICcxMDAwMGUrMTYnICAnNzAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDA0NCBhZGQgJzEwMDAwZSsxNicgICc3MDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDA0NSBhZGQgJzEwMDAwZSsxNicgICc3MDAwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwN0UrMjAnIFJvdW5kZWQKKworLS0gc2FtZSwgd2l0aG91dCByb3VuZGluZworZGRhZGQwNDYgYWRkICcxMDAwMGUrOScgICc3JyAtPiAnMTAwMDAwMDAwMDAwMDcnCitkZGFkZDA0NyBhZGQgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMTAwMDAwMDAwMDAwNzAnCitkZGFkZDA0OCBhZGQgJzEwMDAwZSs5JyAgJzcwMCcgLT4gJzEwMDAwMDAwMDAwNzAwJworZGRhZGQwNDkgYWRkICcxMDAwMGUrOScgICc3MDAwJyAtPiAnMTAwMDAwMDAwMDcwMDAnCitkZGFkZDA1MCBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMTAwMDAwMDAwNzAwMDAnCitkZGFkZDA1MSBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwMCcgLT4gJzEwMDAwMDAwNzAwMDAwJworZGRhZGQwNTIgYWRkICcxMDAwMGUrOScgICc3MDAwMDAwJyAtPiAnMTAwMDAwMDcwMDAwMDAnCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK2RkYWRkMDUzIGFkZCAnMTInICc3LjAwJyAtPiAnMTkuMDAnCitkZGFkZDA1NCBhZGQgJzEuMycgJy0xLjA3JyAtPiAnMC4yMycKK2RkYWRkMDU1IGFkZCAnMS4zJyAnLTEuMzAnIC0+ICcwLjAwJworZGRhZGQwNTYgYWRkICcxLjMnICctMi4wNycgLT4gJy0wLjc3JworZGRhZGQwNTcgYWRkICcxRSsyJyAnMUUrNCcgLT4gJzEuMDFFKzQnCisKKy0tIGxlYWRpbmcgemVybyBwcmVzZXJ2YXRpb24KK2RkYWRkMDYxIGFkZCAxICcwLjAwMDEnIC0+ICcxLjAwMDEnCitkZGFkZDA2MiBhZGQgMSAnMC4wMDAwMScgLT4gJzEuMDAwMDEnCitkZGFkZDA2MyBhZGQgMSAnMC4wMDAwMDEnIC0+ICcxLjAwMDAwMScKK2RkYWRkMDY0IGFkZCAxICcwLjAwMDAwMDEnIC0+ICcxLjAwMDAwMDEnCitkZGFkZDA2NSBhZGQgMSAnMC4wMDAwMDAwMScgLT4gJzEuMDAwMDAwMDEnCisKKy0tIHNvbWUgZnVubnkgemVyb3MgW2luIGNhc2Ugb2YgYmFkIHNpZ251bV0KK2RkYWRkMDcwIGFkZCAxICAwICAgIC0+IDEKK2RkYWRkMDcxIGFkZCAxIDAuICAgIC0+IDEKK2RkYWRkMDcyIGFkZCAxICAuMCAgIC0+IDEuMAorZGRhZGQwNzMgYWRkIDEgMC4wICAgLT4gMS4wCitkZGFkZDA3NCBhZGQgMSAwLjAwICAtPiAxLjAwCitkZGFkZDA3NSBhZGQgIDAgIDEgICAtPiAxCitkZGFkZDA3NiBhZGQgMC4gIDEgICAtPiAxCitkZGFkZDA3NyBhZGQgIC4wIDEgICAtPiAxLjAKK2RkYWRkMDc4IGFkZCAwLjAgMSAgIC0+IDEuMAorZGRhZGQwNzkgYWRkIDAuMDAgMSAgLT4gMS4wMAorCistLSBzb21lIGNhcnJpZXMKK2RkYWRkMDgwIGFkZCA5OTk5OTk5OTggMSAgLT4gOTk5OTk5OTk5CitkZGFkZDA4MSBhZGQgOTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAKK2RkYWRkMDgyIGFkZCAgOTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwCitkZGFkZDA4MyBhZGQgICA5OTk5OTk5IDEgIC0+IDEwMDAwMDAwCitkZGFkZDA4NCBhZGQgICAgOTk5OTk5IDEgIC0+IDEwMDAwMDAKK2RkYWRkMDg1IGFkZCAgICAgOTk5OTkgMSAgLT4gMTAwMDAwCitkZGFkZDA4NiBhZGQgICAgICA5OTk5IDEgIC0+IDEwMDAwCitkZGFkZDA4NyBhZGQgICAgICAgOTk5IDEgIC0+IDEwMDAKK2RkYWRkMDg4IGFkZCAgICAgICAgOTkgMSAgLT4gMTAwCitkZGFkZDA4OSBhZGQgICAgICAgICA5IDEgIC0+IDEwCisKKworLS0gbW9yZSBMSFMgc3dhcHMKK2RkYWRkMDkwIGFkZCAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2RkYWRkMDkxIGFkZCAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3JworZGRhZGQwOTIgYWRkICctNTYyNjdFLTUnICAgIDAgLT4gICctMC41NjI2NycKK2RkYWRkMDkzIGFkZCAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2RkYWRkMDk0IGFkZCAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK2RkYWRkMDk1IGFkZCAnLTU2MjY3RS0yJyAgICAwIC0+ICAnLTU2Mi42NycKK2RkYWRkMDk2IGFkZCAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2RkYWRkMDk3IGFkZCAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3JworZGRhZGQwOTggYWRkICctNUUtMTAnICAgICAgIDAgLT4gICctNUUtMTAnCitkZGFkZDA5OSBhZGQgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworZGRhZGQxMDAgYWRkICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCitkZGFkZDEwMSBhZGQgJy01RS01JyAgICAgICAgMCAtPiAgJy0wLjAwMDA1JworZGRhZGQxMDIgYWRkICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworZGRhZGQxMDMgYWRkICctNUUtMScgICAgICAgIDAgLT4gICctMC41JworZGRhZGQxMDQgYWRkICctNUUwJyAgICAgICAgIDAgLT4gICctNScKK2RkYWRkMTA1IGFkZCAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworZGRhZGQxMDYgYWRkICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworZGRhZGQxMDcgYWRkICctNUUxNScgICAgICAgIDAgLT4gICctNTAwMDAwMDAwMDAwMDAwMCcKK2RkYWRkMTA4IGFkZCAnLTVFMTYnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNicgIFJvdW5kZWQKK2RkYWRkMTA5IGFkZCAnLTVFMTcnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNycgIFJvdW5kZWQKK2RkYWRkMTEwIGFkZCAnLTVFMTgnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxOCcgIFJvdW5kZWQKK2RkYWRkMTExIGFkZCAnLTVFMTAwJyAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxMDAnIFJvdW5kZWQKKworLS0gbW9yZSBSSFMgc3dhcHMKK2RkYWRkMTEzIGFkZCAwICAnLTU2MjY3RS0xMCcgLT4gICctMC4wMDAwMDU2MjY3JworZGRhZGQxMTQgYWRkIDAgICctNTYyNjdFLTYnICAtPiAgJy0wLjA1NjI2NycKK2RkYWRkMTE2IGFkZCAwICAnLTU2MjY3RS01JyAgLT4gICctMC41NjI2NycKK2RkYWRkMTE3IGFkZCAwICAnLTU2MjY3RS00JyAgLT4gICctNS42MjY3JworZGRhZGQxMTkgYWRkIDAgICctNTYyNjdFLTMnICAtPiAgJy01Ni4yNjcnCitkZGFkZDEyMCBhZGQgMCAgJy01NjI2N0UtMicgIC0+ICAnLTU2Mi42NycKK2RkYWRkMTIxIGFkZCAwICAnLTU2MjY3RS0xJyAgLT4gICctNTYyNi43JworZGRhZGQxMjIgYWRkIDAgICctNTYyNjdFLTAnICAtPiAgJy01NjI2NycKK2RkYWRkMTIzIGFkZCAwICAnLTVFLTEwJyAgICAgLT4gICctNUUtMTAnCitkZGFkZDEyNCBhZGQgMCAgJy01RS03JyAgICAgIC0+ICAnLTVFLTcnCitkZGFkZDEyNSBhZGQgMCAgJy01RS02JyAgICAgIC0+ICAnLTAuMDAwMDA1JworZGRhZGQxMjYgYWRkIDAgICctNUUtNScgICAgICAtPiAgJy0wLjAwMDA1JworZGRhZGQxMjcgYWRkIDAgICctNUUtNCcgICAgICAtPiAgJy0wLjAwMDUnCitkZGFkZDEyOCBhZGQgMCAgJy01RS0xJyAgICAgIC0+ICAnLTAuNScKK2RkYWRkMTI5IGFkZCAwICAnLTVFMCcgICAgICAgLT4gICctNScKK2RkYWRkMTMwIGFkZCAwICAnLTVFMScgICAgICAgLT4gICctNTAnCitkZGFkZDEzMSBhZGQgMCAgJy01RTUnICAgICAgIC0+ICAnLTUwMDAwMCcKK2RkYWRkMTMyIGFkZCAwICAnLTVFMTUnICAgICAgLT4gICctNTAwMDAwMDAwMDAwMDAwMCcKK2RkYWRkMTMzIGFkZCAwICAnLTVFMTYnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE2JyAgIFJvdW5kZWQKK2RkYWRkMTM0IGFkZCAwICAnLTVFMTcnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE3JyAgIFJvdW5kZWQKK2RkYWRkMTM1IGFkZCAwICAnLTVFMTgnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgIFJvdW5kZWQKK2RkYWRkMTM2IGFkZCAwICAnLTVFMTAwJyAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzEwMCcgIFJvdW5kZWQKKworLS0gcmVsYXRlZAorZGRhZGQxMzcgYWRkICAxICAnMEUtMTknICAgICAgLT4gICcxLjAwMDAwMDAwMDAwMDAwMCcgIFJvdW5kZWQKK2RkYWRkMTM4IGFkZCAtMSAgJzBFLTE5JyAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkZGFkZDEzOSBhZGQgJzBFLTE5JyAxICAgICAgICAtPiAgJzEuMDAwMDAwMDAwMDAwMDAwJyAgUm91bmRlZAorZGRhZGQxNDAgYWRkICcwRS0xOScgLTEgICAgICAgLT4gICctMS4wMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RkYWRkMTQxIGFkZCAxRSsxMSAgIDAuMDAwMCAgIC0+ICAnMTAwMDAwMDAwMDAwLjAwMDAnCitkZGFkZDE0MiBhZGQgMUUrMTEgICAwLjAwMDAwICAtPiAgJzEwMDAwMDAwMDAwMC4wMDAwJyAgUm91bmRlZAorZGRhZGQxNDMgYWRkIDAuMDAwICAgMUUrMTIgICAgLT4gICcxMDAwMDAwMDAwMDAwLjAwMCcKK2RkYWRkMTQ0IGFkZCAwLjAwMDAgIDFFKzEyICAgIC0+ICAnMTAwMDAwMDAwMDAwMC4wMDAnICBSb3VuZGVkCisKKy0tIFtzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHNdCitkZGFkZDE0NiBhZGQgJzAwLjAnICAwICAgICAgIC0+ICAnMC4wJworZGRhZGQxNDcgYWRkICcwLjAwJyAgMCAgICAgICAtPiAgJzAuMDAnCitkZGFkZDE0OCBhZGQgIDAgICAgICAnMC4wMCcgIC0+ICAnMC4wMCcKK2RkYWRkMTQ5IGFkZCAgMCAgICAgICcwMC4wJyAgLT4gICcwLjAnCitkZGFkZDE1MCBhZGQgJzAwLjAnICAnMC4wMCcgIC0+ICAnMC4wMCcKK2RkYWRkMTUxIGFkZCAnMC4wMCcgICcwMC4wJyAgLT4gICcwLjAwJworZGRhZGQxNTIgYWRkICczJyAgICAgJy4zJyAgICAtPiAgJzMuMycKK2RkYWRkMTUzIGFkZCAnMy4nICAgICcuMycgICAgLT4gICczLjMnCitkZGFkZDE1NCBhZGQgJzMuMCcgICAnLjMnICAgIC0+ICAnMy4zJworZGRhZGQxNTUgYWRkICczLjAwJyAgJy4zJyAgICAtPiAgJzMuMzAnCitkZGFkZDE1NiBhZGQgJzMnICAgICAnMycgICAgIC0+ICAnNicKK2RkYWRkMTU3IGFkZCAnMycgICAgICcrMycgICAgLT4gICc2JworZGRhZGQxNTggYWRkICczJyAgICAgJy0zJyAgICAtPiAgJzAnCitkZGFkZDE1OSBhZGQgJzAuMycgICAnLTAuMycgIC0+ICAnMC4wJworZGRhZGQxNjAgYWRkICcwLjAzJyAgJy0wLjAzJyAtPiAgJzAuMDAnCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitkZGFkZDE2MSBhZGQgJzFFKzEyJyAnLTEnICAgIC0+ICc5OTk5OTk5OTk5OTknCitkZGFkZDE2MiBhZGQgJzFFKzEyJyAgJzEuMTEnIC0+ICcxMDAwMDAwMDAwMDAxLjExJworZGRhZGQxNjMgYWRkICcxLjExJyAgJzFFKzEyJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2RkYWRkMTY0IGFkZCAnLTEnICAgICcxRSsxMicgLT4gJzk5OTk5OTk5OTk5OScKK2RkYWRkMTY1IGFkZCAnN0UrMTInICctMScgICAgLT4gJzY5OTk5OTk5OTk5OTknCitkZGFkZDE2NiBhZGQgJzdFKzEyJyAgJzEuMTEnIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZGRhZGQxNjcgYWRkICcxLjExJyAgJzdFKzEyJyAtPiAnNzAwMDAwMDAwMDAwMS4xMScKK2RkYWRkMTY4IGFkZCAnLTEnICAgICc3RSsxMicgLT4gJzY5OTk5OTk5OTk5OTknCisKK3JvdW5kaW5nOiBoYWxmX3VwCistLSAgICAgICAgICAgMS4yMzQ1Njc4OTAxMjM0NTYgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMSAyMzQ1Njc4OTAxMjM0NTYKK2RkYWRkMTcwIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTY3JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZGRhZGQxNzEgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjYnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE3MiBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2NScgLT4gJzUuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTczIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTY0JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQxNzQgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE3NSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1MicgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTc2IGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUxJyAtPiAnNC45OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZGRhZGQxNzcgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OScgUm91bmRlZAorZGRhZGQxNzggYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDUnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE3OSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0NCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTgwIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQzJyAtPiAnNC45OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZGRhZGQxODEgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDInIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDE4MiBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0MScgLT4gJzQuOTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMTgzIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQwJyAtPiAnNC45OTk5OTk5OTk5OTk5OTgnIFJvdW5kZWQKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2RkYWRkMjAwIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScKK2RkYWRkMjAxIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIwMiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMDMgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjA0IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIwNSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMDYgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjA3IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIwOCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMDkgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjEwIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIxMSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMTIgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjEzIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIxNCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMTUgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjE2IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcKK2RkYWRkMjE3IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIxOCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMTkgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZGRhZGQyMjAgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JworZGRhZGQyMjEgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjIyIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIyMyBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMjQgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjI1IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIyNiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMjcgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjI4IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIyOSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMzAgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjMxIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIzMiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMzMgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjM0IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIzNSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyMzYgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJworZGRhZGQyMzcgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjM4IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDIzOSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK2RkYWRkMjQwIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI0MSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNDIgYWRkICcxMjM0NTYwMTIzNDU2Nzg4JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2RkYWRkMjUwIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScKK2RkYWRkMjUxIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI1MiBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNTMgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjU0IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI1NSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNTYgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjU3IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI1OCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNTkgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjYwIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI2MSBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNjIgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjYzIGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI2NCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNjUgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMjY2IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcKK2RkYWRkMjY3IGFkZCAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDI2OCBhZGQgJzEyMzQ1NjAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQyNjkgYWRkICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gMSBpbiBsYXN0IHBsYWNlIHRlc3RzCityb3VuZGluZzogaGFsZl91cAorZGRhZGQzMDEgYWRkICAtMSAgIDEgICAgICAtPiAgIDAKK2RkYWRkMzAyIGFkZCAgIDAgICAxICAgICAgLT4gICAxCitkZGFkZDMwMyBhZGQgICAxICAgMSAgICAgIC0+ICAgMgorZGRhZGQzMDQgYWRkICAxMiAgIDEgICAgICAtPiAgMTMKK2RkYWRkMzA1IGFkZCAgOTggICAxICAgICAgLT4gIDk5CitkZGFkZDMwNiBhZGQgIDk5ICAgMSAgICAgIC0+IDEwMAorZGRhZGQzMDcgYWRkIDEwMCAgIDEgICAgICAtPiAxMDEKK2RkYWRkMzA4IGFkZCAxMDEgICAxICAgICAgLT4gMTAyCitkZGFkZDMwOSBhZGQgIC0xICAtMSAgICAgIC0+ICAtMgorZGRhZGQzMTAgYWRkICAgMCAgLTEgICAgICAtPiAgLTEKK2RkYWRkMzExIGFkZCAgIDEgIC0xICAgICAgLT4gICAwCitkZGFkZDMxMiBhZGQgIDEyICAtMSAgICAgIC0+ICAxMQorZGRhZGQzMTMgYWRkICA5OCAgLTEgICAgICAtPiAgOTcKK2RkYWRkMzE0IGFkZCAgOTkgIC0xICAgICAgLT4gIDk4CitkZGFkZDMxNSBhZGQgMTAwICAtMSAgICAgIC0+ICA5OQorZGRhZGQzMTYgYWRkIDEwMSAgLTEgICAgICAtPiAxMDAKKworZGRhZGQzMjEgYWRkIC0wLjAxICAwLjAxICAgIC0+ICAwLjAwCitkZGFkZDMyMiBhZGQgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2RkYWRkMzIzIGFkZCAgMC4wMSAgMC4wMSAgICAtPiAgMC4wMgorZGRhZGQzMjQgYWRkICAwLjEyICAwLjAxICAgIC0+ICAwLjEzCitkZGFkZDMyNSBhZGQgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2RkYWRkMzI2IGFkZCAgMC45OSAgMC4wMSAgICAtPiAgMS4wMAorZGRhZGQzMjcgYWRkICAxLjAwICAwLjAxICAgIC0+ICAxLjAxCitkZGFkZDMyOCBhZGQgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2RkYWRkMzI5IGFkZCAtMC4wMSAtMC4wMSAgICAtPiAtMC4wMgorZGRhZGQzMzAgYWRkICAwLjAwIC0wLjAxICAgIC0+IC0wLjAxCitkZGFkZDMzMSBhZGQgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2RkYWRkMzMyIGFkZCAgMC4xMiAtMC4wMSAgICAtPiAgMC4xMQorZGRhZGQzMzMgYWRkICAwLjk4IC0wLjAxICAgIC0+ICAwLjk3CitkZGFkZDMzNCBhZGQgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2RkYWRkMzM1IGFkZCAgMS4wMCAtMC4wMSAgICAtPiAgMC45OQorZGRhZGQzMzYgYWRkICAxLjAxIC0wLjAxICAgIC0+ICAxLjAwCisKKy0tIHNvbWUgbW9yZSBjYXNlcyB3aGVyZSBhZGRpbmcgMCBhZmZlY3RzIHRoZSBjb2VmZmljaWVudAorZGRhZGQzNDAgYWRkIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2RkYWRkMzQxIGFkZCAxRSsxNSAgIDAgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMAorZGRhZGQzNDIgYWRkIDFFKzE2ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgUm91bmRlZAorZGRhZGQzNDMgYWRkIDFFKzIwICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsyMCAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorZGRhZGQzNDQgYWRkIDFFKzMgICAgMSAgICAtPiAgICAgICAgIDEwMDEKK2RkYWRkMzQ1IGFkZCAxRSsxNSAgIDEgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMQorZGRhZGQzNDYgYWRkIDFFKzE2ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDM0NyBhZGQgMUUrMjAgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzIwICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkMzQ4IGFkZCAxRSszICAgIDcgICAgLT4gICAgICAgICAxMDA3CitkZGFkZDM0OSBhZGQgMUUrMTUgICA3ICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDcKK2RkYWRkMzUwIGFkZCAxRSsxNiAgIDcgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMUUrMTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQzNTEgYWRkIDFFKzIwICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsyMCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCityb3VuZGluZzogICAgaGFsZl91cAorZGRhZGQzNjAgIGFkZCAwRSs1MCAxMDAwMEUrMSAgLT4gMS4wMDAwRSs1CitkZGFkZDM2MSAgYWRkIDBFLTUwIDEwMDAwRSsxICAtPiAxMDAwMDAuMDAwMDAwMDAwMCBSb3VuZGVkCitkZGFkZDM2MiAgYWRkIDEwMDAwRSsxIDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMCBSb3VuZGVkCitkZGFkZDM2MyAgYWRkIDEwMDAwRSsxIDEwMDAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAgUm91bmRlZCBJbmV4YWN0CitkZGFkZDM2NCAgYWRkIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gMEUrMzY5CisKKy0tIGEgY3VyaW9zaXR5IGZyb20gSlNSIDEzIHRlc3RpbmcKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KK2RkYWRkMzcwIGFkZCAgOTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxMDAwMDAwMDAwMDAwODE0CitkZGFkZDM3MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwODFFKzE2IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RkYWRkMzcyIGFkZCAgOTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxMDAwMDAwMDAwMDAwODE0CitkZGFkZDM3MyBhZGQgOTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwODFFKzE2IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZGRhZGQzNzQgYWRkICA5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDA4MTQKK2RkYWRkMzc1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDA4MUUrMTYgUm91bmRlZCBJbmV4YWN0CisKKy0tIG9wZXJhbmRzIGZvbGRlZAorZGRhZGQzODAgYWRkICAgMUUrMzg0ICAxRSszODQgIC0+ICAyLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICBDbGFtcGVkCitkZGFkZDM4MSBhZGQgICAxRSszODAgIDFFKzM4MCAgLT4gIDIuMDAwMDAwMDAwMDBFKzM4MCAgICAgIENsYW1wZWQKK2RkYWRkMzgyIGFkZCAgIDFFKzM3NiAgMUUrMzc2ICAtPiAgMi4wMDAwMDAwRSszNzYgICAgICAgICAgQ2xhbXBlZAorZGRhZGQzODMgYWRkICAgMUUrMzcyICAxRSszNzIgIC0+ICAyLjAwMEUrMzcyICAgICAgICAgICAgICBDbGFtcGVkCitkZGFkZDM4NCBhZGQgICAxRSszNzAgIDFFKzM3MCAgLT4gIDIuMEUrMzcwICAgICAgICAgICAgICAgIENsYW1wZWQKK2RkYWRkMzg1IGFkZCAgIDFFKzM2OSAgMUUrMzY5ICAtPiAgMkUrMzY5CitkZGFkZDM4NiBhZGQgICAxRSszNjggIDFFKzM2OCAgLT4gIDJFKzM2OAorCistLSB1bHAgcmVwbGFjZW1lbnQgdGVzdHMKK2RkYWRkNDAwIGFkZCAgIDEgICA3N2UtMTQgICAgICAtPiAgMS4wMDAwMDAwMDAwMDA3NworZGRhZGQ0MDEgYWRkICAgMSAgIDc3ZS0xNSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDA3NworZGRhZGQ0MDIgYWRkICAgMSAgIDc3ZS0xNiAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDAzIGFkZCAgIDEgICA3N2UtMTcgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQwNCBhZGQgICAxICAgNzdlLTE4ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MDUgYWRkICAgMSAgIDc3ZS0xOSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDA2IGFkZCAgIDEgICA3N2UtMjk5ICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkNDEwIGFkZCAgMTAgICA3N2UtMTQgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwNzcKK2RkYWRkNDExIGFkZCAgMTAgICA3N2UtMTUgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGFkZDQxMiBhZGQgIDEwICAgNzdlLTE2ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MTMgYWRkICAxMCAgIDc3ZS0xNyAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDE0IGFkZCAgMTAgICA3N2UtMTggICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQxNSBhZGQgIDEwICAgNzdlLTE5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MTYgYWRkICAxMCAgIDc3ZS0yOTkgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ0MjAgYWRkICA3N2UtMTQgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDc3CitkZGFkZDQyMSBhZGQgIDc3ZS0xNSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDc3CitkZGFkZDQyMiBhZGQgIDc3ZS0xNiAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MjMgYWRkICA3N2UtMTcgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDI0IGFkZCAgNzdlLTE4ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQyNSBhZGQgIDc3ZS0xOSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MjYgYWRkICA3N2UtMjk5ICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ0MzAgYWRkICA3N2UtMTQgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDA3NworZGRhZGQ0MzEgYWRkICA3N2UtMTUgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDMyIGFkZCAgNzdlLTE2ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQzMyBhZGQgIDc3ZS0xNyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ0MzQgYWRkICA3N2UtMTggICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNDM1IGFkZCAgNzdlLTE5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDQzNiBhZGQgIDc3ZS0yOTkgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBmYXN0cGF0aCBib3VuZGFyeSAobW9yZSBpbiBkcWFkZCkKKy0tICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRhZGQ1MzkgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzMzMzMzMzMzMzMzMzMzMzMnIC0+ICc3Nzc3Nzc3Nzc3Nzc3Nzc3JworZGRhZGQ1NDAgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIC0+ICc4ODg4ODg4ODg4ODg4ODg4JworZGRhZGQ1NDEgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTUnIC0+ICc5OTk5OTk5OTk5OTk5OTk5JworZGRhZGQ1NDIgYWRkICczMzMzMzMzMzMzMzMzMzMzJyAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIC0+ICc3Nzc3Nzc3Nzc3Nzc3Nzc3JworZGRhZGQ1NDMgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIC0+ICc4ODg4ODg4ODg4ODg4ODg4JworZGRhZGQ1NDQgYWRkICc1NTU1NTU1NTU1NTU1NTU1JyAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIC0+ICc5OTk5OTk5OTk5OTk5OTk5JworZGRhZGQ1NDUgYWRkICczMDAwMDA0MDAwMDAwMDAwJyAgJzMwMDAwMDAwMDAwMDAwNDAnIC0+ICc2MDAwMDA0MDAwMDAwMDQwJworZGRhZGQ1NDYgYWRkICczMDAwMDAwNDAwMDAwMDAwJyAgJzQwMDAwMDAwMDAwMDA0MDAnIC0+ICc3MDAwMDAwNDAwMDAwNDAwJworZGRhZGQ1NDcgYWRkICczMDAwMDAwMDQwMDAwMDAwJyAgJzUwMDAwMDAwMDAwMDQwMDAnIC0+ICc4MDAwMDAwMDQwMDA0MDAwJworZGRhZGQ1NDggYWRkICc0MDAwMDAwMDA0MDAwMDAwJyAgJzMwMDAwMDAwMDAwNDAwMDAnIC0+ICc3MDAwMDAwMDA0MDQwMDAwJworZGRhZGQ1NDkgYWRkICc0MDAwMDAwMDAwNDAwMDAwJyAgJzQwMDAwMDAwMDA0MDAwMDAnIC0+ICc4MDAwMDAwMDAwODAwMDAwJworZGRhZGQ1NTAgYWRkICc0MDAwMDAwMDAwMDQwMDAwJyAgJzUwMDAwMDAwMDQwMDAwMDAnIC0+ICc5MDAwMDAwMDA0MDQwMDAwJworZGRhZGQ1NTEgYWRkICc1MDAwMDAwMDAwMDA0MDAwJyAgJzMwMDAwMDAwNDAwMDAwMDAnIC0+ICc4MDAwMDAwMDQwMDA0MDAwJworZGRhZGQ1NTIgYWRkICc1MDAwMDAwMDAwMDAwNDAwJyAgJzQwMDAwMDA0MDAwMDAwMDAnIC0+ICc5MDAwMDAwNDAwMDAwNDAwJworZGRhZGQ1NTMgYWRkICc1MDAwMDAwMDAwMDAwMDQwJyAgJzUwMDAwMDQwMDAwMDAwMDAnIC0+IDEuMDAwMDAwNDAwMDAwMDA0RSsxNiBSb3VuZGVkCistLSBjaGVjayBwcm9wYWdhdGlvbgorZGRhZGQ1NTQgYWRkICc4OTk5OTk5OTk5OTk5OTk5JyAgJzAwMDAwMDAwMDAwMDAwMDEnIC0+IDkwMDAwMDAwMDAwMDAwMDAKK2RkYWRkNTU1IGFkZCAnMDAwMDAwMDAwMDAwMDAwMScgICc4OTk5OTk5OTk5OTk5OTk5JyAtPiA5MDAwMDAwMDAwMDAwMDAwCitkZGFkZDU1NiBhZGQgJzA5OTk5OTk5OTk5OTk5OTknICAnMDAwMDAwMDAwMDAwMDAwMScgLT4gMTAwMDAwMDAwMDAwMDAwMAorZGRhZGQ1NTcgYWRkICcwMDAwMDAwMDAwMDAwMDAxJyAgJzA5OTk5OTk5OTk5OTk5OTknIC0+IDEwMDAwMDAwMDAwMDAwMDAKK2RkYWRkNTU4IGFkZCAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc0NTU1NTU1NTU1NTU1NTU2JyAtPiA5MDAwMDAwMDAwMDAwMDAwCitkZGFkZDU1OSBhZGQgJzQ1NTU1NTU1NTU1NTU1NTYnICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgLT4gOTAwMDAwMDAwMDAwMDAwMAorCistLSBuZWdhdGl2ZSB1bHBzCitkZGFkZDY0NDAgYWRkICAgMSAgIC03N2UtMTQgICAgICAtPiAgMC45OTk5OTk5OTk5OTkyMworZGRhZGQ2NDQxIGFkZCAgIDEgICAtNzdlLTE1ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NDIgYWRkICAgMSAgIC03N2UtMTYgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NDMgYWRkICAgMSAgIC03N2UtMTcgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDQ0IGFkZCAgIDEgICAtNzdlLTE4ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ0NSBhZGQgICAxICAgLTc3ZS0xOSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ0NiBhZGQgICAxICAgLTc3ZS05OSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ2NDUwIGFkZCAgMTAgICAtNzdlLTE0ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NTEgYWRkICAxMCAgIC03N2UtMTUgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTIzCitkZGFkZDY0NTIgYWRkICAxMCAgIC03N2UtMTYgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDUzIGFkZCAgMTAgICAtNzdlLTE3ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ1NCBhZGQgIDEwICAgLTc3ZS0xOCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ1NSBhZGQgIDEwICAgLTc3ZS0xOSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ1NiBhZGQgIDEwICAgLTc3ZS05OSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ2NDYwIGFkZCAgLTc3ZS0xNCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5MjMKK2RkYWRkNjQ2MSBhZGQgIC03N2UtMTUgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NDYyIGFkZCAgLTc3ZS0xNiAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NDYzIGFkZCAgLTc3ZS0xNyAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ2NCBhZGQgIC03N2UtMTggICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0NjUgYWRkICAtNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0NjYgYWRkICAtNzdlLTk5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkNjQ3MCBhZGQgIC03N2UtMTQgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTkyMworZGRhZGQ2NDcxIGFkZCAgLTc3ZS0xNSAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NDcyIGFkZCAgLTc3ZS0xNiAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ3MyBhZGQgIC03N2UtMTcgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0NzQgYWRkICAtNzdlLTE4ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0NzUgYWRkICAtNzdlLTE5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0NzYgYWRkICAtNzdlLTk5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2RkYWRkNjQ4MCBhZGQgIC0xICAgIDc3ZS0xNCAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTkyMworZGRhZGQ2NDgxIGFkZCAgLTEgICAgNzdlLTE1ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NDgyIGFkZCAgLTEgICAgNzdlLTE2ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5MjMKK2RkYWRkNjQ4MyBhZGQgIC0xICAgIDc3ZS0xNyAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDg0IGFkZCAgLTEgICAgNzdlLTE4ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0ODUgYWRkICAtMSAgICA3N2UtMTkgICAgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDg2IGFkZCAgLTEgICAgNzdlLTk5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ2NDkwIGFkZCAtMTAgICAgNzdlLTE0ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTkyMworZGRhZGQ2NDkxIGFkZCAtMTAgICAgNzdlLTE1ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5MjMKK2RkYWRkNjQ5MiBhZGQgLTEwICAgIDc3ZS0xNiAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDkzIGFkZCAtMTAgICAgNzdlLTE3ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY0OTQgYWRkIC0xMCAgICA3N2UtMTggICAgICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NDk1IGFkZCAtMTAgICAgNzdlLTE5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjQ5NiBhZGQgLTEwICAgIDc3ZS05OSAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkNjUwMCBhZGQgICA3N2UtMTQgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTkyMworZGRhZGQ2NTAxIGFkZCAgIDc3ZS0xNSAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTkyMworZGRhZGQ2NTAyIGFkZCAgIDc3ZS0xNiAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5MjMKK2RkYWRkNjUwMyBhZGQgICA3N2UtMTcgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTA0IGFkZCAgIDc3ZS0xOCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1MDUgYWRkICAgNzdlLTE5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTA2IGFkZCAgIDc3ZS05OSAgICAgIC0xICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ2NTEwIGFkZCAgIDc3ZS0xNCAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTkyMworZGRhZGQ2NTExIGFkZCAgIDc3ZS0xNSAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5MjMKK2RkYWRkNjUxMiBhZGQgICA3N2UtMTYgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTEzIGFkZCAgIDc3ZS0xNyAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1MTQgYWRkICAgNzdlLTE4ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTE1IGFkZCAgIDc3ZS0xOSAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjUxNiBhZGQgICA3N2UtOTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGFuZCBzb21lIG1vcmUgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZGRhZGQ2NTQwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScKK2RkYWRkNjU0MSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTQyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NDMgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU0NCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTQ1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NDYgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU0NyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTQ4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NDkgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU1MCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTUxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NTIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU1MyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTU0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NTUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU1NiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitkZGFkZDY1NTcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU1OCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTU5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkYWRkNjU2MCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCitkZGFkZDY1NjEgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU2MiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTYzIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NjQgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU2NSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTY2IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NjcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU2OCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTY5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NzAgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU3MSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTcyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NzMgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU3NCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ2NTc1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NzYgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJworZGRhZGQ2NTc3IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDY1NzggYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNjU3OSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZGRhZGQ3NTQwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NDEgYWRkICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU0MiBhZGQgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZGRhZGQ3NTUwIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScKK2RkYWRkNzU1MSBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTUyIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NTMgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU1NCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTU1IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NTYgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU1NyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTU4IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NTkgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU2MCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTYxIGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NjIgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU2MyBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTY0IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1NjUgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU2NiBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitkZGFkZDc1NjcgYWRkICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzU2OCBhZGQgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTY5IGFkZCAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIHZlcmlmeSBhIHF1ZXJ5Cityb3VuZGluZzogICAgIGRvd24KK2RkYWRkNzY2MSBhZGQgMWUtMzk4IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzY2MiBhZGQgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBSb3VuZGVkCitkZGFkZDc2NjMgYWRkIDFlLTM4OCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc2NjQgYWRkICAgICAgMCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl9ldmVuCisKK2RkYWRkNzcwMSBhZGQgNS4wMCAxLjAwRS0zIC0+IDUuMDAxMDAKK2RkYWRkNzcwMiBhZGQgMDAuMDAgMC4wMDAgIC0+IDAuMDAwCitkZGFkZDc3MDMgYWRkIDAwLjAwIDBFLTMgICAtPiAwLjAwMAorZGRhZGQ3NzA0IGFkZCAwRS0zICAwMC4wMCAgLT4gMC4wMDAKKworZGRhZGQ3NzEwIGFkZCAwRSszICAwMC4wMCAgLT4gMC4wMAorZGRhZGQ3NzExIGFkZCAwRSszICAwMC4wICAgLT4gMC4wCitkZGFkZDc3MTIgYWRkIDBFKzMgIDAwLiAgICAtPiAwCitkZGFkZDc3MTMgYWRkIDBFKzMgIDAwLkUrMSAtPiAwRSsxCitkZGFkZDc3MTQgYWRkIDBFKzMgIDAwLkUrMiAtPiAwRSsyCitkZGFkZDc3MTUgYWRkIDBFKzMgIDAwLkUrMyAtPiAwRSszCitkZGFkZDc3MTYgYWRkIDBFKzMgIDAwLkUrNCAtPiAwRSszCitkZGFkZDc3MTcgYWRkIDBFKzMgIDAwLkUrNSAtPiAwRSszCitkZGFkZDc3MTggYWRkIDBFKzMgIC0wMC4wICAgLT4gMC4wCitkZGFkZDc3MTkgYWRkIDBFKzMgIC0wMC4gICAgLT4gMAorZGRhZGQ3NzMxIGFkZCAwRSszICAtMDAuRSsxIC0+IDBFKzEKKworZGRhZGQ3NzIwIGFkZCAwMC4wMCAgMEUrMyAgLT4gMC4wMAorZGRhZGQ3NzIxIGFkZCAwMC4wICAgMEUrMyAgLT4gMC4wCitkZGFkZDc3MjIgYWRkIDAwLiAgICAwRSszICAtPiAwCitkZGFkZDc3MjMgYWRkIDAwLkUrMSAwRSszICAtPiAwRSsxCitkZGFkZDc3MjQgYWRkIDAwLkUrMiAwRSszICAtPiAwRSsyCitkZGFkZDc3MjUgYWRkIDAwLkUrMyAwRSszICAtPiAwRSszCitkZGFkZDc3MjYgYWRkIDAwLkUrNCAwRSszICAtPiAwRSszCitkZGFkZDc3MjcgYWRkIDAwLkUrNSAwRSszICAtPiAwRSszCitkZGFkZDc3MjggYWRkIC0wMC4wMCAwRSszICAtPiAwLjAwCitkZGFkZDc3MjkgYWRkIC0wMC4wICAwRSszICAtPiAwLjAKK2RkYWRkNzczMCBhZGQgLTAwLiAgIDBFKzMgIC0+IDAKKworZGRhZGQ3NzMyIGFkZCAgMCAgICAgMCAgICAgLT4gIDAKK2RkYWRkNzczMyBhZGQgIDAgICAgLTAgICAgIC0+ICAwCitkZGFkZDc3MzQgYWRkIC0wICAgICAwICAgICAtPiAgMAorZGRhZGQ3NzM1IGFkZCAtMCAgICAtMCAgICAgLT4gLTAgICAgIC0tIElFRUUgODU0IHNwZWNpYWwgY2FzZQorCitkZGFkZDc3MzYgYWRkICAxICAgIC0xICAgICAtPiAgMAorZGRhZGQ3NzM3IGFkZCAtMSAgICAtMSAgICAgLT4gLTIKK2RkYWRkNzczOCBhZGQgIDEgICAgIDEgICAgIC0+ICAyCitkZGFkZDc3MzkgYWRkIC0xICAgICAxICAgICAtPiAgMAorCitkZGFkZDc3NDEgYWRkICAwICAgIC0xICAgICAtPiAtMQorZGRhZGQ3NzQyIGFkZCAtMCAgICAtMSAgICAgLT4gLTEKK2RkYWRkNzc0MyBhZGQgIDAgICAgIDEgICAgIC0+ICAxCitkZGFkZDc3NDQgYWRkIC0wICAgICAxICAgICAtPiAgMQorZGRhZGQ3NzQ1IGFkZCAtMSAgICAgMCAgICAgLT4gLTEKK2RkYWRkNzc0NiBhZGQgLTEgICAgLTAgICAgIC0+IC0xCitkZGFkZDc3NDcgYWRkICAxICAgICAwICAgICAtPiAgMQorZGRhZGQ3NzQ4IGFkZCAgMSAgICAtMCAgICAgLT4gIDEKKworZGRhZGQ3NzUxIGFkZCAgMC4wICAtMSAgICAgLT4gLTEuMAorZGRhZGQ3NzUyIGFkZCAtMC4wICAtMSAgICAgLT4gLTEuMAorZGRhZGQ3NzUzIGFkZCAgMC4wICAgMSAgICAgLT4gIDEuMAorZGRhZGQ3NzU0IGFkZCAtMC4wICAgMSAgICAgLT4gIDEuMAorZGRhZGQ3NzU1IGFkZCAtMS4wICAgMCAgICAgLT4gLTEuMAorZGRhZGQ3NzU2IGFkZCAtMS4wICAtMCAgICAgLT4gLTEuMAorZGRhZGQ3NzU3IGFkZCAgMS4wICAgMCAgICAgLT4gIDEuMAorZGRhZGQ3NzU4IGFkZCAgMS4wICAtMCAgICAgLT4gIDEuMAorCitkZGFkZDc3NjEgYWRkICAwICAgIC0xLjAgICAtPiAtMS4wCitkZGFkZDc3NjIgYWRkIC0wICAgIC0xLjAgICAtPiAtMS4wCitkZGFkZDc3NjMgYWRkICAwICAgICAxLjAgICAtPiAgMS4wCitkZGFkZDc3NjQgYWRkIC0wICAgICAxLjAgICAtPiAgMS4wCitkZGFkZDc3NjUgYWRkIC0xICAgICAwLjAgICAtPiAtMS4wCitkZGFkZDc3NjYgYWRkIC0xICAgIC0wLjAgICAtPiAtMS4wCitkZGFkZDc3NjcgYWRkICAxICAgICAwLjAgICAtPiAgMS4wCitkZGFkZDc3NjggYWRkICAxICAgIC0wLjAgICAtPiAgMS4wCisKK2RkYWRkNzc3MSBhZGQgIDAuMCAgLTEuMCAgIC0+IC0xLjAKK2RkYWRkNzc3MiBhZGQgLTAuMCAgLTEuMCAgIC0+IC0xLjAKK2RkYWRkNzc3MyBhZGQgIDAuMCAgIDEuMCAgIC0+ICAxLjAKK2RkYWRkNzc3NCBhZGQgLTAuMCAgIDEuMCAgIC0+ICAxLjAKK2RkYWRkNzc3NSBhZGQgLTEuMCAgIDAuMCAgIC0+IC0xLjAKK2RkYWRkNzc3NiBhZGQgLTEuMCAgLTAuMCAgIC0+IC0xLjAKK2RkYWRkNzc3NyBhZGQgIDEuMCAgIDAuMCAgIC0+ICAxLjAKK2RkYWRkNzc3OCBhZGQgIDEuMCAgLTAuMCAgIC0+ICAxLjAKKworLS0gU3BlY2lhbHMKK2RkYWRkNzc4MCBhZGQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRhZGQ3NzgxIGFkZCAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkZGFkZDc3ODIgYWRkIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc4MyBhZGQgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZGRhZGQ3Nzg0IGFkZCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkZGFkZDc3ODUgYWRkIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc4NiBhZGQgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZGRhZGQ3Nzg3IGFkZCAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkZGFkZDc3ODggYWRkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc4OSBhZGQgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRhZGQ3NzkwIGFkZCAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZGFkZDc3OTEgYWRkICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkYWRkNzc5MiBhZGQgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRhZGQ3NzkzIGFkZCAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkZGFkZDc3OTQgYWRkICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkZGFkZDc4MDAgYWRkICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODAxIGFkZCAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkZGFkZDc4MDIgYWRkICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgwMyBhZGQgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODA0IGFkZCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkZGFkZDc4MDUgYWRkICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgwNiBhZGQgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODA3IGFkZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkZGFkZDc4MDggYWRkIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgwOSBhZGQgLUluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4MTAgYWRkIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgxMSBhZGQgLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODEyIGFkZCAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZGFkZDc4MTMgYWRkICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkYWRkNzgxNCBhZGQgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRhZGQ3ODE1IGFkZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkYWRkNzgyMSBhZGQgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RkYWRkNzgyMiBhZGQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RkYWRkNzgyMyBhZGQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RkYWRkNzgyNCBhZGQgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RkYWRkNzgyNSBhZGQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RkYWRkNzgyNiBhZGQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RkYWRkNzgyNyBhZGQgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RkYWRkNzgyOCBhZGQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RkYWRkNzgyOSBhZGQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzMCBhZGQgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzMSBhZGQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzMiBhZGQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzMyBhZGQgLTAgICAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzNCBhZGQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzNSBhZGQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzNiBhZGQgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RkYWRkNzgzNyBhZGQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZGRhZGQ3ODQxIGFkZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg0MiBhZGQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NDMgYWRkICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODQ0IGFkZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg0NSBhZGQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NDYgYWRkICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODQ3IGFkZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg0OCBhZGQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NDkgYWRkICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODUwIGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg1MSBhZGQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NTIgYWRkIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODUzIGFkZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg1NCBhZGQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NTUgYWRkICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODU2IGFkZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg1NyBhZGQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDc4NTggYWRkICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODU5IGFkZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRhZGQ3ODYxIGFkZCAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2RkYWRkNzg2MiBhZGQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitkZGFkZDc4NjMgYWRkICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZGRhZGQ3ODY0IGFkZCAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2RkYWRkNzg2NSBhZGQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitkZGFkZDc4NjYgYWRkIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZGRhZGQ3ODY3IGFkZCAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2RkYWRkNzg2OCBhZGQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitkZGFkZDc4NjkgYWRkICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2RkYWRkNzg3MSBhZGQgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3MiBhZGQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3MyBhZGQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3NCBhZGQgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3NSBhZGQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3NiBhZGQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3NyBhZGQgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3OCBhZGQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg3OSBhZGQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg4MCBhZGQgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg4MSBhZGQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2RkYWRkNzg4MiBhZGQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZGRhZGQ3ODgzIGFkZCAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZGRhZGQ3ODg0IGFkZCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitkZGFkZDc4ODUgYWRkICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEhlcmUgd2UgZXhwbG9yZSBuZWFyIHRoZSBib3VuZGFyeSBvZiByb3VuZGluZyBhIHN1Ym5vcm1hbCB0byBObWluCitkZGFkZDc1NzUgYWRkICAxRS0zODMgLTFFLTM5OCAtPiAgOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBTdWJub3JtYWwKK2RkYWRkNzU3NiBhZGQgLTFFLTM4MyArMUUtMzk4IC0+IC05Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorCistLSBhbmQgYW5vdGhlciBjdXJpb3VzIGNhc2UKK2RkYWRkNzU3NyBhZGQgNy4wMDAwMDAwMDAwMDBFLTM4NSAtMS4wMDAwMEUtMzkxIC0+IDYuOTk5OTk5MDAwMDAwRS0zODUgU3Vibm9ybWFsCisKKy0tIGNoZWNrIG92ZXJmbG93IGVkZ2UgY2FzZQorLS0gICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZGFkZDc5NzIgYXBwbHkgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRhZGQ3OTczIGFkZCAgICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5NzQgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk3NSBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDFFKzM2OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5NzYgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTc3IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOEUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk3OCBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDdFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5NzkgYWRkICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA2RSszNjggIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTgwIGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNUUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk4MSBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDRFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk4MiBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDNFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk4MyBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDJFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk4NCBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDFFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ3OTg1IGFwcGx5ICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZGFkZDc5ODYgYWRkICAgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0xICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5ODcgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5ODggYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjkgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk4OSBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTkwIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOEUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5OTEgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC03RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk5MiBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTZFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTkzIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNUUrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5OTQgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC00RSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3OTk1IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtM0UrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzk5NiBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTJFKzM2OCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc5OTcgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC0xRSszNjggIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCistLSBBbmQgZm9yIHJvdW5kIGRvd24gZnVsbCBhbmQgc3Vibm9ybWFsIHJlc3VsdHMKK3JvdW5kaW5nOiAgICAgZG93bgorZGRhZGQ3MTEwMCBhZGQgMWUrMiAtMWUtMzgzICAgIC0+IDk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwMSBhZGQgMWUrMSAtMWUtMzgzICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkYWRkNzExMDMgYWRkICAgKzEgLTFlLTM4MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwNCBhZGQgMWUtMSAtMWUtMzgzICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwNSBhZGQgMWUtMiAtMWUtMzgzICAgIC0+IDAuMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkYWRkNzExMDYgYWRkIDFlLTMgLTFlLTM4MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwNyBhZGQgMWUtNCAtMWUtMzgzICAgIC0+IDAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTEwOCBhZGQgMWUtNSAtMWUtMzgzICAgIC0+IDAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkYWRkNzExMDkgYWRkIDFlLTYgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworZGRhZGQ3MTExMCBhZGQgLTFlKzIgKzFlLTM4MyAgIC0+IC05OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2RkYWRkNzExMTEgYWRkIC0xZSsxICsxZS0zODMgICAtPiAtOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExMyBhZGQgICAgLTEgKzFlLTM4MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExNCBhZGQgLTFlLTEgKzFlLTM4MyAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkYWRkNzExMTUgYWRkIC0xZS0yICsxZS0zODMgICAtPiAtMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExNiBhZGQgLTFlLTMgKzFlLTM4MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExNyBhZGQgLTFlLTQgKzFlLTM4MyAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkYWRkNzExMTggYWRkIC0xZS01ICsxZS0zODMgICAtPiAtMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRhZGQ3MTExOSBhZGQgLTFlLTYgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCityb3VuZGluZzogICAgIGhhbGZfZXZlbgorCitkZGFkZDcxMzAwIGFkZCAxRTE2ICAtMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMxMCBhZGQgMUUxNiAgLTAuNTEgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMTEgYWRkIDFFMTYgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzEyIGFkZCAxRTE2ICAtMC41MDAxICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMxMyBhZGQgMUUxNiAgLTAuNTAwMDEgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMTQgYWRkIDFFMTYgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzE1IGFkZCAxRTE2ICAtMC41MDAwMDAxICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMxNiBhZGQgMUUxNiAgLTAuNTAwMDAwMDEgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMTcgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzE4IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAxICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMxOSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMjAgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzIxIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAxICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMyMiBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMjMgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzI0IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMyNSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMjYgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzI3IGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMyOCBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMjkgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzMwIGFkZCAxRTE2ICAtMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMzMSBhZGQgMUUxNiAgLTAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMzIgYWRkIDFFMTYgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzMzIGFkZCAxRTE2ICAtMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMzNCBhZGQgMUUxNiAgLTAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMzUgYWRkIDFFMTYgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzM2IGFkZCAxRTE2ICAtMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTMzNyBhZGQgMUUxNiAgLTAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzMzggYWRkIDFFMTYgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzM5IGFkZCAxRTE2ICAtMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCitkZGFkZDcxMzQwIGFkZCAxRTE2ICAtNTAwMDAwMC4wMDAwMTAwMDEgICAtPiAgOTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM0MSBhZGQgMUUxNiAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ3MTM0OSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQgICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzUwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDkgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNTEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM1MiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTkgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzUzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTkgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNTQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM1NSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTkgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzU2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTkgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNTcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM1OCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTkgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzU5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTkgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNjAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM2MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzYyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTkgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNjMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM2NCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OTkgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzY1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNjcgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM2OCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzY5IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNzAgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM3MSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzcyIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNzMgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM3NCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzc1IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNzYgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM3NyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzc4IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzNzkgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM4MCBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzgxIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzODIgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM4MyBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzg0IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzODUgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM4NiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzg3IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzODggYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM4OSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMSAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzkwIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDEgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzOTEgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM5MiBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMSAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzkzIGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDEgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzEzOTQgYWRkIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTM5NSBhZGQgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMSAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGFkZDcxMzk2IGFkZCA5OTk5OTk5OTk5OTk5OTk5IDAuNTEgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKKworLS0gTW9yZSBHRCBlZGdlIGNhc2VzLCB3aGVyZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHVuYWRqdXN0ZWQKKy0tIGV4cG9uZW50cyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBwcmVjaXNpb24gYW5kIG9uZSBzaWRlIGlzIDAKK2RkYWRkNzE0MjAgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQyMSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQyMiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTIgIC0+IDAuMDExMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0MjMgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQyNCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQyNSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTUgIC0+IDAuMDAwMDExMjM0NTY3ODkwMTIzNDUKK2RkYWRkNzE0MjYgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQyNyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CitkZGFkZDcxNDI4IGFkZCAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtOCAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTgKK2RkYWRkNzE0MjkgYWRkICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOQorZGRhZGQ3MTQzMCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZGRhZGQ3MTQzMSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTExIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZGRhZGQ3MTQzMiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZGRhZGQ3MTQzMyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworZGRhZGQ3MTQzNCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE0IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZGRhZGQ3MTQzNSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZGRhZGQ3MTQzNiBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZGRhZGQ3MTQzNyBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE3IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNworZGRhZGQ3MTQzOCBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZGRhZGQ3MTQzOSBhZGQgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCByZXZlcnNlZCAwCitkZGFkZDcxNDQwIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgICAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQ0MSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDQyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDQzIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMyAgMCAtPiAwLjAwMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQ0NCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDQ1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDQ2IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtNiAgMCAtPiAwLjAwMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRhZGQ3MTQ0NyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2RkYWRkNzE0NDggYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CitkZGFkZDcxNDQ5IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtOSAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOQorZGRhZGQ3MTQ1MCBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCitkZGFkZDcxNDUxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2RkYWRkNzE0NTIgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMiAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZGRhZGQ3MTQ1MyBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCitkZGFkZDcxNDU0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2RkYWRkNzE0NTUgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZGRhZGQ3MTQ1NiBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CitkZGFkZDcxNDU3IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2RkYWRkNzE0NTggYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZGRhZGQ3MTQ1OSBhZGQgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCitkZGFkZDcxNDYwIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDYxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDYyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDYzIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMyAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDY0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDY1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDY2IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDY3IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNyAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDY4IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDY5IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDcwIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDcxIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDcyIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTIgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDczIGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTMgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDc0IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGFkZDcxNDc1IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTUgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CistLSBuZXh0IGZvdXIgZmxhZyBSb3VuZGVkIGJlY2F1c2UgdGhlIDAgZXh0ZW5kcyB0aGUgcmVzdWx0CitkZGFkZDcxNDc2IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTYgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RkYWRkNzE0NzcgYWRkIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZGRhZGQ3MTQ3OCBhZGQgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkZGFkZDcxNDc5IGFkZCAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTkgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKKworLS0gc3VtIG9mIHR3byBvcHBvc2l0ZS1zaWduIG9wZXJhbmRzIGlzIGV4YWN0bHkgMCBhbmQgZmxvb3IgPT4gLTAKK3JvdW5kaW5nOiAgICBoYWxmX3VwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGFkZDcxNTAwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTUwMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1MDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTAzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkYWRkNzE1MTEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGFkZDcxNTEyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgaGFsZl9kb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGFkZDcxNTIwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTUyMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1MjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTIzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkYWRkNzE1MzEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGFkZDcxNTMyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgaGFsZl9ldmVuCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGFkZDcxNTQwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTU0MSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1NDIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTQzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkYWRkNzE1NTEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGFkZDcxNTUyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkYWRkNzE1NjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTYxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTU2MiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1NjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRhZGQ3MTU3MSBhZGQgLTExICAgICAgMTEgICAgLT4gIDAKK2RkYWRkNzE1NzIgYWRkICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBkb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGFkZDcxNTgwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTU4MSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE1ODIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNTgzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkYWRkNzE1OTEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGFkZDcxNTkyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgY2VpbGluZworLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRhZGQ3MTYwMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkYWRkNzE2MDEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNjAyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZGRhZGQ3MTYwMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGFkZDcxNjExIGFkZCAtMTEgICAgICAxMSAgICAtPiAgMAorZGRhZGQ3MTYxMiBhZGQgIDExICAgICAtMTEgICAgLT4gIDAKKworLS0gYW5kIHRoZSBleHRyYS1zcGVjaWFsIHVnbHkgY2FzZTsgdW51c3VhbCBtaW51c2VzIG1hcmtlZCBieSAtLSAqCityb3VuZGluZzogICAgZmxvb3IKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkYWRkNzE2MjAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGFkZDcxNjIxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZGRhZGQ3MTYyMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkgICAgICAgICAgIC0tICoKK2RkYWRkNzE2MjMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRhZGQ3MTYzMSBhZGQgLTExICAgICAgMTEgICAgLT4gIC0wICAgICAgICAgICAgICAgIC0tICoKK2RkYWRkNzE2MzIgYWRkICAxMSAgICAgLTExICAgIC0+ICAtMCAgICAgICAgICAgICAgICAtLSAqCisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorZGRhZGQ3MTcwMSBhZGQgMTMwRS0yICAgIDEyMEUtMiAgICAtPiAyLjUwCitkZGFkZDcxNzAyIGFkZCAxMzBFLTIgICAgMTJFLTEgICAgIC0+IDIuNTAKK2RkYWRkNzE3MDMgYWRkIDEzMEUtMiAgICAxRTAgICAgICAgLT4gMi4zMAorZGRhZGQ3MTcwNCBhZGQgMUUyICAgICAgIDFFNCAgICAgICAtPiAxLjAxRSs0CitkZGFkZDcxNzA1IGFkZCAxMzBFLTIgICAtMTIwRS0yIC0+IDAuMTAKK2RkYWRkNzE3MDYgYWRkIDEzMEUtMiAgIC0xMkUtMSAgLT4gMC4xMAorZGRhZGQ3MTcwNyBhZGQgMTMwRS0yICAgLTFFMCAgICAtPiAwLjMwCitkZGFkZDcxNzA4IGFkZCAxRTIgICAgICAtMUU0ICAgIC0+IC05LjlFKzMKKworLS0gcXVlcnkgZnJvbSBWaW5jZW50IEt1bGFuZGFpc2FteQorcm91bmRpbmc6IGNlaWxpbmcKK2RkYWRkNzE4MDEgIGFkZCAgNy44ODIyNzczODA1ODYyRSsyNzcgICAgLTUuMTc1NzUwMzgyMDY2M0UtMjEgLT4gNy44ODIyNzczODA1ODYyMDBFKzI3NyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzE4MDIgIGFkZCAgNy44ODIyNzczODA1ODYyMDBFKzI3NyAgMTIuMzQxICAgICAgICAgICAgICAgLT4gNy44ODIyNzczODA1ODYyMDFFKzI3NyBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzE4MDMgIGFkZCAgNy44ODIyNzczODA1ODYyMDFFKzI3NyAgMi43MjcwNTQ1MDQ2NjEzRS0zMSAgLT4gNy44ODIyNzczODA1ODYyMDJFKzI3NyBJbmV4YWN0IFJvdW5kZWQKKworZGRhZGQ3MTgxMSAgYWRkICAgICAgICAgICAgICAgICAgIDEyLjM0MSAtNS4xNzU3NTAzODIwNjYzRS0yMSAtPiAxMi4zNDEwMDAwMDAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTgxMiAgYWRkICAgICAgICAxMi4zNDEwMDAwMDAwMDAwMCAyLjcyNzA1NDUwNDY2MTNFLTMxICAtPiAxMi4zNDEwMDAwMDAwMDAwMSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3MTgxMyAgYWRkICAgICAgICAxMi4zNDEwMDAwMDAwMDAwMSA3Ljg4MjI3NzM4MDU4NjJFKzI3NyAtPiA3Ljg4MjI3NzM4MDU4NjIwMUUrMjc3IEluZXhhY3QgUm91bmRlZAorCistLSBHYXBweSBjb2VmZmljaWVudHM7IGNoZWNrIHJlc2lkdWUgaGFuZGxpbmcgZXZlbiB3aXRoIGZ1bGwgY29lZmZpY2llbnQgZ2FwCityb3VuZGluZzogaGFsZl9ldmVuCisKK2RkYWRkNzUwMDEgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgMSAgICAgIC0+IDEyMzQ1Njc4OTAxMjM0NTcKK2RkYWRkNzUwMDIgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgMC42ICAgIC0+IDEyMzQ1Njc4OTAxMjM0NTcgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAwMyBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiAwLjA2ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDA0IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTMgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMDUgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAwNiBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS01ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDA3IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTYgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMDggYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAwOSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS04ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDEwIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTkgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMTEgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAxMiBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDEzIGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTEyICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMTQgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTMgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAxNSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDE2IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE1ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMTcgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTYgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAxOCBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDE5IGFkZCAxMjM0NTY3ODkwMTIzNDU2IDZFLTE4ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwMjAgYWRkIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTkgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTAyMSBhZGQgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0yMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHdpZGVuaW5nIHNlY29uZCBhcmd1bWVudCBhdCBnYXAKK2RkYWRkNzUwMzAgYWRkIDEyMzQ1Njc4IDEgICAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc5CitkZGFkZDc1MDMxIGFkZCAxMjM0NTY3OCAwLjEgICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xCitkZGFkZDc1MDMyIGFkZCAxMjM0NTY3OCAwLjEyICAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMgorZGRhZGQ3NTAzMyBhZGQgMTIzNDU2NzggMC4xMjMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzCitkZGFkZDc1MDM0IGFkZCAxMjM0NTY3OCAwLjEyMzQgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0CitkZGFkZDc1MDM1IGFkZCAxMjM0NTY3OCAwLjEyMzQ1ICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NQorZGRhZGQ3NTAzNiBhZGQgMTIzNDU2NzggMC4xMjM0NTYgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2CitkZGFkZDc1MDM3IGFkZCAxMjM0NTY3OCAwLjEyMzQ1NjcgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3CitkZGFkZDc1MDM4IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4ICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OAorZGRhZGQ3NTAzOSBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODkgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDQwIGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NSAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNDEgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MCAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA0MiBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUxICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDQzIGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAxICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNDQgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAxICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA0NSBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAxICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDQ2IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAxICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNDcgYWRkIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAxICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA0OCBhZGQgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDQ5IGFkZCAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwMTIzNDU2Cityb3VuZGluZzogaGFsZl9ldmVuCitkZGFkZDc1MDUwIGFkZCAxMjM0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNTEgYWRkIDEyMzQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA1MiBhZGQgMTIzNDU2NzggMC4wMDA0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDUzIGFkZCAxMjM0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNTQgYWRkIDEyMzQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA1NSBhZGQgMTIzNDU2NzggMC4wMDAwMDA3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDU2IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNTcgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA2MCBhZGQgMTIzNDU2NzggMC4wMjM0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDYxIGFkZCAxMjM0NTY3OCAwLjAwMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNjIgYWRkIDEyMzQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA2MyBhZGQgMTIzNDU2NzggMC4wMDAwNTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDY0IGFkZCAxMjM0NTY3OCAwLjAwMDAwNjc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNjUgYWRkIDEyMzQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA2NiBhZGQgMTIzNDU2NzggMC4wMDAwMDAwNzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDY3IGFkZCAxMjM0NTY3OCAwLjAwMDAwMDAwNTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKKy0tIGZhci1vdXQgcmVzaWR1ZXMgKGZ1bGwgY29lZmZpY2llbnQgZ2FwIGlzIDE2KzE1IGRpZ2l0cykKK3JvdW5kaW5nOiB1cAorZGRhZGQ3NTA3MCBhZGQgMTIzNDU2NzggMUUtOCAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEKK2RkYWRkNzUwNzEgYWRkIDEyMzQ1Njc4IDFFLTkgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA3MiBhZGQgMTIzNDU2NzggMUUtMTAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDczIGFkZCAxMjM0NTY3OCAxRS0xMSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNzQgYWRkIDEyMzQ1Njc4IDFFLTEyICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA3NSBhZGQgMTIzNDU2NzggMUUtMTMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDc2IGFkZCAxMjM0NTY3OCAxRS0xNCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwNzcgYWRkIDEyMzQ1Njc4IDFFLTE1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA3OCBhZGQgMTIzNDU2NzggMUUtMTYgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDc5IGFkZCAxMjM0NTY3OCAxRS0xNyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwODAgYWRkIDEyMzQ1Njc4IDFFLTE4ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA4MSBhZGQgMTIzNDU2NzggMUUtMTkgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDgyIGFkZCAxMjM0NTY3OCAxRS0yMCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwODMgYWRkIDEyMzQ1Njc4IDFFLTI1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA4NCBhZGQgMTIzNDU2NzggMUUtMzAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDg1IGFkZCAxMjM0NTY3OCAxRS0zMSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwODYgYWRkIDEyMzQ1Njc4IDFFLTMyICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRhZGQ3NTA4NyBhZGQgMTIzNDU2NzggMUUtMzMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGFkZDc1MDg4IGFkZCAxMjM0NTY3OCAxRS0zNCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkNzUwODkgYWRkIDEyMzQ1Njc4IDFFLTM1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorCistLSBQdW5pdCdzCitkZGFkZDc1MTAwIGFkZCAxLjAwMCAtMjAwLjAwMCAgICAgICAgICAgICAgICAgICAtPiAtMTk5LjAwMAorCistLSBSb3VuZGluZyBzd2F0aGUKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkYWRkODExMDAgYWRkICAuMjMwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIFJvdW5kZWQKK2RkYWRkODExMDEgYWRkICAuMjMwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTEwMiBhZGQgIC4yMzEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMTAzIGFkZCAgLjIzNTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODExMDQgYWRkICAuMjM1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTEwNSBhZGQgIC4yNDUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMTA2IGFkZCAgLjI0NTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODExMDcgYWRkICAuMjM2MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTEwOCBhZGQgIC4yMzcwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMTA5IGFkZCAgLjIzOTkgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODExMjAgYWRkICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDlFKzM2OSAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODExMjEgYWRkIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorZGRhZGQ4MTIwMCBhZGQgIC4yMzAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgUm91bmRlZAorZGRhZGQ4MTIwMSBhZGQgIC4yMzAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMjAyIGFkZCAgLjIzMTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEyMDMgYWRkICAuMjM1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTIwNCBhZGQgIC4yMzUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMjA1IGFkZCAgLjI0NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEyMDYgYWRkICAuMjQ1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTIwNyBhZGQgIC4yMzYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMjA4IGFkZCAgLjIzNzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEyMDkgYWRkICAuMjM5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTIyMCBhZGQgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMjIxIGFkZCAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC05RSszNjkgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorZGRhZGQ4MTMwMCBhZGQgIC4yMzAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgUm91bmRlZAorZGRhZGQ4MTMwMSBhZGQgIC4yMzAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMzAyIGFkZCAgLjIzMTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEzMDMgYWRkICAuMjM1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTMwNCBhZGQgIC4yMzUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMzA1IGFkZCAgLjI0NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEzMDYgYWRkICAuMjQ1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTMwNyBhZGQgIC4yMzYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMzA4IGFkZCAgLjIzNzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODEzMDkgYWRkICAuMjM5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTMyMCBhZGQgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxMzIxIGFkZCAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC05RSszNjkgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IHVwCitkZGFkZDgxNDAwIGFkZCAgLjIzMDAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBSb3VuZGVkCitkZGFkZDgxNDAxIGFkZCAgLjIzMDEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE0MDIgYWRkICAuMjMxMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQwMyBhZGQgIC4yMzUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNDA0IGFkZCAgLjIzNTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE0MDUgYWRkICAuMjQ1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQwNiBhZGQgIC4yNDUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNDA3IGFkZCAgLjIzNjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE0MDggYWRkICAuMjM3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQwOSBhZGQgIC4yMzk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNDExIGFkZCAtLjIzOTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE0MjAgYWRkICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDlFKzM2OSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTQyMSBhZGQgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZGFkZDgxNTAwIGFkZCAgLjIzMDAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBSb3VuZGVkCitkZGFkZDgxNTAxIGFkZCAgLjIzMDEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MDIgYWRkICAuMjMxMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTUwMyBhZGQgIC4yMzUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNTA0IGFkZCAgLjIzNTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MDUgYWRkICAuMjQ1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTUwNiBhZGQgIC4yNDUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNTA3IGFkZCAgLjIzNjAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MDggYWRkICAuMjM3MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTUwOSBhZGQgIC4yMzk5ICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNTExIGFkZCAtLjIzOTkgICAtMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gLTEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE1MjAgYWRkICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDlFKzM2OSAtPiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNTIxIGFkZCAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC05RSszNjkgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworZGRhZGQ4MTYwMCBhZGQgIC4yMzAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgUm91bmRlZAorZGRhZGQ4MTYwMSBhZGQgIC4yMzAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNjAyIGFkZCAgLjIzMTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MDMgYWRkICAuMjM1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTYwNCBhZGQgIC4yMzUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNjA1IGFkZCAgLjI0NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MDYgYWRkICAuMjQ1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTYwNyBhZGQgIC4yMzYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNjA4IGFkZCAgLjIzNzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MDkgYWRkICAuMjM5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTYxMSBhZGQgLS4yMzk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNjIwIGFkZCAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjkgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE2MjEgYWRkIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OSAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBmbG9vcgorZGRhZGQ4MTcwMCBhZGQgIC4yMzAwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgUm91bmRlZAorZGRhZGQ4MTcwMSBhZGQgIC4yMzAxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzAyIGFkZCAgLjIzMTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE3MDMgYWRkICAuMjM1MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTcwNCBhZGQgIC4yMzUxICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzA1IGFkZCAgLjI0NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE3MDYgYWRkICAuMjQ1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTcwNyBhZGQgIC4yMzYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMyAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzA4IGFkZCAgLjIzNzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE3MDkgYWRkICAuMjM5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjMgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTcxMSBhZGQgLS4yMzk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxNzIwIGFkZCAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICA5RSszNjkgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTcyMSBhZGQgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtOUUrMzY5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAwNXVwCitkZGFkZDgxODAwIGFkZCAgLjIwMDAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIwICBSb3VuZGVkCitkZGFkZDgxODAxIGFkZCAgLjIwMDEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE4MDIgYWRkICAuMjAxMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTgwMyBhZGQgIC4yMDUwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxODA0IGFkZCAgLjIwNTEgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE4MDcgYWRkICAuMjA2MCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTgwOCBhZGQgIC4yMDcwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxODA5IGFkZCAgLjIwOTkgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE4MTEgYWRkIC0uMjA5OSAgIC0xMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAtMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTgyMCBhZGQgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY5IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE4MjEgYWRkIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OSAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkODE5MDAgYWRkICAuMjEwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIFJvdW5kZWQKK2RkYWRkODE5MDEgYWRkICAuMjEwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTkwMiBhZGQgIC4yMTEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxOTAzIGFkZCAgLjIxNTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE5MDQgYWRkICAuMjE1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTkwNyBhZGQgIC4yMTYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgxOTA4IGFkZCAgLjIxNzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODE5MDkgYWRkICAuMjE5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjEgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MTkxMSBhZGQgLS4yMTk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yMSAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkODIwMDAgYWRkICAuMjQwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIFJvdW5kZWQKK2RkYWRkODIwMDEgYWRkICAuMjQwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjAwMiBhZGQgIC4yNDEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMDAzIGFkZCAgLjI0NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIwMDQgYWRkICAuMjQ1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjAwNyBhZGQgIC4yNDYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMDA4IGFkZCAgLjI0NzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIwMDkgYWRkICAuMjQ5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjQgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjAxMSBhZGQgLS4yNDk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yNCAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkODIxMDAgYWRkICAuMjUwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjUgIFJvdW5kZWQKK2RkYWRkODIxMDEgYWRkICAuMjUwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjEwMiBhZGQgIC4yNTEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMTAzIGFkZCAgLjI1NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIxMDQgYWRkICAuMjU1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjEwNyBhZGQgIC4yNTYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMTA4IGFkZCAgLjI1NzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIxMDkgYWRkICAuMjU5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjExMSBhZGQgLS4yNTk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkODIyMDAgYWRkICAuMjYwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIFJvdW5kZWQKK2RkYWRkODIyMDEgYWRkICAuMjYwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjIwMiBhZGQgIC4yNjEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMjAzIGFkZCAgLjI2NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIyMDQgYWRkICAuMjY1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjIwNyBhZGQgIC4yNjYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMjA4IGFkZCAgLjI2NzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIyMDkgYWRkICAuMjY5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjYgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjIxMSBhZGQgLS4yNjk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yNiAgSW5leGFjdCBSb3VuZGVkCisKK2RkYWRkODIzMDAgYWRkICAuMjkwMCAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjkgIFJvdW5kZWQKK2RkYWRkODIzMDEgYWRkICAuMjkwMSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjkgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjMwMiBhZGQgIC4yOTEwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yOSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMzAzIGFkZCAgLjI5NTAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIzMDQgYWRkICAuMjk1MSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjkgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjMwNyBhZGQgIC4yOTYwICAgIDEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+ICAxMjM0NTY3ODkwMTIzNC4yOSAgSW5leGFjdCBSb3VuZGVkCitkZGFkZDgyMzA4IGFkZCAgLjI5NzAgICAgMTIzNDU2Nzg5MDEyMzQuMDAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0LjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkYWRkODIzMDkgYWRkICAuMjk5OSAgICAxMjM0NTY3ODkwMTIzNC4wMCAgICAtPiAgMTIzNDU2Nzg5MDEyMzQuMjkgIEluZXhhY3QgUm91bmRlZAorZGRhZGQ4MjMxMSBhZGQgLS4yOTk5ICAgLTEyMzQ1Njc4OTAxMjM0LjAwICAgIC0+IC0xMjM0NTY3ODkwMTIzNC4yOSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIE51bGwgdGVzdHMKK2RkYWRkOTk5MCBhZGQgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFkZDk5OTEgYWRkICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEFuZC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEFuZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTlmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQW5kLmRlY1Rlc3QKQEAgLTAsMCArMSwzNDcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRBbmQuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBBTkQgZm9yIGRlY0RvdWJsZXMgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSkKK2RkYW5kMDAxIGFuZCAgICAgICAgICAgICAwICAgIDAgLT4gICAgMAorZGRhbmQwMDIgYW5kICAgICAgICAgICAgIDAgICAgMSAtPiAgICAwCitkZGFuZDAwMyBhbmQgICAgICAgICAgICAgMSAgICAwIC0+ICAgIDAKK2RkYW5kMDA0IGFuZCAgICAgICAgICAgICAxICAgIDEgLT4gICAgMQorZGRhbmQwMDUgYW5kICAgICAgICAgIDExMDAgMTAxMCAtPiAxMDAwCistLSBhbmQgYXQgbXNkIGFuZCBtc2QtMQorLS0gICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkYW5kMDA2IGFuZCAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkZGFuZDAwNyBhbmQgMDAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZGRhbmQwMDggYW5kIDEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RkYW5kMDA5IGFuZCAxMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAwMDAwMDAwCitkZGFuZDAxMCBhbmQgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZGRhbmQwMTEgYW5kIDAwMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RkYW5kMDEyIGFuZCAwMTAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkZGFuZDAxMyBhbmQgMDEwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMAorCistLSBWYXJpb3VzIGxlbmd0aHMKKy0tICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZGFuZDAyMSBhbmQgMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExICAtPiAgMTExMTExMTExMTExMTExMQorZGRhbmQwMjQgYW5kIDExMTExMTExMTExMTExMTEgIDExMTExMTExMTExMTExMSAgLT4gICAxMTExMTExMTExMTExMTEKK2RkYW5kMDI1IGFuZCAxMTExMTExMTExMTExMTExICAgMTExMTExMTExMTExMTEgIC0+ICAgIDExMTExMTExMTExMTExCitkZGFuZDAyNiBhbmQgMTExMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExICAtPiAgICAgMTExMTExMTExMTExMQorZGRhbmQwMjcgYW5kIDExMTExMTExMTExMTExMTEgICAgIDExMTExMTExMTExMSAgLT4gICAgICAxMTExMTExMTExMTEKK2RkYW5kMDI4IGFuZCAxMTExMTExMTExMTExMTExICAgICAgMTExMTExMTExMTEgIC0+ICAgICAgIDExMTExMTExMTExCitkZGFuZDAyOSBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAxMTExMTExMTExICAtPiAgICAgICAgMTExMTExMTExMQorZGRhbmQwMzAgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgIDExMTExMTExMSAgLT4gICAgICAgICAxMTExMTExMTEKK2RkYW5kMDMxIGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgMTExMTExMTEgIC0+ICAgICAgICAgIDExMTExMTExCitkZGFuZDAzMiBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAxMTExMTExICAtPiAgICAgICAgICAgMTExMTExMQorZGRhbmQwMzMgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgIDExMTExMSAgLT4gICAgICAgICAgICAxMTExMTEKK2RkYW5kMDM0IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgMTExMTEgIC0+ICAgICAgICAgICAgIDExMTExCitkZGFuZDAzNSBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgICAxMTExICAtPiAgICAgICAgICAgICAgMTExMQorZGRhbmQwMzYgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAgIDExMSAgLT4gICAgICAgICAgICAgICAxMTEKK2RkYW5kMDM3IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgICAgMTEgIC0+ICAgICAgICAgICAgICAgIDExCitkZGFuZDAzOCBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgICAgICAxICAtPiAgICAgICAgICAgICAgICAgMQorZGRhbmQwMzkgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAgICAgMCAgLT4gICAgICAgICAgICAgICAgIDAKKworZGRhbmQwNDAgYW5kIDExMTExMTExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgMTExMTExMTExMTExMTExMQorZGRhbmQwNDEgYW5kICAxMTExMTExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgIDExMTExMTExMTExMTExMQorZGRhbmQwNDIgYW5kICAxMTExMTExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgIDExMTExMTExMTExMTExMQorZGRhbmQwNDMgYW5kICAgMTExMTExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAxMTExMTExMTExMTExMQorZGRhbmQwNDQgYW5kICAgIDExMTExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgMTExMTExMTExMTExMQorZGRhbmQwNDUgYW5kICAgICAxMTExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgIDExMTExMTExMTExMQorZGRhbmQwNDYgYW5kICAgICAgMTExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAxMTExMTExMTExMQorZGRhbmQwNDcgYW5kICAgICAgIDExMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgMTExMTExMTExMQorZGRhbmQwNDggYW5kICAgICAgICAxMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgIDExMTExMTExMQorZGRhbmQwNDkgYW5kICAgICAgICAgMTExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAxMTExMTExMQorZGRhbmQwNTAgYW5kICAgICAgICAgIDExMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgMTExMTExMQorZGRhbmQwNTEgYW5kICAgICAgICAgICAxMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgIDExMTExMQorZGRhbmQwNTIgYW5kICAgICAgICAgICAgMTExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgICAxMTExMQorZGRhbmQwNTMgYW5kICAgICAgICAgICAgIDExMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgICAgMTExMQorZGRhbmQwNTQgYW5kICAgICAgICAgICAgICAxMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgICAgIDExMQorZGRhbmQwNTUgYW5kICAgICAgICAgICAgICAgMTEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgICAgICAxMQorZGRhbmQwNTYgYW5kICAgICAgICAgICAgICAgIDEgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgICAgICAgMQorZGRhbmQwNTcgYW5kICAgICAgICAgICAgICAgIDAgICAgMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgICAgICAgMAorCitkZGFuZDE1MCBhbmQgMTExMTExMTExMSAgMSAgLT4gIDEKK2RkYW5kMTUxIGFuZCAgMTExMTExMTExICAxICAtPiAgMQorZGRhbmQxNTIgYW5kICAgMTExMTExMTEgIDEgIC0+ICAxCitkZGFuZDE1MyBhbmQgICAgMTExMTExMSAgMSAgLT4gIDEKK2RkYW5kMTU0IGFuZCAgICAgMTExMTExICAxICAtPiAgMQorZGRhbmQxNTUgYW5kICAgICAgMTExMTEgIDEgIC0+ICAxCitkZGFuZDE1NiBhbmQgICAgICAgMTExMSAgMSAgLT4gIDEKK2RkYW5kMTU3IGFuZCAgICAgICAgMTExICAxICAtPiAgMQorZGRhbmQxNTggYW5kICAgICAgICAgMTEgIDEgIC0+ICAxCitkZGFuZDE1OSBhbmQgICAgICAgICAgMSAgMSAgLT4gIDEKKworZGRhbmQxNjAgYW5kIDExMTExMTExMTEgIDAgIC0+ICAwCitkZGFuZDE2MSBhbmQgIDExMTExMTExMSAgMCAgLT4gIDAKK2RkYW5kMTYyIGFuZCAgIDExMTExMTExICAwICAtPiAgMAorZGRhbmQxNjMgYW5kICAgIDExMTExMTEgIDAgIC0+ICAwCitkZGFuZDE2NCBhbmQgICAgIDExMTExMSAgMCAgLT4gIDAKK2RkYW5kMTY1IGFuZCAgICAgIDExMTExICAwICAtPiAgMAorZGRhbmQxNjYgYW5kICAgICAgIDExMTEgIDAgIC0+ICAwCitkZGFuZDE2NyBhbmQgICAgICAgIDExMSAgMCAgLT4gIDAKK2RkYW5kMTY4IGFuZCAgICAgICAgIDExICAwICAtPiAgMAorZGRhbmQxNjkgYW5kICAgICAgICAgIDEgIDAgIC0+ICAwCisKK2RkYW5kMTcwIGFuZCAxICAxMTExMTExMTExICAtPiAgMQorZGRhbmQxNzEgYW5kIDEgICAxMTExMTExMTEgIC0+ICAxCitkZGFuZDE3MiBhbmQgMSAgICAxMTExMTExMSAgLT4gIDEKK2RkYW5kMTczIGFuZCAxICAgICAxMTExMTExICAtPiAgMQorZGRhbmQxNzQgYW5kIDEgICAgICAxMTExMTEgIC0+ICAxCitkZGFuZDE3NSBhbmQgMSAgICAgICAxMTExMSAgLT4gIDEKK2RkYW5kMTc2IGFuZCAxICAgICAgICAxMTExICAtPiAgMQorZGRhbmQxNzcgYW5kIDEgICAgICAgICAxMTEgIC0+ICAxCitkZGFuZDE3OCBhbmQgMSAgICAgICAgICAxMSAgLT4gIDEKK2RkYW5kMTc5IGFuZCAxICAgICAgICAgICAxICAtPiAgMQorCitkZGFuZDE4MCBhbmQgMCAgMTExMTExMTExMSAgLT4gIDAKK2RkYW5kMTgxIGFuZCAwICAgMTExMTExMTExICAtPiAgMAorZGRhbmQxODIgYW5kIDAgICAgMTExMTExMTEgIC0+ICAwCitkZGFuZDE4MyBhbmQgMCAgICAgMTExMTExMSAgLT4gIDAKK2RkYW5kMTg0IGFuZCAwICAgICAgMTExMTExICAtPiAgMAorZGRhbmQxODUgYW5kIDAgICAgICAgMTExMTEgIC0+ICAwCitkZGFuZDE4NiBhbmQgMCAgICAgICAgMTExMSAgLT4gIDAKK2RkYW5kMTg3IGFuZCAwICAgICAgICAgMTExICAtPiAgMAorZGRhbmQxODggYW5kIDAgICAgICAgICAgMTEgIC0+ICAwCitkZGFuZDE4OSBhbmQgMCAgICAgICAgICAgMSAgLT4gIDAKKworZGRhbmQwOTAgYW5kIDAxMTExMTExMSAgMTExMTExMTExICAtPiAgIDExMTExMTExCitkZGFuZDA5MSBhbmQgMTAxMTExMTExICAxMTExMTExMTEgIC0+ICAxMDExMTExMTEKK2RkYW5kMDkyIGFuZCAxMTAxMTExMTEgIDExMTExMTExMSAgLT4gIDExMDExMTExMQorZGRhbmQwOTMgYW5kIDExMTAxMTExMSAgMTExMTExMTExICAtPiAgMTExMDExMTExCitkZGFuZDA5NCBhbmQgMTExMTAxMTExICAxMTExMTExMTEgIC0+ICAxMTExMDExMTEKK2RkYW5kMDk1IGFuZCAxMTExMTAxMTEgIDExMTExMTExMSAgLT4gIDExMTExMDExMQorZGRhbmQwOTYgYW5kIDExMTExMTAxMSAgMTExMTExMTExICAtPiAgMTExMTExMDExCitkZGFuZDA5NyBhbmQgMTExMTExMTAxICAxMTExMTExMTEgIC0+ICAxMTExMTExMDEKK2RkYW5kMDk4IGFuZCAxMTExMTExMTAgIDExMTExMTExMSAgLT4gIDExMTExMTExMAorCitkZGFuZDEwMCBhbmQgMTExMTExMTExICAwMTExMTExMTEgIC0+ICAgMTExMTExMTEKK2RkYW5kMTAxIGFuZCAxMTExMTExMTEgIDEwMTExMTExMSAgLT4gIDEwMTExMTExMQorZGRhbmQxMDIgYW5kIDExMTExMTExMSAgMTEwMTExMTExICAtPiAgMTEwMTExMTExCitkZGFuZDEwMyBhbmQgMTExMTExMTExICAxMTEwMTExMTEgIC0+ICAxMTEwMTExMTEKK2RkYW5kMTA0IGFuZCAxMTExMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTEwMTExMQorZGRhbmQxMDUgYW5kIDExMTExMTExMSAgMTExMTEwMTExICAtPiAgMTExMTEwMTExCitkZGFuZDEwNiBhbmQgMTExMTExMTExICAxMTExMTEwMTEgIC0+ICAxMTExMTEwMTEKK2RkYW5kMTA3IGFuZCAxMTExMTExMTEgIDExMTExMTEwMSAgLT4gIDExMTExMTEwMQorZGRhbmQxMDggYW5kIDExMTExMTExMSAgMTExMTExMTEwICAtPiAgMTExMTExMTEwCisKKy0tIG5vbi0wLzEgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCwgbm9yIHNob3VsZCBzaWducworZGRhbmQyMjAgYW5kIDExMTExMTExMiAgMTExMTExMTExICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIyMSBhbmQgMzMzMzMzMzMzICAzMzMzMzMzMzMgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjIyIGFuZCA1NTU1NTU1NTUgIDU1NTU1NTU1NSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMjMgYW5kIDc3Nzc3Nzc3NyAgNzc3Nzc3Nzc3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIyNCBhbmQgOTk5OTk5OTk5ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjI1IGFuZCAyMjIyMjIyMjIgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMjYgYW5kIDQ0NDQ0NDQ0NCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIyNyBhbmQgNjY2NjY2NjY2ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjI4IGFuZCA4ODg4ODg4ODggIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMjkgYW5kIDk5OTk5OTk5OSAgMjIyMjIyMjIyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDIzMCBhbmQgOTk5OTk5OTk5ICA0NDQ0NDQ0NDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjMxIGFuZCA5OTk5OTk5OTkgIDY2NjY2NjY2NiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyMzIgYW5kIDk5OTk5OTk5OSAgODg4ODg4ODg4ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCitkZGFuZDI0MCBhbmQgIDU2NzQ2ODY4OSAtOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjQxIGFuZCAgNTY3MzY3Njg5ICA5MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyNDIgYW5kIC02MzE5MTc3NzIgLTcwNjAxNDYzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI0MyBhbmQgLTc1NjI1MzI1NyAgMTM4NTc5MjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjQ0IGFuZCAgODM1NTkwMTQ5ICA1Njc0MzU0MDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QKK2RkYW5kMjUwIGFuZCAgMjAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjUxIGFuZCAgNzAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjUyIGFuZCAgODAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjUzIGFuZCAgOTAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjU0IGFuZCAgMjAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjU1IGFuZCAgNzAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjU2IGFuZCAgODAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjU3IGFuZCAgOTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjU4IGFuZCAgMTAwMDAwMDAwMDAwMDAwMCAyMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjU5IGFuZCAgMTAwMDAwMDAwMDAwMDAwMCA3MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjYwIGFuZCAgMTAwMDAwMDAwMDAwMDAwMCA4MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjYxIGFuZCAgMTAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjYyIGFuZCAgMDAwMDAwMDAwMDAwMDAwMCAyMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjYzIGFuZCAgMDAwMDAwMDAwMDAwMDAwMCA3MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjY0IGFuZCAgMDAwMDAwMDAwMDAwMDAwMCA4MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjY1IGFuZCAgMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNELTEKK2RkYW5kMjcwIGFuZCAgMDIwMDAwMTAwMDAwMDAwMCAxMDAwMTAwMDAwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjcxIGFuZCAgMDcwMDAwMDEwMDAwMDAwMCAxMDAwMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjcyIGFuZCAgMDgwMDAwMDAxMDAwMDAwMCAxMDAwMDAxMDAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjczIGFuZCAgMDkwMDAwMDAwMTAwMDAwMCAxMDAwMDAwMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjc0IGFuZCAgMTAwMDAwMDAwMDEwMDAwMCAwMjAwMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjc1IGFuZCAgMTAwMDAwMDAwMDAxMDAwMCAwNzAwMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjc2IGFuZCAgMTAwMDAwMDAwMDAwMTAwMCAwODAwMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjc3IGFuZCAgMTAwMDAwMDAwMDAwMDEwMCAwOTAwMDAwMDAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTFNECitkZGFuZDI4MCBhbmQgIDAwMTAwMDAwMDAwMDAwMDIgMTAwMDAwMDEwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4MSBhbmQgIDAwMDEwMDAwMDAwMDAwMDcgMTAwMDAwMTAwMDAwMDAxMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4MiBhbmQgIDAwMDAxMDAwMDAwMDAwMDggMTAwMDAxMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4MyBhbmQgIDAwMDAwMTAwMDAwMDAwMDkgMTAwMDEwMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4NCBhbmQgIDEwMDAwMDEwMDAwMDAwMDAgMDAwMTAwMDAwMDAwMDAwMiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4NSBhbmQgIDEwMDAwMDAxMDAwMDAwMDAgMDAxMDAwMDAwMDAwMDAwNyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4NiBhbmQgIDEwMDAwMDAwMTAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwOCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI4NyBhbmQgIDEwMDAwMDAwMDEwMDAwMDAgMTAwMDAwMDAwMDAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorZGRhbmQyODggYW5kICAwMDEwMDAwMDIwMDAwMDAwIDEwMDAwMDEwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyODkgYW5kICAwMDAxMDAwMDcwMDAwMDAxIDEwMDAwMDAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTAgYW5kICAwMDAwMTAwMDgwMDAwMDEwIDEwMDAwMDAwMTAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTEgYW5kICAwMDAwMDEwMDkwMDAwMTAwIDEwMDAwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTIgYW5kICAxMDAwMDAxMDAwMDAxMDAwIDAwMDAwMDAwMjAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTMgYW5kICAxMDAwMDAwMTAwMDEwMDAwIDAwMDAwMDAwNzAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTQgYW5kICAxMDAwMDAwMDEwMTAwMDAwIDAwMDAwMDAwODAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTUgYW5kICAxMDAwMDAwMDAxMDAwMDAwIDAwMDAwMDAwOTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc2lnbnMKK2RkYW5kMjk2IGFuZCAtMTAwMDAwMDAwMTAwMDAwMCAtMDAwMDAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDI5NyBhbmQgLTEwMDAwMDAwMDEwMDAwMDAgIDAwMDAwMDAwMTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQyOTggYW5kICAxMDAwMDAwMDAxMDAwMDAwIC0wMDAwMDAxMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMjk5IGFuZCAgMTAwMDAwMDAwMTAwMDAwMCAgMDAwMDAwMDAxMTAwMDEwMCAtPiAgMTAwMDAwMAorCistLSBObWF4LCBObWluLCBOdGlueS1saWtlCitkZGFuZDMzMSBhbmQgIDIgICA5Ljk5OTk5OTk5RSsxOTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzMzIgYW5kICAzICAgMUUtMTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzMzIGFuZCAgNCAgIDEuMDAwMDAwMDBFLTE5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDMzNCBhbmQgIDUgICAxRS0xMDAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzMzUgYW5kICA2ICAgLTFFLTEwMCAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzM2IGFuZCAgNyAgIC0xLjAwMDAwMDAwRS0xOTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDMzNyBhbmQgIDggICAtMUUtMTk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzMzggYW5kICA5ICAgLTkuOTk5OTk5OTlFKzE5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzQxIGFuZCAgOS45OTk5OTk5OUUrMTk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM0MiBhbmQgIDFFLTE5OSAgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNDMgYW5kICAxLjAwMDAwMDAwRS0xOTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzQ0IGFuZCAgMUUtMTAwICAgICAgICAgICAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM0NSBhbmQgIC0xRS0xMDAgICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNDYgYW5kICAtMS4wMDAwMDAwMEUtMTk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzQ3IGFuZCAgLTFFLTE5OSAgICAgICAgICAgICAgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM0OCBhbmQgIC05Ljk5OTk5OTk5RSsxOTkgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK2RkYW5kMzYxIGFuZCAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM2MiBhbmQgIDFFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNjMgYW5kICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzY0IGFuZCAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM2NSBhbmQgIDkuOSAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNjYgYW5kICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzcxIGFuZCAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM3MiBhbmQgIDAgMUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNzMgYW5kICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kMzc0IGFuZCAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDM3NSBhbmQgIDAgOS45ICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQzNzYgYW5kICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorZGRhbmQ3ODAgYW5kIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzgxIGFuZCAtSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc4MiBhbmQgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3ODMgYW5kIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzg0IGFuZCAtSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc4NSBhbmQgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3ODYgYW5kIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzg3IGFuZCAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc4OCBhbmQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3ODkgYW5kIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzkwIGFuZCAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc5MSBhbmQgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ3OTIgYW5kICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kNzkzIGFuZCAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDc5NCBhbmQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZGFuZDgwMCBhbmQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MDEgYW5kICBJbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODAyIGFuZCAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgwMyBhbmQgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MDQgYW5kICBJbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODA1IGFuZCAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgwNiBhbmQgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MDcgYW5kICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODA4IGFuZCAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgwOSBhbmQgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MTAgYW5kIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODExIGFuZCAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgxMiBhbmQgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MTMgYW5kICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODE0IGFuZCAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgxNSBhbmQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZGFuZDgyMSBhbmQgIE5hTiAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MjIgYW5kICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODIzIGFuZCAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgyNCBhbmQgIE5hTiAtMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MjUgYW5kICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODI2IGFuZCAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgyNyBhbmQgIE5hTiAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MjggYW5kICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODI5IGFuZCAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgzMCBhbmQgLUluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MzEgYW5kIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODMyIGFuZCAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgzMyBhbmQgLTAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MzQgYW5kICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODM1IGFuZCAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDgzNiBhbmQgIDEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4MzcgYW5kICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRhbmQ4NDEgYW5kICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDIgYW5kICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDMgYW5kICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDQgYW5kICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDUgYW5kICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDYgYW5kICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDcgYW5kICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDggYW5kICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NDkgYW5kICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTAgYW5kICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTEgYW5kIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTIgYW5kIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTMgYW5kIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTQgYW5kIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTUgYW5kICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTYgYW5kICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTcgYW5kICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTggYW5kICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NTkgYW5kICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZGFuZDg2MSBhbmQgIE5hTjEgICAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NjIgYW5kICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODYzIGFuZCAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg2NCBhbmQgIE5hTjQgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NjUgYW5kICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODY2IGFuZCAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg2NyBhbmQgLTEwMDAgICAgTmFOOCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NjggYW5kICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODY5IGFuZCAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg3MSBhbmQgIHNOYU4xMSAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NzIgYW5kICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODczIGFuZCAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg3NCBhbmQgIHNOYU4xNCAgIE5hTjE3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NzUgYW5kICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODc2IGFuZCAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg3NyBhbmQgLUluZiAgICArc05hTjIwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4NzggYW5kIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODc5IGFuZCAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg4MCBhbmQgIEluZiAgICAgc05hTjIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4ODEgYW5kICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODgyIGFuZCAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGFuZDg4MyBhbmQgLXNOYU4yNyAgc05hTjI5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRhbmQ4ODQgYW5kICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkYW5kODg1IGFuZCAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQmFzZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEJhc2UuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGZlYmY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEJhc2UuZGVjVGVzdApAQCAtMCwwICsxLDExMDQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRCYXNlLmRlY1Rlc3QgLS0gYmFzZSBkZWNEb3VibGUgPC0tPiBzdHJpbmcgY29udmVyc2lvbnMgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIGZpbGUgdGVzdHMgYmFzZSBjb252ZXJzaW9ucyBmcm9tIHN0cmluZyB0byBhIGRlY2ltYWwgbnVtYmVyCistLSBhbmQgYmFjayB0byBhIHN0cmluZyAoaW4gU2NpZW50aWZpYyBmb3JtKQorCistLSBOb3RlIHRoYXQgdW5saWtlIG90aGVyIG9wZXJhdGlvbnMgdGhlIG9wZXJhbmQgaXMgc3ViamVjdCB0byByb3VuZGluZworLS0gdG8gY29uZm9ybSB0byBlbWF4IGFuZCBwcmVjaXNpb24gc2V0dGluZ3MgKHRoYXQgaXMsIG51bWJlcnMgd2lsbAorLS0gY29uZm9ybSB0byBydWxlcyBhbmQgZXhwb25lbnQgd2lsbCBiZSBpbiBwZXJtaXR0ZWQgcmFuZ2UpLiAgVGhlCistLSAnbGVmdCBoYW5kIHNpZGUnLCB0aGVyZWZvcmUsIG1heSBoYXZlIG51bWJlcnMgdGhhdCBjYW5ub3QgYmUKKy0tIHJlcHJlc2VudGVkIGluIGEgZGVjRG91YmxlLiAgU29tZSB0ZXN0Y2FzZXMgZ28gdG8gdGhlIGxpbWl0IG9mIHRoZQorLS0gbmV4dC13aWRlciBmb3JtYXQsIGFuZCBoZW5jZSB0aGVzZSB0ZXN0Y2FzZXMgbWF5IGFsc28gYmUgdXNlZCB0bworLS0gdGVzdCBuYXJyb3dpbmcgYW5kIHdpZGVuaW5nIG9wZXJhdGlvbnMuCisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZGJhczAwMSB0b1NjaSAgICAgICAwIC0+IDAKK2RkYmFzMDAyIHRvU2NpICAgICAgIDEgLT4gMQorZGRiYXMwMDMgdG9TY2kgICAgIDEuMCAtPiAxLjAKK2RkYmFzMDA0IHRvU2NpICAgIDEuMDAgLT4gMS4wMAorZGRiYXMwMDUgdG9TY2kgICAgICAxMCAtPiAxMAorZGRiYXMwMDYgdG9TY2kgICAgMTAwMCAtPiAxMDAwCitkZGJhczAwNyB0b1NjaSAgICAxMC4wIC0+IDEwLjAKK2RkYmFzMDA4IHRvU2NpICAgIDEwLjEgLT4gMTAuMQorZGRiYXMwMDkgdG9TY2kgICAgMTAuNCAtPiAxMC40CitkZGJhczAxMCB0b1NjaSAgICAxMC41IC0+IDEwLjUKK2RkYmFzMDExIHRvU2NpICAgIDEwLjYgLT4gMTAuNgorZGRiYXMwMTIgdG9TY2kgICAgMTAuOSAtPiAxMC45CitkZGJhczAxMyB0b1NjaSAgICAxMS4wIC0+IDExLjAKK2RkYmFzMDE0IHRvU2NpICAxLjIzNCAtPiAxLjIzNAorZGRiYXMwMTUgdG9TY2kgIDAuMTIzIC0+IDAuMTIzCitkZGJhczAxNiB0b1NjaSAgMC4wMTIgLT4gMC4wMTIKK2RkYmFzMDE3IHRvU2NpICAtMCAgICAtPiAtMAorZGRiYXMwMTggdG9TY2kgIC0wLjAgIC0+IC0wLjAKK2RkYmFzMDE5IHRvU2NpIC0wMC4wMCAtPiAtMC4wMAorCitkZGJhczAyMSB0b1NjaSAgICAgLTEgLT4gLTEKK2RkYmFzMDIyIHRvU2NpICAgLTEuMCAtPiAtMS4wCitkZGJhczAyMyB0b1NjaSAgIC0wLjEgLT4gLTAuMQorZGRiYXMwMjQgdG9TY2kgICAtOS4xIC0+IC05LjEKK2RkYmFzMDI1IHRvU2NpICAgLTkuMTEgLT4gLTkuMTEKK2RkYmFzMDI2IHRvU2NpICAgLTkuMTE5IC0+IC05LjExOQorZGRiYXMwMjcgdG9TY2kgICAtOS45OTkgLT4gLTkuOTk5CisKK2RkYmFzMDMwIHRvU2NpICAnMTIzNDU2Nzg5LjEyMzQ1NicgICAtPiAnMTIzNDU2Nzg5LjEyMzQ1NicKK2RkYmFzMDMxIHRvU2NpICAnMTIzNDU2Nzg5LjAwMDAwMCcgICAtPiAnMTIzNDU2Nzg5LjAwMDAwMCcKK2RkYmFzMDMyIHRvU2NpICAgJzEyMzQ1Njc4OTEyMzQ1NicgICAtPiAnMTIzNDU2Nzg5MTIzNDU2JworZGRiYXMwMzMgdG9TY2kgICAnMC4wMDAwMTIzNDU2Nzg5JyAgIC0+ICcwLjAwMDAxMjM0NTY3ODknCitkZGJhczAzNCB0b1NjaSAgJzAuMDAwMDAxMjM0NTY3ODknICAgLT4gJzAuMDAwMDAxMjM0NTY3ODknCitkZGJhczAzNSB0b1NjaSAnMC4wMDAwMDAxMjM0NTY3ODknICAgLT4gJzEuMjM0NTY3ODlFLTcnCitkZGJhczAzNiB0b1NjaSAnMC4wMDAwMDAwMTIzNDU2Nzg5JyAgLT4gJzEuMjM0NTY3ODlFLTgnCisKK2RkYmFzMDM3IHRvU2NpICcwLjEyMzQ1Njc4OTAxMjM0NCcgICAtPiAnMC4xMjM0NTY3ODkwMTIzNDQnCitkZGJhczAzOCB0b1NjaSAnMC4xMjM0NTY3ODkwMTIzNDUnICAgLT4gJzAuMTIzNDU2Nzg5MDEyMzQ1JworCistLSB0ZXN0IGZpbml0ZSBib3VuZHMgKE5lZ3Mgb2YsIHRoZW4gMCwgTnRpbnksIE5taW4sIG90aGVyLCBObWF4KQorZGRic24wMDEgdG9TY2kgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkYnNuMDAyIHRvU2NpIC0xRS0zODMgLT4gLTFFLTM4MworZGRic24wMDMgdG9TY2kgLTFFLTM5OCAtPiAtMUUtMzk4IFN1Ym5vcm1hbAorZGRic24wMDQgdG9TY2kgLTAgLT4gLTAKK2RkYnNuMDA1IHRvU2NpICswIC0+ICAwCitkZGJzbjAwNiB0b1NjaSArMUUtMzk4IC0+ICAxRS0zOTggU3Vibm9ybWFsCitkZGJzbjAwNyB0b1NjaSArMUUtMzgzIC0+ICAxRS0zODMKK2RkYnNuMDA4IHRvU2NpICs5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CisKKy0tIFN0cmluZyBbbWFueSBtb3JlIGV4YW1wbGVzIGFyZSBpbXBsaWNpdGx5IHRlc3RlZCBlbHNld2hlcmVdCistLSBzdHJpbmdzIHdpdGhvdXQgRSBjYW5ub3QgZ2VuZXJhdGUgRSBpbiByZXN1bHQKK2RkYmFzMDQwIHRvU2NpICIxMiIgICAgICAgIC0+ICcxMicKK2RkYmFzMDQxIHRvU2NpICItNzYiICAgICAgIC0+ICctNzYnCitkZGJhczA0MiB0b1NjaSAiMTIuNzYiICAgICAtPiAnMTIuNzYnCitkZGJhczA0MyB0b1NjaSAiKzEyLjc2IiAgICAtPiAnMTIuNzYnCitkZGJhczA0NCB0b1NjaSAiMDEyLjc2IiAgICAtPiAnMTIuNzYnCitkZGJhczA0NSB0b1NjaSAiKzAuMDAzIiAgICAtPiAnMC4wMDMnCitkZGJhczA0NiB0b1NjaSAiMTcuIiAgICAgICAtPiAnMTcnCitkZGJhczA0NyB0b1NjaSAiLjUiICAgICAgICAtPiAnMC41JworZGRiYXMwNDggdG9TY2kgIjA0NCIgICAgICAgLT4gJzQ0JworZGRiYXMwNDkgdG9TY2kgIjAwNDQiICAgICAgLT4gJzQ0JworZGRiYXMwNTAgdG9TY2kgIjAuMDAwNSIgICAgICAtPiAnMC4wMDA1JworZGRiYXMwNTEgdG9TY2kgIjAwLjAwMDA1IiAgICAtPiAnMC4wMDAwNScKK2RkYmFzMDUyIHRvU2NpICIwLjAwMDAwNSIgICAgLT4gJzAuMDAwMDA1JworZGRiYXMwNTMgdG9TY2kgIjAuMDAwMDA1MCIgICAtPiAnMC4wMDAwMDUwJworZGRiYXMwNTQgdG9TY2kgIjAuMDAwMDAwNSIgICAtPiAnNUUtNycKK2RkYmFzMDU1IHRvU2NpICIwLjAwMDAwMDA1IiAgLT4gJzVFLTgnCitkZGJhczA1NiB0b1NjaSAiMTIzNDU2NzguNTQzMjEwIiAtPiAnMTIzNDU2NzguNTQzMjEwJworZGRiYXMwNTcgdG9TY2kgIjIzNDU2NzguNTQzMjEwIiAtPiAnMjM0NTY3OC41NDMyMTAnCitkZGJhczA1OCB0b1NjaSAiMzQ1Njc4LjU0MzIxMCIgLT4gJzM0NTY3OC41NDMyMTAnCitkZGJhczA1OSB0b1NjaSAiMDM0NTY3OC41NDMyMSIgLT4gJzM0NTY3OC41NDMyMScKK2RkYmFzMDYwIHRvU2NpICIzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworZGRiYXMwNjEgdG9TY2kgIiszNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworZGRiYXMwNjIgdG9TY2kgIiswMzQ1Njc4LjU0MzIiIC0+ICczNDU2NzguNTQzMicKK2RkYmFzMDYzIHRvU2NpICIrMDAzNDU2NzguNTQzMiIgLT4gJzM0NTY3OC41NDMyJworZGRiYXMwNjQgdG9TY2kgIi0zNDU2NzguNTQzMiIgIC0+ICctMzQ1Njc4LjU0MzInCitkZGJhczA2NSB0b1NjaSAiLTAzNDU2NzguNTQzMiIgIC0+ICctMzQ1Njc4LjU0MzInCitkZGJhczA2NiB0b1NjaSAiLTAwMzQ1Njc4LjU0MzIiICAtPiAnLTM0NTY3OC41NDMyJworLS0gZXhhbXBsZXMKK2RkYmFzMDY3IHRvU2NpICI1RS02IiAgICAgICAgLT4gJzAuMDAwMDA1JworZGRiYXMwNjggdG9TY2kgIjUwRS03IiAgICAgICAtPiAnMC4wMDAwMDUwJworZGRiYXMwNjkgdG9TY2kgIjVFLTciICAgICAgICAtPiAnNUUtNycKKworLS0gW05vIGV4b3RpY3MgYXMgbm8gVW5pY29kZV0KKworLS0gcm91bmRlZCB3aXRoIGRvdHMgaW4gYWxsIChpbmNsdWRpbmcgZWRnZSkgcGxhY2VzCitkZGJhczA3MSB0b1NjaSAgLjEyMzQ1Njc4OTAxMjM0NTYxMjMgIC0+IDAuMTIzNDU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDcyIHRvU2NpICAxLjIzNDU2Nzg5MDEyMzQ1NjEyMyAgLT4gMS4yMzQ1Njc4OTAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA3MyB0b1NjaSAgMTIuMzQ1Njc4OTAxMjM0NTYxMjMgIC0+IDEyLjM0NTY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwNzQgdG9TY2kgIDEyMy40NTY3ODkwMTIzNDU2MTIzICAtPiAxMjMuNDU2Nzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDc1IHRvU2NpICAxMjM0LjU2Nzg5MDEyMzQ1NjEyMyAgLT4gMTIzNC41Njc4OTAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA3NiB0b1NjaSAgMTIzNDUuNjc4OTAxMjM0NTYxMjMgIC0+IDEyMzQ1LjY3ODkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwNzcgdG9TY2kgIDEyMzQ1Ni43ODkwMTIzNDU2MTIzICAtPiAxMjM0NTYuNzg5MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDc4IHRvU2NpICAxMjM0NTY3Ljg5MDEyMzQ1NjEyMyAgLT4gMTIzNDU2Ny44OTAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA3OSB0b1NjaSAgMTIzNDU2NzguOTAxMjM0NTYxMjMgIC0+IDEyMzQ1Njc4LjkwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwODAgdG9TY2kgIDEyMzQ1Njc4OS4wMTIzNDU2MTIzICAtPiAxMjM0NTY3ODkuMDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDgxIHRvU2NpICAxMjM0NTY3ODkwLjEyMzQ1NjEyMyAgLT4gMTIzNDU2Nzg5MC4xMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA4MiB0b1NjaSAgMTIzNDU2Nzg5MDEuMjM0NTYxMjMgIC0+IDEyMzQ1Njc4OTAxLjIzNDU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwODMgdG9TY2kgIDEyMzQ1Njc4OTAxMi4zNDU2MTIzICAtPiAxMjM0NTY3ODkwMTIuMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDg0IHRvU2NpICAxMjM0NTY3ODkwMTIzLjQ1NjEyMyAgLT4gMTIzNDU2Nzg5MDEyMy40NTYgSW5leGFjdCBSb3VuZGVkCitkZGJhczA4NSB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQuNTYxMjMgIC0+IDEyMzQ1Njc4OTAxMjM0LjU2IEluZXhhY3QgUm91bmRlZAorZGRiYXMwODYgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NS42MTIzICAtPiAxMjM0NTY3ODkwMTIzNDUuNiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDg3IHRvU2NpICAxMjM0NTY3ODkwMTIzNDU2LjEyMyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGJhczA4OCB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1NjEuMjMgIC0+IDEuMjM0NTY3ODkwMTIzNDU2RSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMDg5IHRvU2NpICAxMjM0NTY3ODkwMTIzNDU2MTIuMyAgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFKzE3IEluZXhhY3QgUm91bmRlZAorZGRiYXMwOTAgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NTYxMjMuICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUrMTggSW5leGFjdCBSb3VuZGVkCisKKworLS0gTnVtYmVycyB3aXRoIEUKK2RkYmFzMTMwIHRvU2NpICIwLjAwMEUtMSIgIC0+ICcwLjAwMDAnCitkZGJhczEzMSB0b1NjaSAiMC4wMDBFLTIiICAtPiAnMC4wMDAwMCcKK2RkYmFzMTMyIHRvU2NpICIwLjAwMEUtMyIgIC0+ICcwLjAwMDAwMCcKK2RkYmFzMTMzIHRvU2NpICIwLjAwMEUtNCIgIC0+ICcwRS03JworZGRiYXMxMzQgdG9TY2kgIjAuMDBFLTIiICAgLT4gJzAuMDAwMCcKK2RkYmFzMTM1IHRvU2NpICIwLjAwRS0zIiAgIC0+ICcwLjAwMDAwJworZGRiYXMxMzYgdG9TY2kgIjAuMDBFLTQiICAgLT4gJzAuMDAwMDAwJworZGRiYXMxMzcgdG9TY2kgIjAuMDBFLTUiICAgLT4gJzBFLTcnCitkZGJhczEzOCB0b1NjaSAiKzBFKzkiICAgICAtPiAnMEUrOScKK2RkYmFzMTM5IHRvU2NpICItMEUrOSIgICAgIC0+ICctMEUrOScKK2RkYmFzMTQwIHRvU2NpICIxRSs5IiAgICAgIC0+ICcxRSs5JworZGRiYXMxNDEgdG9TY2kgIjFlKzA5IiAgICAgLT4gJzFFKzknCitkZGJhczE0MiB0b1NjaSAiMUUrOTAiICAgICAtPiAnMUUrOTAnCitkZGJhczE0MyB0b1NjaSAiKzFFKzAwOSIgICAtPiAnMUUrOScKK2RkYmFzMTQ0IHRvU2NpICIwRSs5IiAgICAgIC0+ICcwRSs5JworZGRiYXMxNDUgdG9TY2kgIjFFKzkiICAgICAgLT4gJzFFKzknCitkZGJhczE0NiB0b1NjaSAiMUUrMDkiICAgICAtPiAnMUUrOScKK2RkYmFzMTQ3IHRvU2NpICIxZSs5MCIgICAgIC0+ICcxRSs5MCcKK2RkYmFzMTQ4IHRvU2NpICIxRSswMDkiICAgIC0+ICcxRSs5JworZGRiYXMxNDkgdG9TY2kgIjAwMEUrOSIgICAgLT4gJzBFKzknCitkZGJhczE1MCB0b1NjaSAiMUU5IiAgICAgICAtPiAnMUUrOScKK2RkYmFzMTUxIHRvU2NpICIxZTA5IiAgICAgIC0+ICcxRSs5JworZGRiYXMxNTIgdG9TY2kgIjFFOTAiICAgICAgLT4gJzFFKzkwJworZGRiYXMxNTMgdG9TY2kgIjFFMDA5IiAgICAgLT4gJzFFKzknCitkZGJhczE1NCB0b1NjaSAiMEU5IiAgICAgICAtPiAnMEUrOScKK2RkYmFzMTU1IHRvU2NpICIwLjAwMGUrMCIgIC0+ICcwLjAwMCcKK2RkYmFzMTU2IHRvU2NpICIwLjAwMEUtMSIgIC0+ICcwLjAwMDAnCitkZGJhczE1NyB0b1NjaSAiNEUrOSIgICAgICAtPiAnNEUrOScKK2RkYmFzMTU4IHRvU2NpICI0NEUrOSIgICAgIC0+ICc0LjRFKzEwJworZGRiYXMxNTkgdG9TY2kgIjAuNzNlLTciICAgLT4gJzcuM0UtOCcKK2RkYmFzMTYwIHRvU2NpICIwMEUrOSIgICAgIC0+ICcwRSs5JworZGRiYXMxNjEgdG9TY2kgIjAwRS05IiAgICAgLT4gJzBFLTknCitkZGJhczE2MiB0b1NjaSAiMTBFKzkiICAgICAtPiAnMS4wRSsxMCcKK2RkYmFzMTYzIHRvU2NpICIxMEUrMDkiICAgIC0+ICcxLjBFKzEwJworZGRiYXMxNjQgdG9TY2kgIjEwZSs5MCIgICAgLT4gJzEuMEUrOTEnCitkZGJhczE2NSB0b1NjaSAiMTBFKzAwOSIgICAtPiAnMS4wRSsxMCcKK2RkYmFzMTY2IHRvU2NpICIxMDBlKzkiICAgIC0+ICcxLjAwRSsxMScKK2RkYmFzMTY3IHRvU2NpICIxMDBlKzA5IiAgIC0+ICcxLjAwRSsxMScKK2RkYmFzMTY4IHRvU2NpICIxMDBFKzkwIiAgIC0+ICcxLjAwRSs5MicKK2RkYmFzMTY5IHRvU2NpICIxMDBlKzAwOSIgIC0+ICcxLjAwRSsxMScKKworZGRiYXMxNzAgdG9TY2kgIjEuMjY1IiAgICAgLT4gJzEuMjY1JworZGRiYXMxNzEgdG9TY2kgIjEuMjY1RS0yMCIgLT4gJzEuMjY1RS0yMCcKK2RkYmFzMTcyIHRvU2NpICIxLjI2NUUtOCIgIC0+ICcxLjI2NUUtOCcKK2RkYmFzMTczIHRvU2NpICIxLjI2NUUtNCIgIC0+ICcwLjAwMDEyNjUnCitkZGJhczE3NCB0b1NjaSAiMS4yNjVFLTMiICAtPiAnMC4wMDEyNjUnCitkZGJhczE3NSB0b1NjaSAiMS4yNjVFLTIiICAtPiAnMC4wMTI2NScKK2RkYmFzMTc2IHRvU2NpICIxLjI2NUUtMSIgIC0+ICcwLjEyNjUnCitkZGJhczE3NyB0b1NjaSAiMS4yNjVFLTAiICAtPiAnMS4yNjUnCitkZGJhczE3OCB0b1NjaSAiMS4yNjVFKzEiICAtPiAnMTIuNjUnCitkZGJhczE3OSB0b1NjaSAiMS4yNjVFKzIiICAtPiAnMTI2LjUnCitkZGJhczE4MCB0b1NjaSAiMS4yNjVFKzMiICAtPiAnMTI2NScKK2RkYmFzMTgxIHRvU2NpICIxLjI2NUUrNCIgIC0+ICcxLjI2NUUrNCcKK2RkYmFzMTgyIHRvU2NpICIxLjI2NUUrOCIgIC0+ICcxLjI2NUUrOCcKK2RkYmFzMTgzIHRvU2NpICIxLjI2NUUrMjAiIC0+ICcxLjI2NUUrMjAnCisKK2RkYmFzMTkwIHRvU2NpICIxMi42NSIgICAgIC0+ICcxMi42NScKK2RkYmFzMTkxIHRvU2NpICIxMi42NUUtMjAiIC0+ICcxLjI2NUUtMTknCitkZGJhczE5MiB0b1NjaSAiMTIuNjVFLTgiICAtPiAnMS4yNjVFLTcnCitkZGJhczE5MyB0b1NjaSAiMTIuNjVFLTQiICAtPiAnMC4wMDEyNjUnCitkZGJhczE5NCB0b1NjaSAiMTIuNjVFLTMiICAtPiAnMC4wMTI2NScKK2RkYmFzMTk1IHRvU2NpICIxMi42NUUtMiIgIC0+ICcwLjEyNjUnCitkZGJhczE5NiB0b1NjaSAiMTIuNjVFLTEiICAtPiAnMS4yNjUnCitkZGJhczE5NyB0b1NjaSAiMTIuNjVFLTAiICAtPiAnMTIuNjUnCitkZGJhczE5OCB0b1NjaSAiMTIuNjVFKzEiICAtPiAnMTI2LjUnCitkZGJhczE5OSB0b1NjaSAiMTIuNjVFKzIiICAtPiAnMTI2NScKK2RkYmFzMjAwIHRvU2NpICIxMi42NUUrMyIgIC0+ICcxLjI2NUUrNCcKK2RkYmFzMjAxIHRvU2NpICIxMi42NUUrNCIgIC0+ICcxLjI2NUUrNScKK2RkYmFzMjAyIHRvU2NpICIxMi42NUUrOCIgIC0+ICcxLjI2NUUrOScKK2RkYmFzMjAzIHRvU2NpICIxMi42NUUrMjAiIC0+ICcxLjI2NUUrMjEnCisKK2RkYmFzMjEwIHRvU2NpICIxMjYuNSIgICAgIC0+ICcxMjYuNScKK2RkYmFzMjExIHRvU2NpICIxMjYuNUUtMjAiIC0+ICcxLjI2NUUtMTgnCitkZGJhczIxMiB0b1NjaSAiMTI2LjVFLTgiICAtPiAnMC4wMDAwMDEyNjUnCitkZGJhczIxMyB0b1NjaSAiMTI2LjVFLTQiICAtPiAnMC4wMTI2NScKK2RkYmFzMjE0IHRvU2NpICIxMjYuNUUtMyIgIC0+ICcwLjEyNjUnCitkZGJhczIxNSB0b1NjaSAiMTI2LjVFLTIiICAtPiAnMS4yNjUnCitkZGJhczIxNiB0b1NjaSAiMTI2LjVFLTEiICAtPiAnMTIuNjUnCitkZGJhczIxNyB0b1NjaSAiMTI2LjVFLTAiICAtPiAnMTI2LjUnCitkZGJhczIxOCB0b1NjaSAiMTI2LjVFKzEiICAtPiAnMTI2NScKK2RkYmFzMjE5IHRvU2NpICIxMjYuNUUrMiIgIC0+ICcxLjI2NUUrNCcKK2RkYmFzMjIwIHRvU2NpICIxMjYuNUUrMyIgIC0+ICcxLjI2NUUrNScKK2RkYmFzMjIxIHRvU2NpICIxMjYuNUUrNCIgIC0+ICcxLjI2NUUrNicKK2RkYmFzMjIyIHRvU2NpICIxMjYuNUUrOCIgIC0+ICcxLjI2NUUrMTAnCitkZGJhczIyMyB0b1NjaSAiMTI2LjVFKzIwIiAtPiAnMS4yNjVFKzIyJworCitkZGJhczIzMCB0b1NjaSAiMTI2NSIgICAgIC0+ICcxMjY1JworZGRiYXMyMzEgdG9TY2kgIjEyNjVFLTIwIiAtPiAnMS4yNjVFLTE3JworZGRiYXMyMzIgdG9TY2kgIjEyNjVFLTgiICAtPiAnMC4wMDAwMTI2NScKK2RkYmFzMjMzIHRvU2NpICIxMjY1RS00IiAgLT4gJzAuMTI2NScKK2RkYmFzMjM0IHRvU2NpICIxMjY1RS0zIiAgLT4gJzEuMjY1JworZGRiYXMyMzUgdG9TY2kgIjEyNjVFLTIiICAtPiAnMTIuNjUnCitkZGJhczIzNiB0b1NjaSAiMTI2NUUtMSIgIC0+ICcxMjYuNScKK2RkYmFzMjM3IHRvU2NpICIxMjY1RS0wIiAgLT4gJzEyNjUnCitkZGJhczIzOCB0b1NjaSAiMTI2NUUrMSIgIC0+ICcxLjI2NUUrNCcKK2RkYmFzMjM5IHRvU2NpICIxMjY1RSsyIiAgLT4gJzEuMjY1RSs1JworZGRiYXMyNDAgdG9TY2kgIjEyNjVFKzMiICAtPiAnMS4yNjVFKzYnCitkZGJhczI0MSB0b1NjaSAiMTI2NUUrNCIgIC0+ICcxLjI2NUUrNycKK2RkYmFzMjQyIHRvU2NpICIxMjY1RSs4IiAgLT4gJzEuMjY1RSsxMScKK2RkYmFzMjQzIHRvU2NpICIxMjY1RSsyMCIgLT4gJzEuMjY1RSsyMycKK2RkYmFzMjQ0IHRvU2NpICIxMjY1RS05IiAgLT4gJzAuMDAwMDAxMjY1JworZGRiYXMyNDUgdG9TY2kgIjEyNjVFLTEwIiAtPiAnMS4yNjVFLTcnCitkZGJhczI0NiB0b1NjaSAiMTI2NUUtMTEiIC0+ICcxLjI2NUUtOCcKK2RkYmFzMjQ3IHRvU2NpICIxMjY1RS0xMiIgLT4gJzEuMjY1RS05JworCitkZGJhczI1MCB0b1NjaSAiMC4xMjY1IiAgICAgLT4gJzAuMTI2NScKK2RkYmFzMjUxIHRvU2NpICIwLjEyNjVFLTIwIiAtPiAnMS4yNjVFLTIxJworZGRiYXMyNTIgdG9TY2kgIjAuMTI2NUUtOCIgIC0+ICcxLjI2NUUtOScKK2RkYmFzMjUzIHRvU2NpICIwLjEyNjVFLTQiICAtPiAnMC4wMDAwMTI2NScKK2RkYmFzMjU0IHRvU2NpICIwLjEyNjVFLTMiICAtPiAnMC4wMDAxMjY1JworZGRiYXMyNTUgdG9TY2kgIjAuMTI2NUUtMiIgIC0+ICcwLjAwMTI2NScKK2RkYmFzMjU2IHRvU2NpICIwLjEyNjVFLTEiICAtPiAnMC4wMTI2NScKK2RkYmFzMjU3IHRvU2NpICIwLjEyNjVFLTAiICAtPiAnMC4xMjY1JworZGRiYXMyNTggdG9TY2kgIjAuMTI2NUUrMSIgIC0+ICcxLjI2NScKK2RkYmFzMjU5IHRvU2NpICIwLjEyNjVFKzIiICAtPiAnMTIuNjUnCitkZGJhczI2MCB0b1NjaSAiMC4xMjY1RSszIiAgLT4gJzEyNi41JworZGRiYXMyNjEgdG9TY2kgIjAuMTI2NUUrNCIgIC0+ICcxMjY1JworZGRiYXMyNjIgdG9TY2kgIjAuMTI2NUUrOCIgIC0+ICcxLjI2NUUrNycKK2RkYmFzMjYzIHRvU2NpICIwLjEyNjVFKzIwIiAtPiAnMS4yNjVFKzE5JworCistLSBzb21lIG1vcmUgbmVnYXRpdmUgemVyb3MgW3N5c3RlbWF0aWMgdGVzdHMgYmVsb3ddCitkZGJhczI5MCB0b1NjaSAiLTAuMDAwRS0xIiAgLT4gJy0wLjAwMDAnCitkZGJhczI5MSB0b1NjaSAiLTAuMDAwRS0yIiAgLT4gJy0wLjAwMDAwJworZGRiYXMyOTIgdG9TY2kgIi0wLjAwMEUtMyIgIC0+ICctMC4wMDAwMDAnCitkZGJhczI5MyB0b1NjaSAiLTAuMDAwRS00IiAgLT4gJy0wRS03JworZGRiYXMyOTQgdG9TY2kgIi0wLjAwRS0yIiAgIC0+ICctMC4wMDAwJworZGRiYXMyOTUgdG9TY2kgIi0wLjAwRS0zIiAgIC0+ICctMC4wMDAwMCcKK2RkYmFzMjk2IHRvU2NpICItMC4wRS0yIiAgICAtPiAnLTAuMDAwJworZGRiYXMyOTcgdG9TY2kgIi0wLjBFLTMiICAgIC0+ICctMC4wMDAwJworZGRiYXMyOTggdG9TY2kgIi0wRS0yIiAgICAgIC0+ICctMC4wMCcKK2RkYmFzMjk5IHRvU2NpICItMEUtMyIgICAgICAtPiAnLTAuMDAwJworCistLSBFbmdpbmVlcmluZyBub3RhdGlvbiB0ZXN0cworZGRiYXMzMDEgIHRvU2NpIDEwZTEyICAtPiAxLjBFKzEzCitkZGJhczMwMiAgdG9FbmcgMTBlMTIgIC0+IDEwRSsxMgorZGRiYXMzMDMgIHRvU2NpIDEwZTExICAtPiAxLjBFKzEyCitkZGJhczMwNCAgdG9FbmcgMTBlMTEgIC0+IDEuMEUrMTIKK2RkYmFzMzA1ICB0b1NjaSAxMGUxMCAgLT4gMS4wRSsxMQorZGRiYXMzMDYgIHRvRW5nIDEwZTEwICAtPiAxMDBFKzkKK2RkYmFzMzA3ICB0b1NjaSAxMGU5ICAgLT4gMS4wRSsxMAorZGRiYXMzMDggIHRvRW5nIDEwZTkgICAtPiAxMEUrOQorZGRiYXMzMDkgIHRvU2NpIDEwZTggICAtPiAxLjBFKzkKK2RkYmFzMzEwICB0b0VuZyAxMGU4ICAgLT4gMS4wRSs5CitkZGJhczMxMSAgdG9TY2kgMTBlNyAgIC0+IDEuMEUrOAorZGRiYXMzMTIgIHRvRW5nIDEwZTcgICAtPiAxMDBFKzYKK2RkYmFzMzEzICB0b1NjaSAxMGU2ICAgLT4gMS4wRSs3CitkZGJhczMxNCAgdG9FbmcgMTBlNiAgIC0+IDEwRSs2CitkZGJhczMxNSAgdG9TY2kgMTBlNSAgIC0+IDEuMEUrNgorZGRiYXMzMTYgIHRvRW5nIDEwZTUgICAtPiAxLjBFKzYKK2RkYmFzMzE3ICB0b1NjaSAxMGU0ICAgLT4gMS4wRSs1CitkZGJhczMxOCAgdG9FbmcgMTBlNCAgIC0+IDEwMEUrMworZGRiYXMzMTkgIHRvU2NpIDEwZTMgICAtPiAxLjBFKzQKK2RkYmFzMzIwICB0b0VuZyAxMGUzICAgLT4gMTBFKzMKK2RkYmFzMzIxICB0b1NjaSAxMGUyICAgLT4gMS4wRSszCitkZGJhczMyMiAgdG9FbmcgMTBlMiAgIC0+IDEuMEUrMworZGRiYXMzMjMgIHRvU2NpIDEwZTEgICAtPiAxLjBFKzIKK2RkYmFzMzI0ICB0b0VuZyAxMGUxICAgLT4gMTAwCitkZGJhczMyNSAgdG9TY2kgMTBlMCAgIC0+IDEwCitkZGJhczMyNiAgdG9FbmcgMTBlMCAgIC0+IDEwCitkZGJhczMyNyAgdG9TY2kgMTBlLTEgIC0+IDEuMAorZGRiYXMzMjggIHRvRW5nIDEwZS0xICAtPiAxLjAKK2RkYmFzMzI5ICB0b1NjaSAxMGUtMiAgLT4gMC4xMAorZGRiYXMzMzAgIHRvRW5nIDEwZS0yICAtPiAwLjEwCitkZGJhczMzMSAgdG9TY2kgMTBlLTMgIC0+IDAuMDEwCitkZGJhczMzMiAgdG9FbmcgMTBlLTMgIC0+IDAuMDEwCitkZGJhczMzMyAgdG9TY2kgMTBlLTQgIC0+IDAuMDAxMAorZGRiYXMzMzQgIHRvRW5nIDEwZS00ICAtPiAwLjAwMTAKK2RkYmFzMzM1ICB0b1NjaSAxMGUtNSAgLT4gMC4wMDAxMAorZGRiYXMzMzYgIHRvRW5nIDEwZS01ICAtPiAwLjAwMDEwCitkZGJhczMzNyAgdG9TY2kgMTBlLTYgIC0+IDAuMDAwMDEwCitkZGJhczMzOCAgdG9FbmcgMTBlLTYgIC0+IDAuMDAwMDEwCitkZGJhczMzOSAgdG9TY2kgMTBlLTcgIC0+IDAuMDAwMDAxMAorZGRiYXMzNDAgIHRvRW5nIDEwZS03ICAtPiAwLjAwMDAwMTAKK2RkYmFzMzQxICB0b1NjaSAxMGUtOCAgLT4gMS4wRS03CitkZGJhczM0MiAgdG9FbmcgMTBlLTggIC0+IDEwMEUtOQorZGRiYXMzNDMgIHRvU2NpIDEwZS05ICAtPiAxLjBFLTgKK2RkYmFzMzQ0ICB0b0VuZyAxMGUtOSAgLT4gMTBFLTkKK2RkYmFzMzQ1ICB0b1NjaSAxMGUtMTAgLT4gMS4wRS05CitkZGJhczM0NiAgdG9FbmcgMTBlLTEwIC0+IDEuMEUtOQorZGRiYXMzNDcgIHRvU2NpIDEwZS0xMSAtPiAxLjBFLTEwCitkZGJhczM0OCAgdG9FbmcgMTBlLTExIC0+IDEwMEUtMTIKK2RkYmFzMzQ5ICB0b1NjaSAxMGUtMTIgLT4gMS4wRS0xMQorZGRiYXMzNTAgIHRvRW5nIDEwZS0xMiAtPiAxMEUtMTIKK2RkYmFzMzUxICB0b1NjaSAxMGUtMTMgLT4gMS4wRS0xMgorZGRiYXMzNTIgIHRvRW5nIDEwZS0xMyAtPiAxLjBFLTEyCisKK2RkYmFzMzYxICB0b1NjaSA3RTEyICAtPiA3RSsxMgorZGRiYXMzNjIgIHRvRW5nIDdFMTIgIC0+IDdFKzEyCitkZGJhczM2MyAgdG9TY2kgN0UxMSAgLT4gN0UrMTEKK2RkYmFzMzY0ICB0b0VuZyA3RTExICAtPiA3MDBFKzkKK2RkYmFzMzY1ICB0b1NjaSA3RTEwICAtPiA3RSsxMAorZGRiYXMzNjYgIHRvRW5nIDdFMTAgIC0+IDcwRSs5CitkZGJhczM2NyAgdG9TY2kgN0U5ICAgLT4gN0UrOQorZGRiYXMzNjggIHRvRW5nIDdFOSAgIC0+IDdFKzkKK2RkYmFzMzY5ICB0b1NjaSA3RTggICAtPiA3RSs4CitkZGJhczM3MCAgdG9FbmcgN0U4ICAgLT4gNzAwRSs2CitkZGJhczM3MSAgdG9TY2kgN0U3ICAgLT4gN0UrNworZGRiYXMzNzIgIHRvRW5nIDdFNyAgIC0+IDcwRSs2CitkZGJhczM3MyAgdG9TY2kgN0U2ICAgLT4gN0UrNgorZGRiYXMzNzQgIHRvRW5nIDdFNiAgIC0+IDdFKzYKK2RkYmFzMzc1ICB0b1NjaSA3RTUgICAtPiA3RSs1CitkZGJhczM3NiAgdG9FbmcgN0U1ICAgLT4gNzAwRSszCitkZGJhczM3NyAgdG9TY2kgN0U0ICAgLT4gN0UrNAorZGRiYXMzNzggIHRvRW5nIDdFNCAgIC0+IDcwRSszCitkZGJhczM3OSAgdG9TY2kgN0UzICAgLT4gN0UrMworZGRiYXMzODAgIHRvRW5nIDdFMyAgIC0+IDdFKzMKK2RkYmFzMzgxICB0b1NjaSA3RTIgICAtPiA3RSsyCitkZGJhczM4MiAgdG9FbmcgN0UyICAgLT4gNzAwCitkZGJhczM4MyAgdG9TY2kgN0UxICAgLT4gN0UrMQorZGRiYXMzODQgIHRvRW5nIDdFMSAgIC0+IDcwCitkZGJhczM4NSAgdG9TY2kgN0UwICAgLT4gNworZGRiYXMzODYgIHRvRW5nIDdFMCAgIC0+IDcKK2RkYmFzMzg3ICB0b1NjaSA3RS0xICAtPiAwLjcKK2RkYmFzMzg4ICB0b0VuZyA3RS0xICAtPiAwLjcKK2RkYmFzMzg5ICB0b1NjaSA3RS0yICAtPiAwLjA3CitkZGJhczM5MCAgdG9FbmcgN0UtMiAgLT4gMC4wNworZGRiYXMzOTEgIHRvU2NpIDdFLTMgIC0+IDAuMDA3CitkZGJhczM5MiAgdG9FbmcgN0UtMyAgLT4gMC4wMDcKK2RkYmFzMzkzICB0b1NjaSA3RS00ICAtPiAwLjAwMDcKK2RkYmFzMzk0ICB0b0VuZyA3RS00ICAtPiAwLjAwMDcKK2RkYmFzMzk1ICB0b1NjaSA3RS01ICAtPiAwLjAwMDA3CitkZGJhczM5NiAgdG9FbmcgN0UtNSAgLT4gMC4wMDAwNworZGRiYXMzOTcgIHRvU2NpIDdFLTYgIC0+IDAuMDAwMDA3CitkZGJhczM5OCAgdG9FbmcgN0UtNiAgLT4gMC4wMDAwMDcKK2RkYmFzMzk5ICB0b1NjaSA3RS03ICAtPiA3RS03CitkZGJhczQwMCAgdG9FbmcgN0UtNyAgLT4gNzAwRS05CitkZGJhczQwMSAgdG9TY2kgN0UtOCAgLT4gN0UtOAorZGRiYXM0MDIgIHRvRW5nIDdFLTggIC0+IDcwRS05CitkZGJhczQwMyAgdG9TY2kgN0UtOSAgLT4gN0UtOQorZGRiYXM0MDQgIHRvRW5nIDdFLTkgIC0+IDdFLTkKK2RkYmFzNDA1ICB0b1NjaSA3RS0xMCAtPiA3RS0xMAorZGRiYXM0MDYgIHRvRW5nIDdFLTEwIC0+IDcwMEUtMTIKK2RkYmFzNDA3ICB0b1NjaSA3RS0xMSAtPiA3RS0xMQorZGRiYXM0MDggIHRvRW5nIDdFLTExIC0+IDcwRS0xMgorZGRiYXM0MDkgIHRvU2NpIDdFLTEyIC0+IDdFLTEyCitkZGJhczQxMCAgdG9FbmcgN0UtMTIgLT4gN0UtMTIKK2RkYmFzNDExICB0b1NjaSA3RS0xMyAtPiA3RS0xMworZGRiYXM0MTIgIHRvRW5nIDdFLTEzIC0+IDcwMEUtMTUKKworLS0gRXhhY3RzIHJlbWFpbiBleGFjdCB1cCB0byBwcmVjaXNpb24gLi4KK3JvdW5kaW5nOiAgaGFsZl91cAorZGRiYXM0MjAgIHRvU2NpICAgIDEwMCAtPiAxMDAKK2RkYmFzNDIxICB0b0VuZyAgICAxMDAgLT4gMTAwCitkZGJhczQyMiAgdG9TY2kgICAxMDAwIC0+IDEwMDAKK2RkYmFzNDIzICB0b0VuZyAgIDEwMDAgLT4gMTAwMAorZGRiYXM0MjQgIHRvU2NpICA5OTkuOSAtPiAgOTk5LjkKK2RkYmFzNDI1ICB0b0VuZyAgOTk5LjkgLT4gIDk5OS45CitkZGJhczQyNiAgdG9TY2kgMTAwMC4wIC0+IDEwMDAuMAorZGRiYXM0MjcgIHRvRW5nIDEwMDAuMCAtPiAxMDAwLjAKK2RkYmFzNDI4ICB0b1NjaSAxMDAwLjEgLT4gMTAwMC4xCitkZGJhczQyOSAgdG9FbmcgMTAwMC4xIC0+IDEwMDAuMQorZGRiYXM0MzAgIHRvU2NpIDEwMDAwIC0+IDEwMDAwCitkZGJhczQzMSAgdG9FbmcgMTAwMDAgLT4gMTAwMDAKK2RkYmFzNDMyICB0b1NjaSAxMDAwMDAgLT4gMTAwMDAwCitkZGJhczQzMyAgdG9FbmcgMTAwMDAwIC0+IDEwMDAwMAorZGRiYXM0MzQgIHRvU2NpIDEwMDAwMDAgLT4gMTAwMDAwMAorZGRiYXM0MzUgIHRvRW5nIDEwMDAwMDAgLT4gMTAwMDAwMAorZGRiYXM0MzYgIHRvU2NpIDEwMDAwMDAwIC0+IDEwMDAwMDAwCitkZGJhczQzNyAgdG9FbmcgMTAwMDAwMDAgLT4gMTAwMDAwMDAKK2RkYmFzNDM4ICB0b1NjaSAxMDAwMDAwMDAgLT4gMTAwMDAwMDAwCitkZGJhczQzOSAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwCitkZGJhczQ0MCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE2ICAgUm91bmRlZAorZGRiYXM0NDEgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAwICAgIC0+IDEwLjAwMDAwMDAwMDAwMDAwRSsxNSAgIFJvdW5kZWQKK2RkYmFzNDQyICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMSAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDQzICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwMSAgICAtPiAxMC4wMDAwMDAwMDAwMDAwMEUrMTUgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDQ0ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMyAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDQ1ICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwMyAgICAtPiAxMC4wMDAwMDAwMDAwMDAwMEUrMTUgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDQ2ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwNSAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTYgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDQ3ICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwNSAgICAtPiAxMC4wMDAwMDAwMDAwMDAwMUUrMTUgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDQ4ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwNTAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTcgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDQ5ICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwNTAgICAtPiAxMDAuMDAwMDAwMDAwMDAwMUUrMTUgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDUwICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwOSAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTYgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDUxICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwOSAgICAtPiAxMC4wMDAwMDAwMDAwMDAwMUUrMTUgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDUyICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTcgICBSb3VuZGVkCitkZGJhczQ1MyAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDAwICAgLT4gMTAwLjAwMDAwMDAwMDAwMDBFKzE1ICAgUm91bmRlZAorZGRiYXM0NTQgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMyAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTUgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAwMyAgIC0+IDEwMC4wMDAwMDAwMDAwMDAwRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTYgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwNSAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTcgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAwNSAgIC0+IDEwMC4wMDAwMDAwMDAwMDAwRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTggIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwOSAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NTkgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAwOSAgIC0+IDEwMC4wMDAwMDAwMDAwMDAwRSsxNSAgIFJvdW5kZWQgSW5leGFjdAorZGRiYXM0NjAgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxOCAgIFJvdW5kZWQKK2RkYmFzNDYxICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTggICBSb3VuZGVkCitkZGJhczQ2MiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDMwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE4ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ2MyAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDMwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE4ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ2NCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDUwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDFFKzE4ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ2NSAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDUwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDFFKzE4ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ2NiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDkwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDFFKzE4ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ2NyAgdG9FbmcgMTAwMDAwMDAwMDAwMDAwMDkwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDFFKzE4ICAgUm91bmRlZCBJbmV4YWN0CitkZGJhczQ2OCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE5ICAgUm91bmRlZAorZGRiYXM0NjkgIHRvRW5nIDEwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwLjAwMDAwMDAwMDAwMDAwRSsxOCAgIFJvdW5kZWQKK2RkYmFzNDcwICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMzAwMCAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMTkgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDcxICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwMzAwMCAtPiAxMC4wMDAwMDAwMDAwMDAwMEUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDcyICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwNTAwMCAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTkgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDczICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwNTAwMCAtPiAxMC4wMDAwMDAwMDAwMDAwMUUrMTggICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDc0ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwOTAwMCAtPiAxLjAwMDAwMDAwMDAwMDAwMUUrMTkgICBSb3VuZGVkIEluZXhhY3QKK2RkYmFzNDc1ICB0b0VuZyAxMDAwMDAwMDAwMDAwMDAwOTAwMCAtPiAxMC4wMDAwMDAwMDAwMDAwMUUrMTggICBSb3VuZGVkIEluZXhhY3QKKworLS0gY2hlY2sgcm91bmRpbmcgbW9kZXMgaGVlZGVkCityb3VuZGluZzogIGNlaWxpbmcKK2RkYnNyNDAxICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I0MDIgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDAzICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQwNCAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICB1cAorZGRic3I0MDUgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjQwNiAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MDcgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDA4ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGZsb29yCitkZGJzcjQxMCAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNDExICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQxMiAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MTMgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9kb3duCitkZGJzcjQxNSAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNDE2ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQxNyAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MTggIHRvU2NpICAxLjExMTExMTExMTExMjM0NjUwICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDE5ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZXZlbgorZGRic3I0MjEgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjQyMiAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MjMgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDI0ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDY1MCAgIC0+ICAxLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQyNSAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBkb3duCitkZGJzcjQyNiAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNDI3ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQyOCAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MjkgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl91cAorZGRic3I0MzEgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjQzMiAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I0MzMgIHRvU2NpICAxLjExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNDM0ICB0b1NjaSAgMS4xMTExMTExMTExMTIzNDY1MCAgIC0+ICAxLjExMTExMTExMTExMjM0NyAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjQzNSAgdG9TY2kgIDEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorLS0gbmVnYXRpdmVzCityb3VuZGluZzogIGNlaWxpbmcKK2RkYnNyNTAxICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZAorZGRic3I1MDIgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTAzICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUwNCAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICB1cAorZGRic3I1MDUgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjUwNiAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MDcgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTA4ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGZsb29yCitkZGJzcjUxMCAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNTExICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUxMiAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MTMgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9kb3duCitkZGJzcjUxNSAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNTE2ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUxNyAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MTggIHRvU2NpIC0xLjExMTExMTExMTExMjM0NjUwICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTE5ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGhhbGZfZXZlbgorZGRic3I1MjEgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjUyMiAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MjMgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTI0ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDY1MCAgIC0+IC0xLjExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUyNSAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBkb3duCitkZGJzcjUyNiAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RkYnNyNTI3ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUyOCAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MjkgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl91cAorZGRic3I1MzEgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkZGJzcjUzMiAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZGRic3I1MzMgIHRvU2NpIC0xLjExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RkYnNyNTM0ICB0b1NjaSAtMS4xMTExMTExMTExMTIzNDY1MCAgIC0+IC0xLjExMTExMTExMTExMjM0NyAgUm91bmRlZCBJbmV4YWN0CitkZGJzcjUzNSAgdG9TY2kgLTEuMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFRoZSAnYmFkZGllcycgdGVzdHMgZnJvbSBEaWFnQmlnRGVjaW1hbCwgcGx1cyBzb21lIG5ldyBvbmVzCitkZGJhczUwMCB0b1NjaSAnMS4uMicgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTAxIHRvU2NpICcuJyAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MDIgdG9TY2kgJy4uJyAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUwMyB0b1NjaSAnKysxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTA0IHRvU2NpICctLTEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MDUgdG9TY2kgJy0rMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUwNiB0b1NjaSAnKy0xJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTA3IHRvU2NpICcxMmUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MDggdG9TY2kgJzEyZSsrJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUwOSB0b1NjaSAnMTJmNCcgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTEwIHRvU2NpICcgKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MTEgdG9TY2kgJysgMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUxMiB0b1NjaSAnMTIgJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTEzIHRvU2NpICcgKyAxJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MTQgdG9TY2kgJyAtIDEgJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUxNSB0b1NjaSAneCcgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTE2IHRvU2NpICctMS0nICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MTcgdG9TY2kgJzEyLScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUxOCB0b1NjaSAnMysnICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTE5IHRvU2NpICcnICAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MjAgdG9TY2kgJzFlLScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUyMSB0b1NjaSAnN2U5OTk5OWEnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTIyIHRvU2NpICc3ZTEyMzU2Nzg5MHgnICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MjMgdG9TY2kgJzdlMTIzNTY3ODkwMTJ4JyAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUyNCB0b1NjaSAnJyAgICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTI1IHRvU2NpICdlMTAwJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MjYgdG9TY2kgJ1x1MGU1YScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUyNyB0b1NjaSAnXHUwYjY1JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTI4IHRvU2NpICcxMjMsNjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MjkgdG9TY2kgJzEuMzQuNScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUzMCB0b1NjaSAnLjEyMy41JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTMxIHRvU2NpICcwMS4zNS4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MzIgdG9TY2kgJzAxLjM1LScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUzMyB0b1NjaSAnMDAwMC4uJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTM0IHRvU2NpICcuMDAwMC4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MzUgdG9TY2kgJzAwLi4wMCcgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUzNiB0b1NjaSAnMTExZSoxMjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTM3IHRvU2NpICcxMTFlMTIzLScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1MzggdG9TY2kgJzExMWUrMTIrJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczUzOSB0b1NjaSAnMTExZTEtMy0nICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTQwIHRvU2NpICcxMTFlMSoyMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NDEgdG9TY2kgJzExMWUxZSszJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU0MiB0b1NjaSAnMWUxLjAnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTQzIHRvU2NpICcxZTEyM2UnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NDQgdG9TY2kgJ3RlbicgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU0NSB0b1NjaSAnT05FJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTQ2IHRvU2NpICcxZS4xJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NDcgdG9TY2kgJzFlMS4nICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU0OCB0b1NjaSAnMWVlJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTQ5IHRvU2NpICdlKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NTAgdG9TY2kgJzEuMjMuNCcgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU1MSB0b1NjaSAnMS4yLjEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTUyIHRvU2NpICcxRSsxLjInICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NTMgdG9TY2kgJzFFKzEuMi4zJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU1NCB0b1NjaSAnMUUrKzEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTU1IHRvU2NpICcxRS0tMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NTYgdG9TY2kgJzFFKy0xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU1NyB0b1NjaSAnMUUtKzEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTU4IHRvU2NpICcxRScnMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NTkgdG9TY2kgIjFFIiIxIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU2MCB0b1NjaSAiMUUiIiIiIiAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKKy0tIE5lYXItc3BlY2lhbHMKK2RkYmFzNTYxIHRvU2NpICJxTmFOIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NjIgdG9TY2kgIk5hTnEiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU2MyB0b1NjaSAiTmFOcyIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTY0IHRvU2NpICJJbmZpIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NjUgdG9TY2kgIkluZmluIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU2NiB0b1NjaSAiSW5maW5pIiAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTY3IHRvU2NpICJJbmZpbml0IiAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NjggdG9TY2kgIi1JbmZpbml0IiAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU2OSB0b1NjaSAiMEluZiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTcwIHRvU2NpICI5SW5mIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NzEgdG9TY2kgIi0wSW5mIiAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU3MiB0b1NjaSAiLTlJbmYiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTczIHRvU2NpICItc05hIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM1NzQgdG9TY2kgInhOYU4iICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU3NSB0b1NjaSAiMHNOYU4iICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworLS0gc29tZSBiYWRkaWVzIHdpdGggZG90cyBhbmQgRXMgYW5kIGRvdHMgYW5kIHNwZWNpYWxzCitkZGJhczU3NiB0b1NjaSAgJ2UrMScgICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU3NyB0b1NjaSAgJy5lKzEnICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU3OCB0b1NjaSAgJysuZSsxJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU3OSB0b1NjaSAgJy0uZSsnICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU4MCB0b1NjaSAgJy0uZScgICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU4MSB0b1NjaSAgJ0UrMScgICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU4MiB0b1NjaSAgJy5FKzEnICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU4MyB0b1NjaSAgJysuRSsxJyAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU4NCB0b1NjaSAgJy0uRSsnICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczU4NSB0b1NjaSAgJy0uRScgICAgICAgICAgICAtPiAgTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2RkYmFzNTg2IHRvU2NpICAnLk5hTicgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTg3IHRvU2NpICAnLS5OYU4nICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTg4IHRvU2NpICAnKy5zTmFOJyAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTg5IHRvU2NpICAnKy5JbmYnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNTkwIHRvU2NpICAnLkluZmluaXR5JyAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworLS0gWmVyb3MKK2RkYmFzNjAxIHRvU2NpIDAuMDAwMDAwMDAwICAgICAgIC0+IDBFLTkKK2RkYmFzNjAyIHRvU2NpIDAuMDAwMDAwMDAgICAgICAgIC0+IDBFLTgKK2RkYmFzNjAzIHRvU2NpIDAuMDAwMDAwMCAgICAgICAgIC0+IDBFLTcKK2RkYmFzNjA0IHRvU2NpIDAuMDAwMDAwICAgICAgICAgIC0+IDAuMDAwMDAwCitkZGJhczYwNSB0b1NjaSAwLjAwMDAwICAgICAgICAgICAtPiAwLjAwMDAwCitkZGJhczYwNiB0b1NjaSAwLjAwMDAgICAgICAgICAgICAtPiAwLjAwMDAKK2RkYmFzNjA3IHRvU2NpIDAuMDAwICAgICAgICAgICAgIC0+IDAuMDAwCitkZGJhczYwOCB0b1NjaSAwLjAwICAgICAgICAgICAgICAtPiAwLjAwCitkZGJhczYwOSB0b1NjaSAwLjAgICAgICAgICAgICAgICAtPiAwLjAKK2RkYmFzNjEwIHRvU2NpICAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZGRiYXM2MTEgdG9TY2kgMC4gICAgICAgICAgICAgICAgLT4gMAorZGRiYXM2MTIgdG9TY2kgLS4wICAgICAgICAgICAgICAgLT4gLTAuMAorZGRiYXM2MTMgdG9TY2kgLTAuICAgICAgICAgICAgICAgLT4gLTAKK2RkYmFzNjE0IHRvU2NpIC0wLjAgICAgICAgICAgICAgIC0+IC0wLjAKK2RkYmFzNjE1IHRvU2NpIC0wLjAwICAgICAgICAgICAgIC0+IC0wLjAwCitkZGJhczYxNiB0b1NjaSAtMC4wMDAgICAgICAgICAgICAtPiAtMC4wMDAKK2RkYmFzNjE3IHRvU2NpIC0wLjAwMDAgICAgICAgICAgIC0+IC0wLjAwMDAKK2RkYmFzNjE4IHRvU2NpIC0wLjAwMDAwICAgICAgICAgIC0+IC0wLjAwMDAwCitkZGJhczYxOSB0b1NjaSAtMC4wMDAwMDAgICAgICAgICAtPiAtMC4wMDAwMDAKK2RkYmFzNjIwIHRvU2NpIC0wLjAwMDAwMDAgICAgICAgIC0+IC0wRS03CitkZGJhczYyMSB0b1NjaSAtMC4wMDAwMDAwMCAgICAgICAtPiAtMEUtOAorZGRiYXM2MjIgdG9TY2kgLTAuMDAwMDAwMDAwICAgICAgLT4gLTBFLTkKKworZGRiYXM2MzAgdG9TY2kgIDAuMDBFKzAgICAgICAgICAgLT4gMC4wMAorZGRiYXM2MzEgdG9TY2kgIDAuMDBFKzEgICAgICAgICAgLT4gMC4wCitkZGJhczYzMiB0b1NjaSAgMC4wMEUrMiAgICAgICAgICAtPiAwCitkZGJhczYzMyB0b1NjaSAgMC4wMEUrMyAgICAgICAgICAtPiAwRSsxCitkZGJhczYzNCB0b1NjaSAgMC4wMEUrNCAgICAgICAgICAtPiAwRSsyCitkZGJhczYzNSB0b1NjaSAgMC4wMEUrNSAgICAgICAgICAtPiAwRSszCitkZGJhczYzNiB0b1NjaSAgMC4wMEUrNiAgICAgICAgICAtPiAwRSs0CitkZGJhczYzNyB0b1NjaSAgMC4wMEUrNyAgICAgICAgICAtPiAwRSs1CitkZGJhczYzOCB0b1NjaSAgMC4wMEUrOCAgICAgICAgICAtPiAwRSs2CitkZGJhczYzOSB0b1NjaSAgMC4wMEUrOSAgICAgICAgICAtPiAwRSs3CisKK2RkYmFzNjQwIHRvU2NpICAwLjBFKzAgICAgICAgICAgIC0+IDAuMAorZGRiYXM2NDEgdG9TY2kgIDAuMEUrMSAgICAgICAgICAgLT4gMAorZGRiYXM2NDIgdG9TY2kgIDAuMEUrMiAgICAgICAgICAgLT4gMEUrMQorZGRiYXM2NDMgdG9TY2kgIDAuMEUrMyAgICAgICAgICAgLT4gMEUrMgorZGRiYXM2NDQgdG9TY2kgIDAuMEUrNCAgICAgICAgICAgLT4gMEUrMworZGRiYXM2NDUgdG9TY2kgIDAuMEUrNSAgICAgICAgICAgLT4gMEUrNAorZGRiYXM2NDYgdG9TY2kgIDAuMEUrNiAgICAgICAgICAgLT4gMEUrNQorZGRiYXM2NDcgdG9TY2kgIDAuMEUrNyAgICAgICAgICAgLT4gMEUrNgorZGRiYXM2NDggdG9TY2kgIDAuMEUrOCAgICAgICAgICAgLT4gMEUrNworZGRiYXM2NDkgdG9TY2kgIDAuMEUrOSAgICAgICAgICAgLT4gMEUrOAorCitkZGJhczY1MCB0b1NjaSAgMEUrMCAgICAgICAgICAgICAtPiAwCitkZGJhczY1MSB0b1NjaSAgMEUrMSAgICAgICAgICAgICAtPiAwRSsxCitkZGJhczY1MiB0b1NjaSAgMEUrMiAgICAgICAgICAgICAtPiAwRSsyCitkZGJhczY1MyB0b1NjaSAgMEUrMyAgICAgICAgICAgICAtPiAwRSszCitkZGJhczY1NCB0b1NjaSAgMEUrNCAgICAgICAgICAgICAtPiAwRSs0CitkZGJhczY1NSB0b1NjaSAgMEUrNSAgICAgICAgICAgICAtPiAwRSs1CitkZGJhczY1NiB0b1NjaSAgMEUrNiAgICAgICAgICAgICAtPiAwRSs2CitkZGJhczY1NyB0b1NjaSAgMEUrNyAgICAgICAgICAgICAtPiAwRSs3CitkZGJhczY1OCB0b1NjaSAgMEUrOCAgICAgICAgICAgICAtPiAwRSs4CitkZGJhczY1OSB0b1NjaSAgMEUrOSAgICAgICAgICAgICAtPiAwRSs5CisKK2RkYmFzNjYwIHRvU2NpICAwLjBFLTAgICAgICAgICAgIC0+IDAuMAorZGRiYXM2NjEgdG9TY2kgIDAuMEUtMSAgICAgICAgICAgLT4gMC4wMAorZGRiYXM2NjIgdG9TY2kgIDAuMEUtMiAgICAgICAgICAgLT4gMC4wMDAKK2RkYmFzNjYzIHRvU2NpICAwLjBFLTMgICAgICAgICAgIC0+IDAuMDAwMAorZGRiYXM2NjQgdG9TY2kgIDAuMEUtNCAgICAgICAgICAgLT4gMC4wMDAwMAorZGRiYXM2NjUgdG9TY2kgIDAuMEUtNSAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RkYmFzNjY2IHRvU2NpICAwLjBFLTYgICAgICAgICAgIC0+IDBFLTcKK2RkYmFzNjY3IHRvU2NpICAwLjBFLTcgICAgICAgICAgIC0+IDBFLTgKK2RkYmFzNjY4IHRvU2NpICAwLjBFLTggICAgICAgICAgIC0+IDBFLTkKK2RkYmFzNjY5IHRvU2NpICAwLjBFLTkgICAgICAgICAgIC0+IDBFLTEwCisKK2RkYmFzNjcwIHRvU2NpICAwLjAwRS0wICAgICAgICAgIC0+IDAuMDAKK2RkYmFzNjcxIHRvU2NpICAwLjAwRS0xICAgICAgICAgIC0+IDAuMDAwCitkZGJhczY3MiB0b1NjaSAgMC4wMEUtMiAgICAgICAgICAtPiAwLjAwMDAKK2RkYmFzNjczIHRvU2NpICAwLjAwRS0zICAgICAgICAgIC0+IDAuMDAwMDAKK2RkYmFzNjc0IHRvU2NpICAwLjAwRS00ICAgICAgICAgIC0+IDAuMDAwMDAwCitkZGJhczY3NSB0b1NjaSAgMC4wMEUtNSAgICAgICAgICAtPiAwRS03CitkZGJhczY3NiB0b1NjaSAgMC4wMEUtNiAgICAgICAgICAtPiAwRS04CitkZGJhczY3NyB0b1NjaSAgMC4wMEUtNyAgICAgICAgICAtPiAwRS05CitkZGJhczY3OCB0b1NjaSAgMC4wMEUtOCAgICAgICAgICAtPiAwRS0xMAorZGRiYXM2NzkgdG9TY2kgIDAuMDBFLTkgICAgICAgICAgLT4gMEUtMTEKKworZGRiYXM2ODAgdG9TY2kgIDAwMDAwMC4gICAgICAgICAgLT4gIDAKK2RkYmFzNjgxIHRvU2NpICAgMDAwMDAuICAgICAgICAgIC0+ICAwCitkZGJhczY4MiB0b1NjaSAgICAwMDAwLiAgICAgICAgICAtPiAgMAorZGRiYXM2ODMgdG9TY2kgICAgIDAwMC4gICAgICAgICAgLT4gIDAKK2RkYmFzNjg0IHRvU2NpICAgICAgMDAuICAgICAgICAgIC0+ICAwCitkZGJhczY4NSB0b1NjaSAgICAgICAwLiAgICAgICAgICAtPiAgMAorZGRiYXM2ODYgdG9TY2kgICswMDAwMC4gICAgICAgICAgLT4gIDAKK2RkYmFzNjg3IHRvU2NpICAtMDAwMDAuICAgICAgICAgIC0+IC0wCitkZGJhczY4OCB0b1NjaSAgKzAuICAgICAgICAgICAgICAtPiAgMAorZGRiYXM2ODkgdG9TY2kgIC0wLiAgICAgICAgICAgICAgLT4gLTAKKworLS0gU3BlY2lhbHMKK2RkYmFzNzAwIHRvU2NpICJOYU4iICAgICAgICAgICAgIC0+IE5hTgorZGRiYXM3MDEgdG9TY2kgIm5hbiIgICAgICAgICAgICAgLT4gTmFOCitkZGJhczcwMiB0b1NjaSAibkFuIiAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzNzAzIHRvU2NpICJOQU4iICAgICAgICAgICAgIC0+IE5hTgorZGRiYXM3MDQgdG9TY2kgIitOYU4iICAgICAgICAgICAgLT4gTmFOCitkZGJhczcwNSB0b1NjaSAiK25hbiIgICAgICAgICAgICAtPiBOYU4KK2RkYmFzNzA2IHRvU2NpICIrbkFuIiAgICAgICAgICAgIC0+IE5hTgorZGRiYXM3MDcgdG9TY2kgIitOQU4iICAgICAgICAgICAgLT4gTmFOCitkZGJhczcwOCB0b1NjaSAiLU5hTiIgICAgICAgICAgICAtPiAtTmFOCitkZGJhczcwOSB0b1NjaSAiLW5hbiIgICAgICAgICAgICAtPiAtTmFOCitkZGJhczcxMCB0b1NjaSAiLW5BbiIgICAgICAgICAgICAtPiAtTmFOCitkZGJhczcxMSB0b1NjaSAiLU5BTiIgICAgICAgICAgICAtPiAtTmFOCitkZGJhczcxMiB0b1NjaSAnTmFOMCcgICAgICAgICAgICAtPiBOYU4KK2RkYmFzNzEzIHRvU2NpICdOYU4xJyAgICAgICAgICAgIC0+IE5hTjEKK2RkYmFzNzE0IHRvU2NpICdOYU4xMicgICAgICAgICAgIC0+IE5hTjEyCitkZGJhczcxNSB0b1NjaSAnTmFOMTIzJyAgICAgICAgICAtPiBOYU4xMjMKK2RkYmFzNzE2IHRvU2NpICdOYU4xMjM0JyAgICAgICAgIC0+IE5hTjEyMzQKK2RkYmFzNzE3IHRvU2NpICdOYU4wMScgICAgICAgICAgIC0+IE5hTjEKK2RkYmFzNzE4IHRvU2NpICdOYU4wMTInICAgICAgICAgIC0+IE5hTjEyCitkZGJhczcxOSB0b1NjaSAnTmFOMDEyMycgICAgICAgICAtPiBOYU4xMjMKK2RkYmFzNzIwIHRvU2NpICdOYU4wMTIzNCcgICAgICAgIC0+IE5hTjEyMzQKK2RkYmFzNzIxIHRvU2NpICdOYU4wMDEnICAgICAgICAgIC0+IE5hTjEKK2RkYmFzNzIyIHRvU2NpICdOYU4wMDEyJyAgICAgICAgIC0+IE5hTjEyCitkZGJhczcyMyB0b1NjaSAnTmFOMDAxMjMnICAgICAgICAtPiBOYU4xMjMKK2RkYmFzNzI0IHRvU2NpICdOYU4wMDEyMzQnICAgICAgIC0+IE5hTjEyMzQKK2RkYmFzNzI1IHRvU2NpICdOYU4xMjM0NTY3ODkwMTIzNDU2JyAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNzI2IHRvU2NpICdOYU4xMjNlKzEnICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM3MjcgdG9TY2kgJ05hTjEyLjQ1JyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczcyOCB0b1NjaSAnTmFOLTEyJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RkYmFzNzI5IHRvU2NpICdOYU4rMTInICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitkZGJhczczMCB0b1NjaSAic05hTiIgICAgICAgICAgICAtPiBzTmFOCitkZGJhczczMSB0b1NjaSAic25hbiIgICAgICAgICAgICAtPiBzTmFOCitkZGJhczczMiB0b1NjaSAiU25BbiIgICAgICAgICAgICAtPiBzTmFOCitkZGJhczczMyB0b1NjaSAiU05BTiIgICAgICAgICAgICAtPiBzTmFOCitkZGJhczczNCB0b1NjaSAiK3NOYU4iICAgICAgICAgICAtPiBzTmFOCitkZGJhczczNSB0b1NjaSAiK3NuYW4iICAgICAgICAgICAtPiBzTmFOCitkZGJhczczNiB0b1NjaSAiK1NuQW4iICAgICAgICAgICAtPiBzTmFOCitkZGJhczczNyB0b1NjaSAiK1NOQU4iICAgICAgICAgICAtPiBzTmFOCitkZGJhczczOCB0b1NjaSAiLXNOYU4iICAgICAgICAgICAtPiAtc05hTgorZGRiYXM3MzkgdG9TY2kgIi1zbmFuIiAgICAgICAgICAgLT4gLXNOYU4KK2RkYmFzNzQwIHRvU2NpICItU25BbiIgICAgICAgICAgIC0+IC1zTmFOCitkZGJhczc0MSB0b1NjaSAiLVNOQU4iICAgICAgICAgICAtPiAtc05hTgorZGRiYXM3NDIgdG9TY2kgJ3NOYU4wMDAwJyAgICAgICAgLT4gc05hTgorZGRiYXM3NDMgdG9TY2kgJ3NOYU43JyAgICAgICAgICAgLT4gc05hTjcKK2RkYmFzNzQ0IHRvU2NpICdzTmFOMDA3MjM0JyAgICAgIC0+IHNOYU43MjM0CitkZGJhczc0NSB0b1NjaSAnc05hTjcyMzQ1NjEyMzQ1Njc4OTAnIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZGRiYXM3NDYgdG9TY2kgJ3NOYU43Mi40NScgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkZGJhczc0NyB0b1NjaSAnc05hTi03MicgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworZGRiYXM3NDggdG9TY2kgIkluZiIgICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzQ5IHRvU2NpICJpbmYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitkZGJhczc1MCB0b1NjaSAiaU5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NTEgdG9TY2kgIklORiIgICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzUyIHRvU2NpICIrSW5mIiAgICAgICAgICAgIC0+IEluZmluaXR5CitkZGJhczc1MyB0b1NjaSAiK2luZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NTQgdG9TY2kgIitpTmYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzU1IHRvU2NpICIrSU5GIiAgICAgICAgICAgIC0+IEluZmluaXR5CitkZGJhczc1NiB0b1NjaSAiLUluZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2RkYmFzNzU3IHRvU2NpICItaW5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorZGRiYXM3NTggdG9TY2kgIi1pTmYiICAgICAgICAgICAgLT4gLUluZmluaXR5CitkZGJhczc1OSB0b1NjaSAiLUlORiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKKworZGRiYXM3NjAgdG9TY2kgIkluZmluaXR5IiAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzYxIHRvU2NpICJpbmZpbml0eSIgICAgICAgIC0+IEluZmluaXR5CitkZGJhczc2MiB0b1NjaSAiaU5mSW5JdFkiICAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NjMgdG9TY2kgIklORklOSVRZIiAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzY0IHRvU2NpICIrSW5maW5pdHkiICAgICAgIC0+IEluZmluaXR5CitkZGJhczc2NSB0b1NjaSAiK2luZmluaXR5IiAgICAgICAtPiBJbmZpbml0eQorZGRiYXM3NjYgdG9TY2kgIitpTmZJbkl0WSIgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzNzY3IHRvU2NpICIrSU5GSU5JVFkiICAgICAgIC0+IEluZmluaXR5CitkZGJhczc2OCB0b1NjaSAiLUluZmluaXR5IiAgICAgICAtPiAtSW5maW5pdHkKK2RkYmFzNzY5IHRvU2NpICItaW5maW5pdHkiICAgICAgIC0+IC1JbmZpbml0eQorZGRiYXM3NzAgdG9TY2kgIi1pTmZJbkl0WSIgICAgICAgLT4gLUluZmluaXR5CitkZGJhczc3MSB0b1NjaSAiLUlORklOSVRZIiAgICAgICAtPiAtSW5maW5pdHkKKworLS0gU3BlY2lhbHMgYW5kIHplcm9zIGZvciB0b0VuZworZGRiYXN0NzcyIHRvRW5nICJOYU4iICAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzdDc3MyB0b0VuZyAiLUluZmluaXR5IiAgICAgICAgLT4gLUluZmluaXR5CitkZGJhc3Q3NzQgdG9FbmcgIi1zTmFOIiAgICAgICAgICAgIC0+IC1zTmFOCitkZGJhc3Q3NzUgdG9FbmcgIi1OYU4iICAgICAgICAgICAgIC0+IC1OYU4KK2RkYmFzdDc3NiB0b0VuZyAiK0luZmluaXR5IiAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzdDc3OCB0b0VuZyAiK3NOYU4iICAgICAgICAgICAgLT4gc05hTgorZGRiYXN0Nzc5IHRvRW5nICIrTmFOIiAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzdDc4MCB0b0VuZyAiSU5GSU5JVFkiICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzdDc4MSB0b0VuZyAiU05BTiIgICAgICAgICAgICAgLT4gc05hTgorZGRiYXN0NzgyIHRvRW5nICJOQU4iICAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzdDc4MyB0b0VuZyAiaW5maW5pdHkiICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzdDc4NCB0b0VuZyAic25hbiIgICAgICAgICAgICAgLT4gc05hTgorZGRiYXN0Nzg1IHRvRW5nICJuYW4iICAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzdDc4NiB0b0VuZyAiSW5GSU5JVFkiICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzdDc4NyB0b0VuZyAiU25BTiIgICAgICAgICAgICAgLT4gc05hTgorZGRiYXN0Nzg4IHRvRW5nICJuQU4iICAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzdDc4OSB0b0VuZyAiaU5maW5pdHkiICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzdDc5MCB0b0VuZyAic05hbiIgICAgICAgICAgICAgLT4gc05hTgorZGRiYXN0NzkxIHRvRW5nICJOYW4iICAgICAgICAgICAgICAtPiBOYU4KK2RkYmFzdDc5MiB0b0VuZyAiSW5maW5pdHkiICAgICAgICAgLT4gSW5maW5pdHkKK2RkYmFzdDc5MyB0b0VuZyAic05hTiIgICAgICAgICAgICAgLT4gc05hTgorCistLSBaZXJvIHRvRW5nLCBldGMuCitkZGJhc3Q4MDAgdG9FbmcgMGUrMSAgICAgICAgICAgICAgLT4gIjAuMDBFKzMiICAtLSBkb2MgZXhhbXBsZQorCitkZGJhc3Q4MDEgdG9FbmcgMC4wMDAwMDAwMDAgICAgICAgLT4gMEUtOQorZGRiYXN0ODAyIHRvRW5nIDAuMDAwMDAwMDAgICAgICAgIC0+IDAuMDBFLTYKK2RkYmFzdDgwMyB0b0VuZyAwLjAwMDAwMDAgICAgICAgICAtPiAwLjBFLTYKK2RkYmFzdDgwNCB0b0VuZyAwLjAwMDAwMCAgICAgICAgICAtPiAwLjAwMDAwMAorZGRiYXN0ODA1IHRvRW5nIDAuMDAwMDAgICAgICAgICAgIC0+IDAuMDAwMDAKK2RkYmFzdDgwNiB0b0VuZyAwLjAwMDAgICAgICAgICAgICAtPiAwLjAwMDAKK2RkYmFzdDgwNyB0b0VuZyAwLjAwMCAgICAgICAgICAgICAtPiAwLjAwMAorZGRiYXN0ODA4IHRvRW5nIDAuMDAgICAgICAgICAgICAgIC0+IDAuMDAKK2RkYmFzdDgwOSB0b0VuZyAwLjAgICAgICAgICAgICAgICAtPiAwLjAKK2RkYmFzdDgxMCB0b0VuZyAgLjAgICAgICAgICAgICAgICAtPiAwLjAKK2RkYmFzdDgxMSB0b0VuZyAwLiAgICAgICAgICAgICAgICAtPiAwCitkZGJhc3Q4MTIgdG9FbmcgLS4wICAgICAgICAgICAgICAgLT4gLTAuMAorZGRiYXN0ODEzIHRvRW5nIC0wLiAgICAgICAgICAgICAgIC0+IC0wCitkZGJhc3Q4MTQgdG9FbmcgLTAuMCAgICAgICAgICAgICAgLT4gLTAuMAorZGRiYXN0ODE1IHRvRW5nIC0wLjAwICAgICAgICAgICAgIC0+IC0wLjAwCitkZGJhc3Q4MTYgdG9FbmcgLTAuMDAwICAgICAgICAgICAgLT4gLTAuMDAwCitkZGJhc3Q4MTcgdG9FbmcgLTAuMDAwMCAgICAgICAgICAgLT4gLTAuMDAwMAorZGRiYXN0ODE4IHRvRW5nIC0wLjAwMDAwICAgICAgICAgIC0+IC0wLjAwMDAwCitkZGJhc3Q4MTkgdG9FbmcgLTAuMDAwMDAwICAgICAgICAgLT4gLTAuMDAwMDAwCitkZGJhc3Q4MjAgdG9FbmcgLTAuMDAwMDAwMCAgICAgICAgLT4gLTAuMEUtNgorZGRiYXN0ODIxIHRvRW5nIC0wLjAwMDAwMDAwICAgICAgIC0+IC0wLjAwRS02CitkZGJhc3Q4MjIgdG9FbmcgLTAuMDAwMDAwMDAwICAgICAgLT4gLTBFLTkKKworZGRiYXN0ODMwIHRvRW5nICAwLjAwRSswICAgICAgICAgIC0+IDAuMDAKK2RkYmFzdDgzMSB0b0VuZyAgMC4wMEUrMSAgICAgICAgICAtPiAwLjAKK2RkYmFzdDgzMiB0b0VuZyAgMC4wMEUrMiAgICAgICAgICAtPiAwCitkZGJhc3Q4MzMgdG9FbmcgIDAuMDBFKzMgICAgICAgICAgLT4gMC4wMEUrMworZGRiYXN0ODM0IHRvRW5nICAwLjAwRSs0ICAgICAgICAgIC0+IDAuMEUrMworZGRiYXN0ODM1IHRvRW5nICAwLjAwRSs1ICAgICAgICAgIC0+IDBFKzMKK2RkYmFzdDgzNiB0b0VuZyAgMC4wMEUrNiAgICAgICAgICAtPiAwLjAwRSs2CitkZGJhc3Q4MzcgdG9FbmcgIDAuMDBFKzcgICAgICAgICAgLT4gMC4wRSs2CitkZGJhc3Q4MzggdG9FbmcgIDAuMDBFKzggICAgICAgICAgLT4gMEUrNgorZGRiYXN0ODM5IHRvRW5nICAwLjAwRSs5ICAgICAgICAgIC0+IDAuMDBFKzkKKworZGRiYXN0ODQwIHRvRW5nICAwLjBFKzAgICAgICAgICAgIC0+IDAuMAorZGRiYXN0ODQxIHRvRW5nICAwLjBFKzEgICAgICAgICAgIC0+IDAKK2RkYmFzdDg0MiB0b0VuZyAgMC4wRSsyICAgICAgICAgICAtPiAwLjAwRSszCitkZGJhc3Q4NDMgdG9FbmcgIDAuMEUrMyAgICAgICAgICAgLT4gMC4wRSszCitkZGJhc3Q4NDQgdG9FbmcgIDAuMEUrNCAgICAgICAgICAgLT4gMEUrMworZGRiYXN0ODQ1IHRvRW5nICAwLjBFKzUgICAgICAgICAgIC0+IDAuMDBFKzYKK2RkYmFzdDg0NiB0b0VuZyAgMC4wRSs2ICAgICAgICAgICAtPiAwLjBFKzYKK2RkYmFzdDg0NyB0b0VuZyAgMC4wRSs3ICAgICAgICAgICAtPiAwRSs2CitkZGJhc3Q4NDggdG9FbmcgIDAuMEUrOCAgICAgICAgICAgLT4gMC4wMEUrOQorZGRiYXN0ODQ5IHRvRW5nICAwLjBFKzkgICAgICAgICAgIC0+IDAuMEUrOQorCitkZGJhc3Q4NTAgdG9FbmcgIDBFKzAgICAgICAgICAgICAgLT4gMAorZGRiYXN0ODUxIHRvRW5nICAwRSsxICAgICAgICAgICAgIC0+IDAuMDBFKzMKK2RkYmFzdDg1MiB0b0VuZyAgMEUrMiAgICAgICAgICAgICAtPiAwLjBFKzMKK2RkYmFzdDg1MyB0b0VuZyAgMEUrMyAgICAgICAgICAgICAtPiAwRSszCitkZGJhc3Q4NTQgdG9FbmcgIDBFKzQgICAgICAgICAgICAgLT4gMC4wMEUrNgorZGRiYXN0ODU1IHRvRW5nICAwRSs1ICAgICAgICAgICAgIC0+IDAuMEUrNgorZGRiYXN0ODU2IHRvRW5nICAwRSs2ICAgICAgICAgICAgIC0+IDBFKzYKK2RkYmFzdDg1NyB0b0VuZyAgMEUrNyAgICAgICAgICAgICAtPiAwLjAwRSs5CitkZGJhc3Q4NTggdG9FbmcgIDBFKzggICAgICAgICAgICAgLT4gMC4wRSs5CitkZGJhc3Q4NTkgdG9FbmcgIDBFKzkgICAgICAgICAgICAgLT4gMEUrOQorCitkZGJhc3Q4NjAgdG9FbmcgIDAuMEUtMCAgICAgICAgICAgLT4gMC4wCitkZGJhc3Q4NjEgdG9FbmcgIDAuMEUtMSAgICAgICAgICAgLT4gMC4wMAorZGRiYXN0ODYyIHRvRW5nICAwLjBFLTIgICAgICAgICAgIC0+IDAuMDAwCitkZGJhc3Q4NjMgdG9FbmcgIDAuMEUtMyAgICAgICAgICAgLT4gMC4wMDAwCitkZGJhc3Q4NjQgdG9FbmcgIDAuMEUtNCAgICAgICAgICAgLT4gMC4wMDAwMAorZGRiYXN0ODY1IHRvRW5nICAwLjBFLTUgICAgICAgICAgIC0+IDAuMDAwMDAwCitkZGJhc3Q4NjYgdG9FbmcgIDAuMEUtNiAgICAgICAgICAgLT4gMC4wRS02CitkZGJhc3Q4NjcgdG9FbmcgIDAuMEUtNyAgICAgICAgICAgLT4gMC4wMEUtNgorZGRiYXN0ODY4IHRvRW5nICAwLjBFLTggICAgICAgICAgIC0+IDBFLTkKK2RkYmFzdDg2OSB0b0VuZyAgMC4wRS05ICAgICAgICAgICAtPiAwLjBFLTkKKworZGRiYXN0ODcwIHRvRW5nICAwLjAwRS0wICAgICAgICAgIC0+IDAuMDAKK2RkYmFzdDg3MSB0b0VuZyAgMC4wMEUtMSAgICAgICAgICAtPiAwLjAwMAorZGRiYXN0ODcyIHRvRW5nICAwLjAwRS0yICAgICAgICAgIC0+IDAuMDAwMAorZGRiYXN0ODczIHRvRW5nICAwLjAwRS0zICAgICAgICAgIC0+IDAuMDAwMDAKK2RkYmFzdDg3NCB0b0VuZyAgMC4wMEUtNCAgICAgICAgICAtPiAwLjAwMDAwMAorZGRiYXN0ODc1IHRvRW5nICAwLjAwRS01ICAgICAgICAgIC0+IDAuMEUtNgorZGRiYXN0ODc2IHRvRW5nICAwLjAwRS02ICAgICAgICAgIC0+IDAuMDBFLTYKK2RkYmFzdDg3NyB0b0VuZyAgMC4wMEUtNyAgICAgICAgICAtPiAwRS05CitkZGJhc3Q4NzggdG9FbmcgIDAuMDBFLTggICAgICAgICAgLT4gMC4wRS05CitkZGJhc3Q4NzkgdG9FbmcgIDAuMDBFLTkgICAgICAgICAgLT4gMC4wMEUtOQorCistLSBsb25nIGlucHV0IHN0cmluZ3MKK2RkYmFzODAxIHRvc2NpICcwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDIgdG9zY2kgJzAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDMgdG9zY2kgJzAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODA0IHRvc2NpICcwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDUgdG9zY2kgJzAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDYgdG9zY2kgJzAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODA3IHRvc2NpICcwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDggdG9zY2kgJzAwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZGRiYXM4MDkgdG9zY2kgJzAwMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODEwIHRvc2NpICcwMDAwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorCitkZGJhczgxMSB0b3NjaSAnMC4xMjM0NTY3ODkwMTIzNDU2JyAtPiAwLjEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODEyIHRvc2NpICcwLjAxMjM0NTY3ODkwMTIzNDU2JyAtPiAwLjAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgxMyB0b3NjaSAnMC4wMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgxNCB0b3NjaSAnMC4wMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAwLjAwMDEyMzQ1Njc4OTAxMjM0NTYKK2RkYmFzODE1IHRvc2NpICcwLjAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAwLjAwMDAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgxNiB0b3NjaSAnMC4wMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDAwMDAxMjM0NTY3ODkwMTIzNDU2CitkZGJhczgxNyB0b3NjaSAnMC4wMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUtNworZGRiYXM4MTggdG9zY2kgJzAuMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkwMTIzNDU2RS04CitkZGJhczgxOSB0b3NjaSAnMC4wMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkwMTIzNDU2RS05CitkZGJhczgyMCB0b3NjaSAnMC4wMDAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUtMTAKKworZGRiYXM4MjEgdG9zY2kgJzEyMzQ1Njc4OTAxMjM0NTY3ODkwJyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMTkgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyMiB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxJyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjAgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyMyB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMicgLT4gMS4yMzQ1Njc4OTAxMjM0NTdFKzIxIEluZXhhY3QgUm91bmRlZAorZGRiYXM4MjQgdG9zY2kgJzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzJyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjIgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyNSB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjMgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyNiB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NScgLT4gMS4yMzQ1Njc4OTAxMjM0NTdFKzI0IEluZXhhY3QgUm91bmRlZAorZGRiYXM4MjcgdG9zY2kgJzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjUgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyOCB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3JyAtPiAxLjIzNDU2Nzg5MDEyMzQ1N0UrMjYgSW5leGFjdCBSb3VuZGVkCitkZGJhczgyOSB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3OCcgLT4gMS4yMzQ1Njc4OTAxMjM0NTdFKzI3IEluZXhhY3QgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCBvdmVyZmxvd3MKK2RkYmFzOTA2IHRvU2NpICc5OWU5OTk5OTk5OTknICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTA3IHRvU2NpICc5OTllOTk5OTk5OTk5JyAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTA4IHRvU2NpICcwLjllLTk5OTk5OTk5OScgICAgIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkwOSB0b1NjaSAnMC4wOWUtOTk5OTk5OTk5JyAgICAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MTAgdG9TY2kgJzAuMWUxMDAwMDAwMDAwJyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MTEgdG9TY2kgJzEwZS0xMDAwMDAwMDAwJyAgICAgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzOTEyIHRvU2NpICcwLjllOTk5OTk5OTk5OScgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTEzIHRvU2NpICc5OWUtOTk5OTk5OTk5OScgICAgIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkxNCB0b1NjaSAnMTExZTk5OTk5OTk5OTknICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGJhczkxNSB0b1NjaSAnMTExMWUtOTk5OTk5OTk5OScgICAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MTYgdG9TY2kgJzExMTFlLTk5OTk5OTk5OTk5JyAgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzOTE3IHRvU2NpICc3ZTEwMDAwMDAwMDAnICAgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5lZ2F0aXZlcyB0aGUgc2FtZQorZGRiYXM5MTggdG9TY2kgJy05OWU5OTk5OTk5OTknICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTE5IHRvU2NpICctOTk5ZTk5OTk5OTk5OScgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkZGJhczkyMCB0b1NjaSAnLTAuOWUtOTk5OTk5OTk5JyAgICAtPiAtMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzOTIxIHRvU2NpICctMC4wOWUtOTk5OTk5OTk5JyAgIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MjIgdG9TY2kgJy0wLjFlMTAwMDAwMDAwMCcgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTIzIHRvU2NpICctMTBlLTEwMDAwMDAwMDAnICAgIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MjQgdG9TY2kgJy0wLjllOTk5OTk5OTk5OScgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTI1IHRvU2NpICctOTllLTk5OTk5OTk5OTknICAgIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MjYgdG9TY2kgJy0xMTFlOTk5OTk5OTk5OScgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTI3IHRvU2NpICctMTExMWUtOTk5OTk5OTk5OScgIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXM5MjggdG9TY2kgJy0xMTExZS05OTk5OTk5OTk5OScgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczkyOSB0b1NjaSAnLTdlMTAwMDAwMDAwMCcgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorCistLSBvdmVyZmxvdyByZXN1bHRzIGF0IGRpZmZlcmVudCByb3VuZGluZyBtb2Rlcworcm91bmRpbmc6ICBjZWlsaW5nCitkZGJhczkzMCB0b1NjaSAgJzdlMTAwMDAnICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZGRiYXM5MzEgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICB1cAorZGRiYXM5MzIgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTMzIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGRvd24KK2RkYmFzOTM0IHRvU2NpICAnN2UxMDAwMCcgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTM1IHRvU2NpICctN2UxMDAwMCcgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgZmxvb3IKK2RkYmFzOTM2IHRvU2NpICAnN2UxMDAwMCcgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTM3IHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl91cAorZGRiYXM5MzggdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTM5IHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGhhbGZfZXZlbgorZGRiYXM5NDAgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTQxIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGhhbGZfZG93bgorZGRiYXM5NDIgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzOTQzIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCisKKy0tIE5vdyBjaGVjayA4NTQvNzU0ciBzb21lIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdyB0byAwCitkZGJlbTQwMCB0b1NjaSAgMS4wMDAwRS0zODMgICAgIC0+IDEuMDAwMEUtMzgzCitkZGJlbTQwMSB0b1NjaSAgMC4xRS0zOTQgICAgICAgIC0+IDFFLTM5NSAgICAgICBTdWJub3JtYWwKK2RkYmVtNDAyIHRvU2NpICAwLjEwMDBFLTM5NCAgICAgLT4gMS4wMDBFLTM5NSAgIFN1Ym5vcm1hbAorZGRiZW00MDMgdG9TY2kgIDAuMDEwMEUtMzk0ICAgICAtPiAxLjAwRS0zOTYgICAgU3Vibm9ybWFsCitkZGJlbTQwNCB0b1NjaSAgMC4wMDEwRS0zOTQgICAgIC0+IDEuMEUtMzk3ICAgICBTdWJub3JtYWwKK2RkYmVtNDA1IHRvU2NpICAwLjAwMDFFLTM5NCAgICAgLT4gMUUtMzk4ICAgICAgIFN1Ym5vcm1hbAorZGRiZW00MDYgdG9TY2kgIDAuMDAwMTBFLTM5NCAgICAtPiAxRS0zOTggICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZGJlbTQwNyB0b1NjaSAgMC4wMDAxM0UtMzk0ICAgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDA4IHRvU2NpICAwLjAwMDE1RS0zOTQgICAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MDkgdG9TY2kgIDAuMDAwMTdFLTM5NCAgICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQxMCB0b1NjaSAgMC4wMDAyM0UtMzk0ICAgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDExIHRvU2NpICAwLjAwMDI1RS0zOTQgICAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MTIgdG9TY2kgIDAuMDAwMjdFLTM5NCAgICAtPiAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQxMyB0b1NjaSAgMC4wMDAxNDlFLTM5NCAgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDE0IHRvU2NpICAwLjAwMDE1MEUtMzk0ICAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MTUgdG9TY2kgIDAuMDAwMTUxRS0zOTQgICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQxNiB0b1NjaSAgMC4wMDAyNDlFLTM5NCAgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDE3IHRvU2NpICAwLjAwMDI1MEUtMzk0ICAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MTggdG9TY2kgIDAuMDAwMjUxRS0zOTQgICAtPiAzRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQxOSB0b1NjaSAgMC4wMDAwOUUtMzk0ICAgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDIwIHRvU2NpICAwLjAwMDA1RS0zOTQgICAgLT4gMEUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJlbTQyMSB0b1NjaSAgMC4wMDAwM0UtMzk0ICAgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiZW00MjIgdG9TY2kgIDAuMDAwMDA5RS0zOTQgICAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmVtNDIzIHRvU2NpICAwLjAwMDAwNUUtMzk0ICAgLT4gMEUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJlbTQyNCB0b1NjaSAgMC4wMDAwMDNFLTM5NCAgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkZGJlbTQyNSB0b1NjaSAgMC4wMDEwNDlFLTM5NCAgIC0+IDEuMEUtMzk3ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDI2IHRvU2NpICAwLjAwMTA1MEUtMzk0ICAgLT4gMS4wRS0zOTcgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MjcgdG9TY2kgIDAuMDAxMDUxRS0zOTQgICAtPiAxLjFFLTM5NyAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQyOCB0b1NjaSAgMC4wMDExNDlFLTM5NCAgIC0+IDEuMUUtMzk3ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDI5IHRvU2NpICAwLjAwMTE1MEUtMzk0ICAgLT4gMS4yRS0zOTcgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MzAgdG9TY2kgIDAuMDAxMTUxRS0zOTQgICAtPiAxLjJFLTM5NyAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RkYmVtNDMyIHRvU2NpICAwLjAxMDA0OUUtMzk0ICAgLT4gMS4wMEUtMzk2ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MzMgdG9TY2kgIDAuMDEwMDUwRS0zOTQgICAtPiAxLjAwRS0zOTYgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQzNCB0b1NjaSAgMC4wMTAwNTFFLTM5NCAgIC0+IDEuMDFFLTM5NiAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDM1IHRvU2NpICAwLjAxMDE0OUUtMzk0ICAgLT4gMS4wMUUtMzk2ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00MzYgdG9TY2kgIDAuMDEwMTUwRS0zOTQgICAtPiAxLjAyRS0zOTYgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQzNyB0b1NjaSAgMC4wMTAxNTFFLTM5NCAgIC0+IDEuMDJFLTM5NiAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZGRiZW00NDAgdG9TY2kgIDAuMTAxMDNFLTM5NCAgICAtPiAxLjAxMEUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ0MSB0b1NjaSAgMC4xMDEwNUUtMzk0ICAgIC0+IDEuMDEwRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDQyIHRvU2NpICAwLjEwMTA3RS0zOTQgICAgLT4gMS4wMTFFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NDMgdG9TY2kgIDAuMTAxMTNFLTM5NCAgICAtPiAxLjAxMUUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ0NCB0b1NjaSAgMC4xMDExNUUtMzk0ICAgIC0+IDEuMDEyRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDQ1IHRvU2NpICAwLjEwMTE3RS0zOTQgICAgLT4gMS4wMTJFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZGJlbTQ1MCB0b1NjaSAgMS4xMDczMEUtMzk1ICAgLT4gMS4xMDdFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NTEgdG9TY2kgIDEuMTA3NTBFLTM5NSAgIC0+IDEuMTA4RS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDUyIHRvU2NpICAxLjEwNzcwRS0zOTUgICAtPiAxLjEwOEUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ1MyB0b1NjaSAgMS4xMDgzMEUtMzk1ICAgLT4gMS4xMDhFLTM5NSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRiZW00NTQgdG9TY2kgIDEuMTA4NTBFLTM5NSAgIC0+IDEuMTA4RS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDU1IHRvU2NpICAxLjEwODcwRS0zOTUgICAtPiAxLjEwOUUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1ha2Ugc3VyZSBzaWduIE9LCitkZGJlbTQ1NiB0b1NjaSAgLTAuMTAxMDNFLTM5NCAgIC0+IC0xLjAxMEUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ1NyB0b1NjaSAgLTAuMTAxMDVFLTM5NCAgIC0+IC0xLjAxMEUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ1OCB0b1NjaSAgLTAuMTAxMDdFLTM5NCAgIC0+IC0xLjAxMUUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ1OSB0b1NjaSAgLTAuMTAxMTNFLTM5NCAgIC0+IC0xLjAxMUUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ2MCB0b1NjaSAgLTAuMTAxMTVFLTM5NCAgIC0+IC0xLjAxMkUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGJlbTQ2MSB0b1NjaSAgLTAuMTAxMTdFLTM5NCAgIC0+IC0xLjAxMkUtMzk1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tICc5OTlzJyBjYXNlcworZGRiZW00NjQgdG9TY2kgIDk5OTk5OUUtMzk1ICAgICAgICAgLT4gOS45OTk5OUUtMzkwIFN1Ym5vcm1hbAorZGRiZW00NjUgdG9TY2kgIDk5OTk5LjBFLTM5NCAgICAgICAgLT4gOS45OTk5MEUtMzkwIFN1Ym5vcm1hbAorZGRiZW00NjYgdG9TY2kgIDk5OTk5LkUtMzk0ICAgICAgICAgLT4gOS45OTk5RS0zOTAgIFN1Ym5vcm1hbAorZGRiZW00NjcgdG9TY2kgIDk5OTkuOUUtMzk0ICAgICAgICAgLT4gOS45OTk5RS0zOTEgIFN1Ym5vcm1hbAorZGRiZW00NjggdG9TY2kgIDk5OS45OUUtMzk0ICAgICAgICAgLT4gOS45OTk5RS0zOTIgIFN1Ym5vcm1hbAorZGRiZW00NjkgdG9TY2kgIDk5Ljk5OUUtMzk0ICAgICAgICAgLT4gOS45OTk5RS0zOTMgIFN1Ym5vcm1hbAorZGRiZW00NzAgdG9TY2kgIDkuOTk5OUUtMzk0ICAgICAgICAgLT4gOS45OTk5RS0zOTQgIFN1Ym5vcm1hbAorZGRiZW00NzEgdG9TY2kgIDAuOTk5OTlFLTM5NCAgICAgICAgLT4gMS4wMDAwRS0zOTQgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDcyIHRvU2NpICAwLjA5OTk5OUUtMzk0ICAgICAgIC0+IDEuMDAwRS0zOTUgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDczIHRvU2NpICAwLjAwOTk5OTlFLTM5NCAgICAgIC0+IDEuMDBFLTM5NiAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDc0IHRvU2NpICAwLjAwMDk5OTk5RS0zOTQgICAgIC0+IDEuMEUtMzk3ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDc1IHRvU2NpICAwLjAwMDA5OTk5OUUtMzk0ICAgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkYmVtNDc2IHRvU2NpICAwLjAwMDAwOTk5OTlFLTM5NCAgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiZW00NzcgdG9TY2kgIDAuMDAwMDAwOTk5OTlFLTM5NCAgLT4gMEUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJlbTQ3OCB0b1NjaSAgMC4wMDAwMDAwOTk5OTlFLTM5NCAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gRXhwb25lbnRzIHdpdGggaW5zaWduaWZpY2FudCBsZWFkaW5nIHplcm9zCitkZGJhczEwMDEgdG9TY2kgIDFlOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRiYXMxMDAyIHRvU2NpICAxZTA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGJhczEwMDMgdG9TY2kgIDFlMDA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGJhczEwMDQgdG9TY2kgIDFlMDAwOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRiYXMxMDA1IHRvU2NpICAxZTAwMDAwMDAwMDAwMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMTAwNiB0b1NjaSAgMWUwMDAwMDAwMDAwMDEwMDAwMDAwMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGJhczEwMDcgdG9TY2kgIDFlLTk5OTk5OTk5OSAtPiAwRS0zOTggICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXMxMDA4IHRvU2NpICAxZS0wOTk5OTk5OTk5IC0+IDBFLTM5OCAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzMTAwOSB0b1NjaSAgMWUtMDA5OTk5OTk5OTkgLT4gMEUtMzk4ICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGJhczEwMTAgdG9TY2kgIDFlLTAwMDk5OTk5OTk5OSAtPiAwRS0zOTggICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRiYXMxMDExIHRvU2NpICAxZS0wMDAwMDAwMDAwMDA5OTk5OTk5OTkgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkYmFzMTAxMiB0b1NjaSAgMWUtMDAwMDAwMDAwMDAxMDAwMDAwMDA3IC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitkZGJhczEwNDEgdG9TY2kgICAgIDEuMTExMTExMTExMTE1MjQ0NEUtMzg0IC0+ICAxLjExMTExMTExMTExNTI0RS0zODQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkYmFzMTA0MiB0b1NjaSAgICAgMS4xMTExMTExMTExMTUyNDQ1RS0zODQgLT4gIDEuMTExMTExMTExMTE1MjRFLTM4NCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRiYXMxMDQzIHRvU2NpICAgICAxLjExMTExMTExMTExNTI0NDZFLTM4NCAtPiAgMS4xMTExMTExMTExMTUyNEUtMzg0IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIGNsYW1wZWQgbGFyZ2Ugbm9ybWFscworZGRiYXMxMDcwIHRvU2NpICAgMUUrMzY5ICAtPiAgMUUrMzY5CitkZGJhczEwNzEgdG9TY2kgICAxRSszNzAgIC0+ICAxLjBFKzM3MCAgQ2xhbXBlZAorZGRiYXMxMDcyIHRvU2NpICAgMUUrMzc4ICAtPiAgMS4wMDAwMDAwMDBFKzM3OCAgQ2xhbXBlZAorZGRiYXMxMDczIHRvU2NpICAgMUUrMzg0ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAgQ2xhbXBlZAorZGRiYXMxMDc0IHRvU2NpICAgMUUrMzg1ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKworLS0gY2xhbXBlZCB6ZXJvcyBbc2VlIGFsc28gY2xhbXAuZGVjVGVzdF0KK2RkYmFzMTA3NSB0b1NjaSAgIDBlKzEwMDAwICAtPiAgMEUrMzY5ICBDbGFtcGVkCitkZGJhczEwNzYgdG9TY2kgICAwZS0xMDAwMCAgLT4gIDBFLTM5OCAgQ2xhbXBlZAorZGRiYXMxMDc3IHRvU2NpICAtMGUrMTAwMDAgIC0+IC0wRSszNjkgIENsYW1wZWQKK2RkYmFzMTA3OCB0b1NjaSAgLTBlLTEwMDAwICAtPiAtMEUtMzk4ICBDbGFtcGVkCisKKy0tIGV4dHJlbWUgdmFsdWVzIGZyb20gbmV4dC13aWRlcgorZGRiYXMxMTAxIHRvU2NpIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkYmFzMTEwMiB0b1NjaSAtMUUtNjE0MyAtPiAtMEUtMzk4IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RkYmFzMTEwMyB0b1NjaSAtMUUtNjE3NiAtPiAtMEUtMzk4IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RkYmFzMTEwNCB0b1NjaSAtMCAtPiAtMAorZGRiYXMxMTA1IHRvU2NpICswIC0+ICAwCitkZGJhczExMDYgdG9TY2kgKzFFLTYxNzYgLT4gIDBFLTM5OCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitkZGJhczExMDcgdG9TY2kgKzFFLTYxNzMgLT4gIDBFLTM5OCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitkZGJhczExMDggdG9TY2kgKzkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ2Fub25pY2FsLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ2Fub25pY2FsLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmOWUzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDYW5vbmljYWwuZGVjVGVzdApAQCAtMCwwICsxLDM1NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZENhbm9uaWNhbC5kZWNUZXN0IC0tIHRlc3QgZGVjRG91YmxlIGNhbm9uaWNhbCByZXN1bHRzICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgZmlsZSB0ZXN0cyB0aGF0IGNvcHkgb3BlcmF0aW9ucyBsZWF2ZSB1bmNhbm9uaWNhbCBvcGVyYW5kcworLS0gdW5jaGFuZ2VkLCBhbmQgdmljZSB2ZXJzYQorLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFVuY2Fub25pY2FsIGRlY2xldHMgYXJlOiBhYmMsIHdoZXJlOgorLS0gICBhPTEsMiwzCistLSAgIGI9Niw3LGUsZgorLS0gICBjPWUsZgorCistLSBhc3NlcnQgc29tZSBzdGFuZGFyZCAoY2Fub25pY2FsKSB2YWx1ZXM7IHRoaXMgdGVzdHMgdGhhdCBGcm9tU3RyaW5nCistLSBwcm9kdWNlcyBjYW5vbmljYWwgcmVzdWx0cyAobWFueSBtb3JlIGluIGRlY2ltYWxOTikKK2RkY2FuMDAxIGFwcGx5IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDAyIGFwcGx5IDAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMzgwMDAwMDAwMDAwMDAKK2RkY2FuMDAzIGFwcGx5IDEgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMzgwMDAwMDAwMDAwMDEKK2RkY2FuMDA0IGFwcGx5IC0xICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMzgwMDAwMDAwMDAwMDEKK2RkY2FuMDA1IGFwcGx5IEluZmluaXR5ICAgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMDA2IGFwcGx5IC1JbmZpbml0eSAgICAgICAgICAgICAgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMDA3IGFwcGx5IC1OYU4gICAgICAgICAgICAgICAgICAgLT4gI2ZjMDAwMDAwMDAwMDAwMDAKK2RkY2FuMDA4IGFwcGx5IC1zTmFOICAgICAgICAgICAgICAgICAgLT4gI2ZlMDAwMDAwMDAwMDAwMDAKK2RkY2FuMDA5IGFwcGx5IE5hTjk5OTk5OTk5OTk5OTk5OSAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMDEwIGFwcGx5IHNOYU45OTk5OTk5OTk5OTk5OTkgICAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RlY2FuMDExIGFwcGx5ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgLT4gIzZlMzhmZjNmY2ZmM2ZjZmYKK2RkY2FuMDEyIGFwcGx5IDcuNTAgICAgICAgICAgICAgICAgICAgLT4gIzIyMzAwMDAwMDAwMDAzZDAKK2RkY2FuMDEzIGFwcGx5IDkuOTkgICAgICAgICAgICAgICAgICAgLT4gIzIyMzAwMDAwMDAwMDAwZmYKKworLS0gQmFzZSB0ZXN0cyBmb3IgY2Fub25pY2FsIGVuY29kaW5ncyAoaW5kaXZpZHVhbCBvcGVyYXRvcgorLS0gcHJvcGFnYXRpb24gaXMgdGVzdGVkIGxhdGVyKQorCistLSBGaW5pdGVzOiBkZWNsZXRzIGluIGNvZWZmaWNpZW50CitkZGNhbjAyMSBjYW5vbmljYWwgICM3N2ZjZmYzZmNmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMjIgY2Fub25pY2FsICAjNzdmY2ZmM2ZjZmYzZmNmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDIzIGNhbm9uaWNhbCAgIzc3ZmZmZjNmY2ZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAyNCBjYW5vbmljYWwgICM3N2ZmZmYzZmNmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMjUgY2Fub25pY2FsICAjNzdmY2ZmZmZjZmYzZmNmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDI2IGNhbm9uaWNhbCAgIzc3ZmNmZmZmY2ZmM2ZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAyNyBjYW5vbmljYWwgICM3N2ZjZmYzZmZmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMjggY2Fub25pY2FsICAjNzdmY2ZmM2ZmZmYzZmNmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDMwIGNhbm9uaWNhbCAgIzc3ZmNmZjNmY2ZmZmZjZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAzMSBjYW5vbmljYWwgICM3N2ZjZmYzZmNmZmZmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMzIgY2Fub25pY2FsICAjNzdmY2ZmM2ZjZmYzZmZmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RkY2FuMDMzIGNhbm9uaWNhbCAgIzc3ZmNmZjNmY2ZmM2ZmZmYgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjAzNSBjYW5vbmljYWwgICM3N2ZjZmYzZmRmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4wMzYgY2Fub25pY2FsICAjNzdmY2ZmM2ZlZmYzZmNmZiAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKKworLS0gTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RkY2FuMTAwIGNhbm9uaWNhbCAgTmFOOTk5OTk5OTk5OTk5OTk5IC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjEwMSBjYW5vbmljYWwgICM3YzAwZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMDIgY2Fub25pY2FsICAjN2MwM2ZmM2ZjZmYzZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTAzIGNhbm9uaWNhbCAgIzdjMDBmZmZmY2ZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjEwNCBjYW5vbmljYWwgICM3YzAwZmYzZmZmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMDUgY2Fub25pY2FsICAjN2MwMGZmM2ZjZmZmZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTA2IGNhbm9uaWNhbCAgIzdjMDBmZjNmY2ZmM2ZmZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjEwNyBjYW5vbmljYWwgICM3YzAwZmYzZmNmZjNmZmZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorLS0gTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkZGNhbjExMCBjYW5vbmljYWwgICM3YzAwZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMTIgY2Fub25pY2FsICAjN2QwMGZmM2ZjZmYzZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTEzIGNhbm9uaWNhbCAgIzdjODBmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjExNCBjYW5vbmljYWwgICM3YzQwZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMTUgY2Fub25pY2FsICAjN2MyMGZmM2ZjZmYzZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTE2IGNhbm9uaWNhbCAgIzdjMTBmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjExNyBjYW5vbmljYWwgICM3YzA4ZmYzZmNmZjNmY2ZmICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMTggY2Fub25pY2FsICAjN2MwNGZmM2ZjZmYzZmNmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKKworLS0gc05hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkZGNhbjEyMCBjYW5vbmljYWwgc05hTjk5OTk5OTk5OTk5OTk5OSAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMjEgY2Fub25pY2FsICAjN2UwMGZmM2ZjZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTIyIGNhbm9uaWNhbCAgIzdlMDNmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEyMyBjYW5vbmljYWwgICM3ZTAwZmZmZmNmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMjQgY2Fub25pY2FsICAjN2UwMGZmM2ZmZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTI1IGNhbm9uaWNhbCAgIzdlMDBmZjNmY2ZmZmZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEyNiBjYW5vbmljYWwgICM3ZTAwZmYzZmNmZjNmZmZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMjcgY2Fub25pY2FsICAjN2UwMGZmM2ZjZmYzZmZmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RkY2FuMTMwIGNhbm9uaWNhbCAgIzdlMDBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEzMiBjYW5vbmljYWwgICM3ZjAwZmYzZmNmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMzMgY2Fub25pY2FsICAjN2U4MGZmM2ZjZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTM0IGNhbm9uaWNhbCAgIzdlNDBmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEzNSBjYW5vbmljYWwgICM3ZTIwZmYzZmNmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorZGRjYW4xMzYgY2Fub25pY2FsICAjN2UxMGZmM2ZjZmYzZmNmZiAgLT4gIzdlMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMTM3IGNhbm9uaWNhbCAgIzdlMDhmZjNmY2ZmM2ZjZmYgIC0+ICM3ZTAwZmYzZmNmZjNmY2ZmCitkZGNhbjEzOCBjYW5vbmljYWwgICM3ZTA0ZmYzZmNmZjNmY2ZmICAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorCistLSBJbmY6IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkZGNhbjE0MCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNDEgY2Fub25pY2FsICAjNzkwMDAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTQyIGNhbm9uaWNhbCAgIzdhMDAwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE0MyBjYW5vbmljYWwgICM3ODgwMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNDQgY2Fub25pY2FsICAjNzg0MDAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTQ1IGNhbm9uaWNhbCAgIzc4MjAwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE0NiBjYW5vbmljYWwgICM3ODEwMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNDcgY2Fub25pY2FsICAjNzgwODAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTQ4IGNhbm9uaWNhbCAgIzc4MDQwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCisKKy0tIEluZjogY29lZmZpY2llbnQgY29udGludWF0aW9uIGJpdHMgKGZpcnN0LCBsYXN0LCBhbmQgYSBmZXcgb3RoZXJzKQorZGRjYW4xNTAgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTUxIGNhbm9uaWNhbCAgIzc4MDIwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE1MiBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAxICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNTMgY2Fub25pY2FsICAjNzgwMTAwMDAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTU0IGNhbm9uaWNhbCAgIzc4MDAyMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE1NSBjYW5vbmljYWwgICM3ODAwMDgwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNTYgY2Fub25pY2FsICAjNzgwMDAwMjAwMDAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTU3IGNhbm9uaWNhbCAgIzc4MDAwMDA0MDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE1OCBjYW5vbmljYWwgICM3ODAwMDAwMDQwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNTkgY2Fub25pY2FsICAjNzgwMDAwMDAwODAwMDAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTYwIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDA0MDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE2MSBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDIwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNjIgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwODAwMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMTYzIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAyMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjE2NCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDQwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4xNjUgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwOCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKKworCistLSBOb3cgdGhlIG9wZXJhdG9ycyAtLSB0cnlpbmcgdG8gY2hlY2sgcGF0aHMgdGhhdCBtaWdodCBmYWlsIHRvCistLSBjYW5vbmljYWxpemUgcHJvcGFnYXRlZCBvcGVyYW5kcworCistLS0tLSBBZGQ6CistLSBGaW5pdGVzOiBuZXV0cmFsIDAKK2RkY2FuMjAyIGFkZCAgMEUrMzg0ICM3N2ZmZmYzZmNmZjNmY2ZmICAgICAgICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorZGRjYW4yMDMgYWRkICAgICAgICAgIzc3ZmNmZmZmY2ZmM2ZjZmYgMEUrMzg0IC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCistLSB0aW55IHplcm8KK2RkY2FuMjA0IGFkZCAgMEUtMzk4ICM3N2ZmZmYzZmNmZjNmY2ZmICAgICAgICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZiBSb3VuZGVkCitkZGNhbjIwNSBhZGQgICAgICAgICAjNzdmY2ZmZmZjZmYzZmNmZiAwRS0zOTggLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYgUm91bmRlZAorLS0gdGlueSBub24gemVybworZGRjYW4yMDYgYWRkIC0xRS0zOTggIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZiBJbmV4YWN0IFJvdW5kZWQKK2RkY2FuMjA3IGFkZCAgICAgICAgICM3N2ZmZmYzZmNmZjNmY2ZmIC0xRS0zOTggLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYgSW5leGFjdCBSb3VuZGVkCistLSBOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZGRjYW4yMTEgYWRkICAwICAjN2MwM2ZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjIxMiBhZGQgICAgICM3YzAzZmYzZmNmZjNmY2ZmICAwICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKKy0tIE5hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZGRjYW4yMTMgYWRkICAwICAjN2M0MGZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjIxNCBhZGQgICAgICM3YzQwZmYzZmNmZjNmY2ZmICAwICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKKy0tIHNOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZGRjYW4yMTUgYWRkICAwICAjN2UwMGZmZmZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjIxNiBhZGQgICAgICM3ZTAwZmZmZmNmZjNmY2ZmICAwICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RkY2FuMjE3IGFkZCAgMCAgIzdlODBmZjNmY2ZmM2ZjZmYgICAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW4yMTggYWRkICAgICAjN2U4MGZmM2ZjZmYzZmNmZiAgMCAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCistLSBJbmY6IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkZGNhbjIyMCBhZGQgIDAgICM3ODgwMDAwMDAwMDAwMDAwICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMjIxIGFkZCAgICAgIzc4ODAwMDAwMDAwMDAwMDAgIDAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorLS0gSW5mOiBjb2VmZmljaWVudCBjb250aW51YXRpb24gYml0cworZGRjYW4yMjIgYWRkICAwICAjNzgwMjAwMDAwMDAwMDAwMCAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMjIzIGFkZCAgICAgIzc4MDIwMDAwMDAwMDAwMDAgIDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjIyNCBhZGQgIDAgICM3ODAwMDAwMDAwMDAwMDAxICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4yMjUgYWRkICAgICAjNzgwMDAwMDAwMDAwMDAwMSAgMCAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuMjI2IGFkZCAgMCAgIzc4MDAwMDIwMDAwMDAwMDAgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjIyNyBhZGQgICAgICM3ODAwMDAyMDAwMDAwMDAwICAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorCistLS0tLSBDbGFzczogW2RvZXMgbm90IHJldHVybiBlbmNvZGVkXQorCistLS0tLSBDb21wYXJlOgorZGRjYW4yMzEgY29tcGFyZSAtSW5mICAgMSAgICAgLT4gICNhMjM4MDAwMDAwMDAwMDAxCitkZGNhbjIzMiBjb21wYXJlIC1JbmYgIC1JbmYgICAtPiAgIzIyMzgwMDAwMDAwMDAwMDAKK2RkY2FuMjMzIGNvbXBhcmUgIDEgICAgLUluZiAgIC0+ICAjMjIzODAwMDAwMDAwMDAwMQorZGRjYW4yMzQgY29tcGFyZSAgIzdjMDBmZjNmZmZmM2ZjZmYgLTEwMDAgIC0+ICAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4yMzUgY29tcGFyZSAgIzdlMDBmZjNmZmZmM2ZjZmYgLTEwMDAgIC0+ICAjN2MwMGZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0tLS0gQ29tcGFyZVNpZzoKK2RkY2FuMjQxIGNvbXBhcmVzaWcgLUluZiAgIDEgICAgIC0+ICAjYTIzODAwMDAwMDAwMDAwMQorZGRjYW4yNDIgY29tcGFyZXNpZyAtSW5mICAtSW5mICAgLT4gICMyMjM4MDAwMDAwMDAwMDAwCitkZGNhbjI0MyBjb21wYXJlc2lnICAxICAgIC1JbmYgICAtPiAgIzIyMzgwMDAwMDAwMDAwMDEKK2RkY2FuMjQ0IGNvbXBhcmVzaWcgICM3YzAwZmYzZmZmZjNmY2ZmIC0xMDAwICAtPiAgIzdjMDBmZjNmY2ZmM2ZjZmYgIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjI0NSBjb21wYXJlc2lnICAjN2UwMGZmM2ZmZmYzZmNmZiAtMTAwMCAgLT4gICM3YzAwZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorCistLS0tLSBDb3B5OiBbZG9lcyBub3QgdXN1YWxseSBjYW5vbmljYWxpemVdCistLSBmaW5pdGVzCitkZGNhbjI1MCBjb3B5ICAjNzdmZmZmM2ZjZmYzZmNmZiAgLT4gIzc3ZmZmZjNmY2ZmM2ZjZmYKK2RkY2FuMjUxIGNvcHkgICM3N2ZjZmYzZmRmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZkZmYzZmNmZgorLS0gTmFOcworZGRjYW4yNTIgY29weSAgIzdjMDNmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAzZmYzZmNmZjNmY2ZmCitkZGNhbjI1MyBjb3B5ICAjN2MwMGZmM2ZjZmYzZmZmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZmZmYKK2RkY2FuMjU0IGNvcHkgICM3ZDAwZmYzZmNmZjNmY2ZmICAtPiAjN2QwMGZmM2ZjZmYzZmNmZgorZGRjYW4yNTUgY29weSAgIzdjMDRmZjNmY2ZmM2ZjZmYgIC0+ICM3YzA0ZmYzZmNmZjNmY2ZmCistLSBzTmFOCitkZGNhbjI1NiBjb3B5ICAjN2UwMGZmM2ZjZmZmZmNmZiAgLT4gIzdlMDBmZjNmY2ZmZmZjZmYKK2RkY2FuMjU3IGNvcHkgICM3ZTQwZmYzZmNmZjNmY2ZmICAtPiAjN2U0MGZmM2ZjZmYzZmNmZgorLS0gSW5mCitkZGNhbjI1OCBjb3B5ICAjN2EwMDAwMDAwMDAwMDAwMCAgLT4gIzdhMDAwMDAwMDAwMDAwMDAKK2RkY2FuMjU5IGNvcHkgICM3ODAwMjAwMDAwMDAwMDAwICAtPiAjNzgwMDIwMDAwMDAwMDAwMAorCistLS0tLSBDb3B5QWJzOiBbZG9lcyBub3QgdXN1YWxseSBjYW5vbmljYWxpemVdCistLSBmaW5pdGVzCitkZGNhbjI2MCBjb3B5YWJzICAjZjdmZmZmM2ZjZmYzZmNmZiAgLT4gIzc3ZmZmZjNmY2ZmM2ZjZmYKK2RkY2FuMjYxIGNvcHlhYnMgICNmN2ZjZmYzZmRmZjNmY2ZmICAtPiAjNzdmY2ZmM2ZkZmYzZmNmZgorLS0gTmFOcworZGRjYW4yNjIgY29weWFicyAgI2ZjMDNmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAzZmYzZmNmZjNmY2ZmCitkZGNhbjI2MyBjb3B5YWJzICAjZmMwMGZmM2ZjZmYzZmZmZiAgLT4gIzdjMDBmZjNmY2ZmM2ZmZmYKK2RkY2FuMjY0IGNvcHlhYnMgICNmZDAwZmYzZmNmZjNmY2ZmICAtPiAjN2QwMGZmM2ZjZmYzZmNmZgorZGRjYW4yNjUgY29weWFicyAgI2ZjMDRmZjNmY2ZmM2ZjZmYgIC0+ICM3YzA0ZmYzZmNmZjNmY2ZmCistLSBzTmFOCitkZGNhbjI2NiBjb3B5YWJzICAjZmUwMGZmM2ZjZmZmZmNmZiAgLT4gIzdlMDBmZjNmY2ZmZmZjZmYKK2RkY2FuMjY3IGNvcHlhYnMgICNmZTQwZmYzZmNmZjNmY2ZmICAtPiAjN2U0MGZmM2ZjZmYzZmNmZgorLS0gSW5mCitkZGNhbjI2OCBjb3B5YWJzICAjZmEwMDAwMDAwMDAwMDAwMCAgLT4gIzdhMDAwMDAwMDAwMDAwMDAKK2RkY2FuMjY5IGNvcHlhYnMgICNmODAwMjAwMDAwMDAwMDAwICAtPiAjNzgwMDIwMDAwMDAwMDAwMAorCistLS0tLSBDb3B5TmVnYXRlOiBbZG9lcyBub3QgdXN1YWxseSBjYW5vbmljYWxpemVdCistLSBmaW5pdGVzCitkZGNhbjI3MCBjb3B5bmVnYXRlICAjNzdmZmZmM2ZjZmYzZmNmZiAgLT4gI2Y3ZmZmZjNmY2ZmM2ZjZmYKK2RkY2FuMjcxIGNvcHluZWdhdGUgICM3N2ZjZmYzZmRmZjNmY2ZmICAtPiAjZjdmY2ZmM2ZkZmYzZmNmZgorLS0gTmFOcworZGRjYW4yNzIgY29weW5lZ2F0ZSAgIzdjMDNmZjNmY2ZmM2ZjZmYgIC0+ICNmYzAzZmYzZmNmZjNmY2ZmCitkZGNhbjI3MyBjb3B5bmVnYXRlICAjN2MwMGZmM2ZjZmYzZmZmZiAgLT4gI2ZjMDBmZjNmY2ZmM2ZmZmYKK2RkY2FuMjc0IGNvcHluZWdhdGUgICM3ZDAwZmYzZmNmZjNmY2ZmICAtPiAjZmQwMGZmM2ZjZmYzZmNmZgorZGRjYW4yNzUgY29weW5lZ2F0ZSAgIzdjMDRmZjNmY2ZmM2ZjZmYgIC0+ICNmYzA0ZmYzZmNmZjNmY2ZmCistLSBzTmFOCitkZGNhbjI3NiBjb3B5bmVnYXRlICAjN2UwMGZmM2ZjZmZmZmNmZiAgLT4gI2ZlMDBmZjNmY2ZmZmZjZmYKK2RkY2FuMjc3IGNvcHluZWdhdGUgICM3ZTQwZmYzZmNmZjNmY2ZmICAtPiAjZmU0MGZmM2ZjZmYzZmNmZgorLS0gSW5mCitkZGNhbjI3OCBjb3B5bmVnYXRlICAjN2EwMDAwMDAwMDAwMDAwMCAgLT4gI2ZhMDAwMDAwMDAwMDAwMDAKK2RkY2FuMjc5IGNvcHluZWdhdGUgICM3ODAwMjAwMDAwMDAwMDAwICAtPiAjZjgwMDIwMDAwMDAwMDAwMAorCistLS0tLSBDb3B5U2lnbjogW2RvZXMgbm90IHVzdWFsbHkgY2Fub25pY2FsaXplXQorLS0gZmluaXRlcworZGRjYW4yODAgY29weXNpZ24gICM3N2ZmZmYzZmNmZjNmY2ZmIC0xIC0+ICNmN2ZmZmYzZmNmZjNmY2ZmCitkZGNhbjI4MSBjb3B5c2lnbiAgIzc3ZmNmZjNmZGZmM2ZjZmYgIDEgLT4gIzc3ZmNmZjNmZGZmM2ZjZmYKKy0tIE5hTnMKK2RkY2FuMjgyIGNvcHlzaWduICAjN2MwM2ZmM2ZjZmYzZmNmZiAtMSAtPiAjZmMwM2ZmM2ZjZmYzZmNmZgorZGRjYW4yODMgY29weXNpZ24gICM3YzAwZmYzZmNmZjNmZmZmICAxIC0+ICM3YzAwZmYzZmNmZjNmZmZmCitkZGNhbjI4NCBjb3B5c2lnbiAgIzdkMDBmZjNmY2ZmM2ZjZmYgLTEgLT4gI2ZkMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuMjg1IGNvcHlzaWduICAjN2MwNGZmM2ZjZmYzZmNmZiAgMSAtPiAjN2MwNGZmM2ZjZmYzZmNmZgorLS0gc05hTgorZGRjYW4yODYgY29weXNpZ24gICM3ZTAwZmYzZmNmZmZmY2ZmIC0xIC0+ICNmZTAwZmYzZmNmZmZmY2ZmCitkZGNhbjI4NyBjb3B5c2lnbiAgIzdlNDBmZjNmY2ZmM2ZjZmYgIDEgLT4gIzdlNDBmZjNmY2ZmM2ZjZmYKKy0tIEluZgorZGRjYW4yODggY29weXNpZ24gICM3YTAwMDAwMDAwMDAwMDAwIC0xIC0+ICNmYTAwMDAwMDAwMDAwMDAwCitkZGNhbjI4OSBjb3B5c2lnbiAgIzc4MDAyMDAwMDAwMDAwMDAgIDEgLT4gIzc4MDAyMDAwMDAwMDAwMDAKKworLS0tLS0gTXVsdGlwbHk6CistLSBGaW5pdGVzOiBuZXV0cmFsIDAKK2RkY2FuMzAyIG11bHRpcGx5ICAxICAgICAgIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjMwMyBtdWx0aXBseSAgICAgICAgICM3N2ZjZmZmZmNmZjNmY2ZmICAxICAgICAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorLS0gbmVnYXRpdmUKK2RkY2FuMzA2IG11bHRpcGx5IC0xICAgICAgIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgIC0+ICNmN2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjMwNyBtdWx0aXBseSAgICAgICAgICM3N2ZjZmZmZmNmZjNmY2ZmIC0xICAgICAtPiAjZjdmY2ZmM2ZjZmYzZmNmZgorLS0gTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RkY2FuMzExIG11bHRpcGx5ICAxICAjN2MwM2ZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjMxMiBtdWx0aXBseSAgICAgIzdjMDNmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorLS0gTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkZGNhbjMxMyBtdWx0aXBseSAgMSAgIzdjNDBmZjNmY2ZmM2ZjZmYgICAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW4zMTQgbXVsdGlwbHkgICAgICM3YzQwZmYzZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKKy0tIHNOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZGRjYW4zMTUgbXVsdGlwbHkgIDEgICM3ZTAwZmZmZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuMzE2IG11bHRpcGx5ICAgICAjN2UwMGZmZmZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCistLSBzTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkZGNhbjMxNyBtdWx0aXBseSAgMSAgIzdlODBmZjNmY2ZmM2ZjZmYgICAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW4zMTggbXVsdGlwbHkgICAgICM3ZTgwZmYzZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKy0tIEluZjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMKK2RkY2FuMzIwIG11bHRpcGx5ICAxICAjNzg4MDAwMDAwMDAwMDAwMCAgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjMyMSBtdWx0aXBseSAgICAgIzc4ODAwMDAwMDAwMDAwMDAgIDEgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorLS0gSW5mOiBjb2VmZmljaWVudCBjb250aW51YXRpb24gYml0cworZGRjYW4zMjIgbXVsdGlwbHkgIDEgICM3ODAyMDAwMDAwMDAwMDAwICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4zMjMgbXVsdGlwbHkgICAgICM3ODAyMDAwMDAwMDAwMDAwICAxICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4zMjQgbXVsdGlwbHkgIDEgICM3ODAwMDAwMDAwMDAwMDAxICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4zMjUgbXVsdGlwbHkgICAgICM3ODAwMDAwMDAwMDAwMDAxICAxICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4zMjYgbXVsdGlwbHkgIDEgICM3ODAwMDAyMDAwMDAwMDAwICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGRjYW4zMjcgbXVsdGlwbHkgICAgICM3ODAwMDAyMDAwMDAwMDAwICAxICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorCistLS0tLSBRdWFudGl6ZToKK2RkY2FuNDAxIHF1YW50aXplICAjNmUzOGZmM2ZmZmYzZmNmZiAxICAgIC0+ICM2ZTM4ZmYzZmNmZjNmY2ZmCitkZGNhbjQwMiBxdWFudGl6ZSAgIzZlMzhmZjNmY2ZmM2ZkZmYgMCAgICAtPiAjNmUzOGZmM2ZjZmYzZmNmZgorZGRjYW40MDMgcXVhbnRpemUgICM3ODgwMDAwMDAwMDAwMDAwIEluZiAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNDA0IHF1YW50aXplICAjNzgwMjAwMDAwMDAwMDAwMCAtSW5mIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjQxMCBxdWFudGl6ZSAgIzdjMDNmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW40MTEgcXVhbnRpemUgICM3YzAzZmYzZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuNDEyIHF1YW50aXplICAjN2M0MGZmM2ZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjQxMyBxdWFudGl6ZSAgIzdjNDBmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW40MTQgcXVhbnRpemUgICM3ZTAwZmZmZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuNDE1IHF1YW50aXplICAjN2UwMGZmZmZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjQxNiBxdWFudGl6ZSAgIzdlODBmZjNmY2ZmM2ZjZmYgIDEgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW40MTcgcXVhbnRpemUgICM3ZTgwZmYzZmNmZjNmY2ZmICAxICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKworLS0tLS0gU3VidHJhY3Q6CistLSBGaW5pdGVzOiBuZXV0cmFsIDAKK2RkY2FuNTAyIHN1YnRyYWN0ICAwRSszODQgIzc3ZmZmZjNmY2ZmM2ZjZmYgICAgICAgIC0+ICNmN2ZjZmYzZmNmZjNmY2ZmCitkZGNhbjUwMyBzdWJ0cmFjdCAgICAgICAgICM3N2ZjZmZmZmNmZjNmY2ZmIDBFKzM4NCAtPiAjNzdmY2ZmM2ZjZmYzZmNmZgorLS0gdGlueSB6ZXJvCitkZGNhbjUwNCBzdWJ0cmFjdCAgMEUtMzk4ICM3N2ZmZmYzZmNmZjNmY2ZmICAgICAgICAtPiAjZjdmY2ZmM2ZjZmYzZmNmZiBSb3VuZGVkCitkZGNhbjUwNSBzdWJ0cmFjdCAgICAgICAgICM3N2ZjZmZmZmNmZjNmY2ZmIDBFLTM5OCAtPiAjNzdmY2ZmM2ZjZmYzZmNmZiBSb3VuZGVkCistLSB0aW55IG5vbiB6ZXJvCitkZGNhbjUwNiBzdWJ0cmFjdCAtMUUtMzk4ICM3N2ZmZmYzZmNmZjNmY2ZmICAgICAgICAgLT4gI2Y3ZmNmZjNmY2ZmM2ZjZmYgSW5leGFjdCBSb3VuZGVkCitkZGNhbjUwNyBzdWJ0cmFjdCAgICAgICAgICM3N2ZmZmYzZmNmZjNmY2ZmIC0xRS0zOTggLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYgSW5leGFjdCBSb3VuZGVkCistLSBOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZGRjYW41MTEgc3VidHJhY3QgIDAgICM3YzAzZmYzZmNmZjNmY2ZmICAgICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuNTEyIHN1YnRyYWN0ICAgICAjN2MwM2ZmM2ZjZmYzZmNmZiAgMCAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCistLSBOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RkY2FuNTEzIHN1YnRyYWN0ICAwICAjN2M0MGZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjUxNCBzdWJ0cmFjdCAgICAgIzdjNDBmZjNmY2ZmM2ZjZmYgIDAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorLS0gc05hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkZGNhbjUxNSBzdWJ0cmFjdCAgMCAgIzdlMDBmZmZmY2ZmM2ZjZmYgICAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW41MTYgc3VidHJhY3QgICAgICM3ZTAwZmZmZmNmZjNmY2ZmICAwICAgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKy0tIHNOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RkY2FuNTE3IHN1YnRyYWN0ICAwICAjN2U4MGZmM2ZjZmYzZmNmZiAgICAgIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjUxOCBzdWJ0cmFjdCAgICAgIzdlODBmZjNmY2ZmM2ZjZmYgIDAgICAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorLS0gSW5mOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cworZGRjYW41MjAgc3VidHJhY3QgIDAgICM3ODgwMDAwMDAwMDAwMDAwICAgICAgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNTIxIHN1YnRyYWN0ICAgICAjNzg4MDAwMDAwMDAwMDAwMCAgMCAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCistLSBJbmY6IGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkZGNhbjUyMiBzdWJ0cmFjdCAgMCAgIzc4MDIwMDAwMDAwMDAwMDAgICAgIC0+ICNmODAwMDAwMDAwMDAwMDAwCitkZGNhbjUyMyBzdWJ0cmFjdCAgICAgIzc4MDIwMDAwMDAwMDAwMDAgIDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjUyNCBzdWJ0cmFjdCAgMCAgIzc4MDAwMDAwMDAwMDAwMDEgICAgIC0+ICNmODAwMDAwMDAwMDAwMDAwCitkZGNhbjUyNSBzdWJ0cmFjdCAgICAgIzc4MDAwMDAwMDAwMDAwMDEgIDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjUyNiBzdWJ0cmFjdCAgMCAgIzc4MDAwMDIwMDAwMDAwMDAgICAgIC0+ICNmODAwMDAwMDAwMDAwMDAwCitkZGNhbjUyNyBzdWJ0cmFjdCAgICAgIzc4MDAwMDIwMDAwMDAwMDAgIDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwCisKKy0tLS0tIFRvSW50ZWdyYWw6CitkZGNhbjYwMSB0b2ludGVncmFseCAgIzZlMzhmZjNmZmZmM2ZjZmYgLT4gIzZlMzhmZjNmY2ZmM2ZjZmYKK2RkY2FuNjAyIHRvaW50ZWdyYWx4ICAjNmUzOGZmM2ZjZmYzZmRmZiAtPiAjNmUzOGZmM2ZjZmYzZmNmZgorZGRjYW42MDMgdG9pbnRlZ3JhbHggICM3ODgwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZGNhbjYwNCB0b2ludGVncmFseCAgIzc4MDIwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RkY2FuNjEwIHRvaW50ZWdyYWx4ICAjN2MwM2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW42MTEgdG9pbnRlZ3JhbHggICM3YzAzZmYzZmNmZjNmY2ZmIC0+ICM3YzAwZmYzZmNmZjNmY2ZmCitkZGNhbjYxMiB0b2ludGVncmFseCAgIzdjNDBmZjNmY2ZmM2ZjZmYgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYKK2RkY2FuNjEzIHRvaW50ZWdyYWx4ICAjN2M0MGZmM2ZjZmYzZmNmZiAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorZGRjYW42MTQgdG9pbnRlZ3JhbHggICM3ZTAwZmZmZmNmZjNmY2ZmIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkZGNhbjYxNSB0b2ludGVncmFseCAgIzdlMDBmZmZmY2ZmM2ZjZmYgLT4gIzdjMDBmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KK2RkY2FuNjE2IHRvaW50ZWdyYWx4ICAjN2U4MGZmM2ZjZmYzZmNmZiAtPiAjN2MwMGZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZGRjYW42MTcgdG9pbnRlZ3JhbHggICM3ZTgwZmYzZmNmZjNmY2ZmIC0+ICM3YzAwZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCistLSB1bmNhbm9uaWNhbCAzOTk5LCAzOS45OSwgMy45OSwgMC4zOTksIGFuZCBuZWdhdGl2ZXMKK2RkY2FuNjE4IHRvaW50ZWdyYWx4ICAjMjIzODAwMDAwMDAwMGZmZiAtPiAjMjIzODAwMDAwMDAwMGNmZgorZGRjYW42MTkgdG9pbnRlZ3JhbHggICMyMjMwMDAwMDAwMDAwZmZmIC0+ICMyMjM4MDAwMDAwMDAwMDQwIEluZXhhY3QgUm91bmRlZAorZGRjYW42MjAgdG9pbnRlZ3JhbHggICMyMjJjMDAwMDAwMDAwZmZmIC0+ICMyMjM4MDAwMDAwMDAwMDA0IEluZXhhY3QgUm91bmRlZAorZGRjYW42MjEgdG9pbnRlZ3JhbHggICMyMjI4MDAwMDAwMDAwZmZmIC0+ICMyMjM4MDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRjYW42MjIgdG9pbnRlZ3JhbHggICNhMjM4MDAwMDAwMDAwZmZmIC0+ICNhMjM4MDAwMDAwMDAwY2ZmCitkZGNhbjYyMyB0b2ludGVncmFseCAgI2EyMzAwMDAwMDAwMDBmZmYgLT4gI2EyMzgwMDAwMDAwMDAwNDAgSW5leGFjdCBSb3VuZGVkCitkZGNhbjYyNCB0b2ludGVncmFseCAgI2EyMmMwMDAwMDAwMDBmZmYgLT4gI2EyMzgwMDAwMDAwMDAwMDQgSW5leGFjdCBSb3VuZGVkCitkZGNhbjYyNSB0b2ludGVncmFseCAgI2EyMjgwMDAwMDAwMDBmZmYgLT4gI2EyMzgwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ2xhc3MuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDbGFzcy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMzRjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ2xhc3MuZGVjVGVzdApAQCAtMCwwICsxLDc2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkQ2xhc3MuZGVjVGVzdCAtLSBkZWNEb3VibGUgQ2xhc3Mgb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gW05ldyAyMDA2LjExLjI3XQorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2RkY2xhMDAxICBjbGFzcyAgICAwICAgICAgICAgICAgICAgICAgICAgICAgLT4gK1plcm8KK2RkY2xhMDAyICBjbGFzcyAgICAwLjAwICAgICAgICAgICAgICAgICAgICAgLT4gK1plcm8KK2RkY2xhMDAzICBjbGFzcyAgICAwRSs1ICAgICAgICAgICAgICAgICAgICAgLT4gK1plcm8KK2RkY2xhMDA0ICBjbGFzcyAgICAxRS0zOTYgICAgICAgICAgICAgICAgICAgLT4gK1N1Ym5vcm1hbAorZGRjbGEwMDUgIGNsYXNzICAwLjFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiArU3Vibm9ybWFsCitkZGNsYTAwNiAgY2xhc3MgIDAuOTk5OTk5OTk5OTk5OTk5RS0zODMgICAgIC0+ICtTdWJub3JtYWwKK2RkY2xhMDA3ICBjbGFzcyAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLT4gK05vcm1hbAorZGRjbGEwMDggIGNsYXNzICAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkZGNsYTAwOSAgY2xhc3MgICAxRS0xMDAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RkY2xhMDEwICBjbGFzcyAgIDFFLTEwICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZGRjbGEwMTIgIGNsYXNzICAgMUUtMSAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkZGNsYTAxMyAgY2xhc3MgICAxICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RkY2xhMDE0ICBjbGFzcyAgIDIuNTAgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZGRjbGEwMTUgIGNsYXNzICAgMTAwLjEwMCAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkZGNsYTAxNiAgY2xhc3MgICAxRSszMCAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RkY2xhMDE3ICBjbGFzcyAgIDFFKzM4NCAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZGRjbGEwMTggIGNsYXNzICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAtPiArTm9ybWFsCitkZGNsYTAxOSAgY2xhc3MgICBJbmYgICAgICAgICAgICAgICAgICAgICAgIC0+ICtJbmZpbml0eQorCitkZGNsYTAyMSAgY2xhc3MgICAtMCAgICAgICAgICAgICAgICAgICAgICAgIC0+IC1aZXJvCitkZGNsYTAyMiAgY2xhc3MgICAtMC4wMCAgICAgICAgICAgICAgICAgICAgIC0+IC1aZXJvCitkZGNsYTAyMyAgY2xhc3MgICAtMEUrNSAgICAgICAgICAgICAgICAgICAgIC0+IC1aZXJvCitkZGNsYTAyNCAgY2xhc3MgICAtMUUtMzk2ICAgICAgICAgICAgICAgICAgIC0+IC1TdWJub3JtYWwKK2RkY2xhMDI1ICBjbGFzcyAgLTAuMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gLVN1Ym5vcm1hbAorZGRjbGEwMjYgIGNsYXNzICAtMC45OTk5OTk5OTk5OTk5OTlFLTM4MyAgICAtPiAtU3Vibm9ybWFsCitkZGNsYTAyNyAgY2xhc3MgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgIC0+IC1Ob3JtYWwKK2RkY2xhMDI4ICBjbGFzcyAgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZGRjbGEwMjkgIGNsYXNzICAtMUUtMTAwICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkZGNsYTAzMCAgY2xhc3MgIC0xRS0xMCAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RkY2xhMDMyICBjbGFzcyAgLTFFLTEgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZGRjbGEwMzMgIGNsYXNzICAtMSAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkZGNsYTAzNCAgY2xhc3MgIC0yLjUwICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RkY2xhMDM1ICBjbGFzcyAgLTEwMC4xMDAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZGRjbGEwMzYgIGNsYXNzICAtMUUrMzAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkZGNsYTAzNyAgY2xhc3MgIC0xRSszODQgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RkY2xhMDM4ICBjbGFzcyAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgLT4gLU5vcm1hbAorZGRjbGEwMzkgIGNsYXNzICAtSW5mICAgICAgICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkKKworZGRjbGEwNDEgIGNsYXNzICAgTmFOICAgICAgICAgICAgICAgICAgICAgICAtPiBOYU4KK2RkY2xhMDQyICBjbGFzcyAgLU5hTiAgICAgICAgICAgICAgICAgICAgICAgLT4gTmFOCitkZGNsYTA0MyAgY2xhc3MgICtOYU4xMjM0NSAgICAgICAgICAgICAgICAgIC0+IE5hTgorZGRjbGEwNDQgIGNsYXNzICAgc05hTiAgICAgICAgICAgICAgICAgICAgICAtPiBzTmFOCitkZGNsYTA0NSAgY2xhc3MgIC1zTmFOICAgICAgICAgICAgICAgICAgICAgIC0+IHNOYU4KK2RkY2xhMDQ2ICBjbGFzcyAgK3NOYU4xMjM0NSAgICAgICAgICAgICAgICAgLT4gc05hTgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb21wYXJlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlYmZjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb21wYXJlLmRlY1Rlc3QKQEAgLTAsMCArMSw3NDQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb21wYXJlLmRlY1Rlc3QgLS0gZGVjRG91YmxlIGNvbXBhcmlzb24gdGhhdCBhbGxvd3MgcXVpZXQgTmFOcyAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RkY29tMDAxIGNvbXBhcmUgIC0yICAtMiAgLT4gMAorZGRjb20wMDIgY29tcGFyZSAgLTIgIC0xICAtPiAtMQorZGRjb20wMDMgY29tcGFyZSAgLTIgICAwICAtPiAtMQorZGRjb20wMDQgY29tcGFyZSAgLTIgICAxICAtPiAtMQorZGRjb20wMDUgY29tcGFyZSAgLTIgICAyICAtPiAtMQorZGRjb20wMDYgY29tcGFyZSAgLTEgIC0yICAtPiAxCitkZGNvbTAwNyBjb21wYXJlICAtMSAgLTEgIC0+IDAKK2RkY29tMDA4IGNvbXBhcmUgIC0xICAgMCAgLT4gLTEKK2RkY29tMDA5IGNvbXBhcmUgIC0xICAgMSAgLT4gLTEKK2RkY29tMDEwIGNvbXBhcmUgIC0xICAgMiAgLT4gLTEKK2RkY29tMDExIGNvbXBhcmUgICAwICAtMiAgLT4gMQorZGRjb20wMTIgY29tcGFyZSAgIDAgIC0xICAtPiAxCitkZGNvbTAxMyBjb21wYXJlICAgMCAgIDAgIC0+IDAKK2RkY29tMDE0IGNvbXBhcmUgICAwICAgMSAgLT4gLTEKK2RkY29tMDE1IGNvbXBhcmUgICAwICAgMiAgLT4gLTEKK2RkY29tMDE2IGNvbXBhcmUgICAxICAtMiAgLT4gMQorZGRjb20wMTcgY29tcGFyZSAgIDEgIC0xICAtPiAxCitkZGNvbTAxOCBjb21wYXJlICAgMSAgIDAgIC0+IDEKK2RkY29tMDE5IGNvbXBhcmUgICAxICAgMSAgLT4gMAorZGRjb20wMjAgY29tcGFyZSAgIDEgICAyICAtPiAtMQorZGRjb20wMjEgY29tcGFyZSAgIDIgIC0yICAtPiAxCitkZGNvbTAyMiBjb21wYXJlICAgMiAgLTEgIC0+IDEKK2RkY29tMDIzIGNvbXBhcmUgICAyICAgMCAgLT4gMQorZGRjb20wMjUgY29tcGFyZSAgIDIgICAxICAtPiAxCitkZGNvbTAyNiBjb21wYXJlICAgMiAgIDIgIC0+IDAKKworZGRjb20wMzEgY29tcGFyZSAgLTIwICAtMjAgIC0+IDAKK2RkY29tMDMyIGNvbXBhcmUgIC0yMCAgLTEwICAtPiAtMQorZGRjb20wMzMgY29tcGFyZSAgLTIwICAgMDAgIC0+IC0xCitkZGNvbTAzNCBjb21wYXJlICAtMjAgICAxMCAgLT4gLTEKK2RkY29tMDM1IGNvbXBhcmUgIC0yMCAgIDIwICAtPiAtMQorZGRjb20wMzYgY29tcGFyZSAgLTEwICAtMjAgIC0+IDEKK2RkY29tMDM3IGNvbXBhcmUgIC0xMCAgLTEwICAtPiAwCitkZGNvbTAzOCBjb21wYXJlICAtMTAgICAwMCAgLT4gLTEKK2RkY29tMDM5IGNvbXBhcmUgIC0xMCAgIDEwICAtPiAtMQorZGRjb20wNDAgY29tcGFyZSAgLTEwICAgMjAgIC0+IC0xCitkZGNvbTA0MSBjb21wYXJlICAgMDAgIC0yMCAgLT4gMQorZGRjb20wNDIgY29tcGFyZSAgIDAwICAtMTAgIC0+IDEKK2RkY29tMDQzIGNvbXBhcmUgICAwMCAgIDAwICAtPiAwCitkZGNvbTA0NCBjb21wYXJlICAgMDAgICAxMCAgLT4gLTEKK2RkY29tMDQ1IGNvbXBhcmUgICAwMCAgIDIwICAtPiAtMQorZGRjb20wNDYgY29tcGFyZSAgIDEwICAtMjAgIC0+IDEKK2RkY29tMDQ3IGNvbXBhcmUgICAxMCAgLTEwICAtPiAxCitkZGNvbTA0OCBjb21wYXJlICAgMTAgICAwMCAgLT4gMQorZGRjb20wNDkgY29tcGFyZSAgIDEwICAgMTAgIC0+IDAKK2RkY29tMDUwIGNvbXBhcmUgICAxMCAgIDIwICAtPiAtMQorZGRjb20wNTEgY29tcGFyZSAgIDIwICAtMjAgIC0+IDEKK2RkY29tMDUyIGNvbXBhcmUgICAyMCAgLTEwICAtPiAxCitkZGNvbTA1MyBjb21wYXJlICAgMjAgICAwMCAgLT4gMQorZGRjb20wNTUgY29tcGFyZSAgIDIwICAgMTAgIC0+IDEKK2RkY29tMDU2IGNvbXBhcmUgICAyMCAgIDIwICAtPiAwCisKK2RkY29tMDYxIGNvbXBhcmUgIC0yLjAgIC0yLjAgIC0+IDAKK2RkY29tMDYyIGNvbXBhcmUgIC0yLjAgIC0xLjAgIC0+IC0xCitkZGNvbTA2MyBjb21wYXJlICAtMi4wICAgMC4wICAtPiAtMQorZGRjb20wNjQgY29tcGFyZSAgLTIuMCAgIDEuMCAgLT4gLTEKK2RkY29tMDY1IGNvbXBhcmUgIC0yLjAgICAyLjAgIC0+IC0xCitkZGNvbTA2NiBjb21wYXJlICAtMS4wICAtMi4wICAtPiAxCitkZGNvbTA2NyBjb21wYXJlICAtMS4wICAtMS4wICAtPiAwCitkZGNvbTA2OCBjb21wYXJlICAtMS4wICAgMC4wICAtPiAtMQorZGRjb20wNjkgY29tcGFyZSAgLTEuMCAgIDEuMCAgLT4gLTEKK2RkY29tMDcwIGNvbXBhcmUgIC0xLjAgICAyLjAgIC0+IC0xCitkZGNvbTA3MSBjb21wYXJlICAgMC4wICAtMi4wICAtPiAxCitkZGNvbTA3MiBjb21wYXJlICAgMC4wICAtMS4wICAtPiAxCitkZGNvbTA3MyBjb21wYXJlICAgMC4wICAgMC4wICAtPiAwCitkZGNvbTA3NCBjb21wYXJlICAgMC4wICAgMS4wICAtPiAtMQorZGRjb20wNzUgY29tcGFyZSAgIDAuMCAgIDIuMCAgLT4gLTEKK2RkY29tMDc2IGNvbXBhcmUgICAxLjAgIC0yLjAgIC0+IDEKK2RkY29tMDc3IGNvbXBhcmUgICAxLjAgIC0xLjAgIC0+IDEKK2RkY29tMDc4IGNvbXBhcmUgICAxLjAgICAwLjAgIC0+IDEKK2RkY29tMDc5IGNvbXBhcmUgICAxLjAgICAxLjAgIC0+IDAKK2RkY29tMDgwIGNvbXBhcmUgICAxLjAgICAyLjAgIC0+IC0xCitkZGNvbTA4MSBjb21wYXJlICAgMi4wICAtMi4wICAtPiAxCitkZGNvbTA4MiBjb21wYXJlICAgMi4wICAtMS4wICAtPiAxCitkZGNvbTA4MyBjb21wYXJlICAgMi4wICAgMC4wICAtPiAxCitkZGNvbTA4NSBjb21wYXJlICAgMi4wICAgMS4wICAtPiAxCitkZGNvbTA4NiBjb21wYXJlICAgMi4wICAgMi4wICAtPiAwCitkZGNvbTA4NyBjb21wYXJlICAgMS4wICAgMC4xICAtPiAxCitkZGNvbTA4OCBjb21wYXJlICAgMC4xICAgMS4wICAtPiAtMQorCistLSBub3cgc29tZSBjYXNlcyB3aGljaCBtaWdodCBvdmVyZmxvdyBpZiBzdWJ0cmFjdCB3ZXJlIHVzZWQKK2RkY29tMDk1IGNvbXBhcmUgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gMAorZGRjb20wOTYgY29tcGFyZSAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtMQorZGRjb20wOTcgY29tcGFyZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAxCitkZGNvbTA5OCBjb21wYXJlIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+IDAKKworLS0gc29tZSBkaWZmZXJpbmcgbGVuZ3RoL2V4cG9uZW50IGNhc2VzCitkZGNvbTEwMCBjb21wYXJlICAgNy4wICAgIDcuMCAgICAtPiAwCitkZGNvbTEwMSBjb21wYXJlICAgNy4wICAgIDcgICAgICAtPiAwCitkZGNvbTEwMiBjb21wYXJlICAgNyAgICAgIDcuMCAgICAtPiAwCitkZGNvbTEwMyBjb21wYXJlICAgN0UrMCAgIDcuMCAgICAtPiAwCitkZGNvbTEwNCBjb21wYXJlICAgNzBFLTEgIDcuMCAgICAtPiAwCitkZGNvbTEwNSBjb21wYXJlICAgMC43RSsxIDcgICAgICAtPiAwCitkZGNvbTEwNiBjb21wYXJlICAgNzBFLTEgIDcgICAgICAtPiAwCitkZGNvbTEwNyBjb21wYXJlICAgNy4wICAgIDdFKzAgICAtPiAwCitkZGNvbTEwOCBjb21wYXJlICAgNy4wICAgIDcwRS0xICAtPiAwCitkZGNvbTEwOSBjb21wYXJlICAgNyAgICAgIDAuN0UrMSAtPiAwCitkZGNvbTExMCBjb21wYXJlICAgNyAgICAgIDcwRS0xICAtPiAwCisKK2RkY29tMTIwIGNvbXBhcmUgICA4LjAgICAgNy4wICAgIC0+IDEKK2RkY29tMTIxIGNvbXBhcmUgICA4LjAgICAgNyAgICAgIC0+IDEKK2RkY29tMTIyIGNvbXBhcmUgICA4ICAgICAgNy4wICAgIC0+IDEKK2RkY29tMTIzIGNvbXBhcmUgICA4RSswICAgNy4wICAgIC0+IDEKK2RkY29tMTI0IGNvbXBhcmUgICA4MEUtMSAgNy4wICAgIC0+IDEKK2RkY29tMTI1IGNvbXBhcmUgICAwLjhFKzEgNyAgICAgIC0+IDEKK2RkY29tMTI2IGNvbXBhcmUgICA4MEUtMSAgNyAgICAgIC0+IDEKK2RkY29tMTI3IGNvbXBhcmUgICA4LjAgICAgN0UrMCAgIC0+IDEKK2RkY29tMTI4IGNvbXBhcmUgICA4LjAgICAgNzBFLTEgIC0+IDEKK2RkY29tMTI5IGNvbXBhcmUgICA4ICAgICAgMC43RSsxICAtPiAxCitkZGNvbTEzMCBjb21wYXJlICAgOCAgICAgIDcwRS0xICAtPiAxCisKK2RkY29tMTQwIGNvbXBhcmUgICA4LjAgICAgOS4wICAgIC0+IC0xCitkZGNvbTE0MSBjb21wYXJlICAgOC4wICAgIDkgICAgICAtPiAtMQorZGRjb20xNDIgY29tcGFyZSAgIDggICAgICA5LjAgICAgLT4gLTEKK2RkY29tMTQzIGNvbXBhcmUgICA4RSswICAgOS4wICAgIC0+IC0xCitkZGNvbTE0NCBjb21wYXJlICAgODBFLTEgIDkuMCAgICAtPiAtMQorZGRjb20xNDUgY29tcGFyZSAgIDAuOEUrMSA5ICAgICAgLT4gLTEKK2RkY29tMTQ2IGNvbXBhcmUgICA4MEUtMSAgOSAgICAgIC0+IC0xCitkZGNvbTE0NyBjb21wYXJlICAgOC4wICAgIDlFKzAgICAtPiAtMQorZGRjb20xNDggY29tcGFyZSAgIDguMCAgICA5MEUtMSAgLT4gLTEKK2RkY29tMTQ5IGNvbXBhcmUgICA4ICAgICAgMC45RSsxIC0+IC0xCitkZGNvbTE1MCBjb21wYXJlICAgOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0rIC4uCitkZGNvbTIwMCBjb21wYXJlICAtNy4wICAgIDcuMCAgICAtPiAtMQorZGRjb20yMDEgY29tcGFyZSAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2RkY29tMjAyIGNvbXBhcmUgIC03ICAgICAgNy4wICAgIC0+IC0xCitkZGNvbTIwMyBjb21wYXJlICAtN0UrMCAgIDcuMCAgICAtPiAtMQorZGRjb20yMDQgY29tcGFyZSAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2RkY29tMjA1IGNvbXBhcmUgIC0wLjdFKzEgNyAgICAgIC0+IC0xCitkZGNvbTIwNiBjb21wYXJlICAtNzBFLTEgIDcgICAgICAtPiAtMQorZGRjb20yMDcgY29tcGFyZSAgLTcuMCAgICA3RSswICAgLT4gLTEKK2RkY29tMjA4IGNvbXBhcmUgIC03LjAgICAgNzBFLTEgIC0+IC0xCitkZGNvbTIwOSBjb21wYXJlICAtNyAgICAgIDAuN0UrMSAtPiAtMQorZGRjb20yMTAgY29tcGFyZSAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworZGRjb20yMjAgY29tcGFyZSAgLTguMCAgICA3LjAgICAgLT4gLTEKK2RkY29tMjIxIGNvbXBhcmUgIC04LjAgICAgNyAgICAgIC0+IC0xCitkZGNvbTIyMiBjb21wYXJlICAtOCAgICAgIDcuMCAgICAtPiAtMQorZGRjb20yMjMgY29tcGFyZSAgLThFKzAgICA3LjAgICAgLT4gLTEKK2RkY29tMjI0IGNvbXBhcmUgIC04MEUtMSAgNy4wICAgIC0+IC0xCitkZGNvbTIyNSBjb21wYXJlICAtMC44RSsxIDcgICAgICAtPiAtMQorZGRjb20yMjYgY29tcGFyZSAgLTgwRS0xICA3ICAgICAgLT4gLTEKK2RkY29tMjI3IGNvbXBhcmUgIC04LjAgICAgN0UrMCAgIC0+IC0xCitkZGNvbTIyOCBjb21wYXJlICAtOC4wICAgIDcwRS0xICAtPiAtMQorZGRjb20yMjkgY29tcGFyZSAgLTggICAgICAwLjdFKzEgLT4gLTEKK2RkY29tMjMwIGNvbXBhcmUgIC04ICAgICAgNzBFLTEgIC0+IC0xCisKK2RkY29tMjQwIGNvbXBhcmUgIC04LjAgICAgOS4wICAgIC0+IC0xCitkZGNvbTI0MSBjb21wYXJlICAtOC4wICAgIDkgICAgICAtPiAtMQorZGRjb20yNDIgY29tcGFyZSAgLTggICAgICA5LjAgICAgLT4gLTEKK2RkY29tMjQzIGNvbXBhcmUgIC04RSswICAgOS4wICAgIC0+IC0xCitkZGNvbTI0NCBjb21wYXJlICAtODBFLTEgIDkuMCAgICAtPiAtMQorZGRjb20yNDUgY29tcGFyZSAgLTAuOEUrMSA5ICAgICAgLT4gLTEKK2RkY29tMjQ2IGNvbXBhcmUgIC04MEUtMSAgOSAgICAgIC0+IC0xCitkZGNvbTI0NyBjb21wYXJlICAtOC4wICAgIDlFKzAgICAtPiAtMQorZGRjb20yNDggY29tcGFyZSAgLTguMCAgICA5MEUtMSAgLT4gLTEKK2RkY29tMjQ5IGNvbXBhcmUgIC04ICAgICAgMC45RSsxIC0+IC0xCitkZGNvbTI1MCBjb21wYXJlICAtOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzICstIC4uCitkZGNvbTMwMCBjb21wYXJlICAgNy4wICAgIC03LjAgICAgLT4gMQorZGRjb20zMDEgY29tcGFyZSAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2RkY29tMzAyIGNvbXBhcmUgICA3ICAgICAgLTcuMCAgICAtPiAxCitkZGNvbTMwMyBjb21wYXJlICAgN0UrMCAgIC03LjAgICAgLT4gMQorZGRjb20zMDQgY29tcGFyZSAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2RkY29tMzA1IGNvbXBhcmUgICAuN0UrMSAgLTcgICAgICAtPiAxCitkZGNvbTMwNiBjb21wYXJlICAgNzBFLTEgIC03ICAgICAgLT4gMQorZGRjb20zMDcgY29tcGFyZSAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2RkY29tMzA4IGNvbXBhcmUgICA3LjAgICAgLTcwRS0xICAtPiAxCitkZGNvbTMwOSBjb21wYXJlICAgNyAgICAgIC0uN0UrMSAgLT4gMQorZGRjb20zMTAgY29tcGFyZSAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworZGRjb20zMjAgY29tcGFyZSAgIDguMCAgICAtNy4wICAgIC0+IDEKK2RkY29tMzIxIGNvbXBhcmUgICA4LjAgICAgLTcgICAgICAtPiAxCitkZGNvbTMyMiBjb21wYXJlICAgOCAgICAgIC03LjAgICAgLT4gMQorZGRjb20zMjMgY29tcGFyZSAgIDhFKzAgICAtNy4wICAgIC0+IDEKK2RkY29tMzI0IGNvbXBhcmUgICA4MEUtMSAgLTcuMCAgICAtPiAxCitkZGNvbTMyNSBjb21wYXJlICAgLjhFKzEgIC03ICAgICAgLT4gMQorZGRjb20zMjYgY29tcGFyZSAgIDgwRS0xICAtNyAgICAgIC0+IDEKK2RkY29tMzI3IGNvbXBhcmUgICA4LjAgICAgLTdFKzAgICAtPiAxCitkZGNvbTMyOCBjb21wYXJlICAgOC4wICAgIC03MEUtMSAgLT4gMQorZGRjb20zMjkgY29tcGFyZSAgIDggICAgICAtLjdFKzEgIC0+IDEKK2RkY29tMzMwIGNvbXBhcmUgICA4ICAgICAgLTcwRS0xICAtPiAxCisKK2RkY29tMzQwIGNvbXBhcmUgICA4LjAgICAgLTkuMCAgICAtPiAxCitkZGNvbTM0MSBjb21wYXJlICAgOC4wICAgIC05ICAgICAgLT4gMQorZGRjb20zNDIgY29tcGFyZSAgIDggICAgICAtOS4wICAgIC0+IDEKK2RkY29tMzQzIGNvbXBhcmUgICA4RSswICAgLTkuMCAgICAtPiAxCitkZGNvbTM0NCBjb21wYXJlICAgODBFLTEgIC05LjAgICAgLT4gMQorZGRjb20zNDUgY29tcGFyZSAgIC44RSsxICAtOSAgICAgIC0+IDEKK2RkY29tMzQ2IGNvbXBhcmUgICA4MEUtMSAgLTkgICAgICAtPiAxCitkZGNvbTM0NyBjb21wYXJlICAgOC4wICAgIC05RSswICAgLT4gMQorZGRjb20zNDggY29tcGFyZSAgIDguMCAgICAtOTBFLTEgIC0+IDEKK2RkY29tMzQ5IGNvbXBhcmUgICA4ICAgICAgLS45RSsxICAtPiAxCitkZGNvbTM1MCBjb21wYXJlICAgOCAgICAgIC05MEUtMSAgLT4gMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0tIC4uCitkZGNvbTQwMCBjb21wYXJlICAgLTcuMCAgICAtNy4wICAgIC0+IDAKK2RkY29tNDAxIGNvbXBhcmUgICAtNy4wICAgIC03ICAgICAgLT4gMAorZGRjb200MDIgY29tcGFyZSAgIC03ICAgICAgLTcuMCAgICAtPiAwCitkZGNvbTQwMyBjb21wYXJlICAgLTdFKzAgICAtNy4wICAgIC0+IDAKK2RkY29tNDA0IGNvbXBhcmUgICAtNzBFLTEgIC03LjAgICAgLT4gMAorZGRjb200MDUgY29tcGFyZSAgIC0uN0UrMSAgLTcgICAgICAtPiAwCitkZGNvbTQwNiBjb21wYXJlICAgLTcwRS0xICAtNyAgICAgIC0+IDAKK2RkY29tNDA3IGNvbXBhcmUgICAtNy4wICAgIC03RSswICAgLT4gMAorZGRjb200MDggY29tcGFyZSAgIC03LjAgICAgLTcwRS0xICAtPiAwCitkZGNvbTQwOSBjb21wYXJlICAgLTcgICAgICAtLjdFKzEgIC0+IDAKK2RkY29tNDEwIGNvbXBhcmUgICAtNyAgICAgIC03MEUtMSAgLT4gMAorCitkZGNvbTQyMCBjb21wYXJlICAgLTguMCAgICAtNy4wICAgIC0+IC0xCitkZGNvbTQyMSBjb21wYXJlICAgLTguMCAgICAtNyAgICAgIC0+IC0xCitkZGNvbTQyMiBjb21wYXJlICAgLTggICAgICAtNy4wICAgIC0+IC0xCitkZGNvbTQyMyBjb21wYXJlICAgLThFKzAgICAtNy4wICAgIC0+IC0xCitkZGNvbTQyNCBjb21wYXJlICAgLTgwRS0xICAtNy4wICAgIC0+IC0xCitkZGNvbTQyNSBjb21wYXJlICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitkZGNvbTQyNiBjb21wYXJlICAgLTgwRS0xICAtNyAgICAgIC0+IC0xCitkZGNvbTQyNyBjb21wYXJlICAgLTguMCAgICAtN0UrMCAgIC0+IC0xCitkZGNvbTQyOCBjb21wYXJlICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitkZGNvbTQyOSBjb21wYXJlICAgLTggICAgICAtLjdFKzEgIC0+IC0xCitkZGNvbTQzMCBjb21wYXJlICAgLTggICAgICAtNzBFLTEgIC0+IC0xCisKK2RkY29tNDQwIGNvbXBhcmUgICAtOC4wICAgIC05LjAgICAgLT4gMQorZGRjb200NDEgY29tcGFyZSAgIC04LjAgICAgLTkgICAgICAtPiAxCitkZGNvbTQ0MiBjb21wYXJlICAgLTggICAgICAtOS4wICAgIC0+IDEKK2RkY29tNDQzIGNvbXBhcmUgICAtOEUrMCAgIC05LjAgICAgLT4gMQorZGRjb200NDQgY29tcGFyZSAgIC04MEUtMSAgLTkuMCAgICAtPiAxCitkZGNvbTQ0NSBjb21wYXJlICAgLS44RSsxICAtOSAgICAgIC0+IDEKK2RkY29tNDQ2IGNvbXBhcmUgICAtODBFLTEgIC05ICAgICAgLT4gMQorZGRjb200NDcgY29tcGFyZSAgIC04LjAgICAgLTlFKzAgICAtPiAxCitkZGNvbTQ0OCBjb21wYXJlICAgLTguMCAgICAtOTBFLTEgIC0+IDEKK2RkY29tNDQ5IGNvbXBhcmUgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorZGRjb200NTAgY29tcGFyZSAgIC04ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIG1pc2FsaWdubWVudCB0cmFwcyBmb3IgbGl0dGxlLWVuZGlhbgorZGRjb200NTEgY29tcGFyZSAgICAgIDEuMCAgICAgICAwLjEgIC0+IDEKK2RkY29tNDUyIGNvbXBhcmUgICAgICAwLjEgICAgICAgMS4wICAtPiAtMQorZGRjb200NTMgY29tcGFyZSAgICAgMTAuMCAgICAgICAwLjEgIC0+IDEKK2RkY29tNDU0IGNvbXBhcmUgICAgICAwLjEgICAgICAxMC4wICAtPiAtMQorZGRjb200NTUgY29tcGFyZSAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEKK2RkY29tNDU2IGNvbXBhcmUgICAgICAxLjAgICAgICAgMTAwICAtPiAtMQorZGRjb200NTcgY29tcGFyZSAgICAgMTAwMCAgICAgIDEwLjAgIC0+IDEKK2RkY29tNDU4IGNvbXBhcmUgICAgIDEwLjAgICAgICAxMDAwICAtPiAtMQorZGRjb200NTkgY29tcGFyZSAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEKK2RkY29tNDYwIGNvbXBhcmUgICAgMTAwLjAgICAgIDEwMDAwICAtPiAtMQorZGRjb200NjEgY29tcGFyZSAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEKK2RkY29tNDYyIGNvbXBhcmUgICAxMDAwLjAgICAgMTAwMDAwICAtPiAtMQorZGRjb200NjMgY29tcGFyZSAgMTAwMDAwMCAgIDEwMDAwLjAgIC0+IDEKK2RkY29tNDY0IGNvbXBhcmUgIDEwMDAwLjAgICAxMDAwMDAwICAtPiAtMQorCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK2RkY29tNDczIGNvbXBhcmUgMTIzLjQ1NjAwMDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY29tNDc0IGNvbXBhcmUgMTIzLjQ1NjAwMDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gMAorZGRjb200NzUgY29tcGFyZSAxMjMuNDU2MDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY29tNDc2IGNvbXBhcmUgMTIzLjQ1NjAwMDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY29tNDc3IGNvbXBhcmUgMTIzLjQ1NjAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjb200NzggY29tcGFyZSAxMjMuNDU2MDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY29tNDc5IGNvbXBhcmUgMTIzLjQ1NjAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY29tNDgwIGNvbXBhcmUgMTIzLjQ1NjAwMEUrODkgMTIzLjQ1NkUrODkgLT4gMAorZGRjb200ODEgY29tcGFyZSAxMjMuNDU2MDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY29tNDgyIGNvbXBhcmUgMTIzLjQ1NjBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY29tNDgzIGNvbXBhcmUgMTIzLjQ1NkUtODkgMTIzLjQ1NkUtODkgLT4gMAorZGRjb200ODcgY29tcGFyZSAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDAwMEUrODkgLT4gMAorZGRjb200ODggY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwRS04OSAtPiAwCitkZGNvbTQ4OSBjb21wYXJlIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDAwMEUrODkgLT4gMAorZGRjb200OTAgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMEUtODkgLT4gMAorZGRjb200OTEgY29tcGFyZSAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwRSs4OSAtPiAwCitkZGNvbTQ5MiBjb21wYXJlIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMEUtODkgLT4gMAorZGRjb200OTMgY29tcGFyZSAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMEUrODkgLT4gMAorZGRjb200OTQgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MDAwRS04OSAtPiAwCitkZGNvbTQ5NSBjb21wYXJlIDEyMy40NTZFKzg5IDEyMy40NTYwMEUrODkgLT4gMAorZGRjb200OTYgY29tcGFyZSAxMjMuNDU2RS04OSAxMjMuNDU2MEUtODkgLT4gMAorZGRjb200OTcgY29tcGFyZSAxMjMuNDU2RSs4OSAxMjMuNDU2RSs4OSAtPiAwCisKKy0tIHdpZGUtcmFuZ2luZywgYXJvdW5kIHByZWNpc2lvbjsgc2lnbnMgZXF1YWwKK2RkY29tNTAwIGNvbXBhcmUgICAgMSAgICAgMUUtMTUgICAgLT4gMQorZGRjb201MDEgY29tcGFyZSAgICAxICAgICAxRS0xNCAgICAtPiAxCitkZGNvbTUwMiBjb21wYXJlICAgIDEgICAgIDFFLTEzICAgIC0+IDEKK2RkY29tNTAzIGNvbXBhcmUgICAgMSAgICAgMUUtMTIgICAgLT4gMQorZGRjb201MDQgY29tcGFyZSAgICAxICAgICAxRS0xMSAgICAtPiAxCitkZGNvbTUwNSBjb21wYXJlICAgIDEgICAgIDFFLTEwICAgIC0+IDEKK2RkY29tNTA2IGNvbXBhcmUgICAgMSAgICAgMUUtOSAgICAgLT4gMQorZGRjb201MDcgY29tcGFyZSAgICAxICAgICAxRS04ICAgICAtPiAxCitkZGNvbTUwOCBjb21wYXJlICAgIDEgICAgIDFFLTcgICAgIC0+IDEKK2RkY29tNTA5IGNvbXBhcmUgICAgMSAgICAgMUUtNiAgICAgLT4gMQorZGRjb201MTAgY29tcGFyZSAgICAxICAgICAxRS01ICAgICAtPiAxCitkZGNvbTUxMSBjb21wYXJlICAgIDEgICAgIDFFLTQgICAgIC0+IDEKK2RkY29tNTEyIGNvbXBhcmUgICAgMSAgICAgMUUtMyAgICAgLT4gMQorZGRjb201MTMgY29tcGFyZSAgICAxICAgICAxRS0yICAgICAtPiAxCitkZGNvbTUxNCBjb21wYXJlICAgIDEgICAgIDFFLTEgICAgIC0+IDEKK2RkY29tNTE1IGNvbXBhcmUgICAgMSAgICAgMUUtMCAgICAgLT4gMAorZGRjb201MTYgY29tcGFyZSAgICAxICAgICAxRSsxICAgICAtPiAtMQorZGRjb201MTcgY29tcGFyZSAgICAxICAgICAxRSsyICAgICAtPiAtMQorZGRjb201MTggY29tcGFyZSAgICAxICAgICAxRSszICAgICAtPiAtMQorZGRjb201MTkgY29tcGFyZSAgICAxICAgICAxRSs0ICAgICAtPiAtMQorZGRjb201MjEgY29tcGFyZSAgICAxICAgICAxRSs1ICAgICAtPiAtMQorZGRjb201MjIgY29tcGFyZSAgICAxICAgICAxRSs2ICAgICAtPiAtMQorZGRjb201MjMgY29tcGFyZSAgICAxICAgICAxRSs3ICAgICAtPiAtMQorZGRjb201MjQgY29tcGFyZSAgICAxICAgICAxRSs4ICAgICAtPiAtMQorZGRjb201MjUgY29tcGFyZSAgICAxICAgICAxRSs5ICAgICAtPiAtMQorZGRjb201MjYgY29tcGFyZSAgICAxICAgICAxRSsxMCAgICAtPiAtMQorZGRjb201MjcgY29tcGFyZSAgICAxICAgICAxRSsxMSAgICAtPiAtMQorZGRjb201MjggY29tcGFyZSAgICAxICAgICAxRSsxMiAgICAtPiAtMQorZGRjb201MjkgY29tcGFyZSAgICAxICAgICAxRSsxMyAgICAtPiAtMQorZGRjb201MzAgY29tcGFyZSAgICAxICAgICAxRSsxNCAgICAtPiAtMQorZGRjb201MzEgY29tcGFyZSAgICAxICAgICAxRSsxNSAgICAtPiAtMQorLS0gTFIgc3dhcAorZGRjb201NDAgY29tcGFyZSAgICAxRS0xNSAgMSAgICAgICAtPiAtMQorZGRjb201NDEgY29tcGFyZSAgICAxRS0xNCAgMSAgICAgICAtPiAtMQorZGRjb201NDIgY29tcGFyZSAgICAxRS0xMyAgMSAgICAgICAtPiAtMQorZGRjb201NDMgY29tcGFyZSAgICAxRS0xMiAgMSAgICAgICAtPiAtMQorZGRjb201NDQgY29tcGFyZSAgICAxRS0xMSAgMSAgICAgICAtPiAtMQorZGRjb201NDUgY29tcGFyZSAgICAxRS0xMCAgMSAgICAgICAtPiAtMQorZGRjb201NDYgY29tcGFyZSAgICAxRS05ICAgMSAgICAgICAtPiAtMQorZGRjb201NDcgY29tcGFyZSAgICAxRS04ICAgMSAgICAgICAtPiAtMQorZGRjb201NDggY29tcGFyZSAgICAxRS03ICAgMSAgICAgICAtPiAtMQorZGRjb201NDkgY29tcGFyZSAgICAxRS02ICAgMSAgICAgICAtPiAtMQorZGRjb201NTAgY29tcGFyZSAgICAxRS01ICAgMSAgICAgICAtPiAtMQorZGRjb201NTEgY29tcGFyZSAgICAxRS00ICAgMSAgICAgICAtPiAtMQorZGRjb201NTIgY29tcGFyZSAgICAxRS0zICAgMSAgICAgICAtPiAtMQorZGRjb201NTMgY29tcGFyZSAgICAxRS0yICAgMSAgICAgICAtPiAtMQorZGRjb201NTQgY29tcGFyZSAgICAxRS0xICAgMSAgICAgICAtPiAtMQorZGRjb201NTUgY29tcGFyZSAgICAxRS0wICAgMSAgICAgICAtPiAgMAorZGRjb201NTYgY29tcGFyZSAgICAxRSsxICAgMSAgICAgICAtPiAgMQorZGRjb201NTcgY29tcGFyZSAgICAxRSsyICAgMSAgICAgICAtPiAgMQorZGRjb201NTggY29tcGFyZSAgICAxRSszICAgMSAgICAgICAtPiAgMQorZGRjb201NTkgY29tcGFyZSAgICAxRSs0ICAgMSAgICAgICAtPiAgMQorZGRjb201NjEgY29tcGFyZSAgICAxRSs1ICAgMSAgICAgICAtPiAgMQorZGRjb201NjIgY29tcGFyZSAgICAxRSs2ICAgMSAgICAgICAtPiAgMQorZGRjb201NjMgY29tcGFyZSAgICAxRSs3ICAgMSAgICAgICAtPiAgMQorZGRjb201NjQgY29tcGFyZSAgICAxRSs4ICAgMSAgICAgICAtPiAgMQorZGRjb201NjUgY29tcGFyZSAgICAxRSs5ICAgMSAgICAgICAtPiAgMQorZGRjb201NjYgY29tcGFyZSAgICAxRSsxMCAgMSAgICAgICAtPiAgMQorZGRjb201NjcgY29tcGFyZSAgICAxRSsxMSAgMSAgICAgICAtPiAgMQorZGRjb201NjggY29tcGFyZSAgICAxRSsxMiAgMSAgICAgICAtPiAgMQorZGRjb201NjkgY29tcGFyZSAgICAxRSsxMyAgMSAgICAgICAtPiAgMQorZGRjb201NzAgY29tcGFyZSAgICAxRSsxNCAgMSAgICAgICAtPiAgMQorZGRjb201NzEgY29tcGFyZSAgICAxRSsxNSAgMSAgICAgICAtPiAgMQorLS0gc2ltaWxhciB3aXRoIGEgdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5CitkZGNvbTU4MCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgLT4gMQorZGRjb201ODEgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgIC0+IDEKK2RkY29tNTgyIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAtPiAxCitkZGNvbTU4MyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgLT4gMQorZGRjb201ODQgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgIC0+IDEKK2RkY29tNTg1IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAtPiAxCitkZGNvbTU4NiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgLT4gMQorZGRjb201ODcgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgIC0+IDEKK2RkY29tNTg4IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAtPiAxCitkZGNvbTU4OSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgLT4gLTEKK2RkY29tNTkwIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAtPiAtMQorZGRjb201OTEgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTQgICAgIC0+IC0xCitkZGNvbTU5MiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgLT4gLTEKK2RkY29tNTkzIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAtPiAtMQorZGRjb201OTQgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEgICAgIC0+IC0xCitkZGNvbTU5NSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgLT4gLTEKK2RkY29tNTk2IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAtPiAtMQorZGRjb201OTcgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzIgICAgIC0+IC0xCitkZGNvbTU5OCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgLT4gLTEKK2RkY29tNTk5IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAtPiAtMQorCistLSBjaGVjayBzb21lIHVuaXQteSB0cmFwcworZGRjb202MDAgY29tcGFyZSAgIDEyICAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDEgY29tcGFyZSAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDIgY29tcGFyZSAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDMgY29tcGFyZSAgIDEyLjAwMCAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDQgY29tcGFyZSAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDUgY29tcGFyZSAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDYgY29tcGFyZSAgIDEyLjAwMDAwMCAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDcgY29tcGFyZSAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDggY29tcGFyZSAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAtPiAtMQorZGRjb202MDkgY29tcGFyZSAgIDEyLjAwMDAwMDAwMCAgMTIuMjM0NSAtPiAtMQorZGRjb202MTAgY29tcGFyZSAgIDEyLjEyMzQgMTIgICAgICAgICAgICAtPiAgMQorZGRjb202MTEgY29tcGFyZSAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAtPiAgMQorZGRjb202MTIgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAgICAgICAgICAtPiAgMQorZGRjb202MTMgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAtPiAgMQorZGRjb202MTQgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAtPiAgMQorZGRjb202MTUgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAgICAgICAtPiAgMQorZGRjb202MTYgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAtPiAgMQorZGRjb202MTcgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAtPiAgMQorZGRjb202MTggY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMDAgICAtPiAgMQorZGRjb202MTkgY29tcGFyZSAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAtPiAgMQorZGRjb202MjAgY29tcGFyZSAgLTEyICAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjEgY29tcGFyZSAgLTEyLjAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjIgY29tcGFyZSAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjMgY29tcGFyZSAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjQgY29tcGFyZSAgLTEyLjAwMDAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjUgY29tcGFyZSAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjYgY29tcGFyZSAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjcgY29tcGFyZSAgLTEyLjAwMDAwMDAgICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjggY29tcGFyZSAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAtPiAgMQorZGRjb202MjkgY29tcGFyZSAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAtPiAgMQorZGRjb202MzAgY29tcGFyZSAgLTEyLjEyMzQgLTEyICAgICAgICAgICAtPiAtMQorZGRjb202MzEgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAtPiAtMQorZGRjb202MzIgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAtPiAtMQorZGRjb202MzMgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMCAgICAgICAtPiAtMQorZGRjb202MzQgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAtPiAtMQorZGRjb202MzUgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAtPiAtMQorZGRjb202MzYgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMCAgICAtPiAtMQorZGRjb202MzcgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAtPiAtMQorZGRjb202MzggY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAtPiAtMQorZGRjb202MzkgY29tcGFyZSAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwMCAtPiAtMQorCistLSBleHRlbmRlZCB6ZXJvcworZGRjb202NDAgY29tcGFyZSAgIDAgICAgIDAgICAtPiAwCitkZGNvbTY0MSBjb21wYXJlICAgMCAgICAtMCAgIC0+IDAKK2RkY29tNjQyIGNvbXBhcmUgICAwICAgIC0wLjAgLT4gMAorZGRjb202NDMgY29tcGFyZSAgIDAgICAgIDAuMCAtPiAwCitkZGNvbTY0NCBjb21wYXJlICAtMCAgICAgMCAgIC0+IDAKK2RkY29tNjQ1IGNvbXBhcmUgIC0wICAgIC0wICAgLT4gMAorZGRjb202NDYgY29tcGFyZSAgLTAgICAgLTAuMCAtPiAwCitkZGNvbTY0NyBjb21wYXJlICAtMCAgICAgMC4wIC0+IDAKK2RkY29tNjQ4IGNvbXBhcmUgICAwLjAgICAwICAgLT4gMAorZGRjb202NDkgY29tcGFyZSAgIDAuMCAgLTAgICAtPiAwCitkZGNvbTY1MCBjb21wYXJlICAgMC4wICAtMC4wIC0+IDAKK2RkY29tNjUxIGNvbXBhcmUgICAwLjAgICAwLjAgLT4gMAorZGRjb202NTIgY29tcGFyZSAgLTAuMCAgIDAgICAtPiAwCitkZGNvbTY1MyBjb21wYXJlICAtMC4wICAtMCAgIC0+IDAKK2RkY29tNjU0IGNvbXBhcmUgIC0wLjAgIC0wLjAgLT4gMAorZGRjb202NTUgY29tcGFyZSAgLTAuMCAgIDAuMCAtPiAwCisKK2RkY29tNjU2IGNvbXBhcmUgIC0wRTEgICAwLjAgLT4gMAorZGRjb202NTcgY29tcGFyZSAgLTBFMiAgIDAuMCAtPiAwCitkZGNvbTY1OCBjb21wYXJlICAgMEUxICAgMC4wIC0+IDAKK2RkY29tNjU5IGNvbXBhcmUgICAwRTIgICAwLjAgLT4gMAorZGRjb202NjAgY29tcGFyZSAgLTBFMSAgIDAgICAtPiAwCitkZGNvbTY2MSBjb21wYXJlICAtMEUyICAgMCAgIC0+IDAKK2RkY29tNjYyIGNvbXBhcmUgICAwRTEgICAwICAgLT4gMAorZGRjb202NjMgY29tcGFyZSAgIDBFMiAgIDAgICAtPiAwCitkZGNvbTY2NCBjb21wYXJlICAtMEUxICAtMEUxIC0+IDAKK2RkY29tNjY1IGNvbXBhcmUgIC0wRTIgIC0wRTEgLT4gMAorZGRjb202NjYgY29tcGFyZSAgIDBFMSAgLTBFMSAtPiAwCitkZGNvbTY2NyBjb21wYXJlICAgMEUyICAtMEUxIC0+IDAKK2RkY29tNjY4IGNvbXBhcmUgIC0wRTEgIC0wRTIgLT4gMAorZGRjb202NjkgY29tcGFyZSAgLTBFMiAgLTBFMiAtPiAwCitkZGNvbTY3MCBjb21wYXJlICAgMEUxICAtMEUyIC0+IDAKK2RkY29tNjcxIGNvbXBhcmUgICAwRTIgIC0wRTIgLT4gMAorZGRjb202NzIgY29tcGFyZSAgLTBFMSAgIDBFMSAtPiAwCitkZGNvbTY3MyBjb21wYXJlICAtMEUyICAgMEUxIC0+IDAKK2RkY29tNjc0IGNvbXBhcmUgICAwRTEgICAwRTEgLT4gMAorZGRjb202NzUgY29tcGFyZSAgIDBFMiAgIDBFMSAtPiAwCitkZGNvbTY3NiBjb21wYXJlICAtMEUxICAgMEUyIC0+IDAKK2RkY29tNjc3IGNvbXBhcmUgIC0wRTIgICAwRTIgLT4gMAorZGRjb202NzggY29tcGFyZSAgIDBFMSAgIDBFMiAtPiAwCitkZGNvbTY3OSBjb21wYXJlICAgMEUyICAgMEUyIC0+IDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorZGRjb202ODAgY29tcGFyZSAgIDEyICAgIDEyICAgICAgICAgICAtPiAwCitkZGNvbTY4MSBjb21wYXJlICAgMTIgICAgMTIuMCAgICAgICAgIC0+IDAKK2RkY29tNjgyIGNvbXBhcmUgICAxMiAgICAxMi4wMCAgICAgICAgLT4gMAorZGRjb202ODMgY29tcGFyZSAgIDEyICAgIDEyLjAwMCAgICAgICAtPiAwCitkZGNvbTY4NCBjb21wYXJlICAgMTIgICAgMTIuMDAwMCAgICAgIC0+IDAKK2RkY29tNjg1IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMCAgICAgLT4gMAorZGRjb202ODYgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMCAgICAtPiAwCitkZGNvbTY4NyBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwMCAgIC0+IDAKK2RkY29tNjg4IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAwMCAgLT4gMAorZGRjb202ODkgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMDAwMCAtPiAwCitkZGNvbTY5MCBjb21wYXJlICAgMTIgICAgICAgICAgICAgIDEyIC0+IDAKK2RkY29tNjkxIGNvbXBhcmUgICAxMi4wICAgICAgICAgICAgMTIgLT4gMAorZGRjb202OTIgY29tcGFyZSAgIDEyLjAwICAgICAgICAgICAxMiAtPiAwCitkZGNvbTY5MyBjb21wYXJlICAgMTIuMDAwICAgICAgICAgIDEyIC0+IDAKK2RkY29tNjk0IGNvbXBhcmUgICAxMi4wMDAwICAgICAgICAgMTIgLT4gMAorZGRjb202OTUgY29tcGFyZSAgIDEyLjAwMDAwICAgICAgICAxMiAtPiAwCitkZGNvbTY5NiBjb21wYXJlICAgMTIuMDAwMDAwICAgICAgIDEyIC0+IDAKK2RkY29tNjk3IGNvbXBhcmUgICAxMi4wMDAwMDAwICAgICAgMTIgLT4gMAorZGRjb202OTggY29tcGFyZSAgIDEyLjAwMDAwMDAwICAgICAxMiAtPiAwCitkZGNvbTY5OSBjb21wYXJlICAgMTIuMDAwMDAwMDAwICAgIDEyIC0+IDAKKworLS0gZmlyc3QsIHNlY29uZCwgJiBsYXN0IGRpZ2l0CitkZGNvbTcwMCBjb21wYXJlICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU1IC0+IDEKK2RkY29tNzAxIGNvbXBhcmUgICAxMjM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTYgLT4gMAorZGRjb203MDIgY29tcGFyZSAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NyAtPiAtMQorZGRjb203MDMgY29tcGFyZSAgIDEyMzQ1Njc4OTAxMjM0NTYgMDIzNDU2Nzg5MDEyMzQ1NiAtPiAxCitkZGNvbTcwNCBjb21wYXJlICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2IC0+IDAKK2RkY29tNzA1IGNvbXBhcmUgICAxMjM0NTY3ODkwMTIzNDU2IDIyMzQ1Njc4OTAxMjM0NTYgLT4gLTEKK2RkY29tNzA2IGNvbXBhcmUgICAxMTM0NTY3ODkwMTIzNDU2IDEwMzQ1Njc4OTAxMjM0NTYgLT4gMQorZGRjb203MDcgY29tcGFyZSAgIDExMzQ1Njc4OTAxMjM0NTYgMTEzNDU2Nzg5MDEyMzQ1NiAtPiAwCitkZGNvbTcwOCBjb21wYXJlICAgMTEzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2IC0+IC0xCisKKy0tIG1pc2NlbGxhbmVvdXMKK2RkY29tNzIxIGNvbXBhcmUgMTIzNDU2NzgwMDAgMSAtPiAxCitkZGNvbTcyMiBjb21wYXJlIDEgMTIzNDU2NzgwMDAgLT4gLTEKK2RkY29tNzIzIGNvbXBhcmUgMTIzNDU2NzgwMCAgMSAtPiAxCitkZGNvbTcyNCBjb21wYXJlIDEgMTIzNDU2NzgwMCAgLT4gLTEKK2RkY29tNzI1IGNvbXBhcmUgMTIzNDU2Nzg5MCAgMSAtPiAxCitkZGNvbTcyNiBjb21wYXJlIDEgMTIzNDU2Nzg5MCAgLT4gLTEKK2RkY29tNzI3IGNvbXBhcmUgMTIzNDU2Nzg5MSAgMSAtPiAxCitkZGNvbTcyOCBjb21wYXJlIDEgMTIzNDU2Nzg5MSAgLT4gLTEKK2RkY29tNzI5IGNvbXBhcmUgMTIzNDU2Nzg5MDEgMSAtPiAxCitkZGNvbTczMCBjb21wYXJlIDEgMTIzNDU2Nzg5MDEgLT4gLTEKK2RkY29tNzMxIGNvbXBhcmUgMTIzNDU2Nzg5NiAgMSAtPiAxCitkZGNvbTczMiBjb21wYXJlIDEgMTIzNDU2Nzg5NiAgLT4gLTEKKworLS0gcmVzaWR1ZSBjYXNlcyBhdCBsb3dlciBwcmVjaXNpb24KK2RkY29tNzQwIGNvbXBhcmUgIDEgIDAuOTk5OTk5OSAgLT4gMQorZGRjb203NDEgY29tcGFyZSAgMSAgMC45OTk5OTkgICAtPiAxCitkZGNvbTc0MiBjb21wYXJlICAxICAwLjk5OTk5ICAgIC0+IDEKK2RkY29tNzQzIGNvbXBhcmUgIDEgIDEuMDAwMCAgICAgLT4gMAorZGRjb203NDQgY29tcGFyZSAgMSAgMS4wMDAwMSAgICAtPiAtMQorZGRjb203NDUgY29tcGFyZSAgMSAgMS4wMDAwMDEgICAtPiAtMQorZGRjb203NDYgY29tcGFyZSAgMSAgMS4wMDAwMDAxICAtPiAtMQorZGRjb203NTAgY29tcGFyZSAgMC45OTk5OTk5ICAxICAtPiAtMQorZGRjb203NTEgY29tcGFyZSAgMC45OTk5OTkgICAxICAtPiAtMQorZGRjb203NTIgY29tcGFyZSAgMC45OTk5OSAgICAxICAtPiAtMQorZGRjb203NTMgY29tcGFyZSAgMS4wMDAwICAgICAxICAtPiAwCitkZGNvbTc1NCBjb21wYXJlICAxLjAwMDAxICAgIDEgIC0+IDEKK2RkY29tNzU1IGNvbXBhcmUgIDEuMDAwMDAxICAgMSAgLT4gMQorZGRjb203NTYgY29tcGFyZSAgMS4wMDAwMDAxICAxICAtPiAxCisKKy0tIFNwZWNpYWxzCitkZGNvbTc4MCBjb21wYXJlICBJbmYgIC1JbmYgICAtPiAgMQorZGRjb203ODEgY29tcGFyZSAgSW5mICAtMTAwMCAgLT4gIDEKK2RkY29tNzgyIGNvbXBhcmUgIEluZiAgLTEgICAgIC0+ICAxCitkZGNvbTc4MyBjb21wYXJlICBJbmYgIC0wICAgICAtPiAgMQorZGRjb203ODQgY29tcGFyZSAgSW5mICAgMCAgICAgLT4gIDEKK2RkY29tNzg1IGNvbXBhcmUgIEluZiAgIDEgICAgIC0+ICAxCitkZGNvbTc4NiBjb21wYXJlICBJbmYgICAxMDAwICAtPiAgMQorZGRjb203ODcgY29tcGFyZSAgSW5mICAgSW5mICAgLT4gIDAKK2RkY29tNzg4IGNvbXBhcmUgLTEwMDAgIEluZiAgIC0+IC0xCitkZGNvbTc4OSBjb21wYXJlIC1JbmYgICBJbmYgICAtPiAtMQorZGRjb203OTAgY29tcGFyZSAtMSAgICAgSW5mICAgLT4gLTEKK2RkY29tNzkxIGNvbXBhcmUgLTAgICAgIEluZiAgIC0+IC0xCitkZGNvbTc5MiBjb21wYXJlICAwICAgICBJbmYgICAtPiAtMQorZGRjb203OTMgY29tcGFyZSAgMSAgICAgSW5mICAgLT4gLTEKK2RkY29tNzk0IGNvbXBhcmUgIDEwMDAgIEluZiAgIC0+IC0xCitkZGNvbTc5NSBjb21wYXJlICBJbmYgICBJbmYgICAtPiAgMAorCitkZGNvbTgwMCBjb21wYXJlIC1JbmYgIC1JbmYgICAtPiAgMAorZGRjb204MDEgY29tcGFyZSAtSW5mICAtMTAwMCAgLT4gLTEKK2RkY29tODAyIGNvbXBhcmUgLUluZiAgLTEgICAgIC0+IC0xCitkZGNvbTgwMyBjb21wYXJlIC1JbmYgIC0wICAgICAtPiAtMQorZGRjb204MDQgY29tcGFyZSAtSW5mICAgMCAgICAgLT4gLTEKK2RkY29tODA1IGNvbXBhcmUgLUluZiAgIDEgICAgIC0+IC0xCitkZGNvbTgwNiBjb21wYXJlIC1JbmYgICAxMDAwICAtPiAtMQorZGRjb204MDcgY29tcGFyZSAtSW5mICAgSW5mICAgLT4gLTEKK2RkY29tODA4IGNvbXBhcmUgLUluZiAgLUluZiAgIC0+ICAwCitkZGNvbTgwOSBjb21wYXJlIC0xMDAwIC1JbmYgICAtPiAgMQorZGRjb204MTAgY29tcGFyZSAtMSAgICAtSW5mICAgLT4gIDEKK2RkY29tODExIGNvbXBhcmUgLTAgICAgLUluZiAgIC0+ICAxCitkZGNvbTgxMiBjb21wYXJlICAwICAgIC1JbmYgICAtPiAgMQorZGRjb204MTMgY29tcGFyZSAgMSAgICAtSW5mICAgLT4gIDEKK2RkY29tODE0IGNvbXBhcmUgIDEwMDAgLUluZiAgIC0+ICAxCitkZGNvbTgxNSBjb21wYXJlICBJbmYgIC1JbmYgICAtPiAgMQorCitkZGNvbTgyMSBjb21wYXJlICBOYU4gLUluZiAgICAtPiAgTmFOCitkZGNvbTgyMiBjb21wYXJlICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZGNvbTgyMyBjb21wYXJlICBOYU4gLTEgICAgICAtPiAgTmFOCitkZGNvbTgyNCBjb21wYXJlICBOYU4gLTAgICAgICAtPiAgTmFOCitkZGNvbTgyNSBjb21wYXJlICBOYU4gIDAgICAgICAtPiAgTmFOCitkZGNvbTgyNiBjb21wYXJlICBOYU4gIDEgICAgICAtPiAgTmFOCitkZGNvbTgyNyBjb21wYXJlICBOYU4gIDEwMDAgICAtPiAgTmFOCitkZGNvbTgyOCBjb21wYXJlICBOYU4gIEluZiAgICAtPiAgTmFOCitkZGNvbTgyOSBjb21wYXJlICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzMCBjb21wYXJlIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzMSBjb21wYXJlIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzMiBjb21wYXJlIC0xICAgIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzMyBjb21wYXJlIC0wICAgIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzNCBjb21wYXJlICAwICAgIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzNSBjb21wYXJlICAxICAgIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzNiBjb21wYXJlICAxMDAwIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzNyBjb21wYXJlICBJbmYgIE5hTiAgICAtPiAgTmFOCitkZGNvbTgzOCBjb21wYXJlIC1OYU4gLU5hTiAgICAtPiAtTmFOCitkZGNvbTgzOSBjb21wYXJlICtOYU4gLU5hTiAgICAtPiAgTmFOCitkZGNvbTg0MCBjb21wYXJlIC1OYU4gK05hTiAgICAtPiAtTmFOCisKK2RkY29tODQxIGNvbXBhcmUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg0MiBjb21wYXJlICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NDMgY29tcGFyZSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODQ0IGNvbXBhcmUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg0NSBjb21wYXJlICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NDYgY29tcGFyZSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODQ3IGNvbXBhcmUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg0OCBjb21wYXJlICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NDkgY29tcGFyZSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODUwIGNvbXBhcmUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg1MSBjb21wYXJlIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NTIgY29tcGFyZSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODUzIGNvbXBhcmUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg1NCBjb21wYXJlIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NTUgY29tcGFyZSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODU2IGNvbXBhcmUgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg1NyBjb21wYXJlICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NTggY29tcGFyZSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODU5IGNvbXBhcmUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkY29tODYwIGNvbXBhcmUgIE5hTjkgLUluZiAgIC0+ICBOYU45CitkZGNvbTg2MSBjb21wYXJlICBOYU44ICA5OTkgICAtPiAgTmFOOAorZGRjb204NjIgY29tcGFyZSAgTmFONzcgSW5mICAgLT4gIE5hTjc3CitkZGNvbTg2MyBjb21wYXJlIC1OYU42NyBOYU41ICAtPiAtTmFONjcKK2RkY29tODY0IGNvbXBhcmUgLUluZiAgLU5hTjQgIC0+IC1OYU40CitkZGNvbTg2NSBjb21wYXJlIC05OTkgIC1OYU4zMyAtPiAtTmFOMzMKK2RkY29tODY2IGNvbXBhcmUgIEluZiAgIE5hTjIgIC0+ICBOYU4yCitkZGNvbTg2NyBjb21wYXJlIC1OYU40MSAtTmFONDIgLT4gLU5hTjQxCitkZGNvbTg2OCBjb21wYXJlICtOYU40MSAtTmFONDIgLT4gIE5hTjQxCitkZGNvbTg2OSBjb21wYXJlIC1OYU40MSArTmFONDIgLT4gLU5hTjQxCitkZGNvbTg3MCBjb21wYXJlICtOYU40MSArTmFONDIgLT4gIE5hTjQxCisKK2RkY29tODcxIGNvbXBhcmUgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NzIgY29tcGFyZSAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg3MyBjb21wYXJlICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODc0IGNvbXBhcmUgIHNOYU4xNiBzTmFOOTQgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NzUgY29tcGFyZSAgTmFOODUgIHNOYU44MyAgLT4gIE5hTjgzIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg3NiBjb21wYXJlIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkY29tODc3IGNvbXBhcmUgIDA4OCAgICBzTmFOODEgIC0+ICBOYU44MSBJbnZhbGlkX29wZXJhdGlvbgorZGRjb204NzggY29tcGFyZSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTg3OSBjb21wYXJlICBOYU4gICAtc05hTjg5ICAtPiAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gd2lkZSByYW5nZQorZGRjb204ODAgY29tcGFyZSArMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSszODQgLT4gLTEKK2RkY29tODgxIGNvbXBhcmUgOUUrMzg0ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitkZGNvbTg4MiBjb21wYXJlICswLjEwMCA5RS0zODMgICAgICAgICAgICAgICAtPiAgMQorZGRjb204ODMgY29tcGFyZSA5RS0zODMgKzAuMTAwICAgICAgICAgICAgICAgLT4gLTEKK2RkY29tODg1IGNvbXBhcmUgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrMzg0IC0+IC0xCitkZGNvbTg4NiBjb21wYXJlIDlFKzM4NCAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorZGRjb204ODcgY29tcGFyZSAtMC4xMDAgOUUtMzgzICAgICAgICAgICAgICAgLT4gLTEKK2RkY29tODg4IGNvbXBhcmUgOUUtMzgzIC0wLjEwMCAgICAgICAgICAgICAgIC0+ICAxCisKKy0tIHNwcmVhZCB6ZXJvcworZGRjb205MDAgY29tcGFyZSAgIDBFLTM4MyAgMCAgICAgICAtPiAgMAorZGRjb205MDEgY29tcGFyZSAgIDBFLTM4MyAtMCAgICAgICAtPiAgMAorZGRjb205MDIgY29tcGFyZSAgLTBFLTM4MyAgMCAgICAgICAtPiAgMAorZGRjb205MDMgY29tcGFyZSAgLTBFLTM4MyAtMCAgICAgICAtPiAgMAorZGRjb205MDQgY29tcGFyZSAgIDBFLTM4MyAgMEUrMzg0ICAtPiAgMAorZGRjb205MDUgY29tcGFyZSAgIDBFLTM4MyAtMEUrMzg0ICAtPiAgMAorZGRjb205MDYgY29tcGFyZSAgLTBFLTM4MyAgMEUrMzg0ICAtPiAgMAorZGRjb205MDcgY29tcGFyZSAgLTBFLTM4MyAtMEUrMzg0ICAtPiAgMAorZGRjb205MDggY29tcGFyZSAgIDAgICAgICAgMEUrMzg0ICAtPiAgMAorZGRjb205MDkgY29tcGFyZSAgIDAgICAgICAtMEUrMzg0ICAtPiAgMAorZGRjb205MTAgY29tcGFyZSAgLTAgICAgICAgMEUrMzg0ICAtPiAgMAorZGRjb205MTEgY29tcGFyZSAgLTAgICAgICAtMEUrMzg0ICAtPiAgMAorZGRjb205MzAgY29tcGFyZSAgIDBFKzM4NCAgMCAgICAgICAtPiAgMAorZGRjb205MzEgY29tcGFyZSAgIDBFKzM4NCAtMCAgICAgICAtPiAgMAorZGRjb205MzIgY29tcGFyZSAgLTBFKzM4NCAgMCAgICAgICAtPiAgMAorZGRjb205MzMgY29tcGFyZSAgLTBFKzM4NCAtMCAgICAgICAtPiAgMAorZGRjb205MzQgY29tcGFyZSAgIDBFKzM4NCAgMEUtMzgzICAtPiAgMAorZGRjb205MzUgY29tcGFyZSAgIDBFKzM4NCAtMEUtMzgzICAtPiAgMAorZGRjb205MzYgY29tcGFyZSAgLTBFKzM4NCAgMEUtMzgzICAtPiAgMAorZGRjb205MzcgY29tcGFyZSAgLTBFKzM4NCAtMEUtMzgzICAtPiAgMAorZGRjb205MzggY29tcGFyZSAgIDAgICAgICAgMEUtMzgzICAtPiAgMAorZGRjb205MzkgY29tcGFyZSAgIDAgICAgICAtMEUtMzgzICAtPiAgMAorZGRjb205NDAgY29tcGFyZSAgLTAgICAgICAgMEUtMzgzICAtPiAgMAorZGRjb205NDEgY29tcGFyZSAgLTAgICAgICAtMEUtMzgzICAtPiAgMAorCistLSBzaWducworZGRjb205NjEgY29tcGFyZSAgMWUrNzcgIDFlKzExIC0+ICAxCitkZGNvbTk2MiBjb21wYXJlICAxZSs3NyAtMWUrMTEgLT4gIDEKK2RkY29tOTYzIGNvbXBhcmUgLTFlKzc3ICAxZSsxMSAtPiAtMQorZGRjb205NjQgY29tcGFyZSAtMWUrNzcgLTFlKzExIC0+IC0xCitkZGNvbTk2NSBjb21wYXJlICAxZS03NyAgMWUtMTEgLT4gLTEKK2RkY29tOTY2IGNvbXBhcmUgIDFlLTc3IC0xZS0xMSAtPiAgMQorZGRjb205NjcgY29tcGFyZSAtMWUtNzcgIDFlLTExIC0+IC0xCitkZGNvbTk2OCBjb21wYXJlIC0xZS03NyAtMWUtMTEgLT4gIDEKKworLS0gZnVsbCBhbGlnbm1lbnQgcmFuZ2UsIGJvdGggd2F5cworZGRjb21wMTAwMSBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAgIC0+IDAKK2RkY29tcDEwMDIgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAgICAtPiAwCitkZGNvbXAxMDAzIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAgICAgLT4gMAorZGRjb21wMTAwNCBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAgICAgIC0+IDAKK2RkY29tcDEwMDUgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAgICAgICAtPiAwCitkZGNvbXAxMDA2IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAgICAgICAgLT4gMAorZGRjb21wMTAwNyBjb21wYXJlIDEgMS4wMDAwMDAwMDAgICAgICAgIC0+IDAKK2RkY29tcDEwMDggY29tcGFyZSAxIDEuMDAwMDAwMDAgICAgICAgICAtPiAwCitkZGNvbXAxMDA5IGNvbXBhcmUgMSAxLjAwMDAwMDAgICAgICAgICAgLT4gMAorZGRjb21wMTAxMCBjb21wYXJlIDEgMS4wMDAwMDAgICAgICAgICAgIC0+IDAKK2RkY29tcDEwMTEgY29tcGFyZSAxIDEuMDAwMDAgICAgICAgICAgICAtPiAwCitkZGNvbXAxMDEyIGNvbXBhcmUgMSAxLjAwMDAgICAgICAgICAgICAgLT4gMAorZGRjb21wMTAxMyBjb21wYXJlIDEgMS4wMDAgICAgICAgICAgICAgIC0+IDAKK2RkY29tcDEwMTQgY29tcGFyZSAxIDEuMDAgICAgICAgICAgICAgICAtPiAwCitkZGNvbXAxMDE1IGNvbXBhcmUgMSAxLjAgICAgICAgICAgICAgICAgLT4gMAorZGRjb21wMTAyMSBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwICAxIC0+IDAKK2RkY29tcDEwMjIgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwICAgMSAtPiAwCitkZGNvbXAxMDIzIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwICAgIDEgLT4gMAorZGRjb21wMTAyNCBjb21wYXJlIDEuMDAwMDAwMDAwMDAwICAgICAxIC0+IDAKK2RkY29tcDEwMjUgY29tcGFyZSAxLjAwMDAwMDAwMDAwICAgICAgMSAtPiAwCitkZGNvbXAxMDI2IGNvbXBhcmUgMS4wMDAwMDAwMDAwICAgICAgIDEgLT4gMAorZGRjb21wMTAyNyBjb21wYXJlIDEuMDAwMDAwMDAwICAgICAgICAxIC0+IDAKK2RkY29tcDEwMjggY29tcGFyZSAxLjAwMDAwMDAwICAgICAgICAgMSAtPiAwCitkZGNvbXAxMDI5IGNvbXBhcmUgMS4wMDAwMDAwICAgICAgICAgIDEgLT4gMAorZGRjb21wMTAzMCBjb21wYXJlIDEuMDAwMDAwICAgICAgICAgICAxIC0+IDAKK2RkY29tcDEwMzEgY29tcGFyZSAxLjAwMDAwICAgICAgICAgICAgMSAtPiAwCitkZGNvbXAxMDMyIGNvbXBhcmUgMS4wMDAwICAgICAgICAgICAgIDEgLT4gMAorZGRjb21wMTAzMyBjb21wYXJlIDEuMDAwICAgICAgICAgICAgICAxIC0+IDAKK2RkY29tcDEwMzQgY29tcGFyZSAxLjAwICAgICAgICAgICAgICAgMSAtPiAwCitkZGNvbXAxMDM1IGNvbXBhcmUgMS4wICAgICAgICAgICAgICAgIDEgLT4gMAorCistLSBjaGVjayBNU0QgYWx3YXlzIGRldGVjdGVkIG5vbi16ZXJvCitkZGNvbXAxMDQwIGNvbXBhcmUgMCAwLjAwMDAwMDAwMDAwMDAwMCAgLT4gMAorZGRjb21wMTA0MSBjb21wYXJlIDAgMS4wMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkZGNvbXAxMDQyIGNvbXBhcmUgMCAyLjAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RkY29tcDEwNDMgY29tcGFyZSAwIDMuMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZGRjb21wMTA0NCBjb21wYXJlIDAgNC4wMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkZGNvbXAxMDQ1IGNvbXBhcmUgMCA1LjAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RkY29tcDEwNDYgY29tcGFyZSAwIDYuMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZGRjb21wMTA0NyBjb21wYXJlIDAgNy4wMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkZGNvbXAxMDQ4IGNvbXBhcmUgMCA4LjAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RkY29tcDEwNDkgY29tcGFyZSAwIDkuMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZGRjb21wMTA1MCBjb21wYXJlIDAuMDAwMDAwMDAwMDAwMDAwICAwIC0+IDAKK2RkY29tcDEwNTEgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkZGNvbXAxMDUyIGNvbXBhcmUgMi4wMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZGRjb21wMTA1MyBjb21wYXJlIDMuMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RkY29tcDEwNTQgY29tcGFyZSA0LjAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkZGNvbXAxMDU1IGNvbXBhcmUgNS4wMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZGRjb21wMTA1NiBjb21wYXJlIDYuMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RkY29tcDEwNTcgY29tcGFyZSA3LjAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkZGNvbXAxMDU4IGNvbXBhcmUgOC4wMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZGRjb21wMTA1OSBjb21wYXJlIDkuMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKKworLS0gTnVsbCB0ZXN0cworZGRjb205OTkwIGNvbXBhcmUgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGNvbTk5OTEgY29tcGFyZSAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb21wYXJlU2lnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVNpZy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmVjNDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVNpZy5kZWNUZXN0CkBAIC0wLDAgKzEsNjQ3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkQ29tcGFyZVNpZy5kZWNUZXN0IC0tIGRlY0RvdWJsZSBjb21wYXJpc29uOyBhbGwgTmFOcyBzaWduYWwgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gTm90ZSB0aGF0IHdlIGNhbm5vdCBhc3N1bWUgYWRkL3N1YnRyYWN0IHRlc3RzIGNvdmVyIHBhdGhzIGFkZXF1YXRlbHksCistLSBoZXJlLCBiZWNhdXNlIHRoZSBjb2RlIG1pZ2h0IGJlIHF1aXRlIGRpZmZlcmVudCAoY29tcGFyaXNvbiBjYW5ub3QKKy0tIG92ZXJmbG93IG9yIHVuZGVyZmxvdywgc28gYWN0dWFsIHN1YnRyYWN0aW9ucyBhcmUgbm90IG5lY2Vzc2FyeSkuCisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZGNtczAwMSBjb21wYXJlc2lnICAtMiAgLTIgIC0+IDAKK2RkY21zMDAyIGNvbXBhcmVzaWcgIC0yICAtMSAgLT4gLTEKK2RkY21zMDAzIGNvbXBhcmVzaWcgIC0yICAgMCAgLT4gLTEKK2RkY21zMDA0IGNvbXBhcmVzaWcgIC0yICAgMSAgLT4gLTEKK2RkY21zMDA1IGNvbXBhcmVzaWcgIC0yICAgMiAgLT4gLTEKK2RkY21zMDA2IGNvbXBhcmVzaWcgIC0xICAtMiAgLT4gMQorZGRjbXMwMDcgY29tcGFyZXNpZyAgLTEgIC0xICAtPiAwCitkZGNtczAwOCBjb21wYXJlc2lnICAtMSAgIDAgIC0+IC0xCitkZGNtczAwOSBjb21wYXJlc2lnICAtMSAgIDEgIC0+IC0xCitkZGNtczAxMCBjb21wYXJlc2lnICAtMSAgIDIgIC0+IC0xCitkZGNtczAxMSBjb21wYXJlc2lnICAgMCAgLTIgIC0+IDEKK2RkY21zMDEyIGNvbXBhcmVzaWcgICAwICAtMSAgLT4gMQorZGRjbXMwMTMgY29tcGFyZXNpZyAgIDAgICAwICAtPiAwCitkZGNtczAxNCBjb21wYXJlc2lnICAgMCAgIDEgIC0+IC0xCitkZGNtczAxNSBjb21wYXJlc2lnICAgMCAgIDIgIC0+IC0xCitkZGNtczAxNiBjb21wYXJlc2lnICAgMSAgLTIgIC0+IDEKK2RkY21zMDE3IGNvbXBhcmVzaWcgICAxICAtMSAgLT4gMQorZGRjbXMwMTggY29tcGFyZXNpZyAgIDEgICAwICAtPiAxCitkZGNtczAxOSBjb21wYXJlc2lnICAgMSAgIDEgIC0+IDAKK2RkY21zMDIwIGNvbXBhcmVzaWcgICAxICAgMiAgLT4gLTEKK2RkY21zMDIxIGNvbXBhcmVzaWcgICAyICAtMiAgLT4gMQorZGRjbXMwMjIgY29tcGFyZXNpZyAgIDIgIC0xICAtPiAxCitkZGNtczAyMyBjb21wYXJlc2lnICAgMiAgIDAgIC0+IDEKK2RkY21zMDI1IGNvbXBhcmVzaWcgICAyICAgMSAgLT4gMQorZGRjbXMwMjYgY29tcGFyZXNpZyAgIDIgICAyICAtPiAwCisKK2RkY21zMDMxIGNvbXBhcmVzaWcgIC0yMCAgLTIwICAtPiAwCitkZGNtczAzMiBjb21wYXJlc2lnICAtMjAgIC0xMCAgLT4gLTEKK2RkY21zMDMzIGNvbXBhcmVzaWcgIC0yMCAgIDAwICAtPiAtMQorZGRjbXMwMzQgY29tcGFyZXNpZyAgLTIwICAgMTAgIC0+IC0xCitkZGNtczAzNSBjb21wYXJlc2lnICAtMjAgICAyMCAgLT4gLTEKK2RkY21zMDM2IGNvbXBhcmVzaWcgIC0xMCAgLTIwICAtPiAxCitkZGNtczAzNyBjb21wYXJlc2lnICAtMTAgIC0xMCAgLT4gMAorZGRjbXMwMzggY29tcGFyZXNpZyAgLTEwICAgMDAgIC0+IC0xCitkZGNtczAzOSBjb21wYXJlc2lnICAtMTAgICAxMCAgLT4gLTEKK2RkY21zMDQwIGNvbXBhcmVzaWcgIC0xMCAgIDIwICAtPiAtMQorZGRjbXMwNDEgY29tcGFyZXNpZyAgIDAwICAtMjAgIC0+IDEKK2RkY21zMDQyIGNvbXBhcmVzaWcgICAwMCAgLTEwICAtPiAxCitkZGNtczA0MyBjb21wYXJlc2lnICAgMDAgICAwMCAgLT4gMAorZGRjbXMwNDQgY29tcGFyZXNpZyAgIDAwICAgMTAgIC0+IC0xCitkZGNtczA0NSBjb21wYXJlc2lnICAgMDAgICAyMCAgLT4gLTEKK2RkY21zMDQ2IGNvbXBhcmVzaWcgICAxMCAgLTIwICAtPiAxCitkZGNtczA0NyBjb21wYXJlc2lnICAgMTAgIC0xMCAgLT4gMQorZGRjbXMwNDggY29tcGFyZXNpZyAgIDEwICAgMDAgIC0+IDEKK2RkY21zMDQ5IGNvbXBhcmVzaWcgICAxMCAgIDEwICAtPiAwCitkZGNtczA1MCBjb21wYXJlc2lnICAgMTAgICAyMCAgLT4gLTEKK2RkY21zMDUxIGNvbXBhcmVzaWcgICAyMCAgLTIwICAtPiAxCitkZGNtczA1MiBjb21wYXJlc2lnICAgMjAgIC0xMCAgLT4gMQorZGRjbXMwNTMgY29tcGFyZXNpZyAgIDIwICAgMDAgIC0+IDEKK2RkY21zMDU1IGNvbXBhcmVzaWcgICAyMCAgIDEwICAtPiAxCitkZGNtczA1NiBjb21wYXJlc2lnICAgMjAgICAyMCAgLT4gMAorCitkZGNtczA2MSBjb21wYXJlc2lnICAtMi4wICAtMi4wICAtPiAwCitkZGNtczA2MiBjb21wYXJlc2lnICAtMi4wICAtMS4wICAtPiAtMQorZGRjbXMwNjMgY29tcGFyZXNpZyAgLTIuMCAgIDAuMCAgLT4gLTEKK2RkY21zMDY0IGNvbXBhcmVzaWcgIC0yLjAgICAxLjAgIC0+IC0xCitkZGNtczA2NSBjb21wYXJlc2lnICAtMi4wICAgMi4wICAtPiAtMQorZGRjbXMwNjYgY29tcGFyZXNpZyAgLTEuMCAgLTIuMCAgLT4gMQorZGRjbXMwNjcgY29tcGFyZXNpZyAgLTEuMCAgLTEuMCAgLT4gMAorZGRjbXMwNjggY29tcGFyZXNpZyAgLTEuMCAgIDAuMCAgLT4gLTEKK2RkY21zMDY5IGNvbXBhcmVzaWcgIC0xLjAgICAxLjAgIC0+IC0xCitkZGNtczA3MCBjb21wYXJlc2lnICAtMS4wICAgMi4wICAtPiAtMQorZGRjbXMwNzEgY29tcGFyZXNpZyAgIDAuMCAgLTIuMCAgLT4gMQorZGRjbXMwNzIgY29tcGFyZXNpZyAgIDAuMCAgLTEuMCAgLT4gMQorZGRjbXMwNzMgY29tcGFyZXNpZyAgIDAuMCAgIDAuMCAgLT4gMAorZGRjbXMwNzQgY29tcGFyZXNpZyAgIDAuMCAgIDEuMCAgLT4gLTEKK2RkY21zMDc1IGNvbXBhcmVzaWcgICAwLjAgICAyLjAgIC0+IC0xCitkZGNtczA3NiBjb21wYXJlc2lnICAgMS4wICAtMi4wICAtPiAxCitkZGNtczA3NyBjb21wYXJlc2lnICAgMS4wICAtMS4wICAtPiAxCitkZGNtczA3OCBjb21wYXJlc2lnICAgMS4wICAgMC4wICAtPiAxCitkZGNtczA3OSBjb21wYXJlc2lnICAgMS4wICAgMS4wICAtPiAwCitkZGNtczA4MCBjb21wYXJlc2lnICAgMS4wICAgMi4wICAtPiAtMQorZGRjbXMwODEgY29tcGFyZXNpZyAgIDIuMCAgLTIuMCAgLT4gMQorZGRjbXMwODIgY29tcGFyZXNpZyAgIDIuMCAgLTEuMCAgLT4gMQorZGRjbXMwODMgY29tcGFyZXNpZyAgIDIuMCAgIDAuMCAgLT4gMQorZGRjbXMwODUgY29tcGFyZXNpZyAgIDIuMCAgIDEuMCAgLT4gMQorZGRjbXMwODYgY29tcGFyZXNpZyAgIDIuMCAgIDIuMCAgLT4gMAorCistLSBub3cgc29tZSBjYXNlcyB3aGljaCBtaWdodCBvdmVyZmxvdyBpZiBzdWJ0cmFjdCB3ZXJlIHVzZWQKK2RkY21zMDkwIGNvbXBhcmVzaWcgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gMAorZGRjbXMwOTEgY29tcGFyZXNpZyAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtMQorZGRjbXMwOTIgY29tcGFyZXNpZyAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAxCitkZGNtczA5MyBjb21wYXJlc2lnIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+IDAKKworLS0gc29tZSBkaWZmZXJpbmcgbGVuZ3RoL2V4cG9uZW50IGNhc2VzCitkZGNtczEwMCBjb21wYXJlc2lnICAgNy4wICAgIDcuMCAgICAtPiAwCitkZGNtczEwMSBjb21wYXJlc2lnICAgNy4wICAgIDcgICAgICAtPiAwCitkZGNtczEwMiBjb21wYXJlc2lnICAgNyAgICAgIDcuMCAgICAtPiAwCitkZGNtczEwMyBjb21wYXJlc2lnICAgN0UrMCAgIDcuMCAgICAtPiAwCitkZGNtczEwNCBjb21wYXJlc2lnICAgNzBFLTEgIDcuMCAgICAtPiAwCitkZGNtczEwNSBjb21wYXJlc2lnICAgMC43RSsxIDcgICAgICAtPiAwCitkZGNtczEwNiBjb21wYXJlc2lnICAgNzBFLTEgIDcgICAgICAtPiAwCitkZGNtczEwNyBjb21wYXJlc2lnICAgNy4wICAgIDdFKzAgICAtPiAwCitkZGNtczEwOCBjb21wYXJlc2lnICAgNy4wICAgIDcwRS0xICAtPiAwCitkZGNtczEwOSBjb21wYXJlc2lnICAgNyAgICAgIDAuN0UrMSAtPiAwCitkZGNtczExMCBjb21wYXJlc2lnICAgNyAgICAgIDcwRS0xICAtPiAwCisKK2RkY21zMTIwIGNvbXBhcmVzaWcgICA4LjAgICAgNy4wICAgIC0+IDEKK2RkY21zMTIxIGNvbXBhcmVzaWcgICA4LjAgICAgNyAgICAgIC0+IDEKK2RkY21zMTIyIGNvbXBhcmVzaWcgICA4ICAgICAgNy4wICAgIC0+IDEKK2RkY21zMTIzIGNvbXBhcmVzaWcgICA4RSswICAgNy4wICAgIC0+IDEKK2RkY21zMTI0IGNvbXBhcmVzaWcgICA4MEUtMSAgNy4wICAgIC0+IDEKK2RkY21zMTI1IGNvbXBhcmVzaWcgICAwLjhFKzEgNyAgICAgIC0+IDEKK2RkY21zMTI2IGNvbXBhcmVzaWcgICA4MEUtMSAgNyAgICAgIC0+IDEKK2RkY21zMTI3IGNvbXBhcmVzaWcgICA4LjAgICAgN0UrMCAgIC0+IDEKK2RkY21zMTI4IGNvbXBhcmVzaWcgICA4LjAgICAgNzBFLTEgIC0+IDEKK2RkY21zMTI5IGNvbXBhcmVzaWcgICA4ICAgICAgMC43RSsxICAtPiAxCitkZGNtczEzMCBjb21wYXJlc2lnICAgOCAgICAgIDcwRS0xICAtPiAxCisKK2RkY21zMTQwIGNvbXBhcmVzaWcgICA4LjAgICAgOS4wICAgIC0+IC0xCitkZGNtczE0MSBjb21wYXJlc2lnICAgOC4wICAgIDkgICAgICAtPiAtMQorZGRjbXMxNDIgY29tcGFyZXNpZyAgIDggICAgICA5LjAgICAgLT4gLTEKK2RkY21zMTQzIGNvbXBhcmVzaWcgICA4RSswICAgOS4wICAgIC0+IC0xCitkZGNtczE0NCBjb21wYXJlc2lnICAgODBFLTEgIDkuMCAgICAtPiAtMQorZGRjbXMxNDUgY29tcGFyZXNpZyAgIDAuOEUrMSA5ICAgICAgLT4gLTEKK2RkY21zMTQ2IGNvbXBhcmVzaWcgICA4MEUtMSAgOSAgICAgIC0+IC0xCitkZGNtczE0NyBjb21wYXJlc2lnICAgOC4wICAgIDlFKzAgICAtPiAtMQorZGRjbXMxNDggY29tcGFyZXNpZyAgIDguMCAgICA5MEUtMSAgLT4gLTEKK2RkY21zMTQ5IGNvbXBhcmVzaWcgICA4ICAgICAgMC45RSsxIC0+IC0xCitkZGNtczE1MCBjb21wYXJlc2lnICAgOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0rIC4uCitkZGNtczIwMCBjb21wYXJlc2lnICAtNy4wICAgIDcuMCAgICAtPiAtMQorZGRjbXMyMDEgY29tcGFyZXNpZyAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2RkY21zMjAyIGNvbXBhcmVzaWcgIC03ICAgICAgNy4wICAgIC0+IC0xCitkZGNtczIwMyBjb21wYXJlc2lnICAtN0UrMCAgIDcuMCAgICAtPiAtMQorZGRjbXMyMDQgY29tcGFyZXNpZyAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2RkY21zMjA1IGNvbXBhcmVzaWcgIC0wLjdFKzEgNyAgICAgIC0+IC0xCitkZGNtczIwNiBjb21wYXJlc2lnICAtNzBFLTEgIDcgICAgICAtPiAtMQorZGRjbXMyMDcgY29tcGFyZXNpZyAgLTcuMCAgICA3RSswICAgLT4gLTEKK2RkY21zMjA4IGNvbXBhcmVzaWcgIC03LjAgICAgNzBFLTEgIC0+IC0xCitkZGNtczIwOSBjb21wYXJlc2lnICAtNyAgICAgIDAuN0UrMSAtPiAtMQorZGRjbXMyMTAgY29tcGFyZXNpZyAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworZGRjbXMyMjAgY29tcGFyZXNpZyAgLTguMCAgICA3LjAgICAgLT4gLTEKK2RkY21zMjIxIGNvbXBhcmVzaWcgIC04LjAgICAgNyAgICAgIC0+IC0xCitkZGNtczIyMiBjb21wYXJlc2lnICAtOCAgICAgIDcuMCAgICAtPiAtMQorZGRjbXMyMjMgY29tcGFyZXNpZyAgLThFKzAgICA3LjAgICAgLT4gLTEKK2RkY21zMjI0IGNvbXBhcmVzaWcgIC04MEUtMSAgNy4wICAgIC0+IC0xCitkZGNtczIyNSBjb21wYXJlc2lnICAtMC44RSsxIDcgICAgICAtPiAtMQorZGRjbXMyMjYgY29tcGFyZXNpZyAgLTgwRS0xICA3ICAgICAgLT4gLTEKK2RkY21zMjI3IGNvbXBhcmVzaWcgIC04LjAgICAgN0UrMCAgIC0+IC0xCitkZGNtczIyOCBjb21wYXJlc2lnICAtOC4wICAgIDcwRS0xICAtPiAtMQorZGRjbXMyMjkgY29tcGFyZXNpZyAgLTggICAgICAwLjdFKzEgLT4gLTEKK2RkY21zMjMwIGNvbXBhcmVzaWcgIC04ICAgICAgNzBFLTEgIC0+IC0xCisKK2RkY21zMjQwIGNvbXBhcmVzaWcgIC04LjAgICAgOS4wICAgIC0+IC0xCitkZGNtczI0MSBjb21wYXJlc2lnICAtOC4wICAgIDkgICAgICAtPiAtMQorZGRjbXMyNDIgY29tcGFyZXNpZyAgLTggICAgICA5LjAgICAgLT4gLTEKK2RkY21zMjQzIGNvbXBhcmVzaWcgIC04RSswICAgOS4wICAgIC0+IC0xCitkZGNtczI0NCBjb21wYXJlc2lnICAtODBFLTEgIDkuMCAgICAtPiAtMQorZGRjbXMyNDUgY29tcGFyZXNpZyAgLTAuOEUrMSA5ICAgICAgLT4gLTEKK2RkY21zMjQ2IGNvbXBhcmVzaWcgIC04MEUtMSAgOSAgICAgIC0+IC0xCitkZGNtczI0NyBjb21wYXJlc2lnICAtOC4wICAgIDlFKzAgICAtPiAtMQorZGRjbXMyNDggY29tcGFyZXNpZyAgLTguMCAgICA5MEUtMSAgLT4gLTEKK2RkY21zMjQ5IGNvbXBhcmVzaWcgIC04ICAgICAgMC45RSsxIC0+IC0xCitkZGNtczI1MCBjb21wYXJlc2lnICAtOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzICstIC4uCitkZGNtczMwMCBjb21wYXJlc2lnICAgNy4wICAgIC03LjAgICAgLT4gMQorZGRjbXMzMDEgY29tcGFyZXNpZyAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2RkY21zMzAyIGNvbXBhcmVzaWcgICA3ICAgICAgLTcuMCAgICAtPiAxCitkZGNtczMwMyBjb21wYXJlc2lnICAgN0UrMCAgIC03LjAgICAgLT4gMQorZGRjbXMzMDQgY29tcGFyZXNpZyAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2RkY21zMzA1IGNvbXBhcmVzaWcgICAuN0UrMSAgLTcgICAgICAtPiAxCitkZGNtczMwNiBjb21wYXJlc2lnICAgNzBFLTEgIC03ICAgICAgLT4gMQorZGRjbXMzMDcgY29tcGFyZXNpZyAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2RkY21zMzA4IGNvbXBhcmVzaWcgICA3LjAgICAgLTcwRS0xICAtPiAxCitkZGNtczMwOSBjb21wYXJlc2lnICAgNyAgICAgIC0uN0UrMSAgLT4gMQorZGRjbXMzMTAgY29tcGFyZXNpZyAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworZGRjbXMzMjAgY29tcGFyZXNpZyAgIDguMCAgICAtNy4wICAgIC0+IDEKK2RkY21zMzIxIGNvbXBhcmVzaWcgICA4LjAgICAgLTcgICAgICAtPiAxCitkZGNtczMyMiBjb21wYXJlc2lnICAgOCAgICAgIC03LjAgICAgLT4gMQorZGRjbXMzMjMgY29tcGFyZXNpZyAgIDhFKzAgICAtNy4wICAgIC0+IDEKK2RkY21zMzI0IGNvbXBhcmVzaWcgICA4MEUtMSAgLTcuMCAgICAtPiAxCitkZGNtczMyNSBjb21wYXJlc2lnICAgLjhFKzEgIC03ICAgICAgLT4gMQorZGRjbXMzMjYgY29tcGFyZXNpZyAgIDgwRS0xICAtNyAgICAgIC0+IDEKK2RkY21zMzI3IGNvbXBhcmVzaWcgICA4LjAgICAgLTdFKzAgICAtPiAxCitkZGNtczMyOCBjb21wYXJlc2lnICAgOC4wICAgIC03MEUtMSAgLT4gMQorZGRjbXMzMjkgY29tcGFyZXNpZyAgIDggICAgICAtLjdFKzEgIC0+IDEKK2RkY21zMzMwIGNvbXBhcmVzaWcgICA4ICAgICAgLTcwRS0xICAtPiAxCisKK2RkY21zMzQwIGNvbXBhcmVzaWcgICA4LjAgICAgLTkuMCAgICAtPiAxCitkZGNtczM0MSBjb21wYXJlc2lnICAgOC4wICAgIC05ICAgICAgLT4gMQorZGRjbXMzNDIgY29tcGFyZXNpZyAgIDggICAgICAtOS4wICAgIC0+IDEKK2RkY21zMzQzIGNvbXBhcmVzaWcgICA4RSswICAgLTkuMCAgICAtPiAxCitkZGNtczM0NCBjb21wYXJlc2lnICAgODBFLTEgIC05LjAgICAgLT4gMQorZGRjbXMzNDUgY29tcGFyZXNpZyAgIC44RSsxICAtOSAgICAgIC0+IDEKK2RkY21zMzQ2IGNvbXBhcmVzaWcgICA4MEUtMSAgLTkgICAgICAtPiAxCitkZGNtczM0NyBjb21wYXJlc2lnICAgOC4wICAgIC05RSswICAgLT4gMQorZGRjbXMzNDggY29tcGFyZXNpZyAgIDguMCAgICAtOTBFLTEgIC0+IDEKK2RkY21zMzQ5IGNvbXBhcmVzaWcgICA4ICAgICAgLS45RSsxICAtPiAxCitkZGNtczM1MCBjb21wYXJlc2lnICAgOCAgICAgIC05MEUtMSAgLT4gMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0tIC4uCitkZGNtczQwMCBjb21wYXJlc2lnICAgLTcuMCAgICAtNy4wICAgIC0+IDAKK2RkY21zNDAxIGNvbXBhcmVzaWcgICAtNy4wICAgIC03ICAgICAgLT4gMAorZGRjbXM0MDIgY29tcGFyZXNpZyAgIC03ICAgICAgLTcuMCAgICAtPiAwCitkZGNtczQwMyBjb21wYXJlc2lnICAgLTdFKzAgICAtNy4wICAgIC0+IDAKK2RkY21zNDA0IGNvbXBhcmVzaWcgICAtNzBFLTEgIC03LjAgICAgLT4gMAorZGRjbXM0MDUgY29tcGFyZXNpZyAgIC0uN0UrMSAgLTcgICAgICAtPiAwCitkZGNtczQwNiBjb21wYXJlc2lnICAgLTcwRS0xICAtNyAgICAgIC0+IDAKK2RkY21zNDA3IGNvbXBhcmVzaWcgICAtNy4wICAgIC03RSswICAgLT4gMAorZGRjbXM0MDggY29tcGFyZXNpZyAgIC03LjAgICAgLTcwRS0xICAtPiAwCitkZGNtczQwOSBjb21wYXJlc2lnICAgLTcgICAgICAtLjdFKzEgIC0+IDAKK2RkY21zNDEwIGNvbXBhcmVzaWcgICAtNyAgICAgIC03MEUtMSAgLT4gMAorCitkZGNtczQyMCBjb21wYXJlc2lnICAgLTguMCAgICAtNy4wICAgIC0+IC0xCitkZGNtczQyMSBjb21wYXJlc2lnICAgLTguMCAgICAtNyAgICAgIC0+IC0xCitkZGNtczQyMiBjb21wYXJlc2lnICAgLTggICAgICAtNy4wICAgIC0+IC0xCitkZGNtczQyMyBjb21wYXJlc2lnICAgLThFKzAgICAtNy4wICAgIC0+IC0xCitkZGNtczQyNCBjb21wYXJlc2lnICAgLTgwRS0xICAtNy4wICAgIC0+IC0xCitkZGNtczQyNSBjb21wYXJlc2lnICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitkZGNtczQyNiBjb21wYXJlc2lnICAgLTgwRS0xICAtNyAgICAgIC0+IC0xCitkZGNtczQyNyBjb21wYXJlc2lnICAgLTguMCAgICAtN0UrMCAgIC0+IC0xCitkZGNtczQyOCBjb21wYXJlc2lnICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitkZGNtczQyOSBjb21wYXJlc2lnICAgLTggICAgICAtLjdFKzEgIC0+IC0xCitkZGNtczQzMCBjb21wYXJlc2lnICAgLTggICAgICAtNzBFLTEgIC0+IC0xCisKK2RkY21zNDQwIGNvbXBhcmVzaWcgICAtOC4wICAgIC05LjAgICAgLT4gMQorZGRjbXM0NDEgY29tcGFyZXNpZyAgIC04LjAgICAgLTkgICAgICAtPiAxCitkZGNtczQ0MiBjb21wYXJlc2lnICAgLTggICAgICAtOS4wICAgIC0+IDEKK2RkY21zNDQzIGNvbXBhcmVzaWcgICAtOEUrMCAgIC05LjAgICAgLT4gMQorZGRjbXM0NDQgY29tcGFyZXNpZyAgIC04MEUtMSAgLTkuMCAgICAtPiAxCitkZGNtczQ0NSBjb21wYXJlc2lnICAgLS44RSsxICAtOSAgICAgIC0+IDEKK2RkY21zNDQ2IGNvbXBhcmVzaWcgICAtODBFLTEgIC05ICAgICAgLT4gMQorZGRjbXM0NDcgY29tcGFyZXNpZyAgIC04LjAgICAgLTlFKzAgICAtPiAxCitkZGNtczQ0OCBjb21wYXJlc2lnICAgLTguMCAgICAtOTBFLTEgIC0+IDEKK2RkY21zNDQ5IGNvbXBhcmVzaWcgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorZGRjbXM0NTAgY29tcGFyZXNpZyAgIC04ICAgICAgLTkwRS0xICAtPiAxCisKKworLS0gdGVzdGNhc2VzIHRoYXQgc3VidHJhY3QgdG8gbG90cyBvZiB6ZXJvcyBhdCBib3VuZGFyaWVzIFtwZ3JdCitkZGNtczQ3MyBjb21wYXJlc2lnIDEyMy40NTYwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAwCitkZGNtczQ3NCBjb21wYXJlc2lnIDEyMy40NTYwMDAwMDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY21zNDc1IGNvbXBhcmVzaWcgMTIzLjQ1NjAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAwCitkZGNtczQ3NiBjb21wYXJlc2lnIDEyMy40NTYwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAwCitkZGNtczQ3NyBjb21wYXJlc2lnIDEyMy40NTYwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY21zNDc4IGNvbXBhcmVzaWcgMTIzLjQ1NjAwMDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAwCitkZGNtczQ3OSBjb21wYXJlc2lnIDEyMy40NTYwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAwCitkZGNtczQ4MCBjb21wYXJlc2lnIDEyMy40NTYwMDBFKzg5IDEyMy40NTZFKzg5IC0+IDAKK2RkY21zNDgxIGNvbXBhcmVzaWcgMTIzLjQ1NjAwRS04OSAxMjMuNDU2RS04OSAtPiAwCitkZGNtczQ4MiBjb21wYXJlc2lnIDEyMy40NTYwRSs4OSAxMjMuNDU2RSs4OSAtPiAwCitkZGNtczQ4MyBjb21wYXJlc2lnIDEyMy40NTZFLTg5IDEyMy40NTZFLTg5IC0+IDAKK2RkY21zNDg3IGNvbXBhcmVzaWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwMDBFKzg5IC0+IDAKK2RkY21zNDg4IGNvbXBhcmVzaWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMEUtODkgLT4gMAorZGRjbXM0ODkgY29tcGFyZXNpZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDBFKzg5IC0+IDAKK2RkY21zNDkwIGNvbXBhcmVzaWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDBFLTg5IC0+IDAKK2RkY21zNDkxIGNvbXBhcmVzaWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMEUrODkgLT4gMAorZGRjbXM0OTIgY29tcGFyZXNpZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDBFLTg5IC0+IDAKK2RkY21zNDkzIGNvbXBhcmVzaWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDBFKzg5IC0+IDAKK2RkY21zNDk0IGNvbXBhcmVzaWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMEUtODkgLT4gMAorZGRjbXM0OTUgY29tcGFyZXNpZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDBFKzg5IC0+IDAKK2RkY21zNDk2IGNvbXBhcmVzaWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjBFLTg5IC0+IDAKK2RkY21zNDk3IGNvbXBhcmVzaWcgMTIzLjQ1NkUrODkgMTIzLjQ1NkUrODkgLT4gMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitkZGNtczUwMCBjb21wYXJlc2lnICAgIDEgICAgIDFFLTE1ICAgIC0+IDEKK2RkY21zNTAxIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTQgICAgLT4gMQorZGRjbXM1MDIgY29tcGFyZXNpZyAgICAxICAgICAxRS0xMyAgICAtPiAxCitkZGNtczUwMyBjb21wYXJlc2lnICAgIDEgICAgIDFFLTEyICAgIC0+IDEKK2RkY21zNTA0IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTEgICAgLT4gMQorZGRjbXM1MDUgY29tcGFyZXNpZyAgICAxICAgICAxRS0xMCAgICAtPiAxCitkZGNtczUwNiBjb21wYXJlc2lnICAgIDEgICAgIDFFLTkgICAgIC0+IDEKK2RkY21zNTA3IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtOCAgICAgLT4gMQorZGRjbXM1MDggY29tcGFyZXNpZyAgICAxICAgICAxRS03ICAgICAtPiAxCitkZGNtczUwOSBjb21wYXJlc2lnICAgIDEgICAgIDFFLTYgICAgIC0+IDEKK2RkY21zNTEwIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtNSAgICAgLT4gMQorZGRjbXM1MTEgY29tcGFyZXNpZyAgICAxICAgICAxRS00ICAgICAtPiAxCitkZGNtczUxMiBjb21wYXJlc2lnICAgIDEgICAgIDFFLTMgICAgIC0+IDEKK2RkY21zNTEzIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMiAgICAgLT4gMQorZGRjbXM1MTQgY29tcGFyZXNpZyAgICAxICAgICAxRS0xICAgICAtPiAxCitkZGNtczUxNSBjb21wYXJlc2lnICAgIDEgICAgIDFFLTAgICAgIC0+IDAKK2RkY21zNTE2IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMSAgICAgLT4gLTEKK2RkY21zNTE3IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMiAgICAgLT4gLTEKK2RkY21zNTE4IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMyAgICAgLT4gLTEKK2RkY21zNTE5IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNCAgICAgLT4gLTEKK2RkY21zNTIxIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNSAgICAgLT4gLTEKK2RkY21zNTIyIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNiAgICAgLT4gLTEKK2RkY21zNTIzIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrNyAgICAgLT4gLTEKK2RkY21zNTI0IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrOCAgICAgLT4gLTEKK2RkY21zNTI1IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrOSAgICAgLT4gLTEKK2RkY21zNTI2IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTAgICAgLT4gLTEKK2RkY21zNTI3IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTEgICAgLT4gLTEKK2RkY21zNTI4IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTIgICAgLT4gLTEKK2RkY21zNTI5IGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTMgICAgLT4gLTEKK2RkY21zNTMwIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTQgICAgLT4gLTEKK2RkY21zNTMxIGNvbXBhcmVzaWcgICAgMSAgICAgMUUrMTUgICAgLT4gLTEKKy0tIExSIHN3YXAKK2RkY21zNTQwIGNvbXBhcmVzaWcgICAgMUUtMTUgIDEgICAgICAgLT4gLTEKK2RkY21zNTQxIGNvbXBhcmVzaWcgICAgMUUtMTQgIDEgICAgICAgLT4gLTEKK2RkY21zNTQyIGNvbXBhcmVzaWcgICAgMUUtMTMgIDEgICAgICAgLT4gLTEKK2RkY21zNTQzIGNvbXBhcmVzaWcgICAgMUUtMTIgIDEgICAgICAgLT4gLTEKK2RkY21zNTQ0IGNvbXBhcmVzaWcgICAgMUUtMTEgIDEgICAgICAgLT4gLTEKK2RkY21zNTQ1IGNvbXBhcmVzaWcgICAgMUUtMTAgIDEgICAgICAgLT4gLTEKK2RkY21zNTQ2IGNvbXBhcmVzaWcgICAgMUUtOSAgIDEgICAgICAgLT4gLTEKK2RkY21zNTQ3IGNvbXBhcmVzaWcgICAgMUUtOCAgIDEgICAgICAgLT4gLTEKK2RkY21zNTQ4IGNvbXBhcmVzaWcgICAgMUUtNyAgIDEgICAgICAgLT4gLTEKK2RkY21zNTQ5IGNvbXBhcmVzaWcgICAgMUUtNiAgIDEgICAgICAgLT4gLTEKK2RkY21zNTUwIGNvbXBhcmVzaWcgICAgMUUtNSAgIDEgICAgICAgLT4gLTEKK2RkY21zNTUxIGNvbXBhcmVzaWcgICAgMUUtNCAgIDEgICAgICAgLT4gLTEKK2RkY21zNTUyIGNvbXBhcmVzaWcgICAgMUUtMyAgIDEgICAgICAgLT4gLTEKK2RkY21zNTUzIGNvbXBhcmVzaWcgICAgMUUtMiAgIDEgICAgICAgLT4gLTEKK2RkY21zNTU0IGNvbXBhcmVzaWcgICAgMUUtMSAgIDEgICAgICAgLT4gLTEKK2RkY21zNTU1IGNvbXBhcmVzaWcgICAgMUUtMCAgIDEgICAgICAgLT4gIDAKK2RkY21zNTU2IGNvbXBhcmVzaWcgICAgMUUrMSAgIDEgICAgICAgLT4gIDEKK2RkY21zNTU3IGNvbXBhcmVzaWcgICAgMUUrMiAgIDEgICAgICAgLT4gIDEKK2RkY21zNTU4IGNvbXBhcmVzaWcgICAgMUUrMyAgIDEgICAgICAgLT4gIDEKK2RkY21zNTU5IGNvbXBhcmVzaWcgICAgMUUrNCAgIDEgICAgICAgLT4gIDEKK2RkY21zNTYxIGNvbXBhcmVzaWcgICAgMUUrNSAgIDEgICAgICAgLT4gIDEKK2RkY21zNTYyIGNvbXBhcmVzaWcgICAgMUUrNiAgIDEgICAgICAgLT4gIDEKK2RkY21zNTYzIGNvbXBhcmVzaWcgICAgMUUrNyAgIDEgICAgICAgLT4gIDEKK2RkY21zNTY0IGNvbXBhcmVzaWcgICAgMUUrOCAgIDEgICAgICAgLT4gIDEKK2RkY21zNTY1IGNvbXBhcmVzaWcgICAgMUUrOSAgIDEgICAgICAgLT4gIDEKK2RkY21zNTY2IGNvbXBhcmVzaWcgICAgMUUrMTAgIDEgICAgICAgLT4gIDEKK2RkY21zNTY3IGNvbXBhcmVzaWcgICAgMUUrMTEgIDEgICAgICAgLT4gIDEKK2RkY21zNTY4IGNvbXBhcmVzaWcgICAgMUUrMTIgIDEgICAgICAgLT4gIDEKK2RkY21zNTY5IGNvbXBhcmVzaWcgICAgMUUrMTMgIDEgICAgICAgLT4gIDEKK2RkY21zNTcwIGNvbXBhcmVzaWcgICAgMUUrMTQgIDEgICAgICAgLT4gIDEKK2RkY21zNTcxIGNvbXBhcmVzaWcgICAgMUUrMTUgIDEgICAgICAgLT4gIDEKKy0tIHNpbWlsYXIgd2l0aCBhIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorZGRjbXM1ODAgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE1ICAgIC0+IDEKK2RkY21zNTgxIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNCAgICAtPiAxCitkZGNtczU4MiBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgLT4gMQorZGRjbXM1ODMgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEyICAgIC0+IDEKK2RkY21zNTg0IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMSAgICAtPiAxCitkZGNtczU4NSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgLT4gMQorZGRjbXM1ODYgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTkgICAgIC0+IDEKK2RkY21zNTg3IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS04ICAgICAtPiAxCitkZGNtczU4OCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgLT4gMQorZGRjbXM1ODkgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTYgICAgIC0+IC0xCitkZGNtczU5MCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNSAgICAgLT4gLTEKK2RkY21zNTkxIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAtPiAtMQorZGRjbXM1OTIgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTMgICAgIC0+IC0xCitkZGNtczU5MyBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMiAgICAgLT4gLTEKK2RkY21zNTk0IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAtPiAtMQorZGRjbXM1OTUgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTAgICAgIC0+IC0xCitkZGNtczU5NiBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMSAgICAgLT4gLTEKK2RkY21zNTk3IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAtPiAtMQorZGRjbXM1OTggY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzMgICAgIC0+IC0xCitkZGNtczU5OSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrNCAgICAgLT4gLTEKKworLS0gY2hlY2sgc29tZSB1bml0LXkgdHJhcHMKK2RkY21zNjAwIGNvbXBhcmVzaWcgICAxMiAgICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjAxIGNvbXBhcmVzaWcgICAxMi4wICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjAyIGNvbXBhcmVzaWcgICAxMi4wMCAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjAzIGNvbXBhcmVzaWcgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjA0IGNvbXBhcmVzaWcgICAxMi4wMDAwICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjA1IGNvbXBhcmVzaWcgICAxMi4wMDAwMCAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjA2IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjA3IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwICAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjA4IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwMCAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjA5IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgLT4gLTEKK2RkY21zNjEwIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyICAgICAgICAgICAgLT4gIDEKK2RkY21zNjExIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAgICAgICAgICAgLT4gIDEKK2RkY21zNjEyIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwICAgICAgICAgLT4gIDEKK2RkY21zNjEzIGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMCAgICAgICAgLT4gIDEKK2RkY21zNjE0IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAgICAgICAgLT4gIDEKK2RkY21zNjE1IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgLT4gIDEKK2RkY21zNjE2IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMCAgICAgLT4gIDEKK2RkY21zNjE3IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMDAgICAgLT4gIDEKK2RkY21zNjE4IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgLT4gIDEKK2RkY21zNjE5IGNvbXBhcmVzaWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwMCAgLT4gIDEKK2RkY21zNjIwIGNvbXBhcmVzaWcgIC0xMiAgICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjIxIGNvbXBhcmVzaWcgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjIyIGNvbXBhcmVzaWcgIC0xMi4wMCAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjIzIGNvbXBhcmVzaWcgIC0xMi4wMDAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjI0IGNvbXBhcmVzaWcgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjI1IGNvbXBhcmVzaWcgIC0xMi4wMDAwMCAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjI2IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjI3IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjI4IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAwMCAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjI5IGNvbXBhcmVzaWcgIC0xMi4wMDAwMDAwMDAgLTEyLjIzNDUgLT4gIDEKK2RkY21zNjMwIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgLT4gLTEKK2RkY21zNjMxIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wICAgICAgICAgLT4gLTEKK2RkY21zNjMyIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMCAgICAgICAgLT4gLTEKK2RkY21zNjMzIGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgLT4gLTEKK2RkY21zNjM0IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwICAgICAgLT4gLTEKK2RkY21zNjM1IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMCAgICAgLT4gLTEKK2RkY21zNjM2IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgLT4gLTEKK2RkY21zNjM3IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwICAgLT4gLTEKK2RkY21zNjM4IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMCAgLT4gLTEKK2RkY21zNjM5IGNvbXBhcmVzaWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgLT4gLTEKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RkY21zNjQwIGNvbXBhcmVzaWcgICAwICAgICAwICAgLT4gMAorZGRjbXM2NDEgY29tcGFyZXNpZyAgIDAgICAgLTAgICAtPiAwCitkZGNtczY0MiBjb21wYXJlc2lnICAgMCAgICAtMC4wIC0+IDAKK2RkY21zNjQzIGNvbXBhcmVzaWcgICAwICAgICAwLjAgLT4gMAorZGRjbXM2NDQgY29tcGFyZXNpZyAgLTAgICAgIDAgICAtPiAwCitkZGNtczY0NSBjb21wYXJlc2lnICAtMCAgICAtMCAgIC0+IDAKK2RkY21zNjQ2IGNvbXBhcmVzaWcgIC0wICAgIC0wLjAgLT4gMAorZGRjbXM2NDcgY29tcGFyZXNpZyAgLTAgICAgIDAuMCAtPiAwCitkZGNtczY0OCBjb21wYXJlc2lnICAgMC4wICAgMCAgIC0+IDAKK2RkY21zNjQ5IGNvbXBhcmVzaWcgICAwLjAgIC0wICAgLT4gMAorZGRjbXM2NTAgY29tcGFyZXNpZyAgIDAuMCAgLTAuMCAtPiAwCitkZGNtczY1MSBjb21wYXJlc2lnICAgMC4wICAgMC4wIC0+IDAKK2RkY21zNjUyIGNvbXBhcmVzaWcgIC0wLjAgICAwICAgLT4gMAorZGRjbXM2NTMgY29tcGFyZXNpZyAgLTAuMCAgLTAgICAtPiAwCitkZGNtczY1NCBjb21wYXJlc2lnICAtMC4wICAtMC4wIC0+IDAKK2RkY21zNjU1IGNvbXBhcmVzaWcgIC0wLjAgICAwLjAgLT4gMAorCitkZGNtczY1NiBjb21wYXJlc2lnICAtMEUxICAgMC4wIC0+IDAKK2RkY21zNjU3IGNvbXBhcmVzaWcgIC0wRTIgICAwLjAgLT4gMAorZGRjbXM2NTggY29tcGFyZXNpZyAgIDBFMSAgIDAuMCAtPiAwCitkZGNtczY1OSBjb21wYXJlc2lnICAgMEUyICAgMC4wIC0+IDAKK2RkY21zNjYwIGNvbXBhcmVzaWcgIC0wRTEgICAwICAgLT4gMAorZGRjbXM2NjEgY29tcGFyZXNpZyAgLTBFMiAgIDAgICAtPiAwCitkZGNtczY2MiBjb21wYXJlc2lnICAgMEUxICAgMCAgIC0+IDAKK2RkY21zNjYzIGNvbXBhcmVzaWcgICAwRTIgICAwICAgLT4gMAorZGRjbXM2NjQgY29tcGFyZXNpZyAgLTBFMSAgLTBFMSAtPiAwCitkZGNtczY2NSBjb21wYXJlc2lnICAtMEUyICAtMEUxIC0+IDAKK2RkY21zNjY2IGNvbXBhcmVzaWcgICAwRTEgIC0wRTEgLT4gMAorZGRjbXM2NjcgY29tcGFyZXNpZyAgIDBFMiAgLTBFMSAtPiAwCitkZGNtczY2OCBjb21wYXJlc2lnICAtMEUxICAtMEUyIC0+IDAKK2RkY21zNjY5IGNvbXBhcmVzaWcgIC0wRTIgIC0wRTIgLT4gMAorZGRjbXM2NzAgY29tcGFyZXNpZyAgIDBFMSAgLTBFMiAtPiAwCitkZGNtczY3MSBjb21wYXJlc2lnICAgMEUyICAtMEUyIC0+IDAKK2RkY21zNjcyIGNvbXBhcmVzaWcgIC0wRTEgICAwRTEgLT4gMAorZGRjbXM2NzMgY29tcGFyZXNpZyAgLTBFMiAgIDBFMSAtPiAwCitkZGNtczY3NCBjb21wYXJlc2lnICAgMEUxICAgMEUxIC0+IDAKK2RkY21zNjc1IGNvbXBhcmVzaWcgICAwRTIgICAwRTEgLT4gMAorZGRjbXM2NzYgY29tcGFyZXNpZyAgLTBFMSAgIDBFMiAtPiAwCitkZGNtczY3NyBjb21wYXJlc2lnICAtMEUyICAgMEUyIC0+IDAKK2RkY21zNjc4IGNvbXBhcmVzaWcgICAwRTEgICAwRTIgLT4gMAorZGRjbXM2NzkgY29tcGFyZXNpZyAgIDBFMiAgIDBFMiAtPiAwCisKKy0tIHRyYWlsaW5nIHplcm9zOyB1bml0LXkKK2RkY21zNjgwIGNvbXBhcmVzaWcgICAxMiAgICAxMiAgICAgICAgICAgLT4gMAorZGRjbXM2ODEgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAgICAgICAgICAtPiAwCitkZGNtczY4MiBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAgICAgICAgIC0+IDAKK2RkY21zNjgzIGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAgICAgICAgLT4gMAorZGRjbXM2ODQgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAgICAgICAtPiAwCitkZGNtczY4NSBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMDAgICAgIC0+IDAKK2RkY21zNjg2IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwMDAgICAgLT4gMAorZGRjbXM2ODcgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAwMDAgICAtPiAwCitkZGNtczY4OCBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMDAwMDAgIC0+IDAKK2RkY21zNjg5IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwMDAwMDAgLT4gMAorZGRjbXM2OTAgY29tcGFyZXNpZyAgIDEyICAgICAgICAgICAgICAxMiAtPiAwCitkZGNtczY5MSBjb21wYXJlc2lnICAgMTIuMCAgICAgICAgICAgIDEyIC0+IDAKK2RkY21zNjkyIGNvbXBhcmVzaWcgICAxMi4wMCAgICAgICAgICAgMTIgLT4gMAorZGRjbXM2OTMgY29tcGFyZXNpZyAgIDEyLjAwMCAgICAgICAgICAxMiAtPiAwCitkZGNtczY5NCBjb21wYXJlc2lnICAgMTIuMDAwMCAgICAgICAgIDEyIC0+IDAKK2RkY21zNjk1IGNvbXBhcmVzaWcgICAxMi4wMDAwMCAgICAgICAgMTIgLT4gMAorZGRjbXM2OTYgY29tcGFyZXNpZyAgIDEyLjAwMDAwMCAgICAgICAxMiAtPiAwCitkZGNtczY5NyBjb21wYXJlc2lnICAgMTIuMDAwMDAwMCAgICAgIDEyIC0+IDAKK2RkY21zNjk4IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwMCAgICAgMTIgLT4gMAorZGRjbXM2OTkgY29tcGFyZXNpZyAgIDEyLjAwMDAwMDAwMCAgICAxMiAtPiAwCisKKy0tIGZpcnN0LCBzZWNvbmQsICYgbGFzdCBkaWdpdAorZGRjbXM3MDAgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NSAtPiAxCitkZGNtczcwMSBjb21wYXJlc2lnICAgMTIzNDU2Nzg5MDEyMzQ1NiAxMjM0NTY3ODkwMTIzNDU2IC0+IDAKK2RkY21zNzAyIGNvbXBhcmVzaWcgICAxMjM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTcgLT4gLTEKK2RkY21zNzAzIGNvbXBhcmVzaWcgICAxMjM0NTY3ODkwMTIzNDU2IDAyMzQ1Njc4OTAxMjM0NTYgLT4gMQorZGRjbXM3MDQgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NiAtPiAwCitkZGNtczcwNSBjb21wYXJlc2lnICAgMTIzNDU2Nzg5MDEyMzQ1NiAyMjM0NTY3ODkwMTIzNDU2IC0+IC0xCitkZGNtczcwNiBjb21wYXJlc2lnICAgMTEzNDU2Nzg5MDEyMzQ1NiAxMDM0NTY3ODkwMTIzNDU2IC0+IDEKK2RkY21zNzA3IGNvbXBhcmVzaWcgICAxMTM0NTY3ODkwMTIzNDU2IDExMzQ1Njc4OTAxMjM0NTYgLT4gMAorZGRjbXM3MDggY29tcGFyZXNpZyAgIDExMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NiAtPiAtMQorCistLSBtaXNjZWxsYW5lb3VzCitkZGNtczcyMSBjb21wYXJlc2lnIDEyMzQ1Njc4MDAwIDEgLT4gMQorZGRjbXM3MjIgY29tcGFyZXNpZyAxIDEyMzQ1Njc4MDAwIC0+IC0xCitkZGNtczcyMyBjb21wYXJlc2lnIDEyMzQ1Njc4MDAgIDEgLT4gMQorZGRjbXM3MjQgY29tcGFyZXNpZyAxIDEyMzQ1Njc4MDAgIC0+IC0xCitkZGNtczcyNSBjb21wYXJlc2lnIDEyMzQ1Njc4OTAgIDEgLT4gMQorZGRjbXM3MjYgY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTAgIC0+IC0xCitkZGNtczcyNyBjb21wYXJlc2lnIDEyMzQ1Njc4OTEgIDEgLT4gMQorZGRjbXM3MjggY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTEgIC0+IC0xCitkZGNtczcyOSBjb21wYXJlc2lnIDEyMzQ1Njc4OTAxIDEgLT4gMQorZGRjbXM3MzAgY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTAxIC0+IC0xCitkZGNtczczMSBjb21wYXJlc2lnIDEyMzQ1Njc4OTYgIDEgLT4gMQorZGRjbXM3MzIgY29tcGFyZXNpZyAxIDEyMzQ1Njc4OTYgIC0+IC0xCisKKy0tIHJlc2lkdWUgY2FzZXMgYXQgbG93ZXIgcHJlY2lzaW9uCitkZGNtczc0MCBjb21wYXJlc2lnICAxICAwLjk5OTk5OTkgIC0+IDEKK2RkY21zNzQxIGNvbXBhcmVzaWcgIDEgIDAuOTk5OTk5ICAgLT4gMQorZGRjbXM3NDIgY29tcGFyZXNpZyAgMSAgMC45OTk5OSAgICAtPiAxCitkZGNtczc0MyBjb21wYXJlc2lnICAxICAxLjAwMDAgICAgIC0+IDAKK2RkY21zNzQ0IGNvbXBhcmVzaWcgIDEgIDEuMDAwMDEgICAgLT4gLTEKK2RkY21zNzQ1IGNvbXBhcmVzaWcgIDEgIDEuMDAwMDAxICAgLT4gLTEKK2RkY21zNzQ2IGNvbXBhcmVzaWcgIDEgIDEuMDAwMDAwMSAgLT4gLTEKK2RkY21zNzUwIGNvbXBhcmVzaWcgIDAuOTk5OTk5OSAgMSAgLT4gLTEKK2RkY21zNzUxIGNvbXBhcmVzaWcgIDAuOTk5OTk5ICAgMSAgLT4gLTEKK2RkY21zNzUyIGNvbXBhcmVzaWcgIDAuOTk5OTkgICAgMSAgLT4gLTEKK2RkY21zNzUzIGNvbXBhcmVzaWcgIDEuMDAwMCAgICAgMSAgLT4gMAorZGRjbXM3NTQgY29tcGFyZXNpZyAgMS4wMDAwMSAgICAxICAtPiAxCitkZGNtczc1NSBjb21wYXJlc2lnICAxLjAwMDAwMSAgIDEgIC0+IDEKK2RkY21zNzU2IGNvbXBhcmVzaWcgIDEuMDAwMDAwMSAgMSAgLT4gMQorCistLSBTcGVjaWFscworZGRjbXM3ODAgY29tcGFyZXNpZyAgSW5mICAtSW5mICAgLT4gIDEKK2RkY21zNzgxIGNvbXBhcmVzaWcgIEluZiAgLTEwMDAgIC0+ICAxCitkZGNtczc4MiBjb21wYXJlc2lnICBJbmYgIC0xICAgICAtPiAgMQorZGRjbXM3ODMgY29tcGFyZXNpZyAgSW5mICAtMCAgICAgLT4gIDEKK2RkY21zNzg0IGNvbXBhcmVzaWcgIEluZiAgIDAgICAgIC0+ICAxCitkZGNtczc4NSBjb21wYXJlc2lnICBJbmYgICAxICAgICAtPiAgMQorZGRjbXM3ODYgY29tcGFyZXNpZyAgSW5mICAgMTAwMCAgLT4gIDEKK2RkY21zNzg3IGNvbXBhcmVzaWcgIEluZiAgIEluZiAgIC0+ICAwCitkZGNtczc4OCBjb21wYXJlc2lnIC0xMDAwICBJbmYgICAtPiAtMQorZGRjbXM3ODkgY29tcGFyZXNpZyAtSW5mICAgSW5mICAgLT4gLTEKK2RkY21zNzkwIGNvbXBhcmVzaWcgLTEgICAgIEluZiAgIC0+IC0xCitkZGNtczc5MSBjb21wYXJlc2lnIC0wICAgICBJbmYgICAtPiAtMQorZGRjbXM3OTIgY29tcGFyZXNpZyAgMCAgICAgSW5mICAgLT4gLTEKK2RkY21zNzkzIGNvbXBhcmVzaWcgIDEgICAgIEluZiAgIC0+IC0xCitkZGNtczc5NCBjb21wYXJlc2lnICAxMDAwICBJbmYgICAtPiAtMQorZGRjbXM3OTUgY29tcGFyZXNpZyAgSW5mICAgSW5mICAgLT4gIDAKKworZGRjbXM4MDAgY29tcGFyZXNpZyAtSW5mICAtSW5mICAgLT4gIDAKK2RkY21zODAxIGNvbXBhcmVzaWcgLUluZiAgLTEwMDAgIC0+IC0xCitkZGNtczgwMiBjb21wYXJlc2lnIC1JbmYgIC0xICAgICAtPiAtMQorZGRjbXM4MDMgY29tcGFyZXNpZyAtSW5mICAtMCAgICAgLT4gLTEKK2RkY21zODA0IGNvbXBhcmVzaWcgLUluZiAgIDAgICAgIC0+IC0xCitkZGNtczgwNSBjb21wYXJlc2lnIC1JbmYgICAxICAgICAtPiAtMQorZGRjbXM4MDYgY29tcGFyZXNpZyAtSW5mICAgMTAwMCAgLT4gLTEKK2RkY21zODA3IGNvbXBhcmVzaWcgLUluZiAgIEluZiAgIC0+IC0xCitkZGNtczgwOCBjb21wYXJlc2lnIC1JbmYgIC1JbmYgICAtPiAgMAorZGRjbXM4MDkgY29tcGFyZXNpZyAtMTAwMCAtSW5mICAgLT4gIDEKK2RkY21zODEwIGNvbXBhcmVzaWcgLTEgICAgLUluZiAgIC0+ICAxCitkZGNtczgxMSBjb21wYXJlc2lnIC0wICAgIC1JbmYgICAtPiAgMQorZGRjbXM4MTIgY29tcGFyZXNpZyAgMCAgICAtSW5mICAgLT4gIDEKK2RkY21zODEzIGNvbXBhcmVzaWcgIDEgICAgLUluZiAgIC0+ICAxCitkZGNtczgxNCBjb21wYXJlc2lnICAxMDAwIC1JbmYgICAtPiAgMQorZGRjbXM4MTUgY29tcGFyZXNpZyAgSW5mICAtSW5mICAgLT4gIDEKKworZGRjbXM4MjEgY29tcGFyZXNpZyAgTmFOIC1JbmYgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODIyIGNvbXBhcmVzaWcgIE5hTiAtMTAwMCAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgyMyBjb21wYXJlc2lnICBOYU4gLTEgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MjQgY29tcGFyZXNpZyAgTmFOIC0wICAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODI1IGNvbXBhcmVzaWcgIE5hTiAgMCAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgyNiBjb21wYXJlc2lnICBOYU4gIDEgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MjcgY29tcGFyZXNpZyAgTmFOICAxMDAwICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODI4IGNvbXBhcmVzaWcgIE5hTiAgSW5mICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgyOSBjb21wYXJlc2lnICBOYU4gIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MzAgY29tcGFyZXNpZyAtSW5mICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODMxIGNvbXBhcmVzaWcgLTEwMDAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgzMiBjb21wYXJlc2lnIC0xICAgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MzMgY29tcGFyZXNpZyAtMCAgICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODM0IGNvbXBhcmVzaWcgIDAgICAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgzNSBjb21wYXJlc2lnICAxICAgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MzYgY29tcGFyZXNpZyAgMTAwMCBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODM3IGNvbXBhcmVzaWcgIEluZiAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczgzOCBjb21wYXJlc2lnIC1OYU4gLU5hTiAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4MzkgY29tcGFyZXNpZyArTmFOIC1OYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODQwIGNvbXBhcmVzaWcgLU5hTiArTmFOICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2RkY21zODQxIGNvbXBhcmVzaWcgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg0MiBjb21wYXJlc2lnICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NDMgY29tcGFyZXNpZyAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODQ0IGNvbXBhcmVzaWcgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg0NSBjb21wYXJlc2lnICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NDYgY29tcGFyZXNpZyAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODQ3IGNvbXBhcmVzaWcgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg0OCBjb21wYXJlc2lnICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NDkgY29tcGFyZXNpZyAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODUwIGNvbXBhcmVzaWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg1MSBjb21wYXJlc2lnIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NTIgY29tcGFyZXNpZyAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODUzIGNvbXBhcmVzaWcgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg1NCBjb21wYXJlc2lnIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NTUgY29tcGFyZXNpZyAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODU2IGNvbXBhcmVzaWcgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg1NyBjb21wYXJlc2lnICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NTggY29tcGFyZXNpZyAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODU5IGNvbXBhcmVzaWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkY21zODYwIGNvbXBhcmVzaWcgIE5hTjkgLUluZiAgIC0+ICBOYU45ICAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODYxIGNvbXBhcmVzaWcgIE5hTjggIDk5OSAgIC0+ICBOYU44ICAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODYyIGNvbXBhcmVzaWcgIE5hTjc3IEluZiAgIC0+ICBOYU43NyAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODYzIGNvbXBhcmVzaWcgLU5hTjY3IE5hTjUgIC0+IC1OYU42NyAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODY0IGNvbXBhcmVzaWcgLUluZiAgLU5hTjQgIC0+IC1OYU40ICAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODY1IGNvbXBhcmVzaWcgLTk5OSAgLU5hTjMzIC0+IC1OYU4zMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODY2IGNvbXBhcmVzaWcgIEluZiAgIE5hTjIgIC0+ICBOYU4yICAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODY3IGNvbXBhcmVzaWcgLU5hTjQxIC1OYU40MiAtPiAtTmFONDEgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODY4IGNvbXBhcmVzaWcgK05hTjQxIC1OYU40MiAtPiAgTmFONDEgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODY5IGNvbXBhcmVzaWcgLU5hTjQxICtOYU40MiAtPiAtTmFONDEgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODcwIGNvbXBhcmVzaWcgK05hTjQxICtOYU40MiAtPiAgTmFONDEgSW52YWxpZF9vcGVyYXRpb24KKworZGRjbXM4NzEgY29tcGFyZXNpZyAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg3MiBjb21wYXJlc2lnICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODczIGNvbXBhcmVzaWcgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NzQgY29tcGFyZXNpZyAgc05hTjE2IHNOYU45NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg3NSBjb21wYXJlc2lnICBOYU44NSAgc05hTjgzICAtPiAgTmFOODMgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODc2IGNvbXBhcmVzaWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRjbXM4NzcgY29tcGFyZXNpZyAgMDg4ICAgIHNOYU44MSAgLT4gIE5hTjgxIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczg3OCBjb21wYXJlc2lnICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkY21zODc5IGNvbXBhcmVzaWcgIE5hTiAgIC1zTmFOODkgIC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSB3aWRlIHJhbmdlCitkZGNtczg4MCBjb21wYXJlc2lnICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzM4NCAtPiAtMQorZGRjbXM4ODEgY29tcGFyZXNpZyA5RSszODQgKzEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDEKK2RkY21zODgyIGNvbXBhcmVzaWcgKzAuMTAwIDlFLTM4MyAgICAgICAgICAgICAgIC0+ICAxCitkZGNtczg4MyBjb21wYXJlc2lnIDlFLTM4MyArMC4xMDAgICAgICAgICAgICAgICAtPiAtMQorZGRjbXM4ODUgY29tcGFyZXNpZyAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSszODQgLT4gLTEKK2RkY21zODg2IGNvbXBhcmVzaWcgOUUrMzg0IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitkZGNtczg4NyBjb21wYXJlc2lnIC0wLjEwMCA5RS0zODMgICAgICAgICAgICAgICAtPiAtMQorZGRjbXM4ODggY29tcGFyZXNpZyA5RS0zODMgLTAuMTAwICAgICAgICAgICAgICAgLT4gIDEKKworLS0gc2lnbnMKK2RkY21zOTAxIGNvbXBhcmVzaWcgIDFlKzc3ICAxZSsxMSAtPiAgMQorZGRjbXM5MDIgY29tcGFyZXNpZyAgMWUrNzcgLTFlKzExIC0+ICAxCitkZGNtczkwMyBjb21wYXJlc2lnIC0xZSs3NyAgMWUrMTEgLT4gLTEKK2RkY21zOTA0IGNvbXBhcmVzaWcgLTFlKzc3IC0xZSsxMSAtPiAtMQorZGRjbXM5MDUgY29tcGFyZXNpZyAgMWUtNzcgIDFlLTExIC0+IC0xCitkZGNtczkwNiBjb21wYXJlc2lnICAxZS03NyAtMWUtMTEgLT4gIDEKK2RkY21zOTA3IGNvbXBhcmVzaWcgLTFlLTc3ICAxZS0xMSAtPiAtMQorZGRjbXM5MDggY29tcGFyZXNpZyAtMWUtNzcgLTFlLTExIC0+ICAxCisKKy0tIE51bGwgdGVzdHMKK2RkY21zOTkwIGNvbXBhcmVzaWcgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGNtczk5MSBjb21wYXJlc2lnICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmVUb3RhbC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmVUb3RhbC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYzk4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVRvdGFsLmRlY1Rlc3QKQEAgLTAsMCArMSw3MDYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb21wYXJlVG90YWwuZGVjVGVzdCAtLSBkZWNEb3VibGUgY29tcGFyaXNvbiB1c2luZyB0b3RhbCBvcmRlcmluZy0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKy0tIFNpbWlsYXJseSwgY29tcGFyZXRvdGFsIHdpbGwgaGF2ZSBzb21lIHJhZGljYWxseSBkaWZmZXJlbnQgcGF0aHMKKy0tIHRoYW4gY29tcGFyZS4KKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RkY290MDAxIGNvbXBhcmV0b3RhbCAgLTIgIC0yICAtPiAwCitkZGNvdDAwMiBjb21wYXJldG90YWwgIC0yICAtMSAgLT4gLTEKK2RkY290MDAzIGNvbXBhcmV0b3RhbCAgLTIgICAwICAtPiAtMQorZGRjb3QwMDQgY29tcGFyZXRvdGFsICAtMiAgIDEgIC0+IC0xCitkZGNvdDAwNSBjb21wYXJldG90YWwgIC0yICAgMiAgLT4gLTEKK2RkY290MDA2IGNvbXBhcmV0b3RhbCAgLTEgIC0yICAtPiAxCitkZGNvdDAwNyBjb21wYXJldG90YWwgIC0xICAtMSAgLT4gMAorZGRjb3QwMDggY29tcGFyZXRvdGFsICAtMSAgIDAgIC0+IC0xCitkZGNvdDAwOSBjb21wYXJldG90YWwgIC0xICAgMSAgLT4gLTEKK2RkY290MDEwIGNvbXBhcmV0b3RhbCAgLTEgICAyICAtPiAtMQorZGRjb3QwMTEgY29tcGFyZXRvdGFsICAgMCAgLTIgIC0+IDEKK2RkY290MDEyIGNvbXBhcmV0b3RhbCAgIDAgIC0xICAtPiAxCitkZGNvdDAxMyBjb21wYXJldG90YWwgICAwICAgMCAgLT4gMAorZGRjb3QwMTQgY29tcGFyZXRvdGFsICAgMCAgIDEgIC0+IC0xCitkZGNvdDAxNSBjb21wYXJldG90YWwgICAwICAgMiAgLT4gLTEKK2RkY290MDE2IGNvbXBhcmV0b3RhbCAgIDEgIC0yICAtPiAxCitkZGNvdDAxNyBjb21wYXJldG90YWwgICAxICAtMSAgLT4gMQorZGRjb3QwMTggY29tcGFyZXRvdGFsICAgMSAgIDAgIC0+IDEKK2RkY290MDE5IGNvbXBhcmV0b3RhbCAgIDEgICAxICAtPiAwCitkZGNvdDAyMCBjb21wYXJldG90YWwgICAxICAgMiAgLT4gLTEKK2RkY290MDIxIGNvbXBhcmV0b3RhbCAgIDIgIC0yICAtPiAxCitkZGNvdDAyMiBjb21wYXJldG90YWwgICAyICAtMSAgLT4gMQorZGRjb3QwMjMgY29tcGFyZXRvdGFsICAgMiAgIDAgIC0+IDEKK2RkY290MDI1IGNvbXBhcmV0b3RhbCAgIDIgICAxICAtPiAxCitkZGNvdDAyNiBjb21wYXJldG90YWwgICAyICAgMiAgLT4gMAorCitkZGNvdDAzMSBjb21wYXJldG90YWwgIC0yMCAgLTIwICAtPiAwCitkZGNvdDAzMiBjb21wYXJldG90YWwgIC0yMCAgLTEwICAtPiAtMQorZGRjb3QwMzMgY29tcGFyZXRvdGFsICAtMjAgICAwMCAgLT4gLTEKK2RkY290MDM0IGNvbXBhcmV0b3RhbCAgLTIwICAgMTAgIC0+IC0xCitkZGNvdDAzNSBjb21wYXJldG90YWwgIC0yMCAgIDIwICAtPiAtMQorZGRjb3QwMzYgY29tcGFyZXRvdGFsICAtMTAgIC0yMCAgLT4gMQorZGRjb3QwMzcgY29tcGFyZXRvdGFsICAtMTAgIC0xMCAgLT4gMAorZGRjb3QwMzggY29tcGFyZXRvdGFsICAtMTAgICAwMCAgLT4gLTEKK2RkY290MDM5IGNvbXBhcmV0b3RhbCAgLTEwICAgMTAgIC0+IC0xCitkZGNvdDA0MCBjb21wYXJldG90YWwgIC0xMCAgIDIwICAtPiAtMQorZGRjb3QwNDEgY29tcGFyZXRvdGFsICAgMDAgIC0yMCAgLT4gMQorZGRjb3QwNDIgY29tcGFyZXRvdGFsICAgMDAgIC0xMCAgLT4gMQorZGRjb3QwNDMgY29tcGFyZXRvdGFsICAgMDAgICAwMCAgLT4gMAorZGRjb3QwNDQgY29tcGFyZXRvdGFsICAgMDAgICAxMCAgLT4gLTEKK2RkY290MDQ1IGNvbXBhcmV0b3RhbCAgIDAwICAgMjAgIC0+IC0xCitkZGNvdDA0NiBjb21wYXJldG90YWwgICAxMCAgLTIwICAtPiAxCitkZGNvdDA0NyBjb21wYXJldG90YWwgICAxMCAgLTEwICAtPiAxCitkZGNvdDA0OCBjb21wYXJldG90YWwgICAxMCAgIDAwICAtPiAxCitkZGNvdDA0OSBjb21wYXJldG90YWwgICAxMCAgIDEwICAtPiAwCitkZGNvdDA1MCBjb21wYXJldG90YWwgICAxMCAgIDIwICAtPiAtMQorZGRjb3QwNTEgY29tcGFyZXRvdGFsICAgMjAgIC0yMCAgLT4gMQorZGRjb3QwNTIgY29tcGFyZXRvdGFsICAgMjAgIC0xMCAgLT4gMQorZGRjb3QwNTMgY29tcGFyZXRvdGFsICAgMjAgICAwMCAgLT4gMQorZGRjb3QwNTUgY29tcGFyZXRvdGFsICAgMjAgICAxMCAgLT4gMQorZGRjb3QwNTYgY29tcGFyZXRvdGFsICAgMjAgICAyMCAgLT4gMAorCitkZGNvdDA2MSBjb21wYXJldG90YWwgIC0yLjAgIC0yLjAgIC0+IDAKK2RkY290MDYyIGNvbXBhcmV0b3RhbCAgLTIuMCAgLTEuMCAgLT4gLTEKK2RkY290MDYzIGNvbXBhcmV0b3RhbCAgLTIuMCAgIDAuMCAgLT4gLTEKK2RkY290MDY0IGNvbXBhcmV0b3RhbCAgLTIuMCAgIDEuMCAgLT4gLTEKK2RkY290MDY1IGNvbXBhcmV0b3RhbCAgLTIuMCAgIDIuMCAgLT4gLTEKK2RkY290MDY2IGNvbXBhcmV0b3RhbCAgLTEuMCAgLTIuMCAgLT4gMQorZGRjb3QwNjcgY29tcGFyZXRvdGFsICAtMS4wICAtMS4wICAtPiAwCitkZGNvdDA2OCBjb21wYXJldG90YWwgIC0xLjAgICAwLjAgIC0+IC0xCitkZGNvdDA2OSBjb21wYXJldG90YWwgIC0xLjAgICAxLjAgIC0+IC0xCitkZGNvdDA3MCBjb21wYXJldG90YWwgIC0xLjAgICAyLjAgIC0+IC0xCitkZGNvdDA3MSBjb21wYXJldG90YWwgICAwLjAgIC0yLjAgIC0+IDEKK2RkY290MDcyIGNvbXBhcmV0b3RhbCAgIDAuMCAgLTEuMCAgLT4gMQorZGRjb3QwNzMgY29tcGFyZXRvdGFsICAgMC4wICAgMC4wICAtPiAwCitkZGNvdDA3NCBjb21wYXJldG90YWwgICAwLjAgICAxLjAgIC0+IC0xCitkZGNvdDA3NSBjb21wYXJldG90YWwgICAwLjAgICAyLjAgIC0+IC0xCitkZGNvdDA3NiBjb21wYXJldG90YWwgICAxLjAgIC0yLjAgIC0+IDEKK2RkY290MDc3IGNvbXBhcmV0b3RhbCAgIDEuMCAgLTEuMCAgLT4gMQorZGRjb3QwNzggY29tcGFyZXRvdGFsICAgMS4wICAgMC4wICAtPiAxCitkZGNvdDA3OSBjb21wYXJldG90YWwgICAxLjAgICAxLjAgIC0+IDAKK2RkY290MDgwIGNvbXBhcmV0b3RhbCAgIDEuMCAgIDIuMCAgLT4gLTEKK2RkY290MDgxIGNvbXBhcmV0b3RhbCAgIDIuMCAgLTIuMCAgLT4gMQorZGRjb3QwODIgY29tcGFyZXRvdGFsICAgMi4wICAtMS4wICAtPiAxCitkZGNvdDA4MyBjb21wYXJldG90YWwgICAyLjAgICAwLjAgIC0+IDEKK2RkY290MDg1IGNvbXBhcmV0b3RhbCAgIDIuMCAgIDEuMCAgLT4gMQorZGRjb3QwODYgY29tcGFyZXRvdGFsICAgMi4wICAgMi4wICAtPiAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorZGRjb3QwOTAgY29tcGFyZXRvdGFsICA5Ljk5OTk5OTk5RSszODQgOS45OTk5OTk5OUUrMzg0ICAtPiAwCitkZGNvdDA5MSBjb21wYXJldG90YWwgLTkuOTk5OTk5OTlFKzM4NCA5Ljk5OTk5OTk5RSszODQgIC0+IC0xCitkZGNvdDA5MiBjb21wYXJldG90YWwgIDkuOTk5OTk5OTlFKzM4NCAtOS45OTk5OTk5OUUrMzg0IC0+IDEKK2RkY290MDkzIGNvbXBhcmV0b3RhbCAtOS45OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5RSszODQgLT4gMAorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKKy0tIGluIHRoaXMgZmlyc3QgZ3JvdXAsIGNvbXBhcmUgd291bGQgY29tcGFyZSBhbGwgZXF1YWwKK2RkY290MTAwIGNvbXBhcmV0b3RhbCAgIDcuMCAgICA3LjAgICAgLT4gMAorZGRjb3QxMDEgY29tcGFyZXRvdGFsICAgNy4wICAgIDcgICAgICAtPiAtMQorZGRjb3QxMDIgY29tcGFyZXRvdGFsICAgNyAgICAgIDcuMCAgICAtPiAxCitkZGNvdDEwMyBjb21wYXJldG90YWwgICA3RSswICAgNy4wICAgIC0+IDEKK2RkY290MTA0IGNvbXBhcmV0b3RhbCAgIDcwRS0xICA3LjAgICAgLT4gMAorZGRjb3QxMDUgY29tcGFyZXRvdGFsICAgMC43RSsxIDcgICAgICAtPiAwCitkZGNvdDEwNiBjb21wYXJldG90YWwgICA3MEUtMSAgNyAgICAgIC0+IC0xCitkZGNvdDEwNyBjb21wYXJldG90YWwgICA3LjAgICAgN0UrMCAgIC0+IC0xCitkZGNvdDEwOCBjb21wYXJldG90YWwgICA3LjAgICAgNzBFLTEgIC0+IDAKK2RkY290MTA5IGNvbXBhcmV0b3RhbCAgIDcgICAgICAwLjdFKzEgLT4gMAorZGRjb3QxMTAgY29tcGFyZXRvdGFsICAgNyAgICAgIDcwRS0xICAtPiAxCisKK2RkY290MTIwIGNvbXBhcmV0b3RhbCAgIDguMCAgICA3LjAgICAgLT4gMQorZGRjb3QxMjEgY29tcGFyZXRvdGFsICAgOC4wICAgIDcgICAgICAtPiAxCitkZGNvdDEyMiBjb21wYXJldG90YWwgICA4ICAgICAgNy4wICAgIC0+IDEKK2RkY290MTIzIGNvbXBhcmV0b3RhbCAgIDhFKzAgICA3LjAgICAgLT4gMQorZGRjb3QxMjQgY29tcGFyZXRvdGFsICAgODBFLTEgIDcuMCAgICAtPiAxCitkZGNvdDEyNSBjb21wYXJldG90YWwgICAwLjhFKzEgNyAgICAgIC0+IDEKK2RkY290MTI2IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA3ICAgICAgLT4gMQorZGRjb3QxMjcgY29tcGFyZXRvdGFsICAgOC4wICAgIDdFKzAgICAtPiAxCitkZGNvdDEyOCBjb21wYXJldG90YWwgICA4LjAgICAgNzBFLTEgIC0+IDEKK2RkY290MTI5IGNvbXBhcmV0b3RhbCAgIDggICAgICAwLjdFKzEgIC0+IDEKK2RkY290MTMwIGNvbXBhcmV0b3RhbCAgIDggICAgICA3MEUtMSAgLT4gMQorCitkZGNvdDE0MCBjb21wYXJldG90YWwgICA4LjAgICAgOS4wICAgIC0+IC0xCitkZGNvdDE0MSBjb21wYXJldG90YWwgICA4LjAgICAgOSAgICAgIC0+IC0xCitkZGNvdDE0MiBjb21wYXJldG90YWwgICA4ICAgICAgOS4wICAgIC0+IC0xCitkZGNvdDE0MyBjb21wYXJldG90YWwgICA4RSswICAgOS4wICAgIC0+IC0xCitkZGNvdDE0NCBjb21wYXJldG90YWwgICA4MEUtMSAgOS4wICAgIC0+IC0xCitkZGNvdDE0NSBjb21wYXJldG90YWwgICAwLjhFKzEgOSAgICAgIC0+IC0xCitkZGNvdDE0NiBjb21wYXJldG90YWwgICA4MEUtMSAgOSAgICAgIC0+IC0xCitkZGNvdDE0NyBjb21wYXJldG90YWwgICA4LjAgICAgOUUrMCAgIC0+IC0xCitkZGNvdDE0OCBjb21wYXJldG90YWwgICA4LjAgICAgOTBFLTEgIC0+IC0xCitkZGNvdDE0OSBjb21wYXJldG90YWwgICA4ICAgICAgMC45RSsxIC0+IC0xCitkZGNvdDE1MCBjb21wYXJldG90YWwgICA4ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2RkY290MjAwIGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3LjAgICAgLT4gLTEKK2RkY290MjAxIGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3ICAgICAgLT4gLTEKK2RkY290MjAyIGNvbXBhcmV0b3RhbCAgLTcgICAgICA3LjAgICAgLT4gLTEKK2RkY290MjAzIGNvbXBhcmV0b3RhbCAgLTdFKzAgICA3LjAgICAgLT4gLTEKK2RkY290MjA0IGNvbXBhcmV0b3RhbCAgLTcwRS0xICA3LjAgICAgLT4gLTEKK2RkY290MjA1IGNvbXBhcmV0b3RhbCAgLTAuN0UrMSA3ICAgICAgLT4gLTEKK2RkY290MjA2IGNvbXBhcmV0b3RhbCAgLTcwRS0xICA3ICAgICAgLT4gLTEKK2RkY290MjA3IGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3RSswICAgLT4gLTEKK2RkY290MjA4IGNvbXBhcmV0b3RhbCAgLTcuMCAgICA3MEUtMSAgLT4gLTEKK2RkY290MjA5IGNvbXBhcmV0b3RhbCAgLTcgICAgICAwLjdFKzEgLT4gLTEKK2RkY290MjEwIGNvbXBhcmV0b3RhbCAgLTcgICAgICA3MEUtMSAgLT4gLTEKKworZGRjb3QyMjAgY29tcGFyZXRvdGFsICAtOC4wICAgIDcuMCAgICAtPiAtMQorZGRjb3QyMjEgY29tcGFyZXRvdGFsICAtOC4wICAgIDcgICAgICAtPiAtMQorZGRjb3QyMjIgY29tcGFyZXRvdGFsICAtOCAgICAgIDcuMCAgICAtPiAtMQorZGRjb3QyMjMgY29tcGFyZXRvdGFsICAtOEUrMCAgIDcuMCAgICAtPiAtMQorZGRjb3QyMjQgY29tcGFyZXRvdGFsICAtODBFLTEgIDcuMCAgICAtPiAtMQorZGRjb3QyMjUgY29tcGFyZXRvdGFsICAtMC44RSsxIDcgICAgICAtPiAtMQorZGRjb3QyMjYgY29tcGFyZXRvdGFsICAtODBFLTEgIDcgICAgICAtPiAtMQorZGRjb3QyMjcgY29tcGFyZXRvdGFsICAtOC4wICAgIDdFKzAgICAtPiAtMQorZGRjb3QyMjggY29tcGFyZXRvdGFsICAtOC4wICAgIDcwRS0xICAtPiAtMQorZGRjb3QyMjkgY29tcGFyZXRvdGFsICAtOCAgICAgIDAuN0UrMSAtPiAtMQorZGRjb3QyMzAgY29tcGFyZXRvdGFsICAtOCAgICAgIDcwRS0xICAtPiAtMQorCitkZGNvdDI0MCBjb21wYXJldG90YWwgIC04LjAgICAgOS4wICAgIC0+IC0xCitkZGNvdDI0MSBjb21wYXJldG90YWwgIC04LjAgICAgOSAgICAgIC0+IC0xCitkZGNvdDI0MiBjb21wYXJldG90YWwgIC04ICAgICAgOS4wICAgIC0+IC0xCitkZGNvdDI0MyBjb21wYXJldG90YWwgIC04RSswICAgOS4wICAgIC0+IC0xCitkZGNvdDI0NCBjb21wYXJldG90YWwgIC04MEUtMSAgOS4wICAgIC0+IC0xCitkZGNvdDI0NSBjb21wYXJldG90YWwgIC0wLjhFKzEgOSAgICAgIC0+IC0xCitkZGNvdDI0NiBjb21wYXJldG90YWwgIC04MEUtMSAgOSAgICAgIC0+IC0xCitkZGNvdDI0NyBjb21wYXJldG90YWwgIC04LjAgICAgOUUrMCAgIC0+IC0xCitkZGNvdDI0OCBjb21wYXJldG90YWwgIC04LjAgICAgOTBFLTEgIC0+IC0xCitkZGNvdDI0OSBjb21wYXJldG90YWwgIC04ICAgICAgMC45RSsxIC0+IC0xCitkZGNvdDI1MCBjb21wYXJldG90YWwgIC04ICAgICAgOTBFLTEgIC0+IC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2RkY290MzAwIGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNy4wICAgIC0+IDEKK2RkY290MzAxIGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNyAgICAgIC0+IDEKK2RkY290MzAyIGNvbXBhcmV0b3RhbCAgIDcgICAgICAtNy4wICAgIC0+IDEKK2RkY290MzAzIGNvbXBhcmV0b3RhbCAgIDdFKzAgICAtNy4wICAgIC0+IDEKK2RkY290MzA0IGNvbXBhcmV0b3RhbCAgIDcwRS0xICAtNy4wICAgIC0+IDEKK2RkY290MzA1IGNvbXBhcmV0b3RhbCAgIC43RSsxICAtNyAgICAgIC0+IDEKK2RkY290MzA2IGNvbXBhcmV0b3RhbCAgIDcwRS0xICAtNyAgICAgIC0+IDEKK2RkY290MzA3IGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtN0UrMCAgIC0+IDEKK2RkY290MzA4IGNvbXBhcmV0b3RhbCAgIDcuMCAgICAtNzBFLTEgIC0+IDEKK2RkY290MzA5IGNvbXBhcmV0b3RhbCAgIDcgICAgICAtLjdFKzEgIC0+IDEKK2RkY290MzEwIGNvbXBhcmV0b3RhbCAgIDcgICAgICAtNzBFLTEgIC0+IDEKKworZGRjb3QzMjAgY29tcGFyZXRvdGFsICAgOC4wICAgIC03LjAgICAgLT4gMQorZGRjb3QzMjEgY29tcGFyZXRvdGFsICAgOC4wICAgIC03ICAgICAgLT4gMQorZGRjb3QzMjIgY29tcGFyZXRvdGFsICAgOCAgICAgIC03LjAgICAgLT4gMQorZGRjb3QzMjMgY29tcGFyZXRvdGFsICAgOEUrMCAgIC03LjAgICAgLT4gMQorZGRjb3QzMjQgY29tcGFyZXRvdGFsICAgODBFLTEgIC03LjAgICAgLT4gMQorZGRjb3QzMjUgY29tcGFyZXRvdGFsICAgLjhFKzEgIC03ICAgICAgLT4gMQorZGRjb3QzMjYgY29tcGFyZXRvdGFsICAgODBFLTEgIC03ICAgICAgLT4gMQorZGRjb3QzMjcgY29tcGFyZXRvdGFsICAgOC4wICAgIC03RSswICAgLT4gMQorZGRjb3QzMjggY29tcGFyZXRvdGFsICAgOC4wICAgIC03MEUtMSAgLT4gMQorZGRjb3QzMjkgY29tcGFyZXRvdGFsICAgOCAgICAgIC0uN0UrMSAgLT4gMQorZGRjb3QzMzAgY29tcGFyZXRvdGFsICAgOCAgICAgIC03MEUtMSAgLT4gMQorCitkZGNvdDM0MCBjb21wYXJldG90YWwgICA4LjAgICAgLTkuMCAgICAtPiAxCitkZGNvdDM0MSBjb21wYXJldG90YWwgICA4LjAgICAgLTkgICAgICAtPiAxCitkZGNvdDM0MiBjb21wYXJldG90YWwgICA4ICAgICAgLTkuMCAgICAtPiAxCitkZGNvdDM0MyBjb21wYXJldG90YWwgICA4RSswICAgLTkuMCAgICAtPiAxCitkZGNvdDM0NCBjb21wYXJldG90YWwgICA4MEUtMSAgLTkuMCAgICAtPiAxCitkZGNvdDM0NSBjb21wYXJldG90YWwgICAuOEUrMSAgLTkgICAgICAtPiAxCitkZGNvdDM0NiBjb21wYXJldG90YWwgICA4MEUtMSAgLTkgICAgICAtPiAxCitkZGNvdDM0NyBjb21wYXJldG90YWwgICA4LjAgICAgLTlFKzAgICAtPiAxCitkZGNvdDM0OCBjb21wYXJldG90YWwgICA4LjAgICAgLTkwRS0xICAtPiAxCitkZGNvdDM0OSBjb21wYXJldG90YWwgICA4ICAgICAgLS45RSsxICAtPiAxCitkZGNvdDM1MCBjb21wYXJldG90YWwgICA4ICAgICAgLTkwRS0xICAtPiAxCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2RkY290NDAwIGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTcuMCAgICAtPiAwCitkZGNvdDQwMSBjb21wYXJldG90YWwgICAtNy4wICAgIC03ICAgICAgLT4gMQorZGRjb3Q0MDIgY29tcGFyZXRvdGFsICAgLTcgICAgICAtNy4wICAgIC0+IC0xCitkZGNvdDQwMyBjb21wYXJldG90YWwgICAtN0UrMCAgIC03LjAgICAgLT4gLTEKK2RkY290NDA0IGNvbXBhcmV0b3RhbCAgIC03MEUtMSAgLTcuMCAgICAtPiAwCitkZGNvdDQwNSBjb21wYXJldG90YWwgICAtLjdFKzEgIC03ICAgICAgLT4gMAorZGRjb3Q0MDYgY29tcGFyZXRvdGFsICAgLTcwRS0xICAtNyAgICAgIC0+IDEKK2RkY290NDA3IGNvbXBhcmV0b3RhbCAgIC03LjAgICAgLTdFKzAgICAtPiAxCitkZGNvdDQwOCBjb21wYXJldG90YWwgICAtNy4wICAgIC03MEUtMSAgLT4gMAorZGRjb3Q0MDkgY29tcGFyZXRvdGFsICAgLTcgICAgICAtLjdFKzEgIC0+IDAKK2RkY290NDEwIGNvbXBhcmV0b3RhbCAgIC03ICAgICAgLTcwRS0xICAtPiAtMQorCitkZGNvdDQyMCBjb21wYXJldG90YWwgICAtOC4wICAgIC03LjAgICAgLT4gLTEKK2RkY290NDIxIGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTcgICAgICAtPiAtMQorZGRjb3Q0MjIgY29tcGFyZXRvdGFsICAgLTggICAgICAtNy4wICAgIC0+IC0xCitkZGNvdDQyMyBjb21wYXJldG90YWwgICAtOEUrMCAgIC03LjAgICAgLT4gLTEKK2RkY290NDI0IGNvbXBhcmV0b3RhbCAgIC04MEUtMSAgLTcuMCAgICAtPiAtMQorZGRjb3Q0MjUgY29tcGFyZXRvdGFsICAgLS44RSsxICAtNyAgICAgIC0+IC0xCitkZGNvdDQyNiBjb21wYXJldG90YWwgICAtODBFLTEgIC03ICAgICAgLT4gLTEKK2RkY290NDI3IGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTdFKzAgICAtPiAtMQorZGRjb3Q0MjggY29tcGFyZXRvdGFsICAgLTguMCAgICAtNzBFLTEgIC0+IC0xCitkZGNvdDQyOSBjb21wYXJldG90YWwgICAtOCAgICAgIC0uN0UrMSAgLT4gLTEKK2RkY290NDMwIGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLTcwRS0xICAtPiAtMQorCitkZGNvdDQ0MCBjb21wYXJldG90YWwgICAtOC4wICAgIC05LjAgICAgLT4gMQorZGRjb3Q0NDEgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOSAgICAgIC0+IDEKK2RkY290NDQyIGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLTkuMCAgICAtPiAxCitkZGNvdDQ0MyBjb21wYXJldG90YWwgICAtOEUrMCAgIC05LjAgICAgLT4gMQorZGRjb3Q0NDQgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtOS4wICAgIC0+IDEKK2RkY290NDQ1IGNvbXBhcmV0b3RhbCAgIC0uOEUrMSAgLTkgICAgICAtPiAxCitkZGNvdDQ0NiBjb21wYXJldG90YWwgICAtODBFLTEgIC05ICAgICAgLT4gMQorZGRjb3Q0NDcgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOUUrMCAgIC0+IDEKK2RkY290NDQ4IGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTkwRS0xICAtPiAxCitkZGNvdDQ0OSBjb21wYXJldG90YWwgICAtOCAgICAgIC0uOUUrMSAgLT4gMQorZGRjb3Q0NTAgY29tcGFyZXRvdGFsICAgLTggICAgICAtOTBFLTEgIC0+IDEKKworCistLSB0ZXN0Y2FzZXMgdGhhdCBzdWJ0cmFjdCB0byBsb3RzIG9mIHplcm9zIGF0IGJvdW5kYXJpZXMgW3Bncl0KK2RkY290NDczIGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RkY290NDc0IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAtMQorZGRjb3Q0NzUgY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RkY290NDc2IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RkY290NDc3IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwRS04OSAxMjMuNDU2RS04OSAtPiAtMQorZGRjb3Q0NzggY29tcGFyZXRvdGFsIDEyMy40NTYwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RkY290NDc5IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RkY290NDgwIGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwRSs4OSAxMjMuNDU2RSs4OSAtPiAtMQorZGRjb3Q0ODEgY29tcGFyZXRvdGFsIDEyMy40NTYwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RkY290NDgyIGNvbXBhcmV0b3RhbCAxMjMuNDU2MEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RkY290NDgzIGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2RS04OSAtPiAwCitkZGNvdDQ4NyBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwMDBFKzg5IC0+IDEKK2RkY290NDg4IGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDAwMDAwRS04OSAtPiAxCitkZGNvdDQ4OSBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwRSs4OSAtPiAxCitkZGNvdDQ5MCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDBFLTg5IC0+IDEKK2RkY290NDkxIGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwRSs4OSAtPiAxCitkZGNvdDQ5MiBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwRS04OSAtPiAxCitkZGNvdDQ5MyBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDBFKzg5IC0+IDEKK2RkY290NDk0IGNvbXBhcmV0b3RhbCAxMjMuNDU2RS04OSAxMjMuNDU2MDAwRS04OSAtPiAxCitkZGNvdDQ5NSBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwRSs4OSAtPiAxCitkZGNvdDQ5NiBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjBFLTg5IC0+IDEKK2RkY290NDk3IGNvbXBhcmV0b3RhbCAxMjMuNDU2RSs4OSAxMjMuNDU2RSs4OSAtPiAwCisKKy0tIHdpZGUtcmFuZ2luZywgYXJvdW5kIHByZWNpc2lvbjsgc2lnbnMgZXF1YWwKK2RkY290NDk4IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNyAgICAtPiAxCitkZGNvdDQ5OSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTYgICAgLT4gMQorZGRjb3Q1MDAgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTE1ICAgIC0+IDEKK2RkY290NTAxIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNCAgICAtPiAxCitkZGNvdDUwMiBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTMgICAgLT4gMQorZGRjb3Q1MDMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEyICAgIC0+IDEKK2RkY290NTA0IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMSAgICAtPiAxCitkZGNvdDUwNSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTAgICAgLT4gMQorZGRjb3Q1MDYgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTkgICAgIC0+IDEKK2RkY290NTA3IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS04ICAgICAtPiAxCitkZGNvdDUwOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtNyAgICAgLT4gMQorZGRjb3Q1MDkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTYgICAgIC0+IDEKK2RkY290NTEwIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS01ICAgICAtPiAxCitkZGNvdDUxMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtNCAgICAgLT4gMQorZGRjb3Q1MTIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTMgICAgIC0+IDEKK2RkY290NTEzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0yICAgICAtPiAxCitkZGNvdDUxNCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMSAgICAgLT4gMQorZGRjb3Q1MTUgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTAgICAgIC0+IDAKK2RkY290NTE2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxICAgICAtPiAtMQorZGRjb3Q1MTcgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzIgICAgIC0+IC0xCitkZGNvdDUxOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMyAgICAgLT4gLTEKK2RkY290NTE5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs0ICAgICAtPiAtMQorZGRjb3Q1MjEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzUgICAgIC0+IC0xCitkZGNvdDUyMiBjb21wYXJldG90YWwgICAgMSAgICAgMUUrNiAgICAgLT4gLTEKK2RkY290NTIzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs3ICAgICAtPiAtMQorZGRjb3Q1MjQgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzggICAgIC0+IC0xCitkZGNvdDUyNSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrOSAgICAgLT4gLTEKK2RkY290NTI2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMCAgICAtPiAtMQorZGRjb3Q1MjcgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzExICAgIC0+IC0xCitkZGNvdDUyOCBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTIgICAgLT4gLTEKK2RkY290NTI5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMyAgICAtPiAtMQorZGRjb3Q1MzAgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzE0ICAgIC0+IC0xCitkZGNvdDUzMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTUgICAgLT4gLTEKK2RkY290NTMyIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxNiAgICAtPiAtMQorZGRjb3Q1MzMgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzE3ICAgIC0+IC0xCistLSBMUiBzd2FwCitkZGNvdDUzOCBjb21wYXJldG90YWwgICAgMUUtMTcgIDEgICAgICAgLT4gLTEKK2RkY290NTM5IGNvbXBhcmV0b3RhbCAgICAxRS0xNiAgMSAgICAgICAtPiAtMQorZGRjb3Q1NDAgY29tcGFyZXRvdGFsICAgIDFFLTE1ICAxICAgICAgIC0+IC0xCitkZGNvdDU0MSBjb21wYXJldG90YWwgICAgMUUtMTQgIDEgICAgICAgLT4gLTEKK2RkY290NTQyIGNvbXBhcmV0b3RhbCAgICAxRS0xMyAgMSAgICAgICAtPiAtMQorZGRjb3Q1NDMgY29tcGFyZXRvdGFsICAgIDFFLTEyICAxICAgICAgIC0+IC0xCitkZGNvdDU0NCBjb21wYXJldG90YWwgICAgMUUtMTEgIDEgICAgICAgLT4gLTEKK2RkY290NTQ1IGNvbXBhcmV0b3RhbCAgICAxRS0xMCAgMSAgICAgICAtPiAtMQorZGRjb3Q1NDYgY29tcGFyZXRvdGFsICAgIDFFLTkgICAxICAgICAgIC0+IC0xCitkZGNvdDU0NyBjb21wYXJldG90YWwgICAgMUUtOCAgIDEgICAgICAgLT4gLTEKK2RkY290NTQ4IGNvbXBhcmV0b3RhbCAgICAxRS03ICAgMSAgICAgICAtPiAtMQorZGRjb3Q1NDkgY29tcGFyZXRvdGFsICAgIDFFLTYgICAxICAgICAgIC0+IC0xCitkZGNvdDU1MCBjb21wYXJldG90YWwgICAgMUUtNSAgIDEgICAgICAgLT4gLTEKK2RkY290NTUxIGNvbXBhcmV0b3RhbCAgICAxRS00ICAgMSAgICAgICAtPiAtMQorZGRjb3Q1NTIgY29tcGFyZXRvdGFsICAgIDFFLTMgICAxICAgICAgIC0+IC0xCitkZGNvdDU1MyBjb21wYXJldG90YWwgICAgMUUtMiAgIDEgICAgICAgLT4gLTEKK2RkY290NTU0IGNvbXBhcmV0b3RhbCAgICAxRS0xICAgMSAgICAgICAtPiAtMQorZGRjb3Q1NTUgY29tcGFyZXRvdGFsICAgIDFFLTAgICAxICAgICAgIC0+ICAwCitkZGNvdDU1NiBjb21wYXJldG90YWwgICAgMUUrMSAgIDEgICAgICAgLT4gIDEKK2RkY290NTU3IGNvbXBhcmV0b3RhbCAgICAxRSsyICAgMSAgICAgICAtPiAgMQorZGRjb3Q1NTggY29tcGFyZXRvdGFsICAgIDFFKzMgICAxICAgICAgIC0+ICAxCitkZGNvdDU1OSBjb21wYXJldG90YWwgICAgMUUrNCAgIDEgICAgICAgLT4gIDEKK2RkY290NTYxIGNvbXBhcmV0b3RhbCAgICAxRSs1ICAgMSAgICAgICAtPiAgMQorZGRjb3Q1NjIgY29tcGFyZXRvdGFsICAgIDFFKzYgICAxICAgICAgIC0+ICAxCitkZGNvdDU2MyBjb21wYXJldG90YWwgICAgMUUrNyAgIDEgICAgICAgLT4gIDEKK2RkY290NTY0IGNvbXBhcmV0b3RhbCAgICAxRSs4ICAgMSAgICAgICAtPiAgMQorZGRjb3Q1NjUgY29tcGFyZXRvdGFsICAgIDFFKzkgICAxICAgICAgIC0+ICAxCitkZGNvdDU2NiBjb21wYXJldG90YWwgICAgMUUrMTAgIDEgICAgICAgLT4gIDEKK2RkY290NTY3IGNvbXBhcmV0b3RhbCAgICAxRSsxMSAgMSAgICAgICAtPiAgMQorZGRjb3Q1NjggY29tcGFyZXRvdGFsICAgIDFFKzEyICAxICAgICAgIC0+ICAxCitkZGNvdDU2OSBjb21wYXJldG90YWwgICAgMUUrMTMgIDEgICAgICAgLT4gIDEKK2RkY290NTcwIGNvbXBhcmV0b3RhbCAgICAxRSsxNCAgMSAgICAgICAtPiAgMQorZGRjb3Q1NzEgY29tcGFyZXRvdGFsICAgIDFFKzE1ICAxICAgICAgIC0+ICAxCitkZGNvdDU3MiBjb21wYXJldG90YWwgICAgMUUrMTYgIDEgICAgICAgLT4gIDEKK2RkY290NTczIGNvbXBhcmV0b3RhbCAgICAxRSsxNyAgMSAgICAgICAtPiAgMQorLS0gc2ltaWxhciB3aXRoIGEgdXNlZnVsIGNvZWZmaWNpZW50LCBvbmUgc2lkZSBvbmx5CitkZGNvdDU3OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNyAgICAtPiAxCitkZGNvdDU3OSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNiAgICAtPiAxCitkZGNvdDU4MCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNSAgICAtPiAxCitkZGNvdDU4MSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNCAgICAtPiAxCitkZGNvdDU4MiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAtPiAxCitkZGNvdDU4MyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMiAgICAtPiAxCitkZGNvdDU4NCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMSAgICAtPiAxCitkZGNvdDU4NSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAtPiAxCitkZGNvdDU4NiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS05ICAgICAtPiAxCitkZGNvdDU4NyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS04ICAgICAtPiAxCitkZGNvdDU4OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAtPiAxCitkZGNvdDU4OSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS02ICAgICAtPiAtMQorZGRjb3Q1OTAgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNSAgICAgLT4gLTEKK2RkY290NTkxIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTQgICAgIC0+IC0xCitkZGNvdDU5MiBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0zICAgICAtPiAtMQorZGRjb3Q1OTMgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMiAgICAgLT4gLTEKK2RkY290NTk0IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEgICAgIC0+IC0xCitkZGNvdDU5NSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0wICAgICAtPiAtMQorZGRjb3Q1OTYgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMSAgICAgLT4gLTEKK2RkY290NTk3IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzIgICAgIC0+IC0xCitkZGNvdDU5OCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSszICAgICAtPiAtMQorZGRjb3Q1OTkgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrNCAgICAgLT4gLTEKKworLS0gY2hlY2sgc29tZSB1bml0LXkgdHJhcHMKK2RkY290NjAwIGNvbXBhcmV0b3RhbCAgIDEyICAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb3Q2MDEgY29tcGFyZXRvdGFsICAgMTIuMCAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvdDYwMiBjb21wYXJldG90YWwgICAxMi4wMCAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY290NjAzIGNvbXBhcmV0b3RhbCAgIDEyLjAwMCAgICAgICAgMTIuMjM0NSAtPiAtMQorZGRjb3Q2MDQgY29tcGFyZXRvdGFsICAgMTIuMDAwMCAgICAgICAxMi4yMzQ1IC0+IC0xCitkZGNvdDYwNSBjb21wYXJldG90YWwgICAxMi4wMDAwMCAgICAgIDEyLjIzNDUgLT4gLTEKK2RkY290NjA2IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMCAgICAgMTIuMjM0NSAtPiAtMQorZGRjb3Q2MDcgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMCAgICAxMi4yMzQ1IC0+IC0xCitkZGNvdDYwOCBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMCAgIDEyLjIzNDUgLT4gLTEKK2RkY290NjA5IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwMCAgMTIuMjM0NSAtPiAtMQorZGRjb3Q2MTAgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMiAgICAgICAgICAgIC0+ICAxCitkZGNvdDYxMSBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAgICAgICAgICAgLT4gIDEKK2RkY290NjEyIGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAgICAgICAgICAtPiAgMQorZGRjb3Q2MTMgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAgICAgICAgIC0+ICAxCitkZGNvdDYxNCBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAgICAgICAgLT4gIDEKK2RkY290NjE1IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAgICAgICAtPiAgMQorZGRjb3Q2MTYgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAgICAgIC0+ICAxCitkZGNvdDYxNyBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMDAgICAgLT4gIDEKK2RkY290NjE4IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAwMDAgICAtPiAgMQorZGRjb3Q2MTkgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAwMDAgIC0+ICAxCitkZGNvdDYyMCBjb21wYXJldG90YWwgIC0xMiAgICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY290NjIxIGNvbXBhcmV0b3RhbCAgLTEyLjAgICAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb3Q2MjIgY29tcGFyZXRvdGFsICAtMTIuMDAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvdDYyMyBjb21wYXJldG90YWwgIC0xMi4wMDAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY290NjI0IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAgICAgICAtMTIuMjM0NSAtPiAgMQorZGRjb3Q2MjUgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAgICAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvdDYyNiBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAgICAgLTEyLjIzNDUgLT4gIDEKK2RkY290NjI3IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMDAgICAtMTIuMjM0NSAtPiAgMQorZGRjb3Q2MjggY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwMDAgIC0xMi4yMzQ1IC0+ICAxCitkZGNvdDYyOSBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAwMDAgLTEyLjIzNDUgLT4gIDEKK2RkY290NjMwIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyICAgICAgICAgICAtPiAtMQorZGRjb3Q2MzEgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMCAgICAgICAgIC0+IC0xCitkZGNvdDYzMiBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMCAgICAgICAgLT4gLTEKK2RkY290NjMzIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMCAgICAgICAtPiAtMQorZGRjb3Q2MzQgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMCAgICAgIC0+IC0xCitkZGNvdDYzNSBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMCAgICAgLT4gLTEKK2RkY290NjM2IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMCAgICAtPiAtMQorZGRjb3Q2MzcgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAwMCAgIC0+IC0xCitkZGNvdDYzOCBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMCAgLT4gLTEKK2RkY290NjM5IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwMCAtPiAtMQorCistLSBleHRlbmRlZCB6ZXJvcworZGRjb3Q2NDAgY29tcGFyZXRvdGFsICAgMCAgICAgMCAgIC0+IDAKK2RkY290NjQxIGNvbXBhcmV0b3RhbCAgIDAgICAgLTAgICAtPiAxCitkZGNvdDY0MiBjb21wYXJldG90YWwgICAwICAgIC0wLjAgLT4gMQorZGRjb3Q2NDMgY29tcGFyZXRvdGFsICAgMCAgICAgMC4wIC0+IDEKK2RkY290NjQ0IGNvbXBhcmV0b3RhbCAgLTAgICAgIDAgICAtPiAtMQorZGRjb3Q2NDUgY29tcGFyZXRvdGFsICAtMCAgICAtMCAgIC0+IDAKK2RkY290NjQ2IGNvbXBhcmV0b3RhbCAgLTAgICAgLTAuMCAtPiAtMQorZGRjb3Q2NDcgY29tcGFyZXRvdGFsICAtMCAgICAgMC4wIC0+IC0xCitkZGNvdDY0OCBjb21wYXJldG90YWwgICAwLjAgICAwICAgLT4gLTEKK2RkY290NjQ5IGNvbXBhcmV0b3RhbCAgIDAuMCAgLTAgICAtPiAxCitkZGNvdDY1MCBjb21wYXJldG90YWwgICAwLjAgIC0wLjAgLT4gMQorZGRjb3Q2NTEgY29tcGFyZXRvdGFsICAgMC4wICAgMC4wIC0+IDAKK2RkY290NjUyIGNvbXBhcmV0b3RhbCAgLTAuMCAgIDAgICAtPiAtMQorZGRjb3Q2NTMgY29tcGFyZXRvdGFsICAtMC4wICAtMCAgIC0+IDEKK2RkY290NjU0IGNvbXBhcmV0b3RhbCAgLTAuMCAgLTAuMCAtPiAwCitkZGNvdDY1NSBjb21wYXJldG90YWwgIC0wLjAgICAwLjAgLT4gLTEKKworZGRjb3Q2NTYgY29tcGFyZXRvdGFsICAtMEUxICAgMC4wIC0+IC0xCitkZGNvdDY1NyBjb21wYXJldG90YWwgIC0wRTIgICAwLjAgLT4gLTEKK2RkY290NjU4IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDAuMCAtPiAxCitkZGNvdDY1OSBjb21wYXJldG90YWwgICAwRTIgICAwLjAgLT4gMQorZGRjb3Q2NjAgY29tcGFyZXRvdGFsICAtMEUxICAgMCAgIC0+IC0xCitkZGNvdDY2MSBjb21wYXJldG90YWwgIC0wRTIgICAwICAgLT4gLTEKK2RkY290NjYyIGNvbXBhcmV0b3RhbCAgIDBFMSAgIDAgICAtPiAxCitkZGNvdDY2MyBjb21wYXJldG90YWwgICAwRTIgICAwICAgLT4gMQorZGRjb3Q2NjQgY29tcGFyZXRvdGFsICAtMEUxICAtMEUxIC0+IDAKK2RkY290NjY1IGNvbXBhcmV0b3RhbCAgLTBFMiAgLTBFMSAtPiAtMQorZGRjb3Q2NjYgY29tcGFyZXRvdGFsICAgMEUxICAtMEUxIC0+IDEKK2RkY290NjY3IGNvbXBhcmV0b3RhbCAgIDBFMiAgLTBFMSAtPiAxCitkZGNvdDY2OCBjb21wYXJldG90YWwgIC0wRTEgIC0wRTIgLT4gMQorZGRjb3Q2NjkgY29tcGFyZXRvdGFsICAtMEUyICAtMEUyIC0+IDAKK2RkY290NjcwIGNvbXBhcmV0b3RhbCAgIDBFMSAgLTBFMiAtPiAxCitkZGNvdDY3MSBjb21wYXJldG90YWwgICAwRTIgIC0wRTIgLT4gMQorZGRjb3Q2NzIgY29tcGFyZXRvdGFsICAtMEUxICAgMEUxIC0+IC0xCitkZGNvdDY3MyBjb21wYXJldG90YWwgIC0wRTIgICAwRTEgLT4gLTEKK2RkY290Njc0IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDBFMSAtPiAwCitkZGNvdDY3NSBjb21wYXJldG90YWwgICAwRTIgICAwRTEgLT4gMQorZGRjb3Q2NzYgY29tcGFyZXRvdGFsICAtMEUxICAgMEUyIC0+IC0xCitkZGNvdDY3NyBjb21wYXJldG90YWwgIC0wRTIgICAwRTIgLT4gLTEKK2RkY290Njc4IGNvbXBhcmV0b3RhbCAgIDBFMSAgIDBFMiAtPiAtMQorZGRjb3Q2NzkgY29tcGFyZXRvdGFsICAgMEUyICAgMEUyIC0+IDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorZGRjb3Q2ODAgY29tcGFyZXRvdGFsICAgMTIgICAgMTIgICAgICAgICAgIC0+IDAKK2RkY290NjgxIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAgICAgICAgICAtPiAxCitkZGNvdDY4MiBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMCAgICAgICAgLT4gMQorZGRjb3Q2ODMgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwICAgICAgIC0+IDEKK2RkY290Njg0IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAgICAgICAtPiAxCitkZGNvdDY4NSBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwMCAgICAgLT4gMQorZGRjb3Q2ODYgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwICAgIC0+IDEKK2RkY290Njg3IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMDAgICAtPiAxCitkZGNvdDY4OCBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwMDAwMCAgLT4gMQorZGRjb3Q2ODkgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwMDAwIC0+IDEKK2RkY290NjkwIGNvbXBhcmV0b3RhbCAgIDEyICAgICAgICAgICAgICAxMiAtPiAwCitkZGNvdDY5MSBjb21wYXJldG90YWwgICAxMi4wICAgICAgICAgICAgMTIgLT4gLTEKK2RkY290NjkyIGNvbXBhcmV0b3RhbCAgIDEyLjAwICAgICAgICAgICAxMiAtPiAtMQorZGRjb3Q2OTMgY29tcGFyZXRvdGFsICAgMTIuMDAwICAgICAgICAgIDEyIC0+IC0xCitkZGNvdDY5NCBjb21wYXJldG90YWwgICAxMi4wMDAwICAgICAgICAgMTIgLT4gLTEKK2RkY290Njk1IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwICAgICAgICAxMiAtPiAtMQorZGRjb3Q2OTYgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwICAgICAgIDEyIC0+IC0xCitkZGNvdDY5NyBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwICAgICAgMTIgLT4gLTEKK2RkY290Njk4IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwICAgICAxMiAtPiAtMQorZGRjb3Q2OTkgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMDAwICAgIDEyIC0+IC0xCisKKy0tIG9sZCBsb25nIG9wZXJhbmQgY2hlY2tzCitkZGNvdDcwMSBjb21wYXJldG90YWwgMTIzNDU2NzgwMDAgIDEgLT4gIDEKK2RkY290NzAyIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4MDAwICAtPiAtMQorZGRjb3Q3MDMgY29tcGFyZXRvdGFsIDEyMzQ1Njc4MDAgICAxIC0+ICAxCitkZGNvdDcwNCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODAwICAgLT4gLTEKK2RkY290NzA1IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkwICAgMSAtPiAgMQorZGRjb3Q3MDYgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MCAgIC0+IC0xCitkZGNvdDcwNyBjb21wYXJldG90YWwgMTIzNDU2Nzg5MSAgIDEgLT4gIDEKK2RkY290NzA4IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTEgICAtPiAtMQorZGRjb3Q3MDkgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTAxICAxIC0+ICAxCitkZGNvdDcxMCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkwMSAgLT4gLTEKK2RkY290NzExIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODk2ICAgMSAtPiAgMQorZGRjb3Q3MTIgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5NiAgIC0+IC0xCitkZGNvdDcxMyBjb21wYXJldG90YWwgLTEyMzQ1Njc4OTEgIDEgLT4gLTEKK2RkY290NzE0IGNvbXBhcmV0b3RhbCAxIC0xMjM0NTY3ODkxICAtPiAgMQorZGRjb3Q3MTUgY29tcGFyZXRvdGFsIC0xMjM0NTY3ODkwMSAxIC0+IC0xCitkZGNvdDcxNiBjb21wYXJldG90YWwgMSAtMTIzNDU2Nzg5MDEgLT4gIDEKK2RkY290NzE3IGNvbXBhcmV0b3RhbCAtMTIzNDU2Nzg5NiAgMSAtPiAtMQorZGRjb3Q3MTggY29tcGFyZXRvdGFsIDEgLTEyMzQ1Njc4OTYgIC0+ICAxCisKKy0tIG9sZCByZXNpZHVlIGNhc2VzCitkZGNvdDc0MCBjb21wYXJldG90YWwgIDEgIDAuOTk5OTk5OSAgLT4gMQorZGRjb3Q3NDEgY29tcGFyZXRvdGFsICAxICAwLjk5OTk5OSAgIC0+IDEKK2RkY290NzQyIGNvbXBhcmV0b3RhbCAgMSAgMC45OTk5OSAgICAtPiAxCitkZGNvdDc0MyBjb21wYXJldG90YWwgIDEgIDEuMDAwMCAgICAgLT4gMQorZGRjb3Q3NDQgY29tcGFyZXRvdGFsICAxICAxLjAwMDAxICAgIC0+IC0xCitkZGNvdDc0NSBjb21wYXJldG90YWwgIDEgIDEuMDAwMDAxICAgLT4gLTEKK2RkY290NzQ2IGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwMDAxICAtPiAtMQorZGRjb3Q3NTAgY29tcGFyZXRvdGFsICAwLjk5OTk5OTkgIDEgIC0+IC0xCitkZGNvdDc1MSBjb21wYXJldG90YWwgIDAuOTk5OTk5ICAgMSAgLT4gLTEKK2RkY290NzUyIGNvbXBhcmV0b3RhbCAgMC45OTk5OSAgICAxICAtPiAtMQorZGRjb3Q3NTMgY29tcGFyZXRvdGFsICAxLjAwMDAgICAgIDEgIC0+IC0xCitkZGNvdDc1NCBjb21wYXJldG90YWwgIDEuMDAwMDEgICAgMSAgLT4gMQorZGRjb3Q3NTUgY29tcGFyZXRvdGFsICAxLjAwMDAwMSAgIDEgIC0+IDEKK2RkY290NzU2IGNvbXBhcmV0b3RhbCAgMS4wMDAwMDAxICAxICAtPiAxCisKKy0tIFNwZWNpYWxzCitkZGNvdDc4MCBjb21wYXJldG90YWwgIEluZiAgLUluZiAgIC0+ICAxCitkZGNvdDc4MSBjb21wYXJldG90YWwgIEluZiAgLTEwMDAgIC0+ICAxCitkZGNvdDc4MiBjb21wYXJldG90YWwgIEluZiAgLTEgICAgIC0+ICAxCitkZGNvdDc4MyBjb21wYXJldG90YWwgIEluZiAgLTAgICAgIC0+ICAxCitkZGNvdDc4NCBjb21wYXJldG90YWwgIEluZiAgIDAgICAgIC0+ICAxCitkZGNvdDc4NSBjb21wYXJldG90YWwgIEluZiAgIDEgICAgIC0+ICAxCitkZGNvdDc4NiBjb21wYXJldG90YWwgIEluZiAgIDEwMDAgIC0+ICAxCitkZGNvdDc4NyBjb21wYXJldG90YWwgIEluZiAgIEluZiAgIC0+ICAwCitkZGNvdDc4OCBjb21wYXJldG90YWwgLTEwMDAgIEluZiAgIC0+IC0xCitkZGNvdDc4OSBjb21wYXJldG90YWwgLUluZiAgIEluZiAgIC0+IC0xCitkZGNvdDc5MCBjb21wYXJldG90YWwgLTEgICAgIEluZiAgIC0+IC0xCitkZGNvdDc5MSBjb21wYXJldG90YWwgLTAgICAgIEluZiAgIC0+IC0xCitkZGNvdDc5MiBjb21wYXJldG90YWwgIDAgICAgIEluZiAgIC0+IC0xCitkZGNvdDc5MyBjb21wYXJldG90YWwgIDEgICAgIEluZiAgIC0+IC0xCitkZGNvdDc5NCBjb21wYXJldG90YWwgIDEwMDAgIEluZiAgIC0+IC0xCitkZGNvdDc5NSBjb21wYXJldG90YWwgIEluZiAgIEluZiAgIC0+ICAwCisKK2RkY290ODAwIGNvbXBhcmV0b3RhbCAtSW5mICAtSW5mICAgLT4gIDAKK2RkY290ODAxIGNvbXBhcmV0b3RhbCAtSW5mICAtMTAwMCAgLT4gLTEKK2RkY290ODAyIGNvbXBhcmV0b3RhbCAtSW5mICAtMSAgICAgLT4gLTEKK2RkY290ODAzIGNvbXBhcmV0b3RhbCAtSW5mICAtMCAgICAgLT4gLTEKK2RkY290ODA0IGNvbXBhcmV0b3RhbCAtSW5mICAgMCAgICAgLT4gLTEKK2RkY290ODA1IGNvbXBhcmV0b3RhbCAtSW5mICAgMSAgICAgLT4gLTEKK2RkY290ODA2IGNvbXBhcmV0b3RhbCAtSW5mICAgMTAwMCAgLT4gLTEKK2RkY290ODA3IGNvbXBhcmV0b3RhbCAtSW5mICAgSW5mICAgLT4gLTEKK2RkY290ODA4IGNvbXBhcmV0b3RhbCAtSW5mICAtSW5mICAgLT4gIDAKK2RkY290ODA5IGNvbXBhcmV0b3RhbCAtMTAwMCAtSW5mICAgLT4gIDEKK2RkY290ODEwIGNvbXBhcmV0b3RhbCAtMSAgICAtSW5mICAgLT4gIDEKK2RkY290ODExIGNvbXBhcmV0b3RhbCAtMCAgICAtSW5mICAgLT4gIDEKK2RkY290ODEyIGNvbXBhcmV0b3RhbCAgMCAgICAtSW5mICAgLT4gIDEKK2RkY290ODEzIGNvbXBhcmV0b3RhbCAgMSAgICAtSW5mICAgLT4gIDEKK2RkY290ODE0IGNvbXBhcmV0b3RhbCAgMTAwMCAtSW5mICAgLT4gIDEKK2RkY290ODE1IGNvbXBhcmV0b3RhbCAgSW5mICAtSW5mICAgLT4gIDEKKworZGRjb3Q4MjEgY29tcGFyZXRvdGFsICBOYU4gLUluZiAgICAtPiAgMQorZGRjb3Q4MjIgY29tcGFyZXRvdGFsICBOYU4gLTEwMDAgICAtPiAgMQorZGRjb3Q4MjMgY29tcGFyZXRvdGFsICBOYU4gLTEgICAgICAtPiAgMQorZGRjb3Q4MjQgY29tcGFyZXRvdGFsICBOYU4gLTAgICAgICAtPiAgMQorZGRjb3Q4MjUgY29tcGFyZXRvdGFsICBOYU4gIDAgICAgICAtPiAgMQorZGRjb3Q4MjYgY29tcGFyZXRvdGFsICBOYU4gIDEgICAgICAtPiAgMQorZGRjb3Q4MjcgY29tcGFyZXRvdGFsICBOYU4gIDEwMDAgICAtPiAgMQorZGRjb3Q4MjggY29tcGFyZXRvdGFsICBOYU4gIEluZiAgICAtPiAgMQorZGRjb3Q4MjkgY29tcGFyZXRvdGFsICBOYU4gIE5hTiAgICAtPiAgMAorZGRjb3Q4MzAgY29tcGFyZXRvdGFsIC1JbmYgIE5hTiAgICAtPiAgLTEKK2RkY290ODMxIGNvbXBhcmV0b3RhbCAtMTAwMCBOYU4gICAgLT4gIC0xCitkZGNvdDgzMiBjb21wYXJldG90YWwgLTEgICAgTmFOICAgIC0+ICAtMQorZGRjb3Q4MzMgY29tcGFyZXRvdGFsIC0wICAgIE5hTiAgICAtPiAgLTEKK2RkY290ODM0IGNvbXBhcmV0b3RhbCAgMCAgICBOYU4gICAgLT4gIC0xCitkZGNvdDgzNSBjb21wYXJldG90YWwgIDEgICAgTmFOICAgIC0+ICAtMQorZGRjb3Q4MzYgY29tcGFyZXRvdGFsICAxMDAwIE5hTiAgICAtPiAgLTEKK2RkY290ODM3IGNvbXBhcmV0b3RhbCAgSW5mICBOYU4gICAgLT4gIC0xCitkZGNvdDgzOCBjb21wYXJldG90YWwgLU5hTiAtTmFOICAgIC0+ICAwCitkZGNvdDgzOSBjb21wYXJldG90YWwgK05hTiAtTmFOICAgIC0+ICAxCitkZGNvdDg0MCBjb21wYXJldG90YWwgLU5hTiArTmFOICAgIC0+ICAtMQorCitkZGNvdDg0MSBjb21wYXJldG90YWwgIHNOYU4gLXNOYU4gIC0+ICAxCitkZGNvdDg0MiBjb21wYXJldG90YWwgIHNOYU4gLU5hTiAgIC0+ICAxCitkZGNvdDg0MyBjb21wYXJldG90YWwgIHNOYU4gLUluZiAgIC0+ICAxCitkZGNvdDg0NCBjb21wYXJldG90YWwgIHNOYU4gLTEwMDAgIC0+ICAxCitkZGNvdDg0NSBjb21wYXJldG90YWwgIHNOYU4gLTEgICAgIC0+ICAxCitkZGNvdDg0NiBjb21wYXJldG90YWwgIHNOYU4gLTAgICAgIC0+ICAxCitkZGNvdDg0NyBjb21wYXJldG90YWwgIHNOYU4gIDAgICAgIC0+ICAxCitkZGNvdDg0OCBjb21wYXJldG90YWwgIHNOYU4gIDEgICAgIC0+ICAxCitkZGNvdDg0OSBjb21wYXJldG90YWwgIHNOYU4gIDEwMDAgIC0+ICAxCitkZGNvdDg1MCBjb21wYXJldG90YWwgIHNOYU4gIE5hTiAgIC0+ICAtMQorZGRjb3Q4NTEgY29tcGFyZXRvdGFsICBzTmFOIHNOYU4gICAtPiAgMAorCitkZGNvdDg1MiBjb21wYXJldG90YWwgLXNOYU4gc05hTiAgIC0+ICAtMQorZGRjb3Q4NTMgY29tcGFyZXRvdGFsIC1OYU4gIHNOYU4gICAtPiAgLTEKK2RkY290ODU0IGNvbXBhcmV0b3RhbCAtSW5mICBzTmFOICAgLT4gIC0xCitkZGNvdDg1NSBjb21wYXJldG90YWwgLTEwMDAgc05hTiAgIC0+ICAtMQorZGRjb3Q4NTYgY29tcGFyZXRvdGFsIC0xICAgIHNOYU4gICAtPiAgLTEKK2RkY290ODU3IGNvbXBhcmV0b3RhbCAtMCAgICBzTmFOICAgLT4gIC0xCitkZGNvdDg1OCBjb21wYXJldG90YWwgIDAgICAgc05hTiAgIC0+ICAtMQorZGRjb3Q4NTkgY29tcGFyZXRvdGFsICAxICAgIHNOYU4gICAtPiAgLTEKK2RkY290ODYwIGNvbXBhcmV0b3RhbCAgMTAwMCBzTmFOICAgLT4gIC0xCitkZGNvdDg2MSBjb21wYXJldG90YWwgIEluZiAgc05hTiAgIC0+ICAtMQorZGRjb3Q4NjIgY29tcGFyZXRvdGFsICBOYU4gIHNOYU4gICAtPiAgMQorZGRjb3Q4NjMgY29tcGFyZXRvdGFsICBzTmFOIHNOYU4gICAtPiAgMAorCitkZGNvdDg3MSBjb21wYXJldG90YWwgIC1zTmFOIC1zTmFOICAtPiAgMAorZGRjb3Q4NzIgY29tcGFyZXRvdGFsICAtc05hTiAtTmFOICAgLT4gIDEKK2RkY290ODczIGNvbXBhcmV0b3RhbCAgLXNOYU4gLUluZiAgIC0+ICAtMQorZGRjb3Q4NzQgY29tcGFyZXRvdGFsICAtc05hTiAtMTAwMCAgLT4gIC0xCitkZGNvdDg3NSBjb21wYXJldG90YWwgIC1zTmFOIC0xICAgICAtPiAgLTEKK2RkY290ODc2IGNvbXBhcmV0b3RhbCAgLXNOYU4gLTAgICAgIC0+ICAtMQorZGRjb3Q4NzcgY29tcGFyZXRvdGFsICAtc05hTiAgMCAgICAgLT4gIC0xCitkZGNvdDg3OCBjb21wYXJldG90YWwgIC1zTmFOICAxICAgICAtPiAgLTEKK2RkY290ODc5IGNvbXBhcmV0b3RhbCAgLXNOYU4gIDEwMDAgIC0+ICAtMQorZGRjb3Q4ODAgY29tcGFyZXRvdGFsICAtc05hTiAgTmFOICAgLT4gIC0xCitkZGNvdDg4MSBjb21wYXJldG90YWwgIC1zTmFOIHNOYU4gICAtPiAgLTEKKworZGRjb3Q4ODIgY29tcGFyZXRvdGFsIC1zTmFOIC1zTmFOICAgLT4gIDAKK2RkY290ODgzIGNvbXBhcmV0b3RhbCAtTmFOICAtc05hTiAgIC0+ICAtMQorZGRjb3Q4ODQgY29tcGFyZXRvdGFsIC1JbmYgIC1zTmFOICAgLT4gIDEKK2RkY290ODg1IGNvbXBhcmV0b3RhbCAtMTAwMCAtc05hTiAgIC0+ICAxCitkZGNvdDg4NiBjb21wYXJldG90YWwgLTEgICAgLXNOYU4gICAtPiAgMQorZGRjb3Q4ODcgY29tcGFyZXRvdGFsIC0wICAgIC1zTmFOICAgLT4gIDEKK2RkY290ODg4IGNvbXBhcmV0b3RhbCAgMCAgICAtc05hTiAgIC0+ICAxCitkZGNvdDg4OSBjb21wYXJldG90YWwgIDEgICAgLXNOYU4gICAtPiAgMQorZGRjb3Q4OTAgY29tcGFyZXRvdGFsICAxMDAwIC1zTmFOICAgLT4gIDEKK2RkY290ODkxIGNvbXBhcmV0b3RhbCAgSW5mICAtc05hTiAgIC0+ICAxCitkZGNvdDg5MiBjb21wYXJldG90YWwgIE5hTiAgLXNOYU4gICAtPiAgMQorZGRjb3Q4OTMgY29tcGFyZXRvdGFsICBzTmFOIC1zTmFOICAgLT4gIDEKKworLS0gTmFOcyB3aXRoIHBheWxvYWQKK2RkY290OTYwIGNvbXBhcmV0b3RhbCAgTmFOOSAtSW5mICAgLT4gIDEKK2RkY290OTYxIGNvbXBhcmV0b3RhbCAgTmFOOCAgOTk5ICAgLT4gIDEKK2RkY290OTYyIGNvbXBhcmV0b3RhbCAgTmFONzcgSW5mICAgLT4gIDEKK2RkY290OTYzIGNvbXBhcmV0b3RhbCAtTmFONjcgTmFONSAgLT4gIC0xCitkZGNvdDk2NCBjb21wYXJldG90YWwgLUluZiAgLU5hTjQgIC0+ICAxCitkZGNvdDk2NSBjb21wYXJldG90YWwgLTk5OSAgLU5hTjMzIC0+ICAxCitkZGNvdDk2NiBjb21wYXJldG90YWwgIEluZiAgIE5hTjIgIC0+ICAtMQorCitkZGNvdDk3MCBjb21wYXJldG90YWwgLU5hTjQxIC1OYU40MiAtPiAxCitkZGNvdDk3MSBjb21wYXJldG90YWwgK05hTjQxIC1OYU40MiAtPiAxCitkZGNvdDk3MiBjb21wYXJldG90YWwgLU5hTjQxICtOYU40MiAtPiAtMQorZGRjb3Q5NzMgY29tcGFyZXRvdGFsICtOYU40MSArTmFONDIgLT4gLTEKK2RkY290OTc0IGNvbXBhcmV0b3RhbCAtTmFONDIgLU5hTjAxIC0+IC0xCitkZGNvdDk3NSBjb21wYXJldG90YWwgK05hTjQyIC1OYU4wMSAtPiAgMQorZGRjb3Q5NzYgY29tcGFyZXRvdGFsIC1OYU40MiArTmFOMDEgLT4gLTEKK2RkY290OTc3IGNvbXBhcmV0b3RhbCArTmFONDIgK05hTjAxIC0+ICAxCisKK2RkY290OTgwIGNvbXBhcmV0b3RhbCAtc05hTjc3MSAtc05hTjc3MiAtPiAxCitkZGNvdDk4MSBjb21wYXJldG90YWwgK3NOYU43NzEgLXNOYU43NzIgLT4gMQorZGRjb3Q5ODIgY29tcGFyZXRvdGFsIC1zTmFONzcxICtzTmFONzcyIC0+IC0xCitkZGNvdDk4MyBjb21wYXJldG90YWwgK3NOYU43NzEgK3NOYU43NzIgLT4gLTEKK2RkY290OTg0IGNvbXBhcmV0b3RhbCAtc05hTjc3MiAtc05hTjc3MSAtPiAtMQorZGRjb3Q5ODUgY29tcGFyZXRvdGFsICtzTmFONzcyIC1zTmFONzcxIC0+ICAxCitkZGNvdDk4NiBjb21wYXJldG90YWwgLXNOYU43NzIgK3NOYU43NzEgLT4gLTEKK2RkY290OTg3IGNvbXBhcmV0b3RhbCArc05hTjc3MiArc05hTjc3MSAtPiAgMQorCitkZGNvdDk5MSBjb21wYXJldG90YWwgLXNOYU45OSAtSW5mICAgIC0+IC0xCitkZGNvdDk5MiBjb21wYXJldG90YWwgIHNOYU45OCAtMTEgICAgIC0+ICAxCitkZGNvdDk5MyBjb21wYXJldG90YWwgIHNOYU45NyAgTmFOICAgIC0+IC0xCitkZGNvdDk5NCBjb21wYXJldG90YWwgIHNOYU4xNiBzTmFOOTQgIC0+IC0xCitkZGNvdDk5NSBjb21wYXJldG90YWwgIE5hTjg1ICBzTmFOODMgIC0+ICAxCitkZGNvdDk5NiBjb21wYXJldG90YWwgLUluZiAgICBzTmFOOTIgIC0+IC0xCitkZGNvdDk5NyBjb21wYXJldG90YWwgIDA4OCAgICBzTmFOODEgIC0+IC0xCitkZGNvdDk5OCBjb21wYXJldG90YWwgIEluZiAgICBzTmFOOTAgIC0+IC0xCitkZGNvdDk5OSBjb21wYXJldG90YWwgIE5hTiAgIC1zTmFOODkgIC0+ICAxCisKKy0tIHNwcmVhZCB6ZXJvcworZGRjb3QxMTEwIGNvbXBhcmV0b3RhbCAgIDBFLTM4MyAgMCAgICAgICAtPiAtMQorZGRjb3QxMTExIGNvbXBhcmV0b3RhbCAgIDBFLTM4MyAtMCAgICAgICAtPiAgMQorZGRjb3QxMTEyIGNvbXBhcmV0b3RhbCAgLTBFLTM4MyAgMCAgICAgICAtPiAtMQorZGRjb3QxMTEzIGNvbXBhcmV0b3RhbCAgLTBFLTM4MyAtMCAgICAgICAtPiAgMQorZGRjb3QxMTE0IGNvbXBhcmV0b3RhbCAgIDBFLTM4MyAgMEUrMzg0ICAtPiAtMQorZGRjb3QxMTE1IGNvbXBhcmV0b3RhbCAgIDBFLTM4MyAtMEUrMzg0ICAtPiAgMQorZGRjb3QxMTE2IGNvbXBhcmV0b3RhbCAgLTBFLTM4MyAgMEUrMzg0ICAtPiAtMQorZGRjb3QxMTE3IGNvbXBhcmV0b3RhbCAgLTBFLTM4MyAtMEUrMzg0ICAtPiAgMQorZGRjb3QxMTE4IGNvbXBhcmV0b3RhbCAgIDAgICAgICAgMEUrMzg0ICAtPiAtMQorZGRjb3QxMTE5IGNvbXBhcmV0b3RhbCAgIDAgICAgICAtMEUrMzg0ICAtPiAgMQorZGRjb3QxMTIwIGNvbXBhcmV0b3RhbCAgLTAgICAgICAgMEUrMzg0ICAtPiAtMQorZGRjb3QxMTIxIGNvbXBhcmV0b3RhbCAgLTAgICAgICAtMEUrMzg0ICAtPiAgMQorCitkZGNvdDExMzAgY29tcGFyZXRvdGFsICAgMEUrMzg0ICAwICAgICAgIC0+ICAxCitkZGNvdDExMzEgY29tcGFyZXRvdGFsICAgMEUrMzg0IC0wICAgICAgIC0+ICAxCitkZGNvdDExMzIgY29tcGFyZXRvdGFsICAtMEUrMzg0ICAwICAgICAgIC0+IC0xCitkZGNvdDExMzMgY29tcGFyZXRvdGFsICAtMEUrMzg0IC0wICAgICAgIC0+IC0xCitkZGNvdDExMzQgY29tcGFyZXRvdGFsICAgMEUrMzg0ICAwRS0zODMgIC0+ICAxCitkZGNvdDExMzUgY29tcGFyZXRvdGFsICAgMEUrMzg0IC0wRS0zODMgIC0+ICAxCitkZGNvdDExMzYgY29tcGFyZXRvdGFsICAtMEUrMzg0ICAwRS0zODMgIC0+IC0xCitkZGNvdDExMzcgY29tcGFyZXRvdGFsICAtMEUrMzg0IC0wRS0zODMgIC0+IC0xCitkZGNvdDExMzggY29tcGFyZXRvdGFsICAgMCAgICAgICAwRS0zODMgIC0+ICAxCitkZGNvdDExMzkgY29tcGFyZXRvdGFsICAgMCAgICAgIC0wRS0zODMgIC0+ICAxCitkZGNvdDExNDAgY29tcGFyZXRvdGFsICAtMCAgICAgICAwRS0zODMgIC0+IC0xCitkZGNvdDExNDEgY29tcGFyZXRvdGFsICAtMCAgICAgIC0wRS0zODMgIC0+IC0xCisKKy0tIE51bGwgdGVzdHMKK2RkY290OTk5MCBjb21wYXJldG90YWwgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGNvdDk5OTEgY29tcGFyZXRvdGFsICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmVUb3RhbE1hZy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvbXBhcmVUb3RhbE1hZy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4N2EwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29tcGFyZVRvdGFsTWFnLmRlY1Rlc3QKQEAgLTAsMCArMSw3MDYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb21wYXJlVG90YWxNYWcuZGVjVGVzdCAtLSBkZWNEb3VibGUgY29tcGFyaXNvbjsgYWJzLiB0b3RhbCBvcmRlci0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKy0tIFNpbWlsYXJseSwgY29tcGFyZXRvdGFsIHdpbGwgaGF2ZSBzb21lIHJhZGljYWxseSBkaWZmZXJlbnQgcGF0aHMKKy0tIHRoYW4gY29tcGFyZS4KKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RkY3RtMDAxIGNvbXBhcmV0b3RtYWcgIC0yICAtMiAgIC0+ICAgMAorZGRjdG0wMDIgY29tcGFyZXRvdG1hZyAgLTIgIC0xICAgLT4gICAxCitkZGN0bTAwMyBjb21wYXJldG90bWFnICAtMiAgIDAgICAtPiAgIDEKK2RkY3RtMDA0IGNvbXBhcmV0b3RtYWcgIC0yICAgMSAgIC0+ICAgMQorZGRjdG0wMDUgY29tcGFyZXRvdG1hZyAgLTIgICAyICAgLT4gICAwCitkZGN0bTAwNiBjb21wYXJldG90bWFnICAtMSAgLTIgICAtPiAgLTEKK2RkY3RtMDA3IGNvbXBhcmV0b3RtYWcgIC0xICAtMSAgIC0+ICAgMAorZGRjdG0wMDggY29tcGFyZXRvdG1hZyAgLTEgICAwICAgLT4gICAxCitkZGN0bTAwOSBjb21wYXJldG90bWFnICAtMSAgIDEgICAtPiAgIDAKK2RkY3RtMDEwIGNvbXBhcmV0b3RtYWcgIC0xICAgMiAgIC0+ICAtMQorZGRjdG0wMTEgY29tcGFyZXRvdG1hZyAgIDAgIC0yICAgLT4gIC0xCitkZGN0bTAxMiBjb21wYXJldG90bWFnICAgMCAgLTEgICAtPiAgLTEKK2RkY3RtMDEzIGNvbXBhcmV0b3RtYWcgICAwICAgMCAgIC0+ICAgMAorZGRjdG0wMTQgY29tcGFyZXRvdG1hZyAgIDAgICAxICAgLT4gIC0xCitkZGN0bTAxNSBjb21wYXJldG90bWFnICAgMCAgIDIgICAtPiAgLTEKK2RkY3RtMDE2IGNvbXBhcmV0b3RtYWcgICAxICAtMiAgIC0+ICAtMQorZGRjdG0wMTcgY29tcGFyZXRvdG1hZyAgIDEgIC0xICAgLT4gICAwCitkZGN0bTAxOCBjb21wYXJldG90bWFnICAgMSAgIDAgICAtPiAgIDEKK2RkY3RtMDE5IGNvbXBhcmV0b3RtYWcgICAxICAgMSAgIC0+ICAgMAorZGRjdG0wMjAgY29tcGFyZXRvdG1hZyAgIDEgICAyICAgLT4gIC0xCitkZGN0bTAyMSBjb21wYXJldG90bWFnICAgMiAgLTIgICAtPiAgIDAKK2RkY3RtMDIyIGNvbXBhcmV0b3RtYWcgICAyICAtMSAgIC0+ICAgMQorZGRjdG0wMjMgY29tcGFyZXRvdG1hZyAgIDIgICAwICAgLT4gICAxCitkZGN0bTAyNSBjb21wYXJldG90bWFnICAgMiAgIDEgICAtPiAgIDEKK2RkY3RtMDI2IGNvbXBhcmV0b3RtYWcgICAyICAgMiAgIC0+ICAgMAorCitkZGN0bTAzMSBjb21wYXJldG90bWFnICAtMjAgIC0yMCAgIC0+ICAgMAorZGRjdG0wMzIgY29tcGFyZXRvdG1hZyAgLTIwICAtMTAgICAtPiAgIDEKK2RkY3RtMDMzIGNvbXBhcmV0b3RtYWcgIC0yMCAgIDAwICAgLT4gICAxCitkZGN0bTAzNCBjb21wYXJldG90bWFnICAtMjAgICAxMCAgIC0+ICAgMQorZGRjdG0wMzUgY29tcGFyZXRvdG1hZyAgLTIwICAgMjAgICAtPiAgIDAKK2RkY3RtMDM2IGNvbXBhcmV0b3RtYWcgIC0xMCAgLTIwICAgLT4gIC0xCitkZGN0bTAzNyBjb21wYXJldG90bWFnICAtMTAgIC0xMCAgIC0+ICAgMAorZGRjdG0wMzggY29tcGFyZXRvdG1hZyAgLTEwICAgMDAgICAtPiAgIDEKK2RkY3RtMDM5IGNvbXBhcmV0b3RtYWcgIC0xMCAgIDEwICAgLT4gICAwCitkZGN0bTA0MCBjb21wYXJldG90bWFnICAtMTAgICAyMCAgIC0+ICAtMQorZGRjdG0wNDEgY29tcGFyZXRvdG1hZyAgIDAwICAtMjAgICAtPiAgLTEKK2RkY3RtMDQyIGNvbXBhcmV0b3RtYWcgICAwMCAgLTEwICAgLT4gIC0xCitkZGN0bTA0MyBjb21wYXJldG90bWFnICAgMDAgICAwMCAgIC0+ICAgMAorZGRjdG0wNDQgY29tcGFyZXRvdG1hZyAgIDAwICAgMTAgICAtPiAgLTEKK2RkY3RtMDQ1IGNvbXBhcmV0b3RtYWcgICAwMCAgIDIwICAgLT4gIC0xCitkZGN0bTA0NiBjb21wYXJldG90bWFnICAgMTAgIC0yMCAgIC0+ICAtMQorZGRjdG0wNDcgY29tcGFyZXRvdG1hZyAgIDEwICAtMTAgICAtPiAgIDAKK2RkY3RtMDQ4IGNvbXBhcmV0b3RtYWcgICAxMCAgIDAwICAgLT4gICAxCitkZGN0bTA0OSBjb21wYXJldG90bWFnICAgMTAgICAxMCAgIC0+ICAgMAorZGRjdG0wNTAgY29tcGFyZXRvdG1hZyAgIDEwICAgMjAgICAtPiAgLTEKK2RkY3RtMDUxIGNvbXBhcmV0b3RtYWcgICAyMCAgLTIwICAgLT4gICAwCitkZGN0bTA1MiBjb21wYXJldG90bWFnICAgMjAgIC0xMCAgIC0+ICAgMQorZGRjdG0wNTMgY29tcGFyZXRvdG1hZyAgIDIwICAgMDAgICAtPiAgIDEKK2RkY3RtMDU1IGNvbXBhcmV0b3RtYWcgICAyMCAgIDEwICAgLT4gICAxCitkZGN0bTA1NiBjb21wYXJldG90bWFnICAgMjAgICAyMCAgIC0+ICAgMAorCitkZGN0bTA2MSBjb21wYXJldG90bWFnICAtMi4wICAtMi4wICAgLT4gICAwCitkZGN0bTA2MiBjb21wYXJldG90bWFnICAtMi4wICAtMS4wICAgLT4gICAxCitkZGN0bTA2MyBjb21wYXJldG90bWFnICAtMi4wICAgMC4wICAgLT4gICAxCitkZGN0bTA2NCBjb21wYXJldG90bWFnICAtMi4wICAgMS4wICAgLT4gICAxCitkZGN0bTA2NSBjb21wYXJldG90bWFnICAtMi4wICAgMi4wICAgLT4gICAwCitkZGN0bTA2NiBjb21wYXJldG90bWFnICAtMS4wICAtMi4wICAgLT4gIC0xCitkZGN0bTA2NyBjb21wYXJldG90bWFnICAtMS4wICAtMS4wICAgLT4gICAwCitkZGN0bTA2OCBjb21wYXJldG90bWFnICAtMS4wICAgMC4wICAgLT4gICAxCitkZGN0bTA2OSBjb21wYXJldG90bWFnICAtMS4wICAgMS4wICAgLT4gICAwCitkZGN0bTA3MCBjb21wYXJldG90bWFnICAtMS4wICAgMi4wICAgLT4gIC0xCitkZGN0bTA3MSBjb21wYXJldG90bWFnICAgMC4wICAtMi4wICAgLT4gIC0xCitkZGN0bTA3MiBjb21wYXJldG90bWFnICAgMC4wICAtMS4wICAgLT4gIC0xCitkZGN0bTA3MyBjb21wYXJldG90bWFnICAgMC4wICAgMC4wICAgLT4gICAwCitkZGN0bTA3NCBjb21wYXJldG90bWFnICAgMC4wICAgMS4wICAgLT4gIC0xCitkZGN0bTA3NSBjb21wYXJldG90bWFnICAgMC4wICAgMi4wICAgLT4gIC0xCitkZGN0bTA3NiBjb21wYXJldG90bWFnICAgMS4wICAtMi4wICAgLT4gIC0xCitkZGN0bTA3NyBjb21wYXJldG90bWFnICAgMS4wICAtMS4wICAgLT4gICAwCitkZGN0bTA3OCBjb21wYXJldG90bWFnICAgMS4wICAgMC4wICAgLT4gICAxCitkZGN0bTA3OSBjb21wYXJldG90bWFnICAgMS4wICAgMS4wICAgLT4gICAwCitkZGN0bTA4MCBjb21wYXJldG90bWFnICAgMS4wICAgMi4wICAgLT4gIC0xCitkZGN0bTA4MSBjb21wYXJldG90bWFnICAgMi4wICAtMi4wICAgLT4gICAwCitkZGN0bTA4MiBjb21wYXJldG90bWFnICAgMi4wICAtMS4wICAgLT4gICAxCitkZGN0bTA4MyBjb21wYXJldG90bWFnICAgMi4wICAgMC4wICAgLT4gICAxCitkZGN0bTA4NSBjb21wYXJldG90bWFnICAgMi4wICAgMS4wICAgLT4gICAxCitkZGN0bTA4NiBjb21wYXJldG90bWFnICAgMi4wICAgMi4wICAgLT4gICAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorZGRjdG0wOTAgY29tcGFyZXRvdG1hZyAgOS45OTk5OTk5OUUrMzg0IDkuOTk5OTk5OTlFKzM4NCAgIC0+ICAgMAorZGRjdG0wOTEgY29tcGFyZXRvdG1hZyAtOS45OTk5OTk5OUUrMzg0IDkuOTk5OTk5OTlFKzM4NCAgIC0+ICAgMAorZGRjdG0wOTIgY29tcGFyZXRvdG1hZyAgOS45OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5RSszODQgIC0+ICAgMAorZGRjdG0wOTMgY29tcGFyZXRvdG1hZyAtOS45OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5RSszODQgIC0+ICAgMAorCistLSBzb21lIGRpZmZlcmluZyBsZW5ndGgvZXhwb25lbnQgY2FzZXMKKy0tIGluIHRoaXMgZmlyc3QgZ3JvdXAsIGNvbXBhcmUgd291bGQgY29tcGFyZSBhbGwgZXF1YWwKK2RkY3RtMTAwIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgNy4wICAgICAtPiAgIDAKK2RkY3RtMTAxIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgNyAgICAgICAtPiAgLTEKK2RkY3RtMTAyIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgNy4wICAgICAtPiAgIDEKK2RkY3RtMTAzIGNvbXBhcmV0b3RtYWcgICA3RSswICAgNy4wICAgICAtPiAgIDEKK2RkY3RtMTA0IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgNy4wICAgICAtPiAgIDAKK2RkY3RtMTA1IGNvbXBhcmV0b3RtYWcgICAwLjdFKzEgNyAgICAgICAtPiAgIDAKK2RkY3RtMTA2IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgNyAgICAgICAtPiAgLTEKK2RkY3RtMTA3IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgN0UrMCAgICAtPiAgLTEKK2RkY3RtMTA4IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgNzBFLTEgICAtPiAgIDAKK2RkY3RtMTA5IGNvbXBhcmV0b3RtYWcgICA3ICAgICAgMC43RSsxICAtPiAgIDAKK2RkY3RtMTEwIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgNzBFLTEgICAtPiAgIDEKKworZGRjdG0xMjAgY29tcGFyZXRvdG1hZyAgIDguMCAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0xMjEgY29tcGFyZXRvdG1hZyAgIDguMCAgICA3ICAgICAgIC0+ICAgMQorZGRjdG0xMjIgY29tcGFyZXRvdG1hZyAgIDggICAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0xMjMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICA3LjAgICAgIC0+ICAgMQorZGRjdG0xMjQgY29tcGFyZXRvdG1hZyAgIDgwRS0xICA3LjAgICAgIC0+ICAgMQorZGRjdG0xMjUgY29tcGFyZXRvdG1hZyAgIDAuOEUrMSA3ICAgICAgIC0+ICAgMQorZGRjdG0xMjYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICA3ICAgICAgIC0+ICAgMQorZGRjdG0xMjcgY29tcGFyZXRvdG1hZyAgIDguMCAgICA3RSswICAgIC0+ICAgMQorZGRjdG0xMjggY29tcGFyZXRvdG1hZyAgIDguMCAgICA3MEUtMSAgIC0+ICAgMQorZGRjdG0xMjkgY29tcGFyZXRvdG1hZyAgIDggICAgICAwLjdFKzEgICAtPiAgIDEKK2RkY3RtMTMwIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgNzBFLTEgICAtPiAgIDEKKworZGRjdG0xNDAgY29tcGFyZXRvdG1hZyAgIDguMCAgICA5LjAgICAgIC0+ICAtMQorZGRjdG0xNDEgY29tcGFyZXRvdG1hZyAgIDguMCAgICA5ICAgICAgIC0+ICAtMQorZGRjdG0xNDIgY29tcGFyZXRvdG1hZyAgIDggICAgICA5LjAgICAgIC0+ICAtMQorZGRjdG0xNDMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICA5LjAgICAgIC0+ICAtMQorZGRjdG0xNDQgY29tcGFyZXRvdG1hZyAgIDgwRS0xICA5LjAgICAgIC0+ICAtMQorZGRjdG0xNDUgY29tcGFyZXRvdG1hZyAgIDAuOEUrMSA5ICAgICAgIC0+ICAtMQorZGRjdG0xNDYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICA5ICAgICAgIC0+ICAtMQorZGRjdG0xNDcgY29tcGFyZXRvdG1hZyAgIDguMCAgICA5RSswICAgIC0+ICAtMQorZGRjdG0xNDggY29tcGFyZXRvdG1hZyAgIDguMCAgICA5MEUtMSAgIC0+ICAtMQorZGRjdG0xNDkgY29tcGFyZXRvdG1hZyAgIDggICAgICAwLjlFKzEgIC0+ICAtMQorZGRjdG0xNTAgY29tcGFyZXRvdG1hZyAgIDggICAgICA5MEUtMSAgIC0+ICAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0rIC4uCitkZGN0bTIwMCBjb21wYXJldG90bWFnICAtNy4wICAgIDcuMCAgICAgLT4gICAwCitkZGN0bTIwMSBjb21wYXJldG90bWFnICAtNy4wICAgIDcgICAgICAgLT4gIC0xCitkZGN0bTIwMiBjb21wYXJldG90bWFnICAtNyAgICAgIDcuMCAgICAgLT4gICAxCitkZGN0bTIwMyBjb21wYXJldG90bWFnICAtN0UrMCAgIDcuMCAgICAgLT4gICAxCitkZGN0bTIwNCBjb21wYXJldG90bWFnICAtNzBFLTEgIDcuMCAgICAgLT4gICAwCitkZGN0bTIwNSBjb21wYXJldG90bWFnICAtMC43RSsxIDcgICAgICAgLT4gICAwCitkZGN0bTIwNiBjb21wYXJldG90bWFnICAtNzBFLTEgIDcgICAgICAgLT4gIC0xCitkZGN0bTIwNyBjb21wYXJldG90bWFnICAtNy4wICAgIDdFKzAgICAgLT4gIC0xCitkZGN0bTIwOCBjb21wYXJldG90bWFnICAtNy4wICAgIDcwRS0xICAgLT4gICAwCitkZGN0bTIwOSBjb21wYXJldG90bWFnICAtNyAgICAgIDAuN0UrMSAgLT4gICAwCitkZGN0bTIxMCBjb21wYXJldG90bWFnICAtNyAgICAgIDcwRS0xICAgLT4gICAxCisKK2RkY3RtMjIwIGNvbXBhcmV0b3RtYWcgIC04LjAgICAgNy4wICAgICAtPiAgIDEKK2RkY3RtMjIxIGNvbXBhcmV0b3RtYWcgIC04LjAgICAgNyAgICAgICAtPiAgIDEKK2RkY3RtMjIyIGNvbXBhcmV0b3RtYWcgIC04ICAgICAgNy4wICAgICAtPiAgIDEKK2RkY3RtMjIzIGNvbXBhcmV0b3RtYWcgIC04RSswICAgNy4wICAgICAtPiAgIDEKK2RkY3RtMjI0IGNvbXBhcmV0b3RtYWcgIC04MEUtMSAgNy4wICAgICAtPiAgIDEKK2RkY3RtMjI1IGNvbXBhcmV0b3RtYWcgIC0wLjhFKzEgNyAgICAgICAtPiAgIDEKK2RkY3RtMjI2IGNvbXBhcmV0b3RtYWcgIC04MEUtMSAgNyAgICAgICAtPiAgIDEKK2RkY3RtMjI3IGNvbXBhcmV0b3RtYWcgIC04LjAgICAgN0UrMCAgICAtPiAgIDEKK2RkY3RtMjI4IGNvbXBhcmV0b3RtYWcgIC04LjAgICAgNzBFLTEgICAtPiAgIDEKK2RkY3RtMjI5IGNvbXBhcmV0b3RtYWcgIC04ICAgICAgMC43RSsxICAtPiAgIDEKK2RkY3RtMjMwIGNvbXBhcmV0b3RtYWcgIC04ICAgICAgNzBFLTEgICAtPiAgIDEKKworZGRjdG0yNDAgY29tcGFyZXRvdG1hZyAgLTguMCAgICA5LjAgICAgIC0+ICAtMQorZGRjdG0yNDEgY29tcGFyZXRvdG1hZyAgLTguMCAgICA5ICAgICAgIC0+ICAtMQorZGRjdG0yNDIgY29tcGFyZXRvdG1hZyAgLTggICAgICA5LjAgICAgIC0+ICAtMQorZGRjdG0yNDMgY29tcGFyZXRvdG1hZyAgLThFKzAgICA5LjAgICAgIC0+ICAtMQorZGRjdG0yNDQgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA5LjAgICAgIC0+ICAtMQorZGRjdG0yNDUgY29tcGFyZXRvdG1hZyAgLTAuOEUrMSA5ICAgICAgIC0+ICAtMQorZGRjdG0yNDYgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA5ICAgICAgIC0+ICAtMQorZGRjdG0yNDcgY29tcGFyZXRvdG1hZyAgLTguMCAgICA5RSswICAgIC0+ICAtMQorZGRjdG0yNDggY29tcGFyZXRvdG1hZyAgLTguMCAgICA5MEUtMSAgIC0+ICAtMQorZGRjdG0yNDkgY29tcGFyZXRvdG1hZyAgLTggICAgICAwLjlFKzEgIC0+ICAtMQorZGRjdG0yNTAgY29tcGFyZXRvdG1hZyAgLTggICAgICA5MEUtMSAgIC0+ICAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzICstIC4uCitkZGN0bTMwMCBjb21wYXJldG90bWFnICAgNy4wICAgIC03LjAgICAgIC0+ICAgMAorZGRjdG0zMDEgY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtNyAgICAgICAtPiAgLTEKK2RkY3RtMzAyIGNvbXBhcmV0b3RtYWcgICA3ICAgICAgLTcuMCAgICAgLT4gICAxCitkZGN0bTMwMyBjb21wYXJldG90bWFnICAgN0UrMCAgIC03LjAgICAgIC0+ICAgMQorZGRjdG0zMDQgY29tcGFyZXRvdG1hZyAgIDcwRS0xICAtNy4wICAgICAtPiAgIDAKK2RkY3RtMzA1IGNvbXBhcmV0b3RtYWcgICAuN0UrMSAgLTcgICAgICAgLT4gICAwCitkZGN0bTMwNiBjb21wYXJldG90bWFnICAgNzBFLTEgIC03ICAgICAgIC0+ICAtMQorZGRjdG0zMDcgY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtN0UrMCAgICAtPiAgLTEKK2RkY3RtMzA4IGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTcwRS0xICAgLT4gICAwCitkZGN0bTMwOSBjb21wYXJldG90bWFnICAgNyAgICAgIC0uN0UrMSAgIC0+ICAgMAorZGRjdG0zMTAgY29tcGFyZXRvdG1hZyAgIDcgICAgICAtNzBFLTEgICAtPiAgIDEKKworZGRjdG0zMjAgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtMzIxIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTcgICAgICAgLT4gICAxCitkZGN0bTMyMiBjb21wYXJldG90bWFnICAgOCAgICAgIC03LjAgICAgIC0+ICAgMQorZGRjdG0zMjMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtMzI0IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgLTcuMCAgICAgLT4gICAxCitkZGN0bTMyNSBjb21wYXJldG90bWFnICAgLjhFKzEgIC03ICAgICAgIC0+ICAgMQorZGRjdG0zMjYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtNyAgICAgICAtPiAgIDEKK2RkY3RtMzI3IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTdFKzAgICAgLT4gICAxCitkZGN0bTMyOCBjb21wYXJldG90bWFnICAgOC4wICAgIC03MEUtMSAgIC0+ICAgMQorZGRjdG0zMjkgY29tcGFyZXRvdG1hZyAgIDggICAgICAtLjdFKzEgICAtPiAgIDEKK2RkY3RtMzMwIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2RkY3RtMzQwIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTkuMCAgICAgLT4gIC0xCitkZGN0bTM0MSBjb21wYXJldG90bWFnICAgOC4wICAgIC05ICAgICAgIC0+ICAtMQorZGRjdG0zNDIgY29tcGFyZXRvdG1hZyAgIDggICAgICAtOS4wICAgICAtPiAgLTEKK2RkY3RtMzQzIGNvbXBhcmV0b3RtYWcgICA4RSswICAgLTkuMCAgICAgLT4gIC0xCitkZGN0bTM0NCBjb21wYXJldG90bWFnICAgODBFLTEgIC05LjAgICAgIC0+ICAtMQorZGRjdG0zNDUgY29tcGFyZXRvdG1hZyAgIC44RSsxICAtOSAgICAgICAtPiAgLTEKK2RkY3RtMzQ2IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgLTkgICAgICAgLT4gIC0xCitkZGN0bTM0NyBjb21wYXJldG90bWFnICAgOC4wICAgIC05RSswICAgIC0+ICAtMQorZGRjdG0zNDggY29tcGFyZXRvdG1hZyAgIDguMCAgICAtOTBFLTEgICAtPiAgLTEKK2RkY3RtMzQ5IGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLS45RSsxICAgLT4gIC0xCitkZGN0bTM1MCBjb21wYXJldG90bWFnICAgOCAgICAgIC05MEUtMSAgIC0+ICAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0tIC4uCitkZGN0bTQwMCBjb21wYXJldG90bWFnICAgLTcuMCAgICAtNy4wICAgICAtPiAgIDAKK2RkY3RtNDAxIGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03ICAgICAgIC0+ICAtMQorZGRjdG00MDIgY29tcGFyZXRvdG1hZyAgIC03ICAgICAgLTcuMCAgICAgLT4gICAxCitkZGN0bTQwMyBjb21wYXJldG90bWFnICAgLTdFKzAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtNDA0IGNvbXBhcmV0b3RtYWcgICAtNzBFLTEgIC03LjAgICAgIC0+ICAgMAorZGRjdG00MDUgY29tcGFyZXRvdG1hZyAgIC0uN0UrMSAgLTcgICAgICAgLT4gICAwCitkZGN0bTQwNiBjb21wYXJldG90bWFnICAgLTcwRS0xICAtNyAgICAgICAtPiAgLTEKK2RkY3RtNDA3IGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03RSswICAgIC0+ICAtMQorZGRjdG00MDggY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTcwRS0xICAgLT4gICAwCitkZGN0bTQwOSBjb21wYXJldG90bWFnICAgLTcgICAgICAtLjdFKzEgICAtPiAgIDAKK2RkY3RtNDEwIGNvbXBhcmV0b3RtYWcgICAtNyAgICAgIC03MEUtMSAgIC0+ICAgMQorCitkZGN0bTQyMCBjb21wYXJldG90bWFnICAgLTguMCAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtNDIxIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC03ICAgICAgIC0+ICAgMQorZGRjdG00MjIgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTcuMCAgICAgLT4gICAxCitkZGN0bTQyMyBjb21wYXJldG90bWFnICAgLThFKzAgICAtNy4wICAgICAtPiAgIDEKK2RkY3RtNDI0IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC03LjAgICAgIC0+ICAgMQorZGRjdG00MjUgY29tcGFyZXRvdG1hZyAgIC0uOEUrMSAgLTcgICAgICAgLT4gICAxCitkZGN0bTQyNiBjb21wYXJldG90bWFnICAgLTgwRS0xICAtNyAgICAgICAtPiAgIDEKK2RkY3RtNDI3IGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC03RSswICAgIC0+ICAgMQorZGRjdG00MjggY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTcwRS0xICAgLT4gICAxCitkZGN0bTQyOSBjb21wYXJldG90bWFnICAgLTggICAgICAtLjdFKzEgICAtPiAgIDEKK2RkY3RtNDMwIGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC03MEUtMSAgIC0+ICAgMQorCitkZGN0bTQ0MCBjb21wYXJldG90bWFnICAgLTguMCAgICAtOS4wICAgICAtPiAgLTEKK2RkY3RtNDQxIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05ICAgICAgIC0+ICAtMQorZGRjdG00NDIgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTkuMCAgICAgLT4gIC0xCitkZGN0bTQ0MyBjb21wYXJldG90bWFnICAgLThFKzAgICAtOS4wICAgICAtPiAgLTEKK2RkY3RtNDQ0IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC05LjAgICAgIC0+ICAtMQorZGRjdG00NDUgY29tcGFyZXRvdG1hZyAgIC0uOEUrMSAgLTkgICAgICAgLT4gIC0xCitkZGN0bTQ0NiBjb21wYXJldG90bWFnICAgLTgwRS0xICAtOSAgICAgICAtPiAgLTEKK2RkY3RtNDQ3IGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05RSswICAgIC0+ICAtMQorZGRjdG00NDggY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTkwRS0xICAgLT4gIC0xCitkZGN0bTQ0OSBjb21wYXJldG90bWFnICAgLTggICAgICAtLjlFKzEgICAtPiAgLTEKK2RkY3RtNDUwIGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC05MEUtMSAgIC0+ICAtMQorCisKKy0tIHRlc3RjYXNlcyB0aGF0IHN1YnRyYWN0IHRvIGxvdHMgb2YgemVyb3MgYXQgYm91bmRhcmllcyBbcGdyXQorZGRjdG00NzMgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorZGRjdG00NzQgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkZGN0bTQ3NSBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorZGRjdG00NzYgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgIC0+ICAtMQorZGRjdG00NzcgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkZGN0bTQ3OCBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMEUrODkgMTIzLjQ1NkUrODkgIC0+ICAtMQorZGRjdG00NzkgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorZGRjdG00ODAgY29tcGFyZXRvdG1hZyAxMjMuNDU2MDAwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkZGN0bTQ4MSBjb21wYXJldG90bWFnIDEyMy40NTYwMEUtODkgMTIzLjQ1NkUtODkgIC0+ICAtMQorZGRjdG00ODIgY29tcGFyZXRvdG1hZyAxMjMuNDU2MEUrODkgMTIzLjQ1NkUrODkgIC0+ICAtMQorZGRjdG00ODMgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2RS04OSAgLT4gICAwCitkZGN0bTQ4NyBjb21wYXJldG90bWFnIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDAwMDAwRSs4OSAgLT4gICAxCitkZGN0bTQ4OCBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwMDBFLTg5ICAtPiAgIDEKK2RkY3RtNDg5IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwRSs4OSAgLT4gICAxCitkZGN0bTQ5MCBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwRS04OSAgLT4gICAxCitkZGN0bTQ5MSBjb21wYXJldG90bWFnIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDBFKzg5ICAtPiAgIDEKK2RkY3RtNDkyIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwRS04OSAgLT4gICAxCitkZGN0bTQ5MyBjb21wYXJldG90bWFnIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwRSs4OSAgLT4gICAxCitkZGN0bTQ5NCBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwMDBFLTg5ICAtPiAgIDEKK2RkY3RtNDk1IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwRSs4OSAgLT4gICAxCitkZGN0bTQ5NiBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTYwRS04OSAgLT4gICAxCitkZGN0bTQ5NyBjb21wYXJldG90bWFnIDEyMy40NTZFKzg5IDEyMy40NTZFKzg5ICAtPiAgIDAKKworLS0gd2lkZS1yYW5naW5nLCBhcm91bmQgcHJlY2lzaW9uOyBzaWducyBlcXVhbAorZGRjdG00OTggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xNyAgICAgLT4gICAxCitkZGN0bTQ5OSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTE2ICAgICAtPiAgIDEKK2RkY3RtNTAwIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTUgICAgIC0+ICAgMQorZGRjdG01MDEgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xNCAgICAgLT4gICAxCitkZGN0bTUwMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEzICAgICAtPiAgIDEKK2RkY3RtNTAzIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTIgICAgIC0+ICAgMQorZGRjdG01MDQgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xMSAgICAgLT4gICAxCitkZGN0bTUwNSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEwICAgICAtPiAgIDEKK2RkY3RtNTA2IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtOSAgICAgIC0+ICAgMQorZGRjdG01MDcgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS04ICAgICAgLT4gICAxCitkZGN0bTUwOCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTcgICAgICAtPiAgIDEKK2RkY3RtNTA5IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNiAgICAgIC0+ICAgMQorZGRjdG01MTAgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS01ICAgICAgLT4gICAxCitkZGN0bTUxMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTQgICAgICAtPiAgIDEKK2RkY3RtNTEyIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMyAgICAgIC0+ICAgMQorZGRjdG01MTMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0yICAgICAgLT4gICAxCitkZGN0bTUxNCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTEgICAgICAtPiAgIDEKK2RkY3RtNTE1IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMCAgICAgIC0+ICAgMAorZGRjdG01MTYgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxICAgICAgLT4gIC0xCitkZGN0bTUxNyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzIgICAgICAtPiAgLTEKK2RkY3RtNTE4IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMyAgICAgIC0+ICAtMQorZGRjdG01MTkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs0ICAgICAgLT4gIC0xCitkZGN0bTUyMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzUgICAgICAtPiAgLTEKK2RkY3RtNTIyIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNiAgICAgIC0+ICAtMQorZGRjdG01MjMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs3ICAgICAgLT4gIC0xCitkZGN0bTUyNCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzggICAgICAtPiAgLTEKK2RkY3RtNTI1IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrOSAgICAgIC0+ICAtMQorZGRjdG01MjYgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMCAgICAgLT4gIC0xCitkZGN0bTUyNyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzExICAgICAtPiAgLTEKK2RkY3RtNTI4IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTIgICAgIC0+ICAtMQorZGRjdG01MjkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMyAgICAgLT4gIC0xCitkZGN0bTUzMCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzE0ICAgICAtPiAgLTEKK2RkY3RtNTMxIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTUgICAgIC0+ICAtMQorZGRjdG01MzIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxNiAgICAgLT4gIC0xCitkZGN0bTUzMyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzE3ICAgICAtPiAgLTEKKy0tIExSIHN3YXAKK2RkY3RtNTM4IGNvbXBhcmV0b3RtYWcgICAgMUUtMTcgIDEgICAgICAgIC0+ICAtMQorZGRjdG01MzkgY29tcGFyZXRvdG1hZyAgICAxRS0xNiAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU0MCBjb21wYXJldG90bWFnICAgIDFFLTE1ICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTQxIGNvbXBhcmV0b3RtYWcgICAgMUUtMTQgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NDIgY29tcGFyZXRvdG1hZyAgICAxRS0xMyAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU0MyBjb21wYXJldG90bWFnICAgIDFFLTEyICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTQ0IGNvbXBhcmV0b3RtYWcgICAgMUUtMTEgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NDUgY29tcGFyZXRvdG1hZyAgICAxRS0xMCAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU0NiBjb21wYXJldG90bWFnICAgIDFFLTkgICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTQ3IGNvbXBhcmV0b3RtYWcgICAgMUUtOCAgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NDggY29tcGFyZXRvdG1hZyAgICAxRS03ICAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU0OSBjb21wYXJldG90bWFnICAgIDFFLTYgICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTUwIGNvbXBhcmV0b3RtYWcgICAgMUUtNSAgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NTEgY29tcGFyZXRvdG1hZyAgICAxRS00ICAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU1MiBjb21wYXJldG90bWFnICAgIDFFLTMgICAxICAgICAgICAtPiAgLTEKK2RkY3RtNTUzIGNvbXBhcmV0b3RtYWcgICAgMUUtMiAgIDEgICAgICAgIC0+ICAtMQorZGRjdG01NTQgY29tcGFyZXRvdG1hZyAgICAxRS0xICAgMSAgICAgICAgLT4gIC0xCitkZGN0bTU1NSBjb21wYXJldG90bWFnICAgIDFFLTAgICAxICAgICAgICAtPiAgIDAKK2RkY3RtNTU2IGNvbXBhcmV0b3RtYWcgICAgMUUrMSAgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NTcgY29tcGFyZXRvdG1hZyAgICAxRSsyICAgMSAgICAgICAgLT4gICAxCitkZGN0bTU1OCBjb21wYXJldG90bWFnICAgIDFFKzMgICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTU5IGNvbXBhcmV0b3RtYWcgICAgMUUrNCAgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NjEgY29tcGFyZXRvdG1hZyAgICAxRSs1ICAgMSAgICAgICAgLT4gICAxCitkZGN0bTU2MiBjb21wYXJldG90bWFnICAgIDFFKzYgICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTYzIGNvbXBhcmV0b3RtYWcgICAgMUUrNyAgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NjQgY29tcGFyZXRvdG1hZyAgICAxRSs4ICAgMSAgICAgICAgLT4gICAxCitkZGN0bTU2NSBjb21wYXJldG90bWFnICAgIDFFKzkgICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTY2IGNvbXBhcmV0b3RtYWcgICAgMUUrMTAgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NjcgY29tcGFyZXRvdG1hZyAgICAxRSsxMSAgMSAgICAgICAgLT4gICAxCitkZGN0bTU2OCBjb21wYXJldG90bWFnICAgIDFFKzEyICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTY5IGNvbXBhcmV0b3RtYWcgICAgMUUrMTMgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NzAgY29tcGFyZXRvdG1hZyAgICAxRSsxNCAgMSAgICAgICAgLT4gICAxCitkZGN0bTU3MSBjb21wYXJldG90bWFnICAgIDFFKzE1ICAxICAgICAgICAtPiAgIDEKK2RkY3RtNTcyIGNvbXBhcmV0b3RtYWcgICAgMUUrMTYgIDEgICAgICAgIC0+ICAgMQorZGRjdG01NzMgY29tcGFyZXRvdG1hZyAgICAxRSsxNyAgMSAgICAgICAgLT4gICAxCistLSBzaW1pbGFyIHdpdGggYSB1c2VmdWwgY29lZmZpY2llbnQsIG9uZSBzaWRlIG9ubHkKK2RkY3RtNTc4IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNyAgICAgLT4gICAxCitkZGN0bTU3OSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTYgICAgIC0+ICAgMQorZGRjdG01ODAgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE1ICAgICAtPiAgIDEKK2RkY3RtNTgxIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNCAgICAgLT4gICAxCitkZGN0bTU4MiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgIC0+ICAgMQorZGRjdG01ODMgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEyICAgICAtPiAgIDEKK2RkY3RtNTg0IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMSAgICAgLT4gICAxCitkZGN0bTU4NSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgIC0+ICAgMQorZGRjdG01ODYgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTkgICAgICAtPiAgIDEKK2RkY3RtNTg3IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS04ICAgICAgLT4gICAxCitkZGN0bTU4OCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgIC0+ICAgMQorZGRjdG01ODkgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTYgICAgICAtPiAgLTEKK2RkY3RtNTkwIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS01ICAgICAgLT4gIC0xCitkZGN0bTU5MSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNCAgICAgIC0+ICAtMQorZGRjdG01OTIgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTMgICAgICAtPiAgLTEKK2RkY3RtNTkzIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0yICAgICAgLT4gIC0xCitkZGN0bTU5NCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMSAgICAgIC0+ICAtMQorZGRjdG01OTUgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTAgICAgICAtPiAgLTEKK2RkY3RtNTk2IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsxICAgICAgLT4gIC0xCitkZGN0bTU5NyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMiAgICAgIC0+ICAtMQorZGRjdG01OTggY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzMgICAgICAtPiAgLTEKK2RkY3RtNTk5IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSs0ICAgICAgLT4gIC0xCisKKy0tIGNoZWNrIHNvbWUgdW5pdC15IHRyYXBzCitkZGN0bTYwMCBjb21wYXJldG90bWFnICAgMTIgICAgICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjAxIGNvbXBhcmV0b3RtYWcgICAxMi4wICAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorZGRjdG02MDIgY29tcGFyZXRvdG1hZyAgIDEyLjAwICAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYwMyBjb21wYXJldG90bWFnICAgMTIuMDAwICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjA0IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwICAgICAgIDEyLjIzNDUgIC0+ICAtMQorZGRjdG02MDUgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwICAgICAgMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYwNiBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjA3IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwICAgIDEyLjIzNDUgIC0+ICAtMQorZGRjdG02MDggY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAwICAgMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYwOSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAwICAxMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjEwIGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyICAgICAgICAgICAgIC0+ICAgMQorZGRjdG02MTEgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMCAgICAgICAgICAgLT4gICAxCitkZGN0bTYxMiBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMCAgICAgICAgICAtPiAgIDEKK2RkY3RtNjEzIGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMCAgICAgICAgIC0+ICAgMQorZGRjdG02MTQgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMCAgICAgICAgLT4gICAxCitkZGN0bTYxNSBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMCAgICAgICAtPiAgIDEKK2RkY3RtNjE2IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwMCAgICAgIC0+ICAgMQorZGRjdG02MTcgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwMCAgICAgLT4gICAxCitkZGN0bTYxOCBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAwMCAgICAtPiAgIDEKK2RkY3RtNjE5IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwMCAgIC0+ICAgMQorZGRjdG02MjAgY29tcGFyZXRvdG1hZyAgLTEyICAgICAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYyMSBjb21wYXJldG90bWFnICAtMTIuMCAgICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjIyIGNvbXBhcmV0b3RtYWcgIC0xMi4wMCAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorZGRjdG02MjMgY29tcGFyZXRvdG1hZyAgLTEyLjAwMCAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYyNCBjb21wYXJldG90bWFnICAtMTIuMDAwMCAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjI1IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMCAgICAgLTEyLjIzNDUgIC0+ICAtMQorZGRjdG02MjYgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMCAgICAtMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYyNyBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwMCAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RkY3RtNjI4IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAwMCAgLTEyLjIzNDUgIC0+ICAtMQorZGRjdG02MjkgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMDAwMCAtMTIuMjM0NSAgLT4gIC0xCitkZGN0bTYzMCBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIgICAgICAgICAgICAtPiAgIDEKK2RkY3RtNjMxIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wICAgICAgICAgIC0+ICAgMQorZGRjdG02MzIgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwICAgICAgICAgLT4gICAxCitkZGN0bTYzMyBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwICAgICAgICAtPiAgIDEKK2RkY3RtNjM0IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwICAgICAgIC0+ICAgMQorZGRjdG02MzUgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwICAgICAgLT4gICAxCitkZGN0bTYzNiBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwICAgICAtPiAgIDEKK2RkY3RtNjM3IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwICAgIC0+ICAgMQorZGRjdG02MzggY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAwICAgLT4gICAxCitkZGN0bTYzOSBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAwICAtPiAgIDEKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RkY3RtNjQwIGNvbXBhcmV0b3RtYWcgICAwICAgICAwICAgIC0+ICAgMAorZGRjdG02NDEgY29tcGFyZXRvdG1hZyAgIDAgICAgLTAgICAgLT4gICAwCitkZGN0bTY0MiBjb21wYXJldG90bWFnICAgMCAgICAtMC4wICAtPiAgIDEKK2RkY3RtNjQzIGNvbXBhcmV0b3RtYWcgICAwICAgICAwLjAgIC0+ICAgMQorZGRjdG02NDQgY29tcGFyZXRvdG1hZyAgLTAgICAgIDAgICAgLT4gICAwCitkZGN0bTY0NSBjb21wYXJldG90bWFnICAtMCAgICAtMCAgICAtPiAgIDAKK2RkY3RtNjQ2IGNvbXBhcmV0b3RtYWcgIC0wICAgIC0wLjAgIC0+ICAgMQorZGRjdG02NDcgY29tcGFyZXRvdG1hZyAgLTAgICAgIDAuMCAgLT4gICAxCitkZGN0bTY0OCBjb21wYXJldG90bWFnICAgMC4wICAgMCAgICAtPiAgLTEKK2RkY3RtNjQ5IGNvbXBhcmV0b3RtYWcgICAwLjAgIC0wICAgIC0+ICAtMQorZGRjdG02NTAgY29tcGFyZXRvdG1hZyAgIDAuMCAgLTAuMCAgLT4gICAwCitkZGN0bTY1MSBjb21wYXJldG90bWFnICAgMC4wICAgMC4wICAtPiAgIDAKK2RkY3RtNjUyIGNvbXBhcmV0b3RtYWcgIC0wLjAgICAwICAgIC0+ICAtMQorZGRjdG02NTMgY29tcGFyZXRvdG1hZyAgLTAuMCAgLTAgICAgLT4gIC0xCitkZGN0bTY1NCBjb21wYXJldG90bWFnICAtMC4wICAtMC4wICAtPiAgIDAKK2RkY3RtNjU1IGNvbXBhcmV0b3RtYWcgIC0wLjAgICAwLjAgIC0+ICAgMAorCitkZGN0bTY1NiBjb21wYXJldG90bWFnICAtMEUxICAgMC4wICAtPiAgIDEKK2RkY3RtNjU3IGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwLjAgIC0+ICAgMQorZGRjdG02NTggY29tcGFyZXRvdG1hZyAgIDBFMSAgIDAuMCAgLT4gICAxCitkZGN0bTY1OSBjb21wYXJldG90bWFnICAgMEUyICAgMC4wICAtPiAgIDEKK2RkY3RtNjYwIGNvbXBhcmV0b3RtYWcgIC0wRTEgICAwICAgIC0+ICAgMQorZGRjdG02NjEgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDAgICAgLT4gICAxCitkZGN0bTY2MiBjb21wYXJldG90bWFnICAgMEUxICAgMCAgICAtPiAgIDEKK2RkY3RtNjYzIGNvbXBhcmV0b3RtYWcgICAwRTIgICAwICAgIC0+ICAgMQorZGRjdG02NjQgY29tcGFyZXRvdG1hZyAgLTBFMSAgLTBFMSAgLT4gICAwCitkZGN0bTY2NSBjb21wYXJldG90bWFnICAtMEUyICAtMEUxICAtPiAgIDEKK2RkY3RtNjY2IGNvbXBhcmV0b3RtYWcgICAwRTEgIC0wRTEgIC0+ICAgMAorZGRjdG02NjcgY29tcGFyZXRvdG1hZyAgIDBFMiAgLTBFMSAgLT4gICAxCitkZGN0bTY2OCBjb21wYXJldG90bWFnICAtMEUxICAtMEUyICAtPiAgLTEKK2RkY3RtNjY5IGNvbXBhcmV0b3RtYWcgIC0wRTIgIC0wRTIgIC0+ICAgMAorZGRjdG02NzAgY29tcGFyZXRvdG1hZyAgIDBFMSAgLTBFMiAgLT4gIC0xCitkZGN0bTY3MSBjb21wYXJldG90bWFnICAgMEUyICAtMEUyICAtPiAgIDAKK2RkY3RtNjcyIGNvbXBhcmV0b3RtYWcgIC0wRTEgICAwRTEgIC0+ICAgMAorZGRjdG02NzMgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDBFMSAgLT4gICAxCitkZGN0bTY3NCBjb21wYXJldG90bWFnICAgMEUxICAgMEUxICAtPiAgIDAKK2RkY3RtNjc1IGNvbXBhcmV0b3RtYWcgICAwRTIgICAwRTEgIC0+ICAgMQorZGRjdG02NzYgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDBFMiAgLT4gIC0xCitkZGN0bTY3NyBjb21wYXJldG90bWFnICAtMEUyICAgMEUyICAtPiAgIDAKK2RkY3RtNjc4IGNvbXBhcmV0b3RtYWcgICAwRTEgICAwRTIgIC0+ICAtMQorZGRjdG02NzkgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDBFMiAgLT4gICAwCisKKy0tIHRyYWlsaW5nIHplcm9zOyB1bml0LXkKK2RkY3RtNjgwIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMiAgICAgICAgICAgIC0+ICAgMAorZGRjdG02ODEgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAgICAgICAgICAgLT4gICAxCitkZGN0bTY4MiBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAgICAgICAgICAtPiAgIDEKK2RkY3RtNjgzIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAgICAgICAgIC0+ICAgMQorZGRjdG02ODQgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAgICAgICAgLT4gICAxCitkZGN0bTY4NSBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAgICAgICAtPiAgIDEKK2RkY3RtNjg2IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAgICAgIC0+ICAgMQorZGRjdG02ODcgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMDAgICAgLT4gICAxCitkZGN0bTY4OCBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAwMDAgICAtPiAgIDEKK2RkY3RtNjg5IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAwMDAgIC0+ICAgMQorZGRjdG02OTAgY29tcGFyZXRvdG1hZyAgIDEyICAgICAgICAgICAgICAxMiAgLT4gICAwCitkZGN0bTY5MSBjb21wYXJldG90bWFnICAgMTIuMCAgICAgICAgICAgIDEyICAtPiAgLTEKK2RkY3RtNjkyIGNvbXBhcmV0b3RtYWcgICAxMi4wMCAgICAgICAgICAgMTIgIC0+ICAtMQorZGRjdG02OTMgY29tcGFyZXRvdG1hZyAgIDEyLjAwMCAgICAgICAgICAxMiAgLT4gIC0xCitkZGN0bTY5NCBjb21wYXJldG90bWFnICAgMTIuMDAwMCAgICAgICAgIDEyICAtPiAgLTEKK2RkY3RtNjk1IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMCAgICAgICAgMTIgIC0+ICAtMQorZGRjdG02OTYgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMCAgICAgICAxMiAgLT4gIC0xCitkZGN0bTY5NyBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMCAgICAgIDEyICAtPiAgLTEKK2RkY3RtNjk4IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMCAgICAgMTIgIC0+ICAtMQorZGRjdG02OTkgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAwMCAgICAxMiAgLT4gIC0xCisKKy0tIG9sZCBsb25nIG9wZXJhbmQgY2hlY2tzCitkZGN0bTcwMSBjb21wYXJldG90bWFnIDEyMzQ1Njc4MDAwICAxICAtPiAgIDEKK2RkY3RtNzAyIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODAwMCAgIC0+ICAtMQorZGRjdG03MDMgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODAwICAgMSAgLT4gICAxCitkZGN0bTcwNCBjb21wYXJldG90bWFnIDEgMTIzNDU2NzgwMCAgICAtPiAgLTEKK2RkY3RtNzA1IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MCAgIDEgIC0+ICAgMQorZGRjdG03MDYgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTAgICAgLT4gIC0xCitkZGN0bTcwNyBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTEgICAxICAtPiAgIDEKK2RkY3RtNzA4IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkxICAgIC0+ICAtMQorZGRjdG03MDkgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODkwMSAgMSAgLT4gICAxCitkZGN0bTcxMCBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MDEgICAtPiAgLTEKK2RkY3RtNzExIGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5NiAgIDEgIC0+ICAgMQorZGRjdG03MTIgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTYgICAgLT4gIC0xCitkZGN0bTcxMyBjb21wYXJldG90bWFnIC0xMjM0NTY3ODkxICAxICAtPiAgIDEKK2RkY3RtNzE0IGNvbXBhcmV0b3RtYWcgMSAtMTIzNDU2Nzg5MSAgIC0+ICAtMQorZGRjdG03MTUgY29tcGFyZXRvdG1hZyAtMTIzNDU2Nzg5MDEgMSAgLT4gICAxCitkZGN0bTcxNiBjb21wYXJldG90bWFnIDEgLTEyMzQ1Njc4OTAxICAtPiAgLTEKK2RkY3RtNzE3IGNvbXBhcmV0b3RtYWcgLTEyMzQ1Njc4OTYgIDEgIC0+ICAgMQorZGRjdG03MTggY29tcGFyZXRvdG1hZyAxIC0xMjM0NTY3ODk2ICAgLT4gIC0xCisKKy0tIG9sZCByZXNpZHVlIGNhc2VzCitkZGN0bTc0MCBjb21wYXJldG90bWFnICAxICAwLjk5OTk5OTkgICAtPiAgIDEKK2RkY3RtNzQxIGNvbXBhcmV0b3RtYWcgIDEgIDAuOTk5OTk5ICAgIC0+ICAgMQorZGRjdG03NDIgY29tcGFyZXRvdG1hZyAgMSAgMC45OTk5OSAgICAgLT4gICAxCitkZGN0bTc0MyBjb21wYXJldG90bWFnICAxICAxLjAwMDAgICAgICAtPiAgIDEKK2RkY3RtNzQ0IGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMDEgICAgIC0+ICAtMQorZGRjdG03NDUgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwMDEgICAgLT4gIC0xCitkZGN0bTc0NiBjb21wYXJldG90bWFnICAxICAxLjAwMDAwMDEgICAtPiAgLTEKK2RkY3RtNzUwIGNvbXBhcmV0b3RtYWcgIDAuOTk5OTk5OSAgMSAgIC0+ICAtMQorZGRjdG03NTEgY29tcGFyZXRvdG1hZyAgMC45OTk5OTkgICAxICAgLT4gIC0xCitkZGN0bTc1MiBjb21wYXJldG90bWFnICAwLjk5OTk5ICAgIDEgICAtPiAgLTEKK2RkY3RtNzUzIGNvbXBhcmV0b3RtYWcgIDEuMDAwMCAgICAgMSAgIC0+ICAtMQorZGRjdG03NTQgY29tcGFyZXRvdG1hZyAgMS4wMDAwMSAgICAxICAgLT4gICAxCitkZGN0bTc1NSBjb21wYXJldG90bWFnICAxLjAwMDAwMSAgIDEgICAtPiAgIDEKK2RkY3RtNzU2IGNvbXBhcmV0b3RtYWcgIDEuMDAwMDAwMSAgMSAgIC0+ICAgMQorCistLSBTcGVjaWFscworZGRjdG03ODAgY29tcGFyZXRvdG1hZyAgSW5mICAtSW5mICAgLT4gIDAKK2RkY3RtNzgxIGNvbXBhcmV0b3RtYWcgIEluZiAgLTEwMDAgIC0+ICAxCitkZGN0bTc4MiBjb21wYXJldG90bWFnICBJbmYgIC0xICAgICAtPiAgMQorZGRjdG03ODMgY29tcGFyZXRvdG1hZyAgSW5mICAtMCAgICAgLT4gIDEKK2RkY3RtNzg0IGNvbXBhcmV0b3RtYWcgIEluZiAgIDAgICAgIC0+ICAxCitkZGN0bTc4NSBjb21wYXJldG90bWFnICBJbmYgICAxICAgICAtPiAgMQorZGRjdG03ODYgY29tcGFyZXRvdG1hZyAgSW5mICAgMTAwMCAgLT4gIDEKK2RkY3RtNzg3IGNvbXBhcmV0b3RtYWcgIEluZiAgIEluZiAgIC0+ICAwCitkZGN0bTc4OCBjb21wYXJldG90bWFnIC0xMDAwICBJbmYgICAtPiAtMQorZGRjdG03ODkgY29tcGFyZXRvdG1hZyAtSW5mICAgSW5mICAgLT4gIDAKK2RkY3RtNzkwIGNvbXBhcmV0b3RtYWcgLTEgICAgIEluZiAgIC0+IC0xCitkZGN0bTc5MSBjb21wYXJldG90bWFnIC0wICAgICBJbmYgICAtPiAtMQorZGRjdG03OTIgY29tcGFyZXRvdG1hZyAgMCAgICAgSW5mICAgLT4gLTEKK2RkY3RtNzkzIGNvbXBhcmV0b3RtYWcgIDEgICAgIEluZiAgIC0+IC0xCitkZGN0bTc5NCBjb21wYXJldG90bWFnICAxMDAwICBJbmYgICAtPiAtMQorZGRjdG03OTUgY29tcGFyZXRvdG1hZyAgSW5mICAgSW5mICAgLT4gIDAKKworZGRjdG04MDAgY29tcGFyZXRvdG1hZyAtSW5mICAtSW5mICAgLT4gIDAKK2RkY3RtODAxIGNvbXBhcmV0b3RtYWcgLUluZiAgLTEwMDAgIC0+ICAxCitkZGN0bTgwMiBjb21wYXJldG90bWFnIC1JbmYgIC0xICAgICAtPiAgMQorZGRjdG04MDMgY29tcGFyZXRvdG1hZyAtSW5mICAtMCAgICAgLT4gIDEKK2RkY3RtODA0IGNvbXBhcmV0b3RtYWcgLUluZiAgIDAgICAgIC0+ICAxCitkZGN0bTgwNSBjb21wYXJldG90bWFnIC1JbmYgICAxICAgICAtPiAgMQorZGRjdG04MDYgY29tcGFyZXRvdG1hZyAtSW5mICAgMTAwMCAgLT4gIDEKK2RkY3RtODA3IGNvbXBhcmV0b3RtYWcgLUluZiAgIEluZiAgIC0+ICAwCitkZGN0bTgwOCBjb21wYXJldG90bWFnIC1JbmYgIC1JbmYgICAtPiAgMAorZGRjdG04MDkgY29tcGFyZXRvdG1hZyAtMTAwMCAtSW5mICAgLT4gLTEKK2RkY3RtODEwIGNvbXBhcmV0b3RtYWcgLTEgICAgLUluZiAgIC0+IC0xCitkZGN0bTgxMSBjb21wYXJldG90bWFnIC0wICAgIC1JbmYgICAtPiAtMQorZGRjdG04MTIgY29tcGFyZXRvdG1hZyAgMCAgICAtSW5mICAgLT4gLTEKK2RkY3RtODEzIGNvbXBhcmV0b3RtYWcgIDEgICAgLUluZiAgIC0+IC0xCitkZGN0bTgxNCBjb21wYXJldG90bWFnICAxMDAwIC1JbmYgICAtPiAtMQorZGRjdG04MTUgY29tcGFyZXRvdG1hZyAgSW5mICAtSW5mICAgLT4gIDAKKworZGRjdG04MjEgY29tcGFyZXRvdG1hZyAgTmFOIC1JbmYgICAgLT4gIDEKK2RkY3RtODIyIGNvbXBhcmV0b3RtYWcgIE5hTiAtMTAwMCAgIC0+ICAxCitkZGN0bTgyMyBjb21wYXJldG90bWFnICBOYU4gLTEgICAgICAtPiAgMQorZGRjdG04MjQgY29tcGFyZXRvdG1hZyAgTmFOIC0wICAgICAgLT4gIDEKK2RkY3RtODI1IGNvbXBhcmV0b3RtYWcgIE5hTiAgMCAgICAgIC0+ICAxCitkZGN0bTgyNiBjb21wYXJldG90bWFnICBOYU4gIDEgICAgICAtPiAgMQorZGRjdG04MjcgY29tcGFyZXRvdG1hZyAgTmFOICAxMDAwICAgLT4gIDEKK2RkY3RtODI4IGNvbXBhcmV0b3RtYWcgIE5hTiAgSW5mICAgIC0+ICAxCitkZGN0bTgyOSBjb21wYXJldG90bWFnICBOYU4gIE5hTiAgICAtPiAgMAorZGRjdG04MzAgY29tcGFyZXRvdG1hZyAtSW5mICBOYU4gICAgLT4gIC0xCitkZGN0bTgzMSBjb21wYXJldG90bWFnIC0xMDAwIE5hTiAgICAtPiAgLTEKK2RkY3RtODMyIGNvbXBhcmV0b3RtYWcgLTEgICAgTmFOICAgIC0+ICAtMQorZGRjdG04MzMgY29tcGFyZXRvdG1hZyAtMCAgICBOYU4gICAgLT4gIC0xCitkZGN0bTgzNCBjb21wYXJldG90bWFnICAwICAgIE5hTiAgICAtPiAgLTEKK2RkY3RtODM1IGNvbXBhcmV0b3RtYWcgIDEgICAgTmFOICAgIC0+ICAtMQorZGRjdG04MzYgY29tcGFyZXRvdG1hZyAgMTAwMCBOYU4gICAgLT4gIC0xCitkZGN0bTgzNyBjb21wYXJldG90bWFnICBJbmYgIE5hTiAgICAtPiAgLTEKK2RkY3RtODM4IGNvbXBhcmV0b3RtYWcgLU5hTiAtTmFOICAgIC0+ICAwCitkZGN0bTgzOSBjb21wYXJldG90bWFnICtOYU4gLU5hTiAgICAtPiAgMAorZGRjdG04NDAgY29tcGFyZXRvdG1hZyAtTmFOICtOYU4gICAgLT4gIDAKKworZGRjdG04NDEgY29tcGFyZXRvdG1hZyAgc05hTiAtc05hTiAgLT4gIDAKK2RkY3RtODQyIGNvbXBhcmV0b3RtYWcgIHNOYU4gLU5hTiAgIC0+ICAtMQorZGRjdG04NDMgY29tcGFyZXRvdG1hZyAgc05hTiAtSW5mICAgLT4gIDEKK2RkY3RtODQ0IGNvbXBhcmV0b3RtYWcgIHNOYU4gLTEwMDAgIC0+ICAxCitkZGN0bTg0NSBjb21wYXJldG90bWFnICBzTmFOIC0xICAgICAtPiAgMQorZGRjdG04NDYgY29tcGFyZXRvdG1hZyAgc05hTiAtMCAgICAgLT4gIDEKK2RkY3RtODQ3IGNvbXBhcmV0b3RtYWcgIHNOYU4gIDAgICAgIC0+ICAxCitkZGN0bTg0OCBjb21wYXJldG90bWFnICBzTmFOICAxICAgICAtPiAgMQorZGRjdG04NDkgY29tcGFyZXRvdG1hZyAgc05hTiAgMTAwMCAgLT4gIDEKK2RkY3RtODUwIGNvbXBhcmV0b3RtYWcgIHNOYU4gIE5hTiAgIC0+ICAtMQorZGRjdG04NTEgY29tcGFyZXRvdG1hZyAgc05hTiBzTmFOICAgLT4gIDAKKworZGRjdG04NTIgY29tcGFyZXRvdG1hZyAtc05hTiBzTmFOICAgLT4gIDAKK2RkY3RtODUzIGNvbXBhcmV0b3RtYWcgLU5hTiAgc05hTiAgIC0+ICAxCitkZGN0bTg1NCBjb21wYXJldG90bWFnIC1JbmYgIHNOYU4gICAtPiAgLTEKK2RkY3RtODU1IGNvbXBhcmV0b3RtYWcgLTEwMDAgc05hTiAgIC0+ICAtMQorZGRjdG04NTYgY29tcGFyZXRvdG1hZyAtMSAgICBzTmFOICAgLT4gIC0xCitkZGN0bTg1NyBjb21wYXJldG90bWFnIC0wICAgIHNOYU4gICAtPiAgLTEKK2RkY3RtODU4IGNvbXBhcmV0b3RtYWcgIDAgICAgc05hTiAgIC0+ICAtMQorZGRjdG04NTkgY29tcGFyZXRvdG1hZyAgMSAgICBzTmFOICAgLT4gIC0xCitkZGN0bTg2MCBjb21wYXJldG90bWFnICAxMDAwIHNOYU4gICAtPiAgLTEKK2RkY3RtODYxIGNvbXBhcmV0b3RtYWcgIEluZiAgc05hTiAgIC0+ICAtMQorZGRjdG04NjIgY29tcGFyZXRvdG1hZyAgTmFOICBzTmFOICAgLT4gIDEKK2RkY3RtODYzIGNvbXBhcmV0b3RtYWcgIHNOYU4gc05hTiAgIC0+ICAwCisKK2RkY3RtODcxIGNvbXBhcmV0b3RtYWcgIC1zTmFOIC1zTmFOICAtPiAgMAorZGRjdG04NzIgY29tcGFyZXRvdG1hZyAgLXNOYU4gLU5hTiAgIC0+ICAtMQorZGRjdG04NzMgY29tcGFyZXRvdG1hZyAgLXNOYU4gLUluZiAgIC0+ICAxCitkZGN0bTg3NCBjb21wYXJldG90bWFnICAtc05hTiAtMTAwMCAgLT4gIDEKK2RkY3RtODc1IGNvbXBhcmV0b3RtYWcgIC1zTmFOIC0xICAgICAtPiAgMQorZGRjdG04NzYgY29tcGFyZXRvdG1hZyAgLXNOYU4gLTAgICAgIC0+ICAxCitkZGN0bTg3NyBjb21wYXJldG90bWFnICAtc05hTiAgMCAgICAgLT4gIDEKK2RkY3RtODc4IGNvbXBhcmV0b3RtYWcgIC1zTmFOICAxICAgICAtPiAgMQorZGRjdG04NzkgY29tcGFyZXRvdG1hZyAgLXNOYU4gIDEwMDAgIC0+ICAxCitkZGN0bTg4MCBjb21wYXJldG90bWFnICAtc05hTiAgTmFOICAgLT4gIC0xCitkZGN0bTg4MSBjb21wYXJldG90bWFnICAtc05hTiBzTmFOICAgLT4gIDAKKworZGRjdG04ODIgY29tcGFyZXRvdG1hZyAtc05hTiAtc05hTiAgIC0+ICAwCitkZGN0bTg4MyBjb21wYXJldG90bWFnIC1OYU4gIC1zTmFOICAgLT4gIDEKK2RkY3RtODg0IGNvbXBhcmV0b3RtYWcgLUluZiAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODg1IGNvbXBhcmV0b3RtYWcgLTEwMDAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODg2IGNvbXBhcmV0b3RtYWcgLTEgICAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODg3IGNvbXBhcmV0b3RtYWcgLTAgICAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODg4IGNvbXBhcmV0b3RtYWcgIDAgICAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODg5IGNvbXBhcmV0b3RtYWcgIDEgICAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODkwIGNvbXBhcmV0b3RtYWcgIDEwMDAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODkxIGNvbXBhcmV0b3RtYWcgIEluZiAgLXNOYU4gICAtPiAgLTEKK2RkY3RtODkyIGNvbXBhcmV0b3RtYWcgIE5hTiAgLXNOYU4gICAtPiAgMQorZGRjdG04OTMgY29tcGFyZXRvdG1hZyAgc05hTiAtc05hTiAgIC0+ICAwCisKKy0tIE5hTnMgd2l0aCBwYXlsb2FkCitkZGN0bTk2MCBjb21wYXJldG90bWFnICBOYU45IC1JbmYgICAtPiAgMQorZGRjdG05NjEgY29tcGFyZXRvdG1hZyAgTmFOOCAgOTk5ICAgLT4gIDEKK2RkY3RtOTYyIGNvbXBhcmV0b3RtYWcgIE5hTjc3IEluZiAgIC0+ICAxCitkZGN0bTk2MyBjb21wYXJldG90bWFnIC1OYU42NyBOYU41ICAtPiAgMQorZGRjdG05NjQgY29tcGFyZXRvdG1hZyAtSW5mICAtTmFONCAgLT4gIC0xCitkZGN0bTk2NSBjb21wYXJldG90bWFnIC05OTkgIC1OYU4zMyAtPiAgLTEKK2RkY3RtOTY2IGNvbXBhcmV0b3RtYWcgIEluZiAgIE5hTjIgIC0+ICAtMQorCitkZGN0bTk3MCBjb21wYXJldG90bWFnIC1OYU40MSAtTmFONDIgLT4gLTEKK2RkY3RtOTcxIGNvbXBhcmV0b3RtYWcgK05hTjQxIC1OYU40MiAtPiAtMQorZGRjdG05NzIgY29tcGFyZXRvdG1hZyAtTmFONDEgK05hTjQyIC0+IC0xCitkZGN0bTk3MyBjb21wYXJldG90bWFnICtOYU40MSArTmFONDIgLT4gLTEKK2RkY3RtOTc0IGNvbXBhcmV0b3RtYWcgLU5hTjQyIC1OYU4wMSAtPiAgMQorZGRjdG05NzUgY29tcGFyZXRvdG1hZyArTmFONDIgLU5hTjAxIC0+ICAxCitkZGN0bTk3NiBjb21wYXJldG90bWFnIC1OYU40MiArTmFOMDEgLT4gIDEKK2RkY3RtOTc3IGNvbXBhcmV0b3RtYWcgK05hTjQyICtOYU4wMSAtPiAgMQorCitkZGN0bTk4MCBjb21wYXJldG90bWFnIC1zTmFONzcxIC1zTmFONzcyIC0+IC0xCitkZGN0bTk4MSBjb21wYXJldG90bWFnICtzTmFONzcxIC1zTmFONzcyIC0+IC0xCitkZGN0bTk4MiBjb21wYXJldG90bWFnIC1zTmFONzcxICtzTmFONzcyIC0+IC0xCitkZGN0bTk4MyBjb21wYXJldG90bWFnICtzTmFONzcxICtzTmFONzcyIC0+IC0xCitkZGN0bTk4NCBjb21wYXJldG90bWFnIC1zTmFONzcyIC1zTmFONzcxIC0+ICAxCitkZGN0bTk4NSBjb21wYXJldG90bWFnICtzTmFONzcyIC1zTmFONzcxIC0+ICAxCitkZGN0bTk4NiBjb21wYXJldG90bWFnIC1zTmFONzcyICtzTmFONzcxIC0+ICAxCitkZGN0bTk4NyBjb21wYXJldG90bWFnICtzTmFONzcyICtzTmFONzcxIC0+ICAxCisKK2RkY3RtOTkxIGNvbXBhcmV0b3RtYWcgLXNOYU45OSAtSW5mICAgIC0+ICAxCitkZGN0bTk5MiBjb21wYXJldG90bWFnICBzTmFOOTggLTExICAgICAtPiAgMQorZGRjdG05OTMgY29tcGFyZXRvdG1hZyAgc05hTjk3ICBOYU4gICAgLT4gLTEKK2RkY3RtOTk0IGNvbXBhcmV0b3RtYWcgIHNOYU4xNiBzTmFOOTQgIC0+IC0xCitkZGN0bTk5NSBjb21wYXJldG90bWFnICBOYU44NSAgc05hTjgzICAtPiAgMQorZGRjdG05OTYgY29tcGFyZXRvdG1hZyAtSW5mICAgIHNOYU45MiAgLT4gLTEKK2RkY3RtOTk3IGNvbXBhcmV0b3RtYWcgIDA4OCAgICBzTmFOODEgIC0+IC0xCitkZGN0bTk5OCBjb21wYXJldG90bWFnICBJbmYgICAgc05hTjkwICAtPiAtMQorZGRjdG05OTkgY29tcGFyZXRvdG1hZyAgTmFOICAgLXNOYU44OSAgLT4gIDEKKworLS0gc3ByZWFkIHplcm9zCitkZGN0bTExMTAgY29tcGFyZXRvdG1hZyAgIDBFLTM4MyAgMCAgICAgICAgLT4gIC0xCitkZGN0bTExMTEgY29tcGFyZXRvdG1hZyAgIDBFLTM4MyAtMCAgICAgICAgLT4gIC0xCitkZGN0bTExMTIgY29tcGFyZXRvdG1hZyAgLTBFLTM4MyAgMCAgICAgICAgLT4gIC0xCitkZGN0bTExMTMgY29tcGFyZXRvdG1hZyAgLTBFLTM4MyAtMCAgICAgICAgLT4gIC0xCitkZGN0bTExMTQgY29tcGFyZXRvdG1hZyAgIDBFLTM4MyAgMEUrMzg0ICAgLT4gIC0xCitkZGN0bTExMTUgY29tcGFyZXRvdG1hZyAgIDBFLTM4MyAtMEUrMzg0ICAgLT4gIC0xCitkZGN0bTExMTYgY29tcGFyZXRvdG1hZyAgLTBFLTM4MyAgMEUrMzg0ICAgLT4gIC0xCitkZGN0bTExMTcgY29tcGFyZXRvdG1hZyAgLTBFLTM4MyAtMEUrMzg0ICAgLT4gIC0xCitkZGN0bTExMTggY29tcGFyZXRvdG1hZyAgIDAgICAgICAgMEUrMzg0ICAgLT4gIC0xCitkZGN0bTExMTkgY29tcGFyZXRvdG1hZyAgIDAgICAgICAtMEUrMzg0ICAgLT4gIC0xCitkZGN0bTExMjAgY29tcGFyZXRvdG1hZyAgLTAgICAgICAgMEUrMzg0ICAgLT4gIC0xCitkZGN0bTExMjEgY29tcGFyZXRvdG1hZyAgLTAgICAgICAtMEUrMzg0ICAgLT4gIC0xCisKK2RkY3RtMTEzMCBjb21wYXJldG90bWFnICAgMEUrMzg0ICAwICAgICAgICAtPiAgIDEKK2RkY3RtMTEzMSBjb21wYXJldG90bWFnICAgMEUrMzg0IC0wICAgICAgICAtPiAgIDEKK2RkY3RtMTEzMiBjb21wYXJldG90bWFnICAtMEUrMzg0ICAwICAgICAgICAtPiAgIDEKK2RkY3RtMTEzMyBjb21wYXJldG90bWFnICAtMEUrMzg0IC0wICAgICAgICAtPiAgIDEKK2RkY3RtMTEzNCBjb21wYXJldG90bWFnICAgMEUrMzg0ICAwRS0zODMgICAtPiAgIDEKK2RkY3RtMTEzNSBjb21wYXJldG90bWFnICAgMEUrMzg0IC0wRS0zODMgICAtPiAgIDEKK2RkY3RtMTEzNiBjb21wYXJldG90bWFnICAtMEUrMzg0ICAwRS0zODMgICAtPiAgIDEKK2RkY3RtMTEzNyBjb21wYXJldG90bWFnICAtMEUrMzg0IC0wRS0zODMgICAtPiAgIDEKK2RkY3RtMTEzOCBjb21wYXJldG90bWFnICAgMCAgICAgICAwRS0zODMgICAtPiAgIDEKK2RkY3RtMTEzOSBjb21wYXJldG90bWFnICAgMCAgICAgIC0wRS0zODMgICAtPiAgIDEKK2RkY3RtMTE0MCBjb21wYXJldG90bWFnICAtMCAgICAgICAwRS0zODMgICAtPiAgIDEKK2RkY3RtMTE0MSBjb21wYXJldG90bWFnICAtMCAgICAgIC0wRS0zODMgICAtPiAgIDEKKworLS0gTnVsbCB0ZXN0cworZGRjdG05OTkwIGNvbXBhcmV0b3RtYWcgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGN0bTk5OTEgY29tcGFyZXRvdG1hZyAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29weS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTc1YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29weS5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb3B5LmRlY1Rlc3QgLS0gcXVpZXQgZGVjRG91YmxlIGNvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkZGNweTAwMSBjb3B5ICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2RkY3B5MDExIGNvcHkgIEluZmluaXR5ICAgIC0+IEluZmluaXR5CitkZGNweTAxMiBjb3B5ICAtSW5maW5pdHkgICAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkZGNweTAyMSBjb3B5ICAgICAgICAgTmFOICAtPiBOYU4KK2RkY3B5MDIyIGNvcHkgICAgICAgIC1OYU4gIC0+IC1OYU4KK2RkY3B5MDIzIGNvcHkgICAgICAgIHNOYU4gIC0+IHNOYU4KK2RkY3B5MDI0IGNvcHkgICAgICAgLXNOYU4gIC0+IC1zTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RkY3B5MDMxIGNvcHkgICAgICAgTmFOMTAgIC0+IE5hTjEwCitkZGNweTAzMiBjb3B5ICAgICAgLU5hTjEwICAtPiAtTmFOMTAKK2RkY3B5MDMzIGNvcHkgICAgICBzTmFOMTAgIC0+IHNOYU4xMAorZGRjcHkwMzQgY29weSAgICAgLXNOYU4xMCAgLT4gLXNOYU4xMAorZGRjcHkwMzUgY29weSAgICAgICBOYU43ICAgLT4gTmFONworZGRjcHkwMzYgY29weSAgICAgIC1OYU43ICAgLT4gLU5hTjcKK2RkY3B5MDM3IGNvcHkgICAgICBzTmFOMTAxIC0+IHNOYU4xMDEKK2RkY3B5MDM4IGNvcHkgICAgIC1zTmFOMTAxIC0+IC1zTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RkY3B5MTAxIGNvcHkgICAgICAgICAgNyAgIC0+IDcKK2RkY3B5MTAyIGNvcHkgICAgICAgICAtNyAgIC0+IC03CitkZGNweTEwMyBjb3B5ICAgICAgICAgNzUgICAtPiA3NQorZGRjcHkxMDQgY29weSAgICAgICAgLTc1ICAgLT4gLTc1CitkZGNweTEwNSBjb3B5ICAgICAgIDcuNTAgICAtPiA3LjUwCitkZGNweTEwNiBjb3B5ICAgICAgLTcuNTAgICAtPiAtNy41MAorZGRjcHkxMDcgY29weSAgICAgICA3LjUwMCAgLT4gNy41MDAKK2RkY3B5MTA4IGNvcHkgICAgICAtNy41MDAgIC0+IC03LjUwMAorCistLSB6ZXJvcworZGRjcHkxMTEgY29weSAgICAgICAgICAwICAgLT4gMAorZGRjcHkxMTIgY29weSAgICAgICAgIC0wICAgLT4gLTAKK2RkY3B5MTEzIGNvcHkgICAgICAgMEUrNCAgIC0+IDBFKzQKK2RkY3B5MTE0IGNvcHkgICAgICAtMEUrNCAgIC0+IC0wRSs0CitkZGNweTExNSBjb3B5ICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RkY3B5MTE2IGNvcHkgICAgLTAuMDAwMCAgIC0+IC0wLjAwMDAKK2RkY3B5MTE3IGNvcHkgICAgICAwRS0xNDEgIC0+IDBFLTE0MQorZGRjcHkxMTggY29weSAgICAgLTBFLTE0MSAgLT4gLTBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRjcHkxMjEgY29weSAgMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgIC0+IDI2ODI2ODI2ODI2ODI2ODIKK2RkY3B5MTIyIGNvcHkgIC0yNjgyNjgyNjgyNjgyNjgyICAgICAgICAtPiAtMjY4MjY4MjY4MjY4MjY4MgorZGRjcHkxMjMgY29weSAgMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgIC0+IDEzNDEzNDEzNDEzNDEzNDEKK2RkY3B5MTI0IGNvcHkgIC0xMzQxMzQxMzQxMzQxMzQxICAgICAgICAtPiAtMTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZGRjcHkxMzEgY29weSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkY3B5MTMyIGNvcHkgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAtPiAxRS0zODMKK2RkY3B5MTMzIGNvcHkgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNweTEzNCBjb3B5ICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4CisKK2RkY3B5MTM1IGNvcHkgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAtMUUtMzk4CitkZGNweTEzNiBjb3B5ICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkY3B5MTM3IGNvcHkgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAtMUUtMzgzCitkZGNweTEzOCBjb3B5ICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5QWJzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29weUFicy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjNjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29weUFicy5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb3B5QWJzLmRlY1Rlc3QgLS0gcXVpZXQgZGVjRG91YmxlIGNvcHkgYW5kIHNldCBzaWduIHRvIHplcm8gICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkZGNwYTAwMSBjb3B5YWJzICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2RkY3BhMDExIGNvcHlhYnMgIEluZmluaXR5ICAgIC0+IEluZmluaXR5CitkZGNwYTAxMiBjb3B5YWJzICAtSW5maW5pdHkgICAtPiBJbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RkY3BhMDIxIGNvcHlhYnMgICAgICAgICBOYU4gIC0+IE5hTgorZGRjcGEwMjIgY29weWFicyAgICAgICAgLU5hTiAgLT4gTmFOCitkZGNwYTAyMyBjb3B5YWJzICAgICAgICBzTmFOICAtPiBzTmFOCitkZGNwYTAyNCBjb3B5YWJzICAgICAgIC1zTmFOICAtPiBzTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RkY3BhMDMxIGNvcHlhYnMgICAgICAgTmFOMTAgIC0+IE5hTjEwCitkZGNwYTAzMiBjb3B5YWJzICAgICAgLU5hTjE1ICAtPiBOYU4xNQorZGRjcGEwMzMgY29weWFicyAgICAgIHNOYU4xNSAgLT4gc05hTjE1CitkZGNwYTAzNCBjb3B5YWJzICAgICAtc05hTjEwICAtPiBzTmFOMTAKK2RkY3BhMDM1IGNvcHlhYnMgICAgICAgTmFONyAgIC0+IE5hTjcKK2RkY3BhMDM2IGNvcHlhYnMgICAgICAtTmFONyAgIC0+IE5hTjcKK2RkY3BhMDM3IGNvcHlhYnMgICAgICBzTmFOMTAxIC0+IHNOYU4xMDEKK2RkY3BhMDM4IGNvcHlhYnMgICAgIC1zTmFOMTAxIC0+IHNOYU4xMDEKKworLS0gZmluaXRlcworZGRjcGExMDEgY29weWFicyAgICAgICAgICA3ICAgLT4gNworZGRjcGExMDIgY29weWFicyAgICAgICAgIC03ICAgLT4gNworZGRjcGExMDMgY29weWFicyAgICAgICAgIDc1ICAgLT4gNzUKK2RkY3BhMTA0IGNvcHlhYnMgICAgICAgIC03NSAgIC0+IDc1CitkZGNwYTEwNSBjb3B5YWJzICAgICAgIDcuMTAgICAtPiA3LjEwCitkZGNwYTEwNiBjb3B5YWJzICAgICAgLTcuMTAgICAtPiA3LjEwCitkZGNwYTEwNyBjb3B5YWJzICAgICAgIDcuNTAwICAtPiA3LjUwMAorZGRjcGExMDggY29weWFicyAgICAgIC03LjUwMCAgLT4gNy41MDAKKworLS0gemVyb3MKK2RkY3BhMTExIGNvcHlhYnMgICAgICAgICAgMCAgIC0+IDAKK2RkY3BhMTEyIGNvcHlhYnMgICAgICAgICAtMCAgIC0+IDAKK2RkY3BhMTEzIGNvcHlhYnMgICAgICAgMEUrNiAgIC0+IDBFKzYKK2RkY3BhMTE0IGNvcHlhYnMgICAgICAtMEUrNiAgIC0+IDBFKzYKK2RkY3BhMTE1IGNvcHlhYnMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZGRjcGExMTYgY29weWFicyAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitkZGNwYTExNyBjb3B5YWJzICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RkY3BhMTE4IGNvcHlhYnMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRjcGExMjEgY29weWFicyAgMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgIC0+IDI2ODI2ODI2ODI2ODI2ODIKK2RkY3BhMTIyIGNvcHlhYnMgIC0yNjgyNjgyNjgyNjgyNjgyICAgICAgICAtPiAyNjgyNjgyNjgyNjgyNjgyCitkZGNwYTEyMyBjb3B5YWJzICAxMzQxMzQxMzQxMzQxMzQxICAgICAgICAgLT4gMTM0MTM0MTM0MTM0MTM0MQorZGRjcGExMjQgY29weWFicyAgLTEzNDEzNDEzNDEzNDEzNDEgICAgICAgIC0+IDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RkY3BhMTMxIGNvcHlhYnMgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZGNwYTEzMiBjb3B5YWJzICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gMUUtMzgzCitkZGNwYTEzMyBjb3B5YWJzICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRjcGExMzQgY29weWFicyAgMUUtMzk4ICAgICAgICAgICAgICAgICAgIC0+IDFFLTM5OAorCitkZGNwYTEzNSBjb3B5YWJzICAtMUUtMzk4ICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4CitkZGNwYTEzNiBjb3B5YWJzICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRjcGExMzcgY29weWFicyAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IDFFLTM4MworZGRjcGExMzggY29weWFicyAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5TmVnYXRlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29weU5lZ2F0ZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMTk0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkQ29weU5lZ2F0ZS5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRDb3B5TmVnYXRlLmRlY1Rlc3QgLS0gcXVpZXQgZGVjRG91YmxlIGNvcHkgYW5kIG5lZ2F0ZSAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkZGNwbjAwMSBjb3B5bmVnYXRlICAgICAgICs3LjUwICAtPiAtNy41MAorCistLSBJbmZpbml0aWVzCitkZGNwbjAxMSBjb3B5bmVnYXRlICBJbmZpbml0eSAgICAtPiAtSW5maW5pdHkKK2RkY3BuMDEyIGNvcHluZWdhdGUgIC1JbmZpbml0eSAgIC0+IEluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorZGRjcG4wMjEgY29weW5lZ2F0ZSAgICAgICAgIE5hTiAgLT4gLU5hTgorZGRjcG4wMjIgY29weW5lZ2F0ZSAgICAgICAgLU5hTiAgLT4gTmFOCitkZGNwbjAyMyBjb3B5bmVnYXRlICAgICAgICBzTmFOICAtPiAtc05hTgorZGRjcG4wMjQgY29weW5lZ2F0ZSAgICAgICAtc05hTiAgLT4gc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkZGNwbjAzMSBjb3B5bmVnYXRlICAgICAgIE5hTjEzICAtPiAtTmFOMTMKK2RkY3BuMDMyIGNvcHluZWdhdGUgICAgICAtTmFOMTMgIC0+IE5hTjEzCitkZGNwbjAzMyBjb3B5bmVnYXRlICAgICAgc05hTjEzICAtPiAtc05hTjEzCitkZGNwbjAzNCBjb3B5bmVnYXRlICAgICAtc05hTjEzICAtPiBzTmFOMTMKK2RkY3BuMDM1IGNvcHluZWdhdGUgICAgICAgTmFONzAgIC0+IC1OYU43MAorZGRjcG4wMzYgY29weW5lZ2F0ZSAgICAgIC1OYU43MCAgLT4gTmFONzAKK2RkY3BuMDM3IGNvcHluZWdhdGUgICAgICBzTmFOMTAxIC0+IC1zTmFOMTAxCitkZGNwbjAzOCBjb3B5bmVnYXRlICAgICAtc05hTjEwMSAtPiBzTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RkY3BuMTAxIGNvcHluZWdhdGUgICAgICAgICAgNyAgIC0+IC03CitkZGNwbjEwMiBjb3B5bmVnYXRlICAgICAgICAgLTcgICAtPiA3CitkZGNwbjEwMyBjb3B5bmVnYXRlICAgICAgICAgNzUgICAtPiAtNzUKK2RkY3BuMTA0IGNvcHluZWdhdGUgICAgICAgIC03NSAgIC0+IDc1CitkZGNwbjEwNSBjb3B5bmVnYXRlICAgICAgIDcuNTAgICAtPiAtNy41MAorZGRjcG4xMDYgY29weW5lZ2F0ZSAgICAgIC03LjUwICAgLT4gNy41MAorZGRjcG4xMDcgY29weW5lZ2F0ZSAgICAgICA3LjUwMCAgLT4gLTcuNTAwCitkZGNwbjEwOCBjb3B5bmVnYXRlICAgICAgLTcuNTAwICAtPiA3LjUwMAorCistLSB6ZXJvcworZGRjcG4xMTEgY29weW5lZ2F0ZSAgICAgICAgICAwICAgLT4gLTAKK2RkY3BuMTEyIGNvcHluZWdhdGUgICAgICAgICAtMCAgIC0+IDAKK2RkY3BuMTEzIGNvcHluZWdhdGUgICAgICAgMEUrNCAgIC0+IC0wRSs0CitkZGNwbjExNCBjb3B5bmVnYXRlICAgICAgLTBFKzQgICAtPiAwRSs0CitkZGNwbjExNSBjb3B5bmVnYXRlICAgICAwLjAwMDAgICAtPiAtMC4wMDAwCitkZGNwbjExNiBjb3B5bmVnYXRlICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2RkY3BuMTE3IGNvcHluZWdhdGUgICAgICAwRS0xNDEgIC0+IC0wRS0xNDEKK2RkY3BuMTE4IGNvcHluZWdhdGUgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZGRjcG4xMjEgY29weW5lZ2F0ZSAgMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgIC0+IC0yNjgyNjgyNjgyNjgyNjgyCitkZGNwbjEyMiBjb3B5bmVnYXRlICAtMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRjcG4xMjMgY29weW5lZ2F0ZSAgMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgIC0+IC0xMzQxMzQxMzQxMzQxMzQxCitkZGNwbjEyNCBjb3B5bmVnYXRlICAtMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgLT4gMTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZGRjcG4xMzEgY29weW5lZ2F0ZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZGNwbjEzMiBjb3B5bmVnYXRlICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gLTFFLTM4MworZGRjcG4xMzMgY29weW5lZ2F0ZSAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwbjEzNCBjb3B5bmVnYXRlICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gLTFFLTM5OAorCitkZGNwbjEzNSBjb3B5bmVnYXRlICAtMUUtMzk4ICAgICAgICAgICAgICAgICAgLT4gMUUtMzk4CitkZGNwbjEzNiBjb3B5bmVnYXRlICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRjcG4xMzcgY29weW5lZ2F0ZSAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IDFFLTM4MworZGRjcG4xMzggY29weW5lZ2F0ZSAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5U2lnbi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZENvcHlTaWduLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5NTQ0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRDb3B5U2lnbi5kZWNUZXN0CkBAIC0wLDAgKzEsMTc1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkQ29weVNpZ24uZGVjVGVzdCAtLSBxdWlldCBkZWNEb3VibGUgY29weSB3aXRoIHNpZ24gZnJvbSByaHMgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZGRjcHMwMDEgY29weXNpZ24gICAgICAgKzcuNTAgICAgIDExIC0+IDcuNTAKKworLS0gSW5maW5pdGllcworZGRjcHMwMTEgY29weXNpZ24gIEluZmluaXR5ICAgICAgIDExIC0+IEluZmluaXR5CitkZGNwczAxMiBjb3B5c2lnbiAgLUluZmluaXR5ICAgICAgMTEgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkZGNwczAyMSBjb3B5c2lnbiAgICAgICAgIE5hTiAgICAgMTEgLT4gTmFOCitkZGNwczAyMiBjb3B5c2lnbiAgICAgICAgLU5hTiAgICAgMTEgLT4gTmFOCitkZGNwczAyMyBjb3B5c2lnbiAgICAgICAgc05hTiAgICAgMTEgLT4gc05hTgorZGRjcHMwMjQgY29weXNpZ24gICAgICAgLXNOYU4gICAgIDExIC0+IHNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZGRjcHMwMzEgY29weXNpZ24gICAgICAgTmFOMTAgICAgIDExIC0+IE5hTjEwCitkZGNwczAzMiBjb3B5c2lnbiAgICAgIC1OYU4xMCAgICAgMTEgLT4gTmFOMTAKK2RkY3BzMDMzIGNvcHlzaWduICAgICAgc05hTjEwICAgICAxMSAtPiBzTmFOMTAKK2RkY3BzMDM0IGNvcHlzaWduICAgICAtc05hTjEwICAgICAxMSAtPiBzTmFOMTAKK2RkY3BzMDM1IGNvcHlzaWduICAgICAgIE5hTjcgICAgICAxMSAtPiBOYU43CitkZGNwczAzNiBjb3B5c2lnbiAgICAgIC1OYU43ICAgICAgMTEgLT4gTmFONworZGRjcHMwMzcgY29weXNpZ24gICAgICBzTmFOMTAxICAgIDExIC0+IHNOYU4xMDEKK2RkY3BzMDM4IGNvcHlzaWduICAgICAtc05hTjEwMSAgICAxMSAtPiBzTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RkY3BzMTAxIGNvcHlzaWduICAgICAgICAgIDcgICAgICAxMSAtPiA3CitkZGNwczEwMiBjb3B5c2lnbiAgICAgICAgIC03ICAgICAgMTEgLT4gNworZGRjcHMxMDMgY29weXNpZ24gICAgICAgICA3NSAgICAgIDExIC0+IDc1CitkZGNwczEwNCBjb3B5c2lnbiAgICAgICAgLTc1ICAgICAgMTEgLT4gNzUKK2RkY3BzMTA1IGNvcHlzaWduICAgICAgIDcuNTAgICAgICAxMSAtPiA3LjUwCitkZGNwczEwNiBjb3B5c2lnbiAgICAgIC03LjUwICAgICAgMTEgLT4gNy41MAorZGRjcHMxMDcgY29weXNpZ24gICAgICAgNy41MDAgICAgIDExIC0+IDcuNTAwCitkZGNwczEwOCBjb3B5c2lnbiAgICAgIC03LjUwMCAgICAgMTEgLT4gNy41MDAKKworLS0gemVyb3MKK2RkY3BzMTExIGNvcHlzaWduICAgICAgICAgIDAgICAgICAxMSAtPiAwCitkZGNwczExMiBjb3B5c2lnbiAgICAgICAgIC0wICAgICAgMTEgLT4gMAorZGRjcHMxMTMgY29weXNpZ24gICAgICAgMEUrNCAgICAgIDExIC0+IDBFKzQKK2RkY3BzMTE0IGNvcHlzaWduICAgICAgLTBFKzQgICAgICAxMSAtPiAwRSs0CitkZGNwczExNSBjb3B5c2lnbiAgICAgMC4wMDAwICAgICAgMTEgLT4gMC4wMDAwCitkZGNwczExNiBjb3B5c2lnbiAgICAtMC4wMDAwICAgICAgMTEgLT4gMC4wMDAwCitkZGNwczExNyBjb3B5c2lnbiAgICAgIDBFLTE0MSAgICAgMTEgLT4gMEUtMTQxCitkZGNwczExOCBjb3B5c2lnbiAgICAgLTBFLTE0MSAgICAgMTEgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkZGNwczEyMSBjb3B5c2lnbiAgMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgICAgIDExIC0+IDI2ODI2ODI2ODI2ODI2ODIKK2RkY3BzMTIyIGNvcHlzaWduICAtMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgICAgMTEgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRjcHMxMjMgY29weXNpZ24gIDEzNDEzNDEzNDEzNDEzNDEgICAgICAgICAgICAxMSAtPiAxMzQxMzQxMzQxMzQxMzQxCitkZGNwczEyNCBjb3B5c2lnbiAgLTEzNDEzNDEzNDEzNDEzNDEgICAgICAgICAgIDExIC0+IDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RkY3BzMTMxIGNvcHlzaWduICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMTEgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRjcHMxMzIgY29weXNpZ24gIDFFLTM4MyAgICAgICAgICAgICAgICAgICAgICAxMSAtPiAxRS0zODMKK2RkY3BzMTMzIGNvcHlzaWduICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMTEgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRjcHMxMzQgY29weXNpZ24gIDFFLTM5OCAgICAgICAgICAgICAgICAgICAgICAxMSAtPiAxRS0zOTgKKworZGRjcHMxMzUgY29weXNpZ24gIC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAxMSAtPiAxRS0zOTgKK2RkY3BzMTM2IGNvcHlzaWduICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgMTEgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRjcHMxMzcgY29weXNpZ24gIC0xRS0zODMgICAgICAgICAgICAgICAgICAgICAxMSAtPiAxRS0zODMKK2RkY3BzMTM4IGNvcHlzaWduICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgMTEgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorCistLSByZXBlYXQgd2l0aCBuZWdhdGl2ZSBSSFMKKworLS0gSW5maW5pdGllcworZGRjcHMyMTEgY29weXNpZ24gIEluZmluaXR5ICAgICAgIC0zNCAtPiAtSW5maW5pdHkKK2RkY3BzMjEyIGNvcHlzaWduICAtSW5maW5pdHkgICAgICAtMzQgLT4gLUluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorZGRjcHMyMjEgY29weXNpZ24gICAgICAgICBOYU4gICAgIC0zNCAtPiAtTmFOCitkZGNwczIyMiBjb3B5c2lnbiAgICAgICAgLU5hTiAgICAgLTM0IC0+IC1OYU4KK2RkY3BzMjIzIGNvcHlzaWduICAgICAgICBzTmFOICAgICAtMzQgLT4gLXNOYU4KK2RkY3BzMjI0IGNvcHlzaWduICAgICAgIC1zTmFOICAgICAtMzQgLT4gLXNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZGRjcHMyMzEgY29weXNpZ24gICAgICAgTmFOMTAgICAgIC0zNCAtPiAtTmFOMTAKK2RkY3BzMjMyIGNvcHlzaWduICAgICAgLU5hTjEwICAgICAtMzQgLT4gLU5hTjEwCitkZGNwczIzMyBjb3B5c2lnbiAgICAgIHNOYU4xMCAgICAgLTM0IC0+IC1zTmFOMTAKK2RkY3BzMjM0IGNvcHlzaWduICAgICAtc05hTjEwICAgICAtMzQgLT4gLXNOYU4xMAorZGRjcHMyMzUgY29weXNpZ24gICAgICAgTmFONyAgICAgIC0zNCAtPiAtTmFONworZGRjcHMyMzYgY29weXNpZ24gICAgICAtTmFONyAgICAgIC0zNCAtPiAtTmFONworZGRjcHMyMzcgY29weXNpZ24gICAgICBzTmFOMTAxICAgIC0zNCAtPiAtc05hTjEwMQorZGRjcHMyMzggY29weXNpZ24gICAgIC1zTmFOMTAxICAgIC0zNCAtPiAtc05hTjEwMQorCistLSBmaW5pdGVzCitkZGNwczMwMSBjb3B5c2lnbiAgICAgICAgICA3ICAgICAgLTM0IC0+IC03CitkZGNwczMwMiBjb3B5c2lnbiAgICAgICAgIC03ICAgICAgLTM0IC0+IC03CitkZGNwczMwMyBjb3B5c2lnbiAgICAgICAgIDc1ICAgICAgLTM0IC0+IC03NQorZGRjcHMzMDQgY29weXNpZ24gICAgICAgIC03NSAgICAgIC0zNCAtPiAtNzUKK2RkY3BzMzA1IGNvcHlzaWduICAgICAgIDcuNTAgICAgICAtMzQgLT4gLTcuNTAKK2RkY3BzMzA2IGNvcHlzaWduICAgICAgLTcuNTAgICAgICAtMzQgLT4gLTcuNTAKK2RkY3BzMzA3IGNvcHlzaWduICAgICAgIDcuNTAwICAgICAtMzQgLT4gLTcuNTAwCitkZGNwczMwOCBjb3B5c2lnbiAgICAgIC03LjUwMCAgICAgLTM0IC0+IC03LjUwMAorCistLSB6ZXJvcworZGRjcHMzMTEgY29weXNpZ24gICAgICAgICAgMCAgICAgIC0zNCAtPiAtMAorZGRjcHMzMTIgY29weXNpZ24gICAgICAgICAtMCAgICAgIC0zNCAtPiAtMAorZGRjcHMzMTMgY29weXNpZ24gICAgICAgMEUrNCAgICAgIC0zNCAtPiAtMEUrNAorZGRjcHMzMTQgY29weXNpZ24gICAgICAtMEUrNCAgICAgIC0zNCAtPiAtMEUrNAorZGRjcHMzMTUgY29weXNpZ24gICAgIDAuMDAwMCAgICAgIC0zNCAtPiAtMC4wMDAwCitkZGNwczMxNiBjb3B5c2lnbiAgICAtMC4wMDAwICAgICAgLTM0IC0+IC0wLjAwMDAKK2RkY3BzMzE3IGNvcHlzaWduICAgICAgMEUtMTQxICAgICAtMzQgLT4gLTBFLTE0MQorZGRjcHMzMTggY29weXNpZ24gICAgIC0wRS0xNDEgICAgIC0zNCAtPiAtMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkZGNwczMyMSBjb3B5c2lnbiAgMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgICAgIC0zNCAtPiAtMjY4MjY4MjY4MjY4MjY4MgorZGRjcHMzMjIgY29weXNpZ24gIC0yNjgyNjgyNjgyNjgyNjgyICAgICAgICAgICAtMzQgLT4gLTI2ODI2ODI2ODI2ODI2ODIKK2RkY3BzMzIzIGNvcHlzaWduICAxMzQxMzQxMzQxMzQxMzQxICAgICAgICAgICAgLTM0IC0+IC0xMzQxMzQxMzQxMzQxMzQxCitkZGNwczMyNCBjb3B5c2lnbiAgLTEzNDEzNDEzNDEzNDEzNDEgICAgICAgICAgIC0zNCAtPiAtMTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZGRjcHMzMzEgY29weXNpZ24gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAtMzQgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkY3BzMzMyIGNvcHlzaWduICAxRS0zODMgICAgICAgICAgICAgICAgICAgICAgLTM0IC0+IC0xRS0zODMKK2RkY3BzMzMzIGNvcHlzaWduICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgLTM0IC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwczMzNCBjb3B5c2lnbiAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgIC0zNCAtPiAtMUUtMzk4CisKK2RkY3BzMzM1IGNvcHlzaWduICAtMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgLTM0IC0+IC0xRS0zOTgKK2RkY3BzMzM2IGNvcHlzaWduICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTM0IC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZGNwczMzNyBjb3B5c2lnbiAgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgIC0zNCAtPiAtMUUtMzgzCitkZGNwczMzOCBjb3B5c2lnbiAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgIC0zNCAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorCistLSBPdGhlciBraW5kcyBvZiBSSFMKK2RkY3BzNDAxIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtMzQgLT4gLTcwMQorZGRjcHM0MDIgY29weXNpZ24gICAgICAgICAtNzIwICAgIC0zNCAtPiAtNzIwCitkZGNwczQwMyBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgLTAgIC0+IC03MDEKK2RkY3BzNDA0IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtMCAgLT4gLTcyMAorZGRjcHM0MDUgY29weXNpZ24gICAgICAgICAgNzAxICAgICswICAtPiAgNzAxCitkZGNwczQwNiBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgKzAgIC0+ICA3MjAKK2RkY3BzNDA3IGNvcHlzaWduICAgICAgICAgIDcwMSAgICArMzQgLT4gIDcwMQorZGRjcHM0MDggY29weXNpZ24gICAgICAgICAtNzIwICAgICszNCAtPiAgNzIwCisKK2RkY3BzNDEzIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtSW5mICAtPiAtNzAxCitkZGNwczQxNCBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLUluZiAgLT4gLTcyMAorZGRjcHM0MTUgY29weXNpZ24gICAgICAgICAgNzAxICAgICtJbmYgIC0+ICA3MDEKK2RkY3BzNDE2IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArSW5mICAtPiAgNzIwCisKK2RkY3BzNDIwIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtTmFOICAtPiAtNzAxCitkZGNwczQyMSBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLU5hTiAgLT4gLTcyMAorZGRjcHM0MjIgY29weXNpZ24gICAgICAgICAgNzAxICAgICtOYU4gIC0+ICA3MDEKK2RkY3BzNDIzIGNvcHlzaWduICAgICAgICAgLTcyMCAgICArTmFOICAtPiAgNzIwCitkZGNwczQyNSBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgK05hTjggLT4gIDcyMAorCitkZGNwczQyNiBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgLXNOYU4gIC0+IC03MDEKK2RkY3BzNDI3IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtc05hTiAgLT4gLTcyMAorZGRjcHM0MjggY29weXNpZ24gICAgICAgICAgNzAxICAgICtzTmFOICAtPiAgNzAxCitkZGNwczQyOSBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgK3NOYU4gIC0+ICA3MjAKK2RkY3BzNDMwIGNvcHlzaWduICAgICAgICAgLTcyMCAgICArc05hTjMgLT4gIDcyMAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRGl2aWRlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRGl2aWRlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE5ZGIyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGREaXZpZGUuZGVjVGVzdApAQCAtMCwwICsxLDg2MyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZERpdmlkZS5kZWNUZXN0IC0tIGRlY0RvdWJsZSBkaXZpc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZGRpdjAwMSBkaXZpZGUgIDEgICAgIDEgICAgLT4gIDEKK2RkZGl2MDAyIGRpdmlkZSAgMiAgICAgMSAgICAtPiAgMgorZGRkaXYwMDMgZGl2aWRlICAxICAgICAyICAgIC0+ICAwLjUKK2RkZGl2MDA0IGRpdmlkZSAgMiAgICAgMiAgICAtPiAgMQorZGRkaXYwMDUgZGl2aWRlICAwICAgICAxICAgIC0+ICAwCitkZGRpdjAwNiBkaXZpZGUgIDAgICAgIDIgICAgLT4gIDAKK2RkZGl2MDA3IGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGRkaXYwMDggZGl2aWRlICAyICAgICAzICAgIC0+ICAwLjY2NjY2NjY2NjY2NjY2NjcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjAwOSBkaXZpZGUgIDMgICAgIDMgICAgLT4gIDEKKworZGRkaXYwMTAgZGl2aWRlICAyLjQgICAxICAgIC0+ICAyLjQKK2RkZGl2MDExIGRpdmlkZSAgMi40ICAgLTEgICAtPiAgLTIuNAorZGRkaXYwMTIgZGl2aWRlICAtMi40ICAxICAgIC0+ICAtMi40CitkZGRpdjAxMyBkaXZpZGUgIC0yLjQgIC0xICAgLT4gIDIuNAorZGRkaXYwMTQgZGl2aWRlICAyLjQwICAxICAgIC0+ICAyLjQwCitkZGRpdjAxNSBkaXZpZGUgIDIuNDAwIDEgICAgLT4gIDIuNDAwCitkZGRpdjAxNiBkaXZpZGUgIDIuNCAgIDIgICAgLT4gIDEuMgorZGRkaXYwMTcgZGl2aWRlICAyLjQwMCAyICAgIC0+ICAxLjIwMAorZGRkaXYwMTggZGl2aWRlICAyLiAgICAyICAgIC0+ICAxCitkZGRpdjAxOSBkaXZpZGUgIDIwICAgIDIwICAgLT4gIDEKKworZGRkaXYwMjAgZGl2aWRlICAxODcgICAxODcgICAgLT4gIDEKK2RkZGl2MDIxIGRpdmlkZSAgNSAgICAgMiAgICAgIC0+ICAyLjUKK2RkZGl2MDIyIGRpdmlkZSAgNTAgICAgMjAgICAgIC0+ICAyLjUKK2RkZGl2MDIzIGRpdmlkZSAgNTAwICAgMjAwICAgIC0+ICAyLjUKK2RkZGl2MDI0IGRpdmlkZSAgNTAuMCAgMjAuMCAgIC0+ICAyLjUKK2RkZGl2MDI1IGRpdmlkZSAgNS4wMCAgMi4wMCAgIC0+ICAyLjUKK2RkZGl2MDI2IGRpdmlkZSAgNSAgICAgMi4wICAgIC0+ICAyLjUKK2RkZGl2MDI3IGRpdmlkZSAgNSAgICAgMi4wMDAgIC0+ICAyLjUKK2RkZGl2MDI4IGRpdmlkZSAgNSAgICAgMC4yMCAgIC0+ICAyNQorZGRkaXYwMjkgZGl2aWRlICA1ICAgICAwLjIwMCAgLT4gIDI1CitkZGRpdjAzMCBkaXZpZGUgIDEwICAgIDEgICAgICAtPiAgMTAKK2RkZGl2MDMxIGRpdmlkZSAgMTAwICAgMSAgICAgIC0+ICAxMDAKK2RkZGl2MDMyIGRpdmlkZSAgMTAwMCAgMSAgICAgIC0+ICAxMDAwCitkZGRpdjAzMyBkaXZpZGUgIDEwMDAgIDEwMCAgICAtPiAgMTAKKworZGRkaXYwMzUgZGl2aWRlICAxICAgICAyICAgICAgLT4gIDAuNQorZGRkaXYwMzYgZGl2aWRlICAxICAgICA0ICAgICAgLT4gIDAuMjUKK2RkZGl2MDM3IGRpdmlkZSAgMSAgICAgOCAgICAgIC0+ICAwLjEyNQorZGRkaXYwMzggZGl2aWRlICAxICAgICAxNiAgICAgLT4gIDAuMDYyNQorZGRkaXYwMzkgZGl2aWRlICAxICAgICAzMiAgICAgLT4gIDAuMDMxMjUKK2RkZGl2MDQwIGRpdmlkZSAgMSAgICAgNjQgICAgIC0+ICAwLjAxNTYyNQorZGRkaXYwNDEgZGl2aWRlICAxICAgIC0yICAgICAgLT4gIC0wLjUKK2RkZGl2MDQyIGRpdmlkZSAgMSAgICAtNCAgICAgIC0+ICAtMC4yNQorZGRkaXYwNDMgZGl2aWRlICAxICAgIC04ICAgICAgLT4gIC0wLjEyNQorZGRkaXYwNDQgZGl2aWRlICAxICAgIC0xNiAgICAgLT4gIC0wLjA2MjUKK2RkZGl2MDQ1IGRpdmlkZSAgMSAgICAtMzIgICAgIC0+ICAtMC4wMzEyNQorZGRkaXYwNDYgZGl2aWRlICAxICAgIC02NCAgICAgLT4gIC0wLjAxNTYyNQorZGRkaXYwNDcgZGl2aWRlIC0xICAgICAyICAgICAgLT4gIC0wLjUKK2RkZGl2MDQ4IGRpdmlkZSAtMSAgICAgNCAgICAgIC0+ICAtMC4yNQorZGRkaXYwNDkgZGl2aWRlIC0xICAgICA4ICAgICAgLT4gIC0wLjEyNQorZGRkaXYwNTAgZGl2aWRlIC0xICAgICAxNiAgICAgLT4gIC0wLjA2MjUKK2RkZGl2MDUxIGRpdmlkZSAtMSAgICAgMzIgICAgIC0+ICAtMC4wMzEyNQorZGRkaXYwNTIgZGl2aWRlIC0xICAgICA2NCAgICAgLT4gIC0wLjAxNTYyNQorZGRkaXYwNTMgZGl2aWRlIC0xICAgIC0yICAgICAgLT4gIDAuNQorZGRkaXYwNTQgZGl2aWRlIC0xICAgIC00ICAgICAgLT4gIDAuMjUKK2RkZGl2MDU1IGRpdmlkZSAtMSAgICAtOCAgICAgIC0+ICAwLjEyNQorZGRkaXYwNTYgZGl2aWRlIC0xICAgIC0xNiAgICAgLT4gIDAuMDYyNQorZGRkaXYwNTcgZGl2aWRlIC0xICAgIC0zMiAgICAgLT4gIDAuMDMxMjUKK2RkZGl2MDU4IGRpdmlkZSAtMSAgICAtNjQgICAgIC0+ICAwLjAxNTYyNQorCistLSBiY2RUaW1lCitkZGRpdjA2MCBkaXZpZGUgIDEgNyAgICAgICAgICAgICAgICAgICAtPiAwLjE0Mjg1NzE0Mjg1NzE0MjkgSW5leGFjdCBSb3VuZGVkCitkZGRpdjA2MSBkaXZpZGUgMS4yMzQ1Njc4ICAxLjk4NzY1NDMgICAtPiAwLjYyMTExNzk2ODA0OTA3MTcgSW5leGFjdCBSb3VuZGVkCisKKy0tICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZGRkaXYwNzEgZGl2aWRlICA5OTk5OTk5OTk5OTk5OTk5IDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5CitkZGRpdjA3MiBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5OSAgMSAgLT4gIDk5OTk5OTk5OTk5OTk5OQorZGRkaXYwNzMgZGl2aWRlICA5OTk5OTk5OTk5OTk5OSAgIDEgIC0+ICA5OTk5OTk5OTk5OTk5OQorZGRkaXYwNzQgZGl2aWRlICA5OTk5OTk5OTk5OTk5ICAgIDEgIC0+ICA5OTk5OTk5OTk5OTk5CitkZGRpdjA3NSBkaXZpZGUgIDk5OTk5OTk5OTk5OSAgICAgMSAgLT4gIDk5OTk5OTk5OTk5OQorZGRkaXYwNzYgZGl2aWRlICA5OTk5OTk5OTk5OSAgICAgIDEgIC0+ICA5OTk5OTk5OTk5OQorZGRkaXYwNzcgZGl2aWRlICA5OTk5OTk5OTk5ICAgICAgIDEgIC0+ICA5OTk5OTk5OTk5CitkZGRpdjA3OCBkaXZpZGUgIDk5OTk5OTk5OSAgICAgICAgMSAgLT4gIDk5OTk5OTk5OQorZGRkaXYwNzkgZGl2aWRlICA5OTk5OTk5OSAgICAgICAgIDEgIC0+ICA5OTk5OTk5OQorZGRkaXYwODAgZGl2aWRlICA5OTk5OTk5ICAgICAgICAgIDEgIC0+ICA5OTk5OTk5CitkZGRpdjA4MSBkaXZpZGUgIDk5OTk5OSAgICAgICAgICAgMSAgLT4gIDk5OTk5OQorZGRkaXYwODIgZGl2aWRlICA5OTk5OSAgICAgICAgICAgIDEgIC0+ICA5OTk5OQorZGRkaXYwODMgZGl2aWRlICA5OTk5ICAgICAgICAgICAgIDEgIC0+ICA5OTk5CitkZGRpdjA4NCBkaXZpZGUgIDk5OSAgICAgICAgICAgICAgMSAgLT4gIDk5OQorZGRkaXYwODUgZGl2aWRlICA5OSAgICAgICAgICAgICAgIDEgIC0+ICA5OQorZGRkaXYwODYgZGl2aWRlICA5ICAgICAgICAgICAgICAgIDEgIC0+ICA5CisKK2RkZGl2MDkwIGRpdmlkZSAgMC4gICAgICAgICAgICAxICAgIC0+ICAwCitkZGRpdjA5MSBkaXZpZGUgIC4wICAgICAgICAgICAgMSAgICAtPiAgMC4wCitkZGRpdjA5MiBkaXZpZGUgIDAuMDAgICAgICAgICAgMSAgICAtPiAgMC4wMAorZGRkaXYwOTMgZGl2aWRlICAwLjAwRSs5ICAgICAgIDEgICAgLT4gIDBFKzcKK2RkZGl2MDk0IGRpdmlkZSAgMC4wMDAwRS01MCAgICAxICAgIC0+ICAwRS01NAorCitkZGRpdjA5NSBkaXZpZGUgIDEgICAgICAgICAgICAxRS04ICAtPiAgMUUrOAorZGRkaXYwOTYgZGl2aWRlICAxICAgICAgICAgICAgMUUtOSAgLT4gIDFFKzkKK2RkZGl2MDk3IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTEwIC0+ICAxRSsxMAorZGRkaXYwOTggZGl2aWRlICAxICAgICAgICAgICAgMUUtMTEgLT4gIDFFKzExCitkZGRpdjA5OSBkaXZpZGUgIDEgICAgICAgICAgICAxRS0xMiAtPiAgMUUrMTIKKworZGRkaXYxMDAgZGl2aWRlICAxICAxICAgLT4gMQorZGRkaXYxMDEgZGl2aWRlICAxICAyICAgLT4gMC41CitkZGRpdjEwMiBkaXZpZGUgIDEgIDMgICAtPiAwLjMzMzMzMzMzMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwMyBkaXZpZGUgIDEgIDQgICAtPiAwLjI1CitkZGRpdjEwNCBkaXZpZGUgIDEgIDUgICAtPiAwLjIKK2RkZGl2MTA1IGRpdmlkZSAgMSAgNiAgIC0+IDAuMTY2NjY2NjY2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA2IGRpdmlkZSAgMSAgNyAgIC0+IDAuMTQyODU3MTQyODU3MTQyOSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA3IGRpdmlkZSAgMSAgOCAgIC0+IDAuMTI1CitkZGRpdjEwOCBkaXZpZGUgIDEgIDkgICAtPiAwLjExMTExMTExMTExMTExMTEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwOSBkaXZpZGUgIDEgIDEwICAtPiAwLjEKK2RkZGl2MTEwIGRpdmlkZSAgMSAgMSAgIC0+IDEKK2RkZGl2MTExIGRpdmlkZSAgMiAgMSAgIC0+IDIKK2RkZGl2MTEyIGRpdmlkZSAgMyAgMSAgIC0+IDMKK2RkZGl2MTEzIGRpdmlkZSAgNCAgMSAgIC0+IDQKK2RkZGl2MTE0IGRpdmlkZSAgNSAgMSAgIC0+IDUKK2RkZGl2MTE1IGRpdmlkZSAgNiAgMSAgIC0+IDYKK2RkZGl2MTE2IGRpdmlkZSAgNyAgMSAgIC0+IDcKK2RkZGl2MTE3IGRpdmlkZSAgOCAgMSAgIC0+IDgKK2RkZGl2MTE4IGRpdmlkZSAgOSAgMSAgIC0+IDkKK2RkZGl2MTE5IGRpdmlkZSAgMTAgMSAgIC0+IDEwCisKK2RkZGl2MTIwIGRpdmlkZSAgM0UrMSAwLjAwMSAgLT4gM0UrNAorZGRkaXYxMjEgZGl2aWRlICAyLjIwMCAyICAgICAtPiAxLjEwMAorCitkZGRpdjEzMCBkaXZpZGUgIDEyMzQ1ICA0Ljk5OSAgLT4gIDI0NjkuNDkzODk4Nzc5NzU2ICAgIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMzEgZGl2aWRlICAxMjM0NSAgNC45OSAgIC0+ICAyNDczLjk0Nzg5NTc5MTU4MyAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTMyIGRpdmlkZSAgMTIzNDUgIDQuOSAgICAtPiAgMjUxOS4zODc3NTUxMDIwNDEgICAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEzMyBkaXZpZGUgIDEyMzQ1ICA1ICAgICAgLT4gIDI0NjkKK2RkZGl2MTM0IGRpdmlkZSAgMTIzNDUgIDUuMSAgICAtPiAgMjQyMC41ODgyMzUyOTQxMTggICAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEzNSBkaXZpZGUgIDEyMzQ1ICA1LjAxICAgLT4gIDI0NjQuMDcxODU2Mjg3NDI1ICAgIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMzYgZGl2aWRlICAxMjM0NSAgNS4wMDEgIC0+ICAyNDY4LjUwNjI5ODc0MDI1MiAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBwb3NzaWJseSBpbXByZWNpc2UgcmVzdWx0cworZGRkaXYyMjAgZGl2aWRlIDM5MSAgIDU5NyAtPiAgMC42NTQ5NDEzNzM1MzQzMzg0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjIxIGRpdmlkZSAzOTEgIC01OTcgLT4gLTAuNjU0OTQxMzczNTM0MzM4NCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIyMiBkaXZpZGUgLTM5MSAgNTk3IC0+IC0wLjY1NDk0MTM3MzUzNDMzODQgIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMjMgZGl2aWRlIC0zOTEgLTU5NyAtPiAgMC42NTQ5NDEzNzM1MzQzMzg0ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93LCBzb21lIHdpdGggY29lZmZpY2llbnQgcGFkZGluZworZGRkaXYyNzAgZGl2aWRlIDEgMWUzODQgICAgICAgICAgICAgICAgICAtPiAxRS0zODQgICAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorZGRkaXYyNzEgZGl2aWRlIDEgMC45ZTM4NCAgICAgICAgICAgICAgICAtPiAxLjExMTExMTExMTExMTExRS0zODQgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGRpdjI3MiBkaXZpZGUgMSAwLjk5ZTM4NCAgICAgICAgICAgICAgIC0+IDEuMDEwMTAxMDEwMTAxMDFFLTM4NCAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZGl2MjczIGRpdmlkZSAxIDAuOTk5OTk5OTk5OTk5OTk5OWUzODQgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRkaXYyNzQgZGl2aWRlIDllMzg0ICAgIDEgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IENsYW1wZWQKK2RkZGl2Mjc1IGRpdmlkZSA5LjllMzg0ICAxICAgICAgICAgICAgICAgLT4gOS45MDAwMDAwMDAwMDAwMDBFKzM4NCBDbGFtcGVkCitkZGRpdjI3NiBkaXZpZGUgOS45OWUzODQgMSAgICAgICAgICAgICAgIC0+IDkuOTkwMDAwMDAwMDAwMDAwRSszODQgQ2xhbXBlZAorZGRkaXYyNzcgZGl2aWRlIDkuOTk5OTk5OTk5OTk5OWUzODQgMSAgICAtPiA5Ljk5OTk5OTk5OTk5OTkwMEUrMzg0IENsYW1wZWQKK2RkZGl2Mjc4IGRpdmlkZSA5Ljk5OTk5OTk5OTk5OTk5ZTM4NCAxICAgLT4gOS45OTk5OTk5OTk5OTk5OTBFKzM4NCBDbGFtcGVkCitkZGRpdjI3OSBkaXZpZGUgOS45OTk5OTk5OTk5OTk5OTllMzg0IDEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKKworZGRkaXYyODUgZGl2aWRlIDkuOWUzODQgIDEuMSAgICAgICAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBDbGFtcGVkCitkZGRpdjI4NiBkaXZpZGUgOS45OWUzODQgMS4xICAgICAgICAgICAgICAtPiA5LjA4MTgxODE4MTgxODE4MkUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyODcgZGl2aWRlIDkuOTk5OTk5OTk5OTk5OWUzODQgMS4xICAgLT4gOS4wOTA5MDkwOTA5MDkwMDBFKzM4NCBDbGFtcGVkCitkZGRpdjI4OCBkaXZpZGUgOS45OTk5OTk5OTk5OTk5OWUzODQgMS4xICAtPiA5LjA5MDkwOTA5MDkwOTA4MkUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyODkgZGl2aWRlIDkuOTk5OTk5OTk5OTk5OTk5ZTM4NCAxLjEgLT4gOS4wOTA5MDkwOTA5MDkwOTBFKzM4NCBDbGFtcGVkCisKKworLS0gRGl2aWRlIGludG8gMCB0ZXN0cworZGRkaXYzMDEgZGl2aWRlICAgIDAgICAgNyAgICAgLT4gMAorZGRkaXYzMDIgZGl2aWRlICAgIDAgICAgN0UtNSAgLT4gMEUrNQorZGRkaXYzMDMgZGl2aWRlICAgIDAgICAgN0UtMSAgLT4gMEUrMQorZGRkaXYzMDQgZGl2aWRlICAgIDAgICAgN0UrMSAgLT4gMC4wCitkZGRpdjMwNSBkaXZpZGUgICAgMCAgICA3RSs1ICAtPiAwLjAwMDAwCitkZGRpdjMwNiBkaXZpZGUgICAgMCAgICA3RSs2ICAtPiAwLjAwMDAwMAorZGRkaXYzMDcgZGl2aWRlICAgIDAgICAgN0UrNyAgLT4gMEUtNworZGRkaXYzMDggZGl2aWRlICAgIDAgICA3MEUtNSAgLT4gMEUrNQorZGRkaXYzMDkgZGl2aWRlICAgIDAgICA3MEUtMSAgLT4gMEUrMQorZGRkaXYzMTAgZGl2aWRlICAgIDAgICA3MEUrMCAgLT4gMAorZGRkaXYzMTEgZGl2aWRlICAgIDAgICA3MEUrMSAgLT4gMC4wCitkZGRpdjMxMiBkaXZpZGUgICAgMCAgIDcwRSs1ICAtPiAwLjAwMDAwCitkZGRpdjMxMyBkaXZpZGUgICAgMCAgIDcwRSs2ICAtPiAwLjAwMDAwMAorZGRkaXYzMTQgZGl2aWRlICAgIDAgICA3MEUrNyAgLT4gMEUtNworZGRkaXYzMTUgZGl2aWRlICAgIDAgIDcwMEUtNSAgLT4gMEUrNQorZGRkaXYzMTYgZGl2aWRlICAgIDAgIDcwMEUtMSAgLT4gMEUrMQorZGRkaXYzMTcgZGl2aWRlICAgIDAgIDcwMEUrMCAgLT4gMAorZGRkaXYzMTggZGl2aWRlICAgIDAgIDcwMEUrMSAgLT4gMC4wCitkZGRpdjMxOSBkaXZpZGUgICAgMCAgNzAwRSs1ICAtPiAwLjAwMDAwCitkZGRpdjMyMCBkaXZpZGUgICAgMCAgNzAwRSs2ICAtPiAwLjAwMDAwMAorZGRkaXYzMjEgZGl2aWRlICAgIDAgIDcwMEUrNyAgLT4gMEUtNworZGRkaXYzMjIgZGl2aWRlICAgIDAgIDcwMEUrNzcgLT4gMEUtNzcKKworZGRkaXYzMzEgZGl2aWRlIDBFLTMgICAgN0UtNSAgLT4gMEUrMgorZGRkaXYzMzIgZGl2aWRlIDBFLTMgICAgN0UtMSAgLT4gMC4wMAorZGRkaXYzMzMgZGl2aWRlIDBFLTMgICAgN0UrMSAgLT4gMC4wMDAwCitkZGRpdjMzNCBkaXZpZGUgMEUtMyAgICA3RSs1ICAtPiAwRS04CitkZGRpdjMzNSBkaXZpZGUgMEUtMSAgICA3RS01ICAtPiAwRSs0CitkZGRpdjMzNiBkaXZpZGUgMEUtMSAgICA3RS0xICAtPiAwCitkZGRpdjMzNyBkaXZpZGUgMEUtMSAgICA3RSsxICAtPiAwLjAwCitkZGRpdjMzOCBkaXZpZGUgMEUtMSAgICA3RSs1ICAtPiAwLjAwMDAwMAorZGRkaXYzMzkgZGl2aWRlIDBFKzEgICAgN0UtNSAgLT4gMEUrNgorZGRkaXYzNDAgZGl2aWRlIDBFKzEgICAgN0UtMSAgLT4gMEUrMgorZGRkaXYzNDEgZGl2aWRlIDBFKzEgICAgN0UrMSAgLT4gMAorZGRkaXYzNDIgZGl2aWRlIDBFKzEgICAgN0UrNSAgLT4gMC4wMDAwCitkZGRpdjM0MyBkaXZpZGUgMEUrMyAgICA3RS01ICAtPiAwRSs4CitkZGRpdjM0NCBkaXZpZGUgMEUrMyAgICA3RS0xICAtPiAwRSs0CitkZGRpdjM0NSBkaXZpZGUgMEUrMyAgICA3RSsxICAtPiAwRSsyCitkZGRpdjM0NiBkaXZpZGUgMEUrMyAgICA3RSs1ICAtPiAwLjAwCisKKy0tIFRoZXNlIHdlcmUgJ2lucHV0IHJvdW5kaW5nJworZGRkaXY0NDEgZGl2aWRlIDEyMzQ1Njc4MDAwIDEgLT4gMTIzNDU2NzgwMDAKK2RkZGl2NDQyIGRpdmlkZSAxIDEyMzQ1Njc4MDAwIC0+IDguMTAwMDAwNjY0MjAwMDU0RS0xMSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDQzIGRpdmlkZSAxMjM0NTY3ODAwICAxIC0+IDEyMzQ1Njc4MDAKK2RkZGl2NDQ0IGRpdmlkZSAxIDEyMzQ1Njc4MDAgIC0+IDguMTAwMDAwNjY0MjAwMDU0RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDQ1IGRpdmlkZSAxMjM0NTY3ODkwICAxIC0+IDEyMzQ1Njc4OTAKK2RkZGl2NDQ2IGRpdmlkZSAxIDEyMzQ1Njc4OTAgIC0+IDguMTAwMDAwMDczNzEwMDAxRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDQ3IGRpdmlkZSAxMjM0NTY3ODkxICAxIC0+IDEyMzQ1Njc4OTEKK2RkZGl2NDQ4IGRpdmlkZSAxIDEyMzQ1Njc4OTEgIC0+IDguMTAwMDAwMDY3MTQ5MDAxRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDQ5IGRpdmlkZSAxMjM0NTY3ODkwMSAxIC0+IDEyMzQ1Njc4OTAxCitkZGRpdjQ1MCBkaXZpZGUgMSAxMjM0NTY3ODkwMSAtPiA4LjEwMDAwMDA3MzA1MzkwMUUtMTEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQ1MSBkaXZpZGUgMTIzNDU2Nzg5NiAgMSAtPiAxMjM0NTY3ODk2CitkZGRpdjQ1MiBkaXZpZGUgMSAxMjM0NTY3ODk2ICAtPiA4LjEwMDAwMDAzNDM0NDAwMEUtMTAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGhpZ2gtbG93cworZGRkaXY0NTMgZGl2aWRlIDFlKzEgICAxICAgIC0+ICAgMUUrMQorZGRkaXY0NTQgZGl2aWRlIDFlKzEgICAxLjAgIC0+ICAgMUUrMQorZGRkaXY0NTUgZGl2aWRlIDFlKzEgICAxLjAwIC0+ICAgMUUrMQorZGRkaXY0NTYgZGl2aWRlIDFlKzIgICAyICAgIC0+ICAgNUUrMQorZGRkaXY0NTcgZGl2aWRlIDFlKzIgICAyLjAgIC0+ICAgNUUrMQorZGRkaXY0NTggZGl2aWRlIDFlKzIgICAyLjAwIC0+ICAgNUUrMQorCistLSBzb21lIGZyb20gSUVFRSBkaXNjdXNzaW9ucworZGRkaXY0NjAgZGl2aWRlIDNlMCAgICAgIDJlMCAgICAgLT4gMS41CitkZGRpdjQ2MSBkaXZpZGUgMzBlLTEgICAgMmUwICAgICAtPiAxLjUKK2RkZGl2NDYyIGRpdmlkZSAzMDBlLTIgICAyZTAgICAgIC0+IDEuNTAKK2RkZGl2NDY0IGRpdmlkZSAzMDAwZS0zICAyZTAgICAgIC0+IDEuNTAwCitkZGRpdjQ2NSBkaXZpZGUgM2UwICAgICAgMjBlLTEgICAtPiAxLjUKK2RkZGl2NDY2IGRpdmlkZSAzMGUtMSAgICAyMGUtMSAgIC0+IDEuNQorZGRkaXY0NjcgZGl2aWRlIDMwMGUtMiAgIDIwZS0xICAgLT4gMS41CitkZGRpdjQ2OCBkaXZpZGUgMzAwMGUtMyAgMjBlLTEgICAtPiAxLjUwCitkZGRpdjQ2OSBkaXZpZGUgM2UwICAgICAgMjAwZS0yICAtPiAxLjUKK2RkZGl2NDcwIGRpdmlkZSAzMGUtMSAgICAyMDBlLTIgIC0+IDEuNQorZGRkaXY0NzEgZGl2aWRlIDMwMGUtMiAgIDIwMGUtMiAgLT4gMS41CitkZGRpdjQ3MiBkaXZpZGUgMzAwMGUtMyAgMjAwZS0yICAtPiAxLjUKK2RkZGl2NDczIGRpdmlkZSAzZTAgICAgICAyMDAwZS0zIC0+IDEuNQorZGRkaXY0NzQgZGl2aWRlIDMwZS0xICAgIDIwMDBlLTMgLT4gMS41CitkZGRpdjQ3NSBkaXZpZGUgMzAwZS0yICAgMjAwMGUtMyAtPiAxLjUKK2RkZGl2NDc2IGRpdmlkZSAzMDAwZS0zICAyMDAwZS0zIC0+IDEuNQorCistLSBzb21lIHJlY2lwcm9jYWxzCitkZGRpdjQ4MCBkaXZpZGUgMSAgICAgICAgMS4wRSszMyAtPiAxRS0zMworZGRkaXY0ODEgZGl2aWRlIDEgICAgICAgIDEwRSszMyAgLT4gMUUtMzQKK2RkZGl2NDgyIGRpdmlkZSAxICAgICAgICAxLjBFLTMzIC0+IDFFKzMzCitkZGRpdjQ4MyBkaXZpZGUgMSAgICAgICAgMTBFLTMzICAtPiAxRSszMgorCistLSBSTVMgZGlzY3Vzc2lvbiB0YWJsZQorZGRkaXY0ODQgZGl2aWRlIDBlNSAgICAgMWUzIC0+ICAgMEUrMgorZGRkaXY0ODUgZGl2aWRlIDBlNSAgICAgMmUzIC0+ICAgMEUrMgorZGRkaXY0ODYgZGl2aWRlIDBlNSAgICAxMGUyIC0+ICAgMEUrMworZGRkaXY0ODcgZGl2aWRlIDBlNSAgICAyMGUyIC0+ICAgMEUrMworZGRkaXY0ODggZGl2aWRlIDBlNSAgIDEwMGUxIC0+ICAgMEUrNAorZGRkaXY0ODkgZGl2aWRlIDBlNSAgIDIwMGUxIC0+ICAgMEUrNAorCitkZGRpdjQ5MSBkaXZpZGUgMWU1ICAgICAxZTMgLT4gICAxRSsyCitkZGRpdjQ5MiBkaXZpZGUgMWU1ICAgICAyZTMgLT4gICA1RSsxCitkZGRpdjQ5MyBkaXZpZGUgMWU1ICAgIDEwZTIgLT4gICAxRSsyCitkZGRpdjQ5NCBkaXZpZGUgMWU1ICAgIDIwZTIgLT4gICA1RSsxCitkZGRpdjQ5NSBkaXZpZGUgMWU1ICAgMTAwZTEgLT4gICAxRSsyCitkZGRpdjQ5NiBkaXZpZGUgMWU1ICAgMjAwZTEgLT4gICA1RSsxCisKKy0tIHRyeXplcm9zIGNhc2VzCityb3VuZGluZzogICAgaGFsZl91cAorZGRkaXY0OTcgIGRpdmlkZSAgMEUrMzgwIDEwMDBFLTEzICAtPiAwRSszNjkgQ2xhbXBlZAorZGRkaXY0OTggIGRpdmlkZSAgMEUtMzkwIDEwMDBFKzEzICAtPiAwRS0zOTggQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl91cAorCistLSBmb2N1cyBvbiB0cmFpbGluZyB6ZXJvcyBpc3N1ZXMKK2RkZGl2NTAwIGRpdmlkZSAgMSAgICAgIDkuOSAgICAtPiAgMC4xMDEwMTAxMDEwMTAxMDEwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NTAxIGRpdmlkZSAgMSAgICAgIDkuMDkgICAtPiAgMC4xMTAwMTEwMDExMDAxMTAwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NTAyIGRpdmlkZSAgMSAgICAgIDkuMDA5ICAtPiAgMC4xMTEwMDAxMTEwMDAxMTEwICBJbmV4YWN0IFJvdW5kZWQKKworZGRkaXY1MTEgZGl2aWRlIDEgICAgICAgICAyICAgIC0+IDAuNQorZGRkaXY1MTIgZGl2aWRlIDEuMCAgICAgICAyICAgIC0+IDAuNQorZGRkaXY1MTMgZGl2aWRlIDEuMDAgICAgICAyICAgIC0+IDAuNTAKK2RkZGl2NTE0IGRpdmlkZSAxLjAwMCAgICAgMiAgICAtPiAwLjUwMAorZGRkaXY1MTUgZGl2aWRlIDEuMDAwMCAgICAyICAgIC0+IDAuNTAwMAorZGRkaXY1MTYgZGl2aWRlIDEuMDAwMDAgICAyICAgIC0+IDAuNTAwMDAKK2RkZGl2NTE3IGRpdmlkZSAxLjAwMDAwMCAgMiAgICAtPiAwLjUwMDAwMAorZGRkaXY1MTggZGl2aWRlIDEuMDAwMDAwMCAyICAgIC0+IDAuNTAwMDAwMAorZGRkaXY1MTkgZGl2aWRlIDEuMDAgICAgICAyLjAwIC0+IDAuNQorCitkZGRpdjUyMSBkaXZpZGUgMiAgICAxICAgICAgICAgLT4gMgorZGRkaXY1MjIgZGl2aWRlIDIgICAgMS4wICAgICAgIC0+IDIKK2RkZGl2NTIzIGRpdmlkZSAyICAgIDEuMDAgICAgICAtPiAyCitkZGRpdjUyNCBkaXZpZGUgMiAgICAxLjAwMCAgICAgLT4gMgorZGRkaXY1MjUgZGl2aWRlIDIgICAgMS4wMDAwICAgIC0+IDIKK2RkZGl2NTI2IGRpdmlkZSAyICAgIDEuMDAwMDAgICAtPiAyCitkZGRpdjUyNyBkaXZpZGUgMiAgICAxLjAwMDAwMCAgLT4gMgorZGRkaXY1MjggZGl2aWRlIDIgICAgMS4wMDAwMDAwIC0+IDIKK2RkZGl2NTI5IGRpdmlkZSAyLjAwIDEuMDAgICAgICAtPiAyCisKK2RkZGl2NTMwIGRpdmlkZSAgMi40MCAgIDIgICAgICAtPiAgMS4yMAorZGRkaXY1MzEgZGl2aWRlICAyLjQwICAgNCAgICAgIC0+ICAwLjYwCitkZGRpdjUzMiBkaXZpZGUgIDIuNDAgIDEwICAgICAgLT4gIDAuMjQKK2RkZGl2NTMzIGRpdmlkZSAgMi40MCAgIDIuMCAgICAtPiAgMS4yCitkZGRpdjUzNCBkaXZpZGUgIDIuNDAgICA0LjAgICAgLT4gIDAuNgorZGRkaXY1MzUgZGl2aWRlICAyLjQwICAxMC4wICAgIC0+ICAwLjI0CitkZGRpdjUzNiBkaXZpZGUgIDIuNDAgICAyLjAwICAgLT4gIDEuMgorZGRkaXY1MzcgZGl2aWRlICAyLjQwICAgNC4wMCAgIC0+ICAwLjYKK2RkZGl2NTM4IGRpdmlkZSAgMi40MCAgMTAuMDAgICAtPiAgMC4yNAorZGRkaXY1MzkgZGl2aWRlICAwLjkgICAgMC4xICAgIC0+ICA5CitkZGRpdjU0MCBkaXZpZGUgIDAuOSAgICAwLjAxICAgLT4gIDlFKzEKK2RkZGl2NTQxIGRpdmlkZSAgMC45ICAgIDAuMDAxICAtPiAgOUUrMgorZGRkaXY1NDIgZGl2aWRlICA1ICAgICAgMiAgICAgIC0+ICAyLjUKK2RkZGl2NTQzIGRpdmlkZSAgNSAgICAgIDIuMCAgICAtPiAgMi41CitkZGRpdjU0NCBkaXZpZGUgIDUgICAgICAyLjAwICAgLT4gIDIuNQorZGRkaXY1NDUgZGl2aWRlICA1ICAgICAgMjAgICAgIC0+ICAwLjI1CitkZGRpdjU0NiBkaXZpZGUgIDUgICAgICAyMC4wICAgLT4gIDAuMjUKK2RkZGl2NTQ3IGRpdmlkZSAgMi40MDAgIDIgICAgICAtPiAgMS4yMDAKK2RkZGl2NTQ4IGRpdmlkZSAgMi40MDAgIDIuMCAgICAtPiAgMS4yMAorZGRkaXY1NDkgZGl2aWRlICAyLjQwMCAgMi40MDAgIC0+ICAxCisKK2RkZGl2NTUwIGRpdmlkZSAgMjQwICAgIDEgICAgICAtPiAgMjQwCitkZGRpdjU1MSBkaXZpZGUgIDI0MCAgICAxMCAgICAgLT4gIDI0CitkZGRpdjU1MiBkaXZpZGUgIDI0MCAgICAxMDAgICAgLT4gIDIuNAorZGRkaXY1NTMgZGl2aWRlICAyNDAgICAgMTAwMCAgIC0+ICAwLjI0CitkZGRpdjU1NCBkaXZpZGUgIDI0MDAgICAxICAgICAgLT4gIDI0MDAKK2RkZGl2NTU1IGRpdmlkZSAgMjQwMCAgIDEwICAgICAtPiAgMjQwCitkZGRpdjU1NiBkaXZpZGUgIDI0MDAgICAxMDAgICAgLT4gIDI0CitkZGRpdjU1NyBkaXZpZGUgIDI0MDAgICAxMDAwICAgLT4gIDIuNAorCistLSArdmUgZXhwb25lbnQKK2RkZGl2NjAwIGRpdmlkZSAgMi40RSs5ICAgICAyICAtPiAgMS4yRSs5CitkZGRpdjYwMSBkaXZpZGUgIDIuNDBFKzkgICAgMiAgLT4gIDEuMjBFKzkKK2RkZGl2NjAyIGRpdmlkZSAgMi40MDBFKzkgICAyICAtPiAgMS4yMDBFKzkKK2RkZGl2NjAzIGRpdmlkZSAgMi40MDAwRSs5ICAyICAtPiAgMS4yMDAwRSs5CitkZGRpdjYwNCBkaXZpZGUgIDI0RSs4ICAgICAgMiAgLT4gIDEuMkUrOQorZGRkaXY2MDUgZGl2aWRlICAyNDBFKzcgICAgIDIgIC0+ICAxLjIwRSs5CitkZGRpdjYwNiBkaXZpZGUgIDI0MDBFKzYgICAgMiAgLT4gIDEuMjAwRSs5CitkZGRpdjYwNyBkaXZpZGUgIDI0MDAwRSs1ICAgMiAgLT4gIDEuMjAwMEUrOQorCistLSBtb3JlIHplcm9zLCBldGMuCitkZGRpdjczMSBkaXZpZGUgNS4wMCAxRS0zICAgIC0+IDUuMDBFKzMKK2RkZGl2NzMyIGRpdmlkZSAwMC4wMCAwLjAwMCAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkaXY3MzMgZGl2aWRlIDAwLjAwIDBFLTMgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGRpdjczNCBkaXZpZGUgIDAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZGl2NzM1IGRpdmlkZSAtMCAgICAgMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkaXY3MzYgZGl2aWRlIC0wICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCisKK2RkZGl2NzQxIGRpdmlkZSAgMCAgICAtMSAgICAgLT4gLTAKK2RkZGl2NzQyIGRpdmlkZSAtMCAgICAtMSAgICAgLT4gIDAKK2RkZGl2NzQzIGRpdmlkZSAgMCAgICAgMSAgICAgLT4gIDAKK2RkZGl2NzQ0IGRpdmlkZSAtMCAgICAgMSAgICAgLT4gLTAKK2RkZGl2NzQ1IGRpdmlkZSAtMSAgICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzQ2IGRpdmlkZSAtMSAgICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzQ3IGRpdmlkZSAgMSAgICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzQ4IGRpdmlkZSAgMSAgICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkaXY3NTEgZGl2aWRlICAwLjAgIC0xICAgICAtPiAtMC4wCitkZGRpdjc1MiBkaXZpZGUgLTAuMCAgLTEgICAgIC0+ICAwLjAKK2RkZGl2NzUzIGRpdmlkZSAgMC4wICAgMSAgICAgLT4gIDAuMAorZGRkaXY3NTQgZGl2aWRlIC0wLjAgICAxICAgICAtPiAtMC4wCitkZGRpdjc1NSBkaXZpZGUgLTEuMCAgIDAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjc1NiBkaXZpZGUgLTEuMCAgLTAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjc1NyBkaXZpZGUgIDEuMCAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjc1OCBkaXZpZGUgIDEuMCAgLTAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2RkZGl2NzYxIGRpdmlkZSAgMCAgICAtMS4wICAgLT4gLTBFKzEKK2RkZGl2NzYyIGRpdmlkZSAtMCAgICAtMS4wICAgLT4gIDBFKzEKK2RkZGl2NzYzIGRpdmlkZSAgMCAgICAgMS4wICAgLT4gIDBFKzEKK2RkZGl2NzY0IGRpdmlkZSAtMCAgICAgMS4wICAgLT4gLTBFKzEKK2RkZGl2NzY1IGRpdmlkZSAtMSAgICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzY2IGRpdmlkZSAtMSAgICAtMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzY3IGRpdmlkZSAgMSAgICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2NzY4IGRpdmlkZSAgMSAgICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkaXY3NzEgZGl2aWRlICAwLjAgIC0xLjAgICAtPiAtMAorZGRkaXY3NzIgZGl2aWRlIC0wLjAgIC0xLjAgICAtPiAgMAorZGRkaXY3NzMgZGl2aWRlICAwLjAgICAxLjAgICAtPiAgMAorZGRkaXY3NzQgZGl2aWRlIC0wLjAgICAxLjAgICAtPiAtMAorZGRkaXY3NzUgZGl2aWRlIC0xLjAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NzYgZGl2aWRlIC0xLjAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NzcgZGl2aWRlICAxLjAgICAwLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY3NzggZGl2aWRlICAxLjAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSBTcGVjaWFscworZGRkaXY3ODAgZGl2aWRlICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjc4MSBkaXZpZGUgIEluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZGRkaXY3ODIgZGl2aWRlICBJbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RkZGl2NzgzIGRpdmlkZSAgSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkZGRpdjc4NCBkaXZpZGUgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZGRkaXY3ODUgZGl2aWRlICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RkZGl2Nzg2IGRpdmlkZSAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkZGRpdjc4NyBkaXZpZGUgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2Nzg4IGRpdmlkZSAtMTAwMCAgSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkZGRpdjc4OSBkaXZpZGUgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2NzkwIGRpdmlkZSAtMSAgICAgSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkZGRpdjc5MSBkaXZpZGUgLTAgICAgIEluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGRkaXY3OTIgZGl2aWRlICAwICAgICBJbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2RkZGl2NzkzIGRpdmlkZSAgMSAgICAgSW5mICAgLT4gIDBFLTM5OCBDbGFtcGVkCitkZGRpdjc5NCBkaXZpZGUgIDEwMDAgIEluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGRkaXY3OTUgZGl2aWRlICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkZGl2ODAwIGRpdmlkZSAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4MDEgZGl2aWRlIC1JbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RkZGl2ODAyIGRpdmlkZSAtSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkZGRpdjgwMyBkaXZpZGUgLUluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZGRkaXY4MDQgZGl2aWRlIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2RkZGl2ODA1IGRpdmlkZSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkZGRpdjgwNiBkaXZpZGUgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZGRkaXY4MDcgZGl2aWRlIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjgwOCBkaXZpZGUgLTEwMDAgIEluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGRkaXY4MDkgZGl2aWRlIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjgxMCBkaXZpZGUgLTEgICAgLUluZiAgIC0+ICAwRS0zOTggQ2xhbXBlZAorZGRkaXY4MTEgZGl2aWRlIC0wICAgIC1JbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2RkZGl2ODEyIGRpdmlkZSAgMCAgICAtSW5mICAgLT4gLTBFLTM5OCBDbGFtcGVkCitkZGRpdjgxMyBkaXZpZGUgIDEgICAgLUluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGRkaXY4MTQgZGl2aWRlICAxMDAwIC1JbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2RkZGl2ODE1IGRpdmlkZSAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZGRpdjgyMSBkaXZpZGUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RkZGl2ODIyIGRpdmlkZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorZGRkaXY4MjMgZGl2aWRlICBOYU4gLTEgICAgICAtPiAgTmFOCitkZGRpdjgyNCBkaXZpZGUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RkZGl2ODI1IGRpdmlkZSAgTmFOICAwICAgICAgLT4gIE5hTgorZGRkaXY4MjYgZGl2aWRlICBOYU4gIDEgICAgICAtPiAgTmFOCitkZGRpdjgyNyBkaXZpZGUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RkZGl2ODI4IGRpdmlkZSAgTmFOICBJbmYgICAgLT4gIE5hTgorZGRkaXY4MjkgZGl2aWRlICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZGRpdjgzMCBkaXZpZGUgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RkZGl2ODMxIGRpdmlkZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorZGRkaXY4MzIgZGl2aWRlIC0xICAgIE5hTiAgICAtPiAgTmFOCitkZGRpdjgzMyBkaXZpZGUgLTAgICAgTmFOICAgIC0+ICBOYU4KK2RkZGl2ODM0IGRpdmlkZSAgMCAgICBOYU4gICAgLT4gIE5hTgorZGRkaXY4MzUgZGl2aWRlICAxICAgIE5hTiAgICAtPiAgTmFOCitkZGRpdjgzNiBkaXZpZGUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RkZGl2ODM3IGRpdmlkZSAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkZGRpdjg0MSBkaXZpZGUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0MiBkaXZpZGUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0MyBkaXZpZGUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0NCBkaXZpZGUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0NSBkaXZpZGUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0NiBkaXZpZGUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0NyBkaXZpZGUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0OCBkaXZpZGUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg0OSBkaXZpZGUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1MCBkaXZpZGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1MSBkaXZpZGUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1MiBkaXZpZGUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1MyBkaXZpZGUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1NCBkaXZpZGUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1NSBkaXZpZGUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1NiBkaXZpZGUgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1NyBkaXZpZGUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1OCBkaXZpZGUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg1OSBkaXZpZGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkZGl2ODYxIGRpdmlkZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2RkZGl2ODYyIGRpdmlkZSAgTmFOOCAgMTAwMCAgLT4gIE5hTjgKK2RkZGl2ODYzIGRpdmlkZSAgTmFONyAgSW5mICAgLT4gIE5hTjcKK2RkZGl2ODY0IGRpdmlkZSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK2RkZGl2ODY1IGRpdmlkZSAtSW5mICAgTmFONCAgLT4gIE5hTjQKK2RkZGl2ODY2IGRpdmlkZSAtMTAwMCAgTmFOMyAgLT4gIE5hTjMKK2RkZGl2ODY3IGRpdmlkZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKKworZGRkaXY4NzEgZGl2aWRlICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODcyIGRpdmlkZSAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg3MyBkaXZpZGUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4NzQgZGl2aWRlICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODc1IGRpdmlkZSAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg3NiBkaXZpZGUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4NzcgZGl2aWRlICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODc4IGRpdmlkZSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg3OSBkaXZpZGUgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkZGRpdjg4MSBkaXZpZGUgIC1OYU45ICAtSW5mICAgLT4gIC1OYU45CitkZGRpdjg4MiBkaXZpZGUgIC1OYU44ICAgMTAwMCAgLT4gIC1OYU44CitkZGRpdjg4MyBkaXZpZGUgIC1OYU43ICAgSW5mICAgLT4gIC1OYU43CitkZGRpdjg4NCBkaXZpZGUgIC1OYU42ICAtTmFONSAgLT4gIC1OYU42CitkZGRpdjg4NSBkaXZpZGUgIC1JbmYgICAtTmFONCAgLT4gIC1OYU40CitkZGRpdjg4NiBkaXZpZGUgIC0xMDAwICAtTmFOMyAgLT4gIC1OYU4zCitkZGRpdjg4NyBkaXZpZGUgICBJbmYgICAtTmFOMiAgLT4gIC1OYU4yCisKK2RkZGl2ODkxIGRpdmlkZSAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg5MiBkaXZpZGUgLXNOYU45OCAtMSAgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4OTMgZGl2aWRlIC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODk0IGRpdmlkZSAtc05hTjk2IC1zTmFOOTQgLT4gLU5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg5NSBkaXZpZGUgLU5hTjk1ICAtc05hTjkzIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4OTYgZGl2aWRlIC1JbmYgICAgLXNOYU45MiAtPiAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkZGl2ODk3IGRpdmlkZSAgMCAgICAgIC1zTmFOOTEgLT4gLU5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjg5OCBkaXZpZGUgIEluZiAgICAtc05hTjkwIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRkaXY4OTkgZGl2aWRlIC1OYU4gICAgLXNOYU44OSAtPiAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gVmFyaW91cyBmbGF2b3VycyBvZiBkaXZpZGUgYnkgMAorZGRkaXY5MDEgZGl2aWRlICAgIDAgICAgICAgMCAgIC0+ICBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGRpdjkwMiBkaXZpZGUgICAgMC4wRTUgICAwICAgLT4gIE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZGl2OTAzIGRpdmlkZSAgICAwLjAwMCAgIDAgICAtPiAgTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkaXY5MDQgZGl2aWRlICAgIDAuMDAwMSAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkwNSBkaXZpZGUgICAgMC4wMSAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTA2IGRpdmlkZSAgICAwLjEgICAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MDcgZGl2aWRlICAgIDEgICAgICAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkwOCBkaXZpZGUgICAgMSAgICAgICAwLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTA5IGRpdmlkZSAgIDEwICAgICAgIDAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MTAgZGl2aWRlICAgMUUrMTAwICAgMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkxMSBkaXZpZGUgICAxRSsxMDAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkaXY5MjEgZGl2aWRlICAgLTAuMDAwMSAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkyMiBkaXZpZGUgICAtMC4wMSAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTIzIGRpdmlkZSAgIC0wLjEgICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MjQgZGl2aWRlICAgLTEgICAgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkyNSBkaXZpZGUgICAtMSAgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTI2IGRpdmlkZSAgLTEwICAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MjcgZGl2aWRlICAtMUUrMTAwICAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkyOCBkaXZpZGUgIC0xRSsxMDAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkaXY5MzEgZGl2aWRlICAgIDAuMDAwMSAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkzMiBkaXZpZGUgICAgMC4wMSAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTMzIGRpdmlkZSAgICAwLjEgICAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MzQgZGl2aWRlICAgIDEgICAgICAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkzNSBkaXZpZGUgICAgMSAgICAgIC0wLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTM2IGRpdmlkZSAgIDEwICAgICAgLTAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5MzcgZGl2aWRlICAgMUUrMTAwICAtMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjkzOCBkaXZpZGUgICAxRSsxMDAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkaXY5NDEgZGl2aWRlICAgLTAuMDAwMSAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjk0MiBkaXZpZGUgICAtMC4wMSAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTQzIGRpdmlkZSAgIC0wLjEgICAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5NDQgZGl2aWRlICAgLTEgICAgICAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjk0NSBkaXZpZGUgICAtMSAgICAgIC0wLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZGl2OTQ2IGRpdmlkZSAgLTEwICAgICAgLTAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkaXY5NDcgZGl2aWRlICAtMUUrMTAwICAtMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGRpdjk0OCBkaXZpZGUgIC0xRSsxMDAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitkZGRpdjEwMjEgIGRpdmlkZSAxRTAgICAgICAgICAgMUUwIC0+IDEKK2RkZGl2MTAyMiAgZGl2aWRlIDFFMCAgICAgICAgICAyRTAgLT4gMC41CitkZGRpdjEwMjMgIGRpdmlkZSAxRTAgICAgICAgICAgM0UwIC0+IDAuMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTAyNCAgZGl2aWRlIDEwMEUtMiAgIDEwMDBFLTMgLT4gMQorZGRkaXYxMDI1ICBkaXZpZGUgMjRFLTEgICAgICAgIDJFMCAtPiAxLjIKK2RkZGl2MTAyNiAgZGl2aWRlIDI0MDBFLTMgICAgICAyRTAgLT4gMS4yMDAKK2RkZGl2MTAyNyAgZGl2aWRlIDVFMCAgICAgICAgICAyRTAgLT4gMi41CitkZGRpdjEwMjggIGRpdmlkZSA1RTAgICAgICAgIDIwRS0xIC0+IDIuNQorZGRkaXYxMDI5ICBkaXZpZGUgNUUwICAgICAgMjAwMEUtMyAtPiAyLjUKK2RkZGl2MTAzMCAgZGl2aWRlIDVFMCAgICAgICAgIDJFLTEgLT4gMjUKK2RkZGl2MTAzMSAgZGl2aWRlIDVFMCAgICAgICAgMjBFLTIgLT4gMjUKK2RkZGl2MTAzMiAgZGl2aWRlIDQ4MEUtMiAgICAgICAzRTAgLT4gMS42MAorZGRkaXYxMDMzICBkaXZpZGUgNDdFLTEgICAgICAgIDJFMCAtPiAyLjM1CisKKy0tIEVDTUFTY3JpcHQgYmFkIGV4YW1wbGVzCityb3VuZGluZzogICAgaGFsZl9kb3duCitkZGRpdjEwNDAgIGRpdmlkZSA1IDkgIC0+IDAuNTU1NTU1NTU1NTU1NTU1NiBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RkZGl2MTA0MSAgZGl2aWRlIDYgMTEgLT4gMC41NDU0NTQ1NDU0NTQ1NDU1IEluZXhhY3QgUm91bmRlZAorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIG5vdGUgc3Vibm9ybWFsIHJlc3VsdHMKKy0tIHNpZ25zCitkZGRpdjEwNTEgZGl2aWRlICAxZSsyNzcgIDFlLTMxMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwNTIgZGl2aWRlICAxZSsyNzcgLTFlLTMxMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwNTMgZGl2aWRlIC0xZSsyNzcgIDFlLTMxMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwNTQgZGl2aWRlIC0xZSsyNzcgLTFlLTMxMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwNTUgZGl2aWRlICAxZS0yNzcgIDFlKzMxMSAtPiAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTA1NiBkaXZpZGUgIDFlLTI3NyAtMWUrMzExIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRkaXYxMDU3IGRpdmlkZSAtMWUtMjc3ICAxZSszMTEgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGRpdjEwNTggZGl2aWRlIC0xZS0yNzcgLTFlKzMxMSAtPiAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gJ3N1Ym5vcm1hbCcgYm91bmRhcnkgKGFsbCBoYXJkIHVuZGVyZmxvdyBvciBvdmVyZmxvdyBpbiBiYXNlIGFyaXRoZW10aWMpCitkZGRpdjEwNjAgZGl2aWRlIDFlLTI5MSAxZSsxMDEgLT4gMUUtMzkyIFN1Ym5vcm1hbAorZGRkaXYxMDYxIGRpdmlkZSAxZS0yOTEgMWUrMTAyIC0+IDFFLTM5MyBTdWJub3JtYWwKK2RkZGl2MTA2MiBkaXZpZGUgMWUtMjkxIDFlKzEwMyAtPiAxRS0zOTQgU3Vibm9ybWFsCitkZGRpdjEwNjMgZGl2aWRlIDFlLTI5MSAxZSsxMDQgLT4gMUUtMzk1IFN1Ym5vcm1hbAorZGRkaXYxMDY0IGRpdmlkZSAxZS0yOTEgMWUrMTA1IC0+IDFFLTM5NiBTdWJub3JtYWwKK2RkZGl2MTA2NSBkaXZpZGUgMWUtMjkxIDFlKzEwNiAtPiAxRS0zOTcgU3Vibm9ybWFsCitkZGRpdjEwNjYgZGl2aWRlIDFlLTI5MSAxZSsxMDcgLT4gMUUtMzk4IFN1Ym5vcm1hbAorZGRkaXYxMDY3IGRpdmlkZSAxZS0yOTEgMWUrMTA4IC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGRpdjEwNjggZGl2aWRlIDFlLTI5MSAxZSsxMDkgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTA2OSBkaXZpZGUgMWUtMjkxIDFlKzExMCAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gW25vIGVxdWl2YWxlbnQgb2YgJ3N1Ym5vcm1hbCcgZm9yIG92ZXJmbG93XQorZGRkaXYxMDcwIGRpdmlkZSAxZSs2MCAxZS0zMjEgLT4gMS4wMDAwMDAwMDAwMDBFKzM4MSAgQ2xhbXBlZAorZGRkaXYxMDcxIGRpdmlkZSAxZSs2MCAxZS0zMjIgLT4gMS4wMDAwMDAwMDAwMDAwRSszODIgIENsYW1wZWQKK2RkZGl2MTA3MiBkaXZpZGUgMWUrNjAgMWUtMzIzIC0+IDEuMDAwMDAwMDAwMDAwMDBFKzM4MyAgQ2xhbXBlZAorZGRkaXYxMDczIGRpdmlkZSAxZSs2MCAxZS0zMjQgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAgQ2xhbXBlZAorZGRkaXYxMDc0IGRpdmlkZSAxZSs2MCAxZS0zMjUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwNzUgZGl2aWRlIDFlKzYwIDFlLTMyNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA3NiBkaXZpZGUgMWUrNjAgMWUtMzI3IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRkaXYxMDc3IGRpdmlkZSAxZSs2MCAxZS0zMjggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGRpdjEwNzggZGl2aWRlIDFlKzYwIDFlLTMyOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTA3OSBkaXZpZGUgMWUrNjAgMWUtMzMwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitkZGRpdjExMDEgZGl2aWRlICAxLjAwMDBFLTM5NCAgMSAgICAgLT4gMS4wMDAwRS0zOTQgU3Vibm9ybWFsCitkZGRpdjExMDIgZGl2aWRlICAxLjAwMEUtMzk0ICAgMWUrMSAgLT4gMS4wMDBFLTM5NSAgU3Vibm9ybWFsCitkZGRpdjExMDMgZGl2aWRlICAxLjAwRS0zOTQgICAgMWUrMiAgLT4gMS4wMEUtMzk2ICAgU3Vibm9ybWFsCitkZGRpdjExMDQgZGl2aWRlICAxLjBFLTM5NCAgICAgMWUrMyAgLT4gMS4wRS0zOTcgICAgU3Vibm9ybWFsCitkZGRpdjExMDUgZGl2aWRlICAxLjBFLTM5NCAgICAgMWUrNCAgLT4gMUUtMzk4ICAgICBTdWJub3JtYWwgUm91bmRlZAorZGRkaXYxMTA2IGRpdmlkZSAgMS4zRS0zOTQgICAgIDFlKzQgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTEwNyBkaXZpZGUgIDEuNUUtMzk0ICAgICAxZSs0ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMDggZGl2aWRlICAxLjdFLTM5NCAgICAgMWUrNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTA5IGRpdmlkZSAgMi4zRS0zOTQgICAgIDFlKzQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTExMCBkaXZpZGUgIDIuNUUtMzk0ICAgICAxZSs0ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMTEgZGl2aWRlICAyLjdFLTM5NCAgICAgMWUrNCAgLT4gM0UtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTEyIGRpdmlkZSAgMS40OUUtMzk0ICAgIDFlKzQgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTExMyBkaXZpZGUgIDEuNTBFLTM5NCAgICAxZSs0ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMTQgZGl2aWRlICAxLjUxRS0zOTQgICAgMWUrNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTE1IGRpdmlkZSAgMi40OUUtMzk0ICAgIDFlKzQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTExNiBkaXZpZGUgIDIuNTBFLTM5NCAgICAxZSs0ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMTcgZGl2aWRlICAyLjUxRS0zOTQgICAgMWUrNCAgLT4gM0UtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZGRpdjExMTggZGl2aWRlICAxRS0zOTQgICAgICAgMWUrNCAgLT4gMUUtMzk4ICAgICBTdWJub3JtYWwKK2RkZGl2MTExOSBkaXZpZGUgIDNFLTM5NCAgICAgICAxZSs1ICAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTEyMCBkaXZpZGUgIDVFLTM5NCAgICAgICAxZSs1ICAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTEyMSBkaXZpZGUgIDdFLTM5NCAgICAgICAxZSs1ICAtPiAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMjIgZGl2aWRlICA5RS0zOTQgICAgICAgMWUrNSAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTIzIGRpdmlkZSAgOS45RS0zOTQgICAgIDFlKzUgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZGRkaXYxMTI0IGRpdmlkZSAgMUUtMzk0ICAgICAgLTFlKzQgIC0+IC0xRS0zOTggICAgU3Vibm9ybWFsCitkZGRpdjExMjUgZGl2aWRlICAzRS0zOTQgICAgICAtMWUrNSAgLT4gLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGRpdjExMjYgZGl2aWRlIC01RS0zOTQgICAgICAgMWUrNSAgLT4gLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGRpdjExMjcgZGl2aWRlICA3RS0zOTQgICAgICAtMWUrNSAgLT4gLTFFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRkaXYxMTI4IGRpdmlkZSAtOUUtMzk0ICAgICAgIDFlKzUgIC0+IC0xRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MTEyOSBkaXZpZGUgIDkuOUUtMzk0ICAgIC0xZSs1ICAtPiAtMUUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGRpdjExMzAgZGl2aWRlICAzLjBFLTM5NCAgICAtMWUrNSAgLT4gLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2RkZGl2MTEzMSBkaXZpZGUgIDEuMEUtMTk5ICAgICAxZSsyMDAgLT4gMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZGl2MTEzMiBkaXZpZGUgIDEuMEUtMTk5ICAgICAxZSsxOTkgLT4gMUUtMzk4ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZGRpdjExMzMgZGl2aWRlICAxLjBFLTE5OSAgICAgMWUrMTk4IC0+IDEuMEUtMzk3ICBTdWJub3JtYWwKK2RkZGl2MTEzNCBkaXZpZGUgIDIuMEUtMTk5ICAgICAyZSsxOTggLT4gMS4wRS0zOTcgIFN1Ym5vcm1hbAorZGRkaXYxMTM1IGRpdmlkZSAgNC4wRS0xOTkgICAgIDRlKzE5OCAtPiAxLjBFLTM5NyAgU3Vibm9ybWFsCitkZGRpdjExMzYgZGl2aWRlIDEwLjBFLTE5OSAgICAxMGUrMTk4IC0+IDEuMEUtMzk3ICBTdWJub3JtYWwKK2RkZGl2MTEzNyBkaXZpZGUgMzAuMEUtMTk5ICAgIDMwZSsxOTggLT4gMS4wRS0zOTcgIFN1Ym5vcm1hbAorCistLSByYW5kb21zCitkZGRpdjIwMTAgIGRpdmlkZSAgLTMuMzAzMjI2NzE0OTAwNzExRS0zNSAgIDguNzk2NTc4ODQyNzEzMTgzRSs3MyAgIC0+ICAtMy43NTUxMjY1OTQwNTg3ODNFLTEwOSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAxMSAgZGl2aWRlICAgOTMzMTUzMzI3ODIxMDczLjYgICAgICAgNjg3ODIxODEwOTAyNDYuMjUgICAgICAgLT4gICAxMy41NjY3ODg4NTQ3NTc2MyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAxMiAgZGl2aWRlICAgNS4wNDc1MjQzNjA1NzkwNkUtNzIgICAtOC4xNzk0ODE3NzEyMzg2NDJFKzY0ICAgLT4gIC02LjE3MDk1ODYyNzYzMjgzNUUtMTM3IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDEzICBkaXZpZGUgIC0zNzA3NjEzMzA5NTgyMzE4ICAgICAgICAzMzk0OTExMTk2NTAzLjA0OCAgICAgICAtPiAgLTEwOTIuMTA5MDcwMDEwODM2IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDE0ICBkaXZpZGUgICA5OTY4OS4wNTU1MTkwNDYxICAgICAgIC00LjczNTIwODU1Mzg5MTQ2NCAgICAgICAtPiAgLTIxMDUyLjcyNzUzNzY1NDExIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDE1ICBkaXZpZGUgIC0xNDQ3OTE1Nzc1NjEzMzI5ICAgICAgICAyNjk3NTA3OTcuODE4NDg3NSAgICAgICAtPiAgLTUzNjc2MDUuMTY0OTI1NjUzIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDE2ICBkaXZpZGUgIC05LjM5NDg4MTMwNDIyNTI1OEUtMTkgIC04MzA1ODUuMDI1MjY3MTYzNiAgICAgICAtPiAgIDEuMTMxMTE2MTQzMjUxMzU4RS0yNCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAxNyAgZGl2aWRlICAtMS4wNTYyODM0MzI3Mzg5MzQgICAgICAgODguNTg3NTQ1NTUxMjQwMTMgICAgICAgLT4gIC0wLjAxMTkyMzYxMTAwMTU5MzUyIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDE4ICBkaXZpZGUgICA1NzYzMjIwOTMzMzQzLjA4MSAgICAgICA2ODkwODk1NjcwMjUwNTIuMSAgICAgICAtPiAgIDAuMDA4MzYzNTI5NTE2NTI0NDU2IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDE5ICBkaXZpZGUgICA4NzM4MTkuMTIyMTAzMjE2ICAgICAgICA5Ljc0MDYxMjQ5NDUyMzMwMEUtNDkgICAtPiAgIDguOTcwODg0NzYzMDkzOTQ4RSs1MyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAyMCAgZGl2aWRlICAgODAyMjkxNC44Mzg1MzM1NzYgICAgICAgNjE3OC41NjY4MDE3NDI3MTMgICAgICAgLT4gICAxMjk4LjUwNzQyMDI0MzU4MyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAyMSAgZGl2aWRlICAgMjAzOTgyLjc2MDU2NTAzNjMgICAgICAtMjE1OC4yODM2MzkwNTM0MzUgICAgICAgLT4gIC05NC41MTE1NjMyMDQyMjE2OCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAyMiAgZGl2aWRlICAgODAzLjYzMTA1NDcwMTMwMzAgICAgICAgNzEwMTE0Mzc5NTM5OS4yMzggICAgICAgLT4gICAxLjEzMTY5MjQxMTYxMTE2NkUtMTAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMjMgIGRpdmlkZSAgIDkuMjUxNjk3ODQyMTIzMzk5RS04MiAgLTEuMzQyMzUwMjIwNjA2MTE5RS03ICAgIC0+ICAtNi44OTIxNjM5ODIzMjE5MzZFLTc1IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDI0ICBkaXZpZGUgIC0xLjk4MDYwMDY0NTYzNzk5MkUtNTMgIC01LjQ3NDI2Mjc1MzIxNDQ1N0UrNzcgICAtPiAgIDMuNjE4MDIyNjE3NzAzMTY4RS0xMzEgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMjUgIGRpdmlkZSAgLTIxMC4wMzIyOTk2MzUxNjkwICAgICAgLTguNTgwOTUxODM1ODcyODQzRSs4MCAgIC0+ICAgMi40NDc2NTczNjU0MzQ5NzFFLTc5IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDI2ICBkaXZpZGUgIC0xLjgyMTk4MDMxNDAyMDM3MEUrODUgIC0zLjAxODkxNTI2NzEzODE2NSAgICAgICAtPiAgIDYuMDM1MjE1MTQ0NTAzMDQyRSs4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAyNyAgZGl2aWRlICAtNzcyMjY0NTAzNjAxLjEwNDcgICAgICAgNS4xNTgyNTgyNzE0MDg5ODhFLTg2ICAgLT4gIC0xLjQ5NzE0MTk4NjYzMDYxNEUrOTcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMjggIGRpdmlkZSAgLTc2Ny4wNTMyNDE1ODQ3MTA2ICAgICAgIDIuNzAwMDI3MjI4MDI4OTM5RS01OSAgIC0+ICAtMi44NDA5MDkyODI3NzI5NDFFKzYxIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDI5ICBkaXZpZGUgICA0OTY3MjQuODU0ODI1MDA5MyAgICAgICA3LjMyNzAwNTg4MTYzMTAwRSs2NiAgICAtPiAgIDYuNzc5MzcwMjIwOTI5MDEzRS02MiBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAzMCAgZGl2aWRlICAtMzA0MjMyNjUxNDQ3NzAzLjkgICAgICAtMTA4Ljk3MzA4MDg2NTc0NDAgICAgICAgLT4gICAyNzkxODE0NzIxODYyLjU2NSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAzMSAgZGl2aWRlICAtNy4yMzM4MTcxOTI2OTk0MDVFKzQyICAtNTcxMTMwMjAwNC4xNDk0MTEgICAgICAgLT4gICAxLjI2NjU3OTM1MjIxMTQzMEUrMzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMzIgIGRpdmlkZSAgLTkuOTk5MjIxNDQ0OTEyNzQ1RSs5NiAgIDQwMTA1Njk0MDY0NDYxOTcgICAgICAgIC0+ICAtMi40OTMyMTc0MDQyMDIyNTBFKzgxIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDMzICBkaXZpZGUgIC0xODM3MjcyLjA2MTkzNzYyMiAgICAgICA4LjM1NjMyMjgzODA2Njc2MiAgICAgICAtPiAgLTIxOTg2Ni4wOTM5MTk2ODgyIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDM0ICBkaXZpZGUgICAyMTY4LjUxNzU1NTYwNjUyOSAgICAgICAyMDkuMTkxMDI1ODYxNTA2MSAgICAgICAtPiAgIDEwLjM2NjIwNzM3NzU2Nzg0IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDM1ICBkaXZpZGUgIC0xLjg4NDM4OTc5MDU3NjM3MUUrODggICAyLjk1MTgxOTUzODcwNTgzRSsyMCAgICAtPiAgLTYuMzgzODI0NTA1MDc5ODI4RSs2NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAzNiAgZGl2aWRlICAgNzMyMjYzLjYwMzc0MzgxOTYgICAgICAgOTYxMjIyLjM2MzQ0NDY4ODkgICAgICAgLT4gICAwLjc2MTgwNDU4NTA2OTgyNjkgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwMzcgIGRpdmlkZSAgLTgxMzQ2MTQxOS4wMzQ4MzM2ICAgICAgIDUuMzc2MjkzNzUzODA5MTQzRSs4NCAgIC0+ICAtMS41MTMwNTI0MDQyODU5MjdFLTc2IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDM4ICBkaXZpZGUgIC00NTU2MjEzMzUwODEwOC41MCAgICAgIC05Ljc3Njg0MzQ5NDY5MDEwN0UrNTEgICAtPiAgIDQuNjYwMjA4OTQ1MDI5NTE5RS0zOSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjAzOSAgZGl2aWRlICAtNi40ODkzOTMxNzI0NDEwMTZFKzgwICAtOTEwMTk2NS4wOTc4NTIxMTMgICAgICAgLT4gICA3LjEyOTY2MTY3NDg5NzQyMUUrNzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNDAgIGRpdmlkZSAgIDMuNjk0NTc2MjM3MTE3MzQ5RSs5MyAgIDY2ODM1MTIuMDEyNjIyMDAzICAgICAgIC0+ICAgNS41Mjc4OTY0NTY0NDM5MTJFKzg2IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDQxICBkaXZpZGUgIC0yLjI1Mjg3NzcyNjQwMzI3MkUrMTkgIC03NDUxOTEzMjU2LjE4MTM2NyAgICAgICAtPiAgIDMwMjMyMjA1NDYuMTI1NTMxIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDQyICBkaXZpZGUgICA1MTgzMDMuMTk4OTExMTg0MiAgICAgICA1MC4wMTU4NzAyMDQ3NDEzMyAgICAgICAtPiAgIDEwMzYyLjc3NDc5MTA3MTIzIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDQzICBkaXZpZGUgICAyLjkwMjA4Nzg4MTg4MDEwM0UrMjQgICAzMy4zMjQwMDk5MjMwNTcwMiAgICAgICAtPiAgIDguNzA4Njk5NDg4OTg5NTc4RSsyMiBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA0NCAgZGl2aWRlICAgNTQ5NjE5LjQ1NTk1MTA1NTcgICAgICAgMTY2MDgyNDg0NTE5NjMzOCAgICAgICAgLT4gICAzLjMwOTMxNjE5NjM1MTEwNEUtMTAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNDUgIGRpdmlkZSAgLTY3NzU2NzA3NzQ2ODQwNDMgICAgICAgIDgyOTIxNTIwMjMuMDc3MjYyICAgICAgIC0+ICAtODE3MTE4LjQ5NDE4OTEwNjIgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNDYgIGRpdmlkZSAgLTc3LjUwOTIzOTIxNTI0MDc5ICAgICAgLTUuNjM2ODgyNjU1NDI1ODE1RSs3NCAgIC0+ICAgMS4zNzUwMzczMDI1ODg0MDVFLTczIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDQ3ICBkaXZpZGUgIC0yLjk4NDg4OTQ1OTYwNTE0OUUtMTAgIC04ODEwNjE1Njc4NDEyMi45OSAgICAgICAtPiAgIDMuMzg3ODMzMDA1NzIxMzg0RS0yNCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA0OCAgZGl2aWRlICAgMC45NDk1MTcyOTM5OTcwODUgICAgICAgNDQ3NjcxMTUuOTY0NTA5OTggICAgICAgLT4gICAyLjEyMTAxNTExMDE3NTU4OUUtOCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA0OSAgZGl2aWRlICAtMjc2MDkzNzIxMS4wODQ1MjEgICAgICAtMTA4NzAxNTg3Njk3NTQwOCAgICAgICAgLT4gICAwLjAwMDAwMjUzOTkyMzUzNzA1NzAyNCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA1MCAgZGl2aWRlICAgMjg0MzgzNTEuODUwMzA1MzYgICAgICAtNC4yMDkzOTc5MDQwODg2MjRFLTQ3ICAgLT4gIC02Ljc1NTkxOTEzNTc3MDY4OEUrNTMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjIwNTEgIGRpdmlkZSAgLTg1NTYyNzMxLjY4MjA5NTYgICAgICAgLTcuMTY2MDQ1NDQyNTMwMTg1RSs0NSAgIC0+ICAgMS4xOTQwMDIwODA2MjE1NDJFLTM4IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDUyICBkaXZpZGUgICAyNTMzODAyODUyMTY1LjI1ICAgICAgICA3MTU0LjExOTYwNjIzNTk1NSAgICAgICAtPiAgIDM1NDE3Mzk1Ny4zMzE3NTAxIEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDUzICBkaXZpZGUgIC04ODU4ODMxMzQ2ODUxLjQ3NCAgICAgICA5Ny41OTczNDIwODgwMTcxNiAgICAgICAtPiAgLTkwNzY5MTg2NTA5LjgzNTc3IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDU0ICBkaXZpZGUgICAxNzY3ODM2Mjk4MDEzODcuNSAgICAgICA4NDAwNzMyNjMuMzEwOTgxNyAgICAgICAtPiAgIDIxMDQzOC4zNDgwODQ4MjA2IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDU1ICBkaXZpZGUgIC00OTM1MDY0NzE3OTYxNzUuNiAgICAgICA3OTczMzg5NDc5MDgyMi4wMyAgICAgICAtPiAgLTYuMTg5NDE4ODU0OTQwNzQ2IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDU2ICBkaXZpZGUgICA3OTAuMTY4MjU0MjEwMzQ0NSAgICAgICA4MjkuOTQ0OTM3MDM2NzQzNSAgICAgICAtPiAgIDAuOTUyMDczMTA2MjM3MTIxNCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA1NyAgZGl2aWRlICAtODkyMDQ1OTgzOC41ODMxNjQgICAgICAtNDc2Ny44ODkxODc4OTkyMTQgICAgICAgLT4gICAxODcwOTQ1LjI5NDAzNTU4MSBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA1OCAgZGl2aWRlICAgNTM1MzY2ODcxNjQ0MjIuMSAgICAgICAgNTMxMzcuNTAwNzAzMjY4OSAgICAgICAgLT4gICAxMDA3NTEyMzMwLjM4NTY5OCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MjA1OSAgZGl2aWRlICAgNC4wNTE1MzIzMTExNDY1NjFFLTc0ICAtMi4zNDMwODk3Njg5NzIyNjFFKzk0ICAgLT4gIC0xLjcyOTE0MDg4MjYwNjMzMkUtMTY4IEluZXhhY3QgUm91bmRlZAorZGRkaXYyMDYwICBkaXZpZGUgIC0xNDg0Nzc1ODc3ODYzNi44OCAgICAgICAzLjA2MjU0MzUxNjM4MzgwN0UtNDMgICAtPiAgLTQuODQ4MTc4ODc0NTg3NDk3RSs1NSBJbmV4YWN0IFJvdW5kZWQKKworLS0gRGl2aXNpb24gcHJvYmFibHkgaGFzIHByZS1yb3VuZGluZywgc28gbmVlZCB0byB0ZXN0IHJvdW5kaW5nCistLSBleHBsaWNpdGx5IHJhdGhlciB0aGFuIGFzc3VtZSBpbmNsdWRlZCB0aHJvdWdoIG90aGVyIHRlc3RzOworLS0gdGVzdHMgaW5jbHVkZSBzaW1wbGUgcm91bmRpbmcgYW5kIGFsc28gdGhlIHRyaWNreSBjYXNlcyBvZiBzdGlja3kKKy0tIGJpdHMgZm9sbG93aW5nIHR3byB6ZXJvcworLS0KKy0tICAgMS85OTk5OSBnaXZlcyAwLjAwMDAxMDAwMDEwMDAwMTAwMDAxMDAwMDEwMDAwMTAwMDAxMDAwMDEKKy0tICAgICAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CistLQorLS0gICAxLzk5OTk5OSBnaXZlcyAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMDAwMTAwMDAwMTAwMDAwMTAwMDAwMQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorCityb3VuZGluZzogY2VpbGluZworZGRkaXYzMDAxICBkaXZpZGUgIDEgICAgIDMgICAgLT4gIDAuMzMzMzMzMzMzMzMzMzMzNCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAwMiAgZGl2aWRlICAyICAgICAzICAgIC0+ICAwLjY2NjY2NjY2NjY2NjY2NjcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwMDMgIGRpdmlkZSAgMSA5OTk5OSAgICAtPiAgMC4wMDAwMTAwMDAxMDAwMDEwMDAwMiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwMDQgIGRpdmlkZSAgMSA5OTk5OTkgICAtPiAgMC4wMDAwMDEwMDAwMDEwMDAwMDEwMDEgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBmbG9vcgorZGRkaXYzMDExICBkaXZpZGUgIDEgICAgIDMgICAgLT4gIDAuMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAxMiAgZGl2aWRlICAyICAgICAzICAgIC0+ICAwLjY2NjY2NjY2NjY2NjY2NjYgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwMTMgIGRpdmlkZSAgMSA5OTk5OSAgICAtPiAgMC4wMDAwMTAwMDAxMDAwMDEwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwMTQgIGRpdmlkZSAgMSA5OTk5OTkgICAtPiAgMC4wMDAwMDEwMDAwMDEwMDAwMDEwMDAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiB1cAorZGRkaXYzMDIxICBkaXZpZGUgIDEgICAgIDMgICAgLT4gIDAuMzMzMzMzMzMzMzMzMzMzNCBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAyMiAgZGl2aWRlICAyICAgICAzICAgIC0+ICAwLjY2NjY2NjY2NjY2NjY2NjcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwMjMgIGRpdmlkZSAgMSA5OTk5OSAgICAtPiAgMC4wMDAwMTAwMDAxMDAwMDEwMDAwMiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwMjQgIGRpdmlkZSAgMSA5OTk5OTkgICAtPiAgMC4wMDAwMDEwMDAwMDEwMDAwMDEwMDEgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZGRpdjMwMzEgIGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDMyICBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NiBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAzMyAgZGl2aWRlICAxIDk5OTk5ICAgIC0+ICAwLjAwMDAxMDAwMDEwMDAwMTAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzAzNCAgZGl2aWRlICAxIDk5OTk5OSAgIC0+ICAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2RkZGl2MzA0MSAgZGl2aWRlICAxICAgICAzICAgIC0+ICAwLjMzMzMzMzMzMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwNDIgIGRpdmlkZSAgMiAgICAgMyAgICAtPiAgMC42NjY2NjY2NjY2NjY2NjY3IEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDQzICBkaXZpZGUgIDEgOTk5OTkgICAgLT4gIDAuMDAwMDEwMDAwMTAwMDAxMDAwMDEgIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDQ0ICBkaXZpZGUgIDEgOTk5OTk5ICAgLT4gIDAuMDAwMDAxMDAwMDAxMDAwMDAxMDAwIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9kb3duCitkZGRpdjMwNTEgIGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDUyICBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA1MyAgZGl2aWRlICAxIDk5OTk5ICAgIC0+ICAwLjAwMDAxMDAwMDEwMDAwMTAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA1NCAgZGl2aWRlICAxIDk5OTk5OSAgIC0+ICAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZGRkaXYzMDYxICBkaXZpZGUgIDEgICAgIDMgICAgLT4gIDAuMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA2MiAgZGl2aWRlICAyICAgICAzICAgIC0+ICAwLjY2NjY2NjY2NjY2NjY2NjcgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwNjMgIGRpdmlkZSAgMSA5OTk5OSAgICAtPiAgMC4wMDAwMTAwMDAxMDAwMDEwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjMwNjQgIGRpdmlkZSAgMSA5OTk5OTkgICAtPiAgMC4wMDAwMDEwMDAwMDEwMDAwMDEwMDAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAwNXVwCitkZGRpdjMwNzEgIGRpdmlkZSAgMSAgICAgMyAgICAtPiAgMC4zMzMzMzMzMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGRkaXYzMDcyICBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NiBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA3MyAgZGl2aWRlICAxIDk5OTk5ICAgIC0+ICAwLjAwMDAxMDAwMDEwMDAwMTAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2MzA3NCAgZGl2aWRlICAxIDk5OTk5OSAgIC0+ICAwLjAwMDAwMTAwMDAwMTAwMDAwMTAwMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gcmFuZG9tIGRpdmlkZSB0ZXN0cyB3aXRoIHJlc3VsdCBuZWFyIDEKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkZGl2NDAwMSBkaXZpZGUgIDMxOTUzODUxOTI5MTY5MTcgICAzMTk1Mzg1MTkyOTQ2Njk1ICAtPiAgMC45OTk5OTk5OTk5OTA2ODA5ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAwMiBkaXZpZGUgIDEzOTM3MjMwNjc1MjY5OTMgICAxMzkzNzIzMDY3NTE5NDc1ICAtPiAgMS4wMDAwMDAwMDAwMDUzOTQgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDAzIGRpdmlkZSAgIDc1OTk4NTU0MzcwMjMwMiAgICA3NTk5ODU1NDM2NzQwMTUgIC0+ICAxLjAwMDAwMDAwMDAzNzIyMCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMDQgZGl2aWRlICA5NTc5MTU4NDU2MDI3MzAyICAgOTU3OTE1ODQ1NjAzNjg2NCAgLT4gIDAuOTk5OTk5OTk5OTk5MDAxOCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMDUgZGl2aWRlICA3MDc5Mzk4Mjk5MTQzNTY5ICAgNzA3OTM5ODI5OTE1NjkwNCAgLT4gIDAuOTk5OTk5OTk5OTk4MTE2NCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMDYgZGl2aWRlICA2NjM2MTY5MjU1MzY2NTk4ICAgNjYzNjE2OTI1NTMzNjM4NiAgLT4gIDEuMDAwMDAwMDAwMDA0NTUzICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAwNyBkaXZpZGUgIDY5NjQ4MTM5NzEzNDAwOTAgICA2OTY0ODEzOTcxMzIxNTU0ICAtPiAgMS4wMDAwMDAwMDAwMDI2NjEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDA4IGRpdmlkZSAgNDE4MjI3NTIyNTQ4MDc4NCAgIDQxODIyNzUyMjU0NTQwMDkgIC0+ICAxLjAwMDAwMDAwMDAwNjQwMiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMDkgZGl2aWRlICA5MjI4MzI1MTI0OTM4MDI5ICAgOTIyODMyNTEyNDkxODczMCAgLT4gIDEuMDAwMDAwMDAwMDAyMDkxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAxMCBkaXZpZGUgIDM0MjgzNDYzMzg2MzAxOTIgICAzNDI4MzQ2MzM4NjA5ODQzICAtPiAgMS4wMDAwMDAwMDAwMDU5MzYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDExIGRpdmlkZSAgMjE0MzUxMTU1MDcyMjg5MyAgIDIxNDM1MTE1NTA3NTE3NTQgIC0+ICAwLjk5OTk5OTk5OTk4NjUzNTYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDEyIGRpdmlkZSAgMTY3MjczMjkyNDM5Njc4NSAgIDE2NzI3MzI5MjQ0MDE4MTEgIC0+ICAwLjk5OTk5OTk5OTk5Njk5NTMgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDEzIGRpdmlkZSAgNDE5MDcxNDYxMTk0ODIxNiAgIDQxOTA3MTQ2MTE5NDg2NjQgIC0+ICAwLjk5OTk5OTk5OTk5OTg5MzEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDE0IGRpdmlkZSAgMzk0MjI1NDgwMDg0ODg3NyAgIDM5NDIyNTQ4MDA4MTQ1NTYgIC0+ICAxLjAwMDAwMDAwMDAwODcwNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTUgZGl2aWRlICAyODU0NDU5ODI2OTUyMzM0ICAgMjg1NDQ1OTgyNjk2MDc2MiAgLT4gIDAuOTk5OTk5OTk5OTk3MDQ3NCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTYgZGl2aWRlICAyODUzMjU4OTUzNjY0NzMxICAgMjg1MzI1ODk1MzY4NDQ3MSAgLT4gIDAuOTk5OTk5OTk5OTkzMDgxNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTcgZGl2aWRlICA5NDUzNTEyNjM4MTI1OTc4ICAgOTQ1MzUxMjYzODE0NjQyNSAgLT4gIDAuOTk5OTk5OTk5OTk3ODM3MSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMTggZGl2aWRlICAgMzM5NDc2NjMzOTQwMzY5ICAgIDMzOTQ3NjYzMzkxMjg4NyAgLT4gIDEuMDAwMDAwMDAwMDgwOTU0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAxOSBkaXZpZGUgIDQ1NDIxODE0OTI2ODg0NjcgICA0NTQyMTgxNDkyNjk3NzM1ICAtPiAgMC45OTk5OTk5OTk5OTc5NTk2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAyMCBkaXZpZGUgIDczMTI2MDAxOTIzOTkxOTcgICA3MzEyNjAwMTkyMzk1NDI0ICAtPiAgMS4wMDAwMDAwMDAwMDA1MTYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDIxIGRpdmlkZSAgMTgxMTY3NDk4NTU3MDExMSAgIDE4MTE2NzQ5ODU2MDM5MzUgIC0+ICAwLjk5OTk5OTk5OTk4MTMzMDAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDIyIGRpdmlkZSAgMTcwNjQ2MjYzOTAwMzQ4MSAgIDE3MDY0NjI2MzkwMTc3NDAgIC0+ICAwLjk5OTk5OTk5OTk5MTY0NDEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDIzIGRpdmlkZSAgNjY5NzA1MjY1NDk0MDM2OCAgIDY2OTcwNTI2NTQ5MzQxMTAgIC0+ICAxLjAwMDAwMDAwMDAwMDkzNCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjQgZGl2aWRlICA1MDE1MjgzNjY0Mjc3NTM5ICAgNTAxNTI4MzY2NDMxMDcxOSAgLT4gIDAuOTk5OTk5OTk5OTkzMzg0MiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMjUgZGl2aWRlICAyMzU5NTAxNTYxNTM3NDY0ICAgMjM1OTUwMTU2MTUwMjQ2NCAgLT4gIDEuMDAwMDAwMDAwMDE0ODM0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAyNiBkaXZpZGUgIDI2Njk4NTAyMjc5MDkxNTcgICAyNjY5ODUwMjI3OTAxNTQ4ICAtPiAgMS4wMDAwMDAwMDAwMDI4NTAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDI3IGRpdmlkZSAgOTMyOTcyNTU0Njk3NDY0OCAgIDkzMjk3MjU1NDcwMDI0NDUgIC0+ICAwLjk5OTk5OTk5OTk5NzAyMDYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDI4IGRpdmlkZSAgMzIyODU2Mjg2NzA3MTI0OCAgIDMyMjg1NjI4NjcxMDYyMDYgIC0+ICAwLjk5OTk5OTk5OTk4OTE3MjMgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDI5IGRpdmlkZSAgNDg2MjIyNjY0NDkyMTE3NSAgIDQ4NjIyMjY2NDQ5MDkzODAgIC0+ICAxLjAwMDAwMDAwMDAwMjQyNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMzAgZGl2aWRlICAxMDIyMjY3OTk3MDU0NTI5ICAgMTAyMjI2Nzk5NzA3MTMyOSAgLT4gIDAuOTk5OTk5OTk5OTgzNTY2MCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMzEgZGl2aWRlICAxMDQ4Nzc3NDgyMDIzNzE5ICAgMTA0ODc3NzQ4MjAwMDk0OCAgLT4gIDEuMDAwMDAwMDAwMDIxNzEyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAzMiBkaXZpZGUgIDk5ODAxMTM3NzczMzcwOTggICA5OTgwMTEzNzc3MzMwNTM5ICAtPiAgMS4wMDAwMDAwMDAwMDA2NTcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDMzIGRpdmlkZSAgNzUwNjgzOTE2Nzk2MzkwOCAgIDc1MDY4MzkxNjc5NDI5MDEgIC0+ICAxLjAwMDAwMDAwMDAwMjc5OCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwMzQgZGl2aWRlICAgMjMxMTE5NzUxOTc3ODYwICAgIDIzMTExOTc1MTk2MjQ1MyAgLT4gIDEuMDAwMDAwMDAwMDY2NjYyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAzNSBkaXZpZGUgIDQwMzQ5MDM2NjQ3NjI5NjIgICA0MDM0OTAzNjY0Nzk1NTI2ICAtPiAgMC45OTk5OTk5OTk5OTE5Mjk0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDAzNiBkaXZpZGUgIDU3MDAxMjIxNTIyNzQ2OTYgICA1NzAwMTIyMTUyMjUxMzg2ICAtPiAgMS4wMDAwMDAwMDAwMDQwODkgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDM3IGRpdmlkZSAgNjg2OTU5OTU5MDI5MzExMCAgIDY4Njk1OTk1OTAyOTM0OTUgIC0+ICAwLjk5OTk5OTk5OTk5OTk0NDAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDM4IGRpdmlkZSAgNTU3NjI4MTk2MDA5Mjc5NyAgIDU1NzYyODE5NjAxMDU1NzkgIC0+ICAwLjk5OTk5OTk5OTk5NzcwNzggIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDM5IGRpdmlkZSAgMjMwNDg0NDg4ODM4MTMxOCAgIDIzMDQ4NDQ4ODgzNTMwNzMgIC0+ICAxLjAwMDAwMDAwMDAxMjI1NSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDAgZGl2aWRlICAzMjY1OTMzNjUxNjU2NDUyICAgMzI2NTkzMzY1MTY4Mjc3OSAgLT4gIDAuOTk5OTk5OTk5OTkxOTM4OSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDEgZGl2aWRlICA1MjM1NzE0OTg1MDc5OTE0ICAgNTIzNTcxNDk4NTA2NjEzMSAgLT4gIDEuMDAwMDAwMDAwMDAyNjMyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA0MiBkaXZpZGUgIDU1Nzg0ODE1NzI4Mjc1NTEgICA1NTc4NDgxNTcyODIyOTQ1ICAtPiAgMS4wMDAwMDAwMDAwMDA4MjYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDQzIGRpdmlkZSAgNDkwOTYxNjA4MTM5NjEzNCAgIDQ5MDk2MTYwODEzNzMwNzYgIC0+ICAxLjAwMDAwMDAwMDAwNDY5NiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNDQgZGl2aWRlICAgNjM2NDQ3MjI0MzQ5NTM3ICAgIDYzNjQ0NzIyNDMzODc1NyAgLT4gIDEuMDAwMDAwMDAwMDE2OTM4ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA0NSBkaXZpZGUgIDE1MzkzNzM0MjgzOTY2NDAgICAxNTM5MzczNDI4MzY0NzI3ICAtPiAgMS4wMDAwMDAwMDAwMjA3MzEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDQ2IGRpdmlkZSAgMjAyODc4NjcwNzM3Nzg5MyAgIDIwMjg3ODY3MDczNzg4NjYgIC0+ICAwLjk5OTk5OTk5OTk5OTUyMDQgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDQ3IGRpdmlkZSAgIDEzNzY0MzI2MDQ4NjIyMiAgICAxMzc2NDMyNjA0ODc0MTkgIC0+ICAwLjk5OTk5OTk5OTk5MTMwMzYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDQ4IGRpdmlkZSAgIDI0NzQ1MTUxOTc0Njc2NSAgICAyNDc0NTE1MTk3NTIyNjcgIC0+ICAwLjk5OTk5OTk5OTk3Nzc2NTMgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDQ5IGRpdmlkZSAgNzg3Nzg1ODQ3NTAyMjA1NCAgIDc4Nzc4NTg0NzQ5OTk3OTQgIC0+ICAxLjAwMDAwMDAwMDAwMjgyNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNTAgZGl2aWRlICA3MzMzMjQyNjk0NzY2MjU4ICAgNzMzMzI0MjY5NDc0NDYyOCAgLT4gIDEuMDAwMDAwMDAwMDAyOTUwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1MSBkaXZpZGUgICAxMjQwNTE1MDM2OTg1OTIgICAgMTI0MDUxNTAzNjk5Mzk3ICAtPiAgMC45OTk5OTk5OTk5OTM1MTA4ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1MiBkaXZpZGUgIDg5NDQ3Mzc0MzIzODUxODggICA4OTQ0NzM3NDMyNDA2ODYwICAtPiAgMC45OTk5OTk5OTk5OTc1NzcxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1MyBkaXZpZGUgIDk4ODM5NDg5MjM0MDY4NzQgICA5ODgzOTQ4OTIzNDI0ODQzICAtPiAgMC45OTk5OTk5OTk5OTgxODIwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1NCBkaXZpZGUgIDY4MjkxNzg3NDE2NTQyODQgICA2ODI5MTc4NzQxNjcxOTczICAtPiAgMC45OTk5OTk5OTk5OTc0MDk4ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1NSBkaXZpZGUgIDczNDI3NTI0Nzk3NjgxMjIgICA3MzQyNzUyNDc5NzkzMzg1ICAtPiAgMC45OTk5OTk5OTk5OTY1NTk1ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1NiBkaXZpZGUgIDgwNjY0MjY1NzkwMDg3ODMgICA4MDY2NDI2NTc4OTc3NTYzICAtPiAgMS4wMDAwMDAwMDAwMDM4NzAgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDU3IGRpdmlkZSAgODk5Mjc3NTA3MTM4MzI5NSAgIDg5OTI3NzUwNzEzNTI3MTIgIC0+ICAxLjAwMDAwMDAwMDAwMzQwMSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNTggZGl2aWRlICA1NDg1MDExNzU1NTQ1NjQxICAgNTQ4NTAxMTc1NTU0MzYxMSAgLT4gIDEuMDAwMDAwMDAwMDAwMzcwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA1OSBkaXZpZGUgIDU3Nzk5ODMwNTQzNTM5MTggICA1Nzc5OTgzMDU0MzY1MzAwICAtPiAgMC45OTk5OTk5OTk5OTgwMzA4ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA2MCBkaXZpZGUgIDk1MDIyNjUxMDI3MTM3NzQgICA5NTAyMjY1MTAyNzM1MjA4ICAtPiAgMC45OTk5OTk5OTk5OTc3NDQzICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA2MSBkaXZpZGUgIDIxMDk1NTgzOTkxMzA5ODEgICAyMTA5NTU4Mzk5MTE2MjgxICAtPiAgMS4wMDAwMDAwMDAwMDY5NjggIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDYyIGRpdmlkZSAgNTI5NjE4MjYzNjM1MDQ3MSAgIDUyOTYxODI2MzYzNTE1MjEgIC0+ICAwLjk5OTk5OTk5OTk5OTgwMTcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDYzIGRpdmlkZSAgMTQ0MDAxOTIyNTU5MTg4MyAgIDE0NDAwMTkyMjU2MDE4NDQgIC0+ICAwLjk5OTk5OTk5OTk5MzA4MjcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDY0IGRpdmlkZSAgODE4MjExMDc5MTg4MTM0MSAgIDgxODIxMTA3OTE4NDcxNzQgIC0+ICAxLjAwMDAwMDAwMDAwNDE3NiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNjUgZGl2aWRlICAgNDg5MDk4MjM1NTEyMDYwICAgIDQ4OTA5ODIzNTUzNDUxNiAgLT4gIDAuOTk5OTk5OTk5OTU0MDg2OSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNjYgZGl2aWRlICA2NDc1Njg3MDg0NzgyMDM4ICAgNjQ3NTY4NzA4NDc1NjA4OSAgLT4gIDEuMDAwMDAwMDAwMDA0MDA3ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA2NyBkaXZpZGUgIDgwOTQzNDg1NTU3MzY5NDggICA4MDk0MzQ4NTU1NzU5MjM2ICAtPiAgMC45OTk5OTk5OTk5OTcyNDY1ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA2OCBkaXZpZGUgIDE5ODI3NjY4MTYyOTE1NDMgICAxOTgyNzY2ODE2MzA5NDYzICAtPiAgMC45OTk5OTk5OTk5OTA5NjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA2OSBkaXZpZGUgIDkyNzczMTQzMDAxMTMyNTEgICA5Mjc3MzE0MzAwMDg0NDY3ICAtPiAgMS4wMDAwMDAwMDAwMDMxMDMgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDcwIGRpdmlkZSAgNDMzNTUzMjk1OTMxODkzNCAgIDQzMzU1MzI5NTkyOTMxNjcgIC0+ICAxLjAwMDAwMDAwMDAwNTk0MyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNzEgZGl2aWRlICA3NzY3MTEzMDMyOTgxMzQ4ICAgNzc2NzExMzAzMjk2ODEzMiAgLT4gIDEuMDAwMDAwMDAwMDAxNzAyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA3MiBkaXZpZGUgIDE1Nzg1NDgwNTMzNDI4NjggICAxNTc4NTQ4MDUzMzcwNDQ4ICAtPiAgMC45OTk5OTk5OTk5ODI1MjgyICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA3MyBkaXZpZGUgIDM3OTA0MjA2ODY2NjY4OTggICAzNzkwNDIwNjg2NjM2MzE1ICAtPiAgMS4wMDAwMDAwMDAwMDgwNjggIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDc0IGRpdmlkZSAgIDg3MTY4MjQyMTk1NTE0NyAgICA4NzE2ODI0MjE5NzY0NDEgIC0+ICAwLjk5OTk5OTk5OTk3NTU3MTQgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDc1IGRpdmlkZSAgIDc0NDE0MTA1NDQ3OTk0MCAgICA3NDQxNDEwNTQ1MTIzMjkgIC0+ICAwLjk5OTk5OTk5OTk1NjQ3NDYgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDc2IGRpdmlkZSAgODk1NjgyNDE4MzY3MDczNSAgIDg5NTY4MjQxODM2NDE3NDEgIC0+ICAxLjAwMDAwMDAwMDAwMzIzNyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwNzcgZGl2aWRlICA4MzM3MjkxNjk0NDg1NjgyICAgODMzNzI5MTY5NDQ1MTE5MyAgLT4gIDEuMDAwMDAwMDAwMDA0MTM3ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA3OCBkaXZpZGUgIDQxMDc3NzU5NDQ2ODM2NjkgICA0MTA3Nzc1OTQ0NjU3MDk3ICAtPiAgMS4wMDAwMDAwMDAwMDY0NjkgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDc5IGRpdmlkZSAgODY5MTkwMDA1Nzk2NDY0OCAgIDg2OTE5MDAwNTc5OTc1NTUgIC0+ICAwLjk5OTk5OTk5OTk5NjIxNDEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDgwIGRpdmlkZSAgMjIyOTUyODUyMDUzNjQ2MiAgIDIyMjk1Mjg1MjA1MDIzMzcgIC0+ICAxLjAwMDAwMDAwMDAxNTMwNiAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwODEgZGl2aWRlICAgMzk4NDQyMDgzNzc0MzIyICAgIDM5ODQ0MjA4Mzc0NjI3MyAgLT4gIDEuMDAwMDAwMDAwMDcwMzk3ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA4MiBkaXZpZGUgIDUzMTk4MTk3NzY4MDg3NTkgICA1MzE5ODE5Nzc2ODM4MzEzICAtPiAgMC45OTk5OTk5OTk5OTQ0NDQ1ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA4MyBkaXZpZGUgIDc3MTA0OTEyOTkwNjY4NTUgICA3NzEwNDkxMjk5MDQxODU4ICAtPiAgMS4wMDAwMDAwMDAwMDMyNDIgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDg0IGRpdmlkZSAgOTA4MzIzMTI5NjA4NzI2NiAgIDkwODMyMzEyOTYwNTgxNjAgIC0+ICAxLjAwMDAwMDAwMDAwMzIwNCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwODUgZGl2aWRlICAzNTY2ODczNTc0OTA0NTU5ICAgMzU2Njg3MzU3NDg5MDMyOCAgLT4gIDEuMDAwMDAwMDAwMDAzOTkwICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA4NiBkaXZpZGUgICA1OTYzNDMyOTA1NTA1MjUgICAgNTk2MzQzMjkwNTU1NjE0ICAtPiAgMC45OTk5OTk5OTk5OTE0NjYzICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA4NyBkaXZpZGUgICAyNzgyMjc5MjUwOTMxOTIgICAgMjc4MjI3OTI1MDY4MTA0ICAtPiAgMS4wMDAwMDAwMDAwOTAxNzEgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDg4IGRpdmlkZSAgMzI5MjkwMjk1ODQ5MDY0OSAgIDMyOTI5MDI5NTg1MTk4ODEgIC0+ICAwLjk5OTk5OTk5OTk5MTEyMjcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDg5IGRpdmlkZSAgNTUyMTg3MTM2NDI0NTg4MSAgIDU1MjE4NzEzNjQyMjk1MzYgIC0+ICAxLjAwMDAwMDAwMDAwMjk2MCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTAgZGl2aWRlICAyNDA2NTA1NjAyODgzNjE3ICAgMjQwNjUwNTYwMjg1Nzk5NyAgLT4gIDEuMDAwMDAwMDAwMDEwNjQ2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5MSBkaXZpZGUgIDc3NDExNDY5ODQ4NjkyMDggICA3NzQxMTQ2OTg0ODY3MjU1ICAtPiAgMS4wMDAwMDAwMDAwMDAyNTIgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDkyIGRpdmlkZSAgNDU3NjA0MTgzMjQxNDkwOSAgIDQ1NzYwNDE4MzI0MDUxMDIgIC0+ICAxLjAwMDAwMDAwMDAwMjE0MyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTMgZGl2aWRlICA5MTgzNzU2OTgyODc4MDU3ICAgOTE4Mzc1Njk4MjkwMTkzNCAgLT4gIDAuOTk5OTk5OTk5OTk3NDAwMSAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTQgZGl2aWRlICA2MjE1NzM2NTEzODU1MTU5ICAgNjIxNTczNjUxMzg3MDM0MiAgLT4gIDAuOTk5OTk5OTk5OTk3NTU3MyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTUgZGl2aWRlICAgMjQ4NTU0OTY4NTM0NTMzICAgIDI0ODU1NDk2ODU1MTQxNyAgLT4gIDAuOTk5OTk5OTk5OTMyMDcxNCAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTYgZGl2aWRlICAgMzc2MzE0MTY1NjY4NjQ1ICAgIDM3NjMxNDE2NTY1OTc1NSAgLT4gIDEuMDAwMDAwMDAwMDIzNjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkZGl2NDA5NyBkaXZpZGUgIDU1MTM1NjkyNDk4MDk3MTggICA1NTEzNTY5MjQ5ODA4OTA2ICAtPiAgMS4wMDAwMDAwMDAwMDAxNDcgIEluZXhhY3QgUm91bmRlZAorZGRkaXY0MDk4IGRpdmlkZSAgMzM2Nzk5MjI0MjE2NzkwNCAgIDMzNjc5OTIyNDIxNTYyMjggIC0+ICAxLjAwMDAwMDAwMDAwMzQ2NyAgSW5leGFjdCBSb3VuZGVkCitkZGRpdjQwOTkgZGl2aWRlICA2MTM0ODY5NTM4OTY2OTY3ICAgNjEzNDg2OTUzODk4NTk4NiAgLT4gIDAuOTk5OTk5OTk5OTk2ODk5OSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIE51bGwgdGVzdHMKK2RkZGl2OTk5OCBkaXZpZGUgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGRpdjk5OTkgZGl2aWRlICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRGl2aWRlSW50LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRGl2aWRlSW50LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVjNTY3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGREaXZpZGVJbnQuZGVjVGVzdApAQCAtMCwwICsxLDQ0OSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZERpdmlkZUludC5kZWNUZXN0IC0tIGRlY0RvdWJsZSBpbnRlZ2VyIGRpdmlzaW9uICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZGR2aTAwMSBkaXZpZGVpbnQgIDEgICAgIDEgICAgLT4gIDEKK2RkZHZpMDAyIGRpdmlkZWludCAgMiAgICAgMSAgICAtPiAgMgorZGRkdmkwMDMgZGl2aWRlaW50ICAxICAgICAyICAgIC0+ICAwCitkZGR2aTAwNCBkaXZpZGVpbnQgIDIgICAgIDIgICAgLT4gIDEKK2RkZHZpMDA1IGRpdmlkZWludCAgMCAgICAgMSAgICAtPiAgMAorZGRkdmkwMDYgZGl2aWRlaW50ICAwICAgICAyICAgIC0+ICAwCitkZGR2aTAwNyBkaXZpZGVpbnQgIDEgICAgIDMgICAgLT4gIDAKK2RkZHZpMDA4IGRpdmlkZWludCAgMiAgICAgMyAgICAtPiAgMAorZGRkdmkwMDkgZGl2aWRlaW50ICAzICAgICAzICAgIC0+ICAxCisKK2RkZHZpMDEwIGRpdmlkZWludCAgMi40ICAgMSAgICAtPiAgMgorZGRkdmkwMTEgZGl2aWRlaW50ICAyLjQgICAtMSAgIC0+ICAtMgorZGRkdmkwMTIgZGl2aWRlaW50ICAtMi40ICAxICAgIC0+ICAtMgorZGRkdmkwMTMgZGl2aWRlaW50ICAtMi40ICAtMSAgIC0+ICAyCitkZGR2aTAxNCBkaXZpZGVpbnQgIDIuNDAgIDEgICAgLT4gIDIKK2RkZHZpMDE1IGRpdmlkZWludCAgMi40MDAgMSAgICAtPiAgMgorZGRkdmkwMTYgZGl2aWRlaW50ICAyLjQgICAyICAgIC0+ICAxCitkZGR2aTAxNyBkaXZpZGVpbnQgIDIuNDAwIDIgICAgLT4gIDEKK2RkZHZpMDE4IGRpdmlkZWludCAgMi4gICAgMiAgICAtPiAgMQorZGRkdmkwMTkgZGl2aWRlaW50ICAyMCAgICAyMCAgIC0+ICAxCisKK2RkZHZpMDIwIGRpdmlkZWludCAgMTg3ICAgMTg3ICAtPiAgMQorZGRkdmkwMjEgZGl2aWRlaW50ICA1ICAgICAyICAgIC0+ICAyCitkZGR2aTAyMiBkaXZpZGVpbnQgIDUgICAgIDIuMCAgICAtPiAgMgorZGRkdmkwMjMgZGl2aWRlaW50ICA1ICAgICAyLjAwMCAgLT4gIDIKK2RkZHZpMDI0IGRpdmlkZWludCAgNSAgICAgMC4yMDAgIC0+ICAyNQorZGRkdmkwMjUgZGl2aWRlaW50ICA1ICAgICAwLjIwMCAgLT4gIDI1CisKK2RkZHZpMDMwIGRpdmlkZWludCAgMSAgICAgMiAgICAgIC0+ICAwCitkZGR2aTAzMSBkaXZpZGVpbnQgIDEgICAgIDQgICAgICAtPiAgMAorZGRkdmkwMzIgZGl2aWRlaW50ICAxICAgICA4ICAgICAgLT4gIDAKK2RkZHZpMDMzIGRpdmlkZWludCAgMSAgICAgMTYgICAgIC0+ICAwCitkZGR2aTAzNCBkaXZpZGVpbnQgIDEgICAgIDMyICAgICAtPiAgMAorZGRkdmkwMzUgZGl2aWRlaW50ICAxICAgICA2NCAgICAgLT4gIDAKK2RkZHZpMDQwIGRpdmlkZWludCAgMSAgICAtMiAgICAgIC0+IC0wCitkZGR2aTA0MSBkaXZpZGVpbnQgIDEgICAgLTQgICAgICAtPiAtMAorZGRkdmkwNDIgZGl2aWRlaW50ICAxICAgIC04ICAgICAgLT4gLTAKK2RkZHZpMDQzIGRpdmlkZWludCAgMSAgICAtMTYgICAgIC0+IC0wCitkZGR2aTA0NCBkaXZpZGVpbnQgIDEgICAgLTMyICAgICAtPiAtMAorZGRkdmkwNDUgZGl2aWRlaW50ICAxICAgIC02NCAgICAgLT4gLTAKK2RkZHZpMDUwIGRpdmlkZWludCAtMSAgICAgMiAgICAgIC0+IC0wCitkZGR2aTA1MSBkaXZpZGVpbnQgLTEgICAgIDQgICAgICAtPiAtMAorZGRkdmkwNTIgZGl2aWRlaW50IC0xICAgICA4ICAgICAgLT4gLTAKK2RkZHZpMDUzIGRpdmlkZWludCAtMSAgICAgMTYgICAgIC0+IC0wCitkZGR2aTA1NCBkaXZpZGVpbnQgLTEgICAgIDMyICAgICAtPiAtMAorZGRkdmkwNTUgZGl2aWRlaW50IC0xICAgICA2NCAgICAgLT4gLTAKK2RkZHZpMDYwIGRpdmlkZWludCAtMSAgICAtMiAgICAgIC0+ICAwCitkZGR2aTA2MSBkaXZpZGVpbnQgLTEgICAgLTQgICAgICAtPiAgMAorZGRkdmkwNjIgZGl2aWRlaW50IC0xICAgIC04ICAgICAgLT4gIDAKK2RkZHZpMDYzIGRpdmlkZWludCAtMSAgICAtMTYgICAgIC0+ICAwCitkZGR2aTA2NCBkaXZpZGVpbnQgLTEgICAgLTMyICAgICAtPiAgMAorZGRkdmkwNjUgZGl2aWRlaW50IC0xICAgIC02NCAgICAgLT4gIDAKKworLS0gc2ltaWxhciB3aXRoIHBvd2VycyBvZiB0ZW4KK2RkZHZpMTYwIGRpdmlkZWludCAgMSAgICAgMSAgICAgICAgIC0+ICAxCitkZGR2aTE2MSBkaXZpZGVpbnQgIDEgICAgIDEwICAgICAgICAtPiAgMAorZGRkdmkxNjIgZGl2aWRlaW50ICAxICAgICAxMDAgICAgICAgLT4gIDAKK2RkZHZpMTYzIGRpdmlkZWludCAgMSAgICAgMTAwMCAgICAgIC0+ICAwCitkZGR2aTE2NCBkaXZpZGVpbnQgIDEgICAgIDEwMDAwICAgICAtPiAgMAorZGRkdmkxNjUgZGl2aWRlaW50ICAxICAgICAxMDAwMDAgICAgLT4gIDAKK2RkZHZpMTY2IGRpdmlkZWludCAgMSAgICAgMTAwMDAwMCAgIC0+ICAwCitkZGR2aTE2NyBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMDAwICAtPiAgMAorZGRkdmkxNjggZGl2aWRlaW50ICAxICAgICAxMDAwMDAwMDAgLT4gIDAKK2RkZHZpMTcwIGRpdmlkZWludCAgMSAgICAtMSAgICAgICAgIC0+IC0xCitkZGR2aTE3MSBkaXZpZGVpbnQgIDEgICAgLTEwICAgICAgICAtPiAtMAorZGRkdmkxNzIgZGl2aWRlaW50ICAxICAgIC0xMDAgICAgICAgLT4gLTAKK2RkZHZpMTczIGRpdmlkZWludCAgMSAgICAtMTAwMCAgICAgIC0+IC0wCitkZGR2aTE3NCBkaXZpZGVpbnQgIDEgICAgLTEwMDAwICAgICAtPiAtMAorZGRkdmkxNzUgZGl2aWRlaW50ICAxICAgIC0xMDAwMDAgICAgLT4gLTAKK2RkZHZpMTc2IGRpdmlkZWludCAgMSAgICAtMTAwMDAwMCAgIC0+IC0wCitkZGR2aTE3NyBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMDAwICAtPiAtMAorZGRkdmkxNzggZGl2aWRlaW50ICAxICAgIC0xMDAwMDAwMDAgLT4gLTAKK2RkZHZpMTgwIGRpdmlkZWludCAtMSAgICAgMSAgICAgICAgIC0+IC0xCitkZGR2aTE4MSBkaXZpZGVpbnQgLTEgICAgIDEwICAgICAgICAtPiAtMAorZGRkdmkxODIgZGl2aWRlaW50IC0xICAgICAxMDAgICAgICAgLT4gLTAKK2RkZHZpMTgzIGRpdmlkZWludCAtMSAgICAgMTAwMCAgICAgIC0+IC0wCitkZGR2aTE4NCBkaXZpZGVpbnQgLTEgICAgIDEwMDAwICAgICAtPiAtMAorZGRkdmkxODUgZGl2aWRlaW50IC0xICAgICAxMDAwMDAgICAgLT4gLTAKK2RkZHZpMTg2IGRpdmlkZWludCAtMSAgICAgMTAwMDAwMCAgIC0+IC0wCitkZGR2aTE4NyBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMDAwICAtPiAtMAorZGRkdmkxODggZGl2aWRlaW50IC0xICAgICAxMDAwMDAwMDAgLT4gLTAKK2RkZHZpMTkwIGRpdmlkZWludCAtMSAgICAtMSAgICAgICAgIC0+ICAxCitkZGR2aTE5MSBkaXZpZGVpbnQgLTEgICAgLTEwICAgICAgICAtPiAgMAorZGRkdmkxOTIgZGl2aWRlaW50IC0xICAgIC0xMDAgICAgICAgLT4gIDAKK2RkZHZpMTkzIGRpdmlkZWludCAtMSAgICAtMTAwMCAgICAgIC0+ICAwCitkZGR2aTE5NCBkaXZpZGVpbnQgLTEgICAgLTEwMDAwICAgICAtPiAgMAorZGRkdmkxOTUgZGl2aWRlaW50IC0xICAgIC0xMDAwMDAgICAgLT4gIDAKK2RkZHZpMTk2IGRpdmlkZWludCAtMSAgICAtMTAwMDAwMCAgIC0+ICAwCitkZGR2aTE5NyBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMDAwICAtPiAgMAorZGRkdmkxOTggZGl2aWRlaW50IC0xICAgIC0xMDAwMDAwMDAgLT4gIDAKKworLS0gc29tZSBsb25nIG9wZXJhbmQgKGF0IHA9OSkgY2FzZXMKK2RkZHZpMDcwIGRpdmlkZWludCAgOTk5OTk5OTk5ICAgICAxICAtPiAgOTk5OTk5OTk5CitkZGR2aTA3MSBkaXZpZGVpbnQgIDk5OTk5OTk5OS40ICAgMSAgLT4gIDk5OTk5OTk5OQorZGRkdmkwNzIgZGl2aWRlaW50ICA5OTk5OTk5OTkuNSAgIDEgIC0+ICA5OTk5OTk5OTkKK2RkZHZpMDczIGRpdmlkZWludCAgOTk5OTk5OTk5LjkgICAxICAtPiAgOTk5OTk5OTk5CitkZGR2aTA3NCBkaXZpZGVpbnQgIDk5OTk5OTk5OS45OTkgMSAgLT4gIDk5OTk5OTk5OQorCitkZGR2aTA5MCBkaXZpZGVpbnQgIDAuICAgICAgICAgICAgMSAgICAtPiAgMAorZGRkdmkwOTEgZGl2aWRlaW50ICAuMCAgICAgICAgICAgIDEgICAgLT4gIDAKK2RkZHZpMDkyIGRpdmlkZWludCAgMC4wMCAgICAgICAgICAxICAgIC0+ICAwCitkZGR2aTA5MyBkaXZpZGVpbnQgIDAuMDBFKzkgICAgICAgMSAgICAtPiAgMAorZGRkdmkwOTQgZGl2aWRlaW50ICAwLjAwMDBFLTUwICAgIDEgICAgLT4gIDAKKworZGRkdmkxMDAgZGl2aWRlaW50ICAxICAxICAgLT4gMQorZGRkdmkxMDEgZGl2aWRlaW50ICAxICAyICAgLT4gMAorZGRkdmkxMDIgZGl2aWRlaW50ICAxICAzICAgLT4gMAorZGRkdmkxMDMgZGl2aWRlaW50ICAxICA0ICAgLT4gMAorZGRkdmkxMDQgZGl2aWRlaW50ICAxICA1ICAgLT4gMAorZGRkdmkxMDUgZGl2aWRlaW50ICAxICA2ICAgLT4gMAorZGRkdmkxMDYgZGl2aWRlaW50ICAxICA3ICAgLT4gMAorZGRkdmkxMDcgZGl2aWRlaW50ICAxICA4ICAgLT4gMAorZGRkdmkxMDggZGl2aWRlaW50ICAxICA5ICAgLT4gMAorZGRkdmkxMDkgZGl2aWRlaW50ICAxICAxMCAgLT4gMAorZGRkdmkxMTAgZGl2aWRlaW50ICAxICAxICAgLT4gMQorZGRkdmkxMTEgZGl2aWRlaW50ICAyICAxICAgLT4gMgorZGRkdmkxMTIgZGl2aWRlaW50ICAzICAxICAgLT4gMworZGRkdmkxMTMgZGl2aWRlaW50ICA0ICAxICAgLT4gNAorZGRkdmkxMTQgZGl2aWRlaW50ICA1ICAxICAgLT4gNQorZGRkdmkxMTUgZGl2aWRlaW50ICA2ICAxICAgLT4gNgorZGRkdmkxMTYgZGl2aWRlaW50ICA3ICAxICAgLT4gNworZGRkdmkxMTcgZGl2aWRlaW50ICA4ICAxICAgLT4gOAorZGRkdmkxMTggZGl2aWRlaW50ICA5ICAxICAgLT4gOQorZGRkdmkxMTkgZGl2aWRlaW50ICAxMCAxICAgLT4gMTAKKworLS0gZnJvbSBEaWFnQmlnRGVjaW1hbAorZGRkdmkxMzEgZGl2aWRlaW50ICAxMDEuMyAgIDEgICAgIC0+ICAxMDEKK2RkZHZpMTMyIGRpdmlkZWludCAgMTAxLjAgICAxICAgICAtPiAgMTAxCitkZGR2aTEzMyBkaXZpZGVpbnQgIDEwMS4zICAgMyAgICAgLT4gIDMzCitkZGR2aTEzNCBkaXZpZGVpbnQgIDEwMS4wICAgMyAgICAgLT4gIDMzCitkZGR2aTEzNSBkaXZpZGVpbnQgIDIuNCAgICAgMSAgICAgLT4gIDIKK2RkZHZpMTM2IGRpdmlkZWludCAgMi40MDAgICAxICAgICAtPiAgMgorZGRkdmkxMzcgZGl2aWRlaW50ICAxOCAgICAgIDE4ICAgIC0+ICAxCitkZGR2aTEzOCBkaXZpZGVpbnQgIDExMjAgICAgMTAwMCAgLT4gIDEKK2RkZHZpMTM5IGRpdmlkZWludCAgMi40ICAgICAyICAgICAtPiAgMQorZGRkdmkxNDAgZGl2aWRlaW50ICAyLjQwMCAgIDIgICAgIC0+ICAxCitkZGR2aTE0MSBkaXZpZGVpbnQgIDAuNSAgICAgMi4wMDAgLT4gIDAKK2RkZHZpMTQyIGRpdmlkZWludCAgOC4wMDUgICA3ICAgICAtPiAgMQorZGRkdmkxNDMgZGl2aWRlaW50ICA1ICAgICAgIDIgICAgIC0+ICAyCitkZGR2aTE0NCBkaXZpZGVpbnQgIDAgICAgICAgMiAgICAgLT4gIDAKK2RkZHZpMTQ1IGRpdmlkZWludCAgMC4wMCAgICAyICAgICAtPiAgMAorCistLSBPdGhlcnMKK2RkZHZpMTUwIGRpdmlkZWludCAgMTIzNDUgIDQuOTk5ICAtPiAgMjQ2OQorZGRkdmkxNTEgZGl2aWRlaW50ICAxMjM0NSAgNC45OSAgIC0+ICAyNDczCitkZGR2aTE1MiBkaXZpZGVpbnQgIDEyMzQ1ICA0LjkgICAgLT4gIDI1MTkKK2RkZHZpMTUzIGRpdmlkZWludCAgMTIzNDUgIDUgICAgICAtPiAgMjQ2OQorZGRkdmkxNTQgZGl2aWRlaW50ICAxMjM0NSAgNS4xICAgIC0+ICAyNDIwCitkZGR2aTE1NSBkaXZpZGVpbnQgIDEyMzQ1ICA1LjAxICAgLT4gIDI0NjQKK2RkZHZpMTU2IGRpdmlkZWludCAgMTIzNDUgIDUuMDAxICAtPiAgMjQ2OAorZGRkdmkxNTcgZGl2aWRlaW50ICAgIDEwMSAgNy42ICAgIC0+ICAxMworCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIGRpdmlkZWludCBieSAwCitkZGR2aTIwMSBkaXZpZGVpbnQgIDAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkdmkyMDIgZGl2aWRlaW50ICAwLjBFNSAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZHZpMjAzIGRpdmlkZWludCAgMC4wMDAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGR2aTIwNCBkaXZpZGVpbnQgIDAuMDAwMSAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMDUgZGl2aWRlaW50ICAwLjAxICAgMCAgIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjA2IGRpdmlkZWludCAgMC4xICAgIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTIwNyBkaXZpZGVpbnQgIDEgICAgICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMDggZGl2aWRlaW50ICAxICAgICAgMC4wIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjA5IGRpdmlkZWludCAxMCAgICAgIDAuMCAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTIxMCBkaXZpZGVpbnQgMUUrMTAwICAwLjAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmkyMTEgZGl2aWRlaW50IDFFKzM4MCAgMCAgIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjE0IGRpdmlkZWludCAgLTAuMDAwMSAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjE1IGRpdmlkZWludCAgLTAuMDEgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjE2IGRpdmlkZWludCAgLTAuMSAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjE3IGRpdmlkZWludCAgLTEgICAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjE4IGRpdmlkZWludCAgLTEgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjE5IGRpdmlkZWludCAtMTAgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjIwIGRpdmlkZWludCAtMUUrMTAwICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpMjIxIGRpdmlkZWludCAtMUUrMzgwICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CitkZGR2aTI3MCBkaXZpZGVpbnQgMSAxZTM4NCAgICAgICAgICAtPiAwCitkZGR2aTI3MSBkaXZpZGVpbnQgMSAwLjllMzg0ICAgICAgICAtPiAwCitkZGR2aTI3MiBkaXZpZGVpbnQgMSAwLjk5ZTM4NCAgICAgICAtPiAwCitkZGR2aTI3MyBkaXZpZGVpbnQgMSAwLjk5OTk5OTk5OTk5OTk5OTllMzg0ICAgICAgIC0+IDAKK2RkZHZpMjc0IGRpdmlkZWludCA5ZTM4NCAgICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTI3NSBkaXZpZGVpbnQgOS45ZTM4NCAgMSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkyNzYgZGl2aWRlaW50IDkuOTllMzg0IDEgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkZHZpMjc3IGRpdmlkZWludCA5Ljk5OTk5OTk5OTk5OTk5OWUzODQgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCitkZGR2aTI4MCBkaXZpZGVpbnQgMC4xIDllLTM4MyAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkyODEgZGl2aWRlaW50IDAuMSA5OWUtMzgzICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkZHZpMjgyIGRpdmlkZWludCAwLjEgOTk5ZS0zODMgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTI4MyBkaXZpZGVpbnQgMC4xIDllLTM4MiAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkyODQgZGl2aWRlaW50IDAuMSA5OWUtMzgyICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gR0QgZWRnZSBjYXNlczogbGhzIHNtYWxsZXIgdGhhbiByaHMgYnV0IG1vcmUgZGlnaXRzCitkZGR2aTMwMSAgZGl2aWRlaW50ICAwLjkgICAgICAyICAgICAgLT4gIDAKK2RkZHZpMzAyICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMCAgICAtPiAgMAorZGRkdmkzMDMgIGRpdmlkZWludCAgMC45ICAgICAgMi4xICAgIC0+ICAwCitkZGR2aTMwNCAgZGl2aWRlaW50ICAwLjkgICAgICAyLjAwICAgLT4gIDAKK2RkZHZpMzA1ICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMDEgICAtPiAgMAorZGRkdmkzMDYgIGRpdmlkZWludCAgMC4xMiAgICAgMSAgICAgIC0+ICAwCitkZGR2aTMwNyAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAgICAgLT4gIDAKK2RkZHZpMzA4ICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMDAgICAtPiAgMAorZGRkdmkzMDkgIGRpdmlkZWludCAgMC4xMiAgICAgMS4wICAgIC0+ICAwCitkZGR2aTMxMCAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAwICAgLT4gIDAKK2RkZHZpMzExICBkaXZpZGVpbnQgIDAuMTIgICAgIDIgICAgICAtPiAgMAorZGRkdmkzMTIgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wICAgIC0+ICAwCitkZGR2aTMxMyAgZGl2aWRlaW50ICAwLjEyICAgICAyLjEgICAgLT4gIDAKK2RkZHZpMzE0ICBkaXZpZGVpbnQgIDAuMTIgICAgIDIuMDAgICAtPiAgMAorZGRkdmkzMTUgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wMSAgIC0+ICAwCisKKy0tIGVkZ2UgY2FzZXMgb2YgaW1wb3NzaWJsZQorZGRkdmkzMzAgIGRpdmlkZWludCAgMTIzNDU2Nzg5MDEyMzQ1NiAgMTAgICAgLT4gIDEyMzQ1Njc4OTAxMjM0NQorZGRkdmkzMzEgIGRpdmlkZWludCAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDEgICAgLT4gIDEyMzQ1Njc4OTAxMjM0NTYKK2RkZHZpMzMyICBkaXZpZGVpbnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAwLjEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkzMzMgIGRpdmlkZWludCAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDAuMDEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgW2Zyb20gZGl2aWRlXQorZGRkdmkxMDUxIGRpdmlkZWludCAgMWUrMjc3ICAxZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTEwNTIgZGl2aWRlaW50ICAxZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkZHZpMTA1MyBkaXZpZGVpbnQgLTFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRkdmkxMDU0IGRpdmlkZWludCAtMWUrMjc3IC0xZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZGR2aTEwNTUgZGl2aWRlaW50ICAxZS0yNzcgIDFlKzMxMSAtPiAgMAorZGRkdmkxMDU2IGRpdmlkZWludCAgMWUtMjc3IC0xZSszMTEgLT4gLTAKK2RkZHZpMTA1NyBkaXZpZGVpbnQgLTFlLTI3NyAgMWUrMzExIC0+IC0wCitkZGR2aTEwNTggZGl2aWRlaW50IC0xZS0yNzcgLTFlKzMxMSAtPiAgMAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RkZHZpMTA2MCBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwMSAtPiAwCitkZGR2aTEwNjEgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDIgLT4gMAorZGRkdmkxMDYyIGRpdmlkZWludCAxZS0yOTEgMWUrMTAzIC0+IDAKK2RkZHZpMTA2MyBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwNCAtPiAwCitkZGR2aTEwNjQgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDUgLT4gMAorZGRkdmkxMDY1IGRpdmlkZWludCAxZS0yOTEgMWUrMTA2IC0+IDAKK2RkZHZpMTA2NiBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwNyAtPiAwCitkZGR2aTEwNjcgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDggLT4gMAorZGRkdmkxMDY4IGRpdmlkZWludCAxZS0yOTEgMWUrMTA5IC0+IDAKK2RkZHZpMTA2OSBkaXZpZGVpbnQgMWUtMjkxIDFlKzExMCAtPiAwCisKK2RkZHZpMTEwMSBkaXZpZGVpbnQgIDEuMDAwMEUtMzk0ICAxICAgICAtPiAwCitkZGR2aTExMDIgZGl2aWRlaW50ICAxLjAwMEUtMzk0ICAgMWUrMSAgLT4gMAorZGRkdmkxMTAzIGRpdmlkZWludCAgMS4wMEUtMzk0ICAgIDFlKzIgIC0+IDAKKworZGRkdmkxMTE4IGRpdmlkZWludCAgMUUtMzk0ICAgICAgIDFlKzQgIC0+IDAKK2RkZHZpMTExOSBkaXZpZGVpbnQgIDNFLTM5NCAgICAgIC0xZSs1ICAtPiAtMAorZGRkdmkxMTIwIGRpdmlkZWludCAgNUUtMzk0ICAgICAgIDFlKzUgIC0+IDAKKworZGRkdmkxMTI0IGRpdmlkZWludCAgMUUtMzk0ICAgICAgLTFlKzQgIC0+IC0wCitkZGR2aTExMzAgZGl2aWRlaW50ICAzLjBFLTM5NCAgICAtMWUrNSAgLT4gLTAKKworZGRkdmkxMTMxIGRpdmlkZWludCAgMS4wRS0xOTkgICAgIDFlKzIwMCAtPiAwCitkZGR2aTExMzIgZGl2aWRlaW50ICAxLjBFLTE5OSAgICAgMWUrMTk5IC0+IDAKK2RkZHZpMTEzMyBkaXZpZGVpbnQgIDEuMEUtMTk5ICAgICAxZSsxOTggLT4gMAorZGRkdmkxMTM0IGRpdmlkZWludCAgMi4wRS0xOTkgICAgIDJlKzE5OCAtPiAwCitkZGR2aTExMzUgZGl2aWRlaW50ICA0LjBFLTE5OSAgICAgNGUrMTk4IC0+IDAKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworZGRkdmk0MDEgZGl2aWRlaW50IDEyMzQ1Njc4MDAwIDEwMCAtPiAxMjM0NTY3ODAKK2RkZHZpNDAyIGRpdmlkZWludCAxIDEyMzQ1Njc4MDAwICAgLT4gMAorZGRkdmk0MDMgZGl2aWRlaW50IDEyMzQ1Njc4MDAgIDEwICAtPiAxMjM0NTY3ODAKK2RkZHZpNDA0IGRpdmlkZWludCAxIDEyMzQ1Njc4MDAgICAgLT4gMAorZGRkdmk0MDUgZGl2aWRlaW50IDEyMzQ1Njc4OTAgIDEwICAtPiAxMjM0NTY3ODkKK2RkZHZpNDA2IGRpdmlkZWludCAxIDEyMzQ1Njc4OTAgICAgLT4gMAorZGRkdmk0MDcgZGl2aWRlaW50IDEyMzQ1Njc4OTEgIDEwICAtPiAxMjM0NTY3ODkKK2RkZHZpNDA4IGRpdmlkZWludCAxIDEyMzQ1Njc4OTEgICAgLT4gMAorZGRkdmk0MDkgZGl2aWRlaW50IDEyMzQ1Njc4OTAxIDEwMCAtPiAxMjM0NTY3ODkKK2RkZHZpNDEwIGRpdmlkZWludCAxIDEyMzQ1Njc4OTAxICAgLT4gMAorZGRkdmk0MTEgZGl2aWRlaW50IDEyMzQ1Njc4OTYgIDEwICAtPiAxMjM0NTY3ODkKK2RkZHZpNDEyIGRpdmlkZWludCAxIDEyMzQ1Njc4OTYgICAgLT4gMAorZGRkdmk0MTMgZGl2aWRlaW50IDEyMzQ1Njc4OTQ4IDEwMCAtPiAxMjM0NTY3ODkKK2RkZHZpNDE0IGRpdmlkZWludCAxMjM0NTY3ODk0OSAxMDAgLT4gMTIzNDU2Nzg5CitkZGR2aTQxNSBkaXZpZGVpbnQgMTIzNDU2Nzg5NTAgMTAwIC0+IDEyMzQ1Njc4OQorZGRkdmk0MTYgZGl2aWRlaW50IDEyMzQ1Njc4OTUxIDEwMCAtPiAxMjM0NTY3ODkKK2RkZHZpNDE3IGRpdmlkZWludCAxMjM0NTY3ODk5OSAxMDAgLT4gMTIzNDU2Nzg5CitkZGR2aTQ0MSBkaXZpZGVpbnQgMTIzNDU2NzgwMDAgMSAtPiAxMjM0NTY3ODAwMAorZGRkdmk0NDIgZGl2aWRlaW50IDEgMTIzNDU2NzgwMDAgLT4gMAorZGRkdmk0NDMgZGl2aWRlaW50IDEyMzQ1Njc4MDAgIDEgLT4gMTIzNDU2NzgwMAorZGRkdmk0NDQgZGl2aWRlaW50IDEgMTIzNDU2NzgwMCAgLT4gMAorZGRkdmk0NDUgZGl2aWRlaW50IDEyMzQ1Njc4OTAgIDEgLT4gMTIzNDU2Nzg5MAorZGRkdmk0NDYgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MCAgLT4gMAorZGRkdmk0NDcgZGl2aWRlaW50IDEyMzQ1Njc4OTEgIDEgLT4gMTIzNDU2Nzg5MQorZGRkdmk0NDggZGl2aWRlaW50IDEgMTIzNDU2Nzg5MSAgLT4gMAorZGRkdmk0NDkgZGl2aWRlaW50IDEyMzQ1Njc4OTAxIDEgLT4gMTIzNDU2Nzg5MDEKK2RkZHZpNDUwIGRpdmlkZWludCAxIDEyMzQ1Njc4OTAxIC0+IDAKK2RkZHZpNDUxIGRpdmlkZWludCAxMjM0NTY3ODk2ICAxIC0+IDEyMzQ1Njc4OTYKK2RkZHZpNDUyIGRpdmlkZWludCAxIDEyMzQ1Njc4OTYgIC0+IDAKKworLS0gbW9yZSB6ZXJvcywgZXRjLgorZGRkdmk1MzEgZGl2aWRlaW50IDUuMDAgMUUtMyAgICAtPiA1MDAwCitkZGR2aTUzMiBkaXZpZGVpbnQgMDAuMDAgMC4wMDAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZHZpNTMzIGRpdmlkZWludCAwMC4wMCAwRS0zICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRkdmk1MzQgZGl2aWRlaW50ICAwICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZGR2aTUzNSBkaXZpZGVpbnQgLTAgICAgIDAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkZHZpNTM2IGRpdmlkZWludCAtMCAgICAtMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorCitkZGR2aTU0MSBkaXZpZGVpbnQgIDAgICAgLTEgICAgIC0+IC0wCitkZGR2aTU0MiBkaXZpZGVpbnQgLTAgICAgLTEgICAgIC0+ICAwCitkZGR2aTU0MyBkaXZpZGVpbnQgIDAgICAgIDEgICAgIC0+ICAwCitkZGR2aTU0NCBkaXZpZGVpbnQgLTAgICAgIDEgICAgIC0+IC0wCitkZGR2aTU0NSBkaXZpZGVpbnQgLTEgICAgIDAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU0NiBkaXZpZGVpbnQgLTEgICAgLTAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU0NyBkaXZpZGVpbnQgIDEgICAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU0OCBkaXZpZGVpbnQgIDEgICAgLTAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2RkZHZpNTUxIGRpdmlkZWludCAgMC4wICAtMSAgICAgLT4gLTAKK2RkZHZpNTUyIGRpdmlkZWludCAtMC4wICAtMSAgICAgLT4gIDAKK2RkZHZpNTUzIGRpdmlkZWludCAgMC4wICAgMSAgICAgLT4gIDAKK2RkZHZpNTU0IGRpdmlkZWludCAtMC4wICAgMSAgICAgLT4gLTAKK2RkZHZpNTU1IGRpdmlkZWludCAtMS4wICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTU2IGRpdmlkZWludCAtMS4wICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTU3IGRpdmlkZWludCAgMS4wICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RkZHZpNTU4IGRpdmlkZWludCAgMS4wICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGRkdmk1NjEgZGl2aWRlaW50ICAwICAgIC0xLjAgICAtPiAtMAorZGRkdmk1NjIgZGl2aWRlaW50IC0wICAgIC0xLjAgICAtPiAgMAorZGRkdmk1NjMgZGl2aWRlaW50ICAwICAgICAxLjAgICAtPiAgMAorZGRkdmk1NjQgZGl2aWRlaW50IC0wICAgICAxLjAgICAtPiAtMAorZGRkdmk1NjUgZGl2aWRlaW50IC0xICAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmk1NjYgZGl2aWRlaW50IC0xICAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmk1NjcgZGl2aWRlaW50ICAxICAgICAwLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRkdmk1NjggZGl2aWRlaW50ICAxICAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkZGR2aTU3MSBkaXZpZGVpbnQgIDAuMCAgLTEuMCAgIC0+IC0wCitkZGR2aTU3MiBkaXZpZGVpbnQgLTAuMCAgLTEuMCAgIC0+ICAwCitkZGR2aTU3MyBkaXZpZGVpbnQgIDAuMCAgIDEuMCAgIC0+ICAwCitkZGR2aTU3NCBkaXZpZGVpbnQgLTAuMCAgIDEuMCAgIC0+IC0wCitkZGR2aTU3NSBkaXZpZGVpbnQgLTEuMCAgIDAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU3NiBkaXZpZGVpbnQgLTEuMCAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU3NyBkaXZpZGVpbnQgIDEuMCAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkZGR2aTU3OCBkaXZpZGVpbnQgIDEuMCAgLTAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKKy0tIFNwZWNpYWxzCitkZGR2aTU4MCBkaXZpZGVpbnQgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNTgxIGRpdmlkZWludCAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkZGR2aTU4MiBkaXZpZGVpbnQgIEluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZGRkdmk1ODMgZGl2aWRlaW50ICBJbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RkZHZpNTg0IGRpdmlkZWludCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkZGR2aTU4NSBkaXZpZGVpbnQgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZGRkdmk1ODYgZGl2aWRlaW50ICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RkZHZpNTg3IGRpdmlkZWludCAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk1ODggZGl2aWRlaW50IC0xMDAwICBJbmYgICAtPiAtMAorZGRkdmk1ODkgZGl2aWRlaW50IC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTU5MCBkaXZpZGVpbnQgLTEgICAgIEluZiAgIC0+IC0wCitkZGR2aTU5MSBkaXZpZGVpbnQgLTAgICAgIEluZiAgIC0+IC0wCitkZGR2aTU5MiBkaXZpZGVpbnQgIDAgICAgIEluZiAgIC0+ICAwCitkZGR2aTU5MyBkaXZpZGVpbnQgIDEgICAgIEluZiAgIC0+ICAwCitkZGR2aTU5NCBkaXZpZGVpbnQgIDEwMDAgIEluZiAgIC0+ICAwCitkZGR2aTU5NSBkaXZpZGVpbnQgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRkdmk2MDAgZGl2aWRlaW50IC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTYwMSBkaXZpZGVpbnQgLUluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZGRkdmk2MDIgZGl2aWRlaW50IC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RkZHZpNjAzIGRpdmlkZWludCAtSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkZGR2aTYwNCBkaXZpZGVpbnQgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZGRkdmk2MDUgZGl2aWRlaW50IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RkZHZpNjA2IGRpdmlkZWludCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZGR2aTYwNyBkaXZpZGVpbnQgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjA4IGRpdmlkZWludCAtMTAwMCAgSW5mICAgLT4gLTAKK2RkZHZpNjA5IGRpdmlkZWludCAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2MTAgZGl2aWRlaW50IC0xICAgIC1JbmYgICAtPiAgMAorZGRkdmk2MTEgZGl2aWRlaW50IC0wICAgIC1JbmYgICAtPiAgMAorZGRkdmk2MTIgZGl2aWRlaW50ICAwICAgIC1JbmYgICAtPiAtMAorZGRkdmk2MTMgZGl2aWRlaW50ICAxICAgIC1JbmYgICAtPiAtMAorZGRkdmk2MTQgZGl2aWRlaW50ICAxMDAwIC1JbmYgICAtPiAtMAorZGRkdmk2MTUgZGl2aWRlaW50ICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RkZHZpNjIxIGRpdmlkZWludCAgTmFOIC1JbmYgICAgLT4gIE5hTgorZGRkdmk2MjIgZGl2aWRlaW50ICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZGR2aTYyMyBkaXZpZGVpbnQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RkZHZpNjI0IGRpdmlkZWludCAgTmFOIC0wICAgICAgLT4gIE5hTgorZGRkdmk2MjUgZGl2aWRlaW50ICBOYU4gIDAgICAgICAtPiAgTmFOCitkZGR2aTYyNiBkaXZpZGVpbnQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RkZHZpNjI3IGRpdmlkZWludCAgTmFOICAxMDAwICAgLT4gIE5hTgorZGRkdmk2MjggZGl2aWRlaW50ICBOYU4gIEluZiAgICAtPiAgTmFOCitkZGR2aTYyOSBkaXZpZGVpbnQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkZHZpNjMwIGRpdmlkZWludCAtSW5mICBOYU4gICAgLT4gIE5hTgorZGRkdmk2MzEgZGl2aWRlaW50IC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZGR2aTYzMiBkaXZpZGVpbnQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RkZHZpNjMzIGRpdmlkZWludCAtMCAgICBOYU4gICAgLT4gIE5hTgorZGRkdmk2MzQgZGl2aWRlaW50ICAwICAgIE5hTiAgICAtPiAgTmFOCitkZGR2aTYzNSBkaXZpZGVpbnQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RkZHZpNjM2IGRpdmlkZWludCAgMTAwMCBOYU4gICAgLT4gIE5hTgorZGRkdmk2MzcgZGl2aWRlaW50ICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RkZHZpNjQxIGRpdmlkZWludCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQyIGRpdmlkZWludCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQzIGRpdmlkZWludCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQ0IGRpdmlkZWludCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQ1IGRpdmlkZWludCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQ2IGRpdmlkZWludCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQ3IGRpdmlkZWludCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQ4IGRpdmlkZWludCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjQ5IGRpdmlkZWludCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjUwIGRpdmlkZWludCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjUxIGRpdmlkZWludCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjUyIGRpdmlkZWludCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjUzIGRpdmlkZWludCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjU0IGRpdmlkZWludCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjU1IGRpdmlkZWludCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjU2IGRpdmlkZWludCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjU3IGRpdmlkZWludCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjU4IGRpdmlkZWludCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjU5IGRpdmlkZWludCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRkdmk2NjEgZGl2aWRlaW50ICBOYU45IC1JbmYgICAtPiAgTmFOOQorZGRkdmk2NjIgZGl2aWRlaW50ICBOYU44ICAxMDAwICAtPiAgTmFOOAorZGRkdmk2NjMgZGl2aWRlaW50ICBOYU43ICBJbmYgICAtPiAgTmFONworZGRkdmk2NjQgZGl2aWRlaW50IC1OYU42ICBOYU41ICAtPiAtTmFONgorZGRkdmk2NjUgZGl2aWRlaW50IC1JbmYgICBOYU40ICAtPiAgTmFONAorZGRkdmk2NjYgZGl2aWRlaW50IC0xMDAwICBOYU4zICAtPiAgTmFOMworZGRkdmk2NjcgZGl2aWRlaW50ICBJbmYgIC1OYU4yICAtPiAtTmFOMgorCitkZGR2aTY3MSBkaXZpZGVpbnQgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NzIgZGl2aWRlaW50ICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjczIGRpdmlkZWludCAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTY3NCBkaXZpZGVpbnQgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NzUgZGl2aWRlaW50ICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjc2IGRpdmlkZWludCAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTY3NyBkaXZpZGVpbnQgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGRkdmk2NzggZGl2aWRlaW50ICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkZHZpNjc5IGRpdmlkZWludCAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK2RkZHZpOTAwIGRpdmlkZWludCAgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGR2aTkwMSBkaXZpZGVpbnQgICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEVuY29kZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEVuY29kZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOWQzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRW5jb2RlLmRlY1Rlc3QKQEAgLTAsMCArMSw0OTUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRFbmNvZGUuZGVjVGVzdCAtLSBkZWNpbWFsIGVpZ2h0LWJ5dGUgZm9ybWF0IHRlc3RjYXNlcyAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMCwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gW1ByZXZpb3VzbHkgY2FsbGVkIGRlY2ltYWw2NC5kZWNUZXN0XQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBpcyBmb3IgdGhlIGVpZ2h0LWJ5dGUgY29uY3JldGUgcmVwcmVzZW50YXRpb24uCistLSBJdHMgY2hhcmFjdGVyaXN0aWNzIGFyZToKKy0tCistLSAgMSBiaXQgIHNpZ24KKy0tICA1IGJpdHMgY29tYmluYXRpb24gZmllbGQKKy0tICA4IGJpdHMgZXhwb25lbnQgY29udGludWF0aW9uCistLSA1MCBiaXRzIGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbgorLS0KKy0tIFRvdGFsIGV4cG9uZW50IGxlbmd0aCAxMCBiaXRzCistLSBUb3RhbCBjb2VmZmljaWVudCBsZW5ndGggNTQgYml0cyAoMTYgZGlnaXRzKQorLS0KKy0tIEVsaW1pdCA9ICA3NjcgKG1heGltdW0gZW5jb2RlZCBleHBvbmVudCkKKy0tIEVtYXggICA9ICAzODQgKGxhcmdlc3QgZXhwb25lbnQgdmFsdWUpCistLSBFbWluICAgPSAtMzgzIChzbWFsbGVzdCBleHBvbmVudCB2YWx1ZSkKKy0tIGJpYXMgICA9ICAzOTggKHN1YnRyYWN0ZWQgZnJvbSBlbmNvZGVkIGV4cG9uZW50KSA9IC1FdGlueQorCistLSBUaGUgdGVzdGNhc2VzIGhlcmUgaGF2ZSBvbmx5IGV4YWN0bHkgcmVwcmVzZW50YWJsZSBkYXRhIG9uIHRoZQorLS0gJ2xlZnQtaGFuZC1zaWRlJzsgcm91bmRpbmcgZnJvbSBzdHJpbmdzIGlzIHRlc3RlZCBpbiAnYmFzZScKKy0tIHRlc3RjYXNlIGdyb3Vwcy4KKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworCistLSBHZW5lcmFsIHRlc3RjYXNlcworLS0gKG1vc3RseSBkZXJpdmVkIGZyb20gdGhlIFN0cmF3bWFuIDQgZG9jdW1lbnQgYW5kIGV4YW1wbGVzKQorZGVjZTAwMSBhcHBseSAgICNBMjMwMDAwMDAwMDAwM0QwIC0+IC03LjUwCitkZWNlMDAyIGFwcGx5ICAgLTcuNTAgICAgICAgICAgICAgLT4gI0EyMzAwMDAwMDAwMDAzRDAKKy0tIGRlcml2YXRpdmUgY2Fub25pY2FsIHBsYWluIHN0cmluZ3MKK2RlY2UwMDMgYXBwbHkgICAjQTIzYzAwMDAwMDAwMDNEMCAtPiAtNy41MEUrMworZGVjZTAwNCBhcHBseSAgIC03LjUwRSszICAgICAgICAgIC0+ICNBMjNjMDAwMDAwMDAwM0QwCitkZWNlMDA1IGFwcGx5ICAgI0EyMzgwMDAwMDAwMDAzRDAgLT4gLTc1MAorZGVjZTAwNiBhcHBseSAgIC03NTAgICAgICAgICAgICAgIC0+ICNBMjM4MDAwMDAwMDAwM0QwCitkZWNlMDA3IGFwcGx5ICAgI0EyMzQwMDAwMDAwMDAzRDAgLT4gLTc1LjAKK2RlY2UwMDggYXBwbHkgICAtNzUuMCAgICAgICAgICAgICAtPiAjQTIzNDAwMDAwMDAwMDNEMAorZGVjZTAwOSBhcHBseSAgICNBMjJjMDAwMDAwMDAwM0QwIC0+IC0wLjc1MAorZGVjZTAxMCBhcHBseSAgIC0wLjc1MCAgICAgICAgICAgIC0+ICNBMjJjMDAwMDAwMDAwM0QwCitkZWNlMDExIGFwcGx5ICAgI0EyMjgwMDAwMDAwMDAzRDAgLT4gLTAuMDc1MAorZGVjZTAxMiBhcHBseSAgIC0wLjA3NTAgICAgICAgICAgIC0+ICNBMjI4MDAwMDAwMDAwM0QwCitkZWNlMDEzIGFwcGx5ICAgI0EyMjAwMDAwMDAwMDAzRDAgLT4gLTAuMDAwNzUwCitkZWNlMDE0IGFwcGx5ICAgLTAuMDAwNzUwICAgICAgICAgLT4gI0EyMjAwMDAwMDAwMDAzRDAKK2RlY2UwMTUgYXBwbHkgICAjQTIxODAwMDAwMDAwMDNEMCAtPiAtMC4wMDAwMDc1MAorZGVjZTAxNiBhcHBseSAgIC0wLjAwMDAwNzUwICAgICAgIC0+ICNBMjE4MDAwMDAwMDAwM0QwCitkZWNlMDE3IGFwcGx5ICAgI0EyMTQwMDAwMDAwMDAzRDAgLT4gLTcuNTBFLTcKK2RlY2UwMTggYXBwbHkgICAtNy41MEUtNyAgICAgICAgICAtPiAjQTIxNDAwMDAwMDAwMDNEMAorCistLSBOb3JtYWxpdHkKK2RlY2UwMjAgYXBwbHkgICAxMjM0NTY3ODkwMTIzNDU2ICAgLT4gIzI2MzkzNGI5YzFlMjhlNTYKK2RlY2UwMjEgYXBwbHkgIC0xMjM0NTY3ODkwMTIzNDU2ICAgLT4gI2E2MzkzNGI5YzFlMjhlNTYKK2RlY2UwMjIgYXBwbHkgICAxMjM0LjU2Nzg5MDEyMzQ1NiAgLT4gIzI2MDkzNGI5YzFlMjhlNTYKK2RlY2UwMjMgYXBwbHkgICMyNjA5MzRiOWMxZTI4ZTU2ICAgLT4gMTIzNC41Njc4OTAxMjM0NTYKK2RlY2UwMjQgYXBwbHkgICAxMTExMTExMTExMTExMTExICAgLT4gIzI2Mzg5MTI0NDkxMjQ0OTEKK2RlY2UwMjUgYXBwbHkgICA5OTk5OTk5OTk5OTk5OTk5ICAgLT4gIzZlMzhmZjNmY2ZmM2ZjZmYKKworLS0gTm1heCBhbmQgc2ltaWxhcgorZGVjZTAzMSBhcHBseSAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgIC0+ICM3N2ZjZmYzZmNmZjNmY2ZmCitkZWNlMDMyIGFwcGx5ICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gIzc3ZmNmZjNmY2ZmM2ZjZmYKK2RlY2UwMzMgYXBwbHkgICAjNzdmY2ZmM2ZjZmYzZmNmZiAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZWNlMDM0IGFwcGx5ICAgMS4yMzQ1Njc4OTAxMjM0NTZFKzM4NCAgLT4gIzQ3ZmQzNGI5YzFlMjhlNTYKK2RlY2UwMzUgYXBwbHkgICAjNDdmZDM0YjljMWUyOGU1NiAgICAgICAtPiAxLjIzNDU2Nzg5MDEyMzQ1NkUrMzg0CistLSBmb2xkLWRvd25zIChtb3JlIGJlbG93KQorZGVjZTAzNiBhcHBseSAgIDEuMjNFKzM4NCAgICAgICAgICAgICAgIC0+ICM0N2ZkMzAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY2UwMzcgYXBwbHkgICAjNDdmZDMwMDAwMDAwMDAwMCAgICAgICAtPiAxLjIzMDAwMDAwMDAwMDAwMEUrMzg0CitkZWNkMDM4IGFwcGx5ICAgMUUrMzg0ICAgICAgICAgICAgICAgICAgLT4gIzQ3ZmMwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDAzOSBhcHBseSAgICM0N2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQKKworZGVjZDA1MSBhcHBseSAgIDEyMzQ1ICAgICAgICAgICAgICAgICAgIC0+ICMyMjM4MDAwMDAwMDA0OWM1CitkZWNkMDUyIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDQ5YzUgICAgICAgLT4gMTIzNDUKK2RlY2QwNTMgYXBwbHkgICAxMjM0ICAgICAgICAgICAgICAgICAgICAtPiAjMjIzODAwMDAwMDAwMDUzNAorZGVjZDA1NCBhcHBseSAgICMyMjM4MDAwMDAwMDAwNTM0ICAgICAgIC0+IDEyMzQKK2RlY2QwNTUgYXBwbHkgICAxMjMgICAgICAgICAgICAgICAgICAgICAtPiAjMjIzODAwMDAwMDAwMDBhMworZGVjZDA1NiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMGEzICAgICAgIC0+IDEyMworZGVjZDA1NyBhcHBseSAgIDEyICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjM4MDAwMDAwMDAwMDEyCitkZWNkMDU4IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMTIgICAgICAgLT4gMTIKK2RlY2QwNTkgYXBwbHkgICAxICAgICAgICAgICAgICAgICAgICAgICAtPiAjMjIzODAwMDAwMDAwMDAwMQorZGVjZDA2MCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDAxICAgICAgIC0+IDEKK2RlY2QwNjEgYXBwbHkgICAxLjIzICAgICAgICAgICAgICAgICAgICAtPiAjMjIzMDAwMDAwMDAwMDBhMworZGVjZDA2MiBhcHBseSAgICMyMjMwMDAwMDAwMDAwMGEzICAgICAgIC0+IDEuMjMKK2RlY2QwNjMgYXBwbHkgICAxMjMuNDUgICAgICAgICAgICAgICAgICAtPiAjMjIzMDAwMDAwMDAwNDljNQorZGVjZDA2NCBhcHBseSAgICMyMjMwMDAwMDAwMDA0OWM1ICAgICAgIC0+IDEyMy40NQorCistLSBObWluIGFuZCBiZWxvdworZGVjZDA3MSBhcHBseSAgIDFFLTM4MyAgICAgICAgICAgICAgICAgIC0+ICMwMDNjMDAwMDAwMDAwMDAxCitkZWNkMDcyIGFwcGx5ICAgIzAwM2MwMDAwMDAwMDAwMDEgICAgICAgLT4gMUUtMzgzCitkZWNkMDczIGFwcGx5ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gIzA0MDAwMDAwMDAwMDAwMDAKK2RlY2QwNzQgYXBwbHkgICAjMDQwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZWNkMDc1IGFwcGx5ICAgMS4wMDAwMDAwMDAwMDAwMDFFLTM4MyAgLT4gIzA0MDAwMDAwMDAwMDAwMDEKK2RlY2QwNzYgYXBwbHkgICAjMDQwMDAwMDAwMDAwMDAwMSAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzCisKK2RlY2QwNzcgYXBwbHkgICAwLjEwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAjMDAwMDgwMDAwMDAwMDAwMCAgICAgIFN1Ym5vcm1hbAorZGVjZDA3OCBhcHBseSAgICMwMDAwODAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDBFLTM4NCAgU3Vibm9ybWFsCitkZWNkMDc5IGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMTBFLTM4MyAgLT4gIzAwMDAwMDAwMDAwMDAwMTAgICAgICBTdWJub3JtYWwKK2RlY2QwODAgYXBwbHkgICAjMDAwMDAwMDAwMDAwMDAxMCAgICAgICAtPiAxLjBFLTM5NyAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorZGVjZDA4MSBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDFFLTM4MyAgIC0+ICMwMDA0MDAwMDAwMDAwMDAxICAgICAgU3Vibm9ybWFsCitkZWNkMDgyIGFwcGx5ICAgIzAwMDQwMDAwMDAwMDAwMDEgICAgICAgLT4gMUUtMzk3ICAgICAgICAgICAgICAgICBTdWJub3JtYWwKK2RlY2QwODMgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAwMUUtMzgzICAtPiAjMDAwMDAwMDAwMDAwMDAwMSAgICAgIFN1Ym5vcm1hbAorZGVjZDA4NCBhcHBseSAgICMwMDAwMDAwMDAwMDAwMDAxICAgICAgIC0+IDFFLTM5OCAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHNtYWxsZXN0IGFsbC1uaW5lcworZGVjZDA4NSBhcHBseSAgIDk5OTk5OTk5OTk5OTk5OTlFLTM5OCAgIC0+ICM2NDAwZmYzZmNmZjNmY2ZmCitkZWNkMDg2IGFwcGx5ICAgIzY0MDBmZjNmY2ZmM2ZjZmYgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTM4MworLS0gYW5kIGEgcHJvYmxlbWF0aWMgZGl2aWRlIHJlc3VsdAorZGVjZDA4OCBhcHBseSAgIDEuMTExMTExMTExMTExMTExRS0zODMgIC0+ICMwNDAwOTEyNDQ5MTI0NDkxCitkZWNkMDg5IGFwcGx5ICAgIzA0MDA5MTI0NDkxMjQ0OTEgICAgICAgLT4gMS4xMTExMTExMTExMTExMTFFLTM4MworCistLSBmb3J0aWVzCitkZWNkMDkwIGFwcGx5ICAgICAgICA0MCAgICAgICAgICAgICAgICAtPiAjMjIzODAwMDAwMDAwMDA0MAorZGVjZDA5MSBhcHBseSAgICAgICAgMzkuOTkgICAgICAgICAgICAgLT4gIzIyMzAwMDAwMDAwMDBjZmYKKworLS0gdW5kZXJmbG93cyBjYW5ub3QgYmUgdGVzdGVkIGFzIGFsbCBMSFMgZXhhY3QKKworLS0gU2FtZSBhZ2FpbiwgbmVnYXRpdmVzCistLSBObWF4IGFuZCBzaW1pbGFyCitkZWNkMTIyIGFwcGx5ICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gI2Y3ZmNmZjNmY2ZmM2ZjZmYKK2RlY2QxMjMgYXBwbHkgICAjZjdmY2ZmM2ZjZmYzZmNmZiAgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGVjZDEyNCBhcHBseSAgLTEuMjM0NTY3ODkwMTIzNDU2RSszODQgIC0+ICNjN2ZkMzRiOWMxZTI4ZTU2CitkZWNkMTI1IGFwcGx5ICAgI2M3ZmQzNGI5YzFlMjhlNTYgICAgICAgLT4gLTEuMjM0NTY3ODkwMTIzNDU2RSszODQKKy0tIGZvbGQtZG93bnMgKG1vcmUgYmVsb3cpCitkZWNkMTMwIGFwcGx5ICAtMS4yM0UrMzg0ICAgICAgICAgICAgICAgLT4gI2M3ZmQzMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDEzMSBhcHBseSAgICNjN2ZkMzAwMDAwMDAwMDAwICAgICAgIC0+IC0xLjIzMDAwMDAwMDAwMDAwMEUrMzg0CitkZWNkMTMyIGFwcGx5ICAtMUUrMzg0ICAgICAgICAgICAgICAgICAgLT4gI2M3ZmMwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDEzMyBhcHBseSAgICNjN2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUrMzg0CisKKy0tIG92ZXJmbG93cworZGVjZDE1MSBhcHBseSAgLTEyMzQ1ICAgICAgICAgICAgICAgICAgIC0+ICNhMjM4MDAwMDAwMDA0OWM1CitkZWNkMTUyIGFwcGx5ICAgI2EyMzgwMDAwMDAwMDQ5YzUgICAgICAgLT4gLTEyMzQ1CitkZWNkMTUzIGFwcGx5ICAtMTIzNCAgICAgICAgICAgICAgICAgICAgLT4gI2EyMzgwMDAwMDAwMDA1MzQKK2RlY2QxNTQgYXBwbHkgICAjYTIzODAwMDAwMDAwMDUzNCAgICAgICAtPiAtMTIzNAorZGVjZDE1NSBhcHBseSAgLTEyMyAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjM4MDAwMDAwMDAwMGEzCitkZWNkMTU2IGFwcGx5ICAgI2EyMzgwMDAwMDAwMDAwYTMgICAgICAgLT4gLTEyMworZGVjZDE1NyBhcHBseSAgLTEyICAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjM4MDAwMDAwMDAwMDEyCitkZWNkMTU4IGFwcGx5ICAgI2EyMzgwMDAwMDAwMDAwMTIgICAgICAgLT4gLTEyCitkZWNkMTU5IGFwcGx5ICAtMSAgICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMzgwMDAwMDAwMDAwMDEKK2RlY2QxNjAgYXBwbHkgICAjYTIzODAwMDAwMDAwMDAwMSAgICAgICAtPiAtMQorZGVjZDE2MSBhcHBseSAgLTEuMjMgICAgICAgICAgICAgICAgICAgIC0+ICNhMjMwMDAwMDAwMDAwMGEzCitkZWNkMTYyIGFwcGx5ICAgI2EyMzAwMDAwMDAwMDAwYTMgICAgICAgLT4gLTEuMjMKK2RlY2QxNjMgYXBwbHkgIC0xMjMuNDUgICAgICAgICAgICAgICAgICAtPiAjYTIzMDAwMDAwMDAwNDljNQorZGVjZDE2NCBhcHBseSAgICNhMjMwMDAwMDAwMDA0OWM1ICAgICAgIC0+IC0xMjMuNDUKKworLS0gTm1pbiBhbmQgYmVsb3cKK2RlY2QxNzEgYXBwbHkgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAjODAzYzAwMDAwMDAwMDAwMQorZGVjZDE3MiBhcHBseSAgICM4MDNjMDAwMDAwMDAwMDAxICAgICAgIC0+IC0xRS0zODMKK2RlY2QxNzMgYXBwbHkgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAjODQwMDAwMDAwMDAwMDAwMAorZGVjZDE3NCBhcHBseSAgICM4NDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZWNkMTc1IGFwcGx5ICAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MyAgLT4gIzg0MDAwMDAwMDAwMDAwMDEKK2RlY2QxNzYgYXBwbHkgICAjODQwMDAwMDAwMDAwMDAwMSAgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworCitkZWNkMTc3IGFwcGx5ICAtMC4xMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gIzgwMDA4MDAwMDAwMDAwMDAgICAgICAgU3Vibm9ybWFsCitkZWNkMTc4IGFwcGx5ICAgIzgwMDA4MDAwMDAwMDAwMDAgICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDBFLTM4NCAgU3Vibm9ybWFsCitkZWNkMTc5IGFwcGx5ICAtMC4wMDAwMDAwMDAwMDAwMTBFLTM4MyAgLT4gIzgwMDAwMDAwMDAwMDAwMTAgICAgICAgU3Vibm9ybWFsCitkZWNkMTgwIGFwcGx5ICAgIzgwMDAwMDAwMDAwMDAwMTAgICAgICAgLT4gLTEuMEUtMzk3ICAgICAgICAgICAgICAgU3Vibm9ybWFsCitkZWNkMTgxIGFwcGx5ICAtMC4wMDAwMDAwMDAwMDAwMUUtMzgzICAgLT4gIzgwMDQwMDAwMDAwMDAwMDEgICAgICAgU3Vibm9ybWFsCitkZWNkMTgyIGFwcGx5ICAgIzgwMDQwMDAwMDAwMDAwMDEgICAgICAgLT4gLTFFLTM5NyAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCitkZWNkMTgzIGFwcGx5ICAtMC4wMDAwMDAwMDAwMDAwMDFFLTM4MyAgLT4gIzgwMDAwMDAwMDAwMDAwMDEgICAgICAgU3Vibm9ybWFsCitkZWNkMTg0IGFwcGx5ICAgIzgwMDAwMDAwMDAwMDAwMDEgICAgICAgLT4gLTFFLTM5OCAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHNtYWxsZXN0IGFsbC1uaW5lcworZGVjZDE4NSBhcHBseSAgIC05OTk5OTk5OTk5OTk5OTk5RS0zOTggICAtPiAjZTQwMGZmM2ZjZmYzZmNmZgorZGVjZDE4NiBhcHBseSAgICNlNDAwZmYzZmNmZjNmY2ZmICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtMzgzCistLSBhbmQgYSB0cmlja3kgc3Vibm9ybWFsCitkZWNkMTg3IGFwcGx5ICAgMS4xMTExMTExMTExMTUyNEUtMzg0ICAgIC0+ICMwMDAwOTEyNDQ5MTI0NmE0ICAgICAgU3Vibm9ybWFsCitkZWNkMTg4IGFwcGx5ICAgIzAwMDA5MTI0NDkxMjQ2YTQgICAgICAgIC0+IDEuMTExMTExMTExMTE1MjRFLTM4NCAgU3Vibm9ybWFsCisKKy0tIG5lYXItdW5kZXJmbG93cworZGVjZDE4OSBhcHBseSAgIC0xZS0zOTggICAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwKK2RlY2QxOTAgYXBwbHkgICAtMS4wZS0zOTggICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMSAgU3Vibm9ybWFsIFJvdW5kZWQKKworLS0gemVyb3MKK2RlY2Q0MDEgYXBwbHkgICAwRS01MDAgICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQwMiBhcHBseSAgIDBFLTQwMCAgICAgICAgICAgICAgICAgIC0+ICMwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNkNDAzIGFwcGx5ICAgMEUtMzk4ICAgICAgICAgICAgICAgICAgLT4gIzAwMDAwMDAwMDAwMDAwMDAKK2RlY2Q0MDQgYXBwbHkgICAjMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRS0zOTgKK2RlY2Q0MDUgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAjMDAwMDAwMDAwMDAwMDAwMAorZGVjZDQwNiBhcHBseSAgICMwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFLTM5OAorZGVjZDQwNyBhcHBseSAgIDBFLTIgICAgICAgICAgICAgICAgICAgIC0+ICMyMjMwMDAwMDAwMDAwMDAwCitkZWNkNDA4IGFwcGx5ICAgIzIyMzAwMDAwMDAwMDAwMDAgICAgICAgLT4gMC4wMAorZGVjZDQwOSBhcHBseSAgIDAgICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjM4MDAwMDAwMDAwMDAwCitkZWNkNDEwIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMDAgICAgICAgLT4gMAorZGVjZDQxMSBhcHBseSAgIDBFKzMgICAgICAgICAgICAgICAgICAgIC0+ICMyMjQ0MDAwMDAwMDAwMDAwCitkZWNkNDEyIGFwcGx5ICAgIzIyNDQwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUrMworZGVjZDQxMyBhcHBseSAgIDBFKzM2OSAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDAwMDAwMDAwCitkZWNkNDE0IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUrMzY5CistLSBjbGFtcGVkIHplcm9zLi4uCitkZWNkNDE1IGFwcGx5ICAgMEUrMzcwICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0MTYgYXBwbHkgICAjNDNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSszNjkKK2RlY2Q0MTcgYXBwbHkgICAwRSszODQgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQxOCBhcHBseSAgICM0M2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFKzM2OQorZGVjZDQxOSBhcHBseSAgIDBFKzQwMCAgICAgICAgICAgICAgICAgIC0+ICM0M2ZjMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNkNDIwIGFwcGx5ICAgIzQzZmMwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUrMzY5CitkZWNkNDIxIGFwcGx5ICAgMEUrNTAwICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0MjIgYXBwbHkgICAjNDNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSszNjkKKworLS0gbmVnYXRpdmUgemVyb3MKK2RlY2Q0MzEgYXBwbHkgICAtMEUtNDAwICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjZDQzMiBhcHBseSAgIC0wRS00MDAgICAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNkNDMzIGFwcGx5ICAgLTBFLTM5OCAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDAKK2RlY2Q0MzQgYXBwbHkgICAjODAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUtMzk4CitkZWNkNDM1IGFwcGx5ICAgLTAuMDAwMDAwMDAwMDAwMDAwRS0zODMgLT4gIzgwMDAwMDAwMDAwMDAwMDAKK2RlY2Q0MzYgYXBwbHkgICAjODAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUtMzk4CitkZWNkNDM3IGFwcGx5ICAgLTBFLTIgICAgICAgICAgICAgICAgICAgLT4gI2EyMzAwMDAwMDAwMDAwMDAKK2RlY2Q0MzggYXBwbHkgICAjYTIzMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMC4wMAorZGVjZDQzOSBhcHBseSAgIC0wICAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjM4MDAwMDAwMDAwMDAwCitkZWNkNDQwIGFwcGx5ICAgI2EyMzgwMDAwMDAwMDAwMDAgICAgICAgLT4gLTAKK2RlY2Q0NDEgYXBwbHkgICAtMEUrMyAgICAgICAgICAgICAgICAgICAtPiAjYTI0NDAwMDAwMDAwMDAwMAorZGVjZDQ0MiBhcHBseSAgICNhMjQ0MDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRSszCitkZWNkNDQzIGFwcGx5ICAgLTBFKzM2OSAgICAgICAgICAgICAgICAgLT4gI2MzZmMwMDAwMDAwMDAwMDAKK2RlY2Q0NDQgYXBwbHkgICAjYzNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrMzY5CistLSBjbGFtcGVkIHplcm9zLi4uCitkZWNkNDQ1IGFwcGx5ICAgLTBFKzM3MCAgICAgICAgICAgICAgICAgLT4gI2MzZmMwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0NDYgYXBwbHkgICAjYzNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrMzY5CitkZWNkNDQ3IGFwcGx5ICAgLTBFKzM4NCAgICAgICAgICAgICAgICAgLT4gI2MzZmMwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0NDggYXBwbHkgICAjYzNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrMzY5CitkZWNkNDQ5IGFwcGx5ICAgLTBFKzQwMCAgICAgICAgICAgICAgICAgLT4gI2MzZmMwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0NTAgYXBwbHkgICAjYzNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrMzY5CitkZWNkNDUxIGFwcGx5ICAgLTBFKzUwMCAgICAgICAgICAgICAgICAgLT4gI2MzZmMwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY2Q0NTIgYXBwbHkgICAjYzNmYzAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrMzY5CisKKy0tIGV4cG9uZW50cworZGVjZDQ2MCBhcHBseSAgICMyMjVjMDAwMDAwMDAwMDA3IC0+IDdFKzkKK2RlY2Q0NjEgYXBwbHkgICA3RSs5ICAtPiAjMjI1YzAwMDAwMDAwMDAwNworZGVjZDQ2MiBhcHBseSAgICMyM2M0MDAwMDAwMDAwMDA3IC0+IDdFKzk5CitkZWNkNDYzIGFwcGx5ICAgN0UrOTkgLT4gIzIzYzQwMDAwMDAwMDAwMDcKKworLS0gU3BlY2lhbHMKK2RlY2Q1MDAgYXBwbHkgICBJbmZpbml0eSAgICAgICAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGVjZDUwMSBhcHBseSAgICM3ODc4Nzg3ODc4Nzg3ODc4IC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZWNkNTAyIGFwcGx5ICAgIzc4MDAwMDAwMDAwMDAwMDAgLT4gSW5maW5pdHkKK2RlY2Q1MDMgYXBwbHkgICAjNzk3OTc5Nzk3OTc5Nzk3OSAtPiAjNzgwMDAwMDAwMDAwMDAwMAorZGVjZDUwNCBhcHBseSAgICM3OTAwMDAwMDAwMDAwMDAwIC0+IEluZmluaXR5CitkZWNkNTA1IGFwcGx5ICAgIzdhN2E3YTdhN2E3YTdhN2EgLT4gIzc4MDAwMDAwMDAwMDAwMDAKK2RlY2Q1MDYgYXBwbHkgICAjN2EwMDAwMDAwMDAwMDAwMCAtPiBJbmZpbml0eQorZGVjZDUwNyBhcHBseSAgICM3YjdiN2I3YjdiN2I3YjdiIC0+ICM3ODAwMDAwMDAwMDAwMDAwCitkZWNkNTA4IGFwcGx5ICAgIzdiMDAwMDAwMDAwMDAwMDAgLT4gSW5maW5pdHkKKworZGVjZDUwOSBhcHBseSAgIE5hTiAgICAgICAgICAgICAgIC0+ICM3YzAwMDAwMDAwMDAwMDAwCitkZWNkNTEwIGFwcGx5ICAgIzdjN2M3YzdjN2M3YzdjN2MgLT4gIzdjMDA3YzdjN2M3YzdjN2MKK2RlY2Q1MTEgYXBwbHkgICAjN2MwMDAwMDAwMDAwMDAwMCAtPiBOYU4KK2RlY2Q1MTIgYXBwbHkgICAjN2Q3ZDdkN2Q3ZDdkN2Q3ZCAtPiAjN2MwMTdkN2Q3ZDdkN2Q3ZAorZGVjZDUxMyBhcHBseSAgICM3ZDAwMDAwMDAwMDAwMDAwIC0+IE5hTgorZGVjZDUxNCBhcHBseSAgICM3ZTdlN2U3ZTdlN2U3ZTdlIC0+ICM3ZTAwN2U3ZTdlN2U3YzdlCitkZWNkNTE1IGFwcGx5ICAgIzdlMDAwMDAwMDAwMDAwMDAgLT4gc05hTgorZGVjZDUxNiBhcHBseSAgICM3ZjdmN2Y3ZjdmN2Y3ZjdmIC0+ICM3ZTAwN2Y3ZjdmN2Y3YzdmCitkZWNkNTE3IGFwcGx5ICAgIzdmMDAwMDAwMDAwMDAwMDAgLT4gc05hTgorZGVjZDUxOCBhcHBseSAgICM3ZmZmZmZmZmZmZmZmZmZmIC0+IHNOYU45OTk5OTk5OTk5OTk5OTkKK2RlY2Q1MTkgYXBwbHkgICAjN2ZmZmZmZmZmZmZmZmZmZiAtPiAjN2UwMGZmM2ZjZmYzZmNmZgorCitkZWNkNTIwIGFwcGx5ICAgLUluZmluaXR5ICAgICAgICAgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RlY2Q1MjEgYXBwbHkgICAjZjg3ODc4Nzg3ODc4Nzg3OCAtPiAjZjgwMDAwMDAwMDAwMDAwMAorZGVjZDUyMiBhcHBseSAgICNmODAwMDAwMDAwMDAwMDAwIC0+IC1JbmZpbml0eQorZGVjZDUyMyBhcHBseSAgICNmOTc5Nzk3OTc5Nzk3OTc5IC0+ICNmODAwMDAwMDAwMDAwMDAwCitkZWNkNTI0IGFwcGx5ICAgI2Y5MDAwMDAwMDAwMDAwMDAgLT4gLUluZmluaXR5CitkZWNkNTI1IGFwcGx5ICAgI2ZhN2E3YTdhN2E3YTdhN2EgLT4gI2Y4MDAwMDAwMDAwMDAwMDAKK2RlY2Q1MjYgYXBwbHkgICAjZmEwMDAwMDAwMDAwMDAwMCAtPiAtSW5maW5pdHkKK2RlY2Q1MjcgYXBwbHkgICAjZmI3YjdiN2I3YjdiN2I3YiAtPiAjZjgwMDAwMDAwMDAwMDAwMAorZGVjZDUyOCBhcHBseSAgICNmYjAwMDAwMDAwMDAwMDAwIC0+IC1JbmZpbml0eQorCitkZWNkNTI5IGFwcGx5ICAgLU5hTiAgICAgICAgICAgICAgLT4gI2ZjMDAwMDAwMDAwMDAwMDAKK2RlY2Q1MzAgYXBwbHkgICAjZmM3YzdjN2M3YzdjN2M3YyAtPiAjZmMwMDdjN2M3YzdjN2M3YworZGVjZDUzMSBhcHBseSAgICNmYzAwMDAwMDAwMDAwMDAwIC0+IC1OYU4KK2RlY2Q1MzIgYXBwbHkgICAjZmQ3ZDdkN2Q3ZDdkN2Q3ZCAtPiAjZmMwMTdkN2Q3ZDdkN2Q3ZAorZGVjZDUzMyBhcHBseSAgICNmZDAwMDAwMDAwMDAwMDAwIC0+IC1OYU4KK2RlY2Q1MzQgYXBwbHkgICAjZmU3ZTdlN2U3ZTdlN2U3ZSAtPiAjZmUwMDdlN2U3ZTdlN2M3ZQorZGVjZDUzNSBhcHBseSAgICNmZTAwMDAwMDAwMDAwMDAwIC0+IC1zTmFOCitkZWNkNTM2IGFwcGx5ICAgI2ZmN2Y3ZjdmN2Y3ZjdmN2YgLT4gI2ZlMDA3ZjdmN2Y3ZjdjN2YKK2RlY2Q1MzcgYXBwbHkgICAjZmYwMDAwMDAwMDAwMDAwMCAtPiAtc05hTgorZGVjZDUzOCBhcHBseSAgICNmZmZmZmZmZmZmZmZmZmZmIC0+IC1zTmFOOTk5OTk5OTk5OTk5OTk5CitkZWNkNTM5IGFwcGx5ICAgI2ZmZmZmZmZmZmZmZmZmZmYgLT4gI2ZlMDBmZjNmY2ZmM2ZjZmYKKworLS0gZGlhZ25vc3RpYyBOYU5zCitkZWNkNTQwIGFwcGx5ICAgTmFOICAgICAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAwMAorZGVjZDU0MSBhcHBseSAgIE5hTjAgICAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAKK2RlY2Q1NDIgYXBwbHkgICBOYU4xICAgICAgICAgICAgICAgIC0+ICM3YzAwMDAwMDAwMDAwMDAxCitkZWNkNTQzIGFwcGx5ICAgTmFOMTIgICAgICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAwMDAxMgorZGVjZDU0NCBhcHBseSAgIE5hTjc5ICAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwNzkKK2RlY2Q1NDUgYXBwbHkgICBOYU4xMjM0NSAgICAgICAgICAgIC0+ICM3YzAwMDAwMDAwMDA0OWM1CitkZWNkNTQ2IGFwcGx5ICAgTmFOMTIzNDU2ICAgICAgICAgICAtPiAjN2MwMDAwMDAwMDAyOGU1NgorZGVjZDU0NyBhcHBseSAgIE5hTjc5OTc5OSAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwZjdmZGYKK2RlY2Q1NDggYXBwbHkgICBOYU43OTk3OTk3OTk3OTk3OTkgIC0+ICM3YzAzZGZmN2ZkZmY3ZmRmCitkZWNkNTQ5IGFwcGx5ICAgTmFOOTk5OTk5OTk5OTk5OTk5ICAtPiAjN2MwMGZmM2ZjZmYzZmNmZgorLS0gdG9vIG1hbnkgZGlnaXRzCisKKy0tIGZvbGQtZG93biBmdWxsIHNlcXVlbmNlCitkZWNkNjAxIGFwcGx5ICAgMUUrMzg0ICAgICAgICAgICAgICAgICAgLT4gIzQ3ZmMwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDYwMiBhcHBseSAgICM0N2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQKK2RlY2Q2MDMgYXBwbHkgICAxRSszODMgICAgICAgICAgICAgICAgICAtPiAjNDNmYzgwMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjA0IGFwcGx5ICAgIzQzZmM4MDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMEUrMzgzCitkZWNkNjA1IGFwcGx5ICAgMUUrMzgyICAgICAgICAgICAgICAgICAgLT4gIzQzZmMxMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDYwNiBhcHBseSAgICM0M2ZjMTAwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMEUrMzgyCitkZWNkNjA3IGFwcGx5ICAgMUUrMzgxICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMTAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDYwOCBhcHBseSAgICM0M2ZjMDEwMDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwRSszODEKK2RlY2Q2MDkgYXBwbHkgICAxRSszODAgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMjAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjEwIGFwcGx5ICAgIzQzZmMwMDIwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMEUrMzgwCitkZWNkNjExIGFwcGx5ICAgMUUrMzc5ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDA0MDAwMDAwMDAgQ2xhbXBlZAorZGVjZDYxMiBhcHBseSAgICM0M2ZjMDAwNDAwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwMEUrMzc5CitkZWNkNjEzIGFwcGx5ICAgMUUrMzc4ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwNDAwMDAwMDAgQ2xhbXBlZAorZGVjZDYxNCBhcHBseSAgICM0M2ZjMDAwMDQwMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMDAwRSszNzgKK2RlY2Q2MTUgYXBwbHkgICAxRSszNzcgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwODAwMDAwMCBDbGFtcGVkCitkZWNkNjE2IGFwcGx5ICAgIzQzZmMwMDAwMDgwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMEUrMzc3CitkZWNkNjE3IGFwcGx5ICAgMUUrMzc2ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDEwMDAwMDAgQ2xhbXBlZAorZGVjZDYxOCBhcHBseSAgICM0M2ZjMDAwMDAxMDAwMDAwICAgICAgIC0+IDEuMDAwMDAwMEUrMzc2CitkZWNkNjE5IGFwcGx5ICAgMUUrMzc1ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAxMDAwMDAgQ2xhbXBlZAorZGVjZDYyMCBhcHBseSAgICM0M2ZjMDAwMDAwMTAwMDAwICAgICAgIC0+IDEuMDAwMDAwRSszNzUKK2RlY2Q2MjEgYXBwbHkgICAxRSszNzQgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAyMDAwMCBDbGFtcGVkCitkZWNkNjIyIGFwcGx5ICAgIzQzZmMwMDAwMDAwMjAwMDAgICAgICAgLT4gMS4wMDAwMEUrMzc0CitkZWNkNjIzIGFwcGx5ICAgMUUrMzczICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDQwMDAgQ2xhbXBlZAorZGVjZDYyNCBhcHBseSAgICM0M2ZjMDAwMDAwMDA0MDAwICAgICAgIC0+IDEuMDAwMEUrMzczCitkZWNkNjI1IGFwcGx5ICAgMUUrMzcyICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDA0MDAgQ2xhbXBlZAorZGVjZDYyNiBhcHBseSAgICM0M2ZjMDAwMDAwMDAwNDAwICAgICAgIC0+IDEuMDAwRSszNzIKK2RlY2Q2MjcgYXBwbHkgICAxRSszNzEgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDA4MCBDbGFtcGVkCitkZWNkNjI4IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDAwODAgICAgICAgLT4gMS4wMEUrMzcxCitkZWNkNjI5IGFwcGx5ICAgMUUrMzcwICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMTAgQ2xhbXBlZAorZGVjZDYzMCBhcHBseSAgICM0M2ZjMDAwMDAwMDAwMDEwICAgICAgIC0+IDEuMEUrMzcwCitkZWNkNjMxIGFwcGx5ICAgMUUrMzY5ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMDEKK2RlY2Q2MzIgYXBwbHkgICAjNDNmYzAwMDAwMDAwMDAwMSAgICAgICAtPiAxRSszNjkKK2RlY2Q2MzMgYXBwbHkgICAxRSszNjggICAgICAgICAgICAgICAgICAtPiAjNDNmODAwMDAwMDAwMDAwMQorZGVjZDYzNCBhcHBseSAgICM0M2Y4MDAwMDAwMDAwMDAxICAgICAgIC0+IDFFKzM2OAorLS0gc2FtZSB3aXRoIDlzCitkZWNkNjQxIGFwcGx5ICAgOUUrMzg0ICAgICAgICAgICAgICAgICAgLT4gIzc3ZmMwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDY0MiBhcHBseSAgICM3N2ZjMDAwMDAwMDAwMDAwICAgICAgIC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQKK2RlY2Q2NDMgYXBwbHkgICA5RSszODMgICAgICAgICAgICAgICAgICAtPiAjNDNmYzhjMDAwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjQ0IGFwcGx5ICAgIzQzZmM4YzAwMDAwMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMDAwMDAwMEUrMzgzCitkZWNkNjQ1IGFwcGx5ICAgOUUrMzgyICAgICAgICAgICAgICAgICAgLT4gIzQzZmMxYTAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDY0NiBhcHBseSAgICM0M2ZjMWEwMDAwMDAwMDAwICAgICAgIC0+IDkuMDAwMDAwMDAwMDAwMEUrMzgyCitkZWNkNjQ3IGFwcGx5ICAgOUUrMzgxICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwOTAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjZDY0OCBhcHBseSAgICM0M2ZjMDkwMDAwMDAwMDAwICAgICAgIC0+IDkuMDAwMDAwMDAwMDAwRSszODEKK2RlY2Q2NDkgYXBwbHkgICA5RSszODAgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMjMwMDAwMDAwMCBDbGFtcGVkCitkZWNkNjUwIGFwcGx5ICAgIzQzZmMwMDIzMDAwMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMDAwMEUrMzgwCitkZWNkNjUxIGFwcGx5ICAgOUUrMzc5ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDA2ODAwMDAwMDAgQ2xhbXBlZAorZGVjZDY1MiBhcHBseSAgICM0M2ZjMDAwNjgwMDAwMDAwICAgICAgIC0+IDkuMDAwMDAwMDAwMEUrMzc5CitkZWNkNjUzIGFwcGx5ICAgOUUrMzc4ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAyNDAwMDAwMDAgQ2xhbXBlZAorZGVjZDY1NCBhcHBseSAgICM0M2ZjMDAwMjQwMDAwMDAwICAgICAgIC0+IDkuMDAwMDAwMDAwRSszNzgKK2RlY2Q2NTUgYXBwbHkgICA5RSszNzcgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwOGMwMDAwMCBDbGFtcGVkCitkZWNkNjU2IGFwcGx5ICAgIzQzZmMwMDAwMDhjMDAwMDAgICAgICAgLT4gOS4wMDAwMDAwMEUrMzc3CitkZWNkNjU3IGFwcGx5ICAgOUUrMzc2ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDFhMDAwMDAgQ2xhbXBlZAorZGVjZDY1OCBhcHBseSAgICM0M2ZjMDAwMDAxYTAwMDAwICAgICAgIC0+IDkuMDAwMDAwMEUrMzc2CitkZWNkNjU5IGFwcGx5ICAgOUUrMzc1ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDA5MDAwMDAgQ2xhbXBlZAorZGVjZDY2MCBhcHBseSAgICM0M2ZjMDAwMDAwOTAwMDAwICAgICAgIC0+IDkuMDAwMDAwRSszNzUKK2RlY2Q2NjEgYXBwbHkgICA5RSszNzQgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAyMzAwMCBDbGFtcGVkCitkZWNkNjYyIGFwcGx5ICAgIzQzZmMwMDAwMDAwMjMwMDAgICAgICAgLT4gOS4wMDAwMEUrMzc0CitkZWNkNjYzIGFwcGx5ICAgOUUrMzczICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDY4MDAgQ2xhbXBlZAorZGVjZDY2NCBhcHBseSAgICM0M2ZjMDAwMDAwMDA2ODAwICAgICAgIC0+IDkuMDAwMEUrMzczCitkZWNkNjY1IGFwcGx5ICAgOUUrMzcyICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDI0MDAgQ2xhbXBlZAorZGVjZDY2NiBhcHBseSAgICM0M2ZjMDAwMDAwMDAyNDAwICAgICAgIC0+IDkuMDAwRSszNzIKK2RlY2Q2NjcgYXBwbHkgICA5RSszNzEgICAgICAgICAgICAgICAgICAtPiAjNDNmYzAwMDAwMDAwMDA4YyBDbGFtcGVkCitkZWNkNjY4IGFwcGx5ICAgIzQzZmMwMDAwMDAwMDAwOGMgICAgICAgLT4gOS4wMEUrMzcxCitkZWNkNjY5IGFwcGx5ICAgOUUrMzcwICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMWEgQ2xhbXBlZAorZGVjZDY3MCBhcHBseSAgICM0M2ZjMDAwMDAwMDAwMDFhICAgICAgIC0+IDkuMEUrMzcwCitkZWNkNjcxIGFwcGx5ICAgOUUrMzY5ICAgICAgICAgICAgICAgICAgLT4gIzQzZmMwMDAwMDAwMDAwMDkKK2RlY2Q2NzIgYXBwbHkgICAjNDNmYzAwMDAwMDAwMDAwOSAgICAgICAtPiA5RSszNjkKK2RlY2Q2NzMgYXBwbHkgICA5RSszNjggICAgICAgICAgICAgICAgICAtPiAjNDNmODAwMDAwMDAwMDAwOQorZGVjZDY3NCBhcHBseSAgICM0M2Y4MDAwMDAwMDAwMDA5ICAgICAgIC0+IDlFKzM2OAorCisKKy0tIFNlbGVjdGVkIERQRCBjb2RlcworZGVjZDcwMCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDAwICAgICAgIC0+IDAKK2RlY2Q3MDEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDAwOSAgICAgICAtPiA5CitkZWNkNzAyIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMTAgICAgICAgLT4gMTAKK2RlY2Q3MDMgYXBwbHkgICAjMjIzODAwMDAwMDAwMDAxOSAgICAgICAtPiAxOQorZGVjZDcwNCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDIwICAgICAgIC0+IDIwCitkZWNkNzA1IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwMjkgICAgICAgLT4gMjkKK2RlY2Q3MDYgYXBwbHkgICAjMjIzODAwMDAwMDAwMDAzMCAgICAgICAtPiAzMAorZGVjZDcwNyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDM5ICAgICAgIC0+IDM5CitkZWNkNzA4IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNDAgICAgICAgLT4gNDAKK2RlY2Q3MDkgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA0OSAgICAgICAtPiA0OQorZGVjZDcxMCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDUwICAgICAgIC0+IDUwCitkZWNkNzExIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNTkgICAgICAgLT4gNTkKK2RlY2Q3MTIgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA2MCAgICAgICAtPiA2MAorZGVjZDcxMyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDY5ICAgICAgIC0+IDY5CitkZWNkNzE0IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNzAgICAgICAgLT4gNzAKK2RlY2Q3MTUgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA3MSAgICAgICAtPiA3MQorZGVjZDcxNiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDcyICAgICAgIC0+IDcyCitkZWNkNzE3IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNzMgICAgICAgLT4gNzMKK2RlY2Q3MTggYXBwbHkgICAjMjIzODAwMDAwMDAwMDA3NCAgICAgICAtPiA3NAorZGVjZDcxOSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDc1ICAgICAgIC0+IDc1CitkZWNkNzIwIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNzYgICAgICAgLT4gNzYKK2RlY2Q3MjEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA3NyAgICAgICAtPiA3NworZGVjZDcyMiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDc4ICAgICAgIC0+IDc4CitkZWNkNzIzIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwNzkgICAgICAgLT4gNzkKKworZGVjZDcyNSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMjllICAgICAgIC0+IDk5NAorZGVjZDcyNiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMjlmICAgICAgIC0+IDk5NQorZGVjZDcyNyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMmEwICAgICAgIC0+IDUyMAorZGVjZDcyOCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMmExICAgICAgIC0+IDUyMQorLS0gZnJvbSB0ZWxjbyB0ZXN0IGRhdGEKK2RlY2Q3MzAgYXBwbHkgICAjMjIzODAwMDAwMDAwMDE4OCAgICAgICAtPiAzMDgKK2RlY2Q3MzEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDFhMyAgICAgICAtPiAzMjMKK2RlY2Q3MzIgYXBwbHkgICAjMjIzODAwMDAwMDAwMDAyYSAgICAgICAtPiAgODIKK2RlY2Q3MzMgYXBwbHkgICAjMjIzODAwMDAwMDAwMDFhOSAgICAgICAtPiAzMjkKK2RlY2Q3MzQgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA4MSAgICAgICAtPiAxMDEKK2RlY2Q3MzUgYXBwbHkgICAjMjIzODAwMDAwMDAwMDJhMiAgICAgICAtPiA1MjIKKworLS0gRFBEOiBvbmUgb2YgZWFjaCBvZiB0aGUgaHVmZm1hbiBncm91cHMKK2RlY2Q3NDAgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNmNyAgICAgICAtPiA3NzcKK2RlY2Q3NDEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNmOCAgICAgICAtPiA3NzgKK2RlY2Q3NDIgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNlYiAgICAgICAtPiA3ODcKK2RlY2Q3NDMgYXBwbHkgICAjMjIzODAwMDAwMDAwMDM3ZCAgICAgICAtPiA4NzcKK2RlY2Q3NDQgYXBwbHkgICAjMjIzODAwMDAwMDAwMDM5ZiAgICAgICAtPiA5OTcKK2RlY2Q3NDUgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNiZiAgICAgICAtPiA5NzkKK2RlY2Q3NDYgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNkZiAgICAgICAtPiA3OTkKK2RlY2Q3NDcgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA2ZSAgICAgICAtPiA4ODgKKworLS0gRFBEIGFsbC1oaWdocyBjYXNlcyAoaW5jbHVkZXMgdGhlIDI0IHJlZHVuZGFudCBjb2RlcykKK2RlY2Q3NTAgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA2ZSAgICAgICAtPiA4ODgKK2RlY2Q3NTEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDE2ZSAgICAgICAtPiA4ODgKK2RlY2Q3NTIgYXBwbHkgICAjMjIzODAwMDAwMDAwMDI2ZSAgICAgICAtPiA4ODgKK2RlY2Q3NTMgYXBwbHkgICAjMjIzODAwMDAwMDAwMDM2ZSAgICAgICAtPiA4ODgKK2RlY2Q3NTQgYXBwbHkgICAjMjIzODAwMDAwMDAwMDA2ZiAgICAgICAtPiA4ODkKK2RlY2Q3NTUgYXBwbHkgICAjMjIzODAwMDAwMDAwMDE2ZiAgICAgICAtPiA4ODkKK2RlY2Q3NTYgYXBwbHkgICAjMjIzODAwMDAwMDAwMDI2ZiAgICAgICAtPiA4ODkKK2RlY2Q3NTcgYXBwbHkgICAjMjIzODAwMDAwMDAwMDM2ZiAgICAgICAtPiA4ODkKKworZGVjZDc2MCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDdlICAgICAgIC0+IDg5OAorZGVjZDc2MSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMTdlICAgICAgIC0+IDg5OAorZGVjZDc2MiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMjdlICAgICAgIC0+IDg5OAorZGVjZDc2MyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMzdlICAgICAgIC0+IDg5OAorZGVjZDc2NCBhcHBseSAgICMyMjM4MDAwMDAwMDAwMDdmICAgICAgIC0+IDg5OQorZGVjZDc2NSBhcHBseSAgICMyMjM4MDAwMDAwMDAwMTdmICAgICAgIC0+IDg5OQorZGVjZDc2NiBhcHBseSAgICMyMjM4MDAwMDAwMDAwMjdmICAgICAgIC0+IDg5OQorZGVjZDc2NyBhcHBseSAgICMyMjM4MDAwMDAwMDAwMzdmICAgICAgIC0+IDg5OQorCitkZWNkNzcwIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwZWUgICAgICAgLT4gOTg4CitkZWNkNzcxIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAxZWUgICAgICAgLT4gOTg4CitkZWNkNzcyIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyZWUgICAgICAgLT4gOTg4CitkZWNkNzczIGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAzZWUgICAgICAgLT4gOTg4CitkZWNkNzc0IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAwZWYgICAgICAgLT4gOTg5CitkZWNkNzc1IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAxZWYgICAgICAgLT4gOTg5CitkZWNkNzc2IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAyZWYgICAgICAgLT4gOTg5CitkZWNkNzc3IGFwcGx5ICAgIzIyMzgwMDAwMDAwMDAzZWYgICAgICAgLT4gOTg5CisKK2RlY2Q3ODAgYXBwbHkgICAjMjIzODAwMDAwMDAwMDBmZSAgICAgICAtPiA5OTgKK2RlY2Q3ODEgYXBwbHkgICAjMjIzODAwMDAwMDAwMDFmZSAgICAgICAtPiA5OTgKK2RlY2Q3ODIgYXBwbHkgICAjMjIzODAwMDAwMDAwMDJmZSAgICAgICAtPiA5OTgKK2RlY2Q3ODMgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNmZSAgICAgICAtPiA5OTgKK2RlY2Q3ODQgYXBwbHkgICAjMjIzODAwMDAwMDAwMDBmZiAgICAgICAtPiA5OTkKK2RlY2Q3ODUgYXBwbHkgICAjMjIzODAwMDAwMDAwMDFmZiAgICAgICAtPiA5OTkKK2RlY2Q3ODYgYXBwbHkgICAjMjIzODAwMDAwMDAwMDJmZiAgICAgICAtPiA5OTkKK2RlY2Q3ODcgYXBwbHkgICAjMjIzODAwMDAwMDAwMDNmZiAgICAgICAtPiA5OTkKKworLS0gdmFsdWVzIGFyb3VuZCBbdV1pbnQzMiBlZGdlcyAoemVyb3MgZG9uZSBlYXJsaWVyKQorZGVjZDgwMCBhcHBseSAtMjE0NzQ4MzY0NiAgLT4gI2EyMzgwMDAwOGM3OGFmNDYKK2RlY2Q4MDEgYXBwbHkgLTIxNDc0ODM2NDcgIC0+ICNhMjM4MDAwMDhjNzhhZjQ3CitkZWNkODAyIGFwcGx5IC0yMTQ3NDgzNjQ4ICAtPiAjYTIzODAwMDA4Yzc4YWY0OAorZGVjZDgwMyBhcHBseSAtMjE0NzQ4MzY0OSAgLT4gI2EyMzgwMDAwOGM3OGFmNDkKK2RlY2Q4MDQgYXBwbHkgIDIxNDc0ODM2NDYgIC0+ICMyMjM4MDAwMDhjNzhhZjQ2CitkZWNkODA1IGFwcGx5ICAyMTQ3NDgzNjQ3ICAtPiAjMjIzODAwMDA4Yzc4YWY0NworZGVjZDgwNiBhcHBseSAgMjE0NzQ4MzY0OCAgLT4gIzIyMzgwMDAwOGM3OGFmNDgKK2RlY2Q4MDcgYXBwbHkgIDIxNDc0ODM2NDkgIC0+ICMyMjM4MDAwMDhjNzhhZjQ5CitkZWNkODA4IGFwcGx5ICA0Mjk0OTY3Mjk0ICAtPiAjMjIzODAwMDExNWFmYjU1YQorZGVjZDgwOSBhcHBseSAgNDI5NDk2NzI5NSAgLT4gIzIyMzgwMDAxMTVhZmI1NWIKK2RlY2Q4MTAgYXBwbHkgIDQyOTQ5NjcyOTYgIC0+ICMyMjM4MDAwMTE1YWZiNTdhCitkZWNkODExIGFwcGx5ICA0Mjk0OTY3Mjk3ICAtPiAjMjIzODAwMDExNWFmYjU3YgorCitkZWNkODIwIGFwcGx5ICAjYTIzODAwMDA4Yzc4YWY0NiAtPiAtMjE0NzQ4MzY0NgorZGVjZDgyMSBhcHBseSAgI2EyMzgwMDAwOGM3OGFmNDcgLT4gLTIxNDc0ODM2NDcKK2RlY2Q4MjIgYXBwbHkgICNhMjM4MDAwMDhjNzhhZjQ4IC0+IC0yMTQ3NDgzNjQ4CitkZWNkODIzIGFwcGx5ICAjYTIzODAwMDA4Yzc4YWY0OSAtPiAtMjE0NzQ4MzY0OQorZGVjZDgyNCBhcHBseSAgIzIyMzgwMDAwOGM3OGFmNDYgLT4gIDIxNDc0ODM2NDYKK2RlY2Q4MjUgYXBwbHkgICMyMjM4MDAwMDhjNzhhZjQ3IC0+ICAyMTQ3NDgzNjQ3CitkZWNkODI2IGFwcGx5ICAjMjIzODAwMDA4Yzc4YWY0OCAtPiAgMjE0NzQ4MzY0OAorZGVjZDgyNyBhcHBseSAgIzIyMzgwMDAwOGM3OGFmNDkgLT4gIDIxNDc0ODM2NDkKK2RlY2Q4MjggYXBwbHkgICMyMjM4MDAwMTE1YWZiNTVhIC0+ICA0Mjk0OTY3Mjk0CitkZWNkODI5IGFwcGx5ICAjMjIzODAwMDExNWFmYjU1YiAtPiAgNDI5NDk2NzI5NQorZGVjZDgzMCBhcHBseSAgIzIyMzgwMDAxMTVhZmI1N2EgLT4gIDQyOTQ5NjcyOTYKK2RlY2Q4MzEgYXBwbHkgICMyMjM4MDAwMTE1YWZiNTdiIC0+ICA0Mjk0OTY3Mjk3CisKKy0tIGZvciBuYXJyb3dpbmcKK2RlY2Q4NDAgYXBwbHkgICMyODcwMDAwMDAwMDAwMDAwIC0+ICAyLjAwMDAwMDAwMDAwMDAwMEUtOTkKKworLS0gc29tZSBtaXNjZWxsYW5lb3VzCitkZWNkODUwIGFwcGx5ICAjMDAwNDA3MDAwMDAwMDAwMCAtPiA3LjAwMDAwMDAwMDAwMEUtMzg1ICBTdWJub3JtYWwKK2RlY2Q4NTEgYXBwbHkgICMwMDA4MDAwMDAwMDIwMDAwIC0+IDEuMDAwMDBFLTM5MSAgICAgICAgIFN1Ym5vcm1hbAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRk1BLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkRk1BLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlOTJhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRGTUEuZGVjVGVzdApAQCAtMCwwICsxLDE2OTggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRGTUEuZGVjVGVzdCAtLSBkZWNEb3VibGUgRnVzZWQgTXVsdGlwbHkgQWRkICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gVGhlc2UgdGVzdHMgY29tcHJlc2UgdGhyZWUgcGFydHM6CistLSAgIDEuIFNhbml0eSBjaGVja3MgYW5kIG90aGVyIHRocmVlLW9wZXJhbmQgdGVzdHMgKGVzcGVjaWFsbHkgdGhvc2UKKy0tICAgICAgd2hlcmUgdGhlIGZ1c2VkIG9wZXJhdGlvbiBtYWtlcyBhIGRpZmZlcmVuY2UpCistLSAgIDIuIE11bHRpcGx5IHRlc3RzICh0aGlyZCBvcGVyYW5kIGlzIG5ldXRyYWwgemVybyBbMEUrZW1heF0pCistLSAgIDMuIEFkZGl0aW9uIHRlc3RzIChmaXJzdCBvcGVyYW5kIGlzIDEpCistLSBUaGUgbXVsdGlwbHkgYW5kIGFkZGl0aW9uIHRlc3RzIGFyZSBleHRlbnNpdmUgYmVjYXVzZSBGTUEgbWF5IGhhdmUKKy0tIGl0cyBvd24gZGVkaWNhdGVkIG11bHRpcGxpY2F0aW9uIG9yIGFkZGl0aW9uIHJvdXRpbmUocyksIGFuZCB0aGV5CistLSBhbHNvIGluaGVyZW50bHkgY2hlY2sgdGhlIGxlZnQtdG8tcmlnaHQgcHJvcGVydGllcy4KKworLS0gU2FuaXR5IGNoZWNrcworZGRmbWEwMDAxIGZtYSAgMSAgIDEgICAxIC0+ICAgMgorZGRmbWEwMDAyIGZtYSAgMSAgIDEgICAyIC0+ICAgMworZGRmbWEwMDAzIGZtYSAgMiAgIDIgICAzIC0+ICAgNworZGRmbWEwMDA0IGZtYSAgOSAgIDkgICA5IC0+ICA5MAorZGRmbWEwMDA1IGZtYSAtMSAgIDEgICAxIC0+ICAgMAorZGRmbWEwMDA2IGZtYSAtMSAgIDEgICAyIC0+ICAgMQorZGRmbWEwMDA3IGZtYSAtMiAgIDIgICAzIC0+ICAtMQorZGRmbWEwMDA4IGZtYSAtOSAgIDkgICA5IC0+IC03MgorZGRmbWEwMDExIGZtYSAgMSAgLTEgICAxIC0+ICAgMAorZGRmbWEwMDEyIGZtYSAgMSAgLTEgICAyIC0+ICAgMQorZGRmbWEwMDEzIGZtYSAgMiAgLTIgICAzIC0+ICAtMQorZGRmbWEwMDE0IGZtYSAgOSAgLTkgICA5IC0+IC03MgorZGRmbWEwMDE1IGZtYSAgMSAgIDEgIC0xIC0+ICAgMAorZGRmbWEwMDE2IGZtYSAgMSAgIDEgIC0yIC0+ICAtMQorZGRmbWEwMDE3IGZtYSAgMiAgIDIgIC0zIC0+ICAgMQorZGRmbWEwMDE4IGZtYSAgOSAgIDkgIC05IC0+ICA3MgorCistLSBub24taW50ZWdlciBleGFjdHMKK2RkZm1hMDEwMCAgZm1hICAgIDI1LjIgICA2My42ICAgLTQzOCAgLT4gIDExNjQuNzIKK2RkZm1hMDEwMSAgZm1hICAgMC4zMDEgIDAuMzgwICAgIDMzNCAgLT4gIDMzNC4xMTQzODAKK2RkZm1hMDEwMiAgZm1hICAgIDQ5LjIgICAtNC44ICAgMjMuMyAgLT4gIC0yMTIuODYKK2RkZm1hMDEwMyAgZm1hICAgIDQuMjIgIDAuMDc5ICAtOTQuNiAgLT4gIC05NC4yNjY2MgorZGRmbWEwMTA0ICBmbWEgICAgIDkwMyAgMC43OTcgIDAuODg3ICAtPiAgNzIwLjU3OAorZGRmbWEwMTA1ICBmbWEgICAgNi4xMyAgIC0xNjEgICA2NS45ICAtPiAgLTkyMS4wMworZGRmbWEwMTA2ICBmbWEgICAgMjguMiAgICA3MjcgICA1LjQ1ICAtPiAgMjA1MDYuODUKK2RkZm1hMDEwNyAgZm1hICAgICAgIDQgICAgNjA1ICAgIDY4OCAgLT4gIDMxMDgKK2RkZm1hMDEwOCAgZm1hICAgIDkzLjMgICAwLjE5ICAwLjIyNiAgLT4gIDE3Ljk1MworZGRmbWEwMTA5ICBmbWEgICAwLjE2OSAgIC0zNDEgICA1LjYxICAtPiAgLTUyLjAxOQorZGRmbWEwMTEwICBmbWEgICAtNzIuMiAgICAgMzAgIC01MS4yICAtPiAgLTIyMTcuMgorZGRmbWEwMTExICBmbWEgIC0wLjQwOSAgICAgMTMgICAyMC40ICAtPiAgMTUuMDgzCitkZGZtYTAxMTIgIGZtYSAgICAgMzE3ICAgNzcuMCAgIDE5LjAgIC0+ICAyNDQyOC4wCitkZGZtYTAxMTMgIGZtYSAgICAgIDQ3ICAgNi41OCAgIDEuNjIgIC0+ICAzMTAuODgKK2RkZm1hMDExNCAgZm1hICAgIDEuMzYgIDAuOTg0ICAwLjQ5MyAgLT4gIDEuODMxMjQKK2RkZm1hMDExNSAgZm1hICAgIDcyLjcgICAgMjc0ICAgMS41NiAgLT4gIDE5OTIxLjM2CitkZGZtYTAxMTYgIGZtYSAgICAgMzM1ICAgIDg0NyAgICAgODMgIC0+ICAyODM4MjgKK2RkZm1hMDExNyAgZm1hICAgICA2NjYgIDAuMjQ3ICAgMjUuNCAgLT4gIDE4OS45MDIKK2RkZm1hMDExOCAgZm1hICAgLTMuODcgICAzLjA2ICAgNzguMCAgLT4gIDY2LjE1NzgKK2RkZm1hMDExOSAgZm1hICAgMC43NDIgICAgMTkyICAgMzUuNiAgLT4gIDE3OC4wNjQKK2RkZm1hMDEyMCAgZm1hICAgLTkxLjYgICA1LjI5ICAwLjE1MyAgLT4gIC00ODQuNDExCisKKy0tIGNhc2VzIHdoZXJlIHJlc3VsdCBpcyBkaWZmZXJlbnQgZnJvbSBzZXBhcmF0ZSBtdWx0aXBseSArIGFkZDsgZWFjaAorLS0gaXMgcHJlY2VkZWQgYnkgdGhlIHJlc3VsdCBvZiB1bmZ1c2VkIG11bHRpcGx5IGFuZCBhZGQKKy0tIFt0aGlzIGlzIGFib3V0IDIwJSBvZiBhbGwgc2ltaWxhciAgY2FzZXMgaW4gZ2VuZXJhbF0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICA3LjEyMzM1NjQyOTI1Nzk2OUUrMTYKK2RkZm1hMDIwMSAgZm1hICAgICAgIDI3NTgzNDg5LjY2NDUgICAgICAyNTgyNDcxMDc4LjA0ICAgICAgMjU5MzE4My40MjM3MSAgLT4gIDcuMTIzMzU2NDI5MjU3OTcwRSsxNiAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMjI4MTMyNzUzMjguODA1MDYKK2RkZm1hMDIwOCAgZm1hICAgICAgICAyNDI4MC4zNTU1NjYgICAgICA5Mzk1NzcuMzk3NjUzICAgICAgICAyMDMyLjAxMzI1MiAgLT4gIDIyODEzMjc1MzI4LjgwNTA3ICAgICAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgLTIuMDMwMzk3NzM0Mjc4MDYyRSsxNgorZGRmbWEwMjA5ICBmbWEgICAgICAgICAgNzg0ODk3NjQzMiAgICAgIC0yNTg2ODMxLjIyODEgICAgICAxMzc5MDMuNTE3OTA5ICAtPiAgLTIuMDMwMzk3NzM0Mjc4MDYxRSsxNiBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAyMDQwNzc0MDk0ODE0LjA3NworZGRmbWEwMjE3ICBmbWEgICAgICAgIDU2ODkwLjM4ODczMSAgICAgIDM1ODcyMDMwLjQyNTUgICAgICAzMzkzMzcuMTIzNDEwICAtPiAgMjA0MDc3NDA5NDgxNC4wNzggICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAyLjcxNDQ2OTU3NTIwNTA0OUUrMTgKK2RkZm1hMDIyMCAgZm1hICAgICAgIDc1MzM1NDMuNTc0NDUgICAgICAgMzYwMzE3NzYzOTI4ICAgICAgNTA3MzM5Mi4zMTYzOCAgLT4gIDIuNzE0NDY5NTc1MjA1MDUwRSsxOCAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMS4wMTE2NzYyOTc3MTY3MTZFKzE5CitkZGZtYTAyMjMgIGZtYSAgICAgICA3Mzk5NDUyNTUuNTYzICAgICAgMTM2NzIzMTI3ODQuMSAgICAgIC05OTQzODEuNTM1NzIgIC0+ICAxLjAxMTY3NjI5NzcxNjcxNUUrMTkgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIC0yLjkxNDEzNTcyMTQ1NTMxNUUrMjMKK2RkZm1hMDIyNCAgZm1hICAgICAgIC00MTM1MTA5NTcyMTggICAgICAgNzA0NzI5OTg4NTUwICAgICAgIDkyMzQxNjI2MTQuMCAgLT4gIC0yLjkxNDEzNTcyMTQ1NTMxNEUrMjMgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMi42MjAxMTk4NjMzNjU3ODZFKzE3CitkZGZtYTAyMjYgIGZtYSAgICAgICAgNDM3NDg0LjAwNjAxICAgICAgIDU5ODkwNjQzMjc5MCAgICAgIDg5NDQ1MDYzOC40NDIgIC0+ICAyLjYyMDExOTg2MzM2NTc4N0UrMTcgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDEuMjcyNjQ3OTk1ODA4MTc4RSsxOQorZGRmbWEwMjUzICBmbWEgICAgICAgICA3MzI4NzU1NjkyOSAgICAgIDE3MzY1MTMwNS43ODQgICAgIC0zNTgzMTI1NjguMzg5ICAtPiAgMS4yNzI2NDc5OTU4MDgxNzdFKzE5ICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAtMS43NTM3NjkzMjA4NjE4NTFFKzE4CitkZGZtYTAyNTcgIGZtYSAgICAgICAgMjAzMjU4MzA0NDg2ICAgICAgLTg2MjgyNzguODA2NiAgICAgIDE1MzEyNy40NDY3MjcgIC0+ICAtMS43NTM3NjkzMjA4NjE4NTBFKzE4IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIC0xLjU1MDczNzgzNTI2MzM0NkUrMTcKK2RkZm1hMDI2MCAgZm1hICAgICAgIDQyNTYwNTMzLjE3NzQgICAgIC0zNjQzNjA1MjgyLjg2ICAgICAgIDE3ODI3Ny45NjM3NyAgLT4gIC0xLjU1MDczNzgzNTI2MzM0N0UrMTcgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMi44OTc2MjQ2MjA1NzYwMDVFKzIyCitkZGZtYTAyNjkgIGZtYSAgICAgICAgMTQyNjU2NTg3Mzc1ICAgICAgIDIwMzExODg3OTY3MCAgICAgICA2MDQ1NzYxMDM5OTEgIC0+ICAyLjg5NzYyNDYyMDU3NjAwNEUrMjIgIEluZXhhY3QgUm91bmRlZAorCistLSBDYXNlcyB3aGVyZSBtdWx0aXBseSB3b3VsZCBvdmVyZmxvdyBvciB1bmRlcmZsb3cgaWYgc2VwYXJhdGUKK2ZtYTAzMDAgIGZtYSAgIDllKzM4NCAgICAxMCAgIDAgICAgICAgICAtPiBJbmZpbml0eSAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWEwMzAxICBmbWEgICAxZSszODQgICAgMTAgICAwICAgICAgICAgLT4gSW5maW5pdHkgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1hMDMwMiAgZm1hICAgMWUrMzg0ICAgIDEwICAgLTFlKzM4NCAgIC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgIENsYW1wZWQKK2ZtYTAzMDMgIGZtYSAgIDFlKzM4NCAgICAxMCAgIC05ZSszODQgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICBDbGFtcGVkCistLSBzdWJub3JtYWwgZXRjLgorZm1hMDMwNSAgZm1hICAgMWUtMzk4ICAgIDAuMSAgMCAgICAgICAgIC0+IDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWEwMzA2ICBmbWEgICAxZS0zOTggICAgMC4xICAxICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWEwMzA3ICBmbWEgICAxZS0zOTggICAgMC4xICAxZS0zOTggICAgLT4gMUUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIEluZmluaXRlIGNvbWJpbmF0aW9ucworZGRmbWEwODAwIGZtYSAgSW5mICAgSW5mICAgSW5mICAgIC0+ICBJbmZpbml0eQorZGRmbWEwODAxIGZtYSAgSW5mICAgSW5mICAtSW5mICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMDgwMiBmbWEgIEluZiAgLUluZiAgIEluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTA4MDMgZm1hICBJbmYgIC1JbmYgIC1JbmYgICAgLT4gLUluZmluaXR5CitkZGZtYTA4MDQgZm1hIC1JbmYgICBJbmYgICBJbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEwODA1IGZtYSAtSW5mICAgSW5mICAtSW5mICAgIC0+IC1JbmZpbml0eQorZGRmbWEwODA2IGZtYSAtSW5mICAtSW5mICAgSW5mICAgIC0+ICBJbmZpbml0eQorZGRmbWEwODA3IGZtYSAtSW5mICAtSW5mICAtSW5mICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gVHJpcGxlIE5hTiBwcm9wYWdhdGlvbgorZGRmbWEwOTAwIGZtYSAgTmFOMiAgTmFOMyAgTmFONSAgIC0+ICBOYU4yCitkZGZtYTA5MDEgZm1hICAwICAgICBOYU4zICBOYU41ICAgLT4gIE5hTjMKK2RkZm1hMDkwMiBmbWEgIDAgICAgIDAgICAgIE5hTjUgICAtPiAgTmFONQorLS0gZmlyc3Qgc05hTiB3aW5zIChjb25zaWRlciBxTmFOIGZyb20gZWFybGllciBzTmFOIGJlaW5nCistLSBvdmVycmlkZGVuIGJ5IGFuIHNOYU4gaW4gdGhpcmQgb3BlcmFuZCkKK2RkZm1hMDkwMyBmbWEgIHNOYU4xIHNOYU4yIHNOYU4zICAtPiAgTmFOMSBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEwOTA0IGZtYSAgMCAgICAgc05hTjIgc05hTjMgIC0+ICBOYU4yIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTA5MDUgZm1hICAwICAgICAwICAgICBzTmFOMyAgLT4gIE5hTjMgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMDkwNiBmbWEgIHNOYU4xIHNOYU4yIHNOYU4zICAtPiAgTmFOMSBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEwOTA3IGZtYSAgTmFONyAgc05hTjIgc05hTjMgIC0+ICBOYU4yIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTA5MDggZm1hICBOYU43ICBOYU41ICBzTmFOMyAgLT4gIE5hTjMgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTVVMVElQTElDQVRJT04gVEVTVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHNhbml0eSBjaGVja3MKK2RkZm1hMjAwMCBmbWEgIDIgICAgICAyICAgMGUrMzg0ICAtPiAgNAorZGRmbWEyMDAxIGZtYSAgMiAgICAgIDMgICAwZSszODQgIC0+ICA2CitkZGZtYTIwMDIgZm1hICA1ICAgICAgMSAgIDBlKzM4NCAgLT4gIDUKK2RkZm1hMjAwMyBmbWEgIDUgICAgICAyICAgMGUrMzg0ICAtPiAgMTAKK2RkZm1hMjAwNCBmbWEgIDEuMjAgICAyICAgMGUrMzg0ICAtPiAgMi40MAorZGRmbWEyMDA1IGZtYSAgMS4yMCAgIDAgICAwZSszODQgIC0+ICAwLjAwCitkZGZtYTIwMDYgZm1hICAxLjIwICAtMiAgIDBlKzM4NCAgLT4gIC0yLjQwCitkZGZtYTIwMDcgZm1hICAtMS4yMCAgMiAgIDBlKzM4NCAgLT4gIC0yLjQwCitkZGZtYTIwMDggZm1hICAtMS4yMCAgMCAgIDBlKzM4NCAgLT4gIDAuMDAKK2RkZm1hMjAwOSBmbWEgIC0xLjIwIC0yICAgMGUrMzg0ICAtPiAgMi40MAorZGRmbWEyMDEwIGZtYSAgNS4wOSA3LjEgICAwZSszODQgIC0+ICAzNi4xMzkKK2RkZm1hMjAxMSBmbWEgIDIuNSAgICA0ICAgMGUrMzg0ICAtPiAgMTAuMAorZGRmbWEyMDEyIGZtYSAgMi41MCAgIDQgICAwZSszODQgIC0+ICAxMC4wMAorZGRmbWEyMDEzIGZtYSAgMS4yMzQ1Njc4OSAxLjAwMDAwMDAwICAgMGUrMzg0ICAtPiAgMS4yMzQ1Njc4OTAwMDAwMDAgUm91bmRlZAorZGRmbWEyMDE1IGZtYSAgMi41MCAgIDQgICAwZSszODQgIC0+ICAxMC4wMAorZGRmbWEyMDE2IGZtYSAgIDkuOTk5OTk5OTk5ICA5Ljk5OTk5OTk5OSAgIDBlKzM4NCAgLT4gICA5OS45OTk5OTk5ODAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjAxNyBmbWEgICA5Ljk5OTk5OTk5OSAtOS45OTk5OTk5OTkgICAwZSszODQgIC0+ICAtOTkuOTk5OTk5OTgwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTIwMTggZm1hICAtOS45OTk5OTk5OTkgIDkuOTk5OTk5OTk5ICAgMGUrMzg0ICAtPiAgLTk5Ljk5OTk5OTk4MDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEyMDE5IGZtYSAgLTkuOTk5OTk5OTk5IC05Ljk5OTk5OTk5OSAgIDBlKzM4NCAgLT4gICA5OS45OTk5OTk5ODAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gemVyb3MsIGV0Yy4KK2RkZm1hMjAyMSBmbWEgICAwICAgICAgMCAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyMDIyIGZtYSAgIDAgICAgIC0wICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTIwMjMgZm1hICAtMCAgICAgIDAgICAgICAgMGUrMzg0ICAtPiAgIDAKK2RkZm1hMjAyNCBmbWEgIC0wICAgICAtMCAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyMDI1IGZtYSAgLTAuMCAgIC0wLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTIwMjYgZm1hICAtMC4wICAgLTAuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjAyNyBmbWEgIC0wLjAgICAtMC4wICAgICAwZSszODQgIC0+ICAgMC4wMAorZGRmbWEyMDI4IGZtYSAgLTAuMCAgIC0wLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTIwMzAgZm1hICAgNS4wMCAgIDFFLTMgICAgMGUrMzg0ICAtPiAgIDAuMDA1MDAKK2RkZm1hMjAzMSBmbWEgICAwMC4wMCAgMC4wMDAgICAwZSszODQgIC0+ICAgMC4wMDAwMAorZGRmbWEyMDMyIGZtYSAgIDAwLjAwICAwRS0zICAgIDBlKzM4NCAgLT4gICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZGRmbWEyMDMzIGZtYSAgIDBFLTMgICAwMC4wMCAgIDBlKzM4NCAgLT4gICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZGRmbWEyMDM0IGZtYSAgLTUuMDAgICAxRS0zICAgIDBlKzM4NCAgLT4gIC0wLjAwNTAwCitkZGZtYTIwMzUgZm1hICAtMDAuMDAgIDAuMDAwICAgMGUrMzg0ICAtPiAgIDAuMDAwMDAKK2RkZm1hMjAzNiBmbWEgIC0wMC4wMCAgMEUtMyAgICAwZSszODQgIC0+ICAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RkZm1hMjAzNyBmbWEgIC0wRS0zICAgMDAuMDAgICAwZSszODQgIC0+ICAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RkZm1hMjAzOCBmbWEgICA1LjAwICAtMUUtMyAgICAwZSszODQgIC0+ICAtMC4wMDUwMAorZGRmbWEyMDM5IGZtYSAgIDAwLjAwIC0wLjAwMCAgIDBlKzM4NCAgLT4gICAwLjAwMDAwCitkZGZtYTIwNDAgZm1hICAgMDAuMDAgLTBFLTMgICAgMGUrMzg0ICAtPiAgIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkZGZtYTIwNDEgZm1hICAgMEUtMyAgLTAwLjAwICAgMGUrMzg0ICAtPiAgIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkZGZtYTIwNDIgZm1hICAtNS4wMCAgLTFFLTMgICAgMGUrMzg0ICAtPiAgIDAuMDA1MDAKK2RkZm1hMjA0MyBmbWEgIC0wMC4wMCAtMC4wMDAgICAwZSszODQgIC0+ICAgMC4wMDAwMAorZGRmbWEyMDQ0IGZtYSAgLTAwLjAwIC0wRS0zICAgIDBlKzM4NCAgLT4gICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZGRmbWEyMDQ1IGZtYSAgLTBFLTMgIC0wMC4wMCAgLTBlKzM4NCAgLT4gICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZGRmbWEyMDQ2IGZtYSAgLTBFLTMgICAwMC4wMCAgLTBlKzM4NCAgLT4gIC0wLjAwMDAwCitkZGZtYTIwNDcgZm1hICAgMEUtMyAgLTAwLjAwICAtMGUrMzg0ICAtPiAgLTAuMDAwMDAKK2RkZm1hMjA0OCBmbWEgICAwRS0zICAgMDAuMDAgIC0wZSszODQgIC0+ICAgMC4wMDAwMAorCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCitkZGZtYTIwNTAgZm1hICAxLjIwIDMgICAgICAgICAgMGUrMzg0ICAtPiAgMy42MAorZGRmbWEyMDUxIGZtYSAgNyAgICAzICAgICAgICAgIDBlKzM4NCAgLT4gIDIxCitkZGZtYTIwNTIgZm1hICAwLjkgIDAuOCAgICAgICAgMGUrMzg0ICAtPiAgMC43MgorZGRmbWEyMDUzIGZtYSAgMC45ICAtMCAgICAgICAgIDBlKzM4NCAgLT4gIDAuMAorZGRmbWEyMDU0IGZtYSAgNjU0MzIxIDY1NDMyMSAgIDBlKzM4NCAgLT4gIDQyODEzNTk3MTA0MQorCitkZGZtYTIwNjAgZm1hICAxMjMuNDUgMWU3ICAgIDBlKzM4NCAgLT4gICAxLjIzNDVFKzkKK2RkZm1hMjA2MSBmbWEgIDEyMy40NSAxZTggICAgMGUrMzg0ICAtPiAgIDEuMjM0NUUrMTAKK2RkZm1hMjA2MiBmbWEgIDEyMy40NSAxZSs5ICAgMGUrMzg0ICAtPiAgIDEuMjM0NUUrMTEKK2RkZm1hMjA2MyBmbWEgIDEyMy40NSAxZTEwICAgMGUrMzg0ICAtPiAgIDEuMjM0NUUrMTIKK2RkZm1hMjA2NCBmbWEgIDEyMy40NSAxZTExICAgMGUrMzg0ICAtPiAgIDEuMjM0NUUrMTMKK2RkZm1hMjA2NSBmbWEgIDEyMy40NSAxZTEyICAgMGUrMzg0ICAtPiAgIDEuMjM0NUUrMTQKK2RkZm1hMjA2NiBmbWEgIDEyMy40NSAxZTEzICAgMGUrMzg0ICAtPiAgIDEuMjM0NUUrMTUKKworCistLSB0ZXN0IHNvbWUgaW50ZXJtZWRpYXRlIGxlbmd0aHMKKy0tICAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZGZtYTIwODAgZm1hICAwLjEgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgICAwZSszODQgIC0+ICAxMjMwMTIzNDU2NDU2NzguOQorZGRmbWEyMDg0IGZtYSAgMC4xIDEyMzAxMjM0NTY0NTY3ODkgICAgICAgMGUrMzg0ICAtPiAgMTIzMDEyMzQ1NjQ1Njc4LjkKK2RkZm1hMjA5MCBmbWEgIDEyMzAxMjM0NTY0NTY3ODkgICAgIDAuMSAgIDBlKzM4NCAgLT4gIDEyMzAxMjM0NTY0NTY3OC45CitkZGZtYTIwOTQgZm1hICAxMjMwMTIzNDU2NDU2Nzg5ICAgICAwLjEgICAwZSszODQgIC0+ICAxMjMwMTIzNDU2NDU2NzguOQorCistLSB0ZXN0IHNvbWUgbW9yZSBlZGdlIGNhc2VzIGFuZCBjYXJyaWVzCitkZGZtYTIxMDEgZm1hICA5IDkgICAgIDBlKzM4NCAgLT4gIDgxCitkZGZtYTIxMDIgZm1hICA5IDkwICAgICAwZSszODQgIC0+ICA4MTAKK2RkZm1hMjEwMyBmbWEgIDkgOTAwICAgICAwZSszODQgIC0+ICA4MTAwCitkZGZtYTIxMDQgZm1hICA5IDkwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwCitkZGZtYTIxMDUgZm1hICA5IDkwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAKK2RkZm1hMjEwNiBmbWEgIDkgOTAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwCitkZGZtYTIxMDcgZm1hICA5IDkwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwCitkZGZtYTIxMDggZm1hICA5IDkwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAKK2RkZm1hMjEwOSBmbWEgIDkgOTAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwCitkZGZtYTIxMTAgZm1hICA5IDkwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwCitkZGZtYTIxMTEgZm1hICA5IDkwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAKK2RkZm1hMjExMiBmbWEgIDkgOTAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwCitkZGZtYTIxMTMgZm1hICA5IDkwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwCitkZGZtYTIxMTQgZm1hICA5IDkwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAKK2RkZm1hMjExNSBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwCistLWRkZm1hMjExNiBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTE3IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAwMDAwCistLWRkZm1hMjExOCBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMDAwCistLWRkZm1hMjExOSBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTIwIGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRkZm1hMjEyMSBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRkZm1hMjEyMiBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRmbWEyMTIzIGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLSB0ZXN0IHNvbWUgbW9yZSBlZGdlIGNhc2VzIHdpdGhvdXQgY2FycmllcworZGRmbWEyMTMxIGZtYSAgMyAzICAgICAwZSszODQgIC0+ICA5CitkZGZtYTIxMzIgZm1hICAzIDMwICAgICAwZSszODQgIC0+ICA5MAorZGRmbWEyMTMzIGZtYSAgMyAzMDAgICAgIDBlKzM4NCAgLT4gIDkwMAorZGRmbWEyMTM0IGZtYSAgMyAzMDAwICAgICAwZSszODQgIC0+ICA5MDAwCitkZGZtYTIxMzUgZm1hICAzIDMwMDAwICAgICAwZSszODQgIC0+ICA5MDAwMAorZGRmbWEyMTM2IGZtYSAgMyAzMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMAorZGRmbWEyMTM3IGZtYSAgMyAzMDAwMDAwICAgICAwZSszODQgIC0+ICA5MDAwMDAwCitkZGZtYTIxMzggZm1hICAzIDMwMDAwMDAwICAgICAwZSszODQgIC0+ICA5MDAwMDAwMAorZGRmbWEyMTM5IGZtYSAgMyAzMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwMAorZGRmbWEyMTQwIGZtYSAgMyAzMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA5MDAwMDAwMDAwCitkZGZtYTIxNDEgZm1hICAzIDMwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA5MDAwMDAwMDAwMAorZGRmbWEyMTQyIGZtYSAgMyAzMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwMDAwMAorZGRmbWEyMTQzIGZtYSAgMyAzMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA5MDAwMDAwMDAwMDAwCitkZGZtYTIxNDQgZm1hICAzIDMwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA5MDAwMDAwMDAwMDAwMAorZGRmbWEyMTQ1IGZtYSAgMyAzMDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDkwMDAwMDAwMDAwMDAwMAorCistLSB0ZXN0IHNvbWUgZWRnZSBjYXNlcyB3aXRoIGV4YWN0IHJvdW5kaW5nCitkZGZtYTIzMDEgZm1hICA5IDkgICAgIDBlKzM4NCAgLT4gIDgxCitkZGZtYTIzMDIgZm1hICA5IDkwICAgICAwZSszODQgIC0+ICA4MTAKK2RkZm1hMjMwMyBmbWEgIDkgOTAwICAgICAwZSszODQgIC0+ICA4MTAwCitkZGZtYTIzMDQgZm1hICA5IDkwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwCitkZGZtYTIzMDUgZm1hICA5IDkwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAKK2RkZm1hMjMwNiBmbWEgIDkgOTAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwCitkZGZtYTIzMDcgZm1hICA5IDkwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwCitkZGZtYTIzMDggZm1hICA5IDkwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAKK2RkZm1hMjMwOSBmbWEgIDkgOTAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwCitkZGZtYTIzMTAgZm1hICA5IDkwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwCitkZGZtYTIzMTEgZm1hICA5IDkwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAKK2RkZm1hMjMxMiBmbWEgIDkgOTAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwCitkZGZtYTIzMTMgZm1hICA5IDkwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDgxMDAwMDAwMDAwMDAwCitkZGZtYTIzMTQgZm1hICA5IDkwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAKK2RkZm1hMjMxNSBmbWEgIDkgOTAwMDAwMDAwMDAwMDAwICAgICAwZSszODQgIC0+ICA4MTAwMDAwMDAwMDAwMDAwCitkZGZtYTIzMTYgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDguMTAwMDAwMDAwMDAwMDAwRSsxNiAgUm91bmRlZAorZGRmbWEyMzE3IGZtYSAgOTAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzE3ICBSb3VuZGVkCitkZGZtYTIzMTggZm1hICA5MDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzE4ICBSb3VuZGVkCitkZGZtYTIzMTkgZm1hICA5MDAwIDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDguMTAwMDAwMDAwMDAwMDAwRSsxOSAgUm91bmRlZAorZGRmbWEyMzIwIGZtYSAgOTAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzIwICBSb3VuZGVkCitkZGZtYTIzMjEgZm1hICA5MDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzIxICBSb3VuZGVkCitkZGZtYTIzMjIgZm1hICA5MDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzM4NCAgLT4gIDguMTAwMDAwMDAwMDAwMDAwRSsyMiAgUm91bmRlZAorZGRmbWEyMzIzIGZtYSAgOTAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrMzg0ICAtPiAgOC4xMDAwMDAwMDAwMDAwMDBFKzIzICBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCitkZGZtYTI1MDQgIGZtYSAgIDBFLTI2MCAxMDAwRS0yNjAgICAgMGUrMzg0ICAtPiAgMEUtMzk4IENsYW1wZWQKK2RkZm1hMjUwNSAgZm1hICAgMTAwRSsyNjAgMEUrMjYwICAgICAwZSszODQgIC0+ICAwRSszNjkgQ2xhbXBlZAorCistLSBtaXhlZCB3aXRoIHplcm9zCitkZGZtYTI1NDEgZm1hICAgMCAgICAtMSAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyNTQyIGZtYSAgLTAgICAgLTEgICAgICAgMGUrMzg0ICAtPiAgIDAKK2RkZm1hMjU0MyBmbWEgICAwICAgICAxICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTI1NDQgZm1hICAtMCAgICAgMSAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyNTQ1IGZtYSAgLTEgICAgIDAgICAgICAgMGUrMzg0ICAtPiAgIDAKK2RkZm1hMjU0NiBmbWEgIC0xICAgIC0wICAgICAgIDBlKzM4NCAgLT4gICAwCitkZGZtYTI1NDcgZm1hICAgMSAgICAgMCAgICAgICAwZSszODQgIC0+ICAgMAorZGRmbWEyNTQ4IGZtYSAgIDEgICAgLTAgICAgICAgMGUrMzg0ICAtPiAgIDAKKworZGRmbWEyNTUxIGZtYSAgIDAuMCAgLTEgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorZGRmbWEyNTUyIGZtYSAgLTAuMCAgLTEgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorZGRmbWEyNTUzIGZtYSAgIDAuMCAgIDEgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorZGRmbWEyNTU0IGZtYSAgLTAuMCAgIDEgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorZGRmbWEyNTU1IGZtYSAgLTEuMCAgIDAgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorZGRmbWEyNTU2IGZtYSAgLTEuMCAgLTAgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorZGRmbWEyNTU3IGZtYSAgIDEuMCAgIDAgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorZGRmbWEyNTU4IGZtYSAgIDEuMCAgLTAgICAgICAgMGUrMzg0ICAtPiAgIDAuMAorCitkZGZtYTI1NjEgZm1hICAgMCAgICAtMS4wICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NjIgZm1hICAtMCAgICAtMS4wICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NjMgZm1hICAgMCAgICAgMS4wICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NjQgZm1hICAtMCAgICAgMS4wICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NjUgZm1hICAtMSAgICAgMC4wICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NjYgZm1hICAtMSAgICAtMC4wICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NjcgZm1hICAgMSAgICAgMC4wICAgICAwZSszODQgIC0+ICAgMC4wCitkZGZtYTI1NjggZm1hICAgMSAgICAtMC4wICAgICAwZSszODQgIC0+ICAgMC4wCisKK2RkZm1hMjU3MSBmbWEgICAwLjAgIC0xLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTI1NzIgZm1hICAtMC4wICAtMS4wICAgICAwZSszODQgIC0+ICAgMC4wMAorZGRmbWEyNTczIGZtYSAgIDAuMCAgIDEuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjU3NCBmbWEgIC0wLjAgICAxLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTI1NzUgZm1hICAtMS4wICAgMC4wICAgICAwZSszODQgIC0+ICAgMC4wMAorZGRmbWEyNTc2IGZtYSAgLTEuMCAgLTAuMCAgICAgMGUrMzg0ICAtPiAgIDAuMDAKK2RkZm1hMjU3NyBmbWEgICAxLjAgICAwLjAgICAgIDBlKzM4NCAgLT4gICAwLjAwCitkZGZtYTI1NzggZm1hICAgMS4wICAtMC4wICAgICAwZSszODQgIC0+ICAgMC4wMAorCistLSBTcGVjaWFscworZGRmbWEyNTgwIGZtYSAgIEluZiAgLUluZiAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI1ODEgZm1hICAgSW5mICAtMTAwMCAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjU4MiBmbWEgICBJbmYgIC0xICAgICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNTgzIGZtYSAgIEluZiAgLTAgICAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjU4NCBmbWEgICBJbmYgICAwICAgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI1ODUgZm1hICAgSW5mICAgMSAgICAgICAwZSszODQgIC0+ICAgSW5maW5pdHkKK2RkZm1hMjU4NiBmbWEgICBJbmYgICAxMDAwICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eQorZGRmbWEyNTg3IGZtYSAgIEluZiAgIEluZiAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI1ODggZm1hICAtMTAwMCAgSW5mICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjU4OSBmbWEgIC1JbmYgICBJbmYgICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNTkwIGZtYSAgLTEgICAgIEluZiAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI1OTEgZm1hICAtMCAgICAgSW5mICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNTkyIGZtYSAgIDAgICAgIEluZiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjU5MyBmbWEgICAxICAgICBJbmYgICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eQorZGRmbWEyNTk0IGZtYSAgIDEwMDAgIEluZiAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI1OTUgZm1hICAgSW5mICAgSW5mICAgICAwZSszODQgIC0+ICAgSW5maW5pdHkKKworZGRmbWEyNjAwIGZtYSAgLUluZiAgLUluZiAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI2MDEgZm1hICAtSW5mICAtMTAwMCAgICAwZSszODQgIC0+ICAgSW5maW5pdHkKK2RkZm1hMjYwMiBmbWEgIC1JbmYgIC0xICAgICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eQorZGRmbWEyNjAzIGZtYSAgLUluZiAgLTAgICAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjYwNCBmbWEgIC1JbmYgICAwICAgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2MDUgZm1hICAtSW5mICAgMSAgICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjYwNiBmbWEgIC1JbmYgICAxMDAwICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNjA3IGZtYSAgLUluZiAgIEluZiAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI2MDggZm1hICAtMTAwMCAgSW5mICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKK2RkZm1hMjYwOSBmbWEgIC1JbmYgIC1JbmYgICAgIDBlKzM4NCAgLT4gICBJbmZpbml0eQorZGRmbWEyNjEwIGZtYSAgLTEgICAgLUluZiAgICAgMGUrMzg0ICAtPiAgIEluZmluaXR5CitkZGZtYTI2MTEgZm1hICAtMCAgICAtSW5mICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjEyIGZtYSAgIDAgICAgLUluZiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjYxMyBmbWEgICAxICAgIC1JbmYgICAgIDBlKzM4NCAgLT4gIC1JbmZpbml0eQorZGRmbWEyNjE0IGZtYSAgIDEwMDAgLUluZiAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5CitkZGZtYTI2MTUgZm1hICAgSW5mICAtSW5mICAgICAwZSszODQgIC0+ICAtSW5maW5pdHkKKworZGRmbWEyNjIxIGZtYSAgIE5hTiAtSW5mICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjIyIGZtYSAgIE5hTiAtMTAwMCAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjIzIGZtYSAgIE5hTiAtMSAgICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjI0IGZtYSAgIE5hTiAtMCAgICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjI1IGZtYSAgIE5hTiAgMCAgICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjI2IGZtYSAgIE5hTiAgMSAgICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjI3IGZtYSAgIE5hTiAgMTAwMCAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjI4IGZtYSAgIE5hTiAgSW5mICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjI5IGZtYSAgIE5hTiAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjMwIGZtYSAgLUluZiAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjMxIGZtYSAgLTEwMDAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjMyIGZtYSAgLTEgICAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjMzIGZtYSAgLTAgICAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjM0IGZtYSAgIDAgICAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjM1IGZtYSAgIDEgICAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjM2IGZtYSAgIDEwMDAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorZGRmbWEyNjM3IGZtYSAgIEluZiAgTmFOICAgICAgMGUrMzg0ICAtPiAgIE5hTgorCitkZGZtYTI2NDEgZm1hICAgc05hTiAtSW5mICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjQyIGZtYSAgIHNOYU4gLTEwMDAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY0MyBmbWEgICBzTmFOIC0xICAgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NDQgZm1hICAgc05hTiAtMCAgICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjQ1IGZtYSAgIHNOYU4gIDAgICAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY0NiBmbWEgICBzTmFOICAxICAgICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NDcgZm1hICAgc05hTiAgMTAwMCAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjQ4IGZtYSAgIHNOYU4gIE5hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY0OSBmbWEgICBzTmFOIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NTAgZm1hICAgTmFOICBzTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjUxIGZtYSAgLUluZiAgc05hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY1MiBmbWEgIC0xMDAwIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NTMgZm1hICAtMSAgICBzTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjU0IGZtYSAgLTAgICAgc05hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY1NSBmbWEgICAwICAgIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NTYgZm1hICAgMSAgICBzTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjU3IGZtYSAgIDEwMDAgc05hTiAgICAgMGUrMzg0ICAtPiAgIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY1OCBmbWEgICBJbmYgIHNOYU4gICAgIDBlKzM4NCAgLT4gICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NTkgZm1hICAgTmFOICBzTmFOICAgICAwZSszODQgIC0+ICAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZGZtYTI2NjEgZm1hICAgTmFOOSAtSW5mICAgICAwZSszODQgIC0+ICAgTmFOOQorZGRmbWEyNjYyIGZtYSAgIE5hTjggIDk5OSAgICAgMGUrMzg0ICAtPiAgIE5hTjgKK2RkZm1hMjY2MyBmbWEgICBOYU43MSBJbmYgICAgIDBlKzM4NCAgLT4gICBOYU43MQorZGRmbWEyNjY0IGZtYSAgIE5hTjYgIE5hTjUgICAgMGUrMzg0ICAtPiAgIE5hTjYKK2RkZm1hMjY2NSBmbWEgIC1JbmYgICBOYU40ICAgIDBlKzM4NCAgLT4gICBOYU40CitkZGZtYTI2NjYgZm1hICAtOTk5ICAgTmFOMzMgICAwZSszODQgIC0+ICAgTmFOMzMKK2RkZm1hMjY2NyBmbWEgICBJbmYgICBOYU4yICAgIDBlKzM4NCAgLT4gICBOYU4yCisKK2RkZm1hMjY3MSBmbWEgICBzTmFOOTkgLUluZiAgICAgIDBlKzM4NCAgLT4gICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjcyIGZtYSAgIHNOYU45OCAtMTEgICAgICAgMGUrMzg0ICAtPiAgIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NzMgZm1hICAgc05hTjk3ICBOYU4gICAgICAwZSszODQgIC0+ICAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY3NCBmbWEgICBzTmFOMTYgc05hTjk0ICAgIDBlKzM4NCAgLT4gICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjc1IGZtYSAgIE5hTjk1ICBzTmFOOTMgICAgMGUrMzg0ICAtPiAgIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NzYgZm1hICAtSW5mICAgIHNOYU45MiAgICAwZSszODQgIC0+ICAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY3NyBmbWEgICAwODggICAgc05hTjkxICAgIDBlKzM4NCAgLT4gICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjc4IGZtYSAgIEluZiAgICBzTmFOOTAgICAgMGUrMzg0ICAtPiAgIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2NzkgZm1hICAgTmFOICAgIHNOYU44OSAgICAwZSszODQgIC0+ICAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZGRmbWEyNjgxIGZtYSAgLU5hTjkgLUluZiAgICAgMGUrMzg0ICAtPiAgLU5hTjkKK2RkZm1hMjY4MiBmbWEgIC1OYU44ICA5OTkgICAgIDBlKzM4NCAgLT4gIC1OYU44CitkZGZtYTI2ODMgZm1hICAtTmFONzEgSW5mICAgICAwZSszODQgIC0+ICAtTmFONzEKK2RkZm1hMjY4NCBmbWEgIC1OYU42IC1OYU41ICAgIDBlKzM4NCAgLT4gIC1OYU42CitkZGZtYTI2ODUgZm1hICAtSW5mICAtTmFONCAgICAwZSszODQgIC0+ICAtTmFONAorZGRmbWEyNjg2IGZtYSAgLTk5OSAgLU5hTjMzICAgMGUrMzg0ICAtPiAgLU5hTjMzCitkZGZtYTI2ODcgZm1hICAgSW5mICAtTmFOMiAgICAwZSszODQgIC0+ICAtTmFOMgorCitkZGZtYTI2OTEgZm1hICAtc05hTjk5IC1JbmYgICAgICAwZSszODQgIC0+ICAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY5MiBmbWEgIC1zTmFOOTggLTExICAgICAgIDBlKzM4NCAgLT4gIC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjkzIGZtYSAgLXNOYU45NyAgTmFOICAgICAgMGUrMzg0ICAtPiAgLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2OTQgZm1hICAtc05hTjE2IC1zTmFOOTQgICAwZSszODQgIC0+ICAtTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY5NSBmbWEgIC1OYU45NSAgLXNOYU45MyAgIDBlKzM4NCAgLT4gIC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjk2IGZtYSAgLUluZiAgICAtc05hTjkyICAgMGUrMzg0ICAtPiAgLU5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTI2OTcgZm1hICAgMDg4ICAgIC1zTmFOOTEgICAwZSszODQgIC0+ICAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjY5OCBmbWEgICBJbmYgICAgLXNOYU45MCAgIDBlKzM4NCAgLT4gIC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNjk5IGZtYSAgLU5hTiAgICAtc05hTjg5ICAgMGUrMzg0ICAtPiAgLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2RkZm1hMjcwMSBmbWEgIC1OYU4gIC1JbmYgICAgIDBlKzM4NCAgLT4gIC1OYU4KK2RkZm1hMjcwMiBmbWEgIC1OYU4gICA5OTkgICAgIDBlKzM4NCAgLT4gIC1OYU4KK2RkZm1hMjcwMyBmbWEgIC1OYU4gICBJbmYgICAgIDBlKzM4NCAgLT4gIC1OYU4KK2RkZm1hMjcwNCBmbWEgIC1OYU4gIC1OYU4gICAgIDBlKzM4NCAgLT4gIC1OYU4KK2RkZm1hMjcwNSBmbWEgIC1JbmYgIC1OYU4wICAgIDBlKzM4NCAgLT4gIC1OYU4KK2RkZm1hMjcwNiBmbWEgIC05OTkgIC1OYU4gICAgIDBlKzM4NCAgLT4gIC1OYU4KK2RkZm1hMjcwNyBmbWEgICBJbmYgIC1OYU4gICAgIDBlKzM4NCAgLT4gIC1OYU4KKworZGRmbWEyNzExIGZtYSAgLXNOYU4gICAtSW5mICAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzEyIGZtYSAgLXNOYU4gICAtMTEgICAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzEzIGZtYSAgLXNOYU4wMCAgTmFOICAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzE0IGZtYSAgLXNOYU4gICAtc05hTiAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzE1IGZtYSAgLU5hTiAgICAtc05hTiAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzE2IGZtYSAgLUluZiAgICAtc05hTiAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzE3IGZtYSAgIDA4OCAgICAtc05hTiAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzE4IGZtYSAgIEluZiAgICAtc05hTiAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEyNzE5IGZtYSAgLU5hTiAgICAtc05hTiAgICAgMGUrMzg0ICAtPiAgLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIG5vdGUgc3Vibm9ybWFsIHJlc3VsdHMKKy0tIHNpZ25zCitkZGZtYTI3NTEgZm1hICAgMWUrMjc3ICAxZSszMTEgICAwZSszODQgIC0+ICAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI3NTIgZm1hICAgMWUrMjc3IC0xZSszMTEgICAwZSszODQgIC0+ICAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI3NTMgZm1hICAtMWUrMjc3ICAxZSszMTEgICAwZSszODQgIC0+ICAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI3NTQgZm1hICAtMWUrMjc3IC0xZSszMTEgICAwZSszODQgIC0+ICAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI3NTUgZm1hICAgMWUtMjc3ICAxZS0zMTEgICAwZSszODQgIC0+ICAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjc1NiBmbWEgICAxZS0yNzcgLTFlLTMxMSAgIDBlKzM4NCAgLT4gIC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRmbWEyNzU3IGZtYSAgLTFlLTI3NyAgMWUtMzExICAgMGUrMzg0ICAtPiAgLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGZtYTI3NTggZm1hICAtMWUtMjc3IC0xZS0zMTEgICAwZSszODQgIC0+ICAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gJ3N1Ym5vcm1hbCcgYm91bmRhcnkgKGFsbCBoYXJkIHVuZGVyZmxvdyBvciBvdmVyZmxvdyBpbiBiYXNlIGFyaXRoZW10aWMpCitkZGZtYTI3NjAgZm1hICAxZS0yOTEgMWUtMTAxICAgMGUrMzg0ICAtPiAgMUUtMzkyIFN1Ym5vcm1hbAorZGRmbWEyNzYxIGZtYSAgMWUtMjkxIDFlLTEwMiAgIDBlKzM4NCAgLT4gIDFFLTM5MyBTdWJub3JtYWwKK2RkZm1hMjc2MiBmbWEgIDFlLTI5MSAxZS0xMDMgICAwZSszODQgIC0+ICAxRS0zOTQgU3Vibm9ybWFsCitkZGZtYTI3NjMgZm1hICAxZS0yOTEgMWUtMTA0ICAgMGUrMzg0ICAtPiAgMUUtMzk1IFN1Ym5vcm1hbAorZGRmbWEyNzY0IGZtYSAgMWUtMjkxIDFlLTEwNSAgIDBlKzM4NCAgLT4gIDFFLTM5NiBTdWJub3JtYWwKK2RkZm1hMjc2NSBmbWEgIDFlLTI5MSAxZS0xMDYgICAwZSszODQgIC0+ICAxRS0zOTcgU3Vibm9ybWFsCitkZGZtYTI3NjYgZm1hICAxZS0yOTEgMWUtMTA3ICAgMGUrMzg0ICAtPiAgMUUtMzk4IFN1Ym5vcm1hbAorZGRmbWEyNzY3IGZtYSAgMWUtMjkxIDFlLTEwOCAgIDBlKzM4NCAgLT4gIDBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGZtYTI3NjggZm1hICAxZS0yOTEgMWUtMTA5ICAgMGUrMzg0ICAtPiAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjc2OSBmbWEgIDFlLTI5MSAxZS0xMTAgICAwZSszODQgIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gW25vIGVxdWl2YWxlbnQgb2YgJ3N1Ym5vcm1hbCcgZm9yIG92ZXJmbG93XQorZGRmbWEyNzcwIGZtYSAgMWUrNjAgMWUrMzIxICAgMGUrMzg0ICAtPiAgMS4wMDAwMDAwMDAwMDBFKzM4MSAgQ2xhbXBlZAorZGRmbWEyNzcxIGZtYSAgMWUrNjAgMWUrMzIyICAgMGUrMzg0ICAtPiAgMS4wMDAwMDAwMDAwMDAwRSszODIgIENsYW1wZWQKK2RkZm1hMjc3MiBmbWEgIDFlKzYwIDFlKzMyMyAgIDBlKzM4NCAgLT4gIDEuMDAwMDAwMDAwMDAwMDBFKzM4MyAgQ2xhbXBlZAorZGRmbWEyNzczIGZtYSAgMWUrNjAgMWUrMzI0ICAgMGUrMzg0ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAgQ2xhbXBlZAorZGRmbWEyNzc0IGZtYSAgMWUrNjAgMWUrMzI1ICAgMGUrMzg0ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI3NzUgZm1hICAxZSs2MCAxZSszMjYgICAwZSszODQgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc3NiBmbWEgIDFlKzYwIDFlKzMyNyAgIDBlKzM4NCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRmbWEyNzc3IGZtYSAgMWUrNjAgMWUrMzI4ICAgMGUrMzg0ICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI3NzggZm1hICAxZSs2MCAxZSszMjkgICAwZSszODQgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjc3OSBmbWEgIDFlKzYwIDFlKzMzMCAgIDBlKzM4NCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitkZGZtYTI4MDEgZm1hICAgMS4wMDAwRS0zOTQgIDEgICAgICAgMGUrMzg0ICAtPiAgMS4wMDAwRS0zOTQgU3Vibm9ybWFsCitkZGZtYTI4MDIgZm1hICAgMS4wMDBFLTM5NCAgIDFlLTEgICAgMGUrMzg0ICAtPiAgMS4wMDBFLTM5NSAgU3Vibm9ybWFsCitkZGZtYTI4MDMgZm1hICAgMS4wMEUtMzk0ICAgIDFlLTIgICAgMGUrMzg0ICAtPiAgMS4wMEUtMzk2ICAgU3Vibm9ybWFsCitkZGZtYTI4MDQgZm1hICAgMS4wRS0zOTQgICAgIDFlLTMgICAgMGUrMzg0ICAtPiAgMS4wRS0zOTcgICAgU3Vibm9ybWFsCitkZGZtYTI4MDUgZm1hICAgMS4wRS0zOTQgICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMUUtMzk4ICAgICBTdWJub3JtYWwgUm91bmRlZAorZGRmbWEyODA2IGZtYSAgIDEuM0UtMzk0ICAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgwNyBmbWEgICAxLjVFLTM5NCAgICAgMWUtNCAgICAwZSszODQgIC0+ICAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MDggZm1hICAgMS43RS0zOTQgICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODA5IGZtYSAgIDIuM0UtMzk0ICAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgxMCBmbWEgICAyLjVFLTM5NCAgICAgMWUtNCAgICAwZSszODQgIC0+ICAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MTEgZm1hICAgMi43RS0zOTQgICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgM0UtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODEyIGZtYSAgIDEuNDlFLTM5NCAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgxMyBmbWEgICAxLjUwRS0zOTQgICAgMWUtNCAgICAwZSszODQgIC0+ICAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MTQgZm1hICAgMS41MUUtMzk0ICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODE1IGZtYSAgIDIuNDlFLTM5NCAgICAxZS00ICAgIDBlKzM4NCAgLT4gIDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgxNiBmbWEgICAyLjUwRS0zOTQgICAgMWUtNCAgICAwZSszODQgIC0+ICAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MTcgZm1hICAgMi41MUUtMzk0ICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgM0UtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZGZtYTI4MTggZm1hICAgMUUtMzk0ICAgICAgIDFlLTQgICAgMGUrMzg0ICAtPiAgMUUtMzk4ICAgICBTdWJub3JtYWwKK2RkZm1hMjgxOSBmbWEgICAzRS0zOTQgICAgICAgMWUtNSAgICAwZSszODQgIC0+ICAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjgyMCBmbWEgICA1RS0zOTQgICAgICAgMWUtNSAgICAwZSszODQgIC0+ICAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjgyMSBmbWEgICA3RS0zOTQgICAgICAgMWUtNSAgICAwZSszODQgIC0+ICAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MjIgZm1hICAgOUUtMzk0ICAgICAgIDFlLTUgICAgMGUrMzg0ICAtPiAgMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODIzIGZtYSAgIDkuOUUtMzk0ICAgICAxZS01ICAgIDBlKzM4NCAgLT4gIDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEyODI0IGZtYSAgIDFFLTM5NCAgICAgIC0xZS00ICAgIDBlKzM4NCAgLT4gIC0xRS0zOTggICAgU3Vibm9ybWFsCitkZGZtYTI4MjUgZm1hICAgM0UtMzk0ICAgICAgLTFlLTUgICAgMGUrMzg0ICAtPiAgLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGZtYTI4MjYgZm1hICAtNUUtMzk0ICAgICAgIDFlLTUgICAgMGUrMzg0ICAtPiAgLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZGZtYTI4MjcgZm1hICAgN0UtMzk0ICAgICAgLTFlLTUgICAgMGUrMzg0ICAtPiAgLTFFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRmbWEyODI4IGZtYSAgLTlFLTM5NCAgICAgICAxZS01ICAgIDBlKzM4NCAgLT4gIC0xRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMjgyOSBmbWEgICA5LjlFLTM5NCAgICAtMWUtNSAgICAwZSszODQgIC0+ICAtMUUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZGZtYTI4MzAgZm1hICAgMy4wRS0zOTQgICAgLTFlLTUgICAgMGUrMzg0ICAtPiAgLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2RkZm1hMjgzMSBmbWEgICAxLjBFLTE5OSAgICAgMWUtMjAwICAgMGUrMzg0ICAtPiAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkZm1hMjgzMiBmbWEgICAxLjBFLTE5OSAgICAgMWUtMTk5ICAgMGUrMzg0ICAtPiAgMUUtMzk4ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZGZtYTI4MzMgZm1hICAgMS4wRS0xOTkgICAgIDFlLTE5OCAgIDBlKzM4NCAgLT4gIDEuMEUtMzk3ICAgIFN1Ym5vcm1hbAorZGRmbWEyODM0IGZtYSAgIDIuMEUtMTk5ICAgICAyZS0xOTggICAwZSszODQgIC0+ICA0LjBFLTM5NyAgICBTdWJub3JtYWwKK2RkZm1hMjgzNSBmbWEgICA0LjBFLTE5OSAgICAgNGUtMTk4ICAgMGUrMzg0ICAtPiAgMS42MEUtMzk2ICAgU3Vibm9ybWFsCitkZGZtYTI4MzYgZm1hICAxMC4wRS0xOTkgICAgMTBlLTE5OCAgIDBlKzM4NCAgLT4gIDEuMDAwRS0zOTUgIFN1Ym5vcm1hbAorZGRmbWEyODM3IGZtYSAgMzAuMEUtMTk5ICAgIDMwZS0xOTggICAwZSszODQgIC0+ICA5LjAwMEUtMzk1ICBTdWJub3JtYWwKK2RkZm1hMjgzOCBmbWEgIDQwLjBFLTE5OSAgICA0MGUtMTg4ICAgMGUrMzg0ICAtPiAgMS42MDAwRS0zODQgU3Vibm9ybWFsCitkZGZtYTI4MzkgZm1hICA0MC4wRS0xOTkgICAgNDBlLTE4NyAgIDBlKzM4NCAgLT4gIDEuNjAwMEUtMzgzCitkZGZtYTI4NDAgZm1hICA0MC4wRS0xOTkgICAgNDBlLTE4NiAgIDBlKzM4NCAgLT4gIDEuNjAwMEUtMzgyCisKKy0tIExvbmcgb3BlcmFuZCBvdmVyZmxvdyBtYXkgYmUgYSBkaWZmZXJlbnQgcGF0aAorZGRmbWEyODcwIGZtYSAgMTAwICA5Ljk5OUUrMzgzICAgICAgICAgICAwZSszODQgIC0+ICAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkZGZtYTI4NzEgZm1hICAxMDAgLTkuOTk5RSszODMgICAgICAgMGUrMzg0ICAtPiAgLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGRmbWEyODcyIGZtYSAgICAgICA5Ljk5OUUrMzgzIDEwMCAgIDBlKzM4NCAgLT4gICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2RkZm1hMjg3MyBmbWEgICAgICAtOS45OTlFKzM4MyAxMDAgICAwZSszODQgIC0+ICAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitkZGZtYTI4ODEgZm1hICAgMS4yMzQ3RS0zNTUgMS4yMzQ3RS00MCAgICAwZSszODQgIC0+ICAgMS41MjRFLTM5NSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRmbWEyODgyIGZtYSAgIDEuMjM0RS0zNTUgMS4yMzRFLTQwICAgICAgMGUrMzg0ICAtPiAgIDEuNTIzRS0zOTUgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZm1hMjg4MyBmbWEgICAxLjIzRS0zNTUgIDEuMjNFLTQwICAgICAgIDBlKzM4NCAgLT4gICAxLjUxM0UtMzk1IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGZtYTI4ODQgZm1hICAgMS4yRS0zNTUgICAxLjJFLTQwICAgICAgICAwZSszODQgIC0+ICAgMS40NEUtMzk1ICBTdWJub3JtYWwKK2RkZm1hMjg4NSBmbWEgICAxLjJFLTM1NSAgIDEuMkUtNDEgICAgICAgIDBlKzM4NCAgLT4gICAxLjQ0RS0zOTYgIFN1Ym5vcm1hbAorZGRmbWEyODg2IGZtYSAgIDEuMkUtMzU1ICAgMS4yRS00MiAgICAgICAgMGUrMzg0ICAtPiAgIDEuNEUtMzk3ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkZm1hMjg4NyBmbWEgICAxLjJFLTM1NSAgIDEuM0UtNDIgICAgICAgIDBlKzM4NCAgLT4gICAxLjZFLTM5NyAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkZGZtYTI4ODggZm1hICAgMS4zRS0zNTUgICAxLjNFLTQyICAgICAgICAwZSszODQgIC0+ICAgMS43RS0zOTcgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZGRmbWEyODg5IGZtYSAgIDEuM0UtMzU1ICAgMS4zRS00MyAgICAgICAgMGUrMzg0ICAtPiAgICAgMkUtMzk4ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkZm1hMjg5MCBmbWEgICAxLjNFLTM1NiAgIDEuM0UtNDMgICAgICAgIDBlKzM4NCAgLT4gICAgIDBFLTM5OCAgIENsYW1wZWQgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworZGRmbWEyODkxIGZtYSAgIDEuMjM0NUUtMzkgICAxLjIzNEUtMzU1ICAgMGUrMzg0ICAtPiAgIDEuNTIzNEUtMzk0IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGZtYTI4OTIgZm1hICAgMS4yMzQ1NkUtMzkgIDEuMjM0RS0zNTUgICAwZSszODQgIC0+ICAgMS41MjM0RS0zOTQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZm1hMjg5MyBmbWEgICAxLjIzNDVFLTQwICAgMS4yMzRFLTM1NSAgIDBlKzM4NCAgLT4gICAxLjUyM0UtMzk1ICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRmbWEyODk0IGZtYSAgIDEuMjM0NTZFLTQwICAxLjIzNEUtMzU1ICAgMGUrMzg0ICAtPiAgIDEuNTIzRS0zOTUgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZGZtYTI4OTUgZm1hICAgMS4yMzQ1RS00MSAgIDEuMjM0RS0zNTUgICAwZSszODQgIC0+ICAgMS41MkUtMzk2ICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkZm1hMjg5NiBmbWEgICAxLjIzNDU2RS00MSAgMS4yMzRFLTM1NSAgIDBlKzM4NCAgLT4gICAxLjUyRS0zOTYgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBOb3cgZXhwbG9yZSB0aGUgY2FzZSB3aGVyZSB3ZSBnZXQgYSBub3JtYWwgcmVzdWx0IHdpdGggVW5kZXJmbG93CitkZGZtYTI5MDAgZm1hICAgMC4zMDAwMDAwMDAwRS0xOTEgMC4zMDAwMDAwMDAwRS0xOTEgICAwZSszODQgIC0+ICA5LjAwMDAwMDAwMDAwMDAwRS0zODQgU3Vibm9ybWFsIFJvdW5kZWQKK2RkZm1hMjkwMSBmbWEgICAwLjMwMDAwMDAwMDFFLTE5MSAwLjMwMDAwMDAwMDFFLTE5MSAgIDBlKzM4NCAgLT4gIDkuMDAwMDAwMDA2MDAwMDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZGRmbWEyOTAyIGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OSAgICAgICAgICAgMGUrMzg0ICAtPiAgOS45OTk5OTk5OTk5OTAwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZGZtYTI5MDMgZm1hICAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OSAgICAgICAgICAwZSszODQgIC0+ICA5Ljk5OTk5OTk5OTk5OTAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2RkZm1hMjkwNCBmbWEgICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OSAgICAgICAgIDBlKzM4NCAgLT4gIDkuOTk5OTk5OTk5OTk5OTBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZGRmbWEyOTA1IGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OSAgICAgICAgMGUrMzg0ICAtPiAgOS45OTk5OTk5OTk5OTk5OUUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCistLSBwcm92ZSBvcGVyYW5kcyBhcmUgZXhhY3QKK2RkZm1hMjkwNiBmbWEgICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAxICAgICAgICAgICAgICAgICAgICAgICAgIDBlKzM4NCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMKK2RkZm1hMjkwNyBmbWEgICAgICAgICAgICAgICAgICAgICAgICAxICAwLjA5OTk5OTk5OTk5OTk5OTk5ICAgICAgIDBlKzM4NCAgLT4gIDAuMDk5OTk5OTk5OTk5OTk5OTkKKy0tIHRoZSBuZXh0IHJvdW5kcyB0byBObWluCitkZGZtYTI5MDggZm1hICAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OSAgICAgICAwZSszODQgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCisKKy0tIGh1Z2VzdAorZGRmbWEyOTA5IGZtYSAgIDk5OTk5OTk5OTk5OTk5OTkgOTk5OTk5OTk5OTk5OTk5OSAgIDBlKzM4NCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk4RSszMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gTnVsbCB0ZXN0cworZGRmbWEyOTkwIGZtYSAgMTAgICMgICAwZSszODQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMjk5MSBmbWEgICAjIDEwICAgMGUrMzg0ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKworLS0gQURESVRJT04gVEVTVFMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIFtmaXJzdCBncm91cCBhcmUgJ3F1aWNrIGNvbmZpZGVuY2UgY2hlY2snXQorZGRmbWEzMDAxIGZtYSAgMSAgMSAgICAgICAxICAgICAgIC0+ICAyCitkZGZtYTMwMDIgZm1hICAxICAyICAgICAgIDMgICAgICAgLT4gIDUKK2RkZm1hMzAwMyBmbWEgIDEgICc1Ljc1JyAgJzMuMycgICAtPiAgOS4wNQorZGRmbWEzMDA0IGZtYSAgMSAgJzUnICAgICAnLTMnICAgIC0+ICAyCitkZGZtYTMwMDUgZm1hICAxICAnLTUnICAgICctMycgICAgLT4gIC04CitkZGZtYTMwMDYgZm1hICAxICAnLTcnICAgICcyLjUnICAgLT4gIC00LjUKK2RkZm1hMzAwNyBmbWEgIDEgICcwLjcnICAgJzAuMycgICAtPiAgMS4wCitkZGZtYTMwMDggZm1hICAxICAnMS4yNScgICcxLjI1JyAgLT4gIDIuNTAKK2RkZm1hMzAwOSBmbWEgIDEgICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcyLjIzNDU2Nzg5JworZGRmbWEzMDEwIGZtYSAgMSAgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAxMScgLT4gJzIuMjM0NTY4MDAnCisKKy0tICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZGZtYTMwMTEgZm1hICAxICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ2JyAgJzAuNTU1NTU1NTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzAxMiBmbWEgIDEgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDUnICAnMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RkZm1hMzAxMyBmbWEgIDEgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5JworZGRmbWEzMDE0IGZtYSAgMSAgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNDknICAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDE1IGZtYSAgMSAgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNDk5JyAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDE2IGZtYSAgMSAgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNDk5OScgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDE3IGZtYSAgMSAgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTAwMCcgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDE4IGZtYSAgMSAgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTAwMScgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDE5IGZtYSAgMSAgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTAxJyAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDIwIGZtYSAgMSAgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTEnICAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorCitkZGZtYTMwMjEgZm1hICAxICAwIDEgLT4gMQorZGRmbWEzMDIyIGZtYSAgMSAgMSAxIC0+IDIKK2RkZm1hMzAyMyBmbWEgIDEgIDIgMSAtPiAzCitkZGZtYTMwMjQgZm1hICAxICAzIDEgLT4gNAorZGRmbWEzMDI1IGZtYSAgMSAgNCAxIC0+IDUKK2RkZm1hMzAyNiBmbWEgIDEgIDUgMSAtPiA2CitkZGZtYTMwMjcgZm1hICAxICA2IDEgLT4gNworZGRmbWEzMDI4IGZtYSAgMSAgNyAxIC0+IDgKK2RkZm1hMzAyOSBmbWEgIDEgIDggMSAtPiA5CitkZGZtYTMwMzAgZm1hICAxICA5IDEgLT4gMTAKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCitkZGZtYTMwMzEgZm1hICAxICAnMC45OTk4JyAgJzAuMDAwMCcgLT4gJzAuOTk5OCcKK2RkZm1hMzAzMiBmbWEgIDEgICcwLjk5OTgnICAnMC4wMDAxJyAtPiAnMC45OTk5JworZGRmbWEzMDMzIGZtYSAgMSAgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcxLjAwMDAnCitkZGZtYTMwMzQgZm1hICAxICAnMC45OTk4JyAgJzAuMDAwMycgLT4gJzEuMDAwMScKKworZGRmbWEzMDM1IGZtYSAgMSAgJzcwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMzYgZm1hICAxICAnNzAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMzcgZm1hICAxICAnNzAwMCcgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDM4IGZtYSAgMSAgJzcwMDAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAxRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMwMzkgZm1hICAxICAnNzAwMDAwJyAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDA3RSsyMCcgUm91bmRlZAorCistLSBzeW1tZXRyeToKK2RkZm1hMzA0MCBmbWEgIDEgICcxMDAwMGUrMTYnICAnNzAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDQxIGZtYSAgMSAgJzEwMDAwZSsxNicgICc3MDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDQyIGZtYSAgMSAgJzEwMDAwZSsxNicgICc3MDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzA0NCBmbWEgIDEgICcxMDAwMGUrMTYnICAnNzAwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMUUrMjAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMDQ1IGZtYSAgMSAgJzEwMDAwZSsxNicgICc3MDAwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwN0UrMjAnIFJvdW5kZWQKKworLS0gc2FtZSwgd2l0aG91dCByb3VuZGluZworZGRmbWEzMDQ2IGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcnIC0+ICcxMDAwMDAwMDAwMDAwNycKK2RkZm1hMzA0NyBmbWEgIDEgICcxMDAwMGUrOScgICc3MCcgLT4gJzEwMDAwMDAwMDAwMDcwJworZGRmbWEzMDQ4IGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwMCcgLT4gJzEwMDAwMDAwMDAwNzAwJworZGRmbWEzMDQ5IGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwMDAnIC0+ICcxMDAwMDAwMDAwNzAwMCcKK2RkZm1hMzA1MCBmbWEgIDEgICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEwMDAwMDAwMDcwMDAwJworZGRmbWEzMDUxIGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwMDAwMCcgLT4gJzEwMDAwMDAwNzAwMDAwJworZGRmbWEzMDUyIGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwMDAwMDAnIC0+ICcxMDAwMDAwNzAwMDAwMCcKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorZGRmbWEzMDUzIGZtYSAgMSAgJzEyJyAnNy4wMCcgLT4gJzE5LjAwJworZGRmbWEzMDU0IGZtYSAgMSAgJzEuMycgJy0xLjA3JyAtPiAnMC4yMycKK2RkZm1hMzA1NSBmbWEgIDEgICcxLjMnICctMS4zMCcgLT4gJzAuMDAnCitkZGZtYTMwNTYgZm1hICAxICAnMS4zJyAnLTIuMDcnIC0+ICctMC43NycKK2RkZm1hMzA1NyBmbWEgIDEgICcxRSsyJyAnMUUrNCcgLT4gJzEuMDFFKzQnCisKKy0tIGxlYWRpbmcgemVybyBwcmVzZXJ2YXRpb24KK2RkZm1hMzA2MSBmbWEgIDEgIDEgJzAuMDAwMScgLT4gJzEuMDAwMScKK2RkZm1hMzA2MiBmbWEgIDEgIDEgJzAuMDAwMDEnIC0+ICcxLjAwMDAxJworZGRmbWEzMDYzIGZtYSAgMSAgMSAnMC4wMDAwMDEnIC0+ICcxLjAwMDAwMScKK2RkZm1hMzA2NCBmbWEgIDEgIDEgJzAuMDAwMDAwMScgLT4gJzEuMDAwMDAwMScKK2RkZm1hMzA2NSBmbWEgIDEgIDEgJzAuMDAwMDAwMDEnIC0+ICcxLjAwMDAwMDAxJworCistLSBzb21lIGZ1bm55IHplcm9zIFtpbiBjYXNlIG9mIGJhZCBzaWdudW1dCitkZGZtYTMwNzAgZm1hICAxICAxICAwICAgIC0+IDEKK2RkZm1hMzA3MSBmbWEgIDEgIDEgMC4gICAgLT4gMQorZGRmbWEzMDcyIGZtYSAgMSAgMSAgLjAgICAtPiAxLjAKK2RkZm1hMzA3MyBmbWEgIDEgIDEgMC4wICAgLT4gMS4wCitkZGZtYTMwNzQgZm1hICAxICAxIDAuMDAgIC0+IDEuMDAKK2RkZm1hMzA3NSBmbWEgIDEgICAwICAxICAgLT4gMQorZGRmbWEzMDc2IGZtYSAgMSAgMC4gIDEgICAtPiAxCitkZGZtYTMwNzcgZm1hICAxICAgLjAgMSAgIC0+IDEuMAorZGRmbWEzMDc4IGZtYSAgMSAgMC4wIDEgICAtPiAxLjAKK2RkZm1hMzA3OSBmbWEgIDEgIDAuMDAgMSAgLT4gMS4wMAorCistLSBzb21lIGNhcnJpZXMKK2RkZm1hMzA4MCBmbWEgIDEgIDk5OTk5OTk5OCAxICAtPiA5OTk5OTk5OTkKK2RkZm1hMzA4MSBmbWEgIDEgIDk5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAwCitkZGZtYTMwODIgZm1hICAxICAgOTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwCitkZGZtYTMwODMgZm1hICAxICAgIDk5OTk5OTkgMSAgLT4gMTAwMDAwMDAKK2RkZm1hMzA4NCBmbWEgIDEgICAgIDk5OTk5OSAxICAtPiAxMDAwMDAwCitkZGZtYTMwODUgZm1hICAxICAgICAgOTk5OTkgMSAgLT4gMTAwMDAwCitkZGZtYTMwODYgZm1hICAxICAgICAgIDk5OTkgMSAgLT4gMTAwMDAKK2RkZm1hMzA4NyBmbWEgIDEgICAgICAgIDk5OSAxICAtPiAxMDAwCitkZGZtYTMwODggZm1hICAxICAgICAgICAgOTkgMSAgLT4gMTAwCitkZGZtYTMwODkgZm1hICAxICAgICAgICAgIDkgMSAgLT4gMTAKKworCistLSBtb3JlIExIUyBzd2FwcworZGRmbWEzMDkwIGZtYSAgMSAgJy01NjI2N0UtMTAnICAgMCAtPiAgJy0wLjAwMDAwNTYyNjcnCitkZGZtYTMwOTEgZm1hICAxICAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3JworZGRmbWEzMDkyIGZtYSAgMSAgJy01NjI2N0UtNScgICAgMCAtPiAgJy0wLjU2MjY3JworZGRmbWEzMDkzIGZtYSAgMSAgJy01NjI2N0UtNCcgICAgMCAtPiAgJy01LjYyNjcnCitkZGZtYTMwOTQgZm1hICAxICAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK2RkZm1hMzA5NSBmbWEgIDEgICctNTYyNjdFLTInICAgIDAgLT4gICctNTYyLjY3JworZGRmbWEzMDk2IGZtYSAgMSAgJy01NjI2N0UtMScgICAgMCAtPiAgJy01NjI2LjcnCitkZGZtYTMwOTcgZm1hICAxICAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3JworZGRmbWEzMDk4IGZtYSAgMSAgJy01RS0xMCcgICAgICAgMCAtPiAgJy01RS0xMCcKK2RkZm1hMzA5OSBmbWEgIDEgICctNUUtNycgICAgICAgIDAgLT4gICctNUUtNycKK2RkZm1hMzEwMCBmbWEgIDEgICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCitkZGZtYTMxMDEgZm1hICAxICAnLTVFLTUnICAgICAgICAwIC0+ICAnLTAuMDAwMDUnCitkZGZtYTMxMDIgZm1hICAxICAnLTVFLTQnICAgICAgICAwIC0+ICAnLTAuMDAwNScKK2RkZm1hMzEwMyBmbWEgIDEgICctNUUtMScgICAgICAgIDAgLT4gICctMC41JworZGRmbWEzMTA0IGZtYSAgMSAgJy01RTAnICAgICAgICAgMCAtPiAgJy01JworZGRmbWEzMTA1IGZtYSAgMSAgJy01RTEnICAgICAgICAgMCAtPiAgJy01MCcKK2RkZm1hMzEwNiBmbWEgIDEgICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworZGRmbWEzMTA3IGZtYSAgMSAgJy01RTE1JyAgICAgICAgMCAtPiAgJy01MDAwMDAwMDAwMDAwMDAwJworZGRmbWEzMTA4IGZtYSAgMSAgJy01RTE2JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTYnICBSb3VuZGVkCitkZGZtYTMxMDkgZm1hICAxICAnLTVFMTcnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNycgIFJvdW5kZWQKK2RkZm1hMzExMCBmbWEgIDEgICctNUUxOCcgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgUm91bmRlZAorZGRmbWEzMTExIGZtYSAgMSAgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzCitkZGZtYTMxMTMgZm1hICAxICAwICAnLTU2MjY3RS0xMCcgLT4gICctMC4wMDAwMDU2MjY3JworZGRmbWEzMTE0IGZtYSAgMSAgMCAgJy01NjI2N0UtNicgIC0+ICAnLTAuMDU2MjY3JworZGRmbWEzMTE2IGZtYSAgMSAgMCAgJy01NjI2N0UtNScgIC0+ICAnLTAuNTYyNjcnCitkZGZtYTMxMTcgZm1hICAxICAwICAnLTU2MjY3RS00JyAgLT4gICctNS42MjY3JworZGRmbWEzMTE5IGZtYSAgMSAgMCAgJy01NjI2N0UtMycgIC0+ICAnLTU2LjI2NycKK2RkZm1hMzEyMCBmbWEgIDEgIDAgICctNTYyNjdFLTInICAtPiAgJy01NjIuNjcnCitkZGZtYTMxMjEgZm1hICAxICAwICAnLTU2MjY3RS0xJyAgLT4gICctNTYyNi43JworZGRmbWEzMTIyIGZtYSAgMSAgMCAgJy01NjI2N0UtMCcgIC0+ICAnLTU2MjY3JworZGRmbWEzMTIzIGZtYSAgMSAgMCAgJy01RS0xMCcgICAgIC0+ICAnLTVFLTEwJworZGRmbWEzMTI0IGZtYSAgMSAgMCAgJy01RS03JyAgICAgIC0+ICAnLTVFLTcnCitkZGZtYTMxMjUgZm1hICAxICAwICAnLTVFLTYnICAgICAgLT4gICctMC4wMDAwMDUnCitkZGZtYTMxMjYgZm1hICAxICAwICAnLTVFLTUnICAgICAgLT4gICctMC4wMDAwNScKK2RkZm1hMzEyNyBmbWEgIDEgIDAgICctNUUtNCcgICAgICAtPiAgJy0wLjAwMDUnCitkZGZtYTMxMjggZm1hICAxICAwICAnLTVFLTEnICAgICAgLT4gICctMC41JworZGRmbWEzMTI5IGZtYSAgMSAgMCAgJy01RTAnICAgICAgIC0+ICAnLTUnCitkZGZtYTMxMzAgZm1hICAxICAwICAnLTVFMScgICAgICAgLT4gICctNTAnCitkZGZtYTMxMzEgZm1hICAxICAwICAnLTVFNScgICAgICAgLT4gICctNTAwMDAwJworZGRmbWEzMTMyIGZtYSAgMSAgMCAgJy01RTE1JyAgICAgIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAnCitkZGZtYTMxMzMgZm1hICAxICAwICAnLTVFMTYnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE2JyAgIFJvdW5kZWQKK2RkZm1hMzEzNCBmbWEgIDEgIDAgICctNUUxNycgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTcnICAgUm91bmRlZAorZGRmbWEzMTM1IGZtYSAgMSAgMCAgJy01RTE4JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxOCcgICBSb3VuZGVkCitkZGZtYTMxMzYgZm1hICAxICAwICAnLTVFMTAwJyAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzEwMCcgIFJvdW5kZWQKKworLS0gcmVsYXRlZAorZGRmbWEzMTM3IGZtYSAgMSAgIDEgICcwRS0xOScgICAgICAtPiAgJzEuMDAwMDAwMDAwMDAwMDAwJyAgUm91bmRlZAorZGRmbWEzMTM4IGZtYSAgMSAgLTEgICcwRS0xOScgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZGRmbWEzMTM5IGZtYSAgMSAgJzBFLTE5JyAxICAgICAgICAtPiAgJzEuMDAwMDAwMDAwMDAwMDAwJyAgUm91bmRlZAorZGRmbWEzMTQwIGZtYSAgMSAgJzBFLTE5JyAtMSAgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZGRmbWEzMTQxIGZtYSAgMSAgMUUrMTEgICAwLjAwMDAgICAtPiAgJzEwMDAwMDAwMDAwMC4wMDAwJworZGRmbWEzMTQyIGZtYSAgMSAgMUUrMTEgICAwLjAwMDAwICAtPiAgJzEwMDAwMDAwMDAwMC4wMDAwJyAgUm91bmRlZAorZGRmbWEzMTQzIGZtYSAgMSAgMC4wMDAgICAxRSsxMiAgICAtPiAgJzEwMDAwMDAwMDAwMDAuMDAwJworZGRmbWEzMTQ0IGZtYSAgMSAgMC4wMDAwICAxRSsxMiAgICAtPiAgJzEwMDAwMDAwMDAwMDAuMDAwJyAgUm91bmRlZAorCistLSBbc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzXQorZGRmbWEzMTQ2IGZtYSAgMSAgJzAwLjAnICAwICAgICAgIC0+ICAnMC4wJworZGRmbWEzMTQ3IGZtYSAgMSAgJzAuMDAnICAwICAgICAgIC0+ICAnMC4wMCcKK2RkZm1hMzE0OCBmbWEgIDEgICAwICAgICAgJzAuMDAnICAtPiAgJzAuMDAnCitkZGZtYTMxNDkgZm1hICAxICAgMCAgICAgICcwMC4wJyAgLT4gICcwLjAnCitkZGZtYTMxNTAgZm1hICAxICAnMDAuMCcgICcwLjAwJyAgLT4gICcwLjAwJworZGRmbWEzMTUxIGZtYSAgMSAgJzAuMDAnICAnMDAuMCcgIC0+ICAnMC4wMCcKK2RkZm1hMzE1MiBmbWEgIDEgICczJyAgICAgJy4zJyAgICAtPiAgJzMuMycKK2RkZm1hMzE1MyBmbWEgIDEgICczLicgICAgJy4zJyAgICAtPiAgJzMuMycKK2RkZm1hMzE1NCBmbWEgIDEgICczLjAnICAgJy4zJyAgICAtPiAgJzMuMycKK2RkZm1hMzE1NSBmbWEgIDEgICczLjAwJyAgJy4zJyAgICAtPiAgJzMuMzAnCitkZGZtYTMxNTYgZm1hICAxICAnMycgICAgICczJyAgICAgLT4gICc2JworZGRmbWEzMTU3IGZtYSAgMSAgJzMnICAgICAnKzMnICAgIC0+ICAnNicKK2RkZm1hMzE1OCBmbWEgIDEgICczJyAgICAgJy0zJyAgICAtPiAgJzAnCitkZGZtYTMxNTkgZm1hICAxICAnMC4zJyAgICctMC4zJyAgLT4gICcwLjAnCitkZGZtYTMxNjAgZm1hICAxICAnMC4wMycgICctMC4wMycgLT4gICcwLjAwJworCistLSB0cnkgYm9yZGVybGluZSBwcmVjaXNpb24sIHdpdGggY2FycmllcywgZXRjLgorZGRmbWEzMTYxIGZtYSAgMSAgJzFFKzEyJyAnLTEnICAgIC0+ICc5OTk5OTk5OTk5OTknCitkZGZtYTMxNjIgZm1hICAxICAnMUUrMTInICAnMS4xMScgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCitkZGZtYTMxNjMgZm1hICAxICAnMS4xMScgICcxRSsxMicgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCitkZGZtYTMxNjQgZm1hICAxICAnLTEnICAgICcxRSsxMicgLT4gJzk5OTk5OTk5OTk5OScKK2RkZm1hMzE2NSBmbWEgIDEgICc3RSsxMicgJy0xJyAgICAtPiAnNjk5OTk5OTk5OTk5OScKK2RkZm1hMzE2NiBmbWEgIDEgICc3RSsxMicgICcxLjExJyAtPiAnNzAwMDAwMDAwMDAwMS4xMScKK2RkZm1hMzE2NyBmbWEgIDEgICcxLjExJyAgJzdFKzEyJyAtPiAnNzAwMDAwMDAwMDAwMS4xMScKK2RkZm1hMzE2OCBmbWEgIDEgICctMScgICAgJzdFKzEyJyAtPiAnNjk5OTk5OTk5OTk5OScKKworcm91bmRpbmc6IGhhbGZfdXAKKy0tICAgICAgICAgICAxLjIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAxIDIzNDU2Nzg5MDEyMzQ1NgorZGRmbWEzMTcwIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2NycgLT4gJzUuMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE3MSBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjYnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMxNzIgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTY1JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTczIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU2NCcgLT4gJzUuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE3NCBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMxNzUgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUyJyAtPiAnNC45OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTc2IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1MScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE3NyBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OScgUm91bmRlZAorZGRmbWEzMTc4IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0NScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE3OSBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDQnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMxODAgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQzJyAtPiAnNC45OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMTgxIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0MicgLT4gJzQuOTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzE4MiBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NDEnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMxODMgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTQwJyAtPiAnNC45OTk5OTk5OTk5OTk5OTgnIFJvdW5kZWQKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2RkZm1hMzIwMCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JworZGRmbWEzMjAxIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjAyIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjAzIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjA0IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjA1IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjA2IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjA3IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjA4IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjA5IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjEwIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjExIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjEyIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjEzIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjE0IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjE1IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjE2IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnCitkZGZtYTMyMTcgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTggZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMTkgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkZm1hMzIyMCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2Nzg5JworZGRmbWEzMjIxIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjIyIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjIzIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjI0IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjI1IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjI2IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjI3IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjI4IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjI5IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjMwIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjMxIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjMyIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjMzIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjM0IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjM1IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjM2IGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3OTAnCitkZGZtYTMyMzcgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzggZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyMzkgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZGRmbWEzMjQwIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjQxIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMjQyIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZGRmbWEzMjUwIGZtYSAgMSAgJzEyMzQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzQ1NjAxMjM0NTY3ODknCitkZGZtYTMyNTEgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTIgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTMgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTQgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTUgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTYgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTcgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTggZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNTkgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNjAgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNjEgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNjIgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNjMgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNjQgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNjUgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzNDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMyNjYgZm1hICAxICAnMTIzNDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2MDEyMzQ1Njc5MCcKK2RkZm1hMzI2NyBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2OCBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzI2OSBmbWEgIDEgICcxMjM0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gMSBpbiBsYXN0IHBsYWNlIHRlc3RzCityb3VuZGluZzogaGFsZl91cAorZGRmbWEzMzAxIGZtYSAgMSAgIC0xICAgMSAgICAgIC0+ICAgMAorZGRmbWEzMzAyIGZtYSAgMSAgICAwICAgMSAgICAgIC0+ICAgMQorZGRmbWEzMzAzIGZtYSAgMSAgICAxICAgMSAgICAgIC0+ICAgMgorZGRmbWEzMzA0IGZtYSAgMSAgIDEyICAgMSAgICAgIC0+ICAxMworZGRmbWEzMzA1IGZtYSAgMSAgIDk4ICAgMSAgICAgIC0+ICA5OQorZGRmbWEzMzA2IGZtYSAgMSAgIDk5ICAgMSAgICAgIC0+IDEwMAorZGRmbWEzMzA3IGZtYSAgMSAgMTAwICAgMSAgICAgIC0+IDEwMQorZGRmbWEzMzA4IGZtYSAgMSAgMTAxICAgMSAgICAgIC0+IDEwMgorZGRmbWEzMzA5IGZtYSAgMSAgIC0xICAtMSAgICAgIC0+ICAtMgorZGRmbWEzMzEwIGZtYSAgMSAgICAwICAtMSAgICAgIC0+ICAtMQorZGRmbWEzMzExIGZtYSAgMSAgICAxICAtMSAgICAgIC0+ICAgMAorZGRmbWEzMzEyIGZtYSAgMSAgIDEyICAtMSAgICAgIC0+ICAxMQorZGRmbWEzMzEzIGZtYSAgMSAgIDk4ICAtMSAgICAgIC0+ICA5NworZGRmbWEzMzE0IGZtYSAgMSAgIDk5ICAtMSAgICAgIC0+ICA5OAorZGRmbWEzMzE1IGZtYSAgMSAgMTAwICAtMSAgICAgIC0+ICA5OQorZGRmbWEzMzE2IGZtYSAgMSAgMTAxICAtMSAgICAgIC0+IDEwMAorCitkZGZtYTMzMjEgZm1hICAxICAtMC4wMSAgMC4wMSAgICAtPiAgMC4wMAorZGRmbWEzMzIyIGZtYSAgMSAgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2RkZm1hMzMyMyBmbWEgIDEgICAwLjAxICAwLjAxICAgIC0+ICAwLjAyCitkZGZtYTMzMjQgZm1hICAxICAgMC4xMiAgMC4wMSAgICAtPiAgMC4xMworZGRmbWEzMzI1IGZtYSAgMSAgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2RkZm1hMzMyNiBmbWEgIDEgICAwLjk5ICAwLjAxICAgIC0+ICAxLjAwCitkZGZtYTMzMjcgZm1hICAxICAgMS4wMCAgMC4wMSAgICAtPiAgMS4wMQorZGRmbWEzMzI4IGZtYSAgMSAgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2RkZm1hMzMyOSBmbWEgIDEgIC0wLjAxIC0wLjAxICAgIC0+IC0wLjAyCitkZGZtYTMzMzAgZm1hICAxICAgMC4wMCAtMC4wMSAgICAtPiAtMC4wMQorZGRmbWEzMzMxIGZtYSAgMSAgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2RkZm1hMzMzMiBmbWEgIDEgICAwLjEyIC0wLjAxICAgIC0+ICAwLjExCitkZGZtYTMzMzMgZm1hICAxICAgMC45OCAtMC4wMSAgICAtPiAgMC45NworZGRmbWEzMzM0IGZtYSAgMSAgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2RkZm1hMzMzNSBmbWEgIDEgICAxLjAwIC0wLjAxICAgIC0+ICAwLjk5CitkZGZtYTMzMzYgZm1hICAxICAgMS4wMSAtMC4wMSAgICAtPiAgMS4wMAorCistLSBzb21lIG1vcmUgY2FzZXMgd2hlcmUgYWRkaW5nIDAgYWZmZWN0cyB0aGUgY29lZmZpY2llbnQKK2RkZm1hMzM0MCBmbWEgIDEgIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2RkZm1hMzM0MSBmbWEgIDEgIDFFKzE1ICAgMCAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwCitkZGZtYTMzNDIgZm1hICAxICAxRSsxNiAgIDAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgIFJvdW5kZWQKK2RkZm1hMzM0MyBmbWEgIDEgIDFFKzIwICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsyMCAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorZGRmbWEzMzQ0IGZtYSAgMSAgMUUrMyAgICAxICAgIC0+ICAgICAgICAgMTAwMQorZGRmbWEzMzQ1IGZtYSAgMSAgMUUrMTUgICAxICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDEKK2RkZm1hMzM0NiBmbWEgIDEgIDFFKzE2ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMzNDcgZm1hICAxICAxRSsyMCAgIDEgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMjAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzMzQ4IGZtYSAgMSAgMUUrMyAgICA3ICAgIC0+ICAgICAgICAgMTAwNworZGRmbWEzMzQ5IGZtYSAgMSAgMUUrMTUgICA3ICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDcKK2RkZm1hMzM1MCBmbWEgIDEgIDFFKzE2ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxRSsxNiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTMzNTEgZm1hICAxICAxRSsyMCAgIDcgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUrMjAgIEluZXhhY3QgUm91bmRlZAorCistLSB0cnl6ZXJvcyBjYXNlcworcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RkZm1hMzM2MCAgZm1hICAxICAwRSs1MCAxMDAwMEUrMSAgLT4gMS4wMDAwRSs1CitkZGZtYTMzNjEgIGZtYSAgMSAgMEUtNTAgMTAwMDBFKzEgIC0+IDEwMDAwMC4wMDAwMDAwMDAwIFJvdW5kZWQKK2RkZm1hMzM2MiAgZm1hICAxICAxMDAwMEUrMSAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAgUm91bmRlZAorZGRmbWEzMzYzICBmbWEgIDEgIDEwMDAwRSsxIDEwMDAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTMzNjQgIGZtYSAgMSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAtPiAwRSszNjkKKworLS0gYSBjdXJpb3NpdHkgZnJvbSBKU1IgMTMgdGVzdGluZworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorZGRmbWEzMzcwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDgxNAorZGRmbWEzMzcxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwODFFKzE2IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RkZm1hMzM3MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDA4MTQKK2RkZm1hMzM3MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEuMDAwMDAwMDAwMDAwMDgxRSsxNiBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RkZm1hMzM3NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDA4MTQKK2RkZm1hMzM3NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEuMDAwMDAwMDAwMDAwMDgxRSsxNiBSb3VuZGVkIEluZXhhY3QKKworLS0gdWxwIHJlcGxhY2VtZW50IHRlc3RzCitkZGZtYTM0MDAgZm1hICAxICAgIDEgICA3N2UtMTQgICAgICAtPiAgMS4wMDAwMDAwMDAwMDA3NworZGRmbWEzNDAxIGZtYSAgMSAgICAxICAgNzdlLTE1ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDc3CitkZGZtYTM0MDIgZm1hICAxICAgIDEgICA3N2UtMTYgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MDMgZm1hICAxICAgIDEgICA3N2UtMTcgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MDQgZm1hICAxICAgIDEgICA3N2UtMTggICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MDUgZm1hICAxICAgIDEgICA3N2UtMTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MDYgZm1hICAxICAgIDEgICA3N2UtMjk5ICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzQxMCBmbWEgIDEgICAxMCAgIDc3ZS0xNCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDA3NworZGRmbWEzNDExIGZtYSAgMSAgIDEwICAgNzdlLTE1ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDEyIGZtYSAgMSAgIDEwICAgNzdlLTE2ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDEzIGZtYSAgMSAgIDEwICAgNzdlLTE3ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDE0IGZtYSAgMSAgIDEwICAgNzdlLTE4ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDE1IGZtYSAgMSAgIDEwICAgNzdlLTE5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDE2IGZtYSAgMSAgIDEwICAgNzdlLTI5OSAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGZtYTM0MjAgZm1hICAxICAgNzdlLTE0ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDA3NworZGRmbWEzNDIxIGZtYSAgMSAgIDc3ZS0xNSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDc3CitkZGZtYTM0MjIgZm1hICAxICAgNzdlLTE2ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MjMgZm1hICAxICAgNzdlLTE3ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MjQgZm1hICAxICAgNzdlLTE4ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MjUgZm1hICAxICAgNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM0MjYgZm1hICAxICAgNzdlLTI5OSAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzQzMCBmbWEgIDEgICA3N2UtMTQgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDA3NworZGRmbWEzNDMxIGZtYSAgMSAgIDc3ZS0xNSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDMyIGZtYSAgMSAgIDc3ZS0xNiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDMzIGZtYSAgMSAgIDc3ZS0xNyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDM0IGZtYSAgMSAgIDc3ZS0xOCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDM1IGZtYSAgMSAgIDc3ZS0xOSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNDM2IGZtYSAgMSAgIDc3ZS0yOTkgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCitkZGZtYTM2NDQwIGZtYSAgMSAgICAxICAgLTc3ZS0xNCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDQxIGZtYSAgMSAgICAxICAgLTc3ZS0xNSAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ0MiBmbWEgIDEgICAgMSAgIC03N2UtMTYgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDQzIGZtYSAgMSAgICAxICAgLTc3ZS0xNyAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDQ0IGZtYSAgMSAgICAxICAgLTc3ZS0xOCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDQ1IGZtYSAgMSAgICAxICAgLTc3ZS0xOSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NDYgZm1hICAxICAgIDEgICAtNzdlLTk5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGZtYTM2NDUwIGZtYSAgMSAgIDEwICAgLTc3ZS0xNCAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ1MSBmbWEgIDEgICAxMCAgIC03N2UtMTUgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDUyIGZtYSAgMSAgIDEwICAgLTc3ZS0xNiAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDUzIGZtYSAgMSAgIDEwICAgLTc3ZS0xNyAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDU0IGZtYSAgMSAgIDEwICAgLTc3ZS0xOCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NTUgZm1hICAxICAgMTAgICAtNzdlLTE5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ1NiBmbWEgIDEgICAxMCAgIC03N2UtOTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzY0NjAgZm1hICAxICAgLTc3ZS0xNCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NjEgZm1hICAxICAgLTc3ZS0xNSAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDYyIGZtYSAgMSAgIC03N2UtMTYgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NjMgZm1hICAxICAgLTc3ZS0xNyAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NjQgZm1hICAxICAgLTc3ZS0xOCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NjUgZm1hICAxICAgLTc3ZS0xOSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ2NiBmbWEgIDEgICAtNzdlLTk5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzY0NzAgZm1hICAxICAgLTc3ZS0xNCAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NDcxIGZtYSAgMSAgIC03N2UtMTUgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0NzIgZm1hICAxICAgLTc3ZS0xNiAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NzMgZm1hICAxICAgLTc3ZS0xNyAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0NzQgZm1hICAxICAgLTc3ZS0xOCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjQ3NSBmbWEgIDEgICAtNzdlLTE5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDc2IGZtYSAgMSAgIC03N2UtOTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworZGRmbWEzNjQ4MCBmbWEgIDEgICAtMSAgICA3N2UtMTQgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY0ODEgZm1hICAxICAgLTEgICAgNzdlLTE1ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ4MiBmbWEgIDEgICAtMSAgICA3N2UtMTYgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ4MyBmbWEgIDEgICAtMSAgICA3N2UtMTcgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0ODQgZm1hICAxICAgLTEgICAgNzdlLTE4ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDg1IGZtYSAgMSAgIC0xICAgIDc3ZS0xOSAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDg2IGZtYSAgMSAgIC0xICAgIDc3ZS05OSAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzY0OTAgZm1hICAxICAtMTAgICAgNzdlLTE0ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ5MSBmbWEgIDEgIC0xMCAgICA3N2UtMTUgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTkyMworZGRmbWEzNjQ5MiBmbWEgIDEgIC0xMCAgICA3N2UtMTYgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY0OTMgZm1hICAxICAtMTAgICAgNzdlLTE3ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDk0IGZtYSAgMSAgLTEwICAgIDc3ZS0xOCAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDk1IGZtYSAgMSAgLTEwICAgIDc3ZS0xOSAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NDk2IGZtYSAgMSAgLTEwICAgIDc3ZS05OSAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzY1MDAgZm1hICAxICAgIDc3ZS0xNCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTIzCitkZGZtYTM2NTAxIGZtYSAgMSAgICA3N2UtMTUgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY1MDIgZm1hICAxICAgIDc3ZS0xNiAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY1MDMgZm1hICAxICAgIDc3ZS0xNyAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTA0IGZtYSAgMSAgICA3N2UtMTggICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUwNSBmbWEgIDEgICAgNzdlLTE5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUwNiBmbWEgIDEgICAgNzdlLTk5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkZGZtYTM2NTEwIGZtYSAgMSAgICA3N2UtMTQgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY1MTEgZm1hICAxICAgIDc3ZS0xNSAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5MjMKK2RkZm1hMzY1MTIgZm1hICAxICAgIDc3ZS0xNiAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTEzIGZtYSAgMSAgICA3N2UtMTcgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUxNCBmbWEgIDEgICAgNzdlLTE4ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUxNSBmbWEgIDEgICAgNzdlLTE5ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUxNiBmbWEgIDEgICAgNzdlLTk5ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBhbmQgYSBjb3VwbGUgbW9yZSB3aXRoIGxvbmdlciBSSFMKK2RkZm1hMzY1MjAgZm1hICAxICAgIDEgICAtNzc3N2UtMTYgICAgICAtPiAgMC45OTk5OTk5OTk5OTkyMjIzCitkZGZtYTM2NTIxIGZtYSAgMSAgICAxICAgLTc3NzdlLTE3ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIyMiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1MjIgZm1hICAxICAgIDEgICAtNzc3N2UtMTggICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTIyIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjUyMyBmbWEgIDEgICAgMSAgIC03Nzc3ZS0xOSAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTI0IGZtYSAgMSAgICAxICAgLTc3NzdlLTIwICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1MjUgZm1hICAxICAgIDEgICAtNzc3N2UtMjEgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTI2IGZtYSAgMSAgICAxICAgLTc3NzdlLTIyICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCisKKy0tIGFuZCBzb21lIG1vcmUgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZGRmbWEzNjU0MCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JworZGRmbWEzNjU0MSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NDIgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTQzIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU0NCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NDUgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTQ2IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU0NyBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NDggZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTQ5IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU1MCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NTEgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTUyIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU1MyBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NTQgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTU1IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU1NiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJworZGRmbWEzNjU1NyBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NTggZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTU5IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitkZGZtYTM2NTYwIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCitkZGZtYTM2NTYxIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU2MiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NjMgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTY0IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU2NSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NjYgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTY3IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU2OCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NjkgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTcwIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU3MSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NzIgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTczIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU3NCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NzUgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM2NTc2IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitkZGZtYTM2NTc3IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNjU3OCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzY1NzkgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkZGZtYTM3NTQwIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU0MSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NDIgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZGZtYTM3NTUwIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCitkZGZtYTM3NTUxIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU1MiBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NTMgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTU0IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU1NSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NTYgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTU3IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU1OCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NTkgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTYwIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU2MSBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NjIgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTYzIGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU2NCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NjUgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTY2IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitkZGZtYTM3NTY3IGZtYSAgMSAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzU2OCBmbWEgIDEgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1NjkgZm1hICAxICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKworLS0gdmVyaWZ5IGEgcXVlcnkKK3JvdW5kaW5nOiAgICAgZG93bgorZGRmbWEzNzY2MSBmbWEgIDEgIDFlLTM5OCA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NjYyIGZtYSAgMSAgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBSb3VuZGVkCitkZGZtYTM3NjYzIGZtYSAgMSAgMWUtMzg4IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc2NjQgZm1hICAxICAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IFJvdW5kZWQKKworLS0gbW9yZSB6ZXJvcywgZXRjLgorcm91bmRpbmc6IGhhbGZfZXZlbgorCitkZGZtYTM3NzAxIGZtYSAgMSAgNS4wMCAxLjAwRS0zIC0+IDUuMDAxMDAKK2RkZm1hMzc3MDIgZm1hICAxICAwMC4wMCAwLjAwMCAgLT4gMC4wMDAKK2RkZm1hMzc3MDMgZm1hICAxICAwMC4wMCAwRS0zICAgLT4gMC4wMDAKK2RkZm1hMzc3MDQgZm1hICAxICAwRS0zICAwMC4wMCAgLT4gMC4wMDAKKworZGRmbWEzNzcxMCBmbWEgIDEgIDBFKzMgIDAwLjAwICAtPiAwLjAwCitkZGZtYTM3NzExIGZtYSAgMSAgMEUrMyAgMDAuMCAgIC0+IDAuMAorZGRmbWEzNzcxMiBmbWEgIDEgIDBFKzMgIDAwLiAgICAtPiAwCitkZGZtYTM3NzEzIGZtYSAgMSAgMEUrMyAgMDAuRSsxIC0+IDBFKzEKK2RkZm1hMzc3MTQgZm1hICAxICAwRSszICAwMC5FKzIgLT4gMEUrMgorZGRmbWEzNzcxNSBmbWEgIDEgIDBFKzMgIDAwLkUrMyAtPiAwRSszCitkZGZtYTM3NzE2IGZtYSAgMSAgMEUrMyAgMDAuRSs0IC0+IDBFKzMKK2RkZm1hMzc3MTcgZm1hICAxICAwRSszICAwMC5FKzUgLT4gMEUrMworZGRmbWEzNzcxOCBmbWEgIDEgIDBFKzMgIC0wMC4wICAgLT4gMC4wCitkZGZtYTM3NzE5IGZtYSAgMSAgMEUrMyAgLTAwLiAgICAtPiAwCitkZGZtYTM3NzMxIGZtYSAgMSAgMEUrMyAgLTAwLkUrMSAtPiAwRSsxCisKK2RkZm1hMzc3MjAgZm1hICAxICAwMC4wMCAgMEUrMyAgLT4gMC4wMAorZGRmbWEzNzcyMSBmbWEgIDEgIDAwLjAgICAwRSszICAtPiAwLjAKK2RkZm1hMzc3MjIgZm1hICAxICAwMC4gICAgMEUrMyAgLT4gMAorZGRmbWEzNzcyMyBmbWEgIDEgIDAwLkUrMSAwRSszICAtPiAwRSsxCitkZGZtYTM3NzI0IGZtYSAgMSAgMDAuRSsyIDBFKzMgIC0+IDBFKzIKK2RkZm1hMzc3MjUgZm1hICAxICAwMC5FKzMgMEUrMyAgLT4gMEUrMworZGRmbWEzNzcyNiBmbWEgIDEgIDAwLkUrNCAwRSszICAtPiAwRSszCitkZGZtYTM3NzI3IGZtYSAgMSAgMDAuRSs1IDBFKzMgIC0+IDBFKzMKK2RkZm1hMzc3MjggZm1hICAxICAtMDAuMDAgMEUrMyAgLT4gMC4wMAorZGRmbWEzNzcyOSBmbWEgIDEgIC0wMC4wICAwRSszICAtPiAwLjAKK2RkZm1hMzc3MzAgZm1hICAxICAtMDAuICAgMEUrMyAgLT4gMAorCitkZGZtYTM3NzMyIGZtYSAgMSAgIDAgICAgIDAgICAgIC0+ICAwCitkZGZtYTM3NzMzIGZtYSAgMSAgIDAgICAgLTAgICAgIC0+ICAwCitkZGZtYTM3NzM0IGZtYSAgMSAgLTAgICAgIDAgICAgIC0+ICAwCitkZGZtYTM3NzM1IGZtYSAgMSAgLTAgICAgLTAgICAgIC0+IC0wICAgICAtLSBJRUVFIDg1NCBzcGVjaWFsIGNhc2UKKworZGRmbWEzNzczNiBmbWEgIDEgICAxICAgIC0xICAgICAtPiAgMAorZGRmbWEzNzczNyBmbWEgIDEgIC0xICAgIC0xICAgICAtPiAtMgorZGRmbWEzNzczOCBmbWEgIDEgICAxICAgICAxICAgICAtPiAgMgorZGRmbWEzNzczOSBmbWEgIDEgIC0xICAgICAxICAgICAtPiAgMAorCitkZGZtYTM3NzQxIGZtYSAgMSAgIDAgICAgLTEgICAgIC0+IC0xCitkZGZtYTM3NzQyIGZtYSAgMSAgLTAgICAgLTEgICAgIC0+IC0xCitkZGZtYTM3NzQzIGZtYSAgMSAgIDAgICAgIDEgICAgIC0+ICAxCitkZGZtYTM3NzQ0IGZtYSAgMSAgLTAgICAgIDEgICAgIC0+ICAxCitkZGZtYTM3NzQ1IGZtYSAgMSAgLTEgICAgIDAgICAgIC0+IC0xCitkZGZtYTM3NzQ2IGZtYSAgMSAgLTEgICAgLTAgICAgIC0+IC0xCitkZGZtYTM3NzQ3IGZtYSAgMSAgIDEgICAgIDAgICAgIC0+ICAxCitkZGZtYTM3NzQ4IGZtYSAgMSAgIDEgICAgLTAgICAgIC0+ICAxCisKK2RkZm1hMzc3NTEgZm1hICAxICAgMC4wICAtMSAgICAgLT4gLTEuMAorZGRmbWEzNzc1MiBmbWEgIDEgIC0wLjAgIC0xICAgICAtPiAtMS4wCitkZGZtYTM3NzUzIGZtYSAgMSAgIDAuMCAgIDEgICAgIC0+ICAxLjAKK2RkZm1hMzc3NTQgZm1hICAxICAtMC4wICAgMSAgICAgLT4gIDEuMAorZGRmbWEzNzc1NSBmbWEgIDEgIC0xLjAgICAwICAgICAtPiAtMS4wCitkZGZtYTM3NzU2IGZtYSAgMSAgLTEuMCAgLTAgICAgIC0+IC0xLjAKK2RkZm1hMzc3NTcgZm1hICAxICAgMS4wICAgMCAgICAgLT4gIDEuMAorZGRmbWEzNzc1OCBmbWEgIDEgICAxLjAgIC0wICAgICAtPiAgMS4wCisKK2RkZm1hMzc3NjEgZm1hICAxICAgMCAgICAtMS4wICAgLT4gLTEuMAorZGRmbWEzNzc2MiBmbWEgIDEgIC0wICAgIC0xLjAgICAtPiAtMS4wCitkZGZtYTM3NzYzIGZtYSAgMSAgIDAgICAgIDEuMCAgIC0+ICAxLjAKK2RkZm1hMzc3NjQgZm1hICAxICAtMCAgICAgMS4wICAgLT4gIDEuMAorZGRmbWEzNzc2NSBmbWEgIDEgIC0xICAgICAwLjAgICAtPiAtMS4wCitkZGZtYTM3NzY2IGZtYSAgMSAgLTEgICAgLTAuMCAgIC0+IC0xLjAKK2RkZm1hMzc3NjcgZm1hICAxICAgMSAgICAgMC4wICAgLT4gIDEuMAorZGRmbWEzNzc2OCBmbWEgIDEgICAxICAgIC0wLjAgICAtPiAgMS4wCisKK2RkZm1hMzc3NzEgZm1hICAxICAgMC4wICAtMS4wICAgLT4gLTEuMAorZGRmbWEzNzc3MiBmbWEgIDEgIC0wLjAgIC0xLjAgICAtPiAtMS4wCitkZGZtYTM3NzczIGZtYSAgMSAgIDAuMCAgIDEuMCAgIC0+ICAxLjAKK2RkZm1hMzc3NzQgZm1hICAxICAtMC4wICAgMS4wICAgLT4gIDEuMAorZGRmbWEzNzc3NSBmbWEgIDEgIC0xLjAgICAwLjAgICAtPiAtMS4wCitkZGZtYTM3Nzc2IGZtYSAgMSAgLTEuMCAgLTAuMCAgIC0+IC0xLjAKK2RkZm1hMzc3NzcgZm1hICAxICAgMS4wICAgMC4wICAgLT4gIDEuMAorZGRmbWEzNzc3OCBmbWEgIDEgICAxLjAgIC0wLjAgICAtPiAgMS4wCisKKy0tIFNwZWNpYWxzCitkZGZtYTM3NzgwIGZtYSAgMSAgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc4MSBmbWEgIDEgIC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3ODIgZm1hICAxICAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkZGZtYTM3NzgzIGZtYSAgMSAgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc4NCBmbWEgIDEgIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3ODUgZm1hICAxICAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkZGZtYTM3Nzg2IGZtYSAgMSAgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc4NyBmbWEgIDEgIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3ODggZm1hICAxICAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZGZtYTM3Nzg5IGZtYSAgMSAgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc5MCBmbWEgIDEgIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3OTEgZm1hICAxICAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZGZtYTM3NzkyIGZtYSAgMSAgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRmbWEzNzc5MyBmbWEgIDEgICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkZm1hMzc3OTQgZm1hICAxICAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworZGRmbWEzNzgwMCBmbWEgIDEgICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzgwMSBmbWEgIDEgICBJbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MDIgZm1hICAxICAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkZGZtYTM3ODAzIGZtYSAgMSAgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgwNCBmbWEgIDEgICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MDUgZm1hICAxICAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkZGZtYTM3ODA2IGZtYSAgMSAgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgwNyBmbWEgIDEgICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MDggZm1hICAxICAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkZGZtYTM3ODA5IGZtYSAgMSAgLUluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODEwIGZtYSAgMSAgLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgxMSBmbWEgIDEgIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MTIgZm1hICAxICAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZGZtYTM3ODEzIGZtYSAgMSAgIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRmbWEzNzgxNCBmbWEgIDEgICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RkZm1hMzc4MTUgZm1hICAxICAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkZm1hMzc4MjEgZm1hICAxICAgTmFOIC1JbmYgICAgLT4gIE5hTgorZGRmbWEzNzgyMiBmbWEgIDEgICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZGZtYTM3ODIzIGZtYSAgMSAgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RkZm1hMzc4MjQgZm1hICAxICAgTmFOIC0wICAgICAgLT4gIE5hTgorZGRmbWEzNzgyNSBmbWEgIDEgICBOYU4gIDAgICAgICAtPiAgTmFOCitkZGZtYTM3ODI2IGZtYSAgMSAgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RkZm1hMzc4MjcgZm1hICAxICAgTmFOICAxMDAwICAgLT4gIE5hTgorZGRmbWEzNzgyOCBmbWEgIDEgICBOYU4gIEluZiAgICAtPiAgTmFOCitkZGZtYTM3ODI5IGZtYSAgMSAgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkZm1hMzc4MzAgZm1hICAxICAtSW5mICBOYU4gICAgLT4gIE5hTgorZGRmbWEzNzgzMSBmbWEgIDEgIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZGZtYTM3ODMyIGZtYSAgMSAgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RkZm1hMzc4MzMgZm1hICAxICAtMCAgICBOYU4gICAgLT4gIE5hTgorZGRmbWEzNzgzNCBmbWEgIDEgICAwICAgIE5hTiAgICAtPiAgTmFOCitkZGZtYTM3ODM1IGZtYSAgMSAgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RkZm1hMzc4MzYgZm1hICAxICAgMTAwMCBOYU4gICAgLT4gIE5hTgorZGRmbWEzNzgzNyBmbWEgIDEgICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RkZm1hMzc4NDEgZm1hICAxICAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDIgZm1hICAxICAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDMgZm1hICAxICAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDQgZm1hICAxICAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDUgZm1hICAxICAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDYgZm1hICAxICAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDcgZm1hICAxICAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDggZm1hICAxICAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NDkgZm1hICAxICAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTAgZm1hICAxICAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTEgZm1hICAxICAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTIgZm1hICAxICAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTMgZm1hICAxICAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTQgZm1hICAxICAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTUgZm1hICAxICAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTYgZm1hICAxICAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTcgZm1hICAxICAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTggZm1hICAxICAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NTkgZm1hICAxICAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRmbWEzNzg2MSBmbWEgIDEgICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorZGRmbWEzNzg2MiBmbWEgIDEgICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZGRmbWEzNzg2MyBmbWEgIDEgICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZGRmbWEzNzg2NCBmbWEgIDEgICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorZGRmbWEzNzg2NSBmbWEgIDEgICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZGRmbWEzNzg2NiBmbWEgIDEgIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZGRmbWEzNzg2NyBmbWEgIDEgIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorZGRmbWEzNzg2OCBmbWEgIDEgICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZGRmbWEzNzg2OSBmbWEgIDEgICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2RkZm1hMzc4NzEgZm1hICAxICAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg3MiBmbWEgIDEgICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODczIGZtYSAgMSAgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NzQgZm1hICAxICAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg3NSBmbWEgIDEgICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODc2IGZtYSAgMSAgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4NzcgZm1hICAxICAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg3OCBmbWEgIDEgIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODc5IGZtYSAgMSAgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2RkZm1hMzc4ODAgZm1hICAxICAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzNzg4MSBmbWEgIDEgICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODgyIGZtYSAgMSAgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZGRmbWEzNzg4MyBmbWEgIDEgIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitkZGZtYTM3ODg0IGZtYSAgMSAgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZGRmbWEzNzg4NSBmbWEgIDEgICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEhlcmUgd2UgZXhwbG9yZSBuZWFyIHRoZSBib3VuZGFyeSBvZiByb3VuZGluZyBhIHN1Ym5vcm1hbCB0byBObWluCitkZGZtYTM3NTc1IGZtYSAgMSAgIDFFLTM4MyAtMUUtMzk4IC0+ICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorZGRmbWEzNzU3NiBmbWEgIDEgIC0xRS0zODMgKzFFLTM5OCAtPiAtOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBTdWJub3JtYWwKKworLS0gY2hlY2sgb3ZlcmZsb3cgZWRnZSBjYXNlCistLSAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkZm1hMzc5NzIgYXBwbHkgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRmbWEzNzk3MyBmbWEgIDEgICAgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5NzQgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTc1IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDFFKzM2OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTc2IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDlFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTc3IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDhFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTc4IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDdFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTc5IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDZFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTgwIGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDVFKzM2OCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTgxIGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDRFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5ODIgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgM0UrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk4MyBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAyRSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTg0IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDFFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKKworZGRmbWEzNzk4NSBhcHBseSAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRmbWEzNzk4NiBmbWEgIDEgICAgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0xICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTg3IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5ODggZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMUUrMzY5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTg5IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk5MCBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC04RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5OTEgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtN0UrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3OTkyIGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTZFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzk5MyBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC01RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5OTQgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNEUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5OTUgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtM0UrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5OTYgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMkUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc5OTcgZm1hICAxICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMUUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQW5kIGZvciByb3VuZCBkb3duIGZ1bGwgYW5kIHN1Ym5vcm1hbCByZXN1bHRzCityb3VuZGluZzogICAgIGRvd24KK2RkZm1hMzcxMTAwIGZtYSAgMSAgMWUrMiAtMWUtMzgzICAgIC0+IDk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDEgZm1hICAxICAxZSsxIC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDMgZm1hICAxICAgICsxIC0xZS0zODMgICAgLT4gMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTA0IGZtYSAgMSAgMWUtMSAtMWUtMzgzICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDUgZm1hICAxICAxZS0yIC0xZS0zODMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDYgZm1hICAxICAxZS0zIC0xZS0zODMgICAgLT4gMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTA3IGZtYSAgMSAgMWUtNCAtMWUtMzgzICAgIC0+IDAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDggZm1hICAxICAxZS01IC0xZS0zODMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZGRmbWEzNzExMDkgZm1hICAxICAxZS02IC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorCityb3VuZGluZzogICAgIGNlaWxpbmcKK2RkZm1hMzcxMTEwIGZtYSAgMSAgLTFlKzIgKzFlLTM4MyAgIC0+IC05OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTExIGZtYSAgMSAgLTFlKzEgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTExMyBmbWEgIDEgICAgIC0xICsxZS0zODMgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTE0IGZtYSAgMSAgLTFlLTEgKzFlLTM4MyAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTE1IGZtYSAgMSAgLTFlLTIgKzFlLTM4MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTExNiBmbWEgIDEgIC0xZS0zICsxZS0zODMgICAtPiAtMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTE3IGZtYSAgMSAgLTFlLTQgKzFlLTM4MyAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RkZm1hMzcxMTE4IGZtYSAgMSAgLTFlLTUgKzFlLTM4MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkZGZtYTM3MTExOSBmbWEgIDEgIC0xZS02ICsxZS0zODMgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorCistLSB0ZXN0cyBiYXNlZCBvbiBHdW5uYXIgRGVnbmJvbCdzIGVkZ2UgY2FzZQorcm91bmRpbmc6ICAgICBoYWxmX2V2ZW4KKworZGRmbWEzNzEzMDAgZm1hICAxICAxRTE2ICAtMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTAgZm1hICAxICAxRTE2ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTEgZm1hICAxICAxRTE2ICAtMC41MDEgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTIgZm1hICAxICAxRTE2ICAtMC41MDAxICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTMgZm1hICAxICAxRTE2ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTQgZm1hICAxICAxRTE2ICAtMC41MDAwMDEgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTUgZm1hICAxICAxRTE2ICAtMC41MDAwMDAxICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTYgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTcgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDEgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTggZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAxICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMTkgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjAgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDEgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjEgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAxICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjIgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjMgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjQgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjUgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjYgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjcgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjggZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMjkgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzAgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzEgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzIgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzMgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzQgZm1hICAxICAxRTE2ICAtMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzUgZm1hICAxICAxRTE2ICAtMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzYgZm1hICAxICAxRTE2ICAtMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzcgZm1hICAxICAxRTE2ICAtMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzggZm1hICAxICAxRTE2ICAtMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzMzkgZm1hICAxICAxRTE2ICAtMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCitkZGZtYTM3MTM0MCBmbWEgIDEgIDFFMTYgIC01MDAwMDAwLjAwMDAxMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM0MSBmbWEgIDEgIDFFMTYgIC01MDAwMDAwLjAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkZm1hMzcxMzQ5IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQgICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM1MCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNTEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5ICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzUyIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTkgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM1MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNTQgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5ICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzU1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTkgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM1NiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNTcgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5ICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzU4IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTkgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM1OSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNjAgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5ICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzYxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM2MiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNjMgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5ICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzY0IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OTkgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM2NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNjcgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzY4IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM2OSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNzAgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzcxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM3MiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNzMgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzc0IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM3NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNzYgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzc3IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM3OCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzNzkgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzgwIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM4MSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzODIgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzgzIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM4NCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzODUgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzg2IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM4NyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMSAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzODggZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzg5IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMSAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM5MCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMSAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzOTEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMSAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzkyIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMSAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM5MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMSAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzEzOTQgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMSAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzcxMzk1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMSAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3MTM5NiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTkgMC41MSAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSBNb3JlIEdEIGVkZ2UgY2FzZXMsIHdoZXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW5hZGp1c3RlZAorLS0gZXhwb25lbnRzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBhbmQgb25lIHNpZGUgaXMgMAorZGRmbWEzNzE0MjAgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NSAgICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDIxIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0MjIgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0MjMgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMyAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDI0IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0MjUgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0MjYgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNiAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDI3IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CitkZGZtYTM3MTQyOCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorZGRmbWEzNzE0MjkgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2RkZm1hMzcxNDMwIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZGRmbWEzNzE0MzEgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCitkZGZtYTM3MTQzMiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMiAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2RkZm1hMzcxNDMzIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworZGRmbWEzNzE0MzQgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CitkZGZtYTM3MTQzNSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2RkZm1hMzcxNDM2IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZGRmbWEzNzE0MzcgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CitkZGZtYTM3MTQzOCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2RkZm1hMzcxNDM5IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCByZXZlcnNlZCAwCitkZGZtYTM3MTQ0MCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ0MSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xICAwIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NDIgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ0MyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ0NCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS00ICAwIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NDUgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ0NiBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ0NyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS03ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CitkZGZtYTM3MTQ0OCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CitkZGZtYTM3MTQ0OSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CitkZGZtYTM3MTQ1MCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZGRmbWEzNzE0NTEgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2RkZm1hMzcxNDUyIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCitkZGZtYTM3MTQ1MyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMyAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworZGRmbWEzNzE0NTQgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2RkZm1hMzcxNDU1IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CitkZGZtYTM3MTQ1NiBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNiAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZGRmbWEzNzE0NTcgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2RkZm1hMzcxNDU4IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CitkZGZtYTM3MTQ1OSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCBFcyBvbiB0aGUgMAorZGRmbWEzNzE0NjAgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ2MSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDYyIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTIgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NjMgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMyAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ2NCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS00ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDY1IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTUgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NjYgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ2NyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS03ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDY4IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTggICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NjkgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ3MCBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDcxIGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTExICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NzIgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTIgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitkZGZtYTM3MTQ3MyBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2RkZm1hMzcxNDc0IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE0ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZGRmbWEzNzE0NzUgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTUgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CistLSBuZXh0IGZvdXIgZmxhZyBSb3VuZGVkIGJlY2F1c2UgdGhlIDAgZXh0ZW5kcyB0aGUgcmVzdWx0CitkZGZtYTM3MTQ3NiBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZGRmbWEzNzE0NzcgZm1hICAxICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RkZm1hMzcxNDc4IGZtYSAgMSAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkZGZtYTM3MTQ3OSBmbWEgIDEgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorCistLSBzdW0gb2YgdHdvIG9wcG9zaXRlLXNpZ24gb3BlcmFuZHMgaXMgZXhhY3RseSAwIGFuZCBmbG9vciA9PiAtMAorcm91bmRpbmc6ICAgIGhhbGZfdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkZm1hMzcxNTAwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTAxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTAyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTAzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGZtYTM3MTUxMSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGZtYTM3MTUxMiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkZm1hMzcxNTIwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTIxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTIyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTIzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGZtYTM3MTUzMSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGZtYTM3MTUzMiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkZm1hMzcxNTQwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTQxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTQyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTQzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGZtYTM3MTU1MSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGZtYTM3MTU1MiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICB1cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRmbWEzNzE1NjAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1NjEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1NjIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE1NjMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkZm1hMzcxNTcxIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIDAKK2RkZm1hMzcxNTcyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGRvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RkZm1hMzcxNTgwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTgxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTgyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RkZm1hMzcxNTgzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkZGZtYTM3MTU5MSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkZGZtYTM3MTU5MiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkZGZtYTM3MTYwMCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGZtYTM3MTYwMSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkZGZtYTM3MTYwMiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkZGZtYTM3MTYwMyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZGRmbWEzNzE2MTEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZGRmbWEzNzE2MTIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorCistLSBhbmQgdGhlIGV4dHJhLXNwZWNpYWwgdWdseSBjYXNlOyB1bnVzdWFsIG1pbnVzZXMgbWFya2VkIGJ5IC0tICoKK3JvdW5kaW5nOiAgICBmbG9vcgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZGRmbWEzNzE2MjAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZGRmbWEzNzE2MjEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZGRmbWEzNzE2MjIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZGRmbWEzNzE2MjMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RkZm1hMzcxNjMxIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIC0wICAgICAgICAgICAgICAgIC0tICoKK2RkZm1hMzcxNjMyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIC0wICAgICAgICAgICAgICAgIC0tICoKKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitkZGZtYTM3MTcwMSBmbWEgIDEgIDEzMEUtMiAgICAxMjBFLTIgICAgLT4gMi41MAorZGRmbWEzNzE3MDIgZm1hICAxICAxMzBFLTIgICAgMTJFLTEgICAgIC0+IDIuNTAKK2RkZm1hMzcxNzAzIGZtYSAgMSAgMTMwRS0yICAgIDFFMCAgICAgICAtPiAyLjMwCitkZGZtYTM3MTcwNCBmbWEgIDEgIDFFMiAgICAgICAxRTQgICAgICAgLT4gMS4wMUUrNAorZGRmbWEzNzE3MDUgZm1hICAxICAxMzBFLTIgICAtMTIwRS0yIC0+IDAuMTAKK2RkZm1hMzcxNzA2IGZtYSAgMSAgMTMwRS0yICAgLTEyRS0xICAtPiAwLjEwCitkZGZtYTM3MTcwNyBmbWEgIDEgIDEzMEUtMiAgIC0xRTAgICAgLT4gMC4zMAorZGRmbWEzNzE3MDggZm1hICAxICAxRTIgICAgICAtMUU0ICAgIC0+IC05LjlFKzMKKworLS0gR2FwcHkgY29lZmZpY2llbnRzOyBjaGVjayByZXNpZHVlIGhhbmRsaW5nIGV2ZW4gd2l0aCBmdWxsIGNvZWZmaWNpZW50IGdhcAorcm91bmRpbmc6IGhhbGZfZXZlbgorCitkZGZtYTM3NTAwMSBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgMSAgICAgIC0+IDEyMzQ1Njc4OTAxMjM0NTcKK2RkZm1hMzc1MDAyIGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiAwLjYgICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NyAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAwMyBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgMC4wNiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMDQgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTMgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDA1IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS00ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAwNiBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMDcgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTYgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDA4IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS03ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAwOSBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtOCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMTAgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTkgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDExIGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAxMiBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTEgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMTMgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTEyICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDE0IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAxNSBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTQgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMTYgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE1ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDE3IGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNiAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAxOCBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTcgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwMTkgZm1hICAxICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE4ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDIwIGZtYSAgMSAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xOSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTAyMSBmbWEgIDEgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMjAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorCistLSB3aWRlbmluZyBzZWNvbmQgYXJndW1lbnQgYXQgZ2FwCitkZGZtYTM3NTAzMCBmbWEgIDEgIDEyMzQ1Njc4IDEgICAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc5CitkZGZtYTM3NTAzMSBmbWEgIDEgIDEyMzQ1Njc4IDAuMSAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEKK2RkZm1hMzc1MDMyIGZtYSAgMSAgMTIzNDU2NzggMC4xMiAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIKK2RkZm1hMzc1MDMzIGZtYSAgMSAgMTIzNDU2NzggMC4xMjMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzCitkZGZtYTM3NTAzNCBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNCAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQKK2RkZm1hMzc1MDM1IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NSAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDUKK2RkZm1hMzc1MDM2IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTYgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2CitkZGZtYTM3NTAzNyBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2NyAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1NjcKK2RkZm1hMzc1MDM4IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3OCAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzgKK2RkZm1hMzc1MDM5IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODkgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA0MCBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1ICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNDEgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDQyIGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODUxICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA0MyBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDEgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNDQgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMSAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDQ1IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAxICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA0NiBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDEgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNDcgZm1hICAxICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMSAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDQ4IGZtYSAgMSAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA0OSBmbWEgIDEgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAxMjM0NTYKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkZm1hMzc1MDUwIGZtYSAgMSAgMTIzNDU2NzggMC4wMjM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA1MSBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNTIgZm1hICAxICAxMjM0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDUzIGZtYSAgMSAgMTIzNDU2NzggMC4wMDAwNTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA1NCBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNTUgZm1hICAxICAxMjM0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDU2IGZtYSAgMSAgMTIzNDU2NzggMC4wMDAwMDAwNzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA1NyBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNjAgZm1hICAxICAxMjM0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDYxIGZtYSAgMSAgMTIzNDU2NzggMC4wMDM0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA2MiBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNjMgZm1hICAxICAxMjM0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDY0IGZtYSAgMSAgMTIzNDU2NzggMC4wMDAwMDY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA2NSBmbWEgIDEgIDEyMzQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNjYgZm1hICAxICAxMjM0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDY3IGZtYSAgMSAgMTIzNDU2NzggMC4wMDAwMDAwMDUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCistLSBmYXItb3V0IHJlc2lkdWVzIChmdWxsIGNvZWZmaWNpZW50IGdhcCBpcyAxNisxNSBkaWdpdHMpCityb3VuZGluZzogdXAKK2RkZm1hMzc1MDcwIGZtYSAgMSAgMTIzNDU2NzggMUUtOCAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEKK2RkZm1hMzc1MDcxIGZtYSAgMSAgMTIzNDU2NzggMUUtOSAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA3MiBmbWEgIDEgIDEyMzQ1Njc4IDFFLTEwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNzMgZm1hICAxICAxMjM0NTY3OCAxRS0xMSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDc0IGZtYSAgMSAgMTIzNDU2NzggMUUtMTIgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA3NSBmbWEgIDEgIDEyMzQ1Njc4IDFFLTEzICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNzYgZm1hICAxICAxMjM0NTY3OCAxRS0xNCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDc3IGZtYSAgMSAgMTIzNDU2NzggMUUtMTUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA3OCBmbWEgIDEgIDEyMzQ1Njc4IDFFLTE2ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwNzkgZm1hICAxICAxMjM0NTY3OCAxRS0xNyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDgwIGZtYSAgMSAgMTIzNDU2NzggMUUtMTggICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA4MSBmbWEgIDEgIDEyMzQ1Njc4IDFFLTE5ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwODIgZm1hICAxICAxMjM0NTY3OCAxRS0yMCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDgzIGZtYSAgMSAgMTIzNDU2NzggMUUtMjUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA4NCBmbWEgIDEgIDEyMzQ1Njc4IDFFLTMwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwODUgZm1hICAxICAxMjM0NTY3OCAxRS0zMSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDg2IGZtYSAgMSAgMTIzNDU2NzggMUUtMzIgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkZGZtYTM3NTA4NyBmbWEgIDEgIDEyMzQ1Njc4IDFFLTMzICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZGRmbWEzNzUwODggZm1hICAxICAxMjM0NTY3OCAxRS0zNCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RkZm1hMzc1MDg5IGZtYSAgMSAgMTIzNDU2NzggMUUtMzUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIGRlc2N0cnVjdGl2ZSBzdWJ0cmFjdGlvbiAoZnJvbSByZW1haW5kZXIgdGVzdHMpCisKKy0tICsrKyBzb21lIG9mIHRoZXNlIHdpbGwgYmUgb2ZmLWJ5LW9uZSByZW1haW5kZXIgdnMgcmVtYWluZGVyTmVhcgorCitkZGZtYTQwMDAgIGZtYSAgLTEyMzQ1Njc4OTAxMjM0NTQgICAxLjAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMC43NjU0MzIxMDk4NzY1NDYKK2RkZm1hNDAwMSAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ0MyAgICAxLjAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAwLjY1NDMyMTA5ODc2NTU3CitkZGZtYTQwMDIgIGZtYSAgLTEyMzQ1Njc4OTAxMjMzMzIgICAgIDEuMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMC41NDMyMTA5ODc2NjY4CitkZGZtYTQwMDMgIGZtYSAgIC0zMDg2NDE5NzI1MzA4NjMgICA0LjAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU1ICAtPiAgMi42OTEzNTgwMjc0NjkxMzcKK2RkZm1hNDAwNCAgZm1hICAgLTMwODY0MTk3MjUzMDg2MyAgIDQuMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAzLjY5MTM1ODAyNzQ2OTEzNworZGRmbWE0MDA1ICBmbWEgICAtMjQ2OTEzNTc4MDI0Njk2ICAgICA0Ljk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDAuNjkxMzU3ODAyNDY5NgorZGRmbWE0MDA2ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxICAgIDQuOTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDMuNDY5MTM1NzgwMjQ2OTEKK2RkZm1hNDAwNyAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MSAgIDQuOTk5OTk5OTk5OTk5OTk5ICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAxLjI0NjkxMzU3ODAyNDY5MQorZGRmbWE0MDA4ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxICAgNS4wMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDAuNzUzMDg2NDIxOTc1MzA5CitkZGZtYTQwMDkgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTAgICAgNS4wMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMy41MzA4NjQyMTk3NTMxMAorZGRmbWE0MDEwICBmbWEgICAtMjQ2OTEzNTc4MDI0Njg2ICAgICA1LjAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDEuMzA4NjQyMTk3NTMxNAorZGRmbWE0MDExICBmbWEgIC0xMjM0NTY3ODkwMTIzNDU1ICAgMS4wMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIC0wLjIzNDU2Nzg5MDEyMzQ1NQorZGRmbWE0MDEyICBmbWEgIC0xMjM0NTY3ODkwMTIzNDQ0ICAgIDEuMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIC0wLjM0NTY3ODkwMTIzNDQ0CitkZGZtYTQwMTMgIGZtYSAgLTEyMzQ1Njc4OTAxMjMzMzMgICAgIDEuMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgLTAuNDU2Nzg5MDEyMzMzMworZGRmbWE0MDE0ICBmbWEgICAtMzA4NjQxOTcyNTMwODY0ICAgNC4wMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NSAgLT4gIC0xLjMwODY0MTk3MjUzMDg2NAorZGRmbWE0MDE1ICBmbWEgICAtMzA4NjQxOTcyNTMwODY0ICAgNC4wMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIC0wLjMwODY0MTk3MjUzMDg2NAorZGRmbWE0MDE2ICBmbWEgICAtMjQ2OTEzNTc4MDI0Njk2ICAgICA0Ljk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIDAuNjkxMzU3ODAyNDY5NgorZGRmbWE0MDE3ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkyICAgIDQuOTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIC0xLjUzMDg2NDIxOTc1MzA4CitkZGZtYTQwMTggIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEgICA0Ljk5OTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMS4yNDY5MTM1NzgwMjQ2OTEKK2RkZm1hNDAxOSAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MSAgIDUuMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTYgIC0+ICAwLjc1MzA4NjQyMTk3NTMwOQorZGRmbWE0MDIwICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxICAgIDUuMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gIC0xLjQ2OTEzNTc4MDI0NjkxCitkZGZtYTQwMjEgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2ODYgICAgIDUuMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2ICAtPiAgMS4zMDg2NDIxOTc1MzE0CisKKworLS0gTnVsbCB0ZXN0cworZGRmbWEzOTk5MCBmbWEgIDEgIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRmbWEzOTk5MSBmbWEgIDEgICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRJbnZlcnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRJbnZlcnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDE5ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZEludmVydC5kZWNUZXN0CkBAIC0wLDAgKzEsMjAyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkSW52ZXJ0LmRlY1Rlc3QgLS0gZGlnaXR3aXNlIGxvZ2ljYWwgSU5WRVJUIGZvciBkZWNEb3VibGVzICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpCitkZGludjAwMSBpbnZlcnQgICAgICAgICAgICAgMCAtPiAxMTExMTExMTExMTExMTExCitkZGludjAwMiBpbnZlcnQgICAgICAgICAgICAgMSAtPiAxMTExMTExMTExMTExMTEwCitkZGludjAwMyBpbnZlcnQgICAgICAgICAgICAxMCAtPiAxMTExMTExMTExMTExMTAxCitkZGludjAwNCBpbnZlcnQgICAgIDExMTExMTExMSAtPiAxMTExMTExMDAwMDAwMDAwCitkZGludjAwNSBpbnZlcnQgICAgIDAwMDAwMDAwMCAtPiAxMTExMTExMTExMTExMTExCistLSBhbmQgYXQgbXNkIGFuZCBtc2QtMQorZGRpbnYwMDcgaW52ZXJ0IDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMTExMTExMTExMTExMTExCitkZGludjAwOCBpbnZlcnQgMTAwMDAwMDAwMDAwMDAwMCAtPiAgICAxMTExMTExMTExMTExMTEKK2RkaW52MDA5IGludmVydCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTExMTExMTExMTExMTExMQorZGRpbnYwMTAgaW52ZXJ0IDAxMDAwMDAwMDAwMDAwMDAgLT4gICAxMDExMTExMTExMTExMTExCitkZGludjAxMSBpbnZlcnQgMDExMTExMTExMTExMTExMSAtPiAgIDEwMDAwMDAwMDAwMDAwMDAKK2RkaW52MDEyIGludmVydCAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgICAgMAorZGRpbnYwMTMgaW52ZXJ0IDAwMTExMTExMTExMTExMTEgLT4gICAxMTAwMDAwMDAwMDAwMDAwCitkZGludjAxNCBpbnZlcnQgMDExMTExMTExMTExMTExMSAtPiAgIDEwMDAwMDAwMDAwMDAwMDAKKworLS0gVmFyaW91cyBsZW5ndGhzCistLSAgICAgICAgICAgICAxMjM0NTY3ODkgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZGludjAyMSBpbnZlcnQgMTExMTExMTExICAgICAtPiAgMTExMTExMTAwMDAwMDAwMAorZGRpbnYwMjIgaW52ZXJ0IDExMTExMTExMTExMSAgLT4gIDExMTEwMDAwMDAwMDAwMDAKK2RkaW52MDIzIGludmVydCAgMTExMTExMTEgICAgIC0+ICAxMTExMTExMTAwMDAwMDAwCitkZGludjAyNSBpbnZlcnQgICAxMTExMTExICAgICAtPiAgMTExMTExMTExMDAwMDAwMAorZGRpbnYwMjYgaW52ZXJ0ICAgIDExMTExMSAgICAgLT4gIDExMTExMTExMTEwMDAwMDAKK2RkaW52MDI3IGludmVydCAgICAgMTExMTEgICAgIC0+ICAxMTExMTExMTExMTAwMDAwCitkZGludjAyOCBpbnZlcnQgICAgICAxMTExICAgICAtPiAgMTExMTExMTExMTExMDAwMAorZGRpbnYwMjkgaW52ZXJ0ICAgICAgIDExMSAgICAgLT4gIDExMTExMTExMTExMTEwMDAKK2RkaW52MDMxIGludmVydCAgICAgICAgMTEgICAgIC0+ICAxMTExMTExMTExMTExMTAwCitkZGludjAzMiBpbnZlcnQgICAgICAgICAxICAgICAtPiAgMTExMTExMTExMTExMTExMAorZGRpbnYwMzMgaW52ZXJ0IDExMTExMTExMTExMSAgLT4gIDExMTEwMDAwMDAwMDAwMDAKK2RkaW52MDM0IGludmVydCAxMTExMTExMTExMSAgIC0+ICAxMTExMTAwMDAwMDAwMDAwCitkZGludjAzNSBpbnZlcnQgMTExMTExMTExMSAgICAtPiAgMTExMTExMDAwMDAwMDAwMAorZGRpbnYwMzYgaW52ZXJ0IDExMTExMTExMSAgICAgLT4gIDExMTExMTEwMDAwMDAwMDAKKworZGRpbnYwNDAgaW52ZXJ0IDAxMTExMTExMSAgIC0+ICAxMTExMTExMTAwMDAwMDAwCitkZGludjA0MSBpbnZlcnQgMTAxMTExMTExICAgLT4gIDExMTExMTEwMTAwMDAwMDAKK2RkaW52MDQyIGludmVydCAxMTAxMTExMTEgICAtPiAgMTExMTExMTAwMTAwMDAwMAorZGRpbnYwNDMgaW52ZXJ0IDExMTAxMTExMSAgIC0+ICAxMTExMTExMDAwMTAwMDAwCitkZGludjA0NCBpbnZlcnQgMTExMTAxMTExICAgLT4gIDExMTExMTEwMDAwMTAwMDAKK2RkaW52MDQ1IGludmVydCAxMTExMTAxMTEgICAtPiAgMTExMTExMTAwMDAwMTAwMAorZGRpbnYwNDYgaW52ZXJ0IDExMTExMTAxMSAgIC0+ICAxMTExMTExMDAwMDAwMTAwCitkZGludjA0NyBpbnZlcnQgMTExMTExMTAxICAgLT4gIDExMTExMTEwMDAwMDAwMTAKK2RkaW52MDQ4IGludmVydCAxMTExMTExMTAgICAtPiAgMTExMTExMTAwMDAwMDAwMQorZGRpbnYwNDkgaW52ZXJ0IDAxMTExMTAxMSAgIC0+ICAxMTExMTExMTAwMDAwMTAwCitkZGludjA1MCBpbnZlcnQgMTAxMTExMTAxICAgLT4gIDExMTExMTEwMTAwMDAwMTAKK2RkaW52MDUxIGludmVydCAxMTAxMTExMTAgICAtPiAgMTExMTExMTAwMTAwMDAwMQorZGRpbnYwNTIgaW52ZXJ0IDExMTAxMTEwMSAgIC0+ICAxMTExMTExMDAwMTAwMDEwCitkZGludjA1MyBpbnZlcnQgMTExMTAxMDExICAgLT4gIDExMTExMTEwMDAwMTAxMDAKK2RkaW52MDU0IGludmVydCAxMTExMTAxMTEgICAtPiAgMTExMTExMTAwMDAwMTAwMAorZGRpbnYwNTUgaW52ZXJ0IDExMTEwMTAxMSAgIC0+ICAxMTExMTExMDAwMDEwMTAwCitkZGludjA1NiBpbnZlcnQgMTExMDExMTAxICAgLT4gIDExMTExMTEwMDAxMDAwMTAKK2RkaW52MDU3IGludmVydCAxMTAxMTExMTAgICAtPiAgMTExMTExMTAwMTAwMDAwMQorZGRpbnYwNTggaW52ZXJ0IDEwMTExMTEwMSAgIC0+ICAxMTExMTExMDEwMDAwMDEwCitkZGludjA1OSBpbnZlcnQgMDExMTExMDExICAgLT4gIDExMTExMTExMDAwMDAxMDAKKworZGRpbnYwODAgaW52ZXJ0IDEwMDAwMDAwMTExMTExMTEgICAtPiAgIDExMTExMTEwMDAwMDAwMAorZGRpbnYwODEgaW52ZXJ0IDAxMDAwMDAxMDExMTExMTEgICAtPiAgMTAxMTExMTAxMDAwMDAwMAorZGRpbnYwODIgaW52ZXJ0IDAwMTAwMDAxMTAxMTExMTEgICAtPiAgMTEwMTExMTAwMTAwMDAwMAorZGRpbnYwODMgaW52ZXJ0IDAwMDEwMDAxMTEwMTExMTEgICAtPiAgMTExMDExMTAwMDEwMDAwMAorZGRpbnYwODQgaW52ZXJ0IDAwMDAxMDAxMTExMDExMTEgICAtPiAgMTExMTAxMTAwMDAxMDAwMAorZGRpbnYwODUgaW52ZXJ0IDAwMDAwMTAxMTExMTAxMTEgICAtPiAgMTExMTEwMTAwMDAwMTAwMAorZGRpbnYwODYgaW52ZXJ0IDAwMDAwMDExMTExMTEwMTEgICAtPiAgMTExMTExMDAwMDAwMDEwMAorZGRpbnYwODcgaW52ZXJ0IDAwMDAwMTAxMTExMTExMDEgICAtPiAgMTExMTEwMTAwMDAwMDAxMAorZGRpbnYwODggaW52ZXJ0IDAwMDAxMDAxMTExMTExMTAgICAtPiAgMTExMTAxMTAwMDAwMDAwMQorZGRpbnYwODkgaW52ZXJ0IDAwMDEwMDAwMTExMTEwMTEgICAtPiAgMTExMDExMTEwMDAwMDEwMAorZGRpbnYwOTAgaW52ZXJ0IDAwMTAwMDAxMDExMTExMDEgICAtPiAgMTEwMTExMTAxMDAwMDAxMAorZGRpbnYwOTEgaW52ZXJ0IDAxMDAwMDAxMTAxMTExMTAgICAtPiAgMTAxMTExMTAwMTAwMDAwMQorZGRpbnYwOTIgaW52ZXJ0IDEwMDAwMDAxMTEwMTExMDEgICAtPiAgIDExMTExMTAwMDEwMDAxMAorZGRpbnYwOTMgaW52ZXJ0IDAxMDAwMDAxMTExMDEwMTEgICAtPiAgMTAxMTExMTAwMDAxMDEwMAorZGRpbnYwOTQgaW52ZXJ0IDAwMTAwMDAxMTExMTAxMTEgICAtPiAgMTEwMTExMTAwMDAwMTAwMAorZGRpbnYwOTUgaW52ZXJ0IDAwMDEwMDAxMTExMDEwMTEgICAtPiAgMTExMDExMTAwMDAxMDEwMAorZGRpbnYwOTYgaW52ZXJ0IDAwMDAxMDAxMTEwMTExMDEgICAtPiAgMTExMTAxMTAwMDEwMDAxMAorZGRpbnYwOTcgaW52ZXJ0IDAwMDAwMTAxMTAxMTExMTAgICAtPiAgMTExMTEwMTAwMTAwMDAwMQorZGRpbnYwOTggaW52ZXJ0IDAwMDAwMDExMDExMTExMDEgICAtPiAgMTExMTExMDAxMDAwMDAxMAorZGRpbnYwOTkgaW52ZXJ0IDAwMDAwMTAwMTExMTEwMTEgICAtPiAgMTExMTEwMTEwMDAwMDEwMAorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK2RkaW52MjIwIGludmVydCAxMTExMTExMTIgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIyMSBpbnZlcnQgMzMzMzMzMzMzICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMjIgaW52ZXJ0IDU1NTU1NTU1NSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjIzIGludmVydCA3Nzc3Nzc3NzcgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIyNCBpbnZlcnQgOTk5OTk5OTk5ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMjUgaW52ZXJ0IDIyMjIyMjIyMiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjI2IGludmVydCA0NDQ0NDQ0NDQgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIyNyBpbnZlcnQgNjY2NjY2NjY2ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMjggaW52ZXJ0IDg4ODg4ODg4OCAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjI5IGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjIzMCBpbnZlcnQgOTk5OTk5OTk5ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyMzEgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjMyIGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCitkZGludjI0MCBpbnZlcnQgIDU2NzQ2ODY4OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNDEgaW52ZXJ0ICA1NjczNjc2ODkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjQyIGludmVydCAtNjMxOTE3NzcyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI0MyBpbnZlcnQgLTc1NjI1MzI1NyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNDQgaW52ZXJ0ICA4MzU1OTAxNDkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECitkZGludjI1MCBpbnZlcnQgIDIwMDAwMDAwMDAwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjUxIGludmVydCAgMzAwMDAwMDAwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNTIgaW52ZXJ0ICA0MDAwMDAwMDAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI1MyBpbnZlcnQgIDUwMDAwMDAwMDAwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjU0IGludmVydCAgNjAwMDAwMDAwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNTUgaW52ZXJ0ICA3MDAwMDAwMDAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI1NiBpbnZlcnQgIDgwMDAwMDAwMDAwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjU3IGludmVydCAgOTAwMDAwMDAwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZGRpbnYyNzAgaW52ZXJ0ICAwMjAwMDAxMDAwMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI3MSBpbnZlcnQgIDAzMDAwMDAxMDAwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjcyIGludmVydCAgMDQwMDAwMDAxMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNzMgaW52ZXJ0ICAwNTAwMDAwMDAxMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI3NCBpbnZlcnQgIDE2MDAwMDAwMDAxMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjc1IGludmVydCAgMTcwMDAwMDAwMDAxMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyNzYgaW52ZXJ0ICAxODAwMDAwMDAwMDAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI3NyBpbnZlcnQgIDE5MDAwMDAwMDAwMDAxMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTFNECitkZGludjI4MCBpbnZlcnQgIDAwMTAwMDAwMDAwMDAwMDIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjgxIGludmVydCAgMDAwMTAwMDAwMDAwMDAwMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyODIgaW52ZXJ0ICAwMDAwMTAwMDAwMDAwMDA0ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI4MyBpbnZlcnQgIDAwMDAwMTAwMDAwMDAwMDUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjg0IGludmVydCAgMTAwMDAwMTAwMDAwMDAwNiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyODUgaW52ZXJ0ICAxMDAwMDAwMTAwMDAwMDA3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI4NiBpbnZlcnQgIDEwMDAwMDAwMTAwMDAwMDggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjg3IGludmVydCAgMTAwMDAwMDAwMTAwMDAwOSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNaWRkaWUKK2RkaW52Mjg4IGludmVydCAgMDAxMDAwMDAyMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyODkgaW52ZXJ0ICAwMDAxMDAwMDMwMDAwMDAxICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI5MCBpbnZlcnQgIDAwMDAxMDAwNDAwMDAwMTAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MjkxIGludmVydCAgMDAwMDAxMDA1MDAwMDEwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyOTIgaW52ZXJ0ICAxMDAwMDAxMDYwMDAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjI5MyBpbnZlcnQgIDEwMDAwMDAxNzAwMTAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjk0IGludmVydCAgMTAwMDAwMDA4MDEwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYyOTUgaW52ZXJ0ICAxMDAwMDAwMDkxMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWduCitkZGludjI5NiBpbnZlcnQgLTEwMDAwMDAwMDEwMDAwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Mjk5IGludmVydCAgMTAwMDAwMDAwMTAwMDAwMCAgLT4gIDExMTExMTExMDExMTExMQorCisKKy0tIE5tYXgsIE5taW4sIE50aW55LWxpa2UKK2RkaW52MzQxIGludmVydCAgOS45OTk5OTk5OUUrMjk5ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM0MiBpbnZlcnQgIDFFLTI5OSAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYzNDMgaW52ZXJ0ICAxLjAwMDAwMDAwRS0yOTkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzQ0IGludmVydCAgMUUtMjA3ICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM0NSBpbnZlcnQgIC0xRS0yMDcgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYzNDYgaW52ZXJ0ICAtMS4wMDAwMDAwMEUtMjk5ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzQ3IGludmVydCAgLTFFLTI5OSAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM0OCBpbnZlcnQgIC05Ljk5OTk5OTk5RSsyOTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK2RkaW52MzYxIGludmVydCAgMS4wICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM2MiBpbnZlcnQgIDFFKzEgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYzNjMgaW52ZXJ0ICAwLjAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52MzY0IGludmVydCAgMEUrMSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZGludjM2NSBpbnZlcnQgIDkuOSAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnYzNjYgaW52ZXJ0ICA5RSsxICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorZGRpbnY3ODggaW52ZXJ0IC1JbmYgICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkaW52Nzk0IGludmVydCAgSW5mICAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZGludjgyMSBpbnZlcnQgIE5hTiAgICAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnY4NDEgaW52ZXJ0ICBzTmFOICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkaW52ODYxIGludmVydCAgTmFOMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODYyIGludmVydCArTmFOMiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODYzIGludmVydCAgTmFOMyAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODY0IGludmVydCAgTmFONCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODY1IGludmVydCAgTmFONSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODcxIGludmVydCAgc05hTjExICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODcyIGludmVydCAgc05hTjEyICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODczIGludmVydCAgc05hTjEzICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODc0IGludmVydCAgc05hTjE0ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODc1IGludmVydCAgc05hTjE1ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODc2IGludmVydCAgTmFOMTYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODgxIGludmVydCArTmFOMjUgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODgyIGludmVydCAtTmFOMjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkaW52ODgzIGludmVydCAtc05hTjI3ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRMb2dCLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTG9nQi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNzI4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTG9nQi5kZWNUZXN0CkBAIC0wLDAgKzEsMTU5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTG9nQi5kZWNUZXN0IC0tIGludGVncmFsIDc1NHIgYWRqdXN0ZWQgZXhwb25lbnQsIGZvciBkZWNEb3VibGVzICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDUsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIGJhc2ljcworZGRsb2diMDAwIGxvZ2IgIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworZGRsb2diMDAxIGxvZ2IgIDFFLTM5OCAgICAgICAgICAgIC0+IC0zOTgKK2RkbG9nYjAwMiBsb2diICAxRS0zODMgICAgICAgICAgICAtPiAtMzgzCitkZGxvZ2IwMDMgbG9nYiAgMC4wMDEgICAgICAgICAgICAgLT4gLTMKK2RkbG9nYjAwNCBsb2diICAwLjAzICAgICAgICAgICAgICAtPiAtMgorZGRsb2diMDA1IGxvZ2IgIDEgICAgICAgICAgICAgICAgIC0+ICAwCitkZGxvZ2IwMDYgbG9nYiAgMiAgICAgICAgICAgICAgICAgLT4gIDAKK2RkbG9nYjAwNyBsb2diICAyLjUgICAgICAgICAgICAgICAtPiAgMAorZGRsb2diMDA4IGxvZ2IgIDIuNTAwICAgICAgICAgICAgIC0+ICAwCitkZGxvZ2IwMDkgbG9nYiAgMTAgICAgICAgICAgICAgICAgLT4gIDEKK2RkbG9nYjAxMCBsb2diICA3MCAgICAgICAgICAgICAgICAtPiAgMQorZGRsb2diMDExIGxvZ2IgIDEwMCAgICAgICAgICAgICAgIC0+ICAyCitkZGxvZ2IwMTIgbG9nYiAgMzMzICAgICAgICAgICAgICAgLT4gIDIKK2RkbG9nYjAxMyBsb2diICA5RSszODQgICAgICAgICAgICAtPiAgMzg0CitkZGxvZ2IwMTQgbG9nYiArSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CisKKy0tIG5lZ2F0aXZlcyBhcHBlYXIgdG8gYmUgdHJlYXRlZCBhcyBwb3NpdGl2ZXMKK2RkbG9nYjAyMSBsb2diIC0wICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjAyMiBsb2diIC0xRS0zOTggICAgICAgICAgICAtPiAtMzk4CitkZGxvZ2IwMjMgbG9nYiAtOUUtMzgzICAgICAgICAgICAgLT4gLTM4MworZGRsb2diMDI0IGxvZ2IgLTAuMDAxICAgICAgICAgICAgIC0+IC0zCitkZGxvZ2IwMjUgbG9nYiAtMSAgICAgICAgICAgICAgICAgLT4gIDAKK2RkbG9nYjAyNiBsb2diIC0yICAgICAgICAgICAgICAgICAtPiAgMAorZGRsb2diMDI3IGxvZ2IgLTEwICAgICAgICAgICAgICAgIC0+ICAxCitkZGxvZ2IwMjggbG9nYiAtNzAgICAgICAgICAgICAgICAgLT4gIDEKK2RkbG9nYjAyOSBsb2diIC0xMDAgICAgICAgICAgICAgICAtPiAgMgorZGRsb2diMDMwIGxvZ2IgLTlFKzM4NCAgICAgICAgICAgIC0+ICAzODQKK2RkbG9nYjAzMSBsb2diIC1JbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gemVyb3MKK2RkbG9nYjExMSBsb2diICAgICAgICAgIDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjExMiBsb2diICAgICAgICAgLTAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjExMyBsb2diICAgICAgIDBFKzQgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjExNCBsb2diICAgICAgLTBFKzQgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjExNSBsb2diICAgICAwLjAwMDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjExNiBsb2diICAgIC0wLjAwMDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjExNyBsb2diICAgICAgMEUtMTQxICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RkbG9nYjExOCBsb2diICAgICAtMEUtMTQxICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RkbG9nYjEyMSBsb2diICAgMjY4MjY4MjY4ICAgICAgICAtPiA4CitkZGxvZ2IxMjIgbG9nYiAgLTI2ODI2ODI2OCAgICAgICAgLT4gOAorZGRsb2diMTIzIGxvZ2IgICAxMzQxMzQxMzQgICAgICAgIC0+IDgKK2RkbG9nYjEyNCBsb2diICAtMTM0MTM0MTM0ICAgICAgICAtPiA4CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZGxvZ2IxMzEgbG9nYiAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+ICAzODQKK2RkbG9nYjEzMiBsb2diICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gLTM4MworZGRsb2diMTMzIGxvZ2IgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAtMzgzCitkZGxvZ2IxMzQgbG9nYiAgMUUtMzk4ICAgICAgICAgICAgICAgICAgIC0+IC0zOTgKKworZGRsb2diMTM1IGxvZ2IgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAtMzk4CitkZGxvZ2IxMzYgbG9nYiAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IC0zODMKK2RkbG9nYjEzNyBsb2diICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gLTM4MworZGRsb2diMTM4IGxvZ2IgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAgMzg0CisKKy0tIG9uZXMKK2RkbG9nYjAwNjEgbG9nYiAgMSAgICAgICAgICAgICAgICAgLT4gICAwCitkZGxvZ2IwMDYyIGxvZ2IgIDEuMCAgICAgICAgICAgICAgIC0+ICAgMAorZGRsb2diMDA2MyBsb2diICAxLjAwMDAwMDAwMDAwMDAwMCAtPiAgIDAKKworLS0gbm90YWJsZSBjYXNlcyAtLSBleGFjdCBwb3dlcnMgb2YgMTAKK2RkbG9nYjExMDAgbG9nYiAxICAgICAgICAgICAgIC0+IDAKK2RkbG9nYjExMDEgbG9nYiAxMCAgICAgICAgICAgIC0+IDEKK2RkbG9nYjExMDIgbG9nYiAxMDAgICAgICAgICAgIC0+IDIKK2RkbG9nYjExMDMgbG9nYiAxMDAwICAgICAgICAgIC0+IDMKK2RkbG9nYjExMDQgbG9nYiAxMDAwMCAgICAgICAgIC0+IDQKK2RkbG9nYjExMDUgbG9nYiAxMDAwMDAgICAgICAgIC0+IDUKK2RkbG9nYjExMDYgbG9nYiAxMDAwMDAwICAgICAgIC0+IDYKK2RkbG9nYjExMDcgbG9nYiAxMDAwMDAwMCAgICAgIC0+IDcKK2RkbG9nYjExMDggbG9nYiAxMDAwMDAwMDAgICAgIC0+IDgKK2RkbG9nYjExMDkgbG9nYiAxMDAwMDAwMDAwICAgIC0+IDkKK2RkbG9nYjExMTAgbG9nYiAxMDAwMDAwMDAwMCAgIC0+IDEwCitkZGxvZ2IxMTExIGxvZ2IgMTAwMDAwMDAwMDAwICAtPiAxMQorZGRsb2diMTExMiBsb2diIDEwMDAwMDAwMDAwMDAgLT4gMTIKK2RkbG9nYjExMTMgbG9nYiAwLjAwMDAwMDAwMDAxIC0+IC0xMQorZGRsb2diMTExNCBsb2diIDAuMDAwMDAwMDAwMSAtPiAtMTAKK2RkbG9nYjExMTUgbG9nYiAwLjAwMDAwMDAwMSAtPiAtOQorZGRsb2diMTExNiBsb2diIDAuMDAwMDAwMDEgLT4gLTgKK2RkbG9nYjExMTcgbG9nYiAwLjAwMDAwMDEgLT4gLTcKK2RkbG9nYjExMTggbG9nYiAwLjAwMDAwMSAtPiAtNgorZGRsb2diMTExOSBsb2diIDAuMDAwMDEgLT4gLTUKK2RkbG9nYjExMjAgbG9nYiAwLjAwMDEgLT4gLTQKK2RkbG9nYjExMjEgbG9nYiAwLjAwMSAtPiAtMworZGRsb2diMTEyMiBsb2diIDAuMDEgLT4gLTIKK2RkbG9nYjExMjMgbG9nYiAwLjEgLT4gLTEKK2RkbG9nYjExMjQgbG9nYiAxRS05OSAgLT4gLTk5CitkZGxvZ2IxMTI1IGxvZ2IgMUUtMTAwIC0+IC0xMDAKK2RkbG9nYjExMjcgbG9nYiAxRS0yOTkgLT4gLTI5OQorZGRsb2diMTEyNiBsb2diIDFFLTM4MyAtPiAtMzgzCisKKy0tIHN1Z2dlc3Rpb25zIGZyb20gSWxhbiBOZWhhbWEKK2RkbG9nYjE0MDAgbG9nYiAxMEUtMyAgICAtPiAtMgorZGRsb2diMTQwMSBsb2diIDEwRS0yICAgIC0+IC0xCitkZGxvZ2IxNDAyIGxvZ2IgMTAwRS0yICAgLT4gIDAKK2RkbG9nYjE0MDMgbG9nYiAxMDAwRS0yICAtPiAgMQorZGRsb2diMTQwNCBsb2diIDEwMDAwRS0yIC0+ICAyCitkZGxvZ2IxNDA1IGxvZ2IgMTBFLTEgICAgLT4gIDAKK2RkbG9nYjE0MDYgbG9nYiAxMDBFLTEgICAtPiAgMQorZGRsb2diMTQwNyBsb2diIDEwMDBFLTEgIC0+ICAyCitkZGxvZ2IxNDA4IGxvZ2IgMTAwMDBFLTEgLT4gIDMKK2RkbG9nYjE0MDkgbG9nYiAxMEUwICAgICAtPiAgMQorZGRsb2diMTQxMCBsb2diIDEwMEUwICAgIC0+ICAyCitkZGxvZ2IxNDExIGxvZ2IgMTAwMEUwICAgLT4gIDMKK2RkbG9nYjE0MTIgbG9nYiAxMDAwMEUwICAtPiAgNAorZGRsb2diMTQxMyBsb2diIDEwRTEgICAgIC0+ICAyCitkZGxvZ2IxNDE0IGxvZ2IgMTAwRTEgICAgLT4gIDMKK2RkbG9nYjE0MTUgbG9nYiAxMDAwRTEgICAtPiAgNAorZGRsb2diMTQxNiBsb2diIDEwMDAwRTEgIC0+ICA1CitkZGxvZ2IxNDE3IGxvZ2IgMTBFMiAgICAgLT4gIDMKK2RkbG9nYjE0MTggbG9nYiAxMDBFMiAgICAtPiAgNAorZGRsb2diMTQxOSBsb2diIDEwMDBFMiAgIC0+ICA1CitkZGxvZ2IxNDIwIGxvZ2IgMTAwMDBFMiAgLT4gIDYKKworLS0gc3BlY2lhbCB2YWx1ZXMKK2RkbG9nYjgyMCAgbG9nYiAgIEluZmluaXR5IC0+ICAgSW5maW5pdHkKK2RkbG9nYjgyMSAgbG9nYiAgIDAgICAgICAgIC0+ICAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGRsb2diODIyICBsb2diICAgTmFOICAgICAgLT4gICBOYU4KK2RkbG9nYjgyMyAgbG9nYiAgIHNOYU4gICAgIC0+ICAgTmFOICAgICBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworZGRsb2diODI0ICBsb2diICAgc05hTjEyMyAgLT4gICBOYU4xMjMgIEludmFsaWRfb3BlcmF0aW9uCitkZGxvZ2I4MjUgIGxvZ2IgICAtc05hTjMyMSAtPiAgLU5hTjMyMSAgSW52YWxpZF9vcGVyYXRpb24KK2RkbG9nYjgyNiAgbG9nYiAgIE5hTjQ1NiAgIC0+ICAgTmFONDU2CitkZGxvZ2I4MjcgIGxvZ2IgICAtTmFONjU0ICAtPiAgLU5hTjY1NAorZGRsb2diODI4ICBsb2diICAgTmFOMSAgICAgLT4gICBOYU4xCisKKy0tIE51bGwgdGVzdAorZGRsb2diOTAwICBsb2diICMgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWF4LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWF4LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjNjM5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNYXguZGVjVGVzdApAQCAtMCwwICsxLDMyMiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE1heC5kZWNUZXN0IC0tIGRlY0RvdWJsZSBtYXhudW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRtYXgwMDEgbWF4ICAtMiAgLTIgIC0+IC0yCitkZG1heDAwMiBtYXggIC0yICAtMSAgLT4gLTEKK2RkbWF4MDAzIG1heCAgLTIgICAwICAtPiAgMAorZGRtYXgwMDQgbWF4ICAtMiAgIDEgIC0+ICAxCitkZG1heDAwNSBtYXggIC0yICAgMiAgLT4gIDIKK2RkbWF4MDA2IG1heCAgLTEgIC0yICAtPiAtMQorZGRtYXgwMDcgbWF4ICAtMSAgLTEgIC0+IC0xCitkZG1heDAwOCBtYXggIC0xICAgMCAgLT4gIDAKK2RkbWF4MDA5IG1heCAgLTEgICAxICAtPiAgMQorZGRtYXgwMTAgbWF4ICAtMSAgIDIgIC0+ICAyCitkZG1heDAxMSBtYXggICAwICAtMiAgLT4gIDAKK2RkbWF4MDEyIG1heCAgIDAgIC0xICAtPiAgMAorZGRtYXgwMTMgbWF4ICAgMCAgIDAgIC0+ICAwCitkZG1heDAxNCBtYXggICAwICAgMSAgLT4gIDEKK2RkbWF4MDE1IG1heCAgIDAgICAyICAtPiAgMgorZGRtYXgwMTYgbWF4ICAgMSAgLTIgIC0+ICAxCitkZG1heDAxNyBtYXggICAxICAtMSAgLT4gIDEKK2RkbWF4MDE4IG1heCAgIDEgICAwICAtPiAgMQorZGRtYXgwMTkgbWF4ICAgMSAgIDEgIC0+ICAxCitkZG1heDAyMCBtYXggICAxICAgMiAgLT4gIDIKK2RkbWF4MDIxIG1heCAgIDIgIC0yICAtPiAgMgorZGRtYXgwMjIgbWF4ICAgMiAgLTEgIC0+ICAyCitkZG1heDAyMyBtYXggICAyICAgMCAgLT4gIDIKK2RkbWF4MDI1IG1heCAgIDIgICAxICAtPiAgMgorZGRtYXgwMjYgbWF4ICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCitkZG1heDAzMCBtYXggICAwICAgICAwICAgLT4gIDAKK2RkbWF4MDMxIG1heCAgIDAgICAgLTAgICAtPiAgMAorZGRtYXgwMzIgbWF4ICAgMCAgICAtMC4wIC0+ICAwCitkZG1heDAzMyBtYXggICAwICAgICAwLjAgLT4gIDAKK2RkbWF4MDM0IG1heCAgLTAgICAgIDAgICAtPiAgMCAgICAtLSBub3RlOiAtMCA9IDAsIGJ1dCAwIGNob3NlbgorZGRtYXgwMzUgbWF4ICAtMCAgICAtMCAgIC0+IC0wCitkZG1heDAzNiBtYXggIC0wICAgIC0wLjAgLT4gLTAuMAorZGRtYXgwMzcgbWF4ICAtMCAgICAgMC4wIC0+ICAwLjAKK2RkbWF4MDM4IG1heCAgIDAuMCAgIDAgICAtPiAgMAorZGRtYXgwMzkgbWF4ICAgMC4wICAtMCAgIC0+ICAwLjAKK2RkbWF4MDQwIG1heCAgIDAuMCAgLTAuMCAtPiAgMC4wCitkZG1heDA0MSBtYXggICAwLjAgICAwLjAgLT4gIDAuMAorZGRtYXgwNDIgbWF4ICAtMC4wICAgMCAgIC0+ICAwCitkZG1heDA0MyBtYXggIC0wLjAgIC0wICAgLT4gLTAuMAorZGRtYXgwNDQgbWF4ICAtMC4wICAtMC4wIC0+IC0wLjAKK2RkbWF4MDQ1IG1heCAgLTAuMCAgIDAuMCAtPiAgMC4wCisKK2RkbWF4MDUwIG1heCAgLTBFMSAgIDBFMSAtPiAgMEUrMQorZGRtYXgwNTEgbWF4ICAtMEUyICAgMEUyIC0+ICAwRSsyCitkZG1heDA1MiBtYXggIC0wRTIgICAwRTEgLT4gIDBFKzEKK2RkbWF4MDUzIG1heCAgLTBFMSAgIDBFMiAtPiAgMEUrMgorZGRtYXgwNTQgbWF4ICAgMEUxICAtMEUxIC0+ICAwRSsxCitkZG1heDA1NSBtYXggICAwRTIgIC0wRTIgLT4gIDBFKzIKK2RkbWF4MDU2IG1heCAgIDBFMiAgLTBFMSAtPiAgMEUrMgorZGRtYXgwNTcgbWF4ICAgMEUxICAtMEUyIC0+ICAwRSsxCisKK2RkbWF4MDU4IG1heCAgIDBFMSAgIDBFMSAtPiAgMEUrMQorZGRtYXgwNTkgbWF4ICAgMEUyICAgMEUyIC0+ICAwRSsyCitkZG1heDA2MCBtYXggICAwRTIgICAwRTEgLT4gIDBFKzIKK2RkbWF4MDYxIG1heCAgIDBFMSAgIDBFMiAtPiAgMEUrMgorZGRtYXgwNjIgbWF4ICAtMEUxICAtMEUxIC0+IC0wRSsxCitkZG1heDA2MyBtYXggIC0wRTIgIC0wRTIgLT4gLTBFKzIKK2RkbWF4MDY0IG1heCAgLTBFMiAgLTBFMSAtPiAtMEUrMQorZGRtYXgwNjUgbWF4ICAtMEUxICAtMEUyIC0+IC0wRSsxCisKKy0tIFNwZWNpYWxzCitkZG1heDA5MCBtYXggIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRtYXgwOTEgbWF4ICBJbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RkbWF4MDkyIG1heCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkZG1heDA5MyBtYXggIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZGRtYXgwOTQgbWF4ICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2RkbWF4MDk1IG1heCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkZG1heDA5NiBtYXggIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZGRtYXgwOTcgbWF4ICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbWF4MDk4IG1heCAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkZG1heDA5OSBtYXggLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtYXgxMDAgbWF4IC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbWF4MTAxIG1heCAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZG1heDEwMiBtYXggIDAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtYXgxMDMgbWF4ICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbWF4MTA0IG1heCAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkZG1heDEwNSBtYXggIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkZG1heDEyMCBtYXggLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtYXgxMjEgbWF4IC1JbmYgIC0xMDAwICAtPiAtMTAwMAorZGRtYXgxMjIgbWF4IC1JbmYgIC0xICAgICAtPiAtMQorZGRtYXgxMjMgbWF4IC1JbmYgIC0wICAgICAtPiAtMAorZGRtYXgxMjQgbWF4IC1JbmYgICAwICAgICAtPiAgMAorZGRtYXgxMjUgbWF4IC1JbmYgICAxICAgICAtPiAgMQorZGRtYXgxMjYgbWF4IC1JbmYgICAxMDAwICAtPiAgMTAwMAorZGRtYXgxMjcgbWF4IC1JbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbWF4MTI4IG1heCAtSW5mICAtSW5mICAgLT4gIC1JbmZpbml0eQorZGRtYXgxMjkgbWF4IC0xMDAwIC1JbmYgICAtPiAgLTEwMDAKK2RkbWF4MTMwIG1heCAtMSAgICAtSW5mICAgLT4gIC0xCitkZG1heDEzMSBtYXggLTAgICAgLUluZiAgIC0+ICAtMAorZGRtYXgxMzIgbWF4ICAwICAgIC1JbmYgICAtPiAgMAorZGRtYXgxMzMgbWF4ICAxICAgIC1JbmYgICAtPiAgMQorZGRtYXgxMzQgbWF4ICAxMDAwIC1JbmYgICAtPiAgMTAwMAorZGRtYXgxMzUgbWF4ICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitkZG1heDE0MSBtYXggIE5hTiAtSW5mICAgIC0+IC1JbmZpbml0eQorZGRtYXgxNDIgbWF4ICBOYU4gLTEwMDAgICAtPiAtMTAwMAorZGRtYXgxNDMgbWF4ICBOYU4gLTEgICAgICAtPiAtMQorZGRtYXgxNDQgbWF4ICBOYU4gLTAgICAgICAtPiAtMAorZGRtYXgxNDUgbWF4ICBOYU4gIDAgICAgICAtPiAgMAorZGRtYXgxNDYgbWF4ICBOYU4gIDEgICAgICAtPiAgMQorZGRtYXgxNDcgbWF4ICBOYU4gIDEwMDAgICAtPiAgMTAwMAorZGRtYXgxNDggbWF4ICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK2RkbWF4MTQ5IG1heCAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRtYXgxNTAgbWF4IC1JbmYgIE5hTiAgICAtPiAtSW5maW5pdHkKK2RkbWF4MTUxIG1heCAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK2RkbWF4MTUyIG1heCAtMSAgICBOYU4gICAgLT4gLTEKK2RkbWF4MTUzIG1heCAtMCAgICBOYU4gICAgLT4gLTAKK2RkbWF4MTU0IG1heCAgMCAgICBOYU4gICAgLT4gIDAKK2RkbWF4MTU1IG1heCAgMSAgICBOYU4gICAgLT4gIDEKK2RkbWF4MTU2IG1heCAgMTAwMCBOYU4gICAgLT4gIDEwMDAKK2RkbWF4MTU3IG1heCAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK2RkbWF4MTYxIG1heCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTYyIG1heCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTYzIG1heCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTY0IG1heCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTY1IG1heCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTY2IG1heCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTY3IG1heCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTY4IG1heCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTY5IG1heCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTcwIG1heCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTcxIG1heCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTcyIG1heCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTczIG1heCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTc0IG1heCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTc1IG1heCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTc2IG1heCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTc3IG1heCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTc4IG1heCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTc5IG1heCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRtYXgxODEgbWF4ICBOYU45ICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1heDE4MiBtYXggIE5hTjggICAgIDkgICAtPiAgOQorZGRtYXgxODMgbWF4IC1OYU43ICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbWF4MTg0IG1heCAtTmFOMSAgIE5hTjExIC0+IC1OYU4xCitkZG1heDE4NSBtYXggIE5hTjIgICBOYU4xMiAtPiAgTmFOMgorZGRtYXgxODYgbWF4IC1OYU4xMyAtTmFONyAgLT4gLU5hTjEzCitkZG1heDE4NyBtYXggIE5hTjE0IC1OYU41ICAtPiAgTmFOMTQKKworZGRtYXgxODggbWF4IC1JbmYgICAgTmFONCAgLT4gLUluZmluaXR5CitkZG1heDE4OSBtYXggLTkgICAgIC1OYU4zICAtPiAtOQorZGRtYXgxOTAgbWF4ICBJbmYgICAgTmFOMiAgLT4gIEluZmluaXR5CisKK2RkbWF4MTkxIG1heCAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZG1heDE5MiBtYXggIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxOTMgbWF4IC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTk0IG1heCAgc05hTjk2IHNOYU45NCAgLT4gIE5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitkZG1heDE5NSBtYXggIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxOTYgbWF4IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4MTk3IG1heCAgMCAgICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZG1heDE5OCBtYXggIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRtYXgxOTkgbWF4ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb2xkIHJvdW5kaW5nIGNoZWNrcworZGRtYXgyMjEgbWF4IDEyMzQ1Njc4MDAwIDEgIC0+IDEyMzQ1Njc4MDAwCitkZG1heDIyMiBtYXggMSAxMjM0NTY3ODAwMCAgLT4gMTIzNDU2NzgwMDAKK2RkbWF4MjIzIG1heCAxMjM0NTY3ODAwICAxICAtPiAxMjM0NTY3ODAwCitkZG1heDIyNCBtYXggMSAxMjM0NTY3ODAwICAgLT4gMTIzNDU2NzgwMAorZGRtYXgyMjUgbWF4IDEyMzQ1Njc4OTAgIDEgIC0+IDEyMzQ1Njc4OTAKK2RkbWF4MjI2IG1heCAxIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCitkZG1heDIyNyBtYXggMTIzNDU2Nzg5MSAgMSAgLT4gMTIzNDU2Nzg5MQorZGRtYXgyMjggbWF4IDEgMTIzNDU2Nzg5MSAgIC0+IDEyMzQ1Njc4OTEKK2RkbWF4MjI5IG1heCAxMjM0NTY3ODkwMSAxICAtPiAxMjM0NTY3ODkwMQorZGRtYXgyMzAgbWF4IDEgMTIzNDU2Nzg5MDEgIC0+IDEyMzQ1Njc4OTAxCitkZG1heDIzMSBtYXggMTIzNDU2Nzg5NiAgMSAgLT4gMTIzNDU2Nzg5NgorZGRtYXgyMzIgbWF4IDEgMTIzNDU2Nzg5NiAgIC0+IDEyMzQ1Njc4OTYKK2RkbWF4MjMzIG1heCAtMTIzNDU2Nzg5MSAgMSAtPiAxCitkZG1heDIzNCBtYXggMSAtMTIzNDU2Nzg5MSAgLT4gMQorZGRtYXgyMzUgbWF4IC0xMjM0NTY3ODkwMSAxIC0+IDEKK2RkbWF4MjM2IG1heCAxIC0xMjM0NTY3ODkwMSAtPiAxCitkZG1heDIzNyBtYXggLTEyMzQ1Njc4OTYgIDEgLT4gMQorZGRtYXgyMzggbWF4IDEgLTEyMzQ1Njc4OTYgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworZGRtYXgyODAgbWF4ICczJyAgICcyJyAgLT4gICczJworZGRtYXgyODEgbWF4ICctMTAnICczJyAgLT4gICczJworZGRtYXgyODIgbWF4ICcxLjAnICcxJyAgLT4gICcxJworZGRtYXgyODMgbWF4ICcxJyAnMS4wJyAgLT4gICcxJworZGRtYXgyODQgbWF4ICc3JyAnTmFOJyAgLT4gICc3JworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK2RkbWF4NDAxIG1heCAgSW5mICAgIDEuMSAgICAgLT4gIEluZmluaXR5CitkZG1heDQwMiBtYXggIDEuMSAgICAxICAgICAgIC0+ICAxLjEKK2RkbWF4NDAzIG1heCAgMSAgICAgIDEuMCAgICAgLT4gIDEKK2RkbWF4NDA0IG1heCAgMS4wICAgIDAuMSAgICAgLT4gIDEuMAorZGRtYXg0MDUgbWF4ICAwLjEgICAgMC4xMCAgICAtPiAgMC4xCitkZG1heDQwNiBtYXggIDAuMTAgICAwLjEwMCAgIC0+ICAwLjEwCitkZG1heDQwNyBtYXggIDAuMTAgICAwICAgICAgIC0+ICAwLjEwCitkZG1heDQwOCBtYXggIDAgICAgICAwLjAgICAgIC0+ICAwCitkZG1heDQwOSBtYXggIDAuMCAgIC0wICAgICAgIC0+ICAwLjAKK2RkbWF4NDEwIG1heCAgMC4wICAgLTAuMCAgICAgLT4gIDAuMAorZGRtYXg0MTEgbWF4ICAwLjAwICAtMC4wICAgICAtPiAgMC4wMAorZGRtYXg0MTIgbWF4ICAwLjAgICAtMC4wMCAgICAtPiAgMC4wCitkZG1heDQxMyBtYXggIDAgICAgIC0wLjAgICAgIC0+ICAwCitkZG1heDQxNCBtYXggIDAgICAgIC0wICAgICAgIC0+ICAwCitkZG1heDQxNSBtYXggLTAuMCAgIC0wICAgICAgIC0+IC0wLjAKK2RkbWF4NDE2IG1heCAtMCAgICAgLTAuMTAwICAgLT4gLTAKK2RkbWF4NDE3IG1heCAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAwCitkZG1heDQxOCBtYXggLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEwCitkZG1heDQxOSBtYXggLTAuMSAgIC0xLjAgICAgIC0+IC0wLjEKK2RkbWF4NDIwIG1heCAtMS4wICAgLTEgICAgICAgLT4gLTEuMAorZGRtYXg0MjEgbWF4IC0xICAgICAtMS4xICAgICAtPiAtMQorZGRtYXg0MjMgbWF4IC0xLjEgICAtSW5mICAgICAtPiAtMS4xCistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK2RkbWF4NDMxIG1heCAgMS4xICAgIEluZiAgICAgLT4gIEluZmluaXR5CitkZG1heDQzMiBtYXggIDEgICAgICAxLjEgICAgIC0+ICAxLjEKK2RkbWF4NDMzIG1heCAgMS4wICAgIDEgICAgICAgLT4gIDEKK2RkbWF4NDM0IG1heCAgMC4xICAgIDEuMCAgICAgLT4gIDEuMAorZGRtYXg0MzUgbWF4ICAwLjEwICAgMC4xICAgICAtPiAgMC4xCitkZG1heDQzNiBtYXggIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwCitkZG1heDQzNyBtYXggIDAgICAgICAwLjEwICAgIC0+ICAwLjEwCitkZG1heDQzOCBtYXggIDAuMCAgICAwICAgICAgIC0+ICAwCitkZG1heDQzOSBtYXggLTAgICAgICAwLjAgICAgIC0+ICAwLjAKK2RkbWF4NDQwIG1heCAtMC4wICAgIDAuMCAgICAgLT4gIDAuMAorZGRtYXg0NDEgbWF4IC0wLjAgICAgMC4wMCAgICAtPiAgMC4wMAorZGRtYXg0NDIgbWF4IC0wLjAwICAgMC4wICAgICAtPiAgMC4wCitkZG1heDQ0MyBtYXggLTAuMCAgICAwICAgICAgIC0+ICAwCitkZG1heDQ0NCBtYXggLTAgICAgICAwICAgICAgIC0+ICAwCitkZG1heDQ0NSBtYXggLTAgICAgIC0wLjAgICAgIC0+IC0wLjAKK2RkbWF4NDQ2IG1heCAtMC4xMDAgLTAgICAgICAgLT4gLTAKK2RkbWF4NDQ3IG1heCAtMC4xMCAgLTAuMTAwICAgLT4gLTAuMTAwCitkZG1heDQ0OCBtYXggLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEwCitkZG1heDQ0OSBtYXggLTEuMCAgIC0wLjEgICAgIC0+IC0wLjEKK2RkbWF4NDUwIG1heCAtMSAgICAgLTEuMCAgICAgLT4gLTEuMAorZGRtYXg0NTEgbWF4IC0xLjEgICAtMSAgICAgICAtPiAtMQorZGRtYXg0NTMgbWF4IC1JbmYgICAtMS4xICAgICAtPiAtMS4xCistLSBsYXJnaWVzCitkZG1heDQ2MCBtYXggIDEwMDAgICAxRSszICAgIC0+ICAxRSszCitkZG1heDQ2MSBtYXggIDFFKzMgICAxMDAwICAgIC0+ICAxRSszCitkZG1heDQ2MiBtYXggIDEwMDAgIC0xRSszICAgIC0+ICAxMDAwCitkZG1heDQ2MyBtYXggIDFFKzMgIC0xMDAwICAgIC0+ICAxRSszCitkZG1heDQ2NCBtYXggLTEwMDAgICAxRSszICAgIC0+ICAxRSszCitkZG1heDQ2NSBtYXggLTFFKzMgICAxMDAwICAgIC0+ICAxMDAwCitkZG1heDQ2NiBtYXggLTEwMDAgIC0xRSszICAgIC0+IC0xMDAwCitkZG1heDQ2NyBtYXggLTFFKzMgIC0xMDAwICAgIC0+IC0xMDAwCisKKy0tIG1pc2FsaWdubWVudCB0cmFwcyBmb3IgbGl0dGxlLWVuZGlhbgorZGRtYXg0NzEgbWF4ICAgICAgMS4wICAgICAgIDAuMSAgLT4gMS4wCitkZG1heDQ3MiBtYXggICAgICAwLjEgICAgICAgMS4wICAtPiAxLjAKK2RkbWF4NDczIG1heCAgICAgMTAuMCAgICAgICAwLjEgIC0+IDEwLjAKK2RkbWF4NDc0IG1heCAgICAgIDAuMSAgICAgIDEwLjAgIC0+IDEwLjAKK2RkbWF4NDc1IG1heCAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEwMAorZGRtYXg0NzYgbWF4ICAgICAgMS4wICAgICAgIDEwMCAgLT4gMTAwCitkZG1heDQ3NyBtYXggICAgIDEwMDAgICAgICAxMC4wICAtPiAxMDAwCitkZG1heDQ3OCBtYXggICAgIDEwLjAgICAgICAxMDAwICAtPiAxMDAwCitkZG1heDQ3OSBtYXggICAgMTAwMDAgICAgIDEwMC4wICAtPiAxMDAwMAorZGRtYXg0ODAgbWF4ICAgIDEwMC4wICAgICAxMDAwMCAgLT4gMTAwMDAKK2RkbWF4NDgxIG1heCAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEwMDAwMAorZGRtYXg0ODIgbWF4ICAgMTAwMC4wICAgIDEwMDAwMCAgLT4gMTAwMDAwCitkZG1heDQ4MyBtYXggIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxMDAwMDAwCitkZG1heDQ4NCBtYXggIDEwMDAwLjAgICAxMDAwMDAwICAtPiAxMDAwMDAwCisKKy0tIHN1Ym5vcm1hbHMKK2RkbWF4NTEwIG1heCAgMS4wMEUtMzgzICAgICAgIDAgIC0+ICAgMS4wMEUtMzgzCitkZG1heDUxMSBtYXggIDAuMUUtMzgzICAgICAgICAwICAtPiAgIDFFLTM4NCAgICBTdWJub3JtYWwKK2RkbWF4NTEyIG1heCAgMC4xMEUtMzgzICAgICAgIDAgIC0+ICAgMS4wRS0zODQgIFN1Ym5vcm1hbAorZGRtYXg1MTMgbWF4ICAwLjEwMEUtMzgzICAgICAgMCAgLT4gICAxLjAwRS0zODQgU3Vibm9ybWFsCitkZG1heDUxNCBtYXggIDAuMDFFLTM4MyAgICAgICAwICAtPiAgIDFFLTM4NSAgICBTdWJub3JtYWwKK2RkbWF4NTE1IG1heCAgMC45OTlFLTM4MyAgICAgIDAgIC0+ICAgOS45OUUtMzg0IFN1Ym5vcm1hbAorZGRtYXg1MTYgbWF4ICAwLjA5OUUtMzgzICAgICAgMCAgLT4gICA5LjlFLTM4NSAgU3Vibm9ybWFsCitkZG1heDUxNyBtYXggIDAuMDA5RS0zODMgICAgICAwICAtPiAgIDlFLTM4NiAgICBTdWJub3JtYWwKK2RkbWF4NTE4IG1heCAgMC4wMDFFLTM4MyAgICAgIDAgIC0+ICAgMUUtMzg2ICAgIFN1Ym5vcm1hbAorZGRtYXg1MTkgbWF4ICAwLjAwMDlFLTM4MyAgICAgMCAgLT4gICA5RS0zODcgICAgU3Vibm9ybWFsCitkZG1heDUyMCBtYXggIDAuMDAwMUUtMzgzICAgICAwICAtPiAgIDFFLTM4NyAgICBTdWJub3JtYWwKKworZGRtYXg1MzAgbWF4IC0xLjAwRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1heDUzMSBtYXggLTAuMUUtMzgzICAgICAgICAwICAtPiAgIDAKK2RkbWF4NTMyIG1heCAtMC4xMEUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtYXg1MzMgbWF4IC0wLjEwMEUtMzgzICAgICAgMCAgLT4gICAwCitkZG1heDUzNCBtYXggLTAuMDFFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbWF4NTM1IG1heCAtMC45OTlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtYXg1MzYgbWF4IC0wLjA5OUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1heDUzNyBtYXggLTAuMDA5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbWF4NTM4IG1heCAtMC4wMDFFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtYXg1MzkgbWF4IC0wLjAwMDlFLTM4MyAgICAgMCAgLT4gICAwCitkZG1heDU0MCBtYXggLTAuMDAwMUUtMzgzICAgICAwICAtPiAgIDAKKworLS0gTnVsbCB0ZXN0cworZGRtYXg5MDAgbWF4IDEwICAjICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbWF4OTAxIG1heCAgIyAxMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWF4TWFnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWF4TWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTljM2U5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNYXhNYWcuZGVjVGVzdApAQCAtMCwwICsxLDMwNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE1heE1hZy5kZWNUZXN0IC0tIGRlY0RvdWJsZSBtYXhudW1tYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRteGcwMDEgbWF4bWFnICAtMiAgLTIgIC0+IC0yCitkZG14ZzAwMiBtYXhtYWcgIC0yICAtMSAgLT4gLTIKK2RkbXhnMDAzIG1heG1hZyAgLTIgICAwICAtPiAtMgorZGRteGcwMDQgbWF4bWFnICAtMiAgIDEgIC0+IC0yCitkZG14ZzAwNSBtYXhtYWcgIC0yICAgMiAgLT4gIDIKK2RkbXhnMDA2IG1heG1hZyAgLTEgIC0yICAtPiAtMgorZGRteGcwMDcgbWF4bWFnICAtMSAgLTEgIC0+IC0xCitkZG14ZzAwOCBtYXhtYWcgIC0xICAgMCAgLT4gLTEKK2RkbXhnMDA5IG1heG1hZyAgLTEgICAxICAtPiAgMQorZGRteGcwMTAgbWF4bWFnICAtMSAgIDIgIC0+ICAyCitkZG14ZzAxMSBtYXhtYWcgICAwICAtMiAgLT4gLTIKK2RkbXhnMDEyIG1heG1hZyAgIDAgIC0xICAtPiAtMQorZGRteGcwMTMgbWF4bWFnICAgMCAgIDAgIC0+ICAwCitkZG14ZzAxNCBtYXhtYWcgICAwICAgMSAgLT4gIDEKK2RkbXhnMDE1IG1heG1hZyAgIDAgICAyICAtPiAgMgorZGRteGcwMTYgbWF4bWFnICAgMSAgLTIgIC0+IC0yCitkZG14ZzAxNyBtYXhtYWcgICAxICAtMSAgLT4gIDEKK2RkbXhnMDE4IG1heG1hZyAgIDEgICAwICAtPiAgMQorZGRteGcwMTkgbWF4bWFnICAgMSAgIDEgIC0+ICAxCitkZG14ZzAyMCBtYXhtYWcgICAxICAgMiAgLT4gIDIKK2RkbXhnMDIxIG1heG1hZyAgIDIgIC0yICAtPiAgMgorZGRteGcwMjIgbWF4bWFnICAgMiAgLTEgIC0+ICAyCitkZG14ZzAyMyBtYXhtYWcgICAyICAgMCAgLT4gIDIKK2RkbXhnMDI1IG1heG1hZyAgIDIgICAxICAtPiAgMgorZGRteGcwMjYgbWF4bWFnICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCitkZG14ZzAzMCBtYXhtYWcgICAwICAgICAwICAgLT4gIDAKK2RkbXhnMDMxIG1heG1hZyAgIDAgICAgLTAgICAtPiAgMAorZGRteGcwMzIgbWF4bWFnICAgMCAgICAtMC4wIC0+ICAwCitkZG14ZzAzMyBtYXhtYWcgICAwICAgICAwLjAgLT4gIDAKK2RkbXhnMDM0IG1heG1hZyAgLTAgICAgIDAgICAtPiAgMCAgICAtLSBub3RlOiAtMCA9IDAsIGJ1dCAwIGNob3NlbgorZGRteGcwMzUgbWF4bWFnICAtMCAgICAtMCAgIC0+IC0wCitkZG14ZzAzNiBtYXhtYWcgIC0wICAgIC0wLjAgLT4gLTAuMAorZGRteGcwMzcgbWF4bWFnICAtMCAgICAgMC4wIC0+ICAwLjAKK2RkbXhnMDM4IG1heG1hZyAgIDAuMCAgIDAgICAtPiAgMAorZGRteGcwMzkgbWF4bWFnICAgMC4wICAtMCAgIC0+ICAwLjAKK2RkbXhnMDQwIG1heG1hZyAgIDAuMCAgLTAuMCAtPiAgMC4wCitkZG14ZzA0MSBtYXhtYWcgICAwLjAgICAwLjAgLT4gIDAuMAorZGRteGcwNDIgbWF4bWFnICAtMC4wICAgMCAgIC0+ICAwCitkZG14ZzA0MyBtYXhtYWcgIC0wLjAgIC0wICAgLT4gLTAuMAorZGRteGcwNDQgbWF4bWFnICAtMC4wICAtMC4wIC0+IC0wLjAKK2RkbXhnMDQ1IG1heG1hZyAgLTAuMCAgIDAuMCAtPiAgMC4wCisKK2RkbXhnMDUwIG1heG1hZyAgLTBFMSAgIDBFMSAtPiAgMEUrMQorZGRteGcwNTEgbWF4bWFnICAtMEUyICAgMEUyIC0+ICAwRSsyCitkZG14ZzA1MiBtYXhtYWcgIC0wRTIgICAwRTEgLT4gIDBFKzEKK2RkbXhnMDUzIG1heG1hZyAgLTBFMSAgIDBFMiAtPiAgMEUrMgorZGRteGcwNTQgbWF4bWFnICAgMEUxICAtMEUxIC0+ICAwRSsxCitkZG14ZzA1NSBtYXhtYWcgICAwRTIgIC0wRTIgLT4gIDBFKzIKK2RkbXhnMDU2IG1heG1hZyAgIDBFMiAgLTBFMSAtPiAgMEUrMgorZGRteGcwNTcgbWF4bWFnICAgMEUxICAtMEUyIC0+ICAwRSsxCisKK2RkbXhnMDU4IG1heG1hZyAgIDBFMSAgIDBFMSAtPiAgMEUrMQorZGRteGcwNTkgbWF4bWFnICAgMEUyICAgMEUyIC0+ICAwRSsyCitkZG14ZzA2MCBtYXhtYWcgICAwRTIgICAwRTEgLT4gIDBFKzIKK2RkbXhnMDYxIG1heG1hZyAgIDBFMSAgIDBFMiAtPiAgMEUrMgorZGRteGcwNjIgbWF4bWFnICAtMEUxICAtMEUxIC0+IC0wRSsxCitkZG14ZzA2MyBtYXhtYWcgIC0wRTIgIC0wRTIgLT4gLTBFKzIKK2RkbXhnMDY0IG1heG1hZyAgLTBFMiAgLTBFMSAtPiAtMEUrMQorZGRteGcwNjUgbWF4bWFnICAtMEUxICAtMEUyIC0+IC0wRSsxCisKKy0tIFNwZWNpYWxzCitkZG14ZzA5MCBtYXhtYWcgIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRteGcwOTEgbWF4bWFnICBJbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RkbXhnMDkyIG1heG1hZyAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkZG14ZzA5MyBtYXhtYWcgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZGRteGcwOTQgbWF4bWFnICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2RkbXhnMDk1IG1heG1hZyAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkZG14ZzA5NiBtYXhtYWcgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZGRteGcwOTcgbWF4bWFnICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXhnMDk4IG1heG1hZyAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkZG14ZzA5OSBtYXhtYWcgLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRteGcxMDAgbWF4bWFnIC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXhnMTAxIG1heG1hZyAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZG14ZzEwMiBtYXhtYWcgIDAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRteGcxMDMgbWF4bWFnICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXhnMTA0IG1heG1hZyAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkZG14ZzEwNSBtYXhtYWcgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkZG14ZzEyMCBtYXhtYWcgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRteGcxMjEgbWF4bWFnIC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2RkbXhnMTIyIG1heG1hZyAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkZG14ZzEyMyBtYXhtYWcgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZGRteGcxMjQgbWF4bWFnIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2RkbXhnMTI1IG1heG1hZyAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkZG14ZzEyNiBtYXhtYWcgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZGRteGcxMjcgbWF4bWFnIC1JbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RkbXhnMTI4IG1heG1hZyAtSW5mICAtSW5mICAgLT4gIC1JbmZpbml0eQorZGRteGcxMjkgbWF4bWFnIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXhnMTMwIG1heG1hZyAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG14ZzEzMSBtYXhtYWcgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRteGcxMzIgbWF4bWFnICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXhnMTMzIG1heG1hZyAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG14ZzEzNCBtYXhtYWcgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRteGcxMzUgbWF4bWFnICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitkZG14ZzE0MSBtYXhtYWcgIE5hTiAtSW5mICAgIC0+IC1JbmZpbml0eQorZGRteGcxNDIgbWF4bWFnICBOYU4gLTEwMDAgICAtPiAtMTAwMAorZGRteGcxNDMgbWF4bWFnICBOYU4gLTEgICAgICAtPiAtMQorZGRteGcxNDQgbWF4bWFnICBOYU4gLTAgICAgICAtPiAtMAorZGRteGcxNDUgbWF4bWFnICBOYU4gIDAgICAgICAtPiAgMAorZGRteGcxNDYgbWF4bWFnICBOYU4gIDEgICAgICAtPiAgMQorZGRteGcxNDcgbWF4bWFnICBOYU4gIDEwMDAgICAtPiAgMTAwMAorZGRteGcxNDggbWF4bWFnICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK2RkbXhnMTQ5IG1heG1hZyAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRteGcxNTAgbWF4bWFnIC1JbmYgIE5hTiAgICAtPiAtSW5maW5pdHkKK2RkbXhnMTUxIG1heG1hZyAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK2RkbXhnMTUyIG1heG1hZyAtMSAgICBOYU4gICAgLT4gLTEKK2RkbXhnMTUzIG1heG1hZyAtMCAgICBOYU4gICAgLT4gLTAKK2RkbXhnMTU0IG1heG1hZyAgMCAgICBOYU4gICAgLT4gIDAKK2RkbXhnMTU1IG1heG1hZyAgMSAgICBOYU4gICAgLT4gIDEKK2RkbXhnMTU2IG1heG1hZyAgMTAwMCBOYU4gICAgLT4gIDEwMDAKK2RkbXhnMTU3IG1heG1hZyAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK2RkbXhnMTYxIG1heG1hZyAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTYyIG1heG1hZyAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTYzIG1heG1hZyAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTY0IG1heG1hZyAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTY1IG1heG1hZyAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTY2IG1heG1hZyAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTY3IG1heG1hZyAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTY4IG1heG1hZyAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTY5IG1heG1hZyAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTcwIG1heG1hZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTcxIG1heG1hZyAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTcyIG1heG1hZyAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTczIG1heG1hZyAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTc0IG1heG1hZyAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTc1IG1heG1hZyAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTc2IG1heG1hZyAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTc3IG1heG1hZyAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTc4IG1heG1hZyAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTc5IG1heG1hZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRteGcxODEgbWF4bWFnICBOYU45ICAtSW5mICAgLT4gLUluZmluaXR5CitkZG14ZzE4MiBtYXhtYWcgIE5hTjggICAgIDkgICAtPiAgOQorZGRteGcxODMgbWF4bWFnIC1OYU43ICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbXhnMTg0IG1heG1hZyAtTmFOMSAgIE5hTjExIC0+IC1OYU4xCitkZG14ZzE4NSBtYXhtYWcgIE5hTjIgICBOYU4xMiAtPiAgTmFOMgorZGRteGcxODYgbWF4bWFnIC1OYU4xMyAtTmFONyAgLT4gLU5hTjEzCitkZG14ZzE4NyBtYXhtYWcgIE5hTjE0IC1OYU41ICAtPiAgTmFOMTQKKworZGRteGcxODggbWF4bWFnIC1JbmYgICAgTmFONCAgLT4gLUluZmluaXR5CitkZG14ZzE4OSBtYXhtYWcgLTkgICAgIC1OYU4zICAtPiAtOQorZGRteGcxOTAgbWF4bWFnICBJbmYgICAgTmFOMiAgLT4gIEluZmluaXR5CisKK2RkbXhnMTkxIG1heG1hZyAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZG14ZzE5MiBtYXhtYWcgIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxOTMgbWF4bWFnIC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTk0IG1heG1hZyAgc05hTjk2IHNOYU45NCAgLT4gIE5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitkZG14ZzE5NSBtYXhtYWcgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxOTYgbWF4bWFnIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkbXhnMTk3IG1heG1hZyAgMCAgICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZG14ZzE5OCBtYXhtYWcgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRteGcxOTkgbWF4bWFnICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb2xkIHJvdW5kaW5nIGNoZWNrcworZGRteGcyMjEgbWF4bWFnIDEyMzQ1Njc4MDAwIDEgIC0+IDEyMzQ1Njc4MDAwCitkZG14ZzIyMiBtYXhtYWcgMSAxMjM0NTY3ODAwMCAgLT4gMTIzNDU2NzgwMDAKK2RkbXhnMjIzIG1heG1hZyAxMjM0NTY3ODAwICAxICAtPiAxMjM0NTY3ODAwCitkZG14ZzIyNCBtYXhtYWcgMSAxMjM0NTY3ODAwICAgLT4gMTIzNDU2NzgwMAorZGRteGcyMjUgbWF4bWFnIDEyMzQ1Njc4OTAgIDEgIC0+IDEyMzQ1Njc4OTAKK2RkbXhnMjI2IG1heG1hZyAxIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCitkZG14ZzIyNyBtYXhtYWcgMTIzNDU2Nzg5MSAgMSAgLT4gMTIzNDU2Nzg5MQorZGRteGcyMjggbWF4bWFnIDEgMTIzNDU2Nzg5MSAgIC0+IDEyMzQ1Njc4OTEKK2RkbXhnMjI5IG1heG1hZyAxMjM0NTY3ODkwMSAxICAtPiAxMjM0NTY3ODkwMQorZGRteGcyMzAgbWF4bWFnIDEgMTIzNDU2Nzg5MDEgIC0+IDEyMzQ1Njc4OTAxCitkZG14ZzIzMSBtYXhtYWcgMTIzNDU2Nzg5NiAgMSAgLT4gMTIzNDU2Nzg5NgorZGRteGcyMzIgbWF4bWFnIDEgMTIzNDU2Nzg5NiAgIC0+IDEyMzQ1Njc4OTYKK2RkbXhnMjMzIG1heG1hZyAtMTIzNDU2Nzg5MSAgMSAtPiAtMTIzNDU2Nzg5MQorZGRteGcyMzQgbWF4bWFnIDEgLTEyMzQ1Njc4OTEgIC0+IC0xMjM0NTY3ODkxCitkZG14ZzIzNSBtYXhtYWcgLTEyMzQ1Njc4OTAxIDEgLT4gLTEyMzQ1Njc4OTAxCitkZG14ZzIzNiBtYXhtYWcgMSAtMTIzNDU2Nzg5MDEgLT4gLTEyMzQ1Njc4OTAxCitkZG14ZzIzNyBtYXhtYWcgLTEyMzQ1Njc4OTYgIDEgLT4gLTEyMzQ1Njc4OTYKK2RkbXhnMjM4IG1heG1hZyAxIC0xMjM0NTY3ODk2ICAtPiAtMTIzNDU2Nzg5NgorCistLSBmcm9tIGV4YW1wbGVzCitkZG14ZzI4MCBtYXhtYWcgJzMnICAgJzInICAtPiAgJzMnCitkZG14ZzI4MSBtYXhtYWcgJy0xMCcgJzMnICAtPiAgJy0xMCcKK2RkbXhnMjgyIG1heG1hZyAnMS4wJyAnMScgIC0+ICAnMScKK2RkbXhnMjgzIG1heG1hZyAnMScgJzEuMCcgIC0+ICAnMScKK2RkbXhnMjg0IG1heG1hZyAnNycgJ05hTicgIC0+ICAnNycKKworLS0gZXhwYW5kZWQgbGlzdCBmcm9tIG1pbi9tYXggNzU0ciBwdXJwbGUgcHJvc2UKKy0tIFtleHBsaWNpdCB0ZXN0cyBmb3IgZXhwb25lbnQgb3JkZXJpbmddCitkZG14ZzQwMSBtYXhtYWcgIEluZiAgICAxLjEgICAgIC0+ICBJbmZpbml0eQorZGRteGc0MDIgbWF4bWFnICAxLjEgICAgMSAgICAgICAtPiAgMS4xCitkZG14ZzQwMyBtYXhtYWcgIDEgICAgICAxLjAgICAgIC0+ICAxCitkZG14ZzQwNCBtYXhtYWcgIDEuMCAgICAwLjEgICAgIC0+ICAxLjAKK2RkbXhnNDA1IG1heG1hZyAgMC4xICAgIDAuMTAgICAgLT4gIDAuMQorZGRteGc0MDYgbWF4bWFnICAwLjEwICAgMC4xMDAgICAtPiAgMC4xMAorZGRteGc0MDcgbWF4bWFnICAwLjEwICAgMCAgICAgICAtPiAgMC4xMAorZGRteGc0MDggbWF4bWFnICAwICAgICAgMC4wICAgICAtPiAgMAorZGRteGc0MDkgbWF4bWFnICAwLjAgICAtMCAgICAgICAtPiAgMC4wCitkZG14ZzQxMCBtYXhtYWcgIDAuMCAgIC0wLjAgICAgIC0+ICAwLjAKK2RkbXhnNDExIG1heG1hZyAgMC4wMCAgLTAuMCAgICAgLT4gIDAuMDAKK2RkbXhnNDEyIG1heG1hZyAgMC4wICAgLTAuMDAgICAgLT4gIDAuMAorZGRteGc0MTMgbWF4bWFnICAwICAgICAtMC4wICAgICAtPiAgMAorZGRteGc0MTQgbWF4bWFnICAwICAgICAtMCAgICAgICAtPiAgMAorZGRteGc0MTUgbWF4bWFnIC0wLjAgICAtMCAgICAgICAtPiAtMC4wCitkZG14ZzQxNiBtYXhtYWcgLTAgICAgIC0wLjEwMCAgIC0+IC0wLjEwMAorZGRteGc0MTcgbWF4bWFnIC0wLjEwMCAtMC4xMCAgICAtPiAtMC4xMDAKK2RkbXhnNDE4IG1heG1hZyAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMTAKK2RkbXhnNDE5IG1heG1hZyAtMC4xICAgLTEuMCAgICAgLT4gLTEuMAorZGRteGc0MjAgbWF4bWFnIC0xLjAgICAtMSAgICAgICAtPiAtMS4wCitkZG14ZzQyMSBtYXhtYWcgLTEgICAgIC0xLjEgICAgIC0+IC0xLjEKK2RkbXhnNDIzIG1heG1hZyAtMS4xICAgLUluZiAgICAgLT4gLUluZmluaXR5CistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK2RkbXhnNDMxIG1heG1hZyAgMS4xICAgIEluZiAgICAgLT4gIEluZmluaXR5CitkZG14ZzQzMiBtYXhtYWcgIDEgICAgICAxLjEgICAgIC0+ICAxLjEKK2RkbXhnNDMzIG1heG1hZyAgMS4wICAgIDEgICAgICAgLT4gIDEKK2RkbXhnNDM0IG1heG1hZyAgMC4xICAgIDEuMCAgICAgLT4gIDEuMAorZGRteGc0MzUgbWF4bWFnICAwLjEwICAgMC4xICAgICAtPiAgMC4xCitkZG14ZzQzNiBtYXhtYWcgIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwCitkZG14ZzQzNyBtYXhtYWcgIDAgICAgICAwLjEwICAgIC0+ICAwLjEwCitkZG14ZzQzOCBtYXhtYWcgIDAuMCAgICAwICAgICAgIC0+ICAwCitkZG14ZzQzOSBtYXhtYWcgLTAgICAgICAwLjAgICAgIC0+ICAwLjAKK2RkbXhnNDQwIG1heG1hZyAtMC4wICAgIDAuMCAgICAgLT4gIDAuMAorZGRteGc0NDEgbWF4bWFnIC0wLjAgICAgMC4wMCAgICAtPiAgMC4wMAorZGRteGc0NDIgbWF4bWFnIC0wLjAwICAgMC4wICAgICAtPiAgMC4wCitkZG14ZzQ0MyBtYXhtYWcgLTAuMCAgICAwICAgICAgIC0+ICAwCitkZG14ZzQ0NCBtYXhtYWcgLTAgICAgICAwICAgICAgIC0+ICAwCitkZG14ZzQ0NSBtYXhtYWcgLTAgICAgIC0wLjAgICAgIC0+IC0wLjAKK2RkbXhnNDQ2IG1heG1hZyAtMC4xMDAgLTAgICAgICAgLT4gLTAuMTAwCitkZG14ZzQ0NyBtYXhtYWcgLTAuMTAgIC0wLjEwMCAgIC0+IC0wLjEwMAorZGRteGc0NDggbWF4bWFnIC0wLjEgICAtMC4xMCAgICAtPiAtMC4xMAorZGRteGc0NDkgbWF4bWFnIC0xLjAgICAtMC4xICAgICAtPiAtMS4wCitkZG14ZzQ1MCBtYXhtYWcgLTEgICAgIC0xLjAgICAgIC0+IC0xLjAKK2RkbXhnNDUxIG1heG1hZyAtMS4xICAgLTEgICAgICAgLT4gLTEuMQorZGRteGc0NTMgbWF4bWFnIC1JbmYgICAtMS4xICAgICAtPiAtSW5maW5pdHkKKy0tIGxhcmdpZXMKK2RkbXhnNDYwIG1heG1hZyAgMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK2RkbXhnNDYxIG1heG1hZyAgMUUrMyAgIDEwMDAgICAgLT4gIDFFKzMKK2RkbXhnNDYyIG1heG1hZyAgMTAwMCAgLTFFKzMgICAgLT4gIDEwMDAKK2RkbXhnNDYzIG1heG1hZyAgMUUrMyAgLTEwMDAgICAgLT4gIDFFKzMKK2RkbXhnNDY0IG1heG1hZyAtMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK2RkbXhnNDY1IG1heG1hZyAtMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK2RkbXhnNDY2IG1heG1hZyAtMTAwMCAgLTFFKzMgICAgLT4gLTEwMDAKK2RkbXhnNDY3IG1heG1hZyAtMUUrMyAgLTEwMDAgICAgLT4gLTEwMDAKKworLS0gc3Vibm9ybWFscworZGRteGc1MTAgbWF4bWFnICAxLjAwRS0zODMgICAgICAgMCAgLT4gICAxLjAwRS0zODMKK2RkbXhnNTExIG1heG1hZyAgMC4xRS0zODMgICAgICAgIDAgIC0+ICAgMUUtMzg0ICAgIFN1Ym5vcm1hbAorZGRteGc1MTIgbWF4bWFnICAwLjEwRS0zODMgICAgICAgMCAgLT4gICAxLjBFLTM4NCAgU3Vibm9ybWFsCitkZG14ZzUxMyBtYXhtYWcgIDAuMTAwRS0zODMgICAgICAwICAtPiAgIDEuMDBFLTM4NCBTdWJub3JtYWwKK2RkbXhnNTE0IG1heG1hZyAgMC4wMUUtMzgzICAgICAgIDAgIC0+ICAgMUUtMzg1ICAgIFN1Ym5vcm1hbAorZGRteGc1MTUgbWF4bWFnICAwLjk5OUUtMzgzICAgICAgMCAgLT4gICA5Ljk5RS0zODQgU3Vibm9ybWFsCitkZG14ZzUxNiBtYXhtYWcgIDAuMDk5RS0zODMgICAgICAwICAtPiAgIDkuOUUtMzg1ICBTdWJub3JtYWwKK2RkbXhnNTE3IG1heG1hZyAgMC4wMDlFLTM4MyAgICAgIDAgIC0+ICAgOUUtMzg2ICAgIFN1Ym5vcm1hbAorZGRteGc1MTggbWF4bWFnICAwLjAwMUUtMzgzICAgICAgMCAgLT4gICAxRS0zODYgICAgU3Vibm9ybWFsCitkZG14ZzUxOSBtYXhtYWcgIDAuMDAwOUUtMzgzICAgICAwICAtPiAgIDlFLTM4NyAgICBTdWJub3JtYWwKK2RkbXhnNTIwIG1heG1hZyAgMC4wMDAxRS0zODMgICAgIDAgIC0+ICAgMUUtMzg3ICAgIFN1Ym5vcm1hbAorCitkZG14ZzUzMCBtYXhtYWcgLTEuMDBFLTM4MyAgICAgICAwICAtPiAgLTEuMDBFLTM4MworZGRteGc1MzEgbWF4bWFnIC0wLjFFLTM4MyAgICAgICAgMCAgLT4gIC0xRS0zODQgICAgU3Vibm9ybWFsCitkZG14ZzUzMiBtYXhtYWcgLTAuMTBFLTM4MyAgICAgICAwICAtPiAgLTEuMEUtMzg0ICBTdWJub3JtYWwKK2RkbXhnNTMzIG1heG1hZyAtMC4xMDBFLTM4MyAgICAgIDAgIC0+ICAtMS4wMEUtMzg0IFN1Ym5vcm1hbAorZGRteGc1MzQgbWF4bWFnIC0wLjAxRS0zODMgICAgICAgMCAgLT4gIC0xRS0zODUgICAgU3Vibm9ybWFsCitkZG14ZzUzNSBtYXhtYWcgLTAuOTk5RS0zODMgICAgICAwICAtPiAgLTkuOTlFLTM4NCBTdWJub3JtYWwKK2RkbXhnNTM2IG1heG1hZyAtMC4wOTlFLTM4MyAgICAgIDAgIC0+ICAtOS45RS0zODUgIFN1Ym5vcm1hbAorZGRteGc1MzcgbWF4bWFnIC0wLjAwOUUtMzgzICAgICAgMCAgLT4gIC05RS0zODYgICAgU3Vibm9ybWFsCitkZG14ZzUzOCBtYXhtYWcgLTAuMDAxRS0zODMgICAgICAwICAtPiAgLTFFLTM4NiAgICBTdWJub3JtYWwKK2RkbXhnNTM5IG1heG1hZyAtMC4wMDA5RS0zODMgICAgIDAgIC0+ICAtOUUtMzg3ICAgIFN1Ym5vcm1hbAorZGRteGc1NDAgbWF4bWFnIC0wLjAwMDFFLTM4MyAgICAgMCAgLT4gIC0xRS0zODcgICAgU3Vibm9ybWFsCisKKy0tIE51bGwgdGVzdHMKK2RkbXhnOTAwIG1heG1hZyAxMCAgIyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG14ZzkwMSBtYXhtYWcgICMgMTAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWluLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWluLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5NDJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNaW4uZGVjVGVzdApAQCAtMCwwICsxLDMwOSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE1pbi5kZWNUZXN0IC0tIGRlY0RvdWJsZSBtaW5udW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRtaW4wMDEgbWluICAtMiAgLTIgIC0+IC0yCitkZG1pbjAwMiBtaW4gIC0yICAtMSAgLT4gLTIKK2RkbWluMDAzIG1pbiAgLTIgICAwICAtPiAtMgorZGRtaW4wMDQgbWluICAtMiAgIDEgIC0+IC0yCitkZG1pbjAwNSBtaW4gIC0yICAgMiAgLT4gLTIKK2RkbWluMDA2IG1pbiAgLTEgIC0yICAtPiAtMgorZGRtaW4wMDcgbWluICAtMSAgLTEgIC0+IC0xCitkZG1pbjAwOCBtaW4gIC0xICAgMCAgLT4gLTEKK2RkbWluMDA5IG1pbiAgLTEgICAxICAtPiAtMQorZGRtaW4wMTAgbWluICAtMSAgIDIgIC0+IC0xCitkZG1pbjAxMSBtaW4gICAwICAtMiAgLT4gLTIKK2RkbWluMDEyIG1pbiAgIDAgIC0xICAtPiAtMQorZGRtaW4wMTMgbWluICAgMCAgIDAgIC0+ICAwCitkZG1pbjAxNCBtaW4gICAwICAgMSAgLT4gIDAKK2RkbWluMDE1IG1pbiAgIDAgICAyICAtPiAgMAorZGRtaW4wMTYgbWluICAgMSAgLTIgIC0+IC0yCitkZG1pbjAxNyBtaW4gICAxICAtMSAgLT4gLTEKK2RkbWluMDE4IG1pbiAgIDEgICAwICAtPiAgMAorZGRtaW4wMTkgbWluICAgMSAgIDEgIC0+ICAxCitkZG1pbjAyMCBtaW4gICAxICAgMiAgLT4gIDEKK2RkbWluMDIxIG1pbiAgIDIgIC0yICAtPiAtMgorZGRtaW4wMjIgbWluICAgMiAgLTEgIC0+IC0xCitkZG1pbjAyMyBtaW4gICAyICAgMCAgLT4gIDAKK2RkbWluMDI1IG1pbiAgIDIgICAxICAtPiAgMQorZGRtaW4wMjYgbWluICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCitkZG1pbjAzMCBtaW4gICAwICAgICAwICAgLT4gIDAKK2RkbWluMDMxIG1pbiAgIDAgICAgLTAgICAtPiAtMAorZGRtaW4wMzIgbWluICAgMCAgICAtMC4wIC0+IC0wLjAKK2RkbWluMDMzIG1pbiAgIDAgICAgIDAuMCAtPiAgMC4wCitkZG1pbjAzNCBtaW4gIC0wICAgICAwICAgLT4gLTAKK2RkbWluMDM1IG1pbiAgLTAgICAgLTAgICAtPiAtMAorZGRtaW4wMzYgbWluICAtMCAgICAtMC4wIC0+IC0wCitkZG1pbjAzNyBtaW4gIC0wICAgICAwLjAgLT4gLTAKK2RkbWluMDM4IG1pbiAgIDAuMCAgIDAgICAtPiAgMC4wCitkZG1pbjAzOSBtaW4gICAwLjAgIC0wICAgLT4gLTAKK2RkbWluMDQwIG1pbiAgIDAuMCAgLTAuMCAtPiAtMC4wCitkZG1pbjA0MSBtaW4gICAwLjAgICAwLjAgLT4gIDAuMAorZGRtaW4wNDIgbWluICAtMC4wICAgMCAgIC0+IC0wLjAKK2RkbWluMDQzIG1pbiAgLTAuMCAgLTAgICAtPiAtMAorZGRtaW4wNDQgbWluICAtMC4wICAtMC4wIC0+IC0wLjAKK2RkbWluMDQ1IG1pbiAgLTAuMCAgIDAuMCAtPiAtMC4wCisKK2RkbWluMDQ2IG1pbiAgIDBFMSAgLTBFMSAtPiAtMEUrMQorZGRtaW4wNDcgbWluICAtMEUxICAgMEUyIC0+IC0wRSsxCitkZG1pbjA0OCBtaW4gICAwRTIgICAwRTEgLT4gIDBFKzEKK2RkbWluMDQ5IG1pbiAgIDBFMSAgIDBFMiAtPiAgMEUrMQorZGRtaW4wNTAgbWluICAtMEUzICAtMEUyIC0+IC0wRSszCitkZG1pbjA1MSBtaW4gIC0wRTIgIC0wRTMgLT4gLTBFKzMKKworLS0gU3BlY2lhbHMKK2RkbWluMDkwIG1pbiAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjA5MSBtaW4gIEluZiAgLTEwMDAgIC0+IC0xMDAwCitkZG1pbjA5MiBtaW4gIEluZiAgLTEgICAgIC0+IC0xCitkZG1pbjA5MyBtaW4gIEluZiAgLTAgICAgIC0+IC0wCitkZG1pbjA5NCBtaW4gIEluZiAgIDAgICAgIC0+ICAwCitkZG1pbjA5NSBtaW4gIEluZiAgIDEgICAgIC0+ICAxCitkZG1pbjA5NiBtaW4gIEluZiAgIDEwMDAgIC0+ICAxMDAwCitkZG1pbjA5NyBtaW4gIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtaW4wOTggbWluIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZGRtaW4wOTkgbWluIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTAwIG1pbiAtMSAgICAgSW5mICAgLT4gLTEKK2RkbWluMTAxIG1pbiAtMCAgICAgSW5mICAgLT4gLTAKK2RkbWluMTAyIG1pbiAgMCAgICAgSW5mICAgLT4gIDAKK2RkbWluMTAzIG1pbiAgMSAgICAgSW5mICAgLT4gIDEKK2RkbWluMTA0IG1pbiAgMTAwMCAgSW5mICAgLT4gIDEwMDAKK2RkbWluMTA1IG1pbiAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbWluMTIwIG1pbiAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjEyMSBtaW4gLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZGRtaW4xMjIgbWluIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RkbWluMTIzIG1pbiAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkZG1pbjEyNCBtaW4gLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZGRtaW4xMjUgbWluIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RkbWluMTI2IG1pbiAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZG1pbjEyNyBtaW4gLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZGRtaW4xMjggbWluIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTI5IG1pbiAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjEzMCBtaW4gLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtaW4xMzEgbWluIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTMyIG1pbiAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjEzMyBtaW4gIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZGRtaW4xMzQgbWluICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbWluMTM1IG1pbiAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CisKKy0tIDIwMDQuMDguMDIgNzU0ciBjaG9vc2VzIG51bWJlciBvdmVyIE5hTiBpbiBtaXhlZCBjYXNlcworZGRtaW4xNDEgbWluICBOYU4gLUluZiAgICAtPiAgLUluZmluaXR5CitkZG1pbjE0MiBtaW4gIE5hTiAtMTAwMCAgIC0+ICAtMTAwMAorZGRtaW4xNDMgbWluICBOYU4gLTEgICAgICAtPiAgLTEKK2RkbWluMTQ0IG1pbiAgTmFOIC0wICAgICAgLT4gIC0wCitkZG1pbjE0NSBtaW4gIE5hTiAgMCAgICAgIC0+ICAwCitkZG1pbjE0NiBtaW4gIE5hTiAgMSAgICAgIC0+ICAxCitkZG1pbjE0NyBtaW4gIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitkZG1pbjE0OCBtaW4gIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorZGRtaW4xNDkgbWluICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZG1pbjE1MCBtaW4gLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorZGRtaW4xNTEgbWluIC0xMDAwIE5hTiAgICAtPiAtMTAwMAorZGRtaW4xNTIgbWluIC0xICAgLU5hTiAgICAtPiAtMQorZGRtaW4xNTMgbWluIC0wICAgIE5hTiAgICAtPiAtMAorZGRtaW4xNTQgbWluICAwICAgLU5hTiAgICAtPiAgMAorZGRtaW4xNTUgbWluICAxICAgIE5hTiAgICAtPiAgMQorZGRtaW4xNTYgbWluICAxMDAwIE5hTiAgICAtPiAgMTAwMAorZGRtaW4xNTcgbWluICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworZGRtaW4xNjEgbWluICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjIgbWluICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjMgbWluICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjQgbWluICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjUgbWluIC1zTmFOICAwICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjYgbWluIC1zTmFOICAxICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjcgbWluICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjggbWluICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNjkgbWluICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzAgbWluICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzEgbWluIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzIgbWluIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzMgbWluIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzQgbWluIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzUgbWluICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzYgbWluICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzcgbWluICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzggbWluICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xNzkgbWluICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZG1pbjE4MSBtaW4gIE5hTjkgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1pbjE4MiBtaW4gLU5hTjggICAgOTk5MCAgLT4gIDk5OTAKK2RkbWluMTgzIG1pbiAgTmFONzEgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRtaW4xODQgbWluICBOYU4xICAgIE5hTjU0IC0+ICBOYU4xCitkZG1pbjE4NSBtaW4gIE5hTjIyICAtTmFONTMgLT4gIE5hTjIyCitkZG1pbjE4NiBtaW4gLU5hTjMgICAgTmFONiAgLT4gLU5hTjMKK2RkbWluMTg3IG1pbiAtTmFONDQgICBOYU43ICAtPiAtTmFONDQKKworZGRtaW4xODggbWluIC1JbmYgICAgIE5hTjQxIC0+IC1JbmZpbml0eQorZGRtaW4xODkgbWluIC05OTk5ICAgLU5hTjMzIC0+IC05OTk5CitkZG1pbjE5MCBtaW4gIEluZiAgICAgTmFOMiAgLT4gIEluZmluaXR5CisKK2RkbWluMTkxIG1pbiAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE5MiBtaW4gIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xOTMgbWluIC1zTmFOOTcgIE5hTjggICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkbWluMTk0IG1pbiAgc05hTjY5IHNOYU45NCAgLT4gIE5hTjY5IEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE5NSBtaW4gIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xOTYgbWluIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkbWluMTk3IG1pbiAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjE5OCBtaW4gIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRtaW4xOTkgbWluICBOYU4gICAgc05hTjg2ICAtPiAgTmFOODYgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb2xkIHJvdW5kaW5nIGNoZWNrcworZGRtaW4yMjEgbWluIC0xMjM0NTY3ODAwMCAxICAtPiAtMTIzNDU2NzgwMDAKK2RkbWluMjIyIG1pbiAxIC0xMjM0NTY3ODAwMCAgLT4gLTEyMzQ1Njc4MDAwCitkZG1pbjIyMyBtaW4gLTEyMzQ1Njc4MDAgIDEgIC0+IC0xMjM0NTY3ODAwCitkZG1pbjIyNCBtaW4gMSAtMTIzNDU2NzgwMCAgIC0+IC0xMjM0NTY3ODAwCitkZG1pbjIyNSBtaW4gLTEyMzQ1Njc4OTAgIDEgIC0+IC0xMjM0NTY3ODkwCitkZG1pbjIyNiBtaW4gMSAtMTIzNDU2Nzg5MCAgIC0+IC0xMjM0NTY3ODkwCitkZG1pbjIyNyBtaW4gLTEyMzQ1Njc4OTEgIDEgIC0+IC0xMjM0NTY3ODkxCitkZG1pbjIyOCBtaW4gMSAtMTIzNDU2Nzg5MSAgIC0+IC0xMjM0NTY3ODkxCitkZG1pbjIyOSBtaW4gLTEyMzQ1Njc4OTAxIDEgIC0+IC0xMjM0NTY3ODkwMQorZGRtaW4yMzAgbWluIDEgLTEyMzQ1Njc4OTAxICAtPiAtMTIzNDU2Nzg5MDEKK2RkbWluMjMxIG1pbiAtMTIzNDU2Nzg5NiAgMSAgLT4gLTEyMzQ1Njc4OTYKK2RkbWluMjMyIG1pbiAxIC0xMjM0NTY3ODk2ICAgLT4gLTEyMzQ1Njc4OTYKK2RkbWluMjMzIG1pbiAxMjM0NTY3ODkxICAxICAgLT4gMQorZGRtaW4yMzQgbWluIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkZG1pbjIzNSBtaW4gMTIzNDU2Nzg5MDEgMSAgIC0+IDEKK2RkbWluMjM2IG1pbiAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZGRtaW4yMzcgbWluIDEyMzQ1Njc4OTYgIDEgICAtPiAxCitkZG1pbjIzOCBtaW4gMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworZGRtaW4yODAgbWluICczJyAgICcyJyAgLT4gICcyJworZGRtaW4yODEgbWluICctMTAnICczJyAgLT4gICctMTAnCitkZG1pbjI4MiBtaW4gJzEuMCcgJzEnICAtPiAgJzEuMCcKK2RkbWluMjgzIG1pbiAnMScgJzEuMCcgIC0+ICAnMS4wJworZGRtaW4yODQgbWluICc3JyAnTmFOJyAgLT4gICc3JworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK2RkbWluNDAxIG1pbiAgSW5mICAgIDEuMSAgICAgLT4gIDEuMQorZGRtaW40MDIgbWluICAxLjEgICAgMSAgICAgICAtPiAgMQorZGRtaW40MDMgbWluICAxICAgICAgMS4wICAgICAtPiAgMS4wCitkZG1pbjQwNCBtaW4gIDEuMCAgICAwLjEgICAgIC0+ICAwLjEKK2RkbWluNDA1IG1pbiAgMC4xICAgIDAuMTAgICAgLT4gIDAuMTAKK2RkbWluNDA2IG1pbiAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAwCitkZG1pbjQwNyBtaW4gIDAuMTAgICAwICAgICAgIC0+ICAwCitkZG1pbjQwOCBtaW4gIDAgICAgICAwLjAgICAgIC0+ICAwLjAKK2RkbWluNDA5IG1pbiAgMC4wICAgLTAgICAgICAgLT4gLTAKK2RkbWluNDEwIG1pbiAgMC4wICAgLTAuMCAgICAgLT4gLTAuMAorZGRtaW40MTEgbWluICAwLjAwICAtMC4wICAgICAtPiAtMC4wCitkZG1pbjQxMiBtaW4gIDAuMCAgIC0wLjAwICAgIC0+IC0wLjAwCitkZG1pbjQxMyBtaW4gIDAgICAgIC0wLjAgICAgIC0+IC0wLjAKK2RkbWluNDE0IG1pbiAgMCAgICAgLTAgICAgICAgLT4gLTAKK2RkbWluNDE1IG1pbiAtMC4wICAgLTAgICAgICAgLT4gLTAKK2RkbWluNDE2IG1pbiAtMCAgICAgLTAuMTAwICAgLT4gLTAuMTAwCitkZG1pbjQxNyBtaW4gLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwCitkZG1pbjQxOCBtaW4gLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEKK2RkbWluNDE5IG1pbiAtMC4xICAgLTEuMCAgICAgLT4gLTEuMAorZGRtaW40MjAgbWluIC0xLjAgICAtMSAgICAgICAtPiAtMQorZGRtaW40MjEgbWluIC0xICAgICAtMS4xICAgICAtPiAtMS4xCitkZG1pbjQyMyBtaW4gLTEuMSAgIC1JbmYgICAgIC0+IC1JbmZpbml0eQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCitkZG1pbjQzMSBtaW4gIDEuMSAgICBJbmYgICAgIC0+ICAxLjEKK2RkbWluNDMyIG1pbiAgMSAgICAgIDEuMSAgICAgLT4gIDEKK2RkbWluNDMzIG1pbiAgMS4wICAgIDEgICAgICAgLT4gIDEuMAorZGRtaW40MzQgbWluICAwLjEgICAgMS4wICAgICAtPiAgMC4xCitkZG1pbjQzNSBtaW4gIDAuMTAgICAwLjEgICAgIC0+ICAwLjEwCitkZG1pbjQzNiBtaW4gIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwMAorZGRtaW40MzcgbWluICAwICAgICAgMC4xMCAgICAtPiAgMAorZGRtaW40MzggbWluICAwLjAgICAgMCAgICAgICAtPiAgMC4wCitkZG1pbjQzOSBtaW4gLTAgICAgICAwLjAgICAgIC0+IC0wCitkZG1pbjQ0MCBtaW4gLTAuMCAgICAwLjAgICAgIC0+IC0wLjAKK2RkbWluNDQxIG1pbiAtMC4wICAgIDAuMDAgICAgLT4gLTAuMAorZGRtaW40NDIgbWluIC0wLjAwICAgMC4wICAgICAtPiAtMC4wMAorZGRtaW40NDMgbWluIC0wLjAgICAgMCAgICAgICAtPiAtMC4wCitkZG1pbjQ0NCBtaW4gLTAgICAgICAwICAgICAgIC0+IC0wCitkZG1pbjQ0NSBtaW4gLTAgICAgIC0wLjAgICAgIC0+IC0wCitkZG1pbjQ0NiBtaW4gLTAuMTAwIC0wICAgICAgIC0+IC0wLjEwMAorZGRtaW40NDcgbWluIC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMAorZGRtaW40NDggbWluIC0wLjEgICAtMC4xMCAgICAtPiAtMC4xCitkZG1pbjQ0OSBtaW4gLTEuMCAgIC0wLjEgICAgIC0+IC0xLjAKK2RkbWluNDUwIG1pbiAtMSAgICAgLTEuMCAgICAgLT4gLTEKK2RkbWluNDUxIG1pbiAtMS4xICAgLTEgICAgICAgLT4gLTEuMQorZGRtaW40NTMgbWluIC1JbmYgICAtMS4xICAgICAtPiAtSW5maW5pdHkKKy0tIGxhcmdpZXMKK2RkbWluNDYwIG1pbiAgMTAwMCAgIDFFKzMgICAgLT4gIDEwMDAKK2RkbWluNDYxIG1pbiAgMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK2RkbWluNDYyIG1pbiAgMTAwMCAgLTFFKzMgICAgLT4gLTFFKzMKK2RkbWluNDYzIG1pbiAgMUUrMyAgLTM4NCAgICAtPiAtMzg0CitkZG1pbjQ2NCBtaW4gLTM4NCAgIDFFKzMgICAgLT4gLTM4NAorZGRtaW40NjUgbWluIC0xRSszICAgMTAwMCAgICAtPiAtMUUrMworZGRtaW40NjYgbWluIC0zODQgIC0xRSszICAgIC0+IC0xRSszCitkZG1pbjQ2NyBtaW4gLTFFKzMgIC0zODQgICAgLT4gLTFFKzMKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitkZG1pbjQ3MSBtaW4gICAgICAxLjAgICAgICAgMC4xICAtPiAwLjEKK2RkbWluNDcyIG1pbiAgICAgIDAuMSAgICAgICAxLjAgIC0+IDAuMQorZGRtaW40NzMgbWluICAgICAxMC4wICAgICAgIDAuMSAgLT4gMC4xCitkZG1pbjQ3NCBtaW4gICAgICAwLjEgICAgICAxMC4wICAtPiAwLjEKK2RkbWluNDc1IG1pbiAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEuMAorZGRtaW40NzYgbWluICAgICAgMS4wICAgICAgIDEwMCAgLT4gMS4wCitkZG1pbjQ3NyBtaW4gICAgIDEwMDAgICAgICAxMC4wICAtPiAxMC4wCitkZG1pbjQ3OCBtaW4gICAgIDEwLjAgICAgICAxMDAwICAtPiAxMC4wCitkZG1pbjQ3OSBtaW4gICAgMTAwMDAgICAgIDEwMC4wICAtPiAxMDAuMAorZGRtaW40ODAgbWluICAgIDEwMC4wICAgICAxMDAwMCAgLT4gMTAwLjAKK2RkbWluNDgxIG1pbiAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEwMDAuMAorZGRtaW40ODIgbWluICAgMTAwMC4wICAgIDEwMDAwMCAgLT4gMTAwMC4wCitkZG1pbjQ4MyBtaW4gIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxMDAwMC4wCitkZG1pbjQ4NCBtaW4gIDEwMDAwLjAgICAxMDAwMDAwICAtPiAxMDAwMC4wCisKKy0tIHN1Ym5vcm1hbHMKK2RkbWluNTEwIG1pbiAgMS4wMEUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtaW41MTEgbWluICAwLjFFLTM4MyAgICAgICAgMCAgLT4gICAwCitkZG1pbjUxMiBtaW4gIDAuMTBFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbWluNTEzIG1pbiAgMC4xMDBFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtaW41MTQgbWluICAwLjAxRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1pbjUxNSBtaW4gIDAuOTk5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbWluNTE2IG1pbiAgMC4wOTlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtaW41MTcgbWluICAwLjAwOUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1pbjUxOCBtaW4gIDAuMDAxRS0zODMgICAgICAwICAtPiAgIDAKK2RkbWluNTE5IG1pbiAgMC4wMDA5RS0zODMgICAgIDAgIC0+ICAgMAorZGRtaW41MjAgbWluICAwLjAwMDFFLTM4MyAgICAgMCAgLT4gICAwCisKK2RkbWluNTMwIG1pbiAtMS4wMEUtMzgzICAgICAgIDAgIC0+ICAtMS4wMEUtMzgzCitkZG1pbjUzMSBtaW4gLTAuMUUtMzgzICAgICAgICAwICAtPiAgLTFFLTM4NCAgICBTdWJub3JtYWwKK2RkbWluNTMyIG1pbiAtMC4xMEUtMzgzICAgICAgIDAgIC0+ICAtMS4wRS0zODQgIFN1Ym5vcm1hbAorZGRtaW41MzMgbWluIC0wLjEwMEUtMzgzICAgICAgMCAgLT4gIC0xLjAwRS0zODQgU3Vibm9ybWFsCitkZG1pbjUzNCBtaW4gLTAuMDFFLTM4MyAgICAgICAwICAtPiAgLTFFLTM4NSAgICBTdWJub3JtYWwKK2RkbWluNTM1IG1pbiAtMC45OTlFLTM4MyAgICAgIDAgIC0+ICAtOS45OUUtMzg0IFN1Ym5vcm1hbAorZGRtaW41MzYgbWluIC0wLjA5OUUtMzgzICAgICAgMCAgLT4gIC05LjlFLTM4NSAgU3Vibm9ybWFsCitkZG1pbjUzNyBtaW4gLTAuMDA5RS0zODMgICAgICAwICAtPiAgLTlFLTM4NiAgICBTdWJub3JtYWwKK2RkbWluNTM4IG1pbiAtMC4wMDFFLTM4MyAgICAgIDAgIC0+ICAtMUUtMzg2ICAgIFN1Ym5vcm1hbAorZGRtaW41MzkgbWluIC0wLjAwMDlFLTM4MyAgICAgMCAgLT4gIC05RS0zODcgICAgU3Vibm9ybWFsCitkZG1pbjU0MCBtaW4gLTAuMDAwMUUtMzgzICAgICAwICAtPiAgLTFFLTM4NyAgICBTdWJub3JtYWwKKworCistLSBOdWxsIHRlc3RzCitkZG1pbjkwMCBtaW4gMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG1pbjkwMSBtaW4gICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWluTWFnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWluTWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxMmYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNaW5NYWcuZGVjVGVzdApAQCAtMCwwICsxLDI5MyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE1pbk1hZy5kZWNUZXN0IC0tIGRlY0RvdWJsZSBtaW5udW1tYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRtbmcwMDEgbWlubWFnICAtMiAgLTIgIC0+IC0yCitkZG1uZzAwMiBtaW5tYWcgIC0yICAtMSAgLT4gLTEKK2RkbW5nMDAzIG1pbm1hZyAgLTIgICAwICAtPiAgMAorZGRtbmcwMDQgbWlubWFnICAtMiAgIDEgIC0+ICAxCitkZG1uZzAwNSBtaW5tYWcgIC0yICAgMiAgLT4gLTIKK2RkbW5nMDA2IG1pbm1hZyAgLTEgIC0yICAtPiAtMQorZGRtbmcwMDcgbWlubWFnICAtMSAgLTEgIC0+IC0xCitkZG1uZzAwOCBtaW5tYWcgIC0xICAgMCAgLT4gIDAKK2RkbW5nMDA5IG1pbm1hZyAgLTEgICAxICAtPiAtMQorZGRtbmcwMTAgbWlubWFnICAtMSAgIDIgIC0+IC0xCitkZG1uZzAxMSBtaW5tYWcgICAwICAtMiAgLT4gIDAKK2RkbW5nMDEyIG1pbm1hZyAgIDAgIC0xICAtPiAgMAorZGRtbmcwMTMgbWlubWFnICAgMCAgIDAgIC0+ICAwCitkZG1uZzAxNCBtaW5tYWcgICAwICAgMSAgLT4gIDAKK2RkbW5nMDE1IG1pbm1hZyAgIDAgICAyICAtPiAgMAorZGRtbmcwMTYgbWlubWFnICAgMSAgLTIgIC0+ICAxCitkZG1uZzAxNyBtaW5tYWcgICAxICAtMSAgLT4gLTEKK2RkbW5nMDE4IG1pbm1hZyAgIDEgICAwICAtPiAgMAorZGRtbmcwMTkgbWlubWFnICAgMSAgIDEgIC0+ICAxCitkZG1uZzAyMCBtaW5tYWcgICAxICAgMiAgLT4gIDEKK2RkbW5nMDIxIG1pbm1hZyAgIDIgIC0yICAtPiAtMgorZGRtbmcwMjIgbWlubWFnICAgMiAgLTEgIC0+IC0xCitkZG1uZzAyMyBtaW5tYWcgICAyICAgMCAgLT4gIDAKK2RkbW5nMDI1IG1pbm1hZyAgIDIgICAxICAtPiAgMQorZGRtbmcwMjYgbWlubWFnICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCitkZG1uZzAzMCBtaW5tYWcgICAwICAgICAwICAgLT4gIDAKK2RkbW5nMDMxIG1pbm1hZyAgIDAgICAgLTAgICAtPiAtMAorZGRtbmcwMzIgbWlubWFnICAgMCAgICAtMC4wIC0+IC0wLjAKK2RkbW5nMDMzIG1pbm1hZyAgIDAgICAgIDAuMCAtPiAgMC4wCitkZG1uZzAzNCBtaW5tYWcgIC0wICAgICAwICAgLT4gLTAKK2RkbW5nMDM1IG1pbm1hZyAgLTAgICAgLTAgICAtPiAtMAorZGRtbmcwMzYgbWlubWFnICAtMCAgICAtMC4wIC0+IC0wCitkZG1uZzAzNyBtaW5tYWcgIC0wICAgICAwLjAgLT4gLTAKK2RkbW5nMDM4IG1pbm1hZyAgIDAuMCAgIDAgICAtPiAgMC4wCitkZG1uZzAzOSBtaW5tYWcgICAwLjAgIC0wICAgLT4gLTAKK2RkbW5nMDQwIG1pbm1hZyAgIDAuMCAgLTAuMCAtPiAtMC4wCitkZG1uZzA0MSBtaW5tYWcgICAwLjAgICAwLjAgLT4gIDAuMAorZGRtbmcwNDIgbWlubWFnICAtMC4wICAgMCAgIC0+IC0wLjAKK2RkbW5nMDQzIG1pbm1hZyAgLTAuMCAgLTAgICAtPiAtMAorZGRtbmcwNDQgbWlubWFnICAtMC4wICAtMC4wIC0+IC0wLjAKK2RkbW5nMDQ1IG1pbm1hZyAgLTAuMCAgIDAuMCAtPiAtMC4wCisKK2RkbW5nMDQ2IG1pbm1hZyAgIDBFMSAgLTBFMSAtPiAtMEUrMQorZGRtbmcwNDcgbWlubWFnICAtMEUxICAgMEUyIC0+IC0wRSsxCitkZG1uZzA0OCBtaW5tYWcgICAwRTIgICAwRTEgLT4gIDBFKzEKK2RkbW5nMDQ5IG1pbm1hZyAgIDBFMSAgIDBFMiAtPiAgMEUrMQorZGRtbmcwNTAgbWlubWFnICAtMEUzICAtMEUyIC0+IC0wRSszCitkZG1uZzA1MSBtaW5tYWcgIC0wRTIgIC0wRTMgLT4gLTBFKzMKKworLS0gU3BlY2lhbHMKK2RkbW5nMDkwIG1pbm1hZyAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1uZzA5MSBtaW5tYWcgIEluZiAgLTEwMDAgIC0+IC0xMDAwCitkZG1uZzA5MiBtaW5tYWcgIEluZiAgLTEgICAgIC0+IC0xCitkZG1uZzA5MyBtaW5tYWcgIEluZiAgLTAgICAgIC0+IC0wCitkZG1uZzA5NCBtaW5tYWcgIEluZiAgIDAgICAgIC0+ICAwCitkZG1uZzA5NSBtaW5tYWcgIEluZiAgIDEgICAgIC0+ICAxCitkZG1uZzA5NiBtaW5tYWcgIEluZiAgIDEwMDAgIC0+ICAxMDAwCitkZG1uZzA5NyBtaW5tYWcgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtbmcwOTggbWlubWFnIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZGRtbmcwOTkgbWlubWFnIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2RkbW5nMTAwIG1pbm1hZyAtMSAgICAgSW5mICAgLT4gLTEKK2RkbW5nMTAxIG1pbm1hZyAtMCAgICAgSW5mICAgLT4gLTAKK2RkbW5nMTAyIG1pbm1hZyAgMCAgICAgSW5mICAgLT4gIDAKK2RkbW5nMTAzIG1pbm1hZyAgMSAgICAgSW5mICAgLT4gIDEKK2RkbW5nMTA0IG1pbm1hZyAgMTAwMCAgSW5mICAgLT4gIDEwMDAKK2RkbW5nMTA1IG1pbm1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbW5nMTIwIG1pbm1hZyAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1uZzEyMSBtaW5tYWcgLUluZiAgLTEwMDAgIC0+IC0xMDAwCitkZG1uZzEyMiBtaW5tYWcgLUluZiAgLTEgICAgIC0+IC0xCitkZG1uZzEyMyBtaW5tYWcgLUluZiAgLTAgICAgIC0+IC0wCitkZG1uZzEyNCBtaW5tYWcgLUluZiAgIDAgICAgIC0+ICAwCitkZG1uZzEyNSBtaW5tYWcgLUluZiAgIDEgICAgIC0+ICAxCitkZG1uZzEyNiBtaW5tYWcgLUluZiAgIDEwMDAgIC0+ICAxMDAwCitkZG1uZzEyNyBtaW5tYWcgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZGRtbmcxMjggbWlubWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbW5nMTI5IG1pbm1hZyAtMTAwMCAtSW5mICAgLT4gLTEwMDAKK2RkbW5nMTMwIG1pbm1hZyAtMSAgICAtSW5mICAgLT4gLTEKK2RkbW5nMTMxIG1pbm1hZyAtMCAgICAtSW5mICAgLT4gLTAKK2RkbW5nMTMyIG1pbm1hZyAgMCAgICAtSW5mICAgLT4gIDAKK2RkbW5nMTMzIG1pbm1hZyAgMSAgICAtSW5mICAgLT4gIDEKK2RkbW5nMTM0IG1pbm1hZyAgMTAwMCAtSW5mICAgLT4gIDEwMDAKK2RkbW5nMTM1IG1pbm1hZyAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CisKKy0tIDIwMDQuMDguMDIgNzU0ciBjaG9vc2VzIG51bWJlciBvdmVyIE5hTiBpbiBtaXhlZCBjYXNlcworZGRtbmcxNDEgbWlubWFnICBOYU4gLUluZiAgICAtPiAgLUluZmluaXR5CitkZG1uZzE0MiBtaW5tYWcgIE5hTiAtMTAwMCAgIC0+ICAtMTAwMAorZGRtbmcxNDMgbWlubWFnICBOYU4gLTEgICAgICAtPiAgLTEKK2RkbW5nMTQ0IG1pbm1hZyAgTmFOIC0wICAgICAgLT4gIC0wCitkZG1uZzE0NSBtaW5tYWcgIE5hTiAgMCAgICAgIC0+ICAwCitkZG1uZzE0NiBtaW5tYWcgIE5hTiAgMSAgICAgIC0+ICAxCitkZG1uZzE0NyBtaW5tYWcgIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitkZG1uZzE0OCBtaW5tYWcgIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorZGRtbmcxNDkgbWlubWFnICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZG1uZzE1MCBtaW5tYWcgLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorZGRtbmcxNTEgbWlubWFnIC0xMDAwIE5hTiAgICAtPiAtMTAwMAorZGRtbmcxNTIgbWlubWFnIC0xICAgLU5hTiAgICAtPiAtMQorZGRtbmcxNTMgbWlubWFnIC0wICAgIE5hTiAgICAtPiAtMAorZGRtbmcxNTQgbWlubWFnICAwICAgLU5hTiAgICAtPiAgMAorZGRtbmcxNTUgbWlubWFnICAxICAgIE5hTiAgICAtPiAgMQorZGRtbmcxNTYgbWlubWFnICAxMDAwIE5hTiAgICAtPiAgMTAwMAorZGRtbmcxNTcgbWlubWFnICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworZGRtbmcxNjEgbWlubWFnICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjIgbWlubWFnICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjMgbWlubWFnICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjQgbWlubWFnICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjUgbWlubWFnIC1zTmFOICAwICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjYgbWlubWFnIC1zTmFOICAxICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjcgbWlubWFnICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjggbWlubWFnICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNjkgbWlubWFnICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzAgbWlubWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzEgbWlubWFnIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzIgbWlubWFnIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzMgbWlubWFnIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzQgbWlubWFnIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzUgbWlubWFnICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzYgbWlubWFnICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzcgbWlubWFnICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzggbWlubWFnICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxNzkgbWlubWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZG1uZzE4MSBtaW5tYWcgIE5hTjkgICAtSW5mICAgLT4gLUluZmluaXR5CitkZG1uZzE4MiBtaW5tYWcgLU5hTjggICAgOTk5MCAgLT4gIDk5OTAKK2RkbW5nMTgzIG1pbm1hZyAgTmFONzEgICBJbmYgICAtPiAgSW5maW5pdHkKKworZGRtbmcxODQgbWlubWFnICBOYU4xICAgIE5hTjU0IC0+ICBOYU4xCitkZG1uZzE4NSBtaW5tYWcgIE5hTjIyICAtTmFONTMgLT4gIE5hTjIyCitkZG1uZzE4NiBtaW5tYWcgLU5hTjMgICAgTmFONiAgLT4gLU5hTjMKK2RkbW5nMTg3IG1pbm1hZyAtTmFONDQgICBOYU43ICAtPiAtTmFONDQKKworZGRtbmcxODggbWlubWFnIC1JbmYgICAgIE5hTjQxIC0+IC1JbmZpbml0eQorZGRtbmcxODkgbWlubWFnIC05OTk5ICAgLU5hTjMzIC0+IC05OTk5CitkZG1uZzE5MCBtaW5tYWcgIEluZiAgICAgTmFOMiAgLT4gIEluZmluaXR5CisKK2RkbW5nMTkxIG1pbm1hZyAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE5MiBtaW5tYWcgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxOTMgbWlubWFnIC1zTmFOOTcgIE5hTjggICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5nMTk0IG1pbm1hZyAgc05hTjY5IHNOYU45NCAgLT4gIE5hTjY5IEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE5NSBtaW5tYWcgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxOTYgbWlubWFnIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5nMTk3IG1pbm1hZyAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZG1uZzE5OCBtaW5tYWcgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmcxOTkgbWlubWFnICBOYU4gICAgc05hTjg2ICAtPiAgTmFOODYgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb2xkIHJvdW5kaW5nIGNoZWNrcworZGRtbmcyMjEgbWlubWFnIC0xMjM0NTY3ODAwMCAxICAtPiAxCitkZG1uZzIyMiBtaW5tYWcgMSAtMTIzNDU2NzgwMDAgIC0+IDEKK2RkbW5nMjIzIG1pbm1hZyAtMTIzNDU2NzgwMCAgMSAgLT4gMQorZGRtbmcyMjQgbWlubWFnIDEgLTEyMzQ1Njc4MDAgICAtPiAxCitkZG1uZzIyNSBtaW5tYWcgLTEyMzQ1Njc4OTAgIDEgIC0+IDEKK2RkbW5nMjI2IG1pbm1hZyAxIC0xMjM0NTY3ODkwICAgLT4gMQorZGRtbmcyMjcgbWlubWFnIC0xMjM0NTY3ODkxICAxICAtPiAxCitkZG1uZzIyOCBtaW5tYWcgMSAtMTIzNDU2Nzg5MSAgIC0+IDEKK2RkbW5nMjI5IG1pbm1hZyAtMTIzNDU2Nzg5MDEgMSAgLT4gMQorZGRtbmcyMzAgbWlubWFnIDEgLTEyMzQ1Njc4OTAxICAtPiAxCitkZG1uZzIzMSBtaW5tYWcgLTEyMzQ1Njc4OTYgIDEgIC0+IDEKK2RkbW5nMjMyIG1pbm1hZyAxIC0xMjM0NTY3ODk2ICAgLT4gMQorZGRtbmcyMzMgbWlubWFnIDEyMzQ1Njc4OTEgIDEgICAtPiAxCitkZG1uZzIzNCBtaW5tYWcgMSAxMjM0NTY3ODkxICAgIC0+IDEKK2RkbW5nMjM1IG1pbm1hZyAxMjM0NTY3ODkwMSAxICAgLT4gMQorZGRtbmcyMzYgbWlubWFnIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkZG1uZzIzNyBtaW5tYWcgMTIzNDU2Nzg5NiAgMSAgIC0+IDEKK2RkbW5nMjM4IG1pbm1hZyAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBmcm9tIGV4YW1wbGVzCitkZG1uZzI4MCBtaW5tYWcgJzMnICAgJzInICAtPiAgJzInCitkZG1uZzI4MSBtaW5tYWcgJy0xMCcgJzMnICAtPiAgJzMnCitkZG1uZzI4MiBtaW5tYWcgJzEuMCcgJzEnICAtPiAgJzEuMCcKK2RkbW5nMjgzIG1pbm1hZyAnMScgJzEuMCcgIC0+ICAnMS4wJworZGRtbmcyODQgbWlubWFnICc3JyAnTmFOJyAgLT4gICc3JworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK2RkbW5nNDAxIG1pbm1hZyAgSW5mICAgIDEuMSAgICAgLT4gIDEuMQorZGRtbmc0MDIgbWlubWFnICAxLjEgICAgMSAgICAgICAtPiAgMQorZGRtbmc0MDMgbWlubWFnICAxICAgICAgMS4wICAgICAtPiAgMS4wCitkZG1uZzQwNCBtaW5tYWcgIDEuMCAgICAwLjEgICAgIC0+ICAwLjEKK2RkbW5nNDA1IG1pbm1hZyAgMC4xICAgIDAuMTAgICAgLT4gIDAuMTAKK2RkbW5nNDA2IG1pbm1hZyAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAwCitkZG1uZzQwNyBtaW5tYWcgIDAuMTAgICAwICAgICAgIC0+ICAwCitkZG1uZzQwOCBtaW5tYWcgIDAgICAgICAwLjAgICAgIC0+ICAwLjAKK2RkbW5nNDA5IG1pbm1hZyAgMC4wICAgLTAgICAgICAgLT4gLTAKK2RkbW5nNDEwIG1pbm1hZyAgMC4wICAgLTAuMCAgICAgLT4gLTAuMAorZGRtbmc0MTEgbWlubWFnICAwLjAwICAtMC4wICAgICAtPiAtMC4wCitkZG1uZzQxMiBtaW5tYWcgIDAuMCAgIC0wLjAwICAgIC0+IC0wLjAwCitkZG1uZzQxMyBtaW5tYWcgIDAgICAgIC0wLjAgICAgIC0+IC0wLjAKK2RkbW5nNDE0IG1pbm1hZyAgMCAgICAgLTAgICAgICAgLT4gLTAKK2RkbW5nNDE1IG1pbm1hZyAtMC4wICAgLTAgICAgICAgLT4gLTAKK2RkbW5nNDE2IG1pbm1hZyAtMCAgICAgLTAuMTAwICAgLT4gLTAKK2RkbW5nNDE3IG1pbm1hZyAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAKK2RkbW5nNDE4IG1pbm1hZyAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMQorZGRtbmc0MTkgbWlubWFnIC0wLjEgICAtMS4wICAgICAtPiAtMC4xCitkZG1uZzQyMCBtaW5tYWcgLTEuMCAgIC0xICAgICAgIC0+IC0xCitkZG1uZzQyMSBtaW5tYWcgLTEgICAgIC0xLjEgICAgIC0+IC0xCitkZG1uZzQyMyBtaW5tYWcgLTEuMSAgIC1JbmYgICAgIC0+IC0xLjEKKy0tIHNhbWUgd2l0aCBvcGVyYW5kcyByZXZlcnNlZAorZGRtbmc0MzEgbWlubWFnICAxLjEgICAgSW5mICAgICAtPiAgMS4xCitkZG1uZzQzMiBtaW5tYWcgIDEgICAgICAxLjEgICAgIC0+ICAxCitkZG1uZzQzMyBtaW5tYWcgIDEuMCAgICAxICAgICAgIC0+ICAxLjAKK2RkbW5nNDM0IG1pbm1hZyAgMC4xICAgIDEuMCAgICAgLT4gIDAuMQorZGRtbmc0MzUgbWlubWFnICAwLjEwICAgMC4xICAgICAtPiAgMC4xMAorZGRtbmc0MzYgbWlubWFnICAwLjEwMCAgMC4xMCAgICAtPiAgMC4xMDAKK2RkbW5nNDM3IG1pbm1hZyAgMCAgICAgIDAuMTAgICAgLT4gIDAKK2RkbW5nNDM4IG1pbm1hZyAgMC4wICAgIDAgICAgICAgLT4gIDAuMAorZGRtbmc0MzkgbWlubWFnIC0wICAgICAgMC4wICAgICAtPiAtMAorZGRtbmc0NDAgbWlubWFnIC0wLjAgICAgMC4wICAgICAtPiAtMC4wCitkZG1uZzQ0MSBtaW5tYWcgLTAuMCAgICAwLjAwICAgIC0+IC0wLjAKK2RkbW5nNDQyIG1pbm1hZyAtMC4wMCAgIDAuMCAgICAgLT4gLTAuMDAKK2RkbW5nNDQzIG1pbm1hZyAtMC4wICAgIDAgICAgICAgLT4gLTAuMAorZGRtbmc0NDQgbWlubWFnIC0wICAgICAgMCAgICAgICAtPiAtMAorZGRtbmc0NDUgbWlubWFnIC0wICAgICAtMC4wICAgICAtPiAtMAorZGRtbmc0NDYgbWlubWFnIC0wLjEwMCAtMCAgICAgICAtPiAtMAorZGRtbmc0NDcgbWlubWFnIC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMAorZGRtbmc0NDggbWlubWFnIC0wLjEgICAtMC4xMCAgICAtPiAtMC4xCitkZG1uZzQ0OSBtaW5tYWcgLTEuMCAgIC0wLjEgICAgIC0+IC0wLjEKK2RkbW5nNDUwIG1pbm1hZyAtMSAgICAgLTEuMCAgICAgLT4gLTEKK2RkbW5nNDUxIG1pbm1hZyAtMS4xICAgLTEgICAgICAgLT4gLTEKK2RkbW5nNDUzIG1pbm1hZyAtSW5mICAgLTEuMSAgICAgLT4gLTEuMQorLS0gbGFyZ2llcworZGRtbmc0NjAgbWlubWFnICAxMDAwICAgMUUrMyAgICAtPiAgMTAwMAorZGRtbmc0NjEgbWlubWFnICAxRSszICAgMTAwMCAgICAtPiAgMTAwMAorZGRtbmc0NjIgbWlubWFnICAxMDAwICAtMUUrMyAgICAtPiAtMUUrMworZGRtbmc0NjMgbWlubWFnICAxRSszICAgLTM4NCAgICAtPiAtMzg0CitkZG1uZzQ2NCBtaW5tYWcgLTM4NCAgICAxRSszICAgIC0+IC0zODQKK2RkbW5nNDY1IG1pbm1hZyAtMUUrMyAgIDEwMDAgICAgLT4gLTFFKzMKK2RkbW5nNDY2IG1pbm1hZyAtMzg0ICAgLTFFKzMgICAgLT4gLTM4NAorZGRtbmc0NjcgbWlubWFnIC0xRSszICAgLTM4NCAgICAtPiAtMzg0CisKKy0tIHN1Ym5vcm1hbHMKK2RkbW5nNTEwIG1pbm1hZyAgMS4wMEUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtbmc1MTEgbWlubWFnICAwLjFFLTM4MyAgICAgICAgMCAgLT4gICAwCitkZG1uZzUxMiBtaW5tYWcgIDAuMTBFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbW5nNTEzIG1pbm1hZyAgMC4xMDBFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MTQgbWlubWFnICAwLjAxRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1uZzUxNSBtaW5tYWcgIDAuOTk5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbW5nNTE2IG1pbm1hZyAgMC4wOTlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MTcgbWlubWFnICAwLjAwOUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1uZzUxOCBtaW5tYWcgIDAuMDAxRS0zODMgICAgICAwICAtPiAgIDAKK2RkbW5nNTE5IG1pbm1hZyAgMC4wMDA5RS0zODMgICAgIDAgIC0+ICAgMAorZGRtbmc1MjAgbWlubWFnICAwLjAwMDFFLTM4MyAgICAgMCAgLT4gICAwCisKK2RkbW5nNTMwIG1pbm1hZyAtMS4wMEUtMzgzICAgICAgIDAgIC0+ICAgMAorZGRtbmc1MzEgbWlubWFnIC0wLjFFLTM4MyAgICAgICAgMCAgLT4gICAwCitkZG1uZzUzMiBtaW5tYWcgLTAuMTBFLTM4MyAgICAgICAwICAtPiAgIDAKK2RkbW5nNTMzIG1pbm1hZyAtMC4xMDBFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MzQgbWlubWFnIC0wLjAxRS0zODMgICAgICAgMCAgLT4gICAwCitkZG1uZzUzNSBtaW5tYWcgLTAuOTk5RS0zODMgICAgICAwICAtPiAgIDAKK2RkbW5nNTM2IG1pbm1hZyAtMC4wOTlFLTM4MyAgICAgIDAgIC0+ICAgMAorZGRtbmc1MzcgbWlubWFnIC0wLjAwOUUtMzgzICAgICAgMCAgLT4gICAwCitkZG1uZzUzOCBtaW5tYWcgLTAuMDAxRS0zODMgICAgICAwICAtPiAgIDAKK2RkbW5nNTM5IG1pbm1hZyAtMC4wMDA5RS0zODMgICAgIDAgIC0+ICAgMAorZGRtbmc1NDAgbWlubWFnIC0wLjAwMDFFLTM4MyAgICAgMCAgLT4gICAwCisKKworLS0gTnVsbCB0ZXN0cworZGRtbmc5MDAgbWlubWFnIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtbmc5MDEgbWlubWFnICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE1pbnVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTWludXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ZmZmY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE1pbnVzLmRlY1Rlc3QKQEAgLTAsMCArMSw4OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE1pbnVzLmRlY1Rlc3QgLS0gZGVjRG91YmxlIDAteCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2RkbW5zMDAxIG1pbnVzICAgICAgICs3LjUwICAtPiAtNy41MAorCistLSBJbmZpbml0aWVzCitkZG1uczAxMSBtaW51cyAgSW5maW5pdHkgICAgLT4gLUluZmluaXR5CitkZG1uczAxMiBtaW51cyAgLUluZmluaXR5ICAgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkZG1uczAyMSBtaW51cyAgICAgICAgIE5hTiAgLT4gTmFOCitkZG1uczAyMiBtaW51cyAgICAgICAgLU5hTiAgLT4gLU5hTgorZGRtbnMwMjMgbWludXMgICAgICAgIHNOYU4gIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5zMDI0IG1pbnVzICAgICAgIC1zTmFOICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RkbW5zMDMxIG1pbnVzICAgICAgIE5hTjEzICAtPiBOYU4xMworZGRtbnMwMzIgbWludXMgICAgICAtTmFOMTMgIC0+IC1OYU4xMworZGRtbnMwMzMgbWludXMgICAgICBzTmFOMTMgIC0+IE5hTjEzICAgSW52YWxpZF9vcGVyYXRpb24KK2RkbW5zMDM0IG1pbnVzICAgICAtc05hTjEzICAtPiAtTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkZG1uczAzNSBtaW51cyAgICAgICBOYU43MCAgLT4gTmFONzAKK2RkbW5zMDM2IG1pbnVzICAgICAgLU5hTjcwICAtPiAtTmFONzAKK2RkbW5zMDM3IG1pbnVzICAgICAgc05hTjEwMSAtPiBOYU4xMDEgIEludmFsaWRfb3BlcmF0aW9uCitkZG1uczAzOCBtaW51cyAgICAgLXNOYU4xMDEgLT4gLU5hTjEwMSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmaW5pdGVzCitkZG1uczEwMSBtaW51cyAgICAgICAgICA3ICAgLT4gLTcKK2RkbW5zMTAyIG1pbnVzICAgICAgICAgLTcgICAtPiA3CitkZG1uczEwMyBtaW51cyAgICAgICAgIDc1ICAgLT4gLTc1CitkZG1uczEwNCBtaW51cyAgICAgICAgLTc1ICAgLT4gNzUKK2RkbW5zMTA1IG1pbnVzICAgICAgIDcuNTAgICAtPiAtNy41MAorZGRtbnMxMDYgbWludXMgICAgICAtNy41MCAgIC0+IDcuNTAKK2RkbW5zMTA3IG1pbnVzICAgICAgIDcuNTAwICAtPiAtNy41MDAKK2RkbW5zMTA4IG1pbnVzICAgICAgLTcuNTAwICAtPiA3LjUwMAorCistLSB6ZXJvcworZGRtbnMxMTEgbWludXMgICAgICAgICAgMCAgIC0+IDAKK2RkbW5zMTEyIG1pbnVzICAgICAgICAgLTAgICAtPiAwCitkZG1uczExMyBtaW51cyAgICAgICAwRSs0ICAgLT4gMEUrNAorZGRtbnMxMTQgbWludXMgICAgICAtMEUrNCAgIC0+IDBFKzQKK2RkbW5zMTE1IG1pbnVzICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RkbW5zMTE2IG1pbnVzICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2RkbW5zMTE3IG1pbnVzICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RkbW5zMTE4IG1pbnVzICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RkbW5zMTIxIG1pbnVzICAyNjgyNjgyNjgyNjgyNjgyICAgICAgICAgLT4gLTI2ODI2ODI2ODI2ODI2ODIKK2RkbW5zMTIyIG1pbnVzICAtMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgLT4gMjY4MjY4MjY4MjY4MjY4MgorZGRtbnMxMjMgbWludXMgIDEzNDEzNDEzNDEzNDEzNDEgICAgICAgICAtPiAtMTM0MTM0MTM0MTM0MTM0MQorZGRtbnMxMjQgbWludXMgIC0xMzQxMzQxMzQxMzQxMzQxICAgICAgICAtPiAxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZG1uczEzMSBtaW51cyAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG1uczEzMiBtaW51cyAgMUUtMzgzICAgICAgICAgICAgICAgICAgIC0+IC0xRS0zODMKK2RkbW5zMTMzIG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkbW5zMTM0IG1pbnVzICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gLTFFLTM5OCBTdWJub3JtYWwKKworZGRtbnMxMzUgbWludXMgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAxRS0zOTggU3Vibm9ybWFsCitkZG1uczEzNiBtaW51cyAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkbW5zMTM3IG1pbnVzICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gMUUtMzgzCitkZG1uczEzOCBtaW51cyAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNdWx0aXBseS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE11bHRpcGx5LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3M2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRNdWx0aXBseS5kZWNUZXN0CkBAIC0wLDAgKzEsNTUzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkTXVsdGlwbHkuZGVjVGVzdCAtLSBkZWNEb3VibGUgbXVsdGlwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgYXJlIGZvciBkZWNEb3VibGVzIG9ubHk7IGFsbCBhcmd1bWVudHMgYXJlCistLSByZXByZXNlbnRhYmxlIGluIGEgZGVjRG91YmxlCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZGRtdWwwMDAgbXVsdGlwbHkgMiAgICAgIDIgLT4gNAorZGRtdWwwMDEgbXVsdGlwbHkgMiAgICAgIDMgLT4gNgorZGRtdWwwMDIgbXVsdGlwbHkgNSAgICAgIDEgLT4gNQorZGRtdWwwMDMgbXVsdGlwbHkgNSAgICAgIDIgLT4gMTAKK2RkbXVsMDA0IG11bHRpcGx5IDEuMjAgICAyIC0+IDIuNDAKK2RkbXVsMDA1IG11bHRpcGx5IDEuMjAgICAwIC0+IDAuMDAKK2RkbXVsMDA2IG11bHRpcGx5IDEuMjAgIC0yIC0+IC0yLjQwCitkZG11bDAwNyBtdWx0aXBseSAtMS4yMCAgMiAtPiAtMi40MAorZGRtdWwwMDggbXVsdGlwbHkgLTEuMjAgIDAgLT4gLTAuMDAKK2RkbXVsMDA5IG11bHRpcGx5IC0xLjIwIC0yIC0+IDIuNDAKK2RkbXVsMDEwIG11bHRpcGx5IDUuMDkgNy4xIC0+IDM2LjEzOQorZGRtdWwwMTEgbXVsdGlwbHkgMi41ICAgIDQgLT4gMTAuMAorZGRtdWwwMTIgbXVsdGlwbHkgMi41MCAgIDQgLT4gMTAuMDAKK2RkbXVsMDEzIG11bHRpcGx5IDEuMjM0NTY3ODkgMS4wMDAwMDAwMCAtPiAxLjIzNDU2Nzg5MDAwMDAwMCBSb3VuZGVkCitkZG11bDAxNSBtdWx0aXBseSAyLjUwICAgNCAtPiAxMC4wMAorZGRtdWwwMTYgbXVsdGlwbHkgIDkuOTk5OTk5OTk5ICA5Ljk5OTk5OTk5OSAtPiAgOTkuOTk5OTk5OTgwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkZG11bDAxNyBtdWx0aXBseSAgOS45OTk5OTk5OTkgLTkuOTk5OTk5OTk5IC0+IC05OS45OTk5OTk5ODAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsMDE4IG11bHRpcGx5IC05Ljk5OTk5OTk5OSAgOS45OTk5OTk5OTkgLT4gLTk5Ljk5OTk5OTk4MDAwMDAwIEluZXhhY3QgUm91bmRlZAorZGRtdWwwMTkgbXVsdGlwbHkgLTkuOTk5OTk5OTk5IC05Ljk5OTk5OTk5OSAtPiAgOTkuOTk5OTk5OTgwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHplcm9zLCBldGMuCitkZG11bDAyMSBtdWx0aXBseSAgMCAgICAgIDAgICAgIC0+ICAwCitkZG11bDAyMiBtdWx0aXBseSAgMCAgICAgLTAgICAgIC0+IC0wCitkZG11bDAyMyBtdWx0aXBseSAtMCAgICAgIDAgICAgIC0+IC0wCitkZG11bDAyNCBtdWx0aXBseSAtMCAgICAgLTAgICAgIC0+ICAwCitkZG11bDAyNSBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkZG11bDAyNiBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkZG11bDAyNyBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkZG11bDAyOCBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCitkZG11bDAzMCBtdWx0aXBseSAgNS4wMCAgIDFFLTMgIC0+ICAwLjAwNTAwCitkZG11bDAzMSBtdWx0aXBseSAgMDAuMDAgIDAuMDAwIC0+ICAwLjAwMDAwCitkZG11bDAzMiBtdWx0aXBseSAgMDAuMDAgIDBFLTMgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZGRtdWwwMzMgbXVsdGlwbHkgIDBFLTMgICAwMC4wMCAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RkbXVsMDM0IG11bHRpcGx5IC01LjAwICAgMUUtMyAgLT4gLTAuMDA1MDAKK2RkbXVsMDM1IG11bHRpcGx5IC0wMC4wMCAgMC4wMDAgLT4gLTAuMDAwMDAKK2RkbXVsMDM2IG11bHRpcGx5IC0wMC4wMCAgMEUtMyAgLT4gLTAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkZG11bDAzNyBtdWx0aXBseSAtMEUtMyAgIDAwLjAwIC0+IC0wLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZGRtdWwwMzggbXVsdGlwbHkgIDUuMDAgIC0xRS0zICAtPiAtMC4wMDUwMAorZGRtdWwwMzkgbXVsdGlwbHkgIDAwLjAwIC0wLjAwMCAtPiAtMC4wMDAwMAorZGRtdWwwNDAgbXVsdGlwbHkgIDAwLjAwIC0wRS0zICAtPiAtMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RkbXVsMDQxIG11bHRpcGx5ICAwRS0zICAtMDAuMDAgLT4gLTAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkZG11bDA0MiBtdWx0aXBseSAtNS4wMCAgLTFFLTMgIC0+ICAwLjAwNTAwCitkZG11bDA0MyBtdWx0aXBseSAtMDAuMDAgLTAuMDAwIC0+ICAwLjAwMDAwCitkZG11bDA0NCBtdWx0aXBseSAtMDAuMDAgLTBFLTMgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZGRtdWwwNDUgbXVsdGlwbHkgLTBFLTMgIC0wMC4wMCAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorZGRtdWwwNTAgbXVsdGlwbHkgMS4yMCAzICAgICAgICAtPiAzLjYwCitkZG11bDA1MSBtdWx0aXBseSA3ICAgIDMgICAgICAgIC0+IDIxCitkZG11bDA1MiBtdWx0aXBseSAwLjkgIDAuOCAgICAgIC0+IDAuNzIKK2RkbXVsMDUzIG11bHRpcGx5IDAuOSAgLTAgICAgICAgLT4gLTAuMAorZGRtdWwwNTQgbXVsdGlwbHkgNjU0MzIxIDY1NDMyMSAtPiA0MjgxMzU5NzEwNDEKKworZGRtdWwwNjAgbXVsdGlwbHkgMTIzLjQ1IDFlNyAgLT4gIDEuMjM0NUUrOQorZGRtdWwwNjEgbXVsdGlwbHkgMTIzLjQ1IDFlOCAgLT4gIDEuMjM0NUUrMTAKK2RkbXVsMDYyIG11bHRpcGx5IDEyMy40NSAxZSs5IC0+ICAxLjIzNDVFKzExCitkZG11bDA2MyBtdWx0aXBseSAxMjMuNDUgMWUxMCAtPiAgMS4yMzQ1RSsxMgorZGRtdWwwNjQgbXVsdGlwbHkgMTIzLjQ1IDFlMTEgLT4gIDEuMjM0NUUrMTMKK2RkbXVsMDY1IG11bHRpcGx5IDEyMy40NSAxZTEyIC0+ICAxLjIzNDVFKzE0CitkZG11bDA2NiBtdWx0aXBseSAxMjMuNDUgMWUxMyAtPiAgMS4yMzQ1RSsxNQorCisKKy0tIHRlc3Qgc29tZSBpbnRlcm1lZGlhdGUgbGVuZ3RocworLS0gICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkbXVsMDgwIG11bHRpcGx5IDAuMSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAtPiAxMjMwMTIzNDU2NDU2NzguOQorZGRtdWwwODQgbXVsdGlwbHkgMC4xIDEyMzAxMjM0NTY0NTY3ODkgICAgIC0+IDEyMzAxMjM0NTY0NTY3OC45CitkZG11bDA5MCBtdWx0aXBseSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAwLjEgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKK2RkbXVsMDk0IG11bHRpcGx5IDEyMzAxMjM0NTY0NTY3ODkgICAgIDAuMSAtPiAxMjMwMTIzNDU2NDU2NzguOQorCistLSB0ZXN0IHNvbWUgbW9yZSBlZGdlIGNhc2VzIGFuZCBjYXJyaWVzCitkZG11bDEwMSBtdWx0aXBseSA5IDkgICAtPiA4MQorZGRtdWwxMDIgbXVsdGlwbHkgOSA5MCAgIC0+IDgxMAorZGRtdWwxMDMgbXVsdGlwbHkgOSA5MDAgICAtPiA4MTAwCitkZG11bDEwNCBtdWx0aXBseSA5IDkwMDAgICAtPiA4MTAwMAorZGRtdWwxMDUgbXVsdGlwbHkgOSA5MDAwMCAgIC0+IDgxMDAwMAorZGRtdWwxMDYgbXVsdGlwbHkgOSA5MDAwMDAgICAtPiA4MTAwMDAwCitkZG11bDEwNyBtdWx0aXBseSA5IDkwMDAwMDAgICAtPiA4MTAwMDAwMAorZGRtdWwxMDggbXVsdGlwbHkgOSA5MDAwMDAwMCAgIC0+IDgxMDAwMDAwMAorZGRtdWwxMDkgbXVsdGlwbHkgOSA5MDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwCitkZG11bDExMCBtdWx0aXBseSA5IDkwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMAorZGRtdWwxMTEgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMAorZGRtdWwxMTIgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwCitkZG11bDExMyBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMAorZGRtdWwxMTQgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMAorZGRtdWwxMTUgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwCistLWRkbXVsMTE2IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwCistLWRkbXVsMTE3IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMTggbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwCistLWRkbXVsMTE5IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwCistLWRkbXVsMTIwIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZGRtdWwxMjEgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRkbXVsMTIyIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRkbXVsMTIzIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgd2l0aG91dCBjYXJyaWVzCitkZG11bDEzMSBtdWx0aXBseSAzIDMgICAtPiA5CitkZG11bDEzMiBtdWx0aXBseSAzIDMwICAgLT4gOTAKK2RkbXVsMTMzIG11bHRpcGx5IDMgMzAwICAgLT4gOTAwCitkZG11bDEzNCBtdWx0aXBseSAzIDMwMDAgICAtPiA5MDAwCitkZG11bDEzNSBtdWx0aXBseSAzIDMwMDAwICAgLT4gOTAwMDAKK2RkbXVsMTM2IG11bHRpcGx5IDMgMzAwMDAwICAgLT4gOTAwMDAwCitkZG11bDEzNyBtdWx0aXBseSAzIDMwMDAwMDAgICAtPiA5MDAwMDAwCitkZG11bDEzOCBtdWx0aXBseSAzIDMwMDAwMDAwICAgLT4gOTAwMDAwMDAKK2RkbXVsMTM5IG11bHRpcGx5IDMgMzAwMDAwMDAwICAgLT4gOTAwMDAwMDAwCitkZG11bDE0MCBtdWx0aXBseSAzIDMwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwCitkZG11bDE0MSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAKK2RkbXVsMTQyIG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwCitkZG11bDE0MyBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwCitkZG11bDE0NCBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAKK2RkbXVsMTQ1IG11bHRpcGx5IDMgMzAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwCisKKy0tIHRlc3Qgc29tZSBlZGdlIGNhc2VzIHdpdGggZXhhY3Qgcm91bmRpbmcKK2RkbXVsMzAxIG11bHRpcGx5IDkgOSAgIC0+IDgxCitkZG11bDMwMiBtdWx0aXBseSA5IDkwICAgLT4gODEwCitkZG11bDMwMyBtdWx0aXBseSA5IDkwMCAgIC0+IDgxMDAKK2RkbXVsMzA0IG11bHRpcGx5IDkgOTAwMCAgIC0+IDgxMDAwCitkZG11bDMwNSBtdWx0aXBseSA5IDkwMDAwICAgLT4gODEwMDAwCitkZG11bDMwNiBtdWx0aXBseSA5IDkwMDAwMCAgIC0+IDgxMDAwMDAKK2RkbXVsMzA3IG11bHRpcGx5IDkgOTAwMDAwMCAgIC0+IDgxMDAwMDAwCitkZG11bDMwOCBtdWx0aXBseSA5IDkwMDAwMDAwICAgLT4gODEwMDAwMDAwCitkZG11bDMwOSBtdWx0aXBseSA5IDkwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAKK2RkbXVsMzEwIG11bHRpcGx5IDkgOTAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwCitkZG11bDMxMSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwCitkZG11bDMxMiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAKK2RkbXVsMzEzIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwCitkZG11bDMxNCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwCitkZG11bDMxNSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAKK2RkbXVsMzE2IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsxNiAgUm91bmRlZAorZGRtdWwzMTcgbXVsdGlwbHkgOTAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsxNyAgUm91bmRlZAorZGRtdWwzMTggbXVsdGlwbHkgOTAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwMDAwMDAwMEUrMTggIFJvdW5kZWQKK2RkbXVsMzE5IG11bHRpcGx5IDkwMDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsxOSAgUm91bmRlZAorZGRtdWwzMjAgbXVsdGlwbHkgOTAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsyMCAgUm91bmRlZAorZGRtdWwzMjEgbXVsdGlwbHkgOTAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwMDAwMDAwMEUrMjEgIFJvdW5kZWQKK2RkbXVsMzIyIG11bHRpcGx5IDkwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsyMiAgUm91bmRlZAorZGRtdWwzMjMgbXVsdGlwbHkgOTAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwRSsyMyAgUm91bmRlZAorCistLSB0cnl6ZXJvcyBjYXNlcworZGRtdWw1MDQgIG11bHRpcGx5ICAwRS0yNjAgMTAwMEUtMjYwICAtPiAwRS0zOTggQ2xhbXBlZAorZGRtdWw1MDUgIG11bHRpcGx5ICAxMDBFKzI2MCAwRSsyNjAgICAtPiAwRSszNjkgQ2xhbXBlZAorLS0gNjVLLTEgY2FzZQorZGRtdWw1MDYgbXVsdGlwbHkgNzcuMSA4NTAgLT4gNjU1MzUuMAorCistLSBtaXhlZCB3aXRoIHplcm9zCitkZG11bDU0MSBtdWx0aXBseSAgMCAgICAtMSAgICAgLT4gLTAKK2RkbXVsNTQyIG11bHRpcGx5IC0wICAgIC0xICAgICAtPiAgMAorZGRtdWw1NDMgbXVsdGlwbHkgIDAgICAgIDEgICAgIC0+ICAwCitkZG11bDU0NCBtdWx0aXBseSAtMCAgICAgMSAgICAgLT4gLTAKK2RkbXVsNTQ1IG11bHRpcGx5IC0xICAgICAwICAgICAtPiAtMAorZGRtdWw1NDYgbXVsdGlwbHkgLTEgICAgLTAgICAgIC0+ICAwCitkZG11bDU0NyBtdWx0aXBseSAgMSAgICAgMCAgICAgLT4gIDAKK2RkbXVsNTQ4IG11bHRpcGx5ICAxICAgIC0wICAgICAtPiAtMAorCitkZG11bDU1MSBtdWx0aXBseSAgMC4wICAtMSAgICAgLT4gLTAuMAorZGRtdWw1NTIgbXVsdGlwbHkgLTAuMCAgLTEgICAgIC0+ICAwLjAKK2RkbXVsNTUzIG11bHRpcGx5ICAwLjAgICAxICAgICAtPiAgMC4wCitkZG11bDU1NCBtdWx0aXBseSAtMC4wICAgMSAgICAgLT4gLTAuMAorZGRtdWw1NTUgbXVsdGlwbHkgLTEuMCAgIDAgICAgIC0+IC0wLjAKK2RkbXVsNTU2IG11bHRpcGx5IC0xLjAgIC0wICAgICAtPiAgMC4wCitkZG11bDU1NyBtdWx0aXBseSAgMS4wICAgMCAgICAgLT4gIDAuMAorZGRtdWw1NTggbXVsdGlwbHkgIDEuMCAgLTAgICAgIC0+IC0wLjAKKworZGRtdWw1NjEgbXVsdGlwbHkgIDAgICAgLTEuMCAgIC0+IC0wLjAKK2RkbXVsNTYyIG11bHRpcGx5IC0wICAgIC0xLjAgICAtPiAgMC4wCitkZG11bDU2MyBtdWx0aXBseSAgMCAgICAgMS4wICAgLT4gIDAuMAorZGRtdWw1NjQgbXVsdGlwbHkgLTAgICAgIDEuMCAgIC0+IC0wLjAKK2RkbXVsNTY1IG11bHRpcGx5IC0xICAgICAwLjAgICAtPiAtMC4wCitkZG11bDU2NiBtdWx0aXBseSAtMSAgICAtMC4wICAgLT4gIDAuMAorZGRtdWw1NjcgbXVsdGlwbHkgIDEgICAgIDAuMCAgIC0+ICAwLjAKK2RkbXVsNTY4IG11bHRpcGx5ICAxICAgIC0wLjAgICAtPiAtMC4wCisKK2RkbXVsNTcxIG11bHRpcGx5ICAwLjAgIC0xLjAgICAtPiAtMC4wMAorZGRtdWw1NzIgbXVsdGlwbHkgLTAuMCAgLTEuMCAgIC0+ICAwLjAwCitkZG11bDU3MyBtdWx0aXBseSAgMC4wICAgMS4wICAgLT4gIDAuMDAKK2RkbXVsNTc0IG11bHRpcGx5IC0wLjAgICAxLjAgICAtPiAtMC4wMAorZGRtdWw1NzUgbXVsdGlwbHkgLTEuMCAgIDAuMCAgIC0+IC0wLjAwCitkZG11bDU3NiBtdWx0aXBseSAtMS4wICAtMC4wICAgLT4gIDAuMDAKK2RkbXVsNTc3IG11bHRpcGx5ICAxLjAgICAwLjAgICAtPiAgMC4wMAorZGRtdWw1NzggbXVsdGlwbHkgIDEuMCAgLTAuMCAgIC0+IC0wLjAwCisKKworLS0gU3BlY2lhbHMKK2RkbXVsNTgwIG11bHRpcGx5ICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXVsNTgxIG11bHRpcGx5ICBJbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK2RkbXVsNTgyIG11bHRpcGx5ICBJbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RkbXVsNTgzIG11bHRpcGx5ICBJbmYgIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw1ODQgbXVsdGlwbHkgIEluZiAgIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDU4NSBtdWx0aXBseSAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkZG11bDU4NiBtdWx0aXBseSAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkZG11bDU4NyBtdWx0aXBseSAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkZG11bDU4OCBtdWx0aXBseSAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CitkZG11bDU4OSBtdWx0aXBseSAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkZG11bDU5MCBtdWx0aXBseSAtMSAgICAgSW5mICAgLT4gLUluZmluaXR5CitkZG11bDU5MSBtdWx0aXBseSAtMCAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNTkyIG11bHRpcGx5ICAwICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw1OTMgbXVsdGlwbHkgIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtdWw1OTQgbXVsdGlwbHkgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRtdWw1OTUgbXVsdGlwbHkgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkZG11bDYwMCBtdWx0aXBseSAtSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkZG11bDYwMSBtdWx0aXBseSAtSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkZG11bDYwMiBtdWx0aXBseSAtSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkZG11bDYwMyBtdWx0aXBseSAtSW5mICAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjA0IG11bHRpcGx5IC1JbmYgICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2MDUgbXVsdGlwbHkgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZGRtdWw2MDYgbXVsdGlwbHkgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZGRtdWw2MDcgbXVsdGlwbHkgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZGRtdWw2MDggbXVsdGlwbHkgLTEwMDAgIEluZiAgIC0+IC1JbmZpbml0eQorZGRtdWw2MDkgbXVsdGlwbHkgLUluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRtdWw2MTAgbXVsdGlwbHkgLTEgICAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRtdWw2MTEgbXVsdGlwbHkgLTAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDYxMiBtdWx0aXBseSAgMCAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjEzIG11bHRpcGx5ICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXVsNjE0IG11bHRpcGx5ICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbXVsNjE1IG11bHRpcGx5ICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworZGRtdWw2MjEgbXVsdGlwbHkgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RkbXVsNjIyIG11bHRpcGx5ICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZG11bDYyMyBtdWx0aXBseSAgTmFOIC0xICAgICAgLT4gIE5hTgorZGRtdWw2MjQgbXVsdGlwbHkgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RkbXVsNjI1IG11bHRpcGx5ICBOYU4gIDAgICAgICAtPiAgTmFOCitkZG11bDYyNiBtdWx0aXBseSAgTmFOICAxICAgICAgLT4gIE5hTgorZGRtdWw2MjcgbXVsdGlwbHkgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RkbXVsNjI4IG11bHRpcGx5ICBOYU4gIEluZiAgICAtPiAgTmFOCitkZG11bDYyOSBtdWx0aXBseSAgTmFOICBOYU4gICAgLT4gIE5hTgorZGRtdWw2MzAgbXVsdGlwbHkgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RkbXVsNjMxIG11bHRpcGx5IC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZG11bDYzMiBtdWx0aXBseSAtMSAgICBOYU4gICAgLT4gIE5hTgorZGRtdWw2MzMgbXVsdGlwbHkgLTAgICAgTmFOICAgIC0+ICBOYU4KK2RkbXVsNjM0IG11bHRpcGx5ICAwICAgIE5hTiAgICAtPiAgTmFOCitkZG11bDYzNSBtdWx0aXBseSAgMSAgICBOYU4gICAgLT4gIE5hTgorZGRtdWw2MzYgbXVsdGlwbHkgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RkbXVsNjM3IG11bHRpcGx5ICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RkbXVsNjQxIG11bHRpcGx5ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NDIgbXVsdGlwbHkgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY0MyBtdWx0aXBseSAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjQ0IG11bHRpcGx5ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NDUgbXVsdGlwbHkgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY0NiBtdWx0aXBseSAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjQ3IG11bHRpcGx5ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NDggbXVsdGlwbHkgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY0OSBtdWx0aXBseSAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjUwIG11bHRpcGx5ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NTEgbXVsdGlwbHkgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY1MiBtdWx0aXBseSAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjUzIG11bHRpcGx5IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NTQgbXVsdGlwbHkgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY1NSBtdWx0aXBseSAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjU2IG11bHRpcGx5ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw2NTcgbXVsdGlwbHkgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY1OCBtdWx0aXBseSAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjU5IG11bHRpcGx5ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZG11bDY2MSBtdWx0aXBseSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2RkbXVsNjYyIG11bHRpcGx5ICBOYU44ICA5OTkgICAtPiAgTmFOOAorZGRtdWw2NjMgbXVsdGlwbHkgIE5hTjcxIEluZiAgIC0+ICBOYU43MQorZGRtdWw2NjQgbXVsdGlwbHkgIE5hTjYgIE5hTjUgIC0+ICBOYU42CitkZG11bDY2NSBtdWx0aXBseSAtSW5mICAgTmFONCAgLT4gIE5hTjQKK2RkbXVsNjY2IG11bHRpcGx5IC05OTkgICBOYU4zMyAtPiAgTmFOMzMKK2RkbXVsNjY3IG11bHRpcGx5ICBJbmYgICBOYU4yICAtPiAgTmFOMgorCitkZG11bDY3MSBtdWx0aXBseSAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3MiBtdWx0aXBseSAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3MyBtdWx0aXBseSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3NCBtdWx0aXBseSAgc05hTjE2IHNOYU45NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3NSBtdWx0aXBseSAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3NiBtdWx0aXBseSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3NyBtdWx0aXBseSAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3OCBtdWx0aXBseSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDY3OSBtdWx0aXBseSAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2RkbXVsNjgxIG11bHRpcGx5IC1OYU45IC1JbmYgICAtPiAtTmFOOQorZGRtdWw2ODIgbXVsdGlwbHkgLU5hTjggIDk5OSAgIC0+IC1OYU44CitkZG11bDY4MyBtdWx0aXBseSAtTmFONzEgSW5mICAgLT4gLU5hTjcxCitkZG11bDY4NCBtdWx0aXBseSAtTmFONiAtTmFONSAgLT4gLU5hTjYKK2RkbXVsNjg1IG11bHRpcGx5IC1JbmYgIC1OYU40ICAtPiAtTmFONAorZGRtdWw2ODYgbXVsdGlwbHkgLTk5OSAgLU5hTjMzIC0+IC1OYU4zMworZGRtdWw2ODcgbXVsdGlwbHkgIEluZiAgLU5hTjIgIC0+IC1OYU4yCisKK2RkbXVsNjkxIG11bHRpcGx5IC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjkyIG11bHRpcGx5IC1zTmFOOTggLTExICAgICAtPiAtTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjkzIG11bHRpcGx5IC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjk0IG11bHRpcGx5IC1zTmFOMTYgLXNOYU45NCAtPiAtTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjk1IG11bHRpcGx5IC1OYU45NSAgLXNOYU45MyAtPiAtTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjk2IG11bHRpcGx5IC1JbmYgICAgLXNOYU45MiAtPiAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjk3IG11bHRpcGx5ICAwODggICAgLXNOYU45MSAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjk4IG11bHRpcGx5ICBJbmYgICAgLXNOYU45MCAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNjk5IG11bHRpcGx5IC1OYU4gICAgLXNOYU44OSAtPiAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZGRtdWw3MDEgbXVsdGlwbHkgLU5hTiAgLUluZiAgIC0+IC1OYU4KK2RkbXVsNzAyIG11bHRpcGx5IC1OYU4gICA5OTkgICAtPiAtTmFOCitkZG11bDcwMyBtdWx0aXBseSAtTmFOICAgSW5mICAgLT4gLU5hTgorZGRtdWw3MDQgbXVsdGlwbHkgLU5hTiAgLU5hTiAgIC0+IC1OYU4KK2RkbXVsNzA1IG11bHRpcGx5IC1JbmYgIC1OYU4wICAtPiAtTmFOCitkZG11bDcwNiBtdWx0aXBseSAtOTk5ICAtTmFOICAgLT4gLU5hTgorZGRtdWw3MDcgbXVsdGlwbHkgIEluZiAgLU5hTiAgIC0+IC1OYU4KKworZGRtdWw3MTEgbXVsdGlwbHkgLXNOYU4gICAtSW5mICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNzEyIG11bHRpcGx5IC1zTmFOICAgLTExICAgICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDcxMyBtdWx0aXBseSAtc05hTjAwICBOYU4gICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw3MTQgbXVsdGlwbHkgLXNOYU4gICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNzE1IG11bHRpcGx5IC1OYU4gICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDcxNiBtdWx0aXBseSAtSW5mICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw3MTcgbXVsdGlwbHkgIDA4OCAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkbXVsNzE4IG11bHRpcGx5ICBJbmYgICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG11bDcxOSBtdWx0aXBseSAtTmFOICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIG5vdGUgc3Vibm9ybWFsIHJlc3VsdHMKKy0tIHNpZ25zCitkZG11bDc1MSBtdWx0aXBseSAgMWUrMjc3ICAxZSszMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NTIgbXVsdGlwbHkgIDFlKzI3NyAtMWUrMzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsNzUzIG11bHRpcGx5IC0xZSsyNzcgIDFlKzMxMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZG11bDc1NCBtdWx0aXBseSAtMWUrMjc3IC0xZSszMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRtdWw3NTUgbXVsdGlwbHkgIDFlLTI3NyAgMWUtMzExIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw3NTYgbXVsdGlwbHkgIDFlLTI3NyAtMWUtMzExIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw3NTcgbXVsdGlwbHkgLTFlLTI3NyAgMWUtMzExIC0+IC0wRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw3NTggbXVsdGlwbHkgLTFlLTI3NyAtMWUtMzExIC0+ICAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RkbXVsNzYwIG11bHRpcGx5IDFlLTI5MSAxZS0xMDEgLT4gMUUtMzkyIFN1Ym5vcm1hbAorZGRtdWw3NjEgbXVsdGlwbHkgMWUtMjkxIDFlLTEwMiAtPiAxRS0zOTMgU3Vibm9ybWFsCitkZG11bDc2MiBtdWx0aXBseSAxZS0yOTEgMWUtMTAzIC0+IDFFLTM5NCBTdWJub3JtYWwKK2RkbXVsNzYzIG11bHRpcGx5IDFlLTI5MSAxZS0xMDQgLT4gMUUtMzk1IFN1Ym5vcm1hbAorZGRtdWw3NjQgbXVsdGlwbHkgMWUtMjkxIDFlLTEwNSAtPiAxRS0zOTYgU3Vibm9ybWFsCitkZG11bDc2NSBtdWx0aXBseSAxZS0yOTEgMWUtMTA2IC0+IDFFLTM5NyBTdWJub3JtYWwKK2RkbXVsNzY2IG11bHRpcGx5IDFlLTI5MSAxZS0xMDcgLT4gMUUtMzk4IFN1Ym5vcm1hbAorZGRtdWw3NjcgbXVsdGlwbHkgMWUtMjkxIDFlLTEwOCAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw3NjggbXVsdGlwbHkgMWUtMjkxIDFlLTEwOSAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw3NjkgbXVsdGlwbHkgMWUtMjkxIDFlLTExMCAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gW25vIGVxdWl2YWxlbnQgb2YgJ3N1Ym5vcm1hbCcgZm9yIG92ZXJmbG93XQorZGRtdWw3NzAgbXVsdGlwbHkgMWUrNjAgMWUrMzIxIC0+IDEuMDAwMDAwMDAwMDAwRSszODEgIENsYW1wZWQKK2RkbXVsNzcxIG11bHRpcGx5IDFlKzYwIDFlKzMyMiAtPiAxLjAwMDAwMDAwMDAwMDBFKzM4MiAgQ2xhbXBlZAorZGRtdWw3NzIgbXVsdGlwbHkgMWUrNjAgMWUrMzIzIC0+IDEuMDAwMDAwMDAwMDAwMDBFKzM4MyAgQ2xhbXBlZAorZGRtdWw3NzMgbXVsdGlwbHkgMWUrNjAgMWUrMzI0IC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQgIENsYW1wZWQKK2RkbXVsNzc0IG11bHRpcGx5IDFlKzYwIDFlKzMyNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsNzc1IG11bHRpcGx5IDFlKzYwIDFlKzMyNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsNzc2IG11bHRpcGx5IDFlKzYwIDFlKzMyNyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsNzc3IG11bHRpcGx5IDFlKzYwIDFlKzMyOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsNzc4IG11bHRpcGx5IDFlKzYwIDFlKzMyOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsNzc5IG11bHRpcGx5IDFlKzYwIDFlKzMzMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworZGRtdWw4MDEgbXVsdGlwbHkgIDEuMDAwMEUtMzk0ICAxICAgICAtPiAxLjAwMDBFLTM5NCBTdWJub3JtYWwKK2RkbXVsODAyIG11bHRpcGx5ICAxLjAwMEUtMzk0ICAgMWUtMSAgLT4gMS4wMDBFLTM5NSAgU3Vibm9ybWFsCitkZG11bDgwMyBtdWx0aXBseSAgMS4wMEUtMzk0ICAgIDFlLTIgIC0+IDEuMDBFLTM5NiAgIFN1Ym5vcm1hbAorZGRtdWw4MDQgbXVsdGlwbHkgIDEuMEUtMzk0ICAgICAxZS0zICAtPiAxLjBFLTM5NyAgICBTdWJub3JtYWwKK2RkbXVsODA1IG11bHRpcGx5ICAxLjBFLTM5NCAgICAgMWUtNCAgLT4gMUUtMzk4ICAgICBTdWJub3JtYWwgUm91bmRlZAorZGRtdWw4MDYgbXVsdGlwbHkgIDEuM0UtMzk0ICAgICAxZS00ICAtPiAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgwNyBtdWx0aXBseSAgMS41RS0zOTQgICAgIDFlLTQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODA4IG11bHRpcGx5ICAxLjdFLTM5NCAgICAgMWUtNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MDkgbXVsdGlwbHkgIDIuM0UtMzk0ICAgICAxZS00ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgxMCBtdWx0aXBseSAgMi41RS0zOTQgICAgIDFlLTQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODExIG11bHRpcGx5ICAyLjdFLTM5NCAgICAgMWUtNCAgLT4gM0UtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MTIgbXVsdGlwbHkgIDEuNDlFLTM5NCAgICAxZS00ICAtPiAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgxMyBtdWx0aXBseSAgMS41MEUtMzk0ICAgIDFlLTQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODE0IG11bHRpcGx5ICAxLjUxRS0zOTQgICAgMWUtNCAgLT4gMkUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MTUgbXVsdGlwbHkgIDIuNDlFLTM5NCAgICAxZS00ICAtPiAyRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgxNiBtdWx0aXBseSAgMi41MEUtMzk0ICAgIDFlLTQgIC0+IDJFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODE3IG11bHRpcGx5ICAyLjUxRS0zOTQgICAgMWUtNCAgLT4gM0UtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkZG11bDgxOCBtdWx0aXBseSAgMUUtMzk0ICAgICAgIDFlLTQgIC0+IDFFLTM5OCAgICAgU3Vibm9ybWFsCitkZG11bDgxOSBtdWx0aXBseSAgM0UtMzk0ICAgICAgIDFlLTUgIC0+IDBFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw4MjAgbXVsdGlwbHkgIDVFLTM5NCAgICAgICAxZS01ICAtPiAwRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkbXVsODIxIG11bHRpcGx5ICA3RS0zOTQgICAgICAgMWUtNSAgLT4gMUUtMzk4ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MjIgbXVsdGlwbHkgIDlFLTM5NCAgICAgICAxZS01ICAtPiAxRS0zOTggICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgyMyBtdWx0aXBseSAgOS45RS0zOTQgICAgIDFlLTUgIC0+IDFFLTM5OCAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZGRtdWw4MjQgbXVsdGlwbHkgIDFFLTM5NCAgICAgIC0xZS00ICAtPiAtMUUtMzk4ICAgIFN1Ym5vcm1hbAorZGRtdWw4MjUgbXVsdGlwbHkgIDNFLTM5NCAgICAgIC0xZS01ICAtPiAtMEUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkbXVsODI2IG11bHRpcGx5IC01RS0zOTQgICAgICAgMWUtNSAgLT4gLTBFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG11bDgyNyBtdWx0aXBseSAgN0UtMzk0ICAgICAgLTFlLTUgIC0+IC0xRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbXVsODI4IG11bHRpcGx5IC05RS0zOTQgICAgICAgMWUtNSAgLT4gLTFFLTM5OCAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRtdWw4MjkgbXVsdGlwbHkgIDkuOUUtMzk0ICAgIC0xZS01ICAtPiAtMUUtMzk4ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG11bDgzMCBtdWx0aXBseSAgMy4wRS0zOTQgICAgLTFlLTUgIC0+IC0wRS0zOTggICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkZG11bDgzMSBtdWx0aXBseSAgMS4wRS0xOTkgICAgIDFlLTIwMCAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRtdWw4MzIgbXVsdGlwbHkgIDEuMEUtMTk5ICAgICAxZS0xOTkgLT4gMUUtMzk4ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkZG11bDgzMyBtdWx0aXBseSAgMS4wRS0xOTkgICAgIDFlLTE5OCAtPiAxLjBFLTM5NyAgICBTdWJub3JtYWwKK2RkbXVsODM0IG11bHRpcGx5ICAyLjBFLTE5OSAgICAgMmUtMTk4IC0+IDQuMEUtMzk3ICAgIFN1Ym5vcm1hbAorZGRtdWw4MzUgbXVsdGlwbHkgIDQuMEUtMTk5ICAgICA0ZS0xOTggLT4gMS42MEUtMzk2ICAgU3Vibm9ybWFsCitkZG11bDgzNiBtdWx0aXBseSAxMC4wRS0xOTkgICAgMTBlLTE5OCAtPiAxLjAwMEUtMzk1ICBTdWJub3JtYWwKK2RkbXVsODM3IG11bHRpcGx5IDMwLjBFLTE5OSAgICAzMGUtMTk4IC0+IDkuMDAwRS0zOTUgIFN1Ym5vcm1hbAorZGRtdWw4MzggbXVsdGlwbHkgNDAuMEUtMTk5ICAgIDQwZS0xODggLT4gMS42MDAwRS0zODQgU3Vibm9ybWFsCitkZG11bDgzOSBtdWx0aXBseSA0MC4wRS0xOTkgICAgNDBlLTE4NyAtPiAxLjYwMDBFLTM4MworZGRtdWw4NDAgbXVsdGlwbHkgNDAuMEUtMTk5ICAgIDQwZS0xODYgLT4gMS42MDAwRS0zODIKKworLS0gTG9uZyBvcGVyYW5kIG92ZXJmbG93IG1heSBiZSBhIGRpZmZlcmVudCBwYXRoCitkZG11bDg3MCBtdWx0aXBseSAxMDAgIDkuOTk5RSszODMgICAgICAgICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkZG11bDg3MSBtdWx0aXBseSAxMDAgLTkuOTk5RSszODMgICAgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2RkbXVsODcyIG11bHRpcGx5ICAgICAgOS45OTlFKzM4MyAxMDAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGRtdWw4NzMgbXVsdGlwbHkgICAgIC05Ljk5OUUrMzgzIDEwMCAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitkZG11bDg4MSBtdWx0aXBseSAgMS4yMzQ3RS0zNTUgMS4yMzQ3RS00MCAgLT4gIDEuNTI0RS0zOTUgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkbXVsODgyIG11bHRpcGx5ICAxLjIzNEUtMzU1IDEuMjM0RS00MCAgICAtPiAgMS41MjNFLTM5NSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGRtdWw4ODMgbXVsdGlwbHkgIDEuMjNFLTM1NSAgMS4yM0UtNDAgICAgIC0+ICAxLjUxM0UtMzk1IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkZG11bDg4NCBtdWx0aXBseSAgMS4yRS0zNTUgICAxLjJFLTQwICAgICAgLT4gIDEuNDRFLTM5NSAgU3Vibm9ybWFsCitkZG11bDg4NSBtdWx0aXBseSAgMS4yRS0zNTUgICAxLjJFLTQxICAgICAgLT4gIDEuNDRFLTM5NiAgU3Vibm9ybWFsCitkZG11bDg4NiBtdWx0aXBseSAgMS4yRS0zNTUgICAxLjJFLTQyICAgICAgLT4gIDEuNEUtMzk3ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkbXVsODg3IG11bHRpcGx5ICAxLjJFLTM1NSAgIDEuM0UtNDIgICAgICAtPiAgMS42RS0zOTcgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZGRtdWw4ODggbXVsdGlwbHkgIDEuM0UtMzU1ICAgMS4zRS00MiAgICAgIC0+ICAxLjdFLTM5NyAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkZG11bDg4OSBtdWx0aXBseSAgMS4zRS0zNTUgICAxLjNFLTQzICAgICAgLT4gICAgMkUtMzk4ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkbXVsODkwIG11bHRpcGx5ICAxLjNFLTM1NiAgIDEuM0UtNDMgICAgICAtPiAgICAwRS0zOTggICBDbGFtcGVkIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKK2RkbXVsODkxIG11bHRpcGx5ICAxLjIzNDVFLTM5ICAgMS4yMzRFLTM1NSAtPiAgMS41MjM0RS0zOTQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkbXVsODkyIG11bHRpcGx5ICAxLjIzNDU2RS0zOSAgMS4yMzRFLTM1NSAtPiAgMS41MjM0RS0zOTQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkbXVsODkzIG11bHRpcGx5ICAxLjIzNDVFLTQwICAgMS4yMzRFLTM1NSAtPiAgMS41MjNFLTM5NSAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkbXVsODk0IG11bHRpcGx5ICAxLjIzNDU2RS00MCAgMS4yMzRFLTM1NSAtPiAgMS41MjNFLTM5NSAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkbXVsODk1IG11bHRpcGx5ICAxLjIzNDVFLTQxICAgMS4yMzRFLTM1NSAtPiAgMS41MkUtMzk2ICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RkbXVsODk2IG11bHRpcGx5ICAxLjIzNDU2RS00MSAgMS4yMzRFLTM1NSAtPiAgMS41MkUtMzk2ICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gTm93IGV4cGxvcmUgdGhlIGNhc2Ugd2hlcmUgd2UgZ2V0IGEgbm9ybWFsIHJlc3VsdCB3aXRoIFVuZGVyZmxvdworLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgMjM0NTY3ODkwMTIzNDU2CitkZG11bDkwMCBtdWx0aXBseSAgMC4zMDAwMDAwMDAwRS0xOTEgMC4zMDAwMDAwMDAwRS0xOTEgLT4gOS4wMDAwMDAwMDAwMDAwMEUtMzg0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZG11bDkwMSBtdWx0aXBseSAgMC4zMDAwMDAwMDAxRS0xOTEgMC4zMDAwMDAwMDAxRS0xOTEgLT4gOS4wMDAwMDAwMDYwMDAwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZG11bDkwMiBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5ICAgIC0+IDkuOTk5OTk5OTk5OTkwMDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZGRtdWw5MDMgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTkgICAtPiA5Ljk5OTk5OTk5OTk5OTAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2RkbXVsOTA0IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OSAgLT4gOS45OTk5OTk5OTk5OTk5MEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZG11bDkwNSBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5IC0+IDkuOTk5OTk5OTk5OTk5OTlFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorLS0gVGhlIG5leHQgcm91bmRzIHRvIE5taW4gKGIqKmVtaW4pOyB0aGlzIGlzIHRoZSBkaXN0aW5ndWlzaGluZyBjYXNlCistLSBmb3IgZGV0ZWN0aW5nIHRpbmluZXNzIChiZWZvcmUgb3IgYWZ0ZXIgcm91bmRpbmcpIC0tIGlmIGFmdGVyCistLSByb3VuZGluZyB0aGVuIHRoZSByZXN1bHQgd291bGQgYmUgdGhlIHNhbWUsIGJ1dCB0aGUgVW5kZXJmbG93IGZsYWcKKy0tIHdvdWxkIG5vdCBiZSBzZXQKK2RkbXVsOTA2IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OTk5ICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCistLSBwcm92ZSB0aG9zZSBvcGVyYW5kcyB3ZXJlIGV4YWN0CitkZG11bDkwNyBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMSAgICAgICAgICAgICAgICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTM4MworZGRtdWw5MDggbXVsdGlwbHkgICAgICAgICAgICAgICAgICAgICAgIDEgIDAuMDk5OTk5OTk5OTk5OTk5OTkgICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTkKKworLS0gcmVkdWNpbmcgdGluaWVzdAorZGRtdWw5MTAgbXVsdGlwbHkgMWUtMzk4IDAuOTkgLT4gMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkZG11bDkxMSBtdWx0aXBseSAxZS0zOTggMC43NSAtPiAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RkbXVsOTEyIG11bHRpcGx5IDFlLTM5OCAwLjUgIC0+IDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitkZG11bDkxMyBtdWx0aXBseSAxZS0zOTggMC4yNSAtPiAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZGRtdWw5MTQgbXVsdGlwbHkgMWUtMzk4IDAuMDEgLT4gMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworLS0gaHVnZXN0CitkZG11bDkyMCBtdWx0aXBseSAgOTk5OTk5OTk5OTk5OTk5OSA5OTk5OTk5OTk5OTk5OTk5IC0+IDkuOTk5OTk5OTk5OTk5OTk4RSszMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gcG93ZXItb2YtdGVuIGVkZ2UgY2FzZXMKK2RkbXVsMTAwMSBtdWx0aXBseSAgMSAgICAgIDEwICAgICAgICAgICAgICAgLT4gMTAKK2RkbXVsMTAwMiBtdWx0aXBseSAgMSAgICAgIDEwMCAgICAgICAgICAgICAgLT4gMTAwCitkZG11bDEwMDMgbXVsdGlwbHkgIDEgICAgICAxMDAwICAgICAgICAgICAgIC0+IDEwMDAKK2RkbXVsMTAwNCBtdWx0aXBseSAgMSAgICAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAKK2RkbXVsMTAwNSBtdWx0aXBseSAgMSAgICAgIDEwMDAwMCAgICAgICAgICAgLT4gMTAwMDAwCitkZG11bDEwMDYgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwICAgICAgICAgIC0+IDEwMDAwMDAKK2RkbXVsMTAwNyBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAKK2RkbXVsMTAwOCBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMCAgICAgICAgLT4gMTAwMDAwMDAwCitkZG11bDEwMDkgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAKK2RkbXVsMTAxMCBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAKK2RkbXVsMTAxMSBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMCAgICAgLT4gMTAwMDAwMDAwMDAwCitkZG11bDEwMTIgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMDAwICAgIC0+IDEwMDAwMDAwMDAwMDAKK2RkbXVsMTAxMyBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwICAgLT4gMTAwMDAwMDAwMDAwMDAKK2RkbXVsMTAxNCBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwMCAgLT4gMTAwMDAwMDAwMDAwMDAwCitkZG11bDEwMTUgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAKK2RkbXVsMTAyMSBtdWx0aXBseSAgMTAgICAgIDEgICAgICAgICAgICAgICAgLT4gMTAKK2RkbXVsMTAyMiBtdWx0aXBseSAgMTAgICAgIDEwICAgICAgICAgICAgICAgLT4gMTAwCitkZG11bDEwMjMgbXVsdGlwbHkgIDEwICAgICAxMDAgICAgICAgICAgICAgIC0+IDEwMDAKK2RkbXVsMTAyNCBtdWx0aXBseSAgMTAgICAgIDEwMDAgICAgICAgICAgICAgLT4gMTAwMDAKK2RkbXVsMTAyNSBtdWx0aXBseSAgMTAgICAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAwCitkZG11bDEwMjYgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAgICAgICAgICAgIC0+IDEwMDAwMDAKK2RkbXVsMTAyNyBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAgICAgICAgICAgLT4gMTAwMDAwMDAKK2RkbXVsMTAyOCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAwCitkZG11bDEwMjkgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAgICAgICAgIC0+IDEwMDAwMDAwMDAKK2RkbXVsMTAzMCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAgICAgICAgLT4gMTAwMDAwMDAwMDAKK2RkbXVsMTAzMSBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwCitkZG11bDEwMzIgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAgICAgIC0+IDEwMDAwMDAwMDAwMDAKK2RkbXVsMTAzMyBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAgICAgLT4gMTAwMDAwMDAwMDAwMDAKK2RkbXVsMTAzNCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwICAgLT4gMTAwMDAwMDAwMDAwMDAwCitkZG11bDEwMzUgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAwMDAgIC0+IDEwMDAwMDAwMDAwMDAwMDAKK2RkbXVsMTA0MSBtdWx0aXBseSAgMTAwICAgIDAuMSAgICAgICAgICAgICAgLT4gMTAuMAorZGRtdWwxMDQyIG11bHRpcGx5ICAxMDAgICAgMSAgICAgICAgICAgICAgICAtPiAxMDAKK2RkbXVsMTA0MyBtdWx0aXBseSAgMTAwICAgIDEwICAgICAgICAgICAgICAgLT4gMTAwMAorZGRtdWwxMDQ0IG11bHRpcGx5ICAxMDAgICAgMTAwICAgICAgICAgICAgICAtPiAxMDAwMAorZGRtdWwxMDQ1IG11bHRpcGx5ICAxMDAgICAgMTAwMCAgICAgICAgICAgICAtPiAxMDAwMDAKK2RkbXVsMTA0NiBtdWx0aXBseSAgMTAwICAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAwMAorZGRtdWwxMDQ3IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAwMAorZGRtdWwxMDQ4IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMCAgICAgICAgICAtPiAxMDAwMDAwMDAKK2RkbXVsMTA0OSBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAwMAorZGRtdWwxMDUwIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAwMAorZGRtdWwxMDUxIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMCAgICAgICAtPiAxMDAwMDAwMDAwMDAKK2RkbXVsMTA1MiBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwMAorZGRtdWwxMDUzIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAwMAorZGRtdWwxMDU0IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMCAgICAtPiAxMDAwMDAwMDAwMDAwMDAKK2RkbXVsMTA1NSBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwMDAwICAgLT4gMTAwMDAwMDAwMDAwMDAwMAorZGRtdWwxMDYxIG11bHRpcGx5ICAxMDAwICAgMC4wMSAgICAgICAgICAgICAtPiAxMC4wMAorZGRtdWwxMDYyIG11bHRpcGx5ICAxMDAwICAgMC4xICAgICAgICAgICAgICAtPiAxMDAuMAorZGRtdWwxMDYzIG11bHRpcGx5ICAxMDAwICAgMSAgICAgICAgICAgICAgICAtPiAxMDAwCitkZG11bDEwNjQgbXVsdGlwbHkgIDEwMDAgICAxMCAgICAgICAgICAgICAgIC0+IDEwMDAwCitkZG11bDEwNjUgbXVsdGlwbHkgIDEwMDAgICAxMDAgICAgICAgICAgICAgIC0+IDEwMDAwMAorZGRtdWwxMDY2IG11bHRpcGx5ICAxMDAwICAgMTAwMCAgICAgICAgICAgICAtPiAxMDAwMDAwCitkZG11bDEwNjcgbXVsdGlwbHkgIDEwMDAgICAxMDAwMCAgICAgICAgICAgIC0+IDEwMDAwMDAwCitkZG11bDEwNjggbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAgICAgICAgICAgIC0+IDEwMDAwMDAwMAorZGRtdWwxMDY5IG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMCAgICAgICAgICAtPiAxMDAwMDAwMDAwCitkZG11bDEwNzAgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMCAgICAgICAgIC0+IDEwMDAwMDAwMDAwCitkZG11bDEwNzEgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAgICAgICAgIC0+IDEwMDAwMDAwMDAwMAorZGRtdWwxMDcyIG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAwMCAgICAgICAtPiAxMDAwMDAwMDAwMDAwCitkZG11bDEwNzMgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMCAgICAgIC0+IDEwMDAwMDAwMDAwMDAwCitkZG11bDEwNzQgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMDAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMAorZGRtdWwxMDc1IG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAwMDAwMCAgICAtPiAxMDAwMDAwMDAwMDAwMDAwCitkZG11bDEwODEgbXVsdGlwbHkgIDEwMDAwICAwLjAwMSAgICAgICAgICAgIC0+IDEwLjAwMAorZGRtdWwxMDgyIG11bHRpcGx5ICAxMDAwMCAgMC4wMSAgICAgICAgICAgICAtPiAxMDAuMDAKK2RkbXVsMTA4MyBtdWx0aXBseSAgMTAwMDAgIDAuMSAgICAgICAgICAgICAgLT4gMTAwMC4wCitkZG11bDEwODQgbXVsdGlwbHkgIDEwMDAwICAxICAgICAgICAgICAgICAgIC0+IDEwMDAwCitkZG11bDEwODUgbXVsdGlwbHkgIDEwMDAwICAxMCAgICAgICAgICAgICAgIC0+IDEwMDAwMAorZGRtdWwxMDg2IG11bHRpcGx5ICAxMDAwMCAgMTAwICAgICAgICAgICAgICAtPiAxMDAwMDAwCitkZG11bDEwODcgbXVsdGlwbHkgIDEwMDAwICAxMDAwICAgICAgICAgICAgIC0+IDEwMDAwMDAwCitkZG11bDEwODggbXVsdGlwbHkgIDEwMDAwICAxMDAwMCAgICAgICAgICAgIC0+IDEwMDAwMDAwMAorZGRtdWwxMDg5IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAwMDAwCitkZG11bDEwOTAgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwICAgICAgICAgIC0+IDEwMDAwMDAwMDAwCitkZG11bDEwOTEgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMCAgICAgICAgIC0+IDEwMDAwMDAwMDAwMAorZGRtdWwxMDkyIG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAwMDAwCitkZG11bDEwOTMgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAwMDAwCitkZG11bDEwOTQgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMCAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMAorZGRtdWwxMDk1IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAwMDAwCisKK2RkbXVsMTA5NyBtdWx0aXBseSAgMTAwMDAgICA5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5MDAwMAorZGRtdWwxMDk4IG11bHRpcGx5ICAxMDAwMCAgIDk5OTk5OTk5OTk5ICAgICAtPiAgOTk5OTk5OTk5OTkwMDAwCisKKworLS0gTnVsbCB0ZXN0cworZGRtdWw5OTkwIG11bHRpcGx5IDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRtdWw5OTkxIG11bHRpcGx5ICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTmV4dE1pbnVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTmV4dE1pbnVzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzlmNThjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0TWludXMuZGVjVGVzdApAQCAtMCwwICsxLDEyNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE5leHRNaW51cy5kZWNUZXN0IC0tIGRlY0RvdWJsZSBuZXh0IHRoYXQgaXMgbGVzcyBbNzU0ciBuZXh0ZG93bl0gLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZG5leHRtMDAxIG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk1IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk0CitkZG5leHRtMDAyIG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk2IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk1CitkZG5leHRtMDAzIG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk3IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk2CitkZG5leHRtMDA0IG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk4IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk3CitkZG5leHRtMDA1IG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHRtMDA2IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAgIC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHRtMDA3IG5leHRtaW51cyAgMS4wICAgICAgICAgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dG0wMDggbmV4dG1pbnVzICAxICAgICAgICAgICAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0bTAwOSBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAxICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwCitkZG5leHRtMDEwIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDIgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dG0wMTEgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0bTAxMiBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDA0ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAzCitkZG5leHRtMDEzIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDUgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDQKK2RkbmV4dG0wMTQgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwNiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0bTAxNSBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDA3ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA2CitkZG5leHRtMDE2IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDggIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDcKK2RkbmV4dG0wMTcgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwOSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0bTAxOCBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDEwICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA5CitkZG5leHRtMDE5IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMTEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMTAKK2RkbmV4dG0wMjAgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAxMiAgLT4gICAxLjAwMDAwMDAwMDAwMDAxMQorCitkZG5leHRtMDIxIG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk1IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk2CitkZG5leHRtMDIyIG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk2IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk3CitkZG5leHRtMDIzIG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk3IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHRtMDI0IG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk4IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHRtMDI1IG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAKK2RkbmV4dG0wMjYgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0bTAyNyBuZXh0bWludXMgLTEuMCAgICAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dG0wMjggbmV4dG1pbnVzIC0xICAgICAgICAgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHRtMDI5IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDIKK2RkbmV4dG0wMzAgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMiAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMworZGRuZXh0bTAzMSBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAzICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA0CitkZG5leHRtMDMyIG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDQgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDUKK2RkbmV4dG0wMzMgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwNSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNgorZGRuZXh0bTAzNCBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDA2ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA3CitkZG5leHRtMDM1IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDcgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDgKK2RkbmV4dG0wMzYgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwOCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOQorZGRuZXh0bTAzNyBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDA5ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDEwCitkZG5leHRtMDM4IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMTAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMTEKK2RkbmV4dG0wMzkgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAxMSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAxMgorCistLSB1bHRyYS10aW55IGlucHV0cworZGRuZXh0bTA2MiBuZXh0bWludXMgIDFFLTM5OCAgICAgICAgIC0+ICAgMEUtMzk4CitkZG5leHRtMDY1IG5leHRtaW51cyAtMUUtMzk4ICAgICAgICAgLT4gIC0yRS0zOTgKKworLS0gWmVyb3MKK2RkbmV4dG0xMDAgbmV4dG1pbnVzIC0wICAgICAgICAgICAtPiAtMUUtMzk4CitkZG5leHRtMTAxIG5leHRtaW51cyAgMCAgICAgICAgICAgLT4gLTFFLTM5OAorZGRuZXh0bTEwMiBuZXh0bWludXMgIDAuMDAgICAgICAgIC0+IC0xRS0zOTgKK2RkbmV4dG0xMDMgbmV4dG1pbnVzIC0wLjAwICAgICAgICAtPiAtMUUtMzk4CitkZG5leHRtMTA0IG5leHRtaW51cyAgMEUtMzAwICAgICAgLT4gLTFFLTM5OAorZGRuZXh0bTEwNSBuZXh0bWludXMgIDBFKzMwMCAgICAgIC0+IC0xRS0zOTgKK2RkbmV4dG0xMDYgbmV4dG1pbnVzICAwRSszMDAwMCAgICAtPiAtMUUtMzk4CitkZG5leHRtMTA3IG5leHRtaW51cyAtMEUrMzAwMDAgICAgLT4gLTFFLTM5OAorCistLSBzcGVjaWFscworZGRuZXh0bTE1MCBuZXh0bWludXMgICBJbmYgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dG0xNTEgbmV4dG1pbnVzICAtSW5mICAgIC0+IC1JbmZpbml0eQorZGRuZXh0bTE1MiBuZXh0bWludXMgICBOYU4gICAgLT4gIE5hTgorZGRuZXh0bTE1MyBuZXh0bWludXMgIHNOYU4gICAgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHRtMTU0IG5leHRtaW51cyAgIE5hTjc3ICAtPiAgTmFONzcKK2RkbmV4dG0xNTUgbmV4dG1pbnVzICBzTmFOODggIC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0bTE1NiBuZXh0bWludXMgIC1OYU4gICAgLT4gLU5hTgorZGRuZXh0bTE1NyBuZXh0bWludXMgLXNOYU4gICAgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHRtMTU4IG5leHRtaW51cyAgLU5hTjc3ICAtPiAtTmFONzcKK2RkbmV4dG0xNTkgbmV4dG1pbnVzIC1zTmFOODggIC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworZGRuZXh0bTE3MCBuZXh0bWludXMgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OEUrMzg0CitkZG5leHRtMTcxIG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OThFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk3RSszODQKK2RkbmV4dG0xNzIgbmV4dG1pbnVzICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OUUtMzg0CitkZG5leHRtMTczIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0+IDkuOTk5OTk5OTk5OTk5OTlFLTM4NAorZGRuZXh0bTE3NCBuZXh0bWludXMgIDlFLTM5OCAgICAgICAgICAgICAgICAgICAtPiA4RS0zOTgKK2RkbmV4dG0xNzUgbmV4dG1pbnVzICA5LjlFLTM5NyAgICAgICAgICAgICAgICAgLT4gOS44RS0zOTcKK2RkbmV4dG0xNzYgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5RS0zODcgICAgICAgLT4gOS45OTk5OTk5OTk5OEUtMzg3CitkZG5leHRtMTc3IG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OUUtMzg0ICAgIC0+IDkuOTk5OTk5OTk5OTk5OThFLTM4NAorZGRuZXh0bTE3OCBuZXh0bWludXMgIDkuOTk5OTk5OTk5OTk5OThFLTM4NCAgICAtPiA5Ljk5OTk5OTk5OTk5OTk3RS0zODQKK2RkbmV4dG0xNzkgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk3RS0zODQgICAgLT4gOS45OTk5OTk5OTk5OTk5NkUtMzg0CitkZG5leHRtMTgwIG5leHRtaW51cyAgMEUtMzk4ICAgICAgICAgICAgICAgICAgIC0+IC0xRS0zOTgKK2RkbmV4dG0xODEgbmV4dG1pbnVzICAxRS0zOTggICAgICAgICAgICAgICAgICAgLT4gMEUtMzk4CitkZG5leHRtMTgyIG5leHRtaW51cyAgMkUtMzk4ICAgICAgICAgICAgICAgICAgIC0+IDFFLTM5OAorCitkZG5leHRtMTgzIG5leHRtaW51cyAgLTBFLTM5OCAgICAgICAgICAgICAgICAgIC0+IC0xRS0zOTgKK2RkbmV4dG0xODQgbmV4dG1pbnVzICAtMUUtMzk4ICAgICAgICAgICAgICAgICAgLT4gLTJFLTM5OAorZGRuZXh0bTE4NSBuZXh0bWludXMgIC0yRS0zOTggICAgICAgICAgICAgICAgICAtPiAtM0UtMzk4CitkZG5leHRtMTg2IG5leHRtaW51cyAgLTEwRS0zOTggICAgICAgICAgICAgICAgIC0+IC0xLjFFLTM5NworZGRuZXh0bTE4NyBuZXh0bWludXMgIC0xMDBFLTM5OCAgICAgICAgICAgICAgICAtPiAtMS4wMUUtMzk2CitkZG5leHRtMTg4IG5leHRtaW51cyAgLTEwMDAwMEUtMzk4ICAgICAgICAgICAgIC0+IC0xLjAwMDAxRS0zOTMKK2RkbmV4dG0xODkgbmV4dG1pbnVzICAtMS4wMDAwMDAwMDAwMEUtMzgzICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dG0xOTAgbmV4dG1pbnVzICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dG0xOTEgbmV4dG1pbnVzICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dG0xOTIgbmV4dG1pbnVzICAtOS45OTk5OTk5OTk5OTk5OThFKzM4NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dG0xOTMgbmV4dG1pbnVzICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gLUluZmluaXR5CisKKy0tIE51bGwgdGVzdHMKK2RkbmV4dG05MDAgbmV4dG1pbnVzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTmV4dFBsdXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0UGx1cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0MWRmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkTmV4dFBsdXMuZGVjVGVzdApAQCAtMCwwICsxLDEyNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZE5leHRQbHVzLmRlY1Rlc3QgLS0gZGVjRG91YmxlIG5leHQgdGhhdCBpcyBncmVhdGVyIFs3NTRyIG5leHR1cF0gLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjRG91Ymxlcy4KK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkZG5leHRwMDAxIG5leHRwbHVzICAwLjk5OTk5OTk5OTk5OTk5OTUgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTYKK2RkbmV4dHAwMDIgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5NiAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5NworZGRuZXh0cDAwMyBuZXh0cGx1cyAgMC45OTk5OTk5OTk5OTk5OTk3IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHRwMDA0IG5leHRwbHVzICAwLjk5OTk5OTk5OTk5OTk5OTggLT4gICAwLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHAwMDUgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5OSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwCitkZG5leHRwMDA2IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0cDAwNyBuZXh0cGx1cyAgMS4wICAgICAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0cDAwOCBuZXh0cGx1cyAgMSAgICAgICAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0cDAwOSBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDIKK2RkbmV4dHAwMTAgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAyICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAzCitkZG5leHRwMDExIG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwNAorZGRuZXh0cDAxMiBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDQgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDUKK2RkbmV4dHAwMTMgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDA1ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA2CitkZG5leHRwMDE0IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwNiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwNworZGRuZXh0cDAxNSBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDcgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDgKK2RkbmV4dHAwMTYgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDA4ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDA5CitkZG5leHRwMDE3IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwOSAgLT4gICAxLjAwMDAwMDAwMDAwMDAxMAorZGRuZXh0cDAxOCBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMTAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMTEKK2RkbmV4dHAwMTkgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDExICAtPiAgIDEuMDAwMDAwMDAwMDAwMDEyCisKK2RkbmV4dHAwMjEgbmV4dHBsdXMgLTAuOTk5OTk5OTk5OTk5OTk5NSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5NAorZGRuZXh0cDAyMiBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk2IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk1CitkZG5leHRwMDIzIG5leHRwbHVzIC0wLjk5OTk5OTk5OTk5OTk5OTcgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTYKK2RkbmV4dHAwMjQgbmV4dHBsdXMgLTAuOTk5OTk5OTk5OTk5OTk5OCAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5NworZGRuZXh0cDAyNSBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHRwMDI2IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMCAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHAwMjcgbmV4dHBsdXMgLTEuMCAgICAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHRwMDI4IG5leHRwbHVzIC0xICAgICAgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0cDAyOSBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAKK2RkbmV4dHAwMzAgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAyICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHRwMDMxIG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0cDAzMiBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDQgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDMKK2RkbmV4dHAwMzMgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDA1ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA0CitkZG5leHRwMDM0IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwNiAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0cDAzNSBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDcgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDYKK2RkbmV4dHAwMzYgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDA4ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDA3CitkZG5leHRwMDM3IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwOSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0cDAzOCBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMTAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDkKK2RkbmV4dHAwMzkgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDExICAtPiAgLTEuMDAwMDAwMDAwMDAwMDEwCitkZG5leHRwMDQwIG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAxMiAgLT4gIC0xLjAwMDAwMDAwMDAwMDAxMQorCistLSBaZXJvcworZGRuZXh0cDEwMCBuZXh0cGx1cyAgMCAgICAgICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwMSBuZXh0cGx1cyAgMC4wMCAgICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwMiBuZXh0cGx1cyAgMEUtMzAwICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwMyBuZXh0cGx1cyAgMEUrMzAwICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwNCBuZXh0cGx1cyAgMEUrMzAwMDAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwNSBuZXh0cGx1cyAtMCAgICAgICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwNiBuZXh0cGx1cyAtMC4wMCAgICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwNyBuZXh0cGx1cyAtMEUtMzAwICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwOCBuZXh0cGx1cyAtMEUrMzAwICAgICAgLT4gIDFFLTM5OAorZGRuZXh0cDEwOSBuZXh0cGx1cyAtMEUrMzAwMDAgICAgLT4gIDFFLTM5OAorCistLSBzcGVjaWFscworZGRuZXh0cDE1MCBuZXh0cGx1cyAgIEluZiAgICAtPiAgSW5maW5pdHkKK2RkbmV4dHAxNTEgbmV4dHBsdXMgIC1JbmYgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHAxNTIgbmV4dHBsdXMgICBOYU4gICAgLT4gIE5hTgorZGRuZXh0cDE1MyBuZXh0cGx1cyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHAxNTQgbmV4dHBsdXMgICBOYU43NyAgLT4gIE5hTjc3CitkZG5leHRwMTU1IG5leHRwbHVzICBzTmFOODggIC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0cDE1NiBuZXh0cGx1cyAgLU5hTiAgICAtPiAtTmFOCitkZG5leHRwMTU3IG5leHRwbHVzIC1zTmFOICAgIC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0cDE1OCBuZXh0cGx1cyAgLU5hTjc3ICAtPiAtTmFONzcKK2RkbmV4dHAxNTkgbmV4dHBsdXMgLXNOYU44OCAgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCitkZG5leHRwMTcwIG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk4RSszODQKK2RkbmV4dHAxNzEgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OEUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTdFKzM4NAorZGRuZXh0cDE3MiBuZXh0cGx1cyAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5RS0zODQKK2RkbmV4dHAxNzMgbmV4dHBsdXMgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAtOS45OTk5OTk5OTk5OTk5OUUtMzg0CitkZG5leHRwMTc0IG5leHRwbHVzICAtOUUtMzk4ICAgICAgICAgICAgICAgICAgLT4gLThFLTM5OAorZGRuZXh0cDE3NSBuZXh0cGx1cyAgLTkuOUUtMzk3ICAgICAgICAgICAgICAgIC0+IC05LjhFLTM5NworZGRuZXh0cDE3NiBuZXh0cGx1cyAgLTkuOTk5OTk5OTk5OTlFLTM4NyAgICAgIC0+IC05Ljk5OTk5OTk5OTk4RS0zODcKK2RkbmV4dHAxNzcgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5RS0zODQgICAtPiAtOS45OTk5OTk5OTk5OTk5OEUtMzg0CitkZG5leHRwMTc4IG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5OEUtMzg0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTdFLTM4NAorZGRuZXh0cDE3OSBuZXh0cGx1cyAgLTkuOTk5OTk5OTk5OTk5OTdFLTM4NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk2RS0zODQKK2RkbmV4dHAxODAgbmV4dHBsdXMgIC0wRS0zOTggICAgICAgICAgICAgICAgICAtPiAgMUUtMzk4CitkZG5leHRwMTgxIG5leHRwbHVzICAtMUUtMzk4ICAgICAgICAgICAgICAgICAgLT4gLTBFLTM5OAorZGRuZXh0cDE4MiBuZXh0cGx1cyAgLTJFLTM5OCAgICAgICAgICAgICAgICAgIC0+IC0xRS0zOTgKKworZGRuZXh0cDE4MyBuZXh0cGx1cyAgIDBFLTM5OCAgICAgICAgICAgICAgICAgIC0+ICAxRS0zOTgKK2RkbmV4dHAxODQgbmV4dHBsdXMgICAxRS0zOTggICAgICAgICAgICAgICAgICAtPiAgMkUtMzk4CitkZG5leHRwMTg1IG5leHRwbHVzICAgMkUtMzk4ICAgICAgICAgICAgICAgICAgLT4gIDNFLTM5OAorZGRuZXh0cDE4NiBuZXh0cGx1cyAgIDEwRS0zOTggICAgICAgICAgICAgICAgIC0+ICAxLjFFLTM5NworZGRuZXh0cDE4NyBuZXh0cGx1cyAgIDEwMEUtMzk4ICAgICAgICAgICAgICAgIC0+ICAxLjAxRS0zOTYKK2RkbmV4dHAxODggbmV4dHBsdXMgICAxMDAwMDBFLTM5OCAgICAgICAgICAgICAtPiAgMS4wMDAwMUUtMzkzCitkZG5leHRwMTg5IG5leHRwbHVzICAgMS4wMDAwMDAwMDAwMEUtMzgzICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dHAxOTAgbmV4dHBsdXMgICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0cDE5MSBuZXh0cGx1cyAgIDFFLTM4MyAgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzCitkZG5leHRwMTkyIG5leHRwbHVzICAgOS45OTk5OTk5OTk5OTk5OThFKzM4NCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHAxOTMgbmV4dHBsdXMgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAgSW5maW5pdHkKKworLS0gTnVsbCB0ZXN0cworZGRuZXh0cDkwMCBuZXh0cGx1cyAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE5leHRUb3dhcmQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0VG93YXJkLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllNDc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGROZXh0VG93YXJkLmRlY1Rlc3QKQEAgLTAsMCArMSwzNzQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGROZXh0VG93YXJkLmRlY1Rlc3QgLS0gZGVjRG91YmxlIG5leHQgdG93YXJkIHJocyBbNzU0ciBuZXh0YWZ0ZXJdIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrIHdpdGggYSBzY2F0dGVyaW5nIG9mIG51bWVyaWNzCitkZG5leHR0MDAxIG5leHR0b3dhcmQgICAxMCAgICAxMCAgIC0+ICAxMAorZGRuZXh0dDAwMiBuZXh0dG93YXJkICAtMTAgICAtMTAgICAtPiAtMTAKK2RkbmV4dHQwMDMgbmV4dHRvd2FyZCAgIDEgICAgIDEwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0MDA0IG5leHR0b3dhcmQgICAxICAgIC0xMCAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQwMDUgbmV4dHRvd2FyZCAgLTEgICAgIDEwICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDAwNiBuZXh0dG93YXJkICAtMSAgICAtMTAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQwMDcgbmV4dHRvd2FyZCAgIDAgICAgIDEwICAgLT4gIDFFLTM5OCAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDAwOCBuZXh0dG93YXJkICAgMCAgICAtMTAgICAtPiAtMUUtMzk4ICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MDA5IG5leHR0b3dhcmQgICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICtJbmZpbml0eSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MDEwIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC1JbmZpbml0eSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MDExIG5leHR0b3dhcmQgICAgICAgOS45OTk5OTk5OTk5OTk5OTkgIDEwICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAKK2RkbmV4dHQwMTIgbmV4dHRvd2FyZCAgIDEwICA5Ljk5OTk5OTk5OTk5OTk5OSAgICAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDAxMyBuZXh0dG93YXJkICAgICAgLTkuOTk5OTk5OTk5OTk5OTk5IC0xMCAgLT4gLTEwLjAwMDAwMDAwMDAwMDAwCitkZG5leHR0MDE0IG5leHR0b3dhcmQgIC0xMCAtOS45OTk5OTk5OTk5OTk5OTkgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQwMTUgbmV4dHRvd2FyZCAgICAgICA5Ljk5OTk5OTk5OTk5OTk5OCAgMTAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDAxNiBuZXh0dG93YXJkICAgMTAgIDkuOTk5OTk5OTk5OTk5OTk4ICAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5CitkZG5leHR0MDE3IG5leHR0b3dhcmQgICAgICAtOS45OTk5OTk5OTk5OTk5OTggLTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQwMTggbmV4dHRvd2FyZCAgLTEwIC05Ljk5OTk5OTk5OTk5OTk5OCAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OQorCistLS0tLS0tIGxocz1yaHMKKy0tIGZpbml0ZXMKK2RkbmV4dHQxMDEgbmV4dHRvd2FyZCAgICAgICAgICA3ICAgICAgIDcgLT4gIDcKK2RkbmV4dHQxMDIgbmV4dHRvd2FyZCAgICAgICAgIC03ICAgICAgLTcgLT4gLTcKK2RkbmV4dHQxMDMgbmV4dHRvd2FyZCAgICAgICAgIDc1ICAgICAgNzUgLT4gIDc1CitkZG5leHR0MTA0IG5leHR0b3dhcmQgICAgICAgIC03NSAgICAgLTc1IC0+IC03NQorZGRuZXh0dDEwNSBuZXh0dG93YXJkICAgICAgIDcuNTAgICAgIDcuNSAtPiAgNy41MAorZGRuZXh0dDEwNiBuZXh0dG93YXJkICAgICAgLTcuNTAgICAtNy41MCAtPiAtNy41MAorZGRuZXh0dDEwNyBuZXh0dG93YXJkICAgICAgIDcuNTAwIDcuNTAwMCAtPiAgNy41MDAKK2RkbmV4dHQxMDggbmV4dHRvd2FyZCAgICAgIC03LjUwMCAgIC03LjUgLT4gLTcuNTAwCisKKy0tIHplcm9zCitkZG5leHR0MTExIG5leHR0b3dhcmQgICAgICAgICAgMCAgICAgICAwIC0+ICAwCitkZG5leHR0MTEyIG5leHR0b3dhcmQgICAgICAgICAtMCAgICAgIC0wIC0+IC0wCitkZG5leHR0MTEzIG5leHR0b3dhcmQgICAgICAgMEUrNCAgICAgICAwIC0+ICAwRSs0CitkZG5leHR0MTE0IG5leHR0b3dhcmQgICAgICAtMEUrNCAgICAgIC0wIC0+IC0wRSs0CitkZG5leHR0MTE1IG5leHR0b3dhcmQgICAgIDAuMDAwMDAwMDAwMDAgICAwLjAwMDAwMDAwMDAwMCAtPiAgMEUtMTEKK2RkbmV4dHQxMTYgbmV4dHRvd2FyZCAgICAtMC4wMDAwMDAwMDAwMCAgLTAuMDAgICAgICAgICAgIC0+IC0wRS0xMQorZGRuZXh0dDExNyBuZXh0dG93YXJkICAgICAgMEUtMTQxICAgICAgMCAtPiAgMEUtMTQxCitkZG5leHR0MTE4IG5leHR0b3dhcmQgICAgIC0wRS0xNDEgICAtMDAwIC0+IC0wRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RkbmV4dHQxMjEgbmV4dHRvd2FyZCAgIDI2ODI2ODI2OCAgICAyNjgyNjgyNjggLT4gICAyNjgyNjgyNjgKK2RkbmV4dHQxMjIgbmV4dHRvd2FyZCAgLTI2ODI2ODI2OCAgIC0yNjgyNjgyNjggLT4gIC0yNjgyNjgyNjgKK2RkbmV4dHQxMjMgbmV4dHRvd2FyZCAgIDEzNDEzNDEzNCAgICAxMzQxMzQxMzQgLT4gICAxMzQxMzQxMzQKK2RkbmV4dHQxMjQgbmV4dHRvd2FyZCAgLTEzNDEzNDEzNCAgIC0xMzQxMzQxMzQgLT4gIC0xMzQxMzQxMzQKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RkbmV4dHQxMzEgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDEzMiBuZXh0dG93YXJkICAxRS0zODMgICAgICAgICAgIDFFLTM4MyAgICAgICAgICAgIC0+ICAgMUUtMzgzCitkZG5leHR0MTMzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkbmV4dHQxMzQgbmV4dHRvd2FyZCAgMUUtMzk4ICAgICAgICAgICAxRS0zOTggICAgICAgICAgICAtPiAgIDFFLTM5OAorCitkZG5leHR0MTM1IG5leHR0b3dhcmQgIC0xRS0zOTggICAgICAgICAgLTFFLTM5OCAgICAgICAgICAgLT4gIC0xRS0zOTgKK2RkbmV4dHQxMzYgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRuZXh0dDEzNyBuZXh0dG93YXJkICAtMUUtMzgzICAgICAgICAgIC0xRS0zODMgICAgICAgICAgIC0+ICAtMUUtMzgzCitkZG5leHR0MTM4IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKKworLS0tLS0tLSBsaHM8cmhzCitkZG5leHR0MjAxIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5NSBJbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5NgorZGRuZXh0dDIwMiBuZXh0dG93YXJkICAwLjk5OTk5OTk5OTk5OTk5OTYgSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTcKK2RkbmV4dHQyMDMgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk3IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHR0MjA0IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OCBJbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDIwNSBuZXh0dG93YXJkICAwLjk5OTk5OTk5OTk5OTk5OTkgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMAorZGRuZXh0dDIwNiBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDIwNyBuZXh0dG93YXJkICAxLjAgICAgICAgICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0MjA4IG5leHR0b3dhcmQgIDEgICAgICAgICAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQyMDkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDEgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDIKK2RkbmV4dHQyMTAgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDIgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDMKK2RkbmV4dHQyMTEgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDMgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDQKK2RkbmV4dHQyMTIgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDQgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDUKK2RkbmV4dHQyMTMgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDUgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDYKK2RkbmV4dHQyMTQgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDYgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDcKK2RkbmV4dHQyMTUgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDcgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDgKK2RkbmV4dHQyMTYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDggIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDkKK2RkbmV4dHQyMTcgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDkgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMTAKK2RkbmV4dHQyMTggbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMTAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMTEKK2RkbmV4dHQyMTkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMTEgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMTIKKworZGRuZXh0dDIyMSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OTk5OTk5OTUgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTQKK2RkbmV4dHQyMjIgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk2IEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk1CitkZG5leHR0MjIzIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5NyBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5NgorZGRuZXh0dDIyNCBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OTk5OTk5OTggSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTcKK2RkbmV4dHQyMjUgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5IEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHR0MjI2IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDIyNyBuZXh0dG93YXJkIC0xLjAgICAgICAgICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDIyOCBuZXh0dG93YXJkIC0xICAgICAgICAgICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDIyOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMAorZGRuZXh0dDIzMCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDIzMSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMyAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0dDIzMiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwNCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMworZGRuZXh0dDIzMyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwNSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNAorZGRuZXh0dDIzNCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwNiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0dDIzNSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwNyAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNgorZGRuZXh0dDIzNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwOCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNworZGRuZXh0dDIzNyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwOSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0dDIzOCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAxMCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOQorZGRuZXh0dDIzOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAxMSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAxMAorZGRuZXh0dDI0MCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAxMiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAxMQorCistLSBaZXJvcworZGRuZXh0dDMwMCBuZXh0dG93YXJkICAwICAgICAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwMSBuZXh0dG93YXJkICAwLjAwICAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwMiBuZXh0dG93YXJkICAwRS0zMDAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwMyBuZXh0dG93YXJkICAwRSszMDAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwNCBuZXh0dG93YXJkICAwRSszMDAwMCAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwNSBuZXh0dG93YXJkIC0wICAgICAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwNiBuZXh0dG93YXJkIC0wLjAwICAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwNyBuZXh0dG93YXJkIC0wRS0zMDAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwOCBuZXh0dG93YXJkIC0wRSszMDAgICAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDMwOSBuZXh0dG93YXJkIC0wRSszMDAwMCAgICBJbmZpbml0eSAtPiAgMUUtMzk4ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBzcGVjaWFscworZGRuZXh0dDM1MCBuZXh0dG93YXJkICAgSW5mICAgIEluZmluaXR5IC0+ICBJbmZpbml0eQorZGRuZXh0dDM1MSBuZXh0dG93YXJkICAtSW5mICAgIEluZmluaXR5IC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0MzUyIG5leHR0b3dhcmQgICBOYU4gICAgSW5maW5pdHkgLT4gIE5hTgorZGRuZXh0dDM1MyBuZXh0dG93YXJkICBzTmFOICAgIEluZmluaXR5IC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDM1NCBuZXh0dG93YXJkICAgTmFONzcgIEluZmluaXR5IC0+ICBOYU43NworZGRuZXh0dDM1NSBuZXh0dG93YXJkICBzTmFOODggIEluZmluaXR5IC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDM1NiBuZXh0dG93YXJkICAtTmFOICAgIEluZmluaXR5IC0+IC1OYU4KK2RkbmV4dHQzNTcgbmV4dHRvd2FyZCAtc05hTiAgICBJbmZpbml0eSAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQzNTggbmV4dHRvd2FyZCAgLU5hTjc3ICBJbmZpbml0eSAtPiAtTmFONzcKK2RkbmV4dHQzNTkgbmV4dHRvd2FyZCAtc05hTjg4ICBJbmZpbml0eSAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gTm1heCwgTm1pbiwgTnRpbnksIHN1Ym5vcm1hbHMKK2RkbmV4dHQzNzAgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OThFKzM4NAorZGRuZXh0dDM3MSBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OThFKzM4NCAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5N0UrMzg0CitkZG5leHR0MzcyIG5leHR0b3dhcmQgIC0xRS0zODMgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzNzMgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OUUtMzg0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM3NCBuZXh0dG93YXJkICAtOUUtMzk4ICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+IC04RS0zOTggICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzc1IG5leHR0b3dhcmQgIC05LjlFLTM5NyAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTkuOEUtMzk3ICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzNzYgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTlFLTM4NyAgICAgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OEUtMzg3ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM3NyBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OUUtMzg0ICAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk4RS0zODQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzc4IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk4RS0zODQgICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTdFLTM4NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzNzkgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTdFLTM4NCAgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5NkUtMzg0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM4MCBuZXh0dG93YXJkICAtMEUtMzk4ICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxRS0zOTggICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0MzgxIG5leHR0b3dhcmQgIC0xRS0zOTggICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTBFLTM5OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZG5leHR0MzgyIG5leHR0b3dhcmQgIC0yRS0zOTggICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTFFLTM5OCAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZGRuZXh0dDM4MyBuZXh0dG93YXJkICAgMEUtMzk4ICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxRS0zOTggICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzg0IG5leHR0b3dhcmQgICAxRS0zOTggICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDJFLTM5OCAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzODUgbmV4dHRvd2FyZCAgIDJFLTM5OCAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgM0UtMzk4ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM4NiBuZXh0dG93YXJkICAgMTBFLTM5OCAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxLjFFLTM5NyAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Mzg3IG5leHR0b3dhcmQgICAxMDBFLTM5OCAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDEuMDFFLTM5NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQzODggbmV4dHRvd2FyZCAgIDEwMDAwMEUtMzk4ICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMS4wMDAwMUUtMzkzICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDM4OSBuZXh0dG93YXJkICAgMS4wMDAwMDAwMDAwMEUtMzgzICAgICAgSW5maW5pdHkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMUUtMzgzCitkZG5leHR0MzkwIG5leHR0b3dhcmQgICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICBJbmZpbml0eSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dHQzOTEgbmV4dHRvd2FyZCAgIDFFLTM4MyAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDFFLTM4MworZGRuZXh0dDM5MiBuZXh0dG93YXJkICAgOS45OTk5OTk5OTk5OTk5OTdFKzM4NCAgSW5maW5pdHkgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OEUrMzg0CitkZG5leHR0MzkzIG5leHR0b3dhcmQgICA5Ljk5OTk5OTk5OTk5OTk5OEUrMzg0ICBJbmZpbml0eSAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQzOTQgbmV4dHRvd2FyZCAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIEluZmluaXR5ICAtPiAgSW5maW5pdHkgICAgICAgICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0tLS0tLSBsaHM+cmhzCitkZG5leHR0NDAxIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5NSAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk0CitkZG5leHR0NDAyIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5NiAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk1CitkZG5leHR0NDAzIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5NyAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk2CitkZG5leHR0NDA0IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OCAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk3CitkZG5leHR0NDA1IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OSAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHR0NDA2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwICAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0NDA3IG5leHR0b3dhcmQgIDEuMCAgICAgICAgICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQ0MDggbmV4dHRvd2FyZCAgMSAgICAgICAgICAgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OQorZGRuZXh0dDQwOSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwCitkZG5leHR0NDEwIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAyICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQ0MTEgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDMgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMgorZGRuZXh0dDQxMiBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwNCAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAzCitkZG5leHR0NDEzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDA1ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDQKK2RkbmV4dHQ0MTQgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDYgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwNQorZGRuZXh0dDQxNSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwNyAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDA2CitkZG5leHR0NDE2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDA4ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDcKK2RkbmV4dHQ0MTcgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDkgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwOAorZGRuZXh0dDQxOCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAxMCAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDA5CitkZG5leHR0NDE5IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDExICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMTAKK2RkbmV4dHQ0MjAgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMTIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAxMQorCitkZG5leHR0NDIxIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5NSAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk2CitkZG5leHR0NDIyIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5NiAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk3CitkZG5leHR0NDIzIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5NyAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk4CitkZG5leHR0NDI0IG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OCAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0NDI1IG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OSAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAKK2RkbmV4dHQ0MjYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDQyNyBuZXh0dG93YXJkIC0xLjAgICAgICAgICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDEKK2RkbmV4dHQ0MjggbmV4dHRvd2FyZCAtMSAgICAgICAgICAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0NDI5IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAxICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDIKK2RkbmV4dHQ0MzAgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDIgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMworZGRuZXh0dDQzMSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMyAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA0CitkZG5leHR0NDMyIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA0ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDUKK2RkbmV4dHQ0MzMgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDUgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwNgorZGRuZXh0dDQzNCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwNiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDA3CitkZG5leHR0NDM1IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDA3ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDgKK2RkbmV4dHQ0MzYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDggICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwOQorZGRuZXh0dDQzNyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwOSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDEwCitkZG5leHR0NDM4IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDEwICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMTEKK2RkbmV4dHQ0MzkgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMTEgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAxMgorCistLSBaZXJvcworZGRuZXh0dDUwMCBuZXh0dG93YXJkIC0wICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDUwMSBuZXh0dG93YXJkICAwICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDUwMiBuZXh0dG93YXJkICAwLjAwICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDUwMyBuZXh0dG93YXJkIC0wLjAwICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDUwNCBuZXh0dG93YXJkICAwRS0zMDAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDUwNSBuZXh0dG93YXJkICAwRSszMDAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDUwNiBuZXh0dG93YXJkICAwRSszMDAwMCAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDUwNyBuZXh0dG93YXJkIC0wRSszMDAwMCAgICAgLUluZmluaXR5IC0+IC0xRS0zOTggICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBzcGVjaWFscworZGRuZXh0dDU1MCBuZXh0dG93YXJkICAgSW5mICAgICAtSW5maW5pdHkgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ1NTEgbmV4dHRvd2FyZCAgLUluZiAgICAgLUluZmluaXR5IC0+IC1JbmZpbml0eQorZGRuZXh0dDU1MiBuZXh0dG93YXJkICAgTmFOICAgICAtSW5maW5pdHkgLT4gIE5hTgorZGRuZXh0dDU1MyBuZXh0dG93YXJkICBzTmFOICAgICAtSW5maW5pdHkgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0NTU0IG5leHR0b3dhcmQgICBOYU43NyAgIC1JbmZpbml0eSAtPiAgTmFONzcKK2RkbmV4dHQ1NTUgbmV4dHRvd2FyZCAgc05hTjg4ICAgLUluZmluaXR5IC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDU1NiBuZXh0dG93YXJkICAtTmFOICAgICAtSW5maW5pdHkgLT4gLU5hTgorZGRuZXh0dDU1NyBuZXh0dG93YXJkIC1zTmFOICAgICAtSW5maW5pdHkgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0NTU4IG5leHR0b3dhcmQgIC1OYU43NyAgIC1JbmZpbml0eSAtPiAtTmFONzcKK2RkbmV4dHQ1NTkgbmV4dHRvd2FyZCAtc05hTjg4ICAgLUluZmluaXR5IC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworZGRuZXh0dDY3MCBuZXh0dG93YXJkICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OEUrMzg0CitkZG5leHR0NjcxIG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk4RSszODQgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk3RSszODQKK2RkbmV4dHQ2NzIgbmV4dHRvd2FyZCAgMUUtMzgzICAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OTk5OUUtMzg0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NjczIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY3NCBuZXh0dG93YXJkICA5RS0zOTggICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiA4RS0zOTggICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2NzUgbmV4dHRvd2FyZCAgOS45RS0zOTcgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gOS44RS0zOTcgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njc2IG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTlFLTM4NyAgICAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OThFLTM4NyAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY3NyBuZXh0dG93YXJkICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk4RS0zODQgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2NzggbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OEUtMzg0ICAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OTk5N0UtMzg0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njc5IG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTdFLTM4NCAgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTZFLTM4NCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY4MCBuZXh0dG93YXJkICAwRS0zOTggICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMUUtMzk4ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2ODEgbmV4dHRvd2FyZCAgMUUtMzk4ICAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gMEUtMzk4ICAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RkbmV4dHQ2ODIgbmV4dHRvd2FyZCAgMkUtMzk4ICAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gMUUtMzk4ICAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCisKK2RkbmV4dHQ2ODMgbmV4dHRvd2FyZCAgLTBFLTM5OCAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTFFLTM5OCAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njg0IG5leHR0b3dhcmQgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IC0yRS0zOTggICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY4NSBuZXh0dG93YXJkICAtMkUtMzk4ICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtM0UtMzk4ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2ODYgbmV4dHRvd2FyZCAgLTEwRS0zOTggICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTEuMUUtMzk3ICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0Njg3IG5leHR0b3dhcmQgIC0xMDBFLTM5OCAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IC0xLjAxRS0zOTYgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZGRuZXh0dDY4OCBuZXh0dG93YXJkICAtMTAwMDAwRS0zOTggICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMS4wMDAwMUUtMzkzICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKK2RkbmV4dHQ2ODkgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDAwMDBFLTM4MyAgICAgIC1JbmZpbml0eSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dHQ2OTAgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC1JbmZpbml0eSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dHQ2OTEgbmV4dHRvd2FyZCAgLTFFLTM4MyAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxRS0zODMKK2RkbmV4dHQ2OTIgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk4RSszODQgIC1JbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ2OTMgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC1JbmZpbml0eSAgLT4gLUluZmluaXR5ICAgICAgICAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tLS0tLS0gU3BlY2lhbHMKK2RkbmV4dHQ3ODAgbmV4dHRvd2FyZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkZG5leHR0NzgxIG5leHR0b3dhcmQgLUluZiAgLTEwMDAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0NzgyIG5leHR0b3dhcmQgLUluZiAgLTEgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0NzgzIG5leHR0b3dhcmQgLUluZiAgLTAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0Nzg0IG5leHR0b3dhcmQgLUluZiAgIDAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0Nzg1IG5leHR0b3dhcmQgLUluZiAgIDEgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0Nzg2IG5leHR0b3dhcmQgLUluZiAgIDEwMDAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZG5leHR0Nzg3IG5leHR0b3dhcmQgLTEwMDAgLUluZiAgIC0+IC0xMDAwLjAwMDAwMDAwMDAwMQorZGRuZXh0dDc4OCBuZXh0dG93YXJkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RkbmV4dHQ3ODkgbmV4dHRvd2FyZCAtMSAgICAtSW5mICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAxCitkZG5leHR0NzkwIG5leHR0b3dhcmQgLTAgICAgLUluZiAgIC0+IC0xRS0zOTggICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NzkxIG5leHR0b3dhcmQgIDAgICAgLUluZiAgIC0+IC0xRS0zOTggICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0NzkyIG5leHR0b3dhcmQgIDEgICAgLUluZiAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTkKK2RkbmV4dHQ3OTMgbmV4dHRvd2FyZCAgMTAwMCAtSW5mICAgLT4gIDk5OS45OTk5OTk5OTk5OTk5CitkZG5leHR0Nzk0IG5leHR0b3dhcmQgIEluZiAgLUluZiAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CisKK2RkbmV4dHQ4MDAgbmV4dHRvd2FyZCAgSW5mICAtSW5mICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ4MDEgbmV4dHRvd2FyZCAgSW5mICAtMTAwMCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ4MDIgbmV4dHRvd2FyZCAgSW5mICAtMSAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ4MDMgbmV4dHRvd2FyZCAgSW5mICAtMCAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ4MDQgbmV4dHRvd2FyZCAgSW5mICAgMCAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ4MDUgbmV4dHRvd2FyZCAgSW5mICAgMSAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ4MDYgbmV4dHRvd2FyZCAgSW5mICAgMTAwMCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2RkbmV4dHQ4MDcgbmV4dHRvd2FyZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkZG5leHR0ODA4IG5leHR0b3dhcmQgLTEwMDAgIEluZiAgIC0+IC05OTkuOTk5OTk5OTk5OTk5OQorZGRuZXh0dDgwOSBuZXh0dG93YXJkIC1JbmYgICBJbmYgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRuZXh0dDgxMCBuZXh0dG93YXJkIC0xICAgICBJbmYgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5CitkZG5leHR0ODExIG5leHR0b3dhcmQgLTAgICAgIEluZiAgIC0+ICAxRS0zOTggICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0ODEyIG5leHR0b3dhcmQgIDAgICAgIEluZiAgIC0+ICAxRS0zOTggICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkZG5leHR0ODEzIG5leHR0b3dhcmQgIDEgICAgIEluZiAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMQorZGRuZXh0dDgxNCBuZXh0dG93YXJkICAxMDAwICBJbmYgICAtPiAgMTAwMC4wMDAwMDAwMDAwMDEKK2RkbmV4dHQ4MTUgbmV4dHRvd2FyZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RkbmV4dHQ4MjEgbmV4dHRvd2FyZCAgTmFOIC1JbmYgICAgLT4gIE5hTgorZGRuZXh0dDgyMiBuZXh0dG93YXJkICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZG5leHR0ODIzIG5leHR0b3dhcmQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RkbmV4dHQ4MjQgbmV4dHRvd2FyZCAgTmFOIC0wICAgICAgLT4gIE5hTgorZGRuZXh0dDgyNSBuZXh0dG93YXJkICBOYU4gIDAgICAgICAtPiAgTmFOCitkZG5leHR0ODI2IG5leHR0b3dhcmQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RkbmV4dHQ4MjcgbmV4dHRvd2FyZCAgTmFOICAxMDAwICAgLT4gIE5hTgorZGRuZXh0dDgyOCBuZXh0dG93YXJkICBOYU4gIEluZiAgICAtPiAgTmFOCitkZG5leHR0ODI5IG5leHR0b3dhcmQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RkbmV4dHQ4MzAgbmV4dHRvd2FyZCAtSW5mICBOYU4gICAgLT4gIE5hTgorZGRuZXh0dDgzMSBuZXh0dG93YXJkIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZG5leHR0ODMyIG5leHR0b3dhcmQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RkbmV4dHQ4MzMgbmV4dHRvd2FyZCAtMCAgICBOYU4gICAgLT4gIE5hTgorZGRuZXh0dDgzNCBuZXh0dG93YXJkICAwICAgIE5hTiAgICAtPiAgTmFOCitkZG5leHR0ODM1IG5leHR0b3dhcmQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RkbmV4dHQ4MzYgbmV4dHRvd2FyZCAgMTAwMCBOYU4gICAgLT4gIE5hTgorZGRuZXh0dDgzNyBuZXh0dG93YXJkICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RkbmV4dHQ4NDEgbmV4dHRvd2FyZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDIgbmV4dHRvd2FyZCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDMgbmV4dHRvd2FyZCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDQgbmV4dHRvd2FyZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDUgbmV4dHRvd2FyZCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDYgbmV4dHRvd2FyZCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDcgbmV4dHRvd2FyZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDggbmV4dHRvd2FyZCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NDkgbmV4dHRvd2FyZCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTAgbmV4dHRvd2FyZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTEgbmV4dHRvd2FyZCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTIgbmV4dHRvd2FyZCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTMgbmV4dHRvd2FyZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTQgbmV4dHRvd2FyZCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTUgbmV4dHRvd2FyZCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTYgbmV4dHRvd2FyZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTcgbmV4dHRvd2FyZCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTggbmV4dHRvd2FyZCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NTkgbmV4dHRvd2FyZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRuZXh0dDg2MSBuZXh0dG93YXJkICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorZGRuZXh0dDg2MiBuZXh0dG93YXJkICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZGRuZXh0dDg2MyBuZXh0dG93YXJkICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZGRuZXh0dDg2NCBuZXh0dG93YXJkICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorZGRuZXh0dDg2NSBuZXh0dG93YXJkICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZGRuZXh0dDg2NiBuZXh0dG93YXJkIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZGRuZXh0dDg2NyBuZXh0dG93YXJkIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorZGRuZXh0dDg2OCBuZXh0dG93YXJkICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZGRuZXh0dDg2OSBuZXh0dG93YXJkICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2RkbmV4dHQ4NzEgbmV4dHRvd2FyZCAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg3MiBuZXh0dG93YXJkICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODczIG5leHR0b3dhcmQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NzQgbmV4dHRvd2FyZCAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg3NSBuZXh0dG93YXJkICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODc2IG5leHR0b3dhcmQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4NzcgbmV4dHRvd2FyZCAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg3OCBuZXh0dG93YXJkIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODc5IG5leHR0b3dhcmQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2RkbmV4dHQ4ODAgbmV4dHRvd2FyZCAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDg4MSBuZXh0dG93YXJkICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODgyIG5leHR0b3dhcmQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZGRuZXh0dDg4MyBuZXh0dG93YXJkIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitkZG5leHR0ODg0IG5leHR0b3dhcmQgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZGRuZXh0dDg4NSBuZXh0dG93YXJkICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK2RkbmV4dHQ5MDAgbmV4dHRvd2FyZCAxICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRuZXh0dDkwMSBuZXh0dG93YXJkICMgIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRPci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZE9yLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhNzAyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRPci5kZWNUZXN0CkBAIC0wLDAgKzEsMjkyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkT3IuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBPUiBmb3IgZGVjRG91YmxlcyAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpCitkZG9yMDAxIG9yICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCitkZG9yMDAyIG9yICAgICAgICAgICAgIDAgICAgMSAtPiAgICAxCitkZG9yMDAzIG9yICAgICAgICAgICAgIDEgICAgMCAtPiAgICAxCitkZG9yMDA0IG9yICAgICAgICAgICAgIDEgICAgMSAtPiAgICAxCitkZG9yMDA1IG9yICAgICAgICAgIDExMDAgMTAxMCAtPiAxMTEwCistLSBhbmQgYXQgbXNkIGFuZCBtc2QtMQorZGRvcjAwNiBvciAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2Rkb3IwMDcgb3IgMDAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMAorZGRvcjAwOCBvciAxMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAwMDAwMDAwCitkZG9yMDA5IG9yIDEwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAKK2Rkb3IwMTAgb3IgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCitkZG9yMDExIG9yIDAwMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMDAwMDAwMDAKK2Rkb3IwMTIgb3IgMDEwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMAorZGRvcjAxMyBvciAwMTAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwCisKKy0tIFZhcmlvdXMgbGVuZ3RocworLS0gICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAxMjM0NTY3ODkwMTIzNDU2IDEyMzQ1Njc4OTAxMjM0NTYKK2Rkb3IwMjAgb3IgMTExMTExMTExMTExMTExMSAgICAgMTExMTExMTExMTExMTExMSAgLT4gIDExMTExMTExMTExMTExMTEKK2Rkb3IwMjEgb3IgIDExMTExMTExMTExMTExMSAgICAgIDExMTExMTExMTExMTExMSAgLT4gICAxMTExMTExMTExMTExMTEKK2Rkb3IwMjIgb3IgICAxMTExMTExMTExMTExMSAgICAgICAxMTExMTExMTExMTExMSAgLT4gICAgMTExMTExMTExMTExMTEKK2Rkb3IwMjMgb3IgICAgMTExMTExMTExMTExMSAgICAgICAgMTExMTExMTExMTExMSAgLT4gICAgIDExMTExMTExMTExMTEKK2Rkb3IwMjQgb3IgICAgIDExMTExMTExMTExMSAgICAgICAgIDExMTExMTExMTExMSAgLT4gICAgICAxMTExMTExMTExMTEKK2Rkb3IwMjUgb3IgICAgICAxMTExMTExMTExMSAgICAgICAgICAxMTExMTExMTExMSAgLT4gICAgICAgMTExMTExMTExMTEKK2Rkb3IwMjYgb3IgICAgICAgMTExMTExMTExMSAgICAgICAgICAgMTExMTExMTExMSAgLT4gICAgICAgIDExMTExMTExMTEKK2Rkb3IwMjcgb3IgICAgICAgIDExMTExMTExMSAgICAgICAgICAgIDExMTExMTExMSAgLT4gICAgICAgICAxMTExMTExMTEKK2Rkb3IwMjggb3IgICAgICAgICAxMTExMTExMSAgICAgICAgICAgICAxMTExMTExMSAgLT4gICAgICAgICAgMTExMTExMTEKK2Rkb3IwMjkgb3IgICAgICAgICAgMTExMTExMSAgICAgICAgICAgICAgMTExMTExMSAgLT4gICAgICAgICAgIDExMTExMTEKK2Rkb3IwMzAgb3IgICAgICAgICAgIDExMTExMSAgICAgICAgICAgICAgIDExMTExMSAgLT4gICAgICAgICAgICAxMTExMTEKK2Rkb3IwMzEgb3IgICAgICAgICAgICAxMTExMSAgICAgICAgICAgICAgICAxMTExMSAgLT4gICAgICAgICAgICAgMTExMTEKK2Rkb3IwMzIgb3IgICAgICAgICAgICAgMTExMSAgICAgICAgICAgICAgICAgMTExMSAgLT4gICAgICAgICAgICAgIDExMTEKK2Rkb3IwMzMgb3IgICAgICAgICAgICAgIDExMSAgICAgICAgICAgICAgICAgIDExMSAgLT4gICAgICAgICAgICAgICAxMTEKK2Rkb3IwMzQgb3IgICAgICAgICAgICAgICAxMSAgICAgICAgICAgICAgICAgICAxMSAgLT4gICAgICAgICAgICAgICAgMTEKK2Rkb3IwMzUgb3IgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAgMSAgLT4gICAgICAgICAgICAgICAgIDEKK2Rkb3IwMzYgb3IgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgMCAgLT4gICAgICAgICAgICAgICAgIDAKKworZGRvcjA0MiBvciAgMTExMTExMTEwMDAwMDAwICAgICAxMTExMTExMTEwMDAwMDAwICAtPiAgMTExMTExMTExMDAwMDAwMAorZGRvcjA0MyBvciAgIDExMTExMTEwMDAwMDAwICAgICAxMDAwMDAwMTAwMDAwMDAwICAtPiAgMTAxMTExMTExMDAwMDAwMAorZGRvcjA0NCBvciAgICAxMTExMTEwMDAwMDAwICAgICAxMDAwMDAxMDAwMDAwMDAwICAtPiAgMTAwMTExMTExMDAwMDAwMAorZGRvcjA0NSBvciAgICAgMTExMTEwMDAwMDAwICAgICAxMDAwMDEwMDAwMDAwMDAwICAtPiAgMTAwMDExMTExMDAwMDAwMAorZGRvcjA0NiBvciAgICAgIDExMTEwMDAwMDAwICAgICAxMDAwMTAwMDAwMDAwMDAwICAtPiAgMTAwMDExMTExMDAwMDAwMAorZGRvcjA0NyBvciAgICAgICAxMTEwMDAwMDAwICAgICAxMDAxMDAwMDAwMDAwMDAwICAtPiAgMTAwMTAwMTExMDAwMDAwMAorZGRvcjA0OCBvciAgICAgICAgMTEwMDAwMDAwICAgICAxMDEwMDAwMDAwMDAwMDAwICAtPiAgMTAxMDAwMDExMDAwMDAwMAorZGRvcjA0OSBvciAgICAgICAgIDEwMDAwMDAwICAgICAxMTAwMDAwMDAwMDAwMDAwICAtPiAgMTEwMDAwMDAxMDAwMDAwMAorCitkZG9yMDkwIG9yIDAxMTExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitkZG9yMDkxIG9yIDEwMTExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitkZG9yMDkyIG9yIDExMDExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitkZG9yMDkzIG9yIDExMTAxMTExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitkZG9yMDk0IG9yIDExMTEwMTExMSAgMTExMTAxMTExICAtPiAgMTExMTAxMTExCitkZG9yMDk1IG9yIDExMTExMDExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitkZG9yMDk2IG9yIDExMTExMTAxMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitkZG9yMDk3IG9yIDExMTExMTEwMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitkZG9yMDk4IG9yIDExMTExMTExMCAgMTExMTAxMTExICAtPiAgMTExMTExMTExCisKK2Rkb3IxMDAgb3IgMTExMTAxMTExICAwMTExMTExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IxMDEgb3IgMTExMTAxMTExICAxMDExMTExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IxMDIgb3IgMTExMTAxMTExICAxMTAxMTExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IxMDMgb3IgMTExMTAxMTExICAxMTEwMTExMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IxMDQgb3IgMTExMTAxMTExICAxMTExMDExMTEgIC0+ICAxMTExMDExMTEKK2Rkb3IxMDUgb3IgMTExMTAxMTExICAxMTExMTAxMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IxMDYgb3IgMTExMTAxMTExICAxMTExMTEwMTEgIC0+ICAxMTExMTExMTEKK2Rkb3IxMDcgb3IgMTExMTAxMTExICAxMTExMTExMDEgIC0+ICAxMTExMTExMTEKK2Rkb3IxMDggb3IgMTExMTAxMTExICAxMTExMTExMTAgIC0+ICAxMTExMTExMTEKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitkZG9yMjIwIG9yIDExMTExMTExMiAgMTExMTExMTExICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjIxIG9yIDMzMzMzMzMzMyAgMzMzMzMzMzMzICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjIyIG9yIDU1NTU1NTU1NSAgNTU1NTU1NTU1ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjIzIG9yIDc3Nzc3Nzc3NyAgNzc3Nzc3Nzc3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjI0IG9yIDk5OTk5OTk5OSAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjI1IG9yIDIyMjIyMjIyMiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjI2IG9yIDQ0NDQ0NDQ0NCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjI3IG9yIDY2NjY2NjY2NiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjI4IG9yIDg4ODg4ODg4OCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjI5IG9yIDk5OTk5OTk5OSAgMjIyMjIyMjIyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjMwIG9yIDk5OTk5OTk5OSAgNDQ0NDQ0NDQ0ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjMxIG9yIDk5OTk5OTk5OSAgNjY2NjY2NjY2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjMyIG9yIDk5OTk5OTk5OSAgODg4ODg4ODg4ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCitkZG9yMjQwIG9yICA1Njc0Njg2ODkgLTkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjQxIG9yICA1NjczNjc2ODkgIDkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjQyIG9yIC02MzE5MTc3NzIgLTcwNjAxNDYzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjQzIG9yIC03NTYyNTMyNTcgIDEzODU3OTIzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjQ0IG9yICA4MzU1OTAxNDkgIDU2NzQzNTQwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAorZGRvcjI1MCBvciAgMjAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNTEgb3IgIDcwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjUyIG9yICA4MDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI1MyBvciAgOTAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNTQgb3IgIDIwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjU1IG9yICA3MDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI1NiBvciAgODAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNTcgb3IgIDkwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjU4IG9yICAxMDAwMDAwMDAwMDAwMDAwIDIwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI1OSBvciAgMTAwMDAwMDAwMDAwMDAwMCA3MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNjAgb3IgIDEwMDAwMDAwMDAwMDAwMDAgODAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjYxIG9yICAxMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI2MiBvciAgMDAwMDAwMDAwMDAwMDAwMCAyMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNjMgb3IgIDAwMDAwMDAwMDAwMDAwMDAgNzAwMDAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjY0IG9yICAwMDAwMDAwMDAwMDAwMDAwIDgwMDAwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI2NSBvciAgMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNELTEKK2Rkb3IyNzAgb3IgIDAyMDAwMDEwMDAwMDAwMDAgMTAwMDEwMDAwMDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjcxIG9yICAwNzAwMDAwMTAwMDAwMDAwIDEwMDAwMTAwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI3MiBvciAgMDgwMDAwMDAxMDAwMDAwMCAxMDAwMDAxMDAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNzMgb3IgIDA5MDAwMDAwMDEwMDAwMDAgMTAwMDAwMDEwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjc0IG9yICAxMDAwMDAwMDAwMTAwMDAwIDAyMDAwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI3NSBvciAgMTAwMDAwMDAwMDAxMDAwMCAwNzAwMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyNzYgb3IgIDEwMDAwMDAwMDAwMDEwMDAgMDgwMDAwMDAxMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjc3IG9yICAxMDAwMDAwMDAwMDAwMTAwIDA5MDAwMDAwMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK2Rkb3IyODAgb3IgIDAwMTAwMDAwMDAwMDAwMDIgMTAwMDAwMDEwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjgxIG9yICAwMDAxMDAwMDAwMDAwMDA3IDEwMDAwMDEwMDAwMDAwMTEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI4MiBvciAgMDAwMDEwMDAwMDAwMDAwOCAxMDAwMDEwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyODMgb3IgIDAwMDAwMTAwMDAwMDAwMDkgMTAwMDEwMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjg0IG9yICAxMDAwMDAxMDAwMDAwMDAwIDAwMDEwMDAwMDAwMDAwMDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI4NSBvciAgMTAwMDAwMDEwMDAwMDAwMCAwMDEwMDAwMDAwMDAwMDA3IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyODYgb3IgIDEwMDAwMDAwMTAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwOCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjg3IG9yICAxMDAwMDAwMDAxMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNaWRkaWUKK2Rkb3IyODggb3IgIDAwMTAwMDAwMjAwMDAwMDAgMTAwMDAwMTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjg5IG9yICAwMDAxMDAwMDcwMDAwMDAxIDEwMDAwMDAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI5MCBvciAgMDAwMDEwMDA4MDAwMDAxMCAxMDAwMDAwMDEwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyOTEgb3IgIDAwMDAwMTAwOTAwMDAxMDAgMTAwMDAwMDAwMTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjkyIG9yICAxMDAwMDAxMDAwMDAxMDAwIDAwMDAwMDAwMjAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI5MyBvciAgMTAwMDAwMDEwMDAxMDAwMCAwMDAwMDAwMDcwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyOTQgb3IgIDEwMDAwMDAwMTAxMDAwMDAgMDAwMDAwMDA4MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjk1IG9yICAxMDAwMDAwMDAxMDAwMDAwIDAwMDAwMDAwOTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc2lnbnMKK2Rkb3IyOTYgb3IgLTEwMDAwMDAwMDEwMDAwMDAgLTAwMDAwMTAwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjI5NyBvciAtMTAwMDAwMDAwMTAwMDAwMCAgMDAwMDAwMDAxMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMjk4IG9yICAxMDAwMDAwMDAxMDAwMDAwIC0wMDAwMDAxMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IyOTkgb3IgIDEwMDAwMDAwMDEwMDAwMDAgIDAwMDAwMDAwMTEwMDAxMDAgLT4gIDEwMDAwMDAwMTEwMDAxMDAKKworLS0gTm1heCwgTm1pbiwgTnRpbnktbGlrZQorZGRvcjMzMSBvciAgMiAgIDkuOTk5OTk5OTlFKzE5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzMyIG9yICAzICAgMUUtMTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzMzMgb3IgIDQgICAxLjAwMDAwMDAwRS0xOTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjMzNCBvciAgNSAgIDFFLTEwMCAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzM1IG9yICA2ICAgLTFFLTEwMCAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzMzYgb3IgIDcgICAtMS4wMDAwMDAwMEUtMTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjMzNyBvciAgOCAgIC0xRS0xOTkgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzM4IG9yICA5ICAgLTkuOTk5OTk5OTlFKzE5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNDEgb3IgIDkuOTk5OTk5OTlFKzI5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM0MiBvciAgMUUtMjk5ICAgICAgICAgICAgICAgMDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzQzIG9yICAxLjAwMDAwMDAwRS0yOTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNDQgb3IgIDFFLTEwMCAgICAgICAgICAgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM0NSBvciAgLTFFLTEwMCAgICAgICAgICAgICAtMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzQ2IG9yICAtMS4wMDAwMDAwMEUtMjk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNDcgb3IgIC0xRS0yOTkgICAgICAgICAgICAgIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM0OCBvciAgLTkuOTk5OTk5OTlFKzI5OSAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEEgZmV3IG90aGVyIG5vbi1pbnRlZ2VycworZGRvcjM2MSBvciAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzYyIG9yICAxRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNjMgb3IgIDAuMCAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM2NCBvciAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzY1IG9yICA5LjkgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNjYgb3IgIDlFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM3MSBvciAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzcyIG9yICAwIDFFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNzMgb3IgIDAgMC4wICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjM3NCBvciAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yMzc1IG9yICAwIDkuOSAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3IzNzYgb3IgIDAgOUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBbGwgU3BlY2lhbHMgYXJlIGluIGVycm9yCitkZG9yNzgwIG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3ODEgb3IgLUluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc4MiBvciAtSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzgzIG9yIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3ODQgb3IgLUluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc4NSBvciAtSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzg2IG9yIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3ODcgb3IgLTEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc4OCBvciAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzg5IG9yIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3OTAgb3IgLTAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc5MSBvciAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yNzkyIG9yICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I3OTMgb3IgIDEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjc5NCBvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkb3I4MDAgb3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgwMSBvciAgSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODAyIG9yICBJbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MDMgb3IgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgwNCBvciAgSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODA1IG9yICBJbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MDYgb3IgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgwNyBvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODA4IG9yIC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MDkgb3IgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgxMCBvciAtMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODExIG9yIC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MTIgb3IgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgxMyBvciAgMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODE0IG9yICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MTUgb3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZG9yODIxIG9yICBOYU4gLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MjIgb3IgIE5hTiAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgyMyBvciAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODI0IG9yICBOYU4gLTAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MjUgb3IgIE5hTiAgMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgyNiBvciAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODI3IG9yICBOYU4gIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4Mjggb3IgIE5hTiAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgyOSBvciAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODMwIG9yIC1JbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MzEgb3IgLTEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgzMiBvciAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODMzIG9yIC0wICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4MzQgb3IgIDAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjgzNSBvciAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODM2IG9yICAxMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4Mzcgb3IgIEluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZG9yODQxIG9yICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg0MiBvciAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NDMgb3IgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODQ0IG9yICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg0NSBvciAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NDYgb3IgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODQ3IG9yICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg0OCBvciAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NDkgb3IgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODUwIG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg1MSBvciAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NTIgb3IgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODUzIG9yIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg1NCBvciAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NTUgb3IgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODU2IG9yICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg1NyBvciAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NTggb3IgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODU5IG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZG9yODYxIG9yICBOYU4xICAgLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NjIgb3IgK05hTjIgICAtMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg2MyBvciAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODY0IG9yICBOYU40ICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NjUgb3IgIE5hTjUgICArTmFONiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg2NiBvciAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODY3IG9yIC0xMDAwICAgIE5hTjggICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4Njggb3IgIDEwMDAgICAgTmFOOSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg2OSBvciAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODcxIG9yICBzTmFOMTEgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NzIgb3IgIHNOYU4xMiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg3MyBvciAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODc0IG9yICBzTmFOMTQgICBOYU4xNyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4NzUgb3IgIHNOYU4xNSAgc05hTjE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg3NiBvciAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODc3IG9yIC1JbmYgICAgK3NOYU4yMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4Nzggb3IgLTEwMDAgICAgc05hTjIxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg3OSBvciAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODgwIG9yICBJbmYgICAgIHNOYU4yMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4ODEgb3IgK05hTjI1ICArc05hTjI0IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg4MiBvciAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZG9yODgzIG9yIC1zTmFOMjcgIHNOYU4yOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkb3I4ODQgb3IgIDEwMDAgICAgLU5hTjMwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRvcjg4NSBvciAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUGx1cy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFBsdXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2FhMDhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFBsdXMuZGVjVGVzdApAQCAtMCwwICsxLDg4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkUGx1cy5kZWNUZXN0IC0tIGRlY0RvdWJsZSAwK3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNEb3VibGVzLgorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZGRwbHMwMDEgcGx1cyAgICAgICArNy41MCAgLT4gNy41MAorCistLSBJbmZpbml0aWVzCitkZHBsczAxMSBwbHVzICBJbmZpbml0eSAgICAtPiBJbmZpbml0eQorZGRwbHMwMTIgcGx1cyAgLUluZmluaXR5ICAgLT4gLUluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorZGRwbHMwMjEgcGx1cyAgICAgICAgIE5hTiAgLT4gTmFOCitkZHBsczAyMiBwbHVzICAgICAgICAtTmFOICAtPiAtTmFOCitkZHBsczAyMyBwbHVzICAgICAgICBzTmFOICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHBsczAyNCBwbHVzICAgICAgIC1zTmFOICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RkcGxzMDMxIHBsdXMgICAgICAgTmFOMTMgIC0+IE5hTjEzCitkZHBsczAzMiBwbHVzICAgICAgLU5hTjEzICAtPiAtTmFOMTMKK2RkcGxzMDMzIHBsdXMgICAgICBzTmFOMTMgIC0+IE5hTjEzICAgSW52YWxpZF9vcGVyYXRpb24KK2RkcGxzMDM0IHBsdXMgICAgIC1zTmFOMTMgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RkcGxzMDM1IHBsdXMgICAgICAgTmFONzAgIC0+IE5hTjcwCitkZHBsczAzNiBwbHVzICAgICAgLU5hTjcwICAtPiAtTmFONzAKK2RkcGxzMDM3IHBsdXMgICAgICBzTmFOMTAxIC0+IE5hTjEwMSAgSW52YWxpZF9vcGVyYXRpb24KK2RkcGxzMDM4IHBsdXMgICAgIC1zTmFOMTAxIC0+IC1OYU4xMDEgSW52YWxpZF9vcGVyYXRpb24KKworLS0gZmluaXRlcworZGRwbHMxMDEgcGx1cyAgICAgICAgICA3ICAgLT4gNworZGRwbHMxMDIgcGx1cyAgICAgICAgIC03ICAgLT4gLTcKK2RkcGxzMTAzIHBsdXMgICAgICAgICA3NSAgIC0+IDc1CitkZHBsczEwNCBwbHVzICAgICAgICAtNzUgICAtPiAtNzUKK2RkcGxzMTA1IHBsdXMgICAgICAgNy41MCAgIC0+IDcuNTAKK2RkcGxzMTA2IHBsdXMgICAgICAtNy41MCAgIC0+IC03LjUwCitkZHBsczEwNyBwbHVzICAgICAgIDcuNTAwICAtPiA3LjUwMAorZGRwbHMxMDggcGx1cyAgICAgIC03LjUwMCAgLT4gLTcuNTAwCisKKy0tIHplcm9zCitkZHBsczExMSBwbHVzICAgICAgICAgIDAgICAtPiAwCitkZHBsczExMiBwbHVzICAgICAgICAgLTAgICAtPiAwCitkZHBsczExMyBwbHVzICAgICAgIDBFKzQgICAtPiAwRSs0CitkZHBsczExNCBwbHVzICAgICAgLTBFKzQgICAtPiAwRSs0CitkZHBsczExNSBwbHVzICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RkcGxzMTE2IHBsdXMgICAgLTAuMDAwMCAgIC0+IDAuMDAwMAorZGRwbHMxMTcgcGx1cyAgICAgIDBFLTE0MSAgLT4gMEUtMTQxCitkZHBsczExOCBwbHVzICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RkcGxzMTIxIHBsdXMgIDI2ODI2ODI2ODI2ODI2ODIgICAgICAgICAtPiAyNjgyNjgyNjgyNjgyNjgyCitkZHBsczEyMiBwbHVzICAtMjY4MjY4MjY4MjY4MjY4MiAgICAgICAgLT4gLTI2ODI2ODI2ODI2ODI2ODIKK2RkcGxzMTIzIHBsdXMgIDEzNDEzNDEzNDEzNDEzNDEgICAgICAgICAtPiAxMzQxMzQxMzQxMzQxMzQxCitkZHBsczEyNCBwbHVzICAtMTM0MTM0MTM0MTM0MTM0MSAgICAgICAgLT4gLTEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RkcGxzMTMxIHBsdXMgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZHBsczEzMiBwbHVzICAxRS0zODMgICAgICAgICAgICAgICAgICAgLT4gMUUtMzgzCitkZHBsczEzMyBwbHVzICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRwbHMxMzQgcGx1cyAgMUUtMzk4ICAgICAgICAgICAgICAgICAgIC0+IDFFLTM5OCBTdWJub3JtYWwKKworZGRwbHMxMzUgcGx1cyAgLTFFLTM5OCAgICAgICAgICAgICAgICAgIC0+IC0xRS0zOTggU3Vibm9ybWFsCitkZHBsczEzNiBwbHVzICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2RkcGxzMTM3IHBsdXMgIC0xRS0zODMgICAgICAgICAgICAgICAgICAtPiAtMUUtMzgzCitkZHBsczEzOCBwbHVzICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRRdWFudGl6ZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFF1YW50aXplLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxOWM5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRRdWFudGl6ZS5kZWNUZXN0CkBAIC0wLDAgKzEsODMzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkUXVhbnRpemUuZGVjVGVzdCAtLSBkZWNEb3VibGUgcXVhbnRpemUgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gTW9zdCBvZiB0aGUgdGVzdHMgaGVyZSBhc3N1bWUgYSAicmVndWxhciBwYXR0ZXJuIiwgd2hlcmUgdGhlCistLSBzaWduIGFuZCBjb2VmZmljaWVudCBhcmUgKzEuCistLSAyMDA0LjAzLjE1IFVuZGVyZmxvdyBmb3IgcXVhbnRpemUgaXMgc3VwcHJlc3NlZAorLS0gMjAwNS4wNi4wOCBNb3JlIGV4dGVuc2l2ZSB0ZXN0cyBmb3IgJ2RvZXMgbm90IGZpdCcKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkZHF1YTAwMSBxdWFudGl6ZSAwICAgICAgIDFlMCAgIC0+IDAKK2RkcXVhMDAyIHF1YW50aXplIDEgICAgICAgMWUwICAgLT4gMQorZGRxdWEwMDMgcXVhbnRpemUgMC4xICAgIDFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMDUgcXVhbnRpemUgMC4xICAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMDYgcXVhbnRpemUgMC4xICAgICAxZTAgICAtPiAwIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMDcgcXVhbnRpemUgMC4xICAgIDFlLTEgICAtPiAwLjEKK2RkcXVhMDA4IHF1YW50aXplIDAuMSAgICAxZS0yICAgLT4gMC4xMAorZGRxdWEwMDkgcXVhbnRpemUgMC4xICAgIDFlLTMgICAtPiAwLjEwMAorZGRxdWEwMTAgcXVhbnRpemUgMC45ICAgIDFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMTEgcXVhbnRpemUgMC45ICAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMTIgcXVhbnRpemUgMC45ICAgIDFlKzAgICAtPiAxIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMTMgcXVhbnRpemUgMC45ICAgIDFlLTEgICAtPiAwLjkKK2RkcXVhMDE0IHF1YW50aXplIDAuOSAgICAxZS0yICAgLT4gMC45MAorZGRxdWEwMTUgcXVhbnRpemUgMC45ICAgIDFlLTMgICAtPiAwLjkwMAorLS0gbmVnYXRpdmVzCitkZHF1YTAyMSBxdWFudGl6ZSAtMCAgICAgIDFlMCAgIC0+IC0wCitkZHF1YTAyMiBxdWFudGl6ZSAtMSAgICAgIDFlMCAgIC0+IC0xCitkZHF1YTAyMyBxdWFudGl6ZSAtMC4xICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMjUgcXVhbnRpemUgLTAuMSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDI2IHF1YW50aXplIC0wLjEgICAgMWUwICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAyNyBxdWFudGl6ZSAtMC4xICAgMWUtMSAgIC0+IC0wLjEKK2RkcXVhMDI4IHF1YW50aXplIC0wLjEgICAxZS0yICAgLT4gLTAuMTAKK2RkcXVhMDI5IHF1YW50aXplIC0wLjEgICAxZS0zICAgLT4gLTAuMTAwCitkZHF1YTAzMCBxdWFudGl6ZSAtMC45ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMzEgcXVhbnRpemUgLTAuOSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDMyIHF1YW50aXplIC0wLjkgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAzMyBxdWFudGl6ZSAtMC45ICAgMWUtMSAgIC0+IC0wLjkKK2RkcXVhMDM0IHF1YW50aXplIC0wLjkgICAxZS0yICAgLT4gLTAuOTAKK2RkcXVhMDM1IHF1YW50aXplIC0wLjkgICAxZS0zICAgLT4gLTAuOTAwCitkZHF1YTAzNiBxdWFudGl6ZSAtMC41ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwMzcgcXVhbnRpemUgLTAuNSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDM4IHF1YW50aXplIC0wLjUgICAxZSswICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTAzOSBxdWFudGl6ZSAtMC41ICAgMWUtMSAgIC0+IC0wLjUKK2RkcXVhMDQwIHF1YW50aXplIC0wLjUgICAxZS0yICAgLT4gLTAuNTAKK2RkcXVhMDQxIHF1YW50aXplIC0wLjUgICAxZS0zICAgLT4gLTAuNTAwCitkZHF1YTA0MiBxdWFudGl6ZSAtMC45ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEwNDMgcXVhbnRpemUgLTAuOSAgIDFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDQ0IHF1YW50aXplIC0wLjkgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTA0NSBxdWFudGl6ZSAtMC45ICAgMWUtMSAgIC0+IC0wLjkKK2RkcXVhMDQ2IHF1YW50aXplIC0wLjkgICAxZS0yICAgLT4gLTAuOTAKK2RkcXVhMDQ3IHF1YW50aXplIC0wLjkgICAxZS0zICAgLT4gLTAuOTAwCisKKy0tIGV4YW1wbGVzIGZyb20gU3BlY2lmaWNhdGlvbgorZGRxdWEwNjAgcXVhbnRpemUgMi4xNyAgIDAuMDAxICAtPiAyLjE3MAorZGRxdWEwNjEgcXVhbnRpemUgMi4xNyAgIDAuMDEgICAtPiAyLjE3CitkZHF1YTA2MiBxdWFudGl6ZSAyLjE3ICAgMC4xICAgIC0+IDIuMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDYzIHF1YW50aXplIDIuMTcgICAxZSswICAgLT4gMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDY0IHF1YW50aXplIDIuMTcgICAxZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDY1IHF1YW50aXplIC1JbmYgICAgSW5mICAgLT4gLUluZmluaXR5CitkZHF1YTA2NiBxdWFudGl6ZSAyICAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWEwNjcgcXVhbnRpemUgLTAuMSAgICAxICAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDY4IHF1YW50aXplIC0wICAgICAgMWUrNSAgICAgLT4gLTBFKzUKK2RkcXVhMDY5IHF1YW50aXplICsxMjM0NTY3ODkwMTIzNDUuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWEwNzAgcXVhbnRpemUgLTk4NzY1NDMzNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTA3MSBxdWFudGl6ZSAyMTcgICAgMWUtMSAgIC0+IDIxNy4wCitkZHF1YTA3MiBxdWFudGl6ZSAyMTcgICAgMWUrMCAgIC0+IDIxNworZGRxdWEwNzMgcXVhbnRpemUgMjE3ICAgIDFlKzEgICAtPiAyLjJFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTA3NCBxdWFudGl6ZSAyMTcgICAgMWUrMiAgIC0+IDJFKzIgSW5leGFjdCBSb3VuZGVkCisKKy0tIGdlbmVyYWwgdGVzdHMgLi4KK2RkcXVhMDg5IHF1YW50aXplIDEyICAgICAxZSs0ICAgLT4gMEUrNCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDkwIHF1YW50aXplIDEyICAgICAxZSszICAgLT4gMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDkxIHF1YW50aXplIDEyICAgICAxZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDkyIHF1YW50aXplIDEyICAgICAxZSsxICAgLT4gMUUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDkzIHF1YW50aXplIDEuMjM0NSAxZS0yICAgLT4gMS4yMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDk0IHF1YW50aXplIDEuMjM1NSAxZS0yICAgLT4gMS4yNCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMDk1IHF1YW50aXplIDEuMjM0NSAxZS02ICAgLT4gMS4yMzQ1MDAKK2RkcXVhMDk2IHF1YW50aXplIDkuOTk5OSAxZS0yICAgLT4gMTAuMDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTA5NyBxdWFudGl6ZSAwLjAwMDEgMWUtMiAgIC0+IDAuMDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTA5OCBxdWFudGl6ZSAwLjAwMSAgMWUtMiAgIC0+IDAuMDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTA5OSBxdWFudGl6ZSAwLjAwOSAgMWUtMiAgIC0+IDAuMDEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEwMCBxdWFudGl6ZSA5MiAgICAgMWUrMiAgIC0+IDFFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMTAxIHF1YW50aXplIC0xICAgICAgMWUwICAgLT4gIC0xCitkZHF1YTEwMiBxdWFudGl6ZSAtMSAgICAgMWUtMSAgIC0+ICAtMS4wCitkZHF1YTEwMyBxdWFudGl6ZSAtMSAgICAgMWUtMiAgIC0+ICAtMS4wMAorZGRxdWExMDQgcXVhbnRpemUgIDAgICAgICAxZTAgICAtPiAgMAorZGRxdWExMDUgcXVhbnRpemUgIDAgICAgIDFlLTEgICAtPiAgMC4wCitkZHF1YTEwNiBxdWFudGl6ZSAgMCAgICAgMWUtMiAgIC0+ICAwLjAwCitkZHF1YTEwNyBxdWFudGl6ZSAgMC4wMCAgIDFlMCAgIC0+ICAwCitkZHF1YTEwOCBxdWFudGl6ZSAgMCAgICAgMWUrMSAgIC0+ICAwRSsxCitkZHF1YTEwOSBxdWFudGl6ZSAgMCAgICAgMWUrMiAgIC0+ICAwRSsyCitkZHF1YTExMCBxdWFudGl6ZSArMSAgICAgIDFlMCAgIC0+ICAxCitkZHF1YTExMSBxdWFudGl6ZSArMSAgICAgMWUtMSAgIC0+ICAxLjAKK2RkcXVhMTEyIHF1YW50aXplICsxICAgICAxZS0yICAgLT4gIDEuMDAKKworZGRxdWExMjAgcXVhbnRpemUgICAxLjA0ICAxZS0zIC0+ICAxLjA0MAorZGRxdWExMjEgcXVhbnRpemUgICAxLjA0ICAxZS0yIC0+ICAxLjA0CitkZHF1YTEyMiBxdWFudGl6ZSAgIDEuMDQgIDFlLTEgLT4gIDEuMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTIzIHF1YW50aXplICAgMS4wNCAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTI0IHF1YW50aXplICAgMS4wNSAgMWUtMyAtPiAgMS4wNTAKK2RkcXVhMTI1IHF1YW50aXplICAgMS4wNSAgMWUtMiAtPiAgMS4wNQorZGRxdWExMjYgcXVhbnRpemUgICAxLjA1ICAxZS0xIC0+ICAxLjAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzMSBxdWFudGl6ZSAgIDEuMDUgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzMiBxdWFudGl6ZSAgIDEuMDYgIDFlLTMgLT4gIDEuMDYwCitkZHF1YTEzMyBxdWFudGl6ZSAgIDEuMDYgIDFlLTIgLT4gIDEuMDYKK2RkcXVhMTM0IHF1YW50aXplICAgMS4wNiAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorZGRxdWExMzUgcXVhbnRpemUgICAxLjA2ICAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTE0MCBxdWFudGl6ZSAgIC0xMCAgICAxZS0yICAtPiAgLTEwLjAwCitkZHF1YTE0MSBxdWFudGl6ZSAgICsxICAgICAxZS0yICAtPiAgMS4wMAorZGRxdWExNDIgcXVhbnRpemUgICArMTAgICAgMWUtMiAgLT4gIDEwLjAwCitkZHF1YTE0MyBxdWFudGl6ZSAgIDFFKzE3ICAxZS0yICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTE0NCBxdWFudGl6ZSAgIDFFLTE3ICAxZS0yICAtPiAgMC4wMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTQ1IHF1YW50aXplICAgMUUtMyAgIDFlLTIgIC0+ICAwLjAwIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDYgcXVhbnRpemUgICAxRS0yICAgMWUtMiAgLT4gIDAuMDEKK2RkcXVhMTQ3IHF1YW50aXplICAgMUUtMSAgIDFlLTIgIC0+ICAwLjEwCitkZHF1YTE0OCBxdWFudGl6ZSAgIDBFLTE3ICAxZS0yICAtPiAgMC4wMAorCitkZHF1YTE1MCBxdWFudGl6ZSAgIDEuMDYwMCAxZS01IC0+ICAxLjA2MDAwCitkZHF1YTE1MSBxdWFudGl6ZSAgIDEuMDYwMCAxZS00IC0+ICAxLjA2MDAKK2RkcXVhMTUyIHF1YW50aXplICAgMS4wNjAwIDFlLTMgLT4gIDEuMDYwIFJvdW5kZWQKK2RkcXVhMTUzIHF1YW50aXplICAgMS4wNjAwIDFlLTIgLT4gIDEuMDYgUm91bmRlZAorZGRxdWExNTQgcXVhbnRpemUgICAxLjA2MDAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTUgcXVhbnRpemUgICAxLjA2MDAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gYSBjb3VwbGUgd2hlcmUgcm91bmRpbmcgd2FzIGRpZmZlcmVudCBpbiBiYXNlIHRlc3RzCityb3VuZGluZzogICAgaGFsZl91cAorZGRxdWExNTcgcXVhbnRpemUgLTAuNSAgIDFlKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTU4IHF1YW50aXplICAgMS4wNSAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTkgcXVhbnRpemUgICAxLjA2ICAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBiYXNlIHRlc3RzIHdpdGggbm9uLTEgY29lZmZpY2llbnRzCitkZHF1YTE2MSBxdWFudGl6ZSAwICAgICAgLTllMCAgIC0+IDAKK2RkcXVhMTYyIHF1YW50aXplIDEgICAgICAtN2UwICAgLT4gMQorZGRxdWExNjMgcXVhbnRpemUgMC4xICAgLTFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjUgcXVhbnRpemUgMC4xICAgIDBlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjYgcXVhbnRpemUgMC4xICAgICAyZTAgICAtPiAwIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjcgcXVhbnRpemUgMC4xICAgIDNlLTEgICAtPiAwLjEKK2RkcXVhMTY4IHF1YW50aXplIDAuMSAgIDQ0ZS0yICAgLT4gMC4xMAorZGRxdWExNjkgcXVhbnRpemUgMC4xICA1NTVlLTMgICAtPiAwLjEwMAorZGRxdWExNzAgcXVhbnRpemUgMC45IDY2NjZlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzEgcXVhbnRpemUgMC45IC03NzdlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzIgcXVhbnRpemUgMC45ICAtODhlKzAgICAtPiAxIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzMgcXVhbnRpemUgMC45ICAgLTllLTEgICAtPiAwLjkKK2RkcXVhMTc0IHF1YW50aXplIDAuOSAgICAwZS0yICAgLT4gMC45MAorZGRxdWExNzUgcXVhbnRpemUgMC45ICAxLjFlLTMgICAtPiAwLjkwMDAKKy0tIG5lZ2F0aXZlcworZGRxdWExODEgcXVhbnRpemUgLTAgICAgMS4xZTAgICAtPiAtMC4wCitkZHF1YTE4MiBxdWFudGl6ZSAtMSAgICAgLTFlMCAgIC0+IC0xCitkZHF1YTE4MyBxdWFudGl6ZSAtMC4xICAxMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWExODUgcXVhbnRpemUgLTAuMSAxMTFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTg2IHF1YW50aXplIC0wLjEgICA3MWUwICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE4NyBxdWFudGl6ZSAtMC4xIC05MWUtMSAgIC0+IC0wLjEKK2RkcXVhMTg4IHF1YW50aXplIC0wLjEgLS4xZS0yICAgLT4gLTAuMTAwCitkZHF1YTE4OSBxdWFudGl6ZSAtMC4xICAtMWUtMyAgIC0+IC0wLjEwMAorZGRxdWExOTAgcXVhbnRpemUgLTAuOSAgIDBlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTkxIHF1YW50aXplIC0wLjkgIC0wZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE5MiBxdWFudGl6ZSAtMC45IC0xMGUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorZGRxdWExOTMgcXVhbnRpemUgLTAuOSAxMDBlLTEgICAtPiAtMC45CitkZHF1YTE5NCBxdWFudGl6ZSAtMC45IDk5OWUtMiAgIC0+IC0wLjkwCisKKy0tICt2ZSBleHBvbmVudHMgLi4KK2RkcXVhMjAxIHF1YW50aXplICAgLTEgICAxZSswIC0+ICAtMQorZGRxdWEyMDIgcXVhbnRpemUgICAtMSAgIDFlKzEgLT4gIC0wRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDMgcXVhbnRpemUgICAtMSAgIDFlKzIgLT4gIC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDQgcXVhbnRpemUgICAgMCAgIDFlKzAgLT4gIDAKK2RkcXVhMjA1IHF1YW50aXplICAgIDAgICAxZSsxIC0+ICAwRSsxCitkZHF1YTIwNiBxdWFudGl6ZSAgICAwICAgMWUrMiAtPiAgMEUrMgorZGRxdWEyMDcgcXVhbnRpemUgICArMSAgIDFlKzAgLT4gIDEKK2RkcXVhMjA4IHF1YW50aXplICAgKzEgICAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDkgcXVhbnRpemUgICArMSAgIDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMjIwIHF1YW50aXplICAgMS4wNCAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjEgcXVhbnRpemUgICAxLjA0IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyMiBxdWFudGl6ZSAgIDEuMDQgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjIzIHF1YW50aXplICAgMS4wNCAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjQgcXVhbnRpemUgICAxLjA1IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyNSBxdWFudGl6ZSAgIDEuMDUgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjI2IHF1YW50aXplICAgMS4wNSAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjcgcXVhbnRpemUgICAxLjA1IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyOCBxdWFudGl6ZSAgIDEuMDUgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjI5IHF1YW50aXplICAgMS4wNSAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzAgcXVhbnRpemUgICAxLjA1IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMSBxdWFudGl6ZSAgIDEuMDUgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjMyIHF1YW50aXplICAgMS4wNiAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzMgcXVhbnRpemUgICAxLjA2IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzNCBxdWFudGl6ZSAgIDEuMDYgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjM1IHF1YW50aXplICAgMS4wNiAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTI0MCBxdWFudGl6ZSAgIC0xMCAgIDFlKzEgIC0+ICAtMUUrMSBSb3VuZGVkCitkZHF1YTI0MSBxdWFudGl6ZSAgICsxICAgIDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyNDIgcXVhbnRpemUgICArMTAgICAxZSsxICAtPiAgMUUrMSBSb3VuZGVkCitkZHF1YTI0MyBxdWFudGl6ZSAgIDFFKzEgIDFlKzEgIC0+ICAxRSsxICAgICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RkcXVhMjQ0IHF1YW50aXplICAgMUUrMiAgMWUrMSAgLT4gIDEuMEUrMiAgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZGRxdWEyNDUgcXVhbnRpemUgICAxRSszICAxZSsxICAtPiAgMS4wMEUrMyAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkZHF1YTI0NiBxdWFudGl6ZSAgIDFFKzQgIDFlKzEgIC0+ICAxLjAwMEUrNCAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RkcXVhMjQ3IHF1YW50aXplICAgMUUrNSAgMWUrMSAgLT4gIDEuMDAwMEUrNSAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZGRxdWEyNDggcXVhbnRpemUgICAxRSs2ICAxZSsxICAtPiAgMS4wMDAwMEUrNiAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkZHF1YTI0OSBxdWFudGl6ZSAgIDFFKzcgIDFlKzEgIC0+ICAxLjAwMDAwMEUrNyAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RkcXVhMjUwIHF1YW50aXplICAgMUUrOCAgMWUrMSAgLT4gIDEuMDAwMDAwMEUrOCAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZGRxdWEyNTEgcXVhbnRpemUgICAxRSs5ICAxZSsxICAtPiAgMS4wMDAwMDAwMEUrOSAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCistLSBuZXh0IG9uZSB0cmllcyB0byBhZGQgOSB6ZXJvcworZGRxdWEyNTIgcXVhbnRpemUgICAxRSsxNyAxZSsxICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTI1MyBxdWFudGl6ZSAgIDFFLTE3IDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEyNTQgcXVhbnRpemUgICAxRS0yICAxZSsxICAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjU1IHF1YW50aXplICAgMEUtMTcgMWUrMSAgLT4gIDBFKzEKK2RkcXVhMjU2IHF1YW50aXplICAtMEUtMTcgMWUrMSAgLT4gLTBFKzEKK2RkcXVhMjU3IHF1YW50aXplICAtMEUtMSAgMWUrMSAgLT4gLTBFKzEKK2RkcXVhMjU4IHF1YW50aXplICAtMCAgICAgMWUrMSAgLT4gLTBFKzEKK2RkcXVhMjU5IHF1YW50aXplICAtMEUrMSAgMWUrMSAgLT4gLTBFKzEKKworZGRxdWEyNjAgcXVhbnRpemUgICAtMTAgICAxZSsyICAtPiAgLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI2MSBxdWFudGl6ZSAgICsxICAgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEyNjIgcXVhbnRpemUgICArMTAgICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjYzIHF1YW50aXplICAgMUUrMSAgMWUrMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI2NCBxdWFudGl6ZSAgIDFFKzIgIDFlKzIgIC0+ICAxRSsyCitkZHF1YTI2NSBxdWFudGl6ZSAgIDFFKzMgIDFlKzIgIC0+ICAxLjBFKzMKK2RkcXVhMjY2IHF1YW50aXplICAgMUUrNCAgMWUrMiAgLT4gIDEuMDBFKzQKK2RkcXVhMjY3IHF1YW50aXplICAgMUUrNSAgMWUrMiAgLT4gIDEuMDAwRSs1CitkZHF1YTI2OCBxdWFudGl6ZSAgIDFFKzYgIDFlKzIgIC0+ICAxLjAwMDBFKzYKK2RkcXVhMjY5IHF1YW50aXplICAgMUUrNyAgMWUrMiAgLT4gIDEuMDAwMDBFKzcKK2RkcXVhMjcwIHF1YW50aXplICAgMUUrOCAgMWUrMiAgLT4gIDEuMDAwMDAwRSs4CitkZHF1YTI3MSBxdWFudGl6ZSAgIDFFKzkgIDFlKzIgIC0+ICAxLjAwMDAwMDBFKzkKK2RkcXVhMjcyIHF1YW50aXplICAgMUUrMTAgMWUrMiAgLT4gIDEuMDAwMDAwMDBFKzEwCitkZHF1YTI3MyBxdWFudGl6ZSAgIDFFLTEwIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEyNzQgcXVhbnRpemUgICAxRS0yICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjc1IHF1YW50aXplICAgMEUtMTAgMWUrMiAgLT4gIDBFKzIKKworZGRxdWEyODAgcXVhbnRpemUgICAtMTAgICAxZSszICAtPiAgLTBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI4MSBxdWFudGl6ZSAgICsxICAgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEyODIgcXVhbnRpemUgICArMTAgICAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjgzIHF1YW50aXplICAgMUUrMSAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI4NCBxdWFudGl6ZSAgIDFFKzIgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZGRxdWEyODUgcXVhbnRpemUgICAxRSszICAxZSszICAtPiAgMUUrMworZGRxdWEyODYgcXVhbnRpemUgICAxRSs0ICAxZSszICAtPiAgMS4wRSs0CitkZHF1YTI4NyBxdWFudGl6ZSAgIDFFKzUgIDFlKzMgIC0+ICAxLjAwRSs1CitkZHF1YTI4OCBxdWFudGl6ZSAgIDFFKzYgIDFlKzMgIC0+ICAxLjAwMEUrNgorZGRxdWEyODkgcXVhbnRpemUgICAxRSs3ICAxZSszICAtPiAgMS4wMDAwRSs3CitkZHF1YTI5MCBxdWFudGl6ZSAgIDFFKzggIDFlKzMgIC0+ICAxLjAwMDAwRSs4CitkZHF1YTI5MSBxdWFudGl6ZSAgIDFFKzkgIDFlKzMgIC0+ICAxLjAwMDAwMEUrOQorZGRxdWEyOTIgcXVhbnRpemUgICAxRSsxMCAxZSszICAtPiAgMS4wMDAwMDAwRSsxMAorZGRxdWEyOTMgcXVhbnRpemUgICAxRS0xMCAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjk0IHF1YW50aXplICAgMUUtMiAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkZHF1YTI5NSBxdWFudGl6ZSAgIDBFLTEwIDFlKzMgIC0+ICAwRSszCisKKy0tIHJvdW5kIHVwIGZyb20gYmVsb3cgW3NpZ24gd3JvbmcgaW4gSklUIGNvbXBpbGVyIG9uY2VdCitkZHF1YTMwMCBxdWFudGl6ZSAgIDAuMDA3OCAxZS01IC0+ICAwLjAwNzgwCitkZHF1YTMwMSBxdWFudGl6ZSAgIDAuMDA3OCAxZS00IC0+ICAwLjAwNzgKK2RkcXVhMzAyIHF1YW50aXplICAgMC4wMDc4IDFlLTMgLT4gIDAuMDA4IEluZXhhY3QgUm91bmRlZAorZGRxdWEzMDMgcXVhbnRpemUgICAwLjAwNzggMWUtMiAtPiAgMC4wMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzA0IHF1YW50aXplICAgMC4wMDc4IDFlLTEgLT4gIDAuMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzA1IHF1YW50aXplICAgMC4wMDc4ICAxZTAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMwNiBxdWFudGl6ZSAgIDAuMDA3OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMDcgcXVhbnRpemUgICAwLjAwNzggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEzMTAgcXVhbnRpemUgIC0wLjAwNzggMWUtNSAtPiAtMC4wMDc4MAorZGRxdWEzMTEgcXVhbnRpemUgIC0wLjAwNzggMWUtNCAtPiAtMC4wMDc4CitkZHF1YTMxMiBxdWFudGl6ZSAgLTAuMDA3OCAxZS0zIC0+IC0wLjAwOCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzEzIHF1YW50aXplICAtMC4wMDc4IDFlLTIgLT4gLTAuMDEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMxNCBxdWFudGl6ZSAgLTAuMDA3OCAxZS0xIC0+IC0wLjAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTMxNSBxdWFudGl6ZSAgLTAuMDA3OCAgMWUwIC0+IC0wIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMTYgcXVhbnRpemUgIC0wLjAwNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzE3IHF1YW50aXplICAtMC4wMDc4IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMzIwIHF1YW50aXplICAgMC4wNzggMWUtNSAtPiAgMC4wNzgwMAorZGRxdWEzMjEgcXVhbnRpemUgICAwLjA3OCAxZS00IC0+ICAwLjA3ODAKK2RkcXVhMzIyIHF1YW50aXplICAgMC4wNzggMWUtMyAtPiAgMC4wNzgKK2RkcXVhMzIzIHF1YW50aXplICAgMC4wNzggMWUtMiAtPiAgMC4wOCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzI0IHF1YW50aXplICAgMC4wNzggMWUtMSAtPiAgMC4xIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMjUgcXVhbnRpemUgICAwLjA3OCAgMWUwIC0+ICAwIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMjYgcXVhbnRpemUgICAwLjA3OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzMjcgcXVhbnRpemUgICAwLjA3OCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTMzMCBxdWFudGl6ZSAgLTAuMDc4IDFlLTUgLT4gLTAuMDc4MDAKK2RkcXVhMzMxIHF1YW50aXplICAtMC4wNzggMWUtNCAtPiAtMC4wNzgwCitkZHF1YTMzMiBxdWFudGl6ZSAgLTAuMDc4IDFlLTMgLT4gLTAuMDc4CitkZHF1YTMzMyBxdWFudGl6ZSAgLTAuMDc4IDFlLTIgLT4gLTAuMDggSW5leGFjdCBSb3VuZGVkCitkZHF1YTMzNCBxdWFudGl6ZSAgLTAuMDc4IDFlLTEgLT4gLTAuMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzM1IHF1YW50aXplICAtMC4wNzggIDFlMCAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzM2IHF1YW50aXplICAtMC4wNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzM3IHF1YW50aXplICAtMC4wNzggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWEzNDAgcXVhbnRpemUgICAwLjc4IDFlLTUgLT4gIDAuNzgwMDAKK2RkcXVhMzQxIHF1YW50aXplICAgMC43OCAxZS00IC0+ICAwLjc4MDAKK2RkcXVhMzQyIHF1YW50aXplICAgMC43OCAxZS0zIC0+ICAwLjc4MAorZGRxdWEzNDMgcXVhbnRpemUgICAwLjc4IDFlLTIgLT4gIDAuNzgKK2RkcXVhMzQ0IHF1YW50aXplICAgMC43OCAxZS0xIC0+ICAwLjggSW5leGFjdCBSb3VuZGVkCitkZHF1YTM0NSBxdWFudGl6ZSAgIDAuNzggIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzQ2IHF1YW50aXplICAgMC43OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzNDcgcXVhbnRpemUgICAwLjc4IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMzUwIHF1YW50aXplICAtMC43OCAxZS01IC0+IC0wLjc4MDAwCitkZHF1YTM1MSBxdWFudGl6ZSAgLTAuNzggMWUtNCAtPiAtMC43ODAwCitkZHF1YTM1MiBxdWFudGl6ZSAgLTAuNzggMWUtMyAtPiAtMC43ODAKK2RkcXVhMzUzIHF1YW50aXplICAtMC43OCAxZS0yIC0+IC0wLjc4CitkZHF1YTM1NCBxdWFudGl6ZSAgLTAuNzggMWUtMSAtPiAtMC44IEluZXhhY3QgUm91bmRlZAorZGRxdWEzNTUgcXVhbnRpemUgIC0wLjc4ICAxZTAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTM1NiBxdWFudGl6ZSAgLTAuNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzU3IHF1YW50aXplICAtMC43OCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTM2MCBxdWFudGl6ZSAgIDcuOCAxZS01IC0+ICA3LjgwMDAwCitkZHF1YTM2MSBxdWFudGl6ZSAgIDcuOCAxZS00IC0+ICA3LjgwMDAKK2RkcXVhMzYyIHF1YW50aXplICAgNy44IDFlLTMgLT4gIDcuODAwCitkZHF1YTM2MyBxdWFudGl6ZSAgIDcuOCAxZS0yIC0+ICA3LjgwCitkZHF1YTM2NCBxdWFudGl6ZSAgIDcuOCAxZS0xIC0+ICA3LjgKK2RkcXVhMzY1IHF1YW50aXplICAgNy44ICAxZTAgLT4gIDggSW5leGFjdCBSb3VuZGVkCitkZHF1YTM2NiBxdWFudGl6ZSAgIDcuOCAxZSsxIC0+ICAxRSsxIEluZXhhY3QgUm91bmRlZAorZGRxdWEzNjcgcXVhbnRpemUgICA3LjggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzY4IHF1YW50aXplICAgNy44IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMzcwIHF1YW50aXplICAtNy44IDFlLTUgLT4gLTcuODAwMDAKK2RkcXVhMzcxIHF1YW50aXplICAtNy44IDFlLTQgLT4gLTcuODAwMAorZGRxdWEzNzIgcXVhbnRpemUgIC03LjggMWUtMyAtPiAtNy44MDAKK2RkcXVhMzczIHF1YW50aXplICAtNy44IDFlLTIgLT4gLTcuODAKK2RkcXVhMzc0IHF1YW50aXplICAtNy44IDFlLTEgLT4gLTcuOAorZGRxdWEzNzUgcXVhbnRpemUgIC03LjggIDFlMCAtPiAtOCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzc2IHF1YW50aXplICAtNy44IDFlKzEgLT4gLTFFKzEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTM3NyBxdWFudGl6ZSAgLTcuOCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorZGRxdWEzNzggcXVhbnRpemUgIC03LjggMWUrMyAtPiAtMEUrMyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBpbmRpdmlkdWFscworZGRxdWEzODAgcXVhbnRpemUgICAxMjM0NTY3MzUyMzY0LjUwNiAxZS0yIC0+IDEyMzQ1NjczNTIzNjQuNTEgSW5leGFjdCBSb3VuZGVkCitkZHF1YTM4MSBxdWFudGl6ZSAgIDEyMzQ1NjczNTIzNjQ1LjA2IDFlLTIgLT4gMTIzNDU2NzM1MjM2NDUuMDYKK2RkcXVhMzgyIHF1YW50aXplICAgMTIzNDU2NzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhMzgzIHF1YW50aXplICAgMTIzNDU2NzM1MjM2NDUwNiAgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhMzg0IHF1YW50aXplICAtMTIzNDU2NzM1MjM2NC41MDYgMWUtMiAtPiAtMTIzNDU2NzM1MjM2NC41MSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzg1IHF1YW50aXplICAtMTIzNDU2NzM1MjM2NDUuMDYgMWUtMiAtPiAtMTIzNDU2NzM1MjM2NDUuMDYKK2RkcXVhMzg2IHF1YW50aXplICAtMTIzNDU2NzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhMzg3IHF1YW50aXplICAtMTIzNDU2NzM1MjM2NDUwNiAgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcm91bmRpbmc6IGRvd24KK2RkcXVhMzg5IHF1YW50aXplICAgMTIzNDU2NzM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tID8gc2hvdWxkIHRoYXQgb25lIGluc3RlYWQgaGF2ZSBiZWVuOgorLS0gZGRxdWEzODkgcXVhbnRpemUgICAxMjM0NTY3MzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm91bmRpbmc6IGhhbGZfdXAKKworLS0gYW5kIGEgZmV3IG1vcmUgZnJvbSBlLW1haWwgZGlzY3Vzc2lvbnMKK2RkcXVhMzkxIHF1YW50aXplICAxMjM0NTY3ODkxMi4zNDU2NyAgMWUtMyAtPiAxMjM0NTY3ODkxMi4zNDYgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzkyIHF1YW50aXplICAxMjM0NTY3ODkxMjMuNDU2NyAgMWUtMyAtPiAxMjM0NTY3ODkxMjMuNDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMzkzIHF1YW50aXplICAxMjM0NTY3ODkxMjM0LjU2NyAgMWUtMyAtPiAxMjM0NTY3ODkxMjM0LjU2NworZGRxdWEzOTQgcXVhbnRpemUgIDEyMzQ1Njc4OTEyMzQ1LjY3ICAxZS0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWEzOTUgcXVhbnRpemUgIDEyMzQ1Njc4OTEyMzQ1Ni43ICAxZS0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWEzOTYgcXVhbnRpemUgIDEyMzQ1Njc4OTEyMzQ1NjcuICAxZS0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzb21lIDk5OTkgcm91bmQtdXAgY2FzZXMKK2RkcXVhNDAwIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTUgIC0+ICA5Ljk5OTAwCitkZHF1YTQwMSBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAxZS00ICAtPiAgOS45OTkwCitkZHF1YTQwMiBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAxZS0zICAtPiAgOS45OTkKK2RkcXVhNDAzIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTIgIC0+IDEwLjAwICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDA0IHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTEgIC0+IDEwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDA1IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTAgIC0+IDEwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDA2IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTEgIC0+IDFFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDA3IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTIgIC0+IDBFKzIgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWE0MTAgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtNSAgLT4gIDAuOTk5MDAKK2RkcXVhNDExIHF1YW50aXplICAgMC45OTkgICAgICAgIDFlLTQgIC0+ICAwLjk5OTAKK2RkcXVhNDEyIHF1YW50aXplICAgMC45OTkgICAgICAgIDFlLTMgIC0+ICAwLjk5OQorZGRxdWE0MTMgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMiAgLT4gIDEuMDAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MTQgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMSAgLT4gIDEuMCAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MTUgcXVhbnRpemUgICAwLjk5OSAgICAgICAgIDFlMCAgLT4gIDEgICAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MTYgcXVhbnRpemUgICAwLjk5OSAgICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTQyMCBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS01ICAtPiAgMC4wOTk5MAorZGRxdWE0MjEgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtNCAgLT4gIDAuMDk5OQorZGRxdWE0MjIgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMyAgLT4gIDAuMTAwICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MjMgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMiAgLT4gIDAuMTAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MjQgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMSAgLT4gIDAuMSAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MjUgcXVhbnRpemUgICAwLjA5OTkgICAgICAgIDFlMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MjYgcXVhbnRpemUgICAwLjA5OTkgICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTQzMCBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS01ICAtPiAgMC4wMDk5OQorZGRxdWE0MzEgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtNCAgLT4gIDAuMDEwMCAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MzIgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMyAgLT4gIDAuMDEwICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MzMgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMiAgLT4gIDAuMDEgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MzQgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMSAgLT4gIDAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MzUgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgIDFlMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE0MzYgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTQ0MCBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS01ICAtPiAgMC4wMDEwMCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ0MSBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS00ICAtPiAgMC4wMDEwICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ0MiBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0zICAtPiAgMC4wMDEgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ0MyBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0yICAtPiAgMC4wMCAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ0NCBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0xICAtPiAgMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ0NSBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAgMWUwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ0NiBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMTAwMSBxdWFudGl6ZSAgMC4wMDAgICAgICAgIDAuMDAxIC0+ICAwLjAwMAorZGRxdWExMDAyIHF1YW50aXplICAwLjAwMSAgICAgICAgMC4wMDEgLT4gIDAuMDAxCitkZHF1YTEwMDMgcXVhbnRpemUgIDAuMDAxMiAgICAgICAwLjAwMSAtPiAgMC4wMDEgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMDA0IHF1YW50aXplICAwLjAwMTggICAgICAgMC4wMDEgLT4gIDAuMDAyICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTAwNSBxdWFudGl6ZSAgMC41MDEgICAgICAgIDAuMDAxIC0+ICAwLjUwMQorZGRxdWExMDA2IHF1YW50aXplICAwLjUwMTIgICAgICAgMC4wMDEgLT4gIDAuNTAxICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTAwNyBxdWFudGl6ZSAgMC41MDE4ICAgICAgIDAuMDAxIC0+ICAwLjUwMiAgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEwMDggcXVhbnRpemUgIDAuOTk5ICAgICAgICAwLjAwMSAtPiAgMC45OTkKKworZGRxdWE0ODEgcXVhbnRpemUgMTIzNDU2NzgwMDAgMWUrMyAtPiAxLjIzNDU2NzhFKzEwIFJvdW5kZWQKK2RkcXVhNDgyIHF1YW50aXplIDEyMzQ1Njc4MDAgIDFlKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitkZHF1YTQ4MyBxdWFudGl6ZSAxMjM0NTY3ODkwICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorZGRxdWE0ODQgcXVhbnRpemUgMTIzNDU2Nzg5MSAgMWUrMSAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorZGRxdWE0ODUgcXVhbnRpemUgMTIzNDU2Nzg5MDEgMWUrMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDg2IHF1YW50aXplIDEyMzQ1Njc4OTYgIDFlKzEgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKKy0tIGEgcG90ZW50aWFsIGRvdWJsZS1yb3VuZAorZGRxdWE0ODcgcXVhbnRpemUgMTIzNC45ODc2NDMgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCitkZHF1YTQ4OCBxdWFudGl6ZSAxMjM0Ljk4NzY0NyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKKworZGRxdWE0OTEgcXVhbnRpemUgMTIzNDU2NzgwMDAgMWUrMyAtPiAxLjIzNDU2NzhFKzEwIFJvdW5kZWQKK2RkcXVhNDkyIHF1YW50aXplIDEyMzQ1Njc4MDAgIDFlKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitkZHF1YTQ5MyBxdWFudGl6ZSAxMjM0NTY3ODkwICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorZGRxdWE0OTQgcXVhbnRpemUgMTIzNDU2Nzg5MSAgMWUrMSAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorZGRxdWE0OTUgcXVhbnRpemUgMTIzNDU2Nzg5MDEgMWUrMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDk2IHF1YW50aXplIDEyMzQ1Njc4OTYgIDFlKzEgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNDk3IHF1YW50aXplIDEyMzQuOTg3NjQzIDFlLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorZGRxdWE0OTggcXVhbnRpemUgMTIzNC45ODc2NDcgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCisKKy0tIFplcm9zCitkZHF1YTUwMCBxdWFudGl6ZSAgIDAgICAgIDFlMSAtPiAgMEUrMQorZGRxdWE1MDEgcXVhbnRpemUgICAwICAgICAxZTAgLT4gIDAKK2RkcXVhNTAyIHF1YW50aXplICAgMCAgICAxZS0xIC0+ICAwLjAKK2RkcXVhNTAzIHF1YW50aXplICAgMC4wICAxZS0xIC0+ICAwLjAKK2RkcXVhNTA0IHF1YW50aXplICAgMC4wICAgMWUwIC0+ICAwCitkZHF1YTUwNSBxdWFudGl6ZSAgIDAuMCAgMWUrMSAtPiAgMEUrMQorZGRxdWE1MDYgcXVhbnRpemUgICAwRSsxIDFlLTEgLT4gIDAuMAorZGRxdWE1MDcgcXVhbnRpemUgICAwRSsxICAxZTAgLT4gIDAKK2RkcXVhNTA4IHF1YW50aXplICAgMEUrMSAxZSsxIC0+ICAwRSsxCitkZHF1YTUwOSBxdWFudGl6ZSAgLTAgICAgIDFlMSAtPiAtMEUrMQorZGRxdWE1MTAgcXVhbnRpemUgIC0wICAgICAxZTAgLT4gLTAKK2RkcXVhNTExIHF1YW50aXplICAtMCAgICAxZS0xIC0+IC0wLjAKK2RkcXVhNTEyIHF1YW50aXplICAtMC4wICAxZS0xIC0+IC0wLjAKK2RkcXVhNTEzIHF1YW50aXplICAtMC4wICAgMWUwIC0+IC0wCitkZHF1YTUxNCBxdWFudGl6ZSAgLTAuMCAgMWUrMSAtPiAtMEUrMQorZGRxdWE1MTUgcXVhbnRpemUgIC0wRSsxIDFlLTEgLT4gLTAuMAorZGRxdWE1MTYgcXVhbnRpemUgIC0wRSsxICAxZTAgLT4gLTAKK2RkcXVhNTE3IHF1YW50aXplICAtMEUrMSAxZSsxIC0+IC0wRSsxCisKKy0tIFN1c3BpY2lvdXMgUkhTIHZhbHVlcworZGRxdWE1MjAgcXVhbnRpemUgICAxLjIzNCAgICAxZTM1OSAtPiAwRSszNTkgSW5leGFjdCBSb3VuZGVkCitkZHF1YTUyMSBxdWFudGl6ZSAxMjMuNDU2ICAgIDFlMzU5IC0+IDBFKzM1OSBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNTIyIHF1YW50aXplICAgMS4yMzQgICAgMWUzNTkgLT4gMEUrMzU5IEluZXhhY3QgUm91bmRlZAorZGRxdWE1MjMgcXVhbnRpemUgMTIzLjQ1NiAgICAxZTM1OSAtPiAwRSszNTkgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGZvdXIgYXJlICJ3b24ndCBmaXQiIG92ZXJmbAorZGRxdWE1MjYgcXVhbnRpemUgICAxLjIzNCAgIDFlLTI5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTI3IHF1YW50aXplIDEyMy40NTYgICAxZS0yOTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTUyOCBxdWFudGl6ZSAgIDEuMjM0ICAgMWUtMjk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1MjkgcXVhbnRpemUgMTIzLjQ1NiAgIDFlLTI5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRxdWE1MzIgcXVhbnRpemUgICAxLjIzNEUrMjk5ICAgIDFlMjk5IC0+IDFFKzI5OSAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNTMzIHF1YW50aXplICAgMS4yMzRFKzI5OCAgICAxZTI5OSAtPiAwRSsyOTkgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTUzNCBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAgMWUyOTkgLT4gMEUrMjk5ICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE1MzcgcXVhbnRpemUgICAwICAgICAgICAgICAgMWUtMjk5IC0+IDBFLTI5OQorLS0gbmV4dCB0d28gYXJlICJ3b24ndCBmaXQiIG92ZXJmbG93cworZGRxdWE1MzggcXVhbnRpemUgICAxLjIzNCAgICAgICAgMWUtMjk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1MzkgcXVhbnRpemUgICAxLjIzNCAgICAgICAgMWUtMzAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gW21vcmUgYmVsb3ddCisKKy0tIFNwZWNpYWxzCitkZHF1YTU4MCBxdWFudGl6ZSAgSW5mICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RkcXVhNTgxIHF1YW50aXplICBJbmYgIDFlLTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTU4MiBxdWFudGl6ZSAgSW5mICAxZS0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1ODMgcXVhbnRpemUgIEluZiAgIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTg0IHF1YW50aXplICBJbmYgICAxZTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTU4NSBxdWFudGl6ZSAgSW5mICAgMWUyOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1ODYgcXVhbnRpemUgIEluZiAgICAgSW5mICAgLT4gIEluZmluaXR5CitkZHF1YTU4NyBxdWFudGl6ZSAtMTAwMCAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1ODggcXVhbnRpemUgLUluZiAgICAgSW5mICAgLT4gIC1JbmZpbml0eQorZGRxdWE1ODkgcXVhbnRpemUgLTEgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTkwIHF1YW50aXplICAwICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTU5MSBxdWFudGl6ZSAgMSAgICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE1OTIgcXVhbnRpemUgIDEwMDAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTkzIHF1YW50aXplICBJbmYgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZGRxdWE1OTQgcXVhbnRpemUgIEluZiAgMWUtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNTk1IHF1YW50aXplIC0wICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2RkcXVhNjAwIHF1YW50aXplIC1JbmYgICAgLUluZiAgIC0+ICAtSW5maW5pdHkKK2RkcXVhNjAxIHF1YW50aXplIC1JbmYgIDFlLTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYwMiBxdWFudGl6ZSAtSW5mICAxZS0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2MDMgcXVhbnRpemUgLUluZiAgIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjA0IHF1YW50aXplIC1JbmYgICAxZTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYwNSBxdWFudGl6ZSAtSW5mICAgMWUyOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2MDYgcXVhbnRpemUgLUluZiAgICAgSW5mICAgLT4gIC1JbmZpbml0eQorZGRxdWE2MDcgcXVhbnRpemUgLTEwMDAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjA4IHF1YW50aXplIC1JbmYgICAgLUluZiAgIC0+ICAtSW5maW5pdHkKK2RkcXVhNjA5IHF1YW50aXplIC0xICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYxMCBxdWFudGl6ZSAgMCAgICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2MTEgcXVhbnRpemUgIDEgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjEyIHF1YW50aXplICAxMDAwICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYxMyBxdWFudGl6ZSAgSW5mICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RkcXVhNjE0IHF1YW50aXplIC1JbmYgIDFlLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTYxNSBxdWFudGl6ZSAtMCAgICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkZHF1YTYyMSBxdWFudGl6ZSAgTmFOICAgLUluZiAgICAtPiAgTmFOCitkZHF1YTYyMiBxdWFudGl6ZSAgTmFOIDFlLTI5OSAgICAtPiAgTmFOCitkZHF1YTYyMyBxdWFudGl6ZSAgTmFOIDFlLTEgICAgICAtPiAgTmFOCitkZHF1YTYyNCBxdWFudGl6ZSAgTmFOICAxZTAgICAgICAtPiAgTmFOCitkZHF1YTYyNSBxdWFudGl6ZSAgTmFOICAxZTEgICAgICAtPiAgTmFOCitkZHF1YTYyNiBxdWFudGl6ZSAgTmFOICAxZTI5OSAgICAtPiAgTmFOCitkZHF1YTYyNyBxdWFudGl6ZSAgTmFOICAgIEluZiAgICAtPiAgTmFOCitkZHF1YTYyOCBxdWFudGl6ZSAgTmFOICAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYyOSBxdWFudGl6ZSAtSW5mICAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYzMCBxdWFudGl6ZSAtMTAwMCAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYzMSBxdWFudGl6ZSAtMSAgICAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYzMiBxdWFudGl6ZSAgMCAgICAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYzMyBxdWFudGl6ZSAgMSAgICAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYzNCBxdWFudGl6ZSAgMTAwMCAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYzNSBxdWFudGl6ZSAgSW5mICAgIE5hTiAgICAtPiAgTmFOCitkZHF1YTYzNiBxdWFudGl6ZSAgTmFOIDFlLTAgICAgICAtPiAgTmFOCitkZHF1YTYzNyBxdWFudGl6ZSAtMCAgICAgIE5hTiAgICAtPiAgTmFOCisKK2RkcXVhNjQxIHF1YW50aXplICBzTmFOICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY0MiBxdWFudGl6ZSAgc05hTiAxZS0yOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NDMgcXVhbnRpemUgIHNOYU4gMWUtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjQ0IHF1YW50aXplICBzTmFOICAxZTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY0NSBxdWFudGl6ZSAgc05hTiAgMWUxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NDYgcXVhbnRpemUgIHNOYU4gIDFlMjk5ICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjQ3IHF1YW50aXplICBzTmFOICAgIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY0OCBxdWFudGl6ZSAgc05hTiAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NDkgcXVhbnRpemUgIE5hTiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjUwIHF1YW50aXplIC1JbmYgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY1MSBxdWFudGl6ZSAtMTAwMCAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NTIgcXVhbnRpemUgLTEgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjUzIHF1YW50aXplICAwICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY1NCBxdWFudGl6ZSAgMSAgICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NTUgcXVhbnRpemUgIDEwMDAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjU2IHF1YW50aXplICBJbmYgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTY1NyBxdWFudGl6ZSAgTmFOICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2NTggcXVhbnRpemUgIHNOYU4gMWUtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjU5IHF1YW50aXplIC0wICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RkcXVhNjYxIHF1YW50aXplICBOYU45IC1JbmYgICAtPiAgTmFOOQorZGRxdWE2NjIgcXVhbnRpemUgIE5hTjggIDkxOSAgIC0+ICBOYU44CitkZHF1YTY2MyBxdWFudGl6ZSAgTmFONzEgSW5mICAgLT4gIE5hTjcxCitkZHF1YTY2NCBxdWFudGl6ZSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK2RkcXVhNjY1IHF1YW50aXplIC1JbmYgICBOYU40ICAtPiAgTmFONAorZGRxdWE2NjYgcXVhbnRpemUgLTkxOSAgIE5hTjMxIC0+ICBOYU4zMQorZGRxdWE2NjcgcXVhbnRpemUgIEluZiAgIE5hTjIgIC0+ICBOYU4yCisKK2RkcXVhNjcxIHF1YW50aXplICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjcyIHF1YW50aXplICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjczIHF1YW50aXplICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjc0IHF1YW50aXplICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjc1IHF1YW50aXplICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjc2IHF1YW50aXplIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjc3IHF1YW50aXplICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjc4IHF1YW50aXplICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhNjc5IHF1YW50aXplICBOYU4gICAgc05hTjg4ICAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworZGRxdWE2ODEgcXVhbnRpemUgLU5hTjkgLUluZiAgIC0+IC1OYU45CitkZHF1YTY4MiBxdWFudGl6ZSAtTmFOOCAgOTE5ICAgLT4gLU5hTjgKK2RkcXVhNjgzIHF1YW50aXplIC1OYU43MSBJbmYgICAtPiAtTmFONzEKK2RkcXVhNjg0IHF1YW50aXplIC1OYU42IC1OYU41ICAtPiAtTmFONgorZGRxdWE2ODUgcXVhbnRpemUgLUluZiAgLU5hTjQgIC0+IC1OYU40CitkZHF1YTY4NiBxdWFudGl6ZSAtOTE5ICAtTmFOMzEgLT4gLU5hTjMxCitkZHF1YTY4NyBxdWFudGl6ZSAgSW5mICAtTmFOMiAgLT4gLU5hTjIKKworZGRxdWE2OTEgcXVhbnRpemUgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTIgcXVhbnRpemUgLXNOYU45OCAtMTEgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTMgcXVhbnRpemUgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTQgcXVhbnRpemUgLXNOYU4xNiBzTmFOOTQgIC0+IC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTUgcXVhbnRpemUgLU5hTjk1IC1zTmFOOTMgIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTYgcXVhbnRpemUgLUluZiAgIC1zTmFOOTIgIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTcgcXVhbnRpemUgIDA4OCAgIC1zTmFOOTEgIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTggcXVhbnRpemUgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZGRxdWE2OTkgcXVhbnRpemUgIE5hTiAgIC1zTmFOODggIC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK2RkcXVhNzEwIHF1YW50aXplICAxLjAwRS0zODMgICAgMWUtMzgzICAtPiAgIDFFLTM4MyAgICBSb3VuZGVkCitkZHF1YTcxMSBxdWFudGl6ZSAgMC4xRS0zODMgICAgMmUtMzg0ICAtPiAgIDFFLTM4NCAgIFN1Ym5vcm1hbAorZGRxdWE3MTIgcXVhbnRpemUgIDAuMTBFLTM4MyAgIDNlLTM4NCAgLT4gICAxRS0zODQgICBTdWJub3JtYWwgUm91bmRlZAorZGRxdWE3MTMgcXVhbnRpemUgIDAuMTAwRS0zODMgIDRlLTM4NCAgLT4gICAxRS0zODQgICBTdWJub3JtYWwgUm91bmRlZAorZGRxdWE3MTQgcXVhbnRpemUgIDAuMDFFLTM4MyAgIDVlLTM4NSAgLT4gICAxRS0zODUgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitkZHF1YTcxNSBxdWFudGl6ZSAgMC45OTlFLTM4MyAgIDFlLTM4MyAgLT4gICAxRS0zODMgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTcxNiBxdWFudGl6ZSAgMC4wOTlFLTM4MyAxMGUtMzg0ICAtPiAgIDFFLTM4NCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKKworZGRxdWE3MTcgcXVhbnRpemUgIDAuMDA5RS0zODMgIDFlLTM4NSAgLT4gICAxRS0zODUgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitkZHF1YTcxOCBxdWFudGl6ZSAgMC4wMDFFLTM4MyAgMWUtMzg1ICAtPiAgIDBFLTM4NSAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3MTkgcXVhbnRpemUgIDAuMDAwOUUtMzgzIDFlLTM4NSAgLT4gICAwRS0zODUgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNzIwIHF1YW50aXplICAwLjAwMDFFLTM4MyAxZS0zODUgIC0+ICAgMEUtMzg1ICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhNzMwIHF1YW50aXplIC0xLjAwRS0zODMgICAxZS0zODMgIC0+ICAtMUUtMzgzICAgICBSb3VuZGVkCitkZHF1YTczMSBxdWFudGl6ZSAtMC4xRS0zODMgICAgMWUtMzgzICAtPiAgLTBFLTM4MyAgICAgUm91bmRlZCBJbmV4YWN0CitkZHF1YTczMiBxdWFudGl6ZSAtMC4xMEUtMzgzICAgMWUtMzgzICAtPiAgLTBFLTM4MyAgICAgUm91bmRlZCBJbmV4YWN0CitkZHF1YTczMyBxdWFudGl6ZSAtMC4xMDBFLTM4MyAgMWUtMzgzICAtPiAgLTBFLTM4MyAgICAgUm91bmRlZCBJbmV4YWN0CitkZHF1YTczNCBxdWFudGl6ZSAtMC4wMUUtMzgzICAgMWUtMzgzICAtPiAgLTBFLTM4MyAgICAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorZGRxdWE3MzUgcXVhbnRpemUgLTAuOTk5RS0zODMgOTBlLTM4MyAgLT4gIC0xRS0zODMgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3MzYgcXVhbnRpemUgLTAuMDk5RS0zODMgLTFlLTM4MyAgLT4gIC0wRS0zODMgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3MzcgcXVhbnRpemUgLTAuMDA5RS0zODMgLTFlLTM4MyAgLT4gIC0wRS0zODMgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3MzggcXVhbnRpemUgLTAuMDAxRS0zODMgLTBlLTM4MyAgLT4gIC0wRS0zODMgICAgIEluZXhhY3QgUm91bmRlZAorZGRxdWE3MzkgcXVhbnRpemUgLTAuMDAwMUUtMzgzIDBlLTM4MyAgLT4gIC0wRS0zODMgICAgIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTc0MCBxdWFudGl6ZSAtMS4wMEUtMzgzICAgMWUtMzg0IC0+ICAtMS4wRS0zODMgICBSb3VuZGVkCitkZHF1YTc0MSBxdWFudGl6ZSAtMC4xRS0zODMgICAgMWUtMzg0IC0+ICAtMUUtMzg0ICAgIFN1Ym5vcm1hbAorZGRxdWE3NDIgcXVhbnRpemUgLTAuMTBFLTM4MyAgIDFlLTM4NCAtPiAgLTFFLTM4NCAgICBTdWJub3JtYWwgUm91bmRlZAorZGRxdWE3NDMgcXVhbnRpemUgLTAuMTAwRS0zODMgIDFlLTM4NCAtPiAgLTFFLTM4NCAgICBTdWJub3JtYWwgUm91bmRlZAorZGRxdWE3NDQgcXVhbnRpemUgLTAuMDFFLTM4MyAgIDFlLTM4NCAtPiAgLTBFLTM4NCAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitkZHF1YTc0NSBxdWFudGl6ZSAtMC45OTlFLTM4MyAgMWUtMzg0IC0+ICAtMS4wRS0zODMgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNzQ2IHF1YW50aXplIC0wLjA5OUUtMzgzICAxZS0zODQgLT4gIC0xRS0zODQgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorZGRxdWE3NDcgcXVhbnRpemUgLTAuMDA5RS0zODMgIDFlLTM4NCAtPiAgLTBFLTM4NCAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNzQ4IHF1YW50aXplIC0wLjAwMUUtMzgzICAxZS0zODQgLT4gIC0wRS0zODQgICAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTc0OSBxdWFudGl6ZSAtMC4wMDAxRS0zODMgMWUtMzg0IC0+ICAtMEUtMzg0ICAgIEluZXhhY3QgUm91bmRlZAorCitkZHF1YTc1MCBxdWFudGl6ZSAtMS4wMEUtMzgzICAgMWUtMzg1IC0+ICAtMS4wMEUtMzgzCitkZHF1YTc1MSBxdWFudGl6ZSAtMC4xRS0zODMgICAgMWUtMzg1IC0+ICAtMS4wRS0zODQgIFN1Ym5vcm1hbAorZGRxdWE3NTIgcXVhbnRpemUgLTAuMTBFLTM4MyAgIDFlLTM4NSAtPiAgLTEuMEUtMzg0ICBTdWJub3JtYWwKK2RkcXVhNzUzIHF1YW50aXplIC0wLjEwMEUtMzgzICAxZS0zODUgLT4gIC0xLjBFLTM4NCAgU3Vibm9ybWFsIFJvdW5kZWQKK2RkcXVhNzU0IHF1YW50aXplIC0wLjAxRS0zODMgICAxZS0zODUgLT4gIC0xRS0zODUgICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorZGRxdWE3NTUgcXVhbnRpemUgLTAuOTk5RS0zODMgIDFlLTM4NSAtPiAgLTEuMDBFLTM4MyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTc1NiBxdWFudGl6ZSAtMC4wOTlFLTM4MyAgMWUtMzg1IC0+ICAtMS4wRS0zODQgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKK2RkcXVhNzU3IHF1YW50aXplIC0wLjAwOUUtMzgzICAxZS0zODUgLT4gIC0xRS0zODUgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorZGRxdWE3NTggcXVhbnRpemUgLTAuMDAxRS0zODMgIDFlLTM4NSAtPiAgLTBFLTM4NSAgICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhNzU5IHF1YW50aXplIC0wLjAwMDFFLTM4MyAxZS0zODUgLT4gIC0wRS0zODUgICAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhNzYwIHF1YW50aXplIC0xLjAwRS0zODMgICAxZS0zODYgLT4gIC0xLjAwMEUtMzgzCitkZHF1YTc2MSBxdWFudGl6ZSAtMC4xRS0zODMgICAgMWUtMzg2IC0+ICAtMS4wMEUtMzg0ICBTdWJub3JtYWwKK2RkcXVhNzYyIHF1YW50aXplIC0wLjEwRS0zODMgICAxZS0zODYgLT4gIC0xLjAwRS0zODQgIFN1Ym5vcm1hbAorZGRxdWE3NjMgcXVhbnRpemUgLTAuMTAwRS0zODMgIDFlLTM4NiAtPiAgLTEuMDBFLTM4NCAgU3Vibm9ybWFsCitkZHF1YTc2NCBxdWFudGl6ZSAtMC4wMUUtMzgzICAgMWUtMzg2IC0+ICAtMS4wRS0zODUgICBTdWJub3JtYWwKK2RkcXVhNzY1IHF1YW50aXplIC0wLjk5OUUtMzgzICAxZS0zODYgLT4gIC05Ljk5RS0zODQgIFN1Ym5vcm1hbAorZGRxdWE3NjYgcXVhbnRpemUgLTAuMDk5RS0zODMgIDFlLTM4NiAtPiAgLTkuOUUtMzg1ICAgU3Vibm9ybWFsCitkZHF1YTc2NyBxdWFudGl6ZSAtMC4wMDlFLTM4MyAgMWUtMzg2IC0+ICAtOUUtMzg2ICAgICBTdWJub3JtYWwKK2RkcXVhNzY4IHF1YW50aXplIC0wLjAwMUUtMzgzICAxZS0zODYgLT4gIC0xRS0zODYgICAgIFN1Ym5vcm1hbAorZGRxdWE3NjkgcXVhbnRpemUgLTAuMDAwMUUtMzgzIDFlLTM4NiAtPiAgLTBFLTM4NiAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIE1vcmUgZnJvbSBGdW5nIExlZQorZGRxdWExMDIxIHF1YW50aXplICA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0ICAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0IC0+ICA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0CitkZHF1YTEwMjIgcXVhbnRpemUgLTguNjY2NjY2NjY2NjY2MDAwRSszODQgIDEuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gLTguNjY2NjY2NjY2NjY2MDAwRSszODQKK2RkcXVhMTAyNyBxdWFudGl6ZSA4LjY2NjY2NjY2NjY2NjAwMEUrMzIzICAxRSszMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcXVhMTAyOSBxdWFudGl6ZSA4LjY2NjY2NjY2RSszICAgICAgICAgICAxRSszICAgICAtPiA5RSszIEluZXhhY3QgUm91bmRlZAorCisKKy0tZGRxdWExMDMwIHF1YW50aXplIDguNjY2NjY2NjY2NjY2MDAwRSszODQgMUUrMzg0ICAgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBSb3VuZGVkIEluZXhhY3QKKy0tZGRxdWExMDMxIHF1YW50aXplIDguNjY2NjY2NjY2NjY2MDAwRSszODQgMUUrMzg0ICAgLT4gOC42NjY2NjY2NjY2NjYwMDBFKzM4NCBSb3VuZGVkCistLWRkcXVhMTAzMiBxdWFudGl6ZSA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0IDFFKzM4MyAgIC0+IDguNjY2NjY2NjY2NjY2MDAwRSszODQgUm91bmRlZAorLS1kZHF1YTEwMzMgcXVhbnRpemUgOC42NjY2NjY2NjY2NjYwMDBFKzM4NCAxRSszODIgICAtPiA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0IFJvdW5kZWQKKy0tZGRxdWExMDM0IHF1YW50aXplIDguNjY2NjY2NjY2NjY2MDAwRSszODQgMUUrMzgxICAgLT4gOC42NjY2NjY2NjY2NjYwMDBFKzM4NCBSb3VuZGVkCistLWRkcXVhMTAzNSBxdWFudGl6ZSA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0IDFFKzM4MCAgIC0+IDguNjY2NjY2NjY2NjY2MDAwRSszODQgUm91bmRlZAorCistLSBJbnQgYW5kIHVJbnQzMiBlZGdlIHZhbHVlcyBmb3IgdGVzdGluZyBjb252ZXJzaW9ucworZGRxdWExMDQwIHF1YW50aXplIC0yMTQ3NDgzNjQ2ICAgICAwIC0+IC0yMTQ3NDgzNjQ2CitkZHF1YTEwNDEgcXVhbnRpemUgLTIxNDc0ODM2NDcgICAgIDAgLT4gLTIxNDc0ODM2NDcKK2RkcXVhMTA0MiBxdWFudGl6ZSAtMjE0NzQ4MzY0OCAgICAgMCAtPiAtMjE0NzQ4MzY0OAorZGRxdWExMDQzIHF1YW50aXplIC0yMTQ3NDgzNjQ5ICAgICAwIC0+IC0yMTQ3NDgzNjQ5CitkZHF1YTEwNDQgcXVhbnRpemUgIDIxNDc0ODM2NDYgICAgIDAgLT4gIDIxNDc0ODM2NDYKK2RkcXVhMTA0NSBxdWFudGl6ZSAgMjE0NzQ4MzY0NyAgICAgMCAtPiAgMjE0NzQ4MzY0NworZGRxdWExMDQ2IHF1YW50aXplICAyMTQ3NDgzNjQ4ICAgICAwIC0+ICAyMTQ3NDgzNjQ4CitkZHF1YTEwNDcgcXVhbnRpemUgIDIxNDc0ODM2NDkgICAgIDAgLT4gIDIxNDc0ODM2NDkKK2RkcXVhMTA0OCBxdWFudGl6ZSAgNDI5NDk2NzI5NCAgICAgMCAtPiAgNDI5NDk2NzI5NAorZGRxdWExMDQ5IHF1YW50aXplICA0Mjk0OTY3Mjk1ICAgICAwIC0+ICA0Mjk0OTY3Mjk1CitkZHF1YTEwNTAgcXVhbnRpemUgIDQyOTQ5NjcyOTYgICAgIDAgLT4gIDQyOTQ5NjcyOTYKK2RkcXVhMTA1MSBxdWFudGl6ZSAgNDI5NDk2NzI5NyAgICAgMCAtPiAgNDI5NDk2NzI5NworCistLSBSb3VuZGluZyBzd2F0aGUKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RkcXVhMTEwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RkcXVhMTEwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMTAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTExMDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTEwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMTA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTExMDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTEwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMTA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTExMDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2RkcXVhMTIwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RkcXVhMTIwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMjAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEyMDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTIwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMjA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEyMDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTIwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMjA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEyMDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorZGRxdWExMzAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZGRxdWExMzAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzMDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMzA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzMDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZGRxdWExMzA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTEzMDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTMwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogdXAKK2RkcXVhMTQwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RkcXVhMTQwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE0MDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTQwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE0MDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTQwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNDA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE0MDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTQxMSBxdWFudGl6ZSAtMS4yMzk5ICAgIDEuMDAgICAgLT4gLTEuMjQgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZGRxdWExNTAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZGRxdWExNTAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1MDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTUwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1MDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTUwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE1MDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTUwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNTExIHF1YW50aXplIC0xLjIzOTkgICAgMS4wMCAgICAtPiAtMS4yMyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCitkZHF1YTE2MDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkZHF1YTE2MDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTYwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2MDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTYwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2MDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTYwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNjA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE2MTEgcXVhbnRpemUgLTEuMjM5OSAgICAxLjAwICAgIC0+IC0xLjIzICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGZsb29yCitkZHF1YTE3MDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkZHF1YTE3MDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTcwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTcwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTcwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZGRxdWExNzA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE3MTEgcXVhbnRpemUgLTEuMjM5OSAgICAxLjAwICAgIC0+IC0xLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IDA1dXAKK2RkcXVhMTgwMCBxdWFudGl6ZSAgMS4yMDAwICAgIDEuMDAgICAgLT4gIDEuMjAgIFJvdW5kZWQKK2RkcXVhMTgwMSBxdWFudGl6ZSAgMS4yMDAxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExODAyIHF1YW50aXplICAxLjIwMTAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE4MDMgcXVhbnRpemUgIDEuMjA1MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTgwNCBxdWFudGl6ZSAgMS4yMDUxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExODA3IHF1YW50aXplICAxLjIwNjAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE4MDggcXVhbnRpemUgIDEuMjA3MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTgwOSBxdWFudGl6ZSAgMS4yMDk5ICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExODExIHF1YW50aXplIC0xLjIwOTkgICAgMS4wMCAgICAtPiAtMS4yMSAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMTkwMCBxdWFudGl6ZSAgMS4yMTAwICAgIDEuMDAgICAgLT4gIDEuMjEgIFJvdW5kZWQKK2RkcXVhMTkwMSBxdWFudGl6ZSAgMS4yMTAxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExOTAyIHF1YW50aXplICAxLjIxMTAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE5MDMgcXVhbnRpemUgIDEuMjE1MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTkwNCBxdWFudGl6ZSAgMS4yMTUxICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExOTA3IHF1YW50aXplICAxLjIxNjAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTE5MDggcXVhbnRpemUgIDEuMjE3MCAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMTkwOSBxdWFudGl6ZSAgMS4yMTk5ICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZGRxdWExOTExIHF1YW50aXplIC0xLjIxOTkgICAgMS4wMCAgICAtPiAtMS4yMSAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMjAwMCBxdWFudGl6ZSAgMS4yNDAwICAgIDEuMDAgICAgLT4gIDEuMjQgIFJvdW5kZWQKK2RkcXVhMjAwMSBxdWFudGl6ZSAgMS4yNDAxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDAyIHF1YW50aXplICAxLjI0MTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwMDMgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjAwNCBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDA3IHF1YW50aXplICAxLjI0NjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIwMDggcXVhbnRpemUgIDEuMjQ3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjAwOSBxdWFudGl6ZSAgMS4yNDk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMDExIHF1YW50aXplIC0xLjI0OTkgICAgMS4wMCAgICAtPiAtMS4yNCAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMjEwMCBxdWFudGl6ZSAgMS4yNTAwICAgIDEuMDAgICAgLT4gIDEuMjUgIFJvdW5kZWQKK2RkcXVhMjEwMSBxdWFudGl6ZSAgMS4yNTAxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMTAyIHF1YW50aXplICAxLjI1MTAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIxMDMgcXVhbnRpemUgIDEuMjU1MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjEwNCBxdWFudGl6ZSAgMS4yNTUxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMTA3IHF1YW50aXplICAxLjI1NjAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIxMDggcXVhbnRpemUgIDEuMjU3MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjEwOSBxdWFudGl6ZSAgMS4yNTk5ICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMTExIHF1YW50aXplIC0xLjI1OTkgICAgMS4wMCAgICAtPiAtMS4yNiAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMjIwMCBxdWFudGl6ZSAgMS4yNjAwICAgIDEuMDAgICAgLT4gIDEuMjYgIFJvdW5kZWQKK2RkcXVhMjIwMSBxdWFudGl6ZSAgMS4yNjAxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjAyIHF1YW50aXplICAxLjI2MTAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyMDMgcXVhbnRpemUgIDEuMjY1MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjIwNCBxdWFudGl6ZSAgMS4yNjUxICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjA3IHF1YW50aXplICAxLjI2NjAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIyMDggcXVhbnRpemUgIDEuMjY3MCAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjIwOSBxdWFudGl6ZSAgMS4yNjk5ICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMjExIHF1YW50aXplIC0xLjI2OTkgICAgMS4wMCAgICAtPiAtMS4yNiAgSW5leGFjdCBSb3VuZGVkCisKK2RkcXVhMjMwMCBxdWFudGl6ZSAgMS4yOTAwICAgIDEuMDAgICAgLT4gIDEuMjkgIFJvdW5kZWQKK2RkcXVhMjMwMSBxdWFudGl6ZSAgMS4yOTAxICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzAyIHF1YW50aXplICAxLjI5MTAgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMDMgcXVhbnRpemUgIDEuMjk1MCAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjMwNCBxdWFudGl6ZSAgMS4yOTUxICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzA3IHF1YW50aXplICAxLjI5NjAgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkZHF1YTIzMDggcXVhbnRpemUgIDEuMjk3MCAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RkcXVhMjMwOSBxdWFudGl6ZSAgMS4yOTk5ICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZGRxdWEyMzExIHF1YW50aXplIC0xLjI5OTkgICAgMS4wMCAgICAtPiAtMS4yOSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIE51bGwgdGVzdHMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RkcXVhOTk4IHF1YW50aXplIDEwICAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHF1YTk5OSBxdWFudGl6ZSAgIyAxZTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJlZHVjZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJlZHVjZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjllNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUmVkdWNlLmRlY1Rlc3QKQEAgLTAsMCArMSwxODIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRSZWR1Y2UuZGVjVGVzdCAtLSByZW1vdmUgdHJhaWxpbmcgemVyb3MgZnJvbSBhIGRlY0RvdWJsZSAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMywgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZGRyZWQwMDEgcmVkdWNlICcxJyAgICAgIC0+ICcxJworZGRyZWQwMDIgcmVkdWNlICctMScgICAgIC0+ICctMScKK2RkcmVkMDAzIHJlZHVjZSAnMS4wMCcgICAtPiAnMScKK2RkcmVkMDA0IHJlZHVjZSAnLTEuMDAnICAtPiAnLTEnCitkZHJlZDAwNSByZWR1Y2UgJzAnICAgICAgLT4gJzAnCitkZHJlZDAwNiByZWR1Y2UgJzAuMDAnICAgLT4gJzAnCitkZHJlZDAwNyByZWR1Y2UgJzAwLjAnICAgLT4gJzAnCitkZHJlZDAwOCByZWR1Y2UgJzAwLjAwJyAgLT4gJzAnCitkZHJlZDAwOSByZWR1Y2UgJzAwJyAgICAgLT4gJzAnCitkZHJlZDAxMCByZWR1Y2UgJzBFKzEnICAgLT4gJzAnCitkZHJlZDAxMSByZWR1Y2UgJzBFKzUnICAgLT4gJzAnCisKK2RkcmVkMDEyIHJlZHVjZSAnLTInICAgICAtPiAnLTInCitkZHJlZDAxMyByZWR1Y2UgJzInICAgICAgLT4gJzInCitkZHJlZDAxNCByZWR1Y2UgJy0yLjAwJyAgLT4gJy0yJworZGRyZWQwMTUgcmVkdWNlICcyLjAwJyAgIC0+ICcyJworZGRyZWQwMTYgcmVkdWNlICctMCcgICAgIC0+ICctMCcKK2RkcmVkMDE3IHJlZHVjZSAnLTAuMDAnICAtPiAnLTAnCitkZHJlZDAxOCByZWR1Y2UgJy0wMC4wJyAgLT4gJy0wJworZGRyZWQwMTkgcmVkdWNlICctMDAuMDAnIC0+ICctMCcKK2RkcmVkMDIwIHJlZHVjZSAnLTAwJyAgICAtPiAnLTAnCitkZHJlZDAyMSByZWR1Y2UgJy0wRSs1JyAgIC0+ICctMCcKK2RkcmVkMDIyIHJlZHVjZSAnLTBFKzEnICAtPiAnLTAnCisKK2RkcmVkMDMwIHJlZHVjZSAnKzAuMScgICAgICAgICAgICAtPiAnMC4xJworZGRyZWQwMzEgcmVkdWNlICctMC4xJyAgICAgICAgICAgIC0+ICctMC4xJworZGRyZWQwMzIgcmVkdWNlICcrMC4wMScgICAgICAgICAgIC0+ICcwLjAxJworZGRyZWQwMzMgcmVkdWNlICctMC4wMScgICAgICAgICAgIC0+ICctMC4wMScKK2RkcmVkMDM0IHJlZHVjZSAnKzAuMDAxJyAgICAgICAgICAtPiAnMC4wMDEnCitkZHJlZDAzNSByZWR1Y2UgJy0wLjAwMScgICAgICAgICAgLT4gJy0wLjAwMScKK2RkcmVkMDM2IHJlZHVjZSAnKzAuMDAwMDAxJyAgICAgICAtPiAnMC4wMDAwMDEnCitkZHJlZDAzNyByZWR1Y2UgJy0wLjAwMDAwMScgICAgICAgLT4gJy0wLjAwMDAwMScKK2RkcmVkMDM4IHJlZHVjZSAnKzAuMDAwMDAwMDAwMDAxJyAtPiAnMUUtMTInCitkZHJlZDAzOSByZWR1Y2UgJy0wLjAwMDAwMDAwMDAwMScgLT4gJy0xRS0xMicKKworZGRyZWQwNDEgcmVkdWNlIDEuMSAgICAgICAgLT4gMS4xCitkZHJlZDA0MiByZWR1Y2UgMS4xMCAgICAgICAtPiAxLjEKK2RkcmVkMDQzIHJlZHVjZSAxLjEwMCAgICAgIC0+IDEuMQorZGRyZWQwNDQgcmVkdWNlIDEuMTEwICAgICAgLT4gMS4xMQorZGRyZWQwNDUgcmVkdWNlIC0xLjEgICAgICAgLT4gLTEuMQorZGRyZWQwNDYgcmVkdWNlIC0xLjEwICAgICAgLT4gLTEuMQorZGRyZWQwNDcgcmVkdWNlIC0xLjEwMCAgICAgLT4gLTEuMQorZGRyZWQwNDggcmVkdWNlIC0xLjExMCAgICAgLT4gLTEuMTEKK2RkcmVkMDQ5IHJlZHVjZSA5LjkgICAgICAgIC0+IDkuOQorZGRyZWQwNTAgcmVkdWNlIDkuOTAgICAgICAgLT4gOS45CitkZHJlZDA1MSByZWR1Y2UgOS45MDAgICAgICAtPiA5LjkKK2RkcmVkMDUyIHJlZHVjZSA5Ljk5MCAgICAgIC0+IDkuOTkKK2RkcmVkMDUzIHJlZHVjZSAtOS45ICAgICAgIC0+IC05LjkKK2RkcmVkMDU0IHJlZHVjZSAtOS45MCAgICAgIC0+IC05LjkKK2RkcmVkMDU1IHJlZHVjZSAtOS45MDAgICAgIC0+IC05LjkKK2RkcmVkMDU2IHJlZHVjZSAtOS45OTAgICAgIC0+IC05Ljk5CisKKy0tIHNvbWUgdHJhaWxpbmcgZnJhY3Rpb25hbCB6ZXJvcyB3aXRoIHplcm9zIGluIHVuaXRzCitkZHJlZDA2MCByZWR1Y2UgIDEwLjAgICAgICAgIC0+IDFFKzEKK2RkcmVkMDYxIHJlZHVjZSAgMTAuMDAgICAgICAgLT4gMUUrMQorZGRyZWQwNjIgcmVkdWNlICAxMDAuMCAgICAgICAtPiAxRSsyCitkZHJlZDA2MyByZWR1Y2UgIDEwMC4wMCAgICAgIC0+IDFFKzIKK2RkcmVkMDY0IHJlZHVjZSAgMS4xMDAwRSszICAgLT4gMS4xRSszCitkZHJlZDA2NSByZWR1Y2UgIDEuMTAwMDBFKzMgIC0+IDEuMUUrMworZGRyZWQwNjYgcmVkdWNlIC0xMC4wICAgICAgICAtPiAtMUUrMQorZGRyZWQwNjcgcmVkdWNlIC0xMC4wMCAgICAgICAtPiAtMUUrMQorZGRyZWQwNjggcmVkdWNlIC0xMDAuMCAgICAgICAtPiAtMUUrMgorZGRyZWQwNjkgcmVkdWNlIC0xMDAuMDAgICAgICAtPiAtMUUrMgorZGRyZWQwNzAgcmVkdWNlIC0xLjEwMDBFKzMgICAtPiAtMS4xRSszCitkZHJlZDA3MSByZWR1Y2UgLTEuMTAwMDBFKzMgIC0+IC0xLjFFKzMKKworLS0gc29tZSBpbnNpZ25pZmljYW50IHRyYWlsaW5nIHplcm9zIHdpdGggcG9zaXRpdmUgZXhwb25lbnQKK2RkcmVkMDgwIHJlZHVjZSAgMTBFKzEgICAgICAgLT4gMUUrMgorZGRyZWQwODEgcmVkdWNlICAxMDBFKzEgICAgICAtPiAxRSszCitkZHJlZDA4MiByZWR1Y2UgIDEuMEUrMiAgICAgIC0+IDFFKzIKK2RkcmVkMDgzIHJlZHVjZSAgMS4wRSszICAgICAgLT4gMUUrMworZGRyZWQwODQgcmVkdWNlICAxLjFFKzMgICAgICAtPiAxLjFFKzMKK2RkcmVkMDg1IHJlZHVjZSAgMS4wMEUrMyAgICAgLT4gMUUrMworZGRyZWQwODYgcmVkdWNlICAxLjEwRSszICAgICAtPiAxLjFFKzMKK2RkcmVkMDg3IHJlZHVjZSAtMTBFKzEgICAgICAgLT4gLTFFKzIKK2RkcmVkMDg4IHJlZHVjZSAtMTAwRSsxICAgICAgLT4gLTFFKzMKK2RkcmVkMDg5IHJlZHVjZSAtMS4wRSsyICAgICAgLT4gLTFFKzIKK2RkcmVkMDkwIHJlZHVjZSAtMS4wRSszICAgICAgLT4gLTFFKzMKK2RkcmVkMDkxIHJlZHVjZSAtMS4xRSszICAgICAgLT4gLTEuMUUrMworZGRyZWQwOTIgcmVkdWNlIC0xLjAwRSszICAgICAtPiAtMUUrMworZGRyZWQwOTMgcmVkdWNlIC0xLjEwRSszICAgICAtPiAtMS4xRSszCisKKy0tIHNvbWUgc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MsIHdlcmUgd2UgdG8gYmUgdHJpbW1pbmcKK2RkcmVkMTAwIHJlZHVjZSAgMTEgICAgICAgICAgLT4gMTEKK2RkcmVkMTAxIHJlZHVjZSAgMTAgICAgICAgICAgLT4gMUUrMQorZGRyZWQxMDIgcmVkdWNlICAxMC4gICAgICAgICAtPiAxRSsxCitkZHJlZDEwMyByZWR1Y2UgIDEuMUUrMSAgICAgIC0+IDExCitkZHJlZDEwNCByZWR1Y2UgIDEuMEUrMSAgICAgIC0+IDFFKzEKK2RkcmVkMTA1IHJlZHVjZSAgMS4xMEUrMiAgICAgLT4gMS4xRSsyCitkZHJlZDEwNiByZWR1Y2UgIDEuMDBFKzIgICAgIC0+IDFFKzIKK2RkcmVkMTA3IHJlZHVjZSAgMS4xMDBFKzMgICAgLT4gMS4xRSszCitkZHJlZDEwOCByZWR1Y2UgIDEuMDAwRSszICAgIC0+IDFFKzMKK2RkcmVkMTA5IHJlZHVjZSAgMS4wMDAwMDBFKzYgLT4gMUUrNgorZGRyZWQxMTAgcmVkdWNlIC0xMSAgICAgICAgICAtPiAtMTEKK2RkcmVkMTExIHJlZHVjZSAtMTAgICAgICAgICAgLT4gLTFFKzEKK2RkcmVkMTEyIHJlZHVjZSAtMTAuICAgICAgICAgLT4gLTFFKzEKK2RkcmVkMTEzIHJlZHVjZSAtMS4xRSsxICAgICAgLT4gLTExCitkZHJlZDExNCByZWR1Y2UgLTEuMEUrMSAgICAgIC0+IC0xRSsxCitkZHJlZDExNSByZWR1Y2UgLTEuMTBFKzIgICAgIC0+IC0xLjFFKzIKK2RkcmVkMTE2IHJlZHVjZSAtMS4wMEUrMiAgICAgLT4gLTFFKzIKK2RkcmVkMTE3IHJlZHVjZSAtMS4xMDBFKzMgICAgLT4gLTEuMUUrMworZGRyZWQxMTggcmVkdWNlIC0xLjAwMEUrMyAgICAtPiAtMUUrMworZGRyZWQxMTkgcmVkdWNlIC0xLjAwMDAwRSs1ICAtPiAtMUUrNQorZGRyZWQxMjAgcmVkdWNlIC0xLjAwMDAwMEUrNiAtPiAtMUUrNgorZGRyZWQxMjEgcmVkdWNlIC0xMC4wMDAwMEUrNiAtPiAtMUUrNworZGRyZWQxMjIgcmVkdWNlIC0xMDAuMDAwMEUrNiAtPiAtMUUrOAorZGRyZWQxMjMgcmVkdWNlIC0xMDAwLjAwMEUrNiAtPiAtMUUrOQorZGRyZWQxMjQgcmVkdWNlIC0xMDAwMC4wMEUrNiAtPiAtMUUrMTAKK2RkcmVkMTI1IHJlZHVjZSAtMTAwMDAwLjBFKzYgLT4gLTFFKzExCitkZHJlZDEyNiByZWR1Y2UgLTEwMDAwMDAuRSs2IC0+IC0xRSsxMgorCistLSBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCitkZHJlZDE0MCByZWR1Y2UgJzIuMScgICAgIC0+ICAnMi4xJworZGRyZWQxNDEgcmVkdWNlICctMi4wJyAgICAtPiAgJy0yJworZGRyZWQxNDIgcmVkdWNlICcxLjIwMCcgICAtPiAgJzEuMicKK2RkcmVkMTQzIHJlZHVjZSAnLTEyMCcgICAgLT4gICctMS4yRSsyJworZGRyZWQxNDQgcmVkdWNlICcxMjAuMDAnICAtPiAgJzEuMkUrMicKK2RkcmVkMTQ1IHJlZHVjZSAnMC4wMCcgICAgLT4gICcwJworCistLSBObWF4LCBObWluLCBOdGlueQorLS0gbm90ZSBvcmlnYW1pIGVmZmVjdCBvbiBzb21lIG9mIHRoZXNlCitkZHJlZDE1MSByZWR1Y2UgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZHJlZDE1MiByZWR1Y2UgIDkuOTk5OTk5MDAwMDAwMDAwRSszODAgICAtPiA5Ljk5OTk5OTAwMDAwRSszODAKK2RkcmVkMTUzIHJlZHVjZSAgOS45OTk5OTk5OTk5OTAwMDBFKzM4NCAgIC0+IDkuOTk5OTk5OTk5OTkwMDAwRSszODQKK2RkcmVkMTU0IHJlZHVjZSAgMUUtMzgzICAgICAgICAgICAgICAgICAgIC0+IDFFLTM4MworZGRyZWQxNTUgcmVkdWNlICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLT4gMUUtMzgzCitkZHJlZDE1NiByZWR1Y2UgIDIuMDAwRS0zOTUgICAgICAgICAgICAgICAtPiAyRS0zOTUgICBTdWJub3JtYWwKK2RkcmVkMTU3IHJlZHVjZSAgMUUtMzk4ICAgICAgICAgICAgICAgICAgIC0+IDFFLTM5OCAgIFN1Ym5vcm1hbAorCitkZHJlZDE2MSByZWR1Y2UgIC0xRS0zOTggICAgICAgICAgICAgICAgICAtPiAtMUUtMzk4ICBTdWJub3JtYWwKK2RkcmVkMTYyIHJlZHVjZSAgLTIuMDAwRS0zOTUgICAgICAgICAgICAgIC0+IC0yRS0zOTUgIFN1Ym5vcm1hbAorZGRyZWQxNjMgcmVkdWNlICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gLTFFLTM4MworZGRyZWQxNjQgcmVkdWNlICAtMUUtMzgzICAgICAgICAgICAgICAgICAgLT4gLTFFLTM4MworZGRyZWQxNjUgcmVkdWNlICAtOS45OTk5OTkwMDAwMDAwMDBFKzM4MCAgLT4gLTkuOTk5OTk5MDAwMDBFKzM4MAorZGRyZWQxNjYgcmVkdWNlICAtOS45OTk5OTk5OTk5OTAwMDBFKzM4NCAgLT4gLTkuOTk5OTk5OTk5OTkwMDAwRSszODQKK2RkcmVkMTY3IHJlZHVjZSAgLTkuOTk5OTk5OTk5OTk5OTkwRSszODQgIC0+IC05Ljk5OTk5OTk5OTk5OTk5MEUrMzg0CitkZHJlZDE2OCByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyZWQxNjkgcmVkdWNlICAtOS45OTk5OTk5OTk5OTk5OTBFKzM4NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTkwRSszODQKKworCistLSBzcGVjaWFscyAocmVkdWNlIGRvZXMgbm90IGFmZmVjdCBwYXlsb2FkKQorZGRyZWQ4MjAgcmVkdWNlICdJbmYnICAgIC0+ICdJbmZpbml0eScKK2RkcmVkODIxIHJlZHVjZSAnLUluZicgICAtPiAnLUluZmluaXR5JworZGRyZWQ4MjIgcmVkdWNlICAgTmFOICAgIC0+ICBOYU4KK2RkcmVkODIzIHJlZHVjZSAgc05hTiAgICAtPiAgTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCitkZHJlZDgyNCByZWR1Y2UgICBOYU4xMDEgLT4gIE5hTjEwMQorZGRyZWQ4MjUgcmVkdWNlICBzTmFOMDEwIC0+ICBOYU4xMCAgSW52YWxpZF9vcGVyYXRpb24KK2RkcmVkODI3IHJlZHVjZSAgLU5hTiAgICAtPiAtTmFOCitkZHJlZDgyOCByZWR1Y2UgLXNOYU4gICAgLT4gLU5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZWQ4MjkgcmVkdWNlICAtTmFOMTAxIC0+IC1OYU4xMDEKK2RkcmVkODMwIHJlZHVjZSAtc05hTjAxMCAtPiAtTmFOMTAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdAorZGRyZWQ5MDAgcmVkdWNlICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJlbWFpbmRlci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJlbWFpbmRlci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDg2ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUmVtYWluZGVyLmRlY1Rlc3QKQEAgLTAsMCArMSw2MDAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRSZW1haW5kZXIuZGVjVGVzdCAtLSBkZWNEb3VibGUgcmVtYWluZGVyICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcyAoYXMgYmFzZSwgYWJvdmUpCitkZHJlbTAwMSByZW1haW5kZXIgIDEgICAgIDEgICAgLT4gIDAKK2RkcmVtMDAyIHJlbWFpbmRlciAgMiAgICAgMSAgICAtPiAgMAorZGRyZW0wMDMgcmVtYWluZGVyICAxICAgICAyICAgIC0+ICAxCitkZHJlbTAwNCByZW1haW5kZXIgIDIgICAgIDIgICAgLT4gIDAKK2RkcmVtMDA1IHJlbWFpbmRlciAgMCAgICAgMSAgICAtPiAgMAorZGRyZW0wMDYgcmVtYWluZGVyICAwICAgICAyICAgIC0+ICAwCitkZHJlbTAwNyByZW1haW5kZXIgIDEgICAgIDMgICAgLT4gIDEKK2RkcmVtMDA4IHJlbWFpbmRlciAgMiAgICAgMyAgICAtPiAgMgorZGRyZW0wMDkgcmVtYWluZGVyICAzICAgICAzICAgIC0+ICAwCisKK2RkcmVtMDEwIHJlbWFpbmRlciAgMi40ICAgMSAgICAtPiAgMC40CitkZHJlbTAxMSByZW1haW5kZXIgIDIuNCAgIC0xICAgLT4gIDAuNAorZGRyZW0wMTIgcmVtYWluZGVyICAtMi40ICAxICAgIC0+ICAtMC40CitkZHJlbTAxMyByZW1haW5kZXIgIC0yLjQgIC0xICAgLT4gIC0wLjQKK2RkcmVtMDE0IHJlbWFpbmRlciAgMi40MCAgMSAgICAtPiAgMC40MAorZGRyZW0wMTUgcmVtYWluZGVyICAyLjQwMCAxICAgIC0+ICAwLjQwMAorZGRyZW0wMTYgcmVtYWluZGVyICAyLjQgICAyICAgIC0+ICAwLjQKK2RkcmVtMDE3IHJlbWFpbmRlciAgMi40MDAgMiAgICAtPiAgMC40MDAKK2RkcmVtMDE4IHJlbWFpbmRlciAgMi4gICAgMiAgICAtPiAgMAorZGRyZW0wMTkgcmVtYWluZGVyICAyMCAgICAyMCAgIC0+ICAwCisKK2RkcmVtMDIwIHJlbWFpbmRlciAgMTg3ICAgMTg3ICAgIC0+ICAwCitkZHJlbTAyMSByZW1haW5kZXIgIDUgICAgIDIgICAgICAtPiAgMQorZGRyZW0wMjIgcmVtYWluZGVyICA1ICAgICAyLjAgICAgLT4gIDEuMAorZGRyZW0wMjMgcmVtYWluZGVyICA1ICAgICAyLjAwMCAgLT4gIDEuMDAwCitkZHJlbTAyNCByZW1haW5kZXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKK2RkcmVtMDI1IHJlbWFpbmRlciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorCitkZHJlbTAzMCByZW1haW5kZXIgIDEgICAgIDIgICAgICAtPiAgMQorZGRyZW0wMzEgcmVtYWluZGVyICAxICAgICA0ICAgICAgLT4gIDEKK2RkcmVtMDMyIHJlbWFpbmRlciAgMSAgICAgOCAgICAgIC0+ICAxCisKK2RkcmVtMDMzIHJlbWFpbmRlciAgMSAgICAgMTYgICAgIC0+ICAxCitkZHJlbTAzNCByZW1haW5kZXIgIDEgICAgIDMyICAgICAtPiAgMQorZGRyZW0wMzUgcmVtYWluZGVyICAxICAgICA2NCAgICAgLT4gIDEKK2RkcmVtMDQwIHJlbWFpbmRlciAgMSAgICAtMiAgICAgIC0+ICAxCitkZHJlbTA0MSByZW1haW5kZXIgIDEgICAgLTQgICAgICAtPiAgMQorZGRyZW0wNDIgcmVtYWluZGVyICAxICAgIC04ICAgICAgLT4gIDEKK2RkcmVtMDQzIHJlbWFpbmRlciAgMSAgICAtMTYgICAgIC0+ICAxCitkZHJlbTA0NCByZW1haW5kZXIgIDEgICAgLTMyICAgICAtPiAgMQorZGRyZW0wNDUgcmVtYWluZGVyICAxICAgIC02NCAgICAgLT4gIDEKK2RkcmVtMDUwIHJlbWFpbmRlciAtMSAgICAgMiAgICAgIC0+ICAtMQorZGRyZW0wNTEgcmVtYWluZGVyIC0xICAgICA0ICAgICAgLT4gIC0xCitkZHJlbTA1MiByZW1haW5kZXIgLTEgICAgIDggICAgICAtPiAgLTEKK2RkcmVtMDUzIHJlbWFpbmRlciAtMSAgICAgMTYgICAgIC0+ICAtMQorZGRyZW0wNTQgcmVtYWluZGVyIC0xICAgICAzMiAgICAgLT4gIC0xCitkZHJlbTA1NSByZW1haW5kZXIgLTEgICAgIDY0ICAgICAtPiAgLTEKK2RkcmVtMDYwIHJlbWFpbmRlciAtMSAgICAtMiAgICAgIC0+ICAtMQorZGRyZW0wNjEgcmVtYWluZGVyIC0xICAgIC00ICAgICAgLT4gIC0xCitkZHJlbTA2MiByZW1haW5kZXIgLTEgICAgLTggICAgICAtPiAgLTEKK2RkcmVtMDYzIHJlbWFpbmRlciAtMSAgICAtMTYgICAgIC0+ICAtMQorZGRyZW0wNjQgcmVtYWluZGVyIC0xICAgIC0zMiAgICAgLT4gIC0xCitkZHJlbTA2NSByZW1haW5kZXIgLTEgICAgLTY0ICAgICAtPiAgLTEKKworZGRyZW0wNjYgcmVtYWluZGVyICA5OTk5OTk5OTkgICAgIDEgIC0+IDAKK2RkcmVtMDY3IHJlbWFpbmRlciAgOTk5OTk5OTk5LjQgICAxICAtPiAwLjQKK2RkcmVtMDY4IHJlbWFpbmRlciAgOTk5OTk5OTk5LjUgICAxICAtPiAwLjUKK2RkcmVtMDY5IHJlbWFpbmRlciAgOTk5OTk5OTk5LjkgICAxICAtPiAwLjkKK2RkcmVtMDcwIHJlbWFpbmRlciAgOTk5OTk5OTk5Ljk5OSAxICAtPiAwLjk5OQorZGRyZW0wNzEgcmVtYWluZGVyICA5OTk5OTkuOTk5OTk5IDEgIC0+IDAuOTk5OTk5CitkZHJlbTA3MiByZW1haW5kZXIgIDkgICAgICAgICAgICAgMSAgLT4gMAorZGRyZW0wNzMgcmVtYWluZGVyICA5OTk5OTk5OTk5OTk5OTk5IDEgIC0+IDAKK2RkcmVtMDc0IHJlbWFpbmRlciAgOTk5OTk5OTk5OTk5OTk5OSAyICAtPiAxCitkZHJlbTA3NSByZW1haW5kZXIgIDk5OTk5OTk5OTk5OTk5OTkgMyAgLT4gMAorZGRyZW0wNzYgcmVtYWluZGVyICA5OTk5OTk5OTk5OTk5OTk5IDQgIC0+IDMKKworZGRyZW0wODAgcmVtYWluZGVyICAwLiAgICAgICAgICAgIDEgIC0+IDAKK2RkcmVtMDgxIHJlbWFpbmRlciAgLjAgICAgICAgICAgICAxICAtPiAwLjAKK2RkcmVtMDgyIHJlbWFpbmRlciAgMC4wMCAgICAgICAgICAxICAtPiAwLjAwCitkZHJlbTA4MyByZW1haW5kZXIgIDAuMDBFKzkgICAgICAgMSAgLT4gMAorZGRyZW0wODQgcmVtYWluZGVyICAwLjAwRSszICAgICAgIDEgIC0+IDAKK2RkcmVtMDg1IHJlbWFpbmRlciAgMC4wMEUrMiAgICAgICAxICAtPiAwCitkZHJlbTA4NiByZW1haW5kZXIgIDAuMDBFKzEgICAgICAgMSAgLT4gMC4wCitkZHJlbTA4NyByZW1haW5kZXIgIDAuMDBFKzAgICAgICAgMSAgLT4gMC4wMAorZGRyZW0wODggcmVtYWluZGVyICAwLjAwRS0wICAgICAgIDEgIC0+IDAuMDAKK2RkcmVtMDg5IHJlbWFpbmRlciAgMC4wMEUtMSAgICAgICAxICAtPiAwLjAwMAorZGRyZW0wOTAgcmVtYWluZGVyICAwLjAwRS0yICAgICAgIDEgIC0+IDAuMDAwMAorZGRyZW0wOTEgcmVtYWluZGVyICAwLjAwRS0zICAgICAgIDEgIC0+IDAuMDAwMDAKK2RkcmVtMDkyIHJlbWFpbmRlciAgMC4wMEUtNCAgICAgICAxICAtPiAwLjAwMDAwMAorZGRyZW0wOTMgcmVtYWluZGVyICAwLjAwRS01ICAgICAgIDEgIC0+IDBFLTcKK2RkcmVtMDk0IHJlbWFpbmRlciAgMC4wMEUtNiAgICAgICAxICAtPiAwRS04CitkZHJlbTA5NSByZW1haW5kZXIgIDAuMDAwMEUtNTAgICAgMSAgLT4gMEUtNTQKKworLS0gVmFyaW91cyBmbGF2b3VycyBvZiByZW1haW5kZXIgYnkgMAorZGRyZW0xMDEgcmVtYWluZGVyICAwICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJlbTEwMiByZW1haW5kZXIgIDAgICAgICAtMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkcmVtMTAzIHJlbWFpbmRlciAtMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRyZW0xMDQgcmVtYWluZGVyIC0wICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJlbTEwNSByZW1haW5kZXIgIDAuMEU1ICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkcmVtMTA2IHJlbWFpbmRlciAgMC4wMDAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorLS0gW1NvbWUgdGhpbmsgdGhpcyBuZXh0IGdyb3VwIHNob3VsZCBiZSBEaXZpc2lvbl9ieV96ZXJvIGV4Y2VwdGlvbiwgYnV0CistLSBJRUVFIDg1NCBpcyBleHBsaWNpdCB0aGF0IGl0IGlzIEludmFsaWQgb3BlcmF0aW9uIC4uIGZvcgorLS0gcmVtYWluZGVyLW5lYXIsIGFueXdheV0KK2RkcmVtMTA3IHJlbWFpbmRlciAgMC4wMDAxICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTEwOCByZW1haW5kZXIgIDAuMDEgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMDkgcmVtYWluZGVyICAwLjEgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTEwIHJlbWFpbmRlciAgMSAgICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTExMSByZW1haW5kZXIgIDEgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMTIgcmVtYWluZGVyIDEwICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTEzIHJlbWFpbmRlciAxRSsxMDAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTExNCByZW1haW5kZXIgMUUrMzgwICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMTUgcmVtYWluZGVyICAwLjAwMDEgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTE2IHJlbWFpbmRlciAgMC4wMSAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTExOSByZW1haW5kZXIgIDAuMSAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMjAgcmVtYWluZGVyICAxICAgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTIxIHJlbWFpbmRlciAgMSAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTEyMiByZW1haW5kZXIgMTAgICAgICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMjMgcmVtYWluZGVyIDFFKzEwMCAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtMTI0IHJlbWFpbmRlciAxRSszODQgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhbmQgemVyb3Mgb24gbGVmdAorZGRyZW0xMzAgcmVtYWluZGVyICAwICAgICAgMSAgIC0+ICAwCitkZHJlbTEzMSByZW1haW5kZXIgIDAgICAgIC0xICAgLT4gIDAKK2RkcmVtMTMyIHJlbWFpbmRlciAgMC4wICAgIDEgICAtPiAgMC4wCitkZHJlbTEzMyByZW1haW5kZXIgIDAuMCAgIC0xICAgLT4gIDAuMAorZGRyZW0xMzQgcmVtYWluZGVyIC0wICAgICAgMSAgIC0+IC0wCitkZHJlbTEzNSByZW1haW5kZXIgLTAgICAgIC0xICAgLT4gLTAKK2RkcmVtMTM2IHJlbWFpbmRlciAtMC4wICAgIDEgICAtPiAtMC4wCitkZHJlbTEzNyByZW1haW5kZXIgLTAuMCAgIC0xICAgLT4gLTAuMAorCistLSAwLjVlcnMKK2RkcmVtMTQzIHJlbWFpbmRlciAgIDAuNSAgMiAgICAgLT4gIDAuNQorZGRyZW0xNDQgcmVtYWluZGVyICAgMC41ICAyLjEgICAtPiAgMC41CitkZHJlbTE0NSByZW1haW5kZXIgICAwLjUgIDIuMDEgIC0+ICAwLjUwCitkZHJlbTE0NiByZW1haW5kZXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorZGRyZW0xNDcgcmVtYWluZGVyICAgMC41MCAyICAgICAtPiAgMC41MAorZGRyZW0xNDggcmVtYWluZGVyICAgMC41MCAyLjAxICAtPiAgMC41MAorZGRyZW0xNDkgcmVtYWluZGVyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworLS0gc3RlYWRpZXMKK2RkcmVtMTUwIHJlbWFpbmRlciAgMSAgMSAgIC0+IDAKK2RkcmVtMTUxIHJlbWFpbmRlciAgMSAgMiAgIC0+IDEKK2RkcmVtMTUyIHJlbWFpbmRlciAgMSAgMyAgIC0+IDEKK2RkcmVtMTUzIHJlbWFpbmRlciAgMSAgNCAgIC0+IDEKK2RkcmVtMTU0IHJlbWFpbmRlciAgMSAgNSAgIC0+IDEKK2RkcmVtMTU1IHJlbWFpbmRlciAgMSAgNiAgIC0+IDEKK2RkcmVtMTU2IHJlbWFpbmRlciAgMSAgNyAgIC0+IDEKK2RkcmVtMTU3IHJlbWFpbmRlciAgMSAgOCAgIC0+IDEKK2RkcmVtMTU4IHJlbWFpbmRlciAgMSAgOSAgIC0+IDEKK2RkcmVtMTU5IHJlbWFpbmRlciAgMSAgMTAgIC0+IDEKK2RkcmVtMTYwIHJlbWFpbmRlciAgMSAgMSAgIC0+IDAKK2RkcmVtMTYxIHJlbWFpbmRlciAgMiAgMSAgIC0+IDAKK2RkcmVtMTYyIHJlbWFpbmRlciAgMyAgMSAgIC0+IDAKK2RkcmVtMTYzIHJlbWFpbmRlciAgNCAgMSAgIC0+IDAKK2RkcmVtMTY0IHJlbWFpbmRlciAgNSAgMSAgIC0+IDAKK2RkcmVtMTY1IHJlbWFpbmRlciAgNiAgMSAgIC0+IDAKK2RkcmVtMTY2IHJlbWFpbmRlciAgNyAgMSAgIC0+IDAKK2RkcmVtMTY3IHJlbWFpbmRlciAgOCAgMSAgIC0+IDAKK2RkcmVtMTY4IHJlbWFpbmRlciAgOSAgMSAgIC0+IDAKK2RkcmVtMTY5IHJlbWFpbmRlciAgMTAgMSAgIC0+IDAKKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlck5lYXIKK2RkcmVtMTcxIHJlbWFpbmRlciAgIDAuNCAgMS4wMjAgLT4gIDAuNDAwCitkZHJlbTE3MiByZW1haW5kZXIgICAwLjUwIDEuMDIwIC0+ICAwLjUwMAorZGRyZW0xNzMgcmVtYWluZGVyICAgMC41MSAxLjAyMCAtPiAgMC41MTAKK2RkcmVtMTc0IHJlbWFpbmRlciAgIDAuNTIgMS4wMjAgLT4gIDAuNTIwCitkZHJlbTE3NSByZW1haW5kZXIgICAwLjYgIDEuMDIwIC0+ICAwLjYwMAorCistLSBNb3JlIGZsYXZvdXJzIG9mIHJlbWFpbmRlciBieSAwCitkZHJlbTIwMSByZW1haW5kZXIgIDAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRyZW0yMDIgcmVtYWluZGVyICAwLjBFNSAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RkcmVtMjAzIHJlbWFpbmRlciAgMC4wMDAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJlbTIwNCByZW1haW5kZXIgIDAuMDAwMSAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTIwNSByZW1haW5kZXIgIDAuMDEgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTIwNiByZW1haW5kZXIgIDAuMSAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTIwNyByZW1haW5kZXIgIDEgICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTIwOCByZW1haW5kZXIgIDEgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTIwOSByZW1haW5kZXIgMTAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTIxMCByZW1haW5kZXIgMUUrMTAwICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTIxMSByZW1haW5kZXIgMUUrMzgwICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHNvbWUgZGlmZmVyZW5jZXMgZnJvbSByZW1haW5kZXJOZWFyCitkZHJlbTIzMSByZW1haW5kZXIgIC0wLjQgIDEuMDIwIC0+IC0wLjQwMAorZGRyZW0yMzIgcmVtYWluZGVyICAtMC41MCAxLjAyMCAtPiAtMC41MDAKK2RkcmVtMjMzIHJlbWFpbmRlciAgLTAuNTEgMS4wMjAgLT4gLTAuNTEwCitkZHJlbTIzNCByZW1haW5kZXIgIC0wLjUyIDEuMDIwIC0+IC0wLjUyMAorZGRyZW0yMzUgcmVtYWluZGVyICAtMC42ICAxLjAyMCAtPiAtMC42MDAKKworLS0gaGlnaCBYcworZGRyZW0yNDAgcmVtYWluZGVyICAxRSsyICAxLjAwICAtPiAgMC4wMAorCistLSBkZHJlbTN4eCBhcmUgZnJvbSBEaWFnQmlnRGVjaW1hbAorZGRyZW0zMDEgcmVtYWluZGVyICAgMSAgICAzICAgICAtPiAgMQorZGRyZW0zMDIgcmVtYWluZGVyICAgNSAgICA1ICAgICAtPiAgMAorZGRyZW0zMDMgcmVtYWluZGVyICAgMTMgICAxMCAgICAtPiAgMworZGRyZW0zMDQgcmVtYWluZGVyICAgMTMgICA1MCAgICAtPiAgMTMKK2RkcmVtMzA1IHJlbWFpbmRlciAgIDEzICAgMTAwICAgLT4gIDEzCitkZHJlbTMwNiByZW1haW5kZXIgICAxMyAgIDEwMDAgIC0+ICAxMworZGRyZW0zMDcgcmVtYWluZGVyICAgLjEzICAgIDEgICAtPiAgMC4xMworZGRyZW0zMDggcmVtYWluZGVyICAgMC4xMzMgIDEgICAtPiAgMC4xMzMKK2RkcmVtMzA5IHJlbWFpbmRlciAgIDAuMTAzMyAxICAgLT4gIDAuMTAzMworZGRyZW0zMTAgcmVtYWluZGVyICAgMS4wMzMgIDEgICAtPiAgMC4wMzMKK2RkcmVtMzExIHJlbWFpbmRlciAgIDEwLjMzICAxICAgLT4gIDAuMzMKK2RkcmVtMzEyIHJlbWFpbmRlciAgIDEwLjMzIDEwICAgLT4gIDAuMzMKK2RkcmVtMzEzIHJlbWFpbmRlciAgIDEwMy4zICAxICAgLT4gIDAuMworZGRyZW0zMTQgcmVtYWluZGVyICAgMTMzICAgMTAgICAtPiAgMworZGRyZW0zMTUgcmVtYWluZGVyICAgMTAzMyAgMTAgICAtPiAgMworZGRyZW0zMTYgcmVtYWluZGVyICAgMTAzMyAgNTAgICAtPiAgMzMKK2RkcmVtMzE3IHJlbWFpbmRlciAgIDEwMS4wICAzICAgLT4gIDIuMAorZGRyZW0zMTggcmVtYWluZGVyICAgMTAyLjAgIDMgICAtPiAgMC4wCitkZHJlbTMxOSByZW1haW5kZXIgICAxMDMuMCAgMyAgIC0+ICAxLjAKK2RkcmVtMzIwIHJlbWFpbmRlciAgIDIuNDAgICAxICAgLT4gIDAuNDAKK2RkcmVtMzIxIHJlbWFpbmRlciAgIDIuNDAwICAxICAgLT4gIDAuNDAwCitkZHJlbTMyMiByZW1haW5kZXIgICAyLjQgICAgMSAgIC0+ICAwLjQKK2RkcmVtMzIzIHJlbWFpbmRlciAgIDIuNCAgICAyICAgLT4gIDAuNAorZGRyZW0zMjQgcmVtYWluZGVyICAgMi40MDAgIDIgICAtPiAgMC40MDAKK2RkcmVtMzI1IHJlbWFpbmRlciAgIDEgICAwLjMgICAgLT4gIDAuMQorZGRyZW0zMjYgcmVtYWluZGVyICAgMSAgIDAuMzAgICAtPiAgMC4xMAorZGRyZW0zMjcgcmVtYWluZGVyICAgMSAgIDAuMzAwICAtPiAgMC4xMDAKK2RkcmVtMzI4IHJlbWFpbmRlciAgIDEgICAwLjMwMDAgLT4gIDAuMTAwMAorZGRyZW0zMjkgcmVtYWluZGVyICAgMS4wICAgIDAuMyAtPiAgMC4xCitkZHJlbTMzMCByZW1haW5kZXIgICAxLjAwICAgMC4zIC0+ICAwLjEwCitkZHJlbTMzMSByZW1haW5kZXIgICAxLjAwMCAgMC4zIC0+ICAwLjEwMAorZGRyZW0zMzIgcmVtYWluZGVyICAgMS4wMDAwIDAuMyAtPiAgMC4xMDAwCitkZHJlbTMzMyByZW1haW5kZXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK2RkcmVtMzM0IHJlbWFpbmRlciAgIDAuNSAgMi4xICAgLT4gIDAuNQorZGRyZW0zMzUgcmVtYWluZGVyICAgMC41ICAyLjAxICAtPiAgMC41MAorZGRyZW0zMzYgcmVtYWluZGVyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK2RkcmVtMzM3IHJlbWFpbmRlciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK2RkcmVtMzM4IHJlbWFpbmRlciAgIDAuNTAgMi4wMSAgLT4gIDAuNTAKK2RkcmVtMzM5IHJlbWFpbmRlciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKK2RkcmVtMzQwIHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMSAgICAtPiAgMC41MDAwMDAwCitkZHJlbTM0MSByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwCitkZHJlbTM0MiByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAwMSAgICAtPiAgMC41MDAwMDAwMDAKK2RkcmVtMzQzIHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDAwMSAgICAtPiAgMC41MDAwMDAwMDAwCitkZHJlbTM0NCByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMDAwCitkZHJlbTM0NSByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTkgICAgLT4gIDFFLTcKK2RkcmVtMzQ2IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTkgICAgLT4gIDFFLTgKK2RkcmVtMzQ3IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5ICAgIC0+ICAxRS05CitkZHJlbTM0OCByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5OTkgICAgLT4gIDFFLTEwCitkZHJlbTM0OSByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5OTk5ICAgIC0+ICAxRS0xMQorZGRyZW0zNTAgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OTk5OTkgICAgLT4gIDFFLTEyCisKK2RkcmVtMzUxIHJlbWFpbmRlciAgIDAuMDMgIDcgIC0+ICAwLjAzCitkZHJlbTM1MiByZW1haW5kZXIgICA1ICAgMiAgICAtPiAgMQorZGRyZW0zNTMgcmVtYWluZGVyICAgNC4xICAgMiAgICAtPiAgMC4xCitkZHJlbTM1NCByZW1haW5kZXIgICA0LjAxICAgMiAgICAtPiAgMC4wMQorZGRyZW0zNTUgcmVtYWluZGVyICAgNC4wMDEgICAyICAgIC0+ICAwLjAwMQorZGRyZW0zNTYgcmVtYWluZGVyICAgNC4wMDAxICAgMiAgICAtPiAgMC4wMDAxCitkZHJlbTM1NyByZW1haW5kZXIgICA0LjAwMDAxICAgMiAgICAtPiAgMC4wMDAwMQorZGRyZW0zNTggcmVtYWluZGVyICAgNC4wMDAwMDEgICAyICAgIC0+ICAwLjAwMDAwMQorZGRyZW0zNTkgcmVtYWluZGVyICAgNC4wMDAwMDAxICAgMiAgICAtPiAgMUUtNworCitkZHJlbTM2MCByZW1haW5kZXIgICAxLjIgICAwLjczNDUgLT4gIDAuNDY1NQorZGRyZW0zNjEgcmVtYWluZGVyICAgMC44ICAgMTIgICAgIC0+ICAwLjgKK2RkcmVtMzYyIHJlbWFpbmRlciAgIDAuOCAgIDAuMiAgICAtPiAgMC4wCitkZHJlbTM2MyByZW1haW5kZXIgICAwLjggICAwLjMgICAgLT4gIDAuMgorZGRyZW0zNjQgcmVtYWluZGVyICAgMC44MDAgICAxMiAgIC0+ICAwLjgwMAorZGRyZW0zNjUgcmVtYWluZGVyICAgMC44MDAgICAxLjcgIC0+ICAwLjgwMAorZGRyZW0zNjYgcmVtYWluZGVyICAgMi40MDAgICAyICAgIC0+ICAwLjQwMAorCitkZHJlbTM3MSByZW1haW5kZXIgICAyLjQwMCAgMiAgICAgICAgLT4gIDAuNDAwCisKK2RkcmVtMzgxIHJlbWFpbmRlciAxMjM0NSAgMSAgICAgICAgIC0+ICAwCitkZHJlbTM4MiByZW1haW5kZXIgMTIzNDUgIDEuMDAwMSAgICAtPiAgMC43NjU3CitkZHJlbTM4MyByZW1haW5kZXIgMTIzNDUgIDEuMDAxICAgICAtPiAgMC42NjgKK2RkcmVtMzg0IHJlbWFpbmRlciAxMjM0NSAgMS4wMSAgICAgIC0+ICAwLjc4CitkZHJlbTM4NSByZW1haW5kZXIgMTIzNDUgIDEuMSAgICAgICAtPiAgMC44CitkZHJlbTM4NiByZW1haW5kZXIgMTIzNTUgIDQgICAgICAgICAtPiAgMworZGRyZW0zODcgcmVtYWluZGVyIDEyMzQ1ICA0ICAgICAgICAgLT4gIDEKK2RkcmVtMzg4IHJlbWFpbmRlciAxMjM1NSAgNC4wMDAxICAgIC0+ICAyLjY5MTIKK2RkcmVtMzg5IHJlbWFpbmRlciAxMjM0NSAgNC4wMDAxICAgIC0+ICAwLjY5MTQKK2RkcmVtMzkwIHJlbWFpbmRlciAxMjM0NSAgNC45ICAgICAgIC0+ICAxLjkKK2RkcmVtMzkxIHJlbWFpbmRlciAxMjM0NSAgNC45OSAgICAgIC0+ICA0LjczCitkZHJlbTM5MiByZW1haW5kZXIgMTIzNDUgIDQuOTk5ICAgICAtPiAgMi40NjkKK2RkcmVtMzkzIHJlbWFpbmRlciAxMjM0NSAgNC45OTk5ICAgIC0+ICAwLjI0NjkKK2RkcmVtMzk0IHJlbWFpbmRlciAxMjM0NSAgNSAgICAgICAgIC0+ICAwCitkZHJlbTM5NSByZW1haW5kZXIgMTIzNDUgIDUuMDAwMSAgICAtPiAgNC43NTMyCitkZHJlbTM5NiByZW1haW5kZXIgMTIzNDUgIDUuMDAxICAgICAtPiAgMi41MzIKK2RkcmVtMzk3IHJlbWFpbmRlciAxMjM0NSAgNS4wMSAgICAgIC0+ICAwLjM2CitkZHJlbTM5OCByZW1haW5kZXIgMTIzNDUgIDUuMSAgICAgICAtPiAgMy4wCisKKy0tIHRoZSBuYXN0eSBkaXZpc2lvbi1ieS0xIGNhc2VzCitkZHJlbTQwMSByZW1haW5kZXIgICAwLjUgICAgICAgICAxICAgLT4gIDAuNQorZGRyZW00MDIgcmVtYWluZGVyICAgMC41NSAgICAgICAgMSAgIC0+ICAwLjU1CitkZHJlbTQwMyByZW1haW5kZXIgICAwLjU1NSAgICAgICAxICAgLT4gIDAuNTU1CitkZHJlbTQwNCByZW1haW5kZXIgICAwLjU1NTUgICAgICAxICAgLT4gIDAuNTU1NQorZGRyZW00MDUgcmVtYWluZGVyICAgMC41NTU1NSAgICAgMSAgIC0+ICAwLjU1NTU1CitkZHJlbTQwNiByZW1haW5kZXIgICAwLjU1NTU1NSAgICAxICAgLT4gIDAuNTU1NTU1CitkZHJlbTQwNyByZW1haW5kZXIgICAwLjU1NTU1NTUgICAxICAgLT4gIDAuNTU1NTU1NQorZGRyZW00MDggcmVtYWluZGVyICAgMC41NTU1NTU1NSAgMSAgIC0+ICAwLjU1NTU1NTU1CitkZHJlbTQwOSByZW1haW5kZXIgICAwLjU1NTU1NTU1NSAxICAgLT4gIDAuNTU1NTU1NTU1CisKKy0tIGZvbGRkb3ducworZGRyZW00MjEgcmVtYWluZGVyICAgMUUrMzg0ICAgICAgIDEgIC0+ICAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkcmVtNDIyIHJlbWFpbmRlciAgIDFFKzM4NCAgMUUrMzgzICAtPiAgIDBFKzM2OSBDbGFtcGVkCitkZHJlbTQyMyByZW1haW5kZXIgICAxRSszODQgIDJFKzM4MyAgLT4gICAwRSszNjkgQ2xhbXBlZAorZGRyZW00MjQgcmVtYWluZGVyICAgMUUrMzg0ICAzRSszODMgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2RkcmVtNDI1IHJlbWFpbmRlciAgIDFFKzM4NCAgNEUrMzgzICAtPiAgIDIuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitkZHJlbTQyNiByZW1haW5kZXIgICAxRSszODQgIDVFKzM4MyAgLT4gICAwRSszNjkgQ2xhbXBlZAorZGRyZW00MjcgcmVtYWluZGVyICAgMUUrMzg0ICA2RSszODMgIC0+ICAgNC4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2RkcmVtNDI4IHJlbWFpbmRlciAgIDFFKzM4NCAgN0UrMzgzICAtPiAgIDMuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitkZHJlbTQyOSByZW1haW5kZXIgICAxRSszODQgIDhFKzM4MyAgLT4gICAyLjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorZGRyZW00MzAgcmVtYWluZGVyICAgMUUrMzg0ICA5RSszODMgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKKy0tIHRpbmllcworZGRyZW00MzEgcmVtYWluZGVyICAgMUUtMzk3ICAxRS0zOTggIC0+ICAgMEUtMzk4CitkZHJlbTQzMiByZW1haW5kZXIgICAxRS0zOTcgIDJFLTM5OCAgLT4gICAwRS0zOTgKK2RkcmVtNDMzIHJlbWFpbmRlciAgIDFFLTM5NyAgM0UtMzk4ICAtPiAgIDFFLTM5OCBTdWJub3JtYWwKK2RkcmVtNDM0IHJlbWFpbmRlciAgIDFFLTM5NyAgNEUtMzk4ICAtPiAgIDJFLTM5OCBTdWJub3JtYWwKK2RkcmVtNDM1IHJlbWFpbmRlciAgIDFFLTM5NyAgNUUtMzk4ICAtPiAgIDBFLTM5OAorZGRyZW00MzYgcmVtYWluZGVyICAgMUUtMzk3ICA2RS0zOTggIC0+ICAgNEUtMzk4IFN1Ym5vcm1hbAorZGRyZW00MzcgcmVtYWluZGVyICAgMUUtMzk3ICA3RS0zOTggIC0+ICAgM0UtMzk4IFN1Ym5vcm1hbAorZGRyZW00MzggcmVtYWluZGVyICAgMUUtMzk3ICA4RS0zOTggIC0+ICAgMkUtMzk4IFN1Ym5vcm1hbAorZGRyZW00MzkgcmVtYWluZGVyICAgMUUtMzk3ICA5RS0zOTggIC0+ICAgMUUtMzk4IFN1Ym5vcm1hbAorZGRyZW00NDAgcmVtYWluZGVyICAgMUUtMzk3IDEwRS0zOTggIC0+ICAgMEUtMzk4CitkZHJlbTQ0MSByZW1haW5kZXIgICAxRS0zOTcgMTFFLTM5OCAgLT4gMS4wRS0zOTcgU3Vibm9ybWFsCitkZHJlbTQ0MiByZW1haW5kZXIgMTAwRS0zOTcgMTFFLTM5OCAgLT4gMS4wRS0zOTcgU3Vibm9ybWFsCitkZHJlbTQ0MyByZW1haW5kZXIgMTAwRS0zOTcgMjBFLTM5OCAgLT4gICAwRS0zOTgKK2RkcmVtNDQ0IHJlbWFpbmRlciAxMDBFLTM5NyAyMUUtMzk4ICAtPiAxLjNFLTM5NyBTdWJub3JtYWwKK2RkcmVtNDQ1IHJlbWFpbmRlciAxMDBFLTM5NyAzMEUtMzk4ICAtPiAxLjBFLTM5NyBTdWJub3JtYWwKKworLS0gemVybyBzaWducworZGRyZW02NTAgcmVtYWluZGVyICAxICAxIC0+ICAwCitkZHJlbTY1MSByZW1haW5kZXIgLTEgIDEgLT4gLTAKK2RkcmVtNjUyIHJlbWFpbmRlciAgMSAtMSAtPiAgMAorZGRyZW02NTMgcmVtYWluZGVyIC0xIC0xIC0+IC0wCitkZHJlbTY1NCByZW1haW5kZXIgIDAgIDEgLT4gIDAKK2RkcmVtNjU1IHJlbWFpbmRlciAtMCAgMSAtPiAtMAorZGRyZW02NTYgcmVtYWluZGVyICAwIC0xIC0+ICAwCitkZHJlbTY1NyByZW1haW5kZXIgLTAgLTEgLT4gLTAKK2RkcmVtNjU4IHJlbWFpbmRlciAgMC4wMCAgMSAgLT4gIDAuMDAKK2RkcmVtNjU5IHJlbWFpbmRlciAtMC4wMCAgMSAgLT4gLTAuMDAKKworLS0gU3BlY2lhbHMKK2RkcmVtNjgwIHJlbWFpbmRlciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW02ODEgcmVtYWluZGVyICBJbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTY4MiByZW1haW5kZXIgIEluZiAgLTEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNjgzIHJlbWFpbmRlciAgSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW02ODQgcmVtYWluZGVyICBJbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTY4NSByZW1haW5kZXIgIEluZiAgIDEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNjg2IHJlbWFpbmRlciAgSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW02ODcgcmVtYWluZGVyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTY4OCByZW1haW5kZXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkZHJlbTY4OSByZW1haW5kZXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNjkxIHJlbWFpbmRlciAtMSAgICAgSW5mICAgLT4gLTEKK2RkcmVtNjkyIHJlbWFpbmRlciAgMCAgICAgSW5mICAgLT4gIDAKK2RkcmVtNjkzIHJlbWFpbmRlciAtMCAgICAgSW5mICAgLT4gLTAKK2RkcmVtNjk0IHJlbWFpbmRlciAgMSAgICAgSW5mICAgLT4gIDEKK2RkcmVtNjk1IHJlbWFpbmRlciAgMTAwMCAgSW5mICAgLT4gIDEwMDAKK2RkcmVtNjk2IHJlbWFpbmRlciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHJlbTcwMCByZW1haW5kZXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzAxIHJlbWFpbmRlciAtSW5mICAtMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03MDIgcmVtYWluZGVyIC1JbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTcwMyByZW1haW5kZXIgLUluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzA0IHJlbWFpbmRlciAtSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03MDUgcmVtYWluZGVyIC1JbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTcwNiByZW1haW5kZXIgLUluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzA3IHJlbWFpbmRlciAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03MDggcmVtYWluZGVyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTcwOSByZW1haW5kZXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkZHJlbTcxMCByZW1haW5kZXIgLTEgICAgLUluZiAgIC0+IC0xCitkZHJlbTcxMSByZW1haW5kZXIgLTAgICAgLUluZiAgIC0+IC0wCitkZHJlbTcxMiByZW1haW5kZXIgIDAgICAgLUluZiAgIC0+ICAwCitkZHJlbTcxMyByZW1haW5kZXIgIDEgICAgLUluZiAgIC0+ICAxCitkZHJlbTcxNCByZW1haW5kZXIgIDEwMDAgLUluZiAgIC0+ICAxMDAwCitkZHJlbTcxNSByZW1haW5kZXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRyZW03MjEgcmVtYWluZGVyICBOYU4gLUluZiAgICAtPiAgTmFOCitkZHJlbTcyMiByZW1haW5kZXIgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RkcmVtNzIzIHJlbWFpbmRlciAgTmFOIC0xICAgICAgLT4gIE5hTgorZGRyZW03MjQgcmVtYWluZGVyICBOYU4gLTAgICAgICAtPiAgTmFOCitkZHJlbTcyNSByZW1haW5kZXIgLU5hTiAgMCAgICAgIC0+IC1OYU4KK2RkcmVtNzI2IHJlbWFpbmRlciAgTmFOICAxICAgICAgLT4gIE5hTgorZGRyZW03MjcgcmVtYWluZGVyICBOYU4gIDEwMDAgICAtPiAgTmFOCitkZHJlbTcyOCByZW1haW5kZXIgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RkcmVtNzI5IHJlbWFpbmRlciAgTmFOIC1OYU4gICAgLT4gIE5hTgorZGRyZW03MzAgcmVtYWluZGVyIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkZHJlbTczMSByZW1haW5kZXIgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RkcmVtNzMyIHJlbWFpbmRlciAtMSAgICBOYU4gICAgLT4gIE5hTgorZGRyZW03MzMgcmVtYWluZGVyIC0wICAgLU5hTiAgICAtPiAtTmFOCitkZHJlbTczNCByZW1haW5kZXIgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RkcmVtNzM1IHJlbWFpbmRlciAgMSAgIC1OYU4gICAgLT4gLU5hTgorZGRyZW03MzYgcmVtYWluZGVyICAxMDAwIE5hTiAgICAtPiAgTmFOCitkZHJlbTczNyByZW1haW5kZXIgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZGRyZW03NDEgcmVtYWluZGVyICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NDIgcmVtYWluZGVyICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NDMgcmVtYWluZGVyIC1zTmFOIC0xICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NDQgcmVtYWluZGVyICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NDUgcmVtYWluZGVyICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NDYgcmVtYWluZGVyICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NDcgcmVtYWluZGVyICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NDkgcmVtYWluZGVyICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTAgcmVtYWluZGVyICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTEgcmVtYWluZGVyICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTIgcmVtYWluZGVyIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTMgcmVtYWluZGVyIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTQgcmVtYWluZGVyIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTUgcmVtYWluZGVyIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTYgcmVtYWluZGVyICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTcgcmVtYWluZGVyICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTggcmVtYWluZGVyICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NTkgcmVtYWluZGVyICBJbmYgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdpbmcgTmFOcworZGRyZW03NjAgcmVtYWluZGVyICBOYU4xICAgTmFONyAgIC0+ICBOYU4xCitkZHJlbTc2MSByZW1haW5kZXIgc05hTjIgICBOYU44ICAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2RkcmVtNzYyIHJlbWFpbmRlciAgTmFOMyAgc05hTjkgICAtPiAgTmFOOSBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW03NjMgcmVtYWluZGVyIHNOYU40ICBzTmFOMTAgIC0+ICBOYU40IEludmFsaWRfb3BlcmF0aW9uCitkZHJlbTc2NCByZW1haW5kZXIgICAgMTUgICBOYU4xMSAgLT4gIE5hTjExCitkZHJlbTc2NSByZW1haW5kZXIgIE5hTjYgICBOYU4xMiAgLT4gIE5hTjYKK2RkcmVtNzY2IHJlbWFpbmRlciAgSW5mICAgIE5hTjEzICAtPiAgTmFOMTMKK2RkcmVtNzY3IHJlbWFpbmRlciAgTmFOMTQgIC1JbmYgICAtPiAgTmFOMTQKK2RkcmVtNzY4IHJlbWFpbmRlciAgICAwICAgIE5hTjE1ICAtPiAgTmFOMTUKK2RkcmVtNzY5IHJlbWFpbmRlciAgTmFOMTYgICAtMCAgICAtPiAgTmFOMTYKKworLS0gZWRnZSBjYXNlcyBvZiBpbXBvc3NpYmxlCitkZHJlbTc3MCAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2ICAxMCAgICAtPiAgNgorZGRyZW03NzEgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDEgICAgLT4gIDAKK2RkcmVtNzcyICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTYgICAwLjEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRyZW03NzMgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDAuMDEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK2RkcmVtODAxIHJlbWFpbmRlciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorZGRyZW04MDIgcmVtYWluZGVyIDEgMTIzNDU2NzgwMDAgICAtPiAxCitkZHJlbTgwMyByZW1haW5kZXIgMTIzNDU2NzgwMCAgMTAgIC0+IDAKK2RkcmVtODA0IHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorZGRyZW04MDUgcmVtYWluZGVyIDEyMzQ1Njc4OTAgIDEwICAtPiAwCitkZHJlbTgwNiByZW1haW5kZXIgMSAxMjM0NTY3ODkwICAgIC0+IDEKK2RkcmVtODA3IHJlbWFpbmRlciAxMjM0NTY3ODkxICAxMCAgLT4gMQorZGRyZW04MDggcmVtYWluZGVyIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkZHJlbTgwOSByZW1haW5kZXIgMTIzNDU2Nzg5MDEgMTAwIC0+IDEKK2RkcmVtODEwIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZGRyZW04MTEgcmVtYWluZGVyIDEyMzQ1Njc4OTYgIDEwICAtPiA2CitkZHJlbTgxMiByZW1haW5kZXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworZGRyZW04MjEgcmVtYWluZGVyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCitkZHJlbTgyMiByZW1haW5kZXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK2RkcmVtODIzIHJlbWFpbmRlciAxMjM0NTY3ODAwICAxMCAgLT4gMAorZGRyZW04MjQgcmVtYWluZGVyIDEgMTIzNDU2NzgwMCAgICAtPiAxCitkZHJlbTgyNSByZW1haW5kZXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK2RkcmVtODI2IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorZGRyZW04MjcgcmVtYWluZGVyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCitkZHJlbTgyOCByZW1haW5kZXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK2RkcmVtODI5IHJlbWFpbmRlciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorZGRyZW04MzAgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitkZHJlbTgzMSByZW1haW5kZXIgMTIzNDU2Nzg5NiAgMTAgIC0+IDYKK2RkcmVtODMyIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCistLSBmcm9tIGRpdmlkZWludAorZGRyZW04NDAgcmVtYWluZGVyICAxMDAwMDAwMDAuMCAgIDEgIC0+ICAwLjAKK2RkcmVtODQxIHJlbWFpbmRlciAgMTAwMDAwMDAwLjQgICAxICAtPiAgMC40CitkZHJlbTg0MiByZW1haW5kZXIgIDEwMDAwMDAwMC41ICAgMSAgLT4gIDAuNQorZGRyZW04NDMgcmVtYWluZGVyICAxMDAwMDAwMDAuOSAgIDEgIC0+ICAwLjkKK2RkcmVtODQ0IHJlbWFpbmRlciAgMTAwMDAwMDAwLjk5OSAxICAtPiAgMC45OTkKK2RkcmVtODUwIHJlbWFpbmRlciAgMTAwMDAwMDAzICAgICA1ICAtPiAgMworZGRyZW04NTEgcmVtYWluZGVyICAxMDAwMDAwMyAgICAgIDUgIC0+ICAzCitkZHJlbTg1MiByZW1haW5kZXIgIDEwMDAwMDMgICAgICAgNSAgLT4gIDMKK2RkcmVtODUzIHJlbWFpbmRlciAgMTAwMDAzICAgICAgICA1ICAtPiAgMworZGRyZW04NTQgcmVtYWluZGVyICAxMDAwMyAgICAgICAgIDUgIC0+ICAzCitkZHJlbTg1NSByZW1haW5kZXIgIDEwMDMgICAgICAgICAgNSAgLT4gIDMKK2RkcmVtODU2IHJlbWFpbmRlciAgMTAzICAgICAgICAgICA1ICAtPiAgMworZGRyZW04NTcgcmVtYWluZGVyICAxMyAgICAgICAgICAgIDUgIC0+ICAzCitkZHJlbTg1OCByZW1haW5kZXIgIDEgICAgICAgICAgICAgNSAgLT4gIDEKKworLS0gVmxhZGltaXIncyBjYXNlcyAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RkcmVtODYwIHJlbWFpbmRlciAxMjMuMGUxIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RkcmVtODYxIHJlbWFpbmRlciAxMjMwICAgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RkcmVtODYyIHJlbWFpbmRlciAxMi4zZTIgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RkcmVtODYzIHJlbWFpbmRlciAxLjIzZTMgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RkcmVtODY0IHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2RkcmVtODcwIHJlbWFpbmRlciAxMjNlMSAgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODcxIHJlbWFpbmRlciAxMjNlMSAgICAgMTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODcyIHJlbWFpbmRlciAxMjNlMSAgICAgIDEwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODczIHJlbWFpbmRlciAxMjNlMSAgICAgICAxMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODc0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgMTAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODc1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgIDEwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODc2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAxMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODc3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODc4IHJlbWFpbmRlciAxMjMwICAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODc5IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgIDEwMDAwMDAwIC0+IDEyMzAKK2RkcmVtODgwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAxMDAwMDAwIC0+IDEyMzAKK2RkcmVtODgxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgMTAwMDAwIC0+IDEyMzAKK2RkcmVtODgyIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgIDEwMDAwIC0+IDEyMzAKK2RkcmVtODgzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAxMDAwIC0+ICAyMzAKK2RkcmVtODg0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgMTAwIC0+ICAgMzAKK2RkcmVtODg1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgIDEwIC0+ICAgIDAKK2RkcmVtODg2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICAxIC0+ICAgIDAKKworZGRyZW04OTAgcmVtYWluZGVyIDEyM2UxICAgIDIwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTEgcmVtYWluZGVyIDEyM2UxICAgICAyMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTIgcmVtYWluZGVyIDEyM2UxICAgICAgMjAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTMgcmVtYWluZGVyIDEyM2UxICAgICAgIDIwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTQgcmVtYWluZGVyIDEyM2UxICAgICAgICAyMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgMjAwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgIDIwMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAyMDAwMDAwMDAgLT4gMTIzMAorZGRyZW04OTkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgMjAwMDAwMDAgLT4gMTIzMAorZGRyZW05MDAgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgIDIwMDAwMDAgLT4gMTIzMAorZGRyZW05MDEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAyMDAwMDAgLT4gMTIzMAorZGRyZW05MDIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgMjAwMDAgLT4gMTIzMAorZGRyZW05MDMgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgIDIwMDAgLT4gMTIzMAorZGRyZW05MDQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAyMDAgLT4gICAzMAorZGRyZW05MDUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgMjAgLT4gICAxMAorZGRyZW05MDYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgIDIgLT4gICAgMAorCitkZHJlbTkxMCByZW1haW5kZXIgMTIzZTEgICAgNTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxMSByZW1haW5kZXIgMTIzZTEgICAgIDUwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxMiByZW1haW5kZXIgMTIzZTEgICAgICA1MDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxMyByZW1haW5kZXIgMTIzZTEgICAgICAgNTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxNCByZW1haW5kZXIgMTIzZTEgICAgICAgIDUwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxNSByZW1haW5kZXIgMTIzZTEgICAgICAgICA1MDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgNTAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxNyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgIDUwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTkxOSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICA1MDAwMDAwMCAtPiAxMjMwCitkZHJlbTkyMCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgNTAwMDAwMCAtPiAxMjMwCitkZHJlbTkyMSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgIDUwMDAwMCAtPiAxMjMwCitkZHJlbTkyMiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICA1MDAwMCAtPiAxMjMwCitkZHJlbTkyMyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgNTAwMCAtPiAxMjMwCitkZHJlbTkyNCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgIDUwMCAtPiAgMjMwCitkZHJlbTkyNSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICA1MCAtPiAgIDMwCitkZHJlbTkyNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgNSAtPiAgICAwCisKK2RkcmVtOTMwIHJlbWFpbmRlciAxMjNlMSAgICA5MDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTMxIHJlbWFpbmRlciAxMjNlMSAgICAgOTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTMyIHJlbWFpbmRlciAxMjNlMSAgICAgIDkwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTMzIHJlbWFpbmRlciAxMjNlMSAgICAgICA5MDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTM0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgOTAwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTM1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgIDkwMDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTM2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICA5MDAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTM3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgOTAwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTM5IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgIDkwMDAwMDAwIC0+IDEyMzAKK2RkcmVtOTQwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICA5MDAwMDAwIC0+IDEyMzAKK2RkcmVtOTQxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgOTAwMDAwIC0+IDEyMzAKK2RkcmVtOTQyIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgIDkwMDAwIC0+IDEyMzAKK2RkcmVtOTQzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICA5MDAwIC0+IDEyMzAKK2RkcmVtOTQ0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgOTAwIC0+ICAzMzAKK2RkcmVtOTQ1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgIDkwIC0+ICAgNjAKK2RkcmVtOTQ2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICA5IC0+ICAgIDYKKworZGRyZW05NTAgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJlbTk2MSByZW1haW5kZXIgMTIzZTEgICAyOTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RkcmVtOTYyIHJlbWFpbmRlciAxMjNlMSAgIDM5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZGRyZW05NjMgcmVtYWluZGVyIDEyM2UxICAgNDk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJlbTk2NCByZW1haW5kZXIgMTIzZTEgICA1OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RkcmVtOTY1IHJlbWFpbmRlciAxMjNlMSAgIDY5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZGRyZW05NjYgcmVtYWluZGVyIDEyM2UxICAgNzk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJlbTk2NyByZW1haW5kZXIgMTIzZTEgICA4OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RkcmVtOTY4IHJlbWFpbmRlciAxMjNlMSAgIDk5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZGRyZW05NjkgcmVtYWluZGVyIDEyM2UxICAgOTg3NjU0MzIxMDk4NzY1NCAtPiAxMjMwCisKK2RkcmVtOTgwIHJlbWFpbmRlciAxMjNlMSAxMDAwRTI5OSAtPiAxLjIzRSszICAtLSAxMjNFKzEgaW50ZXJuYWxseQorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIFtmcm9tIGRpdmlkZV0KK2RkcmVtMTA1MSByZW1haW5kZXIgIDFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRyZW0xMDUyIHJlbWFpbmRlciAgMWUrMjc3IC0xZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZHJlbTEwNTMgcmVtYWluZGVyIC0xZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RkcmVtMTA1NCByZW1haW5kZXIgLTFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRyZW0xMDU1IHJlbWFpbmRlciAgMWUtMjc3ICAxZSszMTEgLT4gIDFFLTI3NworZGRyZW0xMDU2IHJlbWFpbmRlciAgMWUtMjc3IC0xZSszMTEgLT4gIDFFLTI3NworZGRyZW0xMDU3IHJlbWFpbmRlciAtMWUtMjc3ICAxZSszMTEgLT4gLTFFLTI3NworZGRyZW0xMDU4IHJlbWFpbmRlciAtMWUtMjc3IC0xZSszMTEgLT4gLTFFLTI3NworCistLSBkZXN0cnVjdGl2ZSBzdWJ0cmFjdAorZGRyZW0xMTAxIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgMS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAwLjc2NTQzMjEwOTg3NjU0NgorZGRyZW0xMTAyIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDEuMDAwMDAwMDAwMDAwMDEgIC0+ICAgMC42NTQzMjEwOTg3NjU1NworZGRyZW0xMTAzIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAxLjAwMDAwMDAwMDAwMDEgIC0+ICAgIDAuNTQzMjEwOTg3NjY2OAorZGRyZW0xMTA0IHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NSAgNC4wMDAwMDAwMDAwMDAwMDEgIC0+ICAyLjY5MTM1ODAyNzQ2OTEzNworZGRyZW0xMTA1IHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgNC4wMDAwMDAwMDAwMDAwMDEgIC0+ICAzLjY5MTM1ODAyNzQ2OTEzNworZGRyZW0xMTA2IHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgICA0Ljk5OTk5OTk5OTk5OTkgIC0+ICAgIDAuNjkxMzU3ODAyNDY5NgorZGRyZW0xMTA3IHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDQuOTk5OTk5OTk5OTk5OTkgIC0+ICAgMy40NjkxMzU3ODAyNDY5MQorZGRyZW0xMTA4IHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgNC45OTk5OTk5OTk5OTk5OTkgIC0+ICAxLjI0NjkxMzU3ODAyNDY5MQorZGRyZW0xMTA5IHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgNS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAwLjc1MzA4NjQyMTk3NTMwOQorZGRyZW0xMTEwIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDUuMDAwMDAwMDAwMDAwMDEgIC0+ICAgMy41MzA4NjQyMTk3NTMxMAorZGRyZW0xMTExIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1NiAgICA1LjAwMDAwMDAwMDAwMDEgIC0+ICAgIDEuMzA4NjQyMTk3NTMxNAorCistLSBOdWxsIHRlc3RzCitkZHJlbTEwMDAgcmVtYWluZGVyIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyZW0xMDAxIHJlbWFpbmRlciAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFJlbWFpbmRlck5lYXIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRSZW1haW5kZXJOZWFyLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRhOWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRSZW1haW5kZXJOZWFyLmRlY1Rlc3QKQEAgLTAsMCArMSw2MjkgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRSZW1haW5kZXJOZWFyLmRlY1Rlc3QgLS0gZGVjRG91YmxlIHJlbWFpbmRlci1uZWFyICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcyAoYXMgYmFzZSwgYWJvdmUpCitkZHJtbjAwMSByZW1haW5kZXJuZWFyICAxICAgICAxICAgIC0+ICAwCitkZHJtbjAwMiByZW1haW5kZXJuZWFyICAyICAgICAxICAgIC0+ICAwCitkZHJtbjAwMyByZW1haW5kZXJuZWFyICAxICAgICAyICAgIC0+ICAxCitkZHJtbjAwNCByZW1haW5kZXJuZWFyICAyICAgICAyICAgIC0+ICAwCitkZHJtbjAwNSByZW1haW5kZXJuZWFyICAwICAgICAxICAgIC0+ICAwCitkZHJtbjAwNiByZW1haW5kZXJuZWFyICAwICAgICAyICAgIC0+ICAwCitkZHJtbjAwNyByZW1haW5kZXJuZWFyICAxICAgICAzICAgIC0+ICAxCitkZHJtbjAwOCByZW1haW5kZXJuZWFyICAyICAgICAzICAgIC0+IC0xCitkZHJtbjAwOSByZW1haW5kZXJuZWFyICAzICAgICAzICAgIC0+ICAwCisKK2Rkcm1uMDEwIHJlbWFpbmRlcm5lYXIgIDIuNCAgIDEgICAgLT4gIDAuNAorZGRybW4wMTEgcmVtYWluZGVybmVhciAgMi40ICAgLTEgICAtPiAgMC40CitkZHJtbjAxMiByZW1haW5kZXJuZWFyICAtMi40ICAxICAgIC0+ICAtMC40CitkZHJtbjAxMyByZW1haW5kZXJuZWFyICAtMi40ICAtMSAgIC0+ICAtMC40CitkZHJtbjAxNCByZW1haW5kZXJuZWFyICAyLjQwICAxICAgIC0+ICAwLjQwCitkZHJtbjAxNSByZW1haW5kZXJuZWFyICAyLjQwMCAxICAgIC0+ICAwLjQwMAorZGRybW4wMTYgcmVtYWluZGVybmVhciAgMi40ICAgMiAgICAtPiAgMC40CitkZHJtbjAxNyByZW1haW5kZXJuZWFyICAyLjQwMCAyICAgIC0+ICAwLjQwMAorZGRybW4wMTggcmVtYWluZGVybmVhciAgMi4gICAgMiAgICAtPiAgMAorZGRybW4wMTkgcmVtYWluZGVybmVhciAgMjAgICAgMjAgICAtPiAgMAorCitkZHJtbjAyMCByZW1haW5kZXJuZWFyICAxODcgICAxODcgICAgLT4gIDAKK2Rkcm1uMDIxIHJlbWFpbmRlcm5lYXIgIDUgICAgIDIgICAgICAtPiAgMQorZGRybW4wMjIgcmVtYWluZGVybmVhciAgNSAgICAgMi4wICAgIC0+ICAxLjAKK2Rkcm1uMDIzIHJlbWFpbmRlcm5lYXIgIDUgICAgIDIuMDAwICAtPiAgMS4wMDAKK2Rkcm1uMDI0IHJlbWFpbmRlcm5lYXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKK2Rkcm1uMDI1IHJlbWFpbmRlcm5lYXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKKworZGRybW4wMzAgcmVtYWluZGVybmVhciAgMSAgICAgMiAgICAgIC0+ICAxCitkZHJtbjAzMSByZW1haW5kZXJuZWFyICAxICAgICA0ICAgICAgLT4gIDEKK2Rkcm1uMDMyIHJlbWFpbmRlcm5lYXIgIDEgICAgIDggICAgICAtPiAgMQorCitkZHJtbjAzMyByZW1haW5kZXJuZWFyICAxICAgICAxNiAgICAgLT4gIDEKK2Rkcm1uMDM0IHJlbWFpbmRlcm5lYXIgIDEgICAgIDMyICAgICAtPiAgMQorZGRybW4wMzUgcmVtYWluZGVybmVhciAgMSAgICAgNjQgICAgIC0+ICAxCitkZHJtbjA0MCByZW1haW5kZXJuZWFyICAxICAgIC0yICAgICAgLT4gIDEKK2Rkcm1uMDQxIHJlbWFpbmRlcm5lYXIgIDEgICAgLTQgICAgICAtPiAgMQorZGRybW4wNDIgcmVtYWluZGVybmVhciAgMSAgICAtOCAgICAgIC0+ICAxCitkZHJtbjA0MyByZW1haW5kZXJuZWFyICAxICAgIC0xNiAgICAgLT4gIDEKK2Rkcm1uMDQ0IHJlbWFpbmRlcm5lYXIgIDEgICAgLTMyICAgICAtPiAgMQorZGRybW4wNDUgcmVtYWluZGVybmVhciAgMSAgICAtNjQgICAgIC0+ICAxCitkZHJtbjA1MCByZW1haW5kZXJuZWFyIC0xICAgICAyICAgICAgLT4gIC0xCitkZHJtbjA1MSByZW1haW5kZXJuZWFyIC0xICAgICA0ICAgICAgLT4gIC0xCitkZHJtbjA1MiByZW1haW5kZXJuZWFyIC0xICAgICA4ICAgICAgLT4gIC0xCitkZHJtbjA1MyByZW1haW5kZXJuZWFyIC0xICAgICAxNiAgICAgLT4gIC0xCitkZHJtbjA1NCByZW1haW5kZXJuZWFyIC0xICAgICAzMiAgICAgLT4gIC0xCitkZHJtbjA1NSByZW1haW5kZXJuZWFyIC0xICAgICA2NCAgICAgLT4gIC0xCitkZHJtbjA2MCByZW1haW5kZXJuZWFyIC0xICAgIC0yICAgICAgLT4gIC0xCitkZHJtbjA2MSByZW1haW5kZXJuZWFyIC0xICAgIC00ICAgICAgLT4gIC0xCitkZHJtbjA2MiByZW1haW5kZXJuZWFyIC0xICAgIC04ICAgICAgLT4gIC0xCitkZHJtbjA2MyByZW1haW5kZXJuZWFyIC0xICAgIC0xNiAgICAgLT4gIC0xCitkZHJtbjA2NCByZW1haW5kZXJuZWFyIC0xICAgIC0zMiAgICAgLT4gIC0xCitkZHJtbjA2NSByZW1haW5kZXJuZWFyIC0xICAgIC02NCAgICAgLT4gIC0xCisKK2Rkcm1uMDY2IHJlbWFpbmRlcm5lYXIgICAgICAgICAgOS45ICAgMSAgLT4gLTAuMQorZGRybW4wNjcgcmVtYWluZGVybmVhciAgICAgICAgIDk5LjcgICAxICAtPiAtMC4zCitkZHJtbjA2OCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkgICAgIDEgIC0+IDAKK2Rkcm1uMDY5IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS40ICAgMSAgLT4gMC40CitkZHJtbjA3MCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuNSAgIDEgIC0+IC0wLjUKK2Rkcm1uMDcxIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS45ICAgMSAgLT4gLTAuMQorZGRybW4wNzIgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5Ljk5OSAxICAtPiAtMC4wMDEKK2Rkcm1uMDczIHJlbWFpbmRlcm5lYXIgIDk5OTk5OS45OTk5OTkgMSAgLT4gLTAuMDAwMDAxCitkZHJtbjA3NCByZW1haW5kZXJuZWFyICA5ICAgICAgICAgICAgIDEgIC0+IDAKK2Rkcm1uMDc1IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OTk5OTk5OTkgMSAgLT4gMAorZGRybW4wNzYgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5OTk5OTk5OSAyICAtPiAtMQorZGRybW4wNzcgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5OTk5OTk5OSAzICAtPiAwCitkZHJtbjA3OCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTk5OTk5OTk5IDQgIC0+IC0xCisKK2Rkcm1uMDgwIHJlbWFpbmRlcm5lYXIgIDAuICAgICAgICAgICAgMSAgLT4gMAorZGRybW4wODEgcmVtYWluZGVybmVhciAgLjAgICAgICAgICAgICAxICAtPiAwLjAKK2Rkcm1uMDgyIHJlbWFpbmRlcm5lYXIgIDAuMDAgICAgICAgICAgMSAgLT4gMC4wMAorZGRybW4wODMgcmVtYWluZGVybmVhciAgMC4wMEUrOSAgICAgICAxICAtPiAwCitkZHJtbjA4NCByZW1haW5kZXJuZWFyICAwLjAwRSszICAgICAgIDEgIC0+IDAKK2Rkcm1uMDg1IHJlbWFpbmRlcm5lYXIgIDAuMDBFKzIgICAgICAgMSAgLT4gMAorZGRybW4wODYgcmVtYWluZGVybmVhciAgMC4wMEUrMSAgICAgICAxICAtPiAwLjAKK2Rkcm1uMDg3IHJlbWFpbmRlcm5lYXIgIDAuMDBFKzAgICAgICAgMSAgLT4gMC4wMAorZGRybW4wODggcmVtYWluZGVybmVhciAgMC4wMEUtMCAgICAgICAxICAtPiAwLjAwCitkZHJtbjA4OSByZW1haW5kZXJuZWFyICAwLjAwRS0xICAgICAgIDEgIC0+IDAuMDAwCitkZHJtbjA5MCByZW1haW5kZXJuZWFyICAwLjAwRS0yICAgICAgIDEgIC0+IDAuMDAwMAorZGRybW4wOTEgcmVtYWluZGVybmVhciAgMC4wMEUtMyAgICAgICAxICAtPiAwLjAwMDAwCitkZHJtbjA5MiByZW1haW5kZXJuZWFyICAwLjAwRS00ICAgICAgIDEgIC0+IDAuMDAwMDAwCitkZHJtbjA5MyByZW1haW5kZXJuZWFyICAwLjAwRS01ICAgICAgIDEgIC0+IDBFLTcKK2Rkcm1uMDk0IHJlbWFpbmRlcm5lYXIgIDAuMDBFLTYgICAgICAgMSAgLT4gMEUtOAorZGRybW4wOTUgcmVtYWluZGVybmVhciAgMC4wMDAwRS01MCAgICAxICAtPiAwRS01NAorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIHJlbWFpbmRlcm5lYXIgYnkgMAorZGRybW4xMDEgcmVtYWluZGVybmVhciAgMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRybW4xMDIgcmVtYWluZGVybmVhciAgMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRybW4xMDMgcmVtYWluZGVybmVhciAtMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRybW4xMDQgcmVtYWluZGVybmVhciAtMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRybW4xMDUgcmVtYWluZGVybmVhciAgMC4wRTUgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRybW4xMDYgcmVtYWluZGVybmVhciAgMC4wMDAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorLS0gW1NvbWUgdGhpbmsgdGhpcyBuZXh0IGdyb3VwIHNob3VsZCBiZSBEaXZpc2lvbl9ieV96ZXJvIGV4Y2VwdGlvbiwgYnV0CistLSBJRUVFIDg1NCBpcyBleHBsaWNpdCB0aGF0IGl0IGlzIEludmFsaWQgb3BlcmF0aW9uIC4uIGZvcgorLS0gcmVtYWluZGVyLW5lYXIsIGFueXdheV0KK2Rkcm1uMTA3IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMDggcmVtYWluZGVybmVhciAgMC4wMSAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjEwOSByZW1haW5kZXJuZWFyICAwLjEgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTEwIHJlbWFpbmRlcm5lYXIgIDEgICAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMTEgcmVtYWluZGVybmVhciAgMSAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjExMiByZW1haW5kZXJuZWFyIDEwICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTEzIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMTQgcmVtYWluZGVybmVhciAxRSszODAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjExNSByZW1haW5kZXJuZWFyICAwLjAwMDEgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTE2IHJlbWFpbmRlcm5lYXIgIDAuMDEgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMTkgcmVtYWluZGVybmVhciAgMC4xICAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjEyMCByZW1haW5kZXJuZWFyICAxICAgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTIxIHJlbWFpbmRlcm5lYXIgIDEgICAgICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4xMjIgcmVtYWluZGVybmVhciAxMCAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjEyMyByZW1haW5kZXJuZWFyIDFFKzEwMCAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTI0IHJlbWFpbmRlcm5lYXIgMUUrMzg0ICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHplcm9zIG9uIGxlZnQKK2Rkcm1uMTMwIHJlbWFpbmRlcm5lYXIgIDAgICAgICAxICAgLT4gIDAKK2Rkcm1uMTMxIHJlbWFpbmRlcm5lYXIgIDAgICAgIC0xICAgLT4gIDAKK2Rkcm1uMTMyIHJlbWFpbmRlcm5lYXIgIDAuMCAgICAxICAgLT4gIDAuMAorZGRybW4xMzMgcmVtYWluZGVybmVhciAgMC4wICAgLTEgICAtPiAgMC4wCitkZHJtbjEzNCByZW1haW5kZXJuZWFyIC0wICAgICAgMSAgIC0+IC0wCitkZHJtbjEzNSByZW1haW5kZXJuZWFyIC0wICAgICAtMSAgIC0+IC0wCitkZHJtbjEzNiByZW1haW5kZXJuZWFyIC0wLjAgICAgMSAgIC0+IC0wLjAKK2Rkcm1uMTM3IHJlbWFpbmRlcm5lYXIgLTAuMCAgIC0xICAgLT4gLTAuMAorCistLSAwLjVlcnMKK2Rkcm1uMTQzIHJlbWFpbmRlcm5lYXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK2Rkcm1uMTQ0IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK2Rkcm1uMTQ1IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMDEgIC0+ICAwLjUwCitkZHJtbjE0NiByZW1haW5kZXJuZWFyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK2Rkcm1uMTQ3IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCitkZHJtbjE0OCByZW1haW5kZXJuZWFyICAgMC41MCAyLjAxICAtPiAgMC41MAorZGRybW4xNDkgcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKKy0tIHN0ZWFkaWVzCitkZHJtbjE1MCByZW1haW5kZXJuZWFyICAxICAxICAgLT4gMAorZGRybW4xNTEgcmVtYWluZGVybmVhciAgMSAgMiAgIC0+IDEKK2Rkcm1uMTUyIHJlbWFpbmRlcm5lYXIgIDEgIDMgICAtPiAxCitkZHJtbjE1MyByZW1haW5kZXJuZWFyICAxICA0ICAgLT4gMQorZGRybW4xNTQgcmVtYWluZGVybmVhciAgMSAgNSAgIC0+IDEKK2Rkcm1uMTU1IHJlbWFpbmRlcm5lYXIgIDEgIDYgICAtPiAxCitkZHJtbjE1NiByZW1haW5kZXJuZWFyICAxICA3ICAgLT4gMQorZGRybW4xNTcgcmVtYWluZGVybmVhciAgMSAgOCAgIC0+IDEKK2Rkcm1uMTU4IHJlbWFpbmRlcm5lYXIgIDEgIDkgICAtPiAxCitkZHJtbjE1OSByZW1haW5kZXJuZWFyICAxICAxMCAgLT4gMQorZGRybW4xNjAgcmVtYWluZGVybmVhciAgMSAgMSAgIC0+IDAKK2Rkcm1uMTYxIHJlbWFpbmRlcm5lYXIgIDIgIDEgICAtPiAwCitkZHJtbjE2MiByZW1haW5kZXJuZWFyICAzICAxICAgLT4gMAorZGRybW4xNjMgcmVtYWluZGVybmVhciAgNCAgMSAgIC0+IDAKK2Rkcm1uMTY0IHJlbWFpbmRlcm5lYXIgIDUgIDEgICAtPiAwCitkZHJtbjE2NSByZW1haW5kZXJuZWFyICA2ICAxICAgLT4gMAorZGRybW4xNjYgcmVtYWluZGVybmVhciAgNyAgMSAgIC0+IDAKK2Rkcm1uMTY3IHJlbWFpbmRlcm5lYXIgIDggIDEgICAtPiAwCitkZHJtbjE2OCByZW1haW5kZXJuZWFyICA5ICAxICAgLT4gMAorZGRybW4xNjkgcmVtYWluZGVybmVhciAgMTAgMSAgIC0+IDAKKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlcgorZGRybW4xNzEgcmVtYWluZGVybmVhciAgIDAuNCAgMS4wMjAgLT4gIDAuNDAwCitkZHJtbjE3MiByZW1haW5kZXJuZWFyICAgMC41MCAxLjAyMCAtPiAgMC41MDAKK2Rkcm1uMTczIHJlbWFpbmRlcm5lYXIgICAwLjUxIDEuMDIwIC0+ICAwLjUxMAorZGRybW4xNzQgcmVtYWluZGVybmVhciAgIDAuNTIgMS4wMjAgLT4gLTAuNTAwCitkZHJtbjE3NSByZW1haW5kZXJuZWFyICAgMC42ICAxLjAyMCAtPiAtMC40MjAKKworLS0gTW9yZSBmbGF2b3VycyBvZiByZW1haW5kZXJuZWFyIGJ5IDAKK2Rkcm1uMjAxIHJlbWFpbmRlcm5lYXIgIDAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGRybW4yMDIgcmVtYWluZGVybmVhciAgMC4wRTUgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkZHJtbjIwMyByZW1haW5kZXJuZWFyICAwLjAwMCAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rkcm1uMjA0IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjIwNSByZW1haW5kZXJuZWFyICAwLjAxICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4yMDYgcmVtYWluZGVybmVhciAgMC4xICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMjA3IHJlbWFpbmRlcm5lYXIgIDEgICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjIwOCByZW1haW5kZXJuZWFyICAxICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW4yMDkgcmVtYWluZGVybmVhciAxMCAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMjEwIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjIxMSByZW1haW5kZXJuZWFyIDFFKzM4MCAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSB0ZXN0cyBmcm9tIHRoZSBleHRlbmRlZCBzcGVjaWZpY2F0aW9uCitkZHJtbjIyMSByZW1haW5kZXJuZWFyIDIuMSAgICAgMyAgIC0+IC0wLjkKK2Rkcm1uMjIyIHJlbWFpbmRlcm5lYXIgIDEwICAgICA2ICAgLT4gLTIKK2Rkcm1uMjIzIHJlbWFpbmRlcm5lYXIgIDEwICAgICAzICAgLT4gIDEKK2Rkcm1uMjI0IHJlbWFpbmRlcm5lYXIgLTEwICAgICAzICAgLT4gLTEKK2Rkcm1uMjI1IHJlbWFpbmRlcm5lYXIgIDEwLjIgICAxICAgLT4gMC4yCitkZHJtbjIyNiByZW1haW5kZXJuZWFyICAxMCAgICAgMC4zIC0+IDAuMQorZGRybW4yMjcgcmVtYWluZGVybmVhciAgIDMuNiAgIDEuMyAtPiAtMC4zCisKKy0tIHNvbWUgZGlmZmVyZW5jZXMgZnJvbSByZW1haW5kZXIKK2Rkcm1uMjMxIHJlbWFpbmRlcm5lYXIgIC0wLjQgIDEuMDIwIC0+IC0wLjQwMAorZGRybW4yMzIgcmVtYWluZGVybmVhciAgLTAuNTAgMS4wMjAgLT4gLTAuNTAwCitkZHJtbjIzMyByZW1haW5kZXJuZWFyICAtMC41MSAxLjAyMCAtPiAtMC41MTAKK2Rkcm1uMjM0IHJlbWFpbmRlcm5lYXIgIC0wLjUyIDEuMDIwIC0+ICAwLjUwMAorZGRybW4yMzUgcmVtYWluZGVybmVhciAgLTAuNiAgMS4wMjAgLT4gIDAuNDIwCisKKy0tIGhpZ2ggWHMKK2Rkcm1uMjQwIHJlbWFpbmRlcm5lYXIgIDFFKzIgIDEuMDAgIC0+ICAwLjAwCisKKy0tIGRkcm1uM3h4IGFyZSBmcm9tIERpYWdCaWdEZWNpbWFsCitkZHJtbjMwMSByZW1haW5kZXJuZWFyICAgMSAgICAzICAgICAtPiAgMQorZGRybW4zMDIgcmVtYWluZGVybmVhciAgIDUgICAgNSAgICAgLT4gIDAKK2Rkcm1uMzAzIHJlbWFpbmRlcm5lYXIgICAxMyAgIDEwICAgIC0+ICAzCitkZHJtbjMwNCByZW1haW5kZXJuZWFyICAgMTMgICA1MCAgICAtPiAgMTMKK2Rkcm1uMzA1IHJlbWFpbmRlcm5lYXIgICAxMyAgIDEwMCAgIC0+ICAxMworZGRybW4zMDYgcmVtYWluZGVybmVhciAgIDEzICAgMTAwMCAgLT4gIDEzCitkZHJtbjMwNyByZW1haW5kZXJuZWFyICAgLjEzICAgIDEgICAtPiAgMC4xMworZGRybW4zMDggcmVtYWluZGVybmVhciAgIDAuMTMzICAxICAgLT4gIDAuMTMzCitkZHJtbjMwOSByZW1haW5kZXJuZWFyICAgMC4xMDMzIDEgICAtPiAgMC4xMDMzCitkZHJtbjMxMCByZW1haW5kZXJuZWFyICAgMS4wMzMgIDEgICAtPiAgMC4wMzMKK2Rkcm1uMzExIHJlbWFpbmRlcm5lYXIgICAxMC4zMyAgMSAgIC0+ICAwLjMzCitkZHJtbjMxMiByZW1haW5kZXJuZWFyICAgMTAuMzMgMTAgICAtPiAgMC4zMworZGRybW4zMTMgcmVtYWluZGVybmVhciAgIDEwMy4zICAxICAgLT4gIDAuMworZGRybW4zMTQgcmVtYWluZGVybmVhciAgIDEzMyAgIDEwICAgLT4gIDMKK2Rkcm1uMzE1IHJlbWFpbmRlcm5lYXIgICAxMDMzICAxMCAgIC0+ICAzCitkZHJtbjMxNiByZW1haW5kZXJuZWFyICAgMTAzMyAgNTAgICAtPiAtMTcKK2Rkcm1uMzE3IHJlbWFpbmRlcm5lYXIgICAxMDEuMCAgMyAgIC0+IC0xLjAKK2Rkcm1uMzE4IHJlbWFpbmRlcm5lYXIgICAxMDIuMCAgMyAgIC0+ICAwLjAKK2Rkcm1uMzE5IHJlbWFpbmRlcm5lYXIgICAxMDMuMCAgMyAgIC0+ICAxLjAKK2Rkcm1uMzIwIHJlbWFpbmRlcm5lYXIgICAyLjQwICAgMSAgIC0+ICAwLjQwCitkZHJtbjMyMSByZW1haW5kZXJuZWFyICAgMi40MDAgIDEgICAtPiAgMC40MDAKK2Rkcm1uMzIyIHJlbWFpbmRlcm5lYXIgICAyLjQgICAgMSAgIC0+ICAwLjQKK2Rkcm1uMzIzIHJlbWFpbmRlcm5lYXIgICAyLjQgICAgMiAgIC0+ICAwLjQKK2Rkcm1uMzI0IHJlbWFpbmRlcm5lYXIgICAyLjQwMCAgMiAgIC0+ICAwLjQwMAorZGRybW4zMjUgcmVtYWluZGVybmVhciAgIDEgICAwLjMgICAgLT4gIDAuMQorZGRybW4zMjYgcmVtYWluZGVybmVhciAgIDEgICAwLjMwICAgLT4gIDAuMTAKK2Rkcm1uMzI3IHJlbWFpbmRlcm5lYXIgICAxICAgMC4zMDAgIC0+ICAwLjEwMAorZGRybW4zMjggcmVtYWluZGVybmVhciAgIDEgICAwLjMwMDAgLT4gIDAuMTAwMAorZGRybW4zMjkgcmVtYWluZGVybmVhciAgIDEuMCAgICAwLjMgLT4gIDAuMQorZGRybW4zMzAgcmVtYWluZGVybmVhciAgIDEuMDAgICAwLjMgLT4gIDAuMTAKK2Rkcm1uMzMxIHJlbWFpbmRlcm5lYXIgICAxLjAwMCAgMC4zIC0+ICAwLjEwMAorZGRybW4zMzIgcmVtYWluZGVybmVhciAgIDEuMDAwMCAwLjMgLT4gIDAuMTAwMAorZGRybW4zMzMgcmVtYWluZGVybmVhciAgIDAuNSAgMiAgICAgLT4gIDAuNQorZGRybW4zMzQgcmVtYWluZGVybmVhciAgIDAuNSAgMi4xICAgLT4gIDAuNQorZGRybW4zMzUgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK2Rkcm1uMzM2IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorZGRybW4zMzcgcmVtYWluZGVybmVhciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK2Rkcm1uMzM4IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitkZHJtbjMzOSByZW1haW5kZXJuZWFyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworZGRybW4zNDAgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMSAgICAtPiAgLTFFLTcKK2Rkcm1uMzQxIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAxICAgIC0+ICAtMUUtOAorZGRybW4zNDIgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDAxICAgIC0+ICAtMUUtOQorZGRybW4zNDMgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDAwMSAgICAtPiAgLTFFLTEwCitkZHJtbjM0NCByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDAwMSAgICAtPiAgLTFFLTExCitkZHJtbjM0NSByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5ICAgIC0+ICAxRS03CitkZHJtbjM0NiByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OSAgICAtPiAgMUUtOAorZGRybW4zNDcgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTk5ICAgIC0+ICAxRS05CitkZHJtbjM0OCByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTk5ICAgIC0+ICAxRS0xMAorZGRybW4zNDkgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTk5OTkgICAgLT4gIDFFLTExCitkZHJtbjM1MCByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTk5OTkgICAgLT4gIDFFLTEyCisKK2Rkcm1uMzUxIHJlbWFpbmRlcm5lYXIgICAwLjAzICA3ICAtPiAgMC4wMworZGRybW4zNTIgcmVtYWluZGVybmVhciAgIDUgICAyICAgIC0+ICAxCitkZHJtbjM1MyByZW1haW5kZXJuZWFyICAgNC4xICAgMiAgICAtPiAgMC4xCitkZHJtbjM1NCByZW1haW5kZXJuZWFyICAgNC4wMSAgIDIgICAgLT4gIDAuMDEKK2Rkcm1uMzU1IHJlbWFpbmRlcm5lYXIgICA0LjAwMSAgIDIgICAgLT4gIDAuMDAxCitkZHJtbjM1NiByZW1haW5kZXJuZWFyICAgNC4wMDAxICAgMiAgICAtPiAgMC4wMDAxCitkZHJtbjM1NyByZW1haW5kZXJuZWFyICAgNC4wMDAwMSAgIDIgICAgLT4gIDAuMDAwMDEKK2Rkcm1uMzU4IHJlbWFpbmRlcm5lYXIgICA0LjAwMDAwMSAgIDIgICAgLT4gIDAuMDAwMDAxCitkZHJtbjM1OSByZW1haW5kZXJuZWFyICAgNC4wMDAwMDAxICAgMiAgICAtPiAgMUUtNworCitkZHJtbjM2MCByZW1haW5kZXJuZWFyICAgMS4yICAgMC43MzQ1IC0+IC0wLjI2OTAKK2Rkcm1uMzYxIHJlbWFpbmRlcm5lYXIgICAwLjggICAxMiAgICAgLT4gIDAuOAorZGRybW4zNjIgcmVtYWluZGVybmVhciAgIDAuOCAgIDAuMiAgICAtPiAgMC4wCitkZHJtbjM2MyByZW1haW5kZXJuZWFyICAgMC44ICAgMC4zICAgIC0+IC0wLjEKK2Rkcm1uMzY0IHJlbWFpbmRlcm5lYXIgICAwLjgwMCAgIDEyICAgLT4gIDAuODAwCitkZHJtbjM2NSByZW1haW5kZXJuZWFyICAgMC44MDAgICAxLjcgIC0+ICAwLjgwMAorZGRybW4zNjYgcmVtYWluZGVybmVhciAgIDIuNDAwICAgMiAgICAtPiAgMC40MDAKKworLS0gcm91bmQgdG8gZXZlbgorZGRybW4zNzEgcmVtYWluZGVybmVhciAgIDEyMSAgICAgMiAgICAtPiAgMQorZGRybW4zNzIgcmVtYWluZGVybmVhciAgIDEyMiAgICAgMiAgICAtPiAgMAorZGRybW4zNzMgcmVtYWluZGVybmVhciAgIDEyMyAgICAgMiAgICAtPiAtMQorZGRybW4zNzQgcmVtYWluZGVybmVhciAgIDEyNCAgICAgMiAgICAtPiAgMAorZGRybW4zNzUgcmVtYWluZGVybmVhciAgIDEyNSAgICAgMiAgICAtPiAgMQorZGRybW4zNzYgcmVtYWluZGVybmVhciAgIDEyNiAgICAgMiAgICAtPiAgMAorZGRybW4zNzcgcmVtYWluZGVybmVhciAgIDEyNyAgICAgMiAgICAtPiAtMQorCitkZHJtbjM4MSByZW1haW5kZXJuZWFyIDEyMzQ1ICAxICAgICAgICAgLT4gIDAKK2Rkcm1uMzgyIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDAwMSAgICAtPiAtMC4yMzQ0CitkZHJtbjM4MyByZW1haW5kZXJuZWFyIDEyMzQ1ICAxLjAwMSAgICAgLT4gLTAuMzMzCitkZHJtbjM4NCByZW1haW5kZXJuZWFyIDEyMzQ1ICAxLjAxICAgICAgLT4gLTAuMjMKK2Rkcm1uMzg1IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMSAgICAgICAtPiAtMC4zCitkZHJtbjM4NiByZW1haW5kZXJuZWFyIDEyMzU1ICA0ICAgICAgICAgLT4gLTEKK2Rkcm1uMzg3IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQgICAgICAgICAtPiAgMQorZGRybW4zODggcmVtYWluZGVybmVhciAxMjM1NSAgNC4wMDAxICAgIC0+IC0xLjMwODkKK2Rkcm1uMzg5IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuMDAwMSAgICAtPiAgMC42OTE0CitkZHJtbjM5MCByZW1haW5kZXJuZWFyIDEyMzQ1ICA0LjkgICAgICAgLT4gIDEuOQorZGRybW4zOTEgcmVtYWluZGVybmVhciAxMjM0NSAgNC45OSAgICAgIC0+IC0wLjI2CitkZHJtbjM5MiByZW1haW5kZXJuZWFyIDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDIuNDY5CitkZHJtbjM5MyByZW1haW5kZXJuZWFyIDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDAuMjQ2OQorZGRybW4zOTQgcmVtYWluZGVybmVhciAxMjM0NSAgNSAgICAgICAgIC0+ICAwCitkZHJtbjM5NSByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAwMDEgICAgLT4gLTAuMjQ2OQorZGRybW4zOTYgcmVtYWluZGVybmVhciAxMjM0NSAgNS4wMDEgICAgIC0+IC0yLjQ2OQorZGRybW4zOTcgcmVtYWluZGVybmVhciAxMjM0NSAgNS4wMSAgICAgIC0+ICAwLjM2CitkZHJtbjM5OCByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjEgICAgICAgLT4gLTIuMQorCistLSB0aGUgbmFzdHkgZGl2aXNpb24tYnktMSBjYXNlcworZGRybW40MDEgcmVtYWluZGVybmVhciAgIDAuNCAgICAgICAgIDEgICAtPiAgMC40CitkZHJtbjQwMiByZW1haW5kZXJuZWFyICAgMC40NSAgICAgICAgMSAgIC0+ICAwLjQ1CitkZHJtbjQwMyByZW1haW5kZXJuZWFyICAgMC40NTUgICAgICAgMSAgIC0+ICAwLjQ1NQorZGRybW40MDQgcmVtYWluZGVybmVhciAgIDAuNDU1NSAgICAgIDEgICAtPiAgMC40NTU1CitkZHJtbjQwNSByZW1haW5kZXJuZWFyICAgMC40NTU1NSAgICAgMSAgIC0+ICAwLjQ1NTU1CitkZHJtbjQwNiByZW1haW5kZXJuZWFyICAgMC40NTU1NTUgICAgMSAgIC0+ICAwLjQ1NTU1NQorZGRybW40MDcgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NSAgIDEgICAtPiAgMC40NTU1NTU1CitkZHJtbjQwOCByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NSAgMSAgIC0+ICAwLjQ1NTU1NTU1CitkZHJtbjQwOSByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTU1NTU1NQorLS0gd2l0aCBzcGlsbC4uLiBbNDEyIGV4ZXJjaXNlcyBzdGlja3RhYiBsb29wXQorZGRybW40MTEgcmVtYWluZGVybmVhciAgIDAuNSAgICAgICAgIDEgICAtPiAgMC41CitkZHJtbjQxMiByZW1haW5kZXJuZWFyICAgMC41NSAgICAgICAgMSAgIC0+IC0wLjQ1CitkZHJtbjQxMyByZW1haW5kZXJuZWFyICAgMC41NTUgICAgICAgMSAgIC0+IC0wLjQ0NQorZGRybW40MTQgcmVtYWluZGVybmVhciAgIDAuNTU1NSAgICAgIDEgICAtPiAtMC40NDQ1CitkZHJtbjQxNSByZW1haW5kZXJuZWFyICAgMC41NTU1NSAgICAgMSAgIC0+IC0wLjQ0NDQ1CitkZHJtbjQxNiByZW1haW5kZXJuZWFyICAgMC41NTU1NTUgICAgMSAgIC0+IC0wLjQ0NDQ0NQorZGRybW40MTcgcmVtYWluZGVybmVhciAgIDAuNTU1NTU1NSAgIDEgICAtPiAtMC40NDQ0NDQ1CitkZHJtbjQxOCByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1NSAgMSAgIC0+IC0wLjQ0NDQ0NDQ1CitkZHJtbjQxOSByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1NTUgMSAgIC0+IC0wLjQ0NDQ0NDQ0NQorCistLSBmb2xkZG93bnMKK2Rkcm1uNDIxIHJlbWFpbmRlcm5lYXIgICAxRSszODQgICAgICAgMSAgLT4gICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZGRybW40MjIgcmVtYWluZGVybmVhciAgIDFFKzM4NCAgMUUrMzgzICAtPiAgIDBFKzM2OSBDbGFtcGVkCitkZHJtbjQyMyByZW1haW5kZXJuZWFyICAgMUUrMzg0ICAyRSszODMgIC0+ICAgMEUrMzY5IENsYW1wZWQKK2Rkcm1uNDI0IHJlbWFpbmRlcm5lYXIgICAxRSszODQgIDNFKzM4MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorZGRybW40MjUgcmVtYWluZGVybmVhciAgIDFFKzM4NCAgNEUrMzgzICAtPiAgIDIuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitkZHJtbjQyNiByZW1haW5kZXJuZWFyICAgMUUrMzg0ICA1RSszODMgIC0+ICAgMEUrMzY5IENsYW1wZWQKK2Rkcm1uNDI3IHJlbWFpbmRlcm5lYXIgICAxRSszODQgIDZFKzM4MyAgLT4gIC0yLjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorZGRybW40MjggcmVtYWluZGVybmVhciAgIDFFKzM4NCAgN0UrMzgzICAtPiAgIDMuMDAwMDAwMDAwMDAwMDBFKzM4MyBDbGFtcGVkCitkZHJtbjQyOSByZW1haW5kZXJuZWFyICAgMUUrMzg0ICA4RSszODMgIC0+ICAgMi4wMDAwMDAwMDAwMDAwMEUrMzgzIENsYW1wZWQKK2Rkcm1uNDMwIHJlbWFpbmRlcm5lYXIgICAxRSszODQgIDlFKzM4MyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwRSszODMgQ2xhbXBlZAorLS0gdGluaWVzCitkZHJtbjQzMSByZW1haW5kZXJuZWFyICAgMUUtMzk3ICAxRS0zOTggIC0+ICAgMEUtMzk4CitkZHJtbjQzMiByZW1haW5kZXJuZWFyICAgMUUtMzk3ICAyRS0zOTggIC0+ICAgMEUtMzk4CitkZHJtbjQzMyByZW1haW5kZXJuZWFyICAgMUUtMzk3ICAzRS0zOTggIC0+ICAgMUUtMzk4IFN1Ym5vcm1hbAorZGRybW40MzQgcmVtYWluZGVybmVhciAgIDFFLTM5NyAgNEUtMzk4ICAtPiAgIDJFLTM5OCBTdWJub3JtYWwKK2Rkcm1uNDM1IHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgIDVFLTM5OCAgLT4gICAwRS0zOTgKK2Rkcm1uNDM2IHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgIDZFLTM5OCAgLT4gIC0yRS0zOTggU3Vibm9ybWFsCitkZHJtbjQzNyByZW1haW5kZXJuZWFyICAgMUUtMzk3ICA3RS0zOTggIC0+ICAgM0UtMzk4IFN1Ym5vcm1hbAorZGRybW40MzggcmVtYWluZGVybmVhciAgIDFFLTM5NyAgOEUtMzk4ICAtPiAgIDJFLTM5OCBTdWJub3JtYWwKK2Rkcm1uNDM5IHJlbWFpbmRlcm5lYXIgICAxRS0zOTcgIDlFLTM5OCAgLT4gICAxRS0zOTggU3Vibm9ybWFsCitkZHJtbjQ0MCByZW1haW5kZXJuZWFyICAgMUUtMzk3IDEwRS0zOTggIC0+ICAgMEUtMzk4CitkZHJtbjQ0MSByZW1haW5kZXJuZWFyICAgMUUtMzk3IDExRS0zOTggIC0+ICAtMUUtMzk4IFN1Ym5vcm1hbAorZGRybW40NDIgcmVtYWluZGVybmVhciAxMDBFLTM5NyAxMUUtMzk4ICAtPiAgLTFFLTM5OCBTdWJub3JtYWwKK2Rkcm1uNDQzIHJlbWFpbmRlcm5lYXIgMTAwRS0zOTcgMjBFLTM5OCAgLT4gICAwRS0zOTgKK2Rkcm1uNDQ0IHJlbWFpbmRlcm5lYXIgMTAwRS0zOTcgMjFFLTM5OCAgLT4gIC04RS0zOTggU3Vibm9ybWFsCitkZHJtbjQ0NSByZW1haW5kZXJuZWFyIDEwMEUtMzk3IDMwRS0zOTggIC0+IDEuMEUtMzk3IFN1Ym5vcm1hbAorCistLSB6ZXJvIHNpZ25zCitkZHJtbjY1MCByZW1haW5kZXJuZWFyICAxICAxIC0+ICAwCitkZHJtbjY1MSByZW1haW5kZXJuZWFyIC0xICAxIC0+IC0wCitkZHJtbjY1MiByZW1haW5kZXJuZWFyICAxIC0xIC0+ICAwCitkZHJtbjY1MyByZW1haW5kZXJuZWFyIC0xIC0xIC0+IC0wCitkZHJtbjY1NCByZW1haW5kZXJuZWFyICAwICAxIC0+ICAwCitkZHJtbjY1NSByZW1haW5kZXJuZWFyIC0wICAxIC0+IC0wCitkZHJtbjY1NiByZW1haW5kZXJuZWFyICAwIC0xIC0+ICAwCitkZHJtbjY1NyByZW1haW5kZXJuZWFyIC0wIC0xIC0+IC0wCitkZHJtbjY1OCByZW1haW5kZXJuZWFyICAwLjAwICAxICAtPiAgMC4wMAorZGRybW42NTkgcmVtYWluZGVybmVhciAtMC4wMCAgMSAgLT4gLTAuMDAKKworLS0gU3BlY2lhbHMKK2Rkcm1uNjgwIHJlbWFpbmRlcm5lYXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjgxIHJlbWFpbmRlcm5lYXIgIEluZiAgLTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjgyIHJlbWFpbmRlcm5lYXIgIEluZiAgLTEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjgzIHJlbWFpbmRlcm5lYXIgIEluZiAgIDAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjg0IHJlbWFpbmRlcm5lYXIgIEluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjg1IHJlbWFpbmRlcm5lYXIgIEluZiAgIDEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjg2IHJlbWFpbmRlcm5lYXIgIEluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjg3IHJlbWFpbmRlcm5lYXIgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNjg4IHJlbWFpbmRlcm5lYXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkZHJtbjY4OSByZW1haW5kZXJuZWFyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjY5MSByZW1haW5kZXJuZWFyIC0xICAgICBJbmYgICAtPiAtMQorZGRybW42OTIgcmVtYWluZGVybmVhciAgMCAgICAgSW5mICAgLT4gIDAKK2Rkcm1uNjkzIHJlbWFpbmRlcm5lYXIgLTAgICAgIEluZiAgIC0+IC0wCitkZHJtbjY5NCByZW1haW5kZXJuZWFyICAxICAgICBJbmYgICAtPiAgMQorZGRybW42OTUgcmVtYWluZGVybmVhciAgMTAwMCAgSW5mICAgLT4gIDEwMDAKK2Rkcm1uNjk2IHJlbWFpbmRlcm5lYXIgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGRybW43MDAgcmVtYWluZGVybmVhciAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDEgcmVtYWluZGVybmVhciAtSW5mICAtMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDIgcmVtYWluZGVybmVhciAtSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDMgcmVtYWluZGVybmVhciAtSW5mICAtMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDQgcmVtYWluZGVybmVhciAtSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDUgcmVtYWluZGVybmVhciAtSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDYgcmVtYWluZGVybmVhciAtSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDcgcmVtYWluZGVybmVhciAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDggcmVtYWluZGVybmVhciAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43MDkgcmVtYWluZGVybmVhciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK2Rkcm1uNzEwIHJlbWFpbmRlcm5lYXIgLTEgICAgLUluZiAgIC0+IC0xCitkZHJtbjcxMSByZW1haW5kZXJuZWFyIC0wICAgIC1JbmYgICAtPiAtMAorZGRybW43MTIgcmVtYWluZGVybmVhciAgMCAgICAtSW5mICAgLT4gIDAKK2Rkcm1uNzEzIHJlbWFpbmRlcm5lYXIgIDEgICAgLUluZiAgIC0+ICAxCitkZHJtbjcxNCByZW1haW5kZXJuZWFyICAxMDAwIC1JbmYgICAtPiAgMTAwMAorZGRybW43MTUgcmVtYWluZGVybmVhciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHJtbjcyMSByZW1haW5kZXJuZWFyICBOYU4gLUluZiAgICAtPiAgTmFOCitkZHJtbjcyMiByZW1haW5kZXJuZWFyICBOYU4gLTEwMDAgICAtPiAgTmFOCitkZHJtbjcyMyByZW1haW5kZXJuZWFyICBOYU4gLTEgICAgICAtPiAgTmFOCitkZHJtbjcyNCByZW1haW5kZXJuZWFyICBOYU4gLTAgICAgICAtPiAgTmFOCitkZHJtbjcyNSByZW1haW5kZXJuZWFyIC1OYU4gIDAgICAgICAtPiAtTmFOCitkZHJtbjcyNiByZW1haW5kZXJuZWFyICBOYU4gIDEgICAgICAtPiAgTmFOCitkZHJtbjcyNyByZW1haW5kZXJuZWFyICBOYU4gIDEwMDAgICAtPiAgTmFOCitkZHJtbjcyOCByZW1haW5kZXJuZWFyICBOYU4gIEluZiAgICAtPiAgTmFOCitkZHJtbjcyOSByZW1haW5kZXJuZWFyICBOYU4gLU5hTiAgICAtPiAgTmFOCitkZHJtbjczMCByZW1haW5kZXJuZWFyIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkZHJtbjczMSByZW1haW5kZXJuZWFyIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkZHJtbjczMiByZW1haW5kZXJuZWFyIC0xICAgIE5hTiAgICAtPiAgTmFOCitkZHJtbjczMyByZW1haW5kZXJuZWFyIC0wICAgLU5hTiAgICAtPiAtTmFOCitkZHJtbjczNCByZW1haW5kZXJuZWFyICAwICAgIE5hTiAgICAtPiAgTmFOCitkZHJtbjczNSByZW1haW5kZXJuZWFyICAxICAgLU5hTiAgICAtPiAtTmFOCitkZHJtbjczNiByZW1haW5kZXJuZWFyICAxMDAwIE5hTiAgICAtPiAgTmFOCitkZHJtbjczNyByZW1haW5kZXJuZWFyICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2Rkcm1uNzQxIHJlbWFpbmRlcm5lYXIgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc0MiByZW1haW5kZXJuZWFyICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NDMgcmVtYWluZGVybmVhciAtc05hTiAtMSAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzQ0IHJlbWFpbmRlcm5lYXIgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc0NSByZW1haW5kZXJuZWFyICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NDYgcmVtYWluZGVybmVhciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzQ3IHJlbWFpbmRlcm5lYXIgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc0OSByZW1haW5kZXJuZWFyICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NTAgcmVtYWluZGVybmVhciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzUxIHJlbWFpbmRlcm5lYXIgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc1MiByZW1haW5kZXJuZWFyIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NTMgcmVtYWluZGVybmVhciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzU0IHJlbWFpbmRlcm5lYXIgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc1NSByZW1haW5kZXJuZWFyIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NTYgcmVtYWluZGVybmVhciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzU3IHJlbWFpbmRlcm5lYXIgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJtbjc1OCByZW1haW5kZXJuZWFyICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRybW43NTkgcmVtYWluZGVybmVhciAgSW5mIC1zTmFOICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnaW5nIE5hTnMKK2Rkcm1uNzYwIHJlbWFpbmRlcm5lYXIgIE5hTjEgICBOYU43ICAgLT4gIE5hTjEKK2Rkcm1uNzYxIHJlbWFpbmRlcm5lYXIgc05hTjIgICBOYU44ICAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzYyIHJlbWFpbmRlcm5lYXIgIE5hTjMgIHNOYU45ICAgLT4gIE5hTjkgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzYzIHJlbWFpbmRlcm5lYXIgc05hTjQgIHNOYU4xMCAgLT4gIE5hTjQgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uNzY0IHJlbWFpbmRlcm5lYXIgICAgMTUgICBOYU4xMSAgLT4gIE5hTjExCitkZHJtbjc2NSByZW1haW5kZXJuZWFyICBOYU42ICAgTmFOMTIgIC0+ICBOYU42CitkZHJtbjc2NiByZW1haW5kZXJuZWFyICBJbmYgICAgTmFOMTMgIC0+ICBOYU4xMworZGRybW43NjcgcmVtYWluZGVybmVhciAgTmFOMTQgIC1JbmYgICAtPiAgTmFOMTQKK2Rkcm1uNzY4IHJlbWFpbmRlcm5lYXIgICAgMCAgICBOYU4xNSAgLT4gIE5hTjE1CitkZHJtbjc2OSByZW1haW5kZXJuZWFyICBOYU4xNiAgIC0wICAgIC0+ICBOYU4xNgorCistLSBlZGdlIGNhc2VzIG9mIGltcG9zc2libGUKK2Rkcm1uNzcwICByZW1haW5kZXJuZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAxMCAgICAtPiAtNAorZGRybW43NzEgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgICAxICAgIC0+ICAwCitkZHJtbjc3MiAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDAuMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkZHJtbjc3MyAgcmVtYWluZGVybmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDAuMDEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK2Rkcm1uODAxIHJlbWFpbmRlcm5lYXIgMTIzNDU2NzgwMDAgMTAwIC0+IDAKK2Rkcm1uODAyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK2Rkcm1uODAzIHJlbWFpbmRlcm5lYXIgMTIzNDU2NzgwMCAgMTAgIC0+IDAKK2Rkcm1uODA0IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwICAgIC0+IDEKK2Rkcm1uODA1IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK2Rkcm1uODA2IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkwICAgIC0+IDEKK2Rkcm1uODA3IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MSAgMTAgIC0+IDEKK2Rkcm1uODA4IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK2Rkcm1uODA5IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MDEgMTAwIC0+IDEKK2Rkcm1uODEwIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK2Rkcm1uODExIHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5NiAgMTAgIC0+IC00CitkZHJtbjgxMiByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKK2Rkcm1uODIxIHJlbWFpbmRlcm5lYXIgMTIzNDU2NzgwMDAgMTAwIC0+IDAKK2Rkcm1uODIyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK2Rkcm1uODIzIHJlbWFpbmRlcm5lYXIgMTIzNDU2NzgwMCAgMTAgIC0+IDAKK2Rkcm1uODI0IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwICAgIC0+IDEKK2Rkcm1uODI1IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK2Rkcm1uODI2IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkwICAgIC0+IDEKK2Rkcm1uODI3IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MSAgMTAgIC0+IDEKK2Rkcm1uODI4IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK2Rkcm1uODI5IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MDEgMTAwIC0+IDEKK2Rkcm1uODMwIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK2Rkcm1uODMxIHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5NiAgMTAgIC0+IC00CitkZHJtbjgzMiByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKKy0tIGZyb20gZGl2aWRlaW50CitkZHJtbjg0MCByZW1haW5kZXJuZWFyICAxMDAwMDAwMDAuMCAgIDEgIC0+ICAwLjAKK2Rkcm1uODQxIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMC40ICAgMSAgLT4gIDAuNAorZGRybW44NDIgcmVtYWluZGVybmVhciAgMTAwMDAwMDAwLjUgICAxICAtPiAgMC41CitkZHJtbjg0MyByZW1haW5kZXJuZWFyICAxMDAwMDAwMDAuOSAgIDEgIC0+IC0wLjEKK2Rkcm1uODQ0IHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMC45OTkgMSAgLT4gLTAuMDAxCitkZHJtbjg1MCByZW1haW5kZXJuZWFyICAxMDAwMDAwMDMgICAgIDUgIC0+IC0yCitkZHJtbjg1MSByZW1haW5kZXJuZWFyICAxMDAwMDAwMyAgICAgIDUgIC0+IC0yCitkZHJtbjg1MiByZW1haW5kZXJuZWFyICAxMDAwMDAzICAgICAgIDUgIC0+IC0yCitkZHJtbjg1MyByZW1haW5kZXJuZWFyICAxMDAwMDMgICAgICAgIDUgIC0+IC0yCitkZHJtbjg1NCByZW1haW5kZXJuZWFyICAxMDAwMyAgICAgICAgIDUgIC0+IC0yCitkZHJtbjg1NSByZW1haW5kZXJuZWFyICAxMDAzICAgICAgICAgIDUgIC0+IC0yCitkZHJtbjg1NiByZW1haW5kZXJuZWFyICAxMDMgICAgICAgICAgIDUgIC0+IC0yCitkZHJtbjg1NyByZW1haW5kZXJuZWFyICAxMyAgICAgICAgICAgIDUgIC0+IC0yCitkZHJtbjg1OCByZW1haW5kZXJuZWFyICAxICAgICAgICAgICAgIDUgIC0+ICAxCisKKy0tIFZsYWRpbWlyJ3MgY2FzZXMgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkZHJtbjg2MCByZW1haW5kZXJuZWFyIDEyMy4wZTEgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRybW44NjEgcmVtYWluZGVybmVhciAxMjMwICAgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2Rkcm1uODYyIHJlbWFpbmRlcm5lYXIgMTIuM2UyICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkZHJtbjg2MyByZW1haW5kZXJuZWFyIDEuMjNlMyAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZGRybW44NjQgcmVtYWluZGVybmVhciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2Rkcm1uODcwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg3MSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAxMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44NzIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgIDEwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODczIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgMTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg3NCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAxMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44NzUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgIDEwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODc2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgMTAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg3NyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAxMDAwMDAwMDAgLT4gMTIzMAorZGRybW44NzggcmVtYWluZGVybmVhciAxMjMwICAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODc5IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAxMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg4MCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgIDEwMDAwMDAgLT4gMTIzMAorZGRybW44ODEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgMTAwMDAwIC0+IDEyMzAKK2Rkcm1uODgyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAxMDAwMCAtPiAxMjMwCitkZHJtbjg4MyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgIDEwMDAgLT4gIDIzMAorZGRybW44ODQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgMTAwIC0+ICAgMzAKK2Rkcm1uODg1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAxMCAtPiAgICAwCitkZHJtbjg4NiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgIDEgLT4gICAgMAorCitkZHJtbjg5MCByZW1haW5kZXJuZWFyIDEyM2UxICAgIDIwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44OTEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgMjAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODkyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAyMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg5MyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgIDIwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44OTQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgMjAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODk1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAyMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjg5NiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgIDIwMDAwMDAwMDAgLT4gMTIzMAorZGRybW44OTcgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgMjAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uODk5IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAyMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkwMCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgIDIwMDAwMDAgLT4gMTIzMAorZGRybW45MDEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgMjAwMDAwIC0+IDEyMzAKK2Rkcm1uOTAyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAyMDAwMCAtPiAxMjMwCitkZHJtbjkwMyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgIDIwMDAgLT4gLTc3MAorZGRybW45MDQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgMjAwIC0+ICAgMzAKK2Rkcm1uOTA1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAyMCAtPiAgLTEwCitkZHJtbjkwNiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgIDIgLT4gICAgMAorCitkZHJtbjkxMCByZW1haW5kZXJuZWFyIDEyM2UxICAgIDUwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MTEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgNTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTEyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICA1MDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkxMyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgIDUwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MTQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgNTAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTE1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICA1MDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkxNiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgIDUwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MTcgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgNTAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTE5IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICA1MDAwMDAwMCAtPiAxMjMwCitkZHJtbjkyMCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgIDUwMDAwMDAgLT4gMTIzMAorZGRybW45MjEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgNTAwMDAwIC0+IDEyMzAKK2Rkcm1uOTIyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICA1MDAwMCAtPiAxMjMwCitkZHJtbjkyMyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgIDUwMDAgLT4gMTIzMAorZGRybW45MjQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgNTAwIC0+ICAyMzAKK2Rkcm1uOTI1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICA1MCAtPiAgLTIwCitkZHJtbjkyNiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgIDUgLT4gICAgMAorCitkZHJtbjkzMCByZW1haW5kZXJuZWFyIDEyM2UxICAgIDkwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MzEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgOTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTMyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICA5MDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkzMyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgIDkwMDAwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MzQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgOTAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTM1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICA5MDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjkzNiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgIDkwMDAwMDAwMDAgLT4gMTIzMAorZGRybW45MzcgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgOTAwMDAwMDAwIC0+IDEyMzAKK2Rkcm1uOTM5IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICA5MDAwMDAwMCAtPiAxMjMwCitkZHJtbjk0MCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgIDkwMDAwMDAgLT4gMTIzMAorZGRybW45NDEgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgOTAwMDAwIC0+IDEyMzAKK2Rkcm1uOTQyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICA5MDAwMCAtPiAxMjMwCitkZHJtbjk0MyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgIDkwMDAgLT4gMTIzMAorZGRybW45NDQgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgOTAwIC0+ICAzMzAKK2Rkcm1uOTQ1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICA5MCAtPiAgLTMwCitkZHJtbjk0NiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAgIDkgLT4gICAtMworCitkZHJtbjk1MCByZW1haW5kZXJuZWFyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkZHJtbjk2MSByZW1haW5kZXJuZWFyIDEyM2UxICAgMjk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2MiByZW1haW5kZXJuZWFyIDEyM2UxICAgMzk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2MyByZW1haW5kZXJuZWFyIDEyM2UxICAgNDk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2NCByZW1haW5kZXJuZWFyIDEyM2UxICAgNTk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2NSByZW1haW5kZXJuZWFyIDEyM2UxICAgNjk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2NiByZW1haW5kZXJuZWFyIDEyM2UxICAgNzk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2NyByZW1haW5kZXJuZWFyIDEyM2UxICAgODk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2OCByZW1haW5kZXJuZWFyIDEyM2UxICAgOTk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkZHJtbjk2OSByZW1haW5kZXJuZWFyIDEyM2UxICAgOTg3NjU0MzIxMDk4NzY1NCAtPiAxMjMwCisKK2Rkcm1uOTgwIHJlbWFpbmRlcm5lYXIgMTIzZTEgMTAwMEUyOTkgLT4gMS4yM0UrMyAgLS0gMTIzRSsxIGludGVybmFsbHkKKworCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIFtmcm9tIGRpdmlkZV0KK2Rkcm1uMTA1MSByZW1haW5kZXJuZWFyICAxZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rkcm1uMTA1MiByZW1haW5kZXJuZWFyICAxZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rkcm1uMTA1MyByZW1haW5kZXJuZWFyIC0xZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rkcm1uMTA1NCByZW1haW5kZXJuZWFyIC0xZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rkcm1uMTA1NSByZW1haW5kZXJuZWFyICAxZS0yNzcgIDFlKzMxMSAtPiAgMUUtMjc3CitkZHJtbjEwNTYgcmVtYWluZGVybmVhciAgMWUtMjc3IC0xZSszMTEgLT4gIDFFLTI3NworZGRybW4xMDU3IHJlbWFpbmRlcm5lYXIgLTFlLTI3NyAgMWUrMzExIC0+IC0xRS0yNzcKK2Rkcm1uMTA1OCByZW1haW5kZXJuZWFyIC0xZS0yNzcgLTFlKzMxMSAtPiAtMUUtMjc3CisKKy0tIGRlc3RydWN0aXZlIHN1YnRyYWN0CitkZHJtbjExMDAgcmVtYWluZGVyTmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgMS4wMDAwMDAwMDAwMDAwMDEgIC0+ICAtMC4yMzQ1Njc4OTAxMjM0NTUKK2Rkcm1uMTEwMSByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAgMS4wMDAwMDAwMDAwMDAwMSAgLT4gICAtMC4zNDU2Nzg5MDEyMzQ0NAorZGRybW4xMTAyIHJlbWFpbmRlck5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgICAgMS4wMDAwMDAwMDAwMDAxICAtPiAgICAtMC40NTY3ODkwMTIzMzMzCitkZHJtbjExMDMgcmVtYWluZGVyTmVhciAgMTIzNDU2Nzg5MDEyMzQ1NSAgNC4wMDAwMDAwMDAwMDAwMDEgIC0+ICAtMS4zMDg2NDE5NzI1MzA4NjQKK2Rkcm1uMTEwNCByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU2ICA0LjAwMDAwMDAwMDAwMDAwMSAgLT4gIC0wLjMwODY0MTk3MjUzMDg2NAorZGRybW4xMTE1IHJlbWFpbmRlck5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgICAgNC45OTk5OTk5OTk5OTk5ICAtPiAgICAgMC42OTEzNTc4MDI0Njk2CitkZHJtbjExMTYgcmVtYWluZGVyTmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDQuOTk5OTk5OTk5OTk5OTkgIC0+ICAgLTEuNTMwODY0MjE5NzUzMDgKK2Rkcm1uMTExNyByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU2ICA0Ljk5OTk5OTk5OTk5OTk5OSAgLT4gICAxLjI0NjkxMzU3ODAyNDY5MQorZGRybW4xMTE4IHJlbWFpbmRlck5lYXIgIDEyMzQ1Njc4OTAxMjM0NTYgIDUuMDAwMDAwMDAwMDAwMDAxICAtPiAgIDAuNzUzMDg2NDIxOTc1MzA5CitkZHJtbjExMTkgcmVtYWluZGVyTmVhciAgMTIzNDU2Nzg5MDEyMzQ1NiAgIDUuMDAwMDAwMDAwMDAwMDEgIC0+ICAgLTEuNDY5MTM1NzgwMjQ2OTEKK2Rkcm1uMTExMCByZW1haW5kZXJOZWFyICAxMjM0NTY3ODkwMTIzNDU2ICAgIDUuMDAwMDAwMDAwMDAwMSAgLT4gICAgIDEuMzA4NjQyMTk3NTMxNAorCistLSBOdWxsIHRlc3RzCitkZHJtbjEwMDAgcmVtYWluZGVybmVhciAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm1uMTAwMSByZW1haW5kZXJuZWFyICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUm90YXRlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkUm90YXRlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIwZmUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRSb3RhdGUuZGVjVGVzdApAQCAtMCwwICsxLDI2MiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFJvdGF0ZS5kZWNUZXN0IC0tIHJvdGF0ZSBhIGRlY0RvdWJsZSBjb2VmZmljaWVudCBsZWZ0IG9yIHJpZ2h0ICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2Rkcm90MDAxIHJvdGF0ZSAgICAgICAgICAgICAgICAgMCAgICAwICAtPiAgMAorZGRyb3QwMDIgcm90YXRlICAgICAgICAgICAgICAgICAwICAgIDIgIC0+ICAwCitkZHJvdDAwMyByb3RhdGUgICAgICAgICAgICAgICAgIDEgICAgMiAgLT4gIDEwMAorZGRyb3QwMDQgcm90YXRlICAgICAgICAgICAgICAgICAxICAgMTUgIC0+ICAxMDAwMDAwMDAwMDAwMDAwCitkZHJvdDAwNSByb3RhdGUgICAgICAgICAgICAgICAgIDEgICAxNiAgLT4gIDEKK2Rkcm90MDA2IHJvdGF0ZSAgICAgICAgICAgICAgICAgMSAgIC0xICAtPiAgMTAwMDAwMDAwMDAwMDAwMAorZGRyb3QwMDcgcm90YXRlICAgICAgICAgICAgICAgICAwICAgLTIgIC0+ICAwCitkZHJvdDAwOCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAtMSAgLT4gIDYxMjM0NTY3ODkwMTIzNDUKK2Rkcm90MDA5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xNSAtPiAgMjM0NTY3ODkwMTIzNDU2MQorZGRyb3QwMTAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgLTE2IC0+ICAxMjM0NTY3ODkwMTIzNDU2CitkZHJvdDAxMSByb3RhdGUgIDk5MzQ1Njc4OTAxMjM0NTYgICAtMTUgLT4gIDkzNDU2Nzg5MDEyMzQ1NjkKK2Rkcm90MDEyIHJvdGF0ZSAgOTkzNDU2Nzg5MDEyMzQ1NiAgIC0xNiAtPiAgOTkzNDU2Nzg5MDEyMzQ1NgorCistLSByaHMgbXVzdCBiZSBhbiBpbnRlZ2VyCitkZHJvdDAxNSByb3RhdGUgICAgICAgIDEgICAgMS41ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3QwMTYgcm90YXRlICAgICAgICAxICAgIDEuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90MDE3IHJvdGF0ZSAgICAgICAgMSAgICAwLjEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDAxOCByb3RhdGUgICAgICAgIDEgICAgMC4wICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3QwMTkgcm90YXRlICAgICAgICAxICAgIDFFKzEgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90MDIwIHJvdGF0ZSAgICAgICAgMSAgICAxRSs5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDAyMSByb3RhdGUgICAgICAgIDEgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3QwMjIgcm90YXRlICAgICAgICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB8cmhzfCA8PSBwcmVjaXNpb24KK2Rkcm90MDI1IHJvdGF0ZSAgICAgICAgMSAgICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDAyNiByb3RhdGUgICAgICAgIDEgICAgLTE3ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3QwMjcgcm90YXRlICAgICAgICAxICAgICAxNyAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90MDI4IHJvdGF0ZSAgICAgICAgMSAgICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZ1bGwgcGF0dGVybgorZGRyb3QwMzAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTE2ICAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZHJvdDAzMSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTUgIC0+IDIzNDU2Nzg5MDEyMzQ1NjEKK2Rkcm90MDMyIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0xNCAgLT4gMzQ1Njc4OTAxMjM0NTYxMgorZGRyb3QwMzMgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTEzICAtPiA0NTY3ODkwMTIzNDU2MTIzCitkZHJvdDAzNCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTIgIC0+IDU2Nzg5MDEyMzQ1NjEyMzQKK2Rkcm90MDM1IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0xMSAgLT4gNjc4OTAxMjM0NTYxMjM0NQorZGRyb3QwMzYgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTEwICAtPiA3ODkwMTIzNDU2MTIzNDU2CitkZHJvdDAzNyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtOSAgIC0+IDg5MDEyMzQ1NjEyMzQ1NjcKK2Rkcm90MDM4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC04ICAgLT4gOTAxMjM0NTYxMjM0NTY3OAorZGRyb3QwMzkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTcgICAtPiAgMTIzNDU2MTIzNDU2Nzg5CitkZHJvdDA0MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtNiAgIC0+IDEyMzQ1NjEyMzQ1Njc4OTAKK2Rkcm90MDQxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC01ICAgLT4gMjM0NTYxMjM0NTY3ODkwMQorZGRyb3QwNDIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTQgICAtPiAzNDU2MTIzNDU2Nzg5MDEyCitkZHJvdDA0MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMyAgIC0+IDQ1NjEyMzQ1Njc4OTAxMjMKK2Rkcm90MDQ0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0yICAgLT4gNTYxMjM0NTY3ODkwMTIzNAorZGRyb3QwNDUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTEgICAtPiA2MTIzNDU2Nzg5MDEyMzQ1CitkZHJvdDA0NiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYKKworZGRyb3QwNDcgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzAgICAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZHJvdDA0OCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMSAgIC0+IDIzNDU2Nzg5MDEyMzQ1NjEKK2Rkcm90MDQ5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsyICAgLT4gMzQ1Njc4OTAxMjM0NTYxMgorZGRyb3QwNTAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzMgICAtPiA0NTY3ODkwMTIzNDU2MTIzCitkZHJvdDA1MSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArNCAgIC0+IDU2Nzg5MDEyMzQ1NjEyMzQKK2Rkcm90MDUyIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs1ICAgLT4gNjc4OTAxMjM0NTYxMjM0NQorZGRyb3QwNTMgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzYgICAtPiA3ODkwMTIzNDU2MTIzNDU2CitkZHJvdDA1NCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArNyAgIC0+IDg5MDEyMzQ1NjEyMzQ1NjcKK2Rkcm90MDU1IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs4ICAgLT4gOTAxMjM0NTYxMjM0NTY3OAorZGRyb3QwNTYgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzkgICAtPiAgMTIzNDU2MTIzNDU2Nzg5CitkZHJvdDA1NyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTAgIC0+IDEyMzQ1NjEyMzQ1Njc4OTAKK2Rkcm90MDU4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxMSAgLT4gMjM0NTYxMjM0NTY3ODkwMQorZGRyb3QwNTkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzEyICAtPiAzNDU2MTIzNDU2Nzg5MDEyCitkZHJvdDA2MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTMgIC0+IDQ1NjEyMzQ1Njc4OTAxMjMKK2Rkcm90MDYxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxNCAgLT4gNTYxMjM0NTY3ODkwMTIzNAorZGRyb3QwNjIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzE1ICAtPiA2MTIzNDU2Nzg5MDEyMzQ1CitkZHJvdDA2MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTYgIC0+IDEyMzQ1Njc4OTAxMjM0NTYKKworLS0gemVyb3MKK2Rkcm90MDcwIHJvdGF0ZSAgMEUtMTAgICAgICAgICAgICAgICs5ICAgLT4gICAwRS0xMAorZGRyb3QwNzEgcm90YXRlICAwRS0xMCAgICAgICAgICAgICAgLTkgICAtPiAgIDBFLTEwCitkZHJvdDA3MiByb3RhdGUgIDAuMDAwICAgICAgICAgICAgICArOSAgIC0+ICAgMC4wMDAKK2Rkcm90MDczIHJvdGF0ZSAgMC4wMDAgICAgICAgICAgICAgIC05ICAgLT4gICAwLjAwMAorZGRyb3QwNzQgcm90YXRlICAwRSsxMCAgICAgICAgICAgICAgKzkgICAtPiAgIDBFKzEwCitkZHJvdDA3NSByb3RhdGUgIDBFKzEwICAgICAgICAgICAgICAtOSAgIC0+ICAgMEUrMTAKK2Rkcm90MDc2IHJvdGF0ZSAtMEUtMTAgICAgICAgICAgICAgICs5ICAgLT4gIC0wRS0xMAorZGRyb3QwNzcgcm90YXRlIC0wRS0xMCAgICAgICAgICAgICAgLTkgICAtPiAgLTBFLTEwCitkZHJvdDA3OCByb3RhdGUgLTAuMDAwICAgICAgICAgICAgICArOSAgIC0+ICAtMC4wMDAKK2Rkcm90MDc5IHJvdGF0ZSAtMC4wMDAgICAgICAgICAgICAgIC05ICAgLT4gIC0wLjAwMAorZGRyb3QwODAgcm90YXRlIC0wRSsxMCAgICAgICAgICAgICAgKzkgICAtPiAgLTBFKzEwCitkZHJvdDA4MSByb3RhdGUgLTBFKzEwICAgICAgICAgICAgICAtOSAgIC0+ICAtMEUrMTAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2Rkcm90MTQxIHJvdGF0ZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgLTEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkcm90MTQyIHJvdGF0ZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgLTE1IC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkcm90MTQzIHJvdGF0ZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgIDEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkcm90MTQ0IHJvdGF0ZSAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgIDE1IC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkcm90MTQ1IHJvdGF0ZSAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zNjgKK2Rkcm90MTQ2IHJvdGF0ZSAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAgLTE1IC0+IDEuMEUtMzgyCitkZHJvdDE0NyByb3RhdGUgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAgICAxICAtPiAxLjBFLTM4MgorZGRyb3QxNDggcm90YXRlICAxRS0zODMgICAgICAgICAgICAgICAgICAgICAgMTUgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM2OAorZGRyb3QxNTEgcm90YXRlICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0CitkZHJvdDE1MiByb3RhdGUgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xNSAtPiAxRS0zOTgKK2Rkcm90MTUzIHJvdGF0ZSAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDEgIC0+IDFFLTM5OAorZGRyb3QxNTQgcm90YXRlICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMTUgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0CitkZHJvdDE1NSByb3RhdGUgIDkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xICAtPiA5LjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTU2IHJvdGF0ZSAgOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IDlFLTM5OAorZGRyb3QxNTcgcm90YXRlICA5LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMSAgLT4gOUUtMzk4CitkZHJvdDE1OCByb3RhdGUgIDkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxNSAtPiA5LjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTYwIHJvdGF0ZSAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2Rkcm90MTYxIHJvdGF0ZSAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgLTE1IC0+IDEuMEUtMzk3CitkZHJvdDE2MiByb3RhdGUgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAgICAxICAtPiAxLjBFLTM5NworZGRyb3QxNjMgcm90YXRlICAxRS0zOTggICAgICAgICAgICAgICAgICAgICAgMTUgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworLS0gIG5lZ2F0aXZlcworZGRyb3QxNzEgcm90YXRlIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAtMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkcm90MTcyIHJvdGF0ZSAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgLTE1IC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZHJvdDE3MyByb3RhdGUgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAxICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZGRyb3QxNzQgcm90YXRlIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMTUgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkcm90MTc1IHJvdGF0ZSAtMUUtMzgzICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzY4CitkZHJvdDE3NiByb3RhdGUgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgIC0xNSAtPiAtMS4wRS0zODIKK2Rkcm90MTc3IHJvdGF0ZSAtMUUtMzgzICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTM4MgorZGRyb3QxNzggcm90YXRlIC0xRS0zODMgICAgICAgICAgICAgICAgICAgICAgMTUgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zNjgKK2Rkcm90MTgxIHJvdGF0ZSAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTgyIHJvdGF0ZSAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IC0xRS0zOTgKK2Rkcm90MTgzIHJvdGF0ZSAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDEgIC0+IC0xRS0zOTgKK2Rkcm90MTg0IHJvdGF0ZSAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDE1IC0+IC0xLjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTg1IHJvdGF0ZSAtOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTEgIC0+IC05LjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTg2IHJvdGF0ZSAtOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IC05RS0zOTgKK2Rkcm90MTg3IHJvdGF0ZSAtOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDEgIC0+IC05RS0zOTgKK2Rkcm90MTg4IHJvdGF0ZSAtOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDE1IC0+IC05LjAwMDAwMDAwMDAwMDAwRS0zODQKK2Rkcm90MTkwIHJvdGF0ZSAtMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzCitkZHJvdDE5MSByb3RhdGUgLTFFLTM5OCAgICAgICAgICAgICAgICAgICAgIC0xNSAtPiAtMS4wRS0zOTcKK2Rkcm90MTkyIHJvdGF0ZSAtMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTM5NworZGRyb3QxOTMgcm90YXRlIC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAgMTUgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKKworLS0gbW9yZSBuZWdhdGl2ZXMgKG9mIHNhbml0aWVzKQorZGRyb3QyMDEgcm90YXRlICAgICAgICAgICAgICAgIC0wICAgIDAgIC0+IC0wCitkZHJvdDIwMiByb3RhdGUgICAgICAgICAgICAgICAgLTAgICAgMiAgLT4gLTAKK2Rkcm90MjAzIHJvdGF0ZSAgICAgICAgICAgICAgICAtMSAgICAyICAtPiAtMTAwCitkZHJvdDIwNCByb3RhdGUgICAgICAgICAgICAgICAgLTEgICAxNSAgLT4gLTEwMDAwMDAwMDAwMDAwMDAKK2Rkcm90MjA1IHJvdGF0ZSAgICAgICAgICAgICAgICAtMSAgIDE2ICAtPiAtMQorZGRyb3QyMDYgcm90YXRlICAgICAgICAgICAgICAgIC0xICAgLTEgIC0+IC0xMDAwMDAwMDAwMDAwMDAwCitkZHJvdDIwNyByb3RhdGUgICAgICAgICAgICAgICAgLTAgICAtMiAgLT4gLTAKK2Rkcm90MjA4IHJvdGF0ZSAtMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xICAtPiAtNjEyMzQ1Njc4OTAxMjM0NQorZGRyb3QyMDkgcm90YXRlIC0xMjM0NTY3ODkwMTIzNDU2ICAgLTE1IC0+IC0yMzQ1Njc4OTAxMjM0NTYxCitkZHJvdDIxMCByb3RhdGUgLTEyMzQ1Njc4OTAxMjM0NTYgICAtMTYgLT4gLTEyMzQ1Njc4OTAxMjM0NTYKK2Rkcm90MjExIHJvdGF0ZSAtOTkzNDU2Nzg5MDEyMzQ1NiAgIC0xNSAtPiAtOTM0NTY3ODkwMTIzNDU2OQorZGRyb3QyMTIgcm90YXRlIC05OTM0NTY3ODkwMTIzNDU2ICAgLTE2IC0+IC05OTM0NTY3ODkwMTIzNDU2CisKKworLS0gU3BlY2lhbHM7IE5hTnMgYXJlIGhhbmRsZWQgYXMgdXN1YWwKK2Rkcm90NzgxIHJvdGF0ZSAtSW5mICAtOCAgICAgLT4gLUluZmluaXR5CitkZHJvdDc4MiByb3RhdGUgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZGRyb3Q3ODMgcm90YXRlIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2Rkcm90Nzg0IHJvdGF0ZSAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkZHJvdDc4NSByb3RhdGUgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZGRyb3Q3ODYgcm90YXRlIC1JbmYgICA4ICAgICAtPiAtSW5maW5pdHkKK2Rkcm90Nzg3IHJvdGF0ZSAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDc4OCByb3RhdGUgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q3ODkgcm90YXRlIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90NzkwIHJvdGF0ZSAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDc5MSByb3RhdGUgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q3OTIgcm90YXRlICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90NzkzIHJvdGF0ZSAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDc5NCByb3RhdGUgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHJvdDgwMCByb3RhdGUgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4MDEgcm90YXRlICBJbmYgIC04ICAgICAtPiBJbmZpbml0eQorZGRyb3Q4MDIgcm90YXRlICBJbmYgIC0xICAgICAtPiBJbmZpbml0eQorZGRyb3Q4MDMgcm90YXRlICBJbmYgIC0wICAgICAtPiBJbmZpbml0eQorZGRyb3Q4MDQgcm90YXRlICBJbmYgICAwICAgICAtPiBJbmZpbml0eQorZGRyb3Q4MDUgcm90YXRlICBJbmYgICAxICAgICAtPiBJbmZpbml0eQorZGRyb3Q4MDYgcm90YXRlICBJbmYgICA4ICAgICAtPiBJbmZpbml0eQorZGRyb3Q4MDcgcm90YXRlICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODA4IHJvdGF0ZSAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDgwOSByb3RhdGUgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4MTAgcm90YXRlIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODExIHJvdGF0ZSAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDgxMiByb3RhdGUgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4MTMgcm90YXRlICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODE0IHJvdGF0ZSAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDgxNSByb3RhdGUgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHJvdDgyMSByb3RhdGUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2Rkcm90ODIyIHJvdGF0ZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorZGRyb3Q4MjMgcm90YXRlICBOYU4gLTEgICAgICAtPiAgTmFOCitkZHJvdDgyNCByb3RhdGUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2Rkcm90ODI1IHJvdGF0ZSAgTmFOICAwICAgICAgLT4gIE5hTgorZGRyb3Q4MjYgcm90YXRlICBOYU4gIDEgICAgICAtPiAgTmFOCitkZHJvdDgyNyByb3RhdGUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2Rkcm90ODI4IHJvdGF0ZSAgTmFOICBJbmYgICAgLT4gIE5hTgorZGRyb3Q4Mjkgcm90YXRlICBOYU4gIE5hTiAgICAtPiAgTmFOCitkZHJvdDgzMCByb3RhdGUgLUluZiAgTmFOICAgIC0+ICBOYU4KK2Rkcm90ODMxIHJvdGF0ZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorZGRyb3Q4MzIgcm90YXRlIC0xICAgIE5hTiAgICAtPiAgTmFOCitkZHJvdDgzMyByb3RhdGUgLTAgICAgTmFOICAgIC0+ICBOYU4KK2Rkcm90ODM0IHJvdGF0ZSAgMCAgICBOYU4gICAgLT4gIE5hTgorZGRyb3Q4MzUgcm90YXRlICAxICAgIE5hTiAgICAtPiAgTmFOCitkZHJvdDgzNiByb3RhdGUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2Rkcm90ODM3IHJvdGF0ZSAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkZHJvdDg0MSByb3RhdGUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0MiByb3RhdGUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0MyByb3RhdGUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0NCByb3RhdGUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0NSByb3RhdGUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0NiByb3RhdGUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0NyByb3RhdGUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0OCByb3RhdGUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg0OSByb3RhdGUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1MCByb3RhdGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1MSByb3RhdGUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1MiByb3RhdGUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1MyByb3RhdGUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1NCByb3RhdGUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1NSByb3RhdGUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1NiByb3RhdGUgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1NyByb3RhdGUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1OCByb3RhdGUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg1OSByb3RhdGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2Rkcm90ODYxIHJvdGF0ZSAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2Rkcm90ODYyIHJvdGF0ZSArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2Rkcm90ODYzIHJvdGF0ZSAgTmFOMyAgICAxMDAwICAgLT4gIE5hTjMKK2Rkcm90ODY0IHJvdGF0ZSAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2Rkcm90ODY1IHJvdGF0ZSAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2Rkcm90ODY2IHJvdGF0ZSAtSW5mICAgICBOYU43ICAgLT4gIE5hTjcKK2Rkcm90ODY3IHJvdGF0ZSAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2Rkcm90ODY4IHJvdGF0ZSAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2Rkcm90ODY5IHJvdGF0ZSAgSW5mICAgICtOYU4xMCAgLT4gIE5hTjEwCitkZHJvdDg3MSByb3RhdGUgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODcyIHJvdGF0ZSAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4NzMgcm90YXRlICBzTmFOMTMgICAxMDAwICAtPiAgTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg3NCByb3RhdGUgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODc1IHJvdGF0ZSAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4NzYgcm90YXRlICBOYU4xNiAgIHNOYU4xOSAtPiAgTmFOMTkgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg3NyByb3RhdGUgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODc4IHJvdGF0ZSAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4Nzkgcm90YXRlICAxMDAwICAgIHNOYU4yMiAtPiAgTmFOMjIgIEludmFsaWRfb3BlcmF0aW9uCitkZHJvdDg4MCByb3RhdGUgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rkcm90ODgxIHJvdGF0ZSArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4ODIgcm90YXRlIC1OYU4yNiAgICBOYU4yOCAtPiAtTmFOMjYKK2Rkcm90ODgzIHJvdGF0ZSAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZGRyb3Q4ODQgcm90YXRlICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2Rkcm90ODg1IHJvdGF0ZSAgMTAwMCAgIC1zTmFOMzEgLT4gLU5hTjMxICBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFNhbWVRdWFudHVtLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU2FtZVF1YW50dW0uZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjViMzZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFNhbWVRdWFudHVtLmRlY1Rlc3QKQEAgLTAsMCArMSwzODkgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRTYW1lUXVhbnR1bS5kZWNUZXN0IC0tIGNoZWNrIGRlY0RvdWJsZSBxdWFudHVtcyBtYXRjaCAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY0RvdWJsZXMuCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZGRzYW1xMDAxIHNhbWVxdWFudHVtICAwICAgICAgMCAgICAgIC0+ICAxCitkZHNhbXEwMDIgc2FtZXF1YW50dW0gIDAgICAgICAxICAgICAgLT4gIDEKK2Rkc2FtcTAwMyBzYW1lcXVhbnR1bSAgMSAgICAgIDAgICAgICAtPiAgMQorZGRzYW1xMDA0IHNhbWVxdWFudHVtICAxICAgICAgMSAgICAgIC0+ICAxCisKK2Rkc2FtcTAxMSBzYW1lcXVhbnR1bSAgMTAgICAgIDFFKzEgICAtPiAwCitkZHNhbXEwMTIgc2FtZXF1YW50dW0gIDEwRSsxICAxMEUrMSAgLT4gMQorZGRzYW1xMDEzIHNhbWVxdWFudHVtICAxMDAgICAgMTBFKzEgIC0+IDAKK2Rkc2FtcTAxNCBzYW1lcXVhbnR1bSAgMTAwICAgIDFFKzIgICAtPiAwCitkZHNhbXEwMTUgc2FtZXF1YW50dW0gIDAuMSAgICAxRS0yICAgLT4gMAorZGRzYW1xMDE2IHNhbWVxdWFudHVtICAwLjEgICAgMUUtMSAgIC0+IDEKK2Rkc2FtcTAxNyBzYW1lcXVhbnR1bSAgMC4xICAgIDFFLTAgICAtPiAwCitkZHNhbXEwMTggc2FtZXF1YW50dW0gIDk5OSAgICA5OTkgICAgLT4gMQorZGRzYW1xMDE5IHNhbWVxdWFudHVtICA5OTlFLTEgOTkuOSAgIC0+IDEKK2Rkc2FtcTAyMCBzYW1lcXVhbnR1bSAgMTExRS0xIDIyLjIgICAtPiAxCitkZHNhbXEwMjEgc2FtZXF1YW50dW0gIDExMUUtMSAxMjM0LjIgLT4gMQorCistLSB6ZXJvcworZGRzYW1xMDMwIHNhbWVxdWFudHVtICAwLjAgICAgMS4xICAgIC0+IDEKK2Rkc2FtcTAzMSBzYW1lcXVhbnR1bSAgMC4wICAgIDEuMTEgICAtPiAwCitkZHNhbXEwMzIgc2FtZXF1YW50dW0gIDAuMCAgICAwICAgICAgLT4gMAorZGRzYW1xMDMzIHNhbWVxdWFudHVtICAwLjAgICAgMC4wICAgIC0+IDEKK2Rkc2FtcTAzNCBzYW1lcXVhbnR1bSAgMC4wICAgIDAuMDAgICAtPiAwCitkZHNhbXEwMzUgc2FtZXF1YW50dW0gIDBFKzEgICAwRSswICAgLT4gMAorZGRzYW1xMDM2IHNhbWVxdWFudHVtICAwRSsxICAgMEUrMSAgIC0+IDEKK2Rkc2FtcTAzNyBzYW1lcXVhbnR1bSAgMEUrMSAgIDBFKzIgICAtPiAwCitkZHNhbXEwMzggc2FtZXF1YW50dW0gIDBFLTE3ICAwRS0xNiAgLT4gMAorZGRzYW1xMDM5IHNhbWVxdWFudHVtICAwRS0xNyAgMEUtMTcgIC0+IDEKK2Rkc2FtcTA0MCBzYW1lcXVhbnR1bSAgMEUtMTcgIDBFLTE4ICAtPiAwCitkZHNhbXEwNDEgc2FtZXF1YW50dW0gIDBFLTE3ICAwLjBFLTE1IC0+IDAKK2Rkc2FtcTA0MiBzYW1lcXVhbnR1bSAgMEUtMTcgIDAuMEUtMTYgLT4gMQorZGRzYW1xMDQzIHNhbWVxdWFudHVtICAwRS0xNyAgMC4wRS0xNyAtPiAwCitkZHNhbXEwNDQgc2FtZXF1YW50dW0gLTBFLTE3ICAwLjBFLTE2IC0+IDEKK2Rkc2FtcTA0NSBzYW1lcXVhbnR1bSAgMEUtMTcgLTAuMEUtMTcgLT4gMAorZGRzYW1xMDQ2IHNhbWVxdWFudHVtICAwRS0xNyAtMC4wRS0xNiAtPiAxCitkZHNhbXEwNDcgc2FtZXF1YW50dW0gLTBFLTE3ICAwLjBFLTE3IC0+IDAKK2Rkc2FtcTA0OCBzYW1lcXVhbnR1bSAtMEUtMTcgLTAuMEUtMTYgLT4gMQorZGRzYW1xMDQ5IHNhbWVxdWFudHVtIC0wRS0xNyAtMC4wRS0xNyAtPiAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZHNhbXEwNTEgc2FtZXF1YW50dW0gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gMQorZGRzYW1xMDUyIHNhbWVxdWFudHVtICAxRS0zODMgICAgICAgICAgICAgMUUtMzgzICAgICAgICAgICAtPiAxCitkZHNhbXEwNTMgc2FtZXF1YW50dW0gIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gMQorZGRzYW1xMDU0IHNhbWVxdWFudHVtICAxRS0zOTggICAgICAgICAgICAgMUUtMzk4ICAgICAgICAgICAtPiAxCitkZHNhbXEwNTUgc2FtZXF1YW50dW0gIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgLT4gMQorZGRzYW1xMDU2IHNhbWVxdWFudHVtICAxRS0zODMgICAgICAgICAgICAgMUUtMzgzICAgICAgICAgICAtPiAxCitkZHNhbXEwNTcgc2FtZXF1YW50dW0gIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgLT4gMQorZGRzYW1xMDU4IHNhbWVxdWFudHVtICAxRS0zOTggICAgICAgICAgICAgMUUtMzk4ICAgICAgICAgICAtPiAxCisKK2Rkc2FtcTA2MSBzYW1lcXVhbnR1bSAgLTFFLTM5OCAgICAgICAgICAgIC0xRS0zOTggICAgICAgICAgLT4gMQorZGRzYW1xMDYyIHNhbWVxdWFudHVtICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzIC0+IDEKK2Rkc2FtcTA2MyBzYW1lcXVhbnR1bSAgLTFFLTM4MyAgICAgICAgICAgIC0xRS0zODMgICAgICAgICAgLT4gMQorZGRzYW1xMDY0IHNhbWVxdWFudHVtICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+IDEKK2Rkc2FtcTA2NSBzYW1lcXVhbnR1bSAgLTFFLTM5OCAgICAgICAgICAgIC0xRS0zOTggICAgICAgICAgLT4gMQorZGRzYW1xMDY2IHNhbWVxdWFudHVtICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzIC0+IDEKK2Rkc2FtcTA2NyBzYW1lcXVhbnR1bSAgLTFFLTM4MyAgICAgICAgICAgIC0xRS0zODMgICAgICAgICAgLT4gMQorZGRzYW1xMDY4IHNhbWVxdWFudHVtICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+IDEKKworZGRzYW1xMDcxIHNhbWVxdWFudHVtICAtNEUtMzk4ICAgICAgICAgICAgLTFFLTM5OCAgICAgICAgICAtPiAxCitkZHNhbXEwNzIgc2FtZXF1YW50dW0gIC00LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLTEuMDAwMDQwMDAwMDAwMDAwRS0zODMgLT4gMQorZGRzYW1xMDczIHNhbWVxdWFudHVtICAtNEUtMzgzICAgICAgICAgICAgLTFFLTM4MyAgICAgICAgICAtPiAxCitkZHNhbXEwNzQgc2FtZXF1YW50dW0gIC00Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLTkuOTk5OTk5OTk5OTQ5OTk5RSszODQgLT4gMQorZGRzYW1xMDc1IHNhbWVxdWFudHVtICAtNEUtMzk4ICAgICAgICAgICAgLTFFLTM5OCAgICAgICAgICAtPiAxCitkZHNhbXEwNzYgc2FtZXF1YW50dW0gIC00LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgLTEuMDA0MDAwMDAwMDAwMDAwRS0zODMgLT4gMQorZGRzYW1xMDc3IHNhbWVxdWFudHVtICAtNEUtMzgzICAgICAgICAgICAgLTFFLTM4MyAgICAgICAgICAtPiAxCitkZHNhbXEwNzggc2FtZXF1YW50dW0gIC00Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgLTkuOTQ5OTk5OTk5OTk5OTk5RSszODQgLT4gMQorCitkZHNhbXEwODEgc2FtZXF1YW50dW0gIC00RS0zOTcgICAgICAgICAgICAtMUUtMzk4ICAgICAgICAgIC0+IDAKK2Rkc2FtcTA4MiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtMS4wMDAwNDAwMDAwMDAwMDBFLTMzNiAtPiAwCitkZHNhbXEwODMgc2FtZXF1YW50dW0gIC00RS0zNDYgICAgICAgICAgICAtMUUtMzgzICAgICAgICAgIC0+IDAKK2Rkc2FtcTA4NCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtOS45OTk0OTk5OTk5OTk5OTlFKzMzNiAtPiAwCitkZHNhbXEwODUgc2FtZXF1YW50dW0gIC00RS0zOTcgICAgICAgICAgICAtMUUtMzk4ICAgICAgICAgIC0+IDAKK2Rkc2FtcTA4NiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAtMS4wMDQwMDAwMDAwMDAwMDBFLTMzNiAtPiAwCitkZHNhbXEwODcgc2FtZXF1YW50dW0gIC00RS0zNDYgICAgICAgICAgICAtMUUtMzgzICAgICAgICAgIC0+IDAKK2Rkc2FtcTA4OCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTk5OTk5OTk5RSszODQgICAtOS45NDk5OTk5OTk5OTk5OTlFKzMzNiAtPiAwCisKKy0tIHNwZWNpYWxzICYgY29tYmluYXRpb25zCitkZHNhbXEwMTEwIHNhbWVxdWFudHVtICAtSW5mICAgIC1JbmYgICAtPiAxCitkZHNhbXEwMTExIHNhbWVxdWFudHVtICAtSW5mICAgICBJbmYgICAtPiAxCitkZHNhbXEwMTEyIHNhbWVxdWFudHVtICAtSW5mICAgICBOYU4gICAtPiAwCitkZHNhbXEwMTEzIHNhbWVxdWFudHVtICAtSW5mICAgIC03RSszICAtPiAwCitkZHNhbXEwMTE0IHNhbWVxdWFudHVtICAtSW5mICAgIC03ICAgICAtPiAwCitkZHNhbXEwMTE1IHNhbWVxdWFudHVtICAtSW5mICAgIC03RS0zICAtPiAwCitkZHNhbXEwMTE2IHNhbWVxdWFudHVtICAtSW5mICAgIC0wRS0zICAtPiAwCitkZHNhbXEwMTE3IHNhbWVxdWFudHVtICAtSW5mICAgIC0wICAgICAtPiAwCitkZHNhbXEwMTE4IHNhbWVxdWFudHVtICAtSW5mICAgIC0wRSszICAtPiAwCitkZHNhbXEwMTE5IHNhbWVxdWFudHVtICAtSW5mICAgICAwRS0zICAtPiAwCitkZHNhbXEwMTIwIHNhbWVxdWFudHVtICAtSW5mICAgICAwICAgICAtPiAwCitkZHNhbXEwMTIxIHNhbWVxdWFudHVtICAtSW5mICAgICAwRSszICAtPiAwCitkZHNhbXEwMTIyIHNhbWVxdWFudHVtICAtSW5mICAgICA3RS0zICAtPiAwCitkZHNhbXEwMTIzIHNhbWVxdWFudHVtICAtSW5mICAgICA3ICAgICAtPiAwCitkZHNhbXEwMTI0IHNhbWVxdWFudHVtICAtSW5mICAgICA3RSszICAtPiAwCitkZHNhbXEwMTI1IHNhbWVxdWFudHVtICAtSW5mICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTAyMTAgc2FtZXF1YW50dW0gICBJbmYgICAgLUluZiAgIC0+IDEKK2Rkc2FtcTAyMTEgc2FtZXF1YW50dW0gICBJbmYgICAgIEluZiAgIC0+IDEKK2Rkc2FtcTAyMTIgc2FtZXF1YW50dW0gICBJbmYgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTAyMTMgc2FtZXF1YW50dW0gICBJbmYgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTAyMTQgc2FtZXF1YW50dW0gICBJbmYgICAgLTcgICAgIC0+IDAKK2Rkc2FtcTAyMTUgc2FtZXF1YW50dW0gICBJbmYgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTAyMTYgc2FtZXF1YW50dW0gICBJbmYgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTAyMTcgc2FtZXF1YW50dW0gICBJbmYgICAgLTAgICAgIC0+IDAKK2Rkc2FtcTAyMTggc2FtZXF1YW50dW0gICBJbmYgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTAyMTkgc2FtZXF1YW50dW0gICBJbmYgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTAyMjAgc2FtZXF1YW50dW0gICBJbmYgICAgIDAgICAgIC0+IDAKK2Rkc2FtcTAyMjEgc2FtZXF1YW50dW0gICBJbmYgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTAyMjIgc2FtZXF1YW50dW0gICBJbmYgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTAyMjMgc2FtZXF1YW50dW0gICBJbmYgICAgIDcgICAgIC0+IDAKK2Rkc2FtcTAyMjQgc2FtZXF1YW50dW0gICBJbmYgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTAyMjUgc2FtZXF1YW50dW0gICBJbmYgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMDMxMCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtSW5mICAgLT4gMAorZGRzYW1xMDMxMSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgSW5mICAgLT4gMAorZGRzYW1xMDMxMiBzYW1lcXVhbnR1bSAgIE5hTiAgICAgTmFOICAgLT4gMQorZGRzYW1xMDMxMyBzYW1lcXVhbnR1bSAgIE5hTiAgICAtN0UrMyAgLT4gMAorZGRzYW1xMDMxNCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtNyAgICAgLT4gMAorZGRzYW1xMDMxNSBzYW1lcXVhbnR1bSAgIE5hTiAgICAtN0UtMyAgLT4gMAorZGRzYW1xMDMxNiBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMEUtMyAgLT4gMAorZGRzYW1xMDMxNyBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMCAgICAgLT4gMAorZGRzYW1xMDMxOCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMEUrMyAgLT4gMAorZGRzYW1xMDMxOSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMEUtMyAgLT4gMAorZGRzYW1xMDMyMCBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMCAgICAgLT4gMAorZGRzYW1xMDMyMSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMEUrMyAgLT4gMAorZGRzYW1xMDMyMiBzYW1lcXVhbnR1bSAgIE5hTiAgICAgN0UtMyAgLT4gMAorZGRzYW1xMDMyMyBzYW1lcXVhbnR1bSAgIE5hTiAgICAgNyAgICAgLT4gMAorZGRzYW1xMDMyNCBzYW1lcXVhbnR1bSAgIE5hTiAgICAgN0UrMyAgLT4gMAorZGRzYW1xMDMyNSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgc05hTiAgLT4gMQorCitkZHNhbXEwNDEwIHNhbWVxdWFudHVtICAtN0UrMyAgICAtSW5mICAgLT4gMAorZGRzYW1xMDQxMSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIEluZiAgIC0+IDAKK2Rkc2FtcTA0MTIgc2FtZXF1YW50dW0gIC03RSszICAgICBOYU4gICAtPiAwCitkZHNhbXEwNDEzIHNhbWVxdWFudHVtICAtN0UrMyAgICAtN0UrMyAgLT4gMQorZGRzYW1xMDQxNCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTcgICAgIC0+IDAKK2Rkc2FtcTA0MTUgc2FtZXF1YW50dW0gIC03RSszICAgIC03RS0zICAtPiAwCitkZHNhbXEwNDE2IHNhbWVxdWFudHVtICAtN0UrMyAgICAtMEUtMyAgLT4gMAorZGRzYW1xMDQxNyBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTAgICAgIC0+IDAKK2Rkc2FtcTA0MTggc2FtZXF1YW50dW0gIC03RSszICAgIC0wRSszICAtPiAxCitkZHNhbXEwNDE5IHNhbWVxdWFudHVtICAtN0UrMyAgICAgMEUtMyAgLT4gMAorZGRzYW1xMDQyMCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDAgICAgIC0+IDAKK2Rkc2FtcTA0MjEgc2FtZXF1YW50dW0gIC03RSszICAgICAwRSszICAtPiAxCitkZHNhbXEwNDIyIHNhbWVxdWFudHVtICAtN0UrMyAgICAgN0UtMyAgLT4gMAorZGRzYW1xMDQyMyBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDcgICAgIC0+IDAKK2Rkc2FtcTA0MjQgc2FtZXF1YW50dW0gIC03RSszICAgICA3RSszICAtPiAxCitkZHNhbXEwNDI1IHNhbWVxdWFudHVtICAtN0UrMyAgICAgc05hTiAgLT4gMAorCitkZHNhbXEwNTEwIHNhbWVxdWFudHVtICAtNyAgICAgIC1JbmYgICAtPiAwCitkZHNhbXEwNTExIHNhbWVxdWFudHVtICAtNyAgICAgICBJbmYgICAtPiAwCitkZHNhbXEwNTEyIHNhbWVxdWFudHVtICAtNyAgICAgICBOYU4gICAtPiAwCitkZHNhbXEwNTEzIHNhbWVxdWFudHVtICAtNyAgICAgIC03RSszICAtPiAwCitkZHNhbXEwNTE0IHNhbWVxdWFudHVtICAtNyAgICAgIC03ICAgICAtPiAxCitkZHNhbXEwNTE1IHNhbWVxdWFudHVtICAtNyAgICAgIC03RS0zICAtPiAwCitkZHNhbXEwNTE2IHNhbWVxdWFudHVtICAtNyAgICAgIC0wRS0zICAtPiAwCitkZHNhbXEwNTE3IHNhbWVxdWFudHVtICAtNyAgICAgIC0wICAgICAtPiAxCitkZHNhbXEwNTE4IHNhbWVxdWFudHVtICAtNyAgICAgIC0wRSszICAtPiAwCitkZHNhbXEwNTE5IHNhbWVxdWFudHVtICAtNyAgICAgICAwRS0zICAtPiAwCitkZHNhbXEwNTIwIHNhbWVxdWFudHVtICAtNyAgICAgICAwICAgICAtPiAxCitkZHNhbXEwNTIxIHNhbWVxdWFudHVtICAtNyAgICAgICAwRSszICAtPiAwCitkZHNhbXEwNTIyIHNhbWVxdWFudHVtICAtNyAgICAgICA3RS0zICAtPiAwCitkZHNhbXEwNTIzIHNhbWVxdWFudHVtICAtNyAgICAgICA3ICAgICAtPiAxCitkZHNhbXEwNTI0IHNhbWVxdWFudHVtICAtNyAgICAgICA3RSszICAtPiAwCitkZHNhbXEwNTI1IHNhbWVxdWFudHVtICAtNyAgICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTA2MTAgc2FtZXF1YW50dW0gIC03RS0zICAgIC1JbmYgICAtPiAwCitkZHNhbXEwNjExIHNhbWVxdWFudHVtICAtN0UtMyAgICAgSW5mICAgLT4gMAorZGRzYW1xMDYxMiBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTA2MTMgc2FtZXF1YW50dW0gIC03RS0zICAgIC03RSszICAtPiAwCitkZHNhbXEwNjE0IHNhbWVxdWFudHVtICAtN0UtMyAgICAtNyAgICAgLT4gMAorZGRzYW1xMDYxNSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTdFLTMgIC0+IDEKK2Rkc2FtcTA2MTYgc2FtZXF1YW50dW0gIC03RS0zICAgIC0wRS0zICAtPiAxCitkZHNhbXEwNjE3IHNhbWVxdWFudHVtICAtN0UtMyAgICAtMCAgICAgLT4gMAorZGRzYW1xMDYxOCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTA2MTkgc2FtZXF1YW50dW0gIC03RS0zICAgICAwRS0zICAtPiAxCitkZHNhbXEwNjIwIHNhbWVxdWFudHVtICAtN0UtMyAgICAgMCAgICAgLT4gMAorZGRzYW1xMDYyMSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTA2MjIgc2FtZXF1YW50dW0gIC03RS0zICAgICA3RS0zICAtPiAxCitkZHNhbXEwNjIzIHNhbWVxdWFudHVtICAtN0UtMyAgICAgNyAgICAgLT4gMAorZGRzYW1xMDYyNCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTA2MjUgc2FtZXF1YW50dW0gIC03RS0zICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTA3MTAgc2FtZXF1YW50dW0gIC0wRS0zICAgIC1JbmYgICAtPiAwCitkZHNhbXEwNzExIHNhbWVxdWFudHVtICAtMEUtMyAgICAgSW5mICAgLT4gMAorZGRzYW1xMDcxMiBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTA3MTMgc2FtZXF1YW50dW0gIC0wRS0zICAgIC03RSszICAtPiAwCitkZHNhbXEwNzE0IHNhbWVxdWFudHVtICAtMEUtMyAgICAtNyAgICAgLT4gMAorZGRzYW1xMDcxNSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTdFLTMgIC0+IDEKK2Rkc2FtcTA3MTYgc2FtZXF1YW50dW0gIC0wRS0zICAgIC0wRS0zICAtPiAxCitkZHNhbXEwNzE3IHNhbWVxdWFudHVtICAtMEUtMyAgICAtMCAgICAgLT4gMAorZGRzYW1xMDcxOCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTA3MTkgc2FtZXF1YW50dW0gIC0wRS0zICAgICAwRS0zICAtPiAxCitkZHNhbXEwNzIwIHNhbWVxdWFudHVtICAtMEUtMyAgICAgMCAgICAgLT4gMAorZGRzYW1xMDcyMSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTA3MjIgc2FtZXF1YW50dW0gIC0wRS0zICAgICA3RS0zICAtPiAxCitkZHNhbXEwNzIzIHNhbWVxdWFudHVtICAtMEUtMyAgICAgNyAgICAgLT4gMAorZGRzYW1xMDcyNCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTA3MjUgc2FtZXF1YW50dW0gIC0wRS0zICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTA4MTAgc2FtZXF1YW50dW0gIC0wICAgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTA4MTEgc2FtZXF1YW50dW0gIC0wICAgICAgIEluZiAgIC0+IDAKK2Rkc2FtcTA4MTIgc2FtZXF1YW50dW0gIC0wICAgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTA4MTMgc2FtZXF1YW50dW0gIC0wICAgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTA4MTQgc2FtZXF1YW50dW0gIC0wICAgICAgLTcgICAgIC0+IDEKK2Rkc2FtcTA4MTUgc2FtZXF1YW50dW0gIC0wICAgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTA4MTYgc2FtZXF1YW50dW0gIC0wICAgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTA4MTcgc2FtZXF1YW50dW0gIC0wICAgICAgLTAgICAgIC0+IDEKK2Rkc2FtcTA4MTggc2FtZXF1YW50dW0gIC0wICAgICAgLTBFKzMgIC0+IDAKK2Rkc2FtcTA4MTkgc2FtZXF1YW50dW0gIC0wICAgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTA4MjAgc2FtZXF1YW50dW0gIC0wICAgICAgIDAgICAgIC0+IDEKK2Rkc2FtcTA4MjEgc2FtZXF1YW50dW0gIC0wICAgICAgIDBFKzMgIC0+IDAKK2Rkc2FtcTA4MjIgc2FtZXF1YW50dW0gIC0wICAgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTA4MjMgc2FtZXF1YW50dW0gIC0wICAgICAgIDcgICAgIC0+IDEKK2Rkc2FtcTA4MjQgc2FtZXF1YW50dW0gIC0wICAgICAgIDdFKzMgIC0+IDAKK2Rkc2FtcTA4MjUgc2FtZXF1YW50dW0gIC0wICAgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMDkxMCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTA5MTEgc2FtZXF1YW50dW0gIC0wRSszICAgICBJbmYgICAtPiAwCitkZHNhbXEwOTEyIHNhbWVxdWFudHVtICAtMEUrMyAgICAgTmFOICAgLT4gMAorZGRzYW1xMDkxMyBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTdFKzMgIC0+IDEKK2Rkc2FtcTA5MTQgc2FtZXF1YW50dW0gIC0wRSszICAgIC03ICAgICAtPiAwCitkZHNhbXEwOTE1IHNhbWVxdWFudHVtICAtMEUrMyAgICAtN0UtMyAgLT4gMAorZGRzYW1xMDkxNiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTA5MTcgc2FtZXF1YW50dW0gIC0wRSszICAgIC0wICAgICAtPiAwCitkZHNhbXEwOTE4IHNhbWVxdWFudHVtICAtMEUrMyAgICAtMEUrMyAgLT4gMQorZGRzYW1xMDkxOSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTA5MjAgc2FtZXF1YW50dW0gIC0wRSszICAgICAwICAgICAtPiAwCitkZHNhbXEwOTIxIHNhbWVxdWFudHVtICAtMEUrMyAgICAgMEUrMyAgLT4gMQorZGRzYW1xMDkyMiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTA5MjMgc2FtZXF1YW50dW0gIC0wRSszICAgICA3ICAgICAtPiAwCitkZHNhbXEwOTI0IHNhbWVxdWFudHVtICAtMEUrMyAgICAgN0UrMyAgLT4gMQorZGRzYW1xMDkyNSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMTExMCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtSW5mICAgLT4gMAorZGRzYW1xMTExMSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgSW5mICAgLT4gMAorZGRzYW1xMTExMiBzYW1lcXVhbnR1bSAgMEUtMyAgICAgTmFOICAgLT4gMAorZGRzYW1xMTExMyBzYW1lcXVhbnR1bSAgMEUtMyAgICAtN0UrMyAgLT4gMAorZGRzYW1xMTExNCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtNyAgICAgLT4gMAorZGRzYW1xMTExNSBzYW1lcXVhbnR1bSAgMEUtMyAgICAtN0UtMyAgLT4gMQorZGRzYW1xMTExNiBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMEUtMyAgLT4gMQorZGRzYW1xMTExNyBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMCAgICAgLT4gMAorZGRzYW1xMTExOCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMEUrMyAgLT4gMAorZGRzYW1xMTExOSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMEUtMyAgLT4gMQorZGRzYW1xMTEyMCBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMCAgICAgLT4gMAorZGRzYW1xMTEyMSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMEUrMyAgLT4gMAorZGRzYW1xMTEyMiBzYW1lcXVhbnR1bSAgMEUtMyAgICAgN0UtMyAgLT4gMQorZGRzYW1xMTEyMyBzYW1lcXVhbnR1bSAgMEUtMyAgICAgNyAgICAgLT4gMAorZGRzYW1xMTEyNCBzYW1lcXVhbnR1bSAgMEUtMyAgICAgN0UrMyAgLT4gMAorZGRzYW1xMTEyNSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgc05hTiAgLT4gMAorCitkZHNhbXExMjEwIHNhbWVxdWFudHVtICAwICAgICAgIC1JbmYgICAtPiAwCitkZHNhbXExMjExIHNhbWVxdWFudHVtICAwICAgICAgICBJbmYgICAtPiAwCitkZHNhbXExMjEyIHNhbWVxdWFudHVtICAwICAgICAgICBOYU4gICAtPiAwCitkZHNhbXExMjEzIHNhbWVxdWFudHVtICAwICAgICAgIC03RSszICAtPiAwCitkZHNhbXExMjE0IHNhbWVxdWFudHVtICAwICAgICAgIC03ICAgICAtPiAxCitkZHNhbXExMjE1IHNhbWVxdWFudHVtICAwICAgICAgIC03RS0zICAtPiAwCitkZHNhbXExMjE2IHNhbWVxdWFudHVtICAwICAgICAgIC0wRS0zICAtPiAwCitkZHNhbXExMjE3IHNhbWVxdWFudHVtICAwICAgICAgIC0wICAgICAtPiAxCitkZHNhbXExMjE4IHNhbWVxdWFudHVtICAwICAgICAgIC0wRSszICAtPiAwCitkZHNhbXExMjE5IHNhbWVxdWFudHVtICAwICAgICAgICAwRS0zICAtPiAwCitkZHNhbXExMjIwIHNhbWVxdWFudHVtICAwICAgICAgICAwICAgICAtPiAxCitkZHNhbXExMjIxIHNhbWVxdWFudHVtICAwICAgICAgICAwRSszICAtPiAwCitkZHNhbXExMjIyIHNhbWVxdWFudHVtICAwICAgICAgICA3RS0zICAtPiAwCitkZHNhbXExMjIzIHNhbWVxdWFudHVtICAwICAgICAgICA3ICAgICAtPiAxCitkZHNhbXExMjI0IHNhbWVxdWFudHVtICAwICAgICAgICA3RSszICAtPiAwCitkZHNhbXExMjI1IHNhbWVxdWFudHVtICAwICAgICAgICBzTmFOICAtPiAwCisKK2Rkc2FtcTEzMTAgc2FtZXF1YW50dW0gIDBFKzMgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTEzMTEgc2FtZXF1YW50dW0gIDBFKzMgICAgIEluZiAgIC0+IDAKK2Rkc2FtcTEzMTIgc2FtZXF1YW50dW0gIDBFKzMgICAgIE5hTiAgIC0+IDAKK2Rkc2FtcTEzMTMgc2FtZXF1YW50dW0gIDBFKzMgICAgLTdFKzMgIC0+IDEKK2Rkc2FtcTEzMTQgc2FtZXF1YW50dW0gIDBFKzMgICAgLTcgICAgIC0+IDAKK2Rkc2FtcTEzMTUgc2FtZXF1YW50dW0gIDBFKzMgICAgLTdFLTMgIC0+IDAKK2Rkc2FtcTEzMTYgc2FtZXF1YW50dW0gIDBFKzMgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTEzMTcgc2FtZXF1YW50dW0gIDBFKzMgICAgLTAgICAgIC0+IDAKK2Rkc2FtcTEzMTggc2FtZXF1YW50dW0gIDBFKzMgICAgLTBFKzMgIC0+IDEKK2Rkc2FtcTEzMTkgc2FtZXF1YW50dW0gIDBFKzMgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTEzMjAgc2FtZXF1YW50dW0gIDBFKzMgICAgIDAgICAgIC0+IDAKK2Rkc2FtcTEzMjEgc2FtZXF1YW50dW0gIDBFKzMgICAgIDBFKzMgIC0+IDEKK2Rkc2FtcTEzMjIgc2FtZXF1YW50dW0gIDBFKzMgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTEzMjMgc2FtZXF1YW50dW0gIDBFKzMgICAgIDcgICAgIC0+IDAKK2Rkc2FtcTEzMjQgc2FtZXF1YW50dW0gIDBFKzMgICAgIDdFKzMgIC0+IDEKK2Rkc2FtcTEzMjUgc2FtZXF1YW50dW0gIDBFKzMgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMTQxMCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtSW5mICAgLT4gMAorZGRzYW1xMTQxMSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgSW5mICAgLT4gMAorZGRzYW1xMTQxMiBzYW1lcXVhbnR1bSAgN0UtMyAgICAgTmFOICAgLT4gMAorZGRzYW1xMTQxMyBzYW1lcXVhbnR1bSAgN0UtMyAgICAtN0UrMyAgLT4gMAorZGRzYW1xMTQxNCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtNyAgICAgLT4gMAorZGRzYW1xMTQxNSBzYW1lcXVhbnR1bSAgN0UtMyAgICAtN0UtMyAgLT4gMQorZGRzYW1xMTQxNiBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMEUtMyAgLT4gMQorZGRzYW1xMTQxNyBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMCAgICAgLT4gMAorZGRzYW1xMTQxOCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMEUrMyAgLT4gMAorZGRzYW1xMTQxOSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMEUtMyAgLT4gMQorZGRzYW1xMTQyMCBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMCAgICAgLT4gMAorZGRzYW1xMTQyMSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMEUrMyAgLT4gMAorZGRzYW1xMTQyMiBzYW1lcXVhbnR1bSAgN0UtMyAgICAgN0UtMyAgLT4gMQorZGRzYW1xMTQyMyBzYW1lcXVhbnR1bSAgN0UtMyAgICAgNyAgICAgLT4gMAorZGRzYW1xMTQyNCBzYW1lcXVhbnR1bSAgN0UtMyAgICAgN0UrMyAgLT4gMAorZGRzYW1xMTQyNSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgc05hTiAgLT4gMAorCitkZHNhbXExNTEwIHNhbWVxdWFudHVtICA3ICAgICAgLUluZiAgIC0+IDAKK2Rkc2FtcTE1MTEgc2FtZXF1YW50dW0gIDcgICAgICAgSW5mICAgLT4gMAorZGRzYW1xMTUxMiBzYW1lcXVhbnR1bSAgNyAgICAgICBOYU4gICAtPiAwCitkZHNhbXExNTEzIHNhbWVxdWFudHVtICA3ICAgICAgLTdFKzMgIC0+IDAKK2Rkc2FtcTE1MTQgc2FtZXF1YW50dW0gIDcgICAgICAtNyAgICAgLT4gMQorZGRzYW1xMTUxNSBzYW1lcXVhbnR1bSAgNyAgICAgIC03RS0zICAtPiAwCitkZHNhbXExNTE2IHNhbWVxdWFudHVtICA3ICAgICAgLTBFLTMgIC0+IDAKK2Rkc2FtcTE1MTcgc2FtZXF1YW50dW0gIDcgICAgICAtMCAgICAgLT4gMQorZGRzYW1xMTUxOCBzYW1lcXVhbnR1bSAgNyAgICAgIC0wRSszICAtPiAwCitkZHNhbXExNTE5IHNhbWVxdWFudHVtICA3ICAgICAgIDBFLTMgIC0+IDAKK2Rkc2FtcTE1MjAgc2FtZXF1YW50dW0gIDcgICAgICAgMCAgICAgLT4gMQorZGRzYW1xMTUyMSBzYW1lcXVhbnR1bSAgNyAgICAgICAwRSszICAtPiAwCitkZHNhbXExNTIyIHNhbWVxdWFudHVtICA3ICAgICAgIDdFLTMgIC0+IDAKK2Rkc2FtcTE1MjMgc2FtZXF1YW50dW0gIDcgICAgICAgNyAgICAgLT4gMQorZGRzYW1xMTUyNCBzYW1lcXVhbnR1bSAgNyAgICAgICA3RSszICAtPiAwCitkZHNhbXExNTI1IHNhbWVxdWFudHVtICA3ICAgICAgIHNOYU4gIC0+IDAKKworZGRzYW1xMTYxMCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtSW5mICAgLT4gMAorZGRzYW1xMTYxMSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgSW5mICAgLT4gMAorZGRzYW1xMTYxMiBzYW1lcXVhbnR1bSAgN0UrMyAgICAgTmFOICAgLT4gMAorZGRzYW1xMTYxMyBzYW1lcXVhbnR1bSAgN0UrMyAgICAtN0UrMyAgLT4gMQorZGRzYW1xMTYxNCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtNyAgICAgLT4gMAorZGRzYW1xMTYxNSBzYW1lcXVhbnR1bSAgN0UrMyAgICAtN0UtMyAgLT4gMAorZGRzYW1xMTYxNiBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMEUtMyAgLT4gMAorZGRzYW1xMTYxNyBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMCAgICAgLT4gMAorZGRzYW1xMTYxOCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMEUrMyAgLT4gMQorZGRzYW1xMTYxOSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMEUtMyAgLT4gMAorZGRzYW1xMTYyMCBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMCAgICAgLT4gMAorZGRzYW1xMTYyMSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMEUrMyAgLT4gMQorZGRzYW1xMTYyMiBzYW1lcXVhbnR1bSAgN0UrMyAgICAgN0UtMyAgLT4gMAorZGRzYW1xMTYyMyBzYW1lcXVhbnR1bSAgN0UrMyAgICAgNyAgICAgLT4gMAorZGRzYW1xMTYyNCBzYW1lcXVhbnR1bSAgN0UrMyAgICAgN0UrMyAgLT4gMQorZGRzYW1xMTYyNSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgc05hTiAgLT4gMAorCitkZHNhbXExNzEwIHNhbWVxdWFudHVtICBzTmFOICAgIC1JbmYgICAtPiAwCitkZHNhbXExNzExIHNhbWVxdWFudHVtICBzTmFOICAgICBJbmYgICAtPiAwCitkZHNhbXExNzEyIHNhbWVxdWFudHVtICBzTmFOICAgICBOYU4gICAtPiAxCitkZHNhbXExNzEzIHNhbWVxdWFudHVtICBzTmFOICAgIC03RSszICAtPiAwCitkZHNhbXExNzE0IHNhbWVxdWFudHVtICBzTmFOICAgIC03ICAgICAtPiAwCitkZHNhbXExNzE1IHNhbWVxdWFudHVtICBzTmFOICAgIC03RS0zICAtPiAwCitkZHNhbXExNzE2IHNhbWVxdWFudHVtICBzTmFOICAgIC0wRS0zICAtPiAwCitkZHNhbXExNzE3IHNhbWVxdWFudHVtICBzTmFOICAgIC0wICAgICAtPiAwCitkZHNhbXExNzE4IHNhbWVxdWFudHVtICBzTmFOICAgIC0wRSszICAtPiAwCitkZHNhbXExNzE5IHNhbWVxdWFudHVtICBzTmFOICAgICAwRS0zICAtPiAwCitkZHNhbXExNzIwIHNhbWVxdWFudHVtICBzTmFOICAgICAwICAgICAtPiAwCitkZHNhbXExNzIxIHNhbWVxdWFudHVtICBzTmFOICAgICAwRSszICAtPiAwCitkZHNhbXExNzIyIHNhbWVxdWFudHVtICBzTmFOICAgICA3RS0zICAtPiAwCitkZHNhbXExNzIzIHNhbWVxdWFudHVtICBzTmFOICAgICA3ICAgICAtPiAwCitkZHNhbXExNzI0IHNhbWVxdWFudHVtICBzTmFOICAgICA3RSszICAtPiAwCitkZHNhbXExNzI1IHNhbWVxdWFudHVtICBzTmFOICAgICBzTmFOICAtPiAxCistLSBub2lzeSBOYU5zCitkZHNhbXExNzMwIHNhbWVxdWFudHVtICBzTmFOMyAgICBzTmFOMyAtPiAxCitkZHNhbXExNzMxIHNhbWVxdWFudHVtICBzTmFOMyAgICBzTmFONCAtPiAxCitkZHNhbXExNzMyIHNhbWVxdWFudHVtICAgTmFOMyAgICAgTmFOMyAtPiAxCitkZHNhbXExNzMzIHNhbWVxdWFudHVtICAgTmFOMyAgICAgTmFONCAtPiAxCitkZHNhbXExNzM0IHNhbWVxdWFudHVtICBzTmFOMyAgICAgMyAgICAtPiAwCitkZHNhbXExNzM1IHNhbWVxdWFudHVtICAgTmFOMyAgICAgMyAgICAtPiAwCitkZHNhbXExNzM2IHNhbWVxdWFudHVtICAgICAgNCAgICBzTmFONCAtPiAwCitkZHNhbXExNzM3IHNhbWVxdWFudHVtICAgICAgMyAgICAgTmFOMyAtPiAwCitkZHNhbXExNzM4IHNhbWVxdWFudHVtICAgIEluZiAgICBzTmFONCAtPiAwCitkZHNhbXExNzM5IHNhbWVxdWFudHVtICAgLUluZiAgICAgTmFOMyAtPiAwCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRTY2FsZUIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRTY2FsZUIuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGVlMTFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFNjYWxlQi5kZWNUZXN0CkBAIC0wLDAgKzEsMjQzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkU2NhbGViQi5kZWNUZXN0IC0tIHNjYWxlIGEgZGVjRG91YmxlIGJ5IHBvd2VycyBvZiAxMCAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIE1heCB8cmhzfCBpcyAyKigzODQrMTYpID0gODAwCisKKy0tIFNhbml0eSBjaGVja3MKK2Rkc2NiMDAxIHNjYWxlYiAgICAgICA3LjUwICAgMTAgLT4gNy41MEUrMTAKK2Rkc2NiMDAyIHNjYWxlYiAgICAgICA3LjUwICAgIDMgLT4gNy41MEUrMworZGRzY2IwMDMgc2NhbGViICAgICAgIDcuNTAgICAgMiAtPiA3NTAKK2Rkc2NiMDA0IHNjYWxlYiAgICAgICA3LjUwICAgIDEgLT4gNzUuMAorZGRzY2IwMDUgc2NhbGViICAgICAgIDcuNTAgICAgMCAtPiA3LjUwCitkZHNjYjAwNiBzY2FsZWIgICAgICAgNy41MCAgIC0xIC0+IDAuNzUwCitkZHNjYjAwNyBzY2FsZWIgICAgICAgNy41MCAgIC0yIC0+IDAuMDc1MAorZGRzY2IwMDggc2NhbGViICAgICAgIDcuNTAgIC0xMCAtPiA3LjUwRS0xMAorZGRzY2IwMDkgc2NhbGViICAgICAgLTcuNTAgICAgMyAtPiAtNy41MEUrMworZGRzY2IwMTAgc2NhbGViICAgICAgLTcuNTAgICAgMiAtPiAtNzUwCitkZHNjYjAxMSBzY2FsZWIgICAgICAtNy41MCAgICAxIC0+IC03NS4wCitkZHNjYjAxMiBzY2FsZWIgICAgICAtNy41MCAgICAwIC0+IC03LjUwCitkZHNjYjAxMyBzY2FsZWIgICAgICAtNy41MCAgIC0xIC0+IC0wLjc1MAorCistLSBJbmZpbml0aWVzCitkZHNjYjAxNCBzY2FsZWIgIEluZmluaXR5ICAgMSAtPiBJbmZpbml0eQorZGRzY2IwMTUgc2NhbGViICAtSW5maW5pdHkgIDIgLT4gLUluZmluaXR5CitkZHNjYjAxNiBzY2FsZWIgIEluZmluaXR5ICAtMSAtPiBJbmZpbml0eQorZGRzY2IwMTcgc2NhbGViICAtSW5maW5pdHkgLTIgLT4gLUluZmluaXR5CisKKy0tIE5leHQgdHdvIGFyZSBzb21ld2hhdCB1bmRlZmluZWQgaW4gNzU0cjsgdHJlYXQgYXMgbm9uLWludGVnZXIKK2Rkc2NiMDE4IHNjYWxlYiAgMTAgIEluZmluaXR5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IwMTkgc2NhbGViICAxMCAtSW5maW5pdHkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMgYXJlIHVuZGVmaW5lZCBpbiA3NTRyOyBhc3N1bWUgdXN1YWwgcHJvY2Vzc2luZworLS0gTmFOcywgMCBwYXlsb2FkCitkZHNjYjAyMSBzY2FsZWIgICAgICAgICBOYU4gIDEgLT4gTmFOCitkZHNjYjAyMiBzY2FsZWIgICAgICAgIC1OYU4gLTEgLT4gLU5hTgorZGRzY2IwMjMgc2NhbGViICAgICAgICBzTmFOICAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IwMjQgc2NhbGViICAgICAgIC1zTmFOICAxIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDI1IHNjYWxlYiAgICA0ICAgIE5hTiAgICAtPiBOYU4KK2Rkc2NiMDI2IHNjYWxlYiAtSW5mICAgLU5hTiAgICAtPiAtTmFOCitkZHNjYjAyNyBzY2FsZWIgICAgNCAgIHNOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAyOCBzY2FsZWIgIEluZiAgLXNOYU4gICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBub24taW50ZWdlciBSSFMKK2Rkc2NiMDMwIHNjYWxlYiAgMS4yMyAgICAxICAgIC0+ICAxMi4zCitkZHNjYjAzMSBzY2FsZWIgIDEuMjMgICAgMS4wMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAzMiBzY2FsZWIgIDEuMjMgICAgMS4xICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAzMyBzY2FsZWIgIDEuMjMgICAgMS4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAzNCBzY2FsZWIgIDEuMjMgICAgMC4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAzNSBzY2FsZWIgIDEuMjMgICAgMC4xMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAzNiBzY2FsZWIgIDEuMjMgICAgMC45OTk5OTk5OTkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IwMzcgc2NhbGViICAxLjIzICAgLTEgICAgLT4gIDAuMTIzCitkZHNjYjAzOCBzY2FsZWIgIDEuMjMgICAtMS4wMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjAzOSBzY2FsZWIgIDEuMjMgICAtMS4xICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjA0MCBzY2FsZWIgIDEuMjMgICAtMS4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjA0MSBzY2FsZWIgIDEuMjMgICAtMC4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjA0MiBzY2FsZWIgIDEuMjMgICAtMC4xMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjA0MyBzY2FsZWIgIDEuMjMgICAtMC45OTk5OTk5OTkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IwNDQgc2NhbGViICAxLjIzICAgIDAuMSAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMDQ1IHNjYWxlYiAgMS4yMyAgICAxRSsxICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjA0NiBzY2FsZWIgIDEuMjMgICAgMS4xMjM0RSs2ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IwNDcgc2NhbGViICAxLjIzICAgIDEuMTIzRSs0ICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gb3V0LW9mIHJhbmdlIFJIUworZGRzY2IxMjAgc2NhbGViICAxLjIzICAgIDc5OSAgICAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rkc2NiMTIxIHNjYWxlYiAgMS4yMyAgICA4MDAgICAgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZHNjYjEyMiBzY2FsZWIgIDEuMjMgICAgODAxICAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2IxMjMgc2NhbGViICAxLjIzICAgIDgwMiAgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiMTI0IHNjYWxlYiAgMS4yMyAgIC03OTkgICAgICAgICAtPiAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rkc2NiMTI1IHNjYWxlYiAgMS4yMyAgIC04MDAgICAgICAgICAtPiAgMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rkc2NiMTI2IHNjYWxlYiAgMS4yMyAgIC04MDEgICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjEyNyBzY2FsZWIgIDEuMjMgICAtODAyICAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCistLSBwcm9wYWdhdGluZyBOYU5zCitkZHNjYjg2MSBzY2FsZWIgIE5hTjAxICAgLUluZiAgICAgLT4gIE5hTjEKK2Rkc2NiODYyIHNjYWxlYiAtTmFOMDIgICAtMTAwMCAgICAtPiAtTmFOMgorZGRzY2I4NjMgc2NhbGViICBOYU4wMyAgICAxMDAwICAgIC0+ICBOYU4zCitkZHNjYjg2NCBzY2FsZWIgIE5hTjA0ICAgIEluZiAgICAgLT4gIE5hTjQKK2Rkc2NiODY1IHNjYWxlYiAgTmFOMDUgICAgTmFONjEgICAtPiAgTmFONQorZGRzY2I4NjYgc2NhbGViIC1JbmYgICAgIC1OYU43MSAgIC0+IC1OYU43MQorZGRzY2I4Njcgc2NhbGViIC0xMDAwICAgICBOYU44MSAgIC0+ICBOYU44MQorZGRzY2I4Njggc2NhbGViICAxMDAwICAgICBOYU45MSAgIC0+ICBOYU45MQorZGRzY2I4Njkgc2NhbGViICBJbmYgICAgICBOYU4xMDEgIC0+ICBOYU4xMDEKK2Rkc2NiODcxIHNjYWxlYiAgc05hTjAxMSAgLUluZiAgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjg3MiBzY2FsZWIgIHNOYU4wMTIgIC0xMDAwICAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2I4NzMgc2NhbGViIC1zTmFOMDEzICAgMTAwMCAgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiODc0IHNjYWxlYiAgc05hTjAxNCAgIE5hTjE3MSAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjg3NSBzY2FsZWIgIHNOYU4wMTUgIHNOYU4xODEgLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2I4NzYgc2NhbGViICBOYU4wMTYgICBzTmFOMTkxIC0+ICBOYU4xOTEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiODc3IHNjYWxlYiAtSW5mICAgICAgc05hTjIwMSAtPiAgTmFOMjAxIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjg3OCBzY2FsZWIgLTEwMDAgICAgIHNOYU4yMTEgLT4gIE5hTjIxMSBJbnZhbGlkX29wZXJhdGlvbgorZGRzY2I4Nzkgc2NhbGViICAxMDAwICAgIC1zTmFOMjIxIC0+IC1OYU4yMjEgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2NiODgwIHNjYWxlYiAgSW5mICAgICAgc05hTjIzMSAtPiAgTmFOMjMxIEludmFsaWRfb3BlcmF0aW9uCitkZHNjYjg4MSBzY2FsZWIgIE5hTjAyNSAgIHNOYU4yNDEgLT4gIE5hTjI0MSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmaW5pdGVzCitkZHNjYjA1MSBzY2FsZWIgICAgICAgICAgNyAgIC0yICAtPiAwLjA3CitkZHNjYjA1MiBzY2FsZWIgICAgICAgICAtNyAgIC0yICAtPiAtMC4wNworZGRzY2IwNTMgc2NhbGViICAgICAgICAgNzUgICAtMiAgLT4gMC43NQorZGRzY2IwNTQgc2NhbGViICAgICAgICAtNzUgICAtMiAgLT4gLTAuNzUKK2Rkc2NiMDU1IHNjYWxlYiAgICAgICA3LjUwICAgLTIgIC0+IDAuMDc1MAorZGRzY2IwNTYgc2NhbGViICAgICAgLTcuNTAgICAtMiAgLT4gLTAuMDc1MAorZGRzY2IwNTcgc2NhbGViICAgICAgIDcuNTAwICAtMiAgLT4gMC4wNzUwMAorZGRzY2IwNTggc2NhbGViICAgICAgLTcuNTAwICAtMiAgLT4gLTAuMDc1MDAKK2Rkc2NiMDYxIHNjYWxlYiAgICAgICAgICA3ICAgLTEgIC0+IDAuNworZGRzY2IwNjIgc2NhbGViICAgICAgICAgLTcgICAtMSAgLT4gLTAuNworZGRzY2IwNjMgc2NhbGViICAgICAgICAgNzUgICAtMSAgLT4gNy41CitkZHNjYjA2NCBzY2FsZWIgICAgICAgIC03NSAgIC0xICAtPiAtNy41CitkZHNjYjA2NSBzY2FsZWIgICAgICAgNy41MCAgIC0xICAtPiAwLjc1MAorZGRzY2IwNjYgc2NhbGViICAgICAgLTcuNTAgICAtMSAgLT4gLTAuNzUwCitkZHNjYjA2NyBzY2FsZWIgICAgICAgNy41MDAgIC0xICAtPiAwLjc1MDAKK2Rkc2NiMDY4IHNjYWxlYiAgICAgIC03LjUwMCAgLTEgIC0+IC0wLjc1MDAKK2Rkc2NiMDcxIHNjYWxlYiAgICAgICAgICA3ICAgIDAgIC0+IDcKK2Rkc2NiMDcyIHNjYWxlYiAgICAgICAgIC03ICAgIDAgIC0+IC03CitkZHNjYjA3MyBzY2FsZWIgICAgICAgICA3NSAgICAwICAtPiA3NQorZGRzY2IwNzQgc2NhbGViICAgICAgICAtNzUgICAgMCAgLT4gLTc1CitkZHNjYjA3NSBzY2FsZWIgICAgICAgNy41MCAgICAwICAtPiA3LjUwCitkZHNjYjA3NiBzY2FsZWIgICAgICAtNy41MCAgICAwICAtPiAtNy41MAorZGRzY2IwNzcgc2NhbGViICAgICAgIDcuNTAwICAgMCAgLT4gNy41MDAKK2Rkc2NiMDc4IHNjYWxlYiAgICAgIC03LjUwMCAgIDAgIC0+IC03LjUwMAorZGRzY2IwODEgc2NhbGViICAgICAgICAgIDcgICAgMSAgLT4gN0UrMQorZGRzY2IwODIgc2NhbGViICAgICAgICAgLTcgICAgMSAgLT4gLTdFKzEKK2Rkc2NiMDgzIHNjYWxlYiAgICAgICAgIDc1ICAgIDEgIC0+IDcuNUUrMgorZGRzY2IwODQgc2NhbGViICAgICAgICAtNzUgICAgMSAgLT4gLTcuNUUrMgorZGRzY2IwODUgc2NhbGViICAgICAgIDcuNTAgICAgMSAgLT4gNzUuMAorZGRzY2IwODYgc2NhbGViICAgICAgLTcuNTAgICAgMSAgLT4gLTc1LjAKK2Rkc2NiMDg3IHNjYWxlYiAgICAgICA3LjUwMCAgIDEgIC0+IDc1LjAwCitkZHNjYjA4OCBzY2FsZWIgICAgICAtNy41MDAgICAxICAtPiAtNzUuMDAKK2Rkc2NiMDkxIHNjYWxlYiAgICAgICAgICA3ICAgIDIgIC0+IDdFKzIKK2Rkc2NiMDkyIHNjYWxlYiAgICAgICAgIC03ICAgIDIgIC0+IC03RSsyCitkZHNjYjA5MyBzY2FsZWIgICAgICAgICA3NSAgICAyICAtPiA3LjVFKzMKK2Rkc2NiMDk0IHNjYWxlYiAgICAgICAgLTc1ICAgIDIgIC0+IC03LjVFKzMKK2Rkc2NiMDk1IHNjYWxlYiAgICAgICA3LjUwICAgIDIgIC0+IDc1MAorZGRzY2IwOTYgc2NhbGViICAgICAgLTcuNTAgICAgMiAgLT4gLTc1MAorZGRzY2IwOTcgc2NhbGViICAgICAgIDcuNTAwICAgMiAgLT4gNzUwLjAKK2Rkc2NiMDk4IHNjYWxlYiAgICAgIC03LjUwMCAgIDIgIC0+IC03NTAuMAorCistLSB6ZXJvcworZGRzY2IxMTEgc2NhbGViICAgICAgICAgIDAgIDEgLT4gMEUrMQorZGRzY2IxMTIgc2NhbGViICAgICAgICAgLTAgIDIgLT4gLTBFKzIKK2Rkc2NiMTEzIHNjYWxlYiAgICAgICAwRSs0ICAzIC0+IDBFKzcKK2Rkc2NiMTE0IHNjYWxlYiAgICAgIC0wRSs0ICA0IC0+IC0wRSs4CitkZHNjYjExNSBzY2FsZWIgICAgIDAuMDAwMCAgNSAtPiAwRSsxCitkZHNjYjExNiBzY2FsZWIgICAgLTAuMDAwMCAgNiAtPiAtMEUrMgorZGRzY2IxMTcgc2NhbGViICAgICAgMEUtMTQxIDcgLT4gMEUtMTM0CitkZHNjYjExOCBzY2FsZWIgICAgIC0wRS0xNDEgOCAtPiAtMEUtMTMzCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkZHNjYjEzMiBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICszODQgLT4gSW5maW5pdHkgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZHNjYjEzMyBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICsxMCAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZHNjYjEzNCBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICsxICAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZHNjYjEzNSBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitkZHNjYjEzNiBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIC0xICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzgzCitkZHNjYjEzNyBzY2FsZWIgIDFFLTM4MyAgICAgICAgICAgKzEgIC0+IDFFLTM4MgorZGRzY2IxMzggc2NhbGViICAxRS0zODMgICAgICAgICAgIC0wICAtPiAxRS0zODMKK2Rkc2NiMTM5IHNjYWxlYiAgMUUtMzgzICAgICAgICAgICAtMSAgLT4gMUUtMzg0ICAgICAgICAgIFN1Ym5vcm1hbAorZGRzY2IxNDAgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICArMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MgorZGRzY2IxNDEgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRzY2IxNDIgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjE0MyBzY2FsZWIgIDFFLTM5OCAgICAgICAgICArMSAgLT4gMUUtMzk3ICAgICAgICAgIFN1Ym5vcm1hbAorZGRzY2IxNDQgc2NhbGViICAxRS0zOTggICAgICAgICAgLTAgIC0+IDFFLTM5OCAgICAgICAgIFN1Ym5vcm1hbAorZGRzY2IxNDUgc2NhbGViICAxRS0zOTggICAgICAgICAgLTEgIC0+IDBFLTM5OCAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZGRzY2IxNTAgc2NhbGViICAtMUUtMzk4ICAgICAgICAgKzEgIC0+IC0xRS0zOTcgICAgICAgICBTdWJub3JtYWwKK2Rkc2NiMTUxIHNjYWxlYiAgLTFFLTM5OCAgICAgICAgIC0wICAtPiAtMUUtMzk4ICAgICAgICBTdWJub3JtYWwKK2Rkc2NiMTUyIHNjYWxlYiAgLTFFLTM5OCAgICAgICAgIC0xICAtPiAtMEUtMzk4ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkZHNjYjE1MyBzY2FsZWIgIC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICsxICAtPiAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MgorZGRzY2IxNTQgc2NhbGViICAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyArMCAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKK2Rkc2NiMTU1IHNjYWxlYiAgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgLTEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwRS0zODQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rkc2NiMTU2IHNjYWxlYiAgLTFFLTM4MyAgICAgICAgICArMSAgLT4gLTFFLTM4MgorZGRzY2IxNTcgc2NhbGViICAtMUUtMzgzICAgICAgICAgIC0wICAtPiAtMUUtMzgzCitkZHNjYjE1OCBzY2FsZWIgIC0xRS0zODMgICAgICAgICAgLTEgIC0+IC0xRS0zODQgICAgICAgICAgU3Vibm9ybWFsCitkZHNjYjE1OSBzY2FsZWIgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICsxICAtPiAtSW5maW5pdHkgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGRzY2IxNjAgc2NhbGViICAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCArMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQKK2Rkc2NiMTYxIHNjYWxlYiAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLTEgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzgzCitkZHNjYjE2MiBzY2FsZWIgIC05RSszODQgICAgICAgICAgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkZHNjYjE2MyBzY2FsZWIgIC0xRSszODQgICAgICAgICAgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgT3JpZ2FtaQorLS0gKHRoZXNlIGNoZWNrIHRoYXQgb3ZlcmZsb3cgaXMgYmVpbmcgZG9uZSBjb3JyZWN0bHkpCitkZHNjYjE3MSBzY2FsZWIgICAxMDAwRSszNjUgICsxIC0+IDEuMDAwRSszNjkKK2Rkc2NiMTcyIHNjYWxlYiAgIDEwMDBFKzM2NiAgKzEgLT4gMS4wMDBFKzM3MAorZGRzY2IxNzMgc2NhbGViICAgMTAwMEUrMzY3ICArMSAtPiAxLjAwMEUrMzcxCitkZHNjYjE3NCBzY2FsZWIgICAxMDAwRSszNjggICsxIC0+IDEuMDAwRSszNzIKK2Rkc2NiMTc1IHNjYWxlYiAgIDEwMDBFKzM2OSAgKzEgLT4gMS4wMDAwRSszNzMgICAgICAgICAgICAgICAgICBDbGFtcGVkCitkZHNjYjE3NiBzY2FsZWIgICAxMDAwRSszNzAgICsxIC0+IDEuMDAwMDBFKzM3NCAgICAgICAgICAgICAgICAgQ2xhbXBlZAorZGRzY2IxNzcgc2NhbGViICAgMTAwMEUrMzcxICArMSAtPiAxLjAwMDAwMEUrMzc1ICAgICAgICAgICAgICAgIENsYW1wZWQKK2Rkc2NiMTc4IHNjYWxlYiAgIDEwMDBFKzM3MiAgKzEgLT4gMS4wMDAwMDAwRSszNzYgICAgICAgICAgICAgICBDbGFtcGVkCitkZHNjYjE3OSBzY2FsZWIgICAxMDAwRSszNzMgICsxIC0+IDEuMDAwMDAwMDBFKzM3NyAgICAgICAgICAgICAgQ2xhbXBlZAorZGRzY2IxODAgc2NhbGViICAgMTAwMEUrMzc0ICArMSAtPiAxLjAwMDAwMDAwMEUrMzc4ICAgICAgICAgICAgIENsYW1wZWQKK2Rkc2NiMTgxIHNjYWxlYiAgIDEwMDBFKzM3NSAgKzEgLT4gMS4wMDAwMDAwMDAwRSszNzkgICAgICAgICAgICBDbGFtcGVkCitkZHNjYjE4MiBzY2FsZWIgICAxMDAwRSszNzYgICsxIC0+IDEuMDAwMDAwMDAwMDBFKzM4MCAgICAgICAgICAgQ2xhbXBlZAorZGRzY2IxODMgc2NhbGViICAgMTAwMEUrMzc3ICArMSAtPiAxLjAwMDAwMDAwMDAwMEUrMzgxICAgICAgICAgIENsYW1wZWQKK2Rkc2NiMTg0IHNjYWxlYiAgIDEwMDBFKzM3OCAgKzEgLT4gMS4wMDAwMDAwMDAwMDAwRSszODIgICAgICAgICBDbGFtcGVkCitkZHNjYjE4NSBzY2FsZWIgICAxMDAwRSszNzkgICsxIC0+IDEuMDAwMDAwMDAwMDAwMDBFKzM4MyAgICAgICAgQ2xhbXBlZAorZGRzY2IxODYgc2NhbGViICAgMTAwMEUrMzgwICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICAgICAgIENsYW1wZWQKK2Rkc2NiMTg3IHNjYWxlYiAgIDEwMDBFKzM4MSAgKzEgLT4gSW5maW5pdHkgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIGFuZCBhIGZldyBtb3JlIHN1Ym5vcm1hbCB0cnVuY2F0aW9ucworLS0gKHRoZXNlIGNoZWNrIHRoYXQgdW5kZXJmbG93IGlzIGJlaW5nIGRvbmUgY29ycmVjdGx5KQorZGRzY2IyMDEgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MworZGRzY2IyMDIgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIwMyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0yICAtPiAxLjAwMDAwMDAwMDAwMDBFLTM4NSBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMDQgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMyAgLT4gMS4wMDAwMDAwMDAwMDBFLTM4NiBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMDUgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtNCAgLT4gMS4wMDAwMDAwMDAwMEUtMzg3IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIwNiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC01ICAtPiAxLjAwMDAwMDAwMDBFLTM4OCBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMDcgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtNiAgLT4gMS4wMDAwMDAwMDBFLTM4OSBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMDggc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtNyAgLT4gMS4wMDAwMDAwMEUtMzkwIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIwOSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC04ICAtPiAxLjAwMDAwMDBFLTM5MSBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMTAgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtOSAgLT4gMS4wMDAwMDBFLTM5MiBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMTEgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMTAgLT4gMS4wMDAwMEUtMzkzIFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxMiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xMSAtPiAxLjAwMDBFLTM5NCBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMTMgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMTIgLT4gMS4wMDBFLTM5NSBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMTQgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMTMgLT4gMS4wMEUtMzk2IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxNSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xNCAtPiAxLjBFLTM5NyBTdWJub3JtYWwgUm91bmRlZAorZGRzY2IyMTYgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMTUgLT4gMUUtMzk4IFN1Ym5vcm1hbCBSb3VuZGVkCitkZHNjYjIxNyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgIC0xNiAtPiAwRS0zOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGRzY2IyMTggc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAtMTcgLT4gMEUtMzk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFNoaWZ0LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU2hpZnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJhMjM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZFNoaWZ0LmRlY1Rlc3QKQEAgLTAsMCArMSwyNjIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGRTaGlmdC5kZWNUZXN0IC0tIHNoaWZ0IGRlY0RvdWJsZSBjb2VmZmljaWVudCBsZWZ0IG9yIHJpZ2h0ICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkZHNoaTAwMSBzaGlmdCAgICAgICAgICAgICAgICAgMCAgICAwICAtPiAgMAorZGRzaGkwMDIgc2hpZnQgICAgICAgICAgICAgICAgIDAgICAgMiAgLT4gIDAKK2Rkc2hpMDAzIHNoaWZ0ICAgICAgICAgICAgICAgICAxICAgIDIgIC0+ICAxMDAKK2Rkc2hpMDA0IHNoaWZ0ICAgICAgICAgICAgICAgICAxICAgMTUgIC0+ICAxMDAwMDAwMDAwMDAwMDAwCitkZHNoaTAwNSBzaGlmdCAgICAgICAgICAgICAgICAgMSAgIDE2ICAtPiAgMAorZGRzaGkwMDYgc2hpZnQgICAgICAgICAgICAgICAgIDEgICAtMSAgLT4gIDAKK2Rkc2hpMDA3IHNoaWZ0ICAgICAgICAgICAgICAgICAwICAgLTIgIC0+ICAwCitkZHNoaTAwOCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xICAtPiAgMTIzNDU2Nzg5MDEyMzQ1CitkZHNoaTAwOSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgIC0xNSAtPiAgMQorZGRzaGkwMTAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAtMTYgLT4gIDAKK2Rkc2hpMDExIHNoaWZ0ICA5OTM0NTY3ODkwMTIzNDU2ICAgLTE1IC0+ICA5CitkZHNoaTAxMiBzaGlmdCAgOTkzNDU2Nzg5MDEyMzQ1NiAgIC0xNiAtPiAgMAorCistLSByaHMgbXVzdCBiZSBhbiBpbnRlZ2VyCitkZHNoaTAxNSBzaGlmdCAgICAgICAgMSAgICAxLjUgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAxNiBzaGlmdCAgICAgICAgMSAgICAxLjAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAxNyBzaGlmdCAgICAgICAgMSAgICAwLjEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAxOCBzaGlmdCAgICAgICAgMSAgICAwLjAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAxOSBzaGlmdCAgICAgICAgMSAgICAxRSsxICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAyMCBzaGlmdCAgICAgICAgMSAgICAxRSs5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAyMSBzaGlmdCAgICAgICAgMSAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAyMiBzaGlmdCAgICAgICAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhbmQgfHJoc3wgPD0gcHJlY2lzaW9uCitkZHNoaTAyNSBzaGlmdCAgICAgICAgMSAgICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAyNiBzaGlmdCAgICAgICAgMSAgICAtMTcgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAyNyBzaGlmdCAgICAgICAgMSAgICAgMTcgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTAyOCBzaGlmdCAgICAgICAgMSAgICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZ1bGwgc2hpZnRpbmcgcGF0dGVybgorZGRzaGkwMzAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICAtMTYgIC0+IDAKK2Rkc2hpMDMxIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTE1ICAtPiAxCitkZHNoaTAzMiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0xNCAgLT4gMTIKK2Rkc2hpMDMzIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTEzICAtPiAxMjMKK2Rkc2hpMDM0IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTEyICAtPiAxMjM0CitkZHNoaTAzNSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0xMSAgLT4gMTIzNDUKK2Rkc2hpMDM2IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTEwICAtPiAxMjM0NTYKK2Rkc2hpMDM3IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTkgICAtPiAxMjM0NTY3CitkZHNoaTAzOCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC04ICAgLT4gMTIzNDU2NzgKK2Rkc2hpMDM5IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTcgICAtPiAxMjM0NTY3ODkKK2Rkc2hpMDQwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTYgICAtPiAxMjM0NTY3ODkwCitkZHNoaTA0MSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC01ICAgLT4gMTIzNDU2Nzg5MDEKK2Rkc2hpMDQyIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTQgICAtPiAxMjM0NTY3ODkwMTIKK2Rkc2hpMDQzIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTMgICAtPiAxMjM0NTY3ODkwMTIzCitkZHNoaTA0NCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgIC0yICAgLT4gMTIzNDU2Nzg5MDEyMzQKK2Rkc2hpMDQ1IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTEgICAtPiAxMjM0NTY3ODkwMTIzNDUKK2Rkc2hpMDQ2IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgLTAgICAtPiAxMjM0NTY3ODkwMTIzNDU2CisKK2Rkc2hpMDQ3IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzAgICAtPiAxMjM0NTY3ODkwMTIzNDU2CitkZHNoaTA0OCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxICAgLT4gMjM0NTY3ODkwMTIzNDU2MAorZGRzaGkwNDkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMiAgIC0+IDM0NTY3ODkwMTIzNDU2MDAKK2Rkc2hpMDUwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzMgICAtPiA0NTY3ODkwMTIzNDU2MDAwCitkZHNoaTA1MSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs0ICAgLT4gNTY3ODkwMTIzNDU2MDAwMAorZGRzaGkwNTIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArNSAgIC0+IDY3ODkwMTIzNDU2MDAwMDAKK2Rkc2hpMDUzIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzYgICAtPiA3ODkwMTIzNDU2MDAwMDAwCitkZHNoaTA1NCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICs3ICAgLT4gODkwMTIzNDU2MDAwMDAwMAorZGRzaGkwNTUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArOCAgIC0+IDkwMTIzNDU2MDAwMDAwMDAKK2Rkc2hpMDU2IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzkgICAtPiAgMTIzNDU2MDAwMDAwMDAwCitkZHNoaTA1NyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxMCAgLT4gMTIzNDU2MDAwMDAwMDAwMAorZGRzaGkwNTggc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTEgIC0+IDIzNDU2MDAwMDAwMDAwMDAKK2Rkc2hpMDU5IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzEyICAtPiAzNDU2MDAwMDAwMDAwMDAwCitkZHNoaTA2MCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxMyAgLT4gNDU2MDAwMDAwMDAwMDAwMAorZGRzaGkwNjEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTYgICAgICAgICArMTQgIC0+IDU2MDAwMDAwMDAwMDAwMDAKK2Rkc2hpMDYyIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgICAgKzE1ICAtPiA2MDAwMDAwMDAwMDAwMDAwCitkZHNoaTA2MyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAgICsxNiAgLT4gMAorCistLSB6ZXJvcworZGRzaGkwNzAgc2hpZnQgIDBFLTEwICAgICAgICAgICAgICArOSAgIC0+ICAgMEUtMTAKK2Rkc2hpMDcxIHNoaWZ0ICAwRS0xMCAgICAgICAgICAgICAgLTkgICAtPiAgIDBFLTEwCitkZHNoaTA3MiBzaGlmdCAgMC4wMDAgICAgICAgICAgICAgICs5ICAgLT4gICAwLjAwMAorZGRzaGkwNzMgc2hpZnQgIDAuMDAwICAgICAgICAgICAgICAtOSAgIC0+ICAgMC4wMDAKK2Rkc2hpMDc0IHNoaWZ0ICAwRSsxMCAgICAgICAgICAgICAgKzkgICAtPiAgIDBFKzEwCitkZHNoaTA3NSBzaGlmdCAgMEUrMTAgICAgICAgICAgICAgIC05ICAgLT4gICAwRSsxMAorZGRzaGkwNzYgc2hpZnQgLTBFLTEwICAgICAgICAgICAgICArOSAgIC0+ICAtMEUtMTAKK2Rkc2hpMDc3IHNoaWZ0IC0wRS0xMCAgICAgICAgICAgICAgLTkgICAtPiAgLTBFLTEwCitkZHNoaTA3OCBzaGlmdCAtMC4wMDAgICAgICAgICAgICAgICs5ICAgLT4gIC0wLjAwMAorZGRzaGkwNzkgc2hpZnQgLTAuMDAwICAgICAgICAgICAgICAtOSAgIC0+ICAtMC4wMDAKK2Rkc2hpMDgwIHNoaWZ0IC0wRSsxMCAgICAgICAgICAgICAgKzkgICAtPiAgLTBFKzEwCitkZHNoaTA4MSBzaGlmdCAtMEUrMTAgICAgICAgICAgICAgIC05ICAgLT4gIC0wRSsxMAorCistLSBObWF4LCBObWluLCBOdGlueQorZGRzaGkxNDEgc2hpZnQgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgIC0xICAtPiA5Ljk5OTk5OTk5OTk5OTk5RSszODMKK2Rkc2hpMTQyIHNoaWZ0ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAtMTUgLT4gOUUrMzY5CitkZHNoaTE0MyBzaGlmdCAgOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgIDEgIC0+IDkuOTk5OTk5OTk5OTk5OTkwRSszODQKK2Rkc2hpMTQ0IHNoaWZ0ICA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAgMTUgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NAorZGRzaGkxNDUgc2hpZnQgIDFFLTM4MyAgICAgICAgICAgICAgICAgICAgIC0xICAtPiAwRS0zODMKK2Rkc2hpMTQ2IHNoaWZ0ICAxRS0zODMgICAgICAgICAgICAgICAgICAgICAtMTUgLT4gMEUtMzgzCitkZHNoaTE0NyBzaGlmdCAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtMzgyCitkZHNoaTE0OCBzaGlmdCAgMUUtMzgzICAgICAgICAgICAgICAgICAgICAgIDE1IC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zNjgKK2Rkc2hpMTUxIHNoaWZ0ICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMEUtMzg0CitkZHNoaTE1MiBzaGlmdCAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IDFFLTM5OAorZGRzaGkxNTMgc2hpZnQgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxICAtPiAwRS0zOTgKK2Rkc2hpMTU0IHNoaWZ0ICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMTUgLT4gMEUtMzk4CitkZHNoaTE1NSBzaGlmdCAgOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTEgIC0+IDkuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRzaGkxNTYgc2hpZnQgIDkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xNSAtPiA5RS0zOTgKK2Rkc2hpMTU3IHNoaWZ0ICA5LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMSAgLT4gMEUtMzk4CitkZHNoaTE1OCBzaGlmdCAgOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDE1IC0+IDBFLTM5OAorZGRzaGkxNjAgc2hpZnQgIDFFLTM5OCAgICAgICAgICAgICAgICAgICAgIC0xICAtPiAwRS0zOTgKK2Rkc2hpMTYxIHNoaWZ0ICAxRS0zOTggICAgICAgICAgICAgICAgICAgICAtMTUgLT4gMEUtMzk4CitkZHNoaTE2MiBzaGlmdCAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtMzk3CitkZHNoaTE2MyBzaGlmdCAgMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgIDE1IC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMKKy0tICBuZWdhdGl2ZXMKK2Rkc2hpMTcxIHNoaWZ0IC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0ICAgICAtMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTlFKzM4MworZGRzaGkxNzIgc2hpZnQgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgIC0xNSAtPiAtOUUrMzY5CitkZHNoaTE3MyBzaGlmdCAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgIDEgIC0+IC05Ljk5OTk5OTk5OTk5OTk5MEUrMzg0CitkZHNoaTE3NCBzaGlmdCAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCAgICAgIDE1IC0+IC05LjAwMDAwMDAwMDAwMDAwMEUrMzg0CitkZHNoaTE3NSBzaGlmdCAtMUUtMzgzICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IC0wRS0zODMKK2Rkc2hpMTc2IHNoaWZ0IC0xRS0zODMgICAgICAgICAgICAgICAgICAgICAtMTUgLT4gLTBFLTM4MworZGRzaGkxNzcgc2hpZnQgLTFFLTM4MyAgICAgICAgICAgICAgICAgICAgICAxICAtPiAtMS4wRS0zODIKK2Rkc2hpMTc4IHNoaWZ0IC0xRS0zODMgICAgICAgICAgICAgICAgICAgICAgMTUgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zNjgKK2Rkc2hpMTgxIHNoaWZ0IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDBFLTM4NAorZGRzaGkxODIgc2hpZnQgLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xNSAtPiAtMUUtMzk4CitkZHNoaTE4MyBzaGlmdCAtMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgIDEgIC0+IC0wRS0zOTgKK2Rkc2hpMTg0IHNoaWZ0IC0xLjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMTUgLT4gLTBFLTM5OAorZGRzaGkxODUgc2hpZnQgLTkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgIC0xICAtPiAtOS4wMDAwMDAwMDAwMDAwMEUtMzg0CitkZHNoaTE4NiBzaGlmdCAtOS4wMDAwMDAwMDAwMDAwMDBFLTM4MyAgICAgLTE1IC0+IC05RS0zOTgKK2Rkc2hpMTg3IHNoaWZ0IC05LjAwMDAwMDAwMDAwMDAwMEUtMzgzICAgICAgMSAgLT4gLTBFLTM5OAorZGRzaGkxODggc2hpZnQgLTkuMDAwMDAwMDAwMDAwMDAwRS0zODMgICAgICAxNSAtPiAtMEUtMzk4CitkZHNoaTE5MCBzaGlmdCAtMUUtMzk4ICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IC0wRS0zOTgKK2Rkc2hpMTkxIHNoaWZ0IC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAtMTUgLT4gLTBFLTM5OAorZGRzaGkxOTIgc2hpZnQgLTFFLTM5OCAgICAgICAgICAgICAgICAgICAgICAxICAtPiAtMS4wRS0zOTcKK2Rkc2hpMTkzIHNoaWZ0IC0xRS0zOTggICAgICAgICAgICAgICAgICAgICAgMTUgLT4gLTEuMDAwMDAwMDAwMDAwMDAwRS0zODMKKworLS0gbW9yZSBuZWdhdGl2ZXMgKG9mIHNhbml0aWVzKQorZGRzaGkyMDEgc2hpZnQgICAgICAgICAgICAgICAgLTAgICAgMCAgLT4gLTAKK2Rkc2hpMjAyIHNoaWZ0ICAgICAgICAgICAgICAgIC0wICAgIDIgIC0+IC0wCitkZHNoaTIwMyBzaGlmdCAgICAgICAgICAgICAgICAtMSAgICAyICAtPiAtMTAwCitkZHNoaTIwNCBzaGlmdCAgICAgICAgICAgICAgICAtMSAgIDE1ICAtPiAtMTAwMDAwMDAwMDAwMDAwMAorZGRzaGkyMDUgc2hpZnQgICAgICAgICAgICAgICAgLTEgICAxNiAgLT4gLTAKK2Rkc2hpMjA2IHNoaWZ0ICAgICAgICAgICAgICAgIC0xICAgLTEgIC0+IC0wCitkZHNoaTIwNyBzaGlmdCAgICAgICAgICAgICAgICAtMCAgIC0yICAtPiAtMAorZGRzaGkyMDggc2hpZnQgLTEyMzQ1Njc4OTAxMjM0NTYgICAtMSAgLT4gLTEyMzQ1Njc4OTAxMjM0NQorZGRzaGkyMDkgc2hpZnQgLTEyMzQ1Njc4OTAxMjM0NTYgICAtMTUgLT4gLTEKK2Rkc2hpMjEwIHNoaWZ0IC0xMjM0NTY3ODkwMTIzNDU2ICAgLTE2IC0+IC0wCitkZHNoaTIxMSBzaGlmdCAtOTkzNDU2Nzg5MDEyMzQ1NiAgIC0xNSAtPiAtOQorZGRzaGkyMTIgc2hpZnQgLTk5MzQ1Njc4OTAxMjM0NTYgICAtMTYgLT4gLTAKKworCistLSBTcGVjaWFsczsgTmFOcyBhcmUgaGFuZGxlZCBhcyB1c3VhbAorZGRzaGk3ODEgc2hpZnQgLUluZiAgLTggICAgIC0+IC1JbmZpbml0eQorZGRzaGk3ODIgc2hpZnQgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZGRzaGk3ODMgc2hpZnQgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZGRzaGk3ODQgc2hpZnQgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZGRzaGk3ODUgc2hpZnQgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZGRzaGk3ODYgc2hpZnQgLUluZiAgIDggICAgIC0+IC1JbmZpbml0eQorZGRzaGk3ODcgc2hpZnQgLTEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk3ODggc2hpZnQgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk3ODkgc2hpZnQgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk3OTAgc2hpZnQgLTAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk3OTEgc2hpZnQgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk3OTIgc2hpZnQgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk3OTMgc2hpZnQgIDEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk3OTQgc2hpZnQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHNoaTgwMCBzaGlmdCAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgwMSBzaGlmdCAgSW5mICAtOCAgICAgLT4gSW5maW5pdHkKK2Rkc2hpODAyIHNoaWZ0ICBJbmYgIC0xICAgICAtPiBJbmZpbml0eQorZGRzaGk4MDMgc2hpZnQgIEluZiAgLTAgICAgIC0+IEluZmluaXR5CitkZHNoaTgwNCBzaGlmdCAgSW5mICAgMCAgICAgLT4gSW5maW5pdHkKK2Rkc2hpODA1IHNoaWZ0ICBJbmYgICAxICAgICAtPiBJbmZpbml0eQorZGRzaGk4MDYgc2hpZnQgIEluZiAgIDggICAgIC0+IEluZmluaXR5CitkZHNoaTgwNyBzaGlmdCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgwOCBzaGlmdCAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgwOSBzaGlmdCAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgxMCBzaGlmdCAtMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgxMSBzaGlmdCAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgxMiBzaGlmdCAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgxMyBzaGlmdCAgMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgxNCBzaGlmdCAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTgxNSBzaGlmdCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rkc2hpODIxIHNoaWZ0ICBOYU4gLUluZiAgICAtPiAgTmFOCitkZHNoaTgyMiBzaGlmdCAgTmFOIC0xMDAwICAgLT4gIE5hTgorZGRzaGk4MjMgc2hpZnQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2Rkc2hpODI0IHNoaWZ0ICBOYU4gLTAgICAgICAtPiAgTmFOCitkZHNoaTgyNSBzaGlmdCAgTmFOICAwICAgICAgLT4gIE5hTgorZGRzaGk4MjYgc2hpZnQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2Rkc2hpODI3IHNoaWZ0ICBOYU4gIDEwMDAgICAtPiAgTmFOCitkZHNoaTgyOCBzaGlmdCAgTmFOICBJbmYgICAgLT4gIE5hTgorZGRzaGk4Mjkgc2hpZnQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2Rkc2hpODMwIHNoaWZ0IC1JbmYgIE5hTiAgICAtPiAgTmFOCitkZHNoaTgzMSBzaGlmdCAtMTAwMCBOYU4gICAgLT4gIE5hTgorZGRzaGk4MzIgc2hpZnQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2Rkc2hpODMzIHNoaWZ0IC0wICAgIE5hTiAgICAtPiAgTmFOCitkZHNoaTgzNCBzaGlmdCAgMCAgICBOYU4gICAgLT4gIE5hTgorZGRzaGk4MzUgc2hpZnQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2Rkc2hpODM2IHNoaWZ0ICAxMDAwIE5hTiAgICAtPiAgTmFOCitkZHNoaTgzNyBzaGlmdCAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkZHNoaTg0MSBzaGlmdCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODQyIHNoaWZ0ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NDMgc2hpZnQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg0NCBzaGlmdCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODQ1IHNoaWZ0ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NDYgc2hpZnQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg0NyBzaGlmdCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODQ4IHNoaWZ0ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NDkgc2hpZnQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg1MCBzaGlmdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODUxIHNoaWZ0IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NTIgc2hpZnQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg1MyBzaGlmdCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODU0IHNoaWZ0IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NTUgc2hpZnQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg1NiBzaGlmdCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODU3IHNoaWZ0ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NTggc2hpZnQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg1OSBzaGlmdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRzaGk4NjEgc2hpZnQgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitkZHNoaTg2MiBzaGlmdCArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2Rkc2hpODYzIHNoaWZ0ICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZGRzaGk4NjQgc2hpZnQgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitkZHNoaTg2NSBzaGlmdCAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2Rkc2hpODY2IHNoaWZ0IC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZGRzaGk4Njcgc2hpZnQgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitkZHNoaTg2OCBzaGlmdCAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2Rkc2hpODY5IHNoaWZ0ICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2Rkc2hpODcxIHNoaWZ0ICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg3MiBzaGlmdCAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NzMgc2hpZnQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODc0IHNoaWZ0ICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg3NSBzaGlmdCAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4NzYgc2hpZnQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODc3IHNoaWZ0IC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg3OCBzaGlmdCAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4Nzkgc2hpZnQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODgwIHNoaWZ0ICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitkZHNoaTg4MSBzaGlmdCArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZGRzaGk4ODIgc2hpZnQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZGRzaGk4ODMgc2hpZnQgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc2hpODg0IHNoaWZ0ICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2Rkc2hpODg1IHNoaWZ0ICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU3VidHJhY3QuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRTdWJ0cmFjdC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmM0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkU3VidHJhY3QuZGVjVGVzdApAQCAtMCwwICsxLDYyOSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFN1YnRyYWN0LmRlY1Rlc3QgLS0gZGVjRG91YmxlIHN1YnRyYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIGFyZSBmb3IgZGVjRG91YmxlcyBvbmx5OyBhbGwgYXJndW1lbnRzIGFyZQorLS0gcmVwcmVzZW50YWJsZSBpbiBhIGRlY0RvdWJsZQorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFtmaXJzdCBncm91cCBhcmUgJ3F1aWNrIGNvbmZpZGVuY2UgY2hlY2snXQorZGRzdWIwMDEgc3VidHJhY3QgIDAgICAwICAtPiAnMCcKK2Rkc3ViMDAyIHN1YnRyYWN0ICAxICAgMSAgLT4gJzAnCitkZHN1YjAwMyBzdWJ0cmFjdCAgMSAgIDIgIC0+ICctMScKK2Rkc3ViMDA0IHN1YnRyYWN0ICAyICAgMSAgLT4gJzEnCitkZHN1YjAwNSBzdWJ0cmFjdCAgMiAgIDIgIC0+ICcwJworZGRzdWIwMDYgc3VidHJhY3QgIDMgICAyICAtPiAnMScKK2Rkc3ViMDA3IHN1YnRyYWN0ICAyICAgMyAgLT4gJy0xJworCitkZHN1YjAxMSBzdWJ0cmFjdCAtMCAgIDAgIC0+ICctMCcKK2Rkc3ViMDEyIHN1YnRyYWN0IC0xICAgMSAgLT4gJy0yJworZGRzdWIwMTMgc3VidHJhY3QgLTEgICAyICAtPiAnLTMnCitkZHN1YjAxNCBzdWJ0cmFjdCAtMiAgIDEgIC0+ICctMycKK2Rkc3ViMDE1IHN1YnRyYWN0IC0yICAgMiAgLT4gJy00JworZGRzdWIwMTYgc3VidHJhY3QgLTMgICAyICAtPiAnLTUnCitkZHN1YjAxNyBzdWJ0cmFjdCAtMiAgIDMgIC0+ICctNScKKworZGRzdWIwMjEgc3VidHJhY3QgIDAgIC0wICAtPiAnMCcKK2Rkc3ViMDIyIHN1YnRyYWN0ICAxICAtMSAgLT4gJzInCitkZHN1YjAyMyBzdWJ0cmFjdCAgMSAgLTIgIC0+ICczJworZGRzdWIwMjQgc3VidHJhY3QgIDIgIC0xICAtPiAnMycKK2Rkc3ViMDI1IHN1YnRyYWN0ICAyICAtMiAgLT4gJzQnCitkZHN1YjAyNiBzdWJ0cmFjdCAgMyAgLTIgIC0+ICc1JworZGRzdWIwMjcgc3VidHJhY3QgIDIgIC0zICAtPiAnNScKKworZGRzdWIwMzAgc3VidHJhY3QgIDExICAxICAtPiAxMAorZGRzdWIwMzEgc3VidHJhY3QgIDEwICAxICAtPiAgOQorZGRzdWIwMzIgc3VidHJhY3QgIDkgICAxICAtPiAgOAorZGRzdWIwMzMgc3VidHJhY3QgIDEgICAxICAtPiAgMAorZGRzdWIwMzQgc3VidHJhY3QgIDAgICAxICAtPiAtMQorZGRzdWIwMzUgc3VidHJhY3QgLTEgICAxICAtPiAtMgorZGRzdWIwMzYgc3VidHJhY3QgLTkgICAxICAtPiAtMTAKK2Rkc3ViMDM3IHN1YnRyYWN0IC0xMCAgMSAgLT4gLTExCitkZHN1YjAzOCBzdWJ0cmFjdCAtMTEgIDEgIC0+IC0xMgorCitkZHN1YjA0MCBzdWJ0cmFjdCAnNS43NScgJzMuMycgIC0+ICcyLjQ1JworZGRzdWIwNDEgc3VidHJhY3QgJzUnICAgICctMycgICAtPiAnOCcKK2Rkc3ViMDQyIHN1YnRyYWN0ICctNScgICAnLTMnICAgLT4gJy0yJworZGRzdWIwNDMgc3VidHJhY3QgJy03JyAgICcyLjUnICAtPiAnLTkuNScKK2Rkc3ViMDQ0IHN1YnRyYWN0ICcwLjcnICAnMC4zJyAgLT4gJzAuNCcKK2Rkc3ViMDQ1IHN1YnRyYWN0ICcxLjMnICAnMC4zJyAgLT4gJzEuMCcKK2Rkc3ViMDQ2IHN1YnRyYWN0ICcxLjI1JyAnMS4yNScgLT4gJzAuMDAnCisKK2Rkc3ViMDUwIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgICAnMS4wMDAwMDAwMCcgLT4gJzAuMjM0NTY3ODknCitkZHN1YjA1MSBzdWJ0cmFjdCAnMS4yMzQ1Njc4OScgICAgJzEuMDAwMDAwODknIC0+ICcwLjIzNDU2NzAwJworCitkZHN1YjA2MCBzdWJ0cmFjdCAnNzAnICAgICcxMDAwMGUrMTYnIC0+ICctMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViMDYxIHN1YnRyYWN0ICc3MDAnICAgICcxMDAwMGUrMTYnIC0+ICctMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViMDYyIHN1YnRyYWN0ICc3MDAwJyAgICAnMTAwMDBlKzE2JyAtPiAnLTkuOTk5OTk5OTk5OTk5OTk5RSsxOScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjA2MyBzdWJ0cmFjdCAnNzAwMDAnICAgICcxMDAwMGUrMTYnIC0+ICctOS45OTk5OTk5OTk5OTk5OTNFKzE5JyBSb3VuZGVkCitkZHN1YjA2NCBzdWJ0cmFjdCAnNzAwMDAwJyAgICAnMTAwMDBlKzE2JyAtPiAnLTkuOTk5OTk5OTk5OTk5OTMwRSsxOScgUm91bmRlZAorICAtLSBzeW1tZXRyeToKK2Rkc3ViMDY1IHN1YnRyYWN0ICcxMDAwMGUrMTYnICAgICc3MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjA2NiBzdWJ0cmFjdCAnMTAwMDBlKzE2JyAgICAnNzAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViMDY3IHN1YnRyYWN0ICcxMDAwMGUrMTYnICAgICc3MDAwJyAtPiAnOS45OTk5OTk5OTk5OTk5OTlFKzE5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViMDY4IHN1YnRyYWN0ICcxMDAwMGUrMTYnICAgICc3MDAwMCcgLT4gJzkuOTk5OTk5OTk5OTk5OTkzRSsxOScgUm91bmRlZAorZGRzdWIwNjkgc3VidHJhY3QgJzEwMDAwZSsxNicgICAgJzcwMDAwMCcgLT4gJzkuOTk5OTk5OTk5OTk5OTMwRSsxOScgUm91bmRlZAorCisgIC0tIHNvbWUgb2YgdGhlIG5leHQgZ3JvdXAgYXJlIHJlYWxseSBjb25zdHJ1Y3RvciB0ZXN0cworZGRzdWIwOTAgc3VidHJhY3QgJzAwLjAnICAgICcwLjAnICAtPiAnMC4wJworZGRzdWIwOTEgc3VidHJhY3QgJzAwLjAnICAgICcwLjAwJyAtPiAnMC4wMCcKK2Rkc3ViMDkyIHN1YnRyYWN0ICcwLjAwJyAgICAnMDAuMCcgLT4gJzAuMDAnCitkZHN1YjA5MyBzdWJ0cmFjdCAnMDAuMCcgICAgJzAuMDAnIC0+ICcwLjAwJworZGRzdWIwOTQgc3VidHJhY3QgJzAuMDAnICAgICcwMC4wJyAtPiAnMC4wMCcKK2Rkc3ViMDk1IHN1YnRyYWN0ICczJyAgICAnLjMnICAgLT4gJzIuNycKK2Rkc3ViMDk2IHN1YnRyYWN0ICczLicgICAnLjMnICAgLT4gJzIuNycKK2Rkc3ViMDk3IHN1YnRyYWN0ICczLjAnICAnLjMnICAgLT4gJzIuNycKK2Rkc3ViMDk4IHN1YnRyYWN0ICczLjAwJyAnLjMnICAgLT4gJzIuNzAnCitkZHN1YjA5OSBzdWJ0cmFjdCAnMycgICAgJzMnICAgIC0+ICcwJworZGRzdWIxMDAgc3VidHJhY3QgJzMnICAgICcrMycgICAtPiAnMCcKK2Rkc3ViMTAxIHN1YnRyYWN0ICczJyAgICAnLTMnICAgLT4gJzYnCitkZHN1YjEwMiBzdWJ0cmFjdCAnMycgICAgJzAuMycgIC0+ICcyLjcnCitkZHN1YjEwMyBzdWJ0cmFjdCAnMy4nICAgJzAuMycgIC0+ICcyLjcnCitkZHN1YjEwNCBzdWJ0cmFjdCAnMy4wJyAgJzAuMycgIC0+ICcyLjcnCitkZHN1YjEwNSBzdWJ0cmFjdCAnMy4wMCcgJzAuMycgIC0+ICcyLjcwJworZGRzdWIxMDYgc3VidHJhY3QgJzMnICAgICczLjAnICAtPiAnMC4wJworZGRzdWIxMDcgc3VidHJhY3QgJzMnICAgICcrMy4wJyAtPiAnMC4wJworZGRzdWIxMDggc3VidHJhY3QgJzMnICAgICctMy4wJyAtPiAnNi4wJworCistLSB0aGUgYWJvdmUgYWxsIGZyb20gYWRkOyBtYXNzYWdlZCBhbmQgZXh0ZW5kZWQuICBOb3cgc29tZSBuZXcgb25lcy4uLgorLS0gW3BhcnRpY3VsYXJseSBpbXBvcnRhbnQgZm9yIGNvbXBhcmlzb25zXQorLS0gTkI6IC14RS04IGJlbG93IHdlcmUgbm9uLWV4cG9uZW50cyBwcmUtQU5TSSBYMy0yNzQsIGFuZCAtMUUtNyBvciAwRS03CistLSB3aXRoIGlucHV0IHJvdW5kaW5nLgorZGRzdWIxMjAgc3VidHJhY3QgICcxMC4yMzQ1Njc4NCcgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy01RS04JworZGRzdWIxMjEgc3VidHJhY3QgICcxMC4yMzQ1Njc4NScgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy00RS04JworZGRzdWIxMjIgc3VidHJhY3QgICcxMC4yMzQ1Njc4NicgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy0zRS04JworZGRzdWIxMjMgc3VidHJhY3QgICcxMC4yMzQ1Njc4NycgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy0yRS04JworZGRzdWIxMjQgc3VidHJhY3QgICcxMC4yMzQ1Njc4OCcgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy0xRS04JworZGRzdWIxMjUgc3VidHJhY3QgICcxMC4yMzQ1Njc4OScgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzBFLTgnCitkZHN1YjEyNiBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkwJyAgICAnMTAuMjM0NTY3ODknICAtPiAnMUUtOCcKK2Rkc3ViMTI3IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTEnICAgICcxMC4yMzQ1Njc4OScgIC0+ICcyRS04JworZGRzdWIxMjggc3VidHJhY3QgICcxMC4yMzQ1Njc5MicgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzNFLTgnCitkZHN1YjEyOSBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkzJyAgICAnMTAuMjM0NTY3ODknICAtPiAnNEUtOCcKK2Rkc3ViMTMwIHN1YnRyYWN0ICAnMTAuMjM0NTY3OTQnICAgICcxMC4yMzQ1Njc4OScgIC0+ICc1RS04JworZGRzdWIxMzEgc3VidHJhY3QgICcxMC4yMzQ1Njc4MScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy01RS04JworZGRzdWIxMzIgc3VidHJhY3QgICcxMC4yMzQ1Njc4MicgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy00RS04JworZGRzdWIxMzMgc3VidHJhY3QgICcxMC4yMzQ1Njc4MycgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy0zRS04JworZGRzdWIxMzQgc3VidHJhY3QgICcxMC4yMzQ1Njc4NCcgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy0yRS04JworZGRzdWIxMzUgc3VidHJhY3QgICcxMC4yMzQ1Njc4NScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy0xRS04JworZGRzdWIxMzYgc3VidHJhY3QgICcxMC4yMzQ1Njc4NicgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzBFLTgnCitkZHN1YjEzNyBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg3JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnMUUtOCcKK2Rkc3ViMTM4IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODgnICAgICcxMC4yMzQ1Njc4NicgIC0+ICcyRS04JworZGRzdWIxMzkgc3VidHJhY3QgICcxMC4yMzQ1Njc4OScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzNFLTgnCitkZHN1YjE0MCBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkwJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnNEUtOCcKK2Rkc3ViMTQxIHN1YnRyYWN0ICAnMTAuMjM0NTY3OTEnICAgICcxMC4yMzQ1Njc4NicgIC0+ICc1RS04JworZGRzdWIxNDIgc3VidHJhY3QgICcxJyAgICAgICAgICAgICAgJzAuOTk5OTk5OTk5JyAgLT4gJzFFLTknCitkZHN1YjE0MyBzdWJ0cmFjdCAgJzAuOTk5OTk5OTk5JyAgICAnMScgICAgICAgICAgICAtPiAnLTFFLTknCitkZHN1YjE0NCBzdWJ0cmFjdCAgJy0xMC4yMzQ1Njc4MCcgICAnLTEwLjIzNDU2Nzg2JyAtPiAnNkUtOCcKK2Rkc3ViMTQ1IHN1YnRyYWN0ICAnLTEwLjIzNDU2NzkwJyAgICctMTAuMjM0NTY3ODYnIC0+ICctNEUtOCcKK2Rkc3ViMTQ2IHN1YnRyYWN0ICAnLTEwLjIzNDU2NzkxJyAgICctMTAuMjM0NTY3ODYnIC0+ICctNUUtOCcKKworLS0gYWRkaXRpb25hbCBzY2FsZWQgYXJpdGhtZXRpYyB0ZXN0cyBbMC45NyBwcm9ibGVtXQorZGRzdWIxNjAgc3VidHJhY3QgJzAnICAgICAnLjEnICAgICAgLT4gJy0wLjEnCitkZHN1YjE2MSBzdWJ0cmFjdCAnMDAnICAgICcuOTc5ODMnICAtPiAnLTAuOTc5ODMnCitkZHN1YjE2MiBzdWJ0cmFjdCAnMCcgICAgICcuOScgICAgICAtPiAnLTAuOScKK2Rkc3ViMTYzIHN1YnRyYWN0ICcwJyAgICAgJzAuMTAyJyAgIC0+ICctMC4xMDInCitkZHN1YjE2NCBzdWJ0cmFjdCAnMCcgICAgICcuNCcgICAgICAtPiAnLTAuNCcKK2Rkc3ViMTY1IHN1YnRyYWN0ICcwJyAgICAgJy4zMDcnICAgIC0+ICctMC4zMDcnCitkZHN1YjE2NiBzdWJ0cmFjdCAnMCcgICAgICcuNDM4MjInICAtPiAnLTAuNDM4MjInCitkZHN1YjE2NyBzdWJ0cmFjdCAnMCcgICAgICcuOTExJyAgICAtPiAnLTAuOTExJworZGRzdWIxNjggc3VidHJhY3QgJy4wJyAgICAnLjAyJyAgICAgLT4gJy0wLjAyJworZGRzdWIxNjkgc3VidHJhY3QgJzAwJyAgICAnLjM5MicgICAgLT4gJy0wLjM5MicKK2Rkc3ViMTcwIHN1YnRyYWN0ICcwJyAgICAgJy4yNicgICAgIC0+ICctMC4yNicKK2Rkc3ViMTcxIHN1YnRyYWN0ICcwJyAgICAgJzAuNTEnICAgIC0+ICctMC41MScKK2Rkc3ViMTcyIHN1YnRyYWN0ICcwJyAgICAgJy4yMjM0JyAgIC0+ICctMC4yMjM0JworZGRzdWIxNzMgc3VidHJhY3QgJzAnICAgICAnLjInICAgICAgLT4gJy0wLjInCitkZHN1YjE3NCBzdWJ0cmFjdCAnLjAnICAgICcuMDAwOCcgICAtPiAnLTAuMDAwOCcKKy0tIDAuIG9uIGxlZnQKK2Rkc3ViMTgwIHN1YnRyYWN0ICcwLjAnICAgICAnLS4xJyAgICAgIC0+ICcwLjEnCitkZHN1YjE4MSBzdWJ0cmFjdCAnMC4wMCcgICAgJy0uOTc5ODMnICAtPiAnMC45Nzk4MycKK2Rkc3ViMTgyIHN1YnRyYWN0ICcwLjAnICAgICAnLS45JyAgICAgIC0+ICcwLjknCitkZHN1YjE4MyBzdWJ0cmFjdCAnMC4wJyAgICAgJy0wLjEwMicgICAtPiAnMC4xMDInCitkZHN1YjE4NCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uNCcgICAgICAtPiAnMC40JworZGRzdWIxODUgc3VidHJhY3QgJzAuMCcgICAgICctLjMwNycgICAgLT4gJzAuMzA3JworZGRzdWIxODYgc3VidHJhY3QgJzAuMCcgICAgICctLjQzODIyJyAgLT4gJzAuNDM4MjInCitkZHN1YjE4NyBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uOTExJyAgICAtPiAnMC45MTEnCitkZHN1YjE4OCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMDInICAgICAtPiAnMC4wMicKK2Rkc3ViMTg5IHN1YnRyYWN0ICcwLjAwJyAgICAnLS4zOTInICAgIC0+ICcwLjM5MicKK2Rkc3ViMTkwIHN1YnRyYWN0ICcwLjAnICAgICAnLS4yNicgICAgIC0+ICcwLjI2JworZGRzdWIxOTEgc3VidHJhY3QgJzAuMCcgICAgICctMC41MScgICAgLT4gJzAuNTEnCitkZHN1YjE5MiBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMjIzNCcgICAtPiAnMC4yMjM0JworZGRzdWIxOTMgc3VidHJhY3QgJzAuMCcgICAgICctLjInICAgICAgLT4gJzAuMicKK2Rkc3ViMTk0IHN1YnRyYWN0ICcwLjAnICAgICAnLS4wMDA4JyAgIC0+ICcwLjAwMDgnCistLSBuZWdhdGl2ZXMgb2Ygc2FtZQorZGRzdWIyMDAgc3VidHJhY3QgJzAnICAgICAnLS4xJyAgICAgIC0+ICcwLjEnCitkZHN1YjIwMSBzdWJ0cmFjdCAnMDAnICAgICctLjk3OTgzJyAgLT4gJzAuOTc5ODMnCitkZHN1YjIwMiBzdWJ0cmFjdCAnMCcgICAgICctLjknICAgICAgLT4gJzAuOScKK2Rkc3ViMjAzIHN1YnRyYWN0ICcwJyAgICAgJy0wLjEwMicgICAtPiAnMC4xMDInCitkZHN1YjIwNCBzdWJ0cmFjdCAnMCcgICAgICctLjQnICAgICAgLT4gJzAuNCcKK2Rkc3ViMjA1IHN1YnRyYWN0ICcwJyAgICAgJy0uMzA3JyAgICAtPiAnMC4zMDcnCitkZHN1YjIwNiBzdWJ0cmFjdCAnMCcgICAgICctLjQzODIyJyAgLT4gJzAuNDM4MjInCitkZHN1YjIwNyBzdWJ0cmFjdCAnMCcgICAgICctLjkxMScgICAgLT4gJzAuOTExJworZGRzdWIyMDggc3VidHJhY3QgJy4wJyAgICAnLS4wMicgICAgIC0+ICcwLjAyJworZGRzdWIyMDkgc3VidHJhY3QgJzAwJyAgICAnLS4zOTInICAgIC0+ICcwLjM5MicKK2Rkc3ViMjEwIHN1YnRyYWN0ICcwJyAgICAgJy0uMjYnICAgICAtPiAnMC4yNicKK2Rkc3ViMjExIHN1YnRyYWN0ICcwJyAgICAgJy0wLjUxJyAgICAtPiAnMC41MScKK2Rkc3ViMjEyIHN1YnRyYWN0ICcwJyAgICAgJy0uMjIzNCcgICAtPiAnMC4yMjM0JworZGRzdWIyMTMgc3VidHJhY3QgJzAnICAgICAnLS4yJyAgICAgIC0+ICcwLjInCitkZHN1YjIxNCBzdWJ0cmFjdCAnLjAnICAgICctLjAwMDgnICAgLT4gJzAuMDAwOCcKKworLS0gbW9yZSBmaXhlZCwgTEhTIHN3YXBzIFtyZWFsbHkgdGhlIHNhbWUgYXMgdGVzdGNhc2VzIHVuZGVyIGFkZF0KK2Rkc3ViMjIwIHN1YnRyYWN0ICctNTYyNjdFLTEyJyAwICAtPiAnLTUuNjI2N0UtOCcKK2Rkc3ViMjIxIHN1YnRyYWN0ICctNTYyNjdFLTExJyAwICAtPiAnLTUuNjI2N0UtNycKK2Rkc3ViMjIyIHN1YnRyYWN0ICctNTYyNjdFLTEwJyAwICAtPiAnLTAuMDAwMDA1NjI2NycKK2Rkc3ViMjIzIHN1YnRyYWN0ICctNTYyNjdFLTknICAwICAtPiAnLTAuMDAwMDU2MjY3JworZGRzdWIyMjQgc3VidHJhY3QgJy01NjI2N0UtOCcgIDAgIC0+ICctMC4wMDA1NjI2NycKK2Rkc3ViMjI1IHN1YnRyYWN0ICctNTYyNjdFLTcnICAwICAtPiAnLTAuMDA1NjI2NycKK2Rkc3ViMjI2IHN1YnRyYWN0ICctNTYyNjdFLTYnICAwICAtPiAnLTAuMDU2MjY3JworZGRzdWIyMjcgc3VidHJhY3QgJy01NjI2N0UtNScgIDAgIC0+ICctMC41NjI2NycKK2Rkc3ViMjI4IHN1YnRyYWN0ICctNTYyNjdFLTInICAwICAtPiAnLTU2Mi42NycKK2Rkc3ViMjI5IHN1YnRyYWN0ICctNTYyNjdFLTEnICAwICAtPiAnLTU2MjYuNycKK2Rkc3ViMjMwIHN1YnRyYWN0ICctNTYyNjdFLTAnICAwICAtPiAnLTU2MjY3JworLS0gc3ltbWV0cnkgLi4uCitkZHN1YjI0MCBzdWJ0cmFjdCAwICctNTYyNjdFLTEyJyAgLT4gJzUuNjI2N0UtOCcKK2Rkc3ViMjQxIHN1YnRyYWN0IDAgJy01NjI2N0UtMTEnICAtPiAnNS42MjY3RS03JworZGRzdWIyNDIgc3VidHJhY3QgMCAnLTU2MjY3RS0xMCcgIC0+ICcwLjAwMDAwNTYyNjcnCitkZHN1YjI0MyBzdWJ0cmFjdCAwICctNTYyNjdFLTknICAgLT4gJzAuMDAwMDU2MjY3JworZGRzdWIyNDQgc3VidHJhY3QgMCAnLTU2MjY3RS04JyAgIC0+ICcwLjAwMDU2MjY3JworZGRzdWIyNDUgc3VidHJhY3QgMCAnLTU2MjY3RS03JyAgIC0+ICcwLjAwNTYyNjcnCitkZHN1YjI0NiBzdWJ0cmFjdCAwICctNTYyNjdFLTYnICAgLT4gJzAuMDU2MjY3JworZGRzdWIyNDcgc3VidHJhY3QgMCAnLTU2MjY3RS01JyAgIC0+ICcwLjU2MjY3JworZGRzdWIyNDggc3VidHJhY3QgMCAnLTU2MjY3RS0yJyAgIC0+ICc1NjIuNjcnCitkZHN1YjI0OSBzdWJ0cmFjdCAwICctNTYyNjdFLTEnICAgLT4gJzU2MjYuNycKK2Rkc3ViMjUwIHN1YnRyYWN0IDAgJy01NjI2N0UtMCcgICAtPiAnNTYyNjcnCisKKy0tIG5vdyBzb21lIG1vcmUgZnJvbSB0aGUgJ25ldycgYWRkCitkZHN1YjMwMSBzdWJ0cmFjdCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDAwJyAtPiAnMC4yMzQ1Njc4OScKK2Rkc3ViMzAyIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMTEnIC0+ICcwLjIzNDU2Nzc4JworCistLSBzb21lIGNhcnJ5aW5nIGVmZmVjdHMKK2Rkc3ViMzIxIHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAwJyAtPiAnMC45OTk4JworZGRzdWIzMjIgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTcnCitkZHN1YjMyMyBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMicgLT4gJzAuOTk5NicKK2Rkc3ViMzI0IHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAzJyAtPiAnMC45OTk1JworZGRzdWIzMjUgc3VidHJhY3QgJzAuOTk5OCcgICctMC4wMDAwJyAtPiAnMC45OTk4JworZGRzdWIzMjYgc3VidHJhY3QgJzAuOTk5OCcgICctMC4wMDAxJyAtPiAnMC45OTk5JworZGRzdWIzMjcgc3VidHJhY3QgJzAuOTk5OCcgICctMC4wMDAyJyAtPiAnMS4wMDAwJworZGRzdWIzMjggc3VidHJhY3QgJzAuOTk5OCcgICctMC4wMDAzJyAtPiAnMS4wMDAxJworCistLSBpbnRlcm5hbCBib3VuZGFyaWVzCitkZHN1YjM0NiBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNycgICAtPiAnOTk5OTk5OTk5OTk5MycKK2Rkc3ViMzQ3IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MCcgICAtPiAnOTk5OTk5OTk5OTkzMCcKK2Rkc3ViMzQ4IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAnICAgLT4gJzk5OTk5OTk5OTkzMDAnCitkZHN1YjM0OSBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMCcgICAtPiAnOTk5OTk5OTk5MzAwMCcKK2Rkc3ViMzUwIHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwMCcgICAtPiAnOTk5OTk5OTkzMDAwMCcKK2Rkc3ViMzUxIHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwMDAnICAgLT4gJzk5OTk5OTkzMDAwMDAnCitkZHN1YjM1MiBzdWJ0cmFjdCAnNycgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTk5OTk5MycKK2Rkc3ViMzUzIHN1YnRyYWN0ICc3MCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTk5OTkzMCcKK2Rkc3ViMzU0IHN1YnRyYWN0ICc3MDAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTk5OTkzMDAnCitkZHN1YjM1NSBzdWJ0cmFjdCAnNzAwMCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTk5MzAwMCcKK2Rkc3ViMzU2IHN1YnRyYWN0ICc3MDAwMCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTkzMDAwMCcKK2Rkc3ViMzU3IHN1YnRyYWN0ICc3MDAwMDAnICcxMDAwMGUrOScgICAtPiAnLTk5OTk5OTkzMDAwMDAnCisKKy0tIHplcm8gcHJlc2VydmF0aW9uCitkZHN1YjM2MSBzdWJ0cmFjdCAxICcwLjAwMDEnIC0+ICcwLjk5OTknCitkZHN1YjM2MiBzdWJ0cmFjdCAxICcwLjAwMDAxJyAtPiAnMC45OTk5OScKK2Rkc3ViMzYzIHN1YnRyYWN0IDEgJzAuMDAwMDAxJyAtPiAnMC45OTk5OTknCitkZHN1YjM2NCBzdWJ0cmFjdCAxICcwLjAwMDAwMDAwMDAwMDAwMDEnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTknCitkZHN1YjM2NSBzdWJ0cmFjdCAxICcwLjAwMDAwMDAwMDAwMDAwMDAxJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRzdWIzNjYgc3VidHJhY3QgMSAnMC4wMDAwMDAwMDAwMDAwMDAwMDEnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgZnVubnkgemVyb3MgW2luIGNhc2Ugb2YgYmFkIHNpZ251bV0KK2Rkc3ViMzcwIHN1YnRyYWN0IDEgIDAgIC0+IDEKK2Rkc3ViMzcxIHN1YnRyYWN0IDEgMC4gIC0+IDEKK2Rkc3ViMzcyIHN1YnRyYWN0IDEgIC4wIC0+IDEuMAorZGRzdWIzNzMgc3VidHJhY3QgMSAwLjAgLT4gMS4wCitkZHN1YjM3NCBzdWJ0cmFjdCAgMCAgMSAtPiAtMQorZGRzdWIzNzUgc3VidHJhY3QgMC4gIDEgLT4gLTEKK2Rkc3ViMzc2IHN1YnRyYWN0ICAuMCAxIC0+IC0xLjAKK2Rkc3ViMzc3IHN1YnRyYWN0IDAuMCAxIC0+IC0xLjAKKworLS0gbGVhZGluZyAwIGRpZ2l0IGJlZm9yZSByb3VuZAorZGRzdWI5MTAgc3VidHJhY3QgLTEwMzUxOTM2MiAtNTE4OTc5NTUuMyAtPiAtNTE2MjE0MDYuNworZGRzdWI5MTEgc3VidHJhY3QgMTU5NTc5LjQ0NCA4OTgyNy41MjI5IC0+IDY5NzUxLjkyMTEKKworZGRzdWI5MjAgc3VidHJhY3QgMzMzLjAwMDAwMDAxMjM0NTYgMzMuMDAwMDAwMDEyMzQ1NjYgLT4gMjk5Ljk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkZHN1YjkyMSBzdWJ0cmFjdCAzMzMuMDAwMDAwMDEyMzQ1NiAzMy4wMDAwMDAwMTIzNDU2NSAtPiAzMDAuMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViOTIyIHN1YnRyYWN0IDEzMy4wMDAwMDAwMTIzNDU2IDMzLjAwMDAwMDAxMjM0NTY1IC0+ICA5OS45OTk5OTk5OTk5OTk5NQorZGRzdWI5MjMgc3VidHJhY3QgMTMzLjAwMDAwMDAxMjM0NTYgMzMuMDAwMDAwMDEyMzQ1NjQgLT4gIDk5Ljk5OTk5OTk5OTk5OTk2CitkZHN1YjkyNCBzdWJ0cmFjdCAxMzMuMDAwMDAwMDEyMzQ1NiAzMy4wMDAwMDAwMTIzNDU0MCAtPiAxMDAuMDAwMDAwMDAwMDAwMiBSb3VuZGVkCitkZHN1YjkyNSBzdWJ0cmFjdCAxMzMuMDAwMDAwMDEyMzQ1NiA0My4wMDAwMDAwMTIzNDU2MCAtPiAgOTAuMDAwMDAwMDAwMDAwMDAKK2Rkc3ViOTI2IHN1YnRyYWN0IDEzMy4wMDAwMDAwMTIzNDU2IDQzLjAwMDAwMDAxMjM0NTYxIC0+ICA4OS45OTk5OTk5OTk5OTk5OQorZGRzdWI5Mjcgc3VidHJhY3QgMTMzLjAwMDAwMDAxMjM0NTYgNDMuMDAwMDAwMDEyMzQ1NjYgLT4gIDg5Ljk5OTk5OTk5OTk5OTk0CitkZHN1YjkyOCBzdWJ0cmFjdCAxMDEuMDAwMDAwMDEyMzQ1NiA5MS4wMDAwMDAwMTIzNDU2NiAtPiAgIDkuOTk5OTk5OTk5OTk5OTQKK2Rkc3ViOTI5IHN1YnRyYWN0IDEwMS4wMDAwMDAwMTIzNDU2IDk5LjAwMDAwMDAxMjM0NTY2IC0+ICAgMS45OTk5OTk5OTk5OTk5NAorCistLSBtb3JlIExIUyBzd2FwcyBbd2VyZSBmaXhlZF0KK2Rkc3ViMzkwIHN1YnRyYWN0ICctNTYyNjdFLTEwJyAgIDAgLT4gICctMC4wMDAwMDU2MjY3JworZGRzdWIzOTEgc3VidHJhY3QgJy01NjI2N0UtNicgICAgMCAtPiAgJy0wLjA1NjI2NycKK2Rkc3ViMzkyIHN1YnRyYWN0ICctNTYyNjdFLTUnICAgIDAgLT4gICctMC41NjI2NycKK2Rkc3ViMzkzIHN1YnRyYWN0ICctNTYyNjdFLTQnICAgIDAgLT4gICctNS42MjY3JworZGRzdWIzOTQgc3VidHJhY3QgJy01NjI2N0UtMycgICAgMCAtPiAgJy01Ni4yNjcnCitkZHN1YjM5NSBzdWJ0cmFjdCAnLTU2MjY3RS0yJyAgICAwIC0+ICAnLTU2Mi42NycKK2Rkc3ViMzk2IHN1YnRyYWN0ICctNTYyNjdFLTEnICAgIDAgLT4gICctNTYyNi43JworZGRzdWIzOTcgc3VidHJhY3QgJy01NjI2N0UtMCcgICAgMCAtPiAgJy01NjI2NycKK2Rkc3ViMzk4IHN1YnRyYWN0ICctNUUtMTAnICAgICAgIDAgLT4gICctNUUtMTAnCitkZHN1YjM5OSBzdWJ0cmFjdCAnLTVFLTcnICAgICAgICAwIC0+ICAnLTVFLTcnCitkZHN1YjQwMCBzdWJ0cmFjdCAnLTVFLTYnICAgICAgICAwIC0+ICAnLTAuMDAwMDA1JworZGRzdWI0MDEgc3VidHJhY3QgJy01RS01JyAgICAgICAgMCAtPiAgJy0wLjAwMDA1JworZGRzdWI0MDIgc3VidHJhY3QgJy01RS00JyAgICAgICAgMCAtPiAgJy0wLjAwMDUnCitkZHN1YjQwMyBzdWJ0cmFjdCAnLTVFLTEnICAgICAgICAwIC0+ICAnLTAuNScKK2Rkc3ViNDA0IHN1YnRyYWN0ICctNUUwJyAgICAgICAgIDAgLT4gICctNScKK2Rkc3ViNDA1IHN1YnRyYWN0ICctNUUxJyAgICAgICAgIDAgLT4gICctNTAnCitkZHN1YjQwNiBzdWJ0cmFjdCAnLTVFNScgICAgICAgICAwIC0+ICAnLTUwMDAwMCcKK2Rkc3ViNDA3IHN1YnRyYWN0ICctNUUxNScgICAgICAgIDAgLT4gICctNTAwMDAwMDAwMDAwMDAwMCcKK2Rkc3ViNDA4IHN1YnRyYWN0ICctNUUxNicgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzE2JyAgUm91bmRlZAorZGRzdWI0MDkgc3VidHJhY3QgJy01RTE3JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTcnICBSb3VuZGVkCitkZHN1YjQxMCBzdWJ0cmFjdCAnLTVFMTgnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxOCcgIFJvdW5kZWQKK2Rkc3ViNDExIHN1YnRyYWN0ICctNUUxMDAnICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDBFKzEwMCcgUm91bmRlZAorCistLSBtb3JlIFJIUyBzd2FwcyBbd2VyZSBmaXhlZF0KK2Rkc3ViNDIwIHN1YnRyYWN0IDAgICctNTYyNjdFLTEwJyAtPiAgJzAuMDAwMDA1NjI2NycKK2Rkc3ViNDIxIHN1YnRyYWN0IDAgICctNTYyNjdFLTYnICAtPiAgJzAuMDU2MjY3JworZGRzdWI0MjIgc3VidHJhY3QgMCAgJy01NjI2N0UtNScgIC0+ICAnMC41NjI2NycKK2Rkc3ViNDIzIHN1YnRyYWN0IDAgICctNTYyNjdFLTQnICAtPiAgJzUuNjI2NycKK2Rkc3ViNDI0IHN1YnRyYWN0IDAgICctNTYyNjdFLTMnICAtPiAgJzU2LjI2NycKK2Rkc3ViNDI1IHN1YnRyYWN0IDAgICctNTYyNjdFLTInICAtPiAgJzU2Mi42NycKK2Rkc3ViNDI2IHN1YnRyYWN0IDAgICctNTYyNjdFLTEnICAtPiAgJzU2MjYuNycKK2Rkc3ViNDI3IHN1YnRyYWN0IDAgICctNTYyNjdFLTAnICAtPiAgJzU2MjY3JworZGRzdWI0Mjggc3VidHJhY3QgMCAgJy01RS0xMCcgICAgIC0+ICAnNUUtMTAnCitkZHN1YjQyOSBzdWJ0cmFjdCAwICAnLTVFLTcnICAgICAgLT4gICc1RS03JworZGRzdWI0MzAgc3VidHJhY3QgMCAgJy01RS02JyAgICAgIC0+ICAnMC4wMDAwMDUnCitkZHN1YjQzMSBzdWJ0cmFjdCAwICAnLTVFLTUnICAgICAgLT4gICcwLjAwMDA1JworZGRzdWI0MzIgc3VidHJhY3QgMCAgJy01RS00JyAgICAgIC0+ICAnMC4wMDA1JworZGRzdWI0MzMgc3VidHJhY3QgMCAgJy01RS0xJyAgICAgIC0+ICAnMC41JworZGRzdWI0MzQgc3VidHJhY3QgMCAgJy01RTAnICAgICAgIC0+ICAnNScKK2Rkc3ViNDM1IHN1YnRyYWN0IDAgICctNUUxJyAgICAgICAtPiAgJzUwJworZGRzdWI0MzYgc3VidHJhY3QgMCAgJy01RTUnICAgICAgIC0+ICAnNTAwMDAwJworZGRzdWI0Mzcgc3VidHJhY3QgMCAgJy01RTE1JyAgICAgIC0+ICAnNTAwMDAwMDAwMDAwMDAwMCcKK2Rkc3ViNDM4IHN1YnRyYWN0IDAgICctNUUxNicgICAgICAtPiAgJzUuMDAwMDAwMDAwMDAwMDAwRSsxNicgICBSb3VuZGVkCitkZHN1YjQzOSBzdWJ0cmFjdCAwICAnLTVFMTcnICAgICAgLT4gICc1LjAwMDAwMDAwMDAwMDAwMEUrMTcnICAgUm91bmRlZAorZGRzdWI0NDAgc3VidHJhY3QgMCAgJy01RTE4JyAgICAgIC0+ICAnNS4wMDAwMDAwMDAwMDAwMDBFKzE4JyAgIFJvdW5kZWQKK2Rkc3ViNDQxIHN1YnRyYWN0IDAgICctNUUxMDAnICAgICAtPiAgJzUuMDAwMDAwMDAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKworLS0gdHJ5IGJvcmRlcmxpbmUgcHJlY2lzaW9uLCB3aXRoIGNhcnJpZXMsIGV0Yy4KK2Rkc3ViNDYxIHN1YnRyYWN0ICcxRSsxNicgJzEnICAgICAgICAtPiAnOTk5OTk5OTk5OTk5OTk5OScKK2Rkc3ViNDYyIHN1YnRyYWN0ICcxRSsxMicgJy0xLjExMScgICAtPiAnMTAwMDAwMDAwMDAwMS4xMTEnCitkZHN1YjQ2MyBzdWJ0cmFjdCAnMS4xMTEnICAnLTFFKzEyJyAgLT4gJzEwMDAwMDAwMDAwMDEuMTExJworZGRzdWI0NjQgc3VidHJhY3QgJy0xJyAgICAnLTFFKzE2JyAgIC0+ICc5OTk5OTk5OTk5OTk5OTk5JworZGRzdWI0NjUgc3VidHJhY3QgJzdFKzE1JyAnMScgICAgICAgIC0+ICc2OTk5OTk5OTk5OTk5OTk5JworZGRzdWI0NjYgc3VidHJhY3QgJzdFKzEyJyAnLTEuMTExJyAgIC0+ICc3MDAwMDAwMDAwMDAxLjExMScKK2Rkc3ViNDY3IHN1YnRyYWN0ICcxLjExMScgICctN0UrMTInICAtPiAnNzAwMDAwMDAwMDAwMS4xMTEnCitkZHN1YjQ2OCBzdWJ0cmFjdCAnLTEnICAgICctN0UrMTUnICAgLT4gJzY5OTk5OTk5OTk5OTk5OTknCisKKy0tICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMSAyMzQ1Njc4OTAxMjM0NQorZGRzdWI0NzAgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTYzJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZGRzdWI0NzEgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTYyJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZGRzdWI0NzIgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTYxJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRzdWI0NzMgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTYwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRzdWI0NzQgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU5JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRzdWI0NzUgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU4JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRzdWI0NzYgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU3JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZGRzdWI0Nzcgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2Rkc3ViNDc4IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OScKK2Rkc3ViNDc5IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OCcKK2Rkc3ViNDgwIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1MycgLT4gJzAuOTk5OTk5OTk5OTk5OTk5NycKK2Rkc3ViNDgxIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1MicgLT4gJzAuOTk5OTk5OTk5OTk5OTk5NicKK2Rkc3ViNDgyIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1MScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5NScKK2Rkc3ViNDgzIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1MCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk5NCcKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2Rkc3ViNTAwIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg5JworZGRzdWI1MDEgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDIgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDMgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDQgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDUgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDYgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDcgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDggc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MDkgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MTAgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MTEgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MTIgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MTMgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MTQgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MTUgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MTYgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnCitkZHN1YjUxNyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxOCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUxOSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2Rkc3ViNTIwIHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg5JworZGRzdWI1MjEgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MjIgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MjMgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MjQgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MjUgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MjYgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1Mjcgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI1Mjggc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1Mjkgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MzAgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MzEgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MzIgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MzMgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MzQgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MzUgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1MzYgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnCitkZHN1YjUzNyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzOCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjUzOSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZGRzdWI1NDAgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1NDEgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI1NDIgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZGRzdWI1NTAgc3VidHJhY3QgJzEyMzEyMzQ1Njc0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc0NTY3ODknCitkZHN1YjU1MSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1MiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1MyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1NCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1NSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1NiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1NyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1OCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU1OSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU2MCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU2MSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU2MiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU2MyBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU2NCBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU2NSBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjU2NiBzdWJ0cmFjdCAnMTIzMTIzNDU2NzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2NzQ1Njc4OCcKK2Rkc3ViNTY3IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTY4IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNTY5IHN1YnRyYWN0ICcxMjMxMjM0NTY3NDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3ltbWV0cnkuLi4KK3JvdW5kaW5nOiBoYWxmX3VwCitkZHN1YjYwMCBzdWJ0cmFjdCAwICAgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknCitkZHN1YjYwMSBzdWJ0cmFjdCAwLjAwMDAwMDAwMSAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MDIgc3VidHJhY3QgMC4wMDAwMDEgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjAzIHN1YnRyYWN0IDAuMSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYwNCBzdWJ0cmFjdCAwLjQgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MDUgc3VidHJhY3QgMC40OSAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjA2IHN1YnRyYWN0IDAuNDk5OTk5ICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYwNyBzdWJ0cmFjdCAwLjQ5OTk5OTk5OSAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MDggc3VidHJhY3QgMC41ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjA5IHN1YnRyYWN0IDAuNTAwMDAwMDAxICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYxMCBzdWJ0cmFjdCAwLjUwMDAwMSAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MTEgc3VidHJhY3QgMC41MSAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjEyIHN1YnRyYWN0IDAuNiAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYxMyBzdWJ0cmFjdCAwLjkgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MTQgc3VidHJhY3QgMC45OTk5OSAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjE1IHN1YnRyYWN0IDAuOTk5OTk5OTk5ICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYxNiBzdWJ0cmFjdCAxICAgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnCitkZHN1YjYxNyBzdWJ0cmFjdCAxLjAwMDAwMDAwMSAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MTggc3VidHJhY3QgMS4wMDAwMSAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjE5IHN1YnRyYWN0IDEuMSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2Rkc3ViNjIwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScKK2Rkc3ViNjIxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYyMiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MjMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjI0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYyNSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MjYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjI3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYyOCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2Mjkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjMwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYzMSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MzIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjMzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYzNCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2MzUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjM2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcKK2Rkc3ViNjM3IHN1YnRyYWN0IDEuMDAwMDAwMDEgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjYzOCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2Mzkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkZHN1YjY0MCBzdWJ0cmFjdCAwLjQ5OTk5OTk5OSAgICcxMjMxMjM0NTY3NDU2Nzg4JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NDEgc3VidHJhY3QgMC41ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OCcgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjQyIHN1YnRyYWN0IDAuNTAwMDAwMDAxICAgJzEyMzEyMzQ1Njc0NTY3ODgnIC0+ICctMTIzMTIzNDU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkZHN1YjY1MCBzdWJ0cmFjdCAwICAgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODknCitkZHN1YjY1MSBzdWJ0cmFjdCAwLjAwMDAwMDAwMSAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NTIgc3VidHJhY3QgMC4wMDAwMDEgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjUzIHN1YnRyYWN0IDAuMSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY1NCBzdWJ0cmFjdCAwLjQgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NTUgc3VidHJhY3QgMC40OSAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjU2IHN1YnRyYWN0IDAuNDk5OTk5ICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY1NyBzdWJ0cmFjdCAwLjQ5OTk5OTk5OSAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NTggc3VidHJhY3QgMC41ICAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjU5IHN1YnRyYWN0IDAuNTAwMDAwMDAxICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY2MCBzdWJ0cmFjdCAwLjUwMDAwMSAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NjEgc3VidHJhY3QgMC41MSAgICAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjYyIHN1YnRyYWN0IDAuNiAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY2MyBzdWJ0cmFjdCAwLjkgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2NjQgc3VidHJhY3QgMC45OTk5OSAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjY1IHN1YnRyYWN0IDAuOTk5OTk5OTk5ICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkZHN1YjY2NiBzdWJ0cmFjdCAxICAgICAgICAgICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODgnCitkZHN1YjY2NyBzdWJ0cmFjdCAxLjAwMDAwMDAxICAgICcxMjMxMjM0NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZGRzdWI2Njggc3VidHJhY3QgMS4wMDAwMSAgICAgICAnMTIzMTIzNDU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK2Rkc3ViNjY5IHN1YnRyYWN0IDEuMSAgICAgICAgICAgJzEyMzEyMzQ1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKKworLS0gbG90cyBvZiBsZWFkaW5nIHplcm9zIGluIGludGVybWVkaWF0ZSByZXN1bHQsIGFuZCBzaG93aW5nIGVmZmVjdHMgb2YKKy0tIGlucHV0IHJvdW5kaW5nIHdvdWxkIGhhdmUgYWZmZWN0ZWQgdGhlIGZvbGxvd2luZworcm91bmRpbmc6IGhhbGZfdXAKK2Rkc3ViNjcwIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC4xJyAtPiAwLjkKK2Rkc3ViNjcxIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC45JyAtPiAwLjEKK2Rkc3ViNjcyIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS4xJyAtPiAtMC4xCitkZHN1YjY3MyBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuNScgLT4gLTAuNQorZGRzdWI2NzQgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjknIC0+IC0wLjkKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZGRzdWI2ODAgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjEnIC0+IDAuOQorZGRzdWI2ODEgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjknIC0+IDAuMQorZGRzdWI2ODIgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjEnIC0+IC0wLjEKK2Rkc3ViNjgzIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS41JyAtPiAtMC41CitkZHN1YjY4NCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuOScgLT4gLTAuOQorCitkZHN1YjY4NSBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODcuMScgLT4gMC45CitkZHN1YjY4NiBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODcuOScgLT4gMC4xCitkZHN1YjY4NyBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODguMScgLT4gLTAuMQorZGRzdWI2ODggc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODgnICcxMjM0NTY3NDU2Nzg4LjUnIC0+IC0wLjUKK2Rkc3ViNjg5IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4OC45JyAtPiAtMC45CisKK3JvdW5kaW5nOiBkb3duCitkZHN1YjY5MCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguMScgLT4gMC45CitkZHN1YjY5MSBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguOScgLT4gMC4xCitkZHN1YjY5MiBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuMScgLT4gLTAuMQorZGRzdWI2OTMgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjUnIC0+IC0wLjUKK2Rkc3ViNjk0IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS45JyAtPiAtMC45CisKKy0tIFNwZWNpYWxzCitkZHN1Yjc4MCBzdWJ0cmFjdCAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkZHN1Yjc4MSBzdWJ0cmFjdCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkZHN1Yjc4MiBzdWJ0cmFjdCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkZHN1Yjc4MyBzdWJ0cmFjdCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkZHN1Yjc4NCBzdWJ0cmFjdCAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkZHN1Yjc4NSBzdWJ0cmFjdCAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkZHN1Yjc4NyBzdWJ0cmFjdCAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CitkZHN1Yjc4OCBzdWJ0cmFjdCAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkZHN1Yjc4OSBzdWJ0cmFjdCAtMSAgICAgSW5mICAgLT4gLUluZmluaXR5CitkZHN1Yjc5MCBzdWJ0cmFjdCAgMCAgICAgSW5mICAgLT4gLUluZmluaXR5CitkZHN1Yjc5MSBzdWJ0cmFjdCAgMSAgICAgSW5mICAgLT4gLUluZmluaXR5CitkZHN1Yjc5MiBzdWJ0cmFjdCAgMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CisKK2Rkc3ViODAwIHN1YnRyYWN0ICBJbmYgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4MDEgc3VidHJhY3QgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDIgc3VidHJhY3QgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDMgc3VidHJhY3QgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDQgc3VidHJhY3QgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDUgc3VidHJhY3QgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDYgc3VidHJhY3QgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDcgc3VidHJhY3QgIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDggc3VidHJhY3QgLTEwMDAgLUluZiAgIC0+ICBJbmZpbml0eQorZGRzdWI4MDkgc3VidHJhY3QgLUluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1YjgxMCBzdWJ0cmFjdCAtMSAgICAtSW5mICAgLT4gIEluZmluaXR5CitkZHN1YjgxMSBzdWJ0cmFjdCAtMCAgICAtSW5mICAgLT4gIEluZmluaXR5CitkZHN1YjgxMiBzdWJ0cmFjdCAgMCAgICAtSW5mICAgLT4gIEluZmluaXR5CitkZHN1YjgxMyBzdWJ0cmFjdCAgMSAgICAtSW5mICAgLT4gIEluZmluaXR5CitkZHN1YjgxNCBzdWJ0cmFjdCAgMTAwMCAtSW5mICAgLT4gIEluZmluaXR5CitkZHN1YjgxNSBzdWJ0cmFjdCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CisKK2Rkc3ViODIxIHN1YnRyYWN0ICBOYU4gICBJbmYgICAtPiAgTmFOCitkZHN1YjgyMiBzdWJ0cmFjdCAtTmFOICAgMTAwMCAgLT4gLU5hTgorZGRzdWI4MjMgc3VidHJhY3QgIE5hTiAgIDEgICAgIC0+ICBOYU4KK2Rkc3ViODI0IHN1YnRyYWN0ICBOYU4gICAwICAgICAtPiAgTmFOCitkZHN1YjgyNSBzdWJ0cmFjdCAgTmFOICAtMCAgICAgLT4gIE5hTgorZGRzdWI4MjYgc3VidHJhY3QgIE5hTiAgLTEgICAgIC0+ICBOYU4KK2Rkc3ViODI3IHN1YnRyYWN0ICBOYU4gIC0xMDAwICAtPiAgTmFOCitkZHN1YjgyOCBzdWJ0cmFjdCAgTmFOICAtSW5mICAgLT4gIE5hTgorZGRzdWI4Mjkgc3VidHJhY3QgLU5hTiAgIE5hTiAgIC0+IC1OYU4KK2Rkc3ViODMwIHN1YnRyYWN0IC1JbmYgICBOYU4gICAtPiAgTmFOCitkZHN1YjgzMSBzdWJ0cmFjdCAtMTAwMCAgTmFOICAgLT4gIE5hTgorZGRzdWI4MzIgc3VidHJhY3QgLTEgICAgIE5hTiAgIC0+ICBOYU4KK2Rkc3ViODMzIHN1YnRyYWN0IC0wICAgICBOYU4gICAtPiAgTmFOCitkZHN1YjgzNCBzdWJ0cmFjdCAgMCAgICAgTmFOICAgLT4gIE5hTgorZGRzdWI4MzUgc3VidHJhY3QgIDEgICAgIE5hTiAgIC0+ICBOYU4KK2Rkc3ViODM2IHN1YnRyYWN0ICAxMDAwIC1OYU4gICAtPiAtTmFOCitkZHN1YjgzNyBzdWJ0cmFjdCAgSW5mICAgTmFOICAgLT4gIE5hTgorCitkZHN1Yjg0MSBzdWJ0cmFjdCAgc05hTiAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODQyIHN1YnRyYWN0IC1zTmFOICAxMDAwICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NDMgc3VidHJhY3QgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg0NCBzdWJ0cmFjdCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODQ1IHN1YnRyYWN0ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NDYgc3VidHJhY3QgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg0NyBzdWJ0cmFjdCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODQ4IHN1YnRyYWN0ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NDkgc3VidHJhY3QgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg1MCBzdWJ0cmFjdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODUxIHN1YnRyYWN0IC1JbmYgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NTIgc3VidHJhY3QgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg1MyBzdWJ0cmFjdCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODU0IHN1YnRyYWN0IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NTUgc3VidHJhY3QgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg1NiBzdWJ0cmFjdCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViODU3IHN1YnRyYWN0ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRzdWI4NTggc3VidHJhY3QgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg1OSBzdWJ0cmFjdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGRzdWI4NjEgc3VidHJhY3QgIE5hTjAxICAgLUluZiAgICAgLT4gIE5hTjEKK2Rkc3ViODYyIHN1YnRyYWN0IC1OYU4wMiAgIC0xMDAwICAgIC0+IC1OYU4yCitkZHN1Yjg2MyBzdWJ0cmFjdCAgTmFOMDMgICAgMTAwMCAgICAtPiAgTmFOMworZGRzdWI4NjQgc3VidHJhY3QgIE5hTjA0ICAgIEluZiAgICAgLT4gIE5hTjQKK2Rkc3ViODY1IHN1YnRyYWN0ICBOYU4wNSAgICBOYU42MSAgIC0+ICBOYU41CitkZHN1Yjg2NiBzdWJ0cmFjdCAtSW5mICAgICAtTmFONzEgICAtPiAtTmFONzEKK2Rkc3ViODY3IHN1YnRyYWN0IC0xMDAwICAgICBOYU44MSAgIC0+ICBOYU44MQorZGRzdWI4Njggc3VidHJhY3QgIDEwMDAgICAgIE5hTjkxICAgLT4gIE5hTjkxCitkZHN1Yjg2OSBzdWJ0cmFjdCAgSW5mICAgICAgTmFOMTAxICAtPiAgTmFOMTAxCitkZHN1Yjg3MSBzdWJ0cmFjdCAgc05hTjAxMSAgLUluZiAgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3MiBzdWJ0cmFjdCAgc05hTjAxMiAgLTEwMDAgICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3MyBzdWJ0cmFjdCAtc05hTjAxMyAgIDEwMDAgICAtPiAtTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3NCBzdWJ0cmFjdCAgc05hTjAxNCAgIE5hTjE3MSAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3NSBzdWJ0cmFjdCAgc05hTjAxNSAgc05hTjE4MSAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3NiBzdWJ0cmFjdCAgTmFOMDE2ICAgc05hTjE5MSAtPiAgTmFOMTkxIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3NyBzdWJ0cmFjdCAtSW5mICAgICAgc05hTjIwMSAtPiAgTmFOMjAxIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3OCBzdWJ0cmFjdCAtMTAwMCAgICAgc05hTjIxMSAtPiAgTmFOMjExIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg3OSBzdWJ0cmFjdCAgMTAwMCAgICAtc05hTjIyMSAtPiAtTmFOMjIxIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg4MCBzdWJ0cmFjdCAgSW5mICAgICAgc05hTjIzMSAtPiAgTmFOMjMxIEludmFsaWRfb3BlcmF0aW9uCitkZHN1Yjg4MSBzdWJ0cmFjdCAgTmFOMDI1ICAgc05hTjI0MSAtPiAgTmFOMjQxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGVkZ2UgY2FzZSBzcGlsbHMKK2Rkc3ViOTAxIHN1YnRyYWN0ICAyLkUtMyAgMS4wMDIgIC0+IC0xLjAwMAorZGRzdWI5MDIgc3VidHJhY3QgIDIuMEUtMyAgMS4wMDIgIC0+IC0xLjAwMDAKK2Rkc3ViOTAzIHN1YnRyYWN0ICAyLjAwRS0zICAxLjAwMjAgIC0+IC0xLjAwMDAwCitkZHN1YjkwNCBzdWJ0cmFjdCAgMi4wMDBFLTMgIDEuMDAyMDAgIC0+IC0xLjAwMDAwMAorZGRzdWI5MDUgc3VidHJhY3QgIDIuMDAwMEUtMyAgMS4wMDIwMDAgIC0+IC0xLjAwMDAwMDAKK2Rkc3ViOTA2IHN1YnRyYWN0ICAyLjAwMDAwRS0zICAxLjAwMjAwMDAgIC0+IC0xLjAwMDAwMDAwCitkZHN1YjkwNyBzdWJ0cmFjdCAgMi4wMDAwMDBFLTMgIDEuMDAyMDAwMDAgIC0+IC0xLjAwMDAwMDAwMAorZGRzdWI5MDggc3VidHJhY3QgIDIuMDAwMDAwMEUtMyAgMS4wMDIwMDAwMDAgIC0+IC0xLjAwMDAwMDAwMDAKKworLS0gc3Vibm9ybWFscyBhbmQgb3ZlcmZsb3dzIGNvdmVyZWQgdW5kZXIgQWRkCisKKy0tIE51bGwgdGVzdHMKK2Rkc3ViOTk5MCBzdWJ0cmFjdCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rkc3ViOTk5MSBzdWJ0cmFjdCAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRUb0ludGVncmFsLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkVG9JbnRlZ3JhbC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNmQ2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkVG9JbnRlZ3JhbC5kZWNUZXN0CkBAIC0wLDAgKzEsMjU3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRkVG9JbnRlZ3JhbC5kZWNUZXN0IC0tIHJvdW5kIERvdWJsZSB0byBpbnRlZ3JhbCB2YWx1ZSAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgdGVzdHMgdGhlIGV4dGVuZGVkIHNwZWNpZmljYXRpb24gJ3JvdW5kLXRvLWludGVncmFsCistLSB2YWx1ZS1leGFjdCcgb3BlcmF0aW9ucyAoZnJvbSBJRUVFIDg1NCwgbGF0ZXIgbW9kaWZpZWQgaW4gNzU0cikuCistLSBBbGwgbm9uLXplcm8gcmVzdWx0cyBhcmUgZGVmaW5lZCBhcyBiZWluZyB0aG9zZSBmcm9tIGVpdGhlciBjb3B5IG9yCistLSBxdWFudGl6ZSwgc28gdGhvc2UgYXJlIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHRlc3RlZCBleHRlbnNpdmVseQorLS0gZWxzZXdoZXJlOyB0aGUgdGVzdHMgaGVyZSBhcmUgZm9yIGludGVncml0eSwgcm91bmRpbmcgbW9kZSwgZXRjLgorLS0gQWxzbywgaXQgaXMgYXNzdW1lZCB0aGUgdGVzdCBoYXJuZXNzIHdpbGwgdXNlIHRoZXNlIHRlc3RzIGZvciBib3RoCistLSBUb0ludGVncmFsRXhhY3QgKHdoaWNoIGRvZXMgc2V0IEluZXhhY3QpIGFuZCB0aGUgZml4ZWQtbmFtZQorLS0gZnVuY3Rpb25zICh3aGljaCBkbyBub3Qgc2V0IEluZXhhY3QpLgorCistLSBOb3RlIHRoYXQgZGVjTnVtYmVyIGltcGxlbWVudHMgYW4gZWFybGllciBkZWZpbml0aW9uIG9mIHRvSW50ZWdyYWwKKy0tIHdoaWNoIG5ldmVyIHNldHMgSW5leGFjdDsgdGhlIGRlY1Rlc3Qgb3BlcmF0b3IgZm9yIHRoYXQgaXMgY2FsbGVkCistLSAndG9pbnRlZ3JhbCcgaW5zdGVhZCBvZiAndG9pbnRlZ3JhbHgnLgorCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZGRpbnR4MDAxIHRvaW50ZWdyYWx4ICAgICAgMCAgICAgLT4gIDAKK2RkaW50eDAwMiB0b2ludGVncmFseCAgICAgIDAuMCAgIC0+ICAwCitkZGludHgwMDMgdG9pbnRlZ3JhbHggICAgICAwLjEgICAtPiAgMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMDQgdG9pbnRlZ3JhbHggICAgICAwLjIgICAtPiAgMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMDUgdG9pbnRlZ3JhbHggICAgICAwLjMgICAtPiAgMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMDYgdG9pbnRlZ3JhbHggICAgICAwLjQgICAtPiAgMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMDcgdG9pbnRlZ3JhbHggICAgICAwLjUgICAtPiAgMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMDggdG9pbnRlZ3JhbHggICAgICAwLjYgICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMDkgdG9pbnRlZ3JhbHggICAgICAwLjcgICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMTAgdG9pbnRlZ3JhbHggICAgICAwLjggICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMTEgdG9pbnRlZ3JhbHggICAgICAwLjkgICAtPiAgMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMTIgdG9pbnRlZ3JhbHggICAgICAxICAgICAtPiAgMQorZGRpbnR4MDEzIHRvaW50ZWdyYWx4ICAgICAgMS4wICAgLT4gIDEgIFJvdW5kZWQKK2RkaW50eDAxNCB0b2ludGVncmFseCAgICAgIDEuMSAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxNSB0b2ludGVncmFseCAgICAgIDEuMiAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxNiB0b2ludGVncmFseCAgICAgIDEuMyAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxNyB0b2ludGVncmFseCAgICAgIDEuNCAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxOCB0b2ludGVncmFseCAgICAgIDEuNSAgIC0+ICAyICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAxOSB0b2ludGVncmFseCAgICAgIDEuNiAgIC0+ICAyICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAyMCB0b2ludGVncmFseCAgICAgIDEuNyAgIC0+ICAyICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAyMSB0b2ludGVncmFseCAgICAgIDEuOCAgIC0+ICAyICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDAyMiB0b2ludGVncmFseCAgICAgIDEuOSAgIC0+ICAyICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5lZ2F0aXZlcworZGRpbnR4MDMxIHRvaW50ZWdyYWx4ICAgICAtMCAgICAgLT4gLTAKK2RkaW50eDAzMiB0b2ludGVncmFseCAgICAgLTAuMCAgIC0+IC0wCitkZGludHgwMzMgdG9pbnRlZ3JhbHggICAgIC0wLjEgICAtPiAtMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMzQgdG9pbnRlZ3JhbHggICAgIC0wLjIgICAtPiAtMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMzUgdG9pbnRlZ3JhbHggICAgIC0wLjMgICAtPiAtMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMzYgdG9pbnRlZ3JhbHggICAgIC0wLjQgICAtPiAtMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMzcgdG9pbnRlZ3JhbHggICAgIC0wLjUgICAtPiAtMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMzggdG9pbnRlZ3JhbHggICAgIC0wLjYgICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwMzkgdG9pbnRlZ3JhbHggICAgIC0wLjcgICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwNDAgdG9pbnRlZ3JhbHggICAgIC0wLjggICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwNDEgdG9pbnRlZ3JhbHggICAgIC0wLjkgICAtPiAtMSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwNDIgdG9pbnRlZ3JhbHggICAgIC0xICAgICAtPiAtMQorZGRpbnR4MDQzIHRvaW50ZWdyYWx4ICAgICAtMS4wICAgLT4gLTEgIFJvdW5kZWQKK2RkaW50eDA0NCB0b2ludGVncmFseCAgICAgLTEuMSAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0NSB0b2ludGVncmFseCAgICAgLTEuMiAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0NiB0b2ludGVncmFseCAgICAgLTEuMyAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0NyB0b2ludGVncmFseCAgICAgLTEuNCAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0OCB0b2ludGVncmFseCAgICAgLTEuNSAgIC0+IC0yICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA0OSB0b2ludGVncmFseCAgICAgLTEuNiAgIC0+IC0yICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA1MCB0b2ludGVncmFseCAgICAgLTEuNyAgIC0+IC0yICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA1MSB0b2ludGVncmFseCAgICAgLTEuOCAgIC0+IC0yICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA1MiB0b2ludGVncmFseCAgICAgLTEuOSAgIC0+IC0yICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgdHdvIHdvdWxkIGJlIE5hTiB1c2luZyBxdWFudGl6ZSh4LCAwKQorZGRpbnR4MDUzIHRvaW50ZWdyYWx4ICAgIDEwRSs2MCAgLT4gMS4wRSs2MQorZGRpbnR4MDU0IHRvaW50ZWdyYWx4ICAgLTEwRSs2MCAgLT4gLTEuMEUrNjEKKworLS0gbnVtYmVycyBhcm91bmQgcHJlY2lzaW9uCitkZGludHgwNjAgdG9pbnRlZ3JhbHggJzU2MjY3RS0xNycgICAtPiAnMCcgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA2MSB0b2ludGVncmFseCAnNTYyNjdFLTUnICAgIC0+ICcxJyAgICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDYyIHRvaW50ZWdyYWx4ICc1NjI2N0UtMicgICAgLT4gJzU2MycgICAgSW5leGFjdCBSb3VuZGVkCitkZGludHgwNjMgdG9pbnRlZ3JhbHggJzU2MjY3RS0xJyAgICAtPiAnNTYyNycgICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDA2NSB0b2ludGVncmFseCAnNTYyNjdFLTAnICAgIC0+ICc1NjI2NycKK2RkaW50eDA2NiB0b2ludGVncmFseCAnNTYyNjdFKzAnICAgIC0+ICc1NjI2NycKK2RkaW50eDA2NyB0b2ludGVncmFseCAnNTYyNjdFKzEnICAgIC0+ICc1LjYyNjdFKzUnCitkZGludHgwNjggdG9pbnRlZ3JhbHggJzU2MjY3RSs5JyAgICAtPiAnNS42MjY3RSsxMycKK2RkaW50eDA2OSB0b2ludGVncmFseCAnNTYyNjdFKzEwJyAgIC0+ICc1LjYyNjdFKzE0JworZGRpbnR4MDcwIHRvaW50ZWdyYWx4ICc1NjI2N0UrMTEnICAgLT4gJzUuNjI2N0UrMTUnCitkZGludHgwNzEgdG9pbnRlZ3JhbHggJzU2MjY3RSsxMicgICAtPiAnNS42MjY3RSsxNicKK2RkaW50eDA3MiB0b2ludGVncmFseCAnNTYyNjdFKzEzJyAgIC0+ICc1LjYyNjdFKzE3JworZGRpbnR4MDczIHRvaW50ZWdyYWx4ICcxLjIzRSs5NicgICAgLT4gJzEuMjNFKzk2JworZGRpbnR4MDc0IHRvaW50ZWdyYWx4ICcxLjIzRSszODQnICAgLT4gIzQ3ZmQzMDAwMDAwMDAwMDAgIENsYW1wZWQKKworZGRpbnR4MDgwIHRvaW50ZWdyYWx4ICctNTYyNjdFLTEwJyAgLT4gJy0wJyAgICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDgxIHRvaW50ZWdyYWx4ICctNTYyNjdFLTUnICAgLT4gJy0xJyAgICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDgyIHRvaW50ZWdyYWx4ICctNTYyNjdFLTInICAgLT4gJy01NjMnICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDgzIHRvaW50ZWdyYWx4ICctNTYyNjdFLTEnICAgLT4gJy01NjI3JyAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MDg1IHRvaW50ZWdyYWx4ICctNTYyNjdFLTAnICAgLT4gJy01NjI2NycKK2RkaW50eDA4NiB0b2ludGVncmFseCAnLTU2MjY3RSswJyAgIC0+ICctNTYyNjcnCitkZGludHgwODcgdG9pbnRlZ3JhbHggJy01NjI2N0UrMScgICAtPiAnLTUuNjI2N0UrNScKK2RkaW50eDA4OCB0b2ludGVncmFseCAnLTU2MjY3RSs5JyAgIC0+ICctNS42MjY3RSsxMycKK2RkaW50eDA4OSB0b2ludGVncmFseCAnLTU2MjY3RSsxMCcgIC0+ICctNS42MjY3RSsxNCcKK2RkaW50eDA5MCB0b2ludGVncmFseCAnLTU2MjY3RSsxMScgIC0+ICctNS42MjY3RSsxNScKK2RkaW50eDA5MSB0b2ludGVncmFseCAnLTU2MjY3RSsxMicgIC0+ICctNS42MjY3RSsxNicKK2RkaW50eDA5MiB0b2ludGVncmFseCAnLTU2MjY3RSsxMycgIC0+ICctNS42MjY3RSsxNycKK2RkaW50eDA5MyB0b2ludGVncmFseCAnLTEuMjNFKzk2JyAgIC0+ICctMS4yM0UrOTYnCitkZGludHgwOTQgdG9pbnRlZ3JhbHggJy0xLjIzRSszODQnICAtPiAjYzdmZDMwMDAwMDAwMDAwMCAgQ2xhbXBlZAorCistLSBzdWJub3JtYWwgaW5wdXRzCitkZGludHgxMDAgdG9pbnRlZ3JhbHggICAgICAgIDFFLTI5OSAtPiAwICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDEwMSB0b2ludGVncmFseCAgICAgIDAuMUUtMjk5IC0+IDAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MTAyIHRvaW50ZWdyYWx4ICAgICAwLjAxRS0yOTkgLT4gMCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgxMDMgdG9pbnRlZ3JhbHggICAgICAgIDBFLTI5OSAtPiAwCisKKy0tIHNwZWNpYWxzIGFuZCB6ZXJvcworZGRpbnR4MTIwIHRvaW50ZWdyYWx4ICdJbmYnICAgICAgIC0+ICBJbmZpbml0eQorZGRpbnR4MTIxIHRvaW50ZWdyYWx4ICctSW5mJyAgICAgIC0+IC1JbmZpbml0eQorZGRpbnR4MTIyIHRvaW50ZWdyYWx4ICAgTmFOICAgICAgIC0+ICBOYU4KK2RkaW50eDEyMyB0b2ludGVncmFseCAgc05hTiAgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnR4MTI0IHRvaW50ZWdyYWx4ICAgICAwICAgICAgIC0+ICAwCitkZGludHgxMjUgdG9pbnRlZ3JhbHggICAgLTAgICAgICAgLT4gLTAKK2RkaW50eDEyNiB0b2ludGVncmFseCAgICAgMC4wMDAgICAtPiAgMAorZGRpbnR4MTI3IHRvaW50ZWdyYWx4ICAgICAwLjAwICAgIC0+ICAwCitkZGludHgxMjggdG9pbnRlZ3JhbHggICAgIDAuMCAgICAgLT4gIDAKK2RkaW50eDEyOSB0b2ludGVncmFseCAgICAgMCAgICAgICAtPiAgMAorZGRpbnR4MTMwIHRvaW50ZWdyYWx4ICAgICAwRS0zICAgIC0+ICAwCitkZGludHgxMzEgdG9pbnRlZ3JhbHggICAgIDBFLTIgICAgLT4gIDAKK2RkaW50eDEzMiB0b2ludGVncmFseCAgICAgMEUtMSAgICAtPiAgMAorZGRpbnR4MTMzIHRvaW50ZWdyYWx4ICAgICAwRS0wICAgIC0+ICAwCitkZGludHgxMzQgdG9pbnRlZ3JhbHggICAgIDBFKzEgICAgLT4gIDBFKzEKK2RkaW50eDEzNSB0b2ludGVncmFseCAgICAgMEUrMiAgICAtPiAgMEUrMgorZGRpbnR4MTM2IHRvaW50ZWdyYWx4ICAgICAwRSszICAgIC0+ICAwRSszCitkZGludHgxMzcgdG9pbnRlZ3JhbHggICAgIDBFKzQgICAgLT4gIDBFKzQKK2RkaW50eDEzOCB0b2ludGVncmFseCAgICAgMEUrNSAgICAtPiAgMEUrNQorZGRpbnR4MTM5IHRvaW50ZWdyYWx4ICAgIC0wLjAwMCAgIC0+IC0wCitkZGludHgxNDAgdG9pbnRlZ3JhbHggICAgLTAuMDAgICAgLT4gLTAKK2RkaW50eDE0MSB0b2ludGVncmFseCAgICAtMC4wICAgICAtPiAtMAorZGRpbnR4MTQyIHRvaW50ZWdyYWx4ICAgIC0wICAgICAgIC0+IC0wCitkZGludHgxNDMgdG9pbnRlZ3JhbHggICAgLTBFLTMgICAgLT4gLTAKK2RkaW50eDE0NCB0b2ludGVncmFseCAgICAtMEUtMiAgICAtPiAtMAorZGRpbnR4MTQ1IHRvaW50ZWdyYWx4ICAgIC0wRS0xICAgIC0+IC0wCitkZGludHgxNDYgdG9pbnRlZ3JhbHggICAgLTBFLTAgICAgLT4gLTAKK2RkaW50eDE0NyB0b2ludGVncmFseCAgICAtMEUrMSAgICAtPiAtMEUrMQorZGRpbnR4MTQ4IHRvaW50ZWdyYWx4ICAgIC0wRSsyICAgIC0+IC0wRSsyCitkZGludHgxNDkgdG9pbnRlZ3JhbHggICAgLTBFKzMgICAgLT4gLTBFKzMKK2RkaW50eDE1MCB0b2ludGVncmFseCAgICAtMEUrNCAgICAtPiAtMEUrNAorZGRpbnR4MTUxIHRvaW50ZWdyYWx4ICAgIC0wRSs1ICAgIC0+IC0wRSs1CistLSBwcm9wYWdhdGluZyBOYU5zCitkZGludHgxNTIgdG9pbnRlZ3JhbHggICBOYU44MDggICAgLT4gIE5hTjgwOAorZGRpbnR4MTUzIHRvaW50ZWdyYWx4ICBzTmFOMDgwICAgIC0+ICBOYU44MCAgSW52YWxpZF9vcGVyYXRpb24KK2RkaW50eDE1NCB0b2ludGVncmFseCAgLU5hTjgwOCAgICAtPiAtTmFOODA4CitkZGludHgxNTUgdG9pbnRlZ3JhbHggLXNOYU4wODAgICAgLT4gLU5hTjgwICBJbnZhbGlkX29wZXJhdGlvbgorZGRpbnR4MTU2IHRvaW50ZWdyYWx4ICAtTmFOICAgICAgIC0+IC1OYU4KK2RkaW50eDE1NyB0b2ludGVncmFseCAtc05hTiAgICAgICAtPiAtTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGV4YW1wbGVzCityb3VuZGluZzogICAgaGFsZl91cAorZGRpbnR4MjAwIHRvaW50ZWdyYWx4ICAgICAyLjEgICAgLT4gMiAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjAxIHRvaW50ZWdyYWx4ICAgMTAwICAgICAgLT4gMTAwCitkZGludHgyMDIgdG9pbnRlZ3JhbHggICAxMDAuMCAgICAtPiAxMDAgICAgICAgICAgUm91bmRlZAorZGRpbnR4MjAzIHRvaW50ZWdyYWx4ICAgMTAxLjUgICAgLT4gMTAyICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjA0IHRvaW50ZWdyYWx4ICAtMTAxLjUgICAgLT4gLTEwMiAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjA1IHRvaW50ZWdyYWx4ICAgMTBFKzUgICAgLT4gMS4wRSs2CitkZGludHgyMDYgdG9pbnRlZ3JhbHggIDcuODlFKzc3ICAtPiA3Ljg5RSs3NworZGRpbnR4MjA3IHRvaW50ZWdyYWx4ICAgLUluZiAgICAgLT4gLUluZmluaXR5CisKKworLS0gYWxsIHJvdW5kaW5nIG1vZGVzCityb3VuZGluZzogICAgaGFsZl9ldmVuCitkZGludHgyMTAgdG9pbnRlZ3JhbHggICAgIDU1LjUgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjExIHRvaW50ZWdyYWx4ICAgICA1Ni41ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIxMiB0b2ludGVncmFseCAgICAgNTcuNSAgIC0+ICA1OCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMTMgdG9pbnRlZ3JhbHggICAgLTU1LjUgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjE0IHRvaW50ZWdyYWx4ICAgIC01Ni41ICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIxNSB0b2ludGVncmFseCAgICAtNTcuNSAgIC0+IC01OCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX3VwCisKK2RkaW50eDIyMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMjEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjIyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU4ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIyMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMjQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjI1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU4ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorCitkZGludHgyMzAgdG9pbnRlZ3JhbHggICAgIDU1LjUgICAtPiAgNTUgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjMxIHRvaW50ZWdyYWx4ICAgICA1Ni41ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIzMiB0b2ludGVncmFseCAgICAgNTcuNSAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyMzMgdG9pbnRlZ3JhbHggICAgLTU1LjUgICAtPiAtNTUgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjM0IHRvaW50ZWdyYWx4ICAgIC01Ni41ICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDIzNSB0b2ludGVncmFseCAgICAtNTcuNSAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICB1cAorCitkZGludHgyNDAgdG9pbnRlZ3JhbHggICAgIDU1LjMgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjQxIHRvaW50ZWdyYWx4ICAgICA1Ni4zICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI0MiB0b2ludGVncmFseCAgICAgNTcuMyAgIC0+ICA1OCAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNDMgdG9pbnRlZ3JhbHggICAgLTU1LjMgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjQ0IHRvaW50ZWdyYWx4ICAgIC01Ni4zICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI0NSB0b2ludGVncmFseCAgICAtNTcuMyAgIC0+IC01OCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBkb3duCisKK2RkaW50eDI1MCB0b2ludGVncmFseCAgICAgNTUuNyAgIC0+ICA1NSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNTEgdG9pbnRlZ3JhbHggICAgIDU2LjcgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjUyIHRvaW50ZWdyYWx4ICAgICA1Ny43ICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI1MyB0b2ludGVncmFseCAgICAtNTUuNyAgIC0+IC01NSAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNTQgdG9pbnRlZ3JhbHggICAgLTU2LjcgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjU1IHRvaW50ZWdyYWx4ICAgIC01Ny43ICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGNlaWxpbmcKKworZGRpbnR4MjYwIHRvaW50ZWdyYWx4ICAgICA1NS4zICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI2MSB0b2ludGVncmFseCAgICAgNTYuMyAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNjIgdG9pbnRlZ3JhbHggICAgIDU3LjMgICAtPiAgNTggIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjYzIHRvaW50ZWdyYWx4ICAgIC01NS4zICAgLT4gLTU1ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI2NCB0b2ludGVncmFseCAgICAtNTYuMyAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNjUgdG9pbnRlZ3JhbHggICAgLTU3LjMgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgZmxvb3IKKworZGRpbnR4MjcwIHRvaW50ZWdyYWx4ICAgICA1NS43ICAgLT4gIDU1ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI3MSB0b2ludGVncmFseCAgICAgNTYuNyAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNzIgdG9pbnRlZ3JhbHggICAgIDU3LjcgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZGRpbnR4MjczIHRvaW50ZWdyYWx4ICAgIC01NS43ICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RkaW50eDI3NCB0b2ludGVncmFseCAgICAtNTYuNyAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCitkZGludHgyNzUgdG9pbnRlZ3JhbHggICAgLTU3LjcgICAtPiAtNTggIEluZXhhY3QgUm91bmRlZAorCistLSBJbnQgYW5kIHVJbnQzMiBlZGdlIHZhbHVlcyBmb3IgdGVzdGluZyBjb252ZXJzaW9ucworZGRpbnR4MzAwIHRvaW50ZWdyYWx4IC0yMTQ3NDgzNjQ2ICAtPiAtMjE0NzQ4MzY0NgorZGRpbnR4MzAxIHRvaW50ZWdyYWx4IC0yMTQ3NDgzNjQ3ICAtPiAtMjE0NzQ4MzY0NworZGRpbnR4MzAyIHRvaW50ZWdyYWx4IC0yMTQ3NDgzNjQ4ICAtPiAtMjE0NzQ4MzY0OAorZGRpbnR4MzAzIHRvaW50ZWdyYWx4IC0yMTQ3NDgzNjQ5ICAtPiAtMjE0NzQ4MzY0OQorZGRpbnR4MzA0IHRvaW50ZWdyYWx4ICAyMTQ3NDgzNjQ2ICAtPiAgMjE0NzQ4MzY0NgorZGRpbnR4MzA1IHRvaW50ZWdyYWx4ICAyMTQ3NDgzNjQ3ICAtPiAgMjE0NzQ4MzY0NworZGRpbnR4MzA2IHRvaW50ZWdyYWx4ICAyMTQ3NDgzNjQ4ICAtPiAgMjE0NzQ4MzY0OAorZGRpbnR4MzA3IHRvaW50ZWdyYWx4ICAyMTQ3NDgzNjQ5ICAtPiAgMjE0NzQ4MzY0OQorZGRpbnR4MzA4IHRvaW50ZWdyYWx4ICA0Mjk0OTY3Mjk0ICAtPiAgNDI5NDk2NzI5NAorZGRpbnR4MzA5IHRvaW50ZWdyYWx4ICA0Mjk0OTY3Mjk1ICAtPiAgNDI5NDk2NzI5NQorZGRpbnR4MzEwIHRvaW50ZWdyYWx4ICA0Mjk0OTY3Mjk2ICAtPiAgNDI5NDk2NzI5NgorZGRpbnR4MzExIHRvaW50ZWdyYWx4ICA0Mjk0OTY3Mjk3ICAtPiAgNDI5NDk2NzI5NworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkWG9yLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RkWG9yLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMxYzdlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGRYb3IuZGVjVGVzdApAQCAtMCwwICsxLDMzNyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZFhvci5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIFhPUiBmb3IgZGVjRG91YmxlcyAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK3ByZWNpc2lvbjogICAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQorZGR4b3IwMDEgeG9yICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCitkZHhvcjAwMiB4b3IgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDEKK2RkeG9yMDAzIHhvciAgICAgICAgICAgICAxICAgIDAgLT4gICAgMQorZGR4b3IwMDQgeG9yICAgICAgICAgICAgIDEgICAgMSAtPiAgICAwCitkZHhvcjAwNSB4b3IgICAgICAgICAgMTEwMCAxMDEwIC0+ICAxMTAKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCitkZHhvcjAwNiB4b3IgMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCitkZHhvcjAwNyB4b3IgMDAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMAorZGR4b3IwMDggeG9yIDEwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAKK2RkeG9yMDA5IHhvciAxMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2RkeG9yMDEwIHhvciAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2RkeG9yMDExIHhvciAwMDAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwCitkZHhvcjAxMiB4b3IgMDEwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMAorZGR4b3IwMTMgeG9yIDAxMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorCistLSBWYXJpb3VzIGxlbmd0aHMKKy0tICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NgorZGR4b3IwMjEgeG9yIDExMTExMTExMTAwMDAwMDAgICAgIDExMTExMTExMTAwMDAwMDAgIC0+ICAwCitkZHhvcjAyMiB4b3IgIDExMTExMTExMDAwMDAwMCAgICAgIDExMTExMTExMDAwMDAwMCAgLT4gIDAKK2RkeG9yMDIzIHhvciAgIDExMTExMTEwMDAwMDAwICAgICAgIDExMTExMTEwMDAwMDAwICAtPiAgMAorZGR4b3IwMjQgeG9yICAgIDExMTExMTAwMDAwMDAgICAgICAgIDExMTExMTAwMDAwMDAgIC0+ICAwCitkZHhvcjAyNSB4b3IgICAgIDExMTExMDAwMDAwMCAgICAgICAgIDExMTExMDAwMDAwMCAgLT4gIDAKK2RkeG9yMDI2IHhvciAgICAgIDExMTEwMDAwMDAwICAgICAgICAgIDExMTEwMDAwMDAwICAtPiAgMAorZGR4b3IwMjcgeG9yICAgICAgIDExMTAwMDAwMDAgICAgICAgICAgIDExMTAwMDAwMDAgIC0+ICAwCitkZHhvcjAyOCB4b3IgICAgICAgIDExMDAwMDAwMCAgICAgICAgICAgIDExMDAwMDAwMCAgLT4gIDAKK2RkeG9yMDI5IHhvciAgICAgICAgIDEwMDAwMDAwICAgICAgICAgICAgIDEwMDAwMDAwICAtPiAgMAorZGR4b3IwMzAgeG9yICAgICAgICAgIDEwMDAwMDAgICAgICAgICAgICAgIDEwMDAwMDAgIC0+ICAwCitkZHhvcjAzMSB4b3IgICAgICAgICAgIDEwMDAwMCAgICAgICAgICAgICAgIDEwMDAwMCAgLT4gIDAKK2RkeG9yMDMyIHhvciAgICAgICAgICAgIDEwMDAwICAgICAgICAgICAgICAgIDEwMDAwICAtPiAgMAorZGR4b3IwMzMgeG9yICAgICAgICAgICAgIDEwMDAgICAgICAgICAgICAgICAgIDEwMDAgIC0+ICAwCitkZHhvcjAzNCB4b3IgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDEwMCAgLT4gIDAKK2RkeG9yMDM1IHhvciAgICAgICAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgIDEwICAtPiAgMAorZGR4b3IwMzYgeG9yICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgIDEgIC0+ICAwCisKK2RkeG9yMDQwIHhvciAxMTExMTExMTEgIDExMTExMTExMTExMSAgLT4gIDExMTAwMDAwMDAwMAorZGR4b3IwNDEgeG9yICAxMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTExMTAwMDAwMDAwCitkZHhvcjA0MiB4b3IgIDExMTExMTExICAgICAxMTExMTExMTEgIC0+ICAxMDAwMDAwMDAKK2RkeG9yMDQzIHhvciAgIDExMTExMTEgICAgIDEwMDAwMDAxMCAgLT4gIDEwMTExMTEwMQorZGR4b3IwNDQgeG9yICAgIDExMTExMSAgICAgMTAwMDAwMTAwICAtPiAgMTAwMTExMDExCitkZHhvcjA0NSB4b3IgICAgIDExMTExICAgICAxMDAwMDEwMDAgIC0+ICAxMDAwMTAxMTEKK2RkeG9yMDQ2IHhvciAgICAgIDExMTEgICAgIDEwMDAxMDAwMCAgLT4gIDEwMDAxMTExMQorZGR4b3IwNDcgeG9yICAgICAgIDExMSAgICAgMTAwMTAwMDAwICAtPiAgMTAwMTAwMTExCitkZHhvcjA0OCB4b3IgICAgICAgIDExICAgICAxMDEwMDAwMDAgIC0+ICAxMDEwMDAwMTEKK2RkeG9yMDQ5IHhvciAgICAgICAgIDEgICAgIDExMDAwMDAwMCAgLT4gIDExMDAwMDAwMQorCitkZHhvcjA1MCB4b3IgMTExMTExMTExMSAgMSAgLT4gIDExMTExMTExMTAKK2RkeG9yMDUxIHhvciAgMTExMTExMTExICAxICAtPiAgMTExMTExMTEwCitkZHhvcjA1MiB4b3IgICAxMTExMTExMSAgMSAgLT4gIDExMTExMTEwCitkZHhvcjA1MyB4b3IgICAgMTExMTExMSAgMSAgLT4gIDExMTExMTAKK2RkeG9yMDU0IHhvciAgICAgMTExMTExICAxICAtPiAgMTExMTEwCitkZHhvcjA1NSB4b3IgICAgICAxMTExMSAgMSAgLT4gIDExMTEwCitkZHhvcjA1NiB4b3IgICAgICAgMTExMSAgMSAgLT4gIDExMTAKK2RkeG9yMDU3IHhvciAgICAgICAgMTExICAxICAtPiAgMTEwCitkZHhvcjA1OCB4b3IgICAgICAgICAxMSAgMSAgLT4gIDEwCitkZHhvcjA1OSB4b3IgICAgICAgICAgMSAgMSAgLT4gIDAKKworZGR4b3IwNjAgeG9yIDExMTExMTExMTEgIDAgIC0+ICAxMTExMTExMTExCitkZHhvcjA2MSB4b3IgIDExMTExMTExMSAgMCAgLT4gIDExMTExMTExMQorZGR4b3IwNjIgeG9yICAgMTExMTExMTEgIDAgIC0+ICAxMTExMTExMQorZGR4b3IwNjMgeG9yICAgIDExMTExMTEgIDAgIC0+ICAxMTExMTExCitkZHhvcjA2NCB4b3IgICAgIDExMTExMSAgMCAgLT4gIDExMTExMQorZGR4b3IwNjUgeG9yICAgICAgMTExMTEgIDAgIC0+ICAxMTExMQorZGR4b3IwNjYgeG9yICAgICAgIDExMTEgIDAgIC0+ICAxMTExCitkZHhvcjA2NyB4b3IgICAgICAgIDExMSAgMCAgLT4gIDExMQorZGR4b3IwNjggeG9yICAgICAgICAgMTEgIDAgIC0+ICAxMQorZGR4b3IwNjkgeG9yICAgICAgICAgIDEgIDAgIC0+ICAxCisKK2RkeG9yMDcwIHhvciAxICAxMTExMTExMTExICAtPiAgMTExMTExMTExMAorZGR4b3IwNzEgeG9yIDEgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTAKK2RkeG9yMDcyIHhvciAxICAgIDExMTExMTExICAtPiAgMTExMTExMTAKK2RkeG9yMDczIHhvciAxICAgICAxMTExMTExICAtPiAgMTExMTExMAorZGR4b3IwNzQgeG9yIDEgICAgICAxMTExMTEgIC0+ICAxMTExMTAKK2RkeG9yMDc1IHhvciAxICAgICAgIDExMTExICAtPiAgMTExMTAKK2RkeG9yMDc2IHhvciAxICAgICAgICAxMTExICAtPiAgMTExMAorZGR4b3IwNzcgeG9yIDEgICAgICAgICAxMTEgIC0+ICAxMTAKK2RkeG9yMDc4IHhvciAxICAgICAgICAgIDExICAtPiAgMTAKK2RkeG9yMDc5IHhvciAxICAgICAgICAgICAxICAtPiAgMAorCitkZHhvcjA4MCB4b3IgMCAgMTExMTExMTExMSAgLT4gIDExMTExMTExMTEKK2RkeG9yMDgxIHhvciAwICAgMTExMTExMTExICAtPiAgMTExMTExMTExCitkZHhvcjA4MiB4b3IgMCAgICAxMTExMTExMSAgLT4gIDExMTExMTExCitkZHhvcjA4MyB4b3IgMCAgICAgMTExMTExMSAgLT4gIDExMTExMTEKK2RkeG9yMDg0IHhvciAwICAgICAgMTExMTExICAtPiAgMTExMTExCitkZHhvcjA4NSB4b3IgMCAgICAgICAxMTExMSAgLT4gIDExMTExCitkZHhvcjA4NiB4b3IgMCAgICAgICAgMTExMSAgLT4gIDExMTEKK2RkeG9yMDg3IHhvciAwICAgICAgICAgMTExICAtPiAgMTExCitkZHhvcjA4OCB4b3IgMCAgICAgICAgICAxMSAgLT4gIDExCitkZHhvcjA4OSB4b3IgMCAgICAgICAgICAgMSAgLT4gIDEKKworZGR4b3IwOTAgeG9yIDAxMTExMTExMSAgMTExMTAxMTExICAtPiAgMTAwMDEwMDAwCitkZHhvcjA5MSB4b3IgMTAxMTExMTExICAxMTExMDExMTEgIC0+ICAgMTAwMTAwMDAKK2RkeG9yMDkyIHhvciAxMTAxMTExMTEgIDExMTEwMTExMSAgLT4gICAgMTAxMDAwMAorZGR4b3IwOTMgeG9yIDExMTAxMTExMSAgMTExMTAxMTExICAtPiAgICAgMTEwMDAwCitkZHhvcjA5NCB4b3IgMTExMTAxMTExICAxMTExMDExMTEgIC0+ICAgICAgICAgIDAKK2RkeG9yMDk1IHhvciAxMTExMTAxMTEgIDExMTEwMTExMSAgLT4gICAgICAxMTAwMAorZGR4b3IwOTYgeG9yIDExMTExMTAxMSAgMTExMTAxMTExICAtPiAgICAgIDEwMTAwCitkZHhvcjA5NyB4b3IgMTExMTExMTAxICAxMTExMDExMTEgIC0+ICAgICAgMTAwMTAKK2RkeG9yMDk4IHhvciAxMTExMTExMTAgIDExMTEwMTExMSAgLT4gICAgICAxMDAwMQorCitkZHhvcjEwMCB4b3IgMTExMTAxMTExICAwMTExMTExMTEgIC0+ICAxMDAwMTAwMDAKK2RkeG9yMTAxIHhvciAxMTExMDExMTEgIDEwMTExMTExMSAgLT4gICAxMDAxMDAwMAorZGR4b3IxMDIgeG9yIDExMTEwMTExMSAgMTEwMTExMTExICAtPiAgICAxMDEwMDAwCitkZHhvcjEwMyB4b3IgMTExMTAxMTExICAxMTEwMTExMTEgIC0+ICAgICAxMTAwMDAKK2RkeG9yMTA0IHhvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gICAgICAgICAgMAorZGR4b3IxMDUgeG9yIDExMTEwMTExMSAgMTExMTEwMTExICAtPiAgICAgIDExMDAwCitkZHhvcjEwNiB4b3IgMTExMTAxMTExICAxMTExMTEwMTEgIC0+ICAgICAgMTAxMDAKK2RkeG9yMTA3IHhvciAxMTExMDExMTEgIDExMTExMTEwMSAgLT4gICAgICAxMDAxMAorZGR4b3IxMDggeG9yIDExMTEwMTExMSAgMTExMTExMTEwICAtPiAgICAgIDEwMDAxCisKKy0tIG5vbi0wLzEgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCwgbm9yIHNob3VsZCBzaWducworZGR4b3IyMjAgeG9yIDExMTExMTExMiAgMTExMTExMTExICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIyMSB4b3IgMzMzMzMzMzMzICAzMzMzMzMzMzMgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjIyIHhvciA1NTU1NTU1NTUgIDU1NTU1NTU1NSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMjMgeG9yIDc3Nzc3Nzc3NyAgNzc3Nzc3Nzc3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIyNCB4b3IgOTk5OTk5OTk5ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjI1IHhvciAyMjIyMjIyMjIgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMjYgeG9yIDQ0NDQ0NDQ0NCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIyNyB4b3IgNjY2NjY2NjY2ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjI4IHhvciA4ODg4ODg4ODggIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMjkgeG9yIDk5OTk5OTk5OSAgMjIyMjIyMjIyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjIzMCB4b3IgOTk5OTk5OTk5ICA0NDQ0NDQ0NDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjMxIHhvciA5OTk5OTk5OTkgIDY2NjY2NjY2NiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyMzIgeG9yIDk5OTk5OTk5OSAgODg4ODg4ODg4ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCitkZHhvcjI0MCB4b3IgIDU2NzQ2ODY4OSAtOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjQxIHhvciAgNTY3MzY3Njg5ICA5MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyNDIgeG9yIC02MzE5MTc3NzIgLTcwNjAxNDYzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI0MyB4b3IgLTc1NjI1MzI1NyAgMTM4NTc5MjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjQ0IHhvciAgODM1NTkwMTQ5ICA1Njc0MzU0MDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QKK2RkeG9yMjUwIHhvciAgMjAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjUxIHhvciAgNzAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjUyIHhvciAgODAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjUzIHhvciAgOTAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjU0IHhvciAgMjAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjU1IHhvciAgNzAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjU2IHhvciAgODAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjU3IHhvciAgOTAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjU4IHhvciAgMTAwMDAwMDAwMDAwMDAwMCAyMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjU5IHhvciAgMTAwMDAwMDAwMDAwMDAwMCA3MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjYwIHhvciAgMTAwMDAwMDAwMDAwMDAwMCA4MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjYxIHhvciAgMTAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjYyIHhvciAgMDAwMDAwMDAwMDAwMDAwMCAyMDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjYzIHhvciAgMDAwMDAwMDAwMDAwMDAwMCA3MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjY0IHhvciAgMDAwMDAwMDAwMDAwMDAwMCA4MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjY1IHhvciAgMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNELTEKK2RkeG9yMjcwIHhvciAgMDIwMDAwMTAwMDAwMDAwMCAxMDAwMTAwMDAwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjcxIHhvciAgMDcwMDAwMDEwMDAwMDAwMCAxMDAwMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjcyIHhvciAgMDgwMDAwMDAxMDAwMDAwMCAxMDAwMDAxMDAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjczIHhvciAgMDkwMDAwMDAwMTAwMDAwMCAxMDAwMDAwMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjc0IHhvciAgMTAwMDAwMDAwMDEwMDAwMCAwMjAwMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjc1IHhvciAgMTAwMDAwMDAwMDAxMDAwMCAwNzAwMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjc2IHhvciAgMTAwMDAwMDAwMDAwMTAwMCAwODAwMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjc3IHhvciAgMTAwMDAwMDAwMDAwMDEwMCAwOTAwMDAwMDAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTFNECitkZHhvcjI4MCB4b3IgIDAwMTAwMDAwMDAwMDAwMDIgMTAwMDAwMDEwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4MSB4b3IgIDAwMDEwMDAwMDAwMDAwMDcgMTAwMDAwMTAwMDAwMDAxMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4MiB4b3IgIDAwMDAxMDAwMDAwMDAwMDggMTAwMDAxMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4MyB4b3IgIDAwMDAwMTAwMDAwMDAwMDkgMTAwMDEwMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4NCB4b3IgIDEwMDAwMDEwMDAwMDAwMDAgMDAwMTAwMDAwMDAwMDAwMiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4NSB4b3IgIDEwMDAwMDAxMDAwMDAwMDAgMDAxMDAwMDAwMDAwMDAwNyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4NiB4b3IgIDEwMDAwMDAwMTAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwOCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI4NyB4b3IgIDEwMDAwMDAwMDEwMDAwMDAgMTAwMDAwMDAwMDAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorZGR4b3IyODggeG9yICAwMDEwMDAwMDIwMDAwMDAwIDEwMDAwMDEwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyODkgeG9yICAwMDAxMDAwMDcwMDAwMDAxIDEwMDAwMDAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTAgeG9yICAwMDAwMTAwMDgwMDAwMDEwIDEwMDAwMDAwMTAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTEgeG9yICAwMDAwMDEwMDkwMDAwMTAwIDEwMDAwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTIgeG9yICAxMDAwMDAxMDAwMDAxMDAwIDAwMDAwMDAwMjAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTMgeG9yICAxMDAwMDAwMTAwMDEwMDAwIDAwMDAwMDAwNzAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTQgeG9yICAxMDAwMDAwMDEwMTAwMDAwIDAwMDAwMDAwODAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTUgeG9yICAxMDAwMDAwMDAxMDAwMDAwIDAwMDAwMDAwOTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc2lnbnMKK2RkeG9yMjk2IHhvciAtMTAwMDAwMDAwMTAwMDAwMCAtMDAwMDAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjI5NyB4b3IgLTEwMDAwMDAwMDEwMDAwMDAgIDAwMDAwMDAwMTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IyOTggeG9yICAxMDAwMDAwMDAxMDAwMDAwIC0wMDAwMDAxMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMjk5IHhvciAgMTAwMDAwMDAwMTAwMDAwMCAgMDAwMDAwMDAxMTAwMDEwMCAtPiAgMTAwMDAwMDAxMDAwMDEwMAorCistLSBObWF4LCBObWluLCBOdGlueS1saWtlCitkZHhvcjMzMSB4b3IgIDIgICA5Ljk5OTk5OTk5RSsyOTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzMzIgeG9yICAzICAgMUUtMjk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzMzIHhvciAgNCAgIDEuMDAwMDAwMDBFLTI5OSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjMzNCB4b3IgIDUgICAxRS0yMDAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzMzUgeG9yICA2ICAgLTFFLTIwMCAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzM2IHhvciAgNyAgIC0xLjAwMDAwMDAwRS0yOTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjMzNyB4b3IgIDggICAtMUUtMjk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzMzggeG9yICA5ICAgLTkuOTk5OTk5OTlFKzI5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzQxIHhvciAgOS45OTk5OTk5OUUrMjk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM0MiB4b3IgIDFFLTI5OSAgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNDMgeG9yICAxLjAwMDAwMDAwRS0yOTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzQ0IHhvciAgMUUtMjA4ICAgICAgICAgICAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM0NSB4b3IgIC0xRS0yMDcgICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNDYgeG9yICAtMS4wMDAwMDAwMEUtMjk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzQ3IHhvciAgLTFFLTI5OSAgICAgICAgICAgICAgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM0OCB4b3IgIC05Ljk5OTk5OTk5RSsyOTkgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK2RkeG9yMzYxIHhvciAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM2MiB4b3IgIDFFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNjMgeG9yICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzY0IHhvciAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM2NSB4b3IgIDkuOSAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNjYgeG9yICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzcxIHhvciAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM3MiB4b3IgIDAgMUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNzMgeG9yICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yMzc0IHhvciAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjM3NSB4b3IgIDAgOS45ICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3IzNzYgeG9yICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorZGR4b3I3ODAgeG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzgxIHhvciAtSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc4MiB4b3IgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3ODMgeG9yIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzg0IHhvciAtSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc4NSB4b3IgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3ODYgeG9yIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzg3IHhvciAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc4OCB4b3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3ODkgeG9yIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzkwIHhvciAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc5MSB4b3IgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I3OTIgeG9yICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yNzkzIHhvciAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjc5NCB4b3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHhvcjgwMCB4b3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MDEgeG9yICBJbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODAyIHhvciAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgwMyB4b3IgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MDQgeG9yICBJbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODA1IHhvciAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgwNiB4b3IgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MDcgeG9yICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODA4IHhvciAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgwOSB4b3IgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MTAgeG9yIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODExIHhvciAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgxMiB4b3IgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MTMgeG9yICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODE0IHhvciAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgxNSB4b3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkZHhvcjgyMSB4b3IgIE5hTiAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MjIgeG9yICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODIzIHhvciAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgyNCB4b3IgIE5hTiAtMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MjUgeG9yICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODI2IHhvciAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgyNyB4b3IgIE5hTiAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MjggeG9yICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODI5IHhvciAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgzMCB4b3IgLUluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MzEgeG9yIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODMyIHhvciAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgzMyB4b3IgLTAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MzQgeG9yICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODM1IHhvciAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjgzNiB4b3IgIDEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4MzcgeG9yICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZGR4b3I4NDEgeG9yICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDIgeG9yICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDMgeG9yICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDQgeG9yICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDUgeG9yICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDYgeG9yICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDcgeG9yICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDggeG9yICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NDkgeG9yICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTAgeG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTEgeG9yIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTIgeG9yIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTMgeG9yIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTQgeG9yIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTUgeG9yICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTYgeG9yICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTcgeG9yICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTggeG9yICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NTkgeG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkZHhvcjg2MSB4b3IgIE5hTjEgICAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NjIgeG9yICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODYzIHhvciAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg2NCB4b3IgIE5hTjQgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NjUgeG9yICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODY2IHhvciAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg2NyB4b3IgLTEwMDAgICAgTmFOOCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NjggeG9yICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODY5IHhvciAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg3MSB4b3IgIHNOYU4xMSAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NzIgeG9yICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODczIHhvciAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg3NCB4b3IgIHNOYU4xNCAgIE5hTjE3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NzUgeG9yICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODc2IHhvciAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg3NyB4b3IgLUluZiAgICArc05hTjIwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4NzggeG9yIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODc5IHhvciAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg4MCB4b3IgIEluZiAgICAgc05hTjIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4ODEgeG9yICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODgyIHhvciAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkZHhvcjg4MyB4b3IgLXNOYU4yNyAgc05hTjI5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGR4b3I4ODQgeG9yICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RkeG9yODg1IHhvciAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RlY0RvdWJsZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZWNEb3VibGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDE3MDYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZWNEb3VibGUuZGVjVGVzdApAQCAtMCwwICsxLDY1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRlY0RvdWJsZS5kZWNUZXN0IC0tIHJ1biBhbGwgZGVjRG91YmxlIGRlY2ltYWwgYXJpdGhtZXRpYyB0ZXN0cyAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gZGVjRG91YmxlIHRlc3RzCitkZWN0ZXN0OiBkZEFicworZGVjdGVzdDogZGRBZGQKK2RlY3Rlc3Q6IGRkQW5kCitkZWN0ZXN0OiBkZEJhc2UKK2RlY3Rlc3Q6IGRkQ2Fub25pY2FsCitkZWN0ZXN0OiBkZENsYXNzCitkZWN0ZXN0OiBkZENvbXBhcmUKK2RlY3Rlc3Q6IGRkQ29tcGFyZVNpZworZGVjdGVzdDogZGRDb21wYXJlVG90YWwKK2RlY3Rlc3Q6IGRkQ29tcGFyZVRvdGFsTWFnCitkZWN0ZXN0OiBkZENvcHkKK2RlY3Rlc3Q6IGRkQ29weUFicworZGVjdGVzdDogZGRDb3B5TmVnYXRlCitkZWN0ZXN0OiBkZENvcHlTaWduCitkZWN0ZXN0OiBkZERpdmlkZQorZGVjdGVzdDogZGREaXZpZGVJbnQKK2RlY3Rlc3Q6IGRkRW5jb2RlCitkZWN0ZXN0OiBkZEZNQQorZGVjdGVzdDogZGRJbnZlcnQKK2RlY3Rlc3Q6IGRkTG9nQgorZGVjdGVzdDogZGRNYXgKK2RlY3Rlc3Q6IGRkTWF4TWFnCitkZWN0ZXN0OiBkZE1pbgorZGVjdGVzdDogZGRNaW5NYWcKK2RlY3Rlc3Q6IGRkTWludXMKK2RlY3Rlc3Q6IGRkTXVsdGlwbHkKK2RlY3Rlc3Q6IGRkTmV4dE1pbnVzCitkZWN0ZXN0OiBkZE5leHRQbHVzCitkZWN0ZXN0OiBkZE5leHRUb3dhcmQKK2RlY3Rlc3Q6IGRkT3IKK2RlY3Rlc3Q6IGRkUGx1cworZGVjdGVzdDogZGRRdWFudGl6ZQorZGVjdGVzdDogZGRSZWR1Y2UKK2RlY3Rlc3Q6IGRkUmVtYWluZGVyCitkZWN0ZXN0OiBkZFJlbWFpbmRlck5lYXIKK2RlY3Rlc3Q6IGRkUm90YXRlCitkZWN0ZXN0OiBkZFNhbWVRdWFudHVtCitkZWN0ZXN0OiBkZFNjYWxlQgorZGVjdGVzdDogZGRTaGlmdAorZGVjdGVzdDogZGRTdWJ0cmFjdAorZGVjdGVzdDogZGRUb0ludGVncmFsCitkZWN0ZXN0OiBkZFhvcgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RlY1F1YWQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGVjUXVhZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZGIxNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RlY1F1YWQuZGVjVGVzdApAQCAtMCwwICsxLDY1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRlY1F1YWQuZGVjVGVzdCAtLSBydW4gYWxsIGRlY1F1YWQgZGVjaW1hbCBhcml0aG1ldGljIHRlc3RzICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gZGVjUXVhZCB0ZXN0cworZGVjdGVzdDogZHFBYnMKK2RlY3Rlc3Q6IGRxQWRkCitkZWN0ZXN0OiBkcUFuZAorZGVjdGVzdDogZHFCYXNlCitkZWN0ZXN0OiBkcUNhbm9uaWNhbAorZGVjdGVzdDogZHFDbGFzcworZGVjdGVzdDogZHFDb21wYXJlCitkZWN0ZXN0OiBkcUNvbXBhcmVTaWcKK2RlY3Rlc3Q6IGRxQ29tcGFyZVRvdGFsCitkZWN0ZXN0OiBkcUNvbXBhcmVUb3RhbE1hZworZGVjdGVzdDogZHFDb3B5CitkZWN0ZXN0OiBkcUNvcHlBYnMKK2RlY3Rlc3Q6IGRxQ29weU5lZ2F0ZQorZGVjdGVzdDogZHFDb3B5U2lnbgorZGVjdGVzdDogZHFEaXZpZGUKK2RlY3Rlc3Q6IGRxRGl2aWRlSW50CitkZWN0ZXN0OiBkcUVuY29kZQorZGVjdGVzdDogZHFGTUEKK2RlY3Rlc3Q6IGRxSW52ZXJ0CitkZWN0ZXN0OiBkcUxvZ0IKK2RlY3Rlc3Q6IGRxTWF4CitkZWN0ZXN0OiBkcU1heE1hZworZGVjdGVzdDogZHFNaW4KK2RlY3Rlc3Q6IGRxTWluTWFnCitkZWN0ZXN0OiBkcU1pbnVzCitkZWN0ZXN0OiBkcU11bHRpcGx5CitkZWN0ZXN0OiBkcU5leHRNaW51cworZGVjdGVzdDogZHFOZXh0UGx1cworZGVjdGVzdDogZHFOZXh0VG93YXJkCitkZWN0ZXN0OiBkcU9yCitkZWN0ZXN0OiBkcVBsdXMKK2RlY3Rlc3Q6IGRxUXVhbnRpemUKK2RlY3Rlc3Q6IGRxUmVkdWNlCitkZWN0ZXN0OiBkcVJlbWFpbmRlcgorZGVjdGVzdDogZHFSZW1haW5kZXJOZWFyCitkZWN0ZXN0OiBkcVJvdGF0ZQorZGVjdGVzdDogZHFTYW1lUXVhbnR1bQorZGVjdGVzdDogZHFTY2FsZUIKK2RlY3Rlc3Q6IGRxU2hpZnQKK2RlY3Rlc3Q6IGRxU3VidHJhY3QKK2RlY3Rlc3Q6IGRxVG9JbnRlZ3JhbAorZGVjdGVzdDogZHFYb3IKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kZWNTaW5nbGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGVjU2luZ2xlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmOTdiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGVjU2luZ2xlLmRlY1Rlc3QKQEAgLTAsMCArMSwyNSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkZWNTaW5nbGUuZGVjVGVzdCAtLSBydW4gYWxsIGRlY1NpbmdsZSBkZWNpbWFsIGFyaXRobWV0aWMgdGVzdHMgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIGRlY1NpbmdsZSB0ZXN0cworZGVjdGVzdDogZHNCYXNlCitkZWN0ZXN0OiBkc0VuY29kZQorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RpdmlkZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kaXZpZGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmJiNWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kaXZpZGUuZGVjVGVzdApAQCAtMCwwICsxLDg1NCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkaXZpZGUuZGVjVGVzdCAtLSBkZWNpbWFsIGRpdmlzaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MKK2RpdngwMDEgZGl2aWRlICAxICAgICAxICAgIC0+ICAxCitkaXZ4MDAyIGRpdmlkZSAgMiAgICAgMSAgICAtPiAgMgorZGl2eDAwMyBkaXZpZGUgIDEgICAgIDIgICAgLT4gIDAuNQorZGl2eDAwNCBkaXZpZGUgIDIgICAgIDIgICAgLT4gIDEKK2RpdngwMDUgZGl2aWRlICAwICAgICAxICAgIC0+ICAwCitkaXZ4MDA2IGRpdmlkZSAgMCAgICAgMiAgICAtPiAgMAorZGl2eDAwNyBkaXZpZGUgIDEgICAgIDMgICAgLT4gIDAuMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGl2eDAwOCBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY3IEluZXhhY3QgUm91bmRlZAorZGl2eDAwOSBkaXZpZGUgIDMgICAgIDMgICAgLT4gIDEKKworZGl2eDAxMCBkaXZpZGUgIDIuNCAgIDEgICAgLT4gIDIuNAorZGl2eDAxMSBkaXZpZGUgIDIuNCAgIC0xICAgLT4gIC0yLjQKK2RpdngwMTIgZGl2aWRlICAtMi40ICAxICAgIC0+ICAtMi40CitkaXZ4MDEzIGRpdmlkZSAgLTIuNCAgLTEgICAtPiAgMi40CitkaXZ4MDE0IGRpdmlkZSAgMi40MCAgMSAgICAtPiAgMi40MAorZGl2eDAxNSBkaXZpZGUgIDIuNDAwIDEgICAgLT4gIDIuNDAwCitkaXZ4MDE2IGRpdmlkZSAgMi40ICAgMiAgICAtPiAgMS4yCitkaXZ4MDE3IGRpdmlkZSAgMi40MDAgMiAgICAtPiAgMS4yMDAKK2RpdngwMTggZGl2aWRlICAyLiAgICAyICAgIC0+ICAxCitkaXZ4MDE5IGRpdmlkZSAgMjAgICAgMjAgICAtPiAgMQorCitkaXZ4MDIwIGRpdmlkZSAgMTg3ICAgMTg3ICAgIC0+ICAxCitkaXZ4MDIxIGRpdmlkZSAgNSAgICAgMiAgICAgIC0+ICAyLjUKK2RpdngwMjIgZGl2aWRlICA1MCAgICAyMCAgICAgLT4gIDIuNQorZGl2eDAyMyBkaXZpZGUgIDUwMCAgIDIwMCAgICAtPiAgMi41CitkaXZ4MDI0IGRpdmlkZSAgNTAuMCAgMjAuMCAgIC0+ICAyLjUKK2RpdngwMjUgZGl2aWRlICA1LjAwICAyLjAwICAgLT4gIDIuNQorZGl2eDAyNiBkaXZpZGUgIDUgICAgIDIuMCAgICAtPiAgMi41CitkaXZ4MDI3IGRpdmlkZSAgNSAgICAgMi4wMDAgIC0+ICAyLjUKK2RpdngwMjggZGl2aWRlICA1ICAgICAwLjIwICAgLT4gIDI1CitkaXZ4MDI5IGRpdmlkZSAgNSAgICAgMC4yMDAgIC0+ICAyNQorZGl2eDAzMCBkaXZpZGUgIDEwICAgIDEgICAgICAtPiAgMTAKK2RpdngwMzEgZGl2aWRlICAxMDAgICAxICAgICAgLT4gIDEwMAorZGl2eDAzMiBkaXZpZGUgIDEwMDAgIDEgICAgICAtPiAgMTAwMAorZGl2eDAzMyBkaXZpZGUgIDEwMDAgIDEwMCAgICAtPiAgMTAKKworZGl2eDAzNSBkaXZpZGUgIDEgICAgIDIgICAgICAtPiAgMC41CitkaXZ4MDM2IGRpdmlkZSAgMSAgICAgNCAgICAgIC0+ICAwLjI1CitkaXZ4MDM3IGRpdmlkZSAgMSAgICAgOCAgICAgIC0+ICAwLjEyNQorZGl2eDAzOCBkaXZpZGUgIDEgICAgIDE2ICAgICAtPiAgMC4wNjI1CitkaXZ4MDM5IGRpdmlkZSAgMSAgICAgMzIgICAgIC0+ICAwLjAzMTI1CitkaXZ4MDQwIGRpdmlkZSAgMSAgICAgNjQgICAgIC0+ICAwLjAxNTYyNQorZGl2eDA0MSBkaXZpZGUgIDEgICAgLTIgICAgICAtPiAgLTAuNQorZGl2eDA0MiBkaXZpZGUgIDEgICAgLTQgICAgICAtPiAgLTAuMjUKK2RpdngwNDMgZGl2aWRlICAxICAgIC04ICAgICAgLT4gIC0wLjEyNQorZGl2eDA0NCBkaXZpZGUgIDEgICAgLTE2ICAgICAtPiAgLTAuMDYyNQorZGl2eDA0NSBkaXZpZGUgIDEgICAgLTMyICAgICAtPiAgLTAuMDMxMjUKK2RpdngwNDYgZGl2aWRlICAxICAgIC02NCAgICAgLT4gIC0wLjAxNTYyNQorZGl2eDA0NyBkaXZpZGUgLTEgICAgIDIgICAgICAtPiAgLTAuNQorZGl2eDA0OCBkaXZpZGUgLTEgICAgIDQgICAgICAtPiAgLTAuMjUKK2RpdngwNDkgZGl2aWRlIC0xICAgICA4ICAgICAgLT4gIC0wLjEyNQorZGl2eDA1MCBkaXZpZGUgLTEgICAgIDE2ICAgICAtPiAgLTAuMDYyNQorZGl2eDA1MSBkaXZpZGUgLTEgICAgIDMyICAgICAtPiAgLTAuMDMxMjUKK2RpdngwNTIgZGl2aWRlIC0xICAgICA2NCAgICAgLT4gIC0wLjAxNTYyNQorZGl2eDA1MyBkaXZpZGUgLTEgICAgLTIgICAgICAtPiAgMC41CitkaXZ4MDU0IGRpdmlkZSAtMSAgICAtNCAgICAgIC0+ICAwLjI1CitkaXZ4MDU1IGRpdmlkZSAtMSAgICAtOCAgICAgIC0+ICAwLjEyNQorZGl2eDA1NiBkaXZpZGUgLTEgICAgLTE2ICAgICAtPiAgMC4wNjI1CitkaXZ4MDU3IGRpdmlkZSAtMSAgICAtMzIgICAgIC0+ICAwLjAzMTI1CitkaXZ4MDU4IGRpdmlkZSAtMSAgICAtNjQgICAgIC0+ICAwLjAxNTYyNQorCitkaXZ4MDcwIGRpdmlkZSAgOTk5OTk5OTk5ICAgICAgICAxICAgIC0+ICA5OTk5OTk5OTkKK2RpdngwNzEgZGl2aWRlICA5OTk5OTk5OTkuNCAgICAgIDEgICAgLT4gIDk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RpdngwNzIgZGl2aWRlICA5OTk5OTk5OTkuNSAgICAgIDEgICAgLT4gIDEuMDAwMDAwMDBFKzkgSW5leGFjdCBSb3VuZGVkCitkaXZ4MDczIGRpdmlkZSAgOTk5OTk5OTk5LjkgICAgICAxICAgIC0+ICAxLjAwMDAwMDAwRSs5IEluZXhhY3QgUm91bmRlZAorZGl2eDA3NCBkaXZpZGUgIDk5OTk5OTk5OS45OTkgICAgMSAgICAtPiAgMS4wMDAwMDAwMEUrOSBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNgorZGl2eDA4MCBkaXZpZGUgIDk5OTk5OTk5OSAgICAgMSAgLT4gIDEuMDAwMDBFKzkgSW5leGFjdCBSb3VuZGVkCitkaXZ4MDgxIGRpdmlkZSAgOTk5OTk5OTkgICAgICAxICAtPiAgMS4wMDAwMEUrOCBJbmV4YWN0IFJvdW5kZWQKK2RpdngwODIgZGl2aWRlICA5OTk5OTk5ICAgICAgIDEgIC0+ICAxLjAwMDAwRSs3IEluZXhhY3QgUm91bmRlZAorZGl2eDA4MyBkaXZpZGUgIDk5OTk5OSAgICAgICAgMSAgLT4gIDk5OTk5OQorZGl2eDA4NCBkaXZpZGUgIDk5OTk5ICAgICAgICAgMSAgLT4gIDk5OTk5CitkaXZ4MDg1IGRpdmlkZSAgOTk5OSAgICAgICAgICAxICAtPiAgOTk5OQorZGl2eDA4NiBkaXZpZGUgIDk5OSAgICAgICAgICAgMSAgLT4gIDk5OQorZGl2eDA4NyBkaXZpZGUgIDk5ICAgICAgICAgICAgMSAgLT4gIDk5CitkaXZ4MDg4IGRpdmlkZSAgOSAgICAgICAgICAgICAxICAtPiAgOQorCitwcmVjaXNpb246IDkKK2RpdngwOTAgZGl2aWRlICAwLiAgICAgICAgICAgIDEgICAgLT4gIDAKK2RpdngwOTEgZGl2aWRlICAuMCAgICAgICAgICAgIDEgICAgLT4gIDAuMAorZGl2eDA5MiBkaXZpZGUgIDAuMDAgICAgICAgICAgMSAgICAtPiAgMC4wMAorZGl2eDA5MyBkaXZpZGUgIDAuMDBFKzkgICAgICAgMSAgICAtPiAgMEUrNworZGl2eDA5NCBkaXZpZGUgIDAuMDAwMEUtNTAgICAgMSAgICAtPiAgMEUtNTQKKworZGl2eDA5NSBkaXZpZGUgIDEgICAgICAgICAgICAxRS04ICAtPiAgMUUrOAorZGl2eDA5NiBkaXZpZGUgIDEgICAgICAgICAgICAxRS05ICAtPiAgMUUrOQorZGl2eDA5NyBkaXZpZGUgIDEgICAgICAgICAgICAxRS0xMCAtPiAgMUUrMTAKK2RpdngwOTggZGl2aWRlICAxICAgICAgICAgICAgMUUtMTEgLT4gIDFFKzExCitkaXZ4MDk5IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTEyIC0+ICAxRSsxMgorCitkaXZ4MTAwIGRpdmlkZSAgMSAgMSAgIC0+IDEKK2RpdngxMDEgZGl2aWRlICAxICAyICAgLT4gMC41CitkaXZ4MTAyIGRpdmlkZSAgMSAgMyAgIC0+IDAuMzMzMzMzMzMzIEluZXhhY3QgUm91bmRlZAorZGl2eDEwMyBkaXZpZGUgIDEgIDQgICAtPiAwLjI1CitkaXZ4MTA0IGRpdmlkZSAgMSAgNSAgIC0+IDAuMgorZGl2eDEwNSBkaXZpZGUgIDEgIDYgICAtPiAwLjE2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RpdngxMDYgZGl2aWRlICAxICA3ICAgLT4gMC4xNDI4NTcxNDMgSW5leGFjdCBSb3VuZGVkCitkaXZ4MTA3IGRpdmlkZSAgMSAgOCAgIC0+IDAuMTI1CitkaXZ4MTA4IGRpdmlkZSAgMSAgOSAgIC0+IDAuMTExMTExMTExIEluZXhhY3QgUm91bmRlZAorZGl2eDEwOSBkaXZpZGUgIDEgIDEwICAtPiAwLjEKK2RpdngxMTAgZGl2aWRlICAxICAxICAgLT4gMQorZGl2eDExMSBkaXZpZGUgIDIgIDEgICAtPiAyCitkaXZ4MTEyIGRpdmlkZSAgMyAgMSAgIC0+IDMKK2RpdngxMTMgZGl2aWRlICA0ICAxICAgLT4gNAorZGl2eDExNCBkaXZpZGUgIDUgIDEgICAtPiA1CitkaXZ4MTE1IGRpdmlkZSAgNiAgMSAgIC0+IDYKK2RpdngxMTYgZGl2aWRlICA3ICAxICAgLT4gNworZGl2eDExNyBkaXZpZGUgIDggIDEgICAtPiA4CitkaXZ4MTE4IGRpdmlkZSAgOSAgMSAgIC0+IDkKK2RpdngxMTkgZGl2aWRlICAxMCAxICAgLT4gMTAKKworZGl2eDEyMCBkaXZpZGUgIDNFKzEgMC4wMDEgIC0+IDNFKzQKK2RpdngxMjEgZGl2aWRlICAyLjIwMCAyICAgICAtPiAxLjEwMAorCitkaXZ4MTMwIGRpdmlkZSAgMTIzNDUgIDQuOTk5ICAtPiAgMjQ2OS40OTM5MCBJbmV4YWN0IFJvdW5kZWQKK2RpdngxMzEgZGl2aWRlICAxMjM0NSAgNC45OSAgIC0+ICAyNDczLjk0NzkwIEluZXhhY3QgUm91bmRlZAorZGl2eDEzMiBkaXZpZGUgIDEyMzQ1ICA0LjkgICAgLT4gIDI1MTkuMzg3NzYgSW5leGFjdCBSb3VuZGVkCitkaXZ4MTMzIGRpdmlkZSAgMTIzNDUgIDUgICAgICAtPiAgMjQ2OQorZGl2eDEzNCBkaXZpZGUgIDEyMzQ1ICA1LjEgICAgLT4gIDI0MjAuNTg4MjQgSW5leGFjdCBSb3VuZGVkCitkaXZ4MTM1IGRpdmlkZSAgMTIzNDUgIDUuMDEgICAtPiAgMjQ2NC4wNzE4NiBJbmV4YWN0IFJvdW5kZWQKK2RpdngxMzYgZGl2aWRlICAxMjM0NSAgNS4wMDEgIC0+ICAyNDY4LjUwNjMwIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246ICAgOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKKworLS0gdGVzdCBwb3NzaWJseSBpbXByZWNpc2UgcmVzdWx0cworZGl2eDIyMCBkaXZpZGUgMzkxICAgNTk3IC0+ICAwLjY1NDk0MTM3NCBJbmV4YWN0IFJvdW5kZWQKK2RpdngyMjEgZGl2aWRlIDM5MSAgLTU5NyAtPiAtMC42NTQ5NDEzNzQgSW5leGFjdCBSb3VuZGVkCitkaXZ4MjIyIGRpdmlkZSAtMzkxICA1OTcgLT4gLTAuNjU0OTQxMzc0IEluZXhhY3QgUm91bmRlZAorZGl2eDIyMyBkaXZpZGUgLTM5MSAtNTk3IC0+ICAwLjY1NDk0MTM3NCBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorZGl2eDI3MCBkaXZpZGUgMSAxZTk5OTk5OTk5OSAgICAtPiAxRS05OTk5OTk5OTkKK2RpdngyNzEgZGl2aWRlIDEgMC45ZTk5OTk5OTk5OSAgLT4gMS4xMTExMTExMUUtOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZGl2eDI3MiBkaXZpZGUgMSAwLjk5ZTk5OTk5OTk5OSAtPiAxLjAxMDEwMTAxRS05OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkaXZ4MjczIGRpdmlkZSAxIDAuOTk5OTk5OTk5ZTk5OTk5OTk5OSAtPiAxLjAwMDAwMDAwRS05OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkaXZ4Mjc0IGRpdmlkZSA5ZTk5OTk5OTk5OSAgICAxIC0+IDlFKzk5OTk5OTk5OQorZGl2eDI3NSBkaXZpZGUgOS45ZTk5OTk5OTk5OSAgMSAtPiA5LjlFKzk5OTk5OTk5OQorZGl2eDI3NiBkaXZpZGUgOS45OWU5OTk5OTk5OTkgMSAtPiA5Ljk5RSs5OTk5OTk5OTkKK2RpdngyNzcgZGl2aWRlIDkuOTk5OTk5OTllOTk5OTk5OTk5IDEgLT4gOS45OTk5OTk5OUUrOTk5OTk5OTk5CisKK2RpdngyODAgZGl2aWRlIDAuMSA5ZS05OTk5OTk5OTkgICAtPiAxLjExMTExMTExRSs5OTk5OTk5OTcgSW5leGFjdCBSb3VuZGVkCitkaXZ4MjgxIGRpdmlkZSAwLjEgOTllLTk5OTk5OTk5OSAgLT4gMS4wMTAxMDEwMUUrOTk5OTk5OTk2IEluZXhhY3QgUm91bmRlZAorZGl2eDI4MiBkaXZpZGUgMC4xIDk5OWUtOTk5OTk5OTk5IC0+IDEuMDAxMDAxMDBFKzk5OTk5OTk5NSBJbmV4YWN0IFJvdW5kZWQKKworZGl2eDI4MyBkaXZpZGUgMC4xIDllLTk5OTk5OTk5OCAgICAgLT4gMS4xMTExMTExMUUrOTk5OTk5OTk2IEluZXhhY3QgUm91bmRlZAorZGl2eDI4NCBkaXZpZGUgMC4xIDk5ZS05OTk5OTk5OTggICAgLT4gMS4wMTAxMDEwMUUrOTk5OTk5OTk1IEluZXhhY3QgUm91bmRlZAorZGl2eDI4NSBkaXZpZGUgMC4xIDk5OWUtOTk5OTk5OTk4ICAgLT4gMS4wMDEwMDEwMEUrOTk5OTk5OTk0IEluZXhhY3QgUm91bmRlZAorZGl2eDI4NiBkaXZpZGUgMC4xIDk5OWUtOTk5OTk5OTk3ICAgLT4gMS4wMDEwMDEwMEUrOTk5OTk5OTkzIEluZXhhY3QgUm91bmRlZAorZGl2eDI4NyBkaXZpZGUgMC4xIDk5OTllLTk5OTk5OTk5NyAgLT4gMS4wMDAxMDAwMUUrOTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZGl2eDI4OCBkaXZpZGUgMC4xIDk5OTk5ZS05OTk5OTk5OTcgLT4gMS4wMDAwMTAwMEUrOTk5OTk5OTkxIEluZXhhY3QgUm91bmRlZAorCistLSBEaXZpZGUgaW50byAwIHRlc3RzCisKK2RpdngzMDEgZGl2aWRlICAgIDAgICAgNyAgICAgLT4gMAorZGl2eDMwMiBkaXZpZGUgICAgMCAgICA3RS01ICAtPiAwRSs1CitkaXZ4MzAzIGRpdmlkZSAgICAwICAgIDdFLTEgIC0+IDBFKzEKK2RpdngzMDQgZGl2aWRlICAgIDAgICAgN0UrMSAgLT4gMC4wCitkaXZ4MzA1IGRpdmlkZSAgICAwICAgIDdFKzUgIC0+IDAuMDAwMDAKK2RpdngzMDYgZGl2aWRlICAgIDAgICAgN0UrNiAgLT4gMC4wMDAwMDAKK2RpdngzMDcgZGl2aWRlICAgIDAgICAgN0UrNyAgLT4gMEUtNworZGl2eDMwOCBkaXZpZGUgICAgMCAgIDcwRS01ICAtPiAwRSs1CitkaXZ4MzA5IGRpdmlkZSAgICAwICAgNzBFLTEgIC0+IDBFKzEKK2RpdngzMTAgZGl2aWRlICAgIDAgICA3MEUrMCAgLT4gMAorZGl2eDMxMSBkaXZpZGUgICAgMCAgIDcwRSsxICAtPiAwLjAKK2RpdngzMTIgZGl2aWRlICAgIDAgICA3MEUrNSAgLT4gMC4wMDAwMAorZGl2eDMxMyBkaXZpZGUgICAgMCAgIDcwRSs2ICAtPiAwLjAwMDAwMAorZGl2eDMxNCBkaXZpZGUgICAgMCAgIDcwRSs3ICAtPiAwRS03CitkaXZ4MzE1IGRpdmlkZSAgICAwICA3MDBFLTUgIC0+IDBFKzUKK2RpdngzMTYgZGl2aWRlICAgIDAgIDcwMEUtMSAgLT4gMEUrMQorZGl2eDMxNyBkaXZpZGUgICAgMCAgNzAwRSswICAtPiAwCitkaXZ4MzE4IGRpdmlkZSAgICAwICA3MDBFKzEgIC0+IDAuMAorZGl2eDMxOSBkaXZpZGUgICAgMCAgNzAwRSs1ICAtPiAwLjAwMDAwCitkaXZ4MzIwIGRpdmlkZSAgICAwICA3MDBFKzYgIC0+IDAuMDAwMDAwCitkaXZ4MzIxIGRpdmlkZSAgICAwICA3MDBFKzcgIC0+IDBFLTcKK2RpdngzMjIgZGl2aWRlICAgIDAgIDcwMEUrNzcgLT4gMEUtNzcKKworZGl2eDMzMSBkaXZpZGUgMEUtMyAgICA3RS01ICAtPiAwRSsyCitkaXZ4MzMyIGRpdmlkZSAwRS0zICAgIDdFLTEgIC0+IDAuMDAKK2RpdngzMzMgZGl2aWRlIDBFLTMgICAgN0UrMSAgLT4gMC4wMDAwCitkaXZ4MzM0IGRpdmlkZSAwRS0zICAgIDdFKzUgIC0+IDBFLTgKK2RpdngzMzUgZGl2aWRlIDBFLTEgICAgN0UtNSAgLT4gMEUrNAorZGl2eDMzNiBkaXZpZGUgMEUtMSAgICA3RS0xICAtPiAwCitkaXZ4MzM3IGRpdmlkZSAwRS0xICAgIDdFKzEgIC0+IDAuMDAKK2RpdngzMzggZGl2aWRlIDBFLTEgICAgN0UrNSAgLT4gMC4wMDAwMDAKK2RpdngzMzkgZGl2aWRlIDBFKzEgICAgN0UtNSAgLT4gMEUrNgorZGl2eDM0MCBkaXZpZGUgMEUrMSAgICA3RS0xICAtPiAwRSsyCitkaXZ4MzQxIGRpdmlkZSAwRSsxICAgIDdFKzEgIC0+IDAKK2RpdngzNDIgZGl2aWRlIDBFKzEgICAgN0UrNSAgLT4gMC4wMDAwCitkaXZ4MzQzIGRpdmlkZSAwRSszICAgIDdFLTUgIC0+IDBFKzgKK2RpdngzNDQgZGl2aWRlIDBFKzMgICAgN0UtMSAgLT4gMEUrNAorZGl2eDM0NSBkaXZpZGUgMEUrMyAgICA3RSsxICAtPiAwRSsyCitkaXZ4MzQ2IGRpdmlkZSAwRSszICAgIDdFKzUgIC0+IDAuMDAKKworbWF4ZXhwb25lbnQ6IDkyCittaW5leHBvbmVudDogLTkyCitwcmVjaXNpb246ICAgIDcKK2RpdngzNTEgZGl2aWRlIDBFLTkyICAgN0UtMSAgLT4gMEUtOTEKK2RpdngzNTIgZGl2aWRlIDBFLTkyICAgN0UrMSAgLT4gMEUtOTMKK2RpdngzNTMgZGl2aWRlIDBFLTkyICAgN0UrNSAgLT4gMEUtOTcKK2RpdngzNTQgZGl2aWRlIDBFLTkyICAgN0UrNiAgLT4gMEUtOTgKK2RpdngzNTUgZGl2aWRlIDBFLTkyICAgN0UrNyAgLT4gMEUtOTggQ2xhbXBlZAorZGl2eDM1NiBkaXZpZGUgMEUtOTIgNzc3RS0xICAtPiAwRS05MQorZGl2eDM1NyBkaXZpZGUgMEUtOTIgNzc3RSsxICAtPiAwRS05MworZGl2eDM1OCBkaXZpZGUgMEUtOTIgNzc3RSszICAtPiAwRS05NQorZGl2eDM1OSBkaXZpZGUgMEUtOTIgNzc3RSs0ICAtPiAwRS05NgorZGl2eDM2MCBkaXZpZGUgMEUtOTIgNzc3RSs1ICAtPiAwRS05NworZGl2eDM2MSBkaXZpZGUgMEUtOTIgNzc3RSs2ICAtPiAwRS05OAorZGl2eDM2MiBkaXZpZGUgMEUtOTIgNzc3RSs3ICAtPiAwRS05OCBDbGFtcGVkCitkaXZ4MzYzIGRpdmlkZSAwRS05MiAgIDdFKzkyIC0+IDBFLTk4IENsYW1wZWQKKworZGl2eDM3MSBkaXZpZGUgMEUtOTIgNzAwRS0xICAtPiAwRS05MQorZGl2eDM3MiBkaXZpZGUgMEUtOTIgNzAwRSsxICAtPiAwRS05MworZGl2eDM3MyBkaXZpZGUgMEUtOTIgNzAwRSszICAtPiAwRS05NQorZGl2eDM3NCBkaXZpZGUgMEUtOTIgNzAwRSs0ICAtPiAwRS05NgorZGl2eDM3NSBkaXZpZGUgMEUtOTIgNzAwRSs1ICAtPiAwRS05NworZGl2eDM3NiBkaXZpZGUgMEUtOTIgNzAwRSs2ICAtPiAwRS05OAorZGl2eDM3NyBkaXZpZGUgMEUtOTIgNzAwRSs3ICAtPiAwRS05OCBDbGFtcGVkCisKK2RpdngzODEgZGl2aWRlIDBFKzkyICAgN0UrMSAgLT4gMEUrOTEKK2RpdngzODIgZGl2aWRlIDBFKzkyICAgN0UrMCAgLT4gMEUrOTIKK2RpdngzODMgZGl2aWRlIDBFKzkyICAgN0UtMSAgLT4gMEUrOTIgQ2xhbXBlZAorZGl2eDM4NCBkaXZpZGUgMEUrOTAgNzc3RSsxICAtPiAwRSs4OQorZGl2eDM4NSBkaXZpZGUgMEUrOTAgNzc3RS0xICAtPiAwRSs5MQorZGl2eDM4NiBkaXZpZGUgMEUrOTAgNzc3RS0yICAtPiAwRSs5MgorZGl2eDM4NyBkaXZpZGUgMEUrOTAgNzc3RS0zICAtPiAwRSs5MiBDbGFtcGVkCitkaXZ4Mzg4IGRpdmlkZSAwRSs5MCA3NzdFLTQgIC0+IDBFKzkyIENsYW1wZWQKKworZGl2eDM5MSBkaXZpZGUgMEUrOTAgNzAwRSsxICAtPiAwRSs4OQorZGl2eDM5MiBkaXZpZGUgMEUrOTAgNzAwRS0xICAtPiAwRSs5MQorZGl2eDM5MyBkaXZpZGUgMEUrOTAgNzAwRS0yICAtPiAwRSs5MgorZGl2eDM5NCBkaXZpZGUgMEUrOTAgNzAwRS0zICAtPiAwRSs5MiBDbGFtcGVkCitkaXZ4Mzk1IGRpdmlkZSAwRSs5MCA3MDBFLTQgIC0+IDBFKzkyIENsYW1wZWQKKworLS0gaW5wdXQgcm91bmRpbmcgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CitkaXZ4NDAxIGRpdmlkZSAxMjM0NTY3ODAwMCAxIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK2Rpdng0MDIgZGl2aWRlIDEgMTIzNDU2NzgwMDAgLT4gOC4xMDAwMDA2NkUtMTEgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDAzIGRpdmlkZSAxMjM0NTY3ODAwICAxIC0+IDEuMjM0NTY3ODBFKzkgIFJvdW5kZWQKK2Rpdng0MDQgZGl2aWRlIDEgMTIzNDU2NzgwMCAgLT4gOC4xMDAwMDA2NkUtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDA1IGRpdmlkZSAxMjM0NTY3ODkwICAxIC0+IDEuMjM0NTY3ODlFKzkgIFJvdW5kZWQKK2Rpdng0MDYgZGl2aWRlIDEgMTIzNDU2Nzg5MCAgLT4gOC4xMDAwMDAwN0UtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDA3IGRpdmlkZSAxMjM0NTY3ODkxICAxIC0+IDEuMjM0NTY3ODlFKzkgIEluZXhhY3QgUm91bmRlZAorZGl2eDQwOCBkaXZpZGUgMSAxMjM0NTY3ODkxICAtPiA4LjEwMDAwMDA3RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MDkgZGl2aWRlIDEyMzQ1Njc4OTAxIDEgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDEwIGRpdmlkZSAxIDEyMzQ1Njc4OTAxIC0+IDguMTAwMDAwMDdFLTExIEluZXhhY3QgUm91bmRlZAorZGl2eDQxMSBkaXZpZGUgMTIzNDU2Nzg5NiAgMSAtPiAxLjIzNDU2NzkwRSs5ICBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MTIgZGl2aWRlIDEgMTIzNDU2Nzg5NiAgLT4gOC4xMDAwMDAwM0UtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDEzIGRpdmlkZSAxIDEyMzQ1Njc4OTcgIC0+IDguMTAwMDAwMDNFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQxNCBkaXZpZGUgMSAxMjM0NTY3ODk4ICAtPiA4LjEwMDAwMDAyRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MTUgZGl2aWRlIDEgMTIzNDU2Nzg5OSAgLT4gOC4xMDAwMDAwMUUtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDE2IGRpdmlkZSAxIDEyMzQ1Njc5MDAgIC0+IDguMTAwMDAwMDFFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQxNyBkaXZpZGUgMSAxMjM0NTY3OTAxICAtPiA4LjEwMDAwMDAwRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MTggZGl2aWRlIDEgMTIzNDU2NzkwMiAgLT4gOC4wOTk5OTk5OUUtMTAgSW5leGFjdCBSb3VuZGVkCistLSBzb21lIGxvbmdpZXMKK2Rpdng0MjEgZGl2aWRlIDEyMzQ1Njc4OTYuMDAwMDAwMDAwMDAwICAxIC0+IDEuMjM0NTY3OTBFKzkgIEluZXhhY3QgUm91bmRlZAorZGl2eDQyMiBkaXZpZGUgMSAxMjM0NTY3ODk2LjAwMDAwMDAwMDAwMCAgLT4gOC4xMDAwMDAwM0UtMTAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDIzIGRpdmlkZSAxMjM0NTY3ODk2LjAwMDAwMDAwMDAwMSAgMSAtPiAxLjIzNDU2NzkwRSs5ICBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MjQgZGl2aWRlIDEgMTIzNDU2Nzg5Ni4wMDAwMDAwMDAwMDEgIC0+IDguMTAwMDAwMDNFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQyNSBkaXZpZGUgMTIzNDU2Nzg5Ni4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgIDEgLT4gMS4yMzQ1Njc5MEUrOSAgSW5leGFjdCBSb3VuZGVkCitkaXZ4NDI2IGRpdmlkZSAxIDEyMzQ1Njc4OTYuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAtPiA4LjEwMDAwMDAzRS0xMCBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0MjcgZGl2aWRlIDEyMzQ1Njc4OTcuOTAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAxIC0+IDEuMjM0NTY3OTBFKzkgIEluZXhhY3QgUm91bmRlZAorZGl2eDQyOCBkaXZpZGUgMSAxMjM0NTY3ODk3LjkwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgLT4gOC4xMDAwMDAwMkUtMTAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMTUKKy0tIHN0aWxsIGNoZWNraW5nLi4uCitkaXZ4NDQxIGRpdmlkZSAxMjM0NTY3ODAwMCAxIC0+IDEyMzQ1Njc4MDAwCitkaXZ4NDQyIGRpdmlkZSAxIDEyMzQ1Njc4MDAwIC0+IDguMTAwMDAwNjY0MjAwMDVFLTExIEluZXhhY3QgUm91bmRlZAorZGl2eDQ0MyBkaXZpZGUgMTIzNDU2NzgwMCAgMSAtPiAxMjM0NTY3ODAwCitkaXZ4NDQ0IGRpdmlkZSAxIDEyMzQ1Njc4MDAgIC0+IDguMTAwMDAwNjY0MjAwMDVFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQ0NSBkaXZpZGUgMTIzNDU2Nzg5MCAgMSAtPiAxMjM0NTY3ODkwCitkaXZ4NDQ2IGRpdmlkZSAxIDEyMzQ1Njc4OTAgIC0+IDguMTAwMDAwMDczNzEwMDBFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQ0NyBkaXZpZGUgMTIzNDU2Nzg5MSAgMSAtPiAxMjM0NTY3ODkxCitkaXZ4NDQ4IGRpdmlkZSAxIDEyMzQ1Njc4OTEgIC0+IDguMTAwMDAwMDY3MTQ5MDBFLTEwIEluZXhhY3QgUm91bmRlZAorZGl2eDQ0OSBkaXZpZGUgMTIzNDU2Nzg5MDEgMSAtPiAxMjM0NTY3ODkwMQorZGl2eDQ1MCBkaXZpZGUgMSAxMjM0NTY3ODkwMSAtPiA4LjEwMDAwMDA3MzA1MzkwRS0xMSBJbmV4YWN0IFJvdW5kZWQKK2Rpdng0NTEgZGl2aWRlIDEyMzQ1Njc4OTYgIDEgLT4gMTIzNDU2Nzg5NgorZGl2eDQ1MiBkaXZpZGUgMSAxMjM0NTY3ODk2ICAtPiA4LjEwMDAwMDAzNDM0NDAwRS0xMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gaGlnaC1sb3dzCitkaXZ4NDUzIGRpdmlkZSAxZSsxICAgMSAgICAtPiAgIDFFKzEKK2Rpdng0NTQgZGl2aWRlIDFlKzEgICAxLjAgIC0+ICAgMUUrMQorZGl2eDQ1NSBkaXZpZGUgMWUrMSAgIDEuMDAgLT4gICAxRSsxCitkaXZ4NDU2IGRpdmlkZSAxZSsyICAgMiAgICAtPiAgIDVFKzEKK2Rpdng0NTcgZGl2aWRlIDFlKzIgICAyLjAgIC0+ICAgNUUrMQorZGl2eDQ1OCBkaXZpZGUgMWUrMiAgIDIuMDAgLT4gICA1RSsxCisKKy0tIHNvbWUgZnJvbSBJRUVFIGRpc2N1c3Npb25zCitkaXZ4NDYwIGRpdmlkZSAzZTAgICAgICAyZTAgICAgIC0+IDEuNQorZGl2eDQ2MSBkaXZpZGUgMzBlLTEgICAgMmUwICAgICAtPiAxLjUKK2Rpdng0NjIgZGl2aWRlIDMwMGUtMiAgIDJlMCAgICAgLT4gMS41MAorZGl2eDQ2NCBkaXZpZGUgMzAwMGUtMyAgMmUwICAgICAtPiAxLjUwMAorZGl2eDQ2NSBkaXZpZGUgM2UwICAgICAgMjBlLTEgICAtPiAxLjUKK2Rpdng0NjYgZGl2aWRlIDMwZS0xICAgIDIwZS0xICAgLT4gMS41CitkaXZ4NDY3IGRpdmlkZSAzMDBlLTIgICAyMGUtMSAgIC0+IDEuNQorZGl2eDQ2OCBkaXZpZGUgMzAwMGUtMyAgMjBlLTEgICAtPiAxLjUwCitkaXZ4NDY5IGRpdmlkZSAzZTAgICAgICAyMDBlLTIgIC0+IDEuNQorZGl2eDQ3MCBkaXZpZGUgMzBlLTEgICAgMjAwZS0yICAtPiAxLjUKK2Rpdng0NzEgZGl2aWRlIDMwMGUtMiAgIDIwMGUtMiAgLT4gMS41CitkaXZ4NDcyIGRpdmlkZSAzMDAwZS0zICAyMDBlLTIgIC0+IDEuNQorZGl2eDQ3MyBkaXZpZGUgM2UwICAgICAgMjAwMGUtMyAtPiAxLjUKK2Rpdng0NzQgZGl2aWRlIDMwZS0xICAgIDIwMDBlLTMgLT4gMS41CitkaXZ4NDc1IGRpdmlkZSAzMDBlLTIgICAyMDAwZS0zIC0+IDEuNQorZGl2eDQ3NiBkaXZpZGUgMzAwMGUtMyAgMjAwMGUtMyAtPiAxLjUKKworLS0gc29tZSByZWNpcHJvY2FscworZGl2eDQ4MCBkaXZpZGUgMSAgICAgICAgMS4wRSszMyAtPiAxRS0zMworZGl2eDQ4MSBkaXZpZGUgMSAgICAgICAgMTBFKzMzICAtPiAxRS0zNAorZGl2eDQ4MiBkaXZpZGUgMSAgICAgICAgMS4wRS0zMyAtPiAxRSszMworZGl2eDQ4MyBkaXZpZGUgMSAgICAgICAgMTBFLTMzICAtPiAxRSszMgorCistLSBSTVMgZGlzY3Vzc2lvbiB0YWJsZQorbWF4ZXhwb25lbnQ6ICA5NgorbWluZXhwb25lbnQ6IC05NQorcHJlY2lzaW9uOiAgICAgNworCitkaXZ4NDg0IGRpdmlkZSAwZTUgICAgIDFlMyAtPiAgIDBFKzIKK2Rpdng0ODUgZGl2aWRlIDBlNSAgICAgMmUzIC0+ICAgMEUrMgorZGl2eDQ4NiBkaXZpZGUgMGU1ICAgIDEwZTIgLT4gICAwRSszCitkaXZ4NDg3IGRpdmlkZSAwZTUgICAgMjBlMiAtPiAgIDBFKzMKK2Rpdng0ODggZGl2aWRlIDBlNSAgIDEwMGUxIC0+ICAgMEUrNAorZGl2eDQ4OSBkaXZpZGUgMGU1ICAgMjAwZTEgLT4gICAwRSs0CisKK2Rpdng0OTEgZGl2aWRlIDFlNSAgICAgMWUzIC0+ICAgMUUrMgorZGl2eDQ5MiBkaXZpZGUgMWU1ICAgICAyZTMgLT4gICA1RSsxCitkaXZ4NDkzIGRpdmlkZSAxZTUgICAgMTBlMiAtPiAgIDFFKzIKK2Rpdng0OTQgZGl2aWRlIDFlNSAgICAyMGUyIC0+ICAgNUUrMQorZGl2eDQ5NSBkaXZpZGUgMWU1ICAgMTAwZTEgLT4gICAxRSsyCitkaXZ4NDk2IGRpdmlkZSAxZTUgICAyMDBlMSAtPiAgIDVFKzEKKworLS0gdHJ5emVyb3MgY2FzZXMKK3ByZWNpc2lvbjogICA3Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDkyCittaW5leHBvbmVudDogLTkyCitkaXZ4NDk3ICBkaXZpZGUgIDBFKzg2IDEwMDBFLTEzICAtPiAwRSs5MiBDbGFtcGVkCitkaXZ4NDk4ICBkaXZpZGUgIDBFLTk4IDEwMDBFKzEzICAtPiAwRS05OCBDbGFtcGVkCisKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworLS0gZm9jdXMgb24gdHJhaWxpbmcgemVyb3MgaXNzdWVzCitwcmVjaXNpb246ICAgOQorZGl2eDUwMCBkaXZpZGUgIDEgICAgICA5LjkgICAgLT4gIDAuMTAxMDEwMTAxICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA4CitkaXZ4NTAxIGRpdmlkZSAgMSAgICAgIDkuOSAgICAtPiAgMC4xMDEwMTAxMCAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDcKK2Rpdng1MDIgZGl2aWRlICAxICAgICAgOS45ICAgIC0+ICAwLjEwMTAxMDEgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgNgorZGl2eDUwMyBkaXZpZGUgIDEgICAgICA5LjkgICAgLT4gIDAuMTAxMDEwICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA5CisKK2Rpdng1MTEgZGl2aWRlIDEgICAgICAgICAyICAgIC0+IDAuNQorZGl2eDUxMiBkaXZpZGUgMS4wICAgICAgIDIgICAgLT4gMC41CitkaXZ4NTEzIGRpdmlkZSAxLjAwICAgICAgMiAgICAtPiAwLjUwCitkaXZ4NTE0IGRpdmlkZSAxLjAwMCAgICAgMiAgICAtPiAwLjUwMAorZGl2eDUxNSBkaXZpZGUgMS4wMDAwICAgIDIgICAgLT4gMC41MDAwCitkaXZ4NTE2IGRpdmlkZSAxLjAwMDAwICAgMiAgICAtPiAwLjUwMDAwCitkaXZ4NTE3IGRpdmlkZSAxLjAwMDAwMCAgMiAgICAtPiAwLjUwMDAwMAorZGl2eDUxOCBkaXZpZGUgMS4wMDAwMDAwIDIgICAgLT4gMC41MDAwMDAwCitkaXZ4NTE5IGRpdmlkZSAxLjAwICAgICAgMi4wMCAtPiAwLjUKKworZGl2eDUyMSBkaXZpZGUgMiAgICAxICAgICAgICAgLT4gMgorZGl2eDUyMiBkaXZpZGUgMiAgICAxLjAgICAgICAgLT4gMgorZGl2eDUyMyBkaXZpZGUgMiAgICAxLjAwICAgICAgLT4gMgorZGl2eDUyNCBkaXZpZGUgMiAgICAxLjAwMCAgICAgLT4gMgorZGl2eDUyNSBkaXZpZGUgMiAgICAxLjAwMDAgICAgLT4gMgorZGl2eDUyNiBkaXZpZGUgMiAgICAxLjAwMDAwICAgLT4gMgorZGl2eDUyNyBkaXZpZGUgMiAgICAxLjAwMDAwMCAgLT4gMgorZGl2eDUyOCBkaXZpZGUgMiAgICAxLjAwMDAwMDAgLT4gMgorZGl2eDUyOSBkaXZpZGUgMi4wMCAxLjAwICAgICAgLT4gMgorCitkaXZ4NTMwIGRpdmlkZSAgMi40MCAgIDIgICAgICAtPiAgMS4yMAorZGl2eDUzMSBkaXZpZGUgIDIuNDAgICA0ICAgICAgLT4gIDAuNjAKK2Rpdng1MzIgZGl2aWRlICAyLjQwICAxMCAgICAgIC0+ICAwLjI0CitkaXZ4NTMzIGRpdmlkZSAgMi40MCAgIDIuMCAgICAtPiAgMS4yCitkaXZ4NTM0IGRpdmlkZSAgMi40MCAgIDQuMCAgICAtPiAgMC42CitkaXZ4NTM1IGRpdmlkZSAgMi40MCAgMTAuMCAgICAtPiAgMC4yNAorZGl2eDUzNiBkaXZpZGUgIDIuNDAgICAyLjAwICAgLT4gIDEuMgorZGl2eDUzNyBkaXZpZGUgIDIuNDAgICA0LjAwICAgLT4gIDAuNgorZGl2eDUzOCBkaXZpZGUgIDIuNDAgIDEwLjAwICAgLT4gIDAuMjQKK2Rpdng1MzkgZGl2aWRlICAwLjkgICAgMC4xICAgIC0+ICA5CitkaXZ4NTQwIGRpdmlkZSAgMC45ICAgIDAuMDEgICAtPiAgOUUrMQorZGl2eDU0MSBkaXZpZGUgIDAuOSAgICAwLjAwMSAgLT4gIDlFKzIKK2Rpdng1NDIgZGl2aWRlICA1ICAgICAgMiAgICAgIC0+ICAyLjUKK2Rpdng1NDMgZGl2aWRlICA1ICAgICAgMi4wICAgIC0+ICAyLjUKK2Rpdng1NDQgZGl2aWRlICA1ICAgICAgMi4wMCAgIC0+ICAyLjUKK2Rpdng1NDUgZGl2aWRlICA1ICAgICAgMjAgICAgIC0+ICAwLjI1CitkaXZ4NTQ2IGRpdmlkZSAgNSAgICAgIDIwLjAgICAtPiAgMC4yNQorZGl2eDU0NyBkaXZpZGUgIDIuNDAwICAyICAgICAgLT4gIDEuMjAwCitkaXZ4NTQ4IGRpdmlkZSAgMi40MDAgIDIuMCAgICAtPiAgMS4yMAorZGl2eDU0OSBkaXZpZGUgIDIuNDAwICAyLjQwMCAgLT4gIDEKKworZGl2eDU1MCBkaXZpZGUgIDI0MCAgICAxICAgICAgLT4gIDI0MAorZGl2eDU1MSBkaXZpZGUgIDI0MCAgICAxMCAgICAgLT4gIDI0CitkaXZ4NTUyIGRpdmlkZSAgMjQwICAgIDEwMCAgICAtPiAgMi40CitkaXZ4NTUzIGRpdmlkZSAgMjQwICAgIDEwMDAgICAtPiAgMC4yNAorZGl2eDU1NCBkaXZpZGUgIDI0MDAgICAxICAgICAgLT4gIDI0MDAKK2Rpdng1NTUgZGl2aWRlICAyNDAwICAgMTAgICAgIC0+ICAyNDAKK2Rpdng1NTYgZGl2aWRlICAyNDAwICAgMTAwICAgIC0+ICAyNAorZGl2eDU1NyBkaXZpZGUgIDI0MDAgICAxMDAwICAgLT4gIDIuNAorCistLSArdmUgZXhwb25lbnQKK3ByZWNpc2lvbjogNQorZGl2eDU3MCBkaXZpZGUgIDIuNEUrNiAgICAgMiAgLT4gIDEuMkUrNgorZGl2eDU3MSBkaXZpZGUgIDIuNDBFKzYgICAgMiAgLT4gIDEuMjBFKzYKK2Rpdng1NzIgZGl2aWRlICAyLjQwMEUrNiAgIDIgIC0+ICAxLjIwMEUrNgorZGl2eDU3MyBkaXZpZGUgIDIuNDAwMEUrNiAgMiAgLT4gIDEuMjAwMEUrNgorZGl2eDU3NCBkaXZpZGUgIDI0RSs1ICAgICAgMiAgLT4gIDEuMkUrNgorZGl2eDU3NSBkaXZpZGUgIDI0MEUrNCAgICAgMiAgLT4gIDEuMjBFKzYKK2Rpdng1NzYgZGl2aWRlICAyNDAwRSszICAgIDIgIC0+ICAxLjIwMEUrNgorZGl2eDU3NyBkaXZpZGUgIDI0MDAwRSsyICAgMiAgLT4gIDEuMjAwMEUrNgorcHJlY2lzaW9uOiA2CitkaXZ4NTgwIGRpdmlkZSAgMi40RSs2ICAgICAyICAtPiAgMS4yRSs2CitkaXZ4NTgxIGRpdmlkZSAgMi40MEUrNiAgICAyICAtPiAgMS4yMEUrNgorZGl2eDU4MiBkaXZpZGUgIDIuNDAwRSs2ICAgMiAgLT4gIDEuMjAwRSs2CitkaXZ4NTgzIGRpdmlkZSAgMi40MDAwRSs2ICAyICAtPiAgMS4yMDAwRSs2CitkaXZ4NTg0IGRpdmlkZSAgMjRFKzUgICAgICAyICAtPiAgMS4yRSs2CitkaXZ4NTg1IGRpdmlkZSAgMjQwRSs0ICAgICAyICAtPiAgMS4yMEUrNgorZGl2eDU4NiBkaXZpZGUgIDI0MDBFKzMgICAgMiAgLT4gIDEuMjAwRSs2CitkaXZ4NTg3IGRpdmlkZSAgMjQwMDBFKzIgICAyICAtPiAgMS4yMDAwRSs2CitwcmVjaXNpb246IDcKK2Rpdng1OTAgZGl2aWRlICAyLjRFKzYgICAgIDIgIC0+ICAxLjJFKzYKK2Rpdng1OTEgZGl2aWRlICAyLjQwRSs2ICAgIDIgIC0+ICAxLjIwRSs2CitkaXZ4NTkyIGRpdmlkZSAgMi40MDBFKzYgICAyICAtPiAgMS4yMDBFKzYKK2Rpdng1OTMgZGl2aWRlICAyLjQwMDBFKzYgIDIgIC0+ICAxLjIwMDBFKzYKK2Rpdng1OTQgZGl2aWRlICAyNEUrNSAgICAgIDIgIC0+ICAxLjJFKzYKK2Rpdng1OTUgZGl2aWRlICAyNDBFKzQgICAgIDIgIC0+ICAxLjIwRSs2CitkaXZ4NTk2IGRpdmlkZSAgMjQwMEUrMyAgICAyICAtPiAgMS4yMDBFKzYKK2Rpdng1OTcgZGl2aWRlICAyNDAwMEUrMiAgIDIgIC0+ICAxLjIwMDBFKzYKK3ByZWNpc2lvbjogICA5CitkaXZ4NjAwIGRpdmlkZSAgMi40RSs5ICAgICAyICAtPiAgMS4yRSs5CitkaXZ4NjAxIGRpdmlkZSAgMi40MEUrOSAgICAyICAtPiAgMS4yMEUrOQorZGl2eDYwMiBkaXZpZGUgIDIuNDAwRSs5ICAgMiAgLT4gIDEuMjAwRSs5CitkaXZ4NjAzIGRpdmlkZSAgMi40MDAwRSs5ICAyICAtPiAgMS4yMDAwRSs5CitkaXZ4NjA0IGRpdmlkZSAgMjRFKzggICAgICAyICAtPiAgMS4yRSs5CitkaXZ4NjA1IGRpdmlkZSAgMjQwRSs3ICAgICAyICAtPiAgMS4yMEUrOQorZGl2eDYwNiBkaXZpZGUgIDI0MDBFKzYgICAgMiAgLT4gIDEuMjAwRSs5CitkaXZ4NjA3IGRpdmlkZSAgMjQwMDBFKzUgICAyICAtPiAgMS4yMDAwRSs5CisKKy0tIGxvbmcgb3BlcmFuZCB0cmlhbmdsZQorcHJlY2lzaW9uOiAzMworZGl2eDYxMCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxMzEwOTc3MDM3OTIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMyCitkaXZ4NjExIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMTA5NzcwMzc5ICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzEKK2Rpdng2MTIgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMxMDk3NzAzOCAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMAorZGl2eDYxMyBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxMzEwOTc3MDQgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI5CitkaXZ4NjE0IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMTA5NzcwICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjgKK2Rpdng2MTUgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMxMDk3NyAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNworZGl2eDYxNiBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxMzEwOTggICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI2CitkaXZ4NjE3IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMTEwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjUKK2Rpdng2MTggZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MTMxMSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNAorZGl2eDYxOSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjgxMzEgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIzCitkaXZ4NjIwIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjIKK2Rpdng2MjEgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00MTAxMTQwODg4Mzc5NjgxNzc5Ny44MSAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMQorZGl2eDYyMiBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3LjggICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIwCitkaXZ4NjIzIGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTggICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTkKK2Rpdng2MjQgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg4ODM3OTY4MTc4MEUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTgKK2Rpdng2MjUgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg4ODM3OTY4MTc4RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNworZGl2eDYyNiBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4Mzc5NjgxOEUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTYKK2Rpdng2MjcgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg4ODM3OTY4MkUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTUKK2Rpdng2MjggZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg4ODM3OTY4RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNAorZGl2eDYyOSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4Mzc5N0UrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTMKK2Rpdng2MzAgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg4ODM4MEUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIKK2Rpdng2MzEgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg4ODM4RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMQorZGl2eDYzMiBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwODg4NEUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTAKK2Rpdng2MzMgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg4OEUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDkKK2Rpdng2MzQgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MDg5RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgOAorZGl2eDYzNSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMTQwOUUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDcKK2Rpdng2MzYgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0MUUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDYKK2Rpdng2MzcgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMTE0RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNQorZGl2eDYzOCBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMTAxMUUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDQKK2Rpdng2MzkgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwMUUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMKK2Rpdng2NDAgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00LjEwRSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMgorZGl2eDY0MSBkaXZpZGUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQuMUUrMTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEKK2Rpdng2NDIgZGl2aWRlIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC00RSsxOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworCitkaXZ4NzMxIGRpdmlkZSA1LjAwIDFFLTMgICAgLT4gNS4wMEUrMworZGl2eDczMiBkaXZpZGUgMDAuMDAgMC4wMDAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rpdng3MzMgZGl2aWRlIDAwLjAwIDBFLTMgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkaXZ4NzM0IGRpdmlkZSAgMCAgICAtMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGl2eDczNSBkaXZpZGUgLTAgICAgIDAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rpdng3MzYgZGl2aWRlIC0wICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCisKK2Rpdng3NDEgZGl2aWRlICAwICAgIC0xICAgICAtPiAtMAorZGl2eDc0MiBkaXZpZGUgLTAgICAgLTEgICAgIC0+ICAwCitkaXZ4NzQzIGRpdmlkZSAgMCAgICAgMSAgICAgLT4gIDAKK2Rpdng3NDQgZGl2aWRlIC0wICAgICAxICAgICAtPiAtMAorZGl2eDc0NSBkaXZpZGUgLTEgICAgIDAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4NzQ2IGRpdmlkZSAtMSAgICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NDcgZGl2aWRlICAxICAgICAwICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc0OCBkaXZpZGUgIDEgICAgLTAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2Rpdng3NTEgZGl2aWRlICAwLjAgIC0xICAgICAtPiAtMC4wCitkaXZ4NzUyIGRpdmlkZSAtMC4wICAtMSAgICAgLT4gIDAuMAorZGl2eDc1MyBkaXZpZGUgIDAuMCAgIDEgICAgIC0+ICAwLjAKK2Rpdng3NTQgZGl2aWRlIC0wLjAgICAxICAgICAtPiAtMC4wCitkaXZ4NzU1IGRpdmlkZSAtMS4wICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NTYgZGl2aWRlIC0xLjAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc1NyBkaXZpZGUgIDEuMCAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4NzU4IGRpdmlkZSAgMS4wICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGl2eDc2MSBkaXZpZGUgIDAgICAgLTEuMCAgIC0+IC0wRSsxCitkaXZ4NzYyIGRpdmlkZSAtMCAgICAtMS4wICAgLT4gIDBFKzEKK2Rpdng3NjMgZGl2aWRlICAwICAgICAxLjAgICAtPiAgMEUrMQorZGl2eDc2NCBkaXZpZGUgLTAgICAgIDEuMCAgIC0+IC0wRSsxCitkaXZ4NzY1IGRpdmlkZSAtMSAgICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NjYgZGl2aWRlIC0xICAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc2NyBkaXZpZGUgIDEgICAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4NzY4IGRpdmlkZSAgMSAgICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGl2eDc3MSBkaXZpZGUgIDAuMCAgLTEuMCAgIC0+IC0wCitkaXZ4NzcyIGRpdmlkZSAtMC4wICAtMS4wICAgLT4gIDAKK2Rpdng3NzMgZGl2aWRlICAwLjAgICAxLjAgICAtPiAgMAorZGl2eDc3NCBkaXZpZGUgLTAuMCAgIDEuMCAgIC0+IC0wCitkaXZ4Nzc1IGRpdmlkZSAtMS4wICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng3NzYgZGl2aWRlIC0xLjAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDc3NyBkaXZpZGUgIDEuMCAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4Nzc4IGRpdmlkZSAgMS4wICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gU3BlY2lhbHMKK2Rpdng3ODAgZGl2aWRlICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4NzgxIGRpdmlkZSAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkaXZ4NzgyIGRpdmlkZSAgSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkaXZ4NzgzIGRpdmlkZSAgSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkaXZ4Nzg0IGRpdmlkZSAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkaXZ4Nzg1IGRpdmlkZSAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkaXZ4Nzg2IGRpdmlkZSAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkaXZ4Nzg3IGRpdmlkZSAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDc4OCBkaXZpZGUgLTEwMDAgIEluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGl2eDc4OSBkaXZpZGUgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rpdng3OTAgZGl2aWRlIC0xICAgICBJbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2Rpdng3OTEgZGl2aWRlIC0wICAgICBJbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2Rpdng3OTIgZGl2aWRlICAwICAgICBJbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2Rpdng3OTMgZGl2aWRlICAxICAgICBJbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2Rpdng3OTQgZGl2aWRlICAxMDAwICBJbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2Rpdng3OTUgZGl2aWRlICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rpdng4MDAgZGl2aWRlIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODAxIGRpdmlkZSAtSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitkaXZ4ODAyIGRpdmlkZSAtSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkaXZ4ODAzIGRpdmlkZSAtSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkaXZ4ODA0IGRpdmlkZSAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkaXZ4ODA1IGRpdmlkZSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkaXZ4ODA2IGRpdmlkZSAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkaXZ4ODA3IGRpdmlkZSAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDgwOCBkaXZpZGUgLTEwMDAgIEluZiAgIC0+IC0wRS0zOTggQ2xhbXBlZAorZGl2eDgwOSBkaXZpZGUgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4MTAgZGl2aWRlIC0xICAgIC1JbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2Rpdng4MTEgZGl2aWRlIC0wICAgIC1JbmYgICAtPiAgMEUtMzk4IENsYW1wZWQKK2Rpdng4MTIgZGl2aWRlICAwICAgIC1JbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2Rpdng4MTMgZGl2aWRlICAxICAgIC1JbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2Rpdng4MTQgZGl2aWRlICAxMDAwIC1JbmYgICAtPiAtMEUtMzk4IENsYW1wZWQKK2Rpdng4MTUgZGl2aWRlICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rpdng4MjEgZGl2aWRlICBOYU4gLUluZiAgICAtPiAgTmFOCitkaXZ4ODIyIGRpdmlkZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorZGl2eDgyMyBkaXZpZGUgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2Rpdng4MjQgZGl2aWRlICBOYU4gLTAgICAgICAtPiAgTmFOCitkaXZ4ODI1IGRpdmlkZSAgTmFOICAwICAgICAgLT4gIE5hTgorZGl2eDgyNiBkaXZpZGUgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2Rpdng4MjcgZGl2aWRlICBOYU4gIDEwMDAgICAtPiAgTmFOCitkaXZ4ODI4IGRpdmlkZSAgTmFOICBJbmYgICAgLT4gIE5hTgorZGl2eDgyOSBkaXZpZGUgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2Rpdng4MzAgZGl2aWRlIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkaXZ4ODMxIGRpdmlkZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorZGl2eDgzMiBkaXZpZGUgLTEgICAgTmFOICAgIC0+ICBOYU4KK2Rpdng4MzMgZGl2aWRlIC0wICAgIE5hTiAgICAtPiAgTmFOCitkaXZ4ODM0IGRpdmlkZSAgMCAgICBOYU4gICAgLT4gIE5hTgorZGl2eDgzNSBkaXZpZGUgIDEgICAgTmFOICAgIC0+ICBOYU4KK2Rpdng4MzYgZGl2aWRlICAxMDAwIE5hTiAgICAtPiAgTmFOCitkaXZ4ODM3IGRpdmlkZSAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkaXZ4ODQxIGRpdmlkZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NDIgZGl2aWRlICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg0MyBkaXZpZGUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODQ0IGRpdmlkZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NDUgZGl2aWRlICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg0NiBkaXZpZGUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODQ3IGRpdmlkZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NDggZGl2aWRlICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg0OSBkaXZpZGUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODUwIGRpdmlkZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NTEgZGl2aWRlIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg1MiBkaXZpZGUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODUzIGRpdmlkZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NTQgZGl2aWRlIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg1NSBkaXZpZGUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODU2IGRpdmlkZSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NTcgZGl2aWRlICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZGl2eDg1OCBkaXZpZGUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkaXZ4ODU5IGRpdmlkZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZGl2eDg2MSBkaXZpZGUgIE5hTjkgLUluZiAgIC0+ICBOYU45CitkaXZ4ODYyIGRpdmlkZSAgTmFOOCAgMTAwMCAgLT4gIE5hTjgKK2Rpdng4NjMgZGl2aWRlICBOYU43ICBJbmYgICAtPiAgTmFONworZGl2eDg2NCBkaXZpZGUgIE5hTjYgIE5hTjUgIC0+ICBOYU42CitkaXZ4ODY1IGRpdmlkZSAtSW5mICAgTmFONCAgLT4gIE5hTjQKK2Rpdng4NjYgZGl2aWRlIC0xMDAwICBOYU4zICAtPiAgTmFOMworZGl2eDg2NyBkaXZpZGUgIEluZiAgIE5hTjIgIC0+ICBOYU4yCisKK2Rpdng4NzEgZGl2aWRlICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzIgZGl2aWRlICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzMgZGl2aWRlICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzQgZGl2aWRlICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzUgZGl2aWRlICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzYgZGl2aWRlIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzcgZGl2aWRlICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzggZGl2aWRlICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4NzkgZGl2aWRlICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZGl2eDg4MSBkaXZpZGUgIC1OYU45ICAtSW5mICAgLT4gIC1OYU45CitkaXZ4ODgyIGRpdmlkZSAgLU5hTjggICAxMDAwICAtPiAgLU5hTjgKK2Rpdng4ODMgZGl2aWRlICAtTmFONyAgIEluZiAgIC0+ICAtTmFONworZGl2eDg4NCBkaXZpZGUgIC1OYU42ICAtTmFONSAgLT4gIC1OYU42CitkaXZ4ODg1IGRpdmlkZSAgLUluZiAgIC1OYU40ICAtPiAgLU5hTjQKK2Rpdng4ODYgZGl2aWRlICAtMTAwMCAgLU5hTjMgIC0+ICAtTmFOMworZGl2eDg4NyBkaXZpZGUgICBJbmYgICAtTmFOMiAgLT4gIC1OYU4yCisKK2Rpdng4OTEgZGl2aWRlIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTIgZGl2aWRlIC1zTmFOOTggLTEgICAgICAtPiAtTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTMgZGl2aWRlIC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTQgZGl2aWRlIC1zTmFOOTYgLXNOYU45NCAtPiAtTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTUgZGl2aWRlIC1OYU45NSAgLXNOYU45MyAtPiAtTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTYgZGl2aWRlIC1JbmYgICAgLXNOYU45MiAtPiAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTcgZGl2aWRlICAwICAgICAgLXNOYU45MSAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTggZGl2aWRlICBJbmYgICAgLXNOYU45MCAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2Rpdng4OTkgZGl2aWRlIC1OYU4gICAgLXNOYU44OSAtPiAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKKworLS0gVmFyaW91cyBmbGF2b3VycyBvZiBkaXZpZGUgYnkgMAorZGl2eDkwMSBkaXZpZGUgICAgMCAgICAgICAwICAgLT4gIE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rpdng5MDIgZGl2aWRlICAgIDAuMEU1ICAgMCAgIC0+ICBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkaXZ4OTAzIGRpdmlkZSAgICAwLjAwMCAgIDAgICAtPiAgTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZGl2eDkwNCBkaXZpZGUgICAgMC4wMDAxICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MDUgZGl2aWRlICAgIDAuMDEgICAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTA2IGRpdmlkZSAgICAwLjEgICAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkwNyBkaXZpZGUgICAgMSAgICAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MDggZGl2aWRlICAgIDEgICAgICAgMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTA5IGRpdmlkZSAgIDEwICAgICAgIDAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkxMCBkaXZpZGUgICAxRSsxMDAgICAwLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MTEgZGl2aWRlICAgMUUrMTAwMCAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2Rpdng5MjEgZGl2aWRlICAgLTAuMDAwMSAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTIyIGRpdmlkZSAgIC0wLjAxICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkyMyBkaXZpZGUgICAtMC4xICAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MjQgZGl2aWRlICAgLTEgICAgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTI1IGRpdmlkZSAgIC0xICAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkyNiBkaXZpZGUgIC0xMCAgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MjcgZGl2aWRlICAtMUUrMTAwICAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTI4IGRpdmlkZSAgLTFFKzEwMDAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkaXZ4OTMxIGRpdmlkZSAgICAwLjAwMDEgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkzMiBkaXZpZGUgICAgMC4wMSAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MzMgZGl2aWRlICAgIDAuMSAgICAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTM0IGRpdmlkZSAgICAxICAgICAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkzNSBkaXZpZGUgICAgMSAgICAgIC0wLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5MzYgZGl2aWRlICAgMTAgICAgICAtMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTM3IGRpdmlkZSAgIDFFKzEwMCAgLTAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDkzOCBkaXZpZGUgICAxRSsxMDAwIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZGl2eDk0MSBkaXZpZGUgICAtMC4wMDAxIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5NDIgZGl2aWRlICAgLTAuMDEgICAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTQzIGRpdmlkZSAgIC0wLjEgICAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDk0NCBkaXZpZGUgICAtMSAgICAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5NDUgZGl2aWRlICAgLTEgICAgICAtMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkaXZ4OTQ2IGRpdmlkZSAgLTEwICAgICAgLTAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZGl2eDk0NyBkaXZpZGUgIC0xRSsxMDAgIC0wLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2Rpdng5NDggZGl2aWRlICAtMUUrMTAwMCAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMKK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK2Rpdng5NTEgZGl2aWRlIDlFKzk5OTk5OTk5OSArMC4yMzQ1Njc4OTAxMjM0NUUtMCAtPiBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2Rpdng5NTIgZGl2aWRlICswLjEwMCA5RSs5OTk5OTk5OTkgLT4gMS4xMTExMTFFLTEwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2Rpdng5NTMgZGl2aWRlIDlFLTk5OTk5OTk5OSArOS4xMDAgLT4gOS44OTAxMDk5RS0xMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitkaXZ4OTU0IGRpdmlkZSAtMS4yMzQ1Njc4OSAgICAgICAgICA5RSs5OTk5OTk5OTkgLT4gLTEuMzcxNzQyMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK2Rpdng5NTUgZGl2aWRlIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtMS4zNzE3NDIxRS0xMDAwMDAwMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgUm91bmRlZCBJbmV4YWN0CitkaXZ4OTU2IGRpdmlkZSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA3RSs5OTk5OTk5OTkgLT4gLTEuNzYzNjY4NEUtMTAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorZGl2eDk1NyBkaXZpZGUgOUUrOTk5OTk5OTk5IC0wLjgzNDU2Nzg5MDEyMzQ1RS0wIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2Rpdng5NTggZGl2aWRlIC0wLjEwMCA5RSs5OTk5OTk5OTkgLT4gLTEuMTExMTExRS0xMDAwMDAwMDAxIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkaXZ4OTU5IGRpdmlkZSA5RS05OTk5OTk5OTkgLTkuMTAwIC0+IC05Ljg5MDEwOTlFLTEwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyAoYWRkaXRpb25hbCBlZGdlIHRlc3RzIGluIG11bHRpcGx5LmRlY1Rlc3QpCistLSAnc3Vibm9ybWFsJyByZXN1bHRzIG5vdyBwb3NzaWJsZSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluCistLSBiYXNlIGFyaXRoZW10aWMpCitkaXZ4OTYwIGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDAxIC0+IDFFLTEwMDAwMDAwMDEgU3Vibm9ybWFsCitkaXZ4OTYxIGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDAyIC0+IDFFLTEwMDAwMDAwMDIgU3Vibm9ybWFsCitkaXZ4OTYyIGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDAzIC0+IDFFLTEwMDAwMDAwMDMgU3Vibm9ybWFsCitkaXZ4OTYzIGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDA0IC0+IDFFLTEwMDAwMDAwMDQgU3Vibm9ybWFsCitkaXZ4OTY0IGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDA1IC0+IDFFLTEwMDAwMDAwMDUgU3Vibm9ybWFsCitkaXZ4OTY1IGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDA2IC0+IDFFLTEwMDAwMDAwMDYgU3Vibm9ybWFsCitkaXZ4OTY2IGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDA3IC0+IDFFLTEwMDAwMDAwMDcgU3Vibm9ybWFsCitkaXZ4OTY3IGRpdmlkZSAxZS02MDAwMDAwMDAgMWUrNDAwMDAwMDA4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGl2eDk2OCBkaXZpZGUgMWUtNjAwMDAwMDAwIDFlKzQwMDAwMDAwOSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rpdng5NjkgZGl2aWRlIDFlLTYwMDAwMDAwMCAxZSs0MDAwMDAwMTAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBbbm8gZXF1aXZhbGVudCBvZiAnc3Vibm9ybWFsJyBmb3Igb3ZlcmZsb3ddCitkaXZ4OTcwIGRpdmlkZSAxZSs2MDAwMDAwMDAgMWUtNDAwMDAwMDAxIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk3MSBkaXZpZGUgMWUrNjAwMDAwMDAwIDFlLTQwMDAwMDAwMiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5NzIgZGl2aWRlIDFlKzYwMDAwMDAwMCAxZS00MDAwMDAwMDMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTczIGRpdmlkZSAxZSs2MDAwMDAwMDAgMWUtNDAwMDAwMDA0IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk3NCBkaXZpZGUgMWUrNjAwMDAwMDAwIDFlLTQwMDAwMDAwNSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5NzUgZGl2aWRlIDFlKzYwMDAwMDAwMCAxZS00MDAwMDAwMDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTc2IGRpdmlkZSAxZSs2MDAwMDAwMDAgMWUtNDAwMDAwMDA3IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk3NyBkaXZpZGUgMWUrNjAwMDAwMDAwIDFlLTQwMDAwMDAwOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5NzggZGl2aWRlIDFlKzYwMDAwMDAwMCAxZS00MDAwMDAwMDkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTc5IGRpdmlkZSAxZSs2MDAwMDAwMDAgMWUtNDAwMDAwMDEwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSBTaWduIGFmdGVyIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cKK2Rpdng5ODAgZGl2aWRlICAxZS02MDAwMDAwMDAgIDFlKzQwMDAwMDAwOSAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkaXZ4OTgxIGRpdmlkZSAgMWUtNjAwMDAwMDAwIC0xZSs0MDAwMDAwMDkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZGl2eDk4MiBkaXZpZGUgLTFlLTYwMDAwMDAwMCAgMWUrNDAwMDAwMDA5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rpdng5ODMgZGl2aWRlIC0xZS02MDAwMDAwMDAgLTFlKzQwMDAwMDAwOSAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkaXZ4OTg0IGRpdmlkZSAgMWUrNjAwMDAwMDAwICAxZS00MDAwMDAwMDkgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZGl2eDk4NSBkaXZpZGUgIDFlKzYwMDAwMDAwMCAtMWUtNDAwMDAwMDA5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rpdng5ODYgZGl2aWRlIC0xZSs2MDAwMDAwMDAgIDFlLTQwMDAwMDAwOSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkaXZ4OTg3IGRpdmlkZSAtMWUrNjAwMDAwMDAwIC0xZS00MDAwMDAwMDkgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSBMb25nIG9wZXJhbmQgb3ZlcmZsb3cgbWF5IGJlIGEgZGlmZmVyZW50IHBhdGgKK3ByZWNpc2lvbjogMworZGl2eDk5MCBkaXZpZGUgMTAwMCAgOS45OTlFLTk5OTk5OTk5OSAgICAgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2Rpdng5OTEgZGl2aWRlIDEwMDAgLTkuOTk5RS05OTk5OTk5OTkgICAgICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkaXZ4OTkyIGRpdmlkZSAgICAgICA5Ljk5OUUrOTk5OTk5OTk5IDAuMDEgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZGl2eDk5MyBkaXZpZGUgICAgICAtOS45OTlFKzk5OTk5OTk5OSAwLjAxIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK3ByZWNpc2lvbjogICA1CittYXhleHBvbmVudDogNzkKK21pbmV4cG9uZW50OiAtNzkKK2RpdngxMDAxIGRpdmlkZSAgICAxLjUyNDQ0RS04MCAxICAgICAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkaXZ4MTAwMiBkaXZpZGUgICAgMS41MjQ0NUUtODAgMSAgICAgIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZGl2eDEwMDMgZGl2aWRlICAgIDEuNTI0NDZFLTgwIDEgICAgICAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gYSByb3VuZGluZyBwcm9ibGVtIGluIG9uZSBpbXBsZW1lbnRhdGlvbgorcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworLS0gVW5ib3VuZGVkIGFuc3dlciB0byA0MCBkaWdpdHM6CistLSAgIDEuNDY1ODExOTY1ODExOTY1ODExOTY1ODExOTY1ODExOTY1ODExOTY2RSs3MDAwCitkaXZ4MTAxMCBkaXZpZGUgMzQzRTYwMDAgIDIzNEUtMTAwMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK3ByZWNpc2lvbjogNworZGl2eDEwMjEgIGRpdmlkZSAxRTAgICAgICAgICAgMUUwIC0+IDEKK2RpdngxMDIyICBkaXZpZGUgMUUwICAgICAgICAgIDJFMCAtPiAwLjUKK2RpdngxMDIzICBkaXZpZGUgMUUwICAgICAgICAgIDNFMCAtPiAwLjMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkaXZ4MTAyNCAgZGl2aWRlIDEwMEUtMiAgIDEwMDBFLTMgLT4gMQorZGl2eDEwMjUgIGRpdmlkZSAyNEUtMSAgICAgICAgMkUwIC0+IDEuMgorZGl2eDEwMjYgIGRpdmlkZSAyNDAwRS0zICAgICAgMkUwIC0+IDEuMjAwCitkaXZ4MTAyNyAgZGl2aWRlIDVFMCAgICAgICAgICAyRTAgLT4gMi41CitkaXZ4MTAyOCAgZGl2aWRlIDVFMCAgICAgICAgMjBFLTEgLT4gMi41CitkaXZ4MTAyOSAgZGl2aWRlIDVFMCAgICAgIDIwMDBFLTMgLT4gMi41CitkaXZ4MTAzMCAgZGl2aWRlIDVFMCAgICAgICAgIDJFLTEgLT4gMjUKK2RpdngxMDMxICBkaXZpZGUgNUUwICAgICAgICAyMEUtMiAtPiAyNQorZGl2eDEwMzIgIGRpdmlkZSA0ODBFLTIgICAgICAgM0UwIC0+IDEuNjAKK2RpdngxMDMzICBkaXZpZGUgNDdFLTEgICAgICAgIDJFMCAtPiAyLjM1CisKKy0tIEVDTUFTY3JpcHQgYmFkIGV4YW1wbGVzCityb3VuZGluZzogICAgaGFsZl9kb3duCitwcmVjaXNpb246IDcKK2RpdngxMDUwICBkaXZpZGUgNSA5ICAtPiAwLjU1NTU1NTYgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogICAgaGFsZl9ldmVuCitkaXZ4MTA1MSAgZGl2aWRlIDUgMTEgLT4gMC40NTQ1NDU1IEluZXhhY3QgUm91bmRlZAorCistLSBwYXlsb2FkIGRlY2FwaXRhdGUKK3ByZWNpc2lvbjogNQorZGl2eDEwNTUgIGRpdmlkZSAgIHNOYU45ODc2NTQzMjEgMSAtPiAgTmFONTQzMjEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK2Rpdng5OTk4IGRpdmlkZSAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rpdng5OTk5IGRpdmlkZSAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kaXZpZGVpbnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGl2aWRlaW50LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJhMWFlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZGl2aWRlaW50LmRlY1Rlc3QKQEAgLTAsMCArMSw0ODYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZGl2aWRlaW50LmRlY1Rlc3QgLS0gZGVjaW1hbCBpbnRlZ2VyIGRpdmlzaW9uICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCitkdml4MDAxIGRpdmlkZWludCAgMSAgICAgMSAgICAtPiAgMQorZHZpeDAwMiBkaXZpZGVpbnQgIDIgICAgIDEgICAgLT4gIDIKK2R2aXgwMDMgZGl2aWRlaW50ICAxICAgICAyICAgIC0+ICAwCitkdml4MDA0IGRpdmlkZWludCAgMiAgICAgMiAgICAtPiAgMQorZHZpeDAwNSBkaXZpZGVpbnQgIDAgICAgIDEgICAgLT4gIDAKK2R2aXgwMDYgZGl2aWRlaW50ICAwICAgICAyICAgIC0+ICAwCitkdml4MDA3IGRpdmlkZWludCAgMSAgICAgMyAgICAtPiAgMAorZHZpeDAwOCBkaXZpZGVpbnQgIDIgICAgIDMgICAgLT4gIDAKK2R2aXgwMDkgZGl2aWRlaW50ICAzICAgICAzICAgIC0+ICAxCisKK2R2aXgwMTAgZGl2aWRlaW50ICAyLjQgICAxICAgIC0+ICAyCitkdml4MDExIGRpdmlkZWludCAgMi40ICAgLTEgICAtPiAgLTIKK2R2aXgwMTIgZGl2aWRlaW50ICAtMi40ICAxICAgIC0+ICAtMgorZHZpeDAxMyBkaXZpZGVpbnQgIC0yLjQgIC0xICAgLT4gIDIKK2R2aXgwMTQgZGl2aWRlaW50ICAyLjQwICAxICAgIC0+ICAyCitkdml4MDE1IGRpdmlkZWludCAgMi40MDAgMSAgICAtPiAgMgorZHZpeDAxNiBkaXZpZGVpbnQgIDIuNCAgIDIgICAgLT4gIDEKK2R2aXgwMTcgZGl2aWRlaW50ICAyLjQwMCAyICAgIC0+ICAxCitkdml4MDE4IGRpdmlkZWludCAgMi4gICAgMiAgICAtPiAgMQorZHZpeDAxOSBkaXZpZGVpbnQgIDIwICAgIDIwICAgLT4gIDEKKworZHZpeDAyMCBkaXZpZGVpbnQgIDE4NyAgIDE4NyAgLT4gIDEKK2R2aXgwMjEgZGl2aWRlaW50ICA1ICAgICAyICAgIC0+ICAyCitkdml4MDIyIGRpdmlkZWludCAgNSAgICAgMi4wICAgIC0+ICAyCitkdml4MDIzIGRpdmlkZWludCAgNSAgICAgMi4wMDAgIC0+ICAyCitkdml4MDI0IGRpdmlkZWludCAgNSAgICAgMC4yMDAgIC0+ICAyNQorZHZpeDAyNSBkaXZpZGVpbnQgIDUgICAgIDAuMjAwICAtPiAgMjUKKworZHZpeDAzMCBkaXZpZGVpbnQgIDEgICAgIDIgICAgICAtPiAgMAorZHZpeDAzMSBkaXZpZGVpbnQgIDEgICAgIDQgICAgICAtPiAgMAorZHZpeDAzMiBkaXZpZGVpbnQgIDEgICAgIDggICAgICAtPiAgMAorZHZpeDAzMyBkaXZpZGVpbnQgIDEgICAgIDE2ICAgICAtPiAgMAorZHZpeDAzNCBkaXZpZGVpbnQgIDEgICAgIDMyICAgICAtPiAgMAorZHZpeDAzNSBkaXZpZGVpbnQgIDEgICAgIDY0ICAgICAtPiAgMAorZHZpeDA0MCBkaXZpZGVpbnQgIDEgICAgLTIgICAgICAtPiAtMAorZHZpeDA0MSBkaXZpZGVpbnQgIDEgICAgLTQgICAgICAtPiAtMAorZHZpeDA0MiBkaXZpZGVpbnQgIDEgICAgLTggICAgICAtPiAtMAorZHZpeDA0MyBkaXZpZGVpbnQgIDEgICAgLTE2ICAgICAtPiAtMAorZHZpeDA0NCBkaXZpZGVpbnQgIDEgICAgLTMyICAgICAtPiAtMAorZHZpeDA0NSBkaXZpZGVpbnQgIDEgICAgLTY0ICAgICAtPiAtMAorZHZpeDA1MCBkaXZpZGVpbnQgLTEgICAgIDIgICAgICAtPiAtMAorZHZpeDA1MSBkaXZpZGVpbnQgLTEgICAgIDQgICAgICAtPiAtMAorZHZpeDA1MiBkaXZpZGVpbnQgLTEgICAgIDggICAgICAtPiAtMAorZHZpeDA1MyBkaXZpZGVpbnQgLTEgICAgIDE2ICAgICAtPiAtMAorZHZpeDA1NCBkaXZpZGVpbnQgLTEgICAgIDMyICAgICAtPiAtMAorZHZpeDA1NSBkaXZpZGVpbnQgLTEgICAgIDY0ICAgICAtPiAtMAorZHZpeDA2MCBkaXZpZGVpbnQgLTEgICAgLTIgICAgICAtPiAgMAorZHZpeDA2MSBkaXZpZGVpbnQgLTEgICAgLTQgICAgICAtPiAgMAorZHZpeDA2MiBkaXZpZGVpbnQgLTEgICAgLTggICAgICAtPiAgMAorZHZpeDA2MyBkaXZpZGVpbnQgLTEgICAgLTE2ICAgICAtPiAgMAorZHZpeDA2NCBkaXZpZGVpbnQgLTEgICAgLTMyICAgICAtPiAgMAorZHZpeDA2NSBkaXZpZGVpbnQgLTEgICAgLTY0ICAgICAtPiAgMAorCistLSBzaW1pbGFyIHdpdGggcG93ZXJzIG9mIHRlbgorZHZpeDE2MCBkaXZpZGVpbnQgIDEgICAgIDEgICAgICAgICAtPiAgMQorZHZpeDE2MSBkaXZpZGVpbnQgIDEgICAgIDEwICAgICAgICAtPiAgMAorZHZpeDE2MiBkaXZpZGVpbnQgIDEgICAgIDEwMCAgICAgICAtPiAgMAorZHZpeDE2MyBkaXZpZGVpbnQgIDEgICAgIDEwMDAgICAgICAtPiAgMAorZHZpeDE2NCBkaXZpZGVpbnQgIDEgICAgIDEwMDAwICAgICAtPiAgMAorZHZpeDE2NSBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMCAgICAtPiAgMAorZHZpeDE2NiBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMDAgICAtPiAgMAorZHZpeDE2NyBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMDAwICAtPiAgMAorZHZpeDE2OCBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMDAwMCAtPiAgMAorZHZpeDE3MCBkaXZpZGVpbnQgIDEgICAgLTEgICAgICAgICAtPiAtMQorZHZpeDE3MSBkaXZpZGVpbnQgIDEgICAgLTEwICAgICAgICAtPiAtMAorZHZpeDE3MiBkaXZpZGVpbnQgIDEgICAgLTEwMCAgICAgICAtPiAtMAorZHZpeDE3MyBkaXZpZGVpbnQgIDEgICAgLTEwMDAgICAgICAtPiAtMAorZHZpeDE3NCBkaXZpZGVpbnQgIDEgICAgLTEwMDAwICAgICAtPiAtMAorZHZpeDE3NSBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMCAgICAtPiAtMAorZHZpeDE3NiBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMDAgICAtPiAtMAorZHZpeDE3NyBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMDAwICAtPiAtMAorZHZpeDE3OCBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMDAwMCAtPiAtMAorZHZpeDE4MCBkaXZpZGVpbnQgLTEgICAgIDEgICAgICAgICAtPiAtMQorZHZpeDE4MSBkaXZpZGVpbnQgLTEgICAgIDEwICAgICAgICAtPiAtMAorZHZpeDE4MiBkaXZpZGVpbnQgLTEgICAgIDEwMCAgICAgICAtPiAtMAorZHZpeDE4MyBkaXZpZGVpbnQgLTEgICAgIDEwMDAgICAgICAtPiAtMAorZHZpeDE4NCBkaXZpZGVpbnQgLTEgICAgIDEwMDAwICAgICAtPiAtMAorZHZpeDE4NSBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMCAgICAtPiAtMAorZHZpeDE4NiBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMDAgICAtPiAtMAorZHZpeDE4NyBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMDAwICAtPiAtMAorZHZpeDE4OCBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMDAwMCAtPiAtMAorZHZpeDE5MCBkaXZpZGVpbnQgLTEgICAgLTEgICAgICAgICAtPiAgMQorZHZpeDE5MSBkaXZpZGVpbnQgLTEgICAgLTEwICAgICAgICAtPiAgMAorZHZpeDE5MiBkaXZpZGVpbnQgLTEgICAgLTEwMCAgICAgICAtPiAgMAorZHZpeDE5MyBkaXZpZGVpbnQgLTEgICAgLTEwMDAgICAgICAtPiAgMAorZHZpeDE5NCBkaXZpZGVpbnQgLTEgICAgLTEwMDAwICAgICAtPiAgMAorZHZpeDE5NSBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMCAgICAtPiAgMAorZHZpeDE5NiBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMDAgICAtPiAgMAorZHZpeDE5NyBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMDAwICAtPiAgMAorZHZpeDE5OCBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMDAwMCAtPiAgMAorCistLSBzb21lIGxvbmcgb3BlcmFuZCBjYXNlcyBoZXJlCitkdml4MDcwIGRpdmlkZWludCAgOTk5OTk5OTk5ICAgICAxICAtPiAgOTk5OTk5OTk5Citkdml4MDcxIGRpdmlkZWludCAgOTk5OTk5OTk5LjQgICAxICAtPiAgOTk5OTk5OTk5Citkdml4MDcyIGRpdmlkZWludCAgOTk5OTk5OTk5LjUgICAxICAtPiAgOTk5OTk5OTk5Citkdml4MDczIGRpdmlkZWludCAgOTk5OTk5OTk5LjkgICAxICAtPiAgOTk5OTk5OTk5Citkdml4MDc0IGRpdmlkZWludCAgOTk5OTk5OTk5Ljk5OSAxICAtPiAgOTk5OTk5OTk5CitwcmVjaXNpb246IDYKK2R2aXgwODAgZGl2aWRlaW50ICA5OTk5OTk5OTkgICAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDA4MSBkaXZpZGVpbnQgIDk5OTk5OTk5ICAgICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4MDgyIGRpdmlkZWludCAgOTk5OTk5OSAgICAgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgwODMgZGl2aWRlaW50ICA5OTk5OTkgICAgICAgIDEgIC0+ICA5OTk5OTkKK2R2aXgwODQgZGl2aWRlaW50ICA5OTk5OSAgICAgICAgIDEgIC0+ICA5OTk5OQorZHZpeDA4NSBkaXZpZGVpbnQgIDk5OTkgICAgICAgICAgMSAgLT4gIDk5OTkKK2R2aXgwODYgZGl2aWRlaW50ICA5OTkgICAgICAgICAgIDEgIC0+ICA5OTkKK2R2aXgwODcgZGl2aWRlaW50ICA5OSAgICAgICAgICAgIDEgIC0+ICA5OQorZHZpeDA4OCBkaXZpZGVpbnQgIDkgICAgICAgICAgICAgMSAgLT4gIDkKKworcHJlY2lzaW9uOiA5Citkdml4MDkwIGRpdmlkZWludCAgMC4gICAgICAgICAgICAxICAgIC0+ICAwCitkdml4MDkxIGRpdmlkZWludCAgLjAgICAgICAgICAgICAxICAgIC0+ICAwCitkdml4MDkyIGRpdmlkZWludCAgMC4wMCAgICAgICAgICAxICAgIC0+ICAwCitkdml4MDkzIGRpdmlkZWludCAgMC4wMEUrOSAgICAgICAxICAgIC0+ICAwCitkdml4MDk0IGRpdmlkZWludCAgMC4wMDAwRS01MCAgICAxICAgIC0+ICAwCisKK2R2aXgxMDAgZGl2aWRlaW50ICAxICAxICAgLT4gMQorZHZpeDEwMSBkaXZpZGVpbnQgIDEgIDIgICAtPiAwCitkdml4MTAyIGRpdmlkZWludCAgMSAgMyAgIC0+IDAKK2R2aXgxMDMgZGl2aWRlaW50ICAxICA0ICAgLT4gMAorZHZpeDEwNCBkaXZpZGVpbnQgIDEgIDUgICAtPiAwCitkdml4MTA1IGRpdmlkZWludCAgMSAgNiAgIC0+IDAKK2R2aXgxMDYgZGl2aWRlaW50ICAxICA3ICAgLT4gMAorZHZpeDEwNyBkaXZpZGVpbnQgIDEgIDggICAtPiAwCitkdml4MTA4IGRpdmlkZWludCAgMSAgOSAgIC0+IDAKK2R2aXgxMDkgZGl2aWRlaW50ICAxICAxMCAgLT4gMAorZHZpeDExMCBkaXZpZGVpbnQgIDEgIDEgICAtPiAxCitkdml4MTExIGRpdmlkZWludCAgMiAgMSAgIC0+IDIKK2R2aXgxMTIgZGl2aWRlaW50ICAzICAxICAgLT4gMworZHZpeDExMyBkaXZpZGVpbnQgIDQgIDEgICAtPiA0Citkdml4MTE0IGRpdmlkZWludCAgNSAgMSAgIC0+IDUKK2R2aXgxMTUgZGl2aWRlaW50ICA2ICAxICAgLT4gNgorZHZpeDExNiBkaXZpZGVpbnQgIDcgIDEgICAtPiA3Citkdml4MTE3IGRpdmlkZWludCAgOCAgMSAgIC0+IDgKK2R2aXgxMTggZGl2aWRlaW50ICA5ICAxICAgLT4gOQorZHZpeDExOSBkaXZpZGVpbnQgIDEwIDEgICAtPiAxMAorCistLSBmcm9tIERpYWdCaWdEZWNpbWFsCitkdml4MTMxIGRpdmlkZWludCAgMTAxLjMgICAxICAgICAtPiAgMTAxCitkdml4MTMyIGRpdmlkZWludCAgMTAxLjAgICAxICAgICAtPiAgMTAxCitkdml4MTMzIGRpdmlkZWludCAgMTAxLjMgICAzICAgICAtPiAgMzMKK2R2aXgxMzQgZGl2aWRlaW50ICAxMDEuMCAgIDMgICAgIC0+ICAzMworZHZpeDEzNSBkaXZpZGVpbnQgIDIuNCAgICAgMSAgICAgLT4gIDIKK2R2aXgxMzYgZGl2aWRlaW50ICAyLjQwMCAgIDEgICAgIC0+ICAyCitkdml4MTM3IGRpdmlkZWludCAgMTggICAgICAxOCAgICAtPiAgMQorZHZpeDEzOCBkaXZpZGVpbnQgIDExMjAgICAgMTAwMCAgLT4gIDEKK2R2aXgxMzkgZGl2aWRlaW50ICAyLjQgICAgIDIgICAgIC0+ICAxCitkdml4MTQwIGRpdmlkZWludCAgMi40MDAgICAyICAgICAtPiAgMQorZHZpeDE0MSBkaXZpZGVpbnQgIDAuNSAgICAgMi4wMDAgLT4gIDAKK2R2aXgxNDIgZGl2aWRlaW50ICA4LjAwNSAgIDcgICAgIC0+ICAxCitkdml4MTQzIGRpdmlkZWludCAgNSAgICAgICAyICAgICAtPiAgMgorZHZpeDE0NCBkaXZpZGVpbnQgIDAgICAgICAgMiAgICAgLT4gIDAKK2R2aXgxNDUgZGl2aWRlaW50ICAwLjAwICAgIDIgICAgIC0+ICAwCisKKy0tIE90aGVycworZHZpeDE1MCBkaXZpZGVpbnQgIDEyMzQ1ICA0Ljk5OSAgLT4gIDI0NjkKK2R2aXgxNTEgZGl2aWRlaW50ICAxMjM0NSAgNC45OSAgIC0+ICAyNDczCitkdml4MTUyIGRpdmlkZWludCAgMTIzNDUgIDQuOSAgICAtPiAgMjUxOQorZHZpeDE1MyBkaXZpZGVpbnQgIDEyMzQ1ICA1ICAgICAgLT4gIDI0NjkKK2R2aXgxNTQgZGl2aWRlaW50ICAxMjM0NSAgNS4xICAgIC0+ICAyNDIwCitkdml4MTU1IGRpdmlkZWludCAgMTIzNDUgIDUuMDEgICAtPiAgMjQ2NAorZHZpeDE1NiBkaXZpZGVpbnQgIDEyMzQ1ICA1LjAwMSAgLT4gIDI0NjgKK2R2aXgxNTcgZGl2aWRlaW50ICAgIDEwMSAgNy42ICAgIC0+ICAxMworCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIGRpdmlkZWludCBieSAwCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorZHZpeDIwMSBkaXZpZGVpbnQgIDAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHZpeDIwMiBkaXZpZGVpbnQgIDAuMEU1ICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHZpeDIwMyBkaXZpZGVpbnQgIDAuMDAwICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHZpeDIwNCBkaXZpZGVpbnQgIDAuMDAwMSAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIwNSBkaXZpZGVpbnQgIDAuMDEgICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIwNiBkaXZpZGVpbnQgIDAuMSAgICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIwNyBkaXZpZGVpbnQgIDEgICAgICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIwOCBkaXZpZGVpbnQgIDEgICAgICAwLjAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIwOSBkaXZpZGVpbnQgMTAgICAgICAwLjAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIxMCBkaXZpZGVpbnQgMUUrMTAwICAwLjAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIxMSBkaXZpZGVpbnQgMUUrMTAwMCAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIxNCBkaXZpZGVpbnQgIC0wLjAwMDEgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjE1IGRpdmlkZWludCAgLTAuMDEgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXgyMTYgZGl2aWRlaW50ICAtMC4xICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIxNyBkaXZpZGVpbnQgIC0xICAgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjE4IGRpdmlkZWludCAgLTEgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXgyMTkgZGl2aWRlaW50IC0xMCAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDIyMCBkaXZpZGVpbnQgLTFFKzEwMCAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4MjIxIGRpdmlkZWludCAtMUUrMTAwMCAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorZHZpeDI3MCBkaXZpZGVpbnQgMSAxZTk5OTk5OTk5OSAgICAtPiAwCitkdml4MjcxIGRpdmlkZWludCAxIDAuOWU5OTk5OTk5OTkgIC0+IDAKK2R2aXgyNzIgZGl2aWRlaW50IDEgMC45OWU5OTk5OTk5OTkgLT4gMAorZHZpeDI3MyBkaXZpZGVpbnQgMSAwLjk5OTk5OTk5OWU5OTk5OTk5OTkgLT4gMAorZHZpeDI3NCBkaXZpZGVpbnQgOWU5OTk5OTk5OTkgICAgMSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI3NSBkaXZpZGVpbnQgOS45ZTk5OTk5OTk5OSAgMSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI3NiBkaXZpZGVpbnQgOS45OWU5OTk5OTk5OTkgMSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDI3NyBkaXZpZGVpbnQgOS45OTk5OTk5OWU5OTk5OTk5OTkgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCitkdml4MjgwIGRpdmlkZWludCAwLjEgOWUtOTk5OTk5OTk5ICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4MjgxIGRpdmlkZWludCAwLjEgOTllLTk5OTk5OTk5OSAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4MjgyIGRpdmlkZWludCAwLjEgOTk5ZS05OTk5OTk5OTkgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK2R2aXgyODMgZGl2aWRlaW50IDAuMSA5ZS05OTk5OTk5OTggICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgyODQgZGl2aWRlaW50IDAuMSA5OWUtOTk5OTk5OTk4ICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgyODUgZGl2aWRlaW50IDAuMSA5OTllLTk5OTk5OTk5OCAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgyODYgZGl2aWRlaW50IDAuMSA5OTllLTk5OTk5OTk5NyAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgyODcgZGl2aWRlaW50IDAuMSA5OTk5ZS05OTk5OTk5OTcgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgyODggZGl2aWRlaW50IDAuMSA5OTk5OWUtOTk5OTk5OTk3ICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gR0QgZWRnZSBjYXNlczogbGhzIHNtYWxsZXIgdGhhbiByaHMgYnV0IG1vcmUgZGlnaXRzCitkdml4MzAxICBkaXZpZGVpbnQgIDAuOSAgICAgIDIgICAgICAtPiAgMAorZHZpeDMwMiAgZGl2aWRlaW50ICAwLjkgICAgICAyLjAgICAgLT4gIDAKK2R2aXgzMDMgIGRpdmlkZWludCAgMC45ICAgICAgMi4xICAgIC0+ICAwCitkdml4MzA0ICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMDAgICAtPiAgMAorZHZpeDMwNSAgZGl2aWRlaW50ICAwLjkgICAgICAyLjAxICAgLT4gIDAKK2R2aXgzMDYgIGRpdmlkZWludCAgMC4xMiAgICAgMSAgICAgIC0+ICAwCitkdml4MzA3ICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMCAgICAtPiAgMAorZHZpeDMwOCAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAwICAgLT4gIDAKK2R2aXgzMDkgIGRpdmlkZWludCAgMC4xMiAgICAgMS4wICAgIC0+ICAwCitkdml4MzEwICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMDAgICAtPiAgMAorZHZpeDMxMSAgZGl2aWRlaW50ICAwLjEyICAgICAyICAgICAgLT4gIDAKK2R2aXgzMTIgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wICAgIC0+ICAwCitkdml4MzEzICBkaXZpZGVpbnQgIDAuMTIgICAgIDIuMSAgICAtPiAgMAorZHZpeDMxNCAgZGl2aWRlaW50ICAwLjEyICAgICAyLjAwICAgLT4gIDAKK2R2aXgzMTUgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wMSAgIC0+ICAwCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgW2Zyb20gZGl2aWRlXQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK2R2aXgzMzAgZGl2aWRlaW50ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAgICAtPiAwCitkdml4MzMxIGRpdmlkZWludCA5RSs5OTk5OTk5OTkgKzAuMjM0NTY3ODkwMTIzNDVFLTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXgzMzIgZGl2aWRlaW50ICswLjEwMCA5RSs5OTk5OTk5OTkgICAgLT4gMAorZHZpeDMzMyBkaXZpZGVpbnQgOUUtOTk5OTk5OTk5ICs5LjEwMCAgICAtPiAwCitkdml4MzM1IGRpdmlkZWludCAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTk5OTkgICAgLT4gLTAKK2R2aXgzMzYgZGl2aWRlaW50IDlFKzk5OTk5OTk5OSAtMC44MzQ1Njc4OTAxMjM0NUUtMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDMzNyBkaXZpZGVpbnQgLTAuMTAwIDlFKzk5OTk5OTk5OSAgICAtPiAtMAorZHZpeDMzOCBkaXZpZGVpbnQgOUUtOTk5OTk5OTk5IC05LjEwMCAgICAtPiAtMAorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5Citkdml4NDAxIGRpdmlkZWludCAxMjM0NTY3ODAwMCAxMDAgLT4gMTIzNDU2NzgwCitkdml4NDAyIGRpdmlkZWludCAxIDEyMzQ1Njc4MDAwICAgLT4gMAorZHZpeDQwMyBkaXZpZGVpbnQgMTIzNDU2NzgwMCAgMTAgIC0+IDEyMzQ1Njc4MAorZHZpeDQwNCBkaXZpZGVpbnQgMSAxMjM0NTY3ODAwICAgIC0+IDAKK2R2aXg0MDUgZGl2aWRlaW50IDEyMzQ1Njc4OTAgIDEwICAtPiAxMjM0NTY3ODkKK2R2aXg0MDYgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MCAgICAtPiAwCitkdml4NDA3IGRpdmlkZWludCAxMjM0NTY3ODkxICAxMCAgLT4gMTIzNDU2Nzg5Citkdml4NDA4IGRpdmlkZWludCAxIDEyMzQ1Njc4OTEgICAgLT4gMAorZHZpeDQwOSBkaXZpZGVpbnQgMTIzNDU2Nzg5MDEgMTAwIC0+IDEyMzQ1Njc4OQorZHZpeDQxMCBkaXZpZGVpbnQgMSAxMjM0NTY3ODkwMSAgIC0+IDAKK2R2aXg0MTEgZGl2aWRlaW50IDEyMzQ1Njc4OTYgIDEwICAtPiAxMjM0NTY3ODkKK2R2aXg0MTIgZGl2aWRlaW50IDEgMTIzNDU2Nzg5NiAgICAtPiAwCitkdml4NDEzIGRpdmlkZWludCAxMjM0NTY3ODk0OCAxMDAgLT4gMTIzNDU2Nzg5Citkdml4NDE0IGRpdmlkZWludCAxMjM0NTY3ODk0OSAxMDAgLT4gMTIzNDU2Nzg5Citkdml4NDE1IGRpdmlkZWludCAxMjM0NTY3ODk1MCAxMDAgLT4gMTIzNDU2Nzg5Citkdml4NDE2IGRpdmlkZWludCAxMjM0NTY3ODk1MSAxMDAgLT4gMTIzNDU2Nzg5Citkdml4NDE3IGRpdmlkZWludCAxMjM0NTY3ODk5OSAxMDAgLT4gMTIzNDU2Nzg5CisKK3ByZWNpc2lvbjogMTUKK2R2aXg0NDEgZGl2aWRlaW50IDEyMzQ1Njc4MDAwIDEgLT4gMTIzNDU2NzgwMDAKK2R2aXg0NDIgZGl2aWRlaW50IDEgMTIzNDU2NzgwMDAgLT4gMAorZHZpeDQ0MyBkaXZpZGVpbnQgMTIzNDU2NzgwMCAgMSAtPiAxMjM0NTY3ODAwCitkdml4NDQ0IGRpdmlkZWludCAxIDEyMzQ1Njc4MDAgIC0+IDAKK2R2aXg0NDUgZGl2aWRlaW50IDEyMzQ1Njc4OTAgIDEgLT4gMTIzNDU2Nzg5MAorZHZpeDQ0NiBkaXZpZGVpbnQgMSAxMjM0NTY3ODkwICAtPiAwCitkdml4NDQ3IGRpdmlkZWludCAxMjM0NTY3ODkxICAxIC0+IDEyMzQ1Njc4OTEKK2R2aXg0NDggZGl2aWRlaW50IDEgMTIzNDU2Nzg5MSAgLT4gMAorZHZpeDQ0OSBkaXZpZGVpbnQgMTIzNDU2Nzg5MDEgMSAtPiAxMjM0NTY3ODkwMQorZHZpeDQ1MCBkaXZpZGVpbnQgMSAxMjM0NTY3ODkwMSAtPiAwCitkdml4NDUxIGRpdmlkZWludCAxMjM0NTY3ODk2ICAxIC0+IDEyMzQ1Njc4OTYKK2R2aXg0NTIgZGl2aWRlaW50IDEgMTIzNDU2Nzg5NiAgLT4gMAorCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CisKKy0tIG1vcmUgemVyb3MsIGV0Yy4KK2R2aXg1MzEgZGl2aWRlaW50IDUuMDAgMUUtMyAgICAtPiA1MDAwCitkdml4NTMyIGRpdmlkZWludCAwMC4wMCAwLjAwMCAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHZpeDUzMyBkaXZpZGVpbnQgMDAuMDAgMEUtMyAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2R2aXg1MzQgZGl2aWRlaW50ICAwICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkdml4NTM1IGRpdmlkZWludCAtMCAgICAgMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHZpeDUzNiBkaXZpZGVpbnQgLTAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKKworZHZpeDU0MSBkaXZpZGVpbnQgIDAgICAgLTEgICAgIC0+IC0wCitkdml4NTQyIGRpdmlkZWludCAtMCAgICAtMSAgICAgLT4gIDAKK2R2aXg1NDMgZGl2aWRlaW50ICAwICAgICAxICAgICAtPiAgMAorZHZpeDU0NCBkaXZpZGVpbnQgLTAgICAgIDEgICAgIC0+IC0wCitkdml4NTQ1IGRpdmlkZWludCAtMSAgICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NDYgZGl2aWRlaW50IC0xICAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU0NyBkaXZpZGVpbnQgIDEgICAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTQ4IGRpdmlkZWludCAgMSAgICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHZpeDU1MSBkaXZpZGVpbnQgIDAuMCAgLTEgICAgIC0+IC0wCitkdml4NTUyIGRpdmlkZWludCAtMC4wICAtMSAgICAgLT4gIDAKK2R2aXg1NTMgZGl2aWRlaW50ICAwLjAgICAxICAgICAtPiAgMAorZHZpeDU1NCBkaXZpZGVpbnQgLTAuMCAgIDEgICAgIC0+IC0wCitkdml4NTU1IGRpdmlkZWludCAtMS4wICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NTYgZGl2aWRlaW50IC0xLjAgIC0wICAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU1NyBkaXZpZGVpbnQgIDEuMCAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTU4IGRpdmlkZWludCAgMS4wICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHZpeDU2MSBkaXZpZGVpbnQgIDAgICAgLTEuMCAgIC0+IC0wCitkdml4NTYyIGRpdmlkZWludCAtMCAgICAtMS4wICAgLT4gIDAKK2R2aXg1NjMgZGl2aWRlaW50ICAwICAgICAxLjAgICAtPiAgMAorZHZpeDU2NCBkaXZpZGVpbnQgLTAgICAgIDEuMCAgIC0+IC0wCitkdml4NTY1IGRpdmlkZWludCAtMSAgICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NjYgZGl2aWRlaW50IC0xICAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU2NyBkaXZpZGVpbnQgIDEgICAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTY4IGRpdmlkZWludCAgMSAgICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHZpeDU3MSBkaXZpZGVpbnQgIDAuMCAgLTEuMCAgIC0+IC0wCitkdml4NTcyIGRpdmlkZWludCAtMC4wICAtMS4wICAgLT4gIDAKK2R2aXg1NzMgZGl2aWRlaW50ICAwLjAgICAxLjAgICAtPiAgMAorZHZpeDU3NCBkaXZpZGVpbnQgLTAuMCAgIDEuMCAgIC0+IC0wCitkdml4NTc1IGRpdmlkZWludCAtMS4wICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2R2aXg1NzYgZGl2aWRlaW50IC0xLjAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHZpeDU3NyBkaXZpZGVpbnQgIDEuMCAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkdml4NTc4IGRpdmlkZWludCAgMS4wICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gU3BlY2lhbHMKK2R2aXg1ODAgZGl2aWRlaW50ICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkdml4NTgxIGRpdmlkZWludCAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5Citkdml4NTgyIGRpdmlkZWludCAgSW5mICAtMSAgICAgLT4gLUluZmluaXR5Citkdml4NTgzIGRpdmlkZWludCAgSW5mICAtMCAgICAgLT4gLUluZmluaXR5Citkdml4NTg0IGRpdmlkZWludCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5Citkdml4NTg1IGRpdmlkZWludCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5Citkdml4NTg2IGRpdmlkZWludCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5Citkdml4NTg3IGRpdmlkZWludCAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDU4OCBkaXZpZGVpbnQgLTEwMDAgIEluZiAgIC0+IC0wCitkdml4NTg5IGRpdmlkZWludCAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDU5MCBkaXZpZGVpbnQgLTEgICAgIEluZiAgIC0+IC0wCitkdml4NTkxIGRpdmlkZWludCAtMCAgICAgSW5mICAgLT4gLTAKK2R2aXg1OTIgZGl2aWRlaW50ICAwICAgICBJbmYgICAtPiAgMAorZHZpeDU5MyBkaXZpZGVpbnQgIDEgICAgIEluZiAgIC0+ICAwCitkdml4NTk0IGRpdmlkZWludCAgMTAwMCAgSW5mICAgLT4gIDAKK2R2aXg1OTUgZGl2aWRlaW50ICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2R2aXg2MDAgZGl2aWRlaW50IC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjAxIGRpdmlkZWludCAtSW5mICAtMTAwMCAgLT4gIEluZmluaXR5Citkdml4NjAyIGRpdmlkZWludCAtSW5mICAtMSAgICAgLT4gIEluZmluaXR5Citkdml4NjAzIGRpdmlkZWludCAtSW5mICAtMCAgICAgLT4gIEluZmluaXR5Citkdml4NjA0IGRpdmlkZWludCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5Citkdml4NjA1IGRpdmlkZWludCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5Citkdml4NjA2IGRpdmlkZWludCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5Citkdml4NjA3IGRpdmlkZWludCAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDYwOCBkaXZpZGVpbnQgLTEwMDAgIEluZiAgIC0+IC0wCitkdml4NjA5IGRpdmlkZWludCAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDYxMCBkaXZpZGVpbnQgLTEgICAgLUluZiAgIC0+ICAwCitkdml4NjExIGRpdmlkZWludCAtMCAgICAtSW5mICAgLT4gIDAKK2R2aXg2MTIgZGl2aWRlaW50ICAwICAgIC1JbmYgICAtPiAtMAorZHZpeDYxMyBkaXZpZGVpbnQgIDEgICAgLUluZiAgIC0+IC0wCitkdml4NjE0IGRpdmlkZWludCAgMTAwMCAtSW5mICAgLT4gLTAKK2R2aXg2MTUgZGl2aWRlaW50ICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2R2aXg2MjEgZGl2aWRlaW50ICBOYU4gLUluZiAgICAtPiAgTmFOCitkdml4NjIyIGRpdmlkZWludCAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHZpeDYyMyBkaXZpZGVpbnQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2R2aXg2MjQgZGl2aWRlaW50ICBOYU4gLTAgICAgICAtPiAgTmFOCitkdml4NjI1IGRpdmlkZWludCAgTmFOICAwICAgICAgLT4gIE5hTgorZHZpeDYyNiBkaXZpZGVpbnQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2R2aXg2MjcgZGl2aWRlaW50ICBOYU4gIDEwMDAgICAtPiAgTmFOCitkdml4NjI4IGRpdmlkZWludCAgTmFOICBJbmYgICAgLT4gIE5hTgorZHZpeDYyOSBkaXZpZGVpbnQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2R2aXg2MzAgZGl2aWRlaW50IC1JbmYgIE5hTiAgICAtPiAgTmFOCitkdml4NjMxIGRpdmlkZWludCAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHZpeDYzMiBkaXZpZGVpbnQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2R2aXg2MzMgZGl2aWRlaW50IC0wICAgIE5hTiAgICAtPiAgTmFOCitkdml4NjM0IGRpdmlkZWludCAgMCAgICBOYU4gICAgLT4gIE5hTgorZHZpeDYzNSBkaXZpZGVpbnQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2R2aXg2MzYgZGl2aWRlaW50ICAxMDAwIE5hTiAgICAtPiAgTmFOCitkdml4NjM3IGRpdmlkZWludCAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkdml4NjQxIGRpdmlkZWludCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NDIgZGl2aWRlaW50ICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY0MyBkaXZpZGVpbnQgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjQ0IGRpdmlkZWludCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NDUgZGl2aWRlaW50ICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY0NiBkaXZpZGVpbnQgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjQ3IGRpdmlkZWludCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NDggZGl2aWRlaW50ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY0OSBkaXZpZGVpbnQgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjUwIGRpdmlkZWludCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NTEgZGl2aWRlaW50IC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY1MiBkaXZpZGVpbnQgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjUzIGRpdmlkZWludCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NTQgZGl2aWRlaW50IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY1NSBkaXZpZGVpbnQgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjU2IGRpdmlkZWludCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NTcgZGl2aWRlaW50ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHZpeDY1OCBkaXZpZGVpbnQgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkdml4NjU5IGRpdmlkZWludCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHZpeDY2MSBkaXZpZGVpbnQgIE5hTjkgLUluZiAgIC0+ICBOYU45Citkdml4NjYyIGRpdmlkZWludCAgTmFOOCAgMTAwMCAgLT4gIE5hTjgKK2R2aXg2NjMgZGl2aWRlaW50ICBOYU43ICBJbmYgICAtPiAgTmFONworZHZpeDY2NCBkaXZpZGVpbnQgLU5hTjYgIE5hTjUgIC0+IC1OYU42Citkdml4NjY1IGRpdmlkZWludCAtSW5mICAgTmFONCAgLT4gIE5hTjQKK2R2aXg2NjYgZGl2aWRlaW50IC0xMDAwICBOYU4zICAtPiAgTmFOMworZHZpeDY2NyBkaXZpZGVpbnQgIEluZiAgLU5hTjIgIC0+IC1OYU4yCisKK2R2aXg2NzEgZGl2aWRlaW50IC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzIgZGl2aWRlaW50ICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzMgZGl2aWRlaW50ICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzQgZGl2aWRlaW50ICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzUgZGl2aWRlaW50ICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzYgZGl2aWRlaW50IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzcgZGl2aWRlaW50ICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzggZGl2aWRlaW50ICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2R2aXg2NzkgZGl2aWRlaW50ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gc29tZSBsb25nIG9wZXJhbmQgY2FzZXMgYWdhaW4KK3ByZWNpc2lvbjogOAorZHZpeDcxMCBkaXZpZGVpbnQgIDEwMDAwMDAwMSAgICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzExIGRpdmlkZWludCAgMTAwMDAwMDAwLjQgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MTIgZGl2aWRlaW50ICAxMDAwMDAwMDAuNSAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDcxMyBkaXZpZGVpbnQgIDEwMDAwMDAwMC45ICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzE0IGRpdmlkZWludCAgMTAwMDAwMDAwLjk5OSAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3ByZWNpc2lvbjogNgorZHZpeDcyMCBkaXZpZGVpbnQgIDEwMDAwMDAwMCAgICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzIxIGRpdmlkZWludCAgMTAwMDAwMDAgICAgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3MjIgZGl2aWRlaW50ICAxMDAwMDAwICAgICAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDcyMyBkaXZpZGVpbnQgIDEwMDAwMCAgICAgICAgMSAgLT4gIDEwMDAwMAorZHZpeDcyNCBkaXZpZGVpbnQgIDEwMDAwICAgICAgICAgMSAgLT4gIDEwMDAwCitkdml4NzI1IGRpdmlkZWludCAgMTAwMCAgICAgICAgICAxICAtPiAgMTAwMAorZHZpeDcyNiBkaXZpZGVpbnQgIDEwMCAgICAgICAgICAgMSAgLT4gIDEwMAorZHZpeDcyNyBkaXZpZGVpbnQgIDEwICAgICAgICAgICAgMSAgLT4gIDEwCitkdml4NzI4IGRpdmlkZWludCAgMSAgICAgICAgICAgICAxICAtPiAgMQorZHZpeDcyOSBkaXZpZGVpbnQgIDEgICAgICAgICAgICAxMCAgLT4gIDAKKworcHJlY2lzaW9uOiA5CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorZHZpeDczMiBkaXZpZGVpbnQgMSAwLjk5ZTk5OTk5OTk5OSAtPiAwCitkdml4NzMzIGRpdmlkZWludCAxIDAuOTk5OTk5OTk5ZTk5OTk5OTk5OSAtPiAwCitkdml4NzM0IGRpdmlkZWludCA5ZTk5OTk5OTk5OSAgICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzM1IGRpdmlkZWludCA5LjllOTk5OTk5OTk5ICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzM2IGRpdmlkZWludCA5Ljk5ZTk5OTk5OTk5OSAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkdml4NzM3IGRpdmlkZWludCA5Ljk5OTk5OTk5ZTk5OTk5OTk5OSAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK2R2aXg3NDAgZGl2aWRlaW50IDAuMSA5ZS05OTk5OTk5OTkgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3NDEgZGl2aWRlaW50IDAuMSA5OWUtOTk5OTk5OTk5ICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2R2aXg3NDIgZGl2aWRlaW50IDAuMSA5OTllLTk5OTk5OTk5OSAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworZHZpeDc0MyBkaXZpZGVpbnQgMC4xIDllLTk5OTk5OTk5OCAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDc0NCBkaXZpZGVpbnQgMC4xIDk5ZS05OTk5OTk5OTggICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDc0NSBkaXZpZGVpbnQgMC4xIDk5OWUtOTk5OTk5OTk4ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDc0NiBkaXZpZGVpbnQgMC4xIDk5OWUtOTk5OTk5OTk3ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDc0NyBkaXZpZGVpbnQgMC4xIDk5OTllLTk5OTk5OTk5NyAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHZpeDc0OCBkaXZpZGVpbnQgMC4xIDk5OTk5ZS05OTk5OTk5OTcgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCisKKy0tIE51bGwgdGVzdHMKK2R2aXg5MDAgZGl2aWRlaW50ICAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2R2aXg5MDEgZGl2aWRlaW50ICAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFBYnMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFBYnMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWFhMDYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUFicy5kZWNUZXN0CkBAIC0wLDAgKzEsMTI2IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQWJzLmRlY1Rlc3QgLS0gZGVjUXVhZCBhYnNvbHV0ZSB2YWx1ZSwgaGVlZGluZyBzTmFOICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZHFhYnMwMDEgYWJzICcxJyAgICAgIC0+ICcxJworZHFhYnMwMDIgYWJzICctMScgICAgIC0+ICcxJworZHFhYnMwMDMgYWJzICcxLjAwJyAgIC0+ICcxLjAwJworZHFhYnMwMDQgYWJzICctMS4wMCcgIC0+ICcxLjAwJworZHFhYnMwMDUgYWJzICcwJyAgICAgIC0+ICcwJworZHFhYnMwMDYgYWJzICcwLjAwJyAgIC0+ICcwLjAwJworZHFhYnMwMDcgYWJzICcwMC4wJyAgIC0+ICcwLjAnCitkcWFiczAwOCBhYnMgJzAwLjAwJyAgLT4gJzAuMDAnCitkcWFiczAwOSBhYnMgJzAwJyAgICAgLT4gJzAnCisKK2RxYWJzMDEwIGFicyAnLTInICAgICAtPiAnMicKK2RxYWJzMDExIGFicyAnMicgICAgICAtPiAnMicKK2RxYWJzMDEyIGFicyAnLTIuMDAnICAtPiAnMi4wMCcKK2RxYWJzMDEzIGFicyAnMi4wMCcgICAtPiAnMi4wMCcKK2RxYWJzMDE0IGFicyAnLTAnICAgICAtPiAnMCcKK2RxYWJzMDE1IGFicyAnLTAuMDAnICAtPiAnMC4wMCcKK2RxYWJzMDE2IGFicyAnLTAwLjAnICAtPiAnMC4wJworZHFhYnMwMTcgYWJzICctMDAuMDAnIC0+ICcwLjAwJworZHFhYnMwMTggYWJzICctMDAnICAgIC0+ICcwJworCitkcWFiczAyMCBhYnMgJy0yMDAwMDAwJyAtPiAnMjAwMDAwMCcKK2RxYWJzMDIxIGFicyAnMjAwMDAwMCcgIC0+ICcyMDAwMDAwJworCitkcWFiczAzMCBhYnMgJyswLjEnICAgICAgICAgICAgLT4gJzAuMScKK2RxYWJzMDMxIGFicyAnLTAuMScgICAgICAgICAgICAtPiAnMC4xJworZHFhYnMwMzIgYWJzICcrMC4wMScgICAgICAgICAgIC0+ICcwLjAxJworZHFhYnMwMzMgYWJzICctMC4wMScgICAgICAgICAgIC0+ICcwLjAxJworZHFhYnMwMzQgYWJzICcrMC4wMDEnICAgICAgICAgIC0+ICcwLjAwMScKK2RxYWJzMDM1IGFicyAnLTAuMDAxJyAgICAgICAgICAtPiAnMC4wMDEnCitkcWFiczAzNiBhYnMgJyswLjAwMDAwMScgICAgICAgLT4gJzAuMDAwMDAxJworZHFhYnMwMzcgYWJzICctMC4wMDAwMDEnICAgICAgIC0+ICcwLjAwMDAwMScKK2RxYWJzMDM4IGFicyAnKzAuMDAwMDAwMDAwMDAxJyAtPiAnMUUtMTInCitkcWFiczAzOSBhYnMgJy0wLjAwMDAwMDAwMDAwMScgLT4gJzFFLTEyJworCistLSBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCitkcWFiczA0MCBhYnMgJzIuMScgICAgIC0+ICAnMi4xJworZHFhYnMwNDEgYWJzICctMTAwJyAgICAtPiAgJzEwMCcKK2RxYWJzMDQyIGFicyAnMTAxLjUnICAgLT4gICcxMDEuNScKK2RxYWJzMDQzIGFicyAnLTEwMS41JyAgLT4gICcxMDEuNScKKworLS0gbW9yZSBmaXhlZCwgcG90ZW50aWFsIExIUyBzd2Fwcy9vdmVybGF5cyBpZiBkb25lIGJ5IHN1YnRyYWN0IDAKK2RxYWJzMDYwIGFicyAnLTU2MjY3RS0xMCcgIC0+ICcwLjAwMDAwNTYyNjcnCitkcWFiczA2MSBhYnMgJy01NjI2N0UtNScgICAtPiAnMC41NjI2NycKK2RxYWJzMDYyIGFicyAnLTU2MjY3RS0yJyAgIC0+ICc1NjIuNjcnCitkcWFiczA2MyBhYnMgJy01NjI2N0UtMScgICAtPiAnNTYyNi43JworZHFhYnMwNjUgYWJzICctNTYyNjdFLTAnICAgLT4gJzU2MjY3JworCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKKworLS0gbG9uZyBvcGVyYW5kIHRlc3RzCitkcWFiczMyMSBhYnMgMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZHFhYnMzMjIgYWJzIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorZHFhYnMzMjMgYWJzIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCitkcWFiczMyNCBhYnMgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK2RxYWJzMzI1IGFicyAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorZHFhYnMzMjYgYWJzIDEyMzQ1Njc4OTAxICAtPiAxMjM0NTY3ODkwMQorZHFhYnMzMjcgYWJzIDEyMzQ1Njc4OTYgICAtPiAxMjM0NTY3ODk2CisKKy0tIHplcm9zCitkcWFiczExMSBhYnMgICAgICAgICAgMCAgIC0+IDAKK2RxYWJzMTEyIGFicyAgICAgICAgIC0wICAgLT4gMAorZHFhYnMxMTMgYWJzICAgICAgIDBFKzYgICAtPiAwRSs2CitkcWFiczExNCBhYnMgICAgICAtMEUrNiAgIC0+IDBFKzYKK2RxYWJzMTE1IGFicyAgICAgMC4wMDAwICAgLT4gMC4wMDAwCitkcWFiczExNiBhYnMgICAgLTAuMDAwMCAgIC0+IDAuMDAwMAorZHFhYnMxMTcgYWJzICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RxYWJzMTE4IGFicyAgICAgLTBFLTE0MSAgLT4gMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkcWFiczEyMSBhYnMgICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWFiczEyMiBhYnMgIC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWFiczEyMyBhYnMgICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxICAgIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCitkcWFiczEyNCBhYnMgIC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxICAgIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcWFiczEzMSBhYnMgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcWFiczEzMiBhYnMgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNDMKK2RxYWJzMTMzIGFicyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxYWJzMTM0IGFicyAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NiBTdWJub3JtYWwKKworZHFhYnMxMzUgYWJzICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTc2IFN1Ym5vcm1hbAorZHFhYnMxMzYgYWJzICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFhYnMxMzcgYWJzICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTQzCitkcWFiczEzOCBhYnMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CisKKy0tIHNwZWNpYWxzCitkcWFiczUyMCBhYnMgJ0luZicgICAgLT4gJ0luZmluaXR5JworZHFhYnM1MjEgYWJzICctSW5mJyAgIC0+ICdJbmZpbml0eScKK2RxYWJzNTIyIGFicyAgIE5hTiAgICAtPiAgTmFOCitkcWFiczUyMyBhYnMgIHNOYU4gICAgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcWFiczUyNCBhYnMgICBOYU4yMiAgLT4gIE5hTjIyCitkcWFiczUyNSBhYnMgIHNOYU4zMyAgLT4gIE5hTjMzIEludmFsaWRfb3BlcmF0aW9uCitkcWFiczUyNiBhYnMgIC1OYU4yMiAgLT4gLU5hTjIyCitkcWFiczUyNyBhYnMgLXNOYU4zMyAgLT4gLU5hTjMzIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK2RxYWJzOTAwIGFicyAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUFkZC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUFkZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGY3N2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQWRkLmRlY1Rlc3QKQEAgLTAsMCArMSwxMjE1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQWRkLmRlY1Rlc3QgLS0gZGVjUXVhZCBhZGRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgYXJlIGZvciBkZWNRdWFkcyBvbmx5OyBhbGwgYXJndW1lbnRzIGFyZQorLS0gcmVwcmVzZW50YWJsZSBpbiBhIGRlY1F1YWQKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFtmaXJzdCBncm91cCBhcmUgJ3F1aWNrIGNvbmZpZGVuY2UgY2hlY2snXQorZHFhZGQwMDEgYWRkIDEgICAgICAgMSAgICAgICAtPiAgMgorZHFhZGQwMDIgYWRkIDIgICAgICAgMyAgICAgICAtPiAgNQorZHFhZGQwMDMgYWRkICc1Ljc1JyAgJzMuMycgICAtPiAgOS4wNQorZHFhZGQwMDQgYWRkICc1JyAgICAgJy0zJyAgICAtPiAgMgorZHFhZGQwMDUgYWRkICctNScgICAgJy0zJyAgICAtPiAgLTgKK2RxYWRkMDA2IGFkZCAnLTcnICAgICcyLjUnICAgLT4gIC00LjUKK2RxYWRkMDA3IGFkZCAnMC43JyAgICcwLjMnICAgLT4gIDEuMAorZHFhZGQwMDggYWRkICcxLjI1JyAgJzEuMjUnICAtPiAgMi41MAorZHFhZGQwMDkgYWRkICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcyLjIzNDU2Nzg5JworZHFhZGQwMTAgYWRkICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMTEnIC0+ICcyLjIzNDU2ODAwJworCistLSAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMTIzNDU2Nzg5MDEyMzQ1NgorZHFhZGQwMTEgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDYnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMTIgYWRkICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDUnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RxYWRkMDEzIGFkZCAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkMDE0IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDAxNSBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNDk5JyAgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMTYgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjQ5OTknIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDE3IGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDAwJyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDAxOCBhZGQgICAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgJzAuNTAwMScgLT4gJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZHFhZGQwMTkgYWRkICAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICcwLjUwMScgIC0+ICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDIwIGFkZCAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMDIxIGFkZCAwIDEgLT4gMQorZHFhZGQwMjIgYWRkIDEgMSAtPiAyCitkcWFkZDAyMyBhZGQgMiAxIC0+IDMKK2RxYWRkMDI0IGFkZCAzIDEgLT4gNAorZHFhZGQwMjUgYWRkIDQgMSAtPiA1CitkcWFkZDAyNiBhZGQgNSAxIC0+IDYKK2RxYWRkMDI3IGFkZCA2IDEgLT4gNworZHFhZGQwMjggYWRkIDcgMSAtPiA4CitkcWFkZDAyOSBhZGQgOCAxIC0+IDkKK2RxYWRkMDMwIGFkZCA5IDEgLT4gMTAKKworLS0gc29tZSBjYXJyeWluZyBlZmZlY3RzCitkcWFkZDAzMSBhZGQgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCitkcWFkZDAzMiBhZGQgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTknCitkcWFkZDAzMyBhZGQgJzAuOTk5OCcgICcwLjAwMDInIC0+ICcxLjAwMDAnCitkcWFkZDAzNCBhZGQgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcxLjAwMDEnCisKK2RxYWRkMDM1IGFkZCAnNzAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDM2IGFkZCAnNzAwJyAgJzEwMDAwZSszNCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDAzNyBhZGQgJzcwMDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDM4IGFkZCAnNzAwMDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDM5IGFkZCAnNzAwMDAwJyAgJzEwMDAwZSszNCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3RSszOCcgUm91bmRlZAorCistLSBzeW1tZXRyeToKK2RxYWRkMDQwIGFkZCAnMTAwMDBlKzM0JyAgJzcwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDQxIGFkZCAnMTAwMDBlKzM0JyAgJzcwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDA0MiBhZGQgJzEwMDAwZSszNCcgICc3MDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDQ0IGFkZCAnMTAwMDBlKzM0JyAgJzcwMDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMDQ1IGFkZCAnMTAwMDBlKzM0JyAgJzcwMDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3RSszOCcgUm91bmRlZAorCistLSBzYW1lLCB3aXRob3V0IHJvdW5kaW5nCitkcWFkZDA0NiBhZGQgJzEwMDAwZSs5JyAgJzcnIC0+ICcxMDAwMDAwMDAwMDAwNycKK2RxYWRkMDQ3IGFkZCAnMTAwMDBlKzknICAnNzAnIC0+ICcxMDAwMDAwMDAwMDA3MCcKK2RxYWRkMDQ4IGFkZCAnMTAwMDBlKzknICAnNzAwJyAtPiAnMTAwMDAwMDAwMDA3MDAnCitkcWFkZDA0OSBhZGQgJzEwMDAwZSs5JyAgJzcwMDAnIC0+ICcxMDAwMDAwMDAwNzAwMCcKK2RxYWRkMDUwIGFkZCAnMTAwMDBlKzknICAnNzAwMDAnIC0+ICcxMDAwMDAwMDA3MDAwMCcKK2RxYWRkMDUxIGFkZCAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMTAwMDAwMDA3MDAwMDAnCitkcWFkZDA1MiBhZGQgJzEwMDAwZSs5JyAgJzcwMDAwMDAnIC0+ICcxMDAwMDAwNzAwMDAwMCcKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorZHFhZGQwNTMgYWRkICcxMicgJzcuMDAnIC0+ICcxOS4wMCcKK2RxYWRkMDU0IGFkZCAnMS4zJyAnLTEuMDcnIC0+ICcwLjIzJworZHFhZGQwNTUgYWRkICcxLjMnICctMS4zMCcgLT4gJzAuMDAnCitkcWFkZDA1NiBhZGQgJzEuMycgJy0yLjA3JyAtPiAnLTAuNzcnCitkcWFkZDA1NyBhZGQgJzFFKzInICcxRSs0JyAtPiAnMS4wMUUrNCcKKworLS0gbGVhZGluZyB6ZXJvIHByZXNlcnZhdGlvbgorZHFhZGQwNjEgYWRkIDEgJzAuMDAwMScgLT4gJzEuMDAwMScKK2RxYWRkMDYyIGFkZCAxICcwLjAwMDAxJyAtPiAnMS4wMDAwMScKK2RxYWRkMDYzIGFkZCAxICcwLjAwMDAwMScgLT4gJzEuMDAwMDAxJworZHFhZGQwNjQgYWRkIDEgJzAuMDAwMDAwMScgLT4gJzEuMDAwMDAwMScKK2RxYWRkMDY1IGFkZCAxICcwLjAwMDAwMDAxJyAtPiAnMS4wMDAwMDAwMScKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorZHFhZGQwNzAgYWRkIDEgIDAgICAgLT4gMQorZHFhZGQwNzEgYWRkIDEgMC4gICAgLT4gMQorZHFhZGQwNzIgYWRkIDEgIC4wICAgLT4gMS4wCitkcWFkZDA3MyBhZGQgMSAwLjAgICAtPiAxLjAKK2RxYWRkMDc0IGFkZCAxIDAuMDAgIC0+IDEuMDAKK2RxYWRkMDc1IGFkZCAgMCAgMSAgIC0+IDEKK2RxYWRkMDc2IGFkZCAwLiAgMSAgIC0+IDEKK2RxYWRkMDc3IGFkZCAgLjAgMSAgIC0+IDEuMAorZHFhZGQwNzggYWRkIDAuMCAxICAgLT4gMS4wCitkcWFkZDA3OSBhZGQgMC4wMCAxICAtPiAxLjAwCisKKy0tIHNvbWUgY2FycmllcworZHFhZGQwODAgYWRkIDk5OTk5OTk5OCAxICAtPiA5OTk5OTk5OTkKK2RxYWRkMDgxIGFkZCA5OTk5OTk5OTkgMSAgLT4gMTAwMDAwMDAwMAorZHFhZGQwODIgYWRkICA5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAKK2RxYWRkMDgzIGFkZCAgIDk5OTk5OTkgMSAgLT4gMTAwMDAwMDAKK2RxYWRkMDg0IGFkZCAgICA5OTk5OTkgMSAgLT4gMTAwMDAwMAorZHFhZGQwODUgYWRkICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2RxYWRkMDg2IGFkZCAgICAgIDk5OTkgMSAgLT4gMTAwMDAKK2RxYWRkMDg3IGFkZCAgICAgICA5OTkgMSAgLT4gMTAwMAorZHFhZGQwODggYWRkICAgICAgICA5OSAxICAtPiAxMDAKK2RxYWRkMDg5IGFkZCAgICAgICAgIDkgMSAgLT4gMTAKKworCistLSBtb3JlIExIUyBzd2FwcworZHFhZGQwOTAgYWRkICctNTYyNjdFLTEwJyAgIDAgLT4gICctMC4wMDAwMDU2MjY3JworZHFhZGQwOTEgYWRkICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitkcWFkZDA5MiBhZGQgJy01NjI2N0UtNScgICAgMCAtPiAgJy0wLjU2MjY3JworZHFhZGQwOTMgYWRkICctNTYyNjdFLTQnICAgIDAgLT4gICctNS42MjY3JworZHFhZGQwOTQgYWRkICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworZHFhZGQwOTUgYWRkICctNTYyNjdFLTInICAgIDAgLT4gICctNTYyLjY3JworZHFhZGQwOTYgYWRkICctNTYyNjdFLTEnICAgIDAgLT4gICctNTYyNi43JworZHFhZGQwOTcgYWRkICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitkcWFkZDA5OCBhZGQgJy01RS0xMCcgICAgICAgMCAtPiAgJy01RS0xMCcKK2RxYWRkMDk5IGFkZCAnLTVFLTcnICAgICAgICAwIC0+ICAnLTVFLTcnCitkcWFkZDEwMCBhZGQgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2RxYWRkMTAxIGFkZCAnLTVFLTUnICAgICAgICAwIC0+ICAnLTAuMDAwMDUnCitkcWFkZDEwMiBhZGQgJy01RS00JyAgICAgICAgMCAtPiAgJy0wLjAwMDUnCitkcWFkZDEwMyBhZGQgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitkcWFkZDEwNCBhZGQgJy01RTAnICAgICAgICAgMCAtPiAgJy01JworZHFhZGQxMDUgYWRkICctNUUxJyAgICAgICAgIDAgLT4gICctNTAnCitkcWFkZDEwNiBhZGQgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitkcWFkZDEwNyBhZGQgJy01RTMzJyAgICAgICAgMCAtPiAgJy01MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQxMDggYWRkICctNUUzNCcgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0JyAgUm91bmRlZAorZHFhZGQxMDkgYWRkICctNUUzNScgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1JyAgUm91bmRlZAorZHFhZGQxMTAgYWRkICctNUUzNicgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM2JyAgUm91bmRlZAorZHFhZGQxMTEgYWRkICctNUUxMDAnICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzEwMCcgUm91bmRlZAorCistLSBtb3JlIFJIUyBzd2FwcworZHFhZGQxMTMgYWRkIDAgICctNTYyNjdFLTEwJyAtPiAgJy0wLjAwMDAwNTYyNjcnCitkcWFkZDExNCBhZGQgMCAgJy01NjI2N0UtNicgIC0+ICAnLTAuMDU2MjY3JworZHFhZGQxMTYgYWRkIDAgICctNTYyNjdFLTUnICAtPiAgJy0wLjU2MjY3JworZHFhZGQxMTcgYWRkIDAgICctNTYyNjdFLTQnICAtPiAgJy01LjYyNjcnCitkcWFkZDExOSBhZGQgMCAgJy01NjI2N0UtMycgIC0+ICAnLTU2LjI2NycKK2RxYWRkMTIwIGFkZCAwICAnLTU2MjY3RS0yJyAgLT4gICctNTYyLjY3JworZHFhZGQxMjEgYWRkIDAgICctNTYyNjdFLTEnICAtPiAgJy01NjI2LjcnCitkcWFkZDEyMiBhZGQgMCAgJy01NjI2N0UtMCcgIC0+ICAnLTU2MjY3JworZHFhZGQxMjMgYWRkIDAgICctNUUtMTAnICAgICAtPiAgJy01RS0xMCcKK2RxYWRkMTI0IGFkZCAwICAnLTVFLTcnICAgICAgLT4gICctNUUtNycKK2RxYWRkMTI1IGFkZCAwICAnLTVFLTYnICAgICAgLT4gICctMC4wMDAwMDUnCitkcWFkZDEyNiBhZGQgMCAgJy01RS01JyAgICAgIC0+ICAnLTAuMDAwMDUnCitkcWFkZDEyNyBhZGQgMCAgJy01RS00JyAgICAgIC0+ICAnLTAuMDAwNScKK2RxYWRkMTI4IGFkZCAwICAnLTVFLTEnICAgICAgLT4gICctMC41JworZHFhZGQxMjkgYWRkIDAgICctNUUwJyAgICAgICAtPiAgJy01JworZHFhZGQxMzAgYWRkIDAgICctNUUxJyAgICAgICAtPiAgJy01MCcKK2RxYWRkMTMxIGFkZCAwICAnLTVFNScgICAgICAgLT4gICctNTAwMDAwJworZHFhZGQxMzIgYWRkIDAgICctNUUzMycgICAgICAtPiAgJy01MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQxMzMgYWRkIDAgICctNUUzNCcgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQnICAgUm91bmRlZAorZHFhZGQxMzQgYWRkIDAgICctNUUzNScgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUnICAgUm91bmRlZAorZHFhZGQxMzUgYWRkIDAgICctNUUzNicgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYnICAgUm91bmRlZAorZHFhZGQxMzYgYWRkIDAgICctNUUxMDAnICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCistLSByZWxhdGVkCitkcWFkZDEzNyBhZGQgIDEgICcwRS0zOScgICAgICAtPiAgJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgUm91bmRlZAorZHFhZGQxMzggYWRkIC0xICAnMEUtMzknICAgICAgLT4gICctMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2RxYWRkMTM5IGFkZCAnMEUtMzknIDEgICAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitkcWFkZDE0MCBhZGQgJzBFLTM5JyAtMSAgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZHFhZGQxNDEgYWRkIDFFKzI5ICAgMC4wMDAwICAgLT4gICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMDAwMCcKK2RxYWRkMTQyIGFkZCAxRSsyOSAgIDAuMDAwMDAgIC0+ICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAwMDAnICBSb3VuZGVkCitkcWFkZDE0MyBhZGQgMC4wMDAgICAxRSszMCAgICAtPiAgJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMDAwJworZHFhZGQxNDQgYWRkIDAuMDAwMCAgMUUrMzAgICAgLT4gICcxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAwMCcgIFJvdW5kZWQKKworLS0gW3NvbWUgb2YgdGhlIG5leHQgZ3JvdXAgYXJlIHJlYWxseSBjb25zdHJ1Y3RvciB0ZXN0c10KK2RxYWRkMTQ2IGFkZCAnMDAuMCcgIDAgICAgICAgLT4gICcwLjAnCitkcWFkZDE0NyBhZGQgJzAuMDAnICAwICAgICAgIC0+ICAnMC4wMCcKK2RxYWRkMTQ4IGFkZCAgMCAgICAgICcwLjAwJyAgLT4gICcwLjAwJworZHFhZGQxNDkgYWRkICAwICAgICAgJzAwLjAnICAtPiAgJzAuMCcKK2RxYWRkMTUwIGFkZCAnMDAuMCcgICcwLjAwJyAgLT4gICcwLjAwJworZHFhZGQxNTEgYWRkICcwLjAwJyAgJzAwLjAnICAtPiAgJzAuMDAnCitkcWFkZDE1MiBhZGQgJzMnICAgICAnLjMnICAgIC0+ICAnMy4zJworZHFhZGQxNTMgYWRkICczLicgICAgJy4zJyAgICAtPiAgJzMuMycKK2RxYWRkMTU0IGFkZCAnMy4wJyAgICcuMycgICAgLT4gICczLjMnCitkcWFkZDE1NSBhZGQgJzMuMDAnICAnLjMnICAgIC0+ICAnMy4zMCcKK2RxYWRkMTU2IGFkZCAnMycgICAgICczJyAgICAgLT4gICc2JworZHFhZGQxNTcgYWRkICczJyAgICAgJyszJyAgICAtPiAgJzYnCitkcWFkZDE1OCBhZGQgJzMnICAgICAnLTMnICAgIC0+ICAnMCcKK2RxYWRkMTU5IGFkZCAnMC4zJyAgICctMC4zJyAgLT4gICcwLjAnCitkcWFkZDE2MCBhZGQgJzAuMDMnICAnLTAuMDMnIC0+ICAnMC4wMCcKKworLS0gdHJ5IGJvcmRlcmxpbmUgcHJlY2lzaW9uLCB3aXRoIGNhcnJpZXMsIGV0Yy4KK2RxYWRkMTYxIGFkZCAnMUUrMTInICctMScgICAgLT4gJzk5OTk5OTk5OTk5OScKK2RxYWRkMTYyIGFkZCAnMUUrMTInICAnMS4xMScgLT4gJzEwMDAwMDAwMDAwMDEuMTEnCitkcWFkZDE2MyBhZGQgJzEuMTEnICAnMUUrMTInIC0+ICcxMDAwMDAwMDAwMDAxLjExJworZHFhZGQxNjQgYWRkICctMScgICAgJzFFKzEyJyAtPiAnOTk5OTk5OTk5OTk5JworZHFhZGQxNjUgYWRkICc3RSsxMicgJy0xJyAgICAtPiAnNjk5OTk5OTk5OTk5OScKK2RxYWRkMTY2IGFkZCAnN0UrMTInICAnMS4xMScgLT4gJzcwMDAwMDAwMDAwMDEuMTEnCitkcWFkZDE2NyBhZGQgJzEuMTEnICAnN0UrMTInIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZHFhZGQxNjggYWRkICctMScgICAgJzdFKzEyJyAtPiAnNjk5OTk5OTk5OTk5OScKKworcm91bmRpbmc6IGhhbGZfdXAKK2RxYWRkMTcwIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTY3JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZHFhZGQxNzEgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjYnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE3MiBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2NScgLT4gJzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTczIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTY0JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQxNzQgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE3NSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MicgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTc2IGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUxJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZHFhZGQxNzcgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgUm91bmRlZAorZHFhZGQxNzggYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDUnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE3OSBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0NCcgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTgwIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQzJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQxODEgYWRkICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDInIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDE4MiBhZGQgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0MScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMTgzIGFkZCAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQwJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgnIFJvdW5kZWQKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2RxYWRkMjAwIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScKK2RxYWRkMjAxIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIwMiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMDMgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjA0IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIwNSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMDYgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjA3IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIwOCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMDkgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjEwIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIxMSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMTIgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjEzIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIxNCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMTUgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjE2IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcKK2RxYWRkMjE3IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIxOCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMTkgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZHFhZGQyMjAgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JworZHFhZGQyMjEgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjIyIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIyMyBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMjQgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjI1IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIyNiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMjcgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjI4IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIyOSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMzAgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjMxIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIzMiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMzMgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjM0IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIzNSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyMzYgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJworZHFhZGQyMzcgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjM4IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDIzOSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorLS0gY3JpdGljYWwgZmV3IHdpdGggZXZlbiBib3R0b20gZGlnaXQuLi4KK2RxYWRkMjQwIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI0MSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNDIgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg4JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2RxYWRkMjUwIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScKK2RxYWRkMjUxIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI1MiBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNTMgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjU0IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI1NSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNTYgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjU3IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI1OCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNTkgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjYwIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI2MSBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNjIgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjYzIGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI2NCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNjUgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMjY2IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcKK2RxYWRkMjY3IGFkZCAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDI2OCBhZGQgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQyNjkgYWRkICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gMSBpbiBsYXN0IHBsYWNlIHRlc3RzCityb3VuZGluZzogaGFsZl91cAorZHFhZGQzMDEgYWRkICAtMSAgIDEgICAgICAtPiAgIDAKK2RxYWRkMzAyIGFkZCAgIDAgICAxICAgICAgLT4gICAxCitkcWFkZDMwMyBhZGQgICAxICAgMSAgICAgIC0+ICAgMgorZHFhZGQzMDQgYWRkICAxMiAgIDEgICAgICAtPiAgMTMKK2RxYWRkMzA1IGFkZCAgOTggICAxICAgICAgLT4gIDk5CitkcWFkZDMwNiBhZGQgIDk5ICAgMSAgICAgIC0+IDEwMAorZHFhZGQzMDcgYWRkIDEwMCAgIDEgICAgICAtPiAxMDEKK2RxYWRkMzA4IGFkZCAxMDEgICAxICAgICAgLT4gMTAyCitkcWFkZDMwOSBhZGQgIC0xICAtMSAgICAgIC0+ICAtMgorZHFhZGQzMTAgYWRkICAgMCAgLTEgICAgICAtPiAgLTEKK2RxYWRkMzExIGFkZCAgIDEgIC0xICAgICAgLT4gICAwCitkcWFkZDMxMiBhZGQgIDEyICAtMSAgICAgIC0+ICAxMQorZHFhZGQzMTMgYWRkICA5OCAgLTEgICAgICAtPiAgOTcKK2RxYWRkMzE0IGFkZCAgOTkgIC0xICAgICAgLT4gIDk4CitkcWFkZDMxNSBhZGQgMTAwICAtMSAgICAgIC0+ICA5OQorZHFhZGQzMTYgYWRkIDEwMSAgLTEgICAgICAtPiAxMDAKKworZHFhZGQzMjEgYWRkIC0wLjAxICAwLjAxICAgIC0+ICAwLjAwCitkcWFkZDMyMiBhZGQgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2RxYWRkMzIzIGFkZCAgMC4wMSAgMC4wMSAgICAtPiAgMC4wMgorZHFhZGQzMjQgYWRkICAwLjEyICAwLjAxICAgIC0+ICAwLjEzCitkcWFkZDMyNSBhZGQgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2RxYWRkMzI2IGFkZCAgMC45OSAgMC4wMSAgICAtPiAgMS4wMAorZHFhZGQzMjcgYWRkICAxLjAwICAwLjAxICAgIC0+ICAxLjAxCitkcWFkZDMyOCBhZGQgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2RxYWRkMzI5IGFkZCAtMC4wMSAtMC4wMSAgICAtPiAtMC4wMgorZHFhZGQzMzAgYWRkICAwLjAwIC0wLjAxICAgIC0+IC0wLjAxCitkcWFkZDMzMSBhZGQgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2RxYWRkMzMyIGFkZCAgMC4xMiAtMC4wMSAgICAtPiAgMC4xMQorZHFhZGQzMzMgYWRkICAwLjk4IC0wLjAxICAgIC0+ICAwLjk3CitkcWFkZDMzNCBhZGQgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2RxYWRkMzM1IGFkZCAgMS4wMCAtMC4wMSAgICAtPiAgMC45OQorZHFhZGQzMzYgYWRkICAxLjAxIC0wLjAxICAgIC0+ICAxLjAwCisKKy0tIHNvbWUgbW9yZSBjYXNlcyB3aGVyZSBhZGRpbmcgMCBhZmZlY3RzIHRoZSBjb2VmZmljaWVudAorZHFhZGQzNDAgYWRkIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2RxYWRkMzQxIGFkZCAxRSszMyAgIDAgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFhZGQzNDIgYWRkIDFFKzM0ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCAgUm91bmRlZAorZHFhZGQzNDMgYWRkIDFFKzM1ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorZHFhZGQzNDQgYWRkIDFFKzMgICAgMSAgICAtPiAgICAgICAgIDEwMDEKK2RxYWRkMzQ1IGFkZCAxRSszMyAgIDEgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFhZGQzNDYgYWRkIDFFKzM0ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0NyBhZGQgMUUrMzUgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzQ4IGFkZCAxRSszICAgIDcgICAgLT4gICAgICAgICAxMDA3CitkcWFkZDM0OSBhZGQgMUUrMzMgICA3ICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxYWRkMzUwIGFkZCAxRSszNCAgIDcgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUrMzQgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNTEgYWRkIDFFKzM1ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCityb3VuZGluZzogICAgaGFsZl91cAorZHFhZGQzNjAgIGFkZCAwRSs1MCAxMDAwMEUrMSAgLT4gMS4wMDAwRSs1CitkcWFkZDM2MSAgYWRkIDBFLTUwIDEwMDAwRSsxICAtPiAxMDAwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBSb3VuZGVkCitkcWFkZDM2MiAgYWRkIDEwMDAwRSsxIDBFLTUwICAtPiAxMDAwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBSb3VuZGVkCitkcWFkZDM2MyAgYWRkIDEwMDAwRSsxIDEwMDAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDM2NCAgYWRkIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAwRSs2MTExCistLSAgICAgICAgICAgIDEgMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CisKKy0tIGEgY3VyaW9zaXR5IGZyb20gSlNSIDEzIHRlc3RpbmcKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KK2RxYWRkMzcwIGFkZCAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODE0CitkcWFkZDM3MSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODFFKzM0IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RxYWRkMzcyIGFkZCAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODE0CitkcWFkZDM3MyBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODFFKzM0IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorZHFhZGQzNzQgYWRkICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MTQKK2RxYWRkMzc1IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDgxNSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MUUrMzQgUm91bmRlZCBJbmV4YWN0CisKKy0tIHVscCByZXBsYWNlbWVudCB0ZXN0cworZHFhZGQ0MDAgYWRkICAgMSAgIDc3ZS0zMiAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDQwMSBhZGQgICAxICAgNzdlLTMzICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDQwMiBhZGQgICAxICAgNzdlLTM0ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MDMgYWRkICAgMSAgIDc3ZS0zNSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDA0IGFkZCAgIDEgICA3N2UtMzYgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQwNSBhZGQgICAxICAgNzdlLTM3ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MDYgYWRkICAgMSAgIDc3ZS0yOTkgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQ0MTAgYWRkICAxMCAgIDc3ZS0zMiAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NworZHFhZGQ0MTEgYWRkICAxMCAgIDc3ZS0zMyAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDEyIGFkZCAgMTAgICA3N2UtMzQgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQxMyBhZGQgIDEwICAgNzdlLTM1ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MTQgYWRkICAxMCAgIDc3ZS0zNiAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDE1IGFkZCAgMTAgICA3N2UtMzcgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQxNiBhZGQgIDEwICAgNzdlLTI5OSAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDQyMCBhZGQgIDc3ZS0zMiAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcKK2RxYWRkNDIxIGFkZCAgNzdlLTMzICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzcKK2RxYWRkNDIyIGFkZCAgNzdlLTM0ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDQyMyBhZGQgIDc3ZS0zNSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MjQgYWRkICA3N2UtMzYgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDI1IGFkZCAgNzdlLTM3ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQyNiBhZGQgIDc3ZS0yOTkgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDQzMCBhZGQgIDc3ZS0zMiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDQzMSBhZGQgIDc3ZS0zMyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MzIgYWRkICA3N2UtMzQgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDMzIGFkZCAgNzdlLTM1ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDQzNCBhZGQgIDc3ZS0zNiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ0MzUgYWRkICA3N2UtMzcgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNDM2IGFkZCAgNzdlLTI5OSAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGZhc3RwYXRoIGJvdW5kYXJpZXMKKy0tICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFhZGQ1MDEgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MDIgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzQ1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MDMgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzM1NTU1NTU1NTU1NTU1NTU1NTUwNTU1NTU1NTU1NTU1NTUnIC0+ICc3OTk5OTk5OTk5OTk5OTk5OTk5NDk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MDQgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzM5NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4Mzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MDUgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzQ5NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc5Mzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JworZHFhZGQ1MDYgYWRkICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU5NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+IDEuMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNTExIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTEyIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTEzIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTE0IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTE1IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTE2IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTE3IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTE4IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTE5IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTIwIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTIxIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTIyIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTIzIGFkZCAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICczMzMzMzMzMzMzMzMzMzMzMzMzMzMzJyAtPiAnNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NycKK2RxYWRkNTI0IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTI1IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTI2IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTI3IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTI4IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTI5IGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTMwIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OTk5OScKK2RxYWRkNTMxIGFkZCAnMzQ0NDQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OTk5OScKK2RxYWRkNTMyIGFkZCAnMzQ0NDQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OTk5OScKK2RxYWRkNTMzIGFkZCAnMzQ0NDQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OTk5OScKK2RxYWRkNTM0IGFkZCAnMzQ0NDQ0NDQ0NDQnICAnNTU1NTU1NTU1NTUnIC0+ICc4OTk5OTk5OTk5OScKK2RxYWRkNTM1IGFkZCAnMzQ0NDQ0NDQ0NCcgICc1NTU1NTU1NTU1JyAtPiAnODk5OTk5OTk5OScKK2RxYWRkNTM2IGFkZCAnMzQ0NDQ0NDQ0JyAgJzU1NTU1NTU1NScgLT4gJzg5OTk5OTk5OScKK2RxYWRkNTM3IGFkZCAnMzQ0NDQ0NDQnICAnNTU1NTU1NTUnIC0+ICc4OTk5OTk5OScKK2RxYWRkNTM4IGFkZCAnMzQ0NDQ0NCcgICc1NTU1NTU1JyAtPiAnODk5OTk5OScKK2RxYWRkNTM5IGFkZCAnMzQ0NDQ0JyAgJzU1NTU1NScgLT4gJzg5OTk5OScKK2RxYWRkNTQwIGFkZCAnMzQ0NDQnICAnNTU1NTUnIC0+ICc4OTk5OScKK2RxYWRkNTQxIGFkZCAnMzQ0NCcgICc1NTU1JyAtPiAnODk5OScKK2RxYWRkNTQyIGFkZCAnMzQ0JyAgJzU1NScgLT4gJzg5OScKK2RxYWRkNTQzIGFkZCAnMzQnICAnNTUnIC0+ICc4OScKK2RxYWRkNTQ0IGFkZCAnMycgICc1JyAtPiAnOCcKKworZHFhZGQ1NDUgYWRkICczMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzMwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc2MDAwMDA0MDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NDYgYWRkICczMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzQwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc3MDAwMDAwNDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NDcgYWRkICczMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzUwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc4MDAwMDAwMDQwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NDggYWRkICc0MDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzMwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc3MDAwMDAwMDA0MDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NDkgYWRkICc0MDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzQwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc4MDAwMDAwMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NTAgYWRkICc0MDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzUwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc5MDAwMDAwMDA0MDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NTEgYWRkICc1MDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzMwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc4MDAwMDAwMDQwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NTIgYWRkICc1MDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzQwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+ICc5MDAwMDAwNDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFhZGQ1NTMgYWRkICc1MDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwJyAgJzUwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIC0+IDEuMDAwMDAwNDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwRSszNCBSb3VuZGVkCistLSBjaGVjayBwcm9wYWdhdGlvbgorZHFhZGQ1NTQgYWRkICc4OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIC0+ICA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWFkZDU1NSBhZGQgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnICAnODk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgLT4gIDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxYWRkNTU2IGFkZCAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICc0NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2JyAtPiAgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFhZGQ1NTcgYWRkICc0NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2JyAgJzQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnIC0+ICA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKKy0tIG5lZ2F0aXZlIHVscHMKK2RxYWRkNjQ0MCBhZGQgICAxICAgLTc3ZS0zMiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0NDEgYWRkICAgMSAgIC03N2UtMzMgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ0MiBhZGQgICAxICAgLTc3ZS0zNCAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ0MyBhZGQgICAxICAgLTc3ZS0zNSAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NDQgYWRkICAgMSAgIC03N2UtMzYgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDQ1IGFkZCAgIDEgICAtNzdlLTM3ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDQ2IGFkZCAgIDEgICAtNzdlLTk5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDY0NTAgYWRkICAxMCAgIC03N2UtMzIgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ1MSBhZGQgIDEwICAgLTc3ZS0zMyAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkNjQ1MiBhZGQgIDEwICAgLTc3ZS0zNCAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0NTMgYWRkICAxMCAgIC03N2UtMzUgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDU0IGFkZCAgMTAgICAtNzdlLTM2ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDU1IGFkZCAgMTAgICAtNzdlLTM3ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDU2IGFkZCAgMTAgICAtNzdlLTk5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDY0NjAgYWRkICAtNzdlLTMyICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NDYxIGFkZCAgLTc3ZS0zMyAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0NjIgYWRkICAtNzdlLTM0ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0NjMgYWRkICAtNzdlLTM1ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDY0IGFkZCAgLTc3ZS0zNiAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ2NSBhZGQgIC03N2UtMzcgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ2NiBhZGQgIC03N2UtOTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQ2NDcwIGFkZCAgLTc3ZS0zMiAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0NzEgYWRkICAtNzdlLTMzICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0NzIgYWRkICAtNzdlLTM0ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDczIGFkZCAgLTc3ZS0zNSAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ3NCBhZGQgIC03N2UtMzYgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ3NSBhZGQgIC03N2UtMzcgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ3NiBhZGQgIC03N2UtOTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworZHFhZGQ2NDgwIGFkZCAgLTEgICAgNzdlLTMyICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0ODEgYWRkICAtMSAgICA3N2UtMzMgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0ODIgYWRkICAtMSAgICA3N2UtMzQgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NDgzIGFkZCAgLTEgICAgNzdlLTM1ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0ODQgYWRkICAtMSAgICA3N2UtMzYgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ4NSBhZGQgIC0xICAgIDc3ZS0zNyAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0ODYgYWRkICAtMSAgICA3N2UtOTkgICAgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDY0OTAgYWRkIC0xMCAgICA3N2UtMzIgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY0OTEgYWRkIC0xMCAgICA3N2UtMzMgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NDkyIGFkZCAtMTAgICAgNzdlLTM0ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0OTMgYWRkIC0xMCAgICA3N2UtMzUgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjQ5NCBhZGQgLTEwICAgIDc3ZS0zNiAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY0OTUgYWRkIC0xMCAgICA3N2UtMzcgICAgICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NDk2IGFkZCAtMTAgICAgNzdlLTk5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQ2NTAwIGFkZCAgIDc3ZS0zMiAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY1MDEgYWRkICAgNzdlLTMzICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY1MDIgYWRkICAgNzdlLTM0ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NTAzIGFkZCAgIDc3ZS0zNSAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1MDQgYWRkICAgNzdlLTM2ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjUwNSBhZGQgICA3N2UtMzcgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1MDYgYWRkICAgNzdlLTk5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDY1MTAgYWRkICAgNzdlLTMyICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDY1MTEgYWRkICAgNzdlLTMzICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQ2NTEyIGFkZCAgIDc3ZS0zNCAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1MTMgYWRkICAgNzdlLTM1ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjUxNCBhZGQgICA3N2UtMzYgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1MTUgYWRkICAgNzdlLTM3ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTE2IGFkZCAgIDc3ZS05OSAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gYW5kIHNvbWUgbW9yZSByZXNpZHVlIGVmZmVjdHMgYW5kIGRpZmZlcmVudCByb3VuZGluZ3MKK3JvdW5kaW5nOiBoYWxmX3VwCitkcWFkZDY1NDAgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JworZHFhZGQ2NTQxIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NDIgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU0MyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTQ0IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NDUgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU0NiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTQ3IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NDggYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU0OSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTUwIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NTEgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU1MiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTUzIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NTQgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU1NSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTU2IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcKK2RxYWRkNjU1NyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTU4IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NTkgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZHFhZGQ2NTYwIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScKK2RxYWRkNjU2MSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTYyIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NjMgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU2NCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTY1IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NjYgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU2NyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTY4IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NjkgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU3MCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTcxIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NzIgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU3MyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTc0IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDY1NzUgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU3NiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnCitkcWFkZDY1NzcgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNjU3OCBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ2NTc5IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkcWFkZDc1NDAgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU0MSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTQyIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OCcgMC41MDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkcWFkZDc1NTAgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JworZHFhZGQ3NTUxIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NTIgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU1MyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTU0IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NTUgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU1NiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTU3IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NTggYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU1OSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTYwIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NjEgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU2MiBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTYzIGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NjQgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzU2NSBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTY2IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcKK2RxYWRkNzU2NyBhZGQgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTY4IGFkZCAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1NjkgYWRkICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gbW9yZSB6ZXJvcywgZXRjLgorcm91bmRpbmc6IGhhbGZfZXZlbgorCitkcWFkZDc3MDEgYWRkIDUuMDAgMS4wMEUtMyAtPiA1LjAwMTAwCitkcWFkZDc3MDIgYWRkIDAwLjAwIDAuMDAwICAtPiAwLjAwMAorZHFhZGQ3NzAzIGFkZCAwMC4wMCAwRS0zICAgLT4gMC4wMDAKK2RxYWRkNzcwNCBhZGQgMEUtMyAgMDAuMDAgIC0+IDAuMDAwCisKK2RxYWRkNzcxMCBhZGQgMEUrMyAgMDAuMDAgIC0+IDAuMDAKK2RxYWRkNzcxMSBhZGQgMEUrMyAgMDAuMCAgIC0+IDAuMAorZHFhZGQ3NzEyIGFkZCAwRSszICAwMC4gICAgLT4gMAorZHFhZGQ3NzEzIGFkZCAwRSszICAwMC5FKzEgLT4gMEUrMQorZHFhZGQ3NzE0IGFkZCAwRSszICAwMC5FKzIgLT4gMEUrMgorZHFhZGQ3NzE1IGFkZCAwRSszICAwMC5FKzMgLT4gMEUrMworZHFhZGQ3NzE2IGFkZCAwRSszICAwMC5FKzQgLT4gMEUrMworZHFhZGQ3NzE3IGFkZCAwRSszICAwMC5FKzUgLT4gMEUrMworZHFhZGQ3NzE4IGFkZCAwRSszICAtMDAuMCAgIC0+IDAuMAorZHFhZGQ3NzE5IGFkZCAwRSszICAtMDAuICAgIC0+IDAKK2RxYWRkNzczMSBhZGQgMEUrMyAgLTAwLkUrMSAtPiAwRSsxCisKK2RxYWRkNzcyMCBhZGQgMDAuMDAgIDBFKzMgIC0+IDAuMDAKK2RxYWRkNzcyMSBhZGQgMDAuMCAgIDBFKzMgIC0+IDAuMAorZHFhZGQ3NzIyIGFkZCAwMC4gICAgMEUrMyAgLT4gMAorZHFhZGQ3NzIzIGFkZCAwMC5FKzEgMEUrMyAgLT4gMEUrMQorZHFhZGQ3NzI0IGFkZCAwMC5FKzIgMEUrMyAgLT4gMEUrMgorZHFhZGQ3NzI1IGFkZCAwMC5FKzMgMEUrMyAgLT4gMEUrMworZHFhZGQ3NzI2IGFkZCAwMC5FKzQgMEUrMyAgLT4gMEUrMworZHFhZGQ3NzI3IGFkZCAwMC5FKzUgMEUrMyAgLT4gMEUrMworZHFhZGQ3NzI4IGFkZCAtMDAuMDAgMEUrMyAgLT4gMC4wMAorZHFhZGQ3NzI5IGFkZCAtMDAuMCAgMEUrMyAgLT4gMC4wCitkcWFkZDc3MzAgYWRkIC0wMC4gICAwRSszICAtPiAwCisKK2RxYWRkNzczMiBhZGQgIDAgICAgIDAgICAgIC0+ICAwCitkcWFkZDc3MzMgYWRkICAwICAgIC0wICAgICAtPiAgMAorZHFhZGQ3NzM0IGFkZCAtMCAgICAgMCAgICAgLT4gIDAKK2RxYWRkNzczNSBhZGQgLTAgICAgLTAgICAgIC0+IC0wICAgICAtLSBJRUVFIDc1NCBzcGVjaWFsIGNhc2UKKworZHFhZGQ3NzM2IGFkZCAgMSAgICAtMSAgICAgLT4gIDAKK2RxYWRkNzczNyBhZGQgLTEgICAgLTEgICAgIC0+IC0yCitkcWFkZDc3MzggYWRkICAxICAgICAxICAgICAtPiAgMgorZHFhZGQ3NzM5IGFkZCAtMSAgICAgMSAgICAgLT4gIDAKKworZHFhZGQ3NzQxIGFkZCAgMCAgICAtMSAgICAgLT4gLTEKK2RxYWRkNzc0MiBhZGQgLTAgICAgLTEgICAgIC0+IC0xCitkcWFkZDc3NDMgYWRkICAwICAgICAxICAgICAtPiAgMQorZHFhZGQ3NzQ0IGFkZCAtMCAgICAgMSAgICAgLT4gIDEKK2RxYWRkNzc0NSBhZGQgLTEgICAgIDAgICAgIC0+IC0xCitkcWFkZDc3NDYgYWRkIC0xICAgIC0wICAgICAtPiAtMQorZHFhZGQ3NzQ3IGFkZCAgMSAgICAgMCAgICAgLT4gIDEKK2RxYWRkNzc0OCBhZGQgIDEgICAgLTAgICAgIC0+ICAxCisKK2RxYWRkNzc1MSBhZGQgIDAuMCAgLTEgICAgIC0+IC0xLjAKK2RxYWRkNzc1MiBhZGQgLTAuMCAgLTEgICAgIC0+IC0xLjAKK2RxYWRkNzc1MyBhZGQgIDAuMCAgIDEgICAgIC0+ICAxLjAKK2RxYWRkNzc1NCBhZGQgLTAuMCAgIDEgICAgIC0+ICAxLjAKK2RxYWRkNzc1NSBhZGQgLTEuMCAgIDAgICAgIC0+IC0xLjAKK2RxYWRkNzc1NiBhZGQgLTEuMCAgLTAgICAgIC0+IC0xLjAKK2RxYWRkNzc1NyBhZGQgIDEuMCAgIDAgICAgIC0+ICAxLjAKK2RxYWRkNzc1OCBhZGQgIDEuMCAgLTAgICAgIC0+ICAxLjAKKworZHFhZGQ3NzYxIGFkZCAgMCAgICAtMS4wICAgLT4gLTEuMAorZHFhZGQ3NzYyIGFkZCAtMCAgICAtMS4wICAgLT4gLTEuMAorZHFhZGQ3NzYzIGFkZCAgMCAgICAgMS4wICAgLT4gIDEuMAorZHFhZGQ3NzY0IGFkZCAtMCAgICAgMS4wICAgLT4gIDEuMAorZHFhZGQ3NzY1IGFkZCAtMSAgICAgMC4wICAgLT4gLTEuMAorZHFhZGQ3NzY2IGFkZCAtMSAgICAtMC4wICAgLT4gLTEuMAorZHFhZGQ3NzY3IGFkZCAgMSAgICAgMC4wICAgLT4gIDEuMAorZHFhZGQ3NzY4IGFkZCAgMSAgICAtMC4wICAgLT4gIDEuMAorCitkcWFkZDc3NzEgYWRkICAwLjAgIC0xLjAgICAtPiAtMS4wCitkcWFkZDc3NzIgYWRkIC0wLjAgIC0xLjAgICAtPiAtMS4wCitkcWFkZDc3NzMgYWRkICAwLjAgICAxLjAgICAtPiAgMS4wCitkcWFkZDc3NzQgYWRkIC0wLjAgICAxLjAgICAtPiAgMS4wCitkcWFkZDc3NzUgYWRkIC0xLjAgICAwLjAgICAtPiAtMS4wCitkcWFkZDc3NzYgYWRkIC0xLjAgIC0wLjAgICAtPiAtMS4wCitkcWFkZDc3NzcgYWRkICAxLjAgICAwLjAgICAtPiAgMS4wCitkcWFkZDc3NzggYWRkICAxLjAgIC0wLjAgICAtPiAgMS4wCisKKy0tIFNwZWNpYWxzCitkcWFkZDc3ODAgYWRkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc4MSBhZGQgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZHFhZGQ3NzgyIGFkZCAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkcWFkZDc3ODMgYWRkIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc4NCBhZGQgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZHFhZGQ3Nzg1IGFkZCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkcWFkZDc3ODYgYWRkIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK2RxYWRkNzc4NyBhZGQgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQ3Nzg4IGFkZCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDc3ODkgYWRkIC0xICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc5MCBhZGQgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQ3NzkxIGFkZCAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDc3OTIgYWRkICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkNzc5MyBhZGQgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQ3Nzk0IGFkZCAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworZHFhZGQ3ODAwIGFkZCAgSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzgwMSBhZGQgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODAyIGFkZCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkcWFkZDc4MDMgYWRkICBJbmYgIC0wICAgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgwNCBhZGQgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODA1IGFkZCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkcWFkZDc4MDYgYWRkICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RxYWRkNzgwNyBhZGQgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODA4IGFkZCAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDc4MDkgYWRkIC1JbmYgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODEwIGFkZCAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDc4MTEgYWRkIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgxMiBhZGQgIDAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQ3ODEzIGFkZCAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDc4MTQgYWRkICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkNzgxNSBhZGQgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkcWFkZDc4MjEgYWRkICBOYU4gLUluZiAgICAtPiAgTmFOCitkcWFkZDc4MjIgYWRkICBOYU4gLTEwMDAgICAtPiAgTmFOCitkcWFkZDc4MjMgYWRkICBOYU4gLTEgICAgICAtPiAgTmFOCitkcWFkZDc4MjQgYWRkICBOYU4gLTAgICAgICAtPiAgTmFOCitkcWFkZDc4MjUgYWRkICBOYU4gIDAgICAgICAtPiAgTmFOCitkcWFkZDc4MjYgYWRkICBOYU4gIDEgICAgICAtPiAgTmFOCitkcWFkZDc4MjcgYWRkICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcWFkZDc4MjggYWRkICBOYU4gIEluZiAgICAtPiAgTmFOCitkcWFkZDc4MjkgYWRkICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzAgYWRkIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzEgYWRkIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzIgYWRkIC0xICAgIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzMgYWRkIC0wICAgIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzQgYWRkICAwICAgIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzUgYWRkICAxICAgIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzYgYWRkICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcWFkZDc4MzcgYWRkICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RxYWRkNzg0MSBhZGQgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NDIgYWRkICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODQzIGFkZCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg0NCBhZGQgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NDUgYWRkICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODQ2IGFkZCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg0NyBhZGQgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NDggYWRkICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODQ5IGFkZCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg1MCBhZGQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NTEgYWRkIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODUyIGFkZCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg1MyBhZGQgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NTQgYWRkIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODU1IGFkZCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg1NiBhZGQgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NTcgYWRkICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQ3ODU4IGFkZCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg1OSBhZGQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxYWRkNzg2MSBhZGQgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitkcWFkZDc4NjIgYWRkICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZHFhZGQ3ODYzIGFkZCAgTmFOMyAgICAxMDAwICAgLT4gIE5hTjMKK2RxYWRkNzg2NCBhZGQgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitkcWFkZDc4NjUgYWRkICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZHFhZGQ3ODY2IGFkZCAtSW5mICAgICBOYU43ICAgLT4gIE5hTjcKK2RxYWRkNzg2NyBhZGQgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitkcWFkZDc4NjggYWRkICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZHFhZGQ3ODY5IGFkZCAgSW5mICAgICtOYU4xMCAgLT4gIE5hTjEwCitkcWFkZDc4NzEgYWRkICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzIgYWRkICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzMgYWRkICBzTmFOMTMgICAxMDAwICAtPiAgTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzQgYWRkICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzUgYWRkICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzYgYWRkICBOYU4xNiAgIHNOYU4xOSAtPiAgTmFOMTkgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzcgYWRkIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzggYWRkIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4NzkgYWRkICAxMDAwICAgIHNOYU4yMiAtPiAgTmFOMjIgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4ODAgYWRkICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4ODEgYWRkICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDc4ODIgYWRkIC1OYU4yNiAgICBOYU4yOCAtPiAtTmFOMjYKK2RxYWRkNzg4MyBhZGQgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkNzg4NCBhZGQgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZHFhZGQ3ODg1IGFkZCAgMTAwMCAgIC1zTmFOMzEgLT4gLU5hTjMxICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBIZXJlIHdlIGV4cGxvcmUgbmVhciB0aGUgYm91bmRhcnkgb2Ygcm91bmRpbmcgYSBzdWJub3JtYWwgdG8gTm1pbgorZHFhZGQ3NTc1IGFkZCAgMUUtNjE0MyAtMUUtNjE3NiAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCBTdWJub3JtYWwKK2RxYWRkNzU3NiBhZGQgLTFFLTYxNDMgKzFFLTYxNzYgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDQgU3Vibm9ybWFsCisKKy0tIGNoZWNrIG92ZXJmbG93IGVkZ2UgY2FzZQorLS0gICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkcWFkZDc5NzIgYXBwbHkgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcWFkZDc5NzMgYWRkICAgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTc0IGFkZCAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDEgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk3NSBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAxRSs2MTExICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk3NiBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA5RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk3NyBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA4RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk3OCBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA3RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk3OSBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA2RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk4MCBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA1RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk4MSBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA0RSs2MTEwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk4MiBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAzRSs2MTEwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk4MyBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAyRSs2MTEwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk4NCBhZGQgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAxRSs2MTEwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQ3OTg1IGFwcGx5ICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxYWRkNzk4NiBhZGQgICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0xICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTg3IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5ODggYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtMUUrNjExMSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTg5IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLTlFKzYxMTAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk5MCBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC04RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5OTEgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtN0UrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTkyIGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLTZFKzYxMTAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk5MyBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC01RSs2MTEwICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5OTQgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtNEUrNjExMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3OTk1IGFkZCAgICAgLTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgLTNFKzYxMTAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzk5NiBhZGQgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0yRSs2MTEwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc5OTcgYWRkICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtMUUrNjExMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorCistLSBBbmQgZm9yIHJvdW5kIGRvd24gZnVsbCBhbmQgc3Vibm9ybWFsIHJlc3VsdHMKK3JvdW5kaW5nOiAgICAgZG93bgorZHFhZGQ3MTEwMCBhZGQgMWUrMiAtMWUtNjE0MyAgICAtPiA5OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMDEgYWRkIDFlKzEgLTFlLTYxNDMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwMyBhZGQgICArMSAtMWUtNjE0MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwNCBhZGQgMWUtMSAtMWUtNjE0MyAgICAtPiAwLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMDUgYWRkIDFlLTIgLTFlLTYxNDMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwNiBhZGQgMWUtMyAtMWUtNjE0MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwNyBhZGQgMWUtNCAtMWUtNjE0MyAgICAtPiAwLjAwMDA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkNzExMDggYWRkIDFlLTUgLTFlLTYxNDMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTEwOSBhZGQgMWUtNiAtMWUtNjE0MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworZHFhZGQ3MTExMCBhZGQgLTFlKzIgKzFlLTYxNDMgICAtPiAtOTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTExIGFkZCAtMWUrMSArMWUtNjE0MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTEzIGFkZCAgICAtMSArMWUtNjE0MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTExNCBhZGQgLTFlLTEgKzFlLTYxNDMgICAtPiAtMC4wOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTE1IGFkZCAtMWUtMiArMWUtNjE0MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTE2IGFkZCAtMWUtMyArMWUtNjE0MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQ3MTExNyBhZGQgLTFlLTQgKzFlLTYxNDMgICAtPiAtMC4wMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTE4IGFkZCAtMWUtNSArMWUtNjE0MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDcxMTE5IGFkZCAtMWUtNiArMWUtNjE0MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCityb3VuZGluZzogICAgIGhhbGZfZXZlbgorCitkcWFkZDcxMzAwIGFkZCAxRTM0ICAtMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMxMCBhZGQgMUUzNCAgLTAuNTEgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMTEgYWRkIDFFMzQgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzEyIGFkZCAxRTM0ICAtMC41MDAxICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMxMyBhZGQgMUUzNCAgLTAuNTAwMDEgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMTQgYWRkIDFFMzQgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzE1IGFkZCAxRTM0ICAtMC41MDAwMDAxICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMxNiBhZGQgMUUzNCAgLTAuNTAwMDAwMDEgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMTcgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzE4IGFkZCAxRTM0ICAtMC41MDAwMDAwMDAxICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMxOSBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMjAgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzIxIGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMDAxICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMyMiBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMjMgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzI0IGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMyNSBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMjYgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzI3IGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMyOCBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMjkgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzMwIGFkZCAxRTM0ICAtMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMzMSBhZGQgMUUzNCAgLTAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMzIgYWRkIDFFMzQgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzMzIGFkZCAxRTM0ICAtMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMzNCBhZGQgMUUzNCAgLTAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMzUgYWRkIDFFMzQgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzM2IGFkZCAxRTM0ICAtMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTMzNyBhZGQgMUUzNCAgLTAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzMzggYWRkIDFFMzQgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzM5IGFkZCAxRTM0ICAtMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorCitkcWFkZDcxMzQwIGFkZCAxRTM0ICAtNTAwMDAwMC4wMDAwMTAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM0MSBhZGQgMUUzNCAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQ3MTM0OSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQgICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzUwIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDkgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNTEgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM1MiBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTkgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzUzIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTkgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNTQgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM1NSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTkgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzU2IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTkgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNTcgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM1OCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTkgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzU5IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTkgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNjAgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM2MSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzYyIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTkgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNjMgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM2NCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OTkgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzY1IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNjcgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM2OCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzY5IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNzAgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM3MSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzcyIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNzMgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM3NCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzc1IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNzYgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM3NyBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzc4IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzNzkgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM4MCBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzgxIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzODIgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM4MyBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzg0IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzODUgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM4NiBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzg3IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzODggYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM4OSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMSAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzkwIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDEgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzOTEgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM5MiBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMSAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzkzIGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDEgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzEzOTQgYWRkIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3MTM5NSBhZGQgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMSAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDcxMzk2IGFkZCA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTEgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKKworLS0gTW9yZSBHRCBlZGdlIGNhc2VzLCB3aGVyZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHVuYWRqdXN0ZWQKKy0tIGV4cG9uZW50cyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBwcmVjaXNpb24gYW5kIG9uZSBzaWRlIGlzIDAKK2RxYWRkNzE0MjAgYWRkICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQyMSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEgIC0+IDAuMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQyMiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIgIC0+IDAuMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkNzE0MjMgYWRkICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQyNCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTQgIC0+IDAuMDAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQyNSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTUgIC0+IDAuMDAwMDExMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkNzE0MjYgYWRkICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQyNyBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTcgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS03CitkcWFkZDcxNDI4IGFkZCAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtOCAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTgKK2RxYWRkNzE0MjkgYWRkICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtOQorZHFhZGQ3MTQzMCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZHFhZGQ3MTQzMSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTExIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMQorZHFhZGQ3MTQzMiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZHFhZGQ3MTQzMyBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEzIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMworZHFhZGQ3MTQzNCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE0IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNAorZHFhZGQ3MTQzNSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZHFhZGQ3MTQzNiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE2IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZHFhZGQ3MTQzNyBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE3IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNworZHFhZGQ3MTQzOCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZHFhZGQ3MTQzOSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE5IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOQorZHFhZGQ3MTQ0MCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMAorZHFhZGQ3MTQ0MSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMQorZHFhZGQ3MTQ0MiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIyIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMgorZHFhZGQ3MTQ0MyBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIzIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMworZHFhZGQ3MTQ0NCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNAorZHFhZGQ3MTQ0NSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI1IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNQorZHFhZGQ3MTQ0NiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI2IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNgorZHFhZGQ3MTQ0NyBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNworZHFhZGQ3MTQ0OCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI4IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOAorZHFhZGQ3MTQ0OSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI5IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOQorZHFhZGQ3MTQ1MCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMAorZHFhZGQ3MTQ1MSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMxIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMQorZHFhZGQ3MTQ1MiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMyIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMgorZHFhZGQ3MTQ1MyBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMworZHFhZGQ3MTQ1NCBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM0IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNAorZHFhZGQ3MTQ1NSBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM1IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNQorZHFhZGQ3MTQ1NiBhZGQgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNgorCistLSBzYW1lLCByZXZlcnNlZCAwCitkcWFkZDcxNDYwIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgICAgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQ2MSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDYyIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDYzIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMyAgMCAtPiAwLjAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQ2NCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDY1IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDcxNDY2IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNiAgMCAtPiAwLjAwMDAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTQ2NyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTcKK2RxYWRkNzE0NjggYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS04CitkcWFkZDcxNDY5IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtOSAgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtOQorZHFhZGQ3MTQ3MCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEwCitkcWFkZDcxNDcxIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTEKK2RxYWRkNzE0NzIgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZHFhZGQ3MTQ3MyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEzCitkcWFkZDcxNDc0IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTQKK2RxYWRkNzE0NzUgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZHFhZGQ3MTQ3NiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE2CitkcWFkZDcxNDc3IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTcKK2RxYWRkNzE0NzggYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZHFhZGQ3MTQ3OSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE5CitkcWFkZDcxNDgwIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjAgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjAKK2RxYWRkNzE0ODEgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMQorZHFhZGQ3MTQ4MiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIyIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIyCitkcWFkZDcxNDgzIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjMgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjMKK2RxYWRkNzE0ODQgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNAorZHFhZGQ3MTQ4NSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI1IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI1CitkcWFkZDcxNDg2IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjYgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjYKK2RxYWRkNzE0ODcgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNyAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNworZHFhZGQ3MTQ4OCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI4IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI4CitkcWFkZDcxNDg5IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjkgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjkKK2RxYWRkNzE0OTAgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMAorZHFhZGQ3MTQ5MSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMxIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMxCitkcWFkZDcxNDkyIGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzIgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzIKK2RxYWRkNzE0OTMgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMyAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMworZHFhZGQ3MTQ5NCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM0IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM0CitkcWFkZDcxNDk1IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzUgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzUKK2RxYWRkNzE0OTYgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNgorCistLSBzYW1lLCBFcyBvbiB0aGUgMAorZHFhZGQ3MTUwMCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTAgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwMSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwMiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTIgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwMyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwNCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTQgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwNSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTUgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwNiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTYgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwNyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTcgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwOCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTggICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUwOSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTkgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxMCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEwICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxMSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTExICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxMiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEyICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxMyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEzICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxNCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE0ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxNSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE1ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxNiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE2ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxNyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE3ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxOCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUxOSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE5ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyMCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTIwICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyMSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTIxICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyMiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTIyICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyMyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTIzICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyNCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI0ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyNSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI1ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyNiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI2ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyNyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI3ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyOCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI4ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUyOSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI5ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUzMCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMwICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUzMSBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMxICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUzMiBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMyICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQ3MTUzMyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMzICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorLS0gbmV4dCBmb3VyIGZsYWcgUm91bmRlZCBiZWNhdXNlIHRoZSAwIGV4dGVuZHMgdGhlIHJlc3VsdAorZHFhZGQ3MTUzNCBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTM0ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkcWFkZDcxNTM1IGFkZCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzUgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RxYWRkNzE1MzYgYWRkIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zNiAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZHFhZGQ3MTUzNyBhZGQgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTM3ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCisKKy0tIHN1bSBvZiB0d28gb3Bwb3NpdGUtc2lnbiBvcGVyYW5kcyBpcyBleGFjdGx5IDAgYW5kIGZsb29yID0+IC0wCityb3VuZGluZzogICAgaGFsZl91cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZHFhZGQ3MTYwMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2MDEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjAyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTYwMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDcxNjExIGFkZCAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQ3MTYxMiBhZGQgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZHFhZGQ3MTYyMCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2MjEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjIyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTYyMyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDcxNjMxIGFkZCAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQ3MTYzMiBhZGQgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZHFhZGQ3MTY0MCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2NDEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjQyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTY0MyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDcxNjUxIGFkZCAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQ3MTY1MiBhZGQgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIHVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDcxNjYwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTY2MSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2NjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjYzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkNzE2NzEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDcxNjcyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgMAorCityb3VuZGluZzogICAgZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZHFhZGQ3MTY4MCBhZGQgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE2ODEgYWRkIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNjgyIGFkZCAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTY4MyBhZGQgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDcxNjkxIGFkZCAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQ3MTY5MiBhZGQgIDExICAgICAtMTEgICAgLT4gIDAKKworcm91bmRpbmc6ICAgIGNlaWxpbmcKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkNzE3MDAgYWRkICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDcxNzAxIGFkZCAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTcwMiBhZGQgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkNzE3MDMgYWRkIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQ3MTcxMSBhZGQgLTExICAgICAgMTEgICAgLT4gIDAKK2RxYWRkNzE3MTIgYWRkICAxMSAgICAgLTExICAgIC0+ICAwCisKKy0tIGFuZCB0aGUgZXh0cmEtc3BlY2lhbCB1Z2x5IGNhc2U7IHVudXN1YWwgbWludXNlcyBtYXJrZWQgYnkgLS0gKgorcm91bmRpbmc6ICAgIGZsb29yCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDcxNzIwIGFkZCAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQ3MTcyMSBhZGQgLTAgICAgICAgIDBFLTE5ICAtPiAtMEUtMTkgICAgICAgICAgIC0tICoKK2RxYWRkNzE3MjIgYWRkICAwICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitkcWFkZDcxNzIzIGFkZCAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkNzE3MzEgYWRkIC0xMSAgICAgIDExICAgIC0+ICAtMCAgICAgICAgICAgICAgICAtLSAqCitkcWFkZDcxNzMyIGFkZCAgMTEgICAgIC0xMSAgICAtPiAgLTAgICAgICAgICAgICAgICAgLS0gKgorCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK2RxYWRkNzE3NDEgYWRkIDEzMEUtMiAgICAxMjBFLTIgICAgLT4gMi41MAorZHFhZGQ3MTc0MiBhZGQgMTMwRS0yICAgIDEyRS0xICAgICAtPiAyLjUwCitkcWFkZDcxNzQzIGFkZCAxMzBFLTIgICAgMUUwICAgICAgIC0+IDIuMzAKK2RxYWRkNzE3NDQgYWRkIDFFMiAgICAgICAxRTQgICAgICAgLT4gMS4wMUUrNAorZHFhZGQ3MTc0NSBhZGQgMTMwRS0yICAgLTEyMEUtMiAtPiAwLjEwCitkcWFkZDcxNzQ2IGFkZCAxMzBFLTIgICAtMTJFLTEgIC0+IDAuMTAKK2RxYWRkNzE3NDcgYWRkIDEzMEUtMiAgIC0xRTAgICAgLT4gMC4zMAorZHFhZGQ3MTc0OCBhZGQgMUUyICAgICAgLTFFNCAgICAtPiAtOS45RSszCisKKy0tIEdhcHB5IGNvZWZmaWNpZW50czsgY2hlY2sgcmVzaWR1ZSBoYW5kbGluZyBldmVuIHdpdGggZnVsbCBjb2VmZmljaWVudCBnYXAKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworZHFhZGQ3NTAwMSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NworZHFhZGQ3NTAwMiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAwLjYgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NyAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDAzIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDAuMDYgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMDQgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMyAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAwNSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS00ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDA2IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTUgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMDcgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtNiAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAwOCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS03ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDA5IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTggICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMTAgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtOSAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAxMSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xMCAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDEyIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTExICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMTMgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTIgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAxNCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xMyAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDE1IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE0ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMTYgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTUgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAxNyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xNiAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDE4IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE3ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwMTkgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTggIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTAyMCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xOSAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDIxIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTIwICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gd2lkZW5pbmcgc2Vjb25kIGFyZ3VtZW50IGF0IGdhcAorZHFhZGQ3NTAzMCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMSAgICAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzkKK2RxYWRkNzUwMzEgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMSAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEKK2RxYWRkNzUwMzIgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIgICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyCitkcWFkZDc1MDMzIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMyAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjMKK2RxYWRkNzUwMzQgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNCAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQKK2RxYWRkNzUwMzUgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDUgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1CitkcWFkZDc1MDM2IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1NiAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTYKK2RxYWRkNzUwMzcgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2NyAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1NjcKK2RxYWRkNzUwMzggYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2NzggICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc4CitkcWFkZDc1MDM5IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4OSAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNDAgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1ICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA0MSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDQyIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTEgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNDMgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDEgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA0NCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDEgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDQ1IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMDEgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNDYgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDEgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA0NyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDAwMDEgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDQ4IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNDkgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAxMjM0NTYKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RxYWRkNzUwNTAgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA1MSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDUyIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNTMgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA1NCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDY3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDU1IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNTYgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA1NyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDAwMDUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDYwIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNjEgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA2MiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDA0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDYzIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNjQgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA2NSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDA3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDY2IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNjcgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorLS0gZmFyLW91dCByZXNpZHVlcyAoZnVsbCBjb2VmZmljaWVudCBnYXAgaXMgMTYrMTUgZGlnaXRzKQorcm91bmRpbmc6IHVwCitkcWFkZDc1MDcwIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS04ICAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMQorZHFhZGQ3NTA3MSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtOSAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDcyIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xMCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNzMgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTExICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA3NCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTIgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDc1IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xMyAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNzYgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA3NyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTUgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDc4IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xNiAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwNzkgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE3ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA4MCBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTggICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDgxIGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xOSAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwODIgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTIwICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA4MyBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMjUgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDg0IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zMCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwODUgYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTMxICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA4NiBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzIgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDc1MDg3IGFkZCAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zMyAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkNzUwODggYWRkIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTM0ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQ3NTA4OSBhZGQgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzUgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIE51bGwgdGVzdHMKK2RxYWRkOTk5MCBhZGQgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDk5OTEgYWRkICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUFuZC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUFuZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDliYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQW5kLmRlY1Rlc3QKQEAgLTAsMCArMSw0MjAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFBbmQuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBBTkQgZm9yIGRlY1F1YWRzICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQorZHFhbmQwMDEgYW5kICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCitkcWFuZDAwMiBhbmQgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDAKK2RxYW5kMDAzIGFuZCAgICAgICAgICAgICAxICAgIDAgLT4gICAgMAorZHFhbmQwMDQgYW5kICAgICAgICAgICAgIDEgICAgMSAtPiAgICAxCitkcWFuZDAwNSBhbmQgICAgICAgICAgMTEwMCAxMDEwIC0+IDEwMDAKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCistLSAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFhbmQwMDYgYW5kIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RxYW5kMDA3IGFuZCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkcWFuZDAwOCBhbmQgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZHFhbmQwMDkgYW5kIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxYW5kMDEwIGFuZCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAwCitkcWFuZDAxMSBhbmQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgMAorZHFhbmQwMTIgYW5kIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgICAgICAgIDAKK2RxYW5kMDEzIGFuZCAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKKy0tIFZhcmlvdXMgbGVuZ3RocworLS0gICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworZHFhbmQ2MDEgYW5kIDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDIgYW5kIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDMgYW5kIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDQgYW5kIDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDUgYW5kIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDYgYW5kIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDcgYW5kIDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDggYW5kIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MDkgYW5kIDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTAgYW5kIDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTEgYW5kIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTIgYW5kIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTMgYW5kIDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTQgYW5kIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTUgYW5kIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTYgYW5kIDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMQorZHFhbmQ2MTcgYW5kIDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMQorZHFhbmQ2MTggYW5kIDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMQorZHFhbmQ2MTkgYW5kIDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMQorZHFhbmQ2MjAgYW5kIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMQorZHFhbmQ2MjEgYW5kIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMQorZHFhbmQ2MjIgYW5kIDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMQorZHFhbmQ2MjMgYW5kIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMQorZHFhbmQ2MjQgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMQorZHFhbmQ2MjUgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMQorZHFhbmQ2MjYgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMQorZHFhbmQ2MjcgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMQorZHFhbmQ2MjggYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMQorZHFhbmQ2MjkgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMQorZHFhbmQ2MzAgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMQorZHFhbmQ2MzEgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMQorZHFhbmQ2MzIgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMQorZHFhbmQ2MzMgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMQorZHFhbmQ2MzQgYW5kIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMAorCitkcWFuZDY0MSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0MiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0MyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0NCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0NSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0NiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0NyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0OCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY0OSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY1MCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY1MSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY1MiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY1MyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExCitkcWFuZDY1NCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExCitkcWFuZDY1NSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExCitkcWFuZDY1NiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExCitkcWFuZDY1NyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExCitkcWFuZDY1OCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExCitkcWFuZDY1OSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExCitkcWFuZDY2MCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExCitkcWFuZDY2MSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExCitkcWFuZDY2MiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExCitkcWFuZDY2MyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExCitkcWFuZDY2NCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExCitkcWFuZDY2NSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExCitkcWFuZDY2NiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExCitkcWFuZDY2NyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExCitkcWFuZDY2OCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExCitkcWFuZDY2OSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExCitkcWFuZDY3MCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExCitkcWFuZDY3MSBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExCitkcWFuZDY3MiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExCitkcWFuZDY3MyBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxCitkcWFuZDY3NCBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwCitkcWFuZDY3NSBhbmQgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwCitkcWFuZDY3NiBhbmQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwCisKK2RxYW5kMDIxIGFuZCAxMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTEgIC0+ICAxMTExMTExMTExMTExMTExCitkcWFuZDAyNCBhbmQgMTExMTExMTExMTExMTExMSAgMTExMTExMTExMTExMTExICAtPiAgIDExMTExMTExMTExMTExMQorZHFhbmQwMjUgYW5kIDExMTExMTExMTExMTExMTEgICAxMTExMTExMTExMTExMSAgLT4gICAgMTExMTExMTExMTExMTEKK2RxYW5kMDI2IGFuZCAxMTExMTExMTExMTExMTExICAgIDExMTExMTExMTExMTEgIC0+ICAgICAxMTExMTExMTExMTExCitkcWFuZDAyNyBhbmQgMTExMTExMTExMTExMTExMSAgICAgMTExMTExMTExMTExICAtPiAgICAgIDExMTExMTExMTExMQorZHFhbmQwMjggYW5kIDExMTExMTExMTExMTExMTEgICAgICAxMTExMTExMTExMSAgLT4gICAgICAgMTExMTExMTExMTEKK2RxYW5kMDI5IGFuZCAxMTExMTExMTExMTExMTExICAgICAgIDExMTExMTExMTEgIC0+ICAgICAgICAxMTExMTExMTExCitkcWFuZDAzMCBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgMTExMTExMTExICAtPiAgICAgICAgIDExMTExMTExMQorZHFhbmQwMzEgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAxMTExMTExMSAgLT4gICAgICAgICAgMTExMTExMTEKK2RxYW5kMDMyIGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgIDExMTExMTEgIC0+ICAgICAgICAgICAxMTExMTExCitkcWFuZDAzMyBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgMTExMTExICAtPiAgICAgICAgICAgIDExMTExMQorZHFhbmQwMzQgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAxMTExMSAgLT4gICAgICAgICAgICAgMTExMTEKK2RxYW5kMDM1IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgIDExMTEgIC0+ICAgICAgICAgICAgICAxMTExCitkcWFuZDAzNiBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgICAgMTExICAtPiAgICAgICAgICAgICAgIDExMQorZHFhbmQwMzcgYW5kIDExMTExMTExMTExMTExMTEgICAgICAgICAgICAgICAxMSAgLT4gICAgICAgICAgICAgICAgMTEKK2RxYW5kMDM4IGFuZCAxMTExMTExMTExMTExMTExICAgICAgICAgICAgICAgIDEgIC0+ICAgICAgICAgICAgICAgICAxCitkcWFuZDAzOSBhbmQgMTExMTExMTExMTExMTExMSAgICAgICAgICAgICAgICAwICAtPiAgICAgICAgICAgICAgICAgMAorCitkcWFuZDA0MCBhbmQgMTExMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAxMTExMTExMTExMTExMTExCitkcWFuZDA0MSBhbmQgIDExMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgMTExMTExMTExMTExMTExCitkcWFuZDA0MiBhbmQgIDExMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgMTExMTExMTExMTExMTExCitkcWFuZDA0MyBhbmQgICAxMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgIDExMTExMTExMTExMTExCitkcWFuZDA0NCBhbmQgICAgMTExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAxMTExMTExMTExMTExCitkcWFuZDA0NSBhbmQgICAgIDExMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgMTExMTExMTExMTExCitkcWFuZDA0NiBhbmQgICAgICAxMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgIDExMTExMTExMTExCitkcWFuZDA0NyBhbmQgICAgICAgMTExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAxMTExMTExMTExCitkcWFuZDA0OCBhbmQgICAgICAgIDExMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgMTExMTExMTExCitkcWFuZDA0OSBhbmQgICAgICAgICAxMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgIDExMTExMTExCitkcWFuZDA1MCBhbmQgICAgICAgICAgMTExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAxMTExMTExCitkcWFuZDA1MSBhbmQgICAgICAgICAgIDExMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgMTExMTExCitkcWFuZDA1MiBhbmQgICAgICAgICAgICAxMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgIDExMTExCitkcWFuZDA1MyBhbmQgICAgICAgICAgICAgMTExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAxMTExCitkcWFuZDA1NCBhbmQgICAgICAgICAgICAgIDExMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgMTExCitkcWFuZDA1NSBhbmQgICAgICAgICAgICAgICAxMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgIDExCitkcWFuZDA1NiBhbmQgICAgICAgICAgICAgICAgMSAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgICAxCitkcWFuZDA1NyBhbmQgICAgICAgICAgICAgICAgMCAgICAxMTExMTExMTExMTExMTExIC0+ICAgICAgICAgICAgICAgICAwCisKK2RxYW5kMTUwIGFuZCAxMTExMTExMTExICAxICAtPiAgMQorZHFhbmQxNTEgYW5kICAxMTExMTExMTEgIDEgIC0+ICAxCitkcWFuZDE1MiBhbmQgICAxMTExMTExMSAgMSAgLT4gIDEKK2RxYW5kMTUzIGFuZCAgICAxMTExMTExICAxICAtPiAgMQorZHFhbmQxNTQgYW5kICAgICAxMTExMTEgIDEgIC0+ICAxCitkcWFuZDE1NSBhbmQgICAgICAxMTExMSAgMSAgLT4gIDEKK2RxYW5kMTU2IGFuZCAgICAgICAxMTExICAxICAtPiAgMQorZHFhbmQxNTcgYW5kICAgICAgICAxMTEgIDEgIC0+ICAxCitkcWFuZDE1OCBhbmQgICAgICAgICAxMSAgMSAgLT4gIDEKK2RxYW5kMTU5IGFuZCAgICAgICAgICAxICAxICAtPiAgMQorCitkcWFuZDE2MCBhbmQgMTExMTExMTExMSAgMCAgLT4gIDAKK2RxYW5kMTYxIGFuZCAgMTExMTExMTExICAwICAtPiAgMAorZHFhbmQxNjIgYW5kICAgMTExMTExMTEgIDAgIC0+ICAwCitkcWFuZDE2MyBhbmQgICAgMTExMTExMSAgMCAgLT4gIDAKK2RxYW5kMTY0IGFuZCAgICAgMTExMTExICAwICAtPiAgMAorZHFhbmQxNjUgYW5kICAgICAgMTExMTEgIDAgIC0+ICAwCitkcWFuZDE2NiBhbmQgICAgICAgMTExMSAgMCAgLT4gIDAKK2RxYW5kMTY3IGFuZCAgICAgICAgMTExICAwICAtPiAgMAorZHFhbmQxNjggYW5kICAgICAgICAgMTEgIDAgIC0+ICAwCitkcWFuZDE2OSBhbmQgICAgICAgICAgMSAgMCAgLT4gIDAKKworZHFhbmQxNzAgYW5kIDEgIDExMTExMTExMTEgIC0+ICAxCitkcWFuZDE3MSBhbmQgMSAgIDExMTExMTExMSAgLT4gIDEKK2RxYW5kMTcyIGFuZCAxICAgIDExMTExMTExICAtPiAgMQorZHFhbmQxNzMgYW5kIDEgICAgIDExMTExMTEgIC0+ICAxCitkcWFuZDE3NCBhbmQgMSAgICAgIDExMTExMSAgLT4gIDEKK2RxYW5kMTc1IGFuZCAxICAgICAgIDExMTExICAtPiAgMQorZHFhbmQxNzYgYW5kIDEgICAgICAgIDExMTEgIC0+ICAxCitkcWFuZDE3NyBhbmQgMSAgICAgICAgIDExMSAgLT4gIDEKK2RxYW5kMTc4IGFuZCAxICAgICAgICAgIDExICAtPiAgMQorZHFhbmQxNzkgYW5kIDEgICAgICAgICAgIDEgIC0+ICAxCisKK2RxYW5kMTgwIGFuZCAwICAxMTExMTExMTExICAtPiAgMAorZHFhbmQxODEgYW5kIDAgICAxMTExMTExMTEgIC0+ICAwCitkcWFuZDE4MiBhbmQgMCAgICAxMTExMTExMSAgLT4gIDAKK2RxYW5kMTgzIGFuZCAwICAgICAxMTExMTExICAtPiAgMAorZHFhbmQxODQgYW5kIDAgICAgICAxMTExMTEgIC0+ICAwCitkcWFuZDE4NSBhbmQgMCAgICAgICAxMTExMSAgLT4gIDAKK2RxYW5kMTg2IGFuZCAwICAgICAgICAxMTExICAtPiAgMAorZHFhbmQxODcgYW5kIDAgICAgICAgICAxMTEgIC0+ICAwCitkcWFuZDE4OCBhbmQgMCAgICAgICAgICAxMSAgLT4gIDAKK2RxYW5kMTg5IGFuZCAwICAgICAgICAgICAxICAtPiAgMAorCitkcWFuZDA5MCBhbmQgMDExMTExMTExICAxMTExMTExMTEgIC0+ICAgMTExMTExMTEKK2RxYW5kMDkxIGFuZCAxMDExMTExMTEgIDExMTExMTExMSAgLT4gIDEwMTExMTExMQorZHFhbmQwOTIgYW5kIDExMDExMTExMSAgMTExMTExMTExICAtPiAgMTEwMTExMTExCitkcWFuZDA5MyBhbmQgMTExMDExMTExICAxMTExMTExMTEgIC0+ICAxMTEwMTExMTEKK2RxYW5kMDk0IGFuZCAxMTExMDExMTEgIDExMTExMTExMSAgLT4gIDExMTEwMTExMQorZHFhbmQwOTUgYW5kIDExMTExMDExMSAgMTExMTExMTExICAtPiAgMTExMTEwMTExCitkcWFuZDA5NiBhbmQgMTExMTExMDExICAxMTExMTExMTEgIC0+ICAxMTExMTEwMTEKK2RxYW5kMDk3IGFuZCAxMTExMTExMDEgIDExMTExMTExMSAgLT4gIDExMTExMTEwMQorZHFhbmQwOTggYW5kIDExMTExMTExMCAgMTExMTExMTExICAtPiAgMTExMTExMTEwCisKK2RxYW5kMTAwIGFuZCAxMTExMTExMTEgIDAxMTExMTExMSAgLT4gICAxMTExMTExMQorZHFhbmQxMDEgYW5kIDExMTExMTExMSAgMTAxMTExMTExICAtPiAgMTAxMTExMTExCitkcWFuZDEwMiBhbmQgMTExMTExMTExICAxMTAxMTExMTEgIC0+ICAxMTAxMTExMTEKK2RxYW5kMTAzIGFuZCAxMTExMTExMTEgIDExMTAxMTExMSAgLT4gIDExMTAxMTExMQorZHFhbmQxMDQgYW5kIDExMTExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTAxMTExCitkcWFuZDEwNSBhbmQgMTExMTExMTExICAxMTExMTAxMTEgIC0+ICAxMTExMTAxMTEKK2RxYW5kMTA2IGFuZCAxMTExMTExMTEgIDExMTExMTAxMSAgLT4gIDExMTExMTAxMQorZHFhbmQxMDcgYW5kIDExMTExMTExMSAgMTExMTExMTAxICAtPiAgMTExMTExMTAxCitkcWFuZDEwOCBhbmQgMTExMTExMTExICAxMTExMTExMTAgIC0+ICAxMTExMTExMTAKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitkcWFuZDIyMCBhbmQgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjIxIGFuZCAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMjIgYW5kIDU1NTU1NTU1NSAgNTU1NTU1NTU1ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIyMyBhbmQgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjI0IGFuZCA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMjUgYW5kIDIyMjIyMjIyMiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIyNiBhbmQgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjI3IGFuZCA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMjggYW5kIDg4ODg4ODg4OCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIyOSBhbmQgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjMwIGFuZCA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyMzEgYW5kIDk5OTk5OTk5OSAgNjY2NjY2NjY2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDIzMiBhbmQgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2RxYW5kMjQwIGFuZCAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNDEgYW5kICA1NjczNjc2ODkgIDkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI0MiBhbmQgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjQzIGFuZCAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNDQgYW5kICA4MzU1OTAxNDkgIDU2NzQzNTQwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAorZHFhbmQyNTAgYW5kICAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTEgYW5kICA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTIgYW5kICA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTMgYW5kICA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTQgYW5kICAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTUgYW5kICA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTYgYW5kICA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTcgYW5kICA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTggYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNTkgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNjAgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNjEgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNjIgYW5kICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNjMgYW5kICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNjQgYW5kICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNjUgYW5kICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZHFhbmQyNzAgYW5kICAwMjAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNzEgYW5kICAwNzAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNzIgYW5kICAwODAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNzMgYW5kICAwOTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNzQgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMTAwMDAwIDAyMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNzUgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDEwMDAwIDA3MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNzYgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAxMDAwIDA4MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyNzcgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMTAwIDA5MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK2RxYW5kMjgwIGFuZCAgMDAxMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMiAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjgxIGFuZCAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwNyAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjgyIGFuZCAgMDAwMDAwMDExMTAwMDExMTAwMDExMTEwMDAwMDAwMDAwOCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjgzIGFuZCAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAxMDAwMDAwMDAwOSAxMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjg0IGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwMCAwMDAxMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjg1IGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA3IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjg2IGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAwMTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjg3IGFuZCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCitkcWFuZDI4OCBhbmQgIDAwMTAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMjAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI4OSBhbmQgIDAwMDEwMDAxMTEwMDAxMTEwMDAxMTEwMDAwNzAwMDAwMDEgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5MCBhbmQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwODAwMDAwMTAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5MSBhbmQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwOTAwMDAxMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5MiBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDEwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAyMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5MyBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMTAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA3MDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5NCBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAxMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA4MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5NSBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA5MDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworZHFhbmQyOTYgYW5kIC0xMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0wMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMjk3IGFuZCAtMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAgMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDI5OCBhbmQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQyOTkgYW5kICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwICAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDExMDAwMTAwIC0+ICAxMTAwMDAxMTAwMDAxMTAwMDAwMDEwMDAwMDAKKworLS0gTm1heCwgTm1pbiwgTnRpbnktbGlrZQorZHFhbmQzMzEgYW5kICAyICAgOS45OTk5OTk5OUUrOTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzMyIGFuZCAgMyAgIDFFLTk5OSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDMzMyBhbmQgIDQgICAxLjAwMDAwMDAwRS05OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzMzQgYW5kICA1ICAgMUUtOTAwICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzM1IGFuZCAgNiAgIC0xRS05MDAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDMzNiBhbmQgIDcgICAtMS4wMDAwMDAwMEUtOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzMzcgYW5kICA4ICAgLTFFLTk5OSAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzM4IGFuZCAgOSAgIC05Ljk5OTk5OTk5RSs5OTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM0MSBhbmQgIDkuOTk5OTk5OTlFKzk5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNDIgYW5kICAxRS05OTkgICAgICAgICAgICAgICAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzQzIGFuZCAgMS4wMDAwMDAwMEUtOTk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM0NCBhbmQgIDFFLTkwMCAgICAgICAgICAgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNDUgYW5kICAtMUUtOTAwICAgICAgICAgICAgIC0xMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzQ2IGFuZCAgLTEuMDAwMDAwMDBFLTk5OSAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM0NyBhbmQgIC0xRS05OTkgICAgICAgICAgICAgIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNDggYW5kICAtOS45OTk5OTk5OUUrOTk5ICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCitkcWFuZDM2MSBhbmQgIDEuMCAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNjIgYW5kICAxRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzYzIGFuZCAgMC4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM2NCBhbmQgIDBFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNjUgYW5kICA5LjkgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzY2IGFuZCAgOUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM3MSBhbmQgIDAgMS4wICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNzIgYW5kICAwIDFFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzczIGFuZCAgMCAwLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDM3NCBhbmQgIDAgMEUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQzNzUgYW5kICAwIDkuOSAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kMzc2IGFuZCAgMCA5RSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK2RxYW5kNzgwIGFuZCAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc4MSBhbmQgLUluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3ODIgYW5kIC1JbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzgzIGFuZCAtSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc4NCBhbmQgLUluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3ODUgYW5kIC1JbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzg2IGFuZCAtSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc4NyBhbmQgLTEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3ODggYW5kIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzg5IGFuZCAtMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc5MCBhbmQgLTAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3OTEgYW5kICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kNzkyIGFuZCAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDc5MyBhbmQgIDEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ3OTQgYW5kICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFhbmQ4MDAgYW5kICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODAxIGFuZCAgSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgwMiBhbmQgIEluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MDMgYW5kICBJbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODA0IGFuZCAgSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgwNSBhbmQgIEluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MDYgYW5kICBJbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODA3IGFuZCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgwOCBhbmQgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MDkgYW5kIC1JbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODEwIGFuZCAtMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgxMSBhbmQgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MTIgYW5kICAwICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODEzIGFuZCAgMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgxNCBhbmQgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MTUgYW5kICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFhbmQ4MjEgYW5kICBOYU4gLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODIyIGFuZCAgTmFOIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgyMyBhbmQgIE5hTiAtMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MjQgYW5kICBOYU4gLTAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODI1IGFuZCAgTmFOICAwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgyNiBhbmQgIE5hTiAgMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MjcgYW5kICBOYU4gIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODI4IGFuZCAgTmFOICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgyOSBhbmQgIE5hTiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MzAgYW5kIC1JbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODMxIGFuZCAtMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgzMiBhbmQgLTEgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MzMgYW5kIC0wICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODM0IGFuZCAgMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDgzNSBhbmQgIDEgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4MzYgYW5kICAxMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODM3IGFuZCAgSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxYW5kODQxIGFuZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQyIGFuZCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQzIGFuZCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQ0IGFuZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQ1IGFuZCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQ2IGFuZCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQ3IGFuZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQ4IGFuZCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODQ5IGFuZCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODUwIGFuZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODUxIGFuZCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODUyIGFuZCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODUzIGFuZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODU0IGFuZCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODU1IGFuZCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODU2IGFuZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODU3IGFuZCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODU4IGFuZCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODU5IGFuZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFhbmQ4NjEgYW5kICBOYU4xICAgLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODYyIGFuZCArTmFOMiAgIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg2MyBhbmQgIE5hTjMgICAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NjQgYW5kICBOYU40ICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODY1IGFuZCAgTmFONSAgICtOYU42ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg2NiBhbmQgLUluZiAgICAgTmFONyAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NjcgYW5kIC0xMDAwICAgIE5hTjggICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODY4IGFuZCAgMTAwMCAgICBOYU45ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg2OSBhbmQgIEluZiAgICArTmFOMTAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NzEgYW5kICBzTmFOMTEgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODcyIGFuZCAgc05hTjEyICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg3MyBhbmQgIHNOYU4xMyAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NzQgYW5kICBzTmFOMTQgICBOYU4xNyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODc1IGFuZCAgc05hTjE1ICBzTmFOMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg3NiBhbmQgIE5hTjE2ICAgc05hTjE5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4NzcgYW5kIC1JbmYgICAgK3NOYU4yMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODc4IGFuZCAtMTAwMCAgICBzTmFOMjEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg3OSBhbmQgIDEwMDAgICAgc05hTjIyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4ODAgYW5kICBJbmYgICAgIHNOYU4yMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODgxIGFuZCArTmFOMjUgICtzTmFOMjQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg4MiBhbmQgLU5hTjI2ICAgIE5hTjI4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFhbmQ4ODMgYW5kIC1zTmFOMjcgIHNOYU4yOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxYW5kODg0IGFuZCAgMTAwMCAgICAtTmFOMzAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFuZDg4NSBhbmQgIDEwMDAgICAtc05hTjMxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUJhc2UuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFCYXNlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5YzZiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFCYXNlLmRlY1Rlc3QKQEAgLTAsMCArMSwxMDgxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQmFzZS5kZWNUZXN0IC0tIGJhc2UgZGVjUXVhZCA8LS0+IHN0cmluZyBjb252ZXJzaW9ucyAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBmaWxlIHRlc3RzIGJhc2UgY29udmVyc2lvbnMgZnJvbSBzdHJpbmcgdG8gYSBkZWNpbWFsIG51bWJlcgorLS0gYW5kIGJhY2sgdG8gYSBzdHJpbmcgKGluIFNjaWVudGlmaWMgZm9ybSkKKworLS0gTm90ZSB0aGF0IHVubGlrZSBvdGhlciBvcGVyYXRpb25zIHRoZSBvcGVyYW5kIGlzIHN1YmplY3QgdG8gcm91bmRpbmcKKy0tIHRvIGNvbmZvcm0gdG8gZW1heCBhbmQgcHJlY2lzaW9uIHNldHRpbmdzICh0aGF0IGlzLCBudW1iZXJzIHdpbGwKKy0tIGNvbmZvcm0gdG8gcnVsZXMgYW5kIGV4cG9uZW50IHdpbGwgYmUgaW4gcGVybWl0dGVkIHJhbmdlKS4gIFRoZQorLS0gJ2xlZnQgaGFuZCBzaWRlJywgdGhlcmVmb3JlLCBtYXkgaGF2ZSBudW1iZXJzIHRoYXQgY2Fubm90IGJlCistLSByZXByZXNlbnRlZCBpbiBhIGRlY1F1YWQuICBTb21lIHRlc3RjYXNlcyBnbyB0byB0aGUgbGltaXQgb2YgdGhlCistLSBuZXh0LXdpZGVyIGZvcm1hdCwgYW5kIGhlbmNlIHRoZXNlIHRlc3RjYXNlcyBtYXkgYWxzbyBiZSB1c2VkIHRvCistLSB0ZXN0IG5hcnJvd2luZyBhbmQgd2lkZW5pbmcgb3BlcmF0aW9ucy4KKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZHFiYXMwMDEgdG9TY2kgICAgICAgMCAtPiAwCitkcWJhczAwMiB0b1NjaSAgICAgICAxIC0+IDEKK2RxYmFzMDAzIHRvU2NpICAgICAxLjAgLT4gMS4wCitkcWJhczAwNCB0b1NjaSAgICAxLjAwIC0+IDEuMDAKK2RxYmFzMDA1IHRvU2NpICAgICAgMTAgLT4gMTAKK2RxYmFzMDA2IHRvU2NpICAgIDEwMDAgLT4gMTAwMAorZHFiYXMwMDcgdG9TY2kgICAgMTAuMCAtPiAxMC4wCitkcWJhczAwOCB0b1NjaSAgICAxMC4xIC0+IDEwLjEKK2RxYmFzMDA5IHRvU2NpICAgIDEwLjQgLT4gMTAuNAorZHFiYXMwMTAgdG9TY2kgICAgMTAuNSAtPiAxMC41CitkcWJhczAxMSB0b1NjaSAgICAxMC42IC0+IDEwLjYKK2RxYmFzMDEyIHRvU2NpICAgIDEwLjkgLT4gMTAuOQorZHFiYXMwMTMgdG9TY2kgICAgMTEuMCAtPiAxMS4wCitkcWJhczAxNCB0b1NjaSAgMS4yMzQgLT4gMS4yMzQKK2RxYmFzMDE1IHRvU2NpICAwLjEyMyAtPiAwLjEyMworZHFiYXMwMTYgdG9TY2kgIDAuMDEyIC0+IDAuMDEyCitkcWJhczAxNyB0b1NjaSAgLTAgICAgLT4gLTAKK2RxYmFzMDE4IHRvU2NpICAtMC4wICAtPiAtMC4wCitkcWJhczAxOSB0b1NjaSAtMDAuMDAgLT4gLTAuMDAKKworZHFiYXMwMjEgdG9TY2kgICAgIC0xIC0+IC0xCitkcWJhczAyMiB0b1NjaSAgIC0xLjAgLT4gLTEuMAorZHFiYXMwMjMgdG9TY2kgICAtMC4xIC0+IC0wLjEKK2RxYmFzMDI0IHRvU2NpICAgLTkuMSAtPiAtOS4xCitkcWJhczAyNSB0b1NjaSAgIC05LjExIC0+IC05LjExCitkcWJhczAyNiB0b1NjaSAgIC05LjExOSAtPiAtOS4xMTkKK2RxYmFzMDI3IHRvU2NpICAgLTkuOTk5IC0+IC05Ljk5OQorCitkcWJhczAzMCB0b1NjaSAgJzEyMzQ1Njc4OS4xMjM0NTYnICAgLT4gJzEyMzQ1Njc4OS4xMjM0NTYnCitkcWJhczAzMSB0b1NjaSAgJzEyMzQ1Njc4OS4wMDAwMDAnICAgLT4gJzEyMzQ1Njc4OS4wMDAwMDAnCitkcWJhczAzMiB0b1NjaSAgICcxMjM0NTY3ODkxMjM0NTYnICAgLT4gJzEyMzQ1Njc4OTEyMzQ1NicKK2RxYmFzMDMzIHRvU2NpICAgJzAuMDAwMDEyMzQ1Njc4OScgICAtPiAnMC4wMDAwMTIzNDU2Nzg5JworZHFiYXMwMzQgdG9TY2kgICcwLjAwMDAwMTIzNDU2Nzg5JyAgIC0+ICcwLjAwMDAwMTIzNDU2Nzg5JworZHFiYXMwMzUgdG9TY2kgJzAuMDAwMDAwMTIzNDU2Nzg5JyAgIC0+ICcxLjIzNDU2Nzg5RS03JworZHFiYXMwMzYgdG9TY2kgJzAuMDAwMDAwMDEyMzQ1Njc4OScgIC0+ICcxLjIzNDU2Nzg5RS04JworCitkcWJhczAzNyB0b1NjaSAnMC4xMjM0NTY3ODkwMTIzNDQnICAgLT4gJzAuMTIzNDU2Nzg5MDEyMzQ0JworZHFiYXMwMzggdG9TY2kgJzAuMTIzNDU2Nzg5MDEyMzQ1JyAgIC0+ICcwLjEyMzQ1Njc4OTAxMjM0NScKKworLS0gdGVzdCBmaW5pdGUgYm91bmRzIChOZWdzIG9mLCB0aGVuIDAsIE50aW55LCBObWluLCBvdGhlciwgTm1heCkKK2RxYnNuMDAxIHRvU2NpIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxYnNuMDAyIHRvU2NpIC0xRS02MTQzIC0+IC0xRS02MTQzCitkcWJzbjAwMyB0b1NjaSAtMUUtNjE3NiAtPiAtMUUtNjE3NiBTdWJub3JtYWwKK2RxYnNuMDA0IHRvU2NpIC0wIC0+IC0wCitkcWJzbjAwNSB0b1NjaSArMCAtPiAgMAorZHFic24wMDYgdG9TY2kgKzFFLTYxNzYgLT4gIDFFLTYxNzYgU3Vibm9ybWFsCitkcWJzbjAwNyB0b1NjaSArMUUtNjE0MyAtPiAgMUUtNjE0MworZHFic24wMDggdG9TY2kgKzkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorCistLSBTdHJpbmcgW21hbnkgbW9yZSBleGFtcGxlcyBhcmUgaW1wbGljaXRseSB0ZXN0ZWQgZWxzZXdoZXJlXQorLS0gc3RyaW5ncyB3aXRob3V0IEUgY2Fubm90IGdlbmVyYXRlIEUgaW4gcmVzdWx0CitkcWJhczA0MCB0b1NjaSAiMTIiICAgICAgICAtPiAnMTInCitkcWJhczA0MSB0b1NjaSAiLTc2IiAgICAgICAtPiAnLTc2JworZHFiYXMwNDIgdG9TY2kgIjEyLjc2IiAgICAgLT4gJzEyLjc2JworZHFiYXMwNDMgdG9TY2kgIisxMi43NiIgICAgLT4gJzEyLjc2JworZHFiYXMwNDQgdG9TY2kgIjAxMi43NiIgICAgLT4gJzEyLjc2JworZHFiYXMwNDUgdG9TY2kgIiswLjAwMyIgICAgLT4gJzAuMDAzJworZHFiYXMwNDYgdG9TY2kgIjE3LiIgICAgICAgLT4gJzE3JworZHFiYXMwNDcgdG9TY2kgIi41IiAgICAgICAgLT4gJzAuNScKK2RxYmFzMDQ4IHRvU2NpICIwNDQiICAgICAgIC0+ICc0NCcKK2RxYmFzMDQ5IHRvU2NpICIwMDQ0IiAgICAgIC0+ICc0NCcKK2RxYmFzMDUwIHRvU2NpICIwLjAwMDUiICAgICAgLT4gJzAuMDAwNScKK2RxYmFzMDUxIHRvU2NpICIwMC4wMDAwNSIgICAgLT4gJzAuMDAwMDUnCitkcWJhczA1MiB0b1NjaSAiMC4wMDAwMDUiICAgIC0+ICcwLjAwMDAwNScKK2RxYmFzMDUzIHRvU2NpICIwLjAwMDAwNTAiICAgLT4gJzAuMDAwMDA1MCcKK2RxYmFzMDU0IHRvU2NpICIwLjAwMDAwMDUiICAgLT4gJzVFLTcnCitkcWJhczA1NSB0b1NjaSAiMC4wMDAwMDAwNSIgIC0+ICc1RS04JworZHFiYXMwNTYgdG9TY2kgIjEyMzQ1Njc4LjU0MzIxMCIgLT4gJzEyMzQ1Njc4LjU0MzIxMCcKK2RxYmFzMDU3IHRvU2NpICIyMzQ1Njc4LjU0MzIxMCIgLT4gJzIzNDU2NzguNTQzMjEwJworZHFiYXMwNTggdG9TY2kgIjM0NTY3OC41NDMyMTAiIC0+ICczNDU2NzguNTQzMjEwJworZHFiYXMwNTkgdG9TY2kgIjAzNDU2NzguNTQzMjEiIC0+ICczNDU2NzguNTQzMjEnCitkcWJhczA2MCB0b1NjaSAiMzQ1Njc4LjU0MzIiIC0+ICczNDU2NzguNTQzMicKK2RxYmFzMDYxIHRvU2NpICIrMzQ1Njc4LjU0MzIiIC0+ICczNDU2NzguNTQzMicKK2RxYmFzMDYyIHRvU2NpICIrMDM0NTY3OC41NDMyIiAtPiAnMzQ1Njc4LjU0MzInCitkcWJhczA2MyB0b1NjaSAiKzAwMzQ1Njc4LjU0MzIiIC0+ICczNDU2NzguNTQzMicKK2RxYmFzMDY0IHRvU2NpICItMzQ1Njc4LjU0MzIiICAtPiAnLTM0NTY3OC41NDMyJworZHFiYXMwNjUgdG9TY2kgIi0wMzQ1Njc4LjU0MzIiICAtPiAnLTM0NTY3OC41NDMyJworZHFiYXMwNjYgdG9TY2kgIi0wMDM0NTY3OC41NDMyIiAgLT4gJy0zNDU2NzguNTQzMicKKy0tIGV4YW1wbGVzCitkcWJhczA2NyB0b1NjaSAiNUUtNiIgICAgICAgIC0+ICcwLjAwMDAwNScKK2RxYmFzMDY4IHRvU2NpICI1MEUtNyIgICAgICAgLT4gJzAuMDAwMDA1MCcKK2RxYmFzMDY5IHRvU2NpICI1RS03IiAgICAgICAgLT4gJzVFLTcnCisKKy0tIFtObyBleG90aWNzIGFzIG5vIFVuaWNvZGVdCisKKy0tIHJvdW5kZWQgd2l0aCBkb3RzIGluIGFsbCAoaW5jbHVkaW5nIGVkZ2UpIHBsYWNlcworZHFiYXMwNzEgdG9TY2kgIC4xMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAwLjEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA3MiB0b1NjaSAgMS4yMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxLjIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDczIHRvU2NpICAxMi4zNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyLjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwNzQgdG9TY2kgIDEyMy40NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzLjQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA3NSB0b1NjaSAgMTIzNC41Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0LjU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDc2IHRvU2NpICAxMjM0NS42Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1LjY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwNzcgdG9TY2kgIDEyMzQ1Ni43ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Ljc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA3OCB0b1NjaSAgMTIzNDU2Ny44OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3Ljg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDc5IHRvU2NpICAxMjM0NTY3OC45MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4LjkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwODAgdG9TY2kgIDEyMzQ1Njc4OS4xMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5LjEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA4MSB0b1NjaSAgMTIzNDU2Nzg5MS4yMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxLjIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDgyIHRvU2NpICAxMjM0NTY3ODkxMi4zNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyLjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwODMgdG9TY2kgIDEyMzQ1Njc4OTEyMy40NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzLjQ1Njc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA4NCB0b1NjaSAgMTIzNDU2Nzg5MTIzNC41Njc4OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0LjU2Nzg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDg1IHRvU2NpICAxMjM0NTY3ODkxMjM0NS42Nzg5MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1LjY3ODkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwODYgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Ni43ODkwMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Ljc4OTAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA4NyB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Ny44OTAxMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3Ljg5MDEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDg4IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3OC45MDEyMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4LjkwMTIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwODkgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OS4wMTIzNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5LjAxMjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA5MCB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MC4xMjM0NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwLjEyMzQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDkxIHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMS4yMzQ1Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxLjIzNDU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwOTIgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMi4zNDU2NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyLjM0NTY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA5MyB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMy40NTY3ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzLjQ1Njc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDk0IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNC41Njc4MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0LjU2NzgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwOTUgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NS42NzgwMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1LjY3ODAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA5NiB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Ni43ODAxMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Ljc4MDEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMDk3IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2Ny44MDEyMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3LjgwMTIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMwOTggdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3OC4wMTIzNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4LjAxMjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczA5OSB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MC4xMjM0NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwLjEyMzQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTAwIHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMS4yMzQ1NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxLjIzNDU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDEgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMi4zNDU2MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyLjM0NTYgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwMiB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMy40NTYxMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzLjQ1NiBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTAzIHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNC41NjEyMyAgLT4gIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0LjU2IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDQgdG9TY2kgIDEyMzQ1Njc4OTEyMzQ1Njc4OTAxMjM0NTY3ODAxMjM0NS42MTIzICAtPiAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1LjYgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwNSB0b1NjaSAgMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1Ni4xMjMgIC0+ICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTA2IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MS4yMyAgLT4gIDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2RSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTA3IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIuMyAgLT4gIDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2RSszNSBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTA4IHRvU2NpICAxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2MTIzLiAgLT4gIDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2RSszNiBJbmV4YWN0IFJvdW5kZWQKKy0tIDEyMzQ1Njc4OTAxMjM0NTY3OAorCistLSBOdW1iZXJzIHdpdGggRQorZHFiYXMxMzAgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2RxYmFzMTMxIHRvU2NpICIwLjAwMEUtMiIgIC0+ICcwLjAwMDAwJworZHFiYXMxMzIgdG9TY2kgIjAuMDAwRS0zIiAgLT4gJzAuMDAwMDAwJworZHFiYXMxMzMgdG9TY2kgIjAuMDAwRS00IiAgLT4gJzBFLTcnCitkcWJhczEzNCB0b1NjaSAiMC4wMEUtMiIgICAtPiAnMC4wMDAwJworZHFiYXMxMzUgdG9TY2kgIjAuMDBFLTMiICAgLT4gJzAuMDAwMDAnCitkcWJhczEzNiB0b1NjaSAiMC4wMEUtNCIgICAtPiAnMC4wMDAwMDAnCitkcWJhczEzNyB0b1NjaSAiMC4wMEUtNSIgICAtPiAnMEUtNycKK2RxYmFzMTM4IHRvU2NpICIrMEUrOSIgICAgIC0+ICcwRSs5JworZHFiYXMxMzkgdG9TY2kgIi0wRSs5IiAgICAgLT4gJy0wRSs5JworZHFiYXMxNDAgdG9TY2kgIjFFKzkiICAgICAgLT4gJzFFKzknCitkcWJhczE0MSB0b1NjaSAiMWUrMDkiICAgICAtPiAnMUUrOScKK2RxYmFzMTQyIHRvU2NpICIxRSs5MCIgICAgIC0+ICcxRSs5MCcKK2RxYmFzMTQzIHRvU2NpICIrMUUrMDA5IiAgIC0+ICcxRSs5JworZHFiYXMxNDQgdG9TY2kgIjBFKzkiICAgICAgLT4gJzBFKzknCitkcWJhczE0NSB0b1NjaSAiMUUrOSIgICAgICAtPiAnMUUrOScKK2RxYmFzMTQ2IHRvU2NpICIxRSswOSIgICAgIC0+ICcxRSs5JworZHFiYXMxNDcgdG9TY2kgIjFlKzkwIiAgICAgLT4gJzFFKzkwJworZHFiYXMxNDggdG9TY2kgIjFFKzAwOSIgICAgLT4gJzFFKzknCitkcWJhczE0OSB0b1NjaSAiMDAwRSs5IiAgICAtPiAnMEUrOScKK2RxYmFzMTUwIHRvU2NpICIxRTkiICAgICAgIC0+ICcxRSs5JworZHFiYXMxNTEgdG9TY2kgIjFlMDkiICAgICAgLT4gJzFFKzknCitkcWJhczE1MiB0b1NjaSAiMUU5MCIgICAgICAtPiAnMUUrOTAnCitkcWJhczE1MyB0b1NjaSAiMUUwMDkiICAgICAtPiAnMUUrOScKK2RxYmFzMTU0IHRvU2NpICIwRTkiICAgICAgIC0+ICcwRSs5JworZHFiYXMxNTUgdG9TY2kgIjAuMDAwZSswIiAgLT4gJzAuMDAwJworZHFiYXMxNTYgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2RxYmFzMTU3IHRvU2NpICI0RSs5IiAgICAgIC0+ICc0RSs5JworZHFiYXMxNTggdG9TY2kgIjQ0RSs5IiAgICAgLT4gJzQuNEUrMTAnCitkcWJhczE1OSB0b1NjaSAiMC43M2UtNyIgICAtPiAnNy4zRS04JworZHFiYXMxNjAgdG9TY2kgIjAwRSs5IiAgICAgLT4gJzBFKzknCitkcWJhczE2MSB0b1NjaSAiMDBFLTkiICAgICAtPiAnMEUtOScKK2RxYmFzMTYyIHRvU2NpICIxMEUrOSIgICAgIC0+ICcxLjBFKzEwJworZHFiYXMxNjMgdG9TY2kgIjEwRSswOSIgICAgLT4gJzEuMEUrMTAnCitkcWJhczE2NCB0b1NjaSAiMTBlKzkwIiAgICAtPiAnMS4wRSs5MScKK2RxYmFzMTY1IHRvU2NpICIxMEUrMDA5IiAgIC0+ICcxLjBFKzEwJworZHFiYXMxNjYgdG9TY2kgIjEwMGUrOSIgICAgLT4gJzEuMDBFKzExJworZHFiYXMxNjcgdG9TY2kgIjEwMGUrMDkiICAgLT4gJzEuMDBFKzExJworZHFiYXMxNjggdG9TY2kgIjEwMEUrOTAiICAgLT4gJzEuMDBFKzkyJworZHFiYXMxNjkgdG9TY2kgIjEwMGUrMDA5IiAgLT4gJzEuMDBFKzExJworCitkcWJhczE3MCB0b1NjaSAiMS4yNjUiICAgICAtPiAnMS4yNjUnCitkcWJhczE3MSB0b1NjaSAiMS4yNjVFLTIwIiAtPiAnMS4yNjVFLTIwJworZHFiYXMxNzIgdG9TY2kgIjEuMjY1RS04IiAgLT4gJzEuMjY1RS04JworZHFiYXMxNzMgdG9TY2kgIjEuMjY1RS00IiAgLT4gJzAuMDAwMTI2NScKK2RxYmFzMTc0IHRvU2NpICIxLjI2NUUtMyIgIC0+ICcwLjAwMTI2NScKK2RxYmFzMTc1IHRvU2NpICIxLjI2NUUtMiIgIC0+ICcwLjAxMjY1JworZHFiYXMxNzYgdG9TY2kgIjEuMjY1RS0xIiAgLT4gJzAuMTI2NScKK2RxYmFzMTc3IHRvU2NpICIxLjI2NUUtMCIgIC0+ICcxLjI2NScKK2RxYmFzMTc4IHRvU2NpICIxLjI2NUUrMSIgIC0+ICcxMi42NScKK2RxYmFzMTc5IHRvU2NpICIxLjI2NUUrMiIgIC0+ICcxMjYuNScKK2RxYmFzMTgwIHRvU2NpICIxLjI2NUUrMyIgIC0+ICcxMjY1JworZHFiYXMxODEgdG9TY2kgIjEuMjY1RSs0IiAgLT4gJzEuMjY1RSs0JworZHFiYXMxODIgdG9TY2kgIjEuMjY1RSs4IiAgLT4gJzEuMjY1RSs4JworZHFiYXMxODMgdG9TY2kgIjEuMjY1RSsyMCIgLT4gJzEuMjY1RSsyMCcKKworZHFiYXMxOTAgdG9TY2kgIjEyLjY1IiAgICAgLT4gJzEyLjY1JworZHFiYXMxOTEgdG9TY2kgIjEyLjY1RS0yMCIgLT4gJzEuMjY1RS0xOScKK2RxYmFzMTkyIHRvU2NpICIxMi42NUUtOCIgIC0+ICcxLjI2NUUtNycKK2RxYmFzMTkzIHRvU2NpICIxMi42NUUtNCIgIC0+ICcwLjAwMTI2NScKK2RxYmFzMTk0IHRvU2NpICIxMi42NUUtMyIgIC0+ICcwLjAxMjY1JworZHFiYXMxOTUgdG9TY2kgIjEyLjY1RS0yIiAgLT4gJzAuMTI2NScKK2RxYmFzMTk2IHRvU2NpICIxMi42NUUtMSIgIC0+ICcxLjI2NScKK2RxYmFzMTk3IHRvU2NpICIxMi42NUUtMCIgIC0+ICcxMi42NScKK2RxYmFzMTk4IHRvU2NpICIxMi42NUUrMSIgIC0+ICcxMjYuNScKK2RxYmFzMTk5IHRvU2NpICIxMi42NUUrMiIgIC0+ICcxMjY1JworZHFiYXMyMDAgdG9TY2kgIjEyLjY1RSszIiAgLT4gJzEuMjY1RSs0JworZHFiYXMyMDEgdG9TY2kgIjEyLjY1RSs0IiAgLT4gJzEuMjY1RSs1JworZHFiYXMyMDIgdG9TY2kgIjEyLjY1RSs4IiAgLT4gJzEuMjY1RSs5JworZHFiYXMyMDMgdG9TY2kgIjEyLjY1RSsyMCIgLT4gJzEuMjY1RSsyMScKKworZHFiYXMyMTAgdG9TY2kgIjEyNi41IiAgICAgLT4gJzEyNi41JworZHFiYXMyMTEgdG9TY2kgIjEyNi41RS0yMCIgLT4gJzEuMjY1RS0xOCcKK2RxYmFzMjEyIHRvU2NpICIxMjYuNUUtOCIgIC0+ICcwLjAwMDAwMTI2NScKK2RxYmFzMjEzIHRvU2NpICIxMjYuNUUtNCIgIC0+ICcwLjAxMjY1JworZHFiYXMyMTQgdG9TY2kgIjEyNi41RS0zIiAgLT4gJzAuMTI2NScKK2RxYmFzMjE1IHRvU2NpICIxMjYuNUUtMiIgIC0+ICcxLjI2NScKK2RxYmFzMjE2IHRvU2NpICIxMjYuNUUtMSIgIC0+ICcxMi42NScKK2RxYmFzMjE3IHRvU2NpICIxMjYuNUUtMCIgIC0+ICcxMjYuNScKK2RxYmFzMjE4IHRvU2NpICIxMjYuNUUrMSIgIC0+ICcxMjY1JworZHFiYXMyMTkgdG9TY2kgIjEyNi41RSsyIiAgLT4gJzEuMjY1RSs0JworZHFiYXMyMjAgdG9TY2kgIjEyNi41RSszIiAgLT4gJzEuMjY1RSs1JworZHFiYXMyMjEgdG9TY2kgIjEyNi41RSs0IiAgLT4gJzEuMjY1RSs2JworZHFiYXMyMjIgdG9TY2kgIjEyNi41RSs4IiAgLT4gJzEuMjY1RSsxMCcKK2RxYmFzMjIzIHRvU2NpICIxMjYuNUUrMjAiIC0+ICcxLjI2NUUrMjInCisKK2RxYmFzMjMwIHRvU2NpICIxMjY1IiAgICAgLT4gJzEyNjUnCitkcWJhczIzMSB0b1NjaSAiMTI2NUUtMjAiIC0+ICcxLjI2NUUtMTcnCitkcWJhczIzMiB0b1NjaSAiMTI2NUUtOCIgIC0+ICcwLjAwMDAxMjY1JworZHFiYXMyMzMgdG9TY2kgIjEyNjVFLTQiICAtPiAnMC4xMjY1JworZHFiYXMyMzQgdG9TY2kgIjEyNjVFLTMiICAtPiAnMS4yNjUnCitkcWJhczIzNSB0b1NjaSAiMTI2NUUtMiIgIC0+ICcxMi42NScKK2RxYmFzMjM2IHRvU2NpICIxMjY1RS0xIiAgLT4gJzEyNi41JworZHFiYXMyMzcgdG9TY2kgIjEyNjVFLTAiICAtPiAnMTI2NScKK2RxYmFzMjM4IHRvU2NpICIxMjY1RSsxIiAgLT4gJzEuMjY1RSs0JworZHFiYXMyMzkgdG9TY2kgIjEyNjVFKzIiICAtPiAnMS4yNjVFKzUnCitkcWJhczI0MCB0b1NjaSAiMTI2NUUrMyIgIC0+ICcxLjI2NUUrNicKK2RxYmFzMjQxIHRvU2NpICIxMjY1RSs0IiAgLT4gJzEuMjY1RSs3JworZHFiYXMyNDIgdG9TY2kgIjEyNjVFKzgiICAtPiAnMS4yNjVFKzExJworZHFiYXMyNDMgdG9TY2kgIjEyNjVFKzIwIiAtPiAnMS4yNjVFKzIzJworCitkcWJhczI1MCB0b1NjaSAiMC4xMjY1IiAgICAgLT4gJzAuMTI2NScKK2RxYmFzMjUxIHRvU2NpICIwLjEyNjVFLTIwIiAtPiAnMS4yNjVFLTIxJworZHFiYXMyNTIgdG9TY2kgIjAuMTI2NUUtOCIgIC0+ICcxLjI2NUUtOScKK2RxYmFzMjUzIHRvU2NpICIwLjEyNjVFLTQiICAtPiAnMC4wMDAwMTI2NScKK2RxYmFzMjU0IHRvU2NpICIwLjEyNjVFLTMiICAtPiAnMC4wMDAxMjY1JworZHFiYXMyNTUgdG9TY2kgIjAuMTI2NUUtMiIgIC0+ICcwLjAwMTI2NScKK2RxYmFzMjU2IHRvU2NpICIwLjEyNjVFLTEiICAtPiAnMC4wMTI2NScKK2RxYmFzMjU3IHRvU2NpICIwLjEyNjVFLTAiICAtPiAnMC4xMjY1JworZHFiYXMyNTggdG9TY2kgIjAuMTI2NUUrMSIgIC0+ICcxLjI2NScKK2RxYmFzMjU5IHRvU2NpICIwLjEyNjVFKzIiICAtPiAnMTIuNjUnCitkcWJhczI2MCB0b1NjaSAiMC4xMjY1RSszIiAgLT4gJzEyNi41JworZHFiYXMyNjEgdG9TY2kgIjAuMTI2NUUrNCIgIC0+ICcxMjY1JworZHFiYXMyNjIgdG9TY2kgIjAuMTI2NUUrOCIgIC0+ICcxLjI2NUUrNycKK2RxYmFzMjYzIHRvU2NpICIwLjEyNjVFKzIwIiAtPiAnMS4yNjVFKzE5JworCistLSBzb21lIG1vcmUgbmVnYXRpdmUgemVyb3MgW3N5c3RlbWF0aWMgdGVzdHMgYmVsb3ddCitkcWJhczI5MCB0b1NjaSAiLTAuMDAwRS0xIiAgLT4gJy0wLjAwMDAnCitkcWJhczI5MSB0b1NjaSAiLTAuMDAwRS0yIiAgLT4gJy0wLjAwMDAwJworZHFiYXMyOTIgdG9TY2kgIi0wLjAwMEUtMyIgIC0+ICctMC4wMDAwMDAnCitkcWJhczI5MyB0b1NjaSAiLTAuMDAwRS00IiAgLT4gJy0wRS03JworZHFiYXMyOTQgdG9TY2kgIi0wLjAwRS0yIiAgIC0+ICctMC4wMDAwJworZHFiYXMyOTUgdG9TY2kgIi0wLjAwRS0zIiAgIC0+ICctMC4wMDAwMCcKK2RxYmFzMjk2IHRvU2NpICItMC4wRS0yIiAgICAtPiAnLTAuMDAwJworZHFiYXMyOTcgdG9TY2kgIi0wLjBFLTMiICAgIC0+ICctMC4wMDAwJworZHFiYXMyOTggdG9TY2kgIi0wRS0yIiAgICAgIC0+ICctMC4wMCcKK2RxYmFzMjk5IHRvU2NpICItMEUtMyIgICAgICAtPiAnLTAuMDAwJworCistLSBFbmdpbmVlcmluZyBub3RhdGlvbiB0ZXN0cworZHFiYXMzMDEgIHRvU2NpIDEwZTEyICAtPiAxLjBFKzEzCitkcWJhczMwMiAgdG9FbmcgMTBlMTIgIC0+IDEwRSsxMgorZHFiYXMzMDMgIHRvU2NpIDEwZTExICAtPiAxLjBFKzEyCitkcWJhczMwNCAgdG9FbmcgMTBlMTEgIC0+IDEuMEUrMTIKK2RxYmFzMzA1ICB0b1NjaSAxMGUxMCAgLT4gMS4wRSsxMQorZHFiYXMzMDYgIHRvRW5nIDEwZTEwICAtPiAxMDBFKzkKK2RxYmFzMzA3ICB0b1NjaSAxMGU5ICAgLT4gMS4wRSsxMAorZHFiYXMzMDggIHRvRW5nIDEwZTkgICAtPiAxMEUrOQorZHFiYXMzMDkgIHRvU2NpIDEwZTggICAtPiAxLjBFKzkKK2RxYmFzMzEwICB0b0VuZyAxMGU4ICAgLT4gMS4wRSs5CitkcWJhczMxMSAgdG9TY2kgMTBlNyAgIC0+IDEuMEUrOAorZHFiYXMzMTIgIHRvRW5nIDEwZTcgICAtPiAxMDBFKzYKK2RxYmFzMzEzICB0b1NjaSAxMGU2ICAgLT4gMS4wRSs3CitkcWJhczMxNCAgdG9FbmcgMTBlNiAgIC0+IDEwRSs2CitkcWJhczMxNSAgdG9TY2kgMTBlNSAgIC0+IDEuMEUrNgorZHFiYXMzMTYgIHRvRW5nIDEwZTUgICAtPiAxLjBFKzYKK2RxYmFzMzE3ICB0b1NjaSAxMGU0ICAgLT4gMS4wRSs1CitkcWJhczMxOCAgdG9FbmcgMTBlNCAgIC0+IDEwMEUrMworZHFiYXMzMTkgIHRvU2NpIDEwZTMgICAtPiAxLjBFKzQKK2RxYmFzMzIwICB0b0VuZyAxMGUzICAgLT4gMTBFKzMKK2RxYmFzMzIxICB0b1NjaSAxMGUyICAgLT4gMS4wRSszCitkcWJhczMyMiAgdG9FbmcgMTBlMiAgIC0+IDEuMEUrMworZHFiYXMzMjMgIHRvU2NpIDEwZTEgICAtPiAxLjBFKzIKK2RxYmFzMzI0ICB0b0VuZyAxMGUxICAgLT4gMTAwCitkcWJhczMyNSAgdG9TY2kgMTBlMCAgIC0+IDEwCitkcWJhczMyNiAgdG9FbmcgMTBlMCAgIC0+IDEwCitkcWJhczMyNyAgdG9TY2kgMTBlLTEgIC0+IDEuMAorZHFiYXMzMjggIHRvRW5nIDEwZS0xICAtPiAxLjAKK2RxYmFzMzI5ICB0b1NjaSAxMGUtMiAgLT4gMC4xMAorZHFiYXMzMzAgIHRvRW5nIDEwZS0yICAtPiAwLjEwCitkcWJhczMzMSAgdG9TY2kgMTBlLTMgIC0+IDAuMDEwCitkcWJhczMzMiAgdG9FbmcgMTBlLTMgIC0+IDAuMDEwCitkcWJhczMzMyAgdG9TY2kgMTBlLTQgIC0+IDAuMDAxMAorZHFiYXMzMzQgIHRvRW5nIDEwZS00ICAtPiAwLjAwMTAKK2RxYmFzMzM1ICB0b1NjaSAxMGUtNSAgLT4gMC4wMDAxMAorZHFiYXMzMzYgIHRvRW5nIDEwZS01ICAtPiAwLjAwMDEwCitkcWJhczMzNyAgdG9TY2kgMTBlLTYgIC0+IDAuMDAwMDEwCitkcWJhczMzOCAgdG9FbmcgMTBlLTYgIC0+IDAuMDAwMDEwCitkcWJhczMzOSAgdG9TY2kgMTBlLTcgIC0+IDAuMDAwMDAxMAorZHFiYXMzNDAgIHRvRW5nIDEwZS03ICAtPiAwLjAwMDAwMTAKK2RxYmFzMzQxICB0b1NjaSAxMGUtOCAgLT4gMS4wRS03CitkcWJhczM0MiAgdG9FbmcgMTBlLTggIC0+IDEwMEUtOQorZHFiYXMzNDMgIHRvU2NpIDEwZS05ICAtPiAxLjBFLTgKK2RxYmFzMzQ0ICB0b0VuZyAxMGUtOSAgLT4gMTBFLTkKK2RxYmFzMzQ1ICB0b1NjaSAxMGUtMTAgLT4gMS4wRS05CitkcWJhczM0NiAgdG9FbmcgMTBlLTEwIC0+IDEuMEUtOQorZHFiYXMzNDcgIHRvU2NpIDEwZS0xMSAtPiAxLjBFLTEwCitkcWJhczM0OCAgdG9FbmcgMTBlLTExIC0+IDEwMEUtMTIKK2RxYmFzMzQ5ICB0b1NjaSAxMGUtMTIgLT4gMS4wRS0xMQorZHFiYXMzNTAgIHRvRW5nIDEwZS0xMiAtPiAxMEUtMTIKK2RxYmFzMzUxICB0b1NjaSAxMGUtMTMgLT4gMS4wRS0xMgorZHFiYXMzNTIgIHRvRW5nIDEwZS0xMyAtPiAxLjBFLTEyCisKK2RxYmFzMzYxICB0b1NjaSA3RTEyICAtPiA3RSsxMgorZHFiYXMzNjIgIHRvRW5nIDdFMTIgIC0+IDdFKzEyCitkcWJhczM2MyAgdG9TY2kgN0UxMSAgLT4gN0UrMTEKK2RxYmFzMzY0ICB0b0VuZyA3RTExICAtPiA3MDBFKzkKK2RxYmFzMzY1ICB0b1NjaSA3RTEwICAtPiA3RSsxMAorZHFiYXMzNjYgIHRvRW5nIDdFMTAgIC0+IDcwRSs5CitkcWJhczM2NyAgdG9TY2kgN0U5ICAgLT4gN0UrOQorZHFiYXMzNjggIHRvRW5nIDdFOSAgIC0+IDdFKzkKK2RxYmFzMzY5ICB0b1NjaSA3RTggICAtPiA3RSs4CitkcWJhczM3MCAgdG9FbmcgN0U4ICAgLT4gNzAwRSs2CitkcWJhczM3MSAgdG9TY2kgN0U3ICAgLT4gN0UrNworZHFiYXMzNzIgIHRvRW5nIDdFNyAgIC0+IDcwRSs2CitkcWJhczM3MyAgdG9TY2kgN0U2ICAgLT4gN0UrNgorZHFiYXMzNzQgIHRvRW5nIDdFNiAgIC0+IDdFKzYKK2RxYmFzMzc1ICB0b1NjaSA3RTUgICAtPiA3RSs1CitkcWJhczM3NiAgdG9FbmcgN0U1ICAgLT4gNzAwRSszCitkcWJhczM3NyAgdG9TY2kgN0U0ICAgLT4gN0UrNAorZHFiYXMzNzggIHRvRW5nIDdFNCAgIC0+IDcwRSszCitkcWJhczM3OSAgdG9TY2kgN0UzICAgLT4gN0UrMworZHFiYXMzODAgIHRvRW5nIDdFMyAgIC0+IDdFKzMKK2RxYmFzMzgxICB0b1NjaSA3RTIgICAtPiA3RSsyCitkcWJhczM4MiAgdG9FbmcgN0UyICAgLT4gNzAwCitkcWJhczM4MyAgdG9TY2kgN0UxICAgLT4gN0UrMQorZHFiYXMzODQgIHRvRW5nIDdFMSAgIC0+IDcwCitkcWJhczM4NSAgdG9TY2kgN0UwICAgLT4gNworZHFiYXMzODYgIHRvRW5nIDdFMCAgIC0+IDcKK2RxYmFzMzg3ICB0b1NjaSA3RS0xICAtPiAwLjcKK2RxYmFzMzg4ICB0b0VuZyA3RS0xICAtPiAwLjcKK2RxYmFzMzg5ICB0b1NjaSA3RS0yICAtPiAwLjA3CitkcWJhczM5MCAgdG9FbmcgN0UtMiAgLT4gMC4wNworZHFiYXMzOTEgIHRvU2NpIDdFLTMgIC0+IDAuMDA3CitkcWJhczM5MiAgdG9FbmcgN0UtMyAgLT4gMC4wMDcKK2RxYmFzMzkzICB0b1NjaSA3RS00ICAtPiAwLjAwMDcKK2RxYmFzMzk0ICB0b0VuZyA3RS00ICAtPiAwLjAwMDcKK2RxYmFzMzk1ICB0b1NjaSA3RS01ICAtPiAwLjAwMDA3CitkcWJhczM5NiAgdG9FbmcgN0UtNSAgLT4gMC4wMDAwNworZHFiYXMzOTcgIHRvU2NpIDdFLTYgIC0+IDAuMDAwMDA3CitkcWJhczM5OCAgdG9FbmcgN0UtNiAgLT4gMC4wMDAwMDcKK2RxYmFzMzk5ICB0b1NjaSA3RS03ICAtPiA3RS03CitkcWJhczQwMCAgdG9FbmcgN0UtNyAgLT4gNzAwRS05CitkcWJhczQwMSAgdG9TY2kgN0UtOCAgLT4gN0UtOAorZHFiYXM0MDIgIHRvRW5nIDdFLTggIC0+IDcwRS05CitkcWJhczQwMyAgdG9TY2kgN0UtOSAgLT4gN0UtOQorZHFiYXM0MDQgIHRvRW5nIDdFLTkgIC0+IDdFLTkKK2RxYmFzNDA1ICB0b1NjaSA3RS0xMCAtPiA3RS0xMAorZHFiYXM0MDYgIHRvRW5nIDdFLTEwIC0+IDcwMEUtMTIKK2RxYmFzNDA3ICB0b1NjaSA3RS0xMSAtPiA3RS0xMQorZHFiYXM0MDggIHRvRW5nIDdFLTExIC0+IDcwRS0xMgorZHFiYXM0MDkgIHRvU2NpIDdFLTEyIC0+IDdFLTEyCitkcWJhczQxMCAgdG9FbmcgN0UtMTIgLT4gN0UtMTIKK2RxYmFzNDExICB0b1NjaSA3RS0xMyAtPiA3RS0xMworZHFiYXM0MTIgIHRvRW5nIDdFLTEzIC0+IDcwMEUtMTUKKworLS0gRXhhY3RzIHJlbWFpbiBleGFjdCB1cCB0byBwcmVjaXNpb24gLi4KK2RxYmFzNDIwICB0b1NjaSAgICAxMDAgLT4gMTAwCitkcWJhczQyMiAgdG9TY2kgICAxMDAwIC0+IDEwMDAKK2RxYmFzNDI0ICB0b1NjaSAgOTk5LjkgLT4gIDk5OS45CitkcWJhczQyNiAgdG9TY2kgMTAwMC4wIC0+IDEwMDAuMAorZHFiYXM0MjggIHRvU2NpIDEwMDAuMSAtPiAxMDAwLjEKK2RxYmFzNDMwICB0b1NjaSAxMDAwMCAtPiAxMDAwMAorZHFiYXM0MzIgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxYmFzNDM0ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFiYXM0MzYgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFiYXM0MzggIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxYmFzNDQwICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgICBSb3VuZGVkCitkcWJhczQ0MiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICAgUm91bmRlZAorZHFiYXM0NDQgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NDYgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NDggIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1MCAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NTAgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRSszNCAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NTIgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgIFJvdW5kZWQKK2RxYmFzNDU0ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgICBSb3VuZGVkIEluZXhhY3QKK2RxYmFzNDU2ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgICBSb3VuZGVkIEluZXhhY3QKK2RxYmFzNDU4ICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgICBSb3VuZGVkIEluZXhhY3QKK2RxYmFzNDYwICB0b1NjaSAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYgICBSb3VuZGVkCitkcWJhczQ2MiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM2ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ2NCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM2ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ2NiAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM2ICAgUm91bmRlZCBJbmV4YWN0CitkcWJhczQ2OCAgdG9TY2kgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM3ICAgUm91bmRlZAorZHFiYXM0NzAgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzMDAwIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNyAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NzIgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1MDAwIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNyAgIFJvdW5kZWQgSW5leGFjdAorZHFiYXM0NzQgIHRvU2NpIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5MDAwIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRSszNyAgIFJvdW5kZWQgSW5leGFjdAorCistLSBjaGVjayByb3VuZGluZyBtb2RlcyBoZWVkZWQKK3JvdW5kaW5nOiAgY2VpbGluZworZHFic3I0MDEgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjQwMiAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MDMgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDA0ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitkcWJzcjQwNSAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNDA2ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQwNyAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MDggIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZmxvb3IKK2RxYnNyNDEwICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I0MTEgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDEyICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQxMyAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2Rvd24KK2RxYnNyNDE1ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I0MTYgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDE3ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQxOCAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2NTAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MTkgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkcWJzcjQyMSAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNDIyICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQyMyAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MjQgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NjUwICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDI1ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2RxYnNyNDI2ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I0MjcgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDI4ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQyOSAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX3VwCitkcWJzcjQzMSAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNDMyICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjQzMyAgdG9TY2kgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I0MzQgIHRvU2NpICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NjUwICAgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ3ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNDM1ICB0b1NjaSAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CistLSBuZWdhdGl2ZXMKK3JvdW5kaW5nOiAgY2VpbGluZworZHFic3I1MDEgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTAgICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkCitkcWJzcjUwMiAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NDkgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MDMgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUwICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTA0ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitkcWJzcjUwNSAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNTA2ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUwNyAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MDggIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZmxvb3IKK2RxYnNyNTEwICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I1MTEgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTEyICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUxMyAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2Rvd24KK2RxYnNyNTE1ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I1MTYgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTE3ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUxOCAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2NTAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MTkgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTUxICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkcWJzcjUyMSAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNTIyICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUyMyAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MjQgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NjUwICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTI1ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2RxYnNyNTI2ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUwICAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZAorZHFic3I1MjcgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NTQ5ICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTI4ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MCAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUyOSAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTEgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX3VwCitkcWJzcjUzMSAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1MCAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDUgIFJvdW5kZWQKK2RxYnNyNTMyICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU0OSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NSAgUm91bmRlZCBJbmV4YWN0CitkcWJzcjUzMyAgdG9TY2kgLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ1NTAgICAtPiAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHFic3I1MzQgIHRvU2NpIC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NjUwICAgLT4gLTEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyMzQ3ICBSb3VuZGVkIEluZXhhY3QKK2RxYnNyNTM1ICB0b1NjaSAtMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIzNDU1MSAgIC0+IC0xLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjM0NiAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gVGhlICdiYWRkaWVzJyB0ZXN0cyBmcm9tIERpYWdCaWdEZWNpbWFsLCBwbHVzIHNvbWUgbmV3IG9uZXMKK2RxYmFzNTAwIHRvU2NpICcxLi4yJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MDEgdG9TY2kgJy4nICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUwMiB0b1NjaSAnLi4nICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTAzIHRvU2NpICcrKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MDQgdG9TY2kgJy0tMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUwNSB0b1NjaSAnLSsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTA2IHRvU2NpICcrLTEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MDcgdG9TY2kgJzEyZScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUwOCB0b1NjaSAnMTJlKysnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTA5IHRvU2NpICcxMmY0JyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MTAgdG9TY2kgJyArMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUxMSB0b1NjaSAnKyAxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTEyIHRvU2NpICcxMiAnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MTMgdG9TY2kgJyArIDEnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUxNCB0b1NjaSAnIC0gMSAnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTE1IHRvU2NpICd4JyAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MTYgdG9TY2kgJy0xLScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUxNyB0b1NjaSAnMTItJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTE4IHRvU2NpICczKycgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MTkgdG9TY2kgJycgICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUyMCB0b1NjaSAnMWUtJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTIxIHRvU2NpICc3ZTk5OTk5YScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MjIgdG9TY2kgJzdlMTIzNTY3ODkweCcgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUyMyB0b1NjaSAnN2UxMjM1Njc4OTAxMngnICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTI0IHRvU2NpICcnICAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MjUgdG9TY2kgJ2UxMDAnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUyNiB0b1NjaSAnXHUwZTVhJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTI3IHRvU2NpICdcdTBiNjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MjggdG9TY2kgJzEyMyw2NScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUyOSB0b1NjaSAnMS4zNC41JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTMwIHRvU2NpICcuMTIzLjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MzEgdG9TY2kgJzAxLjM1LicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUzMiB0b1NjaSAnMDEuMzUtJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTMzIHRvU2NpICcwMDAwLi4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MzQgdG9TY2kgJy4wMDAwLicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUzNSB0b1NjaSAnMDAuLjAwJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTM2IHRvU2NpICcxMTFlKjEyMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1MzcgdG9TY2kgJzExMWUxMjMtJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczUzOCB0b1NjaSAnMTExZSsxMisnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTM5IHRvU2NpICcxMTFlMS0zLScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NDAgdG9TY2kgJzExMWUxKjIzJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU0MSB0b1NjaSAnMTExZTFlKzMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTQyIHRvU2NpICcxZTEuMCcgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NDMgdG9TY2kgJzFlMTIzZScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU0NCB0b1NjaSAndGVuJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTQ1IHRvU2NpICdPTkUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NDYgdG9TY2kgJzFlLjEnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU0NyB0b1NjaSAnMWUxLicgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTQ4IHRvU2NpICcxZWUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NDkgdG9TY2kgJ2UrMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU1MCB0b1NjaSAnMS4yMy40JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTUxIHRvU2NpICcxLjIuMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NTIgdG9TY2kgJzFFKzEuMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU1MyB0b1NjaSAnMUUrMS4yLjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTU0IHRvU2NpICcxRSsrMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NTUgdG9TY2kgJzFFLS0xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU1NiB0b1NjaSAnMUUrLTEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTU3IHRvU2NpICcxRS0rMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NTggdG9TY2kgJzFFJycxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU1OSB0b1NjaSAiMUUiIjEiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTYwIHRvU2NpICIxRSIiIiIiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorLS0gTmVhci1zcGVjaWFscworZHFiYXM1NjEgdG9TY2kgInFOYU4iICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU2MiB0b1NjaSAiTmFOcSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTYzIHRvU2NpICJOYU5zIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NjQgdG9TY2kgIkluZmkiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU2NSB0b1NjaSAiSW5maW4iICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTY2IHRvU2NpICJJbmZpbmkiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NjcgdG9TY2kgIkluZmluaXQiICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU2OCB0b1NjaSAiLUluZmluaXQiICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTY5IHRvU2NpICIwSW5mIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NzAgdG9TY2kgIjlJbmYiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU3MSB0b1NjaSAiLTBJbmYiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTcyIHRvU2NpICItOUluZiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1NzMgdG9TY2kgIi1zTmEiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczU3NCB0b1NjaSAieE5hTiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTc1IHRvU2NpICIwc05hTiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBzb21lIGJhZGRpZXMgd2l0aCBkb3RzIGFuZCBFcyBhbmQgZG90cyBhbmQgc3BlY2lhbHMKK2RxYmFzNTc2IHRvU2NpICAnZSsxJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTc3IHRvU2NpICAnLmUrMScgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTc4IHRvU2NpICAnKy5lKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTc5IHRvU2NpICAnLS5lKycgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTgwIHRvU2NpICAnLS5lJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTgxIHRvU2NpICAnRSsxJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTgyIHRvU2NpICAnLkUrMScgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTgzIHRvU2NpICAnKy5FKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTg0IHRvU2NpICAnLS5FKycgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNTg1IHRvU2NpICAnLS5FJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworZHFiYXM1ODYgdG9TY2kgICcuTmFOJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODcgdG9TY2kgICctLk5hTicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODggdG9TY2kgICcrLnNOYU4nICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1ODkgdG9TY2kgICcrLkluZicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM1OTAgdG9TY2kgICcuSW5maW5pdHknICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBaZXJvcworZHFiYXM2MDEgdG9TY2kgMC4wMDAwMDAwMDAgICAgICAgLT4gMEUtOQorZHFiYXM2MDIgdG9TY2kgMC4wMDAwMDAwMCAgICAgICAgLT4gMEUtOAorZHFiYXM2MDMgdG9TY2kgMC4wMDAwMDAwICAgICAgICAgLT4gMEUtNworZHFiYXM2MDQgdG9TY2kgMC4wMDAwMDAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RxYmFzNjA1IHRvU2NpIDAuMDAwMDAgICAgICAgICAgIC0+IDAuMDAwMDAKK2RxYmFzNjA2IHRvU2NpIDAuMDAwMCAgICAgICAgICAgIC0+IDAuMDAwMAorZHFiYXM2MDcgdG9TY2kgMC4wMDAgICAgICAgICAgICAgLT4gMC4wMDAKK2RxYmFzNjA4IHRvU2NpIDAuMDAgICAgICAgICAgICAgIC0+IDAuMDAKK2RxYmFzNjA5IHRvU2NpIDAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZHFiYXM2MTAgdG9TY2kgIC4wICAgICAgICAgICAgICAgLT4gMC4wCitkcWJhczYxMSB0b1NjaSAwLiAgICAgICAgICAgICAgICAtPiAwCitkcWJhczYxMiB0b1NjaSAtLjAgICAgICAgICAgICAgICAtPiAtMC4wCitkcWJhczYxMyB0b1NjaSAtMC4gICAgICAgICAgICAgICAtPiAtMAorZHFiYXM2MTQgdG9TY2kgLTAuMCAgICAgICAgICAgICAgLT4gLTAuMAorZHFiYXM2MTUgdG9TY2kgLTAuMDAgICAgICAgICAgICAgLT4gLTAuMDAKK2RxYmFzNjE2IHRvU2NpIC0wLjAwMCAgICAgICAgICAgIC0+IC0wLjAwMAorZHFiYXM2MTcgdG9TY2kgLTAuMDAwMCAgICAgICAgICAgLT4gLTAuMDAwMAorZHFiYXM2MTggdG9TY2kgLTAuMDAwMDAgICAgICAgICAgLT4gLTAuMDAwMDAKK2RxYmFzNjE5IHRvU2NpIC0wLjAwMDAwMCAgICAgICAgIC0+IC0wLjAwMDAwMAorZHFiYXM2MjAgdG9TY2kgLTAuMDAwMDAwMCAgICAgICAgLT4gLTBFLTcKK2RxYmFzNjIxIHRvU2NpIC0wLjAwMDAwMDAwICAgICAgIC0+IC0wRS04CitkcWJhczYyMiB0b1NjaSAtMC4wMDAwMDAwMDAgICAgICAtPiAtMEUtOQorCitkcWJhczYzMCB0b1NjaSAgMC4wMEUrMCAgICAgICAgICAtPiAwLjAwCitkcWJhczYzMSB0b1NjaSAgMC4wMEUrMSAgICAgICAgICAtPiAwLjAKK2RxYmFzNjMyIHRvU2NpICAwLjAwRSsyICAgICAgICAgIC0+IDAKK2RxYmFzNjMzIHRvU2NpICAwLjAwRSszICAgICAgICAgIC0+IDBFKzEKK2RxYmFzNjM0IHRvU2NpICAwLjAwRSs0ICAgICAgICAgIC0+IDBFKzIKK2RxYmFzNjM1IHRvU2NpICAwLjAwRSs1ICAgICAgICAgIC0+IDBFKzMKK2RxYmFzNjM2IHRvU2NpICAwLjAwRSs2ICAgICAgICAgIC0+IDBFKzQKK2RxYmFzNjM3IHRvU2NpICAwLjAwRSs3ICAgICAgICAgIC0+IDBFKzUKK2RxYmFzNjM4IHRvU2NpICAwLjAwRSs4ICAgICAgICAgIC0+IDBFKzYKK2RxYmFzNjM5IHRvU2NpICAwLjAwRSs5ICAgICAgICAgIC0+IDBFKzcKKworZHFiYXM2NDAgdG9TY2kgIDAuMEUrMCAgICAgICAgICAgLT4gMC4wCitkcWJhczY0MSB0b1NjaSAgMC4wRSsxICAgICAgICAgICAtPiAwCitkcWJhczY0MiB0b1NjaSAgMC4wRSsyICAgICAgICAgICAtPiAwRSsxCitkcWJhczY0MyB0b1NjaSAgMC4wRSszICAgICAgICAgICAtPiAwRSsyCitkcWJhczY0NCB0b1NjaSAgMC4wRSs0ICAgICAgICAgICAtPiAwRSszCitkcWJhczY0NSB0b1NjaSAgMC4wRSs1ICAgICAgICAgICAtPiAwRSs0CitkcWJhczY0NiB0b1NjaSAgMC4wRSs2ICAgICAgICAgICAtPiAwRSs1CitkcWJhczY0NyB0b1NjaSAgMC4wRSs3ICAgICAgICAgICAtPiAwRSs2CitkcWJhczY0OCB0b1NjaSAgMC4wRSs4ICAgICAgICAgICAtPiAwRSs3CitkcWJhczY0OSB0b1NjaSAgMC4wRSs5ICAgICAgICAgICAtPiAwRSs4CisKK2RxYmFzNjUwIHRvU2NpICAwRSswICAgICAgICAgICAgIC0+IDAKK2RxYmFzNjUxIHRvU2NpICAwRSsxICAgICAgICAgICAgIC0+IDBFKzEKK2RxYmFzNjUyIHRvU2NpICAwRSsyICAgICAgICAgICAgIC0+IDBFKzIKK2RxYmFzNjUzIHRvU2NpICAwRSszICAgICAgICAgICAgIC0+IDBFKzMKK2RxYmFzNjU0IHRvU2NpICAwRSs0ICAgICAgICAgICAgIC0+IDBFKzQKK2RxYmFzNjU1IHRvU2NpICAwRSs1ICAgICAgICAgICAgIC0+IDBFKzUKK2RxYmFzNjU2IHRvU2NpICAwRSs2ICAgICAgICAgICAgIC0+IDBFKzYKK2RxYmFzNjU3IHRvU2NpICAwRSs3ICAgICAgICAgICAgIC0+IDBFKzcKK2RxYmFzNjU4IHRvU2NpICAwRSs4ICAgICAgICAgICAgIC0+IDBFKzgKK2RxYmFzNjU5IHRvU2NpICAwRSs5ICAgICAgICAgICAgIC0+IDBFKzkKKworZHFiYXM2NjAgdG9TY2kgIDAuMEUtMCAgICAgICAgICAgLT4gMC4wCitkcWJhczY2MSB0b1NjaSAgMC4wRS0xICAgICAgICAgICAtPiAwLjAwCitkcWJhczY2MiB0b1NjaSAgMC4wRS0yICAgICAgICAgICAtPiAwLjAwMAorZHFiYXM2NjMgdG9TY2kgIDAuMEUtMyAgICAgICAgICAgLT4gMC4wMDAwCitkcWJhczY2NCB0b1NjaSAgMC4wRS00ICAgICAgICAgICAtPiAwLjAwMDAwCitkcWJhczY2NSB0b1NjaSAgMC4wRS01ICAgICAgICAgICAtPiAwLjAwMDAwMAorZHFiYXM2NjYgdG9TY2kgIDAuMEUtNiAgICAgICAgICAgLT4gMEUtNworZHFiYXM2NjcgdG9TY2kgIDAuMEUtNyAgICAgICAgICAgLT4gMEUtOAorZHFiYXM2NjggdG9TY2kgIDAuMEUtOCAgICAgICAgICAgLT4gMEUtOQorZHFiYXM2NjkgdG9TY2kgIDAuMEUtOSAgICAgICAgICAgLT4gMEUtMTAKKworZHFiYXM2NzAgdG9TY2kgIDAuMDBFLTAgICAgICAgICAgLT4gMC4wMAorZHFiYXM2NzEgdG9TY2kgIDAuMDBFLTEgICAgICAgICAgLT4gMC4wMDAKK2RxYmFzNjcyIHRvU2NpICAwLjAwRS0yICAgICAgICAgIC0+IDAuMDAwMAorZHFiYXM2NzMgdG9TY2kgIDAuMDBFLTMgICAgICAgICAgLT4gMC4wMDAwMAorZHFiYXM2NzQgdG9TY2kgIDAuMDBFLTQgICAgICAgICAgLT4gMC4wMDAwMDAKK2RxYmFzNjc1IHRvU2NpICAwLjAwRS01ICAgICAgICAgIC0+IDBFLTcKK2RxYmFzNjc2IHRvU2NpICAwLjAwRS02ICAgICAgICAgIC0+IDBFLTgKK2RxYmFzNjc3IHRvU2NpICAwLjAwRS03ICAgICAgICAgIC0+IDBFLTkKK2RxYmFzNjc4IHRvU2NpICAwLjAwRS04ICAgICAgICAgIC0+IDBFLTEwCitkcWJhczY3OSB0b1NjaSAgMC4wMEUtOSAgICAgICAgICAtPiAwRS0xMQorCitkcWJhczY4MCB0b1NjaSAgMDAwMDAwLiAgICAgICAgICAtPiAgMAorZHFiYXM2ODEgdG9TY2kgICAwMDAwMC4gICAgICAgICAgLT4gIDAKK2RxYmFzNjgyIHRvU2NpICAgIDAwMDAuICAgICAgICAgIC0+ICAwCitkcWJhczY4MyB0b1NjaSAgICAgMDAwLiAgICAgICAgICAtPiAgMAorZHFiYXM2ODQgdG9TY2kgICAgICAwMC4gICAgICAgICAgLT4gIDAKK2RxYmFzNjg1IHRvU2NpICAgICAgIDAuICAgICAgICAgIC0+ICAwCitkcWJhczY4NiB0b1NjaSAgKzAwMDAwLiAgICAgICAgICAtPiAgMAorZHFiYXM2ODcgdG9TY2kgIC0wMDAwMC4gICAgICAgICAgLT4gLTAKK2RxYmFzNjg4IHRvU2NpICArMC4gICAgICAgICAgICAgIC0+ICAwCitkcWJhczY4OSB0b1NjaSAgLTAuICAgICAgICAgICAgICAtPiAtMAorCistLSBTcGVjaWFscworZHFiYXM3MDAgdG9TY2kgIk5hTiIgICAgICAgICAgICAgLT4gTmFOCitkcWJhczcwMSB0b1NjaSAibmFuIiAgICAgICAgICAgICAtPiBOYU4KK2RxYmFzNzAyIHRvU2NpICJuQW4iICAgICAgICAgICAgIC0+IE5hTgorZHFiYXM3MDMgdG9TY2kgIk5BTiIgICAgICAgICAgICAgLT4gTmFOCitkcWJhczcwNCB0b1NjaSAiK05hTiIgICAgICAgICAgICAtPiBOYU4KK2RxYmFzNzA1IHRvU2NpICIrbmFuIiAgICAgICAgICAgIC0+IE5hTgorZHFiYXM3MDYgdG9TY2kgIituQW4iICAgICAgICAgICAgLT4gTmFOCitkcWJhczcwNyB0b1NjaSAiK05BTiIgICAgICAgICAgICAtPiBOYU4KK2RxYmFzNzA4IHRvU2NpICItTmFOIiAgICAgICAgICAgIC0+IC1OYU4KK2RxYmFzNzA5IHRvU2NpICItbmFuIiAgICAgICAgICAgIC0+IC1OYU4KK2RxYmFzNzEwIHRvU2NpICItbkFuIiAgICAgICAgICAgIC0+IC1OYU4KK2RxYmFzNzExIHRvU2NpICItTkFOIiAgICAgICAgICAgIC0+IC1OYU4KK2RxYmFzNzEyIHRvU2NpICdOYU4wJyAgICAgICAgICAgIC0+IE5hTgorZHFiYXM3MTMgdG9TY2kgJ05hTjEnICAgICAgICAgICAgLT4gTmFOMQorZHFiYXM3MTQgdG9TY2kgJ05hTjEyJyAgICAgICAgICAgLT4gTmFOMTIKK2RxYmFzNzE1IHRvU2NpICdOYU4xMjMnICAgICAgICAgIC0+IE5hTjEyMworZHFiYXM3MTYgdG9TY2kgJ05hTjEyMzQnICAgICAgICAgLT4gTmFOMTIzNAorZHFiYXM3MTcgdG9TY2kgJ05hTjAxJyAgICAgICAgICAgLT4gTmFOMQorZHFiYXM3MTggdG9TY2kgJ05hTjAxMicgICAgICAgICAgLT4gTmFOMTIKK2RxYmFzNzE5IHRvU2NpICdOYU4wMTIzJyAgICAgICAgIC0+IE5hTjEyMworZHFiYXM3MjAgdG9TY2kgJ05hTjAxMjM0JyAgICAgICAgLT4gTmFOMTIzNAorZHFiYXM3MjEgdG9TY2kgJ05hTjAwMScgICAgICAgICAgLT4gTmFOMQorZHFiYXM3MjIgdG9TY2kgJ05hTjAwMTInICAgICAgICAgLT4gTmFOMTIKK2RxYmFzNzIzIHRvU2NpICdOYU4wMDEyMycgICAgICAgIC0+IE5hTjEyMworZHFiYXM3MjQgdG9TY2kgJ05hTjAwMTIzNCcgICAgICAgLT4gTmFOMTIzNAorZHFiYXM3MjUgdG9TY2kgJ05hTjEyMzQ1Njc4OTAxMjM0NTY3ODEyMzQ1Njc4OTAxMjM0NTYnIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM3MjYgdG9TY2kgJ05hTjEyM2UrMScgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczcyNyB0b1NjaSAnTmFOMTIuNDUnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNzI4IHRvU2NpICdOYU4tMTInICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHFiYXM3MjkgdG9TY2kgJ05hTisxMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2RxYmFzNzMwIHRvU2NpICJzTmFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzMxIHRvU2NpICJzbmFuIiAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzMyIHRvU2NpICJTbkFuIiAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzMzIHRvU2NpICJTTkFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzM0IHRvU2NpICIrc05hTiIgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzM1IHRvU2NpICIrc25hbiIgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzM2IHRvU2NpICIrU25BbiIgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzM3IHRvU2NpICIrU05BTiIgICAgICAgICAgIC0+IHNOYU4KK2RxYmFzNzM4IHRvU2NpICItc05hTiIgICAgICAgICAgIC0+IC1zTmFOCitkcWJhczczOSB0b1NjaSAiLXNuYW4iICAgICAgICAgICAtPiAtc05hTgorZHFiYXM3NDAgdG9TY2kgIi1TbkFuIiAgICAgICAgICAgLT4gLXNOYU4KK2RxYmFzNzQxIHRvU2NpICItU05BTiIgICAgICAgICAgIC0+IC1zTmFOCitkcWJhczc0MiB0b1NjaSAnc05hTjAwMDAnICAgICAgICAtPiBzTmFOCitkcWJhczc0MyB0b1NjaSAnc05hTjcnICAgICAgICAgICAtPiBzTmFONworZHFiYXM3NDQgdG9TY2kgJ3NOYU4wMDcyMzQnICAgICAgLT4gc05hTjcyMzQKK2RxYmFzNzQ1IHRvU2NpICdzTmFOMTIzNDU2Nzg5MDEyMzQ1Njc4NzIzNDU2MTIzNDU2Nzg5MCcgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CitkcWJhczc0NiB0b1NjaSAnc05hTjcyLjQ1JyAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RxYmFzNzQ3IHRvU2NpICdzTmFOLTcyJyAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitkcWJhczc0OCB0b1NjaSAiSW5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NDkgdG9TY2kgImluZiIgICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzUwIHRvU2NpICJpTmYiICAgICAgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc1MSB0b1NjaSAiSU5GIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NTIgdG9TY2kgIitJbmYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzUzIHRvU2NpICIraW5mIiAgICAgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc1NCB0b1NjaSAiK2lOZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NTUgdG9TY2kgIitJTkYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzU2IHRvU2NpICItSW5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorZHFiYXM3NTcgdG9TY2kgIi1pbmYiICAgICAgICAgICAgLT4gLUluZmluaXR5CitkcWJhczc1OCB0b1NjaSAiLWlOZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2RxYmFzNzU5IHRvU2NpICItSU5GIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorCitkcWJhczc2MCB0b1NjaSAiSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NjEgdG9TY2kgImluZmluaXR5IiAgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzYyIHRvU2NpICJpTmZJbkl0WSIgICAgICAgIC0+IEluZmluaXR5CitkcWJhczc2MyB0b1NjaSAiSU5GSU5JVFkiICAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NjQgdG9TY2kgIitJbmZpbml0eSIgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzY1IHRvU2NpICIraW5maW5pdHkiICAgICAgIC0+IEluZmluaXR5CitkcWJhczc2NiB0b1NjaSAiK2lOZkluSXRZIiAgICAgICAtPiBJbmZpbml0eQorZHFiYXM3NjcgdG9TY2kgIitJTkZJTklUWSIgICAgICAgLT4gSW5maW5pdHkKK2RxYmFzNzY4IHRvU2NpICItSW5maW5pdHkiICAgICAgIC0+IC1JbmZpbml0eQorZHFiYXM3NjkgdG9TY2kgIi1pbmZpbml0eSIgICAgICAgLT4gLUluZmluaXR5CitkcWJhczc3MCB0b1NjaSAiLWlOZkluSXRZIiAgICAgICAtPiAtSW5maW5pdHkKK2RxYmFzNzcxIHRvU2NpICItSU5GSU5JVFkiICAgICAgIC0+IC1JbmZpbml0eQorCistLSBTcGVjaWFscyBhbmQgemVyb3MgZm9yIHRvRW5nCitkcWJhc3Q3NzIgdG9FbmcgIk5hTiIgICAgICAgICAgICAgIC0+IE5hTgorZHFiYXN0NzczIHRvRW5nICItSW5maW5pdHkiICAgICAgICAtPiAtSW5maW5pdHkKK2RxYmFzdDc3NCB0b0VuZyAiLXNOYU4iICAgICAgICAgICAgLT4gLXNOYU4KK2RxYmFzdDc3NSB0b0VuZyAiLU5hTiIgICAgICAgICAgICAgLT4gLU5hTgorZHFiYXN0Nzc2IHRvRW5nICIrSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZHFiYXN0Nzc4IHRvRW5nICIrc05hTiIgICAgICAgICAgICAtPiBzTmFOCitkcWJhc3Q3NzkgdG9FbmcgIitOYU4iICAgICAgICAgICAgIC0+IE5hTgorZHFiYXN0NzgwIHRvRW5nICJJTkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXN0NzgxIHRvRW5nICJTTkFOIiAgICAgICAgICAgICAtPiBzTmFOCitkcWJhc3Q3ODIgdG9FbmcgIk5BTiIgICAgICAgICAgICAgIC0+IE5hTgorZHFiYXN0NzgzIHRvRW5nICJpbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXN0Nzg0IHRvRW5nICJzbmFuIiAgICAgICAgICAgICAtPiBzTmFOCitkcWJhc3Q3ODUgdG9FbmcgIm5hbiIgICAgICAgICAgICAgIC0+IE5hTgorZHFiYXN0Nzg2IHRvRW5nICJJbkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXN0Nzg3IHRvRW5nICJTbkFOIiAgICAgICAgICAgICAtPiBzTmFOCitkcWJhc3Q3ODggdG9FbmcgIm5BTiIgICAgICAgICAgICAgIC0+IE5hTgorZHFiYXN0Nzg5IHRvRW5nICJpTmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXN0NzkwIHRvRW5nICJzTmFuIiAgICAgICAgICAgICAtPiBzTmFOCitkcWJhc3Q3OTEgdG9FbmcgIk5hbiIgICAgICAgICAgICAgIC0+IE5hTgorZHFiYXN0NzkyIHRvRW5nICJJbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZHFiYXN0NzkzIHRvRW5nICJzTmFOIiAgICAgICAgICAgICAtPiBzTmFOCisKKy0tIFplcm8gdG9FbmcsIGV0Yy4KK2RxYmFzdDgwMCB0b0VuZyAwZSsxICAgICAgICAgICAgICAtPiAiMC4wMEUrMyIgIC0tIGRvYyBleGFtcGxlCisKK2RxYmFzdDgwMSB0b0VuZyAwLjAwMDAwMDAwMCAgICAgICAtPiAwRS05CitkcWJhc3Q4MDIgdG9FbmcgMC4wMDAwMDAwMCAgICAgICAgLT4gMC4wMEUtNgorZHFiYXN0ODAzIHRvRW5nIDAuMDAwMDAwMCAgICAgICAgIC0+IDAuMEUtNgorZHFiYXN0ODA0IHRvRW5nIDAuMDAwMDAwICAgICAgICAgIC0+IDAuMDAwMDAwCitkcWJhc3Q4MDUgdG9FbmcgMC4wMDAwMCAgICAgICAgICAgLT4gMC4wMDAwMAorZHFiYXN0ODA2IHRvRW5nIDAuMDAwMCAgICAgICAgICAgIC0+IDAuMDAwMAorZHFiYXN0ODA3IHRvRW5nIDAuMDAwICAgICAgICAgICAgIC0+IDAuMDAwCitkcWJhc3Q4MDggdG9FbmcgMC4wMCAgICAgICAgICAgICAgLT4gMC4wMAorZHFiYXN0ODA5IHRvRW5nIDAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZHFiYXN0ODEwIHRvRW5nICAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZHFiYXN0ODExIHRvRW5nIDAuICAgICAgICAgICAgICAgIC0+IDAKK2RxYmFzdDgxMiB0b0VuZyAtLjAgICAgICAgICAgICAgICAtPiAtMC4wCitkcWJhc3Q4MTMgdG9FbmcgLTAuICAgICAgICAgICAgICAgLT4gLTAKK2RxYmFzdDgxNCB0b0VuZyAtMC4wICAgICAgICAgICAgICAtPiAtMC4wCitkcWJhc3Q4MTUgdG9FbmcgLTAuMDAgICAgICAgICAgICAgLT4gLTAuMDAKK2RxYmFzdDgxNiB0b0VuZyAtMC4wMDAgICAgICAgICAgICAtPiAtMC4wMDAKK2RxYmFzdDgxNyB0b0VuZyAtMC4wMDAwICAgICAgICAgICAtPiAtMC4wMDAwCitkcWJhc3Q4MTggdG9FbmcgLTAuMDAwMDAgICAgICAgICAgLT4gLTAuMDAwMDAKK2RxYmFzdDgxOSB0b0VuZyAtMC4wMDAwMDAgICAgICAgICAtPiAtMC4wMDAwMDAKK2RxYmFzdDgyMCB0b0VuZyAtMC4wMDAwMDAwICAgICAgICAtPiAtMC4wRS02CitkcWJhc3Q4MjEgdG9FbmcgLTAuMDAwMDAwMDAgICAgICAgLT4gLTAuMDBFLTYKK2RxYmFzdDgyMiB0b0VuZyAtMC4wMDAwMDAwMDAgICAgICAtPiAtMEUtOQorCitkcWJhc3Q4MzAgdG9FbmcgIDAuMDBFKzAgICAgICAgICAgLT4gMC4wMAorZHFiYXN0ODMxIHRvRW5nICAwLjAwRSsxICAgICAgICAgIC0+IDAuMAorZHFiYXN0ODMyIHRvRW5nICAwLjAwRSsyICAgICAgICAgIC0+IDAKK2RxYmFzdDgzMyB0b0VuZyAgMC4wMEUrMyAgICAgICAgICAtPiAwLjAwRSszCitkcWJhc3Q4MzQgdG9FbmcgIDAuMDBFKzQgICAgICAgICAgLT4gMC4wRSszCitkcWJhc3Q4MzUgdG9FbmcgIDAuMDBFKzUgICAgICAgICAgLT4gMEUrMworZHFiYXN0ODM2IHRvRW5nICAwLjAwRSs2ICAgICAgICAgIC0+IDAuMDBFKzYKK2RxYmFzdDgzNyB0b0VuZyAgMC4wMEUrNyAgICAgICAgICAtPiAwLjBFKzYKK2RxYmFzdDgzOCB0b0VuZyAgMC4wMEUrOCAgICAgICAgICAtPiAwRSs2CitkcWJhc3Q4MzkgdG9FbmcgIDAuMDBFKzkgICAgICAgICAgLT4gMC4wMEUrOQorCitkcWJhc3Q4NDAgdG9FbmcgIDAuMEUrMCAgICAgICAgICAgLT4gMC4wCitkcWJhc3Q4NDEgdG9FbmcgIDAuMEUrMSAgICAgICAgICAgLT4gMAorZHFiYXN0ODQyIHRvRW5nICAwLjBFKzIgICAgICAgICAgIC0+IDAuMDBFKzMKK2RxYmFzdDg0MyB0b0VuZyAgMC4wRSszICAgICAgICAgICAtPiAwLjBFKzMKK2RxYmFzdDg0NCB0b0VuZyAgMC4wRSs0ICAgICAgICAgICAtPiAwRSszCitkcWJhc3Q4NDUgdG9FbmcgIDAuMEUrNSAgICAgICAgICAgLT4gMC4wMEUrNgorZHFiYXN0ODQ2IHRvRW5nICAwLjBFKzYgICAgICAgICAgIC0+IDAuMEUrNgorZHFiYXN0ODQ3IHRvRW5nICAwLjBFKzcgICAgICAgICAgIC0+IDBFKzYKK2RxYmFzdDg0OCB0b0VuZyAgMC4wRSs4ICAgICAgICAgICAtPiAwLjAwRSs5CitkcWJhc3Q4NDkgdG9FbmcgIDAuMEUrOSAgICAgICAgICAgLT4gMC4wRSs5CisKK2RxYmFzdDg1MCB0b0VuZyAgMEUrMCAgICAgICAgICAgICAtPiAwCitkcWJhc3Q4NTEgdG9FbmcgIDBFKzEgICAgICAgICAgICAgLT4gMC4wMEUrMworZHFiYXN0ODUyIHRvRW5nICAwRSsyICAgICAgICAgICAgIC0+IDAuMEUrMworZHFiYXN0ODUzIHRvRW5nICAwRSszICAgICAgICAgICAgIC0+IDBFKzMKK2RxYmFzdDg1NCB0b0VuZyAgMEUrNCAgICAgICAgICAgICAtPiAwLjAwRSs2CitkcWJhc3Q4NTUgdG9FbmcgIDBFKzUgICAgICAgICAgICAgLT4gMC4wRSs2CitkcWJhc3Q4NTYgdG9FbmcgIDBFKzYgICAgICAgICAgICAgLT4gMEUrNgorZHFiYXN0ODU3IHRvRW5nICAwRSs3ICAgICAgICAgICAgIC0+IDAuMDBFKzkKK2RxYmFzdDg1OCB0b0VuZyAgMEUrOCAgICAgICAgICAgICAtPiAwLjBFKzkKK2RxYmFzdDg1OSB0b0VuZyAgMEUrOSAgICAgICAgICAgICAtPiAwRSs5CisKK2RxYmFzdDg2MCB0b0VuZyAgMC4wRS0wICAgICAgICAgICAtPiAwLjAKK2RxYmFzdDg2MSB0b0VuZyAgMC4wRS0xICAgICAgICAgICAtPiAwLjAwCitkcWJhc3Q4NjIgdG9FbmcgIDAuMEUtMiAgICAgICAgICAgLT4gMC4wMDAKK2RxYmFzdDg2MyB0b0VuZyAgMC4wRS0zICAgICAgICAgICAtPiAwLjAwMDAKK2RxYmFzdDg2NCB0b0VuZyAgMC4wRS00ICAgICAgICAgICAtPiAwLjAwMDAwCitkcWJhc3Q4NjUgdG9FbmcgIDAuMEUtNSAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RxYmFzdDg2NiB0b0VuZyAgMC4wRS02ICAgICAgICAgICAtPiAwLjBFLTYKK2RxYmFzdDg2NyB0b0VuZyAgMC4wRS03ICAgICAgICAgICAtPiAwLjAwRS02CitkcWJhc3Q4NjggdG9FbmcgIDAuMEUtOCAgICAgICAgICAgLT4gMEUtOQorZHFiYXN0ODY5IHRvRW5nICAwLjBFLTkgICAgICAgICAgIC0+IDAuMEUtOQorCitkcWJhc3Q4NzAgdG9FbmcgIDAuMDBFLTAgICAgICAgICAgLT4gMC4wMAorZHFiYXN0ODcxIHRvRW5nICAwLjAwRS0xICAgICAgICAgIC0+IDAuMDAwCitkcWJhc3Q4NzIgdG9FbmcgIDAuMDBFLTIgICAgICAgICAgLT4gMC4wMDAwCitkcWJhc3Q4NzMgdG9FbmcgIDAuMDBFLTMgICAgICAgICAgLT4gMC4wMDAwMAorZHFiYXN0ODc0IHRvRW5nICAwLjAwRS00ICAgICAgICAgIC0+IDAuMDAwMDAwCitkcWJhc3Q4NzUgdG9FbmcgIDAuMDBFLTUgICAgICAgICAgLT4gMC4wRS02CitkcWJhc3Q4NzYgdG9FbmcgIDAuMDBFLTYgICAgICAgICAgLT4gMC4wMEUtNgorZHFiYXN0ODc3IHRvRW5nICAwLjAwRS03ICAgICAgICAgIC0+IDBFLTkKK2RxYmFzdDg3OCB0b0VuZyAgMC4wMEUtOCAgICAgICAgICAtPiAwLjBFLTkKK2RxYmFzdDg3OSB0b0VuZyAgMC4wMEUtOSAgICAgICAgICAtPiAwLjAwRS05CisKKy0tIGxvbmcgaW5wdXQgc3RyaW5ncworZHFiYXM4MDEgdG9zY2kgJzAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwMiB0b3NjaSAnMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwMyB0b3NjaSAnMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MDQgdG9zY2kgJzAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwNSB0b3NjaSAnMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwNiB0b3NjaSAnMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MDcgdG9zY2kgJzAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwOCB0b3NjaSAnMDAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CitkcWJhczgwOSB0b3NjaSAnMDAwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MTAgdG9zY2kgJzAwMDAwMDAwMDAxMjM0NTY3ODkwMTIzNDU2JyAtPiAxMjM0NTY3ODkwMTIzNDU2CisKK2RxYmFzODExIHRvc2NpICcwLjEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MTIgdG9zY2kgJzAuMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODEzIHRvc2NpICcwLjAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4wMDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODE0IHRvc2NpICcwLjAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDAwMTIzNDU2Nzg5MDEyMzQ1NgorZHFiYXM4MTUgdG9zY2kgJzAuMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDAuMDAwMDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODE2IHRvc2NpICcwLjAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMC4wMDAwMDEyMzQ1Njc4OTAxMjM0NTYKK2RxYmFzODE3IHRvc2NpICcwLjAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkwMTIzNDU2RS03CitkcWJhczgxOCB0b3NjaSAnMC4wMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFLTgKK2RxYmFzODE5IHRvc2NpICcwLjAwMDAwMDAwMTIzNDU2Nzg5MDEyMzQ1NicgLT4gMS4yMzQ1Njc4OTAxMjM0NTZFLTkKK2RxYmFzODIwIHRvc2NpICcwLjAwMDAwMDAwMDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkwMTIzNDU2RS0xMAorCitkcWJhczgyMSB0b3NjaSAnMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1Njc4OTAnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSszNyBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODIyIHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSszOCBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODIzIHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEyJyAtPiAxLjIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1N0UrMzkgSW5leGFjdCBSb3VuZGVkCitkcWJhczgyNCB0b3NjaSAnMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1Njc4OTAxMjMnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSs0MCBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODI1IHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEyMzQnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSs0MSBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODI2IHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEyMzQ1JyAtPiAxLjIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1N0UrNDIgSW5leGFjdCBSb3VuZGVkCitkcWJhczgyNyB0b3NjaSAnMTIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1Njc4OTAxMjM0NTYnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSs0MyBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODI4IHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEyMzQ1NjcnIC0+IDEuMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU3RSs0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzODI5IHRvc2NpICcxMjM0NTY3ODkxMjM0NTY3ODkwMTIzNDU2NzgwMTIzNDU2Nzg5MDEyMzQ1Njc4JyAtPiAxLjIzNDU2Nzg5MTIzNDU2Nzg5MDEyMzQ1Njc4MDEyMzQ1N0UrNDUgSW5leGFjdCBSb3VuZGVkCisKKy0tIHN1Ym5vcm1hbHMgYW5kIG92ZXJmbG93cworZHFiYXM5MDYgdG9TY2kgJzk5ZTk5OTk5OTk5OScgICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MDcgdG9TY2kgJzk5OWU5OTk5OTk5OTknICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MDggdG9TY2kgJzAuOWUtOTk5OTk5OTk5JyAgICAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczkwOSB0b1NjaSAnMC4wOWUtOTk5OTk5OTk5JyAgICAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTEwIHRvU2NpICcwLjFlMTAwMDAwMDAwMCcgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTExIHRvU2NpICcxMGUtMTAwMDAwMDAwMCcgICAgIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MTIgdG9TY2kgJzAuOWU5OTk5OTk5OTk5JyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MTMgdG9TY2kgJzk5ZS05OTk5OTk5OTk5JyAgICAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczkxNCB0b1NjaSAnMTExZTk5OTk5OTk5OTknICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkxNSB0b1NjaSAnMTExMWUtOTk5OTk5OTk5OScgICAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTE2IHRvU2NpICcxMTExZS05OTk5OTk5OTk5OScgIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MTcgdG9TY2kgJzdlMTAwMDAwMDAwMCcgICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorLS0gbmVnYXRpdmVzIHRoZSBzYW1lCitkcWJhczkxOCB0b1NjaSAnLTk5ZTk5OTk5OTk5OScgICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MTkgdG9TY2kgJy05OTllOTk5OTk5OTk5JyAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTIwIHRvU2NpICctMC45ZS05OTk5OTk5OTknICAgIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTIxIHRvU2NpICctMC4wOWUtOTk5OTk5OTk5JyAgIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTIyIHRvU2NpICctMC4xZTEwMDAwMDAwMDAnICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkyMyB0b1NjaSAnLTEwZS0xMDAwMDAwMDAwJyAgICAtPiAtMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczkyNCB0b1NjaSAnLTAuOWU5OTk5OTk5OTk5JyAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHFiYXM5MjUgdG9TY2kgJy05OWUtOTk5OTk5OTk5OScgICAgLT4gLTBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXM5MjYgdG9TY2kgJy0xMTFlOTk5OTk5OTk5OScgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTI3IHRvU2NpICctMTExMWUtOTk5OTk5OTk5OScgIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTI4IHRvU2NpICctMTExMWUtOTk5OTk5OTk5OTknIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzOTI5IHRvU2NpICctN2UxMDAwMDAwMDAwJyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93IHJlc3VsdHMgYXQgZGlmZmVyZW50IHJvdW5kaW5nIG1vZGVzCityb3VuZGluZzogIGNlaWxpbmcKK2RxYmFzOTMwIHRvU2NpICAnN2UxMDAwMCcgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkzMSB0b1NjaSAnLTdlMTAwMDAnICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICB1cAorZHFiYXM5MzIgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTMzIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGRvd24KK2RxYmFzOTM0IHRvU2NpICAnN2UxMDAwMCcgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkcWJhczkzNSB0b1NjaSAnLTdlMTAwMDAnICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICBmbG9vcgorZHFiYXM5MzYgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTM3IHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl91cAorZHFiYXM5MzggdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTM5IHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGhhbGZfZXZlbgorZHFiYXM5NDAgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTQxIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGhhbGZfZG93bgorZHFiYXM5NDIgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzOTQzIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCisKKy0tIE5vdyBjaGVjayA4NTQvNzU0ciBzb21lIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdyB0byAwCitkcWJlbTQwMCB0b1NjaSAgMS4wMDAwRS0zODMgICAgIC0+IDEuMDAwMEUtMzgzCitkcWJlbTQwMSB0b1NjaSAgMC4xRS02MTcyICAgICAgICAtPiAxRS02MTczICAgICAgIFN1Ym5vcm1hbAorZHFiZW00MDIgdG9TY2kgIDAuMTAwMEUtNjE3MiAgICAgLT4gMS4wMDBFLTYxNzMgICBTdWJub3JtYWwKK2RxYmVtNDAzIHRvU2NpICAwLjAxMDBFLTYxNzIgICAgIC0+IDEuMDBFLTYxNzQgICAgU3Vibm9ybWFsCitkcWJlbTQwNCB0b1NjaSAgMC4wMDEwRS02MTcyICAgICAtPiAxLjBFLTYxNzUgICAgIFN1Ym5vcm1hbAorZHFiZW00MDUgdG9TY2kgIDAuMDAwMUUtNjE3MiAgICAgLT4gMUUtNjE3NiAgICAgICBTdWJub3JtYWwKK2RxYmVtNDA2IHRvU2NpICAwLjAwMDEwRS02MTcyICAgIC0+IDFFLTYxNzYgICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcWJlbTQwNyB0b1NjaSAgMC4wMDAxM0UtNjE3MiAgICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MDggdG9TY2kgIDAuMDAwMTVFLTYxNzIgICAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDA5IHRvU2NpICAwLjAwMDE3RS02MTcyICAgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQxMCB0b1NjaSAgMC4wMDAyM0UtNjE3MiAgICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MTEgdG9TY2kgIDAuMDAwMjVFLTYxNzIgICAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDEyIHRvU2NpICAwLjAwMDI3RS02MTcyICAgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQxMyB0b1NjaSAgMC4wMDAxNDlFLTYxNzIgICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MTQgdG9TY2kgIDAuMDAwMTUwRS02MTcyICAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDE1IHRvU2NpICAwLjAwMDE1MUUtNjE3MiAgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQxNiB0b1NjaSAgMC4wMDAyNDlFLTYxNzIgICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MTcgdG9TY2kgIDAuMDAwMjUwRS02MTcyICAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDE4IHRvU2NpICAwLjAwMDI1MUUtNjE3MiAgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQxOSB0b1NjaSAgMC4wMDAwOUUtNjE3MiAgICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MjAgdG9TY2kgIDAuMDAwMDVFLTYxNzIgICAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiZW00MjEgdG9TY2kgIDAuMDAwMDNFLTYxNzIgICAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiZW00MjIgdG9TY2kgIDAuMDAwMDA5RS02MTcyICAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiZW00MjMgdG9TY2kgIDAuMDAwMDA1RS02MTcyICAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiZW00MjQgdG9TY2kgIDAuMDAwMDAzRS02MTcyICAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkcWJlbTQyNSB0b1NjaSAgMC4wMDEwNDlFLTYxNzIgICAtPiAxLjBFLTYxNzUgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MjYgdG9TY2kgIDAuMDAxMDUwRS02MTcyICAgLT4gMS4wRS02MTc1ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDI3IHRvU2NpICAwLjAwMTA1MUUtNjE3MiAgIC0+IDEuMUUtNjE3NSAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQyOCB0b1NjaSAgMC4wMDExNDlFLTYxNzIgICAtPiAxLjFFLTYxNzUgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MjkgdG9TY2kgIDAuMDAxMTUwRS02MTcyICAgLT4gMS4yRS02MTc1ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDMwIHRvU2NpICAwLjAwMTE1MUUtNjE3MiAgIC0+IDEuMkUtNjE3NSAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RxYmVtNDMyIHRvU2NpICAwLjAxMDA0OUUtNjE3MiAgIC0+IDEuMDBFLTYxNzQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQzMyB0b1NjaSAgMC4wMTAwNTBFLTYxNzIgICAtPiAxLjAwRS02MTc0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MzQgdG9TY2kgIDAuMDEwMDUxRS02MTcyICAgLT4gMS4wMUUtNjE3NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDM1IHRvU2NpICAwLjAxMDE0OUUtNjE3MiAgIC0+IDEuMDFFLTYxNzQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQzNiB0b1NjaSAgMC4wMTAxNTBFLTYxNzIgICAtPiAxLjAyRS02MTc0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00MzcgdG9TY2kgIDAuMDEwMTUxRS02MTcyICAgLT4gMS4wMkUtNjE3NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHFiZW00NDAgdG9TY2kgIDAuMTAxMDNFLTYxNzIgICAgLT4gMS4wMTBFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDQxIHRvU2NpICAwLjEwMTA1RS02MTcyICAgIC0+IDEuMDEwRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ0MiB0b1NjaSAgMC4xMDEwN0UtNjE3MiAgICAtPiAxLjAxMUUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NDMgdG9TY2kgIDAuMTAxMTNFLTYxNzIgICAgLT4gMS4wMTFFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDQ0IHRvU2NpICAwLjEwMTE1RS02MTcyICAgIC0+IDEuMDEyRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ0NSB0b1NjaSAgMC4xMDExN0UtNjE3MiAgICAtPiAxLjAxMkUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkcWJlbTQ1MCB0b1NjaSAgMS4xMDczMEUtNjE3MyAgIC0+IDEuMTA3RS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ1MSB0b1NjaSAgMS4xMDc1MEUtNjE3MyAgIC0+IDEuMTA4RS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ1MiB0b1NjaSAgMS4xMDc3MEUtNjE3MyAgIC0+IDEuMTA4RS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ1MyB0b1NjaSAgMS4xMDgzMEUtNjE3MyAgIC0+IDEuMTA4RS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ1NCB0b1NjaSAgMS4xMDg1MEUtNjE3MyAgIC0+IDEuMTA4RS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ1NSB0b1NjaSAgMS4xMDg3MEUtNjE3MyAgIC0+IDEuMTA5RS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1ha2Ugc3VyZSBzaWduIE9LCitkcWJlbTQ1NiB0b1NjaSAgLTAuMTAxMDNFLTYxNzIgICAtPiAtMS4wMTBFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDU3IHRvU2NpICAtMC4xMDEwNUUtNjE3MiAgIC0+IC0xLjAxMEUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NTggdG9TY2kgIC0wLjEwMTA3RS02MTcyICAgLT4gLTEuMDExRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ1OSB0b1NjaSAgLTAuMTAxMTNFLTYxNzIgICAtPiAtMS4wMTFFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDYwIHRvU2NpICAtMC4xMDExNUUtNjE3MiAgIC0+IC0xLjAxMkUtNjE3MyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NjEgdG9TY2kgIC0wLjEwMTE3RS02MTcyICAgLT4gLTEuMDEyRS02MTczIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tICc5OTlzJyBjYXNlcworZHFiZW00NjQgdG9TY2kgIDk5OTk5OUUtNjE3MyAgICAgICAgIC0+IDkuOTk5OTlFLTYxNjggU3Vibm9ybWFsCitkcWJlbTQ2NSB0b1NjaSAgOTk5OTkuMEUtNjE3MiAgICAgICAgLT4gOS45OTk5MEUtNjE2OCBTdWJub3JtYWwKK2RxYmVtNDY2IHRvU2NpICA5OTk5OS5FLTYxNzIgICAgICAgICAtPiA5Ljk5OTlFLTYxNjggIFN1Ym5vcm1hbAorZHFiZW00NjcgdG9TY2kgIDk5OTkuOUUtNjE3MiAgICAgICAgIC0+IDkuOTk5OUUtNjE2OSAgU3Vibm9ybWFsCitkcWJlbTQ2OCB0b1NjaSAgOTk5Ljk5RS02MTcyICAgICAgICAgLT4gOS45OTk5RS02MTcwICBTdWJub3JtYWwKK2RxYmVtNDY5IHRvU2NpICA5OS45OTlFLTYxNzIgICAgICAgICAtPiA5Ljk5OTlFLTYxNzEgIFN1Ym5vcm1hbAorZHFiZW00NzAgdG9TY2kgIDkuOTk5OUUtNjE3MiAgICAgICAgIC0+IDkuOTk5OUUtNjE3MiAgU3Vibm9ybWFsCitkcWJlbTQ3MSB0b1NjaSAgMC45OTk5OUUtNjE3MiAgICAgICAgLT4gMS4wMDAwRS02MTcyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ3MiB0b1NjaSAgMC4wOTk5OTlFLTYxNzIgICAgICAgLT4gMS4wMDBFLTYxNzMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDczIHRvU2NpICAwLjAwOTk5OTlFLTYxNzIgICAgICAtPiAxLjAwRS02MTc0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFiZW00NzQgdG9TY2kgIDAuMDAwOTk5OTlFLTYxNzIgICAgIC0+IDEuMEUtNjE3NSAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWJlbTQ3NSB0b1NjaSAgMC4wMDAwOTk5OTlFLTYxNzIgICAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxYmVtNDc2IHRvU2NpICAwLjAwMDAwOTk5OTlFLTYxNzIgICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJlbTQ3NyB0b1NjaSAgMC4wMDAwMDA5OTk5OUUtNjE3MiAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiZW00NzggdG9TY2kgIDAuMDAwMDAwMDk5OTk5RS02MTcyIC0+IDBFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gRXhwb25lbnRzIHdpdGggaW5zaWduaWZpY2FudCBsZWFkaW5nIHplcm9zCitkcWJhczEwMDEgdG9TY2kgIDFlOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDAyIHRvU2NpICAxZTA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwMDMgdG9TY2kgIDFlMDA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwMDQgdG9TY2kgIDFlMDAwOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMDA1IHRvU2NpICAxZTAwMDAwMDAwMDAwMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYmFzMTAwNiB0b1NjaSAgMWUwMDAwMDAwMDAwMDEwMDAwMDAwMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWJhczEwMDcgdG9TY2kgIDFlLTk5OTk5OTk5OSAtPiAwRS02MTc2ICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzMTAwOCB0b1NjaSAgMWUtMDk5OTk5OTk5OSAtPiAwRS02MTc2ICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXMxMDA5IHRvU2NpICAxZS0wMDk5OTk5OTk5OSAtPiAwRS02MTc2ICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWJhczEwMTAgdG9TY2kgIDFlLTAwMDk5OTk5OTk5OSAtPiAwRS02MTc2ICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxYmFzMTAxMSB0b1NjaSAgMWUtMDAwMDAwMDAwMDAwOTk5OTk5OTk5IC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFiYXMxMDEyIHRvU2NpICAxZS0wMDAwMDAwMDAwMDEwMDAwMDAwMDcgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitkcWJhczEwNDEgdG9TY2kgICAgIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE1MjQ0NEUtNjE0NCAtPiAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTUyNEUtNjE0NCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFiYXMxMDQyIHRvU2NpICAgICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExNTI0NDVFLTYxNDQgLT4gIDEuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE1MjRFLTYxNDQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxYmFzMTA0MyB0b1NjaSAgICAgMS4xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTUyNDQ2RS02MTQ0IC0+ICAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExNTI0RS02MTQ0IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIGNsYW1wZWQgemVyb3MgW3NlZSBhbHNvIGNsYW1wLmRlY1Rlc3RdCitkcWJhczEwNzUgdG9TY2kgICAwZSsxMDAwMCAgLT4gIDBFKzYxMTEgQ2xhbXBlZAorZHFiYXMxMDc2IHRvU2NpICAgMGUtMTAwMDAgIC0+ICAwRS02MTc2ICBDbGFtcGVkCitkcWJhczEwNzcgdG9TY2kgIC0wZSsxMDAwMCAgLT4gLTBFKzYxMTEgQ2xhbXBlZAorZHFiYXMxMDc4IHRvU2NpICAtMGUtMTAwMDAgIC0+IC0wRS02MTc2ICBDbGFtcGVkCisKKy0tIGV4dHJlbWUgdmFsdWVzIGZyb20gbmV4dC13aWRlcgorZHFiYXMxMTAxIHRvU2NpIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzE1NzI4NjQgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFiYXMxMTAyIHRvU2NpIC0xRS0xNTcyODYzIC0+IC0wRS02MTc2IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RxYmFzMTEwMyB0b1NjaSAtMUUtMTU3MjkzMiAtPiAtMEUtNjE3NiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitkcWJhczExMDQgdG9TY2kgLTAgLT4gLTAKK2RxYmFzMTEwNSB0b1NjaSArMCAtPiAgMAorZHFiYXMxMTA2IHRvU2NpICsxRS0xNTcyOTMyIC0+ICAwRS02MTc2IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RxYmFzMTEwNyB0b1NjaSArMUUtMTU3Mjg2MyAtPiAgMEUtNjE3NiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitkcWJhczExMDggdG9TY2kgKzkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrMTU3Mjg2NCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDYW5vbmljYWwuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDYW5vbmljYWwuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDZkYjg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNhbm9uaWNhbC5kZWNUZXN0CkBAIC0wLDAgKzEsMzcyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQ2Fub25pY2FsLmRlY1Rlc3QgLS0gdGVzdCBkZWNRdWFkIGNhbm9uaWNhbCByZXN1bHRzICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBmaWxlIHRlc3RzIHRoYXQgY29weSBvcGVyYXRpb25zIGxlYXZlIHVuY2Fub25pY2FsIG9wZXJhbmRzCistLSB1bmNoYW5nZWQsIGFuZCB2aWNlIHZlcnNhCisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBVbmNhbm9uaWNhbCBkZWNsZXRzIGFyZTogYWJjLCB3aGVyZToKKy0tICAgYT0xLDIsMworLS0gICBiPTYsNyxlLGYKKy0tICAgYz1lLGYKKworLS0gYXNzZXJ0IHNvbWUgc3RhbmRhcmQgKGNhbm9uaWNhbCkgdmFsdWVzOyB0aGlzIHRlc3RzIHRoYXQgRnJvbVN0cmluZworLS0gcHJvZHVjZXMgY2Fub25pY2FsIHJlc3VsdHMgKG1hbnkgbW9yZSBpbiBkZWNpbWFsTk4pCitkcWNhbjAwMSBhcHBseSA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAwMiBhcHBseSAwICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4wMDMgYXBwbHkgMSAgICAgICAgICAgICAgICAgICAgICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxY2FuMDA0IGFwcGx5IC0xICAgICAgICAgICAgICAgICAgICAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcWNhbjAwNSBhcHBseSBJbmZpbml0eSAgICAgICAgICAgICAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4wMDYgYXBwbHkgLUluZmluaXR5ICAgICAgICAgICAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMDA3IGFwcGx5IC1OYU4gICAgICAgICAgICAgICAgICAgLT4gI2ZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjAwOCBhcHBseSAtc05hTiAgICAgICAgICAgICAgICAgIC0+ICNmZTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4wMDkgYXBwbHkgIE5hTjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAxMCBhcHBseSBzTmFOOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RlY2FuMDExIGFwcGx5ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgIC0+ICM2ZTA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMTIgYXBwbHkgNy41MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2QwCitkcWNhbjAxMyBhcHBseSA5Ljk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAjMjIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmYKKworLS0gQmFzZSB0ZXN0cyBmb3IgY2Fub25pY2FsIGVuY29kaW5ncyAoaW5kaXZpZHVhbCBvcGVyYXRvcgorLS0gcHJvcGFnYXRpb24gaXMgdGVzdGVkIGxhdGVyKQorCistLSBGaW5pdGVzOiBkZWNsZXRzIGluIGNvZWZmaWNpZW50CitkcWNhbjAyMSBjYW5vbmljYWwgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDIyIGNhbm9uaWNhbCAgIzc3ZmZmZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMjMgY2Fub25pY2FsICAjNzdmZmNmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAyNCBjYW5vbmljYWwgICM3N2ZmY2ZmM2ZmZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDI1IGNhbm9uaWNhbCAgIzc3ZmZjZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMjYgY2Fub25pY2FsICAjNzdmZmNmZjNmY2ZmM2ZmZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAyNyBjYW5vbmljYWwgICM3N2ZmY2ZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDI4IGNhbm9uaWNhbCAgIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZjNmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMjkgY2Fub25pY2FsICAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjAzMCBjYW5vbmljYWwgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDMxIGNhbm9uaWNhbCAgIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZmZmY2ZmIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wMzIgY2Fub25pY2FsICAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCisKKy0tIE5hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkcWNhbjA2MSBjYW5vbmljYWwgICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDYyIGNhbm9uaWNhbCAgIzdjMDAwZmZmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wNjMgY2Fub25pY2FsICAjN2MwMDBmZjNmZmZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA2NCBjYW5vbmljYWwgICM3YzAwMGZmM2ZjZmZmZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDY1IGNhbm9uaWNhbCAgIzdjMDAwZmYzZmNmZjNmZmZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wNjYgY2Fub25pY2FsICAjN2MwMDBmZjNmY2ZmM2ZjZmZmZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA2NyBjYW5vbmljYWwgICM3YzAwMGZmM2ZjZmYzZmNmZjNmZmZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDY4IGNhbm9uaWNhbCAgIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmZmZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wNjkgY2Fub25pY2FsICAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmZmZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA3MCBjYW5vbmljYWwgICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmZmZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDcxIGNhbm9uaWNhbCAgIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmZmZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkcWNhbjA4MSBjYW5vbmljYWwgICM3ZDAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDgyIGNhbm9uaWNhbCAgIzdjODAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wODMgY2Fub25pY2FsICAjN2M0MDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA4NCBjYW5vbmljYWwgICM3YzIwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDg1IGNhbm9uaWNhbCAgIzdjMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wODYgY2Fub25pY2FsICAjN2MwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA4NyBjYW5vbmljYWwgICM3YzA0MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDg4IGNhbm9uaWNhbCAgIzdjMDIwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4wODkgY2Fub25pY2FsICAjN2MwMTBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjA5MCBjYW5vbmljYWwgICM3YzAwOGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMDkxIGNhbm9uaWNhbCAgIzdjMDA0ZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorCistLSBzTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RxY2FuMTAxIGNhbm9uaWNhbCAgIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMDIgY2Fub25pY2FsICAjN2UwMDBmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEwMyBjYW5vbmljYWwgICM3ZTAwMGZmM2ZmZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTA0IGNhbm9uaWNhbCAgIzdlMDAwZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMDUgY2Fub25pY2FsICAjN2UwMDBmZjNmY2ZmM2ZmZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEwNiBjYW5vbmljYWwgICM3ZTAwMGZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTA3IGNhbm9uaWNhbCAgIzdlMDAwZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMDggY2Fub25pY2FsICAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEwOSBjYW5vbmljYWwgICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTAwIGNhbm9uaWNhbCAgIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZmZmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMTEgY2Fub25pY2FsICAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBzTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkcWNhbjEyMSBjYW5vbmljYWwgICM3ZjAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTIyIGNhbm9uaWNhbCAgIzdlODAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMjMgY2Fub25pY2FsICAjN2U0MDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEyNCBjYW5vbmljYWwgICM3ZTIwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTI1IGNhbm9uaWNhbCAgIzdlMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMjYgY2Fub25pY2FsICAjN2UwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEyNyBjYW5vbmljYWwgICM3ZTA0MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTI4IGNhbm9uaWNhbCAgIzdlMDIwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4xMjkgY2Fub25pY2FsICAjN2UwMTBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gIzdlMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjEzMCBjYW5vbmljYWwgICM3ZTAwOGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMTMxIGNhbm9uaWNhbCAgIzdlMDA0ZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorCistLSBJbmY6IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkcWNhbjEzNyBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTM4IGNhbm9uaWNhbCAgIzc5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xMzkgY2Fub25pY2FsICAjN2EwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE0MCBjYW5vbmljYWwgICM3ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTQxIGNhbm9uaWNhbCAgIzc4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNDIgY2Fub25pY2FsICAjNzgyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE0MyBjYW5vbmljYWwgICM3ODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTQ0IGNhbm9uaWNhbCAgIzc4MDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNDUgY2Fub25pY2FsICAjNzgwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE0NiBjYW5vbmljYWwgICM3ODAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTQ3IGNhbm9uaWNhbCAgIzc4MDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNDggY2Fub25pY2FsICAjNzgwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE0OSBjYW5vbmljYWwgICM3ODAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0gSW5mOiBjb2VmZmljaWVudCBjb250aW51YXRpb24gYml0cyAoZmlyc3QsIGxhc3QsIGFuZCBhIGZldyBvdGhlcnMpCitkcWNhbjE1MCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTUxIGNhbm9uaWNhbCAgIzc4MDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNTIgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE1MyBjYW5vbmljYWwgICM3ODAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTU0IGNhbm9uaWNhbCAgIzc4MDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNTUgY2Fub25pY2FsICAjNzgwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE1NiBjYW5vbmljYWwgICM3ODAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTU3IGNhbm9uaWNhbCAgIzc4MDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNTggY2Fub25pY2FsICAjNzgwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE1OSBjYW5vbmljYWwgICM3ODAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTYwIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNjEgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE2MiBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTYzIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNjQgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE2NSBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTY2IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNjcgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE2OCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTY5IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNzAgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE3MSBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTcyIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNzMgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE3NCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTc1IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNzYgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE3NyBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTc4IGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4xNzkgY2Fub25pY2FsICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjE4MCBjYW5vbmljYWwgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMTgxIGNhbm9uaWNhbCAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4IC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCisKKy0tIE5vdyB0aGUgb3BlcmF0b3JzIC0tIHRyeWluZyB0byBjaGVjayBwYXRocyB0aGF0IG1pZ2h0IGZhaWwgdG8KKy0tIGNhbm9uaWNhbGl6ZSBwcm9wYWdhdGVkIG9wZXJhbmRzCisKKy0tLS0tIEFkZDoKKy0tIEZpbml0ZXM6IG5ldXRyYWwgMAorZHFjYW4yMDIgYWRkICAwRSs2MTQ0ICM3N2ZmY2ZmM2ZjZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZiAgICAgICAgIC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4yMDMgYWRkICAgICAgICAgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYzZmNmZiAwRSs2MTQ0IC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gdGlueSB6ZXJvCitkcWNhbjIwNCBhZGQgIDBFLTYxNzYgIzc3ZmZjZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAgICAgICAgLT4gIzc3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIFJvdW5kZWQKK2RxY2FuMjA1IGFkZCAgICAgICAgICAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZmZmYgMEUtNjE3NiAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgUm91bmRlZAorLS0gdGlueSBub24gemVybworZHFjYW4yMDYgYWRkIC0xRS02MTc2ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmZmZmZmZiAgICAgICAgICAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgSW5leGFjdCBSb3VuZGVkCitkcWNhbjIwNyBhZGQgICAgICAgICAgIzc3ZmZjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjNmY2ZmIC0xRS02MTc2IC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBJbmV4YWN0IFJvdW5kZWQKKy0tIE5hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkcWNhbjIxMSBhZGQgIDAgICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmZmZmZmYzZmNmZiAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW4yMTIgYWRkICAgICAjN2MwMDBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmM2ZjZmYgMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIE5hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZHFjYW4yMTMgYWRkICAwICAjN2M0MDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMjE0IGFkZCAgICAgIzdjMDIwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIDAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBzTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RxY2FuMjE1IGFkZCAgMCAgIzdlMDAwZmYzZmNmZmZmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorZHFjYW4yMTYgYWRkICAgICAjN2UwMDNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIEludmFsaWRfb3BlcmF0aW9uCistLSBzTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkcWNhbjIxNyBhZGQgIDAgICM3ZTUwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY2FuMjE4IGFkZCAgICAgIzdlMGUwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIDAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorLS0gSW5mOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cworZHFjYW4yMjAgYWRkICAwICAjNzgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjIxIGFkZCAgICAgIzc4NjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLSBJbmY6IGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkcWNhbjIyMiBhZGQgIDAgICM3ODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yMjMgYWRkICAgICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjI0IGFkZCAgMCAgIzc4MDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjIyNSBhZGQgICAgICM3ODAwMDAwMDAwMDBmMDAwMDAwMDAwMDAwMDAwMDAwMCAwIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yMjYgYWRkICAwICAjNzgwMDAwMDAwMDAwMDAwMDAwMDUwMDAwMDAwMDAwMDAgICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjI3IGFkZCAgICAgIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGEwMDAwIDAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKKy0tLS0tIENsYXNzOiBbZG9lcyBub3QgcmV0dXJuIGVuY29kZWRdCisKKy0tLS0tIENvbXBhcmU6CitkcWNhbjIzMSBjb21wYXJlIC1JbmYgICAxICAgICAtPiAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcWNhbjIzMiBjb21wYXJlIC1JbmYgIC1JbmYgICAtPiAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjIzMyBjb21wYXJlICAxICAgIC1JbmYgICAtPiAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcWNhbjIzNCBjb21wYXJlICAjN2MwMTBmZjNmY2ZmM2ZjZmYzZmNmZjNmZmZmZmZjZmYgICAgIC0xMDAwICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuMjM1IGNvbXBhcmUgICM3ZTAwNGZmM2ZjZmYzZmNmZjNmZmZmZmZjZmYzZmNmZiAgICAgLTEwMDAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorCistLS0tLSBDb21wYXJlU2lnOgorZHFjYW4yNDEgY29tcGFyZXNpZyAtSW5mICAgMSAgICAgLT4gICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFjYW4yNDIgY29tcGFyZXNpZyAtSW5mICAtSW5mICAgLT4gICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yNDMgY29tcGFyZXNpZyAgMSAgICAtSW5mICAgLT4gICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFjYW4yNDQgY29tcGFyZXNpZyAgIzdjNDAwZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAgLTEwMDAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIEludmFsaWRfb3BlcmF0aW9uCitkcWNhbjI0NSBjb21wYXJlc2lnICAjN2UwNTBmZjNmY2ZmZmZmZmYzZmNmZjNmY2ZmM2ZjZmYgICAtMTAwMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgSW52YWxpZF9vcGVyYXRpb24KKworLS0tLS0gQ29weTogW2RvZXMgbm90IHVzdWFsbHkgY2Fub25pY2FsaXplXQorLS0gZmluaXRlcworZHFjYW4yNTAgY29weSAgIzZlMDgwZmYzZmNmZjNmY2ZmZmZmZmYzZmNmZmZmZmZmIC0+ICM2ZTA4MGZmM2ZjZmYzZmNmZmZmZmZmM2ZjZmZmZmZmZgorZHFjYW4yNTEgY29weSAgI2VlMDgwZmYzZmNmZjNmZmZmM2ZjZmYzZmZmZjNmY2ZmIC0+ICNlZTA4MGZmM2ZjZmYzZmZmZjNmY2ZmM2ZmZmYzZmNmZgorLS0gTmFOcworZHFjYW4yNTIgY29weSAgIzdjMDAwZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmIC0+ICM3YzAwMGZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZgorZHFjYW4yNTMgY29weSAgIzdjMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3YzA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gc05hTgorZHFjYW4yNTQgY29weSAgIzdlMDAzZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmIC0+ICM3ZTAwM2ZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZgorZHFjYW4yNTUgY29weSAgIzdlMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIC0+ICM3ZTEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorLS0gSW5mCitkcWNhbjI1OCBjb3B5ICAjNzgwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gIzc4MDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjI1OSBjb3B5ICAjNzgwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAxMDAwMDAgLT4gIzc4MDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMTAwMDAwCisKKy0tLS0tIENvcHlBYnM6IFtkb2VzIG5vdCB1c3VhbGx5IGNhbm9uaWNhbGl6ZV0KKy0tIGZpbml0ZXMKK2RxY2FuMjYwIGNvcHlhYnMgICM2ZTA4MGZmM2ZjZmYzZmNmZmZmZmZmM2ZjZmZmZmZmZiAtPiAjNmUwODBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmZmZmZmYKK2RxY2FuMjYxIGNvcHlhYnMgICNlZTA4MGZmM2ZjZmYzZmZmZjNmY2ZmM2ZmZmYzZmNmZiAtPiAjNmUwODBmZjNmY2ZmM2ZmZmYzZmNmZjNmZmZmM2ZjZmYKKy0tIE5hTnMKK2RxY2FuMjYyIGNvcHlhYnMgICNmYzAwMGZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZiAtPiAjN2MwMDBmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYKK2RxY2FuMjYzIGNvcHlhYnMgICNmYzA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2MwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIHNOYU4KK2RxY2FuMjY0IGNvcHlhYnMgICNmZTAwM2ZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZiAtPiAjN2UwMDNmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYKK2RxY2FuMjY1IGNvcHlhYnMgICNmZTEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAjN2UxMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIEluZgorZHFjYW4yNjggY29weWFicyAgI2Y4MDAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICM3ODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4yNjkgY29weWFicyAgI2Y4MDAwMDAwMDAwMDAwNzAwNzAwNzAwMDAwMDAwMDAwIC0+ICM3ODAwMDAwMDAwMDAwMDcwMDcwMDcwMDAwMDAwMDAwMAorCistLS0tLSBDb3B5TmVnYXRlOiBbZG9lcyBub3QgdXN1YWxseSBjYW5vbmljYWxpemVdCistLSBmaW5pdGVzCitkcWNhbjI3MCBjb3B5bmVnYXRlICAjNmUwODBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmZmZmZmYgLT4gI2VlMDgwZmYzZmNmZjNmY2ZmZmZmZmYzZmNmZmZmZmZmCitkcWNhbjI3MSBjb3B5bmVnYXRlICAjZWUwODBmZjNmY2ZmM2ZmZmYzZmNmZjNmZmZmM2ZjZmYgLT4gIzZlMDgwZmYzZmNmZjNmZmZmM2ZjZmYzZmZmZjNmY2ZmCistLSBOYU5zCitkcWNhbjI3MiBjb3B5bmVnYXRlICAjN2MwMDBmZjNmY2ZmZmZmZmZmZmZmZjNmY2ZmM2ZjZmYgLT4gI2ZjMDAwZmYzZmNmZmZmZmZmZmZmZmYzZmNmZjNmY2ZmCitkcWNhbjI3MyBjb3B5bmVnYXRlICAjN2MwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gI2ZjMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBzTmFOCitkcWNhbjI3NCBjb3B5bmVnYXRlICAjN2UwMDNmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYgLT4gI2ZlMDAzZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmCitkcWNhbjI3NSBjb3B5bmVnYXRlICAjN2UxMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gI2ZlMTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBJbmYKK2RxY2FuMjc4IGNvcHluZWdhdGUgICM3ODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAjZjgwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjc5IGNvcHluZWdhdGUgICM3ODAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDEwMDAwMCAtPiAjZjgwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAxMDAwMDAKKworLS0tLS0gQ29weVNpZ246IFtkb2VzIG5vdCB1c3VhbGx5IGNhbm9uaWNhbGl6ZV0KKy0tIGZpbml0ZXMKK2RxY2FuMjgwIGNvcHlzaWduICAjNmUwODBmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmZmZmZmYgLTEgLT4gI2VlMDgwZmYzZmNmZjNmY2ZmZmZmZmYzZmNmZmZmZmZmCitkcWNhbjI4MSBjb3B5c2lnbiAgI2VlMDgwZmYzZmNmZjNmZmZmM2ZjZmYzZmZmZjNmY2ZmICAxIC0+ICM2ZTA4MGZmM2ZjZmYzZmZmZjNmY2ZmM2ZmZmYzZmNmZgorLS0gTmFOcworZHFjYW4yODIgY29weXNpZ24gICM3YzAwMGZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZiAtMSAtPiAjZmMwMDBmZjNmY2ZmZmZmZmZmZmZmZmZmY2ZmM2ZjZmYKK2RxY2FuMjgzIGNvcHlzaWduICAjN2MwODBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIDEgLT4gIzdjMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBzTmFOCitkcWNhbjI4NCBjb3B5c2lnbiAgIzdlMDAzZmYzZmNmZmZmZmZmZmZmZmZmZmNmZjNmY2ZmIC0xIC0+ICNmZTAwM2ZmM2ZjZmZmZmZmZmZmZmZmZmZjZmYzZmNmZgorZHFjYW4yODUgY29weXNpZ24gICM3ZTEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgMSAtPiAjN2UxMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIEluZgorZHFjYW4yODggY29weXNpZ24gICM3ODAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtMSAtPiAjZjgwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMjg5IGNvcHlzaWduICAjNzgwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAxMDAwMDAgIDEgLT4gIzc4MDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMTAwMDAwCisKKy0tLS0tIE11bHRpcGx5OgorLS0gRmluaXRlczogbmV1dHJhbCAwCitkcWNhbjMwMiBtdWx0aXBseSAgMSAgIzc3ZmZmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzc3ZmZmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMwMyBtdWx0aXBseSAgICAgIzc3ZmNmZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzc3ZmNjZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwCistLSBuZWdhdGl2ZQorZHFjYW4zMDYgbXVsdGlwbHkgLTEgICM3N2ZmZmYzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgIC0+ICNmN2ZmZmYzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4zMDcgbXVsdGlwbHkgICAgICM3N2ZjZmZmZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMCAtMSAgICAgICAgICAgIC0+ICNmN2ZjY2ZmZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMAorLS0gTmFOOiBkZWNsZXRzIGluIHBheWxvYWQKK2RxY2FuMzExIG11bHRpcGx5ICAxICAjN2MwM2ZmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAjN2MwMDNmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuMzEyIG11bHRpcGx5ICAgICAjN2MwM2ZmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAgMSAgICAgICAgICAgICAtPiAjN2MwMDNmM2ZjZmYzZmNmZjAwMDAwMDAwMDAwMDAwMDAKKy0tIE5hTjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMgW2V4Y2x1ZGluZyBzTmFOIHNlbGVjdG9yXQorZHFjYW4zMTMgbXVsdGlwbHkgIDEgICM3YzQwZmYzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgIC0+ICM3YzAwM2YzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMAorZHFjYW4zMTQgbXVsdGlwbHkgICAgICM3YzQwZmYzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMCAxICAgICAgICAgICAgIC0+ICM3YzAwM2YzZmNmZjNmY2ZmMDAwMDAwMDAwMDAwMDAwMAorLS0gc05hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkcWNhbjMxNSBtdWx0aXBseSAgMSAgIzdlMDBmZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzdjMDAwZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIEludmFsaWRfb3BlcmF0aW9uCitkcWNhbjMxNiBtdWx0aXBseSAgICAgIzdlMDBmZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzdjMDAwZmZmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIEludmFsaWRfb3BlcmF0aW9uCistLSBzTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkcWNhbjMxNyBtdWx0aXBseSAgMSAgIzdlODBmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzdjMDAzZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIEludmFsaWRfb3BlcmF0aW9uCitkcWNhbjMxOCBtdWx0aXBseSAgICAgIzdlODBmZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzdjMDAzZjNmY2ZmM2ZjZmYwMDAwMDAwMDAwMDAwMDAwIEludmFsaWRfb3BlcmF0aW9uCistLSBJbmY6IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkcWNhbjMyMCBtdWx0aXBseSAgMSAgIzc4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMyMSBtdWx0aXBseSAgICAgIzc4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLSBJbmY6IGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbiBiaXRzCitkcWNhbjMyMiBtdWx0aXBseSAgMSAgIzc4MDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMyMyBtdWx0aXBseSAgICAgIzc4MDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMyNCBtdWx0aXBseSAgMSAgIzc4MDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMyNSBtdWx0aXBseSAgICAgIzc4MDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMyNiBtdWx0aXBseSAgMSAgIzc4MDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWNhbjMyNyBtdWx0aXBseSAgICAgIzc4MDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDEgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKKy0tLS0tIFF1YW50aXplOgorZHFjYW40MDEgcXVhbnRpemUgICNlZTA4MGZmM2ZjZmYzZmNmZjNmZmZmZmZmZmYzZmNmZiAwICAgIC0+ICNlZTA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW40MDIgcXVhbnRpemUgICNlZTA4MGZmM2ZmZmZmZmZmZmZmY2ZmM2ZjZmYzZmNmZiAwICAgIC0+ICNlZTA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW40MDMgcXVhbnRpemUgICM3ODgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmYgIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW40MDQgcXVhbnRpemUgICM3ODAyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtSW5mIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW40MTAgcXVhbnRpemUgICM3YzA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW40MTEgcXVhbnRpemUgICNmYzAwMGZmM2ZjZmZmZmZmZjNmY2ZmM2ZjZmYzZmNmZiAgMSAgIC0+ICNmYzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW40MTIgcXVhbnRpemUgICM3ZTEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgMSAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorZHFjYW40MTMgcXVhbnRpemUgICNmZTAwMGZmM2ZjZmYzZmNmZjNmZmZmZmZjZmYzZmNmZiAgMSAgIC0+ICNmYzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBJbnZhbGlkX29wZXJhdGlvbgorCistLS0tLSBTdWJ0cmFjdDoKKy0tIEZpbml0ZXM6IG5ldXRyYWwgMAorZHFjYW41MDIgc3VidHJhY3QgIDBFKzYxNDQgIzc3ZmZjZmYzZmNmZjNmY2ZmZmZjZmYzZmNmZjNmY2ZmICAgICAgICAgLT4gI2Y3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjUwMyBzdWJ0cmFjdCAgICAgICAgICAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmZmZmM2ZjZmYgMEUrNjE0NCAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIHRpbnkgemVybworZHFjYW41MDQgc3VidHJhY3QgIDBFLTYxNzYgIzc3ZmZjZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAgICAgICAgLT4gI2Y3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIFJvdW5kZWQKK2RxY2FuNTA1IHN1YnRyYWN0ICAgICAgICAgICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmZmZiAwRS02MTc2IC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBSb3VuZGVkCistLSB0aW55IG5vbiB6ZXJvCitkcWNhbjUwNiBzdWJ0cmFjdCAtMUUtNjE3NiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmZmZmZmYgICAgICAgICAgLT4gI2Y3ZmZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmIEluZXhhY3QgUm91bmRlZAorZHFjYW41MDcgc3VidHJhY3QgICAgICAgICAgIzc3ZmZjZmZmZmZmZmZmZmZmZmZmZmZmZmZmZjNmY2ZmIC0xRS02MTc2IC0+ICM3N2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiBJbmV4YWN0IFJvdW5kZWQKKy0tIE5hTjogZGVjbGV0cyBpbiBwYXlsb2FkCitkcWNhbjUxMSBzdWJ0cmFjdCAgMCAgIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmZmZmZmZjNmY2ZmICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjUxMiBzdWJ0cmFjdCAgICAgIzdjMDAwZmYzZmNmZjNmY2ZmZmZmZmYzZmNmZjNmY2ZmIDAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCistLSBOYU46IGV4cG9uZW50IGNvbnRpbnVhdGlvbiBiaXRzIFtleGNsdWRpbmcgc05hTiBzZWxlY3Rvcl0KK2RxY2FuNTEzIHN1YnRyYWN0ICAwICAjN2M0MDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgICAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuNTE0IHN1YnRyYWN0ICAgICAjN2MwMjBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKy0tIHNOYU46IGRlY2xldHMgaW4gcGF5bG9hZAorZHFjYW41MTUgc3VidHJhY3QgIDAgICM3ZTAwMGZmM2ZjZmZmZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY2FuNTE2IHN1YnRyYWN0ICAgICAjN2UwMDNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgMCAtPiAjN2MwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIEludmFsaWRfb3BlcmF0aW9uCistLSBzTmFOOiBleHBvbmVudCBjb250aW51YXRpb24gYml0cyBbZXhjbHVkaW5nIHNOYU4gc2VsZWN0b3JdCitkcWNhbjUxNyBzdWJ0cmFjdCAgMCAgIzdlNTAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBJbnZhbGlkX29wZXJhdGlvbgorZHFjYW41MTggc3VidHJhY3QgICAgICM3ZTBlMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAwIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KKy0tIEluZjogZXhwb25lbnQgY29udGludWF0aW9uIGJpdHMKK2RxY2FuNTIwIHN1YnRyYWN0ICAwICAjNzgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuNTIxIHN1YnRyYWN0ICAgICAjNzg2ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIEluZjogY29lZmZpY2llbnQgY29udGludWF0aW9uIGJpdHMKK2RxY2FuNTIyIHN1YnRyYWN0ICAwICAjNzgwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuNTIzIHN1YnRyYWN0ICAgICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuNTI0IHN1YnRyYWN0ICAwICAjNzgwMDAwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuNTI1IHN1YnRyYWN0ICAgICAjNzgwMDAwMDAwMDAwZjAwMDAwMDAwMDAwMDAwMDAwMDAgMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuNTI2IHN1YnRyYWN0ICAwICAjNzgwMDAwMDAwMDAwMDAwMDAwMDUwMDAwMDAwMDAwMDAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuNTI3IHN1YnRyYWN0ICAgICAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTAwMDAgMCAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0tLS0gVG9JbnRlZ3JhbDoKK2RxY2FuNjAxIHRvaW50ZWdyYWx4ICAjNmUwODBmZjNmZGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIC0+ICM2ZTA4MGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZHFjYW42MDIgdG9pbnRlZ3JhbHggICNlZTA4MGZmM2ZjZmYzZmZmZjNmY2ZmM2ZjZmYzZmNmZiAgLT4gI2VlMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjYwMyB0b2ludGVncmFseCAgIzc4ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxY2FuNjA0IHRvaW50ZWdyYWx4ICAjNzgwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFjYW42MTQgdG9pbnRlZ3JhbHggICM3YzEwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgLT4gIzdjMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCitkcWNhbjYxNSB0b2ludGVncmFseCAgI2ZjMDAwZmYzZmNmZjNmY2ZmM2ZjZmZmZmNmZjNmY2ZmICAtPiAjZmMwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RxY2FuNjE2IHRvaW50ZWdyYWx4ICAjN2UwMTBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY2FuNjE3IHRvaW50ZWdyYWx4ICAjZmUwMDBmZjNmY2ZmM2ZjZmYzZmRmZjNmY2ZmM2ZjZmYgIC0+ICNmYzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHVuY2Fub25pY2FsIDM5OTksIDM5Ljk5LCAzLjk5LCAwLjM5OSwgICAgICAgICAgICAgICAgICBhbmQgbmVnYXRpdmVzCitkcWNhbjYxOCB0b2ludGVncmFseCAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjZmYKK2RxY2FuNjE5IHRvaW50ZWdyYWx4ICAjMjIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmYgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MCAgSW5leGFjdCBSb3VuZGVkCitkcWNhbjYyMCB0b2ludGVncmFseCAgIzIyMDc0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQgIEluZXhhY3QgUm91bmRlZAorZHFjYW42MjEgdG9pbnRlZ3JhbHggICMyMjA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZiAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2RxY2FuNjIyIHRvaW50ZWdyYWx4ICAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmYgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGNmZgorZHFjYW42MjMgdG9pbnRlZ3JhbHggICNhMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZmZiAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwICBJbmV4YWN0IFJvdW5kZWQKK2RxY2FuNjI0IHRvaW50ZWdyYWx4ICAjYTIwNzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZmYgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNCAgSW5leGFjdCBSb3VuZGVkCitkcWNhbjYyNSB0b2ludGVncmFseCAgI2EyMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmZmICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIEluZXhhY3QgUm91bmRlZAorCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNsYXNzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ2xhc3MuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2UxOWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNsYXNzLmRlY1Rlc3QKQEAgLTAsMCArMSw3NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUNsYXNzLmRlY1Rlc3QgLS0gZGVjUXVhZCBDbGFzcyBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFtOZXcgMjAwNi4xMS4yN10KKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZHFjbGEwMDEgIGNsYXNzICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworZHFjbGEwMDIgIGNsYXNzICAgIDAuMDAgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworZHFjbGEwMDMgIGNsYXNzICAgIDBFKzUgICAgICAgICAgICAgICAgICAgICAtPiArWmVybworZHFjbGEwMDQgIGNsYXNzICAgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAtPiArU3Vibm9ybWFsCitkcWNsYTAwNSAgY2xhc3MgIDAuMUUtNjE0MyAgICAgICAgICAgICAgICAgIC0+ICtTdWJub3JtYWwKK2RxY2xhMDA2ICBjbGFzcyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0MyAgICAgLT4gK1N1Ym5vcm1hbAorZHFjbGEwMDcgIGNsYXNzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtPiArTm9ybWFsCitkcWNsYTAwOCAgY2xhc3MgICAxRS02MTQzICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RxY2xhMDA5ICBjbGFzcyAgIDFFLTEwMCAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZHFjbGEwMTAgIGNsYXNzICAgMUUtMTAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkcWNsYTAxMiAgY2xhc3MgICAxRS0xICAgICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RxY2xhMDEzICBjbGFzcyAgIDEgICAgICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZHFjbGEwMTQgIGNsYXNzICAgMi41MCAgICAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkcWNsYTAxNSAgY2xhc3MgICAxMDAuMTAwICAgICAgICAgICAgICAgICAgIC0+ICtOb3JtYWwKK2RxY2xhMDE2ICBjbGFzcyAgIDFFKzMwICAgICAgICAgICAgICAgICAgICAgLT4gK05vcm1hbAorZHFjbGEwMTcgIGNsYXNzICAgMUUrNjE0NCAgICAgICAgICAgICAgICAgICAtPiArTm9ybWFsCitkcWNsYTAxOCAgY2xhc3MgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgIC0+ICtOb3JtYWwKK2RxY2xhMDE5ICBjbGFzcyAgIEluZiAgICAgICAgICAgICAgICAgICAgICAgLT4gK0luZmluaXR5CisKK2RxY2xhMDIxICBjbGFzcyAgIC0wICAgICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2RxY2xhMDIyICBjbGFzcyAgIC0wLjAwICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2RxY2xhMDIzICBjbGFzcyAgIC0wRSs1ICAgICAgICAgICAgICAgICAgICAgLT4gLVplcm8KK2RxY2xhMDI0ICBjbGFzcyAgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gLVN1Ym5vcm1hbAorZHFjbGEwMjUgIGNsYXNzICAtMC4xRS02MTQzICAgICAgICAgICAgICAgICAtPiAtU3Vibm9ybWFsCitkcWNsYTAyNiAgY2xhc3MgIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQzICAgIC0+IC1TdWJub3JtYWwKK2RxY2xhMDI3ICBjbGFzcyAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgLT4gLU5vcm1hbAorZHFjbGEwMjggIGNsYXNzICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkcWNsYTAyOSAgY2xhc3MgIC0xRS0xMDAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RxY2xhMDMwICBjbGFzcyAgLTFFLTEwICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZHFjbGEwMzIgIGNsYXNzICAtMUUtMSAgICAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkcWNsYTAzMyAgY2xhc3MgIC0xICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RxY2xhMDM0ICBjbGFzcyAgLTIuNTAgICAgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZHFjbGEwMzUgIGNsYXNzICAtMTAwLjEwMCAgICAgICAgICAgICAgICAgICAtPiAtTm9ybWFsCitkcWNsYTAzNiAgY2xhc3MgIC0xRSszMCAgICAgICAgICAgICAgICAgICAgIC0+IC1Ob3JtYWwKK2RxY2xhMDM3ICBjbGFzcyAgLTFFKzYxNDQgICAgICAgICAgICAgICAgICAgLT4gLU5vcm1hbAorZHFjbGEwNjE0ICBjbGFzcyAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgLT4gLU5vcm1hbAorZHFjbGEwMzkgIGNsYXNzICAtSW5mICAgICAgICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkKKworZHFjbGEwNDEgIGNsYXNzICAgTmFOICAgICAgICAgICAgICAgICAgICAgICAtPiBOYU4KK2RxY2xhMDQyICBjbGFzcyAgLU5hTiAgICAgICAgICAgICAgICAgICAgICAgLT4gTmFOCitkcWNsYTA0MyAgY2xhc3MgICtOYU4xMjM0NSAgICAgICAgICAgICAgICAgIC0+IE5hTgorZHFjbGEwNDQgIGNsYXNzICAgc05hTiAgICAgICAgICAgICAgICAgICAgICAtPiBzTmFOCitkcWNsYTA0NSAgY2xhc3MgIC1zTmFOICAgICAgICAgICAgICAgICAgICAgIC0+IHNOYU4KK2RxY2xhMDQ2ICBjbGFzcyAgK3NOYU4xMjM0NSAgICAgICAgICAgICAgICAgLT4gc05hTgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdiNWVlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlLmRlY1Rlc3QKQEAgLTAsMCArMSw3NTMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFDb21wYXJlLmRlY1Rlc3QgLS0gZGVjUXVhZCBjb21wYXJpc29uIHRoYXQgYWxsb3dzIHF1aWV0IE5hTnMgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RxY29tMDAxIGNvbXBhcmUgIC0yICAtMiAgLT4gMAorZHFjb20wMDIgY29tcGFyZSAgLTIgIC0xICAtPiAtMQorZHFjb20wMDMgY29tcGFyZSAgLTIgICAwICAtPiAtMQorZHFjb20wMDQgY29tcGFyZSAgLTIgICAxICAtPiAtMQorZHFjb20wMDUgY29tcGFyZSAgLTIgICAyICAtPiAtMQorZHFjb20wMDYgY29tcGFyZSAgLTEgIC0yICAtPiAxCitkcWNvbTAwNyBjb21wYXJlICAtMSAgLTEgIC0+IDAKK2RxY29tMDA4IGNvbXBhcmUgIC0xICAgMCAgLT4gLTEKK2RxY29tMDA5IGNvbXBhcmUgIC0xICAgMSAgLT4gLTEKK2RxY29tMDEwIGNvbXBhcmUgIC0xICAgMiAgLT4gLTEKK2RxY29tMDExIGNvbXBhcmUgICAwICAtMiAgLT4gMQorZHFjb20wMTIgY29tcGFyZSAgIDAgIC0xICAtPiAxCitkcWNvbTAxMyBjb21wYXJlICAgMCAgIDAgIC0+IDAKK2RxY29tMDE0IGNvbXBhcmUgICAwICAgMSAgLT4gLTEKK2RxY29tMDE1IGNvbXBhcmUgICAwICAgMiAgLT4gLTEKK2RxY29tMDE2IGNvbXBhcmUgICAxICAtMiAgLT4gMQorZHFjb20wMTcgY29tcGFyZSAgIDEgIC0xICAtPiAxCitkcWNvbTAxOCBjb21wYXJlICAgMSAgIDAgIC0+IDEKK2RxY29tMDE5IGNvbXBhcmUgICAxICAgMSAgLT4gMAorZHFjb20wMjAgY29tcGFyZSAgIDEgICAyICAtPiAtMQorZHFjb20wMjEgY29tcGFyZSAgIDIgIC0yICAtPiAxCitkcWNvbTAyMiBjb21wYXJlICAgMiAgLTEgIC0+IDEKK2RxY29tMDIzIGNvbXBhcmUgICAyICAgMCAgLT4gMQorZHFjb20wMjUgY29tcGFyZSAgIDIgICAxICAtPiAxCitkcWNvbTAyNiBjb21wYXJlICAgMiAgIDIgIC0+IDAKKworZHFjb20wMzEgY29tcGFyZSAgLTIwICAtMjAgIC0+IDAKK2RxY29tMDMyIGNvbXBhcmUgIC0yMCAgLTEwICAtPiAtMQorZHFjb20wMzMgY29tcGFyZSAgLTIwICAgMDAgIC0+IC0xCitkcWNvbTAzNCBjb21wYXJlICAtMjAgICAxMCAgLT4gLTEKK2RxY29tMDM1IGNvbXBhcmUgIC0yMCAgIDIwICAtPiAtMQorZHFjb20wMzYgY29tcGFyZSAgLTEwICAtMjAgIC0+IDEKK2RxY29tMDM3IGNvbXBhcmUgIC0xMCAgLTEwICAtPiAwCitkcWNvbTAzOCBjb21wYXJlICAtMTAgICAwMCAgLT4gLTEKK2RxY29tMDM5IGNvbXBhcmUgIC0xMCAgIDEwICAtPiAtMQorZHFjb20wNDAgY29tcGFyZSAgLTEwICAgMjAgIC0+IC0xCitkcWNvbTA0MSBjb21wYXJlICAgMDAgIC0yMCAgLT4gMQorZHFjb20wNDIgY29tcGFyZSAgIDAwICAtMTAgIC0+IDEKK2RxY29tMDQzIGNvbXBhcmUgICAwMCAgIDAwICAtPiAwCitkcWNvbTA0NCBjb21wYXJlICAgMDAgICAxMCAgLT4gLTEKK2RxY29tMDQ1IGNvbXBhcmUgICAwMCAgIDIwICAtPiAtMQorZHFjb20wNDYgY29tcGFyZSAgIDEwICAtMjAgIC0+IDEKK2RxY29tMDQ3IGNvbXBhcmUgICAxMCAgLTEwICAtPiAxCitkcWNvbTA0OCBjb21wYXJlICAgMTAgICAwMCAgLT4gMQorZHFjb20wNDkgY29tcGFyZSAgIDEwICAgMTAgIC0+IDAKK2RxY29tMDUwIGNvbXBhcmUgICAxMCAgIDIwICAtPiAtMQorZHFjb20wNTEgY29tcGFyZSAgIDIwICAtMjAgIC0+IDEKK2RxY29tMDUyIGNvbXBhcmUgICAyMCAgLTEwICAtPiAxCitkcWNvbTA1MyBjb21wYXJlICAgMjAgICAwMCAgLT4gMQorZHFjb20wNTUgY29tcGFyZSAgIDIwICAgMTAgIC0+IDEKK2RxY29tMDU2IGNvbXBhcmUgICAyMCAgIDIwICAtPiAwCisKK2RxY29tMDYxIGNvbXBhcmUgIC0yLjAgIC0yLjAgIC0+IDAKK2RxY29tMDYyIGNvbXBhcmUgIC0yLjAgIC0xLjAgIC0+IC0xCitkcWNvbTA2MyBjb21wYXJlICAtMi4wICAgMC4wICAtPiAtMQorZHFjb20wNjQgY29tcGFyZSAgLTIuMCAgIDEuMCAgLT4gLTEKK2RxY29tMDY1IGNvbXBhcmUgIC0yLjAgICAyLjAgIC0+IC0xCitkcWNvbTA2NiBjb21wYXJlICAtMS4wICAtMi4wICAtPiAxCitkcWNvbTA2NyBjb21wYXJlICAtMS4wICAtMS4wICAtPiAwCitkcWNvbTA2OCBjb21wYXJlICAtMS4wICAgMC4wICAtPiAtMQorZHFjb20wNjkgY29tcGFyZSAgLTEuMCAgIDEuMCAgLT4gLTEKK2RxY29tMDcwIGNvbXBhcmUgIC0xLjAgICAyLjAgIC0+IC0xCitkcWNvbTA3MSBjb21wYXJlICAgMC4wICAtMi4wICAtPiAxCitkcWNvbTA3MiBjb21wYXJlICAgMC4wICAtMS4wICAtPiAxCitkcWNvbTA3MyBjb21wYXJlICAgMC4wICAgMC4wICAtPiAwCitkcWNvbTA3NCBjb21wYXJlICAgMC4wICAgMS4wICAtPiAtMQorZHFjb20wNzUgY29tcGFyZSAgIDAuMCAgIDIuMCAgLT4gLTEKK2RxY29tMDc2IGNvbXBhcmUgICAxLjAgIC0yLjAgIC0+IDEKK2RxY29tMDc3IGNvbXBhcmUgICAxLjAgIC0xLjAgIC0+IDEKK2RxY29tMDc4IGNvbXBhcmUgICAxLjAgICAwLjAgIC0+IDEKK2RxY29tMDc5IGNvbXBhcmUgICAxLjAgICAxLjAgIC0+IDAKK2RxY29tMDgwIGNvbXBhcmUgICAxLjAgICAyLjAgIC0+IC0xCitkcWNvbTA4MSBjb21wYXJlICAgMi4wICAtMi4wICAtPiAxCitkcWNvbTA4MiBjb21wYXJlICAgMi4wICAtMS4wICAtPiAxCitkcWNvbTA4MyBjb21wYXJlICAgMi4wICAgMC4wICAtPiAxCitkcWNvbTA4NSBjb21wYXJlICAgMi4wICAgMS4wICAtPiAxCitkcWNvbTA4NiBjb21wYXJlICAgMi4wICAgMi4wICAtPiAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorZHFjb20wOTAgY29tcGFyZSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+IDAKK2RxY29tMDkxIGNvbXBhcmUgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAtMQorZHFjb20wOTIgY29tcGFyZSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDEKK2RxY29tMDkzIGNvbXBhcmUgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAwCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworZHFjb20xMDAgY29tcGFyZSAgIDcuMCAgICA3LjAgICAgLT4gMAorZHFjb20xMDEgY29tcGFyZSAgIDcuMCAgICA3ICAgICAgLT4gMAorZHFjb20xMDIgY29tcGFyZSAgIDcgICAgICA3LjAgICAgLT4gMAorZHFjb20xMDMgY29tcGFyZSAgIDdFKzAgICA3LjAgICAgLT4gMAorZHFjb20xMDQgY29tcGFyZSAgIDcwRS0xICA3LjAgICAgLT4gMAorZHFjb20xMDUgY29tcGFyZSAgIDAuN0UrMSA3ICAgICAgLT4gMAorZHFjb20xMDYgY29tcGFyZSAgIDcwRS0xICA3ICAgICAgLT4gMAorZHFjb20xMDcgY29tcGFyZSAgIDcuMCAgICA3RSswICAgLT4gMAorZHFjb20xMDggY29tcGFyZSAgIDcuMCAgICA3MEUtMSAgLT4gMAorZHFjb20xMDkgY29tcGFyZSAgIDcgICAgICAwLjdFKzEgLT4gMAorZHFjb20xMTAgY29tcGFyZSAgIDcgICAgICA3MEUtMSAgLT4gMAorCitkcWNvbTEyMCBjb21wYXJlICAgOC4wICAgIDcuMCAgICAtPiAxCitkcWNvbTEyMSBjb21wYXJlICAgOC4wICAgIDcgICAgICAtPiAxCitkcWNvbTEyMiBjb21wYXJlICAgOCAgICAgIDcuMCAgICAtPiAxCitkcWNvbTEyMyBjb21wYXJlICAgOEUrMCAgIDcuMCAgICAtPiAxCitkcWNvbTEyNCBjb21wYXJlICAgODBFLTEgIDcuMCAgICAtPiAxCitkcWNvbTEyNSBjb21wYXJlICAgMC44RSsxIDcgICAgICAtPiAxCitkcWNvbTEyNiBjb21wYXJlICAgODBFLTEgIDcgICAgICAtPiAxCitkcWNvbTEyNyBjb21wYXJlICAgOC4wICAgIDdFKzAgICAtPiAxCitkcWNvbTEyOCBjb21wYXJlICAgOC4wICAgIDcwRS0xICAtPiAxCitkcWNvbTEyOSBjb21wYXJlICAgOCAgICAgIDAuN0UrMSAgLT4gMQorZHFjb20xMzAgY29tcGFyZSAgIDggICAgICA3MEUtMSAgLT4gMQorCitkcWNvbTE0MCBjb21wYXJlICAgOC4wICAgIDkuMCAgICAtPiAtMQorZHFjb20xNDEgY29tcGFyZSAgIDguMCAgICA5ICAgICAgLT4gLTEKK2RxY29tMTQyIGNvbXBhcmUgICA4ICAgICAgOS4wICAgIC0+IC0xCitkcWNvbTE0MyBjb21wYXJlICAgOEUrMCAgIDkuMCAgICAtPiAtMQorZHFjb20xNDQgY29tcGFyZSAgIDgwRS0xICA5LjAgICAgLT4gLTEKK2RxY29tMTQ1IGNvbXBhcmUgICAwLjhFKzEgOSAgICAgIC0+IC0xCitkcWNvbTE0NiBjb21wYXJlICAgODBFLTEgIDkgICAgICAtPiAtMQorZHFjb20xNDcgY29tcGFyZSAgIDguMCAgICA5RSswICAgLT4gLTEKK2RxY29tMTQ4IGNvbXBhcmUgICA4LjAgICAgOTBFLTEgIC0+IC0xCitkcWNvbTE0OSBjb21wYXJlICAgOCAgICAgIDAuOUUrMSAtPiAtMQorZHFjb20xNTAgY29tcGFyZSAgIDggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtKyAuLgorZHFjb20yMDAgY29tcGFyZSAgLTcuMCAgICA3LjAgICAgLT4gLTEKK2RxY29tMjAxIGNvbXBhcmUgIC03LjAgICAgNyAgICAgIC0+IC0xCitkcWNvbTIwMiBjb21wYXJlICAtNyAgICAgIDcuMCAgICAtPiAtMQorZHFjb20yMDMgY29tcGFyZSAgLTdFKzAgICA3LjAgICAgLT4gLTEKK2RxY29tMjA0IGNvbXBhcmUgIC03MEUtMSAgNy4wICAgIC0+IC0xCitkcWNvbTIwNSBjb21wYXJlICAtMC43RSsxIDcgICAgICAtPiAtMQorZHFjb20yMDYgY29tcGFyZSAgLTcwRS0xICA3ICAgICAgLT4gLTEKK2RxY29tMjA3IGNvbXBhcmUgIC03LjAgICAgN0UrMCAgIC0+IC0xCitkcWNvbTIwOCBjb21wYXJlICAtNy4wICAgIDcwRS0xICAtPiAtMQorZHFjb20yMDkgY29tcGFyZSAgLTcgICAgICAwLjdFKzEgLT4gLTEKK2RxY29tMjEwIGNvbXBhcmUgIC03ICAgICAgNzBFLTEgIC0+IC0xCisKK2RxY29tMjIwIGNvbXBhcmUgIC04LjAgICAgNy4wICAgIC0+IC0xCitkcWNvbTIyMSBjb21wYXJlICAtOC4wICAgIDcgICAgICAtPiAtMQorZHFjb20yMjIgY29tcGFyZSAgLTggICAgICA3LjAgICAgLT4gLTEKK2RxY29tMjIzIGNvbXBhcmUgIC04RSswICAgNy4wICAgIC0+IC0xCitkcWNvbTIyNCBjb21wYXJlICAtODBFLTEgIDcuMCAgICAtPiAtMQorZHFjb20yMjUgY29tcGFyZSAgLTAuOEUrMSA3ICAgICAgLT4gLTEKK2RxY29tMjI2IGNvbXBhcmUgIC04MEUtMSAgNyAgICAgIC0+IC0xCitkcWNvbTIyNyBjb21wYXJlICAtOC4wICAgIDdFKzAgICAtPiAtMQorZHFjb20yMjggY29tcGFyZSAgLTguMCAgICA3MEUtMSAgLT4gLTEKK2RxY29tMjI5IGNvbXBhcmUgIC04ICAgICAgMC43RSsxIC0+IC0xCitkcWNvbTIzMCBjb21wYXJlICAtOCAgICAgIDcwRS0xICAtPiAtMQorCitkcWNvbTI0MCBjb21wYXJlICAtOC4wICAgIDkuMCAgICAtPiAtMQorZHFjb20yNDEgY29tcGFyZSAgLTguMCAgICA5ICAgICAgLT4gLTEKK2RxY29tMjQyIGNvbXBhcmUgIC04ICAgICAgOS4wICAgIC0+IC0xCitkcWNvbTI0MyBjb21wYXJlICAtOEUrMCAgIDkuMCAgICAtPiAtMQorZHFjb20yNDQgY29tcGFyZSAgLTgwRS0xICA5LjAgICAgLT4gLTEKK2RxY29tMjQ1IGNvbXBhcmUgIC0wLjhFKzEgOSAgICAgIC0+IC0xCitkcWNvbTI0NiBjb21wYXJlICAtODBFLTEgIDkgICAgICAtPiAtMQorZHFjb20yNDcgY29tcGFyZSAgLTguMCAgICA5RSswICAgLT4gLTEKK2RxY29tMjQ4IGNvbXBhcmUgIC04LjAgICAgOTBFLTEgIC0+IC0xCitkcWNvbTI0OSBjb21wYXJlICAtOCAgICAgIDAuOUUrMSAtPiAtMQorZHFjb20yNTAgY29tcGFyZSAgLTggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyArLSAuLgorZHFjb20zMDAgY29tcGFyZSAgIDcuMCAgICAtNy4wICAgIC0+IDEKK2RxY29tMzAxIGNvbXBhcmUgICA3LjAgICAgLTcgICAgICAtPiAxCitkcWNvbTMwMiBjb21wYXJlICAgNyAgICAgIC03LjAgICAgLT4gMQorZHFjb20zMDMgY29tcGFyZSAgIDdFKzAgICAtNy4wICAgIC0+IDEKK2RxY29tMzA0IGNvbXBhcmUgICA3MEUtMSAgLTcuMCAgICAtPiAxCitkcWNvbTMwNSBjb21wYXJlICAgLjdFKzEgIC03ICAgICAgLT4gMQorZHFjb20zMDYgY29tcGFyZSAgIDcwRS0xICAtNyAgICAgIC0+IDEKK2RxY29tMzA3IGNvbXBhcmUgICA3LjAgICAgLTdFKzAgICAtPiAxCitkcWNvbTMwOCBjb21wYXJlICAgNy4wICAgIC03MEUtMSAgLT4gMQorZHFjb20zMDkgY29tcGFyZSAgIDcgICAgICAtLjdFKzEgIC0+IDEKK2RxY29tMzEwIGNvbXBhcmUgICA3ICAgICAgLTcwRS0xICAtPiAxCisKK2RxY29tMzIwIGNvbXBhcmUgICA4LjAgICAgLTcuMCAgICAtPiAxCitkcWNvbTMyMSBjb21wYXJlICAgOC4wICAgIC03ICAgICAgLT4gMQorZHFjb20zMjIgY29tcGFyZSAgIDggICAgICAtNy4wICAgIC0+IDEKK2RxY29tMzIzIGNvbXBhcmUgICA4RSswICAgLTcuMCAgICAtPiAxCitkcWNvbTMyNCBjb21wYXJlICAgODBFLTEgIC03LjAgICAgLT4gMQorZHFjb20zMjUgY29tcGFyZSAgIC44RSsxICAtNyAgICAgIC0+IDEKK2RxY29tMzI2IGNvbXBhcmUgICA4MEUtMSAgLTcgICAgICAtPiAxCitkcWNvbTMyNyBjb21wYXJlICAgOC4wICAgIC03RSswICAgLT4gMQorZHFjb20zMjggY29tcGFyZSAgIDguMCAgICAtNzBFLTEgIC0+IDEKK2RxY29tMzI5IGNvbXBhcmUgICA4ICAgICAgLS43RSsxICAtPiAxCitkcWNvbTMzMCBjb21wYXJlICAgOCAgICAgIC03MEUtMSAgLT4gMQorCitkcWNvbTM0MCBjb21wYXJlICAgOC4wICAgIC05LjAgICAgLT4gMQorZHFjb20zNDEgY29tcGFyZSAgIDguMCAgICAtOSAgICAgIC0+IDEKK2RxY29tMzQyIGNvbXBhcmUgICA4ICAgICAgLTkuMCAgICAtPiAxCitkcWNvbTM0MyBjb21wYXJlICAgOEUrMCAgIC05LjAgICAgLT4gMQorZHFjb20zNDQgY29tcGFyZSAgIDgwRS0xICAtOS4wICAgIC0+IDEKK2RxY29tMzQ1IGNvbXBhcmUgICAuOEUrMSAgLTkgICAgICAtPiAxCitkcWNvbTM0NiBjb21wYXJlICAgODBFLTEgIC05ICAgICAgLT4gMQorZHFjb20zNDcgY29tcGFyZSAgIDguMCAgICAtOUUrMCAgIC0+IDEKK2RxY29tMzQ4IGNvbXBhcmUgICA4LjAgICAgLTkwRS0xICAtPiAxCitkcWNvbTM0OSBjb21wYXJlICAgOCAgICAgIC0uOUUrMSAgLT4gMQorZHFjb20zNTAgY29tcGFyZSAgIDggICAgICAtOTBFLTEgIC0+IDEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtLSAuLgorZHFjb200MDAgY29tcGFyZSAgIC03LjAgICAgLTcuMCAgICAtPiAwCitkcWNvbTQwMSBjb21wYXJlICAgLTcuMCAgICAtNyAgICAgIC0+IDAKK2RxY29tNDAyIGNvbXBhcmUgICAtNyAgICAgIC03LjAgICAgLT4gMAorZHFjb200MDMgY29tcGFyZSAgIC03RSswICAgLTcuMCAgICAtPiAwCitkcWNvbTQwNCBjb21wYXJlICAgLTcwRS0xICAtNy4wICAgIC0+IDAKK2RxY29tNDA1IGNvbXBhcmUgICAtLjdFKzEgIC03ICAgICAgLT4gMAorZHFjb200MDYgY29tcGFyZSAgIC03MEUtMSAgLTcgICAgICAtPiAwCitkcWNvbTQwNyBjb21wYXJlICAgLTcuMCAgICAtN0UrMCAgIC0+IDAKK2RxY29tNDA4IGNvbXBhcmUgICAtNy4wICAgIC03MEUtMSAgLT4gMAorZHFjb200MDkgY29tcGFyZSAgIC03ICAgICAgLS43RSsxICAtPiAwCitkcWNvbTQxMCBjb21wYXJlICAgLTcgICAgICAtNzBFLTEgIC0+IDAKKworZHFjb200MjAgY29tcGFyZSAgIC04LjAgICAgLTcuMCAgICAtPiAtMQorZHFjb200MjEgY29tcGFyZSAgIC04LjAgICAgLTcgICAgICAtPiAtMQorZHFjb200MjIgY29tcGFyZSAgIC04ICAgICAgLTcuMCAgICAtPiAtMQorZHFjb200MjMgY29tcGFyZSAgIC04RSswICAgLTcuMCAgICAtPiAtMQorZHFjb200MjQgY29tcGFyZSAgIC04MEUtMSAgLTcuMCAgICAtPiAtMQorZHFjb200MjUgY29tcGFyZSAgIC0uOEUrMSAgLTcgICAgICAtPiAtMQorZHFjb200MjYgY29tcGFyZSAgIC04MEUtMSAgLTcgICAgICAtPiAtMQorZHFjb200MjcgY29tcGFyZSAgIC04LjAgICAgLTdFKzAgICAtPiAtMQorZHFjb200MjggY29tcGFyZSAgIC04LjAgICAgLTcwRS0xICAtPiAtMQorZHFjb200MjkgY29tcGFyZSAgIC04ICAgICAgLS43RSsxICAtPiAtMQorZHFjb200MzAgY29tcGFyZSAgIC04ICAgICAgLTcwRS0xICAtPiAtMQorCitkcWNvbTQ0MCBjb21wYXJlICAgLTguMCAgICAtOS4wICAgIC0+IDEKK2RxY29tNDQxIGNvbXBhcmUgICAtOC4wICAgIC05ICAgICAgLT4gMQorZHFjb200NDIgY29tcGFyZSAgIC04ICAgICAgLTkuMCAgICAtPiAxCitkcWNvbTQ0MyBjb21wYXJlICAgLThFKzAgICAtOS4wICAgIC0+IDEKK2RxY29tNDQ0IGNvbXBhcmUgICAtODBFLTEgIC05LjAgICAgLT4gMQorZHFjb200NDUgY29tcGFyZSAgIC0uOEUrMSAgLTkgICAgICAtPiAxCitkcWNvbTQ0NiBjb21wYXJlICAgLTgwRS0xICAtOSAgICAgIC0+IDEKK2RxY29tNDQ3IGNvbXBhcmUgICAtOC4wICAgIC05RSswICAgLT4gMQorZHFjb200NDggY29tcGFyZSAgIC04LjAgICAgLTkwRS0xICAtPiAxCitkcWNvbTQ0OSBjb21wYXJlICAgLTggICAgICAtLjlFKzEgIC0+IDEKK2RxY29tNDUwIGNvbXBhcmUgICAtOCAgICAgIC05MEUtMSAgLT4gMQorCistLSBtaXNhbGlnbm1lbnQgdHJhcHMgZm9yIGxpdHRsZS1lbmRpYW4KK2RxY29tNDUxIGNvbXBhcmUgICAgICAxLjAgICAgICAgMC4xICAtPiAxCitkcWNvbTQ1MiBjb21wYXJlICAgICAgMC4xICAgICAgIDEuMCAgLT4gLTEKK2RxY29tNDUzIGNvbXBhcmUgICAgIDEwLjAgICAgICAgMC4xICAtPiAxCitkcWNvbTQ1NCBjb21wYXJlICAgICAgMC4xICAgICAgMTAuMCAgLT4gLTEKK2RxY29tNDU1IGNvbXBhcmUgICAgICAxMDAgICAgICAgMS4wICAtPiAxCitkcWNvbTQ1NiBjb21wYXJlICAgICAgMS4wICAgICAgIDEwMCAgLT4gLTEKK2RxY29tNDU3IGNvbXBhcmUgICAgIDEwMDAgICAgICAxMC4wICAtPiAxCitkcWNvbTQ1OCBjb21wYXJlICAgICAxMC4wICAgICAgMTAwMCAgLT4gLTEKK2RxY29tNDU5IGNvbXBhcmUgICAgMTAwMDAgICAgIDEwMC4wICAtPiAxCitkcWNvbTQ2MCBjb21wYXJlICAgIDEwMC4wICAgICAxMDAwMCAgLT4gLTEKK2RxY29tNDYxIGNvbXBhcmUgICAxMDAwMDAgICAgMTAwMC4wICAtPiAxCitkcWNvbTQ2MiBjb21wYXJlICAgMTAwMC4wICAgIDEwMDAwMCAgLT4gLTEKK2RxY29tNDYzIGNvbXBhcmUgIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxCitkcWNvbTQ2NCBjb21wYXJlICAxMDAwMC4wICAgMTAwMDAwMCAgLT4gLTEKKworLS0gdGVzdGNhc2VzIHRoYXQgc3VidHJhY3QgdG8gbG90cyBvZiB6ZXJvcyBhdCBib3VuZGFyaWVzIFtwZ3JdCitkcWNvbTQ3MyBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMDAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNvbTQ3NCBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMDBFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKK2RxY29tNDc1IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNvbTQ3NiBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNvbTQ3NyBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDBFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY29tNDc4IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNvbTQ3OSBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNvbTQ4MCBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDBFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKK2RxY29tNDgxIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNvbTQ4MiBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNvbTQ4MyBjb21wYXJlIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IC0+IDAKK2RxY29tNDg3IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwMDBFKzg5IC0+IDAKK2RxY29tNDg4IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwMEUtODkgLT4gMAorZHFjb200ODkgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMDBFKzg5IC0+IDAKK2RxY29tNDkwIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDBFLTg5IC0+IDAKK2RxY29tNDkxIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMEUrODkgLT4gMAorZHFjb200OTIgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDBFLTg5IC0+IDAKK2RxY29tNDkzIGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDBFKzg5IC0+IDAKK2RxY29tNDk0IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMEUtODkgLT4gMAorZHFjb200OTUgY29tcGFyZSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDBFKzg5IC0+IDAKK2RxY29tNDk2IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjBFLTg5IC0+IDAKK2RxY29tNDk3IGNvbXBhcmUgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgLT4gMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitkcWNvbTUwMCBjb21wYXJlICAgIDEgICAgIDFFLTE1ICAgIC0+IDEKK2RxY29tNTAxIGNvbXBhcmUgICAgMSAgICAgMUUtMTQgICAgLT4gMQorZHFjb201MDIgY29tcGFyZSAgICAxICAgICAxRS0xMyAgICAtPiAxCitkcWNvbTUwMyBjb21wYXJlICAgIDEgICAgIDFFLTEyICAgIC0+IDEKK2RxY29tNTA0IGNvbXBhcmUgICAgMSAgICAgMUUtMTEgICAgLT4gMQorZHFjb201MDUgY29tcGFyZSAgICAxICAgICAxRS0xMCAgICAtPiAxCitkcWNvbTUwNiBjb21wYXJlICAgIDEgICAgIDFFLTkgICAgIC0+IDEKK2RxY29tNTA3IGNvbXBhcmUgICAgMSAgICAgMUUtOCAgICAgLT4gMQorZHFjb201MDggY29tcGFyZSAgICAxICAgICAxRS03ICAgICAtPiAxCitkcWNvbTUwOSBjb21wYXJlICAgIDEgICAgIDFFLTYgICAgIC0+IDEKK2RxY29tNTEwIGNvbXBhcmUgICAgMSAgICAgMUUtNSAgICAgLT4gMQorZHFjb201MTEgY29tcGFyZSAgICAxICAgICAxRS00ICAgICAtPiAxCitkcWNvbTUxMiBjb21wYXJlICAgIDEgICAgIDFFLTMgICAgIC0+IDEKK2RxY29tNTEzIGNvbXBhcmUgICAgMSAgICAgMUUtMiAgICAgLT4gMQorZHFjb201MTQgY29tcGFyZSAgICAxICAgICAxRS0xICAgICAtPiAxCitkcWNvbTUxNSBjb21wYXJlICAgIDEgICAgIDFFLTAgICAgIC0+IDAKK2RxY29tNTE2IGNvbXBhcmUgICAgMSAgICAgMUUrMSAgICAgLT4gLTEKK2RxY29tNTE3IGNvbXBhcmUgICAgMSAgICAgMUUrMiAgICAgLT4gLTEKK2RxY29tNTE4IGNvbXBhcmUgICAgMSAgICAgMUUrMyAgICAgLT4gLTEKK2RxY29tNTE5IGNvbXBhcmUgICAgMSAgICAgMUUrNCAgICAgLT4gLTEKK2RxY29tNTIxIGNvbXBhcmUgICAgMSAgICAgMUUrNSAgICAgLT4gLTEKK2RxY29tNTIyIGNvbXBhcmUgICAgMSAgICAgMUUrNiAgICAgLT4gLTEKK2RxY29tNTIzIGNvbXBhcmUgICAgMSAgICAgMUUrNyAgICAgLT4gLTEKK2RxY29tNTI0IGNvbXBhcmUgICAgMSAgICAgMUUrOCAgICAgLT4gLTEKK2RxY29tNTI1IGNvbXBhcmUgICAgMSAgICAgMUUrOSAgICAgLT4gLTEKK2RxY29tNTI2IGNvbXBhcmUgICAgMSAgICAgMUUrMTAgICAgLT4gLTEKK2RxY29tNTI3IGNvbXBhcmUgICAgMSAgICAgMUUrMTEgICAgLT4gLTEKK2RxY29tNTI4IGNvbXBhcmUgICAgMSAgICAgMUUrMTIgICAgLT4gLTEKK2RxY29tNTI5IGNvbXBhcmUgICAgMSAgICAgMUUrMTMgICAgLT4gLTEKK2RxY29tNTMwIGNvbXBhcmUgICAgMSAgICAgMUUrMTQgICAgLT4gLTEKK2RxY29tNTMxIGNvbXBhcmUgICAgMSAgICAgMUUrMTUgICAgLT4gLTEKKy0tIExSIHN3YXAKK2RxY29tNTQwIGNvbXBhcmUgICAgMUUtMTUgIDEgICAgICAgLT4gLTEKK2RxY29tNTQxIGNvbXBhcmUgICAgMUUtMTQgIDEgICAgICAgLT4gLTEKK2RxY29tNTQyIGNvbXBhcmUgICAgMUUtMTMgIDEgICAgICAgLT4gLTEKK2RxY29tNTQzIGNvbXBhcmUgICAgMUUtMTIgIDEgICAgICAgLT4gLTEKK2RxY29tNTQ0IGNvbXBhcmUgICAgMUUtMTEgIDEgICAgICAgLT4gLTEKK2RxY29tNTQ1IGNvbXBhcmUgICAgMUUtMTAgIDEgICAgICAgLT4gLTEKK2RxY29tNTQ2IGNvbXBhcmUgICAgMUUtOSAgIDEgICAgICAgLT4gLTEKK2RxY29tNTQ3IGNvbXBhcmUgICAgMUUtOCAgIDEgICAgICAgLT4gLTEKK2RxY29tNTQ4IGNvbXBhcmUgICAgMUUtNyAgIDEgICAgICAgLT4gLTEKK2RxY29tNTQ5IGNvbXBhcmUgICAgMUUtNiAgIDEgICAgICAgLT4gLTEKK2RxY29tNTUwIGNvbXBhcmUgICAgMUUtNSAgIDEgICAgICAgLT4gLTEKK2RxY29tNTUxIGNvbXBhcmUgICAgMUUtNCAgIDEgICAgICAgLT4gLTEKK2RxY29tNTUyIGNvbXBhcmUgICAgMUUtMyAgIDEgICAgICAgLT4gLTEKK2RxY29tNTUzIGNvbXBhcmUgICAgMUUtMiAgIDEgICAgICAgLT4gLTEKK2RxY29tNTU0IGNvbXBhcmUgICAgMUUtMSAgIDEgICAgICAgLT4gLTEKK2RxY29tNTU1IGNvbXBhcmUgICAgMUUtMCAgIDEgICAgICAgLT4gIDAKK2RxY29tNTU2IGNvbXBhcmUgICAgMUUrMSAgIDEgICAgICAgLT4gIDEKK2RxY29tNTU3IGNvbXBhcmUgICAgMUUrMiAgIDEgICAgICAgLT4gIDEKK2RxY29tNTU4IGNvbXBhcmUgICAgMUUrMyAgIDEgICAgICAgLT4gIDEKK2RxY29tNTU5IGNvbXBhcmUgICAgMUUrNCAgIDEgICAgICAgLT4gIDEKK2RxY29tNTYxIGNvbXBhcmUgICAgMUUrNSAgIDEgICAgICAgLT4gIDEKK2RxY29tNTYyIGNvbXBhcmUgICAgMUUrNiAgIDEgICAgICAgLT4gIDEKK2RxY29tNTYzIGNvbXBhcmUgICAgMUUrNyAgIDEgICAgICAgLT4gIDEKK2RxY29tNTY0IGNvbXBhcmUgICAgMUUrOCAgIDEgICAgICAgLT4gIDEKK2RxY29tNTY1IGNvbXBhcmUgICAgMUUrOSAgIDEgICAgICAgLT4gIDEKK2RxY29tNTY2IGNvbXBhcmUgICAgMUUrMTAgIDEgICAgICAgLT4gIDEKK2RxY29tNTY3IGNvbXBhcmUgICAgMUUrMTEgIDEgICAgICAgLT4gIDEKK2RxY29tNTY4IGNvbXBhcmUgICAgMUUrMTIgIDEgICAgICAgLT4gIDEKK2RxY29tNTY5IGNvbXBhcmUgICAgMUUrMTMgIDEgICAgICAgLT4gIDEKK2RxY29tNTcwIGNvbXBhcmUgICAgMUUrMTQgIDEgICAgICAgLT4gIDEKK2RxY29tNTcxIGNvbXBhcmUgICAgMUUrMTUgIDEgICAgICAgLT4gIDEKKy0tIHNpbWlsYXIgd2l0aCBhIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorZHFjb201ODAgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE1ICAgIC0+IDEKK2RxY29tNTgxIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNCAgICAtPiAxCitkcWNvbTU4MiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgLT4gMQorZHFjb201ODMgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEyICAgIC0+IDEKK2RxY29tNTg0IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMSAgICAtPiAxCitkcWNvbTU4NSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgLT4gMQorZHFjb201ODYgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTkgICAgIC0+IDEKK2RxY29tNTg3IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS04ICAgICAtPiAxCitkcWNvbTU4OCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgLT4gMQorZHFjb201ODkgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTYgICAgIC0+IC0xCitkcWNvbTU5MCBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNSAgICAgLT4gLTEKK2RxY29tNTkxIGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAtPiAtMQorZHFjb201OTIgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTMgICAgIC0+IC0xCitkcWNvbTU5MyBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMiAgICAgLT4gLTEKK2RxY29tNTk0IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAtPiAtMQorZHFjb201OTUgY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTAgICAgIC0+IC0xCitkcWNvbTU5NiBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMSAgICAgLT4gLTEKK2RxY29tNTk3IGNvbXBhcmUgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAtPiAtMQorZHFjb201OTggY29tcGFyZSAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzMgICAgIC0+IC0xCitkcWNvbTU5OSBjb21wYXJlICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrNCAgICAgLT4gLTEKKworLS0gY2hlY2sgc29tZSB1bml0LXkgdHJhcHMKK2RxY29tNjAwIGNvbXBhcmUgICAxMiAgICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjAxIGNvbXBhcmUgICAxMi4wICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjAyIGNvbXBhcmUgICAxMi4wMCAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjAzIGNvbXBhcmUgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjA0IGNvbXBhcmUgICAxMi4wMDAwICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjA1IGNvbXBhcmUgICAxMi4wMDAwMCAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjA2IGNvbXBhcmUgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjA3IGNvbXBhcmUgICAxMi4wMDAwMDAwICAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjA4IGNvbXBhcmUgICAxMi4wMDAwMDAwMCAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjA5IGNvbXBhcmUgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgLT4gLTEKK2RxY29tNjEwIGNvbXBhcmUgICAxMi4xMjM0IDEyICAgICAgICAgICAgLT4gIDEKK2RxY29tNjExIGNvbXBhcmUgICAxMi4xMjM0IDEyLjAgICAgICAgICAgLT4gIDEKK2RxY29tNjEyIGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwICAgICAgICAgLT4gIDEKK2RxY29tNjEzIGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMCAgICAgICAgLT4gIDEKK2RxY29tNjE0IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAgICAgICAgLT4gIDEKK2RxY29tNjE1IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgLT4gIDEKK2RxY29tNjE2IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwMCAgICAgLT4gIDEKK2RxY29tNjE3IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwMDAgICAgLT4gIDEKK2RxY29tNjE4IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgLT4gIDEKK2RxY29tNjE5IGNvbXBhcmUgICAxMi4xMjM0IDEyLjAwMDAwMDAwMCAgLT4gIDEKK2RxY29tNjIwIGNvbXBhcmUgIC0xMiAgICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjIxIGNvbXBhcmUgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjIyIGNvbXBhcmUgIC0xMi4wMCAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjIzIGNvbXBhcmUgIC0xMi4wMDAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjI0IGNvbXBhcmUgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjI1IGNvbXBhcmUgIC0xMi4wMDAwMCAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjI2IGNvbXBhcmUgIC0xMi4wMDAwMDAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjI3IGNvbXBhcmUgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjI4IGNvbXBhcmUgIC0xMi4wMDAwMDAwMCAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjI5IGNvbXBhcmUgIC0xMi4wMDAwMDAwMDAgLTEyLjIzNDUgLT4gIDEKK2RxY29tNjMwIGNvbXBhcmUgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgLT4gLTEKK2RxY29tNjMxIGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wICAgICAgICAgLT4gLTEKK2RxY29tNjMyIGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMCAgICAgICAgLT4gLTEKK2RxY29tNjMzIGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgLT4gLTEKK2RxY29tNjM0IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwICAgICAgLT4gLTEKK2RxY29tNjM1IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMCAgICAgLT4gLTEKK2RxY29tNjM2IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgLT4gLTEKK2RxY29tNjM3IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMDAwICAgLT4gLTEKK2RxY29tNjM4IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMCAgLT4gLTEKK2RxY29tNjM5IGNvbXBhcmUgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgLT4gLTEKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RxY29tNjQwIGNvbXBhcmUgICAwICAgICAwICAgLT4gMAorZHFjb202NDEgY29tcGFyZSAgIDAgICAgLTAgICAtPiAwCitkcWNvbTY0MiBjb21wYXJlICAgMCAgICAtMC4wIC0+IDAKK2RxY29tNjQzIGNvbXBhcmUgICAwICAgICAwLjAgLT4gMAorZHFjb202NDQgY29tcGFyZSAgLTAgICAgIDAgICAtPiAwCitkcWNvbTY0NSBjb21wYXJlICAtMCAgICAtMCAgIC0+IDAKK2RxY29tNjQ2IGNvbXBhcmUgIC0wICAgIC0wLjAgLT4gMAorZHFjb202NDcgY29tcGFyZSAgLTAgICAgIDAuMCAtPiAwCitkcWNvbTY0OCBjb21wYXJlICAgMC4wICAgMCAgIC0+IDAKK2RxY29tNjQ5IGNvbXBhcmUgICAwLjAgIC0wICAgLT4gMAorZHFjb202NTAgY29tcGFyZSAgIDAuMCAgLTAuMCAtPiAwCitkcWNvbTY1MSBjb21wYXJlICAgMC4wICAgMC4wIC0+IDAKK2RxY29tNjUyIGNvbXBhcmUgIC0wLjAgICAwICAgLT4gMAorZHFjb202NTMgY29tcGFyZSAgLTAuMCAgLTAgICAtPiAwCitkcWNvbTY1NCBjb21wYXJlICAtMC4wICAtMC4wIC0+IDAKK2RxY29tNjU1IGNvbXBhcmUgIC0wLjAgICAwLjAgLT4gMAorCitkcWNvbTY1NiBjb21wYXJlICAtMEUxICAgMC4wIC0+IDAKK2RxY29tNjU3IGNvbXBhcmUgIC0wRTIgICAwLjAgLT4gMAorZHFjb202NTggY29tcGFyZSAgIDBFMSAgIDAuMCAtPiAwCitkcWNvbTY1OSBjb21wYXJlICAgMEUyICAgMC4wIC0+IDAKK2RxY29tNjYwIGNvbXBhcmUgIC0wRTEgICAwICAgLT4gMAorZHFjb202NjEgY29tcGFyZSAgLTBFMiAgIDAgICAtPiAwCitkcWNvbTY2MiBjb21wYXJlICAgMEUxICAgMCAgIC0+IDAKK2RxY29tNjYzIGNvbXBhcmUgICAwRTIgICAwICAgLT4gMAorZHFjb202NjQgY29tcGFyZSAgLTBFMSAgLTBFMSAtPiAwCitkcWNvbTY2NSBjb21wYXJlICAtMEUyICAtMEUxIC0+IDAKK2RxY29tNjY2IGNvbXBhcmUgICAwRTEgIC0wRTEgLT4gMAorZHFjb202NjcgY29tcGFyZSAgIDBFMiAgLTBFMSAtPiAwCitkcWNvbTY2OCBjb21wYXJlICAtMEUxICAtMEUyIC0+IDAKK2RxY29tNjY5IGNvbXBhcmUgIC0wRTIgIC0wRTIgLT4gMAorZHFjb202NzAgY29tcGFyZSAgIDBFMSAgLTBFMiAtPiAwCitkcWNvbTY3MSBjb21wYXJlICAgMEUyICAtMEUyIC0+IDAKK2RxY29tNjcyIGNvbXBhcmUgIC0wRTEgICAwRTEgLT4gMAorZHFjb202NzMgY29tcGFyZSAgLTBFMiAgIDBFMSAtPiAwCitkcWNvbTY3NCBjb21wYXJlICAgMEUxICAgMEUxIC0+IDAKK2RxY29tNjc1IGNvbXBhcmUgICAwRTIgICAwRTEgLT4gMAorZHFjb202NzYgY29tcGFyZSAgLTBFMSAgIDBFMiAtPiAwCitkcWNvbTY3NyBjb21wYXJlICAtMEUyICAgMEUyIC0+IDAKK2RxY29tNjc4IGNvbXBhcmUgICAwRTEgICAwRTIgLT4gMAorZHFjb202NzkgY29tcGFyZSAgIDBFMiAgIDBFMiAtPiAwCisKKy0tIHRyYWlsaW5nIHplcm9zOyB1bml0LXkKK2RxY29tNjgwIGNvbXBhcmUgICAxMiAgICAxMiAgICAgICAgICAgLT4gMAorZHFjb202ODEgY29tcGFyZSAgIDEyICAgIDEyLjAgICAgICAgICAtPiAwCitkcWNvbTY4MiBjb21wYXJlICAgMTIgICAgMTIuMDAgICAgICAgIC0+IDAKK2RxY29tNjgzIGNvbXBhcmUgICAxMiAgICAxMi4wMDAgICAgICAgLT4gMAorZHFjb202ODQgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAgICAgICAtPiAwCitkcWNvbTY4NSBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAgICAgIC0+IDAKK2RxY29tNjg2IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAgICAgLT4gMAorZHFjb202ODcgY29tcGFyZSAgIDEyICAgIDEyLjAwMDAwMDAgICAtPiAwCitkcWNvbTY4OCBjb21wYXJlICAgMTIgICAgMTIuMDAwMDAwMDAgIC0+IDAKK2RxY29tNjg5IGNvbXBhcmUgICAxMiAgICAxMi4wMDAwMDAwMDAgLT4gMAorZHFjb202OTAgY29tcGFyZSAgIDEyICAgICAgICAgICAgICAxMiAtPiAwCitkcWNvbTY5MSBjb21wYXJlICAgMTIuMCAgICAgICAgICAgIDEyIC0+IDAKK2RxY29tNjkyIGNvbXBhcmUgICAxMi4wMCAgICAgICAgICAgMTIgLT4gMAorZHFjb202OTMgY29tcGFyZSAgIDEyLjAwMCAgICAgICAgICAxMiAtPiAwCitkcWNvbTY5NCBjb21wYXJlICAgMTIuMDAwMCAgICAgICAgIDEyIC0+IDAKK2RxY29tNjk1IGNvbXBhcmUgICAxMi4wMDAwMCAgICAgICAgMTIgLT4gMAorZHFjb202OTYgY29tcGFyZSAgIDEyLjAwMDAwMCAgICAgICAxMiAtPiAwCitkcWNvbTY5NyBjb21wYXJlICAgMTIuMDAwMDAwMCAgICAgIDEyIC0+IDAKK2RxY29tNjk4IGNvbXBhcmUgICAxMi4wMDAwMDAwMCAgICAgMTIgLT4gMAorZHFjb202OTkgY29tcGFyZSAgIDEyLjAwMDAwMDAwMCAgICAxMiAtPiAwCisKKy0tIGZpcnN0LCBzZWNvbmQsICYgbGFzdCBkaWdpdAorZHFjb203MDAgY29tcGFyZSAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NSAtPiAxCitkcWNvbTcwMSBjb21wYXJlICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IDAKK2RxY29tNzAyIGNvbXBhcmUgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTcgLT4gLTEKK2RxY29tNzAzIGNvbXBhcmUgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDAyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gMQorZHFjb203MDQgY29tcGFyZSAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAwCitkcWNvbTcwNSBjb21wYXJlICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAyMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IC0xCitkcWNvbTcwNiBjb21wYXJlICAgMTEzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMDM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IDEKK2RxY29tNzA3IGNvbXBhcmUgICAxMTM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDExMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gMAorZHFjb203MDggY29tcGFyZSAgIDExMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAtMQorCistLSBtaXNjZWxsYW5lb3VzCitkcWNvbTcyMSBjb21wYXJlIDEyMzQ1Njc4MDAwIDEgLT4gMQorZHFjb203MjIgY29tcGFyZSAxIDEyMzQ1Njc4MDAwIC0+IC0xCitkcWNvbTcyMyBjb21wYXJlIDEyMzQ1Njc4MDAgIDEgLT4gMQorZHFjb203MjQgY29tcGFyZSAxIDEyMzQ1Njc4MDAgIC0+IC0xCitkcWNvbTcyNSBjb21wYXJlIDEyMzQ1Njc4OTAgIDEgLT4gMQorZHFjb203MjYgY29tcGFyZSAxIDEyMzQ1Njc4OTAgIC0+IC0xCitkcWNvbTcyNyBjb21wYXJlIDEyMzQ1Njc4OTEgIDEgLT4gMQorZHFjb203MjggY29tcGFyZSAxIDEyMzQ1Njc4OTEgIC0+IC0xCitkcWNvbTcyOSBjb21wYXJlIDEyMzQ1Njc4OTAxIDEgLT4gMQorZHFjb203MzAgY29tcGFyZSAxIDEyMzQ1Njc4OTAxIC0+IC0xCitkcWNvbTczMSBjb21wYXJlIDEyMzQ1Njc4OTYgIDEgLT4gMQorZHFjb203MzIgY29tcGFyZSAxIDEyMzQ1Njc4OTYgIC0+IC0xCisKKy0tIHJlc2lkdWUgY2FzZXMgYXQgbG93ZXIgcHJlY2lzaW9uCitkcWNvbTc0MCBjb21wYXJlICAxICAwLjk5OTk5OTkgIC0+IDEKK2RxY29tNzQxIGNvbXBhcmUgIDEgIDAuOTk5OTk5ICAgLT4gMQorZHFjb203NDIgY29tcGFyZSAgMSAgMC45OTk5OSAgICAtPiAxCitkcWNvbTc0MyBjb21wYXJlICAxICAxLjAwMDAgICAgIC0+IDAKK2RxY29tNzQ0IGNvbXBhcmUgIDEgIDEuMDAwMDEgICAgLT4gLTEKK2RxY29tNzQ1IGNvbXBhcmUgIDEgIDEuMDAwMDAxICAgLT4gLTEKK2RxY29tNzQ2IGNvbXBhcmUgIDEgIDEuMDAwMDAwMSAgLT4gLTEKK2RxY29tNzUwIGNvbXBhcmUgIDAuOTk5OTk5OSAgMSAgLT4gLTEKK2RxY29tNzUxIGNvbXBhcmUgIDAuOTk5OTk5ICAgMSAgLT4gLTEKK2RxY29tNzUyIGNvbXBhcmUgIDAuOTk5OTkgICAgMSAgLT4gLTEKK2RxY29tNzUzIGNvbXBhcmUgIDEuMDAwMCAgICAgMSAgLT4gMAorZHFjb203NTQgY29tcGFyZSAgMS4wMDAwMSAgICAxICAtPiAxCitkcWNvbTc1NSBjb21wYXJlICAxLjAwMDAwMSAgIDEgIC0+IDEKK2RxY29tNzU2IGNvbXBhcmUgIDEuMDAwMDAwMSAgMSAgLT4gMQorCistLSBTcGVjaWFscworZHFjb203ODAgY29tcGFyZSAgSW5mICAtSW5mICAgLT4gIDEKK2RxY29tNzgxIGNvbXBhcmUgIEluZiAgLTEwMDAgIC0+ICAxCitkcWNvbTc4MiBjb21wYXJlICBJbmYgIC0xICAgICAtPiAgMQorZHFjb203ODMgY29tcGFyZSAgSW5mICAtMCAgICAgLT4gIDEKK2RxY29tNzg0IGNvbXBhcmUgIEluZiAgIDAgICAgIC0+ICAxCitkcWNvbTc4NSBjb21wYXJlICBJbmYgICAxICAgICAtPiAgMQorZHFjb203ODYgY29tcGFyZSAgSW5mICAgMTAwMCAgLT4gIDEKK2RxY29tNzg3IGNvbXBhcmUgIEluZiAgIEluZiAgIC0+ICAwCitkcWNvbTc4OCBjb21wYXJlIC0xMDAwICBJbmYgICAtPiAtMQorZHFjb203ODkgY29tcGFyZSAtSW5mICAgSW5mICAgLT4gLTEKK2RxY29tNzkwIGNvbXBhcmUgLTEgICAgIEluZiAgIC0+IC0xCitkcWNvbTc5MSBjb21wYXJlIC0wICAgICBJbmYgICAtPiAtMQorZHFjb203OTIgY29tcGFyZSAgMCAgICAgSW5mICAgLT4gLTEKK2RxY29tNzkzIGNvbXBhcmUgIDEgICAgIEluZiAgIC0+IC0xCitkcWNvbTc5NCBjb21wYXJlICAxMDAwICBJbmYgICAtPiAtMQorZHFjb203OTUgY29tcGFyZSAgSW5mICAgSW5mICAgLT4gIDAKKworZHFjb204MDAgY29tcGFyZSAtSW5mICAtSW5mICAgLT4gIDAKK2RxY29tODAxIGNvbXBhcmUgLUluZiAgLTEwMDAgIC0+IC0xCitkcWNvbTgwMiBjb21wYXJlIC1JbmYgIC0xICAgICAtPiAtMQorZHFjb204MDMgY29tcGFyZSAtSW5mICAtMCAgICAgLT4gLTEKK2RxY29tODA0IGNvbXBhcmUgLUluZiAgIDAgICAgIC0+IC0xCitkcWNvbTgwNSBjb21wYXJlIC1JbmYgICAxICAgICAtPiAtMQorZHFjb204MDYgY29tcGFyZSAtSW5mICAgMTAwMCAgLT4gLTEKK2RxY29tODA3IGNvbXBhcmUgLUluZiAgIEluZiAgIC0+IC0xCitkcWNvbTgwOCBjb21wYXJlIC1JbmYgIC1JbmYgICAtPiAgMAorZHFjb204MDkgY29tcGFyZSAtMTAwMCAtSW5mICAgLT4gIDEKK2RxY29tODEwIGNvbXBhcmUgLTEgICAgLUluZiAgIC0+ICAxCitkcWNvbTgxMSBjb21wYXJlIC0wICAgIC1JbmYgICAtPiAgMQorZHFjb204MTIgY29tcGFyZSAgMCAgICAtSW5mICAgLT4gIDEKK2RxY29tODEzIGNvbXBhcmUgIDEgICAgLUluZiAgIC0+ICAxCitkcWNvbTgxNCBjb21wYXJlICAxMDAwIC1JbmYgICAtPiAgMQorZHFjb204MTUgY29tcGFyZSAgSW5mICAtSW5mICAgLT4gIDEKKworZHFjb204MjEgY29tcGFyZSAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFjb204MjIgY29tcGFyZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHFjb204MjMgY29tcGFyZSAgTmFOIC0xICAgICAgLT4gIE5hTgorZHFjb204MjQgY29tcGFyZSAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFjb204MjUgY29tcGFyZSAgTmFOICAwICAgICAgLT4gIE5hTgorZHFjb204MjYgY29tcGFyZSAgTmFOICAxICAgICAgLT4gIE5hTgorZHFjb204MjcgY29tcGFyZSAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFjb204MjggY29tcGFyZSAgTmFOICBJbmYgICAgLT4gIE5hTgorZHFjb204MjkgY29tcGFyZSAgTmFOICBOYU4gICAgLT4gIE5hTgorZHFjb204MzAgY29tcGFyZSAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFjb204MzEgY29tcGFyZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHFjb204MzIgY29tcGFyZSAtMSAgICBOYU4gICAgLT4gIE5hTgorZHFjb204MzMgY29tcGFyZSAtMCAgICBOYU4gICAgLT4gIE5hTgorZHFjb204MzQgY29tcGFyZSAgMCAgICBOYU4gICAgLT4gIE5hTgorZHFjb204MzUgY29tcGFyZSAgMSAgICBOYU4gICAgLT4gIE5hTgorZHFjb204MzYgY29tcGFyZSAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFjb204MzcgY29tcGFyZSAgSW5mICBOYU4gICAgLT4gIE5hTgorZHFjb204MzggY29tcGFyZSAtTmFOIC1OYU4gICAgLT4gLU5hTgorZHFjb204MzkgY29tcGFyZSArTmFOIC1OYU4gICAgLT4gIE5hTgorZHFjb204NDAgY29tcGFyZSAtTmFOICtOYU4gICAgLT4gLU5hTgorCitkcWNvbTg0MSBjb21wYXJlICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NDIgY29tcGFyZSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODQzIGNvbXBhcmUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg0NCBjb21wYXJlICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NDUgY29tcGFyZSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODQ2IGNvbXBhcmUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg0NyBjb21wYXJlICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NDggY29tcGFyZSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODQ5IGNvbXBhcmUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg1MCBjb21wYXJlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NTEgY29tcGFyZSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODUyIGNvbXBhcmUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg1MyBjb21wYXJlIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NTQgY29tcGFyZSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODU1IGNvbXBhcmUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg1NiBjb21wYXJlICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NTcgY29tcGFyZSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODU4IGNvbXBhcmUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg1OSBjb21wYXJlICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcWNvbTg2MCBjb21wYXJlICBOYU45IC1JbmYgICAtPiAgTmFOOQorZHFjb204NjEgY29tcGFyZSAgTmFOOCAgOTk5ICAgLT4gIE5hTjgKK2RxY29tODYyIGNvbXBhcmUgIE5hTjc3IEluZiAgIC0+ICBOYU43NworZHFjb204NjMgY29tcGFyZSAtTmFONjcgTmFONSAgLT4gLU5hTjY3CitkcWNvbTg2NCBjb21wYXJlIC1JbmYgIC1OYU40ICAtPiAtTmFONAorZHFjb204NjUgY29tcGFyZSAtOTk5ICAtTmFOMzMgLT4gLU5hTjMzCitkcWNvbTg2NiBjb21wYXJlICBJbmYgICBOYU4yICAtPiAgTmFOMgorZHFjb204NjcgY29tcGFyZSAtTmFONDEgLU5hTjQyIC0+IC1OYU40MQorZHFjb204NjggY29tcGFyZSArTmFONDEgLU5hTjQyIC0+ICBOYU40MQorZHFjb204NjkgY29tcGFyZSAtTmFONDEgK05hTjQyIC0+IC1OYU40MQorZHFjb204NzAgY29tcGFyZSArTmFONDEgK05hTjQyIC0+ICBOYU40MQorCitkcWNvbTg3MSBjb21wYXJlIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODcyIGNvbXBhcmUgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NzMgY29tcGFyZSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg3NCBjb21wYXJlICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODc1IGNvbXBhcmUgIE5hTjg1ICBzTmFOODMgIC0+ICBOYU44MyBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NzYgY29tcGFyZSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTg3NyBjb21wYXJlICAwODggICAgc05hTjgxICAtPiAgTmFOODEgSW52YWxpZF9vcGVyYXRpb24KK2RxY29tODc4IGNvbXBhcmUgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFjb204NzkgY29tcGFyZSAgTmFOICAgLXNOYU44OSAgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHdpZGUgcmFuZ2UKK2RxY29tODgwIGNvbXBhcmUgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrNjE0NCAtPiAtMQorZHFjb204ODEgY29tcGFyZSA5RSs2MTQ0ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitkcWNvbTg4MiBjb21wYXJlICswLjEwMCA5RS02MTQzICAgICAgICAgICAgICAgLT4gIDEKK2RxY29tODgzIGNvbXBhcmUgOUUtNjE0MyArMC4xMDAgICAgICAgICAgICAgICAtPiAtMQorZHFjb204ODUgY29tcGFyZSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs2MTQ0IC0+IC0xCitkcWNvbTg4NiBjb21wYXJlIDlFKzYxNDQgLTEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDEKK2RxY29tODg3IGNvbXBhcmUgLTAuMTAwIDlFLTYxNDMgICAgICAgICAgICAgICAtPiAtMQorZHFjb204ODggY29tcGFyZSA5RS02MTQzIC0wLjEwMCAgICAgICAgICAgICAgIC0+ICAxCisKKy0tIHNpZ25zCitkcWNvbTkwMSBjb21wYXJlICAxZSs3NyAgMWUrMTEgLT4gIDEKK2RxY29tOTAyIGNvbXBhcmUgIDFlKzc3IC0xZSsxMSAtPiAgMQorZHFjb205MDMgY29tcGFyZSAtMWUrNzcgIDFlKzExIC0+IC0xCitkcWNvbTkwNCBjb21wYXJlIC0xZSs3NyAtMWUrMTEgLT4gLTEKK2RxY29tOTA1IGNvbXBhcmUgIDFlLTc3ICAxZS0xMSAtPiAtMQorZHFjb205MDYgY29tcGFyZSAgMWUtNzcgLTFlLTExIC0+ICAxCitkcWNvbTkwNyBjb21wYXJlIC0xZS03NyAgMWUtMTEgLT4gLTEKK2RxY29tOTA4IGNvbXBhcmUgLTFlLTc3IC0xZS0xMSAtPiAgMQorCistLSBmdWxsIGFsaWdubWVudCByYW5nZSwgYm90aCB3YXlzCitkcWNvbXAxMDAxIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gMAorZHFjb21wMTAwMiBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDAKK2RxY29tcDEwMDMgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAtPiAwCitkcWNvbXAxMDA0IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgLT4gMAorZHFjb21wMTAwNSBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIC0+IDAKK2RxY29tcDEwMDYgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwCitkcWNvbXAxMDA3IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgLT4gMAorZHFjb21wMTAwOCBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgIC0+IDAKK2RxY29tcDEwMDkgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAtPiAwCitkcWNvbXAxMDEwIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgLT4gMAorZHFjb21wMTAxMSBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMTIgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAtPiAwCitkcWNvbXAxMDEzIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgLT4gMAorZHFjb21wMTAxNCBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMTUgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAtPiAwCitkcWNvbXAxMDE2IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgLT4gMAorZHFjb21wMTAxNyBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMTggY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAtPiAwCitkcWNvbXAxMDE5IGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMDAwMCAgLT4gMAorZHFjb21wMTAyMCBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMDAwMCAgIC0+IDAKK2RxY29tcDEwMjEgY29tcGFyZSAxIDEuMDAwMDAwMDAwMDAwMCAgICAtPiAwCitkcWNvbXAxMDIyIGNvbXBhcmUgMSAxLjAwMDAwMDAwMDAwMCAgICAgLT4gMAorZHFjb21wMTAyMyBjb21wYXJlIDEgMS4wMDAwMDAwMDAwMCAgICAgIC0+IDAKK2RxY29tcDEwMjQgY29tcGFyZSAxIDEuMDAwMDAwMDAwMCAgICAgICAtPiAwCitkcWNvbXAxMDI1IGNvbXBhcmUgMSAxLjAwMDAwMDAwMCAgICAgICAgLT4gMAorZHFjb21wMTAyNiBjb21wYXJlIDEgMS4wMDAwMDAwMCAgICAgICAgIC0+IDAKK2RxY29tcDEwMjcgY29tcGFyZSAxIDEuMDAwMDAwMCAgICAgICAgICAtPiAwCitkcWNvbXAxMDI4IGNvbXBhcmUgMSAxLjAwMDAwMCAgICAgICAgICAgLT4gMAorZHFjb21wMTAyOSBjb21wYXJlIDEgMS4wMDAwMCAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMzAgY29tcGFyZSAxIDEuMDAwMCAgICAgICAgICAgICAtPiAwCitkcWNvbXAxMDMxIGNvbXBhcmUgMSAxLjAwMCAgICAgICAgICAgICAgLT4gMAorZHFjb21wMTAzMiBjb21wYXJlIDEgMS4wMCAgICAgICAgICAgICAgIC0+IDAKK2RxY29tcDEwMzMgY29tcGFyZSAxIDEuMCAgICAgICAgICAgICAgICAtPiAwCisKK2RxY29tcDEwNDEgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMSAtPiAwCitkcWNvbXAxMDQyIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIDEgLT4gMAorZHFjb21wMTA0MyBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAxIC0+IDAKK2RxY29tcDEwNDQgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMSAtPiAwCitkcWNvbXAxMDQ1IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgIDEgLT4gMAorZHFjb21wMTA0NiBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAxIC0+IDAKK2RxY29tcDEwNDcgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgMSAtPiAwCitkcWNvbXAxMDQ4IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgIDEgLT4gMAorZHFjb21wMTA0OSBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNTAgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDUxIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA1MiBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNTMgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDU0IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA1NSBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNTYgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDU3IGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA1OCBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNTkgY29tcGFyZSAxLjAwMDAwMDAwMDAwMDAwMCAgMSAtPiAwCitkcWNvbXAxMDYwIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMCAgIDEgLT4gMAorZHFjb21wMTA2MSBjb21wYXJlIDEuMDAwMDAwMDAwMDAwMCAgICAxIC0+IDAKK2RxY29tcDEwNjIgY29tcGFyZSAxLjAwMDAwMDAwMDAwMCAgICAgMSAtPiAwCitkcWNvbXAxMDYzIGNvbXBhcmUgMS4wMDAwMDAwMDAwMCAgICAgIDEgLT4gMAorZHFjb21wMTA2NCBjb21wYXJlIDEuMDAwMDAwMDAwMCAgICAgICAxIC0+IDAKK2RxY29tcDEwNjUgY29tcGFyZSAxLjAwMDAwMDAwMCAgICAgICAgMSAtPiAwCitkcWNvbXAxMDY2IGNvbXBhcmUgMS4wMDAwMDAwMCAgICAgICAgIDEgLT4gMAorZHFjb21wMTA2NyBjb21wYXJlIDEuMDAwMDAwMCAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNjggY29tcGFyZSAxLjAwMDAwMCAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDY5IGNvbXBhcmUgMS4wMDAwMCAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA3MCBjb21wYXJlIDEuMDAwMCAgICAgICAgICAgICAxIC0+IDAKK2RxY29tcDEwNzEgY29tcGFyZSAxLjAwMCAgICAgICAgICAgICAgMSAtPiAwCitkcWNvbXAxMDcyIGNvbXBhcmUgMS4wMCAgICAgICAgICAgICAgIDEgLT4gMAorZHFjb21wMTA3MyBjb21wYXJlIDEuMCAgICAgICAgICAgICAgICAxIC0+IDAKKworLS0gY2hlY2sgTVNEIGFsd2F5cyBkZXRlY3RlZCBub24temVybworZHFjb21wMTA4MCBjb21wYXJlIDAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IDAKK2RxY29tcDEwODEgY29tcGFyZSAwIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZHFjb21wMTA4MiBjb21wYXJlIDAgMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkcWNvbXAxMDgzIGNvbXBhcmUgMCAzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RxY29tcDEwODQgY29tcGFyZSAwIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZHFjb21wMTA4NSBjb21wYXJlIDAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkcWNvbXAxMDg2IGNvbXBhcmUgMCA2LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RxY29tcDEwODcgY29tcGFyZSAwIDcuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAtPiAtMQorZHFjb21wMTA4OCBjb21wYXJlIDAgOC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IC0xCitkcWNvbXAxMDg5IGNvbXBhcmUgMCA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gLTEKK2RxY29tcDEwOTAgY29tcGFyZSAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMCAtPiAwCitkcWNvbXAxMDkxIGNvbXBhcmUgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZHFjb21wMTA5MiBjb21wYXJlIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RxY29tcDEwOTMgY29tcGFyZSAzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkcWNvbXAxMDk0IGNvbXBhcmUgNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZHFjb21wMTA5NSBjb21wYXJlIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RxY29tcDEwOTYgY29tcGFyZSA2LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCitkcWNvbXAxMDk3IGNvbXBhcmUgNy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIDAgLT4gMQorZHFjb21wMTA5OCBjb21wYXJlIDguMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwIC0+IDEKK2RxY29tcDEwOTkgY29tcGFyZSA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgMCAtPiAxCisKKy0tIE51bGwgdGVzdHMKK2RxY29tOTkwIGNvbXBhcmUgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWNvbTk5MSBjb21wYXJlICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmVTaWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlU2lnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1ZjA5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlU2lnLmRlY1Rlc3QKQEAgLTAsMCArMSw2NDcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFDb21wYXJlU2lnLmRlY1Rlc3QgLS0gZGVjUXVhZCBjb21wYXJpc29uOyBhbGwgTmFOcyBzaWduYWwgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RxY21zMDAxIGNvbXBhcmVzaWcgIC0yICAtMiAgLT4gMAorZHFjbXMwMDIgY29tcGFyZXNpZyAgLTIgIC0xICAtPiAtMQorZHFjbXMwMDMgY29tcGFyZXNpZyAgLTIgICAwICAtPiAtMQorZHFjbXMwMDQgY29tcGFyZXNpZyAgLTIgICAxICAtPiAtMQorZHFjbXMwMDUgY29tcGFyZXNpZyAgLTIgICAyICAtPiAtMQorZHFjbXMwMDYgY29tcGFyZXNpZyAgLTEgIC0yICAtPiAxCitkcWNtczAwNyBjb21wYXJlc2lnICAtMSAgLTEgIC0+IDAKK2RxY21zMDA4IGNvbXBhcmVzaWcgIC0xICAgMCAgLT4gLTEKK2RxY21zMDA5IGNvbXBhcmVzaWcgIC0xICAgMSAgLT4gLTEKK2RxY21zMDEwIGNvbXBhcmVzaWcgIC0xICAgMiAgLT4gLTEKK2RxY21zMDExIGNvbXBhcmVzaWcgICAwICAtMiAgLT4gMQorZHFjbXMwMTIgY29tcGFyZXNpZyAgIDAgIC0xICAtPiAxCitkcWNtczAxMyBjb21wYXJlc2lnICAgMCAgIDAgIC0+IDAKK2RxY21zMDE0IGNvbXBhcmVzaWcgICAwICAgMSAgLT4gLTEKK2RxY21zMDE1IGNvbXBhcmVzaWcgICAwICAgMiAgLT4gLTEKK2RxY21zMDE2IGNvbXBhcmVzaWcgICAxICAtMiAgLT4gMQorZHFjbXMwMTcgY29tcGFyZXNpZyAgIDEgIC0xICAtPiAxCitkcWNtczAxOCBjb21wYXJlc2lnICAgMSAgIDAgIC0+IDEKK2RxY21zMDE5IGNvbXBhcmVzaWcgICAxICAgMSAgLT4gMAorZHFjbXMwMjAgY29tcGFyZXNpZyAgIDEgICAyICAtPiAtMQorZHFjbXMwMjEgY29tcGFyZXNpZyAgIDIgIC0yICAtPiAxCitkcWNtczAyMiBjb21wYXJlc2lnICAgMiAgLTEgIC0+IDEKK2RxY21zMDIzIGNvbXBhcmVzaWcgICAyICAgMCAgLT4gMQorZHFjbXMwMjUgY29tcGFyZXNpZyAgIDIgICAxICAtPiAxCitkcWNtczAyNiBjb21wYXJlc2lnICAgMiAgIDIgIC0+IDAKKworZHFjbXMwMzEgY29tcGFyZXNpZyAgLTIwICAtMjAgIC0+IDAKK2RxY21zMDMyIGNvbXBhcmVzaWcgIC0yMCAgLTEwICAtPiAtMQorZHFjbXMwMzMgY29tcGFyZXNpZyAgLTIwICAgMDAgIC0+IC0xCitkcWNtczAzNCBjb21wYXJlc2lnICAtMjAgICAxMCAgLT4gLTEKK2RxY21zMDM1IGNvbXBhcmVzaWcgIC0yMCAgIDIwICAtPiAtMQorZHFjbXMwMzYgY29tcGFyZXNpZyAgLTEwICAtMjAgIC0+IDEKK2RxY21zMDM3IGNvbXBhcmVzaWcgIC0xMCAgLTEwICAtPiAwCitkcWNtczAzOCBjb21wYXJlc2lnICAtMTAgICAwMCAgLT4gLTEKK2RxY21zMDM5IGNvbXBhcmVzaWcgIC0xMCAgIDEwICAtPiAtMQorZHFjbXMwNDAgY29tcGFyZXNpZyAgLTEwICAgMjAgIC0+IC0xCitkcWNtczA0MSBjb21wYXJlc2lnICAgMDAgIC0yMCAgLT4gMQorZHFjbXMwNDIgY29tcGFyZXNpZyAgIDAwICAtMTAgIC0+IDEKK2RxY21zMDQzIGNvbXBhcmVzaWcgICAwMCAgIDAwICAtPiAwCitkcWNtczA0NCBjb21wYXJlc2lnICAgMDAgICAxMCAgLT4gLTEKK2RxY21zMDQ1IGNvbXBhcmVzaWcgICAwMCAgIDIwICAtPiAtMQorZHFjbXMwNDYgY29tcGFyZXNpZyAgIDEwICAtMjAgIC0+IDEKK2RxY21zMDQ3IGNvbXBhcmVzaWcgICAxMCAgLTEwICAtPiAxCitkcWNtczA0OCBjb21wYXJlc2lnICAgMTAgICAwMCAgLT4gMQorZHFjbXMwNDkgY29tcGFyZXNpZyAgIDEwICAgMTAgIC0+IDAKK2RxY21zMDUwIGNvbXBhcmVzaWcgICAxMCAgIDIwICAtPiAtMQorZHFjbXMwNTEgY29tcGFyZXNpZyAgIDIwICAtMjAgIC0+IDEKK2RxY21zMDUyIGNvbXBhcmVzaWcgICAyMCAgLTEwICAtPiAxCitkcWNtczA1MyBjb21wYXJlc2lnICAgMjAgICAwMCAgLT4gMQorZHFjbXMwNTUgY29tcGFyZXNpZyAgIDIwICAgMTAgIC0+IDEKK2RxY21zMDU2IGNvbXBhcmVzaWcgICAyMCAgIDIwICAtPiAwCisKK2RxY21zMDYxIGNvbXBhcmVzaWcgIC0yLjAgIC0yLjAgIC0+IDAKK2RxY21zMDYyIGNvbXBhcmVzaWcgIC0yLjAgIC0xLjAgIC0+IC0xCitkcWNtczA2MyBjb21wYXJlc2lnICAtMi4wICAgMC4wICAtPiAtMQorZHFjbXMwNjQgY29tcGFyZXNpZyAgLTIuMCAgIDEuMCAgLT4gLTEKK2RxY21zMDY1IGNvbXBhcmVzaWcgIC0yLjAgICAyLjAgIC0+IC0xCitkcWNtczA2NiBjb21wYXJlc2lnICAtMS4wICAtMi4wICAtPiAxCitkcWNtczA2NyBjb21wYXJlc2lnICAtMS4wICAtMS4wICAtPiAwCitkcWNtczA2OCBjb21wYXJlc2lnICAtMS4wICAgMC4wICAtPiAtMQorZHFjbXMwNjkgY29tcGFyZXNpZyAgLTEuMCAgIDEuMCAgLT4gLTEKK2RxY21zMDcwIGNvbXBhcmVzaWcgIC0xLjAgICAyLjAgIC0+IC0xCitkcWNtczA3MSBjb21wYXJlc2lnICAgMC4wICAtMi4wICAtPiAxCitkcWNtczA3MiBjb21wYXJlc2lnICAgMC4wICAtMS4wICAtPiAxCitkcWNtczA3MyBjb21wYXJlc2lnICAgMC4wICAgMC4wICAtPiAwCitkcWNtczA3NCBjb21wYXJlc2lnICAgMC4wICAgMS4wICAtPiAtMQorZHFjbXMwNzUgY29tcGFyZXNpZyAgIDAuMCAgIDIuMCAgLT4gLTEKK2RxY21zMDc2IGNvbXBhcmVzaWcgICAxLjAgIC0yLjAgIC0+IDEKK2RxY21zMDc3IGNvbXBhcmVzaWcgICAxLjAgIC0xLjAgIC0+IDEKK2RxY21zMDc4IGNvbXBhcmVzaWcgICAxLjAgICAwLjAgIC0+IDEKK2RxY21zMDc5IGNvbXBhcmVzaWcgICAxLjAgICAxLjAgIC0+IDAKK2RxY21zMDgwIGNvbXBhcmVzaWcgICAxLjAgICAyLjAgIC0+IC0xCitkcWNtczA4MSBjb21wYXJlc2lnICAgMi4wICAtMi4wICAtPiAxCitkcWNtczA4MiBjb21wYXJlc2lnICAgMi4wICAtMS4wICAtPiAxCitkcWNtczA4MyBjb21wYXJlc2lnICAgMi4wICAgMC4wICAtPiAxCitkcWNtczA4NSBjb21wYXJlc2lnICAgMi4wICAgMS4wICAtPiAxCitkcWNtczA4NiBjb21wYXJlc2lnICAgMi4wICAgMi4wICAtPiAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorZHFjbXMwOTAgY29tcGFyZXNpZyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+IDAKK2RxY21zMDkxIGNvbXBhcmVzaWcgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAtMQorZHFjbXMwOTIgY29tcGFyZXNpZyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDEKK2RxY21zMDkzIGNvbXBhcmVzaWcgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAwCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworZHFjbXMxMDAgY29tcGFyZXNpZyAgIDcuMCAgICA3LjAgICAgLT4gMAorZHFjbXMxMDEgY29tcGFyZXNpZyAgIDcuMCAgICA3ICAgICAgLT4gMAorZHFjbXMxMDIgY29tcGFyZXNpZyAgIDcgICAgICA3LjAgICAgLT4gMAorZHFjbXMxMDMgY29tcGFyZXNpZyAgIDdFKzAgICA3LjAgICAgLT4gMAorZHFjbXMxMDQgY29tcGFyZXNpZyAgIDcwRS0xICA3LjAgICAgLT4gMAorZHFjbXMxMDUgY29tcGFyZXNpZyAgIDAuN0UrMSA3ICAgICAgLT4gMAorZHFjbXMxMDYgY29tcGFyZXNpZyAgIDcwRS0xICA3ICAgICAgLT4gMAorZHFjbXMxMDcgY29tcGFyZXNpZyAgIDcuMCAgICA3RSswICAgLT4gMAorZHFjbXMxMDggY29tcGFyZXNpZyAgIDcuMCAgICA3MEUtMSAgLT4gMAorZHFjbXMxMDkgY29tcGFyZXNpZyAgIDcgICAgICAwLjdFKzEgLT4gMAorZHFjbXMxMTAgY29tcGFyZXNpZyAgIDcgICAgICA3MEUtMSAgLT4gMAorCitkcWNtczEyMCBjb21wYXJlc2lnICAgOC4wICAgIDcuMCAgICAtPiAxCitkcWNtczEyMSBjb21wYXJlc2lnICAgOC4wICAgIDcgICAgICAtPiAxCitkcWNtczEyMiBjb21wYXJlc2lnICAgOCAgICAgIDcuMCAgICAtPiAxCitkcWNtczEyMyBjb21wYXJlc2lnICAgOEUrMCAgIDcuMCAgICAtPiAxCitkcWNtczEyNCBjb21wYXJlc2lnICAgODBFLTEgIDcuMCAgICAtPiAxCitkcWNtczEyNSBjb21wYXJlc2lnICAgMC44RSsxIDcgICAgICAtPiAxCitkcWNtczEyNiBjb21wYXJlc2lnICAgODBFLTEgIDcgICAgICAtPiAxCitkcWNtczEyNyBjb21wYXJlc2lnICAgOC4wICAgIDdFKzAgICAtPiAxCitkcWNtczEyOCBjb21wYXJlc2lnICAgOC4wICAgIDcwRS0xICAtPiAxCitkcWNtczEyOSBjb21wYXJlc2lnICAgOCAgICAgIDAuN0UrMSAgLT4gMQorZHFjbXMxMzAgY29tcGFyZXNpZyAgIDggICAgICA3MEUtMSAgLT4gMQorCitkcWNtczE0MCBjb21wYXJlc2lnICAgOC4wICAgIDkuMCAgICAtPiAtMQorZHFjbXMxNDEgY29tcGFyZXNpZyAgIDguMCAgICA5ICAgICAgLT4gLTEKK2RxY21zMTQyIGNvbXBhcmVzaWcgICA4ICAgICAgOS4wICAgIC0+IC0xCitkcWNtczE0MyBjb21wYXJlc2lnICAgOEUrMCAgIDkuMCAgICAtPiAtMQorZHFjbXMxNDQgY29tcGFyZXNpZyAgIDgwRS0xICA5LjAgICAgLT4gLTEKK2RxY21zMTQ1IGNvbXBhcmVzaWcgICAwLjhFKzEgOSAgICAgIC0+IC0xCitkcWNtczE0NiBjb21wYXJlc2lnICAgODBFLTEgIDkgICAgICAtPiAtMQorZHFjbXMxNDcgY29tcGFyZXNpZyAgIDguMCAgICA5RSswICAgLT4gLTEKK2RxY21zMTQ4IGNvbXBhcmVzaWcgICA4LjAgICAgOTBFLTEgIC0+IC0xCitkcWNtczE0OSBjb21wYXJlc2lnICAgOCAgICAgIDAuOUUrMSAtPiAtMQorZHFjbXMxNTAgY29tcGFyZXNpZyAgIDggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtKyAuLgorZHFjbXMyMDAgY29tcGFyZXNpZyAgLTcuMCAgICA3LjAgICAgLT4gLTEKK2RxY21zMjAxIGNvbXBhcmVzaWcgIC03LjAgICAgNyAgICAgIC0+IC0xCitkcWNtczIwMiBjb21wYXJlc2lnICAtNyAgICAgIDcuMCAgICAtPiAtMQorZHFjbXMyMDMgY29tcGFyZXNpZyAgLTdFKzAgICA3LjAgICAgLT4gLTEKK2RxY21zMjA0IGNvbXBhcmVzaWcgIC03MEUtMSAgNy4wICAgIC0+IC0xCitkcWNtczIwNSBjb21wYXJlc2lnICAtMC43RSsxIDcgICAgICAtPiAtMQorZHFjbXMyMDYgY29tcGFyZXNpZyAgLTcwRS0xICA3ICAgICAgLT4gLTEKK2RxY21zMjA3IGNvbXBhcmVzaWcgIC03LjAgICAgN0UrMCAgIC0+IC0xCitkcWNtczIwOCBjb21wYXJlc2lnICAtNy4wICAgIDcwRS0xICAtPiAtMQorZHFjbXMyMDkgY29tcGFyZXNpZyAgLTcgICAgICAwLjdFKzEgLT4gLTEKK2RxY21zMjEwIGNvbXBhcmVzaWcgIC03ICAgICAgNzBFLTEgIC0+IC0xCisKK2RxY21zMjIwIGNvbXBhcmVzaWcgIC04LjAgICAgNy4wICAgIC0+IC0xCitkcWNtczIyMSBjb21wYXJlc2lnICAtOC4wICAgIDcgICAgICAtPiAtMQorZHFjbXMyMjIgY29tcGFyZXNpZyAgLTggICAgICA3LjAgICAgLT4gLTEKK2RxY21zMjIzIGNvbXBhcmVzaWcgIC04RSswICAgNy4wICAgIC0+IC0xCitkcWNtczIyNCBjb21wYXJlc2lnICAtODBFLTEgIDcuMCAgICAtPiAtMQorZHFjbXMyMjUgY29tcGFyZXNpZyAgLTAuOEUrMSA3ICAgICAgLT4gLTEKK2RxY21zMjI2IGNvbXBhcmVzaWcgIC04MEUtMSAgNyAgICAgIC0+IC0xCitkcWNtczIyNyBjb21wYXJlc2lnICAtOC4wICAgIDdFKzAgICAtPiAtMQorZHFjbXMyMjggY29tcGFyZXNpZyAgLTguMCAgICA3MEUtMSAgLT4gLTEKK2RxY21zMjI5IGNvbXBhcmVzaWcgIC04ICAgICAgMC43RSsxIC0+IC0xCitkcWNtczIzMCBjb21wYXJlc2lnICAtOCAgICAgIDcwRS0xICAtPiAtMQorCitkcWNtczI0MCBjb21wYXJlc2lnICAtOC4wICAgIDkuMCAgICAtPiAtMQorZHFjbXMyNDEgY29tcGFyZXNpZyAgLTguMCAgICA5ICAgICAgLT4gLTEKK2RxY21zMjQyIGNvbXBhcmVzaWcgIC04ICAgICAgOS4wICAgIC0+IC0xCitkcWNtczI0MyBjb21wYXJlc2lnICAtOEUrMCAgIDkuMCAgICAtPiAtMQorZHFjbXMyNDQgY29tcGFyZXNpZyAgLTgwRS0xICA5LjAgICAgLT4gLTEKK2RxY21zMjQ1IGNvbXBhcmVzaWcgIC0wLjhFKzEgOSAgICAgIC0+IC0xCitkcWNtczI0NiBjb21wYXJlc2lnICAtODBFLTEgIDkgICAgICAtPiAtMQorZHFjbXMyNDcgY29tcGFyZXNpZyAgLTguMCAgICA5RSswICAgLT4gLTEKK2RxY21zMjQ4IGNvbXBhcmVzaWcgIC04LjAgICAgOTBFLTEgIC0+IC0xCitkcWNtczI0OSBjb21wYXJlc2lnICAtOCAgICAgIDAuOUUrMSAtPiAtMQorZHFjbXMyNTAgY29tcGFyZXNpZyAgLTggICAgICA5MEUtMSAgLT4gLTEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyArLSAuLgorZHFjbXMzMDAgY29tcGFyZXNpZyAgIDcuMCAgICAtNy4wICAgIC0+IDEKK2RxY21zMzAxIGNvbXBhcmVzaWcgICA3LjAgICAgLTcgICAgICAtPiAxCitkcWNtczMwMiBjb21wYXJlc2lnICAgNyAgICAgIC03LjAgICAgLT4gMQorZHFjbXMzMDMgY29tcGFyZXNpZyAgIDdFKzAgICAtNy4wICAgIC0+IDEKK2RxY21zMzA0IGNvbXBhcmVzaWcgICA3MEUtMSAgLTcuMCAgICAtPiAxCitkcWNtczMwNSBjb21wYXJlc2lnICAgLjdFKzEgIC03ICAgICAgLT4gMQorZHFjbXMzMDYgY29tcGFyZXNpZyAgIDcwRS0xICAtNyAgICAgIC0+IDEKK2RxY21zMzA3IGNvbXBhcmVzaWcgICA3LjAgICAgLTdFKzAgICAtPiAxCitkcWNtczMwOCBjb21wYXJlc2lnICAgNy4wICAgIC03MEUtMSAgLT4gMQorZHFjbXMzMDkgY29tcGFyZXNpZyAgIDcgICAgICAtLjdFKzEgIC0+IDEKK2RxY21zMzEwIGNvbXBhcmVzaWcgICA3ICAgICAgLTcwRS0xICAtPiAxCisKK2RxY21zMzIwIGNvbXBhcmVzaWcgICA4LjAgICAgLTcuMCAgICAtPiAxCitkcWNtczMyMSBjb21wYXJlc2lnICAgOC4wICAgIC03ICAgICAgLT4gMQorZHFjbXMzMjIgY29tcGFyZXNpZyAgIDggICAgICAtNy4wICAgIC0+IDEKK2RxY21zMzIzIGNvbXBhcmVzaWcgICA4RSswICAgLTcuMCAgICAtPiAxCitkcWNtczMyNCBjb21wYXJlc2lnICAgODBFLTEgIC03LjAgICAgLT4gMQorZHFjbXMzMjUgY29tcGFyZXNpZyAgIC44RSsxICAtNyAgICAgIC0+IDEKK2RxY21zMzI2IGNvbXBhcmVzaWcgICA4MEUtMSAgLTcgICAgICAtPiAxCitkcWNtczMyNyBjb21wYXJlc2lnICAgOC4wICAgIC03RSswICAgLT4gMQorZHFjbXMzMjggY29tcGFyZXNpZyAgIDguMCAgICAtNzBFLTEgIC0+IDEKK2RxY21zMzI5IGNvbXBhcmVzaWcgICA4ICAgICAgLS43RSsxICAtPiAxCitkcWNtczMzMCBjb21wYXJlc2lnICAgOCAgICAgIC03MEUtMSAgLT4gMQorCitkcWNtczM0MCBjb21wYXJlc2lnICAgOC4wICAgIC05LjAgICAgLT4gMQorZHFjbXMzNDEgY29tcGFyZXNpZyAgIDguMCAgICAtOSAgICAgIC0+IDEKK2RxY21zMzQyIGNvbXBhcmVzaWcgICA4ICAgICAgLTkuMCAgICAtPiAxCitkcWNtczM0MyBjb21wYXJlc2lnICAgOEUrMCAgIC05LjAgICAgLT4gMQorZHFjbXMzNDQgY29tcGFyZXNpZyAgIDgwRS0xICAtOS4wICAgIC0+IDEKK2RxY21zMzQ1IGNvbXBhcmVzaWcgICAuOEUrMSAgLTkgICAgICAtPiAxCitkcWNtczM0NiBjb21wYXJlc2lnICAgODBFLTEgIC05ICAgICAgLT4gMQorZHFjbXMzNDcgY29tcGFyZXNpZyAgIDguMCAgICAtOUUrMCAgIC0+IDEKK2RxY21zMzQ4IGNvbXBhcmVzaWcgICA4LjAgICAgLTkwRS0xICAtPiAxCitkcWNtczM0OSBjb21wYXJlc2lnICAgOCAgICAgIC0uOUUrMSAgLT4gMQorZHFjbXMzNTAgY29tcGFyZXNpZyAgIDggICAgICAtOTBFLTEgIC0+IDEKKworLS0gYW5kIGFnYWluLCB3aXRoIHNpZ24gY2hhbmdlcyAtLSAuLgorZHFjbXM0MDAgY29tcGFyZXNpZyAgIC03LjAgICAgLTcuMCAgICAtPiAwCitkcWNtczQwMSBjb21wYXJlc2lnICAgLTcuMCAgICAtNyAgICAgIC0+IDAKK2RxY21zNDAyIGNvbXBhcmVzaWcgICAtNyAgICAgIC03LjAgICAgLT4gMAorZHFjbXM0MDMgY29tcGFyZXNpZyAgIC03RSswICAgLTcuMCAgICAtPiAwCitkcWNtczQwNCBjb21wYXJlc2lnICAgLTcwRS0xICAtNy4wICAgIC0+IDAKK2RxY21zNDA1IGNvbXBhcmVzaWcgICAtLjdFKzEgIC03ICAgICAgLT4gMAorZHFjbXM0MDYgY29tcGFyZXNpZyAgIC03MEUtMSAgLTcgICAgICAtPiAwCitkcWNtczQwNyBjb21wYXJlc2lnICAgLTcuMCAgICAtN0UrMCAgIC0+IDAKK2RxY21zNDA4IGNvbXBhcmVzaWcgICAtNy4wICAgIC03MEUtMSAgLT4gMAorZHFjbXM0MDkgY29tcGFyZXNpZyAgIC03ICAgICAgLS43RSsxICAtPiAwCitkcWNtczQxMCBjb21wYXJlc2lnICAgLTcgICAgICAtNzBFLTEgIC0+IDAKKworZHFjbXM0MjAgY29tcGFyZXNpZyAgIC04LjAgICAgLTcuMCAgICAtPiAtMQorZHFjbXM0MjEgY29tcGFyZXNpZyAgIC04LjAgICAgLTcgICAgICAtPiAtMQorZHFjbXM0MjIgY29tcGFyZXNpZyAgIC04ICAgICAgLTcuMCAgICAtPiAtMQorZHFjbXM0MjMgY29tcGFyZXNpZyAgIC04RSswICAgLTcuMCAgICAtPiAtMQorZHFjbXM0MjQgY29tcGFyZXNpZyAgIC04MEUtMSAgLTcuMCAgICAtPiAtMQorZHFjbXM0MjUgY29tcGFyZXNpZyAgIC0uOEUrMSAgLTcgICAgICAtPiAtMQorZHFjbXM0MjYgY29tcGFyZXNpZyAgIC04MEUtMSAgLTcgICAgICAtPiAtMQorZHFjbXM0MjcgY29tcGFyZXNpZyAgIC04LjAgICAgLTdFKzAgICAtPiAtMQorZHFjbXM0MjggY29tcGFyZXNpZyAgIC04LjAgICAgLTcwRS0xICAtPiAtMQorZHFjbXM0MjkgY29tcGFyZXNpZyAgIC04ICAgICAgLS43RSsxICAtPiAtMQorZHFjbXM0MzAgY29tcGFyZXNpZyAgIC04ICAgICAgLTcwRS0xICAtPiAtMQorCitkcWNtczQ0MCBjb21wYXJlc2lnICAgLTguMCAgICAtOS4wICAgIC0+IDEKK2RxY21zNDQxIGNvbXBhcmVzaWcgICAtOC4wICAgIC05ICAgICAgLT4gMQorZHFjbXM0NDIgY29tcGFyZXNpZyAgIC04ICAgICAgLTkuMCAgICAtPiAxCitkcWNtczQ0MyBjb21wYXJlc2lnICAgLThFKzAgICAtOS4wICAgIC0+IDEKK2RxY21zNDQ0IGNvbXBhcmVzaWcgICAtODBFLTEgIC05LjAgICAgLT4gMQorZHFjbXM0NDUgY29tcGFyZXNpZyAgIC0uOEUrMSAgLTkgICAgICAtPiAxCitkcWNtczQ0NiBjb21wYXJlc2lnICAgLTgwRS0xICAtOSAgICAgIC0+IDEKK2RxY21zNDQ3IGNvbXBhcmVzaWcgICAtOC4wICAgIC05RSswICAgLT4gMQorZHFjbXM0NDggY29tcGFyZXNpZyAgIC04LjAgICAgLTkwRS0xICAtPiAxCitkcWNtczQ0OSBjb21wYXJlc2lnICAgLTggICAgICAtLjlFKzEgIC0+IDEKK2RxY21zNDUwIGNvbXBhcmVzaWcgICAtOCAgICAgIC05MEUtMSAgLT4gMQorCisKKy0tIHRlc3RjYXNlcyB0aGF0IHN1YnRyYWN0IHRvIGxvdHMgb2YgemVyb3MgYXQgYm91bmRhcmllcyBbcGdyXQorZHFjbXM0NzMgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMDAwMEUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgLT4gMAorZHFjbXM0NzQgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMDAwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNtczQ3NSBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMEUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgLT4gMAorZHFjbXM0NzYgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwMEUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgLT4gMAorZHFjbXM0NzcgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMDAwRS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNtczQ3OCBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMEUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgLT4gMAorZHFjbXM0NzkgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwMEUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgLT4gMAorZHFjbXM0ODAgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MDAwRSs4OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RSs4OSAtPiAwCitkcWNtczQ4MSBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMEUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgLT4gMAorZHFjbXM0ODIgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2MEUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgLT4gMAorZHFjbXM0ODMgY29tcGFyZXNpZyAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAxMjMuOTk5OTk5OTk5OTk5OTk5OTk5NDU2RS04OSAtPiAwCitkcWNtczQ4NyBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMDAwRSs4OSAtPiAwCitkcWNtczQ4OCBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwMDBFLTg5IC0+IDAKK2RxY21zNDg5IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwMDAwRSs4OSAtPiAwCitkcWNtczQ5MCBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDAwRS04OSAtPiAwCitkcWNtczQ5MSBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwMDBFKzg5IC0+IDAKK2RxY21zNDkyIGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUtODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwMDAwRS04OSAtPiAwCitkcWNtczQ5MyBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDAwRSs4OSAtPiAwCitkcWNtczQ5NCBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwMDBFLTg5IC0+IDAKK2RxY21zNDk1IGNvbXBhcmVzaWcgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NkUrODkgMTIzLjk5OTk5OTk5OTk5OTk5OTk5OTQ1NjAwRSs4OSAtPiAwCitkcWNtczQ5NiBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFLTg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTYwRS04OSAtPiAwCitkcWNtczQ5NyBjb21wYXJlc2lnIDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IDEyMy45OTk5OTk5OTk5OTk5OTk5OTk0NTZFKzg5IC0+IDAKKworLS0gd2lkZS1yYW5naW5nLCBhcm91bmQgcHJlY2lzaW9uOyBzaWducyBlcXVhbAorZHFjbXM1MDAgY29tcGFyZXNpZyAgICAxICAgICAxRS0xNSAgICAtPiAxCitkcWNtczUwMSBjb21wYXJlc2lnICAgIDEgICAgIDFFLTE0ICAgIC0+IDEKK2RxY21zNTAyIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTMgICAgLT4gMQorZHFjbXM1MDMgY29tcGFyZXNpZyAgICAxICAgICAxRS0xMiAgICAtPiAxCitkcWNtczUwNCBjb21wYXJlc2lnICAgIDEgICAgIDFFLTExICAgIC0+IDEKK2RxY21zNTA1IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMTAgICAgLT4gMQorZHFjbXM1MDYgY29tcGFyZXNpZyAgICAxICAgICAxRS05ICAgICAtPiAxCitkcWNtczUwNyBjb21wYXJlc2lnICAgIDEgICAgIDFFLTggICAgIC0+IDEKK2RxY21zNTA4IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtNyAgICAgLT4gMQorZHFjbXM1MDkgY29tcGFyZXNpZyAgICAxICAgICAxRS02ICAgICAtPiAxCitkcWNtczUxMCBjb21wYXJlc2lnICAgIDEgICAgIDFFLTUgICAgIC0+IDEKK2RxY21zNTExIGNvbXBhcmVzaWcgICAgMSAgICAgMUUtNCAgICAgLT4gMQorZHFjbXM1MTIgY29tcGFyZXNpZyAgICAxICAgICAxRS0zICAgICAtPiAxCitkcWNtczUxMyBjb21wYXJlc2lnICAgIDEgICAgIDFFLTIgICAgIC0+IDEKK2RxY21zNTE0IGNvbXBhcmVzaWcgICAgMSAgICAgMUUtMSAgICAgLT4gMQorZHFjbXM1MTUgY29tcGFyZXNpZyAgICAxICAgICAxRS0wICAgICAtPiAwCitkcWNtczUxNiBjb21wYXJlc2lnICAgIDEgICAgIDFFKzEgICAgIC0+IC0xCitkcWNtczUxNyBjb21wYXJlc2lnICAgIDEgICAgIDFFKzIgICAgIC0+IC0xCitkcWNtczUxOCBjb21wYXJlc2lnICAgIDEgICAgIDFFKzMgICAgIC0+IC0xCitkcWNtczUxOSBjb21wYXJlc2lnICAgIDEgICAgIDFFKzQgICAgIC0+IC0xCitkcWNtczUyMSBjb21wYXJlc2lnICAgIDEgICAgIDFFKzUgICAgIC0+IC0xCitkcWNtczUyMiBjb21wYXJlc2lnICAgIDEgICAgIDFFKzYgICAgIC0+IC0xCitkcWNtczUyMyBjb21wYXJlc2lnICAgIDEgICAgIDFFKzcgICAgIC0+IC0xCitkcWNtczUyNCBjb21wYXJlc2lnICAgIDEgICAgIDFFKzggICAgIC0+IC0xCitkcWNtczUyNSBjb21wYXJlc2lnICAgIDEgICAgIDFFKzkgICAgIC0+IC0xCitkcWNtczUyNiBjb21wYXJlc2lnICAgIDEgICAgIDFFKzEwICAgIC0+IC0xCitkcWNtczUyNyBjb21wYXJlc2lnICAgIDEgICAgIDFFKzExICAgIC0+IC0xCitkcWNtczUyOCBjb21wYXJlc2lnICAgIDEgICAgIDFFKzEyICAgIC0+IC0xCitkcWNtczUyOSBjb21wYXJlc2lnICAgIDEgICAgIDFFKzEzICAgIC0+IC0xCitkcWNtczUzMCBjb21wYXJlc2lnICAgIDEgICAgIDFFKzE0ICAgIC0+IC0xCitkcWNtczUzMSBjb21wYXJlc2lnICAgIDEgICAgIDFFKzE1ICAgIC0+IC0xCistLSBMUiBzd2FwCitkcWNtczU0MCBjb21wYXJlc2lnICAgIDFFLTE1ICAxICAgICAgIC0+IC0xCitkcWNtczU0MSBjb21wYXJlc2lnICAgIDFFLTE0ICAxICAgICAgIC0+IC0xCitkcWNtczU0MiBjb21wYXJlc2lnICAgIDFFLTEzICAxICAgICAgIC0+IC0xCitkcWNtczU0MyBjb21wYXJlc2lnICAgIDFFLTEyICAxICAgICAgIC0+IC0xCitkcWNtczU0NCBjb21wYXJlc2lnICAgIDFFLTExICAxICAgICAgIC0+IC0xCitkcWNtczU0NSBjb21wYXJlc2lnICAgIDFFLTEwICAxICAgICAgIC0+IC0xCitkcWNtczU0NiBjb21wYXJlc2lnICAgIDFFLTkgICAxICAgICAgIC0+IC0xCitkcWNtczU0NyBjb21wYXJlc2lnICAgIDFFLTggICAxICAgICAgIC0+IC0xCitkcWNtczU0OCBjb21wYXJlc2lnICAgIDFFLTcgICAxICAgICAgIC0+IC0xCitkcWNtczU0OSBjb21wYXJlc2lnICAgIDFFLTYgICAxICAgICAgIC0+IC0xCitkcWNtczU1MCBjb21wYXJlc2lnICAgIDFFLTUgICAxICAgICAgIC0+IC0xCitkcWNtczU1MSBjb21wYXJlc2lnICAgIDFFLTQgICAxICAgICAgIC0+IC0xCitkcWNtczU1MiBjb21wYXJlc2lnICAgIDFFLTMgICAxICAgICAgIC0+IC0xCitkcWNtczU1MyBjb21wYXJlc2lnICAgIDFFLTIgICAxICAgICAgIC0+IC0xCitkcWNtczU1NCBjb21wYXJlc2lnICAgIDFFLTEgICAxICAgICAgIC0+IC0xCitkcWNtczU1NSBjb21wYXJlc2lnICAgIDFFLTAgICAxICAgICAgIC0+ICAwCitkcWNtczU1NiBjb21wYXJlc2lnICAgIDFFKzEgICAxICAgICAgIC0+ICAxCitkcWNtczU1NyBjb21wYXJlc2lnICAgIDFFKzIgICAxICAgICAgIC0+ICAxCitkcWNtczU1OCBjb21wYXJlc2lnICAgIDFFKzMgICAxICAgICAgIC0+ICAxCitkcWNtczU1OSBjb21wYXJlc2lnICAgIDFFKzQgICAxICAgICAgIC0+ICAxCitkcWNtczU2MSBjb21wYXJlc2lnICAgIDFFKzUgICAxICAgICAgIC0+ICAxCitkcWNtczU2MiBjb21wYXJlc2lnICAgIDFFKzYgICAxICAgICAgIC0+ICAxCitkcWNtczU2MyBjb21wYXJlc2lnICAgIDFFKzcgICAxICAgICAgIC0+ICAxCitkcWNtczU2NCBjb21wYXJlc2lnICAgIDFFKzggICAxICAgICAgIC0+ICAxCitkcWNtczU2NSBjb21wYXJlc2lnICAgIDFFKzkgICAxICAgICAgIC0+ICAxCitkcWNtczU2NiBjb21wYXJlc2lnICAgIDFFKzEwICAxICAgICAgIC0+ICAxCitkcWNtczU2NyBjb21wYXJlc2lnICAgIDFFKzExICAxICAgICAgIC0+ICAxCitkcWNtczU2OCBjb21wYXJlc2lnICAgIDFFKzEyICAxICAgICAgIC0+ICAxCitkcWNtczU2OSBjb21wYXJlc2lnICAgIDFFKzEzICAxICAgICAgIC0+ICAxCitkcWNtczU3MCBjb21wYXJlc2lnICAgIDFFKzE0ICAxICAgICAgIC0+ICAxCitkcWNtczU3MSBjb21wYXJlc2lnICAgIDFFKzE1ICAxICAgICAgIC0+ICAxCistLSBzaW1pbGFyIHdpdGggYSB1c2VmdWwgY29lZmZpY2llbnQsIG9uZSBzaWRlIG9ubHkKK2RxY21zNTgwIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNSAgICAtPiAxCitkcWNtczU4MSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTQgICAgLT4gMQorZHFjbXM1ODIgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEzICAgIC0+IDEKK2RxY21zNTgzIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMiAgICAtPiAxCitkcWNtczU4NCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTEgICAgLT4gMQorZHFjbXM1ODUgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTEwICAgIC0+IDEKK2RxY21zNTg2IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS05ICAgICAtPiAxCitkcWNtczU4NyBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOCAgICAgLT4gMQorZHFjbXM1ODggY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTcgICAgIC0+IDEKK2RxY21zNTg5IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS02ICAgICAtPiAtMQorZHFjbXM1OTAgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTUgICAgIC0+IC0xCitkcWNtczU5MSBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNCAgICAgLT4gLTEKK2RxY21zNTkyIGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0zICAgICAtPiAtMQorZHFjbXM1OTMgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTIgICAgIC0+IC0xCitkcWNtczU5NCBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMSAgICAgLT4gLTEKK2RxY21zNTk1IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0wICAgICAtPiAtMQorZHFjbXM1OTYgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzEgICAgIC0+IC0xCitkcWNtczU5NyBjb21wYXJlc2lnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMiAgICAgLT4gLTEKK2RxY21zNTk4IGNvbXBhcmVzaWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSszICAgICAtPiAtMQorZHFjbXM1OTkgY29tcGFyZXNpZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzQgICAgIC0+IC0xCisKKy0tIGNoZWNrIHNvbWUgdW5pdC15IHRyYXBzCitkcWNtczYwMCBjb21wYXJlc2lnICAgMTIgICAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwMSBjb21wYXJlc2lnICAgMTIuMCAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwMiBjb21wYXJlc2lnICAgMTIuMDAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwMyBjb21wYXJlc2lnICAgMTIuMDAwICAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwNCBjb21wYXJlc2lnICAgMTIuMDAwMCAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwNSBjb21wYXJlc2lnICAgMTIuMDAwMDAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwNiBjb21wYXJlc2lnICAgMTIuMDAwMDAwICAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwNyBjb21wYXJlc2lnICAgMTIuMDAwMDAwMCAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwOCBjb21wYXJlc2lnICAgMTIuMDAwMDAwMDAgICAxMi4yMzQ1IC0+IC0xCitkcWNtczYwOSBjb21wYXJlc2lnICAgMTIuMDAwMDAwMDAwICAxMi4yMzQ1IC0+IC0xCitkcWNtczYxMCBjb21wYXJlc2lnICAgMTIuMTIzNCAxMiAgICAgICAgICAgIC0+ICAxCitkcWNtczYxMSBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wICAgICAgICAgIC0+ICAxCitkcWNtczYxMiBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMCAgICAgICAgIC0+ICAxCitkcWNtczYxMyBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMDAgICAgICAgIC0+ICAxCitkcWNtczYxNCBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMDAwICAgICAgIC0+ICAxCitkcWNtczYxNSBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMDAwMCAgICAgIC0+ICAxCitkcWNtczYxNiBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMDAwMDAgICAgIC0+ICAxCitkcWNtczYxNyBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMDAwMDAwICAgIC0+ICAxCitkcWNtczYxOCBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMDAwMDAwMCAgIC0+ICAxCitkcWNtczYxOSBjb21wYXJlc2lnICAgMTIuMTIzNCAxMi4wMDAwMDAwMDAgIC0+ICAxCitkcWNtczYyMCBjb21wYXJlc2lnICAtMTIgICAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyMSBjb21wYXJlc2lnICAtMTIuMCAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyMiBjb21wYXJlc2lnICAtMTIuMDAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyMyBjb21wYXJlc2lnICAtMTIuMDAwICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyNCBjb21wYXJlc2lnICAtMTIuMDAwMCAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyNSBjb21wYXJlc2lnICAtMTIuMDAwMDAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyNiBjb21wYXJlc2lnICAtMTIuMDAwMDAwICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyNyBjb21wYXJlc2lnICAtMTIuMDAwMDAwMCAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyOCBjb21wYXJlc2lnICAtMTIuMDAwMDAwMDAgIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYyOSBjb21wYXJlc2lnICAtMTIuMDAwMDAwMDAwIC0xMi4yMzQ1IC0+ICAxCitkcWNtczYzMCBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIgICAgICAgICAgIC0+IC0xCitkcWNtczYzMSBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMCAgICAgICAgIC0+IC0xCitkcWNtczYzMiBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAgICAgICAgIC0+IC0xCitkcWNtczYzMyBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAwICAgICAgIC0+IC0xCitkcWNtczYzNCBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAwMCAgICAgIC0+IC0xCitkcWNtczYzNSBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAwMDAgICAgIC0+IC0xCitkcWNtczYzNiBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAwMDAwICAgIC0+IC0xCitkcWNtczYzNyBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAwMDAwMCAgIC0+IC0xCitkcWNtczYzOCBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAgIC0+IC0xCitkcWNtczYzOSBjb21wYXJlc2lnICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAwIC0+IC0xCisKKy0tIGV4dGVuZGVkIHplcm9zCitkcWNtczY0MCBjb21wYXJlc2lnICAgMCAgICAgMCAgIC0+IDAKK2RxY21zNjQxIGNvbXBhcmVzaWcgICAwICAgIC0wICAgLT4gMAorZHFjbXM2NDIgY29tcGFyZXNpZyAgIDAgICAgLTAuMCAtPiAwCitkcWNtczY0MyBjb21wYXJlc2lnICAgMCAgICAgMC4wIC0+IDAKK2RxY21zNjQ0IGNvbXBhcmVzaWcgIC0wICAgICAwICAgLT4gMAorZHFjbXM2NDUgY29tcGFyZXNpZyAgLTAgICAgLTAgICAtPiAwCitkcWNtczY0NiBjb21wYXJlc2lnICAtMCAgICAtMC4wIC0+IDAKK2RxY21zNjQ3IGNvbXBhcmVzaWcgIC0wICAgICAwLjAgLT4gMAorZHFjbXM2NDggY29tcGFyZXNpZyAgIDAuMCAgIDAgICAtPiAwCitkcWNtczY0OSBjb21wYXJlc2lnICAgMC4wICAtMCAgIC0+IDAKK2RxY21zNjUwIGNvbXBhcmVzaWcgICAwLjAgIC0wLjAgLT4gMAorZHFjbXM2NTEgY29tcGFyZXNpZyAgIDAuMCAgIDAuMCAtPiAwCitkcWNtczY1MiBjb21wYXJlc2lnICAtMC4wICAgMCAgIC0+IDAKK2RxY21zNjUzIGNvbXBhcmVzaWcgIC0wLjAgIC0wICAgLT4gMAorZHFjbXM2NTQgY29tcGFyZXNpZyAgLTAuMCAgLTAuMCAtPiAwCitkcWNtczY1NSBjb21wYXJlc2lnICAtMC4wICAgMC4wIC0+IDAKKworZHFjbXM2NTYgY29tcGFyZXNpZyAgLTBFMSAgIDAuMCAtPiAwCitkcWNtczY1NyBjb21wYXJlc2lnICAtMEUyICAgMC4wIC0+IDAKK2RxY21zNjU4IGNvbXBhcmVzaWcgICAwRTEgICAwLjAgLT4gMAorZHFjbXM2NTkgY29tcGFyZXNpZyAgIDBFMiAgIDAuMCAtPiAwCitkcWNtczY2MCBjb21wYXJlc2lnICAtMEUxICAgMCAgIC0+IDAKK2RxY21zNjYxIGNvbXBhcmVzaWcgIC0wRTIgICAwICAgLT4gMAorZHFjbXM2NjIgY29tcGFyZXNpZyAgIDBFMSAgIDAgICAtPiAwCitkcWNtczY2MyBjb21wYXJlc2lnICAgMEUyICAgMCAgIC0+IDAKK2RxY21zNjY0IGNvbXBhcmVzaWcgIC0wRTEgIC0wRTEgLT4gMAorZHFjbXM2NjUgY29tcGFyZXNpZyAgLTBFMiAgLTBFMSAtPiAwCitkcWNtczY2NiBjb21wYXJlc2lnICAgMEUxICAtMEUxIC0+IDAKK2RxY21zNjY3IGNvbXBhcmVzaWcgICAwRTIgIC0wRTEgLT4gMAorZHFjbXM2NjggY29tcGFyZXNpZyAgLTBFMSAgLTBFMiAtPiAwCitkcWNtczY2OSBjb21wYXJlc2lnICAtMEUyICAtMEUyIC0+IDAKK2RxY21zNjcwIGNvbXBhcmVzaWcgICAwRTEgIC0wRTIgLT4gMAorZHFjbXM2NzEgY29tcGFyZXNpZyAgIDBFMiAgLTBFMiAtPiAwCitkcWNtczY3MiBjb21wYXJlc2lnICAtMEUxICAgMEUxIC0+IDAKK2RxY21zNjczIGNvbXBhcmVzaWcgIC0wRTIgICAwRTEgLT4gMAorZHFjbXM2NzQgY29tcGFyZXNpZyAgIDBFMSAgIDBFMSAtPiAwCitkcWNtczY3NSBjb21wYXJlc2lnICAgMEUyICAgMEUxIC0+IDAKK2RxY21zNjc2IGNvbXBhcmVzaWcgIC0wRTEgICAwRTIgLT4gMAorZHFjbXM2NzcgY29tcGFyZXNpZyAgLTBFMiAgIDBFMiAtPiAwCitkcWNtczY3OCBjb21wYXJlc2lnICAgMEUxICAgMEUyIC0+IDAKK2RxY21zNjc5IGNvbXBhcmVzaWcgICAwRTIgICAwRTIgLT4gMAorCistLSB0cmFpbGluZyB6ZXJvczsgdW5pdC15CitkcWNtczY4MCBjb21wYXJlc2lnICAgMTIgICAgMTIgICAgICAgICAgIC0+IDAKK2RxY21zNjgxIGNvbXBhcmVzaWcgICAxMiAgICAxMi4wICAgICAgICAgLT4gMAorZHFjbXM2ODIgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwICAgICAgICAtPiAwCitkcWNtczY4MyBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwICAgICAgIC0+IDAKK2RxY21zNjg0IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwICAgICAgLT4gMAorZHFjbXM2ODUgY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAwICAgICAtPiAwCitkcWNtczY4NiBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMDAwICAgIC0+IDAKK2RxY21zNjg3IGNvbXBhcmVzaWcgICAxMiAgICAxMi4wMDAwMDAwICAgLT4gMAorZHFjbXM2ODggY29tcGFyZXNpZyAgIDEyICAgIDEyLjAwMDAwMDAwICAtPiAwCitkcWNtczY4OSBjb21wYXJlc2lnICAgMTIgICAgMTIuMDAwMDAwMDAwIC0+IDAKK2RxY21zNjkwIGNvbXBhcmVzaWcgICAxMiAgICAgICAgICAgICAgMTIgLT4gMAorZHFjbXM2OTEgY29tcGFyZXNpZyAgIDEyLjAgICAgICAgICAgICAxMiAtPiAwCitkcWNtczY5MiBjb21wYXJlc2lnICAgMTIuMDAgICAgICAgICAgIDEyIC0+IDAKK2RxY21zNjkzIGNvbXBhcmVzaWcgICAxMi4wMDAgICAgICAgICAgMTIgLT4gMAorZHFjbXM2OTQgY29tcGFyZXNpZyAgIDEyLjAwMDAgICAgICAgICAxMiAtPiAwCitkcWNtczY5NSBjb21wYXJlc2lnICAgMTIuMDAwMDAgICAgICAgIDEyIC0+IDAKK2RxY21zNjk2IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAgICAgICAgMTIgLT4gMAorZHFjbXM2OTcgY29tcGFyZXNpZyAgIDEyLjAwMDAwMDAgICAgICAxMiAtPiAwCitkcWNtczY5OCBjb21wYXJlc2lnICAgMTIuMDAwMDAwMDAgICAgIDEyIC0+IDAKK2RxY21zNjk5IGNvbXBhcmVzaWcgICAxMi4wMDAwMDAwMDAgICAgMTIgLT4gMAorCistLSBmaXJzdCwgc2Vjb25kLCAmIGxhc3QgZGlnaXQKK2RxY21zNzAwIGNvbXBhcmVzaWcgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTUgLT4gMQorZHFjbXM3MDEgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAwCitkcWNtczcwMiBjb21wYXJlc2lnICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU3IC0+IC0xCitkcWNtczcwMyBjb21wYXJlc2lnICAgMTIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAwMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IDEKK2RxY21zNzA0IGNvbXBhcmVzaWcgICAxMjM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gMAorZHFjbXM3MDUgY29tcGFyZXNpZyAgIDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMjIzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAtMQorZHFjbXM3MDYgY29tcGFyZXNpZyAgIDExMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgMTAzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAtPiAxCitkcWNtczcwNyBjb21wYXJlc2lnICAgMTEzNDU2Nzg5OTk5OTk5OTk5OTk5OTk5OTk5MDEyMzQ1NiAxMTM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IC0+IDAKK2RxY21zNzA4IGNvbXBhcmVzaWcgICAxMTM0NTY3ODk5OTk5OTk5OTk5OTk5OTk5OTkwMTIzNDU2IDEyMzQ1Njc4OTk5OTk5OTk5OTk5OTk5OTk5OTAxMjM0NTYgLT4gLTEKKworLS0gbWlzY2VsbGFuZW91cworZHFjbXM3MjEgY29tcGFyZXNpZyAxMjM0NTY3ODAwMCAxIC0+IDEKK2RxY21zNzIyIGNvbXBhcmVzaWcgMSAxMjM0NTY3ODAwMCAtPiAtMQorZHFjbXM3MjMgY29tcGFyZXNpZyAxMjM0NTY3ODAwICAxIC0+IDEKK2RxY21zNzI0IGNvbXBhcmVzaWcgMSAxMjM0NTY3ODAwICAtPiAtMQorZHFjbXM3MjUgY29tcGFyZXNpZyAxMjM0NTY3ODkwICAxIC0+IDEKK2RxY21zNzI2IGNvbXBhcmVzaWcgMSAxMjM0NTY3ODkwICAtPiAtMQorZHFjbXM3MjcgY29tcGFyZXNpZyAxMjM0NTY3ODkxICAxIC0+IDEKK2RxY21zNzI4IGNvbXBhcmVzaWcgMSAxMjM0NTY3ODkxICAtPiAtMQorZHFjbXM3MjkgY29tcGFyZXNpZyAxMjM0NTY3ODkwMSAxIC0+IDEKK2RxY21zNzMwIGNvbXBhcmVzaWcgMSAxMjM0NTY3ODkwMSAtPiAtMQorZHFjbXM3MzEgY29tcGFyZXNpZyAxMjM0NTY3ODk2ICAxIC0+IDEKK2RxY21zNzMyIGNvbXBhcmVzaWcgMSAxMjM0NTY3ODk2ICAtPiAtMQorCistLSByZXNpZHVlIGNhc2VzIGF0IGxvd2VyIHByZWNpc2lvbgorZHFjbXM3NDAgY29tcGFyZXNpZyAgMSAgMC45OTk5OTk5ICAtPiAxCitkcWNtczc0MSBjb21wYXJlc2lnICAxICAwLjk5OTk5OSAgIC0+IDEKK2RxY21zNzQyIGNvbXBhcmVzaWcgIDEgIDAuOTk5OTkgICAgLT4gMQorZHFjbXM3NDMgY29tcGFyZXNpZyAgMSAgMS4wMDAwICAgICAtPiAwCitkcWNtczc0NCBjb21wYXJlc2lnICAxICAxLjAwMDAxICAgIC0+IC0xCitkcWNtczc0NSBjb21wYXJlc2lnICAxICAxLjAwMDAwMSAgIC0+IC0xCitkcWNtczc0NiBjb21wYXJlc2lnICAxICAxLjAwMDAwMDEgIC0+IC0xCitkcWNtczc1MCBjb21wYXJlc2lnICAwLjk5OTk5OTkgIDEgIC0+IC0xCitkcWNtczc1MSBjb21wYXJlc2lnICAwLjk5OTk5OSAgIDEgIC0+IC0xCitkcWNtczc1MiBjb21wYXJlc2lnICAwLjk5OTk5ICAgIDEgIC0+IC0xCitkcWNtczc1MyBjb21wYXJlc2lnICAxLjAwMDAgICAgIDEgIC0+IDAKK2RxY21zNzU0IGNvbXBhcmVzaWcgIDEuMDAwMDEgICAgMSAgLT4gMQorZHFjbXM3NTUgY29tcGFyZXNpZyAgMS4wMDAwMDEgICAxICAtPiAxCitkcWNtczc1NiBjb21wYXJlc2lnICAxLjAwMDAwMDEgIDEgIC0+IDEKKworLS0gU3BlY2lhbHMKK2RxY21zNzgwIGNvbXBhcmVzaWcgIEluZiAgLUluZiAgIC0+ICAxCitkcWNtczc4MSBjb21wYXJlc2lnICBJbmYgIC0xMDAwICAtPiAgMQorZHFjbXM3ODIgY29tcGFyZXNpZyAgSW5mICAtMSAgICAgLT4gIDEKK2RxY21zNzgzIGNvbXBhcmVzaWcgIEluZiAgLTAgICAgIC0+ICAxCitkcWNtczc4NCBjb21wYXJlc2lnICBJbmYgICAwICAgICAtPiAgMQorZHFjbXM3ODUgY29tcGFyZXNpZyAgSW5mICAgMSAgICAgLT4gIDEKK2RxY21zNzg2IGNvbXBhcmVzaWcgIEluZiAgIDEwMDAgIC0+ICAxCitkcWNtczc4NyBjb21wYXJlc2lnICBJbmYgICBJbmYgICAtPiAgMAorZHFjbXM3ODggY29tcGFyZXNpZyAtMTAwMCAgSW5mICAgLT4gLTEKK2RxY21zNzg5IGNvbXBhcmVzaWcgLUluZiAgIEluZiAgIC0+IC0xCitkcWNtczc5MCBjb21wYXJlc2lnIC0xICAgICBJbmYgICAtPiAtMQorZHFjbXM3OTEgY29tcGFyZXNpZyAtMCAgICAgSW5mICAgLT4gLTEKK2RxY21zNzkyIGNvbXBhcmVzaWcgIDAgICAgIEluZiAgIC0+IC0xCitkcWNtczc5MyBjb21wYXJlc2lnICAxICAgICBJbmYgICAtPiAtMQorZHFjbXM3OTQgY29tcGFyZXNpZyAgMTAwMCAgSW5mICAgLT4gLTEKK2RxY21zNzk1IGNvbXBhcmVzaWcgIEluZiAgIEluZiAgIC0+ICAwCisKK2RxY21zODAwIGNvbXBhcmVzaWcgLUluZiAgLUluZiAgIC0+ICAwCitkcWNtczgwMSBjb21wYXJlc2lnIC1JbmYgIC0xMDAwICAtPiAtMQorZHFjbXM4MDIgY29tcGFyZXNpZyAtSW5mICAtMSAgICAgLT4gLTEKK2RxY21zODAzIGNvbXBhcmVzaWcgLUluZiAgLTAgICAgIC0+IC0xCitkcWNtczgwNCBjb21wYXJlc2lnIC1JbmYgICAwICAgICAtPiAtMQorZHFjbXM4MDUgY29tcGFyZXNpZyAtSW5mICAgMSAgICAgLT4gLTEKK2RxY21zODA2IGNvbXBhcmVzaWcgLUluZiAgIDEwMDAgIC0+IC0xCitkcWNtczgwNyBjb21wYXJlc2lnIC1JbmYgICBJbmYgICAtPiAtMQorZHFjbXM4MDggY29tcGFyZXNpZyAtSW5mICAtSW5mICAgLT4gIDAKK2RxY21zODA5IGNvbXBhcmVzaWcgLTEwMDAgLUluZiAgIC0+ICAxCitkcWNtczgxMCBjb21wYXJlc2lnIC0xICAgIC1JbmYgICAtPiAgMQorZHFjbXM4MTEgY29tcGFyZXNpZyAtMCAgICAtSW5mICAgLT4gIDEKK2RxY21zODEyIGNvbXBhcmVzaWcgIDAgICAgLUluZiAgIC0+ICAxCitkcWNtczgxMyBjb21wYXJlc2lnICAxICAgIC1JbmYgICAtPiAgMQorZHFjbXM4MTQgY29tcGFyZXNpZyAgMTAwMCAtSW5mICAgLT4gIDEKK2RxY21zODE1IGNvbXBhcmVzaWcgIEluZiAgLUluZiAgIC0+ICAxCisKK2RxY21zODIxIGNvbXBhcmVzaWcgIE5hTiAtSW5mICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgyMiBjb21wYXJlc2lnICBOYU4gLTEwMDAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MjMgY29tcGFyZXNpZyAgTmFOIC0xICAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODI0IGNvbXBhcmVzaWcgIE5hTiAtMCAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgyNSBjb21wYXJlc2lnICBOYU4gIDAgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MjYgY29tcGFyZXNpZyAgTmFOICAxICAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODI3IGNvbXBhcmVzaWcgIE5hTiAgMTAwMCAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgyOCBjb21wYXJlc2lnICBOYU4gIEluZiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MjkgY29tcGFyZXNpZyAgTmFOICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODMwIGNvbXBhcmVzaWcgLUluZiAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgzMSBjb21wYXJlc2lnIC0xMDAwIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MzIgY29tcGFyZXNpZyAtMSAgICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODMzIGNvbXBhcmVzaWcgLTAgICAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgzNCBjb21wYXJlc2lnICAwICAgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MzUgY29tcGFyZXNpZyAgMSAgICBOYU4gICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODM2IGNvbXBhcmVzaWcgIDEwMDAgTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczgzNyBjb21wYXJlc2lnICBJbmYgIE5hTiAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4MzggY29tcGFyZXNpZyAtTmFOIC1OYU4gICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODM5IGNvbXBhcmVzaWcgK05hTiAtTmFOICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg0MCBjb21wYXJlc2lnIC1OYU4gK05hTiAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkcWNtczg0MSBjb21wYXJlc2lnICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NDIgY29tcGFyZXNpZyAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODQzIGNvbXBhcmVzaWcgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg0NCBjb21wYXJlc2lnICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NDUgY29tcGFyZXNpZyAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODQ2IGNvbXBhcmVzaWcgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg0NyBjb21wYXJlc2lnICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NDggY29tcGFyZXNpZyAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODQ5IGNvbXBhcmVzaWcgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg1MCBjb21wYXJlc2lnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NTEgY29tcGFyZXNpZyAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODUyIGNvbXBhcmVzaWcgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg1MyBjb21wYXJlc2lnIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NTQgY29tcGFyZXNpZyAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODU1IGNvbXBhcmVzaWcgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg1NiBjb21wYXJlc2lnICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NTcgY29tcGFyZXNpZyAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODU4IGNvbXBhcmVzaWcgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg1OSBjb21wYXJlc2lnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcWNtczg2MCBjb21wYXJlc2lnICBOYU45IC1JbmYgICAtPiAgTmFOOSAgICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NjEgY29tcGFyZXNpZyAgTmFOOCAgOTk5ICAgLT4gIE5hTjggICAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODYyIGNvbXBhcmVzaWcgIE5hTjc3IEluZiAgIC0+ICBOYU43NyAgIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg2MyBjb21wYXJlc2lnIC1OYU42NyBOYU41ICAtPiAtTmFONjcgICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NjQgY29tcGFyZXNpZyAtSW5mICAtTmFONCAgLT4gLU5hTjQgICAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODY1IGNvbXBhcmVzaWcgLTk5OSAgLU5hTjMzIC0+IC1OYU4zMyAgIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg2NiBjb21wYXJlc2lnICBJbmYgICBOYU4yICAtPiAgTmFOMiAgICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NjcgY29tcGFyZXNpZyAtTmFONDEgLU5hTjQyIC0+IC1OYU40MSAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODY4IGNvbXBhcmVzaWcgK05hTjQxIC1OYU40MiAtPiAgTmFONDEgIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg2OSBjb21wYXJlc2lnIC1OYU40MSArTmFONDIgLT4gLU5hTjQxICBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NzAgY29tcGFyZXNpZyArTmFONDEgK05hTjQyIC0+ICBOYU40MSAgSW52YWxpZF9vcGVyYXRpb24KKworZHFjbXM4NzEgY29tcGFyZXNpZyAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg3MiBjb21wYXJlc2lnICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODczIGNvbXBhcmVzaWcgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NzQgY29tcGFyZXNpZyAgc05hTjE2IHNOYU45NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg3NSBjb21wYXJlc2lnICBOYU44NSAgc05hTjgzICAtPiAgTmFOODMgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODc2IGNvbXBhcmVzaWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFjbXM4NzcgY29tcGFyZXNpZyAgMDg4ICAgIHNOYU44MSAgLT4gIE5hTjgxIEludmFsaWRfb3BlcmF0aW9uCitkcWNtczg3OCBjb21wYXJlc2lnICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxY21zODc5IGNvbXBhcmVzaWcgIE5hTiAgIC1zTmFOODkgIC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSB3aWRlIHJhbmdlCitkcWNtczg4MCBjb21wYXJlc2lnICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzYxNDQgLT4gLTEKK2RxY21zODgxIGNvbXBhcmVzaWcgOUUrNjE0NCArMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgMQorZHFjbXM4ODIgY29tcGFyZXNpZyArMC4xMDAgOUUtNjE0MyAgICAgICAgICAgICAgIC0+ICAxCitkcWNtczg4MyBjb21wYXJlc2lnIDlFLTYxNDMgKzAuMTAwICAgICAgICAgICAgICAgLT4gLTEKK2RxY21zODg1IGNvbXBhcmVzaWcgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrNjE0NCAtPiAtMQorZHFjbXM4ODYgY29tcGFyZXNpZyA5RSs2MTQ0IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICAxCitkcWNtczg4NyBjb21wYXJlc2lnIC0wLjEwMCA5RS02MTQzICAgICAgICAgICAgICAgLT4gLTEKK2RxY21zODg4IGNvbXBhcmVzaWcgOUUtNjE0MyAtMC4xMDAgICAgICAgICAgICAgICAtPiAgMQorCistLSBzaWducworZHFjbXM5MDEgY29tcGFyZXNpZyAgMWUrNzcgIDFlKzExIC0+ICAxCitkcWNtczkwMiBjb21wYXJlc2lnICAxZSs3NyAtMWUrMTEgLT4gIDEKK2RxY21zOTAzIGNvbXBhcmVzaWcgLTFlKzc3ICAxZSsxMSAtPiAtMQorZHFjbXM5MDQgY29tcGFyZXNpZyAtMWUrNzcgLTFlKzExIC0+IC0xCitkcWNtczkwNSBjb21wYXJlc2lnICAxZS03NyAgMWUtMTEgLT4gLTEKK2RxY21zOTA2IGNvbXBhcmVzaWcgIDFlLTc3IC0xZS0xMSAtPiAgMQorZHFjbXM5MDcgY29tcGFyZXNpZyAtMWUtNzcgIDFlLTExIC0+IC0xCitkcWNtczkwOCBjb21wYXJlc2lnIC0xZS03NyAtMWUtMTEgLT4gIDEKKworLS0gTnVsbCB0ZXN0cworZHFjbXM5OTAgY29tcGFyZXNpZyAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxY21zOTkxIGNvbXBhcmVzaWcgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29tcGFyZVRvdGFsLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29tcGFyZVRvdGFsLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3MDFjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb21wYXJlVG90YWwuZGVjVGVzdApAQCAtMCwwICsxLDcwNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUNvbXBhcmVUb3RhbC5kZWNUZXN0IC0tIGRlY1F1YWQgY29tcGFyaXNvbiB1c2luZyB0b3RhbCBvcmRlcmluZyAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE5vdGUgdGhhdCB3ZSBjYW5ub3QgYXNzdW1lIGFkZC9zdWJ0cmFjdCB0ZXN0cyBjb3ZlciBwYXRocyBhZGVxdWF0ZWx5LAorLS0gaGVyZSwgYmVjYXVzZSB0aGUgY29kZSBtaWdodCBiZSBxdWl0ZSBkaWZmZXJlbnQgKGNvbXBhcmlzb24gY2Fubm90CistLSBvdmVyZmxvdyBvciB1bmRlcmZsb3csIHNvIGFjdHVhbCBzdWJ0cmFjdGlvbnMgYXJlIG5vdCBuZWNlc3NhcnkpLgorLS0gU2ltaWxhcmx5LCBjb21wYXJldG90YWwgd2lsbCBoYXZlIHNvbWUgcmFkaWNhbGx5IGRpZmZlcmVudCBwYXRocworLS0gdGhhbiBjb21wYXJlLgorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFjb3QwMDEgY29tcGFyZXRvdGFsICAtMiAgLTIgIC0+IDAKK2RxY290MDAyIGNvbXBhcmV0b3RhbCAgLTIgIC0xICAtPiAtMQorZHFjb3QwMDMgY29tcGFyZXRvdGFsICAtMiAgIDAgIC0+IC0xCitkcWNvdDAwNCBjb21wYXJldG90YWwgIC0yICAgMSAgLT4gLTEKK2RxY290MDA1IGNvbXBhcmV0b3RhbCAgLTIgICAyICAtPiAtMQorZHFjb3QwMDYgY29tcGFyZXRvdGFsICAtMSAgLTIgIC0+IDEKK2RxY290MDA3IGNvbXBhcmV0b3RhbCAgLTEgIC0xICAtPiAwCitkcWNvdDAwOCBjb21wYXJldG90YWwgIC0xICAgMCAgLT4gLTEKK2RxY290MDA5IGNvbXBhcmV0b3RhbCAgLTEgICAxICAtPiAtMQorZHFjb3QwMTAgY29tcGFyZXRvdGFsICAtMSAgIDIgIC0+IC0xCitkcWNvdDAxMSBjb21wYXJldG90YWwgICAwICAtMiAgLT4gMQorZHFjb3QwMTIgY29tcGFyZXRvdGFsICAgMCAgLTEgIC0+IDEKK2RxY290MDEzIGNvbXBhcmV0b3RhbCAgIDAgICAwICAtPiAwCitkcWNvdDAxNCBjb21wYXJldG90YWwgICAwICAgMSAgLT4gLTEKK2RxY290MDE1IGNvbXBhcmV0b3RhbCAgIDAgICAyICAtPiAtMQorZHFjb3QwMTYgY29tcGFyZXRvdGFsICAgMSAgLTIgIC0+IDEKK2RxY290MDE3IGNvbXBhcmV0b3RhbCAgIDEgIC0xICAtPiAxCitkcWNvdDAxOCBjb21wYXJldG90YWwgICAxICAgMCAgLT4gMQorZHFjb3QwMTkgY29tcGFyZXRvdGFsICAgMSAgIDEgIC0+IDAKK2RxY290MDIwIGNvbXBhcmV0b3RhbCAgIDEgICAyICAtPiAtMQorZHFjb3QwMjEgY29tcGFyZXRvdGFsICAgMiAgLTIgIC0+IDEKK2RxY290MDIyIGNvbXBhcmV0b3RhbCAgIDIgIC0xICAtPiAxCitkcWNvdDAyMyBjb21wYXJldG90YWwgICAyICAgMCAgLT4gMQorZHFjb3QwMjUgY29tcGFyZXRvdGFsICAgMiAgIDEgIC0+IDEKK2RxY290MDI2IGNvbXBhcmV0b3RhbCAgIDIgICAyICAtPiAwCisKK2RxY290MDMxIGNvbXBhcmV0b3RhbCAgLTIwICAtMjAgIC0+IDAKK2RxY290MDMyIGNvbXBhcmV0b3RhbCAgLTIwICAtMTAgIC0+IC0xCitkcWNvdDAzMyBjb21wYXJldG90YWwgIC0yMCAgIDAwICAtPiAtMQorZHFjb3QwMzQgY29tcGFyZXRvdGFsICAtMjAgICAxMCAgLT4gLTEKK2RxY290MDM1IGNvbXBhcmV0b3RhbCAgLTIwICAgMjAgIC0+IC0xCitkcWNvdDAzNiBjb21wYXJldG90YWwgIC0xMCAgLTIwICAtPiAxCitkcWNvdDAzNyBjb21wYXJldG90YWwgIC0xMCAgLTEwICAtPiAwCitkcWNvdDAzOCBjb21wYXJldG90YWwgIC0xMCAgIDAwICAtPiAtMQorZHFjb3QwMzkgY29tcGFyZXRvdGFsICAtMTAgICAxMCAgLT4gLTEKK2RxY290MDQwIGNvbXBhcmV0b3RhbCAgLTEwICAgMjAgIC0+IC0xCitkcWNvdDA0MSBjb21wYXJldG90YWwgICAwMCAgLTIwICAtPiAxCitkcWNvdDA0MiBjb21wYXJldG90YWwgICAwMCAgLTEwICAtPiAxCitkcWNvdDA0MyBjb21wYXJldG90YWwgICAwMCAgIDAwICAtPiAwCitkcWNvdDA0NCBjb21wYXJldG90YWwgICAwMCAgIDEwICAtPiAtMQorZHFjb3QwNDUgY29tcGFyZXRvdGFsICAgMDAgICAyMCAgLT4gLTEKK2RxY290MDQ2IGNvbXBhcmV0b3RhbCAgIDEwICAtMjAgIC0+IDEKK2RxY290MDQ3IGNvbXBhcmV0b3RhbCAgIDEwICAtMTAgIC0+IDEKK2RxY290MDQ4IGNvbXBhcmV0b3RhbCAgIDEwICAgMDAgIC0+IDEKK2RxY290MDQ5IGNvbXBhcmV0b3RhbCAgIDEwICAgMTAgIC0+IDAKK2RxY290MDUwIGNvbXBhcmV0b3RhbCAgIDEwICAgMjAgIC0+IC0xCitkcWNvdDA1MSBjb21wYXJldG90YWwgICAyMCAgLTIwICAtPiAxCitkcWNvdDA1MiBjb21wYXJldG90YWwgICAyMCAgLTEwICAtPiAxCitkcWNvdDA1MyBjb21wYXJldG90YWwgICAyMCAgIDAwICAtPiAxCitkcWNvdDA1NSBjb21wYXJldG90YWwgICAyMCAgIDEwICAtPiAxCitkcWNvdDA1NiBjb21wYXJldG90YWwgICAyMCAgIDIwICAtPiAwCisKK2RxY290MDYxIGNvbXBhcmV0b3RhbCAgLTIuMCAgLTIuMCAgLT4gMAorZHFjb3QwNjIgY29tcGFyZXRvdGFsICAtMi4wICAtMS4wICAtPiAtMQorZHFjb3QwNjMgY29tcGFyZXRvdGFsICAtMi4wICAgMC4wICAtPiAtMQorZHFjb3QwNjQgY29tcGFyZXRvdGFsICAtMi4wICAgMS4wICAtPiAtMQorZHFjb3QwNjUgY29tcGFyZXRvdGFsICAtMi4wICAgMi4wICAtPiAtMQorZHFjb3QwNjYgY29tcGFyZXRvdGFsICAtMS4wICAtMi4wICAtPiAxCitkcWNvdDA2NyBjb21wYXJldG90YWwgIC0xLjAgIC0xLjAgIC0+IDAKK2RxY290MDY4IGNvbXBhcmV0b3RhbCAgLTEuMCAgIDAuMCAgLT4gLTEKK2RxY290MDY5IGNvbXBhcmV0b3RhbCAgLTEuMCAgIDEuMCAgLT4gLTEKK2RxY290MDcwIGNvbXBhcmV0b3RhbCAgLTEuMCAgIDIuMCAgLT4gLTEKK2RxY290MDcxIGNvbXBhcmV0b3RhbCAgIDAuMCAgLTIuMCAgLT4gMQorZHFjb3QwNzIgY29tcGFyZXRvdGFsICAgMC4wICAtMS4wICAtPiAxCitkcWNvdDA3MyBjb21wYXJldG90YWwgICAwLjAgICAwLjAgIC0+IDAKK2RxY290MDc0IGNvbXBhcmV0b3RhbCAgIDAuMCAgIDEuMCAgLT4gLTEKK2RxY290MDc1IGNvbXBhcmV0b3RhbCAgIDAuMCAgIDIuMCAgLT4gLTEKK2RxY290MDc2IGNvbXBhcmV0b3RhbCAgIDEuMCAgLTIuMCAgLT4gMQorZHFjb3QwNzcgY29tcGFyZXRvdGFsICAgMS4wICAtMS4wICAtPiAxCitkcWNvdDA3OCBjb21wYXJldG90YWwgICAxLjAgICAwLjAgIC0+IDEKK2RxY290MDc5IGNvbXBhcmV0b3RhbCAgIDEuMCAgIDEuMCAgLT4gMAorZHFjb3QwODAgY29tcGFyZXRvdGFsICAgMS4wICAgMi4wICAtPiAtMQorZHFjb3QwODEgY29tcGFyZXRvdGFsICAgMi4wICAtMi4wICAtPiAxCitkcWNvdDA4MiBjb21wYXJldG90YWwgICAyLjAgIC0xLjAgIC0+IDEKK2RxY290MDgzIGNvbXBhcmV0b3RhbCAgIDIuMCAgIDAuMCAgLT4gMQorZHFjb3QwODUgY29tcGFyZXRvdGFsICAgMi4wICAgMS4wICAtPiAxCitkcWNvdDA4NiBjb21wYXJldG90YWwgICAyLjAgICAyLjAgIC0+IDAKKworLS0gbm93IHNvbWUgY2FzZXMgd2hpY2ggbWlnaHQgb3ZlcmZsb3cgaWYgc3VidHJhY3Qgd2VyZSB1c2VkCitkcWNvdDA5MCBjb21wYXJldG90YWwgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gMAorZHFjb3QwOTEgY29tcGFyZXRvdGFsIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+IC0xCitkcWNvdDA5MiBjb21wYXJldG90YWwgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gMQorZHFjb3QwOTMgY29tcGFyZXRvdGFsIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDAKKworLS0gc29tZSBkaWZmZXJpbmcgbGVuZ3RoL2V4cG9uZW50IGNhc2VzCistLSBpbiB0aGlzIGZpcnN0IGdyb3VwLCBjb21wYXJlIHdvdWxkIGNvbXBhcmUgYWxsIGVxdWFsCitkcWNvdDEwMCBjb21wYXJldG90YWwgICA3LjAgICAgNy4wICAgIC0+IDAKK2RxY290MTAxIGNvbXBhcmV0b3RhbCAgIDcuMCAgICA3ICAgICAgLT4gLTEKK2RxY290MTAyIGNvbXBhcmV0b3RhbCAgIDcgICAgICA3LjAgICAgLT4gMQorZHFjb3QxMDMgY29tcGFyZXRvdGFsICAgN0UrMCAgIDcuMCAgICAtPiAxCitkcWNvdDEwNCBjb21wYXJldG90YWwgICA3MEUtMSAgNy4wICAgIC0+IDAKK2RxY290MTA1IGNvbXBhcmV0b3RhbCAgIDAuN0UrMSA3ICAgICAgLT4gMAorZHFjb3QxMDYgY29tcGFyZXRvdGFsICAgNzBFLTEgIDcgICAgICAtPiAtMQorZHFjb3QxMDcgY29tcGFyZXRvdGFsICAgNy4wICAgIDdFKzAgICAtPiAtMQorZHFjb3QxMDggY29tcGFyZXRvdGFsICAgNy4wICAgIDcwRS0xICAtPiAwCitkcWNvdDEwOSBjb21wYXJldG90YWwgICA3ICAgICAgMC43RSsxIC0+IDAKK2RxY290MTEwIGNvbXBhcmV0b3RhbCAgIDcgICAgICA3MEUtMSAgLT4gMQorCitkcWNvdDEyMCBjb21wYXJldG90YWwgICA4LjAgICAgNy4wICAgIC0+IDEKK2RxY290MTIxIGNvbXBhcmV0b3RhbCAgIDguMCAgICA3ICAgICAgLT4gMQorZHFjb3QxMjIgY29tcGFyZXRvdGFsICAgOCAgICAgIDcuMCAgICAtPiAxCitkcWNvdDEyMyBjb21wYXJldG90YWwgICA4RSswICAgNy4wICAgIC0+IDEKK2RxY290MTI0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICA3LjAgICAgLT4gMQorZHFjb3QxMjUgY29tcGFyZXRvdGFsICAgMC44RSsxIDcgICAgICAtPiAxCitkcWNvdDEyNiBjb21wYXJldG90YWwgICA4MEUtMSAgNyAgICAgIC0+IDEKK2RxY290MTI3IGNvbXBhcmV0b3RhbCAgIDguMCAgICA3RSswICAgLT4gMQorZHFjb3QxMjggY29tcGFyZXRvdGFsICAgOC4wICAgIDcwRS0xICAtPiAxCitkcWNvdDEyOSBjb21wYXJldG90YWwgICA4ICAgICAgMC43RSsxICAtPiAxCitkcWNvdDEzMCBjb21wYXJldG90YWwgICA4ICAgICAgNzBFLTEgIC0+IDEKKworZHFjb3QxNDAgY29tcGFyZXRvdGFsICAgOC4wICAgIDkuMCAgICAtPiAtMQorZHFjb3QxNDEgY29tcGFyZXRvdGFsICAgOC4wICAgIDkgICAgICAtPiAtMQorZHFjb3QxNDIgY29tcGFyZXRvdGFsICAgOCAgICAgIDkuMCAgICAtPiAtMQorZHFjb3QxNDMgY29tcGFyZXRvdGFsICAgOEUrMCAgIDkuMCAgICAtPiAtMQorZHFjb3QxNDQgY29tcGFyZXRvdGFsICAgODBFLTEgIDkuMCAgICAtPiAtMQorZHFjb3QxNDUgY29tcGFyZXRvdGFsICAgMC44RSsxIDkgICAgICAtPiAtMQorZHFjb3QxNDYgY29tcGFyZXRvdGFsICAgODBFLTEgIDkgICAgICAtPiAtMQorZHFjb3QxNDcgY29tcGFyZXRvdGFsICAgOC4wICAgIDlFKzAgICAtPiAtMQorZHFjb3QxNDggY29tcGFyZXRvdGFsICAgOC4wICAgIDkwRS0xICAtPiAtMQorZHFjb3QxNDkgY29tcGFyZXRvdGFsICAgOCAgICAgIDAuOUUrMSAtPiAtMQorZHFjb3QxNTAgY29tcGFyZXRvdGFsICAgOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0rIC4uCitkcWNvdDIwMCBjb21wYXJldG90YWwgIC03LjAgICAgNy4wICAgIC0+IC0xCitkcWNvdDIwMSBjb21wYXJldG90YWwgIC03LjAgICAgNyAgICAgIC0+IC0xCitkcWNvdDIwMiBjb21wYXJldG90YWwgIC03ICAgICAgNy4wICAgIC0+IC0xCitkcWNvdDIwMyBjb21wYXJldG90YWwgIC03RSswICAgNy4wICAgIC0+IC0xCitkcWNvdDIwNCBjb21wYXJldG90YWwgIC03MEUtMSAgNy4wICAgIC0+IC0xCitkcWNvdDIwNSBjb21wYXJldG90YWwgIC0wLjdFKzEgNyAgICAgIC0+IC0xCitkcWNvdDIwNiBjb21wYXJldG90YWwgIC03MEUtMSAgNyAgICAgIC0+IC0xCitkcWNvdDIwNyBjb21wYXJldG90YWwgIC03LjAgICAgN0UrMCAgIC0+IC0xCitkcWNvdDIwOCBjb21wYXJldG90YWwgIC03LjAgICAgNzBFLTEgIC0+IC0xCitkcWNvdDIwOSBjb21wYXJldG90YWwgIC03ICAgICAgMC43RSsxIC0+IC0xCitkcWNvdDIxMCBjb21wYXJldG90YWwgIC03ICAgICAgNzBFLTEgIC0+IC0xCisKK2RxY290MjIwIGNvbXBhcmV0b3RhbCAgLTguMCAgICA3LjAgICAgLT4gLTEKK2RxY290MjIxIGNvbXBhcmV0b3RhbCAgLTguMCAgICA3ICAgICAgLT4gLTEKK2RxY290MjIyIGNvbXBhcmV0b3RhbCAgLTggICAgICA3LjAgICAgLT4gLTEKK2RxY290MjIzIGNvbXBhcmV0b3RhbCAgLThFKzAgICA3LjAgICAgLT4gLTEKK2RxY290MjI0IGNvbXBhcmV0b3RhbCAgLTgwRS0xICA3LjAgICAgLT4gLTEKK2RxY290MjI1IGNvbXBhcmV0b3RhbCAgLTAuOEUrMSA3ICAgICAgLT4gLTEKK2RxY290MjI2IGNvbXBhcmV0b3RhbCAgLTgwRS0xICA3ICAgICAgLT4gLTEKK2RxY290MjI3IGNvbXBhcmV0b3RhbCAgLTguMCAgICA3RSswICAgLT4gLTEKK2RxY290MjI4IGNvbXBhcmV0b3RhbCAgLTguMCAgICA3MEUtMSAgLT4gLTEKK2RxY290MjI5IGNvbXBhcmV0b3RhbCAgLTggICAgICAwLjdFKzEgLT4gLTEKK2RxY290MjMwIGNvbXBhcmV0b3RhbCAgLTggICAgICA3MEUtMSAgLT4gLTEKKworZHFjb3QyNDAgY29tcGFyZXRvdGFsICAtOC4wICAgIDkuMCAgICAtPiAtMQorZHFjb3QyNDEgY29tcGFyZXRvdGFsICAtOC4wICAgIDkgICAgICAtPiAtMQorZHFjb3QyNDIgY29tcGFyZXRvdGFsICAtOCAgICAgIDkuMCAgICAtPiAtMQorZHFjb3QyNDMgY29tcGFyZXRvdGFsICAtOEUrMCAgIDkuMCAgICAtPiAtMQorZHFjb3QyNDQgY29tcGFyZXRvdGFsICAtODBFLTEgIDkuMCAgICAtPiAtMQorZHFjb3QyNDUgY29tcGFyZXRvdGFsICAtMC44RSsxIDkgICAgICAtPiAtMQorZHFjb3QyNDYgY29tcGFyZXRvdGFsICAtODBFLTEgIDkgICAgICAtPiAtMQorZHFjb3QyNDcgY29tcGFyZXRvdGFsICAtOC4wICAgIDlFKzAgICAtPiAtMQorZHFjb3QyNDggY29tcGFyZXRvdGFsICAtOC4wICAgIDkwRS0xICAtPiAtMQorZHFjb3QyNDkgY29tcGFyZXRvdGFsICAtOCAgICAgIDAuOUUrMSAtPiAtMQorZHFjb3QyNTAgY29tcGFyZXRvdGFsICAtOCAgICAgIDkwRS0xICAtPiAtMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzICstIC4uCitkcWNvdDMwMCBjb21wYXJldG90YWwgICA3LjAgICAgLTcuMCAgICAtPiAxCitkcWNvdDMwMSBjb21wYXJldG90YWwgICA3LjAgICAgLTcgICAgICAtPiAxCitkcWNvdDMwMiBjb21wYXJldG90YWwgICA3ICAgICAgLTcuMCAgICAtPiAxCitkcWNvdDMwMyBjb21wYXJldG90YWwgICA3RSswICAgLTcuMCAgICAtPiAxCitkcWNvdDMwNCBjb21wYXJldG90YWwgICA3MEUtMSAgLTcuMCAgICAtPiAxCitkcWNvdDMwNSBjb21wYXJldG90YWwgICAuN0UrMSAgLTcgICAgICAtPiAxCitkcWNvdDMwNiBjb21wYXJldG90YWwgICA3MEUtMSAgLTcgICAgICAtPiAxCitkcWNvdDMwNyBjb21wYXJldG90YWwgICA3LjAgICAgLTdFKzAgICAtPiAxCitkcWNvdDMwOCBjb21wYXJldG90YWwgICA3LjAgICAgLTcwRS0xICAtPiAxCitkcWNvdDMwOSBjb21wYXJldG90YWwgICA3ICAgICAgLS43RSsxICAtPiAxCitkcWNvdDMxMCBjb21wYXJldG90YWwgICA3ICAgICAgLTcwRS0xICAtPiAxCisKK2RxY290MzIwIGNvbXBhcmV0b3RhbCAgIDguMCAgICAtNy4wICAgIC0+IDEKK2RxY290MzIxIGNvbXBhcmV0b3RhbCAgIDguMCAgICAtNyAgICAgIC0+IDEKK2RxY290MzIyIGNvbXBhcmV0b3RhbCAgIDggICAgICAtNy4wICAgIC0+IDEKK2RxY290MzIzIGNvbXBhcmV0b3RhbCAgIDhFKzAgICAtNy4wICAgIC0+IDEKK2RxY290MzI0IGNvbXBhcmV0b3RhbCAgIDgwRS0xICAtNy4wICAgIC0+IDEKK2RxY290MzI1IGNvbXBhcmV0b3RhbCAgIC44RSsxICAtNyAgICAgIC0+IDEKK2RxY290MzI2IGNvbXBhcmV0b3RhbCAgIDgwRS0xICAtNyAgICAgIC0+IDEKK2RxY290MzI3IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtN0UrMCAgIC0+IDEKK2RxY290MzI4IGNvbXBhcmV0b3RhbCAgIDguMCAgICAtNzBFLTEgIC0+IDEKK2RxY290MzI5IGNvbXBhcmV0b3RhbCAgIDggICAgICAtLjdFKzEgIC0+IDEKK2RxY290MzMwIGNvbXBhcmV0b3RhbCAgIDggICAgICAtNzBFLTEgIC0+IDEKKworZHFjb3QzNDAgY29tcGFyZXRvdGFsICAgOC4wICAgIC05LjAgICAgLT4gMQorZHFjb3QzNDEgY29tcGFyZXRvdGFsICAgOC4wICAgIC05ICAgICAgLT4gMQorZHFjb3QzNDIgY29tcGFyZXRvdGFsICAgOCAgICAgIC05LjAgICAgLT4gMQorZHFjb3QzNDMgY29tcGFyZXRvdGFsICAgOEUrMCAgIC05LjAgICAgLT4gMQorZHFjb3QzNDQgY29tcGFyZXRvdGFsICAgODBFLTEgIC05LjAgICAgLT4gMQorZHFjb3QzNDUgY29tcGFyZXRvdGFsICAgLjhFKzEgIC05ICAgICAgLT4gMQorZHFjb3QzNDYgY29tcGFyZXRvdGFsICAgODBFLTEgIC05ICAgICAgLT4gMQorZHFjb3QzNDcgY29tcGFyZXRvdGFsICAgOC4wICAgIC05RSswICAgLT4gMQorZHFjb3QzNDggY29tcGFyZXRvdGFsICAgOC4wICAgIC05MEUtMSAgLT4gMQorZHFjb3QzNDkgY29tcGFyZXRvdGFsICAgOCAgICAgIC0uOUUrMSAgLT4gMQorZHFjb3QzNTAgY29tcGFyZXRvdGFsICAgOCAgICAgIC05MEUtMSAgLT4gMQorCistLSBhbmQgYWdhaW4sIHdpdGggc2lnbiBjaGFuZ2VzIC0tIC4uCitkcWNvdDQwMCBjb21wYXJldG90YWwgICAtNy4wICAgIC03LjAgICAgLT4gMAorZHFjb3Q0MDEgY29tcGFyZXRvdGFsICAgLTcuMCAgICAtNyAgICAgIC0+IDEKK2RxY290NDAyIGNvbXBhcmV0b3RhbCAgIC03ICAgICAgLTcuMCAgICAtPiAtMQorZHFjb3Q0MDMgY29tcGFyZXRvdGFsICAgLTdFKzAgICAtNy4wICAgIC0+IC0xCitkcWNvdDQwNCBjb21wYXJldG90YWwgICAtNzBFLTEgIC03LjAgICAgLT4gMAorZHFjb3Q0MDUgY29tcGFyZXRvdGFsICAgLS43RSsxICAtNyAgICAgIC0+IDAKK2RxY290NDA2IGNvbXBhcmV0b3RhbCAgIC03MEUtMSAgLTcgICAgICAtPiAxCitkcWNvdDQwNyBjb21wYXJldG90YWwgICAtNy4wICAgIC03RSswICAgLT4gMQorZHFjb3Q0MDggY29tcGFyZXRvdGFsICAgLTcuMCAgICAtNzBFLTEgIC0+IDAKK2RxY290NDA5IGNvbXBhcmV0b3RhbCAgIC03ICAgICAgLS43RSsxICAtPiAwCitkcWNvdDQxMCBjb21wYXJldG90YWwgICAtNyAgICAgIC03MEUtMSAgLT4gLTEKKworZHFjb3Q0MjAgY29tcGFyZXRvdGFsICAgLTguMCAgICAtNy4wICAgIC0+IC0xCitkcWNvdDQyMSBjb21wYXJldG90YWwgICAtOC4wICAgIC03ICAgICAgLT4gLTEKK2RxY290NDIyIGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLTcuMCAgICAtPiAtMQorZHFjb3Q0MjMgY29tcGFyZXRvdGFsICAgLThFKzAgICAtNy4wICAgIC0+IC0xCitkcWNvdDQyNCBjb21wYXJldG90YWwgICAtODBFLTEgIC03LjAgICAgLT4gLTEKK2RxY290NDI1IGNvbXBhcmV0b3RhbCAgIC0uOEUrMSAgLTcgICAgICAtPiAtMQorZHFjb3Q0MjYgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtNyAgICAgIC0+IC0xCitkcWNvdDQyNyBjb21wYXJldG90YWwgICAtOC4wICAgIC03RSswICAgLT4gLTEKK2RxY290NDI4IGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTcwRS0xICAtPiAtMQorZHFjb3Q0MjkgY29tcGFyZXRvdGFsICAgLTggICAgICAtLjdFKzEgIC0+IC0xCitkcWNvdDQzMCBjb21wYXJldG90YWwgICAtOCAgICAgIC03MEUtMSAgLT4gLTEKKworZHFjb3Q0NDAgY29tcGFyZXRvdGFsICAgLTguMCAgICAtOS4wICAgIC0+IDEKK2RxY290NDQxIGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTkgICAgICAtPiAxCitkcWNvdDQ0MiBjb21wYXJldG90YWwgICAtOCAgICAgIC05LjAgICAgLT4gMQorZHFjb3Q0NDMgY29tcGFyZXRvdGFsICAgLThFKzAgICAtOS4wICAgIC0+IDEKK2RxY290NDQ0IGNvbXBhcmV0b3RhbCAgIC04MEUtMSAgLTkuMCAgICAtPiAxCitkcWNvdDQ0NSBjb21wYXJldG90YWwgICAtLjhFKzEgIC05ICAgICAgLT4gMQorZHFjb3Q0NDYgY29tcGFyZXRvdGFsICAgLTgwRS0xICAtOSAgICAgIC0+IDEKK2RxY290NDQ3IGNvbXBhcmV0b3RhbCAgIC04LjAgICAgLTlFKzAgICAtPiAxCitkcWNvdDQ0OCBjb21wYXJldG90YWwgICAtOC4wICAgIC05MEUtMSAgLT4gMQorZHFjb3Q0NDkgY29tcGFyZXRvdGFsICAgLTggICAgICAtLjlFKzEgIC0+IDEKK2RxY290NDUwIGNvbXBhcmV0b3RhbCAgIC04ICAgICAgLTkwRS0xICAtPiAxCisKKworLS0gdGVzdGNhc2VzIHRoYXQgc3VidHJhY3QgdG8gbG90cyBvZiB6ZXJvcyBhdCBib3VuZGFyaWVzIFtwZ3JdCitkcWNvdDQ3MyBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IC0xCitkcWNvdDQ3NCBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDAwMEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RxY290NDc1IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IC0xCitkcWNvdDQ3NiBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IC0xCitkcWNvdDQ3NyBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDAwMEUtODkgMTIzLjQ1NkUtODkgLT4gLTEKK2RxY290NDc4IGNvbXBhcmV0b3RhbCAxMjMuNDU2MDAwMDBFKzg5IDEyMy40NTZFKzg5IC0+IC0xCitkcWNvdDQ3OSBjb21wYXJldG90YWwgMTIzLjQ1NjAwMDBFLTg5IDEyMy40NTZFLTg5IC0+IC0xCitkcWNvdDQ4MCBjb21wYXJldG90YWwgMTIzLjQ1NjAwMEUrODkgMTIzLjQ1NkUrODkgLT4gLTEKK2RxY290NDgxIGNvbXBhcmV0b3RhbCAxMjMuNDU2MDBFLTg5IDEyMy40NTZFLTg5IC0+IC0xCitkcWNvdDQ4MiBjb21wYXJldG90YWwgMTIzLjQ1NjBFKzg5IDEyMy40NTZFKzg5IC0+IC0xCitkcWNvdDQ4MyBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NkUtODkgLT4gMAorZHFjb3Q0ODcgY29tcGFyZXRvdGFsIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDAwMDAwRSs4OSAtPiAxCitkcWNvdDQ4OCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMEUtODkgLT4gMQorZHFjb3Q0ODkgY29tcGFyZXRvdGFsIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwMDAwMEUrODkgLT4gMQorZHFjb3Q0OTAgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMDAwRS04OSAtPiAxCitkcWNvdDQ5MSBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMEUrODkgLT4gMQorZHFjb3Q0OTIgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwMDAwMEUtODkgLT4gMQorZHFjb3Q0OTMgY29tcGFyZXRvdGFsIDEyMy40NTZFKzg5IDEyMy40NTYwMDAwRSs4OSAtPiAxCitkcWNvdDQ5NCBjb21wYXJldG90YWwgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMEUtODkgLT4gMQorZHFjb3Q0OTUgY29tcGFyZXRvdGFsIDEyMy40NTZFKzg5IDEyMy40NTYwMEUrODkgLT4gMQorZHFjb3Q0OTYgY29tcGFyZXRvdGFsIDEyMy40NTZFLTg5IDEyMy40NTYwRS04OSAtPiAxCitkcWNvdDQ5NyBjb21wYXJldG90YWwgMTIzLjQ1NkUrODkgMTIzLjQ1NkUrODkgLT4gMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitkcWNvdDQ5OCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTcgICAgLT4gMQorZHFjb3Q0OTkgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTE2ICAgIC0+IDEKK2RxY290NTAwIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xNSAgICAtPiAxCitkcWNvdDUwMSBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTQgICAgLT4gMQorZHFjb3Q1MDIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEzICAgIC0+IDEKK2RxY290NTAzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0xMiAgICAtPiAxCitkcWNvdDUwNCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMTEgICAgLT4gMQorZHFjb3Q1MDUgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEwICAgIC0+IDEKK2RxY290NTA2IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS05ICAgICAtPiAxCitkcWNvdDUwNyBjb21wYXJldG90YWwgICAgMSAgICAgMUUtOCAgICAgLT4gMQorZHFjb3Q1MDggY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTcgICAgIC0+IDEKK2RxY290NTA5IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS02ICAgICAtPiAxCitkcWNvdDUxMCBjb21wYXJldG90YWwgICAgMSAgICAgMUUtNSAgICAgLT4gMQorZHFjb3Q1MTEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTQgICAgIC0+IDEKK2RxY290NTEyIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0zICAgICAtPiAxCitkcWNvdDUxMyBjb21wYXJldG90YWwgICAgMSAgICAgMUUtMiAgICAgLT4gMQorZHFjb3Q1MTQgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFLTEgICAgIC0+IDEKK2RxY290NTE1IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRS0wICAgICAtPiAwCitkcWNvdDUxNiBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMSAgICAgLT4gLTEKK2RxY290NTE3IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsyICAgICAtPiAtMQorZHFjb3Q1MTggY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzMgICAgIC0+IC0xCitkcWNvdDUxOSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrNCAgICAgLT4gLTEKK2RxY290NTIxIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs1ICAgICAtPiAtMQorZHFjb3Q1MjIgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzYgICAgIC0+IC0xCitkcWNvdDUyMyBjb21wYXJldG90YWwgICAgMSAgICAgMUUrNyAgICAgLT4gLTEKK2RxY290NTI0IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSs4ICAgICAtPiAtMQorZHFjb3Q1MjUgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzkgICAgIC0+IC0xCitkcWNvdDUyNiBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTAgICAgLT4gLTEKK2RxY290NTI3IGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxMSAgICAtPiAtMQorZHFjb3Q1MjggY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzEyICAgIC0+IC0xCitkcWNvdDUyOSBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTMgICAgLT4gLTEKK2RxY290NTMwIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxNCAgICAtPiAtMQorZHFjb3Q1MzEgY29tcGFyZXRvdGFsICAgIDEgICAgIDFFKzE1ICAgIC0+IC0xCitkcWNvdDUzMiBjb21wYXJldG90YWwgICAgMSAgICAgMUUrMTYgICAgLT4gLTEKK2RxY290NTMzIGNvbXBhcmV0b3RhbCAgICAxICAgICAxRSsxNyAgICAtPiAtMQorLS0gTFIgc3dhcAorZHFjb3Q1MzggY29tcGFyZXRvdGFsICAgIDFFLTE3ICAxICAgICAgIC0+IC0xCitkcWNvdDUzOSBjb21wYXJldG90YWwgICAgMUUtMTYgIDEgICAgICAgLT4gLTEKK2RxY290NTQwIGNvbXBhcmV0b3RhbCAgICAxRS0xNSAgMSAgICAgICAtPiAtMQorZHFjb3Q1NDEgY29tcGFyZXRvdGFsICAgIDFFLTE0ICAxICAgICAgIC0+IC0xCitkcWNvdDU0MiBjb21wYXJldG90YWwgICAgMUUtMTMgIDEgICAgICAgLT4gLTEKK2RxY290NTQzIGNvbXBhcmV0b3RhbCAgICAxRS0xMiAgMSAgICAgICAtPiAtMQorZHFjb3Q1NDQgY29tcGFyZXRvdGFsICAgIDFFLTExICAxICAgICAgIC0+IC0xCitkcWNvdDU0NSBjb21wYXJldG90YWwgICAgMUUtMTAgIDEgICAgICAgLT4gLTEKK2RxY290NTQ2IGNvbXBhcmV0b3RhbCAgICAxRS05ICAgMSAgICAgICAtPiAtMQorZHFjb3Q1NDcgY29tcGFyZXRvdGFsICAgIDFFLTggICAxICAgICAgIC0+IC0xCitkcWNvdDU0OCBjb21wYXJldG90YWwgICAgMUUtNyAgIDEgICAgICAgLT4gLTEKK2RxY290NTQ5IGNvbXBhcmV0b3RhbCAgICAxRS02ICAgMSAgICAgICAtPiAtMQorZHFjb3Q1NTAgY29tcGFyZXRvdGFsICAgIDFFLTUgICAxICAgICAgIC0+IC0xCitkcWNvdDU1MSBjb21wYXJldG90YWwgICAgMUUtNCAgIDEgICAgICAgLT4gLTEKK2RxY290NTUyIGNvbXBhcmV0b3RhbCAgICAxRS0zICAgMSAgICAgICAtPiAtMQorZHFjb3Q1NTMgY29tcGFyZXRvdGFsICAgIDFFLTIgICAxICAgICAgIC0+IC0xCitkcWNvdDU1NCBjb21wYXJldG90YWwgICAgMUUtMSAgIDEgICAgICAgLT4gLTEKK2RxY290NTU1IGNvbXBhcmV0b3RhbCAgICAxRS0wICAgMSAgICAgICAtPiAgMAorZHFjb3Q1NTYgY29tcGFyZXRvdGFsICAgIDFFKzEgICAxICAgICAgIC0+ICAxCitkcWNvdDU1NyBjb21wYXJldG90YWwgICAgMUUrMiAgIDEgICAgICAgLT4gIDEKK2RxY290NTU4IGNvbXBhcmV0b3RhbCAgICAxRSszICAgMSAgICAgICAtPiAgMQorZHFjb3Q1NTkgY29tcGFyZXRvdGFsICAgIDFFKzQgICAxICAgICAgIC0+ICAxCitkcWNvdDU2MSBjb21wYXJldG90YWwgICAgMUUrNSAgIDEgICAgICAgLT4gIDEKK2RxY290NTYyIGNvbXBhcmV0b3RhbCAgICAxRSs2ICAgMSAgICAgICAtPiAgMQorZHFjb3Q1NjMgY29tcGFyZXRvdGFsICAgIDFFKzcgICAxICAgICAgIC0+ICAxCitkcWNvdDU2NCBjb21wYXJldG90YWwgICAgMUUrOCAgIDEgICAgICAgLT4gIDEKK2RxY290NTY1IGNvbXBhcmV0b3RhbCAgICAxRSs5ICAgMSAgICAgICAtPiAgMQorZHFjb3Q1NjYgY29tcGFyZXRvdGFsICAgIDFFKzEwICAxICAgICAgIC0+ICAxCitkcWNvdDU2NyBjb21wYXJldG90YWwgICAgMUUrMTEgIDEgICAgICAgLT4gIDEKK2RxY290NTY4IGNvbXBhcmV0b3RhbCAgICAxRSsxMiAgMSAgICAgICAtPiAgMQorZHFjb3Q1NjkgY29tcGFyZXRvdGFsICAgIDFFKzEzICAxICAgICAgIC0+ICAxCitkcWNvdDU3MCBjb21wYXJldG90YWwgICAgMUUrMTQgIDEgICAgICAgLT4gIDEKK2RxY290NTcxIGNvbXBhcmV0b3RhbCAgICAxRSsxNSAgMSAgICAgICAtPiAgMQorZHFjb3Q1NzIgY29tcGFyZXRvdGFsICAgIDFFKzE2ICAxICAgICAgIC0+ICAxCitkcWNvdDU3MyBjb21wYXJldG90YWwgICAgMUUrMTcgIDEgICAgICAgLT4gIDEKKy0tIHNpbWlsYXIgd2l0aCBhIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorZHFjb3Q1NzggY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTcgICAgLT4gMQorZHFjb3Q1NzkgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTYgICAgLT4gMQorZHFjb3Q1ODAgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgLT4gMQorZHFjb3Q1ODEgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTQgICAgLT4gMQorZHFjb3Q1ODIgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTMgICAgLT4gMQorZHFjb3Q1ODMgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgLT4gMQorZHFjb3Q1ODQgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTEgICAgLT4gMQorZHFjb3Q1ODUgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTAgICAgLT4gMQorZHFjb3Q1ODYgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgLT4gMQorZHFjb3Q1ODcgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOCAgICAgLT4gMQorZHFjb3Q1ODggY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNyAgICAgLT4gMQorZHFjb3Q1ODkgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgLT4gLTEKK2RxY290NTkwIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTUgICAgIC0+IC0xCitkcWNvdDU5MSBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAtPiAtMQorZHFjb3Q1OTIgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgLT4gLTEKK2RxY290NTkzIGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTIgICAgIC0+IC0xCitkcWNvdDU5NCBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAtPiAtMQorZHFjb3Q1OTUgY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgLT4gLTEKK2RxY290NTk2IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzEgICAgIC0+IC0xCitkcWNvdDU5NyBjb21wYXJldG90YWwgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAtPiAtMQorZHFjb3Q1OTggY29tcGFyZXRvdGFsICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgLT4gLTEKK2RxY290NTk5IGNvbXBhcmV0b3RhbCAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzQgICAgIC0+IC0xCisKKy0tIGNoZWNrIHNvbWUgdW5pdC15IHRyYXBzCitkcWNvdDYwMCBjb21wYXJldG90YWwgICAxMiAgICAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY290NjAxIGNvbXBhcmV0b3RhbCAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb3Q2MDIgY29tcGFyZXRvdGFsICAgMTIuMDAgICAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNvdDYwMyBjb21wYXJldG90YWwgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY290NjA0IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAtPiAtMQorZHFjb3Q2MDUgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAgICAgICAxMi4yMzQ1IC0+IC0xCitkcWNvdDYwNiBjb21wYXJldG90YWwgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgLT4gLTEKK2RxY290NjA3IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAtPiAtMQorZHFjb3Q2MDggY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMDAgICAxMi4yMzQ1IC0+IC0xCitkcWNvdDYwOSBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgLT4gLTEKK2RxY290NjEwIGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIgICAgICAgICAgICAtPiAgMQorZHFjb3Q2MTEgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wICAgICAgICAgIC0+ICAxCitkcWNvdDYxMiBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwICAgICAgICAgLT4gIDEKK2RxY290NjEzIGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAtPiAgMQorZHFjb3Q2MTQgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwICAgICAgIC0+ICAxCitkcWNvdDYxNSBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgLT4gIDEKK2RxY290NjE2IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAtPiAgMQorZHFjb3Q2MTcgY29tcGFyZXRvdGFsICAgMTIuMTIzNCAxMi4wMDAwMDAwICAgIC0+ICAxCitkcWNvdDYxOCBjb21wYXJldG90YWwgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgLT4gIDEKK2RxY290NjE5IGNvbXBhcmV0b3RhbCAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAtPiAgMQorZHFjb3Q2MjAgY29tcGFyZXRvdGFsICAtMTIgICAgICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNvdDYyMSBjb21wYXJldG90YWwgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY290NjIyIGNvbXBhcmV0b3RhbCAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb3Q2MjMgY29tcGFyZXRvdGFsICAtMTIuMDAwICAgICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNvdDYyNCBjb21wYXJldG90YWwgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgLT4gIDEKK2RxY290NjI1IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAtPiAgMQorZHFjb3Q2MjYgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwICAgIC0xMi4yMzQ1IC0+ICAxCitkcWNvdDYyNyBjb21wYXJldG90YWwgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgLT4gIDEKK2RxY290NjI4IGNvbXBhcmV0b3RhbCAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAtPiAgMQorZHFjb3Q2MjkgY29tcGFyZXRvdGFsICAtMTIuMDAwMDAwMDAwIC0xMi4yMzQ1IC0+ICAxCitkcWNvdDYzMCBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgLT4gLTEKK2RxY290NjMxIGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAtPiAtMQorZHFjb3Q2MzIgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAgICAgICAgIC0+IC0xCitkcWNvdDYzMyBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgLT4gLTEKK2RxY290NjM0IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAtPiAtMQorZHFjb3Q2MzUgY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAgICAgIC0+IC0xCitkcWNvdDYzNiBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgLT4gLTEKK2RxY290NjM3IGNvbXBhcmV0b3RhbCAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAtPiAtMQorZHFjb3Q2MzggY29tcGFyZXRvdGFsICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAgIC0+IC0xCitkcWNvdDYzOSBjb21wYXJldG90YWwgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgLT4gLTEKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RxY290NjQwIGNvbXBhcmV0b3RhbCAgIDAgICAgIDAgICAtPiAwCitkcWNvdDY0MSBjb21wYXJldG90YWwgICAwICAgIC0wICAgLT4gMQorZHFjb3Q2NDIgY29tcGFyZXRvdGFsICAgMCAgICAtMC4wIC0+IDEKK2RxY290NjQzIGNvbXBhcmV0b3RhbCAgIDAgICAgIDAuMCAtPiAxCitkcWNvdDY0NCBjb21wYXJldG90YWwgIC0wICAgICAwICAgLT4gLTEKK2RxY290NjQ1IGNvbXBhcmV0b3RhbCAgLTAgICAgLTAgICAtPiAwCitkcWNvdDY0NiBjb21wYXJldG90YWwgIC0wICAgIC0wLjAgLT4gLTEKK2RxY290NjQ3IGNvbXBhcmV0b3RhbCAgLTAgICAgIDAuMCAtPiAtMQorZHFjb3Q2NDggY29tcGFyZXRvdGFsICAgMC4wICAgMCAgIC0+IC0xCitkcWNvdDY0OSBjb21wYXJldG90YWwgICAwLjAgIC0wICAgLT4gMQorZHFjb3Q2NTAgY29tcGFyZXRvdGFsICAgMC4wICAtMC4wIC0+IDEKK2RxY290NjUxIGNvbXBhcmV0b3RhbCAgIDAuMCAgIDAuMCAtPiAwCitkcWNvdDY1MiBjb21wYXJldG90YWwgIC0wLjAgICAwICAgLT4gLTEKK2RxY290NjUzIGNvbXBhcmV0b3RhbCAgLTAuMCAgLTAgICAtPiAxCitkcWNvdDY1NCBjb21wYXJldG90YWwgIC0wLjAgIC0wLjAgLT4gMAorZHFjb3Q2NTUgY29tcGFyZXRvdGFsICAtMC4wICAgMC4wIC0+IC0xCisKK2RxY290NjU2IGNvbXBhcmV0b3RhbCAgLTBFMSAgIDAuMCAtPiAtMQorZHFjb3Q2NTcgY29tcGFyZXRvdGFsICAtMEUyICAgMC4wIC0+IC0xCitkcWNvdDY1OCBjb21wYXJldG90YWwgICAwRTEgICAwLjAgLT4gMQorZHFjb3Q2NTkgY29tcGFyZXRvdGFsICAgMEUyICAgMC4wIC0+IDEKK2RxY290NjYwIGNvbXBhcmV0b3RhbCAgLTBFMSAgIDAgICAtPiAtMQorZHFjb3Q2NjEgY29tcGFyZXRvdGFsICAtMEUyICAgMCAgIC0+IC0xCitkcWNvdDY2MiBjb21wYXJldG90YWwgICAwRTEgICAwICAgLT4gMQorZHFjb3Q2NjMgY29tcGFyZXRvdGFsICAgMEUyICAgMCAgIC0+IDEKK2RxY290NjY0IGNvbXBhcmV0b3RhbCAgLTBFMSAgLTBFMSAtPiAwCitkcWNvdDY2NSBjb21wYXJldG90YWwgIC0wRTIgIC0wRTEgLT4gLTEKK2RxY290NjY2IGNvbXBhcmV0b3RhbCAgIDBFMSAgLTBFMSAtPiAxCitkcWNvdDY2NyBjb21wYXJldG90YWwgICAwRTIgIC0wRTEgLT4gMQorZHFjb3Q2NjggY29tcGFyZXRvdGFsICAtMEUxICAtMEUyIC0+IDEKK2RxY290NjY5IGNvbXBhcmV0b3RhbCAgLTBFMiAgLTBFMiAtPiAwCitkcWNvdDY3MCBjb21wYXJldG90YWwgICAwRTEgIC0wRTIgLT4gMQorZHFjb3Q2NzEgY29tcGFyZXRvdGFsICAgMEUyICAtMEUyIC0+IDEKK2RxY290NjcyIGNvbXBhcmV0b3RhbCAgLTBFMSAgIDBFMSAtPiAtMQorZHFjb3Q2NzMgY29tcGFyZXRvdGFsICAtMEUyICAgMEUxIC0+IC0xCitkcWNvdDY3NCBjb21wYXJldG90YWwgICAwRTEgICAwRTEgLT4gMAorZHFjb3Q2NzUgY29tcGFyZXRvdGFsICAgMEUyICAgMEUxIC0+IDEKK2RxY290Njc2IGNvbXBhcmV0b3RhbCAgLTBFMSAgIDBFMiAtPiAtMQorZHFjb3Q2NzcgY29tcGFyZXRvdGFsICAtMEUyICAgMEUyIC0+IC0xCitkcWNvdDY3OCBjb21wYXJldG90YWwgICAwRTEgICAwRTIgLT4gLTEKK2RxY290Njc5IGNvbXBhcmV0b3RhbCAgIDBFMiAgIDBFMiAtPiAwCisKKy0tIHRyYWlsaW5nIHplcm9zOyB1bml0LXkKK2RxY290NjgwIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyICAgICAgICAgICAtPiAwCitkcWNvdDY4MSBjb21wYXJldG90YWwgICAxMiAgICAxMi4wICAgICAgICAgLT4gMQorZHFjb3Q2ODIgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAgICAgICAgIC0+IDEKK2RxY290NjgzIGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMCAgICAgICAtPiAxCitkcWNvdDY4NCBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwICAgICAgLT4gMQorZHFjb3Q2ODUgY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAgICAgIC0+IDEKK2RxY290Njg2IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMCAgICAtPiAxCitkcWNvdDY4NyBjb21wYXJldG90YWwgICAxMiAgICAxMi4wMDAwMDAwICAgLT4gMQorZHFjb3Q2ODggY29tcGFyZXRvdGFsICAgMTIgICAgMTIuMDAwMDAwMDAgIC0+IDEKK2RxY290Njg5IGNvbXBhcmV0b3RhbCAgIDEyICAgIDEyLjAwMDAwMDAwMCAtPiAxCitkcWNvdDY5MCBjb21wYXJldG90YWwgICAxMiAgICAgICAgICAgICAgMTIgLT4gMAorZHFjb3Q2OTEgY29tcGFyZXRvdGFsICAgMTIuMCAgICAgICAgICAgIDEyIC0+IC0xCitkcWNvdDY5MiBjb21wYXJldG90YWwgICAxMi4wMCAgICAgICAgICAgMTIgLT4gLTEKK2RxY290NjkzIGNvbXBhcmV0b3RhbCAgIDEyLjAwMCAgICAgICAgICAxMiAtPiAtMQorZHFjb3Q2OTQgY29tcGFyZXRvdGFsICAgMTIuMDAwMCAgICAgICAgIDEyIC0+IC0xCitkcWNvdDY5NSBjb21wYXJldG90YWwgICAxMi4wMDAwMCAgICAgICAgMTIgLT4gLTEKK2RxY290Njk2IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMCAgICAgICAxMiAtPiAtMQorZHFjb3Q2OTcgY29tcGFyZXRvdGFsICAgMTIuMDAwMDAwMCAgICAgIDEyIC0+IC0xCitkcWNvdDY5OCBjb21wYXJldG90YWwgICAxMi4wMDAwMDAwMCAgICAgMTIgLT4gLTEKK2RxY290Njk5IGNvbXBhcmV0b3RhbCAgIDEyLjAwMDAwMDAwMCAgICAxMiAtPiAtMQorCistLSBvbGQgbG9uZyBvcGVyYW5kIGNoZWNrcworZHFjb3Q3MDEgY29tcGFyZXRvdGFsIDEyMzQ1Njc4MDAwICAxIC0+ICAxCitkcWNvdDcwMiBjb21wYXJldG90YWwgMSAxMjM0NTY3ODAwMCAgLT4gLTEKK2RxY290NzAzIGNvbXBhcmV0b3RhbCAxMjM0NTY3ODAwICAgMSAtPiAgMQorZHFjb3Q3MDQgY29tcGFyZXRvdGFsIDEgMTIzNDU2NzgwMCAgIC0+IC0xCitkcWNvdDcwNSBjb21wYXJldG90YWwgMTIzNDU2Nzg5MCAgIDEgLT4gIDEKK2RxY290NzA2IGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTAgICAtPiAtMQorZHFjb3Q3MDcgY29tcGFyZXRvdGFsIDEyMzQ1Njc4OTEgICAxIC0+ICAxCitkcWNvdDcwOCBjb21wYXJldG90YWwgMSAxMjM0NTY3ODkxICAgLT4gLTEKK2RxY290NzA5IGNvbXBhcmV0b3RhbCAxMjM0NTY3ODkwMSAgMSAtPiAgMQorZHFjb3Q3MTAgY29tcGFyZXRvdGFsIDEgMTIzNDU2Nzg5MDEgIC0+IC0xCitkcWNvdDcxMSBjb21wYXJldG90YWwgMTIzNDU2Nzg5NiAgIDEgLT4gIDEKK2RxY290NzEyIGNvbXBhcmV0b3RhbCAxIDEyMzQ1Njc4OTYgICAtPiAtMQorZHFjb3Q3MTMgY29tcGFyZXRvdGFsIC0xMjM0NTY3ODkxICAxIC0+IC0xCitkcWNvdDcxNCBjb21wYXJldG90YWwgMSAtMTIzNDU2Nzg5MSAgLT4gIDEKK2RxY290NzE1IGNvbXBhcmV0b3RhbCAtMTIzNDU2Nzg5MDEgMSAtPiAtMQorZHFjb3Q3MTYgY29tcGFyZXRvdGFsIDEgLTEyMzQ1Njc4OTAxIC0+ICAxCitkcWNvdDcxNyBjb21wYXJldG90YWwgLTEyMzQ1Njc4OTYgIDEgLT4gLTEKK2RxY290NzE4IGNvbXBhcmV0b3RhbCAxIC0xMjM0NTY3ODk2ICAtPiAgMQorCistLSBvbGQgcmVzaWR1ZSBjYXNlcworZHFjb3Q3NDAgY29tcGFyZXRvdGFsICAxICAwLjk5OTk5OTkgIC0+IDEKK2RxY290NzQxIGNvbXBhcmV0b3RhbCAgMSAgMC45OTk5OTkgICAtPiAxCitkcWNvdDc0MiBjb21wYXJldG90YWwgIDEgIDAuOTk5OTkgICAgLT4gMQorZHFjb3Q3NDMgY29tcGFyZXRvdGFsICAxICAxLjAwMDAgICAgIC0+IDEKK2RxY290NzQ0IGNvbXBhcmV0b3RhbCAgMSAgMS4wMDAwMSAgICAtPiAtMQorZHFjb3Q3NDUgY29tcGFyZXRvdGFsICAxICAxLjAwMDAwMSAgIC0+IC0xCitkcWNvdDc0NiBjb21wYXJldG90YWwgIDEgIDEuMDAwMDAwMSAgLT4gLTEKK2RxY290NzUwIGNvbXBhcmV0b3RhbCAgMC45OTk5OTk5ICAxICAtPiAtMQorZHFjb3Q3NTEgY29tcGFyZXRvdGFsICAwLjk5OTk5OSAgIDEgIC0+IC0xCitkcWNvdDc1MiBjb21wYXJldG90YWwgIDAuOTk5OTkgICAgMSAgLT4gLTEKK2RxY290NzUzIGNvbXBhcmV0b3RhbCAgMS4wMDAwICAgICAxICAtPiAtMQorZHFjb3Q3NTQgY29tcGFyZXRvdGFsICAxLjAwMDAxICAgIDEgIC0+IDEKK2RxY290NzU1IGNvbXBhcmV0b3RhbCAgMS4wMDAwMDEgICAxICAtPiAxCitkcWNvdDc1NiBjb21wYXJldG90YWwgIDEuMDAwMDAwMSAgMSAgLT4gMQorCistLSBTcGVjaWFscworZHFjb3Q3ODAgY29tcGFyZXRvdGFsICBJbmYgIC1JbmYgICAtPiAgMQorZHFjb3Q3ODEgY29tcGFyZXRvdGFsICBJbmYgIC0xMDAwICAtPiAgMQorZHFjb3Q3ODIgY29tcGFyZXRvdGFsICBJbmYgIC0xICAgICAtPiAgMQorZHFjb3Q3ODMgY29tcGFyZXRvdGFsICBJbmYgIC0wICAgICAtPiAgMQorZHFjb3Q3ODQgY29tcGFyZXRvdGFsICBJbmYgICAwICAgICAtPiAgMQorZHFjb3Q3ODUgY29tcGFyZXRvdGFsICBJbmYgICAxICAgICAtPiAgMQorZHFjb3Q3ODYgY29tcGFyZXRvdGFsICBJbmYgICAxMDAwICAtPiAgMQorZHFjb3Q3ODcgY29tcGFyZXRvdGFsICBJbmYgICBJbmYgICAtPiAgMAorZHFjb3Q3ODggY29tcGFyZXRvdGFsIC0xMDAwICBJbmYgICAtPiAtMQorZHFjb3Q3ODkgY29tcGFyZXRvdGFsIC1JbmYgICBJbmYgICAtPiAtMQorZHFjb3Q3OTAgY29tcGFyZXRvdGFsIC0xICAgICBJbmYgICAtPiAtMQorZHFjb3Q3OTEgY29tcGFyZXRvdGFsIC0wICAgICBJbmYgICAtPiAtMQorZHFjb3Q3OTIgY29tcGFyZXRvdGFsICAwICAgICBJbmYgICAtPiAtMQorZHFjb3Q3OTMgY29tcGFyZXRvdGFsICAxICAgICBJbmYgICAtPiAtMQorZHFjb3Q3OTQgY29tcGFyZXRvdGFsICAxMDAwICBJbmYgICAtPiAtMQorZHFjb3Q3OTUgY29tcGFyZXRvdGFsICBJbmYgICBJbmYgICAtPiAgMAorCitkcWNvdDgwMCBjb21wYXJldG90YWwgLUluZiAgLUluZiAgIC0+ICAwCitkcWNvdDgwMSBjb21wYXJldG90YWwgLUluZiAgLTEwMDAgIC0+IC0xCitkcWNvdDgwMiBjb21wYXJldG90YWwgLUluZiAgLTEgICAgIC0+IC0xCitkcWNvdDgwMyBjb21wYXJldG90YWwgLUluZiAgLTAgICAgIC0+IC0xCitkcWNvdDgwNCBjb21wYXJldG90YWwgLUluZiAgIDAgICAgIC0+IC0xCitkcWNvdDgwNSBjb21wYXJldG90YWwgLUluZiAgIDEgICAgIC0+IC0xCitkcWNvdDgwNiBjb21wYXJldG90YWwgLUluZiAgIDEwMDAgIC0+IC0xCitkcWNvdDgwNyBjb21wYXJldG90YWwgLUluZiAgIEluZiAgIC0+IC0xCitkcWNvdDgwOCBjb21wYXJldG90YWwgLUluZiAgLUluZiAgIC0+ICAwCitkcWNvdDgwOSBjb21wYXJldG90YWwgLTEwMDAgLUluZiAgIC0+ICAxCitkcWNvdDgxMCBjb21wYXJldG90YWwgLTEgICAgLUluZiAgIC0+ICAxCitkcWNvdDgxMSBjb21wYXJldG90YWwgLTAgICAgLUluZiAgIC0+ICAxCitkcWNvdDgxMiBjb21wYXJldG90YWwgIDAgICAgLUluZiAgIC0+ICAxCitkcWNvdDgxMyBjb21wYXJldG90YWwgIDEgICAgLUluZiAgIC0+ICAxCitkcWNvdDgxNCBjb21wYXJldG90YWwgIDEwMDAgLUluZiAgIC0+ICAxCitkcWNvdDgxNSBjb21wYXJldG90YWwgIEluZiAgLUluZiAgIC0+ICAxCisKK2RxY290ODIxIGNvbXBhcmV0b3RhbCAgTmFOIC1JbmYgICAgLT4gIDEKK2RxY290ODIyIGNvbXBhcmV0b3RhbCAgTmFOIC0xMDAwICAgLT4gIDEKK2RxY290ODIzIGNvbXBhcmV0b3RhbCAgTmFOIC0xICAgICAgLT4gIDEKK2RxY290ODI0IGNvbXBhcmV0b3RhbCAgTmFOIC0wICAgICAgLT4gIDEKK2RxY290ODI1IGNvbXBhcmV0b3RhbCAgTmFOICAwICAgICAgLT4gIDEKK2RxY290ODI2IGNvbXBhcmV0b3RhbCAgTmFOICAxICAgICAgLT4gIDEKK2RxY290ODI3IGNvbXBhcmV0b3RhbCAgTmFOICAxMDAwICAgLT4gIDEKK2RxY290ODI4IGNvbXBhcmV0b3RhbCAgTmFOICBJbmYgICAgLT4gIDEKK2RxY290ODI5IGNvbXBhcmV0b3RhbCAgTmFOICBOYU4gICAgLT4gIDAKK2RxY290ODMwIGNvbXBhcmV0b3RhbCAtSW5mICBOYU4gICAgLT4gIC0xCitkcWNvdDgzMSBjb21wYXJldG90YWwgLTEwMDAgTmFOICAgIC0+ICAtMQorZHFjb3Q4MzIgY29tcGFyZXRvdGFsIC0xICAgIE5hTiAgICAtPiAgLTEKK2RxY290ODMzIGNvbXBhcmV0b3RhbCAtMCAgICBOYU4gICAgLT4gIC0xCitkcWNvdDgzNCBjb21wYXJldG90YWwgIDAgICAgTmFOICAgIC0+ICAtMQorZHFjb3Q4MzUgY29tcGFyZXRvdGFsICAxICAgIE5hTiAgICAtPiAgLTEKK2RxY290ODM2IGNvbXBhcmV0b3RhbCAgMTAwMCBOYU4gICAgLT4gIC0xCitkcWNvdDgzNyBjb21wYXJldG90YWwgIEluZiAgTmFOICAgIC0+ICAtMQorZHFjb3Q4MzggY29tcGFyZXRvdGFsIC1OYU4gLU5hTiAgICAtPiAgMAorZHFjb3Q4MzkgY29tcGFyZXRvdGFsICtOYU4gLU5hTiAgICAtPiAgMQorZHFjb3Q4NDAgY29tcGFyZXRvdGFsIC1OYU4gK05hTiAgICAtPiAgLTEKKworZHFjb3Q4NDEgY29tcGFyZXRvdGFsICBzTmFOIC1zTmFOICAtPiAgMQorZHFjb3Q4NDIgY29tcGFyZXRvdGFsICBzTmFOIC1OYU4gICAtPiAgMQorZHFjb3Q4NDMgY29tcGFyZXRvdGFsICBzTmFOIC1JbmYgICAtPiAgMQorZHFjb3Q4NDQgY29tcGFyZXRvdGFsICBzTmFOIC0xMDAwICAtPiAgMQorZHFjb3Q4NDUgY29tcGFyZXRvdGFsICBzTmFOIC0xICAgICAtPiAgMQorZHFjb3Q4NDYgY29tcGFyZXRvdGFsICBzTmFOIC0wICAgICAtPiAgMQorZHFjb3Q4NDcgY29tcGFyZXRvdGFsICBzTmFOICAwICAgICAtPiAgMQorZHFjb3Q4NDggY29tcGFyZXRvdGFsICBzTmFOICAxICAgICAtPiAgMQorZHFjb3Q4NDkgY29tcGFyZXRvdGFsICBzTmFOICAxMDAwICAtPiAgMQorZHFjb3Q4NTAgY29tcGFyZXRvdGFsICBzTmFOICBOYU4gICAtPiAgLTEKK2RxY290ODUxIGNvbXBhcmV0b3RhbCAgc05hTiBzTmFOICAgLT4gIDAKKworZHFjb3Q4NTIgY29tcGFyZXRvdGFsIC1zTmFOIHNOYU4gICAtPiAgLTEKK2RxY290ODUzIGNvbXBhcmV0b3RhbCAtTmFOICBzTmFOICAgLT4gIC0xCitkcWNvdDg1NCBjb21wYXJldG90YWwgLUluZiAgc05hTiAgIC0+ICAtMQorZHFjb3Q4NTUgY29tcGFyZXRvdGFsIC0xMDAwIHNOYU4gICAtPiAgLTEKK2RxY290ODU2IGNvbXBhcmV0b3RhbCAtMSAgICBzTmFOICAgLT4gIC0xCitkcWNvdDg1NyBjb21wYXJldG90YWwgLTAgICAgc05hTiAgIC0+ICAtMQorZHFjb3Q4NTggY29tcGFyZXRvdGFsICAwICAgIHNOYU4gICAtPiAgLTEKK2RxY290ODU5IGNvbXBhcmV0b3RhbCAgMSAgICBzTmFOICAgLT4gIC0xCitkcWNvdDg2MCBjb21wYXJldG90YWwgIDEwMDAgc05hTiAgIC0+ICAtMQorZHFjb3Q4NjEgY29tcGFyZXRvdGFsICBJbmYgIHNOYU4gICAtPiAgLTEKK2RxY290ODYyIGNvbXBhcmV0b3RhbCAgTmFOICBzTmFOICAgLT4gIDEKK2RxY290ODYzIGNvbXBhcmV0b3RhbCAgc05hTiBzTmFOICAgLT4gIDAKKworZHFjb3Q4NzEgY29tcGFyZXRvdGFsICAtc05hTiAtc05hTiAgLT4gIDAKK2RxY290ODcyIGNvbXBhcmV0b3RhbCAgLXNOYU4gLU5hTiAgIC0+ICAxCitkcWNvdDg3MyBjb21wYXJldG90YWwgIC1zTmFOIC1JbmYgICAtPiAgLTEKK2RxY290ODc0IGNvbXBhcmV0b3RhbCAgLXNOYU4gLTEwMDAgIC0+ICAtMQorZHFjb3Q4NzUgY29tcGFyZXRvdGFsICAtc05hTiAtMSAgICAgLT4gIC0xCitkcWNvdDg3NiBjb21wYXJldG90YWwgIC1zTmFOIC0wICAgICAtPiAgLTEKK2RxY290ODc3IGNvbXBhcmV0b3RhbCAgLXNOYU4gIDAgICAgIC0+ICAtMQorZHFjb3Q4NzggY29tcGFyZXRvdGFsICAtc05hTiAgMSAgICAgLT4gIC0xCitkcWNvdDg3OSBjb21wYXJldG90YWwgIC1zTmFOICAxMDAwICAtPiAgLTEKK2RxY290ODgwIGNvbXBhcmV0b3RhbCAgLXNOYU4gIE5hTiAgIC0+ICAtMQorZHFjb3Q4ODEgY29tcGFyZXRvdGFsICAtc05hTiBzTmFOICAgLT4gIC0xCisKK2RxY290ODgyIGNvbXBhcmV0b3RhbCAtc05hTiAtc05hTiAgIC0+ICAwCitkcWNvdDg4MyBjb21wYXJldG90YWwgLU5hTiAgLXNOYU4gICAtPiAgLTEKK2RxY290ODg0IGNvbXBhcmV0b3RhbCAtSW5mICAtc05hTiAgIC0+ICAxCitkcWNvdDg4NSBjb21wYXJldG90YWwgLTEwMDAgLXNOYU4gICAtPiAgMQorZHFjb3Q4ODYgY29tcGFyZXRvdGFsIC0xICAgIC1zTmFOICAgLT4gIDEKK2RxY290ODg3IGNvbXBhcmV0b3RhbCAtMCAgICAtc05hTiAgIC0+ICAxCitkcWNvdDg4OCBjb21wYXJldG90YWwgIDAgICAgLXNOYU4gICAtPiAgMQorZHFjb3Q4ODkgY29tcGFyZXRvdGFsICAxICAgIC1zTmFOICAgLT4gIDEKK2RxY290ODkwIGNvbXBhcmV0b3RhbCAgMTAwMCAtc05hTiAgIC0+ICAxCitkcWNvdDg5MSBjb21wYXJldG90YWwgIEluZiAgLXNOYU4gICAtPiAgMQorZHFjb3Q4OTIgY29tcGFyZXRvdGFsICBOYU4gIC1zTmFOICAgLT4gIDEKK2RxY290ODkzIGNvbXBhcmV0b3RhbCAgc05hTiAtc05hTiAgIC0+ICAxCisKKy0tIE5hTnMgd2l0aCBwYXlsb2FkCitkcWNvdDk2MCBjb21wYXJldG90YWwgIE5hTjkgLUluZiAgIC0+ICAxCitkcWNvdDk2MSBjb21wYXJldG90YWwgIE5hTjggIDk5OSAgIC0+ICAxCitkcWNvdDk2MiBjb21wYXJldG90YWwgIE5hTjc3IEluZiAgIC0+ICAxCitkcWNvdDk2MyBjb21wYXJldG90YWwgLU5hTjY3IE5hTjUgIC0+ICAtMQorZHFjb3Q5NjQgY29tcGFyZXRvdGFsIC1JbmYgIC1OYU40ICAtPiAgMQorZHFjb3Q5NjUgY29tcGFyZXRvdGFsIC05OTkgIC1OYU4zMyAtPiAgMQorZHFjb3Q5NjYgY29tcGFyZXRvdGFsICBJbmYgICBOYU4yICAtPiAgLTEKKworZHFjb3Q5NzAgY29tcGFyZXRvdGFsIC1OYU40MSAtTmFONDIgLT4gMQorZHFjb3Q5NzEgY29tcGFyZXRvdGFsICtOYU40MSAtTmFONDIgLT4gMQorZHFjb3Q5NzIgY29tcGFyZXRvdGFsIC1OYU40MSArTmFONDIgLT4gLTEKK2RxY290OTczIGNvbXBhcmV0b3RhbCArTmFONDEgK05hTjQyIC0+IC0xCitkcWNvdDk3NCBjb21wYXJldG90YWwgLU5hTjQyIC1OYU4wMSAtPiAtMQorZHFjb3Q5NzUgY29tcGFyZXRvdGFsICtOYU40MiAtTmFOMDEgLT4gIDEKK2RxY290OTc2IGNvbXBhcmV0b3RhbCAtTmFONDIgK05hTjAxIC0+IC0xCitkcWNvdDk3NyBjb21wYXJldG90YWwgK05hTjQyICtOYU4wMSAtPiAgMQorCitkcWNvdDk4MCBjb21wYXJldG90YWwgLXNOYU43NzEgLXNOYU43NzIgLT4gMQorZHFjb3Q5ODEgY29tcGFyZXRvdGFsICtzTmFONzcxIC1zTmFONzcyIC0+IDEKK2RxY290OTgyIGNvbXBhcmV0b3RhbCAtc05hTjc3MSArc05hTjc3MiAtPiAtMQorZHFjb3Q5ODMgY29tcGFyZXRvdGFsICtzTmFONzcxICtzTmFONzcyIC0+IC0xCitkcWNvdDk4NCBjb21wYXJldG90YWwgLXNOYU43NzIgLXNOYU43NzEgLT4gLTEKK2RxY290OTg1IGNvbXBhcmV0b3RhbCArc05hTjc3MiAtc05hTjc3MSAtPiAgMQorZHFjb3Q5ODYgY29tcGFyZXRvdGFsIC1zTmFONzcyICtzTmFONzcxIC0+IC0xCitkcWNvdDk4NyBjb21wYXJldG90YWwgK3NOYU43NzIgK3NOYU43NzEgLT4gIDEKKworZHFjb3Q5OTEgY29tcGFyZXRvdGFsIC1zTmFOOTkgLUluZiAgICAtPiAtMQorZHFjb3Q5OTIgY29tcGFyZXRvdGFsICBzTmFOOTggLTExICAgICAtPiAgMQorZHFjb3Q5OTMgY29tcGFyZXRvdGFsICBzTmFOOTcgIE5hTiAgICAtPiAtMQorZHFjb3Q5OTQgY29tcGFyZXRvdGFsICBzTmFOMTYgc05hTjk0ICAtPiAtMQorZHFjb3Q5OTUgY29tcGFyZXRvdGFsICBOYU44NSAgc05hTjgzICAtPiAgMQorZHFjb3Q5OTYgY29tcGFyZXRvdGFsIC1JbmYgICAgc05hTjkyICAtPiAtMQorZHFjb3Q5OTcgY29tcGFyZXRvdGFsICAwODggICAgc05hTjgxICAtPiAtMQorZHFjb3Q5OTggY29tcGFyZXRvdGFsICBJbmYgICAgc05hTjkwICAtPiAtMQorZHFjb3Q5OTkgY29tcGFyZXRvdGFsICBOYU4gICAtc05hTjg5ICAtPiAgMQorCistLSBzcHJlYWQgemVyb3MKK2RxY290MTExMCBjb21wYXJldG90YWwgICAwRS02MTQzICAwICAgICAgIC0+IC0xCitkcWNvdDExMTEgY29tcGFyZXRvdGFsICAgMEUtNjE0MyAtMCAgICAgICAtPiAgMQorZHFjb3QxMTEyIGNvbXBhcmV0b3RhbCAgLTBFLTYxNDMgIDAgICAgICAgLT4gLTEKK2RxY290MTExMyBjb21wYXJldG90YWwgIC0wRS02MTQzIC0wICAgICAgIC0+ICAxCitkcWNvdDExMTQgY29tcGFyZXRvdGFsICAgMEUtNjE0MyAgMEUrNjE0NCAgLT4gLTEKK2RxY290MTExNSBjb21wYXJldG90YWwgICAwRS02MTQzIC0wRSs2MTQ0ICAtPiAgMQorZHFjb3QxMTE2IGNvbXBhcmV0b3RhbCAgLTBFLTYxNDMgIDBFKzYxNDQgIC0+IC0xCitkcWNvdDExMTcgY29tcGFyZXRvdGFsICAtMEUtNjE0MyAtMEUrNjE0NCAgLT4gIDEKK2RxY290MTExOCBjb21wYXJldG90YWwgICAwICAgICAgIDBFKzYxNDQgIC0+IC0xCitkcWNvdDExMTkgY29tcGFyZXRvdGFsICAgMCAgICAgIC0wRSs2MTQ0ICAtPiAgMQorZHFjb3QxMTIwIGNvbXBhcmV0b3RhbCAgLTAgICAgICAgMEUrNjE0NCAgLT4gLTEKK2RxY290MTEyMSBjb21wYXJldG90YWwgIC0wICAgICAgLTBFKzYxNDQgIC0+ICAxCisKK2RxY290MTEzMCBjb21wYXJldG90YWwgICAwRSs2MTQ0ICAwICAgICAgIC0+ICAxCitkcWNvdDExMzEgY29tcGFyZXRvdGFsICAgMEUrNjE0NCAtMCAgICAgICAtPiAgMQorZHFjb3QxMTMyIGNvbXBhcmV0b3RhbCAgLTBFKzYxNDQgIDAgICAgICAgLT4gLTEKK2RxY290MTEzMyBjb21wYXJldG90YWwgIC0wRSs2MTQ0IC0wICAgICAgIC0+IC0xCitkcWNvdDExMzQgY29tcGFyZXRvdGFsICAgMEUrNjE0NCAgMEUtNjE0MyAgLT4gIDEKK2RxY290MTEzNSBjb21wYXJldG90YWwgICAwRSs2MTQ0IC0wRS02MTQzICAtPiAgMQorZHFjb3QxMTM2IGNvbXBhcmV0b3RhbCAgLTBFKzYxNDQgIDBFLTYxNDMgIC0+IC0xCitkcWNvdDExMzcgY29tcGFyZXRvdGFsICAtMEUrNjE0NCAtMEUtNjE0MyAgLT4gLTEKK2RxY290MTEzOCBjb21wYXJldG90YWwgICAwICAgICAgIDBFLTYxNDMgIC0+ICAxCitkcWNvdDExMzkgY29tcGFyZXRvdGFsICAgMCAgICAgIC0wRS02MTQzICAtPiAgMQorZHFjb3QxMTQwIGNvbXBhcmV0b3RhbCAgLTAgICAgICAgMEUtNjE0MyAgLT4gLTEKK2RxY290MTE0MSBjb21wYXJldG90YWwgIC0wICAgICAgLTBFLTYxNDMgIC0+IC0xCisKKy0tIE51bGwgdGVzdHMKK2RxY290OTk5MCBjb21wYXJldG90YWwgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWNvdDk5OTEgY29tcGFyZXRvdGFsICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmVUb3RhbE1hZy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvbXBhcmVUb3RhbE1hZy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiODFiZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29tcGFyZVRvdGFsTWFnLmRlY1Rlc3QKQEAgLTAsMCArMSw3MDYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFDb21wYXJlVG90YWxNYWcuZGVjVGVzdCAtLSBkZWNRdWFkIGNvbXBhcmlzb247IGFicy4gdG90YWwgb3JkZXIgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBOb3RlIHRoYXQgd2UgY2Fubm90IGFzc3VtZSBhZGQvc3VidHJhY3QgdGVzdHMgY292ZXIgcGF0aHMgYWRlcXVhdGVseSwKKy0tIGhlcmUsIGJlY2F1c2UgdGhlIGNvZGUgbWlnaHQgYmUgcXVpdGUgZGlmZmVyZW50IChjb21wYXJpc29uIGNhbm5vdAorLS0gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LCBzbyBhY3R1YWwgc3VidHJhY3Rpb25zIGFyZSBub3QgbmVjZXNzYXJ5KS4KKy0tIFNpbWlsYXJseSwgY29tcGFyZXRvdGFsIHdpbGwgaGF2ZSBzb21lIHJhZGljYWxseSBkaWZmZXJlbnQgcGF0aHMKKy0tIHRoYW4gY29tcGFyZS4KKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RxY3RtMDAxIGNvbXBhcmV0b3RtYWcgIC0yICAtMiAgIC0+ICAgMAorZHFjdG0wMDIgY29tcGFyZXRvdG1hZyAgLTIgIC0xICAgLT4gICAxCitkcWN0bTAwMyBjb21wYXJldG90bWFnICAtMiAgIDAgICAtPiAgIDEKK2RxY3RtMDA0IGNvbXBhcmV0b3RtYWcgIC0yICAgMSAgIC0+ICAgMQorZHFjdG0wMDUgY29tcGFyZXRvdG1hZyAgLTIgICAyICAgLT4gICAwCitkcWN0bTAwNiBjb21wYXJldG90bWFnICAtMSAgLTIgICAtPiAgLTEKK2RxY3RtMDA3IGNvbXBhcmV0b3RtYWcgIC0xICAtMSAgIC0+ICAgMAorZHFjdG0wMDggY29tcGFyZXRvdG1hZyAgLTEgICAwICAgLT4gICAxCitkcWN0bTAwOSBjb21wYXJldG90bWFnICAtMSAgIDEgICAtPiAgIDAKK2RxY3RtMDEwIGNvbXBhcmV0b3RtYWcgIC0xICAgMiAgIC0+ICAtMQorZHFjdG0wMTEgY29tcGFyZXRvdG1hZyAgIDAgIC0yICAgLT4gIC0xCitkcWN0bTAxMiBjb21wYXJldG90bWFnICAgMCAgLTEgICAtPiAgLTEKK2RxY3RtMDEzIGNvbXBhcmV0b3RtYWcgICAwICAgMCAgIC0+ICAgMAorZHFjdG0wMTQgY29tcGFyZXRvdG1hZyAgIDAgICAxICAgLT4gIC0xCitkcWN0bTAxNSBjb21wYXJldG90bWFnICAgMCAgIDIgICAtPiAgLTEKK2RxY3RtMDE2IGNvbXBhcmV0b3RtYWcgICAxICAtMiAgIC0+ICAtMQorZHFjdG0wMTcgY29tcGFyZXRvdG1hZyAgIDEgIC0xICAgLT4gICAwCitkcWN0bTAxOCBjb21wYXJldG90bWFnICAgMSAgIDAgICAtPiAgIDEKK2RxY3RtMDE5IGNvbXBhcmV0b3RtYWcgICAxICAgMSAgIC0+ICAgMAorZHFjdG0wMjAgY29tcGFyZXRvdG1hZyAgIDEgICAyICAgLT4gIC0xCitkcWN0bTAyMSBjb21wYXJldG90bWFnICAgMiAgLTIgICAtPiAgIDAKK2RxY3RtMDIyIGNvbXBhcmV0b3RtYWcgICAyICAtMSAgIC0+ICAgMQorZHFjdG0wMjMgY29tcGFyZXRvdG1hZyAgIDIgICAwICAgLT4gICAxCitkcWN0bTAyNSBjb21wYXJldG90bWFnICAgMiAgIDEgICAtPiAgIDEKK2RxY3RtMDI2IGNvbXBhcmV0b3RtYWcgICAyICAgMiAgIC0+ICAgMAorCitkcWN0bTAzMSBjb21wYXJldG90bWFnICAtMjAgIC0yMCAgIC0+ICAgMAorZHFjdG0wMzIgY29tcGFyZXRvdG1hZyAgLTIwICAtMTAgICAtPiAgIDEKK2RxY3RtMDMzIGNvbXBhcmV0b3RtYWcgIC0yMCAgIDAwICAgLT4gICAxCitkcWN0bTAzNCBjb21wYXJldG90bWFnICAtMjAgICAxMCAgIC0+ICAgMQorZHFjdG0wMzUgY29tcGFyZXRvdG1hZyAgLTIwICAgMjAgICAtPiAgIDAKK2RxY3RtMDM2IGNvbXBhcmV0b3RtYWcgIC0xMCAgLTIwICAgLT4gIC0xCitkcWN0bTAzNyBjb21wYXJldG90bWFnICAtMTAgIC0xMCAgIC0+ICAgMAorZHFjdG0wMzggY29tcGFyZXRvdG1hZyAgLTEwICAgMDAgICAtPiAgIDEKK2RxY3RtMDM5IGNvbXBhcmV0b3RtYWcgIC0xMCAgIDEwICAgLT4gICAwCitkcWN0bTA0MCBjb21wYXJldG90bWFnICAtMTAgICAyMCAgIC0+ICAtMQorZHFjdG0wNDEgY29tcGFyZXRvdG1hZyAgIDAwICAtMjAgICAtPiAgLTEKK2RxY3RtMDQyIGNvbXBhcmV0b3RtYWcgICAwMCAgLTEwICAgLT4gIC0xCitkcWN0bTA0MyBjb21wYXJldG90bWFnICAgMDAgICAwMCAgIC0+ICAgMAorZHFjdG0wNDQgY29tcGFyZXRvdG1hZyAgIDAwICAgMTAgICAtPiAgLTEKK2RxY3RtMDQ1IGNvbXBhcmV0b3RtYWcgICAwMCAgIDIwICAgLT4gIC0xCitkcWN0bTA0NiBjb21wYXJldG90bWFnICAgMTAgIC0yMCAgIC0+ICAtMQorZHFjdG0wNDcgY29tcGFyZXRvdG1hZyAgIDEwICAtMTAgICAtPiAgIDAKK2RxY3RtMDQ4IGNvbXBhcmV0b3RtYWcgICAxMCAgIDAwICAgLT4gICAxCitkcWN0bTA0OSBjb21wYXJldG90bWFnICAgMTAgICAxMCAgIC0+ICAgMAorZHFjdG0wNTAgY29tcGFyZXRvdG1hZyAgIDEwICAgMjAgICAtPiAgLTEKK2RxY3RtMDUxIGNvbXBhcmV0b3RtYWcgICAyMCAgLTIwICAgLT4gICAwCitkcWN0bTA1MiBjb21wYXJldG90bWFnICAgMjAgIC0xMCAgIC0+ICAgMQorZHFjdG0wNTMgY29tcGFyZXRvdG1hZyAgIDIwICAgMDAgICAtPiAgIDEKK2RxY3RtMDU1IGNvbXBhcmV0b3RtYWcgICAyMCAgIDEwICAgLT4gICAxCitkcWN0bTA1NiBjb21wYXJldG90bWFnICAgMjAgICAyMCAgIC0+ICAgMAorCitkcWN0bTA2MSBjb21wYXJldG90bWFnICAtMi4wICAtMi4wICAgLT4gICAwCitkcWN0bTA2MiBjb21wYXJldG90bWFnICAtMi4wICAtMS4wICAgLT4gICAxCitkcWN0bTA2MyBjb21wYXJldG90bWFnICAtMi4wICAgMC4wICAgLT4gICAxCitkcWN0bTA2NCBjb21wYXJldG90bWFnICAtMi4wICAgMS4wICAgLT4gICAxCitkcWN0bTA2NSBjb21wYXJldG90bWFnICAtMi4wICAgMi4wICAgLT4gICAwCitkcWN0bTA2NiBjb21wYXJldG90bWFnICAtMS4wICAtMi4wICAgLT4gIC0xCitkcWN0bTA2NyBjb21wYXJldG90bWFnICAtMS4wICAtMS4wICAgLT4gICAwCitkcWN0bTA2OCBjb21wYXJldG90bWFnICAtMS4wICAgMC4wICAgLT4gICAxCitkcWN0bTA2OSBjb21wYXJldG90bWFnICAtMS4wICAgMS4wICAgLT4gICAwCitkcWN0bTA3MCBjb21wYXJldG90bWFnICAtMS4wICAgMi4wICAgLT4gIC0xCitkcWN0bTA3MSBjb21wYXJldG90bWFnICAgMC4wICAtMi4wICAgLT4gIC0xCitkcWN0bTA3MiBjb21wYXJldG90bWFnICAgMC4wICAtMS4wICAgLT4gIC0xCitkcWN0bTA3MyBjb21wYXJldG90bWFnICAgMC4wICAgMC4wICAgLT4gICAwCitkcWN0bTA3NCBjb21wYXJldG90bWFnICAgMC4wICAgMS4wICAgLT4gIC0xCitkcWN0bTA3NSBjb21wYXJldG90bWFnICAgMC4wICAgMi4wICAgLT4gIC0xCitkcWN0bTA3NiBjb21wYXJldG90bWFnICAgMS4wICAtMi4wICAgLT4gIC0xCitkcWN0bTA3NyBjb21wYXJldG90bWFnICAgMS4wICAtMS4wICAgLT4gICAwCitkcWN0bTA3OCBjb21wYXJldG90bWFnICAgMS4wICAgMC4wICAgLT4gICAxCitkcWN0bTA3OSBjb21wYXJldG90bWFnICAgMS4wICAgMS4wICAgLT4gICAwCitkcWN0bTA4MCBjb21wYXJldG90bWFnICAgMS4wICAgMi4wICAgLT4gIC0xCitkcWN0bTA4MSBjb21wYXJldG90bWFnICAgMi4wICAtMi4wICAgLT4gICAwCitkcWN0bTA4MiBjb21wYXJldG90bWFnICAgMi4wICAtMS4wICAgLT4gICAxCitkcWN0bTA4MyBjb21wYXJldG90bWFnICAgMi4wICAgMC4wICAgLT4gICAxCitkcWN0bTA4NSBjb21wYXJldG90bWFnICAgMi4wICAgMS4wICAgLT4gICAxCitkcWN0bTA4NiBjb21wYXJldG90bWFnICAgMi4wICAgMi4wICAgLT4gICAwCisKKy0tIG5vdyBzb21lIGNhc2VzIHdoaWNoIG1pZ2h0IG92ZXJmbG93IGlmIHN1YnRyYWN0IHdlcmUgdXNlZAorZHFjdG0wOTAgY29tcGFyZXRvdG1hZyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gICAwCitkcWN0bTA5MSBjb21wYXJldG90bWFnIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtPiAgIDAKK2RxY3RtMDkyIGNvbXBhcmV0b3RtYWcgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+ICAgMAorZHFjdG0wOTMgY29tcGFyZXRvdG1hZyAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gICAwCisKKy0tIHNvbWUgZGlmZmVyaW5nIGxlbmd0aC9leHBvbmVudCBjYXNlcworLS0gaW4gdGhpcyBmaXJzdCBncm91cCwgY29tcGFyZSB3b3VsZCBjb21wYXJlIGFsbCBlcXVhbAorZHFjdG0xMDAgY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3LjAgICAgIC0+ICAgMAorZHFjdG0xMDEgY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3ICAgICAgIC0+ICAtMQorZHFjdG0xMDIgY29tcGFyZXRvdG1hZyAgIDcgICAgICA3LjAgICAgIC0+ICAgMQorZHFjdG0xMDMgY29tcGFyZXRvdG1hZyAgIDdFKzAgICA3LjAgICAgIC0+ICAgMQorZHFjdG0xMDQgY29tcGFyZXRvdG1hZyAgIDcwRS0xICA3LjAgICAgIC0+ICAgMAorZHFjdG0xMDUgY29tcGFyZXRvdG1hZyAgIDAuN0UrMSA3ICAgICAgIC0+ICAgMAorZHFjdG0xMDYgY29tcGFyZXRvdG1hZyAgIDcwRS0xICA3ICAgICAgIC0+ICAtMQorZHFjdG0xMDcgY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3RSswICAgIC0+ICAtMQorZHFjdG0xMDggY29tcGFyZXRvdG1hZyAgIDcuMCAgICA3MEUtMSAgIC0+ICAgMAorZHFjdG0xMDkgY29tcGFyZXRvdG1hZyAgIDcgICAgICAwLjdFKzEgIC0+ICAgMAorZHFjdG0xMTAgY29tcGFyZXRvdG1hZyAgIDcgICAgICA3MEUtMSAgIC0+ICAgMQorCitkcWN0bTEyMCBjb21wYXJldG90bWFnICAgOC4wICAgIDcuMCAgICAgLT4gICAxCitkcWN0bTEyMSBjb21wYXJldG90bWFnICAgOC4wICAgIDcgICAgICAgLT4gICAxCitkcWN0bTEyMiBjb21wYXJldG90bWFnICAgOCAgICAgIDcuMCAgICAgLT4gICAxCitkcWN0bTEyMyBjb21wYXJldG90bWFnICAgOEUrMCAgIDcuMCAgICAgLT4gICAxCitkcWN0bTEyNCBjb21wYXJldG90bWFnICAgODBFLTEgIDcuMCAgICAgLT4gICAxCitkcWN0bTEyNSBjb21wYXJldG90bWFnICAgMC44RSsxIDcgICAgICAgLT4gICAxCitkcWN0bTEyNiBjb21wYXJldG90bWFnICAgODBFLTEgIDcgICAgICAgLT4gICAxCitkcWN0bTEyNyBjb21wYXJldG90bWFnICAgOC4wICAgIDdFKzAgICAgLT4gICAxCitkcWN0bTEyOCBjb21wYXJldG90bWFnICAgOC4wICAgIDcwRS0xICAgLT4gICAxCitkcWN0bTEyOSBjb21wYXJldG90bWFnICAgOCAgICAgIDAuN0UrMSAgIC0+ICAgMQorZHFjdG0xMzAgY29tcGFyZXRvdG1hZyAgIDggICAgICA3MEUtMSAgIC0+ICAgMQorCitkcWN0bTE0MCBjb21wYXJldG90bWFnICAgOC4wICAgIDkuMCAgICAgLT4gIC0xCitkcWN0bTE0MSBjb21wYXJldG90bWFnICAgOC4wICAgIDkgICAgICAgLT4gIC0xCitkcWN0bTE0MiBjb21wYXJldG90bWFnICAgOCAgICAgIDkuMCAgICAgLT4gIC0xCitkcWN0bTE0MyBjb21wYXJldG90bWFnICAgOEUrMCAgIDkuMCAgICAgLT4gIC0xCitkcWN0bTE0NCBjb21wYXJldG90bWFnICAgODBFLTEgIDkuMCAgICAgLT4gIC0xCitkcWN0bTE0NSBjb21wYXJldG90bWFnICAgMC44RSsxIDkgICAgICAgLT4gIC0xCitkcWN0bTE0NiBjb21wYXJldG90bWFnICAgODBFLTEgIDkgICAgICAgLT4gIC0xCitkcWN0bTE0NyBjb21wYXJldG90bWFnICAgOC4wICAgIDlFKzAgICAgLT4gIC0xCitkcWN0bTE0OCBjb21wYXJldG90bWFnICAgOC4wICAgIDkwRS0xICAgLT4gIC0xCitkcWN0bTE0OSBjb21wYXJldG90bWFnICAgOCAgICAgIDAuOUUrMSAgLT4gIC0xCitkcWN0bTE1MCBjb21wYXJldG90bWFnICAgOCAgICAgIDkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLSsgLi4KK2RxY3RtMjAwIGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNy4wICAgICAtPiAgIDAKK2RxY3RtMjAxIGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNyAgICAgICAtPiAgLTEKK2RxY3RtMjAyIGNvbXBhcmV0b3RtYWcgIC03ICAgICAgNy4wICAgICAtPiAgIDEKK2RxY3RtMjAzIGNvbXBhcmV0b3RtYWcgIC03RSswICAgNy4wICAgICAtPiAgIDEKK2RxY3RtMjA0IGNvbXBhcmV0b3RtYWcgIC03MEUtMSAgNy4wICAgICAtPiAgIDAKK2RxY3RtMjA1IGNvbXBhcmV0b3RtYWcgIC0wLjdFKzEgNyAgICAgICAtPiAgIDAKK2RxY3RtMjA2IGNvbXBhcmV0b3RtYWcgIC03MEUtMSAgNyAgICAgICAtPiAgLTEKK2RxY3RtMjA3IGNvbXBhcmV0b3RtYWcgIC03LjAgICAgN0UrMCAgICAtPiAgLTEKK2RxY3RtMjA4IGNvbXBhcmV0b3RtYWcgIC03LjAgICAgNzBFLTEgICAtPiAgIDAKK2RxY3RtMjA5IGNvbXBhcmV0b3RtYWcgIC03ICAgICAgMC43RSsxICAtPiAgIDAKK2RxY3RtMjEwIGNvbXBhcmV0b3RtYWcgIC03ICAgICAgNzBFLTEgICAtPiAgIDEKKworZHFjdG0yMjAgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3LjAgICAgIC0+ICAgMQorZHFjdG0yMjEgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3ICAgICAgIC0+ICAgMQorZHFjdG0yMjIgY29tcGFyZXRvdG1hZyAgLTggICAgICA3LjAgICAgIC0+ICAgMQorZHFjdG0yMjMgY29tcGFyZXRvdG1hZyAgLThFKzAgICA3LjAgICAgIC0+ICAgMQorZHFjdG0yMjQgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA3LjAgICAgIC0+ICAgMQorZHFjdG0yMjUgY29tcGFyZXRvdG1hZyAgLTAuOEUrMSA3ICAgICAgIC0+ICAgMQorZHFjdG0yMjYgY29tcGFyZXRvdG1hZyAgLTgwRS0xICA3ICAgICAgIC0+ICAgMQorZHFjdG0yMjcgY29tcGFyZXRvdG1hZyAgLTguMCAgICA3RSswICAgIC0+ICAgMQorZHFjdG0yMjggY29tcGFyZXRvdG1hZyAgLTguMCAgICA3MEUtMSAgIC0+ICAgMQorZHFjdG0yMjkgY29tcGFyZXRvdG1hZyAgLTggICAgICAwLjdFKzEgIC0+ICAgMQorZHFjdG0yMzAgY29tcGFyZXRvdG1hZyAgLTggICAgICA3MEUtMSAgIC0+ICAgMQorCitkcWN0bTI0MCBjb21wYXJldG90bWFnICAtOC4wICAgIDkuMCAgICAgLT4gIC0xCitkcWN0bTI0MSBjb21wYXJldG90bWFnICAtOC4wICAgIDkgICAgICAgLT4gIC0xCitkcWN0bTI0MiBjb21wYXJldG90bWFnICAtOCAgICAgIDkuMCAgICAgLT4gIC0xCitkcWN0bTI0MyBjb21wYXJldG90bWFnICAtOEUrMCAgIDkuMCAgICAgLT4gIC0xCitkcWN0bTI0NCBjb21wYXJldG90bWFnICAtODBFLTEgIDkuMCAgICAgLT4gIC0xCitkcWN0bTI0NSBjb21wYXJldG90bWFnICAtMC44RSsxIDkgICAgICAgLT4gIC0xCitkcWN0bTI0NiBjb21wYXJldG90bWFnICAtODBFLTEgIDkgICAgICAgLT4gIC0xCitkcWN0bTI0NyBjb21wYXJldG90bWFnICAtOC4wICAgIDlFKzAgICAgLT4gIC0xCitkcWN0bTI0OCBjb21wYXJldG90bWFnICAtOC4wICAgIDkwRS0xICAgLT4gIC0xCitkcWN0bTI0OSBjb21wYXJldG90bWFnICAtOCAgICAgIDAuOUUrMSAgLT4gIC0xCitkcWN0bTI1MCBjb21wYXJldG90bWFnICAtOCAgICAgIDkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgKy0gLi4KK2RxY3RtMzAwIGNvbXBhcmV0b3RtYWcgICA3LjAgICAgLTcuMCAgICAgLT4gICAwCitkcWN0bTMwMSBjb21wYXJldG90bWFnICAgNy4wICAgIC03ICAgICAgIC0+ICAtMQorZHFjdG0zMDIgY29tcGFyZXRvdG1hZyAgIDcgICAgICAtNy4wICAgICAtPiAgIDEKK2RxY3RtMzAzIGNvbXBhcmV0b3RtYWcgICA3RSswICAgLTcuMCAgICAgLT4gICAxCitkcWN0bTMwNCBjb21wYXJldG90bWFnICAgNzBFLTEgIC03LjAgICAgIC0+ICAgMAorZHFjdG0zMDUgY29tcGFyZXRvdG1hZyAgIC43RSsxICAtNyAgICAgICAtPiAgIDAKK2RxY3RtMzA2IGNvbXBhcmV0b3RtYWcgICA3MEUtMSAgLTcgICAgICAgLT4gIC0xCitkcWN0bTMwNyBjb21wYXJldG90bWFnICAgNy4wICAgIC03RSswICAgIC0+ICAtMQorZHFjdG0zMDggY29tcGFyZXRvdG1hZyAgIDcuMCAgICAtNzBFLTEgICAtPiAgIDAKK2RxY3RtMzA5IGNvbXBhcmV0b3RtYWcgICA3ICAgICAgLS43RSsxICAgLT4gICAwCitkcWN0bTMxMCBjb21wYXJldG90bWFnICAgNyAgICAgIC03MEUtMSAgIC0+ICAgMQorCitkcWN0bTMyMCBjb21wYXJldG90bWFnICAgOC4wICAgIC03LjAgICAgIC0+ICAgMQorZHFjdG0zMjEgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtNyAgICAgICAtPiAgIDEKK2RxY3RtMzIyIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTcuMCAgICAgLT4gICAxCitkcWN0bTMyMyBjb21wYXJldG90bWFnICAgOEUrMCAgIC03LjAgICAgIC0+ICAgMQorZHFjdG0zMjQgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtNy4wICAgICAtPiAgIDEKK2RxY3RtMzI1IGNvbXBhcmV0b3RtYWcgICAuOEUrMSAgLTcgICAgICAgLT4gICAxCitkcWN0bTMyNiBjb21wYXJldG90bWFnICAgODBFLTEgIC03ICAgICAgIC0+ICAgMQorZHFjdG0zMjcgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtN0UrMCAgICAtPiAgIDEKK2RxY3RtMzI4IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTcwRS0xICAgLT4gICAxCitkcWN0bTMyOSBjb21wYXJldG90bWFnICAgOCAgICAgIC0uN0UrMSAgIC0+ICAgMQorZHFjdG0zMzAgY29tcGFyZXRvdG1hZyAgIDggICAgICAtNzBFLTEgICAtPiAgIDEKKworZHFjdG0zNDAgY29tcGFyZXRvdG1hZyAgIDguMCAgICAtOS4wICAgICAtPiAgLTEKK2RxY3RtMzQxIGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTkgICAgICAgLT4gIC0xCitkcWN0bTM0MiBjb21wYXJldG90bWFnICAgOCAgICAgIC05LjAgICAgIC0+ICAtMQorZHFjdG0zNDMgY29tcGFyZXRvdG1hZyAgIDhFKzAgICAtOS4wICAgICAtPiAgLTEKK2RxY3RtMzQ0IGNvbXBhcmV0b3RtYWcgICA4MEUtMSAgLTkuMCAgICAgLT4gIC0xCitkcWN0bTM0NSBjb21wYXJldG90bWFnICAgLjhFKzEgIC05ICAgICAgIC0+ICAtMQorZHFjdG0zNDYgY29tcGFyZXRvdG1hZyAgIDgwRS0xICAtOSAgICAgICAtPiAgLTEKK2RxY3RtMzQ3IGNvbXBhcmV0b3RtYWcgICA4LjAgICAgLTlFKzAgICAgLT4gIC0xCitkcWN0bTM0OCBjb21wYXJldG90bWFnICAgOC4wICAgIC05MEUtMSAgIC0+ICAtMQorZHFjdG0zNDkgY29tcGFyZXRvdG1hZyAgIDggICAgICAtLjlFKzEgICAtPiAgLTEKK2RxY3RtMzUwIGNvbXBhcmV0b3RtYWcgICA4ICAgICAgLTkwRS0xICAgLT4gIC0xCisKKy0tIGFuZCBhZ2Fpbiwgd2l0aCBzaWduIGNoYW5nZXMgLS0gLi4KK2RxY3RtNDAwIGNvbXBhcmV0b3RtYWcgICAtNy4wICAgIC03LjAgICAgIC0+ICAgMAorZHFjdG00MDEgY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTcgICAgICAgLT4gIC0xCitkcWN0bTQwMiBjb21wYXJldG90bWFnICAgLTcgICAgICAtNy4wICAgICAtPiAgIDEKK2RxY3RtNDAzIGNvbXBhcmV0b3RtYWcgICAtN0UrMCAgIC03LjAgICAgIC0+ICAgMQorZHFjdG00MDQgY29tcGFyZXRvdG1hZyAgIC03MEUtMSAgLTcuMCAgICAgLT4gICAwCitkcWN0bTQwNSBjb21wYXJldG90bWFnICAgLS43RSsxICAtNyAgICAgICAtPiAgIDAKK2RxY3RtNDA2IGNvbXBhcmV0b3RtYWcgICAtNzBFLTEgIC03ICAgICAgIC0+ICAtMQorZHFjdG00MDcgY29tcGFyZXRvdG1hZyAgIC03LjAgICAgLTdFKzAgICAgLT4gIC0xCitkcWN0bTQwOCBjb21wYXJldG90bWFnICAgLTcuMCAgICAtNzBFLTEgICAtPiAgIDAKK2RxY3RtNDA5IGNvbXBhcmV0b3RtYWcgICAtNyAgICAgIC0uN0UrMSAgIC0+ICAgMAorZHFjdG00MTAgY29tcGFyZXRvdG1hZyAgIC03ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2RxY3RtNDIwIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC03LjAgICAgIC0+ICAgMQorZHFjdG00MjEgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTcgICAgICAgLT4gICAxCitkcWN0bTQyMiBjb21wYXJldG90bWFnICAgLTggICAgICAtNy4wICAgICAtPiAgIDEKK2RxY3RtNDIzIGNvbXBhcmV0b3RtYWcgICAtOEUrMCAgIC03LjAgICAgIC0+ICAgMQorZHFjdG00MjQgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTcuMCAgICAgLT4gICAxCitkcWN0bTQyNSBjb21wYXJldG90bWFnICAgLS44RSsxICAtNyAgICAgICAtPiAgIDEKK2RxY3RtNDI2IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC03ICAgICAgIC0+ICAgMQorZHFjdG00MjcgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTdFKzAgICAgLT4gICAxCitkcWN0bTQyOCBjb21wYXJldG90bWFnICAgLTguMCAgICAtNzBFLTEgICAtPiAgIDEKK2RxY3RtNDI5IGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC0uN0UrMSAgIC0+ICAgMQorZHFjdG00MzAgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTcwRS0xICAgLT4gICAxCisKK2RxY3RtNDQwIGNvbXBhcmV0b3RtYWcgICAtOC4wICAgIC05LjAgICAgIC0+ICAtMQorZHFjdG00NDEgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTkgICAgICAgLT4gIC0xCitkcWN0bTQ0MiBjb21wYXJldG90bWFnICAgLTggICAgICAtOS4wICAgICAtPiAgLTEKK2RxY3RtNDQzIGNvbXBhcmV0b3RtYWcgICAtOEUrMCAgIC05LjAgICAgIC0+ICAtMQorZHFjdG00NDQgY29tcGFyZXRvdG1hZyAgIC04MEUtMSAgLTkuMCAgICAgLT4gIC0xCitkcWN0bTQ0NSBjb21wYXJldG90bWFnICAgLS44RSsxICAtOSAgICAgICAtPiAgLTEKK2RxY3RtNDQ2IGNvbXBhcmV0b3RtYWcgICAtODBFLTEgIC05ICAgICAgIC0+ICAtMQorZHFjdG00NDcgY29tcGFyZXRvdG1hZyAgIC04LjAgICAgLTlFKzAgICAgLT4gIC0xCitkcWN0bTQ0OCBjb21wYXJldG90bWFnICAgLTguMCAgICAtOTBFLTEgICAtPiAgLTEKK2RxY3RtNDQ5IGNvbXBhcmV0b3RtYWcgICAtOCAgICAgIC0uOUUrMSAgIC0+ICAtMQorZHFjdG00NTAgY29tcGFyZXRvdG1hZyAgIC04ICAgICAgLTkwRS0xICAgLT4gIC0xCisKKworLS0gdGVzdGNhc2VzIHRoYXQgc3VidHJhY3QgdG8gbG90cyBvZiB6ZXJvcyBhdCBib3VuZGFyaWVzIFtwZ3JdCitkcWN0bTQ3MyBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkcWN0bTQ3NCBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwMDBFKzg5IDEyMy40NTZFKzg5ICAtPiAgLTEKK2RxY3RtNDc1IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkcWN0bTQ3NiBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDAwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkcWN0bTQ3NyBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwMDBFLTg5IDEyMy40NTZFLTg5ICAtPiAgLTEKK2RxY3RtNDc4IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwMDAwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkcWN0bTQ3OSBjb21wYXJldG90bWFnIDEyMy40NTYwMDAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkcWN0bTQ4MCBjb21wYXJldG90bWFnIDEyMy40NTYwMDBFKzg5IDEyMy40NTZFKzg5ICAtPiAgLTEKK2RxY3RtNDgxIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NjAwRS04OSAxMjMuNDU2RS04OSAgLT4gIC0xCitkcWN0bTQ4MiBjb21wYXJldG90bWFnIDEyMy40NTYwRSs4OSAxMjMuNDU2RSs4OSAgLT4gIC0xCitkcWN0bTQ4MyBjb21wYXJldG90bWFnIDEyMy40NTZFLTg5IDEyMy40NTZFLTg5ICAtPiAgIDAKK2RxY3RtNDg3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMDAwMDBFKzg5ICAtPiAgIDEKK2RxY3RtNDg4IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDAwMEUtODkgIC0+ICAgMQorZHFjdG00ODkgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDAwMDAwMDBFKzg5ICAtPiAgIDEKK2RxY3RtNDkwIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMDAwMDBFLTg5ICAtPiAgIDEKK2RxY3RtNDkxIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDAwMEUrODkgIC0+ICAgMQorZHFjdG00OTIgY29tcGFyZXRvdG1hZyAxMjMuNDU2RS04OSAxMjMuNDU2MDAwMDBFLTg5ICAtPiAgIDEKK2RxY3RtNDkzIGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NjAwMDBFKzg5ICAtPiAgIDEKK2RxY3RtNDk0IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjAwMEUtODkgIC0+ICAgMQorZHFjdG00OTUgY29tcGFyZXRvdG1hZyAxMjMuNDU2RSs4OSAxMjMuNDU2MDBFKzg5ICAtPiAgIDEKK2RxY3RtNDk2IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUtODkgMTIzLjQ1NjBFLTg5ICAtPiAgIDEKK2RxY3RtNDk3IGNvbXBhcmV0b3RtYWcgMTIzLjQ1NkUrODkgMTIzLjQ1NkUrODkgIC0+ICAgMAorCistLSB3aWRlLXJhbmdpbmcsIGFyb3VuZCBwcmVjaXNpb247IHNpZ25zIGVxdWFsCitkcWN0bTQ5OCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTE3ICAgICAtPiAgIDEKK2RxY3RtNDk5IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTYgICAgIC0+ICAgMQorZHFjdG01MDAgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xNSAgICAgLT4gICAxCitkcWN0bTUwMSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTE0ICAgICAtPiAgIDEKK2RxY3RtNTAyIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTMgICAgIC0+ICAgMQorZHFjdG01MDMgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0xMiAgICAgLT4gICAxCitkcWN0bTUwNCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTExICAgICAtPiAgIDEKK2RxY3RtNTA1IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMTAgICAgIC0+ICAgMQorZHFjdG01MDYgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS05ICAgICAgLT4gICAxCitkcWN0bTUwNyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTggICAgICAtPiAgIDEKK2RxY3RtNTA4IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNyAgICAgIC0+ICAgMQorZHFjdG01MDkgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS02ICAgICAgLT4gICAxCitkcWN0bTUxMCBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTUgICAgICAtPiAgIDEKK2RxY3RtNTExIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtNCAgICAgIC0+ICAgMQorZHFjdG01MTIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0zICAgICAgLT4gICAxCitkcWN0bTUxMyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFLTIgICAgICAtPiAgIDEKK2RxY3RtNTE0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUtMSAgICAgIC0+ICAgMQorZHFjdG01MTUgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRS0wICAgICAgLT4gICAwCitkcWN0bTUxNiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEgICAgICAtPiAgLTEKK2RxY3RtNTE3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMiAgICAgIC0+ICAtMQorZHFjdG01MTggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSszICAgICAgLT4gIC0xCitkcWN0bTUxOSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzQgICAgICAtPiAgLTEKK2RxY3RtNTIxIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrNSAgICAgIC0+ICAtMQorZHFjdG01MjIgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs2ICAgICAgLT4gIC0xCitkcWN0bTUyMyBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzcgICAgICAtPiAgLTEKK2RxY3RtNTI0IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrOCAgICAgIC0+ICAtMQorZHFjdG01MjUgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSs5ICAgICAgLT4gIC0xCitkcWN0bTUyNiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEwICAgICAtPiAgLTEKK2RxY3RtNTI3IGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTEgICAgIC0+ICAtMQorZHFjdG01MjggY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxMiAgICAgLT4gIC0xCitkcWN0bTUyOSBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzEzICAgICAtPiAgLTEKK2RxY3RtNTMwIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTQgICAgIC0+ICAtMQorZHFjdG01MzEgY29tcGFyZXRvdG1hZyAgICAxICAgICAxRSsxNSAgICAgLT4gIC0xCitkcWN0bTUzMiBjb21wYXJldG90bWFnICAgIDEgICAgIDFFKzE2ICAgICAtPiAgLTEKK2RxY3RtNTMzIGNvbXBhcmV0b3RtYWcgICAgMSAgICAgMUUrMTcgICAgIC0+ICAtMQorLS0gTFIgc3dhcAorZHFjdG01MzggY29tcGFyZXRvdG1hZyAgICAxRS0xNyAgMSAgICAgICAgLT4gIC0xCitkcWN0bTUzOSBjb21wYXJldG90bWFnICAgIDFFLTE2ICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTQwIGNvbXBhcmV0b3RtYWcgICAgMUUtMTUgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NDEgY29tcGFyZXRvdG1hZyAgICAxRS0xNCAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU0MiBjb21wYXJldG90bWFnICAgIDFFLTEzICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTQzIGNvbXBhcmV0b3RtYWcgICAgMUUtMTIgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NDQgY29tcGFyZXRvdG1hZyAgICAxRS0xMSAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU0NSBjb21wYXJldG90bWFnICAgIDFFLTEwICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTQ2IGNvbXBhcmV0b3RtYWcgICAgMUUtOSAgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NDcgY29tcGFyZXRvdG1hZyAgICAxRS04ICAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU0OCBjb21wYXJldG90bWFnICAgIDFFLTcgICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTQ5IGNvbXBhcmV0b3RtYWcgICAgMUUtNiAgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NTAgY29tcGFyZXRvdG1hZyAgICAxRS01ICAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU1MSBjb21wYXJldG90bWFnICAgIDFFLTQgICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTUyIGNvbXBhcmV0b3RtYWcgICAgMUUtMyAgIDEgICAgICAgIC0+ICAtMQorZHFjdG01NTMgY29tcGFyZXRvdG1hZyAgICAxRS0yICAgMSAgICAgICAgLT4gIC0xCitkcWN0bTU1NCBjb21wYXJldG90bWFnICAgIDFFLTEgICAxICAgICAgICAtPiAgLTEKK2RxY3RtNTU1IGNvbXBhcmV0b3RtYWcgICAgMUUtMCAgIDEgICAgICAgIC0+ICAgMAorZHFjdG01NTYgY29tcGFyZXRvdG1hZyAgICAxRSsxICAgMSAgICAgICAgLT4gICAxCitkcWN0bTU1NyBjb21wYXJldG90bWFnICAgIDFFKzIgICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTU4IGNvbXBhcmV0b3RtYWcgICAgMUUrMyAgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NTkgY29tcGFyZXRvdG1hZyAgICAxRSs0ICAgMSAgICAgICAgLT4gICAxCitkcWN0bTU2MSBjb21wYXJldG90bWFnICAgIDFFKzUgICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTYyIGNvbXBhcmV0b3RtYWcgICAgMUUrNiAgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NjMgY29tcGFyZXRvdG1hZyAgICAxRSs3ICAgMSAgICAgICAgLT4gICAxCitkcWN0bTU2NCBjb21wYXJldG90bWFnICAgIDFFKzggICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTY1IGNvbXBhcmV0b3RtYWcgICAgMUUrOSAgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NjYgY29tcGFyZXRvdG1hZyAgICAxRSsxMCAgMSAgICAgICAgLT4gICAxCitkcWN0bTU2NyBjb21wYXJldG90bWFnICAgIDFFKzExICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTY4IGNvbXBhcmV0b3RtYWcgICAgMUUrMTIgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NjkgY29tcGFyZXRvdG1hZyAgICAxRSsxMyAgMSAgICAgICAgLT4gICAxCitkcWN0bTU3MCBjb21wYXJldG90bWFnICAgIDFFKzE0ICAxICAgICAgICAtPiAgIDEKK2RxY3RtNTcxIGNvbXBhcmV0b3RtYWcgICAgMUUrMTUgIDEgICAgICAgIC0+ICAgMQorZHFjdG01NzIgY29tcGFyZXRvdG1hZyAgICAxRSsxNiAgMSAgICAgICAgLT4gICAxCitkcWN0bTU3MyBjb21wYXJldG90bWFnICAgIDFFKzE3ICAxICAgICAgICAtPiAgIDEKKy0tIHNpbWlsYXIgd2l0aCBhIHVzZWZ1bCBjb2VmZmljaWVudCwgb25lIHNpZGUgb25seQorZHFjdG01NzggY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE3ICAgICAtPiAgIDEKK2RxY3RtNTc5IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xNiAgICAgLT4gICAxCitkcWN0bTU4MCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTUgICAgIC0+ICAgMQorZHFjdG01ODEgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTE0ICAgICAtPiAgIDEKK2RxY3RtNTgyIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMyAgICAgLT4gICAxCitkcWN0bTU4MyBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMTIgICAgIC0+ICAgMQorZHFjdG01ODQgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTExICAgICAtPiAgIDEKK2RxY3RtNTg1IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xMCAgICAgLT4gICAxCitkcWN0bTU4NiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtOSAgICAgIC0+ICAgMQorZHFjdG01ODcgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTggICAgICAtPiAgIDEKK2RxY3RtNTg4IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS03ICAgICAgLT4gICAxCitkcWN0bTU4OSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtNiAgICAgIC0+ICAtMQorZHFjdG01OTAgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTUgICAgICAtPiAgLTEKK2RxY3RtNTkxIGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS00ICAgICAgLT4gIC0xCitkcWN0bTU5MiBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMyAgICAgIC0+ICAtMQorZHFjdG01OTMgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFLTIgICAgICAtPiAgLTEKK2RxY3RtNTk0IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRS0xICAgICAgLT4gIC0xCitkcWN0bTU5NSBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUtMCAgICAgIC0+ICAtMQorZHFjdG01OTYgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzEgICAgICAtPiAgLTEKK2RxY3RtNTk3IGNvbXBhcmV0b3RtYWcgIDAuMDAwMDAwOTg3NjU0MzIxICAgICAxRSsyICAgICAgLT4gIC0xCitkcWN0bTU5OCBjb21wYXJldG90bWFnICAwLjAwMDAwMDk4NzY1NDMyMSAgICAgMUUrMyAgICAgIC0+ICAtMQorZHFjdG01OTkgY29tcGFyZXRvdG1hZyAgMC4wMDAwMDA5ODc2NTQzMjEgICAgIDFFKzQgICAgICAtPiAgLTEKKworLS0gY2hlY2sgc29tZSB1bml0LXkgdHJhcHMKK2RxY3RtNjAwIGNvbXBhcmV0b3RtYWcgICAxMiAgICAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorZHFjdG02MDEgY29tcGFyZXRvdG1hZyAgIDEyLjAgICAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYwMiBjb21wYXJldG90bWFnICAgMTIuMDAgICAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjAzIGNvbXBhcmV0b3RtYWcgICAxMi4wMDAgICAgICAgIDEyLjIzNDUgIC0+ICAtMQorZHFjdG02MDQgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAgICAgICAgMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYwNSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAgICAgICAxMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjA2IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAgICAgIDEyLjIzNDUgIC0+ICAtMQorZHFjdG02MDcgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAgICAgMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYwOCBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAgICAxMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjA5IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwMDAgIDEyLjIzNDUgIC0+ICAtMQorZHFjdG02MTAgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIgICAgICAgICAgICAgLT4gICAxCitkcWN0bTYxMSBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wICAgICAgICAgICAtPiAgIDEKK2RxY3RtNjEyIGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwICAgICAgICAgIC0+ICAgMQorZHFjdG02MTMgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwICAgICAgICAgLT4gICAxCitkcWN0bTYxNCBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwICAgICAgICAtPiAgIDEKK2RxY3RtNjE1IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwICAgICAgIC0+ICAgMQorZHFjdG02MTYgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwICAgICAgLT4gICAxCitkcWN0bTYxNyBjb21wYXJldG90bWFnICAgMTIuMTIzNCAxMi4wMDAwMDAwICAgICAtPiAgIDEKK2RxY3RtNjE4IGNvbXBhcmV0b3RtYWcgICAxMi4xMjM0IDEyLjAwMDAwMDAwICAgIC0+ICAgMQorZHFjdG02MTkgY29tcGFyZXRvdG1hZyAgIDEyLjEyMzQgMTIuMDAwMDAwMDAwICAgLT4gICAxCitkcWN0bTYyMCBjb21wYXJldG90bWFnICAtMTIgICAgICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjIxIGNvbXBhcmV0b3RtYWcgIC0xMi4wICAgICAgICAgLTEyLjIzNDUgIC0+ICAtMQorZHFjdG02MjIgY29tcGFyZXRvdG1hZyAgLTEyLjAwICAgICAgICAtMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYyMyBjb21wYXJldG90bWFnICAtMTIuMDAwICAgICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjI0IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwICAgICAgLTEyLjIzNDUgIC0+ICAtMQorZHFjdG02MjUgY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwICAgICAtMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYyNiBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwICAgIC0xMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjI3IGNvbXBhcmV0b3RtYWcgIC0xMi4wMDAwMDAwICAgLTEyLjIzNDUgIC0+ICAtMQorZHFjdG02MjggY29tcGFyZXRvdG1hZyAgLTEyLjAwMDAwMDAwICAtMTIuMjM0NSAgLT4gIC0xCitkcWN0bTYyOSBjb21wYXJldG90bWFnICAtMTIuMDAwMDAwMDAwIC0xMi4yMzQ1ICAtPiAgLTEKK2RxY3RtNjMwIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMiAgICAgICAgICAgIC0+ICAgMQorZHFjdG02MzEgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAgICAgICAgICAgLT4gICAxCitkcWN0bTYzMiBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAgICAgICAgICAtPiAgIDEKK2RxY3RtNjMzIGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAgICAgICAgIC0+ICAgMQorZHFjdG02MzQgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAgICAgICAgLT4gICAxCitkcWN0bTYzNSBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAgICAgICAtPiAgIDEKK2RxY3RtNjM2IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAgICAgIC0+ICAgMQorZHFjdG02MzcgY29tcGFyZXRvdG1hZyAgLTEyLjEyMzQgLTEyLjAwMDAwMDAgICAgLT4gICAxCitkcWN0bTYzOCBjb21wYXJldG90bWFnICAtMTIuMTIzNCAtMTIuMDAwMDAwMDAgICAtPiAgIDEKK2RxY3RtNjM5IGNvbXBhcmV0b3RtYWcgIC0xMi4xMjM0IC0xMi4wMDAwMDAwMDAgIC0+ICAgMQorCistLSBleHRlbmRlZCB6ZXJvcworZHFjdG02NDAgY29tcGFyZXRvdG1hZyAgIDAgICAgIDAgICAgLT4gICAwCitkcWN0bTY0MSBjb21wYXJldG90bWFnICAgMCAgICAtMCAgICAtPiAgIDAKK2RxY3RtNjQyIGNvbXBhcmV0b3RtYWcgICAwICAgIC0wLjAgIC0+ICAgMQorZHFjdG02NDMgY29tcGFyZXRvdG1hZyAgIDAgICAgIDAuMCAgLT4gICAxCitkcWN0bTY0NCBjb21wYXJldG90bWFnICAtMCAgICAgMCAgICAtPiAgIDAKK2RxY3RtNjQ1IGNvbXBhcmV0b3RtYWcgIC0wICAgIC0wICAgIC0+ICAgMAorZHFjdG02NDYgY29tcGFyZXRvdG1hZyAgLTAgICAgLTAuMCAgLT4gICAxCitkcWN0bTY0NyBjb21wYXJldG90bWFnICAtMCAgICAgMC4wICAtPiAgIDEKK2RxY3RtNjQ4IGNvbXBhcmV0b3RtYWcgICAwLjAgICAwICAgIC0+ICAtMQorZHFjdG02NDkgY29tcGFyZXRvdG1hZyAgIDAuMCAgLTAgICAgLT4gIC0xCitkcWN0bTY1MCBjb21wYXJldG90bWFnICAgMC4wICAtMC4wICAtPiAgIDAKK2RxY3RtNjUxIGNvbXBhcmV0b3RtYWcgICAwLjAgICAwLjAgIC0+ICAgMAorZHFjdG02NTIgY29tcGFyZXRvdG1hZyAgLTAuMCAgIDAgICAgLT4gIC0xCitkcWN0bTY1MyBjb21wYXJldG90bWFnICAtMC4wICAtMCAgICAtPiAgLTEKK2RxY3RtNjU0IGNvbXBhcmV0b3RtYWcgIC0wLjAgIC0wLjAgIC0+ICAgMAorZHFjdG02NTUgY29tcGFyZXRvdG1hZyAgLTAuMCAgIDAuMCAgLT4gICAwCisKK2RxY3RtNjU2IGNvbXBhcmV0b3RtYWcgIC0wRTEgICAwLjAgIC0+ICAgMQorZHFjdG02NTcgY29tcGFyZXRvdG1hZyAgLTBFMiAgIDAuMCAgLT4gICAxCitkcWN0bTY1OCBjb21wYXJldG90bWFnICAgMEUxICAgMC4wICAtPiAgIDEKK2RxY3RtNjU5IGNvbXBhcmV0b3RtYWcgICAwRTIgICAwLjAgIC0+ICAgMQorZHFjdG02NjAgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDAgICAgLT4gICAxCitkcWN0bTY2MSBjb21wYXJldG90bWFnICAtMEUyICAgMCAgICAtPiAgIDEKK2RxY3RtNjYyIGNvbXBhcmV0b3RtYWcgICAwRTEgICAwICAgIC0+ICAgMQorZHFjdG02NjMgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDAgICAgLT4gICAxCitkcWN0bTY2NCBjb21wYXJldG90bWFnICAtMEUxICAtMEUxICAtPiAgIDAKK2RxY3RtNjY1IGNvbXBhcmV0b3RtYWcgIC0wRTIgIC0wRTEgIC0+ICAgMQorZHFjdG02NjYgY29tcGFyZXRvdG1hZyAgIDBFMSAgLTBFMSAgLT4gICAwCitkcWN0bTY2NyBjb21wYXJldG90bWFnICAgMEUyICAtMEUxICAtPiAgIDEKK2RxY3RtNjY4IGNvbXBhcmV0b3RtYWcgIC0wRTEgIC0wRTIgIC0+ICAtMQorZHFjdG02NjkgY29tcGFyZXRvdG1hZyAgLTBFMiAgLTBFMiAgLT4gICAwCitkcWN0bTY3MCBjb21wYXJldG90bWFnICAgMEUxICAtMEUyICAtPiAgLTEKK2RxY3RtNjcxIGNvbXBhcmV0b3RtYWcgICAwRTIgIC0wRTIgIC0+ICAgMAorZHFjdG02NzIgY29tcGFyZXRvdG1hZyAgLTBFMSAgIDBFMSAgLT4gICAwCitkcWN0bTY3MyBjb21wYXJldG90bWFnICAtMEUyICAgMEUxICAtPiAgIDEKK2RxY3RtNjc0IGNvbXBhcmV0b3RtYWcgICAwRTEgICAwRTEgIC0+ICAgMAorZHFjdG02NzUgY29tcGFyZXRvdG1hZyAgIDBFMiAgIDBFMSAgLT4gICAxCitkcWN0bTY3NiBjb21wYXJldG90bWFnICAtMEUxICAgMEUyICAtPiAgLTEKK2RxY3RtNjc3IGNvbXBhcmV0b3RtYWcgIC0wRTIgICAwRTIgIC0+ICAgMAorZHFjdG02NzggY29tcGFyZXRvdG1hZyAgIDBFMSAgIDBFMiAgLT4gIC0xCitkcWN0bTY3OSBjb21wYXJldG90bWFnICAgMEUyICAgMEUyICAtPiAgIDAKKworLS0gdHJhaWxpbmcgemVyb3M7IHVuaXQteQorZHFjdG02ODAgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyICAgICAgICAgICAgLT4gICAwCitkcWN0bTY4MSBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMCAgICAgICAgICAtPiAgIDEKK2RxY3RtNjgyIGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMCAgICAgICAgIC0+ICAgMQorZHFjdG02ODMgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMCAgICAgICAgLT4gICAxCitkcWN0bTY4NCBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMCAgICAgICAtPiAgIDEKK2RxY3RtNjg1IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMCAgICAgIC0+ICAgMQorZHFjdG02ODYgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMCAgICAgLT4gICAxCitkcWN0bTY4NyBjb21wYXJldG90bWFnICAgMTIgICAgMTIuMDAwMDAwMCAgICAtPiAgIDEKK2RxY3RtNjg4IGNvbXBhcmV0b3RtYWcgICAxMiAgICAxMi4wMDAwMDAwMCAgIC0+ICAgMQorZHFjdG02ODkgY29tcGFyZXRvdG1hZyAgIDEyICAgIDEyLjAwMDAwMDAwMCAgLT4gICAxCitkcWN0bTY5MCBjb21wYXJldG90bWFnICAgMTIgICAgICAgICAgICAgIDEyICAtPiAgIDAKK2RxY3RtNjkxIGNvbXBhcmV0b3RtYWcgICAxMi4wICAgICAgICAgICAgMTIgIC0+ICAtMQorZHFjdG02OTIgY29tcGFyZXRvdG1hZyAgIDEyLjAwICAgICAgICAgICAxMiAgLT4gIC0xCitkcWN0bTY5MyBjb21wYXJldG90bWFnICAgMTIuMDAwICAgICAgICAgIDEyICAtPiAgLTEKK2RxY3RtNjk0IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwICAgICAgICAgMTIgIC0+ICAtMQorZHFjdG02OTUgY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwICAgICAgICAxMiAgLT4gIC0xCitkcWN0bTY5NiBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwICAgICAgIDEyICAtPiAgLTEKK2RxY3RtNjk3IGNvbXBhcmV0b3RtYWcgICAxMi4wMDAwMDAwICAgICAgMTIgIC0+ICAtMQorZHFjdG02OTggY29tcGFyZXRvdG1hZyAgIDEyLjAwMDAwMDAwICAgICAxMiAgLT4gIC0xCitkcWN0bTY5OSBjb21wYXJldG90bWFnICAgMTIuMDAwMDAwMDAwICAgIDEyICAtPiAgLTEKKworLS0gb2xkIGxvbmcgb3BlcmFuZCBjaGVja3MKK2RxY3RtNzAxIGNvbXBhcmV0b3RtYWcgMTIzNDU2NzgwMDAgIDEgIC0+ICAgMQorZHFjdG03MDIgY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4MDAwICAgLT4gIC0xCitkcWN0bTcwMyBjb21wYXJldG90bWFnIDEyMzQ1Njc4MDAgICAxICAtPiAgIDEKK2RxY3RtNzA0IGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODAwICAgIC0+ICAtMQorZHFjdG03MDUgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODkwICAgMSAgLT4gICAxCitkcWN0bTcwNiBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5MCAgICAtPiAgLTEKK2RxY3RtNzA3IGNvbXBhcmV0b3RtYWcgMTIzNDU2Nzg5MSAgIDEgIC0+ICAgMQorZHFjdG03MDggY29tcGFyZXRvdG1hZyAxIDEyMzQ1Njc4OTEgICAgLT4gIC0xCitkcWN0bTcwOSBjb21wYXJldG90bWFnIDEyMzQ1Njc4OTAxICAxICAtPiAgIDEKK2RxY3RtNzEwIGNvbXBhcmV0b3RtYWcgMSAxMjM0NTY3ODkwMSAgIC0+ICAtMQorZHFjdG03MTEgY29tcGFyZXRvdG1hZyAxMjM0NTY3ODk2ICAgMSAgLT4gICAxCitkcWN0bTcxMiBjb21wYXJldG90bWFnIDEgMTIzNDU2Nzg5NiAgICAtPiAgLTEKK2RxY3RtNzEzIGNvbXBhcmV0b3RtYWcgLTEyMzQ1Njc4OTEgIDEgIC0+ICAgMQorZHFjdG03MTQgY29tcGFyZXRvdG1hZyAxIC0xMjM0NTY3ODkxICAgLT4gIC0xCitkcWN0bTcxNSBjb21wYXJldG90bWFnIC0xMjM0NTY3ODkwMSAxICAtPiAgIDEKK2RxY3RtNzE2IGNvbXBhcmV0b3RtYWcgMSAtMTIzNDU2Nzg5MDEgIC0+ICAtMQorZHFjdG03MTcgY29tcGFyZXRvdG1hZyAtMTIzNDU2Nzg5NiAgMSAgLT4gICAxCitkcWN0bTcxOCBjb21wYXJldG90bWFnIDEgLTEyMzQ1Njc4OTYgICAtPiAgLTEKKworLS0gb2xkIHJlc2lkdWUgY2FzZXMKK2RxY3RtNzQwIGNvbXBhcmV0b3RtYWcgIDEgIDAuOTk5OTk5OSAgIC0+ICAgMQorZHFjdG03NDEgY29tcGFyZXRvdG1hZyAgMSAgMC45OTk5OTkgICAgLT4gICAxCitkcWN0bTc0MiBjb21wYXJldG90bWFnICAxICAwLjk5OTk5ICAgICAtPiAgIDEKK2RxY3RtNzQzIGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMCAgICAgIC0+ICAgMQorZHFjdG03NDQgY29tcGFyZXRvdG1hZyAgMSAgMS4wMDAwMSAgICAgLT4gIC0xCitkcWN0bTc0NSBjb21wYXJldG90bWFnICAxICAxLjAwMDAwMSAgICAtPiAgLTEKK2RxY3RtNzQ2IGNvbXBhcmV0b3RtYWcgIDEgIDEuMDAwMDAwMSAgIC0+ICAtMQorZHFjdG03NTAgY29tcGFyZXRvdG1hZyAgMC45OTk5OTk5ICAxICAgLT4gIC0xCitkcWN0bTc1MSBjb21wYXJldG90bWFnICAwLjk5OTk5OSAgIDEgICAtPiAgLTEKK2RxY3RtNzUyIGNvbXBhcmV0b3RtYWcgIDAuOTk5OTkgICAgMSAgIC0+ICAtMQorZHFjdG03NTMgY29tcGFyZXRvdG1hZyAgMS4wMDAwICAgICAxICAgLT4gIC0xCitkcWN0bTc1NCBjb21wYXJldG90bWFnICAxLjAwMDAxICAgIDEgICAtPiAgIDEKK2RxY3RtNzU1IGNvbXBhcmV0b3RtYWcgIDEuMDAwMDAxICAgMSAgIC0+ICAgMQorZHFjdG03NTYgY29tcGFyZXRvdG1hZyAgMS4wMDAwMDAxICAxICAgLT4gICAxCisKKy0tIFNwZWNpYWxzCitkcWN0bTc4MCBjb21wYXJldG90bWFnICBJbmYgIC1JbmYgICAtPiAgMAorZHFjdG03ODEgY29tcGFyZXRvdG1hZyAgSW5mICAtMTAwMCAgLT4gIDEKK2RxY3RtNzgyIGNvbXBhcmV0b3RtYWcgIEluZiAgLTEgICAgIC0+ICAxCitkcWN0bTc4MyBjb21wYXJldG90bWFnICBJbmYgIC0wICAgICAtPiAgMQorZHFjdG03ODQgY29tcGFyZXRvdG1hZyAgSW5mICAgMCAgICAgLT4gIDEKK2RxY3RtNzg1IGNvbXBhcmV0b3RtYWcgIEluZiAgIDEgICAgIC0+ICAxCitkcWN0bTc4NiBjb21wYXJldG90bWFnICBJbmYgICAxMDAwICAtPiAgMQorZHFjdG03ODcgY29tcGFyZXRvdG1hZyAgSW5mICAgSW5mICAgLT4gIDAKK2RxY3RtNzg4IGNvbXBhcmV0b3RtYWcgLTEwMDAgIEluZiAgIC0+IC0xCitkcWN0bTc4OSBjb21wYXJldG90bWFnIC1JbmYgICBJbmYgICAtPiAgMAorZHFjdG03OTAgY29tcGFyZXRvdG1hZyAtMSAgICAgSW5mICAgLT4gLTEKK2RxY3RtNzkxIGNvbXBhcmV0b3RtYWcgLTAgICAgIEluZiAgIC0+IC0xCitkcWN0bTc5MiBjb21wYXJldG90bWFnICAwICAgICBJbmYgICAtPiAtMQorZHFjdG03OTMgY29tcGFyZXRvdG1hZyAgMSAgICAgSW5mICAgLT4gLTEKK2RxY3RtNzk0IGNvbXBhcmV0b3RtYWcgIDEwMDAgIEluZiAgIC0+IC0xCitkcWN0bTc5NSBjb21wYXJldG90bWFnICBJbmYgICBJbmYgICAtPiAgMAorCitkcWN0bTgwMCBjb21wYXJldG90bWFnIC1JbmYgIC1JbmYgICAtPiAgMAorZHFjdG04MDEgY29tcGFyZXRvdG1hZyAtSW5mICAtMTAwMCAgLT4gIDEKK2RxY3RtODAyIGNvbXBhcmV0b3RtYWcgLUluZiAgLTEgICAgIC0+ICAxCitkcWN0bTgwMyBjb21wYXJldG90bWFnIC1JbmYgIC0wICAgICAtPiAgMQorZHFjdG04MDQgY29tcGFyZXRvdG1hZyAtSW5mICAgMCAgICAgLT4gIDEKK2RxY3RtODA1IGNvbXBhcmV0b3RtYWcgLUluZiAgIDEgICAgIC0+ICAxCitkcWN0bTgwNiBjb21wYXJldG90bWFnIC1JbmYgICAxMDAwICAtPiAgMQorZHFjdG04MDcgY29tcGFyZXRvdG1hZyAtSW5mICAgSW5mICAgLT4gIDAKK2RxY3RtODA4IGNvbXBhcmV0b3RtYWcgLUluZiAgLUluZiAgIC0+ICAwCitkcWN0bTgwOSBjb21wYXJldG90bWFnIC0xMDAwIC1JbmYgICAtPiAtMQorZHFjdG04MTAgY29tcGFyZXRvdG1hZyAtMSAgICAtSW5mICAgLT4gLTEKK2RxY3RtODExIGNvbXBhcmV0b3RtYWcgLTAgICAgLUluZiAgIC0+IC0xCitkcWN0bTgxMiBjb21wYXJldG90bWFnICAwICAgIC1JbmYgICAtPiAtMQorZHFjdG04MTMgY29tcGFyZXRvdG1hZyAgMSAgICAtSW5mICAgLT4gLTEKK2RxY3RtODE0IGNvbXBhcmV0b3RtYWcgIDEwMDAgLUluZiAgIC0+IC0xCitkcWN0bTgxNSBjb21wYXJldG90bWFnICBJbmYgIC1JbmYgICAtPiAgMAorCitkcWN0bTgyMSBjb21wYXJldG90bWFnICBOYU4gLUluZiAgICAtPiAgMQorZHFjdG04MjIgY29tcGFyZXRvdG1hZyAgTmFOIC0xMDAwICAgLT4gIDEKK2RxY3RtODIzIGNvbXBhcmV0b3RtYWcgIE5hTiAtMSAgICAgIC0+ICAxCitkcWN0bTgyNCBjb21wYXJldG90bWFnICBOYU4gLTAgICAgICAtPiAgMQorZHFjdG04MjUgY29tcGFyZXRvdG1hZyAgTmFOICAwICAgICAgLT4gIDEKK2RxY3RtODI2IGNvbXBhcmV0b3RtYWcgIE5hTiAgMSAgICAgIC0+ICAxCitkcWN0bTgyNyBjb21wYXJldG90bWFnICBOYU4gIDEwMDAgICAtPiAgMQorZHFjdG04MjggY29tcGFyZXRvdG1hZyAgTmFOICBJbmYgICAgLT4gIDEKK2RxY3RtODI5IGNvbXBhcmV0b3RtYWcgIE5hTiAgTmFOICAgIC0+ICAwCitkcWN0bTgzMCBjb21wYXJldG90bWFnIC1JbmYgIE5hTiAgICAtPiAgLTEKK2RxY3RtODMxIGNvbXBhcmV0b3RtYWcgLTEwMDAgTmFOICAgIC0+ICAtMQorZHFjdG04MzIgY29tcGFyZXRvdG1hZyAtMSAgICBOYU4gICAgLT4gIC0xCitkcWN0bTgzMyBjb21wYXJldG90bWFnIC0wICAgIE5hTiAgICAtPiAgLTEKK2RxY3RtODM0IGNvbXBhcmV0b3RtYWcgIDAgICAgTmFOICAgIC0+ICAtMQorZHFjdG04MzUgY29tcGFyZXRvdG1hZyAgMSAgICBOYU4gICAgLT4gIC0xCitkcWN0bTgzNiBjb21wYXJldG90bWFnICAxMDAwIE5hTiAgICAtPiAgLTEKK2RxY3RtODM3IGNvbXBhcmV0b3RtYWcgIEluZiAgTmFOICAgIC0+ICAtMQorZHFjdG04MzggY29tcGFyZXRvdG1hZyAtTmFOIC1OYU4gICAgLT4gIDAKK2RxY3RtODM5IGNvbXBhcmV0b3RtYWcgK05hTiAtTmFOICAgIC0+ICAwCitkcWN0bTg0MCBjb21wYXJldG90bWFnIC1OYU4gK05hTiAgICAtPiAgMAorCitkcWN0bTg0MSBjb21wYXJldG90bWFnICBzTmFOIC1zTmFOICAtPiAgMAorZHFjdG04NDIgY29tcGFyZXRvdG1hZyAgc05hTiAtTmFOICAgLT4gIC0xCitkcWN0bTg0MyBjb21wYXJldG90bWFnICBzTmFOIC1JbmYgICAtPiAgMQorZHFjdG04NDQgY29tcGFyZXRvdG1hZyAgc05hTiAtMTAwMCAgLT4gIDEKK2RxY3RtODQ1IGNvbXBhcmV0b3RtYWcgIHNOYU4gLTEgICAgIC0+ICAxCitkcWN0bTg0NiBjb21wYXJldG90bWFnICBzTmFOIC0wICAgICAtPiAgMQorZHFjdG04NDcgY29tcGFyZXRvdG1hZyAgc05hTiAgMCAgICAgLT4gIDEKK2RxY3RtODQ4IGNvbXBhcmV0b3RtYWcgIHNOYU4gIDEgICAgIC0+ICAxCitkcWN0bTg0OSBjb21wYXJldG90bWFnICBzTmFOICAxMDAwICAtPiAgMQorZHFjdG04NTAgY29tcGFyZXRvdG1hZyAgc05hTiAgTmFOICAgLT4gIC0xCitkcWN0bTg1MSBjb21wYXJldG90bWFnICBzTmFOIHNOYU4gICAtPiAgMAorCitkcWN0bTg1MiBjb21wYXJldG90bWFnIC1zTmFOIHNOYU4gICAtPiAgMAorZHFjdG04NTMgY29tcGFyZXRvdG1hZyAtTmFOICBzTmFOICAgLT4gIDEKK2RxY3RtODU0IGNvbXBhcmV0b3RtYWcgLUluZiAgc05hTiAgIC0+ICAtMQorZHFjdG04NTUgY29tcGFyZXRvdG1hZyAtMTAwMCBzTmFOICAgLT4gIC0xCitkcWN0bTg1NiBjb21wYXJldG90bWFnIC0xICAgIHNOYU4gICAtPiAgLTEKK2RxY3RtODU3IGNvbXBhcmV0b3RtYWcgLTAgICAgc05hTiAgIC0+ICAtMQorZHFjdG04NTggY29tcGFyZXRvdG1hZyAgMCAgICBzTmFOICAgLT4gIC0xCitkcWN0bTg1OSBjb21wYXJldG90bWFnICAxICAgIHNOYU4gICAtPiAgLTEKK2RxY3RtODYwIGNvbXBhcmV0b3RtYWcgIDEwMDAgc05hTiAgIC0+ICAtMQorZHFjdG04NjEgY29tcGFyZXRvdG1hZyAgSW5mICBzTmFOICAgLT4gIC0xCitkcWN0bTg2MiBjb21wYXJldG90bWFnICBOYU4gIHNOYU4gICAtPiAgMQorZHFjdG04NjMgY29tcGFyZXRvdG1hZyAgc05hTiBzTmFOICAgLT4gIDAKKworZHFjdG04NzEgY29tcGFyZXRvdG1hZyAgLXNOYU4gLXNOYU4gIC0+ICAwCitkcWN0bTg3MiBjb21wYXJldG90bWFnICAtc05hTiAtTmFOICAgLT4gIC0xCitkcWN0bTg3MyBjb21wYXJldG90bWFnICAtc05hTiAtSW5mICAgLT4gIDEKK2RxY3RtODc0IGNvbXBhcmV0b3RtYWcgIC1zTmFOIC0xMDAwICAtPiAgMQorZHFjdG04NzUgY29tcGFyZXRvdG1hZyAgLXNOYU4gLTEgICAgIC0+ICAxCitkcWN0bTg3NiBjb21wYXJldG90bWFnICAtc05hTiAtMCAgICAgLT4gIDEKK2RxY3RtODc3IGNvbXBhcmV0b3RtYWcgIC1zTmFOICAwICAgICAtPiAgMQorZHFjdG04NzggY29tcGFyZXRvdG1hZyAgLXNOYU4gIDEgICAgIC0+ICAxCitkcWN0bTg3OSBjb21wYXJldG90bWFnICAtc05hTiAgMTAwMCAgLT4gIDEKK2RxY3RtODgwIGNvbXBhcmV0b3RtYWcgIC1zTmFOICBOYU4gICAtPiAgLTEKK2RxY3RtODgxIGNvbXBhcmV0b3RtYWcgIC1zTmFOIHNOYU4gICAtPiAgMAorCitkcWN0bTg4MiBjb21wYXJldG90bWFnIC1zTmFOIC1zTmFOICAgLT4gIDAKK2RxY3RtODgzIGNvbXBhcmV0b3RtYWcgLU5hTiAgLXNOYU4gICAtPiAgMQorZHFjdG04ODQgY29tcGFyZXRvdG1hZyAtSW5mICAtc05hTiAgIC0+ICAtMQorZHFjdG04ODUgY29tcGFyZXRvdG1hZyAtMTAwMCAtc05hTiAgIC0+ICAtMQorZHFjdG04ODYgY29tcGFyZXRvdG1hZyAtMSAgICAtc05hTiAgIC0+ICAtMQorZHFjdG04ODcgY29tcGFyZXRvdG1hZyAtMCAgICAtc05hTiAgIC0+ICAtMQorZHFjdG04ODggY29tcGFyZXRvdG1hZyAgMCAgICAtc05hTiAgIC0+ICAtMQorZHFjdG04ODkgY29tcGFyZXRvdG1hZyAgMSAgICAtc05hTiAgIC0+ICAtMQorZHFjdG04OTAgY29tcGFyZXRvdG1hZyAgMTAwMCAtc05hTiAgIC0+ICAtMQorZHFjdG04OTEgY29tcGFyZXRvdG1hZyAgSW5mICAtc05hTiAgIC0+ICAtMQorZHFjdG04OTIgY29tcGFyZXRvdG1hZyAgTmFOICAtc05hTiAgIC0+ICAxCitkcWN0bTg5MyBjb21wYXJldG90bWFnICBzTmFOIC1zTmFOICAgLT4gIDAKKworLS0gTmFOcyB3aXRoIHBheWxvYWQKK2RxY3RtOTYwIGNvbXBhcmV0b3RtYWcgIE5hTjkgLUluZiAgIC0+ICAxCitkcWN0bTk2MSBjb21wYXJldG90bWFnICBOYU44ICA5OTkgICAtPiAgMQorZHFjdG05NjIgY29tcGFyZXRvdG1hZyAgTmFONzcgSW5mICAgLT4gIDEKK2RxY3RtOTYzIGNvbXBhcmV0b3RtYWcgLU5hTjY3IE5hTjUgIC0+ICAxCitkcWN0bTk2NCBjb21wYXJldG90bWFnIC1JbmYgIC1OYU40ICAtPiAgLTEKK2RxY3RtOTY1IGNvbXBhcmV0b3RtYWcgLTk5OSAgLU5hTjMzIC0+ICAtMQorZHFjdG05NjYgY29tcGFyZXRvdG1hZyAgSW5mICAgTmFOMiAgLT4gIC0xCisKK2RxY3RtOTcwIGNvbXBhcmV0b3RtYWcgLU5hTjQxIC1OYU40MiAtPiAtMQorZHFjdG05NzEgY29tcGFyZXRvdG1hZyArTmFONDEgLU5hTjQyIC0+IC0xCitkcWN0bTk3MiBjb21wYXJldG90bWFnIC1OYU40MSArTmFONDIgLT4gLTEKK2RxY3RtOTczIGNvbXBhcmV0b3RtYWcgK05hTjQxICtOYU40MiAtPiAtMQorZHFjdG05NzQgY29tcGFyZXRvdG1hZyAtTmFONDIgLU5hTjAxIC0+ICAxCitkcWN0bTk3NSBjb21wYXJldG90bWFnICtOYU40MiAtTmFOMDEgLT4gIDEKK2RxY3RtOTc2IGNvbXBhcmV0b3RtYWcgLU5hTjQyICtOYU4wMSAtPiAgMQorZHFjdG05NzcgY29tcGFyZXRvdG1hZyArTmFONDIgK05hTjAxIC0+ICAxCisKK2RxY3RtOTgwIGNvbXBhcmV0b3RtYWcgLXNOYU43NzEgLXNOYU43NzIgLT4gLTEKK2RxY3RtOTgxIGNvbXBhcmV0b3RtYWcgK3NOYU43NzEgLXNOYU43NzIgLT4gLTEKK2RxY3RtOTgyIGNvbXBhcmV0b3RtYWcgLXNOYU43NzEgK3NOYU43NzIgLT4gLTEKK2RxY3RtOTgzIGNvbXBhcmV0b3RtYWcgK3NOYU43NzEgK3NOYU43NzIgLT4gLTEKK2RxY3RtOTg0IGNvbXBhcmV0b3RtYWcgLXNOYU43NzIgLXNOYU43NzEgLT4gIDEKK2RxY3RtOTg1IGNvbXBhcmV0b3RtYWcgK3NOYU43NzIgLXNOYU43NzEgLT4gIDEKK2RxY3RtOTg2IGNvbXBhcmV0b3RtYWcgLXNOYU43NzIgK3NOYU43NzEgLT4gIDEKK2RxY3RtOTg3IGNvbXBhcmV0b3RtYWcgK3NOYU43NzIgK3NOYU43NzEgLT4gIDEKKworZHFjdG05OTEgY29tcGFyZXRvdG1hZyAtc05hTjk5IC1JbmYgICAgLT4gIDEKK2RxY3RtOTkyIGNvbXBhcmV0b3RtYWcgIHNOYU45OCAtMTEgICAgIC0+ICAxCitkcWN0bTk5MyBjb21wYXJldG90bWFnICBzTmFOOTcgIE5hTiAgICAtPiAtMQorZHFjdG05OTQgY29tcGFyZXRvdG1hZyAgc05hTjE2IHNOYU45NCAgLT4gLTEKK2RxY3RtOTk1IGNvbXBhcmV0b3RtYWcgIE5hTjg1ICBzTmFOODMgIC0+ICAxCitkcWN0bTk5NiBjb21wYXJldG90bWFnIC1JbmYgICAgc05hTjkyICAtPiAtMQorZHFjdG05OTcgY29tcGFyZXRvdG1hZyAgMDg4ICAgIHNOYU44MSAgLT4gLTEKK2RxY3RtOTk4IGNvbXBhcmV0b3RtYWcgIEluZiAgICBzTmFOOTAgIC0+IC0xCitkcWN0bTk5OSBjb21wYXJldG90bWFnICBOYU4gICAtc05hTjg5ICAtPiAgMQorCistLSBzcHJlYWQgemVyb3MKK2RxY3RtMTExMCBjb21wYXJldG90bWFnICAgMEUtNjE0MyAgMCAgICAgICAgLT4gIC0xCitkcWN0bTExMTEgY29tcGFyZXRvdG1hZyAgIDBFLTYxNDMgLTAgICAgICAgIC0+ICAtMQorZHFjdG0xMTEyIGNvbXBhcmV0b3RtYWcgIC0wRS02MTQzICAwICAgICAgICAtPiAgLTEKK2RxY3RtMTExMyBjb21wYXJldG90bWFnICAtMEUtNjE0MyAtMCAgICAgICAgLT4gIC0xCitkcWN0bTExMTQgY29tcGFyZXRvdG1hZyAgIDBFLTYxNDMgIDBFKzYxNDQgICAtPiAgLTEKK2RxY3RtMTExNSBjb21wYXJldG90bWFnICAgMEUtNjE0MyAtMEUrNjE0NCAgIC0+ICAtMQorZHFjdG0xMTE2IGNvbXBhcmV0b3RtYWcgIC0wRS02MTQzICAwRSs2MTQ0ICAgLT4gIC0xCitkcWN0bTExMTcgY29tcGFyZXRvdG1hZyAgLTBFLTYxNDMgLTBFKzYxNDQgICAtPiAgLTEKK2RxY3RtMTExOCBjb21wYXJldG90bWFnICAgMCAgICAgICAwRSs2MTQ0ICAgLT4gIC0xCitkcWN0bTExMTkgY29tcGFyZXRvdG1hZyAgIDAgICAgICAtMEUrNjE0NCAgIC0+ICAtMQorZHFjdG0xMTIwIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgIDBFKzYxNDQgICAtPiAgLTEKK2RxY3RtMTEyMSBjb21wYXJldG90bWFnICAtMCAgICAgIC0wRSs2MTQ0ICAgLT4gIC0xCisKK2RxY3RtMTEzMCBjb21wYXJldG90bWFnICAgMEUrNjE0NCAgMCAgICAgICAgLT4gICAxCitkcWN0bTExMzEgY29tcGFyZXRvdG1hZyAgIDBFKzYxNDQgLTAgICAgICAgIC0+ICAgMQorZHFjdG0xMTMyIGNvbXBhcmV0b3RtYWcgIC0wRSs2MTQ0ICAwICAgICAgICAtPiAgIDEKK2RxY3RtMTEzMyBjb21wYXJldG90bWFnICAtMEUrNjE0NCAtMCAgICAgICAgLT4gICAxCitkcWN0bTExMzQgY29tcGFyZXRvdG1hZyAgIDBFKzYxNDQgIDBFLTYxNDMgICAtPiAgIDEKK2RxY3RtMTEzNSBjb21wYXJldG90bWFnICAgMEUrNjE0NCAtMEUtNjE0MyAgIC0+ICAgMQorZHFjdG0xMTM2IGNvbXBhcmV0b3RtYWcgIC0wRSs2MTQ0ICAwRS02MTQzICAgLT4gICAxCitkcWN0bTExMzcgY29tcGFyZXRvdG1hZyAgLTBFKzYxNDQgLTBFLTYxNDMgICAtPiAgIDEKK2RxY3RtMTEzOCBjb21wYXJldG90bWFnICAgMCAgICAgICAwRS02MTQzICAgLT4gICAxCitkcWN0bTExMzkgY29tcGFyZXRvdG1hZyAgIDAgICAgICAtMEUtNjE0MyAgIC0+ICAgMQorZHFjdG0xMTQwIGNvbXBhcmV0b3RtYWcgIC0wICAgICAgIDBFLTYxNDMgICAtPiAgIDEKK2RxY3RtMTE0MSBjb21wYXJldG90bWFnICAtMCAgICAgIC0wRS02MTQzICAgLT4gICAxCisKKy0tIE51bGwgdGVzdHMKK2RxY3RtOTk5MCBjb21wYXJldG90bWFnIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFjdG05OTkxIGNvbXBhcmV0b3RtYWcgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvcHkuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzYyNDMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvcHkuZGVjVGVzdApAQCAtMCwwICsxLDg4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQ29weS5kZWNUZXN0IC0tIHF1aWV0IGRlY1F1YWQgY29weSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZHFjcHkwMDEgY29weSAgICAgICArNy41MCAgLT4gNy41MAorCistLSBJbmZpbml0aWVzCitkcWNweTAxMSBjb3B5ICBJbmZpbml0eSAgICAtPiBJbmZpbml0eQorZHFjcHkwMTIgY29weSAgLUluZmluaXR5ICAgLT4gLUluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorZHFjcHkwMjEgY29weSAgICAgICAgIE5hTiAgLT4gTmFOCitkcWNweTAyMiBjb3B5ICAgICAgICAtTmFOICAtPiAtTmFOCitkcWNweTAyMyBjb3B5ICAgICAgICBzTmFOICAtPiBzTmFOCitkcWNweTAyNCBjb3B5ICAgICAgIC1zTmFOICAtPiAtc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkcWNweTAzMSBjb3B5ICAgICAgIE5hTjEwICAtPiBOYU4xMAorZHFjcHkwMzIgY29weSAgICAgIC1OYU4xMCAgLT4gLU5hTjEwCitkcWNweTAzMyBjb3B5ICAgICAgc05hTjEwICAtPiBzTmFOMTAKK2RxY3B5MDM0IGNvcHkgICAgIC1zTmFOMTAgIC0+IC1zTmFOMTAKK2RxY3B5MDM1IGNvcHkgICAgICAgTmFONyAgIC0+IE5hTjcKK2RxY3B5MDM2IGNvcHkgICAgICAtTmFONyAgIC0+IC1OYU43CitkcWNweTAzNyBjb3B5ICAgICAgc05hTjEwMSAtPiBzTmFOMTAxCitkcWNweTAzOCBjb3B5ICAgICAtc05hTjEwMSAtPiAtc05hTjEwMQorCistLSBmaW5pdGVzCitkcWNweTEwMSBjb3B5ICAgICAgICAgIDcgICAtPiA3CitkcWNweTEwMiBjb3B5ICAgICAgICAgLTcgICAtPiAtNworZHFjcHkxMDMgY29weSAgICAgICAgIDc1ICAgLT4gNzUKK2RxY3B5MTA0IGNvcHkgICAgICAgIC03NSAgIC0+IC03NQorZHFjcHkxMDUgY29weSAgICAgICA3LjUwICAgLT4gNy41MAorZHFjcHkxMDYgY29weSAgICAgIC03LjUwICAgLT4gLTcuNTAKK2RxY3B5MTA3IGNvcHkgICAgICAgNy41MDAgIC0+IDcuNTAwCitkcWNweTEwOCBjb3B5ICAgICAgLTcuNTAwICAtPiAtNy41MDAKKworLS0gemVyb3MKK2RxY3B5MTExIGNvcHkgICAgICAgICAgMCAgIC0+IDAKK2RxY3B5MTEyIGNvcHkgICAgICAgICAtMCAgIC0+IC0wCitkcWNweTExMyBjb3B5ICAgICAgIDBFKzQgICAtPiAwRSs0CitkcWNweTExNCBjb3B5ICAgICAgLTBFKzQgICAtPiAtMEUrNAorZHFjcHkxMTUgY29weSAgICAgMC4wMDAwICAgLT4gMC4wMDAwCitkcWNweTExNiBjb3B5ICAgIC0wLjAwMDAgICAtPiAtMC4wMDAwCitkcWNweTExNyBjb3B5ICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RxY3B5MTE4IGNvcHkgICAgIC0wRS0xNDEgIC0+IC0wRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxY3B5MTIxIGNvcHkgICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNweTEyMiBjb3B5ICAtMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MiAgICAtPiAtMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MgorZHFjcHkxMjMgY29weSAgIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKK2RxY3B5MTI0IGNvcHkgIC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxICAgIC0+IC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcWNweTEzMSBjb3B5ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFjcHkxMzIgY29weSAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE0MworZHFjcHkxMzMgY29weSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3B5MTM0IGNvcHkgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNzYKKworZHFjcHkxMzUgY29weSAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE3NgorZHFjcHkxMzYgY29weSAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3B5MTM3IGNvcHkgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gLTFFLTYxNDMKK2RxY3B5MTM4IGNvcHkgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weUFicy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvcHlBYnMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmJjYjRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvcHlBYnMuZGVjVGVzdApAQCAtMCwwICsxLDg4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQ29weUFicy5kZWNUZXN0IC0tIHF1aWV0IGRlY1F1YWQgY29weSBhbmQgc2V0IHNpZ24gdG8gemVybyAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZHFjcGEwMDEgY29weWFicyAgICAgICArNy41MCAgLT4gNy41MAorCistLSBJbmZpbml0aWVzCitkcWNwYTAxMSBjb3B5YWJzICBJbmZpbml0eSAgICAtPiBJbmZpbml0eQorZHFjcGEwMTIgY29weWFicyAgLUluZmluaXR5ICAgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkcWNwYTAyMSBjb3B5YWJzICAgICAgICAgTmFOICAtPiBOYU4KK2RxY3BhMDIyIGNvcHlhYnMgICAgICAgIC1OYU4gIC0+IE5hTgorZHFjcGEwMjMgY29weWFicyAgICAgICAgc05hTiAgLT4gc05hTgorZHFjcGEwMjQgY29weWFicyAgICAgICAtc05hTiAgLT4gc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkcWNwYTAzMSBjb3B5YWJzICAgICAgIE5hTjEwICAtPiBOYU4xMAorZHFjcGEwMzIgY29weWFicyAgICAgIC1OYU4xNSAgLT4gTmFOMTUKK2RxY3BhMDMzIGNvcHlhYnMgICAgICBzTmFOMTUgIC0+IHNOYU4xNQorZHFjcGEwMzQgY29weWFicyAgICAgLXNOYU4xMCAgLT4gc05hTjEwCitkcWNwYTAzNSBjb3B5YWJzICAgICAgIE5hTjcgICAtPiBOYU43CitkcWNwYTAzNiBjb3B5YWJzICAgICAgLU5hTjcgICAtPiBOYU43CitkcWNwYTAzNyBjb3B5YWJzICAgICAgc05hTjEwMSAtPiBzTmFOMTAxCitkcWNwYTAzOCBjb3B5YWJzICAgICAtc05hTjEwMSAtPiBzTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RxY3BhMTAxIGNvcHlhYnMgICAgICAgICAgNyAgIC0+IDcKK2RxY3BhMTAyIGNvcHlhYnMgICAgICAgICAtNyAgIC0+IDcKK2RxY3BhMTAzIGNvcHlhYnMgICAgICAgICA3NSAgIC0+IDc1CitkcWNwYTEwNCBjb3B5YWJzICAgICAgICAtNzUgICAtPiA3NQorZHFjcGExMDUgY29weWFicyAgICAgICA3LjEwICAgLT4gNy4xMAorZHFjcGExMDYgY29weWFicyAgICAgIC03LjEwICAgLT4gNy4xMAorZHFjcGExMDcgY29weWFicyAgICAgICA3LjUwMCAgLT4gNy41MDAKK2RxY3BhMTA4IGNvcHlhYnMgICAgICAtNy41MDAgIC0+IDcuNTAwCisKKy0tIHplcm9zCitkcWNwYTExMSBjb3B5YWJzICAgICAgICAgIDAgICAtPiAwCitkcWNwYTExMiBjb3B5YWJzICAgICAgICAgLTAgICAtPiAwCitkcWNwYTExMyBjb3B5YWJzICAgICAgIDBFKzYgICAtPiAwRSs2CitkcWNwYTExNCBjb3B5YWJzICAgICAgLTBFKzYgICAtPiAwRSs2CitkcWNwYTExNSBjb3B5YWJzICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RxY3BhMTE2IGNvcHlhYnMgICAgLTAuMDAwMCAgIC0+IDAuMDAwMAorZHFjcGExMTcgY29weWFicyAgICAgIDBFLTE0MSAgLT4gMEUtMTQxCitkcWNwYTExOCBjb3B5YWJzICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxY3BhMTIxIGNvcHlhYnMgICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNwYTEyMiBjb3B5YWJzICAtMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MiAgICAtPiAgMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MgorZHFjcGExMjMgY29weWFicyAgIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKK2RxY3BhMTI0IGNvcHlhYnMgIC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxICAgIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcWNwYTEzMSBjb3B5YWJzICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFjcGExMzIgY29weWFicyAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE0MworZHFjcGExMzMgY29weWFicyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3BhMTM0IGNvcHlhYnMgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNzYKKworZHFjcGExMzUgY29weWFicyAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NgorZHFjcGExMzYgY29weWFicyAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3BhMTM3IGNvcHlhYnMgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNDMKK2RxY3BhMTM4IGNvcHlhYnMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weU5lZ2F0ZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvcHlOZWdhdGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjUzZjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUNvcHlOZWdhdGUuZGVjVGVzdApAQCAtMCwwICsxLDg4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxQ29weU5lZ2F0ZS5kZWNUZXN0IC0tIHF1aWV0IGRlY1F1YWQgY29weSBhbmQgbmVnYXRlICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFNhbml0eSBjaGVjaworZHFjcG4wMDEgY29weW5lZ2F0ZSAgICAgICArNy41MCAgLT4gLTcuNTAKKworLS0gSW5maW5pdGllcworZHFjcG4wMTEgY29weW5lZ2F0ZSAgSW5maW5pdHkgICAgLT4gLUluZmluaXR5CitkcWNwbjAxMiBjb3B5bmVnYXRlICAtSW5maW5pdHkgICAtPiBJbmZpbml0eQorCistLSBOYU5zLCAwIHBheWxvYWQKK2RxY3BuMDIxIGNvcHluZWdhdGUgICAgICAgICBOYU4gIC0+IC1OYU4KK2RxY3BuMDIyIGNvcHluZWdhdGUgICAgICAgIC1OYU4gIC0+IE5hTgorZHFjcG4wMjMgY29weW5lZ2F0ZSAgICAgICAgc05hTiAgLT4gLXNOYU4KK2RxY3BuMDI0IGNvcHluZWdhdGUgICAgICAgLXNOYU4gIC0+IHNOYU4KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZHFjcG4wMzEgY29weW5lZ2F0ZSAgICAgICBOYU4xMyAgLT4gLU5hTjEzCitkcWNwbjAzMiBjb3B5bmVnYXRlICAgICAgLU5hTjEzICAtPiBOYU4xMworZHFjcG4wMzMgY29weW5lZ2F0ZSAgICAgIHNOYU4xMyAgLT4gLXNOYU4xMworZHFjcG4wMzQgY29weW5lZ2F0ZSAgICAgLXNOYU4xMyAgLT4gc05hTjEzCitkcWNwbjAzNSBjb3B5bmVnYXRlICAgICAgIE5hTjcwICAtPiAtTmFONzAKK2RxY3BuMDM2IGNvcHluZWdhdGUgICAgICAtTmFONzAgIC0+IE5hTjcwCitkcWNwbjAzNyBjb3B5bmVnYXRlICAgICAgc05hTjEwMSAtPiAtc05hTjEwMQorZHFjcG4wMzggY29weW5lZ2F0ZSAgICAgLXNOYU4xMDEgLT4gc05hTjEwMQorCistLSBmaW5pdGVzCitkcWNwbjEwMSBjb3B5bmVnYXRlICAgICAgICAgIDcgICAtPiAtNworZHFjcG4xMDIgY29weW5lZ2F0ZSAgICAgICAgIC03ICAgLT4gNworZHFjcG4xMDMgY29weW5lZ2F0ZSAgICAgICAgIDc1ICAgLT4gLTc1CitkcWNwbjEwNCBjb3B5bmVnYXRlICAgICAgICAtNzUgICAtPiA3NQorZHFjcG4xMDUgY29weW5lZ2F0ZSAgICAgICA3LjUwICAgLT4gLTcuNTAKK2RxY3BuMTA2IGNvcHluZWdhdGUgICAgICAtNy41MCAgIC0+IDcuNTAKK2RxY3BuMTA3IGNvcHluZWdhdGUgICAgICAgNy41MDAgIC0+IC03LjUwMAorZHFjcG4xMDggY29weW5lZ2F0ZSAgICAgIC03LjUwMCAgLT4gNy41MDAKKworLS0gemVyb3MKK2RxY3BuMTExIGNvcHluZWdhdGUgICAgICAgICAgMCAgIC0+IC0wCitkcWNwbjExMiBjb3B5bmVnYXRlICAgICAgICAgLTAgICAtPiAwCitkcWNwbjExMyBjb3B5bmVnYXRlICAgICAgIDBFKzQgICAtPiAtMEUrNAorZHFjcG4xMTQgY29weW5lZ2F0ZSAgICAgIC0wRSs0ICAgLT4gMEUrNAorZHFjcG4xMTUgY29weW5lZ2F0ZSAgICAgMC4wMDAwICAgLT4gLTAuMDAwMAorZHFjcG4xMTYgY29weW5lZ2F0ZSAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitkcWNwbjExNyBjb3B5bmVnYXRlICAgICAgMEUtMTQxICAtPiAtMEUtMTQxCitkcWNwbjExOCBjb3B5bmVnYXRlICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxY3BuMTIxIGNvcHluZWdhdGUgICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+IC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNwbjEyMiBjb3B5bmVnYXRlICAtMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MiAgICAtPiAgMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MgorZHFjcG4xMjMgY29weW5lZ2F0ZSAgIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKK2RxY3BuMTI0IGNvcHluZWdhdGUgIC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxICAgIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcWNwbjEzMSBjb3B5bmVnYXRlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFjcG4xMzIgY29weW5lZ2F0ZSAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE0MworZHFjcG4xMzMgY29weW5lZ2F0ZSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3BuMTM0IGNvcHluZWdhdGUgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gLTFFLTYxNzYKKworZHFjcG4xMzUgY29weW5lZ2F0ZSAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NgorZHFjcG4xMzYgY29weW5lZ2F0ZSAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3BuMTM3IGNvcHluZWdhdGUgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNDMKK2RxY3BuMTM4IGNvcHluZWdhdGUgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weVNpZ24uZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFDb3B5U2lnbi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YjVlNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxQ29weVNpZ24uZGVjVGVzdApAQCAtMCwwICsxLDE3NSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUNvcHlTaWduLmRlY1Rlc3QgLS0gcXVpZXQgZGVjUXVhZCBjb3B5IHdpdGggc2lnbiBmcm9tIHJocyAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2RxY3BzMDAxIGNvcHlzaWduICAgICAgICs3LjUwICAgICAxMSAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2RxY3BzMDExIGNvcHlzaWduICBJbmZpbml0eSAgICAgICAxMSAtPiBJbmZpbml0eQorZHFjcHMwMTIgY29weXNpZ24gIC1JbmZpbml0eSAgICAgIDExIC0+IEluZmluaXR5CisKKy0tIE5hTnMsIDAgcGF5bG9hZAorZHFjcHMwMjEgY29weXNpZ24gICAgICAgICBOYU4gICAgIDExIC0+IE5hTgorZHFjcHMwMjIgY29weXNpZ24gICAgICAgIC1OYU4gICAgIDExIC0+IE5hTgorZHFjcHMwMjMgY29weXNpZ24gICAgICAgIHNOYU4gICAgIDExIC0+IHNOYU4KK2RxY3BzMDI0IGNvcHlzaWduICAgICAgIC1zTmFOICAgICAxMSAtPiBzTmFOCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RxY3BzMDMxIGNvcHlzaWduICAgICAgIE5hTjEwICAgICAxMSAtPiBOYU4xMAorZHFjcHMwMzIgY29weXNpZ24gICAgICAtTmFOMTAgICAgIDExIC0+IE5hTjEwCitkcWNwczAzMyBjb3B5c2lnbiAgICAgIHNOYU4xMCAgICAgMTEgLT4gc05hTjEwCitkcWNwczAzNCBjb3B5c2lnbiAgICAgLXNOYU4xMCAgICAgMTEgLT4gc05hTjEwCitkcWNwczAzNSBjb3B5c2lnbiAgICAgICBOYU43ICAgICAgMTEgLT4gTmFONworZHFjcHMwMzYgY29weXNpZ24gICAgICAtTmFONyAgICAgIDExIC0+IE5hTjcKK2RxY3BzMDM3IGNvcHlzaWduICAgICAgc05hTjEwMSAgICAxMSAtPiBzTmFOMTAxCitkcWNwczAzOCBjb3B5c2lnbiAgICAgLXNOYU4xMDEgICAgMTEgLT4gc05hTjEwMQorCistLSBmaW5pdGVzCitkcWNwczEwMSBjb3B5c2lnbiAgICAgICAgICA3ICAgICAgMTEgLT4gNworZHFjcHMxMDIgY29weXNpZ24gICAgICAgICAtNyAgICAgIDExIC0+IDcKK2RxY3BzMTAzIGNvcHlzaWduICAgICAgICAgNzUgICAgICAxMSAtPiA3NQorZHFjcHMxMDQgY29weXNpZ24gICAgICAgIC03NSAgICAgIDExIC0+IDc1CitkcWNwczEwNSBjb3B5c2lnbiAgICAgICA3LjUwICAgICAgMTEgLT4gNy41MAorZHFjcHMxMDYgY29weXNpZ24gICAgICAtNy41MCAgICAgIDExIC0+IDcuNTAKK2RxY3BzMTA3IGNvcHlzaWduICAgICAgIDcuNTAwICAgICAxMSAtPiA3LjUwMAorZHFjcHMxMDggY29weXNpZ24gICAgICAtNy41MDAgICAgIDExIC0+IDcuNTAwCisKKy0tIHplcm9zCitkcWNwczExMSBjb3B5c2lnbiAgICAgICAgICAwICAgICAgMTEgLT4gMAorZHFjcHMxMTIgY29weXNpZ24gICAgICAgICAtMCAgICAgIDExIC0+IDAKK2RxY3BzMTEzIGNvcHlzaWduICAgICAgIDBFKzQgICAgICAxMSAtPiAwRSs0CitkcWNwczExNCBjb3B5c2lnbiAgICAgIC0wRSs0ICAgICAgMTEgLT4gMEUrNAorZHFjcHMxMTUgY29weXNpZ24gICAgIDAuMDAwMCAgICAgIDExIC0+IDAuMDAwMAorZHFjcHMxMTYgY29weXNpZ24gICAgLTAuMDAwMCAgICAgIDExIC0+IDAuMDAwMAorZHFjcHMxMTcgY29weXNpZ24gICAgICAwRS0xNDEgICAgIDExIC0+IDBFLTE0MQorZHFjcHMxMTggY29weXNpZ24gICAgIC0wRS0xNDEgICAgIDExIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFjcHMxMjEgY29weXNpZ24gICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyIDggIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNwczEyMiBjb3B5c2lnbiAgLTI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgOCAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxY3BzMTIzIGNvcHlzaWduICAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSA4ICAtPiAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorZHFjcHMxMjQgY29weXNpZ24gIC0xMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxIDggIC0+ICAxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxMzQxCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcWNwczEzMSBjb3B5c2lnbiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgOCAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxY3BzMTMyIGNvcHlzaWduICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC0+ICAxRS02MTQzCitkcWNwczEzMyBjb3B5c2lnbiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgOCAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxY3BzMTM0IGNvcHlzaWduICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC0+ICAxRS02MTc2CisKK2RxY3BzMTM1IGNvcHlzaWduICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAtPiAgMUUtNjE3NgorZHFjcHMxMzYgY29weXNpZ24gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyA4IC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFjcHMxMzcgY29weXNpZ24gIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4IC0+ICAxRS02MTQzCitkcWNwczEzOCBjb3B5c2lnbiAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IDggLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CisKKy0tIHJlcGVhdCB3aXRoIG5lZ2F0aXZlIFJIUworCistLSBJbmZpbml0aWVzCitkcWNwczIxMSBjb3B5c2lnbiAgSW5maW5pdHkgICAgICAgLTM0IC0+IC1JbmZpbml0eQorZHFjcHMyMTIgY29weXNpZ24gIC1JbmZpbml0eSAgICAgIC0zNCAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkcWNwczIyMSBjb3B5c2lnbiAgICAgICAgIE5hTiAgICAgLTM0IC0+IC1OYU4KK2RxY3BzMjIyIGNvcHlzaWduICAgICAgICAtTmFOICAgICAtMzQgLT4gLU5hTgorZHFjcHMyMjMgY29weXNpZ24gICAgICAgIHNOYU4gICAgIC0zNCAtPiAtc05hTgorZHFjcHMyMjQgY29weXNpZ24gICAgICAgLXNOYU4gICAgIC0zNCAtPiAtc05hTgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCitkcWNwczIzMSBjb3B5c2lnbiAgICAgICBOYU4xMCAgICAgLTM0IC0+IC1OYU4xMAorZHFjcHMyMzIgY29weXNpZ24gICAgICAtTmFOMTAgICAgIC0zNCAtPiAtTmFOMTAKK2RxY3BzMjMzIGNvcHlzaWduICAgICAgc05hTjEwICAgICAtMzQgLT4gLXNOYU4xMAorZHFjcHMyMzQgY29weXNpZ24gICAgIC1zTmFOMTAgICAgIC0zNCAtPiAtc05hTjEwCitkcWNwczIzNSBjb3B5c2lnbiAgICAgICBOYU43ICAgICAgLTM0IC0+IC1OYU43CitkcWNwczIzNiBjb3B5c2lnbiAgICAgIC1OYU43ICAgICAgLTM0IC0+IC1OYU43CitkcWNwczIzNyBjb3B5c2lnbiAgICAgIHNOYU4xMDEgICAgLTM0IC0+IC1zTmFOMTAxCitkcWNwczIzOCBjb3B5c2lnbiAgICAgLXNOYU4xMDEgICAgLTM0IC0+IC1zTmFOMTAxCisKKy0tIGZpbml0ZXMKK2RxY3BzMzAxIGNvcHlzaWduICAgICAgICAgIDcgICAgICAtMzQgLT4gLTcKK2RxY3BzMzAyIGNvcHlzaWduICAgICAgICAgLTcgICAgICAtMzQgLT4gLTcKK2RxY3BzMzAzIGNvcHlzaWduICAgICAgICAgNzUgICAgICAtMzQgLT4gLTc1CitkcWNwczMwNCBjb3B5c2lnbiAgICAgICAgLTc1ICAgICAgLTM0IC0+IC03NQorZHFjcHMzMDUgY29weXNpZ24gICAgICAgNy41MCAgICAgIC0zNCAtPiAtNy41MAorZHFjcHMzMDYgY29weXNpZ24gICAgICAtNy41MCAgICAgIC0zNCAtPiAtNy41MAorZHFjcHMzMDcgY29weXNpZ24gICAgICAgNy41MDAgICAgIC0zNCAtPiAtNy41MDAKK2RxY3BzMzA4IGNvcHlzaWduICAgICAgLTcuNTAwICAgICAtMzQgLT4gLTcuNTAwCisKKy0tIHplcm9zCitkcWNwczMxMSBjb3B5c2lnbiAgICAgICAgICAwICAgICAgLTM0IC0+IC0wCitkcWNwczMxMiBjb3B5c2lnbiAgICAgICAgIC0wICAgICAgLTM0IC0+IC0wCitkcWNwczMxMyBjb3B5c2lnbiAgICAgICAwRSs0ICAgICAgLTM0IC0+IC0wRSs0CitkcWNwczMxNCBjb3B5c2lnbiAgICAgIC0wRSs0ICAgICAgLTM0IC0+IC0wRSs0CitkcWNwczMxNSBjb3B5c2lnbiAgICAgMC4wMDAwICAgICAgLTM0IC0+IC0wLjAwMDAKK2RxY3BzMzE2IGNvcHlzaWduICAgIC0wLjAwMDAgICAgICAtMzQgLT4gLTAuMDAwMAorZHFjcHMzMTcgY29weXNpZ24gICAgICAwRS0xNDEgICAgIC0zNCAtPiAtMEUtMTQxCitkcWNwczMxOCBjb3B5c2lnbiAgICAgLTBFLTE0MSAgICAgLTM0IC0+IC0wRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxY3BzMzIxIGNvcHlzaWduICAgMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MiAtOSAtPiAtMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MgorZHFjcHMzMjIgY29weXNpZ24gIC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyIC05IC0+IC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcWNwczMyMyBjb3B5c2lnbiAgIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgLTkgLT4gLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKK2RxY3BzMzI0IGNvcHlzaWduICAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAtOSAtPiAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZHFjcHMzMzEgY29weXNpZ24gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0xICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxY3BzMzMyIGNvcHlzaWduICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTFFLTYxNDMKK2RxY3BzMzMzIGNvcHlzaWduICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcWNwczMzNCBjb3B5c2lnbiAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IC0xRS02MTc2CisKK2RxY3BzMzM1IGNvcHlzaWduICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMgLT4gLTFFLTYxNzYKK2RxY3BzMzM2IGNvcHlzaWduICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgLTMgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcWNwczMzNyBjb3B5c2lnbiAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zIC0+IC0xRS02MTQzCitkcWNwczMzOCBjb3B5c2lnbiAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0zIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorCistLSBPdGhlciBraW5kcyBvZiBSSFMKK2RxY3BzNDAxIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtMzQgLT4gLTcwMQorZHFjcHM0MDIgY29weXNpZ24gICAgICAgICAtNzIwICAgIC0zNCAtPiAtNzIwCitkcWNwczQwMyBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgLTAgIC0+IC03MDEKK2RxY3BzNDA0IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtMCAgLT4gLTcyMAorZHFjcHM0MDUgY29weXNpZ24gICAgICAgICAgNzAxICAgICswICAtPiAgNzAxCitkcWNwczQwNiBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgKzAgIC0+ICA3MjAKK2RxY3BzNDA3IGNvcHlzaWduICAgICAgICAgIDcwMSAgICArMzQgLT4gIDcwMQorZHFjcHM0MDggY29weXNpZ24gICAgICAgICAtNzIwICAgICszNCAtPiAgNzIwCisKK2RxY3BzNDEzIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtSW5mICAtPiAtNzAxCitkcWNwczQxNCBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLUluZiAgLT4gLTcyMAorZHFjcHM0MTUgY29weXNpZ24gICAgICAgICAgNzAxICAgICtJbmYgIC0+ICA3MDEKK2RxY3BzNDE2IGNvcHlzaWduICAgICAgICAgLTcyMCAgICArSW5mICAtPiAgNzIwCisKK2RxY3BzNDIwIGNvcHlzaWduICAgICAgICAgIDcwMSAgICAtTmFOICAtPiAtNzAxCitkcWNwczQyMSBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgLU5hTiAgLT4gLTcyMAorZHFjcHM0MjIgY29weXNpZ24gICAgICAgICAgNzAxICAgICtOYU4gIC0+ICA3MDEKK2RxY3BzNDIzIGNvcHlzaWduICAgICAgICAgLTcyMCAgICArTmFOICAtPiAgNzIwCitkcWNwczQyNSBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgK05hTjggLT4gIDcyMAorCitkcWNwczQyNiBjb3B5c2lnbiAgICAgICAgICA3MDEgICAgLXNOYU4gIC0+IC03MDEKK2RxY3BzNDI3IGNvcHlzaWduICAgICAgICAgLTcyMCAgICAtc05hTiAgLT4gLTcyMAorZHFjcHM0MjggY29weXNpZ24gICAgICAgICAgNzAxICAgICtzTmFOICAtPiAgNzAxCitkcWNwczQyOSBjb3B5c2lnbiAgICAgICAgIC03MjAgICAgK3NOYU4gIC0+ICA3MjAKK2RxY3BzNDMwIGNvcHlzaWduICAgICAgICAgLTcyMCAgICArc05hTjMgLT4gIDcyMAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxRGl2aWRlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxRGl2aWRlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFiYjkzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFEaXZpZGUuZGVjVGVzdApAQCAtMCwwICsxLDgwOCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcURpdmlkZS5kZWNUZXN0IC0tIGRlY1F1YWQgZGl2aXNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RxZGl2MDAxIGRpdmlkZSAgMSAgICAgMSAgICAtPiAgMQorZHFkaXYwMDIgZGl2aWRlICAyICAgICAxICAgIC0+ICAyCitkcWRpdjAwMyBkaXZpZGUgIDEgICAgIDIgICAgLT4gIDAuNQorZHFkaXYwMDQgZGl2aWRlICAyICAgICAyICAgIC0+ICAxCitkcWRpdjAwNSBkaXZpZGUgIDAgICAgIDEgICAgLT4gIDAKK2RxZGl2MDA2IGRpdmlkZSAgMCAgICAgMiAgICAtPiAgMAorZHFkaXYwMDcgZGl2aWRlICAxICAgICAzICAgIC0+ICAwLjMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMgSW5leGFjdCBSb3VuZGVkCitkcWRpdjAwOCBkaXZpZGUgIDIgICAgIDMgICAgLT4gIDAuNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MDA5IGRpdmlkZSAgMyAgICAgMyAgICAtPiAgMQorCitkcWRpdjAxMCBkaXZpZGUgIDIuNCAgIDEgICAgLT4gIDIuNAorZHFkaXYwMTEgZGl2aWRlICAyLjQgICAtMSAgIC0+ICAtMi40CitkcWRpdjAxMiBkaXZpZGUgIC0yLjQgIDEgICAgLT4gIC0yLjQKK2RxZGl2MDEzIGRpdmlkZSAgLTIuNCAgLTEgICAtPiAgMi40CitkcWRpdjAxNCBkaXZpZGUgIDIuNDAgIDEgICAgLT4gIDIuNDAKK2RxZGl2MDE1IGRpdmlkZSAgMi40MDAgMSAgICAtPiAgMi40MDAKK2RxZGl2MDE2IGRpdmlkZSAgMi40ICAgMiAgICAtPiAgMS4yCitkcWRpdjAxNyBkaXZpZGUgIDIuNDAwIDIgICAgLT4gIDEuMjAwCitkcWRpdjAxOCBkaXZpZGUgIDIuICAgIDIgICAgLT4gIDEKK2RxZGl2MDE5IGRpdmlkZSAgMjAgICAgMjAgICAtPiAgMQorCitkcWRpdjAyMCBkaXZpZGUgIDE4NyAgIDE4NyAgICAtPiAgMQorZHFkaXYwMjEgZGl2aWRlICA1ICAgICAyICAgICAgLT4gIDIuNQorZHFkaXYwMjIgZGl2aWRlICA1MCAgICAyMCAgICAgLT4gIDIuNQorZHFkaXYwMjMgZGl2aWRlICA1MDAgICAyMDAgICAgLT4gIDIuNQorZHFkaXYwMjQgZGl2aWRlICA1MC4wICAyMC4wICAgLT4gIDIuNQorZHFkaXYwMjUgZGl2aWRlICA1LjAwICAyLjAwICAgLT4gIDIuNQorZHFkaXYwMjYgZGl2aWRlICA1ICAgICAyLjAgICAgLT4gIDIuNQorZHFkaXYwMjcgZGl2aWRlICA1ICAgICAyLjAwMCAgLT4gIDIuNQorZHFkaXYwMjggZGl2aWRlICA1ICAgICAwLjIwICAgLT4gIDI1CitkcWRpdjAyOSBkaXZpZGUgIDUgICAgIDAuMjAwICAtPiAgMjUKK2RxZGl2MDMwIGRpdmlkZSAgMTAgICAgMSAgICAgIC0+ICAxMAorZHFkaXYwMzEgZGl2aWRlICAxMDAgICAxICAgICAgLT4gIDEwMAorZHFkaXYwMzIgZGl2aWRlICAxMDAwICAxICAgICAgLT4gIDEwMDAKK2RxZGl2MDMzIGRpdmlkZSAgMTAwMCAgMTAwICAgIC0+ICAxMAorCitkcWRpdjAzNSBkaXZpZGUgIDEgICAgIDIgICAgICAtPiAgMC41CitkcWRpdjAzNiBkaXZpZGUgIDEgICAgIDQgICAgICAtPiAgMC4yNQorZHFkaXYwMzcgZGl2aWRlICAxICAgICA4ICAgICAgLT4gIDAuMTI1CitkcWRpdjAzOCBkaXZpZGUgIDEgICAgIDE2ICAgICAtPiAgMC4wNjI1CitkcWRpdjAzOSBkaXZpZGUgIDEgICAgIDMyICAgICAtPiAgMC4wMzEyNQorZHFkaXYwNDAgZGl2aWRlICAxICAgICA2NCAgICAgLT4gIDAuMDE1NjI1CitkcWRpdjA0MSBkaXZpZGUgIDEgICAgLTIgICAgICAtPiAgLTAuNQorZHFkaXYwNDIgZGl2aWRlICAxICAgIC00ICAgICAgLT4gIC0wLjI1CitkcWRpdjA0MyBkaXZpZGUgIDEgICAgLTggICAgICAtPiAgLTAuMTI1CitkcWRpdjA0NCBkaXZpZGUgIDEgICAgLTE2ICAgICAtPiAgLTAuMDYyNQorZHFkaXYwNDUgZGl2aWRlICAxICAgIC0zMiAgICAgLT4gIC0wLjAzMTI1CitkcWRpdjA0NiBkaXZpZGUgIDEgICAgLTY0ICAgICAtPiAgLTAuMDE1NjI1CitkcWRpdjA0NyBkaXZpZGUgLTEgICAgIDIgICAgICAtPiAgLTAuNQorZHFkaXYwNDggZGl2aWRlIC0xICAgICA0ICAgICAgLT4gIC0wLjI1CitkcWRpdjA0OSBkaXZpZGUgLTEgICAgIDggICAgICAtPiAgLTAuMTI1CitkcWRpdjA1MCBkaXZpZGUgLTEgICAgIDE2ICAgICAtPiAgLTAuMDYyNQorZHFkaXYwNTEgZGl2aWRlIC0xICAgICAzMiAgICAgLT4gIC0wLjAzMTI1CitkcWRpdjA1MiBkaXZpZGUgLTEgICAgIDY0ICAgICAtPiAgLTAuMDE1NjI1CitkcWRpdjA1MyBkaXZpZGUgLTEgICAgLTIgICAgICAtPiAgMC41CitkcWRpdjA1NCBkaXZpZGUgLTEgICAgLTQgICAgICAtPiAgMC4yNQorZHFkaXYwNTUgZGl2aWRlIC0xICAgIC04ICAgICAgLT4gIDAuMTI1CitkcWRpdjA1NiBkaXZpZGUgLTEgICAgLTE2ICAgICAtPiAgMC4wNjI1CitkcWRpdjA1NyBkaXZpZGUgLTEgICAgLTMyICAgICAtPiAgMC4wMzEyNQorZHFkaXYwNTggZGl2aWRlIC0xICAgIC02NCAgICAgLT4gIDAuMDE1NjI1CisKKy0tIGJjZFRpbWUKK2RxZGl2MDYwIGRpdmlkZSAgMSA3ICAgICAgICAgICAgICAgICAgIC0+IDAuMTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyOSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MDYxIGRpdmlkZSAxLjIzNDU2NzggIDEuOTg3NjU0MyAgIC0+IDAuNjIxMTE3OTY4MDQ5MDcxNzEyMzE5MzkwNzUxMTk4NTM1OSBJbmV4YWN0IFJvdW5kZWQKKworLS0gICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkcWRpdjA2NyBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIDEgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxZGl2MDY4IGRpdmlkZSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgMSAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcWRpdjA2OSBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgIDEgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcWRpdjA3MCBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5OTk5ICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTk5OTk5OTk5OTk5CitkcWRpdjA3MSBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTk5OTk5OTk5OTkKK2RxZGl2MDcyIGRpdmlkZSAgOTk5OTk5OTk5OTk5OTk5ICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OTk5OTk5CitkcWRpdjA3MyBkaXZpZGUgIDk5OTk5OTk5OTk5OTk5ICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTk5OTk5OTk5CitkcWRpdjA3NCBkaXZpZGUgIDk5OTk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTk5OTk5OTkKK2RxZGl2MDc1IGRpdmlkZSAgOTk5OTk5OTk5OTk5ICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5OTk5CitkcWRpdjA3NiBkaXZpZGUgIDk5OTk5OTk5OTk5ICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTk5OTk5CitkcWRpdjA3NyBkaXZpZGUgIDk5OTk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTk5OTkKK2RxZGl2MDc4IGRpdmlkZSAgOTk5OTk5OTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5OTk5CitkcWRpdjA3OSBkaXZpZGUgIDk5OTk5OTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTk5CitkcWRpdjA4MCBkaXZpZGUgIDk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5OTkKK2RxZGl2MDgxIGRpdmlkZSAgOTk5OTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5OTk5CitkcWRpdjA4MiBkaXZpZGUgIDk5OTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTk5CitkcWRpdjA4MyBkaXZpZGUgIDk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5OTkKK2RxZGl2MDg0IGRpdmlkZSAgOTk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtPiAgOTk5CitkcWRpdjA4NSBkaXZpZGUgIDk5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDk5CitkcWRpdjA4NiBkaXZpZGUgIDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLT4gIDkKKworZHFkaXYwOTAgZGl2aWRlICAwLiAgICAgICAgICAgIDEgICAgLT4gIDAKK2RxZGl2MDkxIGRpdmlkZSAgLjAgICAgICAgICAgICAxICAgIC0+ICAwLjAKK2RxZGl2MDkyIGRpdmlkZSAgMC4wMCAgICAgICAgICAxICAgIC0+ICAwLjAwCitkcWRpdjA5MyBkaXZpZGUgIDAuMDBFKzkgICAgICAgMSAgICAtPiAgMEUrNworZHFkaXYwOTQgZGl2aWRlICAwLjAwMDBFLTUwICAgIDEgICAgLT4gIDBFLTU0CisKK2RxZGl2MDk1IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTggIC0+ICAxRSs4CitkcWRpdjA5NiBkaXZpZGUgIDEgICAgICAgICAgICAxRS05ICAtPiAgMUUrOQorZHFkaXYwOTcgZGl2aWRlICAxICAgICAgICAgICAgMUUtMTAgLT4gIDFFKzEwCitkcWRpdjA5OCBkaXZpZGUgIDEgICAgICAgICAgICAxRS0xMSAtPiAgMUUrMTEKK2RxZGl2MDk5IGRpdmlkZSAgMSAgICAgICAgICAgIDFFLTEyIC0+ICAxRSsxMgorCitkcWRpdjEwMCBkaXZpZGUgIDEgIDEgICAtPiAxCitkcWRpdjEwMSBkaXZpZGUgIDEgIDIgICAtPiAwLjUKK2RxZGl2MTAyIGRpdmlkZSAgMSAgMyAgIC0+IDAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTAzIGRpdmlkZSAgMSAgNCAgIC0+IDAuMjUKK2RxZGl2MTA0IGRpdmlkZSAgMSAgNSAgIC0+IDAuMgorZHFkaXYxMDUgZGl2aWRlICAxICA2ICAgLT4gMC4xNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY3IEluZXhhY3QgUm91bmRlZAorZHFkaXYxMDYgZGl2aWRlICAxICA3ICAgLT4gMC4xNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNDI5IEluZXhhY3QgUm91bmRlZAorZHFkaXYxMDcgZGl2aWRlICAxICA4ICAgLT4gMC4xMjUKK2RxZGl2MTA4IGRpdmlkZSAgMSAgOSAgIC0+IDAuMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTA5IGRpdmlkZSAgMSAgMTAgIC0+IDAuMQorZHFkaXYxMTAgZGl2aWRlICAxICAxICAgLT4gMQorZHFkaXYxMTEgZGl2aWRlICAyICAxICAgLT4gMgorZHFkaXYxMTIgZGl2aWRlICAzICAxICAgLT4gMworZHFkaXYxMTMgZGl2aWRlICA0ICAxICAgLT4gNAorZHFkaXYxMTQgZGl2aWRlICA1ICAxICAgLT4gNQorZHFkaXYxMTUgZGl2aWRlICA2ICAxICAgLT4gNgorZHFkaXYxMTYgZGl2aWRlICA3ICAxICAgLT4gNworZHFkaXYxMTcgZGl2aWRlICA4ICAxICAgLT4gOAorZHFkaXYxMTggZGl2aWRlICA5ICAxICAgLT4gOQorZHFkaXYxMTkgZGl2aWRlICAxMCAxICAgLT4gMTAKKworZHFkaXYxMjAgZGl2aWRlICAzRSsxIDAuMDAxICAtPiAzRSs0CitkcWRpdjEyMSBkaXZpZGUgIDIuMjAwIDIgICAgIC0+IDEuMTAwCisKK2RxZGl2MTMwIGRpdmlkZSAgMTIzNDUgIDQuOTk5ICAtPiAyNDY5LjQ5Mzg5ODc3OTc1NTk1MTE5MDIzODA0NzYwOTUyMiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjEzMSBkaXZpZGUgIDEyMzQ1ICA0Ljk5ICAgLT4gMjQ3My45NDc4OTU3OTE1ODMxNjYzMzI2NjUzMzA2NjEzMjMgIEluZXhhY3QgUm91bmRlZAorZHFkaXYxMzIgZGl2aWRlICAxMjM0NSAgNC45ICAgIC0+IDI1MTkuMzg3NzU1MTAyMDQwODE2MzI2NTMwNjEyMjQ0ODk4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTMzIGRpdmlkZSAgMTIzNDUgIDUgICAgICAtPiAyNDY5CitkcWRpdjEzNCBkaXZpZGUgIDEyMzQ1ICA1LjEgICAgLT4gMjQyMC41ODgyMzUyOTQxMTc2NDcwNTg4MjM1Mjk0MTE3NjUgIEluZXhhY3QgUm91bmRlZAorZHFkaXYxMzUgZGl2aWRlICAxMjM0NSAgNS4wMSAgIC0+IDI0NjQuMDcxODU2Mjg3NDI1MTQ5NzAwNTk4ODAyMzk1MjEwICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTM2IGRpdmlkZSAgMTIzNDUgIDUuMDAxICAtPiAyNDY4LjUwNjI5ODc0MDI1MTk0OTYxMDA3Nzk4NDQwMzExOSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3QgcG9zc2libHkgaW1wcmVjaXNlIHJlc3VsdHMKK2RxZGl2MjIwIGRpdmlkZSAzOTEgICA1OTcgLT4gIDAuNjU0OTQxMzczNTM0MzM4MzU4NDU4OTYxNDc0MDM2ODUwOSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIyMSBkaXZpZGUgMzkxICAtNTk3IC0+IC0wLjY1NDk0MTM3MzUzNDMzODM1ODQ1ODk2MTQ3NDAzNjg1MDkgIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMjIgZGl2aWRlIC0zOTEgIDU5NyAtPiAtMC42NTQ5NDEzNzM1MzQzMzgzNTg0NTg5NjE0NzQwMzY4NTA5ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjIzIGRpdmlkZSAtMzkxIC01OTcgLT4gIDAuNjU0OTQxMzczNTM0MzM4MzU4NDU4OTYxNDc0MDM2ODUwOSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3Qgc29tZSBjYXNlcyB0aGF0IGFyZSBjbG9zZSB0byBleHBvbmVudCBvdmVyZmxvdworZHFkaXYyNzAgZGl2aWRlIDEgMWU2MTQ0ICAgICAgICAgICAgICAgICAgLT4gMUUtNjE0NCAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCitkcWRpdjI3MSBkaXZpZGUgMSAwLjllNjE0NCAgICAgICAgICAgICAgICAtPiAxLjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExRS02MTQ0ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFkaXYyNzIgZGl2aWRlIDEgMC45OWU2MTQ0ICAgICAgICAgICAgICAgLT4gMS4wMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMUUtNjE0NCAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZGl2MjczIGRpdmlkZSAxIDAuOTk5OTk5OTk5OTk5OTk5OWU2MTQ0IC0+IDEuMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDFFLTYxNDQgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWRpdjI3NCBkaXZpZGUgOWU2MTQ0ICAgIDEgICAgICAgICAgICAgICAtPiA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NCBDbGFtcGVkCitkcWRpdjI3NSBkaXZpZGUgOS45ZTYxNDQgIDEgICAgICAgICAgICAgICAtPiA5LjkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NCBDbGFtcGVkCitkcWRpdjI3NiBkaXZpZGUgOS45OWU2MTQ0IDEgICAgICAgICAgICAgICAtPiA5Ljk5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NCBDbGFtcGVkCitkcWRpdjI3NyBkaXZpZGUgOS45OTk5OTk5OTk5OTk5OTllNjE0NCAxICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NCBDbGFtcGVkCisKK2RxZGl2Mjc4IGRpdmlkZSAxIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OWU2MTQ0IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWRpdjI3OSBkaXZpZGUgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTllNjE0NCAxICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorCistLSBEaXZpZGUgaW50byAwIHRlc3RzCitkcWRpdjMwMSBkaXZpZGUgICAgMCAgICA3ICAgICAtPiAwCitkcWRpdjMwMiBkaXZpZGUgICAgMCAgICA3RS01ICAtPiAwRSs1CitkcWRpdjMwMyBkaXZpZGUgICAgMCAgICA3RS0xICAtPiAwRSsxCitkcWRpdjMwNCBkaXZpZGUgICAgMCAgICA3RSsxICAtPiAwLjAKK2RxZGl2MzA1IGRpdmlkZSAgICAwICAgIDdFKzUgIC0+IDAuMDAwMDAKK2RxZGl2MzA2IGRpdmlkZSAgICAwICAgIDdFKzYgIC0+IDAuMDAwMDAwCitkcWRpdjMwNyBkaXZpZGUgICAgMCAgICA3RSs3ICAtPiAwRS03CitkcWRpdjMwOCBkaXZpZGUgICAgMCAgIDcwRS01ICAtPiAwRSs1CitkcWRpdjMwOSBkaXZpZGUgICAgMCAgIDcwRS0xICAtPiAwRSsxCitkcWRpdjMxMCBkaXZpZGUgICAgMCAgIDcwRSswICAtPiAwCitkcWRpdjMxMSBkaXZpZGUgICAgMCAgIDcwRSsxICAtPiAwLjAKK2RxZGl2MzEyIGRpdmlkZSAgICAwICAgNzBFKzUgIC0+IDAuMDAwMDAKK2RxZGl2MzEzIGRpdmlkZSAgICAwICAgNzBFKzYgIC0+IDAuMDAwMDAwCitkcWRpdjMxNCBkaXZpZGUgICAgMCAgIDcwRSs3ICAtPiAwRS03CitkcWRpdjMxNSBkaXZpZGUgICAgMCAgNzAwRS01ICAtPiAwRSs1CitkcWRpdjMxNiBkaXZpZGUgICAgMCAgNzAwRS0xICAtPiAwRSsxCitkcWRpdjMxNyBkaXZpZGUgICAgMCAgNzAwRSswICAtPiAwCitkcWRpdjMxOCBkaXZpZGUgICAgMCAgNzAwRSsxICAtPiAwLjAKK2RxZGl2MzE5IGRpdmlkZSAgICAwICA3MDBFKzUgIC0+IDAuMDAwMDAKK2RxZGl2MzIwIGRpdmlkZSAgICAwICA3MDBFKzYgIC0+IDAuMDAwMDAwCitkcWRpdjMyMSBkaXZpZGUgICAgMCAgNzAwRSs3ICAtPiAwRS03CitkcWRpdjMyMiBkaXZpZGUgICAgMCAgNzAwRSs3NyAtPiAwRS03NworCitkcWRpdjMzMSBkaXZpZGUgMEUtMyAgICA3RS01ICAtPiAwRSsyCitkcWRpdjMzMiBkaXZpZGUgMEUtMyAgICA3RS0xICAtPiAwLjAwCitkcWRpdjMzMyBkaXZpZGUgMEUtMyAgICA3RSsxICAtPiAwLjAwMDAKK2RxZGl2MzM0IGRpdmlkZSAwRS0zICAgIDdFKzUgIC0+IDBFLTgKK2RxZGl2MzM1IGRpdmlkZSAwRS0xICAgIDdFLTUgIC0+IDBFKzQKK2RxZGl2MzM2IGRpdmlkZSAwRS0xICAgIDdFLTEgIC0+IDAKK2RxZGl2MzM3IGRpdmlkZSAwRS0xICAgIDdFKzEgIC0+IDAuMDAKK2RxZGl2MzM4IGRpdmlkZSAwRS0xICAgIDdFKzUgIC0+IDAuMDAwMDAwCitkcWRpdjMzOSBkaXZpZGUgMEUrMSAgICA3RS01ICAtPiAwRSs2CitkcWRpdjM0MCBkaXZpZGUgMEUrMSAgICA3RS0xICAtPiAwRSsyCitkcWRpdjM0MSBkaXZpZGUgMEUrMSAgICA3RSsxICAtPiAwCitkcWRpdjM0MiBkaXZpZGUgMEUrMSAgICA3RSs1ICAtPiAwLjAwMDAKK2RxZGl2MzQzIGRpdmlkZSAwRSszICAgIDdFLTUgIC0+IDBFKzgKK2RxZGl2MzQ0IGRpdmlkZSAwRSszICAgIDdFLTEgIC0+IDBFKzQKK2RxZGl2MzQ1IGRpdmlkZSAwRSszICAgIDdFKzEgIC0+IDBFKzIKK2RxZGl2MzQ2IGRpdmlkZSAwRSszICAgIDdFKzUgIC0+IDAuMDAKKworLS0gVGhlc2Ugd2VyZSAnaW5wdXQgcm91bmRpbmcnCitkcWRpdjQ0MSBkaXZpZGUgMTIzNDU2NzgwMDAgMSAtPiAxMjM0NTY3ODAwMAorZHFkaXY0NDIgZGl2aWRlIDEgMTIzNDU2NzgwMDAgLT4gOC4xMDAwMDA2NjQyMDAwNTQ0NjQ0MDQ0NjYwODExNjYyMTlFLTExIEluZXhhY3QgUm91bmRlZAorZHFkaXY0NDMgZGl2aWRlIDEyMzQ1Njc4MDAgIDEgLT4gMTIzNDU2NzgwMAorZHFkaXY0NDQgZGl2aWRlIDEgMTIzNDU2NzgwMCAgLT4gOC4xMDAwMDA2NjQyMDAwNTQ0NjQ0MDQ0NjYwODExNjYyMTlFLTEwIEluZXhhY3QgUm91bmRlZAorZHFkaXY0NDUgZGl2aWRlIDEyMzQ1Njc4OTAgIDEgLT4gMTIzNDU2Nzg5MAorZHFkaXY0NDYgZGl2aWRlIDEgMTIzNDU2Nzg5MCAgLT4gOC4xMDAwMDAwNzM3MTAwMDA2NzA3NjEwMDYxMDM5MjUxNTZFLTEwIEluZXhhY3QgUm91bmRlZAorZHFkaXY0NDcgZGl2aWRlIDEyMzQ1Njc4OTEgIDEgLT4gMTIzNDU2Nzg5MQorZHFkaXY0NDggZGl2aWRlIDEgMTIzNDU2Nzg5MSAgLT4gOC4xMDAwMDAwNjcxNDkwMDA1NTY2NjUyMTQ2MTQ3NTQ2MjlFLTEwIEluZXhhY3QgUm91bmRlZAorZHFkaXY0NDkgZGl2aWRlIDEyMzQ1Njc4OTAxIDEgLT4gMTIzNDU2Nzg5MDEKK2RxZGl2NDUwIGRpdmlkZSAxIDEyMzQ1Njc4OTAxIC0+IDguMTAwMDAwMDczMDUzOTAwNjU4ODczMTMwMDQyMzc2NzYwRS0xMSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDUxIGRpdmlkZSAxMjM0NTY3ODk2ICAxIC0+IDEyMzQ1Njc4OTYKK2RxZGl2NDUyIGRpdmlkZSAxIDEyMzQ1Njc4OTYgIC0+IDguMTAwMDAwMDM0MzQ0MDAwMTQ1NjE4NTYwNjE3NDIyNjk3RS0xMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gaGlnaC1sb3dzCitkcWRpdjQ1MyBkaXZpZGUgMWUrMSAgIDEgICAgLT4gICAxRSsxCitkcWRpdjQ1NCBkaXZpZGUgMWUrMSAgIDEuMCAgLT4gICAxRSsxCitkcWRpdjQ1NSBkaXZpZGUgMWUrMSAgIDEuMDAgLT4gICAxRSsxCitkcWRpdjQ1NiBkaXZpZGUgMWUrMiAgIDIgICAgLT4gICA1RSsxCitkcWRpdjQ1NyBkaXZpZGUgMWUrMiAgIDIuMCAgLT4gICA1RSsxCitkcWRpdjQ1OCBkaXZpZGUgMWUrMiAgIDIuMDAgLT4gICA1RSsxCisKKy0tIHNvbWUgZnJvbSBJRUVFIGRpc2N1c3Npb25zCitkcWRpdjQ2MCBkaXZpZGUgM2UwICAgICAgMmUwICAgICAtPiAxLjUKK2RxZGl2NDYxIGRpdmlkZSAzMGUtMSAgICAyZTAgICAgIC0+IDEuNQorZHFkaXY0NjIgZGl2aWRlIDMwMGUtMiAgIDJlMCAgICAgLT4gMS41MAorZHFkaXY0NjQgZGl2aWRlIDMwMDBlLTMgIDJlMCAgICAgLT4gMS41MDAKK2RxZGl2NDY1IGRpdmlkZSAzZTAgICAgICAyMGUtMSAgIC0+IDEuNQorZHFkaXY0NjYgZGl2aWRlIDMwZS0xICAgIDIwZS0xICAgLT4gMS41CitkcWRpdjQ2NyBkaXZpZGUgMzAwZS0yICAgMjBlLTEgICAtPiAxLjUKK2RxZGl2NDY4IGRpdmlkZSAzMDAwZS0zICAyMGUtMSAgIC0+IDEuNTAKK2RxZGl2NDY5IGRpdmlkZSAzZTAgICAgICAyMDBlLTIgIC0+IDEuNQorZHFkaXY0NzAgZGl2aWRlIDMwZS0xICAgIDIwMGUtMiAgLT4gMS41CitkcWRpdjQ3MSBkaXZpZGUgMzAwZS0yICAgMjAwZS0yICAtPiAxLjUKK2RxZGl2NDcyIGRpdmlkZSAzMDAwZS0zICAyMDBlLTIgIC0+IDEuNQorZHFkaXY0NzMgZGl2aWRlIDNlMCAgICAgIDIwMDBlLTMgLT4gMS41CitkcWRpdjQ3NCBkaXZpZGUgMzBlLTEgICAgMjAwMGUtMyAtPiAxLjUKK2RxZGl2NDc1IGRpdmlkZSAzMDBlLTIgICAyMDAwZS0zIC0+IDEuNQorZHFkaXY0NzYgZGl2aWRlIDMwMDBlLTMgIDIwMDBlLTMgLT4gMS41CisKKy0tIHNvbWUgcmVjaXByb2NhbHMKK2RxZGl2NDgwIGRpdmlkZSAxICAgICAgICAxLjBFKzMzIC0+IDFFLTMzCitkcWRpdjQ4MSBkaXZpZGUgMSAgICAgICAgMTBFKzMzICAtPiAxRS0zNAorZHFkaXY0ODIgZGl2aWRlIDEgICAgICAgIDEuMEUtMzMgLT4gMUUrMzMKK2RxZGl2NDgzIGRpdmlkZSAxICAgICAgICAxMEUtMzMgIC0+IDFFKzMyCisKKy0tIFJNUyBkaXNjdXNzaW9uIHRhYmxlCitkcWRpdjQ4NCBkaXZpZGUgMGU1ICAgICAxZTMgLT4gICAwRSsyCitkcWRpdjQ4NSBkaXZpZGUgMGU1ICAgICAyZTMgLT4gICAwRSsyCitkcWRpdjQ4NiBkaXZpZGUgMGU1ICAgIDEwZTIgLT4gICAwRSszCitkcWRpdjQ4NyBkaXZpZGUgMGU1ICAgIDIwZTIgLT4gICAwRSszCitkcWRpdjQ4OCBkaXZpZGUgMGU1ICAgMTAwZTEgLT4gICAwRSs0CitkcWRpdjQ4OSBkaXZpZGUgMGU1ICAgMjAwZTEgLT4gICAwRSs0CisKK2RxZGl2NDkxIGRpdmlkZSAxZTUgICAgIDFlMyAtPiAgIDFFKzIKK2RxZGl2NDkyIGRpdmlkZSAxZTUgICAgIDJlMyAtPiAgIDVFKzEKK2RxZGl2NDkzIGRpdmlkZSAxZTUgICAgMTBlMiAtPiAgIDFFKzIKK2RxZGl2NDk0IGRpdmlkZSAxZTUgICAgMjBlMiAtPiAgIDVFKzEKK2RxZGl2NDk1IGRpdmlkZSAxZTUgICAxMDBlMSAtPiAgIDFFKzIKK2RxZGl2NDk2IGRpdmlkZSAxZTUgICAyMDBlMSAtPiAgIDVFKzEKKworLS0gdHJ5emVyb3MgY2FzZXMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitkcWRpdjQ5NyAgZGl2aWRlICAwRSs2MTA4IDEwMDBFLTMzICAtPiAwRSs2MTExIENsYW1wZWQKK2RxZGl2NDk4ICBkaXZpZGUgIDBFLTYxNzAgMTAwMEUrMzMgIC0+IDBFLTYxNzYgQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl91cAorCistLSBmb2N1cyBvbiB0cmFpbGluZyB6ZXJvcyBpc3N1ZXMKK2RxZGl2NTAwIGRpdmlkZSAgMSAgICAgIDkuOSAgICAtPiAgMC4xMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NTAxIGRpdmlkZSAgMSAgICAgIDkuMDkgICAtPiAgMC4xMTAwMTEwMDExMDAxMTAwMTEwMDExMDAxMTAwMTEwMDExICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NTAyIGRpdmlkZSAgMSAgICAgIDkuMDA5ICAtPiAgMC4xMTEwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMTEwICBJbmV4YWN0IFJvdW5kZWQKKworZHFkaXY1MTEgZGl2aWRlIDEgICAgICAgICAyICAgIC0+IDAuNQorZHFkaXY1MTIgZGl2aWRlIDEuMCAgICAgICAyICAgIC0+IDAuNQorZHFkaXY1MTMgZGl2aWRlIDEuMDAgICAgICAyICAgIC0+IDAuNTAKK2RxZGl2NTE0IGRpdmlkZSAxLjAwMCAgICAgMiAgICAtPiAwLjUwMAorZHFkaXY1MTUgZGl2aWRlIDEuMDAwMCAgICAyICAgIC0+IDAuNTAwMAorZHFkaXY1MTYgZGl2aWRlIDEuMDAwMDAgICAyICAgIC0+IDAuNTAwMDAKK2RxZGl2NTE3IGRpdmlkZSAxLjAwMDAwMCAgMiAgICAtPiAwLjUwMDAwMAorZHFkaXY1MTggZGl2aWRlIDEuMDAwMDAwMCAyICAgIC0+IDAuNTAwMDAwMAorZHFkaXY1MTkgZGl2aWRlIDEuMDAgICAgICAyLjAwIC0+IDAuNQorCitkcWRpdjUyMSBkaXZpZGUgMiAgICAxICAgICAgICAgLT4gMgorZHFkaXY1MjIgZGl2aWRlIDIgICAgMS4wICAgICAgIC0+IDIKK2RxZGl2NTIzIGRpdmlkZSAyICAgIDEuMDAgICAgICAtPiAyCitkcWRpdjUyNCBkaXZpZGUgMiAgICAxLjAwMCAgICAgLT4gMgorZHFkaXY1MjUgZGl2aWRlIDIgICAgMS4wMDAwICAgIC0+IDIKK2RxZGl2NTI2IGRpdmlkZSAyICAgIDEuMDAwMDAgICAtPiAyCitkcWRpdjUyNyBkaXZpZGUgMiAgICAxLjAwMDAwMCAgLT4gMgorZHFkaXY1MjggZGl2aWRlIDIgICAgMS4wMDAwMDAwIC0+IDIKK2RxZGl2NTI5IGRpdmlkZSAyLjAwIDEuMDAgICAgICAtPiAyCisKK2RxZGl2NTMwIGRpdmlkZSAgMi40MCAgIDIgICAgICAtPiAgMS4yMAorZHFkaXY1MzEgZGl2aWRlICAyLjQwICAgNCAgICAgIC0+ICAwLjYwCitkcWRpdjUzMiBkaXZpZGUgIDIuNDAgIDEwICAgICAgLT4gIDAuMjQKK2RxZGl2NTMzIGRpdmlkZSAgMi40MCAgIDIuMCAgICAtPiAgMS4yCitkcWRpdjUzNCBkaXZpZGUgIDIuNDAgICA0LjAgICAgLT4gIDAuNgorZHFkaXY1MzUgZGl2aWRlICAyLjQwICAxMC4wICAgIC0+ICAwLjI0CitkcWRpdjUzNiBkaXZpZGUgIDIuNDAgICAyLjAwICAgLT4gIDEuMgorZHFkaXY1MzcgZGl2aWRlICAyLjQwICAgNC4wMCAgIC0+ICAwLjYKK2RxZGl2NTM4IGRpdmlkZSAgMi40MCAgMTAuMDAgICAtPiAgMC4yNAorZHFkaXY1MzkgZGl2aWRlICAwLjkgICAgMC4xICAgIC0+ICA5CitkcWRpdjU0MCBkaXZpZGUgIDAuOSAgICAwLjAxICAgLT4gIDlFKzEKK2RxZGl2NTQxIGRpdmlkZSAgMC45ICAgIDAuMDAxICAtPiAgOUUrMgorZHFkaXY1NDIgZGl2aWRlICA1ICAgICAgMiAgICAgIC0+ICAyLjUKK2RxZGl2NTQzIGRpdmlkZSAgNSAgICAgIDIuMCAgICAtPiAgMi41CitkcWRpdjU0NCBkaXZpZGUgIDUgICAgICAyLjAwICAgLT4gIDIuNQorZHFkaXY1NDUgZGl2aWRlICA1ICAgICAgMjAgICAgIC0+ICAwLjI1CitkcWRpdjU0NiBkaXZpZGUgIDUgICAgICAyMC4wICAgLT4gIDAuMjUKK2RxZGl2NTQ3IGRpdmlkZSAgMi40MDAgIDIgICAgICAtPiAgMS4yMDAKK2RxZGl2NTQ4IGRpdmlkZSAgMi40MDAgIDIuMCAgICAtPiAgMS4yMAorZHFkaXY1NDkgZGl2aWRlICAyLjQwMCAgMi40MDAgIC0+ICAxCisKK2RxZGl2NTUwIGRpdmlkZSAgMjQwICAgIDEgICAgICAtPiAgMjQwCitkcWRpdjU1MSBkaXZpZGUgIDI0MCAgICAxMCAgICAgLT4gIDI0CitkcWRpdjU1MiBkaXZpZGUgIDI0MCAgICAxMDAgICAgLT4gIDIuNAorZHFkaXY1NTMgZGl2aWRlICAyNDAgICAgMTAwMCAgIC0+ICAwLjI0CitkcWRpdjU1NCBkaXZpZGUgIDI0MDAgICAxICAgICAgLT4gIDI0MDAKK2RxZGl2NTU1IGRpdmlkZSAgMjQwMCAgIDEwICAgICAtPiAgMjQwCitkcWRpdjU1NiBkaXZpZGUgIDI0MDAgICAxMDAgICAgLT4gIDI0CitkcWRpdjU1NyBkaXZpZGUgIDI0MDAgICAxMDAwICAgLT4gIDIuNAorCistLSArdmUgZXhwb25lbnQKK2RxZGl2NjAwIGRpdmlkZSAgMi40RSs5ICAgICAyICAtPiAgMS4yRSs5CitkcWRpdjYwMSBkaXZpZGUgIDIuNDBFKzkgICAgMiAgLT4gIDEuMjBFKzkKK2RxZGl2NjAyIGRpdmlkZSAgMi40MDBFKzkgICAyICAtPiAgMS4yMDBFKzkKK2RxZGl2NjAzIGRpdmlkZSAgMi40MDAwRSs5ICAyICAtPiAgMS4yMDAwRSs5CitkcWRpdjYwNCBkaXZpZGUgIDI0RSs4ICAgICAgMiAgLT4gIDEuMkUrOQorZHFkaXY2MDUgZGl2aWRlICAyNDBFKzcgICAgIDIgIC0+ICAxLjIwRSs5CitkcWRpdjYwNiBkaXZpZGUgIDI0MDBFKzYgICAgMiAgLT4gIDEuMjAwRSs5CitkcWRpdjYwNyBkaXZpZGUgIDI0MDAwRSs1ICAgMiAgLT4gIDEuMjAwMEUrOQorCistLSBtb3JlIHplcm9zLCBldGMuCitkcWRpdjczMSBkaXZpZGUgNS4wMCAxRS0zICAgIC0+IDUuMDBFKzMKK2RxZGl2NzMyIGRpdmlkZSAwMC4wMCAwLjAwMCAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkaXY3MzMgZGl2aWRlIDAwLjAwIDBFLTMgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWRpdjczNCBkaXZpZGUgIDAgICAgLTAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZGl2NzM1IGRpdmlkZSAtMCAgICAgMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkaXY3MzYgZGl2aWRlIC0wICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCisKK2RxZGl2NzQxIGRpdmlkZSAgMCAgICAtMSAgICAgLT4gLTAKK2RxZGl2NzQyIGRpdmlkZSAtMCAgICAtMSAgICAgLT4gIDAKK2RxZGl2NzQzIGRpdmlkZSAgMCAgICAgMSAgICAgLT4gIDAKK2RxZGl2NzQ0IGRpdmlkZSAtMCAgICAgMSAgICAgLT4gLTAKK2RxZGl2NzQ1IGRpdmlkZSAtMSAgICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzQ2IGRpdmlkZSAtMSAgICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzQ3IGRpdmlkZSAgMSAgICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzQ4IGRpdmlkZSAgMSAgICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkaXY3NTEgZGl2aWRlICAwLjAgIC0xICAgICAtPiAtMC4wCitkcWRpdjc1MiBkaXZpZGUgLTAuMCAgLTEgICAgIC0+ICAwLjAKK2RxZGl2NzUzIGRpdmlkZSAgMC4wICAgMSAgICAgLT4gIDAuMAorZHFkaXY3NTQgZGl2aWRlIC0wLjAgICAxICAgICAtPiAtMC4wCitkcWRpdjc1NSBkaXZpZGUgLTEuMCAgIDAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjc1NiBkaXZpZGUgLTEuMCAgLTAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjc1NyBkaXZpZGUgIDEuMCAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjc1OCBkaXZpZGUgIDEuMCAgLTAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2RxZGl2NzYxIGRpdmlkZSAgMCAgICAtMS4wICAgLT4gLTBFKzEKK2RxZGl2NzYyIGRpdmlkZSAtMCAgICAtMS4wICAgLT4gIDBFKzEKK2RxZGl2NzYzIGRpdmlkZSAgMCAgICAgMS4wICAgLT4gIDBFKzEKK2RxZGl2NzY0IGRpdmlkZSAtMCAgICAgMS4wICAgLT4gLTBFKzEKK2RxZGl2NzY1IGRpdmlkZSAtMSAgICAgMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzY2IGRpdmlkZSAtMSAgICAtMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzY3IGRpdmlkZSAgMSAgICAgMC4wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2NzY4IGRpdmlkZSAgMSAgICAtMC4wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkaXY3NzEgZGl2aWRlICAwLjAgIC0xLjAgICAtPiAtMAorZHFkaXY3NzIgZGl2aWRlIC0wLjAgIC0xLjAgICAtPiAgMAorZHFkaXY3NzMgZGl2aWRlICAwLjAgICAxLjAgICAtPiAgMAorZHFkaXY3NzQgZGl2aWRlIC0wLjAgICAxLjAgICAtPiAtMAorZHFkaXY3NzUgZGl2aWRlIC0xLjAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NzYgZGl2aWRlIC0xLjAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NzcgZGl2aWRlICAxLjAgICAwLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY3NzggZGl2aWRlICAxLjAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCistLSBTcGVjaWFscworZHFkaXY3ODAgZGl2aWRlICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjc4MSBkaXZpZGUgIEluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZHFkaXY3ODIgZGl2aWRlICBJbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RxZGl2NzgzIGRpdmlkZSAgSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkcWRpdjc4NCBkaXZpZGUgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZHFkaXY3ODUgZGl2aWRlICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RxZGl2Nzg2IGRpdmlkZSAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkcWRpdjc4NyBkaXZpZGUgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2Nzg4IGRpdmlkZSAtMTAwMCAgSW5mICAgLT4gLTBFLTYxNzYgQ2xhbXBlZAorZHFkaXY3ODkgZGl2aWRlIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjc5MCBkaXZpZGUgLTEgICAgIEluZiAgIC0+IC0wRS02MTc2IENsYW1wZWQKK2RxZGl2NzkxIGRpdmlkZSAtMCAgICAgSW5mICAgLT4gLTBFLTYxNzYgQ2xhbXBlZAorZHFkaXY3OTIgZGl2aWRlICAwICAgICBJbmYgICAtPiAgMEUtNjE3NiBDbGFtcGVkCitkcWRpdjc5MyBkaXZpZGUgIDEgICAgIEluZiAgIC0+ICAwRS02MTc2IENsYW1wZWQKK2RxZGl2Nzk0IGRpdmlkZSAgMTAwMCAgSW5mICAgLT4gIDBFLTYxNzYgQ2xhbXBlZAorZHFkaXY3OTUgZGl2aWRlICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxZGl2ODAwIGRpdmlkZSAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4MDEgZGl2aWRlIC1JbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RxZGl2ODAyIGRpdmlkZSAtSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkcWRpdjgwMyBkaXZpZGUgLUluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZHFkaXY4MDQgZGl2aWRlIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2RxZGl2ODA1IGRpdmlkZSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkcWRpdjgwNiBkaXZpZGUgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZHFkaXY4MDcgZGl2aWRlIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjgwOCBkaXZpZGUgLTEwMDAgIEluZiAgIC0+IC0wRS02MTc2IENsYW1wZWQKK2RxZGl2ODA5IGRpdmlkZSAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4MTAgZGl2aWRlIC0xICAgIC1JbmYgICAtPiAgMEUtNjE3NiBDbGFtcGVkCitkcWRpdjgxMSBkaXZpZGUgLTAgICAgLUluZiAgIC0+ICAwRS02MTc2IENsYW1wZWQKK2RxZGl2ODEyIGRpdmlkZSAgMCAgICAtSW5mICAgLT4gLTBFLTYxNzYgQ2xhbXBlZAorZHFkaXY4MTMgZGl2aWRlICAxICAgIC1JbmYgICAtPiAtMEUtNjE3NiBDbGFtcGVkCitkcWRpdjgxNCBkaXZpZGUgIDEwMDAgLUluZiAgIC0+IC0wRS02MTc2IENsYW1wZWQKK2RxZGl2ODE1IGRpdmlkZSAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcWRpdjgyMSBkaXZpZGUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2RxZGl2ODIyIGRpdmlkZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHFkaXY4MjMgZGl2aWRlICBOYU4gLTEgICAgICAtPiAgTmFOCitkcWRpdjgyNCBkaXZpZGUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2RxZGl2ODI1IGRpdmlkZSAgTmFOICAwICAgICAgLT4gIE5hTgorZHFkaXY4MjYgZGl2aWRlICBOYU4gIDEgICAgICAtPiAgTmFOCitkcWRpdjgyNyBkaXZpZGUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2RxZGl2ODI4IGRpdmlkZSAgTmFOICBJbmYgICAgLT4gIE5hTgorZHFkaXY4MjkgZGl2aWRlICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcWRpdjgzMCBkaXZpZGUgLUluZiAgTmFOICAgIC0+ICBOYU4KK2RxZGl2ODMxIGRpdmlkZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHFkaXY4MzIgZGl2aWRlIC0xICAgIE5hTiAgICAtPiAgTmFOCitkcWRpdjgzMyBkaXZpZGUgLTAgICAgTmFOICAgIC0+ICBOYU4KK2RxZGl2ODM0IGRpdmlkZSAgMCAgICBOYU4gICAgLT4gIE5hTgorZHFkaXY4MzUgZGl2aWRlICAxICAgIE5hTiAgICAtPiAgTmFOCitkcWRpdjgzNiBkaXZpZGUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2RxZGl2ODM3IGRpdmlkZSAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkcWRpdjg0MSBkaXZpZGUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0MiBkaXZpZGUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0MyBkaXZpZGUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0NCBkaXZpZGUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0NSBkaXZpZGUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0NiBkaXZpZGUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0NyBkaXZpZGUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0OCBkaXZpZGUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg0OSBkaXZpZGUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1MCBkaXZpZGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1MSBkaXZpZGUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1MiBkaXZpZGUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1MyBkaXZpZGUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1NCBkaXZpZGUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1NSBkaXZpZGUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1NiBkaXZpZGUgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1NyBkaXZpZGUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1OCBkaXZpZGUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg1OSBkaXZpZGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxZGl2ODYxIGRpdmlkZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2RxZGl2ODYyIGRpdmlkZSAgTmFOOCAgMTAwMCAgLT4gIE5hTjgKK2RxZGl2ODYzIGRpdmlkZSAgTmFONyAgSW5mICAgLT4gIE5hTjcKK2RxZGl2ODY0IGRpdmlkZSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK2RxZGl2ODY1IGRpdmlkZSAtSW5mICAgTmFONCAgLT4gIE5hTjQKK2RxZGl2ODY2IGRpdmlkZSAtMTAwMCAgTmFOMyAgLT4gIE5hTjMKK2RxZGl2ODY3IGRpdmlkZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKKworZHFkaXY4NzEgZGl2aWRlICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODcyIGRpdmlkZSAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg3MyBkaXZpZGUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4NzQgZGl2aWRlICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODc1IGRpdmlkZSAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg3NiBkaXZpZGUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4NzcgZGl2aWRlICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODc4IGRpdmlkZSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg3OSBkaXZpZGUgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkcWRpdjg4MSBkaXZpZGUgIC1OYU45ICAtSW5mICAgLT4gIC1OYU45CitkcWRpdjg4MiBkaXZpZGUgIC1OYU44ICAgMTAwMCAgLT4gIC1OYU44CitkcWRpdjg4MyBkaXZpZGUgIC1OYU43ICAgSW5mICAgLT4gIC1OYU43CitkcWRpdjg4NCBkaXZpZGUgIC1OYU42ICAtTmFONSAgLT4gIC1OYU42CitkcWRpdjg4NSBkaXZpZGUgIC1JbmYgICAtTmFONCAgLT4gIC1OYU40CitkcWRpdjg4NiBkaXZpZGUgIC0xMDAwICAtTmFOMyAgLT4gIC1OYU4zCitkcWRpdjg4NyBkaXZpZGUgICBJbmYgICAtTmFOMiAgLT4gIC1OYU4yCisKK2RxZGl2ODkxIGRpdmlkZSAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg5MiBkaXZpZGUgLXNOYU45OCAtMSAgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4OTMgZGl2aWRlIC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODk0IGRpdmlkZSAtc05hTjk2IC1zTmFOOTQgLT4gLU5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg5NSBkaXZpZGUgLU5hTjk1ICAtc05hTjkzIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4OTYgZGl2aWRlIC1JbmYgICAgLXNOYU45MiAtPiAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2ODk3IGRpdmlkZSAgMCAgICAgIC1zTmFOOTEgLT4gLU5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkcWRpdjg5OCBkaXZpZGUgIEluZiAgICAtc05hTjkwIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFkaXY4OTkgZGl2aWRlIC1OYU4gICAgLXNOYU44OSAtPiAtTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gVmFyaW91cyBmbGF2b3VycyBvZiBkaXZpZGUgYnkgMAorZHFkaXY5MDEgZGl2aWRlICAgIDAgICAgICAgMCAgIC0+ICBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWRpdjkwMiBkaXZpZGUgICAgMC4wRTUgICAwICAgLT4gIE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZGl2OTAzIGRpdmlkZSAgICAwLjAwMCAgIDAgICAtPiAgTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkaXY5MDQgZGl2aWRlICAgIDAuMDAwMSAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkwNSBkaXZpZGUgICAgMC4wMSAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTA2IGRpdmlkZSAgICAwLjEgICAgIDAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MDcgZGl2aWRlICAgIDEgICAgICAgMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkwOCBkaXZpZGUgICAgMSAgICAgICAwLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTA5IGRpdmlkZSAgIDEwICAgICAgIDAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MTAgZGl2aWRlICAgMUUrMTAwICAgMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkxMSBkaXZpZGUgICAxRSsxMDAgICAwICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkaXY5MjEgZGl2aWRlICAgLTAuMDAwMSAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkyMiBkaXZpZGUgICAtMC4wMSAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTIzIGRpdmlkZSAgIC0wLjEgICAgIDAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MjQgZGl2aWRlICAgLTEgICAgICAgMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkyNSBkaXZpZGUgICAtMSAgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTI2IGRpdmlkZSAgLTEwICAgICAgIDAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MjcgZGl2aWRlICAtMUUrMTAwICAgMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkyOCBkaXZpZGUgIC0xRSsxMDAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkaXY5MzEgZGl2aWRlICAgIDAuMDAwMSAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkzMiBkaXZpZGUgICAgMC4wMSAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTMzIGRpdmlkZSAgICAwLjEgICAgLTAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MzQgZGl2aWRlICAgIDEgICAgICAtMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkzNSBkaXZpZGUgICAgMSAgICAgIC0wLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTM2IGRpdmlkZSAgIDEwICAgICAgLTAuMCAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5MzcgZGl2aWRlICAgMUUrMTAwICAtMC4wIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjkzOCBkaXZpZGUgICAxRSsxMDAgIC0wICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkaXY5NDEgZGl2aWRlICAgLTAuMDAwMSAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjk0MiBkaXZpZGUgICAtMC4wMSAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTQzIGRpdmlkZSAgIC0wLjEgICAgLTAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5NDQgZGl2aWRlICAgLTEgICAgICAtMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjk0NSBkaXZpZGUgICAtMSAgICAgIC0wLjAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZGl2OTQ2IGRpdmlkZSAgLTEwICAgICAgLTAuMCAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkaXY5NDcgZGl2aWRlICAtMUUrMTAwICAtMC4wIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWRpdjk0OCBkaXZpZGUgIC0xRSsxMDAgIC0wICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitkcWRpdjEwMjEgIGRpdmlkZSAxRTAgICAgICAgICAgMUUwIC0+IDEKK2RxZGl2MTAyMiAgZGl2aWRlIDFFMCAgICAgICAgICAyRTAgLT4gMC41CitkcWRpdjEwMjMgIGRpdmlkZSAxRTAgICAgICAgICAgM0UwIC0+IDAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTAyNCAgZGl2aWRlIDEwMEUtMiAgIDEwMDBFLTMgLT4gMQorZHFkaXYxMDI1ICBkaXZpZGUgMjRFLTEgICAgICAgIDJFMCAtPiAxLjIKK2RxZGl2MTAyNiAgZGl2aWRlIDI0MDBFLTMgICAgICAyRTAgLT4gMS4yMDAKK2RxZGl2MTAyNyAgZGl2aWRlIDVFMCAgICAgICAgICAyRTAgLT4gMi41CitkcWRpdjEwMjggIGRpdmlkZSA1RTAgICAgICAgIDIwRS0xIC0+IDIuNQorZHFkaXYxMDI5ICBkaXZpZGUgNUUwICAgICAgMjAwMEUtMyAtPiAyLjUKK2RxZGl2MTAzMCAgZGl2aWRlIDVFMCAgICAgICAgIDJFLTEgLT4gMjUKK2RxZGl2MTAzMSAgZGl2aWRlIDVFMCAgICAgICAgMjBFLTIgLT4gMjUKK2RxZGl2MTAzMiAgZGl2aWRlIDQ4MEUtMiAgICAgICAzRTAgLT4gMS42MAorZHFkaXYxMDMzICBkaXZpZGUgNDdFLTEgICAgICAgIDJFMCAtPiAyLjM1CisKKy0tIEVDTUFTY3JpcHQgYmFkIGV4YW1wbGVzCityb3VuZGluZzogICAgaGFsZl9kb3duCitkcWRpdjEwNDAgIGRpdmlkZSA1IDkgIC0+IDAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NiBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RxZGl2MTA0MSAgZGl2aWRlIDYgMTEgLT4gMC41NDU0NTQ1NDU0NTQ1NDU0NTQ1NDU0NTQ1NDU0NTQ1NDU1IEluZXhhY3QgUm91bmRlZAorCistLSBHeXVyaXMgZXhhbXBsZQorZHFkaXYxMDUwICBkaXZpZGUgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODE3MDlFLTYxNDMgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODkwMDBFLTYxNDMgLT4gMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkxMjU0IEluZXhhY3QgUm91bmRlZAorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIG5vdGUgc3Vibm9ybWFsIHJlc3VsdHMKKy0tIHNpZ25zCitkcWRpdjE3NTEgZGl2aWRlICAxZSs0Mjc3ICAxZS0zMzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc1MiBkaXZpZGUgIDFlKzQyNzcgLTFlLTMzMTEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFkaXYxNzUzIGRpdmlkZSAtMWUrNDI3NyAgMWUtMzMxMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE3NTQgZGl2aWRlIC0xZSs0Mjc3IC0xZS0zMzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTc1NSBkaXZpZGUgIDFlLTQyNzcgIDFlKzMzMTEgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFkaXYxNzU2IGRpdmlkZSAgMWUtNDI3NyAtMWUrMzMxMSAtPiAtMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE3NTcgZGl2aWRlIC0xZS00Mjc3ICAxZSszMzExIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZGl2MTc1OCBkaXZpZGUgLTFlLTQyNzcgLTFlKzMzMTEgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RxZGl2MTc2MCBkaXZpZGUgMWUtNjA2OSAxZSsxMDEgLT4gMUUtNjE3MCBTdWJub3JtYWwKK2RxZGl2MTc2MSBkaXZpZGUgMWUtNjA2OSAxZSsxMDIgLT4gMUUtNjE3MSBTdWJub3JtYWwKK2RxZGl2MTc2MiBkaXZpZGUgMWUtNjA2OSAxZSsxMDMgLT4gMUUtNjE3MiBTdWJub3JtYWwKK2RxZGl2MTc2MyBkaXZpZGUgMWUtNjA2OSAxZSsxMDQgLT4gMUUtNjE3MyBTdWJub3JtYWwKK2RxZGl2MTc2NCBkaXZpZGUgMWUtNjA2OSAxZSsxMDUgLT4gMUUtNjE3NCBTdWJub3JtYWwKK2RxZGl2MTc2NSBkaXZpZGUgMWUtNjA2OSAxZSsxMDYgLT4gMUUtNjE3NSBTdWJub3JtYWwKK2RxZGl2MTc2NiBkaXZpZGUgMWUtNjA2OSAxZSsxMDcgLT4gMUUtNjE3NiBTdWJub3JtYWwKK2RxZGl2MTc2NyBkaXZpZGUgMWUtNjA2OSAxZSsxMDggLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE3NjggZGl2aWRlIDFlLTYwNjkgMWUrMTA5IC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFkaXYxNzY5IGRpdmlkZSAxZS02MDY5IDFlKzExMCAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKy0tIFtubyBlcXVpdmFsZW50IG9mICdzdWJub3JtYWwnIGZvciBvdmVyZmxvd10KK2RxZGl2MTc3MCBkaXZpZGUgMWUrNDAgMWUtNjEwMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MSBDbGFtcGVkCitkcWRpdjE3NzEgZGl2aWRlIDFlKzQwIDFlLTYxMDIgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQyICBDbGFtcGVkCitkcWRpdjE3NzIgZGl2aWRlIDFlKzQwIDFlLTYxMDMgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyAgQ2xhbXBlZAorZHFkaXYxNzczIGRpdmlkZSAxZSs0MCAxZS02MTA0IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0ICBDbGFtcGVkCitkcWRpdjE3NzQgZGl2aWRlIDFlKzQwIDFlLTYxMDUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE3NzUgZGl2aWRlIDFlKzQwIDFlLTYxMDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE3NzYgZGl2aWRlIDFlKzQwIDFlLTYxMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE3NzcgZGl2aWRlIDFlKzQwIDFlLTYxMDggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE3NzggZGl2aWRlIDFlKzQwIDFlLTYxMDkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE3NzkgZGl2aWRlIDFlKzQwIDFlLTYxMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK2RxZGl2MTgwMSBkaXZpZGUgIDEuMDAwMEUtNjE3MiAgMSAgICAgLT4gMS4wMDAwRS02MTcyIFN1Ym5vcm1hbAorZHFkaXYxODAyIGRpdmlkZSAgMS4wMDBFLTYxNzIgICAxZSsxICAtPiAxLjAwMEUtNjE3MyAgU3Vibm9ybWFsCitkcWRpdjE4MDMgZGl2aWRlICAxLjAwRS02MTcyICAgIDFlKzIgIC0+IDEuMDBFLTYxNzQgICBTdWJub3JtYWwKK2RxZGl2MTgwNCBkaXZpZGUgIDEuMEUtNjE3MiAgICAgMWUrMyAgLT4gMS4wRS02MTc1ICAgIFN1Ym5vcm1hbAorZHFkaXYxODA1IGRpdmlkZSAgMS4wRS02MTcyICAgICAxZSs0ICAtPiAxRS02MTc2ICAgICBTdWJub3JtYWwgUm91bmRlZAorZHFkaXYxODA2IGRpdmlkZSAgMS4zRS02MTcyICAgICAxZSs0ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODA3IGRpdmlkZSAgMS41RS02MTcyICAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODA4IGRpdmlkZSAgMS43RS02MTcyICAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODA5IGRpdmlkZSAgMi4zRS02MTcyICAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODEwIGRpdmlkZSAgMi41RS02MTcyICAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODExIGRpdmlkZSAgMi43RS02MTcyICAgICAxZSs0ICAtPiAzRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODEyIGRpdmlkZSAgMS40OUUtNjE3MiAgICAxZSs0ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODEzIGRpdmlkZSAgMS41MEUtNjE3MiAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODE0IGRpdmlkZSAgMS41MUUtNjE3MiAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODE1IGRpdmlkZSAgMi40OUUtNjE3MiAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODE2IGRpdmlkZSAgMi41MEUtNjE3MiAgICAxZSs0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFkaXYxODE3IGRpdmlkZSAgMi41MUUtNjE3MiAgICAxZSs0ICAtPiAzRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkcWRpdjE4MTggZGl2aWRlICAxRS02MTcyICAgICAgIDFlKzQgIC0+IDFFLTYxNzYgICAgIFN1Ym5vcm1hbAorZHFkaXYxODE5IGRpdmlkZSAgM0UtNjE3MiAgICAgICAxZSs1ICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE4MjAgZGl2aWRlICA1RS02MTcyICAgICAgIDFlKzUgIC0+IDBFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZGl2MTgyMSBkaXZpZGUgIDdFLTYxNzIgICAgICAgMWUrNSAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTgyMiBkaXZpZGUgIDlFLTYxNzIgICAgICAgMWUrNSAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MTgyMyBkaXZpZGUgIDkuOUUtNjE3MiAgICAgMWUrNSAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHFkaXYxODI0IGRpdmlkZSAgMUUtNjE3MiAgICAgIC0xZSs0ICAtPiAtMUUtNjE3NiAgICBTdWJub3JtYWwKK2RxZGl2MTgyNSBkaXZpZGUgIDNFLTYxNzIgICAgICAtMWUrNSAgLT4gLTBFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFkaXYxODI2IGRpdmlkZSAtNUUtNjE3MiAgICAgICAxZSs1ICAtPiAtMEUtNjE3NiAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE4MjcgZGl2aWRlICA3RS02MTcyICAgICAgLTFlKzUgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MjggZGl2aWRlIC05RS02MTcyICAgICAgIDFlKzUgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MjkgZGl2aWRlICA5LjlFLTYxNzIgICAgLTFlKzUgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWRpdjE4MzAgZGl2aWRlICAzLjBFLTYxNzIgICAgLTFlKzUgIC0+IC0wRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZHFkaXYxODMxIGRpdmlkZSAgMS4wRS01OTc3ICAgICAxZSsyMDAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWRpdjE4MzIgZGl2aWRlICAxLjBFLTU5NzcgICAgIDFlKzE5OSAtPiAxRS02MTc2ICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxZGl2MTgzMyBkaXZpZGUgIDEuMEUtNTk3NyAgICAgMWUrMTk4IC0+IDEuMEUtNjE3NSBTdWJub3JtYWwKK2RxZGl2MTgzNCBkaXZpZGUgIDIuMEUtNTk3NyAgICAgMmUrMTk4IC0+IDEuMEUtNjE3NSBTdWJub3JtYWwKK2RxZGl2MTgzNSBkaXZpZGUgIDQuMEUtNTk3NyAgICAgNGUrMTk4IC0+IDEuMEUtNjE3NSBTdWJub3JtYWwKK2RxZGl2MTgzNiBkaXZpZGUgMTAuMEUtNTk3NyAgICAxMGUrMTk4IC0+IDEuMEUtNjE3NSBTdWJub3JtYWwKK2RxZGl2MTgzNyBkaXZpZGUgMzAuMEUtNTk3NyAgICAzMGUrMTk4IC0+IDEuMEUtNjE3NSBTdWJub3JtYWwKK2RxZGl2MTgzOCBkaXZpZGUgNDAuMEUtNTk4MiAgICA0MGUrMTY2IC0+IDEuMEUtNjE0OCBTdWJub3JtYWwKK2RxZGl2MTgzOSBkaXZpZGUgNDAuMEUtNTk4MiAgICA0MGUrMTY1IC0+IDEuMEUtNjE0NyBTdWJub3JtYWwKK2RxZGl2MTg0MCBkaXZpZGUgNDAuMEUtNTk4MiAgICA0MGUrMTY0IC0+IDEuMEUtNjE0NiBTdWJub3JtYWwKKworLS0gcmFuZG9tcworcm91bmRpbmc6ICBoYWxmX2V2ZW4KK2RxZGl2MjAxMCAgZGl2aWRlICAtNTIzMTE5NTY1MjkzMTY1MTk2ODAzNDM1NjExNzExODg1MCAgICAgICAgIC03MjQzNzE4NjY0NDIyNTQ4NTczMjAzMjYwOTcwLjM0OTk1ICAgICAgICAgIC0+ICAgNzIyMTY5LjkwOTU4MzEyODQ2MjQ3MzYwNTE0NjA1NTA2ODAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTEgIGRpdmlkZSAgLTg5NTg0NjY5NzczOTI3LjgyNzExMjM3MzUwMDIyNTE1MzUyICAgICAgICAtNDIwNzc5NDM3Mjg1Mjk2MzU4ODQuMjExNDI2Mjc1MzI5ODUgICAgICAgICAtPiAgIDAuMDAwMDAyMTI5MDE3MjkxMTQ2NDcxNTY1OTI4MTI1ODg3NTI3MjY2IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDEyICBkaXZpZGUgIC0yLjgyODIwMTY5MzM2MDcyMzIwMzgwNjk3NDg5MTk0NjE4MEUtMjMyICAgIDgxMjU5NjU0MTIyMTgyMzk2MDM4NjM4NDQwMzA4OTI0MC45ICAgICAgICAgLT4gIC0zLjQ4MDQ1MDA3NTY0MDUyMTMyMDA0MDA1NTc1OTEyNTEyMEUtMjY1IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDEzICBkaXZpZGUgIC02NDQyNzc1MzcyNzYxMDY5MjY3NTAyOTM3NTM5NDA4NzIwICAgICAgICAgIDI0OTA0MDg1MDU2LjY5MTg1NDY1MTQ1MTgyNjA2MDg5MTk2ICAgICAgICAgLT4gIC0yNTg3MDM1NTYzODgyMjY0NjM2ODc3MDEuNDg4NDcxOTU4OSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAxNCAgZGl2aWRlICAgNS41MzU1MjAwMTEyNzI2MjU2Mjk2MTAwNzk4Nzk3MTQ3MDUgICAgICAgIC00NDM0MzY2NDY1MC41NzIwMzA1MjAwMzA2ODExMzUzMTIwOCAgICAgICAgIC0+ICAtMS4yNDgzMjI2MzA3MjgwODkzMDg5NzU5NDA1MzM0OTM1NjJFLTEwIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDE1ICBkaXZpZGUgICA2NTkxOTI3MzcxMjUxNzg2NTk2NDMyNS45OTQxOTYyNTAxMCAgICAgICAgLTMxNDczMzM1NDE0MTM4MTczNzM3ODYyMjUxNS43Nzg5MDU0ICAgICAgICAgLT4gIC0wLjAwMDIwOTQ0NDgyOTU1MjE0OTA2MTYzNzk3ODQ3NTg5MTE2MzIgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTYgIGRpdmlkZSAgLTcuNzc5MTcyNTY4MTkzMTk3MTA3MTE1Mjc1MTQwNDMxMTI5RSs3NTkgICAtMTQwNDUzMDE1NjM5LjM5ODg5ODc2NTI4OTUxNzg3ODIxNDMgICAgICAgICAtPiAgIDUuNTM4NjI5NzkyMTYxNjQxNTM0OTYyNzc0MjQ0MjM4MTE1RSs3NDggSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTcgIGRpdmlkZSAgIDY0NDMxNDgzMjU5NzU2OS4wMTgxMjI2MDY3NTE4MTc4Nzk3ICAgICAgICAtMTE1MDI0NTg1MjU3NDI1LjE2MzU3NTk1MjE1NjUyMDEwNzUgICAgICAgICAtPiAgLTUuNjAxNTQwMTUwMzU2NDc5MjU3MzY3Njg3NDUwOTIyNzk1IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDE4ICBkaXZpZGUgICA2Ljg5ODY0MDk0MTU3OTYxMTQ1MDY3NjU5MjU1MzI4Njg3MEUtNDcgICAgLTExMjcyNDI5ODgxNDA3ODUxNDg1MTYzOTE0OTk5LjI1OTQzICAgICAgICAgLT4gIC02LjExOTkyMzU3ODI4NTMzODY4OTM3MTEzNzY0ODMxOTI4MEUtNzUgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMTkgIGRpdmlkZSAgLTM1OTEzNDQ1NDQ4ODg3MjcxMzMuMzA4MTk3NTAxNjMyNTQgICAgICAgICAgNTMyOTM5NS40MjM3OTI3OTU2NjE0NDY1NjEwOTAzMzEwMzcgICAgICAgICAtPiAgLTY3Mzg3NDY2Mjk0MS4xOTY4NTI1NTg5NDYwNTMzNzI1MjkwIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDIwICBkaXZpZGUgIC03LjY4MjM1Njc4MTM4NDYzMTMxMzE1NjQ2MjcyNDQyNTgzOEUrNzQ3ICAgLTYuNjAzNzU4NTU1MTIyMTkwNTcyODE5MjIxNDE4MDk5NDBFKzcwMyAgICAgLT4gICAxLjE2MzMzMDk2MDI3OTU1NjAxNjY3ODM3OTEyODg3NTE0OUUrNDQgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjEgIGRpdmlkZSAgLTQ1MTE0OTU1OTY1OTY5NDE4MjA4NjMyMjQuMjc0Njc5Njk5ICAgICAgICAgMzM2NTM5NTAxNy4yNjMzMjk3OTU0NDk2NjE2MTYwOTA3MjQgICAgICAgICAtPiAgLTEzNDA1NTQ1NDgxMTUzMDQuOTA0MTY2ODg4MDE4MzQ2Mjk5IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDIyICBkaXZpZGUgICA1LjIxMTE2NDEyNzg0MDkzMTUxNzI2MzYzOTYwODE1MTI5OSAgICAgICAgIDE2NC41NTY2MzgxMzU2Mjc2NTY3MDEyNTMzODQ3MDA2NDUzICAgICAgICAgLT4gICAwLjAzMTY2NzkwNTg3NjU1MjI4ODY0NDc4MjYwMTU3MTU2NTEwIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDIzICBkaXZpZGUgIC00OTg5MS4yMjQzODkzNDU4ODMwMzg0MDc3Njg0NjIwMzgzICAgICAgICAgLTQ3MTc5LjkzMTI5NjE4NjA3NDc1NTQwNTMzNzExNzE1MzAgICAgICAgICAgLT4gICAxLjA1NzQ2NzA4NDM4Njc2NzI5MTYwMjE4OTY1NjQzMDI2OCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAyNCAgZGl2aWRlICAgMTUwNjU0NzcuNDcyMTQyNjg0ODgwNzc0MTU0NjI0MTMzNTMgICAgICAgICA0MzY2MjExLjEyMDg5Mjk1MzI2MTMwOTUyOTc0MDU1MjU5NiAgICAgICAgIC0+ICAgMy40NTA0NjkzMDk2NjEyMjc5ODQyNDQ1NDU1MTM0NDEzNTkgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjUgIGRpdmlkZSAgIDEuNTc1NjcwMjY5NDQwNzYxODQ2MTA5NjAyNDI5NjEyNjQ0RSszNzAgICAgNjUzMTk5NjQ5MzI0NzQwMzAwLjAwNjE4NTQ4MjY0MzQzOSAgICAgICAgICAtPiAgIDIuNDEyMjMzNzk1NzAwMzU5MTcwOTA0NTg4NTQ4MDQxNDgxRSszNTIgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjYgIGRpdmlkZSAgLTIxMTI0MjIzMTE3MzM0NDg5MjQ1NzM0MzIxOTIuNjIwMTQ1ICAgICAgICAtODAwNjcyMDYuMDM1OTA2OTMxNTM4NDgyMTU4NDg2MTM0MDYgICAgICAgICAtPiAgIDI2MzgzMTE1MDg5NDE3NjYwMTc1LjIwMTAyNjQ2NzU2NTc0IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDI3ICBkaXZpZGUgIC02NzA5NjUzNjA1MTI3OTgwOS4zMjIxODYxMTU0ODcyMTgzOSAgICAgICAgLTg2OTY4NTQxMjg4MTk0MTA4MTY2NDI1MTk5MDE4MS4xMDQ5ICAgICAgICAgLT4gICA3LjcxNTAzNTIzNjU4NDgwNTkyMTI3ODU2NjM2NTIzMTE2OEUtMTQgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMjggIGRpdmlkZSAgLTU4NjEyOTA4NTQ4OTYyMDQ3LjIxODY2OTEzNDI1NDg4OTcyICAgICAgICAtOTc4NDQ5NTk3NTMxLjM4NzM2NjU1ODM0NzU2MzM4MzE2NDQgICAgICAgICAtPiAgIDU5OTAzLjg2MDg1OTkxNzAzMDkxMjM2NTA3ODU5ODM3MDIzIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDI5ICBkaXZpZGUgIC0xMzMwMzI0MTIwMTA5NDIuMTQ3Njg2NDEzODIxMzMxOTc5NiAgICAgICAgLTcuODgyMDU5MjkzNDk4NjcwNzA1NDQ2NTI4NjQ4MjAxMzU5RS00MjggICAgLT4gICAxLjY4Nzc4NzUwNjUwNDQzMzA2NDU0OTUxNTY4MTY5MzcxNUUrNDQxIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDMwICBkaXZpZGUgICAxLjgzNzQ2Njk4MzM4OTY2MDI5NDkyMjk5NzE2MzYwNTEzRSs5NzcgICAgLTkuODk3OTI2NjA4OTc5NjQ5OTUxNjcyODM5ODc5MTI4NjAzRSsxNTQgICAgLT4gIC0xLjg1NjQxNjA1MTU0MjIxMjU1MjA0MjM5MDIxODA2MjQ1OEUrODIyIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDMxICBkaXZpZGUgIC0xMTM3NDI0NzU4NDEzOTkyMzYzMDcxMjg5NjIuMTUwNzA2MyAgICAgICAgIDgyOTg2MDIuMjAzMDQ5ODM0NzMyNjU3NTY3OTY1MjYyOTg5ICAgICAgICAgLT4gIC0xMzcwNjIyMTAwNjY2NTEzNzgyNi4xNjU1NzM5MzkxOTkyOSBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjAzMiAgZGl2aWRlICAgMTk2LjQ3ODc1NzQ2NTA3NTQxNTI5OTU5NDE4MDgzMzE4NjIgICAgICAgICA5MjkuNjU1MzM4ODQ3MjMxODA5NDQyNzQyMjExNzE3MjM5NCAgICAgICAgIC0+ICAgMC4yMTEzNDU4MDY2MTc2NTI2NjUxMDA2OTE3OTIyODE0MDE4IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDMzICBkaXZpZGUgICA3MTkzMTIyMTQ2NS40Mzg2Nzk5NjI4MjgwMzYyODEzMDM1MCAgICAgICAgIDM4Mzg2ODU5MzQyMDY0MjYyNTcwOTA3MTguNDAyMjQ4ODUzICAgICAgICAgLT4gICAxLjg3Mzg1MDEzMjUyNzQyMzQxMzYwNzE5OTUxMzMyNDAyMUUtMTQgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzQgIGRpdmlkZSAgIDQ4OC40MjgyNTAyMjg5NjUxNjUzNzgzNTk2MjQ2MzEyODg1ICAgICAgICAtODAuNjg5NDA5NTY4MDY2MzQyODAwNzg3MDY1Nzc5NTMxODggICAgICAgICAtPiAgLTYuMDUzMTg5MDQ3MjgwNjkzMzE4ODQ0ODAxODk5NDczMjcyIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDM1ICBkaXZpZGUgICA5LjAwMTc2NDM0NDk2MzkyMTc1NDk4MTc2MjkxMzI0NzM5NEUtMTYyICAgLTguNTg1NTQwOTczNjY3MjA1NzUzNzM0OTY3NjQ1Mzg2OTE5RS03MjkgICAgLT4gIC0xLjA0ODQ3OTU3NDI3MTgyNzMyNjM5NjAxMjU3MzIzMjkzNEUrNTY3IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDM2ICBkaXZpZGUgIC03LjQwNDEzMzk1OTQwOTg5NDc0MzcwNjQwMjg1NzE0NTQ3MUUtODI4ICAgLTUxLjM4MTU5OTI5NDYwMjg5NzExMTM0Njg0ODQzMDg2MjY1ICAgICAgICAgLT4gICAxLjQ0MTAwODg1NTUxNjAyOTQ2MTAzMjA2MTc4NTIxOTc3M0UtODI5IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDM3ICBkaXZpZGUgICAyLjk2NzUyMDIzNTU3NDQxOTc5NDA0ODk5NDQzNjA0MDcxN0UtNjEzICAgLTYyNTI1MTM4NTUuOTEzOTQ4OTQ5NDk4NzkyNjI3MzE4ODkgICAgICAgICAgLT4gIC00Ljc0NjEyMzQwNTY1NjQwOTEyNzU3Mjk5ODc1MTg4NTMzOEUtNjIzIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDM4ICBkaXZpZGUgIC0xODgyNjg1MjY1NDgyNDA0MDUwNS44MzkyMDM2Njc2NTA1MSAgICAgICAgLTYzMzY5MjQ4Nzc5NDI0Mzc5OTI1OTA1NTc0NjAxNDczNDAgICAgICAgICAgLT4gICAyLjk3MDk3NjE0NjU0NjQ5NDY2OTgwNzg4NjI3ODUxOTE5NEUtMTUgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwMzkgIGRpdmlkZSAgLTguMTAxNDA2Nzg0ODA5MTk3NjA0OTQ5NTg0MDAxNzM1OTQ5RSs1NjEgICAgNC44MjMzMDAzMDY5NDg5NDI4MjEwNzY2ODE2NTg3NzE2MzVFKzM2MSAgICAtPiAgLTEuNjc5NjM5NzIxNjEwODM5MjA0NzM4NDQ1NzQ3MjM4OTg3RSsyMDAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDAgIGRpdmlkZSAgLTYuMTE5ODE5Nzc3NzMwOTQwNTIzMzEwNjI1ODUxOTE3MjNFKzI5NSAgICAgMS41MDc2MTAyNTM3NTUzMzkzMjgzMDI3NzkwMDU1ODY1MzRFKzIzOCAgICAtPiAgLTQuMDU5Mjg1MDU4OTExNTc3MjQ0MDQ0NDE4NDE2MDQ0NzYzRSs1NyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA0MSAgZGl2aWRlICAgNi40NzI2Mzg4NTAwNDY4MTU4ODA1OTkyMjA1MzQyNzQwNTVFLTU5NiAgIC00LjQ3NTIzMzcxMjA4MzA0NzUxNjkzMzkxMTc4NjE1OTk3MiAgICAgICAgIC0+ICAtMS40NDYzMjQyMDcwNjIyNjE3NDU1MjA0OTY0NzU3Nzg4NzlFLTU5NiBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA0MiAgZGl2aWRlICAtODQ0Mzg1OTMzMzAuNzEyNzc4Mzk2MzExNDQ1MDkzOTcxMTIgICAgICAgIC01ODY2ODQ1OTYyMDQ0MDE2NjQyMDg5NDcuNDA1NDg3OTYzMyAgICAgICAgIC0+ICAgMS40MzkyNTAyMTg1NTAwNDEyMjg3NTk5ODM5Mzc3NzI1MDRFLTEzIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQzICBkaXZpZGUgICA5LjM1NDUzMzIzMzI5NDAyMjYxNjY5NTgxNTY1NjcwNDM2OUUtMjQgICAgIDQwNS41MDAzOTA2MjYxMzUzMDQyNTIxNDQxNjM1OTE3NDYgICAgICAgICAgLT4gICAyLjMwNjkxMTAyODgyNzc3NDU0OTc0MDU3MTIyOTczNjE5OEUtMjYgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNDQgIGRpdmlkZSAgIDk4NTYwNjQyMzM1MDIxMC43Mzc0ODc2NjUwMTQ5OTU3ODgxICAgICAgICAtMzY4MTE1NjM2OTcuNDE5MjU2ODE4NjY2OTQ4NTk4Mjg3OTQgICAgICAgICAtPiAgLTI2Nzc0LjM2OTkwODY0MTE5NDQ1MzM1ODEzMzU0NzE3NzExIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQ1ICBkaXZpZGUgIC04LjE4NzI4MDc3NDE3NzcxNTcwNjI3ODAwMjI0Nzc2NjMxMUUtMTIzICAgLTM4Nzg0MTI0MzkzLjkxMjEyODcwODI4NDMwMDAxMzAwMDY4ICAgICAgICAgLT4gICAyLjExMDk4NzY1MzM1NjEzOTE0NzM1NzI0MDcyNzc5NDM2NUUtMTMzIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQ2ICBkaXZpZGUgIC00LjYxMjIwMzEyNjM1MDA3MDkwMzQ1OTI0NTc5ODM3MTY1N0UrOTEyICAgIDcuOTcxNTYyMTgyNzI3OTU2MjkwOTAxOTg0NzM2ODAwNTE5RSs2NCAgICAgLT4gIC01Ljc4NTgyMDkyMjcwODY4MzIzNzA5ODgyNjY2Mjc2OTc0OEUrODQ3IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQ3ICBkaXZpZGUgICA0LjY2MTAxNTkwOTQyMTQ4NTI5ODI0NzkyODk2Nzk3NzA4OUUrODg4ICAgLTYuMzYwOTExMjUzMzIzOTIyMzM4NzM3MzExNTYzODQ1NTgxRSszODggICAgLT4gIC03LjMyNzU5MTQ3ODMyMTM2NTk4MDE1NjY1NDUzOTYzODgzNkUrNDk5IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQ4ICBkaXZpZGUgICA5MTU2MDc4MTcyOTAzLjI1NzUwMDAwMzI2MDcxMDgzMzAzMCAgICAgICAgIDcuMTg5Nzk2NjUzMjYyMTQ3MTM5MDcxNjM0MjM3OTY0MDc0RS05MCAgICAgLT4gICAxLjI3MzQ4MjIxNTc2NjAwMDk5NDM2NTIwMTU0NTA5NjAyNkUrMTAyIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDQ5ICBkaXZpZGUgIC0xLjcxMDcyMjMwMzMyNzQ3NjU4NjM3MzQ3Nzc4MTI3NjU4NkUtMzExICAgLTMxNjc1NjE2MjgyNjAxNTY4MzczMjkzMjMuNzI5MzgwNjk1ICAgICAgICAgLT4gICA1LjQwMDc1NDU5OTU3ODYxMzk4NDg3NTc1Mjk1ODY0NTY1NUUtMzM2IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDUwICBkaXZpZGUgIC00LjY0NzkzNTIxMDg4MTgwNjIzODMyMTYxNjM0NTQxMzAyMUUtODc4ICAgIDIwOTM4OC41NDMxODY3NzQ0NjQ4MTc3MzA4NDYwNjM5NTgyICAgICAgICAgLT4gIC0yLjIxOTc2NTc3MTM5NDU5MzczMzE0MDQ5NDI5NzM4ODE0MEUtODgzIEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDUxICBkaXZpZGUgICA1OTU4LjY5NDcyODM5NTc2MDk5MjcxOTA4NDc4MTU4MjcwMCAgICAgICAgIDQuNTQxNTEwMTU2NTY0MzE1NjMyNTM2MzUzMTcxODQ2MDk2RS03NDYgICAgLT4gICAxLjMxMjA1MTM5MzI1MzYzODY2NDk0Nzg1MjY5MzAwNTQ4MEUrNzQ5IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDUyICBkaXZpZGUgIC03LjkzNTczMjU0NDY0OTcwMjE3NTI1NjY5OTg4Njg3MjA5M0UtNDg5ICAgLTcuNDMzMzI5MDczNjY0NzkzMTM4OTk4NzY1NjQ3NDY3OTcxRSszNjAgICAgLT4gICAxLjA2NzU4Nzk0OTYyNjA3NjkxNzY3MjI3MTYxOTY2NDY1NkUtODQ5IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDUzICBkaXZpZGUgIC0yNzQ2NjUwODY0NjAxMTU3Ljg2MzU4OTk1OTkzOTkwMTM1MCAgICAgICAgIDcuMDE2Njg0OTQ1NTA3NjQ3NTI4OTA3MTg0Njk0MzU5NTk4RSs1NDggICAgLT4gIC0zLjkxNDQ1NjU5MzAwOTMwOTUyOTM1MTI1NDk1MDQyOTkzMkUtNTM0IEluZXhhY3QgUm91bmRlZAorZHFkaXYyMDU0ICBkaXZpZGUgICAzNjA1MTQ5NDA4NjMxMTk3MzY1NDQ3OTUzLjk5NDU2OTE3OCAgICAgICAgLTc1NjE0MDI1ODI1NjQ5MDgyLjc4MjY0ODY0NDI4MjM3ODMzICAgICAgICAgLT4gIC00NzY3ODMxNS44ODQ3MjY5MzUwNzA2MDA2MzE4ODAyMDUzMiBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA1NSAgZGl2aWRlICAgNzg4MTk0MzIwOTIxNzk4NDA0OTA2Mzc1MjE0LjE5NjM0OSAgICAgICAgIC02LjIyMjcxODE0ODQzMzI0NzM4NDkzMjU3MzQwMTk3NjMzN0UtNDE4ICAgIC0+ICAtMS4yNjY2Mzk5MTg2MzQ2NzE4MDM5ODIyMjIyNDQ5NzcyODdFKzQ0NCBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA1NiAgZGl2aWRlICAgNTYyMDcyMjczMDUzNDc1Mi43NTgyMDg5NDM0NDc2MDMyMTEgICAgICAgICA2Ljg0MzU1Mjg0MTE2ODUzODMxOTEyMzAwMDkxNzY1Nzc1OUUtMTM5ICAgIC0+ICAgOC4yMTMxNjQ4MDA0ODU0MzQ2NjY2Mjk5NzA0NDM3Mzk1NTRFKzE1MyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA1NyAgZGl2aWRlICAgNzMwNDUzNDY3NjcxMzcwMzkzODEwMi40MDM5NDkwMTk0MDIgICAgICAgIC01NzYxNjkuMzY4NTAxMDkzNTEwODE1MzAyMzgwMzU5MDgzNSAgICAgICAgIC0+ICAtMTI2Nzc3NTYwMTQyMDE5OTUuMzE5NjkyMzcxNDQzOTQ3NzIgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNTggIGRpdmlkZSAgIDgwNjc5MTg3NjIuMTM0NjIxNjM5MjU0OTE2Nzg2OTQ1NTQ3ICAgICAgICAtOC43NzQ3NzE0ODAwNTU1MzYwMDkxMDU1OTYxNjM4NjQ3NThFKzk1NCAgICAtPiAgLTkuMTk0NDQ4ODU4ODM2MzMyMTU2NzY2NzY0NjA1MTI1MjQ1RS05NDYgSW5leGFjdCBSb3VuZGVkCitkcWRpdjIwNTkgIGRpdmlkZSAgIDguNzAyMDkzNDU0MTIzMDQ2NTA3NTc4MjU2ODk5NTM3NTYzRS0zMjQgICAtNS44NzUzOTk3MzMwMTYwMTg0MDQ1ODAyMDExNzY1NzYyOTNFLTQwMSAgICAtPiAgLTEuNDgxMTA2NjIyNDUyMDUyNTgxNDcwNDQzNTI2OTU3MzM1RSs3NyBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2MjA2MCAgZGl2aWRlICAtNDE0MjYuMDE2NjI1MTg0NTE4NjEzODYzNTI0MTUwOTIzNTYgICAgICAgICA5MC4wMDE0NjYyMTY4NDQ3ODMwMDUxMDc2OTgwMjAxMzQ2NCAgICAgICAgIC0+ICAtNDYwLjI4MTU3NTAyODczMTg2OTI3MzIwNjc3MDkxNzYyMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHJhbmRvbSBkaXZpZGUgdGVzdHMgd2l0aCByZXN1bHQgbmVhciAxCitkcWRpdjQwMDEgZGl2aWRlICAyMDAzMTAwMzUyNzcwNzUzOTY5ODc4OTI1NjY0NTI0OTAwICAgMjAwMzEwMDM1Mjc3MDc1Mzk2OTg3ODkyNTY2NDQ5NzgyNCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEzNTE3ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAwMiBkaXZpZGUgIDQ4MTc3ODU3OTM5MTY0OTA2NTI1Nzk1NTIzMTgzNzE2NDUgICA0ODE3Nzg1NzkzOTE2NDkwNjUyNTc5NTUyMzE4MzYyMDk3ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE5ODIgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDAzIGRpdmlkZSAgODI5OTE4NzQxMDkyMDA2NzMyNTY0ODA2ODQzOTU2MDI4MiAgIDgyOTkxODc0MTA5MjAwNjczMjU2NDgwNjg0Mzk1OTExNTkgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NjI3OTUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDA0IGRpdmlkZSAgNTY0MTA4ODQ1NTg5NzQwNzA0NDU0NDQ2MTc4NTM2NTg5OSAgIDU2NDEwODg0NTU4OTc0MDcwNDQ1NDQ0NjE3ODUzODk5NjUgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTczMzggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDA1IGRpdmlkZSAgNTc1MjI3NDY5NDcwNjU0NTM1OTMyNjM2MTMxMzQ5MDQyNCAgIDU3NTIyNzQ2OTQ3MDY1NDUzNTkzMjYzNjEzMTM1MDI3MjMgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Nzg2MTkgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDA2IGRpdmlkZSAgNjc2MjA3OTQ3NzM3MzY3MDU5NDgyOTMxOTM0NjA5OTY2NSAgIDY3NjIwNzk0NzczNzM2NzA1OTQ4MjkzMTkzNDYxMzI1NzkgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTEzMjYgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDA3IGRpdmlkZSAgNzI4NjQyNTE1MzY5MTg5MDM0MTYzMzAyMzIyMjYwMjkxNiAgIDcyODY0MjUxNTM2OTE4OTAzNDE2MzMwMjMyMjI2MDY1NTYgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUwMDQgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDA4IGRpdmlkZSAgOTQ4MTIzMzk5MTkwMTMwNTcyNzY0ODMwNjQyMTk0NjY1NSAgIDk0ODEyMzM5OTE5MDEzMDU3Mjc2NDgzMDY0MjE5MTkxMjQgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjkwNCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMDkgZGl2aWRlICA0MjgyMDUzOTQxODkzOTUxNzQyMDI5NDQ0MDY1NjE0MzExICAgNDI4MjA1Mzk0MTg5Mzk1MTc0MjAyOTQ0NDA2NTU4MzA3NyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3Mjk0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxMCBkaXZpZGUgICA2MjY4ODgyMjU0NDEyNTA2Mzk3NDE3ODE4NTAzMzg2OTUgICAgNjI2ODg4MjI1NDQxMjUwNjM5NzQxNzgxODUwMzI3Mjk5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTgxNzkgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDExIGRpdmlkZSAgMzg2MDk3MzY0OTIyMjAyODAwOTQ1NjU5ODYwNDQ2ODU0NyAgIDM4NjA5NzM2NDkyMjIwMjgwMDk0NTY1OTg2MDQ0NzY4NDkgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Nzg0OTggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDEyIGRpdmlkZSAgNDc1MzE1NzA4MDEyNzQ2ODEyNzkwODA2MDYwNzgyMTgzOSAgIDQ3NTMxNTcwODAxMjc0NjgxMjc5MDgwNjA2MDc3ODgzNzkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzA0MCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTMgZGl2aWRlICAgNTUyNDQ4NTQ2MjAzNzU0MDYyODA1NzA2Mjc3ODgwNDE5ICAgIDU1MjQ0ODU0NjIwMzc1NDA2MjgwNTcwNjI3Nzg4MTkwMyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3MzEzOCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTQgZGl2aWRlICA4NDA1OTU0NTI3OTUyMTU4NDU1MzIzNzEzNzI4OTE3Mzk1ICAgODQwNTk1NDUyNzk1MjE1ODQ1NTMyMzcxMzcyODkzMzg2NiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4MDQwNiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTUgZGl2aWRlICA3NTU0MDk2NTAyMjM1MzIxMTQyNTU1ODAyMjM4MDE2MTE2ICAgNzU1NDA5NjUwMjIzNTMyMTE0MjU1NTgwMjIzODAyNjU0NiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4NjE5MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTYgZGl2aWRlICA0MDUzMjU3Njc0MTI3NTE4NjA2ODcxMDU0OTM0NzQ2NzgyICAgNDA1MzI1NzY3NDEyNzUxODYwNjg3MTA1NDkzNDc2NzM1NSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0OTI0MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTcgZGl2aWRlICA3MTEyNDE5NDIwNzU1MDkwNDU0NzE2ODg4ODQ0MDExNTgyICAgNzExMjQxOTQyMDc1NTA5MDQ1NDcxNjg4ODg0NDAzODEwNSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2MjcwOSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMTggZGl2aWRlICAzMTMyMzAyMTM3NTIwMDcyNzI4MTY0NTQ5NzMwOTExODQ2ICAgMzEzMjMwMjEzNzUyMDA3MjcyODE2NDU0OTczMDkwODQxNiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDk1ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAxOSBkaXZpZGUgIDQ3ODgzNzQwNDU4NDE0MTYzNTU3MDY3MTUwNDgxNjEwMTMgICA0Nzg4Mzc0MDQ1ODQxNDE2MzU1NzA2NzE1MDQ4MTkwMDc3ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTM5MzAzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAyMCBkaXZpZGUgIDk0NjYwMjE2MzYwNDc2MzAyMTgyMzgwNzUwOTk1MTA1OTcgICA5NDY2MDIxNjM2MDQ3NjMwMjE4MjM4MDc1MDk5NDg0MDUzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI4MDQgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDIxIGRpdmlkZSAgIDkxMjc0Mjc0NTY0Njc2NTYyNTU5NzM5OTY5MjEzODY1MCAgICA5MTI3NDI3NDU2NDY3NjU2MjU1OTczOTk2OTIxMzkwNDIgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTU3MDUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDIyIGRpdmlkZSAgOTUwODQwMjc0MjkzMzY0MzIwODgwNjI2NDg5NzE4ODUwNCAgIDk1MDg0MDI3NDI5MzM2NDMyMDg4MDYyNjQ4OTcxOTU5NzMgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIxNDUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDIzIGRpdmlkZSAgMTE4Njk1Njc5NTcyNzIzMzcwNDk2MjM2MTkxNDM2MDg5NSAgIDExODY5NTY3OTU3MjcyMzM3MDQ5NjIzNjE5MTQzMjk1NzcgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNjM4NSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMjQgZGl2aWRlICA1OTcyMjEwMjY4ODM5MDE0ODEyNjk2OTE2MTcwOTY3OTM4ICAgNTk3MjIxMDI2ODgzOTAxNDgxMjY5NjkxNjE3MDk1NDk3NCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMTcxICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAyNSBkaXZpZGUgIDIzMDM4MDE2MjU1MjE2MTk5MzA4OTQ0NjAxMzk3OTMxNDAgICAyMzAzODAxNjI1NTIxNjE5OTMwODk0NDYwMTM5Nzk5NjQzICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcxNzczICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAyNiBkaXZpZGUgIDYwMjIyMzE1NjAwMDI4OTgyNjQ3NzczOTM0NzM5NjY1OTUgICA2MDIyMjMxNTYwMDAyODk4MjY0Nzc3MzkzNDczOTQ3MTk4ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMyMjEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDI3IGRpdmlkZSAgODQyNjE0ODMzNTgwMTM5NjE5OTk2OTM0NjAzMjIxMDg5MyAgIDg0MjYxNDgzMzU4MDEzOTYxOTk5NjkzNDYwMzIyMDMxNzkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkxNSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMjggZGl2aWRlICA4ODEyMjc4OTQ3MDI4Nzg0NjM3MzgyODQ3MDk4NDExNzQ5ICAgODgxMjI3ODk0NzAyODc4NDYzNzM4Mjg0NzA5ODM4NTMxNyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyOTk5ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAyOSBkaXZpZGUgIDgxNDUyODIwMDIzNDgzNjczODMyNjQxOTcxNzAxMTYxNDYgICA4MTQ1MjgyMDAyMzQ4MzY3MzgzMjY0MTk3MTcwMDgzOTg4ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM5NDggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDMwIGRpdmlkZSAgNjgyMTU3NzU3MTg3Njg0MDE1MzEyMzUxMDEwNzM4NzAyNiAgIDY4MjE1Nzc1NzE4NzY4NDAxNTMxMjM1MTAxMDc0MTgwMDggIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTQ1ODIgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDMxIGRpdmlkZSAgOTAxODU1NTMxOTUxODk2Njk3MDQ4MDU2NTQ4MjAyMzcyMCAgIDkwMTg1NTUzMTk1MTg5NjY5NzA0ODA1NjU0ODIwMTMzNDYgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTE1MCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzIgZGl2aWRlICA0NjAyMTU1NzEyOTk4MjI4NDQ5NjQwNzE3MjUyNzg4ODY0ICAgNDYwMjE1NTcxMjk5ODIyODQ0OTY0MDcxNzI1MjgxODUwMiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkzNTYwMCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzMgZGl2aWRlICA2Njc1NjA3NDgxNTIyNzg1NjE0NTA2ODI4MjkyMjY0NDcyICAgNjY3NTYwNzQ4MTUyMjc4NTYxNDUwNjgyODI5MjI3NzEwMCAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4MTA4MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzQgZGl2aWRlICA0MDE1ODgxNTE2ODcxODMzODk3NzY2OTQ1ODM2MjY0NDcyICAgNDAxNTg4MTUxNjg3MTgzMzg5Nzc2Njk0NTgzNjI2MjY0NSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDU1ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDAzNSBkaXZpZGUgIDE0MTU1ODAyMDU5MzM0MTE4Mzc1OTU0NTk3MTY5MTAzNjUgICAxNDE1NTgwMjA1OTMzNDExODM3NTk1NDU5NzE2ODgwMTM5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjEzNTIgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDM2IGRpdmlkZSAgOTQzMjk2ODI5NzA2OTU0MjgxNjc1MjAzNTI3NjM2MTU1MiAgIDk0MzI5NjgyOTcwNjk1NDI4MTY3NTIwMzUyNzYzNTMwNTQgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkwMSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzcgZGl2aWRlICA0Nzk5MzE5NTkxMzAzODQ4NTAwNTMyNzY2NjgyMTQwNjU4ICAgNDc5OTMxOTU5MTMwMzg0ODUwMDUzMjc2NjY4MjE3MjY1NSAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkzMzMzMCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzggZGl2aWRlICAgMzE2ODU0MjcwNzMyODM5NTI5NzkwNTg0Mjg0OTg3NDcyICAgIDMxNjg1NDI3MDczMjgzOTUyOTc5MDU4NDI4NTAwNDgzMiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQ1MjExNCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwMzkgZGl2aWRlICAzNTk4OTgxMzAwNTkyNDkwNDI3ODI2MDI3OTc1Njk3NDE1ICAgMzU5ODk4MTMwMDU5MjQ5MDQyNzgyNjAyNzk3NTY4NjcxMiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyOTc0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA0MCBkaXZpZGUgIDE2NjQzMTU0MzU2OTQ0NjEzNzExNTU4MDA2ODIxOTY1MjAgICAxNjY0MzE1NDM1Njk0NDYxMzcxMTU1ODAwNjgyMTk1NjE3ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1NDMgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDQxIGRpdmlkZSAgMTY4MDg3MjMxNjUzMTEyODg5MDEwMjg1NTMxNjUxMDU4MSAgIDE2ODA4NzIzMTY1MzExMjg4OTAxMDI4NTUzMTY0OTU1NDUgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODk0NSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNDIgZGl2aWRlICA5ODgxMjc0ODc5NTY2NDA1NDc1NzU1NDk5MjgxNjQ0NzMwICAgOTg4MTI3NDg3OTU2NjQwNTQ3NTc1NTQ5OTI4MTYxNTc0MyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyOTM0ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA0MyBkaXZpZGUgIDQ3MzcyMjU5NTc3MTc0NjY5NjA0NDcyMDQyMzIyNzkyMTYgICA0NzM3MjI1OTU3NzE3NDY2OTYwNDQ3MjA0MjMyMjc3NDUyICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzNzIgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDQ0IGRpdmlkZSAgMjQ4MjA5NzM3OTQxNDg2NzA2MTIxMzMxOTM0NjQxODI4OCAgIDI0ODIwOTczNzk0MTQ4NjcwNjEyMTMzMTkzNDYzODc5MzYgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjIyOCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNDUgZGl2aWRlICA3NDA2OTc3NTk1MjMzNzYyNzIzNTc2NDM0MTIyMTYxODY4ICAgNzQwNjk3NzU5NTIzMzc2MjcyMzU3NjQzNDEyMjE4OTA0MiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2MzMxMyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNDYgZGl2aWRlICAgMjI4NzgyMDU3NzU3NTY2MDQ3MDg2NTkzMjgxNzczNTc3ICAgIDIyODc4MjA1Nzc1NzU2NjA0NzA4NjU5MzI4MTc2OTcyNyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE2ODI4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA0NyBkaXZpZGUgIDI5NTY1OTQyNzAyNDA1Nzk2NDg4MjMyNzA1NDAzNjc2NTMgICAyOTU2NTk0MjcwMjQwNTc5NjQ4ODIzMjcwNTQwMzY4NTU2ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2OTQ2ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA0OCBkaXZpZGUgIDYzMjY5NjQwOTg4OTc2MjA2MjA1MzQxMzY3Njc2MzQzNDAgICA2MzI2OTY0MDk4ODk3NjIwNjIwNTM0MTM2NzY3NjE5MzM5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIzNzEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDQ5IGRpdmlkZSAgIDQxNDU4NjQ0MDQ1NjU5MDIxNTI0NzAwMjY3ODMyNzgwMCAgICA0MTQ1ODY0NDA0NTY1OTAyMTUyNDcwMDI2NzgzMTY5MjIgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyNjIzOCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTAgZGl2aWRlICA3MzY0NTUyMjA4NTcwMDM5Mzg2MjIwNTA1NjM2Nzc5MTI1ICAgNzM2NDU1MjIwODU3MDAzOTM4NjIyMDUwNTYzNjgwMzU0OCAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2NjgzNyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTEgZGl2aWRlICA1NjI2MjY2NzQ5OTAyMzY5NzEwMDIyODI0OTUwNTkwMDU2ICAgNTYyNjI2Njc0OTkwMjM2OTcxMDAyMjgyNDk1MDU5MTAwOCAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ODMwOCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTIgZGl2aWRlICA0ODYzMjc4MjkzOTE2MTk3NDU0OTg3NDgxMzQzNDYwNDg0ICAgNDg2MzI3ODI5MzkxNjE5NzQ1NDk4NzQ4MTM0MzQ0MjUyMiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzNjkzICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA1MyBkaXZpZGUgIDExNzA3MTM1ODIwMzA2MzczNTk3MTMyNDk3OTY4MzU0ODMgICAxMTcwNzEzNTgyMDMwNjM3MzU5NzEzMjQ5Nzk2ODIzMzQ1ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAzNjggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDU0IGRpdmlkZSAgOTgzODA2MjQ5NDcyNTk2NTY2Nzc3NjMyNjU1NjA1MjkzMSAgIDk4MzgwNjI0OTQ3MjU5NjU2Njc3NzYzMjY1NTYwNjEwMDIgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTE3OTYgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDU1IGRpdmlkZSAgNDA3MTM4ODczMTI5ODg2MTA5MzAwNTY4NzA5MTQ5ODkyMiAgIDQwNzEzODg3MzEyOTg4NjEwOTMwMDU2ODcwOTE0OTgyNzggIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1OCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTYgZGl2aWRlICA4NzUzMTU1NzIyMzI0NzA2Nzk1ODU1MDM4NTkwMjcyNTI2ICAgODc1MzE1NTcyMjMyNDcwNjc5NTg1NTAzODU5MDI3NjY1NiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTI4MiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNTcgZGl2aWRlICA0Mzk5OTQxOTExNTMzMjczNDE4ODQ0NzQyNjU4MjQwNDg1ICAgNDM5OTk0MTkxMTUzMzI3MzQxODg0NDc0MjY1ODIxOTg5MSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0NjgxICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA1OCBkaXZpZGUgIDQxMjc4ODQxNTk5NDk1MDM2Nzc3NzY0MzA2MjAwNTAyNjkgICA0MTI3ODg0MTU5OTQ5NTAzNjc3Nzc2NDMwNjIwMDI2MDkxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDU4NTcgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDU5IGRpdmlkZSAgNTUzNjE2MDgyMjM2MDgwMDA2NzA0MjUyODMxNzQzODgwOCAgIDU1MzYxNjA4MjIzNjA4MDAwNjcwNDI1MjgzMTc0NTA2ODcgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Nzg1NDMgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDYwIGRpdmlkZSAgMzk3MzIzNDk5ODQ2ODY2NDkzNjY3MTA4ODIzNzcxMDI0NiAgIDM5NzMyMzQ5OTg0Njg2NjQ5MzY2NzEwODgyMzc3NDE4ODYgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjAzNjcgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDYxIGRpdmlkZSAgOTgyNDg1NTkzNTYzODI2MzU5MzQxMDQ0NDE0MjMyNzM1OCAgIDk4MjQ4NTU5MzU2MzgyNjM1OTM0MTA0NDQxNDIzMjg1NzYgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTg3NjAgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDYyIGRpdmlkZSAgNTkxNzA3ODUxNzM0MDIxODEzMTg2NzMyNzMwMDgxNDg2NyAgIDU5MTcwNzg1MTczNDAyMTgxMzE4NjczMjczMDA3ODg3MDEgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDQyMiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjMgZGl2aWRlICA0MzU0MjM2NjAxODMwNTQ0ODgyMjg2MTM5NjEyNTIxMzYyICAgNDM1NDIzNjYwMTgzMDU0NDg4MjI4NjEzOTYxMjU0MzIyMyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0OTc5NCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjQgZGl2aWRlICA4MDU4NDc0NzcyMzc1MjU5MDE3MzQyMTEwMDEzODkxMjk0ICAgODA1ODQ3NDc3MjM3NTI1OTAxNzM0MjExMDAxMzkwNjc5MiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4MDc2OCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjUgZGl2aWRlICA1NTE5NjA0MDIwOTgxNzQ4MTcwNTE3MDkzNzQ2MTY2MzI4ICAgNTUxOTYwNDAyMDk4MTc0ODE3MDUxNzA5Mzc0NjE4MTc2MyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3MjAzNiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNjYgZGl2aWRlICAxNTAyMTMwOTY2ODc5ODA1NDU4ODMxMzIzNzgyNDQzMTM5ICAgMTUwMjEzMDk2Njg3OTgwNTQ1ODgzMTMyMzc4MjQxMjIxMyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwNTg4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA2NyBkaXZpZGUgICA1NjI3OTU2MzM3MTk0ODEyMTI5MTUxNTk3ODc5ODAyNzAgICAgNTYyNzk1NjMzNzE5NDgxMjEyOTE1MTU5Nzg4MDA3MDY2ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTIzODc3ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA2OCBkaXZpZGUgIDY1ODQ3NDMzMjQ0OTQ2NjQyNzM5NDEyODE1NTcyNjg4NzggICA2NTg0NzQzMzI0NDk0NjY0MjczOTQxMjgxNTU3MjU4OTQ1ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE1MDggIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDY5IGRpdmlkZSAgMzYzMjAwMDMyNzI4NTc0Mzk5Nzk3NjQzMTEwOTQxNjUwMCAgIDM2MzIwMDAzMjcyODU3NDM5OTc5NzY0MzExMDk0MDgxMDcgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjMxMSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNzAgZGl2aWRlICAxMTQ1ODI3MjM3MzE1NDMwMDg5Mzg4OTUzODM4NTYxNDUwICAgMTE0NTgyNzIzNzMxNTQzMDA4OTM4ODk1MzgzODUyNzMzMiAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI5Nzc2ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA3MSBkaXZpZGUgIDg4NzQ0MzEwMTAzNTc2OTE4Njk3MjUzNzIzMTczNTAzODAgICA4ODc0NDMxMDEwMzU3NjkxODY5NzI1MzcyMzE3MzE2NDcyICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM4MjEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDcyIGRpdmlkZSAgIDk5Mjk0ODcxODkwMjgwNDY0ODExOTc1MzE0MTIwMjE5NiAgICA5OTI5NDg3MTg5MDI4MDQ2NDgxMTk3NTMxNDEyMzUyMjIgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2NjczOTUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDczIGRpdmlkZSAgMjUyMjczNTE4MzM3NDIxODUwNTE0MjQxNzI2NTQzOTk4OSAgIDI1MjI3MzUxODMzNzQyMTg1MDUxNDI0MTcyNjU0NTM3NzkgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NDUzMzcgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDc0IGRpdmlkZSAgMjY2ODQxOTE2MTkxMjkzNjUwODAwNjg3MjMwMzUwMTA1MiAgIDI2Njg0MTkxNjE5MTI5MzY1MDgwMDY4NzIzMDM0NzEwMzYgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMTI0OSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNzUgZGl2aWRlICAzMDM2MTY5MDg1NjY1MTg2NzEyNTkwOTQxMTExNzc1MDkyICAgMzAzNjE2OTA4NTY2NTE4NjcxMjU5MDk0MTExMTgwODg0NiAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTg4ODgyNyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwNzYgZGl2aWRlICA5NDQxNjM0NjA0OTE3MjMxNjM4NTA4ODk4OTM0MDA2MTQ3ICAgOTQ0MTYzNDYwNDkxNzIzMTYzODUwODg5ODkzNDAwMDI4OCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA3NyBkaXZpZGUgIDI2NzczMDEzNTMxNjQzNzcwOTExMTE0NTg4MTE4MzkxOTAgICAyNjc3MzAxMzUzMTY0Mzc3MDkxMTExNDU4ODExODY3NzIyICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ODkzNDMwICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA3OCBkaXZpZGUgIDY4NDQ5NzkyMDMxMTIwNjYxNjY1ODM3NjU4NTcxNzE0MjYgICA2ODQ0OTc5MjAzMTEyMDY2MTY2NTgzNzY1ODU3MTg5NjgyICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTczMzI5ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA3OSBkaXZpZGUgIDIyMjAzMzc0MzUxNDE3OTY3MjQzMjM3ODM5NjAyMzE2NjEgICAyMjIwMzM3NDM1MTQxNzk2NzI0MzIzNzgzOTYwMjA4Nzc4ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAzMDYgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDgwIGRpdmlkZSAgNjQ0NzQyNDcwMDAxOTc4MzkzMTU2OTk5Njk4OTU2MTM4MCAgIDY0NDc0MjQ3MDAwMTk3ODM5MzE1Njk5OTY5ODk1NzI0NTQgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ODI4MjQgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDgxIGRpdmlkZSAgNzUxMjg1Njc2MjY5NjYwNzExOTg0NzA5MjE5NTU4NzE4MCAgIDc1MTI4NTY3NjI2OTY2MDcxMTk4NDcwOTIxOTU1NTczNDYgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzk3MSAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODIgZGl2aWRlICA3Mzk1MjYxOTgxMTkzOTYwMzk5MDg3ODE5MDc3MjM3NDgyICAgNzM5NTI2MTk4MTE5Mzk2MDM5OTA4NzgxOTA3NzI0MjQ4NyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MzIzMiAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODMgZGl2aWRlICAyMjUzNDQyNDY3NjgyNTg0MDM1NzkyNzI0ODg0Mzc2NzM1ICAgMjI1MzQ0MjQ2NzY4MjU4NDAzNTc5MjcyNDg4NDQwNzE3OCAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTg2NDkwNCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODQgZGl2aWRlICA4MTUzMTM4NjgwMzAwMjEzMTM1NTc3MzM2NDY2MTkwOTk3ICAgODE1MzEzODY4MDMwMDIxMzEzNTU3NzMzNjQ2NjIyMDYwNyAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2MzY4MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODUgZGl2aWRlICA0NjY4NzMxMjUyMjU0MTQ4MDc0MDQxMDIyNjgxODAxMzkwICAgNDY2ODczMTI1MjI1NDE0ODA3NDA0MTAyMjY4MTc3ODEwMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0OTg4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA4NiBkaXZpZGUgIDYwNzg0MDQ1NTc5OTM2Njk2OTYwNDA0MjU1MDE4MTUwNTYgICA2MDc4NDA0NTU3OTkzNjY5Njk2MDQwNDI1NTAxNzk3NjEyICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI4NzAgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDg3IGRpdmlkZSAgMjMwNjM1MjM1OTg3NDI2MTYyMzIyMzM1Njg3ODMxNjI3OCAgIDIzMDYzNTIzNTk4NzQyNjE2MjMyMjMzNTY4NzgzMzU2MTIgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MTYxNzEgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDg4IGRpdmlkZSAgMzI2NDg0MjE4NjY2ODQ4MDM2MjkwMDkwOTU2NDA5MTkwOCAgIDMyNjQ4NDIxODY2Njg0ODAzNjI5MDA5MDk1NjQwNTg2NTggIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDE4NCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwODkgZGl2aWRlICA2OTcxOTg1MDQ3Mjc5NjM2ODc4OTU3OTU5NjA4NjEyMjA0ICAgNjk3MTk4NTA0NzI3OTYzNjg3ODk1Nzk1OTYwODYxNTA4OCAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTg2MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwOTAgZGl2aWRlICA1MjYyODEwODg5OTUyNzIxMjM1NDY2NDQ1OTczODE2MjU3ICAgNTI2MjgxMDg4OTk1MjcyMTIzNTQ2NjQ0NTk3Mzc4MzA3NyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2MzA1ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA5MSBkaXZpZGUgIDc5NDc5NDQ3MzEwMzUyNjcxNzg1NDgzNTcwNzAwODAyODggICA3OTQ3OTQ0NzMxMDM1MjY3MTc4NTQ4MzU3MDcwMDYxMzM5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIzODQgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDkyIGRpdmlkZSAgNTA3MTgwODkwODM5NTM3NTEwODM4MzAzNTgwMDQ0MzIyOSAgIDUwNzE4MDg5MDgzOTUzNzUxMDgzODMwMzU4MDA0MTI0MjkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNjA3MyAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwOTMgZGl2aWRlICAyMDQzMTQ2NTQyMDg0NTAzNjU1NTExNTA3MjA5MjYyOTY5ICAgMjA0MzE0NjU0MjA4NDUwMzY1NTUxMTUwNzIwOTI0OTI2MyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2NzA4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA5NCBkaXZpZGUgIDQwOTc2MzI3MzUzODQ1MzQxODE2NjE5NTk3MzEyNjQ4MDIgICA0MDk3NjMyNzM1Mzg0NTM0MTgxNjYxOTU5NzMxMjM0NDk5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDczOTUgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDk1IGRpdmlkZSAgMzA2MTQ3NzY0MjgzMTM4NzQ4OTcyOTQ2NDU4NzA0NDQzMCAgIDMwNjE0Nzc2NDI4MzEzODc0ODk3Mjk0NjQ1ODcwNTk0NTIgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NTA5MzIgIEluZXhhY3QgUm91bmRlZAorZHFkaXY0MDk2IGRpdmlkZSAgMzQyOTg1NDk0MTAzOTc3NjE1OTQ5ODgwMjkzNjI1MjYzOCAgIDM0Mjk4NTQ5NDEwMzk3NzYxNTk0OTg4MDI5MzYyNDY0MTUgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTgxNCAgSW5leGFjdCBSb3VuZGVkCitkcWRpdjQwOTcgZGl2aWRlICA0ODc0MzI0OTc5NTc4NTk5NzAwMDI0MTMzMjc4Mjg0NTQ1ICAgNDg3NDMyNDk3OTU3ODU5OTcwMDAyNDEzMzI3ODI2MjEzMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0NTk4ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA5OCBkaXZpZGUgIDU3MDE2NTIzNjk2OTE4MzM1NDE0NTU5Nzg1MTU4MjA4ODIgICA1NzAxNjUyMzY5NjkxODMzNTQxNDU1OTc4NTE1ODM0ODU0ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTc1NDk1ICBJbmV4YWN0IFJvdW5kZWQKK2RxZGl2NDA5OSBkaXZpZGUgIDI5MjgyMDU3Mjg0MDI5NDUyNjY5NTMyNTU2MzIzNDMxMTMgICAyOTI4MjA1NzI4NDAyOTQ1MjY2OTUzMjU1NjMyMzczNzk0ICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ODk1MjIzICBJbmV4YWN0IFJvdW5kZWQKKworLS0gTnVsbCB0ZXN0cworZHFkaXY5OTk4IGRpdmlkZSAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZGl2OTk5OSBkaXZpZGUgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFEaXZpZGVJbnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFEaXZpZGVJbnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjkwMzUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcURpdmlkZUludC5kZWNUZXN0CkBAIC0wLDAgKzEsNDUzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxRGl2aWRlSW50LmRlY1Rlc3QgLS0gZGVjUXVhZCBpbnRlZ2VyIGRpdmlzaW9uICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworCitkcWR2aTAwMSBkaXZpZGVpbnQgIDEgICAgIDEgICAgLT4gIDEKK2RxZHZpMDAyIGRpdmlkZWludCAgMiAgICAgMSAgICAtPiAgMgorZHFkdmkwMDMgZGl2aWRlaW50ICAxICAgICAyICAgIC0+ICAwCitkcWR2aTAwNCBkaXZpZGVpbnQgIDIgICAgIDIgICAgLT4gIDEKK2RxZHZpMDA1IGRpdmlkZWludCAgMCAgICAgMSAgICAtPiAgMAorZHFkdmkwMDYgZGl2aWRlaW50ICAwICAgICAyICAgIC0+ICAwCitkcWR2aTAwNyBkaXZpZGVpbnQgIDEgICAgIDMgICAgLT4gIDAKK2RxZHZpMDA4IGRpdmlkZWludCAgMiAgICAgMyAgICAtPiAgMAorZHFkdmkwMDkgZGl2aWRlaW50ICAzICAgICAzICAgIC0+ICAxCisKK2RxZHZpMDEwIGRpdmlkZWludCAgMi40ICAgMSAgICAtPiAgMgorZHFkdmkwMTEgZGl2aWRlaW50ICAyLjQgICAtMSAgIC0+ICAtMgorZHFkdmkwMTIgZGl2aWRlaW50ICAtMi40ICAxICAgIC0+ICAtMgorZHFkdmkwMTMgZGl2aWRlaW50ICAtMi40ICAtMSAgIC0+ICAyCitkcWR2aTAxNCBkaXZpZGVpbnQgIDIuNDAgIDEgICAgLT4gIDIKK2RxZHZpMDE1IGRpdmlkZWludCAgMi40MDAgMSAgICAtPiAgMgorZHFkdmkwMTYgZGl2aWRlaW50ICAyLjQgICAyICAgIC0+ICAxCitkcWR2aTAxNyBkaXZpZGVpbnQgIDIuNDAwIDIgICAgLT4gIDEKK2RxZHZpMDE4IGRpdmlkZWludCAgMi4gICAgMiAgICAtPiAgMQorZHFkdmkwMTkgZGl2aWRlaW50ICAyMCAgICAyMCAgIC0+ICAxCisKK2RxZHZpMDIwIGRpdmlkZWludCAgMTg3ICAgMTg3ICAtPiAgMQorZHFkdmkwMjEgZGl2aWRlaW50ICA1ICAgICAyICAgIC0+ICAyCitkcWR2aTAyMiBkaXZpZGVpbnQgIDUgICAgIDIuMCAgICAtPiAgMgorZHFkdmkwMjMgZGl2aWRlaW50ICA1ICAgICAyLjAwMCAgLT4gIDIKK2RxZHZpMDI0IGRpdmlkZWludCAgNSAgICAgMC4yMDAgIC0+ICAyNQorZHFkdmkwMjUgZGl2aWRlaW50ICA1ICAgICAwLjIwMCAgLT4gIDI1CisKK2RxZHZpMDMwIGRpdmlkZWludCAgMSAgICAgMiAgICAgIC0+ICAwCitkcWR2aTAzMSBkaXZpZGVpbnQgIDEgICAgIDQgICAgICAtPiAgMAorZHFkdmkwMzIgZGl2aWRlaW50ICAxICAgICA4ICAgICAgLT4gIDAKK2RxZHZpMDMzIGRpdmlkZWludCAgMSAgICAgMTYgICAgIC0+ICAwCitkcWR2aTAzNCBkaXZpZGVpbnQgIDEgICAgIDMyICAgICAtPiAgMAorZHFkdmkwMzUgZGl2aWRlaW50ICAxICAgICA2NCAgICAgLT4gIDAKK2RxZHZpMDQwIGRpdmlkZWludCAgMSAgICAtMiAgICAgIC0+IC0wCitkcWR2aTA0MSBkaXZpZGVpbnQgIDEgICAgLTQgICAgICAtPiAtMAorZHFkdmkwNDIgZGl2aWRlaW50ICAxICAgIC04ICAgICAgLT4gLTAKK2RxZHZpMDQzIGRpdmlkZWludCAgMSAgICAtMTYgICAgIC0+IC0wCitkcWR2aTA0NCBkaXZpZGVpbnQgIDEgICAgLTMyICAgICAtPiAtMAorZHFkdmkwNDUgZGl2aWRlaW50ICAxICAgIC02NCAgICAgLT4gLTAKK2RxZHZpMDUwIGRpdmlkZWludCAtMSAgICAgMiAgICAgIC0+IC0wCitkcWR2aTA1MSBkaXZpZGVpbnQgLTEgICAgIDQgICAgICAtPiAtMAorZHFkdmkwNTIgZGl2aWRlaW50IC0xICAgICA4ICAgICAgLT4gLTAKK2RxZHZpMDUzIGRpdmlkZWludCAtMSAgICAgMTYgICAgIC0+IC0wCitkcWR2aTA1NCBkaXZpZGVpbnQgLTEgICAgIDMyICAgICAtPiAtMAorZHFkdmkwNTUgZGl2aWRlaW50IC0xICAgICA2NCAgICAgLT4gLTAKK2RxZHZpMDYwIGRpdmlkZWludCAtMSAgICAtMiAgICAgIC0+ICAwCitkcWR2aTA2MSBkaXZpZGVpbnQgLTEgICAgLTQgICAgICAtPiAgMAorZHFkdmkwNjIgZGl2aWRlaW50IC0xICAgIC04ICAgICAgLT4gIDAKK2RxZHZpMDYzIGRpdmlkZWludCAtMSAgICAtMTYgICAgIC0+ICAwCitkcWR2aTA2NCBkaXZpZGVpbnQgLTEgICAgLTMyICAgICAtPiAgMAorZHFkdmkwNjUgZGl2aWRlaW50IC0xICAgIC02NCAgICAgLT4gIDAKKworLS0gc2ltaWxhciB3aXRoIHBvd2VycyBvZiB0ZW4KK2RxZHZpMTYwIGRpdmlkZWludCAgMSAgICAgMSAgICAgICAgIC0+ICAxCitkcWR2aTE2MSBkaXZpZGVpbnQgIDEgICAgIDEwICAgICAgICAtPiAgMAorZHFkdmkxNjIgZGl2aWRlaW50ICAxICAgICAxMDAgICAgICAgLT4gIDAKK2RxZHZpMTYzIGRpdmlkZWludCAgMSAgICAgMTAwMCAgICAgIC0+ICAwCitkcWR2aTE2NCBkaXZpZGVpbnQgIDEgICAgIDEwMDAwICAgICAtPiAgMAorZHFkdmkxNjUgZGl2aWRlaW50ICAxICAgICAxMDAwMDAgICAgLT4gIDAKK2RxZHZpMTY2IGRpdmlkZWludCAgMSAgICAgMTAwMDAwMCAgIC0+ICAwCitkcWR2aTE2NyBkaXZpZGVpbnQgIDEgICAgIDEwMDAwMDAwICAtPiAgMAorZHFkdmkxNjggZGl2aWRlaW50ICAxICAgICAxMDAwMDAwMDAgLT4gIDAKK2RxZHZpMTcwIGRpdmlkZWludCAgMSAgICAtMSAgICAgICAgIC0+IC0xCitkcWR2aTE3MSBkaXZpZGVpbnQgIDEgICAgLTEwICAgICAgICAtPiAtMAorZHFkdmkxNzIgZGl2aWRlaW50ICAxICAgIC0xMDAgICAgICAgLT4gLTAKK2RxZHZpMTczIGRpdmlkZWludCAgMSAgICAtMTAwMCAgICAgIC0+IC0wCitkcWR2aTE3NCBkaXZpZGVpbnQgIDEgICAgLTEwMDAwICAgICAtPiAtMAorZHFkdmkxNzUgZGl2aWRlaW50ICAxICAgIC0xMDAwMDAgICAgLT4gLTAKK2RxZHZpMTc2IGRpdmlkZWludCAgMSAgICAtMTAwMDAwMCAgIC0+IC0wCitkcWR2aTE3NyBkaXZpZGVpbnQgIDEgICAgLTEwMDAwMDAwICAtPiAtMAorZHFkdmkxNzggZGl2aWRlaW50ICAxICAgIC0xMDAwMDAwMDAgLT4gLTAKK2RxZHZpMTgwIGRpdmlkZWludCAtMSAgICAgMSAgICAgICAgIC0+IC0xCitkcWR2aTE4MSBkaXZpZGVpbnQgLTEgICAgIDEwICAgICAgICAtPiAtMAorZHFkdmkxODIgZGl2aWRlaW50IC0xICAgICAxMDAgICAgICAgLT4gLTAKK2RxZHZpMTgzIGRpdmlkZWludCAtMSAgICAgMTAwMCAgICAgIC0+IC0wCitkcWR2aTE4NCBkaXZpZGVpbnQgLTEgICAgIDEwMDAwICAgICAtPiAtMAorZHFkdmkxODUgZGl2aWRlaW50IC0xICAgICAxMDAwMDAgICAgLT4gLTAKK2RxZHZpMTg2IGRpdmlkZWludCAtMSAgICAgMTAwMDAwMCAgIC0+IC0wCitkcWR2aTE4NyBkaXZpZGVpbnQgLTEgICAgIDEwMDAwMDAwICAtPiAtMAorZHFkdmkxODggZGl2aWRlaW50IC0xICAgICAxMDAwMDAwMDAgLT4gLTAKK2RxZHZpMTkwIGRpdmlkZWludCAtMSAgICAtMSAgICAgICAgIC0+ICAxCitkcWR2aTE5MSBkaXZpZGVpbnQgLTEgICAgLTEwICAgICAgICAtPiAgMAorZHFkdmkxOTIgZGl2aWRlaW50IC0xICAgIC0xMDAgICAgICAgLT4gIDAKK2RxZHZpMTkzIGRpdmlkZWludCAtMSAgICAtMTAwMCAgICAgIC0+ICAwCitkcWR2aTE5NCBkaXZpZGVpbnQgLTEgICAgLTEwMDAwICAgICAtPiAgMAorZHFkdmkxOTUgZGl2aWRlaW50IC0xICAgIC0xMDAwMDAgICAgLT4gIDAKK2RxZHZpMTk2IGRpdmlkZWludCAtMSAgICAtMTAwMDAwMCAgIC0+ICAwCitkcWR2aTE5NyBkaXZpZGVpbnQgLTEgICAgLTEwMDAwMDAwICAtPiAgMAorZHFkdmkxOTggZGl2aWRlaW50IC0xICAgIC0xMDAwMDAwMDAgLT4gIDAKKworLS0gc29tZSBsb25nIG9wZXJhbmQgKGF0IHA9OSkgY2FzZXMKK2RxZHZpMDcwIGRpdmlkZWludCAgOTk5OTk5OTk5ICAgICAxICAtPiAgOTk5OTk5OTk5CitkcWR2aTA3MSBkaXZpZGVpbnQgIDk5OTk5OTk5OS40ICAgMSAgLT4gIDk5OTk5OTk5OQorZHFkdmkwNzIgZGl2aWRlaW50ICA5OTk5OTk5OTkuNSAgIDEgIC0+ICA5OTk5OTk5OTkKK2RxZHZpMDczIGRpdmlkZWludCAgOTk5OTk5OTk5LjkgICAxICAtPiAgOTk5OTk5OTk5CitkcWR2aTA3NCBkaXZpZGVpbnQgIDk5OTk5OTk5OS45OTkgMSAgLT4gIDk5OTk5OTk5OQorCitkcWR2aTA5MCBkaXZpZGVpbnQgIDAuICAgICAgICAgICAgMSAgICAtPiAgMAorZHFkdmkwOTEgZGl2aWRlaW50ICAuMCAgICAgICAgICAgIDEgICAgLT4gIDAKK2RxZHZpMDkyIGRpdmlkZWludCAgMC4wMCAgICAgICAgICAxICAgIC0+ICAwCitkcWR2aTA5MyBkaXZpZGVpbnQgIDAuMDBFKzkgICAgICAgMSAgICAtPiAgMAorZHFkdmkwOTQgZGl2aWRlaW50ICAwLjAwMDBFLTUwICAgIDEgICAgLT4gIDAKKworZHFkdmkxMDAgZGl2aWRlaW50ICAxICAxICAgLT4gMQorZHFkdmkxMDEgZGl2aWRlaW50ICAxICAyICAgLT4gMAorZHFkdmkxMDIgZGl2aWRlaW50ICAxICAzICAgLT4gMAorZHFkdmkxMDMgZGl2aWRlaW50ICAxICA0ICAgLT4gMAorZHFkdmkxMDQgZGl2aWRlaW50ICAxICA1ICAgLT4gMAorZHFkdmkxMDUgZGl2aWRlaW50ICAxICA2ICAgLT4gMAorZHFkdmkxMDYgZGl2aWRlaW50ICAxICA3ICAgLT4gMAorZHFkdmkxMDcgZGl2aWRlaW50ICAxICA4ICAgLT4gMAorZHFkdmkxMDggZGl2aWRlaW50ICAxICA5ICAgLT4gMAorZHFkdmkxMDkgZGl2aWRlaW50ICAxICAxMCAgLT4gMAorZHFkdmkxMTAgZGl2aWRlaW50ICAxICAxICAgLT4gMQorZHFkdmkxMTEgZGl2aWRlaW50ICAyICAxICAgLT4gMgorZHFkdmkxMTIgZGl2aWRlaW50ICAzICAxICAgLT4gMworZHFkdmkxMTMgZGl2aWRlaW50ICA0ICAxICAgLT4gNAorZHFkdmkxMTQgZGl2aWRlaW50ICA1ICAxICAgLT4gNQorZHFkdmkxMTUgZGl2aWRlaW50ICA2ICAxICAgLT4gNgorZHFkdmkxMTYgZGl2aWRlaW50ICA3ICAxICAgLT4gNworZHFkdmkxMTcgZGl2aWRlaW50ICA4ICAxICAgLT4gOAorZHFkdmkxMTggZGl2aWRlaW50ICA5ICAxICAgLT4gOQorZHFkdmkxMTkgZGl2aWRlaW50ICAxMCAxICAgLT4gMTAKKworLS0gZnJvbSBEaWFnQmlnRGVjaW1hbAorZHFkdmkxMzEgZGl2aWRlaW50ICAxMDEuMyAgIDEgICAgIC0+ICAxMDEKK2RxZHZpMTMyIGRpdmlkZWludCAgMTAxLjAgICAxICAgICAtPiAgMTAxCitkcWR2aTEzMyBkaXZpZGVpbnQgIDEwMS4zICAgMyAgICAgLT4gIDMzCitkcWR2aTEzNCBkaXZpZGVpbnQgIDEwMS4wICAgMyAgICAgLT4gIDMzCitkcWR2aTEzNSBkaXZpZGVpbnQgIDIuNCAgICAgMSAgICAgLT4gIDIKK2RxZHZpMTM2IGRpdmlkZWludCAgMi40MDAgICAxICAgICAtPiAgMgorZHFkdmkxMzcgZGl2aWRlaW50ICAxOCAgICAgIDE4ICAgIC0+ICAxCitkcWR2aTEzOCBkaXZpZGVpbnQgIDExMjAgICAgMTAwMCAgLT4gIDEKK2RxZHZpMTM5IGRpdmlkZWludCAgMi40ICAgICAyICAgICAtPiAgMQorZHFkdmkxNDAgZGl2aWRlaW50ICAyLjQwMCAgIDIgICAgIC0+ICAxCitkcWR2aTE0MSBkaXZpZGVpbnQgIDAuNSAgICAgMi4wMDAgLT4gIDAKK2RxZHZpMTQyIGRpdmlkZWludCAgOC4wMDUgICA3ICAgICAtPiAgMQorZHFkdmkxNDMgZGl2aWRlaW50ICA1ICAgICAgIDIgICAgIC0+ICAyCitkcWR2aTE0NCBkaXZpZGVpbnQgIDAgICAgICAgMiAgICAgLT4gIDAKK2RxZHZpMTQ1IGRpdmlkZWludCAgMC4wMCAgICAyICAgICAtPiAgMAorCistLSBPdGhlcnMKK2RxZHZpMTUwIGRpdmlkZWludCAgMTIzNDUgIDQuOTk5ICAtPiAgMjQ2OQorZHFkdmkxNTEgZGl2aWRlaW50ICAxMjM0NSAgNC45OSAgIC0+ICAyNDczCitkcWR2aTE1MiBkaXZpZGVpbnQgIDEyMzQ1ICA0LjkgICAgLT4gIDI1MTkKK2RxZHZpMTUzIGRpdmlkZWludCAgMTIzNDUgIDUgICAgICAtPiAgMjQ2OQorZHFkdmkxNTQgZGl2aWRlaW50ICAxMjM0NSAgNS4xICAgIC0+ICAyNDIwCitkcWR2aTE1NSBkaXZpZGVpbnQgIDEyMzQ1ICA1LjAxICAgLT4gIDI0NjQKK2RxZHZpMTU2IGRpdmlkZWludCAgMTIzNDUgIDUuMDAxICAtPiAgMjQ2OAorZHFkdmkxNTcgZGl2aWRlaW50ICAgIDEwMSAgNy42ICAgIC0+ICAxMworCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIGRpdmlkZWludCBieSAwCitkcWR2aTIwMSBkaXZpZGVpbnQgIDAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkdmkyMDIgZGl2aWRlaW50ICAwLjBFNSAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZHZpMjAzIGRpdmlkZWludCAgMC4wMDAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWR2aTIwNCBkaXZpZGVpbnQgIDAuMDAwMSAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMDUgZGl2aWRlaW50ICAwLjAxICAgMCAgIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjA2IGRpdmlkZWludCAgMC4xICAgIDAgICAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTIwNyBkaXZpZGVpbnQgIDEgICAgICAwICAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMDggZGl2aWRlaW50ICAxICAgICAgMC4wIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjA5IGRpdmlkZWludCAxMCAgICAgIDAuMCAtPiBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTIxMCBkaXZpZGVpbnQgMUUrMTAwICAwLjAgLT4gSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmkyMTEgZGl2aWRlaW50IDFFKzM4MCAgMCAgIC0+IEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjE0IGRpdmlkZWludCAgLTAuMDAwMSAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjE1IGRpdmlkZWludCAgLTAuMDEgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjE2IGRpdmlkZWludCAgLTAuMSAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjE3IGRpdmlkZWludCAgLTEgICAgICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjE4IGRpdmlkZWludCAgLTEgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjE5IGRpdmlkZWludCAtMTAgICAgICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjIwIGRpdmlkZWludCAtMUUrMTAwICAwLjAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpMjIxIGRpdmlkZWludCAtMUUrMzgwICAwICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CitkcWR2aTI3MCBkaXZpZGVpbnQgMSAxZTM4NCAgICAgICAgICAtPiAwCitkcWR2aTI3MSBkaXZpZGVpbnQgMSAwLjllMzg0ICAgICAgICAtPiAwCitkcWR2aTI3MiBkaXZpZGVpbnQgMSAwLjk5ZTM4NCAgICAgICAtPiAwCitkcWR2aTI3MyBkaXZpZGVpbnQgMSAwLjk5OTk5OTk5OTk5OTk5OTllMzg0ICAgICAgIC0+IDAKK2RxZHZpMjc0IGRpdmlkZWludCA5ZTM4NCAgICAxICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTI3NSBkaXZpZGVpbnQgOS45ZTM4NCAgMSAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkyNzYgZGl2aWRlaW50IDkuOTllMzg0IDEgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxZHZpMjc3IGRpdmlkZWludCA5Ljk5OTk5OTk5OTk5OTk5OWUzODQgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCitkcWR2aTI4MCBkaXZpZGVpbnQgMC4xIDllLTM4MyAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkyODEgZGl2aWRlaW50IDAuMSA5OWUtMzgzICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxZHZpMjgyIGRpdmlkZWludCAwLjEgOTk5ZS0zODMgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTI4MyBkaXZpZGVpbnQgMC4xIDllLTM4MiAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkyODQgZGl2aWRlaW50IDAuMSA5OWUtMzgyICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gR0QgZWRnZSBjYXNlczogbGhzIHNtYWxsZXIgdGhhbiByaHMgYnV0IG1vcmUgZGlnaXRzCitkcWR2aTMwMSAgZGl2aWRlaW50ICAwLjkgICAgICAyICAgICAgLT4gIDAKK2RxZHZpMzAyICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMCAgICAtPiAgMAorZHFkdmkzMDMgIGRpdmlkZWludCAgMC45ICAgICAgMi4xICAgIC0+ICAwCitkcWR2aTMwNCAgZGl2aWRlaW50ICAwLjkgICAgICAyLjAwICAgLT4gIDAKK2RxZHZpMzA1ICBkaXZpZGVpbnQgIDAuOSAgICAgIDIuMDEgICAtPiAgMAorZHFkdmkzMDYgIGRpdmlkZWludCAgMC4xMiAgICAgMSAgICAgIC0+ICAwCitkcWR2aTMwNyAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAgICAgLT4gIDAKK2RxZHZpMzA4ICBkaXZpZGVpbnQgIDAuMTIgICAgIDEuMDAgICAtPiAgMAorZHFkdmkzMDkgIGRpdmlkZWludCAgMC4xMiAgICAgMS4wICAgIC0+ICAwCitkcWR2aTMxMCAgZGl2aWRlaW50ICAwLjEyICAgICAxLjAwICAgLT4gIDAKK2RxZHZpMzExICBkaXZpZGVpbnQgIDAuMTIgICAgIDIgICAgICAtPiAgMAorZHFkdmkzMTIgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wICAgIC0+ICAwCitkcWR2aTMxMyAgZGl2aWRlaW50ICAwLjEyICAgICAyLjEgICAgLT4gIDAKK2RxZHZpMzE0ICBkaXZpZGVpbnQgIDAuMTIgICAgIDIuMDAgICAtPiAgMAorZHFkdmkzMTUgIGRpdmlkZWludCAgMC4xMiAgICAgMi4wMSAgIC0+ICAwCisKKy0tIGVkZ2UgY2FzZXMgb2YgaW1wb3NzaWJsZQorZHFkdmkzMzAgIGRpdmlkZWludCAgMTIzNDU2Nzk4NzY1NDMyMTk4NzY1NDMyMTg5MDEyMzQ1NiAgMTAgICAgLT4gIDEyMzQ1Njc5ODc2NTQzMjE5ODc2NTQzMjE4OTAxMjM0NQorZHFkdmkzMzEgIGRpdmlkZWludCAgMTIzNDU2Nzk4NzY1NDMyMTk4NzY1NDMyMTg5MDEyMzQ1NiAgIDEgICAgLT4gIDEyMzQ1Njc5ODc2NTQzMjE5ODc2NTQzMjE4OTAxMjM0NTYKK2RxZHZpMzMyICBkaXZpZGVpbnQgIDEyMzQ1Njc5ODc2NTQzMjE5ODc2NTQzMjE4OTAxMjM0NTYgICAwLjEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkzMzMgIGRpdmlkZWludCAgMTIzNDU2Nzk4NzY1NDMyMTk4NzY1NDMyMTg5MDEyMzQ1NiAgIDAuMDEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgW2Zyb20gZGl2aWRlXQorZHFkdmkxMDUxIGRpdmlkZWludCAgMWUrMjc3ICAxZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTEwNTIgZGl2aWRlaW50ICAxZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxZHZpMTA1MyBkaXZpZGVpbnQgLTFlKzI3NyAgMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFkdmkxMDU0IGRpdmlkZWludCAtMWUrMjc3IC0xZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcWR2aTEwNTUgZGl2aWRlaW50ICAxZS0yNzcgIDFlKzMxMSAtPiAgMAorZHFkdmkxMDU2IGRpdmlkZWludCAgMWUtMjc3IC0xZSszMTEgLT4gLTAKK2RxZHZpMTA1NyBkaXZpZGVpbnQgLTFlLTI3NyAgMWUrMzExIC0+IC0wCitkcWR2aTEwNTggZGl2aWRlaW50IC0xZS0yNzcgLTFlKzMxMSAtPiAgMAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RxZHZpMTA2MCBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwMSAtPiAwCitkcWR2aTEwNjEgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDIgLT4gMAorZHFkdmkxMDYyIGRpdmlkZWludCAxZS0yOTEgMWUrMTAzIC0+IDAKK2RxZHZpMTA2MyBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwNCAtPiAwCitkcWR2aTEwNjQgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDUgLT4gMAorZHFkdmkxMDY1IGRpdmlkZWludCAxZS0yOTEgMWUrMTA2IC0+IDAKK2RxZHZpMTA2NiBkaXZpZGVpbnQgMWUtMjkxIDFlKzEwNyAtPiAwCitkcWR2aTEwNjcgZGl2aWRlaW50IDFlLTI5MSAxZSsxMDggLT4gMAorZHFkdmkxMDY4IGRpdmlkZWludCAxZS0yOTEgMWUrMTA5IC0+IDAKK2RxZHZpMTA2OSBkaXZpZGVpbnQgMWUtMjkxIDFlKzExMCAtPiAwCisKK2RxZHZpMTEwMSBkaXZpZGVpbnQgIDEuMDAwMEUtMzk0ICAxICAgICAtPiAwCitkcWR2aTExMDIgZGl2aWRlaW50ICAxLjAwMEUtMzk0ICAgMWUrMSAgLT4gMAorZHFkdmkxMTAzIGRpdmlkZWludCAgMS4wMEUtMzk0ICAgIDFlKzIgIC0+IDAKKworZHFkdmkxMTE4IGRpdmlkZWludCAgMUUtMzk0ICAgICAgIDFlKzQgIC0+IDAKK2RxZHZpMTExOSBkaXZpZGVpbnQgIDNFLTM5NCAgICAgIC0xZSs1ICAtPiAtMAorZHFkdmkxMTIwIGRpdmlkZWludCAgNUUtMzk0ICAgICAgIDFlKzUgIC0+IDAKKworZHFkdmkxMTI0IGRpdmlkZWludCAgMUUtMzk0ICAgICAgLTFlKzQgIC0+IC0wCitkcWR2aTExMzAgZGl2aWRlaW50ICAzLjBFLTM5NCAgICAtMWUrNSAgLT4gLTAKKworZHFkdmkxMTMxIGRpdmlkZWludCAgMS4wRS0xOTkgICAgIDFlKzIwMCAtPiAwCitkcWR2aTExMzIgZGl2aWRlaW50ICAxLjBFLTE5OSAgICAgMWUrMTk5IC0+IDAKK2RxZHZpMTEzMyBkaXZpZGVpbnQgIDEuMEUtMTk5ICAgICAxZSsxOTggLT4gMAorZHFkdmkxMTM0IGRpdmlkZWludCAgMi4wRS0xOTkgICAgIDJlKzE5OCAtPiAwCitkcWR2aTExMzUgZGl2aWRlaW50ICA0LjBFLTE5OSAgICAgNGUrMTk4IC0+IDAKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworZHFkdmk0MDEgZGl2aWRlaW50IDEyMzQ1Njc4MDAwIDEwMCAtPiAxMjM0NTY3ODAKK2RxZHZpNDAyIGRpdmlkZWludCAxIDEyMzQ1Njc4MDAwICAgLT4gMAorZHFkdmk0MDMgZGl2aWRlaW50IDEyMzQ1Njc4MDAgIDEwICAtPiAxMjM0NTY3ODAKK2RxZHZpNDA0IGRpdmlkZWludCAxIDEyMzQ1Njc4MDAgICAgLT4gMAorZHFkdmk0MDUgZGl2aWRlaW50IDEyMzQ1Njc4OTAgIDEwICAtPiAxMjM0NTY3ODkKK2RxZHZpNDA2IGRpdmlkZWludCAxIDEyMzQ1Njc4OTAgICAgLT4gMAorZHFkdmk0MDcgZGl2aWRlaW50IDEyMzQ1Njc4OTEgIDEwICAtPiAxMjM0NTY3ODkKK2RxZHZpNDA4IGRpdmlkZWludCAxIDEyMzQ1Njc4OTEgICAgLT4gMAorZHFkdmk0MDkgZGl2aWRlaW50IDEyMzQ1Njc4OTAxIDEwMCAtPiAxMjM0NTY3ODkKK2RxZHZpNDEwIGRpdmlkZWludCAxIDEyMzQ1Njc4OTAxICAgLT4gMAorZHFkdmk0MTEgZGl2aWRlaW50IDEyMzQ1Njc4OTYgIDEwICAtPiAxMjM0NTY3ODkKK2RxZHZpNDEyIGRpdmlkZWludCAxIDEyMzQ1Njc4OTYgICAgLT4gMAorZHFkdmk0MTMgZGl2aWRlaW50IDEyMzQ1Njc4OTQ4IDEwMCAtPiAxMjM0NTY3ODkKK2RxZHZpNDE0IGRpdmlkZWludCAxMjM0NTY3ODk0OSAxMDAgLT4gMTIzNDU2Nzg5CitkcWR2aTQxNSBkaXZpZGVpbnQgMTIzNDU2Nzg5NTAgMTAwIC0+IDEyMzQ1Njc4OQorZHFkdmk0MTYgZGl2aWRlaW50IDEyMzQ1Njc4OTUxIDEwMCAtPiAxMjM0NTY3ODkKK2RxZHZpNDE3IGRpdmlkZWludCAxMjM0NTY3ODk5OSAxMDAgLT4gMTIzNDU2Nzg5CitkcWR2aTQ0MSBkaXZpZGVpbnQgMTIzNDU2NzgwMDAgMSAtPiAxMjM0NTY3ODAwMAorZHFkdmk0NDIgZGl2aWRlaW50IDEgMTIzNDU2NzgwMDAgLT4gMAorZHFkdmk0NDMgZGl2aWRlaW50IDEyMzQ1Njc4MDAgIDEgLT4gMTIzNDU2NzgwMAorZHFkdmk0NDQgZGl2aWRlaW50IDEgMTIzNDU2NzgwMCAgLT4gMAorZHFkdmk0NDUgZGl2aWRlaW50IDEyMzQ1Njc4OTAgIDEgLT4gMTIzNDU2Nzg5MAorZHFkdmk0NDYgZGl2aWRlaW50IDEgMTIzNDU2Nzg5MCAgLT4gMAorZHFkdmk0NDcgZGl2aWRlaW50IDEyMzQ1Njc4OTEgIDEgLT4gMTIzNDU2Nzg5MQorZHFkdmk0NDggZGl2aWRlaW50IDEgMTIzNDU2Nzg5MSAgLT4gMAorZHFkdmk0NDkgZGl2aWRlaW50IDEyMzQ1Njc4OTAxIDEgLT4gMTIzNDU2Nzg5MDEKK2RxZHZpNDUwIGRpdmlkZWludCAxIDEyMzQ1Njc4OTAxIC0+IDAKK2RxZHZpNDUxIGRpdmlkZWludCAxMjM0NTY3ODk2ICAxIC0+IDEyMzQ1Njc4OTYKK2RxZHZpNDUyIGRpdmlkZWludCAxIDEyMzQ1Njc4OTYgIC0+IDAKKworLS0gbW9yZSB6ZXJvcywgZXRjLgorZHFkdmk1MzEgZGl2aWRlaW50IDUuMDAgMUUtMyAgICAtPiA1MDAwCitkcWR2aTUzMiBkaXZpZGVpbnQgMDAuMDAgMC4wMDAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZHZpNTMzIGRpdmlkZWludCAwMC4wMCAwRS0zICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFkdmk1MzQgZGl2aWRlaW50ICAwICAgIC0wICAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcWR2aTUzNSBkaXZpZGVpbnQgLTAgICAgIDAgICAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxZHZpNTM2IGRpdmlkZWludCAtMCAgICAtMCAgICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorCitkcWR2aTU0MSBkaXZpZGVpbnQgIDAgICAgLTEgICAgIC0+IC0wCitkcWR2aTU0MiBkaXZpZGVpbnQgLTAgICAgLTEgICAgIC0+ICAwCitkcWR2aTU0MyBkaXZpZGVpbnQgIDAgICAgIDEgICAgIC0+ICAwCitkcWR2aTU0NCBkaXZpZGVpbnQgLTAgICAgIDEgICAgIC0+IC0wCitkcWR2aTU0NSBkaXZpZGVpbnQgLTEgICAgIDAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU0NiBkaXZpZGVpbnQgLTEgICAgLTAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU0NyBkaXZpZGVpbnQgIDEgICAgIDAgICAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU0OCBkaXZpZGVpbnQgIDEgICAgLTAgICAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKK2RxZHZpNTUxIGRpdmlkZWludCAgMC4wICAtMSAgICAgLT4gLTAKK2RxZHZpNTUyIGRpdmlkZWludCAtMC4wICAtMSAgICAgLT4gIDAKK2RxZHZpNTUzIGRpdmlkZWludCAgMC4wICAgMSAgICAgLT4gIDAKK2RxZHZpNTU0IGRpdmlkZWludCAtMC4wICAgMSAgICAgLT4gLTAKK2RxZHZpNTU1IGRpdmlkZWludCAtMS4wICAgMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTU2IGRpdmlkZWludCAtMS4wICAtMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTU3IGRpdmlkZWludCAgMS4wICAgMCAgICAgLT4gIEluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxZHZpNTU4IGRpdmlkZWludCAgMS4wICAtMCAgICAgLT4gLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KKworZHFkdmk1NjEgZGl2aWRlaW50ICAwICAgIC0xLjAgICAtPiAtMAorZHFkdmk1NjIgZGl2aWRlaW50IC0wICAgIC0xLjAgICAtPiAgMAorZHFkdmk1NjMgZGl2aWRlaW50ICAwICAgICAxLjAgICAtPiAgMAorZHFkdmk1NjQgZGl2aWRlaW50IC0wICAgICAxLjAgICAtPiAtMAorZHFkdmk1NjUgZGl2aWRlaW50IC0xICAgICAwLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmk1NjYgZGl2aWRlaW50IC0xICAgIC0wLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmk1NjcgZGl2aWRlaW50ICAxICAgICAwLjAgICAtPiAgSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworZHFkdmk1NjggZGl2aWRlaW50ICAxICAgIC0wLjAgICAtPiAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworCitkcWR2aTU3MSBkaXZpZGVpbnQgIDAuMCAgLTEuMCAgIC0+IC0wCitkcWR2aTU3MiBkaXZpZGVpbnQgLTAuMCAgLTEuMCAgIC0+ICAwCitkcWR2aTU3MyBkaXZpZGVpbnQgIDAuMCAgIDEuMCAgIC0+ICAwCitkcWR2aTU3NCBkaXZpZGVpbnQgLTAuMCAgIDEuMCAgIC0+IC0wCitkcWR2aTU3NSBkaXZpZGVpbnQgLTEuMCAgIDAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU3NiBkaXZpZGVpbnQgLTEuMCAgLTAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU3NyBkaXZpZGVpbnQgIDEuMCAgIDAuMCAgIC0+ICBJbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCitkcWR2aTU3OCBkaXZpZGVpbnQgIDEuMCAgLTAuMCAgIC0+IC1JbmZpbml0eSBEaXZpc2lvbl9ieV96ZXJvCisKKy0tIFNwZWNpYWxzCitkcWR2aTU4MCBkaXZpZGVpbnQgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNTgxIGRpdmlkZWludCAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcWR2aTU4MiBkaXZpZGVpbnQgIEluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFkdmk1ODMgZGl2aWRlaW50ICBJbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2RxZHZpNTg0IGRpdmlkZWludCAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitkcWR2aTU4NSBkaXZpZGVpbnQgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZHFkdmk1ODYgZGl2aWRlaW50ICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RxZHZpNTg3IGRpdmlkZWludCAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk1ODggZGl2aWRlaW50IC0xMDAwICBJbmYgICAtPiAtMAorZHFkdmk1ODkgZGl2aWRlaW50IC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTU5MCBkaXZpZGVpbnQgLTEgICAgIEluZiAgIC0+IC0wCitkcWR2aTU5MSBkaXZpZGVpbnQgLTAgICAgIEluZiAgIC0+IC0wCitkcWR2aTU5MiBkaXZpZGVpbnQgIDAgICAgIEluZiAgIC0+ICAwCitkcWR2aTU5MyBkaXZpZGVpbnQgIDEgICAgIEluZiAgIC0+ICAwCitkcWR2aTU5NCBkaXZpZGVpbnQgIDEwMDAgIEluZiAgIC0+ICAwCitkcWR2aTU5NSBkaXZpZGVpbnQgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFkdmk2MDAgZGl2aWRlaW50IC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTYwMSBkaXZpZGVpbnQgLUluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFkdmk2MDIgZGl2aWRlaW50IC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RxZHZpNjAzIGRpdmlkZWludCAtSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkcWR2aTYwNCBkaXZpZGVpbnQgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZHFkdmk2MDUgZGl2aWRlaW50IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RxZHZpNjA2IGRpdmlkZWludCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkcWR2aTYwNyBkaXZpZGVpbnQgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjA4IGRpdmlkZWludCAtMTAwMCAgSW5mICAgLT4gLTAKK2RxZHZpNjA5IGRpdmlkZWludCAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2MTAgZGl2aWRlaW50IC0xICAgIC1JbmYgICAtPiAgMAorZHFkdmk2MTEgZGl2aWRlaW50IC0wICAgIC1JbmYgICAtPiAgMAorZHFkdmk2MTIgZGl2aWRlaW50ICAwICAgIC1JbmYgICAtPiAtMAorZHFkdmk2MTMgZGl2aWRlaW50ICAxICAgIC1JbmYgICAtPiAtMAorZHFkdmk2MTQgZGl2aWRlaW50ICAxMDAwIC1JbmYgICAtPiAtMAorZHFkdmk2MTUgZGl2aWRlaW50ICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxZHZpNjIxIGRpdmlkZWludCAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFkdmk2MjIgZGl2aWRlaW50ICBOYU4gLTEwMDAgICAtPiAgTmFOCitkcWR2aTYyMyBkaXZpZGVpbnQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RxZHZpNjI0IGRpdmlkZWludCAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFkdmk2MjUgZGl2aWRlaW50ICBOYU4gIDAgICAgICAtPiAgTmFOCitkcWR2aTYyNiBkaXZpZGVpbnQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RxZHZpNjI3IGRpdmlkZWludCAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFkdmk2MjggZGl2aWRlaW50ICBOYU4gIEluZiAgICAtPiAgTmFOCitkcWR2aTYyOSBkaXZpZGVpbnQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxZHZpNjMwIGRpdmlkZWludCAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFkdmk2MzEgZGl2aWRlaW50IC0xMDAwIE5hTiAgICAtPiAgTmFOCitkcWR2aTYzMiBkaXZpZGVpbnQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RxZHZpNjMzIGRpdmlkZWludCAtMCAgICBOYU4gICAgLT4gIE5hTgorZHFkdmk2MzQgZGl2aWRlaW50ICAwICAgIE5hTiAgICAtPiAgTmFOCitkcWR2aTYzNSBkaXZpZGVpbnQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RxZHZpNjM2IGRpdmlkZWludCAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFkdmk2MzcgZGl2aWRlaW50ICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RxZHZpNjQxIGRpdmlkZWludCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQyIGRpdmlkZWludCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQzIGRpdmlkZWludCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQ0IGRpdmlkZWludCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQ1IGRpdmlkZWludCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQ2IGRpdmlkZWludCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQ3IGRpdmlkZWludCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQ4IGRpdmlkZWludCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjQ5IGRpdmlkZWludCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjUwIGRpdmlkZWludCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjUxIGRpdmlkZWludCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjUyIGRpdmlkZWludCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjUzIGRpdmlkZWludCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjU0IGRpdmlkZWludCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjU1IGRpdmlkZWludCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjU2IGRpdmlkZWludCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjU3IGRpdmlkZWludCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjU4IGRpdmlkZWludCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjU5IGRpdmlkZWludCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFkdmk2NjEgZGl2aWRlaW50ICBOYU45IC1JbmYgICAtPiAgTmFOOQorZHFkdmk2NjIgZGl2aWRlaW50ICBOYU44ICAxMDAwICAtPiAgTmFOOAorZHFkdmk2NjMgZGl2aWRlaW50ICBOYU43ICBJbmYgICAtPiAgTmFONworZHFkdmk2NjQgZGl2aWRlaW50IC1OYU42ICBOYU41ICAtPiAtTmFONgorZHFkdmk2NjUgZGl2aWRlaW50IC1JbmYgICBOYU40ICAtPiAgTmFONAorZHFkdmk2NjYgZGl2aWRlaW50IC0xMDAwICBOYU4zICAtPiAgTmFOMworZHFkdmk2NjcgZGl2aWRlaW50ICBJbmYgIC1OYU4yICAtPiAtTmFOMgorCitkcWR2aTY3MSBkaXZpZGVpbnQgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NzIgZGl2aWRlaW50ICBzTmFOOTggLTEgICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjczIGRpdmlkZWludCAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTY3NCBkaXZpZGVpbnQgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NzUgZGl2aWRlaW50ICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjc2IGRpdmlkZWludCAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcWR2aTY3NyBkaXZpZGVpbnQgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk2NzggZGl2aWRlaW50ICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxZHZpNjc5IGRpdmlkZWludCAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEd5dXJpcyBleGFtcGxlCitkcWR2aTcwMCBkaXZpZGVpbnQgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODE3MDlFLTYxNDMgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODkwMDBFLTYxNDMgLT4gMAorCistLSBOdWxsIHRlc3RzCitkcWR2aTkwMCBkaXZpZGVpbnQgIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFkdmk5MDEgZGl2aWRlaW50ICAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFFbmNvZGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFFbmNvZGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWVkZjViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUVuY29kZS5kZWNUZXN0CkBAIC0wLDAgKzEsNDc3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxRW5jb2RlLmRlY1Rlc3QgLS0gZGVjaW1hbCBzaXh0ZWVuLWJ5dGUgZm9ybWF0IHRlc3RjYXNlcyAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDAsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFtQcmV2aW91c2x5IGNhbGxlZCBkZWNpbWFsMTI4LmRlY1Rlc3RdCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIGlzIGZvciB0aGUgc2l4dGVlbi1ieXRlIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9uLgorLS0gSXRzIGNoYXJhY3RlcmlzdGljcyBhcmU6CistLQorLS0gICAxIGJpdCAgc2lnbgorLS0gICA1IGJpdHMgY29tYmluYXRpb24gZmllbGQKKy0tICAxMiBiaXRzIGV4cG9uZW50IGNvbnRpbnVhdGlvbgorLS0gMTEwIGJpdHMgY29lZmZpY2llbnQgY29udGludWF0aW9uCistLQorLS0gVG90YWwgZXhwb25lbnQgbGVuZ3RoIDE0IGJpdHMKKy0tIFRvdGFsIGNvZWZmaWNpZW50IGxlbmd0aCAxMTQgYml0cyAoMzQgZGlnaXRzKQorLS0KKy0tIEVsaW1pdCA9IDEyMjg3IChtYXhpbXVtIGVuY29kZWQgZXhwb25lbnQpCistLSBFbWF4ICAgPSAgNjE0NCAobGFyZ2VzdCBleHBvbmVudCB2YWx1ZSkKKy0tIEVtaW4gICA9IC02MTQzIChzbWFsbGVzdCBleHBvbmVudCB2YWx1ZSkKKy0tIGJpYXMgICA9ICA2MTc2IChzdWJ0cmFjdGVkIGZyb20gZW5jb2RlZCBleHBvbmVudCkgPSAtRXRpbnkKKworLS0gVGhlIHRlc3RjYXNlcyBoZXJlIGhhdmUgb25seSBleGFjdGx5IHJlcHJlc2VudGFibGUgZGF0YSBvbiB0aGUKKy0tICdsZWZ0LWhhbmQtc2lkZSc7IHJvdW5kaW5nIGZyb20gc3RyaW5ncyBpcyB0ZXN0ZWQgaW4gJ2Jhc2UnCistLSB0ZXN0Y2FzZSBncm91cHMuCisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworCistLSBHZW5lcmFsIHRlc3RjYXNlcworLS0gKG1vc3RseSBkZXJpdmVkIGZyb20gdGhlIFN0cmF3bWFuIDQgZG9jdW1lbnQgYW5kIGV4YW1wbGVzKQorZGVjcTAwMSBhcHBseSAgICNBMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMCAtPiAtNy41MAorZGVjcTAwMiBhcHBseSAgIC03LjUwICAgICAgICAgICAgIC0+ICNBMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMAorLS0gZGVyaXZhdGl2ZSBjYW5vbmljYWwgcGxhaW4gc3RyaW5ncworZGVjcTAwMyBhcHBseSAgICNBMjA4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMCAtPiAtNy41MEUrMworZGVjcTAwNCBhcHBseSAgIC03LjUwRSszICAgICAgICAgIC0+ICNBMjA4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMAorZGVjcTAwNSBhcHBseSAgICNBMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMCAtPiAtNzUwCitkZWNxMDA2IGFwcGx5ICAgLTc1MCAgICAgICAgICAgICAgLT4gI0EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCitkZWNxMDA3IGFwcGx5ICAgI0EyMDdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC03NS4wCitkZWNxMDA4IGFwcGx5ICAgLTc1LjAgICAgICAgICAgICAgLT4gI0EyMDdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCitkZWNxMDA5IGFwcGx5ICAgI0EyMDc0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC0wLjc1MAorZGVjcTAxMCBhcHBseSAgIC0wLjc1MCAgICAgICAgICAgIC0+ICNBMjA3NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMAorZGVjcTAxMSBhcHBseSAgICNBMjA3MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMCAtPiAtMC4wNzUwCitkZWNxMDEyIGFwcGx5ICAgLTAuMDc1MCAgICAgICAgICAgLT4gI0EyMDcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwCitkZWNxMDEzIGFwcGx5ICAgI0EyMDY4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM0QwIC0+IC0wLjAwMDc1MAorZGVjcTAxNCBhcHBseSAgIC0wLjAwMDc1MCAgICAgICAgIC0+ICNBMjA2ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMAorZGVjcTAxNSBhcHBseSAgICNBMjA2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMCAtPiAtMC4wMDAwMDc1MAorZGVjcTAxNiBhcHBseSAgIC0wLjAwMDAwNzUwICAgICAgIC0+ICNBMjA2MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMAorZGVjcTAxNyBhcHBseSAgICNBMjA1YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMCAtPiAtNy41MEUtNworZGVjcTAxOCBhcHBseSAgIC03LjUwRS03ICAgICAgICAgIC0+ICNBMjA1YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNEMAorCistLSBOb3JtYWxpdHkKK2RlY3EwMjAgYXBwbHkgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLT4gIzI2MDgxMzRiOWMxZTI4ZTU2ZjNjMTI3MTc3ODIzNTM0CitkZWNxMDIxIGFwcGx5ICAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0+ICNhNjA4MTM0YjljMWUyOGU1NmYzYzEyNzE3NzgyMzUzNAorZGVjcTAyMiBhcHBseSAgIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgICAtPiAjMjYwODA5MTI0NDkxMjQ0OTEyNDQ5MTI0NDkxMjQ0OTEKKworLS0gTm1heCBhbmQgc2ltaWxhcgorZGVjcTAzMSBhcHBseSAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKK2RlY3EwMzIgYXBwbHkgICAjNzdmZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RlY3EwMzMgYXBwbHkgICAxLjIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNEUrNjE0NCAtPiAjNDdmZmQzNGI5YzFlMjhlNTZmM2MxMjcxNzc4MjM1MzQKK2RlY3EwMzQgYXBwbHkgICAjNDdmZmQzNGI5YzFlMjhlNTZmM2MxMjcxNzc4MjM1MzQgLT4gMS4yMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzRFKzYxNDQKKy0tIGZvbGQtZG93bnMgKG1vcmUgYmVsb3cpCitkZWNxMDM1IGFwcGx5ICAgMS4yM0UrNjE0NCAgICAtPiAjNDdmZmQzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTAzNiBhcHBseSAgICM0N2ZmZDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjIzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NAorZGVjcTAzNyBhcHBseSAgIDFFKzYxNDQgICAgICAgLT4gIzQ3ZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3EwMzggYXBwbHkgICAjNDdmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQKKworZGVjcTA1MSBhcHBseSAgIDEyMzQ1ICAgICAgICAgICAgICAgICAgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNQorZGVjcTA1MiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNSAgICAgICAtPiAxMjM0NQorZGVjcTA1MyBhcHBseSAgIDEyMzQgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUzNAorZGVjcTA1NCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUzNCAgICAgICAtPiAxMjM0CitkZWNxMDU1IGFwcGx5ICAgMTIzICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGEzCitkZWNxMDU2IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGEzICAgICAgIC0+IDEyMworZGVjcTA1NyBhcHBseSAgIDEyICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMgorZGVjcTA1OCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMiAgICAgICAtPiAxMgorZGVjcTA1OSBhcHBseSAgIDEgICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZGVjcTA2MCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAtPiAxCitkZWNxMDYxIGFwcGx5ICAgMS4yMyAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGEzCitkZWNxMDYyIGFwcGx5ICAgIzIyMDc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGEzICAgICAgIC0+IDEuMjMKK2RlY3EwNjMgYXBwbHkgICAxMjMuNDUgICAgICAgICAgICAgICAgICAtPiAjMjIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ5YzUKK2RlY3EwNjQgYXBwbHkgICAjMjIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ5YzUgICAgICAgLT4gMTIzLjQ1CisKKy0tIE5taW4gYW5kIGJlbG93CitkZWNxMDcxIGFwcGx5ICAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICMwMDA4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZGVjcTA3MiBhcHBseSAgICMwMDA4NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgICAtPiAxRS02MTQzCitkZWNxMDczIGFwcGx5ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICMwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTA3NCBhcHBseSAgICMwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZGVjcTA3NSBhcHBseSAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzICAtPiAjMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RlY3EwNzYgYXBwbHkgICAjMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKKworZGVjcTA3NyBhcHBseSAgIDAuMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAjMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICBTdWJub3JtYWwKK2RlY3EwNzggYXBwbHkgICAjMDAwMDA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NCAgU3Vibm9ybWFsCitkZWNxMDc5IGFwcGx5ICAgMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTBFLTYxNDMgIC0+ICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgICAgIFN1Ym5vcm1hbAorZGVjcTA4MCBhcHBseSAgICMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgICAgICAgICAtPiAxLjBFLTYxNzUgICAgICAgICAgICAgIFN1Ym5vcm1hbAorZGVjcTA4MSBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMgICAtPiAjMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICBTdWJub3JtYWwKK2RlY3EwODIgYXBwbHkgICAjMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgICAgLT4gMUUtNjE3NSAgICAgICAgICAgICAgICBTdWJub3JtYWwKK2RlY3EwODMgYXBwbHkgICAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MyAgLT4gIzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgU3Vibm9ybWFsCitkZWNxMDg0IGFwcGx5ICAgIzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgICAgIC0+IDFFLTYxNzYgICAgICAgICAgICAgICAgIFN1Ym5vcm1hbAorCistLSB1bmRlcmZsb3dzIGNhbm5vdCBiZSB0ZXN0ZWQgZm9yIHNpbXBsZSBjb3BpZXMsIGNoZWNrIGVkZ2UgY2FzZXMKK2RlY3EwOTAgYXBwbHkgICAxZS02MTc2ICAgICAgICAgICAgICAgICAgLT4gIzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICBTdWJub3JtYWwKK2RlY3ExMDAgYXBwbHkgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTllLTYxNzYgLT4gIzAwMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBTdWJub3JtYWwKKworLS0gc2FtZSBhZ2FpbiwgbmVnYXRpdmVzCistLSBObWF4IGFuZCBzaW1pbGFyCitkZWNxMTIyIGFwcGx5ICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+ICNmN2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZGVjcTEyMyBhcHBseSAgICNmN2ZmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZiAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RlY3ExMjQgYXBwbHkgIC0xLjIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNEUrNjE0NCAtPiAjYzdmZmQzNGI5YzFlMjhlNTZmM2MxMjcxNzc4MjM1MzQKK2RlY3ExMjUgYXBwbHkgICAjYzdmZmQzNGI5YzFlMjhlNTZmM2MxMjcxNzc4MjM1MzQgLT4gLTEuMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0RSs2MTQ0CistLSBmb2xkLWRvd25zIChtb3JlIGJlbG93KQorZGVjcTEzMCBhcHBseSAgLTEuMjNFKzYxNDQgICAgLT4gI2M3ZmZkMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3ExMzEgYXBwbHkgICAjYzdmZmQzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gLTEuMjMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0CitkZWNxMTMyIGFwcGx5ICAtMUUrNjE0NCAgICAgICAtPiAjYzdmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTEzMyBhcHBseSAgICNjN2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQKKworZGVjcTE1MSBhcHBseSAgLTEyMzQ1ICAgICAgICAgICAgICAgICAgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNQorZGVjcTE1MiBhcHBseSAgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDljNSAgICAgICAtPiAtMTIzNDUKK2RlY3ExNTMgYXBwbHkgIC0xMjM0ICAgICAgICAgICAgICAgICAgICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1MzQKK2RlY3ExNTQgYXBwbHkgICAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1MzQgICAgICAgLT4gLTEyMzQKK2RlY3ExNTUgYXBwbHkgIC0xMjMgICAgICAgICAgICAgICAgICAgICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMKK2RlY3ExNTYgYXBwbHkgICAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMgICAgICAgLT4gLTEyMworZGVjcTE1NyBhcHBseSAgLTEyICAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMgorZGVjcTE1OCBhcHBseSAgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMiAgICAgICAtPiAtMTIKK2RlY3ExNTkgYXBwbHkgIC0xICAgICAgICAgICAgICAgICAgICAgICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RlY3ExNjAgYXBwbHkgICAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgLT4gLTEKK2RlY3ExNjEgYXBwbHkgIC0xLjIzICAgICAgICAgICAgICAgICAgICAtPiAjYTIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMKK2RlY3ExNjIgYXBwbHkgICAjYTIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwYTMgICAgICAgLT4gLTEuMjMKK2RlY3ExNjMgYXBwbHkgIC0xMjMuNDUgICAgICAgICAgICAgICAgICAtPiAjYTIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ5YzUKK2RlY3ExNjQgYXBwbHkgICAjYTIwNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ5YzUgICAgICAgLT4gLTEyMy40NQorCistLSBObWluIGFuZCBiZWxvdworZGVjcTE3MSBhcHBseSAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAjODAwODQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RlY3ExNzIgYXBwbHkgICAjODAwODQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgICAgLT4gLTFFLTYxNDMKK2RlY3ExNzMgYXBwbHkgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gIzg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxMTc0IGFwcGx5ICAgIzg0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZGVjcTE3NSBhcHBseSAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzICAtPiAjODQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RlY3ExNzYgYXBwbHkgICAjODQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCisKK2RlY3ExNzcgYXBwbHkgIC0wLjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gIzgwMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgU3Vibm9ybWFsCitkZWNxMTc4IGFwcGx5ICAgIzgwMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0ICBTdWJub3JtYWwKK2RlY3ExNzkgYXBwbHkgIC0wLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMEUtNjE0MyAgLT4gIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAgICAgU3Vibm9ybWFsCitkZWNxMTgwIGFwcGx5ICAgIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAgICAgICAgIC0+IC0xLjBFLTYxNzUgICAgICAgICAgICAgIFN1Ym5vcm1hbAorZGVjcTE4MSBhcHBseSAgLTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMgICAtPiAjODAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICBTdWJub3JtYWwKK2RlY3ExODIgYXBwbHkgICAjODAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgICAgLT4gLTFFLTYxNzUgICAgICAgICAgICAgICAgU3Vibm9ybWFsCitkZWNxMTgzIGFwcGx5ICAtMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMgIC0+ICM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgIFN1Ym5vcm1hbAorZGVjcTE4NCBhcHBseSAgICM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAgICAgICAtPiAtMUUtNjE3NiAgICAgICAgICAgICAgICAgU3Vibm9ybWFsCisKKy0tIHVuZGVyZmxvdyBlZGdlIGNhc2VzCitkZWNxMTkwIGFwcGx5ICAgLTFlLTYxNzYgICAgICAgICAgICAgICAgICAtPiAjODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIFN1Ym5vcm1hbAorZGVjcTIwMCBhcHBseSAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTllLTYxNzYgLT4gIzgwMDAwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmICBTdWJub3JtYWwKKworLS0gemVyb3MKK2RlY3E0MDAgYXBwbHkgICAwRS04MDAwICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY3E0MDEgYXBwbHkgICAwRS02MTc3ICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY3E0MDIgYXBwbHkgICAwRS02MTc2ICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E0MDMgYXBwbHkgICAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUtNjE3NgorZGVjcTQwNCBhcHBseSAgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E0MDUgYXBwbHkgICAjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUtNjE3NgorZGVjcTQwNiBhcHBseSAgIDBFLTIgICAgICAgICAgICAgICAgICAgIC0+ICMyMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQwNyBhcHBseSAgICMyMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwLjAwCitkZWNxNDA4IGFwcGx5ICAgMCAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDA5IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDAKK2RlY3E0MTAgYXBwbHkgICAwRSszICAgICAgICAgICAgICAgICAgICAtPiAjMjIwOGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E0MTEgYXBwbHkgICAjMjIwOGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUrMworZGVjcTQxMiBhcHBseSAgIDBFKzYxMTEgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQxMyBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSs2MTExCistLSBjbGFtcGVkIHplcm9zLi4uCitkZWNxNDE0IGFwcGx5ICAgMEUrNjExMiAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNxNDE1IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IDBFKzYxMTEKK2RlY3E0MTYgYXBwbHkgICAwRSs2MTQ0ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIENsYW1wZWQKK2RlY3E0MTcgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMEUrNjExMQorZGVjcTQxOCBhcHBseSAgIDBFKzgwMDAgICAgICAgICAgICAgICAgIC0+ICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjcTQxOSBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAwRSs2MTExCisKKy0tIG5lZ2F0aXZlIHplcm9zCitkZWNxNDIwIGFwcGx5ICAtMEUtODAwMCAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNxNDIxIGFwcGx5ICAtMEUtNjE3NyAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBDbGFtcGVkCitkZWNxNDIyIGFwcGx5ICAtMEUtNjE3NiAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNDIzIGFwcGx5ICAgIzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAgIC0+IC0wRS02MTc2CitkZWNxNDI0IGFwcGx5ICAtMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQyNSBhcHBseSAgICM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUtNjE3NgorZGVjcTQyNiBhcHBseSAgLTBFLTIgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQyNyBhcHBseSAgICNhMjA3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMC4wMAorZGVjcTQyOCBhcHBseSAgLTAgICAgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQyOSBhcHBseSAgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMAorZGVjcTQzMCBhcHBseSAgLTBFKzMgICAgICAgICAgICAgICAgICAgIC0+ICNhMjA4YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQzMSBhcHBseSAgICNhMjA4YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrMworZGVjcTQzMiBhcHBseSAgLTBFKzYxMTEgICAgICAgICAgICAgICAgIC0+ICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTQzMyBhcHBseSAgICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrNjExMQorLS0gY2xhbXBlZCB6ZXJvcy4uLgorZGVjcTQzNCBhcHBseSAgLTBFKzYxMTIgICAgICAgICAgICAgICAgIC0+ICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjcTQzNSBhcHBseSAgICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrNjExMQorZGVjcTQzNiBhcHBseSAgLTBFKzYxNDQgICAgICAgICAgICAgICAgIC0+ICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjcTQzNyBhcHBseSAgICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrNjExMQorZGVjcTQzOCBhcHBseSAgLTBFKzgwMDAgICAgICAgICAgICAgICAgIC0+ICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgQ2xhbXBlZAorZGVjcTQzOSBhcHBseSAgICNjM2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAtMEUrNjExMQorCistLSBleHBvbmVudCBsZW5ndGhzCitkZWNxNDQwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICAgICAgIC0+IDcKK2RlY3E0NDEgYXBwbHkgICA3IC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZGVjcTQ0MiBhcHBseSAgICMyMjBhNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgICAgICAtPiA3RSs5CitkZWNxNDQzIGFwcGx5ICAgN0UrOSAtPiAjMjIwYTQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RlY3E0NDQgYXBwbHkgICAjMjIyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgICAgICAgLT4gN0UrOTkKK2RlY3E0NDUgYXBwbHkgICA3RSs5OSAtPiAjMjIyMGMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RlY3E0NDYgYXBwbHkgICAjMjMwMWMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgICAgICAgLT4gN0UrOTk5CitkZWNxNDQ3IGFwcGx5ICAgN0UrOTk5IC0+ICMyMzAxYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZGVjcTQ0OCBhcHBseSAgICM0M2UzYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgICAgICAtPiA3RSs1OTk5CitkZWNxNDQ5IGFwcGx5ICAgN0UrNTk5OSAtPiAjNDNlM2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKKworLS0gU3BlY2lhbHMKK2RlY3E1MDAgYXBwbHkgICBJbmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTAxIGFwcGx5ICAgIzc4Nzg3ODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4IC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUwMiBhcHBseSAgICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiBJbmZpbml0eQorZGVjcTUwMyBhcHBseSAgICM3OTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OSAtPiAjNzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1MDQgYXBwbHkgICAjNzkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gSW5maW5pdHkKK2RlY3E1MDUgYXBwbHkgICAjN2E3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2EgLT4gIzc4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTA2IGFwcGx5ICAgIzdhMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IEluZmluaXR5CitkZWNxNTA3IGFwcGx5ICAgIzdiN2I3YjdiN2I3YjdiN2I3YjdiN2I3YjdiN2I3YjdiIC0+ICM3ODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUwOCBhcHBseSAgICM3YjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiBJbmZpbml0eQorCitkZWNxNTA5IGFwcGx5ICAgTmFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICM3YzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUxMCBhcHBseSAgICM3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YyAtPiAjN2MwMDNjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2MKK2RlY3E1MTEgYXBwbHkgICAjN2MwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gTmFOCitkZWNxNTEyIGFwcGx5ICAgIzdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkIC0+ICM3YzAwM2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZAorZGVjcTUxMyBhcHBseSAgICM3ZDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiBOYU4KK2RlY3E1MTQgYXBwbHkgICAjN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2UgLT4gIzdlMDAzZTdlN2M3ZTdlN2U3ZTdjN2U3ZTdlN2U3YzdlCitkZWNxNTE1IGFwcGx5ICAgIzdlMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IHNOYU4KK2RlY3E1MTYgYXBwbHkgICAjN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2YgLT4gIzdlMDAzZjdmN2M3ZjdmN2Y3ZjdjN2Y3ZjdmN2Y3YzdmCitkZWNxNTE3IGFwcGx5ICAgIzdmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IHNOYU4KK2RlY3E1MTggYXBwbHkgICAjN2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmYgLT4gc05hTjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZGVjcTUxOSBhcHBseSAgICM3ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZiAtPiAjN2UwMDBmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYKKworZGVjcTUyMCBhcHBseSAgIC1JbmZpbml0eSAgICAgICAgICAgICAgICAgICAgICAgICAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1MjEgYXBwbHkgICAjZjg3ODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4Nzg3ODc4NzggLT4gI2Y4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTIyIGFwcGx5ICAgI2Y4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IC1JbmZpbml0eQorZGVjcTUyMyBhcHBseSAgICNmOTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OTc5Nzk3OSAtPiAjZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RlY3E1MjQgYXBwbHkgICAjZjkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gLUluZmluaXR5CitkZWNxNTI1IGFwcGx5ICAgI2ZhN2E3YTdhN2E3YTdhN2E3YTdhN2E3YTdhN2E3YTdhIC0+ICNmODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUyNiBhcHBseSAgICNmYTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAtSW5maW5pdHkKK2RlY3E1MjcgYXBwbHkgICAjZmI3YjdiN2I3YjdiN2I3YjdiN2I3YjdiN2I3YjdiN2IgLT4gI2Y4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTI4IGFwcGx5ICAgI2ZiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IC1JbmZpbml0eQorCitkZWNxNTI5IGFwcGx5ICAgLU5hTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICNmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZGVjcTUzMCBhcHBseSAgICNmYzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YyAtPiAjZmMwMDNjN2M3YzdjN2M3YzdjN2M3YzdjN2M3YzdjN2MKK2RlY3E1MzEgYXBwbHkgICAjZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gLU5hTgorZGVjcTUzMiBhcHBseSAgICNmZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZCAtPiAjZmMwMDNkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2Q3ZDdkN2QKK2RlY3E1MzMgYXBwbHkgICAjZmQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gLU5hTgorZGVjcTUzNCBhcHBseSAgICNmZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZTdlN2U3ZSAtPiAjZmUwMDNlN2U3YzdlN2U3ZTdlN2M3ZTdlN2U3ZTdjN2UKK2RlY3E1MzUgYXBwbHkgICAjZmUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gLXNOYU4KK2RlY3E1MzYgYXBwbHkgICAjZmY3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2Y3ZjdmN2YgLT4gI2ZlMDAzZjdmN2M3ZjdmN2Y3ZjdjN2Y3ZjdmN2Y3YzdmCitkZWNxNTM3IGFwcGx5ICAgI2ZmMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IC1zTmFOCitkZWNxNTM4IGFwcGx5ICAgI2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIC0+IC1zTmFOOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkZWNxNTM5IGFwcGx5ICAgI2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmIC0+ICNmZTAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorCitkZWNxNTQwIGFwcGx5ICAgTmFOICAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTQxIGFwcGx5ICAgTmFOMCAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkZWNxNTQyIGFwcGx5ICAgTmFOMSAgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkZWNxNTQzIGFwcGx5ICAgTmFOMTIgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyCitkZWNxNTQ0IGFwcGx5ICAgTmFONzkgICAgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc5CitkZWNxNTQ1IGFwcGx5ICAgTmFOMTIzNDUgICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0OWM1CitkZWNxNTQ2IGFwcGx5ICAgTmFOMTIzNDU2ICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI4ZTU2CitkZWNxNTQ3IGFwcGx5ICAgTmFONzk5Nzk5ICAgICAgICAgLT4gIzdjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGY3ZmRmCitkZWNxNTQ4IGFwcGx5ICAgTmFONzk5Nzk5Nzk5Nzk5Nzk5Nzk5Nzk5Nzk5Nzk5Nzk5Nzk5ICAtPiAjN2MwMDNkZmY3ZmRmZjdmZGZmN2ZkZmY3ZmRmZjdmZGYKK2RlY3E1NDkgYXBwbHkgICBOYU45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+ICM3YzAwMGZmM2ZjZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZgorZGVjcTU1MCBhcHBseSAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLT4gIzZlMDgwZmYzZmNmZjNmY2ZmM2ZjZmYzZmNmZjNmY2ZmCisKKy0tIGZvbGQtZG93biBmdWxsIHNlcXVlbmNlCitkZWNxNjAxIGFwcGx5ICAgMUUrNjE0NCAgICAgICAgICAgICAgICAgLT4gIzQ3ZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MDIgYXBwbHkgICAjNDdmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQKK2RlY3E2MDMgYXBwbHkgICAxRSs2MTQzICAgICAgICAgICAgICAgICAtPiAjNDNmZmM4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYwNCBhcHBseSAgICM0M2ZmYzgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzCitkZWNxNjA1IGFwcGx5ICAgMUUrNjE0MiAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MDYgYXBwbHkgICAjNDNmZmMxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQyCitkZWNxNjA3IGFwcGx5ICAgMUUrNjE0MSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MDggYXBwbHkgICAjNDNmZmMwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDEKK2RlY3E2MDkgYXBwbHkgICAxRSs2MTQwICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYxMCBhcHBseSAgICM0M2ZmYzAwMjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQwCitkZWNxNjExIGFwcGx5ICAgMUUrNjEzOSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MTIgYXBwbHkgICAjNDNmZmMwMDA0MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTM5CitkZWNxNjEzIGFwcGx5ICAgMUUrNjEzOCAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MTQgYXBwbHkgICAjNDNmZmMwMDAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzgKK2RlY3E2MTUgYXBwbHkgICAxRSs2MTM3ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYxNiBhcHBseSAgICM0M2ZmYzAwMDAwODAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTM3CitkZWNxNjE3IGFwcGx5ICAgMUUrNjEzNiAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MTggYXBwbHkgICAjNDNmZmMwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTM2CitkZWNxNjE5IGFwcGx5ICAgMUUrNjEzNSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MjAgYXBwbHkgICAjNDNmZmMwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzUKK2RlY3E2MjEgYXBwbHkgICAxRSs2MTM0ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMjAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYyMiBhcHBseSAgICM0M2ZmYzAwMDAwMDAyMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTM0CitkZWNxNjIzIGFwcGx5ICAgMUUrNjEzMyAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MjQgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTMzCitkZWNxNjI1IGFwcGx5ICAgMUUrNjEzMiAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MjYgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDA0MDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzIKK2RlY3E2MjcgYXBwbHkgICAxRSs2MTMxICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwODAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYyOCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTMxCitkZWNxNjI5IGFwcGx5ICAgMUUrNjEzMCAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MzAgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTMwCitkZWNxNjMxIGFwcGx5ICAgMUUrNjEyOSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MzIgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDBFKzYxMjkKK2RlY3E2MzMgYXBwbHkgICAxRSs2MTI4ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAyMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTYzNCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDIwMDAwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwRSs2MTI4CitkZWNxNjM1IGFwcGx5ICAgMUUrNjEyNyAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MzYgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwNDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwRSs2MTI3CitkZWNxNjM3IGFwcGx5ICAgMUUrNjEyNiAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2MzggYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDQwMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzYxMjYKK2RlY3E2MzkgYXBwbHkgICAxRSs2MTI1ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTY0MCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwRSs2MTI1CitkZWNxNjQxIGFwcGx5ICAgMUUrNjEyNCAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2NDIgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDAwRSs2MTI0CitkZWNxNjQzIGFwcGx5ICAgMUUrNjEyMyAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2NDQgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwMDBFKzYxMjMKK2RlY3E2NDUgYXBwbHkgICAxRSs2MTIyICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDIwMDAwMDAwMDAgQ2xhbXBlZAorZGVjcTY0NiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMjAwMDAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwMDAwRSs2MTIyCitkZWNxNjQ3IGFwcGx5ICAgMUUrNjEyMSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAwIENsYW1wZWQKK2RlY3E2NDggYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDA0MDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDAwRSs2MTIxCitkZWNxNjQ5IGFwcGx5ICAgMUUrNjEyMCAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAwMDAwIENsYW1wZWQKK2RlY3E2NTAgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwNDAwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwMDBFKzYxMjAKK2RlY3E2NTEgYXBwbHkgICAxRSs2MTE5ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDgwMDAwMDAgQ2xhbXBlZAorZGVjcTY1MiBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwODAwMDAwMCAgICAgICAtPiAxLjAwMDAwMDAwRSs2MTE5CitkZWNxNjUzIGFwcGx5ICAgMUUrNjExOCAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwIENsYW1wZWQKK2RlY3E2NTQgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAgICAgICAgLT4gMS4wMDAwMDAwRSs2MTE4CitkZWNxNjU1IGFwcGx5ICAgMUUrNjExNyAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwIENsYW1wZWQKK2RlY3E2NTYgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMDAwMDAgICAgICAgLT4gMS4wMDAwMDBFKzYxMTcKK2RlY3E2NTcgYXBwbHkgICAxRSs2MTE2ICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjAwMDAgQ2xhbXBlZAorZGVjcTY1OCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyMDAwMCAgICAgICAtPiAxLjAwMDAwRSs2MTE2CitkZWNxNjU5IGFwcGx5ICAgMUUrNjExNSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAwIENsYW1wZWQKK2RlY3E2NjAgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDAgICAgICAgLT4gMS4wMDAwRSs2MTE1CitkZWNxNjYxIGFwcGx5ICAgMUUrNjExNCAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNDAwIENsYW1wZWQKK2RlY3E2NjIgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0MDAgICAgICAgLT4gMS4wMDBFKzYxMTQKK2RlY3E2NjMgYXBwbHkgICAxRSs2MTEzICAgICAgICAgICAgICAgICAtPiAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODAgQ2xhbXBlZAorZGVjcTY2NCBhcHBseSAgICM0M2ZmYzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MCAgICAgICAtPiAxLjAwRSs2MTEzCitkZWNxNjY1IGFwcGx5ICAgMUUrNjExMiAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwIENsYW1wZWQKK2RlY3E2NjYgYXBwbHkgICAjNDNmZmMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgICAgICAgLT4gMS4wRSs2MTEyCitkZWNxNjY3IGFwcGx5ICAgMUUrNjExMSAgICAgICAgICAgICAgICAgLT4gIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkZWNxNjY4IGFwcGx5ICAgIzQzZmZjMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAgIC0+IDFFKzYxMTEKK2RlY3E2NjkgYXBwbHkgICAxRSs2MTEwICAgICAgICAgICAgICAgICAtPiAjNDNmZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RlY3E2NzAgYXBwbHkgICAjNDNmZjgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgICAgLT4gMUUrNjExMAorCistLSBTZWxlY3RlZCBEUEQgY29kZXMKK2RlY3E3MDAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgICAgLT4gMAorZGVjcTcwMSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgICAgICAtPiA5CitkZWNxNzAyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAgICAgIC0+IDEwCitkZWNxNzAzIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE5ICAgICAgIC0+IDE5CitkZWNxNzA0IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIwICAgICAgIC0+IDIwCitkZWNxNzA1IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI5ICAgICAgIC0+IDI5CitkZWNxNzA2IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMwICAgICAgIC0+IDMwCitkZWNxNzA3IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM5ICAgICAgIC0+IDM5CitkZWNxNzA4IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwICAgICAgIC0+IDQwCitkZWNxNzA5IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQ5ICAgICAgIC0+IDQ5CitkZWNxNzEwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUwICAgICAgIC0+IDUwCitkZWNxNzExIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDU5ICAgICAgIC0+IDU5CitkZWNxNzEyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYwICAgICAgIC0+IDYwCitkZWNxNzEzIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDY5ICAgICAgIC0+IDY5CitkZWNxNzE0IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcwICAgICAgIC0+IDcwCitkZWNxNzE1IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcxICAgICAgIC0+IDcxCitkZWNxNzE2IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcyICAgICAgIC0+IDcyCitkZWNxNzE3IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDczICAgICAgIC0+IDczCitkZWNxNzE4IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc0ICAgICAgIC0+IDc0CitkZWNxNzE5IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc1ICAgICAgIC0+IDc1CitkZWNxNzIwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc2ICAgICAgIC0+IDc2CitkZWNxNzIxIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3ICAgICAgIC0+IDc3CitkZWNxNzIyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc4ICAgICAgIC0+IDc4CitkZWNxNzIzIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc5ICAgICAgIC0+IDc5CisKK2RlY3E3MzAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyOWUgICAgICAgLT4gOTk0CitkZWNxNzMxIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjlmICAgICAgIC0+IDk5NQorZGVjcTczMiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJhMCAgICAgICAtPiA1MjAKK2RlY3E3MzMgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyYTEgICAgICAgLT4gNTIxCisKKy0tIERQRDogb25lIG9mIGVhY2ggb2YgdGhlIGh1ZmZtYW4gZ3JvdXBzCitkZWNxNzQwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2Y3ICAgICAgIC0+IDc3NworZGVjcTc0MSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNmOCAgICAgICAtPiA3NzgKK2RlY3E3NDIgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZWIgICAgICAgLT4gNzg3CitkZWNxNzQzIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzdkICAgICAgIC0+IDg3NworZGVjcTc0NCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM5ZiAgICAgICAtPiA5OTcKK2RlY3E3NDUgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzYmYgICAgICAgLT4gOTc5CitkZWNxNzQ2IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2RmICAgICAgIC0+IDc5OQorZGVjcTc0NyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ZSAgICAgICAtPiA4ODgKKworCistLSBEUEQgYWxsLWhpZ2hzIGNhc2VzIChpbmNsdWRlcyB0aGUgMjQgcmVkdW5kYW50IGNvZGVzKQorZGVjcTc1MCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ZSAgICAgICAtPiA4ODgKK2RlY3E3NTEgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxNmUgICAgICAgLT4gODg4CitkZWNxNzUyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMjZlICAgICAgIC0+IDg4OAorZGVjcTc1MyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDM2ZSAgICAgICAtPiA4ODgKK2RlY3E3NTQgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNmYgICAgICAgLT4gODg5CitkZWNxNzU1IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTZmICAgICAgIC0+IDg4OQorZGVjcTc1NiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI2ZiAgICAgICAtPiA4ODkKK2RlY3E3NTcgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzNmYgICAgICAgLT4gODg5CisKK2RlY3E3NjAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwN2UgICAgICAgLT4gODk4CitkZWNxNzYxIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTdlICAgICAgIC0+IDg5OAorZGVjcTc2MiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3ZSAgICAgICAtPiA4OTgKK2RlY3E3NjMgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzN2UgICAgICAgLT4gODk4CitkZWNxNzY0IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdmICAgICAgIC0+IDg5OQorZGVjcTc2NSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDE3ZiAgICAgICAtPiA4OTkKK2RlY3E3NjYgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyN2YgICAgICAgLT4gODk5CitkZWNxNzY3IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzdmICAgICAgIC0+IDg5OQorCitkZWNxNzcwIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGVlICAgICAgIC0+IDk4OAorZGVjcTc3MSBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFlZSAgICAgICAtPiA5ODgKK2RlY3E3NzIgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyZWUgICAgICAgLT4gOTg4CitkZWNxNzczIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM2VlICAgICAgIC0+IDk4OAorZGVjcTc3NCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBlZiAgICAgICAtPiA5ODkKK2RlY3E3NzUgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxZWYgICAgICAgLT4gOTg5CitkZWNxNzc2IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmVmICAgICAgIC0+IDk4OQorZGVjcTc3NyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNlZiAgICAgICAtPiA5ODkKKworZGVjcTc4MCBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBmZSAgICAgICAtPiA5OTgKK2RlY3E3ODEgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxZmUgICAgICAgLT4gOTk4CitkZWNxNzgyIGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMmZlICAgICAgIC0+IDk5OAorZGVjcTc4MyBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDNmZSAgICAgICAtPiA5OTgKK2RlY3E3ODQgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZmYgICAgICAgLT4gOTk5CitkZWNxNzg1IGFwcGx5ICAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWZmICAgICAgIC0+IDk5OQorZGVjcTc4NiBhcHBseSAgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDJmZiAgICAgICAtPiA5OTkKK2RlY3E3ODcgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzZmYgICAgICAgLT4gOTk5CisKKy0tIE1pc2NlbGxhbmVvdXMgKHRlc3RlcnMnIHF1ZXJpZXMsIGV0Yy4pCisKK2RlY3E3OTAgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGMwMDAgICAgICAgLT4gMzAwMDAKK2RlY3E3OTEgYXBwbHkgICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc4MDAgICAgICAgLT4gODkwMDAwCitkZWNxNzkyIGFwcGx5ICAgMzAwMDAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBjMDAwCitkZWNxNzkzIGFwcGx5ICAgODkwMDAwIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzgwMAorCistLSB2YWx1ZXMgYXJvdW5kIFt1XWludDMyIGVkZ2VzICh6ZXJvcyBkb25lIGVhcmxpZXIpCitkZWNxODAwIGFwcGx5IC0yMTQ3NDgzNjQ2ICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDYKK2RlY3E4MDEgYXBwbHkgLTIxNDc0ODM2NDcgIC0+ICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0NworZGVjcTgwMiBhcHBseSAtMjE0NzQ4MzY0OCAgLT4gI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ4CitkZWNxODAzIGFwcGx5IC0yMTQ3NDgzNjQ5ICAtPiAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDkKK2RlY3E4MDQgYXBwbHkgIDIxNDc0ODM2NDYgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0NgorZGVjcTgwNSBhcHBseSAgMjE0NzQ4MzY0NyAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ3CitkZWNxODA2IGFwcGx5ICAyMTQ3NDgzNjQ4ICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDgKK2RlY3E4MDcgYXBwbHkgIDIxNDc0ODM2NDkgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0OQorZGVjcTgwOCBhcHBseSAgNDI5NDk2NzI5NCAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMTE1YWZiNTVhCitkZWNxODA5IGFwcGx5ICA0Mjk0OTY3Mjk1ICAtPiAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAxMTVhZmI1NWIKK2RlY3E4MTAgYXBwbHkgIDQyOTQ5NjcyOTYgIC0+ICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDExNWFmYjU3YQorZGVjcTgxMSBhcHBseSAgNDI5NDk2NzI5NyAgLT4gIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMTE1YWZiNTdiCisKK2RlY3E4MjAgYXBwbHkgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0NiAtPiAtMjE0NzQ4MzY0NgorZGVjcTgyMSBhcHBseSAgI2EyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ3IC0+IC0yMTQ3NDgzNjQ3CitkZWNxODIyIGFwcGx5ICAjYTIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDggLT4gLTIxNDc0ODM2NDgKK2RlY3E4MjMgYXBwbHkgICNhMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0OSAtPiAtMjE0NzQ4MzY0OQorZGVjcTgyNCBhcHBseSAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ2IC0+ICAyMTQ3NDgzNjQ2CitkZWNxODI1IGFwcGx5ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAwOGM3OGFmNDcgLT4gIDIxNDc0ODM2NDcKK2RlY3E4MjYgYXBwbHkgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDA4Yzc4YWY0OCAtPiAgMjE0NzQ4MzY0OAorZGVjcTgyNyBhcHBseSAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMDhjNzhhZjQ5IC0+ICAyMTQ3NDgzNjQ5CitkZWNxODI4IGFwcGx5ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAxMTVhZmI1NWEgLT4gIDQyOTQ5NjcyOTQKK2RlY3E4MjkgYXBwbHkgICMyMjA4MDAwMDAwMDAwMDAwMDAwMDAwMDExNWFmYjU1YiAtPiAgNDI5NDk2NzI5NQorZGVjcTgzMCBhcHBseSAgIzIyMDgwMDAwMDAwMDAwMDAwMDAwMDAwMTE1YWZiNTdhIC0+ICA0Mjk0OTY3Mjk2CitkZWNxODMxIGFwcGx5ICAjMjIwODAwMDAwMDAwMDAwMDAwMDAwMDAxMTVhZmI1N2IgLT4gIDQyOTQ5NjcyOTcKKworLS0gVkcgdGVzdGNhc2UKK2RlY3E4NDAgYXBwbHkgICAgIzIwODAwMDAwMDAwMDAwMDBGMjk0MDAwMDAwMTcyNjM2IC0+IDguODExMjUwMDAwMDAwMDEzNDk0MzZFLTE1NDgKK2RlY3E4NDEgYXBwbHkgICAgIzIwODAwMDAwMDAwMDAwMDA4MDAwMDAwMDAwMDAwMDAwIC0+IDguMDAwMDAwMDAwMDAwMDAwMDAwRS0xNTUwCitkZWNxODQyIGFwcGx5ICAgICMxRUY5ODQ5MDAwMDAwMDAxMEY2RTRFMDAwMDAwMDAwMCAtPiA3LjA0OTAwMDAwMDAwMDAxMDc5NTQ4ODAwMDAwMDAwMDAwMEUtMzA5NworZGVjcTg0MyBtdWx0aXBseSAjMjA4MDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAgIzIwODAwMDAwMDAwMDAwMDBGMjk0MDAwMDAwMTcyNjM2IC0+ICMxRUY5ODQ5MDAwMDAwMDAxMEY2RTRFMDAwMDAwMDAwMCBSb3VuZGVkCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFGTUEuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFGTUEuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODg0NTUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUZNQS5kZWNUZXN0CkBAIC0wLDAgKzEsMTc4NiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcUZNQS5kZWNUZXN0IC0tIGRlY1F1YWQgRnVzZWQgTXVsdGlwbHkgQWRkICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIFRoZXNlIHRlc3RzIGNvbXByZXNlIHRocmVlIHBhcnRzOgorLS0gICAxLiBTYW5pdHkgY2hlY2tzIGFuZCBvdGhlciB0aHJlZS1vcGVyYW5kIHRlc3RzIChlc3BlY2lhbGx5IHRob3NlCistLSAgICAgIHdoZXJlIHRoZSBmdXNlZCBvcGVyYXRpb24gbWFrZXMgYSBkaWZmZXJlbmNlKQorLS0gICAyLiBNdWx0aXBseSB0ZXN0cyAodGhpcmQgb3BlcmFuZCBpcyBuZXV0cmFsIHplcm8gWzBFK2VtYXhdKQorLS0gICAzLiBBZGRpdGlvbiB0ZXN0cyAoZmlyc3Qgb3BlcmFuZCBpcyAxKQorLS0gVGhlIG11bHRpcGx5IGFuZCBhZGRpdGlvbiB0ZXN0cyBhcmUgZXh0ZW5zaXZlIGJlY2F1c2UgRk1BIG1heSBoYXZlCistLSBpdHMgb3duIGRlZGljYXRlZCBtdWx0aXBsaWNhdGlvbiBvciBhZGRpdGlvbiByb3V0aW5lKHMpLCBhbmQgdGhleQorLS0gYWxzbyBpbmhlcmVudGx5IGNoZWNrIHRoZSBsZWZ0LXRvLXJpZ2h0IHByb3BlcnRpZXMuCisKKy0tIFNhbml0eSBjaGVja3MKK2RxZm1hMDAwMSBmbWEgIDEgICAxICAgMSAtPiAgIDIKK2RxZm1hMDAwMiBmbWEgIDEgICAxICAgMiAtPiAgIDMKK2RxZm1hMDAwMyBmbWEgIDIgICAyICAgMyAtPiAgIDcKK2RxZm1hMDAwNCBmbWEgIDkgICA5ICAgOSAtPiAgOTAKK2RxZm1hMDAwNSBmbWEgLTEgICAxICAgMSAtPiAgIDAKK2RxZm1hMDAwNiBmbWEgLTEgICAxICAgMiAtPiAgIDEKK2RxZm1hMDAwNyBmbWEgLTIgICAyICAgMyAtPiAgLTEKK2RxZm1hMDAwOCBmbWEgLTkgICA5ICAgOSAtPiAtNzIKK2RxZm1hMDAxMSBmbWEgIDEgIC0xICAgMSAtPiAgIDAKK2RxZm1hMDAxMiBmbWEgIDEgIC0xICAgMiAtPiAgIDEKK2RxZm1hMDAxMyBmbWEgIDIgIC0yICAgMyAtPiAgLTEKK2RxZm1hMDAxNCBmbWEgIDkgIC05ICAgOSAtPiAtNzIKK2RxZm1hMDAxNSBmbWEgIDEgICAxICAtMSAtPiAgIDAKK2RxZm1hMDAxNiBmbWEgIDEgICAxICAtMiAtPiAgLTEKK2RxZm1hMDAxNyBmbWEgIDIgICAyICAtMyAtPiAgIDEKK2RxZm1hMDAxOCBmbWEgIDkgICA5ICAtOSAtPiAgNzIKKworLS0gbm9uLWludGVnZXIgZXhhY3RzCitkcWZtYTAxMDAgIGZtYSAgICAyNS4yICAgNjMuNiAgIC00MzggIC0+ICAxMTY0LjcyCitkcWZtYTAxMDEgIGZtYSAgIDAuMzAxICAwLjM4MCAgICAzMzQgIC0+ICAzMzQuMTE0MzgwCitkcWZtYTAxMDIgIGZtYSAgICA0OS4yICAgLTQuOCAgIDIzLjMgIC0+ICAtMjEyLjg2CitkcWZtYTAxMDMgIGZtYSAgICA0LjIyICAwLjA3OSAgLTk0LjYgIC0+ICAtOTQuMjY2NjIKK2RxZm1hMDEwNCAgZm1hICAgICA5MDMgIDAuNzk3ICAwLjg4NyAgLT4gIDcyMC41NzgKK2RxZm1hMDEwNSAgZm1hICAgIDYuMTMgICAtMTYxICAgNjUuOSAgLT4gIC05MjEuMDMKK2RxZm1hMDEwNiAgZm1hICAgIDI4LjIgICAgNzI3ICAgNS40NSAgLT4gIDIwNTA2Ljg1CitkcWZtYTAxMDcgIGZtYSAgICAgICA0ICAgIDYwNSAgICA2ODggIC0+ICAzMTA4CitkcWZtYTAxMDggIGZtYSAgICA5My4zICAgMC4xOSAgMC4yMjYgIC0+ICAxNy45NTMKK2RxZm1hMDEwOSAgZm1hICAgMC4xNjkgICAtMzQxICAgNS42MSAgLT4gIC01Mi4wMTkKK2RxZm1hMDExMCAgZm1hICAgLTcyLjIgICAgIDMwICAtNTEuMiAgLT4gIC0yMjE3LjIKK2RxZm1hMDExMSAgZm1hICAtMC40MDkgICAgIDEzICAgMjAuNCAgLT4gIDE1LjA4MworZHFmbWEwMTEyICBmbWEgICAgIDMxNyAgIDc3LjAgICAxOS4wICAtPiAgMjQ0MjguMAorZHFmbWEwMTEzICBmbWEgICAgICA0NyAgIDYuNTggICAxLjYyICAtPiAgMzEwLjg4CitkcWZtYTAxMTQgIGZtYSAgICAxLjM2ICAwLjk4NCAgMC40OTMgIC0+ICAxLjgzMTI0CitkcWZtYTAxMTUgIGZtYSAgICA3Mi43ICAgIDI3NCAgIDEuNTYgIC0+ICAxOTkyMS4zNgorZHFmbWEwMTE2ICBmbWEgICAgIDMzNSAgICA4NDcgICAgIDgzICAtPiAgMjgzODI4CitkcWZtYTAxMTcgIGZtYSAgICAgNjY2ICAwLjI0NyAgIDI1LjQgIC0+ICAxODkuOTAyCitkcWZtYTAxMTggIGZtYSAgIC0zLjg3ICAgMy4wNiAgIDc4LjAgIC0+ICA2Ni4xNTc4CitkcWZtYTAxMTkgIGZtYSAgIDAuNzQyICAgIDE5MiAgIDM1LjYgIC0+ICAxNzguMDY0CitkcWZtYTAxMjAgIGZtYSAgIC05MS42ICAgNS4yOSAgMC4xNTMgIC0+ICAtNDg0LjQxMQorCistLSBjYXNlcyB3aGVyZSByZXN1bHQgaXMgZGlmZmVyZW50IGZyb20gc2VwYXJhdGUgbXVsdGlwbHkgKyBhZGQ7IGVhY2gKKy0tIGlzIHByZWNlZGVkIGJ5IHRoZSByZXN1bHQgb2YgdW5mdXNlZCBtdWx0aXBseSBhbmQgYWRkCistLSBbdGhpcyBpcyBhYm91dCAyMCUgb2YgYWxsIHNpbWlsYXIgIGNhc2VzIGluIGdlbmVyYWxdCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICA0LjUwMDExOTAwMjEwMDAwMDIwOTQ2OTcyOTM3NTY5ODc3OEUrMzgKK2RxZm1hMDIwMiAgZm1hICAgICAgIDY4NTM3OTg1ODYxMzU1ODY0NDU3LjU2OTQgICAgICA2NTY1ODc1NzYyOTcyMDg2NjA1Ljg1OTY5ICAgICAgIDM1ODkyNjM0NDQ3MjM2NzUzLjE3MjgxMiAgLT4gIDQuNTAwMTE5MDAyMTAwMDAwMjA5NDY5NzI5Mzc1Njk4Nzc5RSszOCBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDUuOTk2MjQ4NDY5NTg0NTk0MzQ2ODU4ODgxNjIwMTg1NTE0RSs0MQorZHFmbWEwMjA4ICBmbWEgICAgICAgICAgODkyNjE4MjIzNDQ3Mjc2Mjg1NzEuOSAgICAgIDY3MTc1OTU4NDU2NTQxMzEzODMzMzYuODkgICAgICA1MDYxMDM2NDk3Mjg4Nzk2MDc2MjY2LjExICAtPiAgNS45OTYyNDg0Njk1ODQ1OTQzNDY4NTg4ODE2MjAxODU1MTNFKzQxIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMS44OTkyNDI5Njg2NzgyNTY5MjQwMjE1OTQ3NzA4NzQwNzBFKzM0CitkcWZtYTAyMTAgIGZtYSAgICAgICAzMjA1MDYyMzcyMzI0NDg2ODUuNDk1OTcxICAgICAgIDU5MjU3NTk3NzY0MDE3OTY3Ljk4NDQ0OCAgICAgIDMyMDU2MTUyMzkwNzc3MTE1ODk5MTIuODUgIC0+ICAxLjg5OTI0Mjk2ODY3ODI1NjkyNDAyMTU5NDc3MDg3NDA3MUUrMzQgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICA3LjA3ODU5Njk3ODg0MjgwOTUzNzkyOTY5OTk1NDg2MDMwOUUrMzcKK2RxZm1hMDIxNSAgZm1hICAgICAgICAyMjAyNDc4NDMyNTkxMTIyNjMuMTc5OTUgICAgICAgMzIxMzkyMzQwMjg3OTg3OTc5MDAyLjgwICAgICAgICA0NzUzMzI3OTgxOTk5NzE2NzY1NTQ0MCAgLT4gIDcuMDc4NTk2OTc4ODQyODA5NTM3OTI5Njk5OTU0ODYwMzA4RSszNyBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDEuMjI0OTU1NjY3NTgxNDI3NTU5NzU0MTA2ODYyMzUwNzQzRSszNworZHFmbWEwMjI2ICBmbWEgICAgICAgMjM4ODA3Mjk3OTAzNjg4ODA0MTIuMTQ0OSAgICAgICA1MTI5NDczMzM4MjcwNjQ3MTkuNTU0MDcgICAgICAyMTcxMTc0Mzg0MTk1OTA4MjQ1MDIuOTYzICAtPiAgMS4yMjQ5NTU2Njc1ODE0Mjc1NTk3NTQxMDY4NjIzNTA3NDRFKzM3IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgLTIuNTMwMDk0MDQzMjUzMTQ4ODA2MjcyMjc2MzY4NTc5MTQ0RSs0MgorZHFmbWEwMjI5ICBmbWEgICAgICAgIDI1Mzk4OTIzNTcwMTYwOTk3MDYuNDEyNiAgICAgIC05OTYxNDIyMzI2Njc1MDQ4MTc3MTc0MzUgICAgICAgNTM2ODIwODI1OTgzMTU5NDk0MjUuOTM3ICAtPiAgLTIuNTMwMDk0MDQzMjUzMTQ4ODA2MjcyMjc2MzY4NTc5MTQzRSs0MiBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDEuNzEzMzg3MDg1NzU5NzExOTU0MzE5MzkxNDEyNzg4NDU0RSszNworZHFmbWEwMjMzICBmbWEgICAgICAgIDQ1NDYzMzk0OTEzNDE2MjQ0NjQuMDgwNCAgICAgICAgICAgIDM3Njg3MTc4NjQxNjkyMDU1ODEgICAgICAgODM1Nzg5ODAyNzg2OTAzOTUxODQuNjIwICAtPiAgMS43MTMzODcwODU3NTk3MTE5NTQzMTkzOTE0MTI3ODg0NTNFKzM3IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgNC4wNjIyNzU2NjM0MDU4MjM3MTY0MTE1NzkxMTc3NzE1NDdFKzM1CitkcWZtYTAyMzUgIGZtYSAgICAgICAgNDA5MjQyMTE5NDMzODE2MTMxLjQyMjUzICAgICAgOTkyNjMzODE1MTY2NzQxNTAxLjQ3NzI0OSAgICAgICAgNzAxNzk2MzY1NDQ0MTY3NTYxMjk1NDYgIC0+ICA0LjA2MjI3NTY2MzQwNTgyMzcxNjQxMTU3OTExNzc3MTU0OEUrMzUgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICA2LjAwMjYwNDMyNzczMjU2ODQ5MDU2MjI0OTg3NTMwNjgyM0UrNDcKK2RxZm1hMDI1OCAgZm1hICAgICAgICA4MTc5NDEzMzY1OTM1NDE3NDIxNTk2ODQgICAgICAgNzMzODY3MzM5NzY5MzEwNzI5MjY2NTk4ICAgICAgNzg1NjM4NDQ2NTA5NDI0MTkzMTE4MzAuOCAgLT4gIDYuMDAyNjA0MzI3NzMyNTY4NDkwNTYyMjQ5ODc1MzA2ODIyRSs0NyBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIC0yLjAyNzAyMjUxNDM4MTQ1MjE5NzUxMDEwMzM5NTI4Mzg3NEUrMzkKK2RxZm1hMDI2NCAgZm1hICAgICAgIDM4NzYxNzMxMDE2OTE2MTI3MC43Mzc1MzIgICAgIC01MjI5NDQyNzAzNDE0OTU2MDYxMjE2LjYyICAgICAgNTc2NjU2NjY4MTY2NTI5NjcxNTA0NzMuNSAgLT4gIC0yLjAyNzAyMjUxNDM4MTQ1MjE5NzUxMDEwMzM5NTI4Mzg3M0UrMzkgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAtNy44NTY1MjUwMzk4MDM1NTQwMDExNDQwODk4NDI3MzAzNjFFKzM3CitkcWZtYTAyNjcgIGZtYSAgICAgIC04NDc2NTU4NDU3MjA1NjUyNzQ3MDEuMjEwICAgICAgICA5MjY4NTMxNjU2NDExNzczOS44Mzk4NCAgICAgIDIyNzgwOTUwMDQxMzc2NDI0NDI5LjU2ODYgIC0+ICAtNy44NTY1MjUwMzk4MDM1NTQwMDExNDQwODk4NDI3MzAzNjBFKzM3IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMS42OTU1MTU1NjIwMTE1MjA3NDYxMjU2MDc1MDIyMzc1NTlFKzM4CitkcWZtYTAyNjggIGZtYSAgICAgICAgICAyMTU5MDI5MDM2NTEyNzY4NS4zNjc1ICAgICAgIDc4NTMxMzkyMjc1NzY1NDEzNzk0MjYuOCAgICAgICAtMzI3NTg1OTQzNzIzNjE4MC43NjE1NDQgIC0+ICAxLjY5NTUxNTU2MjAxMTUyMDc0NjEyNTYwNzUwMjIzNzU1OEUrMzggSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAtOC40NDg0MjI5MzU3ODMyODkyMTk3NDgxMTUwMzgwMTQ3MTBFKzM4CitkcWZtYTAyNjkgIGZtYSAgICAgIC05NzQzMjA2MzYyNzI4NjI2OTcuOTcxNTg2ICAgICAgODY3MTA5MTAzNjQxODYwMjQ3NDQwLjc1NiAgICAgICAgLTk3NzUxNzA3NzU5MDI0NTQ3NjIuOTggIC0+ICAtOC40NDg0MjI5MzU3ODMyODkyMTk3NDgxMTUwMzgwMTQ3MDlFKzM4IEluZXhhY3QgUm91bmRlZAorCistLSBDYXNlcyB3aGVyZSBtdWx0aXBseSB3b3VsZCBvdmVyZmxvdyBvciB1bmRlcmZsb3cgaWYgc2VwYXJhdGUKK2RxZm1hMDMwMCAgZm1hICAgOWUrNjE0NCAgICAxMCAgIDAgICAgICAgICAtPiBJbmZpbml0eSAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTAzMDEgIGZtYSAgIDFlKzYxNDQgICAgMTAgICAwICAgICAgICAgLT4gSW5maW5pdHkgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFmbWEwMzAyICBmbWEgICAxZSs2MTQ0ICAgIDEwICAgLTFlKzYxNDQgIC0+IDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0IENsYW1wZWQKK2RxZm1hMDMwMyAgZm1hICAgMWUrNjE0NCAgICAxMCAgIC05ZSs2MTQ0ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NCBDbGFtcGVkCistLSBzdWJub3JtYWwgZXRjLgorZHFmbWEwMzA1ICBmbWEgICAxZS02MTc2ICAgIDAuMSAgMCAgICAgICAgIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFmbWEwMzA2ICBmbWEgICAxZS02MTc2ICAgIDAuMSAgMSAgICAgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFmbWEwMzA3ICBmbWEgICAxZS02MTc2ICAgIDAuMSAgMWUtNjE3NiAgIC0+IDFFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gSW5maW5pdGUgY29tYmluYXRpb25zCitkcWZtYTA4MDAgZm1hICBJbmYgICBJbmYgICBJbmYgICAgLT4gIEluZmluaXR5CitkcWZtYTA4MDEgZm1hICBJbmYgICBJbmYgIC1JbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEwODAyIGZtYSAgSW5mICAtSW5mICAgSW5mICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMDgwMyBmbWEgIEluZiAgLUluZiAgLUluZiAgICAtPiAtSW5maW5pdHkKK2RxZm1hMDgwNCBmbWEgLUluZiAgIEluZiAgIEluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTA4MDUgZm1hIC1JbmYgICBJbmYgIC1JbmYgICAgLT4gLUluZmluaXR5CitkcWZtYTA4MDYgZm1hIC1JbmYgIC1JbmYgICBJbmYgICAgLT4gIEluZmluaXR5CitkcWZtYTA4MDcgZm1hIC1JbmYgIC1JbmYgIC1JbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBUcmlwbGUgTmFOIHByb3BhZ2F0aW9uCitkcWZtYTA5MDAgZm1hICBOYU4yICBOYU4zICBOYU41ICAgLT4gIE5hTjIKK2RxZm1hMDkwMSBmbWEgIDAgICAgIE5hTjMgIE5hTjUgICAtPiAgTmFOMworZHFmbWEwOTAyIGZtYSAgMCAgICAgMCAgICAgTmFONSAgIC0+ICBOYU41CistLSBmaXJzdCBzTmFOIHdpbnMgKGNvbnNpZGVyIHFOYU4gZnJvbSBlYXJsaWVyIHNOYU4gYmVpbmcKKy0tIG92ZXJyaWRkZW4gYnkgYW4gc05hTiBpbiB0aGlyZCBvcGVyYW5kKQorZHFmbWEwOTAzIGZtYSAgc05hTjEgc05hTjIgc05hTjMgIC0+ICBOYU4xIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTA5MDQgZm1hICAwICAgICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMDkwNSBmbWEgIDAgICAgIDAgICAgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEwOTA2IGZtYSAgc05hTjEgc05hTjIgc05hTjMgIC0+ICBOYU4xIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTA5MDcgZm1hICBOYU43ICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMDkwOCBmbWEgIE5hTjcgIE5hTjUgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorCistLSBNVUxUSVBMSUNBVElPTiBURVNUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFmbWEyMDAwIGZtYSAgMiAgICAgIDIgICAwZSs2MTQ0ICAtPiA0CitkcWZtYTIwMDEgZm1hICAyICAgICAgMyAgIDBlKzYxNDQgIC0+IDYKK2RxZm1hMjAwMiBmbWEgIDUgICAgICAxICAgMGUrNjE0NCAgLT4gNQorZHFmbWEyMDAzIGZtYSAgNSAgICAgIDIgICAwZSs2MTQ0ICAtPiAxMAorZHFmbWEyMDA0IGZtYSAgMS4yMCAgIDIgICAwZSs2MTQ0ICAtPiAyLjQwCitkcWZtYTIwMDUgZm1hICAxLjIwICAgMCAgIDBlKzYxNDQgIC0+IDAuMDAKK2RxZm1hMjAwNiBmbWEgIDEuMjAgIC0yICAgMGUrNjE0NCAgLT4gLTIuNDAKK2RxZm1hMjAwNyBmbWEgIC0xLjIwICAyICAgMGUrNjE0NCAgLT4gLTIuNDAKK2RxZm1hMjAwOCBmbWEgIC0xLjIwICAwICAgMGUrNjE0NCAgLT4gMC4wMAorZHFmbWEyMDA5IGZtYSAgLTEuMjAgLTIgICAwZSs2MTQ0ICAtPiAyLjQwCitkcWZtYTIwMTAgZm1hICA1LjA5IDcuMSAgIDBlKzYxNDQgIC0+IDM2LjEzOQorZHFmbWEyMDExIGZtYSAgMi41ICAgIDQgICAwZSs2MTQ0ICAtPiAxMC4wCitkcWZtYTIwMTIgZm1hICAyLjUwICAgNCAgIDBlKzYxNDQgIC0+IDEwLjAwCitkcWZtYTIwMTMgZm1hICAxLjIzNDU2Nzg5IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIDBlKzYxNDQgIC0+IDEuMjM0NTY3ODkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIFJvdW5kZWQKK2RxZm1hMjAxNSBmbWEgIDIuNTAgICA0ICAgMGUrNjE0NCAgLT4gMTAuMDAKK2RxZm1hMjAxNiBmbWEgICA5Ljk5OTk5OTk5OTk5OTk5OTk5ICA5Ljk5OTk5OTk5OTk5OTk5OTk5ICAgMGUrNjE0NCAgLT4gIDk5Ljk5OTk5OTk5OTk5OTk5OTgwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFmbWEyMDE3IGZtYSAgIDkuOTk5OTk5OTk5OTk5OTk5OTkgLTkuOTk5OTk5OTk5OTk5OTk5OTkgICAwZSs2MTQ0ICAtPiAtOTkuOTk5OTk5OTk5OTk5OTk5ODAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWZtYTIwMTggZm1hICAtOS45OTk5OTk5OTk5OTk5OTk5OSAgOS45OTk5OTk5OTk5OTk5OTk5OSAgIDBlKzYxNDQgIC0+IC05OS45OTk5OTk5OTk5OTk5OTk4MDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjAxOSBmbWEgIC05Ljk5OTk5OTk5OTk5OTk5OTk5IC05Ljk5OTk5OTk5OTk5OTk5OTk5ICAgMGUrNjE0NCAgLT4gIDk5Ljk5OTk5OTk5OTk5OTk5OTgwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSB6ZXJvcywgZXRjLgorZHFmbWEyMDIxIGZtYSAgIDAgICAgICAwICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTIwMjIgZm1hICAgMCAgICAgLTAgICAgICAgMGUrNjE0NCAgLT4gIDAKK2RxZm1hMjAyMyBmbWEgIC0wICAgICAgMCAgICAgICAwZSs2MTQ0ICAtPiAgMAorZHFmbWEyMDI0IGZtYSAgLTAgICAgIC0wICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTIwMjUgZm1hICAtMC4wICAgLTAuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjAyNiBmbWEgIC0wLjAgICAtMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyMDI3IGZtYSAgLTAuMCAgIC0wLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTIwMjggZm1hICAtMC4wICAgLTAuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjAzMCBmbWEgICA1LjAwICAgMUUtMyAgICAwZSs2MTQ0ICAtPiAgMC4wMDUwMAorZHFmbWEyMDMxIGZtYSAgIDAwLjAwICAwLjAwMCAgIDBlKzYxNDQgIC0+ICAwLjAwMDAwCitkcWZtYTIwMzIgZm1hICAgMDAuMDAgIDBFLTMgICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkcWZtYTIwMzMgZm1hICAgMEUtMyAgIDAwLjAwICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkcWZtYTIwMzQgZm1hICAtNS4wMCAgIDFFLTMgICAgMGUrNjE0NCAgLT4gLTAuMDA1MDAKK2RxZm1hMjAzNSBmbWEgIC0wMC4wMCAgMC4wMDAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMAorZHFmbWEyMDM2IGZtYSAgLTAwLjAwICAwRS0zICAgIDBlKzYxNDQgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorZHFmbWEyMDM3IGZtYSAgLTBFLTMgICAwMC4wMCAgIDBlKzYxNDQgIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZHFmbWEyMDM4IGZtYSAgIDUuMDAgIC0xRS0zICAgIDBlKzYxNDQgIC0+IC0wLjAwNTAwCitkcWZtYTIwMzkgZm1hICAgMDAuMDAgLTAuMDAwICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAKK2RxZm1hMjA0MCBmbWEgICAwMC4wMCAtMEUtMyAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RxZm1hMjA0MSBmbWEgICAwRS0zICAtMDAuMDAgICAwZSs2MTQ0ICAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RxZm1hMjA0MiBmbWEgIC01LjAwICAtMUUtMyAgICAwZSs2MTQ0ICAtPiAgMC4wMDUwMAorZHFmbWEyMDQzIGZtYSAgLTAwLjAwIC0wLjAwMCAgIDBlKzYxNDQgIC0+ICAwLjAwMDAwCitkcWZtYTIwNDQgZm1hICAtMDAuMDAgLTBFLTMgICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkcWZtYTIwNDUgZm1hICAtMEUtMyAgLTAwLjAwICAgMGUrNjE0NCAgLT4gIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK2RxZm1hMjA1MCBmbWEgIDEuMjAgMyAgICAgICAgICAwZSs2MTQ0ICAtPiAzLjYwCitkcWZtYTIwNTEgZm1hICA3ICAgIDMgICAgICAgICAgMGUrNjE0NCAgLT4gMjEKK2RxZm1hMjA1MiBmbWEgIDAuOSAgMC44ICAgICAgICAwZSs2MTQ0ICAtPiAwLjcyCitkcWZtYTIwNTMgZm1hICAwLjkgIC0wICAgICAgICAgMGUrNjE0NCAgLT4gMC4wCitkcWZtYTIwNTQgZm1hICA2NTQzMjEgNjU0MzIxICAgMGUrNjE0NCAgLT4gNDI4MTM1OTcxMDQxCisKK2RxZm1hMjA2MCBmbWEgIDEyMy40NSAxZTcgICAgMGUrNjE0NCAgLT4gIDEuMjM0NUUrOQorZHFmbWEyMDYxIGZtYSAgMTIzLjQ1IDFlOCAgICAwZSs2MTQ0ICAtPiAgMS4yMzQ1RSsxMAorZHFmbWEyMDYyIGZtYSAgMTIzLjQ1IDFlKzkgICAwZSs2MTQ0ICAtPiAgMS4yMzQ1RSsxMQorZHFmbWEyMDYzIGZtYSAgMTIzLjQ1IDFlMTAgICAwZSs2MTQ0ICAtPiAgMS4yMzQ1RSsxMgorZHFmbWEyMDY0IGZtYSAgMTIzLjQ1IDFlMTEgICAwZSs2MTQ0ICAtPiAgMS4yMzQ1RSsxMworZHFmbWEyMDY1IGZtYSAgMTIzLjQ1IDFlMTIgICAwZSs2MTQ0ICAtPiAgMS4yMzQ1RSsxNAorZHFmbWEyMDY2IGZtYSAgMTIzLjQ1IDFlMTMgICAwZSs2MTQ0ICAtPiAgMS4yMzQ1RSsxNQorCisKKy0tIHRlc3Qgc29tZSBpbnRlcm1lZGlhdGUgbGVuZ3RocworLS0gICAgICAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RxZm1hMjA4MCBmbWEgIDAuMSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAgIDBlKzYxNDQgIC0+IDEyMzAxMjM0NTY0NTY3OC45CitkcWZtYTIwODQgZm1hICAwLjEgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgICAwZSs2MTQ0ICAtPiAxMjMwMTIzNDU2NDU2NzguOQorZHFmbWEyMDkwIGZtYSAgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgMC4xICAgMGUrNjE0NCAgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKK2RxZm1hMjA5NCBmbWEgIDEyMzAxMjM0NTY0NTY3ODkgICAgIDAuMSAgIDBlKzYxNDQgIC0+IDEyMzAxMjM0NTY0NTY3OC45CisKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgYW5kIGNhcnJpZXMKK2RxZm1hMjEwMSBmbWEgIDkgOSAgICAgMGUrNjE0NCAgLT4gODEKK2RxZm1hMjEwMiBmbWEgIDkgOTAgICAgIDBlKzYxNDQgIC0+IDgxMAorZHFmbWEyMTAzIGZtYSAgOSA5MDAgICAgIDBlKzYxNDQgIC0+IDgxMDAKK2RxZm1hMjEwNCBmbWEgIDkgOTAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAKK2RxZm1hMjEwNSBmbWEgIDkgOTAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMAorZHFmbWEyMTA2IGZtYSAgOSA5MDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAKK2RxZm1hMjEwNyBmbWEgIDkgOTAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAKK2RxZm1hMjEwOCBmbWEgIDkgOTAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMAorZHFmbWEyMTA5IGZtYSAgOSA5MDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAKK2RxZm1hMjExMCBmbWEgIDkgOTAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAKK2RxZm1hMjExMSBmbWEgIDkgOTAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMAorZHFmbWEyMTEyIGZtYSAgOSA5MDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAKK2RxZm1hMjExMyBmbWEgIDkgOTAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAKK2RxZm1hMjExNCBmbWEgIDkgOTAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMAorZHFmbWEyMTE1IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAKKy0tZHFmbWEyMTE2IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMTcgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAKKy0tZHFmbWEyMTE4IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAKKy0tZHFmbWEyMTE5IGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMjAgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZHFmbWEyMTIxIGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tZHFmbWEyMTIyIGZtYSAgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS1kcWZtYTIxMjMgZm1hICA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgd2l0aG91dCBjYXJyaWVzCitkcWZtYTIxMzEgZm1hICAzIDMgICAgIDBlKzYxNDQgIC0+IDkKK2RxZm1hMjEzMiBmbWEgIDMgMzAgICAgIDBlKzYxNDQgIC0+IDkwCitkcWZtYTIxMzMgZm1hICAzIDMwMCAgICAgMGUrNjE0NCAgLT4gOTAwCitkcWZtYTIxMzQgZm1hICAzIDMwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAKK2RxZm1hMjEzNSBmbWEgIDMgMzAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwCitkcWZtYTIxMzYgZm1hICAzIDMwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwCitkcWZtYTIxMzcgZm1hICAzIDMwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAKK2RxZm1hMjEzOCBmbWEgIDMgMzAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwCitkcWZtYTIxMzkgZm1hICAzIDMwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwCitkcWZtYTIxNDAgZm1hICAzIDMwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAKK2RxZm1hMjE0MSBmbWEgIDMgMzAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwCitkcWZtYTIxNDIgZm1hICAzIDMwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwCitkcWZtYTIxNDMgZm1hICAzIDMwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAKK2RxZm1hMjE0NCBmbWEgIDMgMzAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAwCitkcWZtYTIxNDUgZm1hICAzIDMwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwCitkcWZtYTIxNDYgZm1hICAzIDMwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE0NyBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIxNDggZm1hICAzIDMwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIxNDkgZm1hICAzIDMwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE1MCBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIxNTEgZm1hICAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWZtYTIxNTIgZm1hICAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjE1MyBmbWEgIDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK2RxZm1hMjI2MyBmbWEgIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgICAwZSs2MTQ0ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkyODI5NiBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdCBzb21lIGVkZ2UgY2FzZXMgd2l0aCBleGFjdCByb3VuZGluZworZHFmbWEyMzAxIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMwMiBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMwMyBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzA0IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMwNSBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMwNiBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzA3IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMwOCBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMwOSBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzEwIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMxMSBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMxMiBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzEzIGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMxNCBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMxNSBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFmbWEyMzE2IGZtYSAgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwMDAgICAgIDBlKzYxNDQgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxZm1hMjMxNyBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICBSb3VuZGVkCitkcWZtYTIzMTggZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgIFJvdW5kZWQKK2RxZm1hMjMxOSBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYgIFJvdW5kZWQKK2RxZm1hMjMyMCBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM3ICBSb3VuZGVkCitkcWZtYTIzMjEgZm1hICA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzggIFJvdW5kZWQKK2RxZm1hMjMyMiBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgICAwZSs2MTQ0ICAtPiA4LjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzkgIFJvdW5kZWQKK2RxZm1hMjMyMyBmbWEgIDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgICAgMGUrNjE0NCAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzQwICBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCitkcWZtYTI1MDQgIGZtYSAgIDBFLTQyNjAgMTAwMEUtNDI2MCAgICAwZSs2MTQ0ICAtPiAwRS02MTc2IENsYW1wZWQKK2RxZm1hMjUwNSAgZm1hICAgMTAwRSs0MjYwIDBFKzQyNjAgICAgIDBlKzYxNDQgIC0+IDBFKzYxMTEgQ2xhbXBlZAorCistLSBtaXhlZCB3aXRoIHplcm9zCitkcWZtYTI1NDEgZm1hICAgMCAgICAtMSAgICAgICAwZSs2MTQ0ICAtPiAgMAorZHFmbWEyNTQyIGZtYSAgLTAgICAgLTEgICAgICAgMGUrNjE0NCAgLT4gIDAKK2RxZm1hMjU0MyBmbWEgICAwICAgICAxICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTI1NDQgZm1hICAtMCAgICAgMSAgICAgICAwZSs2MTQ0ICAtPiAgMAorZHFmbWEyNTQ1IGZtYSAgLTEgICAgIDAgICAgICAgMGUrNjE0NCAgLT4gIDAKK2RxZm1hMjU0NiBmbWEgIC0xICAgIC0wICAgICAgIDBlKzYxNDQgIC0+ICAwCitkcWZtYTI1NDcgZm1hICAgMSAgICAgMCAgICAgICAwZSs2MTQ0ICAtPiAgMAorZHFmbWEyNTQ4IGZtYSAgIDEgICAgLTAgICAgICAgMGUrNjE0NCAgLT4gIDAKKworZHFmbWEyNTUxIGZtYSAgIDAuMCAgLTEgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorZHFmbWEyNTUyIGZtYSAgLTAuMCAgLTEgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorZHFmbWEyNTUzIGZtYSAgIDAuMCAgIDEgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorZHFmbWEyNTU0IGZtYSAgLTAuMCAgIDEgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorZHFmbWEyNTU1IGZtYSAgLTEuMCAgIDAgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorZHFmbWEyNTU2IGZtYSAgLTEuMCAgLTAgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorZHFmbWEyNTU3IGZtYSAgIDEuMCAgIDAgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorZHFmbWEyNTU4IGZtYSAgIDEuMCAgLTAgICAgICAgMGUrNjE0NCAgLT4gIDAuMAorCitkcWZtYTI1NjEgZm1hICAgMCAgICAtMS4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NjIgZm1hICAtMCAgICAtMS4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NjMgZm1hICAgMCAgICAgMS4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NjQgZm1hICAtMCAgICAgMS4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NjUgZm1hICAtMSAgICAgMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NjYgZm1hICAtMSAgICAtMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NjcgZm1hICAgMSAgICAgMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCitkcWZtYTI1NjggZm1hICAgMSAgICAtMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wCisKK2RxZm1hMjU3MSBmbWEgICAwLjAgIC0xLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1NzIgZm1hICAtMC4wICAtMS4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTczIGZtYSAgIDAuMCAgIDEuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjU3NCBmbWEgIC0wLjAgICAxLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1NzUgZm1hICAtMS4wICAgMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTc2IGZtYSAgLTEuMCAgLTAuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjU3NyBmbWEgICAxLjAgICAwLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1NzggZm1hICAgMS4wICAtMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTc5IGZtYSAgIDEuMCAgIDAuMCAgICAgMGUrNjE0NCAgLT4gIDAuMDAKK2RxZm1hMjUzMCBmbWEgIC0xLjAgIC0wLjAgICAgIDBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1MzEgZm1hICAtMS4wICAgMC4wICAgICAwZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTMyIGZtYSAgIDEuMCAgLTAuMCAgICAtMGUrNjE0NCAgLT4gLTAuMDAKK2RxZm1hMjUzMyBmbWEgICAxLjAgICAwLjAgICAgLTBlKzYxNDQgIC0+ICAwLjAwCitkcWZtYTI1MzQgZm1hICAtMS4wICAtMC4wICAgIC0wZSs2MTQ0ICAtPiAgMC4wMAorZHFmbWEyNTM1IGZtYSAgLTEuMCAgIDAuMCAgICAtMGUrNjE0NCAgLT4gLTAuMDAKKworCistLSBTcGVjaWFscworZHFmbWEyNTgwIGZtYSAgIEluZiAgLUluZiAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI1ODEgZm1hICAgSW5mICAtMTAwMCAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjU4MiBmbWEgICBJbmYgIC0xICAgICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNTgzIGZtYSAgIEluZiAgLTAgICAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjU4NCBmbWEgICBJbmYgICAwICAgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI1ODUgZm1hICAgSW5mICAgMSAgICAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkKK2RxZm1hMjU4NiBmbWEgICBJbmYgICAxMDAwICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eQorZHFmbWEyNTg3IGZtYSAgIEluZiAgIEluZiAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI1ODggZm1hICAtMTAwMCAgSW5mICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjU4OSBmbWEgIC1JbmYgICBJbmYgICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNTkwIGZtYSAgLTEgICAgIEluZiAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI1OTEgZm1hICAtMCAgICAgSW5mICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNTkyIGZtYSAgIDAgICAgIEluZiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjU5MyBmbWEgICAxICAgICBJbmYgICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eQorZHFmbWEyNTk0IGZtYSAgIDEwMDAgIEluZiAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI1OTUgZm1hICAgSW5mICAgSW5mICAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkKKworZHFmbWEyNjAwIGZtYSAgLUluZiAgLUluZiAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI2MDEgZm1hICAtSW5mICAtMTAwMCAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkKK2RxZm1hMjYwMiBmbWEgIC1JbmYgIC0xICAgICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eQorZHFmbWEyNjAzIGZtYSAgLUluZiAgLTAgICAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjYwNCBmbWEgIC1JbmYgICAwICAgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2MDUgZm1hICAtSW5mICAgMSAgICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjYwNiBmbWEgIC1JbmYgICAxMDAwICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNjA3IGZtYSAgLUluZiAgIEluZiAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI2MDggZm1hICAtMTAwMCAgSW5mICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKK2RxZm1hMjYwOSBmbWEgIC1JbmYgIC1JbmYgICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eQorZHFmbWEyNjEwIGZtYSAgLTEgICAgLUluZiAgICAgMGUrNjE0NCAgLT4gIEluZmluaXR5CitkcWZtYTI2MTEgZm1hICAtMCAgICAtSW5mICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjEyIGZtYSAgIDAgICAgLUluZiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjYxMyBmbWEgICAxICAgIC1JbmYgICAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eQorZHFmbWEyNjE0IGZtYSAgIDEwMDAgLUluZiAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5CitkcWZtYTI2MTUgZm1hICAgSW5mICAtSW5mICAgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkKKworZHFmbWEyNjIxIGZtYSAgIE5hTiAtSW5mICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjIyIGZtYSAgIE5hTiAtMTAwMCAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjIzIGZtYSAgIE5hTiAtMSAgICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjI0IGZtYSAgIE5hTiAtMCAgICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjI1IGZtYSAgIE5hTiAgMCAgICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjI2IGZtYSAgIE5hTiAgMSAgICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjI3IGZtYSAgIE5hTiAgMTAwMCAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjI4IGZtYSAgIE5hTiAgSW5mICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjI5IGZtYSAgIE5hTiAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjMwIGZtYSAgLUluZiAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjMxIGZtYSAgLTEwMDAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjMyIGZtYSAgLTEgICAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjMzIGZtYSAgLTAgICAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjM0IGZtYSAgIDAgICAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjM1IGZtYSAgIDEgICAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjM2IGZtYSAgIDEwMDAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorZHFmbWEyNjM3IGZtYSAgIEluZiAgTmFOICAgICAgMGUrNjE0NCAgLT4gIE5hTgorCitkcWZtYTI2NDEgZm1hICAgc05hTiAtSW5mICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjQyIGZtYSAgIHNOYU4gLTEwMDAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY0MyBmbWEgICBzTmFOIC0xICAgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NDQgZm1hICAgc05hTiAtMCAgICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjQ1IGZtYSAgIHNOYU4gIDAgICAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY0NiBmbWEgICBzTmFOICAxICAgICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NDcgZm1hICAgc05hTiAgMTAwMCAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjQ4IGZtYSAgIHNOYU4gIE5hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY0OSBmbWEgICBzTmFOIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NTAgZm1hICAgTmFOICBzTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjUxIGZtYSAgLUluZiAgc05hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY1MiBmbWEgIC0xMDAwIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NTMgZm1hICAtMSAgICBzTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjU0IGZtYSAgLTAgICAgc05hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY1NSBmbWEgICAwICAgIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NTYgZm1hICAgMSAgICBzTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjU3IGZtYSAgIDEwMDAgc05hTiAgICAgMGUrNjE0NCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY1OCBmbWEgICBJbmYgIHNOYU4gICAgIDBlKzYxNDQgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NTkgZm1hICAgTmFOICBzTmFOICAgICAwZSs2MTQ0ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcWZtYTI2NjEgZm1hICAgTmFOOSAtSW5mICAgICAwZSs2MTQ0ICAtPiAgTmFOOQorZHFmbWEyNjYyIGZtYSAgIE5hTjggIDk5OSAgICAgMGUrNjE0NCAgLT4gIE5hTjgKK2RxZm1hMjY2MyBmbWEgICBOYU43MSBJbmYgICAgIDBlKzYxNDQgIC0+ICBOYU43MQorZHFmbWEyNjY0IGZtYSAgIE5hTjYgIE5hTjUgICAgMGUrNjE0NCAgLT4gIE5hTjYKK2RxZm1hMjY2NSBmbWEgIC1JbmYgICBOYU40ICAgIDBlKzYxNDQgIC0+ICBOYU40CitkcWZtYTI2NjYgZm1hICAtOTk5ICAgTmFOMzMgICAwZSs2MTQ0ICAtPiAgTmFOMzMKK2RxZm1hMjY2NyBmbWEgICBJbmYgICBOYU4yICAgIDBlKzYxNDQgIC0+ICBOYU4yCisKK2RxZm1hMjY3MSBmbWEgICBzTmFOOTkgLUluZiAgICAgIDBlKzYxNDQgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjcyIGZtYSAgIHNOYU45OCAtMTEgICAgICAgMGUrNjE0NCAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NzMgZm1hICAgc05hTjk3ICBOYU4gICAgICAwZSs2MTQ0ICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY3NCBmbWEgICBzTmFOMTYgc05hTjk0ICAgIDBlKzYxNDQgIC0+ICBOYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjc1IGZtYSAgIE5hTjk1ICBzTmFOOTMgICAgMGUrNjE0NCAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NzYgZm1hICAtSW5mICAgIHNOYU45MiAgICAwZSs2MTQ0ICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY3NyBmbWEgICAwODggICAgc05hTjkxICAgIDBlKzYxNDQgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjc4IGZtYSAgIEluZiAgICBzTmFOOTAgICAgMGUrNjE0NCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2NzkgZm1hICAgTmFOICAgIHNOYU44OSAgICAwZSs2MTQ0ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZHFmbWEyNjgxIGZtYSAgLU5hTjkgLUluZiAgICAgMGUrNjE0NCAgLT4gLU5hTjkKK2RxZm1hMjY4MiBmbWEgIC1OYU44ICA5OTkgICAgIDBlKzYxNDQgIC0+IC1OYU44CitkcWZtYTI2ODMgZm1hICAtTmFONzEgSW5mICAgICAwZSs2MTQ0ICAtPiAtTmFONzEKK2RxZm1hMjY4NCBmbWEgIC1OYU42IC1OYU41ICAgIDBlKzYxNDQgIC0+IC1OYU42CitkcWZtYTI2ODUgZm1hICAtSW5mICAtTmFONCAgICAwZSs2MTQ0ICAtPiAtTmFONAorZHFmbWEyNjg2IGZtYSAgLTk5OSAgLU5hTjMzICAgMGUrNjE0NCAgLT4gLU5hTjMzCitkcWZtYTI2ODcgZm1hICAgSW5mICAtTmFOMiAgICAwZSs2MTQ0ICAtPiAtTmFOMgorCitkcWZtYTI2OTEgZm1hICAtc05hTjk5IC1JbmYgICAgICAwZSs2MTQ0ICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY5MiBmbWEgIC1zTmFOOTggLTExICAgICAgIDBlKzYxNDQgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjkzIGZtYSAgLXNOYU45NyAgTmFOICAgICAgMGUrNjE0NCAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2OTQgZm1hICAtc05hTjE2IC1zTmFOOTQgICAwZSs2MTQ0ICAtPiAtTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY5NSBmbWEgIC1OYU45NSAgLXNOYU45MyAgIDBlKzYxNDQgIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjk2IGZtYSAgLUluZiAgICAtc05hTjkyICAgMGUrNjE0NCAgLT4gLU5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcWZtYTI2OTcgZm1hICAgMDg4ICAgIC1zTmFOOTEgICAwZSs2MTQ0ICAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxZm1hMjY5OCBmbWEgICBJbmYgICAgLXNOYU45MCAgIDBlKzYxNDQgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNjk5IGZtYSAgLU5hTiAgICAtc05hTjg5ICAgMGUrNjE0NCAgLT4gLU5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK2RxZm1hMjcwMSBmbWEgIC1OYU4gIC1JbmYgICAgIDBlKzYxNDQgIC0+IC1OYU4KK2RxZm1hMjcwMiBmbWEgIC1OYU4gICA5OTkgICAgIDBlKzYxNDQgIC0+IC1OYU4KK2RxZm1hMjcwMyBmbWEgIC1OYU4gICBJbmYgICAgIDBlKzYxNDQgIC0+IC1OYU4KK2RxZm1hMjcwNCBmbWEgIC1OYU4gIC1OYU4gICAgIDBlKzYxNDQgIC0+IC1OYU4KK2RxZm1hMjcwNSBmbWEgIC1JbmYgIC1OYU4wICAgIDBlKzYxNDQgIC0+IC1OYU4KK2RxZm1hMjcwNiBmbWEgIC05OTkgIC1OYU4gICAgIDBlKzYxNDQgIC0+IC1OYU4KK2RxZm1hMjcwNyBmbWEgICBJbmYgIC1OYU4gICAgIDBlKzYxNDQgIC0+IC1OYU4KKworZHFmbWEyNzExIGZtYSAgLXNOYU4gICAtSW5mICAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzEyIGZtYSAgLXNOYU4gICAtMTEgICAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzEzIGZtYSAgLXNOYU4wMCAgTmFOICAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzE0IGZtYSAgLXNOYU4gICAtc05hTiAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzE1IGZtYSAgLU5hTiAgICAtc05hTiAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzE2IGZtYSAgLUluZiAgICAtc05hTiAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzE3IGZtYSAgIDA4OCAgICAtc05hTiAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzE4IGZtYSAgIEluZiAgICAtc05hTiAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyNzE5IGZtYSAgLU5hTiAgICAtc05hTiAgICAgMGUrNjE0NCAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIG5vdGUgc3Vibm9ybWFsIHJlc3VsdHMKKy0tIHNpZ25zCitkcWZtYTI3NTEgZm1hICAgMWUrNDI3NyAgMWUrMzMxMSAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc1MiBmbWEgICAxZSs0Mjc3IC0xZSszMzExICAgMGUrNjE0NCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFmbWEyNzUzIGZtYSAgLTFlKzQyNzcgIDFlKzMzMTEgICAwZSs2MTQ0ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI3NTQgZm1hICAtMWUrNDI3NyAtMWUrMzMxMSAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjc1NSBmbWEgICAxZS00Mjc3ICAxZS0zMzExICAgMGUrNjE0NCAgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFmbWEyNzU2IGZtYSAgIDFlLTQyNzcgLTFlLTMzMTEgICAwZSs2MTQ0ICAtPiAtMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI3NTcgZm1hICAtMWUtNDI3NyAgMWUtMzMxMSAgIDBlKzYxNDQgIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZm1hMjc1OCBmbWEgIC0xZS00Mjc3IC0xZS0zMzExICAgMGUrNjE0NCAgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK2RxZm1hMjc2MCBmbWEgIDFlLTYwNjkgMWUtMTAxICAgMGUrNjE0NCAgLT4gMUUtNjE3MCBTdWJub3JtYWwKK2RxZm1hMjc2MSBmbWEgIDFlLTYwNjkgMWUtMTAyICAgMGUrNjE0NCAgLT4gMUUtNjE3MSBTdWJub3JtYWwKK2RxZm1hMjc2MiBmbWEgIDFlLTYwNjkgMWUtMTAzICAgMGUrNjE0NCAgLT4gMUUtNjE3MiBTdWJub3JtYWwKK2RxZm1hMjc2MyBmbWEgIDFlLTYwNjkgMWUtMTA0ICAgMGUrNjE0NCAgLT4gMUUtNjE3MyBTdWJub3JtYWwKK2RxZm1hMjc2NCBmbWEgIDFlLTYwNjkgMWUtMTA1ICAgMGUrNjE0NCAgLT4gMUUtNjE3NCBTdWJub3JtYWwKK2RxZm1hMjc2NSBmbWEgIDFlLTYwNjkgMWUtMTA2ICAgMGUrNjE0NCAgLT4gMUUtNjE3NSBTdWJub3JtYWwKK2RxZm1hMjc2NiBmbWEgIDFlLTYwNjkgMWUtMTA3ICAgMGUrNjE0NCAgLT4gMUUtNjE3NiBTdWJub3JtYWwKK2RxZm1hMjc2NyBmbWEgIDFlLTYwNjkgMWUtMTA4ICAgMGUrNjE0NCAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI3NjggZm1hICAxZS02MDY5IDFlLTEwOSAgIDBlKzYxNDQgIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFmbWEyNzY5IGZtYSAgMWUtNjA2OSAxZS0xMTAgICAwZSs2MTQ0ICAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKy0tIFtubyBlcXVpdmFsZW50IG9mICdzdWJub3JtYWwnIGZvciBvdmVyZmxvd10KK2RxZm1hMjc3MCBmbWEgIDFlKzQwIDFlKzYxMDEgICAwZSs2MTQ0ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MSBDbGFtcGVkCitkcWZtYTI3NzEgZm1hICAxZSs0MCAxZSs2MTAyICAgMGUrNjE0NCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQyICBDbGFtcGVkCitkcWZtYTI3NzIgZm1hICAxZSs0MCAxZSs2MTAzICAgMGUrNjE0NCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyAgQ2xhbXBlZAorZHFmbWEyNzczIGZtYSAgMWUrNDAgMWUrNjEwNCAgIDBlKzYxNDQgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0ICBDbGFtcGVkCitkcWZtYTI3NzQgZm1hICAxZSs0MCAxZSs2MTA1ICAgMGUrNjE0NCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI3NzUgZm1hICAxZSs0MCAxZSs2MTA2ICAgMGUrNjE0NCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI3NzYgZm1hICAxZSs0MCAxZSs2MTA3ICAgMGUrNjE0NCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI3NzcgZm1hICAxZSs0MCAxZSs2MTA4ICAgMGUrNjE0NCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI3NzggZm1hICAxZSs0MCAxZSs2MTA5ICAgMGUrNjE0NCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI3NzkgZm1hICAxZSs0MCAxZSs2MTEwICAgMGUrNjE0NCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK2RxZm1hMjgwMSBmbWEgICAxLjAwMDBFLTYxNzIgIDEgICAgICAgMGUrNjE0NCAgLT4gMS4wMDAwRS02MTcyIFN1Ym5vcm1hbAorZHFmbWEyODAyIGZtYSAgIDEuMDAwRS02MTcyICAgMWUtMSAgICAwZSs2MTQ0ICAtPiAxLjAwMEUtNjE3MyAgU3Vibm9ybWFsCitkcWZtYTI4MDMgZm1hICAgMS4wMEUtNjE3MiAgICAxZS0yICAgIDBlKzYxNDQgIC0+IDEuMDBFLTYxNzQgICBTdWJub3JtYWwKK2RxZm1hMjgwNCBmbWEgICAxLjBFLTYxNzIgICAgIDFlLTMgICAgMGUrNjE0NCAgLT4gMS4wRS02MTc1ICAgIFN1Ym5vcm1hbAorZHFmbWEyODA1IGZtYSAgIDEuMEUtNjE3MiAgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAxRS02MTc2ICAgICBTdWJub3JtYWwgUm91bmRlZAorZHFmbWEyODA2IGZtYSAgIDEuM0UtNjE3MiAgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODA3IGZtYSAgIDEuNUUtNjE3MiAgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODA4IGZtYSAgIDEuN0UtNjE3MiAgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODA5IGZtYSAgIDIuM0UtNjE3MiAgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODEwIGZtYSAgIDIuNUUtNjE3MiAgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODExIGZtYSAgIDIuN0UtNjE3MiAgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAzRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODEyIGZtYSAgIDEuNDlFLTYxNzIgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODEzIGZtYSAgIDEuNTBFLTYxNzIgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODE0IGZtYSAgIDEuNTFFLTYxNzIgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODE1IGZtYSAgIDIuNDlFLTYxNzIgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODE2IGZtYSAgIDIuNTBFLTYxNzIgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFmbWEyODE3IGZtYSAgIDIuNTFFLTYxNzIgICAgMWUtNCAgICAwZSs2MTQ0ICAtPiAzRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkcWZtYTI4MTggZm1hICAgMUUtNjE3MiAgICAgICAxZS00ICAgIDBlKzYxNDQgIC0+IDFFLTYxNzYgICAgIFN1Ym5vcm1hbAorZHFmbWEyODE5IGZtYSAgIDNFLTYxNzIgICAgICAgMWUtNSAgICAwZSs2MTQ0ICAtPiAwRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI4MjAgZm1hICAgNUUtNjE3MiAgICAgICAxZS01ICAgIDBlKzYxNDQgIC0+IDBFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxZm1hMjgyMSBmbWEgICA3RS02MTcyICAgICAgIDFlLTUgICAgMGUrNjE0NCAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjgyMiBmbWEgICA5RS02MTcyICAgICAgIDFlLTUgICAgMGUrNjE0NCAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxZm1hMjgyMyBmbWEgICA5LjlFLTYxNzIgICAgIDFlLTUgICAgMGUrNjE0NCAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHFmbWEyODI0IGZtYSAgIDFFLTYxNzIgICAgICAtMWUtNCAgICAwZSs2MTQ0ICAtPiAtMUUtNjE3NiAgICBTdWJub3JtYWwKK2RxZm1hMjgyNSBmbWEgICAzRS02MTcyICAgICAgLTFlLTUgICAgMGUrNjE0NCAgLT4gLTBFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFmbWEyODI2IGZtYSAgLTVFLTYxNzIgICAgICAgMWUtNSAgICAwZSs2MTQ0ICAtPiAtMEUtNjE3NiAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI4MjcgZm1hICAgN0UtNjE3MiAgICAgIC0xZS01ICAgIDBlKzYxNDQgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MjggZm1hICAtOUUtNjE3MiAgICAgICAxZS01ICAgIDBlKzYxNDQgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MjkgZm1hICAgOS45RS02MTcyICAgIC0xZS01ICAgIDBlKzYxNDQgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcWZtYTI4MzAgZm1hICAgMy4wRS02MTcyICAgIC0xZS01ICAgIDBlKzYxNDQgIC0+IC0wRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZHFmbWEyODMxIGZtYSAgIDEuMEUtNTk3NyAgICAgMWUtMjAwICAgMGUrNjE0NCAgLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcWZtYTI4MzIgZm1hICAgMS4wRS01OTc3ICAgICAxZS0xOTkgICAwZSs2MTQ0ICAtPiAxRS02MTc2ICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcWZtYTI4MzMgZm1hICAgMS4wRS01OTc3ICAgICAxZS0xOTggICAwZSs2MTQ0ICAtPiAxLjBFLTYxNzUgICAgU3Vibm9ybWFsCitkcWZtYTI4MzQgZm1hICAgMi4wRS01OTc3ICAgICAyZS0xOTggICAwZSs2MTQ0ICAtPiA0LjBFLTYxNzUgICAgU3Vibm9ybWFsCitkcWZtYTI4MzUgZm1hICAgNC4wRS01OTc3ICAgICA0ZS0xOTggICAwZSs2MTQ0ICAtPiAxLjYwRS02MTc0ICAgU3Vibm9ybWFsCitkcWZtYTI4MzYgZm1hICAxMC4wRS01OTc3ICAgIDEwZS0xOTggICAwZSs2MTQ0ICAtPiAxLjAwMEUtNjE3MyAgU3Vibm9ybWFsCitkcWZtYTI4MzcgZm1hICAzMC4wRS01OTc3ICAgIDMwZS0xOTggICAwZSs2MTQ0ICAtPiA5LjAwMEUtNjE3MyAgU3Vibm9ybWFsCitkcWZtYTI4MzggZm1hICA0MC4wRS01OTgyICAgIDQwZS0xNjYgICAwZSs2MTQ0ICAtPiAxLjYwMDBFLTYxNDUgU3Vibm9ybWFsCitkcWZtYTI4MzkgZm1hICA0MC4wRS01OTgyICAgIDQwZS0xNjUgICAwZSs2MTQ0ICAtPiAxLjYwMDBFLTYxNDQgU3Vibm9ybWFsCitkcWZtYTI4NDAgZm1hICA0MC4wRS01OTgyICAgIDQwZS0xNjQgICAwZSs2MTQ0ICAtPiAxLjYwMDBFLTYxNDMKKworLS0gTG9uZyBvcGVyYW5kIG92ZXJmbG93IG1heSBiZSBhIGRpZmZlcmVudCBwYXRoCitkcWZtYTI4NzAgZm1hICAxMDAgIDkuOTk5RSs2MTQzICAgICAgIDBlKzYxNDQgIC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2RxZm1hMjg3MSBmbWEgIDEwMCAtOS45OTlFKzYxNDMgICAgICAgMGUrNjE0NCAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZHFmbWEyODcyIGZtYSAgICAgICA5Ljk5OUUrNjE0MyAxMDAgICAwZSs2MTQ0ICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitkcWZtYTI4NzMgZm1hICAgICAgLTkuOTk5RSs2MTQzIDEwMCAgIDBlKzYxNDQgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gY2hlY2sgZm9yIGRvdWJsZS1yb3VuZGVkIHN1Ym5vcm1hbHMKK2RxZm1hMjg4MSBmbWEgICAxLjIzNDdFLTYxMzMgMS4yMzQ3RS00MCAgICAwZSs2MTQ0ICAtPiAgMS41MjRFLTYxNzMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZm1hMjg4MiBmbWEgICAxLjIzNEUtNjEzMyAxLjIzNEUtNDAgICAgICAwZSs2MTQ0ICAtPiAgMS41MjNFLTYxNzMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZm1hMjg4MyBmbWEgICAxLjIzRS02MTMzICAxLjIzRS00MCAgICAgICAwZSs2MTQ0ICAtPiAgMS41MTNFLTYxNzMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZm1hMjg4NCBmbWEgICAxLjJFLTYxMzMgICAxLjJFLTQwICAgICAgICAwZSs2MTQ0ICAtPiAgMS40NEUtNjE3MyAgU3Vibm9ybWFsCitkcWZtYTI4ODUgZm1hICAgMS4yRS02MTMzICAgMS4yRS00MSAgICAgICAgMGUrNjE0NCAgLT4gIDEuNDRFLTYxNzQgIFN1Ym5vcm1hbAorZHFmbWEyODg2IGZtYSAgIDEuMkUtNjEzMyAgIDEuMkUtNDIgICAgICAgIDBlKzYxNDQgIC0+ICAxLjRFLTYxNzUgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZHFmbWEyODg3IGZtYSAgIDEuMkUtNjEzMyAgIDEuM0UtNDIgICAgICAgIDBlKzYxNDQgIC0+ICAxLjZFLTYxNzUgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZHFmbWEyODg4IGZtYSAgIDEuM0UtNjEzMyAgIDEuM0UtNDIgICAgICAgIDBlKzYxNDQgIC0+ICAxLjdFLTYxNzUgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZHFmbWEyODg5IGZtYSAgIDEuM0UtNjEzMyAgIDEuM0UtNDMgICAgICAgIDBlKzYxNDQgIC0+ICAgIDJFLTYxNzYgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZHFmbWEyODkwIGZtYSAgIDEuM0UtNjEzNCAgIDEuM0UtNDMgICAgICAgIDBlKzYxNDQgIC0+ICAgIDBFLTYxNzYgICBDbGFtcGVkIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKK2RxZm1hMjg5MSBmbWEgICAxLjIzNDVFLTM5ICAgIDEuMjM0RS02MTMzICAgMGUrNjE0NCAgLT4gIDEuNTIzNEUtNjE3MiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFmbWEyODkyIGZtYSAgIDEuMjM0NTZFLTM5ICAgMS4yMzRFLTYxMzMgICAwZSs2MTQ0ICAtPiAgMS41MjM0RS02MTcyIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWZtYTI4OTMgZm1hICAgMS4yMzQ1RS00MCAgIDEuMjM0RS02MTMzICAgMGUrNjE0NCAgLT4gIDEuNTIzRS02MTczICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFmbWEyODk0IGZtYSAgIDEuMjM0NTZFLTQwICAxLjIzNEUtNjEzMyAgIDBlKzYxNDQgIC0+ICAxLjUyM0UtNjE3MyAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxZm1hMjg5NSBmbWEgICAxLjIzNDVFLTQxICAgMS4yMzRFLTYxMzMgICAwZSs2MTQ0ICAtPiAgMS41MkUtNjE3NCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcWZtYTI4OTYgZm1hICAgMS4yMzQ1NkUtNDEgIDEuMjM0RS02MTMzICAgMGUrNjE0NCAgLT4gIDEuNTJFLTYxNzQgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBOb3cgZXhwbG9yZSB0aGUgY2FzZSB3aGVyZSB3ZSBnZXQgYSBub3JtYWwgcmVzdWx0IHdpdGggVW5kZXJmbG93CistLSBwcm92ZSBvcGVyYW5kcyBhcmUgZXhhY3QKK2RxZm1hMjkwNiBmbWEgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0MyAgMSAgICAgICAgICAgICAgICAgICAgICAgICAwZSs2MTQ0ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0MworZHFmbWEyOTA3IGZtYSAgICAgICAgICAgICAgICAgICAgICAgIDEgIDAuMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICAgMGUrNjE0NCAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorLS0gdGhlIG5leHQgcm91bmRzIHRvIE5taW4KK2RxZm1hMjkwOCBmbWEgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0MyAgMC4wOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgICAwZSs2MTQ0ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorCistLSBodWdlc3QKK2RxZm1hMjkwOSBmbWEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgIDBlKzYxNDQgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2NyBJbmV4YWN0IFJvdW5kZWQKKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitwcmVjaXNpb246ICAgMzQKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCitkcWZtYTIxMDAxICBmbWEgIDEzMEUtMiAgMTIwRS0yICAgMGUrNjE0NCAgLT4gMS41NjAwCitkcWZtYTIxMDAyICBmbWEgIDEzMEUtMiAgMTJFLTEgICAgMGUrNjE0NCAgLT4gMS41NjAKK2RxZm1hMjEwMDMgIGZtYSAgMTMwRS0yICAxRTAgICAgICAwZSs2MTQ0ICAtPiAxLjMwCitkcWZtYTIxMDA0ICBmbWEgIDFFMiAgICAgMUU0ICAgICAgMGUrNjE0NCAgLT4gMUUrNgorCistLSBOdWxsIHRlc3RzCitkcWZtYTI5OTAgZm1hICAxMCAgIyAgIDBlKzYxNDQgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFmbWEyOTkxIGZtYSAgICMgMTAgICAwZSs2MTQ0ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworCistLSBBRERJVElPTiBURVNUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitkcWFkZDMwMDEgZm1hICAxICAxICAgICAgIDEgICAgICAgLT4gIDIKK2RxYWRkMzAwMiBmbWEgIDEgIDIgICAgICAgMyAgICAgICAtPiAgNQorZHFhZGQzMDAzIGZtYSAgMSAgJzUuNzUnICAnMy4zJyAgIC0+ICA5LjA1CitkcWFkZDMwMDQgZm1hICAxICAnNScgICAgICctMycgICAgLT4gIDIKK2RxYWRkMzAwNSBmbWEgIDEgICctNScgICAgJy0zJyAgICAtPiAgLTgKK2RxYWRkMzAwNiBmbWEgIDEgICctNycgICAgJzIuNScgICAtPiAgLTQuNQorZHFhZGQzMDA3IGZtYSAgMSAgJzAuNycgICAnMC4zJyAgIC0+ICAxLjAKK2RxYWRkMzAwOCBmbWEgIDEgICcxLjI1JyAgJzEuMjUnICAtPiAgMi41MAorZHFhZGQzMDA5IGZtYSAgMSAgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzIuMjM0NTY3ODknCitkcWFkZDMwMTAgZm1hICAxICAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMi4yMzQ1NjgwMCcKKworLS0gICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RxYWRkMzAxMSBmbWEgIDEgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDYnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMDEyIGZtYSAgMSAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NScgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZHFhZGQzMDEzIGZtYSAgMSAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknCitkcWFkZDMwMTQgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMTUgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OTknICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMTYgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC40OTk5JyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMTcgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDAwJyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMTggZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDAxJyAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMTkgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MDEnICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMjAgZm1hICAxICAgICc0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAnMC41MScgICAtPiAnNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzAyMSBmbWEgIDEgIDAgMSAtPiAxCitkcWFkZDMwMjIgZm1hICAxICAxIDEgLT4gMgorZHFhZGQzMDIzIGZtYSAgMSAgMiAxIC0+IDMKK2RxYWRkMzAyNCBmbWEgIDEgIDMgMSAtPiA0CitkcWFkZDMwMjUgZm1hICAxICA0IDEgLT4gNQorZHFhZGQzMDI2IGZtYSAgMSAgNSAxIC0+IDYKK2RxYWRkMzAyNyBmbWEgIDEgIDYgMSAtPiA3CitkcWFkZDMwMjggZm1hICAxICA3IDEgLT4gOAorZHFhZGQzMDI5IGZtYSAgMSAgOCAxIC0+IDkKK2RxYWRkMzAzMCBmbWEgIDEgIDkgMSAtPiAxMAorCistLSBzb21lIGNhcnJ5aW5nIGVmZmVjdHMKK2RxYWRkMzAzMSBmbWEgIDEgICcwLjk5OTgnICAnMC4wMDAwJyAtPiAnMC45OTk4JworZHFhZGQzMDMyIGZtYSAgMSAgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTknCitkcWFkZDMwMzMgZm1hICAxICAnMC45OTk4JyAgJzAuMDAwMicgLT4gJzEuMDAwMCcKK2RxYWRkMzAzNCBmbWEgIDEgICcwLjk5OTgnICAnMC4wMDAzJyAtPiAnMS4wMDAxJworCitkcWFkZDMwMzUgZm1hICAxICAnNzAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAzNiBmbWEgIDEgICc3MDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAzNyBmbWEgIDEgICc3MDAwJyAgJzEwMDAwZSszNCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwMzggZm1hICAxICAnNzAwMDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzAzOSBmbWEgIDEgICc3MDAwMDAnICAnMTAwMDBlKzM0JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDdFKzM4JyBSb3VuZGVkCisKKy0tIHN5bW1ldHJ5OgorZHFhZGQzMDQwIGZtYSAgMSAgJzEwMDAwZSszNCcgICc3MCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwNDEgZm1hICAxICAnMTAwMDBlKzM0JyAgJzcwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwNDIgZm1hICAxICAnMTAwMDBlKzM0JyAgJzcwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMDQ0IGZtYSAgMSAgJzEwMDAwZSszNCcgICc3MDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRSszOCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMwNDUgZm1hICAxICAnMTAwMDBlKzM0JyAgJzcwMDAwMCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3RSszOCcgUm91bmRlZAorCistLSBzYW1lLCB3aXRob3V0IHJvdW5kaW5nCitkcWFkZDMwNDYgZm1hICAxICAnMTAwMDBlKzknICAnNycgLT4gJzEwMDAwMDAwMDAwMDA3JworZHFhZGQzMDQ3IGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMTAwMDAwMDAwMDAwNzAnCitkcWFkZDMwNDggZm1hICAxICAnMTAwMDBlKzknICAnNzAwJyAtPiAnMTAwMDAwMDAwMDA3MDAnCitkcWFkZDMwNDkgZm1hICAxICAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEwMDAwMDAwMDA3MDAwJworZHFhZGQzMDUwIGZtYSAgMSAgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMTAwMDAwMDAwNzAwMDAnCitkcWFkZDMwNTEgZm1hICAxICAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMTAwMDAwMDA3MDAwMDAnCitkcWFkZDMwNTIgZm1hICAxICAnMTAwMDBlKzknICAnNzAwMDAwMCcgLT4gJzEwMDAwMDA3MDAwMDAwJworCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCitkcWFkZDMwNTMgZm1hICAxICAnMTInICc3LjAwJyAtPiAnMTkuMDAnCitkcWFkZDMwNTQgZm1hICAxICAnMS4zJyAnLTEuMDcnIC0+ICcwLjIzJworZHFhZGQzMDU1IGZtYSAgMSAgJzEuMycgJy0xLjMwJyAtPiAnMC4wMCcKK2RxYWRkMzA1NiBmbWEgIDEgICcxLjMnICctMi4wNycgLT4gJy0wLjc3JworZHFhZGQzMDU3IGZtYSAgMSAgJzFFKzInICcxRSs0JyAtPiAnMS4wMUUrNCcKKworLS0gbGVhZGluZyB6ZXJvIHByZXNlcnZhdGlvbgorZHFhZGQzMDYxIGZtYSAgMSAgMSAnMC4wMDAxJyAtPiAnMS4wMDAxJworZHFhZGQzMDYyIGZtYSAgMSAgMSAnMC4wMDAwMScgLT4gJzEuMDAwMDEnCitkcWFkZDMwNjMgZm1hICAxICAxICcwLjAwMDAwMScgLT4gJzEuMDAwMDAxJworZHFhZGQzMDY0IGZtYSAgMSAgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMDAxJworZHFhZGQzMDY1IGZtYSAgMSAgMSAnMC4wMDAwMDAwMScgLT4gJzEuMDAwMDAwMDEnCisKKy0tIHNvbWUgZnVubnkgemVyb3MgW2luIGNhc2Ugb2YgYmFkIHNpZ251bV0KK2RxYWRkMzA3MCBmbWEgIDEgIDEgIDAgICAgLT4gMQorZHFhZGQzMDcxIGZtYSAgMSAgMSAwLiAgICAtPiAxCitkcWFkZDMwNzIgZm1hICAxICAxICAuMCAgIC0+IDEuMAorZHFhZGQzMDczIGZtYSAgMSAgMSAwLjAgICAtPiAxLjAKK2RxYWRkMzA3NCBmbWEgIDEgIDEgMC4wMCAgLT4gMS4wMAorZHFhZGQzMDc1IGZtYSAgMSAgIDAgIDEgICAtPiAxCitkcWFkZDMwNzYgZm1hICAxICAwLiAgMSAgIC0+IDEKK2RxYWRkMzA3NyBmbWEgIDEgICAuMCAxICAgLT4gMS4wCitkcWFkZDMwNzggZm1hICAxICAwLjAgMSAgIC0+IDEuMAorZHFhZGQzMDc5IGZtYSAgMSAgMC4wMCAxICAtPiAxLjAwCisKKy0tIHNvbWUgY2FycmllcworZHFhZGQzMDgwIGZtYSAgMSAgOTk5OTk5OTk4IDEgIC0+IDk5OTk5OTk5OQorZHFhZGQzMDgxIGZtYSAgMSAgOTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAKK2RxYWRkMzA4MiBmbWEgIDEgICA5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAKK2RxYWRkMzA4MyBmbWEgIDEgICAgOTk5OTk5OSAxICAtPiAxMDAwMDAwMAorZHFhZGQzMDg0IGZtYSAgMSAgICAgOTk5OTk5IDEgIC0+IDEwMDAwMDAKK2RxYWRkMzA4NSBmbWEgIDEgICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2RxYWRkMzA4NiBmbWEgIDEgICAgICAgOTk5OSAxICAtPiAxMDAwMAorZHFhZGQzMDg3IGZtYSAgMSAgICAgICAgOTk5IDEgIC0+IDEwMDAKK2RxYWRkMzA4OCBmbWEgIDEgICAgICAgICA5OSAxICAtPiAxMDAKK2RxYWRkMzA4OSBmbWEgIDEgICAgICAgICAgOSAxICAtPiAxMAorCisKKy0tIG1vcmUgTEhTIHN3YXBzCitkcWFkZDMwOTAgZm1hICAxICAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2RxYWRkMzA5MSBmbWEgIDEgICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitkcWFkZDMwOTIgZm1hICAxICAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCitkcWFkZDMwOTMgZm1hICAxICAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2RxYWRkMzA5NCBmbWEgIDEgICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworZHFhZGQzMDk1IGZtYSAgMSAgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCitkcWFkZDMwOTYgZm1hICAxICAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2RxYWRkMzA5NyBmbWEgIDEgICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitkcWFkZDMwOTggZm1hICAxICAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworZHFhZGQzMDk5IGZtYSAgMSAgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworZHFhZGQzMTAwIGZtYSAgMSAgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2RxYWRkMzEwMSBmbWEgIDEgICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK2RxYWRkMzEwMiBmbWEgIDEgICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworZHFhZGQzMTAzIGZtYSAgMSAgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitkcWFkZDMxMDQgZm1hICAxICAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCitkcWFkZDMxMDUgZm1hICAxICAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworZHFhZGQzMTA2IGZtYSAgMSAgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitkcWFkZDMxMDcgZm1hICAxICAnLTVFMzMnICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCitkcWFkZDMxMDggZm1hICAxICAnLTVFMzQnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCcgIFJvdW5kZWQKK2RxYWRkMzEwOSBmbWEgIDEgICctNUUzNScgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1JyAgUm91bmRlZAorZHFhZGQzMTEwIGZtYSAgMSAgJy01RTM2JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYnICBSb3VuZGVkCitkcWFkZDMxMTEgZm1hICAxICAnLTVFMTAwJyAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSsxMDAnIFJvdW5kZWQKKworLS0gbW9yZSBSSFMgc3dhcHMKK2RxYWRkMzExMyBmbWEgIDEgIDAgICctNTYyNjdFLTEwJyAtPiAgJy0wLjAwMDAwNTYyNjcnCitkcWFkZDMxMTQgZm1hICAxICAwICAnLTU2MjY3RS02JyAgLT4gICctMC4wNTYyNjcnCitkcWFkZDMxMTYgZm1hICAxICAwICAnLTU2MjY3RS01JyAgLT4gICctMC41NjI2NycKK2RxYWRkMzExNyBmbWEgIDEgIDAgICctNTYyNjdFLTQnICAtPiAgJy01LjYyNjcnCitkcWFkZDMxMTkgZm1hICAxICAwICAnLTU2MjY3RS0zJyAgLT4gICctNTYuMjY3JworZHFhZGQzMTIwIGZtYSAgMSAgMCAgJy01NjI2N0UtMicgIC0+ICAnLTU2Mi42NycKK2RxYWRkMzEyMSBmbWEgIDEgIDAgICctNTYyNjdFLTEnICAtPiAgJy01NjI2LjcnCitkcWFkZDMxMjIgZm1hICAxICAwICAnLTU2MjY3RS0wJyAgLT4gICctNTYyNjcnCitkcWFkZDMxMjMgZm1hICAxICAwICAnLTVFLTEwJyAgICAgLT4gICctNUUtMTAnCitkcWFkZDMxMjQgZm1hICAxICAwICAnLTVFLTcnICAgICAgLT4gICctNUUtNycKK2RxYWRkMzEyNSBmbWEgIDEgIDAgICctNUUtNicgICAgICAtPiAgJy0wLjAwMDAwNScKK2RxYWRkMzEyNiBmbWEgIDEgIDAgICctNUUtNScgICAgICAtPiAgJy0wLjAwMDA1JworZHFhZGQzMTI3IGZtYSAgMSAgMCAgJy01RS00JyAgICAgIC0+ICAnLTAuMDAwNScKK2RxYWRkMzEyOCBmbWEgIDEgIDAgICctNUUtMScgICAgICAtPiAgJy0wLjUnCitkcWFkZDMxMjkgZm1hICAxICAwICAnLTVFMCcgICAgICAgLT4gICctNScKK2RxYWRkMzEzMCBmbWEgIDEgIDAgICctNUUxJyAgICAgICAtPiAgJy01MCcKK2RxYWRkMzEzMSBmbWEgIDEgIDAgICctNUU1JyAgICAgICAtPiAgJy01MDAwMDAnCitkcWFkZDMxMzIgZm1hICAxICAwICAnLTVFMzMnICAgICAgLT4gICctNTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKK2RxYWRkMzEzMyBmbWEgIDEgIDAgICctNUUzNCcgICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQnICAgUm91bmRlZAorZHFhZGQzMTM0IGZtYSAgMSAgMCAgJy01RTM1JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNScgICBSb3VuZGVkCitkcWFkZDMxMzUgZm1hICAxICAwICAnLTVFMzYnICAgICAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM2JyAgIFJvdW5kZWQKK2RxYWRkMzEzNiBmbWEgIDEgIDAgICctNUUxMDAnICAgICAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCistLSByZWxhdGVkCitkcWFkZDMxMzcgZm1hICAxICAgMSAgJzBFLTM5JyAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitkcWFkZDMxMzggZm1hICAxICAtMSAgJzBFLTM5JyAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkcWFkZDMxMzkgZm1hICAxICAnMEUtMzknIDEgICAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitkcWFkZDMxNDAgZm1hICAxICAnMEUtMzknIC0xICAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitkcWFkZDMxNDEgZm1hICAxICAxRSsyOSAgIDAuMDAwMCAgIC0+ICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAwMDAnCitkcWFkZDMxNDIgZm1hICAxICAxRSsyOSAgIDAuMDAwMDAgIC0+ICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLjAwMDAnICBSb3VuZGVkCitkcWFkZDMxNDMgZm1hICAxICAwLjAwMCAgIDFFKzMwICAgIC0+ICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wMDAnCitkcWFkZDMxNDQgZm1hICAxICAwLjAwMDAgIDFFKzMwICAgIC0+ICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4wMDAnICBSb3VuZGVkCisKKy0tIFtzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHNdCitkcWFkZDMxNDYgZm1hICAxICAnMDAuMCcgIDAgICAgICAgLT4gICcwLjAnCitkcWFkZDMxNDcgZm1hICAxICAnMC4wMCcgIDAgICAgICAgLT4gICcwLjAwJworZHFhZGQzMTQ4IGZtYSAgMSAgIDAgICAgICAnMC4wMCcgIC0+ICAnMC4wMCcKK2RxYWRkMzE0OSBmbWEgIDEgICAwICAgICAgJzAwLjAnICAtPiAgJzAuMCcKK2RxYWRkMzE1MCBmbWEgIDEgICcwMC4wJyAgJzAuMDAnICAtPiAgJzAuMDAnCitkcWFkZDMxNTEgZm1hICAxICAnMC4wMCcgICcwMC4wJyAgLT4gICcwLjAwJworZHFhZGQzMTUyIGZtYSAgMSAgJzMnICAgICAnLjMnICAgIC0+ICAnMy4zJworZHFhZGQzMTUzIGZtYSAgMSAgJzMuJyAgICAnLjMnICAgIC0+ICAnMy4zJworZHFhZGQzMTU0IGZtYSAgMSAgJzMuMCcgICAnLjMnICAgIC0+ICAnMy4zJworZHFhZGQzMTU1IGZtYSAgMSAgJzMuMDAnICAnLjMnICAgIC0+ICAnMy4zMCcKK2RxYWRkMzE1NiBmbWEgIDEgICczJyAgICAgJzMnICAgICAtPiAgJzYnCitkcWFkZDMxNTcgZm1hICAxICAnMycgICAgICcrMycgICAgLT4gICc2JworZHFhZGQzMTU4IGZtYSAgMSAgJzMnICAgICAnLTMnICAgIC0+ICAnMCcKK2RxYWRkMzE1OSBmbWEgIDEgICcwLjMnICAgJy0wLjMnICAtPiAgJzAuMCcKK2RxYWRkMzE2MCBmbWEgIDEgICcwLjAzJyAgJy0wLjAzJyAtPiAgJzAuMDAnCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitkcWFkZDMxNjEgZm1hICAxICAnMUUrMTInICctMScgICAgLT4gJzk5OTk5OTk5OTk5OScKK2RxYWRkMzE2MiBmbWEgIDEgICcxRSsxMicgICcxLjExJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2RxYWRkMzE2MyBmbWEgIDEgICcxLjExJyAgJzFFKzEyJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2RxYWRkMzE2NCBmbWEgIDEgICctMScgICAgJzFFKzEyJyAtPiAnOTk5OTk5OTk5OTk5JworZHFhZGQzMTY1IGZtYSAgMSAgJzdFKzEyJyAnLTEnICAgIC0+ICc2OTk5OTk5OTk5OTk5JworZHFhZGQzMTY2IGZtYSAgMSAgJzdFKzEyJyAgJzEuMTEnIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZHFhZGQzMTY3IGZtYSAgMSAgJzEuMTEnICAnN0UrMTInIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZHFhZGQzMTY4IGZtYSAgMSAgJy0xJyAgICAnN0UrMTInIC0+ICc2OTk5OTk5OTk5OTk5JworCityb3VuZGluZzogaGFsZl91cAorZHFhZGQzMTcwIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2NycgLT4gJzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE3MSBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NjYnIC0+ICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMxNzIgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTY1JyAtPiAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTczIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2NCcgLT4gJzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE3NCBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTMnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMxNzUgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTUyJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTc2IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE3NyBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTAnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScgUm91bmRlZAorZHFhZGQzMTc4IGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0NScgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE3OSBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDQnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMxODAgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQzJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMTgxIGZtYSAgMSAgJzQuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU0MicgLT4gJzQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzE4MiBmbWEgIDEgICc0LjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NDEnIC0+ICc0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMxODMgZm1hICAxICAnNC40NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTQwJyAtPiAnNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTgnIFJvdW5kZWQKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2RxYWRkMzIwMCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JworZHFhZGQzMjAxIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjAyIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjAzIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjA0IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjA1IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjA2IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjA3IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjA4IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjA5IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjEwIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjExIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjEyIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjEzIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjE0IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjE1IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjE2IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnCitkcWFkZDMyMTcgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTggZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMTkgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2RxYWRkMzIyMCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JworZHFhZGQzMjIxIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjIyIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjIzIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjI0IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjI1IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjI2IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjI3IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjI4IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjI5IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjMwIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjMxIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjMyIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjMzIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjM0IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjM1IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjM2IGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3OTAnCitkcWFkZDMyMzcgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzggZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyMzkgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZHFhZGQzMjQwIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjQxIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMjQyIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZHFhZGQzMjUwIGZtYSAgMSAgJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1Njc4OTAxMjM0NTY3ODQ1NjAxMjM0NTY3ODknCitkcWFkZDMyNTEgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTIgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTMgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTQgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTUgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTYgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTcgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTggZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNTkgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNjAgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNjEgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNjIgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNjMgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNjQgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNjUgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMyNjYgZm1hICAxICAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU2Nzg5MDEyMzQ1Njc4NDU2MDEyMzQ1Njc5MCcKK2RxYWRkMzI2NyBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2OCBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzI2OSBmbWEgIDEgICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTY3ODkwMTIzNDU2Nzg0NTYwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gMSBpbiBsYXN0IHBsYWNlIHRlc3RzCityb3VuZGluZzogaGFsZl91cAorZHFhZGQzMzAxIGZtYSAgMSAgIC0xICAgMSAgICAgIC0+ICAgMAorZHFhZGQzMzAyIGZtYSAgMSAgICAwICAgMSAgICAgIC0+ICAgMQorZHFhZGQzMzAzIGZtYSAgMSAgICAxICAgMSAgICAgIC0+ICAgMgorZHFhZGQzMzA0IGZtYSAgMSAgIDEyICAgMSAgICAgIC0+ICAxMworZHFhZGQzMzA1IGZtYSAgMSAgIDk4ICAgMSAgICAgIC0+ICA5OQorZHFhZGQzMzA2IGZtYSAgMSAgIDk5ICAgMSAgICAgIC0+IDEwMAorZHFhZGQzMzA3IGZtYSAgMSAgMTAwICAgMSAgICAgIC0+IDEwMQorZHFhZGQzMzA4IGZtYSAgMSAgMTAxICAgMSAgICAgIC0+IDEwMgorZHFhZGQzMzA5IGZtYSAgMSAgIC0xICAtMSAgICAgIC0+ICAtMgorZHFhZGQzMzEwIGZtYSAgMSAgICAwICAtMSAgICAgIC0+ICAtMQorZHFhZGQzMzExIGZtYSAgMSAgICAxICAtMSAgICAgIC0+ICAgMAorZHFhZGQzMzEyIGZtYSAgMSAgIDEyICAtMSAgICAgIC0+ICAxMQorZHFhZGQzMzEzIGZtYSAgMSAgIDk4ICAtMSAgICAgIC0+ICA5NworZHFhZGQzMzE0IGZtYSAgMSAgIDk5ICAtMSAgICAgIC0+ICA5OAorZHFhZGQzMzE1IGZtYSAgMSAgMTAwICAtMSAgICAgIC0+ICA5OQorZHFhZGQzMzE2IGZtYSAgMSAgMTAxICAtMSAgICAgIC0+IDEwMAorCitkcWFkZDMzMjEgZm1hICAxICAtMC4wMSAgMC4wMSAgICAtPiAgMC4wMAorZHFhZGQzMzIyIGZtYSAgMSAgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2RxYWRkMzMyMyBmbWEgIDEgICAwLjAxICAwLjAxICAgIC0+ICAwLjAyCitkcWFkZDMzMjQgZm1hICAxICAgMC4xMiAgMC4wMSAgICAtPiAgMC4xMworZHFhZGQzMzI1IGZtYSAgMSAgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2RxYWRkMzMyNiBmbWEgIDEgICAwLjk5ICAwLjAxICAgIC0+ICAxLjAwCitkcWFkZDMzMjcgZm1hICAxICAgMS4wMCAgMC4wMSAgICAtPiAgMS4wMQorZHFhZGQzMzI4IGZtYSAgMSAgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2RxYWRkMzMyOSBmbWEgIDEgIC0wLjAxIC0wLjAxICAgIC0+IC0wLjAyCitkcWFkZDMzMzAgZm1hICAxICAgMC4wMCAtMC4wMSAgICAtPiAtMC4wMQorZHFhZGQzMzMxIGZtYSAgMSAgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2RxYWRkMzMzMiBmbWEgIDEgICAwLjEyIC0wLjAxICAgIC0+ICAwLjExCitkcWFkZDMzMzMgZm1hICAxICAgMC45OCAtMC4wMSAgICAtPiAgMC45NworZHFhZGQzMzM0IGZtYSAgMSAgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2RxYWRkMzMzNSBmbWEgIDEgICAxLjAwIC0wLjAxICAgIC0+ICAwLjk5CitkcWFkZDMzMzYgZm1hICAxICAgMS4wMSAtMC4wMSAgICAtPiAgMS4wMAorCistLSBzb21lIG1vcmUgY2FzZXMgd2hlcmUgYWRkaW5nIDAgYWZmZWN0cyB0aGUgY29lZmZpY2llbnQKK2RxYWRkMzM0MCBmbWEgIDEgIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2RxYWRkMzM0MSBmbWEgIDEgIDFFKzMzICAgMCAgICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWFkZDMzNDIgZm1hICAxICAxRSszNCAgIDAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgIFJvdW5kZWQKK2RxYWRkMzM0MyBmbWEgIDEgIDFFKzM1ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNSAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorZHFhZGQzMzQ0IGZtYSAgMSAgMUUrMyAgICAxICAgIC0+ICAgICAgICAgMTAwMQorZHFhZGQzMzQ1IGZtYSAgMSAgMUUrMzMgICAxICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxYWRkMzM0NiBmbWEgIDEgIDFFKzM0ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMzNDcgZm1hICAxICAxRSszNSAgIDEgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzMzQ4IGZtYSAgMSAgMUUrMyAgICA3ICAgIC0+ICAgICAgICAgMTAwNworZHFhZGQzMzQ5IGZtYSAgMSAgMUUrMzMgICA3ICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxYWRkMzM1MCBmbWEgIDEgIDFFKzM0ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRSszNCAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDMzNTEgZm1hICAxICAxRSszNSAgIDcgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzUgIEluZXhhY3QgUm91bmRlZAorCistLSB0cnl6ZXJvcyBjYXNlcworcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RxYWRkMzM2MCAgZm1hICAxICAwRSs1MCAxMDAwMEUrMSAgLT4gMS4wMDAwRSs1CitkcWFkZDMzNjEgIGZtYSAgMSAgMEUtNTAgMTAwMDBFKzEgIC0+IDEwMDAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIFJvdW5kZWQKK2RxYWRkMzM2MiAgZm1hICAxICAxMDAwMEUrMSAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgUm91bmRlZAorZHFhZGQzMzYzICBmbWEgIDEgIDEwMDAwRSsxIDEwMDAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgUm91bmRlZCBJbmV4YWN0CitkcWFkZDMzNjQgIGZtYSAgMSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDBFKzYxMTEKKy0tICAgICAgICAgICAgMSAyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworLS0gYSBjdXJpb3NpdHkgZnJvbSBKU1IgMTMgdGVzdGluZworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorZHFhZGQzMzcwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxNAorZHFhZGQzMzcxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSA4MTUgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwODFFKzM0IFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RxYWRkMzM3MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MTQKK2RxYWRkMzM3MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxRSszNCBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RxYWRkMzM3NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4MTQKK2RxYWRkMzM3NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgODE1IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgxRSszNCBSb3VuZGVkIEluZXhhY3QKKworLS0gdWxwIHJlcGxhY2VtZW50IHRlc3RzCitkcWFkZDM0MDAgZm1hICAxICAgIDEgICA3N2UtMzIgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NworZHFhZGQzNDAxIGZtYSAgMSAgICAxICAgNzdlLTMzICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDM0MDIgZm1hICAxICAgIDEgICA3N2UtMzQgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MDMgZm1hICAxICAgIDEgICA3N2UtMzUgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MDQgZm1hICAxICAgIDEgICA3N2UtMzYgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MDUgZm1hICAxICAgIDEgICA3N2UtMzcgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MDYgZm1hICAxICAgIDEgICA3N2UtMjk5ICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzQxMCBmbWEgIDEgICAxMCAgIDc3ZS0zMiAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NworZHFhZGQzNDExIGZtYSAgMSAgIDEwICAgNzdlLTMzICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDEyIGZtYSAgMSAgIDEwICAgNzdlLTM0ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDEzIGZtYSAgMSAgIDEwICAgNzdlLTM1ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDE0IGZtYSAgMSAgIDEwICAgNzdlLTM2ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDE1IGZtYSAgMSAgIDEwICAgNzdlLTM3ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDE2IGZtYSAgMSAgIDEwICAgNzdlLTI5OSAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDM0MjAgZm1hICAxICAgNzdlLTMyICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NworZHFhZGQzNDIxIGZtYSAgMSAgIDc3ZS0zMyAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDc3CitkcWFkZDM0MjIgZm1hICAxICAgNzdlLTM0ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MjMgZm1hICAxICAgNzdlLTM1ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MjQgZm1hICAxICAgNzdlLTM2ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MjUgZm1hICAxICAgNzdlLTM3ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM0MjYgZm1hICAxICAgNzdlLTI5OSAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzQzMCBmbWEgIDEgICA3N2UtMzIgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3NworZHFhZGQzNDMxIGZtYSAgMSAgIDc3ZS0zMyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDMyIGZtYSAgMSAgIDc3ZS0zNCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDMzIGZtYSAgMSAgIDc3ZS0zNSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDM0IGZtYSAgMSAgIDc3ZS0zNiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDM1IGZtYSAgMSAgIDc3ZS0zNyAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNDM2IGZtYSAgMSAgIDc3ZS0yOTkgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCitkcWFkZDM2NDQwIGZtYSAgMSAgICAxICAgLTc3ZS0zMiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDQxIGZtYSAgMSAgICAxICAgLTc3ZS0zMyAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ0MiBmbWEgIDEgICAgMSAgIC03N2UtMzQgICAgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDQzIGZtYSAgMSAgICAxICAgLTc3ZS0zNSAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDQ0IGZtYSAgMSAgICAxICAgLTc3ZS0zNiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDQ1IGZtYSAgMSAgICAxICAgLTc3ZS0zNyAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NDYgZm1hICAxICAgIDEgICAtNzdlLTk5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDM2NDUwIGZtYSAgMSAgIDEwICAgLTc3ZS0zMiAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ1MSBmbWEgIDEgICAxMCAgIC03N2UtMzMgICAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDUyIGZtYSAgMSAgIDEwICAgLTc3ZS0zNCAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDUzIGZtYSAgMSAgIDEwICAgLTc3ZS0zNSAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDU0IGZtYSAgMSAgIDEwICAgLTc3ZS0zNiAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NTUgZm1hICAxICAgMTAgICAtNzdlLTM3ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ1NiBmbWEgIDEgICAxMCAgIC03N2UtOTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzY0NjAgZm1hICAxICAgLTc3ZS0zMiAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NjEgZm1hICAxICAgLTc3ZS0zMyAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDYyIGZtYSAgMSAgIC03N2UtMzQgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NjMgZm1hICAxICAgLTc3ZS0zNSAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NjQgZm1hICAxICAgLTc3ZS0zNiAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NjUgZm1hICAxICAgLTc3ZS0zNyAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ2NiBmbWEgIDEgICAtNzdlLTk5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzY0NzAgZm1hICAxICAgLTc3ZS0zMiAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NDcxIGZtYSAgMSAgIC03N2UtMzMgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0NzIgZm1hICAxICAgLTc3ZS0zNCAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NzMgZm1hICAxICAgLTc3ZS0zNSAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0NzQgZm1hICAxICAgLTc3ZS0zNiAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjQ3NSBmbWEgIDEgICAtNzdlLTM3ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDc2IGZtYSAgMSAgIC03N2UtOTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworZHFhZGQzNjQ4MCBmbWEgIDEgICAtMSAgICA3N2UtMzIgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY0ODEgZm1hICAxICAgLTEgICAgNzdlLTMzICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ4MiBmbWEgIDEgICAtMSAgICA3N2UtMzQgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ4MyBmbWEgIDEgICAtMSAgICA3N2UtMzUgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0ODQgZm1hICAxICAgLTEgICAgNzdlLTM2ICAgICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDg1IGZtYSAgMSAgIC0xICAgIDc3ZS0zNyAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDg2IGZtYSAgMSAgIC0xICAgIDc3ZS05OSAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzY0OTAgZm1hICAxICAtMTAgICAgNzdlLTMyICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ5MSBmbWEgIDEgIC0xMCAgICA3N2UtMzMgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkyMworZHFhZGQzNjQ5MiBmbWEgIDEgIC0xMCAgICA3N2UtMzQgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY0OTMgZm1hICAxICAtMTAgICAgNzdlLTM1ICAgICAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDk0IGZtYSAgMSAgLTEwICAgIDc3ZS0zNiAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDk1IGZtYSAgMSAgLTEwICAgIDc3ZS0zNyAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NDk2IGZtYSAgMSAgLTEwICAgIDc3ZS05OSAgICAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzY1MDAgZm1hICAxICAgIDc3ZS0zMiAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIzCitkcWFkZDM2NTAxIGZtYSAgMSAgICA3N2UtMzMgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY1MDIgZm1hICAxICAgIDc3ZS0zNCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY1MDMgZm1hICAxICAgIDc3ZS0zNSAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTA0IGZtYSAgMSAgICA3N2UtMzYgICAgICAtMSAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjUwNSBmbWEgIDEgICAgNzdlLTM3ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjUwNiBmbWEgIDEgICAgNzdlLTk5ICAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitkcWFkZDM2NTEwIGZtYSAgMSAgICA3N2UtMzIgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY1MTEgZm1hICAxICAgIDc3ZS0zMyAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MjMKK2RxYWRkMzY1MTIgZm1hICAxICAgIDc3ZS0zNCAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTEzIGZtYSAgMSAgICA3N2UtMzUgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjUxNCBmbWEgIDEgICAgNzdlLTM2ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjUxNSBmbWEgIDEgICAgNzdlLTM3ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjUxNiBmbWEgIDEgICAgNzdlLTk5ICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBhbmQgc29tZSBtb3JlIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2RxYWRkMzY1NDAgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScKK2RxYWRkMzY1NDEgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTQyIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU0MyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NDQgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTQ1IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU0NiBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NDcgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTQ4IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU0OSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NTAgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTUxIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU1MiBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NTMgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTU0IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU1NSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NTYgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcKK2RxYWRkMzY1NTcgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTU4IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU1OSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZHFhZGQzNjU2MCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JworZHFhZGQzNjU2MSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NjIgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTYzIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU2NCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NjUgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTY2IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU2NyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NjggZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTY5IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU3MCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NzEgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTcyIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU3MyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NzQgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTc1IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNjU3NiBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJworZHFhZGQzNjU3NyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzY1NzggZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM2NTc5IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZHFhZGQzNzU0MCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NDEgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTQyIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZHFhZGQzNzU1MCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JworZHFhZGQzNzU1MSBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NTIgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTUzIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU1NCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NTUgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTU2IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU1NyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NTggZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTU5IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU2MCBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NjEgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTYyIGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU2MyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NjQgZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTY1IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzU2NiBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJworZHFhZGQzNzU2NyBmbWEgIDEgICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICc5ODc2NTQzMjE5ODc2NTQzMjE2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1NjggZm1hICAxICAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnOTg3NjU0MzIxOTg3NjU0MzIxNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTY5IGZtYSAgMSAgJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzk4NzY1NDMyMTk4NzY1NDMyMTY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl9ldmVuCisKK2RxYWRkMzc3MDEgZm1hICAxICA1LjAwIDEuMDBFLTMgLT4gNS4wMDEwMAorZHFhZGQzNzcwMiBmbWEgIDEgIDAwLjAwIDAuMDAwICAtPiAwLjAwMAorZHFhZGQzNzcwMyBmbWEgIDEgIDAwLjAwIDBFLTMgICAtPiAwLjAwMAorZHFhZGQzNzcwNCBmbWEgIDEgIDBFLTMgIDAwLjAwICAtPiAwLjAwMAorCitkcWFkZDM3NzEwIGZtYSAgMSAgMEUrMyAgMDAuMDAgIC0+IDAuMDAKK2RxYWRkMzc3MTEgZm1hICAxICAwRSszICAwMC4wICAgLT4gMC4wCitkcWFkZDM3NzEyIGZtYSAgMSAgMEUrMyAgMDAuICAgIC0+IDAKK2RxYWRkMzc3MTMgZm1hICAxICAwRSszICAwMC5FKzEgLT4gMEUrMQorZHFhZGQzNzcxNCBmbWEgIDEgIDBFKzMgIDAwLkUrMiAtPiAwRSsyCitkcWFkZDM3NzE1IGZtYSAgMSAgMEUrMyAgMDAuRSszIC0+IDBFKzMKK2RxYWRkMzc3MTYgZm1hICAxICAwRSszICAwMC5FKzQgLT4gMEUrMworZHFhZGQzNzcxNyBmbWEgIDEgIDBFKzMgIDAwLkUrNSAtPiAwRSszCitkcWFkZDM3NzE4IGZtYSAgMSAgMEUrMyAgLTAwLjAgICAtPiAwLjAKK2RxYWRkMzc3MTkgZm1hICAxICAwRSszICAtMDAuICAgIC0+IDAKK2RxYWRkMzc3MzEgZm1hICAxICAwRSszICAtMDAuRSsxIC0+IDBFKzEKKworZHFhZGQzNzcyMCBmbWEgIDEgIDAwLjAwICAwRSszICAtPiAwLjAwCitkcWFkZDM3NzIxIGZtYSAgMSAgMDAuMCAgIDBFKzMgIC0+IDAuMAorZHFhZGQzNzcyMiBmbWEgIDEgIDAwLiAgICAwRSszICAtPiAwCitkcWFkZDM3NzIzIGZtYSAgMSAgMDAuRSsxIDBFKzMgIC0+IDBFKzEKK2RxYWRkMzc3MjQgZm1hICAxICAwMC5FKzIgMEUrMyAgLT4gMEUrMgorZHFhZGQzNzcyNSBmbWEgIDEgIDAwLkUrMyAwRSszICAtPiAwRSszCitkcWFkZDM3NzI2IGZtYSAgMSAgMDAuRSs0IDBFKzMgIC0+IDBFKzMKK2RxYWRkMzc3MjcgZm1hICAxICAwMC5FKzUgMEUrMyAgLT4gMEUrMworZHFhZGQzNzcyOCBmbWEgIDEgIC0wMC4wMCAwRSszICAtPiAwLjAwCitkcWFkZDM3NzI5IGZtYSAgMSAgLTAwLjAgIDBFKzMgIC0+IDAuMAorZHFhZGQzNzczMCBmbWEgIDEgIC0wMC4gICAwRSszICAtPiAwCisKK2RxYWRkMzc3MzIgZm1hICAxICAgMCAgICAgMCAgICAgLT4gIDAKK2RxYWRkMzc3MzMgZm1hICAxICAgMCAgICAtMCAgICAgLT4gIDAKK2RxYWRkMzc3MzQgZm1hICAxICAtMCAgICAgMCAgICAgLT4gIDAKK2RxYWRkMzc3MzUgZm1hICAxICAtMCAgICAtMCAgICAgLT4gLTAgICAgIC0tIElFRUUgODU0IHNwZWNpYWwgY2FzZQorCitkcWFkZDM3NzM2IGZtYSAgMSAgIDEgICAgLTEgICAgIC0+ICAwCitkcWFkZDM3NzM3IGZtYSAgMSAgLTEgICAgLTEgICAgIC0+IC0yCitkcWFkZDM3NzM4IGZtYSAgMSAgIDEgICAgIDEgICAgIC0+ICAyCitkcWFkZDM3NzM5IGZtYSAgMSAgLTEgICAgIDEgICAgIC0+ICAwCisKK2RxYWRkMzc3NDEgZm1hICAxICAgMCAgICAtMSAgICAgLT4gLTEKK2RxYWRkMzc3NDIgZm1hICAxICAtMCAgICAtMSAgICAgLT4gLTEKK2RxYWRkMzc3NDMgZm1hICAxICAgMCAgICAgMSAgICAgLT4gIDEKK2RxYWRkMzc3NDQgZm1hICAxICAtMCAgICAgMSAgICAgLT4gIDEKK2RxYWRkMzc3NDUgZm1hICAxICAtMSAgICAgMCAgICAgLT4gLTEKK2RxYWRkMzc3NDYgZm1hICAxICAtMSAgICAtMCAgICAgLT4gLTEKK2RxYWRkMzc3NDcgZm1hICAxICAgMSAgICAgMCAgICAgLT4gIDEKK2RxYWRkMzc3NDggZm1hICAxICAgMSAgICAtMCAgICAgLT4gIDEKKworZHFhZGQzNzc1MSBmbWEgIDEgICAwLjAgIC0xICAgICAtPiAtMS4wCitkcWFkZDM3NzUyIGZtYSAgMSAgLTAuMCAgLTEgICAgIC0+IC0xLjAKK2RxYWRkMzc3NTMgZm1hICAxICAgMC4wICAgMSAgICAgLT4gIDEuMAorZHFhZGQzNzc1NCBmbWEgIDEgIC0wLjAgICAxICAgICAtPiAgMS4wCitkcWFkZDM3NzU1IGZtYSAgMSAgLTEuMCAgIDAgICAgIC0+IC0xLjAKK2RxYWRkMzc3NTYgZm1hICAxICAtMS4wICAtMCAgICAgLT4gLTEuMAorZHFhZGQzNzc1NyBmbWEgIDEgICAxLjAgICAwICAgICAtPiAgMS4wCitkcWFkZDM3NzU4IGZtYSAgMSAgIDEuMCAgLTAgICAgIC0+ICAxLjAKKworZHFhZGQzNzc2MSBmbWEgIDEgICAwICAgIC0xLjAgICAtPiAtMS4wCitkcWFkZDM3NzYyIGZtYSAgMSAgLTAgICAgLTEuMCAgIC0+IC0xLjAKK2RxYWRkMzc3NjMgZm1hICAxICAgMCAgICAgMS4wICAgLT4gIDEuMAorZHFhZGQzNzc2NCBmbWEgIDEgIC0wICAgICAxLjAgICAtPiAgMS4wCitkcWFkZDM3NzY1IGZtYSAgMSAgLTEgICAgIDAuMCAgIC0+IC0xLjAKK2RxYWRkMzc3NjYgZm1hICAxICAtMSAgICAtMC4wICAgLT4gLTEuMAorZHFhZGQzNzc2NyBmbWEgIDEgICAxICAgICAwLjAgICAtPiAgMS4wCitkcWFkZDM3NzY4IGZtYSAgMSAgIDEgICAgLTAuMCAgIC0+ICAxLjAKKworZHFhZGQzNzc3MSBmbWEgIDEgICAwLjAgIC0xLjAgICAtPiAtMS4wCitkcWFkZDM3NzcyIGZtYSAgMSAgLTAuMCAgLTEuMCAgIC0+IC0xLjAKK2RxYWRkMzc3NzMgZm1hICAxICAgMC4wICAgMS4wICAgLT4gIDEuMAorZHFhZGQzNzc3NCBmbWEgIDEgIC0wLjAgICAxLjAgICAtPiAgMS4wCitkcWFkZDM3Nzc1IGZtYSAgMSAgLTEuMCAgIDAuMCAgIC0+IC0xLjAKK2RxYWRkMzc3NzYgZm1hICAxICAtMS4wICAtMC4wICAgLT4gLTEuMAorZHFhZGQzNzc3NyBmbWEgIDEgICAxLjAgICAwLjAgICAtPiAgMS4wCitkcWFkZDM3Nzc4IGZtYSAgMSAgIDEuMCAgLTAuMCAgIC0+ICAxLjAKKworLS0gU3BlY2lhbHMKK2RxYWRkMzc3ODAgZm1hICAxICAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDM3NzgxIGZtYSAgMSAgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc4MiBmbWEgIDEgIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3ODMgZm1hICAxICAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkcWFkZDM3Nzg0IGZtYSAgMSAgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc4NSBmbWEgIDEgIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3ODYgZm1hICAxICAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkcWFkZDM3Nzg3IGZtYSAgMSAgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc4OCBmbWEgIDEgIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3ODkgZm1hICAxICAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDM3NzkwIGZtYSAgMSAgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc5MSBmbWEgIDEgICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxYWRkMzc3OTIgZm1hICAxICAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcWFkZDM3NzkzIGZtYSAgMSAgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFhZGQzNzc5NCBmbWEgIDEgICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkcWFkZDM3ODAwIGZtYSAgMSAgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODAxIGZtYSAgMSAgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgwMiBmbWEgIDEgICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MDMgZm1hICAxICAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkcWFkZDM3ODA0IGZtYSAgMSAgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgwNSBmbWEgIDEgICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MDYgZm1hICAxICAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkcWFkZDM3ODA3IGZtYSAgMSAgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgwOCBmbWEgIDEgIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MDkgZm1hICAxICAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4MTAgZm1hICAxICAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDM3ODExIGZtYSAgMSAgLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgxMiBmbWEgIDEgICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxYWRkMzc4MTMgZm1hICAxICAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcWFkZDM3ODE0IGZtYSAgMSAgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFhZGQzNzgxNSBmbWEgIDEgICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFhZGQzNzgyMSBmbWEgIDEgICBOYU4gLUluZiAgICAtPiAgTmFOCitkcWFkZDM3ODIyIGZtYSAgMSAgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RxYWRkMzc4MjMgZm1hICAxICAgTmFOIC0xICAgICAgLT4gIE5hTgorZHFhZGQzNzgyNCBmbWEgIDEgICBOYU4gLTAgICAgICAtPiAgTmFOCitkcWFkZDM3ODI1IGZtYSAgMSAgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RxYWRkMzc4MjYgZm1hICAxICAgTmFOICAxICAgICAgLT4gIE5hTgorZHFhZGQzNzgyNyBmbWEgIDEgICBOYU4gIDEwMDAgICAtPiAgTmFOCitkcWFkZDM3ODI4IGZtYSAgMSAgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RxYWRkMzc4MjkgZm1hICAxICAgTmFOICBOYU4gICAgLT4gIE5hTgorZHFhZGQzNzgzMCBmbWEgIDEgIC1JbmYgIE5hTiAgICAtPiAgTmFOCitkcWFkZDM3ODMxIGZtYSAgMSAgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RxYWRkMzc4MzIgZm1hICAxICAtMSAgICBOYU4gICAgLT4gIE5hTgorZHFhZGQzNzgzMyBmbWEgIDEgIC0wICAgIE5hTiAgICAtPiAgTmFOCitkcWFkZDM3ODM0IGZtYSAgMSAgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RxYWRkMzc4MzUgZm1hICAxICAgMSAgICBOYU4gICAgLT4gIE5hTgorZHFhZGQzNzgzNiBmbWEgIDEgICAxMDAwIE5hTiAgICAtPiAgTmFOCitkcWFkZDM3ODM3IGZtYSAgMSAgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFhZGQzNzg0MSBmbWEgIDEgICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0MiBmbWEgIDEgICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0MyBmbWEgIDEgICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0NCBmbWEgIDEgICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0NSBmbWEgIDEgICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0NiBmbWEgIDEgICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0NyBmbWEgIDEgICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0OCBmbWEgIDEgICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg0OSBmbWEgIDEgICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1MCBmbWEgIDEgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1MSBmbWEgIDEgIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1MiBmbWEgIDEgIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1MyBmbWEgIDEgIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1NCBmbWEgIDEgIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1NSBmbWEgIDEgICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1NiBmbWEgIDEgICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1NyBmbWEgIDEgICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1OCBmbWEgIDEgICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg1OSBmbWEgIDEgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcWFkZDM3ODYxIGZtYSAgMSAgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitkcWFkZDM3ODYyIGZtYSAgMSAgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitkcWFkZDM3ODYzIGZtYSAgMSAgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitkcWFkZDM3ODY0IGZtYSAgMSAgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitkcWFkZDM3ODY1IGZtYSAgMSAgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitkcWFkZDM3ODY2IGZtYSAgMSAgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitkcWFkZDM3ODY3IGZtYSAgMSAgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitkcWFkZDM3ODY4IGZtYSAgMSAgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitkcWFkZDM3ODY5IGZtYSAgMSAgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZHFhZGQzNzg3MSBmbWEgIDEgICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODcyIGZtYSAgMSAgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4NzMgZm1hICAxICAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg3NCBmbWEgIDEgICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODc1IGZtYSAgMSAgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4NzYgZm1hICAxICAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg3NyBmbWEgIDEgIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODc4IGZtYSAgMSAgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4NzkgZm1hICAxICAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZHFhZGQzNzg4MCBmbWEgIDEgICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM3ODgxIGZtYSAgMSAgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4ODIgZm1hICAxICAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitkcWFkZDM3ODgzIGZtYSAgMSAgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2RxYWRkMzc4ODQgZm1hICAxICAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitkcWFkZDM3ODg1IGZtYSAgMSAgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gSGVyZSB3ZSBleHBsb3JlIG5lYXIgdGhlIGJvdW5kYXJ5IG9mIHJvdW5kaW5nIGEgc3Vibm9ybWFsIHRvIE5taW4KK2RxYWRkMzc1NzUgZm1hICAxICAgMUUtNjE0MyAtMUUtNjE3NiAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCBTdWJub3JtYWwKK2RxYWRkMzc1NzYgZm1hICAxICAtMUUtNjE0MyArMUUtNjE3NiAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCBTdWJub3JtYWwKKworLS0gY2hlY2sgb3ZlcmZsb3cgZWRnZSBjYXNlCistLSAgICAgICAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2RxYWRkMzc5NzIgYXBwbHkgICAgICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFhZGQzNzk3MyBmbWEgIDEgICAgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk3NCBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgMSAgICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk3NSBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgMUUrNjExMSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTc2IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA5RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc5NzcgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDhFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk3OCBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgN0UrNjExMCAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTc5IGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICA2RSs2MTEwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc5ODAgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDVFKzYxMTAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk4MSBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgNEUrNjExMCAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTgyIGZtYSAgMSAgICAgICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExICAzRSs2MTEwICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc5ODMgZm1hICAxICAgICAgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMTEgIDJFKzYxMTAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk4NCBmbWEgIDEgICAgICAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAgMUUrNjExMCAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzc5ODUgYXBwbHkgICAgICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxYWRkMzc5ODYgZm1hICAxICAgICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3OTg3IGZtYSAgMSAgICAgIC05OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTExIC0xICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk4OCBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtMUUrNjExMSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk4OSBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtOUUrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5MCBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtOEUrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5MSBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtN0UrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5MiBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtNkUrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5MyBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtNUUrNjExMCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5NCBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtNEUrNjExMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5NSBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtM0UrNjExMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5NiBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtMkUrNjExMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzk5NyBmbWEgIDEgICAgICAtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjExMSAtMUUrNjExMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IEluZXhhY3QgUm91bmRlZAorCistLSBBbmQgZm9yIHJvdW5kIGRvd24gZnVsbCBhbmQgc3Vibm9ybWFsIHJlc3VsdHMKK3JvdW5kaW5nOiAgICAgZG93bgorZHFhZGQzNzExMDAgZm1hICAxICAxZSsyIC0xZS02MTQzICAgIC0+IDk5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDEgZm1hICAxICAxZSsxIC0xZS02MTQzICAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzcxMTAzIGZtYSAgMSAgICArMSAtMWUtNjE0MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDQgZm1hICAxICAxZS0xIC0xZS02MTQzICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDUgZm1hICAxICAxZS0yIC0xZS02MTQzICAgIC0+IDAuMDA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzcxMTA2IGZtYSAgMSAgMWUtMyAtMWUtNjE0MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDcgZm1hICAxICAxZS00IC0xZS02MTQzICAgIC0+IDAuMDAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMDggZm1hICAxICAxZS01IC0xZS02MTQzICAgIC0+IDAuMDAwMDA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzcxMTA5IGZtYSAgMSAgMWUtNiAtMWUtNjE0MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworZHFhZGQzNzExMTAgZm1hICAxICAtMWUrMiArMWUtNjE0MyAgIC0+IC05OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzcxMTExIGZtYSAgMSAgLTFlKzEgKzFlLTYxNDMgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTMgZm1hICAxICAgICAtMSArMWUtNjE0MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTQgZm1hICAxICAtMWUtMSArMWUtNjE0MyAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzcxMTE1IGZtYSAgMSAgLTFlLTIgKzFlLTYxNDMgICAtPiAtMC4wMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTYgZm1hICAxICAtMWUtMyArMWUtNjE0MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTcgZm1hICAxICAtMWUtNCArMWUtNjE0MyAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2RxYWRkMzcxMTE4IGZtYSAgMSAgLTFlLTUgKzFlLTYxNDMgICAtPiAtMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZHFhZGQzNzExMTkgZm1hICAxICAtMWUtNiArMWUtNjE0MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCityb3VuZGluZzogICAgIGhhbGZfZXZlbgorCitkcWFkZDM3MTMwMCBmbWEgIDEgIDFFMzQgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxMCBmbWEgIDEgIDFFMzQgIC0wLjUxICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxMSBmbWEgIDEgIDFFMzQgIC0wLjUwMSAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxMiBmbWEgIDEgIDFFMzQgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxMyBmbWEgIDEgIDFFMzQgIC0wLjUwMDAxICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxNCBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMSAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxNSBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxNiBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAxICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxNyBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMSAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxOCBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMxOSBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAxICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyMCBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMSAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyMSBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyMiBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAxICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyMyBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyNCBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyNSBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyNiBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwMCAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyNyBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyOCBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMyOSBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwMCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzMCBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzMSBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzMiBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwMCAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzMyBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzNCBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzNSBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwMCAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzNiBmbWEgIDEgIDFFMzQgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzNyBmbWEgIDEgIDFFMzQgIC0wLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzOCBmbWEgIDEgIDFFMzQgIC0wLjUwMCAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTMzOSBmbWEgIDEgIDFFMzQgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCisKK2RxYWRkMzcxMzQwIGZtYSAgMSAgMUUzNCAgLTUwMDAwMDAuMDAwMDEwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzQxIGZtYSAgMSAgMUUzNCAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUwMDAwMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZHFhZGQzNzEzNDkgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzUwIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5ICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM1MSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTkgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNTIgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzUzIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5ICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM1NCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTkgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNTUgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzU2IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5ICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM1NyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTkgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNTggZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzU5IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5ICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM2MCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTkgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNjEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzYyIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5ICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM2MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OTkgICAtPiAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNjQgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzY1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMDAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM2NyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNjggZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzY5IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM3MCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNzEgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzcyIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM3MyBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNzQgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzc1IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM3NiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzNzcgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzc4IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM3OSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzODAgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzgxIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM4MiBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzODMgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzg0IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAxICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM4NSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAxICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzODYgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzg3IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAxICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM4OCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAxICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzODkgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzkwIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAxICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM5MSBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAxICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzOTIgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzkzIGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAxICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTM5NCBmbWEgIDEgIDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgMC41MDAxICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzEzOTUgZm1hICAxICA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxMzk2IGZtYSAgMSAgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAwLjUxICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQgSW5leGFjdCBSb3VuZGVkCisKKy0tIE1vcmUgR0QgZWRnZSBjYXNlcywgd2hlcmUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB1bmFkanVzdGVkCistLSBleHBvbmVudHMgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gcHJlY2lzaW9uIGFuZCBvbmUgc2lkZSBpcyAwCitkcWFkZDM3MTQyMCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE0MjEgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQyMiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQyMyBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE0MjQgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQyNSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQyNiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE0MjcgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTcKK2RxYWRkMzcxNDI4IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS04CitkcWFkZDM3MTQyOSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtOQorZHFhZGQzNzE0MzAgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEwCitkcWFkZDM3MTQzMSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTEKK2RxYWRkMzcxNDMyIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZHFhZGQzNzE0MzMgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEzCitkcWFkZDM3MTQzNCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTQKK2RxYWRkMzcxNDM1IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZHFhZGQzNzE0MzYgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE2CitkcWFkZDM3MTQzNyBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTcKK2RxYWRkMzcxNDM4IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZHFhZGQzNzE0MzkgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE5CitkcWFkZDM3MTQ0MCBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjAKK2RxYWRkMzcxNDQxIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMQorZHFhZGQzNzE0NDIgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjIgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIyCitkcWFkZDM3MTQ0MyBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMyAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjMKK2RxYWRkMzcxNDQ0IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNAorZHFhZGQzNzE0NDUgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjUgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI1CitkcWFkZDM3MTQ0NiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNiAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjYKK2RxYWRkMzcxNDQ3IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNworZHFhZGQzNzE0NDggZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjggLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI4CitkcWFkZDM3MTQ0OSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOSAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjkKK2RxYWRkMzcxNDUwIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMAorZHFhZGQzNzE0NTEgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzEgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMxCitkcWFkZDM3MTQ1MiBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMiAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzIKK2RxYWRkMzcxNDUzIGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMworZHFhZGQzNzE0NTQgZm1hICAxICAgMCAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzQgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM0CitkcWFkZDM3MTQ1NSBmbWEgIDEgICAwIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNSAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzUKK2RxYWRkMzcxNDU2IGZtYSAgMSAgIDAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2IC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNgorCistLSBzYW1lLCByZXZlcnNlZCAwCitkcWFkZDM3MTQ2MCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQ2MSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xICAwIC0+IDAuMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE0NjIgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQ2MyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQ2NCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS00ICAwIC0+IDAuMDAwMTEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE0NjUgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQ2NiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTQ2NyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS03ICAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS03CitkcWFkZDM3MTQ2OCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS04CitkcWFkZDM3MTQ2OSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS05CitkcWFkZDM3MTQ3MCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZHFhZGQzNzE0NzEgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTEKK2RxYWRkMzcxNDcyIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTEyCitkcWFkZDM3MTQ3MyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMyAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xMworZHFhZGQzNzE0NzQgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTQKK2RxYWRkMzcxNDc1IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE1CitkcWFkZDM3MTQ3NiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZHFhZGQzNzE0NzcgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMTcKK2RxYWRkMzcxNDc4IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTE4CitkcWFkZDM3MTQ3OSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0xOQorZHFhZGQzNzE0ODAgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjAgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjAKK2RxYWRkMzcxNDgxIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTIxCitkcWFkZDM3MTQ4MiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMiAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yMgorZHFhZGQzNzE0ODMgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjMgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjMKK2RxYWRkMzcxNDg0IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI0CitkcWFkZDM3MTQ4NSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yNQorZHFhZGQzNzE0ODYgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjYgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjYKK2RxYWRkMzcxNDg3IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTI3CitkcWFkZDM3MTQ4OCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0yOAorZHFhZGQzNzE0ODkgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjkgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMjkKK2RxYWRkMzcxNDkwIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMwCitkcWFkZDM3MTQ5MSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMSAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zMQorZHFhZGQzNzE0OTIgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzIgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzIKK2RxYWRkMzcxNDkzIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzIDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTMzCitkcWFkZDM3MTQ5NCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNCAwIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1RS0zNAorZHFhZGQzNzE0OTUgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzUgMCAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NUUtMzUKK2RxYWRkMzcxNDk2IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2IDAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDVFLTM2CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCitkcWFkZDM3MTUwMCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0wICAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTAxIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MDIgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUwMyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zICAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTA0IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTQgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MDUgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUwNiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS02ICAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTA3IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTcgICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MDggZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUwOSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS05ICAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTEwIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEwICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MTEgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUxMiBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMiAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTEzIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTEzICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MTQgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUxNSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNSAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTE2IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE2ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MTcgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMTcgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUxOCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOCAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTE5IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTE5ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MjAgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjAgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUyMSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yMSAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTIyIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTIyICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MjMgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjMgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUyNCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yNCAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTI1IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI1ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MjYgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjYgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUyNyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0yNyAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTI4IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTI4ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MjkgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMjkgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUzMCBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zMCAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKK2RxYWRkMzcxNTMxIGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTMxICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NQorZHFhZGQzNzE1MzIgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzIgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1CitkcWFkZDM3MTUzMyBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zMyAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUKKy0tIG5leHQgZm91ciBmbGFnIFJvdW5kZWQgYmVjYXVzZSB0aGUgMCBleHRlbmRzIHRoZSByZXN1bHQKK2RxYWRkMzcxNTM0IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTM0ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitkcWFkZDM3MTUzNSBmbWEgIDEgIDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1ICAwRS0zNSAgLT4gMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZHFhZGQzNzE1MzYgZm1hICAxICAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSAgMEUtMzYgIC0+IDEuMTIzNDU2Nzg5OTg3NjU0MzIxMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2RxYWRkMzcxNTM3IGZtYSAgMSAgMS4xMjM0NTY3ODk5ODc2NTQzMjExMjM0NTY3ODkwMTIzNDUgIDBFLTM3ICAtPiAxLjEyMzQ1Njc4OTk4NzY1NDMyMTEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCisKKy0tIHN1bSBvZiB0d28gb3Bwb3NpdGUtc2lnbiBvcGVyYW5kcyBpcyBleGFjdGx5IDAgYW5kIGZsb29yID0+IC0wCityb3VuZGluZzogICAgaGFsZl91cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZHFhZGQzNzE2MDAgZm1hICAxICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQzNzE2MDEgZm1hICAxICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQzNzE2MDIgZm1hICAxICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZHFhZGQzNzE2MDMgZm1hICAxICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorLS0gZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2RxYWRkMzcxNjExIGZtYSAgMSAgLTExICAgICAgMTEgICAgLT4gIDAKK2RxYWRkMzcxNjEyIGZtYSAgMSAgIDExICAgICAtMTEgICAgLT4gIDAKKy0tIG92ZXJmbG93CitkcWFkZDM3MTYxMyBmbWEgIDlFNjE0NCAxMCAgIDEgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzcxNjE0IGZtYSAtOUU2MTQ0IDEwICAgMSAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgaGFsZl9kb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDM3MTYyMCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTYyMSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTYyMiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTYyMyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQzNzE2MzEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQzNzE2MzIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorLS0gb3ZlcmZsb3cKK2RxYWRkMzcxNjMzIGZtYSAgOUU2MTQ0IDEwICAgMSAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzE2MzQgZm1hIC05RTYxNDQgMTAgICAxICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2RxYWRkMzcxNjQwIGZtYSAgMSAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjQxIGZtYSAgMSAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjQyIGZtYSAgMSAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2RxYWRkMzcxNjQzIGZtYSAgMSAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKKy0tIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitkcWFkZDM3MTY1MSBmbWEgIDEgIC0xMSAgICAgIDExICAgIC0+ICAwCitkcWFkZDM3MTY1MiBmbWEgIDEgICAxMSAgICAgLTExICAgIC0+ICAwCistLSBvdmVyZmxvdworZHFhZGQzNzE2NTMgZm1hICA5RTYxNDQgMTAgICAxICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3MTY1NCBmbWEgLTlFNjE0NCAxMCAgIDEgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIHVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDM3MTY2MCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTY2MSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTY2MiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTY2MyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQzNzE2NzEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQzNzE2NzIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorLS0gb3ZlcmZsb3cKK2RxYWRkMzcxNjczIGZtYSAgOUU2MTQ0IDEwICAgMSAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzE2NzQgZm1hIC05RTYxNDQgMTAgICAxICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBkb3duCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDM3MTY4MCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTY4MSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTY4MiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTY4MyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQzNzE2OTEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQzNzE2OTIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorLS0gb3ZlcmZsb3cKK2RxYWRkMzcxNjkzIGZtYSAgOUU2MTQ0IDEwICAgMSAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzE2OTQgZm1hIC05RTYxNDQgMTAgICAxICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDM3MTcwMCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTcwMSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTcwMiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTcwMyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQzNzE3MTEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQzNzE3MTIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorLS0gb3ZlcmZsb3cKK2RxYWRkMzcxNzEzIGZtYSAgOUU2MTQ0IDEwICAgMSAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzE3MTQgZm1hIC05RTYxNDQgMTAgICAxICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIGFuZCB0aGUgZXh0cmEtc3BlY2lhbCB1Z2x5IGNhc2U7IHVudXN1YWwgbWludXNlcyBtYXJrZWQgYnkgLS0gKgorcm91bmRpbmc6ICAgIGZsb29yCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDM3MTcyMCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTcyMSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitkcWFkZDM3MTcyMiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitkcWFkZDM3MTcyMyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQzNzE3MzEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgLTAgICAgICAgICAgICAgICAgLS0gKgorZHFhZGQzNzE3MzIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgLTAgICAgICAgICAgICAgICAgLS0gKgorLS0gb3ZlcmZsb3cKK2RxYWRkMzcxNzMzIGZtYSAgOUU2MTQ0IDEwICAgMSAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzE3MzQgZm1hIC05RTYxNDQgMTAgICAxICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICAwNXVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitkcWFkZDM3MTc0MCBmbWEgIDEgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTc0MSBmbWEgIDEgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTc0MiBmbWEgIDEgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitkcWFkZDM3MTc0MyBmbWEgIDEgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CistLSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZHFhZGQzNzE3NTEgZm1hICAxICAtMTEgICAgICAxMSAgICAtPiAgMAorZHFhZGQzNzE3NTIgZm1hICAxICAgMTEgICAgIC0xMSAgICAtPiAgMAorLS0gb3ZlcmZsb3cKK2RxYWRkMzcxNzUzIGZtYSAgOUU2MTQ0IDEwICAgMSAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzE3NTQgZm1hIC05RTYxNDQgMTAgICAxICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorZHFhZGQzNzE3NjEgZm1hICAxICAxMzBFLTIgICAgMTIwRS0yICAgIC0+IDIuNTAKK2RxYWRkMzcxNzYyIGZtYSAgMSAgMTMwRS0yICAgIDEyRS0xICAgICAtPiAyLjUwCitkcWFkZDM3MTc2MyBmbWEgIDEgIDEzMEUtMiAgICAxRTAgICAgICAgLT4gMi4zMAorZHFhZGQzNzE3NjQgZm1hICAxICAxRTIgICAgICAgMUU0ICAgICAgIC0+IDEuMDFFKzQKK2RxYWRkMzcxNzY1IGZtYSAgMSAgMTMwRS0yICAgLTEyMEUtMiAtPiAwLjEwCitkcWFkZDM3MTc2NiBmbWEgIDEgIDEzMEUtMiAgIC0xMkUtMSAgLT4gMC4xMAorZHFhZGQzNzE3NjcgZm1hICAxICAxMzBFLTIgICAtMUUwICAgIC0+IDAuMzAKK2RxYWRkMzcxNzY4IGZtYSAgMSAgMUUyICAgICAgLTFFNCAgICAtPiAtOS45RSszCisKKy0tIEdhcHB5IGNvZWZmaWNpZW50czsgY2hlY2sgcmVzaWR1ZSBoYW5kbGluZyBldmVuIHdpdGggZnVsbCBjb2VmZmljaWVudCBnYXAKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworZHFhZGQzNzUwMDEgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU3CitkcWFkZDM3NTAwMiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgMC42ICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTcgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMDMgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDAuMDYgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDA0IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0zICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAwNSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtNCAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMDYgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTUgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDA3IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS02ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAwOCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtNyAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMDkgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTggICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDEwIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS05ICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAxMSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMTIgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTExICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDEzIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xMiAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAxNCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTMgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMTUgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE0ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDE2IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xNSAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAxNyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTYgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMTggZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTE3ICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDE5IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiA2RS0xOCAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTAyMCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgNkUtMTkgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwMjEgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2IDZFLTIwICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gd2lkZW5pbmcgc2Vjb25kIGFyZ3VtZW50IGF0IGdhcAorZHFhZGQzNzUwMzAgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxICAgICAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OQorZHFhZGQzNzUwMzEgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEgICAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xCitkcWFkZDM3NTAzMiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIgICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyCitkcWFkZDM3NTAzMyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMworZHFhZGQzNzUwMzQgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0CitkcWFkZDM3NTAzNSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDUgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1CitkcWFkZDM3NTAzNiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2ICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1NgorZHFhZGQzNzUwMzcgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1NjcgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3CitkcWFkZDM3NTAzOCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2NzggICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc4CitkcWFkZDM3NTAzOSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg5ICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNDAgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NSAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDQxIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA0MiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MSAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNDMgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAxICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDQ0IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDEgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA0NSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMSAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNDYgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMDAxICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDQ3IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4xMjM0NTY3ODUwMDAwMDEgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA0OCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNDkgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkwMTIzNDU2Cityb3VuZGluZzogaGFsZl9ldmVuCitkcWFkZDM3NTA1MCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDIzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNTEgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMzQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDUyIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDA0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA1MyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDA1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNTQgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwNjc3NTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDU1IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDA3NzUwMDAwMDAwICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwNzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA1NiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwMDc1MDAwMDAwMCAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNTcgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDAwNTAwMDAwMDAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDYwIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMjM0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA2MSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNjIgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDYzIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwNTY3NzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDU2NzggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA2NCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNjUgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDEgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDY2IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMC4wMDAwMDAwNzUwMDAwMDAxICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA2NyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMSAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorLS0gZmFyLW91dCByZXNpZHVlcyAoZnVsbCBjb2VmZmljaWVudCBnYXAgaXMgMTYrMTUgZGlnaXRzKQorcm91bmRpbmc6IHVwCitkcWFkZDM3NTA3MCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTggICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxCitkcWFkZDM3NTA3MSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTkgICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNzIgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xMCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDczIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTEgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA3NCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTEyICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNzUgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xMyAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDc2IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTQgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA3NyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwNzggZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xNiAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDc5IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMTcgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA4MCBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTE4ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwODEgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0xOSAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDgyIGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMjAgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA4MyBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTI1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwODQgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zMCAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDg1IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzEgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA4NiBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTMyICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZHFhZGQzNzUwODcgZm1hICAxICAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OCAxRS0zMyAgICAgICAgICAgICAgICAgICAtPiAxMjM5ODc2NTQzMjExMjM0NTY3ODk0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2RxYWRkMzc1MDg4IGZtYSAgMSAgMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzggMUUtMzQgICAgICAgICAgICAgICAgICAgLT4gMTIzOTg3NjU0MzIxMTIzNDU2Nzg5NDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitkcWFkZDM3NTA4OSBmbWEgIDEgIDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4IDFFLTM1ICAgICAgICAgICAgICAgICAgIC0+IDEyMzk4NzY1NDMyMTEyMzQ1Njc4OTQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorCistLSBEZXN0cnVjdGl2ZSBzdWJ0cmFjdCAoZnJvbSByZW1haW5kZXIgdGVzdHMpCisKKy0tICsrKyBzb21lIG9mIHRoZXNlIHdpbGwgYmUgb2ZmLWJ5LW9uZSByZW1haW5kZXIgdnMgcmVtYWluZGVyTmVhcgorCitkcWZtYTQwMDAgIGZtYSAgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzMgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgLTAuMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMzCitkcWZtYTQwMDEgIGZtYSAgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMjIgICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgLTAuMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMjIKK2RxZm1hNDAwMiAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTExMSAgICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAtMC40NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMTExCitkcWZtYTQwMDMgIGZtYSAgIC0zMDg2NDE5NzI1MzA4NjQxOTcyNTMwODY0MTk3MjUzMTQgICA0LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjU1ICAtPiAgLTEuMzA4NjQxOTcyNTMwODY0MTk3MjUzMDg2NDE5NzI1MzE0CitkcWZtYTQwMDQgIGZtYSAgIC0zMDg2NDE5NzI1MzA4NjQxOTcyNTMwODY0MTk3MjUzMDggICA0LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgMS42OTEzNTgwMjc0NjkxMzU4MDI3NDY5MTM1ODAyNzQ2OTIKK2RxZm1hNDAwNSAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI1MiAgICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAtMS4zMDg2NDIxOTc1MzA4NjQyMTk3NTMwODY0MjE5NzQ4CitkcWZtYTQwMDYgIGZtYSAgIC0yNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcgICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgMS40NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NworZHFmbWE0MDA3ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3ICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIC0wLjc1MzA4NjQyMTk3NTMwODY0MjE5NzUzMDg2NDIxOTc1MworZHFmbWE0MDA4ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3ICAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIC0xLjI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NworZHFmbWE0MDA5ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2ICAgIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIDEuNTMwODY0MjE5NzUzMDg2NDIxOTc1MzA4NjQyMTk3NTQKK2RxZm1hNDAxMCAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0MiAgICAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAtMC42OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQyCitkcWZtYTQwMTEgIGZtYSAgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzIgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgMC43NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjgKK2RxZm1hNDAxMiAgZm1hICAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIyMSAgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAwLjY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4Nzc5CitkcWZtYTQwMTMgIGZtYSAgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDExMTAgICAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAtPiAgMC41NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4ODkwCitkcWZtYTQwMTQgIGZtYSAgIC0zMDg2NDE5NzI1MzA4NjQxOTcyNTMwODY0MTk3MjUzMTMgICA0LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjU1ICAtPiAgMi42OTEzNTgwMjc0NjkxMzU4MDI3NDY5MTM1ODAyNzQ2ODcKK2RxZm1hNDAxNSAgZm1hICAgLTMwODY0MTk3MjUzMDg2NDE5NzI1MzA4NjQxOTcyNTMwOCAgIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICAxLjY5MTM1ODAyNzQ2OTEzNTgwMjc0NjkxMzU4MDI3NDY5MgorZHFmbWE0MDE2ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjUxICAgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIDMuNjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI1MQorZHFmbWE0MDE3ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3ICAgIDQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIDEuNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDcKK2RxZm1hNDAxOCAgZm1hICAgLTI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NiAgIDQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIC0+ICA0LjI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NgorZHFmbWE0MDE5ICBmbWEgICAtMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQxICAgICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgLT4gIDQuMzA4NjQyMTk3NTMwODY0MjE5NzUzMDg2NDIxOTc1OQorCistLSBOdWxsIHRlc3RzCitkcWFkZDM5OTkwIGZtYSAgMSAgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWFkZDM5OTkxIGZtYSAgMSAgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUludmVydC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUludmVydC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMmNmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxSW52ZXJ0LmRlY1Rlc3QKQEAgLTAsMCArMSwyNDUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFJbnZlcnQuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBJTlZFUlQgZm9yIGRlY1F1YWRzICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQorZHFpbnYwMDEgaW52ZXJ0ICAgICAgICAgICAgIDAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFpbnYwMDIgaW52ZXJ0ICAgICAgICAgICAgIDEgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMAorZHFpbnYwMDMgaW52ZXJ0ICAgICAgICAgICAgMTAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMQorZHFpbnYwMDQgaW52ZXJ0ICAgICAxMTExMTExMTEgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMAorZHFpbnYwMDUgaW52ZXJ0ICAgICAwMDAwMDAwMDAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorLS0gYW5kIGF0IG1zZCBhbmQgbXNkLTEKK2RxaW52MDA3IGludmVydCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFpbnYwMDggaW52ZXJ0IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcWludjAwOSBpbnZlcnQgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2RxaW52MDEwIGludmVydCAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFpbnYwMTEgaW52ZXJ0IDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgLT4gICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcWludjAxMiBpbnZlcnQgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAtPiAgICAgICAgICAgICAgICAgIDAKK2RxaW52MDEzIGludmVydCAwMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIC0+ICAgMTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFpbnYwMTQgaW52ZXJ0IDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgLT4gICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKKy0tIFZhcmlvdXMgbGVuZ3RocworZHFpbnY2MDAgaW52ZXJ0IDAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgLT4gICAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwCitkcWludjYwMSBpbnZlcnQgMDAxMTExMTExMTExMTExMTExMDEwMTExMTExMTExMTExMSAtPiAgIDExMDAwMDAwMDAwMDAwMDAwMDEwMTAwMDAwMDAwMDAwMDAKK2RxaW52NjAyIGludmVydCAwMTAxMTExMTExMTExMTExMTAxMTEwMTExMTExMTExMTExIC0+ICAgMTAxMDAwMDAwMDAwMDAwMDAxMDAwMTAwMDAwMDAwMDAwMAorZHFpbnY2MDMgaW52ZXJ0IDAxMTAxMTExMTExMTExMTEwMTExMTEwMTExMTExMTExMTEgLT4gICAxMDAxMDAwMDAwMDAwMDAwMTAwMDAwMTAwMDAwMDAwMDAwCitkcWludjYwNCBpbnZlcnQgMDExMTAxMTExMTExMTExMDExMTExMTEwMTExMTExMTExMSAtPiAgIDEwMDAxMDAwMDAwMDAwMDEwMDAwMDAwMTAwMDAwMDAwMDAKK2RxaW52NjA1IGludmVydCAwMTExMTAxMTExMTExMTAxMTExMTExMTEwMTExMTExMTExIC0+ICAgMTAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMTAwMDAwMDAwMAorZHFpbnY2MDYgaW52ZXJ0IDAxMTExMTAxMTExMTEwMTExMTExMTExMTEwMTExMTExMTEgLT4gICAxMDAwMDAxMDAwMDAwMTAwMDAwMDAwMDAwMTAwMDAwMDAwCitkcWludjYwNyBpbnZlcnQgMDExMTExMTAxMTExMDExMTExMTExMTExMTEwMTExMTExMSAtPiAgIDEwMDAwMDAxMDAwMDEwMDAwMDAwMDAwMDAwMTAwMDAwMDAKK2RxaW52NjA4IGludmVydCAwMTExMTExMTAxMTAxMTExMTExMTExMTExMTEwMTExMTExIC0+ICAgMTAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMAorZHFpbnY2MDkgaW52ZXJ0IDAxMTExMTExMTAwMTExMTExMTExMTExMTExMTEwMTExMTEgLT4gICAxMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwCitkcWludjYxMCBpbnZlcnQgMDExMTExMTExMDAxMTExMTExMTExMTExMTExMTEwMTExMSAtPiAgIDEwMDAwMDAwMDExMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAKK2RxaW52NjExIGludmVydCAwMTExMTExMTAxMTAxMTExMTExMTExMTExMTExMTEwMTExIC0+ICAgMTAwMDAwMDAxMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwMAorZHFpbnY2MTIgaW52ZXJ0IDAxMTExMTEwMTExMTAxMTExMTExMTExMTExMTExMTEwMTEgLT4gICAxMDAwMDAwMTAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAwCitkcWludjYxMyBpbnZlcnQgMDExMTExMDExMTExMTAxMTExMTExMTExMTExMTExMTEwMSAtPiAgIDEwMDAwMDEwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMTAKK2RxaW52NjE0IGludmVydCAwMTExMTAxMTExMTExMTAxMTExMTExMTExMTExMTExMTEwIC0+ICAgMTAwMDAxMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFpbnY2MTUgaW52ZXJ0IDAxMTEwMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEgLT4gICAxMDAwMTAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDAwCitkcWludjYxNiBpbnZlcnQgMDExMDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMCAtPiAgIDEwMDEwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMDEKK2RxaW52NjE3IGludmVydCAwMTAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTAxIC0+ICAgMTAxMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAxMAorZHFpbnY2MTggaW52ZXJ0IDAwMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEwMTEgLT4gICAxMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMTAwCitkcWludjYxOSBpbnZlcnQgMDEwMTExMTExMTExMTExMTExMTAxMTExMTExMTExMDExMSAtPiAgIDEwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDEwMDAKK2RxaW52NjIwIGludmVydCAwMTEwMTExMTExMTExMTExMTExMTAxMTExMTExMTAxMTExIC0+ICAgMTAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAxMDAwMAorZHFpbnY2MjEgaW52ZXJ0IDAxMTEwMTExMTExMTExMTExMTExMTAxMTExMTEwMTExMTEgLT4gICAxMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMTAwMDAwCitkcWludjYyMiBpbnZlcnQgMDExMTEwMTExMTExMTExMTExMTExMTAxMTExMDExMTExMSAtPiAgIDEwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAwMDEwMDAwMDAKK2RxaW52NjIzIGludmVydCAwMTExMTEwMTExMTExMTExMTExMTExMTAxMTAxMTExMTExIC0+ICAgMTAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMAorZHFpbnY2MjQgaW52ZXJ0IDAxMTExMTEwMTExMTExMTExMTExMTExMTAwMTExMTExMTEgLT4gICAxMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwCitkcWludjYyNSBpbnZlcnQgMDExMTExMTEwMTExMTExMTExMTExMTExMDAxMTExMTExMSAtPiAgIDEwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDExMDAwMDAwMDAKK2RxaW52NjI2IGludmVydCAwMTExMTExMTEwMTExMTExMTExMTExMTAxMTAxMTExMTExIC0+ICAgMTAwMDAwMDAwMTAwMDAwMDAwMDAwMDAxMDAxMDAwMDAwMAorZHFpbnY2MjcgaW52ZXJ0IDAxMTExMTExMTEwMTExMTExMTExMTEwMTExMTAxMTExMTEgLT4gICAxMDAwMDAwMDAwMTAwMDAwMDAwMDAwMTAwMDAxMDAwMDAwCitkcWludjYyOCBpbnZlcnQgMDExMTExMTExMTEwMTExMTExMTExMDExMTExMTAxMTExMSAtPiAgIDEwMDAwMDAwMDAwMTAwMDAwMDAwMDEwMDAwMDAxMDAwMDAKK2RxaW52NjI5IGludmVydCAwMTExMTExMTExMTEwMTExMTExMTAxMTExMTExMTAxMTExIC0+ICAgMTAwMDAwMDAwMDAwMTAwMDAwMDAxMDAwMDAwMDAxMDAwMAorZHFpbnY2MzAgaW52ZXJ0IDAxMTExMTExMTExMTEwMTExMTEwMTExMTExMTExMTAxMTEgLT4gICAxMDAwMDAwMDAwMDAwMTAwMDAwMTAwMDAwMDAwMDAxMDAwCitkcWludjYzMSBpbnZlcnQgMDExMTExMTExMTExMTEwMTExMDExMTExMTExMTExMTAxMSAtPiAgIDEwMDAwMDAwMDAwMDAwMTAwMDEwMDAwMDAwMDAwMDAxMDAKK2RxaW52NjMyIGludmVydCAwMTExMTExMTExMTExMTEwMTAxMTExMTExMTExMTExMTAxIC0+ICAgMTAwMDAwMDAwMDAwMDAwMTAxMDAwMDAwMDAwMDAwMDAxMAorZHFpbnY2MzMgaW52ZXJ0IDAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTAgLT4gICAxMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAxCisKK2RxaW52MDIxIGludmVydCAxMTExMTExMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAKK2RxaW52MDIyIGludmVydCAxMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAKK2RxaW52MDIzIGludmVydCAgMTExMTExMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAKK2RxaW52MDI1IGludmVydCAgIDExMTExMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAKK2RxaW52MDI2IGludmVydCAgICAxMTExMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAKK2RxaW52MDI3IGludmVydCAgICAgMTExMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAKK2RxaW52MDI4IGludmVydCAgICAgIDExMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAKK2RxaW52MDI5IGludmVydCAgICAgICAxMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMDAKK2RxaW52MDMxIGludmVydCAgICAgICAgMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDAKK2RxaW52MDMyIGludmVydCAgICAgICAgIDEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAKK2RxaW52MDMzIGludmVydCAxMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAKK2RxaW52MDM0IGludmVydCAxMTExMTExMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAKK2RxaW52MDM1IGludmVydCAxMTExMTExMTExICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMDAKK2RxaW52MDM2IGludmVydCAxMTExMTExMTEgICAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAKKworZHFpbnYwNDAgaW52ZXJ0IDAxMTExMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDAKK2RxaW52MDQxIGludmVydCAxMDExMTExMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDEwMDAwMDAwCitkcWludjA0MiBpbnZlcnQgMTEwMTExMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMTAwMDAwMAorZHFpbnYwNDMgaW52ZXJ0IDExMTAxMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAxMDAwMDAKK2RxaW52MDQ0IGludmVydCAxMTExMDExMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDEwMDAwCitkcWludjA0NSBpbnZlcnQgMTExMTEwMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMTAwMAorZHFpbnYwNDYgaW52ZXJ0IDExMTExMTAxMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMDAxMDAKK2RxaW52MDQ3IGludmVydCAxMTExMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDEwCitkcWludjA0OCBpbnZlcnQgMTExMTExMTEwICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMDAwMQorZHFpbnYwNDkgaW52ZXJ0IDAxMTExMTAxMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAxMDAKK2RxaW52MDUwIGludmVydCAxMDExMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDEwMDAwMDEwCitkcWludjA1MSBpbnZlcnQgMTEwMTExMTEwICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMTAwMDAwMQorZHFpbnYwNTIgaW52ZXJ0IDExMTAxMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAxMDAwMTAKK2RxaW52MDUzIGludmVydCAxMTExMDEwMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDEwMTAwCitkcWludjA1NCBpbnZlcnQgMTExMTEwMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMTAwMAorZHFpbnYwNTUgaW52ZXJ0IDExMTEwMTAxMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMDAwMTAxMDAKK2RxaW52MDU2IGludmVydCAxMTEwMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMDAwMTAwMDEwCitkcWludjA1NyBpbnZlcnQgMTEwMTExMTEwICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAwMTAwMDAwMQorZHFpbnYwNTggaW52ZXJ0IDEwMTExMTEwMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTEwMTAwMDAwMTAKK2RxaW52MDU5IGludmVydCAwMTExMTEwMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTAwMDAwMTAwCisKK2RxaW52MDgwIGludmVydCAxMDAwMDAwMDExMTExMTExICAgLT4gMTExMTExMTExMTExMTExMTExMDExMTExMTEwMDAwMDAwMAorZHFpbnYwODEgaW52ZXJ0IDAxMDAwMDAxMDExMTExMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMDExMTExMDEwMDAwMDAwCitkcWludjA4MiBpbnZlcnQgMDAxMDAwMDExMDExMTExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMDExMTEwMDEwMDAwMDAKK2RxaW52MDgzIGludmVydCAwMDAxMDAwMTExMDExMTExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMDExMTAwMDEwMDAwMAorZHFpbnYwODQgaW52ZXJ0IDAwMDAxMDAxMTExMDExMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMDExMDAwMDEwMDAwCitkcWludjA4NSBpbnZlcnQgMDAwMDAxMDExMTExMDExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMDEwMDAwMDEwMDAKK2RxaW52MDg2IGludmVydCAwMDAwMDAxMTExMTExMDExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMDAwMDAwMDEwMAorZHFpbnYwODcgaW52ZXJ0IDAwMDAwMTAxMTExMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTAxMDAwMDAwMDEwCitkcWludjA4OCBpbnZlcnQgMDAwMDEwMDExMTExMTExMCAgIC0+IDExMTExMTExMTExMTExMTExMTExMTEwMTEwMDAwMDAwMDEKK2RxaW52MDg5IGludmVydCAwMDAxMDAwMDExMTExMDExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMDExMTEwMDAwMDEwMAorZHFpbnYwOTAgaW52ZXJ0IDAwMTAwMDAxMDExMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTExMTAxMTExMDEwMDAwMDEwCitkcWludjA5MSBpbnZlcnQgMDEwMDAwMDExMDExMTExMCAgIC0+IDExMTExMTExMTExMTExMTExMTEwMTExMTEwMDEwMDAwMDEKK2RxaW52MDkyIGludmVydCAxMDAwMDAwMTExMDExMTAxICAgLT4gMTExMTExMTExMTExMTExMTExMDExMTExMTAwMDEwMDAxMAorZHFpbnYwOTMgaW52ZXJ0IDAxMDAwMDAxMTExMDEwMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMDExMTExMDAwMDEwMTAwCitkcWludjA5NCBpbnZlcnQgMDAxMDAwMDExMTExMDExMSAgIC0+IDExMTExMTExMTExMTExMTExMTExMDExMTEwMDAwMDEwMDAKK2RxaW52MDk1IGludmVydCAwMDAxMDAwMTExMTAxMDExICAgLT4gMTExMTExMTExMTExMTExMTExMTExMDExMTAwMDAxMDEwMAorZHFpbnYwOTYgaW52ZXJ0IDAwMDAxMDAxMTEwMTExMDEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMDExMDAwMTAwMDEwCitkcWludjA5NyBpbnZlcnQgMDAwMDAxMDExMDExMTExMCAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMDEwMDEwMDAwMDEKK2RxaW52MDk4IGludmVydCAwMDAwMDAxMTAxMTExMTAxICAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMDAxMDAwMDAxMAorZHFpbnYwOTkgaW52ZXJ0IDAwMDAwMTAwMTExMTEwMTEgICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTAxMTAwMDAwMTAwCisKKy0tIGFuZCBtb3JlIHRob3JvdWdoIE1TRC9MU0QgdGVzdHMgWzggYW5kIDkgbWdodCBiZSBlbmNvZGVkIGRpZmZlcmVudGx5Li4uXQorZHFpbnYxNTEgaW52ZXJ0IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKK2RxaW52MTUyIGludmVydCAxMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAgICAgICAgICAxMTExMTExMTExMTExMTExCitkcWludjE1MyBpbnZlcnQgMTAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExMSAtPiAgIDExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwMAorZHFpbnYxNTQgaW52ZXJ0IDExMTExMTExMTExMTExMTExMTEwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgICAgICAgICAgICAxMTExMTExMTExMTExMTEKK2RxaW52MTU1IGludmVydCAwMTAwMDAwMDAwMDAwMDAwMDAwMTExMTExMTExMTExMTExIC0+ICAxMDExMTExMTExMTExMTExMTExMDAwMDAwMDAwMDAwMDAwCitkcWludjE1NiBpbnZlcnQgMTAxMTExMTExMTExMTExMTExMDEwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMTAxMTExMTExMTExMTExMQorZHFpbnYxNTcgaW52ZXJ0IDExMDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAKK2RxaW52MTU4IGludmVydCAxMTEwMTExMTExMTExMTExMTEwMDExMTExMTExMTExMTExIC0+ICAgICAxMDAwMDAwMDAwMDAwMDAxMTAwMDAwMDAwMDAwMDAwCisKKy0tIG5vbi0wLzEgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCwgbm9yIHNob3VsZCBzaWducworZHFpbnYyMjAgaW52ZXJ0IDExMTExMTExMiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjIxIGludmVydCAzMzMzMzMzMzMgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIyMiBpbnZlcnQgNTU1NTU1NTU1ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMjMgaW52ZXJ0IDc3Nzc3Nzc3NyAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjI0IGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIyNSBpbnZlcnQgMjIyMjIyMjIyICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMjYgaW52ZXJ0IDQ0NDQ0NDQ0NCAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjI3IGludmVydCA2NjY2NjY2NjYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIyOCBpbnZlcnQgODg4ODg4ODg4ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMjkgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjMwIGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjIzMSBpbnZlcnQgOTk5OTk5OTk5ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyMzIgaW52ZXJ0IDk5OTk5OTk5OSAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2RxaW52MjQwIGludmVydCAgNTY3NDY4Njg5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI0MSBpbnZlcnQgIDU2NzM2NzY4OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNDIgaW52ZXJ0IC02MzE5MTc3NzIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjQzIGludmVydCAtNzU2MjUzMjU3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI0NCBpbnZlcnQgIDgzNTU5MDE0OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QKK2RxaW52MjUwIGludmVydCAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI1MSBpbnZlcnQgIDMwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNTIgaW52ZXJ0ICA0MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjUzIGludmVydCAgNTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI1NCBpbnZlcnQgIDYwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNTUgaW52ZXJ0ICA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjU2IGludmVydCAgODAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI1NyBpbnZlcnQgIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZHFpbnYyNzAgaW52ZXJ0ICAwMjAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjcxIGludmVydCAgMDMwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI3MiBpbnZlcnQgIDA0MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNzMgaW52ZXJ0ICAwNTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjc0IGludmVydCAgMTYwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI3NSBpbnZlcnQgIDE3MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyNzYgaW52ZXJ0ICAxODAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjc3IGludmVydCAgMTkwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAorZHFpbnYyODAgaW52ZXJ0ICAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjgxIGludmVydCAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI4MiBpbnZlcnQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMDQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyODMgaW52ZXJ0ICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDAwMDAwMDA1IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjg0IGludmVydCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwNiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI4NSBpbnZlcnQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDcgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyODYgaW52ZXJ0ICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjg3IGludmVydCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorZHFpbnYyODggaW52ZXJ0ICAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDIwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjg5IGludmVydCAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDAzMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI5MCBpbnZlcnQgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwNDAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyOTEgaW52ZXJ0ICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDUwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MjkyIGludmVydCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTA2MDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI5MyBpbnZlcnQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxNzAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYyOTQgaW52ZXJ0ICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDgwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52Mjk1IGludmVydCAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA5MTAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworZHFpbnYyOTYgaW52ZXJ0IC0xMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjI5OSBpbnZlcnQgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgIC0+ICAxMTExMTEwMDAxMTEwMDAxMTEwMDAxMTExMTAxMTExMTEKKworLS0gTm1heCwgTm1pbiwgTnRpbnktbGlrZQorZHFpbnYzNDEgaW52ZXJ0ICA5Ljk5OTk5OTk5RSsyOTk4ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzQyIGludmVydCAgMUUtMjk5OCAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjM0MyBpbnZlcnQgIDEuMDAwMDAwMDBFLTI5OTggIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNDQgaW52ZXJ0ICAxRS0yMDc4ICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzQ1IGludmVydCAgLTFFLTIwNzggICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjM0NiBpbnZlcnQgIC0xLjAwMDAwMDAwRS0yOTk4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNDcgaW52ZXJ0ICAtMUUtMjk5OCAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzQ4IGludmVydCAgLTkuOTk5OTk5OTlFKzI5OTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEEgZmV3IG90aGVyIG5vbi1pbnRlZ2VycworZHFpbnYzNjEgaW52ZXJ0ICAxLjAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzYyIGludmVydCAgMUUrMSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjM2MyBpbnZlcnQgIDAuMCAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnYzNjQgaW52ZXJ0ICAwRSsxICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxaW52MzY1IGludmVydCAgOS45ICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcWludjM2NiBpbnZlcnQgIDlFKzEgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBbGwgU3BlY2lhbHMgYXJlIGluIGVycm9yCitkcWludjc4OCBpbnZlcnQgLUluZiAgICAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY3OTQgaW52ZXJ0ICBJbmYgICAgIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxaW52ODIxIGludmVydCAgTmFOICAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWludjg0MSBpbnZlcnQgIHNOYU4gICAgLT4gTmFOICBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworZHFpbnY4NjEgaW52ZXJ0ICBOYU4xICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NjIgaW52ZXJ0ICtOYU4yICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NjMgaW52ZXJ0ICBOYU4zICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NjQgaW52ZXJ0ICBOYU40ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NjUgaW52ZXJ0ICBOYU41ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NzEgaW52ZXJ0ICBzTmFOMTEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NzIgaW52ZXJ0ICBzTmFOMTIgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NzMgaW52ZXJ0ICBzTmFOMTMgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NzQgaW52ZXJ0ICBzTmFOMTQgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NzUgaW52ZXJ0ICBzTmFOMTUgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4NzYgaW52ZXJ0ICBOYU4xNiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4ODEgaW52ZXJ0ICtOYU4yNSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4ODIgaW52ZXJ0IC1OYU4yNiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnY4ODMgaW52ZXJ0IC1zTmFOMjcgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcUxvZ0IuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFMb2dCLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5ZjNkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFMb2dCLmRlY1Rlc3QKQEAgLTAsMCArMSwxNjAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFMb2dCLmRlY1Rlc3QgLS0gaW50ZWdyYWwgNzU0ciBhZGp1c3RlZCBleHBvbmVudCwgZm9yIGRlY1F1YWRzICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBiYXNpY3MKK2RxbG9nYjAwMCBsb2diICAwICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjAwMSBsb2diICAxRS02MTc2ICAgICAgICAgICAtPiAtNjE3NgorZHFsb2diMDAyIGxvZ2IgIDFFLTYxNDMgICAgICAgICAgIC0+IC02MTQzCitkcWxvZ2IwMDMgbG9nYiAgMC4wMDEgICAgICAgICAgICAgLT4gLTMKK2RxbG9nYjAwNCBsb2diICAwLjAzICAgICAgICAgICAgICAtPiAtMgorZHFsb2diMDA1IGxvZ2IgIDEgICAgICAgICAgICAgICAgIC0+ICAwCitkcWxvZ2IwMDYgbG9nYiAgMiAgICAgICAgICAgICAgICAgLT4gIDAKK2RxbG9nYjAwNyBsb2diICAyLjUgICAgICAgICAgICAgICAtPiAgMAorZHFsb2diMDA4IGxvZ2IgIDIuNTAgICAgICAgICAgICAgIC0+ICAwCitkcWxvZ2IwMDkgbG9nYiAgMi41MDAgICAgICAgICAgICAgLT4gIDAKK2RxbG9nYjAxMCBsb2diICAxMCAgICAgICAgICAgICAgICAtPiAgMQorZHFsb2diMDExIGxvZ2IgIDcwICAgICAgICAgICAgICAgIC0+ICAxCitkcWxvZ2IwMTIgbG9nYiAgMTAwICAgICAgICAgICAgICAgLT4gIDIKK2RxbG9nYjAxMyBsb2diICAyNTAgICAgICAgICAgICAgICAtPiAgMgorZHFsb2diMDE0IGxvZ2IgIDlFKzYxNDQgICAgICAgICAgIC0+ICA2MTQ0CitkcWxvZ2IwMTUgbG9nYiArSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CisKKy0tIG5lZ2F0aXZlcyBhcHBlYXIgdG8gYmUgdHJlYXRlZCBhcyBwb3NpdGl2ZXMKK2RxbG9nYjAyMSBsb2diIC0wICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjAyMiBsb2diIC0xRS02MTc2ICAgICAgICAgICAtPiAtNjE3NgorZHFsb2diMDIzIGxvZ2IgLTlFLTYxNDMgICAgICAgICAgIC0+IC02MTQzCitkcWxvZ2IwMjQgbG9nYiAtMC4wMDEgICAgICAgICAgICAgLT4gLTMKK2RxbG9nYjAyNSBsb2diIC0xICAgICAgICAgICAgICAgICAtPiAgMAorZHFsb2diMDI2IGxvZ2IgLTIgICAgICAgICAgICAgICAgIC0+ICAwCitkcWxvZ2IwMjcgbG9nYiAtMTAgICAgICAgICAgICAgICAgLT4gIDEKK2RxbG9nYjAyOCBsb2diIC03MCAgICAgICAgICAgICAgICAtPiAgMQorZHFsb2diMDI5IGxvZ2IgLTEwMCAgICAgICAgICAgICAgIC0+ICAyCitkcWxvZ2IwMzAgbG9nYiAtOUUrNjE0NCAgICAgICAgICAgLT4gIDYxNDQKK2RxbG9nYjAzMSBsb2diIC1JbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gemVyb3MKK2RxbG9nYjExMSBsb2diICAgICAgICAgIDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjExMiBsb2diICAgICAgICAgLTAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjExMyBsb2diICAgICAgIDBFKzQgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjExNCBsb2diICAgICAgLTBFKzQgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjExNSBsb2diICAgICAwLjAwMDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjExNiBsb2diICAgIC0wLjAwMDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjExNyBsb2diICAgICAgMEUtMTQxICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjExOCBsb2diICAgICAtMEUtMTQxICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxbG9nYjEyMSBsb2diICAgMjY4MjY4MjY4ICAgICAgICAtPiA4CitkcWxvZ2IxMjIgbG9nYiAgLTI2ODI2ODI2OCAgICAgICAgLT4gOAorZHFsb2diMTIzIGxvZ2IgICAxMzQxMzQxMzQgICAgICAgIC0+IDgKK2RxbG9nYjEyNCBsb2diICAtMTM0MTM0MTM0ICAgICAgICAtPiA4CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcWxvZ2IxMzEgbG9nYiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtPiAgNjE0NAorZHFsb2diMTMyIGxvZ2IgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgLT4gLTYxNDMKK2RxbG9nYjEzMyBsb2diICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+IC02MTQzCitkcWxvZ2IxMzQgbG9nYiAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAtPiAtNjE3NgorCitkcWxvZ2IxMzUgbG9nYiAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAtNjE3NgorZHFsb2diMTM2IGxvZ2IgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gLTYxNDMKK2RxbG9nYjEzNyBsb2diICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgIC0+IC02MTQzCitkcWxvZ2IxNjE0IGxvZ2IgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gIDYxNDQKKworLS0gb25lcworZHFsb2diMDA2MSBsb2diICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2RxbG9nYjAwNjIgbG9nYiAgMS4wICAgICAgICAgICAgICAgLT4gICAwCitkcWxvZ2IwMDYzIGxvZ2IgIDEuMDAwMDAwMDAwMDAwMDAwIC0+ICAgMAorCistLSBub3RhYmxlIGNhc2VzIC0tIGV4YWN0IHBvd2VycyBvZiAxMAorZHFsb2diMTEwMCBsb2diIDEgICAgICAgICAgICAgLT4gMAorZHFsb2diMTEwMSBsb2diIDEwICAgICAgICAgICAgLT4gMQorZHFsb2diMTEwMiBsb2diIDEwMCAgICAgICAgICAgLT4gMgorZHFsb2diMTEwMyBsb2diIDEwMDAgICAgICAgICAgLT4gMworZHFsb2diMTEwNCBsb2diIDEwMDAwICAgICAgICAgLT4gNAorZHFsb2diMTEwNSBsb2diIDEwMDAwMCAgICAgICAgLT4gNQorZHFsb2diMTEwNiBsb2diIDEwMDAwMDAgICAgICAgLT4gNgorZHFsb2diMTEwNyBsb2diIDEwMDAwMDAwICAgICAgLT4gNworZHFsb2diMTEwOCBsb2diIDEwMDAwMDAwMCAgICAgLT4gOAorZHFsb2diMTEwOSBsb2diIDEwMDAwMDAwMDAgICAgLT4gOQorZHFsb2diMTExMCBsb2diIDEwMDAwMDAwMDAwICAgLT4gMTAKK2RxbG9nYjExMTEgbG9nYiAxMDAwMDAwMDAwMDAgIC0+IDExCitkcWxvZ2IxMTEyIGxvZ2IgMTAwMDAwMDAwMDAwMCAtPiAxMgorZHFsb2diMTExMyBsb2diIDAuMDAwMDAwMDAwMDEgLT4gLTExCitkcWxvZ2IxMTE0IGxvZ2IgMC4wMDAwMDAwMDAxIC0+IC0xMAorZHFsb2diMTExNSBsb2diIDAuMDAwMDAwMDAxIC0+IC05CitkcWxvZ2IxMTE2IGxvZ2IgMC4wMDAwMDAwMSAtPiAtOAorZHFsb2diMTExNyBsb2diIDAuMDAwMDAwMSAtPiAtNworZHFsb2diMTExOCBsb2diIDAuMDAwMDAxIC0+IC02CitkcWxvZ2IxMTE5IGxvZ2IgMC4wMDAwMSAtPiAtNQorZHFsb2diMTEyMCBsb2diIDAuMDAwMSAtPiAtNAorZHFsb2diMTEyMSBsb2diIDAuMDAxIC0+IC0zCitkcWxvZ2IxMTIyIGxvZ2IgMC4wMSAtPiAtMgorZHFsb2diMTEyMyBsb2diIDAuMSAtPiAtMQorZHFsb2diMTEyNCBsb2diIDFFLTk5ICAtPiAtOTkKK2RxbG9nYjExMjUgbG9nYiAxRS0xMDAgLT4gLTEwMAorZHFsb2diMTEyNyBsb2diIDFFLTI5OSAtPiAtMjk5CitkcWxvZ2IxMTI2IGxvZ2IgMUUtNjE0MyAtPiAtNjE0MworCistLSBzdWdnZXN0aW9ucyBmcm9tIElsYW4gTmVoYW1hCitkcWxvZ2IxNDAwIGxvZ2IgMTBFLTMgICAgLT4gLTIKK2RxbG9nYjE0MDEgbG9nYiAxMEUtMiAgICAtPiAtMQorZHFsb2diMTQwMiBsb2diIDEwMEUtMiAgIC0+ICAwCitkcWxvZ2IxNDAzIGxvZ2IgMTAwMEUtMiAgLT4gIDEKK2RxbG9nYjE0MDQgbG9nYiAxMDAwMEUtMiAtPiAgMgorZHFsb2diMTQwNSBsb2diIDEwRS0xICAgIC0+ICAwCitkcWxvZ2IxNDA2IGxvZ2IgMTAwRS0xICAgLT4gIDEKK2RxbG9nYjE0MDcgbG9nYiAxMDAwRS0xICAtPiAgMgorZHFsb2diMTQwOCBsb2diIDEwMDAwRS0xIC0+ICAzCitkcWxvZ2IxNDA5IGxvZ2IgMTBFMCAgICAgLT4gIDEKK2RxbG9nYjE0MTAgbG9nYiAxMDBFMCAgICAtPiAgMgorZHFsb2diMTQxMSBsb2diIDEwMDBFMCAgIC0+ICAzCitkcWxvZ2IxNDEyIGxvZ2IgMTAwMDBFMCAgLT4gIDQKK2RxbG9nYjE0MTMgbG9nYiAxMEUxICAgICAtPiAgMgorZHFsb2diMTQxNCBsb2diIDEwMEUxICAgIC0+ICAzCitkcWxvZ2IxNDE1IGxvZ2IgMTAwMEUxICAgLT4gIDQKK2RxbG9nYjE0MTYgbG9nYiAxMDAwMEUxICAtPiAgNQorZHFsb2diMTQxNyBsb2diIDEwRTIgICAgIC0+ICAzCitkcWxvZ2IxNDE4IGxvZ2IgMTAwRTIgICAgLT4gIDQKK2RxbG9nYjE0MTkgbG9nYiAxMDAwRTIgICAtPiAgNQorZHFsb2diMTQyMCBsb2diIDEwMDAwRTIgIC0+ICA2CisKKy0tIHNwZWNpYWwgdmFsdWVzCitkcWxvZ2I4MjAgIGxvZ2IgICBJbmZpbml0eSAtPiAgIEluZmluaXR5CitkcWxvZ2I4MjEgIGxvZ2IgICAwICAgICAgICAtPiAgLUluZmluaXR5IERpdmlzaW9uX2J5X3plcm8KK2RxbG9nYjgyMiAgbG9nYiAgIE5hTiAgICAgIC0+ICAgTmFOCitkcWxvZ2I4MjMgIGxvZ2IgICBzTmFOICAgICAtPiAgIE5hTiAgICAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxbG9nYjgyNCAgbG9nYiAgIHNOYU4xMjMgIC0+ICAgTmFOMTIzICBJbnZhbGlkX29wZXJhdGlvbgorZHFsb2diODI1ICBsb2diICAgLXNOYU4zMjEgLT4gIC1OYU4zMjEgIEludmFsaWRfb3BlcmF0aW9uCitkcWxvZ2I4MjYgIGxvZ2IgICBOYU40NTYgICAtPiAgIE5hTjQ1NgorZHFsb2diODI3ICBsb2diICAgLU5hTjY1NCAgLT4gIC1OYU42NTQKK2RxbG9nYjgyOCAgbG9nYiAgIE5hTjEgICAgIC0+ICAgTmFOMQorCistLSBOdWxsIHRlc3QKK2RxbG9nYjkwMCAgbG9nYiAjICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1heC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1heC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MmQ0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWF4LmRlY1Rlc3QKQEAgLTAsMCArMSwzMjIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFNYXguZGVjVGVzdCAtLSBkZWNRdWFkIG1heG51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSB3ZSBhc3N1bWUgdGhhdCBiYXNlIGNvbXBhcmlzb24gaXMgdGVzdGVkIGluIGNvbXBhcmUuZGVjVGVzdCwgc28KKy0tIHRoZXNlIG1haW5seSBjb3ZlciBzcGVjaWFsIGNhc2VzIGFuZCByb3VuZGluZworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFtYXgwMDEgbWF4ICAtMiAgLTIgIC0+IC0yCitkcW1heDAwMiBtYXggIC0yICAtMSAgLT4gLTEKK2RxbWF4MDAzIG1heCAgLTIgICAwICAtPiAgMAorZHFtYXgwMDQgbWF4ICAtMiAgIDEgIC0+ICAxCitkcW1heDAwNSBtYXggIC0yICAgMiAgLT4gIDIKK2RxbWF4MDA2IG1heCAgLTEgIC0yICAtPiAtMQorZHFtYXgwMDcgbWF4ICAtMSAgLTEgIC0+IC0xCitkcW1heDAwOCBtYXggIC0xICAgMCAgLT4gIDAKK2RxbWF4MDA5IG1heCAgLTEgICAxICAtPiAgMQorZHFtYXgwMTAgbWF4ICAtMSAgIDIgIC0+ICAyCitkcW1heDAxMSBtYXggICAwICAtMiAgLT4gIDAKK2RxbWF4MDEyIG1heCAgIDAgIC0xICAtPiAgMAorZHFtYXgwMTMgbWF4ICAgMCAgIDAgIC0+ICAwCitkcW1heDAxNCBtYXggICAwICAgMSAgLT4gIDEKK2RxbWF4MDE1IG1heCAgIDAgICAyICAtPiAgMgorZHFtYXgwMTYgbWF4ICAgMSAgLTIgIC0+ICAxCitkcW1heDAxNyBtYXggICAxICAtMSAgLT4gIDEKK2RxbWF4MDE4IG1heCAgIDEgICAwICAtPiAgMQorZHFtYXgwMTkgbWF4ICAgMSAgIDEgIC0+ICAxCitkcW1heDAyMCBtYXggICAxICAgMiAgLT4gIDIKK2RxbWF4MDIxIG1heCAgIDIgIC0yICAtPiAgMgorZHFtYXgwMjIgbWF4ICAgMiAgLTEgIC0+ICAyCitkcW1heDAyMyBtYXggICAyICAgMCAgLT4gIDIKK2RxbWF4MDI1IG1heCAgIDIgICAxICAtPiAgMgorZHFtYXgwMjYgbWF4ICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCitkcW1heDAzMCBtYXggICAwICAgICAwICAgLT4gIDAKK2RxbWF4MDMxIG1heCAgIDAgICAgLTAgICAtPiAgMAorZHFtYXgwMzIgbWF4ICAgMCAgICAtMC4wIC0+ICAwCitkcW1heDAzMyBtYXggICAwICAgICAwLjAgLT4gIDAKK2RxbWF4MDM0IG1heCAgLTAgICAgIDAgICAtPiAgMCAgICAtLSBub3RlOiAtMCA9IDAsIGJ1dCAwIGNob3NlbgorZHFtYXgwMzUgbWF4ICAtMCAgICAtMCAgIC0+IC0wCitkcW1heDAzNiBtYXggIC0wICAgIC0wLjAgLT4gLTAuMAorZHFtYXgwMzcgbWF4ICAtMCAgICAgMC4wIC0+ICAwLjAKK2RxbWF4MDM4IG1heCAgIDAuMCAgIDAgICAtPiAgMAorZHFtYXgwMzkgbWF4ICAgMC4wICAtMCAgIC0+ICAwLjAKK2RxbWF4MDQwIG1heCAgIDAuMCAgLTAuMCAtPiAgMC4wCitkcW1heDA0MSBtYXggICAwLjAgICAwLjAgLT4gIDAuMAorZHFtYXgwNDIgbWF4ICAtMC4wICAgMCAgIC0+ICAwCitkcW1heDA0MyBtYXggIC0wLjAgIC0wICAgLT4gLTAuMAorZHFtYXgwNDQgbWF4ICAtMC4wICAtMC4wIC0+IC0wLjAKK2RxbWF4MDQ1IG1heCAgLTAuMCAgIDAuMCAtPiAgMC4wCisKK2RxbWF4MDUwIG1heCAgLTBFMSAgIDBFMSAtPiAgMEUrMQorZHFtYXgwNTEgbWF4ICAtMEUyICAgMEUyIC0+ICAwRSsyCitkcW1heDA1MiBtYXggIC0wRTIgICAwRTEgLT4gIDBFKzEKK2RxbWF4MDUzIG1heCAgLTBFMSAgIDBFMiAtPiAgMEUrMgorZHFtYXgwNTQgbWF4ICAgMEUxICAtMEUxIC0+ICAwRSsxCitkcW1heDA1NSBtYXggICAwRTIgIC0wRTIgLT4gIDBFKzIKK2RxbWF4MDU2IG1heCAgIDBFMiAgLTBFMSAtPiAgMEUrMgorZHFtYXgwNTcgbWF4ICAgMEUxICAtMEUyIC0+ICAwRSsxCisKK2RxbWF4MDU4IG1heCAgIDBFMSAgIDBFMSAtPiAgMEUrMQorZHFtYXgwNTkgbWF4ICAgMEUyICAgMEUyIC0+ICAwRSsyCitkcW1heDA2MCBtYXggICAwRTIgICAwRTEgLT4gIDBFKzIKK2RxbWF4MDYxIG1heCAgIDBFMSAgIDBFMiAtPiAgMEUrMgorZHFtYXgwNjIgbWF4ICAtMEUxICAtMEUxIC0+IC0wRSsxCitkcW1heDA2MyBtYXggIC0wRTIgIC0wRTIgLT4gLTBFKzIKK2RxbWF4MDY0IG1heCAgLTBFMiAgLTBFMSAtPiAtMEUrMQorZHFtYXgwNjUgbWF4ICAtMEUxICAtMEUyIC0+IC0wRSsxCisKKy0tIFNwZWNpYWxzCitkcW1heDA5MCBtYXggIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorZHFtYXgwOTEgbWF4ICBJbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RxbWF4MDkyIG1heCAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitkcW1heDA5MyBtYXggIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZHFtYXgwOTQgbWF4ICBJbmYgICAwICAgICAtPiAgSW5maW5pdHkKK2RxbWF4MDk1IG1heCAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitkcW1heDA5NiBtYXggIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZHFtYXgwOTcgbWF4ICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbWF4MDk4IG1heCAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkcW1heDA5OSBtYXggLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtYXgxMDAgbWF4IC0xICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbWF4MTAxIG1heCAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcW1heDEwMiBtYXggIDAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtYXgxMDMgbWF4ICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbWF4MTA0IG1heCAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkcW1heDEwNSBtYXggIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkcW1heDEyMCBtYXggLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtYXgxMjEgbWF4IC1JbmYgIC0xMDAwICAtPiAtMTAwMAorZHFtYXgxMjIgbWF4IC1JbmYgIC0xICAgICAtPiAtMQorZHFtYXgxMjMgbWF4IC1JbmYgIC0wICAgICAtPiAtMAorZHFtYXgxMjQgbWF4IC1JbmYgICAwICAgICAtPiAgMAorZHFtYXgxMjUgbWF4IC1JbmYgICAxICAgICAtPiAgMQorZHFtYXgxMjYgbWF4IC1JbmYgICAxMDAwICAtPiAgMTAwMAorZHFtYXgxMjcgbWF4IC1JbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbWF4MTI4IG1heCAtSW5mICAtSW5mICAgLT4gIC1JbmZpbml0eQorZHFtYXgxMjkgbWF4IC0xMDAwIC1JbmYgICAtPiAgLTEwMDAKK2RxbWF4MTMwIG1heCAtMSAgICAtSW5mICAgLT4gIC0xCitkcW1heDEzMSBtYXggLTAgICAgLUluZiAgIC0+ICAtMAorZHFtYXgxMzIgbWF4ICAwICAgIC1JbmYgICAtPiAgMAorZHFtYXgxMzMgbWF4ICAxICAgIC1JbmYgICAtPiAgMQorZHFtYXgxMzQgbWF4ICAxMDAwIC1JbmYgICAtPiAgMTAwMAorZHFtYXgxMzUgbWF4ICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitkcW1heDE0MSBtYXggIE5hTiAtSW5mICAgIC0+IC1JbmZpbml0eQorZHFtYXgxNDIgbWF4ICBOYU4gLTEwMDAgICAtPiAtMTAwMAorZHFtYXgxNDMgbWF4ICBOYU4gLTEgICAgICAtPiAtMQorZHFtYXgxNDQgbWF4ICBOYU4gLTAgICAgICAtPiAtMAorZHFtYXgxNDUgbWF4ICBOYU4gIDAgICAgICAtPiAgMAorZHFtYXgxNDYgbWF4ICBOYU4gIDEgICAgICAtPiAgMQorZHFtYXgxNDcgbWF4ICBOYU4gIDEwMDAgICAtPiAgMTAwMAorZHFtYXgxNDggbWF4ICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK2RxbWF4MTQ5IG1heCAgTmFOICBOYU4gICAgLT4gIE5hTgorZHFtYXgxNTAgbWF4IC1JbmYgIE5hTiAgICAtPiAtSW5maW5pdHkKK2RxbWF4MTUxIG1heCAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK2RxbWF4MTUyIG1heCAtMSAgICBOYU4gICAgLT4gLTEKK2RxbWF4MTUzIG1heCAtMCAgICBOYU4gICAgLT4gLTAKK2RxbWF4MTU0IG1heCAgMCAgICBOYU4gICAgLT4gIDAKK2RxbWF4MTU1IG1heCAgMSAgICBOYU4gICAgLT4gIDEKK2RxbWF4MTU2IG1heCAgMTAwMCBOYU4gICAgLT4gIDEwMDAKK2RxbWF4MTU3IG1heCAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK2RxbWF4MTYxIG1heCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTYyIG1heCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTYzIG1heCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTY0IG1heCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTY1IG1heCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTY2IG1heCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTY3IG1heCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTY4IG1heCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTY5IG1heCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTcwIG1heCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTcxIG1heCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTcyIG1heCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTczIG1heCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTc0IG1heCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTc1IG1heCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTc2IG1heCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTc3IG1heCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTc4IG1heCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTc5IG1heCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFtYXgxODEgbWF4ICBOYU45ICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1heDE4MiBtYXggIE5hTjggICAgIDkgICAtPiAgOQorZHFtYXgxODMgbWF4IC1OYU43ICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxbWF4MTg0IG1heCAtTmFOMSAgIE5hTjExIC0+IC1OYU4xCitkcW1heDE4NSBtYXggIE5hTjIgICBOYU4xMiAtPiAgTmFOMgorZHFtYXgxODYgbWF4IC1OYU4xMyAtTmFONyAgLT4gLU5hTjEzCitkcW1heDE4NyBtYXggIE5hTjE0IC1OYU41ICAtPiAgTmFOMTQKKworZHFtYXgxODggbWF4IC1JbmYgICAgTmFONCAgLT4gLUluZmluaXR5CitkcW1heDE4OSBtYXggLTkgICAgIC1OYU4zICAtPiAtOQorZHFtYXgxOTAgbWF4ICBJbmYgICAgTmFOMiAgLT4gIEluZmluaXR5CisKK2RxbWF4MTkxIG1heCAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcW1heDE5MiBtYXggIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxOTMgbWF4IC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTk0IG1heCAgc05hTjk2IHNOYU45NCAgLT4gIE5hTjk2IEludmFsaWRfb3BlcmF0aW9uCitkcW1heDE5NSBtYXggIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxOTYgbWF4IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4MTk3IG1heCAgMCAgICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkcW1heDE5OCBtYXggIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFtYXgxOTkgbWF4ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb2xkIHJvdW5kaW5nIGNoZWNrcworZHFtYXgyMjEgbWF4IDEyMzQ1Njc4MDAwIDEgIC0+IDEyMzQ1Njc4MDAwCitkcW1heDIyMiBtYXggMSAxMjM0NTY3ODAwMCAgLT4gMTIzNDU2NzgwMDAKK2RxbWF4MjIzIG1heCAxMjM0NTY3ODAwICAxICAtPiAxMjM0NTY3ODAwCitkcW1heDIyNCBtYXggMSAxMjM0NTY3ODAwICAgLT4gMTIzNDU2NzgwMAorZHFtYXgyMjUgbWF4IDEyMzQ1Njc4OTAgIDEgIC0+IDEyMzQ1Njc4OTAKK2RxbWF4MjI2IG1heCAxIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCitkcW1heDIyNyBtYXggMTIzNDU2Nzg5MSAgMSAgLT4gMTIzNDU2Nzg5MQorZHFtYXgyMjggbWF4IDEgMTIzNDU2Nzg5MSAgIC0+IDEyMzQ1Njc4OTEKK2RxbWF4MjI5IG1heCAxMjM0NTY3ODkwMSAxICAtPiAxMjM0NTY3ODkwMQorZHFtYXgyMzAgbWF4IDEgMTIzNDU2Nzg5MDEgIC0+IDEyMzQ1Njc4OTAxCitkcW1heDIzMSBtYXggMTIzNDU2Nzg5NiAgMSAgLT4gMTIzNDU2Nzg5NgorZHFtYXgyMzIgbWF4IDEgMTIzNDU2Nzg5NiAgIC0+IDEyMzQ1Njc4OTYKK2RxbWF4MjMzIG1heCAtMTIzNDU2Nzg5MSAgMSAtPiAxCitkcW1heDIzNCBtYXggMSAtMTIzNDU2Nzg5MSAgLT4gMQorZHFtYXgyMzUgbWF4IC0xMjM0NTY3ODkwMSAxIC0+IDEKK2RxbWF4MjM2IG1heCAxIC0xMjM0NTY3ODkwMSAtPiAxCitkcW1heDIzNyBtYXggLTEyMzQ1Njc4OTYgIDEgLT4gMQorZHFtYXgyMzggbWF4IDEgLTEyMzQ1Njc4OTYgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworZHFtYXgyODAgbWF4ICczJyAgICcyJyAgLT4gICczJworZHFtYXgyODEgbWF4ICctMTAnICczJyAgLT4gICczJworZHFtYXgyODIgbWF4ICcxLjAnICcxJyAgLT4gICcxJworZHFtYXgyODMgbWF4ICcxJyAnMS4wJyAgLT4gICcxJworZHFtYXgyODQgbWF4ICc3JyAnTmFOJyAgLT4gICc3JworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK2RxbWF4NDAxIG1heCAgSW5mICAgIDEuMSAgICAgLT4gIEluZmluaXR5CitkcW1heDQwMiBtYXggIDEuMSAgICAxICAgICAgIC0+ICAxLjEKK2RxbWF4NDAzIG1heCAgMSAgICAgIDEuMCAgICAgLT4gIDEKK2RxbWF4NDA0IG1heCAgMS4wICAgIDAuMSAgICAgLT4gIDEuMAorZHFtYXg0MDUgbWF4ICAwLjEgICAgMC4xMCAgICAtPiAgMC4xCitkcW1heDQwNiBtYXggIDAuMTAgICAwLjEwMCAgIC0+ICAwLjEwCitkcW1heDQwNyBtYXggIDAuMTAgICAwICAgICAgIC0+ICAwLjEwCitkcW1heDQwOCBtYXggIDAgICAgICAwLjAgICAgIC0+ICAwCitkcW1heDQwOSBtYXggIDAuMCAgIC0wICAgICAgIC0+ICAwLjAKK2RxbWF4NDEwIG1heCAgMC4wICAgLTAuMCAgICAgLT4gIDAuMAorZHFtYXg0MTEgbWF4ICAwLjAwICAtMC4wICAgICAtPiAgMC4wMAorZHFtYXg0MTIgbWF4ICAwLjAgICAtMC4wMCAgICAtPiAgMC4wCitkcW1heDQxMyBtYXggIDAgICAgIC0wLjAgICAgIC0+ICAwCitkcW1heDQxNCBtYXggIDAgICAgIC0wICAgICAgIC0+ICAwCitkcW1heDQxNSBtYXggLTAuMCAgIC0wICAgICAgIC0+IC0wLjAKK2RxbWF4NDE2IG1heCAtMCAgICAgLTAuMTAwICAgLT4gLTAKK2RxbWF4NDE3IG1heCAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAwCitkcW1heDQxOCBtYXggLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEwCitkcW1heDQxOSBtYXggLTAuMSAgIC0xLjAgICAgIC0+IC0wLjEKK2RxbWF4NDIwIG1heCAtMS4wICAgLTEgICAgICAgLT4gLTEuMAorZHFtYXg0MjEgbWF4IC0xICAgICAtMS4xICAgICAtPiAtMQorZHFtYXg0MjMgbWF4IC0xLjEgICAtSW5mICAgICAtPiAtMS4xCistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK2RxbWF4NDMxIG1heCAgMS4xICAgIEluZiAgICAgLT4gIEluZmluaXR5CitkcW1heDQzMiBtYXggIDEgICAgICAxLjEgICAgIC0+ICAxLjEKK2RxbWF4NDMzIG1heCAgMS4wICAgIDEgICAgICAgLT4gIDEKK2RxbWF4NDM0IG1heCAgMC4xICAgIDEuMCAgICAgLT4gIDEuMAorZHFtYXg0MzUgbWF4ICAwLjEwICAgMC4xICAgICAtPiAgMC4xCitkcW1heDQzNiBtYXggIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwCitkcW1heDQzNyBtYXggIDAgICAgICAwLjEwICAgIC0+ICAwLjEwCitkcW1heDQzOCBtYXggIDAuMCAgICAwICAgICAgIC0+ICAwCitkcW1heDQzOSBtYXggLTAgICAgICAwLjAgICAgIC0+ICAwLjAKK2RxbWF4NDQwIG1heCAtMC4wICAgIDAuMCAgICAgLT4gIDAuMAorZHFtYXg0NDEgbWF4IC0wLjAgICAgMC4wMCAgICAtPiAgMC4wMAorZHFtYXg0NDIgbWF4IC0wLjAwICAgMC4wICAgICAtPiAgMC4wCitkcW1heDQ0MyBtYXggLTAuMCAgICAwICAgICAgIC0+ICAwCitkcW1heDQ0NCBtYXggLTAgICAgICAwICAgICAgIC0+ICAwCitkcW1heDQ0NSBtYXggLTAgICAgIC0wLjAgICAgIC0+IC0wLjAKK2RxbWF4NDQ2IG1heCAtMC4xMDAgLTAgICAgICAgLT4gLTAKK2RxbWF4NDQ3IG1heCAtMC4xMCAgLTAuMTAwICAgLT4gLTAuMTAwCitkcW1heDQ0OCBtYXggLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEwCitkcW1heDQ0OSBtYXggLTEuMCAgIC0wLjEgICAgIC0+IC0wLjEKK2RxbWF4NDUwIG1heCAtMSAgICAgLTEuMCAgICAgLT4gLTEuMAorZHFtYXg0NTEgbWF4IC0xLjEgICAtMSAgICAgICAtPiAtMQorZHFtYXg0NTMgbWF4IC1JbmYgICAtMS4xICAgICAtPiAtMS4xCistLSBsYXJnaWVzCitkcW1heDQ2MCBtYXggIDEwMDAgICAxRSszICAgIC0+ICAxRSszCitkcW1heDQ2MSBtYXggIDFFKzMgICAxMDAwICAgIC0+ICAxRSszCitkcW1heDQ2MiBtYXggIDEwMDAgIC0xRSszICAgIC0+ICAxMDAwCitkcW1heDQ2MyBtYXggIDFFKzMgIC0xMDAwICAgIC0+ICAxRSszCitkcW1heDQ2NCBtYXggLTEwMDAgICAxRSszICAgIC0+ICAxRSszCitkcW1heDQ2NSBtYXggLTFFKzMgICAxMDAwICAgIC0+ICAxMDAwCitkcW1heDQ2NiBtYXggLTEwMDAgIC0xRSszICAgIC0+IC0xMDAwCitkcW1heDQ2NyBtYXggLTFFKzMgIC0xMDAwICAgIC0+IC0xMDAwCisKKy0tIG1pc2FsaWdubWVudCB0cmFwcyBmb3IgbGl0dGxlLWVuZGlhbgorZHFtYXg0NzEgbWF4ICAgICAgMS4wICAgICAgIDAuMSAgLT4gMS4wCitkcW1heDQ3MiBtYXggICAgICAwLjEgICAgICAgMS4wICAtPiAxLjAKK2RxbWF4NDczIG1heCAgICAgMTAuMCAgICAgICAwLjEgIC0+IDEwLjAKK2RxbWF4NDc0IG1heCAgICAgIDAuMSAgICAgIDEwLjAgIC0+IDEwLjAKK2RxbWF4NDc1IG1heCAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEwMAorZHFtYXg0NzYgbWF4ICAgICAgMS4wICAgICAgIDEwMCAgLT4gMTAwCitkcW1heDQ3NyBtYXggICAgIDEwMDAgICAgICAxMC4wICAtPiAxMDAwCitkcW1heDQ3OCBtYXggICAgIDEwLjAgICAgICAxMDAwICAtPiAxMDAwCitkcW1heDQ3OSBtYXggICAgMTAwMDAgICAgIDEwMC4wICAtPiAxMDAwMAorZHFtYXg0ODAgbWF4ICAgIDEwMC4wICAgICAxMDAwMCAgLT4gMTAwMDAKK2RxbWF4NDgxIG1heCAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEwMDAwMAorZHFtYXg0ODIgbWF4ICAgMTAwMC4wICAgIDEwMDAwMCAgLT4gMTAwMDAwCitkcW1heDQ4MyBtYXggIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxMDAwMDAwCitkcW1heDQ4NCBtYXggIDEwMDAwLjAgICAxMDAwMDAwICAtPiAxMDAwMDAwCisKKy0tIHN1Ym5vcm1hbHMKK2RxbWF4NTEwIG1heCAgMS4wMEUtNjE0MyAgICAgICAwICAtPiAgIDEuMDBFLTYxNDMKK2RxbWF4NTExIG1heCAgMC4xRS02MTQzICAgICAgICAwICAtPiAgIDFFLTYxNDQgICAgU3Vibm9ybWFsCitkcW1heDUxMiBtYXggIDAuMTBFLTYxNDMgICAgICAgMCAgLT4gICAxLjBFLTYxNDQgIFN1Ym5vcm1hbAorZHFtYXg1MTMgbWF4ICAwLjEwMEUtNjE0MyAgICAgIDAgIC0+ICAgMS4wMEUtNjE0NCBTdWJub3JtYWwKK2RxbWF4NTE0IG1heCAgMC4wMUUtNjE0MyAgICAgICAwICAtPiAgIDFFLTYxNDUgICAgU3Vibm9ybWFsCitkcW1heDUxNSBtYXggIDAuOTk5RS02MTQzICAgICAgMCAgLT4gICA5Ljk5RS02MTQ0IFN1Ym5vcm1hbAorZHFtYXg1MTYgbWF4ICAwLjA5OUUtNjE0MyAgICAgIDAgIC0+ICAgOS45RS02MTQ1ICBTdWJub3JtYWwKK2RxbWF4NTE3IG1heCAgMC4wMDlFLTYxNDMgICAgICAwICAtPiAgIDlFLTYxNDYgICAgU3Vibm9ybWFsCitkcW1heDUxOCBtYXggIDAuMDAxRS02MTQzICAgICAgMCAgLT4gICAxRS02MTQ2ICAgIFN1Ym5vcm1hbAorZHFtYXg1MTkgbWF4ICAwLjAwMDlFLTYxNDMgICAgIDAgIC0+ICAgOUUtNjE0NyAgICBTdWJub3JtYWwKK2RxbWF4NTIwIG1heCAgMC4wMDAxRS02MTQzICAgICAwICAtPiAgIDFFLTYxNDcgICAgU3Vibm9ybWFsCisKK2RxbWF4NTMwIG1heCAtMS4wMEUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbWF4NTMxIG1heCAtMC4xRS02MTQzICAgICAgICAwICAtPiAgIDAKK2RxbWF4NTMyIG1heCAtMC4xMEUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbWF4NTMzIG1heCAtMC4xMDBFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWF4NTM0IG1heCAtMC4wMUUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbWF4NTM1IG1heCAtMC45OTlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWF4NTM2IG1heCAtMC4wOTlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWF4NTM3IG1heCAtMC4wMDlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWF4NTM4IG1heCAtMC4wMDFFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWF4NTM5IG1heCAtMC4wMDA5RS02MTQzICAgICAwICAtPiAgIDAKK2RxbWF4NTQwIG1heCAtMC4wMDAxRS02MTQzICAgICAwICAtPiAgIDAKKworLS0gTnVsbCB0ZXN0cworZHFtYXg5MDAgbWF4IDEwICAjICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxbWF4OTAxIG1heCAgIyAxMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWF4TWFnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWF4TWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyMWU4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNYXhNYWcuZGVjVGVzdApAQCAtMCwwICsxLDMwNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcU1heE1hZy5kZWNUZXN0IC0tIGRlY1F1YWQgbWF4bnVtbWFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkcW14ZzAwMSBtYXhtYWcgIC0yICAtMiAgLT4gLTIKK2RxbXhnMDAyIG1heG1hZyAgLTIgIC0xICAtPiAtMgorZHFteGcwMDMgbWF4bWFnICAtMiAgIDAgIC0+IC0yCitkcW14ZzAwNCBtYXhtYWcgIC0yICAgMSAgLT4gLTIKK2RxbXhnMDA1IG1heG1hZyAgLTIgICAyICAtPiAgMgorZHFteGcwMDYgbWF4bWFnICAtMSAgLTIgIC0+IC0yCitkcW14ZzAwNyBtYXhtYWcgIC0xICAtMSAgLT4gLTEKK2RxbXhnMDA4IG1heG1hZyAgLTEgICAwICAtPiAtMQorZHFteGcwMDkgbWF4bWFnICAtMSAgIDEgIC0+ICAxCitkcW14ZzAxMCBtYXhtYWcgIC0xICAgMiAgLT4gIDIKK2RxbXhnMDExIG1heG1hZyAgIDAgIC0yICAtPiAtMgorZHFteGcwMTIgbWF4bWFnICAgMCAgLTEgIC0+IC0xCitkcW14ZzAxMyBtYXhtYWcgICAwICAgMCAgLT4gIDAKK2RxbXhnMDE0IG1heG1hZyAgIDAgICAxICAtPiAgMQorZHFteGcwMTUgbWF4bWFnICAgMCAgIDIgIC0+ICAyCitkcW14ZzAxNiBtYXhtYWcgICAxICAtMiAgLT4gLTIKK2RxbXhnMDE3IG1heG1hZyAgIDEgIC0xICAtPiAgMQorZHFteGcwMTggbWF4bWFnICAgMSAgIDAgIC0+ICAxCitkcW14ZzAxOSBtYXhtYWcgICAxICAgMSAgLT4gIDEKK2RxbXhnMDIwIG1heG1hZyAgIDEgICAyICAtPiAgMgorZHFteGcwMjEgbWF4bWFnICAgMiAgLTIgIC0+ICAyCitkcW14ZzAyMiBtYXhtYWcgICAyICAtMSAgLT4gIDIKK2RxbXhnMDIzIG1heG1hZyAgIDIgICAwICAtPiAgMgorZHFteGcwMjUgbWF4bWFnICAgMiAgIDEgIC0+ICAyCitkcW14ZzAyNiBtYXhtYWcgICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RxbXhnMDMwIG1heG1hZyAgIDAgICAgIDAgICAtPiAgMAorZHFteGcwMzEgbWF4bWFnICAgMCAgICAtMCAgIC0+ICAwCitkcW14ZzAzMiBtYXhtYWcgICAwICAgIC0wLjAgLT4gIDAKK2RxbXhnMDMzIG1heG1hZyAgIDAgICAgIDAuMCAtPiAgMAorZHFteGcwMzQgbWF4bWFnICAtMCAgICAgMCAgIC0+ICAwICAgIC0tIG5vdGU6IC0wID0gMCwgYnV0IDAgY2hvc2VuCitkcW14ZzAzNSBtYXhtYWcgIC0wICAgIC0wICAgLT4gLTAKK2RxbXhnMDM2IG1heG1hZyAgLTAgICAgLTAuMCAtPiAtMC4wCitkcW14ZzAzNyBtYXhtYWcgIC0wICAgICAwLjAgLT4gIDAuMAorZHFteGcwMzggbWF4bWFnICAgMC4wICAgMCAgIC0+ICAwCitkcW14ZzAzOSBtYXhtYWcgICAwLjAgIC0wICAgLT4gIDAuMAorZHFteGcwNDAgbWF4bWFnICAgMC4wICAtMC4wIC0+ICAwLjAKK2RxbXhnMDQxIG1heG1hZyAgIDAuMCAgIDAuMCAtPiAgMC4wCitkcW14ZzA0MiBtYXhtYWcgIC0wLjAgICAwICAgLT4gIDAKK2RxbXhnMDQzIG1heG1hZyAgLTAuMCAgLTAgICAtPiAtMC4wCitkcW14ZzA0NCBtYXhtYWcgIC0wLjAgIC0wLjAgLT4gLTAuMAorZHFteGcwNDUgbWF4bWFnICAtMC4wICAgMC4wIC0+ICAwLjAKKworZHFteGcwNTAgbWF4bWFnICAtMEUxICAgMEUxIC0+ICAwRSsxCitkcW14ZzA1MSBtYXhtYWcgIC0wRTIgICAwRTIgLT4gIDBFKzIKK2RxbXhnMDUyIG1heG1hZyAgLTBFMiAgIDBFMSAtPiAgMEUrMQorZHFteGcwNTMgbWF4bWFnICAtMEUxICAgMEUyIC0+ICAwRSsyCitkcW14ZzA1NCBtYXhtYWcgICAwRTEgIC0wRTEgLT4gIDBFKzEKK2RxbXhnMDU1IG1heG1hZyAgIDBFMiAgLTBFMiAtPiAgMEUrMgorZHFteGcwNTYgbWF4bWFnICAgMEUyICAtMEUxIC0+ICAwRSsyCitkcW14ZzA1NyBtYXhtYWcgICAwRTEgIC0wRTIgLT4gIDBFKzEKKworZHFteGcwNTggbWF4bWFnICAgMEUxICAgMEUxIC0+ICAwRSsxCitkcW14ZzA1OSBtYXhtYWcgICAwRTIgICAwRTIgLT4gIDBFKzIKK2RxbXhnMDYwIG1heG1hZyAgIDBFMiAgIDBFMSAtPiAgMEUrMgorZHFteGcwNjEgbWF4bWFnICAgMEUxICAgMEUyIC0+ICAwRSsyCitkcW14ZzA2MiBtYXhtYWcgIC0wRTEgIC0wRTEgLT4gLTBFKzEKK2RxbXhnMDYzIG1heG1hZyAgLTBFMiAgLTBFMiAtPiAtMEUrMgorZHFteGcwNjQgbWF4bWFnICAtMEUyICAtMEUxIC0+IC0wRSsxCitkcW14ZzA2NSBtYXhtYWcgIC0wRTEgIC0wRTIgLT4gLTBFKzEKKworLS0gU3BlY2lhbHMKK2RxbXhnMDkwIG1heG1hZyAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkcW14ZzA5MSBtYXhtYWcgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFteGcwOTIgbWF4bWFnICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RxbXhnMDkzIG1heG1hZyAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitkcW14ZzA5NCBtYXhtYWcgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZHFteGcwOTUgbWF4bWFnICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RxbXhnMDk2IG1heG1hZyAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitkcW14ZzA5NyBtYXhtYWcgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFteGcwOTggbWF4bWFnIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXhnMDk5IG1heG1hZyAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcW14ZzEwMCBtYXhtYWcgLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFteGcxMDEgbWF4bWFnIC0wICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXhnMTAyIG1heG1hZyAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcW14ZzEwMyBtYXhtYWcgIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFteGcxMDQgbWF4bWFnICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXhnMTA1IG1heG1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxbXhnMTIwIG1heG1hZyAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcW14ZzEyMSBtYXhtYWcgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZHFteGcxMjIgbWF4bWFnIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RxbXhnMTIzIG1heG1hZyAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkcW14ZzEyNCBtYXhtYWcgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZHFteGcxMjUgbWF4bWFnIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RxbXhnMTI2IG1heG1hZyAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkcW14ZzEyNyBtYXhtYWcgLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFteGcxMjggbWF4bWFnIC1JbmYgIC1JbmYgICAtPiAgLUluZmluaXR5CitkcW14ZzEyOSBtYXhtYWcgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFteGcxMzAgbWF4bWFnIC0xICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbXhnMTMxIG1heG1hZyAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcW14ZzEzMiBtYXhtYWcgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFteGcxMzMgbWF4bWFnICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbXhnMTM0IG1heG1hZyAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcW14ZzEzNSBtYXhtYWcgIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorCistLSAyMDA0LjA4LjAyIDc1NHIgY2hvb3NlcyBudW1iZXIgb3ZlciBOYU4gaW4gbWl4ZWQgY2FzZXMKK2RxbXhnMTQxIG1heG1hZyAgTmFOIC1JbmYgICAgLT4gLUluZmluaXR5CitkcW14ZzE0MiBtYXhtYWcgIE5hTiAtMTAwMCAgIC0+IC0xMDAwCitkcW14ZzE0MyBtYXhtYWcgIE5hTiAtMSAgICAgIC0+IC0xCitkcW14ZzE0NCBtYXhtYWcgIE5hTiAtMCAgICAgIC0+IC0wCitkcW14ZzE0NSBtYXhtYWcgIE5hTiAgMCAgICAgIC0+ICAwCitkcW14ZzE0NiBtYXhtYWcgIE5hTiAgMSAgICAgIC0+ICAxCitkcW14ZzE0NyBtYXhtYWcgIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitkcW14ZzE0OCBtYXhtYWcgIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorZHFteGcxNDkgbWF4bWFnICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcW14ZzE1MCBtYXhtYWcgLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorZHFteGcxNTEgbWF4bWFnIC0xMDAwIE5hTiAgICAtPiAtMTAwMAorZHFteGcxNTIgbWF4bWFnIC0xICAgIE5hTiAgICAtPiAtMQorZHFteGcxNTMgbWF4bWFnIC0wICAgIE5hTiAgICAtPiAtMAorZHFteGcxNTQgbWF4bWFnICAwICAgIE5hTiAgICAtPiAgMAorZHFteGcxNTUgbWF4bWFnICAxICAgIE5hTiAgICAtPiAgMQorZHFteGcxNTYgbWF4bWFnICAxMDAwIE5hTiAgICAtPiAgMTAwMAorZHFteGcxNTcgbWF4bWFnICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworZHFteGcxNjEgbWF4bWFnICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjIgbWF4bWFnICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjMgbWF4bWFnICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjQgbWF4bWFnICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjUgbWF4bWFnICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjYgbWF4bWFnICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjcgbWF4bWFnICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjggbWF4bWFnICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNjkgbWF4bWFnICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzAgbWF4bWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzEgbWF4bWFnIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzIgbWF4bWFnIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzMgbWF4bWFnIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzQgbWF4bWFnIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzUgbWF4bWFnICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzYgbWF4bWFnICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzcgbWF4bWFnICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzggbWF4bWFnICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxNzkgbWF4bWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcW14ZzE4MSBtYXhtYWcgIE5hTjkgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbXhnMTgyIG1heG1hZyAgTmFOOCAgICAgOSAgIC0+ICA5CitkcW14ZzE4MyBtYXhtYWcgLU5hTjcgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFteGcxODQgbWF4bWFnIC1OYU4xICAgTmFOMTEgLT4gLU5hTjEKK2RxbXhnMTg1IG1heG1hZyAgTmFOMiAgIE5hTjEyIC0+ICBOYU4yCitkcW14ZzE4NiBtYXhtYWcgLU5hTjEzIC1OYU43ICAtPiAtTmFOMTMKK2RxbXhnMTg3IG1heG1hZyAgTmFOMTQgLU5hTjUgIC0+ICBOYU4xNAorCitkcW14ZzE4OCBtYXhtYWcgLUluZiAgICBOYU40ICAtPiAtSW5maW5pdHkKK2RxbXhnMTg5IG1heG1hZyAtOSAgICAgLU5hTjMgIC0+IC05CitkcW14ZzE5MCBtYXhtYWcgIEluZiAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZHFteGcxOTEgbWF4bWFnICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxbXhnMTkyIG1heG1hZyAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE5MyBtYXhtYWcgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxOTQgbWF4bWFnICBzTmFOOTYgc05hTjk0ICAtPiAgTmFOOTYgSW52YWxpZF9vcGVyYXRpb24KK2RxbXhnMTk1IG1heG1hZyAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE5NiBtYXhtYWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFteGcxOTcgbWF4bWFnICAwICAgICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxbXhnMTk4IG1heG1hZyAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcW14ZzE5OSBtYXhtYWcgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkcW14ZzIyMSBtYXhtYWcgMTIzNDU2NzgwMDAgMSAgLT4gMTIzNDU2NzgwMDAKK2RxbXhnMjIyIG1heG1hZyAxIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorZHFteGcyMjMgbWF4bWFnIDEyMzQ1Njc4MDAgIDEgIC0+IDEyMzQ1Njc4MDAKK2RxbXhnMjI0IG1heG1hZyAxIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCitkcW14ZzIyNSBtYXhtYWcgMTIzNDU2Nzg5MCAgMSAgLT4gMTIzNDU2Nzg5MAorZHFteGcyMjYgbWF4bWFnIDEgMTIzNDU2Nzg5MCAgIC0+IDEyMzQ1Njc4OTAKK2RxbXhnMjI3IG1heG1hZyAxMjM0NTY3ODkxICAxICAtPiAxMjM0NTY3ODkxCitkcW14ZzIyOCBtYXhtYWcgMSAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorZHFteGcyMjkgbWF4bWFnIDEyMzQ1Njc4OTAxIDEgIC0+IDEyMzQ1Njc4OTAxCitkcW14ZzIzMCBtYXhtYWcgMSAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK2RxbXhnMjMxIG1heG1hZyAxMjM0NTY3ODk2ICAxICAtPiAxMjM0NTY3ODk2CitkcW14ZzIzMiBtYXhtYWcgMSAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorZHFteGcyMzMgbWF4bWFnIC0xMjM0NTY3ODkxICAxIC0+IC0xMjM0NTY3ODkxCitkcW14ZzIzNCBtYXhtYWcgMSAtMTIzNDU2Nzg5MSAgLT4gLTEyMzQ1Njc4OTEKK2RxbXhnMjM1IG1heG1hZyAtMTIzNDU2Nzg5MDEgMSAtPiAtMTIzNDU2Nzg5MDEKK2RxbXhnMjM2IG1heG1hZyAxIC0xMjM0NTY3ODkwMSAtPiAtMTIzNDU2Nzg5MDEKK2RxbXhnMjM3IG1heG1hZyAtMTIzNDU2Nzg5NiAgMSAtPiAtMTIzNDU2Nzg5NgorZHFteGcyMzggbWF4bWFnIDEgLTEyMzQ1Njc4OTYgIC0+IC0xMjM0NTY3ODk2CisKKy0tIGZyb20gZXhhbXBsZXMKK2RxbXhnMjgwIG1heG1hZyAnMycgICAnMicgIC0+ICAnMycKK2RxbXhnMjgxIG1heG1hZyAnLTEwJyAnMycgIC0+ICAnLTEwJworZHFteGcyODIgbWF4bWFnICcxLjAnICcxJyAgLT4gICcxJworZHFteGcyODMgbWF4bWFnICcxJyAnMS4wJyAgLT4gICcxJworZHFteGcyODQgbWF4bWFnICc3JyAnTmFOJyAgLT4gICc3JworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK2RxbXhnNDAxIG1heG1hZyAgSW5mICAgIDEuMSAgICAgLT4gIEluZmluaXR5CitkcW14ZzQwMiBtYXhtYWcgIDEuMSAgICAxICAgICAgIC0+ICAxLjEKK2RxbXhnNDAzIG1heG1hZyAgMSAgICAgIDEuMCAgICAgLT4gIDEKK2RxbXhnNDA0IG1heG1hZyAgMS4wICAgIDAuMSAgICAgLT4gIDEuMAorZHFteGc0MDUgbWF4bWFnICAwLjEgICAgMC4xMCAgICAtPiAgMC4xCitkcW14ZzQwNiBtYXhtYWcgIDAuMTAgICAwLjEwMCAgIC0+ICAwLjEwCitkcW14ZzQwNyBtYXhtYWcgIDAuMTAgICAwICAgICAgIC0+ICAwLjEwCitkcW14ZzQwOCBtYXhtYWcgIDAgICAgICAwLjAgICAgIC0+ICAwCitkcW14ZzQwOSBtYXhtYWcgIDAuMCAgIC0wICAgICAgIC0+ICAwLjAKK2RxbXhnNDEwIG1heG1hZyAgMC4wICAgLTAuMCAgICAgLT4gIDAuMAorZHFteGc0MTEgbWF4bWFnICAwLjAwICAtMC4wICAgICAtPiAgMC4wMAorZHFteGc0MTIgbWF4bWFnICAwLjAgICAtMC4wMCAgICAtPiAgMC4wCitkcW14ZzQxMyBtYXhtYWcgIDAgICAgIC0wLjAgICAgIC0+ICAwCitkcW14ZzQxNCBtYXhtYWcgIDAgICAgIC0wICAgICAgIC0+ICAwCitkcW14ZzQxNSBtYXhtYWcgLTAuMCAgIC0wICAgICAgIC0+IC0wLjAKK2RxbXhnNDE2IG1heG1hZyAtMCAgICAgLTAuMTAwICAgLT4gLTAuMTAwCitkcW14ZzQxNyBtYXhtYWcgLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwMAorZHFteGc0MTggbWF4bWFnIC0wLjEwICAtMC4xICAgICAtPiAtMC4xMAorZHFteGc0MTkgbWF4bWFnIC0wLjEgICAtMS4wICAgICAtPiAtMS4wCitkcW14ZzQyMCBtYXhtYWcgLTEuMCAgIC0xICAgICAgIC0+IC0xLjAKK2RxbXhnNDIxIG1heG1hZyAtMSAgICAgLTEuMSAgICAgLT4gLTEuMQorZHFteGc0MjMgbWF4bWFnIC0xLjEgICAtSW5mICAgICAtPiAtSW5maW5pdHkKKy0tIHNhbWUgd2l0aCBvcGVyYW5kcyByZXZlcnNlZAorZHFteGc0MzEgbWF4bWFnICAxLjEgICAgSW5mICAgICAtPiAgSW5maW5pdHkKK2RxbXhnNDMyIG1heG1hZyAgMSAgICAgIDEuMSAgICAgLT4gIDEuMQorZHFteGc0MzMgbWF4bWFnICAxLjAgICAgMSAgICAgICAtPiAgMQorZHFteGc0MzQgbWF4bWFnICAwLjEgICAgMS4wICAgICAtPiAgMS4wCitkcW14ZzQzNSBtYXhtYWcgIDAuMTAgICAwLjEgICAgIC0+ICAwLjEKK2RxbXhnNDM2IG1heG1hZyAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAKK2RxbXhnNDM3IG1heG1hZyAgMCAgICAgIDAuMTAgICAgLT4gIDAuMTAKK2RxbXhnNDM4IG1heG1hZyAgMC4wICAgIDAgICAgICAgLT4gIDAKK2RxbXhnNDM5IG1heG1hZyAtMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZHFteGc0NDAgbWF4bWFnIC0wLjAgICAgMC4wICAgICAtPiAgMC4wCitkcW14ZzQ0MSBtYXhtYWcgLTAuMCAgICAwLjAwICAgIC0+ICAwLjAwCitkcW14ZzQ0MiBtYXhtYWcgLTAuMDAgICAwLjAgICAgIC0+ICAwLjAKK2RxbXhnNDQzIG1heG1hZyAtMC4wICAgIDAgICAgICAgLT4gIDAKK2RxbXhnNDQ0IG1heG1hZyAtMCAgICAgIDAgICAgICAgLT4gIDAKK2RxbXhnNDQ1IG1heG1hZyAtMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZHFteGc0NDYgbWF4bWFnIC0wLjEwMCAtMCAgICAgICAtPiAtMC4xMDAKK2RxbXhnNDQ3IG1heG1hZyAtMC4xMCAgLTAuMTAwICAgLT4gLTAuMTAwCitkcW14ZzQ0OCBtYXhtYWcgLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEwCitkcW14ZzQ0OSBtYXhtYWcgLTEuMCAgIC0wLjEgICAgIC0+IC0xLjAKK2RxbXhnNDUwIG1heG1hZyAtMSAgICAgLTEuMCAgICAgLT4gLTEuMAorZHFteGc0NTEgbWF4bWFnIC0xLjEgICAtMSAgICAgICAtPiAtMS4xCitkcW14ZzQ1MyBtYXhtYWcgLUluZiAgIC0xLjEgICAgIC0+IC1JbmZpbml0eQorLS0gbGFyZ2llcworZHFteGc0NjAgbWF4bWFnICAxMDAwICAgMUUrMyAgICAtPiAgMUUrMworZHFteGc0NjEgbWF4bWFnICAxRSszICAgMTAwMCAgICAtPiAgMUUrMworZHFteGc0NjIgbWF4bWFnICAxMDAwICAtMUUrMyAgICAtPiAgMTAwMAorZHFteGc0NjMgbWF4bWFnICAxRSszICAtMTAwMCAgICAtPiAgMUUrMworZHFteGc0NjQgbWF4bWFnIC0xMDAwICAgMUUrMyAgICAtPiAgMUUrMworZHFteGc0NjUgbWF4bWFnIC0xRSszICAgMTAwMCAgICAtPiAgMTAwMAorZHFteGc0NjYgbWF4bWFnIC0xMDAwICAtMUUrMyAgICAtPiAtMTAwMAorZHFteGc0NjcgbWF4bWFnIC0xRSszICAtMTAwMCAgICAtPiAtMTAwMAorCistLSBzdWJub3JtYWxzCitkcW14ZzUxMCBtYXhtYWcgIDEuMDBFLTYxNDMgICAgICAgMCAgLT4gICAxLjAwRS02MTQzCitkcW14ZzUxMSBtYXhtYWcgIDAuMUUtNjE0MyAgICAgICAgMCAgLT4gICAxRS02MTQ0ICAgIFN1Ym5vcm1hbAorZHFteGc1MTIgbWF4bWFnICAwLjEwRS02MTQzICAgICAgIDAgIC0+ICAgMS4wRS02MTQ0ICBTdWJub3JtYWwKK2RxbXhnNTEzIG1heG1hZyAgMC4xMDBFLTYxNDMgICAgICAwICAtPiAgIDEuMDBFLTYxNDQgU3Vibm9ybWFsCitkcW14ZzUxNCBtYXhtYWcgIDAuMDFFLTYxNDMgICAgICAgMCAgLT4gICAxRS02MTQ1ICAgIFN1Ym5vcm1hbAorZHFteGc1MTUgbWF4bWFnICAwLjk5OUUtNjE0MyAgICAgIDAgIC0+ICAgOS45OUUtNjE0NCBTdWJub3JtYWwKK2RxbXhnNTE2IG1heG1hZyAgMC4wOTlFLTYxNDMgICAgICAwICAtPiAgIDkuOUUtNjE0NSAgU3Vibm9ybWFsCitkcW14ZzUxNyBtYXhtYWcgIDAuMDA5RS02MTQzICAgICAgMCAgLT4gICA5RS02MTQ2ICAgIFN1Ym5vcm1hbAorZHFteGc1MTggbWF4bWFnICAwLjAwMUUtNjE0MyAgICAgIDAgIC0+ICAgMUUtNjE0NiAgICBTdWJub3JtYWwKK2RxbXhnNTE5IG1heG1hZyAgMC4wMDA5RS02MTQzICAgICAwICAtPiAgIDlFLTYxNDcgICAgU3Vibm9ybWFsCitkcW14ZzUyMCBtYXhtYWcgIDAuMDAwMUUtNjE0MyAgICAgMCAgLT4gICAxRS02MTQ3ICAgIFN1Ym5vcm1hbAorCitkcW14ZzUzMCBtYXhtYWcgLTEuMDBFLTYxNDMgICAgICAgMCAgLT4gIC0xLjAwRS02MTQzCitkcW14ZzUzMSBtYXhtYWcgLTAuMUUtNjE0MyAgICAgICAgMCAgLT4gIC0xRS02MTQ0ICAgIFN1Ym5vcm1hbAorZHFteGc1MzIgbWF4bWFnIC0wLjEwRS02MTQzICAgICAgIDAgIC0+ICAtMS4wRS02MTQ0ICBTdWJub3JtYWwKK2RxbXhnNTMzIG1heG1hZyAtMC4xMDBFLTYxNDMgICAgICAwICAtPiAgLTEuMDBFLTYxNDQgU3Vibm9ybWFsCitkcW14ZzUzNCBtYXhtYWcgLTAuMDFFLTYxNDMgICAgICAgMCAgLT4gIC0xRS02MTQ1ICAgIFN1Ym5vcm1hbAorZHFteGc1MzUgbWF4bWFnIC0wLjk5OUUtNjE0MyAgICAgIDAgIC0+ICAtOS45OUUtNjE0NCBTdWJub3JtYWwKK2RxbXhnNTM2IG1heG1hZyAtMC4wOTlFLTYxNDMgICAgICAwICAtPiAgLTkuOUUtNjE0NSAgU3Vibm9ybWFsCitkcW14ZzUzNyBtYXhtYWcgLTAuMDA5RS02MTQzICAgICAgMCAgLT4gIC05RS02MTQ2ICAgIFN1Ym5vcm1hbAorZHFteGc1MzggbWF4bWFnIC0wLjAwMUUtNjE0MyAgICAgIDAgIC0+ICAtMUUtNjE0NiAgICBTdWJub3JtYWwKK2RxbXhnNTM5IG1heG1hZyAtMC4wMDA5RS02MTQzICAgICAwICAtPiAgLTlFLTYxNDcgICAgU3Vibm9ybWFsCitkcW14ZzU0MCBtYXhtYWcgLTAuMDAwMUUtNjE0MyAgICAgMCAgLT4gIC0xRS02MTQ3ICAgIFN1Ym5vcm1hbAorCistLSBOdWxsIHRlc3RzCitkcW14ZzkwMCBtYXhtYWcgMTAgICMgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFteGc5MDEgbWF4bWFnICAjIDEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1pbi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1pbi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4N2Y0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWluLmRlY1Rlc3QKQEAgLTAsMCArMSwzMDkgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFNaW4uZGVjVGVzdCAtLSBkZWNRdWFkIG1pbm51bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSB3ZSBhc3N1bWUgdGhhdCBiYXNlIGNvbXBhcmlzb24gaXMgdGVzdGVkIGluIGNvbXBhcmUuZGVjVGVzdCwgc28KKy0tIHRoZXNlIG1haW5seSBjb3ZlciBzcGVjaWFsIGNhc2VzIGFuZCByb3VuZGluZworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFtaW4wMDEgbWluICAtMiAgLTIgIC0+IC0yCitkcW1pbjAwMiBtaW4gIC0yICAtMSAgLT4gLTIKK2RxbWluMDAzIG1pbiAgLTIgICAwICAtPiAtMgorZHFtaW4wMDQgbWluICAtMiAgIDEgIC0+IC0yCitkcW1pbjAwNSBtaW4gIC0yICAgMiAgLT4gLTIKK2RxbWluMDA2IG1pbiAgLTEgIC0yICAtPiAtMgorZHFtaW4wMDcgbWluICAtMSAgLTEgIC0+IC0xCitkcW1pbjAwOCBtaW4gIC0xICAgMCAgLT4gLTEKK2RxbWluMDA5IG1pbiAgLTEgICAxICAtPiAtMQorZHFtaW4wMTAgbWluICAtMSAgIDIgIC0+IC0xCitkcW1pbjAxMSBtaW4gICAwICAtMiAgLT4gLTIKK2RxbWluMDEyIG1pbiAgIDAgIC0xICAtPiAtMQorZHFtaW4wMTMgbWluICAgMCAgIDAgIC0+ICAwCitkcW1pbjAxNCBtaW4gICAwICAgMSAgLT4gIDAKK2RxbWluMDE1IG1pbiAgIDAgICAyICAtPiAgMAorZHFtaW4wMTYgbWluICAgMSAgLTIgIC0+IC0yCitkcW1pbjAxNyBtaW4gICAxICAtMSAgLT4gLTEKK2RxbWluMDE4IG1pbiAgIDEgICAwICAtPiAgMAorZHFtaW4wMTkgbWluICAgMSAgIDEgIC0+ICAxCitkcW1pbjAyMCBtaW4gICAxICAgMiAgLT4gIDEKK2RxbWluMDIxIG1pbiAgIDIgIC0yICAtPiAtMgorZHFtaW4wMjIgbWluICAgMiAgLTEgIC0+IC0xCitkcW1pbjAyMyBtaW4gICAyICAgMCAgLT4gIDAKK2RxbWluMDI1IG1pbiAgIDIgICAxICAtPiAgMQorZHFtaW4wMjYgbWluICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCitkcW1pbjAzMCBtaW4gICAwICAgICAwICAgLT4gIDAKK2RxbWluMDMxIG1pbiAgIDAgICAgLTAgICAtPiAtMAorZHFtaW4wMzIgbWluICAgMCAgICAtMC4wIC0+IC0wLjAKK2RxbWluMDMzIG1pbiAgIDAgICAgIDAuMCAtPiAgMC4wCitkcW1pbjAzNCBtaW4gIC0wICAgICAwICAgLT4gLTAKK2RxbWluMDM1IG1pbiAgLTAgICAgLTAgICAtPiAtMAorZHFtaW4wMzYgbWluICAtMCAgICAtMC4wIC0+IC0wCitkcW1pbjAzNyBtaW4gIC0wICAgICAwLjAgLT4gLTAKK2RxbWluMDM4IG1pbiAgIDAuMCAgIDAgICAtPiAgMC4wCitkcW1pbjAzOSBtaW4gICAwLjAgIC0wICAgLT4gLTAKK2RxbWluMDQwIG1pbiAgIDAuMCAgLTAuMCAtPiAtMC4wCitkcW1pbjA0MSBtaW4gICAwLjAgICAwLjAgLT4gIDAuMAorZHFtaW4wNDIgbWluICAtMC4wICAgMCAgIC0+IC0wLjAKK2RxbWluMDQzIG1pbiAgLTAuMCAgLTAgICAtPiAtMAorZHFtaW4wNDQgbWluICAtMC4wICAtMC4wIC0+IC0wLjAKK2RxbWluMDQ1IG1pbiAgLTAuMCAgIDAuMCAtPiAtMC4wCisKK2RxbWluMDQ2IG1pbiAgIDBFMSAgLTBFMSAtPiAtMEUrMQorZHFtaW4wNDcgbWluICAtMEUxICAgMEUyIC0+IC0wRSsxCitkcW1pbjA0OCBtaW4gICAwRTIgICAwRTEgLT4gIDBFKzEKK2RxbWluMDQ5IG1pbiAgIDBFMSAgIDBFMiAtPiAgMEUrMQorZHFtaW4wNTAgbWluICAtMEUzICAtMEUyIC0+IC0wRSszCitkcW1pbjA1MSBtaW4gIC0wRTIgIC0wRTMgLT4gLTBFKzMKKworLS0gU3BlY2lhbHMKK2RxbWluMDkwIG1pbiAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjA5MSBtaW4gIEluZiAgLTEwMDAgIC0+IC0xMDAwCitkcW1pbjA5MiBtaW4gIEluZiAgLTEgICAgIC0+IC0xCitkcW1pbjA5MyBtaW4gIEluZiAgLTAgICAgIC0+IC0wCitkcW1pbjA5NCBtaW4gIEluZiAgIDAgICAgIC0+ICAwCitkcW1pbjA5NSBtaW4gIEluZiAgIDEgICAgIC0+ICAxCitkcW1pbjA5NiBtaW4gIEluZiAgIDEwMDAgIC0+ICAxMDAwCitkcW1pbjA5NyBtaW4gIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFtaW4wOTggbWluIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZHFtaW4wOTkgbWluIC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTAwIG1pbiAtMSAgICAgSW5mICAgLT4gLTEKK2RxbWluMTAxIG1pbiAtMCAgICAgSW5mICAgLT4gLTAKK2RxbWluMTAyIG1pbiAgMCAgICAgSW5mICAgLT4gIDAKK2RxbWluMTAzIG1pbiAgMSAgICAgSW5mICAgLT4gIDEKK2RxbWluMTA0IG1pbiAgMTAwMCAgSW5mICAgLT4gIDEwMDAKK2RxbWluMTA1IG1pbiAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxbWluMTIwIG1pbiAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjEyMSBtaW4gLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZHFtaW4xMjIgbWluIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2RxbWluMTIzIG1pbiAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkcW1pbjEyNCBtaW4gLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZHFtaW4xMjUgbWluIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2RxbWluMTI2IG1pbiAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkcW1pbjEyNyBtaW4gLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZHFtaW4xMjggbWluIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTI5IG1pbiAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjEzMCBtaW4gLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtaW4xMzEgbWluIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTMyIG1pbiAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjEzMyBtaW4gIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtaW4xMzQgbWluICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbWluMTM1IG1pbiAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CisKKy0tIDIwMDQuMDguMDIgNzU0ciBjaG9vc2VzIG51bWJlciBvdmVyIE5hTiBpbiBtaXhlZCBjYXNlcworZHFtaW4xNDEgbWluICBOYU4gLUluZiAgICAtPiAgLUluZmluaXR5CitkcW1pbjE0MiBtaW4gIE5hTiAtMTAwMCAgIC0+ICAtMTAwMAorZHFtaW4xNDMgbWluICBOYU4gLTEgICAgICAtPiAgLTEKK2RxbWluMTQ0IG1pbiAgTmFOIC0wICAgICAgLT4gIC0wCitkcW1pbjE0NSBtaW4gIE5hTiAgMCAgICAgIC0+ICAwCitkcW1pbjE0NiBtaW4gIE5hTiAgMSAgICAgIC0+ICAxCitkcW1pbjE0NyBtaW4gIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitkcW1pbjE0OCBtaW4gIE5hTiAgSW5mICAgIC0+ICBJbmZpbml0eQorZHFtaW4xNDkgbWluICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcW1pbjE1MCBtaW4gLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorZHFtaW4xNTEgbWluIC0xMDAwIE5hTiAgICAtPiAtMTAwMAorZHFtaW4xNTIgbWluIC0xICAgLU5hTiAgICAtPiAtMQorZHFtaW4xNTMgbWluIC0wICAgIE5hTiAgICAtPiAtMAorZHFtaW4xNTQgbWluICAwICAgLU5hTiAgICAtPiAgMAorZHFtaW4xNTUgbWluICAxICAgIE5hTiAgICAtPiAgMQorZHFtaW4xNTYgbWluICAxMDAwIE5hTiAgICAtPiAgMTAwMAorZHFtaW4xNTcgbWluICBJbmYgIE5hTiAgICAtPiAgSW5maW5pdHkKKworZHFtaW4xNjEgbWluICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjIgbWluICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjMgbWluICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjQgbWluICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjUgbWluIC1zTmFOICAwICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjYgbWluIC1zTmFOICAxICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjcgbWluICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjggbWluICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNjkgbWluICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzAgbWluICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzEgbWluIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzIgbWluIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzMgbWluIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzQgbWluIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzUgbWluICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzYgbWluICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzcgbWluICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzggbWluICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xNzkgbWluICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcW1pbjE4MSBtaW4gIE5hTjkgICAtSW5mICAgLT4gLUluZmluaXR5CitkcW1pbjE4MiBtaW4gLU5hTjggICAgOTk5MCAgLT4gIDk5OTAKK2RxbWluMTgzIG1pbiAgTmFONzEgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFtaW4xODQgbWluICBOYU4xICAgIE5hTjU0IC0+ICBOYU4xCitkcW1pbjE4NSBtaW4gIE5hTjIyICAtTmFONTMgLT4gIE5hTjIyCitkcW1pbjE4NiBtaW4gLU5hTjMgICAgTmFONiAgLT4gLU5hTjMKK2RxbWluMTg3IG1pbiAtTmFONDQgICBOYU43ICAtPiAtTmFONDQKKworZHFtaW4xODggbWluIC1JbmYgICAgIE5hTjQxIC0+IC1JbmZpbml0eQorZHFtaW4xODkgbWluIC05OTk5ICAgLU5hTjMzIC0+IC05OTk5CitkcW1pbjE5MCBtaW4gIEluZiAgICAgTmFOMiAgLT4gIEluZmluaXR5CisKK2RxbWluMTkxIG1pbiAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE5MiBtaW4gIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xOTMgbWluIC1zTmFOOTcgIE5hTjggICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxbWluMTk0IG1pbiAgc05hTjY5IHNOYU45NCAgLT4gIE5hTjY5IEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE5NSBtaW4gIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xOTYgbWluIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxbWluMTk3IG1pbiAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjE5OCBtaW4gIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFtaW4xOTkgbWluICBOYU4gICAgc05hTjg2ICAtPiAgTmFOODYgSW52YWxpZF9vcGVyYXRpb24KKworLS0gb2xkIHJvdW5kaW5nIGNoZWNrcworZHFtaW4yMjEgbWluIC0xMjM0NTY3ODAwMCAxICAtPiAtMTIzNDU2NzgwMDAKK2RxbWluMjIyIG1pbiAxIC0xMjM0NTY3ODAwMCAgLT4gLTEyMzQ1Njc4MDAwCitkcW1pbjIyMyBtaW4gLTEyMzQ1Njc4MDAgIDEgIC0+IC0xMjM0NTY3ODAwCitkcW1pbjIyNCBtaW4gMSAtMTIzNDU2NzgwMCAgIC0+IC0xMjM0NTY3ODAwCitkcW1pbjIyNSBtaW4gLTEyMzQ1Njc4OTAgIDEgIC0+IC0xMjM0NTY3ODkwCitkcW1pbjIyNiBtaW4gMSAtMTIzNDU2Nzg5MCAgIC0+IC0xMjM0NTY3ODkwCitkcW1pbjIyNyBtaW4gLTEyMzQ1Njc4OTEgIDEgIC0+IC0xMjM0NTY3ODkxCitkcW1pbjIyOCBtaW4gMSAtMTIzNDU2Nzg5MSAgIC0+IC0xMjM0NTY3ODkxCitkcW1pbjIyOSBtaW4gLTEyMzQ1Njc4OTAxIDEgIC0+IC0xMjM0NTY3ODkwMQorZHFtaW4yMzAgbWluIDEgLTEyMzQ1Njc4OTAxICAtPiAtMTIzNDU2Nzg5MDEKK2RxbWluMjMxIG1pbiAtMTIzNDU2Nzg5NiAgMSAgLT4gLTEyMzQ1Njc4OTYKK2RxbWluMjMyIG1pbiAxIC0xMjM0NTY3ODk2ICAgLT4gLTEyMzQ1Njc4OTYKK2RxbWluMjMzIG1pbiAxMjM0NTY3ODkxICAxICAgLT4gMQorZHFtaW4yMzQgbWluIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkcW1pbjIzNSBtaW4gMTIzNDU2Nzg5MDEgMSAgIC0+IDEKK2RxbWluMjM2IG1pbiAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZHFtaW4yMzcgbWluIDEyMzQ1Njc4OTYgIDEgICAtPiAxCitkcW1pbjIzOCBtaW4gMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworZHFtaW4yODAgbWluICczJyAgICcyJyAgLT4gICcyJworZHFtaW4yODEgbWluICctMTAnICczJyAgLT4gICctMTAnCitkcW1pbjI4MiBtaW4gJzEuMCcgJzEnICAtPiAgJzEuMCcKK2RxbWluMjgzIG1pbiAnMScgJzEuMCcgIC0+ICAnMS4wJworZHFtaW4yODQgbWluICc3JyAnTmFOJyAgLT4gICc3JworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK2RxbWluNDAxIG1pbiAgSW5mICAgIDEuMSAgICAgLT4gIDEuMQorZHFtaW40MDIgbWluICAxLjEgICAgMSAgICAgICAtPiAgMQorZHFtaW40MDMgbWluICAxICAgICAgMS4wICAgICAtPiAgMS4wCitkcW1pbjQwNCBtaW4gIDEuMCAgICAwLjEgICAgIC0+ICAwLjEKK2RxbWluNDA1IG1pbiAgMC4xICAgIDAuMTAgICAgLT4gIDAuMTAKK2RxbWluNDA2IG1pbiAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAwCitkcW1pbjQwNyBtaW4gIDAuMTAgICAwICAgICAgIC0+ICAwCitkcW1pbjQwOCBtaW4gIDAgICAgICAwLjAgICAgIC0+ICAwLjAKK2RxbWluNDA5IG1pbiAgMC4wICAgLTAgICAgICAgLT4gLTAKK2RxbWluNDEwIG1pbiAgMC4wICAgLTAuMCAgICAgLT4gLTAuMAorZHFtaW40MTEgbWluICAwLjAwICAtMC4wICAgICAtPiAtMC4wCitkcW1pbjQxMiBtaW4gIDAuMCAgIC0wLjAwICAgIC0+IC0wLjAwCitkcW1pbjQxMyBtaW4gIDAgICAgIC0wLjAgICAgIC0+IC0wLjAKK2RxbWluNDE0IG1pbiAgMCAgICAgLTAgICAgICAgLT4gLTAKK2RxbWluNDE1IG1pbiAtMC4wICAgLTAgICAgICAgLT4gLTAKK2RxbWluNDE2IG1pbiAtMCAgICAgLTAuMTAwICAgLT4gLTAuMTAwCitkcW1pbjQxNyBtaW4gLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwCitkcW1pbjQxOCBtaW4gLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEKK2RxbWluNDE5IG1pbiAtMC4xICAgLTEuMCAgICAgLT4gLTEuMAorZHFtaW40MjAgbWluIC0xLjAgICAtMSAgICAgICAtPiAtMQorZHFtaW40MjEgbWluIC0xICAgICAtMS4xICAgICAtPiAtMS4xCitkcW1pbjQyMyBtaW4gLTEuMSAgIC1JbmYgICAgIC0+IC1JbmZpbml0eQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCitkcW1pbjQzMSBtaW4gIDEuMSAgICBJbmYgICAgIC0+ICAxLjEKK2RxbWluNDMyIG1pbiAgMSAgICAgIDEuMSAgICAgLT4gIDEKK2RxbWluNDMzIG1pbiAgMS4wICAgIDEgICAgICAgLT4gIDEuMAorZHFtaW40MzQgbWluICAwLjEgICAgMS4wICAgICAtPiAgMC4xCitkcW1pbjQzNSBtaW4gIDAuMTAgICAwLjEgICAgIC0+ICAwLjEwCitkcW1pbjQzNiBtaW4gIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwMAorZHFtaW40MzcgbWluICAwICAgICAgMC4xMCAgICAtPiAgMAorZHFtaW40MzggbWluICAwLjAgICAgMCAgICAgICAtPiAgMC4wCitkcW1pbjQzOSBtaW4gLTAgICAgICAwLjAgICAgIC0+IC0wCitkcW1pbjQ0MCBtaW4gLTAuMCAgICAwLjAgICAgIC0+IC0wLjAKK2RxbWluNDQxIG1pbiAtMC4wICAgIDAuMDAgICAgLT4gLTAuMAorZHFtaW40NDIgbWluIC0wLjAwICAgMC4wICAgICAtPiAtMC4wMAorZHFtaW40NDMgbWluIC0wLjAgICAgMCAgICAgICAtPiAtMC4wCitkcW1pbjQ0NCBtaW4gLTAgICAgICAwICAgICAgIC0+IC0wCitkcW1pbjQ0NSBtaW4gLTAgICAgIC0wLjAgICAgIC0+IC0wCitkcW1pbjQ0NiBtaW4gLTAuMTAwIC0wICAgICAgIC0+IC0wLjEwMAorZHFtaW40NDcgbWluIC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMAorZHFtaW40NDggbWluIC0wLjEgICAtMC4xMCAgICAtPiAtMC4xCitkcW1pbjQ0OSBtaW4gLTEuMCAgIC0wLjEgICAgIC0+IC0xLjAKK2RxbWluNDUwIG1pbiAtMSAgICAgLTEuMCAgICAgLT4gLTEKK2RxbWluNDUxIG1pbiAtMS4xICAgLTEgICAgICAgLT4gLTEuMQorZHFtaW40NTMgbWluIC1JbmYgICAtMS4xICAgICAtPiAtSW5maW5pdHkKKy0tIGxhcmdpZXMKK2RxbWluNDYwIG1pbiAgMTAwMCAgIDFFKzMgICAgLT4gIDEwMDAKK2RxbWluNDYxIG1pbiAgMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK2RxbWluNDYyIG1pbiAgMTAwMCAgLTFFKzMgICAgLT4gLTFFKzMKK2RxbWluNDYzIG1pbiAgMUUrMyAgLTM4NCAgICAtPiAtMzg0CitkcW1pbjQ2NCBtaW4gLTM4NCAgIDFFKzMgICAgLT4gLTM4NAorZHFtaW40NjUgbWluIC0xRSszICAgMTAwMCAgICAtPiAtMUUrMworZHFtaW40NjYgbWluIC0zODQgIC0xRSszICAgIC0+IC0xRSszCitkcW1pbjQ2NyBtaW4gLTFFKzMgIC0zODQgICAgLT4gLTFFKzMKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitkcW1pbjQ3MSBtaW4gICAgICAxLjAgICAgICAgMC4xICAtPiAwLjEKK2RxbWluNDcyIG1pbiAgICAgIDAuMSAgICAgICAxLjAgIC0+IDAuMQorZHFtaW40NzMgbWluICAgICAxMC4wICAgICAgIDAuMSAgLT4gMC4xCitkcW1pbjQ3NCBtaW4gICAgICAwLjEgICAgICAxMC4wICAtPiAwLjEKK2RxbWluNDc1IG1pbiAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEuMAorZHFtaW40NzYgbWluICAgICAgMS4wICAgICAgIDEwMCAgLT4gMS4wCitkcW1pbjQ3NyBtaW4gICAgIDEwMDAgICAgICAxMC4wICAtPiAxMC4wCitkcW1pbjQ3OCBtaW4gICAgIDEwLjAgICAgICAxMDAwICAtPiAxMC4wCitkcW1pbjQ3OSBtaW4gICAgMTAwMDAgICAgIDEwMC4wICAtPiAxMDAuMAorZHFtaW40ODAgbWluICAgIDEwMC4wICAgICAxMDAwMCAgLT4gMTAwLjAKK2RxbWluNDgxIG1pbiAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEwMDAuMAorZHFtaW40ODIgbWluICAgMTAwMC4wICAgIDEwMDAwMCAgLT4gMTAwMC4wCitkcW1pbjQ4MyBtaW4gIDEwMDAwMDAgICAxMDAwMC4wICAtPiAxMDAwMC4wCitkcW1pbjQ4NCBtaW4gIDEwMDAwLjAgICAxMDAwMDAwICAtPiAxMDAwMC4wCisKKy0tIHN1Ym5vcm1hbHMKK2RxbWluNTEwIG1pbiAgMS4wMEUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbWluNTExIG1pbiAgMC4xRS02MTQzICAgICAgICAwICAtPiAgIDAKK2RxbWluNTEyIG1pbiAgMC4xMEUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbWluNTEzIG1pbiAgMC4xMDBFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWluNTE0IG1pbiAgMC4wMUUtNjE0MyAgICAgICAwICAtPiAgIDAKK2RxbWluNTE1IG1pbiAgMC45OTlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWluNTE2IG1pbiAgMC4wOTlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWluNTE3IG1pbiAgMC4wMDlFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWluNTE4IG1pbiAgMC4wMDFFLTYxNDMgICAgICAwICAtPiAgIDAKK2RxbWluNTE5IG1pbiAgMC4wMDA5RS02MTQzICAgICAwICAtPiAgIDAKK2RxbWluNTIwIG1pbiAgMC4wMDAxRS02MTQzICAgICAwICAtPiAgIDAKKworZHFtaW41MzAgbWluIC0xLjAwRS02MTQzICAgICAgIDAgIC0+ICAtMS4wMEUtNjE0MworZHFtaW41MzEgbWluIC0wLjFFLTYxNDMgICAgICAgIDAgIC0+ICAtMUUtNjE0NCAgICBTdWJub3JtYWwKK2RxbWluNTMyIG1pbiAtMC4xMEUtNjE0MyAgICAgICAwICAtPiAgLTEuMEUtNjE0NCAgU3Vibm9ybWFsCitkcW1pbjUzMyBtaW4gLTAuMTAwRS02MTQzICAgICAgMCAgLT4gIC0xLjAwRS02MTQ0IFN1Ym5vcm1hbAorZHFtaW41MzQgbWluIC0wLjAxRS02MTQzICAgICAgIDAgIC0+ICAtMUUtNjE0NSAgICBTdWJub3JtYWwKK2RxbWluNTM1IG1pbiAtMC45OTlFLTYxNDMgICAgICAwICAtPiAgLTkuOTlFLTYxNDQgU3Vibm9ybWFsCitkcW1pbjUzNiBtaW4gLTAuMDk5RS02MTQzICAgICAgMCAgLT4gIC05LjlFLTYxNDUgIFN1Ym5vcm1hbAorZHFtaW41MzcgbWluIC0wLjAwOUUtNjE0MyAgICAgIDAgIC0+ICAtOUUtNjE0NiAgICBTdWJub3JtYWwKK2RxbWluNTM4IG1pbiAtMC4wMDFFLTYxNDMgICAgICAwICAtPiAgLTFFLTYxNDYgICAgU3Vibm9ybWFsCitkcW1pbjUzOSBtaW4gLTAuMDAwOUUtNjE0MyAgICAgMCAgLT4gIC05RS02MTQ3ICAgIFN1Ym5vcm1hbAorZHFtaW41NDAgbWluIC0wLjAwMDFFLTYxNDMgICAgIDAgIC0+ICAtMUUtNjE0NyAgICBTdWJub3JtYWwKKworCistLSBOdWxsIHRlc3RzCitkcW1pbjkwMCBtaW4gMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW1pbjkwMSBtaW4gICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWluTWFnLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWluTWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjMmU0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNaW5NYWcuZGVjVGVzdApAQCAtMCwwICsxLDI5MyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcU1pbk1hZy5kZWNUZXN0IC0tIGRlY1F1YWQgbWlubnVtbWFnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBzYW5pdHkgY2hlY2tzCitkcW1uZzAwMSBtaW5tYWcgIC0yICAtMiAgLT4gLTIKK2RxbW5nMDAyIG1pbm1hZyAgLTIgIC0xICAtPiAtMQorZHFtbmcwMDMgbWlubWFnICAtMiAgIDAgIC0+ICAwCitkcW1uZzAwNCBtaW5tYWcgIC0yICAgMSAgLT4gIDEKK2RxbW5nMDA1IG1pbm1hZyAgLTIgICAyICAtPiAtMgorZHFtbmcwMDYgbWlubWFnICAtMSAgLTIgIC0+IC0xCitkcW1uZzAwNyBtaW5tYWcgIC0xICAtMSAgLT4gLTEKK2RxbW5nMDA4IG1pbm1hZyAgLTEgICAwICAtPiAgMAorZHFtbmcwMDkgbWlubWFnICAtMSAgIDEgIC0+IC0xCitkcW1uZzAxMCBtaW5tYWcgIC0xICAgMiAgLT4gLTEKK2RxbW5nMDExIG1pbm1hZyAgIDAgIC0yICAtPiAgMAorZHFtbmcwMTIgbWlubWFnICAgMCAgLTEgIC0+ICAwCitkcW1uZzAxMyBtaW5tYWcgICAwICAgMCAgLT4gIDAKK2RxbW5nMDE0IG1pbm1hZyAgIDAgICAxICAtPiAgMAorZHFtbmcwMTUgbWlubWFnICAgMCAgIDIgIC0+ICAwCitkcW1uZzAxNiBtaW5tYWcgICAxICAtMiAgLT4gIDEKK2RxbW5nMDE3IG1pbm1hZyAgIDEgIC0xICAtPiAtMQorZHFtbmcwMTggbWlubWFnICAgMSAgIDAgIC0+ICAwCitkcW1uZzAxOSBtaW5tYWcgICAxICAgMSAgLT4gIDEKK2RxbW5nMDIwIG1pbm1hZyAgIDEgICAyICAtPiAgMQorZHFtbmcwMjEgbWlubWFnICAgMiAgLTIgIC0+IC0yCitkcW1uZzAyMiBtaW5tYWcgICAyICAtMSAgLT4gLTEKK2RxbW5nMDIzIG1pbm1hZyAgIDIgICAwICAtPiAgMAorZHFtbmcwMjUgbWlubWFnICAgMiAgIDEgIC0+ICAxCitkcW1uZzAyNiBtaW5tYWcgICAyICAgMiAgLT4gIDIKKworLS0gZXh0ZW5kZWQgemVyb3MKK2RxbW5nMDMwIG1pbm1hZyAgIDAgICAgIDAgICAtPiAgMAorZHFtbmcwMzEgbWlubWFnICAgMCAgICAtMCAgIC0+IC0wCitkcW1uZzAzMiBtaW5tYWcgICAwICAgIC0wLjAgLT4gLTAuMAorZHFtbmcwMzMgbWlubWFnICAgMCAgICAgMC4wIC0+ICAwLjAKK2RxbW5nMDM0IG1pbm1hZyAgLTAgICAgIDAgICAtPiAtMAorZHFtbmcwMzUgbWlubWFnICAtMCAgICAtMCAgIC0+IC0wCitkcW1uZzAzNiBtaW5tYWcgIC0wICAgIC0wLjAgLT4gLTAKK2RxbW5nMDM3IG1pbm1hZyAgLTAgICAgIDAuMCAtPiAtMAorZHFtbmcwMzggbWlubWFnICAgMC4wICAgMCAgIC0+ICAwLjAKK2RxbW5nMDM5IG1pbm1hZyAgIDAuMCAgLTAgICAtPiAtMAorZHFtbmcwNDAgbWlubWFnICAgMC4wICAtMC4wIC0+IC0wLjAKK2RxbW5nMDQxIG1pbm1hZyAgIDAuMCAgIDAuMCAtPiAgMC4wCitkcW1uZzA0MiBtaW5tYWcgIC0wLjAgICAwICAgLT4gLTAuMAorZHFtbmcwNDMgbWlubWFnICAtMC4wICAtMCAgIC0+IC0wCitkcW1uZzA0NCBtaW5tYWcgIC0wLjAgIC0wLjAgLT4gLTAuMAorZHFtbmcwNDUgbWlubWFnICAtMC4wICAgMC4wIC0+IC0wLjAKKworZHFtbmcwNDYgbWlubWFnICAgMEUxICAtMEUxIC0+IC0wRSsxCitkcW1uZzA0NyBtaW5tYWcgIC0wRTEgICAwRTIgLT4gLTBFKzEKK2RxbW5nMDQ4IG1pbm1hZyAgIDBFMiAgIDBFMSAtPiAgMEUrMQorZHFtbmcwNDkgbWlubWFnICAgMEUxICAgMEUyIC0+ICAwRSsxCitkcW1uZzA1MCBtaW5tYWcgIC0wRTMgIC0wRTIgLT4gLTBFKzMKK2RxbW5nMDUxIG1pbm1hZyAgLTBFMiAgLTBFMyAtPiAtMEUrMworCistLSBTcGVjaWFscworZHFtbmcwOTAgbWlubWFnICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbW5nMDkxIG1pbm1hZyAgSW5mICAtMTAwMCAgLT4gLTEwMDAKK2RxbW5nMDkyIG1pbm1hZyAgSW5mICAtMSAgICAgLT4gLTEKK2RxbW5nMDkzIG1pbm1hZyAgSW5mICAtMCAgICAgLT4gLTAKK2RxbW5nMDk0IG1pbm1hZyAgSW5mICAgMCAgICAgLT4gIDAKK2RxbW5nMDk1IG1pbm1hZyAgSW5mICAgMSAgICAgLT4gIDEKK2RxbW5nMDk2IG1pbm1hZyAgSW5mICAgMTAwMCAgLT4gIDEwMDAKK2RxbW5nMDk3IG1pbm1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcW1uZzA5OCBtaW5tYWcgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitkcW1uZzA5OSBtaW5tYWcgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorZHFtbmcxMDAgbWlubWFnIC0xICAgICBJbmYgICAtPiAtMQorZHFtbmcxMDEgbWlubWFnIC0wICAgICBJbmYgICAtPiAtMAorZHFtbmcxMDIgbWlubWFnICAwICAgICBJbmYgICAtPiAgMAorZHFtbmcxMDMgbWlubWFnICAxICAgICBJbmYgICAtPiAgMQorZHFtbmcxMDQgbWlubWFnICAxMDAwICBJbmYgICAtPiAgMTAwMAorZHFtbmcxMDUgbWlubWFnICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZHFtbmcxMjAgbWlubWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbW5nMTIxIG1pbm1hZyAtSW5mICAtMTAwMCAgLT4gLTEwMDAKK2RxbW5nMTIyIG1pbm1hZyAtSW5mICAtMSAgICAgLT4gLTEKK2RxbW5nMTIzIG1pbm1hZyAtSW5mICAtMCAgICAgLT4gLTAKK2RxbW5nMTI0IG1pbm1hZyAtSW5mICAgMCAgICAgLT4gIDAKK2RxbW5nMTI1IG1pbm1hZyAtSW5mICAgMSAgICAgLT4gIDEKK2RxbW5nMTI2IG1pbm1hZyAtSW5mICAgMTAwMCAgLT4gIDEwMDAKK2RxbW5nMTI3IG1pbm1hZyAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkcW1uZzEyOCBtaW5tYWcgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtbmcxMjkgbWlubWFnIC0xMDAwIC1JbmYgICAtPiAtMTAwMAorZHFtbmcxMzAgbWlubWFnIC0xICAgIC1JbmYgICAtPiAtMQorZHFtbmcxMzEgbWlubWFnIC0wICAgIC1JbmYgICAtPiAtMAorZHFtbmcxMzIgbWlubWFnICAwICAgIC1JbmYgICAtPiAgMAorZHFtbmcxMzMgbWlubWFnICAxICAgIC1JbmYgICAtPiAgMQorZHFtbmcxMzQgbWlubWFnICAxMDAwIC1JbmYgICAtPiAgMTAwMAorZHFtbmcxMzUgbWlubWFnICBJbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitkcW1uZzE0MSBtaW5tYWcgIE5hTiAtSW5mICAgIC0+ICAtSW5maW5pdHkKK2RxbW5nMTQyIG1pbm1hZyAgTmFOIC0xMDAwICAgLT4gIC0xMDAwCitkcW1uZzE0MyBtaW5tYWcgIE5hTiAtMSAgICAgIC0+ICAtMQorZHFtbmcxNDQgbWlubWFnICBOYU4gLTAgICAgICAtPiAgLTAKK2RxbW5nMTQ1IG1pbm1hZyAgTmFOICAwICAgICAgLT4gIDAKK2RxbW5nMTQ2IG1pbm1hZyAgTmFOICAxICAgICAgLT4gIDEKK2RxbW5nMTQ3IG1pbm1hZyAgTmFOICAxMDAwICAgLT4gIDEwMDAKK2RxbW5nMTQ4IG1pbm1hZyAgTmFOICBJbmYgICAgLT4gIEluZmluaXR5CitkcW1uZzE0OSBtaW5tYWcgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxbW5nMTUwIG1pbm1hZyAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5CitkcW1uZzE1MSBtaW5tYWcgLTEwMDAgTmFOICAgIC0+IC0xMDAwCitkcW1uZzE1MiBtaW5tYWcgLTEgICAtTmFOICAgIC0+IC0xCitkcW1uZzE1MyBtaW5tYWcgLTAgICAgTmFOICAgIC0+IC0wCitkcW1uZzE1NCBtaW5tYWcgIDAgICAtTmFOICAgIC0+ICAwCitkcW1uZzE1NSBtaW5tYWcgIDEgICAgTmFOICAgIC0+ICAxCitkcW1uZzE1NiBtaW5tYWcgIDEwMDAgTmFOICAgIC0+ICAxMDAwCitkcW1uZzE1NyBtaW5tYWcgIEluZiAgTmFOICAgIC0+ICBJbmZpbml0eQorCitkcW1uZzE2MSBtaW5tYWcgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2MiBtaW5tYWcgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2MyBtaW5tYWcgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2NCBtaW5tYWcgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2NSBtaW5tYWcgLXNOYU4gIDAgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2NiBtaW5tYWcgLXNOYU4gIDEgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2NyBtaW5tYWcgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2OCBtaW5tYWcgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE2OSBtaW5tYWcgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3MCBtaW5tYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3MSBtaW5tYWcgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3MiBtaW5tYWcgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3MyBtaW5tYWcgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3NCBtaW5tYWcgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3NSBtaW5tYWcgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3NiBtaW5tYWcgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3NyBtaW5tYWcgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3OCBtaW5tYWcgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE3OSBtaW5tYWcgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxbW5nMTgxIG1pbm1hZyAgTmFOOSAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbW5nMTgyIG1pbm1hZyAtTmFOOCAgICA5OTkwICAtPiAgOTk5MAorZHFtbmcxODMgbWlubWFnICBOYU43MSAgIEluZiAgIC0+ICBJbmZpbml0eQorCitkcW1uZzE4NCBtaW5tYWcgIE5hTjEgICAgTmFONTQgLT4gIE5hTjEKK2RxbW5nMTg1IG1pbm1hZyAgTmFOMjIgIC1OYU41MyAtPiAgTmFOMjIKK2RxbW5nMTg2IG1pbm1hZyAtTmFOMyAgICBOYU42ICAtPiAtTmFOMworZHFtbmcxODcgbWlubWFnIC1OYU40NCAgIE5hTjcgIC0+IC1OYU40NAorCitkcW1uZzE4OCBtaW5tYWcgLUluZiAgICAgTmFONDEgLT4gLUluZmluaXR5CitkcW1uZzE4OSBtaW5tYWcgLTk5OTkgICAtTmFOMzMgLT4gLTk5OTkKK2RxbW5nMTkwIG1pbm1hZyAgSW5mICAgICBOYU4yICAtPiAgSW5maW5pdHkKKworZHFtbmcxOTEgbWlubWFnICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTkyIG1pbm1hZyAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE5MyBtaW5tYWcgLXNOYU45NyAgTmFOOCAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFtbmcxOTQgbWlubWFnICBzTmFONjkgc05hTjk0ICAtPiAgTmFONjkgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTk1IG1pbm1hZyAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE5NiBtaW5tYWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFtbmcxOTcgbWlubWFnICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5nMTk4IG1pbm1hZyAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcW1uZzE5OSBtaW5tYWcgIE5hTiAgICBzTmFOODYgIC0+ICBOYU44NiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvbGQgcm91bmRpbmcgY2hlY2tzCitkcW1uZzIyMSBtaW5tYWcgLTEyMzQ1Njc4MDAwIDEgIC0+IDEKK2RxbW5nMjIyIG1pbm1hZyAxIC0xMjM0NTY3ODAwMCAgLT4gMQorZHFtbmcyMjMgbWlubWFnIC0xMjM0NTY3ODAwICAxICAtPiAxCitkcW1uZzIyNCBtaW5tYWcgMSAtMTIzNDU2NzgwMCAgIC0+IDEKK2RxbW5nMjI1IG1pbm1hZyAtMTIzNDU2Nzg5MCAgMSAgLT4gMQorZHFtbmcyMjYgbWlubWFnIDEgLTEyMzQ1Njc4OTAgICAtPiAxCitkcW1uZzIyNyBtaW5tYWcgLTEyMzQ1Njc4OTEgIDEgIC0+IDEKK2RxbW5nMjI4IG1pbm1hZyAxIC0xMjM0NTY3ODkxICAgLT4gMQorZHFtbmcyMjkgbWlubWFnIC0xMjM0NTY3ODkwMSAxICAtPiAxCitkcW1uZzIzMCBtaW5tYWcgMSAtMTIzNDU2Nzg5MDEgIC0+IDEKK2RxbW5nMjMxIG1pbm1hZyAtMTIzNDU2Nzg5NiAgMSAgLT4gMQorZHFtbmcyMzIgbWlubWFnIDEgLTEyMzQ1Njc4OTYgICAtPiAxCitkcW1uZzIzMyBtaW5tYWcgMTIzNDU2Nzg5MSAgMSAgIC0+IDEKK2RxbW5nMjM0IG1pbm1hZyAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZHFtbmcyMzUgbWlubWFnIDEyMzQ1Njc4OTAxIDEgICAtPiAxCitkcW1uZzIzNiBtaW5tYWcgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK2RxbW5nMjM3IG1pbm1hZyAxMjM0NTY3ODk2ICAxICAgLT4gMQorZHFtbmcyMzggbWlubWFnIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKKy0tIGZyb20gZXhhbXBsZXMKK2RxbW5nMjgwIG1pbm1hZyAnMycgICAnMicgIC0+ICAnMicKK2RxbW5nMjgxIG1pbm1hZyAnLTEwJyAnMycgIC0+ICAnMycKK2RxbW5nMjgyIG1pbm1hZyAnMS4wJyAnMScgIC0+ICAnMS4wJworZHFtbmcyODMgbWlubWFnICcxJyAnMS4wJyAgLT4gICcxLjAnCitkcW1uZzI4NCBtaW5tYWcgJzcnICdOYU4nICAtPiAgJzcnCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorZHFtbmc0MDEgbWlubWFnICBJbmYgICAgMS4xICAgICAtPiAgMS4xCitkcW1uZzQwMiBtaW5tYWcgIDEuMSAgICAxICAgICAgIC0+ICAxCitkcW1uZzQwMyBtaW5tYWcgIDEgICAgICAxLjAgICAgIC0+ICAxLjAKK2RxbW5nNDA0IG1pbm1hZyAgMS4wICAgIDAuMSAgICAgLT4gIDAuMQorZHFtbmc0MDUgbWlubWFnICAwLjEgICAgMC4xMCAgICAtPiAgMC4xMAorZHFtbmc0MDYgbWlubWFnICAwLjEwICAgMC4xMDAgICAtPiAgMC4xMDAKK2RxbW5nNDA3IG1pbm1hZyAgMC4xMCAgIDAgICAgICAgLT4gIDAKK2RxbW5nNDA4IG1pbm1hZyAgMCAgICAgIDAuMCAgICAgLT4gIDAuMAorZHFtbmc0MDkgbWlubWFnICAwLjAgICAtMCAgICAgICAtPiAtMAorZHFtbmc0MTAgbWlubWFnICAwLjAgICAtMC4wICAgICAtPiAtMC4wCitkcW1uZzQxMSBtaW5tYWcgIDAuMDAgIC0wLjAgICAgIC0+IC0wLjAKK2RxbW5nNDEyIG1pbm1hZyAgMC4wICAgLTAuMDAgICAgLT4gLTAuMDAKK2RxbW5nNDEzIG1pbm1hZyAgMCAgICAgLTAuMCAgICAgLT4gLTAuMAorZHFtbmc0MTQgbWlubWFnICAwICAgICAtMCAgICAgICAtPiAtMAorZHFtbmc0MTUgbWlubWFnIC0wLjAgICAtMCAgICAgICAtPiAtMAorZHFtbmc0MTYgbWlubWFnIC0wICAgICAtMC4xMDAgICAtPiAtMAorZHFtbmc0MTcgbWlubWFnIC0wLjEwMCAtMC4xMCAgICAtPiAtMC4xMAorZHFtbmc0MTggbWlubWFnIC0wLjEwICAtMC4xICAgICAtPiAtMC4xCitkcW1uZzQxOSBtaW5tYWcgLTAuMSAgIC0xLjAgICAgIC0+IC0wLjEKK2RxbW5nNDIwIG1pbm1hZyAtMS4wICAgLTEgICAgICAgLT4gLTEKK2RxbW5nNDIxIG1pbm1hZyAtMSAgICAgLTEuMSAgICAgLT4gLTEKK2RxbW5nNDIzIG1pbm1hZyAtMS4xICAgLUluZiAgICAgLT4gLTEuMQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCitkcW1uZzQzMSBtaW5tYWcgIDEuMSAgICBJbmYgICAgIC0+ICAxLjEKK2RxbW5nNDMyIG1pbm1hZyAgMSAgICAgIDEuMSAgICAgLT4gIDEKK2RxbW5nNDMzIG1pbm1hZyAgMS4wICAgIDEgICAgICAgLT4gIDEuMAorZHFtbmc0MzQgbWlubWFnICAwLjEgICAgMS4wICAgICAtPiAgMC4xCitkcW1uZzQzNSBtaW5tYWcgIDAuMTAgICAwLjEgICAgIC0+ICAwLjEwCitkcW1uZzQzNiBtaW5tYWcgIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwMAorZHFtbmc0MzcgbWlubWFnICAwICAgICAgMC4xMCAgICAtPiAgMAorZHFtbmc0MzggbWlubWFnICAwLjAgICAgMCAgICAgICAtPiAgMC4wCitkcW1uZzQzOSBtaW5tYWcgLTAgICAgICAwLjAgICAgIC0+IC0wCitkcW1uZzQ0MCBtaW5tYWcgLTAuMCAgICAwLjAgICAgIC0+IC0wLjAKK2RxbW5nNDQxIG1pbm1hZyAtMC4wICAgIDAuMDAgICAgLT4gLTAuMAorZHFtbmc0NDIgbWlubWFnIC0wLjAwICAgMC4wICAgICAtPiAtMC4wMAorZHFtbmc0NDMgbWlubWFnIC0wLjAgICAgMCAgICAgICAtPiAtMC4wCitkcW1uZzQ0NCBtaW5tYWcgLTAgICAgICAwICAgICAgIC0+IC0wCitkcW1uZzQ0NSBtaW5tYWcgLTAgICAgIC0wLjAgICAgIC0+IC0wCitkcW1uZzQ0NiBtaW5tYWcgLTAuMTAwIC0wICAgICAgIC0+IC0wCitkcW1uZzQ0NyBtaW5tYWcgLTAuMTAgIC0wLjEwMCAgIC0+IC0wLjEwCitkcW1uZzQ0OCBtaW5tYWcgLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEKK2RxbW5nNDQ5IG1pbm1hZyAtMS4wICAgLTAuMSAgICAgLT4gLTAuMQorZHFtbmc0NTAgbWlubWFnIC0xICAgICAtMS4wICAgICAtPiAtMQorZHFtbmc0NTEgbWlubWFnIC0xLjEgICAtMSAgICAgICAtPiAtMQorZHFtbmc0NTMgbWlubWFnIC1JbmYgICAtMS4xICAgICAtPiAtMS4xCistLSBsYXJnaWVzCitkcW1uZzQ2MCBtaW5tYWcgIDEwMDAgICAxRSszICAgIC0+ICAxMDAwCitkcW1uZzQ2MSBtaW5tYWcgIDFFKzMgICAxMDAwICAgIC0+ICAxMDAwCitkcW1uZzQ2MiBtaW5tYWcgIDEwMDAgIC0xRSszICAgIC0+IC0xRSszCitkcW1uZzQ2MyBtaW5tYWcgIDFFKzMgICAtMzg0ICAgIC0+IC0zODQKK2RxbW5nNDY0IG1pbm1hZyAtMzg0ICAgIDFFKzMgICAgLT4gLTM4NAorZHFtbmc0NjUgbWlubWFnIC0xRSszICAgMTAwMCAgICAtPiAtMUUrMworZHFtbmc0NjYgbWlubWFnIC0zODQgICAtMUUrMyAgICAtPiAtMzg0CitkcW1uZzQ2NyBtaW5tYWcgLTFFKzMgICAtMzg0ICAgIC0+IC0zODQKKworLS0gc3Vibm9ybWFscworZHFtbmc1MTAgbWlubWFnICAxLjAwRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTEgbWlubWFnICAwLjFFLTYxNDMgICAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTIgbWlubWFnICAwLjEwRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTMgbWlubWFnICAwLjEwMEUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTQgbWlubWFnICAwLjAxRS02MTQzICAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTUgbWlubWFnICAwLjk5OUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTYgbWlubWFnICAwLjA5OUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTcgbWlubWFnICAwLjAwOUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTggbWlubWFnICAwLjAwMUUtNjE0MyAgICAgIDAgIC0+ICAgMAorZHFtbmc1MTkgbWlubWFnICAwLjAwMDlFLTYxNDMgICAgIDAgIC0+ICAgMAorZHFtbmc1MjAgbWlubWFnICAwLjAwMDFFLTYxNDMgICAgIDAgIC0+ICAgMAorCitkcW1uZzUzMCBtaW5tYWcgLTEuMDBFLTYxNDMgICAgICAgMCAgLT4gICAwCitkcW1uZzUzMSBtaW5tYWcgLTAuMUUtNjE0MyAgICAgICAgMCAgLT4gICAwCitkcW1uZzUzMiBtaW5tYWcgLTAuMTBFLTYxNDMgICAgICAgMCAgLT4gICAwCitkcW1uZzUzMyBtaW5tYWcgLTAuMTAwRS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUzNCBtaW5tYWcgLTAuMDFFLTYxNDMgICAgICAgMCAgLT4gICAwCitkcW1uZzUzNSBtaW5tYWcgLTAuOTk5RS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUzNiBtaW5tYWcgLTAuMDk5RS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUzNyBtaW5tYWcgLTAuMDA5RS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUzOCBtaW5tYWcgLTAuMDAxRS02MTQzICAgICAgMCAgLT4gICAwCitkcW1uZzUzOSBtaW5tYWcgLTAuMDAwOUUtNjE0MyAgICAgMCAgLT4gICAwCitkcW1uZzU0MCBtaW5tYWcgLTAuMDAwMUUtNjE0MyAgICAgMCAgLT4gICAwCisKKworLS0gTnVsbCB0ZXN0cworZHFtbmc5MDAgbWlubWFnIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtbmc5MDEgbWlubWFnICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1pbnVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTWludXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmU0NjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU1pbnVzLmRlY1Rlc3QKQEAgLTAsMCArMSw4OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcU1pbnVzLmRlY1Rlc3QgLS0gZGVjUXVhZCAwLXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2RxbW5zMDAxIG1pbnVzICAgICAgICs3LjUwICAtPiAtNy41MAorCistLSBJbmZpbml0aWVzCitkcW1uczAxMSBtaW51cyAgSW5maW5pdHkgICAgLT4gLUluZmluaXR5CitkcW1uczAxMiBtaW51cyAgLUluZmluaXR5ICAgLT4gSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkcW1uczAyMSBtaW51cyAgICAgICAgIE5hTiAgLT4gTmFOCitkcW1uczAyMiBtaW51cyAgICAgICAgLU5hTiAgLT4gLU5hTgorZHFtbnMwMjMgbWludXMgICAgICAgIHNOYU4gIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5zMDI0IG1pbnVzICAgICAgIC1zTmFOICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMsIG5vbi0wIHBheWxvYWQKK2RxbW5zMDMxIG1pbnVzICAgICAgIE5hTjEzICAtPiBOYU4xMworZHFtbnMwMzIgbWludXMgICAgICAtTmFOMTMgIC0+IC1OYU4xMworZHFtbnMwMzMgbWludXMgICAgICBzTmFOMTMgIC0+IE5hTjEzICAgSW52YWxpZF9vcGVyYXRpb24KK2RxbW5zMDM0IG1pbnVzICAgICAtc05hTjEzICAtPiAtTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkcW1uczAzNSBtaW51cyAgICAgICBOYU43MCAgLT4gTmFONzAKK2RxbW5zMDM2IG1pbnVzICAgICAgLU5hTjcwICAtPiAtTmFONzAKK2RxbW5zMDM3IG1pbnVzICAgICAgc05hTjEwMSAtPiBOYU4xMDEgIEludmFsaWRfb3BlcmF0aW9uCitkcW1uczAzOCBtaW51cyAgICAgLXNOYU4xMDEgLT4gLU5hTjEwMSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmaW5pdGVzCitkcW1uczEwMSBtaW51cyAgICAgICAgICA3ICAgLT4gLTcKK2RxbW5zMTAyIG1pbnVzICAgICAgICAgLTcgICAtPiA3CitkcW1uczEwMyBtaW51cyAgICAgICAgIDc1ICAgLT4gLTc1CitkcW1uczEwNCBtaW51cyAgICAgICAgLTc1ICAgLT4gNzUKK2RxbW5zMTA1IG1pbnVzICAgICAgIDcuNTAgICAtPiAtNy41MAorZHFtbnMxMDYgbWludXMgICAgICAtNy41MCAgIC0+IDcuNTAKK2RxbW5zMTA3IG1pbnVzICAgICAgIDcuNTAwICAtPiAtNy41MDAKK2RxbW5zMTA4IG1pbnVzICAgICAgLTcuNTAwICAtPiA3LjUwMAorCistLSB6ZXJvcworZHFtbnMxMTEgbWludXMgICAgICAgICAgMCAgIC0+IDAKK2RxbW5zMTEyIG1pbnVzICAgICAgICAgLTAgICAtPiAwCitkcW1uczExMyBtaW51cyAgICAgICAwRSs0ICAgLT4gMEUrNAorZHFtbnMxMTQgbWludXMgICAgICAtMEUrNCAgIC0+IDBFKzQKK2RxbW5zMTE1IG1pbnVzICAgICAwLjAwMDAgICAtPiAwLjAwMDAKK2RxbW5zMTE2IG1pbnVzICAgIC0wLjAwMDAgICAtPiAwLjAwMDAKK2RxbW5zMTE3IG1pbnVzICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RxbW5zMTE4IG1pbnVzICAgICAtMEUtMTQxICAtPiAwRS0xNDEKKworLS0gZnVsbCBjb2VmZmljaWVudHMsIGFsdGVybmF0aW5nIGJpdHMKK2RxbW5zMTIxIG1pbnVzICAgMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MiAgICAtPiAtMjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MjY4MgorZHFtbnMxMjIgbWludXMgIC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+ICAyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcW1uczEyMyBtaW51cyAgIDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKK2RxbW5zMTI0IG1pbnVzICAtMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAgICAtPiAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorCistLSBObWF4LCBObWluLCBOdGlueQorZHFtbnMxMzEgbWludXMgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW1uczEzMiBtaW51cyAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE0MworZHFtbnMxMzMgbWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcW1uczEzNCBtaW51cyAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE3NiBTdWJub3JtYWwKKworZHFtbnMxMzUgbWludXMgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNzYgU3Vibm9ybWFsCitkcW1uczEzNiBtaW51cyAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxbW5zMTM3IG1pbnVzICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTQzCitkcW1uczEzOCBtaW51cyAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNdWx0aXBseS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU11bHRpcGx5LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM4N2E4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFNdWx0aXBseS5kZWNUZXN0CkBAIC0wLDAgKzEsNTg5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxTXVsdGlwbHkuZGVjVGVzdCAtLSBkZWNRdWFkIG11bHRpcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgYXJlIGZvciBkZWNRdWFkcyBvbmx5OyBhbGwgYXJndW1lbnRzIGFyZQorLS0gcmVwcmVzZW50YWJsZSBpbiBhIGRlY1F1YWQKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIHNhbml0eSBjaGVja3MKK2RxbXVsMDAwIG11bHRpcGx5IDIgICAgICAyIC0+IDQKK2RxbXVsMDAxIG11bHRpcGx5IDIgICAgICAzIC0+IDYKK2RxbXVsMDAyIG11bHRpcGx5IDUgICAgICAxIC0+IDUKK2RxbXVsMDAzIG11bHRpcGx5IDUgICAgICAyIC0+IDEwCitkcW11bDAwNCBtdWx0aXBseSAxLjIwICAgMiAtPiAyLjQwCitkcW11bDAwNSBtdWx0aXBseSAxLjIwICAgMCAtPiAwLjAwCitkcW11bDAwNiBtdWx0aXBseSAxLjIwICAtMiAtPiAtMi40MAorZHFtdWwwMDcgbXVsdGlwbHkgLTEuMjAgIDIgLT4gLTIuNDAKK2RxbXVsMDA4IG11bHRpcGx5IC0xLjIwICAwIC0+IC0wLjAwCitkcW11bDAwOSBtdWx0aXBseSAtMS4yMCAtMiAtPiAyLjQwCitkcW11bDAxMCBtdWx0aXBseSA1LjA5IDcuMSAtPiAzNi4xMzkKK2RxbXVsMDExIG11bHRpcGx5IDIuNSAgICA0IC0+IDEwLjAKK2RxbXVsMDEyIG11bHRpcGx5IDIuNTAgICA0IC0+IDEwLjAwCitkcW11bDAxMyBtdWx0aXBseSAxLjIzNDU2Nzg5IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxLjIzNDU2Nzg5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBSb3VuZGVkCitkcW11bDAxNSBtdWx0aXBseSAyLjUwICAgNCAtPiAxMC4wMAorZHFtdWwwMTYgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5OTkgIDkuOTk5OTk5OTk5OTk5OTk5OTkgLT4gIDk5Ljk5OTk5OTk5OTk5OTk5OTgwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFtdWwwMTcgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5OTkgLTkuOTk5OTk5OTk5OTk5OTk5OTkgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5OTgwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFtdWwwMTggbXVsdGlwbHkgLTkuOTk5OTk5OTk5OTk5OTk5OTkgIDkuOTk5OTk5OTk5OTk5OTk5OTkgLT4gLTk5Ljk5OTk5OTk5OTk5OTk5OTgwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFtdWwwMTkgbXVsdGlwbHkgLTkuOTk5OTk5OTk5OTk5OTk5OTkgLTkuOTk5OTk5OTk5OTk5OTk5OTkgLT4gIDk5Ljk5OTk5OTk5OTk5OTk5OTgwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSB6ZXJvcywgZXRjLgorZHFtdWwwMjEgbXVsdGlwbHkgIDAgICAgICAwICAgICAtPiAgMAorZHFtdWwwMjIgbXVsdGlwbHkgIDAgICAgIC0wICAgICAtPiAtMAorZHFtdWwwMjMgbXVsdGlwbHkgLTAgICAgICAwICAgICAtPiAtMAorZHFtdWwwMjQgbXVsdGlwbHkgLTAgICAgIC0wICAgICAtPiAgMAorZHFtdWwwMjUgbXVsdGlwbHkgLTAuMCAgIC0wLjAgICAtPiAgMC4wMAorZHFtdWwwMjYgbXVsdGlwbHkgLTAuMCAgIC0wLjAgICAtPiAgMC4wMAorZHFtdWwwMjcgbXVsdGlwbHkgLTAuMCAgIC0wLjAgICAtPiAgMC4wMAorZHFtdWwwMjggbXVsdGlwbHkgLTAuMCAgIC0wLjAgICAtPiAgMC4wMAorZHFtdWwwMzAgbXVsdGlwbHkgIDUuMDAgICAxRS0zICAtPiAgMC4wMDUwMAorZHFtdWwwMzEgbXVsdGlwbHkgIDAwLjAwICAwLjAwMCAtPiAgMC4wMDAwMAorZHFtdWwwMzIgbXVsdGlwbHkgIDAwLjAwICAwRS0zICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RxbXVsMDMzIG11bHRpcGx5ICAwRS0zICAgMDAuMDAgLT4gIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCitkcW11bDAzNCBtdWx0aXBseSAtNS4wMCAgIDFFLTMgIC0+IC0wLjAwNTAwCitkcW11bDAzNSBtdWx0aXBseSAtMDAuMDAgIDAuMDAwIC0+IC0wLjAwMDAwCitkcW11bDAzNiBtdWx0aXBseSAtMDAuMDAgIDBFLTMgIC0+IC0wLjAwMDAwICAgICAtLSByaHMgaXMgMAorZHFtdWwwMzcgbXVsdGlwbHkgLTBFLTMgICAwMC4wMCAtPiAtMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2RxbXVsMDM4IG11bHRpcGx5ICA1LjAwICAtMUUtMyAgLT4gLTAuMDA1MDAKK2RxbXVsMDM5IG11bHRpcGx5ICAwMC4wMCAtMC4wMDAgLT4gLTAuMDAwMDAKK2RxbXVsMDQwIG11bHRpcGx5ICAwMC4wMCAtMEUtMyAgLT4gLTAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitkcW11bDA0MSBtdWx0aXBseSAgMEUtMyAgLTAwLjAwIC0+IC0wLjAwMDAwICAgICAtLSBsaHMgaXMgMAorZHFtdWwwNDIgbXVsdGlwbHkgLTUuMDAgIC0xRS0zICAtPiAgMC4wMDUwMAorZHFtdWwwNDMgbXVsdGlwbHkgLTAwLjAwIC0wLjAwMCAtPiAgMC4wMDAwMAorZHFtdWwwNDQgbXVsdGlwbHkgLTAwLjAwIC0wRS0zICAtPiAgMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK2RxbXVsMDQ1IG11bHRpcGx5IC0wRS0zICAtMDAuMDAgLT4gIDAuMDAwMDAgICAgIC0tIGxocyBpcyAwCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjYXJpdGgKK2RxbXVsMDUwIG11bHRpcGx5IDEuMjAgMyAgICAgICAgLT4gMy42MAorZHFtdWwwNTEgbXVsdGlwbHkgNyAgICAzICAgICAgICAtPiAyMQorZHFtdWwwNTIgbXVsdGlwbHkgMC45ICAwLjggICAgICAtPiAwLjcyCitkcW11bDA1MyBtdWx0aXBseSAwLjkgIC0wICAgICAgIC0+IC0wLjAKK2RxbXVsMDU0IG11bHRpcGx5IDY1NDMyMSA2NTQzMjEgLT4gNDI4MTM1OTcxMDQxCisKK2RxbXVsMDYwIG11bHRpcGx5IDEyMy40NSAxZTcgIC0+ICAxLjIzNDVFKzkKK2RxbXVsMDYxIG11bHRpcGx5IDEyMy40NSAxZTggIC0+ICAxLjIzNDVFKzEwCitkcW11bDA2MiBtdWx0aXBseSAxMjMuNDUgMWUrOSAtPiAgMS4yMzQ1RSsxMQorZHFtdWwwNjMgbXVsdGlwbHkgMTIzLjQ1IDFlMTAgLT4gIDEuMjM0NUUrMTIKK2RxbXVsMDY0IG11bHRpcGx5IDEyMy40NSAxZTExIC0+ICAxLjIzNDVFKzEzCitkcW11bDA2NSBtdWx0aXBseSAxMjMuNDUgMWUxMiAtPiAgMS4yMzQ1RSsxNAorZHFtdWwwNjYgbXVsdGlwbHkgMTIzLjQ1IDFlMTMgLT4gIDEuMjM0NUUrMTUKKworCistLSB0ZXN0IHNvbWUgaW50ZXJtZWRpYXRlIGxlbmd0aHMKKy0tICAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkcW11bDA4MCBtdWx0aXBseSAwLjEgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKK2RxbXVsMDg0IG11bHRpcGx5IDAuMSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAtPiAxMjMwMTIzNDU2NDU2NzguOQorZHFtdWwwOTAgbXVsdGlwbHkgMTIzMDEyMzQ1NjQ1Njc4OSAgICAgMC4xIC0+IDEyMzAxMjM0NTY0NTY3OC45CitkcW11bDA5NCBtdWx0aXBseSAxMjMwMTIzNDU2NDU2Nzg5ICAgICAwLjEgLT4gMTIzMDEyMzQ1NjQ1Njc4LjkKKworLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyBhbmQgY2FycmllcworZHFtdWwxMDEgbXVsdGlwbHkgOSA5ICAgLT4gODEKK2RxbXVsMTAyIG11bHRpcGx5IDkgOTAgICAtPiA4MTAKK2RxbXVsMTAzIG11bHRpcGx5IDkgOTAwICAgLT4gODEwMAorZHFtdWwxMDQgbXVsdGlwbHkgOSA5MDAwICAgLT4gODEwMDAKK2RxbXVsMTA1IG11bHRpcGx5IDkgOTAwMDAgICAtPiA4MTAwMDAKK2RxbXVsMTA2IG11bHRpcGx5IDkgOTAwMDAwICAgLT4gODEwMDAwMAorZHFtdWwxMDcgbXVsdGlwbHkgOSA5MDAwMDAwICAgLT4gODEwMDAwMDAKK2RxbXVsMTA4IG11bHRpcGx5IDkgOTAwMDAwMDAgICAtPiA4MTAwMDAwMDAKK2RxbXVsMTA5IG11bHRpcGx5IDkgOTAwMDAwMDAwICAgLT4gODEwMDAwMDAwMAorZHFtdWwxMTAgbXVsdGlwbHkgOSA5MDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAKK2RxbXVsMTExIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAKK2RxbXVsMTEyIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMAorZHFtdWwxMTMgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAKK2RxbXVsMTE0IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAKK2RxbXVsMTE1IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMAorLS1kcW11bDExNiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMAorLS1kcW11bDExNyBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTE4IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMAorLS1kcW11bDExOSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMAorLS1kcW11bDEyMCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwCistLWRxbXVsMTIxIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS1kcW11bDEyMiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS1kcW11bDEyMyBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCistLSB0ZXN0IHNvbWUgbW9yZSBlZGdlIGNhc2VzIHdpdGhvdXQgY2FycmllcworZHFtdWwxMzEgbXVsdGlwbHkgMyAzICAgLT4gOQorZHFtdWwxMzIgbXVsdGlwbHkgMyAzMCAgIC0+IDkwCitkcW11bDEzMyBtdWx0aXBseSAzIDMwMCAgIC0+IDkwMAorZHFtdWwxMzQgbXVsdGlwbHkgMyAzMDAwICAgLT4gOTAwMAorZHFtdWwxMzUgbXVsdGlwbHkgMyAzMDAwMCAgIC0+IDkwMDAwCitkcW11bDEzNiBtdWx0aXBseSAzIDMwMDAwMCAgIC0+IDkwMDAwMAorZHFtdWwxMzcgbXVsdGlwbHkgMyAzMDAwMDAwICAgLT4gOTAwMDAwMAorZHFtdWwxMzggbXVsdGlwbHkgMyAzMDAwMDAwMCAgIC0+IDkwMDAwMDAwCitkcW11bDEzOSBtdWx0aXBseSAzIDMwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMAorZHFtdWwxNDAgbXVsdGlwbHkgMyAzMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMAorZHFtdWwxNDEgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwCitkcW11bDE0MiBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMAorZHFtdWwxNDMgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMAorZHFtdWwxNDQgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwCitkcW11bDE0NSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMAorZHFtdWwxNDYgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMAorZHFtdWwxNDcgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMDAwCitkcW11bDE0OCBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxNDkgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxNTAgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDE1MSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxNTIgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxNTMgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKK2RxbXVsMjYzIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMTk5MjgyOTYgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3Qgc29tZSBlZGdlIGNhc2VzIHdpdGggZXhhY3Qgcm91bmRpbmcKK2RxbXVsMzAxIG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5ICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDIgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzAzIG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzA0IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDUgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzA2IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzA3IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMDggbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzA5IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzEwIG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTEgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzEyIG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzEzIG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTQgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwIDkwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzE1IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAgICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMzE2IG11bHRpcGx5IDkwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwzMTcgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0ICBSb3VuZGVkCitkcW11bDMxOCBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM1ICBSb3VuZGVkCitkcW11bDMxOSBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNiAgUm91bmRlZAorZHFtdWwzMjAgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM3ICBSb3VuZGVkCitkcW11bDMyMSBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4ICBSb3VuZGVkCitkcW11bDMyMiBtdWx0aXBseSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszOSAgUm91bmRlZAorZHFtdWwzMjMgbXVsdGlwbHkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCA5MDAwMDAwMDAwMDAwMDAwICAgLT4gOC4xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzQwICBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCitkcW11bDUwNCAgbXVsdGlwbHkgIDBFLTQyNjAgMTAwMEUtNDI2MCAgLT4gMEUtNjE3NiBDbGFtcGVkCitkcW11bDUwNSAgbXVsdGlwbHkgIDEwMEUrNDI2MCAwRSs0MjYwICAgLT4gMEUrNjExMSBDbGFtcGVkCisKKy0tIG1peGVkIHdpdGggemVyb3MKK2RxbXVsNTQxIG11bHRpcGx5ICAwICAgIC0xICAgICAtPiAtMAorZHFtdWw1NDIgbXVsdGlwbHkgLTAgICAgLTEgICAgIC0+ICAwCitkcW11bDU0MyBtdWx0aXBseSAgMCAgICAgMSAgICAgLT4gIDAKK2RxbXVsNTQ0IG11bHRpcGx5IC0wICAgICAxICAgICAtPiAtMAorZHFtdWw1NDUgbXVsdGlwbHkgLTEgICAgIDAgICAgIC0+IC0wCitkcW11bDU0NiBtdWx0aXBseSAtMSAgICAtMCAgICAgLT4gIDAKK2RxbXVsNTQ3IG11bHRpcGx5ICAxICAgICAwICAgICAtPiAgMAorZHFtdWw1NDggbXVsdGlwbHkgIDEgICAgLTAgICAgIC0+IC0wCisKK2RxbXVsNTUxIG11bHRpcGx5ICAwLjAgIC0xICAgICAtPiAtMC4wCitkcW11bDU1MiBtdWx0aXBseSAtMC4wICAtMSAgICAgLT4gIDAuMAorZHFtdWw1NTMgbXVsdGlwbHkgIDAuMCAgIDEgICAgIC0+ICAwLjAKK2RxbXVsNTU0IG11bHRpcGx5IC0wLjAgICAxICAgICAtPiAtMC4wCitkcW11bDU1NSBtdWx0aXBseSAtMS4wICAgMCAgICAgLT4gLTAuMAorZHFtdWw1NTYgbXVsdGlwbHkgLTEuMCAgLTAgICAgIC0+ICAwLjAKK2RxbXVsNTU3IG11bHRpcGx5ICAxLjAgICAwICAgICAtPiAgMC4wCitkcW11bDU1OCBtdWx0aXBseSAgMS4wICAtMCAgICAgLT4gLTAuMAorCitkcW11bDU2MSBtdWx0aXBseSAgMCAgICAtMS4wICAgLT4gLTAuMAorZHFtdWw1NjIgbXVsdGlwbHkgLTAgICAgLTEuMCAgIC0+ICAwLjAKK2RxbXVsNTYzIG11bHRpcGx5ICAwICAgICAxLjAgICAtPiAgMC4wCitkcW11bDU2NCBtdWx0aXBseSAtMCAgICAgMS4wICAgLT4gLTAuMAorZHFtdWw1NjUgbXVsdGlwbHkgLTEgICAgIDAuMCAgIC0+IC0wLjAKK2RxbXVsNTY2IG11bHRpcGx5IC0xICAgIC0wLjAgICAtPiAgMC4wCitkcW11bDU2NyBtdWx0aXBseSAgMSAgICAgMC4wICAgLT4gIDAuMAorZHFtdWw1NjggbXVsdGlwbHkgIDEgICAgLTAuMCAgIC0+IC0wLjAKKworZHFtdWw1NzEgbXVsdGlwbHkgIDAuMCAgLTEuMCAgIC0+IC0wLjAwCitkcW11bDU3MiBtdWx0aXBseSAtMC4wICAtMS4wICAgLT4gIDAuMDAKK2RxbXVsNTczIG11bHRpcGx5ICAwLjAgICAxLjAgICAtPiAgMC4wMAorZHFtdWw1NzQgbXVsdGlwbHkgLTAuMCAgIDEuMCAgIC0+IC0wLjAwCitkcW11bDU3NSBtdWx0aXBseSAtMS4wICAgMC4wICAgLT4gLTAuMDAKK2RxbXVsNTc2IG11bHRpcGx5IC0xLjAgIC0wLjAgICAtPiAgMC4wMAorZHFtdWw1NzcgbXVsdGlwbHkgIDEuMCAgIDAuMCAgIC0+ICAwLjAwCitkcW11bDU3OCBtdWx0aXBseSAgMS4wICAtMC4wICAgLT4gLTAuMDAKKworCistLSBTcGVjaWFscworZHFtdWw1ODAgbXVsdGlwbHkgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtdWw1ODEgbXVsdGlwbHkgIEluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZHFtdWw1ODIgbXVsdGlwbHkgIEluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFtdWw1ODMgbXVsdGlwbHkgIEluZiAgLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDU4NCBtdWx0aXBseSAgSW5mICAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNTg1IG11bHRpcGx5ICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2RxbXVsNTg2IG11bHRpcGx5ICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK2RxbXVsNTg3IG11bHRpcGx5ICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxbXVsNTg4IG11bHRpcGx5IC0xMDAwICBJbmYgICAtPiAtSW5maW5pdHkKK2RxbXVsNTg5IG11bHRpcGx5IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK2RxbXVsNTkwIG11bHRpcGx5IC0xICAgICBJbmYgICAtPiAtSW5maW5pdHkKK2RxbXVsNTkxIG11bHRpcGx5IC0wICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw1OTIgbXVsdGlwbHkgIDAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDU5MyBtdWx0aXBseSAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitkcW11bDU5NCBtdWx0aXBseSAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitkcW11bDU5NSBtdWx0aXBseSAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxbXVsNjAwIG11bHRpcGx5IC1JbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK2RxbXVsNjAxIG11bHRpcGx5IC1JbmYgIC0xMDAwICAtPiAgSW5maW5pdHkKK2RxbXVsNjAyIG11bHRpcGx5IC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2RxbXVsNjAzIG11bHRpcGx5IC1JbmYgIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2MDQgbXVsdGlwbHkgLUluZiAgIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDYwNSBtdWx0aXBseSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkcW11bDYwNiBtdWx0aXBseSAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkcW11bDYwNyBtdWx0aXBseSAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkcW11bDYwOCBtdWx0aXBseSAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CitkcW11bDYwOSBtdWx0aXBseSAtSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitkcW11bDYxMCBtdWx0aXBseSAtMSAgICAtSW5mICAgLT4gIEluZmluaXR5CitkcW11bDYxMSBtdWx0aXBseSAtMCAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjEyIG11bHRpcGx5ICAwICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2MTMgbXVsdGlwbHkgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtdWw2MTQgbXVsdGlwbHkgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFtdWw2MTUgbXVsdGlwbHkgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorCitkcW11bDYyMSBtdWx0aXBseSAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFtdWw2MjIgbXVsdGlwbHkgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2RxbXVsNjIzIG11bHRpcGx5ICBOYU4gLTEgICAgICAtPiAgTmFOCitkcW11bDYyNCBtdWx0aXBseSAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFtdWw2MjUgbXVsdGlwbHkgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2RxbXVsNjI2IG11bHRpcGx5ICBOYU4gIDEgICAgICAtPiAgTmFOCitkcW11bDYyNyBtdWx0aXBseSAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFtdWw2MjggbXVsdGlwbHkgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2RxbXVsNjI5IG11bHRpcGx5ICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcW11bDYzMCBtdWx0aXBseSAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFtdWw2MzEgbXVsdGlwbHkgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2RxbXVsNjMyIG11bHRpcGx5IC0xICAgIE5hTiAgICAtPiAgTmFOCitkcW11bDYzMyBtdWx0aXBseSAtMCAgICBOYU4gICAgLT4gIE5hTgorZHFtdWw2MzQgbXVsdGlwbHkgIDAgICAgTmFOICAgIC0+ICBOYU4KK2RxbXVsNjM1IG11bHRpcGx5ICAxICAgIE5hTiAgICAtPiAgTmFOCitkcW11bDYzNiBtdWx0aXBseSAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFtdWw2MzcgbXVsdGlwbHkgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFtdWw2NDEgbXVsdGlwbHkgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY0MiBtdWx0aXBseSAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjQzIG11bHRpcGx5ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NDQgbXVsdGlwbHkgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY0NSBtdWx0aXBseSAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjQ2IG11bHRpcGx5ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NDcgbXVsdGlwbHkgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY0OCBtdWx0aXBseSAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjQ5IG11bHRpcGx5ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NTAgbXVsdGlwbHkgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY1MSBtdWx0aXBseSAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjUyIG11bHRpcGx5IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NTMgbXVsdGlwbHkgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY1NCBtdWx0aXBseSAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjU1IG11bHRpcGx5ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NTYgbXVsdGlwbHkgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDY1NyBtdWx0aXBseSAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjU4IG11bHRpcGx5ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2NTkgbXVsdGlwbHkgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxbXVsNjYxIG11bHRpcGx5ICBOYU45IC1JbmYgICAtPiAgTmFOOQorZHFtdWw2NjIgbXVsdGlwbHkgIE5hTjggIDk5OSAgIC0+ICBOYU44CitkcW11bDY2MyBtdWx0aXBseSAgTmFONzEgSW5mICAgLT4gIE5hTjcxCitkcW11bDY2NCBtdWx0aXBseSAgTmFONiAgTmFONSAgLT4gIE5hTjYKK2RxbXVsNjY1IG11bHRpcGx5IC1JbmYgICBOYU40ICAtPiAgTmFONAorZHFtdWw2NjYgbXVsdGlwbHkgLTk5OSAgIE5hTjMzIC0+ICBOYU4zMworZHFtdWw2NjcgbXVsdGlwbHkgIEluZiAgIE5hTjIgIC0+ICBOYU4yCisKK2RxbXVsNjcxIG11bHRpcGx5ICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjcyIG11bHRpcGx5ICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjczIG11bHRpcGx5ICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjc0IG11bHRpcGx5ICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjc1IG11bHRpcGx5ICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjc2IG11bHRpcGx5IC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjc3IG11bHRpcGx5ICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjc4IG11bHRpcGx5ICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNjc5IG11bHRpcGx5ICBOYU4gICAgc05hTjg5ICAtPiAgTmFOODkgSW52YWxpZF9vcGVyYXRpb24KKworZHFtdWw2ODEgbXVsdGlwbHkgLU5hTjkgLUluZiAgIC0+IC1OYU45CitkcW11bDY4MiBtdWx0aXBseSAtTmFOOCAgOTk5ICAgLT4gLU5hTjgKK2RxbXVsNjgzIG11bHRpcGx5IC1OYU43MSBJbmYgICAtPiAtTmFONzEKK2RxbXVsNjg0IG11bHRpcGx5IC1OYU42IC1OYU41ICAtPiAtTmFONgorZHFtdWw2ODUgbXVsdGlwbHkgLUluZiAgLU5hTjQgIC0+IC1OYU40CitkcW11bDY4NiBtdWx0aXBseSAtOTk5ICAtTmFOMzMgLT4gLU5hTjMzCitkcW11bDY4NyBtdWx0aXBseSAgSW5mICAtTmFOMiAgLT4gLU5hTjIKKworZHFtdWw2OTEgbXVsdGlwbHkgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTIgbXVsdGlwbHkgLXNOYU45OCAtMTEgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTMgbXVsdGlwbHkgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTQgbXVsdGlwbHkgLXNOYU4xNiAtc05hTjk0IC0+IC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTUgbXVsdGlwbHkgLU5hTjk1ICAtc05hTjkzIC0+IC1OYU45MyBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTYgbXVsdGlwbHkgLUluZiAgICAtc05hTjkyIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTcgbXVsdGlwbHkgIDA4OCAgICAtc05hTjkxIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTggbXVsdGlwbHkgIEluZiAgICAtc05hTjkwIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw2OTkgbXVsdGlwbHkgLU5hTiAgICAtc05hTjg5IC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitkcW11bDcwMSBtdWx0aXBseSAtTmFOICAtSW5mICAgLT4gLU5hTgorZHFtdWw3MDIgbXVsdGlwbHkgLU5hTiAgIDk5OSAgIC0+IC1OYU4KK2RxbXVsNzAzIG11bHRpcGx5IC1OYU4gICBJbmYgICAtPiAtTmFOCitkcW11bDcwNCBtdWx0aXBseSAtTmFOICAtTmFOICAgLT4gLU5hTgorZHFtdWw3MDUgbXVsdGlwbHkgLUluZiAgLU5hTjAgIC0+IC1OYU4KK2RxbXVsNzA2IG11bHRpcGx5IC05OTkgIC1OYU4gICAtPiAtTmFOCitkcW11bDcwNyBtdWx0aXBseSAgSW5mICAtTmFOICAgLT4gLU5hTgorCitkcW11bDcxMSBtdWx0aXBseSAtc05hTiAgIC1JbmYgICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw3MTIgbXVsdGlwbHkgLXNOYU4gICAtMTEgICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNzEzIG11bHRpcGx5IC1zTmFOMDAgIE5hTiAgICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDcxNCBtdWx0aXBseSAtc05hTiAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw3MTUgbXVsdGlwbHkgLU5hTiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNzE2IG11bHRpcGx5IC1JbmYgICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW11bDcxNyBtdWx0aXBseSAgMDg4ICAgIC1zTmFOICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw3MTggbXVsdGlwbHkgIEluZiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxbXVsNzE5IG11bHRpcGx5IC1OYU4gICAgLXNOYU4gICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgLi4gbm90ZSBzdWJub3JtYWwgcmVzdWx0cworLS0gc2lnbnMKK2RxbXVsNzUxIG11bHRpcGx5ICAxZSs0Mjc3ICAxZSszMzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsNzUyIG11bHRpcGx5ICAxZSs0Mjc3IC0xZSszMzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsNzUzIG11bHRpcGx5IC0xZSs0Mjc3ICAxZSszMzExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsNzU0IG11bHRpcGx5IC0xZSs0Mjc3IC0xZSszMzExIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsNzU1IG11bHRpcGx5ICAxZS00Mjc3ICAxZS0zMzExIC0+ICAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbXVsNzU2IG11bHRpcGx5ICAxZS00Mjc3IC0xZS0zMzExIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbXVsNzU3IG11bHRpcGx5IC0xZS00Mjc3ICAxZS0zMzExIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbXVsNzU4IG11bHRpcGx5IC0xZS00Mjc3IC0xZS0zMzExIC0+ICAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gJ3N1Ym5vcm1hbCcgYm91bmRhcnkgKGFsbCBoYXJkIHVuZGVyZmxvdyBvciBvdmVyZmxvdyBpbiBiYXNlIGFyaXRoZW10aWMpCitkcW11bDc2MCBtdWx0aXBseSAxZS02MDY5IDFlLTEwMSAtPiAxRS02MTcwIFN1Ym5vcm1hbAorZHFtdWw3NjEgbXVsdGlwbHkgMWUtNjA2OSAxZS0xMDIgLT4gMUUtNjE3MSBTdWJub3JtYWwKK2RxbXVsNzYyIG11bHRpcGx5IDFlLTYwNjkgMWUtMTAzIC0+IDFFLTYxNzIgU3Vibm9ybWFsCitkcW11bDc2MyBtdWx0aXBseSAxZS02MDY5IDFlLTEwNCAtPiAxRS02MTczIFN1Ym5vcm1hbAorZHFtdWw3NjQgbXVsdGlwbHkgMWUtNjA2OSAxZS0xMDUgLT4gMUUtNjE3NCBTdWJub3JtYWwKK2RxbXVsNzY1IG11bHRpcGx5IDFlLTYwNjkgMWUtMTA2IC0+IDFFLTYxNzUgU3Vibm9ybWFsCitkcW11bDc2NiBtdWx0aXBseSAxZS02MDY5IDFlLTEwNyAtPiAxRS02MTc2IFN1Ym5vcm1hbAorZHFtdWw3NjcgbXVsdGlwbHkgMWUtNjA2OSAxZS0xMDggLT4gMEUtNjE3NiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkcW11bDc2OCBtdWx0aXBseSAxZS02MDY5IDFlLTEwOSAtPiAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbXVsNzY5IG11bHRpcGx5IDFlLTYwNjkgMWUtMTEwIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorLS0gW25vIGVxdWl2YWxlbnQgb2YgJ3N1Ym5vcm1hbCcgZm9yIG92ZXJmbG93XQorZHFtdWw3NzAgbXVsdGlwbHkgMWUrNDAgMWUrNjEwMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MSBDbGFtcGVkCitkcW11bDc3MSBtdWx0aXBseSAxZSs0MCAxZSs2MTAyIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MiAgQ2xhbXBlZAorZHFtdWw3NzIgbXVsdGlwbHkgMWUrNDAgMWUrNjEwMyAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzICBDbGFtcGVkCitkcW11bDc3MyBtdWx0aXBseSAxZSs0MCAxZSs2MTA0IC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0ICBDbGFtcGVkCitkcW11bDc3NCBtdWx0aXBseSAxZSs0MCAxZSs2MTA1IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NzUgbXVsdGlwbHkgMWUrNDAgMWUrNjEwNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsNzc2IG11bHRpcGx5IDFlKzQwIDFlKzYxMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcW11bDc3NyBtdWx0aXBseSAxZSs0MCAxZSs2MTA4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFtdWw3NzggbXVsdGlwbHkgMWUrNDAgMWUrNjEwOSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsNzc5IG11bHRpcGx5IDFlKzQwIDFlKzYxMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK2RxbXVsODAxIG11bHRpcGx5ICAxLjAwMDBFLTYxNzIgIDEgICAgIC0+IDEuMDAwMEUtNjE3MiBTdWJub3JtYWwKK2RxbXVsODAyIG11bHRpcGx5ICAxLjAwMEUtNjE3MiAgIDFlLTEgIC0+IDEuMDAwRS02MTczICBTdWJub3JtYWwKK2RxbXVsODAzIG11bHRpcGx5ICAxLjAwRS02MTcyICAgIDFlLTIgIC0+IDEuMDBFLTYxNzQgICBTdWJub3JtYWwKK2RxbXVsODA0IG11bHRpcGx5ICAxLjBFLTYxNzIgICAgIDFlLTMgIC0+IDEuMEUtNjE3NSAgICBTdWJub3JtYWwKK2RxbXVsODA1IG11bHRpcGx5ICAxLjBFLTYxNzIgICAgIDFlLTQgIC0+IDFFLTYxNzYgICAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcW11bDgwNiBtdWx0aXBseSAgMS4zRS02MTcyICAgICAxZS00ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MDcgbXVsdGlwbHkgIDEuNUUtNjE3MiAgICAgMWUtNCAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODA4IG11bHRpcGx5ICAxLjdFLTYxNzIgICAgIDFlLTQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgwOSBtdWx0aXBseSAgMi4zRS02MTcyICAgICAxZS00ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MTAgbXVsdGlwbHkgIDIuNUUtNjE3MiAgICAgMWUtNCAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODExIG11bHRpcGx5ICAyLjdFLTYxNzIgICAgIDFlLTQgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgxMiBtdWx0aXBseSAgMS40OUUtNjE3MiAgICAxZS00ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MTMgbXVsdGlwbHkgIDEuNTBFLTYxNzIgICAgMWUtNCAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODE0IG11bHRpcGx5ICAxLjUxRS02MTcyICAgIDFlLTQgIC0+IDJFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgxNSBtdWx0aXBseSAgMi40OUUtNjE3MiAgICAxZS00ICAtPiAyRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MTYgbXVsdGlwbHkgIDIuNTBFLTYxNzIgICAgMWUtNCAgLT4gMkUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODE3IG11bHRpcGx5ICAyLjUxRS02MTcyICAgIDFlLTQgIC0+IDNFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RxbXVsODE4IG11bHRpcGx5ICAxRS02MTcyICAgICAgIDFlLTQgIC0+IDFFLTYxNzYgICAgIFN1Ym5vcm1hbAorZHFtdWw4MTkgbXVsdGlwbHkgIDNFLTYxNzIgICAgICAgMWUtNSAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw4MjAgbXVsdGlwbHkgIDVFLTYxNzIgICAgICAgMWUtNSAgLT4gMEUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw4MjEgbXVsdGlwbHkgIDdFLTYxNzIgICAgICAgMWUtNSAgLT4gMUUtNjE3NiAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODIyIG11bHRpcGx5ICA5RS02MTcyICAgICAgIDFlLTUgIC0+IDFFLTYxNzYgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgyMyBtdWx0aXBseSAgOS45RS02MTcyICAgICAxZS01ICAtPiAxRS02MTc2ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkcW11bDgyNCBtdWx0aXBseSAgMUUtNjE3MiAgICAgIC0xZS00ICAtPiAtMUUtNjE3NiAgICBTdWJub3JtYWwKK2RxbXVsODI1IG11bHRpcGx5ICAzRS02MTcyICAgICAgLTFlLTUgIC0+IC0wRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbXVsODI2IG11bHRpcGx5IC01RS02MTcyICAgICAgIDFlLTUgIC0+IC0wRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbXVsODI3IG11bHRpcGx5ICA3RS02MTcyICAgICAgLTFlLTUgIC0+IC0xRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW11bDgyOCBtdWx0aXBseSAtOUUtNjE3MiAgICAgICAxZS01ICAtPiAtMUUtNjE3NiAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFtdWw4MjkgbXVsdGlwbHkgIDkuOUUtNjE3MiAgICAtMWUtNSAgLT4gLTFFLTYxNzYgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbXVsODMwIG11bHRpcGx5ICAzLjBFLTYxNzIgICAgLTFlLTUgIC0+IC0wRS02MTc2ICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZHFtdWw4MzEgbXVsdGlwbHkgIDEuMEUtNTk3NyAgICAgMWUtMjAwIC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFtdWw4MzIgbXVsdGlwbHkgIDEuMEUtNTk3NyAgICAgMWUtMTk5IC0+IDFFLTYxNzYgICAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxbXVsODMzIG11bHRpcGx5ICAxLjBFLTU5NzcgICAgIDFlLTE5OCAtPiAxLjBFLTYxNzUgICAgU3Vibm9ybWFsCitkcW11bDgzNCBtdWx0aXBseSAgMi4wRS01OTc3ICAgICAyZS0xOTggLT4gNC4wRS02MTc1ICAgIFN1Ym5vcm1hbAorZHFtdWw4MzUgbXVsdGlwbHkgIDQuMEUtNTk3NyAgICAgNGUtMTk4IC0+IDEuNjBFLTYxNzQgICBTdWJub3JtYWwKK2RxbXVsODM2IG11bHRpcGx5IDEwLjBFLTU5NzcgICAgMTBlLTE5OCAtPiAxLjAwMEUtNjE3MyAgU3Vibm9ybWFsCitkcW11bDgzNyBtdWx0aXBseSAzMC4wRS01OTc3ICAgIDMwZS0xOTggLT4gOS4wMDBFLTYxNzMgIFN1Ym5vcm1hbAorZHFtdWw4MzggbXVsdGlwbHkgNDAuMEUtNTk4MiAgICA0MGUtMTY2IC0+IDEuNjAwMEUtNjE0NSBTdWJub3JtYWwKK2RxbXVsODM5IG11bHRpcGx5IDQwLjBFLTU5ODIgICAgNDBlLTE2NSAtPiAxLjYwMDBFLTYxNDQgU3Vibm9ybWFsCitkcW11bDg0MCBtdWx0aXBseSA0MC4wRS01OTgyICAgIDQwZS0xNjQgLT4gMS42MDAwRS02MTQzCisKKy0tIExvbmcgb3BlcmFuZCBvdmVyZmxvdyBtYXkgYmUgYSBkaWZmZXJlbnQgcGF0aAorZHFtdWw4NzAgbXVsdGlwbHkgMTAwICA5Ljk5OUUrNjE0MyAgICAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZHFtdWw4NzEgbXVsdGlwbHkgMTAwIC05Ljk5OUUrNjE0MyAgICAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZHFtdWw4NzIgbXVsdGlwbHkgICAgICA5Ljk5OUUrNjE0MyAxMDAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZHFtdWw4NzMgbXVsdGlwbHkgICAgIC05Ljk5OUUrNjE0MyAxMDAgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBjaGVjayBmb3IgZG91YmxlLXJvdW5kZWQgc3Vibm9ybWFscworZHFtdWw4ODEgbXVsdGlwbHkgIDEuMjM0N0UtNjEzMyAxLjIzNDdFLTQwICAtPiAgMS41MjRFLTYxNzMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxbXVsODgyIG11bHRpcGx5ICAxLjIzNEUtNjEzMyAxLjIzNEUtNDAgICAgLT4gIDEuNTIzRS02MTczIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcW11bDg4MyBtdWx0aXBseSAgMS4yM0UtNjEzMyAgMS4yM0UtNDAgICAgIC0+ICAxLjUxM0UtNjE3MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFtdWw4ODQgbXVsdGlwbHkgIDEuMkUtNjEzMyAgIDEuMkUtNDAgICAgICAtPiAgMS40NEUtNjE3MyAgU3Vibm9ybWFsCitkcW11bDg4NSBtdWx0aXBseSAgMS4yRS02MTMzICAgMS4yRS00MSAgICAgIC0+ICAxLjQ0RS02MTc0ICBTdWJub3JtYWwKK2RxbXVsODg2IG11bHRpcGx5ICAxLjJFLTYxMzMgICAxLjJFLTQyICAgICAgLT4gIDEuNEUtNjE3NSAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkcW11bDg4NyBtdWx0aXBseSAgMS4yRS02MTMzICAgMS4zRS00MiAgICAgIC0+ICAxLjZFLTYxNzUgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZHFtdWw4ODggbXVsdGlwbHkgIDEuM0UtNjEzMyAgIDEuM0UtNDIgICAgICAtPiAgMS43RS02MTc1ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2RxbXVsODg5IG11bHRpcGx5ICAxLjNFLTYxMzMgICAxLjNFLTQzICAgICAgLT4gICAgMkUtNjE3NiAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitkcW11bDg5MCBtdWx0aXBseSAgMS4zRS02MTM0ICAgMS4zRS00MyAgICAgIC0+ICAgIDBFLTYxNzYgICBDbGFtcGVkIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CisKK2RxbXVsODkxIG11bHRpcGx5ICAxLjIzNDVFLTM5ICAgIDEuMjM0RS02MTMzIC0+ICAxLjUyMzRFLTYxNzIgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxbXVsODkyIG11bHRpcGx5ICAxLjIzNDU2RS0zOSAgIDEuMjM0RS02MTMzIC0+ICAxLjUyMzRFLTYxNzIgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxbXVsODkzIG11bHRpcGx5ICAxLjIzNDVFLTQwICAgMS4yMzRFLTYxMzMgLT4gIDEuNTIzRS02MTczICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHFtdWw4OTQgbXVsdGlwbHkgIDEuMjM0NTZFLTQwICAxLjIzNEUtNjEzMyAtPiAgMS41MjNFLTYxNzMgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitkcW11bDg5NSBtdWx0aXBseSAgMS4yMzQ1RS00MSAgIDEuMjM0RS02MTMzIC0+ICAxLjUyRS02MTc0ICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2RxbXVsODk2IG11bHRpcGx5ICAxLjIzNDU2RS00MSAgMS4yMzRFLTYxMzMgLT4gIDEuNTJFLTYxNzQgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBOb3cgZXhwbG9yZSB0aGUgY2FzZSB3aGVyZSB3ZSBnZXQgYSBub3JtYWwgcmVzdWx0IHdpdGggVW5kZXJmbG93CistLSBwcm92ZSBvcGVyYW5kcyBhcmUgZXhhY3QKK2RxbXVsOTA2IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0MyAgMSAgICAgICAgICAgICAgICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDMKK2RxbXVsOTA3IG11bHRpcGx5ICAgICAgICAgICAgICAgICAgICAgICAxICAwLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAtPiAwLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CistLSB0aGUgbmV4dCByb3VuZHMgdG8gTm1pbgorZHFtdWw5MDggbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQzICAwLjA5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorCistLSBodWdlc3QKK2RxbXVsOTA5IG11bHRpcGx5IDk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjcgSW5leGFjdCBSb3VuZGVkCistLSBWRyBjYXNlCitkcW11bDkxMCBtdWx0aXBseSA4LjgxMTI1MDAwMDAwMDAxMzQ5NDM2RS0xNTQ4IDguMDAwMDAwMDAwMDAwMDAwMDAwRS0xNTUwIC0+IDcuMDQ5MDAwMDAwMDAwMDEwNzk1NDg4MDAwMDAwMDAwMDAwRS0zMDk3IFJvdW5kZWQKKworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitwcmVjaXNpb246ICAgMzQKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCitkcW11bDkxMSAgbXVsdGlwbHkgMTMwRS0yICAxMjBFLTIgLT4gMS41NjAwCitkcW11bDkxMiAgbXVsdGlwbHkgMTMwRS0yICAxMkUtMSAgLT4gMS41NjAKK2RxbXVsOTEzICBtdWx0aXBseSAxMzBFLTIgIDFFMCAgICAtPiAxLjMwCitkcW11bDkxNCAgbXVsdGlwbHkgMUUyICAgICAxRTQgICAgLT4gMUUrNgorCistLSBwb3dlci1vZi10ZW4gZWRnZSBjYXNlcworZHFtdWwxMDAxIG11bHRpcGx5ICAxICAgICAgMTAgICAgICAgICAgICAgICAtPiAxMAorZHFtdWwxMDAyIG11bHRpcGx5ICAxICAgICAgMTAwICAgICAgICAgICAgICAtPiAxMDAKK2RxbXVsMTAwMyBtdWx0aXBseSAgMSAgICAgIDEwMDAgICAgICAgICAgICAgLT4gMTAwMAorZHFtdWwxMDA0IG11bHRpcGx5ICAxICAgICAgMTAwMDAgICAgICAgICAgICAtPiAxMDAwMAorZHFtdWwxMDA1IG11bHRpcGx5ICAxICAgICAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAKK2RxbXVsMTAwNiBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAgICAgICAgICAgLT4gMTAwMDAwMAorZHFtdWwxMDA3IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAgICAgICAgICAtPiAxMDAwMDAwMAorZHFtdWwxMDA4IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAKK2RxbXVsMTAwOSBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAgICAgICAgLT4gMTAwMDAwMDAwMAorZHFtdWwxMDEwIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAgICAgICAtPiAxMDAwMDAwMDAwMAorZHFtdWwxMDExIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAKK2RxbXVsMTAxMiBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAgICAgLT4gMTAwMDAwMDAwMDAwMAorZHFtdWwxMDEzIG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAgICAtPiAxMDAwMDAwMDAwMDAwMAorZHFtdWwxMDE0IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAwICAtPiAxMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTAxNSBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwMTYgbXVsdGlwbHkgIDEgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTAxNyBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTAxOCBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDE5IG11bHRpcGx5ICAxICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTAyMCBtdWx0aXBseSAgMSAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwMjEgbXVsdGlwbHkgIDEwICAgICAxICAgICAgICAgICAgICAgIC0+IDEwCitkcW11bDEwMjIgbXVsdGlwbHkgIDEwICAgICAxMCAgICAgICAgICAgICAgIC0+IDEwMAorZHFtdWwxMDIzIG11bHRpcGx5ICAxMCAgICAgMTAwICAgICAgICAgICAgICAtPiAxMDAwCitkcW11bDEwMjQgbXVsdGlwbHkgIDEwICAgICAxMDAwICAgICAgICAgICAgIC0+IDEwMDAwCitkcW11bDEwMjUgbXVsdGlwbHkgIDEwICAgICAxMDAwMCAgICAgICAgICAgIC0+IDEwMDAwMAorZHFtdWwxMDI2IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwICAgICAgICAgICAtPiAxMDAwMDAwCitkcW11bDEwMjcgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwICAgICAgICAgIC0+IDEwMDAwMDAwCitkcW11bDEwMjggbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMCAgICAgICAgIC0+IDEwMDAwMDAwMAorZHFtdWwxMDI5IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwICAgICAgICAtPiAxMDAwMDAwMDAwCitkcW11bDEwMzAgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAwCitkcW11bDEwMzEgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMCAgICAgIC0+IDEwMDAwMDAwMDAwMAorZHFtdWwxMDMyIG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMDAwICAgICAtPiAxMDAwMDAwMDAwMDAwCitkcW11bDEwMzMgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAwICAgIC0+IDEwMDAwMDAwMDAwMDAwCitkcW11bDEwMzQgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAwMCAgIC0+IDEwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDM1IG11bHRpcGx5ICAxMCAgICAgMTAwMDAwMDAwMDAwMDAwICAtPiAxMDAwMDAwMDAwMDAwMDAwCisKK2RxbXVsMTAzNiBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwMzcgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTAzOCBtdWx0aXBseSAgMTAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwMzkgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwNDAgbXVsdGlwbHkgIDEwICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwNDEgbXVsdGlwbHkgIDEwMCAgICAwLjEgICAgICAgICAgICAgIC0+IDEwLjAKK2RxbXVsMTA0MiBtdWx0aXBseSAgMTAwICAgIDEgICAgICAgICAgICAgICAgLT4gMTAwCitkcW11bDEwNDMgbXVsdGlwbHkgIDEwMCAgICAxMCAgICAgICAgICAgICAgIC0+IDEwMDAKK2RxbXVsMTA0NCBtdWx0aXBseSAgMTAwICAgIDEwMCAgICAgICAgICAgICAgLT4gMTAwMDAKK2RxbXVsMTA0NSBtdWx0aXBseSAgMTAwICAgIDEwMDAgICAgICAgICAgICAgLT4gMTAwMDAwCitkcW11bDEwNDYgbXVsdGlwbHkgIDEwMCAgICAxMDAwMCAgICAgICAgICAgIC0+IDEwMDAwMDAKK2RxbXVsMTA0NyBtdWx0aXBseSAgMTAwICAgIDEwMDAwMCAgICAgICAgICAgLT4gMTAwMDAwMDAKK2RxbXVsMTA0OCBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAgICAgICAgICAgLT4gMTAwMDAwMDAwCitkcW11bDEwNDkgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMCAgICAgICAgIC0+IDEwMDAwMDAwMDAKK2RxbXVsMTA1MCBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMCAgICAgICAgLT4gMTAwMDAwMDAwMDAKK2RxbXVsMTA1MSBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAgICAgICAgLT4gMTAwMDAwMDAwMDAwCitkcW11bDEwNTIgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwMCAgICAgIC0+IDEwMDAwMDAwMDAwMDAKK2RxbXVsMTA1MyBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwMCAgICAgLT4gMTAwMDAwMDAwMDAwMDAKK2RxbXVsMTA1NCBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwMDAgICAgLT4gMTAwMDAwMDAwMDAwMDAwCitkcW11bDEwNTUgbXVsdGlwbHkgIDEwMCAgICAxMDAwMDAwMDAwMDAwMCAgIC0+IDEwMDAwMDAwMDAwMDAwMDAKKworZHFtdWwxMDU2IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDU3IG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA1OCBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA1OSBtdWx0aXBseSAgMTAwICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDYwIG11bHRpcGx5ICAxMDAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwNjEgbXVsdGlwbHkgIDEwMDAgICAwLjAxICAgICAgICAgICAgIC0+IDEwLjAwCitkcW11bDEwNjIgbXVsdGlwbHkgIDEwMDAgICAwLjEgICAgICAgICAgICAgIC0+IDEwMC4wCitkcW11bDEwNjMgbXVsdGlwbHkgIDEwMDAgICAxICAgICAgICAgICAgICAgIC0+IDEwMDAKK2RxbXVsMTA2NCBtdWx0aXBseSAgMTAwMCAgIDEwICAgICAgICAgICAgICAgLT4gMTAwMDAKK2RxbXVsMTA2NSBtdWx0aXBseSAgMTAwMCAgIDEwMCAgICAgICAgICAgICAgLT4gMTAwMDAwCitkcW11bDEwNjYgbXVsdGlwbHkgIDEwMDAgICAxMDAwICAgICAgICAgICAgIC0+IDEwMDAwMDAKK2RxbXVsMTA2NyBtdWx0aXBseSAgMTAwMCAgIDEwMDAwICAgICAgICAgICAgLT4gMTAwMDAwMDAKK2RxbXVsMTA2OCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMCAgICAgICAgICAgLT4gMTAwMDAwMDAwCitkcW11bDEwNjkgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwICAgICAgICAgIC0+IDEwMDAwMDAwMDAKK2RxbXVsMTA3MCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwICAgICAgICAgLT4gMTAwMDAwMDAwMDAKK2RxbXVsMTA3MSBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMCAgICAgICAgLT4gMTAwMDAwMDAwMDAwCitkcW11bDEwNzIgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwICAgICAgIC0+IDEwMDAwMDAwMDAwMDAKK2RxbXVsMTA3MyBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwICAgICAgLT4gMTAwMDAwMDAwMDAwMDAKK2RxbXVsMTA3NCBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwMCAgICAgLT4gMTAwMDAwMDAwMDAwMDAwCitkcW11bDEwNzUgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMDAwICAgIC0+IDEwMDAwMDAwMDAwMDAwMDAKKworZHFtdWwxMDc2IG11bHRpcGx5ICAxMDAwICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwNzcgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwNzggbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA3OSBtdWx0aXBseSAgMTAwMCAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwODAgbXVsdGlwbHkgIDEwMDAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworZHFtdWwxMDgxIG11bHRpcGx5ICAxMDAwMCAgMC4wMDEgICAgICAgICAgICAtPiAxMC4wMDAKK2RxbXVsMTA4MiBtdWx0aXBseSAgMTAwMDAgIDAuMDEgICAgICAgICAgICAgLT4gMTAwLjAwCitkcW11bDEwODMgbXVsdGlwbHkgIDEwMDAwICAwLjEgICAgICAgICAgICAgIC0+IDEwMDAuMAorZHFtdWwxMDg0IG11bHRpcGx5ICAxMDAwMCAgMSAgICAgICAgICAgICAgICAtPiAxMDAwMAorZHFtdWwxMDg1IG11bHRpcGx5ICAxMDAwMCAgMTAgICAgICAgICAgICAgICAtPiAxMDAwMDAKK2RxbXVsMTA4NiBtdWx0aXBseSAgMTAwMDAgIDEwMCAgICAgICAgICAgICAgLT4gMTAwMDAwMAorZHFtdWwxMDg3IG11bHRpcGx5ICAxMDAwMCAgMTAwMCAgICAgICAgICAgICAtPiAxMDAwMDAwMAorZHFtdWwxMDg4IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAgICAgICAgICAgICAtPiAxMDAwMDAwMDAKK2RxbXVsMTA4OSBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMCAgICAgICAgICAgLT4gMTAwMDAwMDAwMAorZHFtdWwxMDkwIG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMCAgICAgICAgICAtPiAxMDAwMDAwMDAwMAorZHFtdWwxMDkxIG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAgICAgICAgICAtPiAxMDAwMDAwMDAwMDAKK2RxbXVsMTA5MiBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAwMCAgICAgICAgLT4gMTAwMDAwMDAwMDAwMAorZHFtdWwxMDkzIG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwMCAgICAgICAtPiAxMDAwMDAwMDAwMDAwMAorZHFtdWwxMDk0IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwMDAgICAgICAtPiAxMDAwMDAwMDAwMDAwMDAKK2RxbXVsMTA5NSBtdWx0aXBseSAgMTAwMDAgIDEwMDAwMDAwMDAwMCAgICAgLT4gMTAwMDAwMDAwMDAwMDAwMAorCitkcW11bDEwOTYgbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDk3IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW11bDEwOTggbXVsdGlwbHkgIDEwMDAwICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMDk5IG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFtdWwxMTAwIG11bHRpcGx5ICAxMDAwMCAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworZHFtdWwxMTA3IG11bHRpcGx5ICAxMDAwMCAgIDk5OTk5OTk5OTk5ICAgICAtPiAgOTk5OTk5OTk5OTkwMDAwCitkcW11bDExMDggbXVsdGlwbHkgIDEwMDAwICAgOTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTAwMDAKKworLS0gTnVsbCB0ZXN0cworZHFtdWw5OTkwIG11bHRpcGx5IDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFtdWw5OTkxIG11bHRpcGx5ICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTmV4dE1pbnVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTmV4dE1pbnVzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE3N2I1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0TWludXMuZGVjVGVzdApAQCAtMCwwICsxLDEyNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcU5leHRNaW51cy5kZWNUZXN0IC0tIGRlY1F1YWQgbmV4dCB0aGF0IGlzIGxlc3MgWzc1NHIgbmV4dGRvd25dICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcW5leHRtMDAxIG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0CitkcW5leHRtMDAyIG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1CitkcW5leHRtMDAzIG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2CitkcW5leHRtMDA0IG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3CitkcW5leHRtMDA1IG5leHRtaW51cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHRtMDA2IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHRtMDA3IG5leHRtaW51cyAgMS4wICAgICAgICAgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dG0wMDggbmV4dG1pbnVzICAxICAgICAgICAgICAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0bTAwOSBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW5leHRtMDEwIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dG0wMTEgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgorZHFuZXh0bTAxMiBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCitkcW5leHRtMDEzIG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKK2RxbmV4dG0wMTQgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNQorZHFuZXh0bTAxNSBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2CitkcW5leHRtMDE2IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxbmV4dG0wMTcgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOAorZHFuZXh0bTAxOCBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5CitkcW5leHRtMDE5IG5leHRtaW51cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKK2RxbmV4dG0wMjAgbmV4dG1pbnVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMQorCitkcW5leHRtMDIxIG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2CitkcW5leHRtMDIyIG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3CitkcW5leHRtMDIzIG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHRtMDI0IG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHRtMDI1IG5leHRtaW51cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dG0wMjYgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0bTAyNyBuZXh0bWludXMgLTEuMCAgICAgICAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dG0wMjggbmV4dG1pbnVzIC0xICAgICAgICAgICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHRtMDI5IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKK2RxbmV4dG0wMzAgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMiAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMworZHFuZXh0bTAzMSBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CitkcW5leHRtMDMyIG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUKK2RxbmV4dG0wMzMgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNgorZHFuZXh0bTAzNCBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkcW5leHRtMDM1IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgKK2RxbmV4dG0wMzYgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOQorZHFuZXh0bTAzNyBuZXh0bWludXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCitkcW5leHRtMDM4IG5leHRtaW51cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEKK2RxbmV4dG0wMzkgbmV4dG1pbnVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMgorCistLSB1bHRyYS10aW55IGlucHV0cworZHFuZXh0bTA2MiBuZXh0bWludXMgIDFFLTYxNzYgICAgICAgICAtPiAgIDBFLTYxNzYKK2RxbmV4dG0wNjUgbmV4dG1pbnVzIC0xRS02MTc2ICAgICAgICAgLT4gIC0yRS02MTc2CisKKy0tIFplcm9zCitkcW5leHRtMTAwIG5leHRtaW51cyAtMCAgICAgICAgICAgLT4gLTFFLTYxNzYKK2RxbmV4dG0xMDEgbmV4dG1pbnVzICAwICAgICAgICAgICAtPiAtMUUtNjE3NgorZHFuZXh0bTEwMiBuZXh0bWludXMgIDAuMDAgICAgICAgIC0+IC0xRS02MTc2CitkcW5leHRtMTAzIG5leHRtaW51cyAtMC4wMCAgICAgICAgLT4gLTFFLTYxNzYKK2RxbmV4dG0xMDQgbmV4dG1pbnVzICAwRS0zMDAgICAgICAtPiAtMUUtNjE3NgorZHFuZXh0bTEwNSBuZXh0bWludXMgIDBFKzMwMCAgICAgIC0+IC0xRS02MTc2CitkcW5leHRtMTA2IG5leHRtaW51cyAgMEUrMzAwMDAgICAgLT4gLTFFLTYxNzYKK2RxbmV4dG0xMDcgbmV4dG1pbnVzIC0wRSszMDAwMCAgICAtPiAtMUUtNjE3NgorCistLSBzcGVjaWFscworZHFuZXh0bTE1MCBuZXh0bWludXMgICBJbmYgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHRtMTUxIG5leHRtaW51cyAgLUluZiAgICAtPiAtSW5maW5pdHkKK2RxbmV4dG0xNTIgbmV4dG1pbnVzICAgTmFOICAgIC0+ICBOYU4KK2RxbmV4dG0xNTMgbmV4dG1pbnVzICBzTmFOICAgIC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0bTE1NCBuZXh0bWludXMgICBOYU43NyAgLT4gIE5hTjc3CitkcW5leHRtMTU1IG5leHRtaW51cyAgc05hTjg4ICAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dG0xNTYgbmV4dG1pbnVzICAtTmFOICAgIC0+IC1OYU4KK2RxbmV4dG0xNTcgbmV4dG1pbnVzIC1zTmFOICAgIC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0bTE1OCBuZXh0bWludXMgIC1OYU43NyAgLT4gLU5hTjc3CitkcW5leHRtMTU5IG5leHRtaW51cyAtc05hTjg4ICAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gTm1heCwgTm1pbiwgTnRpbnksIHN1Ym5vcm1hbHMKK2RxbmV4dG0xNzAgbmV4dG1pbnVzICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2MTQ0CitkcW5leHRtMTcxIG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5N0UrNjE0NAorZHFuZXh0bTE3MiBuZXh0bWludXMgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NAorZHFuZXh0bTE3MyBuZXh0bWludXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NAorZHFuZXh0bTE3NCBuZXh0bWludXMgIDlFLTYxNzYgICAgICAgICAgICAgICAgICAgLT4gOEUtNjE3NgorZHFuZXh0bTE3NSBuZXh0bWludXMgIDkuOUUtNjE3NSAgICAgICAgICAgICAgICAgLT4gOS44RS02MTc1CitkcW5leHRtMTc2IG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NyAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ3CitkcW5leHRtMTc3IG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ0CitkcW5leHRtMTc4IG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUtNjE0NCAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RS02MTQ0CitkcW5leHRtMTc5IG5leHRtaW51cyAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5N0UtNjE0NCAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2RS02MTQ0CitkcW5leHRtMTgwIG5leHRtaW51cyAgMEUtNjE3NiAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE3NgorZHFuZXh0bTE4MSBuZXh0bWludXMgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgLT4gMEUtNjE3NgorZHFuZXh0bTE4MiBuZXh0bWludXMgIDJFLTYxNzYgICAgICAgICAgICAgICAgICAgLT4gMUUtNjE3NgorCitkcW5leHRtMTgzIG5leHRtaW51cyAgLTBFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE3NgorZHFuZXh0bTE4NCBuZXh0bWludXMgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gLTJFLTYxNzYKK2RxbmV4dG0xODUgbmV4dG1pbnVzICAtMkUtNjE3NiAgICAgICAgICAgICAgICAgIC0+IC0zRS02MTc2CitkcW5leHRtMTg2IG5leHRtaW51cyAgLTEwRS02MTc2ICAgICAgICAgICAgICAgICAtPiAtMS4xRS02MTc1CitkcW5leHRtMTg3IG5leHRtaW51cyAgLTEwMEUtNjE3NiAgICAgICAgICAgICAgICAtPiAtMS4wMUUtNjE3NAorZHFuZXh0bTE4OCBuZXh0bWludXMgIC0xMDAwMDBFLTYxNzYgICAgICAgICAgICAgLT4gLTEuMDAwMDFFLTYxNzEKK2RxbmV4dG0xODkgbmV4dG1pbnVzICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0bTE5MCBuZXh0bWludXMgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHRtMTkxIG5leHRtaW51cyAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dG0xOTIgbmV4dG1pbnVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0bTE5MyBuZXh0bWludXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gLUluZmluaXR5CisKKy0tIE51bGwgdGVzdHMKK2RxbmV4dG05MDAgbmV4dG1pbnVzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTmV4dFBsdXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0UGx1cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOGU5Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTmV4dFBsdXMuZGVjVGVzdApAQCAtMCwwICsxLDEyNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcU5leHRQbHVzLmRlY1Rlc3QgLS0gZGVjUXVhZCBuZXh0IHRoYXQgaXMgZ3JlYXRlciBbNzU0ciBuZXh0dXBdICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIEFsbCBvcGVyYW5kcyBhbmQgcmVzdWx0cyBhcmUgZGVjUXVhZHMuCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcW5leHRwMDAxIG5leHRwbHVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2RxbmV4dHAwMDIgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NiAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NworZHFuZXh0cDAwMyBuZXh0cGx1cyAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHRwMDA0IG5leHRwbHVzICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHAwMDUgbmV4dHBsdXMgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW5leHRwMDA2IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0cDAwNyBuZXh0cGx1cyAgMS4wICAgICAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0cDAwOCBuZXh0cGx1cyAgMSAgICAgICAgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0cDAwOSBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKK2RxbmV4dHAwMTAgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCitkcW5leHRwMDExIG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNAorZHFuZXh0cDAxMiBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUKK2RxbmV4dHAwMTMgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2CitkcW5leHRwMDE0IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZHFuZXh0cDAxNSBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgKK2RxbmV4dHAwMTYgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5CitkcW5leHRwMDE3IG5leHRwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMAorZHFuZXh0cDAxOCBuZXh0cGx1cyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEKK2RxbmV4dHAwMTkgbmV4dHBsdXMgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyCisKK2RxbmV4dHAwMjEgbmV4dHBsdXMgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NAorZHFuZXh0cDAyMiBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1CitkcW5leHRwMDIzIG5leHRwbHVzIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2RxbmV4dHAwMjQgbmV4dHBsdXMgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NworZHFuZXh0cDAyNSBuZXh0cGx1cyAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHRwMDI2IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHAwMjcgbmV4dHBsdXMgLTEuMCAgICAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHRwMDI4IG5leHRwbHVzIC0xICAgICAgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0cDAyOSBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dHAwMzAgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHRwMDMxIG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgorZHFuZXh0cDAzMiBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMKK2RxbmV4dHAwMzMgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CitkcW5leHRwMDM0IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNiAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNQorZHFuZXh0cDAzNSBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYKK2RxbmV4dHAwMzYgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkcW5leHRwMDM3IG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOAorZHFuZXh0cDAzOCBuZXh0cGx1cyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkKK2RxbmV4dHAwMzkgbmV4dHBsdXMgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExICAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCitkcW5leHRwMDQwIG5leHRwbHVzIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMiAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMQorCistLSBaZXJvcworZHFuZXh0cDEwMCBuZXh0cGx1cyAgMCAgICAgICAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxMDEgbmV4dHBsdXMgIDAuMDAgICAgICAgIC0+ICAxRS02MTc2CitkcW5leHRwMTAyIG5leHRwbHVzICAwRS0zMDAgICAgICAtPiAgMUUtNjE3NgorZHFuZXh0cDEwMyBuZXh0cGx1cyAgMEUrMzAwICAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxMDQgbmV4dHBsdXMgIDBFKzMwMDAwICAgIC0+ICAxRS02MTc2CitkcW5leHRwMTA1IG5leHRwbHVzIC0wICAgICAgICAgICAtPiAgMUUtNjE3NgorZHFuZXh0cDEwNiBuZXh0cGx1cyAtMC4wMCAgICAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxMDcgbmV4dHBsdXMgLTBFLTMwMCAgICAgIC0+ICAxRS02MTc2CitkcW5leHRwMTA4IG5leHRwbHVzIC0wRSszMDAgICAgICAtPiAgMUUtNjE3NgorZHFuZXh0cDEwOSBuZXh0cGx1cyAtMEUrMzAwMDAgICAgLT4gIDFFLTYxNzYKKworLS0gc3BlY2lhbHMKK2RxbmV4dHAxNTAgbmV4dHBsdXMgICBJbmYgICAgLT4gIEluZmluaXR5CitkcW5leHRwMTUxIG5leHRwbHVzICAtSW5mICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0cDE1MiBuZXh0cGx1cyAgIE5hTiAgICAtPiAgTmFOCitkcW5leHRwMTUzIG5leHRwbHVzICBzTmFOICAgIC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0cDE1NCBuZXh0cGx1cyAgIE5hTjc3ICAtPiAgTmFONzcKK2RxbmV4dHAxNTUgbmV4dHBsdXMgIHNOYU44OCAgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCitkcW5leHRwMTU2IG5leHRwbHVzICAtTmFOICAgIC0+IC1OYU4KK2RxbmV4dHAxNTcgbmV4dHBsdXMgLXNOYU4gICAgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHRwMTU4IG5leHRwbHVzICAtTmFONzcgIC0+IC1OYU43NworZHFuZXh0cDE1OSBuZXh0cGx1cyAtc05hTjg4ICAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gTm1heCwgTm1pbiwgTnRpbnksIHN1Ym5vcm1hbHMKK2RxbmV4dHAxNzAgbmV4dHBsdXMgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2MTQ0CitkcW5leHRwMTcxIG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5N0UrNjE0NAorZHFuZXh0cDE3MiBuZXh0cGx1cyAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NAorZHFuZXh0cDE3MyBuZXh0cGx1cyAgLTEuMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NAorZHFuZXh0cDE3NCBuZXh0cGx1cyAgLTlFLTYxNzYgICAgICAgICAgICAgICAgICAtPiAtOEUtNjE3NgorZHFuZXh0cDE3NSBuZXh0cGx1cyAgLTkuOUUtNjE3NSAgICAgICAgICAgICAgICAtPiAtOS44RS02MTc1CitkcW5leHRwMTc2IG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NyAgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ3CitkcW5leHRwMTc3IG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ0CitkcW5leHRwMTc4IG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUtNjE0NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RS02MTQ0CitkcW5leHRwMTc5IG5leHRwbHVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5N0UtNjE0NCAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2RS02MTQ0CitkcW5leHRwMTgwIG5leHRwbHVzICAtMEUtNjE3NiAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTc2CitkcW5leHRwMTgxIG5leHRwbHVzICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgIC0+IC0wRS02MTc2CitkcW5leHRwMTgyIG5leHRwbHVzICAtMkUtNjE3NiAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTc2CisKK2RxbmV4dHAxODMgbmV4dHBsdXMgICAwRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gIDFFLTYxNzYKK2RxbmV4dHAxODQgbmV4dHBsdXMgICAxRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gIDJFLTYxNzYKK2RxbmV4dHAxODUgbmV4dHBsdXMgICAyRS02MTc2ICAgICAgICAgICAgICAgICAgLT4gIDNFLTYxNzYKK2RxbmV4dHAxODYgbmV4dHBsdXMgICAxMEUtNjE3NiAgICAgICAgICAgICAgICAgLT4gIDEuMUUtNjE3NQorZHFuZXh0cDE4NyBuZXh0cGx1cyAgIDEwMEUtNjE3NiAgICAgICAgICAgICAgICAtPiAgMS4wMUUtNjE3NAorZHFuZXh0cDE4OCBuZXh0cGx1cyAgIDEwMDAwMEUtNjE3NiAgICAgICAgICAgICAtPiAgMS4wMDAwMUUtNjE3MQorZHFuZXh0cDE4OSBuZXh0cGx1cyAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dHAxOTAgbmV4dHBsdXMgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHRwMTkxIG5leHRwbHVzICAgMUUtNjE0MyAgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0cDE5MiBuZXh0cGx1cyAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2MTQ0ICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHAxOTMgbmV4dHBsdXMgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gIEluZmluaXR5CisKKy0tIE51bGwgdGVzdHMKK2RxbmV4dHA5MDAgbmV4dHBsdXMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFOZXh0VG93YXJkLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTmV4dFRvd2FyZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2U3ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxTmV4dFRvd2FyZC5kZWNUZXN0CkBAIC0wLDAgKzEsMzc1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxTmV4dFRvd2FyZC5kZWNUZXN0IC0tIGRlY1F1YWQgbmV4dCB0b3dhcmQgcmhzIFs3NTRyIG5leHRhZnRlcl0gICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gQWxsIG9wZXJhbmRzIGFuZCByZXN1bHRzIGFyZSBkZWNRdWFkcy4KK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKworLS0gU2FuaXR5IGNoZWNrIHdpdGggYSBzY2F0dGVyaW5nIG9mIG51bWVyaWNzCitkcW5leHR0MDAxIG5leHR0b3dhcmQgICAxMCAgICAxMCAgIC0+ICAxMAorZHFuZXh0dDAwMiBuZXh0dG93YXJkICAtMTAgICAtMTAgICAtPiAtMTAKK2RxbmV4dHQwMDMgbmV4dHRvd2FyZCAgIDEgICAgIDEwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0MDA0IG5leHR0b3dhcmQgICAxICAgIC0xMCAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQwMDUgbmV4dHRvd2FyZCAgLTEgICAgIDEwICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDAwNiBuZXh0dG93YXJkICAtMSAgICAtMTAgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQwMDcgbmV4dHRvd2FyZCAgIDAgICAgIDEwICAgLT4gIDFFLTYxNzYgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQwMDggbmV4dHRvd2FyZCAgIDAgICAgLTEwICAgLT4gLTFFLTYxNzYgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQwMDkgbmV4dHRvd2FyZCAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICtJbmZpbml0eSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MDEwIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtSW5maW5pdHkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDAxMSBuZXh0dG93YXJkICAgICAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAxMCAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW5leHR0MDEyIG5leHR0b3dhcmQgICAxMCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQwMTMgbmV4dHRvd2FyZCAgICAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAtMTAgIC0+IC0xMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFuZXh0dDAxNCBuZXh0dG93YXJkICAtMTAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0MDE1IG5leHR0b3dhcmQgICAgICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggIDEwICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQwMTYgbmV4dHRvd2FyZCAgIDEwICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCAgICAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDAxNyBuZXh0dG93YXJkICAgICAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4IC0xMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0MDE4IG5leHR0b3dhcmQgIC0xMCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKKworLS0tLS0tLSBsaHM9cmhzCistLSBmaW5pdGVzCitkcW5leHR0MTAxIG5leHR0b3dhcmQgICAgICAgICAgNyAgICAgICA3IC0+ICA3CitkcW5leHR0MTAyIG5leHR0b3dhcmQgICAgICAgICAtNyAgICAgIC03IC0+IC03CitkcW5leHR0MTAzIG5leHR0b3dhcmQgICAgICAgICA3NSAgICAgIDc1IC0+ICA3NQorZHFuZXh0dDEwNCBuZXh0dG93YXJkICAgICAgICAtNzUgICAgIC03NSAtPiAtNzUKK2RxbmV4dHQxMDUgbmV4dHRvd2FyZCAgICAgICA3LjUwICAgICA3LjUgLT4gIDcuNTAKK2RxbmV4dHQxMDYgbmV4dHRvd2FyZCAgICAgIC03LjUwICAgLTcuNTAgLT4gLTcuNTAKK2RxbmV4dHQxMDcgbmV4dHRvd2FyZCAgICAgICA3LjUwMCA3LjUwMDAgLT4gIDcuNTAwCitkcW5leHR0MTA4IG5leHR0b3dhcmQgICAgICAtNy41MDAgICAtNy41IC0+IC03LjUwMAorCistLSB6ZXJvcworZHFuZXh0dDExMSBuZXh0dG93YXJkICAgICAgICAgIDAgICAgICAgMCAtPiAgMAorZHFuZXh0dDExMiBuZXh0dG93YXJkICAgICAgICAgLTAgICAgICAtMCAtPiAtMAorZHFuZXh0dDExMyBuZXh0dG93YXJkICAgICAgIDBFKzQgICAgICAgMCAtPiAgMEUrNAorZHFuZXh0dDExNCBuZXh0dG93YXJkICAgICAgLTBFKzQgICAgICAtMCAtPiAtMEUrNAorZHFuZXh0dDExNSBuZXh0dG93YXJkICAgICAwLjAwMDAwMDAwMDAwICAgMC4wMDAwMDAwMDAwMDAgLT4gIDBFLTExCitkcW5leHR0MTE2IG5leHR0b3dhcmQgICAgLTAuMDAwMDAwMDAwMDAgIC0wLjAwICAgICAgICAgICAtPiAtMEUtMTEKK2RxbmV4dHQxMTcgbmV4dHRvd2FyZCAgICAgIDBFLTE0MSAgICAgIDAgLT4gIDBFLTE0MQorZHFuZXh0dDExOCBuZXh0dG93YXJkICAgICAtMEUtMTQxICAgLTAwMCAtPiAtMEUtMTQxCisKKy0tIGZ1bGwgY29lZmZpY2llbnRzLCBhbHRlcm5hdGluZyBiaXRzCitkcW5leHR0MTIxIG5leHR0b3dhcmQgICAyNjgyNjgyNjggICAgMjY4MjY4MjY4IC0+ICAgMjY4MjY4MjY4CitkcW5leHR0MTIyIG5leHR0b3dhcmQgIC0yNjgyNjgyNjggICAtMjY4MjY4MjY4IC0+ICAtMjY4MjY4MjY4CitkcW5leHR0MTIzIG5leHR0b3dhcmQgICAxMzQxMzQxMzQgICAgMTM0MTM0MTM0IC0+ICAgMTM0MTM0MTM0CitkcW5leHR0MTI0IG5leHR0b3dhcmQgIC0xMzQxMzQxMzQgICAtMTM0MTM0MTM0IC0+ICAtMTM0MTM0MTM0CisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcW5leHR0MTMxIG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQxMzIgbmV4dHRvd2FyZCAgMUUtNjE0MyAgICAgICAgICAgMUUtNjE0MyAgICAgICAgICAgIC0+ICAgMUUtNjE0MworZHFuZXh0dDEzMyBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcW5leHR0MTM0IG5leHR0b3dhcmQgIDFFLTYxNzYgICAgICAgICAgIDFFLTYxNzYgICAgICAgICAgICAtPiAgIDFFLTYxNzYKKworZHFuZXh0dDEzNSBuZXh0dG93YXJkICAtMUUtNjE3NiAgICAgICAgICAtMUUtNjE3NiAgICAgICAgICAgLT4gIC0xRS02MTc2CitkcW5leHR0MTM2IG5leHR0b3dhcmQgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2RxbmV4dHQxMzcgbmV4dHRvd2FyZCAgLTFFLTYxNDMgICAgICAgICAgLTFFLTYxNDMgICAgICAgICAgIC0+ICAtMUUtNjE0MworZHFuZXh0dDEzOCBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtPiAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CisKKy0tLS0tLS0gbGhzPHJocworZHFuZXh0dDIwMSBuZXh0dG93YXJkICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTUgSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2RxbmV4dHQyMDIgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3CitkcW5leHR0MjAzIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NyBJbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OAorZHFuZXh0dDIwNCBuZXh0dG93YXJkICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQyMDUgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dHQyMDYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQyMDcgbmV4dHRvd2FyZCAgMS4wICAgICAgICAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDIwOCBuZXh0dG93YXJkICAxICAgICAgICAgICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0MjA5IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCitkcW5leHR0MjEwIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCitkcW5leHR0MjExIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CitkcW5leHR0MjEyIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1CitkcW5leHR0MjEzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2CitkcW5leHR0MjE0IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkcW5leHR0MjE1IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4CitkcW5leHR0MjE2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5CitkcW5leHR0MjE3IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCitkcW5leHR0MjE4IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExCitkcW5leHR0MjE5IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyCisKK2RxbmV4dHQyMjEgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1IEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0CitkcW5leHR0MjIyIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NiBJbmZpbml0eSAtPiAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1CitkcW5leHR0MjIzIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NyBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NgorZHFuZXh0dDIyNCBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTggSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTcKK2RxbmV4dHQyMjUgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IEluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHR0MjI2IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDIyNyBuZXh0dG93YXJkIC0xLjAgICAgICAgICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDIyOCBuZXh0dG93YXJkIC0xICAgICAgICAgICBJbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDIyOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFuZXh0dDIzMCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDIzMSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgorZHFuZXh0dDIzMiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMworZHFuZXh0dDIzMyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNAorZHFuZXh0dDIzNCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNQorZHFuZXh0dDIzNSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNgorZHFuZXh0dDIzNiBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNworZHFuZXh0dDIzNyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOAorZHFuZXh0dDIzOCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOQorZHFuZXh0dDIzOSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMAorZHFuZXh0dDI0MCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMQorCistLSBaZXJvcworZHFuZXh0dDMwMCBuZXh0dG93YXJkICAwICAgICAgICAgICBJbmZpbml0eSAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzMDEgbmV4dHRvd2FyZCAgMC4wMCAgICAgICAgSW5maW5pdHkgLT4gIDFFLTYxNzYgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzAyIG5leHR0b3dhcmQgIDBFLTMwMCAgICAgIEluZmluaXR5IC0+ICAxRS02MTc2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDMwMyBuZXh0dG93YXJkICAwRSszMDAgICAgICBJbmZpbml0eSAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzMDQgbmV4dHRvd2FyZCAgMEUrMzAwMDAgICAgSW5maW5pdHkgLT4gIDFFLTYxNzYgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzA1IG5leHR0b3dhcmQgLTAgICAgICAgICAgIEluZmluaXR5IC0+ICAxRS02MTc2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDMwNiBuZXh0dG93YXJkIC0wLjAwICAgICAgICBJbmZpbml0eSAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzMDcgbmV4dHRvd2FyZCAtMEUtMzAwICAgICAgSW5maW5pdHkgLT4gIDFFLTYxNzYgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzA4IG5leHR0b3dhcmQgLTBFKzMwMCAgICAgIEluZmluaXR5IC0+ICAxRS02MTc2ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDMwOSBuZXh0dG93YXJkIC0wRSszMDAwMCAgICBJbmZpbml0eSAtPiAgMUUtNjE3NiAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3BlY2lhbHMKK2RxbmV4dHQzNTAgbmV4dHRvd2FyZCAgIEluZiAgICBJbmZpbml0eSAtPiAgSW5maW5pdHkKK2RxbmV4dHQzNTEgbmV4dHRvd2FyZCAgLUluZiAgICBJbmZpbml0eSAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQzNTIgbmV4dHRvd2FyZCAgIE5hTiAgICBJbmZpbml0eSAtPiAgTmFOCitkcW5leHR0MzUzIG5leHR0b3dhcmQgIHNOYU4gICAgSW5maW5pdHkgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0MzU0IG5leHR0b3dhcmQgICBOYU43NyAgSW5maW5pdHkgLT4gIE5hTjc3CitkcW5leHR0MzU1IG5leHR0b3dhcmQgIHNOYU44OCAgSW5maW5pdHkgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0MzU2IG5leHR0b3dhcmQgIC1OYU4gICAgSW5maW5pdHkgLT4gLU5hTgorZHFuZXh0dDM1NyBuZXh0dG93YXJkIC1zTmFOICAgIEluZmluaXR5IC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDM1OCBuZXh0dG93YXJkICAtTmFONzcgIEluZmluaXR5IC0+IC1OYU43NworZHFuZXh0dDM1OSBuZXh0dG93YXJkIC1zTmFOODggIEluZmluaXR5IC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworZHFuZXh0dDM3MCBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQKK2RxbmV4dHQzNzEgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2MTQ0ICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RSs2MTQ0CitkcW5leHR0MzcyIG5leHR0b3dhcmQgIC0xRS02MTQzICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM3MyBuZXh0dG93YXJkICAtMS4wMDAwMDAwMDAwMDAwMDBFLTYxNDMgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzNzQgbmV4dHRvd2FyZCAgLTlFLTYxNzYgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLThFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzc1IG5leHR0b3dhcmQgIC05LjlFLTYxNzUgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+IC05LjhFLTYxNzUgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM3NiBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUtNjE0NyAgICAgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUtNjE0NyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzNzcgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDQgICBJbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDQgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzc4IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ0ICAgSW5maW5pdHkgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RS02MTQ0ICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM3OSBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5N0UtNjE0NCAgIEluZmluaXR5ICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NkUtNjE0NCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzODAgbmV4dHRvd2FyZCAgLTBFLTYxNzYgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDFFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0MzgxIG5leHR0b3dhcmQgIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+IC0wRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbmV4dHQzODIgbmV4dHRvd2FyZCAgLTJFLTYxNzYgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gLTFFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RxbmV4dHQzODMgbmV4dHRvd2FyZCAgIDBFLTYxNzYgICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDFFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzg0IG5leHR0b3dhcmQgICAxRS02MTc2ICAgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAyRS02MTc2ICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM4NSBuZXh0dG93YXJkICAgMkUtNjE3NiAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgM0UtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzODYgbmV4dHRvd2FyZCAgIDEwRS02MTc2ICAgICAgICAgICAgICAgICBJbmZpbml0eSAgLT4gIDEuMUUtNjE3NSAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Mzg3IG5leHR0b3dhcmQgICAxMDBFLTYxNzYgICAgICAgICAgICAgICAgSW5maW5pdHkgIC0+ICAxLjAxRS02MTc0ICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDM4OCBuZXh0dG93YXJkICAgMTAwMDAwRS02MTc2ICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMS4wMDAwMUUtNjE3MSAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQzODkgbmV4dHRvd2FyZCAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICBJbmZpbml0eSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHR0MzkwIG5leHR0b3dhcmQgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgSW5maW5pdHkgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0dDM5MSBuZXh0dG93YXJkICAgMUUtNjE0MyAgICAgICAgICAgICAgICAgIEluZmluaXR5ICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dHQzOTIgbmV4dHRvd2FyZCAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RSs2MTQ0ICBJbmZpbml0eSAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RSs2MTQ0CitkcW5leHR0MzkzIG5leHR0b3dhcmQgICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OEUrNjE0NCAgSW5maW5pdHkgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDM5NCBuZXh0dG93YXJkICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIEluZmluaXR5ICAtPiAgSW5maW5pdHkgICAgICAgICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0tLS0tLSBsaHM+cmhzCitkcW5leHR0NDAxIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NSAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0CitkcW5leHR0NDAyIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NiAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1CitkcW5leHR0NDAzIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NyAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2CitkcW5leHR0NDA0IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3CitkcW5leHR0NDA1IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHR0NDA2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0NDA3IG5leHR0b3dhcmQgIDEuMCAgICAgICAgICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkKK2RxbmV4dHQ0MDggbmV4dHRvd2FyZCAgMSAgICAgICAgICAgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDQwOSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW5leHR0NDEwIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQ0MTEgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgorZHFuZXh0dDQxMiBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNCAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCitkcW5leHR0NDEzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA1ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQKK2RxbmV4dHQ0MTQgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDYgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNQorZHFuZXh0dDQxNSBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNyAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA2CitkcW5leHR0NDE2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA4ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDcKK2RxbmV4dHQ0MTcgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDkgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOAorZHFuZXh0dDQxOCBuZXh0dG93YXJkICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMCAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA5CitkcW5leHR0NDE5IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAKK2RxbmV4dHQ0MjAgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMQorCitkcW5leHR0NDIxIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NSAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2CitkcW5leHR0NDIyIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NiAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3CitkcW5leHR0NDIzIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NyAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4CitkcW5leHR0NDI0IG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0NDI1IG5leHR0b3dhcmQgLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxbmV4dHQ0MjYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDQyNyBuZXh0dG93YXJkIC0xLjAgICAgICAgICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQ0MjggbmV4dHRvd2FyZCAtMSAgICAgICAgICAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0NDI5IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKK2RxbmV4dHQ0MzAgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMworZHFuZXh0dDQzMSBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0CitkcW5leHR0NDMyIG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA0ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUKK2RxbmV4dHQ0MzMgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDUgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNgorZHFuZXh0dDQzNCBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3CitkcW5leHR0NDM1IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDA3ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDgKK2RxbmV4dHQ0MzYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDggICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOQorZHFuZXh0dDQzNyBuZXh0dG93YXJkIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwOSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwCitkcW5leHR0NDM4IG5leHR0b3dhcmQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEKK2RxbmV4dHQ0MzkgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTEgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMgorCistLSBaZXJvcworZHFuZXh0dDUwMCBuZXh0dG93YXJkIC0wICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xRS02MTc2ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ1MDEgbmV4dHRvd2FyZCAgMCAgICAgICAgICAgIC1JbmZpbml0eSAtPiAtMUUtNjE3NiAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NTAyIG5leHR0b3dhcmQgIDAuMDAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTYxNzYgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDUwMyBuZXh0dG93YXJkIC0wLjAwICAgICAgICAgLUluZmluaXR5IC0+IC0xRS02MTc2ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ1MDQgbmV4dHRvd2FyZCAgMEUtMzAwICAgICAgIC1JbmZpbml0eSAtPiAtMUUtNjE3NiAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NTA1IG5leHR0b3dhcmQgIDBFKzMwMCAgICAgICAtSW5maW5pdHkgLT4gLTFFLTYxNzYgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDUwNiBuZXh0dG93YXJkICAwRSszMDAwMCAgICAgLUluZmluaXR5IC0+IC0xRS02MTc2ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ1MDcgbmV4dHRvd2FyZCAtMEUrMzAwMDAgICAgIC1JbmZpbml0eSAtPiAtMUUtNjE3NiAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNwZWNpYWxzCitkcW5leHR0NTUwIG5leHR0b3dhcmQgICBJbmYgICAgIC1JbmZpbml0eSAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ1NTEgbmV4dHRvd2FyZCAgLUluZiAgICAgLUluZmluaXR5IC0+IC1JbmZpbml0eQorZHFuZXh0dDU1MiBuZXh0dG93YXJkICAgTmFOICAgICAtSW5maW5pdHkgLT4gIE5hTgorZHFuZXh0dDU1MyBuZXh0dG93YXJkICBzTmFOICAgICAtSW5maW5pdHkgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0NTU0IG5leHR0b3dhcmQgICBOYU43NyAgIC1JbmZpbml0eSAtPiAgTmFONzcKK2RxbmV4dHQ1NTUgbmV4dHRvd2FyZCAgc05hTjg4ICAgLUluZmluaXR5IC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDU1NiBuZXh0dG93YXJkICAtTmFOICAgICAtSW5maW5pdHkgLT4gLU5hTgorZHFuZXh0dDU1NyBuZXh0dG93YXJkIC1zTmFOICAgICAtSW5maW5pdHkgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0NTU4IG5leHR0b3dhcmQgIC1OYU43NyAgIC1JbmZpbml0eSAtPiAtTmFONzcKK2RxbmV4dHQ1NTkgbmV4dHRvd2FyZCAtc05hTjg4ICAgLUluZmluaXR5IC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworZHFuZXh0dDY3MCBuZXh0dG93YXJkICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC1JbmZpbml0eSAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQKK2RxbmV4dHQ2NzEgbmV4dHRvd2FyZCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQgICAtSW5maW5pdHkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RSs2MTQ0CitkcW5leHR0NjcyIG5leHR0b3dhcmQgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NjczIG5leHR0b3dhcmQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RS02MTQ0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njc0IG5leHR0b3dhcmQgIDlFLTYxNzYgICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiA4RS02MTc2ICAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njc1IG5leHR0b3dhcmQgIDkuOUUtNjE3NSAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiA5LjhFLTYxNzUgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njc2IG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDcgICAgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ3ICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njc3IG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFLTYxNDQgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4RS02MTQ0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njc4IG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFLTYxNDQgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3RS02MTQ0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0Njc5IG5leHR0b3dhcmQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTdFLTYxNDQgICAgLUluZmluaXR5ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk2RS02MTQ0ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NjgwIG5leHR0b3dhcmQgIDBFLTYxNzYgICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAtMUUtNjE3NiAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NjgxIG5leHR0b3dhcmQgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgLUluZmluaXR5ICAtPiAwRS02MTc2ICAgICAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCAgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RxbmV4dHQ2ODIgbmV4dHRvd2FyZCAgMkUtNjE3NiAgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IDFFLTYxNzYgICAgICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsICBJbmV4YWN0IFJvdW5kZWQKKworZHFuZXh0dDY4MyBuZXh0dG93YXJkICAtMEUtNjE3NiAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTFFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDY4NCBuZXh0dG93YXJkICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTJFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDY4NSBuZXh0dG93YXJkICAtMkUtNjE3NiAgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTNFLTYxNzYgICAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDY4NiBuZXh0dG93YXJkICAtMTBFLTYxNzYgICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTEuMUUtNjE3NSAgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDY4NyBuZXh0dG93YXJkICAtMTAwRS02MTc2ICAgICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTEuMDFFLTYxNzQgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDY4OCBuZXh0dG93YXJkICAtMTAwMDAwRS02MTc2ICAgICAgICAgICAgIC1JbmZpbml0eSAgLT4gLTEuMDAwMDFFLTYxNzEgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDY4OSBuZXh0dG93YXJkICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIC1JbmZpbml0eSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxRS02MTQzCitkcW5leHR0NjkwIG5leHR0b3dhcmQgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLUluZmluaXR5ICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDFFLTYxNDMKK2RxbmV4dHQ2OTEgbmV4dHRvd2FyZCAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAtSW5maW5pdHkgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMUUtNjE0MworZHFuZXh0dDY5MiBuZXh0dG93YXJkICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OThFKzYxNDQgIC1JbmZpbml0eSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0NjkzIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLUluZmluaXR5ICAtPiAtSW5maW5pdHkgICAgICAgICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0tLS0tLSBTcGVjaWFscworZHFuZXh0dDc4MCBuZXh0dG93YXJkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2RxbmV4dHQ3ODEgbmV4dHRvd2FyZCAtSW5mICAtMTAwMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0NzgyIG5leHR0b3dhcmQgLUluZiAgLTEgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDc4MyBuZXh0dG93YXJkIC1JbmYgIC0wICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ3ODQgbmV4dHRvd2FyZCAtSW5mICAgMCAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0Nzg1IG5leHR0b3dhcmQgLUluZiAgIDEgICAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDc4NiBuZXh0dG93YXJkIC1JbmYgICAxMDAwICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ3ODcgbmV4dHRvd2FyZCAtMTAwMCAtSW5mICAgLT4gLTEwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcW5leHR0Nzg4IG5leHR0b3dhcmQgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZHFuZXh0dDc4OSBuZXh0dG93YXJkIC0xICAgIC1JbmYgICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQ3OTAgbmV4dHRvd2FyZCAtMCAgICAtSW5mICAgLT4gLTFFLTYxNzYgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0NzkxIG5leHR0b3dhcmQgIDAgICAgLUluZiAgIC0+IC0xRS02MTc2ICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHFuZXh0dDc5MiBuZXh0dG93YXJkICAxICAgIC1JbmYgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcW5leHR0NzkzIG5leHR0b3dhcmQgIDEwMDAgLUluZiAgIC0+ICA5OTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDc5NCBuZXh0dG93YXJkICBJbmYgIC1JbmYgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKKworZHFuZXh0dDgwMCBuZXh0dG93YXJkICBJbmYgIC1JbmYgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ4MDEgbmV4dHRvd2FyZCAgSW5mICAtMTAwMCAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0ODAyIG5leHR0b3dhcmQgIEluZiAgLTEgICAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDgwMyBuZXh0dG93YXJkICBJbmYgIC0wICAgICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ4MDQgbmV4dHRvd2FyZCAgSW5mICAgMCAgICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcW5leHR0ODA1IG5leHR0b3dhcmQgIEluZiAgIDEgICAgIC0+ICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFuZXh0dDgwNiBuZXh0dG93YXJkICBJbmYgICAxMDAwICAtPiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ4MDcgbmV4dHRvd2FyZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitkcW5leHR0ODA4IG5leHR0b3dhcmQgLTEwMDAgIEluZiAgIC0+IC05OTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDgwOSBuZXh0dG93YXJkIC1JbmYgICBJbmYgICAtPiAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2RxbmV4dHQ4MTAgbmV4dHRvd2FyZCAtMSAgICAgSW5mICAgLT4gLTAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OQorZHFuZXh0dDgxMSBuZXh0dG93YXJkIC0wICAgICBJbmYgICAtPiAgMUUtNjE3NiAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RxbmV4dHQ4MTIgbmV4dHRvd2FyZCAgMCAgICAgSW5mICAgLT4gIDFFLTYxNzYgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkcW5leHR0ODEzIG5leHR0b3dhcmQgIDEgICAgIEluZiAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMQorZHFuZXh0dDgxNCBuZXh0dG93YXJkICAxMDAwICBJbmYgICAtPiAgMTAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKK2RxbmV4dHQ4MTUgbmV4dHRvd2FyZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2RxbmV4dHQ4MjEgbmV4dHRvd2FyZCAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFuZXh0dDgyMiBuZXh0dG93YXJkICBOYU4gLTEwMDAgICAtPiAgTmFOCitkcW5leHR0ODIzIG5leHR0b3dhcmQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RxbmV4dHQ4MjQgbmV4dHRvd2FyZCAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFuZXh0dDgyNSBuZXh0dG93YXJkICBOYU4gIDAgICAgICAtPiAgTmFOCitkcW5leHR0ODI2IG5leHR0b3dhcmQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RxbmV4dHQ4MjcgbmV4dHRvd2FyZCAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFuZXh0dDgyOCBuZXh0dG93YXJkICBOYU4gIEluZiAgICAtPiAgTmFOCitkcW5leHR0ODI5IG5leHR0b3dhcmQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2RxbmV4dHQ4MzAgbmV4dHRvd2FyZCAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFuZXh0dDgzMSBuZXh0dG93YXJkIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkcW5leHR0ODMyIG5leHR0b3dhcmQgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RxbmV4dHQ4MzMgbmV4dHRvd2FyZCAtMCAgICBOYU4gICAgLT4gIE5hTgorZHFuZXh0dDgzNCBuZXh0dG93YXJkICAwICAgIE5hTiAgICAtPiAgTmFOCitkcW5leHR0ODM1IG5leHR0b3dhcmQgIDEgICAgTmFOICAgIC0+ICBOYU4KK2RxbmV4dHQ4MzYgbmV4dHRvd2FyZCAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFuZXh0dDgzNyBuZXh0dG93YXJkICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RxbmV4dHQ4NDEgbmV4dHRvd2FyZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDIgbmV4dHRvd2FyZCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDMgbmV4dHRvd2FyZCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDQgbmV4dHRvd2FyZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDUgbmV4dHRvd2FyZCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDYgbmV4dHRvd2FyZCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDcgbmV4dHRvd2FyZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDggbmV4dHRvd2FyZCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NDkgbmV4dHRvd2FyZCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTAgbmV4dHRvd2FyZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTEgbmV4dHRvd2FyZCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTIgbmV4dHRvd2FyZCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTMgbmV4dHRvd2FyZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTQgbmV4dHRvd2FyZCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTUgbmV4dHRvd2FyZCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTYgbmV4dHRvd2FyZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTcgbmV4dHRvd2FyZCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTggbmV4dHRvd2FyZCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NTkgbmV4dHRvd2FyZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFuZXh0dDg2MSBuZXh0dG93YXJkICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorZHFuZXh0dDg2MiBuZXh0dG93YXJkICtOYU4yICAgLTEwMDAgICAtPiAgTmFOMgorZHFuZXh0dDg2MyBuZXh0dG93YXJkICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZHFuZXh0dDg2NCBuZXh0dG93YXJkICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorZHFuZXh0dDg2NSBuZXh0dG93YXJkICBOYU41ICAgK05hTjYgICAtPiAgTmFONQorZHFuZXh0dDg2NiBuZXh0dG93YXJkIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZHFuZXh0dDg2NyBuZXh0dG93YXJkIC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorZHFuZXh0dDg2OCBuZXh0dG93YXJkICAxMDAwICAgIE5hTjkgICAtPiAgTmFOOQorZHFuZXh0dDg2OSBuZXh0dG93YXJkICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2RxbmV4dHQ4NzEgbmV4dHRvd2FyZCAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg3MiBuZXh0dG93YXJkICBzTmFOMTIgIC0xMDAwICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODczIG5leHR0b3dhcmQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NzQgbmV4dHRvd2FyZCAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg3NSBuZXh0dG93YXJkICBzTmFOMTUgIHNOYU4xOCAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODc2IG5leHR0b3dhcmQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4NzcgbmV4dHRvd2FyZCAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg3OCBuZXh0dG93YXJkIC0xMDAwICAgIHNOYU4yMSAtPiAgTmFOMjEgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODc5IG5leHR0b3dhcmQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2RxbmV4dHQ4ODAgbmV4dHRvd2FyZCAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDg4MSBuZXh0dG93YXJkICtOYU4yNSAgK3NOYU4yNCAtPiAgTmFOMjQgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODgyIG5leHR0b3dhcmQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZHFuZXh0dDg4MyBuZXh0dG93YXJkIC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitkcW5leHR0ODg0IG5leHR0b3dhcmQgIDEwMDAgICAgLU5hTjMwIC0+IC1OYU4zMAorZHFuZXh0dDg4NSBuZXh0dG93YXJkICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK2RxbmV4dHQ5MDAgbmV4dHRvd2FyZCAxICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFuZXh0dDkwMSBuZXh0dG93YXJkICMgIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFPci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcU9yLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkMzRiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFPci5kZWNUZXN0CkBAIC0wLDAgKzEsNDAxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxT3IuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBPUiBmb3IgZGVjUXVhZHMgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSkKK2Rxb3IwMDEgb3IgICAgICAgICAgICAgMCAgICAwIC0+ICAgIDAKK2Rxb3IwMDIgb3IgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDEKK2Rxb3IwMDMgb3IgICAgICAgICAgICAgMSAgICAwIC0+ICAgIDEKK2Rxb3IwMDQgb3IgICAgICAgICAgICAgMSAgICAxIC0+ICAgIDEKK2Rxb3IwMDUgb3IgICAgICAgICAgMTEwMCAxMDEwIC0+IDExMTAKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCitkcW9yMDA2IG9yIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorZHFvcjAwNyBvciAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW9yMDA4IG9yIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxb3IwMDkgb3IgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFvcjAxMCBvciAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK2Rxb3IwMTEgb3IgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFvcjAxMiBvciAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcW9yMDEzIG9yIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworLS0gVmFyaW91cyBsZW5ndGhzCitkcW9yNjAxIG9yIDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYwMiBvciAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MDMgb3IgMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjA0IG9yIDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYwNSBvciAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MDYgb3IgMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjA3IG9yIDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYwOCBvciAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MDkgb3IgMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjEwIG9yIDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYxMSBvciAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MTIgb3IgMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjEzIG9yIDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYxNCBvciAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MTUgb3IgMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjE2IG9yIDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYxNyBvciAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MTggb3IgMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjE5IG9yIDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYyMCBvciAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MjEgb3IgMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMSAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjIyIG9yIDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEgMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYyMyBvciAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MjQgb3IgMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMSAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjI1IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEgMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYyNiBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExIDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2Mjcgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMSAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjI4IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEgMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYyOSBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MzAgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMSAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjMxIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEgMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjYzMiBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2MzMgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMSAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjM0IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorCitkcW9yNjQxIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY0MiBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NDMgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMSAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjQ0IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEgMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY0NSBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NDYgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMSAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjQ3IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEgMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY0OCBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NDkgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMSAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjUwIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEgMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY1MSBvciAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NTIgb3IgMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMSAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjUzIG9yIDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEgMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY1NCBvciAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NTUgb3IgMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjU2IG9yIDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY1NyBvciAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwIDEwMTAxMDEwMTAxMDEwMTAwMDEwMTAxMDEwMTAxMDEwMTAgIC0+IDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAKK2Rxb3I2NTggb3IgMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjU5IG9yIDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY2MCBvciAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NjEgb3IgMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjYyIG9yIDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY2MyBvciAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NjQgb3IgMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjY1IG9yIDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY2NiBvciAwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxIDAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAwMDEwMTAxMDEgIC0+ICAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEwMTAxMDEKK2Rxb3I2Njcgb3IgMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjY4IG9yIDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY2OSBvciAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NzAgb3IgMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjcxIG9yIDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY3MiBvciAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2NzMgb3IgMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjc0IG9yIDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY3NSBvciAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAKK2Rxb3I2NzYgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwCisKK2Rxb3I2ODEgb3IgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAwMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEwICAtPiAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjgyIG9yIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTAxMTExMTExMDEwMTExMTExMTExMTExMTExMTExMTEwMSAgLT4gMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY4MyBvciAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMDExMTExMDExMTAxMTExMTExMTExMTExMTExMTEwMTEgIC0+IDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2ODQgb3IgMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTEwMTExMDExMTExMDExMTExMTExMTExMTExMTEwMTExICAtPiAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjg1IG9yIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTAxMDExMTExMTEwMTExMTExMTExMTExMTEwMTExMSAgLT4gMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY4NiBvciAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExIDExMTExMDExMTExMTExMTAxMTExMTExMTExMTEwMTExMTEgIC0+IDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2ODcgb3IgMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMDEwMTExMTExMTExMDExMTExMTExMTEwMTExMTExICAtPiAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjg4IG9yIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMDExMTAxMTExMTExMTEwMTExMTExMTEwMTExMTExMSAgLT4gMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY4OSBvciAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExIDExMDExMTExMDExMTExMTExMTAxMTExMTEwMTExMTExMTEgIC0+IDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2OTAgb3IgMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMSAxMDExMTExMTEwMTExMTExMTExMDExMTEwMTExMTExMTEwICAtPiAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjkxIG9yIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgMDExMTExMTExMTAxMTExMTExMTEwMTEwMTExMTExMTEwMSAgLT4gMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMQorZHFvcjY5MiBvciAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMDExMTExMTExMTAwMTExMTExMTEwMTEgIC0+IDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEKK2Rxb3I2OTMgb3IgMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTEwMTExMTExMTEwMDExMTExMTEwMTExICAtPiAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExCitkcW9yNjk0IG9yIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTAxMTExMTEwMTEwMTExMTEwMTExMSAgLT4gMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMQorZHFvcjY5NSBvciAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMDExMTEwMTExMTAxMTEwMTExMTEgIC0+IDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEKK2Rxb3I2OTYgb3IgMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTEwMTEwMTExMTExMDEwMTExMTExICAtPiAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExCitkcW9yNjk3IG9yIDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTAwMTExMTExMTEwMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMQorZHFvcjY5OCBvciAxMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExIDExMTExMTExMTExMTExMTEwMDExMTExMTEwMTAxMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEKK2Rxb3I2OTkgb3IgMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTEwMTEwMTExMTEwMTExMDExMTExICAtPiAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExCitkcW9yNzAwIG9yIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTEwMTExMTAxMTEwMTExMTEwMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMQorZHFvcjcwMSBvciAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExIDExMTExMTExMTExMTEwMTExMTExMDEwMTExMTExMTAxMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEKK2Rxb3I3MDIgb3IgMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMSAxMTExMTExMTExMTEwMTExMTExMTEwMTExMTExMTExMDExICAtPiAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExCitkcW9yNzAzIG9yIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgMTExMTExMTExMTEwMTExMTExMTEwMTAxMTExMTExMTEwMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMQorZHFvcjcwNCBvciAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExIDExMTExMTExMTEwMTExMTExMTEwMTExMDExMTExMTExMTAgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEKK2Rxb3I3MDUgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMSAwMTExMTExMTEwMTExMTExMTEwMTExMTEwMTExMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExCitkcW9yNzA2IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEgMTAxMTExMTEwMTExMTExMTEwMTExMTExMTAxMTExMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMQorZHFvcjcwNyBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExIDExMDExMTEwMTExMTExMTEwMTExMTExMTExMDExMTExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEKK2Rxb3I3MDggb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMSAxMTEwMTEwMTExMTExMTEwMTExMTExMTExMTEwMTExMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExCitkcW9yNzA5IG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgMTExMTAwMTExMTExMTEwMTExMTExMTExMTExMTAxMTExMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMQorZHFvcjcxMCBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExIDExMTEwMDExMTExMTEwMTExMTExMTExMTExMTExMDExMTEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEKK2Rxb3I3MTEgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMSAxMTEwMTEwMTExMTEwMTExMTExMTExMTExMTExMTEwMTExICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExCitkcW9yNzEyIG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgMTEwMTExMTAxMTEwMTExMTExMTExMTExMTExMTExMTAxMSAgLT4gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMQorZHFvcjcxMyBvciAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxIDEwMTExMTExMDEwMTExMTExMTExMTExMTExMTExMTExMDEgIC0+IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEKK2Rxb3I3MTQgb3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCAwMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwCisKKworCistLSAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYgICAgIDEyMzQ1Njc4OTAxMjM0NTYgMTIzNDU2Nzg5MDEyMzQ1NgorZHFvcjAyMCBvciAxMTExMTExMTExMTExMTExICAgICAxMTExMTExMTExMTExMTExICAtPiAgMTExMTExMTExMTExMTExMQorZHFvcjAyMSBvciAgMTExMTExMTExMTExMTExICAgICAgMTExMTExMTExMTExMTExICAtPiAgIDExMTExMTExMTExMTExMQorZHFvcjAyMiBvciAgIDExMTExMTExMTExMTExICAgICAgIDExMTExMTExMTExMTExICAtPiAgICAxMTExMTExMTExMTExMQorZHFvcjAyMyBvciAgICAxMTExMTExMTExMTExICAgICAgICAxMTExMTExMTExMTExICAtPiAgICAgMTExMTExMTExMTExMQorZHFvcjAyNCBvciAgICAgMTExMTExMTExMTExICAgICAgICAgMTExMTExMTExMTExICAtPiAgICAgIDExMTExMTExMTExMQorZHFvcjAyNSBvciAgICAgIDExMTExMTExMTExICAgICAgICAgIDExMTExMTExMTExICAtPiAgICAgICAxMTExMTExMTExMQorZHFvcjAyNiBvciAgICAgICAxMTExMTExMTExICAgICAgICAgICAxMTExMTExMTExICAtPiAgICAgICAgMTExMTExMTExMQorZHFvcjAyNyBvciAgICAgICAgMTExMTExMTExICAgICAgICAgICAgMTExMTExMTExICAtPiAgICAgICAgIDExMTExMTExMQorZHFvcjAyOCBvciAgICAgICAgIDExMTExMTExICAgICAgICAgICAgIDExMTExMTExICAtPiAgICAgICAgICAxMTExMTExMQorZHFvcjAyOSBvciAgICAgICAgICAxMTExMTExICAgICAgICAgICAgICAxMTExMTExICAtPiAgICAgICAgICAgMTExMTExMQorZHFvcjAzMCBvciAgICAgICAgICAgMTExMTExICAgICAgICAgICAgICAgMTExMTExICAtPiAgICAgICAgICAgIDExMTExMQorZHFvcjAzMSBvciAgICAgICAgICAgIDExMTExICAgICAgICAgICAgICAgIDExMTExICAtPiAgICAgICAgICAgICAxMTExMQorZHFvcjAzMiBvciAgICAgICAgICAgICAxMTExICAgICAgICAgICAgICAgICAxMTExICAtPiAgICAgICAgICAgICAgMTExMQorZHFvcjAzMyBvciAgICAgICAgICAgICAgMTExICAgICAgICAgICAgICAgICAgMTExICAtPiAgICAgICAgICAgICAgIDExMQorZHFvcjAzNCBvciAgICAgICAgICAgICAgIDExICAgICAgICAgICAgICAgICAgIDExICAtPiAgICAgICAgICAgICAgICAxMQorZHFvcjAzNSBvciAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAxICAtPiAgICAgICAgICAgICAgICAgMQorZHFvcjAzNiBvciAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAwICAtPiAgICAgICAgICAgICAgICAgMAorCitkcW9yMDQyIG9yICAxMTExMTExMTAwMDAwMDAgICAgIDExMTExMTExMTAwMDAwMDAgIC0+ICAxMTExMTExMTEwMDAwMDAwCitkcW9yMDQzIG9yICAgMTExMTExMTAwMDAwMDAgICAgIDEwMDAwMDAxMDAwMDAwMDAgIC0+ICAxMDExMTExMTEwMDAwMDAwCitkcW9yMDQ0IG9yICAgIDExMTExMTAwMDAwMDAgICAgIDEwMDAwMDEwMDAwMDAwMDAgIC0+ICAxMDAxMTExMTEwMDAwMDAwCitkcW9yMDQ1IG9yICAgICAxMTExMTAwMDAwMDAgICAgIDEwMDAwMTAwMDAwMDAwMDAgIC0+ICAxMDAwMTExMTEwMDAwMDAwCitkcW9yMDQ2IG9yICAgICAgMTExMTAwMDAwMDAgICAgIDEwMDAxMDAwMDAwMDAwMDAgIC0+ICAxMDAwMTExMTEwMDAwMDAwCitkcW9yMDQ3IG9yICAgICAgIDExMTAwMDAwMDAgICAgIDEwMDEwMDAwMDAwMDAwMDAgIC0+ICAxMDAxMDAxMTEwMDAwMDAwCitkcW9yMDQ4IG9yICAgICAgICAxMTAwMDAwMDAgICAgIDEwMTAwMDAwMDAwMDAwMDAgIC0+ICAxMDEwMDAwMTEwMDAwMDAwCitkcW9yMDQ5IG9yICAgICAgICAgMTAwMDAwMDAgICAgIDExMDAwMDAwMDAwMDAwMDAgIC0+ICAxMTAwMDAwMDEwMDAwMDAwCisKK2Rxb3IwOTAgb3IgMDExMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rxb3IwOTEgb3IgMTAxMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rxb3IwOTIgb3IgMTEwMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rxb3IwOTMgb3IgMTExMDExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rxb3IwOTQgb3IgMTExMTAxMTExICAxMTExMDExMTEgIC0+ICAxMTExMDExMTEKK2Rxb3IwOTUgb3IgMTExMTEwMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rxb3IwOTYgb3IgMTExMTExMDExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rxb3IwOTcgb3IgMTExMTExMTAxICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK2Rxb3IwOTggb3IgMTExMTExMTEwICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKKworZHFvcjEwMCBvciAxMTExMDExMTEgIDAxMTExMTExMSAgLT4gIDExMTExMTExMQorZHFvcjEwMSBvciAxMTExMDExMTEgIDEwMTExMTExMSAgLT4gIDExMTExMTExMQorZHFvcjEwMiBvciAxMTExMDExMTEgIDExMDExMTExMSAgLT4gIDExMTExMTExMQorZHFvcjEwMyBvciAxMTExMDExMTEgIDExMTAxMTExMSAgLT4gIDExMTExMTExMQorZHFvcjEwNCBvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gIDExMTEwMTExMQorZHFvcjEwNSBvciAxMTExMDExMTEgIDExMTExMDExMSAgLT4gIDExMTExMTExMQorZHFvcjEwNiBvciAxMTExMDExMTEgIDExMTExMTAxMSAgLT4gIDExMTExMTExMQorZHFvcjEwNyBvciAxMTExMDExMTEgIDExMTExMTEwMSAgLT4gIDExMTExMTExMQorZHFvcjEwOCBvciAxMTExMDExMTEgIDExMTExMTExMCAgLT4gIDExMTExMTExMQorCistLSBub24tMC8xIHNob3VsZCBub3QgYmUgYWNjZXB0ZWQsIG5vciBzaG91bGQgc2lnbnMKK2Rxb3IyMjAgb3IgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjEgb3IgMzMzMzMzMzMzICAzMzMzMzMzMzMgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjIgb3IgNTU1NTU1NTU1ICA1NTU1NTU1NTUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjMgb3IgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjQgb3IgOTk5OTk5OTk5ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjUgb3IgMjIyMjIyMjIyICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjYgb3IgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjcgb3IgNjY2NjY2NjY2ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjggb3IgODg4ODg4ODg4ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMjkgb3IgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMzAgb3IgOTk5OTk5OTk5ICA0NDQ0NDQ0NDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMzEgb3IgOTk5OTk5OTk5ICA2NjY2NjY2NjYgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyMzIgb3IgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK2Rxb3IyNDAgb3IgIDU2NzQ2ODY4OSAtOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNDEgb3IgIDU2NzM2NzY4OSAgOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNDIgb3IgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNDMgb3IgLTc1NjI1MzI1NyAgMTM4NTc5MjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNDQgb3IgIDgzNTU5MDE0OSAgNTY3NDM1NDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNECitkcW9yMjUwIG9yICAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI1MSBvciAgNzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNTIgb3IgIDgwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjUzIG9yICA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI1NCBvciAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNTUgb3IgIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjU2IG9yICA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI1NyBvciAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNTggb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjU5IG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDcwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI2MCBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNjEgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjYyIG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDIwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI2MyBvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNjQgb3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgODAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjY1IG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIDkwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQorZHFvcjI3MCBvciAgMDIwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDAwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNzEgb3IgIDA3MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjcyIG9yICAwODAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI3MyBvciAgMDkwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNzQgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAxMDAwMDAgMDIwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjc1IG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDEwMDAwIDA3MDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI3NiBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMTAwMCAwODAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyNzcgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAxMDAgMDkwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IExTRAorZHFvcjI4MCBvciAgMDAxMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMiAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyODEgb3IgIDAwMDEwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDcgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAxMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjgyIG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDAwMDAwMDA4IDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI4MyBvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAxMDAwMDAwMDAwOSAxMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyODQgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMDAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjg1IG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDAwMDAwIDAwMTAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDcgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI4NiBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAwMTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyODcgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorZHFvcjI4OCBvciAgMDAxMDAwMDExMTAwMDExMTAwMDExMTAwMDAyMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyODkgb3IgIDAwMDEwMDAxMTEwMDAxMTEwMDAxMTEwMDAwNzAwMDAwMDEgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjkwIG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDgwMDAwMDEwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI5MSBvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAxMDA5MDAwMDEwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyOTIgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDEwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAyMDEwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjkzIG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDEwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwNzAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI5NCBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDEwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDgwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyOTUgb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDA5MDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworZHFvcjI5NiBvciAtMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMjk3IG9yIC0xMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwICAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IyOTggb3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjI5OSBvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAgMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMTAwMDEwMCAtPiAgMTAwMDAwMTExMTAwMTExMTAwMTExMTAwMDAxMTAwMDEwMAorCistLSBObWF4LCBObWluLCBOdGlueS1saWtlCitkcW9yMzMxIG9yICAyICAgOS45OTk5OTk5OUUrMTk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzMzIgb3IgIDMgICAxRS0xOTk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjMzMyBvciAgNCAgIDEuMDAwMDAwMDBFLTE5OTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzM0IG9yICA1ICAgMUUtMTAwOSAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzMzUgb3IgIDYgICAtMUUtMTAwOSAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjMzNiBvciAgNyAgIC0xLjAwMDAwMDAwRS0xOTk5ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzM3IG9yICA4ICAgLTFFLTE5OTkgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzMzggb3IgIDkgICAtOS45OTk5OTk5OUUrMTk5OSAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM0MSBvciAgOS45OTk5OTk5OUUrMjk5OSAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzQyIG9yICAxRS0yOTk5ICAgICAgICAgICAgICAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNDMgb3IgIDEuMDAwMDAwMDBFLTI5OTkgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM0NCBvciAgMUUtMTAwOSAgICAgICAgICAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzQ1IG9yICAtMUUtMTAwOSAgICAgICAgICAgIC0xMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNDYgb3IgIC0xLjAwMDAwMDAwRS0yOTk5ICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM0NyBvciAgLTFFLTI5OTkgICAgICAgICAgICAgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzQ4IG9yICAtOS45OTk5OTk5OUUrMjk5OSAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCitkcW9yMzYxIG9yICAxLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNjIgb3IgIDFFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM2MyBvciAgMC4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzY0IG9yICAwRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNjUgb3IgIDkuOSAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM2NiBvciAgOUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzcxIG9yICAwIDEuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNzIgb3IgIDAgMUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM3MyBvciAgMCAwLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yMzc0IG9yICAwIDBFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3IzNzUgb3IgIDAgOS45ICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjM3NiBvciAgMCA5RSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK2Rxb3I3ODAgb3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc4MSBvciAtSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzgyIG9yIC1JbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3ODMgb3IgLUluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc4NCBvciAtSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzg1IG9yIC1JbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3ODYgb3IgLUluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc4NyBvciAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzg4IG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3ODkgb3IgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc5MCBvciAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzkxIG9yICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I3OTIgb3IgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjc5MyBvciAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yNzk0IG9yICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFvcjgwMCBvciAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODAxIG9yICBJbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MDIgb3IgIEluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgwMyBvciAgSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODA0IG9yICBJbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MDUgb3IgIEluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgwNiBvciAgSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODA3IG9yICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MDggb3IgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgwOSBvciAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODEwIG9yIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MTEgb3IgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgxMiBvciAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODEzIG9yICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MTQgb3IgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgxNSBvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rxb3I4MjEgb3IgIE5hTiAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgyMiBvciAgTmFOIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODIzIG9yICBOYU4gLTEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MjQgb3IgIE5hTiAtMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgyNSBvciAgTmFOICAwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODI2IG9yICBOYU4gIDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4Mjcgb3IgIE5hTiAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgyOCBvciAgTmFOICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODI5IG9yICBOYU4gIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MzAgb3IgLUluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgzMSBvciAtMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODMyIG9yIC0xICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MzMgb3IgLTAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgzNCBvciAgMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODM1IG9yICAxICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4MzYgb3IgIDEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjgzNyBvciAgSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rxb3I4NDEgb3IgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODQyIG9yICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg0MyBvciAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NDQgb3IgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODQ1IG9yICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg0NiBvciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NDcgb3IgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODQ4IG9yICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg0OSBvciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NTAgb3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODUxIG9yIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg1MiBvciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NTMgb3IgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODU0IG9yIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg1NSBvciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NTYgb3IgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODU3IG9yICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg1OCBvciAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NTkgb3IgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2Rxb3I4NjEgb3IgIE5hTjEgICAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg2MiBvciArTmFOMiAgIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODYzIG9yICBOYU4zICAgIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NjQgb3IgIE5hTjQgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg2NSBvciAgTmFONSAgICtOYU42ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODY2IG9yIC1JbmYgICAgIE5hTjcgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4Njcgb3IgLTEwMDAgICAgTmFOOCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg2OCBvciAgMTAwMCAgICBOYU45ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODY5IG9yICBJbmYgICAgK05hTjEwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NzEgb3IgIHNOYU4xMSAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg3MiBvciAgc05hTjEyICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODczIG9yICBzTmFOMTMgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4NzQgb3IgIHNOYU4xNCAgIE5hTjE3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg3NSBvciAgc05hTjE1ICBzTmFOMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODc2IG9yICBOYU4xNiAgIHNOYU4xOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4Nzcgb3IgLUluZiAgICArc05hTjIwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg3OCBvciAtMTAwMCAgICBzTmFOMjEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODc5IG9yICAxMDAwICAgIHNOYU4yMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4ODAgb3IgIEluZiAgICAgc05hTjIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg4MSBvciArTmFOMjUgICtzTmFOMjQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODgyIG9yIC1OYU4yNiAgICBOYU4yOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxb3I4ODMgb3IgLXNOYU4yNyAgc05hTjI5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFvcjg4NCBvciAgMTAwMCAgICAtTmFOMzAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcW9yODg1IG9yICAxMDAwICAgLXNOYU4zMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFQbHVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUGx1cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZWNhYWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUGx1cy5kZWNUZXN0CkBAIC0wLDAgKzEsODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFQbHVzLmRlY1Rlc3QgLS0gZGVjUXVhZCAwK3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkcXBsczAwMSBwbHVzICAgICAgICs3LjUwICAtPiA3LjUwCisKKy0tIEluZmluaXRpZXMKK2RxcGxzMDExIHBsdXMgIEluZmluaXR5ICAgIC0+IEluZmluaXR5CitkcXBsczAxMiBwbHVzICAtSW5maW5pdHkgICAtPiAtSW5maW5pdHkKKworLS0gTmFOcywgMCBwYXlsb2FkCitkZHFsczAyMSBwbHVzICAgICAgICAgTmFOICAtPiBOYU4KK2RkcWxzMDIyIHBsdXMgICAgICAgIC1OYU4gIC0+IC1OYU4KK2RkcWxzMDIzIHBsdXMgICAgICAgIHNOYU4gIC0+IE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RkcWxzMDI0IHBsdXMgICAgICAgLXNOYU4gIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorZGRxbHMwMzEgcGx1cyAgICAgICBOYU4xMyAgLT4gTmFOMTMKK2RkcWxzMDMyIHBsdXMgICAgICAtTmFOMTMgIC0+IC1OYU4xMworZGRxbHMwMzMgcGx1cyAgICAgIHNOYU4xMyAgLT4gTmFOMTMgICBJbnZhbGlkX29wZXJhdGlvbgorZGRxbHMwMzQgcGx1cyAgICAgLXNOYU4xMyAgLT4gLU5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZGRxbHMwMzUgcGx1cyAgICAgICBOYU43MCAgLT4gTmFONzAKK2RkcWxzMDM2IHBsdXMgICAgICAtTmFONzAgIC0+IC1OYU43MAorZGRxbHMwMzcgcGx1cyAgICAgIHNOYU4xMDEgLT4gTmFOMTAxICBJbnZhbGlkX29wZXJhdGlvbgorZGRxbHMwMzggcGx1cyAgICAgLXNOYU4xMDEgLT4gLU5hTjEwMSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmaW5pdGVzCitkcXBsczEwMSBwbHVzICAgICAgICAgIDcgICAtPiA3CitkcXBsczEwMiBwbHVzICAgICAgICAgLTcgICAtPiAtNworZHFwbHMxMDMgcGx1cyAgICAgICAgIDc1ICAgLT4gNzUKK2RxcGxzMTA0IHBsdXMgICAgICAgIC03NSAgIC0+IC03NQorZHFwbHMxMDUgcGx1cyAgICAgICA3LjUwICAgLT4gNy41MAorZHFwbHMxMDYgcGx1cyAgICAgIC03LjUwICAgLT4gLTcuNTAKK2RxcGxzMTA3IHBsdXMgICAgICAgNy41MDAgIC0+IDcuNTAwCitkcXBsczEwOCBwbHVzICAgICAgLTcuNTAwICAtPiAtNy41MDAKKworLS0gemVyb3MKK2RxcGxzMTExIHBsdXMgICAgICAgICAgMCAgIC0+IDAKK2RxcGxzMTEyIHBsdXMgICAgICAgICAtMCAgIC0+IDAKK2RxcGxzMTEzIHBsdXMgICAgICAgMEUrNCAgIC0+IDBFKzQKK2RxcGxzMTE0IHBsdXMgICAgICAtMEUrNCAgIC0+IDBFKzQKK2RxcGxzMTE1IHBsdXMgICAgIDAuMDAwMCAgIC0+IDAuMDAwMAorZHFwbHMxMTYgcGx1cyAgICAtMC4wMDAwICAgLT4gMC4wMDAwCitkcXBsczExNyBwbHVzICAgICAgMEUtMTQxICAtPiAwRS0xNDEKK2RxcGxzMTE4IHBsdXMgICAgIC0wRS0xNDEgIC0+IDBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworZHFwbHMxMjEgcGx1cyAgIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIgICAgLT4gIDI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODI2ODIKK2RxcGxzMTIyIHBsdXMgIC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyICAgIC0+IC0yNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyNjgyCitkcXBsczEyMyBwbHVzICAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MSAgICAtPiAgMTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MTM0MQorZHFwbHMxMjQgcGx1cyAgLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEgICAgLT4gLTEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEzNDEKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK2RxcGxzMTMxIHBsdXMgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLT4gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXBsczEzMiBwbHVzICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAxRS02MTQzCitkcXBsczEzMyBwbHVzICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFwbHMxMzQgcGx1cyAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgMUUtNjE3NiBTdWJub3JtYWwKKworZHFwbHMxMzUgcGx1cyAgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE3NiBTdWJub3JtYWwKK2RxcGxzMTM2IHBsdXMgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcXBsczEzNyBwbHVzICAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTQzCitkcXBsczEzOCBwbHVzICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVF1YW50aXplLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUXVhbnRpemUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ3MWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVF1YW50aXplLmRlY1Rlc3QKQEAgLTAsMCArMSw4MzYgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFRdWFudGl6ZS5kZWNUZXN0IC0tIGRlY1F1YWQgcXVhbnRpemUgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBNb3N0IG9mIHRoZSB0ZXN0cyBoZXJlIGFzc3VtZSBhICJyZWd1bGFyIHBhdHRlcm4iLCB3aGVyZSB0aGUKKy0tIHNpZ24gYW5kIGNvZWZmaWNpZW50IGFyZSArMS4KKy0tIDIwMDQuMDMuMTUgVW5kZXJmbG93IGZvciBxdWFudGl6ZSBpcyBzdXBwcmVzc2VkCistLSAyMDA1LjA2LjA4IE1vcmUgZXh0ZW5zaXZlIHRlc3RzIGZvciAnZG9lcyBub3QgZml0JworLS0gW0ZvcmtlZCBmcm9tIHF1YW50aXplLmRlY1Rlc3QgMjAwNi4xMS4yNV0KKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcworZHFxdWEwMDEgcXVhbnRpemUgMCAgICAgICAxZTAgICAtPiAwCitkcXF1YTAwMiBxdWFudGl6ZSAxICAgICAgIDFlMCAgIC0+IDEKK2RxcXVhMDAzIHF1YW50aXplIDAuMSAgICAxZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDA1IHF1YW50aXplIDAuMSAgICAxZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDA2IHF1YW50aXplIDAuMSAgICAgMWUwICAgLT4gMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDA3IHF1YW50aXplIDAuMSAgICAxZS0xICAgLT4gMC4xCitkcXF1YTAwOCBxdWFudGl6ZSAwLjEgICAgMWUtMiAgIC0+IDAuMTAKK2RxcXVhMDA5IHF1YW50aXplIDAuMSAgICAxZS0zICAgLT4gMC4xMDAKK2RxcXVhMDEwIHF1YW50aXplIDAuOSAgICAxZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDExIHF1YW50aXplIDAuOSAgICAxZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDEyIHF1YW50aXplIDAuOSAgICAxZSswICAgLT4gMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDEzIHF1YW50aXplIDAuOSAgICAxZS0xICAgLT4gMC45CitkcXF1YTAxNCBxdWFudGl6ZSAwLjkgICAgMWUtMiAgIC0+IDAuOTAKK2RxcXVhMDE1IHF1YW50aXplIDAuOSAgICAxZS0zICAgLT4gMC45MDAKKy0tIG5lZ2F0aXZlcworZHFxdWEwMjEgcXVhbnRpemUgLTAgICAgICAxZTAgICAtPiAtMAorZHFxdWEwMjIgcXVhbnRpemUgLTEgICAgICAxZTAgICAtPiAtMQorZHFxdWEwMjMgcXVhbnRpemUgLTAuMSAgIDFlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDI1IHF1YW50aXplIC0wLjEgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTAyNiBxdWFudGl6ZSAtMC4xICAgIDFlMCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMjcgcXVhbnRpemUgLTAuMSAgIDFlLTEgICAtPiAtMC4xCitkcXF1YTAyOCBxdWFudGl6ZSAtMC4xICAgMWUtMiAgIC0+IC0wLjEwCitkcXF1YTAyOSBxdWFudGl6ZSAtMC4xICAgMWUtMyAgIC0+IC0wLjEwMAorZHFxdWEwMzAgcXVhbnRpemUgLTAuOSAgIDFlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDMxIHF1YW50aXplIC0wLjkgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTAzMiBxdWFudGl6ZSAtMC45ICAgMWUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMzMgcXVhbnRpemUgLTAuOSAgIDFlLTEgICAtPiAtMC45CitkcXF1YTAzNCBxdWFudGl6ZSAtMC45ICAgMWUtMiAgIC0+IC0wLjkwCitkcXF1YTAzNSBxdWFudGl6ZSAtMC45ICAgMWUtMyAgIC0+IC0wLjkwMAorZHFxdWEwMzYgcXVhbnRpemUgLTAuNSAgIDFlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDM3IHF1YW50aXplIC0wLjUgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTAzOCBxdWFudGl6ZSAtMC41ICAgMWUrMCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorZHFxdWEwMzkgcXVhbnRpemUgLTAuNSAgIDFlLTEgICAtPiAtMC41CitkcXF1YTA0MCBxdWFudGl6ZSAtMC41ICAgMWUtMiAgIC0+IC0wLjUwCitkcXF1YTA0MSBxdWFudGl6ZSAtMC41ICAgMWUtMyAgIC0+IC0wLjUwMAorZHFxdWEwNDIgcXVhbnRpemUgLTAuOSAgIDFlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMDQzIHF1YW50aXplIC0wLjkgICAxZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA0NCBxdWFudGl6ZSAtMC45ICAgMWUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorZHFxdWEwNDUgcXVhbnRpemUgLTAuOSAgIDFlLTEgICAtPiAtMC45CitkcXF1YTA0NiBxdWFudGl6ZSAtMC45ICAgMWUtMiAgIC0+IC0wLjkwCitkcXF1YTA0NyBxdWFudGl6ZSAtMC45ICAgMWUtMyAgIC0+IC0wLjkwMAorCistLSBleGFtcGxlcyBmcm9tIFNwZWNpZmljYXRpb24KK2RxcXVhMDYwIHF1YW50aXplIDIuMTcgICAwLjAwMSAgLT4gMi4xNzAKK2RxcXVhMDYxIHF1YW50aXplIDIuMTcgICAwLjAxICAgLT4gMi4xNworZHFxdWEwNjIgcXVhbnRpemUgMi4xNyAgIDAuMSAgICAtPiAyLjIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA2MyBxdWFudGl6ZSAyLjE3ICAgMWUrMCAgIC0+IDIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA2NCBxdWFudGl6ZSAyLjE3ICAgMWUrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA2NSBxdWFudGl6ZSAtSW5mICAgIEluZiAgIC0+IC1JbmZpbml0eQorZHFxdWEwNjYgcXVhbnRpemUgMiAgICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhMDY3IHF1YW50aXplIC0wLjEgICAgMSAgICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA2OCBxdWFudGl6ZSAtMCAgICAgIDFlKzUgICAgIC0+IC0wRSs1CitkcXF1YTA2OSBxdWFudGl6ZSArMTIzNDUxMjM0NTY3ODk5ODc2NTQzMjE2Nzg5MDEyMzQ1LjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhMDcwIHF1YW50aXplIC05ODc2NTEyMzQ1Njc4OTk4NzY1NDMyMTQzMzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWEwNzEgcXVhbnRpemUgMjE3ICAgIDFlLTEgICAtPiAyMTcuMAorZHFxdWEwNzIgcXVhbnRpemUgMjE3ICAgIDFlKzAgICAtPiAyMTcKK2RxcXVhMDczIHF1YW50aXplIDIxNyAgICAxZSsxICAgLT4gMi4yRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEwNzQgcXVhbnRpemUgMjE3ICAgIDFlKzIgICAtPiAyRSsyIEluZXhhY3QgUm91bmRlZAorCistLSBnZW5lcmFsIHRlc3RzIC4uCitkcXF1YTA4OSBxdWFudGl6ZSAxMiAgICAgMWUrNCAgIC0+IDBFKzQgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5MCBxdWFudGl6ZSAxMiAgICAgMWUrMyAgIC0+IDBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5MSBxdWFudGl6ZSAxMiAgICAgMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5MiBxdWFudGl6ZSAxMiAgICAgMWUrMSAgIC0+IDFFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5MyBxdWFudGl6ZSAxLjIzNDUgMWUtMiAgIC0+IDEuMjMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5NCBxdWFudGl6ZSAxLjIzNTUgMWUtMiAgIC0+IDEuMjQgSW5leGFjdCBSb3VuZGVkCitkcXF1YTA5NSBxdWFudGl6ZSAxLjIzNDUgMWUtNiAgIC0+IDEuMjM0NTAwCitkcXF1YTA5NiBxdWFudGl6ZSA5Ljk5OTkgMWUtMiAgIC0+IDEwLjAwIEluZXhhY3QgUm91bmRlZAorZHFxdWEwOTcgcXVhbnRpemUgMC4wMDAxIDFlLTIgICAtPiAwLjAwIEluZXhhY3QgUm91bmRlZAorZHFxdWEwOTggcXVhbnRpemUgMC4wMDEgIDFlLTIgICAtPiAwLjAwIEluZXhhY3QgUm91bmRlZAorZHFxdWEwOTkgcXVhbnRpemUgMC4wMDkgIDFlLTIgICAtPiAwLjAxIEluZXhhY3QgUm91bmRlZAorZHFxdWExMDAgcXVhbnRpemUgOTIgICAgIDFlKzIgICAtPiAxRSsyIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTEwMSBxdWFudGl6ZSAtMSAgICAgIDFlMCAgIC0+ICAtMQorZHFxdWExMDIgcXVhbnRpemUgLTEgICAgIDFlLTEgICAtPiAgLTEuMAorZHFxdWExMDMgcXVhbnRpemUgLTEgICAgIDFlLTIgICAtPiAgLTEuMDAKK2RxcXVhMTA0IHF1YW50aXplICAwICAgICAgMWUwICAgLT4gIDAKK2RxcXVhMTA1IHF1YW50aXplICAwICAgICAxZS0xICAgLT4gIDAuMAorZHFxdWExMDYgcXVhbnRpemUgIDAgICAgIDFlLTIgICAtPiAgMC4wMAorZHFxdWExMDcgcXVhbnRpemUgIDAuMDAgICAxZTAgICAtPiAgMAorZHFxdWExMDggcXVhbnRpemUgIDAgICAgIDFlKzEgICAtPiAgMEUrMQorZHFxdWExMDkgcXVhbnRpemUgIDAgICAgIDFlKzIgICAtPiAgMEUrMgorZHFxdWExMTAgcXVhbnRpemUgKzEgICAgICAxZTAgICAtPiAgMQorZHFxdWExMTEgcXVhbnRpemUgKzEgICAgIDFlLTEgICAtPiAgMS4wCitkcXF1YTExMiBxdWFudGl6ZSArMSAgICAgMWUtMiAgIC0+ICAxLjAwCisKK2RxcXVhMTIwIHF1YW50aXplICAgMS4wNCAgMWUtMyAtPiAgMS4wNDAKK2RxcXVhMTIxIHF1YW50aXplICAgMS4wNCAgMWUtMiAtPiAgMS4wNAorZHFxdWExMjIgcXVhbnRpemUgICAxLjA0ICAxZS0xIC0+ICAxLjAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEyMyBxdWFudGl6ZSAgIDEuMDQgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEyNCBxdWFudGl6ZSAgIDEuMDUgIDFlLTMgLT4gIDEuMDUwCitkcXF1YTEyNSBxdWFudGl6ZSAgIDEuMDUgIDFlLTIgLT4gIDEuMDUKK2RxcXVhMTI2IHF1YW50aXplICAgMS4wNSAgMWUtMSAtPiAgMS4wIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzEgcXVhbnRpemUgICAxLjA1ICAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzIgcXVhbnRpemUgICAxLjA2ICAxZS0zIC0+ICAxLjA2MAorZHFxdWExMzMgcXVhbnRpemUgICAxLjA2ICAxZS0yIC0+ICAxLjA2CitkcXF1YTEzNCBxdWFudGl6ZSAgIDEuMDYgIDFlLTEgLT4gIDEuMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTM1IHF1YW50aXplICAgMS4wNiAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWExNDAgcXVhbnRpemUgICAtMTAgICAgMWUtMiAgLT4gIC0xMC4wMAorZHFxdWExNDEgcXVhbnRpemUgICArMSAgICAgMWUtMiAgLT4gIDEuMDAKK2RxcXVhMTQyIHF1YW50aXplICAgKzEwICAgIDFlLTIgIC0+ICAxMC4wMAorZHFxdWExNDMgcXVhbnRpemUgICAxRSszNyAgMWUtMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWExNDQgcXVhbnRpemUgICAxRS0zNyAgMWUtMiAgLT4gIDAuMDAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE0NSBxdWFudGl6ZSAgIDFFLTMgICAxZS0yICAtPiAgMC4wMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQ2IHF1YW50aXplICAgMUUtMiAgIDFlLTIgIC0+ICAwLjAxCitkcXF1YTE0NyBxdWFudGl6ZSAgIDFFLTEgICAxZS0yICAtPiAgMC4xMAorZHFxdWExNDggcXVhbnRpemUgICAwRS0zNyAgMWUtMiAgLT4gIDAuMDAKKworZHFxdWExNTAgcXVhbnRpemUgICAxLjA2MDAgMWUtNSAtPiAgMS4wNjAwMAorZHFxdWExNTEgcXVhbnRpemUgICAxLjA2MDAgMWUtNCAtPiAgMS4wNjAwCitkcXF1YTE1MiBxdWFudGl6ZSAgIDEuMDYwMCAxZS0zIC0+ICAxLjA2MCBSb3VuZGVkCitkcXF1YTE1MyBxdWFudGl6ZSAgIDEuMDYwMCAxZS0yIC0+ICAxLjA2IFJvdW5kZWQKK2RxcXVhMTU0IHF1YW50aXplICAgMS4wNjAwIDFlLTEgLT4gIDEuMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTU1IHF1YW50aXplICAgMS4wNjAwICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIGEgY291cGxlIHdoZXJlIHJvdW5kaW5nIHdhcyBkaWZmZXJlbnQgaW4gYmFzZSB0ZXN0cworcm91bmRpbmc6ICAgIGhhbGZfdXAKK2RxcXVhMTU3IHF1YW50aXplIC0wLjUgICAxZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE1OCBxdWFudGl6ZSAgIDEuMDUgIDFlLTEgLT4gIDEuMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTU5IHF1YW50aXplICAgMS4wNiAgIDFlMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gYmFzZSB0ZXN0cyB3aXRoIG5vbi0xIGNvZWZmaWNpZW50cworZHFxdWExNjEgcXVhbnRpemUgMCAgICAgIC05ZTAgICAtPiAwCitkcXF1YTE2MiBxdWFudGl6ZSAxICAgICAgLTdlMCAgIC0+IDEKK2RxcXVhMTYzIHF1YW50aXplIDAuMSAgIC0xZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTY1IHF1YW50aXplIDAuMSAgICAwZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTY2IHF1YW50aXplIDAuMSAgICAgMmUwICAgLT4gMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTY3IHF1YW50aXplIDAuMSAgICAzZS0xICAgLT4gMC4xCitkcXF1YTE2OCBxdWFudGl6ZSAwLjEgICA0NGUtMiAgIC0+IDAuMTAKK2RxcXVhMTY5IHF1YW50aXplIDAuMSAgNTU1ZS0zICAgLT4gMC4xMDAKK2RxcXVhMTcwIHF1YW50aXplIDAuOSA2NjY2ZSsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcxIHF1YW50aXplIDAuOSAtNzc3ZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcyIHF1YW50aXplIDAuOSAgLTg4ZSswICAgLT4gMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTczIHF1YW50aXplIDAuOSAgIC05ZS0xICAgLT4gMC45CitkcXF1YTE3NCBxdWFudGl6ZSAwLjkgICAgMGUtMiAgIC0+IDAuOTAKK2RxcXVhMTc1IHF1YW50aXplIDAuOSAgMS4xZS0zICAgLT4gMC45MDAwCistLSBuZWdhdGl2ZXMKK2RxcXVhMTgxIHF1YW50aXplIC0wICAgIDEuMWUwICAgLT4gLTAuMAorZHFxdWExODIgcXVhbnRpemUgLTEgICAgIC0xZTAgICAtPiAtMQorZHFxdWExODMgcXVhbnRpemUgLTAuMSAgMTFlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTg1IHF1YW50aXplIC0wLjEgMTExZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE4NiBxdWFudGl6ZSAtMC4xICAgNzFlMCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorZHFxdWExODcgcXVhbnRpemUgLTAuMSAtOTFlLTEgICAtPiAtMC4xCitkcXF1YTE4OCBxdWFudGl6ZSAtMC4xIC0uMWUtMiAgIC0+IC0wLjEwMAorZHFxdWExODkgcXVhbnRpemUgLTAuMSAgLTFlLTMgICAtPiAtMC4xMDAKK2RxcXVhMTkwIHF1YW50aXplIC0wLjkgICAwZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE5MSBxdWFudGl6ZSAtMC45ICAtMGUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWExOTIgcXVhbnRpemUgLTAuOSAtMTBlKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTkzIHF1YW50aXplIC0wLjkgMTAwZS0xICAgLT4gLTAuOQorZHFxdWExOTQgcXVhbnRpemUgLTAuOSA5OTllLTIgICAtPiAtMC45MAorCistLSArdmUgZXhwb25lbnRzIC4uCitkcXF1YTIwMSBxdWFudGl6ZSAgIC0xICAgMWUrMCAtPiAgLTEKK2RxcXVhMjAyIHF1YW50aXplICAgLTEgICAxZSsxIC0+ICAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjAzIHF1YW50aXplICAgLTEgICAxZSsyIC0+ICAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjA0IHF1YW50aXplICAgIDAgICAxZSswIC0+ICAwCitkcXF1YTIwNSBxdWFudGl6ZSAgICAwICAgMWUrMSAtPiAgMEUrMQorZHFxdWEyMDYgcXVhbnRpemUgICAgMCAgIDFlKzIgLT4gIDBFKzIKK2RxcXVhMjA3IHF1YW50aXplICAgKzEgICAxZSswIC0+ICAxCitkcXF1YTIwOCBxdWFudGl6ZSAgICsxICAgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjA5IHF1YW50aXplICAgKzEgICAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTIyMCBxdWFudGl6ZSAgIDEuMDQgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjIxIHF1YW50aXplICAgMS4wNCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjIgcXVhbnRpemUgICAxLjA0IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyMyBxdWFudGl6ZSAgIDEuMDQgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjI0IHF1YW50aXplICAgMS4wNSAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjUgcXVhbnRpemUgICAxLjA1IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyNiBxdWFudGl6ZSAgIDEuMDUgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjI3IHF1YW50aXplICAgMS4wNSAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjggcXVhbnRpemUgICAxLjA1IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyOSBxdWFudGl6ZSAgIDEuMDUgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMwIHF1YW50aXplICAgMS4wNSAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzEgcXVhbnRpemUgICAxLjA1IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzMiBxdWFudGl6ZSAgIDEuMDYgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMzIHF1YW50aXplICAgMS4wNiAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzQgcXVhbnRpemUgICAxLjA2IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzNSBxdWFudGl6ZSAgIDEuMDYgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWEyNDAgcXVhbnRpemUgICAtMTAgICAxZSsxICAtPiAgLTFFKzEgUm91bmRlZAorZHFxdWEyNDEgcXVhbnRpemUgICArMSAgICAxZSsxICAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjQyIHF1YW50aXplICAgKzEwICAgMWUrMSAgLT4gIDFFKzEgUm91bmRlZAorZHFxdWEyNDMgcXVhbnRpemUgICAxRSsxICAxZSsxICAtPiAgMUUrMSAgICAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkcXF1YTI0NCBxdWFudGl6ZSAgIDFFKzIgIDFlKzEgIC0+ICAxLjBFKzIgICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RxcXVhMjQ1IHF1YW50aXplICAgMUUrMyAgMWUrMSAgLT4gIDEuMDBFKzMgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZHFxdWEyNDYgcXVhbnRpemUgICAxRSs0ICAxZSsxICAtPiAgMS4wMDBFKzQgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkcXF1YTI0NyBxdWFudGl6ZSAgIDFFKzUgIDFlKzEgIC0+ICAxLjAwMDBFKzUgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RxcXVhMjQ4IHF1YW50aXplICAgMUUrNiAgMWUrMSAgLT4gIDEuMDAwMDBFKzYgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorZHFxdWEyNDkgcXVhbnRpemUgICAxRSs3ICAxZSsxICAtPiAgMS4wMDAwMDBFKzcgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitkcXF1YTI1MCBxdWFudGl6ZSAgIDFFKzggIDFlKzEgIC0+ICAxLjAwMDAwMDBFKzggIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK2RxcXVhMjUxIHF1YW50aXplICAgMUUrOSAgMWUrMSAgLT4gIDEuMDAwMDAwMDBFKzkgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorLS0gbmV4dCBvbmUgdHJpZXMgdG8gYWRkIDkgemVyb3MKK2RxcXVhMjUyIHF1YW50aXplICAgMUUrMzcgMWUrMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWEyNTMgcXVhbnRpemUgICAxRS0zNyAxZSsxICAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjU0IHF1YW50aXplICAgMUUtMiAgMWUrMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI1NSBxdWFudGl6ZSAgIDBFLTM3IDFlKzEgIC0+ICAwRSsxCitkcXF1YTI1NiBxdWFudGl6ZSAgLTBFLTM3IDFlKzEgIC0+IC0wRSsxCitkcXF1YTI1NyBxdWFudGl6ZSAgLTBFLTEgIDFlKzEgIC0+IC0wRSsxCitkcXF1YTI1OCBxdWFudGl6ZSAgLTAgICAgIDFlKzEgIC0+IC0wRSsxCitkcXF1YTI1OSBxdWFudGl6ZSAgLTBFKzEgIDFlKzEgIC0+IC0wRSsxCisKK2RxcXVhMjYwIHF1YW50aXplICAgLTEwICAgMWUrMiAgLT4gIC0wRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyNjEgcXVhbnRpemUgICArMSAgICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjYyIHF1YW50aXplICAgKzEwICAgMWUrMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI2MyBxdWFudGl6ZSAgIDFFKzEgIDFlKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorZHFxdWEyNjQgcXVhbnRpemUgICAxRSsyICAxZSsyICAtPiAgMUUrMgorZHFxdWEyNjUgcXVhbnRpemUgICAxRSszICAxZSsyICAtPiAgMS4wRSszCitkcXF1YTI2NiBxdWFudGl6ZSAgIDFFKzQgIDFlKzIgIC0+ICAxLjAwRSs0CitkcXF1YTI2NyBxdWFudGl6ZSAgIDFFKzUgIDFlKzIgIC0+ICAxLjAwMEUrNQorZHFxdWEyNjggcXVhbnRpemUgICAxRSs2ICAxZSsyICAtPiAgMS4wMDAwRSs2CitkcXF1YTI2OSBxdWFudGl6ZSAgIDFFKzcgIDFlKzIgIC0+ICAxLjAwMDAwRSs3CitkcXF1YTI3MCBxdWFudGl6ZSAgIDFFKzggIDFlKzIgIC0+ICAxLjAwMDAwMEUrOAorZHFxdWEyNzEgcXVhbnRpemUgICAxRSs5ICAxZSsyICAtPiAgMS4wMDAwMDAwRSs5CitkcXF1YTI3MiBxdWFudGl6ZSAgIDFFKzEwIDFlKzIgIC0+ICAxLjAwMDAwMDAwRSsxMAorZHFxdWEyNzMgcXVhbnRpemUgICAxRS0xMCAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjc0IHF1YW50aXplICAgMUUtMiAgMWUrMiAgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI3NSBxdWFudGl6ZSAgIDBFLTEwIDFlKzIgIC0+ICAwRSsyCisKK2RxcXVhMjgwIHF1YW50aXplICAgLTEwICAgMWUrMyAgLT4gIC0wRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyODEgcXVhbnRpemUgICArMSAgICAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjgyIHF1YW50aXplICAgKzEwICAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI4MyBxdWFudGl6ZSAgIDFFKzEgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyODQgcXVhbnRpemUgICAxRSsyICAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjg1IHF1YW50aXplICAgMUUrMyAgMWUrMyAgLT4gIDFFKzMKK2RxcXVhMjg2IHF1YW50aXplICAgMUUrNCAgMWUrMyAgLT4gIDEuMEUrNAorZHFxdWEyODcgcXVhbnRpemUgICAxRSs1ICAxZSszICAtPiAgMS4wMEUrNQorZHFxdWEyODggcXVhbnRpemUgICAxRSs2ICAxZSszICAtPiAgMS4wMDBFKzYKK2RxcXVhMjg5IHF1YW50aXplICAgMUUrNyAgMWUrMyAgLT4gIDEuMDAwMEUrNworZHFxdWEyOTAgcXVhbnRpemUgICAxRSs4ICAxZSszICAtPiAgMS4wMDAwMEUrOAorZHFxdWEyOTEgcXVhbnRpemUgICAxRSs5ICAxZSszICAtPiAgMS4wMDAwMDBFKzkKK2RxcXVhMjkyIHF1YW50aXplICAgMUUrMTAgMWUrMyAgLT4gIDEuMDAwMDAwMEUrMTAKK2RxcXVhMjkzIHF1YW50aXplICAgMUUtMTAgMWUrMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitkcXF1YTI5NCBxdWFudGl6ZSAgIDFFLTIgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorZHFxdWEyOTUgcXVhbnRpemUgICAwRS0xMCAxZSszICAtPiAgMEUrMworCistLSByb3VuZCB1cCBmcm9tIGJlbG93IFtzaWduIHdyb25nIGluIEpJVCBjb21waWxlciBvbmNlXQorZHFxdWEzMDAgcXVhbnRpemUgICAwLjAwNzggMWUtNSAtPiAgMC4wMDc4MAorZHFxdWEzMDEgcXVhbnRpemUgICAwLjAwNzggMWUtNCAtPiAgMC4wMDc4CitkcXF1YTMwMiBxdWFudGl6ZSAgIDAuMDA3OCAxZS0zIC0+ICAwLjAwOCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzAzIHF1YW50aXplICAgMC4wMDc4IDFlLTIgLT4gIDAuMDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMwNCBxdWFudGl6ZSAgIDAuMDA3OCAxZS0xIC0+ICAwLjAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMwNSBxdWFudGl6ZSAgIDAuMDA3OCAgMWUwIC0+ICAwIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMDYgcXVhbnRpemUgICAwLjAwNzggMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzA3IHF1YW50aXplICAgMC4wMDc4IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMzEwIHF1YW50aXplICAtMC4wMDc4IDFlLTUgLT4gLTAuMDA3ODAKK2RxcXVhMzExIHF1YW50aXplICAtMC4wMDc4IDFlLTQgLT4gLTAuMDA3OAorZHFxdWEzMTIgcXVhbnRpemUgIC0wLjAwNzggMWUtMyAtPiAtMC4wMDggSW5leGFjdCBSb3VuZGVkCitkcXF1YTMxMyBxdWFudGl6ZSAgLTAuMDA3OCAxZS0yIC0+IC0wLjAxIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMTQgcXVhbnRpemUgIC0wLjAwNzggMWUtMSAtPiAtMC4wIEluZXhhY3QgUm91bmRlZAorZHFxdWEzMTUgcXVhbnRpemUgIC0wLjAwNzggIDFlMCAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzE2IHF1YW50aXplICAtMC4wMDc4IDFlKzEgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMxNyBxdWFudGl6ZSAgLTAuMDA3OCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTMyMCBxdWFudGl6ZSAgIDAuMDc4IDFlLTUgLT4gIDAuMDc4MDAKK2RxcXVhMzIxIHF1YW50aXplICAgMC4wNzggMWUtNCAtPiAgMC4wNzgwCitkcXF1YTMyMiBxdWFudGl6ZSAgIDAuMDc4IDFlLTMgLT4gIDAuMDc4CitkcXF1YTMyMyBxdWFudGl6ZSAgIDAuMDc4IDFlLTIgLT4gIDAuMDggSW5leGFjdCBSb3VuZGVkCitkcXF1YTMyNCBxdWFudGl6ZSAgIDAuMDc4IDFlLTEgLT4gIDAuMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzI1IHF1YW50aXplICAgMC4wNzggIDFlMCAtPiAgMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzI2IHF1YW50aXplICAgMC4wNzggMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzI3IHF1YW50aXplICAgMC4wNzggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWEzMzAgcXVhbnRpemUgIC0wLjA3OCAxZS01IC0+IC0wLjA3ODAwCitkcXF1YTMzMSBxdWFudGl6ZSAgLTAuMDc4IDFlLTQgLT4gLTAuMDc4MAorZHFxdWEzMzIgcXVhbnRpemUgIC0wLjA3OCAxZS0zIC0+IC0wLjA3OAorZHFxdWEzMzMgcXVhbnRpemUgIC0wLjA3OCAxZS0yIC0+IC0wLjA4IEluZXhhY3QgUm91bmRlZAorZHFxdWEzMzQgcXVhbnRpemUgIC0wLjA3OCAxZS0xIC0+IC0wLjEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMzNSBxdWFudGl6ZSAgLTAuMDc4ICAxZTAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMzNiBxdWFudGl6ZSAgLTAuMDc4IDFlKzEgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTMzNyBxdWFudGl6ZSAgLTAuMDc4IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMzQwIHF1YW50aXplICAgMC43OCAxZS01IC0+ICAwLjc4MDAwCitkcXF1YTM0MSBxdWFudGl6ZSAgIDAuNzggMWUtNCAtPiAgMC43ODAwCitkcXF1YTM0MiBxdWFudGl6ZSAgIDAuNzggMWUtMyAtPiAgMC43ODAKK2RxcXVhMzQzIHF1YW50aXplICAgMC43OCAxZS0yIC0+ICAwLjc4CitkcXF1YTM0NCBxdWFudGl6ZSAgIDAuNzggMWUtMSAtPiAgMC44IEluZXhhY3QgUm91bmRlZAorZHFxdWEzNDUgcXVhbnRpemUgICAwLjc4ICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM0NiBxdWFudGl6ZSAgIDAuNzggMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzQ3IHF1YW50aXplICAgMC43OCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTM1MCBxdWFudGl6ZSAgLTAuNzggMWUtNSAtPiAtMC43ODAwMAorZHFxdWEzNTEgcXVhbnRpemUgIC0wLjc4IDFlLTQgLT4gLTAuNzgwMAorZHFxdWEzNTIgcXVhbnRpemUgIC0wLjc4IDFlLTMgLT4gLTAuNzgwCitkcXF1YTM1MyBxdWFudGl6ZSAgLTAuNzggMWUtMiAtPiAtMC43OAorZHFxdWEzNTQgcXVhbnRpemUgIC0wLjc4IDFlLTEgLT4gLTAuOCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzU1IHF1YW50aXplICAtMC43OCAgMWUwIC0+IC0xIEluZXhhY3QgUm91bmRlZAorZHFxdWEzNTYgcXVhbnRpemUgIC0wLjc4IDFlKzEgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM1NyBxdWFudGl6ZSAgLTAuNzggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWEzNjAgcXVhbnRpemUgICA3LjggMWUtNSAtPiAgNy44MDAwMAorZHFxdWEzNjEgcXVhbnRpemUgICA3LjggMWUtNCAtPiAgNy44MDAwCitkcXF1YTM2MiBxdWFudGl6ZSAgIDcuOCAxZS0zIC0+ICA3LjgwMAorZHFxdWEzNjMgcXVhbnRpemUgICA3LjggMWUtMiAtPiAgNy44MAorZHFxdWEzNjQgcXVhbnRpemUgICA3LjggMWUtMSAtPiAgNy44CitkcXF1YTM2NSBxdWFudGl6ZSAgIDcuOCAgMWUwIC0+ICA4IEluZXhhY3QgUm91bmRlZAorZHFxdWEzNjYgcXVhbnRpemUgICA3LjggMWUrMSAtPiAgMUUrMSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzY3IHF1YW50aXplICAgNy44IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM2OCBxdWFudGl6ZSAgIDcuOCAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTM3MCBxdWFudGl6ZSAgLTcuOCAxZS01IC0+IC03LjgwMDAwCitkcXF1YTM3MSBxdWFudGl6ZSAgLTcuOCAxZS00IC0+IC03LjgwMDAKK2RxcXVhMzcyIHF1YW50aXplICAtNy44IDFlLTMgLT4gLTcuODAwCitkcXF1YTM3MyBxdWFudGl6ZSAgLTcuOCAxZS0yIC0+IC03LjgwCitkcXF1YTM3NCBxdWFudGl6ZSAgLTcuOCAxZS0xIC0+IC03LjgKK2RxcXVhMzc1IHF1YW50aXplICAtNy44ICAxZTAgLT4gLTggSW5leGFjdCBSb3VuZGVkCitkcXF1YTM3NiBxdWFudGl6ZSAgLTcuOCAxZSsxIC0+IC0xRSsxIEluZXhhY3QgUm91bmRlZAorZHFxdWEzNzcgcXVhbnRpemUgIC03LjggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMzc4IHF1YW50aXplICAtNy44IDFlKzMgLT4gLTBFKzMgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgaW5kaXZpZHVhbHMKK2RxcXVhMzgwIHF1YW50aXplICAgMTEyMjMzNDQ1NTY2Nzc4ODk5MTIzNDU2NzM1MjM2NC41MDYgMWUtMiAtPiAxMTIyMzM0NDU1NjY3Nzg4OTkxMjM0NTY3MzUyMzY0LjUxIEluZXhhY3QgUm91bmRlZAorZHFxdWEzODEgcXVhbnRpemUgICAxMTIyMzM0NDU1NjY3Nzg4OTkxMjM0NTY3MzUyMzY0NS4wNiAxZS0yIC0+IDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1LjA2CitkcXF1YTM4MiBxdWFudGl6ZSAgIDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTM4MyBxdWFudGl6ZSAgIDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1MDYgIDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTM4NCBxdWFudGl6ZSAgLTExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQuNTA2IDFlLTIgLT4gLTExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQuNTEgSW5leGFjdCBSb3VuZGVkCitkcXF1YTM4NSBxdWFudGl6ZSAgLTExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1LjA2IDFlLTIgLT4gLTExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1LjA2CitkcXF1YTM4NiBxdWFudGl6ZSAgLTExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTM4NyBxdWFudGl6ZSAgLTExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1MDYgIDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3JvdW5kaW5nOiBkb3duCitkcXF1YTM4OSBxdWFudGl6ZSAgIDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1NjczNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3VuZGluZzogaGFsZl91cAorCistLSBhbmQgYSBmZXcgbW9yZSBmcm9tIGUtbWFpbCBkaXNjdXNzaW9ucworZHFxdWEzOTEgcXVhbnRpemUgIDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1Njc4OTEyLjM0NTY3ICAxZS0zIC0+IDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1Njc4OTEyLjM0NiAgIEluZXhhY3QgUm91bmRlZAorZHFxdWEzOTIgcXVhbnRpemUgIDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1Njc4OTEyMy40NTY3ICAxZS0zIC0+IDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1Njc4OTEyMy40NTcgIEluZXhhY3QgUm91bmRlZAorZHFxdWEzOTMgcXVhbnRpemUgIDExMjIzMzQ0NTU2Njc3ODg5OTEyMzQ1Njc4OTEyMzQ1NjcuICAxZS0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBzb21lIDk5OTkgcm91bmQtdXAgY2FzZXMKK2RxcXVhNDAwIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTUgIC0+ICA5Ljk5OTAwCitkcXF1YTQwMSBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAxZS00ICAtPiAgOS45OTkwCitkcXF1YTQwMiBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAxZS0zICAtPiAgOS45OTkKK2RxcXVhNDAzIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTIgIC0+IDEwLjAwICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDA0IHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTEgIC0+IDEwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDA1IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTAgIC0+IDEwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDA2IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTEgIC0+IDFFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDA3IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTIgIC0+IDBFKzIgICAgICBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWE0MTAgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtNSAgLT4gIDAuOTk5MDAKK2RxcXVhNDExIHF1YW50aXplICAgMC45OTkgICAgICAgIDFlLTQgIC0+ICAwLjk5OTAKK2RxcXVhNDEyIHF1YW50aXplICAgMC45OTkgICAgICAgIDFlLTMgIC0+ICAwLjk5OQorZHFxdWE0MTMgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMiAgLT4gIDEuMDAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MTQgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMSAgLT4gIDEuMCAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MTUgcXVhbnRpemUgICAwLjk5OSAgICAgICAgIDFlMCAgLT4gIDEgICAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MTYgcXVhbnRpemUgICAwLjk5OSAgICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTQyMCBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS01ICAtPiAgMC4wOTk5MAorZHFxdWE0MjEgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtNCAgLT4gIDAuMDk5OQorZHFxdWE0MjIgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMyAgLT4gIDAuMTAwICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MjMgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMiAgLT4gIDAuMTAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MjQgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMSAgLT4gIDAuMSAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MjUgcXVhbnRpemUgICAwLjA5OTkgICAgICAgIDFlMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MjYgcXVhbnRpemUgICAwLjA5OTkgICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTQzMCBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS01ICAtPiAgMC4wMDk5OQorZHFxdWE0MzEgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtNCAgLT4gIDAuMDEwMCAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MzIgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMyAgLT4gIDAuMDEwICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MzMgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMiAgLT4gIDAuMDEgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MzQgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMSAgLT4gIDAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MzUgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgIDFlMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE0MzYgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTQ0MCBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS01ICAtPiAgMC4wMDEwMCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ0MSBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS00ICAtPiAgMC4wMDEwICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ0MiBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0zICAtPiAgMC4wMDEgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ0MyBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0yICAtPiAgMC4wMCAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ0NCBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0xICAtPiAgMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ0NSBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAgMWUwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ0NiBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhMTAwMSBxdWFudGl6ZSAgMC4wMDAgICAgICAgIDAuMDAxIC0+ICAwLjAwMAorZHFxdWExMDAyIHF1YW50aXplICAwLjAwMSAgICAgICAgMC4wMDEgLT4gIDAuMDAxCitkcXF1YTEwMDMgcXVhbnRpemUgIDAuMDAxMiAgICAgICAwLjAwMSAtPiAgMC4wMDEgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMDA0IHF1YW50aXplICAwLjAwMTggICAgICAgMC4wMDEgLT4gIDAuMDAyICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTAwNSBxdWFudGl6ZSAgMC41MDEgICAgICAgIDAuMDAxIC0+ICAwLjUwMQorZHFxdWExMDA2IHF1YW50aXplICAwLjUwMTIgICAgICAgMC4wMDEgLT4gIDAuNTAxICAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTAwNyBxdWFudGl6ZSAgMC41MDE4ICAgICAgIDAuMDAxIC0+ICAwLjUwMiAgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEwMDggcXVhbnRpemUgIDAuOTk5ICAgICAgICAwLjAwMSAtPiAgMC45OTkKKworZHFxdWE0ODEgcXVhbnRpemUgMTIzNDU2NzgwMDAgMWUrMyAtPiAxLjIzNDU2NzhFKzEwIFJvdW5kZWQKK2RxcXVhNDgyIHF1YW50aXplIDEyMzQ1Njc4MDAgIDFlKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitkcXF1YTQ4MyBxdWFudGl6ZSAxMjM0NTY3ODkwICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorZHFxdWE0ODQgcXVhbnRpemUgMTIzNDU2Nzg5MSAgMWUrMSAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorZHFxdWE0ODUgcXVhbnRpemUgMTIzNDU2Nzg5MDEgMWUrMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDg2IHF1YW50aXplIDEyMzQ1Njc4OTYgIDFlKzEgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKKy0tIGEgcG90ZW50aWFsIGRvdWJsZS1yb3VuZAorZHFxdWE0ODcgcXVhbnRpemUgMTIzNC45ODc2NDMgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCitkcXF1YTQ4OCBxdWFudGl6ZSAxMjM0Ljk4NzY0NyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKKworZHFxdWE0OTEgcXVhbnRpemUgMTIzNDU2NzgwMDAgMWUrMyAtPiAxLjIzNDU2NzhFKzEwIFJvdW5kZWQKK2RxcXVhNDkyIHF1YW50aXplIDEyMzQ1Njc4MDAgIDFlKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitkcXF1YTQ5MyBxdWFudGl6ZSAxMjM0NTY3ODkwICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorZHFxdWE0OTQgcXVhbnRpemUgMTIzNDU2Nzg5MSAgMWUrMSAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorZHFxdWE0OTUgcXVhbnRpemUgMTIzNDU2Nzg5MDEgMWUrMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDk2IHF1YW50aXplIDEyMzQ1Njc4OTYgIDFlKzEgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNDk3IHF1YW50aXplIDEyMzQuOTg3NjQzIDFlLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorZHFxdWE0OTggcXVhbnRpemUgMTIzNC45ODc2NDcgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCisKKy0tIFplcm9zCitkcXF1YTUwMCBxdWFudGl6ZSAgIDAgICAgIDFlMSAtPiAgMEUrMQorZHFxdWE1MDEgcXVhbnRpemUgICAwICAgICAxZTAgLT4gIDAKK2RxcXVhNTAyIHF1YW50aXplICAgMCAgICAxZS0xIC0+ICAwLjAKK2RxcXVhNTAzIHF1YW50aXplICAgMC4wICAxZS0xIC0+ICAwLjAKK2RxcXVhNTA0IHF1YW50aXplICAgMC4wICAgMWUwIC0+ICAwCitkcXF1YTUwNSBxdWFudGl6ZSAgIDAuMCAgMWUrMSAtPiAgMEUrMQorZHFxdWE1MDYgcXVhbnRpemUgICAwRSsxIDFlLTEgLT4gIDAuMAorZHFxdWE1MDcgcXVhbnRpemUgICAwRSsxICAxZTAgLT4gIDAKK2RxcXVhNTA4IHF1YW50aXplICAgMEUrMSAxZSsxIC0+ICAwRSsxCitkcXF1YTUwOSBxdWFudGl6ZSAgLTAgICAgIDFlMSAtPiAtMEUrMQorZHFxdWE1MTAgcXVhbnRpemUgIC0wICAgICAxZTAgLT4gLTAKK2RxcXVhNTExIHF1YW50aXplICAtMCAgICAxZS0xIC0+IC0wLjAKK2RxcXVhNTEyIHF1YW50aXplICAtMC4wICAxZS0xIC0+IC0wLjAKK2RxcXVhNTEzIHF1YW50aXplICAtMC4wICAgMWUwIC0+IC0wCitkcXF1YTUxNCBxdWFudGl6ZSAgLTAuMCAgMWUrMSAtPiAtMEUrMQorZHFxdWE1MTUgcXVhbnRpemUgIC0wRSsxIDFlLTEgLT4gLTAuMAorZHFxdWE1MTYgcXVhbnRpemUgIC0wRSsxICAxZTAgLT4gLTAKK2RxcXVhNTE3IHF1YW50aXplICAtMEUrMSAxZSsxIC0+IC0wRSsxCistLSAjNTE5IGhlcmUgb25jZSBhIHByb2JsZW0KK2RxcXVhNTE4IHF1YW50aXplICAwICAgIDBFLTMgIC0+IDAuMDAwCitkcXF1YTUxOSBxdWFudGl6ZSAgMCAgICAwRS0zMyAtPiAwRS0zMworZHFxdWE1MjAgcXVhbnRpemUgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAwRS0zMyAtPiAwRS0zMworZHFxdWE1MjEgcXVhbnRpemUgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAwRS0zMyAtPiAwRS0zMworCistLSBTb21lIG5vbi16ZXJvcyB3aXRoIGxvdHMgb2YgcGFkZGluZyBvbiB0aGUgcmlnaHQKK2RxcXVhNTIzIHF1YW50aXplICAgMSAgIDBFLTMzIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXF1YTUyNCBxdWFudGl6ZSAgMTIgICAwRS0zMiAtPiAxMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFxdWE1MjUgcXVhbnRpemUgMTIzICAgMEUtMzEgLT4gMTIzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxcXVhNTI2IHF1YW50aXplIDEyMyAgIDBFLTMyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1MjcgcXVhbnRpemUgMTIzLjQgMEUtMzEgLT4gMTIzLjQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxcXVhNTI4IHF1YW50aXplIDEyMy40IDBFLTMyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBTdXNwaWNpb3VzIFJIUyB2YWx1ZXMKK2RxcXVhNTMwIHF1YW50aXplICAgMS4yMzQgICAgMWUzNTkgLT4gMEUrMzU5IEluZXhhY3QgUm91bmRlZAorZHFxdWE1MzEgcXVhbnRpemUgMTIzLjQ1NiAgICAxZTM1OSAtPiAwRSszNTkgSW5leGFjdCBSb3VuZGVkCitkcXF1YTUzMiBxdWFudGl6ZSAgIDEuMjM0ICAgIDFlMzU5IC0+IDBFKzM1OSBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNTMzIHF1YW50aXplIDEyMy40NTYgICAgMWUzNTkgLT4gMEUrMzU5IEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCBmb3VyIGFyZSAid29uJ3QgZml0IiBvdmVyZmxvd3MKK2RxcXVhNTM2IHF1YW50aXplICAgMS4yMzQgICAxZS0yOTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTUzNyBxdWFudGl6ZSAxMjMuNDU2ICAgMWUtMjk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1MzggcXVhbnRpemUgICAxLjIzNCAgIDFlLTI5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTM5IHF1YW50aXplIDEyMy40NTYgICAxZS0yOTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxcXVhNTQyIHF1YW50aXplICAgMS4yMzRFKzI5OSAgICAxZTI5OSAtPiAxRSsyOTkgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTU0MyBxdWFudGl6ZSAgIDEuMjM0RSsyOTggICAgMWUyOTkgLT4gMEUrMjk5ICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE1NDQgcXVhbnRpemUgICAxLjIzNCAgICAgICAgIDFlMjk5IC0+IDBFKzI5OSAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNTQ3IHF1YW50aXplICAgMCAgICAgICAgICAgIDFlLTI5OSAtPiAwRS0yOTkKKy0tIG5leHQgdHdvIGFyZSAid29uJ3QgZml0IiBvdmVyZmxvd3MKK2RxcXVhNTQ4IHF1YW50aXplICAgMS4yMzQgICAgICAgIDFlLTI5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTQ5IHF1YW50aXplICAgMS4yMzQgICAgICAgIDFlLTMwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIFttb3JlIGJlbG93XQorCistLSBTcGVjaWFscworZHFxdWE1ODAgcXVhbnRpemUgIEluZiAgICAtSW5mICAgLT4gIEluZmluaXR5CitkcXF1YTU4MSBxdWFudGl6ZSAgSW5mICAxZS0yOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1ODIgcXVhbnRpemUgIEluZiAgMWUtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTgzIHF1YW50aXplICBJbmYgICAxZTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTU4NCBxdWFudGl6ZSAgSW5mICAgMWUxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1ODUgcXVhbnRpemUgIEluZiAgIDFlMjk5ICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTg2IHF1YW50aXplICBJbmYgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZHFxdWE1ODcgcXVhbnRpemUgLTEwMDAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTg4IHF1YW50aXplIC1JbmYgICAgIEluZiAgIC0+ICAtSW5maW5pdHkKK2RxcXVhNTg5IHF1YW50aXplIC0xICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTU5MCBxdWFudGl6ZSAgMCAgICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE1OTEgcXVhbnRpemUgIDEgICAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNTkyIHF1YW50aXplICAxMDAwICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTU5MyBxdWFudGl6ZSAgSW5mICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2RxcXVhNTk0IHF1YW50aXplICBJbmYgIDFlLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTU5NSBxdWFudGl6ZSAtMCAgICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitkcXF1YTYwMCBxdWFudGl6ZSAtSW5mICAgIC1JbmYgICAtPiAgLUluZmluaXR5CitkcXF1YTYwMSBxdWFudGl6ZSAtSW5mICAxZS0yOTkgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MDIgcXVhbnRpemUgLUluZiAgMWUtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjAzIHF1YW50aXplIC1JbmYgICAxZTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYwNCBxdWFudGl6ZSAtSW5mICAgMWUxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MDUgcXVhbnRpemUgLUluZiAgIDFlMjk5ICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjA2IHF1YW50aXplIC1JbmYgICAgIEluZiAgIC0+ICAtSW5maW5pdHkKK2RxcXVhNjA3IHF1YW50aXplIC0xMDAwICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYwOCBxdWFudGl6ZSAtSW5mICAgIC1JbmYgICAtPiAgLUluZmluaXR5CitkcXF1YTYwOSBxdWFudGl6ZSAtMSAgICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MTAgcXVhbnRpemUgIDAgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjExIHF1YW50aXplICAxICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTYxMiBxdWFudGl6ZSAgMTAwMCAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MTMgcXVhbnRpemUgIEluZiAgICAtSW5mICAgLT4gIEluZmluaXR5CitkcXF1YTYxNCBxdWFudGl6ZSAtSW5mICAxZS0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2MTUgcXVhbnRpemUgLTAgICAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworZHFxdWE2MjEgcXVhbnRpemUgIE5hTiAgIC1JbmYgICAgLT4gIE5hTgorZHFxdWE2MjIgcXVhbnRpemUgIE5hTiAxZS0yOTkgICAgLT4gIE5hTgorZHFxdWE2MjMgcXVhbnRpemUgIE5hTiAxZS0xICAgICAgLT4gIE5hTgorZHFxdWE2MjQgcXVhbnRpemUgIE5hTiAgMWUwICAgICAgLT4gIE5hTgorZHFxdWE2MjUgcXVhbnRpemUgIE5hTiAgMWUxICAgICAgLT4gIE5hTgorZHFxdWE2MjYgcXVhbnRpemUgIE5hTiAgMWUyOTkgICAgLT4gIE5hTgorZHFxdWE2MjcgcXVhbnRpemUgIE5hTiAgICBJbmYgICAgLT4gIE5hTgorZHFxdWE2MjggcXVhbnRpemUgIE5hTiAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MjkgcXVhbnRpemUgLUluZiAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MzAgcXVhbnRpemUgLTEwMDAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MzEgcXVhbnRpemUgLTEgICAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MzIgcXVhbnRpemUgIDAgICAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MzMgcXVhbnRpemUgIDEgICAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MzQgcXVhbnRpemUgIDEwMDAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MzUgcXVhbnRpemUgIEluZiAgICBOYU4gICAgLT4gIE5hTgorZHFxdWE2MzYgcXVhbnRpemUgIE5hTiAxZS0wICAgICAgLT4gIE5hTgorZHFxdWE2MzcgcXVhbnRpemUgLTAgICAgICBOYU4gICAgLT4gIE5hTgorCitkcXF1YTY0MSBxdWFudGl6ZSAgc05hTiAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NDIgcXVhbnRpemUgIHNOYU4gMWUtMjk5ICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjQzIHF1YW50aXplICBzTmFOIDFlLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY0NCBxdWFudGl6ZSAgc05hTiAgMWUwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NDUgcXVhbnRpemUgIHNOYU4gIDFlMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjQ2IHF1YW50aXplICBzTmFOICAxZTI5OSAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY0NyBxdWFudGl6ZSAgc05hTiAgICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NDggcXVhbnRpemUgIHNOYU4gICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjQ5IHF1YW50aXplICBOYU4gICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY1MCBxdWFudGl6ZSAtSW5mICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NTEgcXVhbnRpemUgLTEwMDAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjUyIHF1YW50aXplIC0xICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY1MyBxdWFudGl6ZSAgMCAgICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NTQgcXVhbnRpemUgIDEgICAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjU1IHF1YW50aXplICAxMDAwICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY1NiBxdWFudGl6ZSAgSW5mICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE2NTcgcXVhbnRpemUgIE5hTiAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjU4IHF1YW50aXplICBzTmFOIDFlLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY1OSBxdWFudGl6ZSAtMCAgICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcXF1YTY2MSBxdWFudGl6ZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK2RxcXVhNjYyIHF1YW50aXplICBOYU44ICA5MTkgICAtPiAgTmFOOAorZHFxdWE2NjMgcXVhbnRpemUgIE5hTjcxIEluZiAgIC0+ICBOYU43MQorZHFxdWE2NjQgcXVhbnRpemUgIE5hTjYgIE5hTjUgIC0+ICBOYU42CitkcXF1YTY2NSBxdWFudGl6ZSAtSW5mICAgTmFONCAgLT4gIE5hTjQKK2RxcXVhNjY2IHF1YW50aXplIC05MTkgICBOYU4zMSAtPiAgTmFOMzEKK2RxcXVhNjY3IHF1YW50aXplICBJbmYgICBOYU4yICAtPiAgTmFOMgorCitkcXF1YTY3MSBxdWFudGl6ZSAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3MiBxdWFudGl6ZSAgc05hTjk4IC0xMSAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3MyBxdWFudGl6ZSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3NCBxdWFudGl6ZSAgc05hTjE2IHNOYU45NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3NSBxdWFudGl6ZSAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3NiBxdWFudGl6ZSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3NyBxdWFudGl6ZSAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3OCBxdWFudGl6ZSAgSW5mICAgIHNOYU45MCAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitkcXF1YTY3OSBxdWFudGl6ZSAgTmFOICAgIHNOYU44OCAgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKK2RxcXVhNjgxIHF1YW50aXplIC1OYU45IC1JbmYgICAtPiAtTmFOOQorZHFxdWE2ODIgcXVhbnRpemUgLU5hTjggIDkxOSAgIC0+IC1OYU44CitkcXF1YTY4MyBxdWFudGl6ZSAtTmFONzEgSW5mICAgLT4gLU5hTjcxCitkcXF1YTY4NCBxdWFudGl6ZSAtTmFONiAtTmFONSAgLT4gLU5hTjYKK2RxcXVhNjg1IHF1YW50aXplIC1JbmYgIC1OYU40ICAtPiAtTmFONAorZHFxdWE2ODYgcXVhbnRpemUgLTkxOSAgLU5hTjMxIC0+IC1OYU4zMQorZHFxdWE2ODcgcXVhbnRpemUgIEluZiAgLU5hTjIgIC0+IC1OYU4yCisKK2RxcXVhNjkxIHF1YW50aXplIC1zTmFOOTkgLUluZiAgICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjkyIHF1YW50aXplIC1zTmFOOTggLTExICAgICAtPiAtTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjkzIHF1YW50aXplIC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjk0IHF1YW50aXplIC1zTmFOMTYgc05hTjk0ICAtPiAtTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjk1IHF1YW50aXplIC1OYU45NSAtc05hTjkzICAtPiAtTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjk2IHF1YW50aXplIC1JbmYgICAtc05hTjkyICAtPiAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjk3IHF1YW50aXplICAwODggICAtc05hTjkxICAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjk4IHF1YW50aXplICBJbmYgICAtc05hTjkwICAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK2RxcXVhNjk5IHF1YW50aXplICBOYU4gICAtc05hTjg4ICAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitkcXF1YTcxMCBxdWFudGl6ZSAgMS4wMEUtNjE0MyAgIDFlLTYxNDMgIC0+ICAgMUUtNjE0MyAgIFJvdW5kZWQKK2RxcXVhNzExIHF1YW50aXplICAwLjFFLTYxNDMgICAgMmUtNjE0NCAgLT4gICAxRS02MTQ0ICAgU3Vibm9ybWFsCitkcXF1YTcxMiBxdWFudGl6ZSAgMC4xMEUtNjE0MyAgIDNlLTYxNDQgIC0+ICAgMUUtNjE0NCAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXF1YTcxMyBxdWFudGl6ZSAgMC4xMDBFLTYxNDMgIDRlLTYxNDQgIC0+ICAgMUUtNjE0NCAgIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXF1YTcxNCBxdWFudGl6ZSAgMC4wMUUtNjE0MyAgIDVlLTYxNDUgIC0+ICAgMUUtNjE0NSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK2RxcXVhNzE1IHF1YW50aXplICAwLjk5OUUtNjE0MyAgMWUtNjE0MyAgLT4gICAxRS02MTQzICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTcxNiBxdWFudGl6ZSAgMC4wOTlFLTYxNDMgMTBlLTYxNDQgIC0+ICAgMUUtNjE0NCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKKworZHFxdWE3MTcgcXVhbnRpemUgIDAuMDA5RS02MTQzICAxZS02MTQ1ICAtPiAgIDFFLTYxNDUgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCitkcXF1YTcxOCBxdWFudGl6ZSAgMC4wMDFFLTYxNDMgIDFlLTYxNDUgIC0+ICAgMEUtNjE0NSAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3MTkgcXVhbnRpemUgIDAuMDAwOUUtNjE0MyAxZS02MTQ1ICAtPiAgIDBFLTYxNDUgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNzIwIHF1YW50aXplICAwLjAwMDFFLTYxNDMgMWUtNjE0NSAgLT4gICAwRS02MTQ1ICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhNzMwIHF1YW50aXplIC0xLjAwRS02MTQzICAgMWUtNjE0MyAgLT4gIC0xRS02MTQzICAgICBSb3VuZGVkCitkcXF1YTczMSBxdWFudGl6ZSAtMC4xRS02MTQzICAgIDFlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgUm91bmRlZCBJbmV4YWN0CitkcXF1YTczMiBxdWFudGl6ZSAtMC4xMEUtNjE0MyAgIDFlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgUm91bmRlZCBJbmV4YWN0CitkcXF1YTczMyBxdWFudGl6ZSAtMC4xMDBFLTYxNDMgIDFlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgUm91bmRlZCBJbmV4YWN0CitkcXF1YTczNCBxdWFudGl6ZSAtMC4wMUUtNjE0MyAgIDFlLTYxNDMgIC0+ICAtMEUtNjE0MyAgICAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorZHFxdWE3MzUgcXVhbnRpemUgLTAuOTk5RS02MTQzIDkwZS02MTQzICAtPiAgLTFFLTYxNDMgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3MzYgcXVhbnRpemUgLTAuMDk5RS02MTQzIC0xZS02MTQzICAtPiAgLTBFLTYxNDMgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3MzcgcXVhbnRpemUgLTAuMDA5RS02MTQzIC0xZS02MTQzICAtPiAgLTBFLTYxNDMgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3MzggcXVhbnRpemUgLTAuMDAxRS02MTQzIC0wZS02MTQzICAtPiAgLTBFLTYxNDMgICAgIEluZXhhY3QgUm91bmRlZAorZHFxdWE3MzkgcXVhbnRpemUgLTAuMDAwMUUtNjE0MyAwZS02MTQzICAtPiAgLTBFLTYxNDMgICAgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTc0MCBxdWFudGl6ZSAtMS4wMEUtNjE0MyAgIDFlLTYxNDQgLT4gIC0xLjBFLTYxNDMgICBSb3VuZGVkCitkcXF1YTc0MSBxdWFudGl6ZSAtMC4xRS02MTQzICAgIDFlLTYxNDQgLT4gIC0xRS02MTQ0ICAgIFN1Ym5vcm1hbAorZHFxdWE3NDIgcXVhbnRpemUgLTAuMTBFLTYxNDMgICAxZS02MTQ0IC0+ICAtMUUtNjE0NCAgICBTdWJub3JtYWwgUm91bmRlZAorZHFxdWE3NDMgcXVhbnRpemUgLTAuMTAwRS02MTQzICAxZS02MTQ0IC0+ICAtMUUtNjE0NCAgICBTdWJub3JtYWwgUm91bmRlZAorZHFxdWE3NDQgcXVhbnRpemUgLTAuMDFFLTYxNDMgICAxZS02MTQ0IC0+ICAtMEUtNjE0NCAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitkcXF1YTc0NSBxdWFudGl6ZSAtMC45OTlFLTYxNDMgIDFlLTYxNDQgLT4gIC0xLjBFLTYxNDMgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNzQ2IHF1YW50aXplIC0wLjA5OUUtNjE0MyAgMWUtNjE0NCAtPiAgLTFFLTYxNDQgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorZHFxdWE3NDcgcXVhbnRpemUgLTAuMDA5RS02MTQzICAxZS02MTQ0IC0+ICAtMEUtNjE0NCAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNzQ4IHF1YW50aXplIC0wLjAwMUUtNjE0MyAgMWUtNjE0NCAtPiAgLTBFLTYxNDQgICAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTc0OSBxdWFudGl6ZSAtMC4wMDAxRS02MTQzIDFlLTYxNDQgLT4gIC0wRS02MTQ0ICAgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTc1MCBxdWFudGl6ZSAtMS4wMEUtNjE0MyAgIDFlLTYxNDUgLT4gIC0xLjAwRS02MTQzCitkcXF1YTc1MSBxdWFudGl6ZSAtMC4xRS02MTQzICAgIDFlLTYxNDUgLT4gIC0xLjBFLTYxNDQgIFN1Ym5vcm1hbAorZHFxdWE3NTIgcXVhbnRpemUgLTAuMTBFLTYxNDMgICAxZS02MTQ1IC0+ICAtMS4wRS02MTQ0ICBTdWJub3JtYWwKK2RxcXVhNzUzIHF1YW50aXplIC0wLjEwMEUtNjE0MyAgMWUtNjE0NSAtPiAgLTEuMEUtNjE0NCAgU3Vibm9ybWFsIFJvdW5kZWQKK2RxcXVhNzU0IHF1YW50aXplIC0wLjAxRS02MTQzICAgMWUtNjE0NSAtPiAgLTFFLTYxNDUgICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorZHFxdWE3NTUgcXVhbnRpemUgLTAuOTk5RS02MTQzICAxZS02MTQ1IC0+ICAtMS4wMEUtNjE0MyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTc1NiBxdWFudGl6ZSAtMC4wOTlFLTYxNDMgIDFlLTYxNDUgLT4gIC0xLjBFLTYxNDQgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKK2RxcXVhNzU3IHF1YW50aXplIC0wLjAwOUUtNjE0MyAgMWUtNjE0NSAtPiAgLTFFLTYxNDUgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorZHFxdWE3NTggcXVhbnRpemUgLTAuMDAxRS02MTQzICAxZS02MTQ1IC0+ICAtMEUtNjE0NSAgICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhNzU5IHF1YW50aXplIC0wLjAwMDFFLTYxNDMgMWUtNjE0NSAtPiAgLTBFLTYxNDUgICAgSW5leGFjdCBSb3VuZGVkCisKK2RxcXVhNzYwIHF1YW50aXplIC0xLjAwRS02MTQzICAgMWUtNjE0NiAtPiAgLTEuMDAwRS02MTQzCitkcXF1YTc2MSBxdWFudGl6ZSAtMC4xRS02MTQzICAgIDFlLTYxNDYgLT4gIC0xLjAwRS02MTQ0ICBTdWJub3JtYWwKK2RxcXVhNzYyIHF1YW50aXplIC0wLjEwRS02MTQzICAgMWUtNjE0NiAtPiAgLTEuMDBFLTYxNDQgIFN1Ym5vcm1hbAorZHFxdWE3NjMgcXVhbnRpemUgLTAuMTAwRS02MTQzICAxZS02MTQ2IC0+ICAtMS4wMEUtNjE0NCAgU3Vibm9ybWFsCitkcXF1YTc2NCBxdWFudGl6ZSAtMC4wMUUtNjE0MyAgIDFlLTYxNDYgLT4gIC0xLjBFLTYxNDUgICBTdWJub3JtYWwKK2RxcXVhNzY1IHF1YW50aXplIC0wLjk5OUUtNjE0MyAgMWUtNjE0NiAtPiAgLTkuOTlFLTYxNDQgIFN1Ym5vcm1hbAorZHFxdWE3NjYgcXVhbnRpemUgLTAuMDk5RS02MTQzICAxZS02MTQ2IC0+ICAtOS45RS02MTQ1ICAgU3Vibm9ybWFsCitkcXF1YTc2NyBxdWFudGl6ZSAtMC4wMDlFLTYxNDMgIDFlLTYxNDYgLT4gIC05RS02MTQ2ICAgICBTdWJub3JtYWwKK2RxcXVhNzY4IHF1YW50aXplIC0wLjAwMUUtNjE0MyAgMWUtNjE0NiAtPiAgLTFFLTYxNDYgICAgIFN1Ym5vcm1hbAorZHFxdWE3NjkgcXVhbnRpemUgLTAuMDAwMUUtNjE0MyAxZS02MTQ2IC0+ICAtMEUtNjE0NiAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIE1vcmUgZnJvbSBGdW5nIExlZQorLS0gdGhlIG5leHQgZm91ciB3b3VsZCBhcHBlYXIgdG8gYmUgaW4gZXJyb3IsIGJ1dCB0aGV5IGFyZSBtaXNsZWFkaW5nICh0aGUKKy0tIG9wZXJhbmRzIHdpbGwgYmUgY2xhbXBlZCB0byBhIGxvd2VyIGV4cG9uZW50KSBhbmQgc28gYXJlIG9taXR0ZWQKKy0tIGRxcXVhMTAyMSBxdWFudGl6ZSAgOC42NjY2NjY2NjY2NjYwMDBFKzYxNDQgIDEuMDAwMDAwMDAwMDAwMDAwRSs2MTQ0IC0+ICA4LjY2NjY2NjY2NjY2NjAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NCAgQ2xhbXBlZAorLS0gZHFxdWExMDIyIHF1YW50aXplIC04LjY2NjY2NjY2NjY2NjAwMEUrNjE0NCAgMS4wMDAwMDAwMDAwMDAwMDBFKzYxNDQgLT4gLTguNjY2NjY2NjY2NjY2MDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQ0ICBDbGFtcGVkCistLSBkcXF1YTEwMjcgcXVhbnRpemUgOC42NjY2NjY2NjY2NjYwMDBFKzMyMyAgMUUrMzEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBkcXF1YTEwMzAgcXVhbnRpemUgOC42NjY2NjY2NkUrMyAgICAgICAgICAgMUUrMyAgICAgLT4gOUUrMyBJbmV4YWN0IFJvdW5kZWQKKworLS0gSW50IGFuZCB1SW50MzIgZWRnZSB2YWx1ZXMgZm9yIHRlc3RpbmcgY29udmVyc2lvbnMKK2RxcXVhMTA0MCBxdWFudGl6ZSAtMjE0NzQ4MzY0NiAgICAgMCAtPiAtMjE0NzQ4MzY0NgorZHFxdWExMDQxIHF1YW50aXplIC0yMTQ3NDgzNjQ3ICAgICAwIC0+IC0yMTQ3NDgzNjQ3CitkcXF1YTEwNDIgcXVhbnRpemUgLTIxNDc0ODM2NDggICAgIDAgLT4gLTIxNDc0ODM2NDgKK2RxcXVhMTA0MyBxdWFudGl6ZSAtMjE0NzQ4MzY0OSAgICAgMCAtPiAtMjE0NzQ4MzY0OQorZHFxdWExMDQ0IHF1YW50aXplICAyMTQ3NDgzNjQ2ICAgICAwIC0+ICAyMTQ3NDgzNjQ2CitkcXF1YTEwNDUgcXVhbnRpemUgIDIxNDc0ODM2NDcgICAgIDAgLT4gIDIxNDc0ODM2NDcKK2RxcXVhMTA0NiBxdWFudGl6ZSAgMjE0NzQ4MzY0OCAgICAgMCAtPiAgMjE0NzQ4MzY0OAorZHFxdWExMDQ3IHF1YW50aXplICAyMTQ3NDgzNjQ5ICAgICAwIC0+ICAyMTQ3NDgzNjQ5CitkcXF1YTEwNDggcXVhbnRpemUgIDQyOTQ5NjcyOTQgICAgIDAgLT4gIDQyOTQ5NjcyOTQKK2RxcXVhMTA0OSBxdWFudGl6ZSAgNDI5NDk2NzI5NSAgICAgMCAtPiAgNDI5NDk2NzI5NQorZHFxdWExMDUwIHF1YW50aXplICA0Mjk0OTY3Mjk2ICAgICAwIC0+ICA0Mjk0OTY3Mjk2CitkcXF1YTEwNTEgcXVhbnRpemUgIDQyOTQ5NjcyOTcgICAgIDAgLT4gIDQyOTQ5NjcyOTcKKworLS0gUm91bmRpbmcgc3dhdGhlCityb3VuZGluZzogaGFsZl9ldmVuCitkcXF1YTExMDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkcXF1YTExMDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTEwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMTAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTExMDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTEwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMTA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTExMDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTEwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMTA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCitkcXF1YTEyMDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkcXF1YTEyMDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTIwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMjAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEyMDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTIwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMjA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEyMDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTIwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMjA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2RxcXVhMTMwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RxcXVhMTMwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTMwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTMwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExMzA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTEzMDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IHVwCitkcXF1YTE0MDAgcXVhbnRpemUgIDEuMjMwMCAgICAxLjAwICAgIC0+ICAxLjIzICBSb3VuZGVkCitkcXF1YTE0MDEgcXVhbnRpemUgIDEuMjMwMSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQwMiBxdWFudGl6ZSAgMS4yMzEwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNDAzIHF1YW50aXplICAxLjIzNTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE0MDQgcXVhbnRpemUgIDEuMjM1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQwNSBxdWFudGl6ZSAgMS4yNDUwICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNDA2IHF1YW50aXplICAxLjI0NTEgICAgMS4wMCAgICAtPiAgMS4yNSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE0MDcgcXVhbnRpemUgIDEuMjM2MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTQwOCBxdWFudGl6ZSAgMS4yMzcwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNDA5IHF1YW50aXplICAxLjIzOTkgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE0MTEgcXVhbnRpemUgLTEuMjM5OSAgICAxLjAwICAgIC0+IC0xLjI0ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGRvd24KK2RxcXVhMTUwMCBxdWFudGl6ZSAgMS4yMzAwICAgIDEuMDAgICAgLT4gIDEuMjMgIFJvdW5kZWQKK2RxcXVhMTUwMSBxdWFudGl6ZSAgMS4yMzAxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTAyIHF1YW50aXplICAxLjIzMTAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE1MDMgcXVhbnRpemUgIDEuMjM1MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTUwNCBxdWFudGl6ZSAgMS4yMzUxICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTA1IHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE1MDYgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTUwNyBxdWFudGl6ZSAgMS4yMzYwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNTA4IHF1YW50aXplICAxLjIzNzAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE1MDkgcXVhbnRpemUgIDEuMjM5OSAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTUxMSBxdWFudGl6ZSAtMS4yMzk5ICAgIDEuMDAgICAgLT4gLTEuMjMgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworZHFxdWExNjAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZHFxdWExNjAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE2MDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTYwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE2MDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI1ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTYwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjUgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE2MDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTYwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNjExIHF1YW50aXplIC0xLjIzOTkgICAgMS4wMCAgICAtPiAtMS4yMyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBmbG9vcgorZHFxdWExNzAwIHF1YW50aXplICAxLjIzMDAgICAgMS4wMCAgICAtPiAgMS4yMyAgUm91bmRlZAorZHFxdWExNzAxIHF1YW50aXplICAxLjIzMDEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE3MDIgcXVhbnRpemUgIDEuMjMxMCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcwMyBxdWFudGl6ZSAgMS4yMzUwICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzA0IHF1YW50aXplICAxLjIzNTEgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE3MDUgcXVhbnRpemUgIDEuMjQ1MCAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcwNiBxdWFudGl6ZSAgMS4yNDUxICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzA3IHF1YW50aXplICAxLjIzNjAgICAgMS4wMCAgICAtPiAgMS4yMyAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE3MDggcXVhbnRpemUgIDEuMjM3MCAgICAxLjAwICAgIC0+ICAxLjIzICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTcwOSBxdWFudGl6ZSAgMS4yMzk5ICAgIDEuMDAgICAgLT4gIDEuMjMgIEluZXhhY3QgUm91bmRlZAorZHFxdWExNzExIHF1YW50aXplIC0xLjIzOTkgICAgMS4wMCAgICAtPiAtMS4yNCAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAwNXVwCitkcXF1YTE4MDAgcXVhbnRpemUgIDEuMjAwMCAgICAxLjAwICAgIC0+ICAxLjIwICBSb3VuZGVkCitkcXF1YTE4MDEgcXVhbnRpemUgIDEuMjAwMSAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTgwMiBxdWFudGl6ZSAgMS4yMDEwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExODAzIHF1YW50aXplICAxLjIwNTAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE4MDQgcXVhbnRpemUgIDEuMjA1MSAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTgwNyBxdWFudGl6ZSAgMS4yMDYwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExODA4IHF1YW50aXplICAxLjIwNzAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE4MDkgcXVhbnRpemUgIDEuMjA5OSAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTgxMSBxdWFudGl6ZSAtMS4yMDk5ICAgIDEuMDAgICAgLT4gLTEuMjEgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTE5MDAgcXVhbnRpemUgIDEuMjEwMCAgICAxLjAwICAgIC0+ICAxLjIxICBSb3VuZGVkCitkcXF1YTE5MDEgcXVhbnRpemUgIDEuMjEwMSAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTkwMiBxdWFudGl6ZSAgMS4yMTEwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExOTAzIHF1YW50aXplICAxLjIxNTAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE5MDQgcXVhbnRpemUgIDEuMjE1MSAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTkwNyBxdWFudGl6ZSAgMS4yMTYwICAgIDEuMDAgICAgLT4gIDEuMjEgIEluZXhhY3QgUm91bmRlZAorZHFxdWExOTA4IHF1YW50aXplICAxLjIxNzAgICAgMS4wMCAgICAtPiAgMS4yMSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTE5MDkgcXVhbnRpemUgIDEuMjE5OSAgICAxLjAwICAgIC0+ICAxLjIxICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMTkxMSBxdWFudGl6ZSAtMS4yMTk5ICAgIDEuMDAgICAgLT4gLTEuMjEgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTIwMDAgcXVhbnRpemUgIDEuMjQwMCAgICAxLjAwICAgIC0+ICAxLjI0ICBSb3VuZGVkCitkcXF1YTIwMDEgcXVhbnRpemUgIDEuMjQwMSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjAwMiBxdWFudGl6ZSAgMS4yNDEwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDAzIHF1YW50aXplICAxLjI0NTAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIwMDQgcXVhbnRpemUgIDEuMjQ1MSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjAwNyBxdWFudGl6ZSAgMS4yNDYwICAgIDEuMDAgICAgLT4gIDEuMjQgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMDA4IHF1YW50aXplICAxLjI0NzAgICAgMS4wMCAgICAtPiAgMS4yNCAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIwMDkgcXVhbnRpemUgIDEuMjQ5OSAgICAxLjAwICAgIC0+ICAxLjI0ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjAxMSBxdWFudGl6ZSAtMS4yNDk5ICAgIDEuMDAgICAgLT4gLTEuMjQgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTIxMDAgcXVhbnRpemUgIDEuMjUwMCAgICAxLjAwICAgIC0+ICAxLjI1ICBSb3VuZGVkCitkcXF1YTIxMDEgcXVhbnRpemUgIDEuMjUwMSAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjEwMiBxdWFudGl6ZSAgMS4yNTEwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMTAzIHF1YW50aXplICAxLjI1NTAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIxMDQgcXVhbnRpemUgIDEuMjU1MSAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjEwNyBxdWFudGl6ZSAgMS4yNTYwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMTA4IHF1YW50aXplICAxLjI1NzAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIxMDkgcXVhbnRpemUgIDEuMjU5OSAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjExMSBxdWFudGl6ZSAtMS4yNTk5ICAgIDEuMDAgICAgLT4gLTEuMjYgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTIyMDAgcXVhbnRpemUgIDEuMjYwMCAgICAxLjAwICAgIC0+ICAxLjI2ICBSb3VuZGVkCitkcXF1YTIyMDEgcXVhbnRpemUgIDEuMjYwMSAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjIwMiBxdWFudGl6ZSAgMS4yNjEwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjAzIHF1YW50aXplICAxLjI2NTAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyMDQgcXVhbnRpemUgIDEuMjY1MSAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjIwNyBxdWFudGl6ZSAgMS4yNjYwICAgIDEuMDAgICAgLT4gIDEuMjYgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMjA4IHF1YW50aXplICAxLjI2NzAgICAgMS4wMCAgICAtPiAgMS4yNiAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIyMDkgcXVhbnRpemUgIDEuMjY5OSAgICAxLjAwICAgIC0+ICAxLjI2ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjIxMSBxdWFudGl6ZSAtMS4yNjk5ICAgIDEuMDAgICAgLT4gLTEuMjYgIEluZXhhY3QgUm91bmRlZAorCitkcXF1YTIzMDAgcXVhbnRpemUgIDEuMjkwMCAgICAxLjAwICAgIC0+ICAxLjI5ICBSb3VuZGVkCitkcXF1YTIzMDEgcXVhbnRpemUgIDEuMjkwMSAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMwMiBxdWFudGl6ZSAgMS4yOTEwICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzAzIHF1YW50aXplICAxLjI5NTAgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzMDQgcXVhbnRpemUgIDEuMjk1MSAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMwNyBxdWFudGl6ZSAgMS4yOTYwICAgIDEuMDAgICAgLT4gIDEuMjkgIEluZXhhY3QgUm91bmRlZAorZHFxdWEyMzA4IHF1YW50aXplICAxLjI5NzAgICAgMS4wMCAgICAtPiAgMS4yOSAgSW5leGFjdCBSb3VuZGVkCitkcXF1YTIzMDkgcXVhbnRpemUgIDEuMjk5OSAgICAxLjAwICAgIC0+ICAxLjI5ICBJbmV4YWN0IFJvdW5kZWQKK2RxcXVhMjMxMSBxdWFudGl6ZSAtMS4yOTk5ICAgIDEuMDAgICAgLT4gLTEuMjkgIEluZXhhY3QgUm91bmRlZAorCistLSBOdWxsIHRlc3RzCitkcXF1YTk5OCBxdWFudGl6ZSAxMCAgICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFxdWE5OTkgcXVhbnRpemUgICMgMWUxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSZWR1Y2UuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSZWR1Y2UuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjM1ZTZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJlZHVjZS5kZWNUZXN0CkBAIC0wLDAgKzEsMTgzIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxUmVkdWNlLmRlY1Rlc3QgLS0gcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gYSBkZWNRdWFkICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDMsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcXJlZDAwMSByZWR1Y2UgJzEnICAgICAgLT4gJzEnCitkcXJlZDAwMiByZWR1Y2UgJy0xJyAgICAgLT4gJy0xJworZHFyZWQwMDMgcmVkdWNlICcxLjAwJyAgIC0+ICcxJworZHFyZWQwMDQgcmVkdWNlICctMS4wMCcgIC0+ICctMScKK2RxcmVkMDA1IHJlZHVjZSAnMCcgICAgICAtPiAnMCcKK2RxcmVkMDA2IHJlZHVjZSAnMC4wMCcgICAtPiAnMCcKK2RxcmVkMDA3IHJlZHVjZSAnMDAuMCcgICAtPiAnMCcKK2RxcmVkMDA4IHJlZHVjZSAnMDAuMDAnICAtPiAnMCcKK2RxcmVkMDA5IHJlZHVjZSAnMDAnICAgICAtPiAnMCcKK2RxcmVkMDEwIHJlZHVjZSAnMEUrMScgICAtPiAnMCcKK2RxcmVkMDExIHJlZHVjZSAnMEUrNScgICAtPiAnMCcKKworZHFyZWQwMTIgcmVkdWNlICctMicgICAgIC0+ICctMicKK2RxcmVkMDEzIHJlZHVjZSAnMicgICAgICAtPiAnMicKK2RxcmVkMDE0IHJlZHVjZSAnLTIuMDAnICAtPiAnLTInCitkcXJlZDAxNSByZWR1Y2UgJzIuMDAnICAgLT4gJzInCitkcXJlZDAxNiByZWR1Y2UgJy0wJyAgICAgLT4gJy0wJworZHFyZWQwMTcgcmVkdWNlICctMC4wMCcgIC0+ICctMCcKK2RxcmVkMDE4IHJlZHVjZSAnLTAwLjAnICAtPiAnLTAnCitkcXJlZDAxOSByZWR1Y2UgJy0wMC4wMCcgLT4gJy0wJworZHFyZWQwMjAgcmVkdWNlICctMDAnICAgIC0+ICctMCcKK2RxcmVkMDIxIHJlZHVjZSAnLTBFKzUnICAgLT4gJy0wJworZHFyZWQwMjIgcmVkdWNlICctMEUrMScgIC0+ICctMCcKKworZHFyZWQwMzAgcmVkdWNlICcrMC4xJyAgICAgICAgICAgIC0+ICcwLjEnCitkcXJlZDAzMSByZWR1Y2UgJy0wLjEnICAgICAgICAgICAgLT4gJy0wLjEnCitkcXJlZDAzMiByZWR1Y2UgJyswLjAxJyAgICAgICAgICAgLT4gJzAuMDEnCitkcXJlZDAzMyByZWR1Y2UgJy0wLjAxJyAgICAgICAgICAgLT4gJy0wLjAxJworZHFyZWQwMzQgcmVkdWNlICcrMC4wMDEnICAgICAgICAgIC0+ICcwLjAwMScKK2RxcmVkMDM1IHJlZHVjZSAnLTAuMDAxJyAgICAgICAgICAtPiAnLTAuMDAxJworZHFyZWQwMzYgcmVkdWNlICcrMC4wMDAwMDEnICAgICAgIC0+ICcwLjAwMDAwMScKK2RxcmVkMDM3IHJlZHVjZSAnLTAuMDAwMDAxJyAgICAgICAtPiAnLTAuMDAwMDAxJworZHFyZWQwMzggcmVkdWNlICcrMC4wMDAwMDAwMDAwMDEnIC0+ICcxRS0xMicKK2RxcmVkMDM5IHJlZHVjZSAnLTAuMDAwMDAwMDAwMDAxJyAtPiAnLTFFLTEyJworCitkcXJlZDA0MSByZWR1Y2UgMS4xICAgICAgICAtPiAxLjEKK2RxcmVkMDQyIHJlZHVjZSAxLjEwICAgICAgIC0+IDEuMQorZHFyZWQwNDMgcmVkdWNlIDEuMTAwICAgICAgLT4gMS4xCitkcXJlZDA0NCByZWR1Y2UgMS4xMTAgICAgICAtPiAxLjExCitkcXJlZDA0NSByZWR1Y2UgLTEuMSAgICAgICAtPiAtMS4xCitkcXJlZDA0NiByZWR1Y2UgLTEuMTAgICAgICAtPiAtMS4xCitkcXJlZDA0NyByZWR1Y2UgLTEuMTAwICAgICAtPiAtMS4xCitkcXJlZDA0OCByZWR1Y2UgLTEuMTEwICAgICAtPiAtMS4xMQorZHFyZWQwNDkgcmVkdWNlIDkuOSAgICAgICAgLT4gOS45CitkcXJlZDA1MCByZWR1Y2UgOS45MCAgICAgICAtPiA5LjkKK2RxcmVkMDUxIHJlZHVjZSA5LjkwMCAgICAgIC0+IDkuOQorZHFyZWQwNTIgcmVkdWNlIDkuOTkwICAgICAgLT4gOS45OQorZHFyZWQwNTMgcmVkdWNlIC05LjkgICAgICAgLT4gLTkuOQorZHFyZWQwNTQgcmVkdWNlIC05LjkwICAgICAgLT4gLTkuOQorZHFyZWQwNTUgcmVkdWNlIC05LjkwMCAgICAgLT4gLTkuOQorZHFyZWQwNTYgcmVkdWNlIC05Ljk5MCAgICAgLT4gLTkuOTkKKworLS0gc29tZSB0cmFpbGluZyBmcmFjdGlvbmFsIHplcm9zIHdpdGggemVyb3MgaW4gdW5pdHMKK2RxcmVkMDYwIHJlZHVjZSAgMTAuMCAgICAgICAgLT4gMUUrMQorZHFyZWQwNjEgcmVkdWNlICAxMC4wMCAgICAgICAtPiAxRSsxCitkcXJlZDA2MiByZWR1Y2UgIDEwMC4wICAgICAgIC0+IDFFKzIKK2RxcmVkMDYzIHJlZHVjZSAgMTAwLjAwICAgICAgLT4gMUUrMgorZHFyZWQwNjQgcmVkdWNlICAxLjEwMDBFKzMgICAtPiAxLjFFKzMKK2RxcmVkMDY1IHJlZHVjZSAgMS4xMDAwMEUrMyAgLT4gMS4xRSszCitkcXJlZDA2NiByZWR1Y2UgLTEwLjAgICAgICAgIC0+IC0xRSsxCitkcXJlZDA2NyByZWR1Y2UgLTEwLjAwICAgICAgIC0+IC0xRSsxCitkcXJlZDA2OCByZWR1Y2UgLTEwMC4wICAgICAgIC0+IC0xRSsyCitkcXJlZDA2OSByZWR1Y2UgLTEwMC4wMCAgICAgIC0+IC0xRSsyCitkcXJlZDA3MCByZWR1Y2UgLTEuMTAwMEUrMyAgIC0+IC0xLjFFKzMKK2RxcmVkMDcxIHJlZHVjZSAtMS4xMDAwMEUrMyAgLT4gLTEuMUUrMworCistLSBzb21lIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3Mgd2l0aCBwb3NpdGl2ZSBleHBvbmVudAorZHFyZWQwODAgcmVkdWNlICAxMEUrMSAgICAgICAtPiAxRSsyCitkcXJlZDA4MSByZWR1Y2UgIDEwMEUrMSAgICAgIC0+IDFFKzMKK2RxcmVkMDgyIHJlZHVjZSAgMS4wRSsyICAgICAgLT4gMUUrMgorZHFyZWQwODMgcmVkdWNlICAxLjBFKzMgICAgICAtPiAxRSszCitkcXJlZDA4NCByZWR1Y2UgIDEuMUUrMyAgICAgIC0+IDEuMUUrMworZHFyZWQwODUgcmVkdWNlICAxLjAwRSszICAgICAtPiAxRSszCitkcXJlZDA4NiByZWR1Y2UgIDEuMTBFKzMgICAgIC0+IDEuMUUrMworZHFyZWQwODcgcmVkdWNlIC0xMEUrMSAgICAgICAtPiAtMUUrMgorZHFyZWQwODggcmVkdWNlIC0xMDBFKzEgICAgICAtPiAtMUUrMworZHFyZWQwODkgcmVkdWNlIC0xLjBFKzIgICAgICAtPiAtMUUrMgorZHFyZWQwOTAgcmVkdWNlIC0xLjBFKzMgICAgICAtPiAtMUUrMworZHFyZWQwOTEgcmVkdWNlIC0xLjFFKzMgICAgICAtPiAtMS4xRSszCitkcXJlZDA5MiByZWR1Y2UgLTEuMDBFKzMgICAgIC0+IC0xRSszCitkcXJlZDA5MyByZWR1Y2UgLTEuMTBFKzMgICAgIC0+IC0xLjFFKzMKKworLS0gc29tZSBzaWduaWZpY2FudCB0cmFpbGluZyB6ZXJvcywgd2VyZSB3ZSB0byBiZSB0cmltbWluZworZHFyZWQxMDAgcmVkdWNlICAxMSAgICAgICAgICAtPiAxMQorZHFyZWQxMDEgcmVkdWNlICAxMCAgICAgICAgICAtPiAxRSsxCitkcXJlZDEwMiByZWR1Y2UgIDEwLiAgICAgICAgIC0+IDFFKzEKK2RxcmVkMTAzIHJlZHVjZSAgMS4xRSsxICAgICAgLT4gMTEKK2RxcmVkMTA0IHJlZHVjZSAgMS4wRSsxICAgICAgLT4gMUUrMQorZHFyZWQxMDUgcmVkdWNlICAxLjEwRSsyICAgICAtPiAxLjFFKzIKK2RxcmVkMTA2IHJlZHVjZSAgMS4wMEUrMiAgICAgLT4gMUUrMgorZHFyZWQxMDcgcmVkdWNlICAxLjEwMEUrMyAgICAtPiAxLjFFKzMKK2RxcmVkMTA4IHJlZHVjZSAgMS4wMDBFKzMgICAgLT4gMUUrMworZHFyZWQxMDkgcmVkdWNlICAxLjAwMDAwMEUrNiAtPiAxRSs2CitkcXJlZDExMCByZWR1Y2UgLTExICAgICAgICAgIC0+IC0xMQorZHFyZWQxMTEgcmVkdWNlIC0xMCAgICAgICAgICAtPiAtMUUrMQorZHFyZWQxMTIgcmVkdWNlIC0xMC4gICAgICAgICAtPiAtMUUrMQorZHFyZWQxMTMgcmVkdWNlIC0xLjFFKzEgICAgICAtPiAtMTEKK2RxcmVkMTE0IHJlZHVjZSAtMS4wRSsxICAgICAgLT4gLTFFKzEKK2RxcmVkMTE1IHJlZHVjZSAtMS4xMEUrMiAgICAgLT4gLTEuMUUrMgorZHFyZWQxMTYgcmVkdWNlIC0xLjAwRSsyICAgICAtPiAtMUUrMgorZHFyZWQxMTcgcmVkdWNlIC0xLjEwMEUrMyAgICAtPiAtMS4xRSszCitkcXJlZDExOCByZWR1Y2UgLTEuMDAwRSszICAgIC0+IC0xRSszCitkcXJlZDExOSByZWR1Y2UgLTEuMDAwMDBFKzUgIC0+IC0xRSs1CitkcXJlZDEyMCByZWR1Y2UgLTEuMDAwMDAwRSs2IC0+IC0xRSs2CitkcXJlZDEyMSByZWR1Y2UgLTEwLjAwMDAwRSs2IC0+IC0xRSs3CitkcXJlZDEyMiByZWR1Y2UgLTEwMC4wMDAwRSs2IC0+IC0xRSs4CitkcXJlZDEyMyByZWR1Y2UgLTEwMDAuMDAwRSs2IC0+IC0xRSs5CitkcXJlZDEyNCByZWR1Y2UgLTEwMDAwLjAwRSs2IC0+IC0xRSsxMAorZHFyZWQxMjUgcmVkdWNlIC0xMDAwMDAuMEUrNiAtPiAtMUUrMTEKK2RxcmVkMTI2IHJlZHVjZSAtMTAwMDAwMC5FKzYgLT4gLTFFKzEyCisKKy0tIGV4YW1wbGVzIGZyb20gZGVjQXJpdGgKK2RxcmVkMTQwIHJlZHVjZSAnMi4xJyAgICAgLT4gICcyLjEnCitkcXJlZDE0MSByZWR1Y2UgJy0yLjAnICAgIC0+ICAnLTInCitkcXJlZDE0MiByZWR1Y2UgJzEuMjAwJyAgIC0+ICAnMS4yJworZHFyZWQxNDMgcmVkdWNlICctMTIwJyAgICAtPiAgJy0xLjJFKzInCitkcXJlZDE0NCByZWR1Y2UgJzEyMC4wMCcgIC0+ICAnMS4yRSsyJworZHFyZWQxNDUgcmVkdWNlICcwLjAwJyAgICAtPiAgJzAnCisKKy0tIE5tYXgsIE5taW4sIE50aW55CistLSBub3RlIG9yaWdhbWkgZWZmZWN0IG9uIHNvbWUgb2YgdGhlc2UKK2RxcmVkMTUxIHJlZHVjZSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFyZWQxNTIgcmVkdWNlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAwMDAwMDAwMEUrNjE0MCAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MDAwMDBFKzYxNDAKK2RxcmVkMTUzIHJlZHVjZSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAwMDBFKzYxNDQgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MDAwMEUrNjE0NAorZHFyZWQxNTQgcmVkdWNlICAxRS02MTQzICAgICAgICAgICAgICAgICAgIC0+IDFFLTYxNDMKK2RxcmVkMTU1IHJlZHVjZSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtPiAxRS02MTQzCitkcXJlZDE1NiByZWR1Y2UgIDIuMDAwRS02MTczICAgICAgICAgICAgICAgLT4gMkUtNjE3MyAgIFN1Ym5vcm1hbAorZHFyZWQxNTcgcmVkdWNlICAxRS02MTc2ICAgICAgICAgICAgICAgICAgIC0+IDFFLTYxNzYgICBTdWJub3JtYWwKKworZHFyZWQxNjEgcmVkdWNlICAtMUUtNjE3NiAgICAgICAgICAgICAgICAgIC0+IC0xRS02MTc2ICBTdWJub3JtYWwKK2RxcmVkMTYyIHJlZHVjZSAgLTIuMDAwRS02MTczICAgICAgICAgICAgICAtPiAtMkUtNjE3MyAgU3Vibm9ybWFsCitkcXJlZDE2MyByZWR1Y2UgIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gLTFFLTYxNDMKK2RxcmVkMTY0IHJlZHVjZSAgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAtPiAtMUUtNjE0MworZHFyZWQxNjUgcmVkdWNlICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwMDAwMDAwMDBFKzYxNDAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAwMDAwRSs2MTQwCitkcXJlZDE2NiByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MDAwMEUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwMDAwRSs2MTQ0CitkcXJlZDE2NyByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MEUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwRSs2MTQ0CitkcXJlZDE2OCByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJlZDE2OSByZWR1Y2UgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MEUrNjE0NCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwRSs2MTQ0CisKKworLS0gc3BlY2lhbHMgKHJlZHVjZSBkb2VzIG5vdCBhZmZlY3QgcGF5bG9hZCkKK2RxcmVkODIwIHJlZHVjZSAnSW5mJyAgICAtPiAnSW5maW5pdHknCitkcXJlZDgyMSByZWR1Y2UgJy1JbmYnICAgLT4gJy1JbmZpbml0eScKK2RxcmVkODIyIHJlZHVjZSAgIE5hTiAgICAtPiAgTmFOCitkcXJlZDgyMyByZWR1Y2UgIHNOYU4gICAgLT4gIE5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorZHFyZWQ4MjQgcmVkdWNlICAgTmFOMTAxIC0+ICBOYU4xMDEKK2RxcmVkODI1IHJlZHVjZSAgc05hTjAxMCAtPiAgTmFOMTAgIEludmFsaWRfb3BlcmF0aW9uCitkcXJlZDgyNyByZWR1Y2UgIC1OYU4gICAgLT4gLU5hTgorZHFyZWQ4MjggcmVkdWNlIC1zTmFOICAgIC0+IC1OYU4gICAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVkODI5IHJlZHVjZSAgLU5hTjEwMSAtPiAtTmFOMTAxCitkcXJlZDgzMCByZWR1Y2UgLXNOYU4wMTAgLT4gLU5hTjEwICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOdWxsIHRlc3QKK2RxcmVkOTAwIHJlZHVjZSAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSZW1haW5kZXIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSZW1haW5kZXIuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBkM2NmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJlbWFpbmRlci5kZWNUZXN0CkBAIC0wLDAgKzEsNTk3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxUmVtYWluZGVyLmRlY1Rlc3QgLS0gZGVjUXVhZCByZW1haW5kZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcyAoYXMgYmFzZSwgYWJvdmUpCitkcXJlbTAwMSByZW1haW5kZXIgIDEgICAgIDEgICAgLT4gIDAKK2RxcmVtMDAyIHJlbWFpbmRlciAgMiAgICAgMSAgICAtPiAgMAorZHFyZW0wMDMgcmVtYWluZGVyICAxICAgICAyICAgIC0+ICAxCitkcXJlbTAwNCByZW1haW5kZXIgIDIgICAgIDIgICAgLT4gIDAKK2RxcmVtMDA1IHJlbWFpbmRlciAgMCAgICAgMSAgICAtPiAgMAorZHFyZW0wMDYgcmVtYWluZGVyICAwICAgICAyICAgIC0+ICAwCitkcXJlbTAwNyByZW1haW5kZXIgIDEgICAgIDMgICAgLT4gIDEKK2RxcmVtMDA4IHJlbWFpbmRlciAgMiAgICAgMyAgICAtPiAgMgorZHFyZW0wMDkgcmVtYWluZGVyICAzICAgICAzICAgIC0+ICAwCisKK2RxcmVtMDEwIHJlbWFpbmRlciAgMi40ICAgMSAgICAtPiAgMC40CitkcXJlbTAxMSByZW1haW5kZXIgIDIuNCAgIC0xICAgLT4gIDAuNAorZHFyZW0wMTIgcmVtYWluZGVyICAtMi40ICAxICAgIC0+ICAtMC40CitkcXJlbTAxMyByZW1haW5kZXIgIC0yLjQgIC0xICAgLT4gIC0wLjQKK2RxcmVtMDE0IHJlbWFpbmRlciAgMi40MCAgMSAgICAtPiAgMC40MAorZHFyZW0wMTUgcmVtYWluZGVyICAyLjQwMCAxICAgIC0+ICAwLjQwMAorZHFyZW0wMTYgcmVtYWluZGVyICAyLjQgICAyICAgIC0+ICAwLjQKK2RxcmVtMDE3IHJlbWFpbmRlciAgMi40MDAgMiAgICAtPiAgMC40MDAKK2RxcmVtMDE4IHJlbWFpbmRlciAgMi4gICAgMiAgICAtPiAgMAorZHFyZW0wMTkgcmVtYWluZGVyICAyMCAgICAyMCAgIC0+ICAwCisKK2RxcmVtMDIwIHJlbWFpbmRlciAgMTg3ICAgMTg3ICAgIC0+ICAwCitkcXJlbTAyMSByZW1haW5kZXIgIDUgICAgIDIgICAgICAtPiAgMQorZHFyZW0wMjIgcmVtYWluZGVyICA1ICAgICAyLjAgICAgLT4gIDEuMAorZHFyZW0wMjMgcmVtYWluZGVyICA1ICAgICAyLjAwMCAgLT4gIDEuMDAwCitkcXJlbTAyNCByZW1haW5kZXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKK2RxcmVtMDI1IHJlbWFpbmRlciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorCitkcXJlbTAzMCByZW1haW5kZXIgIDEgICAgIDIgICAgICAtPiAgMQorZHFyZW0wMzEgcmVtYWluZGVyICAxICAgICA0ICAgICAgLT4gIDEKK2RxcmVtMDMyIHJlbWFpbmRlciAgMSAgICAgOCAgICAgIC0+ICAxCisKK2RxcmVtMDMzIHJlbWFpbmRlciAgMSAgICAgMTYgICAgIC0+ICAxCitkcXJlbTAzNCByZW1haW5kZXIgIDEgICAgIDMyICAgICAtPiAgMQorZHFyZW0wMzUgcmVtYWluZGVyICAxICAgICA2NCAgICAgLT4gIDEKK2RxcmVtMDQwIHJlbWFpbmRlciAgMSAgICAtMiAgICAgIC0+ICAxCitkcXJlbTA0MSByZW1haW5kZXIgIDEgICAgLTQgICAgICAtPiAgMQorZHFyZW0wNDIgcmVtYWluZGVyICAxICAgIC04ICAgICAgLT4gIDEKK2RxcmVtMDQzIHJlbWFpbmRlciAgMSAgICAtMTYgICAgIC0+ICAxCitkcXJlbTA0NCByZW1haW5kZXIgIDEgICAgLTMyICAgICAtPiAgMQorZHFyZW0wNDUgcmVtYWluZGVyICAxICAgIC02NCAgICAgLT4gIDEKK2RxcmVtMDUwIHJlbWFpbmRlciAtMSAgICAgMiAgICAgIC0+ICAtMQorZHFyZW0wNTEgcmVtYWluZGVyIC0xICAgICA0ICAgICAgLT4gIC0xCitkcXJlbTA1MiByZW1haW5kZXIgLTEgICAgIDggICAgICAtPiAgLTEKK2RxcmVtMDUzIHJlbWFpbmRlciAtMSAgICAgMTYgICAgIC0+ICAtMQorZHFyZW0wNTQgcmVtYWluZGVyIC0xICAgICAzMiAgICAgLT4gIC0xCitkcXJlbTA1NSByZW1haW5kZXIgLTEgICAgIDY0ICAgICAtPiAgLTEKK2RxcmVtMDYwIHJlbWFpbmRlciAtMSAgICAtMiAgICAgIC0+ICAtMQorZHFyZW0wNjEgcmVtYWluZGVyIC0xICAgIC00ICAgICAgLT4gIC0xCitkcXJlbTA2MiByZW1haW5kZXIgLTEgICAgLTggICAgICAtPiAgLTEKK2RxcmVtMDYzIHJlbWFpbmRlciAtMSAgICAtMTYgICAgIC0+ICAtMQorZHFyZW0wNjQgcmVtYWluZGVyIC0xICAgIC0zMiAgICAgLT4gIC0xCitkcXJlbTA2NSByZW1haW5kZXIgLTEgICAgLTY0ICAgICAtPiAgLTEKKworZHFyZW0wNjYgcmVtYWluZGVyICA5OTk5OTk5OTkgICAgIDEgIC0+IDAKK2RxcmVtMDY3IHJlbWFpbmRlciAgOTk5OTk5OTk5LjQgICAxICAtPiAwLjQKK2RxcmVtMDY4IHJlbWFpbmRlciAgOTk5OTk5OTk5LjUgICAxICAtPiAwLjUKK2RxcmVtMDY5IHJlbWFpbmRlciAgOTk5OTk5OTk5LjkgICAxICAtPiAwLjkKK2RxcmVtMDcwIHJlbWFpbmRlciAgOTk5OTk5OTk5Ljk5OSAxICAtPiAwLjk5OQorZHFyZW0wNzEgcmVtYWluZGVyICA5OTk5OTkuOTk5OTk5IDEgIC0+IDAuOTk5OTk5CitkcXJlbTA3MiByZW1haW5kZXIgIDkgICAgICAgICAgICAgMSAgLT4gMAorCitkcXJlbTA4MCByZW1haW5kZXIgIDAuICAgICAgICAgICAgMSAgLT4gMAorZHFyZW0wODEgcmVtYWluZGVyICAuMCAgICAgICAgICAgIDEgIC0+IDAuMAorZHFyZW0wODIgcmVtYWluZGVyICAwLjAwICAgICAgICAgIDEgIC0+IDAuMDAKK2RxcmVtMDgzIHJlbWFpbmRlciAgMC4wMEUrOSAgICAgICAxICAtPiAwCitkcXJlbTA4NCByZW1haW5kZXIgIDAuMDBFKzMgICAgICAgMSAgLT4gMAorZHFyZW0wODUgcmVtYWluZGVyICAwLjAwRSsyICAgICAgIDEgIC0+IDAKK2RxcmVtMDg2IHJlbWFpbmRlciAgMC4wMEUrMSAgICAgICAxICAtPiAwLjAKK2RxcmVtMDg3IHJlbWFpbmRlciAgMC4wMEUrMCAgICAgICAxICAtPiAwLjAwCitkcXJlbTA4OCByZW1haW5kZXIgIDAuMDBFLTAgICAgICAgMSAgLT4gMC4wMAorZHFyZW0wODkgcmVtYWluZGVyICAwLjAwRS0xICAgICAgIDEgIC0+IDAuMDAwCitkcXJlbTA5MCByZW1haW5kZXIgIDAuMDBFLTIgICAgICAgMSAgLT4gMC4wMDAwCitkcXJlbTA5MSByZW1haW5kZXIgIDAuMDBFLTMgICAgICAgMSAgLT4gMC4wMDAwMAorZHFyZW0wOTIgcmVtYWluZGVyICAwLjAwRS00ICAgICAgIDEgIC0+IDAuMDAwMDAwCitkcXJlbTA5MyByZW1haW5kZXIgIDAuMDBFLTUgICAgICAgMSAgLT4gMEUtNworZHFyZW0wOTQgcmVtYWluZGVyICAwLjAwRS02ICAgICAgIDEgIC0+IDBFLTgKK2RxcmVtMDk1IHJlbWFpbmRlciAgMC4wMDAwRS01MCAgICAxICAtPiAwRS01NAorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIHJlbWFpbmRlciBieSAwCitkcXJlbTEwMSByZW1haW5kZXIgIDAgICAgICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxcmVtMTAyIHJlbWFpbmRlciAgMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFyZW0xMDMgcmVtYWluZGVyIC0wICAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJlbTEwNCByZW1haW5kZXIgLTAgICAgICAtMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxcmVtMTA1IHJlbWFpbmRlciAgMC4wRTUgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFyZW0xMDYgcmVtYWluZGVyICAwLjAwMCAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCistLSBbU29tZSB0aGluayB0aGlzIG5leHQgZ3JvdXAgc2hvdWxkIGJlIERpdmlzaW9uX2J5X3plcm8gZXhjZXB0aW9uLCBidXQKKy0tIElFRUUgODU0IGlzIGV4cGxpY2l0IHRoYXQgaXQgaXMgSW52YWxpZCBvcGVyYXRpb24gLi4gZm9yCistLSByZW1haW5kZXItbmVhciwgYW55d2F5XQorZHFyZW0xMDcgcmVtYWluZGVyICAwLjAwMDEgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTA4IHJlbWFpbmRlciAgMC4wMSAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTEwOSByZW1haW5kZXIgIDAuMSAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMTAgcmVtYWluZGVyICAxICAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTExIHJlbWFpbmRlciAgMSAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTExMiByZW1haW5kZXIgMTAgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMTMgcmVtYWluZGVyIDFFKzEwMCAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTE0IHJlbWFpbmRlciAxRSszODAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTExNSByZW1haW5kZXIgIDAuMDAwMSAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMTYgcmVtYWluZGVyICAwLjAxICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTE5IHJlbWFpbmRlciAgMC4xICAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTEyMCByZW1haW5kZXIgIDEgICAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMjEgcmVtYWluZGVyICAxICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTIyIHJlbWFpbmRlciAxMCAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTEyMyByZW1haW5kZXIgMUUrMTAwICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW0xMjQgcmVtYWluZGVyIDFFKzM4NCAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB6ZXJvcyBvbiBsZWZ0CitkcXJlbTEzMCByZW1haW5kZXIgIDAgICAgICAxICAgLT4gIDAKK2RxcmVtMTMxIHJlbWFpbmRlciAgMCAgICAgLTEgICAtPiAgMAorZHFyZW0xMzIgcmVtYWluZGVyICAwLjAgICAgMSAgIC0+ICAwLjAKK2RxcmVtMTMzIHJlbWFpbmRlciAgMC4wICAgLTEgICAtPiAgMC4wCitkcXJlbTEzNCByZW1haW5kZXIgLTAgICAgICAxICAgLT4gLTAKK2RxcmVtMTM1IHJlbWFpbmRlciAtMCAgICAgLTEgICAtPiAtMAorZHFyZW0xMzYgcmVtYWluZGVyIC0wLjAgICAgMSAgIC0+IC0wLjAKK2RxcmVtMTM3IHJlbWFpbmRlciAtMC4wICAgLTEgICAtPiAtMC4wCisKKy0tIDAuNWVycworZHFyZW0xNDMgcmVtYWluZGVyICAgMC41ICAyICAgICAtPiAgMC41CitkcXJlbTE0NCByZW1haW5kZXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK2RxcmVtMTQ1IHJlbWFpbmRlciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK2RxcmVtMTQ2IHJlbWFpbmRlciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCitkcXJlbTE0NyByZW1haW5kZXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCitkcXJlbTE0OCByZW1haW5kZXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitkcXJlbTE0OSByZW1haW5kZXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCistLSBzdGVhZGllcworZHFyZW0xNTAgcmVtYWluZGVyICAxICAxICAgLT4gMAorZHFyZW0xNTEgcmVtYWluZGVyICAxICAyICAgLT4gMQorZHFyZW0xNTIgcmVtYWluZGVyICAxICAzICAgLT4gMQorZHFyZW0xNTMgcmVtYWluZGVyICAxICA0ICAgLT4gMQorZHFyZW0xNTQgcmVtYWluZGVyICAxICA1ICAgLT4gMQorZHFyZW0xNTUgcmVtYWluZGVyICAxICA2ICAgLT4gMQorZHFyZW0xNTYgcmVtYWluZGVyICAxICA3ICAgLT4gMQorZHFyZW0xNTcgcmVtYWluZGVyICAxICA4ICAgLT4gMQorZHFyZW0xNTggcmVtYWluZGVyICAxICA5ICAgLT4gMQorZHFyZW0xNTkgcmVtYWluZGVyICAxICAxMCAgLT4gMQorZHFyZW0xNjAgcmVtYWluZGVyICAxICAxICAgLT4gMAorZHFyZW0xNjEgcmVtYWluZGVyICAyICAxICAgLT4gMAorZHFyZW0xNjIgcmVtYWluZGVyICAzICAxICAgLT4gMAorZHFyZW0xNjMgcmVtYWluZGVyICA0ICAxICAgLT4gMAorZHFyZW0xNjQgcmVtYWluZGVyICA1ICAxICAgLT4gMAorZHFyZW0xNjUgcmVtYWluZGVyICA2ICAxICAgLT4gMAorZHFyZW0xNjYgcmVtYWluZGVyICA3ICAxICAgLT4gMAorZHFyZW0xNjcgcmVtYWluZGVyICA4ICAxICAgLT4gMAorZHFyZW0xNjggcmVtYWluZGVyICA5ICAxICAgLT4gMAorZHFyZW0xNjkgcmVtYWluZGVyICAxMCAxICAgLT4gMAorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyTmVhcgorZHFyZW0xNzEgcmVtYWluZGVyICAgMC40ICAxLjAyMCAtPiAgMC40MDAKK2RxcmVtMTcyIHJlbWFpbmRlciAgIDAuNTAgMS4wMjAgLT4gIDAuNTAwCitkcXJlbTE3MyByZW1haW5kZXIgICAwLjUxIDEuMDIwIC0+ICAwLjUxMAorZHFyZW0xNzQgcmVtYWluZGVyICAgMC41MiAxLjAyMCAtPiAgMC41MjAKK2RxcmVtMTc1IHJlbWFpbmRlciAgIDAuNiAgMS4wMjAgLT4gIDAuNjAwCisKKy0tIE1vcmUgZmxhdm91cnMgb2YgcmVtYWluZGVyIGJ5IDAKK2RxcmVtMjAxIHJlbWFpbmRlciAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJlbTIwMiByZW1haW5kZXIgIDAuMEU1ICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFyZW0yMDMgcmVtYWluZGVyICAwLjAwMCAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2RxcmVtMjA0IHJlbWFpbmRlciAgMC4wMDAxIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMjA1IHJlbWFpbmRlciAgMC4wMSAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMjA2IHJlbWFpbmRlciAgMC4xICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMjA3IHJlbWFpbmRlciAgMSAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMjA4IHJlbWFpbmRlciAgMSAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMjA5IHJlbWFpbmRlciAxMCAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMjEwIHJlbWFpbmRlciAxRSsxMDAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMjExIHJlbWFpbmRlciAxRSszODAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlck5lYXIKK2RxcmVtMjMxIHJlbWFpbmRlciAgLTAuNCAgMS4wMjAgLT4gLTAuNDAwCitkcXJlbTIzMiByZW1haW5kZXIgIC0wLjUwIDEuMDIwIC0+IC0wLjUwMAorZHFyZW0yMzMgcmVtYWluZGVyICAtMC41MSAxLjAyMCAtPiAtMC41MTAKK2RxcmVtMjM0IHJlbWFpbmRlciAgLTAuNTIgMS4wMjAgLT4gLTAuNTIwCitkcXJlbTIzNSByZW1haW5kZXIgIC0wLjYgIDEuMDIwIC0+IC0wLjYwMAorCistLSBoaWdoIFhzCitkcXJlbTI0MCByZW1haW5kZXIgIDFFKzIgIDEuMDAgIC0+ICAwLjAwCisKKy0tIGRxcmVtM3h4IGFyZSBmcm9tIERpYWdCaWdEZWNpbWFsCitkcXJlbTMwMSByZW1haW5kZXIgICAxICAgIDMgICAgIC0+ICAxCitkcXJlbTMwMiByZW1haW5kZXIgICA1ICAgIDUgICAgIC0+ICAwCitkcXJlbTMwMyByZW1haW5kZXIgICAxMyAgIDEwICAgIC0+ICAzCitkcXJlbTMwNCByZW1haW5kZXIgICAxMyAgIDUwICAgIC0+ICAxMworZHFyZW0zMDUgcmVtYWluZGVyICAgMTMgICAxMDAgICAtPiAgMTMKK2RxcmVtMzA2IHJlbWFpbmRlciAgIDEzICAgMTAwMCAgLT4gIDEzCitkcXJlbTMwNyByZW1haW5kZXIgICAuMTMgICAgMSAgIC0+ICAwLjEzCitkcXJlbTMwOCByZW1haW5kZXIgICAwLjEzMyAgMSAgIC0+ICAwLjEzMworZHFyZW0zMDkgcmVtYWluZGVyICAgMC4xMDMzIDEgICAtPiAgMC4xMDMzCitkcXJlbTMxMCByZW1haW5kZXIgICAxLjAzMyAgMSAgIC0+ICAwLjAzMworZHFyZW0zMTEgcmVtYWluZGVyICAgMTAuMzMgIDEgICAtPiAgMC4zMworZHFyZW0zMTIgcmVtYWluZGVyICAgMTAuMzMgMTAgICAtPiAgMC4zMworZHFyZW0zMTMgcmVtYWluZGVyICAgMTAzLjMgIDEgICAtPiAgMC4zCitkcXJlbTMxNCByZW1haW5kZXIgICAxMzMgICAxMCAgIC0+ICAzCitkcXJlbTMxNSByZW1haW5kZXIgICAxMDMzICAxMCAgIC0+ICAzCitkcXJlbTMxNiByZW1haW5kZXIgICAxMDMzICA1MCAgIC0+ICAzMworZHFyZW0zMTcgcmVtYWluZGVyICAgMTAxLjAgIDMgICAtPiAgMi4wCitkcXJlbTMxOCByZW1haW5kZXIgICAxMDIuMCAgMyAgIC0+ICAwLjAKK2RxcmVtMzE5IHJlbWFpbmRlciAgIDEwMy4wICAzICAgLT4gIDEuMAorZHFyZW0zMjAgcmVtYWluZGVyICAgMi40MCAgIDEgICAtPiAgMC40MAorZHFyZW0zMjEgcmVtYWluZGVyICAgMi40MDAgIDEgICAtPiAgMC40MDAKK2RxcmVtMzIyIHJlbWFpbmRlciAgIDIuNCAgICAxICAgLT4gIDAuNAorZHFyZW0zMjMgcmVtYWluZGVyICAgMi40ICAgIDIgICAtPiAgMC40CitkcXJlbTMyNCByZW1haW5kZXIgICAyLjQwMCAgMiAgIC0+ICAwLjQwMAorZHFyZW0zMjUgcmVtYWluZGVyICAgMSAgIDAuMyAgICAtPiAgMC4xCitkcXJlbTMyNiByZW1haW5kZXIgICAxICAgMC4zMCAgIC0+ICAwLjEwCitkcXJlbTMyNyByZW1haW5kZXIgICAxICAgMC4zMDAgIC0+ICAwLjEwMAorZHFyZW0zMjggcmVtYWluZGVyICAgMSAgIDAuMzAwMCAtPiAgMC4xMDAwCitkcXJlbTMyOSByZW1haW5kZXIgICAxLjAgICAgMC4zIC0+ICAwLjEKK2RxcmVtMzMwIHJlbWFpbmRlciAgIDEuMDAgICAwLjMgLT4gIDAuMTAKK2RxcmVtMzMxIHJlbWFpbmRlciAgIDEuMDAwICAwLjMgLT4gIDAuMTAwCitkcXJlbTMzMiByZW1haW5kZXIgICAxLjAwMDAgMC4zIC0+ICAwLjEwMDAKK2RxcmVtMzMzIHJlbWFpbmRlciAgIDAuNSAgMiAgICAgLT4gIDAuNQorZHFyZW0zMzQgcmVtYWluZGVyICAgMC41ICAyLjEgICAtPiAgMC41CitkcXJlbTMzNSByZW1haW5kZXIgICAwLjUgIDIuMDEgIC0+ICAwLjUwCitkcXJlbTMzNiByZW1haW5kZXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorZHFyZW0zMzcgcmVtYWluZGVyICAgMC41MCAyICAgICAtPiAgMC41MAorZHFyZW0zMzggcmVtYWluZGVyICAgMC41MCAyLjAxICAtPiAgMC41MAorZHFyZW0zMzkgcmVtYWluZGVyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworZHFyZW0zNDAgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAxICAgIC0+ICAwLjUwMDAwMDAKK2RxcmVtMzQxIHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAKK2RxcmVtMzQyIHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMAorZHFyZW0zNDMgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMDAKK2RxcmVtMzQ0IHJlbWFpbmRlciAgIDAuNSAgIDAuNTAwMDAwMDAwMDEgICAgLT4gIDAuNTAwMDAwMDAwMDAKK2RxcmVtMzQ1IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OSAgICAtPiAgMUUtNworZHFyZW0zNDYgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OSAgICAtPiAgMUUtOAorZHFyZW0zNDcgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OTkgICAgLT4gIDFFLTkKK2RxcmVtMzQ4IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OSAgICAtPiAgMUUtMTAKK2RxcmVtMzQ5IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OTkgICAgLT4gIDFFLTExCitkcXJlbTM1MCByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5OTk5OSAgICAtPiAgMUUtMTIKKworZHFyZW0zNTEgcmVtYWluZGVyICAgMC4wMyAgNyAgLT4gIDAuMDMKK2RxcmVtMzUyIHJlbWFpbmRlciAgIDUgICAyICAgIC0+ICAxCitkcXJlbTM1MyByZW1haW5kZXIgICA0LjEgICAyICAgIC0+ICAwLjEKK2RxcmVtMzU0IHJlbWFpbmRlciAgIDQuMDEgICAyICAgIC0+ICAwLjAxCitkcXJlbTM1NSByZW1haW5kZXIgICA0LjAwMSAgIDIgICAgLT4gIDAuMDAxCitkcXJlbTM1NiByZW1haW5kZXIgICA0LjAwMDEgICAyICAgIC0+ICAwLjAwMDEKK2RxcmVtMzU3IHJlbWFpbmRlciAgIDQuMDAwMDEgICAyICAgIC0+ICAwLjAwMDAxCitkcXJlbTM1OCByZW1haW5kZXIgICA0LjAwMDAwMSAgIDIgICAgLT4gIDAuMDAwMDAxCitkcXJlbTM1OSByZW1haW5kZXIgICA0LjAwMDAwMDEgICAyICAgIC0+ICAxRS03CisKK2RxcmVtMzYwIHJlbWFpbmRlciAgIDEuMiAgIDAuNzM0NSAtPiAgMC40NjU1CitkcXJlbTM2MSByZW1haW5kZXIgICAwLjggICAxMiAgICAgLT4gIDAuOAorZHFyZW0zNjIgcmVtYWluZGVyICAgMC44ICAgMC4yICAgIC0+ICAwLjAKK2RxcmVtMzYzIHJlbWFpbmRlciAgIDAuOCAgIDAuMyAgICAtPiAgMC4yCitkcXJlbTM2NCByZW1haW5kZXIgICAwLjgwMCAgIDEyICAgLT4gIDAuODAwCitkcXJlbTM2NSByZW1haW5kZXIgICAwLjgwMCAgIDEuNyAgLT4gIDAuODAwCitkcXJlbTM2NiByZW1haW5kZXIgICAyLjQwMCAgIDIgICAgLT4gIDAuNDAwCisKK2RxcmVtMzcxIHJlbWFpbmRlciAgIDIuNDAwICAyICAgICAgICAtPiAgMC40MDAKKworZHFyZW0zODEgcmVtYWluZGVyIDEyMzQ1ICAxICAgICAgICAgLT4gIDAKK2RxcmVtMzgyIHJlbWFpbmRlciAxMjM0NSAgMS4wMDAxICAgIC0+ICAwLjc2NTcKK2RxcmVtMzgzIHJlbWFpbmRlciAxMjM0NSAgMS4wMDEgICAgIC0+ICAwLjY2OAorZHFyZW0zODQgcmVtYWluZGVyIDEyMzQ1ICAxLjAxICAgICAgLT4gIDAuNzgKK2RxcmVtMzg1IHJlbWFpbmRlciAxMjM0NSAgMS4xICAgICAgIC0+ICAwLjgKK2RxcmVtMzg2IHJlbWFpbmRlciAxMjM1NSAgNCAgICAgICAgIC0+ICAzCitkcXJlbTM4NyByZW1haW5kZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMQorZHFyZW0zODggcmVtYWluZGVyIDEyMzU1ICA0LjAwMDEgICAgLT4gIDIuNjkxMgorZHFyZW0zODkgcmVtYWluZGVyIDEyMzQ1ICA0LjAwMDEgICAgLT4gIDAuNjkxNAorZHFyZW0zOTAgcmVtYWluZGVyIDEyMzQ1ICA0LjkgICAgICAgLT4gIDEuOQorZHFyZW0zOTEgcmVtYWluZGVyIDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDQuNzMKK2RxcmVtMzkyIHJlbWFpbmRlciAxMjM0NSAgNC45OTkgICAgIC0+ICAyLjQ2OQorZHFyZW0zOTMgcmVtYWluZGVyIDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDAuMjQ2OQorZHFyZW0zOTQgcmVtYWluZGVyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDAKK2RxcmVtMzk1IHJlbWFpbmRlciAxMjM0NSAgNS4wMDAxICAgIC0+ICA0Ljc1MzIKK2RxcmVtMzk2IHJlbWFpbmRlciAxMjM0NSAgNS4wMDEgICAgIC0+ICAyLjUzMgorZHFyZW0zOTcgcmVtYWluZGVyIDEyMzQ1ICA1LjAxICAgICAgLT4gIDAuMzYKK2RxcmVtMzk4IHJlbWFpbmRlciAxMjM0NSAgNS4xICAgICAgIC0+ICAzLjAKKworLS0gdGhlIG5hc3R5IGRpdmlzaW9uLWJ5LTEgY2FzZXMKK2RxcmVtNDAxIHJlbWFpbmRlciAgIDAuNSAgICAgICAgIDEgICAtPiAgMC41CitkcXJlbTQwMiByZW1haW5kZXIgICAwLjU1ICAgICAgICAxICAgLT4gIDAuNTUKK2RxcmVtNDAzIHJlbWFpbmRlciAgIDAuNTU1ICAgICAgIDEgICAtPiAgMC41NTUKK2RxcmVtNDA0IHJlbWFpbmRlciAgIDAuNTU1NSAgICAgIDEgICAtPiAgMC41NTU1CitkcXJlbTQwNSByZW1haW5kZXIgICAwLjU1NTU1ICAgICAxICAgLT4gIDAuNTU1NTUKK2RxcmVtNDA2IHJlbWFpbmRlciAgIDAuNTU1NTU1ICAgIDEgICAtPiAgMC41NTU1NTUKK2RxcmVtNDA3IHJlbWFpbmRlciAgIDAuNTU1NTU1NSAgIDEgICAtPiAgMC41NTU1NTU1CitkcXJlbTQwOCByZW1haW5kZXIgICAwLjU1NTU1NTU1ICAxICAgLT4gIDAuNTU1NTU1NTUKK2RxcmVtNDA5IHJlbWFpbmRlciAgIDAuNTU1NTU1NTU1IDEgICAtPiAgMC41NTU1NTU1NTUKKworLS0gZm9sZGRvd25zCitkcXJlbTQyMSByZW1haW5kZXIgICAxRSs2MTQ0ICAgICAgICAxICAtPiAgIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcXJlbTQyMiByZW1haW5kZXIgICAxRSs2MTQ0ICAxRSs2MTQzICAtPiAgIDBFKzYxMTEgQ2xhbXBlZAorZHFyZW00MjMgcmVtYWluZGVyICAgMUUrNjE0NCAgMkUrNjE0MyAgLT4gICAwRSs2MTExIENsYW1wZWQKK2RxcmVtNDI0IHJlbWFpbmRlciAgIDFFKzYxNDQgIDNFKzYxNDMgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCitkcXJlbTQyNSByZW1haW5kZXIgICAxRSs2MTQ0ICA0RSs2MTQzICAtPiAgIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgQ2xhbXBlZAorZHFyZW00MjYgcmVtYWluZGVyICAgMUUrNjE0NCAgNUUrNjE0MyAgLT4gICAwRSs2MTExIENsYW1wZWQKK2RxcmVtNDI3IHJlbWFpbmRlciAgIDFFKzYxNDQgIDZFKzYxNDMgIC0+ICAgNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCitkcXJlbTQyOCByZW1haW5kZXIgICAxRSs2MTQ0ICA3RSs2MTQzICAtPiAgIDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgQ2xhbXBlZAorZHFyZW00MjkgcmVtYWluZGVyICAgMUUrNjE0NCAgOEUrNjE0MyAgLT4gICAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKK2RxcmVtNDMwIHJlbWFpbmRlciAgIDFFKzYxNDQgIDlFKzYxNDMgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCistLSB0aW5pZXMKK2RxcmVtNDMxIHJlbWFpbmRlciAgIDFFLTYxNzUgIDFFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFyZW00MzIgcmVtYWluZGVyICAgMUUtNjE3NSAgMkUtNjE3NiAgLT4gICAwRS02MTc2CitkcXJlbTQzMyByZW1haW5kZXIgICAxRS02MTc1ICAzRS02MTc2ICAtPiAgIDFFLTYxNzYgU3Vibm9ybWFsCitkcXJlbTQzNCByZW1haW5kZXIgICAxRS02MTc1ICA0RS02MTc2ICAtPiAgIDJFLTYxNzYgU3Vibm9ybWFsCitkcXJlbTQzNSByZW1haW5kZXIgICAxRS02MTc1ICA1RS02MTc2ICAtPiAgIDBFLTYxNzYKK2RxcmVtNDM2IHJlbWFpbmRlciAgIDFFLTYxNzUgIDZFLTYxNzYgIC0+ICAgNEUtNjE3NiBTdWJub3JtYWwKK2RxcmVtNDM3IHJlbWFpbmRlciAgIDFFLTYxNzUgIDdFLTYxNzYgIC0+ICAgM0UtNjE3NiBTdWJub3JtYWwKK2RxcmVtNDM4IHJlbWFpbmRlciAgIDFFLTYxNzUgIDhFLTYxNzYgIC0+ICAgMkUtNjE3NiBTdWJub3JtYWwKK2RxcmVtNDM5IHJlbWFpbmRlciAgIDFFLTYxNzUgIDlFLTYxNzYgIC0+ICAgMUUtNjE3NiBTdWJub3JtYWwKK2RxcmVtNDQwIHJlbWFpbmRlciAgIDFFLTYxNzUgMTBFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFyZW00NDEgcmVtYWluZGVyICAgMUUtNjE3NSAxMUUtNjE3NiAgLT4gMS4wRS02MTc1IFN1Ym5vcm1hbAorZHFyZW00NDIgcmVtYWluZGVyIDEwMEUtNjE3NSAxMUUtNjE3NiAgLT4gMS4wRS02MTc1IFN1Ym5vcm1hbAorZHFyZW00NDMgcmVtYWluZGVyIDEwMEUtNjE3NSAyMEUtNjE3NiAgLT4gICAwRS02MTc2CitkcXJlbTQ0NCByZW1haW5kZXIgMTAwRS02MTc1IDIxRS02MTc2ICAtPiAxLjNFLTYxNzUgU3Vibm9ybWFsCitkcXJlbTQ0NSByZW1haW5kZXIgMTAwRS02MTc1IDMwRS02MTc2ICAtPiAxLjBFLTYxNzUgU3Vibm9ybWFsCisKKy0tIHplcm8gc2lnbnMKK2RxcmVtNjUwIHJlbWFpbmRlciAgMSAgMSAtPiAgMAorZHFyZW02NTEgcmVtYWluZGVyIC0xICAxIC0+IC0wCitkcXJlbTY1MiByZW1haW5kZXIgIDEgLTEgLT4gIDAKK2RxcmVtNjUzIHJlbWFpbmRlciAtMSAtMSAtPiAtMAorZHFyZW02NTQgcmVtYWluZGVyICAwICAxIC0+ICAwCitkcXJlbTY1NSByZW1haW5kZXIgLTAgIDEgLT4gLTAKK2RxcmVtNjU2IHJlbWFpbmRlciAgMCAtMSAtPiAgMAorZHFyZW02NTcgcmVtYWluZGVyIC0wIC0xIC0+IC0wCitkcXJlbTY1OCByZW1haW5kZXIgIDAuMDAgIDEgIC0+ICAwLjAwCitkcXJlbTY1OSByZW1haW5kZXIgLTAuMDAgIDEgIC0+IC0wLjAwCisKKy0tIFNwZWNpYWxzCitkcXJlbTY4MCByZW1haW5kZXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNjgxIHJlbWFpbmRlciAgSW5mICAtMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW02ODIgcmVtYWluZGVyICBJbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTY4MyByZW1haW5kZXIgIEluZiAgIDAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNjg0IHJlbWFpbmRlciAgSW5mICAtMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW02ODUgcmVtYWluZGVyICBJbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTY4NiByZW1haW5kZXIgIEluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNjg3IHJlbWFpbmRlciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW02ODggcmVtYWluZGVyIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZHFyZW02ODkgcmVtYWluZGVyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTY5MSByZW1haW5kZXIgLTEgICAgIEluZiAgIC0+IC0xCitkcXJlbTY5MiByZW1haW5kZXIgIDAgICAgIEluZiAgIC0+ICAwCitkcXJlbTY5MyByZW1haW5kZXIgLTAgICAgIEluZiAgIC0+IC0wCitkcXJlbTY5NCByZW1haW5kZXIgIDEgICAgIEluZiAgIC0+ICAxCitkcXJlbTY5NSByZW1haW5kZXIgIDEwMDAgIEluZiAgIC0+ICAxMDAwCitkcXJlbTY5NiByZW1haW5kZXIgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFyZW03MDAgcmVtYWluZGVyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTcwMSByZW1haW5kZXIgLUluZiAgLTEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzAyIHJlbWFpbmRlciAtSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03MDMgcmVtYWluZGVyIC1JbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTcwNCByZW1haW5kZXIgLUluZiAgIDAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzA1IHJlbWFpbmRlciAtSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03MDYgcmVtYWluZGVyIC1JbmYgICAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTcwNyByZW1haW5kZXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzA4IHJlbWFpbmRlciAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03MDkgcmVtYWluZGVyIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZHFyZW03MTAgcmVtYWluZGVyIC0xICAgIC1JbmYgICAtPiAtMQorZHFyZW03MTEgcmVtYWluZGVyIC0wICAgIC1JbmYgICAtPiAtMAorZHFyZW03MTIgcmVtYWluZGVyICAwICAgIC1JbmYgICAtPiAgMAorZHFyZW03MTMgcmVtYWluZGVyICAxICAgIC1JbmYgICAtPiAgMQorZHFyZW03MTQgcmVtYWluZGVyICAxMDAwIC1JbmYgICAtPiAgMTAwMAorZHFyZW03MTUgcmVtYWluZGVyICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2RxcmVtNzIxIHJlbWFpbmRlciAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFyZW03MjIgcmVtYWluZGVyICBOYU4gLTEwMDAgICAtPiAgTmFOCitkcXJlbTcyMyByZW1haW5kZXIgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2RxcmVtNzI0IHJlbWFpbmRlciAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFyZW03MjUgcmVtYWluZGVyIC1OYU4gIDAgICAgICAtPiAtTmFOCitkcXJlbTcyNiByZW1haW5kZXIgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2RxcmVtNzI3IHJlbWFpbmRlciAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFyZW03MjggcmVtYWluZGVyICBOYU4gIEluZiAgICAtPiAgTmFOCitkcXJlbTcyOSByZW1haW5kZXIgIE5hTiAtTmFOICAgIC0+ICBOYU4KK2RxcmVtNzMwIHJlbWFpbmRlciAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFyZW03MzEgcmVtYWluZGVyIC0xMDAwIE5hTiAgICAtPiAgTmFOCitkcXJlbTczMiByZW1haW5kZXIgLTEgICAgTmFOICAgIC0+ICBOYU4KK2RxcmVtNzMzIHJlbWFpbmRlciAtMCAgIC1OYU4gICAgLT4gLU5hTgorZHFyZW03MzQgcmVtYWluZGVyICAwICAgIE5hTiAgICAtPiAgTmFOCitkcXJlbTczNSByZW1haW5kZXIgIDEgICAtTmFOICAgIC0+IC1OYU4KK2RxcmVtNzM2IHJlbWFpbmRlciAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFyZW03MzcgcmVtYWluZGVyICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK2RxcmVtNzQxIHJlbWFpbmRlciAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzQyIHJlbWFpbmRlciAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzQzIHJlbWFpbmRlciAtc05hTiAtMSAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzQ0IHJlbWFpbmRlciAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzQ1IHJlbWFpbmRlciAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzQ2IHJlbWFpbmRlciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzQ3IHJlbWFpbmRlciAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzQ5IHJlbWFpbmRlciAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzUwIHJlbWFpbmRlciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzUxIHJlbWFpbmRlciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzUyIHJlbWFpbmRlciAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzUzIHJlbWFpbmRlciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzU0IHJlbWFpbmRlciAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzU1IHJlbWFpbmRlciAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzU2IHJlbWFpbmRlciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzU3IHJlbWFpbmRlciAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzU4IHJlbWFpbmRlciAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzU5IHJlbWFpbmRlciAgSW5mIC1zTmFOICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnaW5nIE5hTnMKK2RxcmVtNzYwIHJlbWFpbmRlciAgTmFOMSAgIE5hTjcgICAtPiAgTmFOMQorZHFyZW03NjEgcmVtYWluZGVyIHNOYU4yICAgTmFOOCAgIC0+ICBOYU4yIEludmFsaWRfb3BlcmF0aW9uCitkcXJlbTc2MiByZW1haW5kZXIgIE5hTjMgIHNOYU45ICAgLT4gIE5hTjkgSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtNzYzIHJlbWFpbmRlciBzTmFONCAgc05hTjEwICAtPiAgTmFONCBJbnZhbGlkX29wZXJhdGlvbgorZHFyZW03NjQgcmVtYWluZGVyICAgIDE1ICAgTmFOMTEgIC0+ICBOYU4xMQorZHFyZW03NjUgcmVtYWluZGVyICBOYU42ICAgTmFOMTIgIC0+ICBOYU42CitkcXJlbTc2NiByZW1haW5kZXIgIEluZiAgICBOYU4xMyAgLT4gIE5hTjEzCitkcXJlbTc2NyByZW1haW5kZXIgIE5hTjE0ICAtSW5mICAgLT4gIE5hTjE0CitkcXJlbTc2OCByZW1haW5kZXIgICAgMCAgICBOYU4xNSAgLT4gIE5hTjE1CitkcXJlbTc2OSByZW1haW5kZXIgIE5hTjE2ICAgLTAgICAgLT4gIE5hTjE2CisKKy0tIGVkZ2UgY2FzZXMgb2YgaW1wb3NzaWJsZQorZHFyZW03NzAgIHJlbWFpbmRlciAgMTIzNDU2ODg4ODg4ODg4Nzc3Nzc3Nzc3Nzg5MDEyMzQ1NiAgMTAgICAgLT4gIDYKK2RxcmVtNzcxICByZW1haW5kZXIgIDEyMzQ1Njg4ODg4ODg4ODc3Nzc3Nzc3Nzc4OTAxMjM0NTYgICAxICAgIC0+ICAwCitkcXJlbTc3MiAgcmVtYWluZGVyICAxMjM0NTY4ODg4ODg4ODg3Nzc3Nzc3Nzc3ODkwMTIzNDU2ICAgMC4xICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxcmVtNzczICByZW1haW5kZXIgIDEyMzQ1Njg4ODg4ODg4ODc3Nzc3Nzc3Nzc4OTAxMjM0NTYgICAwLjAxIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCitkcXJlbTgwMSByZW1haW5kZXIgMTIzNDU2NzgwMDAgMTAwIC0+IDAKK2RxcmVtODAyIHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorZHFyZW04MDMgcmVtYWluZGVyIDEyMzQ1Njc4MDAgIDEwICAtPiAwCitkcXJlbTgwNCByZW1haW5kZXIgMSAxMjM0NTY3ODAwICAgIC0+IDEKK2RxcmVtODA1IHJlbWFpbmRlciAxMjM0NTY3ODkwICAxMCAgLT4gMAorZHFyZW04MDYgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MCAgICAtPiAxCitkcXJlbTgwNyByZW1haW5kZXIgMTIzNDU2Nzg5MSAgMTAgIC0+IDEKK2RxcmVtODA4IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZHFyZW04MDkgcmVtYWluZGVyIDEyMzQ1Njc4OTAxIDEwMCAtPiAxCitkcXJlbTgxMCByZW1haW5kZXIgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK2RxcmVtODExIHJlbWFpbmRlciAxMjM0NTY3ODk2ICAxMCAgLT4gNgorZHFyZW04MTIgcmVtYWluZGVyIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKK2RxcmVtODIxIHJlbWFpbmRlciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorZHFyZW04MjIgcmVtYWluZGVyIDEgMTIzNDU2NzgwMDAgICAtPiAxCitkcXJlbTgyMyByZW1haW5kZXIgMTIzNDU2NzgwMCAgMTAgIC0+IDAKK2RxcmVtODI0IHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorZHFyZW04MjUgcmVtYWluZGVyIDEyMzQ1Njc4OTAgIDEwICAtPiAwCitkcXJlbTgyNiByZW1haW5kZXIgMSAxMjM0NTY3ODkwICAgIC0+IDEKK2RxcmVtODI3IHJlbWFpbmRlciAxMjM0NTY3ODkxICAxMCAgLT4gMQorZHFyZW04MjggcmVtYWluZGVyIDEgMTIzNDU2Nzg5MSAgICAtPiAxCitkcXJlbTgyOSByZW1haW5kZXIgMTIzNDU2Nzg5MDEgMTAwIC0+IDEKK2RxcmVtODMwIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZHFyZW04MzEgcmVtYWluZGVyIDEyMzQ1Njc4OTYgIDEwICAtPiA2CitkcXJlbTgzMiByZW1haW5kZXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBkaXZpZGVpbnQKK2RxcmVtODQwIHJlbWFpbmRlciAgMTAwMDAwMDAwLjAgICAxICAtPiAgMC4wCitkcXJlbTg0MSByZW1haW5kZXIgIDEwMDAwMDAwMC40ICAgMSAgLT4gIDAuNAorZHFyZW04NDIgcmVtYWluZGVyICAxMDAwMDAwMDAuNSAgIDEgIC0+ICAwLjUKK2RxcmVtODQzIHJlbWFpbmRlciAgMTAwMDAwMDAwLjkgICAxICAtPiAgMC45CitkcXJlbTg0NCByZW1haW5kZXIgIDEwMDAwMDAwMC45OTkgMSAgLT4gIDAuOTk5CitkcXJlbTg1MCByZW1haW5kZXIgIDEwMDAwMDAwMyAgICAgNSAgLT4gIDMKK2RxcmVtODUxIHJlbWFpbmRlciAgMTAwMDAwMDMgICAgICA1ICAtPiAgMworZHFyZW04NTIgcmVtYWluZGVyICAxMDAwMDAzICAgICAgIDUgIC0+ICAzCitkcXJlbTg1MyByZW1haW5kZXIgIDEwMDAwMyAgICAgICAgNSAgLT4gIDMKK2RxcmVtODU0IHJlbWFpbmRlciAgMTAwMDMgICAgICAgICA1ICAtPiAgMworZHFyZW04NTUgcmVtYWluZGVyICAxMDAzICAgICAgICAgIDUgIC0+ICAzCitkcXJlbTg1NiByZW1haW5kZXIgIDEwMyAgICAgICAgICAgNSAgLT4gIDMKK2RxcmVtODU3IHJlbWFpbmRlciAgMTMgICAgICAgICAgICA1ICAtPiAgMworZHFyZW04NTggcmVtYWluZGVyICAxICAgICAgICAgICAgIDUgIC0+ICAxCisKKy0tIFZsYWRpbWlyJ3MgY2FzZXMgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitkcXJlbTg2MCByZW1haW5kZXIgMTIzLjBlMSAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJlbTg2MSByZW1haW5kZXIgMTIzMCAgICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJlbTg2MiByZW1haW5kZXIgMTIuM2UyICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJlbTg2MyByZW1haW5kZXIgMS4yM2UzICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJlbTg2NCByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJlbTg3MCByZW1haW5kZXIgMTIzZTEgICAgMTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3MSByZW1haW5kZXIgMTIzZTEgICAgIDEwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3MiByZW1haW5kZXIgMTIzZTEgICAgICAxMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3MyByZW1haW5kZXIgMTIzZTEgICAgICAgMTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3NCByZW1haW5kZXIgMTIzZTEgICAgICAgIDEwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3NSByZW1haW5kZXIgMTIzZTEgICAgICAgICAxMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgMTAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3NyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgIDEwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3OCByZW1haW5kZXIgMTIzMCAgICAgICAgICAgIDEwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg3OSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAxMDAwMDAwMCAtPiAxMjMwCitkcXJlbTg4MCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgMTAwMDAwMCAtPiAxMjMwCitkcXJlbTg4MSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgIDEwMDAwMCAtPiAxMjMwCitkcXJlbTg4MiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAxMDAwMCAtPiAxMjMwCitkcXJlbTg4MyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgMTAwMCAtPiAgMjMwCitkcXJlbTg4NCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgIDEwMCAtPiAgIDMwCitkcXJlbTg4NSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAxMCAtPiAgICAwCitkcXJlbTg4NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMSAtPiAgICAwCisKK2RxcmVtODkwIHJlbWFpbmRlciAxMjNlMSAgICAyMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODkxIHJlbWFpbmRlciAxMjNlMSAgICAgMjAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODkyIHJlbWFpbmRlciAxMjNlMSAgICAgIDIwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODkzIHJlbWFpbmRlciAxMjNlMSAgICAgICAyMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODk0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgMjAwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODk1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgIDIwMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODk2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAyMDAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODk3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgMjAwMDAwMDAwIC0+IDEyMzAKK2RxcmVtODk5IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgIDIwMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTAwIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAyMDAwMDAwIC0+IDEyMzAKK2RxcmVtOTAxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgMjAwMDAwIC0+IDEyMzAKK2RxcmVtOTAyIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgIDIwMDAwIC0+IDEyMzAKK2RxcmVtOTAzIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAyMDAwIC0+IDEyMzAKK2RxcmVtOTA0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgMjAwIC0+ICAgMzAKK2RxcmVtOTA1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgIDIwIC0+ICAgMTAKK2RxcmVtOTA2IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgICAyIC0+ICAgIDAKKworZHFyZW05MTAgcmVtYWluZGVyIDEyM2UxICAgIDUwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTEgcmVtYWluZGVyIDEyM2UxICAgICA1MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTIgcmVtYWluZGVyIDEyM2UxICAgICAgNTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTMgcmVtYWluZGVyIDEyM2UxICAgICAgIDUwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTQgcmVtYWluZGVyIDEyM2UxICAgICAgICA1MDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgNTAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgIDUwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTcgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICA1MDAwMDAwMDAgLT4gMTIzMAorZHFyZW05MTkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgNTAwMDAwMDAgLT4gMTIzMAorZHFyZW05MjAgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgIDUwMDAwMDAgLT4gMTIzMAorZHFyZW05MjEgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICA1MDAwMDAgLT4gMTIzMAorZHFyZW05MjIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgNTAwMDAgLT4gMTIzMAorZHFyZW05MjMgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgIDUwMDAgLT4gMTIzMAorZHFyZW05MjQgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICA1MDAgLT4gIDIzMAorZHFyZW05MjUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgNTAgLT4gICAzMAorZHFyZW05MjYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgIDUgLT4gICAgMAorCitkcXJlbTkzMCByZW1haW5kZXIgMTIzZTEgICAgOTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzMSByZW1haW5kZXIgMTIzZTEgICAgIDkwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzMiByZW1haW5kZXIgMTIzZTEgICAgICA5MDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzMyByZW1haW5kZXIgMTIzZTEgICAgICAgOTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzNCByZW1haW5kZXIgMTIzZTEgICAgICAgIDkwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzNSByZW1haW5kZXIgMTIzZTEgICAgICAgICA5MDAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgOTAwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzNyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgIDkwMDAwMDAwMCAtPiAxMjMwCitkcXJlbTkzOSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICA5MDAwMDAwMCAtPiAxMjMwCitkcXJlbTk0MCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgOTAwMDAwMCAtPiAxMjMwCitkcXJlbTk0MSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgIDkwMDAwMCAtPiAxMjMwCitkcXJlbTk0MiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICA5MDAwMCAtPiAxMjMwCitkcXJlbTk0MyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgOTAwMCAtPiAxMjMwCitkcXJlbTk0NCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgIDkwMCAtPiAgMzMwCitkcXJlbTk0NSByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICA5MCAtPiAgIDYwCitkcXJlbTk0NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgOSAtPiAgICA2CisKK2RxcmVtOTUwIHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFyZW05NjEgcmVtYWluZGVyIDEyM2UxICAgMjk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkcXJlbTk2MiByZW1haW5kZXIgMTIzZTEgICAzOTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RxcmVtOTYzIHJlbWFpbmRlciAxMjNlMSAgIDQ5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFyZW05NjQgcmVtYWluZGVyIDEyM2UxICAgNTk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkcXJlbTk2NSByZW1haW5kZXIgMTIzZTEgICA2OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RxcmVtOTY2IHJlbWFpbmRlciAxMjNlMSAgIDc5OTk5OTk5OTk5OTk5OTkgLT4gMTIzMAorZHFyZW05NjcgcmVtYWluZGVyIDEyM2UxICAgODk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCitkcXJlbTk2OCByZW1haW5kZXIgMTIzZTEgICA5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2RxcmVtOTY5IHJlbWFpbmRlciAxMjNlMSAgIDk4NzY1NDMyMTA5ODc2NTQgLT4gMTIzMAorCitkcXJlbTk4MCByZW1haW5kZXIgMTIzZTEgMTAwMEUyOTkgLT4gMS4yM0UrMyAgLS0gMTIzRSsxIGludGVybmFsbHkKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyBbZnJvbSBkaXZpZGVdCitkcXJlbTEwNTEgcmVtYWluZGVyICAxZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxcmVtMTA1MiByZW1haW5kZXIgIDFlKzI3NyAtMWUtMzExIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorZHFyZW0xMDUzIHJlbWFpbmRlciAtMWUrMjc3ICAxZS0zMTEgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcXJlbTEwNTQgcmVtYWluZGVyIC0xZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2RxcmVtMTA1NSByZW1haW5kZXIgIDFlLTI3NyAgMWUrMzExIC0+ICAxRS0yNzcKK2RxcmVtMTA1NiByZW1haW5kZXIgIDFlLTI3NyAtMWUrMzExIC0+ICAxRS0yNzcKK2RxcmVtMTA1NyByZW1haW5kZXIgLTFlLTI3NyAgMWUrMzExIC0+IC0xRS0yNzcKK2RxcmVtMTA1OCByZW1haW5kZXIgLTFlLTI3NyAtMWUrMzExIC0+IC0xRS0yNzcKKworLS0gR3l1cmlzIGV4YW1wbGUKK2RxcmVtMTA3MCByZW1haW5kZXIgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODE3MDlFLTYxNDMgOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODkwMDBFLTYxNDMgLT4gOC4zMzY4MDQ0MTgwOTQwNDA5ODk2MzAwMDY4MTk4ODE3MDlFLTYxNDMKKworLS0gZGVzdHJ1Y3RpdmUgc3VidHJhY3QKK2RxcmVtMTEyMCAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gIDAuNzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY4CitkcXJlbTExMjEgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAgMC42NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc3OQorZHFyZW0xMTIyICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgICAwLjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg4OTAKK2RxcmVtMTEyMyAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjU1ICA0LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gIDIuNjkxMzU4MDI3NDY5MTM1ODAyNzQ2OTEzNTgwMjc0Njg3CitkcXJlbTExMjQgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIC0+ICAxLjY5MTM1ODAyNzQ2OTEzNTgwMjc0NjkxMzU4MDI3NDY5MgorZHFyZW0xMTI1ICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAgICAzLjY5MTM1NzgwMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNTEKK2RxcmVtMTEyNiAgcmVtYWluZGVyICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLT4gICAxLjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3CitkcXJlbTExMjcgIHJlbWFpbmRlciAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+ICA0LjI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ2OTEzNTc4MDI0NgorZHFyZW0xMTI4ICByZW1haW5kZXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgICA0LjMwODY0MjE5NzUzMDg2NDIxOTc1MzA4NjQyMTk3NTkKKworLS0gTnVsbCB0ZXN0cworZHFyZW0xMDAwIHJlbWFpbmRlciAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxcmVtMTAwMSByZW1haW5kZXIgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSZW1haW5kZXJOZWFyLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUmVtYWluZGVyTmVhci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZDI3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxUmVtYWluZGVyTmVhci5kZWNUZXN0CkBAIC0wLDAgKzEsNjMxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxUmVtYWluZGVyTmVhci5kZWNUZXN0IC0tIGRlY1F1YWQgcmVtYWluZGVyLW5lYXIgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc2FuaXR5IGNoZWNrcyAoYXMgYmFzZSwgYWJvdmUpCitkcXJtbjAwMSByZW1haW5kZXJuZWFyICAxICAgICAxICAgIC0+ICAwCitkcXJtbjAwMiByZW1haW5kZXJuZWFyICAyICAgICAxICAgIC0+ICAwCitkcXJtbjAwMyByZW1haW5kZXJuZWFyICAxICAgICAyICAgIC0+ICAxCitkcXJtbjAwNCByZW1haW5kZXJuZWFyICAyICAgICAyICAgIC0+ICAwCitkcXJtbjAwNSByZW1haW5kZXJuZWFyICAwICAgICAxICAgIC0+ICAwCitkcXJtbjAwNiByZW1haW5kZXJuZWFyICAwICAgICAyICAgIC0+ICAwCitkcXJtbjAwNyByZW1haW5kZXJuZWFyICAxICAgICAzICAgIC0+ICAxCitkcXJtbjAwOCByZW1haW5kZXJuZWFyICAyICAgICAzICAgIC0+IC0xCitkcXJtbjAwOSByZW1haW5kZXJuZWFyICAzICAgICAzICAgIC0+ICAwCisKK2Rxcm1uMDEwIHJlbWFpbmRlcm5lYXIgIDIuNCAgIDEgICAgLT4gIDAuNAorZHFybW4wMTEgcmVtYWluZGVybmVhciAgMi40ICAgLTEgICAtPiAgMC40CitkcXJtbjAxMiByZW1haW5kZXJuZWFyICAtMi40ICAxICAgIC0+ICAtMC40CitkcXJtbjAxMyByZW1haW5kZXJuZWFyICAtMi40ICAtMSAgIC0+ICAtMC40CitkcXJtbjAxNCByZW1haW5kZXJuZWFyICAyLjQwICAxICAgIC0+ICAwLjQwCitkcXJtbjAxNSByZW1haW5kZXJuZWFyICAyLjQwMCAxICAgIC0+ICAwLjQwMAorZHFybW4wMTYgcmVtYWluZGVybmVhciAgMi40ICAgMiAgICAtPiAgMC40CitkcXJtbjAxNyByZW1haW5kZXJuZWFyICAyLjQwMCAyICAgIC0+ICAwLjQwMAorZHFybW4wMTggcmVtYWluZGVybmVhciAgMi4gICAgMiAgICAtPiAgMAorZHFybW4wMTkgcmVtYWluZGVybmVhciAgMjAgICAgMjAgICAtPiAgMAorCitkcXJtbjAyMCByZW1haW5kZXJuZWFyICAxODcgICAxODcgICAgLT4gIDAKK2Rxcm1uMDIxIHJlbWFpbmRlcm5lYXIgIDUgICAgIDIgICAgICAtPiAgMQorZHFybW4wMjIgcmVtYWluZGVybmVhciAgNSAgICAgMi4wICAgIC0+ICAxLjAKK2Rxcm1uMDIzIHJlbWFpbmRlcm5lYXIgIDUgICAgIDIuMDAwICAtPiAgMS4wMDAKK2Rxcm1uMDI0IHJlbWFpbmRlcm5lYXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKK2Rxcm1uMDI1IHJlbWFpbmRlcm5lYXIgIDUgICAgIDAuMjAwICAtPiAgMC4wMDAKKworZHFybW4wMzAgcmVtYWluZGVybmVhciAgMSAgICAgMiAgICAgIC0+ICAxCitkcXJtbjAzMSByZW1haW5kZXJuZWFyICAxICAgICA0ICAgICAgLT4gIDEKK2Rxcm1uMDMyIHJlbWFpbmRlcm5lYXIgIDEgICAgIDggICAgICAtPiAgMQorCitkcXJtbjAzMyByZW1haW5kZXJuZWFyICAxICAgICAxNiAgICAgLT4gIDEKK2Rxcm1uMDM0IHJlbWFpbmRlcm5lYXIgIDEgICAgIDMyICAgICAtPiAgMQorZHFybW4wMzUgcmVtYWluZGVybmVhciAgMSAgICAgNjQgICAgIC0+ICAxCitkcXJtbjA0MCByZW1haW5kZXJuZWFyICAxICAgIC0yICAgICAgLT4gIDEKK2Rxcm1uMDQxIHJlbWFpbmRlcm5lYXIgIDEgICAgLTQgICAgICAtPiAgMQorZHFybW4wNDIgcmVtYWluZGVybmVhciAgMSAgICAtOCAgICAgIC0+ICAxCitkcXJtbjA0MyByZW1haW5kZXJuZWFyICAxICAgIC0xNiAgICAgLT4gIDEKK2Rxcm1uMDQ0IHJlbWFpbmRlcm5lYXIgIDEgICAgLTMyICAgICAtPiAgMQorZHFybW4wNDUgcmVtYWluZGVybmVhciAgMSAgICAtNjQgICAgIC0+ICAxCitkcXJtbjA1MCByZW1haW5kZXJuZWFyIC0xICAgICAyICAgICAgLT4gIC0xCitkcXJtbjA1MSByZW1haW5kZXJuZWFyIC0xICAgICA0ICAgICAgLT4gIC0xCitkcXJtbjA1MiByZW1haW5kZXJuZWFyIC0xICAgICA4ICAgICAgLT4gIC0xCitkcXJtbjA1MyByZW1haW5kZXJuZWFyIC0xICAgICAxNiAgICAgLT4gIC0xCitkcXJtbjA1NCByZW1haW5kZXJuZWFyIC0xICAgICAzMiAgICAgLT4gIC0xCitkcXJtbjA1NSByZW1haW5kZXJuZWFyIC0xICAgICA2NCAgICAgLT4gIC0xCitkcXJtbjA2MCByZW1haW5kZXJuZWFyIC0xICAgIC0yICAgICAgLT4gIC0xCitkcXJtbjA2MSByZW1haW5kZXJuZWFyIC0xICAgIC00ICAgICAgLT4gIC0xCitkcXJtbjA2MiByZW1haW5kZXJuZWFyIC0xICAgIC04ICAgICAgLT4gIC0xCitkcXJtbjA2MyByZW1haW5kZXJuZWFyIC0xICAgIC0xNiAgICAgLT4gIC0xCitkcXJtbjA2NCByZW1haW5kZXJuZWFyIC0xICAgIC0zMiAgICAgLT4gIC0xCitkcXJtbjA2NSByZW1haW5kZXJuZWFyIC0xICAgIC02NCAgICAgLT4gIC0xCisKK2Rxcm1uMDY2IHJlbWFpbmRlcm5lYXIgICAgICAgICAgOS45ICAgMSAgLT4gLTAuMQorZHFybW4wNjcgcmVtYWluZGVybmVhciAgICAgICAgIDk5LjcgICAxICAtPiAtMC4zCitkcXJtbjA2OCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkgICAgIDEgIC0+IDAKK2Rxcm1uMDY5IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS40ICAgMSAgLT4gMC40CitkcXJtbjA3MCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuNSAgIDEgIC0+IC0wLjUKK2Rxcm1uMDcxIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS45ICAgMSAgLT4gLTAuMQorZHFybW4wNzIgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5Ljk5OSAxICAtPiAtMC4wMDEKK2Rxcm1uMDczIHJlbWFpbmRlcm5lYXIgIDk5OTk5OS45OTk5OTkgMSAgLT4gLTAuMDAwMDAxCitkcXJtbjA3NCByZW1haW5kZXJuZWFyICA5ICAgICAgICAgICAgIDEgIC0+IDAKK2Rxcm1uMDc1IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OTk5OTk5OTkgMSAgLT4gMAorZHFybW4wNzYgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5OTk5OTk5OSAyICAtPiAtMQorZHFybW4wNzcgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5OTk5OTk5OSAzICAtPiAwCitkcXJtbjA3OCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTk5OTk5OTk5IDQgIC0+IC0xCisKK2Rxcm1uMDgwIHJlbWFpbmRlcm5lYXIgIDAuICAgICAgICAgICAgMSAgLT4gMAorZHFybW4wODEgcmVtYWluZGVybmVhciAgLjAgICAgICAgICAgICAxICAtPiAwLjAKK2Rxcm1uMDgyIHJlbWFpbmRlcm5lYXIgIDAuMDAgICAgICAgICAgMSAgLT4gMC4wMAorZHFybW4wODMgcmVtYWluZGVybmVhciAgMC4wMEUrOSAgICAgICAxICAtPiAwCitkcXJtbjA4NCByZW1haW5kZXJuZWFyICAwLjAwRSszICAgICAgIDEgIC0+IDAKK2Rxcm1uMDg1IHJlbWFpbmRlcm5lYXIgIDAuMDBFKzIgICAgICAgMSAgLT4gMAorZHFybW4wODYgcmVtYWluZGVybmVhciAgMC4wMEUrMSAgICAgICAxICAtPiAwLjAKK2Rxcm1uMDg3IHJlbWFpbmRlcm5lYXIgIDAuMDBFKzAgICAgICAgMSAgLT4gMC4wMAorZHFybW4wODggcmVtYWluZGVybmVhciAgMC4wMEUtMCAgICAgICAxICAtPiAwLjAwCitkcXJtbjA4OSByZW1haW5kZXJuZWFyICAwLjAwRS0xICAgICAgIDEgIC0+IDAuMDAwCitkcXJtbjA5MCByZW1haW5kZXJuZWFyICAwLjAwRS0yICAgICAgIDEgIC0+IDAuMDAwMAorZHFybW4wOTEgcmVtYWluZGVybmVhciAgMC4wMEUtMyAgICAgICAxICAtPiAwLjAwMDAwCitkcXJtbjA5MiByZW1haW5kZXJuZWFyICAwLjAwRS00ICAgICAgIDEgIC0+IDAuMDAwMDAwCitkcXJtbjA5MyByZW1haW5kZXJuZWFyICAwLjAwRS01ICAgICAgIDEgIC0+IDBFLTcKK2Rxcm1uMDk0IHJlbWFpbmRlcm5lYXIgIDAuMDBFLTYgICAgICAgMSAgLT4gMEUtOAorZHFybW4wOTUgcmVtYWluZGVybmVhciAgMC4wMDAwRS01MCAgICAxICAtPiAwRS01NAorCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIHJlbWFpbmRlcm5lYXIgYnkgMAorZHFybW4xMDEgcmVtYWluZGVybmVhciAgMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFybW4xMDIgcmVtYWluZGVybmVhciAgMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFybW4xMDMgcmVtYWluZGVybmVhciAtMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFybW4xMDQgcmVtYWluZGVybmVhciAtMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFybW4xMDUgcmVtYWluZGVybmVhciAgMC4wRTUgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFybW4xMDYgcmVtYWluZGVybmVhciAgMC4wMDAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorLS0gW1NvbWUgdGhpbmsgdGhpcyBuZXh0IGdyb3VwIHNob3VsZCBiZSBEaXZpc2lvbl9ieV96ZXJvIGV4Y2VwdGlvbiwgYnV0CistLSBJRUVFIDg1NCBpcyBleHBsaWNpdCB0aGF0IGl0IGlzIEludmFsaWQgb3BlcmF0aW9uIC4uIGZvcgorLS0gcmVtYWluZGVyLW5lYXIsIGFueXdheV0KK2Rxcm1uMTA3IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMDggcmVtYWluZGVybmVhciAgMC4wMSAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjEwOSByZW1haW5kZXJuZWFyICAwLjEgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTEwIHJlbWFpbmRlcm5lYXIgIDEgICAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMTEgcmVtYWluZGVybmVhciAgMSAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjExMiByZW1haW5kZXJuZWFyIDEwICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTEzIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMTQgcmVtYWluZGVybmVhciAxRSszODAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjExNSByZW1haW5kZXJuZWFyICAwLjAwMDEgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTE2IHJlbWFpbmRlcm5lYXIgIDAuMDEgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMTkgcmVtYWluZGVybmVhciAgMC4xICAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjEyMCByZW1haW5kZXJuZWFyICAxICAgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTIxIHJlbWFpbmRlcm5lYXIgIDEgICAgICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMjIgcmVtYWluZGVybmVhciAxMCAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjEyMyByZW1haW5kZXJuZWFyIDFFKzEwMCAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMTI0IHJlbWFpbmRlcm5lYXIgMUUrMzg0ICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYW5kIHplcm9zIG9uIGxlZnQKK2Rxcm1uMTMwIHJlbWFpbmRlcm5lYXIgIDAgICAgICAxICAgLT4gIDAKK2Rxcm1uMTMxIHJlbWFpbmRlcm5lYXIgIDAgICAgIC0xICAgLT4gIDAKK2Rxcm1uMTMyIHJlbWFpbmRlcm5lYXIgIDAuMCAgICAxICAgLT4gIDAuMAorZHFybW4xMzMgcmVtYWluZGVybmVhciAgMC4wICAgLTEgICAtPiAgMC4wCitkcXJtbjEzNCByZW1haW5kZXJuZWFyIC0wICAgICAgMSAgIC0+IC0wCitkcXJtbjEzNSByZW1haW5kZXJuZWFyIC0wICAgICAtMSAgIC0+IC0wCitkcXJtbjEzNiByZW1haW5kZXJuZWFyIC0wLjAgICAgMSAgIC0+IC0wLjAKK2Rxcm1uMTM3IHJlbWFpbmRlcm5lYXIgLTAuMCAgIC0xICAgLT4gLTAuMAorCistLSAwLjVlcnMKK2Rxcm1uMTQzIHJlbWFpbmRlcm5lYXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK2Rxcm1uMTQ0IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK2Rxcm1uMTQ1IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMDEgIC0+ICAwLjUwCitkcXJtbjE0NiByZW1haW5kZXJuZWFyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK2Rxcm1uMTQ3IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCitkcXJtbjE0OCByZW1haW5kZXJuZWFyICAgMC41MCAyLjAxICAtPiAgMC41MAorZHFybW4xNDkgcmVtYWluZGVybmVhciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKKy0tIHN0ZWFkaWVzCitkcXJtbjE1MCByZW1haW5kZXJuZWFyICAxICAxICAgLT4gMAorZHFybW4xNTEgcmVtYWluZGVybmVhciAgMSAgMiAgIC0+IDEKK2Rxcm1uMTUyIHJlbWFpbmRlcm5lYXIgIDEgIDMgICAtPiAxCitkcXJtbjE1MyByZW1haW5kZXJuZWFyICAxICA0ICAgLT4gMQorZHFybW4xNTQgcmVtYWluZGVybmVhciAgMSAgNSAgIC0+IDEKK2Rxcm1uMTU1IHJlbWFpbmRlcm5lYXIgIDEgIDYgICAtPiAxCitkcXJtbjE1NiByZW1haW5kZXJuZWFyICAxICA3ICAgLT4gMQorZHFybW4xNTcgcmVtYWluZGVybmVhciAgMSAgOCAgIC0+IDEKK2Rxcm1uMTU4IHJlbWFpbmRlcm5lYXIgIDEgIDkgICAtPiAxCitkcXJtbjE1OSByZW1haW5kZXJuZWFyICAxICAxMCAgLT4gMQorZHFybW4xNjAgcmVtYWluZGVybmVhciAgMSAgMSAgIC0+IDAKK2Rxcm1uMTYxIHJlbWFpbmRlcm5lYXIgIDIgIDEgICAtPiAwCitkcXJtbjE2MiByZW1haW5kZXJuZWFyICAzICAxICAgLT4gMAorZHFybW4xNjMgcmVtYWluZGVybmVhciAgNCAgMSAgIC0+IDAKK2Rxcm1uMTY0IHJlbWFpbmRlcm5lYXIgIDUgIDEgICAtPiAwCitkcXJtbjE2NSByZW1haW5kZXJuZWFyICA2ICAxICAgLT4gMAorZHFybW4xNjYgcmVtYWluZGVybmVhciAgNyAgMSAgIC0+IDAKK2Rxcm1uMTY3IHJlbWFpbmRlcm5lYXIgIDggIDEgICAtPiAwCitkcXJtbjE2OCByZW1haW5kZXJuZWFyICA5ICAxICAgLT4gMAorZHFybW4xNjkgcmVtYWluZGVybmVhciAgMTAgMSAgIC0+IDAKKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlcgorZHFybW4xNzEgcmVtYWluZGVybmVhciAgIDAuNCAgMS4wMjAgLT4gIDAuNDAwCitkcXJtbjE3MiByZW1haW5kZXJuZWFyICAgMC41MCAxLjAyMCAtPiAgMC41MDAKK2Rxcm1uMTczIHJlbWFpbmRlcm5lYXIgICAwLjUxIDEuMDIwIC0+ICAwLjUxMAorZHFybW4xNzQgcmVtYWluZGVybmVhciAgIDAuNTIgMS4wMjAgLT4gLTAuNTAwCitkcXJtbjE3NSByZW1haW5kZXJuZWFyICAgMC42ICAxLjAyMCAtPiAtMC40MjAKKworLS0gTW9yZSBmbGF2b3VycyBvZiByZW1haW5kZXJuZWFyIGJ5IDAKK2Rxcm1uMjAxIHJlbWFpbmRlcm5lYXIgIDAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorZHFybW4yMDIgcmVtYWluZGVybmVhciAgMC4wRTUgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitkcXJtbjIwMyByZW1haW5kZXJuZWFyICAwLjAwMCAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK2Rxcm1uMjA0IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjIwNSByZW1haW5kZXJuZWFyICAwLjAxICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4yMDYgcmVtYWluZGVybmVhciAgMC4xICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMjA3IHJlbWFpbmRlcm5lYXIgIDEgICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjIwOCByZW1haW5kZXJuZWFyICAxICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4yMDkgcmVtYWluZGVybmVhciAxMCAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uMjEwIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjIxMSByZW1haW5kZXJuZWFyIDFFKzM4MCAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSB0ZXN0cyBmcm9tIHRoZSBleHRlbmRlZCBzcGVjaWZpY2F0aW9uCitkcXJtbjIyMSByZW1haW5kZXJuZWFyIDIuMSAgICAgMyAgIC0+IC0wLjkKK2Rxcm1uMjIyIHJlbWFpbmRlcm5lYXIgIDEwICAgICA2ICAgLT4gLTIKK2Rxcm1uMjIzIHJlbWFpbmRlcm5lYXIgIDEwICAgICAzICAgLT4gIDEKK2Rxcm1uMjI0IHJlbWFpbmRlcm5lYXIgLTEwICAgICAzICAgLT4gLTEKK2Rxcm1uMjI1IHJlbWFpbmRlcm5lYXIgIDEwLjIgICAxICAgLT4gMC4yCitkcXJtbjIyNiByZW1haW5kZXJuZWFyICAxMCAgICAgMC4zIC0+IDAuMQorZHFybW4yMjcgcmVtYWluZGVybmVhciAgIDMuNiAgIDEuMyAtPiAtMC4zCisKKy0tIHNvbWUgZGlmZmVyZW5jZXMgZnJvbSByZW1haW5kZXIKK2Rxcm1uMjMxIHJlbWFpbmRlcm5lYXIgIC0wLjQgIDEuMDIwIC0+IC0wLjQwMAorZHFybW4yMzIgcmVtYWluZGVybmVhciAgLTAuNTAgMS4wMjAgLT4gLTAuNTAwCitkcXJtbjIzMyByZW1haW5kZXJuZWFyICAtMC41MSAxLjAyMCAtPiAtMC41MTAKK2Rxcm1uMjM0IHJlbWFpbmRlcm5lYXIgIC0wLjUyIDEuMDIwIC0+ICAwLjUwMAorZHFybW4yMzUgcmVtYWluZGVybmVhciAgLTAuNiAgMS4wMjAgLT4gIDAuNDIwCisKKy0tIGhpZ2ggWHMKK2Rxcm1uMjQwIHJlbWFpbmRlcm5lYXIgIDFFKzIgIDEuMDAgIC0+ICAwLjAwCisKKy0tIGRxcm1uM3h4IGFyZSBmcm9tIERpYWdCaWdEZWNpbWFsCitkcXJtbjMwMSByZW1haW5kZXJuZWFyICAgMSAgICAzICAgICAtPiAgMQorZHFybW4zMDIgcmVtYWluZGVybmVhciAgIDUgICAgNSAgICAgLT4gIDAKK2Rxcm1uMzAzIHJlbWFpbmRlcm5lYXIgICAxMyAgIDEwICAgIC0+ICAzCitkcXJtbjMwNCByZW1haW5kZXJuZWFyICAgMTMgICA1MCAgICAtPiAgMTMKK2Rxcm1uMzA1IHJlbWFpbmRlcm5lYXIgICAxMyAgIDEwMCAgIC0+ICAxMworZHFybW4zMDYgcmVtYWluZGVybmVhciAgIDEzICAgMTAwMCAgLT4gIDEzCitkcXJtbjMwNyByZW1haW5kZXJuZWFyICAgLjEzICAgIDEgICAtPiAgMC4xMworZHFybW4zMDggcmVtYWluZGVybmVhciAgIDAuMTMzICAxICAgLT4gIDAuMTMzCitkcXJtbjMwOSByZW1haW5kZXJuZWFyICAgMC4xMDMzIDEgICAtPiAgMC4xMDMzCitkcXJtbjMxMCByZW1haW5kZXJuZWFyICAgMS4wMzMgIDEgICAtPiAgMC4wMzMKK2Rxcm1uMzExIHJlbWFpbmRlcm5lYXIgICAxMC4zMyAgMSAgIC0+ICAwLjMzCitkcXJtbjMxMiByZW1haW5kZXJuZWFyICAgMTAuMzMgMTAgICAtPiAgMC4zMworZHFybW4zMTMgcmVtYWluZGVybmVhciAgIDEwMy4zICAxICAgLT4gIDAuMworZHFybW4zMTQgcmVtYWluZGVybmVhciAgIDEzMyAgIDEwICAgLT4gIDMKK2Rxcm1uMzE1IHJlbWFpbmRlcm5lYXIgICAxMDMzICAxMCAgIC0+ICAzCitkcXJtbjMxNiByZW1haW5kZXJuZWFyICAgMTAzMyAgNTAgICAtPiAtMTcKK2Rxcm1uMzE3IHJlbWFpbmRlcm5lYXIgICAxMDEuMCAgMyAgIC0+IC0xLjAKK2Rxcm1uMzE4IHJlbWFpbmRlcm5lYXIgICAxMDIuMCAgMyAgIC0+ICAwLjAKK2Rxcm1uMzE5IHJlbWFpbmRlcm5lYXIgICAxMDMuMCAgMyAgIC0+ICAxLjAKK2Rxcm1uMzIwIHJlbWFpbmRlcm5lYXIgICAyLjQwICAgMSAgIC0+ICAwLjQwCitkcXJtbjMyMSByZW1haW5kZXJuZWFyICAgMi40MDAgIDEgICAtPiAgMC40MDAKK2Rxcm1uMzIyIHJlbWFpbmRlcm5lYXIgICAyLjQgICAgMSAgIC0+ICAwLjQKK2Rxcm1uMzIzIHJlbWFpbmRlcm5lYXIgICAyLjQgICAgMiAgIC0+ICAwLjQKK2Rxcm1uMzI0IHJlbWFpbmRlcm5lYXIgICAyLjQwMCAgMiAgIC0+ICAwLjQwMAorZHFybW4zMjUgcmVtYWluZGVybmVhciAgIDEgICAwLjMgICAgLT4gIDAuMQorZHFybW4zMjYgcmVtYWluZGVybmVhciAgIDEgICAwLjMwICAgLT4gIDAuMTAKK2Rxcm1uMzI3IHJlbWFpbmRlcm5lYXIgICAxICAgMC4zMDAgIC0+ICAwLjEwMAorZHFybW4zMjggcmVtYWluZGVybmVhciAgIDEgICAwLjMwMDAgLT4gIDAuMTAwMAorZHFybW4zMjkgcmVtYWluZGVybmVhciAgIDEuMCAgICAwLjMgLT4gIDAuMQorZHFybW4zMzAgcmVtYWluZGVybmVhciAgIDEuMDAgICAwLjMgLT4gIDAuMTAKK2Rxcm1uMzMxIHJlbWFpbmRlcm5lYXIgICAxLjAwMCAgMC4zIC0+ICAwLjEwMAorZHFybW4zMzIgcmVtYWluZGVybmVhciAgIDEuMDAwMCAwLjMgLT4gIDAuMTAwMAorZHFybW4zMzMgcmVtYWluZGVybmVhciAgIDAuNSAgMiAgICAgLT4gIDAuNQorZHFybW4zMzQgcmVtYWluZGVybmVhciAgIDAuNSAgMi4xICAgLT4gIDAuNQorZHFybW4zMzUgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK2Rxcm1uMzM2IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMDAxIC0+ICAwLjUwMAorZHFybW4zMzcgcmVtYWluZGVybmVhciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK2Rxcm1uMzM4IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitkcXJtbjMzOSByZW1haW5kZXJuZWFyICAgMC41MCAyLjAwMSAtPiAgMC41MDAKKworZHFybW4zNDAgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMSAgICAtPiAgLTFFLTcKK2Rxcm1uMzQxIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAxICAgIC0+ICAtMUUtOAorZHFybW4zNDIgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDAxICAgIC0+ICAtMUUtOQorZHFybW4zNDMgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNTAwMDAwMDAwMSAgICAtPiAgLTFFLTEwCitkcXJtbjM0NCByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDAwMSAgICAtPiAgLTFFLTExCitkcXJtbjM0NSByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5ICAgIC0+ICAxRS03CitkcXJtbjM0NiByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OSAgICAtPiAgMUUtOAorZHFybW4zNDcgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTk5ICAgIC0+ICAxRS05CitkcXJtbjM0OCByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTk5ICAgIC0+ICAxRS0xMAorZHFybW4zNDkgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTk5OTkgICAgLT4gIDFFLTExCitkcXJtbjM1MCByZW1haW5kZXJuZWFyICAgMC41ICAgMC40OTk5OTk5OTk5OTkgICAgLT4gIDFFLTEyCisKK2Rxcm1uMzUxIHJlbWFpbmRlcm5lYXIgICAwLjAzICA3ICAtPiAgMC4wMworZHFybW4zNTIgcmVtYWluZGVybmVhciAgIDUgICAyICAgIC0+ICAxCitkcXJtbjM1MyByZW1haW5kZXJuZWFyICAgNC4xICAgMiAgICAtPiAgMC4xCitkcXJtbjM1NCByZW1haW5kZXJuZWFyICAgNC4wMSAgIDIgICAgLT4gIDAuMDEKK2Rxcm1uMzU1IHJlbWFpbmRlcm5lYXIgICA0LjAwMSAgIDIgICAgLT4gIDAuMDAxCitkcXJtbjM1NiByZW1haW5kZXJuZWFyICAgNC4wMDAxICAgMiAgICAtPiAgMC4wMDAxCitkcXJtbjM1NyByZW1haW5kZXJuZWFyICAgNC4wMDAwMSAgIDIgICAgLT4gIDAuMDAwMDEKK2Rxcm1uMzU4IHJlbWFpbmRlcm5lYXIgICA0LjAwMDAwMSAgIDIgICAgLT4gIDAuMDAwMDAxCitkcXJtbjM1OSByZW1haW5kZXJuZWFyICAgNC4wMDAwMDAxICAgMiAgICAtPiAgMUUtNworCitkcXJtbjM2MCByZW1haW5kZXJuZWFyICAgMS4yICAgMC43MzQ1IC0+IC0wLjI2OTAKK2Rxcm1uMzYxIHJlbWFpbmRlcm5lYXIgICAwLjggICAxMiAgICAgLT4gIDAuOAorZHFybW4zNjIgcmVtYWluZGVybmVhciAgIDAuOCAgIDAuMiAgICAtPiAgMC4wCitkcXJtbjM2MyByZW1haW5kZXJuZWFyICAgMC44ICAgMC4zICAgIC0+IC0wLjEKK2Rxcm1uMzY0IHJlbWFpbmRlcm5lYXIgICAwLjgwMCAgIDEyICAgLT4gIDAuODAwCitkcXJtbjM2NSByZW1haW5kZXJuZWFyICAgMC44MDAgICAxLjcgIC0+ICAwLjgwMAorZHFybW4zNjYgcmVtYWluZGVybmVhciAgIDIuNDAwICAgMiAgICAtPiAgMC40MDAKKworLS0gcm91bmQgdG8gZXZlbgorZHFybW4zNzEgcmVtYWluZGVybmVhciAgIDEyMSAgICAgMiAgICAtPiAgMQorZHFybW4zNzIgcmVtYWluZGVybmVhciAgIDEyMiAgICAgMiAgICAtPiAgMAorZHFybW4zNzMgcmVtYWluZGVybmVhciAgIDEyMyAgICAgMiAgICAtPiAtMQorZHFybW4zNzQgcmVtYWluZGVybmVhciAgIDEyNCAgICAgMiAgICAtPiAgMAorZHFybW4zNzUgcmVtYWluZGVybmVhciAgIDEyNSAgICAgMiAgICAtPiAgMQorZHFybW4zNzYgcmVtYWluZGVybmVhciAgIDEyNiAgICAgMiAgICAtPiAgMAorZHFybW4zNzcgcmVtYWluZGVybmVhciAgIDEyNyAgICAgMiAgICAtPiAtMQorCitkcXJtbjM4MSByZW1haW5kZXJuZWFyIDEyMzQ1ICAxICAgICAgICAgLT4gIDAKK2Rxcm1uMzgyIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDAwMSAgICAtPiAtMC4yMzQ0CitkcXJtbjM4MyByZW1haW5kZXJuZWFyIDEyMzQ1ICAxLjAwMSAgICAgLT4gLTAuMzMzCitkcXJtbjM4NCByZW1haW5kZXJuZWFyIDEyMzQ1ICAxLjAxICAgICAgLT4gLTAuMjMKK2Rxcm1uMzg1IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMSAgICAgICAtPiAtMC4zCitkcXJtbjM4NiByZW1haW5kZXJuZWFyIDEyMzU1ICA0ICAgICAgICAgLT4gLTEKK2Rxcm1uMzg3IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQgICAgICAgICAtPiAgMQorZHFybW4zODggcmVtYWluZGVybmVhciAxMjM1NSAgNC4wMDAxICAgIC0+IC0xLjMwODkKK2Rxcm1uMzg5IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuMDAwMSAgICAtPiAgMC42OTE0CitkcXJtbjM5MCByZW1haW5kZXJuZWFyIDEyMzQ1ICA0LjkgICAgICAgLT4gIDEuOQorZHFybW4zOTEgcmVtYWluZGVybmVhciAxMjM0NSAgNC45OSAgICAgIC0+IC0wLjI2CitkcXJtbjM5MiByZW1haW5kZXJuZWFyIDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDIuNDY5CitkcXJtbjM5MyByZW1haW5kZXJuZWFyIDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDAuMjQ2OQorZHFybW4zOTQgcmVtYWluZGVybmVhciAxMjM0NSAgNSAgICAgICAgIC0+ICAwCitkcXJtbjM5NSByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAwMDEgICAgLT4gLTAuMjQ2OQorZHFybW4zOTYgcmVtYWluZGVybmVhciAxMjM0NSAgNS4wMDEgICAgIC0+IC0yLjQ2OQorZHFybW4zOTcgcmVtYWluZGVybmVhciAxMjM0NSAgNS4wMSAgICAgIC0+ICAwLjM2CitkcXJtbjM5OCByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjEgICAgICAgLT4gLTIuMQorCistLSB0aGUgbmFzdHkgZGl2aXNpb24tYnktMSBjYXNlcworZHFybW40MDEgcmVtYWluZGVybmVhciAgIDAuNCAgICAgICAgIDEgICAtPiAgMC40CitkcXJtbjQwMiByZW1haW5kZXJuZWFyICAgMC40NSAgICAgICAgMSAgIC0+ICAwLjQ1CitkcXJtbjQwMyByZW1haW5kZXJuZWFyICAgMC40NTUgICAgICAgMSAgIC0+ICAwLjQ1NQorZHFybW40MDQgcmVtYWluZGVybmVhciAgIDAuNDU1NSAgICAgIDEgICAtPiAgMC40NTU1CitkcXJtbjQwNSByZW1haW5kZXJuZWFyICAgMC40NTU1NSAgICAgMSAgIC0+ICAwLjQ1NTU1CitkcXJtbjQwNiByZW1haW5kZXJuZWFyICAgMC40NTU1NTUgICAgMSAgIC0+ICAwLjQ1NTU1NQorZHFybW40MDcgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NSAgIDEgICAtPiAgMC40NTU1NTU1CitkcXJtbjQwOCByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NSAgMSAgIC0+ICAwLjQ1NTU1NTU1CitkcXJtbjQwOSByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTU1NTU1NQorLS0gd2l0aCBzcGlsbC4uLiBbNDEyIGV4ZXJjaXNlcyBzdGlja3RhYiBsb29wXQorZHFybW40MTEgcmVtYWluZGVybmVhciAgIDAuNSAgICAgICAgIDEgICAtPiAgMC41CitkcXJtbjQxMiByZW1haW5kZXJuZWFyICAgMC41NSAgICAgICAgMSAgIC0+IC0wLjQ1CitkcXJtbjQxMyByZW1haW5kZXJuZWFyICAgMC41NTUgICAgICAgMSAgIC0+IC0wLjQ0NQorZHFybW40MTQgcmVtYWluZGVybmVhciAgIDAuNTU1NSAgICAgIDEgICAtPiAtMC40NDQ1CitkcXJtbjQxNSByZW1haW5kZXJuZWFyICAgMC41NTU1NSAgICAgMSAgIC0+IC0wLjQ0NDQ1CitkcXJtbjQxNiByZW1haW5kZXJuZWFyICAgMC41NTU1NTUgICAgMSAgIC0+IC0wLjQ0NDQ0NQorZHFybW40MTcgcmVtYWluZGVybmVhciAgIDAuNTU1NTU1NSAgIDEgICAtPiAtMC40NDQ0NDQ1CitkcXJtbjQxOCByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1NSAgMSAgIC0+IC0wLjQ0NDQ0NDQ1CitkcXJtbjQxOSByZW1haW5kZXJuZWFyICAgMC41NTU1NTU1NTUgMSAgIC0+IC0wLjQ0NDQ0NDQ0NQorCistLSBmb2xkZG93bnMKK2Rxcm1uNDIxIHJlbWFpbmRlcm5lYXIgICAxRSs2MTQ0ICAgICAgICAxICAtPiAgIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitkcXJtbjQyMiByZW1haW5kZXJuZWFyICAgMUUrNjE0NCAgMUUrNjE0MyAgLT4gICAwRSs2MTExIENsYW1wZWQKK2Rxcm1uNDIzIHJlbWFpbmRlcm5lYXIgICAxRSs2MTQ0ICAyRSs2MTQzICAtPiAgIDBFKzYxMTEgQ2xhbXBlZAorZHFybW40MjQgcmVtYWluZGVybmVhciAgIDFFKzYxNDQgIDNFKzYxNDMgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCitkcXJtbjQyNSByZW1haW5kZXJuZWFyICAgMUUrNjE0NCAgNEUrNjE0MyAgLT4gICAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKK2Rxcm1uNDI2IHJlbWFpbmRlcm5lYXIgICAxRSs2MTQ0ICA1RSs2MTQzICAtPiAgIDBFKzYxMTEgQ2xhbXBlZAorZHFybW40MjcgcmVtYWluZGVybmVhciAgIDFFKzYxNDQgIDZFKzYxNDMgIC0+ICAtMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCitkcXJtbjQyOCByZW1haW5kZXJuZWFyICAgMUUrNjE0NCAgN0UrNjE0MyAgLT4gICAzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzIENsYW1wZWQKK2Rxcm1uNDI5IHJlbWFpbmRlcm5lYXIgICAxRSs2MTQ0ICA4RSs2MTQzICAtPiAgIDIuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDMgQ2xhbXBlZAorZHFybW40MzAgcmVtYWluZGVybmVhciAgIDFFKzYxNDQgIDlFKzYxNDMgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MyBDbGFtcGVkCistLSB0aW5pZXMKK2Rxcm1uNDMxIHJlbWFpbmRlcm5lYXIgICAxRS02MTc1ICAxRS02MTc2ICAtPiAgIDBFLTYxNzYKK2Rxcm1uNDMyIHJlbWFpbmRlcm5lYXIgICAxRS02MTc1ICAyRS02MTc2ICAtPiAgIDBFLTYxNzYKK2Rxcm1uNDMzIHJlbWFpbmRlcm5lYXIgICAxRS02MTc1ICAzRS02MTc2ICAtPiAgIDFFLTYxNzYgU3Vibm9ybWFsCitkcXJtbjQzNCByZW1haW5kZXJuZWFyICAgMUUtNjE3NSAgNEUtNjE3NiAgLT4gICAyRS02MTc2IFN1Ym5vcm1hbAorZHFybW40MzUgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgIDVFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFybW40MzYgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgIDZFLTYxNzYgIC0+ICAtMkUtNjE3NiBTdWJub3JtYWwKK2Rxcm1uNDM3IHJlbWFpbmRlcm5lYXIgICAxRS02MTc1ICA3RS02MTc2ICAtPiAgIDNFLTYxNzYgU3Vibm9ybWFsCitkcXJtbjQzOCByZW1haW5kZXJuZWFyICAgMUUtNjE3NSAgOEUtNjE3NiAgLT4gICAyRS02MTc2IFN1Ym5vcm1hbAorZHFybW40MzkgcmVtYWluZGVybmVhciAgIDFFLTYxNzUgIDlFLTYxNzYgIC0+ICAgMUUtNjE3NiBTdWJub3JtYWwKK2Rxcm1uNDQwIHJlbWFpbmRlcm5lYXIgICAxRS02MTc1IDEwRS02MTc2ICAtPiAgIDBFLTYxNzYKK2Rxcm1uNDQxIHJlbWFpbmRlcm5lYXIgICAxRS02MTc1IDExRS02MTc2ICAtPiAgLTFFLTYxNzYgU3Vibm9ybWFsCitkcXJtbjQ0MiByZW1haW5kZXJuZWFyIDEwMEUtNjE3NSAxMUUtNjE3NiAgLT4gIC0xRS02MTc2IFN1Ym5vcm1hbAorZHFybW40NDMgcmVtYWluZGVybmVhciAxMDBFLTYxNzUgMjBFLTYxNzYgIC0+ICAgMEUtNjE3NgorZHFybW40NDQgcmVtYWluZGVybmVhciAxMDBFLTYxNzUgMjFFLTYxNzYgIC0+ICAtOEUtNjE3NiBTdWJub3JtYWwKK2Rxcm1uNDQ1IHJlbWFpbmRlcm5lYXIgMTAwRS02MTc1IDMwRS02MTc2ICAtPiAxLjBFLTYxNzUgU3Vibm9ybWFsCisKKy0tIHplcm8gc2lnbnMKK2Rxcm1uNjUwIHJlbWFpbmRlcm5lYXIgIDEgIDEgLT4gIDAKK2Rxcm1uNjUxIHJlbWFpbmRlcm5lYXIgLTEgIDEgLT4gLTAKK2Rxcm1uNjUyIHJlbWFpbmRlcm5lYXIgIDEgLTEgLT4gIDAKK2Rxcm1uNjUzIHJlbWFpbmRlcm5lYXIgLTEgLTEgLT4gLTAKK2Rxcm1uNjU0IHJlbWFpbmRlcm5lYXIgIDAgIDEgLT4gIDAKK2Rxcm1uNjU1IHJlbWFpbmRlcm5lYXIgLTAgIDEgLT4gLTAKK2Rxcm1uNjU2IHJlbWFpbmRlcm5lYXIgIDAgLTEgLT4gIDAKK2Rxcm1uNjU3IHJlbWFpbmRlcm5lYXIgLTAgLTEgLT4gLTAKK2Rxcm1uNjU4IHJlbWFpbmRlcm5lYXIgIDAuMDAgIDEgIC0+ICAwLjAwCitkcXJtbjY1OSByZW1haW5kZXJuZWFyIC0wLjAwICAxICAtPiAtMC4wMAorCistLSBTcGVjaWFscworZHFybW42ODAgcmVtYWluZGVybmVhciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODEgcmVtYWluZGVybmVhciAgSW5mICAtMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODIgcmVtYWluZGVybmVhciAgSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODMgcmVtYWluZGVybmVhciAgSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODQgcmVtYWluZGVybmVhciAgSW5mICAtMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODUgcmVtYWluZGVybmVhciAgSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODYgcmVtYWluZGVybmVhciAgSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODcgcmVtYWluZGVybmVhciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW42ODggcmVtYWluZGVybmVhciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK2Rxcm1uNjg5IHJlbWFpbmRlcm5lYXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNjkxIHJlbWFpbmRlcm5lYXIgLTEgICAgIEluZiAgIC0+IC0xCitkcXJtbjY5MiByZW1haW5kZXJuZWFyICAwICAgICBJbmYgICAtPiAgMAorZHFybW42OTMgcmVtYWluZGVybmVhciAtMCAgICAgSW5mICAgLT4gLTAKK2Rxcm1uNjk0IHJlbWFpbmRlcm5lYXIgIDEgICAgIEluZiAgIC0+ICAxCitkcXJtbjY5NSByZW1haW5kZXJuZWFyICAxMDAwICBJbmYgICAtPiAgMTAwMAorZHFybW42OTYgcmVtYWluZGVybmVhciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXJtbjcwMCByZW1haW5kZXJuZWFyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwMSByZW1haW5kZXJuZWFyIC1JbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwMiByZW1haW5kZXJuZWFyIC1JbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwMyByZW1haW5kZXJuZWFyIC1JbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwNCByZW1haW5kZXJuZWFyIC1JbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwNSByZW1haW5kZXJuZWFyIC1JbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwNiByZW1haW5kZXJuZWFyIC1JbmYgICAxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwNyByZW1haW5kZXJuZWFyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwOCByZW1haW5kZXJuZWFyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjcwOSByZW1haW5kZXJuZWFyIC0xMDAwICBJbmYgICAtPiAtMTAwMAorZHFybW43MTAgcmVtYWluZGVybmVhciAtMSAgICAtSW5mICAgLT4gLTEKK2Rxcm1uNzExIHJlbWFpbmRlcm5lYXIgLTAgICAgLUluZiAgIC0+IC0wCitkcXJtbjcxMiByZW1haW5kZXJuZWFyICAwICAgIC1JbmYgICAtPiAgMAorZHFybW43MTMgcmVtYWluZGVybmVhciAgMSAgICAtSW5mICAgLT4gIDEKK2Rxcm1uNzE0IHJlbWFpbmRlcm5lYXIgIDEwMDAgLUluZiAgIC0+ICAxMDAwCitkcXJtbjcxNSByZW1haW5kZXJuZWFyICBJbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK2Rxcm1uNzIxIHJlbWFpbmRlcm5lYXIgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2Rxcm1uNzIyIHJlbWFpbmRlcm5lYXIgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2Rxcm1uNzIzIHJlbWFpbmRlcm5lYXIgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2Rxcm1uNzI0IHJlbWFpbmRlcm5lYXIgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2Rxcm1uNzI1IHJlbWFpbmRlcm5lYXIgLU5hTiAgMCAgICAgIC0+IC1OYU4KK2Rxcm1uNzI2IHJlbWFpbmRlcm5lYXIgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2Rxcm1uNzI3IHJlbWFpbmRlcm5lYXIgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2Rxcm1uNzI4IHJlbWFpbmRlcm5lYXIgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2Rxcm1uNzI5IHJlbWFpbmRlcm5lYXIgIE5hTiAtTmFOICAgIC0+ICBOYU4KK2Rxcm1uNzMwIHJlbWFpbmRlcm5lYXIgLUluZiAgTmFOICAgIC0+ICBOYU4KK2Rxcm1uNzMxIHJlbWFpbmRlcm5lYXIgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2Rxcm1uNzMyIHJlbWFpbmRlcm5lYXIgLTEgICAgTmFOICAgIC0+ICBOYU4KK2Rxcm1uNzMzIHJlbWFpbmRlcm5lYXIgLTAgICAtTmFOICAgIC0+IC1OYU4KK2Rxcm1uNzM0IHJlbWFpbmRlcm5lYXIgIDAgICAgTmFOICAgIC0+ICBOYU4KK2Rxcm1uNzM1IHJlbWFpbmRlcm5lYXIgIDEgICAtTmFOICAgIC0+IC1OYU4KK2Rxcm1uNzM2IHJlbWFpbmRlcm5lYXIgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2Rxcm1uNzM3IHJlbWFpbmRlcm5lYXIgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFybW43NDEgcmVtYWluZGVybmVhciAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzQyIHJlbWFpbmRlcm5lYXIgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc0MyByZW1haW5kZXJuZWFyIC1zTmFOIC0xICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NDQgcmVtYWluZGVybmVhciAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzQ1IHJlbWFpbmRlcm5lYXIgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc0NiByZW1haW5kZXJuZWFyICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NDcgcmVtYWluZGVybmVhciAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzQ5IHJlbWFpbmRlcm5lYXIgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc1MCByZW1haW5kZXJuZWFyICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NTEgcmVtYWluZGVybmVhciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzUyIHJlbWFpbmRlcm5lYXIgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc1MyByZW1haW5kZXJuZWFyIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NTQgcmVtYWluZGVybmVhciAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzU1IHJlbWFpbmRlcm5lYXIgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc1NiByZW1haW5kZXJuZWFyICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NTcgcmVtYWluZGVybmVhciAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm1uNzU4IHJlbWFpbmRlcm5lYXIgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJtbjc1OSByZW1haW5kZXJuZWFyICBJbmYgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdpbmcgTmFOcworZHFybW43NjAgcmVtYWluZGVybmVhciAgTmFOMSAgIE5hTjcgICAtPiAgTmFOMQorZHFybW43NjEgcmVtYWluZGVybmVhciBzTmFOMiAgIE5hTjggICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NjIgcmVtYWluZGVybmVhciAgTmFOMyAgc05hTjkgICAtPiAgTmFOOSBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NjMgcmVtYWluZGVybmVhciBzTmFONCAgc05hTjEwICAtPiAgTmFONCBJbnZhbGlkX29wZXJhdGlvbgorZHFybW43NjQgcmVtYWluZGVybmVhciAgICAxNSAgIE5hTjExICAtPiAgTmFOMTEKK2Rxcm1uNzY1IHJlbWFpbmRlcm5lYXIgIE5hTjYgICBOYU4xMiAgLT4gIE5hTjYKK2Rxcm1uNzY2IHJlbWFpbmRlcm5lYXIgIEluZiAgICBOYU4xMyAgLT4gIE5hTjEzCitkcXJtbjc2NyByZW1haW5kZXJuZWFyICBOYU4xNCAgLUluZiAgIC0+ICBOYU4xNAorZHFybW43NjggcmVtYWluZGVybmVhciAgICAwICAgIE5hTjE1ICAtPiAgTmFOMTUKK2Rxcm1uNzY5IHJlbWFpbmRlcm5lYXIgIE5hTjE2ICAgLTAgICAgLT4gIE5hTjE2CisKKy0tIGVkZ2UgY2FzZXMgb2YgaW1wb3NzaWJsZQorZHFybW43NzAgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1MDAwMDAwMDAwMDAwMDAwMDAwNjc4OTAxMjM0NTYgIDEwICAgIC0+IC00CitkcXJtbjc3MSAgcmVtYWluZGVybmVhciAgMTIzNDUwMDAwMDAwMDAwMDAwMDAwMDA2Nzg5MDEyMzQ1NiAgIDEgICAgLT4gIDAKK2Rxcm1uNzcyICByZW1haW5kZXJuZWFyICAxMjM0NTAwMDAwMDAwMDAwMDAwMDAwMDY3ODkwMTIzNDU2ICAgMC4xICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rxcm1uNzczICByZW1haW5kZXJuZWFyICAxMjM0NTAwMDAwMDAwMDAwMDAwMDAwMDY3ODkwMTIzNDU2ICAgMC4wMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gbG9uZyBvcGVyYW5kIGNoZWNrcworZHFybW44MDEgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorZHFybW44MDIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorZHFybW44MDMgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwICAxMCAgLT4gMAorZHFybW44MDQgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorZHFybW44MDUgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwICAxMCAgLT4gMAorZHFybW44MDYgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorZHFybW44MDcgcmVtYWluZGVybmVhciAxMjM0NTY3ODkxICAxMCAgLT4gMQorZHFybW44MDggcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZHFybW44MDkgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorZHFybW44MTAgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZHFybW44MTEgcmVtYWluZGVybmVhciAxMjM0NTY3ODk2ICAxMCAgLT4gLTQKK2Rxcm1uODEyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworZHFybW44MjEgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorZHFybW44MjIgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorZHFybW44MjMgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwICAxMCAgLT4gMAorZHFybW44MjQgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorZHFybW44MjUgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwICAxMCAgLT4gMAorZHFybW44MjYgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorZHFybW44MjcgcmVtYWluZGVybmVhciAxMjM0NTY3ODkxICAxMCAgLT4gMQorZHFybW44MjggcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorZHFybW44MjkgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorZHFybW44MzAgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorZHFybW44MzEgcmVtYWluZGVybmVhciAxMjM0NTY3ODk2ICAxMCAgLT4gLTQKK2Rxcm1uODMyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBkaXZpZGVpbnQKK2Rxcm1uODQwIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMC4wICAgMSAgLT4gIDAuMAorZHFybW44NDEgcmVtYWluZGVybmVhciAgMTAwMDAwMDAwLjQgICAxICAtPiAgMC40CitkcXJtbjg0MiByZW1haW5kZXJuZWFyICAxMDAwMDAwMDAuNSAgIDEgIC0+ICAwLjUKK2Rxcm1uODQzIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMC45ICAgMSAgLT4gLTAuMQorZHFybW44NDQgcmVtYWluZGVybmVhciAgMTAwMDAwMDAwLjk5OSAxICAtPiAtMC4wMDEKK2Rxcm1uODUwIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAwMyAgICAgNSAgLT4gLTIKK2Rxcm1uODUxIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDAzICAgICAgNSAgLT4gLTIKK2Rxcm1uODUyIHJlbWFpbmRlcm5lYXIgIDEwMDAwMDMgICAgICAgNSAgLT4gLTIKK2Rxcm1uODUzIHJlbWFpbmRlcm5lYXIgIDEwMDAwMyAgICAgICAgNSAgLT4gLTIKK2Rxcm1uODU0IHJlbWFpbmRlcm5lYXIgIDEwMDAzICAgICAgICAgNSAgLT4gLTIKK2Rxcm1uODU1IHJlbWFpbmRlcm5lYXIgIDEwMDMgICAgICAgICAgNSAgLT4gLTIKK2Rxcm1uODU2IHJlbWFpbmRlcm5lYXIgIDEwMyAgICAgICAgICAgNSAgLT4gLTIKK2Rxcm1uODU3IHJlbWFpbmRlcm5lYXIgIDEzICAgICAgICAgICAgNSAgLT4gLTIKK2Rxcm1uODU4IHJlbWFpbmRlcm5lYXIgIDEgICAgICAgICAgICAgNSAgLT4gIDEKKworLS0gVmxhZGltaXIncyBjYXNlcyAgICAgICAgIDEyMzQ1Njc4OTAxMjM0NTYKK2Rxcm1uODYwIHJlbWFpbmRlcm5lYXIgMTIzLjBlMSAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJtbjg2MSByZW1haW5kZXJuZWFyIDEyMzAgICAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZHFybW44NjIgcmVtYWluZGVybmVhciAxMi4zZTIgIDEwMDAwMDAwMDAwMDAwMDAgIC0+IDEyMzAKK2Rxcm1uODYzIHJlbWFpbmRlcm5lYXIgMS4yM2UzICAxMDAwMDAwMDAwMDAwMDAwICAtPiAxMjMwCitkcXJtbjg2NCByZW1haW5kZXJuZWFyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMCAgLT4gMTIzMAorZHFybW44NzAgcmVtYWluZGVybmVhciAxMjNlMSAgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODcxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgIDEwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg3MiByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgMTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44NzMgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAxMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODc0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgIDEwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg3NSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgMTAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44NzYgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAxMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODc3IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgIDEwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg3OCByZW1haW5kZXJuZWFyIDEyMzAgICAgICAgICAgICAxMDAwMDAwMDAgLT4gMTIzMAorZHFybW44NzkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDEwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODgwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgMTAwMDAwMCAtPiAxMjMwCitkcXJtbjg4MSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAxMDAwMDAgLT4gMTIzMAorZHFybW44ODIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDEwMDAwIC0+IDEyMzAKK2Rxcm1uODgzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgMTAwMCAtPiAgMjMwCitkcXJtbjg4NCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAxMDAgLT4gICAzMAorZHFybW44ODUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDEwIC0+ICAgIDAKK2Rxcm1uODg2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMSAtPiAgICAwCisKK2Rxcm1uODkwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgMjAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg5MSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAyMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44OTIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgIDIwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODkzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgMjAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg5NCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAyMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW44OTUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgIDIwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uODk2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgMjAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjg5NyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAyMDAwMDAwMDAgLT4gMTIzMAorZHFybW44OTkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDIwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTAwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgMjAwMDAwMCAtPiAxMjMwCitkcXJtbjkwMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAyMDAwMDAgLT4gMTIzMAorZHFybW45MDIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDIwMDAwIC0+IDEyMzAKK2Rxcm1uOTAzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgMjAwMCAtPiAtNzcwCitkcXJtbjkwNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICAyMDAgLT4gICAzMAorZHFybW45MDUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDIwIC0+ICAtMTAKK2Rxcm1uOTA2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMiAtPiAgICAwCisKK2Rxcm1uOTEwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgNTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkxMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICA1MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MTIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgIDUwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTEzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgNTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkxNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICA1MDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MTUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgIDUwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTE2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgNTAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkxNyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICA1MDAwMDAwMDAgLT4gMTIzMAorZHFybW45MTkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDUwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTIwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgNTAwMDAwMCAtPiAxMjMwCitkcXJtbjkyMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICA1MDAwMDAgLT4gMTIzMAorZHFybW45MjIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDUwMDAwIC0+IDEyMzAKK2Rxcm1uOTIzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgNTAwMCAtPiAxMjMwCitkcXJtbjkyNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICA1MDAgLT4gIDIzMAorZHFybW45MjUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDUwIC0+ICAtMjAKK2Rxcm1uOTI2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgNSAtPiAgICAwCisKK2Rxcm1uOTMwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgOTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkzMSByZW1haW5kZXJuZWFyIDEyM2UxICAgICA5MDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MzIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgIDkwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTMzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgOTAwMDAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkzNCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICA5MDAwMDAwMDAwMDAgLT4gMTIzMAorZHFybW45MzUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgIDkwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTM2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgOTAwMDAwMDAwMCAtPiAxMjMwCitkcXJtbjkzNyByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICA5MDAwMDAwMDAgLT4gMTIzMAorZHFybW45MzkgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgIDkwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTQwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgOTAwMDAwMCAtPiAxMjMwCitkcXJtbjk0MSByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICA5MDAwMDAgLT4gMTIzMAorZHFybW45NDIgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgIDkwMDAwIC0+IDEyMzAKK2Rxcm1uOTQzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgOTAwMCAtPiAxMjMwCitkcXJtbjk0NCByZW1haW5kZXJuZWFyIDEyM2UxICAgICAgICAgICAgICAgICA5MDAgLT4gIDMzMAorZHFybW45NDUgcmVtYWluZGVybmVhciAxMjNlMSAgICAgICAgICAgICAgICAgIDkwIC0+ICAtMzAKK2Rxcm1uOTQ2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICAgICAgICAgICAgICAgICAgOSAtPiAgIC0zCisKK2Rxcm1uOTUwIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK2Rxcm1uOTYxIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAyOTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTYyIHJlbWFpbmRlcm5lYXIgMTIzZTEgICAzOTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTYzIHJlbWFpbmRlcm5lYXIgMTIzZTEgICA0OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTY0IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA1OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTY1IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA2OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTY2IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA3OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTY3IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA4OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTY4IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK2Rxcm1uOTY5IHJlbWFpbmRlcm5lYXIgMTIzZTEgICA5ODc2NTQzMjEwOTg3NjU0IC0+IDEyMzAKKworZHFybW45ODAgcmVtYWluZGVybmVhciAxMjNlMSAxMDAwRTI5OSAtPiAxLjIzRSszICAtLSAxMjNFKzEgaW50ZXJuYWxseQorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIFtmcm9tIGRpdmlkZV0KK2Rxcm1uMTA1MSByZW1haW5kZXJuZWFyICAxZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rxcm1uMTA1MiByZW1haW5kZXJuZWFyICAxZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rxcm1uMTA1MyByZW1haW5kZXJuZWFyIC0xZSsyNzcgIDFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rxcm1uMTA1NCByZW1haW5kZXJuZWFyIC0xZSsyNzcgLTFlLTMxMSAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK2Rxcm1uMTA1NSByZW1haW5kZXJuZWFyICAxZS0yNzcgIDFlKzMxMSAtPiAgMUUtMjc3CitkcXJtbjEwNTYgcmVtYWluZGVybmVhciAgMWUtMjc3IC0xZSszMTEgLT4gIDFFLTI3NworZHFybW4xMDU3IHJlbWFpbmRlcm5lYXIgLTFlLTI3NyAgMWUrMzExIC0+IC0xRS0yNzcKK2Rxcm1uMTA1OCByZW1haW5kZXJuZWFyIC0xZS0yNzcgLTFlKzMxMSAtPiAtMUUtMjc3CisKKy0tIEd5dXJpcyBleGFtcGxlCitkcXJtbjEwNzAgcmVtYWluZGVyIDguMzM2ODA0NDE4MDk0MDQwOTg5NjMwMDA2ODE5ODgxNzA5RS02MTQzIDguMzM2ODA0NDE4MDk0MDQwOTg5NjMwMDA2ODE5ODg5MDAwRS02MTQzIC0+IDguMzM2ODA0NDE4MDk0MDQwOTg5NjMwMDA2ODE5ODgxNzA5RS02MTQzCisKKy0tIGRlc3RydWN0aXZlIHN1YnRyYWN0CitkcXJtbjExMDEgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgLTAuMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMzCitkcXJtbjExMDIgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgIC0wLjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjIyCitkcXJtbjExMDMgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgICAtMC40NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMTExCitkcXJtbjExMDQgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyNTUgIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgLTEuMzA4NjQxOTcyNTMwODY0MTk3MjUzMDg2NDE5NzI1MzE0CitkcXJtbjExMDUgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIDQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgIDEuNjkxMzU4MDI3NDY5MTM1ODAyNzQ2OTEzNTgwMjc0NjkyCitkcXJtbjExMDYgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAgICAtMS4zMDg2NDIxOTc1MzA4NjQyMTk3NTMwODY0MjE5NzQ4CitkcXJtbjExMDcgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICA0Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAgICAxLjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3CitkcXJtbjExMDggIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIDQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ICAtPiAgLTAuNzUzMDg2NDIxOTc1MzA4NjQyMTk3NTMwODY0MjE5NzUzCitkcXJtbjExMDkgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgIDUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgLTEuMjQ2OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQ3CitkcXJtbjExMTAgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICA1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgICAxLjUzMDg2NDIxOTc1MzA4NjQyMTk3NTMwODY0MjE5NzU0CitkcXJtbjExMTEgIHJlbWFpbmRlcm5lYXIgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAtPiAgICAtMC42OTEzNTc4MDI0NjkxMzU3ODAyNDY5MTM1NzgwMjQyCisKKy0tIE51bGwgdGVzdHMKK2Rxcm1uMTAwMCByZW1haW5kZXJuZWFyIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFybW4xMDAxIHJlbWFpbmRlcm5lYXIgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSb3RhdGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFSb3RhdGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGNmOWVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVJvdGF0ZS5kZWNUZXN0CkBAIC0wLDAgKzEsMjk4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxUm90YXRlLmRlY1Rlc3QgLS0gcm90YXRlIGRlY1F1YWQgY29lZmZpY2llbnQgbGVmdCBvciByaWdodCAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrCitkcXJvdDAwMSByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgMCAgLT4gIDAKK2Rxcm90MDAyIHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAyICAtPiAgMAorZHFyb3QwMDMgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgIDIgIC0+ICAxMDAKK2Rxcm90MDA0IHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIDMzICAtPiAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFyb3QwMDUgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgMzQgIC0+ICAxCitkcXJvdDAwNiByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAtMSAgLT4gIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxcm90MDA3IHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgIC0yICAtPiAgMAorZHFyb3QwMDggcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTEgIC0+ICA0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzCitkcXJvdDAwOSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzMgLT4gIDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEKK2Rxcm90MDEwIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zNCAtPiAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFyb3QwMTEgcm90YXRlICA5OTM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTMzIC0+ICA5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ5CitkcXJvdDAxMiByb3RhdGUgIDk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzQgLT4gIDk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworLS0gcmhzIG11c3QgYmUgYW4gaW50ZWdlcgorZHFyb3QwMTUgcm90YXRlICAgICAgICAxICAgIDEuNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90MDE2IHJvdGF0ZSAgICAgICAgMSAgICAxLjAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDAxNyByb3RhdGUgICAgICAgIDEgICAgMC4xICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3QwMTggcm90YXRlICAgICAgICAxICAgIDAuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90MDE5IHJvdGF0ZSAgICAgICAgMSAgICAxRSsxICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDAyMCByb3RhdGUgICAgICAgIDEgICAgMUUrOTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3QwMjEgcm90YXRlICAgICAgICAxICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90MDIyIHJvdGF0ZSAgICAgICAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhbmQgfHJoc3wgPD0gcHJlY2lzaW9uCitkcXJvdDAyNSByb3RhdGUgICAgICAgIDEgICAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3QwMjYgcm90YXRlICAgICAgICAxICAgIC0zNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90MDI3IHJvdGF0ZSAgICAgICAgMSAgICAgMzUgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDAyOCByb3RhdGUgICAgICAgIDEgICAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmdWxsIHBhdHRlcm4KK2Rxcm90MDMwIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zNCAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFyb3QwMzEgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTMzICAtPiAyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxCitkcXJvdDAzMiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMzIgIC0+IDM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIKK2Rxcm90MDMzIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zMSAgLT4gNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMworZHFyb3QwMzQgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTMwICAtPiA1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0CitkcXJvdDAzNSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjkgIC0+IDY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDUKK2Rxcm90MDM2IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yOCAgLT4gNzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1NgorZHFyb3QwMzcgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTI3ICAtPiA4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3CitkcXJvdDAzOCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjYgIC0+IDkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2NzgKK2Rxcm90MDM5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yNSAgLT4gIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OQorZHFyb3QwNDAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTI0ICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwCitkcXJvdDA0MSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjMgIC0+IDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEKK2Rxcm90MDQyIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0yMiAgLT4gMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMgorZHFyb3QwNDMgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTIxICAtPiA0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzCitkcXJvdDA0NCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjAgIC0+IDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQKK2Rxcm90MDQ1IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xOSAgLT4gNjc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NQorZHFyb3QwNDcgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTE4ICAtPiA3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2CitkcXJvdDA0OCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTcgIC0+IDg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1NjcKK2Rxcm90MDQ5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xNiAgLT4gOTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3OAorZHFyb3QwNTAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTE1ICAtPiAgMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5CitkcXJvdDA1MSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTQgIC0+IDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAKK2Rxcm90MDUyIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xMyAgLT4gMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMQorZHFyb3QwNTMgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTEyICAtPiAzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyCitkcXJvdDA1NCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTEgIC0+IDQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMKK2Rxcm90MDU1IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xMCAgLT4gNTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFyb3QwNTYgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTkgICAtPiA2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1CitkcXJvdDA1NyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtOCAgIC0+IDc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTYKK2Rxcm90MDU4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC03ICAgLT4gODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NworZHFyb3QwNTkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTYgICAtPiA5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4CitkcXJvdDA2MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtNSAgIC0+ICAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKK2Rxcm90MDYxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC00ICAgLT4gMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MAorZHFyb3QwNjIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTMgICAtPiAyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxCitkcXJvdDA2MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMiAgIC0+IDM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIKK2Rxcm90MDY0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0xICAgLT4gNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFyb3QwNjUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTAgICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CisKK2Rxcm90MDY2IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICswICAgLT4gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFyb3QwNjcgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzEgICAtPiAyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxCitkcXJvdDA2OCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMiAgIC0+IDM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIKK2Rxcm90MDY5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszICAgLT4gNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMworZHFyb3QwNzAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzQgICAtPiA1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0CitkcXJvdDA3MSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArNSAgIC0+IDY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDUKK2Rxcm90MDcyIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs2ICAgLT4gNzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1NgorZHFyb3QwNzMgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzcgICAtPiA4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3CitkcXJvdDA3NCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArOCAgIC0+IDkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2NzgKK2Rxcm90MDc1IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs5ICAgLT4gIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OQorZHFyb3QwNzYgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzEwICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwCitkcXJvdDA3NyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTEgIC0+IDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEKK2Rxcm90MDc4IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxMiAgLT4gMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMgorZHFyb3QwNzkgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzEzICAtPiA0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzCitkcXJvdDA4MCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTQgIC0+IDU2Nzg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQKK2Rxcm90MDgxIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxNSAgLT4gNjc4OTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NQorZHFyb3QwODIgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE2ICAtPiA3ODkwMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2CitkcXJvdDA4MyByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTcgIC0+IDg5MDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1NjcKK2Rxcm90MDg0IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxOCAgLT4gOTAxMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3OAorZHFyb3QwODUgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE5ICAtPiAgMTIzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5CitkcXJvdDA4NiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjAgIC0+IDEyMzQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAKK2Rxcm90MDg3IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyMSAgLT4gMjM0NTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMQorZHFyb3QwODggcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzIyICAtPiAzNDU2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyCitkcXJvdDA4OSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjMgIC0+IDQ1Njc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMKK2Rxcm90MDkwIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyNCAgLT4gNTY3ODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFyb3QwOTEgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI1ICAtPiA2Nzg5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1CitkcXJvdDA5MiByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjYgIC0+IDc4OTAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTYKK2Rxcm90MDkzIHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyNyAgLT4gODkwMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NworZHFyb3QwOTQgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI4ICAtPiA5MDEyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4CitkcXJvdDA5NSByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjkgIC0+ICAxMjM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKK2Rxcm90MDk2IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszMCAgLT4gMTIzNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MAorZHFyb3QwOTcgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzMxICAtPiAyMzQxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxCitkcXJvdDA5OCByb3RhdGUgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMzIgIC0+IDM0MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIKK2Rxcm90MDk5IHJvdGF0ZSAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszMyAgLT4gNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFyb3QxMDAgcm90YXRlICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzM0ICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CisKKy0tIHplcm9zCitkcXJvdDI3MCByb3RhdGUgIDBFLTEwICAgICAgICAgICAgICArMjkgICAtPiAgIDBFLTEwCitkcXJvdDI3MSByb3RhdGUgIDBFLTEwICAgICAgICAgICAgICAtMjkgICAtPiAgIDBFLTEwCitkcXJvdDI3MiByb3RhdGUgIDAuMDAwICAgICAgICAgICAgICArMjkgICAtPiAgIDAuMDAwCitkcXJvdDI3MyByb3RhdGUgIDAuMDAwICAgICAgICAgICAgICAtMjkgICAtPiAgIDAuMDAwCitkcXJvdDI3NCByb3RhdGUgIDBFKzEwICAgICAgICAgICAgICArMjkgICAtPiAgIDBFKzEwCitkcXJvdDI3NSByb3RhdGUgIDBFKzEwICAgICAgICAgICAgICAtMjkgICAtPiAgIDBFKzEwCitkcXJvdDI3NiByb3RhdGUgLTBFLTEwICAgICAgICAgICAgICArMjkgICAtPiAgLTBFLTEwCitkcXJvdDI3NyByb3RhdGUgLTBFLTEwICAgICAgICAgICAgICAtMjkgICAtPiAgLTBFLTEwCitkcXJvdDI3OCByb3RhdGUgLTAuMDAwICAgICAgICAgICAgICArMjkgICAtPiAgLTAuMDAwCitkcXJvdDI3OSByb3RhdGUgLTAuMDAwICAgICAgICAgICAgICAtMjkgICAtPiAgLTAuMDAwCitkcXJvdDI4MCByb3RhdGUgLTBFKzEwICAgICAgICAgICAgICArMjkgICAtPiAgLTBFKzEwCitkcXJvdDI4MSByb3RhdGUgLTBFKzEwICAgICAgICAgICAgICAtMjkgICAtPiAgLTBFKzEwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcXJvdDE0MSByb3RhdGUgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAtMSAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxcm90MTQyIHJvdGF0ZSAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgIC0zMyAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NAorZHFyb3QxNDMgcm90YXRlICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgIDEgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJvdDE0NCByb3RhdGUgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAgMzMgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQKK2Rxcm90MTQ1IHJvdGF0ZSAgMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjExMAorZHFyb3QxNDYgcm90YXRlICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzIC0+IDEuMEUtNjE0MgorZHFyb3QxNDcgcm90YXRlICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtNjE0MgorZHFyb3QxNDggcm90YXRlICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTEwCitkcXJvdDE1MSByb3RhdGUgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFyb3QxNTIgcm90YXRlICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTMzIC0+IDFFLTYxNzYKK2Rxcm90MTUzIHJvdGF0ZSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAxICAtPiAxRS02MTc2CitkcXJvdDE1NCByb3RhdGUgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMzMgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFyb3QxNTUgcm90YXRlICA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTEgIC0+IDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQKK2Rxcm90MTU2IHJvdGF0ZSAgOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0zMyAtPiA5RS02MTc2CitkcXJvdDE1NyByb3RhdGUgIDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMSAgLT4gOUUtNjE3NgorZHFyb3QxNTggcm90YXRlICA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDMzIC0+IDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQKK2Rxcm90MTYwIHJvdGF0ZSAgMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFyb3QxNjEgcm90YXRlICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzIC0+IDEuMEUtNjE3NQorZHFyb3QxNjIgcm90YXRlICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtNjE3NQorZHFyb3QxNjMgcm90YXRlICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCistLSAgbmVnYXRpdmVzCitkcXJvdDE3MSByb3RhdGUgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAtMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJvdDE3MiByb3RhdGUgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAtMzMgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJvdDE3MyByb3RhdGUgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAgMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJvdDE3NCByb3RhdGUgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAgMzMgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXJvdDE3NSByb3RhdGUgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTEwCitkcXJvdDE3NiByb3RhdGUgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzMgLT4gLTEuMEUtNjE0MgorZHFyb3QxNzcgcm90YXRlIC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTYxNDIKK2Rxcm90MTc4IHJvdGF0ZSAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMyAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxMTAKK2Rxcm90MTgxIHJvdGF0ZSAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0xICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFyb3QxODIgcm90YXRlIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTMzIC0+IC0xRS02MTc2CitkcXJvdDE4MyByb3RhdGUgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMSAgLT4gLTFFLTYxNzYKK2Rxcm90MTg0IHJvdGF0ZSAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAzMyAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFyb3QxODUgcm90YXRlIC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTEgIC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0CitkcXJvdDE4NiByb3RhdGUgLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMzMgLT4gLTlFLTYxNzYKK2Rxcm90MTg3IHJvdGF0ZSAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAxICAtPiAtOUUtNjE3NgorZHFyb3QxODggcm90YXRlIC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDMzIC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0CitkcXJvdDE5MCByb3RhdGUgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCitkcXJvdDE5MSByb3RhdGUgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzMgLT4gLTEuMEUtNjE3NQorZHFyb3QxOTIgcm90YXRlIC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTYxNzUKK2Rxcm90MTkzIHJvdGF0ZSAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMyAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKKworLS0gbW9yZSBuZWdhdGl2ZXMgKG9mIHNhbml0aWVzKQorZHFyb3QyMDEgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wICAgIDAgIC0+IC0wCitkcXJvdDIwMiByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAgICAgMiAgLT4gLTAKK2Rxcm90MjAzIHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgICAyICAtPiAtMTAwCitkcXJvdDIwNCByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgICAzMyAgLT4gLTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxcm90MjA1IHJvdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgIDM0ICAtPiAtMQorZHFyb3QyMDYgcm90YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAgLTEgIC0+IC0xMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXJvdDIwNyByb3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAgICAtMiAgLT4gLTAKK2Rxcm90MjA4IHJvdGF0ZSAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0xICAtPiAtNDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFyb3QyMDkgcm90YXRlIC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTMzIC0+IC0yMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQxCitkcXJvdDIxMCByb3RhdGUgLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzQgLT4gLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKK2Rxcm90MjExIHJvdGF0ZSAtOTkzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zMyAtPiAtOTM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0OQorZHFyb3QyMTIgcm90YXRlIC05OTM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTM0IC0+IC05OTM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CisKKworLS0gU3BlY2lhbHM7IE5hTnMgYXJlIGhhbmRsZWQgYXMgdXN1YWwKK2Rxcm90NzgxIHJvdGF0ZSAtSW5mICAtOCAgICAgLT4gLUluZmluaXR5CitkcXJvdDc4MiByb3RhdGUgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZHFyb3Q3ODMgcm90YXRlIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2Rxcm90Nzg0IHJvdGF0ZSAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitkcXJvdDc4NSByb3RhdGUgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZHFyb3Q3ODYgcm90YXRlIC1JbmYgICA4ICAgICAtPiAtSW5maW5pdHkKK2Rxcm90Nzg3IHJvdGF0ZSAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDc4OCByb3RhdGUgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q3ODkgcm90YXRlIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90NzkwIHJvdGF0ZSAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDc5MSByb3RhdGUgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q3OTIgcm90YXRlICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90NzkzIHJvdGF0ZSAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDc5NCByb3RhdGUgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXJvdDgwMCByb3RhdGUgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4MDEgcm90YXRlICBJbmYgIC04ICAgICAtPiBJbmZpbml0eQorZHFyb3Q4MDIgcm90YXRlICBJbmYgIC0xICAgICAtPiBJbmZpbml0eQorZHFyb3Q4MDMgcm90YXRlICBJbmYgIC0wICAgICAtPiBJbmZpbml0eQorZHFyb3Q4MDQgcm90YXRlICBJbmYgICAwICAgICAtPiBJbmZpbml0eQorZHFyb3Q4MDUgcm90YXRlICBJbmYgICAxICAgICAtPiBJbmZpbml0eQorZHFyb3Q4MDYgcm90YXRlICBJbmYgICA4ICAgICAtPiBJbmZpbml0eQorZHFyb3Q4MDcgcm90YXRlICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODA4IHJvdGF0ZSAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDgwOSByb3RhdGUgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4MTAgcm90YXRlIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODExIHJvdGF0ZSAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDgxMiByb3RhdGUgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4MTMgcm90YXRlICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODE0IHJvdGF0ZSAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDgxNSByb3RhdGUgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXJvdDgyMSByb3RhdGUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK2Rxcm90ODIyIHJvdGF0ZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorZHFyb3Q4MjMgcm90YXRlICBOYU4gLTEgICAgICAtPiAgTmFOCitkcXJvdDgyNCByb3RhdGUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK2Rxcm90ODI1IHJvdGF0ZSAgTmFOICAwICAgICAgLT4gIE5hTgorZHFyb3Q4MjYgcm90YXRlICBOYU4gIDEgICAgICAtPiAgTmFOCitkcXJvdDgyNyByb3RhdGUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK2Rxcm90ODI4IHJvdGF0ZSAgTmFOICBJbmYgICAgLT4gIE5hTgorZHFyb3Q4Mjkgcm90YXRlICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcXJvdDgzMCByb3RhdGUgLUluZiAgTmFOICAgIC0+ICBOYU4KK2Rxcm90ODMxIHJvdGF0ZSAtMTAwMCBOYU4gICAgLT4gIE5hTgorZHFyb3Q4MzIgcm90YXRlIC0xICAgIE5hTiAgICAtPiAgTmFOCitkcXJvdDgzMyByb3RhdGUgLTAgICAgTmFOICAgIC0+ICBOYU4KK2Rxcm90ODM0IHJvdGF0ZSAgMCAgICBOYU4gICAgLT4gIE5hTgorZHFyb3Q4MzUgcm90YXRlICAxICAgIE5hTiAgICAtPiAgTmFOCitkcXJvdDgzNiByb3RhdGUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK2Rxcm90ODM3IHJvdGF0ZSAgSW5mICBOYU4gICAgLT4gIE5hTgorCitkcXJvdDg0MSByb3RhdGUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0MiByb3RhdGUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0MyByb3RhdGUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0NCByb3RhdGUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0NSByb3RhdGUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0NiByb3RhdGUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0NyByb3RhdGUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0OCByb3RhdGUgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg0OSByb3RhdGUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1MCByb3RhdGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1MSByb3RhdGUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1MiByb3RhdGUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1MyByb3RhdGUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1NCByb3RhdGUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1NSByb3RhdGUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1NiByb3RhdGUgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1NyByb3RhdGUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1OCByb3RhdGUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg1OSByb3RhdGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2Rxcm90ODYxIHJvdGF0ZSAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK2Rxcm90ODYyIHJvdGF0ZSArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2Rxcm90ODYzIHJvdGF0ZSAgTmFOMyAgICAxMDAwICAgLT4gIE5hTjMKK2Rxcm90ODY0IHJvdGF0ZSAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK2Rxcm90ODY1IHJvdGF0ZSAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2Rxcm90ODY2IHJvdGF0ZSAtSW5mICAgICBOYU43ICAgLT4gIE5hTjcKK2Rxcm90ODY3IHJvdGF0ZSAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK2Rxcm90ODY4IHJvdGF0ZSAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2Rxcm90ODY5IHJvdGF0ZSAgSW5mICAgICtOYU4xMCAgLT4gIE5hTjEwCitkcXJvdDg3MSByb3RhdGUgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODcyIHJvdGF0ZSAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4NzMgcm90YXRlICBzTmFOMTMgICAxMDAwICAtPiAgTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg3NCByb3RhdGUgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODc1IHJvdGF0ZSAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4NzYgcm90YXRlICBOYU4xNiAgIHNOYU4xOSAtPiAgTmFOMTkgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg3NyByb3RhdGUgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODc4IHJvdGF0ZSAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4Nzkgcm90YXRlICAxMDAwICAgIHNOYU4yMiAtPiAgTmFOMjIgIEludmFsaWRfb3BlcmF0aW9uCitkcXJvdDg4MCByb3RhdGUgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rxcm90ODgxIHJvdGF0ZSArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4ODIgcm90YXRlIC1OYU4yNiAgICBOYU4yOCAtPiAtTmFOMjYKK2Rxcm90ODgzIHJvdGF0ZSAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorZHFyb3Q4ODQgcm90YXRlICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2Rxcm90ODg1IHJvdGF0ZSAgMTAwMCAgIC1zTmFOMzEgLT4gLU5hTjMxICBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVNhbWVRdWFudHVtLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2FtZVF1YW50dW0uZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTdjZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVNhbWVRdWFudHVtLmRlY1Rlc3QKQEAgLTAsMCArMSwzODkgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFTYW1lUXVhbnR1bS5kZWNUZXN0IC0tIGNoZWNrIGRlY1F1YWQgcXVhbnR1bXMgbWF0Y2ggICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBBbGwgb3BlcmFuZHMgYW5kIHJlc3VsdHMgYXJlIGRlY1F1YWRzLgorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworZHFzYW1xMDAxIHNhbWVxdWFudHVtICAwICAgICAgMCAgICAgIC0+ICAxCitkcXNhbXEwMDIgc2FtZXF1YW50dW0gIDAgICAgICAxICAgICAgLT4gIDEKK2Rxc2FtcTAwMyBzYW1lcXVhbnR1bSAgMSAgICAgIDAgICAgICAtPiAgMQorZHFzYW1xMDA0IHNhbWVxdWFudHVtICAxICAgICAgMSAgICAgIC0+ICAxCisKK2Rxc2FtcTAxMSBzYW1lcXVhbnR1bSAgMTAgICAgIDFFKzEgICAtPiAwCitkcXNhbXEwMTIgc2FtZXF1YW50dW0gIDEwRSsxICAxMEUrMSAgLT4gMQorZHFzYW1xMDEzIHNhbWVxdWFudHVtICAxMDAgICAgMTBFKzEgIC0+IDAKK2Rxc2FtcTAxNCBzYW1lcXVhbnR1bSAgMTAwICAgIDFFKzIgICAtPiAwCitkcXNhbXEwMTUgc2FtZXF1YW50dW0gIDAuMSAgICAxRS0yICAgLT4gMAorZHFzYW1xMDE2IHNhbWVxdWFudHVtICAwLjEgICAgMUUtMSAgIC0+IDEKK2Rxc2FtcTAxNyBzYW1lcXVhbnR1bSAgMC4xICAgIDFFLTAgICAtPiAwCitkcXNhbXEwMTggc2FtZXF1YW50dW0gIDk5OSAgICA5OTkgICAgLT4gMQorZHFzYW1xMDE5IHNhbWVxdWFudHVtICA5OTlFLTEgOTkuOSAgIC0+IDEKK2Rxc2FtcTAyMCBzYW1lcXVhbnR1bSAgMTExRS0xIDIyLjIgICAtPiAxCitkcXNhbXEwMjEgc2FtZXF1YW50dW0gIDExMUUtMSAxMjM0LjIgLT4gMQorCistLSB6ZXJvcworZHFzYW1xMDMwIHNhbWVxdWFudHVtICAwLjAgICAgMS4xICAgIC0+IDEKK2Rxc2FtcTAzMSBzYW1lcXVhbnR1bSAgMC4wICAgIDEuMTEgICAtPiAwCitkcXNhbXEwMzIgc2FtZXF1YW50dW0gIDAuMCAgICAwICAgICAgLT4gMAorZHFzYW1xMDMzIHNhbWVxdWFudHVtICAwLjAgICAgMC4wICAgIC0+IDEKK2Rxc2FtcTAzNCBzYW1lcXVhbnR1bSAgMC4wICAgIDAuMDAgICAtPiAwCitkcXNhbXEwMzUgc2FtZXF1YW50dW0gIDBFKzEgICAwRSswICAgLT4gMAorZHFzYW1xMDM2IHNhbWVxdWFudHVtICAwRSsxICAgMEUrMSAgIC0+IDEKK2Rxc2FtcTAzNyBzYW1lcXVhbnR1bSAgMEUrMSAgIDBFKzIgICAtPiAwCitkcXNhbXEwMzggc2FtZXF1YW50dW0gIDBFLTE3ICAwRS0xNiAgLT4gMAorZHFzYW1xMDM5IHNhbWVxdWFudHVtICAwRS0xNyAgMEUtMTcgIC0+IDEKK2Rxc2FtcTA0MCBzYW1lcXVhbnR1bSAgMEUtMTcgIDBFLTE4ICAtPiAwCitkcXNhbXEwNDEgc2FtZXF1YW50dW0gIDBFLTE3ICAwLjBFLTE1IC0+IDAKK2Rxc2FtcTA0MiBzYW1lcXVhbnR1bSAgMEUtMTcgIDAuMEUtMTYgLT4gMQorZHFzYW1xMDQzIHNhbWVxdWFudHVtICAwRS0xNyAgMC4wRS0xNyAtPiAwCitkcXNhbXEwNDQgc2FtZXF1YW50dW0gLTBFLTE3ICAwLjBFLTE2IC0+IDEKK2Rxc2FtcTA0NSBzYW1lcXVhbnR1bSAgMEUtMTcgLTAuMEUtMTcgLT4gMAorZHFzYW1xMDQ2IHNhbWVxdWFudHVtICAwRS0xNyAtMC4wRS0xNiAtPiAxCitkcXNhbXEwNDcgc2FtZXF1YW50dW0gLTBFLTE3ICAwLjBFLTE3IC0+IDAKK2Rxc2FtcTA0OCBzYW1lcXVhbnR1bSAtMEUtMTcgLTAuMEUtMTYgLT4gMQorZHFzYW1xMDQ5IHNhbWVxdWFudHVtIC0wRS0xNyAtMC4wRS0xNyAtPiAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcXNhbXEwNTEgc2FtZXF1YW50dW0gIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgLT4gMQorZHFzYW1xMDUyIHNhbWVxdWFudHVtICAxRS02MTQzICAgICAgICAgICAgIDFFLTYxNDMgICAgICAgICAgIC0+IDEKK2Rxc2FtcTA1MyBzYW1lcXVhbnR1bSAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtPiAxCitkcXNhbXEwNTQgc2FtZXF1YW50dW0gIDFFLTYxNzYgICAgICAgICAgICAgMUUtNjE3NiAgICAgICAgICAgLT4gMQorZHFzYW1xMDU1IHNhbWVxdWFudHVtICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgIC0+IDEKK2Rxc2FtcTA1NiBzYW1lcXVhbnR1bSAgMUUtNjE0MyAgICAgICAgICAgICAxRS02MTQzICAgICAgICAgICAtPiAxCitkcXNhbXEwNTcgc2FtZXF1YW50dW0gIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLT4gMQorZHFzYW1xMDU4IHNhbWVxdWFudHVtICAxRS02MTc2ICAgICAgICAgICAgIDFFLTYxNzYgICAgICAgICAgIC0+IDEKKworZHFzYW1xMDYxIHNhbWVxdWFudHVtICAtMUUtNjE3NiAgICAgICAgICAgIC0xRS02MTc2ICAgICAgICAgIC0+IDEKK2Rxc2FtcTA2MiBzYW1lcXVhbnR1bSAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAtPiAxCitkcXNhbXEwNjMgc2FtZXF1YW50dW0gIC0xRS02MTQzICAgICAgICAgICAgLTFFLTYxNDMgICAgICAgICAgLT4gMQorZHFzYW1xMDY0IHNhbWVxdWFudHVtICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0IC0+IDEKK2Rxc2FtcTA2NSBzYW1lcXVhbnR1bSAgLTFFLTYxNzYgICAgICAgICAgICAtMUUtNjE3NiAgICAgICAgICAtPiAxCitkcXNhbXEwNjYgc2FtZXF1YW50dW0gIC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgLT4gMQorZHFzYW1xMDY3IHNhbWVxdWFudHVtICAtMUUtNjE0MyAgICAgICAgICAgIC0xRS02MTQzICAgICAgICAgIC0+IDEKK2Rxc2FtcTA2OCBzYW1lcXVhbnR1bSAgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAxCisKK2Rxc2FtcTA3MSBzYW1lcXVhbnR1bSAgLTRFLTYxNzYgICAgICAgICAgICAtMUUtNjE3NiAgICAgICAgICAtPiAxCitkcXNhbXEwNzIgc2FtZXF1YW50dW0gIC00LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDQwMDBFLTYxNDMgLT4gMQorZHFzYW1xMDczIHNhbWVxdWFudHVtICAtNEUtNjE0MyAgICAgICAgICAgIC0xRS02MTQzICAgICAgICAgIC0+IDEKK2Rxc2FtcTA3NCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAtOS45OTk0OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtPiAxCitkcXNhbXEwNzUgc2FtZXF1YW50dW0gIC00RS02MTc2ICAgICAgICAgICAgLTFFLTYxNzYgICAgICAgICAgLT4gMQorZHFzYW1xMDc2IHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgIC0xLjAwNDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzIC0+IDEKK2Rxc2FtcTA3NyBzYW1lcXVhbnR1bSAgLTRFLTYxNDMgICAgICAgICAgICAtMUUtNjE0MyAgICAgICAgICAtPiAxCitkcXNhbXEwNzggc2FtZXF1YW50dW0gIC00Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLTkuOTQ5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgLT4gMQorCitkcXNhbXEwODEgc2FtZXF1YW50dW0gIC00RS0xMDA2ICAgICAgICAgICAtMUUtNjE3NiAgICAgICAgICAtPiAwCitkcXNhbXEwODIgc2FtZXF1YW50dW0gIC00LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgLTEuMDAwMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxMzYgLT4gMAorZHFzYW1xMDgzIHNhbWVxdWFudHVtICAtNEUtNjE0MCAgICAgICAgICAgLTFFLTYxNDMgICAgICAgICAgLT4gMAorZHFzYW1xMDg0IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIC05Ljk5OTQ5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTM2IC0+IDAKK2Rxc2FtcTA4NSBzYW1lcXVhbnR1bSAgLTRFLTEwMDYgICAgICAgICAgIC0xRS02MTc2ICAgICAgICAgIC0+IDAKK2Rxc2FtcTA4NiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAtMS4wMDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjEzNiAtPiAwCitkcXNhbXEwODcgc2FtZXF1YW50dW0gIC00RS02MTMzICAgICAgICAgICAtMUUtNjE0MyAgICAgICAgICAtPiAwCitkcXNhbXEwODggc2FtZXF1YW50dW0gIC00Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgLTkuOTQ5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxMzYgLT4gMAorCistLSBzcGVjaWFscyAmIGNvbWJpbmF0aW9ucworZHFzYW1xMDExMCBzYW1lcXVhbnR1bSAgLUluZiAgICAtSW5mICAgLT4gMQorZHFzYW1xMDExMSBzYW1lcXVhbnR1bSAgLUluZiAgICAgSW5mICAgLT4gMQorZHFzYW1xMDExMiBzYW1lcXVhbnR1bSAgLUluZiAgICAgTmFOICAgLT4gMAorZHFzYW1xMDExMyBzYW1lcXVhbnR1bSAgLUluZiAgICAtN0UrMyAgLT4gMAorZHFzYW1xMDExNCBzYW1lcXVhbnR1bSAgLUluZiAgICAtNyAgICAgLT4gMAorZHFzYW1xMDExNSBzYW1lcXVhbnR1bSAgLUluZiAgICAtN0UtMyAgLT4gMAorZHFzYW1xMDExNiBzYW1lcXVhbnR1bSAgLUluZiAgICAtMEUtMyAgLT4gMAorZHFzYW1xMDExNyBzYW1lcXVhbnR1bSAgLUluZiAgICAtMCAgICAgLT4gMAorZHFzYW1xMDExOCBzYW1lcXVhbnR1bSAgLUluZiAgICAtMEUrMyAgLT4gMAorZHFzYW1xMDExOSBzYW1lcXVhbnR1bSAgLUluZiAgICAgMEUtMyAgLT4gMAorZHFzYW1xMDEyMCBzYW1lcXVhbnR1bSAgLUluZiAgICAgMCAgICAgLT4gMAorZHFzYW1xMDEyMSBzYW1lcXVhbnR1bSAgLUluZiAgICAgMEUrMyAgLT4gMAorZHFzYW1xMDEyMiBzYW1lcXVhbnR1bSAgLUluZiAgICAgN0UtMyAgLT4gMAorZHFzYW1xMDEyMyBzYW1lcXVhbnR1bSAgLUluZiAgICAgNyAgICAgLT4gMAorZHFzYW1xMDEyNCBzYW1lcXVhbnR1bSAgLUluZiAgICAgN0UrMyAgLT4gMAorZHFzYW1xMDEyNSBzYW1lcXVhbnR1bSAgLUluZiAgICAgc05hTiAgLT4gMAorCitkcXNhbXEwMjEwIHNhbWVxdWFudHVtICAgSW5mICAgIC1JbmYgICAtPiAxCitkcXNhbXEwMjExIHNhbWVxdWFudHVtICAgSW5mICAgICBJbmYgICAtPiAxCitkcXNhbXEwMjEyIHNhbWVxdWFudHVtICAgSW5mICAgICBOYU4gICAtPiAwCitkcXNhbXEwMjEzIHNhbWVxdWFudHVtICAgSW5mICAgIC03RSszICAtPiAwCitkcXNhbXEwMjE0IHNhbWVxdWFudHVtICAgSW5mICAgIC03ICAgICAtPiAwCitkcXNhbXEwMjE1IHNhbWVxdWFudHVtICAgSW5mICAgIC03RS0zICAtPiAwCitkcXNhbXEwMjE2IHNhbWVxdWFudHVtICAgSW5mICAgIC0wRS0zICAtPiAwCitkcXNhbXEwMjE3IHNhbWVxdWFudHVtICAgSW5mICAgIC0wICAgICAtPiAwCitkcXNhbXEwMjE4IHNhbWVxdWFudHVtICAgSW5mICAgIC0wRSszICAtPiAwCitkcXNhbXEwMjE5IHNhbWVxdWFudHVtICAgSW5mICAgICAwRS0zICAtPiAwCitkcXNhbXEwMjIwIHNhbWVxdWFudHVtICAgSW5mICAgICAwICAgICAtPiAwCitkcXNhbXEwMjIxIHNhbWVxdWFudHVtICAgSW5mICAgICAwRSszICAtPiAwCitkcXNhbXEwMjIyIHNhbWVxdWFudHVtICAgSW5mICAgICA3RS0zICAtPiAwCitkcXNhbXEwMjIzIHNhbWVxdWFudHVtICAgSW5mICAgICA3ICAgICAtPiAwCitkcXNhbXEwMjI0IHNhbWVxdWFudHVtICAgSW5mICAgICA3RSszICAtPiAwCitkcXNhbXEwMjI1IHNhbWVxdWFudHVtICAgSW5mICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTAzMTAgc2FtZXF1YW50dW0gICBOYU4gICAgLUluZiAgIC0+IDAKK2Rxc2FtcTAzMTEgc2FtZXF1YW50dW0gICBOYU4gICAgIEluZiAgIC0+IDAKK2Rxc2FtcTAzMTIgc2FtZXF1YW50dW0gICBOYU4gICAgIE5hTiAgIC0+IDEKK2Rxc2FtcTAzMTMgc2FtZXF1YW50dW0gICBOYU4gICAgLTdFKzMgIC0+IDAKK2Rxc2FtcTAzMTQgc2FtZXF1YW50dW0gICBOYU4gICAgLTcgICAgIC0+IDAKK2Rxc2FtcTAzMTUgc2FtZXF1YW50dW0gICBOYU4gICAgLTdFLTMgIC0+IDAKK2Rxc2FtcTAzMTYgc2FtZXF1YW50dW0gICBOYU4gICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTAzMTcgc2FtZXF1YW50dW0gICBOYU4gICAgLTAgICAgIC0+IDAKK2Rxc2FtcTAzMTggc2FtZXF1YW50dW0gICBOYU4gICAgLTBFKzMgIC0+IDAKK2Rxc2FtcTAzMTkgc2FtZXF1YW50dW0gICBOYU4gICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTAzMjAgc2FtZXF1YW50dW0gICBOYU4gICAgIDAgICAgIC0+IDAKK2Rxc2FtcTAzMjEgc2FtZXF1YW50dW0gICBOYU4gICAgIDBFKzMgIC0+IDAKK2Rxc2FtcTAzMjIgc2FtZXF1YW50dW0gICBOYU4gICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTAzMjMgc2FtZXF1YW50dW0gICBOYU4gICAgIDcgICAgIC0+IDAKK2Rxc2FtcTAzMjQgc2FtZXF1YW50dW0gICBOYU4gICAgIDdFKzMgIC0+IDAKK2Rxc2FtcTAzMjUgc2FtZXF1YW50dW0gICBOYU4gICAgIHNOYU4gIC0+IDEKKworZHFzYW1xMDQxMCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTA0MTEgc2FtZXF1YW50dW0gIC03RSszICAgICBJbmYgICAtPiAwCitkcXNhbXEwNDEyIHNhbWVxdWFudHVtICAtN0UrMyAgICAgTmFOICAgLT4gMAorZHFzYW1xMDQxMyBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTdFKzMgIC0+IDEKK2Rxc2FtcTA0MTQgc2FtZXF1YW50dW0gIC03RSszICAgIC03ICAgICAtPiAwCitkcXNhbXEwNDE1IHNhbWVxdWFudHVtICAtN0UrMyAgICAtN0UtMyAgLT4gMAorZHFzYW1xMDQxNiBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTA0MTcgc2FtZXF1YW50dW0gIC03RSszICAgIC0wICAgICAtPiAwCitkcXNhbXEwNDE4IHNhbWVxdWFudHVtICAtN0UrMyAgICAtMEUrMyAgLT4gMQorZHFzYW1xMDQxOSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTA0MjAgc2FtZXF1YW50dW0gIC03RSszICAgICAwICAgICAtPiAwCitkcXNhbXEwNDIxIHNhbWVxdWFudHVtICAtN0UrMyAgICAgMEUrMyAgLT4gMQorZHFzYW1xMDQyMiBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTA0MjMgc2FtZXF1YW50dW0gIC03RSszICAgICA3ICAgICAtPiAwCitkcXNhbXEwNDI0IHNhbWVxdWFudHVtICAtN0UrMyAgICAgN0UrMyAgLT4gMQorZHFzYW1xMDQyNSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMDUxMCBzYW1lcXVhbnR1bSAgLTcgICAgICAtSW5mICAgLT4gMAorZHFzYW1xMDUxMSBzYW1lcXVhbnR1bSAgLTcgICAgICAgSW5mICAgLT4gMAorZHFzYW1xMDUxMiBzYW1lcXVhbnR1bSAgLTcgICAgICAgTmFOICAgLT4gMAorZHFzYW1xMDUxMyBzYW1lcXVhbnR1bSAgLTcgICAgICAtN0UrMyAgLT4gMAorZHFzYW1xMDUxNCBzYW1lcXVhbnR1bSAgLTcgICAgICAtNyAgICAgLT4gMQorZHFzYW1xMDUxNSBzYW1lcXVhbnR1bSAgLTcgICAgICAtN0UtMyAgLT4gMAorZHFzYW1xMDUxNiBzYW1lcXVhbnR1bSAgLTcgICAgICAtMEUtMyAgLT4gMAorZHFzYW1xMDUxNyBzYW1lcXVhbnR1bSAgLTcgICAgICAtMCAgICAgLT4gMQorZHFzYW1xMDUxOCBzYW1lcXVhbnR1bSAgLTcgICAgICAtMEUrMyAgLT4gMAorZHFzYW1xMDUxOSBzYW1lcXVhbnR1bSAgLTcgICAgICAgMEUtMyAgLT4gMAorZHFzYW1xMDUyMCBzYW1lcXVhbnR1bSAgLTcgICAgICAgMCAgICAgLT4gMQorZHFzYW1xMDUyMSBzYW1lcXVhbnR1bSAgLTcgICAgICAgMEUrMyAgLT4gMAorZHFzYW1xMDUyMiBzYW1lcXVhbnR1bSAgLTcgICAgICAgN0UtMyAgLT4gMAorZHFzYW1xMDUyMyBzYW1lcXVhbnR1bSAgLTcgICAgICAgNyAgICAgLT4gMQorZHFzYW1xMDUyNCBzYW1lcXVhbnR1bSAgLTcgICAgICAgN0UrMyAgLT4gMAorZHFzYW1xMDUyNSBzYW1lcXVhbnR1bSAgLTcgICAgICAgc05hTiAgLT4gMAorCitkcXNhbXEwNjEwIHNhbWVxdWFudHVtICAtN0UtMyAgICAtSW5mICAgLT4gMAorZHFzYW1xMDYxMSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTA2MTIgc2FtZXF1YW50dW0gIC03RS0zICAgICBOYU4gICAtPiAwCitkcXNhbXEwNjEzIHNhbWVxdWFudHVtICAtN0UtMyAgICAtN0UrMyAgLT4gMAorZHFzYW1xMDYxNCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTA2MTUgc2FtZXF1YW50dW0gIC03RS0zICAgIC03RS0zICAtPiAxCitkcXNhbXEwNjE2IHNhbWVxdWFudHVtICAtN0UtMyAgICAtMEUtMyAgLT4gMQorZHFzYW1xMDYxNyBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTA2MTggc2FtZXF1YW50dW0gIC03RS0zICAgIC0wRSszICAtPiAwCitkcXNhbXEwNjE5IHNhbWVxdWFudHVtICAtN0UtMyAgICAgMEUtMyAgLT4gMQorZHFzYW1xMDYyMCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTA2MjEgc2FtZXF1YW50dW0gIC03RS0zICAgICAwRSszICAtPiAwCitkcXNhbXEwNjIyIHNhbWVxdWFudHVtICAtN0UtMyAgICAgN0UtMyAgLT4gMQorZHFzYW1xMDYyMyBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTA2MjQgc2FtZXF1YW50dW0gIC03RS0zICAgICA3RSszICAtPiAwCitkcXNhbXEwNjI1IHNhbWVxdWFudHVtICAtN0UtMyAgICAgc05hTiAgLT4gMAorCitkcXNhbXEwNzEwIHNhbWVxdWFudHVtICAtMEUtMyAgICAtSW5mICAgLT4gMAorZHFzYW1xMDcxMSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTA3MTIgc2FtZXF1YW50dW0gIC0wRS0zICAgICBOYU4gICAtPiAwCitkcXNhbXEwNzEzIHNhbWVxdWFudHVtICAtMEUtMyAgICAtN0UrMyAgLT4gMAorZHFzYW1xMDcxNCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTA3MTUgc2FtZXF1YW50dW0gIC0wRS0zICAgIC03RS0zICAtPiAxCitkcXNhbXEwNzE2IHNhbWVxdWFudHVtICAtMEUtMyAgICAtMEUtMyAgLT4gMQorZHFzYW1xMDcxNyBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTA3MTggc2FtZXF1YW50dW0gIC0wRS0zICAgIC0wRSszICAtPiAwCitkcXNhbXEwNzE5IHNhbWVxdWFudHVtICAtMEUtMyAgICAgMEUtMyAgLT4gMQorZHFzYW1xMDcyMCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTA3MjEgc2FtZXF1YW50dW0gIC0wRS0zICAgICAwRSszICAtPiAwCitkcXNhbXEwNzIyIHNhbWVxdWFudHVtICAtMEUtMyAgICAgN0UtMyAgLT4gMQorZHFzYW1xMDcyMyBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTA3MjQgc2FtZXF1YW50dW0gIC0wRS0zICAgICA3RSszICAtPiAwCitkcXNhbXEwNzI1IHNhbWVxdWFudHVtICAtMEUtMyAgICAgc05hTiAgLT4gMAorCitkcXNhbXEwODEwIHNhbWVxdWFudHVtICAtMCAgICAgIC1JbmYgICAtPiAwCitkcXNhbXEwODExIHNhbWVxdWFudHVtICAtMCAgICAgICBJbmYgICAtPiAwCitkcXNhbXEwODEyIHNhbWVxdWFudHVtICAtMCAgICAgICBOYU4gICAtPiAwCitkcXNhbXEwODEzIHNhbWVxdWFudHVtICAtMCAgICAgIC03RSszICAtPiAwCitkcXNhbXEwODE0IHNhbWVxdWFudHVtICAtMCAgICAgIC03ICAgICAtPiAxCitkcXNhbXEwODE1IHNhbWVxdWFudHVtICAtMCAgICAgIC03RS0zICAtPiAwCitkcXNhbXEwODE2IHNhbWVxdWFudHVtICAtMCAgICAgIC0wRS0zICAtPiAwCitkcXNhbXEwODE3IHNhbWVxdWFudHVtICAtMCAgICAgIC0wICAgICAtPiAxCitkcXNhbXEwODE4IHNhbWVxdWFudHVtICAtMCAgICAgIC0wRSszICAtPiAwCitkcXNhbXEwODE5IHNhbWVxdWFudHVtICAtMCAgICAgICAwRS0zICAtPiAwCitkcXNhbXEwODIwIHNhbWVxdWFudHVtICAtMCAgICAgICAwICAgICAtPiAxCitkcXNhbXEwODIxIHNhbWVxdWFudHVtICAtMCAgICAgICAwRSszICAtPiAwCitkcXNhbXEwODIyIHNhbWVxdWFudHVtICAtMCAgICAgICA3RS0zICAtPiAwCitkcXNhbXEwODIzIHNhbWVxdWFudHVtICAtMCAgICAgICA3ICAgICAtPiAxCitkcXNhbXEwODI0IHNhbWVxdWFudHVtICAtMCAgICAgICA3RSszICAtPiAwCitkcXNhbXEwODI1IHNhbWVxdWFudHVtICAtMCAgICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTA5MTAgc2FtZXF1YW50dW0gIC0wRSszICAgIC1JbmYgICAtPiAwCitkcXNhbXEwOTExIHNhbWVxdWFudHVtICAtMEUrMyAgICAgSW5mICAgLT4gMAorZHFzYW1xMDkxMiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTA5MTMgc2FtZXF1YW50dW0gIC0wRSszICAgIC03RSszICAtPiAxCitkcXNhbXEwOTE0IHNhbWVxdWFudHVtICAtMEUrMyAgICAtNyAgICAgLT4gMAorZHFzYW1xMDkxNSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTdFLTMgIC0+IDAKK2Rxc2FtcTA5MTYgc2FtZXF1YW50dW0gIC0wRSszICAgIC0wRS0zICAtPiAwCitkcXNhbXEwOTE3IHNhbWVxdWFudHVtICAtMEUrMyAgICAtMCAgICAgLT4gMAorZHFzYW1xMDkxOCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTBFKzMgIC0+IDEKK2Rxc2FtcTA5MTkgc2FtZXF1YW50dW0gIC0wRSszICAgICAwRS0zICAtPiAwCitkcXNhbXEwOTIwIHNhbWVxdWFudHVtICAtMEUrMyAgICAgMCAgICAgLT4gMAorZHFzYW1xMDkyMSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDBFKzMgIC0+IDEKK2Rxc2FtcTA5MjIgc2FtZXF1YW50dW0gIC0wRSszICAgICA3RS0zICAtPiAwCitkcXNhbXEwOTIzIHNhbWVxdWFudHVtICAtMEUrMyAgICAgNyAgICAgLT4gMAorZHFzYW1xMDkyNCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDdFKzMgIC0+IDEKK2Rxc2FtcTA5MjUgc2FtZXF1YW50dW0gIC0wRSszICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTExMTAgc2FtZXF1YW50dW0gIDBFLTMgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTExMTEgc2FtZXF1YW50dW0gIDBFLTMgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTExMTIgc2FtZXF1YW50dW0gIDBFLTMgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTExMTMgc2FtZXF1YW50dW0gIDBFLTMgICAgLTdFKzMgIC0+IDAKK2Rxc2FtcTExMTQgc2FtZXF1YW50dW0gIDBFLTMgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTExMTUgc2FtZXF1YW50dW0gIDBFLTMgICAgLTdFLTMgIC0+IDEKK2Rxc2FtcTExMTYgc2FtZXF1YW50dW0gIDBFLTMgICAgLTBFLTMgIC0+IDEKK2Rxc2FtcTExMTcgc2FtZXF1YW50dW0gIDBFLTMgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTExMTggc2FtZXF1YW50dW0gIDBFLTMgICAgLTBFKzMgIC0+IDAKK2Rxc2FtcTExMTkgc2FtZXF1YW50dW0gIDBFLTMgICAgIDBFLTMgIC0+IDEKK2Rxc2FtcTExMjAgc2FtZXF1YW50dW0gIDBFLTMgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTExMjEgc2FtZXF1YW50dW0gIDBFLTMgICAgIDBFKzMgIC0+IDAKK2Rxc2FtcTExMjIgc2FtZXF1YW50dW0gIDBFLTMgICAgIDdFLTMgIC0+IDEKK2Rxc2FtcTExMjMgc2FtZXF1YW50dW0gIDBFLTMgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTExMjQgc2FtZXF1YW50dW0gIDBFLTMgICAgIDdFKzMgIC0+IDAKK2Rxc2FtcTExMjUgc2FtZXF1YW50dW0gIDBFLTMgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMTIxMCBzYW1lcXVhbnR1bSAgMCAgICAgICAtSW5mICAgLT4gMAorZHFzYW1xMTIxMSBzYW1lcXVhbnR1bSAgMCAgICAgICAgSW5mICAgLT4gMAorZHFzYW1xMTIxMiBzYW1lcXVhbnR1bSAgMCAgICAgICAgTmFOICAgLT4gMAorZHFzYW1xMTIxMyBzYW1lcXVhbnR1bSAgMCAgICAgICAtN0UrMyAgLT4gMAorZHFzYW1xMTIxNCBzYW1lcXVhbnR1bSAgMCAgICAgICAtNyAgICAgLT4gMQorZHFzYW1xMTIxNSBzYW1lcXVhbnR1bSAgMCAgICAgICAtN0UtMyAgLT4gMAorZHFzYW1xMTIxNiBzYW1lcXVhbnR1bSAgMCAgICAgICAtMEUtMyAgLT4gMAorZHFzYW1xMTIxNyBzYW1lcXVhbnR1bSAgMCAgICAgICAtMCAgICAgLT4gMQorZHFzYW1xMTIxOCBzYW1lcXVhbnR1bSAgMCAgICAgICAtMEUrMyAgLT4gMAorZHFzYW1xMTIxOSBzYW1lcXVhbnR1bSAgMCAgICAgICAgMEUtMyAgLT4gMAorZHFzYW1xMTIyMCBzYW1lcXVhbnR1bSAgMCAgICAgICAgMCAgICAgLT4gMQorZHFzYW1xMTIyMSBzYW1lcXVhbnR1bSAgMCAgICAgICAgMEUrMyAgLT4gMAorZHFzYW1xMTIyMiBzYW1lcXVhbnR1bSAgMCAgICAgICAgN0UtMyAgLT4gMAorZHFzYW1xMTIyMyBzYW1lcXVhbnR1bSAgMCAgICAgICAgNyAgICAgLT4gMQorZHFzYW1xMTIyNCBzYW1lcXVhbnR1bSAgMCAgICAgICAgN0UrMyAgLT4gMAorZHFzYW1xMTIyNSBzYW1lcXVhbnR1bSAgMCAgICAgICAgc05hTiAgLT4gMAorCitkcXNhbXExMzEwIHNhbWVxdWFudHVtICAwRSszICAgIC1JbmYgICAtPiAwCitkcXNhbXExMzExIHNhbWVxdWFudHVtICAwRSszICAgICBJbmYgICAtPiAwCitkcXNhbXExMzEyIHNhbWVxdWFudHVtICAwRSszICAgICBOYU4gICAtPiAwCitkcXNhbXExMzEzIHNhbWVxdWFudHVtICAwRSszICAgIC03RSszICAtPiAxCitkcXNhbXExMzE0IHNhbWVxdWFudHVtICAwRSszICAgIC03ICAgICAtPiAwCitkcXNhbXExMzE1IHNhbWVxdWFudHVtICAwRSszICAgIC03RS0zICAtPiAwCitkcXNhbXExMzE2IHNhbWVxdWFudHVtICAwRSszICAgIC0wRS0zICAtPiAwCitkcXNhbXExMzE3IHNhbWVxdWFudHVtICAwRSszICAgIC0wICAgICAtPiAwCitkcXNhbXExMzE4IHNhbWVxdWFudHVtICAwRSszICAgIC0wRSszICAtPiAxCitkcXNhbXExMzE5IHNhbWVxdWFudHVtICAwRSszICAgICAwRS0zICAtPiAwCitkcXNhbXExMzIwIHNhbWVxdWFudHVtICAwRSszICAgICAwICAgICAtPiAwCitkcXNhbXExMzIxIHNhbWVxdWFudHVtICAwRSszICAgICAwRSszICAtPiAxCitkcXNhbXExMzIyIHNhbWVxdWFudHVtICAwRSszICAgICA3RS0zICAtPiAwCitkcXNhbXExMzIzIHNhbWVxdWFudHVtICAwRSszICAgICA3ICAgICAtPiAwCitkcXNhbXExMzI0IHNhbWVxdWFudHVtICAwRSszICAgICA3RSszICAtPiAxCitkcXNhbXExMzI1IHNhbWVxdWFudHVtICAwRSszICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTE0MTAgc2FtZXF1YW50dW0gIDdFLTMgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTE0MTEgc2FtZXF1YW50dW0gIDdFLTMgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTE0MTIgc2FtZXF1YW50dW0gIDdFLTMgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTE0MTMgc2FtZXF1YW50dW0gIDdFLTMgICAgLTdFKzMgIC0+IDAKK2Rxc2FtcTE0MTQgc2FtZXF1YW50dW0gIDdFLTMgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTE0MTUgc2FtZXF1YW50dW0gIDdFLTMgICAgLTdFLTMgIC0+IDEKK2Rxc2FtcTE0MTYgc2FtZXF1YW50dW0gIDdFLTMgICAgLTBFLTMgIC0+IDEKK2Rxc2FtcTE0MTcgc2FtZXF1YW50dW0gIDdFLTMgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTE0MTggc2FtZXF1YW50dW0gIDdFLTMgICAgLTBFKzMgIC0+IDAKK2Rxc2FtcTE0MTkgc2FtZXF1YW50dW0gIDdFLTMgICAgIDBFLTMgIC0+IDEKK2Rxc2FtcTE0MjAgc2FtZXF1YW50dW0gIDdFLTMgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTE0MjEgc2FtZXF1YW50dW0gIDdFLTMgICAgIDBFKzMgIC0+IDAKK2Rxc2FtcTE0MjIgc2FtZXF1YW50dW0gIDdFLTMgICAgIDdFLTMgIC0+IDEKK2Rxc2FtcTE0MjMgc2FtZXF1YW50dW0gIDdFLTMgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTE0MjQgc2FtZXF1YW50dW0gIDdFLTMgICAgIDdFKzMgIC0+IDAKK2Rxc2FtcTE0MjUgc2FtZXF1YW50dW0gIDdFLTMgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMTUxMCBzYW1lcXVhbnR1bSAgNyAgICAgIC1JbmYgICAtPiAwCitkcXNhbXExNTExIHNhbWVxdWFudHVtICA3ICAgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTE1MTIgc2FtZXF1YW50dW0gIDcgICAgICAgTmFOICAgLT4gMAorZHFzYW1xMTUxMyBzYW1lcXVhbnR1bSAgNyAgICAgIC03RSszICAtPiAwCitkcXNhbXExNTE0IHNhbWVxdWFudHVtICA3ICAgICAgLTcgICAgIC0+IDEKK2Rxc2FtcTE1MTUgc2FtZXF1YW50dW0gIDcgICAgICAtN0UtMyAgLT4gMAorZHFzYW1xMTUxNiBzYW1lcXVhbnR1bSAgNyAgICAgIC0wRS0zICAtPiAwCitkcXNhbXExNTE3IHNhbWVxdWFudHVtICA3ICAgICAgLTAgICAgIC0+IDEKK2Rxc2FtcTE1MTggc2FtZXF1YW50dW0gIDcgICAgICAtMEUrMyAgLT4gMAorZHFzYW1xMTUxOSBzYW1lcXVhbnR1bSAgNyAgICAgICAwRS0zICAtPiAwCitkcXNhbXExNTIwIHNhbWVxdWFudHVtICA3ICAgICAgIDAgICAgIC0+IDEKK2Rxc2FtcTE1MjEgc2FtZXF1YW50dW0gIDcgICAgICAgMEUrMyAgLT4gMAorZHFzYW1xMTUyMiBzYW1lcXVhbnR1bSAgNyAgICAgICA3RS0zICAtPiAwCitkcXNhbXExNTIzIHNhbWVxdWFudHVtICA3ICAgICAgIDcgICAgIC0+IDEKK2Rxc2FtcTE1MjQgc2FtZXF1YW50dW0gIDcgICAgICAgN0UrMyAgLT4gMAorZHFzYW1xMTUyNSBzYW1lcXVhbnR1bSAgNyAgICAgICBzTmFOICAtPiAwCisKK2Rxc2FtcTE2MTAgc2FtZXF1YW50dW0gIDdFKzMgICAgLUluZiAgIC0+IDAKK2Rxc2FtcTE2MTEgc2FtZXF1YW50dW0gIDdFKzMgICAgIEluZiAgIC0+IDAKK2Rxc2FtcTE2MTIgc2FtZXF1YW50dW0gIDdFKzMgICAgIE5hTiAgIC0+IDAKK2Rxc2FtcTE2MTMgc2FtZXF1YW50dW0gIDdFKzMgICAgLTdFKzMgIC0+IDEKK2Rxc2FtcTE2MTQgc2FtZXF1YW50dW0gIDdFKzMgICAgLTcgICAgIC0+IDAKK2Rxc2FtcTE2MTUgc2FtZXF1YW50dW0gIDdFKzMgICAgLTdFLTMgIC0+IDAKK2Rxc2FtcTE2MTYgc2FtZXF1YW50dW0gIDdFKzMgICAgLTBFLTMgIC0+IDAKK2Rxc2FtcTE2MTcgc2FtZXF1YW50dW0gIDdFKzMgICAgLTAgICAgIC0+IDAKK2Rxc2FtcTE2MTggc2FtZXF1YW50dW0gIDdFKzMgICAgLTBFKzMgIC0+IDEKK2Rxc2FtcTE2MTkgc2FtZXF1YW50dW0gIDdFKzMgICAgIDBFLTMgIC0+IDAKK2Rxc2FtcTE2MjAgc2FtZXF1YW50dW0gIDdFKzMgICAgIDAgICAgIC0+IDAKK2Rxc2FtcTE2MjEgc2FtZXF1YW50dW0gIDdFKzMgICAgIDBFKzMgIC0+IDEKK2Rxc2FtcTE2MjIgc2FtZXF1YW50dW0gIDdFKzMgICAgIDdFLTMgIC0+IDAKK2Rxc2FtcTE2MjMgc2FtZXF1YW50dW0gIDdFKzMgICAgIDcgICAgIC0+IDAKK2Rxc2FtcTE2MjQgc2FtZXF1YW50dW0gIDdFKzMgICAgIDdFKzMgIC0+IDEKK2Rxc2FtcTE2MjUgc2FtZXF1YW50dW0gIDdFKzMgICAgIHNOYU4gIC0+IDAKKworZHFzYW1xMTcxMCBzYW1lcXVhbnR1bSAgc05hTiAgICAtSW5mICAgLT4gMAorZHFzYW1xMTcxMSBzYW1lcXVhbnR1bSAgc05hTiAgICAgSW5mICAgLT4gMAorZHFzYW1xMTcxMiBzYW1lcXVhbnR1bSAgc05hTiAgICAgTmFOICAgLT4gMQorZHFzYW1xMTcxMyBzYW1lcXVhbnR1bSAgc05hTiAgICAtN0UrMyAgLT4gMAorZHFzYW1xMTcxNCBzYW1lcXVhbnR1bSAgc05hTiAgICAtNyAgICAgLT4gMAorZHFzYW1xMTcxNSBzYW1lcXVhbnR1bSAgc05hTiAgICAtN0UtMyAgLT4gMAorZHFzYW1xMTcxNiBzYW1lcXVhbnR1bSAgc05hTiAgICAtMEUtMyAgLT4gMAorZHFzYW1xMTcxNyBzYW1lcXVhbnR1bSAgc05hTiAgICAtMCAgICAgLT4gMAorZHFzYW1xMTcxOCBzYW1lcXVhbnR1bSAgc05hTiAgICAtMEUrMyAgLT4gMAorZHFzYW1xMTcxOSBzYW1lcXVhbnR1bSAgc05hTiAgICAgMEUtMyAgLT4gMAorZHFzYW1xMTcyMCBzYW1lcXVhbnR1bSAgc05hTiAgICAgMCAgICAgLT4gMAorZHFzYW1xMTcyMSBzYW1lcXVhbnR1bSAgc05hTiAgICAgMEUrMyAgLT4gMAorZHFzYW1xMTcyMiBzYW1lcXVhbnR1bSAgc05hTiAgICAgN0UtMyAgLT4gMAorZHFzYW1xMTcyMyBzYW1lcXVhbnR1bSAgc05hTiAgICAgNyAgICAgLT4gMAorZHFzYW1xMTcyNCBzYW1lcXVhbnR1bSAgc05hTiAgICAgN0UrMyAgLT4gMAorZHFzYW1xMTcyNSBzYW1lcXVhbnR1bSAgc05hTiAgICAgc05hTiAgLT4gMQorLS0gbm9pc3kgTmFOcworZHFzYW1xMTczMCBzYW1lcXVhbnR1bSAgc05hTjMgICAgc05hTjMgLT4gMQorZHFzYW1xMTczMSBzYW1lcXVhbnR1bSAgc05hTjMgICAgc05hTjQgLT4gMQorZHFzYW1xMTczMiBzYW1lcXVhbnR1bSAgIE5hTjMgICAgIE5hTjMgLT4gMQorZHFzYW1xMTczMyBzYW1lcXVhbnR1bSAgIE5hTjMgICAgIE5hTjQgLT4gMQorZHFzYW1xMTczNCBzYW1lcXVhbnR1bSAgc05hTjMgICAgIDMgICAgLT4gMAorZHFzYW1xMTczNSBzYW1lcXVhbnR1bSAgIE5hTjMgICAgIDMgICAgLT4gMAorZHFzYW1xMTczNiBzYW1lcXVhbnR1bSAgICAgIDQgICAgc05hTjQgLT4gMAorZHFzYW1xMTczNyBzYW1lcXVhbnR1bSAgICAgIDMgICAgIE5hTjMgLT4gMAorZHFzYW1xMTczOCBzYW1lcXVhbnR1bSAgICBJbmYgICAgc05hTjQgLT4gMAorZHFzYW1xMTczOSBzYW1lcXVhbnR1bSAgIC1JbmYgICAgIE5hTjMgLT4gMAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2NhbGVCLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2NhbGVCLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1ZGM1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFTY2FsZUIuZGVjVGVzdApAQCAtMCwwICsxLDI2MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBkcVNjYWxlYkIuZGVjVGVzdCAtLSBzY2FsZSBhIGRlY1F1YWQgYnkgcG93ZXJzIG9mIDEwICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDM0CittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIE1heCB8cmhzfCBpcyAyKig2MTQ0KzM0KSA9IDEyMzU2CisKKy0tIFNhbml0eSBjaGVja3MKK2Rxc2NiMDAxIHNjYWxlYiAgICAgICA3LjUwICAgMTAgLT4gNy41MEUrMTAKK2Rxc2NiMDAyIHNjYWxlYiAgICAgICA3LjUwICAgIDMgLT4gNy41MEUrMworZHFzY2IwMDMgc2NhbGViICAgICAgIDcuNTAgICAgMiAtPiA3NTAKK2Rxc2NiMDA0IHNjYWxlYiAgICAgICA3LjUwICAgIDEgLT4gNzUuMAorZHFzY2IwMDUgc2NhbGViICAgICAgIDcuNTAgICAgMCAtPiA3LjUwCitkcXNjYjAwNiBzY2FsZWIgICAgICAgNy41MCAgIC0xIC0+IDAuNzUwCitkcXNjYjAwNyBzY2FsZWIgICAgICAgNy41MCAgIC0yIC0+IDAuMDc1MAorZHFzY2IwMDggc2NhbGViICAgICAgIDcuNTAgIC0xMCAtPiA3LjUwRS0xMAorZHFzY2IwMDkgc2NhbGViICAgICAgLTcuNTAgICAgMyAtPiAtNy41MEUrMworZHFzY2IwMTAgc2NhbGViICAgICAgLTcuNTAgICAgMiAtPiAtNzUwCitkcXNjYjAxMSBzY2FsZWIgICAgICAtNy41MCAgICAxIC0+IC03NS4wCitkcXNjYjAxMiBzY2FsZWIgICAgICAtNy41MCAgICAwIC0+IC03LjUwCitkcXNjYjAxMyBzY2FsZWIgICAgICAtNy41MCAgIC0xIC0+IC0wLjc1MAorCistLSBJbmZpbml0aWVzCitkcXNjYjAxNCBzY2FsZWIgIEluZmluaXR5ICAgMSAtPiBJbmZpbml0eQorZHFzY2IwMTUgc2NhbGViICAtSW5maW5pdHkgIDIgLT4gLUluZmluaXR5CitkcXNjYjAxNiBzY2FsZWIgIEluZmluaXR5ICAtMSAtPiBJbmZpbml0eQorZHFzY2IwMTcgc2NhbGViICAtSW5maW5pdHkgLTIgLT4gLUluZmluaXR5CisKKy0tIE5leHQgdHdvIGFyZSBzb21ld2hhdCB1bmRlZmluZWQgaW4gNzU0cjsgdHJlYXQgYXMgbm9uLWludGVnZXIKK2Rxc2NiMDE4IHNjYWxlYiAgMTAgIEluZmluaXR5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwMTkgc2NhbGViICAxMCAtSW5maW5pdHkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5hTnMgYXJlIHVuZGVmaW5lZCBpbiA3NTRyOyBhc3N1bWUgdXN1YWwgcHJvY2Vzc2luZworLS0gTmFOcywgMCBwYXlsb2FkCitkcXNjYjAyMSBzY2FsZWIgICAgICAgICBOYU4gIDEgLT4gTmFOCitkcXNjYjAyMiBzY2FsZWIgICAgICAgIC1OYU4gLTEgLT4gLU5hTgorZHFzY2IwMjMgc2NhbGViICAgICAgICBzTmFOICAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwMjQgc2NhbGViICAgICAgIC1zTmFOICAxIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDI1IHNjYWxlYiAgICA0ICAgIE5hTiAgICAtPiBOYU4KK2Rxc2NiMDI2IHNjYWxlYiAtSW5mICAgLU5hTiAgICAtPiAtTmFOCitkcXNjYjAyNyBzY2FsZWIgICAgNCAgIHNOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAyOCBzY2FsZWIgIEluZiAgLXNOYU4gICAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBub24taW50ZWdlciBSSFMKK2Rxc2NiMDMwIHNjYWxlYiAgMS4yMyAgICAxICAgIC0+ICAxMi4zCitkcXNjYjAzMSBzY2FsZWIgIDEuMjMgICAgMS4wMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAzMiBzY2FsZWIgIDEuMjMgICAgMS4xICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAzMyBzY2FsZWIgIDEuMjMgICAgMS4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAzNCBzY2FsZWIgIDEuMjMgICAgMC4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAzNSBzY2FsZWIgIDEuMjMgICAgMC4xMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjAzNiBzY2FsZWIgIDEuMjMgICAgMC45OTk5OTk5OTkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwMzcgc2NhbGViICAxLjIzICAgLTEgICAgLT4gIDAuMTIzCitkcXNjYjA2MTQgc2NhbGViICAxLjIzICAgLTEuMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwMzkgc2NhbGViICAxLjIzICAgLTEuMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwNDAgc2NhbGViICAxLjIzICAgLTEuMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwNDEgc2NhbGViICAxLjIzICAgLTAuMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwNDIgc2NhbGViICAxLjIzICAgLTAuMTEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwNDMgc2NhbGViICAxLjIzICAgLTAuOTk5OTk5OTk5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDQ0IHNjYWxlYiAgMS4yMyAgICAwLjEgICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjA0NSBzY2FsZWIgIDEuMjMgICAgMUUrMSAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2IwNDYgc2NhbGViICAxLjIzICAgIDEuMTIzNEUrNiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMDQ3IHNjYWxlYiAgMS4yMyAgICAxLjEyM0UrNCAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG91dC1vZiByYW5nZSBSSFMKK2Rxc2NiMTIwIHNjYWxlYiAgMS4yMyAgICAxMjM1NSAgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcXNjYjEyMSBzY2FsZWIgIDEuMjMgICAgMTIzNTYgICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFzY2IxMjIgc2NhbGViICAxLjIzICAgIDEyMzU3ICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiMTIzIHNjYWxlYiAgMS4yMyAgICAxMjM1OCAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjEyNCBzY2FsZWIgIDEuMjMgICAtMTIzNTUgICAgICAgLT4gIDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFzY2IxMjUgc2NhbGViICAxLjIzICAgLTEyMzU2ICAgICAgIC0+ICAwRS02MTc2IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2Rxc2NiMTI2IHNjYWxlYiAgMS4yMyAgIC0xMjM1NyAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjEyNyBzY2FsZWIgIDEuMjMgICAtMTIzNTggICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOYU5zLCBub24tMCBwYXlsb2FkCistLSBwcm9wYWdhdGluZyBOYU5zCitkcXNjYjg2MSBzY2FsZWIgIE5hTjAxICAgLUluZiAgICAgLT4gIE5hTjEKK2Rxc2NiODYyIHNjYWxlYiAtTmFOMDIgICAtMTAwMCAgICAtPiAtTmFOMgorZHFzY2I4NjMgc2NhbGViICBOYU4wMyAgICAxMDAwICAgIC0+ICBOYU4zCitkcXNjYjg2NCBzY2FsZWIgIE5hTjA0ICAgIEluZiAgICAgLT4gIE5hTjQKK2Rxc2NiODY1IHNjYWxlYiAgTmFOMDUgICAgTmFONjEgICAtPiAgTmFONQorZHFzY2I4NjYgc2NhbGViIC1JbmYgICAgIC1OYU43MSAgIC0+IC1OYU43MQorZHFzY2I4Njcgc2NhbGViIC0xMDAwICAgICBOYU44MSAgIC0+ICBOYU44MQorZHFzY2I4Njggc2NhbGViICAxMDAwICAgICBOYU45MSAgIC0+ICBOYU45MQorZHFzY2I4Njkgc2NhbGViICBJbmYgICAgICBOYU4xMDEgIC0+ICBOYU4xMDEKK2Rxc2NiODcxIHNjYWxlYiAgc05hTjAxMSAgLUluZiAgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjg3MiBzY2FsZWIgIHNOYU4wMTIgIC0xMDAwICAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2I4NzMgc2NhbGViIC1zTmFOMDEzICAgMTAwMCAgIC0+IC1OYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiODc0IHNjYWxlYiAgc05hTjAxNCAgIE5hTjE3MSAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjg3NSBzY2FsZWIgIHNOYU4wMTUgIHNOYU4xODEgLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2I4NzYgc2NhbGViICBOYU4wMTYgICBzTmFOMTkxIC0+ICBOYU4xOTEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiODc3IHNjYWxlYiAtSW5mICAgICAgc05hTjIwMSAtPiAgTmFOMjAxIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjg3OCBzY2FsZWIgLTEwMDAgICAgIHNOYU4yMTEgLT4gIE5hTjIxMSBJbnZhbGlkX29wZXJhdGlvbgorZHFzY2I4Nzkgc2NhbGViICAxMDAwICAgIC1zTmFOMjIxIC0+IC1OYU4yMjEgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2NiODgwIHNjYWxlYiAgSW5mICAgICAgc05hTjIzMSAtPiAgTmFOMjMxIEludmFsaWRfb3BlcmF0aW9uCitkcXNjYjg4MSBzY2FsZWIgIE5hTjAyNSAgIHNOYU4yNDEgLT4gIE5hTjI0MSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmaW5pdGVzCitkcXNjYjA1MSBzY2FsZWIgICAgICAgICAgNyAgIC0yICAtPiAwLjA3CitkcXNjYjA1MiBzY2FsZWIgICAgICAgICAtNyAgIC0yICAtPiAtMC4wNworZHFzY2IwNTMgc2NhbGViICAgICAgICAgNzUgICAtMiAgLT4gMC43NQorZHFzY2IwNTQgc2NhbGViICAgICAgICAtNzUgICAtMiAgLT4gLTAuNzUKK2Rxc2NiMDU1IHNjYWxlYiAgICAgICA3LjUwICAgLTIgIC0+IDAuMDc1MAorZHFzY2IwNTYgc2NhbGViICAgICAgLTcuNTAgICAtMiAgLT4gLTAuMDc1MAorZHFzY2IwNTcgc2NhbGViICAgICAgIDcuNTAwICAtMiAgLT4gMC4wNzUwMAorZHFzY2IwNTggc2NhbGViICAgICAgLTcuNTAwICAtMiAgLT4gLTAuMDc1MDAKK2Rxc2NiMDYxIHNjYWxlYiAgICAgICAgICA3ICAgLTEgIC0+IDAuNworZHFzY2IwNjIgc2NhbGViICAgICAgICAgLTcgICAtMSAgLT4gLTAuNworZHFzY2IwNjMgc2NhbGViICAgICAgICAgNzUgICAtMSAgLT4gNy41CitkcXNjYjA2NCBzY2FsZWIgICAgICAgIC03NSAgIC0xICAtPiAtNy41CitkcXNjYjA2NSBzY2FsZWIgICAgICAgNy41MCAgIC0xICAtPiAwLjc1MAorZHFzY2IwNjYgc2NhbGViICAgICAgLTcuNTAgICAtMSAgLT4gLTAuNzUwCitkcXNjYjA2NyBzY2FsZWIgICAgICAgNy41MDAgIC0xICAtPiAwLjc1MDAKK2Rxc2NiMDY4IHNjYWxlYiAgICAgIC03LjUwMCAgLTEgIC0+IC0wLjc1MDAKK2Rxc2NiMDcxIHNjYWxlYiAgICAgICAgICA3ICAgIDAgIC0+IDcKK2Rxc2NiMDcyIHNjYWxlYiAgICAgICAgIC03ICAgIDAgIC0+IC03CitkcXNjYjA3MyBzY2FsZWIgICAgICAgICA3NSAgICAwICAtPiA3NQorZHFzY2IwNzQgc2NhbGViICAgICAgICAtNzUgICAgMCAgLT4gLTc1CitkcXNjYjA3NSBzY2FsZWIgICAgICAgNy41MCAgICAwICAtPiA3LjUwCitkcXNjYjA3NiBzY2FsZWIgICAgICAtNy41MCAgICAwICAtPiAtNy41MAorZHFzY2IwNzcgc2NhbGViICAgICAgIDcuNTAwICAgMCAgLT4gNy41MDAKK2Rxc2NiMDc4IHNjYWxlYiAgICAgIC03LjUwMCAgIDAgIC0+IC03LjUwMAorZHFzY2IwODEgc2NhbGViICAgICAgICAgIDcgICAgMSAgLT4gN0UrMQorZHFzY2IwODIgc2NhbGViICAgICAgICAgLTcgICAgMSAgLT4gLTdFKzEKK2Rxc2NiMDgzIHNjYWxlYiAgICAgICAgIDc1ICAgIDEgIC0+IDcuNUUrMgorZHFzY2IwODQgc2NhbGViICAgICAgICAtNzUgICAgMSAgLT4gLTcuNUUrMgorZHFzY2IwODUgc2NhbGViICAgICAgIDcuNTAgICAgMSAgLT4gNzUuMAorZHFzY2IwODYgc2NhbGViICAgICAgLTcuNTAgICAgMSAgLT4gLTc1LjAKK2Rxc2NiMDg3IHNjYWxlYiAgICAgICA3LjUwMCAgIDEgIC0+IDc1LjAwCitkcXNjYjA4OCBzY2FsZWIgICAgICAtNy41MDAgICAxICAtPiAtNzUuMDAKK2Rxc2NiMDkxIHNjYWxlYiAgICAgICAgICA3ICAgIDIgIC0+IDdFKzIKK2Rxc2NiMDkyIHNjYWxlYiAgICAgICAgIC03ICAgIDIgIC0+IC03RSsyCitkcXNjYjA5MyBzY2FsZWIgICAgICAgICA3NSAgICAyICAtPiA3LjVFKzMKK2Rxc2NiMDk0IHNjYWxlYiAgICAgICAgLTc1ICAgIDIgIC0+IC03LjVFKzMKK2Rxc2NiMDk1IHNjYWxlYiAgICAgICA3LjUwICAgIDIgIC0+IDc1MAorZHFzY2IwOTYgc2NhbGViICAgICAgLTcuNTAgICAgMiAgLT4gLTc1MAorZHFzY2IwOTcgc2NhbGViICAgICAgIDcuNTAwICAgMiAgLT4gNzUwLjAKK2Rxc2NiMDk4IHNjYWxlYiAgICAgIC03LjUwMCAgIDIgIC0+IC03NTAuMAorCistLSB6ZXJvcworZHFzY2IxMTEgc2NhbGViICAgICAgICAgIDAgIDEgLT4gMEUrMQorZHFzY2IxMTIgc2NhbGViICAgICAgICAgLTAgIDIgLT4gLTBFKzIKK2Rxc2NiMTEzIHNjYWxlYiAgICAgICAwRSs0ICAzIC0+IDBFKzcKK2Rxc2NiMTE0IHNjYWxlYiAgICAgIC0wRSs0ICA0IC0+IC0wRSs4CitkcXNjYjExNSBzY2FsZWIgICAgIDAuMDAwMCAgNSAtPiAwRSsxCitkcXNjYjExNiBzY2FsZWIgICAgLTAuMDAwMCAgNiAtPiAtMEUrMgorZHFzY2IxMTcgc2NhbGViICAgICAgMEUtMTQxIDcgLT4gMEUtMTM0CitkcXNjYjExOCBzY2FsZWIgICAgIC0wRS0xNDEgOCAtPiAtMEUtMTMzCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcXNjYjEzMiBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICArNjE0NCAtPiBJbmZpbml0eSAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2Rxc2NiMTMzIHNjYWxlYiAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICsxMCAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcXNjYjEzNCBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICArMSAgLT4gSW5maW5pdHkgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFzY2IxMzUgc2NhbGViICA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgIDAgIC0+IDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXNjYjEzNiBzY2FsZWIgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAtMSAgLT4gOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDMKK2Rxc2NiMTM3IHNjYWxlYiAgMUUtNjE0MyAgICAgICAgICAgKzEgIC0+IDFFLTYxNDIKK2Rxc2NiMTYxNCBzY2FsZWIgIDFFLTYxNDMgICAgICAgICAgIC0wICAtPiAxRS02MTQzCitkcXNjYjEzOSBzY2FsZWIgIDFFLTYxNDMgICAgICAgICAgIC0xICAtPiAxRS02MTQ0ICAgICAgICAgIFN1Ym5vcm1hbAorZHFzY2IxNDAgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgKzEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQyCitkcXNjYjE0MSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2Rxc2NiMTQyIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjE0MyBzY2FsZWIgIDFFLTYxNzYgICAgICAgICAgKzEgIC0+IDFFLTYxNzUgICAgICAgICBTdWJub3JtYWwKK2Rxc2NiMTQ0IHNjYWxlYiAgMUUtNjE3NiAgICAgICAgICAtMCAgLT4gMUUtNjE3NiAgICAgICAgIFN1Ym5vcm1hbAorZHFzY2IxNDUgc2NhbGViICAxRS02MTc2ICAgICAgICAgIC0xICAtPiAwRS02MTc2ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitkcXNjYjE1MCBzY2FsZWIgIC0xRS02MTc2ICAgICAgICAgKzEgIC0+IC0xRS02MTc1ICAgICAgICBTdWJub3JtYWwKK2Rxc2NiMTUxIHNjYWxlYiAgLTFFLTYxNzYgICAgICAgICAtMCAgLT4gLTFFLTYxNzYgICAgICAgIFN1Ym5vcm1hbAorZHFzY2IxNTIgc2NhbGViICAtMUUtNjE3NiAgICAgICAgIC0xICAtPiAtMEUtNjE3NiAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFzY2IxNTMgc2NhbGViICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgKzEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MgorZHFzY2IxNTQgc2NhbGViICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgKzAgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MworZHFzY2IxNTUgc2NhbGViICAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgLTEgIC0+IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjE1NiBzY2FsZWIgIC0xRS02MTQzICAgICAgICAgICsxICAtPiAtMUUtNjE0MgorZHFzY2IxNTcgc2NhbGViICAtMUUtNjE0MyAgICAgICAgICAtMCAgLT4gLTFFLTYxNDMKK2Rxc2NiMTU4IHNjYWxlYiAgLTFFLTYxNDMgICAgICAgICAgLTEgIC0+IC0xRS02MTQ0ICAgICAgICAgIFN1Ym5vcm1hbAorZHFzY2IxNTkgc2NhbGViICAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkcXNjYjE2MCBzY2FsZWIgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCArMCAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0CitkcXNjYjE2MSBzY2FsZWIgIC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAtMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQzCitkcXNjYjE2MiBzY2FsZWIgIC05RSs2MTQ0ICAgICAgICAgICsxICAtPiAtSW5maW5pdHkgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHFzY2IxNjMgc2NhbGViICAtMUUrNjE0NCAgICAgICAgICArMSAgLT4gLUluZmluaXR5ICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBPcmlnYW1pCistLSAodGhlc2UgY2hlY2sgdGhhdCBvdmVyZmxvdyBpcyBiZWluZyBkb25lIGNvcnJlY3RseSkKK2Rxc2NiMTcxIHNjYWxlYiAgIDEwMDBFKzYxMDkgICsxIC0+IDEuMDAwRSs2MTEzCitkcXNjYjE3MiBzY2FsZWIgICAxMDAwRSs2MTEwICArMSAtPiAxLjAwMEUrNjExNAorZHFzY2IxNzMgc2NhbGViICAgMTAwMEUrNjExMSAgKzEgLT4gMS4wMDAwRSs2MTE1ICAgICAgICAgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE3NCBzY2FsZWIgICAxMDAwRSs2MTEyICArMSAtPiAxLjAwMDAwRSs2MTE2ICAgICAgICAgICAgICAgICAgIENsYW1wZWQKK2Rxc2NiMTc1IHNjYWxlYiAgIDEwMDBFKzYxMTMgICsxIC0+IDEuMDAwMDAwRSs2MTE3ICAgICAgICAgICAgICAgICAgQ2xhbXBlZAorZHFzY2IxNzYgc2NhbGViICAgMTAwMEUrNjExNCAgKzEgLT4gMS4wMDAwMDAwRSs2MTE4ICAgICAgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE3NyBzY2FsZWIgICAxMDAwRSs2MTMxICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjEzNSAgICAgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE3OCBzY2FsZWIgICAxMDAwRSs2MTMyICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzYgICAgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE3OSBzY2FsZWIgICAxMDAwRSs2MTMzICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTM3ICAgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE4MCBzY2FsZWIgICAxMDAwRSs2MTM0ICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjEzOCAgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE4MSBzY2FsZWIgICAxMDAwRSs2MTM1ICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxMzkgICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE4MiBzY2FsZWIgICAxMDAwRSs2MTM2ICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQwICAgICAgICAgICBDbGFtcGVkCitkcXNjYjE4MyBzY2FsZWIgICAxMDAwRSs2MTM3ICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0MSAgICAgICAgICBDbGFtcGVkCitkcXNjYjE4NCBzY2FsZWIgICAxMDAwRSs2MTM4ICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDIgICAgICAgICBDbGFtcGVkCitkcXNjYjE4NSBzY2FsZWIgICAxMDAwRSs2MTM5ICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSs2MTQzICAgICAgICBDbGFtcGVkCitkcXNjYjE4NiBzY2FsZWIgICAxMDAwRSs2MTQwICArMSAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrNjE0NCAgICAgICBDbGFtcGVkCitkcXNjYjE4NyBzY2FsZWIgICAxMDAwRSs2MTQxICArMSAtPiBJbmZpbml0eSAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gYW5kIGEgZmV3IG1vcmUgc3Vibm9ybWFsIHRydW5jYXRpb25zCistLSAodGhlc2UgY2hlY2sgdGhhdCB1bmRlcmZsb3cgaXMgYmVpbmcgZG9uZSBjb3JyZWN0bHkpCitkcXNjYjIyMSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgMCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKK2Rxc2NiMjIyIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ0IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIyMyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMiAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ1IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIyNCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMyAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDYgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjI1IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC00ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ3IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIyNiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtNSAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQ4IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIyNyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtNiAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDkgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjI4IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC03ICAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTUwIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIyOSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtOCAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTUxIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIzMCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtOSAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTIgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjMxIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xMCAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTUzIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIzMiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMTEgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTU0IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIzMyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMTIgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTUgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjM0IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xMyAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTU2IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIzNSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMTQgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwRS02MTU3IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIzNiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMTUgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDBFLTYxNTggU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjM3IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xNiAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwRS02MTU5IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIzOCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMTcgLT4gMS4wMDAwMDAwMDAwMDAwMDAwRS02MTYwIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIzOSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMTggLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTYxNjEgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjAyIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0xOSAtPiAxLjAwMDAwMDAwMDAwMDAwRS02MTYyIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIwMyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMjAgLT4gMS4wMDAwMDAwMDAwMDAwRS02MTYzIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIwNCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMjEgLT4gMS4wMDAwMDAwMDAwMDBFLTYxNjQgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjA1IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yMiAtPiAxLjAwMDAwMDAwMDAwRS02MTY1IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIwNiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMjMgLT4gMS4wMDAwMDAwMDAwRS02MTY2IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIwNyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMjQgLT4gMS4wMDAwMDAwMDBFLTYxNjcgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjA4IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yNSAtPiAxLjAwMDAwMDAwRS02MTY4IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIwOSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMjYgLT4gMS4wMDAwMDAwRS02MTY5IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIxMCBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMjcgLT4gMS4wMDAwMDBFLTYxNzAgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjExIHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0yOCAtPiAxLjAwMDAwRS02MTcxIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIxMiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMjkgLT4gMS4wMDAwRS02MTcyIFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIxMyBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMzAgLT4gMS4wMDBFLTYxNzMgU3Vibm9ybWFsIFJvdW5kZWQKK2Rxc2NiMjE0IHNjYWxlYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgIC0zMSAtPiAxLjAwRS02MTc0IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIxNSBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMzIgLT4gMS4wRS02MTc1IFN1Ym5vcm1hbCBSb3VuZGVkCitkcXNjYjIxNiBzY2FsZWIgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAtMzMgLT4gMUUtNjE3NiBTdWJub3JtYWwgUm91bmRlZAorZHFzY2IyMTcgc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTM0IC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHFzY2IyMTggc2NhbGViICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgLTM1IC0+IDBFLTYxNzYgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVNoaWZ0LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU2hpZnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDY5MjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVNoaWZ0LmRlY1Rlc3QKQEAgLTAsMCArMSwyOTggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFTaGlmdC5kZWNUZXN0IC0tIHNoaWZ0IGRlY1F1YWQgY29lZmZpY2llbnQgbGVmdCBvciByaWdodCAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBTYW5pdHkgY2hlY2sKK2Rxc2hpMDAxIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgIDAgIC0+ICAwCitkcXNoaTAwMiBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAyICAtPiAgMAorZHFzaGkwMDMgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgMiAgLT4gIDEwMAorZHFzaGkwMDQgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAzMyAgLT4gIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDA1IHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgMzQgIC0+ICAwCitkcXNoaTAwNiBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgIC0xICAtPiAgMAorZHFzaGkwMDcgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAtMiAgLT4gIDAKK2Rxc2hpMDA4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTEgIC0+ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMKK2Rxc2hpMDA5IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTMzIC0+ICAxCitkcXNoaTAxMCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zNCAtPiAgMAorZHFzaGkwMTEgc2hpZnQgIDk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzMgLT4gIDkKK2Rxc2hpMDEyIHNoaWZ0ICA5OTM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTM0IC0+ICAwCisKKy0tIHJocyBtdXN0IGJlIGFuIGludGVnZXIKK2Rxc2hpMDE1IHNoaWZ0ICAgICAgICAxICAgIDEuNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDE2IHNoaWZ0ICAgICAgICAxICAgIDEuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDE3IHNoaWZ0ICAgICAgICAxICAgIDAuMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDE4IHNoaWZ0ICAgICAgICAxICAgIDAuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDE5IHNoaWZ0ICAgICAgICAxICAgIDFFKzEgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDIwIHNoaWZ0ICAgICAgICAxICAgIDFFKzk5ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDIxIHNoaWZ0ICAgICAgICAxICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDIyIHNoaWZ0ICAgICAgICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB8cmhzfCA8PSBwcmVjaXNpb24KK2Rxc2hpMDI1IHNoaWZ0ICAgICAgICAxICAgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDI2IHNoaWZ0ICAgICAgICAxICAgIC0zNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDI3IHNoaWZ0ICAgICAgICAxICAgICAzNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpMDI4IHNoaWZ0ICAgICAgICAxICAgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gZnVsbCBzaGlmdGluZyBwYXR0ZXJuCitkcXNoaTAzMCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgIC0zNCAgLT4gMAorZHFzaGkwMzEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMzMgIC0+IDEKK2Rxc2hpMDMyIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTMyICAtPiAxMgorZHFzaGkwMzMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMzEgIC0+IDEyMworZHFzaGkwMzQgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMzAgIC0+IDEyMzQKK2Rxc2hpMDM1IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTI5ICAtPiAxMjM0NQorZHFzaGkwMzYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjggIC0+IDEyMzQ1NgorZHFzaGkwMzcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjcgIC0+IDEyMzQ1NjcKK2Rxc2hpMDM4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTI2ICAtPiAxMjM0NTY3OAorZHFzaGkwMzkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjUgIC0+IDEyMzQ1Njc4OQorZHFzaGkwNDAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjQgIC0+IDEyMzQ1Njc4OTAKK2Rxc2hpMDQxIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTIzICAtPiAxMjM0NTY3ODkwMQorZHFzaGkwNDIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjIgIC0+IDEyMzQ1Njc4OTAxMgorZHFzaGkwNDMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMjEgIC0+IDEyMzQ1Njc4OTAxMjMKK2Rxc2hpMDQ0IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTIwICAtPiAxMjM0NTY3ODkwMTIzNAorZHFzaGkwNDUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTkgIC0+IDEyMzQ1Njc4OTAxMjM0NQorZHFzaGkwNDcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTggIC0+IDEyMzQ1Njc4OTAxMjM0NTYKK2Rxc2hpMDQ4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTE3ICAtPiAxMjM0NTY3ODkwMTIzNDU2NworZHFzaGkwNDkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTYgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3OAorZHFzaGkwNTAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTUgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkKK2Rxc2hpMDUxIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTE0ICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MAorZHFzaGkwNTIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTMgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMQorZHFzaGkwNTMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTIgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIKK2Rxc2hpMDU0IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTExICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFzaGkwNTUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMTAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHFzaGkwNTYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtOSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUKK2Rxc2hpMDU3IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTggICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1NgorZHFzaGkwNTggc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtNyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NworZHFzaGkwNTkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtNiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2NzgKK2Rxc2hpMDYwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTUgICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OQorZHFzaGkwNjEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtNCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MAorZHFzaGkwNjIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMyAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEKK2Rxc2hpMDYzIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgLTIgICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMgorZHFzaGkwNjQgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMworZHFzaGkwNjUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICAtMCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKKworZHFzaGkwNjYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQKK2Rxc2hpMDY3IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzEgICAtPiAyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwCitkcXNoaTA2OCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyICAgLT4gMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMAorZHFzaGkwNjkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMyAgIC0+IDQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAKK2Rxc2hpMDcwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzQgICAtPiA1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwCitkcXNoaTA3MSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs1ICAgLT4gNjc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMAorZHFzaGkwNzIgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArNiAgIC0+IDc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAKK2Rxc2hpMDczIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzcgICAtPiA4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwCitkcXNoaTA3NCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICs4ICAgLT4gOTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMAorZHFzaGkwNzUgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArOSAgIC0+ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAKK2Rxc2hpMDc2IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzEwICAtPiAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwCitkcXNoaTA3NyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxMSAgLT4gMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMAorZHFzaGkwNzggc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTIgIC0+IDM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAKK2Rxc2hpMDc5IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzEzICAtPiA0NTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwCitkcXNoaTA4MCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxNCAgLT4gNTY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMAorZHFzaGkwODEgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTUgIC0+IDY3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDgyIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE2ICAtPiA3ODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA4MyBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsxNyAgLT4gODkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwODQgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMTggIC0+IDkwMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDg1IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzE5ICAtPiAgMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA4NiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyMCAgLT4gMTIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwODcgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjEgIC0+IDIzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDg4IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzIyICAtPiAzNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA4OSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyMyAgLT4gNDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwOTAgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjQgIC0+IDU2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDkxIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI1ICAtPiA2Nzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA5MiBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyNiAgLT4gNzg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwOTMgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMjcgIC0+IDg5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDk0IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzI4ICAtPiA5MDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA5NSBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICsyOSAgLT4gIDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwOTYgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMzAgIC0+IDEyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMDk3IHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzMxICAtPiAyMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXNoaTA5OCBzaGlmdCAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgICAgICAgICszMiAgLT4gMzQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzaGkwOTkgc2hpZnQgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAgICAgICArMzMgIC0+IDQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMTAwIHNoaWZ0ICAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgICAgICAgKzM0ICAtPiAwCisKKy0tIHplcm9zCitkcXNoaTI3MCBzaGlmdCAgMEUtMTAgICAgICAgICAgICAgICsyOSAgIC0+ICAgMEUtMTAKK2Rxc2hpMjcxIHNoaWZ0ICAwRS0xMCAgICAgICAgICAgICAgLTI5ICAgLT4gICAwRS0xMAorZHFzaGkyNzIgc2hpZnQgIDAuMDAwICAgICAgICAgICAgICArMjkgICAtPiAgIDAuMDAwCitkcXNoaTI3MyBzaGlmdCAgMC4wMDAgICAgICAgICAgICAgIC0yOSAgIC0+ICAgMC4wMDAKK2Rxc2hpMjc0IHNoaWZ0ICAwRSsxMCAgICAgICAgICAgICAgKzI5ICAgLT4gICAwRSsxMAorZHFzaGkyNzUgc2hpZnQgIDBFKzEwICAgICAgICAgICAgICAtMjkgICAtPiAgIDBFKzEwCitkcXNoaTI3NiBzaGlmdCAtMEUtMTAgICAgICAgICAgICAgICsyOSAgIC0+ICAtMEUtMTAKK2Rxc2hpMjc3IHNoaWZ0IC0wRS0xMCAgICAgICAgICAgICAgLTI5ICAgLT4gIC0wRS0xMAorZHFzaGkyNzggc2hpZnQgLTAuMDAwICAgICAgICAgICAgICArMjkgICAtPiAgLTAuMDAwCitkcXNoaTI3OSBzaGlmdCAtMC4wMDAgICAgICAgICAgICAgIC0yOSAgIC0+ICAtMC4wMDAKK2Rxc2hpMjgwIHNoaWZ0IC0wRSsxMCAgICAgICAgICAgICAgKzI5ICAgLT4gIC0wRSsxMAorZHFzaGkyODEgc2hpZnQgLTBFKzEwICAgICAgICAgICAgICAtMjkgICAtPiAgLTBFKzEwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitkcXNoaTE0MSBzaGlmdCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgIC0xICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQzCitkcXNoaTE0MiBzaGlmdCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgIC0zMyAtPiA5RSs2MTExCitkcXNoaTE0MyBzaGlmdCAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAxICAtPiA5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MEUrNjE0NAorZHFzaGkxNDQgc2hpZnQgIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAgMzMgLT4gOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQKK2Rxc2hpMTQ1IHNoaWZ0ICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDBFLTYxNDMKK2Rxc2hpMTQ2IHNoaWZ0ICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzIC0+IDBFLTYxNDMKK2Rxc2hpMTQ3IHNoaWZ0ICAxRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtNjE0MgorZHFzaGkxNDggc2hpZnQgIDFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxMTAKK2Rxc2hpMTUxIHNoaWZ0ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTEgIC0+IDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQKK2Rxc2hpMTUyIHNoaWZ0ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTMzIC0+IDFFLTYxNzYKK2Rxc2hpMTUzIHNoaWZ0ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDEgIC0+IDBFLTYxNzYKK2Rxc2hpMTU0IHNoaWZ0ICAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDMzIC0+IDBFLTYxNzYKK2Rxc2hpMTU1IHNoaWZ0ICA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTEgIC0+IDkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQKK2Rxc2hpMTU2IHNoaWZ0ICA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTMzIC0+IDlFLTYxNzYKK2Rxc2hpMTU3IHNoaWZ0ICA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDEgIC0+IDBFLTYxNzYKK2Rxc2hpMTU4IHNoaWZ0ICA5LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDMzIC0+IDBFLTYxNzYKK2Rxc2hpMTYwIHNoaWZ0ICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IDBFLTYxNzYKK2Rxc2hpMTYxIHNoaWZ0ICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTMzIC0+IDBFLTYxNzYKK2Rxc2hpMTYyIHNoaWZ0ICAxRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtNjE3NQorZHFzaGkxNjMgc2hpZnQgIDFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMgLT4gMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMKKy0tICBuZWdhdGl2ZXMKK2Rxc2hpMTcxIHNoaWZ0IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrNjE0NCAgICAgLTEgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQzCitkcXNoaTE3MiBzaGlmdCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgIC0zMyAtPiAtOUUrNjExMQorZHFzaGkxNzMgc2hpZnQgLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5RSs2MTQ0ICAgICAgMSAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwRSs2MTQ0CitkcXNoaTE3NCBzaGlmdCAtOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzYxNDQgICAgICAzMyAtPiAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzYxNDQKK2Rxc2hpMTc1IHNoaWZ0IC0xRS02MTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IC0wRS02MTQzCitkcXNoaTE3NiBzaGlmdCAtMUUtNjE0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMyAtPiAtMEUtNjE0MworZHFzaGkxNzcgc2hpZnQgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtNjE0MgorZHFzaGkxNzggc2hpZnQgLTFFLTYxNDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTEwCitkcXNoaTE4MSBzaGlmdCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgIC0xICAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0NAorZHFzaGkxODIgc2hpZnQgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMzMgLT4gLTFFLTYxNzYKK2Rxc2hpMTgzIHNoaWZ0IC0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgIDEgIC0+IC0wRS02MTc2CitkcXNoaTE4NCBzaGlmdCAtMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAzMyAtPiAtMEUtNjE3NgorZHFzaGkxODUgc2hpZnQgLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAtMSAgLT4gLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDQKK2Rxc2hpMTg2IHNoaWZ0IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUtNjE0MyAgICAgLTMzIC0+IC05RS02MTc2CitkcXNoaTE4NyBzaGlmdCAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFLTYxNDMgICAgICAxICAtPiAtMEUtNjE3NgorZHFzaGkxODggc2hpZnQgLTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzICAgICAgMzMgLT4gLTBFLTYxNzYKK2Rxc2hpMTkwIHNoaWZ0IC0xRS02MTc2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgIC0+IC0wRS02MTc2CitkcXNoaTE5MSBzaGlmdCAtMUUtNjE3NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zMyAtPiAtMEUtNjE3NgorZHFzaGkxOTIgc2hpZnQgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtNjE3NQorZHFzaGkxOTMgc2hpZnQgLTFFLTYxNzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMgLT4gLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRS02MTQzCisKKy0tIG1vcmUgbmVnYXRpdmVzIChvZiBzYW5pdGllcykKK2Rxc2hpMjAxIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wICAgIDAgIC0+IC0wCitkcXNoaTIwMiBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMCAgICAyICAtPiAtMAorZHFzaGkyMDMgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgICAgMiAgLT4gLTEwMAorZHFzaGkyMDQgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEgICAzMyAgLT4gLTEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2Rxc2hpMjA1IHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xICAgMzQgIC0+IC0wCitkcXNoaTIwNiBzaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSAgIC0xICAtPiAtMAorZHFzaGkyMDcgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAgICAtMiAgLT4gLTAKK2Rxc2hpMjA4IHNoaWZ0IC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTEgIC0+IC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjMKK2Rxc2hpMjA5IHNoaWZ0IC0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTMzIC0+IC0xCitkcXNoaTIxMCBzaGlmdCAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCAgIC0zNCAtPiAtMAorZHFzaGkyMTEgc2hpZnQgLTk5MzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQgICAtMzMgLT4gLTkKK2Rxc2hpMjEyIHNoaWZ0IC05OTM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0ICAgLTM0IC0+IC0wCisKKworLS0gU3BlY2lhbHM7IE5hTnMgYXJlIGhhbmRsZWQgYXMgdXN1YWwKK2Rxc2hpNzgxIHNoaWZ0IC1JbmYgIC04ICAgICAtPiAtSW5maW5pdHkKK2Rxc2hpNzgyIHNoaWZ0IC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2Rxc2hpNzgzIHNoaWZ0IC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK2Rxc2hpNzg0IHNoaWZ0IC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK2Rxc2hpNzg1IHNoaWZ0IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2Rxc2hpNzg2IHNoaWZ0IC1JbmYgICA4ICAgICAtPiAtSW5maW5pdHkKK2Rxc2hpNzg3IHNoaWZ0IC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpNzg4IHNoaWZ0IC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpNzg5IHNoaWZ0IC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpNzkwIHNoaWZ0IC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpNzkxIHNoaWZ0ICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpNzkyIHNoaWZ0ICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpNzkzIHNoaWZ0ICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpNzk0IHNoaWZ0ICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHFzaGk4MDAgc2hpZnQgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MDEgc2hpZnQgIEluZiAgLTggICAgIC0+IEluZmluaXR5CitkcXNoaTgwMiBzaGlmdCAgSW5mICAtMSAgICAgLT4gSW5maW5pdHkKK2Rxc2hpODAzIHNoaWZ0ICBJbmYgIC0wICAgICAtPiBJbmZpbml0eQorZHFzaGk4MDQgc2hpZnQgIEluZiAgIDAgICAgIC0+IEluZmluaXR5CitkcXNoaTgwNSBzaGlmdCAgSW5mICAgMSAgICAgLT4gSW5maW5pdHkKK2Rxc2hpODA2IHNoaWZ0ICBJbmYgICA4ICAgICAtPiBJbmZpbml0eQorZHFzaGk4MDcgc2hpZnQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MDggc2hpZnQgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MDkgc2hpZnQgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MTAgc2hpZnQgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MTEgc2hpZnQgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MTIgc2hpZnQgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MTMgc2hpZnQgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MTQgc2hpZnQgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4MTUgc2hpZnQgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXNoaTgyMSBzaGlmdCAgTmFOIC1JbmYgICAgLT4gIE5hTgorZHFzaGk4MjIgc2hpZnQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2Rxc2hpODIzIHNoaWZ0ICBOYU4gLTEgICAgICAtPiAgTmFOCitkcXNoaTgyNCBzaGlmdCAgTmFOIC0wICAgICAgLT4gIE5hTgorZHFzaGk4MjUgc2hpZnQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2Rxc2hpODI2IHNoaWZ0ICBOYU4gIDEgICAgICAtPiAgTmFOCitkcXNoaTgyNyBzaGlmdCAgTmFOICAxMDAwICAgLT4gIE5hTgorZHFzaGk4Mjggc2hpZnQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2Rxc2hpODI5IHNoaWZ0ICBOYU4gIE5hTiAgICAtPiAgTmFOCitkcXNoaTgzMCBzaGlmdCAtSW5mICBOYU4gICAgLT4gIE5hTgorZHFzaGk4MzEgc2hpZnQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2Rxc2hpODMyIHNoaWZ0IC0xICAgIE5hTiAgICAtPiAgTmFOCitkcXNoaTgzMyBzaGlmdCAtMCAgICBOYU4gICAgLT4gIE5hTgorZHFzaGk4MzQgc2hpZnQgIDAgICAgTmFOICAgIC0+ICBOYU4KK2Rxc2hpODM1IHNoaWZ0ICAxICAgIE5hTiAgICAtPiAgTmFOCitkcXNoaTgzNiBzaGlmdCAgMTAwMCBOYU4gICAgLT4gIE5hTgorZHFzaGk4Mzcgc2hpZnQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZHFzaGk4NDEgc2hpZnQgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg0MiBzaGlmdCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODQzIHNoaWZ0ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NDQgc2hpZnQgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg0NSBzaGlmdCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODQ2IHNoaWZ0ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NDcgc2hpZnQgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg0OCBzaGlmdCAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODQ5IHNoaWZ0ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NTAgc2hpZnQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg1MSBzaGlmdCAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODUyIHNoaWZ0IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NTMgc2hpZnQgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg1NCBzaGlmdCAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODU1IHNoaWZ0ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NTYgc2hpZnQgIDEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg1NyBzaGlmdCAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODU4IHNoaWZ0ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NTkgc2hpZnQgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2Rxc2hpODYxIHNoaWZ0ICBOYU4xICAgLUluZiAgICAtPiAgTmFOMQorZHFzaGk4NjIgc2hpZnQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitkcXNoaTg2MyBzaGlmdCAgTmFOMyAgICAxMDAwICAgLT4gIE5hTjMKK2Rxc2hpODY0IHNoaWZ0ICBOYU40ICAgIEluZiAgICAtPiAgTmFONAorZHFzaGk4NjUgc2hpZnQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitkcXNoaTg2NiBzaGlmdCAtSW5mICAgICBOYU43ICAgLT4gIE5hTjcKK2Rxc2hpODY3IHNoaWZ0IC0xMDAwICAgIE5hTjggICAtPiAgTmFOOAorZHFzaGk4Njggc2hpZnQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitkcXNoaTg2OSBzaGlmdCAgSW5mICAgICtOYU4xMCAgLT4gIE5hTjEwCitkcXNoaTg3MSBzaGlmdCAgc05hTjExICAtSW5mICAgLT4gIE5hTjExICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NzIgc2hpZnQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODczIHNoaWZ0ICBzTmFOMTMgICAxMDAwICAtPiAgTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg3NCBzaGlmdCAgc05hTjE0ICAgTmFOMTcgLT4gIE5hTjE0ICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4NzUgc2hpZnQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODc2IHNoaWZ0ICBOYU4xNiAgIHNOYU4xOSAtPiAgTmFOMTkgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg3NyBzaGlmdCAtSW5mICAgICtzTmFOMjAgLT4gIE5hTjIwICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4Nzggc2hpZnQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODc5IHNoaWZ0ICAxMDAwICAgIHNOYU4yMiAtPiAgTmFOMjIgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg4MCBzaGlmdCAgSW5mICAgICBzTmFOMjMgLT4gIE5hTjIzICBJbnZhbGlkX29wZXJhdGlvbgorZHFzaGk4ODEgc2hpZnQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc2hpODgyIHNoaWZ0IC1OYU4yNiAgICBOYU4yOCAtPiAtTmFOMjYKK2Rxc2hpODgzIHNoaWZ0IC1zTmFOMjcgIHNOYU4yOSAtPiAtTmFOMjcgIEludmFsaWRfb3BlcmF0aW9uCitkcXNoaTg4NCBzaGlmdCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitkcXNoaTg4NSBzaGlmdCAgMTAwMCAgIC1zTmFOMzEgLT4gLU5hTjMxICBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVN1YnRyYWN0LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxU3VidHJhY3QuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDU3MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVN1YnRyYWN0LmRlY1Rlc3QKQEAgLTAsMCArMSw2MzUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHFTdWJ0cmFjdC5kZWNUZXN0IC0tIGRlY1F1YWQgc3VidHJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBhcmUgZm9yIGRlY1F1YWRzIG9ubHk7IGFsbCBhcmd1bWVudHMgYXJlCistLSByZXByZXNlbnRhYmxlIGluIGEgZGVjUXVhZAorZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitkcXN1YjAwMSBzdWJ0cmFjdCAgMCAgIDAgIC0+ICcwJworZHFzdWIwMDIgc3VidHJhY3QgIDEgICAxICAtPiAnMCcKK2Rxc3ViMDAzIHN1YnRyYWN0ICAxICAgMiAgLT4gJy0xJworZHFzdWIwMDQgc3VidHJhY3QgIDIgICAxICAtPiAnMScKK2Rxc3ViMDA1IHN1YnRyYWN0ICAyICAgMiAgLT4gJzAnCitkcXN1YjAwNiBzdWJ0cmFjdCAgMyAgIDIgIC0+ICcxJworZHFzdWIwMDcgc3VidHJhY3QgIDIgICAzICAtPiAnLTEnCisKK2Rxc3ViMDExIHN1YnRyYWN0IC0wICAgMCAgLT4gJy0wJworZHFzdWIwMTIgc3VidHJhY3QgLTEgICAxICAtPiAnLTInCitkcXN1YjAxMyBzdWJ0cmFjdCAtMSAgIDIgIC0+ICctMycKK2Rxc3ViMDE0IHN1YnRyYWN0IC0yICAgMSAgLT4gJy0zJworZHFzdWIwMTUgc3VidHJhY3QgLTIgICAyICAtPiAnLTQnCitkcXN1YjAxNiBzdWJ0cmFjdCAtMyAgIDIgIC0+ICctNScKK2Rxc3ViMDE3IHN1YnRyYWN0IC0yICAgMyAgLT4gJy01JworCitkcXN1YjAyMSBzdWJ0cmFjdCAgMCAgLTAgIC0+ICcwJworZHFzdWIwMjIgc3VidHJhY3QgIDEgIC0xICAtPiAnMicKK2Rxc3ViMDIzIHN1YnRyYWN0ICAxICAtMiAgLT4gJzMnCitkcXN1YjAyNCBzdWJ0cmFjdCAgMiAgLTEgIC0+ICczJworZHFzdWIwMjUgc3VidHJhY3QgIDIgIC0yICAtPiAnNCcKK2Rxc3ViMDI2IHN1YnRyYWN0ICAzICAtMiAgLT4gJzUnCitkcXN1YjAyNyBzdWJ0cmFjdCAgMiAgLTMgIC0+ICc1JworCitkcXN1YjAzMCBzdWJ0cmFjdCAgMTEgIDEgIC0+IDEwCitkcXN1YjAzMSBzdWJ0cmFjdCAgMTAgIDEgIC0+ICA5CitkcXN1YjAzMiBzdWJ0cmFjdCAgOSAgIDEgIC0+ICA4CitkcXN1YjAzMyBzdWJ0cmFjdCAgMSAgIDEgIC0+ICAwCitkcXN1YjAzNCBzdWJ0cmFjdCAgMCAgIDEgIC0+IC0xCitkcXN1YjAzNSBzdWJ0cmFjdCAtMSAgIDEgIC0+IC0yCitkcXN1YjAzNiBzdWJ0cmFjdCAtOSAgIDEgIC0+IC0xMAorZHFzdWIwMzcgc3VidHJhY3QgLTEwICAxICAtPiAtMTEKK2Rxc3ViMDM4IHN1YnRyYWN0IC0xMSAgMSAgLT4gLTEyCisKK2Rxc3ViMDQwIHN1YnRyYWN0ICc1Ljc1JyAnMy4zJyAgLT4gJzIuNDUnCitkcXN1YjA0MSBzdWJ0cmFjdCAnNScgICAgJy0zJyAgIC0+ICc4JworZHFzdWIwNDIgc3VidHJhY3QgJy01JyAgICctMycgICAtPiAnLTInCitkcXN1YjA0MyBzdWJ0cmFjdCAnLTcnICAgJzIuNScgIC0+ICctOS41JworZHFzdWIwNDQgc3VidHJhY3QgJzAuNycgICcwLjMnICAtPiAnMC40JworZHFzdWIwNDUgc3VidHJhY3QgJzEuMycgICcwLjMnICAtPiAnMS4wJworZHFzdWIwNDYgc3VidHJhY3QgJzEuMjUnICcxLjI1JyAtPiAnMC4wMCcKKworZHFzdWIwNTAgc3VidHJhY3QgJzEuMjM0NTY3ODknICAgICcxLjAwMDAwMDAwJyAtPiAnMC4yMzQ1Njc4OScKK2Rxc3ViMDUxIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgICAnMS4wMDAwMDA4OScgLT4gJzAuMjM0NTY3MDAnCisKK2Rxc3ViMDYwIHN1YnRyYWN0ICc3MCcgICAgJzEwMDAwZSszNCcgLT4gJy0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFzdWIwNjEgc3VidHJhY3QgJzcwMCcgICAgJzEwMDAwZSszNCcgLT4gJy0xLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFzdWIwNjIgc3VidHJhY3QgJzcwMDAnICAgICcxMDAwMGUrMzQnIC0+ICctOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTlFKzM3JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViMDYzIHN1YnRyYWN0ICc3MDAwMCcgICAgJzEwMDAwZSszNCcgLT4gJy05Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5M0UrMzcnIFJvdW5kZWQKK2Rxc3ViMDY0IHN1YnRyYWN0ICc3MDAwMDAnICAgICcxMDAwMGUrMzQnIC0+ICctOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MzBFKzM3JyBSb3VuZGVkCisgIC0tIHN5bW1ldHJ5OgorZHFzdWIwNjUgc3VidHJhY3QgJzEwMDAwZSszNCcgICAgJzcwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViMDY2IHN1YnRyYWN0ICcxMDAwMGUrMzQnICAgICc3MDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzgnIEluZXhhY3QgUm91bmRlZAorZHFzdWIwNjcgc3VidHJhY3QgJzEwMDAwZSszNCcgICAgJzcwMDAnIC0+ICc5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OUUrMzcnIEluZXhhY3QgUm91bmRlZAorZHFzdWIwNjggc3VidHJhY3QgJzEwMDAwZSszNCcgICAgJzcwMDAwJyAtPiAnOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTNFKzM3JyBSb3VuZGVkCitkcXN1YjA2OSBzdWJ0cmFjdCAnMTAwMDBlKzM0JyAgICAnNzAwMDAwJyAtPiAnOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5MzBFKzM3JyBSb3VuZGVkCisKKyAgLS0gc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzCitkcXN1YjA5MCBzdWJ0cmFjdCAnMDAuMCcgICAgJzAuMCcgIC0+ICcwLjAnCitkcXN1YjA5MSBzdWJ0cmFjdCAnMDAuMCcgICAgJzAuMDAnIC0+ICcwLjAwJworZHFzdWIwOTIgc3VidHJhY3QgJzAuMDAnICAgICcwMC4wJyAtPiAnMC4wMCcKK2Rxc3ViMDkzIHN1YnRyYWN0ICcwMC4wJyAgICAnMC4wMCcgLT4gJzAuMDAnCitkcXN1YjA5NCBzdWJ0cmFjdCAnMC4wMCcgICAgJzAwLjAnIC0+ICcwLjAwJworZHFzdWIwOTUgc3VidHJhY3QgJzMnICAgICcuMycgICAtPiAnMi43JworZHFzdWIwOTYgc3VidHJhY3QgJzMuJyAgICcuMycgICAtPiAnMi43JworZHFzdWIwOTcgc3VidHJhY3QgJzMuMCcgICcuMycgICAtPiAnMi43JworZHFzdWIwOTggc3VidHJhY3QgJzMuMDAnICcuMycgICAtPiAnMi43MCcKK2Rxc3ViMDk5IHN1YnRyYWN0ICczJyAgICAnMycgICAgLT4gJzAnCitkcXN1YjEwMCBzdWJ0cmFjdCAnMycgICAgJyszJyAgIC0+ICcwJworZHFzdWIxMDEgc3VidHJhY3QgJzMnICAgICctMycgICAtPiAnNicKK2Rxc3ViMTAyIHN1YnRyYWN0ICczJyAgICAnMC4zJyAgLT4gJzIuNycKK2Rxc3ViMTAzIHN1YnRyYWN0ICczLicgICAnMC4zJyAgLT4gJzIuNycKK2Rxc3ViMTA0IHN1YnRyYWN0ICczLjAnICAnMC4zJyAgLT4gJzIuNycKK2Rxc3ViMTA1IHN1YnRyYWN0ICczLjAwJyAnMC4zJyAgLT4gJzIuNzAnCitkcXN1YjEwNiBzdWJ0cmFjdCAnMycgICAgJzMuMCcgIC0+ICcwLjAnCitkcXN1YjEwNyBzdWJ0cmFjdCAnMycgICAgJyszLjAnIC0+ICcwLjAnCitkcXN1YjEwOCBzdWJ0cmFjdCAnMycgICAgJy0zLjAnIC0+ICc2LjAnCisKKy0tIHRoZSBhYm92ZSBhbGwgZnJvbSBhZGQ7IG1hc3NhZ2VkIGFuZCBleHRlbmRlZC4gIE5vdyBzb21lIG5ldyBvbmVzLi4uCistLSBbcGFydGljdWxhcmx5IGltcG9ydGFudCBmb3IgY29tcGFyaXNvbnNdCistLSBOQjogLXhFLTggYmVsb3cgd2VyZSBub24tZXhwb25lbnRzIHByZS1BTlNJIFgzLTI3NCwgYW5kIC0xRS03IG9yIDBFLTcKKy0tIHdpdGggaW5wdXQgcm91bmRpbmcuCitkcXN1YjEyMCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg0JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTVFLTgnCitkcXN1YjEyMSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg1JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTRFLTgnCitkcXN1YjEyMiBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg2JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTNFLTgnCitkcXN1YjEyMyBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg3JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTJFLTgnCitkcXN1YjEyNCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg4JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTFFLTgnCitkcXN1YjEyNSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg5JyAgICAnMTAuMjM0NTY3ODknICAtPiAnMEUtOCcKK2Rxc3ViMTI2IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTAnICAgICcxMC4yMzQ1Njc4OScgIC0+ICcxRS04JworZHFzdWIxMjcgc3VidHJhY3QgICcxMC4yMzQ1Njc5MScgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzJFLTgnCitkcXN1YjEyOCBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkyJyAgICAnMTAuMjM0NTY3ODknICAtPiAnM0UtOCcKK2Rxc3ViMTI5IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTMnICAgICcxMC4yMzQ1Njc4OScgIC0+ICc0RS04JworZHFzdWIxMzAgc3VidHJhY3QgICcxMC4yMzQ1Njc5NCcgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzVFLTgnCitkcXN1YjEzMSBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgxJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTVFLTgnCitkcXN1YjEzMiBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgyJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTRFLTgnCitkcXN1YjEzMyBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgzJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTNFLTgnCitkcXN1YjEzNCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg0JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTJFLTgnCitkcXN1YjEzNSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg1JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTFFLTgnCitkcXN1YjEzNiBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg2JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnMEUtOCcKK2Rxc3ViMTM3IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODcnICAgICcxMC4yMzQ1Njc4NicgIC0+ICcxRS04JworZHFzdWIxMzggc3VidHJhY3QgICcxMC4yMzQ1Njc4OCcgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzJFLTgnCitkcXN1YjEzOSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg5JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnM0UtOCcKK2Rxc3ViMTQwIHN1YnRyYWN0ICAnMTAuMjM0NTY3OTAnICAgICcxMC4yMzQ1Njc4NicgIC0+ICc0RS04JworZHFzdWIxNDEgc3VidHJhY3QgICcxMC4yMzQ1Njc5MScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzVFLTgnCitkcXN1YjE0MiBzdWJ0cmFjdCAgJzEnICAgICAgICAgICAgICAnMC45OTk5OTk5OTknICAtPiAnMUUtOScKK2Rxc3ViMTQzIHN1YnRyYWN0ICAnMC45OTk5OTk5OTknICAgICcxJyAgICAgICAgICAgIC0+ICctMUUtOScKK2Rxc3ViMTQ0IHN1YnRyYWN0ICAnLTEwLjIzNDU2NzgwJyAgICctMTAuMjM0NTY3ODYnIC0+ICc2RS04JworZHFzdWIxNDUgc3VidHJhY3QgICctMTAuMjM0NTY3OTAnICAgJy0xMC4yMzQ1Njc4NicgLT4gJy00RS04JworZHFzdWIxNDYgc3VidHJhY3QgICctMTAuMjM0NTY3OTEnICAgJy0xMC4yMzQ1Njc4NicgLT4gJy01RS04JworCistLSBhZGRpdGlvbmFsIHNjYWxlZCBhcml0aG1ldGljIHRlc3RzIFswLjk3IHByb2JsZW1dCitkcXN1YjE2MCBzdWJ0cmFjdCAnMCcgICAgICcuMScgICAgICAtPiAnLTAuMScKK2Rxc3ViMTYxIHN1YnRyYWN0ICcwMCcgICAgJy45Nzk4MycgIC0+ICctMC45Nzk4MycKK2Rxc3ViMTYyIHN1YnRyYWN0ICcwJyAgICAgJy45JyAgICAgIC0+ICctMC45JworZHFzdWIxNjMgc3VidHJhY3QgJzAnICAgICAnMC4xMDInICAgLT4gJy0wLjEwMicKK2Rxc3ViMTY0IHN1YnRyYWN0ICcwJyAgICAgJy40JyAgICAgIC0+ICctMC40JworZHFzdWIxNjUgc3VidHJhY3QgJzAnICAgICAnLjMwNycgICAgLT4gJy0wLjMwNycKK2Rxc3ViMTY2IHN1YnRyYWN0ICcwJyAgICAgJy40MzgyMicgIC0+ICctMC40MzgyMicKK2Rxc3ViMTY3IHN1YnRyYWN0ICcwJyAgICAgJy45MTEnICAgIC0+ICctMC45MTEnCitkcXN1YjE2OCBzdWJ0cmFjdCAnLjAnICAgICcuMDInICAgICAtPiAnLTAuMDInCitkcXN1YjE2OSBzdWJ0cmFjdCAnMDAnICAgICcuMzkyJyAgICAtPiAnLTAuMzkyJworZHFzdWIxNzAgc3VidHJhY3QgJzAnICAgICAnLjI2JyAgICAgLT4gJy0wLjI2JworZHFzdWIxNzEgc3VidHJhY3QgJzAnICAgICAnMC41MScgICAgLT4gJy0wLjUxJworZHFzdWIxNzIgc3VidHJhY3QgJzAnICAgICAnLjIyMzQnICAgLT4gJy0wLjIyMzQnCitkcXN1YjE3MyBzdWJ0cmFjdCAnMCcgICAgICcuMicgICAgICAtPiAnLTAuMicKK2Rxc3ViMTc0IHN1YnRyYWN0ICcuMCcgICAgJy4wMDA4JyAgIC0+ICctMC4wMDA4JworLS0gMC4gb24gbGVmdAorZHFzdWIxODAgc3VidHJhY3QgJzAuMCcgICAgICctLjEnICAgICAgLT4gJzAuMScKK2Rxc3ViMTgxIHN1YnRyYWN0ICcwLjAwJyAgICAnLS45Nzk4MycgIC0+ICcwLjk3OTgzJworZHFzdWIxODIgc3VidHJhY3QgJzAuMCcgICAgICctLjknICAgICAgLT4gJzAuOScKK2Rxc3ViMTgzIHN1YnRyYWN0ICcwLjAnICAgICAnLTAuMTAyJyAgIC0+ICcwLjEwMicKK2Rxc3ViMTg0IHN1YnRyYWN0ICcwLjAnICAgICAnLS40JyAgICAgIC0+ICcwLjQnCitkcXN1YjE4NSBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMzA3JyAgICAtPiAnMC4zMDcnCitkcXN1YjE4NiBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uNDM4MjInICAtPiAnMC40MzgyMicKK2Rxc3ViMTg3IHN1YnRyYWN0ICcwLjAnICAgICAnLS45MTEnICAgIC0+ICcwLjkxMScKK2Rxc3ViMTg4IHN1YnRyYWN0ICcwLjAnICAgICAnLS4wMicgICAgIC0+ICcwLjAyJworZHFzdWIxODkgc3VidHJhY3QgJzAuMDAnICAgICctLjM5MicgICAgLT4gJzAuMzkyJworZHFzdWIxOTAgc3VidHJhY3QgJzAuMCcgICAgICctLjI2JyAgICAgLT4gJzAuMjYnCitkcXN1YjE5MSBzdWJ0cmFjdCAnMC4wJyAgICAgJy0wLjUxJyAgICAtPiAnMC41MScKK2Rxc3ViMTkyIHN1YnRyYWN0ICcwLjAnICAgICAnLS4yMjM0JyAgIC0+ICcwLjIyMzQnCitkcXN1YjE5MyBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMicgICAgICAtPiAnMC4yJworZHFzdWIxOTQgc3VidHJhY3QgJzAuMCcgICAgICctLjAwMDgnICAgLT4gJzAuMDAwOCcKKy0tIG5lZ2F0aXZlcyBvZiBzYW1lCitkcXN1YjIwMCBzdWJ0cmFjdCAnMCcgICAgICctLjEnICAgICAgLT4gJzAuMScKK2Rxc3ViMjAxIHN1YnRyYWN0ICcwMCcgICAgJy0uOTc5ODMnICAtPiAnMC45Nzk4MycKK2Rxc3ViMjAyIHN1YnRyYWN0ICcwJyAgICAgJy0uOScgICAgICAtPiAnMC45JworZHFzdWIyMDMgc3VidHJhY3QgJzAnICAgICAnLTAuMTAyJyAgIC0+ICcwLjEwMicKK2Rxc3ViMjA0IHN1YnRyYWN0ICcwJyAgICAgJy0uNCcgICAgICAtPiAnMC40JworZHFzdWIyMDUgc3VidHJhY3QgJzAnICAgICAnLS4zMDcnICAgIC0+ICcwLjMwNycKK2Rxc3ViMjA2IHN1YnRyYWN0ICcwJyAgICAgJy0uNDM4MjInICAtPiAnMC40MzgyMicKK2Rxc3ViMjA3IHN1YnRyYWN0ICcwJyAgICAgJy0uOTExJyAgICAtPiAnMC45MTEnCitkcXN1YjIwOCBzdWJ0cmFjdCAnLjAnICAgICctLjAyJyAgICAgLT4gJzAuMDInCitkcXN1YjIwOSBzdWJ0cmFjdCAnMDAnICAgICctLjM5MicgICAgLT4gJzAuMzkyJworZHFzdWIyMTAgc3VidHJhY3QgJzAnICAgICAnLS4yNicgICAgIC0+ICcwLjI2JworZHFzdWIyMTEgc3VidHJhY3QgJzAnICAgICAnLTAuNTEnICAgIC0+ICcwLjUxJworZHFzdWIyMTIgc3VidHJhY3QgJzAnICAgICAnLS4yMjM0JyAgIC0+ICcwLjIyMzQnCitkcXN1YjIxMyBzdWJ0cmFjdCAnMCcgICAgICctLjInICAgICAgLT4gJzAuMicKK2Rxc3ViMjE0IHN1YnRyYWN0ICcuMCcgICAgJy0uMDAwOCcgICAtPiAnMC4wMDA4JworCistLSBtb3JlIGZpeGVkLCBMSFMgc3dhcHMgW3JlYWxseSB0aGUgc2FtZSBhcyB0ZXN0Y2FzZXMgdW5kZXIgYWRkXQorZHFzdWIyMjAgc3VidHJhY3QgJy01NjI2N0UtMTInIDAgIC0+ICctNS42MjY3RS04JworZHFzdWIyMjEgc3VidHJhY3QgJy01NjI2N0UtMTEnIDAgIC0+ICctNS42MjY3RS03JworZHFzdWIyMjIgc3VidHJhY3QgJy01NjI2N0UtMTAnIDAgIC0+ICctMC4wMDAwMDU2MjY3JworZHFzdWIyMjMgc3VidHJhY3QgJy01NjI2N0UtOScgIDAgIC0+ICctMC4wMDAwNTYyNjcnCitkcXN1YjIyNCBzdWJ0cmFjdCAnLTU2MjY3RS04JyAgMCAgLT4gJy0wLjAwMDU2MjY3JworZHFzdWIyMjUgc3VidHJhY3QgJy01NjI2N0UtNycgIDAgIC0+ICctMC4wMDU2MjY3JworZHFzdWIyMjYgc3VidHJhY3QgJy01NjI2N0UtNicgIDAgIC0+ICctMC4wNTYyNjcnCitkcXN1YjIyNyBzdWJ0cmFjdCAnLTU2MjY3RS01JyAgMCAgLT4gJy0wLjU2MjY3JworZHFzdWIyMjggc3VidHJhY3QgJy01NjI2N0UtMicgIDAgIC0+ICctNTYyLjY3JworZHFzdWIyMjkgc3VidHJhY3QgJy01NjI2N0UtMScgIDAgIC0+ICctNTYyNi43JworZHFzdWIyMzAgc3VidHJhY3QgJy01NjI2N0UtMCcgIDAgIC0+ICctNTYyNjcnCistLSBzeW1tZXRyeSAuLi4KK2Rxc3ViMjQwIHN1YnRyYWN0IDAgJy01NjI2N0UtMTInICAtPiAnNS42MjY3RS04JworZHFzdWIyNDEgc3VidHJhY3QgMCAnLTU2MjY3RS0xMScgIC0+ICc1LjYyNjdFLTcnCitkcXN1YjI0MiBzdWJ0cmFjdCAwICctNTYyNjdFLTEwJyAgLT4gJzAuMDAwMDA1NjI2NycKK2Rxc3ViMjQzIHN1YnRyYWN0IDAgJy01NjI2N0UtOScgICAtPiAnMC4wMDAwNTYyNjcnCitkcXN1YjI0NCBzdWJ0cmFjdCAwICctNTYyNjdFLTgnICAgLT4gJzAuMDAwNTYyNjcnCitkcXN1YjI0NSBzdWJ0cmFjdCAwICctNTYyNjdFLTcnICAgLT4gJzAuMDA1NjI2NycKK2Rxc3ViMjQ2IHN1YnRyYWN0IDAgJy01NjI2N0UtNicgICAtPiAnMC4wNTYyNjcnCitkcXN1YjI0NyBzdWJ0cmFjdCAwICctNTYyNjdFLTUnICAgLT4gJzAuNTYyNjcnCitkcXN1YjI0OCBzdWJ0cmFjdCAwICctNTYyNjdFLTInICAgLT4gJzU2Mi42NycKK2Rxc3ViMjQ5IHN1YnRyYWN0IDAgJy01NjI2N0UtMScgICAtPiAnNTYyNi43JworZHFzdWIyNTAgc3VidHJhY3QgMCAnLTU2MjY3RS0wJyAgIC0+ICc1NjI2NycKKworLS0gbm93IHNvbWUgbW9yZSBmcm9tIHRoZSAnbmV3JyBhZGQKK2Rxc3ViMzAxIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcwLjIzNDU2Nzg5JworZHFzdWIzMDIgc3VidHJhY3QgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAxMScgLT4gJzAuMjM0NTY3NzgnCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworZHFzdWIzMjEgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCitkcXN1YjMyMiBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5NycKK2Rxc3ViMzIzIHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMC45OTk2JworZHFzdWIzMjQgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcwLjk5OTUnCitkcXN1YjMyNSBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDAnIC0+ICcwLjk5OTgnCitkcXN1YjMyNiBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDEnIC0+ICcwLjk5OTknCitkcXN1YjMyNyBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDInIC0+ICcxLjAwMDAnCitkcXN1YjMyOCBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDMnIC0+ICcxLjAwMDEnCisKKy0tIGludGVybmFsIGJvdW5kYXJpZXMKK2Rxc3ViMzQ2IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3JyAgIC0+ICc5OTk5OTk5OTk5OTkzJworZHFzdWIzNDcgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwJyAgIC0+ICc5OTk5OTk5OTk5OTMwJworZHFzdWIzNDggc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMCcgICAtPiAnOTk5OTk5OTk5OTMwMCcKK2Rxc3ViMzQ5IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwJyAgIC0+ICc5OTk5OTk5OTkzMDAwJworZHFzdWIzNTAgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwJyAgIC0+ICc5OTk5OTk5OTMwMDAwJworZHFzdWIzNTEgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwMCcgICAtPiAnOTk5OTk5OTMwMDAwMCcKK2Rxc3ViMzUyIHN1YnRyYWN0ICc3JyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5OTkzJworZHFzdWIzNTMgc3VidHJhY3QgJzcwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5OTMwJworZHFzdWIzNTQgc3VidHJhY3QgJzcwMCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTk5OTMwMCcKK2Rxc3ViMzU1IHN1YnRyYWN0ICc3MDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTkzMDAwJworZHFzdWIzNTYgc3VidHJhY3QgJzcwMDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTMwMDAwJworZHFzdWIzNTcgc3VidHJhY3QgJzcwMDAwMCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTMwMDAwMCcKKworLS0gemVybyBwcmVzZXJ2YXRpb24KK2Rxc3ViMzYxIHN1YnRyYWN0IDEgJzAuMDAwMScgLT4gJzAuOTk5OScKK2Rxc3ViMzYyIHN1YnRyYWN0IDEgJzAuMDAwMDEnIC0+ICcwLjk5OTk5JworZHFzdWIzNjMgc3VidHJhY3QgMSAnMC4wMDAwMDEnIC0+ICcwLjk5OTk5OScKK2Rxc3ViMzY0IHN1YnRyYWN0IDEgJzAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2Rxc3ViMzY1IHN1YnRyYWN0IDEgJzAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjM2NiBzdWJ0cmFjdCAxICcwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorZHFzdWIzNzAgc3VidHJhY3QgMSAgMCAgLT4gMQorZHFzdWIzNzEgc3VidHJhY3QgMSAwLiAgLT4gMQorZHFzdWIzNzIgc3VidHJhY3QgMSAgLjAgLT4gMS4wCitkcXN1YjM3MyBzdWJ0cmFjdCAxIDAuMCAtPiAxLjAKK2Rxc3ViMzc0IHN1YnRyYWN0ICAwICAxIC0+IC0xCitkcXN1YjM3NSBzdWJ0cmFjdCAwLiAgMSAtPiAtMQorZHFzdWIzNzYgc3VidHJhY3QgIC4wIDEgLT4gLTEuMAorZHFzdWIzNzcgc3VidHJhY3QgMC4wIDEgLT4gLTEuMAorCistLSBsZWFkaW5nIDAgZGlnaXQgYmVmb3JlIHJvdW5kCitkcXN1YjkxMCBzdWJ0cmFjdCAtMTAzNTE5MzYyIC01MTg5Nzk1NS4zIC0+IC01MTYyMTQwNi43CitkcXN1YjkxMSBzdWJ0cmFjdCAxNTk1NzkuNDQ0IDg5ODI3LjUyMjkgLT4gNjk3NTEuOTIxMQorCitkcXN1YjkyMCBzdWJ0cmFjdCAzMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NiAzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2NiAtPiAyOTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViOTIxIHN1YnRyYWN0IDMzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2IDMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTY1IC0+IDMwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZHFzdWI5MjIgc3VidHJhY3QgMTMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYgMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NjUgLT4gIDk5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk1CitkcXN1YjkyMyBzdWJ0cmFjdCAxMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NiAzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2NCAtPiAgOTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTYKK2Rxc3ViOTI0IHN1YnRyYWN0IDEzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2IDMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTQwIC0+IDEwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyIFJvdW5kZWQKK2Rxc3ViOTI1IHN1YnRyYWN0IDEzMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2IDQzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYwIC0+ICA5MC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHFzdWI5MjYgc3VidHJhY3QgMTMzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYgNDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NjEgLT4gIDg5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5CitkcXN1YjkyNyBzdWJ0cmFjdCAxMzMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NiA0My4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2NiAtPiAgODkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTQKK2Rxc3ViOTI4IHN1YnRyYWN0IDEwMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTIzNDU2IDkxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTY2IC0+ICAgOS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NAorZHFzdWI5Mjkgc3VidHJhY3QgMTAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxMjM0NTYgOTkuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEyMzQ1NjYgLT4gICAxLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk0CisKKy0tIG1vcmUgTEhTIHN3YXBzIFt3ZXJlIGZpeGVkXQorZHFzdWIzOTAgc3VidHJhY3QgJy01NjI2N0UtMTAnICAgMCAtPiAgJy0wLjAwMDAwNTYyNjcnCitkcXN1YjM5MSBzdWJ0cmFjdCAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3JworZHFzdWIzOTIgc3VidHJhY3QgJy01NjI2N0UtNScgICAgMCAtPiAgJy0wLjU2MjY3JworZHFzdWIzOTMgc3VidHJhY3QgJy01NjI2N0UtNCcgICAgMCAtPiAgJy01LjYyNjcnCitkcXN1YjM5NCBzdWJ0cmFjdCAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK2Rxc3ViMzk1IHN1YnRyYWN0ICctNTYyNjdFLTInICAgIDAgLT4gICctNTYyLjY3JworZHFzdWIzOTYgc3VidHJhY3QgJy01NjI2N0UtMScgICAgMCAtPiAgJy01NjI2LjcnCitkcXN1YjM5NyBzdWJ0cmFjdCAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3JworZHFzdWIzOTggc3VidHJhY3QgJy01RS0xMCcgICAgICAgMCAtPiAgJy01RS0xMCcKK2Rxc3ViMzk5IHN1YnRyYWN0ICctNUUtNycgICAgICAgIDAgLT4gICctNUUtNycKK2Rxc3ViNDAwIHN1YnRyYWN0ICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCitkcXN1YjQwMSBzdWJ0cmFjdCAnLTVFLTUnICAgICAgICAwIC0+ICAnLTAuMDAwMDUnCitkcXN1YjQwMiBzdWJ0cmFjdCAnLTVFLTQnICAgICAgICAwIC0+ICAnLTAuMDAwNScKK2Rxc3ViNDAzIHN1YnRyYWN0ICctNUUtMScgICAgICAgIDAgLT4gICctMC41JworZHFzdWI0MDQgc3VidHJhY3QgJy01RTAnICAgICAgICAgMCAtPiAgJy01JworZHFzdWI0MDUgc3VidHJhY3QgJy01RTEnICAgICAgICAgMCAtPiAgJy01MCcKK2Rxc3ViNDA2IHN1YnRyYWN0ICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworZHFzdWI0MDcgc3VidHJhY3QgJy01RTMzJyAgICAgICAgMCAtPiAgJy01MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFzdWI0MDggc3VidHJhY3QgJy01RTM0JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzQnICBSb3VuZGVkCitkcXN1YjQwOSBzdWJ0cmFjdCAnLTVFMzUnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNScgIFJvdW5kZWQKK2Rxc3ViNDEwIHN1YnRyYWN0ICctNUUzNicgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM2JyAgUm91bmRlZAorZHFzdWI0MTEgc3VidHJhY3QgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzIFt3ZXJlIGZpeGVkXQorZHFzdWI0MjAgc3VidHJhY3QgMCAgJy01NjI2N0UtMTAnIC0+ICAnMC4wMDAwMDU2MjY3JworZHFzdWI0MjEgc3VidHJhY3QgMCAgJy01NjI2N0UtNicgIC0+ICAnMC4wNTYyNjcnCitkcXN1YjQyMiBzdWJ0cmFjdCAwICAnLTU2MjY3RS01JyAgLT4gICcwLjU2MjY3JworZHFzdWI0MjMgc3VidHJhY3QgMCAgJy01NjI2N0UtNCcgIC0+ICAnNS42MjY3JworZHFzdWI0MjQgc3VidHJhY3QgMCAgJy01NjI2N0UtMycgIC0+ICAnNTYuMjY3JworZHFzdWI0MjUgc3VidHJhY3QgMCAgJy01NjI2N0UtMicgIC0+ICAnNTYyLjY3JworZHFzdWI0MjYgc3VidHJhY3QgMCAgJy01NjI2N0UtMScgIC0+ICAnNTYyNi43JworZHFzdWI0Mjcgc3VidHJhY3QgMCAgJy01NjI2N0UtMCcgIC0+ICAnNTYyNjcnCitkcXN1YjQyOCBzdWJ0cmFjdCAwICAnLTVFLTEwJyAgICAgLT4gICc1RS0xMCcKK2Rxc3ViNDI5IHN1YnRyYWN0IDAgICctNUUtNycgICAgICAtPiAgJzVFLTcnCitkcXN1YjQzMCBzdWJ0cmFjdCAwICAnLTVFLTYnICAgICAgLT4gICcwLjAwMDAwNScKK2Rxc3ViNDMxIHN1YnRyYWN0IDAgICctNUUtNScgICAgICAtPiAgJzAuMDAwMDUnCitkcXN1YjQzMiBzdWJ0cmFjdCAwICAnLTVFLTQnICAgICAgLT4gICcwLjAwMDUnCitkcXN1YjQzMyBzdWJ0cmFjdCAwICAnLTVFLTEnICAgICAgLT4gICcwLjUnCitkcXN1YjQzNCBzdWJ0cmFjdCAwICAnLTVFMCcgICAgICAgLT4gICc1JworZHFzdWI0MzUgc3VidHJhY3QgMCAgJy01RTEnICAgICAgIC0+ICAnNTAnCitkcXN1YjQzNiBzdWJ0cmFjdCAwICAnLTVFNScgICAgICAgLT4gICc1MDAwMDAnCitkcXN1YjQzNyBzdWJ0cmFjdCAwICAnLTVFMzMnICAgICAgLT4gICc1MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJworZHFzdWI0Mzggc3VidHJhY3QgMCAgJy01RTM0JyAgICAgIC0+ICAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzM0JyAgIFJvdW5kZWQKK2Rxc3ViNDM5IHN1YnRyYWN0IDAgICctNUUzNScgICAgICAtPiAgJzUuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwRSszNScgICBSb3VuZGVkCitkcXN1YjQ0MCBzdWJ0cmFjdCAwICAnLTVFMzYnICAgICAgLT4gICc1LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMEUrMzYnICAgUm91bmRlZAorZHFzdWI0NDEgc3VidHJhY3QgMCAgJy01RTEwMCcgICAgIC0+ICAnNS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBFKzEwMCcgIFJvdW5kZWQKKworCistLSB0cnkgYm9yZGVybGluZSBwcmVjaXNpb24sIHdpdGggY2FycmllcywgZXRjLgorZHFzdWI0NjEgc3VidHJhY3QgJzFFKzE2JyAnMScgICAgICAgIC0+ICc5OTk5OTk5OTk5OTk5OTk5JworZHFzdWI0NjIgc3VidHJhY3QgJzFFKzEyJyAnLTEuMTExJyAgIC0+ICcxMDAwMDAwMDAwMDAxLjExMScKK2Rxc3ViNDYzIHN1YnRyYWN0ICcxLjExMScgICctMUUrMTInICAtPiAnMTAwMDAwMDAwMDAwMS4xMTEnCitkcXN1YjQ2NCBzdWJ0cmFjdCAnLTEnICAgICctMUUrMTYnICAgLT4gJzk5OTk5OTk5OTk5OTk5OTknCitkcXN1YjQ2NSBzdWJ0cmFjdCAnN0UrMTUnICcxJyAgICAgICAgLT4gJzY5OTk5OTk5OTk5OTk5OTknCitkcXN1YjQ2NiBzdWJ0cmFjdCAnN0UrMTInICctMS4xMTEnICAgLT4gJzcwMDAwMDAwMDAwMDEuMTExJworZHFzdWI0Njcgc3VidHJhY3QgJzEuMTExJyAgJy03RSsxMicgIC0+ICc3MDAwMDAwMDAwMDAxLjExMScKK2Rxc3ViNDY4IHN1YnRyYWN0ICctMScgICAgJy03RSsxNScgICAtPiAnNjk5OTk5OTk5OTk5OTk5OScKKworLS0gICAgICAgICAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMSAyMzQ1Njc4OTAxMjM0NQorZHFzdWI0NzAgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTYzJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZHFzdWI0NzEgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTYyJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZHFzdWI0NzIgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTYxJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFzdWI0NzMgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTYwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFzdWI0NzQgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU5JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFzdWI0NzUgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU4JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFzdWI0NzYgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU3JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZHFzdWI0Nzcgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2Rxc3ViNDc4IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OScKK2Rxc3ViNDc5IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OCcKK2Rxc3ViNDgwIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MycgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NycKK2Rxc3ViNDgxIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MicgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NicKK2Rxc3ViNDgyIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NScKK2Rxc3ViNDgzIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1MCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NCcKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcm91bmRpbmc6IGhhbGZfdXAKK2Rxc3ViNTAwIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JworZHFzdWI1MDEgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDIgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDMgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDQgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDUgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDYgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDcgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDggc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MDkgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MTAgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MTEgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MTIgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MTMgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MTQgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MTUgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MTYgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnCitkcXN1YjUxNyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxOCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUxOSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2Rxc3ViNTIwIHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JworZHFzdWI1MjEgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MjIgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MjMgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MjQgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MjUgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MjYgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1Mjcgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI1Mjggc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1Mjkgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MzAgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MzEgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MzIgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MzMgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MzQgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MzUgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1MzYgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnCitkcXN1YjUzNyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzOCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjUzOSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZHFzdWI1NDAgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1NDEgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI1NDIgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZHFzdWI1NTAgc3VidHJhY3QgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknCitkcXN1YjU1MSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1MiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1MyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1NCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1NSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1NiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1NyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1OCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU1OSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU2MCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU2MSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU2MiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU2MyBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU2NCBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU2NSBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMC45OTk5OTk5OTkgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjU2NiBzdWJ0cmFjdCAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcKK2Rxc3ViNTY3IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTY4IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNTY5IHN1YnRyYWN0ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3ltbWV0cnkuLi4KK3JvdW5kaW5nOiBoYWxmX3VwCitkcXN1YjYwMCBzdWJ0cmFjdCAwICAgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknCitkcXN1YjYwMSBzdWJ0cmFjdCAwLjAwMDAwMDAwMSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MDIgc3VidHJhY3QgMC4wMDAwMDEgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjAzIHN1YnRyYWN0IDAuMSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYwNCBzdWJ0cmFjdCAwLjQgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MDUgc3VidHJhY3QgMC40OSAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjA2IHN1YnRyYWN0IDAuNDk5OTk5ICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYwNyBzdWJ0cmFjdCAwLjQ5OTk5OTk5OSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MDggc3VidHJhY3QgMC41ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjA5IHN1YnRyYWN0IDAuNTAwMDAwMDAxICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYxMCBzdWJ0cmFjdCAwLjUwMDAwMSAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MTEgc3VidHJhY3QgMC41MSAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjEyIHN1YnRyYWN0IDAuNiAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYxMyBzdWJ0cmFjdCAwLjkgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MTQgc3VidHJhY3QgMC45OTk5OSAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjE1IHN1YnRyYWN0IDAuOTk5OTk5OTk5ICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYxNiBzdWJ0cmFjdCAxICAgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnCitkcXN1YjYxNyBzdWJ0cmFjdCAxLjAwMDAwMDAwMSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MTggc3VidHJhY3QgMS4wMDAwMSAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjE5IHN1YnRyYWN0IDEuMSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2Rxc3ViNjIwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScKK2Rxc3ViNjIxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYyMiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MjMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjI0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYyNSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MjYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjI3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYyOCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2Mjkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjMwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYzMSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MzIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjMzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYzNCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2MzUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjM2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcKK2Rxc3ViNjM3IHN1YnRyYWN0IDEuMDAwMDAwMDEgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjYzOCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2Mzkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitkcXN1YjY0MCBzdWJ0cmFjdCAwLjQ5OTk5OTk5OSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NDEgc3VidHJhY3QgMC41ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjQyIHN1YnRyYWN0IDAuNTAwMDAwMDAxICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitkcXN1YjY1MCBzdWJ0cmFjdCAwICAgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknCitkcXN1YjY1MSBzdWJ0cmFjdCAwLjAwMDAwMDAwMSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NTIgc3VidHJhY3QgMC4wMDAwMDEgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjUzIHN1YnRyYWN0IDAuMSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY1NCBzdWJ0cmFjdCAwLjQgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NTUgc3VidHJhY3QgMC40OSAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjU2IHN1YnRyYWN0IDAuNDk5OTk5ICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY1NyBzdWJ0cmFjdCAwLjQ5OTk5OTk5OSAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NTggc3VidHJhY3QgMC41ICAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjU5IHN1YnRyYWN0IDAuNTAwMDAwMDAxICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY2MCBzdWJ0cmFjdCAwLjUwMDAwMSAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NjEgc3VidHJhY3QgMC41MSAgICAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjYyIHN1YnRyYWN0IDAuNiAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY2MyBzdWJ0cmFjdCAwLjkgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2NjQgc3VidHJhY3QgMC45OTk5OSAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjY1IHN1YnRyYWN0IDAuOTk5OTk5OTk5ICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitkcXN1YjY2NiBzdWJ0cmFjdCAxICAgICAgICAgICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODgnCitkcXN1YjY2NyBzdWJ0cmFjdCAxLjAwMDAwMDAxICAgICcxMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg5JyAtPiAnLTEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorZHFzdWI2Njggc3VidHJhY3QgMS4wMDAwMSAgICAgICAnMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4OScgLT4gJy0xMjMxMjM0NTU1NTU1NTU1NTU1NTU1NTU1NTY3NDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK2Rxc3ViNjY5IHN1YnRyYWN0IDEuMSAgICAgICAgICAgJzEyMzEyMzQ1NTU1NTU1NTU1NTU1NTU1NTU1Njc0NTY3ODknIC0+ICctMTIzMTIzNDU1NTU1NTU1NTU1NTU1NTU1NTU2NzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKKworLS0gbG90cyBvZiBsZWFkaW5nIHplcm9zIGluIGludGVybWVkaWF0ZSByZXN1bHQsIGFuZCBzaG93aW5nIGVmZmVjdHMgb2YKKy0tIGlucHV0IHJvdW5kaW5nIHdvdWxkIGhhdmUgYWZmZWN0ZWQgdGhlIGZvbGxvd2luZworcm91bmRpbmc6IGhhbGZfdXAKK2Rxc3ViNjcwIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC4xJyAtPiAwLjkKK2Rxc3ViNjcxIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OC45JyAtPiAwLjEKK2Rxc3ViNjcyIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS4xJyAtPiAtMC4xCitkcXN1YjY3MyBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuNScgLT4gLTAuNQorZHFzdWI2NzQgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjknIC0+IC0wLjkKKworcm91bmRpbmc6IGhhbGZfZXZlbgorZHFzdWI2ODAgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjEnIC0+IDAuOQorZHFzdWI2ODEgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg4LjknIC0+IDAuMQorZHFzdWI2ODIgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjEnIC0+IC0wLjEKK2Rxc3ViNjgzIHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS41JyAtPiAtMC41CitkcXN1YjY4NCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuOScgLT4gLTAuOQorCitkcXN1YjY4NSBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODcuMScgLT4gMC45CitkcXN1YjY4NiBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODcuOScgLT4gMC4xCitkcXN1YjY4NyBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OCcgJzEyMzQ1Njc0NTY3ODguMScgLT4gLTAuMQorZHFzdWI2ODggc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODgnICcxMjM0NTY3NDU2Nzg4LjUnIC0+IC0wLjUKK2Rxc3ViNjg5IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg4JyAnMTIzNDU2NzQ1Njc4OC45JyAtPiAtMC45CisKK3JvdW5kaW5nOiBkb3duCitkcXN1YjY5MCBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguMScgLT4gMC45CitkcXN1YjY5MSBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODguOScgLT4gMC4xCitkcXN1YjY5MiBzdWJ0cmFjdCAnMTIzNDU2NzQ1Njc4OScgJzEyMzQ1Njc0NTY3ODkuMScgLT4gLTAuMQorZHFzdWI2OTMgc3VidHJhY3QgJzEyMzQ1Njc0NTY3ODknICcxMjM0NTY3NDU2Nzg5LjUnIC0+IC0wLjUKK2Rxc3ViNjk0IHN1YnRyYWN0ICcxMjM0NTY3NDU2Nzg5JyAnMTIzNDU2NzQ1Njc4OS45JyAtPiAtMC45CisKKy0tIFNwZWNpYWxzCitkcXN1Yjc4MCBzdWJ0cmFjdCAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkcXN1Yjc4MSBzdWJ0cmFjdCAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitkcXN1Yjc4MiBzdWJ0cmFjdCAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CitkcXN1Yjc4MyBzdWJ0cmFjdCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitkcXN1Yjc4NCBzdWJ0cmFjdCAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5CitkcXN1Yjc4NSBzdWJ0cmFjdCAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CitkcXN1Yjc4NyBzdWJ0cmFjdCAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CitkcXN1Yjc4OCBzdWJ0cmFjdCAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitkcXN1Yjc4OSBzdWJ0cmFjdCAtMSAgICAgSW5mICAgLT4gLUluZmluaXR5CitkcXN1Yjc5MCBzdWJ0cmFjdCAgMCAgICAgSW5mICAgLT4gLUluZmluaXR5CitkcXN1Yjc5MSBzdWJ0cmFjdCAgMSAgICAgSW5mICAgLT4gLUluZmluaXR5CitkcXN1Yjc5MiBzdWJ0cmFjdCAgMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CisKK2Rxc3ViODAwIHN1YnRyYWN0ICBJbmYgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4MDEgc3VidHJhY3QgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDIgc3VidHJhY3QgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDMgc3VidHJhY3QgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDQgc3VidHJhY3QgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDUgc3VidHJhY3QgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDYgc3VidHJhY3QgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDcgc3VidHJhY3QgIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDggc3VidHJhY3QgLTEwMDAgLUluZiAgIC0+ICBJbmZpbml0eQorZHFzdWI4MDkgc3VidHJhY3QgLUluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1YjgxMCBzdWJ0cmFjdCAtMSAgICAtSW5mICAgLT4gIEluZmluaXR5CitkcXN1YjgxMSBzdWJ0cmFjdCAtMCAgICAtSW5mICAgLT4gIEluZmluaXR5CitkcXN1YjgxMiBzdWJ0cmFjdCAgMCAgICAtSW5mICAgLT4gIEluZmluaXR5CitkcXN1YjgxMyBzdWJ0cmFjdCAgMSAgICAtSW5mICAgLT4gIEluZmluaXR5CitkcXN1YjgxNCBzdWJ0cmFjdCAgMTAwMCAtSW5mICAgLT4gIEluZmluaXR5CitkcXN1YjgxNSBzdWJ0cmFjdCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CisKK2Rxc3ViODIxIHN1YnRyYWN0ICBOYU4gICBJbmYgICAtPiAgTmFOCitkcXN1YjgyMiBzdWJ0cmFjdCAtTmFOICAgMTAwMCAgLT4gLU5hTgorZHFzdWI4MjMgc3VidHJhY3QgIE5hTiAgIDEgICAgIC0+ICBOYU4KK2Rxc3ViODI0IHN1YnRyYWN0ICBOYU4gICAwICAgICAtPiAgTmFOCitkcXN1YjgyNSBzdWJ0cmFjdCAgTmFOICAtMCAgICAgLT4gIE5hTgorZHFzdWI4MjYgc3VidHJhY3QgIE5hTiAgLTEgICAgIC0+ICBOYU4KK2Rxc3ViODI3IHN1YnRyYWN0ICBOYU4gIC0xMDAwICAtPiAgTmFOCitkcXN1YjgyOCBzdWJ0cmFjdCAgTmFOICAtSW5mICAgLT4gIE5hTgorZHFzdWI4Mjkgc3VidHJhY3QgLU5hTiAgIE5hTiAgIC0+IC1OYU4KK2Rxc3ViODMwIHN1YnRyYWN0IC1JbmYgICBOYU4gICAtPiAgTmFOCitkcXN1YjgzMSBzdWJ0cmFjdCAtMTAwMCAgTmFOICAgLT4gIE5hTgorZHFzdWI4MzIgc3VidHJhY3QgLTEgICAgIE5hTiAgIC0+ICBOYU4KK2Rxc3ViODMzIHN1YnRyYWN0IC0wICAgICBOYU4gICAtPiAgTmFOCitkcXN1YjgzNCBzdWJ0cmFjdCAgMCAgICAgTmFOICAgLT4gIE5hTgorZHFzdWI4MzUgc3VidHJhY3QgIDEgICAgIE5hTiAgIC0+ICBOYU4KK2Rxc3ViODM2IHN1YnRyYWN0ICAxMDAwIC1OYU4gICAtPiAtTmFOCitkcXN1YjgzNyBzdWJ0cmFjdCAgSW5mICAgTmFOICAgLT4gIE5hTgorCitkcXN1Yjg0MSBzdWJ0cmFjdCAgc05hTiAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODQyIHN1YnRyYWN0IC1zTmFOICAxMDAwICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NDMgc3VidHJhY3QgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg0NCBzdWJ0cmFjdCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODQ1IHN1YnRyYWN0ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NDYgc3VidHJhY3QgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg0NyBzdWJ0cmFjdCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODQ4IHN1YnRyYWN0ICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NDkgc3VidHJhY3QgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg1MCBzdWJ0cmFjdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODUxIHN1YnRyYWN0IC1JbmYgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NTIgc3VidHJhY3QgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg1MyBzdWJ0cmFjdCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODU0IHN1YnRyYWN0IC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NTUgc3VidHJhY3QgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg1NiBzdWJ0cmFjdCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViODU3IHN1YnRyYWN0ICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHFzdWI4NTggc3VidHJhY3QgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg1OSBzdWJ0cmFjdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZHFzdWI4NjEgc3VidHJhY3QgIE5hTjAxICAgLUluZiAgICAgLT4gIE5hTjEKK2Rxc3ViODYyIHN1YnRyYWN0IC1OYU4wMiAgIC0xMDAwICAgIC0+IC1OYU4yCitkcXN1Yjg2MyBzdWJ0cmFjdCAgTmFOMDMgICAgMTAwMCAgICAtPiAgTmFOMworZHFzdWI4NjQgc3VidHJhY3QgIE5hTjA0ICAgIEluZiAgICAgLT4gIE5hTjQKK2Rxc3ViODY1IHN1YnRyYWN0ICBOYU4wNSAgICBOYU42MSAgIC0+ICBOYU41CitkcXN1Yjg2NiBzdWJ0cmFjdCAtSW5mICAgICAtTmFONzEgICAtPiAtTmFONzEKK2Rxc3ViODY3IHN1YnRyYWN0IC0xMDAwICAgICBOYU44MSAgIC0+ICBOYU44MQorZHFzdWI4Njggc3VidHJhY3QgIDEwMDAgICAgIE5hTjkxICAgLT4gIE5hTjkxCitkcXN1Yjg2OSBzdWJ0cmFjdCAgSW5mICAgICAgTmFOMTAxICAtPiAgTmFOMTAxCitkcXN1Yjg3MSBzdWJ0cmFjdCAgc05hTjAxMSAgLUluZiAgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3MiBzdWJ0cmFjdCAgc05hTjAxMiAgLTEwMDAgICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3MyBzdWJ0cmFjdCAtc05hTjAxMyAgIDEwMDAgICAtPiAtTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3NCBzdWJ0cmFjdCAgc05hTjAxNCAgIE5hTjE3MSAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3NSBzdWJ0cmFjdCAgc05hTjAxNSAgc05hTjE4MSAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3NiBzdWJ0cmFjdCAgTmFOMDE2ICAgc05hTjE5MSAtPiAgTmFOMTkxIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3NyBzdWJ0cmFjdCAtSW5mICAgICAgc05hTjIwMSAtPiAgTmFOMjAxIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3OCBzdWJ0cmFjdCAtMTAwMCAgICAgc05hTjIxMSAtPiAgTmFOMjExIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg3OSBzdWJ0cmFjdCAgMTAwMCAgICAtc05hTjIyMSAtPiAtTmFOMjIxIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg4MCBzdWJ0cmFjdCAgSW5mICAgICAgc05hTjIzMSAtPiAgTmFOMjMxIEludmFsaWRfb3BlcmF0aW9uCitkcXN1Yjg4MSBzdWJ0cmFjdCAgTmFOMDI1ICAgc05hTjI0MSAtPiAgTmFOMjQxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGVkZ2UgY2FzZSBzcGlsbHMKK2Rxc3ViOTAxIHN1YnRyYWN0ICAyLkUtMyAgMS4wMDIgIC0+IC0xLjAwMAorZHFzdWI5MDIgc3VidHJhY3QgIDIuMEUtMyAgMS4wMDIgIC0+IC0xLjAwMDAKK2Rxc3ViOTAzIHN1YnRyYWN0ICAyLjAwRS0zICAxLjAwMjAgIC0+IC0xLjAwMDAwCitkcXN1YjkwNCBzdWJ0cmFjdCAgMi4wMDBFLTMgIDEuMDAyMDAgIC0+IC0xLjAwMDAwMAorZHFzdWI5MDUgc3VidHJhY3QgIDIuMDAwMEUtMyAgMS4wMDIwMDAgIC0+IC0xLjAwMDAwMDAKK2Rxc3ViOTA2IHN1YnRyYWN0ICAyLjAwMDAwRS0zICAxLjAwMjAwMDAgIC0+IC0xLjAwMDAwMDAwCitkcXN1YjkwNyBzdWJ0cmFjdCAgMi4wMDAwMDBFLTMgIDEuMDAyMDAwMDAgIC0+IC0xLjAwMDAwMDAwMAorZHFzdWI5MDggc3VidHJhY3QgIDIuMDAwMDAwMEUtMyAgMS4wMDIwMDAwMDAgIC0+IC0xLjAwMDAwMDAwMDAKKworLS0gc3Vibm9ybWFscyBhbmQgb3ZlcmZsb3dzIGNvdmVyZWQgdW5kZXIgQWRkCisKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorZHFzdWIxMTI1ICBzdWJ0cmFjdCAxMzBFLTIgIDEyMEUtMiAtPiAwLjEwCitkcXN1YjExMjYgIHN1YnRyYWN0IDEzMEUtMiAgMTJFLTEgIC0+IDAuMTAKK2Rxc3ViMTEyNyAgc3VidHJhY3QgMTMwRS0yICAxRTAgICAgLT4gMC4zMAorZHFzdWIxMTI4ICBzdWJ0cmFjdCAxRTIgICAgIDFFNCAgICAtPiAtOS45RSszCisKKy0tIE51bGwgdGVzdHMKK2Rxc3ViOTk5MCBzdWJ0cmFjdCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2Rxc3ViOTk5MSBzdWJ0cmFjdCAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFUb0ludGVncmFsLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxVG9JbnRlZ3JhbC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNTVkZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RxVG9JbnRlZ3JhbC5kZWNUZXN0CkBAIC0wLDAgKzEsMjU3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxVG9JbnRlZ3JhbC5kZWNUZXN0IC0tIHJvdW5kIFF1YWQgdG8gaW50ZWdyYWwgdmFsdWUgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgdGVzdHMgdGhlIGV4dGVuZGVkIHNwZWNpZmljYXRpb24gJ3JvdW5kLXRvLWludGVncmFsCistLSB2YWx1ZS1leGFjdCcgb3BlcmF0aW9ucyAoZnJvbSBJRUVFIDg1NCwgbGF0ZXIgbW9kaWZpZWQgaW4gNzU0cikuCistLSBBbGwgbm9uLXplcm8gcmVzdWx0cyBhcmUgZGVmaW5lZCBhcyBiZWluZyB0aG9zZSBmcm9tIGVpdGhlciBjb3B5IG9yCistLSBxdWFudGl6ZSwgc28gdGhvc2UgYXJlIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHRlc3RlZCBleHRlbnNpdmVseQorLS0gZWxzZXdoZXJlOyB0aGUgdGVzdHMgaGVyZSBhcmUgZm9yIGludGVncml0eSwgcm91bmRpbmcgbW9kZSwgZXRjLgorLS0gQWxzbywgaXQgaXMgYXNzdW1lZCB0aGUgdGVzdCBoYXJuZXNzIHdpbGwgdXNlIHRoZXNlIHRlc3RzIGZvciBib3RoCistLSBUb0ludGVncmFsRXhhY3QgKHdoaWNoIGRvZXMgc2V0IEluZXhhY3QpIGFuZCB0aGUgZml4ZWQtbmFtZQorLS0gZnVuY3Rpb25zICh3aGljaCBkbyBub3Qgc2V0IEluZXhhY3QpLgorCistLSBOb3RlIHRoYXQgZGVjTnVtYmVyIGltcGxlbWVudHMgYW4gZWFybGllciBkZWZpbml0aW9uIG9mIHRvSW50ZWdyYWwKKy0tIHdoaWNoIG5ldmVyIHNldHMgSW5leGFjdDsgdGhlIGRlY1Rlc3Qgb3BlcmF0b3IgZm9yIHRoYXQgaXMgY2FsbGVkCistLSAndG9pbnRlZ3JhbCcgaW5zdGVhZCBvZiAndG9pbnRlZ3JhbHgnLgorCitleHRlbmRlZDogICAgMQorY2xhbXA6ICAgICAgIDEKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0Mworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkcWludHgwMDEgdG9pbnRlZ3JhbHggICAgICAwICAgICAtPiAgMAorZHFpbnR4MDAyIHRvaW50ZWdyYWx4ICAgICAgMC4wICAgLT4gIDAKK2RxaW50eDAwMyB0b2ludGVncmFseCAgICAgIDAuMSAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAwNCB0b2ludGVncmFseCAgICAgIDAuMiAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAwNSB0b2ludGVncmFseCAgICAgIDAuMyAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAwNiB0b2ludGVncmFseCAgICAgIDAuNCAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAwNyB0b2ludGVncmFseCAgICAgIDAuNSAgIC0+ICAwICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAwOCB0b2ludGVncmFseCAgICAgIDAuNiAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAwOSB0b2ludGVncmFseCAgICAgIDAuNyAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAxMCB0b2ludGVncmFseCAgICAgIDAuOCAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAxMSB0b2ludGVncmFseCAgICAgIDAuOSAgIC0+ICAxICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAxMiB0b2ludGVncmFseCAgICAgIDEgICAgIC0+ICAxCitkcWludHgwMTMgdG9pbnRlZ3JhbHggICAgICAxLjAgICAtPiAgMSAgUm91bmRlZAorZHFpbnR4MDE0IHRvaW50ZWdyYWx4ICAgICAgMS4xICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDE1IHRvaW50ZWdyYWx4ICAgICAgMS4yICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDE2IHRvaW50ZWdyYWx4ICAgICAgMS4zICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDE3IHRvaW50ZWdyYWx4ICAgICAgMS40ICAgLT4gIDEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDE4IHRvaW50ZWdyYWx4ICAgICAgMS41ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDE5IHRvaW50ZWdyYWx4ICAgICAgMS42ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDIwIHRvaW50ZWdyYWx4ICAgICAgMS43ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDIxIHRvaW50ZWdyYWx4ICAgICAgMS44ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDIyIHRvaW50ZWdyYWx4ICAgICAgMS45ICAgLT4gIDIgIEluZXhhY3QgUm91bmRlZAorLS0gbmVnYXRpdmVzCitkcWludHgwMzEgdG9pbnRlZ3JhbHggICAgIC0wICAgICAtPiAtMAorZHFpbnR4MDMyIHRvaW50ZWdyYWx4ICAgICAtMC4wICAgLT4gLTAKK2RxaW50eDAzMyB0b2ludGVncmFseCAgICAgLTAuMSAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAzNCB0b2ludGVncmFseCAgICAgLTAuMiAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAzNSB0b2ludGVncmFseCAgICAgLTAuMyAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAzNiB0b2ludGVncmFseCAgICAgLTAuNCAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAzNyB0b2ludGVncmFseCAgICAgLTAuNSAgIC0+IC0wICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAzOCB0b2ludGVncmFseCAgICAgLTAuNiAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDAzOSB0b2ludGVncmFseCAgICAgLTAuNyAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA0MCB0b2ludGVncmFseCAgICAgLTAuOCAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA0MSB0b2ludGVncmFseCAgICAgLTAuOSAgIC0+IC0xICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA0MiB0b2ludGVncmFseCAgICAgLTEgICAgIC0+IC0xCitkcWludHgwNDMgdG9pbnRlZ3JhbHggICAgIC0xLjAgICAtPiAtMSAgUm91bmRlZAorZHFpbnR4MDQ0IHRvaW50ZWdyYWx4ICAgICAtMS4xICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQ1IHRvaW50ZWdyYWx4ICAgICAtMS4yICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQ2IHRvaW50ZWdyYWx4ICAgICAtMS4zICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQ3IHRvaW50ZWdyYWx4ICAgICAtMS40ICAgLT4gLTEgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQ4IHRvaW50ZWdyYWx4ICAgICAtMS41ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDQ5IHRvaW50ZWdyYWx4ICAgICAtMS42ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDUwIHRvaW50ZWdyYWx4ICAgICAtMS43ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDUxIHRvaW50ZWdyYWx4ICAgICAtMS44ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDUyIHRvaW50ZWdyYWx4ICAgICAtMS45ICAgLT4gLTIgIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCB0d28gd291bGQgYmUgTmFOIHVzaW5nIHF1YW50aXplKHgsIDApCitkcWludHgwNTMgdG9pbnRlZ3JhbHggICAgMTBFKzYwICAtPiAxLjBFKzYxCitkcWludHgwNTQgdG9pbnRlZ3JhbHggICAtMTBFKzYwICAtPiAtMS4wRSs2MQorCistLSBudW1iZXJzIGFyb3VuZCBwcmVjaXNpb24KK2RxaW50eDA2MCB0b2ludGVncmFseCAnNTYyNjdFLTE3JyAgIC0+ICcwJyAgICAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDYxIHRvaW50ZWdyYWx4ICc1NjI2N0UtNScgICAgLT4gJzEnICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwNjIgdG9pbnRlZ3JhbHggJzU2MjY3RS0yJyAgICAtPiAnNTYzJyAgICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDA2MyB0b2ludGVncmFseCAnNTYyNjdFLTEnICAgIC0+ICc1NjI3JyAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MDY1IHRvaW50ZWdyYWx4ICc1NjI2N0UtMCcgICAgLT4gJzU2MjY3JworZHFpbnR4MDY2IHRvaW50ZWdyYWx4ICc1NjI2N0UrMCcgICAgLT4gJzU2MjY3JworZHFpbnR4MDY3IHRvaW50ZWdyYWx4ICc1NjI2N0UrMScgICAgLT4gJzUuNjI2N0UrNScKK2RxaW50eDA2OCB0b2ludGVncmFseCAnNTYyNjdFKzknICAgIC0+ICc1LjYyNjdFKzEzJworZHFpbnR4MDY5IHRvaW50ZWdyYWx4ICc1NjI2N0UrMTAnICAgLT4gJzUuNjI2N0UrMTQnCitkcWludHgwNzAgdG9pbnRlZ3JhbHggJzU2MjY3RSsxMScgICAtPiAnNS42MjY3RSsxNScKK2RxaW50eDA3MSB0b2ludGVncmFseCAnNTYyNjdFKzEyJyAgIC0+ICc1LjYyNjdFKzE2JworZHFpbnR4MDcyIHRvaW50ZWdyYWx4ICc1NjI2N0UrMTMnICAgLT4gJzUuNjI2N0UrMTcnCitkcWludHgwNzMgdG9pbnRlZ3JhbHggJzEuMjNFKzk2JyAgICAtPiAnMS4yM0UrOTYnCitkcWludHgwNzQgdG9pbnRlZ3JhbHggJzEuMjNFKzYxNDQnICAtPiAjNDdmZmQzMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorCitkcWludHgwODAgdG9pbnRlZ3JhbHggJy01NjI2N0UtMTAnICAtPiAnLTAnICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwODEgdG9pbnRlZ3JhbHggJy01NjI2N0UtNScgICAtPiAnLTEnICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwODIgdG9pbnRlZ3JhbHggJy01NjI2N0UtMicgICAtPiAnLTU2MycgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwODMgdG9pbnRlZ3JhbHggJy01NjI2N0UtMScgICAtPiAnLTU2MjcnICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgwODUgdG9pbnRlZ3JhbHggJy01NjI2N0UtMCcgICAtPiAnLTU2MjY3JworZHFpbnR4MDg2IHRvaW50ZWdyYWx4ICctNTYyNjdFKzAnICAgLT4gJy01NjI2NycKK2RxaW50eDA4NyB0b2ludGVncmFseCAnLTU2MjY3RSsxJyAgIC0+ICctNS42MjY3RSs1JworZHFpbnR4MDg4IHRvaW50ZWdyYWx4ICctNTYyNjdFKzknICAgLT4gJy01LjYyNjdFKzEzJworZHFpbnR4MDg5IHRvaW50ZWdyYWx4ICctNTYyNjdFKzEwJyAgLT4gJy01LjYyNjdFKzE0JworZHFpbnR4MDkwIHRvaW50ZWdyYWx4ICctNTYyNjdFKzExJyAgLT4gJy01LjYyNjdFKzE1JworZHFpbnR4MDkxIHRvaW50ZWdyYWx4ICctNTYyNjdFKzEyJyAgLT4gJy01LjYyNjdFKzE2JworZHFpbnR4MDkyIHRvaW50ZWdyYWx4ICctNTYyNjdFKzEzJyAgLT4gJy01LjYyNjdFKzE3JworZHFpbnR4MDkzIHRvaW50ZWdyYWx4ICctMS4yM0UrOTYnICAgLT4gJy0xLjIzRSs5NicKK2RxaW50eDA5NCB0b2ludGVncmFseCAnLTEuMjNFKzYxNDQnIC0+ICNjN2ZmZDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCBDbGFtcGVkCisKKy0tIHN1Ym5vcm1hbCBpbnB1dHMKK2RxaW50eDEwMCB0b2ludGVncmFseCAgICAgICAgMUUtMjk5IC0+IDAgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MTAxIHRvaW50ZWdyYWx4ICAgICAgMC4xRS0yOTkgLT4gMCAgSW5leGFjdCBSb3VuZGVkCitkcWludHgxMDIgdG9pbnRlZ3JhbHggICAgIDAuMDFFLTI5OSAtPiAwICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDEwMyB0b2ludGVncmFseCAgICAgICAgMEUtMjk5IC0+IDAKKworLS0gc3BlY2lhbHMgYW5kIHplcm9zCitkcWludHgxMjAgdG9pbnRlZ3JhbHggJ0luZicgICAgICAgLT4gIEluZmluaXR5CitkcWludHgxMjEgdG9pbnRlZ3JhbHggJy1JbmYnICAgICAgLT4gLUluZmluaXR5CitkcWludHgxMjIgdG9pbnRlZ3JhbHggICBOYU4gICAgICAgLT4gIE5hTgorZHFpbnR4MTIzIHRvaW50ZWdyYWx4ICBzTmFOICAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitkcWludHgxMjQgdG9pbnRlZ3JhbHggICAgIDAgICAgICAgLT4gIDAKK2RxaW50eDEyNSB0b2ludGVncmFseCAgICAtMCAgICAgICAtPiAtMAorZHFpbnR4MTI2IHRvaW50ZWdyYWx4ICAgICAwLjAwMCAgIC0+ICAwCitkcWludHgxMjcgdG9pbnRlZ3JhbHggICAgIDAuMDAgICAgLT4gIDAKK2RxaW50eDEyOCB0b2ludGVncmFseCAgICAgMC4wICAgICAtPiAgMAorZHFpbnR4MTI5IHRvaW50ZWdyYWx4ICAgICAwICAgICAgIC0+ICAwCitkcWludHgxMzAgdG9pbnRlZ3JhbHggICAgIDBFLTMgICAgLT4gIDAKK2RxaW50eDEzMSB0b2ludGVncmFseCAgICAgMEUtMiAgICAtPiAgMAorZHFpbnR4MTMyIHRvaW50ZWdyYWx4ICAgICAwRS0xICAgIC0+ICAwCitkcWludHgxMzMgdG9pbnRlZ3JhbHggICAgIDBFLTAgICAgLT4gIDAKK2RxaW50eDEzNCB0b2ludGVncmFseCAgICAgMEUrMSAgICAtPiAgMEUrMQorZHFpbnR4MTM1IHRvaW50ZWdyYWx4ICAgICAwRSsyICAgIC0+ICAwRSsyCitkcWludHgxMzYgdG9pbnRlZ3JhbHggICAgIDBFKzMgICAgLT4gIDBFKzMKK2RxaW50eDEzNyB0b2ludGVncmFseCAgICAgMEUrNCAgICAtPiAgMEUrNAorZHFpbnR4MTM4IHRvaW50ZWdyYWx4ICAgICAwRSs1ICAgIC0+ICAwRSs1CitkcWludHgxMzkgdG9pbnRlZ3JhbHggICAgLTAuMDAwICAgLT4gLTAKK2RxaW50eDE0MCB0b2ludGVncmFseCAgICAtMC4wMCAgICAtPiAtMAorZHFpbnR4MTQxIHRvaW50ZWdyYWx4ICAgIC0wLjAgICAgIC0+IC0wCitkcWludHgxNDIgdG9pbnRlZ3JhbHggICAgLTAgICAgICAgLT4gLTAKK2RxaW50eDE0MyB0b2ludGVncmFseCAgICAtMEUtMyAgICAtPiAtMAorZHFpbnR4MTQ0IHRvaW50ZWdyYWx4ICAgIC0wRS0yICAgIC0+IC0wCitkcWludHgxNDUgdG9pbnRlZ3JhbHggICAgLTBFLTEgICAgLT4gLTAKK2RxaW50eDE0NiB0b2ludGVncmFseCAgICAtMEUtMCAgICAtPiAtMAorZHFpbnR4MTQ3IHRvaW50ZWdyYWx4ICAgIC0wRSsxICAgIC0+IC0wRSsxCitkcWludHgxNDggdG9pbnRlZ3JhbHggICAgLTBFKzIgICAgLT4gLTBFKzIKK2RxaW50eDE0OSB0b2ludGVncmFseCAgICAtMEUrMyAgICAtPiAtMEUrMworZHFpbnR4MTUwIHRvaW50ZWdyYWx4ICAgIC0wRSs0ICAgIC0+IC0wRSs0CitkcWludHgxNTEgdG9pbnRlZ3JhbHggICAgLTBFKzUgICAgLT4gLTBFKzUKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2RxaW50eDE1MiB0b2ludGVncmFseCAgIE5hTjgwOCAgICAtPiAgTmFOODA4CitkcWludHgxNTMgdG9pbnRlZ3JhbHggIHNOYU4wODAgICAgLT4gIE5hTjgwICBJbnZhbGlkX29wZXJhdGlvbgorZHFpbnR4MTU0IHRvaW50ZWdyYWx4ICAtTmFOODA4ICAgIC0+IC1OYU44MDgKK2RxaW50eDE1NSB0b2ludGVncmFseCAtc05hTjA4MCAgICAtPiAtTmFOODAgIEludmFsaWRfb3BlcmF0aW9uCitkcWludHgxNTYgdG9pbnRlZ3JhbHggIC1OYU4gICAgICAgLT4gLU5hTgorZHFpbnR4MTU3IHRvaW50ZWdyYWx4IC1zTmFOICAgICAgIC0+IC1OYU4gICAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gZXhhbXBsZXMKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitkcWludHgyMDAgdG9pbnRlZ3JhbHggICAgIDIuMSAgICAtPiAyICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMDEgdG9pbnRlZ3JhbHggICAxMDAgICAgICAtPiAxMDAKK2RxaW50eDIwMiB0b2ludGVncmFseCAgIDEwMC4wICAgIC0+IDEwMCAgICAgICAgICBSb3VuZGVkCitkcWludHgyMDMgdG9pbnRlZ3JhbHggICAxMDEuNSAgICAtPiAxMDIgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMDQgdG9pbnRlZ3JhbHggIC0xMDEuNSAgICAtPiAtMTAyICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMDUgdG9pbnRlZ3JhbHggICAxMEUrNSAgICAtPiAxLjBFKzYKK2RxaW50eDIwNiB0b2ludGVncmFseCAgNy44OUUrNzcgIC0+IDcuODlFKzc3CitkcWludHgyMDcgdG9pbnRlZ3JhbHggICAtSW5mICAgICAtPiAtSW5maW5pdHkKKworCistLSBhbGwgcm91bmRpbmcgbW9kZXMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK2RxaW50eDIxMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMTEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjEyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU4ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIxMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMTQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjE1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU4ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGhhbGZfdXAKKworZHFpbnR4MjIwIHRvaW50ZWdyYWx4ICAgICA1NS41ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIyMSB0b2ludGVncmFseCAgICAgNTYuNSAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMjIgdG9pbnRlZ3JhbHggICAgIDU3LjUgICAtPiAgNTggIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjIzIHRvaW50ZWdyYWx4ICAgIC01NS41ICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIyNCB0b2ludGVncmFseCAgICAtNTYuNSAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMjUgdG9pbnRlZ3JhbHggICAgLTU3LjUgICAtPiAtNTggIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgaGFsZl9kb3duCisKK2RxaW50eDIzMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMzEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjMyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDIzMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NSAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyMzQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjM1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIHVwCisKK2RxaW50eDI0MCB0b2ludGVncmFseCAgICAgNTUuMyAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNDEgdG9pbnRlZ3JhbHggICAgIDU2LjMgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjQyIHRvaW50ZWdyYWx4ICAgICA1Ny4zICAgLT4gIDU4ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI0MyB0b2ludGVncmFseCAgICAtNTUuMyAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNDQgdG9pbnRlZ3JhbHggICAgLTU2LjMgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjQ1IHRvaW50ZWdyYWx4ICAgIC01Ny4zICAgLT4gLTU4ICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGRvd24KKworZHFpbnR4MjUwIHRvaW50ZWdyYWx4ICAgICA1NS43ICAgLT4gIDU1ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI1MSB0b2ludGVncmFseCAgICAgNTYuNyAgIC0+ICA1NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNTIgdG9pbnRlZ3JhbHggICAgIDU3LjcgICAtPiAgNTcgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjUzIHRvaW50ZWdyYWx4ICAgIC01NS43ICAgLT4gLTU1ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI1NCB0b2ludGVncmFseCAgICAtNTYuNyAgIC0+IC01NiAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNTUgdG9pbnRlZ3JhbHggICAgLTU3LjcgICAtPiAtNTcgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgY2VpbGluZworCitkcWludHgyNjAgdG9pbnRlZ3JhbHggICAgIDU1LjMgICAtPiAgNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjYxIHRvaW50ZWdyYWx4ICAgICA1Ni4zICAgLT4gIDU3ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI2MiB0b2ludGVncmFseCAgICAgNTcuMyAgIC0+ICA1OCAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNjMgdG9pbnRlZ3JhbHggICAgLTU1LjMgICAtPiAtNTUgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjY0IHRvaW50ZWdyYWx4ICAgIC01Ni4zICAgLT4gLTU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI2NSB0b2ludGVncmFseCAgICAtNTcuMyAgIC0+IC01NyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBmbG9vcgorCitkcWludHgyNzAgdG9pbnRlZ3JhbHggICAgIDU1LjcgICAtPiAgNTUgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4MjcxIHRvaW50ZWdyYWx4ICAgICA1Ni43ICAgLT4gIDU2ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI3MiB0b2ludGVncmFseCAgICAgNTcuNyAgIC0+ICA1NyAgSW5leGFjdCBSb3VuZGVkCitkcWludHgyNzMgdG9pbnRlZ3JhbHggICAgLTU1LjcgICAtPiAtNTYgIEluZXhhY3QgUm91bmRlZAorZHFpbnR4Mjc0IHRvaW50ZWdyYWx4ICAgIC01Ni43ICAgLT4gLTU3ICBJbmV4YWN0IFJvdW5kZWQKK2RxaW50eDI3NSB0b2ludGVncmFseCAgICAtNTcuNyAgIC0+IC01OCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIEludCBhbmQgdUludDMyIGVkZ2UgdmFsdWVzIGZvciB0ZXN0aW5nIGNvbnZlcnNpb25zCitkcWludHgzMDAgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDYgIC0+IC0yMTQ3NDgzNjQ2CitkcWludHgzMDEgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDcgIC0+IC0yMTQ3NDgzNjQ3CitkcWludHgzMDIgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDggIC0+IC0yMTQ3NDgzNjQ4CitkcWludHgzMDMgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDkgIC0+IC0yMTQ3NDgzNjQ5CitkcWludHgzMDQgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDYgIC0+ICAyMTQ3NDgzNjQ2CitkcWludHgzMDUgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDcgIC0+ICAyMTQ3NDgzNjQ3CitkcWludHgzMDYgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDggIC0+ICAyMTQ3NDgzNjQ4CitkcWludHgzMDcgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDkgIC0+ICAyMTQ3NDgzNjQ5CitkcWludHgzMDggdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTQgIC0+ICA0Mjk0OTY3Mjk0CitkcWludHgzMDkgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTUgIC0+ICA0Mjk0OTY3Mjk1CitkcWludHgzMTAgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTYgIC0+ICA0Mjk0OTY3Mjk2CitkcWludHgzMTEgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTcgIC0+ICA0Mjk0OTY3Mjk3CisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFYb3IuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHFYb3IuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjE2ZTllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kcVhvci5kZWNUZXN0CkBAIC0wLDAgKzEsNDEwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRxWG9yLmRlY1Rlc3QgLS0gZGlnaXR3aXNlIGxvZ2ljYWwgWE9SIGZvciBkZWNRdWFkcyAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK2NsYW1wOiAgICAgICAxCitwcmVjaXNpb246ICAgMzQKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSkKK2RxeG9yMDAxIHhvciAgICAgICAgICAgICAwICAgIDAgLT4gICAgMAorZHF4b3IwMDIgeG9yICAgICAgICAgICAgIDAgICAgMSAtPiAgICAxCitkcXhvcjAwMyB4b3IgICAgICAgICAgICAgMSAgICAwIC0+ICAgIDEKK2RxeG9yMDA0IHhvciAgICAgICAgICAgICAxICAgIDEgLT4gICAgMAorZHF4b3IwMDUgeG9yICAgICAgICAgIDExMDAgMTAxMCAtPiAgMTEwCistLSBhbmQgYXQgbXNkIGFuZCBtc2QtMQorZHF4b3IwMDYgeG9yIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorZHF4b3IwMDcgeG9yIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yMDA4IHhvciAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjAwOSB4b3IgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCitkcXhvcjAxMCB4b3IgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCitkcXhvcjAxMSB4b3IgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3IwMTIgeG9yIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2RxeG9yMDEzIHhvciAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKKworLS0gVmFyaW91cyBsZW5ndGhzCistLSAgICAgICAgICAgMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorZHF4b3I2MDEgeG9yIDAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDIgeG9yIDEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDMgeG9yIDExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDQgeG9yIDExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDUgeG9yIDExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDYgeG9yIDExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDcgeG9yIDExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDggeG9yIDExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MDkgeG9yIDExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTAgeG9yIDExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTEgeG9yIDExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTIgeG9yIDExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTMgeG9yIDExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTQgeG9yIDExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTUgeG9yIDExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTYgeG9yIDExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTcgeG9yIDExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTggeG9yIDExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MTkgeG9yIDExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMAorZHF4b3I2MjAgeG9yIDExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMAorZHF4b3I2MjEgeG9yIDExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMAorZHF4b3I2MjIgeG9yIDExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMAorZHF4b3I2MjMgeG9yIDExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMAorZHF4b3I2MjQgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMAorZHF4b3I2MjUgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMAorZHF4b3I2MjYgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMAorZHF4b3I2MjcgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMAorZHF4b3I2MjggeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMAorZHF4b3I2MjkgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMAorZHF4b3I2MzAgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMAorZHF4b3I2MzEgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMAorZHF4b3I2MzIgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMAorZHF4b3I2MzMgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDEgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMAorZHF4b3I2MzQgeG9yIDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAgLT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorCitkcXhvcjY0MSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0MiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0MyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0NCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0NSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0NiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0NyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0OCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY0OSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1MCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1MSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1MiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1MyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1NCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1NSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1NiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1NyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1OCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY1OSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwMDAwCitkcXhvcjY2MCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwMDAwCitkcXhvcjY2MSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwCitkcXhvcjY2MiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwMDAwCitkcXhvcjY2MyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwMDAwCitkcXhvcjY2NCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwCitkcXhvcjY2NSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwMDAwCitkcXhvcjY2NiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMDAwCitkcXhvcjY2NyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwCitkcXhvcjY2OCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwCitkcXhvcjY2OSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwCitkcXhvcjY3MCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwCitkcXhvcjY3MSB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwMTExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwCitkcXhvcjY3MiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMDExICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwCitkcXhvcjY3MyB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAxICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCitkcXhvcjY3NCB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCitkcXhvcjY3NSB4b3IgMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxCitkcXhvcjY3NiB4b3IgMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEwICAtPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisKKworZHF4b3IwMjEgeG9yIDExMTExMTExMTAwMDAwMDAgICAgIDExMTExMTExMTAwMDAwMDAgIC0+ICAwCitkcXhvcjAyMiB4b3IgIDExMTExMTExMDAwMDAwMCAgICAgIDExMTExMTExMDAwMDAwMCAgLT4gIDAKK2RxeG9yMDIzIHhvciAgIDExMTExMTEwMDAwMDAwICAgICAgIDExMTExMTEwMDAwMDAwICAtPiAgMAorZHF4b3IwMjQgeG9yICAgIDExMTExMTAwMDAwMDAgICAgICAgIDExMTExMTAwMDAwMDAgIC0+ICAwCitkcXhvcjAyNSB4b3IgICAgIDExMTExMDAwMDAwMCAgICAgICAgIDExMTExMDAwMDAwMCAgLT4gIDAKK2RxeG9yMDI2IHhvciAgICAgIDExMTEwMDAwMDAwICAgICAgICAgIDExMTEwMDAwMDAwICAtPiAgMAorZHF4b3IwMjcgeG9yICAgICAgIDExMTAwMDAwMDAgICAgICAgICAgIDExMTAwMDAwMDAgIC0+ICAwCitkcXhvcjAyOCB4b3IgICAgICAgIDExMDAwMDAwMCAgICAgICAgICAgIDExMDAwMDAwMCAgLT4gIDAKK2RxeG9yMDI5IHhvciAgICAgICAgIDEwMDAwMDAwICAgICAgICAgICAgIDEwMDAwMDAwICAtPiAgMAorZHF4b3IwMzAgeG9yICAgICAgICAgIDEwMDAwMDAgICAgICAgICAgICAgIDEwMDAwMDAgIC0+ICAwCitkcXhvcjAzMSB4b3IgICAgICAgICAgIDEwMDAwMCAgICAgICAgICAgICAgIDEwMDAwMCAgLT4gIDAKK2RxeG9yMDMyIHhvciAgICAgICAgICAgIDEwMDAwICAgICAgICAgICAgICAgIDEwMDAwICAtPiAgMAorZHF4b3IwMzMgeG9yICAgICAgICAgICAgIDEwMDAgICAgICAgICAgICAgICAgIDEwMDAgIC0+ICAwCitkcXhvcjAzNCB4b3IgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgICAgICAgIDEwMCAgLT4gIDAKK2RxeG9yMDM1IHhvciAgICAgICAgICAgICAgIDEwICAgICAgICAgICAgICAgICAgIDEwICAtPiAgMAorZHF4b3IwMzYgeG9yICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgIDEgIC0+ICAwCisKK2RxeG9yMDQwIHhvciAxMTExMTExMTEgIDExMTExMTExMTExMSAgLT4gIDExMTAwMDAwMDAwMAorZHF4b3IwNDEgeG9yICAxMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTExMTAwMDAwMDAwCitkcXhvcjA0MiB4b3IgIDExMTExMTExICAgICAxMTExMTExMTEgIC0+ICAxMDAwMDAwMDAKK2RxeG9yMDQzIHhvciAgIDExMTExMTEgICAgIDEwMDAwMDAxMCAgLT4gIDEwMTExMTEwMQorZHF4b3IwNDQgeG9yICAgIDExMTExMSAgICAgMTAwMDAwMTAwICAtPiAgMTAwMTExMDExCitkcXhvcjA0NSB4b3IgICAgIDExMTExICAgICAxMDAwMDEwMDAgIC0+ICAxMDAwMTAxMTEKK2RxeG9yMDQ2IHhvciAgICAgIDExMTEgICAgIDEwMDAxMDAwMCAgLT4gIDEwMDAxMTExMQorZHF4b3IwNDcgeG9yICAgICAgIDExMSAgICAgMTAwMTAwMDAwICAtPiAgMTAwMTAwMTExCitkcXhvcjA0OCB4b3IgICAgICAgIDExICAgICAxMDEwMDAwMDAgIC0+ICAxMDEwMDAwMTEKK2RxeG9yMDQ5IHhvciAgICAgICAgIDEgICAgIDExMDAwMDAwMCAgLT4gIDExMDAwMDAwMQorCitkcXhvcjA1MCB4b3IgMTExMTExMTExMSAgMSAgLT4gIDExMTExMTExMTAKK2RxeG9yMDUxIHhvciAgMTExMTExMTExICAxICAtPiAgMTExMTExMTEwCitkcXhvcjA1MiB4b3IgICAxMTExMTExMSAgMSAgLT4gIDExMTExMTEwCitkcXhvcjA1MyB4b3IgICAgMTExMTExMSAgMSAgLT4gIDExMTExMTAKK2RxeG9yMDU0IHhvciAgICAgMTExMTExICAxICAtPiAgMTExMTEwCitkcXhvcjA1NSB4b3IgICAgICAxMTExMSAgMSAgLT4gIDExMTEwCitkcXhvcjA1NiB4b3IgICAgICAgMTExMSAgMSAgLT4gIDExMTAKK2RxeG9yMDU3IHhvciAgICAgICAgMTExICAxICAtPiAgMTEwCitkcXhvcjA1OCB4b3IgICAgICAgICAxMSAgMSAgLT4gIDEwCitkcXhvcjA1OSB4b3IgICAgICAgICAgMSAgMSAgLT4gIDAKKworZHF4b3IwNjAgeG9yIDExMTExMTExMTEgIDAgIC0+ICAxMTExMTExMTExCitkcXhvcjA2MSB4b3IgIDExMTExMTExMSAgMCAgLT4gIDExMTExMTExMQorZHF4b3IwNjIgeG9yICAgMTExMTExMTEgIDAgIC0+ICAxMTExMTExMQorZHF4b3IwNjMgeG9yICAgIDExMTExMTEgIDAgIC0+ICAxMTExMTExCitkcXhvcjA2NCB4b3IgICAgIDExMTExMSAgMCAgLT4gIDExMTExMQorZHF4b3IwNjUgeG9yICAgICAgMTExMTEgIDAgIC0+ICAxMTExMQorZHF4b3IwNjYgeG9yICAgICAgIDExMTEgIDAgIC0+ICAxMTExCitkcXhvcjA2NyB4b3IgICAgICAgIDExMSAgMCAgLT4gIDExMQorZHF4b3IwNjggeG9yICAgICAgICAgMTEgIDAgIC0+ICAxMQorZHF4b3IwNjkgeG9yICAgICAgICAgIDEgIDAgIC0+ICAxCisKK2RxeG9yMDcwIHhvciAxICAxMTExMTExMTExICAtPiAgMTExMTExMTExMAorZHF4b3IwNzEgeG9yIDEgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTAKK2RxeG9yMDcyIHhvciAxICAgIDExMTExMTExICAtPiAgMTExMTExMTAKK2RxeG9yMDczIHhvciAxICAgICAxMTExMTExICAtPiAgMTExMTExMAorZHF4b3IwNzQgeG9yIDEgICAgICAxMTExMTEgIC0+ICAxMTExMTAKK2RxeG9yMDc1IHhvciAxICAgICAgIDExMTExICAtPiAgMTExMTAKK2RxeG9yMDc2IHhvciAxICAgICAgICAxMTExICAtPiAgMTExMAorZHF4b3IwNzcgeG9yIDEgICAgICAgICAxMTEgIC0+ICAxMTAKK2RxeG9yMDc4IHhvciAxICAgICAgICAgIDExICAtPiAgMTAKK2RxeG9yMDc5IHhvciAxICAgICAgICAgICAxICAtPiAgMAorCitkcXhvcjA4MCB4b3IgMCAgMTExMTExMTExMSAgLT4gIDExMTExMTExMTEKK2RxeG9yMDgxIHhvciAwICAgMTExMTExMTExICAtPiAgMTExMTExMTExCitkcXhvcjA4MiB4b3IgMCAgICAxMTExMTExMSAgLT4gIDExMTExMTExCitkcXhvcjA4MyB4b3IgMCAgICAgMTExMTExMSAgLT4gIDExMTExMTEKK2RxeG9yMDg0IHhvciAwICAgICAgMTExMTExICAtPiAgMTExMTExCitkcXhvcjA4NSB4b3IgMCAgICAgICAxMTExMSAgLT4gIDExMTExCitkcXhvcjA4NiB4b3IgMCAgICAgICAgMTExMSAgLT4gIDExMTEKK2RxeG9yMDg3IHhvciAwICAgICAgICAgMTExICAtPiAgMTExCitkcXhvcjA4OCB4b3IgMCAgICAgICAgICAxMSAgLT4gIDExCitkcXhvcjA4OSB4b3IgMCAgICAgICAgICAgMSAgLT4gIDEKKworZHF4b3IwOTAgeG9yIDAxMTExMTExMSAgMTExMTAxMTExICAtPiAgMTAwMDEwMDAwCitkcXhvcjA5MSB4b3IgMTAxMTExMTExICAxMTExMDExMTEgIC0+ICAgMTAwMTAwMDAKK2RxeG9yMDkyIHhvciAxMTAxMTExMTEgIDExMTEwMTExMSAgLT4gICAgMTAxMDAwMAorZHF4b3IwOTMgeG9yIDExMTAxMTExMSAgMTExMTAxMTExICAtPiAgICAgMTEwMDAwCitkcXhvcjA5NCB4b3IgMTExMTAxMTExICAxMTExMDExMTEgIC0+ICAgICAgICAgIDAKK2RxeG9yMDk1IHhvciAxMTExMTAxMTEgIDExMTEwMTExMSAgLT4gICAgICAxMTAwMAorZHF4b3IwOTYgeG9yIDExMTExMTAxMSAgMTExMTAxMTExICAtPiAgICAgIDEwMTAwCitkcXhvcjA5NyB4b3IgMTExMTExMTAxICAxMTExMDExMTEgIC0+ICAgICAgMTAwMTAKK2RxeG9yMDk4IHhvciAxMTExMTExMTAgIDExMTEwMTExMSAgLT4gICAgICAxMDAwMQorCitkcXhvcjEwMCB4b3IgMTExMTAxMTExICAwMTExMTExMTEgIC0+ICAxMDAwMTAwMDAKK2RxeG9yMTAxIHhvciAxMTExMDExMTEgIDEwMTExMTExMSAgLT4gICAxMDAxMDAwMAorZHF4b3IxMDIgeG9yIDExMTEwMTExMSAgMTEwMTExMTExICAtPiAgICAxMDEwMDAwCitkcXhvcjEwMyB4b3IgMTExMTAxMTExICAxMTEwMTExMTEgIC0+ICAgICAxMTAwMDAKK2RxeG9yMTA0IHhvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gICAgICAgICAgMAorZHF4b3IxMDUgeG9yIDExMTEwMTExMSAgMTExMTEwMTExICAtPiAgICAgIDExMDAwCitkcXhvcjEwNiB4b3IgMTExMTAxMTExICAxMTExMTEwMTEgIC0+ICAgICAgMTAxMDAKK2RxeG9yMTA3IHhvciAxMTExMDExMTEgIDExMTExMTEwMSAgLT4gICAgICAxMDAxMAorZHF4b3IxMDggeG9yIDExMTEwMTExMSAgMTExMTExMTEwICAtPiAgICAgIDEwMDAxCisKKy0tIG5vbi0wLzEgc2hvdWxkIG5vdCBiZSBhY2NlcHRlZCwgbm9yIHNob3VsZCBzaWducworZHF4b3IyMjAgeG9yIDExMTExMTExMiAgMTExMTExMTExICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIyMSB4b3IgMzMzMzMzMzMzICAzMzMzMzMzMzMgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjIyIHhvciA1NTU1NTU1NTUgIDU1NTU1NTU1NSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMjMgeG9yIDc3Nzc3Nzc3NyAgNzc3Nzc3Nzc3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIyNCB4b3IgOTk5OTk5OTk5ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjI1IHhvciAyMjIyMjIyMjIgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMjYgeG9yIDQ0NDQ0NDQ0NCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIyNyB4b3IgNjY2NjY2NjY2ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjI4IHhvciA4ODg4ODg4ODggIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMjkgeG9yIDk5OTk5OTk5OSAgMjIyMjIyMjIyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjIzMCB4b3IgOTk5OTk5OTk5ICA0NDQ0NDQ0NDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjMxIHhvciA5OTk5OTk5OTkgIDY2NjY2NjY2NiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyMzIgeG9yIDk5OTk5OTk5OSAgODg4ODg4ODg4ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCitkcXhvcjI0MCB4b3IgIDU2NzQ2ODY4OSAtOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjQxIHhvciAgNTY3MzY3Njg5ICA5MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyNDIgeG9yIC02MzE5MTc3NzIgLTcwNjAxNDYzNCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI0MyB4b3IgLTc1NjI1MzI1NyAgMTM4NTc5MjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjQ0IHhvciAgODM1NTkwMTQ5ICA1Njc0MzU0MDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QKK2RxeG9yMjUwIHhvciAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjUxIHhvciAgNzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjUyIHhvciAgODAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjUzIHhvciAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjU0IHhvciAgMjAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjU1IHhvciAgNzAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjU2IHhvciAgODAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjU3IHhvciAgOTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAwMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjU4IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjU5IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjYwIHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjYxIHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjYyIHhvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCAyMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjYzIHhvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA3MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjY0IHhvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA4MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjY1IHhvciAgMDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMCA5MDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNELTEKK2RxeG9yMjcwIHhvciAgMDIwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDAwMDAwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjcxIHhvciAgMDcwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjcyIHhvciAgMDgwMDAwMDExMTAwMDExMTAwMDExMTAwMDAxMDAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjczIHhvciAgMDkwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjc0IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDEwMDAwMCAwMjAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjc1IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAxMDAwMCAwNzAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjc2IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMTAwMCAwODAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMTAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjc3IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDEwMCAwOTAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTFNECitkcXhvcjI4MCB4b3IgIDAwMTAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDIgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDEwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4MSB4b3IgIDAwMDEwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDAwMDAwMDcgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMTAwMDAwMDAxMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4MiB4b3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTExMDAwMDAwMDAwMDggMTAwMDAwMDExMTAwMDExMTAwMDExMTAxMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4MyB4b3IgIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMTAwMDAwMDAwMDkgMTAwMDAwMDExMTAwMDExMTAwMDExMTEwMDAwMDAwMDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4NCB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMDAgMDAwMTAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwMiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4NSB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDAgMDAxMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwNyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4NiB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAwMDAwMDAgMDEwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwOCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI4NyB4b3IgIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMDAwMDAwOSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1pZGRpZQorZHF4b3IyODggeG9yICAwMDEwMDAwMTExMDAwMTExMDAwMTExMDAwMDIwMDAwMDAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDEwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyODkgeG9yICAwMDAxMDAwMTExMDAwMTExMDAwMTExMDAwMDcwMDAwMDAxIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTAgeG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMTAwMDgwMDAwMDEwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMTAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTEgeG9yICAwMDAwMDAwMTExMDAwMTExMDAwMTExMDEwMDkwMDAwMTAwIDEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTIgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAxMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMjAxMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTMgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMTAwMDEwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwNzAwMTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTQgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDEwMTAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwODAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTUgeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIDAwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwOTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc2lnbnMKK2RxeG9yMjk2IHhvciAtMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAtMDAwMDAwMTExMDAwMTExMDAwMTExMDAxMDAwMDAwMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjI5NyB4b3IgLTEwMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAwMDEwMDAwMDAgIDAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IyOTggeG9yICAxMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMDAwMDAwIC0wMDAwMDAxMTEwMDAxMTEwMDAxMTEwMDAxMDAwMDAwMTAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMjk5IHhvciAgMTAwMDAwMDExMTAwMDExMTAwMDExMTAwMDAwMTAwMDAwMCAgMDAwMDAwMTExMDAwMTExMDAwMTExMDAwMDAxMTAwMDEwMCAtPiAgMTAwMDAwMTAwMTAwMTAwMTAwMTAwMTAwMDAxMDAwMDEwMAorCistLSBObWF4LCBObWluLCBOdGlueS1saWtlCitkcXhvcjMzMSB4b3IgIDIgICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzMzIgeG9yICAzICAgMUUtOTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzMzIHhvciAgNCAgIDEuMDAwMDAwMDBFLTI4MjEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjMzNCB4b3IgIDUgICAxRS05MDAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzMzUgeG9yICA2ICAgLTFFLTkwMCAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzM2IHhvciAgNyAgIC0xLjAwMDAwMDAwRS05OTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjMzNyB4b3IgIDggICAtMUUtOTk5ICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzMzggeG9yICA5ICAgLTkuOTk5OTk5OTlFKzk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzQxIHhvciAgOS45OTk5OTk5OUUrOTk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM0MiB4b3IgIDFFLTk5OSAgICAgICAgICAgICAgIDAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNDMgeG9yICAxLjAwMDAwMDAwRS05OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzQ0IHhvciAgMUUtOTA4ICAgICAgICAgICAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM0NSB4b3IgIC0xRS05MDcgICAgICAgICAgICAgLTEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNDYgeG9yICAtMS4wMDAwMDAwMEUtOTk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzQ3IHhvciAgLTFFLTk5OSAgICAgICAgICAgICAgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM0OCB4b3IgIC05Ljk5OTk5OTk5RSsyOTkxICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBIGZldyBvdGhlciBub24taW50ZWdlcnMKK2RxeG9yMzYxIHhvciAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM2MiB4b3IgIDFFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNjMgeG9yICAwLjAgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzY0IHhvciAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM2NSB4b3IgIDkuOSAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNjYgeG9yICA5RSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzcxIHhvciAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM3MiB4b3IgIDAgMUUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNzMgeG9yICAwIDAuMCAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yMzc0IHhvciAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjM3NSB4b3IgIDAgOS45ICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3IzNzYgeG9yICAwIDlFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQWxsIFNwZWNpYWxzIGFyZSBpbiBlcnJvcgorZHF4b3I3ODAgeG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzgxIHhvciAtSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc4MiB4b3IgLUluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3ODMgeG9yIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzg0IHhvciAtSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc4NSB4b3IgLUluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3ODYgeG9yIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzg3IHhvciAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc4OCB4b3IgLUluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3ODkgeG9yIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzkwIHhvciAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc5MSB4b3IgIDAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I3OTIgeG9yICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yNzkzIHhvciAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjc5NCB4b3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXhvcjgwMCB4b3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MDEgeG9yICBJbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODAyIHhvciAgSW5mICAtMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgwMyB4b3IgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MDQgeG9yICBJbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODA1IHhvciAgSW5mICAgMSAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgwNiB4b3IgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MDcgeG9yICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODA4IHhvciAtMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgwOSB4b3IgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MTAgeG9yIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODExIHhvciAtMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgxMiB4b3IgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MTMgeG9yICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODE0IHhvciAgMTAwMCAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgxNSB4b3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitkcXhvcjgyMSB4b3IgIE5hTiAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MjIgeG9yICBOYU4gLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODIzIHhvciAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgyNCB4b3IgIE5hTiAtMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MjUgeG9yICBOYU4gIDAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODI2IHhvciAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgyNyB4b3IgIE5hTiAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MjggeG9yICBOYU4gIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODI5IHhvciAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgzMCB4b3IgLUluZiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MzEgeG9yIC0xMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODMyIHhvciAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgzMyB4b3IgLTAgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MzQgeG9yICAwICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODM1IHhvciAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjgzNiB4b3IgIDEwMDAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4MzcgeG9yICBJbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworZHF4b3I4NDEgeG9yICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDIgeG9yICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDMgeG9yICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDQgeG9yICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDUgeG9yICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDYgeG9yICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDcgeG9yICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDggeG9yICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NDkgeG9yICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTAgeG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTEgeG9yIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTIgeG9yIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTMgeG9yIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTQgeG9yIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTUgeG9yICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTYgeG9yICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTcgeG9yICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTggeG9yICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NTkgeG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitkcXhvcjg2MSB4b3IgIE5hTjEgICAtSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NjIgeG9yICtOYU4yICAgLTEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODYzIHhvciAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg2NCB4b3IgIE5hTjQgICAgSW5mICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NjUgeG9yICBOYU41ICAgK05hTjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODY2IHhvciAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg2NyB4b3IgLTEwMDAgICAgTmFOOCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NjggeG9yICAxMDAwICAgIE5hTjkgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODY5IHhvciAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg3MSB4b3IgIHNOYU4xMSAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NzIgeG9yICBzTmFOMTIgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODczIHhvciAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg3NCB4b3IgIHNOYU4xNCAgIE5hTjE3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NzUgeG9yICBzTmFOMTUgIHNOYU4xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODc2IHhvciAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg3NyB4b3IgLUluZiAgICArc05hTjIwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4NzggeG9yIC0xMDAwICAgIHNOYU4yMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODc5IHhvciAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg4MCB4b3IgIEluZiAgICAgc05hTjIzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4ODEgeG9yICtOYU4yNSAgK3NOYU4yNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODgyIHhvciAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitkcXhvcjg4MyB4b3IgLXNOYU4yNyAgc05hTjI5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZHF4b3I4ODQgeG9yICAxMDAwICAgIC1OYU4zMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2RxeG9yODg1IHhvciAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2RzQmFzZS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kc0Jhc2UuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTVlNWE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kc0Jhc2UuZGVjVGVzdApAQCAtMCwwICsxLDEwNjIgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZHNCYXNlLmRlY1Rlc3QgLS0gYmFzZSBkZWNTaW5nbGUgPC0tPiBzdHJpbmcgY29udmVyc2lvbnMgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIGZpbGUgdGVzdHMgYmFzZSBjb252ZXJzaW9ucyBmcm9tIHN0cmluZyB0byBhIGRlY2ltYWwgbnVtYmVyCistLSBhbmQgYmFjayB0byBhIHN0cmluZyAoaW4gU2NpZW50aWZpYyBmb3JtKQorCistLSBOb3RlIHRoYXQgdW5saWtlIG90aGVyIG9wZXJhdGlvbnMgdGhlIG9wZXJhbmQgaXMgc3ViamVjdCB0byByb3VuZGluZworLS0gdG8gY29uZm9ybSB0byBlbWF4IGFuZCBwcmVjaXNpb24gc2V0dGluZ3MgKHRoYXQgaXMsIG51bWJlcnMgd2lsbAorLS0gY29uZm9ybSB0byBydWxlcyBhbmQgZXhwb25lbnQgd2lsbCBiZSBpbiBwZXJtaXR0ZWQgcmFuZ2UpLiAgVGhlCistLSAnbGVmdCBoYW5kIHNpZGUnLCB0aGVyZWZvcmUsIG1heSBoYXZlIG51bWJlcnMgdGhhdCBjYW5ub3QgYmUKKy0tIHJlcHJlc2VudGVkIGluIGEgZGVjU2luZ2xlLiAgU29tZSB0ZXN0Y2FzZXMgZ28gdG8gdGhlIGxpbWl0IG9mIHRoZQorLS0gbmV4dC13aWRlciBmb3JtYXQsIGFuZCBoZW5jZSB0aGVzZSB0ZXN0Y2FzZXMgbWF5IGFsc28gYmUgdXNlZCB0bworLS0gdGVzdCBuYXJyb3dpbmcgYW5kIHdpZGVuaW5nIG9wZXJhdGlvbnMuCisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDcKK21heEV4cG9uZW50OiA5NgorbWluRXhwb25lbnQ6IC05NQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitkc2JhczAwMSB0b1NjaSAgICAgICAwIC0+IDAKK2RzYmFzMDAyIHRvU2NpICAgICAgIDEgLT4gMQorZHNiYXMwMDMgdG9TY2kgICAgIDEuMCAtPiAxLjAKK2RzYmFzMDA0IHRvU2NpICAgIDEuMDAgLT4gMS4wMAorZHNiYXMwMDUgdG9TY2kgICAgICAxMCAtPiAxMAorZHNiYXMwMDYgdG9TY2kgICAgMTAwMCAtPiAxMDAwCitkc2JhczAwNyB0b1NjaSAgICAxMC4wIC0+IDEwLjAKK2RzYmFzMDA4IHRvU2NpICAgIDEwLjEgLT4gMTAuMQorZHNiYXMwMDkgdG9TY2kgICAgMTAuNCAtPiAxMC40Citkc2JhczAxMCB0b1NjaSAgICAxMC41IC0+IDEwLjUKK2RzYmFzMDExIHRvU2NpICAgIDEwLjYgLT4gMTAuNgorZHNiYXMwMTIgdG9TY2kgICAgMTAuOSAtPiAxMC45Citkc2JhczAxMyB0b1NjaSAgICAxMS4wIC0+IDExLjAKK2RzYmFzMDE0IHRvU2NpICAxLjIzNCAtPiAxLjIzNAorZHNiYXMwMTUgdG9TY2kgIDAuMTIzIC0+IDAuMTIzCitkc2JhczAxNiB0b1NjaSAgMC4wMTIgLT4gMC4wMTIKK2RzYmFzMDE3IHRvU2NpICAtMCAgICAtPiAtMAorZHNiYXMwMTggdG9TY2kgIC0wLjAgIC0+IC0wLjAKK2RzYmFzMDE5IHRvU2NpIC0wMC4wMCAtPiAtMC4wMAorCitkc2JhczAyMSB0b1NjaSAgICAgLTEgLT4gLTEKK2RzYmFzMDIyIHRvU2NpICAgLTEuMCAtPiAtMS4wCitkc2JhczAyMyB0b1NjaSAgIC0wLjEgLT4gLTAuMQorZHNiYXMwMjQgdG9TY2kgICAtOS4xIC0+IC05LjEKK2RzYmFzMDI1IHRvU2NpICAgLTkuMTEgLT4gLTkuMTEKK2RzYmFzMDI2IHRvU2NpICAgLTkuMTE5IC0+IC05LjExOQorZHNiYXMwMjcgdG9TY2kgICAtOS45OTkgLT4gLTkuOTk5CisKK2RzYmFzMDMwIHRvU2NpICAnMTIzNC41NjcnICAgLT4gJzEyMzQuNTY3JworZHNiYXMwMzEgdG9TY2kgICcxMjM0LjAwMCcgICAtPiAnMTIzNC4wMDAnCitkc2JhczAzMiB0b1NjaSAgICcxMjM0OTEyJyAgIC0+ICcxMjM0OTEyJworZHNiYXMwMzMgdG9TY2kgICAnMC4wMDAwMTIzNDU2NycgICAtPiAnMC4wMDAwMTIzNDU2NycKK2RzYmFzMDM0IHRvU2NpICAnMC4wMDAwMDEyMzQ1NjcnICAgLT4gJzAuMDAwMDAxMjM0NTY3JworZHNiYXMwMzUgdG9TY2kgJzAuMDAwMDAwMTIzNDU2NycgICAtPiAnMS4yMzQ1NjdFLTcnCitkc2JhczAzNiB0b1NjaSAnMC4wMDAwMDAwMTIzNDU2NycgIC0+ICcxLjIzNDU2N0UtOCcKKworZHNiYXMwMzcgdG9TY2kgJzAuMTIzNDU2NCcgICAtPiAnMC4xMjM0NTY0JworZHNiYXMwMzggdG9TY2kgJzAuMTIzNDU2NScgICAtPiAnMC4xMjM0NTY1JworCistLSB0ZXN0IGZpbml0ZSBib3VuZHMgKE5lZ3Mgb2YsIHRoZW4gMCwgTnRpbnksIE5taW4sIG90aGVyLCBObWF4KQorZHNic24wMDEgdG9TY2kgLTkuOTk5OTk5RSs5NiAtPiAtOS45OTk5OTlFKzk2Citkc2JzbjAwMiB0b1NjaSAtMUUtOTUgLT4gLTFFLTk1Citkc2JzbjAwMyB0b1NjaSAtMUUtMTAxIC0+IC0xRS0xMDEgU3Vibm9ybWFsCitkc2JzbjAwNCB0b1NjaSAtMCAtPiAtMAorZHNic24wMDUgdG9TY2kgKzAgLT4gIDAKK2RzYnNuMDA2IHRvU2NpICsxRS0xMDEgLT4gIDFFLTEwMSBTdWJub3JtYWwKK2RzYnNuMDA3IHRvU2NpICsxRS05NSAtPiAgMUUtOTUKK2RzYnNuMDA4IHRvU2NpICs5Ljk5OTk5OUUrOTYgLT4gIDkuOTk5OTk5RSs5NgorCistLSBTdHJpbmcgW21hbnkgbW9yZSBleGFtcGxlcyBhcmUgaW1wbGljaXRseSB0ZXN0ZWQgZWxzZXdoZXJlXQorLS0gc3RyaW5ncyB3aXRob3V0IEUgY2Fubm90IGdlbmVyYXRlIEUgaW4gcmVzdWx0Citkc2JhczA0MCB0b1NjaSAiMTIiICAgICAgICAtPiAnMTInCitkc2JhczA0MSB0b1NjaSAiLTc2IiAgICAgICAtPiAnLTc2JworZHNiYXMwNDIgdG9TY2kgIjEyLjc2IiAgICAgLT4gJzEyLjc2JworZHNiYXMwNDMgdG9TY2kgIisxMi43NiIgICAgLT4gJzEyLjc2JworZHNiYXMwNDQgdG9TY2kgIjAxMi43NiIgICAgLT4gJzEyLjc2JworZHNiYXMwNDUgdG9TY2kgIiswLjAwMyIgICAgLT4gJzAuMDAzJworZHNiYXMwNDYgdG9TY2kgIjE3LiIgICAgICAgLT4gJzE3JworZHNiYXMwNDcgdG9TY2kgIi41IiAgICAgICAgLT4gJzAuNScKK2RzYmFzMDQ4IHRvU2NpICIwNDQiICAgICAgIC0+ICc0NCcKK2RzYmFzMDQ5IHRvU2NpICIwMDQ0IiAgICAgIC0+ICc0NCcKK2RzYmFzMDUwIHRvU2NpICIwLjAwMDUiICAgICAgLT4gJzAuMDAwNScKK2RzYmFzMDUxIHRvU2NpICIwMC4wMDAwNSIgICAgLT4gJzAuMDAwMDUnCitkc2JhczA1MiB0b1NjaSAiMC4wMDAwMDUiICAgIC0+ICcwLjAwMDAwNScKK2RzYmFzMDUzIHRvU2NpICIwLjAwMDAwNTAiICAgLT4gJzAuMDAwMDA1MCcKK2RzYmFzMDU0IHRvU2NpICIwLjAwMDAwMDUiICAgLT4gJzVFLTcnCitkc2JhczA1NSB0b1NjaSAiMC4wMDAwMDAwNSIgIC0+ICc1RS04JworZHNiYXMwNTYgdG9TY2kgIjEyNjc4LjU0IiAtPiAnMTI2NzguNTQnCitkc2JhczA1NyB0b1NjaSAiMjY3OC41NDMiIC0+ICcyNjc4LjU0MycKK2RzYmFzMDU4IHRvU2NpICIzNDU2NzguNSIgLT4gJzM0NTY3OC41JworZHNiYXMwNTkgdG9TY2kgIjA2NzguNTQzMiIgLT4gJzY3OC41NDMyJworZHNiYXMwNjAgdG9TY2kgIjY3OC41NDMyIiAtPiAnNjc4LjU0MzInCitkc2JhczA2MSB0b1NjaSAiKzY3OC41NDMyIiAtPiAnNjc4LjU0MzInCitkc2JhczA2MiB0b1NjaSAiKzA2NzguNTQzMiIgLT4gJzY3OC41NDMyJworZHNiYXMwNjMgdG9TY2kgIiswMDY3OC41NDMyIiAtPiAnNjc4LjU0MzInCitkc2JhczA2NCB0b1NjaSAiLTY3OC41NDMyIiAgLT4gJy02NzguNTQzMicKK2RzYmFzMDY1IHRvU2NpICItMDY3OC41NDMyIiAgLT4gJy02NzguNTQzMicKK2RzYmFzMDY2IHRvU2NpICItMDA2NzguNTQzMiIgIC0+ICctNjc4LjU0MzInCistLSBleGFtcGxlcworZHNiYXMwNjcgdG9TY2kgIjVFLTYiICAgICAgICAtPiAnMC4wMDAwMDUnCitkc2JhczA2OCB0b1NjaSAiNTBFLTciICAgICAgIC0+ICcwLjAwMDAwNTAnCitkc2JhczA2OSB0b1NjaSAiNUUtNyIgICAgICAgIC0+ICc1RS03JworCistLSBbTm8gZXhvdGljcyBhcyBubyBVbmljb2RlXQorCistLSByb3VuZGVkIHdpdGggZG90cyBpbiBhbGwgKGluY2x1ZGluZyBlZGdlKSBwbGFjZXMKK2RzYmFzMDcxIHRvU2NpICAuMTIzNDU2Nzg5MDEyMzQ1NiAgLT4gMC4xMjM0NTY4IEluZXhhY3QgUm91bmRlZAorZHNiYXMwNzIgdG9TY2kgIDEuMjM0NTY3ODkwMTIzNDU2ICAtPiAxLjIzNDU2OCBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDczIHRvU2NpICAxMi4zNDU2Nzg5MDEyMzQ1NiAgLT4gMTIuMzQ1NjggSW5leGFjdCBSb3VuZGVkCitkc2JhczA3NCB0b1NjaSAgMTIzLjQ1Njc4OTAxMjM0NTYgIC0+IDEyMy40NTY4IEluZXhhY3QgUm91bmRlZAorZHNiYXMwNzUgdG9TY2kgIDEyMzQuNTY3ODkwMTIzNDU2ICAtPiAxMjM0LjU2OCBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDc2IHRvU2NpICAxMjM0NS42Nzg5MDEyMzQ1NiAgLT4gMTIzNDUuNjggSW5leGFjdCBSb3VuZGVkCitkc2JhczA3NyB0b1NjaSAgMTIzNDU2Ljc4OTAxMjM0NTYgIC0+IDEyMzQ1Ni44IEluZXhhY3QgUm91bmRlZAorZHNiYXMwNzggdG9TY2kgIDEyMzQ1NjcuODkwMTIzNDU2ICAtPiAxMjM0NTY4ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDc5IHRvU2NpICAxMjM0NTY3OC45MDEyMzQ1NiAgLT4gMS4yMzQ1NjhFKzcgSW5leGFjdCBSb3VuZGVkCitkc2JhczA4MCB0b1NjaSAgMTIzNDU2Nzg5LjAxMjM0NTYgIC0+IDEuMjM0NTY4RSs4IEluZXhhY3QgUm91bmRlZAorZHNiYXMwODEgdG9TY2kgIDEyMzQ1Njc4OTAuMTIzNDU2ICAtPiAxLjIzNDU2OEUrOSBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDgyIHRvU2NpICAxMjM0NTY3ODkwMS4yMzQ1NiAgLT4gMS4yMzQ1NjhFKzEwIEluZXhhY3QgUm91bmRlZAorZHNiYXMwODMgdG9TY2kgIDEyMzQ1Njc4OTAxMi4zNDU2ICAtPiAxLjIzNDU2OEUrMTEgSW5leGFjdCBSb3VuZGVkCitkc2JhczA4NCB0b1NjaSAgMTIzNDU2Nzg5MDEyMy40NTYgIC0+IDEuMjM0NTY4RSsxMiBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDg1IHRvU2NpICAxMjM0NTY3ODkwMTIzNC41NiAgLT4gMS4yMzQ1NjhFKzEzIEluZXhhY3QgUm91bmRlZAorZHNiYXMwODYgdG9TY2kgIDEyMzQ1Njc4OTAxMjM0NS42ICAtPiAxLjIzNDU2OEUrMTQgSW5leGFjdCBSb3VuZGVkCitkc2JhczA4NyB0b1NjaSAgMTIzNDU2Nzg5MDEyMzQ1Ni4gIC0+IDEuMjM0NTY4RSsxNSBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMDg4IHRvU2NpICAxMjM0NTY3ODkwMTIzNDU2ICAgLT4gMS4yMzQ1NjhFKzE1IEluZXhhY3QgUm91bmRlZAorCistLSBOdW1iZXJzIHdpdGggRQorZHNiYXMxMzAgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2RzYmFzMTMxIHRvU2NpICIwLjAwMEUtMiIgIC0+ICcwLjAwMDAwJworZHNiYXMxMzIgdG9TY2kgIjAuMDAwRS0zIiAgLT4gJzAuMDAwMDAwJworZHNiYXMxMzMgdG9TY2kgIjAuMDAwRS00IiAgLT4gJzBFLTcnCitkc2JhczEzNCB0b1NjaSAiMC4wMEUtMiIgICAtPiAnMC4wMDAwJworZHNiYXMxMzUgdG9TY2kgIjAuMDBFLTMiICAgLT4gJzAuMDAwMDAnCitkc2JhczEzNiB0b1NjaSAiMC4wMEUtNCIgICAtPiAnMC4wMDAwMDAnCitkc2JhczEzNyB0b1NjaSAiMC4wMEUtNSIgICAtPiAnMEUtNycKK2RzYmFzMTM4IHRvU2NpICIrMEUrOSIgICAgIC0+ICcwRSs5JworZHNiYXMxMzkgdG9TY2kgIi0wRSs5IiAgICAgLT4gJy0wRSs5JworZHNiYXMxNDAgdG9TY2kgIjFFKzkiICAgICAgLT4gJzFFKzknCitkc2JhczE0MSB0b1NjaSAiMWUrMDkiICAgICAtPiAnMUUrOScKK2RzYmFzMTQyIHRvU2NpICIxRSs5MCIgICAgIC0+ICcxRSs5MCcKK2RzYmFzMTQzIHRvU2NpICIrMUUrMDA5IiAgIC0+ICcxRSs5JworZHNiYXMxNDQgdG9TY2kgIjBFKzkiICAgICAgLT4gJzBFKzknCitkc2JhczE0NSB0b1NjaSAiMUUrOSIgICAgICAtPiAnMUUrOScKK2RzYmFzMTQ2IHRvU2NpICIxRSswOSIgICAgIC0+ICcxRSs5JworZHNiYXMxNDcgdG9TY2kgIjFlKzkwIiAgICAgLT4gJzFFKzkwJworZHNiYXMxNDggdG9TY2kgIjFFKzAwOSIgICAgLT4gJzFFKzknCitkc2JhczE0OSB0b1NjaSAiMDAwRSs5IiAgICAtPiAnMEUrOScKK2RzYmFzMTUwIHRvU2NpICIxRTkiICAgICAgIC0+ICcxRSs5JworZHNiYXMxNTEgdG9TY2kgIjFlMDkiICAgICAgLT4gJzFFKzknCitkc2JhczE1MiB0b1NjaSAiMUU5MCIgICAgICAtPiAnMUUrOTAnCitkc2JhczE1MyB0b1NjaSAiMUUwMDkiICAgICAtPiAnMUUrOScKK2RzYmFzMTU0IHRvU2NpICIwRTkiICAgICAgIC0+ICcwRSs5JworZHNiYXMxNTUgdG9TY2kgIjAuMDAwZSswIiAgLT4gJzAuMDAwJworZHNiYXMxNTYgdG9TY2kgIjAuMDAwRS0xIiAgLT4gJzAuMDAwMCcKK2RzYmFzMTU3IHRvU2NpICI0RSs5IiAgICAgIC0+ICc0RSs5JworZHNiYXMxNTggdG9TY2kgIjQ0RSs5IiAgICAgLT4gJzQuNEUrMTAnCitkc2JhczE1OSB0b1NjaSAiMC43M2UtNyIgICAtPiAnNy4zRS04JworZHNiYXMxNjAgdG9TY2kgIjAwRSs5IiAgICAgLT4gJzBFKzknCitkc2JhczE2MSB0b1NjaSAiMDBFLTkiICAgICAtPiAnMEUtOScKK2RzYmFzMTYyIHRvU2NpICIxMEUrOSIgICAgIC0+ICcxLjBFKzEwJworZHNiYXMxNjMgdG9TY2kgIjEwRSswOSIgICAgLT4gJzEuMEUrMTAnCitkc2JhczE2NCB0b1NjaSAiMTBlKzkwIiAgICAtPiAnMS4wRSs5MScKK2RzYmFzMTY1IHRvU2NpICIxMEUrMDA5IiAgIC0+ICcxLjBFKzEwJworZHNiYXMxNjYgdG9TY2kgIjEwMGUrOSIgICAgLT4gJzEuMDBFKzExJworZHNiYXMxNjcgdG9TY2kgIjEwMGUrMDkiICAgLT4gJzEuMDBFKzExJworZHNiYXMxNjggdG9TY2kgIjEwMEUrOTAiICAgLT4gJzEuMDBFKzkyJworZHNiYXMxNjkgdG9TY2kgIjEwMGUrMDA5IiAgLT4gJzEuMDBFKzExJworCitkc2JhczE3MCB0b1NjaSAiMS4yNjUiICAgICAtPiAnMS4yNjUnCitkc2JhczE3MSB0b1NjaSAiMS4yNjVFLTIwIiAtPiAnMS4yNjVFLTIwJworZHNiYXMxNzIgdG9TY2kgIjEuMjY1RS04IiAgLT4gJzEuMjY1RS04JworZHNiYXMxNzMgdG9TY2kgIjEuMjY1RS00IiAgLT4gJzAuMDAwMTI2NScKK2RzYmFzMTc0IHRvU2NpICIxLjI2NUUtMyIgIC0+ICcwLjAwMTI2NScKK2RzYmFzMTc1IHRvU2NpICIxLjI2NUUtMiIgIC0+ICcwLjAxMjY1JworZHNiYXMxNzYgdG9TY2kgIjEuMjY1RS0xIiAgLT4gJzAuMTI2NScKK2RzYmFzMTc3IHRvU2NpICIxLjI2NUUtMCIgIC0+ICcxLjI2NScKK2RzYmFzMTc4IHRvU2NpICIxLjI2NUUrMSIgIC0+ICcxMi42NScKK2RzYmFzMTc5IHRvU2NpICIxLjI2NUUrMiIgIC0+ICcxMjYuNScKK2RzYmFzMTgwIHRvU2NpICIxLjI2NUUrMyIgIC0+ICcxMjY1JworZHNiYXMxODEgdG9TY2kgIjEuMjY1RSs0IiAgLT4gJzEuMjY1RSs0JworZHNiYXMxODIgdG9TY2kgIjEuMjY1RSs4IiAgLT4gJzEuMjY1RSs4JworZHNiYXMxODMgdG9TY2kgIjEuMjY1RSsyMCIgLT4gJzEuMjY1RSsyMCcKKworZHNiYXMxOTAgdG9TY2kgIjEyLjY1IiAgICAgLT4gJzEyLjY1JworZHNiYXMxOTEgdG9TY2kgIjEyLjY1RS0yMCIgLT4gJzEuMjY1RS0xOScKK2RzYmFzMTkyIHRvU2NpICIxMi42NUUtOCIgIC0+ICcxLjI2NUUtNycKK2RzYmFzMTkzIHRvU2NpICIxMi42NUUtNCIgIC0+ICcwLjAwMTI2NScKK2RzYmFzMTk0IHRvU2NpICIxMi42NUUtMyIgIC0+ICcwLjAxMjY1JworZHNiYXMxOTUgdG9TY2kgIjEyLjY1RS0yIiAgLT4gJzAuMTI2NScKK2RzYmFzMTk2IHRvU2NpICIxMi42NUUtMSIgIC0+ICcxLjI2NScKK2RzYmFzMTk3IHRvU2NpICIxMi42NUUtMCIgIC0+ICcxMi42NScKK2RzYmFzMTk4IHRvU2NpICIxMi42NUUrMSIgIC0+ICcxMjYuNScKK2RzYmFzMTk5IHRvU2NpICIxMi42NUUrMiIgIC0+ICcxMjY1JworZHNiYXMyMDAgdG9TY2kgIjEyLjY1RSszIiAgLT4gJzEuMjY1RSs0JworZHNiYXMyMDEgdG9TY2kgIjEyLjY1RSs0IiAgLT4gJzEuMjY1RSs1JworZHNiYXMyMDIgdG9TY2kgIjEyLjY1RSs4IiAgLT4gJzEuMjY1RSs5JworZHNiYXMyMDMgdG9TY2kgIjEyLjY1RSsyMCIgLT4gJzEuMjY1RSsyMScKKworZHNiYXMyMTAgdG9TY2kgIjEyNi41IiAgICAgLT4gJzEyNi41JworZHNiYXMyMTEgdG9TY2kgIjEyNi41RS0yMCIgLT4gJzEuMjY1RS0xOCcKK2RzYmFzMjEyIHRvU2NpICIxMjYuNUUtOCIgIC0+ICcwLjAwMDAwMTI2NScKK2RzYmFzMjEzIHRvU2NpICIxMjYuNUUtNCIgIC0+ICcwLjAxMjY1JworZHNiYXMyMTQgdG9TY2kgIjEyNi41RS0zIiAgLT4gJzAuMTI2NScKK2RzYmFzMjE1IHRvU2NpICIxMjYuNUUtMiIgIC0+ICcxLjI2NScKK2RzYmFzMjE2IHRvU2NpICIxMjYuNUUtMSIgIC0+ICcxMi42NScKK2RzYmFzMjE3IHRvU2NpICIxMjYuNUUtMCIgIC0+ICcxMjYuNScKK2RzYmFzMjE4IHRvU2NpICIxMjYuNUUrMSIgIC0+ICcxMjY1JworZHNiYXMyMTkgdG9TY2kgIjEyNi41RSsyIiAgLT4gJzEuMjY1RSs0JworZHNiYXMyMjAgdG9TY2kgIjEyNi41RSszIiAgLT4gJzEuMjY1RSs1JworZHNiYXMyMjEgdG9TY2kgIjEyNi41RSs0IiAgLT4gJzEuMjY1RSs2JworZHNiYXMyMjIgdG9TY2kgIjEyNi41RSs4IiAgLT4gJzEuMjY1RSsxMCcKK2RzYmFzMjIzIHRvU2NpICIxMjYuNUUrMjAiIC0+ICcxLjI2NUUrMjInCisKK2RzYmFzMjMwIHRvU2NpICIxMjY1IiAgICAgLT4gJzEyNjUnCitkc2JhczIzMSB0b1NjaSAiMTI2NUUtMjAiIC0+ICcxLjI2NUUtMTcnCitkc2JhczIzMiB0b1NjaSAiMTI2NUUtOCIgIC0+ICcwLjAwMDAxMjY1JworZHNiYXMyMzMgdG9TY2kgIjEyNjVFLTQiICAtPiAnMC4xMjY1JworZHNiYXMyMzQgdG9TY2kgIjEyNjVFLTMiICAtPiAnMS4yNjUnCitkc2JhczIzNSB0b1NjaSAiMTI2NUUtMiIgIC0+ICcxMi42NScKK2RzYmFzMjM2IHRvU2NpICIxMjY1RS0xIiAgLT4gJzEyNi41JworZHNiYXMyMzcgdG9TY2kgIjEyNjVFLTAiICAtPiAnMTI2NScKK2RzYmFzMjM4IHRvU2NpICIxMjY1RSsxIiAgLT4gJzEuMjY1RSs0JworZHNiYXMyMzkgdG9TY2kgIjEyNjVFKzIiICAtPiAnMS4yNjVFKzUnCitkc2JhczI0MCB0b1NjaSAiMTI2NUUrMyIgIC0+ICcxLjI2NUUrNicKK2RzYmFzMjQxIHRvU2NpICIxMjY1RSs0IiAgLT4gJzEuMjY1RSs3JworZHNiYXMyNDIgdG9TY2kgIjEyNjVFKzgiICAtPiAnMS4yNjVFKzExJworZHNiYXMyNDMgdG9TY2kgIjEyNjVFKzIwIiAtPiAnMS4yNjVFKzIzJworCitkc2JhczI1MCB0b1NjaSAiMC4xMjY1IiAgICAgLT4gJzAuMTI2NScKK2RzYmFzMjUxIHRvU2NpICIwLjEyNjVFLTIwIiAtPiAnMS4yNjVFLTIxJworZHNiYXMyNTIgdG9TY2kgIjAuMTI2NUUtOCIgIC0+ICcxLjI2NUUtOScKK2RzYmFzMjUzIHRvU2NpICIwLjEyNjVFLTQiICAtPiAnMC4wMDAwMTI2NScKK2RzYmFzMjU0IHRvU2NpICIwLjEyNjVFLTMiICAtPiAnMC4wMDAxMjY1JworZHNiYXMyNTUgdG9TY2kgIjAuMTI2NUUtMiIgIC0+ICcwLjAwMTI2NScKK2RzYmFzMjU2IHRvU2NpICIwLjEyNjVFLTEiICAtPiAnMC4wMTI2NScKK2RzYmFzMjU3IHRvU2NpICIwLjEyNjVFLTAiICAtPiAnMC4xMjY1JworZHNiYXMyNTggdG9TY2kgIjAuMTI2NUUrMSIgIC0+ICcxLjI2NScKK2RzYmFzMjU5IHRvU2NpICIwLjEyNjVFKzIiICAtPiAnMTIuNjUnCitkc2JhczI2MCB0b1NjaSAiMC4xMjY1RSszIiAgLT4gJzEyNi41JworZHNiYXMyNjEgdG9TY2kgIjAuMTI2NUUrNCIgIC0+ICcxMjY1JworZHNiYXMyNjIgdG9TY2kgIjAuMTI2NUUrOCIgIC0+ICcxLjI2NUUrNycKK2RzYmFzMjYzIHRvU2NpICIwLjEyNjVFKzIwIiAtPiAnMS4yNjVFKzE5JworCistLSBzb21lIG1vcmUgbmVnYXRpdmUgemVyb3MgW3N5c3RlbWF0aWMgdGVzdHMgYmVsb3ddCitkc2JhczI5MCB0b1NjaSAiLTAuMDAwRS0xIiAgLT4gJy0wLjAwMDAnCitkc2JhczI5MSB0b1NjaSAiLTAuMDAwRS0yIiAgLT4gJy0wLjAwMDAwJworZHNiYXMyOTIgdG9TY2kgIi0wLjAwMEUtMyIgIC0+ICctMC4wMDAwMDAnCitkc2JhczI5MyB0b1NjaSAiLTAuMDAwRS00IiAgLT4gJy0wRS03JworZHNiYXMyOTQgdG9TY2kgIi0wLjAwRS0yIiAgIC0+ICctMC4wMDAwJworZHNiYXMyOTUgdG9TY2kgIi0wLjAwRS0zIiAgIC0+ICctMC4wMDAwMCcKK2RzYmFzMjk2IHRvU2NpICItMC4wRS0yIiAgICAtPiAnLTAuMDAwJworZHNiYXMyOTcgdG9TY2kgIi0wLjBFLTMiICAgIC0+ICctMC4wMDAwJworZHNiYXMyOTggdG9TY2kgIi0wRS0yIiAgICAgIC0+ICctMC4wMCcKK2RzYmFzMjk5IHRvU2NpICItMEUtMyIgICAgICAtPiAnLTAuMDAwJworCistLSBFbmdpbmVlcmluZyBub3RhdGlvbiB0ZXN0cworZHNiYXMzMDEgIHRvU2NpIDEwZTEyICAtPiAxLjBFKzEzCitkc2JhczMwMiAgdG9FbmcgMTBlMTIgIC0+IDEwRSsxMgorZHNiYXMzMDMgIHRvU2NpIDEwZTExICAtPiAxLjBFKzEyCitkc2JhczMwNCAgdG9FbmcgMTBlMTEgIC0+IDEuMEUrMTIKK2RzYmFzMzA1ICB0b1NjaSAxMGUxMCAgLT4gMS4wRSsxMQorZHNiYXMzMDYgIHRvRW5nIDEwZTEwICAtPiAxMDBFKzkKK2RzYmFzMzA3ICB0b1NjaSAxMGU5ICAgLT4gMS4wRSsxMAorZHNiYXMzMDggIHRvRW5nIDEwZTkgICAtPiAxMEUrOQorZHNiYXMzMDkgIHRvU2NpIDEwZTggICAtPiAxLjBFKzkKK2RzYmFzMzEwICB0b0VuZyAxMGU4ICAgLT4gMS4wRSs5Citkc2JhczMxMSAgdG9TY2kgMTBlNyAgIC0+IDEuMEUrOAorZHNiYXMzMTIgIHRvRW5nIDEwZTcgICAtPiAxMDBFKzYKK2RzYmFzMzEzICB0b1NjaSAxMGU2ICAgLT4gMS4wRSs3Citkc2JhczMxNCAgdG9FbmcgMTBlNiAgIC0+IDEwRSs2Citkc2JhczMxNSAgdG9TY2kgMTBlNSAgIC0+IDEuMEUrNgorZHNiYXMzMTYgIHRvRW5nIDEwZTUgICAtPiAxLjBFKzYKK2RzYmFzMzE3ICB0b1NjaSAxMGU0ICAgLT4gMS4wRSs1Citkc2JhczMxOCAgdG9FbmcgMTBlNCAgIC0+IDEwMEUrMworZHNiYXMzMTkgIHRvU2NpIDEwZTMgICAtPiAxLjBFKzQKK2RzYmFzMzIwICB0b0VuZyAxMGUzICAgLT4gMTBFKzMKK2RzYmFzMzIxICB0b1NjaSAxMGUyICAgLT4gMS4wRSszCitkc2JhczMyMiAgdG9FbmcgMTBlMiAgIC0+IDEuMEUrMworZHNiYXMzMjMgIHRvU2NpIDEwZTEgICAtPiAxLjBFKzIKK2RzYmFzMzI0ICB0b0VuZyAxMGUxICAgLT4gMTAwCitkc2JhczMyNSAgdG9TY2kgMTBlMCAgIC0+IDEwCitkc2JhczMyNiAgdG9FbmcgMTBlMCAgIC0+IDEwCitkc2JhczMyNyAgdG9TY2kgMTBlLTEgIC0+IDEuMAorZHNiYXMzMjggIHRvRW5nIDEwZS0xICAtPiAxLjAKK2RzYmFzMzI5ICB0b1NjaSAxMGUtMiAgLT4gMC4xMAorZHNiYXMzMzAgIHRvRW5nIDEwZS0yICAtPiAwLjEwCitkc2JhczMzMSAgdG9TY2kgMTBlLTMgIC0+IDAuMDEwCitkc2JhczMzMiAgdG9FbmcgMTBlLTMgIC0+IDAuMDEwCitkc2JhczMzMyAgdG9TY2kgMTBlLTQgIC0+IDAuMDAxMAorZHNiYXMzMzQgIHRvRW5nIDEwZS00ICAtPiAwLjAwMTAKK2RzYmFzMzM1ICB0b1NjaSAxMGUtNSAgLT4gMC4wMDAxMAorZHNiYXMzMzYgIHRvRW5nIDEwZS01ICAtPiAwLjAwMDEwCitkc2JhczMzNyAgdG9TY2kgMTBlLTYgIC0+IDAuMDAwMDEwCitkc2JhczMzOCAgdG9FbmcgMTBlLTYgIC0+IDAuMDAwMDEwCitkc2JhczMzOSAgdG9TY2kgMTBlLTcgIC0+IDAuMDAwMDAxMAorZHNiYXMzNDAgIHRvRW5nIDEwZS03ICAtPiAwLjAwMDAwMTAKK2RzYmFzMzQxICB0b1NjaSAxMGUtOCAgLT4gMS4wRS03Citkc2JhczM0MiAgdG9FbmcgMTBlLTggIC0+IDEwMEUtOQorZHNiYXMzNDMgIHRvU2NpIDEwZS05ICAtPiAxLjBFLTgKK2RzYmFzMzQ0ICB0b0VuZyAxMGUtOSAgLT4gMTBFLTkKK2RzYmFzMzQ1ICB0b1NjaSAxMGUtMTAgLT4gMS4wRS05Citkc2JhczM0NiAgdG9FbmcgMTBlLTEwIC0+IDEuMEUtOQorZHNiYXMzNDcgIHRvU2NpIDEwZS0xMSAtPiAxLjBFLTEwCitkc2JhczM0OCAgdG9FbmcgMTBlLTExIC0+IDEwMEUtMTIKK2RzYmFzMzQ5ICB0b1NjaSAxMGUtMTIgLT4gMS4wRS0xMQorZHNiYXMzNTAgIHRvRW5nIDEwZS0xMiAtPiAxMEUtMTIKK2RzYmFzMzUxICB0b1NjaSAxMGUtMTMgLT4gMS4wRS0xMgorZHNiYXMzNTIgIHRvRW5nIDEwZS0xMyAtPiAxLjBFLTEyCisKK2RzYmFzMzYxICB0b1NjaSA3RTEyICAtPiA3RSsxMgorZHNiYXMzNjIgIHRvRW5nIDdFMTIgIC0+IDdFKzEyCitkc2JhczM2MyAgdG9TY2kgN0UxMSAgLT4gN0UrMTEKK2RzYmFzMzY0ICB0b0VuZyA3RTExICAtPiA3MDBFKzkKK2RzYmFzMzY1ICB0b1NjaSA3RTEwICAtPiA3RSsxMAorZHNiYXMzNjYgIHRvRW5nIDdFMTAgIC0+IDcwRSs5Citkc2JhczM2NyAgdG9TY2kgN0U5ICAgLT4gN0UrOQorZHNiYXMzNjggIHRvRW5nIDdFOSAgIC0+IDdFKzkKK2RzYmFzMzY5ICB0b1NjaSA3RTggICAtPiA3RSs4Citkc2JhczM3MCAgdG9FbmcgN0U4ICAgLT4gNzAwRSs2Citkc2JhczM3MSAgdG9TY2kgN0U3ICAgLT4gN0UrNworZHNiYXMzNzIgIHRvRW5nIDdFNyAgIC0+IDcwRSs2Citkc2JhczM3MyAgdG9TY2kgN0U2ICAgLT4gN0UrNgorZHNiYXMzNzQgIHRvRW5nIDdFNiAgIC0+IDdFKzYKK2RzYmFzMzc1ICB0b1NjaSA3RTUgICAtPiA3RSs1Citkc2JhczM3NiAgdG9FbmcgN0U1ICAgLT4gNzAwRSszCitkc2JhczM3NyAgdG9TY2kgN0U0ICAgLT4gN0UrNAorZHNiYXMzNzggIHRvRW5nIDdFNCAgIC0+IDcwRSszCitkc2JhczM3OSAgdG9TY2kgN0UzICAgLT4gN0UrMworZHNiYXMzODAgIHRvRW5nIDdFMyAgIC0+IDdFKzMKK2RzYmFzMzgxICB0b1NjaSA3RTIgICAtPiA3RSsyCitkc2JhczM4MiAgdG9FbmcgN0UyICAgLT4gNzAwCitkc2JhczM4MyAgdG9TY2kgN0UxICAgLT4gN0UrMQorZHNiYXMzODQgIHRvRW5nIDdFMSAgIC0+IDcwCitkc2JhczM4NSAgdG9TY2kgN0UwICAgLT4gNworZHNiYXMzODYgIHRvRW5nIDdFMCAgIC0+IDcKK2RzYmFzMzg3ICB0b1NjaSA3RS0xICAtPiAwLjcKK2RzYmFzMzg4ICB0b0VuZyA3RS0xICAtPiAwLjcKK2RzYmFzMzg5ICB0b1NjaSA3RS0yICAtPiAwLjA3Citkc2JhczM5MCAgdG9FbmcgN0UtMiAgLT4gMC4wNworZHNiYXMzOTEgIHRvU2NpIDdFLTMgIC0+IDAuMDA3Citkc2JhczM5MiAgdG9FbmcgN0UtMyAgLT4gMC4wMDcKK2RzYmFzMzkzICB0b1NjaSA3RS00ICAtPiAwLjAwMDcKK2RzYmFzMzk0ICB0b0VuZyA3RS00ICAtPiAwLjAwMDcKK2RzYmFzMzk1ICB0b1NjaSA3RS01ICAtPiAwLjAwMDA3Citkc2JhczM5NiAgdG9FbmcgN0UtNSAgLT4gMC4wMDAwNworZHNiYXMzOTcgIHRvU2NpIDdFLTYgIC0+IDAuMDAwMDA3Citkc2JhczM5OCAgdG9FbmcgN0UtNiAgLT4gMC4wMDAwMDcKK2RzYmFzMzk5ICB0b1NjaSA3RS03ICAtPiA3RS03Citkc2JhczQwMCAgdG9FbmcgN0UtNyAgLT4gNzAwRS05Citkc2JhczQwMSAgdG9TY2kgN0UtOCAgLT4gN0UtOAorZHNiYXM0MDIgIHRvRW5nIDdFLTggIC0+IDcwRS05Citkc2JhczQwMyAgdG9TY2kgN0UtOSAgLT4gN0UtOQorZHNiYXM0MDQgIHRvRW5nIDdFLTkgIC0+IDdFLTkKK2RzYmFzNDA1ICB0b1NjaSA3RS0xMCAtPiA3RS0xMAorZHNiYXM0MDYgIHRvRW5nIDdFLTEwIC0+IDcwMEUtMTIKK2RzYmFzNDA3ICB0b1NjaSA3RS0xMSAtPiA3RS0xMQorZHNiYXM0MDggIHRvRW5nIDdFLTExIC0+IDcwRS0xMgorZHNiYXM0MDkgIHRvU2NpIDdFLTEyIC0+IDdFLTEyCitkc2JhczQxMCAgdG9FbmcgN0UtMTIgLT4gN0UtMTIKK2RzYmFzNDExICB0b1NjaSA3RS0xMyAtPiA3RS0xMworZHNiYXM0MTIgIHRvRW5nIDdFLTEzIC0+IDcwMEUtMTUKKworLS0gRXhhY3RzIHJlbWFpbiBleGFjdCB1cCB0byBwcmVjaXNpb24gLi4KK2RzYmFzNDIwICB0b1NjaSAgICAxMDAgLT4gMTAwCitkc2JhczQyMiAgdG9TY2kgICAxMDAwIC0+IDEwMDAKK2RzYmFzNDI0ICB0b1NjaSAgOTk5LjkgLT4gIDk5OS45Citkc2JhczQyNiAgdG9TY2kgMTAwMC4wIC0+IDEwMDAuMAorZHNiYXM0MjggIHRvU2NpIDEwMDAuMSAtPiAxMDAwLjEKK2RzYmFzNDMwICB0b1NjaSAxMDAwMCAtPiAxMDAwMAorZHNiYXM0MzIgIHRvU2NpIDEwMDAgICAgICAgIC0+IDEwMDAKK2RzYmFzNDM0ICB0b1NjaSAxMDAwMCAgICAgICAtPiAxMDAwMAorZHNiYXM0MzYgIHRvU2NpIDEwMDAwMCAgICAgIC0+IDEwMDAwMAorZHNiYXM0MzggIHRvU2NpIDEwMDAwMDAgICAgIC0+IDEwMDAwMDAKK2RzYmFzNDQwICB0b1NjaSAxMDAwMDAwMCAgICAtPiAxLjAwMDAwMEUrNyAgIFJvdW5kZWQKK2RzYmFzNDQyICB0b1NjaSAxMDAwMDAwMCAgICAtPiAxLjAwMDAwMEUrNyAgIFJvdW5kZWQKK2RzYmFzNDQ0ICB0b1NjaSAxMDAwMDAwMyAgICAtPiAxLjAwMDAwMEUrNyAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NDYgIHRvU2NpIDEwMDAwMDA1ICAgIC0+IDEuMDAwMDAwRSs3ICAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ0OCAgdG9TY2kgMTAwMDAwMDUwICAgLT4gMS4wMDAwMDBFKzggICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDUwICB0b1NjaSAxMDAwMDAwOSAgICAtPiAxLjAwMDAwMUUrNyAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NTIgIHRvU2NpIDEwMDAwMDAwMCAgIC0+IDEuMDAwMDAwRSs4ICAgUm91bmRlZAorZHNiYXM0NTQgIHRvU2NpIDEwMDAwMDAwMyAgIC0+IDEuMDAwMDAwRSs4ICAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ1NiAgdG9TY2kgMTAwMDAwMDA1ICAgLT4gMS4wMDAwMDBFKzggICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDU4ICB0b1NjaSAxMDAwMDAwMDkgICAtPiAxLjAwMDAwMEUrOCAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NjAgIHRvU2NpIDEwMDAwMDAwMDAgIC0+IDEuMDAwMDAwRSs5ICAgUm91bmRlZAorZHNiYXM0NjIgIHRvU2NpIDEwMDAwMDAzMDAgIC0+IDEuMDAwMDAwRSs5ICAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ2NCAgdG9TY2kgMTAwMDAwMDUwMCAgLT4gMS4wMDAwMDBFKzkgICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDY2ICB0b1NjaSAxMDAwMDAwOTAwICAtPiAxLjAwMDAwMUUrOSAgIFJvdW5kZWQgSW5leGFjdAorZHNiYXM0NjggIHRvU2NpIDEwMDAwMDAwMDAwIC0+IDEuMDAwMDAwRSsxMCAgUm91bmRlZAorZHNiYXM0NzAgIHRvU2NpIDEwMDAwMDAzMDAwIC0+IDEuMDAwMDAwRSsxMCAgUm91bmRlZCBJbmV4YWN0Citkc2JhczQ3MiAgdG9TY2kgMTAwMDAwMDUwMDAgLT4gMS4wMDAwMDBFKzEwICBSb3VuZGVkIEluZXhhY3QKK2RzYmFzNDc0ICB0b1NjaSAxMDAwMDAwOTAwMCAtPiAxLjAwMDAwMUUrMTAgIFJvdW5kZWQgSW5leGFjdAorCistLSBjaGVjayByb3VuZGluZyBtb2RlcyBoZWVkZWQKK3JvdW5kaW5nOiAgY2VpbGluZworZHNic3I0MDEgIHRvU2NpICAxLjExMjM0NTAgICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjQwMiAgdG9TY2kgIDEuMTEyMzQ1NDkgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MDMgIHRvU2NpICAxLjExMjM0NTUwICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDA0ICB0b1NjaSAgMS4xMTIzNDU1MSAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitkc2JzcjQwNSAgdG9TY2kgIDEuMTEyMzQ1MCAgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNDA2ICB0b1NjaSAgMS4xMTIzNDU0OSAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQwNyAgdG9TY2kgIDEuMTEyMzQ1NTAgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MDggIHRvU2NpICAxLjExMjM0NTUxICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZmxvb3IKK2RzYnNyNDEwICB0b1NjaSAgMS4xMTIzNDUwICAgIC0+ICAxLjExMjM0NSAgUm91bmRlZAorZHNic3I0MTEgIHRvU2NpICAxLjExMjM0NTQ5ICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDEyICB0b1NjaSAgMS4xMTIzNDU1MCAgIC0+ICAxLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQxMyAgdG9TY2kgIDEuMTEyMzQ1NTEgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2Rvd24KK2RzYnNyNDE1ICB0b1NjaSAgMS4xMTIzNDUwICAgIC0+ICAxLjExMjM0NSAgUm91bmRlZAorZHNic3I0MTYgIHRvU2NpICAxLjExMjM0NTQ5ICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDE3ICB0b1NjaSAgMS4xMTIzNDU1MCAgIC0+ICAxLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQxOCAgdG9TY2kgIDEuMTEyMzQ2NTAgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MTkgIHRvU2NpICAxLjExMjM0NTUxICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkc2JzcjQyMSAgdG9TY2kgIDEuMTEyMzQ1MCAgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNDIyICB0b1NjaSAgMS4xMTIzNDU0OSAgIC0+ICAxLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQyMyAgdG9TY2kgIDEuMTEyMzQ1NTAgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MjQgIHRvU2NpICAxLjExMjM0NjUwICAgLT4gIDEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDI1ICB0b1NjaSAgMS4xMTIzNDU1MSAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2RzYnNyNDI2ICB0b1NjaSAgMS4xMTIzNDUwICAgIC0+ICAxLjExMjM0NSAgUm91bmRlZAorZHNic3I0MjcgIHRvU2NpICAxLjExMjM0NTQ5ICAgLT4gIDEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDI4ICB0b1NjaSAgMS4xMTIzNDU1MCAgIC0+ICAxLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQyOSAgdG9TY2kgIDEuMTEyMzQ1NTEgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX3VwCitkc2JzcjQzMSAgdG9TY2kgIDEuMTEyMzQ1MCAgICAtPiAgMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNDMyICB0b1NjaSAgMS4xMTIzNDU0OSAgIC0+ICAxLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjQzMyAgdG9TY2kgIDEuMTEyMzQ1NTAgICAtPiAgMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I0MzQgIHRvU2NpICAxLjExMjM0NjUwICAgLT4gIDEuMTEyMzQ3ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNDM1ICB0b1NjaSAgMS4xMTIzNDU1MSAgIC0+ICAxLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0CistLSBuZWdhdGl2ZXMKK3JvdW5kaW5nOiAgY2VpbGluZworZHNic3I1MDEgIHRvU2NpIC0xLjExMjM0NTAgICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkCitkc2JzcjUwMiAgdG9TY2kgLTEuMTEyMzQ1NDkgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MDMgIHRvU2NpIC0xLjExMjM0NTUwICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTA0ICB0b1NjaSAtMS4xMTIzNDU1MSAgIC0+IC0xLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIHVwCitkc2JzcjUwNSAgdG9TY2kgLTEuMTEyMzQ1MCAgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNTA2ICB0b1NjaSAtMS4xMTIzNDU0OSAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUwNyAgdG9TY2kgLTEuMTEyMzQ1NTAgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MDggIHRvU2NpIC0xLjExMjM0NTUxICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgZmxvb3IKK2RzYnNyNTEwICB0b1NjaSAtMS4xMTIzNDUwICAgIC0+IC0xLjExMjM0NSAgUm91bmRlZAorZHNic3I1MTEgIHRvU2NpIC0xLjExMjM0NTQ5ICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTEyICB0b1NjaSAtMS4xMTIzNDU1MCAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUxMyAgdG9TY2kgLTEuMTEyMzQ1NTEgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX2Rvd24KK2RzYnNyNTE1ICB0b1NjaSAtMS4xMTIzNDUwICAgIC0+IC0xLjExMjM0NSAgUm91bmRlZAorZHNic3I1MTYgIHRvU2NpIC0xLjExMjM0NTQ5ICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTE3ICB0b1NjaSAtMS4xMTIzNDU1MCAgIC0+IC0xLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUxOCAgdG9TY2kgLTEuMTEyMzQ2NTAgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MTkgIHRvU2NpIC0xLjExMjM0NTUxICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCitkc2JzcjUyMSAgdG9TY2kgLTEuMTEyMzQ1MCAgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNTIyICB0b1NjaSAtMS4xMTIzNDU0OSAgIC0+IC0xLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUyMyAgdG9TY2kgLTEuMTEyMzQ1NTAgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MjQgIHRvU2NpIC0xLjExMjM0NjUwICAgLT4gLTEuMTEyMzQ2ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTI1ICB0b1NjaSAtMS4xMTIzNDU1MSAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogIGRvd24KK2RzYnNyNTI2ICB0b1NjaSAtMS4xMTIzNDUwICAgIC0+IC0xLjExMjM0NSAgUm91bmRlZAorZHNic3I1MjcgIHRvU2NpIC0xLjExMjM0NTQ5ICAgLT4gLTEuMTEyMzQ1ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTI4ICB0b1NjaSAtMS4xMTIzNDU1MCAgIC0+IC0xLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUyOSAgdG9TY2kgLTEuMTEyMzQ1NTEgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQgSW5leGFjdAorcm91bmRpbmc6ICBoYWxmX3VwCitkc2JzcjUzMSAgdG9TY2kgLTEuMTEyMzQ1MCAgICAtPiAtMS4xMTIzNDUgIFJvdW5kZWQKK2RzYnNyNTMyICB0b1NjaSAtMS4xMTIzNDU0OSAgIC0+IC0xLjExMjM0NSAgUm91bmRlZCBJbmV4YWN0Citkc2JzcjUzMyAgdG9TY2kgLTEuMTEyMzQ1NTAgICAtPiAtMS4xMTIzNDYgIFJvdW5kZWQgSW5leGFjdAorZHNic3I1MzQgIHRvU2NpIC0xLjExMjM0NjUwICAgLT4gLTEuMTEyMzQ3ICBSb3VuZGVkIEluZXhhY3QKK2RzYnNyNTM1ICB0b1NjaSAtMS4xMTIzNDU1MSAgIC0+IC0xLjExMjM0NiAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gVGhlICdiYWRkaWVzJyB0ZXN0cyBmcm9tIERpYWdCaWdEZWNpbWFsLCBwbHVzIHNvbWUgbmV3IG9uZXMKK2RzYmFzNTAwIHRvU2NpICcxLi4yJyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MDEgdG9TY2kgJy4nICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUwMiB0b1NjaSAnLi4nICAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTAzIHRvU2NpICcrKzEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MDQgdG9TY2kgJy0tMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUwNSB0b1NjaSAnLSsxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTA2IHRvU2NpICcrLTEnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MDcgdG9TY2kgJzEyZScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUwOCB0b1NjaSAnMTJlKysnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTA5IHRvU2NpICcxMmY0JyAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MTAgdG9TY2kgJyArMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUxMSB0b1NjaSAnKyAxJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTEyIHRvU2NpICcxMiAnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MTMgdG9TY2kgJyArIDEnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUxNCB0b1NjaSAnIC0gMSAnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTE1IHRvU2NpICd4JyAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MTYgdG9TY2kgJy0xLScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUxNyB0b1NjaSAnMTItJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTE4IHRvU2NpICczKycgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MTkgdG9TY2kgJycgICAgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUyMCB0b1NjaSAnMWUtJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTIxIHRvU2NpICc3ZTk5OTk5YScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MjIgdG9TY2kgJzdlMTIzNTY3ODkweCcgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUyMyB0b1NjaSAnN2UxMjM1Njc4OTAxMngnICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTI0IHRvU2NpICcnICAgICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MjUgdG9TY2kgJ2UxMDAnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUyNiB0b1NjaSAnXHUwZTVhJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTI3IHRvU2NpICdcdTBiNjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MjggdG9TY2kgJzEyMyw2NScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUyOSB0b1NjaSAnMS4zNC41JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTMwIHRvU2NpICcuMTIzLjUnICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MzEgdG9TY2kgJzAxLjM1LicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUzMiB0b1NjaSAnMDEuMzUtJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTMzIHRvU2NpICcwMDAwLi4nICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MzQgdG9TY2kgJy4wMDAwLicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUzNSB0b1NjaSAnMDAuLjAwJyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTM2IHRvU2NpICcxMTFlKjEyMycgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1MzcgdG9TY2kgJzExMWUxMjMtJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczUzOCB0b1NjaSAnMTExZSsxMisnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTM5IHRvU2NpICcxMTFlMS0zLScgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NDAgdG9TY2kgJzExMWUxKjIzJyAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU0MSB0b1NjaSAnMTExZTFlKzMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTQyIHRvU2NpICcxZTEuMCcgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NDMgdG9TY2kgJzFlMTIzZScgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU0NCB0b1NjaSAndGVuJyAgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTQ1IHRvU2NpICdPTkUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NDYgdG9TY2kgJzFlLjEnICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU0NyB0b1NjaSAnMWUxLicgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTQ4IHRvU2NpICcxZWUnICAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NDkgdG9TY2kgJ2UrMScgICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU1MCB0b1NjaSAnMS4yMy40JyAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTUxIHRvU2NpICcxLjIuMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NTIgdG9TY2kgJzFFKzEuMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU1MyB0b1NjaSAnMUUrMS4yLjMnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTU0IHRvU2NpICcxRSsrMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NTUgdG9TY2kgJzFFLS0xJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU1NiB0b1NjaSAnMUUrLTEnICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTU3IHRvU2NpICcxRS0rMScgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NTggdG9TY2kgJzFFJycxJyAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU1OSB0b1NjaSAiMUUiIjEiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTYwIHRvU2NpICIxRSIiIiIiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorLS0gTmVhci1zcGVjaWFscworZHNiYXM1NjEgdG9TY2kgInFOYU4iICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU2MiB0b1NjaSAiTmFOcSIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTYzIHRvU2NpICJOYU5zIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NjQgdG9TY2kgIkluZmkiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU2NSB0b1NjaSAiSW5maW4iICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTY2IHRvU2NpICJJbmZpbmkiICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NjcgdG9TY2kgIkluZmluaXQiICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU2OCB0b1NjaSAiLUluZmluaXQiICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTY5IHRvU2NpICIwSW5mIiAgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NzAgdG9TY2kgIjlJbmYiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU3MSB0b1NjaSAiLTBJbmYiICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTcyIHRvU2NpICItOUluZiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1NzMgdG9TY2kgIi1zTmEiICAgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczU3NCB0b1NjaSAieE5hTiIgICAgICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTc1IHRvU2NpICIwc05hTiIgICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBzb21lIGJhZGRpZXMgd2l0aCBkb3RzIGFuZCBFcyBhbmQgZG90cyBhbmQgc3BlY2lhbHMKK2RzYmFzNTc2IHRvU2NpICAnZSsxJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTc3IHRvU2NpICAnLmUrMScgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTc4IHRvU2NpICAnKy5lKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTc5IHRvU2NpICAnLS5lKycgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTgwIHRvU2NpICAnLS5lJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTgxIHRvU2NpICAnRSsxJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTgyIHRvU2NpICAnLkUrMScgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTgzIHRvU2NpICAnKy5FKzEnICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTg0IHRvU2NpICAnLS5FKycgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNTg1IHRvU2NpICAnLS5FJyAgICAgICAgICAgIC0+ICBOYU4gQ29udmVyc2lvbl9zeW50YXgKKworZHNiYXM1ODYgdG9TY2kgICcuTmFOJyAgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODcgdG9TY2kgICctLk5hTicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODggdG9TY2kgICcrLnNOYU4nICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1ODkgdG9TY2kgICcrLkluZicgICAgICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM1OTAgdG9TY2kgICcuSW5maW5pdHknICAgICAgLT4gIE5hTiBDb252ZXJzaW9uX3N5bnRheAorCistLSBaZXJvcworZHNiYXM2MDEgdG9TY2kgMC4wMDAwMDAwMDAgICAgICAgLT4gMEUtOQorZHNiYXM2MDIgdG9TY2kgMC4wMDAwMDAwMCAgICAgICAgLT4gMEUtOAorZHNiYXM2MDMgdG9TY2kgMC4wMDAwMDAwICAgICAgICAgLT4gMEUtNworZHNiYXM2MDQgdG9TY2kgMC4wMDAwMDAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RzYmFzNjA1IHRvU2NpIDAuMDAwMDAgICAgICAgICAgIC0+IDAuMDAwMDAKK2RzYmFzNjA2IHRvU2NpIDAuMDAwMCAgICAgICAgICAgIC0+IDAuMDAwMAorZHNiYXM2MDcgdG9TY2kgMC4wMDAgICAgICAgICAgICAgLT4gMC4wMDAKK2RzYmFzNjA4IHRvU2NpIDAuMDAgICAgICAgICAgICAgIC0+IDAuMDAKK2RzYmFzNjA5IHRvU2NpIDAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZHNiYXM2MTAgdG9TY2kgIC4wICAgICAgICAgICAgICAgLT4gMC4wCitkc2JhczYxMSB0b1NjaSAwLiAgICAgICAgICAgICAgICAtPiAwCitkc2JhczYxMiB0b1NjaSAtLjAgICAgICAgICAgICAgICAtPiAtMC4wCitkc2JhczYxMyB0b1NjaSAtMC4gICAgICAgICAgICAgICAtPiAtMAorZHNiYXM2MTQgdG9TY2kgLTAuMCAgICAgICAgICAgICAgLT4gLTAuMAorZHNiYXM2MTUgdG9TY2kgLTAuMDAgICAgICAgICAgICAgLT4gLTAuMDAKK2RzYmFzNjE2IHRvU2NpIC0wLjAwMCAgICAgICAgICAgIC0+IC0wLjAwMAorZHNiYXM2MTcgdG9TY2kgLTAuMDAwMCAgICAgICAgICAgLT4gLTAuMDAwMAorZHNiYXM2MTggdG9TY2kgLTAuMDAwMDAgICAgICAgICAgLT4gLTAuMDAwMDAKK2RzYmFzNjE5IHRvU2NpIC0wLjAwMDAwMCAgICAgICAgIC0+IC0wLjAwMDAwMAorZHNiYXM2MjAgdG9TY2kgLTAuMDAwMDAwMCAgICAgICAgLT4gLTBFLTcKK2RzYmFzNjIxIHRvU2NpIC0wLjAwMDAwMDAwICAgICAgIC0+IC0wRS04Citkc2JhczYyMiB0b1NjaSAtMC4wMDAwMDAwMDAgICAgICAtPiAtMEUtOQorCitkc2JhczYzMCB0b1NjaSAgMC4wMEUrMCAgICAgICAgICAtPiAwLjAwCitkc2JhczYzMSB0b1NjaSAgMC4wMEUrMSAgICAgICAgICAtPiAwLjAKK2RzYmFzNjMyIHRvU2NpICAwLjAwRSsyICAgICAgICAgIC0+IDAKK2RzYmFzNjMzIHRvU2NpICAwLjAwRSszICAgICAgICAgIC0+IDBFKzEKK2RzYmFzNjM0IHRvU2NpICAwLjAwRSs0ICAgICAgICAgIC0+IDBFKzIKK2RzYmFzNjM1IHRvU2NpICAwLjAwRSs1ICAgICAgICAgIC0+IDBFKzMKK2RzYmFzNjM2IHRvU2NpICAwLjAwRSs2ICAgICAgICAgIC0+IDBFKzQKK2RzYmFzNjM3IHRvU2NpICAwLjAwRSs3ICAgICAgICAgIC0+IDBFKzUKK2RzYmFzNjM4IHRvU2NpICAwLjAwRSs4ICAgICAgICAgIC0+IDBFKzYKK2RzYmFzNjM5IHRvU2NpICAwLjAwRSs5ICAgICAgICAgIC0+IDBFKzcKKworZHNiYXM2NDAgdG9TY2kgIDAuMEUrMCAgICAgICAgICAgLT4gMC4wCitkc2JhczY0MSB0b1NjaSAgMC4wRSsxICAgICAgICAgICAtPiAwCitkc2JhczY0MiB0b1NjaSAgMC4wRSsyICAgICAgICAgICAtPiAwRSsxCitkc2JhczY0MyB0b1NjaSAgMC4wRSszICAgICAgICAgICAtPiAwRSsyCitkc2JhczY0NCB0b1NjaSAgMC4wRSs0ICAgICAgICAgICAtPiAwRSszCitkc2JhczY0NSB0b1NjaSAgMC4wRSs1ICAgICAgICAgICAtPiAwRSs0Citkc2JhczY0NiB0b1NjaSAgMC4wRSs2ICAgICAgICAgICAtPiAwRSs1Citkc2JhczY0NyB0b1NjaSAgMC4wRSs3ICAgICAgICAgICAtPiAwRSs2Citkc2JhczY0OCB0b1NjaSAgMC4wRSs4ICAgICAgICAgICAtPiAwRSs3Citkc2JhczY0OSB0b1NjaSAgMC4wRSs5ICAgICAgICAgICAtPiAwRSs4CisKK2RzYmFzNjUwIHRvU2NpICAwRSswICAgICAgICAgICAgIC0+IDAKK2RzYmFzNjUxIHRvU2NpICAwRSsxICAgICAgICAgICAgIC0+IDBFKzEKK2RzYmFzNjUyIHRvU2NpICAwRSsyICAgICAgICAgICAgIC0+IDBFKzIKK2RzYmFzNjUzIHRvU2NpICAwRSszICAgICAgICAgICAgIC0+IDBFKzMKK2RzYmFzNjU0IHRvU2NpICAwRSs0ICAgICAgICAgICAgIC0+IDBFKzQKK2RzYmFzNjU1IHRvU2NpICAwRSs1ICAgICAgICAgICAgIC0+IDBFKzUKK2RzYmFzNjU2IHRvU2NpICAwRSs2ICAgICAgICAgICAgIC0+IDBFKzYKK2RzYmFzNjU3IHRvU2NpICAwRSs3ICAgICAgICAgICAgIC0+IDBFKzcKK2RzYmFzNjU4IHRvU2NpICAwRSs4ICAgICAgICAgICAgIC0+IDBFKzgKK2RzYmFzNjU5IHRvU2NpICAwRSs5ICAgICAgICAgICAgIC0+IDBFKzkKKworZHNiYXM2NjAgdG9TY2kgIDAuMEUtMCAgICAgICAgICAgLT4gMC4wCitkc2JhczY2MSB0b1NjaSAgMC4wRS0xICAgICAgICAgICAtPiAwLjAwCitkc2JhczY2MiB0b1NjaSAgMC4wRS0yICAgICAgICAgICAtPiAwLjAwMAorZHNiYXM2NjMgdG9TY2kgIDAuMEUtMyAgICAgICAgICAgLT4gMC4wMDAwCitkc2JhczY2NCB0b1NjaSAgMC4wRS00ICAgICAgICAgICAtPiAwLjAwMDAwCitkc2JhczY2NSB0b1NjaSAgMC4wRS01ICAgICAgICAgICAtPiAwLjAwMDAwMAorZHNiYXM2NjYgdG9TY2kgIDAuMEUtNiAgICAgICAgICAgLT4gMEUtNworZHNiYXM2NjcgdG9TY2kgIDAuMEUtNyAgICAgICAgICAgLT4gMEUtOAorZHNiYXM2NjggdG9TY2kgIDAuMEUtOCAgICAgICAgICAgLT4gMEUtOQorZHNiYXM2NjkgdG9TY2kgIDAuMEUtOSAgICAgICAgICAgLT4gMEUtMTAKKworZHNiYXM2NzAgdG9TY2kgIDAuMDBFLTAgICAgICAgICAgLT4gMC4wMAorZHNiYXM2NzEgdG9TY2kgIDAuMDBFLTEgICAgICAgICAgLT4gMC4wMDAKK2RzYmFzNjcyIHRvU2NpICAwLjAwRS0yICAgICAgICAgIC0+IDAuMDAwMAorZHNiYXM2NzMgdG9TY2kgIDAuMDBFLTMgICAgICAgICAgLT4gMC4wMDAwMAorZHNiYXM2NzQgdG9TY2kgIDAuMDBFLTQgICAgICAgICAgLT4gMC4wMDAwMDAKK2RzYmFzNjc1IHRvU2NpICAwLjAwRS01ICAgICAgICAgIC0+IDBFLTcKK2RzYmFzNjc2IHRvU2NpICAwLjAwRS02ICAgICAgICAgIC0+IDBFLTgKK2RzYmFzNjc3IHRvU2NpICAwLjAwRS03ICAgICAgICAgIC0+IDBFLTkKK2RzYmFzNjc4IHRvU2NpICAwLjAwRS04ICAgICAgICAgIC0+IDBFLTEwCitkc2JhczY3OSB0b1NjaSAgMC4wMEUtOSAgICAgICAgICAtPiAwRS0xMQorCitkc2JhczY4MCB0b1NjaSAgMDAwMDAwLiAgICAgICAgICAtPiAgMAorZHNiYXM2ODEgdG9TY2kgICAwMDAwMC4gICAgICAgICAgLT4gIDAKK2RzYmFzNjgyIHRvU2NpICAgIDAwMDAuICAgICAgICAgIC0+ICAwCitkc2JhczY4MyB0b1NjaSAgICAgMDAwLiAgICAgICAgICAtPiAgMAorZHNiYXM2ODQgdG9TY2kgICAgICAwMC4gICAgICAgICAgLT4gIDAKK2RzYmFzNjg1IHRvU2NpICAgICAgIDAuICAgICAgICAgIC0+ICAwCitkc2JhczY4NiB0b1NjaSAgKzAwMDAwLiAgICAgICAgICAtPiAgMAorZHNiYXM2ODcgdG9TY2kgIC0wMDAwMC4gICAgICAgICAgLT4gLTAKK2RzYmFzNjg4IHRvU2NpICArMC4gICAgICAgICAgICAgIC0+ICAwCitkc2JhczY4OSB0b1NjaSAgLTAuICAgICAgICAgICAgICAtPiAtMAorCistLSBTcGVjaWFscworZHNiYXM3MDAgdG9TY2kgIk5hTiIgICAgICAgICAgICAgLT4gTmFOCitkc2JhczcwMSB0b1NjaSAibmFuIiAgICAgICAgICAgICAtPiBOYU4KK2RzYmFzNzAyIHRvU2NpICJuQW4iICAgICAgICAgICAgIC0+IE5hTgorZHNiYXM3MDMgdG9TY2kgIk5BTiIgICAgICAgICAgICAgLT4gTmFOCitkc2JhczcwNCB0b1NjaSAiK05hTiIgICAgICAgICAgICAtPiBOYU4KK2RzYmFzNzA1IHRvU2NpICIrbmFuIiAgICAgICAgICAgIC0+IE5hTgorZHNiYXM3MDYgdG9TY2kgIituQW4iICAgICAgICAgICAgLT4gTmFOCitkc2JhczcwNyB0b1NjaSAiK05BTiIgICAgICAgICAgICAtPiBOYU4KK2RzYmFzNzA4IHRvU2NpICItTmFOIiAgICAgICAgICAgIC0+IC1OYU4KK2RzYmFzNzA5IHRvU2NpICItbmFuIiAgICAgICAgICAgIC0+IC1OYU4KK2RzYmFzNzEwIHRvU2NpICItbkFuIiAgICAgICAgICAgIC0+IC1OYU4KK2RzYmFzNzExIHRvU2NpICItTkFOIiAgICAgICAgICAgIC0+IC1OYU4KK2RzYmFzNzEyIHRvU2NpICdOYU4wJyAgICAgICAgICAgIC0+IE5hTgorZHNiYXM3MTMgdG9TY2kgJ05hTjEnICAgICAgICAgICAgLT4gTmFOMQorZHNiYXM3MTQgdG9TY2kgJ05hTjEyJyAgICAgICAgICAgLT4gTmFOMTIKK2RzYmFzNzE1IHRvU2NpICdOYU4xMjMnICAgICAgICAgIC0+IE5hTjEyMworZHNiYXM3MTYgdG9TY2kgJ05hTjEyMzQnICAgICAgICAgLT4gTmFOMTIzNAorZHNiYXM3MTcgdG9TY2kgJ05hTjAxJyAgICAgICAgICAgLT4gTmFOMQorZHNiYXM3MTggdG9TY2kgJ05hTjAxMicgICAgICAgICAgLT4gTmFOMTIKK2RzYmFzNzE5IHRvU2NpICdOYU4wMTIzJyAgICAgICAgIC0+IE5hTjEyMworZHNiYXM3MjAgdG9TY2kgJ05hTjAxMjM0JyAgICAgICAgLT4gTmFOMTIzNAorZHNiYXM3MjEgdG9TY2kgJ05hTjAwMScgICAgICAgICAgLT4gTmFOMQorZHNiYXM3MjIgdG9TY2kgJ05hTjAwMTInICAgICAgICAgLT4gTmFOMTIKK2RzYmFzNzIzIHRvU2NpICdOYU4wMDEyMycgICAgICAgIC0+IE5hTjEyMworZHNiYXM3MjQgdG9TY2kgJ05hTjAwMTIzNCcgICAgICAgLT4gTmFOMTIzNAorZHNiYXM3MjUgdG9TY2kgJ05hTjEyMzQ1Njc4OTAxMjM0NTYnIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM3MjYgdG9TY2kgJ05hTjEyM2UrMScgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2JhczcyNyB0b1NjaSAnTmFOMTIuNDUnICAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNzI4IHRvU2NpICdOYU4tMTInICAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorZHNiYXM3MjkgdG9TY2kgJ05hTisxMicgICAgICAgICAgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4CisKK2RzYmFzNzMwIHRvU2NpICJzTmFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzMxIHRvU2NpICJzbmFuIiAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzMyIHRvU2NpICJTbkFuIiAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzMzIHRvU2NpICJTTkFOIiAgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzM0IHRvU2NpICIrc05hTiIgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzM1IHRvU2NpICIrc25hbiIgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzM2IHRvU2NpICIrU25BbiIgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzM3IHRvU2NpICIrU05BTiIgICAgICAgICAgIC0+IHNOYU4KK2RzYmFzNzM4IHRvU2NpICItc05hTiIgICAgICAgICAgIC0+IC1zTmFOCitkc2JhczczOSB0b1NjaSAiLXNuYW4iICAgICAgICAgICAtPiAtc05hTgorZHNiYXM3NDAgdG9TY2kgIi1TbkFuIiAgICAgICAgICAgLT4gLXNOYU4KK2RzYmFzNzQxIHRvU2NpICItU05BTiIgICAgICAgICAgIC0+IC1zTmFOCitkc2Jhczc0MiB0b1NjaSAnc05hTjAwMDAnICAgICAgICAtPiBzTmFOCitkc2Jhczc0MyB0b1NjaSAnc05hTjcnICAgICAgICAgICAtPiBzTmFONworZHNiYXM3NDQgdG9TY2kgJ3NOYU4wMDcyMzQnICAgICAgLT4gc05hTjcyMzQKK2RzYmFzNzQ1IHRvU2NpICdzTmFONzIzNDU2MTIzNDU2Nzg5MCcgLT4gTmFOIENvbnZlcnNpb25fc3ludGF4Citkc2Jhczc0NiB0b1NjaSAnc05hTjcyLjQ1JyAgICAgICAtPiBOYU4gQ29udmVyc2lvbl9zeW50YXgKK2RzYmFzNzQ3IHRvU2NpICdzTmFOLTcyJyAgICAgICAgIC0+IE5hTiBDb252ZXJzaW9uX3N5bnRheAorCitkc2Jhczc0OCB0b1NjaSAiSW5mIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NDkgdG9TY2kgImluZiIgICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzUwIHRvU2NpICJpTmYiICAgICAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc1MSB0b1NjaSAiSU5GIiAgICAgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NTIgdG9TY2kgIitJbmYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzUzIHRvU2NpICIraW5mIiAgICAgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc1NCB0b1NjaSAiK2lOZiIgICAgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NTUgdG9TY2kgIitJTkYiICAgICAgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzU2IHRvU2NpICItSW5mIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorZHNiYXM3NTcgdG9TY2kgIi1pbmYiICAgICAgICAgICAgLT4gLUluZmluaXR5Citkc2Jhczc1OCB0b1NjaSAiLWlOZiIgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2RzYmFzNzU5IHRvU2NpICItSU5GIiAgICAgICAgICAgIC0+IC1JbmZpbml0eQorCitkc2Jhczc2MCB0b1NjaSAiSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NjEgdG9TY2kgImluZmluaXR5IiAgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzYyIHRvU2NpICJpTmZJbkl0WSIgICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc2MyB0b1NjaSAiSU5GSU5JVFkiICAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NjQgdG9TY2kgIitJbmZpbml0eSIgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzY1IHRvU2NpICIraW5maW5pdHkiICAgICAgIC0+IEluZmluaXR5Citkc2Jhczc2NiB0b1NjaSAiK2lOZkluSXRZIiAgICAgICAtPiBJbmZpbml0eQorZHNiYXM3NjcgdG9TY2kgIitJTkZJTklUWSIgICAgICAgLT4gSW5maW5pdHkKK2RzYmFzNzY4IHRvU2NpICItSW5maW5pdHkiICAgICAgIC0+IC1JbmZpbml0eQorZHNiYXM3NjkgdG9TY2kgIi1pbmZpbml0eSIgICAgICAgLT4gLUluZmluaXR5Citkc2Jhczc3MCB0b1NjaSAiLWlOZkluSXRZIiAgICAgICAtPiAtSW5maW5pdHkKK2RzYmFzNzcxIHRvU2NpICItSU5GSU5JVFkiICAgICAgIC0+IC1JbmZpbml0eQorCistLSBTcGVjaWFscyBhbmQgemVyb3MgZm9yIHRvRW5nCitkc2Jhc3Q3NzIgdG9FbmcgIk5hTiIgICAgICAgICAgICAgIC0+IE5hTgorZHNiYXN0NzczIHRvRW5nICItSW5maW5pdHkiICAgICAgICAtPiAtSW5maW5pdHkKK2RzYmFzdDc3NCB0b0VuZyAiLXNOYU4iICAgICAgICAgICAgLT4gLXNOYU4KK2RzYmFzdDc3NSB0b0VuZyAiLU5hTiIgICAgICAgICAgICAgLT4gLU5hTgorZHNiYXN0Nzc2IHRvRW5nICIrSW5maW5pdHkiICAgICAgICAtPiBJbmZpbml0eQorZHNiYXN0Nzc4IHRvRW5nICIrc05hTiIgICAgICAgICAgICAtPiBzTmFOCitkc2Jhc3Q3NzkgdG9FbmcgIitOYU4iICAgICAgICAgICAgIC0+IE5hTgorZHNiYXN0NzgwIHRvRW5nICJJTkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXN0NzgxIHRvRW5nICJTTkFOIiAgICAgICAgICAgICAtPiBzTmFOCitkc2Jhc3Q3ODIgdG9FbmcgIk5BTiIgICAgICAgICAgICAgIC0+IE5hTgorZHNiYXN0NzgzIHRvRW5nICJpbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXN0Nzg0IHRvRW5nICJzbmFuIiAgICAgICAgICAgICAtPiBzTmFOCitkc2Jhc3Q3ODUgdG9FbmcgIm5hbiIgICAgICAgICAgICAgIC0+IE5hTgorZHNiYXN0Nzg2IHRvRW5nICJJbkZJTklUWSIgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXN0Nzg3IHRvRW5nICJTbkFOIiAgICAgICAgICAgICAtPiBzTmFOCitkc2Jhc3Q3ODggdG9FbmcgIm5BTiIgICAgICAgICAgICAgIC0+IE5hTgorZHNiYXN0Nzg5IHRvRW5nICJpTmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXN0NzkwIHRvRW5nICJzTmFuIiAgICAgICAgICAgICAtPiBzTmFOCitkc2Jhc3Q3OTEgdG9FbmcgIk5hbiIgICAgICAgICAgICAgIC0+IE5hTgorZHNiYXN0NzkyIHRvRW5nICJJbmZpbml0eSIgICAgICAgICAtPiBJbmZpbml0eQorZHNiYXN0NzkzIHRvRW5nICJzTmFOIiAgICAgICAgICAgICAtPiBzTmFOCisKKy0tIFplcm8gdG9FbmcsIGV0Yy4KK2RzYmFzdDgwMCB0b0VuZyAwZSsxICAgICAgICAgICAgICAtPiAiMC4wMEUrMyIgIC0tIGRvYyBleGFtcGxlCisKK2RzYmFzdDgwMSB0b0VuZyAwLjAwMDAwMDAwMCAgICAgICAtPiAwRS05Citkc2Jhc3Q4MDIgdG9FbmcgMC4wMDAwMDAwMCAgICAgICAgLT4gMC4wMEUtNgorZHNiYXN0ODAzIHRvRW5nIDAuMDAwMDAwMCAgICAgICAgIC0+IDAuMEUtNgorZHNiYXN0ODA0IHRvRW5nIDAuMDAwMDAwICAgICAgICAgIC0+IDAuMDAwMDAwCitkc2Jhc3Q4MDUgdG9FbmcgMC4wMDAwMCAgICAgICAgICAgLT4gMC4wMDAwMAorZHNiYXN0ODA2IHRvRW5nIDAuMDAwMCAgICAgICAgICAgIC0+IDAuMDAwMAorZHNiYXN0ODA3IHRvRW5nIDAuMDAwICAgICAgICAgICAgIC0+IDAuMDAwCitkc2Jhc3Q4MDggdG9FbmcgMC4wMCAgICAgICAgICAgICAgLT4gMC4wMAorZHNiYXN0ODA5IHRvRW5nIDAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZHNiYXN0ODEwIHRvRW5nICAuMCAgICAgICAgICAgICAgIC0+IDAuMAorZHNiYXN0ODExIHRvRW5nIDAuICAgICAgICAgICAgICAgIC0+IDAKK2RzYmFzdDgxMiB0b0VuZyAtLjAgICAgICAgICAgICAgICAtPiAtMC4wCitkc2Jhc3Q4MTMgdG9FbmcgLTAuICAgICAgICAgICAgICAgLT4gLTAKK2RzYmFzdDgxNCB0b0VuZyAtMC4wICAgICAgICAgICAgICAtPiAtMC4wCitkc2Jhc3Q4MTUgdG9FbmcgLTAuMDAgICAgICAgICAgICAgLT4gLTAuMDAKK2RzYmFzdDgxNiB0b0VuZyAtMC4wMDAgICAgICAgICAgICAtPiAtMC4wMDAKK2RzYmFzdDgxNyB0b0VuZyAtMC4wMDAwICAgICAgICAgICAtPiAtMC4wMDAwCitkc2Jhc3Q4MTggdG9FbmcgLTAuMDAwMDAgICAgICAgICAgLT4gLTAuMDAwMDAKK2RzYmFzdDgxOSB0b0VuZyAtMC4wMDAwMDAgICAgICAgICAtPiAtMC4wMDAwMDAKK2RzYmFzdDgyMCB0b0VuZyAtMC4wMDAwMDAwICAgICAgICAtPiAtMC4wRS02Citkc2Jhc3Q4MjEgdG9FbmcgLTAuMDAwMDAwMDAgICAgICAgLT4gLTAuMDBFLTYKK2RzYmFzdDgyMiB0b0VuZyAtMC4wMDAwMDAwMDAgICAgICAtPiAtMEUtOQorCitkc2Jhc3Q4MzAgdG9FbmcgIDAuMDBFKzAgICAgICAgICAgLT4gMC4wMAorZHNiYXN0ODMxIHRvRW5nICAwLjAwRSsxICAgICAgICAgIC0+IDAuMAorZHNiYXN0ODMyIHRvRW5nICAwLjAwRSsyICAgICAgICAgIC0+IDAKK2RzYmFzdDgzMyB0b0VuZyAgMC4wMEUrMyAgICAgICAgICAtPiAwLjAwRSszCitkc2Jhc3Q4MzQgdG9FbmcgIDAuMDBFKzQgICAgICAgICAgLT4gMC4wRSszCitkc2Jhc3Q4MzUgdG9FbmcgIDAuMDBFKzUgICAgICAgICAgLT4gMEUrMworZHNiYXN0ODM2IHRvRW5nICAwLjAwRSs2ICAgICAgICAgIC0+IDAuMDBFKzYKK2RzYmFzdDgzNyB0b0VuZyAgMC4wMEUrNyAgICAgICAgICAtPiAwLjBFKzYKK2RzYmFzdDgzOCB0b0VuZyAgMC4wMEUrOCAgICAgICAgICAtPiAwRSs2Citkc2Jhc3Q4MzkgdG9FbmcgIDAuMDBFKzkgICAgICAgICAgLT4gMC4wMEUrOQorCitkc2Jhc3Q4NDAgdG9FbmcgIDAuMEUrMCAgICAgICAgICAgLT4gMC4wCitkc2Jhc3Q4NDEgdG9FbmcgIDAuMEUrMSAgICAgICAgICAgLT4gMAorZHNiYXN0ODQyIHRvRW5nICAwLjBFKzIgICAgICAgICAgIC0+IDAuMDBFKzMKK2RzYmFzdDg0MyB0b0VuZyAgMC4wRSszICAgICAgICAgICAtPiAwLjBFKzMKK2RzYmFzdDg0NCB0b0VuZyAgMC4wRSs0ICAgICAgICAgICAtPiAwRSszCitkc2Jhc3Q4NDUgdG9FbmcgIDAuMEUrNSAgICAgICAgICAgLT4gMC4wMEUrNgorZHNiYXN0ODQ2IHRvRW5nICAwLjBFKzYgICAgICAgICAgIC0+IDAuMEUrNgorZHNiYXN0ODQ3IHRvRW5nICAwLjBFKzcgICAgICAgICAgIC0+IDBFKzYKK2RzYmFzdDg0OCB0b0VuZyAgMC4wRSs4ICAgICAgICAgICAtPiAwLjAwRSs5Citkc2Jhc3Q4NDkgdG9FbmcgIDAuMEUrOSAgICAgICAgICAgLT4gMC4wRSs5CisKK2RzYmFzdDg1MCB0b0VuZyAgMEUrMCAgICAgICAgICAgICAtPiAwCitkc2Jhc3Q4NTEgdG9FbmcgIDBFKzEgICAgICAgICAgICAgLT4gMC4wMEUrMworZHNiYXN0ODUyIHRvRW5nICAwRSsyICAgICAgICAgICAgIC0+IDAuMEUrMworZHNiYXN0ODUzIHRvRW5nICAwRSszICAgICAgICAgICAgIC0+IDBFKzMKK2RzYmFzdDg1NCB0b0VuZyAgMEUrNCAgICAgICAgICAgICAtPiAwLjAwRSs2Citkc2Jhc3Q4NTUgdG9FbmcgIDBFKzUgICAgICAgICAgICAgLT4gMC4wRSs2Citkc2Jhc3Q4NTYgdG9FbmcgIDBFKzYgICAgICAgICAgICAgLT4gMEUrNgorZHNiYXN0ODU3IHRvRW5nICAwRSs3ICAgICAgICAgICAgIC0+IDAuMDBFKzkKK2RzYmFzdDg1OCB0b0VuZyAgMEUrOCAgICAgICAgICAgICAtPiAwLjBFKzkKK2RzYmFzdDg1OSB0b0VuZyAgMEUrOSAgICAgICAgICAgICAtPiAwRSs5CisKK2RzYmFzdDg2MCB0b0VuZyAgMC4wRS0wICAgICAgICAgICAtPiAwLjAKK2RzYmFzdDg2MSB0b0VuZyAgMC4wRS0xICAgICAgICAgICAtPiAwLjAwCitkc2Jhc3Q4NjIgdG9FbmcgIDAuMEUtMiAgICAgICAgICAgLT4gMC4wMDAKK2RzYmFzdDg2MyB0b0VuZyAgMC4wRS0zICAgICAgICAgICAtPiAwLjAwMDAKK2RzYmFzdDg2NCB0b0VuZyAgMC4wRS00ICAgICAgICAgICAtPiAwLjAwMDAwCitkc2Jhc3Q4NjUgdG9FbmcgIDAuMEUtNSAgICAgICAgICAgLT4gMC4wMDAwMDAKK2RzYmFzdDg2NiB0b0VuZyAgMC4wRS02ICAgICAgICAgICAtPiAwLjBFLTYKK2RzYmFzdDg2NyB0b0VuZyAgMC4wRS03ICAgICAgICAgICAtPiAwLjAwRS02Citkc2Jhc3Q4NjggdG9FbmcgIDAuMEUtOCAgICAgICAgICAgLT4gMEUtOQorZHNiYXN0ODY5IHRvRW5nICAwLjBFLTkgICAgICAgICAgIC0+IDAuMEUtOQorCitkc2Jhc3Q4NzAgdG9FbmcgIDAuMDBFLTAgICAgICAgICAgLT4gMC4wMAorZHNiYXN0ODcxIHRvRW5nICAwLjAwRS0xICAgICAgICAgIC0+IDAuMDAwCitkc2Jhc3Q4NzIgdG9FbmcgIDAuMDBFLTIgICAgICAgICAgLT4gMC4wMDAwCitkc2Jhc3Q4NzMgdG9FbmcgIDAuMDBFLTMgICAgICAgICAgLT4gMC4wMDAwMAorZHNiYXN0ODc0IHRvRW5nICAwLjAwRS00ICAgICAgICAgIC0+IDAuMDAwMDAwCitkc2Jhc3Q4NzUgdG9FbmcgIDAuMDBFLTUgICAgICAgICAgLT4gMC4wRS02Citkc2Jhc3Q4NzYgdG9FbmcgIDAuMDBFLTYgICAgICAgICAgLT4gMC4wMEUtNgorZHNiYXN0ODc3IHRvRW5nICAwLjAwRS03ICAgICAgICAgIC0+IDBFLTkKK2RzYmFzdDg3OCB0b0VuZyAgMC4wMEUtOCAgICAgICAgICAtPiAwLjBFLTkKK2RzYmFzdDg3OSB0b0VuZyAgMC4wMEUtOSAgICAgICAgICAtPiAwLjAwRS05CisKKy0tIGxvbmcgaW5wdXQgc3RyaW5ncworZHNiYXM4MDEgdG9zY2kgICAgICAgICAgJzAxMjM0NTY3JyAtPiAxMjM0NTY3Citkc2JhczgwMiB0b3NjaSAgICAgICAgICcwMDEyMzQ1NjcnIC0+IDEyMzQ1NjcKK2RzYmFzODAzIHRvc2NpICAgICAgICAnMDAwMTIzNDU2NycgLT4gMTIzNDU2NworZHNiYXM4MDQgdG9zY2kgICAgICAgJzAwMDAxMjM0NTY3JyAtPiAxMjM0NTY3Citkc2JhczgwNSB0b3NjaSAgICAgICcwMDAwMDEyMzQ1NjcnIC0+IDEyMzQ1NjcKK2RzYmFzODA2IHRvc2NpICAgICAnMDAwMDAwMTIzNDU2NycgLT4gMTIzNDU2NworZHNiYXM4MDcgdG9zY2kgICAgJzAwMDAwMDAxMjM0NTY3JyAtPiAxMjM0NTY3Citkc2JhczgwOCB0b3NjaSAgICcwMDAwMDAwMDEyMzQ1NjcnIC0+IDEyMzQ1NjcKK2RzYmFzODA5IHRvc2NpICAnMDAwMDAwMDAwMTIzNDU2NycgLT4gMTIzNDU2NworZHNiYXM4MTAgdG9zY2kgJzAwMDAwMDAwMDAxMjM0NTY3JyAtPiAxMjM0NTY3CisKK2RzYmFzODExIHRvc2NpICAgICAgICAgICcwLjEyMzQ1NjcnIC0+ICAgICAgMC4xMjM0NTY3Citkc2JhczgxMiB0b3NjaSAgICAgICAgICcwLjAxMjM0NTY3JyAtPiAgICAgMC4wMTIzNDU2NworZHNiYXM4MTMgdG9zY2kgICAgICAgICcwLjAwMTIzNDU2NycgLT4gICAgMC4wMDEyMzQ1NjcKK2RzYmFzODE0IHRvc2NpICAgICAgICcwLjAwMDEyMzQ1NjcnIC0+ICAgMC4wMDAxMjM0NTY3Citkc2JhczgxNSB0b3NjaSAgICAgICcwLjAwMDAxMjM0NTY3JyAtPiAgMC4wMDAwMTIzNDU2NworZHNiYXM4MTYgdG9zY2kgICAgICcwLjAwMDAwMTIzNDU2NycgLT4gMC4wMDAwMDEyMzQ1NjcKK2RzYmFzODE3IHRvc2NpICAgICcwLjAwMDAwMDEyMzQ1NjcnIC0+ICAgICAgIDEuMjM0NTY3RS03Citkc2JhczgxOCB0b3NjaSAgICcwLjAwMDAwMDAxMjM0NTY3JyAtPiAgICAgICAxLjIzNDU2N0UtOAorZHNiYXM4MTkgdG9zY2kgICcwLjAwMDAwMDAwMTIzNDU2NycgLT4gICAgICAgMS4yMzQ1NjdFLTkKK2RzYmFzODIwIHRvc2NpICcwLjAwMDAwMDAwMDEyMzQ1NjcnIC0+ICAgICAgIDEuMjM0NTY3RS0xMAorCitkc2JhczgyMSB0b3NjaSAnMTIzNDU2NzkwJyAgICAgICAgIC0+IDEuMjM0NTY4RSs4IEluZXhhY3QgUm91bmRlZAorZHNiYXM4MjIgdG9zY2kgJzEyMzQ1Njc5MDEnICAgICAgICAtPiAxLjIzNDU2OEUrOSAgSW5leGFjdCBSb3VuZGVkCitkc2JhczgyMyB0b3NjaSAnMTIzNDU2NzkwMTInICAgICAgIC0+IDEuMjM0NTY4RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzODI0IHRvc2NpICcxMjM0NTY3OTAxMjMnICAgICAgLT4gMS4yMzQ1NjhFKzExIEluZXhhY3QgUm91bmRlZAorZHNiYXM4MjUgdG9zY2kgJzEyMzQ1Njc5MDEyMzQnICAgICAtPiAxLjIzNDU2OEUrMTIgSW5leGFjdCBSb3VuZGVkCitkc2JhczgyNiB0b3NjaSAnMTIzNDU2NzkwMTIzNDUnICAgIC0+IDEuMjM0NTY4RSsxMyBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzODI3IHRvc2NpICcxMjM0NTY3OTAxMjM0NTYnICAgLT4gMS4yMzQ1NjhFKzE0IEluZXhhY3QgUm91bmRlZAorZHNiYXM4MjggdG9zY2kgJzEyMzQ1Njc5MDEyMzQ1NjcnICAtPiAxLjIzNDU2OEUrMTUgSW5leGFjdCBSb3VuZGVkCitkc2JhczgyOSB0b3NjaSAnMTIzNDU2Nzg5MDEyMzQ1NicgIC0+IDEuMjM0NTY4RSsxNSBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgb3ZlcmZsb3dzCitkc2JhczkwNiB0b1NjaSAnOTllOTk5OTk5OTk5JyAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkwNyB0b1NjaSAnOTk5ZTk5OTk5OTk5OScgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkwOCB0b1NjaSAnMC45ZS05OTk5OTk5OTknICAgICAtPiAwRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MDkgdG9TY2kgJzAuMDllLTk5OTk5OTk5OScgICAgLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTEwIHRvU2NpICcwLjFlMTAwMDAwMDAwMCcgICAgIC0+IEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTExIHRvU2NpICcxMGUtMTAwMDAwMDAwMCcgICAgIC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczkxMiB0b1NjaSAnMC45ZTk5OTk5OTk5OTknICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkxMyB0b1NjaSAnOTllLTk5OTk5OTk5OTknICAgICAtPiAwRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MTQgdG9TY2kgJzExMWU5OTk5OTk5OTk5JyAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MTUgdG9TY2kgJzExMTFlLTk5OTk5OTk5OTknICAgLT4gMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTE2IHRvU2NpICcxMTExZS05OTk5OTk5OTk5OScgIC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczkxNyB0b1NjaSAnN2UxMDAwMDAwMDAwJyAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCistLSBuZWdhdGl2ZXMgdGhlIHNhbWUKK2RzYmFzOTE4IHRvU2NpICctOTllOTk5OTk5OTk5JyAgICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkxOSB0b1NjaSAnLTk5OWU5OTk5OTk5OTknICAgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MjAgdG9TY2kgJy0wLjllLTk5OTk5OTk5OScgICAgLT4gLTBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczkyMSB0b1NjaSAnLTAuMDllLTk5OTk5OTk5OScgICAtPiAtMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTIyIHRvU2NpICctMC4xZTEwMDAwMDAwMDAnICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkyMyB0b1NjaSAnLTEwZS0xMDAwMDAwMDAwJyAgICAtPiAtMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTI0IHRvU2NpICctMC45ZTk5OTk5OTk5OTknICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkyNSB0b1NjaSAnLTk5ZS05OTk5OTk5OTk5JyAgICAtPiAtMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTI2IHRvU2NpICctMTExZTk5OTk5OTk5OTknICAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCitkc2JhczkyNyB0b1NjaSAnLTExMTFlLTk5OTk5OTk5OTknICAtPiAtMEUtMTAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzOTI4IHRvU2NpICctMTExMWUtOTk5OTk5OTk5OTknIC0+IC0wRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXM5MjkgdG9TY2kgJy03ZTEwMDAwMDAwMDAnICAgICAgLT4gLUluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gb3ZlcmZsb3cgcmVzdWx0cyBhdCBkaWZmZXJlbnQgcm91bmRpbmcgbW9kZXMKK3JvdW5kaW5nOiAgY2VpbGluZworZHNiYXM5MzAgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTMxIHRvU2NpICctN2UxMDAwMCcgIC0+IC05Ljk5OTk5OUUrOTYgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6ICB1cAorZHNiYXM5MzIgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTMzIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGRvd24KK2RzYmFzOTM0IHRvU2NpICAnN2UxMDAwMCcgIC0+ICA5Ljk5OTk5OUUrOTYgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorZHNiYXM5MzUgdG9TY2kgJy03ZTEwMDAwJyAgLT4gLTkuOTk5OTk5RSs5NiBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGZsb29yCitkc2JhczkzNiB0b1NjaSAgJzdlMTAwMDAnICAtPiAgOS45OTk5OTlFKzk2IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTM3IHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl91cAorZHNiYXM5MzggdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTM5IHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGhhbGZfZXZlbgorZHNiYXM5NDAgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTQxIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogIGhhbGZfZG93bgorZHNiYXM5NDIgdG9TY2kgICc3ZTEwMDAwJyAgLT4gIEluZmluaXR5IE92ZXJmbG93ICBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzOTQzIHRvU2NpICctN2UxMDAwMCcgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgaGFsZl9ldmVuCisKKy0tIE5vdyBjaGVjayA4NTQvNzU0ciBzb21lIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdyB0byAwCitkc2JlbTQwMCB0b1NjaSAgMS4wMDAwRS04NiAgICAgLT4gMS4wMDAwRS04NgorZHNiZW00MDEgdG9TY2kgIDAuMUUtOTcgICAgICAgIC0+IDFFLTk4ICAgICAgIFN1Ym5vcm1hbAorZHNiZW00MDIgdG9TY2kgIDAuMTAwMEUtOTcgICAgIC0+IDEuMDAwRS05OCAgIFN1Ym5vcm1hbAorZHNiZW00MDMgdG9TY2kgIDAuMDEwMEUtOTcgICAgIC0+IDEuMDBFLTk5ICAgIFN1Ym5vcm1hbAorZHNiZW00MDQgdG9TY2kgIDAuMDAxMEUtOTcgICAgIC0+IDEuMEUtMTAwICAgICBTdWJub3JtYWwKK2RzYmVtNDA1IHRvU2NpICAwLjAwMDFFLTk3ICAgICAtPiAxRS0xMDEgICAgICAgU3Vibm9ybWFsCitkc2JlbTQwNiB0b1NjaSAgMC4wMDAxMEUtOTcgICAgLT4gMUUtMTAxICAgICBTdWJub3JtYWwgUm91bmRlZAorZHNiZW00MDcgdG9TY2kgIDAuMDAwMTNFLTk3ICAgIC0+IDFFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDA4IHRvU2NpICAwLjAwMDE1RS05NyAgICAtPiAyRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQwOSB0b1NjaSAgMC4wMDAxN0UtOTcgICAgLT4gMkUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MTAgdG9TY2kgIDAuMDAwMjNFLTk3ICAgIC0+IDJFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDExIHRvU2NpICAwLjAwMDI1RS05NyAgICAtPiAyRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQxMiB0b1NjaSAgMC4wMDAyN0UtOTcgICAgLT4gM0UtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MTMgdG9TY2kgIDAuMDAwMTQ5RS05NyAgIC0+IDFFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDE0IHRvU2NpICAwLjAwMDE1MEUtOTcgICAtPiAyRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQxNSB0b1NjaSAgMC4wMDAxNTFFLTk3ICAgLT4gMkUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MTYgdG9TY2kgIDAuMDAwMjQ5RS05NyAgIC0+IDJFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDE3IHRvU2NpICAwLjAwMDI1MEUtOTcgICAtPiAyRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQxOCB0b1NjaSAgMC4wMDAyNTFFLTk3ICAgLT4gM0UtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MTkgdG9TY2kgIDAuMDAwMDlFLTk3ICAgIC0+IDFFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDIwIHRvU2NpICAwLjAwMDA1RS05NyAgICAtPiAwRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmVtNDIxIHRvU2NpICAwLjAwMDAzRS05NyAgICAtPiAwRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmVtNDIyIHRvU2NpICAwLjAwMDAwOUUtOTcgICAtPiAwRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmVtNDIzIHRvU2NpICAwLjAwMDAwNUUtOTcgICAtPiAwRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmVtNDI0IHRvU2NpICAwLjAwMDAwM0UtOTcgICAtPiAwRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworZHNiZW00MjUgdG9TY2kgIDAuMDAxMDQ5RS05NyAgIC0+IDEuMEUtMTAwICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDI2IHRvU2NpICAwLjAwMTA1MEUtOTcgICAtPiAxLjBFLTEwMCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQyNyB0b1NjaSAgMC4wMDEwNTFFLTk3ICAgLT4gMS4xRS0xMDAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00MjggdG9TY2kgIDAuMDAxMTQ5RS05NyAgIC0+IDEuMUUtMTAwICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDI5IHRvU2NpICAwLjAwMTE1MEUtOTcgICAtPiAxLjJFLTEwMCAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQzMCB0b1NjaSAgMC4wMDExNTFFLTk3ICAgLT4gMS4yRS0xMDAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitkc2JlbTQzMiB0b1NjaSAgMC4wMTAwNDlFLTk3ICAgLT4gMS4wMEUtOTkgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQzMyB0b1NjaSAgMC4wMTAwNTBFLTk3ICAgLT4gMS4wMEUtOTkgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQzNCB0b1NjaSAgMC4wMTAwNTFFLTk3ICAgLT4gMS4wMUUtOTkgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQzNSB0b1NjaSAgMC4wMTAxNDlFLTk3ICAgLT4gMS4wMUUtOTkgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQzNiB0b1NjaSAgMC4wMTAxNTBFLTk3ICAgLT4gMS4wMkUtOTkgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQzNyB0b1NjaSAgMC4wMTAxNTFFLTk3ICAgLT4gMS4wMkUtOTkgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK2RzYmVtNDQwIHRvU2NpICAwLjEwMTAzRS05NyAgICAtPiAxLjAxMEUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDQxIHRvU2NpICAwLjEwMTA1RS05NyAgICAtPiAxLjAxMEUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDQyIHRvU2NpICAwLjEwMTA3RS05NyAgICAtPiAxLjAxMUUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDQzIHRvU2NpICAwLjEwMTEzRS05NyAgICAtPiAxLjAxMUUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDQ0IHRvU2NpICAwLjEwMTE1RS05NyAgICAtPiAxLjAxMkUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDQ1IHRvU2NpICAwLjEwMTE3RS05NyAgICAtPiAxLjAxMkUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZHNiZW00NTAgdG9TY2kgIDEuMTA3MzBFLTk4ICAgIC0+IDEuMTA3RS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NTEgdG9TY2kgIDEuMTA3NTBFLTk4ICAgIC0+IDEuMTA4RS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NTIgdG9TY2kgIDEuMTA3NzBFLTk4ICAgIC0+IDEuMTA4RS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NTMgdG9TY2kgIDEuMTA4MzBFLTk4ICAgIC0+IDEuMTA4RS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NTQgdG9TY2kgIDEuMTA4NTBFLTk4ICAgIC0+IDEuMTA4RS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NTUgdG9TY2kgIDEuMTA4NzBFLTk4ICAgIC0+IDEuMTA5RS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBtYWtlIHN1cmUgc2lnbiBPSworZHNiZW00NTYgdG9TY2kgIC0wLjEwMTAzRS05NyAgIC0+IC0xLjAxMEUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDU3IHRvU2NpICAtMC4xMDEwNUUtOTcgICAtPiAtMS4wMTBFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ1OCB0b1NjaSAgLTAuMTAxMDdFLTk3ICAgLT4gLTEuMDExRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NTkgdG9TY2kgIC0wLjEwMTEzRS05NyAgIC0+IC0xLjAxMUUtOTggVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDYwIHRvU2NpICAtMC4xMDExNUUtOTcgICAtPiAtMS4wMTJFLTk4IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ2MSB0b1NjaSAgLTAuMTAxMTdFLTk3ICAgLT4gLTEuMDEyRS05OCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSAnOTk5cycgY2FzZXMKK2RzYmVtNDY0IHRvU2NpICA5OTk5OTlFLTk4ICAgICAgICAgLT4gOS45OTk5OUUtOTMKK2RzYmVtNDY1IHRvU2NpICA5OTk5OS4wRS05NyAgICAgICAgLT4gOS45OTk5MEUtOTMKK2RzYmVtNDY2IHRvU2NpICA5OTk5OS5FLTk3ICAgICAgICAgLT4gOS45OTk5RS05MworZHNiZW00NjcgdG9TY2kgIDk5OTkuOUUtOTcgICAgICAgICAtPiA5Ljk5OTlFLTk0Citkc2JlbTQ2OCB0b1NjaSAgOTk5Ljk5RS05NyAgICAgICAgIC0+IDkuOTk5OUUtOTUKK2RzYmVtNDY5IHRvU2NpICA5OS45OTlFLTk3ICAgICAgICAgLT4gOS45OTk5RS05NiBTdWJub3JtYWwKK2RzYmVtNDcwIHRvU2NpICA5Ljk5OTlFLTk3ICAgICAgICAgLT4gOS45OTk5RS05NyBTdWJub3JtYWwKK2RzYmVtNDcxIHRvU2NpICAwLjk5OTk5RS05NyAgICAgICAgLT4gMS4wMDAwRS05NyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NzIgdG9TY2kgIDAuMDk5OTk5RS05NyAgICAgICAtPiAxLjAwMEUtOTggIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ3MyB0b1NjaSAgMC4wMDk5OTk5RS05NyAgICAgIC0+IDEuMDBFLTk5ICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2RzYmVtNDc0IHRvU2NpICAwLjAwMDk5OTk5RS05NyAgICAgLT4gMS4wRS0xMDAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZHNiZW00NzUgdG9TY2kgIDAuMDAwMDk5OTk5RS05NyAgICAtPiAxRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitkc2JlbTQ3NiB0b1NjaSAgMC4wMDAwMDk5OTk5RS05NyAgIC0+IDBFLTEwMSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiZW00NzcgdG9TY2kgIDAuMDAwMDAwOTk5OTlFLTk3ICAtPiAwRS0xMDEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmVtNDc4IHRvU2NpICAwLjAwMDAwMDA5OTk5OUUtOTcgLT4gMEUtMTAxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIEV4cG9uZW50cyB3aXRoIGluc2lnbmlmaWNhbnQgbGVhZGluZyB6ZXJvcworZHNiYXMxMDAxIHRvU2NpICAxZTk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMTAwMiB0b1NjaSAgMWUwOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHNiYXMxMDAzIHRvU2NpICAxZTAwOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHNiYXMxMDA0IHRvU2NpICAxZTAwMDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2RzYmFzMTAwNSB0b1NjaSAgMWUwMDAwMDAwMDAwMDA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitkc2JhczEwMDYgdG9TY2kgIDFlMDAwMDAwMDAwMDAxMDAwMDAwMDA3IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHNiYXMxMDA3IHRvU2NpICAxZS05OTk5OTk5OTkgLT4gMEUtMTAxICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzMTAwOCB0b1NjaSAgMWUtMDk5OTk5OTk5OSAtPiAwRS0xMDEgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczEwMDkgdG9TY2kgIDFlLTAwOTk5OTk5OTk5IC0+IDBFLTEwMSAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZHNiYXMxMDEwIHRvU2NpICAxZS0wMDA5OTk5OTk5OTkgLT4gMEUtMTAxICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2RzYmFzMTAxMSB0b1NjaSAgMWUtMDAwMDAwMDAwMDAwOTk5OTk5OTk5IC0+IDBFLTEwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitkc2JhczEwMTIgdG9TY2kgIDFlLTAwMDAwMDAwMDAwMTAwMDAwMDAwNyAtPiAwRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBjaGVjayBmb3IgZG91YmxlLXJvdW5kZWQgc3Vibm9ybWFscworZHNiYXMxMDQxIHRvU2NpICAgICAxLjExNTI0NDRFLTk2IC0+ICAxLjExNTI0RS05NiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHNiYXMxMDQyIHRvU2NpICAgICAxLjExNTI0NDVFLTk2IC0+ICAxLjExNTI0RS05NiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZHNiYXMxMDQzIHRvU2NpICAgICAxLjExNTI0NDZFLTk2IC0+ICAxLjExNTI0RS05NiBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBjbGFtcGVkIHplcm9zIFtzZWUgYWxzbyBjbGFtcC5kZWNUZXN0XQorZHNiYXMxMDc1IHRvU2NpICAgMGUrMTAwMDAgIC0+ICAwRSs5MCAgIENsYW1wZWQKK2RzYmFzMTA3NiB0b1NjaSAgIDBlLTEwMDAwICAtPiAgMEUtMTAxICBDbGFtcGVkCitkc2JhczEwNzcgdG9TY2kgIC0wZSsxMDAwMCAgLT4gLTBFKzkwICAgQ2xhbXBlZAorZHNiYXMxMDc4IHRvU2NpICAtMGUtMTAwMDAgIC0+IC0wRS0xMDEgIENsYW1wZWQKKworLS0gZXh0cmVtZSB2YWx1ZXMgZnJvbSBuZXh0LXdpZGVyCitkc2JhczExMDEgdG9TY2kgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZHNiYXMxMTAyIHRvU2NpIC0xRS0zODMgLT4gLTBFLTEwMSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitkc2JhczExMDMgdG9TY2kgLTFFLTM5OCAtPiAtMEUtMTAxIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RzYmFzMTEwNCB0b1NjaSAtMCAtPiAtMAorZHNiYXMxMTA1IHRvU2NpICswIC0+ICAwCitkc2JhczExMDYgdG9TY2kgKzFFLTM5OCAtPiAgMEUtMTAxIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2RzYmFzMTEwNyB0b1NjaSArMUUtMzgzIC0+ICAwRS0xMDEgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZHNiYXMxMTA4IHRvU2NpICs5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmFycm93aW5nIGNhc2UKK2RzYmFzMTExMCB0b1NjaSAyLjAwMDAwMDAwMDAwMDAwMEUtOTkgLT4gMi4wMEUtOTkgUm91bmRlZCBTdWJub3JtYWwKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHNFbmNvZGUuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZHNFbmNvZGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTg1NzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9kc0VuY29kZS5kZWNUZXN0CkBAIC0wLDAgKzEsMzcyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGRzRW5jb2RlLmRlY1Rlc3QgLS0gZGVjaW1hbCBmb3VyLWJ5dGUgZm9ybWF0IHRlc3RjYXNlcyAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDAsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFtQcmV2aW91c2x5IGNhbGxlZCBkZWNpbWFsMzIuZGVjVGVzdF0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgaXMgZm9yIHRoZSBmb3VyLWJ5dGUgY29uY3JldGUgcmVwcmVzZW50YXRpb24uCistLSBJdHMgY2hhcmFjdGVyaXN0aWNzIGFyZToKKy0tCistLSAgMSBiaXQgIHNpZ24KKy0tICA1IGJpdHMgY29tYmluYXRpb24gZmllbGQKKy0tICA2IGJpdHMgZXhwb25lbnQgY29udGludWF0aW9uCistLSAyMCBiaXRzIGNvZWZmaWNpZW50IGNvbnRpbnVhdGlvbgorLS0KKy0tIFRvdGFsIGV4cG9uZW50IGxlbmd0aCA4IGJpdHMKKy0tIFRvdGFsIGNvZWZmaWNpZW50IGxlbmd0aCAyNCBiaXRzICg3IGRpZ2l0cykKKy0tCistLSBFbGltaXQgPSAgMTkxIChtYXhpbXVtIGVuY29kZWQgZXhwb25lbnQpCistLSBFbWF4ICAgPSAgIDk2IChsYXJnZXN0IGV4cG9uZW50IHZhbHVlKQorLS0gRW1pbiAgID0gIC05NSAoc21hbGxlc3QgZXhwb25lbnQgdmFsdWUpCistLSBiaWFzICAgPSAgMTAxIChzdWJ0cmFjdGVkIGZyb20gZW5jb2RlZCBleHBvbmVudCkgPSAtRXRpbnkKKworLS0gVGhlIHRlc3RjYXNlcyBoZXJlIGhhdmUgb25seSBleGFjdGx5IHJlcHJlc2VudGFibGUgZGF0YSBvbiB0aGUKKy0tICdsZWZ0LWhhbmQtc2lkZSc7IHJvdW5kaW5nIGZyb20gc3RyaW5ncyBpcyB0ZXN0ZWQgaW4gJ2Jhc2UnCistLSB0ZXN0Y2FzZSBncm91cHMuCisKK2V4dGVuZGVkOiAgICAxCitjbGFtcDogICAgICAgMQorcHJlY2lzaW9uOiAgIDcKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTYKK21pbkV4cG9uZW50OiAtOTUKKworLS0gR2VuZXJhbCB0ZXN0Y2FzZXMKKy0tIChtb3N0bHkgZGVyaXZlZCBmcm9tIHRoZSBTdHJhd21hbiA0IGRvY3VtZW50IGFuZCBleGFtcGxlcykKK2RlY3MwMDEgYXBwbHkgICAjQTIzMDAzRDAgICAgICAgICAgLT4gLTcuNTAKK2RlY3MwMDIgYXBwbHkgICAtNy41MCAgICAgICAgICAgICAgLT4gI0EyMzAwM0QwCistLSBkZXJpdmF0aXZlIGNhbm9uaWNhbCBwbGFpbiBzdHJpbmdzCitkZWNzMDAzIGFwcGx5ICAgI0EyNjAwM0QwICAgICAgICAgLT4gLTcuNTBFKzMKK2RlY3MwMDQgYXBwbHkgICAtNy41MEUrMyAgICAgICAgICAtPiAjQTI2MDAzRDAKK2RlY3MwMDUgYXBwbHkgICAjQTI1MDAzRDAgICAgICAgICAtPiAtNzUwCitkZWNzMDA2IGFwcGx5ICAgLTc1MCAgICAgICAgICAgICAgLT4gI0EyNTAwM0QwCitkZWNzMDA3IGFwcGx5ICAgI0EyNDAwM0QwICAgICAgICAgLT4gLTc1LjAKK2RlY3MwMDggYXBwbHkgICAtNzUuMCAgICAgICAgICAgICAtPiAjQTI0MDAzRDAKK2RlY3MwMDkgYXBwbHkgICAjQTIyMDAzRDAgICAgICAgICAtPiAtMC43NTAKK2RlY3MwMTAgYXBwbHkgICAtMC43NTAgICAgICAgICAgICAtPiAjQTIyMDAzRDAKK2RlY3MwMTEgYXBwbHkgICAjQTIxMDAzRDAgICAgICAgICAtPiAtMC4wNzUwCitkZWNzMDEyIGFwcGx5ICAgLTAuMDc1MCAgICAgICAgICAgLT4gI0EyMTAwM0QwCitkZWNzMDEzIGFwcGx5ICAgI0ExZjAwM0QwICAgICAgICAgLT4gLTAuMDAwNzUwCitkZWNzMDE0IGFwcGx5ICAgLTAuMDAwNzUwICAgICAgICAgLT4gI0ExZjAwM0QwCitkZWNzMDE1IGFwcGx5ICAgI0ExZDAwM0QwICAgICAgICAgLT4gLTAuMDAwMDA3NTAKK2RlY3MwMTYgYXBwbHkgICAtMC4wMDAwMDc1MCAgICAgICAtPiAjQTFkMDAzRDAKK2RlY3MwMTcgYXBwbHkgICAjQTFjMDAzRDAgICAgICAgICAtPiAtNy41MEUtNworZGVjczAxOCBhcHBseSAgIC03LjUwRS03ICAgICAgICAgIC0+ICNBMWMwMDNEMAorCistLSBOb3JtYWxpdHkKK2RlY3MwMjAgYXBwbHkgICAxMjM0NTY3ICAgICAgICAgICAgLT4gIzI2NTRkMmU3CitkZWNzMDIxIGFwcGx5ICAtMTIzNDU2NyAgICAgICAgICAgIC0+ICNhNjU0ZDJlNworZGVjczAyMiBhcHBseSAgIDExMTExMTEgICAgICAgICAgICAtPiAjMjY1MjQ0OTEKKworLS0gTm1heCBhbmQgc2ltaWxhcgorZGVjczAzMSBhcHBseSAgIDkuOTk5OTk5RSs5NiAgICAgICAgICAgIC0+ICM3N2YzZmNmZgorZGVjczAzMiBhcHBseSAgICM3N2YzZmNmZiAgICAgICAgICAgICAgIC0+IDkuOTk5OTk5RSs5NgorZGVjczAzMyBhcHBseSAgIDEuMjM0NTY3RSs5NiAgICAgICAgICAgIC0+ICM0N2Y0ZDJlNworZGVjczAzNCBhcHBseSAgICM0N2Y0ZDJlNyAgICAgICAgICAgICAgIC0+IDEuMjM0NTY3RSs5NgorLS0gZm9sZC1kb3ducyAobW9yZSBiZWxvdykKK2RlY3MwMzUgYXBwbHkgICAxLjIzRSs5NiAgICAgICAgICAgICAgICAtPiAjNDdmNGMwMDAgQ2xhbXBlZAorZGVjczAzNiBhcHBseSAgICM0N2Y0YzAwMCAgICAgICAgICAgICAgIC0+IDEuMjMwMDAwRSs5NgorZGVjczAzNyBhcHBseSAgIDFFKzk2ICAgICAgICAgICAgICAgICAgIC0+ICM0N2YwMDAwMCBDbGFtcGVkCitkZWNzMDM4IGFwcGx5ICAgIzQ3ZjAwMDAwICAgICAgICAgICAgICAgLT4gMS4wMDAwMDBFKzk2CisKK2RlY3MwNTEgYXBwbHkgICAxMjM0NSAgICAgICAgICAgICAgICAgICAtPiAjMjI1MDQ5YzUKK2RlY3MwNTIgYXBwbHkgICAjMjI1MDQ5YzUgICAgICAgICAgICAgICAtPiAxMjM0NQorZGVjczA1MyBhcHBseSAgIDEyMzQgICAgICAgICAgICAgICAgICAgIC0+ICMyMjUwMDUzNAorZGVjczA1NCBhcHBseSAgICMyMjUwMDUzNCAgICAgICAgICAgICAgIC0+IDEyMzQKK2RlY3MwNTUgYXBwbHkgICAxMjMgICAgICAgICAgICAgICAgICAgICAtPiAjMjI1MDAwYTMKK2RlY3MwNTYgYXBwbHkgICAjMjI1MDAwYTMgICAgICAgICAgICAgICAtPiAxMjMKK2RlY3MwNTcgYXBwbHkgICAxMiAgICAgICAgICAgICAgICAgICAgICAtPiAjMjI1MDAwMTIKK2RlY3MwNTggYXBwbHkgICAjMjI1MDAwMTIgICAgICAgICAgICAgICAtPiAxMgorZGVjczA1OSBhcHBseSAgIDEgICAgICAgICAgICAgICAgICAgICAgIC0+ICMyMjUwMDAwMQorZGVjczA2MCBhcHBseSAgICMyMjUwMDAwMSAgICAgICAgICAgICAgIC0+IDEKK2RlY3MwNjEgYXBwbHkgICAxLjIzICAgICAgICAgICAgICAgICAgICAtPiAjMjIzMDAwYTMKK2RlY3MwNjIgYXBwbHkgICAjMjIzMDAwYTMgICAgICAgICAgICAgICAtPiAxLjIzCitkZWNzMDYzIGFwcGx5ICAgMTIzLjQ1ICAgICAgICAgICAgICAgICAgLT4gIzIyMzA0OWM1CitkZWNzMDY0IGFwcGx5ICAgIzIyMzA0OWM1ICAgICAgICAgICAgICAgLT4gMTIzLjQ1CisKKy0tIE5taW4gYW5kIGJlbG93CitkZWNzMDcxIGFwcGx5ICAgMUUtOTUgICAgICAgICAgICAgICAgICAgLT4gIzAwNjAwMDAxCitkZWNzMDcyIGFwcGx5ICAgIzAwNjAwMDAxICAgICAgICAgICAgICAgLT4gMUUtOTUKK2RlY3MwNzMgYXBwbHkgICAxLjAwMDAwMEUtOTUgICAgICAgICAgICAtPiAjMDQwMDAwMDAKK2RlY3MwNzQgYXBwbHkgICAjMDQwMDAwMDAgICAgICAgICAgICAgICAtPiAxLjAwMDAwMEUtOTUKK2RlY3MwNzUgYXBwbHkgICAxLjAwMDAwMUUtOTUgICAgICAgICAgICAtPiAjMDQwMDAwMDEKK2RlY3MwNzYgYXBwbHkgICAjMDQwMDAwMDEgICAgICAgICAgICAgICAtPiAxLjAwMDAwMUUtOTUKKworZGVjczA3NyBhcHBseSAgIDAuMTAwMDAwRS05NSAgICAgICAgICAgIC0+ICMwMDAyMDAwMCAgICAgU3Vibm9ybWFsCitkZWNzMDd4IGFwcGx5ICAgMS4wMDAwMEUtOTYgICAgICAgICAgICAgLT4gMS4wMDAwMEUtOTYgICBTdWJub3JtYWwKK2RlY3MwNzggYXBwbHkgICAjMDAwMjAwMDAgICAgICAgICAgICAgICAtPiAxLjAwMDAwRS05NiAgIFN1Ym5vcm1hbAorZGVjczA3OSBhcHBseSAgIDAuMDAwMDEwRS05NSAgICAgICAgICAgIC0+ICMwMDAwMDAxMCAgICAgU3Vibm9ybWFsCitkZWNzMDgwIGFwcGx5ICAgIzAwMDAwMDEwICAgICAgICAgICAgICAgLT4gMS4wRS0xMDAgICAgICBTdWJub3JtYWwKK2RlY3MwODEgYXBwbHkgICAwLjAwMDAwMUUtOTUgICAgICAgICAgICAtPiAjMDAwMDAwMDEgICAgIFN1Ym5vcm1hbAorZGVjczA4MiBhcHBseSAgICMwMDAwMDAwMSAgICAgICAgICAgICAgIC0+IDFFLTEwMSAgICAgICAgU3Vibm9ybWFsCitkZWNzMDgzIGFwcGx5ICAgMWUtMTAxICAgICAgICAgICAgICAgICAgLT4gIzAwMDAwMDAxICAgICBTdWJub3JtYWwKK2RlY3MwODQgYXBwbHkgICAjMDAwMDAwMDEgICAgICAgICAgICAgICAtPiAxRS0xMDEgICAgICAgIFN1Ym5vcm1hbAorZGVjczA4eCBhcHBseSAgIDFlLTEwMSAgICAgICAgICAgICAgICAgIC0+IDFFLTEwMSAgICAgICAgU3Vibm9ybWFsCisKKy0tIHVuZGVyZmxvd3MgY2Fubm90IGJlIHRlc3RlZDsganVzdCBjaGVjayBlZGdlIGNhc2UKK2RlY3MwOTAgYXBwbHkgICAxZS0xMDEgICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDEgIFN1Ym5vcm1hbAorCistLSBzYW1lIGFnYWluLCBuZWdhdGl2ZXMgLS0KKworLS0gTm1heCBhbmQgc2ltaWxhcgorZGVjczEyMiBhcHBseSAgLTkuOTk5OTk5RSs5NiAgICAgICAgICAgIC0+ICNmN2YzZmNmZgorZGVjczEyMyBhcHBseSAgICNmN2YzZmNmZiAgICAgICAgICAgICAgIC0+IC05Ljk5OTk5OUUrOTYKK2RlY3MxMjQgYXBwbHkgIC0xLjIzNDU2N0UrOTYgICAgICAgICAgICAtPiAjYzdmNGQyZTcKK2RlY3MxMjUgYXBwbHkgICAjYzdmNGQyZTcgICAgICAgICAgICAgICAtPiAtMS4yMzQ1NjdFKzk2CistLSBmb2xkLWRvd25zIChtb3JlIGJlbG93KQorZGVjczEzMCBhcHBseSAgLTEuMjNFKzk2ICAgICAgICAgICAgICAgIC0+ICNjN2Y0YzAwMCBDbGFtcGVkCitkZWNzMTMxIGFwcGx5ICAgI2M3ZjRjMDAwICAgICAgICAgICAgICAgLT4gLTEuMjMwMDAwRSs5NgorZGVjczEzMiBhcHBseSAgLTFFKzk2ICAgICAgICAgICAgICAgICAgIC0+ICNjN2YwMDAwMCBDbGFtcGVkCitkZWNzMTMzIGFwcGx5ICAgI2M3ZjAwMDAwICAgICAgICAgICAgICAgLT4gLTEuMDAwMDAwRSs5NgorCitkZWNzMTUxIGFwcGx5ICAtMTIzNDUgICAgICAgICAgICAgICAgICAgLT4gI2EyNTA0OWM1CitkZWNzMTUyIGFwcGx5ICAgI2EyNTA0OWM1ICAgICAgICAgICAgICAgLT4gLTEyMzQ1CitkZWNzMTUzIGFwcGx5ICAtMTIzNCAgICAgICAgICAgICAgICAgICAgLT4gI2EyNTAwNTM0CitkZWNzMTU0IGFwcGx5ICAgI2EyNTAwNTM0ICAgICAgICAgICAgICAgLT4gLTEyMzQKK2RlY3MxNTUgYXBwbHkgIC0xMjMgICAgICAgICAgICAgICAgICAgICAtPiAjYTI1MDAwYTMKK2RlY3MxNTYgYXBwbHkgICAjYTI1MDAwYTMgICAgICAgICAgICAgICAtPiAtMTIzCitkZWNzMTU3IGFwcGx5ICAtMTIgICAgICAgICAgICAgICAgICAgICAgLT4gI2EyNTAwMDEyCitkZWNzMTU4IGFwcGx5ICAgI2EyNTAwMDEyICAgICAgICAgICAgICAgLT4gLTEyCitkZWNzMTU5IGFwcGx5ICAtMSAgICAgICAgICAgICAgICAgICAgICAgLT4gI2EyNTAwMDAxCitkZWNzMTYwIGFwcGx5ICAgI2EyNTAwMDAxICAgICAgICAgICAgICAgLT4gLTEKK2RlY3MxNjEgYXBwbHkgIC0xLjIzICAgICAgICAgICAgICAgICAgICAtPiAjYTIzMDAwYTMKK2RlY3MxNjIgYXBwbHkgICAjYTIzMDAwYTMgICAgICAgICAgICAgICAtPiAtMS4yMworZGVjczE2MyBhcHBseSAgLTEyMy40NSAgICAgICAgICAgICAgICAgIC0+ICNhMjMwNDljNQorZGVjczE2NCBhcHBseSAgICNhMjMwNDljNSAgICAgICAgICAgICAgIC0+IC0xMjMuNDUKKworLS0gTm1pbiBhbmQgYmVsb3cKK2RlY3MxNzEgYXBwbHkgIC0xRS05NSAgICAgICAgICAgICAgICAgICAtPiAjODA2MDAwMDEKK2RlY3MxNzIgYXBwbHkgICAjODA2MDAwMDEgICAgICAgICAgICAgICAtPiAtMUUtOTUKK2RlY3MxNzMgYXBwbHkgIC0xLjAwMDAwMEUtOTUgICAgICAgICAgICAtPiAjODQwMDAwMDAKK2RlY3MxNzQgYXBwbHkgICAjODQwMDAwMDAgICAgICAgICAgICAgICAtPiAtMS4wMDAwMDBFLTk1CitkZWNzMTc1IGFwcGx5ICAtMS4wMDAwMDFFLTk1ICAgICAgICAgICAgLT4gIzg0MDAwMDAxCitkZWNzMTc2IGFwcGx5ICAgIzg0MDAwMDAxICAgICAgICAgICAgICAgLT4gLTEuMDAwMDAxRS05NQorCitkZWNzMTc3IGFwcGx5ICAtMC4xMDAwMDBFLTk1ICAgICAgICAgICAgLT4gIzgwMDIwMDAwICAgICBTdWJub3JtYWwKK2RlY3MxNzggYXBwbHkgICAjODAwMjAwMDAgICAgICAgICAgICAgICAtPiAtMS4wMDAwMEUtOTYgIFN1Ym5vcm1hbAorZGVjczE3OSBhcHBseSAgLTAuMDAwMDEwRS05NSAgICAgICAgICAgIC0+ICM4MDAwMDAxMCAgICAgU3Vibm9ybWFsCitkZWNzMTgwIGFwcGx5ICAgIzgwMDAwMDEwICAgICAgICAgICAgICAgLT4gLTEuMEUtMTAwICAgICBTdWJub3JtYWwKK2RlY3MxODEgYXBwbHkgIC0wLjAwMDAwMUUtOTUgICAgICAgICAgICAtPiAjODAwMDAwMDEgICAgIFN1Ym5vcm1hbAorZGVjczE4MiBhcHBseSAgICM4MDAwMDAwMSAgICAgICAgICAgICAgIC0+IC0xRS0xMDEgICAgICAgU3Vibm9ybWFsCitkZWNzMTgzIGFwcGx5ICAtMWUtMTAxICAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAxICAgICBTdWJub3JtYWwKK2RlY3MxODQgYXBwbHkgICAjODAwMDAwMDEgICAgICAgICAgICAgICAtPiAtMUUtMTAxICAgICAgIFN1Ym5vcm1hbAorCistLSB1bmRlcmZsb3cgZWRnZSBjYXNlCitkZWNzMTkwIGFwcGx5ICAtMWUtMTAxICAgICAgICAgICAgICAgICAgLT4gIzgwMDAwMDAxICBTdWJub3JtYWwKKworLS0gemVyb3MKK2RlY3M0MDAgYXBwbHkgICAwRS00MDAgICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAgIENsYW1wZWQKK2RlY3M0MDEgYXBwbHkgICAwRS0xMDEgICAgICAgICAgICAgICAgICAtPiAjMDAwMDAwMDAKK2RlY3M0MDIgYXBwbHkgICAjMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAwRS0xMDEKK2RlY3M0MDMgYXBwbHkgICAwLjAwMDAwMEUtOTUgICAgICAgICAgICAtPiAjMDAwMDAwMDAKK2RlY3M0MDQgYXBwbHkgICAjMDAwMDAwMDAgICAgICAgICAgICAgICAtPiAwRS0xMDEKK2RlY3M0MDUgYXBwbHkgICAwRS0yICAgICAgICAgICAgICAgICAgICAtPiAjMjIzMDAwMDAKK2RlY3M0MDYgYXBwbHkgICAjMjIzMDAwMDAgICAgICAgICAgICAgICAtPiAwLjAwCitkZWNzNDA3IGFwcGx5ICAgMCAgICAgICAgICAgICAgICAgICAgICAgLT4gIzIyNTAwMDAwCitkZWNzNDA4IGFwcGx5ICAgIzIyNTAwMDAwICAgICAgICAgICAgICAgLT4gMAorZGVjczQwOSBhcHBseSAgIDBFKzMgICAgICAgICAgICAgICAgICAgIC0+ICMyMjgwMDAwMAorZGVjczQxMCBhcHBseSAgICMyMjgwMDAwMCAgICAgICAgICAgICAgIC0+IDBFKzMKK2RlY3M0MTEgYXBwbHkgICAwRSs5MCAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDAwMDAKK2RlY3M0MTIgYXBwbHkgICAjNDNmMDAwMDAgICAgICAgICAgICAgICAtPiAwRSs5MAorLS0gY2xhbXBlZCB6ZXJvcy4uLgorZGVjczQxMyBhcHBseSAgIDBFKzkxICAgICAgICAgICAgICAgICAgIC0+ICM0M2YwMDAwMCAgQ2xhbXBlZAorZGVjczQxNCBhcHBseSAgICM0M2YwMDAwMCAgICAgICAgICAgICAgIC0+IDBFKzkwCitkZWNzNDE1IGFwcGx5ICAgMEUrOTYgICAgICAgICAgICAgICAgICAgLT4gIzQzZjAwMDAwICBDbGFtcGVkCitkZWNzNDE2IGFwcGx5ICAgIzQzZjAwMDAwICAgICAgICAgICAgICAgLT4gMEUrOTAKK2RlY3M0MTcgYXBwbHkgICAwRSs0MDAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDAwMDAgIENsYW1wZWQKK2RlY3M0MTggYXBwbHkgICAjNDNmMDAwMDAgICAgICAgICAgICAgICAtPiAwRSs5MAorCistLSBuZWdhdGl2ZSB6ZXJvcworZGVjczQyMCBhcHBseSAgIC0wRS00MDAgICAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMCAgQ2xhbXBlZAorZGVjczQyMSBhcHBseSAgIC0wRS0xMDEgICAgICAgICAgICAgICAgIC0+ICM4MDAwMDAwMAorZGVjczQyMiBhcHBseSAgICM4MDAwMDAwMCAgICAgICAgICAgICAgIC0+IC0wRS0xMDEKK2RlY3M0MjMgYXBwbHkgICAtMC4wMDAwMDBFLTk1ICAgICAgICAgICAtPiAjODAwMDAwMDAKK2RlY3M0MjQgYXBwbHkgICAjODAwMDAwMDAgICAgICAgICAgICAgICAtPiAtMEUtMTAxCitkZWNzNDI1IGFwcGx5ICAgLTBFLTIgICAgICAgICAgICAgICAgICAgLT4gI2EyMzAwMDAwCitkZWNzNDI2IGFwcGx5ICAgI2EyMzAwMDAwICAgICAgICAgICAgICAgLT4gLTAuMDAKK2RlY3M0MjcgYXBwbHkgICAtMCAgICAgICAgICAgICAgICAgICAgICAtPiAjYTI1MDAwMDAKK2RlY3M0MjggYXBwbHkgICAjYTI1MDAwMDAgICAgICAgICAgICAgICAtPiAtMAorZGVjczQyOSBhcHBseSAgIC0wRSszICAgICAgICAgICAgICAgICAgIC0+ICNhMjgwMDAwMAorZGVjczQzMCBhcHBseSAgICNhMjgwMDAwMCAgICAgICAgICAgICAgIC0+IC0wRSszCitkZWNzNDMxIGFwcGx5ICAgLTBFKzkwICAgICAgICAgICAgICAgICAgLT4gI2MzZjAwMDAwCitkZWNzNDMyIGFwcGx5ICAgI2MzZjAwMDAwICAgICAgICAgICAgICAgLT4gLTBFKzkwCistLSBjbGFtcGVkIHplcm9zLi4uCitkZWNzNDMzIGFwcGx5ICAgLTBFKzkxICAgICAgICAgICAgICAgICAgLT4gI2MzZjAwMDAwICBDbGFtcGVkCitkZWNzNDM0IGFwcGx5ICAgI2MzZjAwMDAwICAgICAgICAgICAgICAgLT4gLTBFKzkwCitkZWNzNDM1IGFwcGx5ICAgLTBFKzk2ICAgICAgICAgICAgICAgICAgLT4gI2MzZjAwMDAwICBDbGFtcGVkCitkZWNzNDM2IGFwcGx5ICAgI2MzZjAwMDAwICAgICAgICAgICAgICAgLT4gLTBFKzkwCitkZWNzNDM3IGFwcGx5ICAgLTBFKzQwMCAgICAgICAgICAgICAgICAgLT4gI2MzZjAwMDAwICBDbGFtcGVkCitkZWNzNDM4IGFwcGx5ICAgI2MzZjAwMDAwICAgICAgICAgICAgICAgLT4gLTBFKzkwCisKKy0tIFNwZWNpYWxzCitkZWNzNTAwIGFwcGx5ICAgSW5maW5pdHkgIC0+ICM3ODAwMDAwMAorZGVjczUwMSBhcHBseSAgICM3ODc4Nzg3OCAtPiAjNzgwMDAwMDAKK2RlY3M1MDIgYXBwbHkgICAjNzgwMDAwMDAgLT4gSW5maW5pdHkKK2RlY3M1MDMgYXBwbHkgICAjNzk3OTc5NzkgLT4gIzc4MDAwMDAwCitkZWNzNTA0IGFwcGx5ICAgIzc5MDAwMDAwIC0+IEluZmluaXR5CitkZWNzNTA1IGFwcGx5ICAgIzdhN2E3YTdhIC0+ICM3ODAwMDAwMAorZGVjczUwNiBhcHBseSAgICM3YTAwMDAwMCAtPiBJbmZpbml0eQorZGVjczUwNyBhcHBseSAgICM3YjdiN2I3YiAtPiAjNzgwMDAwMDAKK2RlY3M1MDggYXBwbHkgICAjN2IwMDAwMDAgLT4gSW5maW5pdHkKK2RlY3M1MDkgYXBwbHkgICAjN2M3YzdjN2MgLT4gIzdjMGM3YzdjCisKK2RlY3M1MTAgYXBwbHkgICBOYU4gICAgICAgLT4gIzdjMDAwMDAwCitkZWNzNTExIGFwcGx5ICAgIzdjMDAwMDAwIC0+IE5hTgorZGVjczUxMiBhcHBseSAgICM3ZDdkN2Q3ZCAtPiAjN2MwZDdkN2QKK2RlY3M1MTMgYXBwbHkgICAjN2QwMDAwMDAgLT4gTmFOCitkZWNzNTE0IGFwcGx5ICAgIzdlN2U3ZTdlIC0+ICM3ZTBlN2M3ZQorZGVjczUxNSBhcHBseSAgICM3ZTAwMDAwMCAtPiBzTmFOCitkZWNzNTE2IGFwcGx5ICAgIzdmN2Y3ZjdmIC0+ICM3ZTBmN2M3ZgorZGVjczUxNyBhcHBseSAgICM3ZjAwMDAwMCAtPiBzTmFOCitkZWNzNTE4IGFwcGx5ICAgIzdmZmZmZmZmIC0+IHNOYU45OTk5OTkKK2RlY3M1MTkgYXBwbHkgICAjN2ZmZmZmZmYgLT4gIzdlMDNmY2ZmCisKK2RlY3M1MjAgYXBwbHkgICAtSW5maW5pdHkgLT4gI2Y4MDAwMDAwCitkZWNzNTIxIGFwcGx5ICAgI2Y4Nzg3ODc4IC0+ICNmODAwMDAwMAorZGVjczUyMiBhcHBseSAgICNmODAwMDAwMCAtPiAtSW5maW5pdHkKK2RlY3M1MjMgYXBwbHkgICAjZjk3OTc5NzkgLT4gI2Y4MDAwMDAwCitkZWNzNTI0IGFwcGx5ICAgI2Y5MDAwMDAwIC0+IC1JbmZpbml0eQorZGVjczUyNSBhcHBseSAgICNmYTdhN2E3YSAtPiAjZjgwMDAwMDAKK2RlY3M1MjYgYXBwbHkgICAjZmEwMDAwMDAgLT4gLUluZmluaXR5CitkZWNzNTI3IGFwcGx5ICAgI2ZiN2I3YjdiIC0+ICNmODAwMDAwMAorZGVjczUyOCBhcHBseSAgICNmYjAwMDAwMCAtPiAtSW5maW5pdHkKKworZGVjczUyOSBhcHBseSAgIC1OYU4gICAgICAtPiAjZmMwMDAwMDAKK2RlY3M1MzAgYXBwbHkgICAjZmM3YzdjN2MgLT4gI2ZjMGM3YzdjCitkZWNzNTMxIGFwcGx5ICAgI2ZjMDAwMDAwIC0+IC1OYU4KK2RlY3M1MzIgYXBwbHkgICAjZmQ3ZDdkN2QgLT4gI2ZjMGQ3ZDdkCitkZWNzNTMzIGFwcGx5ICAgI2ZkMDAwMDAwIC0+IC1OYU4KK2RlY3M1MzQgYXBwbHkgICAjZmU3ZTdlN2UgLT4gI2ZlMGU3YzdlCitkZWNzNTM1IGFwcGx5ICAgI2ZlMDAwMDAwIC0+IC1zTmFOCitkZWNzNTM2IGFwcGx5ICAgI2ZmN2Y3ZjdmIC0+ICNmZTBmN2M3ZgorZGVjczUzNyBhcHBseSAgICNmZjAwMDAwMCAtPiAtc05hTgorZGVjczUzOCBhcHBseSAgICNmZmZmZmZmZiAtPiAtc05hTjk5OTk5OQorZGVjczUzOSBhcHBseSAgICNmZmZmZmZmZiAtPiAjZmUwM2ZjZmYKKworLS0gZGlhZ25vc3RpYyBOYU5zCitkZWNzNTQwIGFwcGx5ICAgTmFOICAgICAgIC0+ICM3YzAwMDAwMAorZGVjczU0MSBhcHBseSAgIE5hTjAgICAgICAtPiAjN2MwMDAwMDAKK2RlY3M1NDIgYXBwbHkgICBOYU4xICAgICAgLT4gIzdjMDAwMDAxCitkZWNzNTQzIGFwcGx5ICAgTmFOMTIgICAgIC0+ICM3YzAwMDAxMgorZGVjczU0NCBhcHBseSAgIE5hTjc5ICAgICAtPiAjN2MwMDAwNzkKK2RlY3M1NDUgYXBwbHkgICBOYU4xMjM0NSAgIC0+ICM3YzAwNDljNQorZGVjczU0NiBhcHBseSAgIE5hTjEyMzQ1NiAgLT4gIzdjMDI4ZTU2CitkZWNzNTQ3IGFwcGx5ICAgTmFONzk5Nzk5ICAtPiAjN2MwZjdmZGYKK2RlY3M1NDggYXBwbHkgICBOYU45OTk5OTkgIC0+ICM3YzAzZmNmZgorCisKKy0tIGZvbGQtZG93biBmdWxsIHNlcXVlbmNlCitkZWNzNjAxIGFwcGx5ICAgMUUrOTYgICAgICAgICAgICAgICAgICAgLT4gIzQ3ZjAwMDAwIENsYW1wZWQKK2RlY3M2MDIgYXBwbHkgICAjNDdmMDAwMDAgICAgICAgICAgICAgICAtPiAxLjAwMDAwMEUrOTYKK2RlY3M2MDMgYXBwbHkgICAxRSs5NSAgICAgICAgICAgICAgICAgICAtPiAjNDNmMjAwMDAgQ2xhbXBlZAorZGVjczYwNCBhcHBseSAgICM0M2YyMDAwMCAgICAgICAgICAgICAgIC0+IDEuMDAwMDBFKzk1CitkZWNzNjA1IGFwcGx5ICAgMUUrOTQgICAgICAgICAgICAgICAgICAgLT4gIzQzZjA0MDAwIENsYW1wZWQKK2RlY3M2MDYgYXBwbHkgICAjNDNmMDQwMDAgICAgICAgICAgICAgICAtPiAxLjAwMDBFKzk0CitkZWNzNjA3IGFwcGx5ICAgMUUrOTMgICAgICAgICAgICAgICAgICAgLT4gIzQzZjAwNDAwIENsYW1wZWQKK2RlY3M2MDggYXBwbHkgICAjNDNmMDA0MDAgICAgICAgICAgICAgICAtPiAxLjAwMEUrOTMKK2RlY3M2MDkgYXBwbHkgICAxRSs5MiAgICAgICAgICAgICAgICAgICAtPiAjNDNmMDAwODAgQ2xhbXBlZAorZGVjczYxMCBhcHBseSAgICM0M2YwMDA4MCAgICAgICAgICAgICAgIC0+IDEuMDBFKzkyCitkZWNzNjExIGFwcGx5ICAgMUUrOTEgICAgICAgICAgICAgICAgICAgLT4gIzQzZjAwMDEwIENsYW1wZWQKK2RlY3M2MTIgYXBwbHkgICAjNDNmMDAwMTAgICAgICAgICAgICAgICAtPiAxLjBFKzkxCitkZWNzNjEzIGFwcGx5ICAgMUUrOTAgICAgICAgICAgICAgICAgICAgLT4gIzQzZjAwMDAxCitkZWNzNjE0IGFwcGx5ICAgIzQzZjAwMDAxICAgICAgICAgICAgICAgLT4gMUUrOTAKKworCistLSBTZWxlY3RlZCBEUEQgY29kZXMKK2RlY3M3MDAgYXBwbHkgICAjMjI1MDAwMDAgICAgICAgLT4gMAorZGVjczcwMSBhcHBseSAgICMyMjUwMDAwOSAgICAgICAtPiA5CitkZWNzNzAyIGFwcGx5ICAgIzIyNTAwMDEwICAgICAgIC0+IDEwCitkZWNzNzAzIGFwcGx5ICAgIzIyNTAwMDE5ICAgICAgIC0+IDE5CitkZWNzNzA0IGFwcGx5ICAgIzIyNTAwMDIwICAgICAgIC0+IDIwCitkZWNzNzA1IGFwcGx5ICAgIzIyNTAwMDI5ICAgICAgIC0+IDI5CitkZWNzNzA2IGFwcGx5ICAgIzIyNTAwMDMwICAgICAgIC0+IDMwCitkZWNzNzA3IGFwcGx5ICAgIzIyNTAwMDM5ICAgICAgIC0+IDM5CitkZWNzNzA4IGFwcGx5ICAgIzIyNTAwMDQwICAgICAgIC0+IDQwCitkZWNzNzA5IGFwcGx5ICAgIzIyNTAwMDQ5ICAgICAgIC0+IDQ5CitkZWNzNzEwIGFwcGx5ICAgIzIyNTAwMDUwICAgICAgIC0+IDUwCitkZWNzNzExIGFwcGx5ICAgIzIyNTAwMDU5ICAgICAgIC0+IDU5CitkZWNzNzEyIGFwcGx5ICAgIzIyNTAwMDYwICAgICAgIC0+IDYwCitkZWNzNzEzIGFwcGx5ICAgIzIyNTAwMDY5ICAgICAgIC0+IDY5CitkZWNzNzE0IGFwcGx5ICAgIzIyNTAwMDcwICAgICAgIC0+IDcwCitkZWNzNzE1IGFwcGx5ICAgIzIyNTAwMDcxICAgICAgIC0+IDcxCitkZWNzNzE2IGFwcGx5ICAgIzIyNTAwMDcyICAgICAgIC0+IDcyCitkZWNzNzE3IGFwcGx5ICAgIzIyNTAwMDczICAgICAgIC0+IDczCitkZWNzNzE4IGFwcGx5ICAgIzIyNTAwMDc0ICAgICAgIC0+IDc0CitkZWNzNzE5IGFwcGx5ICAgIzIyNTAwMDc1ICAgICAgIC0+IDc1CitkZWNzNzIwIGFwcGx5ICAgIzIyNTAwMDc2ICAgICAgIC0+IDc2CitkZWNzNzIxIGFwcGx5ICAgIzIyNTAwMDc3ICAgICAgIC0+IDc3CitkZWNzNzIyIGFwcGx5ICAgIzIyNTAwMDc4ICAgICAgIC0+IDc4CitkZWNzNzIzIGFwcGx5ICAgIzIyNTAwMDc5ICAgICAgIC0+IDc5CisKK2RlY3M3MzAgYXBwbHkgICAjMjI1MDAyOWUgICAgICAgLT4gOTk0CitkZWNzNzMxIGFwcGx5ICAgIzIyNTAwMjlmICAgICAgIC0+IDk5NQorZGVjczczMiBhcHBseSAgICMyMjUwMDJhMCAgICAgICAtPiA1MjAKK2RlY3M3MzMgYXBwbHkgICAjMjI1MDAyYTEgICAgICAgLT4gNTIxCisKKy0tIERQRDogb25lIG9mIGVhY2ggb2YgdGhlIGh1ZmZtYW4gZ3JvdXBzCitkZWNzNzQwIGFwcGx5ICAgIzIyNTAwM2Y3ICAgICAgIC0+IDc3NworZGVjczc0MSBhcHBseSAgICMyMjUwMDNmOCAgICAgICAtPiA3NzgKK2RlY3M3NDIgYXBwbHkgICAjMjI1MDAzZWIgICAgICAgLT4gNzg3CitkZWNzNzQzIGFwcGx5ICAgIzIyNTAwMzdkICAgICAgIC0+IDg3NworZGVjczc0NCBhcHBseSAgICMyMjUwMDM5ZiAgICAgICAtPiA5OTcKK2RlY3M3NDUgYXBwbHkgICAjMjI1MDAzYmYgICAgICAgLT4gOTc5CitkZWNzNzQ2IGFwcGx5ICAgIzIyNTAwM2RmICAgICAgIC0+IDc5OQorZGVjczc0NyBhcHBseSAgICMyMjUwMDA2ZSAgICAgICAtPiA4ODgKKworCistLSBEUEQgYWxsLWhpZ2hzIGNhc2VzIChpbmNsdWRlcyB0aGUgMjQgcmVkdW5kYW50IGNvZGVzKQorZGVjczc1MCBhcHBseSAgICMyMjUwMDA2ZSAgICAgICAtPiA4ODgKK2RlY3M3NTEgYXBwbHkgICAjMjI1MDAxNmUgICAgICAgLT4gODg4CitkZWNzNzUyIGFwcGx5ICAgIzIyNTAwMjZlICAgICAgIC0+IDg4OAorZGVjczc1MyBhcHBseSAgICMyMjUwMDM2ZSAgICAgICAtPiA4ODgKK2RlY3M3NTQgYXBwbHkgICAjMjI1MDAwNmYgICAgICAgLT4gODg5CitkZWNzNzU1IGFwcGx5ICAgIzIyNTAwMTZmICAgICAgIC0+IDg4OQorZGVjczc1NiBhcHBseSAgICMyMjUwMDI2ZiAgICAgICAtPiA4ODkKK2RlY3M3NTcgYXBwbHkgICAjMjI1MDAzNmYgICAgICAgLT4gODg5CisKK2RlY3M3NjAgYXBwbHkgICAjMjI1MDAwN2UgICAgICAgLT4gODk4CitkZWNzNzYxIGFwcGx5ICAgIzIyNTAwMTdlICAgICAgIC0+IDg5OAorZGVjczc2MiBhcHBseSAgICMyMjUwMDI3ZSAgICAgICAtPiA4OTgKK2RlY3M3NjMgYXBwbHkgICAjMjI1MDAzN2UgICAgICAgLT4gODk4CitkZWNzNzY0IGFwcGx5ICAgIzIyNTAwMDdmICAgICAgIC0+IDg5OQorZGVjczc2NSBhcHBseSAgICMyMjUwMDE3ZiAgICAgICAtPiA4OTkKK2RlY3M3NjYgYXBwbHkgICAjMjI1MDAyN2YgICAgICAgLT4gODk5CitkZWNzNzY3IGFwcGx5ICAgIzIyNTAwMzdmICAgICAgIC0+IDg5OQorCitkZWNzNzcwIGFwcGx5ICAgIzIyNTAwMGVlICAgICAgIC0+IDk4OAorZGVjczc3MSBhcHBseSAgICMyMjUwMDFlZSAgICAgICAtPiA5ODgKK2RlY3M3NzIgYXBwbHkgICAjMjI1MDAyZWUgICAgICAgLT4gOTg4CitkZWNzNzczIGFwcGx5ICAgIzIyNTAwM2VlICAgICAgIC0+IDk4OAorZGVjczc3NCBhcHBseSAgICMyMjUwMDBlZiAgICAgICAtPiA5ODkKK2RlY3M3NzUgYXBwbHkgICAjMjI1MDAxZWYgICAgICAgLT4gOTg5CitkZWNzNzc2IGFwcGx5ICAgIzIyNTAwMmVmICAgICAgIC0+IDk4OQorZGVjczc3NyBhcHBseSAgICMyMjUwMDNlZiAgICAgICAtPiA5ODkKKworZGVjczc4MCBhcHBseSAgICMyMjUwMDBmZSAgICAgICAtPiA5OTgKK2RlY3M3ODEgYXBwbHkgICAjMjI1MDAxZmUgICAgICAgLT4gOTk4CitkZWNzNzgyIGFwcGx5ICAgIzIyNTAwMmZlICAgICAgIC0+IDk5OAorZGVjczc4MyBhcHBseSAgICMyMjUwMDNmZSAgICAgICAtPiA5OTgKK2RlY3M3ODQgYXBwbHkgICAjMjI1MDAwZmYgICAgICAgLT4gOTk5CitkZWNzNzg1IGFwcGx5ICAgIzIyNTAwMWZmICAgICAgIC0+IDk5OQorZGVjczc4NiBhcHBseSAgICMyMjUwMDJmZiAgICAgICAtPiA5OTkKK2RlY3M3ODcgYXBwbHkgICAjMjI1MDAzZmYgICAgICAgLT4gOTk5CisKKy0tIG5hcnJvd2luZyBjYXNlCitkZWNzNzkwIGFwcGx5IDIuMDBFLTk5IC0+ICMwMDAwMDEwMCBTdWJub3JtYWwKK2RlY3M3OTEgYXBwbHkgIzAwMDAwMTAwIC0+IDIuMDBFLTk5IFN1Ym5vcm1hbApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9leHAuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZXhwLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiOTkwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZXhwLmRlY1Rlc3QKQEAgLTAsMCArMSw2NzQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZXhwLmRlY1Rlc3QgLS0gZGVjaW1hbCBuYXR1cmFsIGV4cG9uZW50aWF0aW9uICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUZXN0cyBvZiB0aGUgZXhwb25lbnRpYWwgZnVudGlvbi4gIEN1cnJlbnRseSBhbGwgdGVzdGNhc2VzIGhlcmUKKy0tIHNob3cgcmVzdWx0cyB3aGljaCBhcmUgY29ycmVjdGx5IHJvdW5kZWQgKHdpdGhpbiA8PSAwLjUgdWxwKS4KKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBiYXNpY3MgKGV4YW1wbGVzIGluIHNwZWNpZmljaWF0aW9uLCBldGMuKQorZXhweDAwMSBleHAgIC1JbmZpbml0eSAgICAgLT4gMAorZXhweDAwMiBleHAgIC0xMCAgICAgICAgICAgLT4gMC4wMDAwNDUzOTk5Mjk4IEluZXhhY3QgUm91bmRlZAorZXhweDAwMyBleHAgIC0xICAgICAgICAgICAgLT4gMC4zNjc4Nzk0NDEgSW5leGFjdCBSb3VuZGVkCitleHB4MDA0IGV4cCAgIDAgICAgICAgICAgICAtPiAxCitleHB4MDA1IGV4cCAgLTAgICAgICAgICAgICAtPiAxCitleHB4MDA2IGV4cCAgIDEgICAgICAgICAgICAtPiAyLjcxODI4MTgzICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwMDcgZXhwICAgMC42OTMxNDcxODEgIC0+IDIuMDAwMDAwMDAgIEluZXhhY3QgUm91bmRlZAorZXhweDAwOCBleHAgICAxMCAgICAgICAgICAgLT4gMjIwMjYuNDY1OCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDA5IGV4cCAgK0luZmluaXR5ICAgICAtPiBJbmZpbml0eQorCistLSB0aW55IGVkZ2UgY2FzZXMKK3ByZWNpc2lvbjogICA3CitleHB4MDExIGV4cCAgMC4xICAgICAgICAgIC0+ICAxLjEwNTE3MSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDEyIGV4cCAgMC4wMSAgICAgICAgIC0+ICAxLjAxMDA1MCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDEzIGV4cCAgMC4wMDEgICAgICAgIC0+ICAxLjAwMTAwMSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDE0IGV4cCAgMC4wMDAxICAgICAgIC0+ICAxLjAwMDEwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDE1IGV4cCAgMC4wMDAwMSAgICAgIC0+ICAxLjAwMDAxMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDE2IGV4cCAgMC4wMDAwMDEgICAgIC0+ICAxLjAwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDE3IGV4cCAgMC4wMDAwMDAxICAgIC0+ICAxLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDE4IGV4cCAgMC4wMDAwMDAzICAgIC0+ICAxLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDE5IGV4cCAgMC4wMDAwMDA0ICAgIC0+ICAxLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDIwIGV4cCAgMC4wMDAwMDA1ICAgIC0+ICAxLjAwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDIxIGV4cCAgMC4wMDAwMDA4ICAgIC0+ICAxLjAwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDIyIGV4cCAgMC4wMDAwMDA5ICAgIC0+ICAxLjAwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDIzIGV4cCAgMC4wMDAwMDEwICAgIC0+ICAxLjAwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDI0IGV4cCAgMC4wMDAwMDExICAgIC0+ICAxLjAwMDAwMSAgSW5leGFjdCBSb3VuZGVkCitleHB4MDI1IGV4cCAgMC4wMDAwMDAwOSAgIC0+ICAxLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDI2IGV4cCAgMC4wMDAwMDAwNSAgIC0+ICAxLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDI3IGV4cCAgMC4wMDAwMDAwNCAgIC0+ICAxLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitleHB4MDI4IGV4cCAgMC4wMDAwMDAwMSAgIC0+ICAxLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGFuZCBzb21lIG1vcmUgemVyb3MKK2V4cHgwMzAgZXhwICAwLjAwMDAwMDAwICAgLT4gIDEKK2V4cHgwMzEgZXhwICAwRSsxMDAgICAgICAgLT4gIDEKK2V4cHgwMzIgZXhwICAwRS0xMDAgICAgICAgLT4gIDEKK2V4cHgwMzMgZXhwIC0wLjAwMDAwMDAwICAgLT4gIDEKK2V4cHgwMzQgZXhwIC0wRSsxMDAgICAgICAgLT4gIDEKK2V4cHgwMzUgZXhwIC0wRS0xMDAgICAgICAgLT4gIDEKKworLS0gYmFzaWMgZT0wLCBlPTEsIGU9MiwgZT00LCBlPj04IGNhc2VzCitwcmVjaXNpb246ICAgNworZXhweDA0MSBleHAgIDEgICAgICAgICAgLT4gIDIuNzE4MjgyICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwNDIgZXhwIC0xICAgICAgICAgIC0+ICAwLjM2Nzg3OTQgSW5leGFjdCBSb3VuZGVkCitleHB4MDQzIGV4cCAgMTAgICAgICAgICAtPiAgMjIwMjYuNDcgIEluZXhhY3QgUm91bmRlZAorZXhweDA0NCBleHAgLTEwICAgICAgICAgLT4gIDAuMDAwMDQ1Mzk5OTMgSW5leGFjdCBSb3VuZGVkCitleHB4MDQ1IGV4cCAgMTAwICAgICAgICAtPiAgMi42ODgxMTdFKzQzICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgwNDYgZXhwIC0xMDAgICAgICAgIC0+ICAzLjcyMDA3NkUtNDQgIEluZXhhY3QgUm91bmRlZAorZXhweDA0NyBleHAgIDEwMDAgICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDA0OCBleHAgLTEwMDAgICAgICAgLT4gIDBFLTM4OSBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQgU3Vibm9ybWFsCitleHB4MDQ5IGV4cCAgMTAwMDAwMDAwICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHB4MDUwIGV4cCAtMTAwMDAwMDAwICAtPiAgMEUtMzg5IFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZCBTdWJub3JtYWwKKworLS0gbWlzY2VsbGFuZWEKKy0tIHNpbWlsYXIgdG8gJ1ZGIGJ1ZycgdGVzdCwgYXQgMTcsIGJ1dCB3aXRoIGxhc3QgZGlnaXQgY29ycmVjdGVkIGZvciBkZWNpbWFsCitwcmVjaXNpb246IDE2CitleHB4MDU1IGV4cCAtNS40MjQxMDMxMTI4NzQ0MTQ1OTE3MkUrMiAtPiAyLjcxNzY1ODQ4Njg4NDU3MkUtMjM2IEluZXhhY3QgUm91bmRlZAorLS0gIHJlc3VsdCBmcm9tIE5ldFJleHgvSmF2YSBwcm90b3R5cGUgLT4gMi43MTc2NTg0ODY4ODQ1NzIxMTE3Njc3OTI5NjI4NjE3MjQ2MDU0NDU5NjQ0NzExMTA4RS0yMzYKKy0tICAgcmVzdWx0IGZyb20gUmV4eCAoc2VyaWVzKSB2ZXJzaW9uIC0+IDIuNzE3NjU4NDg2ODg0NTcyMTExNzY3NzkyOTYyODYxNzI0NjA1NDQ2RS0yMzYKK3ByZWNpc2lvbjogMTcKK2V4cHgwNTYgZXhwIC01LjQyNDEwMzExMjg3NDQxNDU5MTcyRSsyIC0+IDIuNzE3NjU4NDg2ODg0NTcyMUUtMjM2IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOAorZXhweDA1NyBleHAgLTUuNDI0MTAzMTEyODc0NDE0NTkxNzJFKzIgLT4gMi43MTc2NTg0ODY4ODQ1NzIxMUUtMjM2IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOQorZXhweDA1OCBleHAgLTUuNDI0MTAzMTEyODc0NDE0NTkxNzJFKzIgLT4gMi43MTc2NTg0ODY4ODQ1NzIxMTJFLTIzNiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjAKK2V4cHgwNTkgZXhwIC01LjQyNDEwMzExMjg3NDQxNDU5MTcyRSsyIC0+IDIuNzE3NjU4NDg2ODg0NTcyMTExOEUtMjM2IEluZXhhY3QgUm91bmRlZAorCistLSByb3VuZGluZyBpbiBhcmVhcyBvZiAuLjUwMC4uLCAuLjQ5OS4uLCAuLjEwMC4uLCAuLjk5OS4uIHNlcXVlbmNlcworcHJlY2lzaW9uOiAgIDUwCitleHB4MTAxIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwMDAwMjczMzc0OTk1MDc5MjUwMDczODExIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDMxCitleHB4MTAyIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwMDAwMjcgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMzAKK2V4cHgxMDMgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwMDAzICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyOQorZXhweDEwNCBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAwMCAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI4CitleHB4MTA1IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUwMDAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjcKK2V4cHgxMDYgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyNgorZXhweDEwNyBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MCAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI1CitleHB4MTA4IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTg3ODUgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjQKK2V4cHgxMDkgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyMworZXhweDExMCBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4OCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDIyCitleHB4MTExIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA0OTk5OTkgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjEKK2V4cHgxMTIgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDUwMDAwICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAyMAorZXhweDExMyBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNTAwMCAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE5CitleHB4MTE0IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDA1MDAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTgKK2V4cHgxMTUgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0MDUwICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxNworZXhweDExNiBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNSAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE2CitleHB4MTE3IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAwNDAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTUKK2V4cHgxMTggZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwMDA0ICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxNAorZXhweDExOSBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDEzCitleHB4MTIwIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAwMDAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTIKK2V4cHgxMjEgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwMDAwICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxMQorZXhweDEyMiBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMCAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDEwCitleHB4MTIzIGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkxMDAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDkKK2V4cHgxMjQgZXhwIC05RS04IC0+IDAuOTk5OTk5OTEwICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgOAorZXhweDEyNSBleHAgLTlFLTggLT4gMC45OTk5OTk5MSAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA3CitleHB4MTI2IGV4cCAtOUUtOCAtPiAwLjk5OTk5OTkgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDYKK2V4cHgxMjcgZXhwIC05RS04IC0+IDEuMDAwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgNQorZXhweDEyOCBleHAgLTlFLTggLT4gMS4wMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA0CitleHB4MTI5IGV4cCAtOUUtOCAtPiAxLjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDMKK2V4cHgxMzAgZXhwIC05RS04IC0+IDEuMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMgorZXhweDEzMSBleHAgLTlFLTggLT4gMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAxCitleHB4MTMyIGV4cCAtOUUtOCAtPiAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKworLS0gc2FuaXR5IGNoZWNrcywgd2l0aCBpdGVyYXRpb24gY291bnRzIFtub3JtYWxpemVkIHNvIDA8PXx4fDwxXQorcHJlY2lzaW9uOiAgIDUwCisKK2V4cHgyMTAgZXhwIDAgLT4gMQorLS0gaXRlcmF0aW9uczogMgorZXhweDIxMSBleHAgLTFFLTQwIC0+IDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiA4CitleHB4MjEyIGV4cCAtOUUtNyAtPiAwLjk5OTk5OTEwMDAwMDQwNDk5OTg3ODUwMDAyNzMzNzQ5NTA3OTI1MDczODExMjQwNTEwIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogNgorZXhweDIxMyBleHAgLTlFLTggLT4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAwMDI3MzM3NDk5NTA3OTI1MDA3MzgxMSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDE1CitleHB4MjE0IGV4cCAtMC4wMDMgLT4gMC45OTcwMDQ0OTU1MDMzNzI5NzYwMTIwNjYyMzQwOTc1NjA5MTA3NDE3NzQ4MDQ4OTg0NSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDE0CitleHB4MjE1IGV4cCAtMC4wMDEgLT4gMC45OTkwMDA0OTk4MzMzNzQ5OTE2NjgwNTUzNTcxNjc2NTU5NzQ3MDIzNTU5MDIzNjAwOCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI2CitleHB4MjE2IGV4cCAtMC4xIC0+IDAuOTA0ODM3NDE4MDM1OTU5NTczMTY0MjQ5MDU5NDQ2NDM2NjIxMTk0NzA1MzYwOTgwNDAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAzOQorZXhweDIxNyBleHAgLTAuNyAtPiAwLjQ5NjU4NTMwMzc5MTQwOTUxNDcwNDgwMDA5MzM5NzUyODk2MTcwNzY2NzE2NTcxMTgyIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogNDEKK2V4cHgyMTggZXhwIC0wLjkgLT4gMC40MDY1Njk2NTk3NDA1OTkxMTE4ODM0NTQyMzk2NDU2MjU5ODc4MzM3MDMzNzYxNzAzOCBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDQzCitleHB4MjE5IGV4cCAtMC45OSAtPiAwLjM3MTU3NjY5MTAyMjA0NTY5MDUzMTUyNDExOTkwODIwMTM4NjkxODAyODg1NDkwNTAxIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjYKK2V4cHgyMjAgZXhwIC0xIC0+IDAuMzY3ODc5NDQxMTcxNDQyMzIxNTk1NTIzNzcwMTYxNDYwODY3NDQ1ODExMTMxMDMxNzcgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNgorZXhweDIyMSBleHAgLTEuMDEgLT4gMC4zNjQyMTg5Nzk1NzE1MjMzMTk3NTcwNDYyOTU2MzczNDU0ODk1OTU4OTEzOTE5MjQ4MiBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI3CitleHB4MjIyIGV4cCAtMS4xIC0+IDAuMzMyODcxMDgzNjk4MDc5NTUzMjg4ODQ2OTA2NDMxMzE1NTIxNjEyNDc5NTIxNTY5MjEgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyOAorZXhweDIyMyBleHAgLTEuNSAtPiAwLjIyMzEzMDE2MDE0ODQyOTgyODkzMzI4MDQ3MDc2NDAxMjUyMTM0MjE3MTYyOTM2MTA4IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMzAKK2V4cHgyMjQgZXhwIC0yIC0+IDAuMTM1MzM1MjgzMjM2NjEyNjkxODkzOTk5NDk0OTcyNDg0NDAzNDA3NjMxNTQ1OTA5NTggSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAzNgorZXhweDIyNSBleHAgLTUgLT4gMC4wMDY3Mzc5NDY5OTkwODU0NjcwOTY2MzYwNDg0MjMxNDg0MjQyNDg4NDk1ODUwMjczNTUxIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjYKK2V4cHgyMjYgZXhwIC0xMCAtPiAwLjAwMDA0NTM5OTkyOTc2MjQ4NDg1MTUzNTU5MTUxNTU2MDU1MDYxMDIzNzkxODA4ODg2NjU2NSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI4CitleHB4MjI3IGV4cCAtMTQgLT4gOC4zMTUyODcxOTEwMzU2Nzg4NDA2Mzk4NTE0MjU2NTI2MjI5NDYwNzY1ODM2NDk4NDU3RS03IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjkKK2V4cHgyMjggZXhwIC0xNSAtPiAzLjA1OTAyMzIwNTAxODI1Nzg4MzcxNDc5NDk3NzAyMjg5NjM5MzcwODIwNzgwODE4NTZFLTcgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAzMAorZXhweDIzMyBleHAgMCAtPiAxCistLSBpdGVyYXRpb25zOiAyCitleHB4MjM0IGV4cCAxRS00MCAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiA3CitleHB4MjM1IGV4cCA5RS03IC0+IDEuMDAwMDAwOTAwMDAwNDA1MDAwMTIxNTAwMDI3MzM3NTA0OTIwNzUwNzM4MTEyNTk0OSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDYKK2V4cHgyMzYgZXhwIDlFLTggLT4gMS4wMDAwMDAwOTAwMDAwMDQwNTAwMDAxMjE1MDAwMDI3MzM3NTAwNDkyMDc1MDA3MzgxIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMTUKK2V4cHgyMzcgZXhwIDAuMDAzIC0+IDEuMDAzMDA0NTA0NTAzMzc3MDI2MDEyOTM0MDkxMzQ4OTAwMjA1MzMxODcyNzE5NTYxOSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDEzCitleHB4MjM4IGV4cCAwLjAwMSAtPiAxLjAwMTAwMDUwMDE2NjcwODM0MTY2ODA1NTc1Mzk5MzA1ODMxMTU2MzA3NjIwMDU4MDcgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNQorZXhweDIzOSBleHAgMC4xIC0+IDEuMTA1MTcwOTE4MDc1NjQ3NjI0ODExNzA3ODI2NDkwMjQ2NjY4MjI0NTQ3MTk0NzM3NSBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDM4CitleHB4MjQwIGV4cCAwLjcgLT4gMi4wMTM3NTI3MDc0NzA0NzY1MjE2MjQ1NDkzODg1ODMwNjUyNzAwMTc1NDIzOTQxNDU5IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogNDEKK2V4cHgyNDEgZXhwIDAuOSAtPiAyLjQ1OTYwMzExMTE1Njk0OTY2MzgwMDEyNjU2MzYwMjQ3MDY5NTQyMTc3MjMwNjQ0MDEgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiA0MgorZXhweDI0MiBleHAgMC45OSAtPiAyLjY5MTIzNDQ3MjM0OTI2MjI4OTA5OTg3OTQwNDA3MTAxMzk3MjE4MDI5MzE4NDEwMzAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNgorZXhweDI0MyBleHAgMSAtPiAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MjQ5Nzc1NzI0NzA5MzcwMDAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNgorZXhweDI0NCBleHAgMS4wMSAtPiAyLjc0NTYwMTAxNTAxNjkxNjQ5Mzk4OTc3NjMxNjY2MDM4NzYyNDA3Mzc1MDgxOTU5NjAgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyNgorZXhweDI0NSBleHAgMS4xIC0+IDMuMDA0MTY2MDIzOTQ2NDMzMTEyMDU4NDA3OTUzNTg4NjcyMzkzMjgyNjgxMDI2MDE2MyBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI4CitleHB4MjQ2IGV4cCAxLjUgLT4gNC40ODE2ODkwNzAzMzgwNjQ4MjI2MDIwNTU0NjAxMTkyNzU4MTkwMDU3NDk4NjgzNjk3IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjkKK2V4cHgyNDcgZXhwIDIgLT4gNy4zODkwNTYwOTg5MzA2NTAyMjcyMzA0Mjc0NjA1NzUwMDc4MTMxODAzMTU1NzA1NTE4IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMzYKK2V4cHgyNDggZXhwIDUgLT4gMTQ4LjQxMzE1OTEwMjU3NjYwMzQyMTExNTU4MDA0MDU1MjI3OTYyMzQ4NzY2NzU5Mzg4IEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjYKK2V4cHgyNDkgZXhwIDEwIC0+IDIyMDI2LjQ2NTc5NDgwNjcxNjUxNjk1NzkwMDY0NTI4NDI0NDM2NjM1MzUxMjYxODU1NyBJbmV4YWN0IFJvdW5kZWQKKy0tIGl0ZXJhdGlvbnM6IDI4CitleHB4MjUwIGV4cCAxNCAtPiAxMjAyNjA0LjI4NDE2NDc3Njc3Nzc0OTIzNjc3MDc2Nzg1OTQ0OTQxMjQ4NjU0MzM3NjEgSW5leGFjdCBSb3VuZGVkCistLSBpdGVyYXRpb25zOiAyOAorZXhweDI1MSBleHAgMTUgLT4gMzI2OTAxNy4zNzI0NzIxMTA2MzkzMDE4NTUwNDYwOTE3MjEzMTU1MDU3Mzg1NDM4MjAwIEluZXhhY3QgUm91bmRlZAorLS0gaXRlcmF0aW9uczogMjkKKworLS0gYSBiaWdnaWUgW3Jlc3VsdCB2ZXJpZmllZCAzIHdheXNdCitwcmVjaXNpb246IDI1MAorZXhweDI2MCBleHAgMSAtPiAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MjQ5Nzc1NzI0NzA5MzY5OTk1OTU3NDk2Njk2NzYyNzcyNDA3NjYzMDM1MzU0NzU5NDU3MTM4MjE3ODUyNTE2NjQyNzQyNzQ2NjM5MTkzMjAwMzA1OTkyMTgxNzQxMzU5NjYyOTA0MzU3MjkwMDMzNDI5NTI2MDU5NTYzMDczODEzMjMyODYyNzk0MzQ5MDc2MzIzMzgyOTg4MDc1MzE5NTI1MTAxOTAxMTU3MzgzNDE4NzkzMDcwMjE1NDA4OTE0OTkzNDg4NDE2NzUwOTI0NDc2MTQ2MDY2OCBJbmV4YWN0IFJvdW5kZWQKKworLS0gZXh0cmVtZSByYW5nZSBib3VuZGFyaWVzCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiA5OTk5OTkKK21pbkV4cG9uZW50OiAtOTk5OTk5CistLSBOdGlueSBib3VuZGFyeQorZXhweDI5MCBleHAgIC0yMzAyNjE4LjAyMjMzMjUyOSAtPiAwRS0xMDAwMDE0IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2V4cHgyOTEgZXhwICAtMjMwMjYxOC4wMjIzMzI1MjggLT4gMUUtMTAwMDAxNCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorLS0gTm1heC8xMCBhbmQgTm1heCBib3VuZGFyeQorZXhweDI5MiBleHAgIDIzMDI1ODIuNzkwNDA4OTUyIC0+IDkuOTk5OTk5OTkzMTAwMjc3RSs5OTk5OTggIEluZXhhY3QgUm91bmRlZAorZXhweDI5MyBleHAgIDIzMDI1ODIuNzkwNDA4OTUzIC0+IDEuMDAwMDAwMDAwMzEwMDI4RSs5OTk5OTkgIEluZXhhY3QgUm91bmRlZAorZXhweDI5NCBleHAgIDIzMDI1ODUuMDkyOTkzOTQ2IC0+IDkuOTk5OTk5MDAzMTU5ODcwRSs5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitleHB4Mjk1IGV4cCAgMjMwMjU4NS4wOTI5OTQwMzYgLT4gOS45OTk5OTk5MDMxNTk4MjFFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgyOTYgZXhwICAyMzAyNTg1LjA5Mjk5NDA0NSAtPiA5Ljk5OTk5OTk5MzE1OTgyMEUrOTk5OTk5IEluZXhhY3QgUm91bmRlZAorZXhweDI5NyBleHAgIDIzMDI1ODUuMDkyOTk0MDQ2IC0+IEluZmluaXR5IE92ZXJmbG93ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIDA8LXg8PDEgZWZmZWN0cworcHJlY2lzaW9uOiAgICAzMAorZXhweDMyMCBleHAgLTQuOTk5OTk5OTk5OTk5OUUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwMTI1MDAwMDk3OTE2NjYxNyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzMjEgZXhwIC01LjAwMDAwMDAwMDAwMDBFLTggLT4gMC45OTk5OTk5NTAwMDAwMDEyNDk5OTk5NzkxNjY2NjcgSW5leGFjdCBSb3VuZGVkCitleHB4MzIyIGV4cCAtNS4wMDAwMDAwMDAwMDAxRS04IC0+IDAuOTk5OTk5OTUwMDAwMDAxMjQ5OTk4OTc5MTY2NzE3IEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAyMAorZXhweDMyMyBleHAgLTQuOTk5OTk5OTk5OTk5OUUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwMTI1MDAwIEluZXhhY3QgUm91bmRlZAorZXhweDMyNCBleHAgLTUuMDAwMDAwMDAwMDAwMEUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwMTI1MDAwIEluZXhhY3QgUm91bmRlZAorZXhweDMyNSBleHAgLTUuMDAwMDAwMDAwMDAwMUUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwMTI1MDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAxNAorZXhweDMyNiBleHAgLTQuOTk5OTk5OTk5OTk5OUUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwIEluZXhhY3QgUm91bmRlZAorZXhweDMyNyBleHAgLTUuMDAwMDAwMDAwMDAwMEUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwIEluZXhhY3QgUm91bmRlZAorZXhweDMyOCBleHAgLTUuMDAwMDAwMDAwMDAwMUUtOCAtPiAwLjk5OTk5OTk1MDAwMDAwIEluZXhhY3QgUm91bmRlZAorLS0gb3ZlcnByZWNpc2UgYW5kIDA8LXg8PDEKK3ByZWNpc2lvbjogICAgOAorZXhweDMzMCBleHAgLTQuOTk5OTk5OTk5OTk5OUUtOCAtPiAwLjk5OTk5OTk1ICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDMzMSBleHAgLTUuMDAwMDAwMDAwMDAwMEUtOCAtPiAwLjk5OTk5OTk1ICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDMzMiBleHAgLTUuMDAwMDAwMDAwMDAwMUUtOCAtPiAwLjk5OTk5OTk1ICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA3CitleHB4MzMzIGV4cCAtNC45OTk5OTk5OTk5OTk5RS04IC0+IDEuMDAwMDAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzM0IGV4cCAtNS4wMDAwMDAwMDAwMDAwRS04IC0+IDEuMDAwMDAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzM1IGV4cCAtNS4wMDAwMDAwMDAwMDAxRS04IC0+IDEuMDAwMDAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDMKK2V4cHgzMzYgZXhwIC00Ljk5OTk5OTk5OTk5OTlFLTggLT4gMS4wMCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzMzcgZXhwIC01LjAwMDAwMDAwMDAwMDBFLTggLT4gMS4wMCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzMzggZXhwIC01LjAwMDAwMDAwMDAwMDFFLTggLT4gMS4wMCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gMDx4PDwxIGVmZmVjdHMKK3ByZWNpc2lvbjogICAgMzAKK2V4cHgzNDAgZXhwICA0Ljk5OTk5OTk5OTk5OTlFLTggLT4gMS4wMDAwMDAwNTAwMDAwMDEyNDk5OTkwMjA4MzMyOCAgSW5leGFjdCBSb3VuZGVkCitleHB4MzQxIGV4cCAgNS4wMDAwMDAwMDAwMDAwRS04IC0+IDEuMDAwMDAwMDUwMDAwMDAxMjUwMDAwMDIwODMzMzMgIEluZXhhY3QgUm91bmRlZAorZXhweDM0MiBleHAgIDUuMDAwMDAwMDAwMDAwMUUtOCAtPiAxLjAwMDAwMDA1MDAwMDAwMTI1MDAwMTAyMDgzMzM4ICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMjAKK2V4cHgzNDMgZXhwICA0Ljk5OTk5OTk5OTk5OTlFLTggLT4gMS4wMDAwMDAwNTAwMDAwMDEyNTAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNDQgZXhwICA1LjAwMDAwMDAwMDAwMDBFLTggLT4gMS4wMDAwMDAwNTAwMDAwMDEyNTAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNDUgZXhwICA1LjAwMDAwMDAwMDAwMDFFLTggLT4gMS4wMDAwMDAwNTAwMDAwMDEyNTAwICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMTQKK2V4cHgzNDYgZXhwICA0Ljk5OTk5OTk5OTk5OTlFLTggLT4gMS4wMDAwMDAwNTAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNDcgZXhwICA1LjAwMDAwMDAwMDAwMDBFLTggLT4gMS4wMDAwMDAwNTAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNDggZXhwICA1LjAwMDAwMDAwMDAwMDFFLTggLT4gMS4wMDAwMDAwNTAwMDAwICBJbmV4YWN0IFJvdW5kZWQKKy0tIG92ZXJwcmVjaXNlIGFuZCAwPHg8PDEKK3ByZWNpc2lvbjogICAgOAorZXhweDM1MCBleHAgIDQuOTk5OTk5OTk5OTk5OUUtOCAtPiAxLjAwMDAwMDEgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDM1MSBleHAgIDUuMDAwMDAwMDAwMDAwMEUtOCAtPiAxLjAwMDAwMDEgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDM1MiBleHAgIDUuMDAwMDAwMDAwMDAwMUUtOCAtPiAxLjAwMDAwMDEgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA3CitleHB4MzUzIGV4cCAgNC45OTk5OTk5OTk5OTk5RS04IC0+IDEuMDAwMDAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzU0IGV4cCAgNS4wMDAwMDAwMDAwMDAwRS04IC0+IDEuMDAwMDAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4MzU1IGV4cCAgNS4wMDAwMDAwMDAwMDAxRS04IC0+IDEuMDAwMDAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDMKK2V4cHgzNTYgZXhwICA0Ljk5OTk5OTk5OTk5OTlFLTggLT4gMS4wMCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNTcgZXhwICA1LjAwMDAwMDAwMDAwMDBFLTggLT4gMS4wMCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHgzNTggZXhwICA1LjAwMDAwMDAwMDAwMDFFLTggLT4gMS4wMCAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gY2FzZXMgbmVhciAxICAgICAgICAgICAgICAtLSAgMSAyMzQ1Njc4OTAxMjM0NTY3ODkwCitwcmVjaXNpb246ICAgIDIwCitleHB4NDAxIGV4cCAwLjk5OTk5OTk5OTk5OTk2ICAtPiAyLjcxODI4MTgyODQ1ODkzNjUwNDEgIEluZXhhY3QgUm91bmRlZAorZXhweDQwMiBleHAgMC45OTk5OTk5OTk5OTk5NyAgLT4gMi43MTgyODE4Mjg0NTg5NjM2ODY5ICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MDMgZXhwIDAuOTk5OTk5OTk5OTk5OTggIC0+IDIuNzE4MjgxODI4NDU4OTkwODY5NyAgSW5leGFjdCBSb3VuZGVkCitleHB4NDA0IGV4cCAwLjk5OTk5OTk5OTk5OTk5ICAtPiAyLjcxODI4MTgyODQ1OTAxODA1MjUgIEluZXhhY3QgUm91bmRlZAorZXhweDQwNSBleHAgMS4wMDAwMDAwMDAwMDAwICAgLT4gMi43MTgyODE4Mjg0NTkwNDUyMzU0ICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MDYgZXhwIDEuMDAwMDAwMDAwMDAwMSAgIC0+IDIuNzE4MjgxODI4NDU5MzE3MDYzNSAgSW5leGFjdCBSb3VuZGVkCitleHB4NDA3IGV4cCAxLjAwMDAwMDAwMDAwMDIgICAtPiAyLjcxODI4MTgyODQ1OTU4ODg5MTcgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAxNAorZXhweDQxMSBleHAgMC45OTk5OTk5OTk5OTk5NiAgLT4gMi43MTgyODE4Mjg0NTg5ICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MTIgZXhwIDAuOTk5OTk5OTk5OTk5OTcgIC0+IDIuNzE4MjgxODI4NDU5MCAgSW5leGFjdCBSb3VuZGVkCitleHB4NDEzIGV4cCAwLjk5OTk5OTk5OTk5OTk4ICAtPiAyLjcxODI4MTgyODQ1OTAgIEluZXhhY3QgUm91bmRlZAorZXhweDQxNCBleHAgMC45OTk5OTk5OTk5OTk5OSAgLT4gMi43MTgyODE4Mjg0NTkwICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MTUgZXhwIDEuMDAwMDAwMDAwMDAwMCAgIC0+IDIuNzE4MjgxODI4NDU5MCAgSW5leGFjdCBSb3VuZGVkCitleHB4NDE2IGV4cCAxLjAwMDAwMDAwMDAwMDEgICAtPiAyLjcxODI4MTgyODQ1OTMgIEluZXhhY3QgUm91bmRlZAorZXhweDQxNyBleHAgMS4wMDAwMDAwMDAwMDAyICAgLT4gMi43MTgyODE4Mjg0NTk2ICBJbmV4YWN0IFJvdW5kZWQKKy0tIG92ZXJwcmVjaXNlLi4uCitwcmVjaXNpb246ICAgIDcKK2V4cHg0MjEgZXhwIDAuOTk5OTk5OTk5OTk5OTYgIC0+IDIuNzE4MjgyICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDIyIGV4cCAwLjk5OTk5OTk5OTk5OTk3ICAtPiAyLjcxODI4MiAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQyMyBleHAgMC45OTk5OTk5OTk5OTk5OCAgLT4gMi43MTgyODIgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MjQgZXhwIDAuOTk5OTk5OTk5OTk5OTkgIC0+IDIuNzE4MjgyICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDI1IGV4cCAxLjAwMDAwMDAwMDAwMDEgICAtPiAyLjcxODI4MiAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQyNiBleHAgMS4wMDAwMDAwMDAwMDAyICAgLT4gMi43MTgyODIgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MjcgZXhwIDEuMDAwMDAwMDAwMDAwMyAgIC0+IDIuNzE4MjgyICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDIKK2V4cHg0MzEgZXhwIDAuOTk5OTk5OTk5OTk5OTYgIC0+IDIuNyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDMyIGV4cCAwLjk5OTk5OTk5OTk5OTk3ICAtPiAyLjcgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQzMyBleHAgMC45OTk5OTk5OTk5OTk5OCAgLT4gMi43ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MzQgZXhwIDAuOTk5OTk5OTk5OTk5OTkgIC0+IDIuNyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NDM1IGV4cCAxLjAwMDAwMDAwMDAwMDEgICAtPiAyLjcgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDQzNiBleHAgMS4wMDAwMDAwMDAwMDAyICAgLT4gMi43ICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg0MzcgZXhwIDEuMDAwMDAwMDAwMDAwMyAgIC0+IDIuNyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGJhc2ljcyBhdCBsb3cgcHJlY2lzaW9ucworcHJlY2lzaW9uOiAzCitleHB4NTAxIGV4cCAgLUluZmluaXR5ICAgICAtPiAwCitleHB4NTAyIGV4cCAgLTEwICAgICAgICAgICAtPiAwLjAwMDA0NTQgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MDMgZXhwICAtMSAgICAgICAgICAgIC0+IDAuMzY4ICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUwNCBleHAgICAwICAgICAgICAgICAgLT4gMQorZXhweDUwNSBleHAgIC0wICAgICAgICAgICAgLT4gMQorZXhweDUwNiBleHAgICAxICAgICAgICAgICAgLT4gMi43MiAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTA3IGV4cCAgIDAuNjkzMTQ3MTgxICAtPiAyLjAwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MDggZXhwICAgMTAgICAgICAgICAgIC0+IDIuMjBFKzQgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUwOSBleHAgICtJbmZpbml0eSAgICAgLT4gSW5maW5pdHkKK3ByZWNpc2lvbjogMgorZXhweDUxMSBleHAgIC1JbmZpbml0eSAgICAgLT4gMAorZXhweDUxMiBleHAgIC0xMCAgICAgICAgICAgLT4gMC4wMDAwNDUgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTEzIGV4cCAgLTEgICAgICAgICAgICAtPiAwLjM3ICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MTQgZXhwICAgMCAgICAgICAgICAgIC0+IDEKK2V4cHg1MTUgZXhwICAtMCAgICAgICAgICAgIC0+IDEKK2V4cHg1MTYgZXhwICAgMSAgICAgICAgICAgIC0+IDIuNyAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUxNyBleHAgICAwLjY5MzE0NzE4MSAgLT4gMi4wICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTE4IGV4cCAgIDEwICAgICAgICAgICAtPiAyLjJFKzQgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MTkgZXhwICArSW5maW5pdHkgICAgIC0+IEluZmluaXR5CitwcmVjaXNpb246IDEKK2V4cHg1MjEgZXhwICAtSW5maW5pdHkgICAgIC0+IDAKK2V4cHg1MjIgZXhwICAtMTAgICAgICAgICAgIC0+IDAuMDAwMDUgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUyMyBleHAgIC0xICAgICAgICAgICAgLT4gMC40ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTI0IGV4cCAgIDAgICAgICAgICAgICAtPiAxCitleHB4NTI1IGV4cCAgLTAgICAgICAgICAgICAtPiAxCitleHB4NTI2IGV4cCAgIDEgICAgICAgICAgICAtPiAzICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2V4cHg1MjcgZXhwICAgMC42OTMxNDcxODEgIC0+IDIgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorZXhweDUyOCBleHAgICAxMCAgICAgICAgICAgLT4gMkUrNCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitleHB4NTI5IGV4cCAgK0luZmluaXR5ICAgICAtPiBJbmZpbml0eQorCistLSBvdmVyZmxvd3MsIGluY2x1ZGluZyBzb21lIG92ZXJwcmVjaXNlIGJvcmRlcmxpbmVzCitwcmVjaXNpb246ICAgNworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4cHg3MDEgZXhwICAxMDAwMDAwMDAwICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDIgZXhwICAxMDAwMDAwMDAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDMgZXhwICAxMDAwMDAwMCAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDQgZXhwICAxMDAwMDAwICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDUgZXhwICAxMDAwMDAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDYgZXhwICAxMDAwMCAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDcgZXhwICAxMDAwICAgICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDggZXhwICA4ODYuNDk1MjYwOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MDkgZXhwICA4ODYuNDk1MjYwNyAtPiA5Ljk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZXhweDcxMCBleHAgIDg4Ni40OTUyNyAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcxMSBleHAgIDg4Ni40OTUyNiAgIC0+IDkuOTk5OTkyRSszODQgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTYKK2V4cHg3MjEgZXhwICA4ODYuNDk1MjYwODAyNzA3NTg4MyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MjIgZXhwICA4ODYuNDk1MjYwODAyNzA3NTg4MiAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZXhweDcyMyBleHAgIDg4Ni40OTUyNjA4MDI3MDc1OSAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDcyNCBleHAgIDg4Ni40OTUyNjA4MDI3MDc1OCAgIC0+IDkuOTk5OTk5OTk5OTk5OTE3RSszODQgSW5leGFjdCBSb3VuZGVkCitleHB4NzI1IGV4cCAgODg2LjQ5NTI2MDgwMjcwNzYgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitleHB4NzI2IGV4cCAgODg2LjQ5NTI2MDgwMjcwNzUgICAgLT4gOS45OTk5OTk5OTk5OTkxMTdFKzM4NCBJbmV4YWN0IFJvdW5kZWQKKy0tIGFuZCBieSBzcGVjaWFsIHJlcXVlc3QgLi4uCitwcmVjaXNpb246ICAgMTUKK2V4cHg3MzEgZXhwICA4ODYuNDk1MjYwODAyNzA4ICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3MzIgZXhwICA4ODYuNDk1MjYwODAyNzA3ICAgICAtPiA5Ljk5OTk5OTk5OTk5NDEyRSszODQgSW5leGFjdCBSb3VuZGVkCitleHB4NzMzIGV4cCAgODg2LjQ5NTI2MDgwMjcwNiAgICAgLT4gOS45OTk5OTk5OTk5ODQxMkUrMzg0IEluZXhhY3QgUm91bmRlZAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKK2V4cHg3MzUgZXhwICAyMzAyLjU4NTA5Mjk5NDA1ICAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXhweDczNiBleHAgIDIzMDIuNTg1MDkyOTk0MDQgICAgLT4gOS45OTk5OTk5OTk5NDMxNkUrOTk5IEluZXhhY3QgUm91bmRlZAorZXhweDczNyBleHAgIDIzMDIuNTg1MDkyOTk0MDMgICAgLT4gOS45OTk5OTk5OTk4NDMxNkUrOTk5IEluZXhhY3QgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3dzLCBpbmNsdWRpbmcgdW5kZXJmbG93LXRvLXplcm8gZWRnZSBwb2ludAorcHJlY2lzaW9uOiAgIDcKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitleHB4NzUxIGV4cCAtMTAwMDAwMDAwMCAgIC0+ICAwRS0zODkgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkIFN1Ym5vcm1hbAorZXhweDc1MiBleHAgLTEwMDAwMDAwMCAgICAtPiAgMEUtMzg5IFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZCBTdWJub3JtYWwKK2V4cHg3NTMgZXhwIC0xMDAwMDAwMCAgICAgLT4gIDBFLTM4OSBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQgU3Vibm9ybWFsCitleHB4NzU0IGV4cCAtMTAwMDAwMCAgICAgIC0+ICAwRS0zODkgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkIFN1Ym5vcm1hbAorZXhweDc1NSBleHAgLTEwMDAwMCAgICAgICAtPiAgMEUtMzg5IFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZCBTdWJub3JtYWwKK2V4cHg3NTYgZXhwIC0xMDAwMCAgICAgICAgLT4gIDBFLTM4OSBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQgU3Vibm9ybWFsCitleHB4NzU3IGV4cCAtMTAwMCAgICAgICAgIC0+ICAwRS0zODkgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkIFN1Ym5vcm1hbAorZXhweDc1OCBleHAgLTg4MS44OTAwOSAgICAtPiAgMS4wMDAwMDFFLTM4MyBJbmV4YWN0IFJvdW5kZWQKK2V4cHg3NTkgZXhwIC04ODEuODkwMSAgICAgLT4gIDkuOTk5OTFFLTM4NCAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjAgZXhwIC04ODUgICAgICAgICAgLT4gIDQuNDYwNUUtMzg1ICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjEgZXhwIC04ODggICAgICAgICAgLT4gIDIuMjIxRS0zODYgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjIgZXhwIC04OTAgICAgICAgICAgLT4gIDMuMDFFLTM4NyAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjMgZXhwIC04OTIuOSAgICAgICAgLT4gIDEuN0UtMzg4ICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjQgZXhwIC04OTMgICAgICAgICAgLT4gIDEuNUUtMzg4ICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjUgZXhwIC04OTMuNSAgICAgICAgLT4gIDlFLTM4OSAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjYgZXhwIC04OTUuNzA1NiAgICAgLT4gIDFFLTM4OSAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NjkgZXhwIC04OTUuOCAgICAgICAgLT4gIDFFLTM4OSAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NzAgZXhwIC04OTUuNzMgICAgICAgLT4gIDFFLTM4OSAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NzEgZXhwIC04OTYuMzk4NyAgICAgLT4gIDFFLTM4OSAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK2V4cHg3NzIgZXhwIC04OTYuMzk4OCAgICAgLT4gIDBFLTM4OSAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorZXhweDc3MyBleHAgLTg5OC4wMDgxICAgICAtPiAgMEUtMzg5ICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCitleHB4Nzc0IGV4cCAtODk4LjAwODIgICAgIC0+ICAwRS0zODkgICAgICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKKworLS0gc3BlY2lhbCB2YWx1ZXMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitleHB4ODIwIGV4cCAgIEluZiAgICAtPiBJbmZpbml0eQorZXhweDgyMSBleHAgIC1JbmYgICAgLT4gMAorZXhweDgyMiBleHAgICBOYU4gICAgLT4gTmFOCitleHB4ODIzIGV4cCAgc05hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2V4cHg4MjQgZXhwICBzTmFOMTIzIC0+ICBOYU4xMjMgSW52YWxpZF9vcGVyYXRpb24KK2V4cHg4MjUgZXhwIC1zTmFOMzIxIC0+IC1OYU4zMjEgSW52YWxpZF9vcGVyYXRpb24KK2V4cHg4MjYgZXhwICAgTmFONDU2IC0+ICBOYU40NTYKK2V4cHg4MjcgZXhwICAtTmFONjU0IC0+IC1OYU42NTQKK2V4cHg4MjggZXhwICAgTmFOMSAgIC0+ICBOYU4xCisKKy0tIEludmFsaWQgb3BlcmF0aW9ucyBkdWUgdG8gcmVzdHJpY3Rpb25zCistLSBbbmV4dCB0d28gcHJvYmFibHkgc2tpcHBlZCBieSBtb3N0IHRlc3QgaGFybmVzc2VzXQorcHJlY2lzaW9uOiAxMDAwMDAwMDAKK2V4cHg5MDEgZXhwICAtSW5maW5pdHkgICAgIC0+IE5hTiBJbnZhbGlkX2NvbnRleHQKK3ByZWNpc2lvbjogIDk5OTk5OTk5CitleHB4OTAyIGV4cCAgLUluZmluaXR5ICAgICAtPiBOYU4gSW52YWxpZF9jb250ZXh0CisKK3ByZWNpc2lvbjogOQorbWF4RXhwb25lbnQ6ICAgMTAwMDAwMAorbWluRXhwb25lbnQ6ICAgLTk5OTk5OQorZXhweDkwMyBleHAgIC1JbmZpbml0eSAgICAgLT4gTmFOIEludmFsaWRfY29udGV4dAorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAgLTk5OTk5OQorZXhweDkwNCBleHAgIC1JbmZpbml0eSAgICAgLT4gMAorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAtMTAwMDAwMAorZXhweDkwNSBleHAgIC1JbmZpbml0eSAgICAgLT4gTmFOIEludmFsaWRfY29udGV4dAorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAgLTk5OTk5OAorZXhweDkwNiBleHAgIC1JbmZpbml0eSAgICAgLT4gMAorCistLQorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBOdWxsIHRlc3QKK2V4cHg5MDAgZXhwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCisKKy0tIFJhbmRvbXMgUD01MCwgd2l0aGluIDAtOTk5CitQcmVjaXNpb246IDUwCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworZXhweDE1MDEgZXhwIDY1Ni4zNTM5Nzk1MDU5MDI4NTYxMjI2NjA5NTU5NjUzOTkzNDIxMzk0Mzg3Mjg4NTcyOCAgLT4gMS4xMjQzNzU3NjEwNjQwMzE5NzgzNjExMTc4NTI4ODM5NjUyNjcyMDYyODIwMDQwMzE0RSsyODUgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwMiBleHAgMC45MzYyMDU3MTA5MzY1MjgwMDIyNTAzODU1MDYwMDc4MDMyMjgzMTIzNjA4Mjc4MTQ3MSAtPiAyLjU1MDI4NjUxMzA5ODYxNzY2ODkxOTk3MTE4NTc4MjU3NzEzMTExNzgwNDY4NDIwMDkgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwMyBleHAgMC4wMDAwMDAwMDAwMDAwMDAwODM0MDc4NTg1NjYwMTUxNDcxNDE4MzM3Mzg3NDEwNTc5MSAtPiAxLjAwMDAwMDAwMDAwMDAwMDA4MzQwNzg1ODU2NjAxNTE1MDYyMDI2OTE3NDAyNTI1MTIgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwNCBleHAgMC4wMDAwOTE3NDA1NzI2Mjg4Nzc4OTYyNTc0NTU3NDY4NjU0NTE2MzE2ODc4ODQ1NjIwMyAtPiAxLjAwMDA5MTc0NDc4MDkyMzkwMDUxNDY3MjIzNDEyNTE1MjQwODEwMDYwNTE0NzMyNzMgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwNSBleHAgMzMuOTA5MTE2ODk3OTczNzk3NzM1NjU3NzUxNTkxMDE0OTI2NjI5MDUxMTE3NTQxMjQzICAtPiA1MzI3NzMxODEwMjUwMDIuMDM1NDM2MTg5MDEzMDY3MjY0OTU4NzA0NzY2MTcyMzIyMjkgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwNiBleHAgMC4wMDAwMDc0MDQ3MDQxMzAwNDQwNjU5MjEyNDU3NTI5NTI3ODQ1NjkzNjgwOTU4NzMxMSAtPiAxLjAwMDAwNzQwNDczMTU0NDkzMzM1OTAwNjYzOTU2NzAzMDYxMzU1Njc4ODkyMTA4MTQgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwNyBleHAgMC4wMDAwMDAwMDAwMDEyNDg1NDkyMjIyMjEwODgwMjQ1Mzc0NjkyMjQ4MzA3MTQ0NTQ5MiAtPiAxLjAwMDAwMDAwMDAwMTI0ODU0OTIyMjIyMTg2NzQ2MjExNzYyMzk5MTE0MjQ5NjgyNjMgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwOCBleHAgNC4xNzkzMjgwNjc0MTU1NjU5Nzk0Mjg2OTUxMTU5NDMwNjUxMjU4MzU2MDE0MzkxMzgyICAtPiA2NS4zMjE5NDY1MjAxNDcxOTk0MDQxOTk3ODc4MTEzMzY4NjAwODc5NzUxMTgyNzgxODUgSW5leGFjdCBSb3VuZGVkCitleHB4MTUwOSBleHAgNDg1LjQzNTk1NzQ1NDYwNjU1ODkzNzQ2MTc5ODkwMjU1NTI5OTE5MjIxNTUwMjAxNjg2ICAtPiA2LjYzOTg0MDM5MjA0NTk2MTcyNTU5NTA0NzY5NTMxMjkzNzc0NTk4NDUzNjY1ODU0NjNFKzIxMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTEwIGV4cCAwLjAwMDAwMDAwMDAzNTQ3MjU5ODA2NTkwODU2MDMyNTI3ODc1MTU3ODMwMzI4MTU2NTk3IC0+IDEuMDAwMDAwMDAwMDM1NDcyNTk4MDY2NTM3NzEyOTMyMDU4OTQwNjcxNTAwMDY4NTUxNSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTExIGV4cCAwLjAwMDAwMDAwMDAwMDAwNzU5NjIxNDk3MzM5MTA0MDQ3OTMwNjE2NDc4NjM1MDQyNjc4IC0+IDEuMDAwMDAwMDAwMDAwMDA3NTk2MjE0OTczMzkxMDY5MzMwNTQ3MTI1NzcxNTQ2Mzg4NyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTEyIGV4cCA5Ljc5NTkxNjg4MjE3NjAzMzkzMDQ1NzE1OTU0NzQ0ODA2NDAyODYwNzI3MjAyMzM3OTYgIC0+IDE3OTYwLjI2MTE0NjA0Mjk1NTE3OTE2NDMwMzY1MzQxMjY1MDc1MTY4MTQzNjM1MjQzNyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTEzIGV4cCAwLjAwMDAwMDAwNTY2NjQyMDA2MjU4MjkwNTI2NzgzOTAxNDUxMTk0OTQzMTY0NTM1NTgxIC0+IDEuMDAwMDAwMDA1NjY2NDIwMDc4NjM3MDYzNDYwOTgzMjQzODgxNTY2NTI0OTM0NzY1MCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxNTE0IGV4cCA3NDEuMjk4ODg3OTExMzQyOTgxOTQwODg4Mjc1NzIzNzQ3MTg5NDA5MjU4MjAwMjczNTQgIC0+IDguNzUwMTY5NDAwNjMxNzMzMjgwODEyODk0NjY2NjQwMjYyMjQzMjA2NDkyMzE5ODczMUUrMzIxIEluZXhhY3QgUm91bmRlZAorZXhweDE1MTUgZXhwIDAzMi43NTU3MzAwMzU1MjUxNzY2ODgwODUyOTA5OTg5NzE1MzcxMDg4NzAxNDk0NzkzNSAgLT4gMTY4MTI1MTk2NTc4Njc4LjE3NzI1ODQxMTA4NjE3OTU1OTA0NDI1MzQ1NjMxMDkyMzM5IEluZXhhY3QgUm91bmRlZAorZXhweDE1MTYgZXhwIDQyLjMzMzcwMDcyNjQyOTMzMzMwODU5NDI2NTU1MzQyMjkwMjQ2MzczNzM5OTQzNzY0NCAgLT4gMjQyODI0NTY3NTg2NDE3MjQ3NS40NjgxMTE5NDkzMDQ1NjU3Nzk3MzA5MzY5NjcyMDEyIEluZXhhY3QgUm91bmRlZAorZXhweDE1MTcgZXhwIDAuMDAwMDAwMDAwMDAwMDA1NTk2ODI2MTY4NzY0OTE4ODgxOTc2MDkxNTg4MDI4MzU3OTggLT4gMS4wMDAwMDAwMDAwMDAwMDU1OTY4MjYxNjg3NjQ5MzQ1NDQyMDc2NzMyNzM5NTc3MDQ5IEluZXhhY3QgUm91bmRlZAorZXhweDE1MTggZXhwIDAuMDAwMDAwMDAwMDAwODA3MDM2ODg2NjgyODAxOTM1ODQ3NTgzMDA5NzM1NDk0ODYzMTIgLT4gMS4wMDAwMDAwMDAwMDA4MDcwMzY4ODY2ODMxMjc1OTAxMTU4MTY0MzIxODY3OTE0MzQyIEluZXhhY3QgUm91bmRlZAorZXhweDE1MTkgZXhwIDY0MC43MjM5NjAxMjc5NjUwOTQ4MjM4MjcxMjg5MTcwOTA3MjU3MDY1MzYwNjgzODI1MSAgLT4gMS44MzE4MDk0OTkwNjgzMzk0MjI5MzA0MTMzMDY4OTgzOTE0MjM2OTk1MzI2ODkxMDQ1RSsyNzggSW5leGFjdCBSb3VuZGVkCitleHB4MTUyMCBleHAgMC4wMDAwMDAwMDAwMDAwMDUwOTQ1ODkyMjE2NzYzMTA3MTQxNjk0ODExMjIxOTUxMjIyNCAtPiAxLjAwMDAwMDAwMDAwMDAwNTA5NDU4OTIyMTY3NjMyMzY5MTU4OTE0OTkzMjQzNTg1NTYgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyMSBleHAgNi43NjcwMzk0MzE0MzE1MjA2Mzc4NjI1MjIxNTgzOTczNDE0NjYwNzI3OTYwMjQxMzk1ICAtPiA4NjguNzM2MTMwMTI4MjIwMzEzNjc4MDYyNDg2OTcwOTI4ODQ0MTUxMTk1NjgyNzEzMTUgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyMiBleHAgMDQuODIzMjE3NDA3NDEyOTYzNTA2NjM4MjY3MjI2ODkxMDI0MTM4MDU0NzgzMTIyNTQ4ICAtPiAxMjQuMzY0NTc5Mjk1ODg4MzcxMjk3MzE4MjEwNzc1ODY3MDU1MDU1NjU5MDQyMDUzNjYgSW5leGFjdCBSb3VuZGVkCitleHB4MTUyMyBleHAgMTkzLjUxMzA3ODc4NzAxMTk2NDAzOTkxMjA4NDgyNTIwMTE1MzU5NjkwMTA2MTQzNjE1ICAtPiAxLjEwMDY4MzA4NzI4NTQ3MTU2NzczOTA5MTQ2NTU0NTIyNjE1NTA3Njg5NTc1NzYwMzRFKzg0IEluZXhhY3QgUm91bmRlZAorZXhweDE1MjQgZXhwIDUuNzMwNzc0OTAzODMwMzY1MDUzOTIwMDM0NTkwMTIxMDQ5NzAxNTYxNzM5Mzk3MDQ2MyAgLT4gMzA4LjIwODAwNzQzMTA2ODQzMDgzNTIyNzIxNTIzNzE1NjQ1OTUwNTc0ODY2NDk1MTk2IEluZXhhY3QgUm91bmRlZAorZXhweDE1MjUgZXhwIDAuMDAwMDAwMDAwMDAwOTUyMTc4MjUxOTk3OTc5NjUyMDA1NDExNjkxMjM3NDM1MDAyNjcgLT4gMS4wMDAwMDAwMDAwMDA5NTIxNzgyNTE5OTg0MzI5NzM3MTcyMDA3OTkxMzkwMzgxMjczIEluZXhhY3QgUm91bmRlZAorZXhweDE1MjYgZXhwIDAuMDAwMjcxMzE0NDA5NDkxODMzNzA5NjYzOTM2ODI2MTc5MzAxNTM0OTUwMjg5MTkxNDAgLT4gMS4wMDAyNzEzNTEyMTg1NzUxMDIyOTA2MDU4MTYwNDgwNjA2NTk4NzU0OTEzNjA3MzY0IEluZXhhY3QgUm91bmRlZAorZXhweDE1MjcgZXhwIDAuMDAwMDAwMDAwNjQ1MDMwNTkxMTQ2ODA2ODIzNDMwMDIzMTU2NjIwNjkyNzI3MDcxMjMgLT4gMS4wMDAwMDAwMDA2NDUwMzA1OTEzNTQ4MzkwNTUyMzIzNTE3NDAzNjEzMTM1NDk2NjMzIEluZXhhY3QgUm91bmRlZAorZXhweDE1MjggZXhwIDAuMDAwMDAwMDAwMDAwMDAwOTU2MTY2NDM1MDY1MjcyODg4NjYyMzUyMzg1NDg0NDA1OTMgLT4gMS4wMDAwMDAwMDAwMDAwMDA5NTYxNjY0MzUwNjUyNzMzNDU3ODk0NzgxNTgyMDA5MDk0IEluZXhhY3QgUm91bmRlZAorZXhweDE1MjkgZXhwIDAuMDAwMDAwMDAwMDAwMDAwODY0NDk5NDI4MTE2Nzg2NTAyNDQ0NTk1NTAyNTI3NDM0MzMgLT4gMS4wMDAwMDAwMDAwMDAwMDA4NjQ0OTk0MjgxMTY3ODY4NzYxMjQyMjYxMDk2NTI5OTg2IEluZXhhY3QgUm91bmRlZAorZXhweDE1MzAgZXhwIDAuMDYyMjM0ODgzNTU2MzUzNTk5NjU2ODMwNTMxNTc3MjkyMDQ5ODgzODE4ODc2MjE4NTAgLT4gMS4wNjQyMTIyODEzMzkyNDA2NjU3Nzg5Njg4OTMxODM4OTE5MzIzODI2MjUwNjMwODMxIEluZXhhY3QgUm91bmRlZAorZXhweDE1MzEgZXhwIDAuMDAwMDA0MDA3MTA4MDc4MDQ0Mjk0MzU1MDI2NTcxMzE5MTIzMDg2ODA2NzQwNTcwNTMgLT4gMS4wMDAwMDQwMDcxMTYxMDY1MTI1OTI1NjIwODkwMDE5MzE5ODMyMTI3ODYzNTU5MjYwIEluZXhhY3QgUm91bmRlZAorZXhweDE1MzIgZXhwIDg1LjUyMjc5Njg5NDc0NDU3NjIxMTU3MzIzMjA1NTQ5NDU1MTQyOTI5Nzg3ODQxMzAxNyAgLT4gMTM4NzAwNzM2ODY0MDQyMjg0NTI3NTc3OTk3NzAyNTEwODUxNzcuODUzMzM3MzY4OTM1IEluZXhhY3QgUm91bmRlZAorZXhweDE1MzMgZXhwIDkuMTQ5NjcyMDgxMTM2MzY3ODY5NjkzODAzNjM3OTc1NjY2MzU0ODM1MzM5OTk1NDM2MyAgLT4gOTQxMS4zNTM3MTIyODMyNzQzMzg2NzgzNTk3NjI5MTYxNzYzMDU3MzcwMDM0NDk1MTU3IEluZXhhY3QgUm91bmRlZAorZXhweDE1MzQgZXhwIDguMjIxNTcwNTI0MDc4ODI5NDQ3Mjk0NDM4MjA1NjMzMDUxNjczODU3Nzc4NTE3Nzk0MiAgLT4gMzcyMC4zNDA2ODEzMzgzMDc2OTUzODk5NjU0NzAxNjE1MDg0NDI1NTk4Mzc3NzU4MTg5IEluZXhhY3QgUm91bmRlZAorZXhweDE1MzUgZXhwIDAuMDAwMDAwMDAwMTU3NzIwNjQ1Njk2NDA2MTMxNDI4MjMyMDM3MjY4MjEwNzYyMzk1NjEgLT4gMS4wMDAwMDAwMDAxNTc3MjA2NDU3MDg4NDQwMzI0NjgzMzE1Nzg4MzU4OTI2MTI5ODMwIEluZXhhY3QgUm91bmRlZAorZXhweDE1MzYgZXhwIDAuNTgxNzkzNDY0NzM5NTk1MzE0MzI2MjQxNTM1NzY4ODM0NDA2MjU1MzgwMTc1MzI0ODAgLT4gMS43ODkyNDQ1MDE4Mjc1MzYwMTYzNzk3MDIyMzcyNjU1ODM3MTg4NDIzMTk0ODYzNjA1IEluZXhhY3QgUm91bmRlZAorZXhweDE1MzcgZXhwIDMzLjU1NTcyNjE5NzE0OTUyNTA2MTQ1NTUxNzc4NDg3MDU3MDQ3MDgzMzQ5ODA5NjU1OSAgLT4gMzc0MTY4MDY5ODk2MzI0LjYyNTc4MDczMTQ4OTkzNTI2NjI2MzA3MDk1ODU0NDA3OTUyIEluZXhhY3QgUm91bmRlZAorZXhweDE1MzggZXhwIDkuNzg5ODA3OTgwMzkwNjIxNTA5NDE0MDAxMDAwOTU4MzM3NTUzNzI1OTgxMDM5ODY1OSAgLT4gMTc4NTAuODc4MTE5OTEyMjA4ODg4MjE3MTAwOTk4MDE5OTg2NjM0NjIwMzY4NTM4NDI2IEluZXhhY3QgUm91bmRlZAorZXhweDE1MzkgZXhwIDg5LjE1NzY5NzMyNzE3NDUyMTU0MjUwMjQ0Nzk1MzAzMjUzNjU0MTAzODYzNjk2NjM0NyAgLT4gNTI1NjQ5MTUyMzIwMTY2NTAzNzcxMjI0MTQ5MzMwNDQ4MDg5NTUwLjY3MjkzODI5MjI3IEluZXhhY3QgUm91bmRlZAorZXhweDE1NDAgZXhwIDI1LjAyMjk0NzYwMDEyMzMyODkxMjAyOTA1MTg5NzE3MTMxOTU3MzMyMjg4ODUxNDg4NSAgLT4gNzM2NzYzNDM0NDIuOTUyNTE3ODI0MzQ1NDMxNDM3NjgzMTUzMzA0NjQ1ODUxOTYwNTI0IEluZXhhY3QgUm91bmRlZAorCistLSBleHAoMSkgYXQgMzQKK1ByZWNpc2lvbjogMzQKK2V4cHgxMjAwIGV4cCAxIC0+IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyIEluZXhhY3QgUm91bmRlZAorCistLSBSYW5kb21zIFA9MzQsIHdpdGhpbiAwLTk5OQorUHJlY2lzaW9uOiAzNAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworZXhweDEyMDEgZXhwIDMwOS41OTQ4ODU1ODIxNTEwMjEyOTk2NzAwNjQ1MDg3MTg4ICAtPiAyLjg1MzMxOTY5MjkwMTM4NzUyMTIwMTczODAxNTA1MDcyNEUrMTM0IEluZXhhY3QgUm91bmRlZAorZXhweDEyMDIgZXhwIDkuOTM2NTQzMDY4NzA2MjExNDIwNDIyODAzOTYyNjgwMTY0ICAtPiAyMDY3Mi4xNTgzOTIwMzE3MTg3NzQ3NjUxMTA5MzI3NjAyMiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjAzIGV4cCA2LjMwNzg3MDMyMzg4MTUwNTY4NDQyOTgzOTQ5MTcwNzkwOCAgLT4gNTQ4Ljg3NDc3NzcwNTQ2MzcyOTYxMzcyNzczOTE3NTQ2NjUgSW5leGFjdCBSb3VuZGVkCitleHB4MTIwNCBleHAgMC4wMDAzNTQzMjgxMzg5NDM4NDIwNTM1MjAxMzA4MjgyNTAzIC0+IDEuMDAwMzU0MzkwOTIwNTczNzQ2MTY0NzMzMzUwODQzMTU1IEluZXhhY3QgUm91bmRlZAorZXhweDEyMDUgZXhwIDAuMDAwMDAzNzA4NzQ1MzM2MzkxODM3NTU5ODM5NDkyMDIyOSAtPiAxLjAwMDAwMzcwODc1MjIxMzc5NjMyNDg0MTkyMDE4OTMyMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjA2IGV4cCAwLjAwMjA0MzIzMTI2ODc1MTI0MzgwNDAyMjI0NDQxMTY1ODUgLT4gMS4wMDIwNDUzMjAwODgxNjQ4MjYwMTM1NjE2MzA5NzUzMDggSW5leGFjdCBSb3VuZGVkCitleHB4MTIwNyBleHAgNi44NTYzMTMzNDAwMzIxNzc2NzI1NTAzNDMyMTYxMjk1ODYgIC0+IDk0OS44NTg3OTgxNjA0MTQ0MTQ3OTgzNTg5NjYwNTI0Mzk2IEluZXhhY3QgUm91bmRlZAorZXhweDEyMDggZXhwIDAuMDAwMDAwMDAwMDQwMjA5NDkyODMzMzgxNTY0MzMyNjQxOCAtPiAxLjAwMDAwMDAwMDA0MDIwOTQ5MjgzNDE4OTk2NTk4OTYxMiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjA5IGV4cCAwLjAwNDk2MTA3ODQ3MjI0MTIxMTc2MzI2NDcwMDM1NDU4MzkgLT4gMS4wMDQ5NzM0MDQ5OTc5MDE5ODcwMzk1ODkwMjkyNzc4MzMgSW5leGFjdCBSb3VuZGVkCitleHB4MTIxMCBleHAgMC4wMDAwODkxNDcxODgzNzI0MDY2OTA5NzQ2Nzg2NzAyNjg2IC0+IDEuMDAwMDg5MTUxMTYyMTAxMDg1NDEyNzgwMDg4MjY2Njk5IEluZXhhY3QgUm91bmRlZAorZXhweDEyMTEgZXhwIDA4LjU5OTc5MTcwMzc2MDYxODkwNjg0NzIzMjExMTEyNTY2ICAtPiA1NDMwLjUyODMxNDkyMDkwNTcxNDYxNTMzOTI3MzczODA5NyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjEyIGV4cCA5LjQ3MzExNzAzOTM0MTAwMzg1NDg3Mjc3ODExMjc1MjU5MCAgLT4gMTMwMDUuMzYyMzQzMzEyMjQ5NTM0NjAwNTU4OTc5MTM5MTcgSW5leGFjdCBSb3VuZGVkCitleHB4MTIxMyBleHAgMC4wOTk5MDYwNzI0NjkyMjA3NjQ4NDI5OTY5OTk5MzEwMTE4IC0+IDEuMTA1MDY3MTE2OTc1MTkwNjAyMjk2MDUyNzAwNzI2ODAyIEluZXhhY3QgUm91bmRlZAorZXhweDEyMTQgZXhwIDAuMDAwMDAwMDkyNzgwNDUzMzU1NTg3Nzg4NDA4MjI2OTI0NyAtPiAxLjAwMDAwMDA5Mjc4MDQ1NzY1OTY5NDE4Mzk1NDc0MDc3MiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjE1IGV4cCAwLjAzNzY1Nzg1ODM4NzI4ODk5MTYyOTg3NzI4MTgyNjU2NzcgLT4gMS4wMzgzNzU5MDA0ODk3NzE5NDY0Nzc4NTc4MTg0NDc1NTYgSW5leGFjdCBSb3VuZGVkCitleHB4MTIxNiBleHAgMjYxLjY4OTY0MTE2OTc1Mzk1MjQ5MTE1MzYxMTY3MTIzMDcgIC0+IDQuNDcwNjEzNTYyMTI3NDY1MDk1MjQxNjAwMTc0OTQxNDYwRSsxMTMgSW5leGFjdCBSb3VuZGVkCitleHB4MTIxNyBleHAgMC4wNzA5OTk3NDIzMjY5MTYyOTgwODc1ODI0MjEzODg5NjI2IC0+IDEuMDczNTgwOTQ5MjM1NDA3OTQ5NDE3ODE0NDg1NTMzMTcyIEluZXhhY3QgUm91bmRlZAorZXhweDEyMTggZXhwIDAuMDAwMDAwMDQ0NDYwNTU4MzI5NTE2OTg5NTIzNTY1ODczMSAtPiAxLjAwMDAwMDA0NDQ2MDU1OTMxNzg4NzYyNzY1NzU5MzkwMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjE5IGV4cCAwLjAwMDAwMjEyMjQwNzI4NTQ3Nzc1MTIyODEzNjk4MTUxODUgLT4gMS4wMDAwMDIxMjI0MDk1Mzc3ODU2ODczOTA2MzEwNzA5MDYgSW5leGFjdCBSb3VuZGVkCitleHB4MTIyMCBleHAgNTQ3LjUxNzQ0NjI1NzQxNTY4ODU0NzM1NTg0ODU0NzUwNTIgIC0+IDYuMDc4NjI5MjQ3MzgzODA3OTQyNjEyMTE0NTc5NzI4NjcyRSsyMzcgSW5leGFjdCBSb3VuZGVkCitleHB4MTIyMSBleHAgMC4wMDAwMDA5MDY3NTk4MDQxNjE1MTkyMDAyMzM5ODQ0NjcwIC0+IDEuMDAwMDAwOTA2NzYwMjE1MjY4MzE0NjgwMTE1Mzc0Mzg3IEluZXhhY3QgUm91bmRlZAorZXhweDEyMjIgZXhwIDAuMDMxNjQ3NjUwMDMwODA2NTM2NTgwMzQ1NTUzMzI0NDYwMyAtPiAxLjAzMjE1Mzc2MTg4MDE4Nzk3NzY1ODM4Nzk2MTc2OTAzNCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjIzIGV4cCA4NC40NjE2MDUzMDM3NzY0NTEwMTgzMzk5NjcwNjM4NDQ3MyAgLT4gNC43OTk2NDQ5OTU4OTc5NjgzODM1MDMyNjk4NzE2OTc4NTZFKzM2IEluZXhhY3QgUm91bmRlZAorZXhweDEyMjQgZXhwIDAuMDAwMDAwMDAwMDUyMDU5OTc0MDI5MDg0ODAxODkwNDE0NSAtPiAxLjAwMDAwMDAwMDA1MjA1OTk3NDAzMDQzOTkyMjMzODM5MyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjI1IGV4cCAwLjAwMDAwMDY3NDg1MzA2NDAwOTM2MjA2NjU2NTE3MjY3MDggLT4gMS4wMDAwMDA2NzQ4NTMyOTE3MjI3NDIyOTIzMzE4MTI5OTcgSW5leGFjdCBSb3VuZGVkCitleHB4MTIyNiBleHAgMC4wMDAwMDAwMTE2ODUzMTE5NzYxMDQyMDIwNTA3OTE2MTY5IC0+IDEuMDAwMDAwMDExNjg1MzEyMDQ0Mzc3NDYwMzA2MTY1MjAzIEluZXhhY3QgUm91bmRlZAorZXhweDEyMjcgZXhwIDAuMDAyMjU5MzgxODA5NDI1ODYzNjcyNzYxNjg4NjY5MzI4MCAtPiAxLjAwMjI2MTkzNjEzNTg3Njg5MzcwNzA5NDg0NTU0MzQ2MSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjI4IGV4cCAwLjAwMjkzOTg4NTc2NzM0Nzg5MTIyNDk4NTY1MDk2Njc1MTcgLT4gMS4wMDI5NDQyMTE0Njk0OTUwODY4MTMwODc2NTEyODcwMTIgSW5leGFjdCBSb3VuZGVkCitleHB4MTIyOSBleHAgMC43NTExNDgwMDI5OTI4ODAyNzc1Mzc2MjcwNTU3NjM2OTYzIC0+IDIuMTE5NDMxNzM0NTEwMzIwMTY5ODA2OTc2NTY5MzY2Nzg5IEluZXhhY3QgUm91bmRlZAorZXhweDEyMzAgZXhwIDE3NC45NDMxOTUyMTc2NzUwNjcxMTUwODg2NDIzMDQ4NDQ3ICAtPiA5LjQ4MTIyMjMwNTM3NDk1NTAxMTQ2NDYxOTQ2ODA0NDA1MUUrNzUgSW5leGFjdCBSb3VuZGVkCitleHB4MTIzMSBleHAgMC4wMDAwODEwNjEyNDUxNjk0MTM2MTI5MTk5ODk1MTY0NDI0IC0+IDEuMDAwMDgxMDY0NTMwNzIwOTI0MTg2NjE1MTQ5NjQ2OTIwIEluZXhhY3QgUm91bmRlZAorZXhweDEyMzIgZXhwIDUxLjA2ODg4OTg5NzAyNjY5Mjg4MTgwOTQ2MjcyNDk5MDM1ICAtPiAxNTA5ODYxMzg4ODYxOTE2NTA3Mzk1OS44OTg5NjAxODc0OSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjMzIGV4cCAwLjAwMDAwMDAwMDU5OTI4ODc1OTk0MzcwOTM2NTE0OTQ1MTAgLT4gMS4wMDAwMDAwMDA1OTkyODg3NjAxMjMyODI4NzQwODI3NTggSW5leGFjdCBSb3VuZGVkCitleHB4MTIzNCBleHAgNzE0Ljg1NDkwNDY3NjEwNTQ4NTYzMTExMDg4Mjg5MDM5NzIgIC0+IDIuODY3NzQ0NTQ0ODkxMDgxMTE3MzgxNTk1MDgwNDgwNzg0RSszMTAgSW5leGFjdCBSb3VuZGVkCitleHB4MTIzNSBleHAgMC4wMDAwMDAwMDA0NDY4MjQ3ODAyOTkwNjQzNjQ1NjA3MTEwIC0+IDEuMDAwMDAwMDAwNDQ2ODI0NzgwMzk4ODkwNTU2NzIwMjMzIEluZXhhY3QgUm91bmRlZAorZXhweDEyMzYgZXhwIDgzMS41ODE4MTUxNTg5ODkwMzY2MzIzNTUxNjcyMDQzNzA5ICAtPiAxLjQxNzA3NzQwOTE4MjYyNDk2OTQzNTkzODA2MjI2MTY1NUUrMzYxIEluZXhhY3QgUm91bmRlZAorZXhweDEyMzcgZXhwIDAuMDAwMDAwMDAwNjg2ODMyMzgyNTE3OTYwNTc0NzEwODA0NCAtPiAxLjAwMDAwMDAwMDY4NjgzMjM4Mjc1MzgyOTkzNTYwMjQ1NCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMjM4IGV4cCAwLjAwMDAwMDEzMDY3NDAyNjY0MDg5NzY4NDAyMjg0NDAyNTUgLT4gMS4wMDAwMDAxMzA2NzQwMzUxNzg3NDg2NzUxODc2NDgwOTggSW5leGFjdCBSb3VuZGVkCitleHB4MTIzOSBleHAgMC4zMTgyMjEwNjA5MDIyMjY3NzA0ODExNTAyNDEyMzM1MTYzIC0+IDEuMzc0NjgwMTE1NjY3Nzk4MTg1NzU4OTI3MjQ3ODk0ODU5IEluZXhhY3QgUm91bmRlZAorZXhweDEyNDAgZXhwIDAuMDE0Nzc0MTIzNDE3OTEwNDQzNzQ0MDI2NDY0NDI5NTUwMSAtPiAxLjAxNDg4MzgwMDIzOTk1MDY4MjYyODI3NzUzNDgzOTIyMiBJbmV4YWN0IFJvdW5kZWQKKworLS0gUmFuZG9tcyBQPTE2LCB3aXRoaW4gMC05OQorUHJlY2lzaW9uOiAxNgorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2V4cHgxMTAxIGV4cCA4LjQ3MzAxMTUyNzAxMzcyNCAgLT4gNDc4My45MDA2NDM5NjkyNDYgSW5leGFjdCBSb3VuZGVkCitleHB4MTEwMiBleHAgMC4wMDAwMDU1NzUzMDIyNzY0IC0+IDEuMDAwMDA1NTc1MzE3ODE4IEluZXhhY3QgUm91bmRlZAorZXhweDExMDMgZXhwIDAuMDAwMDMyMzQ3NDExNDQ4MiAtPiAxLjAwMDAzMjM0NzkzNDYzMSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTA0IGV4cCA2NC41NDM3NDEzODU0NDE2NiAgLT4gMS4wNzM5NjY0NzYxNzM1MzFFKzI4IEluZXhhY3QgUm91bmRlZAorZXhweDExMDUgZXhwIDkwLjQ3MjAzMjQ2NDE2NTY5ICAtPiAxLjk1NjYxMDg4NzI1MDY0M0UrMzkgSW5leGFjdCBSb3VuZGVkCitleHB4MTEwNiBleHAgOS4yOTk5MzE1MzIzNDI3NTcgIC0+IDEwOTM3LjI3MDMzMzI1MjI3IEluZXhhY3QgUm91bmRlZAorZXhweDExMDcgZXhwIDguNzU5Njc4NDM3ODUyMjAzICAtPiA2MzcyLjA2MjIzNDQ5NTM4MSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTA4IGV4cCAwLjAwMDA5MzE3NTUxMjcxNzIgLT4gMS4wMDAwOTMxNzk4NTM2OTAgSW5leGFjdCBSb3VuZGVkCitleHB4MTEwOSBleHAgMC4wMDAwMDI4MTAxMTU4MzczIC0+IDEuMDAwMDAyODEwMTE5Nzg2IEluZXhhY3QgUm91bmRlZAorZXhweDExMTAgZXhwIDAuMDAwMDAwODAwODEzMDkxOSAtPiAxLjAwMDAwMDgwMDgxMzQxMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTExIGV4cCA4LjMzOTc3MTcyMjI5OTA0OSAgLT4gNDE4Ny4xMzM4MDMwODE4NzggSW5leGFjdCBSb3VuZGVkCitleHB4MTExMiBleHAgMC4wMDI2MTQwNDk3OTk1NDc0IC0+IDEuMDAyNjE3NDY5NDA2NzUwIEluZXhhY3QgUm91bmRlZAorZXhweDExMTMgZXhwIDAuNzQ3ODAzMzM1NjI2MTc3MSAtPiAyLjExMjM1NDc4MTk3NTQxOCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTE0IGV4cCA1MS43NzY2Mzc2MTgyNzk2NiAgLT4gMy4wNjQxMzU4MDExMjAzNjVFKzIyIEluZXhhY3QgUm91bmRlZAorZXhweDExMTUgZXhwIDAuMTUyNDk4OTc4MzA2MTAxMiAtPiAxLjE2NDc0MTI3MjA4NDk1NSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTE2IGV4cCAwLjAwNjYyOTg3OTg2NjkyMTkgLT4gMS4wMDY2NTE5MDYxNzA3OTEgSW5leGFjdCBSb3VuZGVkCitleHB4MTExNyBleHAgOS45NTUxNDE4NjU1MzQ5NjAgIC0+IDIxMDYwLjIzMzM0Mjg3MDM4IEluZXhhY3QgUm91bmRlZAorZXhweDExMTggZXhwIDkyLjM0NTAzMDU5MTk4NDgzICAtPiAxLjI3MzMxODk5MzQ4MTIyNkUrNDAgSW5leGFjdCBSb3VuZGVkCitleHB4MTExOSBleHAgMC4wMDAwNzA5Mzg4Njc3MzQ2IC0+IDEuMDAwMDcwOTQxMzgzOTU2IEluZXhhY3QgUm91bmRlZAorZXhweDExMjAgZXhwIDc5LjEyODgzMDM2NDMzMjA0ICAtPiAyLjMxODUzODg5OTM4OTI0M0UrMzQgSW5leGFjdCBSb3VuZGVkCitleHB4MTEyMSBleHAgMC4wMDAwMDkwODgxNTQ4ODczIC0+IDEuMDAwMDA5MDg4MTk2MTg1IEluZXhhY3QgUm91bmRlZAorZXhweDExMjIgZXhwIDAuMDQyNDgyODgwOTYwMzQxMSAtPiAxLjA0MzM5ODE5NDI0NTcyMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTIzIGV4cCAwLjgwMDkwMzU4OTE0Mjc0MTYgLT4gMi4yMjc1NTI4MTE5MzMzMTAgSW5leGFjdCBSb3VuZGVkCitleHB4MTEyNCBleHAgOC44MjU3ODYxNjcyODMxMDIgIC0+IDY4MDcuNTQwNDU1Mjg5OTk1IEluZXhhY3QgUm91bmRlZAorZXhweDExMjUgZXhwIDEuNTM1NDU3MjQ5NzQ2Mjc1ICAtPiA0LjY0MzQ0ODI2MDE0Njg0OSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTI2IGV4cCA2OS4wMjI1NDI1NDM1NTgwMCAgLT4gOS40NjQ3NTQ1MDA2NzA2NTNFKzI5IEluZXhhY3QgUm91bmRlZAorZXhweDExMjcgZXhwIDAuMDAwNzA1MDU1NDM2ODcxMyAtPiAxLjAwMDcwNTMwNDA0Njg4MCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTI4IGV4cCAwLjAwMDAwODEyMDY1NDk1MDQgLT4gMS4wMDAwMDgxMjA2ODc5MjMgSW5leGFjdCBSb3VuZGVkCitleHB4MTEyOSBleHAgMC42MjE3NzQ4NTQ2NDExMzcgIC0+IDEuODYyMjMwMjk4NTU0OTAzIEluZXhhY3QgUm91bmRlZAorZXhweDExMzAgZXhwIDMuODQ3NjI5MDMxNDA0MzU0ICAtPiA0Ni44ODE3NzYxMzU2ODIwMyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTMxIGV4cCAyNC44MTI1MDE4NDY5NzczMiAgLT4gNTk2OTQyNjg0NTYuMTk5NjYgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzMiBleHAgNS4xMDc1NDY1MDA1MTYwNDQgIC0+IDE2NS4yNjQzODA5NzU1NjcwIEluZXhhY3QgUm91bmRlZAorZXhweDExMzMgZXhwIDc5LjE3ODEwOTQzOTUxOTg2ICAtPiAyLjQzNTY1NjM3MjU0MTM2MEUrMzQgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzNCBleHAgMC4wMDUxMzk0Njk1NjY3MDE1IC0+IDEuMDA1MTUyNjk5Mjk1MzAxIEluZXhhY3QgUm91bmRlZAorZXhweDExMzUgZXhwIDU3LjQ0NTA0NDg4NTAxNzI1ICAtPiA4Ljg3MjkwODU2NjkyOTY4OEUrMjQgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzNiBleHAgMC4wMDAwNTA4Mzg4OTY4MDM2IC0+IDEuMDAwMDUwODQwMTg5MTIyIEluZXhhY3QgUm91bmRlZAorZXhweDExMzcgZXhwIDY5LjcxMzA5OTMyMTQ4OTk3ICAtPiAxLjg4ODA1Mzc0MDY5MzU0MUUrMzAgSW5leGFjdCBSb3VuZGVkCitleHB4MTEzOCBleHAgMC4wMDY0MTgzNDEyOTgxNTAyIC0+IDEuMDA2NDM4OTgyOTg4ODM1IEluZXhhY3QgUm91bmRlZAorZXhweDExMzkgZXhwIDkuMzQ2OTkxMjIwODE0Njc3ICAtPiAxMTQ2NC4yNzgwMjAzNTA4MiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMTQwIGV4cCAzMy4wOTA4NzEzOTk5OTE1MiAgLT4gMjM1MDYyMjI5MTY4NzYzLjUgSW5leGFjdCBSb3VuZGVkCisKKy0tIFJhbmRvbXMgUD03LCB3aXRoaW4gMC05CitQcmVjaXNpb246IDcKK21heEV4cG9uZW50OiA5NgorbWluRXhwb25lbnQ6IC05NQorZXhweDEwMDEgZXhwIDIuMzk1NDQxICAtPiAxMC45NzMwNCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDAyIGV4cCAwLjY0MDY3NzkgLT4gMS44OTc3NjcgSW5leGFjdCBSb3VuZGVkCitleHB4MTAwMyBleHAgMC41NjE4MjE4IC0+IDEuNzUzODY1IEluZXhhY3QgUm91bmRlZAorZXhweDEwMDQgZXhwIDMuMDU1MTIwICAtPiAyMS4yMjM3MyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDA1IGV4cCAxLjUzNjc5MiAgLT4gNC42NDk2NTAgSW5leGFjdCBSb3VuZGVkCitleHB4MTAwNiBleHAgMC4wODAxNTkxIC0+IDEuMDgzNDU5IEluZXhhY3QgUm91bmRlZAorZXhweDEwMDcgZXhwIDAuMDk2Njg3NSAtPiAxLjEwMTUxNiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDA4IGV4cCAwLjA2NDY3NjEgLT4gMS4wNjY4MTMgSW5leGFjdCBSb3VuZGVkCitleHB4MTAwOSBleHAgMC4wMDk1NjcwIC0+IDEuMDA5NjEzIEluZXhhY3QgUm91bmRlZAorZXhweDEwMTAgZXhwIDIuOTU2ODU5ICAtPiAxOS4yMzc0NSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDExIGV4cCA3LjUwNDY3OSAgLT4gMTgxNi41MjIgSW5leGFjdCBSb3VuZGVkCitleHB4MTAxMiBleHAgMC4wMDQ1MjU5IC0+IDEuMDA0NTM2IEluZXhhY3QgUm91bmRlZAorZXhweDEwMTMgZXhwIDMuODEwMDcxICAtPiA0NS4xNTM2NCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDE0IGV4cCAxLjUwMjM5MCAgLT4gNC40OTI0MTMgSW5leGFjdCBSb3VuZGVkCitleHB4MTAxNSBleHAgMC4wMzIxNTIzIC0+IDEuMDMyNjc1IEluZXhhY3QgUm91bmRlZAorZXhweDEwMTYgZXhwIDAuMDA1NzIxNCAtPiAxLjAwNTczOCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDE3IGV4cCA5LjgxMTQ0NSAgLT4gMTgyNDEuMzMgSW5leGFjdCBSb3VuZGVkCitleHB4MTAxOCBleHAgMy4yNDUyNDkgIC0+IDI1LjY2ODEwIEluZXhhY3QgUm91bmRlZAorZXhweDEwMTkgZXhwIDAuMzE4OTc0MiAtPiAxLjM3NTcxNiBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDIwIGV4cCAwLjg2MjE2MTAgLT4gMi4zNjgyNzMgSW5leGFjdCBSb3VuZGVkCitleHB4MTAyMSBleHAgMC4wMTIyNTExIC0+IDEuMDEyMzI2IEluZXhhY3QgUm91bmRlZAorZXhweDEwMjIgZXhwIDIuMjAyMDg4ICAtPiA5LjA0Mzg3NyBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDIzIGV4cCA4Ljc3ODIwMyAgLT4gNjQ5MS4yMDIgSW5leGFjdCBSb3VuZGVkCitleHB4MTAyNCBleHAgMC4xODk2Mjc5IC0+IDEuMjA4ODAwIEluZXhhY3QgUm91bmRlZAorZXhweDEwMjUgZXhwIDAuNDUxMDk0NyAtPiAxLjU3MDAzMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDI2IGV4cCAwLjI3NjQxMyAgLT4gMS4zMTgzOTIgSW5leGFjdCBSb3VuZGVkCitleHB4MTAyNyBleHAgNC40OTAwNjcgIC0+IDg5LjEyNzQyIEluZXhhY3QgUm91bmRlZAorZXhweDEwMjggZXhwIDAuMDQzOTc4NiAtPiAxLjA0NDk2MCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDI5IGV4cCAwLjgxNjgyNDUgLT4gMi4yNjMzMDEgSW5leGFjdCBSb3VuZGVkCitleHB4MTAzMCBleHAgMC4wMzkxNjU4IC0+IDEuMDM5OTQzIEluZXhhY3QgUm91bmRlZAorZXhweDEwMzEgZXhwIDkuMjYxODE2ICAtPiAxMDUyOC4yNCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDMyIGV4cCA5LjYxMTE4NiAgLT4gMTQ5MzAuODcgSW5leGFjdCBSb3VuZGVkCitleHB4MTAzMyBleHAgOS4xMTgxMjUgIC0+IDkxMTkuMDg3IEluZXhhY3QgUm91bmRlZAorZXhweDEwMzQgZXhwIDkuNDY5MDgzICAtPiAxMjk1My4wMCBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDM1IGV4cCAwLjA0OTk5ODMgLT4gMS4wNTEyNjkgSW5leGFjdCBSb3VuZGVkCitleHB4MTAzNiBleHAgMC4wMDUwNzQ2IC0+IDEuMDA1MDg3IEluZXhhY3QgUm91bmRlZAorZXhweDEwMzcgZXhwIDAuMDAxNDY5NiAtPiAxLjAwMTQ3MSBJbmV4YWN0IFJvdW5kZWQKK2V4cHgxMDM4IGV4cCA5LjEzODQ5NCAgLT4gOTMwNi43MzkgSW5leGFjdCBSb3VuZGVkCitleHB4MTAzOSBleHAgMC4wMDY1NDM2IC0+IDEuMDA2NTY1IEluZXhhY3QgUm91bmRlZAorZXhweDEwNDAgZXhwIDAuNzI4NDgwMyAtPiAyLjA3MTkzMCBJbmV4YWN0IFJvdW5kZWQKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9leHRyYS5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9leHRyYS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzBkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2V4dHJhLmRlY1Rlc3QKQEAgLTAsMCArMSwyODMwIEBACit2ZXJzaW9uOiA/Lj8/CisKK2V4dGVuZGVkOiAxCityb3VuZGluZzogaGFsZl9ldmVuCisKKy0tIHRlc3RpbmcgZm9sZGRvd24gYW5kIGNsYW1waW5nCittYXhleHBvbmVudDogOQorbWluZXhwb25lbnQ6IC05CitwcmVjaXNpb246IDYKK2NsYW1wOiAxCitleHRyMDAwMCBhcHBseSAxRSsxMSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4dHIwMDAxIGFwcGx5IDFFKzEwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXh0cjAwMDIgYXBwbHkgMUUrOSAtPiAxLjAwMDAwRSs5IENsYW1wZWQKK2V4dHIwMDAzIGFwcGx5IDFFKzggLT4gMS4wMDAwRSs4IENsYW1wZWQKK2V4dHIwMDA0IGFwcGx5IDFFKzcgLT4gMS4wMDBFKzcgQ2xhbXBlZAorZXh0cjAwMDUgYXBwbHkgMUUrNiAtPiAxLjAwRSs2IENsYW1wZWQKK2V4dHIwMDA2IGFwcGx5IDFFKzUgLT4gMS4wRSs1IENsYW1wZWQKK2V4dHIwMDA3IGFwcGx5IDFFKzQgLT4gMUUrNAorZXh0cjAwMDggYXBwbHkgMUUrMyAtPiAxRSszCitleHRyMDAwOSBhcHBseSAxRSsyIC0+IDFFKzIKK2V4dHIwMDEwIGFwcGx5IDFFKzEgLT4gMUUrMQorZXh0cjAwMTEgYXBwbHkgMSAtPiAxCitleHRyMDAxMiBhcHBseSAxRS0xIC0+IDAuMQorZXh0cjAwMTMgYXBwbHkgMUUtMiAtPiAwLjAxCitleHRyMDAxNCBhcHBseSAxRS0zIC0+IDAuMDAxCitleHRyMDAxNSBhcHBseSAxRS00IC0+IDAuMDAwMQorZXh0cjAwMTYgYXBwbHkgMUUtNSAtPiAwLjAwMDAxCitleHRyMDAxNyBhcHBseSAxRS02IC0+IDAuMDAwMDAxCitleHRyMDAxOCBhcHBseSAxRS03IC0+IDFFLTcKK2V4dHIwMDE5IGFwcGx5IDFFLTggLT4gMUUtOAorZXh0cjAwMjAgYXBwbHkgMUUtOSAtPiAxRS05CitleHRyMDAyMSBhcHBseSAxRS0xMCAtPiAxRS0xMCBTdWJub3JtYWwKK2V4dHIwMDIyIGFwcGx5IDFFLTExIC0+IDFFLTExIFN1Ym5vcm1hbAorZXh0cjAwMjMgYXBwbHkgMUUtMTIgLT4gMUUtMTIgU3Vibm9ybWFsCitleHRyMDAyNCBhcHBseSAxRS0xMyAtPiAxRS0xMyBTdWJub3JtYWwKK2V4dHIwMDI1IGFwcGx5IDFFLTE0IC0+IDFFLTE0IFN1Ym5vcm1hbAorZXh0cjAwMjYgYXBwbHkgMUUtMTUgLT4gMEUtMTQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZXh0cjAwMjcgYXBwbHkgMUUtMTYgLT4gMEUtMTQgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorY2xhbXA6IDAKKworLS0gbGFyZ2UgcHJlY2lzaW9uLCBzbWFsbCBtaW5pbXVtIGFuZCBtYXhpbXVtIGV4cG9uZW50OyBpbiB0aGlzIGNhc2UKKy0tIGl0J3MgcG9zc2libGUgdGhhdCBmb2xkZG93biBpcyByZXF1aXJlZCBvbiBhIHN1Ym5vcm1hbCByZXN1bHQKK21heGV4cG9uZW50OiA5CittaW5leHBvbmVudDogLTkKK3ByZWNpc2lvbjogMjQKK2NsYW1wOiAxCitleHRyMDEwMCBhcHBseSAxRSsxMSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2V4dHIwMTAxIGFwcGx5IDFFKzEwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXh0cjAxMDIgYXBwbHkgMUUrOSAtPiAxMDAwMDAwMDAwLjAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTAzIGFwcGx5IDFFKzggLT4gMTAwMDAwMDAwLjAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTA0IGFwcGx5IDFFKzcgLT4gMTAwMDAwMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMDUgYXBwbHkgMUUrNiAtPiAxMDAwMDAwLjAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTA2IGFwcGx5IDFFKzUgLT4gMTAwMDAwLjAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTA3IGFwcGx5IDFFKzQgLT4gMTAwMDAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMDggYXBwbHkgMUUrMyAtPiAxMDAwLjAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTA5IGFwcGx5IDFFKzIgLT4gMTAwLjAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTEwIGFwcGx5IDFFKzEgLT4gMTAuMDAwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMTEgYXBwbHkgMSAtPiAgICAxLjAwMDAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTEyIGFwcGx5IDFFLTEgLT4gMC4xMDAwMDAwMDAwMDAwMCBDbGFtcGVkCitleHRyMDExMyBhcHBseSAxRS0yIC0+IDAuMDEwMDAwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMTQgYXBwbHkgMUUtMyAtPiAwLjAwMTAwMDAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTE1IGFwcGx5IDFFLTQgLT4gMC4wMDAxMDAwMDAwMDAwMCBDbGFtcGVkCitleHRyMDExNiBhcHBseSAxRS01IC0+IDAuMDAwMDEwMDAwMDAwMDAgQ2xhbXBlZAorZXh0cjAxMTcgYXBwbHkgMUUtNiAtPiAwLjAwMDAwMTAwMDAwMDAwIENsYW1wZWQKK2V4dHIwMTE4IGFwcGx5IDFFLTcgLT4gMS4wMDAwMDAwRS03IENsYW1wZWQKK2V4dHIwMTE5IGFwcGx5IDFFLTggLT4gMS4wMDAwMDBFLTggQ2xhbXBlZAorZXh0cjAxMjAgYXBwbHkgMUUtOSAtPiAxLjAwMDAwRS05IENsYW1wZWQKK2V4dHIwMTIxIGFwcGx5IDFFLTEwIC0+IDEuMDAwMEUtMTAgU3Vibm9ybWFsIENsYW1wZWQKK2V4dHIwMTIyIGFwcGx5IDFFLTExIC0+IDEuMDAwRS0xMSBTdWJub3JtYWwgQ2xhbXBlZAorZXh0cjAxMjMgYXBwbHkgMUUtMTIgLT4gMS4wMEUtMTIgU3Vibm9ybWFsIENsYW1wZWQKK2V4dHIwMTI0IGFwcGx5IDFFLTEzIC0+IDEuMEUtMTMgU3Vibm9ybWFsIENsYW1wZWQKK2V4dHIwMTI1IGFwcGx5IDFFLTE0IC0+IDFFLTE0IFN1Ym5vcm1hbAorZXh0cjAxMjYgYXBwbHkgMUUtMTUgLT4gMUUtMTUgU3Vibm9ybWFsCitleHRyMDEyNyBhcHBseSAxRS0xNiAtPiAxRS0xNiBTdWJub3JtYWwKK2V4dHIwMTI4IGFwcGx5IDFFLTE3IC0+IDFFLTE3IFN1Ym5vcm1hbAorZXh0cjAxMjkgYXBwbHkgMUUtMTggLT4gMUUtMTggU3Vibm9ybWFsCitleHRyMDEzMCBhcHBseSAxRS0xOSAtPiAxRS0xOSBTdWJub3JtYWwKK2V4dHIwMTMxIGFwcGx5IDFFLTIwIC0+IDFFLTIwIFN1Ym5vcm1hbAorZXh0cjAxMzIgYXBwbHkgMUUtMjEgLT4gMUUtMjEgU3Vibm9ybWFsCitleHRyMDEzMyBhcHBseSAxRS0yMiAtPiAxRS0yMiBTdWJub3JtYWwKK2V4dHIwMTM0IGFwcGx5IDFFLTIzIC0+IDFFLTIzIFN1Ym5vcm1hbAorZXh0cjAxMzUgYXBwbHkgMUUtMjQgLT4gMUUtMjQgU3Vibm9ybWFsCitleHRyMDEzNiBhcHBseSAxRS0yNSAtPiAxRS0yNSBTdWJub3JtYWwKK2V4dHIwMTM3IGFwcGx5IDFFLTI2IC0+IDFFLTI2IFN1Ym5vcm1hbAorZXh0cjAxMzggYXBwbHkgMUUtMjcgLT4gMUUtMjcgU3Vibm9ybWFsCitleHRyMDEzOSBhcHBseSAxRS0yOCAtPiAxRS0yOCBTdWJub3JtYWwKK2V4dHIwMTQwIGFwcGx5IDFFLTI5IC0+IDFFLTI5IFN1Ym5vcm1hbAorZXh0cjAxNDEgYXBwbHkgMUUtMzAgLT4gMUUtMzAgU3Vibm9ybWFsCitleHRyMDE0MiBhcHBseSAxRS0zMSAtPiAxRS0zMSBTdWJub3JtYWwKK2V4dHIwMTQzIGFwcGx5IDFFLTMyIC0+IDFFLTMyIFN1Ym5vcm1hbAorZXh0cjAxNDQgYXBwbHkgMUUtMzMgLT4gMEUtMzIgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZXh0cjAxNDUgYXBwbHkgMUUtMzQgLT4gMEUtMzIgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorY2xhbXA6IDAKKworLS0gc29tZSBidWdneSBhZGRpdGlvbiBjYXNlcyBmcm9tIFB5dGhvbiAyLjUueAorbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogNgorZXh0cjEwMDAgYWRkIDBFKzEwMDAgMEUrMjAwMCAtPiAwRSs5OTkgQ2xhbXBlZAorZXh0cjEwMDEgYWRkIDBFKzEwMDQgMEUrMTAwMSAtPiAwRSs5OTkgQ2xhbXBlZAorY2xhbXA6IDEKK2V4dHIxMDAyIGFkZCAwRSsxMDAwIDBFKzEwMDAgLT4gMEUrOTk0IENsYW1wZWQKK2NsYW1wOiAwCitleHRyMTAwMyBhZGQgMEUrMTAwMCAwRS0xMDA1IC0+IDBFLTEwMDQgQ2xhbXBlZAorZXh0cjEwMDQgYWRkIDBFLTEwMDYgMCAtPiAwRS0xMDA0IENsYW1wZWQKK2V4dHIxMDA1IGFkZCAxRSsxMDAwIC0xRSsxMDAwIC0+IDBFKzk5OSBDbGFtcGVkCitleHRyMTAwNiBhZGQgLTMuMUUrMTAwNCAzLjFFKzEwMDQgLT4gMEUrOTk5IENsYW1wZWQKK2NsYW1wOiAxCitleHRyMTAwNyBhZGQgMUUrOTk4IC0xRSs5OTggLT4gMEUrOTk0IENsYW1wZWQKK2NsYW1wOiAwCitleHRyMTAwOCBhZGQgMkUtMTAwNSAtMkUtMTAwNSAtPiAwRS0xMDA0IENsYW1wZWQKK2V4dHIxMDA5IGFkZCAtMy4xRS0xMDA1IDMuMUUtMTAwNSAtPiAwRS0xMDA0IENsYW1wZWQKKworcHJlY2lzaW9uOiAzCitleHRyMTAxMCBhZGQgOTk5NDkuOSAwLjIwMDAwMCAtPiAxLjAwRSs1IEluZXhhY3QgUm91bmRlZAorZXh0cjEwMTEgYWRkIDk5OTQ5LjkgMC4xMDAwMDAgLT4gMS4wMEUrNSBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMDEyIGFkZCA5OTg0OS45IDAuMjAwMDAwIC0+IDkuOTlFKzQgSW5leGFjdCBSb3VuZGVkCitleHRyMTAxMyBhZGQgOTk4NDkuOSAwLjEwMDAwMCAtPiA5Ljk4RSs0IEluZXhhY3QgUm91bmRlZAorZXh0cjEwMTQgYWRkIDEuMDE0OSAwLjAwMDExIC0+IDEuMDIgSW5leGFjdCBSb3VuZGVkCitleHRyMTAxNSBhZGQgMS4wMTQ5IDAuMDAwMTAgLT4gMS4wMiBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMDE2IGFkZCAxLjAxNDkgMC4wMDAwOSAtPiAxLjAxIEluZXhhY3QgUm91bmRlZAorZXh0cjEwMTcgYWRkIDEuMDA0OSAwLjAwMDExIC0+IDEuMDEgSW5leGFjdCBSb3VuZGVkCitleHRyMTAxOCBhZGQgMS4wMDQ5IDAuMDAwMTAgLT4gMS4wMCBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxMDE5IGFkZCAxLjAwNDkgMC4wMDAwOSAtPiAxLjAwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2V4dHIxMDIwIGFkZCA5OTk5OS45IDAuMjAwMDAwIC0+IDEuMDBFKzUgSW5leGFjdCBSb3VuZGVkCitleHRyMTAyMSBhZGQgOTk5OTkuOCAwLjIwMDAwMCAtPiAxLjAwRSs1IFJvdW5kZWQKK2V4dHIxMDIyIGFkZCA5OTk5OS43IDAuMjAwMDAwIC0+IDkuOTlFKzQgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCisKKy0tIGEgYnVnIGluIF9yZXNjYWxlIGNhdXNlZCB0aGUgZm9sbG93aW5nIHRvIGZhaWwgaW4gUHl0aG9uIDIuNS4xCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA2CitleHRyMTEwMCBhZGQgMEUrMTAwMCAxRSsxMDAwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZXh0cjExMDEgcmVtYWluZGVyIDFFKzEwMDAgMkUrMTAwMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0gdGVzdHMgZm9yIHNjYWxlYiBpbiBjYXNlIHdoZXJlIGlucHV0IHByZWNpc2lvbiA+IGNvbnRleHQgcHJlY2lzaW9uLgorLS0gUmVzdWx0IHNob3VsZCBiZSByb3VuZGVkLiAgKFRoaXMgaXNuJ3QgdG90YWxseSBjbGVhciBmcm9tIHRoZQorLS0gc3BlY2lmaWNhdGlvbiwgYnV0IHRoZSB0cmVhdG1lbnQgb2YgdW5kZXJmbG93IGluIHRoZSB0ZXN0Y2FzZXMKKy0tIHN1Z2dlc3RzIHRoYXQgcm91bmRpbmcgc2hvdWxkIG9jY3VyIGluIGdlbmVyYWwuICBGdXJ0aGVybW9yZSwgaXQncworLS0gdGhlIHdheSB0aGF0IHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gYmVoYXZlcy4pCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAzCitleHRyMTIwMCBzY2FsZWIgMTIzNCAxIC0+IDEuMjNFKzQgSW5leGFjdCBSb3VuZGVkCitleHRyMTIwMSBzY2FsZWIgNTY3OCAwIC0+IDUuNjhFKzMgSW5leGFjdCBSb3VuZGVkCitleHRyMTIwMiBzY2FsZWIgLTkxMDUgLTEgLT4gLTkxMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gSW52YWxpZCBvcGVyYXRpb24gZnJvbSAwICogaW5maW5pdHkgaW4gZm1hCistLSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgYSB0aGlyZC1hcmd1bWVudCBzTmFOCitleHRyMTMwMCBmbWEgMCBJbmYgc05hTjEyMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2V4dHIxMzAxIGZtYSBJbmYgMCBzTmFONDU2IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZXh0cjEzMDIgZm1hIDBFMTIzIC1JbmYgc05hTjc4OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2V4dHIxMzAyIGZtYSAtSW5mIDBFLTQ1NiBzTmFOMTQ4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBtYXgvbWluL21heF9tYWcvbWluX21hZyBidWcgaW4gMi41LjIvMi42LzMuMDogbWF4KE5hTiwgZmluaXRlKSBnYXZlCistLSBpbmNvcnJlY3QgYW5zd2VycyB3aGVuIHRoZSBmaW5pdGUgbnVtYmVyIHJlcXVpcmVkIHJvdW5kaW5nOyBzaW1pbGFybHkKKy0tIGZvciB0aGUgb3RoZXIgdGhyZSBmdW5jdGlvbnMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDYKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2V4dHIxNDAwIG1heCBOYU4gMTIzNDU2NyAtPiAxLjIzNDU3RSs2IEluZXhhY3QgUm91bmRlZAorZXh0cjE0MDEgbWF4IDMxNDE1OTBFLTEyMyBOYU4xNzI5IC0+IDMuMTQxNTlFLTExNyBSb3VuZGVkCitleHRyMTQwMiBtYXggLTcuNjU0MzIxIC1OYU4gLT4gLTcuNjU0MzIgSW5leGFjdCBSb3VuZGVkCitleHRyMTQxMCBtaW4gLU5hTiAtNzY1NDMyLjEgLT4gLTc2NTQzMiBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNDExIG1pbiAzMTQxNTkyIE5hTiAtPiAzLjE0MTU5RSs2IEluZXhhY3QgUm91bmRlZAorZXh0cjE0MjAgbWF4X21hZyAwLjExMTExMTEgLU5hTjEyMyAtPiAwLjExMTExMSBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNDIxIG1heF9tYWcgTmFOOTk5OTk5OTk5IDAuMDAxMjM0NTY3IC0+IDAuMDAxMjM0NTcgSW5leGFjdCBSb3VuZGVkCitleHRyMTQzMCBtaW5fbWFnIDkxODE3MTYxNTEgLU5hTiAtPiA5LjE4MTcyRSs5IEluZXhhY3QgUm91bmRlZAorZXh0cjE0MzEgbWluX21hZyBOYU40IDEuODE4MTgwRTEwMCAtPiAxLjgxODE4RSsxMDAgUm91bmRlZAorCistLSBJc3N1ZSAjNjc5NDogd2hlbiBjb21wYXJpbmcgTmFOcyB1c2luZyBjb21wYXJlX3RvdGFsLCBwYXlsb2FkcworLS0gc2hvdWxkIGJlIGNvbXBhcmVkIGFzIHRob3VnaCBwb3NpdGl2ZSBpbnRlZ2Vyczsgbm90CistLSBsZXhpY29ncmFwaGljYWxseSBhcyBzdHJpbmdzLgorZXh0cjE1MDAgY29tcGFyZXRvdGFsIE5hTjEyMyBOYU40NSAtPiAxCitleHRyMTUwMSBjb21wYXJldG90YWwgc05hTjEyMyBzTmFONDUgLT4gMQorZXh0cjE1MDIgY29tcGFyZXRvdGFsIC1OYU4xMjMgLU5hTjQ1IC0+IC0xCitleHRyMTUwMyBjb21wYXJldG90YWwgLXNOYU4xMjMgLXNOYU40NSAtPiAtMQorZXh0cjE1MDQgY29tcGFyZXRvdGFsIE5hTjQ1IE5hTjEyMyAtPiAtMQorZXh0cjE1MDUgY29tcGFyZXRvdGFsIHNOYU40NSBzTmFOMTIzIC0+IC0xCitleHRyMTUwNiBjb21wYXJldG90YWwgLU5hTjQ1IC1OYU4xMjMgLT4gMQorZXh0cjE1MDcgY29tcGFyZXRvdGFsIC1zTmFONDUgLXNOYU4xMjMgLT4gMQorCitleHRyMTUxMCBjb21wYXJldG90YWwgLXNOYU42MzQ1MDc0ODg1NDE3MjQxNiAtc05hTjkxMTk5MyAtPiAtMQorZXh0cjE1MTEgY29tcGFyZXRvdG1hZyBOYU4xMjIyMjIyMjIyMjIyIC1OYU45OTk5OTkgLT4gMQorCistLSBJc3N1ZSAjNzIzMzogcm90YXRlIGFuZCBzY2FsZSBzaG91bGQgdHJ1bmNhdGUgYW4gYXJndW1lbnQKKy0tIG9mIGxlbmd0aCBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgcHJlY2lzaW9uLgorcHJlY2lzaW9uOiA0CitleHRyMTYwMCByb3RhdGUgMTIzNDU2NyAtNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2V4dHIxNjAxIHJvdGF0ZSAxMjM0NTY3IC00IC0+IDQ1NjcKK2V4dHIxNjAyIHJvdGF0ZSAxMjM0NTY3IC0zIC0+IDU2NzQKK2V4dHIxNjAzIHJvdGF0ZSAxMjM0NTY3IC0yIC0+IDY3NDUKK2V4dHIxNjA0IHJvdGF0ZSAxMjM0NTY3IC0xIC0+IDc0NTYKK2V4dHIxNjA1IHJvdGF0ZSAxMjM0NTY3IDAgLT4gNDU2NworZXh0cjE2MDYgcm90YXRlIDEyMzQ1NjcgMSAtPiA1Njc0CitleHRyMTYwNyByb3RhdGUgMTIzNDU2NyAyIC0+IDY3NDUKK2V4dHIxNjA4IHJvdGF0ZSAxMjM0NTY3IDMgLT4gNzQ1NgorZXh0cjE2MDkgcm90YXRlIDEyMzQ1NjcgNCAtPiA0NTY3CitleHRyMTYxMCByb3RhdGUgMTIzNDU2NyA1IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitleHRyMTY1MCBzaGlmdCAxMjM0NTY3IC01IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZXh0cjE2NTEgc2hpZnQgMTIzNDU2NyAtNCAtPiAwCitleHRyMTY1MiBzaGlmdCAxMjM0NTY3IC0zIC0+IDQKK2V4dHIxNjUzIHNoaWZ0IDEyMzQ1NjcgLTIgLT4gNDUKK2V4dHIxNjU0IHNoaWZ0IDEyMzQ1NjcgLTEgLT4gNDU2CitleHRyMTY1NSBzaGlmdCAxMjM0NTY3IDAgLT4gNDU2NworZXh0cjE2NTYgc2hpZnQgMTIzNDU2NyAxIC0+IDU2NzAKK2V4dHIxNjU3IHNoaWZ0IDEyMzQ1NjcgMiAtPiA2NzAwCitleHRyMTY1OCBzaGlmdCAxMjM0NTY3IDMgLT4gNzAwMAorZXh0cjE2NTkgc2hpZnQgMTIzNDU2NyA0IC0+IDAKK2V4dHIxNjYwIHNoaWZ0IDEyMzQ1NjcgNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQ2FzZXMgd2hlcmUgdGhlIHBvd2VyIGZ1bmN0aW9uIHdhcyBpbXBvc3NpYmx5IHNsb3cgdG8gZGV0ZXJtaW5lIHRoYXQgdGhlCistLSByZXN1bHQgaXMgaW5leGFjdC4gIFRoYW5rcyBTdGVmYW4gS3JhaCBmb3IgaWRlbnRpZnlpbmcgdGhpcyBwcm9ibGVtLgorcHJlY2lzaW9uOiAxNgorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluRXhwb25lbnQ6IC05OTk5OTk5OTkKK2V4dHIxNzAwIHBvd2VyIDEwIDFlLTk5OTk5OTk5OSAtPiAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNzAxIHBvd2VyIDEwMC4wIC01NTcuNzFlLTc0Mjg4ODg4OCAtPiAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNzAyIHBvd2VyIDEwIDFlLTEwMCAtPiAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQW5vdGhlciBvbmUgKHNlZSBpc3N1ZSAjMTIwODApLiAgVGhhbmtzIGFnYWluIHRvIFN0ZWZhbiBLcmFoLgorZXh0cjE3MDMgcG93ZXIgNCAtMS4yZS05OTk5OTk5OTkgLT4gMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIEEgY291cGxlIG9mIGludGVyZXN0aW5nIGV4YWN0IGNhc2VzIGZvciBwb3dlci4gIE5vdGUgdGhhdCB0aGUgc3BlY2lmaWNhdGlvbgorLS0gcmVxdWlyZXMgdGhlc2UgdG8gYmUgcmVwb3J0ZWQgYXMgSW5leGFjdC4KK2V4dHIxNzEwIHBvd2VyIDFlMzc1IDU2ZS0zIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsyMSBJbmV4YWN0IFJvdW5kZWQKK2V4dHIxNzExIHBvd2VyIDEwMDAwIDAuNzUgLT4gMTAwMC4wMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitleHRyMTcxMiBwb3dlciAxZS0yNCAwLjg3NSAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMjEgSW5leGFjdCBSb3VuZGVkCisKKy0tIFNvbWUgbW9yZSBleGFjdCBjYXNlcywgZXhlcmNpc2luZyBwb3dlciB3aXRoIG5lZ2F0aXZlIHNlY29uZCBhcmd1bWVudC4KK2V4dHIxNzIwIHBvd2VyIDQwMCAtMC41IC0+IDAuMDUwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitleHRyMTcyMSBwb3dlciA0MDk2IC0wLjc1IC0+IDAuMDAxOTUzMTI1MDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZXh0cjE3MjIgcG93ZXIgNjI1ZTQgLTAuMjUgLT4gMC4wMjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gTm9uZXhhY3QgY2FzZXMsIHRvIGV4ZXJjaXNlIHNvbWUgb2YgdGhlIGVhcmx5IGV4aXQgY29uZGl0aW9ucyBmcm9tCistLSBfcG93ZXJfZXhhY3QuCitleHRyMTczMCBwb3dlciAyMDQ4IC0wLjc1IC0+IDAuMDAzMjg0NzUxNjIyMDg0ODIyIEluZXhhY3QgUm91bmRlZAorCisKKy0tIFRlc3RzIGZvciB0aGUgaXNfKiBib29sZWFuIG9wZXJhdGlvbnMKK3ByZWNpc2lvbjogOQorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworYm9vbDAwMDAgaXNjYW5vbmljYWwgMEUtMjAwMCAtPiAxCitib29sMDAwMSBpc2Nhbm9uaWNhbCAtMEUtMjAwMCAtPiAxCitib29sMDAwMiBpc2Nhbm9uaWNhbCAwRS0xMDA4IC0+IDEKK2Jvb2wwMDAzIGlzY2Fub25pY2FsIC0wRS0xMDA4IC0+IDEKK2Jvb2wwMDA0IGlzY2Fub25pY2FsIDBFLTEwMDcgLT4gMQorYm9vbDAwMDUgaXNjYW5vbmljYWwgLTBFLTEwMDcgLT4gMQorYm9vbDAwMDYgaXNjYW5vbmljYWwgMEUtMTAwNiAtPiAxCitib29sMDAwNyBpc2Nhbm9uaWNhbCAtMEUtMTAwNiAtPiAxCitib29sMDAwOCBpc2Nhbm9uaWNhbCAwRS0xMDAwIC0+IDEKK2Jvb2wwMDA5IGlzY2Fub25pY2FsIC0wRS0xMDAwIC0+IDEKK2Jvb2wwMDEwIGlzY2Fub25pY2FsIDBFLTk5OSAtPiAxCitib29sMDAxMSBpc2Nhbm9uaWNhbCAtMEUtOTk5IC0+IDEKK2Jvb2wwMDEyIGlzY2Fub25pY2FsIDBFLTk5OCAtPiAxCitib29sMDAxMyBpc2Nhbm9uaWNhbCAtMEUtOTk4IC0+IDEKK2Jvb2wwMDE0IGlzY2Fub25pY2FsIDBFLTEwMCAtPiAxCitib29sMDAxNSBpc2Nhbm9uaWNhbCAtMEUtMTAwIC0+IDEKK2Jvb2wwMDE2IGlzY2Fub25pY2FsIDAuMDAwMDAwIC0+IDEKK2Jvb2wwMDE3IGlzY2Fub25pY2FsIC0wLjAwMDAwMCAtPiAxCitib29sMDAxOCBpc2Nhbm9uaWNhbCAwLjAwMCAtPiAxCitib29sMDAxOSBpc2Nhbm9uaWNhbCAtMC4wMDAgLT4gMQorYm9vbDAwMjAgaXNjYW5vbmljYWwgMC4wMCAtPiAxCitib29sMDAyMSBpc2Nhbm9uaWNhbCAtMC4wMCAtPiAxCitib29sMDAyMiBpc2Nhbm9uaWNhbCAwLjAgLT4gMQorYm9vbDAwMjMgaXNjYW5vbmljYWwgLTAuMCAtPiAxCitib29sMDAyNCBpc2Nhbm9uaWNhbCAwIC0+IDEKK2Jvb2wwMDI1IGlzY2Fub25pY2FsIC0wIC0+IDEKK2Jvb2wwMDI2IGlzY2Fub25pY2FsIDBFKzEgLT4gMQorYm9vbDAwMjcgaXNjYW5vbmljYWwgLTBFKzEgLT4gMQorYm9vbDAwMjggaXNjYW5vbmljYWwgMEUrMiAtPiAxCitib29sMDAyOSBpc2Nhbm9uaWNhbCAtMEUrMiAtPiAxCitib29sMDAzMCBpc2Nhbm9uaWNhbCAwRSszIC0+IDEKK2Jvb2wwMDMxIGlzY2Fub25pY2FsIC0wRSszIC0+IDEKK2Jvb2wwMDMyIGlzY2Fub25pY2FsIDBFKzYgLT4gMQorYm9vbDAwMzMgaXNjYW5vbmljYWwgLTBFKzYgLT4gMQorYm9vbDAwMzQgaXNjYW5vbmljYWwgMEUrMTAwIC0+IDEKK2Jvb2wwMDM1IGlzY2Fub25pY2FsIC0wRSsxMDAgLT4gMQorYm9vbDAwMzYgaXNjYW5vbmljYWwgMEUrOTkwIC0+IDEKK2Jvb2wwMDM3IGlzY2Fub25pY2FsIC0wRSs5OTAgLT4gMQorYm9vbDAwMzggaXNjYW5vbmljYWwgMEUrOTkxIC0+IDEKK2Jvb2wwMDM5IGlzY2Fub25pY2FsIC0wRSs5OTEgLT4gMQorYm9vbDAwNDAgaXNjYW5vbmljYWwgMEUrOTkyIC0+IDEKK2Jvb2wwMDQxIGlzY2Fub25pY2FsIC0wRSs5OTIgLT4gMQorYm9vbDAwNDIgaXNjYW5vbmljYWwgMEUrOTk4IC0+IDEKK2Jvb2wwMDQzIGlzY2Fub25pY2FsIC0wRSs5OTggLT4gMQorYm9vbDAwNDQgaXNjYW5vbmljYWwgMEUrOTk5IC0+IDEKK2Jvb2wwMDQ1IGlzY2Fub25pY2FsIC0wRSs5OTkgLT4gMQorYm9vbDAwNDYgaXNjYW5vbmljYWwgMEUrMTAwMCAtPiAxCitib29sMDA0NyBpc2Nhbm9uaWNhbCAtMEUrMTAwMCAtPiAxCitib29sMDA0OCBpc2Nhbm9uaWNhbCAwRSsyMDAwIC0+IDEKK2Jvb2wwMDQ5IGlzY2Fub25pY2FsIC0wRSsyMDAwIC0+IDEKK2Jvb2wwMDUwIGlzY2Fub25pY2FsIDFFLTIwMDAgLT4gMQorYm9vbDAwNTEgaXNjYW5vbmljYWwgLTFFLTIwMDAgLT4gMQorYm9vbDAwNTIgaXNjYW5vbmljYWwgMUUtMTAwOCAtPiAxCitib29sMDA1MyBpc2Nhbm9uaWNhbCAtMUUtMTAwOCAtPiAxCitib29sMDA1NCBpc2Nhbm9uaWNhbCAxRS0xMDA3IC0+IDEKK2Jvb2wwMDU1IGlzY2Fub25pY2FsIC0xRS0xMDA3IC0+IDEKK2Jvb2wwMDU2IGlzY2Fub25pY2FsIDFFLTEwMDYgLT4gMQorYm9vbDAwNTcgaXNjYW5vbmljYWwgLTFFLTEwMDYgLT4gMQorYm9vbDAwNTggaXNjYW5vbmljYWwgMUUtMTAwMCAtPiAxCitib29sMDA1OSBpc2Nhbm9uaWNhbCAtMUUtMTAwMCAtPiAxCitib29sMDA2MCBpc2Nhbm9uaWNhbCAxRS05OTkgLT4gMQorYm9vbDAwNjEgaXNjYW5vbmljYWwgLTFFLTk5OSAtPiAxCitib29sMDA2MiBpc2Nhbm9uaWNhbCAxRS05OTggLT4gMQorYm9vbDAwNjMgaXNjYW5vbmljYWwgLTFFLTk5OCAtPiAxCitib29sMDA2NCBpc2Nhbm9uaWNhbCAxRS0xMDAgLT4gMQorYm9vbDAwNjUgaXNjYW5vbmljYWwgLTFFLTEwMCAtPiAxCitib29sMDA2NiBpc2Nhbm9uaWNhbCAwLjAwMDAwMSAtPiAxCitib29sMDA2NyBpc2Nhbm9uaWNhbCAtMC4wMDAwMDEgLT4gMQorYm9vbDAwNjggaXNjYW5vbmljYWwgMC4wMDEgLT4gMQorYm9vbDAwNjkgaXNjYW5vbmljYWwgLTAuMDAxIC0+IDEKK2Jvb2wwMDcwIGlzY2Fub25pY2FsIDAuMDEgLT4gMQorYm9vbDAwNzEgaXNjYW5vbmljYWwgLTAuMDEgLT4gMQorYm9vbDAwNzIgaXNjYW5vbmljYWwgMC4xIC0+IDEKK2Jvb2wwMDczIGlzY2Fub25pY2FsIC0wLjEgLT4gMQorYm9vbDAwNzQgaXNjYW5vbmljYWwgMSAtPiAxCitib29sMDA3NSBpc2Nhbm9uaWNhbCAtMSAtPiAxCitib29sMDA3NiBpc2Nhbm9uaWNhbCAxRSsxIC0+IDEKK2Jvb2wwMDc3IGlzY2Fub25pY2FsIC0xRSsxIC0+IDEKK2Jvb2wwMDc4IGlzY2Fub25pY2FsIDFFKzIgLT4gMQorYm9vbDAwNzkgaXNjYW5vbmljYWwgLTFFKzIgLT4gMQorYm9vbDAwODAgaXNjYW5vbmljYWwgMUUrMyAtPiAxCitib29sMDA4MSBpc2Nhbm9uaWNhbCAtMUUrMyAtPiAxCitib29sMDA4MiBpc2Nhbm9uaWNhbCAxRSs2IC0+IDEKK2Jvb2wwMDgzIGlzY2Fub25pY2FsIC0xRSs2IC0+IDEKK2Jvb2wwMDg0IGlzY2Fub25pY2FsIDFFKzEwMCAtPiAxCitib29sMDA4NSBpc2Nhbm9uaWNhbCAtMUUrMTAwIC0+IDEKK2Jvb2wwMDg2IGlzY2Fub25pY2FsIDFFKzk5MCAtPiAxCitib29sMDA4NyBpc2Nhbm9uaWNhbCAtMUUrOTkwIC0+IDEKK2Jvb2wwMDg4IGlzY2Fub25pY2FsIDFFKzk5MSAtPiAxCitib29sMDA4OSBpc2Nhbm9uaWNhbCAtMUUrOTkxIC0+IDEKK2Jvb2wwMDkwIGlzY2Fub25pY2FsIDFFKzk5MiAtPiAxCitib29sMDA5MSBpc2Nhbm9uaWNhbCAtMUUrOTkyIC0+IDEKK2Jvb2wwMDkyIGlzY2Fub25pY2FsIDFFKzk5OCAtPiAxCitib29sMDA5MyBpc2Nhbm9uaWNhbCAtMUUrOTk4IC0+IDEKK2Jvb2wwMDk0IGlzY2Fub25pY2FsIDFFKzk5OSAtPiAxCitib29sMDA5NSBpc2Nhbm9uaWNhbCAtMUUrOTk5IC0+IDEKK2Jvb2wwMDk2IGlzY2Fub25pY2FsIDFFKzEwMDAgLT4gMQorYm9vbDAwOTcgaXNjYW5vbmljYWwgLTFFKzEwMDAgLT4gMQorYm9vbDAwOTggaXNjYW5vbmljYWwgMUUrMjAwMCAtPiAxCitib29sMDA5OSBpc2Nhbm9uaWNhbCAtMUUrMjAwMCAtPiAxCitib29sMDEwMCBpc2Nhbm9uaWNhbCA5RS0yMDAwIC0+IDEKK2Jvb2wwMTAxIGlzY2Fub25pY2FsIC05RS0yMDAwIC0+IDEKK2Jvb2wwMTAyIGlzY2Fub25pY2FsIDlFLTEwMDggLT4gMQorYm9vbDAxMDMgaXNjYW5vbmljYWwgLTlFLTEwMDggLT4gMQorYm9vbDAxMDQgaXNjYW5vbmljYWwgOUUtMTAwNyAtPiAxCitib29sMDEwNSBpc2Nhbm9uaWNhbCAtOUUtMTAwNyAtPiAxCitib29sMDEwNiBpc2Nhbm9uaWNhbCA5RS0xMDA2IC0+IDEKK2Jvb2wwMTA3IGlzY2Fub25pY2FsIC05RS0xMDA2IC0+IDEKK2Jvb2wwMTA4IGlzY2Fub25pY2FsIDlFLTEwMDAgLT4gMQorYm9vbDAxMDkgaXNjYW5vbmljYWwgLTlFLTEwMDAgLT4gMQorYm9vbDAxMTAgaXNjYW5vbmljYWwgOUUtOTk5IC0+IDEKK2Jvb2wwMTExIGlzY2Fub25pY2FsIC05RS05OTkgLT4gMQorYm9vbDAxMTIgaXNjYW5vbmljYWwgOUUtOTk4IC0+IDEKK2Jvb2wwMTEzIGlzY2Fub25pY2FsIC05RS05OTggLT4gMQorYm9vbDAxMTQgaXNjYW5vbmljYWwgOUUtMTAwIC0+IDEKK2Jvb2wwMTE1IGlzY2Fub25pY2FsIC05RS0xMDAgLT4gMQorYm9vbDAxMTYgaXNjYW5vbmljYWwgMC4wMDAwMDkgLT4gMQorYm9vbDAxMTcgaXNjYW5vbmljYWwgLTAuMDAwMDA5IC0+IDEKK2Jvb2wwMTE4IGlzY2Fub25pY2FsIDAuMDA5IC0+IDEKK2Jvb2wwMTE5IGlzY2Fub25pY2FsIC0wLjAwOSAtPiAxCitib29sMDEyMCBpc2Nhbm9uaWNhbCAwLjA5IC0+IDEKK2Jvb2wwMTIxIGlzY2Fub25pY2FsIC0wLjA5IC0+IDEKK2Jvb2wwMTIyIGlzY2Fub25pY2FsIDAuOSAtPiAxCitib29sMDEyMyBpc2Nhbm9uaWNhbCAtMC45IC0+IDEKK2Jvb2wwMTI0IGlzY2Fub25pY2FsIDkgLT4gMQorYm9vbDAxMjUgaXNjYW5vbmljYWwgLTkgLT4gMQorYm9vbDAxMjYgaXNjYW5vbmljYWwgOUUrMSAtPiAxCitib29sMDEyNyBpc2Nhbm9uaWNhbCAtOUUrMSAtPiAxCitib29sMDEyOCBpc2Nhbm9uaWNhbCA5RSsyIC0+IDEKK2Jvb2wwMTI5IGlzY2Fub25pY2FsIC05RSsyIC0+IDEKK2Jvb2wwMTMwIGlzY2Fub25pY2FsIDlFKzMgLT4gMQorYm9vbDAxMzEgaXNjYW5vbmljYWwgLTlFKzMgLT4gMQorYm9vbDAxMzIgaXNjYW5vbmljYWwgOUUrNiAtPiAxCitib29sMDEzMyBpc2Nhbm9uaWNhbCAtOUUrNiAtPiAxCitib29sMDEzNCBpc2Nhbm9uaWNhbCA5RSsxMDAgLT4gMQorYm9vbDAxMzUgaXNjYW5vbmljYWwgLTlFKzEwMCAtPiAxCitib29sMDEzNiBpc2Nhbm9uaWNhbCA5RSs5OTAgLT4gMQorYm9vbDAxMzcgaXNjYW5vbmljYWwgLTlFKzk5MCAtPiAxCitib29sMDEzOCBpc2Nhbm9uaWNhbCA5RSs5OTEgLT4gMQorYm9vbDAxMzkgaXNjYW5vbmljYWwgLTlFKzk5MSAtPiAxCitib29sMDE0MCBpc2Nhbm9uaWNhbCA5RSs5OTIgLT4gMQorYm9vbDAxNDEgaXNjYW5vbmljYWwgLTlFKzk5MiAtPiAxCitib29sMDE0MiBpc2Nhbm9uaWNhbCA5RSs5OTggLT4gMQorYm9vbDAxNDMgaXNjYW5vbmljYWwgLTlFKzk5OCAtPiAxCitib29sMDE0NCBpc2Nhbm9uaWNhbCA5RSs5OTkgLT4gMQorYm9vbDAxNDUgaXNjYW5vbmljYWwgLTlFKzk5OSAtPiAxCitib29sMDE0NiBpc2Nhbm9uaWNhbCA5RSsxMDAwIC0+IDEKK2Jvb2wwMTQ3IGlzY2Fub25pY2FsIC05RSsxMDAwIC0+IDEKK2Jvb2wwMTQ4IGlzY2Fub25pY2FsIDlFKzIwMDAgLT4gMQorYm9vbDAxNDkgaXNjYW5vbmljYWwgLTlFKzIwMDAgLT4gMQorYm9vbDAxNTAgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUtMjAwMCAtPiAxCitib29sMDE1MSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUtMjAwMCAtPiAxCitib29sMDE1MiBpc2Nhbm9uaWNhbCA5Ljk5OTk5OTk5RS0xMDA4IC0+IDEKK2Jvb2wwMTUzIGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDEKK2Jvb2wwMTU0IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFLTEwMDcgLT4gMQorYm9vbDAxNTUgaXNjYW5vbmljYWwgLTkuOTk5OTk5OTlFLTEwMDcgLT4gMQorYm9vbDAxNTYgaXNjYW5vbmljYWwgOS45OTk5OTk5OUUtMTAwNiAtPiAxCitib29sMDE1NyBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUtMTAwNiAtPiAxCitib29sMDE1OCBpc2Nhbm9uaWNhbCA5Ljk5OTk5OTk5RS0xMDAwIC0+IDEKK2Jvb2wwMTU5IGlzY2Fub25pY2FsIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDEKK2Jvb2wwMTYwIGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFLTk5OSAtPiAxCitib29sMDE2MSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUtOTk5IC0+IDEKK2Jvb2wwMTYyIGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFLTk5OCAtPiAxCitib29sMDE2MyBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUtOTk4IC0+IDEKK2Jvb2wwMTY0IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFLTEwMCAtPiAxCitib29sMDE2NSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUtMTAwIC0+IDEKK2Jvb2wwMTY2IGlzY2Fub25pY2FsIDAuMDAwMDA5OTk5OTk5OTkgLT4gMQorYm9vbDAxNjcgaXNjYW5vbmljYWwgLTAuMDAwMDA5OTk5OTk5OTkgLT4gMQorYm9vbDAxNjggaXNjYW5vbmljYWwgMC4wMDk5OTk5OTk5OSAtPiAxCitib29sMDE2OSBpc2Nhbm9uaWNhbCAtMC4wMDk5OTk5OTk5OSAtPiAxCitib29sMDE3MCBpc2Nhbm9uaWNhbCAwLjA5OTk5OTk5OTkgLT4gMQorYm9vbDAxNzEgaXNjYW5vbmljYWwgLTAuMDk5OTk5OTk5OSAtPiAxCitib29sMDE3MiBpc2Nhbm9uaWNhbCAwLjk5OTk5OTk5OSAtPiAxCitib29sMDE3MyBpc2Nhbm9uaWNhbCAtMC45OTk5OTk5OTkgLT4gMQorYm9vbDAxNzQgaXNjYW5vbmljYWwgOS45OTk5OTk5OSAtPiAxCitib29sMDE3NSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OSAtPiAxCitib29sMDE3NiBpc2Nhbm9uaWNhbCA5OS45OTk5OTk5IC0+IDEKK2Jvb2wwMTc3IGlzY2Fub25pY2FsIC05OS45OTk5OTk5IC0+IDEKK2Jvb2wwMTc4IGlzY2Fub25pY2FsIDk5OS45OTk5OTkgLT4gMQorYm9vbDAxNzkgaXNjYW5vbmljYWwgLTk5OS45OTk5OTkgLT4gMQorYm9vbDAxODAgaXNjYW5vbmljYWwgOTk5OS45OTk5OSAtPiAxCitib29sMDE4MSBpc2Nhbm9uaWNhbCAtOTk5OS45OTk5OSAtPiAxCitib29sMDE4MiBpc2Nhbm9uaWNhbCA5OTk5OTk5Ljk5IC0+IDEKK2Jvb2wwMTgzIGlzY2Fub25pY2FsIC05OTk5OTk5Ljk5IC0+IDEKK2Jvb2wwMTg0IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFKzEwMCAtPiAxCitib29sMDE4NSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrMTAwIC0+IDEKK2Jvb2wwMTg2IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFKzk5MCAtPiAxCitib29sMDE4NyBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrOTkwIC0+IDEKK2Jvb2wwMTg4IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFKzk5MSAtPiAxCitib29sMDE4OSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrOTkxIC0+IDEKK2Jvb2wwMTkwIGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFKzk5MiAtPiAxCitib29sMDE5MSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrOTkyIC0+IDEKK2Jvb2wwMTkyIGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFKzk5OCAtPiAxCitib29sMDE5MyBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrOTk4IC0+IDEKK2Jvb2wwMTk0IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFKzk5OSAtPiAxCitib29sMDE5NSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrOTk5IC0+IDEKK2Jvb2wwMTk2IGlzY2Fub25pY2FsIDkuOTk5OTk5OTlFKzEwMDAgLT4gMQorYm9vbDAxOTcgaXNjYW5vbmljYWwgLTkuOTk5OTk5OTlFKzEwMDAgLT4gMQorYm9vbDAxOTggaXNjYW5vbmljYWwgOS45OTk5OTk5OUUrMjAwMCAtPiAxCitib29sMDE5OSBpc2Nhbm9uaWNhbCAtOS45OTk5OTk5OUUrMjAwMCAtPiAxCitib29sMDIwMCBpc2Nhbm9uaWNhbCBJbmZpbml0eSAtPiAxCitib29sMDIwMSBpc2Nhbm9uaWNhbCAtSW5maW5pdHkgLT4gMQorYm9vbDAyMDIgaXNjYW5vbmljYWwgTmFOIC0+IDEKK2Jvb2wwMjAzIGlzY2Fub25pY2FsIC1OYU4gLT4gMQorYm9vbDAyMDQgaXNjYW5vbmljYWwgTmFOMTIzIC0+IDEKK2Jvb2wwMjA1IGlzY2Fub25pY2FsIC1OYU4xMjMgLT4gMQorYm9vbDAyMDYgaXNjYW5vbmljYWwgc05hTiAtPiAxCitib29sMDIwNyBpc2Nhbm9uaWNhbCAtc05hTiAtPiAxCitib29sMDIwOCBpc2Nhbm9uaWNhbCBzTmFOMTIzIC0+IDEKK2Jvb2wwMjA5IGlzY2Fub25pY2FsIC1zTmFOMTIzIC0+IDEKK2Jvb2wwMjEwIGlzZmluaXRlIDBFLTIwMDAgLT4gMQorYm9vbDAyMTEgaXNmaW5pdGUgLTBFLTIwMDAgLT4gMQorYm9vbDAyMTIgaXNmaW5pdGUgMEUtMTAwOCAtPiAxCitib29sMDIxMyBpc2Zpbml0ZSAtMEUtMTAwOCAtPiAxCitib29sMDIxNCBpc2Zpbml0ZSAwRS0xMDA3IC0+IDEKK2Jvb2wwMjE1IGlzZmluaXRlIC0wRS0xMDA3IC0+IDEKK2Jvb2wwMjE2IGlzZmluaXRlIDBFLTEwMDYgLT4gMQorYm9vbDAyMTcgaXNmaW5pdGUgLTBFLTEwMDYgLT4gMQorYm9vbDAyMTggaXNmaW5pdGUgMEUtMTAwMCAtPiAxCitib29sMDIxOSBpc2Zpbml0ZSAtMEUtMTAwMCAtPiAxCitib29sMDIyMCBpc2Zpbml0ZSAwRS05OTkgLT4gMQorYm9vbDAyMjEgaXNmaW5pdGUgLTBFLTk5OSAtPiAxCitib29sMDIyMiBpc2Zpbml0ZSAwRS05OTggLT4gMQorYm9vbDAyMjMgaXNmaW5pdGUgLTBFLTk5OCAtPiAxCitib29sMDIyNCBpc2Zpbml0ZSAwRS0xMDAgLT4gMQorYm9vbDAyMjUgaXNmaW5pdGUgLTBFLTEwMCAtPiAxCitib29sMDIyNiBpc2Zpbml0ZSAwLjAwMDAwMCAtPiAxCitib29sMDIyNyBpc2Zpbml0ZSAtMC4wMDAwMDAgLT4gMQorYm9vbDAyMjggaXNmaW5pdGUgMC4wMDAgLT4gMQorYm9vbDAyMjkgaXNmaW5pdGUgLTAuMDAwIC0+IDEKK2Jvb2wwMjMwIGlzZmluaXRlIDAuMDAgLT4gMQorYm9vbDAyMzEgaXNmaW5pdGUgLTAuMDAgLT4gMQorYm9vbDAyMzIgaXNmaW5pdGUgMC4wIC0+IDEKK2Jvb2wwMjMzIGlzZmluaXRlIC0wLjAgLT4gMQorYm9vbDAyMzQgaXNmaW5pdGUgMCAtPiAxCitib29sMDIzNSBpc2Zpbml0ZSAtMCAtPiAxCitib29sMDIzNiBpc2Zpbml0ZSAwRSsxIC0+IDEKK2Jvb2wwMjM3IGlzZmluaXRlIC0wRSsxIC0+IDEKK2Jvb2wwMjM4IGlzZmluaXRlIDBFKzIgLT4gMQorYm9vbDAyMzkgaXNmaW5pdGUgLTBFKzIgLT4gMQorYm9vbDAyNDAgaXNmaW5pdGUgMEUrMyAtPiAxCitib29sMDI0MSBpc2Zpbml0ZSAtMEUrMyAtPiAxCitib29sMDI0MiBpc2Zpbml0ZSAwRSs2IC0+IDEKK2Jvb2wwMjQzIGlzZmluaXRlIC0wRSs2IC0+IDEKK2Jvb2wwMjQ0IGlzZmluaXRlIDBFKzEwMCAtPiAxCitib29sMDI0NSBpc2Zpbml0ZSAtMEUrMTAwIC0+IDEKK2Jvb2wwMjQ2IGlzZmluaXRlIDBFKzk5MCAtPiAxCitib29sMDI0NyBpc2Zpbml0ZSAtMEUrOTkwIC0+IDEKK2Jvb2wwMjQ4IGlzZmluaXRlIDBFKzk5MSAtPiAxCitib29sMDI0OSBpc2Zpbml0ZSAtMEUrOTkxIC0+IDEKK2Jvb2wwMjUwIGlzZmluaXRlIDBFKzk5MiAtPiAxCitib29sMDI1MSBpc2Zpbml0ZSAtMEUrOTkyIC0+IDEKK2Jvb2wwMjUyIGlzZmluaXRlIDBFKzk5OCAtPiAxCitib29sMDI1MyBpc2Zpbml0ZSAtMEUrOTk4IC0+IDEKK2Jvb2wwMjU0IGlzZmluaXRlIDBFKzk5OSAtPiAxCitib29sMDI1NSBpc2Zpbml0ZSAtMEUrOTk5IC0+IDEKK2Jvb2wwMjU2IGlzZmluaXRlIDBFKzEwMDAgLT4gMQorYm9vbDAyNTcgaXNmaW5pdGUgLTBFKzEwMDAgLT4gMQorYm9vbDAyNTggaXNmaW5pdGUgMEUrMjAwMCAtPiAxCitib29sMDI1OSBpc2Zpbml0ZSAtMEUrMjAwMCAtPiAxCitib29sMDI2MCBpc2Zpbml0ZSAxRS0yMDAwIC0+IDEKK2Jvb2wwMjYxIGlzZmluaXRlIC0xRS0yMDAwIC0+IDEKK2Jvb2wwMjYyIGlzZmluaXRlIDFFLTEwMDggLT4gMQorYm9vbDAyNjMgaXNmaW5pdGUgLTFFLTEwMDggLT4gMQorYm9vbDAyNjQgaXNmaW5pdGUgMUUtMTAwNyAtPiAxCitib29sMDI2NSBpc2Zpbml0ZSAtMUUtMTAwNyAtPiAxCitib29sMDI2NiBpc2Zpbml0ZSAxRS0xMDA2IC0+IDEKK2Jvb2wwMjY3IGlzZmluaXRlIC0xRS0xMDA2IC0+IDEKK2Jvb2wwMjY4IGlzZmluaXRlIDFFLTEwMDAgLT4gMQorYm9vbDAyNjkgaXNmaW5pdGUgLTFFLTEwMDAgLT4gMQorYm9vbDAyNzAgaXNmaW5pdGUgMUUtOTk5IC0+IDEKK2Jvb2wwMjcxIGlzZmluaXRlIC0xRS05OTkgLT4gMQorYm9vbDAyNzIgaXNmaW5pdGUgMUUtOTk4IC0+IDEKK2Jvb2wwMjczIGlzZmluaXRlIC0xRS05OTggLT4gMQorYm9vbDAyNzQgaXNmaW5pdGUgMUUtMTAwIC0+IDEKK2Jvb2wwMjc1IGlzZmluaXRlIC0xRS0xMDAgLT4gMQorYm9vbDAyNzYgaXNmaW5pdGUgMC4wMDAwMDEgLT4gMQorYm9vbDAyNzcgaXNmaW5pdGUgLTAuMDAwMDAxIC0+IDEKK2Jvb2wwMjc4IGlzZmluaXRlIDAuMDAxIC0+IDEKK2Jvb2wwMjc5IGlzZmluaXRlIC0wLjAwMSAtPiAxCitib29sMDI4MCBpc2Zpbml0ZSAwLjAxIC0+IDEKK2Jvb2wwMjgxIGlzZmluaXRlIC0wLjAxIC0+IDEKK2Jvb2wwMjgyIGlzZmluaXRlIDAuMSAtPiAxCitib29sMDI4MyBpc2Zpbml0ZSAtMC4xIC0+IDEKK2Jvb2wwMjg0IGlzZmluaXRlIDEgLT4gMQorYm9vbDAyODUgaXNmaW5pdGUgLTEgLT4gMQorYm9vbDAyODYgaXNmaW5pdGUgMUUrMSAtPiAxCitib29sMDI4NyBpc2Zpbml0ZSAtMUUrMSAtPiAxCitib29sMDI4OCBpc2Zpbml0ZSAxRSsyIC0+IDEKK2Jvb2wwMjg5IGlzZmluaXRlIC0xRSsyIC0+IDEKK2Jvb2wwMjkwIGlzZmluaXRlIDFFKzMgLT4gMQorYm9vbDAyOTEgaXNmaW5pdGUgLTFFKzMgLT4gMQorYm9vbDAyOTIgaXNmaW5pdGUgMUUrNiAtPiAxCitib29sMDI5MyBpc2Zpbml0ZSAtMUUrNiAtPiAxCitib29sMDI5NCBpc2Zpbml0ZSAxRSsxMDAgLT4gMQorYm9vbDAyOTUgaXNmaW5pdGUgLTFFKzEwMCAtPiAxCitib29sMDI5NiBpc2Zpbml0ZSAxRSs5OTAgLT4gMQorYm9vbDAyOTcgaXNmaW5pdGUgLTFFKzk5MCAtPiAxCitib29sMDI5OCBpc2Zpbml0ZSAxRSs5OTEgLT4gMQorYm9vbDAyOTkgaXNmaW5pdGUgLTFFKzk5MSAtPiAxCitib29sMDMwMCBpc2Zpbml0ZSAxRSs5OTIgLT4gMQorYm9vbDAzMDEgaXNmaW5pdGUgLTFFKzk5MiAtPiAxCitib29sMDMwMiBpc2Zpbml0ZSAxRSs5OTggLT4gMQorYm9vbDAzMDMgaXNmaW5pdGUgLTFFKzk5OCAtPiAxCitib29sMDMwNCBpc2Zpbml0ZSAxRSs5OTkgLT4gMQorYm9vbDAzMDUgaXNmaW5pdGUgLTFFKzk5OSAtPiAxCitib29sMDMwNiBpc2Zpbml0ZSAxRSsxMDAwIC0+IDEKK2Jvb2wwMzA3IGlzZmluaXRlIC0xRSsxMDAwIC0+IDEKK2Jvb2wwMzA4IGlzZmluaXRlIDFFKzIwMDAgLT4gMQorYm9vbDAzMDkgaXNmaW5pdGUgLTFFKzIwMDAgLT4gMQorYm9vbDAzMTAgaXNmaW5pdGUgOUUtMjAwMCAtPiAxCitib29sMDMxMSBpc2Zpbml0ZSAtOUUtMjAwMCAtPiAxCitib29sMDMxMiBpc2Zpbml0ZSA5RS0xMDA4IC0+IDEKK2Jvb2wwMzEzIGlzZmluaXRlIC05RS0xMDA4IC0+IDEKK2Jvb2wwMzE0IGlzZmluaXRlIDlFLTEwMDcgLT4gMQorYm9vbDAzMTUgaXNmaW5pdGUgLTlFLTEwMDcgLT4gMQorYm9vbDAzMTYgaXNmaW5pdGUgOUUtMTAwNiAtPiAxCitib29sMDMxNyBpc2Zpbml0ZSAtOUUtMTAwNiAtPiAxCitib29sMDMxOCBpc2Zpbml0ZSA5RS0xMDAwIC0+IDEKK2Jvb2wwMzE5IGlzZmluaXRlIC05RS0xMDAwIC0+IDEKK2Jvb2wwMzIwIGlzZmluaXRlIDlFLTk5OSAtPiAxCitib29sMDMyMSBpc2Zpbml0ZSAtOUUtOTk5IC0+IDEKK2Jvb2wwMzIyIGlzZmluaXRlIDlFLTk5OCAtPiAxCitib29sMDMyMyBpc2Zpbml0ZSAtOUUtOTk4IC0+IDEKK2Jvb2wwMzI0IGlzZmluaXRlIDlFLTEwMCAtPiAxCitib29sMDMyNSBpc2Zpbml0ZSAtOUUtMTAwIC0+IDEKK2Jvb2wwMzI2IGlzZmluaXRlIDAuMDAwMDA5IC0+IDEKK2Jvb2wwMzI3IGlzZmluaXRlIC0wLjAwMDAwOSAtPiAxCitib29sMDMyOCBpc2Zpbml0ZSAwLjAwOSAtPiAxCitib29sMDMyOSBpc2Zpbml0ZSAtMC4wMDkgLT4gMQorYm9vbDAzMzAgaXNmaW5pdGUgMC4wOSAtPiAxCitib29sMDMzMSBpc2Zpbml0ZSAtMC4wOSAtPiAxCitib29sMDMzMiBpc2Zpbml0ZSAwLjkgLT4gMQorYm9vbDAzMzMgaXNmaW5pdGUgLTAuOSAtPiAxCitib29sMDMzNCBpc2Zpbml0ZSA5IC0+IDEKK2Jvb2wwMzM1IGlzZmluaXRlIC05IC0+IDEKK2Jvb2wwMzM2IGlzZmluaXRlIDlFKzEgLT4gMQorYm9vbDAzMzcgaXNmaW5pdGUgLTlFKzEgLT4gMQorYm9vbDAzMzggaXNmaW5pdGUgOUUrMiAtPiAxCitib29sMDMzOSBpc2Zpbml0ZSAtOUUrMiAtPiAxCitib29sMDM0MCBpc2Zpbml0ZSA5RSszIC0+IDEKK2Jvb2wwMzQxIGlzZmluaXRlIC05RSszIC0+IDEKK2Jvb2wwMzQyIGlzZmluaXRlIDlFKzYgLT4gMQorYm9vbDAzNDMgaXNmaW5pdGUgLTlFKzYgLT4gMQorYm9vbDAzNDQgaXNmaW5pdGUgOUUrMTAwIC0+IDEKK2Jvb2wwMzQ1IGlzZmluaXRlIC05RSsxMDAgLT4gMQorYm9vbDAzNDYgaXNmaW5pdGUgOUUrOTkwIC0+IDEKK2Jvb2wwMzQ3IGlzZmluaXRlIC05RSs5OTAgLT4gMQorYm9vbDAzNDggaXNmaW5pdGUgOUUrOTkxIC0+IDEKK2Jvb2wwMzQ5IGlzZmluaXRlIC05RSs5OTEgLT4gMQorYm9vbDAzNTAgaXNmaW5pdGUgOUUrOTkyIC0+IDEKK2Jvb2wwMzUxIGlzZmluaXRlIC05RSs5OTIgLT4gMQorYm9vbDAzNTIgaXNmaW5pdGUgOUUrOTk4IC0+IDEKK2Jvb2wwMzUzIGlzZmluaXRlIC05RSs5OTggLT4gMQorYm9vbDAzNTQgaXNmaW5pdGUgOUUrOTk5IC0+IDEKK2Jvb2wwMzU1IGlzZmluaXRlIC05RSs5OTkgLT4gMQorYm9vbDAzNTYgaXNmaW5pdGUgOUUrMTAwMCAtPiAxCitib29sMDM1NyBpc2Zpbml0ZSAtOUUrMTAwMCAtPiAxCitib29sMDM1OCBpc2Zpbml0ZSA5RSsyMDAwIC0+IDEKK2Jvb2wwMzU5IGlzZmluaXRlIC05RSsyMDAwIC0+IDEKK2Jvb2wwMzYwIGlzZmluaXRlIDkuOTk5OTk5OTlFLTIwMDAgLT4gMQorYm9vbDAzNjEgaXNmaW5pdGUgLTkuOTk5OTk5OTlFLTIwMDAgLT4gMQorYm9vbDAzNjIgaXNmaW5pdGUgOS45OTk5OTk5OUUtMTAwOCAtPiAxCitib29sMDM2MyBpc2Zpbml0ZSAtOS45OTk5OTk5OUUtMTAwOCAtPiAxCitib29sMDM2NCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RS0xMDA3IC0+IDEKK2Jvb2wwMzY1IGlzZmluaXRlIC05Ljk5OTk5OTk5RS0xMDA3IC0+IDEKK2Jvb2wwMzY2IGlzZmluaXRlIDkuOTk5OTk5OTlFLTEwMDYgLT4gMQorYm9vbDAzNjcgaXNmaW5pdGUgLTkuOTk5OTk5OTlFLTEwMDYgLT4gMQorYm9vbDAzNjggaXNmaW5pdGUgOS45OTk5OTk5OUUtMTAwMCAtPiAxCitib29sMDM2OSBpc2Zpbml0ZSAtOS45OTk5OTk5OUUtMTAwMCAtPiAxCitib29sMDM3MCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RS05OTkgLT4gMQorYm9vbDAzNzEgaXNmaW5pdGUgLTkuOTk5OTk5OTlFLTk5OSAtPiAxCitib29sMDM3MiBpc2Zpbml0ZSA5Ljk5OTk5OTk5RS05OTggLT4gMQorYm9vbDAzNzMgaXNmaW5pdGUgLTkuOTk5OTk5OTlFLTk5OCAtPiAxCitib29sMDM3NCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RS0xMDAgLT4gMQorYm9vbDAzNzUgaXNmaW5pdGUgLTkuOTk5OTk5OTlFLTEwMCAtPiAxCitib29sMDM3NiBpc2Zpbml0ZSAwLjAwMDAwOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMzc3IGlzZmluaXRlIC0wLjAwMDAwOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMzc4IGlzZmluaXRlIDAuMDA5OTk5OTk5OTkgLT4gMQorYm9vbDAzNzkgaXNmaW5pdGUgLTAuMDA5OTk5OTk5OTkgLT4gMQorYm9vbDAzODAgaXNmaW5pdGUgMC4wOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMzgxIGlzZmluaXRlIC0wLjA5OTk5OTk5OTkgLT4gMQorYm9vbDAzODIgaXNmaW5pdGUgMC45OTk5OTk5OTkgLT4gMQorYm9vbDAzODMgaXNmaW5pdGUgLTAuOTk5OTk5OTk5IC0+IDEKK2Jvb2wwMzg0IGlzZmluaXRlIDkuOTk5OTk5OTkgLT4gMQorYm9vbDAzODUgaXNmaW5pdGUgLTkuOTk5OTk5OTkgLT4gMQorYm9vbDAzODYgaXNmaW5pdGUgOTkuOTk5OTk5OSAtPiAxCitib29sMDM4NyBpc2Zpbml0ZSAtOTkuOTk5OTk5OSAtPiAxCitib29sMDM4OCBpc2Zpbml0ZSA5OTkuOTk5OTk5IC0+IDEKK2Jvb2wwMzg5IGlzZmluaXRlIC05OTkuOTk5OTk5IC0+IDEKK2Jvb2wwMzkwIGlzZmluaXRlIDk5OTkuOTk5OTkgLT4gMQorYm9vbDAzOTEgaXNmaW5pdGUgLTk5OTkuOTk5OTkgLT4gMQorYm9vbDAzOTIgaXNmaW5pdGUgOTk5OTk5OS45OSAtPiAxCitib29sMDM5MyBpc2Zpbml0ZSAtOTk5OTk5OS45OSAtPiAxCitib29sMDM5NCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RSsxMDAgLT4gMQorYm9vbDAzOTUgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzEwMCAtPiAxCitib29sMDM5NiBpc2Zpbml0ZSA5Ljk5OTk5OTk5RSs5OTAgLT4gMQorYm9vbDAzOTcgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzk5MCAtPiAxCitib29sMDM5OCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RSs5OTEgLT4gMQorYm9vbDAzOTkgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzk5MSAtPiAxCitib29sMDQwMCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RSs5OTIgLT4gMQorYm9vbDA0MDEgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzk5MiAtPiAxCitib29sMDQwMiBpc2Zpbml0ZSA5Ljk5OTk5OTk5RSs5OTggLT4gMQorYm9vbDA0MDMgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzk5OCAtPiAxCitib29sMDQwNCBpc2Zpbml0ZSA5Ljk5OTk5OTk5RSs5OTkgLT4gMQorYm9vbDA0MDUgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzk5OSAtPiAxCitib29sMDQwNiBpc2Zpbml0ZSA5Ljk5OTk5OTk5RSsxMDAwIC0+IDEKK2Jvb2wwNDA3IGlzZmluaXRlIC05Ljk5OTk5OTk5RSsxMDAwIC0+IDEKK2Jvb2wwNDA4IGlzZmluaXRlIDkuOTk5OTk5OTlFKzIwMDAgLT4gMQorYm9vbDA0MDkgaXNmaW5pdGUgLTkuOTk5OTk5OTlFKzIwMDAgLT4gMQorYm9vbDA0MTAgaXNmaW5pdGUgSW5maW5pdHkgLT4gMAorYm9vbDA0MTEgaXNmaW5pdGUgLUluZmluaXR5IC0+IDAKK2Jvb2wwNDEyIGlzZmluaXRlIE5hTiAtPiAwCitib29sMDQxMyBpc2Zpbml0ZSAtTmFOIC0+IDAKK2Jvb2wwNDE0IGlzZmluaXRlIE5hTjEyMyAtPiAwCitib29sMDQxNSBpc2Zpbml0ZSAtTmFOMTIzIC0+IDAKK2Jvb2wwNDE2IGlzZmluaXRlIHNOYU4gLT4gMAorYm9vbDA0MTcgaXNmaW5pdGUgLXNOYU4gLT4gMAorYm9vbDA0MTggaXNmaW5pdGUgc05hTjEyMyAtPiAwCitib29sMDQxOSBpc2Zpbml0ZSAtc05hTjEyMyAtPiAwCitib29sMDQyMCBpc2luZmluaXRlIDBFLTIwMDAgLT4gMAorYm9vbDA0MjEgaXNpbmZpbml0ZSAtMEUtMjAwMCAtPiAwCitib29sMDQyMiBpc2luZmluaXRlIDBFLTEwMDggLT4gMAorYm9vbDA0MjMgaXNpbmZpbml0ZSAtMEUtMTAwOCAtPiAwCitib29sMDQyNCBpc2luZmluaXRlIDBFLTEwMDcgLT4gMAorYm9vbDA0MjUgaXNpbmZpbml0ZSAtMEUtMTAwNyAtPiAwCitib29sMDQyNiBpc2luZmluaXRlIDBFLTEwMDYgLT4gMAorYm9vbDA0MjcgaXNpbmZpbml0ZSAtMEUtMTAwNiAtPiAwCitib29sMDQyOCBpc2luZmluaXRlIDBFLTEwMDAgLT4gMAorYm9vbDA0MjkgaXNpbmZpbml0ZSAtMEUtMTAwMCAtPiAwCitib29sMDQzMCBpc2luZmluaXRlIDBFLTk5OSAtPiAwCitib29sMDQzMSBpc2luZmluaXRlIC0wRS05OTkgLT4gMAorYm9vbDA0MzIgaXNpbmZpbml0ZSAwRS05OTggLT4gMAorYm9vbDA0MzMgaXNpbmZpbml0ZSAtMEUtOTk4IC0+IDAKK2Jvb2wwNDM0IGlzaW5maW5pdGUgMEUtMTAwIC0+IDAKK2Jvb2wwNDM1IGlzaW5maW5pdGUgLTBFLTEwMCAtPiAwCitib29sMDQzNiBpc2luZmluaXRlIDAuMDAwMDAwIC0+IDAKK2Jvb2wwNDM3IGlzaW5maW5pdGUgLTAuMDAwMDAwIC0+IDAKK2Jvb2wwNDM4IGlzaW5maW5pdGUgMC4wMDAgLT4gMAorYm9vbDA0MzkgaXNpbmZpbml0ZSAtMC4wMDAgLT4gMAorYm9vbDA0NDAgaXNpbmZpbml0ZSAwLjAwIC0+IDAKK2Jvb2wwNDQxIGlzaW5maW5pdGUgLTAuMDAgLT4gMAorYm9vbDA0NDIgaXNpbmZpbml0ZSAwLjAgLT4gMAorYm9vbDA0NDMgaXNpbmZpbml0ZSAtMC4wIC0+IDAKK2Jvb2wwNDQ0IGlzaW5maW5pdGUgMCAtPiAwCitib29sMDQ0NSBpc2luZmluaXRlIC0wIC0+IDAKK2Jvb2wwNDQ2IGlzaW5maW5pdGUgMEUrMSAtPiAwCitib29sMDQ0NyBpc2luZmluaXRlIC0wRSsxIC0+IDAKK2Jvb2wwNDQ4IGlzaW5maW5pdGUgMEUrMiAtPiAwCitib29sMDQ0OSBpc2luZmluaXRlIC0wRSsyIC0+IDAKK2Jvb2wwNDUwIGlzaW5maW5pdGUgMEUrMyAtPiAwCitib29sMDQ1MSBpc2luZmluaXRlIC0wRSszIC0+IDAKK2Jvb2wwNDUyIGlzaW5maW5pdGUgMEUrNiAtPiAwCitib29sMDQ1MyBpc2luZmluaXRlIC0wRSs2IC0+IDAKK2Jvb2wwNDU0IGlzaW5maW5pdGUgMEUrMTAwIC0+IDAKK2Jvb2wwNDU1IGlzaW5maW5pdGUgLTBFKzEwMCAtPiAwCitib29sMDQ1NiBpc2luZmluaXRlIDBFKzk5MCAtPiAwCitib29sMDQ1NyBpc2luZmluaXRlIC0wRSs5OTAgLT4gMAorYm9vbDA0NTggaXNpbmZpbml0ZSAwRSs5OTEgLT4gMAorYm9vbDA0NTkgaXNpbmZpbml0ZSAtMEUrOTkxIC0+IDAKK2Jvb2wwNDYwIGlzaW5maW5pdGUgMEUrOTkyIC0+IDAKK2Jvb2wwNDYxIGlzaW5maW5pdGUgLTBFKzk5MiAtPiAwCitib29sMDQ2MiBpc2luZmluaXRlIDBFKzk5OCAtPiAwCitib29sMDQ2MyBpc2luZmluaXRlIC0wRSs5OTggLT4gMAorYm9vbDA0NjQgaXNpbmZpbml0ZSAwRSs5OTkgLT4gMAorYm9vbDA0NjUgaXNpbmZpbml0ZSAtMEUrOTk5IC0+IDAKK2Jvb2wwNDY2IGlzaW5maW5pdGUgMEUrMTAwMCAtPiAwCitib29sMDQ2NyBpc2luZmluaXRlIC0wRSsxMDAwIC0+IDAKK2Jvb2wwNDY4IGlzaW5maW5pdGUgMEUrMjAwMCAtPiAwCitib29sMDQ2OSBpc2luZmluaXRlIC0wRSsyMDAwIC0+IDAKK2Jvb2wwNDcwIGlzaW5maW5pdGUgMUUtMjAwMCAtPiAwCitib29sMDQ3MSBpc2luZmluaXRlIC0xRS0yMDAwIC0+IDAKK2Jvb2wwNDcyIGlzaW5maW5pdGUgMUUtMTAwOCAtPiAwCitib29sMDQ3MyBpc2luZmluaXRlIC0xRS0xMDA4IC0+IDAKK2Jvb2wwNDc0IGlzaW5maW5pdGUgMUUtMTAwNyAtPiAwCitib29sMDQ3NSBpc2luZmluaXRlIC0xRS0xMDA3IC0+IDAKK2Jvb2wwNDc2IGlzaW5maW5pdGUgMUUtMTAwNiAtPiAwCitib29sMDQ3NyBpc2luZmluaXRlIC0xRS0xMDA2IC0+IDAKK2Jvb2wwNDc4IGlzaW5maW5pdGUgMUUtMTAwMCAtPiAwCitib29sMDQ3OSBpc2luZmluaXRlIC0xRS0xMDAwIC0+IDAKK2Jvb2wwNDgwIGlzaW5maW5pdGUgMUUtOTk5IC0+IDAKK2Jvb2wwNDgxIGlzaW5maW5pdGUgLTFFLTk5OSAtPiAwCitib29sMDQ4MiBpc2luZmluaXRlIDFFLTk5OCAtPiAwCitib29sMDQ4MyBpc2luZmluaXRlIC0xRS05OTggLT4gMAorYm9vbDA0ODQgaXNpbmZpbml0ZSAxRS0xMDAgLT4gMAorYm9vbDA0ODUgaXNpbmZpbml0ZSAtMUUtMTAwIC0+IDAKK2Jvb2wwNDg2IGlzaW5maW5pdGUgMC4wMDAwMDEgLT4gMAorYm9vbDA0ODcgaXNpbmZpbml0ZSAtMC4wMDAwMDEgLT4gMAorYm9vbDA0ODggaXNpbmZpbml0ZSAwLjAwMSAtPiAwCitib29sMDQ4OSBpc2luZmluaXRlIC0wLjAwMSAtPiAwCitib29sMDQ5MCBpc2luZmluaXRlIDAuMDEgLT4gMAorYm9vbDA0OTEgaXNpbmZpbml0ZSAtMC4wMSAtPiAwCitib29sMDQ5MiBpc2luZmluaXRlIDAuMSAtPiAwCitib29sMDQ5MyBpc2luZmluaXRlIC0wLjEgLT4gMAorYm9vbDA0OTQgaXNpbmZpbml0ZSAxIC0+IDAKK2Jvb2wwNDk1IGlzaW5maW5pdGUgLTEgLT4gMAorYm9vbDA0OTYgaXNpbmZpbml0ZSAxRSsxIC0+IDAKK2Jvb2wwNDk3IGlzaW5maW5pdGUgLTFFKzEgLT4gMAorYm9vbDA0OTggaXNpbmZpbml0ZSAxRSsyIC0+IDAKK2Jvb2wwNDk5IGlzaW5maW5pdGUgLTFFKzIgLT4gMAorYm9vbDA1MDAgaXNpbmZpbml0ZSAxRSszIC0+IDAKK2Jvb2wwNTAxIGlzaW5maW5pdGUgLTFFKzMgLT4gMAorYm9vbDA1MDIgaXNpbmZpbml0ZSAxRSs2IC0+IDAKK2Jvb2wwNTAzIGlzaW5maW5pdGUgLTFFKzYgLT4gMAorYm9vbDA1MDQgaXNpbmZpbml0ZSAxRSsxMDAgLT4gMAorYm9vbDA1MDUgaXNpbmZpbml0ZSAtMUUrMTAwIC0+IDAKK2Jvb2wwNTA2IGlzaW5maW5pdGUgMUUrOTkwIC0+IDAKK2Jvb2wwNTA3IGlzaW5maW5pdGUgLTFFKzk5MCAtPiAwCitib29sMDUwOCBpc2luZmluaXRlIDFFKzk5MSAtPiAwCitib29sMDUwOSBpc2luZmluaXRlIC0xRSs5OTEgLT4gMAorYm9vbDA1MTAgaXNpbmZpbml0ZSAxRSs5OTIgLT4gMAorYm9vbDA1MTEgaXNpbmZpbml0ZSAtMUUrOTkyIC0+IDAKK2Jvb2wwNTEyIGlzaW5maW5pdGUgMUUrOTk4IC0+IDAKK2Jvb2wwNTEzIGlzaW5maW5pdGUgLTFFKzk5OCAtPiAwCitib29sMDUxNCBpc2luZmluaXRlIDFFKzk5OSAtPiAwCitib29sMDUxNSBpc2luZmluaXRlIC0xRSs5OTkgLT4gMAorYm9vbDA1MTYgaXNpbmZpbml0ZSAxRSsxMDAwIC0+IDAKK2Jvb2wwNTE3IGlzaW5maW5pdGUgLTFFKzEwMDAgLT4gMAorYm9vbDA1MTggaXNpbmZpbml0ZSAxRSsyMDAwIC0+IDAKK2Jvb2wwNTE5IGlzaW5maW5pdGUgLTFFKzIwMDAgLT4gMAorYm9vbDA1MjAgaXNpbmZpbml0ZSA5RS0yMDAwIC0+IDAKK2Jvb2wwNTIxIGlzaW5maW5pdGUgLTlFLTIwMDAgLT4gMAorYm9vbDA1MjIgaXNpbmZpbml0ZSA5RS0xMDA4IC0+IDAKK2Jvb2wwNTIzIGlzaW5maW5pdGUgLTlFLTEwMDggLT4gMAorYm9vbDA1MjQgaXNpbmZpbml0ZSA5RS0xMDA3IC0+IDAKK2Jvb2wwNTI1IGlzaW5maW5pdGUgLTlFLTEwMDcgLT4gMAorYm9vbDA1MjYgaXNpbmZpbml0ZSA5RS0xMDA2IC0+IDAKK2Jvb2wwNTI3IGlzaW5maW5pdGUgLTlFLTEwMDYgLT4gMAorYm9vbDA1MjggaXNpbmZpbml0ZSA5RS0xMDAwIC0+IDAKK2Jvb2wwNTI5IGlzaW5maW5pdGUgLTlFLTEwMDAgLT4gMAorYm9vbDA1MzAgaXNpbmZpbml0ZSA5RS05OTkgLT4gMAorYm9vbDA1MzEgaXNpbmZpbml0ZSAtOUUtOTk5IC0+IDAKK2Jvb2wwNTMyIGlzaW5maW5pdGUgOUUtOTk4IC0+IDAKK2Jvb2wwNTMzIGlzaW5maW5pdGUgLTlFLTk5OCAtPiAwCitib29sMDUzNCBpc2luZmluaXRlIDlFLTEwMCAtPiAwCitib29sMDUzNSBpc2luZmluaXRlIC05RS0xMDAgLT4gMAorYm9vbDA1MzYgaXNpbmZpbml0ZSAwLjAwMDAwOSAtPiAwCitib29sMDUzNyBpc2luZmluaXRlIC0wLjAwMDAwOSAtPiAwCitib29sMDUzOCBpc2luZmluaXRlIDAuMDA5IC0+IDAKK2Jvb2wwNTM5IGlzaW5maW5pdGUgLTAuMDA5IC0+IDAKK2Jvb2wwNTQwIGlzaW5maW5pdGUgMC4wOSAtPiAwCitib29sMDU0MSBpc2luZmluaXRlIC0wLjA5IC0+IDAKK2Jvb2wwNTQyIGlzaW5maW5pdGUgMC45IC0+IDAKK2Jvb2wwNTQzIGlzaW5maW5pdGUgLTAuOSAtPiAwCitib29sMDU0NCBpc2luZmluaXRlIDkgLT4gMAorYm9vbDA1NDUgaXNpbmZpbml0ZSAtOSAtPiAwCitib29sMDU0NiBpc2luZmluaXRlIDlFKzEgLT4gMAorYm9vbDA1NDcgaXNpbmZpbml0ZSAtOUUrMSAtPiAwCitib29sMDU0OCBpc2luZmluaXRlIDlFKzIgLT4gMAorYm9vbDA1NDkgaXNpbmZpbml0ZSAtOUUrMiAtPiAwCitib29sMDU1MCBpc2luZmluaXRlIDlFKzMgLT4gMAorYm9vbDA1NTEgaXNpbmZpbml0ZSAtOUUrMyAtPiAwCitib29sMDU1MiBpc2luZmluaXRlIDlFKzYgLT4gMAorYm9vbDA1NTMgaXNpbmZpbml0ZSAtOUUrNiAtPiAwCitib29sMDU1NCBpc2luZmluaXRlIDlFKzEwMCAtPiAwCitib29sMDU1NSBpc2luZmluaXRlIC05RSsxMDAgLT4gMAorYm9vbDA1NTYgaXNpbmZpbml0ZSA5RSs5OTAgLT4gMAorYm9vbDA1NTcgaXNpbmZpbml0ZSAtOUUrOTkwIC0+IDAKK2Jvb2wwNTU4IGlzaW5maW5pdGUgOUUrOTkxIC0+IDAKK2Jvb2wwNTU5IGlzaW5maW5pdGUgLTlFKzk5MSAtPiAwCitib29sMDU2MCBpc2luZmluaXRlIDlFKzk5MiAtPiAwCitib29sMDU2MSBpc2luZmluaXRlIC05RSs5OTIgLT4gMAorYm9vbDA1NjIgaXNpbmZpbml0ZSA5RSs5OTggLT4gMAorYm9vbDA1NjMgaXNpbmZpbml0ZSAtOUUrOTk4IC0+IDAKK2Jvb2wwNTY0IGlzaW5maW5pdGUgOUUrOTk5IC0+IDAKK2Jvb2wwNTY1IGlzaW5maW5pdGUgLTlFKzk5OSAtPiAwCitib29sMDU2NiBpc2luZmluaXRlIDlFKzEwMDAgLT4gMAorYm9vbDA1NjcgaXNpbmZpbml0ZSAtOUUrMTAwMCAtPiAwCitib29sMDU2OCBpc2luZmluaXRlIDlFKzIwMDAgLT4gMAorYm9vbDA1NjkgaXNpbmZpbml0ZSAtOUUrMjAwMCAtPiAwCitib29sMDU3MCBpc2luZmluaXRlIDkuOTk5OTk5OTlFLTIwMDAgLT4gMAorYm9vbDA1NzEgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMDU3MiBpc2luZmluaXRlIDkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDA1NzMgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMDU3NCBpc2luZmluaXRlIDkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDA1NzUgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMDU3NiBpc2luZmluaXRlIDkuOTk5OTk5OTlFLTEwMDYgLT4gMAorYm9vbDA1NzcgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMDU3OCBpc2luZmluaXRlIDkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDA1NzkgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMDU4MCBpc2luZmluaXRlIDkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMDU4MSBpc2luZmluaXRlIC05Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDA1ODIgaXNpbmZpbml0ZSA5Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDA1ODMgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wwNTg0IGlzaW5maW5pdGUgOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wwNTg1IGlzaW5maW5pdGUgLTkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMDU4NiBpc2luZmluaXRlIDAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDA1ODcgaXNpbmZpbml0ZSAtMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMDU4OCBpc2luZmluaXRlIDAuMDA5OTk5OTk5OTkgLT4gMAorYm9vbDA1ODkgaXNpbmZpbml0ZSAtMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMDU5MCBpc2luZmluaXRlIDAuMDk5OTk5OTk5OSAtPiAwCitib29sMDU5MSBpc2luZmluaXRlIC0wLjA5OTk5OTk5OTkgLT4gMAorYm9vbDA1OTIgaXNpbmZpbml0ZSAwLjk5OTk5OTk5OSAtPiAwCitib29sMDU5MyBpc2luZmluaXRlIC0wLjk5OTk5OTk5OSAtPiAwCitib29sMDU5NCBpc2luZmluaXRlIDkuOTk5OTk5OTkgLT4gMAorYm9vbDA1OTUgaXNpbmZpbml0ZSAtOS45OTk5OTk5OSAtPiAwCitib29sMDU5NiBpc2luZmluaXRlIDk5Ljk5OTk5OTkgLT4gMAorYm9vbDA1OTcgaXNpbmZpbml0ZSAtOTkuOTk5OTk5OSAtPiAwCitib29sMDU5OCBpc2luZmluaXRlIDk5OS45OTk5OTkgLT4gMAorYm9vbDA1OTkgaXNpbmZpbml0ZSAtOTk5Ljk5OTk5OSAtPiAwCitib29sMDYwMCBpc2luZmluaXRlIDk5OTkuOTk5OTkgLT4gMAorYm9vbDA2MDEgaXNpbmZpbml0ZSAtOTk5OS45OTk5OSAtPiAwCitib29sMDYwMiBpc2luZmluaXRlIDk5OTk5OTkuOTkgLT4gMAorYm9vbDA2MDMgaXNpbmZpbml0ZSAtOTk5OTk5OS45OSAtPiAwCitib29sMDYwNCBpc2luZmluaXRlIDkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMDYwNSBpc2luZmluaXRlIC05Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDA2MDYgaXNpbmZpbml0ZSA5Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDA2MDcgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wwNjA4IGlzaW5maW5pdGUgOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wwNjA5IGlzaW5maW5pdGUgLTkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMDYxMCBpc2luZmluaXRlIDkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMDYxMSBpc2luZmluaXRlIC05Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDA2MTIgaXNpbmZpbml0ZSA5Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDA2MTMgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wwNjE0IGlzaW5maW5pdGUgOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wwNjE1IGlzaW5maW5pdGUgLTkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMDYxNiBpc2luZmluaXRlIDkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDA2MTcgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMDYxOCBpc2luZmluaXRlIDkuOTk5OTk5OTlFKzIwMDAgLT4gMAorYm9vbDA2MTkgaXNpbmZpbml0ZSAtOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMDYyMCBpc2luZmluaXRlIEluZmluaXR5IC0+IDEKK2Jvb2wwNjIxIGlzaW5maW5pdGUgLUluZmluaXR5IC0+IDEKK2Jvb2wwNjIyIGlzaW5maW5pdGUgTmFOIC0+IDAKK2Jvb2wwNjIzIGlzaW5maW5pdGUgLU5hTiAtPiAwCitib29sMDYyNCBpc2luZmluaXRlIE5hTjEyMyAtPiAwCitib29sMDYyNSBpc2luZmluaXRlIC1OYU4xMjMgLT4gMAorYm9vbDA2MjYgaXNpbmZpbml0ZSBzTmFOIC0+IDAKK2Jvb2wwNjI3IGlzaW5maW5pdGUgLXNOYU4gLT4gMAorYm9vbDA2MjggaXNpbmZpbml0ZSBzTmFOMTIzIC0+IDAKK2Jvb2wwNjI5IGlzaW5maW5pdGUgLXNOYU4xMjMgLT4gMAorYm9vbDA2MzAgaXNuYW4gMEUtMjAwMCAtPiAwCitib29sMDYzMSBpc25hbiAtMEUtMjAwMCAtPiAwCitib29sMDYzMiBpc25hbiAwRS0xMDA4IC0+IDAKK2Jvb2wwNjMzIGlzbmFuIC0wRS0xMDA4IC0+IDAKK2Jvb2wwNjM0IGlzbmFuIDBFLTEwMDcgLT4gMAorYm9vbDA2MzUgaXNuYW4gLTBFLTEwMDcgLT4gMAorYm9vbDA2MzYgaXNuYW4gMEUtMTAwNiAtPiAwCitib29sMDYzNyBpc25hbiAtMEUtMTAwNiAtPiAwCitib29sMDYzOCBpc25hbiAwRS0xMDAwIC0+IDAKK2Jvb2wwNjM5IGlzbmFuIC0wRS0xMDAwIC0+IDAKK2Jvb2wwNjQwIGlzbmFuIDBFLTk5OSAtPiAwCitib29sMDY0MSBpc25hbiAtMEUtOTk5IC0+IDAKK2Jvb2wwNjQyIGlzbmFuIDBFLTk5OCAtPiAwCitib29sMDY0MyBpc25hbiAtMEUtOTk4IC0+IDAKK2Jvb2wwNjQ0IGlzbmFuIDBFLTEwMCAtPiAwCitib29sMDY0NSBpc25hbiAtMEUtMTAwIC0+IDAKK2Jvb2wwNjQ2IGlzbmFuIDAuMDAwMDAwIC0+IDAKK2Jvb2wwNjQ3IGlzbmFuIC0wLjAwMDAwMCAtPiAwCitib29sMDY0OCBpc25hbiAwLjAwMCAtPiAwCitib29sMDY0OSBpc25hbiAtMC4wMDAgLT4gMAorYm9vbDA2NTAgaXNuYW4gMC4wMCAtPiAwCitib29sMDY1MSBpc25hbiAtMC4wMCAtPiAwCitib29sMDY1MiBpc25hbiAwLjAgLT4gMAorYm9vbDA2NTMgaXNuYW4gLTAuMCAtPiAwCitib29sMDY1NCBpc25hbiAwIC0+IDAKK2Jvb2wwNjU1IGlzbmFuIC0wIC0+IDAKK2Jvb2wwNjU2IGlzbmFuIDBFKzEgLT4gMAorYm9vbDA2NTcgaXNuYW4gLTBFKzEgLT4gMAorYm9vbDA2NTggaXNuYW4gMEUrMiAtPiAwCitib29sMDY1OSBpc25hbiAtMEUrMiAtPiAwCitib29sMDY2MCBpc25hbiAwRSszIC0+IDAKK2Jvb2wwNjYxIGlzbmFuIC0wRSszIC0+IDAKK2Jvb2wwNjYyIGlzbmFuIDBFKzYgLT4gMAorYm9vbDA2NjMgaXNuYW4gLTBFKzYgLT4gMAorYm9vbDA2NjQgaXNuYW4gMEUrMTAwIC0+IDAKK2Jvb2wwNjY1IGlzbmFuIC0wRSsxMDAgLT4gMAorYm9vbDA2NjYgaXNuYW4gMEUrOTkwIC0+IDAKK2Jvb2wwNjY3IGlzbmFuIC0wRSs5OTAgLT4gMAorYm9vbDA2NjggaXNuYW4gMEUrOTkxIC0+IDAKK2Jvb2wwNjY5IGlzbmFuIC0wRSs5OTEgLT4gMAorYm9vbDA2NzAgaXNuYW4gMEUrOTkyIC0+IDAKK2Jvb2wwNjcxIGlzbmFuIC0wRSs5OTIgLT4gMAorYm9vbDA2NzIgaXNuYW4gMEUrOTk4IC0+IDAKK2Jvb2wwNjczIGlzbmFuIC0wRSs5OTggLT4gMAorYm9vbDA2NzQgaXNuYW4gMEUrOTk5IC0+IDAKK2Jvb2wwNjc1IGlzbmFuIC0wRSs5OTkgLT4gMAorYm9vbDA2NzYgaXNuYW4gMEUrMTAwMCAtPiAwCitib29sMDY3NyBpc25hbiAtMEUrMTAwMCAtPiAwCitib29sMDY3OCBpc25hbiAwRSsyMDAwIC0+IDAKK2Jvb2wwNjc5IGlzbmFuIC0wRSsyMDAwIC0+IDAKK2Jvb2wwNjgwIGlzbmFuIDFFLTIwMDAgLT4gMAorYm9vbDA2ODEgaXNuYW4gLTFFLTIwMDAgLT4gMAorYm9vbDA2ODIgaXNuYW4gMUUtMTAwOCAtPiAwCitib29sMDY4MyBpc25hbiAtMUUtMTAwOCAtPiAwCitib29sMDY4NCBpc25hbiAxRS0xMDA3IC0+IDAKK2Jvb2wwNjg1IGlzbmFuIC0xRS0xMDA3IC0+IDAKK2Jvb2wwNjg2IGlzbmFuIDFFLTEwMDYgLT4gMAorYm9vbDA2ODcgaXNuYW4gLTFFLTEwMDYgLT4gMAorYm9vbDA2ODggaXNuYW4gMUUtMTAwMCAtPiAwCitib29sMDY4OSBpc25hbiAtMUUtMTAwMCAtPiAwCitib29sMDY5MCBpc25hbiAxRS05OTkgLT4gMAorYm9vbDA2OTEgaXNuYW4gLTFFLTk5OSAtPiAwCitib29sMDY5MiBpc25hbiAxRS05OTggLT4gMAorYm9vbDA2OTMgaXNuYW4gLTFFLTk5OCAtPiAwCitib29sMDY5NCBpc25hbiAxRS0xMDAgLT4gMAorYm9vbDA2OTUgaXNuYW4gLTFFLTEwMCAtPiAwCitib29sMDY5NiBpc25hbiAwLjAwMDAwMSAtPiAwCitib29sMDY5NyBpc25hbiAtMC4wMDAwMDEgLT4gMAorYm9vbDA2OTggaXNuYW4gMC4wMDEgLT4gMAorYm9vbDA2OTkgaXNuYW4gLTAuMDAxIC0+IDAKK2Jvb2wwNzAwIGlzbmFuIDAuMDEgLT4gMAorYm9vbDA3MDEgaXNuYW4gLTAuMDEgLT4gMAorYm9vbDA3MDIgaXNuYW4gMC4xIC0+IDAKK2Jvb2wwNzAzIGlzbmFuIC0wLjEgLT4gMAorYm9vbDA3MDQgaXNuYW4gMSAtPiAwCitib29sMDcwNSBpc25hbiAtMSAtPiAwCitib29sMDcwNiBpc25hbiAxRSsxIC0+IDAKK2Jvb2wwNzA3IGlzbmFuIC0xRSsxIC0+IDAKK2Jvb2wwNzA4IGlzbmFuIDFFKzIgLT4gMAorYm9vbDA3MDkgaXNuYW4gLTFFKzIgLT4gMAorYm9vbDA3MTAgaXNuYW4gMUUrMyAtPiAwCitib29sMDcxMSBpc25hbiAtMUUrMyAtPiAwCitib29sMDcxMiBpc25hbiAxRSs2IC0+IDAKK2Jvb2wwNzEzIGlzbmFuIC0xRSs2IC0+IDAKK2Jvb2wwNzE0IGlzbmFuIDFFKzEwMCAtPiAwCitib29sMDcxNSBpc25hbiAtMUUrMTAwIC0+IDAKK2Jvb2wwNzE2IGlzbmFuIDFFKzk5MCAtPiAwCitib29sMDcxNyBpc25hbiAtMUUrOTkwIC0+IDAKK2Jvb2wwNzE4IGlzbmFuIDFFKzk5MSAtPiAwCitib29sMDcxOSBpc25hbiAtMUUrOTkxIC0+IDAKK2Jvb2wwNzIwIGlzbmFuIDFFKzk5MiAtPiAwCitib29sMDcyMSBpc25hbiAtMUUrOTkyIC0+IDAKK2Jvb2wwNzIyIGlzbmFuIDFFKzk5OCAtPiAwCitib29sMDcyMyBpc25hbiAtMUUrOTk4IC0+IDAKK2Jvb2wwNzI0IGlzbmFuIDFFKzk5OSAtPiAwCitib29sMDcyNSBpc25hbiAtMUUrOTk5IC0+IDAKK2Jvb2wwNzI2IGlzbmFuIDFFKzEwMDAgLT4gMAorYm9vbDA3MjcgaXNuYW4gLTFFKzEwMDAgLT4gMAorYm9vbDA3MjggaXNuYW4gMUUrMjAwMCAtPiAwCitib29sMDcyOSBpc25hbiAtMUUrMjAwMCAtPiAwCitib29sMDczMCBpc25hbiA5RS0yMDAwIC0+IDAKK2Jvb2wwNzMxIGlzbmFuIC05RS0yMDAwIC0+IDAKK2Jvb2wwNzMyIGlzbmFuIDlFLTEwMDggLT4gMAorYm9vbDA3MzMgaXNuYW4gLTlFLTEwMDggLT4gMAorYm9vbDA3MzQgaXNuYW4gOUUtMTAwNyAtPiAwCitib29sMDczNSBpc25hbiAtOUUtMTAwNyAtPiAwCitib29sMDczNiBpc25hbiA5RS0xMDA2IC0+IDAKK2Jvb2wwNzM3IGlzbmFuIC05RS0xMDA2IC0+IDAKK2Jvb2wwNzM4IGlzbmFuIDlFLTEwMDAgLT4gMAorYm9vbDA3MzkgaXNuYW4gLTlFLTEwMDAgLT4gMAorYm9vbDA3NDAgaXNuYW4gOUUtOTk5IC0+IDAKK2Jvb2wwNzQxIGlzbmFuIC05RS05OTkgLT4gMAorYm9vbDA3NDIgaXNuYW4gOUUtOTk4IC0+IDAKK2Jvb2wwNzQzIGlzbmFuIC05RS05OTggLT4gMAorYm9vbDA3NDQgaXNuYW4gOUUtMTAwIC0+IDAKK2Jvb2wwNzQ1IGlzbmFuIC05RS0xMDAgLT4gMAorYm9vbDA3NDYgaXNuYW4gMC4wMDAwMDkgLT4gMAorYm9vbDA3NDcgaXNuYW4gLTAuMDAwMDA5IC0+IDAKK2Jvb2wwNzQ4IGlzbmFuIDAuMDA5IC0+IDAKK2Jvb2wwNzQ5IGlzbmFuIC0wLjAwOSAtPiAwCitib29sMDc1MCBpc25hbiAwLjA5IC0+IDAKK2Jvb2wwNzUxIGlzbmFuIC0wLjA5IC0+IDAKK2Jvb2wwNzUyIGlzbmFuIDAuOSAtPiAwCitib29sMDc1MyBpc25hbiAtMC45IC0+IDAKK2Jvb2wwNzU0IGlzbmFuIDkgLT4gMAorYm9vbDA3NTUgaXNuYW4gLTkgLT4gMAorYm9vbDA3NTYgaXNuYW4gOUUrMSAtPiAwCitib29sMDc1NyBpc25hbiAtOUUrMSAtPiAwCitib29sMDc1OCBpc25hbiA5RSsyIC0+IDAKK2Jvb2wwNzU5IGlzbmFuIC05RSsyIC0+IDAKK2Jvb2wwNzYwIGlzbmFuIDlFKzMgLT4gMAorYm9vbDA3NjEgaXNuYW4gLTlFKzMgLT4gMAorYm9vbDA3NjIgaXNuYW4gOUUrNiAtPiAwCitib29sMDc2MyBpc25hbiAtOUUrNiAtPiAwCitib29sMDc2NCBpc25hbiA5RSsxMDAgLT4gMAorYm9vbDA3NjUgaXNuYW4gLTlFKzEwMCAtPiAwCitib29sMDc2NiBpc25hbiA5RSs5OTAgLT4gMAorYm9vbDA3NjcgaXNuYW4gLTlFKzk5MCAtPiAwCitib29sMDc2OCBpc25hbiA5RSs5OTEgLT4gMAorYm9vbDA3NjkgaXNuYW4gLTlFKzk5MSAtPiAwCitib29sMDc3MCBpc25hbiA5RSs5OTIgLT4gMAorYm9vbDA3NzEgaXNuYW4gLTlFKzk5MiAtPiAwCitib29sMDc3MiBpc25hbiA5RSs5OTggLT4gMAorYm9vbDA3NzMgaXNuYW4gLTlFKzk5OCAtPiAwCitib29sMDc3NCBpc25hbiA5RSs5OTkgLT4gMAorYm9vbDA3NzUgaXNuYW4gLTlFKzk5OSAtPiAwCitib29sMDc3NiBpc25hbiA5RSsxMDAwIC0+IDAKK2Jvb2wwNzc3IGlzbmFuIC05RSsxMDAwIC0+IDAKK2Jvb2wwNzc4IGlzbmFuIDlFKzIwMDAgLT4gMAorYm9vbDA3NzkgaXNuYW4gLTlFKzIwMDAgLT4gMAorYm9vbDA3ODAgaXNuYW4gOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMDc4MSBpc25hbiAtOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMDc4MiBpc25hbiA5Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wwNzgzIGlzbmFuIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wwNzg0IGlzbmFuIDkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDA3ODUgaXNuYW4gLTkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDA3ODYgaXNuYW4gOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMDc4NyBpc25hbiAtOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMDc4OCBpc25hbiA5Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wwNzg5IGlzbmFuIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wwNzkwIGlzbmFuIDkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMDc5MSBpc25hbiAtOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wwNzkyIGlzbmFuIDkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMDc5MyBpc25hbiAtOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wwNzk0IGlzbmFuIDkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMDc5NSBpc25hbiAtOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wwNzk2IGlzbmFuIDAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDA3OTcgaXNuYW4gLTAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDA3OTggaXNuYW4gMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMDc5OSBpc25hbiAtMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMDgwMCBpc25hbiAwLjA5OTk5OTk5OTkgLT4gMAorYm9vbDA4MDEgaXNuYW4gLTAuMDk5OTk5OTk5OSAtPiAwCitib29sMDgwMiBpc25hbiAwLjk5OTk5OTk5OSAtPiAwCitib29sMDgwMyBpc25hbiAtMC45OTk5OTk5OTkgLT4gMAorYm9vbDA4MDQgaXNuYW4gOS45OTk5OTk5OSAtPiAwCitib29sMDgwNSBpc25hbiAtOS45OTk5OTk5OSAtPiAwCitib29sMDgwNiBpc25hbiA5OS45OTk5OTk5IC0+IDAKK2Jvb2wwODA3IGlzbmFuIC05OS45OTk5OTk5IC0+IDAKK2Jvb2wwODA4IGlzbmFuIDk5OS45OTk5OTkgLT4gMAorYm9vbDA4MDkgaXNuYW4gLTk5OS45OTk5OTkgLT4gMAorYm9vbDA4MTAgaXNuYW4gOTk5OS45OTk5OSAtPiAwCitib29sMDgxMSBpc25hbiAtOTk5OS45OTk5OSAtPiAwCitib29sMDgxMiBpc25hbiA5OTk5OTk5Ljk5IC0+IDAKK2Jvb2wwODEzIGlzbmFuIC05OTk5OTk5Ljk5IC0+IDAKK2Jvb2wwODE0IGlzbmFuIDkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMDgxNSBpc25hbiAtOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wwODE2IGlzbmFuIDkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMDgxNyBpc25hbiAtOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wwODE4IGlzbmFuIDkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMDgxOSBpc25hbiAtOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wwODIwIGlzbmFuIDkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMDgyMSBpc25hbiAtOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wwODIyIGlzbmFuIDkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMDgyMyBpc25hbiAtOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wwODI0IGlzbmFuIDkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMDgyNSBpc25hbiAtOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wwODI2IGlzbmFuIDkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDA4MjcgaXNuYW4gLTkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDA4MjggaXNuYW4gOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMDgyOSBpc25hbiAtOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMDgzMCBpc25hbiBJbmZpbml0eSAtPiAwCitib29sMDgzMSBpc25hbiAtSW5maW5pdHkgLT4gMAorYm9vbDA4MzIgaXNuYW4gTmFOIC0+IDEKK2Jvb2wwODMzIGlzbmFuIC1OYU4gLT4gMQorYm9vbDA4MzQgaXNuYW4gTmFOMTIzIC0+IDEKK2Jvb2wwODM1IGlzbmFuIC1OYU4xMjMgLT4gMQorYm9vbDA4MzYgaXNuYW4gc05hTiAtPiAxCitib29sMDgzNyBpc25hbiAtc05hTiAtPiAxCitib29sMDgzOCBpc25hbiBzTmFOMTIzIC0+IDEKK2Jvb2wwODM5IGlzbmFuIC1zTmFOMTIzIC0+IDEKK2Jvb2wwODQwIGlzbm9ybWFsIDBFLTIwMDAgLT4gMAorYm9vbDA4NDEgaXNub3JtYWwgLTBFLTIwMDAgLT4gMAorYm9vbDA4NDIgaXNub3JtYWwgMEUtMTAwOCAtPiAwCitib29sMDg0MyBpc25vcm1hbCAtMEUtMTAwOCAtPiAwCitib29sMDg0NCBpc25vcm1hbCAwRS0xMDA3IC0+IDAKK2Jvb2wwODQ1IGlzbm9ybWFsIC0wRS0xMDA3IC0+IDAKK2Jvb2wwODQ2IGlzbm9ybWFsIDBFLTEwMDYgLT4gMAorYm9vbDA4NDcgaXNub3JtYWwgLTBFLTEwMDYgLT4gMAorYm9vbDA4NDggaXNub3JtYWwgMEUtMTAwMCAtPiAwCitib29sMDg0OSBpc25vcm1hbCAtMEUtMTAwMCAtPiAwCitib29sMDg1MCBpc25vcm1hbCAwRS05OTkgLT4gMAorYm9vbDA4NTEgaXNub3JtYWwgLTBFLTk5OSAtPiAwCitib29sMDg1MiBpc25vcm1hbCAwRS05OTggLT4gMAorYm9vbDA4NTMgaXNub3JtYWwgLTBFLTk5OCAtPiAwCitib29sMDg1NCBpc25vcm1hbCAwRS0xMDAgLT4gMAorYm9vbDA4NTUgaXNub3JtYWwgLTBFLTEwMCAtPiAwCitib29sMDg1NiBpc25vcm1hbCAwLjAwMDAwMCAtPiAwCitib29sMDg1NyBpc25vcm1hbCAtMC4wMDAwMDAgLT4gMAorYm9vbDA4NTggaXNub3JtYWwgMC4wMDAgLT4gMAorYm9vbDA4NTkgaXNub3JtYWwgLTAuMDAwIC0+IDAKK2Jvb2wwODYwIGlzbm9ybWFsIDAuMDAgLT4gMAorYm9vbDA4NjEgaXNub3JtYWwgLTAuMDAgLT4gMAorYm9vbDA4NjIgaXNub3JtYWwgMC4wIC0+IDAKK2Jvb2wwODYzIGlzbm9ybWFsIC0wLjAgLT4gMAorYm9vbDA4NjQgaXNub3JtYWwgMCAtPiAwCitib29sMDg2NSBpc25vcm1hbCAtMCAtPiAwCitib29sMDg2NiBpc25vcm1hbCAwRSsxIC0+IDAKK2Jvb2wwODY3IGlzbm9ybWFsIC0wRSsxIC0+IDAKK2Jvb2wwODY4IGlzbm9ybWFsIDBFKzIgLT4gMAorYm9vbDA4NjkgaXNub3JtYWwgLTBFKzIgLT4gMAorYm9vbDA4NzAgaXNub3JtYWwgMEUrMyAtPiAwCitib29sMDg3MSBpc25vcm1hbCAtMEUrMyAtPiAwCitib29sMDg3MiBpc25vcm1hbCAwRSs2IC0+IDAKK2Jvb2wwODczIGlzbm9ybWFsIC0wRSs2IC0+IDAKK2Jvb2wwODc0IGlzbm9ybWFsIDBFKzEwMCAtPiAwCitib29sMDg3NSBpc25vcm1hbCAtMEUrMTAwIC0+IDAKK2Jvb2wwODc2IGlzbm9ybWFsIDBFKzk5MCAtPiAwCitib29sMDg3NyBpc25vcm1hbCAtMEUrOTkwIC0+IDAKK2Jvb2wwODc4IGlzbm9ybWFsIDBFKzk5MSAtPiAwCitib29sMDg3OSBpc25vcm1hbCAtMEUrOTkxIC0+IDAKK2Jvb2wwODgwIGlzbm9ybWFsIDBFKzk5MiAtPiAwCitib29sMDg4MSBpc25vcm1hbCAtMEUrOTkyIC0+IDAKK2Jvb2wwODgyIGlzbm9ybWFsIDBFKzk5OCAtPiAwCitib29sMDg4MyBpc25vcm1hbCAtMEUrOTk4IC0+IDAKK2Jvb2wwODg0IGlzbm9ybWFsIDBFKzk5OSAtPiAwCitib29sMDg4NSBpc25vcm1hbCAtMEUrOTk5IC0+IDAKK2Jvb2wwODg2IGlzbm9ybWFsIDBFKzEwMDAgLT4gMAorYm9vbDA4ODcgaXNub3JtYWwgLTBFKzEwMDAgLT4gMAorYm9vbDA4ODggaXNub3JtYWwgMEUrMjAwMCAtPiAwCitib29sMDg4OSBpc25vcm1hbCAtMEUrMjAwMCAtPiAwCitib29sMDg5MCBpc25vcm1hbCAxRS0yMDAwIC0+IDAKK2Jvb2wwODkxIGlzbm9ybWFsIC0xRS0yMDAwIC0+IDAKK2Jvb2wwODkyIGlzbm9ybWFsIDFFLTEwMDggLT4gMAorYm9vbDA4OTMgaXNub3JtYWwgLTFFLTEwMDggLT4gMAorYm9vbDA4OTQgaXNub3JtYWwgMUUtMTAwNyAtPiAwCitib29sMDg5NSBpc25vcm1hbCAtMUUtMTAwNyAtPiAwCitib29sMDg5NiBpc25vcm1hbCAxRS0xMDA2IC0+IDAKK2Jvb2wwODk3IGlzbm9ybWFsIC0xRS0xMDA2IC0+IDAKK2Jvb2wwODk4IGlzbm9ybWFsIDFFLTEwMDAgLT4gMAorYm9vbDA4OTkgaXNub3JtYWwgLTFFLTEwMDAgLT4gMAorYm9vbDA5MDAgaXNub3JtYWwgMUUtOTk5IC0+IDEKK2Jvb2wwOTAxIGlzbm9ybWFsIC0xRS05OTkgLT4gMQorYm9vbDA5MDIgaXNub3JtYWwgMUUtOTk4IC0+IDEKK2Jvb2wwOTAzIGlzbm9ybWFsIC0xRS05OTggLT4gMQorYm9vbDA5MDQgaXNub3JtYWwgMUUtMTAwIC0+IDEKK2Jvb2wwOTA1IGlzbm9ybWFsIC0xRS0xMDAgLT4gMQorYm9vbDA5MDYgaXNub3JtYWwgMC4wMDAwMDEgLT4gMQorYm9vbDA5MDcgaXNub3JtYWwgLTAuMDAwMDAxIC0+IDEKK2Jvb2wwOTA4IGlzbm9ybWFsIDAuMDAxIC0+IDEKK2Jvb2wwOTA5IGlzbm9ybWFsIC0wLjAwMSAtPiAxCitib29sMDkxMCBpc25vcm1hbCAwLjAxIC0+IDEKK2Jvb2wwOTExIGlzbm9ybWFsIC0wLjAxIC0+IDEKK2Jvb2wwOTEyIGlzbm9ybWFsIDAuMSAtPiAxCitib29sMDkxMyBpc25vcm1hbCAtMC4xIC0+IDEKK2Jvb2wwOTE0IGlzbm9ybWFsIDEgLT4gMQorYm9vbDA5MTUgaXNub3JtYWwgLTEgLT4gMQorYm9vbDA5MTYgaXNub3JtYWwgMUUrMSAtPiAxCitib29sMDkxNyBpc25vcm1hbCAtMUUrMSAtPiAxCitib29sMDkxOCBpc25vcm1hbCAxRSsyIC0+IDEKK2Jvb2wwOTE5IGlzbm9ybWFsIC0xRSsyIC0+IDEKK2Jvb2wwOTIwIGlzbm9ybWFsIDFFKzMgLT4gMQorYm9vbDA5MjEgaXNub3JtYWwgLTFFKzMgLT4gMQorYm9vbDA5MjIgaXNub3JtYWwgMUUrNiAtPiAxCitib29sMDkyMyBpc25vcm1hbCAtMUUrNiAtPiAxCitib29sMDkyNCBpc25vcm1hbCAxRSsxMDAgLT4gMQorYm9vbDA5MjUgaXNub3JtYWwgLTFFKzEwMCAtPiAxCitib29sMDkyNiBpc25vcm1hbCAxRSs5OTAgLT4gMQorYm9vbDA5MjcgaXNub3JtYWwgLTFFKzk5MCAtPiAxCitib29sMDkyOCBpc25vcm1hbCAxRSs5OTEgLT4gMQorYm9vbDA5MjkgaXNub3JtYWwgLTFFKzk5MSAtPiAxCitib29sMDkzMCBpc25vcm1hbCAxRSs5OTIgLT4gMQorYm9vbDA5MzEgaXNub3JtYWwgLTFFKzk5MiAtPiAxCitib29sMDkzMiBpc25vcm1hbCAxRSs5OTggLT4gMQorYm9vbDA5MzMgaXNub3JtYWwgLTFFKzk5OCAtPiAxCitib29sMDkzNCBpc25vcm1hbCAxRSs5OTkgLT4gMQorYm9vbDA5MzUgaXNub3JtYWwgLTFFKzk5OSAtPiAxCitib29sMDkzNiBpc25vcm1hbCAxRSsxMDAwIC0+IDEKK2Jvb2wwOTM3IGlzbm9ybWFsIC0xRSsxMDAwIC0+IDEKK2Jvb2wwOTM4IGlzbm9ybWFsIDFFKzIwMDAgLT4gMQorYm9vbDA5MzkgaXNub3JtYWwgLTFFKzIwMDAgLT4gMQorYm9vbDA5NDAgaXNub3JtYWwgOUUtMjAwMCAtPiAwCitib29sMDk0MSBpc25vcm1hbCAtOUUtMjAwMCAtPiAwCitib29sMDk0MiBpc25vcm1hbCA5RS0xMDA4IC0+IDAKK2Jvb2wwOTQzIGlzbm9ybWFsIC05RS0xMDA4IC0+IDAKK2Jvb2wwOTQ0IGlzbm9ybWFsIDlFLTEwMDcgLT4gMAorYm9vbDA5NDUgaXNub3JtYWwgLTlFLTEwMDcgLT4gMAorYm9vbDA5NDYgaXNub3JtYWwgOUUtMTAwNiAtPiAwCitib29sMDk0NyBpc25vcm1hbCAtOUUtMTAwNiAtPiAwCitib29sMDk0OCBpc25vcm1hbCA5RS0xMDAwIC0+IDAKK2Jvb2wwOTQ5IGlzbm9ybWFsIC05RS0xMDAwIC0+IDAKK2Jvb2wwOTUwIGlzbm9ybWFsIDlFLTk5OSAtPiAxCitib29sMDk1MSBpc25vcm1hbCAtOUUtOTk5IC0+IDEKK2Jvb2wwOTUyIGlzbm9ybWFsIDlFLTk5OCAtPiAxCitib29sMDk1MyBpc25vcm1hbCAtOUUtOTk4IC0+IDEKK2Jvb2wwOTU0IGlzbm9ybWFsIDlFLTEwMCAtPiAxCitib29sMDk1NSBpc25vcm1hbCAtOUUtMTAwIC0+IDEKK2Jvb2wwOTU2IGlzbm9ybWFsIDAuMDAwMDA5IC0+IDEKK2Jvb2wwOTU3IGlzbm9ybWFsIC0wLjAwMDAwOSAtPiAxCitib29sMDk1OCBpc25vcm1hbCAwLjAwOSAtPiAxCitib29sMDk1OSBpc25vcm1hbCAtMC4wMDkgLT4gMQorYm9vbDA5NjAgaXNub3JtYWwgMC4wOSAtPiAxCitib29sMDk2MSBpc25vcm1hbCAtMC4wOSAtPiAxCitib29sMDk2MiBpc25vcm1hbCAwLjkgLT4gMQorYm9vbDA5NjMgaXNub3JtYWwgLTAuOSAtPiAxCitib29sMDk2NCBpc25vcm1hbCA5IC0+IDEKK2Jvb2wwOTY1IGlzbm9ybWFsIC05IC0+IDEKK2Jvb2wwOTY2IGlzbm9ybWFsIDlFKzEgLT4gMQorYm9vbDA5NjcgaXNub3JtYWwgLTlFKzEgLT4gMQorYm9vbDA5NjggaXNub3JtYWwgOUUrMiAtPiAxCitib29sMDk2OSBpc25vcm1hbCAtOUUrMiAtPiAxCitib29sMDk3MCBpc25vcm1hbCA5RSszIC0+IDEKK2Jvb2wwOTcxIGlzbm9ybWFsIC05RSszIC0+IDEKK2Jvb2wwOTcyIGlzbm9ybWFsIDlFKzYgLT4gMQorYm9vbDA5NzMgaXNub3JtYWwgLTlFKzYgLT4gMQorYm9vbDA5NzQgaXNub3JtYWwgOUUrMTAwIC0+IDEKK2Jvb2wwOTc1IGlzbm9ybWFsIC05RSsxMDAgLT4gMQorYm9vbDA5NzYgaXNub3JtYWwgOUUrOTkwIC0+IDEKK2Jvb2wwOTc3IGlzbm9ybWFsIC05RSs5OTAgLT4gMQorYm9vbDA5NzggaXNub3JtYWwgOUUrOTkxIC0+IDEKK2Jvb2wwOTc5IGlzbm9ybWFsIC05RSs5OTEgLT4gMQorYm9vbDA5ODAgaXNub3JtYWwgOUUrOTkyIC0+IDEKK2Jvb2wwOTgxIGlzbm9ybWFsIC05RSs5OTIgLT4gMQorYm9vbDA5ODIgaXNub3JtYWwgOUUrOTk4IC0+IDEKK2Jvb2wwOTgzIGlzbm9ybWFsIC05RSs5OTggLT4gMQorYm9vbDA5ODQgaXNub3JtYWwgOUUrOTk5IC0+IDEKK2Jvb2wwOTg1IGlzbm9ybWFsIC05RSs5OTkgLT4gMQorYm9vbDA5ODYgaXNub3JtYWwgOUUrMTAwMCAtPiAxCitib29sMDk4NyBpc25vcm1hbCAtOUUrMTAwMCAtPiAxCitib29sMDk4OCBpc25vcm1hbCA5RSsyMDAwIC0+IDEKK2Jvb2wwOTg5IGlzbm9ybWFsIC05RSsyMDAwIC0+IDEKK2Jvb2wwOTkwIGlzbm9ybWFsIDkuOTk5OTk5OTlFLTIwMDAgLT4gMAorYm9vbDA5OTEgaXNub3JtYWwgLTkuOTk5OTk5OTlFLTIwMDAgLT4gMAorYm9vbDA5OTIgaXNub3JtYWwgOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMDk5MyBpc25vcm1hbCAtOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMDk5NCBpc25vcm1hbCA5Ljk5OTk5OTk5RS0xMDA3IC0+IDAKK2Jvb2wwOTk1IGlzbm9ybWFsIC05Ljk5OTk5OTk5RS0xMDA3IC0+IDAKK2Jvb2wwOTk2IGlzbm9ybWFsIDkuOTk5OTk5OTlFLTEwMDYgLT4gMAorYm9vbDA5OTcgaXNub3JtYWwgLTkuOTk5OTk5OTlFLTEwMDYgLT4gMAorYm9vbDA5OTggaXNub3JtYWwgOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMDk5OSBpc25vcm1hbCAtOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMTAwMCBpc25vcm1hbCA5Ljk5OTk5OTk5RS05OTkgLT4gMQorYm9vbDEwMDEgaXNub3JtYWwgLTkuOTk5OTk5OTlFLTk5OSAtPiAxCitib29sMTAwMiBpc25vcm1hbCA5Ljk5OTk5OTk5RS05OTggLT4gMQorYm9vbDEwMDMgaXNub3JtYWwgLTkuOTk5OTk5OTlFLTk5OCAtPiAxCitib29sMTAwNCBpc25vcm1hbCA5Ljk5OTk5OTk5RS0xMDAgLT4gMQorYm9vbDEwMDUgaXNub3JtYWwgLTkuOTk5OTk5OTlFLTEwMCAtPiAxCitib29sMTAwNiBpc25vcm1hbCAwLjAwMDAwOTk5OTk5OTk5IC0+IDEKK2Jvb2wxMDA3IGlzbm9ybWFsIC0wLjAwMDAwOTk5OTk5OTk5IC0+IDEKK2Jvb2wxMDA4IGlzbm9ybWFsIDAuMDA5OTk5OTk5OTkgLT4gMQorYm9vbDEwMDkgaXNub3JtYWwgLTAuMDA5OTk5OTk5OTkgLT4gMQorYm9vbDEwMTAgaXNub3JtYWwgMC4wOTk5OTk5OTk5IC0+IDEKK2Jvb2wxMDExIGlzbm9ybWFsIC0wLjA5OTk5OTk5OTkgLT4gMQorYm9vbDEwMTIgaXNub3JtYWwgMC45OTk5OTk5OTkgLT4gMQorYm9vbDEwMTMgaXNub3JtYWwgLTAuOTk5OTk5OTk5IC0+IDEKK2Jvb2wxMDE0IGlzbm9ybWFsIDkuOTk5OTk5OTkgLT4gMQorYm9vbDEwMTUgaXNub3JtYWwgLTkuOTk5OTk5OTkgLT4gMQorYm9vbDEwMTYgaXNub3JtYWwgOTkuOTk5OTk5OSAtPiAxCitib29sMTAxNyBpc25vcm1hbCAtOTkuOTk5OTk5OSAtPiAxCitib29sMTAxOCBpc25vcm1hbCA5OTkuOTk5OTk5IC0+IDEKK2Jvb2wxMDE5IGlzbm9ybWFsIC05OTkuOTk5OTk5IC0+IDEKK2Jvb2wxMDIwIGlzbm9ybWFsIDk5OTkuOTk5OTkgLT4gMQorYm9vbDEwMjEgaXNub3JtYWwgLTk5OTkuOTk5OTkgLT4gMQorYm9vbDEwMjIgaXNub3JtYWwgOTk5OTk5OS45OSAtPiAxCitib29sMTAyMyBpc25vcm1hbCAtOTk5OTk5OS45OSAtPiAxCitib29sMTAyNCBpc25vcm1hbCA5Ljk5OTk5OTk5RSsxMDAgLT4gMQorYm9vbDEwMjUgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzEwMCAtPiAxCitib29sMTAyNiBpc25vcm1hbCA5Ljk5OTk5OTk5RSs5OTAgLT4gMQorYm9vbDEwMjcgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzk5MCAtPiAxCitib29sMTAyOCBpc25vcm1hbCA5Ljk5OTk5OTk5RSs5OTEgLT4gMQorYm9vbDEwMjkgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzk5MSAtPiAxCitib29sMTAzMCBpc25vcm1hbCA5Ljk5OTk5OTk5RSs5OTIgLT4gMQorYm9vbDEwMzEgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzk5MiAtPiAxCitib29sMTAzMiBpc25vcm1hbCA5Ljk5OTk5OTk5RSs5OTggLT4gMQorYm9vbDEwMzMgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzk5OCAtPiAxCitib29sMTAzNCBpc25vcm1hbCA5Ljk5OTk5OTk5RSs5OTkgLT4gMQorYm9vbDEwMzUgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzk5OSAtPiAxCitib29sMTAzNiBpc25vcm1hbCA5Ljk5OTk5OTk5RSsxMDAwIC0+IDEKK2Jvb2wxMDM3IGlzbm9ybWFsIC05Ljk5OTk5OTk5RSsxMDAwIC0+IDEKK2Jvb2wxMDM4IGlzbm9ybWFsIDkuOTk5OTk5OTlFKzIwMDAgLT4gMQorYm9vbDEwMzkgaXNub3JtYWwgLTkuOTk5OTk5OTlFKzIwMDAgLT4gMQorYm9vbDEwNDAgaXNub3JtYWwgSW5maW5pdHkgLT4gMAorYm9vbDEwNDEgaXNub3JtYWwgLUluZmluaXR5IC0+IDAKK2Jvb2wxMDQyIGlzbm9ybWFsIE5hTiAtPiAwCitib29sMTA0MyBpc25vcm1hbCAtTmFOIC0+IDAKK2Jvb2wxMDQ0IGlzbm9ybWFsIE5hTjEyMyAtPiAwCitib29sMTA0NSBpc25vcm1hbCAtTmFOMTIzIC0+IDAKK2Jvb2wxMDQ2IGlzbm9ybWFsIHNOYU4gLT4gMAorYm9vbDEwNDcgaXNub3JtYWwgLXNOYU4gLT4gMAorYm9vbDEwNDggaXNub3JtYWwgc05hTjEyMyAtPiAwCitib29sMTA0OSBpc25vcm1hbCAtc05hTjEyMyAtPiAwCitib29sMTA1MCBpc3FuYW4gMEUtMjAwMCAtPiAwCitib29sMTA1MSBpc3FuYW4gLTBFLTIwMDAgLT4gMAorYm9vbDEwNTIgaXNxbmFuIDBFLTEwMDggLT4gMAorYm9vbDEwNTMgaXNxbmFuIC0wRS0xMDA4IC0+IDAKK2Jvb2wxMDU0IGlzcW5hbiAwRS0xMDA3IC0+IDAKK2Jvb2wxMDU1IGlzcW5hbiAtMEUtMTAwNyAtPiAwCitib29sMTA1NiBpc3FuYW4gMEUtMTAwNiAtPiAwCitib29sMTA1NyBpc3FuYW4gLTBFLTEwMDYgLT4gMAorYm9vbDEwNTggaXNxbmFuIDBFLTEwMDAgLT4gMAorYm9vbDEwNTkgaXNxbmFuIC0wRS0xMDAwIC0+IDAKK2Jvb2wxMDYwIGlzcW5hbiAwRS05OTkgLT4gMAorYm9vbDEwNjEgaXNxbmFuIC0wRS05OTkgLT4gMAorYm9vbDEwNjIgaXNxbmFuIDBFLTk5OCAtPiAwCitib29sMTA2MyBpc3FuYW4gLTBFLTk5OCAtPiAwCitib29sMTA2NCBpc3FuYW4gMEUtMTAwIC0+IDAKK2Jvb2wxMDY1IGlzcW5hbiAtMEUtMTAwIC0+IDAKK2Jvb2wxMDY2IGlzcW5hbiAwLjAwMDAwMCAtPiAwCitib29sMTA2NyBpc3FuYW4gLTAuMDAwMDAwIC0+IDAKK2Jvb2wxMDY4IGlzcW5hbiAwLjAwMCAtPiAwCitib29sMTA2OSBpc3FuYW4gLTAuMDAwIC0+IDAKK2Jvb2wxMDcwIGlzcW5hbiAwLjAwIC0+IDAKK2Jvb2wxMDcxIGlzcW5hbiAtMC4wMCAtPiAwCitib29sMTA3MiBpc3FuYW4gMC4wIC0+IDAKK2Jvb2wxMDczIGlzcW5hbiAtMC4wIC0+IDAKK2Jvb2wxMDc0IGlzcW5hbiAwIC0+IDAKK2Jvb2wxMDc1IGlzcW5hbiAtMCAtPiAwCitib29sMTA3NiBpc3FuYW4gMEUrMSAtPiAwCitib29sMTA3NyBpc3FuYW4gLTBFKzEgLT4gMAorYm9vbDEwNzggaXNxbmFuIDBFKzIgLT4gMAorYm9vbDEwNzkgaXNxbmFuIC0wRSsyIC0+IDAKK2Jvb2wxMDgwIGlzcW5hbiAwRSszIC0+IDAKK2Jvb2wxMDgxIGlzcW5hbiAtMEUrMyAtPiAwCitib29sMTA4MiBpc3FuYW4gMEUrNiAtPiAwCitib29sMTA4MyBpc3FuYW4gLTBFKzYgLT4gMAorYm9vbDEwODQgaXNxbmFuIDBFKzEwMCAtPiAwCitib29sMTA4NSBpc3FuYW4gLTBFKzEwMCAtPiAwCitib29sMTA4NiBpc3FuYW4gMEUrOTkwIC0+IDAKK2Jvb2wxMDg3IGlzcW5hbiAtMEUrOTkwIC0+IDAKK2Jvb2wxMDg4IGlzcW5hbiAwRSs5OTEgLT4gMAorYm9vbDEwODkgaXNxbmFuIC0wRSs5OTEgLT4gMAorYm9vbDEwOTAgaXNxbmFuIDBFKzk5MiAtPiAwCitib29sMTA5MSBpc3FuYW4gLTBFKzk5MiAtPiAwCitib29sMTA5MiBpc3FuYW4gMEUrOTk4IC0+IDAKK2Jvb2wxMDkzIGlzcW5hbiAtMEUrOTk4IC0+IDAKK2Jvb2wxMDk0IGlzcW5hbiAwRSs5OTkgLT4gMAorYm9vbDEwOTUgaXNxbmFuIC0wRSs5OTkgLT4gMAorYm9vbDEwOTYgaXNxbmFuIDBFKzEwMDAgLT4gMAorYm9vbDEwOTcgaXNxbmFuIC0wRSsxMDAwIC0+IDAKK2Jvb2wxMDk4IGlzcW5hbiAwRSsyMDAwIC0+IDAKK2Jvb2wxMDk5IGlzcW5hbiAtMEUrMjAwMCAtPiAwCitib29sMTEwMCBpc3FuYW4gMUUtMjAwMCAtPiAwCitib29sMTEwMSBpc3FuYW4gLTFFLTIwMDAgLT4gMAorYm9vbDExMDIgaXNxbmFuIDFFLTEwMDggLT4gMAorYm9vbDExMDMgaXNxbmFuIC0xRS0xMDA4IC0+IDAKK2Jvb2wxMTA0IGlzcW5hbiAxRS0xMDA3IC0+IDAKK2Jvb2wxMTA1IGlzcW5hbiAtMUUtMTAwNyAtPiAwCitib29sMTEwNiBpc3FuYW4gMUUtMTAwNiAtPiAwCitib29sMTEwNyBpc3FuYW4gLTFFLTEwMDYgLT4gMAorYm9vbDExMDggaXNxbmFuIDFFLTEwMDAgLT4gMAorYm9vbDExMDkgaXNxbmFuIC0xRS0xMDAwIC0+IDAKK2Jvb2wxMTEwIGlzcW5hbiAxRS05OTkgLT4gMAorYm9vbDExMTEgaXNxbmFuIC0xRS05OTkgLT4gMAorYm9vbDExMTIgaXNxbmFuIDFFLTk5OCAtPiAwCitib29sMTExMyBpc3FuYW4gLTFFLTk5OCAtPiAwCitib29sMTExNCBpc3FuYW4gMUUtMTAwIC0+IDAKK2Jvb2wxMTE1IGlzcW5hbiAtMUUtMTAwIC0+IDAKK2Jvb2wxMTE2IGlzcW5hbiAwLjAwMDAwMSAtPiAwCitib29sMTExNyBpc3FuYW4gLTAuMDAwMDAxIC0+IDAKK2Jvb2wxMTE4IGlzcW5hbiAwLjAwMSAtPiAwCitib29sMTExOSBpc3FuYW4gLTAuMDAxIC0+IDAKK2Jvb2wxMTIwIGlzcW5hbiAwLjAxIC0+IDAKK2Jvb2wxMTIxIGlzcW5hbiAtMC4wMSAtPiAwCitib29sMTEyMiBpc3FuYW4gMC4xIC0+IDAKK2Jvb2wxMTIzIGlzcW5hbiAtMC4xIC0+IDAKK2Jvb2wxMTI0IGlzcW5hbiAxIC0+IDAKK2Jvb2wxMTI1IGlzcW5hbiAtMSAtPiAwCitib29sMTEyNiBpc3FuYW4gMUUrMSAtPiAwCitib29sMTEyNyBpc3FuYW4gLTFFKzEgLT4gMAorYm9vbDExMjggaXNxbmFuIDFFKzIgLT4gMAorYm9vbDExMjkgaXNxbmFuIC0xRSsyIC0+IDAKK2Jvb2wxMTMwIGlzcW5hbiAxRSszIC0+IDAKK2Jvb2wxMTMxIGlzcW5hbiAtMUUrMyAtPiAwCitib29sMTEzMiBpc3FuYW4gMUUrNiAtPiAwCitib29sMTEzMyBpc3FuYW4gLTFFKzYgLT4gMAorYm9vbDExMzQgaXNxbmFuIDFFKzEwMCAtPiAwCitib29sMTEzNSBpc3FuYW4gLTFFKzEwMCAtPiAwCitib29sMTEzNiBpc3FuYW4gMUUrOTkwIC0+IDAKK2Jvb2wxMTM3IGlzcW5hbiAtMUUrOTkwIC0+IDAKK2Jvb2wxMTM4IGlzcW5hbiAxRSs5OTEgLT4gMAorYm9vbDExMzkgaXNxbmFuIC0xRSs5OTEgLT4gMAorYm9vbDExNDAgaXNxbmFuIDFFKzk5MiAtPiAwCitib29sMTE0MSBpc3FuYW4gLTFFKzk5MiAtPiAwCitib29sMTE0MiBpc3FuYW4gMUUrOTk4IC0+IDAKK2Jvb2wxMTQzIGlzcW5hbiAtMUUrOTk4IC0+IDAKK2Jvb2wxMTQ0IGlzcW5hbiAxRSs5OTkgLT4gMAorYm9vbDExNDUgaXNxbmFuIC0xRSs5OTkgLT4gMAorYm9vbDExNDYgaXNxbmFuIDFFKzEwMDAgLT4gMAorYm9vbDExNDcgaXNxbmFuIC0xRSsxMDAwIC0+IDAKK2Jvb2wxMTQ4IGlzcW5hbiAxRSsyMDAwIC0+IDAKK2Jvb2wxMTQ5IGlzcW5hbiAtMUUrMjAwMCAtPiAwCitib29sMTE1MCBpc3FuYW4gOUUtMjAwMCAtPiAwCitib29sMTE1MSBpc3FuYW4gLTlFLTIwMDAgLT4gMAorYm9vbDExNTIgaXNxbmFuIDlFLTEwMDggLT4gMAorYm9vbDExNTMgaXNxbmFuIC05RS0xMDA4IC0+IDAKK2Jvb2wxMTU0IGlzcW5hbiA5RS0xMDA3IC0+IDAKK2Jvb2wxMTU1IGlzcW5hbiAtOUUtMTAwNyAtPiAwCitib29sMTE1NiBpc3FuYW4gOUUtMTAwNiAtPiAwCitib29sMTE1NyBpc3FuYW4gLTlFLTEwMDYgLT4gMAorYm9vbDExNTggaXNxbmFuIDlFLTEwMDAgLT4gMAorYm9vbDExNTkgaXNxbmFuIC05RS0xMDAwIC0+IDAKK2Jvb2wxMTYwIGlzcW5hbiA5RS05OTkgLT4gMAorYm9vbDExNjEgaXNxbmFuIC05RS05OTkgLT4gMAorYm9vbDExNjIgaXNxbmFuIDlFLTk5OCAtPiAwCitib29sMTE2MyBpc3FuYW4gLTlFLTk5OCAtPiAwCitib29sMTE2NCBpc3FuYW4gOUUtMTAwIC0+IDAKK2Jvb2wxMTY1IGlzcW5hbiAtOUUtMTAwIC0+IDAKK2Jvb2wxMTY2IGlzcW5hbiAwLjAwMDAwOSAtPiAwCitib29sMTE2NyBpc3FuYW4gLTAuMDAwMDA5IC0+IDAKK2Jvb2wxMTY4IGlzcW5hbiAwLjAwOSAtPiAwCitib29sMTE2OSBpc3FuYW4gLTAuMDA5IC0+IDAKK2Jvb2wxMTcwIGlzcW5hbiAwLjA5IC0+IDAKK2Jvb2wxMTcxIGlzcW5hbiAtMC4wOSAtPiAwCitib29sMTE3MiBpc3FuYW4gMC45IC0+IDAKK2Jvb2wxMTczIGlzcW5hbiAtMC45IC0+IDAKK2Jvb2wxMTc0IGlzcW5hbiA5IC0+IDAKK2Jvb2wxMTc1IGlzcW5hbiAtOSAtPiAwCitib29sMTE3NiBpc3FuYW4gOUUrMSAtPiAwCitib29sMTE3NyBpc3FuYW4gLTlFKzEgLT4gMAorYm9vbDExNzggaXNxbmFuIDlFKzIgLT4gMAorYm9vbDExNzkgaXNxbmFuIC05RSsyIC0+IDAKK2Jvb2wxMTgwIGlzcW5hbiA5RSszIC0+IDAKK2Jvb2wxMTgxIGlzcW5hbiAtOUUrMyAtPiAwCitib29sMTE4MiBpc3FuYW4gOUUrNiAtPiAwCitib29sMTE4MyBpc3FuYW4gLTlFKzYgLT4gMAorYm9vbDExODQgaXNxbmFuIDlFKzEwMCAtPiAwCitib29sMTE4NSBpc3FuYW4gLTlFKzEwMCAtPiAwCitib29sMTE4NiBpc3FuYW4gOUUrOTkwIC0+IDAKK2Jvb2wxMTg3IGlzcW5hbiAtOUUrOTkwIC0+IDAKK2Jvb2wxMTg4IGlzcW5hbiA5RSs5OTEgLT4gMAorYm9vbDExODkgaXNxbmFuIC05RSs5OTEgLT4gMAorYm9vbDExOTAgaXNxbmFuIDlFKzk5MiAtPiAwCitib29sMTE5MSBpc3FuYW4gLTlFKzk5MiAtPiAwCitib29sMTE5MiBpc3FuYW4gOUUrOTk4IC0+IDAKK2Jvb2wxMTkzIGlzcW5hbiAtOUUrOTk4IC0+IDAKK2Jvb2wxMTk0IGlzcW5hbiA5RSs5OTkgLT4gMAorYm9vbDExOTUgaXNxbmFuIC05RSs5OTkgLT4gMAorYm9vbDExOTYgaXNxbmFuIDlFKzEwMDAgLT4gMAorYm9vbDExOTcgaXNxbmFuIC05RSsxMDAwIC0+IDAKK2Jvb2wxMTk4IGlzcW5hbiA5RSsyMDAwIC0+IDAKK2Jvb2wxMTk5IGlzcW5hbiAtOUUrMjAwMCAtPiAwCitib29sMTIwMCBpc3FuYW4gOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMTIwMSBpc3FuYW4gLTkuOTk5OTk5OTlFLTIwMDAgLT4gMAorYm9vbDEyMDIgaXNxbmFuIDkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDEyMDMgaXNxbmFuIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wxMjA0IGlzcW5hbiA5Ljk5OTk5OTk5RS0xMDA3IC0+IDAKK2Jvb2wxMjA1IGlzcW5hbiAtOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMTIwNiBpc3FuYW4gOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMTIwNyBpc3FuYW4gLTkuOTk5OTk5OTlFLTEwMDYgLT4gMAorYm9vbDEyMDggaXNxbmFuIDkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDEyMDkgaXNxbmFuIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wxMjEwIGlzcW5hbiA5Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDEyMTEgaXNxbmFuIC05Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDEyMTIgaXNxbmFuIDkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMTIxMyBpc3FuYW4gLTkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMTIxNCBpc3FuYW4gOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wxMjE1IGlzcW5hbiAtOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wxMjE2IGlzcW5hbiAwLjAwMDAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxMjE3IGlzcW5hbiAtMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMTIxOCBpc3FuYW4gMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMTIxOSBpc3FuYW4gLTAuMDA5OTk5OTk5OTkgLT4gMAorYm9vbDEyMjAgaXNxbmFuIDAuMDk5OTk5OTk5OSAtPiAwCitib29sMTIyMSBpc3FuYW4gLTAuMDk5OTk5OTk5OSAtPiAwCitib29sMTIyMiBpc3FuYW4gMC45OTk5OTk5OTkgLT4gMAorYm9vbDEyMjMgaXNxbmFuIC0wLjk5OTk5OTk5OSAtPiAwCitib29sMTIyNCBpc3FuYW4gOS45OTk5OTk5OSAtPiAwCitib29sMTIyNSBpc3FuYW4gLTkuOTk5OTk5OTkgLT4gMAorYm9vbDEyMjYgaXNxbmFuIDk5Ljk5OTk5OTkgLT4gMAorYm9vbDEyMjcgaXNxbmFuIC05OS45OTk5OTk5IC0+IDAKK2Jvb2wxMjI4IGlzcW5hbiA5OTkuOTk5OTk5IC0+IDAKK2Jvb2wxMjI5IGlzcW5hbiAtOTk5Ljk5OTk5OSAtPiAwCitib29sMTIzMCBpc3FuYW4gOTk5OS45OTk5OSAtPiAwCitib29sMTIzMSBpc3FuYW4gLTk5OTkuOTk5OTkgLT4gMAorYm9vbDEyMzIgaXNxbmFuIDk5OTk5OTkuOTkgLT4gMAorYm9vbDEyMzMgaXNxbmFuIC05OTk5OTk5Ljk5IC0+IDAKK2Jvb2wxMjM0IGlzcW5hbiA5Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDEyMzUgaXNxbmFuIC05Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDEyMzYgaXNxbmFuIDkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMTIzNyBpc3FuYW4gLTkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMTIzOCBpc3FuYW4gOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wxMjM5IGlzcW5hbiAtOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wxMjQwIGlzcW5hbiA5Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDEyNDEgaXNxbmFuIC05Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDEyNDIgaXNxbmFuIDkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMTI0MyBpc3FuYW4gLTkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMTI0NCBpc3FuYW4gOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wxMjQ1IGlzcW5hbiAtOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wxMjQ2IGlzcW5hbiA5Ljk5OTk5OTk5RSsxMDAwIC0+IDAKK2Jvb2wxMjQ3IGlzcW5hbiAtOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMTI0OCBpc3FuYW4gOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMTI0OSBpc3FuYW4gLTkuOTk5OTk5OTlFKzIwMDAgLT4gMAorYm9vbDEyNTAgaXNxbmFuIEluZmluaXR5IC0+IDAKK2Jvb2wxMjUxIGlzcW5hbiAtSW5maW5pdHkgLT4gMAorYm9vbDEyNTIgaXNxbmFuIE5hTiAtPiAxCitib29sMTI1MyBpc3FuYW4gLU5hTiAtPiAxCitib29sMTI1NCBpc3FuYW4gTmFOMTIzIC0+IDEKK2Jvb2wxMjU1IGlzcW5hbiAtTmFOMTIzIC0+IDEKK2Jvb2wxMjU2IGlzcW5hbiBzTmFOIC0+IDAKK2Jvb2wxMjU3IGlzcW5hbiAtc05hTiAtPiAwCitib29sMTI1OCBpc3FuYW4gc05hTjEyMyAtPiAwCitib29sMTI1OSBpc3FuYW4gLXNOYU4xMjMgLT4gMAorYm9vbDEyNjAgaXNzaWduZWQgMEUtMjAwMCAtPiAwCitib29sMTI2MSBpc3NpZ25lZCAtMEUtMjAwMCAtPiAxCitib29sMTI2MiBpc3NpZ25lZCAwRS0xMDA4IC0+IDAKK2Jvb2wxMjYzIGlzc2lnbmVkIC0wRS0xMDA4IC0+IDEKK2Jvb2wxMjY0IGlzc2lnbmVkIDBFLTEwMDcgLT4gMAorYm9vbDEyNjUgaXNzaWduZWQgLTBFLTEwMDcgLT4gMQorYm9vbDEyNjYgaXNzaWduZWQgMEUtMTAwNiAtPiAwCitib29sMTI2NyBpc3NpZ25lZCAtMEUtMTAwNiAtPiAxCitib29sMTI2OCBpc3NpZ25lZCAwRS0xMDAwIC0+IDAKK2Jvb2wxMjY5IGlzc2lnbmVkIC0wRS0xMDAwIC0+IDEKK2Jvb2wxMjcwIGlzc2lnbmVkIDBFLTk5OSAtPiAwCitib29sMTI3MSBpc3NpZ25lZCAtMEUtOTk5IC0+IDEKK2Jvb2wxMjcyIGlzc2lnbmVkIDBFLTk5OCAtPiAwCitib29sMTI3MyBpc3NpZ25lZCAtMEUtOTk4IC0+IDEKK2Jvb2wxMjc0IGlzc2lnbmVkIDBFLTEwMCAtPiAwCitib29sMTI3NSBpc3NpZ25lZCAtMEUtMTAwIC0+IDEKK2Jvb2wxMjc2IGlzc2lnbmVkIDAuMDAwMDAwIC0+IDAKK2Jvb2wxMjc3IGlzc2lnbmVkIC0wLjAwMDAwMCAtPiAxCitib29sMTI3OCBpc3NpZ25lZCAwLjAwMCAtPiAwCitib29sMTI3OSBpc3NpZ25lZCAtMC4wMDAgLT4gMQorYm9vbDEyODAgaXNzaWduZWQgMC4wMCAtPiAwCitib29sMTI4MSBpc3NpZ25lZCAtMC4wMCAtPiAxCitib29sMTI4MiBpc3NpZ25lZCAwLjAgLT4gMAorYm9vbDEyODMgaXNzaWduZWQgLTAuMCAtPiAxCitib29sMTI4NCBpc3NpZ25lZCAwIC0+IDAKK2Jvb2wxMjg1IGlzc2lnbmVkIC0wIC0+IDEKK2Jvb2wxMjg2IGlzc2lnbmVkIDBFKzEgLT4gMAorYm9vbDEyODcgaXNzaWduZWQgLTBFKzEgLT4gMQorYm9vbDEyODggaXNzaWduZWQgMEUrMiAtPiAwCitib29sMTI4OSBpc3NpZ25lZCAtMEUrMiAtPiAxCitib29sMTI5MCBpc3NpZ25lZCAwRSszIC0+IDAKK2Jvb2wxMjkxIGlzc2lnbmVkIC0wRSszIC0+IDEKK2Jvb2wxMjkyIGlzc2lnbmVkIDBFKzYgLT4gMAorYm9vbDEyOTMgaXNzaWduZWQgLTBFKzYgLT4gMQorYm9vbDEyOTQgaXNzaWduZWQgMEUrMTAwIC0+IDAKK2Jvb2wxMjk1IGlzc2lnbmVkIC0wRSsxMDAgLT4gMQorYm9vbDEyOTYgaXNzaWduZWQgMEUrOTkwIC0+IDAKK2Jvb2wxMjk3IGlzc2lnbmVkIC0wRSs5OTAgLT4gMQorYm9vbDEyOTggaXNzaWduZWQgMEUrOTkxIC0+IDAKK2Jvb2wxMjk5IGlzc2lnbmVkIC0wRSs5OTEgLT4gMQorYm9vbDEzMDAgaXNzaWduZWQgMEUrOTkyIC0+IDAKK2Jvb2wxMzAxIGlzc2lnbmVkIC0wRSs5OTIgLT4gMQorYm9vbDEzMDIgaXNzaWduZWQgMEUrOTk4IC0+IDAKK2Jvb2wxMzAzIGlzc2lnbmVkIC0wRSs5OTggLT4gMQorYm9vbDEzMDQgaXNzaWduZWQgMEUrOTk5IC0+IDAKK2Jvb2wxMzA1IGlzc2lnbmVkIC0wRSs5OTkgLT4gMQorYm9vbDEzMDYgaXNzaWduZWQgMEUrMTAwMCAtPiAwCitib29sMTMwNyBpc3NpZ25lZCAtMEUrMTAwMCAtPiAxCitib29sMTMwOCBpc3NpZ25lZCAwRSsyMDAwIC0+IDAKK2Jvb2wxMzA5IGlzc2lnbmVkIC0wRSsyMDAwIC0+IDEKK2Jvb2wxMzEwIGlzc2lnbmVkIDFFLTIwMDAgLT4gMAorYm9vbDEzMTEgaXNzaWduZWQgLTFFLTIwMDAgLT4gMQorYm9vbDEzMTIgaXNzaWduZWQgMUUtMTAwOCAtPiAwCitib29sMTMxMyBpc3NpZ25lZCAtMUUtMTAwOCAtPiAxCitib29sMTMxNCBpc3NpZ25lZCAxRS0xMDA3IC0+IDAKK2Jvb2wxMzE1IGlzc2lnbmVkIC0xRS0xMDA3IC0+IDEKK2Jvb2wxMzE2IGlzc2lnbmVkIDFFLTEwMDYgLT4gMAorYm9vbDEzMTcgaXNzaWduZWQgLTFFLTEwMDYgLT4gMQorYm9vbDEzMTggaXNzaWduZWQgMUUtMTAwMCAtPiAwCitib29sMTMxOSBpc3NpZ25lZCAtMUUtMTAwMCAtPiAxCitib29sMTMyMCBpc3NpZ25lZCAxRS05OTkgLT4gMAorYm9vbDEzMjEgaXNzaWduZWQgLTFFLTk5OSAtPiAxCitib29sMTMyMiBpc3NpZ25lZCAxRS05OTggLT4gMAorYm9vbDEzMjMgaXNzaWduZWQgLTFFLTk5OCAtPiAxCitib29sMTMyNCBpc3NpZ25lZCAxRS0xMDAgLT4gMAorYm9vbDEzMjUgaXNzaWduZWQgLTFFLTEwMCAtPiAxCitib29sMTMyNiBpc3NpZ25lZCAwLjAwMDAwMSAtPiAwCitib29sMTMyNyBpc3NpZ25lZCAtMC4wMDAwMDEgLT4gMQorYm9vbDEzMjggaXNzaWduZWQgMC4wMDEgLT4gMAorYm9vbDEzMjkgaXNzaWduZWQgLTAuMDAxIC0+IDEKK2Jvb2wxMzMwIGlzc2lnbmVkIDAuMDEgLT4gMAorYm9vbDEzMzEgaXNzaWduZWQgLTAuMDEgLT4gMQorYm9vbDEzMzIgaXNzaWduZWQgMC4xIC0+IDAKK2Jvb2wxMzMzIGlzc2lnbmVkIC0wLjEgLT4gMQorYm9vbDEzMzQgaXNzaWduZWQgMSAtPiAwCitib29sMTMzNSBpc3NpZ25lZCAtMSAtPiAxCitib29sMTMzNiBpc3NpZ25lZCAxRSsxIC0+IDAKK2Jvb2wxMzM3IGlzc2lnbmVkIC0xRSsxIC0+IDEKK2Jvb2wxMzM4IGlzc2lnbmVkIDFFKzIgLT4gMAorYm9vbDEzMzkgaXNzaWduZWQgLTFFKzIgLT4gMQorYm9vbDEzNDAgaXNzaWduZWQgMUUrMyAtPiAwCitib29sMTM0MSBpc3NpZ25lZCAtMUUrMyAtPiAxCitib29sMTM0MiBpc3NpZ25lZCAxRSs2IC0+IDAKK2Jvb2wxMzQzIGlzc2lnbmVkIC0xRSs2IC0+IDEKK2Jvb2wxMzQ0IGlzc2lnbmVkIDFFKzEwMCAtPiAwCitib29sMTM0NSBpc3NpZ25lZCAtMUUrMTAwIC0+IDEKK2Jvb2wxMzQ2IGlzc2lnbmVkIDFFKzk5MCAtPiAwCitib29sMTM0NyBpc3NpZ25lZCAtMUUrOTkwIC0+IDEKK2Jvb2wxMzQ4IGlzc2lnbmVkIDFFKzk5MSAtPiAwCitib29sMTM0OSBpc3NpZ25lZCAtMUUrOTkxIC0+IDEKK2Jvb2wxMzUwIGlzc2lnbmVkIDFFKzk5MiAtPiAwCitib29sMTM1MSBpc3NpZ25lZCAtMUUrOTkyIC0+IDEKK2Jvb2wxMzUyIGlzc2lnbmVkIDFFKzk5OCAtPiAwCitib29sMTM1MyBpc3NpZ25lZCAtMUUrOTk4IC0+IDEKK2Jvb2wxMzU0IGlzc2lnbmVkIDFFKzk5OSAtPiAwCitib29sMTM1NSBpc3NpZ25lZCAtMUUrOTk5IC0+IDEKK2Jvb2wxMzU2IGlzc2lnbmVkIDFFKzEwMDAgLT4gMAorYm9vbDEzNTcgaXNzaWduZWQgLTFFKzEwMDAgLT4gMQorYm9vbDEzNTggaXNzaWduZWQgMUUrMjAwMCAtPiAwCitib29sMTM1OSBpc3NpZ25lZCAtMUUrMjAwMCAtPiAxCitib29sMTM2MCBpc3NpZ25lZCA5RS0yMDAwIC0+IDAKK2Jvb2wxMzYxIGlzc2lnbmVkIC05RS0yMDAwIC0+IDEKK2Jvb2wxMzYyIGlzc2lnbmVkIDlFLTEwMDggLT4gMAorYm9vbDEzNjMgaXNzaWduZWQgLTlFLTEwMDggLT4gMQorYm9vbDEzNjQgaXNzaWduZWQgOUUtMTAwNyAtPiAwCitib29sMTM2NSBpc3NpZ25lZCAtOUUtMTAwNyAtPiAxCitib29sMTM2NiBpc3NpZ25lZCA5RS0xMDA2IC0+IDAKK2Jvb2wxMzY3IGlzc2lnbmVkIC05RS0xMDA2IC0+IDEKK2Jvb2wxMzY4IGlzc2lnbmVkIDlFLTEwMDAgLT4gMAorYm9vbDEzNjkgaXNzaWduZWQgLTlFLTEwMDAgLT4gMQorYm9vbDEzNzAgaXNzaWduZWQgOUUtOTk5IC0+IDAKK2Jvb2wxMzcxIGlzc2lnbmVkIC05RS05OTkgLT4gMQorYm9vbDEzNzIgaXNzaWduZWQgOUUtOTk4IC0+IDAKK2Jvb2wxMzczIGlzc2lnbmVkIC05RS05OTggLT4gMQorYm9vbDEzNzQgaXNzaWduZWQgOUUtMTAwIC0+IDAKK2Jvb2wxMzc1IGlzc2lnbmVkIC05RS0xMDAgLT4gMQorYm9vbDEzNzYgaXNzaWduZWQgMC4wMDAwMDkgLT4gMAorYm9vbDEzNzcgaXNzaWduZWQgLTAuMDAwMDA5IC0+IDEKK2Jvb2wxMzc4IGlzc2lnbmVkIDAuMDA5IC0+IDAKK2Jvb2wxMzc5IGlzc2lnbmVkIC0wLjAwOSAtPiAxCitib29sMTM4MCBpc3NpZ25lZCAwLjA5IC0+IDAKK2Jvb2wxMzgxIGlzc2lnbmVkIC0wLjA5IC0+IDEKK2Jvb2wxMzgyIGlzc2lnbmVkIDAuOSAtPiAwCitib29sMTM4MyBpc3NpZ25lZCAtMC45IC0+IDEKK2Jvb2wxMzg0IGlzc2lnbmVkIDkgLT4gMAorYm9vbDEzODUgaXNzaWduZWQgLTkgLT4gMQorYm9vbDEzODYgaXNzaWduZWQgOUUrMSAtPiAwCitib29sMTM4NyBpc3NpZ25lZCAtOUUrMSAtPiAxCitib29sMTM4OCBpc3NpZ25lZCA5RSsyIC0+IDAKK2Jvb2wxMzg5IGlzc2lnbmVkIC05RSsyIC0+IDEKK2Jvb2wxMzkwIGlzc2lnbmVkIDlFKzMgLT4gMAorYm9vbDEzOTEgaXNzaWduZWQgLTlFKzMgLT4gMQorYm9vbDEzOTIgaXNzaWduZWQgOUUrNiAtPiAwCitib29sMTM5MyBpc3NpZ25lZCAtOUUrNiAtPiAxCitib29sMTM5NCBpc3NpZ25lZCA5RSsxMDAgLT4gMAorYm9vbDEzOTUgaXNzaWduZWQgLTlFKzEwMCAtPiAxCitib29sMTM5NiBpc3NpZ25lZCA5RSs5OTAgLT4gMAorYm9vbDEzOTcgaXNzaWduZWQgLTlFKzk5MCAtPiAxCitib29sMTM5OCBpc3NpZ25lZCA5RSs5OTEgLT4gMAorYm9vbDEzOTkgaXNzaWduZWQgLTlFKzk5MSAtPiAxCitib29sMTQwMCBpc3NpZ25lZCA5RSs5OTIgLT4gMAorYm9vbDE0MDEgaXNzaWduZWQgLTlFKzk5MiAtPiAxCitib29sMTQwMiBpc3NpZ25lZCA5RSs5OTggLT4gMAorYm9vbDE0MDMgaXNzaWduZWQgLTlFKzk5OCAtPiAxCitib29sMTQwNCBpc3NpZ25lZCA5RSs5OTkgLT4gMAorYm9vbDE0MDUgaXNzaWduZWQgLTlFKzk5OSAtPiAxCitib29sMTQwNiBpc3NpZ25lZCA5RSsxMDAwIC0+IDAKK2Jvb2wxNDA3IGlzc2lnbmVkIC05RSsxMDAwIC0+IDEKK2Jvb2wxNDA4IGlzc2lnbmVkIDlFKzIwMDAgLT4gMAorYm9vbDE0MDkgaXNzaWduZWQgLTlFKzIwMDAgLT4gMQorYm9vbDE0MTAgaXNzaWduZWQgOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMTQxMSBpc3NpZ25lZCAtOS45OTk5OTk5OUUtMjAwMCAtPiAxCitib29sMTQxMiBpc3NpZ25lZCA5Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wxNDEzIGlzc2lnbmVkIC05Ljk5OTk5OTk5RS0xMDA4IC0+IDEKK2Jvb2wxNDE0IGlzc2lnbmVkIDkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDE0MTUgaXNzaWduZWQgLTkuOTk5OTk5OTlFLTEwMDcgLT4gMQorYm9vbDE0MTYgaXNzaWduZWQgOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMTQxNyBpc3NpZ25lZCAtOS45OTk5OTk5OUUtMTAwNiAtPiAxCitib29sMTQxOCBpc3NpZ25lZCA5Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wxNDE5IGlzc2lnbmVkIC05Ljk5OTk5OTk5RS0xMDAwIC0+IDEKK2Jvb2wxNDIwIGlzc2lnbmVkIDkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMTQyMSBpc3NpZ25lZCAtOS45OTk5OTk5OUUtOTk5IC0+IDEKK2Jvb2wxNDIyIGlzc2lnbmVkIDkuOTk5OTk5OTlFLTk5OCAtPiAwCitib29sMTQyMyBpc3NpZ25lZCAtOS45OTk5OTk5OUUtOTk4IC0+IDEKK2Jvb2wxNDI0IGlzc2lnbmVkIDkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMTQyNSBpc3NpZ25lZCAtOS45OTk5OTk5OUUtMTAwIC0+IDEKK2Jvb2wxNDI2IGlzc2lnbmVkIDAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDE0MjcgaXNzaWduZWQgLTAuMDAwMDA5OTk5OTk5OTkgLT4gMQorYm9vbDE0MjggaXNzaWduZWQgMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMTQyOSBpc3NpZ25lZCAtMC4wMDk5OTk5OTk5OSAtPiAxCitib29sMTQzMCBpc3NpZ25lZCAwLjA5OTk5OTk5OTkgLT4gMAorYm9vbDE0MzEgaXNzaWduZWQgLTAuMDk5OTk5OTk5OSAtPiAxCitib29sMTQzMiBpc3NpZ25lZCAwLjk5OTk5OTk5OSAtPiAwCitib29sMTQzMyBpc3NpZ25lZCAtMC45OTk5OTk5OTkgLT4gMQorYm9vbDE0MzQgaXNzaWduZWQgOS45OTk5OTk5OSAtPiAwCitib29sMTQzNSBpc3NpZ25lZCAtOS45OTk5OTk5OSAtPiAxCitib29sMTQzNiBpc3NpZ25lZCA5OS45OTk5OTk5IC0+IDAKK2Jvb2wxNDM3IGlzc2lnbmVkIC05OS45OTk5OTk5IC0+IDEKK2Jvb2wxNDM4IGlzc2lnbmVkIDk5OS45OTk5OTkgLT4gMAorYm9vbDE0MzkgaXNzaWduZWQgLTk5OS45OTk5OTkgLT4gMQorYm9vbDE0NDAgaXNzaWduZWQgOTk5OS45OTk5OSAtPiAwCitib29sMTQ0MSBpc3NpZ25lZCAtOTk5OS45OTk5OSAtPiAxCitib29sMTQ0MiBpc3NpZ25lZCA5OTk5OTk5Ljk5IC0+IDAKK2Jvb2wxNDQzIGlzc2lnbmVkIC05OTk5OTk5Ljk5IC0+IDEKK2Jvb2wxNDQ0IGlzc2lnbmVkIDkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMTQ0NSBpc3NpZ25lZCAtOS45OTk5OTk5OUUrMTAwIC0+IDEKK2Jvb2wxNDQ2IGlzc2lnbmVkIDkuOTk5OTk5OTlFKzk5MCAtPiAwCitib29sMTQ0NyBpc3NpZ25lZCAtOS45OTk5OTk5OUUrOTkwIC0+IDEKK2Jvb2wxNDQ4IGlzc2lnbmVkIDkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMTQ0OSBpc3NpZ25lZCAtOS45OTk5OTk5OUUrOTkxIC0+IDEKK2Jvb2wxNDUwIGlzc2lnbmVkIDkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMTQ1MSBpc3NpZ25lZCAtOS45OTk5OTk5OUUrOTkyIC0+IDEKK2Jvb2wxNDUyIGlzc2lnbmVkIDkuOTk5OTk5OTlFKzk5OCAtPiAwCitib29sMTQ1MyBpc3NpZ25lZCAtOS45OTk5OTk5OUUrOTk4IC0+IDEKK2Jvb2wxNDU0IGlzc2lnbmVkIDkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMTQ1NSBpc3NpZ25lZCAtOS45OTk5OTk5OUUrOTk5IC0+IDEKK2Jvb2wxNDU2IGlzc2lnbmVkIDkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDE0NTcgaXNzaWduZWQgLTkuOTk5OTk5OTlFKzEwMDAgLT4gMQorYm9vbDE0NTggaXNzaWduZWQgOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMTQ1OSBpc3NpZ25lZCAtOS45OTk5OTk5OUUrMjAwMCAtPiAxCitib29sMTQ2MCBpc3NpZ25lZCBJbmZpbml0eSAtPiAwCitib29sMTQ2MSBpc3NpZ25lZCAtSW5maW5pdHkgLT4gMQorYm9vbDE0NjIgaXNzaWduZWQgTmFOIC0+IDAKK2Jvb2wxNDYzIGlzc2lnbmVkIC1OYU4gLT4gMQorYm9vbDE0NjQgaXNzaWduZWQgTmFOMTIzIC0+IDAKK2Jvb2wxNDY1IGlzc2lnbmVkIC1OYU4xMjMgLT4gMQorYm9vbDE0NjYgaXNzaWduZWQgc05hTiAtPiAwCitib29sMTQ2NyBpc3NpZ25lZCAtc05hTiAtPiAxCitib29sMTQ2OCBpc3NpZ25lZCBzTmFOMTIzIC0+IDAKK2Jvb2wxNDY5IGlzc2lnbmVkIC1zTmFOMTIzIC0+IDEKK2Jvb2wxNDcwIGlzc25hbiAwRS0yMDAwIC0+IDAKK2Jvb2wxNDcxIGlzc25hbiAtMEUtMjAwMCAtPiAwCitib29sMTQ3MiBpc3NuYW4gMEUtMTAwOCAtPiAwCitib29sMTQ3MyBpc3NuYW4gLTBFLTEwMDggLT4gMAorYm9vbDE0NzQgaXNzbmFuIDBFLTEwMDcgLT4gMAorYm9vbDE0NzUgaXNzbmFuIC0wRS0xMDA3IC0+IDAKK2Jvb2wxNDc2IGlzc25hbiAwRS0xMDA2IC0+IDAKK2Jvb2wxNDc3IGlzc25hbiAtMEUtMTAwNiAtPiAwCitib29sMTQ3OCBpc3NuYW4gMEUtMTAwMCAtPiAwCitib29sMTQ3OSBpc3NuYW4gLTBFLTEwMDAgLT4gMAorYm9vbDE0ODAgaXNzbmFuIDBFLTk5OSAtPiAwCitib29sMTQ4MSBpc3NuYW4gLTBFLTk5OSAtPiAwCitib29sMTQ4MiBpc3NuYW4gMEUtOTk4IC0+IDAKK2Jvb2wxNDgzIGlzc25hbiAtMEUtOTk4IC0+IDAKK2Jvb2wxNDg0IGlzc25hbiAwRS0xMDAgLT4gMAorYm9vbDE0ODUgaXNzbmFuIC0wRS0xMDAgLT4gMAorYm9vbDE0ODYgaXNzbmFuIDAuMDAwMDAwIC0+IDAKK2Jvb2wxNDg3IGlzc25hbiAtMC4wMDAwMDAgLT4gMAorYm9vbDE0ODggaXNzbmFuIDAuMDAwIC0+IDAKK2Jvb2wxNDg5IGlzc25hbiAtMC4wMDAgLT4gMAorYm9vbDE0OTAgaXNzbmFuIDAuMDAgLT4gMAorYm9vbDE0OTEgaXNzbmFuIC0wLjAwIC0+IDAKK2Jvb2wxNDkyIGlzc25hbiAwLjAgLT4gMAorYm9vbDE0OTMgaXNzbmFuIC0wLjAgLT4gMAorYm9vbDE0OTQgaXNzbmFuIDAgLT4gMAorYm9vbDE0OTUgaXNzbmFuIC0wIC0+IDAKK2Jvb2wxNDk2IGlzc25hbiAwRSsxIC0+IDAKK2Jvb2wxNDk3IGlzc25hbiAtMEUrMSAtPiAwCitib29sMTQ5OCBpc3NuYW4gMEUrMiAtPiAwCitib29sMTQ5OSBpc3NuYW4gLTBFKzIgLT4gMAorYm9vbDE1MDAgaXNzbmFuIDBFKzMgLT4gMAorYm9vbDE1MDEgaXNzbmFuIC0wRSszIC0+IDAKK2Jvb2wxNTAyIGlzc25hbiAwRSs2IC0+IDAKK2Jvb2wxNTAzIGlzc25hbiAtMEUrNiAtPiAwCitib29sMTUwNCBpc3NuYW4gMEUrMTAwIC0+IDAKK2Jvb2wxNTA1IGlzc25hbiAtMEUrMTAwIC0+IDAKK2Jvb2wxNTA2IGlzc25hbiAwRSs5OTAgLT4gMAorYm9vbDE1MDcgaXNzbmFuIC0wRSs5OTAgLT4gMAorYm9vbDE1MDggaXNzbmFuIDBFKzk5MSAtPiAwCitib29sMTUwOSBpc3NuYW4gLTBFKzk5MSAtPiAwCitib29sMTUxMCBpc3NuYW4gMEUrOTkyIC0+IDAKK2Jvb2wxNTExIGlzc25hbiAtMEUrOTkyIC0+IDAKK2Jvb2wxNTEyIGlzc25hbiAwRSs5OTggLT4gMAorYm9vbDE1MTMgaXNzbmFuIC0wRSs5OTggLT4gMAorYm9vbDE1MTQgaXNzbmFuIDBFKzk5OSAtPiAwCitib29sMTUxNSBpc3NuYW4gLTBFKzk5OSAtPiAwCitib29sMTUxNiBpc3NuYW4gMEUrMTAwMCAtPiAwCitib29sMTUxNyBpc3NuYW4gLTBFKzEwMDAgLT4gMAorYm9vbDE1MTggaXNzbmFuIDBFKzIwMDAgLT4gMAorYm9vbDE1MTkgaXNzbmFuIC0wRSsyMDAwIC0+IDAKK2Jvb2wxNTIwIGlzc25hbiAxRS0yMDAwIC0+IDAKK2Jvb2wxNTIxIGlzc25hbiAtMUUtMjAwMCAtPiAwCitib29sMTUyMiBpc3NuYW4gMUUtMTAwOCAtPiAwCitib29sMTUyMyBpc3NuYW4gLTFFLTEwMDggLT4gMAorYm9vbDE1MjQgaXNzbmFuIDFFLTEwMDcgLT4gMAorYm9vbDE1MjUgaXNzbmFuIC0xRS0xMDA3IC0+IDAKK2Jvb2wxNTI2IGlzc25hbiAxRS0xMDA2IC0+IDAKK2Jvb2wxNTI3IGlzc25hbiAtMUUtMTAwNiAtPiAwCitib29sMTUyOCBpc3NuYW4gMUUtMTAwMCAtPiAwCitib29sMTUyOSBpc3NuYW4gLTFFLTEwMDAgLT4gMAorYm9vbDE1MzAgaXNzbmFuIDFFLTk5OSAtPiAwCitib29sMTUzMSBpc3NuYW4gLTFFLTk5OSAtPiAwCitib29sMTUzMiBpc3NuYW4gMUUtOTk4IC0+IDAKK2Jvb2wxNTMzIGlzc25hbiAtMUUtOTk4IC0+IDAKK2Jvb2wxNTM0IGlzc25hbiAxRS0xMDAgLT4gMAorYm9vbDE1MzUgaXNzbmFuIC0xRS0xMDAgLT4gMAorYm9vbDE1MzYgaXNzbmFuIDAuMDAwMDAxIC0+IDAKK2Jvb2wxNTM3IGlzc25hbiAtMC4wMDAwMDEgLT4gMAorYm9vbDE1MzggaXNzbmFuIDAuMDAxIC0+IDAKK2Jvb2wxNTM5IGlzc25hbiAtMC4wMDEgLT4gMAorYm9vbDE1NDAgaXNzbmFuIDAuMDEgLT4gMAorYm9vbDE1NDEgaXNzbmFuIC0wLjAxIC0+IDAKK2Jvb2wxNTQyIGlzc25hbiAwLjEgLT4gMAorYm9vbDE1NDMgaXNzbmFuIC0wLjEgLT4gMAorYm9vbDE1NDQgaXNzbmFuIDEgLT4gMAorYm9vbDE1NDUgaXNzbmFuIC0xIC0+IDAKK2Jvb2wxNTQ2IGlzc25hbiAxRSsxIC0+IDAKK2Jvb2wxNTQ3IGlzc25hbiAtMUUrMSAtPiAwCitib29sMTU0OCBpc3NuYW4gMUUrMiAtPiAwCitib29sMTU0OSBpc3NuYW4gLTFFKzIgLT4gMAorYm9vbDE1NTAgaXNzbmFuIDFFKzMgLT4gMAorYm9vbDE1NTEgaXNzbmFuIC0xRSszIC0+IDAKK2Jvb2wxNTUyIGlzc25hbiAxRSs2IC0+IDAKK2Jvb2wxNTUzIGlzc25hbiAtMUUrNiAtPiAwCitib29sMTU1NCBpc3NuYW4gMUUrMTAwIC0+IDAKK2Jvb2wxNTU1IGlzc25hbiAtMUUrMTAwIC0+IDAKK2Jvb2wxNTU2IGlzc25hbiAxRSs5OTAgLT4gMAorYm9vbDE1NTcgaXNzbmFuIC0xRSs5OTAgLT4gMAorYm9vbDE1NTggaXNzbmFuIDFFKzk5MSAtPiAwCitib29sMTU1OSBpc3NuYW4gLTFFKzk5MSAtPiAwCitib29sMTU2MCBpc3NuYW4gMUUrOTkyIC0+IDAKK2Jvb2wxNTYxIGlzc25hbiAtMUUrOTkyIC0+IDAKK2Jvb2wxNTYyIGlzc25hbiAxRSs5OTggLT4gMAorYm9vbDE1NjMgaXNzbmFuIC0xRSs5OTggLT4gMAorYm9vbDE1NjQgaXNzbmFuIDFFKzk5OSAtPiAwCitib29sMTU2NSBpc3NuYW4gLTFFKzk5OSAtPiAwCitib29sMTU2NiBpc3NuYW4gMUUrMTAwMCAtPiAwCitib29sMTU2NyBpc3NuYW4gLTFFKzEwMDAgLT4gMAorYm9vbDE1NjggaXNzbmFuIDFFKzIwMDAgLT4gMAorYm9vbDE1NjkgaXNzbmFuIC0xRSsyMDAwIC0+IDAKK2Jvb2wxNTcwIGlzc25hbiA5RS0yMDAwIC0+IDAKK2Jvb2wxNTcxIGlzc25hbiAtOUUtMjAwMCAtPiAwCitib29sMTU3MiBpc3NuYW4gOUUtMTAwOCAtPiAwCitib29sMTU3MyBpc3NuYW4gLTlFLTEwMDggLT4gMAorYm9vbDE1NzQgaXNzbmFuIDlFLTEwMDcgLT4gMAorYm9vbDE1NzUgaXNzbmFuIC05RS0xMDA3IC0+IDAKK2Jvb2wxNTc2IGlzc25hbiA5RS0xMDA2IC0+IDAKK2Jvb2wxNTc3IGlzc25hbiAtOUUtMTAwNiAtPiAwCitib29sMTU3OCBpc3NuYW4gOUUtMTAwMCAtPiAwCitib29sMTU3OSBpc3NuYW4gLTlFLTEwMDAgLT4gMAorYm9vbDE1ODAgaXNzbmFuIDlFLTk5OSAtPiAwCitib29sMTU4MSBpc3NuYW4gLTlFLTk5OSAtPiAwCitib29sMTU4MiBpc3NuYW4gOUUtOTk4IC0+IDAKK2Jvb2wxNTgzIGlzc25hbiAtOUUtOTk4IC0+IDAKK2Jvb2wxNTg0IGlzc25hbiA5RS0xMDAgLT4gMAorYm9vbDE1ODUgaXNzbmFuIC05RS0xMDAgLT4gMAorYm9vbDE1ODYgaXNzbmFuIDAuMDAwMDA5IC0+IDAKK2Jvb2wxNTg3IGlzc25hbiAtMC4wMDAwMDkgLT4gMAorYm9vbDE1ODggaXNzbmFuIDAuMDA5IC0+IDAKK2Jvb2wxNTg5IGlzc25hbiAtMC4wMDkgLT4gMAorYm9vbDE1OTAgaXNzbmFuIDAuMDkgLT4gMAorYm9vbDE1OTEgaXNzbmFuIC0wLjA5IC0+IDAKK2Jvb2wxNTkyIGlzc25hbiAwLjkgLT4gMAorYm9vbDE1OTMgaXNzbmFuIC0wLjkgLT4gMAorYm9vbDE1OTQgaXNzbmFuIDkgLT4gMAorYm9vbDE1OTUgaXNzbmFuIC05IC0+IDAKK2Jvb2wxNTk2IGlzc25hbiA5RSsxIC0+IDAKK2Jvb2wxNTk3IGlzc25hbiAtOUUrMSAtPiAwCitib29sMTU5OCBpc3NuYW4gOUUrMiAtPiAwCitib29sMTU5OSBpc3NuYW4gLTlFKzIgLT4gMAorYm9vbDE2MDAgaXNzbmFuIDlFKzMgLT4gMAorYm9vbDE2MDEgaXNzbmFuIC05RSszIC0+IDAKK2Jvb2wxNjAyIGlzc25hbiA5RSs2IC0+IDAKK2Jvb2wxNjAzIGlzc25hbiAtOUUrNiAtPiAwCitib29sMTYwNCBpc3NuYW4gOUUrMTAwIC0+IDAKK2Jvb2wxNjA1IGlzc25hbiAtOUUrMTAwIC0+IDAKK2Jvb2wxNjA2IGlzc25hbiA5RSs5OTAgLT4gMAorYm9vbDE2MDcgaXNzbmFuIC05RSs5OTAgLT4gMAorYm9vbDE2MDggaXNzbmFuIDlFKzk5MSAtPiAwCitib29sMTYwOSBpc3NuYW4gLTlFKzk5MSAtPiAwCitib29sMTYxMCBpc3NuYW4gOUUrOTkyIC0+IDAKK2Jvb2wxNjExIGlzc25hbiAtOUUrOTkyIC0+IDAKK2Jvb2wxNjEyIGlzc25hbiA5RSs5OTggLT4gMAorYm9vbDE2MTMgaXNzbmFuIC05RSs5OTggLT4gMAorYm9vbDE2MTQgaXNzbmFuIDlFKzk5OSAtPiAwCitib29sMTYxNSBpc3NuYW4gLTlFKzk5OSAtPiAwCitib29sMTYxNiBpc3NuYW4gOUUrMTAwMCAtPiAwCitib29sMTYxNyBpc3NuYW4gLTlFKzEwMDAgLT4gMAorYm9vbDE2MTggaXNzbmFuIDlFKzIwMDAgLT4gMAorYm9vbDE2MTkgaXNzbmFuIC05RSsyMDAwIC0+IDAKK2Jvb2wxNjIwIGlzc25hbiA5Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wxNjIxIGlzc25hbiAtOS45OTk5OTk5OUUtMjAwMCAtPiAwCitib29sMTYyMiBpc3NuYW4gOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMTYyMyBpc3NuYW4gLTkuOTk5OTk5OTlFLTEwMDggLT4gMAorYm9vbDE2MjQgaXNzbmFuIDkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDE2MjUgaXNzbmFuIC05Ljk5OTk5OTk5RS0xMDA3IC0+IDAKK2Jvb2wxNjI2IGlzc25hbiA5Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wxNjI3IGlzc25hbiAtOS45OTk5OTk5OUUtMTAwNiAtPiAwCitib29sMTYyOCBpc3NuYW4gOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMTYyOSBpc3NuYW4gLTkuOTk5OTk5OTlFLTEwMDAgLT4gMAorYm9vbDE2MzAgaXNzbmFuIDkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMTYzMSBpc3NuYW4gLTkuOTk5OTk5OTlFLTk5OSAtPiAwCitib29sMTYzMiBpc3NuYW4gOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wxNjMzIGlzc25hbiAtOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wxNjM0IGlzc25hbiA5Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDE2MzUgaXNzbmFuIC05Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDE2MzYgaXNzbmFuIDAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDE2MzcgaXNzbmFuIC0wLjAwMDAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNjM4IGlzc25hbiAwLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNjM5IGlzc25hbiAtMC4wMDk5OTk5OTk5OSAtPiAwCitib29sMTY0MCBpc3NuYW4gMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNjQxIGlzc25hbiAtMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNjQyIGlzc25hbiAwLjk5OTk5OTk5OSAtPiAwCitib29sMTY0MyBpc3NuYW4gLTAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wxNjQ0IGlzc25hbiA5Ljk5OTk5OTk5IC0+IDAKK2Jvb2wxNjQ1IGlzc25hbiAtOS45OTk5OTk5OSAtPiAwCitib29sMTY0NiBpc3NuYW4gOTkuOTk5OTk5OSAtPiAwCitib29sMTY0NyBpc3NuYW4gLTk5Ljk5OTk5OTkgLT4gMAorYm9vbDE2NDggaXNzbmFuIDk5OS45OTk5OTkgLT4gMAorYm9vbDE2NDkgaXNzbmFuIC05OTkuOTk5OTk5IC0+IDAKK2Jvb2wxNjUwIGlzc25hbiA5OTk5Ljk5OTk5IC0+IDAKK2Jvb2wxNjUxIGlzc25hbiAtOTk5OS45OTk5OSAtPiAwCitib29sMTY1MiBpc3NuYW4gOTk5OTk5OS45OSAtPiAwCitib29sMTY1MyBpc3NuYW4gLTk5OTk5OTkuOTkgLT4gMAorYm9vbDE2NTQgaXNzbmFuIDkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMTY1NSBpc3NuYW4gLTkuOTk5OTk5OTlFKzEwMCAtPiAwCitib29sMTY1NiBpc3NuYW4gOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wxNjU3IGlzc25hbiAtOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wxNjU4IGlzc25hbiA5Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDE2NTkgaXNzbmFuIC05Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDE2NjAgaXNzbmFuIDkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMTY2MSBpc3NuYW4gLTkuOTk5OTk5OTlFKzk5MiAtPiAwCitib29sMTY2MiBpc3NuYW4gOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wxNjYzIGlzc25hbiAtOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wxNjY0IGlzc25hbiA5Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDE2NjUgaXNzbmFuIC05Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDE2NjYgaXNzbmFuIDkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDE2NjcgaXNzbmFuIC05Ljk5OTk5OTk5RSsxMDAwIC0+IDAKK2Jvb2wxNjY4IGlzc25hbiA5Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wxNjY5IGlzc25hbiAtOS45OTk5OTk5OUUrMjAwMCAtPiAwCitib29sMTY3MCBpc3NuYW4gSW5maW5pdHkgLT4gMAorYm9vbDE2NzEgaXNzbmFuIC1JbmZpbml0eSAtPiAwCitib29sMTY3MiBpc3NuYW4gTmFOIC0+IDAKK2Jvb2wxNjczIGlzc25hbiAtTmFOIC0+IDAKK2Jvb2wxNjc0IGlzc25hbiBOYU4xMjMgLT4gMAorYm9vbDE2NzUgaXNzbmFuIC1OYU4xMjMgLT4gMAorYm9vbDE2NzYgaXNzbmFuIHNOYU4gLT4gMQorYm9vbDE2NzcgaXNzbmFuIC1zTmFOIC0+IDEKK2Jvb2wxNjc4IGlzc25hbiBzTmFOMTIzIC0+IDEKK2Jvb2wxNjc5IGlzc25hbiAtc05hTjEyMyAtPiAxCitib29sMTY4MCBpc3N1Ym5vcm1hbCAwRS0yMDAwIC0+IDAKK2Jvb2wxNjgxIGlzc3Vibm9ybWFsIC0wRS0yMDAwIC0+IDAKK2Jvb2wxNjgyIGlzc3Vibm9ybWFsIDBFLTEwMDggLT4gMAorYm9vbDE2ODMgaXNzdWJub3JtYWwgLTBFLTEwMDggLT4gMAorYm9vbDE2ODQgaXNzdWJub3JtYWwgMEUtMTAwNyAtPiAwCitib29sMTY4NSBpc3N1Ym5vcm1hbCAtMEUtMTAwNyAtPiAwCitib29sMTY4NiBpc3N1Ym5vcm1hbCAwRS0xMDA2IC0+IDAKK2Jvb2wxNjg3IGlzc3Vibm9ybWFsIC0wRS0xMDA2IC0+IDAKK2Jvb2wxNjg4IGlzc3Vibm9ybWFsIDBFLTEwMDAgLT4gMAorYm9vbDE2ODkgaXNzdWJub3JtYWwgLTBFLTEwMDAgLT4gMAorYm9vbDE2OTAgaXNzdWJub3JtYWwgMEUtOTk5IC0+IDAKK2Jvb2wxNjkxIGlzc3Vibm9ybWFsIC0wRS05OTkgLT4gMAorYm9vbDE2OTIgaXNzdWJub3JtYWwgMEUtOTk4IC0+IDAKK2Jvb2wxNjkzIGlzc3Vibm9ybWFsIC0wRS05OTggLT4gMAorYm9vbDE2OTQgaXNzdWJub3JtYWwgMEUtMTAwIC0+IDAKK2Jvb2wxNjk1IGlzc3Vibm9ybWFsIC0wRS0xMDAgLT4gMAorYm9vbDE2OTYgaXNzdWJub3JtYWwgMC4wMDAwMDAgLT4gMAorYm9vbDE2OTcgaXNzdWJub3JtYWwgLTAuMDAwMDAwIC0+IDAKK2Jvb2wxNjk4IGlzc3Vibm9ybWFsIDAuMDAwIC0+IDAKK2Jvb2wxNjk5IGlzc3Vibm9ybWFsIC0wLjAwMCAtPiAwCitib29sMTcwMCBpc3N1Ym5vcm1hbCAwLjAwIC0+IDAKK2Jvb2wxNzAxIGlzc3Vibm9ybWFsIC0wLjAwIC0+IDAKK2Jvb2wxNzAyIGlzc3Vibm9ybWFsIDAuMCAtPiAwCitib29sMTcwMyBpc3N1Ym5vcm1hbCAtMC4wIC0+IDAKK2Jvb2wxNzA0IGlzc3Vibm9ybWFsIDAgLT4gMAorYm9vbDE3MDUgaXNzdWJub3JtYWwgLTAgLT4gMAorYm9vbDE3MDYgaXNzdWJub3JtYWwgMEUrMSAtPiAwCitib29sMTcwNyBpc3N1Ym5vcm1hbCAtMEUrMSAtPiAwCitib29sMTcwOCBpc3N1Ym5vcm1hbCAwRSsyIC0+IDAKK2Jvb2wxNzA5IGlzc3Vibm9ybWFsIC0wRSsyIC0+IDAKK2Jvb2wxNzEwIGlzc3Vibm9ybWFsIDBFKzMgLT4gMAorYm9vbDE3MTEgaXNzdWJub3JtYWwgLTBFKzMgLT4gMAorYm9vbDE3MTIgaXNzdWJub3JtYWwgMEUrNiAtPiAwCitib29sMTcxMyBpc3N1Ym5vcm1hbCAtMEUrNiAtPiAwCitib29sMTcxNCBpc3N1Ym5vcm1hbCAwRSsxMDAgLT4gMAorYm9vbDE3MTUgaXNzdWJub3JtYWwgLTBFKzEwMCAtPiAwCitib29sMTcxNiBpc3N1Ym5vcm1hbCAwRSs5OTAgLT4gMAorYm9vbDE3MTcgaXNzdWJub3JtYWwgLTBFKzk5MCAtPiAwCitib29sMTcxOCBpc3N1Ym5vcm1hbCAwRSs5OTEgLT4gMAorYm9vbDE3MTkgaXNzdWJub3JtYWwgLTBFKzk5MSAtPiAwCitib29sMTcyMCBpc3N1Ym5vcm1hbCAwRSs5OTIgLT4gMAorYm9vbDE3MjEgaXNzdWJub3JtYWwgLTBFKzk5MiAtPiAwCitib29sMTcyMiBpc3N1Ym5vcm1hbCAwRSs5OTggLT4gMAorYm9vbDE3MjMgaXNzdWJub3JtYWwgLTBFKzk5OCAtPiAwCitib29sMTcyNCBpc3N1Ym5vcm1hbCAwRSs5OTkgLT4gMAorYm9vbDE3MjUgaXNzdWJub3JtYWwgLTBFKzk5OSAtPiAwCitib29sMTcyNiBpc3N1Ym5vcm1hbCAwRSsxMDAwIC0+IDAKK2Jvb2wxNzI3IGlzc3Vibm9ybWFsIC0wRSsxMDAwIC0+IDAKK2Jvb2wxNzI4IGlzc3Vibm9ybWFsIDBFKzIwMDAgLT4gMAorYm9vbDE3MjkgaXNzdWJub3JtYWwgLTBFKzIwMDAgLT4gMAorYm9vbDE3MzAgaXNzdWJub3JtYWwgMUUtMjAwMCAtPiAxCitib29sMTczMSBpc3N1Ym5vcm1hbCAtMUUtMjAwMCAtPiAxCitib29sMTczMiBpc3N1Ym5vcm1hbCAxRS0xMDA4IC0+IDEKK2Jvb2wxNzMzIGlzc3Vibm9ybWFsIC0xRS0xMDA4IC0+IDEKK2Jvb2wxNzM0IGlzc3Vibm9ybWFsIDFFLTEwMDcgLT4gMQorYm9vbDE3MzUgaXNzdWJub3JtYWwgLTFFLTEwMDcgLT4gMQorYm9vbDE3MzYgaXNzdWJub3JtYWwgMUUtMTAwNiAtPiAxCitib29sMTczNyBpc3N1Ym5vcm1hbCAtMUUtMTAwNiAtPiAxCitib29sMTczOCBpc3N1Ym5vcm1hbCAxRS0xMDAwIC0+IDEKK2Jvb2wxNzM5IGlzc3Vibm9ybWFsIC0xRS0xMDAwIC0+IDEKK2Jvb2wxNzQwIGlzc3Vibm9ybWFsIDFFLTk5OSAtPiAwCitib29sMTc0MSBpc3N1Ym5vcm1hbCAtMUUtOTk5IC0+IDAKK2Jvb2wxNzQyIGlzc3Vibm9ybWFsIDFFLTk5OCAtPiAwCitib29sMTc0MyBpc3N1Ym5vcm1hbCAtMUUtOTk4IC0+IDAKK2Jvb2wxNzQ0IGlzc3Vibm9ybWFsIDFFLTEwMCAtPiAwCitib29sMTc0NSBpc3N1Ym5vcm1hbCAtMUUtMTAwIC0+IDAKK2Jvb2wxNzQ2IGlzc3Vibm9ybWFsIDAuMDAwMDAxIC0+IDAKK2Jvb2wxNzQ3IGlzc3Vibm9ybWFsIC0wLjAwMDAwMSAtPiAwCitib29sMTc0OCBpc3N1Ym5vcm1hbCAwLjAwMSAtPiAwCitib29sMTc0OSBpc3N1Ym5vcm1hbCAtMC4wMDEgLT4gMAorYm9vbDE3NTAgaXNzdWJub3JtYWwgMC4wMSAtPiAwCitib29sMTc1MSBpc3N1Ym5vcm1hbCAtMC4wMSAtPiAwCitib29sMTc1MiBpc3N1Ym5vcm1hbCAwLjEgLT4gMAorYm9vbDE3NTMgaXNzdWJub3JtYWwgLTAuMSAtPiAwCitib29sMTc1NCBpc3N1Ym5vcm1hbCAxIC0+IDAKK2Jvb2wxNzU1IGlzc3Vibm9ybWFsIC0xIC0+IDAKK2Jvb2wxNzU2IGlzc3Vibm9ybWFsIDFFKzEgLT4gMAorYm9vbDE3NTcgaXNzdWJub3JtYWwgLTFFKzEgLT4gMAorYm9vbDE3NTggaXNzdWJub3JtYWwgMUUrMiAtPiAwCitib29sMTc1OSBpc3N1Ym5vcm1hbCAtMUUrMiAtPiAwCitib29sMTc2MCBpc3N1Ym5vcm1hbCAxRSszIC0+IDAKK2Jvb2wxNzYxIGlzc3Vibm9ybWFsIC0xRSszIC0+IDAKK2Jvb2wxNzYyIGlzc3Vibm9ybWFsIDFFKzYgLT4gMAorYm9vbDE3NjMgaXNzdWJub3JtYWwgLTFFKzYgLT4gMAorYm9vbDE3NjQgaXNzdWJub3JtYWwgMUUrMTAwIC0+IDAKK2Jvb2wxNzY1IGlzc3Vibm9ybWFsIC0xRSsxMDAgLT4gMAorYm9vbDE3NjYgaXNzdWJub3JtYWwgMUUrOTkwIC0+IDAKK2Jvb2wxNzY3IGlzc3Vibm9ybWFsIC0xRSs5OTAgLT4gMAorYm9vbDE3NjggaXNzdWJub3JtYWwgMUUrOTkxIC0+IDAKK2Jvb2wxNzY5IGlzc3Vibm9ybWFsIC0xRSs5OTEgLT4gMAorYm9vbDE3NzAgaXNzdWJub3JtYWwgMUUrOTkyIC0+IDAKK2Jvb2wxNzcxIGlzc3Vibm9ybWFsIC0xRSs5OTIgLT4gMAorYm9vbDE3NzIgaXNzdWJub3JtYWwgMUUrOTk4IC0+IDAKK2Jvb2wxNzczIGlzc3Vibm9ybWFsIC0xRSs5OTggLT4gMAorYm9vbDE3NzQgaXNzdWJub3JtYWwgMUUrOTk5IC0+IDAKK2Jvb2wxNzc1IGlzc3Vibm9ybWFsIC0xRSs5OTkgLT4gMAorYm9vbDE3NzYgaXNzdWJub3JtYWwgMUUrMTAwMCAtPiAwCitib29sMTc3NyBpc3N1Ym5vcm1hbCAtMUUrMTAwMCAtPiAwCitib29sMTc3OCBpc3N1Ym5vcm1hbCAxRSsyMDAwIC0+IDAKK2Jvb2wxNzc5IGlzc3Vibm9ybWFsIC0xRSsyMDAwIC0+IDAKK2Jvb2wxNzgwIGlzc3Vibm9ybWFsIDlFLTIwMDAgLT4gMQorYm9vbDE3ODEgaXNzdWJub3JtYWwgLTlFLTIwMDAgLT4gMQorYm9vbDE3ODIgaXNzdWJub3JtYWwgOUUtMTAwOCAtPiAxCitib29sMTc4MyBpc3N1Ym5vcm1hbCAtOUUtMTAwOCAtPiAxCitib29sMTc4NCBpc3N1Ym5vcm1hbCA5RS0xMDA3IC0+IDEKK2Jvb2wxNzg1IGlzc3Vibm9ybWFsIC05RS0xMDA3IC0+IDEKK2Jvb2wxNzg2IGlzc3Vibm9ybWFsIDlFLTEwMDYgLT4gMQorYm9vbDE3ODcgaXNzdWJub3JtYWwgLTlFLTEwMDYgLT4gMQorYm9vbDE3ODggaXNzdWJub3JtYWwgOUUtMTAwMCAtPiAxCitib29sMTc4OSBpc3N1Ym5vcm1hbCAtOUUtMTAwMCAtPiAxCitib29sMTc5MCBpc3N1Ym5vcm1hbCA5RS05OTkgLT4gMAorYm9vbDE3OTEgaXNzdWJub3JtYWwgLTlFLTk5OSAtPiAwCitib29sMTc5MiBpc3N1Ym5vcm1hbCA5RS05OTggLT4gMAorYm9vbDE3OTMgaXNzdWJub3JtYWwgLTlFLTk5OCAtPiAwCitib29sMTc5NCBpc3N1Ym5vcm1hbCA5RS0xMDAgLT4gMAorYm9vbDE3OTUgaXNzdWJub3JtYWwgLTlFLTEwMCAtPiAwCitib29sMTc5NiBpc3N1Ym5vcm1hbCAwLjAwMDAwOSAtPiAwCitib29sMTc5NyBpc3N1Ym5vcm1hbCAtMC4wMDAwMDkgLT4gMAorYm9vbDE3OTggaXNzdWJub3JtYWwgMC4wMDkgLT4gMAorYm9vbDE3OTkgaXNzdWJub3JtYWwgLTAuMDA5IC0+IDAKK2Jvb2wxODAwIGlzc3Vibm9ybWFsIDAuMDkgLT4gMAorYm9vbDE4MDEgaXNzdWJub3JtYWwgLTAuMDkgLT4gMAorYm9vbDE4MDIgaXNzdWJub3JtYWwgMC45IC0+IDAKK2Jvb2wxODAzIGlzc3Vibm9ybWFsIC0wLjkgLT4gMAorYm9vbDE4MDQgaXNzdWJub3JtYWwgOSAtPiAwCitib29sMTgwNSBpc3N1Ym5vcm1hbCAtOSAtPiAwCitib29sMTgwNiBpc3N1Ym5vcm1hbCA5RSsxIC0+IDAKK2Jvb2wxODA3IGlzc3Vibm9ybWFsIC05RSsxIC0+IDAKK2Jvb2wxODA4IGlzc3Vibm9ybWFsIDlFKzIgLT4gMAorYm9vbDE4MDkgaXNzdWJub3JtYWwgLTlFKzIgLT4gMAorYm9vbDE4MTAgaXNzdWJub3JtYWwgOUUrMyAtPiAwCitib29sMTgxMSBpc3N1Ym5vcm1hbCAtOUUrMyAtPiAwCitib29sMTgxMiBpc3N1Ym5vcm1hbCA5RSs2IC0+IDAKK2Jvb2wxODEzIGlzc3Vibm9ybWFsIC05RSs2IC0+IDAKK2Jvb2wxODE0IGlzc3Vibm9ybWFsIDlFKzEwMCAtPiAwCitib29sMTgxNSBpc3N1Ym5vcm1hbCAtOUUrMTAwIC0+IDAKK2Jvb2wxODE2IGlzc3Vibm9ybWFsIDlFKzk5MCAtPiAwCitib29sMTgxNyBpc3N1Ym5vcm1hbCAtOUUrOTkwIC0+IDAKK2Jvb2wxODE4IGlzc3Vibm9ybWFsIDlFKzk5MSAtPiAwCitib29sMTgxOSBpc3N1Ym5vcm1hbCAtOUUrOTkxIC0+IDAKK2Jvb2wxODIwIGlzc3Vibm9ybWFsIDlFKzk5MiAtPiAwCitib29sMTgyMSBpc3N1Ym5vcm1hbCAtOUUrOTkyIC0+IDAKK2Jvb2wxODIyIGlzc3Vibm9ybWFsIDlFKzk5OCAtPiAwCitib29sMTgyMyBpc3N1Ym5vcm1hbCAtOUUrOTk4IC0+IDAKK2Jvb2wxODI0IGlzc3Vibm9ybWFsIDlFKzk5OSAtPiAwCitib29sMTgyNSBpc3N1Ym5vcm1hbCAtOUUrOTk5IC0+IDAKK2Jvb2wxODI2IGlzc3Vibm9ybWFsIDlFKzEwMDAgLT4gMAorYm9vbDE4MjcgaXNzdWJub3JtYWwgLTlFKzEwMDAgLT4gMAorYm9vbDE4MjggaXNzdWJub3JtYWwgOUUrMjAwMCAtPiAwCitib29sMTgyOSBpc3N1Ym5vcm1hbCAtOUUrMjAwMCAtPiAwCitib29sMTgzMCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RS0yMDAwIC0+IDEKK2Jvb2wxODMxIGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RS0yMDAwIC0+IDEKK2Jvb2wxODMyIGlzc3Vibm9ybWFsIDkuOTk5OTk5OTlFLTEwMDggLT4gMQorYm9vbDE4MzMgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFLTEwMDggLT4gMQorYm9vbDE4MzQgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUtMTAwNyAtPiAxCitib29sMTgzNSBpc3N1Ym5vcm1hbCAtOS45OTk5OTk5OUUtMTAwNyAtPiAxCitib29sMTgzNiBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RS0xMDA2IC0+IDEKK2Jvb2wxODM3IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RS0xMDA2IC0+IDEKK2Jvb2wxODM4IGlzc3Vibm9ybWFsIDkuOTk5OTk5OTlFLTEwMDAgLT4gMQorYm9vbDE4MzkgaXNzdWJub3JtYWwgLTkuOTk5OTk5OTlFLTEwMDAgLT4gMQorYm9vbDE4NDAgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wxODQxIGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RS05OTkgLT4gMAorYm9vbDE4NDIgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUtOTk4IC0+IDAKK2Jvb2wxODQzIGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDE4NDQgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUtMTAwIC0+IDAKK2Jvb2wxODQ1IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RS0xMDAgLT4gMAorYm9vbDE4NDYgaXNzdWJub3JtYWwgMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMTg0NyBpc3N1Ym5vcm1hbCAtMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMTg0OCBpc3N1Ym5vcm1hbCAwLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODQ5IGlzc3Vibm9ybWFsIC0wLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODUwIGlzc3Vibm9ybWFsIDAuMDk5OTk5OTk5OSAtPiAwCitib29sMTg1MSBpc3N1Ym5vcm1hbCAtMC4wOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODUyIGlzc3Vibm9ybWFsIDAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wxODUzIGlzc3Vibm9ybWFsIC0wLjk5OTk5OTk5OSAtPiAwCitib29sMTg1NCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5IC0+IDAKK2Jvb2wxODU1IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5IC0+IDAKK2Jvb2wxODU2IGlzc3Vibm9ybWFsIDk5Ljk5OTk5OTkgLT4gMAorYm9vbDE4NTcgaXNzdWJub3JtYWwgLTk5Ljk5OTk5OTkgLT4gMAorYm9vbDE4NTggaXNzdWJub3JtYWwgOTk5Ljk5OTk5OSAtPiAwCitib29sMTg1OSBpc3N1Ym5vcm1hbCAtOTk5Ljk5OTk5OSAtPiAwCitib29sMTg2MCBpc3N1Ym5vcm1hbCA5OTk5Ljk5OTk5IC0+IDAKK2Jvb2wxODYxIGlzc3Vibm9ybWFsIC05OTk5Ljk5OTk5IC0+IDAKK2Jvb2wxODYyIGlzc3Vibm9ybWFsIDk5OTk5OTkuOTkgLT4gMAorYm9vbDE4NjMgaXNzdWJub3JtYWwgLTk5OTk5OTkuOTkgLT4gMAorYm9vbDE4NjQgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wxODY1IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSsxMDAgLT4gMAorYm9vbDE4NjYgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUrOTkwIC0+IDAKK2Jvb2wxODY3IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDE4NjggaXNzdWJub3JtYWwgOS45OTk5OTk5OUUrOTkxIC0+IDAKK2Jvb2wxODY5IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSs5OTEgLT4gMAorYm9vbDE4NzAgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wxODcxIGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSs5OTIgLT4gMAorYm9vbDE4NzIgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUrOTk4IC0+IDAKK2Jvb2wxODczIGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDE4NzQgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUrOTk5IC0+IDAKK2Jvb2wxODc1IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSs5OTkgLT4gMAorYm9vbDE4NzYgaXNzdWJub3JtYWwgOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMTg3NyBpc3N1Ym5vcm1hbCAtOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMTg3OCBpc3N1Ym5vcm1hbCA5Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wxODc5IGlzc3Vibm9ybWFsIC05Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wxODgwIGlzc3Vibm9ybWFsIEluZmluaXR5IC0+IDAKK2Jvb2wxODgxIGlzc3Vibm9ybWFsIC1JbmZpbml0eSAtPiAwCitib29sMTg4MiBpc3N1Ym5vcm1hbCBOYU4gLT4gMAorYm9vbDE4ODMgaXNzdWJub3JtYWwgLU5hTiAtPiAwCitib29sMTg4NCBpc3N1Ym5vcm1hbCBOYU4xMjMgLT4gMAorYm9vbDE4ODUgaXNzdWJub3JtYWwgLU5hTjEyMyAtPiAwCitib29sMTg4NiBpc3N1Ym5vcm1hbCBzTmFOIC0+IDAKK2Jvb2wxODg3IGlzc3Vibm9ybWFsIC1zTmFOIC0+IDAKK2Jvb2wxODg4IGlzc3Vibm9ybWFsIHNOYU4xMjMgLT4gMAorYm9vbDE4ODkgaXNzdWJub3JtYWwgLXNOYU4xMjMgLT4gMAorYm9vbDE4OTAgaXN6ZXJvIDBFLTIwMDAgLT4gMQorYm9vbDE4OTEgaXN6ZXJvIC0wRS0yMDAwIC0+IDEKK2Jvb2wxODkyIGlzemVybyAwRS0xMDA4IC0+IDEKK2Jvb2wxODkzIGlzemVybyAtMEUtMTAwOCAtPiAxCitib29sMTg5NCBpc3plcm8gMEUtMTAwNyAtPiAxCitib29sMTg5NSBpc3plcm8gLTBFLTEwMDcgLT4gMQorYm9vbDE4OTYgaXN6ZXJvIDBFLTEwMDYgLT4gMQorYm9vbDE4OTcgaXN6ZXJvIC0wRS0xMDA2IC0+IDEKK2Jvb2wxODk4IGlzemVybyAwRS0xMDAwIC0+IDEKK2Jvb2wxODk5IGlzemVybyAtMEUtMTAwMCAtPiAxCitib29sMTkwMCBpc3plcm8gMEUtOTk5IC0+IDEKK2Jvb2wxOTAxIGlzemVybyAtMEUtOTk5IC0+IDEKK2Jvb2wxOTAyIGlzemVybyAwRS05OTggLT4gMQorYm9vbDE5MDMgaXN6ZXJvIC0wRS05OTggLT4gMQorYm9vbDE5MDQgaXN6ZXJvIDBFLTEwMCAtPiAxCitib29sMTkwNSBpc3plcm8gLTBFLTEwMCAtPiAxCitib29sMTkwNiBpc3plcm8gMC4wMDAwMDAgLT4gMQorYm9vbDE5MDcgaXN6ZXJvIC0wLjAwMDAwMCAtPiAxCitib29sMTkwOCBpc3plcm8gMC4wMDAgLT4gMQorYm9vbDE5MDkgaXN6ZXJvIC0wLjAwMCAtPiAxCitib29sMTkxMCBpc3plcm8gMC4wMCAtPiAxCitib29sMTkxMSBpc3plcm8gLTAuMDAgLT4gMQorYm9vbDE5MTIgaXN6ZXJvIDAuMCAtPiAxCitib29sMTkxMyBpc3plcm8gLTAuMCAtPiAxCitib29sMTkxNCBpc3plcm8gMCAtPiAxCitib29sMTkxNSBpc3plcm8gLTAgLT4gMQorYm9vbDE5MTYgaXN6ZXJvIDBFKzEgLT4gMQorYm9vbDE5MTcgaXN6ZXJvIC0wRSsxIC0+IDEKK2Jvb2wxOTE4IGlzemVybyAwRSsyIC0+IDEKK2Jvb2wxOTE5IGlzemVybyAtMEUrMiAtPiAxCitib29sMTkyMCBpc3plcm8gMEUrMyAtPiAxCitib29sMTkyMSBpc3plcm8gLTBFKzMgLT4gMQorYm9vbDE5MjIgaXN6ZXJvIDBFKzYgLT4gMQorYm9vbDE5MjMgaXN6ZXJvIC0wRSs2IC0+IDEKK2Jvb2wxOTI0IGlzemVybyAwRSsxMDAgLT4gMQorYm9vbDE5MjUgaXN6ZXJvIC0wRSsxMDAgLT4gMQorYm9vbDE5MjYgaXN6ZXJvIDBFKzk5MCAtPiAxCitib29sMTkyNyBpc3plcm8gLTBFKzk5MCAtPiAxCitib29sMTkyOCBpc3plcm8gMEUrOTkxIC0+IDEKK2Jvb2wxOTI5IGlzemVybyAtMEUrOTkxIC0+IDEKK2Jvb2wxOTMwIGlzemVybyAwRSs5OTIgLT4gMQorYm9vbDE5MzEgaXN6ZXJvIC0wRSs5OTIgLT4gMQorYm9vbDE5MzIgaXN6ZXJvIDBFKzk5OCAtPiAxCitib29sMTkzMyBpc3plcm8gLTBFKzk5OCAtPiAxCitib29sMTkzNCBpc3plcm8gMEUrOTk5IC0+IDEKK2Jvb2wxOTM1IGlzemVybyAtMEUrOTk5IC0+IDEKK2Jvb2wxOTM2IGlzemVybyAwRSsxMDAwIC0+IDEKK2Jvb2wxOTM3IGlzemVybyAtMEUrMTAwMCAtPiAxCitib29sMTkzOCBpc3plcm8gMEUrMjAwMCAtPiAxCitib29sMTkzOSBpc3plcm8gLTBFKzIwMDAgLT4gMQorYm9vbDE5NDAgaXN6ZXJvIDFFLTIwMDAgLT4gMAorYm9vbDE5NDEgaXN6ZXJvIC0xRS0yMDAwIC0+IDAKK2Jvb2wxOTQyIGlzemVybyAxRS0xMDA4IC0+IDAKK2Jvb2wxOTQzIGlzemVybyAtMUUtMTAwOCAtPiAwCitib29sMTk0NCBpc3plcm8gMUUtMTAwNyAtPiAwCitib29sMTk0NSBpc3plcm8gLTFFLTEwMDcgLT4gMAorYm9vbDE5NDYgaXN6ZXJvIDFFLTEwMDYgLT4gMAorYm9vbDE5NDcgaXN6ZXJvIC0xRS0xMDA2IC0+IDAKK2Jvb2wxOTQ4IGlzemVybyAxRS0xMDAwIC0+IDAKK2Jvb2wxOTQ5IGlzemVybyAtMUUtMTAwMCAtPiAwCitib29sMTk1MCBpc3plcm8gMUUtOTk5IC0+IDAKK2Jvb2wxOTUxIGlzemVybyAtMUUtOTk5IC0+IDAKK2Jvb2wxOTUyIGlzemVybyAxRS05OTggLT4gMAorYm9vbDE5NTMgaXN6ZXJvIC0xRS05OTggLT4gMAorYm9vbDE5NTQgaXN6ZXJvIDFFLTEwMCAtPiAwCitib29sMTk1NSBpc3plcm8gLTFFLTEwMCAtPiAwCitib29sMTk1NiBpc3plcm8gMC4wMDAwMDEgLT4gMAorYm9vbDE5NTcgaXN6ZXJvIC0wLjAwMDAwMSAtPiAwCitib29sMTk1OCBpc3plcm8gMC4wMDEgLT4gMAorYm9vbDE5NTkgaXN6ZXJvIC0wLjAwMSAtPiAwCitib29sMTk2MCBpc3plcm8gMC4wMSAtPiAwCitib29sMTk2MSBpc3plcm8gLTAuMDEgLT4gMAorYm9vbDE5NjIgaXN6ZXJvIDAuMSAtPiAwCitib29sMTk2MyBpc3plcm8gLTAuMSAtPiAwCitib29sMTk2NCBpc3plcm8gMSAtPiAwCitib29sMTk2NSBpc3plcm8gLTEgLT4gMAorYm9vbDE5NjYgaXN6ZXJvIDFFKzEgLT4gMAorYm9vbDE5NjcgaXN6ZXJvIC0xRSsxIC0+IDAKK2Jvb2wxOTY4IGlzemVybyAxRSsyIC0+IDAKK2Jvb2wxOTY5IGlzemVybyAtMUUrMiAtPiAwCitib29sMTk3MCBpc3plcm8gMUUrMyAtPiAwCitib29sMTk3MSBpc3plcm8gLTFFKzMgLT4gMAorYm9vbDE5NzIgaXN6ZXJvIDFFKzYgLT4gMAorYm9vbDE5NzMgaXN6ZXJvIC0xRSs2IC0+IDAKK2Jvb2wxOTc0IGlzemVybyAxRSsxMDAgLT4gMAorYm9vbDE5NzUgaXN6ZXJvIC0xRSsxMDAgLT4gMAorYm9vbDE5NzYgaXN6ZXJvIDFFKzk5MCAtPiAwCitib29sMTk3NyBpc3plcm8gLTFFKzk5MCAtPiAwCitib29sMTk3OCBpc3plcm8gMUUrOTkxIC0+IDAKK2Jvb2wxOTc5IGlzemVybyAtMUUrOTkxIC0+IDAKK2Jvb2wxOTgwIGlzemVybyAxRSs5OTIgLT4gMAorYm9vbDE5ODEgaXN6ZXJvIC0xRSs5OTIgLT4gMAorYm9vbDE5ODIgaXN6ZXJvIDFFKzk5OCAtPiAwCitib29sMTk4MyBpc3plcm8gLTFFKzk5OCAtPiAwCitib29sMTk4NCBpc3plcm8gMUUrOTk5IC0+IDAKK2Jvb2wxOTg1IGlzemVybyAtMUUrOTk5IC0+IDAKK2Jvb2wxOTg2IGlzemVybyAxRSsxMDAwIC0+IDAKK2Jvb2wxOTg3IGlzemVybyAtMUUrMTAwMCAtPiAwCitib29sMTk4OCBpc3plcm8gMUUrMjAwMCAtPiAwCitib29sMTk4OSBpc3plcm8gLTFFKzIwMDAgLT4gMAorYm9vbDE5OTAgaXN6ZXJvIDlFLTIwMDAgLT4gMAorYm9vbDE5OTEgaXN6ZXJvIC05RS0yMDAwIC0+IDAKK2Jvb2wxOTkyIGlzemVybyA5RS0xMDA4IC0+IDAKK2Jvb2wxOTkzIGlzemVybyAtOUUtMTAwOCAtPiAwCitib29sMTk5NCBpc3plcm8gOUUtMTAwNyAtPiAwCitib29sMTk5NSBpc3plcm8gLTlFLTEwMDcgLT4gMAorYm9vbDE5OTYgaXN6ZXJvIDlFLTEwMDYgLT4gMAorYm9vbDE5OTcgaXN6ZXJvIC05RS0xMDA2IC0+IDAKK2Jvb2wxOTk4IGlzemVybyA5RS0xMDAwIC0+IDAKK2Jvb2wxOTk5IGlzemVybyAtOUUtMTAwMCAtPiAwCitib29sMjAwMCBpc3plcm8gOUUtOTk5IC0+IDAKK2Jvb2wyMDAxIGlzemVybyAtOUUtOTk5IC0+IDAKK2Jvb2wyMDAyIGlzemVybyA5RS05OTggLT4gMAorYm9vbDIwMDMgaXN6ZXJvIC05RS05OTggLT4gMAorYm9vbDIwMDQgaXN6ZXJvIDlFLTEwMCAtPiAwCitib29sMjAwNSBpc3plcm8gLTlFLTEwMCAtPiAwCitib29sMjAwNiBpc3plcm8gMC4wMDAwMDkgLT4gMAorYm9vbDIwMDcgaXN6ZXJvIC0wLjAwMDAwOSAtPiAwCitib29sMjAwOCBpc3plcm8gMC4wMDkgLT4gMAorYm9vbDIwMDkgaXN6ZXJvIC0wLjAwOSAtPiAwCitib29sMjAxMCBpc3plcm8gMC4wOSAtPiAwCitib29sMjAxMSBpc3plcm8gLTAuMDkgLT4gMAorYm9vbDIwMTIgaXN6ZXJvIDAuOSAtPiAwCitib29sMjAxMyBpc3plcm8gLTAuOSAtPiAwCitib29sMjAxNCBpc3plcm8gOSAtPiAwCitib29sMjAxNSBpc3plcm8gLTkgLT4gMAorYm9vbDIwMTYgaXN6ZXJvIDlFKzEgLT4gMAorYm9vbDIwMTcgaXN6ZXJvIC05RSsxIC0+IDAKK2Jvb2wyMDE4IGlzemVybyA5RSsyIC0+IDAKK2Jvb2wyMDE5IGlzemVybyAtOUUrMiAtPiAwCitib29sMjAyMCBpc3plcm8gOUUrMyAtPiAwCitib29sMjAyMSBpc3plcm8gLTlFKzMgLT4gMAorYm9vbDIwMjIgaXN6ZXJvIDlFKzYgLT4gMAorYm9vbDIwMjMgaXN6ZXJvIC05RSs2IC0+IDAKK2Jvb2wyMDI0IGlzemVybyA5RSsxMDAgLT4gMAorYm9vbDIwMjUgaXN6ZXJvIC05RSsxMDAgLT4gMAorYm9vbDIwMjYgaXN6ZXJvIDlFKzk5MCAtPiAwCitib29sMjAyNyBpc3plcm8gLTlFKzk5MCAtPiAwCitib29sMjAyOCBpc3plcm8gOUUrOTkxIC0+IDAKK2Jvb2wyMDI5IGlzemVybyAtOUUrOTkxIC0+IDAKK2Jvb2wyMDMwIGlzemVybyA5RSs5OTIgLT4gMAorYm9vbDIwMzEgaXN6ZXJvIC05RSs5OTIgLT4gMAorYm9vbDIwMzIgaXN6ZXJvIDlFKzk5OCAtPiAwCitib29sMjAzMyBpc3plcm8gLTlFKzk5OCAtPiAwCitib29sMjAzNCBpc3plcm8gOUUrOTk5IC0+IDAKK2Jvb2wyMDM1IGlzemVybyAtOUUrOTk5IC0+IDAKK2Jvb2wyMDM2IGlzemVybyA5RSsxMDAwIC0+IDAKK2Jvb2wyMDM3IGlzemVybyAtOUUrMTAwMCAtPiAwCitib29sMjAzOCBpc3plcm8gOUUrMjAwMCAtPiAwCitib29sMjAzOSBpc3plcm8gLTlFKzIwMDAgLT4gMAorYm9vbDIwNDAgaXN6ZXJvIDkuOTk5OTk5OTlFLTIwMDAgLT4gMAorYm9vbDIwNDEgaXN6ZXJvIC05Ljk5OTk5OTk5RS0yMDAwIC0+IDAKK2Jvb2wyMDQyIGlzemVybyA5Ljk5OTk5OTk5RS0xMDA4IC0+IDAKK2Jvb2wyMDQzIGlzemVybyAtOS45OTk5OTk5OUUtMTAwOCAtPiAwCitib29sMjA0NCBpc3plcm8gOS45OTk5OTk5OUUtMTAwNyAtPiAwCitib29sMjA0NSBpc3plcm8gLTkuOTk5OTk5OTlFLTEwMDcgLT4gMAorYm9vbDIwNDYgaXN6ZXJvIDkuOTk5OTk5OTlFLTEwMDYgLT4gMAorYm9vbDIwNDcgaXN6ZXJvIC05Ljk5OTk5OTk5RS0xMDA2IC0+IDAKK2Jvb2wyMDQ4IGlzemVybyA5Ljk5OTk5OTk5RS0xMDAwIC0+IDAKK2Jvb2wyMDQ5IGlzemVybyAtOS45OTk5OTk5OUUtMTAwMCAtPiAwCitib29sMjA1MCBpc3plcm8gOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wyMDUxIGlzemVybyAtOS45OTk5OTk5OUUtOTk5IC0+IDAKK2Jvb2wyMDUyIGlzemVybyA5Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDIwNTMgaXN6ZXJvIC05Ljk5OTk5OTk5RS05OTggLT4gMAorYm9vbDIwNTQgaXN6ZXJvIDkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMjA1NSBpc3plcm8gLTkuOTk5OTk5OTlFLTEwMCAtPiAwCitib29sMjA1NiBpc3plcm8gMC4wMDAwMDk5OTk5OTk5OSAtPiAwCitib29sMjA1NyBpc3plcm8gLTAuMDAwMDA5OTk5OTk5OTkgLT4gMAorYm9vbDIwNTggaXN6ZXJvIDAuMDA5OTk5OTk5OTkgLT4gMAorYm9vbDIwNTkgaXN6ZXJvIC0wLjAwOTk5OTk5OTk5IC0+IDAKK2Jvb2wyMDYwIGlzemVybyAwLjA5OTk5OTk5OTkgLT4gMAorYm9vbDIwNjEgaXN6ZXJvIC0wLjA5OTk5OTk5OTkgLT4gMAorYm9vbDIwNjIgaXN6ZXJvIDAuOTk5OTk5OTk5IC0+IDAKK2Jvb2wyMDYzIGlzemVybyAtMC45OTk5OTk5OTkgLT4gMAorYm9vbDIwNjQgaXN6ZXJvIDkuOTk5OTk5OTkgLT4gMAorYm9vbDIwNjUgaXN6ZXJvIC05Ljk5OTk5OTk5IC0+IDAKK2Jvb2wyMDY2IGlzemVybyA5OS45OTk5OTk5IC0+IDAKK2Jvb2wyMDY3IGlzemVybyAtOTkuOTk5OTk5OSAtPiAwCitib29sMjA2OCBpc3plcm8gOTk5Ljk5OTk5OSAtPiAwCitib29sMjA2OSBpc3plcm8gLTk5OS45OTk5OTkgLT4gMAorYm9vbDIwNzAgaXN6ZXJvIDk5OTkuOTk5OTkgLT4gMAorYm9vbDIwNzEgaXN6ZXJvIC05OTk5Ljk5OTk5IC0+IDAKK2Jvb2wyMDcyIGlzemVybyA5OTk5OTk5Ljk5IC0+IDAKK2Jvb2wyMDczIGlzemVybyAtOTk5OTk5OS45OSAtPiAwCitib29sMjA3NCBpc3plcm8gOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wyMDc1IGlzemVybyAtOS45OTk5OTk5OUUrMTAwIC0+IDAKK2Jvb2wyMDc2IGlzemVybyA5Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDIwNzcgaXN6ZXJvIC05Ljk5OTk5OTk5RSs5OTAgLT4gMAorYm9vbDIwNzggaXN6ZXJvIDkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMjA3OSBpc3plcm8gLTkuOTk5OTk5OTlFKzk5MSAtPiAwCitib29sMjA4MCBpc3plcm8gOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wyMDgxIGlzemVybyAtOS45OTk5OTk5OUUrOTkyIC0+IDAKK2Jvb2wyMDgyIGlzemVybyA5Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDIwODMgaXN6ZXJvIC05Ljk5OTk5OTk5RSs5OTggLT4gMAorYm9vbDIwODQgaXN6ZXJvIDkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMjA4NSBpc3plcm8gLTkuOTk5OTk5OTlFKzk5OSAtPiAwCitib29sMjA4NiBpc3plcm8gOS45OTk5OTk5OUUrMTAwMCAtPiAwCitib29sMjA4NyBpc3plcm8gLTkuOTk5OTk5OTlFKzEwMDAgLT4gMAorYm9vbDIwODggaXN6ZXJvIDkuOTk5OTk5OTlFKzIwMDAgLT4gMAorYm9vbDIwODkgaXN6ZXJvIC05Ljk5OTk5OTk5RSsyMDAwIC0+IDAKK2Jvb2wyMDkwIGlzemVybyBJbmZpbml0eSAtPiAwCitib29sMjA5MSBpc3plcm8gLUluZmluaXR5IC0+IDAKK2Jvb2wyMDkyIGlzemVybyBOYU4gLT4gMAorYm9vbDIwOTMgaXN6ZXJvIC1OYU4gLT4gMAorYm9vbDIwOTQgaXN6ZXJvIE5hTjEyMyAtPiAwCitib29sMjA5NSBpc3plcm8gLU5hTjEyMyAtPiAwCitib29sMjA5NiBpc3plcm8gc05hTiAtPiAwCitib29sMjA5NyBpc3plcm8gLXNOYU4gLT4gMAorYm9vbDIwOTggaXN6ZXJvIHNOYU4xMjMgLT4gMAorYm9vbDIwOTkgaXN6ZXJvIC1zTmFOMTIzIC0+IDAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBUaGUgZm9sbG93aW5nIHRlc3RzIChwd214MCB0aHJvdWdoIHB3bXg0NDApIGFyZSBmb3IgdGhlICAgICAgICAgICAgLS0KKy0tIHRocmVlLWFyZ3VtZW50IHZlcnNpb24gb2YgcG93ZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIHBvdyh4LCB5LCB6KSA6PSB4Kip5ICUgeiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gTm90ZSB0aGF0IHRoZSB0aHJlZS1hcmd1bWVudCB2ZXJzaW9uIG9mIHBvd2VyIGlzICpub3QqIHBhcnQgb2YgICAgIC0tCistLSB0aGUgSUJNIEdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIHNwZWNpZmljYXRpb24uICBRdWVzdGlvbnMgICAgICAgLS0KKy0tIGFib3V0IGl0LCBvciBhYm91dCB0aGVzZSB0ZXN0Y2FzZXMsIHNob3VsZCBnbyB0byBvbmUgb2YgdGhlICAgICAgICAtLQorLS0gUHl0aG9uIGRlY2ltYWwgYXV0aG9ycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZW5kZWQ6IDEKK3ByZWNpc2lvbjogOQorcm91bmRpbmc6IGRvd24KK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNtYWxsIG51bWJlcnMKKy0tIE5vdGUgdGhhdCBwb3dlcigwLCAwLCBtKSBpcyBhbiBlcnJvciBmb3IgYW55IG0KK3B3bXgwIHBvd2VyIDAgLTAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxIHBvd2VyIDAgLTAgMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgyIHBvd2VyIDAgLTAgMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzIHBvd2VyIDAgLTAgNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0IHBvd2VyIDAgLTAgLTEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214NSBwb3dlciAwIC0wIC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDYgcG93ZXIgMCAwIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214NyBwb3dlciAwIDAgMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg4IHBvd2VyIDAgMCAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDkgcG93ZXIgMCAwIDQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTAgcG93ZXIgMCAwIC0xIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDExIHBvd2VyIDAgMCAtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxMiBwb3dlciAwIDEgMSAtPiAwCitwd214MTMgcG93ZXIgMCAxIDIgLT4gMAorcHdteDE0IHBvd2VyIDAgMSAzIC0+IDAKK3B3bXgxNSBwb3dlciAwIDEgNCAtPiAwCitwd214MTYgcG93ZXIgMCAxIC0xIC0+IDAKK3B3bXgxNyBwb3dlciAwIDEgLTIgLT4gMAorcHdteDE4IHBvd2VyIDAgMiAxIC0+IDAKK3B3bXgxOSBwb3dlciAwIDIgMiAtPiAwCitwd214MjAgcG93ZXIgMCAyIDMgLT4gMAorcHdteDIxIHBvd2VyIDAgMiA0IC0+IDAKK3B3bXgyMiBwb3dlciAwIDIgLTEgLT4gMAorcHdteDIzIHBvd2VyIDAgMiAtMiAtPiAwCitwd214MjQgcG93ZXIgMCAzIDEgLT4gMAorcHdteDI1IHBvd2VyIDAgMyAyIC0+IDAKK3B3bXgyNiBwb3dlciAwIDMgMyAtPiAwCitwd214MjcgcG93ZXIgMCAzIDQgLT4gMAorcHdteDI4IHBvd2VyIDAgMyAtMSAtPiAwCitwd214MjkgcG93ZXIgMCAzIC0yIC0+IDAKK3B3bXgzMCBwb3dlciAwIDQgMSAtPiAwCitwd214MzEgcG93ZXIgMCA0IDIgLT4gMAorcHdteDMyIHBvd2VyIDAgNCAzIC0+IDAKK3B3bXgzMyBwb3dlciAwIDQgNCAtPiAwCitwd214MzQgcG93ZXIgMCA0IC0xIC0+IDAKK3B3bXgzNSBwb3dlciAwIDQgLTIgLT4gMAorcHdteDM2IHBvd2VyIDAgNSAxIC0+IDAKK3B3bXgzNyBwb3dlciAwIDUgMiAtPiAwCitwd214MzggcG93ZXIgMCA1IDMgLT4gMAorcHdteDM5IHBvd2VyIDAgNSA0IC0+IDAKK3B3bXg0MCBwb3dlciAwIDUgLTEgLT4gMAorcHdteDQxIHBvd2VyIDAgNSAtMiAtPiAwCitwd214NDIgcG93ZXIgMSAtMCAxIC0+IDAKK3B3bXg0MyBwb3dlciAxIC0wIDIgLT4gMQorcHdteDQ0IHBvd2VyIDEgLTAgMyAtPiAxCitwd214NDUgcG93ZXIgMSAtMCA0IC0+IDEKK3B3bXg0NiBwb3dlciAxIC0wIC0xIC0+IDAKK3B3bXg0NyBwb3dlciAxIC0wIC0yIC0+IDEKK3B3bXg0OCBwb3dlciAxIDAgMSAtPiAwCitwd214NDkgcG93ZXIgMSAwIDIgLT4gMQorcHdteDUwIHBvd2VyIDEgMCAzIC0+IDEKK3B3bXg1MSBwb3dlciAxIDAgNCAtPiAxCitwd214NTIgcG93ZXIgMSAwIC0xIC0+IDAKK3B3bXg1MyBwb3dlciAxIDAgLTIgLT4gMQorcHdteDU0IHBvd2VyIDEgMSAxIC0+IDAKK3B3bXg1NSBwb3dlciAxIDEgMiAtPiAxCitwd214NTYgcG93ZXIgMSAxIDMgLT4gMQorcHdteDU3IHBvd2VyIDEgMSA0IC0+IDEKK3B3bXg1OCBwb3dlciAxIDEgLTEgLT4gMAorcHdteDU5IHBvd2VyIDEgMSAtMiAtPiAxCitwd214NjAgcG93ZXIgMSAyIDEgLT4gMAorcHdteDYxIHBvd2VyIDEgMiAyIC0+IDEKK3B3bXg2MiBwb3dlciAxIDIgMyAtPiAxCitwd214NjMgcG93ZXIgMSAyIDQgLT4gMQorcHdteDY0IHBvd2VyIDEgMiAtMSAtPiAwCitwd214NjUgcG93ZXIgMSAyIC0yIC0+IDEKK3B3bXg2NiBwb3dlciAxIDMgMSAtPiAwCitwd214NjcgcG93ZXIgMSAzIDIgLT4gMQorcHdteDY4IHBvd2VyIDEgMyAzIC0+IDEKK3B3bXg2OSBwb3dlciAxIDMgNCAtPiAxCitwd214NzAgcG93ZXIgMSAzIC0xIC0+IDAKK3B3bXg3MSBwb3dlciAxIDMgLTIgLT4gMQorcHdteDcyIHBvd2VyIDEgNCAxIC0+IDAKK3B3bXg3MyBwb3dlciAxIDQgMiAtPiAxCitwd214NzQgcG93ZXIgMSA0IDMgLT4gMQorcHdteDc1IHBvd2VyIDEgNCA0IC0+IDEKK3B3bXg3NiBwb3dlciAxIDQgLTEgLT4gMAorcHdteDc3IHBvd2VyIDEgNCAtMiAtPiAxCitwd214NzggcG93ZXIgMSA1IDEgLT4gMAorcHdteDc5IHBvd2VyIDEgNSAyIC0+IDEKK3B3bXg4MCBwb3dlciAxIDUgMyAtPiAxCitwd214ODEgcG93ZXIgMSA1IDQgLT4gMQorcHdteDgyIHBvd2VyIDEgNSAtMSAtPiAwCitwd214ODMgcG93ZXIgMSA1IC0yIC0+IDEKK3B3bXg4NCBwb3dlciAyIC0wIDEgLT4gMAorcHdteDg1IHBvd2VyIDIgLTAgMiAtPiAxCitwd214ODYgcG93ZXIgMiAtMCAzIC0+IDEKK3B3bXg4NyBwb3dlciAyIC0wIDQgLT4gMQorcHdteDg4IHBvd2VyIDIgLTAgLTEgLT4gMAorcHdteDg5IHBvd2VyIDIgLTAgLTIgLT4gMQorcHdteDkwIHBvd2VyIDIgMCAxIC0+IDAKK3B3bXg5MSBwb3dlciAyIDAgMiAtPiAxCitwd214OTIgcG93ZXIgMiAwIDMgLT4gMQorcHdteDkzIHBvd2VyIDIgMCA0IC0+IDEKK3B3bXg5NCBwb3dlciAyIDAgLTEgLT4gMAorcHdteDk1IHBvd2VyIDIgMCAtMiAtPiAxCitwd214OTYgcG93ZXIgMiAxIDEgLT4gMAorcHdteDk3IHBvd2VyIDIgMSAyIC0+IDAKK3B3bXg5OCBwb3dlciAyIDEgMyAtPiAyCitwd214OTkgcG93ZXIgMiAxIDQgLT4gMgorcHdteDEwMCBwb3dlciAyIDEgLTEgLT4gMAorcHdteDEwMSBwb3dlciAyIDEgLTIgLT4gMAorcHdteDEwMiBwb3dlciAyIDIgMSAtPiAwCitwd214MTAzIHBvd2VyIDIgMiAyIC0+IDAKK3B3bXgxMDQgcG93ZXIgMiAyIDMgLT4gMQorcHdteDEwNSBwb3dlciAyIDIgNCAtPiAwCitwd214MTA2IHBvd2VyIDIgMiAtMSAtPiAwCitwd214MTA3IHBvd2VyIDIgMiAtMiAtPiAwCitwd214MTA4IHBvd2VyIDIgMyAxIC0+IDAKK3B3bXgxMDkgcG93ZXIgMiAzIDIgLT4gMAorcHdteDExMCBwb3dlciAyIDMgMyAtPiAyCitwd214MTExIHBvd2VyIDIgMyA0IC0+IDAKK3B3bXgxMTIgcG93ZXIgMiAzIC0xIC0+IDAKK3B3bXgxMTMgcG93ZXIgMiAzIC0yIC0+IDAKK3B3bXgxMTQgcG93ZXIgMiA0IDEgLT4gMAorcHdteDExNSBwb3dlciAyIDQgMiAtPiAwCitwd214MTE2IHBvd2VyIDIgNCAzIC0+IDEKK3B3bXgxMTcgcG93ZXIgMiA0IDQgLT4gMAorcHdteDExOCBwb3dlciAyIDQgLTEgLT4gMAorcHdteDExOSBwb3dlciAyIDQgLTIgLT4gMAorcHdteDEyMCBwb3dlciAyIDUgMSAtPiAwCitwd214MTIxIHBvd2VyIDIgNSAyIC0+IDAKK3B3bXgxMjIgcG93ZXIgMiA1IDMgLT4gMgorcHdteDEyMyBwb3dlciAyIDUgNCAtPiAwCitwd214MTI0IHBvd2VyIDIgNSAtMSAtPiAwCitwd214MTI1IHBvd2VyIDIgNSAtMiAtPiAwCitwd214MTI2IHBvd2VyIDMgLTAgMSAtPiAwCitwd214MTI3IHBvd2VyIDMgLTAgMiAtPiAxCitwd214MTI4IHBvd2VyIDMgLTAgMyAtPiAxCitwd214MTI5IHBvd2VyIDMgLTAgNCAtPiAxCitwd214MTMwIHBvd2VyIDMgLTAgLTEgLT4gMAorcHdteDEzMSBwb3dlciAzIC0wIC0yIC0+IDEKK3B3bXgxMzIgcG93ZXIgMyAwIDEgLT4gMAorcHdteDEzMyBwb3dlciAzIDAgMiAtPiAxCitwd214MTM0IHBvd2VyIDMgMCAzIC0+IDEKK3B3bXgxMzUgcG93ZXIgMyAwIDQgLT4gMQorcHdteDEzNiBwb3dlciAzIDAgLTEgLT4gMAorcHdteDEzNyBwb3dlciAzIDAgLTIgLT4gMQorcHdteDEzOCBwb3dlciAzIDEgMSAtPiAwCitwd214MTM5IHBvd2VyIDMgMSAyIC0+IDEKK3B3bXgxNDAgcG93ZXIgMyAxIDMgLT4gMAorcHdteDE0MSBwb3dlciAzIDEgNCAtPiAzCitwd214MTQyIHBvd2VyIDMgMSAtMSAtPiAwCitwd214MTQzIHBvd2VyIDMgMSAtMiAtPiAxCitwd214MTQ0IHBvd2VyIDMgMiAxIC0+IDAKK3B3bXgxNDUgcG93ZXIgMyAyIDIgLT4gMQorcHdteDE0NiBwb3dlciAzIDIgMyAtPiAwCitwd214MTQ3IHBvd2VyIDMgMiA0IC0+IDEKK3B3bXgxNDggcG93ZXIgMyAyIC0xIC0+IDAKK3B3bXgxNDkgcG93ZXIgMyAyIC0yIC0+IDEKK3B3bXgxNTAgcG93ZXIgMyAzIDEgLT4gMAorcHdteDE1MSBwb3dlciAzIDMgMiAtPiAxCitwd214MTUyIHBvd2VyIDMgMyAzIC0+IDAKK3B3bXgxNTMgcG93ZXIgMyAzIDQgLT4gMworcHdteDE1NCBwb3dlciAzIDMgLTEgLT4gMAorcHdteDE1NSBwb3dlciAzIDMgLTIgLT4gMQorcHdteDE1NiBwb3dlciAzIDQgMSAtPiAwCitwd214MTU3IHBvd2VyIDMgNCAyIC0+IDEKK3B3bXgxNTggcG93ZXIgMyA0IDMgLT4gMAorcHdteDE1OSBwb3dlciAzIDQgNCAtPiAxCitwd214MTYwIHBvd2VyIDMgNCAtMSAtPiAwCitwd214MTYxIHBvd2VyIDMgNCAtMiAtPiAxCitwd214MTYyIHBvd2VyIDMgNSAxIC0+IDAKK3B3bXgxNjMgcG93ZXIgMyA1IDIgLT4gMQorcHdteDE2NCBwb3dlciAzIDUgMyAtPiAwCitwd214MTY1IHBvd2VyIDMgNSA0IC0+IDMKK3B3bXgxNjYgcG93ZXIgMyA1IC0xIC0+IDAKK3B3bXgxNjcgcG93ZXIgMyA1IC0yIC0+IDEKK3B3bXgxNjggcG93ZXIgLTAgLTAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNjkgcG93ZXIgLTAgLTAgMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzAgcG93ZXIgLTAgLTAgMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzEgcG93ZXIgLTAgLTAgNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzIgcG93ZXIgLTAgLTAgLTEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTczIHBvd2VyIC0wIC0wIC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDE3NCBwb3dlciAtMCAwIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTc1IHBvd2VyIC0wIDAgMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgxNzYgcG93ZXIgLTAgMCAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDE3NyBwb3dlciAtMCAwIDQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTc4IHBvd2VyIC0wIDAgLTEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTc5IHBvd2VyIC0wIDAgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MTgwIHBvd2VyIC0wIDEgMSAtPiAtMAorcHdteDE4MSBwb3dlciAtMCAxIDIgLT4gLTAKK3B3bXgxODIgcG93ZXIgLTAgMSAzIC0+IC0wCitwd214MTgzIHBvd2VyIC0wIDEgNCAtPiAtMAorcHdteDE4NCBwb3dlciAtMCAxIC0xIC0+IC0wCitwd214MTg1IHBvd2VyIC0wIDEgLTIgLT4gLTAKK3B3bXgxODYgcG93ZXIgLTAgMiAxIC0+IDAKK3B3bXgxODcgcG93ZXIgLTAgMiAyIC0+IDAKK3B3bXgxODggcG93ZXIgLTAgMiAzIC0+IDAKK3B3bXgxODkgcG93ZXIgLTAgMiA0IC0+IDAKK3B3bXgxOTAgcG93ZXIgLTAgMiAtMSAtPiAwCitwd214MTkxIHBvd2VyIC0wIDIgLTIgLT4gMAorcHdteDE5MiBwb3dlciAtMCAzIDEgLT4gLTAKK3B3bXgxOTMgcG93ZXIgLTAgMyAyIC0+IC0wCitwd214MTk0IHBvd2VyIC0wIDMgMyAtPiAtMAorcHdteDE5NSBwb3dlciAtMCAzIDQgLT4gLTAKK3B3bXgxOTYgcG93ZXIgLTAgMyAtMSAtPiAtMAorcHdteDE5NyBwb3dlciAtMCAzIC0yIC0+IC0wCitwd214MTk4IHBvd2VyIC0wIDQgMSAtPiAwCitwd214MTk5IHBvd2VyIC0wIDQgMiAtPiAwCitwd214MjAwIHBvd2VyIC0wIDQgMyAtPiAwCitwd214MjAxIHBvd2VyIC0wIDQgNCAtPiAwCitwd214MjAyIHBvd2VyIC0wIDQgLTEgLT4gMAorcHdteDIwMyBwb3dlciAtMCA0IC0yIC0+IDAKK3B3bXgyMDQgcG93ZXIgLTAgNSAxIC0+IC0wCitwd214MjA1IHBvd2VyIC0wIDUgMiAtPiAtMAorcHdteDIwNiBwb3dlciAtMCA1IDMgLT4gLTAKK3B3bXgyMDcgcG93ZXIgLTAgNSA0IC0+IC0wCitwd214MjA4IHBvd2VyIC0wIDUgLTEgLT4gLTAKK3B3bXgyMDkgcG93ZXIgLTAgNSAtMiAtPiAtMAorcHdteDIxMCBwb3dlciAtMSAtMCAxIC0+IDAKK3B3bXgyMTEgcG93ZXIgLTEgLTAgMiAtPiAxCitwd214MjEyIHBvd2VyIC0xIC0wIDMgLT4gMQorcHdteDIxMyBwb3dlciAtMSAtMCA0IC0+IDEKK3B3bXgyMTQgcG93ZXIgLTEgLTAgLTEgLT4gMAorcHdteDIxNSBwb3dlciAtMSAtMCAtMiAtPiAxCitwd214MjE2IHBvd2VyIC0xIDAgMSAtPiAwCitwd214MjE3IHBvd2VyIC0xIDAgMiAtPiAxCitwd214MjE4IHBvd2VyIC0xIDAgMyAtPiAxCitwd214MjE5IHBvd2VyIC0xIDAgNCAtPiAxCitwd214MjIwIHBvd2VyIC0xIDAgLTEgLT4gMAorcHdteDIyMSBwb3dlciAtMSAwIC0yIC0+IDEKK3B3bXgyMjIgcG93ZXIgLTEgMSAxIC0+IC0wCitwd214MjIzIHBvd2VyIC0xIDEgMiAtPiAtMQorcHdteDIyNCBwb3dlciAtMSAxIDMgLT4gLTEKK3B3bXgyMjUgcG93ZXIgLTEgMSA0IC0+IC0xCitwd214MjI2IHBvd2VyIC0xIDEgLTEgLT4gLTAKK3B3bXgyMjcgcG93ZXIgLTEgMSAtMiAtPiAtMQorcHdteDIyOCBwb3dlciAtMSAyIDEgLT4gMAorcHdteDIyOSBwb3dlciAtMSAyIDIgLT4gMQorcHdteDIzMCBwb3dlciAtMSAyIDMgLT4gMQorcHdteDIzMSBwb3dlciAtMSAyIDQgLT4gMQorcHdteDIzMiBwb3dlciAtMSAyIC0xIC0+IDAKK3B3bXgyMzMgcG93ZXIgLTEgMiAtMiAtPiAxCitwd214MjM0IHBvd2VyIC0xIDMgMSAtPiAtMAorcHdteDIzNSBwb3dlciAtMSAzIDIgLT4gLTEKK3B3bXgyMzYgcG93ZXIgLTEgMyAzIC0+IC0xCitwd214MjM3IHBvd2VyIC0xIDMgNCAtPiAtMQorcHdteDIzOCBwb3dlciAtMSAzIC0xIC0+IC0wCitwd214MjM5IHBvd2VyIC0xIDMgLTIgLT4gLTEKK3B3bXgyNDAgcG93ZXIgLTEgNCAxIC0+IDAKK3B3bXgyNDEgcG93ZXIgLTEgNCAyIC0+IDEKK3B3bXgyNDIgcG93ZXIgLTEgNCAzIC0+IDEKK3B3bXgyNDMgcG93ZXIgLTEgNCA0IC0+IDEKK3B3bXgyNDQgcG93ZXIgLTEgNCAtMSAtPiAwCitwd214MjQ1IHBvd2VyIC0xIDQgLTIgLT4gMQorcHdteDI0NiBwb3dlciAtMSA1IDEgLT4gLTAKK3B3bXgyNDcgcG93ZXIgLTEgNSAyIC0+IC0xCitwd214MjQ4IHBvd2VyIC0xIDUgMyAtPiAtMQorcHdteDI0OSBwb3dlciAtMSA1IDQgLT4gLTEKK3B3bXgyNTAgcG93ZXIgLTEgNSAtMSAtPiAtMAorcHdteDI1MSBwb3dlciAtMSA1IC0yIC0+IC0xCisKKy0tIFJhbmRvbWx5IGNob3NlbiBsYXJnZXIgdmFsdWVzCitwd214MjUyIHBvd2VyIDAgNCA3IC0+IDAKK3B3bXgyNTMgcG93ZXIgLTQgNSAtOSAtPiAtNworcHdteDI1NCBwb3dlciAtNSA0IC05IC0+IDQKK3B3bXgyNTUgcG93ZXIgLTUwIDI5IDIgLT4gLTAKK3B3bXgyNTYgcG93ZXIgLTEgODMgMyAtPiAtMQorcHdteDI1NyBwb3dlciAtNTUgNjUgLTc1IC0+IC0yNQorcHdteDI1OCBwb3dlciAtNjEzIDE1MSAtMzAyIC0+IC05Citwd214MjU5IHBvd2VyIDU1MSAyMyAtMzUgLT4gMzEKK3B3bXgyNjAgcG93ZXIgNTEgMTQyIDk0MiAtPiA5Citwd214MjYxIHBvd2VyIDY4ODYgOTIwNCAtNjA5MSAtPiA1MDM0Citwd214MjYyIHBvd2VyIDMwNTcgNTg5MCAtMyAtPiAwCitwd214MjYzIHBvd2VyIDU2IDQ0MzggNTM2NSAtPiA1MjEKK3B3bXgyNjQgcG93ZXIgOTYyMzcgMzU2NjkgLTQ2NjY5IC0+IDMwNzE3Citwd214MjY1IHBvd2VyIDQwMDExIDM0Mzc1IC01NzYxMSAtPiA2MjUKK3B3bXgyNjYgcG93ZXIgNDQzMTcgMzg0OTMgLTEyMTk2IC0+IDExMDgxCitwd214MjY3IHBvd2VyIC0yODIzNjggODk1NjMzIC0yMzU4NzAgLT4gLTIyMDkyOAorcHdteDI2OCBwb3dlciA3NzMyOCA4NTI1NTMgLTQwNTUyOSAtPiAxMjkxNzMKK3B3bXgyNjkgcG93ZXIgLTkyOTY1OSA4NTU3MTMgNjUwMzQ4IC0+IC05MDgwMworcHdteDI3MCBwb3dlciA5MDcwNTcgNjU3NDMwOSA0OTI0NzY4IC0+IDMwMTgyNTcKK3B3bXgyNzEgcG93ZXIgLTI4ODc3NTcgMzE5ODQ5MiAtNTg2NDM1MiAtPiAzNDQwMTEzCitwd214MjcyIHBvd2VyIC0yNDczMTAgNjU3MzcxIC03NDE1NzM5IC0+IC0xMzAxODQwCitwd214MjczIHBvd2VyIC04Mzk5MDQ2IDQ1MzM0MDg3IC0yMjM5NTAyMCAtPiAtMTg1MTU4OTYKK3B3bXgyNzQgcG93ZXIgNzk2MjEzOTcgNDg1MDIzNiAxNDg2NTU1IC0+IDkyODcwNgorcHdteDI3NSBwb3dlciA5NjAxMjI1MSAyNzk3MTkwMSA2OTYwOTAzMSAtPiA1MDAyODcyOQorcHdteDI3NiBwb3dlciAtOTA3MzM1NDgxIDc0MTI3OTg2IDU4MjMzMDAxNyAtPiA1MTUyNzE4NworcHdteDI3NyBwb3dlciAtMTQxMTkyOTYwIDgyMTA2MzgyNiAtMjYwODc3OTI4IC0+IDExMjMxODU2MAorcHdteDI3OCBwb3dlciAtNTAxNzExNzAyIDkzNDM1NTk5NCA4MjEzNTE0MyAtPiA2NjU4Njk5NQorcHdteDI3OSBwb3dlciAtOTI1NjM1ODA3NSA4OTAwOTAwMTM4IC00NjcyMjIwMzEgLT4gOTU4MDAyNDYKK3B3bXgyODAgcG93ZXIgLTcwMzE5NjQyOTEgMTc1MTI1NzQ4MyAtOTM1MzM0NDk4IC0+IC02MDc2MjY2MDkKK3B3bXgyODEgcG93ZXIgODQ5NDMxNDk3MSA4NzQwMTk3MjUyIDEwNzUyMjQ5MSAtPiAxNzM3MzY1NQorcHdteDI4MiBwb3dlciA4ODMwNjIxNjg5MCA4NzQ3NzM3NDE2NiAtMjM0OTgwNzYgLT4gMTUxMjk1MjgKK3B3bXgyODMgcG93ZXIgLTMzOTM5NDMyNDc4IDcxNzAxOTYyMzkgMjIxMzM1ODMgLT4gLTExMDE3MDM2Citwd214Mjg0IHBvd2VyIDE5NDY2MjIyNzY3IDMwNDEwNzEwNjE0IDMwNTc1MjA1NiAtPiAxOTE1MDk1MzcKK3B3bXgyODUgcG93ZXIgLTg2NDk0MjQ5NDAwOCAzNzA1NTg4OTk2MzggMzQ2Njg4ODU2IC0+IDU2OTU2NzY4Citwd214Mjg2IHBvd2VyIC01MjU0MDYyMjU2MDMgMzQ1NzAwMjI2ODk4IDIzNzE2MzYyMSAtPiA1Njc4OTUzNAorcHdteDI4NyBwb3dlciA0NjQ2MTIyMTU5NTUgMzEyNDc0NjIxNjUxIC0zMjk0ODU3MDAgLT4gMTg1Mzk3NQorcHdteDI4OCBwb3dlciAtMTY2NDI4MzAzMTI0NCAzNzc0NDc0NjY5ODU1IDkxOTAyMjg2NyAtPiAtNTE2MDM0NTIwCitwd214Mjg5IHBvd2VyIC0zNDcyNDM4NTA2OTEzIDc0MDczMjc1NDk5OTUgLTQ1MTIwNjg1NCAtPiAtNzQ1OTQ3NjEKK3B3bXgyOTAgcG93ZXIgLTQyMjM2NjIxNTI5NDkgNjg5MTA2OTI3OTA2OSA0OTk4NDM1MDMgLT4gLTgwMTM1MjkwCitwd214MjkxIHBvd2VyIC00NDAyMjExOTI3NjgxNiA4MTY4MjY2MTcwMzI2IDU2OTY3OTUwOSAtPiAzNzU3MzQ0NzUKK3B3bXgyOTIgcG93ZXIgLTY2MTk1ODkxMjA3OTAyIDEyNTMyNjkwNTU1ODc1IC0yNDMyNjIxMjkgLT4gLTExMzE4NjgzMworcHdteDI5MyBwb3dlciAtNjkwMzk5MTEyNjMxNjQgNTI3MjY2MDU4NTc2NzMgMzYwNjI1MTk2IC0+IC0yNjg2NjI3NDgKK3B3bXgyOTQgcG93ZXIgLTI5OTAxMDExNjY5OTIwOCA4ODUwOTI1ODkzNTkyMzEgLTczMTMxMDEyMyAtPiAtMTA0MTAzNzY1Citwd214Mjk1IHBvd2VyIC0yMDI0OTU3NzYyOTk3NTggNTAxMTU5MTIyOTQzMTQ1IC02ODYyMzQ4NzAgLT4gLTEzNTUxMTg3OAorcHdteDI5NiBwb3dlciAtNTk1NDExNDc4MDg3Njc2IDgzNjI2OTI3MDQ3MjQ4MSAtMjE0NjE0OTAxIC0+IC0xODM0NDA4MTkKK3B3bXgyOTcgcG93ZXIgLTEzOTU1NTM4MTA1NjIyOSAxMzI0ODA4NTIwMDIwNTA3IC0yMjg5NDQ3MzggLT4gLTIxODk5MTQ3MworcHdteDI5OCBwb3dlciA3ODQ2MzU2MjUwNzcwNTQzIDE3OTgwNDUwNTEwMzY4MTQgLTEwMTAyODk4NSAtPiA3ODA1MTc5Citwd214Mjk5IHBvd2VyIC00Mjk4MDE1ODYyNzA5NDE1IDYwNDk2Njk0NDg0NDIwOSA4ODAyMTI4OTMgLT4gLTg3NDA4NjcxCitwd214MzAwIHBvd2VyIC0zNzM4NDg5NzUzODkxMDg5MyA3NjAyMjIwNjk5NTY1OTI5NSAtOTMwNTEyODQyIC0+IC02OTc3NTcxNTcKK3B3bXgzMDEgcG93ZXIgODIxNjY2NTkwMjgwMDU0NDMgMjMzNzU0MDgyNTE3Njc3MDQgODE3MjcwNzAwIC0+IDc3MDY5NzAwMQorcHdteDMwMiBwb3dlciA5NzQyMDMwMTE5ODE2NTY0MSA3MjIxMzI4Mjk4MzQxNjkyNCA5NDc1MTk3MTYgLT4gNjEwNzExNzIxCitwd214MzAzIHBvd2VyIDkxMzM4MjA0MzQ1MzI0MzYwNyA0NDk2ODE3MDcyNDg1MDAyNjIgMjExMTM1NTQ1IC0+IDc5NTQ0ODk5Citwd214MzA0IHBvd2VyIC0zMTM4MjM2MTM0MTgwNTIxNzEgNTM0NTc5NDA5NjEwMTQyOTM3IC05NDMwNjI5NjggLT4gLTQ0NjAwMTM3OQorcHdteDMwNSBwb3dlciAtOTI4MTA2NTE2ODk0NDk0MDkzIDc2MDAyMDE3NzMzMDExNjUwOSAtNTAwNDM5OTQgLT4gLTQ2MDEwNTc1Citwd214MzA2IHBvd2VyIDQ2OTIxNDY2MDE2Nzk0Mzk3OTYgNDU2NTM1NDUxMTgwNjc2NzgwNCAtNjY3MzM5MDc1IC0+IDQ4MDI3MjA4MQorcHdteDMwNyBwb3dlciA5NzIyMjU2NjMzNTA5MTc3OTMwIDcyNzY1Njg3OTE4NjA1MDU3OTAgNzkyNjc1MzIxIC0+IDE4Mjg3OTc1MgorcHdteDMwOCBwb3dlciA4Njg5ODk5NDg0ODMwMDY0MjI4IDQyOTA4Mjk2NzEyOTYxNTI2MSAtODQ0NTU1NjM3IC0+IDI3MDM3NDU1NworCistLSBBbGwgaW5wdXRzIG11c3QgYmUgaW50ZWdlcnMKK3B3bXgzMDkgcG93ZXIgMi4xIDMgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMTAgcG93ZXIgMC40IDEgNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMTEgcG93ZXIgMiAzLjEgNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMTIgcG93ZXIgMTMgLTEuMiAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMTMgcG93ZXIgMiAzIDUuMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgbm9ubmVnYXRpdmUgKC0wIGlzIG9rYXkpCitwd214MzE0IHBvd2VyIDIgLTMgNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMTUgcG93ZXIgNyAtMSAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMxNiBwb3dlciAwIC0yIDYgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIFRoaXJkIGFyZ3VtZW50IG11c3QgYmUgbm9uemVybworcHdteDMxNyBwb3dlciAxMyAxMDAzIDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MzE4IHBvd2VyIDEgMCAwRSs5ODcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MzE5IHBvd2VyIDAgMiAtMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gSW50ZWdlcnMgYXJlIGZpbmUsIG5vIG1hdHRlciBob3cgdGhleSdyZSBleHByZXNzZWQKK3B3bXgzMjAgcG93ZXIgMTMuMCAxMTcuMDAgMUUrMiAtPiAzMworcHdteDMyMSBwb3dlciAtMkUrMyAxLjFFKzEwIC0xMjMyMyAtPiA0ODExCitwd214MzIyIHBvd2VyIDIwIDBFLTMwMCAxNDMgLT4gMQorcHdteDMyMyBwb3dlciAtMjAgLTBFKzEwMDUgMTE3OSAtPiAxCitwd214MzI0IHBvd2VyIDBFLTEwMDEgMTcgNS42RSs0IC0+IDAKKworLS0gTW9kdWx1cyBtdXN0IG5vdCBleGNlZWQgcHJlY2lzaW9uCitwd214MzI1IHBvd2VyIDAgMSAxMjM0NTY3ODkwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDMyNiBwb3dlciAxIDAgMTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXgzMjcgcG93ZXIgLTIzIDUgLTEwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214MzI4IHBvd2VyIDQxNTU3IDIxMyAtOTk5OTk5OTk5IC0+IDQ3NjUwNDU2Citwd214MzI5IHBvd2VyIC0yMTM0IDE5OSA5OTk5OTk5OTcgLT4gLTk0Njk1NzkxMgorCistLSBIdWdlIGJhc2Ugc2hvdWxkbid0IHByZXNlbnQgYW55IHByb2JsZW1zCitwd214MzMwIHBvd2VyIDEuMjNFKzEyMzQ1Njc5MSAxMDEyMzg5OCAxNzI5MTA2NSAtPiA1Njc0MDQ1CisKKy0tIExhcmdlIGV4cG9uZW50LCBtYXkgYmUgc2xvdworLS0gKGlmIHNlY29uZCBhcmd1bWVudCBpcyAxRW4gdGhlbiBleHBlY3QgTyhuKSBydW5uaW5nIHRpbWUpCitwd214MzMxIHBvd2VyIDEwMDAyODg4OTYgOS44N0UrMTIzNDcgOTMzNzk5MDggLT4gNDMyMjQ5MjQKKworLS0gVHJpcGxlIE5hTiBwcm9wYWdhdGlvbiAoYWRhcHRlZCBmcm9tIGV4YW1wbGVzIGluIGZtYS5kZWNUZXN0KQorcHdteDQwMCBwb3dlciAgTmFOMiAgTmFOMyAgTmFONSAgIC0+ICBOYU4yCitwd214NDAxIHBvd2VyICAxICAgICBOYU4zICBOYU41ICAgLT4gIE5hTjMKK3B3bXg0MDIgcG93ZXIgIDEgICAgIDEgICAgIE5hTjUgICAtPiAgTmFONQorcHdteDQwMyBwb3dlciAgc05hTjEgc05hTjIgc05hTjMgIC0+ICBOYU4xIEludmFsaWRfb3BlcmF0aW9uCitwd214NDA0IHBvd2VyICAxICAgICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MDUgcG93ZXIgIDEgICAgIDEgICAgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorcHdteDQwNiBwb3dlciAgc05hTjEgc05hTjIgc05hTjMgIC0+ICBOYU4xIEludmFsaWRfb3BlcmF0aW9uCitwd214NDA3IHBvd2VyICBOYU43ICBzTmFOMiBzTmFOMyAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MDggcG93ZXIgIE5hTjcgIE5hTjUgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorCistLSBJbmZpbml0aWVzIG5vdCBhbGxvd2VkCitwd214NDEwIHBvd2VyIEluZiAxIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214NDExIHBvd2VyIDEgSW5mIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214NDEyIHBvd2VyIDEgMSBJbmYgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd214NDEzIHBvd2VyIC1JbmYgMSAxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdteDQxNCBwb3dlciAxIC1JbmYgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3bXg0MTUgcG93ZXIgMSAxIC1JbmYgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEp1c3QgZm9yIGZ1bjogMTcyOSBpcyBhIENhcm1pY2hhZWwgbnVtYmVyCitwd214NDIwIHBvd2VyIDAgMTcyOCAxNzI5IC0+IDAKK3B3bXg0MjEgcG93ZXIgMSAxNzI4IDE3MjkgLT4gMQorcHdteDQyMiBwb3dlciAyIDE3MjggMTcyOSAtPiAxCitwd214NDIzIHBvd2VyIDMgMTcyOCAxNzI5IC0+IDEKK3B3bXg0MjQgcG93ZXIgNCAxNzI4IDE3MjkgLT4gMQorcHdteDQyNSBwb3dlciA1IDE3MjggMTcyOSAtPiAxCitwd214NDI2IHBvd2VyIDYgMTcyOCAxNzI5IC0+IDEKK3B3bXg0MjcgcG93ZXIgNyAxNzI4IDE3MjkgLT4gNzQyCitwd214NDI4IHBvd2VyIDggMTcyOCAxNzI5IC0+IDEKK3B3bXg0MjkgcG93ZXIgOSAxNzI4IDE3MjkgLT4gMQorcHdteDQzMCBwb3dlciAxMCAxNzI4IDE3MjkgLT4gMQorcHdteDQzMSBwb3dlciAxMSAxNzI4IDE3MjkgLT4gMQorcHdteDQzMiBwb3dlciAxMiAxNzI4IDE3MjkgLT4gMQorcHdteDQzMyBwb3dlciAxMyAxNzI4IDE3MjkgLT4gNTMzCitwd214NDM0IHBvd2VyIDE0IDE3MjggMTcyOSAtPiA3NDIKK3B3bXg0MzUgcG93ZXIgMTUgMTcyOCAxNzI5IC0+IDEKK3B3bXg0MzYgcG93ZXIgMTYgMTcyOCAxNzI5IC0+IDEKK3B3bXg0MzcgcG93ZXIgMTcgMTcyOCAxNzI5IC0+IDEKK3B3bXg0MzggcG93ZXIgMTggMTcyOCAxNzI5IC0+IDEKK3B3bXg0MzkgcG93ZXIgMTkgMTcyOCAxNzI5IC0+IDQ1NgorcHdteDQ0MCBwb3dlciAyMCAxNzI4IDE3MjkgLT4gMQorCistLSBwbHVzIGFuZCBtaW51cyB6ZXJvIGluIHZhcmlvdXMgcm91bmRpbmcgbW9kZXMgKHNlZSBpc3N1ZSAxMTEzMSkKK2V4dGVuZGVkOiAxCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3BsdXgxMDAwIHBsdXMgMC4wIC0+IDAuMAorcGx1eDEwMDEgcGx1cyAtMC4wIC0+IDAuMAorbWlueDEwMDAgbWludXMgMC4wIC0+IDAuMAorbWlueDEwMDEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDAwIGFicyAwLjAgLT4gMC4wCithYnN4MTAwMSBhYnMgLTAuMCAtPiAwLjAKKworcm91bmRpbmc6IGhhbGZfdXAKK3BsdXgxMDEwIHBsdXMgMC4wIC0+IDAuMAorbWlueDEwMTAgbWludXMgMC4wIC0+IDAuMAorcGx1eDEwMTEgcGx1cyAtMC4wIC0+IDAuMAorbWlueDEwMTEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDEwIGFicyAwLjAgLT4gMC4wCithYnN4MTAxMSBhYnMgLTAuMCAtPiAwLjAKKworcm91bmRpbmc6IGNlaWxpbmcKK3BsdXgxMDIwIHBsdXMgMC4wIC0+IDAuMAorbWlueDEwMjAgbWludXMgMC4wIC0+IDAuMAorcGx1eDEwMjEgcGx1cyAtMC4wIC0+IDAuMAorbWlueDEwMjEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDIwIGFicyAwLjAgLT4gMC4wCithYnN4MTAyMSBhYnMgLTAuMCAtPiAwLjAKKworcm91bmRpbmc6IGZsb29yCitwbHV4MTAzMCBwbHVzIDAuMCAtPiAwLjAKK21pbngxMDMwIG1pbnVzIDAuMCAtPiAtMC4wCitwbHV4MTAzMSBwbHVzIC0wLjAgLT4gLTAuMAorbWlueDEwMzEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDMwIGFicyAwLjAgLT4gMC4wCithYnN4MTAzMSBhYnMgLTAuMCAtPiAwLjAKKworcm91bmRpbmc6IGRvd24KK3BsdXgxMDQwIHBsdXMgMC4wIC0+IDAuMAorbWlueDEwNDAgbWludXMgMC4wIC0+IDAuMAorcGx1eDEwNDEgcGx1cyAtMC4wIC0+IDAuMAorbWlueDEwNDEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDQwIGFicyAwLjAgLT4gMC4wCithYnN4MTA0MSBhYnMgLTAuMCAtPiAwLjAKKworcm91bmRpbmc6IHVwCitwbHV4MTA1MCBwbHVzIDAuMCAtPiAwLjAKK21pbngxMDUwIG1pbnVzIDAuMCAtPiAwLjAKK3BsdXgxMDUxIHBsdXMgLTAuMCAtPiAwLjAKK21pbngxMDUxIG1pbnVzIC0wLjAgLT4gMC4wCithYnN4MTA1MCBhYnMgMC4wIC0+IDAuMAorYWJzeDEwNTEgYWJzIC0wLjAgLT4gMC4wCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK3BsdXgxMDYwIHBsdXMgMC4wIC0+IDAuMAorbWlueDEwNjAgbWludXMgMC4wIC0+IDAuMAorcGx1eDEwNjEgcGx1cyAtMC4wIC0+IDAuMAorbWlueDEwNjEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDYwIGFicyAwLjAgLT4gMC4wCithYnN4MTA2MSBhYnMgLTAuMCAtPiAwLjAKKworcm91bmRpbmc6IDA1dXAKK3BsdXgxMDcwIHBsdXMgMC4wIC0+IDAuMAorbWlueDEwNzAgbWludXMgMC4wIC0+IDAuMAorcGx1eDEwNzEgcGx1cyAtMC4wIC0+IDAuMAorbWlueDEwNzEgbWludXMgLTAuMCAtPiAwLjAKK2Fic3gxMDcwIGFicyAwLjAgLT4gMC4wCithYnN4MTA3MSBhYnMgLTAuMCAtPiAwLjAKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvZm1hLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2ZtYS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MTk3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2ZtYS5kZWNUZXN0CkBAIC0wLDAgKzEsMzQyNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBmbWEuZGVjVGVzdCAtLSBkZWNpbWFsIGZ1c2VkIG11bHRpcGx5IGFkZCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIFRoZXNlIHRlc3RzIGNvbXByZXNlIHRocmVlIHBhcnRzOgorLS0gICAxLiBTYW5pdHkgY2hlY2tzIGFuZCBvdGhlciB0aHJlZS1vcGVyYW5kIHRlc3RzIChlc3BlY2lhbGx5IHRob3NlCistLSAgICAgIHdoZXJlIHRoZSBmdXNlZCBvcGVyYXRpb24gbWFrZXMgYSBkaWZmZXJlbmNlKQorLS0gICAyLiBNdWx0aXBseSB0ZXN0cyAodGhpcmQgb3BlcmFuZCBpcyBuZXV0cmFsIHplcm8gWzBFK2VtYXhdKQorLS0gICAzLiBBZGRpdGlvbiB0ZXN0cyAoZmlyc3Qgb3BlcmFuZCBpcyAxKQorLS0gVGhlIG11bHRpcGx5IGFuZCBhZGRpdGlvbiB0ZXN0cyBhcmUgZXh0ZW5zaXZlIGJlY2F1c2UgRk1BIG1heSBoYXZlCistLSBpdHMgb3duIGRlZGljYXRlZCBtdWx0aXBsaWNhdGlvbiBvciBhZGRpdGlvbiByb3V0aW5lKHMpLCBhbmQgdGhleQorLS0gYWxzbyBpbmhlcmVudGx5IGNoZWNrIHRoZSBsZWZ0LXRvLXJpZ2h0IHByb3BlcnRpZXMuCisKKy0tIFNhbml0eSBjaGVja3MKK2ZtYXgwMDAxIGZtYSAgMSAgIDEgICAxIC0+ICAgMgorZm1heDAwMDIgZm1hICAxICAgMSAgIDIgLT4gICAzCitmbWF4MDAwMyBmbWEgIDIgICAyICAgMyAtPiAgIDcKK2ZtYXgwMDA0IGZtYSAgOSAgIDkgICA5IC0+ICA5MAorZm1heDAwMDUgZm1hIC0xICAgMSAgIDEgLT4gICAwCitmbWF4MDAwNiBmbWEgLTEgICAxICAgMiAtPiAgIDEKK2ZtYXgwMDA3IGZtYSAtMiAgIDIgICAzIC0+ICAtMQorZm1heDAwMDggZm1hIC05ICAgOSAgIDkgLT4gLTcyCitmbWF4MDAxMSBmbWEgIDEgIC0xICAgMSAtPiAgIDAKK2ZtYXgwMDEyIGZtYSAgMSAgLTEgICAyIC0+ICAgMQorZm1heDAwMTMgZm1hICAyICAtMiAgIDMgLT4gIC0xCitmbWF4MDAxNCBmbWEgIDkgIC05ICAgOSAtPiAtNzIKK2ZtYXgwMDE1IGZtYSAgMSAgIDEgIC0xIC0+ICAgMAorZm1heDAwMTYgZm1hICAxICAgMSAgLTIgLT4gIC0xCitmbWF4MDAxNyBmbWEgIDIgICAyICAtMyAtPiAgIDEKK2ZtYXgwMDE4IGZtYSAgOSAgIDkgIC05IC0+ICA3MgorZm1heDAwMTkgZm1hICAzICAgNSAgIDcgLT4gIDIyCitmbWF4MDAyOSBmbWEgIDMgIC01ICAgNyAtPiAgLTgKKworLS0gbm9uLWludGVnZXIgZXhhY3RzCitmbWEwMTAwICBmbWEgICAgMjUuMiAgIDYzLjYgICAtNDM4ICAtPiAgMTE2NC43MgorZm1hMDEwMSAgZm1hICAgMC4zMDEgIDAuMzgwICAgIDMzNCAgLT4gIDMzNC4xMTQzODAKK2ZtYTAxMDIgIGZtYSAgICA0OS4yICAgLTQuOCAgIDIzLjMgIC0+ICAtMjEyLjg2CitmbWEwMTAzICBmbWEgICAgNC4yMiAgMC4wNzkgIC05NC42ICAtPiAgLTk0LjI2NjYyCitmbWEwMTA0ICBmbWEgICAgIDkwMyAgMC43OTcgIDAuODg3ICAtPiAgNzIwLjU3OAorZm1hMDEwNSAgZm1hICAgIDYuMTMgICAtMTYxICAgNjUuOSAgLT4gIC05MjEuMDMKK2ZtYTAxMDYgIGZtYSAgICAyOC4yICAgIDcyNyAgIDUuNDUgIC0+ICAyMDUwNi44NQorZm1hMDEwNyAgZm1hICAgICAgIDQgICAgNjA1ICAgIDY4OCAgLT4gIDMxMDgKK2ZtYTAxMDggIGZtYSAgICA5My4zICAgMC4xOSAgMC4yMjYgIC0+ICAxNy45NTMKK2ZtYTAxMDkgIGZtYSAgIDAuMTY5ICAgLTM0MSAgIDUuNjEgIC0+ICAtNTIuMDE5CitmbWEwMTEwICBmbWEgICAtNzIuMiAgICAgMzAgIC01MS4yICAtPiAgLTIyMTcuMgorZm1hMDExMSAgZm1hICAtMC40MDkgICAgIDEzICAgMjAuNCAgLT4gIDE1LjA4MworZm1hMDExMiAgZm1hICAgICAzMTcgICA3Ny4wICAgMTkuMCAgLT4gIDI0NDI4LjAKK2ZtYTAxMTMgIGZtYSAgICAgIDQ3ICAgNi41OCAgIDEuNjIgIC0+ICAzMTAuODgKK2ZtYTAxMTQgIGZtYSAgICAxLjM2ICAwLjk4NCAgMC40OTMgIC0+ICAxLjgzMTI0CitmbWEwMTE1ICBmbWEgICAgNzIuNyAgICAyNzQgICAxLjU2ICAtPiAgMTk5MjEuMzYKK2ZtYTAxMTYgIGZtYSAgICAgMzM1ICAgIDg0NyAgICAgODMgIC0+ICAyODM4MjgKK2ZtYTAxMTcgIGZtYSAgICAgNjY2ICAwLjI0NyAgIDI1LjQgIC0+ICAxODkuOTAyCitmbWEwMTE4ICBmbWEgICAtMy44NyAgIDMuMDYgICA3OC4wICAtPiAgNjYuMTU3OAorZm1hMDExOSAgZm1hICAgMC43NDIgICAgMTkyICAgMzUuNiAgLT4gIDE3OC4wNjQKK2ZtYTAxMjAgIGZtYSAgIC05MS42ICAgNS4yOSAgMC4xNTMgIC0+ICAtNDg0LjQxMQorCistLSBjYXNlcyB3aGVyZSByZXN1bHQgaXMgZGlmZmVyZW50IGZyb20gc2VwYXJhdGUgbXVsdGlwbHkgKyBhZGQ7IGVhY2gKKy0tIGlzIHByZWNlZGVkIGJ5IHRoZSByZXN1bHQgb2YgdW5mdXNlZCBtdWx0aXBseSBhbmQgYWRkCistLSBbdGhpcyBpcyBhYm91dCAyMCUgb2YgYWxsIHNpbWlsYXIgIGNhc2VzIGluIGdlbmVyYWxdCistLSAgICAgICAgICAgICAgIDg4ODU2NTI5MCAgIDE1NTcuOTY5MzAgIC04NjA4Ny43NTc4ICAtPiAxLjM4NDM1NzM1RSsxMgorZm1hMDIwMSAgZm1hICAgICA4ODg1NjUyOTAgICAxNTU3Ljk2OTMwICAtODYwODcuNzU3OCAgLT4gMS4zODQzNTczNkUrMTIgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgLTg1NTE5MzQyLjkgICAgNzM1MTU1NDE5ICAgICA0MjAxMDQzMSAgLT4gLTYuMjg3MDAwODRFKzE2CitmbWEwMjA1ICBmbWEgICAtODU1MTkzNDIuOSAgICA3MzUxNTU0MTkgICAgIDQyMDEwNDMxICAtPiAtNi4yODcwMDA4M0UrMTYgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgICAtOTgwMjUuNSAgLTI5NDYwMy40NzIgICAxMDQxNDM0OC4yICAtPiAyLjg4ODkwNjY5RSsxMAorZm1hMDIwOCAgZm1hICAgICAgLTk4MDI1LjUgIC0yOTQ2MDMuNDcyICAgMTA0MTQzNDguMiAgLT4gMi44ODg5MDY3MEUrMTAgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgIDU5Njc2MjcuMzkgICA4MzUyNjU0MC42ICAgNDk4NDk0LjgxMCAgLT4gNC45ODQ1NTI3MUUrMTQKK2ZtYTAyMTEgIGZtYSAgICA1OTY3NjI3LjM5ICAgODM1MjY1NDAuNiAgIDQ5ODQ5NC44MTAgIC0+IDQuOTg0NTUyNzJFKzE0ICBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgMzQ1Ni45NDMzICAgIDg3NC4zOTUxOCAgIDE5Nzg2Ni42MTUgIC0+ICAzMjIwNjAxLjE4CitmbWEwMjE2ICBmbWEgICAgIDM0NTYuOTQzMyAgICA4NzQuMzk1MTggICAxOTc4NjYuNjE1ICAtPiAgMzIyMDYwMS4xNyAgICAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgNjI3NjkuODI4NyAgIDIwOTYuOTg5MjcgICAgNDguNDIwMzE3ICAtPiAgMTMxNjI3NzA1CitmbWEwMjE4ICBmbWEgICAgNjI3NjkuODI4NyAgIDIwOTYuOTg5MjcgICAgNDguNDIwMzE3ICAtPiAgMTMxNjI3NzA2ICAgICAgSW5leGFjdCBSb3VuZGVkCistLSAgICAgICAgICAgICAgIC02OC44MTUwMCAgIDU5OTYxMTEzLjkgICAgIC04OTg4ODYyICAtPiAtNC4xMzUyMTI5MUUrOQorZm1hMDIxOSAgZm1hICAgICAtNjguODE1MDAgICA1OTk2MTExMy45ICAgICAtODk4ODg2MiAgLT4gLTQuMTM1MjEyOTJFKzkgIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgIDIxMjYzNDEuMDIgICA2MzQ5MS41MTUyICAgIDMwMjQyNzQ1NSAgLT4gMS4zNTMwNzA0MEUrMTEKK2ZtYTAyMjYgIGZtYSAgICAyMTI2MzQxLjAyICAgNjM0OTEuNTE1MiAgICAzMDI0Mjc0NTUgIC0+IDEuMzUzMDcwNDFFKzExICBJbmV4YWN0IFJvdW5kZWQKKworCistLSBJbmZpbml0ZSBjb21iaW5hdGlvbnMKK2ZtYXgwODAwIGZtYSAgSW5mICAgSW5mICAgSW5mICAgIC0+ICBJbmZpbml0eQorZm1heDA4MDEgZm1hICBJbmYgICBJbmYgIC1JbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDA4MDIgZm1hICBJbmYgIC1JbmYgICBJbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDA4MDMgZm1hICBJbmYgIC1JbmYgIC1JbmYgICAgLT4gLUluZmluaXR5CitmbWF4MDgwNCBmbWEgLUluZiAgIEluZiAgIEluZiAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDgwNSBmbWEgLUluZiAgIEluZiAgLUluZiAgICAtPiAtSW5maW5pdHkKK2ZtYXgwODA2IGZtYSAtSW5mICAtSW5mICAgSW5mICAgIC0+ICBJbmZpbml0eQorZm1heDA4MDcgZm1hIC1JbmYgIC1JbmYgIC1JbmYgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDA4MDggZm1hIC1JbmYgICAwICAgICAgIDEgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDA4MDkgZm1hIC1JbmYgICAwICAgICBOYU4gICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBUcmlwbGUgTmFOIHByb3BhZ2F0aW9uCitmbWF4MDkwMCBmbWEgIE5hTjIgIE5hTjMgIE5hTjUgICAtPiAgTmFOMgorZm1heDA5MDEgZm1hICAwICAgICBOYU4zICBOYU41ICAgLT4gIE5hTjMKK2ZtYXgwOTAyIGZtYSAgMCAgICAgMCAgICAgTmFONSAgIC0+ICBOYU41CistLSBmaXJzdCBzTmFOIHdpbnMgKGNvbnNpZGVyIHFOYU4gZnJvbSBlYXJsaWVyIHNOYU4gYmVpbmcKKy0tIG92ZXJyaWRkZW4gYnkgYW4gc05hTiBpbiB0aGlyZCBvcGVyYW5kKQorZm1heDA5MDMgZm1hICBzTmFOMSBzTmFOMiBzTmFOMyAgLT4gIE5hTjEgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgwOTA0IGZtYSAgMCAgICAgc05hTjIgc05hTjMgIC0+ICBOYU4yIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDkwNSBmbWEgIDAgICAgIDAgICAgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorZm1heDA5MDYgZm1hICBzTmFOMSBzTmFOMiBzTmFOMyAgLT4gIE5hTjEgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgwOTA3IGZtYSAgTmFONyAgc05hTjIgc05hTjMgIC0+ICBOYU4yIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MDkwOCBmbWEgIE5hTjcgIE5hTjUgIHNOYU4zICAtPiAgTmFOMyBJbnZhbGlkX29wZXJhdGlvbgorCistLSBNVUxUSVBMSUNBVElPTiBURVNUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHNhbml0eSBjaGVja3MgKGFzIGJhc2UsIGFib3ZlKQorZm1heDIwMDAgZm1hIDIgICAgICAyICAwRSs5OTk5OTkgIC0+IDQKK2ZtYXgyMDAxIGZtYSAyICAgICAgMyAgMEUrOTk5OTk5ICAtPiA2CitmbWF4MjAwMiBmbWEgNSAgICAgIDEgIDBFKzk5OTk5OSAgLT4gNQorZm1heDIwMDMgZm1hIDUgICAgICAyICAwRSs5OTk5OTkgIC0+IDEwCitmbWF4MjAwNCBmbWEgMS4yMCAgIDIgIDBFKzk5OTk5OSAgLT4gMi40MAorZm1heDIwMDUgZm1hIDEuMjAgICAwICAwRSs5OTk5OTkgIC0+IDAuMDAKK2ZtYXgyMDA2IGZtYSAxLjIwICAtMiAgMEUrOTk5OTk5ICAtPiAtMi40MAorZm1heDIwMDcgZm1hIC0xLjIwICAyICAwRSs5OTk5OTkgIC0+IC0yLjQwCitmbWF4MjAwOCBmbWEgLTEuMjAgIDAgIDBFKzk5OTk5OSAgLT4gMC4wMAorZm1heDIwMDkgZm1hIC0xLjIwIC0yICAwRSs5OTk5OTkgIC0+IDIuNDAKK2ZtYXgyMDEwIGZtYSA1LjA5IDcuMSAgMEUrOTk5OTk5ICAtPiAzNi4xMzkKK2ZtYXgyMDExIGZtYSAyLjUgICAgNCAgMEUrOTk5OTk5ICAtPiAxMC4wCitmbWF4MjAxMiBmbWEgMi41MCAgIDQgIDBFKzk5OTk5OSAgLT4gMTAuMDAKK2ZtYXgyMDEzIGZtYSAxLjIzNDU2Nzg5IDEuMDAwMDAwMDAgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1Njc4OSBSb3VuZGVkCitmbWF4MjAxNCBmbWEgOS45OTk5OTk5OTkgOS45OTk5OTk5OTkgIDBFKzk5OTk5OSAgLT4gMTAwLjAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDE1IGZtYSAyLjUwICAgNCAgMEUrOTk5OTk5ICAtPiAxMC4wMAorcHJlY2lzaW9uOiA2CitmbWF4MjAxNiBmbWEgMi41MCAgIDQgIDBFKzk5OTk5OSAgLT4gMTAuMDAKK2ZtYXgyMDE3IGZtYSAgOS45OTk5OTkgIDkuOTk5OTk5ICAwRSs5OTk5OTkgIC0+ICAxMDAuMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDIwMTggZm1hICA5Ljk5OTk5OSAtOS45OTk5OTkgIDBFKzk5OTk5OSAgLT4gLTEwMC4wMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MjAxOSBmbWEgLTkuOTk5OTk5ICA5Ljk5OTk5OSAgMEUrOTk5OTk5ICAtPiAtMTAwLjAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDIwIGZtYSAtOS45OTk5OTkgLTkuOTk5OTk5ICAwRSs5OTk5OTkgIC0+ICAxMDAuMDAwIEluZXhhY3QgUm91bmRlZAorCistLSAxOTk5LjEyLjIxOiBuZXh0IG9uZSBpcyBhIGVkZ2UgY2FzZSBpZiBpbnRlcm1lZGlhdGUgbG9uZ3MgYXJlIHVzZWQKK3ByZWNpc2lvbjogMTUKK2ZtYXgyMDU5IGZtYSA5OTk5OTk5OTk5OTkgOTc2NTYyNSAgMEUrOTk5OTk5ICAtPiA5Ljc2NTYyNDk5OTk5MDIzRSsxOCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzAKK2ZtYXgyMTYwIGZtYSA5OTk5OTk5OTk5OTkgOTc2NTYyNSAgMEUrOTk5OTk5ICAtPiA5NzY1NjI0OTk5OTkwMjM0Mzc1CitwcmVjaXNpb246IDkKKy0tLS0tCisKKy0tIHplcm9zLCBldGMuCitmbWF4MjAyMSBmbWEgIDAgICAgICAwICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDIwMjIgZm1hICAwICAgICAtMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyMDIzIGZtYSAtMCAgICAgIDAgICAgICAwRSs5OTk5OTkgIC0+ICAwCitmbWF4MjAyNCBmbWEgLTAgICAgIC0wICAgICAgMEUrOTk5OTk5ICAtPiAgMAorZm1heDIwMjUgZm1hIC0wLjAgICAtMC4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMDAKK2ZtYXgyMDI2IGZtYSAtMC4wICAgLTAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAwCitmbWF4MjAyNyBmbWEgLTAuMCAgIC0wLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDIwMjggZm1hIC0wLjAgICAtMC4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMDAKK2ZtYXgyMDMwIGZtYSAgNS4wMCAgIDFFLTMgICAwRSs5OTk5OTkgIC0+ICAwLjAwNTAwCitmbWF4MjAzMSBmbWEgIDAwLjAwICAwLjAwMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMAorZm1heDIwMzIgZm1hICAwMC4wMCAgMEUtMyAgIDBFKzk5OTk5OSAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitmbWF4MjAzMyBmbWEgIDBFLTMgICAwMC4wMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2ZtYXgyMDM0IGZtYSAtNS4wMCAgIDFFLTMgICAwRSs5OTk5OTkgIC0+IC0wLjAwNTAwCitmbWF4MjAzNSBmbWEgLTAwLjAwICAwLjAwMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMAorZm1heDIwMzYgZm1hIC0wMC4wMCAgMEUtMyAgIDBFKzk5OTk5OSAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitmbWF4MjAzNyBmbWEgLTBFLTMgICAwMC4wMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2ZtYXgyMDM4IGZtYSAgNS4wMCAgLTFFLTMgICAwRSs5OTk5OTkgIC0+IC0wLjAwNTAwCitmbWF4MjAzOSBmbWEgIDAwLjAwIC0wLjAwMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMAorZm1heDIwNDAgZm1hICAwMC4wMCAtMEUtMyAgIDBFKzk5OTk5OSAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitmbWF4MjA0MSBmbWEgIDBFLTMgIC0wMC4wMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK2ZtYXgyMDQyIGZtYSAtNS4wMCAgLTFFLTMgICAwRSs5OTk5OTkgIC0+ICAwLjAwNTAwCitmbWF4MjA0MyBmbWEgLTAwLjAwIC0wLjAwMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMAorZm1heDIwNDQgZm1hIC0wMC4wMCAtMEUtMyAgIDBFKzk5OTk5OSAgLT4gIDAuMDAwMDAgICAgIC0tIHJocyBpcyAwCitmbWF4MjA0NSBmbWEgLTBFLTMgIC0wMC4wMCAgMEUrOTk5OTk5ICAtPiAgMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aCBtdWx0aXBseQorZm1heDIwNTAgZm1hIDEuMjAgMyAgICAgICAgIDBFKzk5OTk5OSAgLT4gMy42MAorZm1heDIwNTEgZm1hIDcgICAgMyAgICAgICAgIDBFKzk5OTk5OSAgLT4gMjEKK2ZtYXgyMDUyIGZtYSAwLjkgIDAuOCAgICAgICAwRSs5OTk5OTkgIC0+IDAuNzIKK2ZtYXgyMDUzIGZtYSAwLjkgIC0wICAgICAgICAwRSs5OTk5OTkgIC0+IDAuMAorZm1heDIwNTQgZm1hIDY1NDMyMSA2NTQzMjEgIDBFKzk5OTk5OSAgLT4gNC4yODEzNTk3MUUrMTEgIEluZXhhY3QgUm91bmRlZAorCitmbWF4MjA2MCBmbWEgMTIzLjQ1IDFlNyAgIDBFKzk5OTk5OSAgLT4gIDEuMjM0NUUrOQorZm1heDIwNjEgZm1hIDEyMy40NSAxZTggICAwRSs5OTk5OTkgIC0+ICAxLjIzNDVFKzEwCitmbWF4MjA2MiBmbWEgMTIzLjQ1IDFlKzkgIDBFKzk5OTk5OSAgLT4gIDEuMjM0NUUrMTEKK2ZtYXgyMDYzIGZtYSAxMjMuNDUgMWUxMCAgMEUrOTk5OTk5ICAtPiAgMS4yMzQ1RSsxMgorZm1heDIwNjQgZm1hIDEyMy40NSAxZTExICAwRSs5OTk5OTkgIC0+ICAxLjIzNDVFKzEzCitmbWF4MjA2NSBmbWEgMTIzLjQ1IDFlMTIgIDBFKzk5OTk5OSAgLT4gIDEuMjM0NUUrMTQKK2ZtYXgyMDY2IGZtYSAxMjMuNDUgMWUxMyAgMEUrOTk5OTk5ICAtPiAgMS4yMzQ1RSsxNQorCisKKy0tIHRlc3Qgc29tZSBpbnRlcm1lZGlhdGUgbGVuZ3RocworcHJlY2lzaW9uOiA5CitmbWF4MjA4MCBmbWEgMC4xIDEyMzQ1Njc4OSAgICAgICAgICAgMEUrOTk5OTk5ICAtPiAxMjM0NTY3OC45CitmbWF4MjA4MSBmbWEgMC4xIDEyMzQ1Njc4OTEgICAgICAgICAgMEUrOTk5OTk5ICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitmbWF4MjA4MiBmbWEgMC4xIDEyMzQ1Njc4OTEyICAgICAgICAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorZm1heDIwODMgZm1hIDAuMSAxMjM0NTY3ODkxMjM0NSAgICAgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1Njc4OUUrMTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MjA4NCBmbWEgMC4xIDEyMzQ1Njc4OSAgICAgICAgICAgMEUrOTk5OTk5ICAtPiAxMjM0NTY3OC45CitwcmVjaXNpb246IDgKK2ZtYXgyMDg1IGZtYSAwLjEgMTIzNDU2Nzg5MTIgICAgICAgICAwRSs5OTk5OTkgIC0+IDEuMjM0NTY3OUUrOSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDg2IGZtYSAwLjEgMTIzNDU2Nzg5MTIzNDUgICAgICAwRSs5OTk5OTkgIC0+IDEuMjM0NTY3OUUrMTIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDcKK2ZtYXgyMDg3IGZtYSAwLjEgMTIzNDU2Nzg5MTIgICAgICAgICAwRSs5OTk5OTkgIC0+IDEuMjM0NTY4RSs5IEluZXhhY3QgUm91bmRlZAorZm1heDIwODggZm1hIDAuMSAxMjM0NTY3ODkxMjM0NSAgICAgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1NjhFKzEyIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDkKK2ZtYXgyMDkwIGZtYSAxMjM0NTY3ODkgICAgICAgICAgMC4xICAwRSs5OTk5OTkgIC0+IDEyMzQ1Njc4LjkKK2ZtYXgyMDkxIGZtYSAxMjM0NTY3ODkxICAgICAgICAgMC4xICAwRSs5OTk5OTkgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDkyIGZtYSAxMjM0NTY3ODkxMiAgICAgICAgMC4xICAwRSs5OTk5OTkgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MjA5MyBmbWEgMTIzNDU2Nzg5MTIzNDUgICAgIDAuMSAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2Nzg5RSsxMiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyMDk0IGZtYSAxMjM0NTY3ODkgICAgICAgICAgMC4xICAwRSs5OTk5OTkgIC0+IDEyMzQ1Njc4LjkKK3ByZWNpc2lvbjogOAorZm1heDIwOTUgZm1hIDEyMzQ1Njc4OTEyICAgICAgICAwLjEgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1Njc5RSs5IEluZXhhY3QgUm91bmRlZAorZm1heDIwOTYgZm1hIDEyMzQ1Njc4OTEyMzQ1ICAgICAwLjEgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1Njc5RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNworZm1heDIwOTcgZm1hIDEyMzQ1Njc4OTEyICAgICAgICAwLjEgIDBFKzk5OTk5OSAgLT4gMS4yMzQ1NjhFKzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MjA5OCBmbWEgMTIzNDU2Nzg5MTIzNDUgICAgIDAuMSAgMEUrOTk5OTk5ICAtPiAxLjIzNDU2OEUrMTIgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgYW5kIGNhcnJpZXMKK21heGV4cG9uZW50OiA5OTk5CittaW5leHBvbmVudDogLTk5OTkKK3ByZWNpc2lvbjogMzMKK2ZtYXgyMTAxIGZtYSA5IDkgICAgMEUrOTk5OTk5ICAtPiA4MQorZm1heDIxMDIgZm1hIDkgOTAgICAgMEUrOTk5OTk5ICAtPiA4MTAKK2ZtYXgyMTAzIGZtYSA5IDkwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAKK2ZtYXgyMTA0IGZtYSA5IDkwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMAorZm1heDIxMDUgZm1hIDkgOTAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAKK2ZtYXgyMTA2IGZtYSA5IDkwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAKK2ZtYXgyMTA3IGZtYSA5IDkwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMAorZm1heDIxMDggZm1hIDkgOTAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAKK2ZtYXgyMTA5IGZtYSA5IDkwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAKK2ZtYXgyMTEwIGZtYSA5IDkwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMAorZm1heDIxMTEgZm1hIDkgOTAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAKK2ZtYXgyMTEyIGZtYSA5IDkwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAKK2ZtYXgyMTEzIGZtYSA5IDkwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMAorZm1heDIxMTQgZm1hIDkgOTAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMDAKK2ZtYXgyMTE1IGZtYSA5IDkwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTE2IGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMDAwMAorZm1heDIxMTcgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTE4IGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTE5IGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxMjAgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTIxIGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAKK2ZtYXgyMTIyIGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxMjMgZm1hIDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgd2l0aG91dCBjYXJyaWVzCitmbWF4MjEzMSBmbWEgMyAzICAgIDBFKzk5OTk5OSAgLT4gOQorZm1heDIxMzIgZm1hIDMgMzAgICAgMEUrOTk5OTk5ICAtPiA5MAorZm1heDIxMzMgZm1hIDMgMzAwICAgIDBFKzk5OTk5OSAgLT4gOTAwCitmbWF4MjEzNCBmbWEgMyAzMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMAorZm1heDIxMzUgZm1hIDMgMzAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMAorZm1heDIxMzYgZm1hIDMgMzAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwCitmbWF4MjEzNyBmbWEgMyAzMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMAorZm1heDIxMzggZm1hIDMgMzAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMAorZm1heDIxMzkgZm1hIDMgMzAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwCitmbWF4MjE0MCBmbWEgMyAzMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMAorZm1heDIxNDEgZm1hIDMgMzAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMAorZm1heDIxNDIgZm1hIDMgMzAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwCitmbWF4MjE0MyBmbWEgMyAzMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwMAorZm1heDIxNDQgZm1hIDMgMzAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMAorZm1heDIxNDUgZm1hIDMgMzAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwMDAwCitmbWF4MjE0NiBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwMDAwMAorZm1heDIxNDcgZm1hIDMgMzAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwMAorZm1heDIxNDggZm1hIDMgMzAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjE0OSBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxNTAgZm1hIDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxNTEgZm1hIDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwCitmbWF4MjE1MiBmbWEgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorZm1heDIxNTMgZm1hIDMgMzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorCittYXhleHBvbmVudDogOTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OQorcHJlY2lzaW9uOiA5CistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cvdW5kZXJmbG93CitmbWF4MjE3MCBmbWEgMSA5ZTk5OTk5OSAgICAgMEUrOTk5OTk5ICAtPiA5RSs5OTk5OTkKK2ZtYXgyMTcxIGZtYSAxIDkuOWU5OTk5OTkgICAwRSs5OTk5OTkgIC0+IDkuOUUrOTk5OTk5CitmbWF4MjE3MiBmbWEgMSA5Ljk5ZTk5OTk5OSAgMEUrOTk5OTk5ICAtPiA5Ljk5RSs5OTk5OTkKK2ZtYXgyMTczIGZtYSA5ZTk5OTk5OSAgICAxICAwRSs5OTk5OTkgIC0+IDlFKzk5OTk5OQorZm1heDIxNzQgZm1hIDkuOWU5OTk5OTkgIDEgIDBFKzk5OTk5OSAgLT4gOS45RSs5OTk5OTkKK2ZtYXgyMTc2IGZtYSA5Ljk5ZTk5OTk5OSAxICAwRSs5OTk5OTkgIC0+IDkuOTlFKzk5OTk5OQorZm1heDIxNzcgZm1hIDEgOS45OTk5OWU5OTk5OTkgIDBFKzk5OTk5OSAgLT4gOS45OTk5OUUrOTk5OTk5CitmbWF4MjE3OCBmbWEgOS45OTk5OWU5OTk5OTkgMSAgMEUrOTk5OTk5ICAtPiA5Ljk5OTk5RSs5OTk5OTkKKworZm1heDIxODAgZm1hIDAuMSA5ZS05OTk5OTggICAgMEUrOTk5OTk5ICAtPiA5RS05OTk5OTkKK2ZtYXgyMTgxIGZtYSAwLjEgOTllLTk5OTk5OCAgIDBFKzk5OTk5OSAgLT4gOS45RS05OTk5OTgKK2ZtYXgyMTgyIGZtYSAwLjEgOTk5ZS05OTk5OTggIDBFKzk5OTk5OSAgLT4gOS45OUUtOTk5OTk3CisKK2ZtYXgyMTgzIGZtYSAwLjEgOWUtOTk5OTk4ICAgICAgMEUrOTk5OTk5ICAtPiA5RS05OTk5OTkKK2ZtYXgyMTg0IGZtYSAwLjEgOTllLTk5OTk5OCAgICAgMEUrOTk5OTk5ICAtPiA5LjlFLTk5OTk5OAorZm1heDIxODUgZm1hIDAuMSA5OTllLTk5OTk5OCAgICAwRSs5OTk5OTkgIC0+IDkuOTlFLTk5OTk5NworZm1heDIxODYgZm1hIDAuMSA5OTllLTk5OTk5NyAgICAwRSs5OTk5OTkgIC0+IDkuOTlFLTk5OTk5NgorZm1heDIxODcgZm1hIDAuMSA5OTk5ZS05OTk5OTcgICAwRSs5OTk5OTkgIC0+IDkuOTk5RS05OTk5OTUKK2ZtYXgyMTg4IGZtYSAwLjEgOTk5OTllLTk5OTk5NyAgMEUrOTk5OTk5ICAtPiA5Ljk5OTlFLTk5OTk5NAorCitmbWF4MjE5MCBmbWEgMSA5ZS05OTk5OTggICAgMEUrOTk5OTk5ICAtPiA5RS05OTk5OTgKK2ZtYXgyMTkxIGZtYSAxIDk5ZS05OTk5OTggICAwRSs5OTk5OTkgIC0+IDkuOUUtOTk5OTk3CitmbWF4MjE5MiBmbWEgMSA5OTllLTk5OTk5OCAgMEUrOTk5OTk5ICAtPiA5Ljk5RS05OTk5OTYKK2ZtYXgyMTkzIGZtYSA5ZS05OTk5OTggICAxICAwRSs5OTk5OTkgIC0+IDlFLTk5OTk5OAorZm1heDIxOTQgZm1hIDk5ZS05OTk5OTggIDEgIDBFKzk5OTk5OSAgLT4gOS45RS05OTk5OTcKK2ZtYXgyMTk1IGZtYSA5OTllLTk5OTk5OCAxICAwRSs5OTk5OTkgIC0+IDkuOTlFLTk5OTk5NgorCistLSBsb25nIG9wZXJhbmQgdHJpYW5nbGUKK3ByZWNpc2lvbjogMzMKK2ZtYXgyMjQ2IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTI4MzAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMyCitmbWF4MjI0NyBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkyODMgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMQorZm1heDIyNDggZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMTk5MjggICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzAKK2ZtYXgyMjQ5IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTMgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI5CitmbWF4MjI1MCBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyOAorZm1heDIyNTEgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjcKK2ZtYXgyMjUyIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTIgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI2CitmbWF4MjI1MyBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTEgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNQorZm1heDIyNTQgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjQKK2ZtYXgyMjU1IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTcgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIzCitmbWF4MjI1NiBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTIgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMgorZm1heDIyNTcgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjEKK2ZtYXgyMjU4IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzIgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIwCitmbWF4MjI1OSBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOQorZm1heDIyNjAgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTcgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTgKK2ZtYXgyMjYxIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMzNzAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE3CitmbWF4MjI2MiBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkzMzcgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNgorZm1heDIyNjMgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTE5MzQgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTUKK2ZtYXgyMjY0IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDExOTMgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE0CitmbWF4MjI2NSBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAxMTkgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMworZm1heDIyNjYgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDgwMTIgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIKK2ZtYXgyMjY3IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTA4MDEgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDExCitmbWF4MjI2OCBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkwODAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMAorZm1heDIyNjkgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjI5MDggICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDkKK2ZtYXgyMjcwIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMy4yOTEgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA4CitmbWF4MjI3MSBmbWEgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAgMEUrOTk5OTk5ICAtPiAxNDU0MzMuMjkgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNworZm1heDIyNzIgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMTQ1NDMzLjMgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDYKK2ZtYXgyMjczIGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDE0NTQzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDUKK2ZtYXgyMjc0IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDEuNDU0M0UrNSAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDQKK2ZtYXgyMjc1IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDEuNDU0RSs1ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMworZm1heDIyNzYgZm1hIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgIDBFKzk5OTk5OSAgLT4gMS40NUUrNSAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDIKK2ZtYXgyMjc3IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDEuNUUrNSAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEKK2ZtYXgyMjc4IGZtYSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzICAwRSs5OTk5OTkgIC0+IDFFKzUgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IHNvbWUgZWRnZSBjYXNlcyB3aXRoIGV4YWN0IHJvdW5kaW5nCittYXhleHBvbmVudDogOTk5OQorbWluZXhwb25lbnQ6IC05OTk5CitwcmVjaXNpb246IDkKK2ZtYXgyMzAxIGZtYSA5IDkgICAgMEUrOTk5OTk5ICAtPiA4MQorZm1heDIzMDIgZm1hIDkgOTAgICAgMEUrOTk5OTk5ICAtPiA4MTAKK2ZtYXgyMzAzIGZtYSA5IDkwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAKK2ZtYXgyMzA0IGZtYSA5IDkwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMAorZm1heDIzMDUgZm1hIDkgOTAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAKK2ZtYXgyMzA2IGZtYSA5IDkwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDgxMDAwMDAKK2ZtYXgyMzA3IGZtYSA5IDkwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMAorZm1heDIzMDggZm1hIDkgOTAwMDAwMDAgICAgMEUrOTk5OTk5ICAtPiA4MTAwMDAwMDAKK2ZtYXgyMzA5IGZtYSA5IDkwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDguMTAwMDAwMDBFKzkgICBSb3VuZGVkCitmbWF4MjMxMCBmbWEgOSA5MDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTAgIFJvdW5kZWQKK2ZtYXgyMzExIGZtYSA5IDkwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTEgIFJvdW5kZWQKK2ZtYXgyMzEyIGZtYSA5IDkwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDguMTAwMDAwMDBFKzEyICBSb3VuZGVkCitmbWF4MjMxMyBmbWEgOSA5MDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTMgIFJvdW5kZWQKK2ZtYXgyMzE0IGZtYSA5IDkwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTQgIFJvdW5kZWQKK2ZtYXgyMzE1IGZtYSA5IDkwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDguMTAwMDAwMDBFKzE1ICBSb3VuZGVkCitmbWF4MjMxNiBmbWEgOSA5MDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTYgIFJvdW5kZWQKK2ZtYXgyMzE3IGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTcgIFJvdW5kZWQKK2ZtYXgyMzE4IGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDguMTAwMDAwMDBFKzE4ICBSb3VuZGVkCitmbWF4MjMxOSBmbWEgOSA5MDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMTkgIFJvdW5kZWQKK2ZtYXgyMzIwIGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMjAgIFJvdW5kZWQKK2ZtYXgyMzIxIGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAwRSs5OTk5OTkgIC0+IDguMTAwMDAwMDBFKzIxICBSb3VuZGVkCitmbWF4MjMyMiBmbWEgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMjIgIFJvdW5kZWQKK2ZtYXgyMzIzIGZtYSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgIDBFKzk5OTk5OSAgLT4gOC4xMDAwMDAwMEUrMjMgIFJvdW5kZWQKKworLS0gZmFzdHBhdGggYnJlYWtlcnMKK3ByZWNpc2lvbjogICAyOQorZm1heDIzMzAgZm1hIDEuNDkxODI0Njk3NjQxMjcwMzE3ODI0ODUyOTUyODM3MjI0IDEuMTA1MTcwOTE4MDc1NjQ3NjI0ODExNzA3ODI2NDkwMjQ2NTE0Njc1NjI4NjE0NTYyODgzNTM3MzQ1NzQ3NjAzICAwRSs5OTk5OTkgIC0+IDEuNjQ4NzIxMjcwNzAwMTI4MTQ2ODQ4NjUwNzg3OCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA1NQorZm1heDIzMzEgZm1hIDAuODk1ODM0MTM1Mjk2NTI4MjUwNjc2ODU0NTgyODc2NTExNzgwMzg3MzcxNzI4NDg5MTA0MDQyOCAwLjg5NTgzNDEzNTI5NjUyODI1MDY3Njg1NDU4Mjg3NjUxMTc4MDM4NzM3MTcyODQ4OTEwNDA0MjggIDBFKzk5OTk5OSAgLT4gMC44MDI1MTg3OTc5NjI0Nzg0ODI5ODQyNTUzODI5OTM0MDY5OTU1ODkwOTgzNjk2NzUyMjI4Mjk5IEluZXhhY3QgUm91bmRlZAorCisKKy0tIHRyeXplcm9zIGNhc2VzCitwcmVjaXNpb246ICAgNworcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5MgorbWluZXhwb25lbnQ6IC05MgorZm1heDI1MDQgIGZtYSAgMEUtNjAgMTAwMEUtNjAgICAwRSs5OTk5OTkgIC0+IDBFLTk4IENsYW1wZWQKK2ZtYXgyNTA1ICBmbWEgIDEwMEUrNjAgMEUrNjAgICAgMEUrOTk5OTk5ICAtPiAwRSs5MiBDbGFtcGVkCisKKy0tIG1peGVkIHdpdGggemVyb3MKK21heGV4cG9uZW50OiA5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5CitwcmVjaXNpb246IDkKK2ZtYXgyNTQxIGZtYSAgMCAgICAtMSAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyNTQyIGZtYSAtMCAgICAtMSAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyNTQzIGZtYSAgMCAgICAgMSAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyNTQ0IGZtYSAtMCAgICAgMSAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyNTQ1IGZtYSAtMSAgICAgMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyNTQ2IGZtYSAtMSAgICAtMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyNTQ3IGZtYSAgMSAgICAgMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAKK2ZtYXgyNTQ4IGZtYSAgMSAgICAtMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAKKworZm1heDI1NTEgZm1hICAwLjAgIC0xICAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU1MiBmbWEgLTAuMCAgLTEgICAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTUzIGZtYSAgMC4wICAgMSAgICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NTQgZm1hIC0wLjAgICAxICAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU1NSBmbWEgLTEuMCAgIDAgICAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTU2IGZtYSAtMS4wICAtMCAgICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NTcgZm1hICAxLjAgICAwICAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU1OCBmbWEgIDEuMCAgLTAgICAgICAwRSs5OTk5OTkgIC0+ICAwLjAKKworZm1heDI1NjEgZm1hICAwICAgIC0xLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU2MiBmbWEgLTAgICAgLTEuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTYzIGZtYSAgMCAgICAgMS4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NjQgZm1hIC0wICAgICAxLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU2NSBmbWEgLTEgICAgIDAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAKK2ZtYXgyNTY2IGZtYSAtMSAgICAtMC4wICAgIDBFKzk5OTk5OSAgLT4gIDAuMAorZm1heDI1NjcgZm1hICAxICAgICAwLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wCitmbWF4MjU2OCBmbWEgIDEgICAgLTAuMCAgICAwRSs5OTk5OTkgIC0+ICAwLjAKKworZm1heDI1NzEgZm1hICAwLjAgIC0xLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDI1NzIgZm1hIC0wLjAgIC0xLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDI1NzMgZm1hICAwLjAgICAxLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDI1NzQgZm1hIC0wLjAgICAxLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDI1NzUgZm1hIC0xLjAgICAwLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDI1NzYgZm1hIC0xLjAgIC0wLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDI1NzcgZm1hICAxLjAgICAwLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorZm1heDI1NzggZm1hICAxLjAgIC0wLjAgICAgMEUrOTk5OTk5ICAtPiAgMC4wMAorCisKKy0tIFNwZWNpYWxzCitmbWF4MjU4MCBmbWEgIEluZiAgLUluZiAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorZm1heDI1ODEgZm1hICBJbmYgIC0xMDAwICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNTgyIGZtYSAgSW5mICAtMSAgICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjU4MyBmbWEgIEluZiAgLTAgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjU4NCBmbWEgIEluZiAgIDAgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjU4NSBmbWEgIEluZiAgIDEgICAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI1ODYgZm1hICBJbmYgICAxMDAwICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkKK2ZtYXgyNTg3IGZtYSAgSW5mICAgSW5mICAgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5CitmbWF4MjU4OCBmbWEgLTEwMDAgIEluZiAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorZm1heDI1ODkgZm1hIC1JbmYgICBJbmYgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNTkwIGZtYSAtMSAgICAgSW5mICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjU5MSBmbWEgLTAgICAgIEluZiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjU5MiBmbWEgIDAgICAgIEluZiAgICAwRSs5OTk5OTkgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjU5MyBmbWEgIDEgICAgIEluZiAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI1OTQgZm1hICAxMDAwICBJbmYgICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkKK2ZtYXgyNTk1IGZtYSAgSW5mICAgSW5mICAgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5CisKK2ZtYXgyNjAwIGZtYSAtSW5mICAtSW5mICAgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5CitmbWF4MjYwMSBmbWEgLUluZiAgLTEwMDAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI2MDIgZm1hIC1JbmYgIC0xICAgICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkKK2ZtYXgyNjAzIGZtYSAtSW5mICAtMCAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjA0IGZtYSAtSW5mICAgMCAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjA1IGZtYSAtSW5mICAgMSAgICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjYwNiBmbWEgLUluZiAgIDEwMDAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorZm1heDI2MDcgZm1hIC1JbmYgICBJbmYgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKK2ZtYXgyNjA4IGZtYSAtMTAwMCAgSW5mICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjYwOSBmbWEgLUluZiAgLUluZiAgICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eQorZm1heDI2MTAgZm1hIC0xICAgIC1JbmYgICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkKK2ZtYXgyNjExIGZtYSAtMCAgICAtSW5mICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjEyIGZtYSAgMCAgICAtSW5mICAgIDBFKzk5OTk5OSAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjEzIGZtYSAgMSAgICAtSW5mICAgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5CitmbWF4MjYxNCBmbWEgIDEwMDAgLUluZiAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eQorZm1heDI2MTUgZm1hICBJbmYgIC1JbmYgICAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkKKworZm1heDI2MjEgZm1hICBOYU4gLUluZiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYyMiBmbWEgIE5hTiAtMTAwMCAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjIzIGZtYSAgTmFOIC0xICAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MjQgZm1hICBOYU4gLTAgICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYyNSBmbWEgIE5hTiAgMCAgICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjI2IGZtYSAgTmFOICAxICAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MjcgZm1hICBOYU4gIDEwMDAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYyOCBmbWEgIE5hTiAgSW5mICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjI5IGZtYSAgTmFOICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MzAgZm1hIC1JbmYgIE5hTiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYzMSBmbWEgLTEwMDAgTmFOICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjMyIGZtYSAtMSAgICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MzMgZm1hIC0wICAgIE5hTiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYzNCBmbWEgIDAgICAgTmFOICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KK2ZtYXgyNjM1IGZtYSAgMSAgICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gIE5hTgorZm1heDI2MzYgZm1hICAxMDAwIE5hTiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOCitmbWF4MjYzNyBmbWEgIEluZiAgTmFOICAgICAwRSs5OTk5OTkgIC0+ICBOYU4KKworZm1heDI2NDEgZm1hICBzTmFOIC1JbmYgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDIgZm1hICBzTmFOIC0xMDAwICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDMgZm1hICBzTmFOIC0xICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDQgZm1hICBzTmFOIC0wICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDUgZm1hICBzTmFOICAwICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDYgZm1hICBzTmFOICAxICAgICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDcgZm1hICBzTmFOICAxMDAwICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDggZm1hICBzTmFOICBOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NDkgZm1hICBzTmFOIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTAgZm1hICBOYU4gIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTEgZm1hIC1JbmYgIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTIgZm1hIC0xMDAwIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTMgZm1hIC0xICAgIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTQgZm1hIC0wICAgIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTUgZm1hICAwICAgIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTYgZm1hICAxICAgIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTcgZm1hICAxMDAwIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTggZm1hICBJbmYgIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NTkgZm1hICBOYU4gIHNOYU4gICAgMEUrOTk5OTk5ICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitmbWF4MjY2MSBmbWEgIE5hTjkgLUluZiAgICAwRSs5OTk5OTkgIC0+ICBOYU45CitmbWF4MjY2MiBmbWEgIE5hTjggIDk5OSAgICAwRSs5OTk5OTkgIC0+ICBOYU44CitmbWF4MjY2MyBmbWEgIE5hTjcxIEluZiAgICAwRSs5OTk5OTkgIC0+ICBOYU43MQorZm1heDI2NjQgZm1hICBOYU42ICBOYU41ICAgMEUrOTk5OTk5ICAtPiAgTmFONgorZm1heDI2NjUgZm1hIC1JbmYgICBOYU40ICAgMEUrOTk5OTk5ICAtPiAgTmFONAorZm1heDI2NjYgZm1hIC05OTkgICBOYU4zMyAgMEUrOTk5OTk5ICAtPiAgTmFOMzMKK2ZtYXgyNjY3IGZtYSAgSW5mICAgTmFOMiAgIDBFKzk5OTk5OSAgLT4gIE5hTjIKKworZm1heDI2NzEgZm1hICBzTmFOOTkgLUluZiAgICAgMEUrOTk5OTk5ICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjcyIGZtYSAgc05hTjk4IC0xMSAgICAgIDBFKzk5OTk5OSAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY3MyBmbWEgIHNOYU45NyAgTmFOICAgICAwRSs5OTk5OTkgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NzQgZm1hICBzTmFOMTYgc05hTjk0ICAgMEUrOTk5OTk5ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjc1IGZtYSAgTmFOOTUgIHNOYU45MyAgIDBFKzk5OTk5OSAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY3NiBmbWEgLUluZiAgICBzTmFOOTIgICAwRSs5OTk5OTkgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2NzcgZm1hICAwODggICAgc05hTjkxICAgMEUrOTk5OTk5ICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjc4IGZtYSAgSW5mICAgIHNOYU45MCAgIDBFKzk5OTk5OSAgLT4gIE5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY3OSBmbWEgIE5hTiAgICBzTmFOODkgICAwRSs5OTk5OTkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitmbWF4MjY4MSBmbWEgLU5hTjkgLUluZiAgICAwRSs5OTk5OTkgIC0+IC1OYU45CitmbWF4MjY4MiBmbWEgLU5hTjggIDk5OSAgICAwRSs5OTk5OTkgIC0+IC1OYU44CitmbWF4MjY4MyBmbWEgLU5hTjcxIEluZiAgICAwRSs5OTk5OTkgIC0+IC1OYU43MQorZm1heDI2ODQgZm1hIC1OYU42IC1OYU41ICAgMEUrOTk5OTk5ICAtPiAtTmFONgorZm1heDI2ODUgZm1hIC1JbmYgIC1OYU40ICAgMEUrOTk5OTk5ICAtPiAtTmFONAorZm1heDI2ODYgZm1hIC05OTkgIC1OYU4zMyAgMEUrOTk5OTk5ICAtPiAtTmFOMzMKK2ZtYXgyNjg3IGZtYSAgSW5mICAtTmFOMiAgIDBFKzk5OTk5OSAgLT4gLU5hTjIKKworZm1heDI2OTEgZm1hIC1zTmFOOTkgLUluZiAgICAgMEUrOTk5OTk5ICAtPiAtTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjkyIGZtYSAtc05hTjk4IC0xMSAgICAgIDBFKzk5OTk5OSAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY5MyBmbWEgLXNOYU45NyAgTmFOICAgICAwRSs5OTk5OTkgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2OTQgZm1hIC1zTmFOMTYgLXNOYU45NCAgMEUrOTk5OTk5ICAtPiAtTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjk1IGZtYSAtTmFOOTUgIC1zTmFOOTMgIDBFKzk5OTk5OSAgLT4gLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY5NiBmbWEgLUluZiAgICAtc05hTjkyICAwRSs5OTk5OTkgIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI2OTcgZm1hICAwODggICAgLXNOYU45MSAgMEUrOTk5OTk5ICAtPiAtTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNjk4IGZtYSAgSW5mICAgIC1zTmFOOTAgIDBFKzk5OTk5OSAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjY5OSBmbWEgLU5hTiAgICAtc05hTjg5ICAwRSs5OTk5OTkgIC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCitmbWF4MjcwMSBmbWEgLU5hTiAgLUluZiAgICAwRSs5OTk5OTkgIC0+IC1OYU4KK2ZtYXgyNzAyIGZtYSAtTmFOICAgOTk5ICAgIDBFKzk5OTk5OSAgLT4gLU5hTgorZm1heDI3MDMgZm1hIC1OYU4gICBJbmYgICAgMEUrOTk5OTk5ICAtPiAtTmFOCitmbWF4MjcwNCBmbWEgLU5hTiAgLU5hTiAgICAwRSs5OTk5OTkgIC0+IC1OYU4KK2ZtYXgyNzA1IGZtYSAtSW5mICAtTmFOMCAgIDBFKzk5OTk5OSAgLT4gLU5hTgorZm1heDI3MDYgZm1hIC05OTkgIC1OYU4gICAgMEUrOTk5OTk5ICAtPiAtTmFOCitmbWF4MjcwNyBmbWEgIEluZiAgLU5hTiAgICAwRSs5OTk5OTkgIC0+IC1OYU4KKworZm1heDI3MTEgZm1hIC1zTmFOICAgLUluZiAgICAgMEUrOTk5OTk5ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjcxMiBmbWEgLXNOYU4gICAtMTEgICAgICAwRSs5OTk5OTkgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNzEzIGZtYSAtc05hTjAwICBOYU4gICAgIDBFKzk5OTk5OSAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI3MTQgZm1hIC1zTmFOICAgLXNOYU4gICAgMEUrOTk5OTk5ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjcxNSBmbWEgLU5hTiAgICAtc05hTiAgICAwRSs5OTk5OTkgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNzE2IGZtYSAtSW5mICAgIC1zTmFOICAgIDBFKzk5OTk5OSAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI3MTcgZm1hICAwODggICAgLXNOYU4gICAgMEUrOTk5OTk5ICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MjcxOCBmbWEgIEluZiAgICAtc05hTiAgICAwRSs5OTk5OTkgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgyNzE5IGZtYSAtTmFOICAgIC1zTmFOICAgIDBFKzk5OTk5OSAgLT4gLU5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIG5vdGUgc3Vibm9ybWFsIHJlc3VsdHMKK21heGV4cG9uZW50OiA5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5CitmbWF4MjczMCBmbWEgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5ICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZm1heDI3MzEgZm1hIDlFKzk5OTk5OSArMS4yMzQ1Njc4OTAxMjM0NUUtMCAgMEUrOTk5OTk5ICAtPiBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgyNzMyIGZtYSArMC4xMDAgOUUtOTk5OTk5ICAwRSs5OTk5OTkgIC0+IDkuMDBFLTEwMDAwMDAgU3Vibm9ybWFsCitmbWF4MjczMyBmbWEgOUUtOTk5OTk5ICswLjEwMCAgMEUrOTk5OTk5ICAtPiA5LjAwRS0xMDAwMDAwIFN1Ym5vcm1hbAorZm1heDI3MzUgZm1hIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OSAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitmbWF4MjczNiBmbWEgOUUrOTk5OTk5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgyNzM3IGZtYSAtMC4xMDAgOUUtOTk5OTk5ICAwRSs5OTk5OTkgIC0+IC05LjAwRS0xMDAwMDAwIFN1Ym5vcm1hbAorZm1heDI3MzggZm1hIDlFLTk5OTk5OSAtMC4xMDAgIDBFKzk5OTk5OSAgLT4gLTkuMDBFLTEwMDAwMDAgU3Vibm9ybWFsCisKKy0tIHNpZ25zCitmbWF4Mjc1MSBmbWEgIDFlKzc3Nzc3NyAgMWUrNDExMTExICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzUyIGZtYSAgMWUrNzc3Nzc3IC0xZSs0MTExMTEgIDBFKzk5OTk5OSAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NTMgZm1hIC0xZSs3Nzc3NzcgIDFlKzQxMTExMSAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc1NCBmbWEgLTFlKzc3Nzc3NyAtMWUrNDExMTExICAwRSs5OTk5OTkgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzU1IGZtYSAgMWUtNzc3Nzc3ICAxZS00MTExMTEgIDBFKzk5OTk5OSAgLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZm1heDI3NTYgZm1hICAxZS03Nzc3NzcgLTFlLTQxMTExMSAgMEUrOTk5OTk5ICAtPiAtMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4Mjc1NyBmbWEgLTFlLTc3Nzc3NyAgMWUtNDExMTExICAwRSs5OTk5OTkgIC0+IC0wRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyNzU4IGZtYSAtMWUtNzc3Nzc3IC0xZS00MTExMTEgIDBFKzk5OTk5OSAgLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK3ByZWNpc2lvbjogOQorZm1heDI3NjAgZm1hIDFlLTYwMDAwMCAxZS00MDAwMDEgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMDAwMSBTdWJub3JtYWwKK2ZtYXgyNzYxIGZtYSAxZS02MDAwMDAgMWUtNDAwMDAyICAwRSs5OTk5OTkgIC0+IDFFLTEwMDAwMDIgU3Vibm9ybWFsCitmbWF4Mjc2MiBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwMyAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwMDAzIFN1Ym5vcm1hbAorZm1heDI3NjMgZm1hIDFlLTYwMDAwMCAxZS00MDAwMDQgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMDAwNCBTdWJub3JtYWwKK2ZtYXgyNzY0IGZtYSAxZS02MDAwMDAgMWUtNDAwMDA1ICAwRSs5OTk5OTkgIC0+IDFFLTEwMDAwMDUgU3Vibm9ybWFsCitmbWF4Mjc2NSBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwNiAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwMDA2IFN1Ym5vcm1hbAorZm1heDI3NjYgZm1hIDFlLTYwMDAwMCAxZS00MDAwMDcgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMDAwNyBTdWJub3JtYWwKK2ZtYXgyNzY3IGZtYSAxZS02MDAwMDAgMWUtNDAwMDA4ICAwRSs5OTk5OTkgIC0+IDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZm1heDI3NjggZm1hIDFlLTYwMDAwMCAxZS00MDAwMDkgIDBFKzk5OTk5OSAgLT4gMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4Mjc2OSBmbWEgMWUtNjAwMDAwIDFlLTQwMDAxMCAgMEUrOTk5OTk5ICAtPiAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKy0tIFtubyBlcXVpdmFsZW50IG9mICdzdWJub3JtYWwnIGZvciBvdmVyZmxvd10KK2ZtYXgyNzcwIGZtYSAxZSs2MDAwMDAgMWUrNDAwMDAxICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NzEgZm1hIDFlKzYwMDAwMCAxZSs0MDAwMDIgIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc3MiBmbWEgMWUrNjAwMDAwIDFlKzQwMDAwMyAgMEUrOTk5OTk5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzczIGZtYSAxZSs2MDAwMDAgMWUrNDAwMDA0ICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NzQgZm1hIDFlKzYwMDAwMCAxZSs0MDAwMDUgIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc3NSBmbWEgMWUrNjAwMDAwIDFlKzQwMDAwNiAgMEUrOTk5OTk5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzc2IGZtYSAxZSs2MDAwMDAgMWUrNDAwMDA3ICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDI3NzcgZm1hIDFlKzYwMDAwMCAxZSs0MDAwMDggIDBFKzk5OTk5OSAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mjc3OCBmbWEgMWUrNjAwMDAwIDFlKzQwMDAwOSAgMEUrOTk5OTk5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyNzc5IGZtYSAxZSs2MDAwMDAgMWUrNDAwMDEwICAwRSs5OTk5OTkgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSAnc3Vibm9ybWFsJyB0ZXN0IGVkZ2UgY29uZGl0aW9uIGF0IGhpZ2hlciBwcmVjaXNpb25zCitwcmVjaXNpb246IDk5CitmbWF4Mjc4MCBmbWEgMWUtNjAwMDAwIDFlLTQwMDAwNyAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwMDA3IFN1Ym5vcm1hbAorZm1heDI3ODEgZm1hIDFlLTYwMDAwMCAxZS00MDAwMDggIDBFKzk5OTk5OSAgLT4gMUUtMTAwMDAwOCBTdWJub3JtYWwKK2ZtYXgyNzgyIGZtYSAxZS02MDAwMDAgMWUtNDAwMDk3ICAwRSs5OTk5OTkgIC0+IDFFLTEwMDAwOTcgU3Vibm9ybWFsCitmbWF4Mjc4MyBmbWEgMWUtNjAwMDAwIDFlLTQwMDA5OCAgMEUrOTk5OTk5ICAtPiAwRS0xMDAwMDk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3ByZWNpc2lvbjogOTk5CitmbWF4Mjc4NCBmbWEgMWUtNjAwMDAwIDFlLTQwMDk5NyAgMEUrOTk5OTk5ICAtPiAxRS0xMDAwOTk3IFN1Ym5vcm1hbAorZm1heDI3ODUgZm1hIDFlLTYwMDAwMCAxZS00MDA5OTggIDBFKzk5OTk5OSAgLT4gMEUtMTAwMDk5NyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIHRlc3Qgc3Vibm9ybWFscyByb3VuZGluZworcHJlY2lzaW9uOiAgIDUKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5Cityb3VuZGluZzogICAgaGFsZl9ldmVuCisKK2ZtYXgyODAxIGZtYSAgMS4wMDAwRS05OTkgIDEgICAgICAwRSs5OTk5OTkgIC0+IDEuMDAwMEUtOTk5CitmbWF4MjgwMiBmbWEgIDEuMDAwRS05OTkgICAxZS0xICAgMEUrOTk5OTk5ICAtPiAxLjAwMEUtMTAwMCBTdWJub3JtYWwKK2ZtYXgyODAzIGZtYSAgMS4wMEUtOTk5ICAgIDFlLTIgICAwRSs5OTk5OTkgIC0+IDEuMDBFLTEwMDEgIFN1Ym5vcm1hbAorZm1heDI4MDQgZm1hICAxLjBFLTk5OSAgICAgMWUtMyAgIDBFKzk5OTk5OSAgLT4gMS4wRS0xMDAyICAgU3Vibm9ybWFsCitmbWF4MjgwNSBmbWEgIDEuMEUtOTk5ICAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAxRS0xMDAzICAgICBTdWJub3JtYWwgUm91bmRlZAorZm1heDI4MDYgZm1hICAxLjNFLTk5OSAgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODA3IGZtYSAgMS41RS05OTkgICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgwOCBmbWEgIDEuN0UtOTk5ICAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MDkgZm1hICAyLjNFLTk5OSAgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODEwIGZtYSAgMi41RS05OTkgICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgxMSBmbWEgIDIuN0UtOTk5ICAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAzRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MTIgZm1hICAxLjQ5RS05OTkgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODEzIGZtYSAgMS41MEUtOTk5ICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgxNCBmbWEgIDEuNTFFLTk5OSAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MTUgZm1hICAyLjQ5RS05OTkgICAgMWUtNCAgIDBFKzk5OTk5OSAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODE2IGZtYSAgMi41MEUtOTk5ICAgIDFlLTQgICAwRSs5OTk5OTkgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgxNyBmbWEgIDIuNTFFLTk5OSAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAzRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitmbWF4MjgxOCBmbWEgIDFFLTk5OSAgICAgICAxZS00ICAgMEUrOTk5OTk5ICAtPiAxRS0xMDAzICAgICBTdWJub3JtYWwKK2ZtYXgyODE5IGZtYSAgM0UtOTk5ICAgICAgIDFlLTUgICAwRSs5OTk5OTkgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyODIwIGZtYSAgNUUtOTk5ICAgICAgIDFlLTUgICAwRSs5OTk5OTkgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK2ZtYXgyODIxIGZtYSAgN0UtOTk5ICAgICAgIDFlLTUgICAwRSs5OTk5OTkgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgyMiBmbWEgIDlFLTk5OSAgICAgICAxZS01ICAgMEUrOTk5OTk5ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MjMgZm1hICA5LjlFLTk5OSAgICAgMWUtNSAgIDBFKzk5OTk5OSAgLT4gMUUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDI4MjQgZm1hICAxRS05OTkgICAgICAtMWUtNCAgIDBFKzk5OTk5OSAgLT4gLTFFLTEwMDMgICAgU3Vibm9ybWFsCitmbWF4MjgyNSBmbWEgIDNFLTk5OSAgICAgIC0xZS01ICAgMEUrOTk5OTk5ICAtPiAtMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4MjgyNiBmbWEgLTVFLTk5OSAgICAgICAxZS01ICAgMEUrOTk5OTk5ICAtPiAtMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4MjgyNyBmbWEgIDdFLTk5OSAgICAgIC0xZS01ICAgMEUrOTk5OTk5ICAtPiAtMUUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorZm1heDI4MjggZm1hIC05RS05OTkgICAgICAgMWUtNSAgIDBFKzk5OTk5OSAgLT4gLTFFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODI5IGZtYSAgOS45RS05OTkgICAgLTFlLTUgICAwRSs5OTk5OTkgIC0+IC0xRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitmbWF4MjgzMCBmbWEgIDMuMEUtOTk5ICAgIC0xZS01ICAgMEUrOTk5OTk5ICAtPiAtMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK2ZtYXgyODMxIGZtYSAgMS4wRS01MDEgICAgIDFlLTUwMSAgMEUrOTk5OTk5ICAtPiAxLjBFLTEwMDIgICBTdWJub3JtYWwKK2ZtYXgyODMyIGZtYSAgMi4wRS01MDEgICAgIDJlLTUwMSAgMEUrOTk5OTk5ICAtPiA0LjBFLTEwMDIgICBTdWJub3JtYWwKK2ZtYXgyODMzIGZtYSAgNC4wRS01MDEgICAgIDRlLTUwMSAgMEUrOTk5OTk5ICAtPiAxLjYwRS0xMDAxICBTdWJub3JtYWwKK2ZtYXgyODM0IGZtYSAxMC4wRS01MDEgICAgMTBlLTUwMSAgMEUrOTk5OTk5ICAtPiAxLjAwMEUtMTAwMCBTdWJub3JtYWwKK2ZtYXgyODM1IGZtYSAzMC4wRS01MDEgICAgMzBlLTUwMSAgMEUrOTk5OTk5ICAtPiA5LjAwMEUtMTAwMCBTdWJub3JtYWwKK2ZtYXgyODM2IGZtYSA0MC4wRS01MDEgICAgNDBlLTUwMSAgMEUrOTk5OTk5ICAtPiAxLjYwMDBFLTk5OQorCistLSBzcXVhcmVzCitmbWF4Mjg0MCBmbWEgIDFFLTUwMiAgICAgICAxZS01MDIgIDBFKzk5OTk5OSAgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorZm1heDI4NDEgZm1hICAxRS01MDEgICAgICAgMWUtNTAxICAwRSs5OTk5OTkgIC0+IDFFLTEwMDIgICAgIFN1Ym5vcm1hbAorZm1heDI4NDIgZm1hICAyRS01MDEgICAgICAgMmUtNTAxICAwRSs5OTk5OTkgIC0+IDRFLTEwMDIgICAgIFN1Ym5vcm1hbAorZm1heDI4NDMgZm1hICA0RS01MDEgICAgICAgNGUtNTAxICAwRSs5OTk5OTkgIC0+IDEuNkUtMTAwMSAgIFN1Ym5vcm1hbAorZm1heDI4NDQgZm1hIDEwRS01MDEgICAgICAxMGUtNTAxICAwRSs5OTk5OTkgIC0+IDEuMDBFLTEwMDAgIFN1Ym5vcm1hbAorZm1heDI4NDUgZm1hIDMwRS01MDEgICAgICAzMGUtNTAxICAwRSs5OTk5OTkgIC0+IDkuMDBFLTEwMDAgIFN1Ym5vcm1hbAorZm1heDI4NDYgZm1hIDQwRS01MDEgICAgICA0MGUtNTAxICAwRSs5OTk5OTkgIC0+IDEuNjAwRS05OTkKKworLS0gY3ViZXMKK2ZtYXgyODUwIGZtYSAgMUUtNjcwICAgICAxZS0zMzUgIDBFKzk5OTk5OSAgLT4gMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitmbWF4Mjg1MSBmbWEgIDFFLTY2OCAgICAgMWUtMzM0ICAwRSs5OTk5OTkgIC0+IDFFLTEwMDIgICAgU3Vibm9ybWFsCitmbWF4Mjg1MiBmbWEgIDRFLTY2OCAgICAgMmUtMzM0ICAwRSs5OTk5OTkgIC0+IDhFLTEwMDIgICAgU3Vibm9ybWFsCitmbWF4Mjg1MyBmbWEgIDlFLTY2OCAgICAgM2UtMzM0ICAwRSs5OTk5OTkgIC0+IDIuN0UtMTAwMSAgU3Vibm9ybWFsCitmbWF4Mjg1NCBmbWEgMTZFLTY2OCAgICAgNGUtMzM0ICAwRSs5OTk5OTkgIC0+IDYuNEUtMTAwMSAgU3Vibm9ybWFsCitmbWF4Mjg1NSBmbWEgMjVFLTY2OCAgICAgNWUtMzM0ICAwRSs5OTk5OTkgIC0+IDEuMjVFLTEwMDAgU3Vibm9ybWFsCitmbWF4Mjg1NiBmbWEgMTBFLTY2OCAgIDEwMGUtMzM0ICAwRSs5OTk5OTkgIC0+IDEuMDAwRS05OTkKKworLS0gdGVzdCBkZXJpdmVkIGZyb20gcmVzdWx0IG9mIDAuMDk5ICoqIDk5OSBhdCAxNSBkaWdpdHMgd2l0aCB1bmxpbWl0ZWQgZXhwb25lbnQKK3ByZWNpc2lvbjogMTkKK2ZtYXgyODYwIGZtYSAgNjYzNjg1MTU1Nzk5NDU3ODcxNkUtNTIwIDY2MzY4NTE1NTc5OTQ1Nzg3MTZFLTUyMCAgMEUrOTk5OTk5ICAtPiA0LjQwNDc3OTg2MDI4NTUxRS0xMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIExvbmcgb3BlcmFuZCBvdmVyZmxvdyBtYXkgYmUgYSBkaWZmZXJlbnQgcGF0aAorcHJlY2lzaW9uOiAzCittYXhFeHBvbmVudDogOTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OQorZm1heDI4NzAgZm1hIDEgIDkuOTk5RSs5OTk5OTkgICAgMEUrOTk5OTk5ICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitmbWF4Mjg3MSBmbWEgMSAtOS45OTlFKzk5OTk5OSAgICAwRSs5OTk5OTkgIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK2ZtYXgyODcyIGZtYSAgICA5Ljk5OUUrOTk5OTk5IDEgIDBFKzk5OTk5OSAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorZm1heDI4NzMgZm1hICAgLTkuOTk5RSs5OTk5OTkgMSAgMEUrOTk5OTk5ICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitwcmVjaXNpb246ICAgNQorbWF4ZXhwb25lbnQ6IDc5CittaW5leHBvbmVudDogLTc5CitmbWF4Mjg4MSBmbWEgIDEuMjM0N0UtNDAgIDEuMjM0N0UtNDAgICAwRSs5OTk5OTkgIC0+ICAxLjUyNEUtODAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mjg4MiBmbWEgIDEuMjM0RS00MCAgMS4yMzRFLTQwICAgICAwRSs5OTk5OTkgIC0+ICAxLjUyM0UtODAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mjg4MyBmbWEgIDEuMjNFLTQwICAgMS4yM0UtNDAgICAgICAwRSs5OTk5OTkgIC0+ICAxLjUxM0UtODAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mjg4NCBmbWEgIDEuMkUtNDAgICAgMS4yRS00MCAgICAgICAwRSs5OTk5OTkgIC0+ICAxLjQ0RS04MCAgIFN1Ym5vcm1hbAorZm1heDI4ODUgZm1hICAxLjJFLTQwICAgIDEuMkUtNDEgICAgICAgMEUrOTk5OTk5ICAtPiAgMS40NEUtODEgICBTdWJub3JtYWwKK2ZtYXgyODg2IGZtYSAgMS4yRS00MCAgICAxLjJFLTQyICAgICAgIDBFKzk5OTk5OSAgLT4gIDEuNEUtODIgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgyODg3IGZtYSAgMS4yRS00MCAgICAxLjNFLTQyICAgICAgIDBFKzk5OTk5OSAgLT4gIDEuNkUtODIgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgyODg4IGZtYSAgMS4zRS00MCAgICAxLjNFLTQyICAgICAgIDBFKzk5OTk5OSAgLT4gIDEuN0UtODIgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgyODg5IGZtYSAgMS4zRS00MCAgICAxLjNFLTQzICAgICAgIDBFKzk5OTk5OSAgLT4gICAgMkUtODMgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgyODkwIGZtYSAgMS4zRS00MSAgICAxLjNFLTQzICAgICAgIDBFKzk5OTk5OSAgLT4gICAgMEUtODMgICAgQ2xhbXBlZCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCitmbWF4Mjg5MSBmbWEgIDEuMjM0NUUtMzkgICAxLjIzNEUtNDAgICAwRSs5OTk5OTkgIC0+ICAxLjUyMzRFLTc5IEluZXhhY3QgUm91bmRlZAorZm1heDI4OTIgZm1hICAxLjIzNDU2RS0zOSAgMS4yMzRFLTQwICAgMEUrOTk5OTk5ICAtPiAgMS41MjM0RS03OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgyODkzIGZtYSAgMS4yMzQ1RS00MCAgIDEuMjM0RS00MCAgIDBFKzk5OTk5OSAgLT4gIDEuNTIzRS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgyODk0IGZtYSAgMS4yMzQ1NkUtNDAgIDEuMjM0RS00MCAgIDBFKzk5OTk5OSAgLT4gIDEuNTIzRS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgyODk1IGZtYSAgMS4yMzQ1RS00MSAgIDEuMjM0RS00MCAgIDBFKzk5OTk5OSAgLT4gIDEuNTJFLTgxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgyODk2IGZtYSAgMS4yMzQ1NkUtNDEgIDEuMjM0RS00MCAgIDBFKzk5OTk5OSAgLT4gIDEuNTJFLTgxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworLS0gTm93IGV4cGxvcmUgdGhlIGNhc2Ugd2hlcmUgd2UgZ2V0IGEgbm9ybWFsIHJlc3VsdCB3aXRoIFVuZGVyZmxvdworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworZm1heDI5MDAgZm1hICAwLjMwMDAwMDAwMDBFLTE5MSAwLjMwMDAwMDAwMDBFLTE5MSAgMEUrOTk5OTk5ICAtPiA5LjAwMDAwMDAwMDAwMDAwRS0zODQgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgyOTAxIGZtYSAgMC4zMDAwMDAwMDAxRS0xOTEgMC4zMDAwMDAwMDAxRS0xOTEgIDBFKzk5OTk5OSAgLT4gOS4wMDAwMDAwMDYwMDAwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MjkwMiBmbWEgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OSAgICAgICAgICAwRSs5OTk5OTkgIC0+IDkuOTk5OTk5OTk5OTkwMDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDI5MDMgZm1hICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5ICAgICAgICAgMEUrOTk5OTk5ICAtPiA5Ljk5OTk5OTk5OTk5OTAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgyOTA0IGZtYSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTkgICAgICAgIDBFKzk5OTk5OSAgLT4gOS45OTk5OTk5OTk5OTk5MEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MjkwNSBmbWEgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OSAgICAgICAwRSs5OTk5OTkgIC0+IDkuOTk5OTk5OTk5OTk5OTlFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorLS0gcHJvdmUgb3BlcmFuZHMgYXJlIGV4YWN0CitmbWF4MjkwNiBmbWEgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDEgICAgICAgICAgICAgICAgICAgICAgICAwRSs5OTk5OTkgIC0+IDkuOTk5OTk5OTk5OTk5OTk5RS0zODMKK2ZtYXgyOTA3IGZtYSAgICAgICAgICAgICAgICAgICAgICAgMSAgMC4wOTk5OTk5OTk5OTk5OTk5OSAgICAgIDBFKzk5OTk5OSAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OQorLS0gdGhlIG5leHQgcm91bmRzIHRvIE5taW4KK2ZtYXgyOTA4IGZtYSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OSAgICAgIDBFKzk5OTk5OSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDI5MDkgZm1hICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OTk5OSAgICAgMEUrOTk5OTk5ICAtPiAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MjkxMCBmbWEgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OTk5OSAgICAwRSs5OTk5OTkgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgyOTExIGZtYSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTk5OTk5OSAgIDBFKzk5OTk5OSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK3ByZWNpc2lvbjogICAzNAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK2ZtYXgyOTIxICBmbWEgMTMwRS0yICAxMjBFLTIgIDBFKzk5OTk5OSAgLT4gMS41NjAwCitmbWF4MjkyMiAgZm1hIDEzMEUtMiAgMTJFLTEgICAwRSs5OTk5OTkgIC0+IDEuNTYwCitmbWF4MjkyMyAgZm1hIDEzMEUtMiAgMUUwICAgICAwRSs5OTk5OTkgIC0+IDEuMzAKKworLS0gTnVsbCB0ZXN0cworZm1heDI5OTAgZm1hICAjIDEwICAwRSs5OTk5OTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorZm1heDI5OTEgZm1hIDEwICAjICAwRSs5OTk5OTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBRERJVElPTiBURVNUUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitmbWF4MzAwMSBmbWEgIDEgICAxICAgICAgIDEgICAgICAgLT4gIDIKK2ZtYXgzMDAyIGZtYSAgMSAgIDIgICAgICAgMyAgICAgICAtPiAgNQorZm1heDMwMDMgZm1hICAxICAgJzUuNzUnICAnMy4zJyAgIC0+ICA5LjA1CitmbWF4MzAwNCBmbWEgIDEgICAnNScgICAgICctMycgICAgLT4gIDIKK2ZtYXgzMDA1IGZtYSAgMSAgICctNScgICAgJy0zJyAgICAtPiAgLTgKK2ZtYXgzMDA2IGZtYSAgMSAgICctNycgICAgJzIuNScgICAtPiAgLTQuNQorZm1heDMwMDcgZm1hICAxICAgJzAuNycgICAnMC4zJyAgIC0+ICAxLjAKK2ZtYXgzMDA4IGZtYSAgMSAgICcxLjI1JyAgJzEuMjUnICAtPiAgMi41MAorZm1heDMwMDkgZm1hICAxICAgJzEuMjM0NTY3ODknICAnMS4wMDAwMDAwMCcgLT4gJzIuMjM0NTY3ODknCitmbWF4MzAxMCBmbWEgIDEgICAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMi4yMzQ1NjgwMCcKKworZm1heDMwMTEgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTUnIC0+ICcxLjAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDEyIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDAnICAnMC41NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzAxMyBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1MCcgLT4gJzAuOTk5OTk5OTk5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDE0IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ5JyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDE1IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ5OScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDE2IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ5OTknICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDE3IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDUwMDAnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDE4IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDUwMDEnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDE5IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDUwMScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDIwIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDUxJyAgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKKworZm1heDMwMjEgZm1hICAxICAgMCAxIC0+IDEKK2ZtYXgzMDIyIGZtYSAgMSAgIDEgMSAtPiAyCitmbWF4MzAyMyBmbWEgIDEgICAyIDEgLT4gMworZm1heDMwMjQgZm1hICAxICAgMyAxIC0+IDQKK2ZtYXgzMDI1IGZtYSAgMSAgIDQgMSAtPiA1CitmbWF4MzAyNiBmbWEgIDEgICA1IDEgLT4gNgorZm1heDMwMjcgZm1hICAxICAgNiAxIC0+IDcKK2ZtYXgzMDI4IGZtYSAgMSAgIDcgMSAtPiA4CitmbWF4MzAyOSBmbWEgIDEgICA4IDEgLT4gOQorZm1heDMwMzAgZm1hICAxICAgOSAxIC0+IDEwCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworZm1heDMwMzEgZm1hICAxICAgJzAuOTk5OCcgICcwLjAwMDAnIC0+ICcwLjk5OTgnCitmbWF4MzAzMiBmbWEgIDEgICAnMC45OTk4JyAgJzAuMDAwMScgLT4gJzAuOTk5OScKK2ZtYXgzMDMzIGZtYSAgMSAgICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMS4wMDAwJworZm1heDMwMzQgZm1hICAxICAgJzAuOTk5OCcgICcwLjAwMDMnIC0+ICcxLjAwMDEnCisKK2ZtYXgzMDM1IGZtYSAgMSAgICc3MCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDM2IGZtYSAgMSAgICc3MDAnICAnMTAwMDBlKzknIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitmbWF4MzAzNyBmbWEgIDEgICAnNzAwMCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDM4IGZtYSAgMSAgICc3MDAwMCcgICcxMDAwMGUrOScgLT4gJzEuMDAwMDAwMDFFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDM5IGZtYSAgMSAgICc3MDAwMDAnICAnMTAwMDBlKzknIC0+ICcxLjAwMDAwMDA3RSsxMycgUm91bmRlZAorCistLSBzeW1tZXRyeToKK2ZtYXgzMDQwIGZtYSAgMSAgICcxMDAwMGUrOScgICc3MCcgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDQxIGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAnIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitmbWF4MzA0MiBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDQ0IGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEuMDAwMDAwMDFFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMDQ1IGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwMDAnIC0+ICcxLjAwMDAwMDA3RSsxMycgUm91bmRlZAorCistLSBzYW1lLCBoaWdoZXIgcHJlY2lzaW9uCitwcmVjaXNpb246IDE1CitmbWF4MzA0NiBmbWEgIDEgICAnMTAwMDBlKzknICAnNycgLT4gJzEwMDAwMDAwMDAwMDA3JworZm1heDMwNDcgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMTAwMDAwMDAwMDAwNzAnCitmbWF4MzA0OCBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwJyAtPiAnMTAwMDAwMDAwMDA3MDAnCitmbWF4MzA0OSBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEwMDAwMDAwMDA3MDAwJworZm1heDMwNTAgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMTAwMDAwMDAwNzAwMDAnCitmbWF4MzA1MSBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwMDAwJyAtPiAnMTAwMDAwMDA3MDAwMDAnCitmbWF4MzA1MiBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwMDAwMCcgLT4gJzEwMDAwMDA3MDAwMDAwJworCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCitmbWF4MzA1MyBmbWEgIDEgICAnMTInICc3LjAwJyAtPiAnMTkuMDAnCitmbWF4MzA1NCBmbWEgIDEgICAnMS4zJyAnLTEuMDcnIC0+ICcwLjIzJworZm1heDMwNTUgZm1hICAxICAgJzEuMycgJy0xLjMwJyAtPiAnMC4wMCcKK2ZtYXgzMDU2IGZtYSAgMSAgICcxLjMnICctMi4wNycgLT4gJy0wLjc3JworZm1heDMwNTcgZm1hICAxICAgJzFFKzInICcxRSs0JyAtPiAnMS4wMUUrNCcKKworLS0gemVybyBwcmVzZXJ2YXRpb24KK3ByZWNpc2lvbjogNgorZm1heDMwNjAgZm1hICAxICAgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnMS4wMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMwNjEgZm1hICAxICAgMSAnMC4wMDAxJyAtPiAnMS4wMDAxJworZm1heDMwNjIgZm1hICAxICAgMSAnMC4wMDAwMScgLT4gJzEuMDAwMDEnCitmbWF4MzA2MyBmbWEgIDEgICAxICcwLjAwMDAwMScgLT4gJzEuMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZm1heDMwNjQgZm1hICAxICAgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzA2NSBmbWEgIDEgICAxICcwLjAwMDAwMDAxJyAtPiAnMS4wMDAwMCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgZnVubnkgemVyb3MgW2luIGNhc2Ugb2YgYmFkIHNpZ251bV0KK2ZtYXgzMDcwIGZtYSAgMSAgIDEgIDAgICAgLT4gMQorZm1heDMwNzEgZm1hICAxICAgMSAwLiAgICAtPiAxCitmbWF4MzA3MiBmbWEgIDEgICAxICAuMCAgIC0+IDEuMAorZm1heDMwNzMgZm1hICAxICAgMSAwLjAgICAtPiAxLjAKK2ZtYXgzMDc0IGZtYSAgMSAgIDEgMC4wMCAgLT4gMS4wMAorZm1heDMwNzUgZm1hICAxICAgIDAgIDEgICAtPiAxCitmbWF4MzA3NiBmbWEgIDEgICAwLiAgMSAgIC0+IDEKK2ZtYXgzMDc3IGZtYSAgMSAgICAuMCAxICAgLT4gMS4wCitmbWF4MzA3OCBmbWEgIDEgICAwLjAgMSAgIC0+IDEuMAorZm1heDMwNzkgZm1hICAxICAgMC4wMCAxICAtPiAxLjAwCisKK3ByZWNpc2lvbjogOQorCistLSBzb21lIGNhcnJpZXMKK2ZtYXgzMDgwIGZtYSAgMSAgIDk5OTk5OTk5OCAxICAtPiA5OTk5OTk5OTkKK2ZtYXgzMDgxIGZtYSAgMSAgIDk5OTk5OTk5OSAxICAtPiAxLjAwMDAwMDAwRSs5IFJvdW5kZWQKK2ZtYXgzMDgyIGZtYSAgMSAgICA5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAKK2ZtYXgzMDgzIGZtYSAgMSAgICAgOTk5OTk5OSAxICAtPiAxMDAwMDAwMAorZm1heDMwODQgZm1hICAxICAgICAgOTk5OTk5IDEgIC0+IDEwMDAwMDAKK2ZtYXgzMDg1IGZtYSAgMSAgICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2ZtYXgzMDg2IGZtYSAgMSAgICAgICAgOTk5OSAxICAtPiAxMDAwMAorZm1heDMwODcgZm1hICAxICAgICAgICAgOTk5IDEgIC0+IDEwMDAKK2ZtYXgzMDg4IGZtYSAgMSAgICAgICAgICA5OSAxICAtPiAxMDAKK2ZtYXgzMDg5IGZtYSAgMSAgICAgICAgICAgOSAxICAtPiAxMAorCisKKy0tIG1vcmUgTEhTIHN3YXBzCitmbWF4MzA5MCBmbWEgIDEgICAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2ZtYXgzMDkxIGZtYSAgMSAgICctNTYyNjdFLTYnICAgIDAgLT4gICctMC4wNTYyNjcnCitmbWF4MzA5MiBmbWEgIDEgICAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCitmbWF4MzA5MyBmbWEgIDEgICAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2ZtYXgzMDk0IGZtYSAgMSAgICctNTYyNjdFLTMnICAgIDAgLT4gICctNTYuMjY3JworZm1heDMwOTUgZm1hICAxICAgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCitmbWF4MzA5NiBmbWEgIDEgICAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2ZtYXgzMDk3IGZtYSAgMSAgICctNTYyNjdFLTAnICAgIDAgLT4gICctNTYyNjcnCitmbWF4MzA5OCBmbWEgIDEgICAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworZm1heDMwOTkgZm1hICAxICAgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworZm1heDMxMDAgZm1hICAxICAgJy01RS02JyAgICAgICAgMCAtPiAgJy0wLjAwMDAwNScKK2ZtYXgzMTAxIGZtYSAgMSAgICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK2ZtYXgzMTAyIGZtYSAgMSAgICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworZm1heDMxMDMgZm1hICAxICAgJy01RS0xJyAgICAgICAgMCAtPiAgJy0wLjUnCitmbWF4MzEwNCBmbWEgIDEgICAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCitmbWF4MzEwNSBmbWEgIDEgICAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworZm1heDMxMDYgZm1hICAxICAgJy01RTUnICAgICAgICAgMCAtPiAgJy01MDAwMDAnCitmbWF4MzEwNyBmbWEgIDEgICAnLTVFOCcgICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMCcKK2ZtYXgzMTA4IGZtYSAgMSAgICctNUU5JyAgICAgICAgIDAgLT4gICctNS4wMDAwMDAwMEUrOScgICBSb3VuZGVkCitmbWF4MzEwOSBmbWEgIDEgICAnLTVFMTAnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDBFKzEwJyAgUm91bmRlZAorZm1heDMxMTAgZm1hICAxICAgJy01RTExJyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSsxMScgIFJvdW5kZWQKK2ZtYXgzMTExIGZtYSAgMSAgICctNUUxMDAnICAgICAgIDAgLT4gICctNS4wMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzCitmbWF4MzExMyBmbWEgIDEgICAwICAnLTU2MjY3RS0xMCcgLT4gICctMC4wMDAwMDU2MjY3JworZm1heDMxMTQgZm1hICAxICAgMCAgJy01NjI2N0UtNicgIC0+ICAnLTAuMDU2MjY3JworZm1heDMxMTYgZm1hICAxICAgMCAgJy01NjI2N0UtNScgIC0+ICAnLTAuNTYyNjcnCitmbWF4MzExNyBmbWEgIDEgICAwICAnLTU2MjY3RS00JyAgLT4gICctNS42MjY3JworZm1heDMxMTkgZm1hICAxICAgMCAgJy01NjI2N0UtMycgIC0+ICAnLTU2LjI2NycKK2ZtYXgzMTIwIGZtYSAgMSAgIDAgICctNTYyNjdFLTInICAtPiAgJy01NjIuNjcnCitmbWF4MzEyMSBmbWEgIDEgICAwICAnLTU2MjY3RS0xJyAgLT4gICctNTYyNi43JworZm1heDMxMjIgZm1hICAxICAgMCAgJy01NjI2N0UtMCcgIC0+ICAnLTU2MjY3JworZm1heDMxMjMgZm1hICAxICAgMCAgJy01RS0xMCcgICAgIC0+ICAnLTVFLTEwJworZm1heDMxMjQgZm1hICAxICAgMCAgJy01RS03JyAgICAgIC0+ICAnLTVFLTcnCitmbWF4MzEyNSBmbWEgIDEgICAwICAnLTVFLTYnICAgICAgLT4gICctMC4wMDAwMDUnCitmbWF4MzEyNiBmbWEgIDEgICAwICAnLTVFLTUnICAgICAgLT4gICctMC4wMDAwNScKK2ZtYXgzMTI3IGZtYSAgMSAgIDAgICctNUUtNCcgICAgICAtPiAgJy0wLjAwMDUnCitmbWF4MzEyOCBmbWEgIDEgICAwICAnLTVFLTEnICAgICAgLT4gICctMC41JworZm1heDMxMjkgZm1hICAxICAgMCAgJy01RTAnICAgICAgIC0+ICAnLTUnCitmbWF4MzEzMCBmbWEgIDEgICAwICAnLTVFMScgICAgICAgLT4gICctNTAnCitmbWF4MzEzMSBmbWEgIDEgICAwICAnLTVFNScgICAgICAgLT4gICctNTAwMDAwJworZm1heDMxMzIgZm1hICAxICAgMCAgJy01RTgnICAgICAgIC0+ICAnLTUwMDAwMDAwMCcKK2ZtYXgzMTMzIGZtYSAgMSAgIDAgICctNUU5JyAgICAgICAtPiAgJy01LjAwMDAwMDAwRSs5JyAgICBSb3VuZGVkCitmbWF4MzEzNCBmbWEgIDEgICAwICAnLTVFMTAnICAgICAgLT4gICctNS4wMDAwMDAwMEUrMTAnICAgUm91bmRlZAorZm1heDMxMzUgZm1hICAxICAgMCAgJy01RTExJyAgICAgIC0+ICAnLTUuMDAwMDAwMDBFKzExJyAgIFJvdW5kZWQKK2ZtYXgzMTM2IGZtYSAgMSAgIDAgICctNUUxMDAnICAgICAtPiAgJy01LjAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKy0tIHJlbGF0ZWQKK2ZtYXgzMTM3IGZtYSAgMSAgICAxICAnMEUtMTInICAgICAgLT4gICcxLjAwMDAwMDAwJyAgUm91bmRlZAorZm1heDMxMzggZm1hICAxICAgLTEgICcwRS0xMicgICAgICAtPiAgJy0xLjAwMDAwMDAwJyBSb3VuZGVkCitmbWF4MzEzOSBmbWEgIDEgICAnMEUtMTInIDEgICAgICAgIC0+ICAnMS4wMDAwMDAwMCcgIFJvdW5kZWQKK2ZtYXgzMTQwIGZtYSAgMSAgICcwRS0xMicgLTEgICAgICAgLT4gICctMS4wMDAwMDAwMCcgUm91bmRlZAorZm1heDMxNDEgZm1hICAxICAgMUUrNCAgICAwLjAwMDAgICAtPiAgJzEwMDAwLjAwMDAnCitmbWF4MzE0MiBmbWEgIDEgICAxRSs0ICAgIDAuMDAwMDAgIC0+ICAnMTAwMDAuMDAwMCcgIFJvdW5kZWQKK2ZtYXgzMTQzIGZtYSAgMSAgIDAuMDAwICAgMUUrNSAgICAgLT4gICcxMDAwMDAuMDAwJworZm1heDMxNDQgZm1hICAxICAgMC4wMDAwICAxRSs1ICAgICAtPiAgJzEwMDAwMC4wMDAnICBSb3VuZGVkCisKKy0tIFtzb21lIG9mIHRoZSBuZXh0IGdyb3VwIGFyZSByZWFsbHkgY29uc3RydWN0b3IgdGVzdHNdCitmbWF4MzE0NiBmbWEgIDEgICAnMDAuMCcgIDAgICAgICAgLT4gICcwLjAnCitmbWF4MzE0NyBmbWEgIDEgICAnMC4wMCcgIDAgICAgICAgLT4gICcwLjAwJworZm1heDMxNDggZm1hICAxICAgIDAgICAgICAnMC4wMCcgIC0+ICAnMC4wMCcKK2ZtYXgzMTQ5IGZtYSAgMSAgICAwICAgICAgJzAwLjAnICAtPiAgJzAuMCcKK2ZtYXgzMTUwIGZtYSAgMSAgICcwMC4wJyAgJzAuMDAnICAtPiAgJzAuMDAnCitmbWF4MzE1MSBmbWEgIDEgICAnMC4wMCcgICcwMC4wJyAgLT4gICcwLjAwJworZm1heDMxNTIgZm1hICAxICAgJzMnICAgICAnLjMnICAgIC0+ICAnMy4zJworZm1heDMxNTMgZm1hICAxICAgJzMuJyAgICAnLjMnICAgIC0+ICAnMy4zJworZm1heDMxNTQgZm1hICAxICAgJzMuMCcgICAnLjMnICAgIC0+ICAnMy4zJworZm1heDMxNTUgZm1hICAxICAgJzMuMDAnICAnLjMnICAgIC0+ICAnMy4zMCcKK2ZtYXgzMTU2IGZtYSAgMSAgICczJyAgICAgJzMnICAgICAtPiAgJzYnCitmbWF4MzE1NyBmbWEgIDEgICAnMycgICAgICcrMycgICAgLT4gICc2JworZm1heDMxNTggZm1hICAxICAgJzMnICAgICAnLTMnICAgIC0+ICAnMCcKK2ZtYXgzMTU5IGZtYSAgMSAgICcwLjMnICAgJy0wLjMnICAtPiAgJzAuMCcKK2ZtYXgzMTYwIGZtYSAgMSAgICcwLjAzJyAgJy0wLjAzJyAtPiAgJzAuMDAnCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitwcmVjaXNpb246IDE1CitmbWF4MzE2MSBmbWEgIDEgICAnMUUrMTInICctMScgICAgLT4gJzk5OTk5OTk5OTk5OScKK2ZtYXgzMTYyIGZtYSAgMSAgICcxRSsxMicgICcxLjExJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2ZtYXgzMTYzIGZtYSAgMSAgICcxLjExJyAgJzFFKzEyJyAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK2ZtYXgzMTY0IGZtYSAgMSAgICctMScgICAgJzFFKzEyJyAtPiAnOTk5OTk5OTk5OTk5JworZm1heDMxNjUgZm1hICAxICAgJzdFKzEyJyAnLTEnICAgIC0+ICc2OTk5OTk5OTk5OTk5JworZm1heDMxNjYgZm1hICAxICAgJzdFKzEyJyAgJzEuMTEnIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZm1heDMxNjcgZm1hICAxICAgJzEuMTEnICAnN0UrMTInIC0+ICc3MDAwMDAwMDAwMDAxLjExJworZm1heDMxNjggZm1hICAxICAgJy0xJyAgICAnN0UrMTInIC0+ICc2OTk5OTk5OTk5OTk5JworCistLSAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDUgICAgICAxMjM0NTY3ODkwMTIzNDUgICAgICAxIDIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE3MCBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NjMnIC0+ICcxLjAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTcxIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU2MicgLT4gJzEuMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorZm1heDMxNzIgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTYxJyAtPiAnMS4wMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzE3MyBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NjAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTc0IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1OScgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZm1heDMxNzUgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU4JyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzE3NiBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTcnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTc3IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NicgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIFJvdW5kZWQKK2ZtYXgzMTc4IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NScgLT4gJzAuOTk5OTk5OTk5OTk5OTk5JworZm1heDMxNzkgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU0JyAtPiAnMC45OTk5OTk5OTk5OTk5OTgnCitmbWF4MzE4MCBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTMnIC0+ICcwLjk5OTk5OTk5OTk5OTk5NycKK2ZtYXgzMTgxIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1MicgLT4gJzAuOTk5OTk5OTk5OTk5OTk2JworZm1heDMxODIgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTUxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTUnCitmbWF4MzE4MyBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTAnIC0+ICcwLjk5OTk5OTk5OTk5OTk5NCcKKworLS0gYW5kIHNvbWUgbW9yZSwgaW5jbHVkaW5nIHJlc2lkdWUgZWZmZWN0cyBhbmQgZGlmZmVyZW50IHJvdW5kaW5ncworcHJlY2lzaW9uOiA5Cityb3VuZGluZzogaGFsZl91cAorZm1heDMyMDAgZm1hICAxICAgJzEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JworZm1heDMyMDEgZm1hICAxICAgJzEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjAyIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIwMyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMDQgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjA1IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIwNiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMDcgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjA4IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIwOSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMTAgZm1hICAxICAgJzEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjExIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIxMiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMTMgZm1hICAxICAgJzEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjE0IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIxNSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMTYgZm1hICAxICAgJzEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2NzkwJworZm1heDMyMTcgZm1hICAxICAgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMDEgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjE4IGZtYSAgMSAgICcxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIxOSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitmbWF4MzIyMCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODknCitmbWF4MzIyMSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMjIgZm1hICAxICAgJzEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjIzIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIyNCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMjUgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjI2IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIyNyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyMjggZm1hICAxICAgJzEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjI5IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIzMCBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMzEgZm1hICAxICAgJzEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjMyIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIzMyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMzQgZm1hICAxICAgJzEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjM1IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzIzNiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnCitmbWF4MzIzNyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDMyMzggZm1hICAxICAgJzEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjM5IGZtYSAgMSAgICcxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZm1heDMyNDAgZm1hICAxICAgJzEyMzQ1Njc4OCcgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjQxIGZtYSAgMSAgICcxMjM0NTY3ODgnIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI0MiBmbWEgIDEgICAnMTIzNDU2Nzg4JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZm1heDMyNTAgZm1hICAxICAgJzEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JworZm1heDMyNTEgZm1hICAxICAgJzEyMzQ1Njc4OScgMC4wMDAwMDAwMDEgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjUyIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI1MyBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNTQgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjU1IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI1NiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNTcgZm1hICAxICAgJzEyMzQ1Njc4OScgMC40OTk5OTk5OTkgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjU4IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI1OSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNjAgZm1hICAxICAgJzEyMzQ1Njc4OScgMC41MDAwMDEgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjYxIGZtYSAgMSAgICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI2MiBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNjMgZm1hICAxICAgJzEyMzQ1Njc4OScgMC45ICAgICAgICAgICAtPiAnMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjY0IGZtYSAgMSAgICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI2NSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDMyNjYgZm1hICAxICAgJzEyMzQ1Njc4OScgMSAgICAgICAgICAgICAtPiAnMTIzNDU2NzkwJworZm1heDMyNjcgZm1hICAxICAgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjY4IGZtYSAgMSAgICcxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI2OSBmbWEgIDEgICAnMTIzNDU2Nzg5JyAxLjEgICAgICAgICAgIC0+ICcxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSBpbnB1dCBwcmVwYXJhdGlvbiB0ZXN0cyAob3BlcmFuZHMgc2hvdWxkIG5vdCBiZSByb3VuZGVkKQorcHJlY2lzaW9uOiAzCityb3VuZGluZzogaGFsZl91cAorCitmbWF4MzI3MCBmbWEgIDEgICAnMTIzNDU2Nzg5MDAwMDAnICA5OTk5OTk5OTk5OTk5IC0+ICAnMi4yM0UrMTMnIEluZXhhY3QgUm91bmRlZAorZm1heDMyNzEgZm1hICAxICAgICc5OTk5OTk5OTk5OTk5JyAxMjM0NTY3ODkwMDAwMCAtPiAgJzIuMjNFKzEzJyBJbmV4YWN0IFJvdW5kZWQKKworZm1heDMyNzIgZm1hICAxICAgJzEyRSszJyAgJzM0NDQnICAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjczIGZtYSAgMSAgICcxMkUrMycgICczNDQ2JyAgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI3NCBmbWEgIDEgICAnMTJFKzMnICAnMzQ0OS45JyAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyNzUgZm1hICAxICAgJzEyRSszJyAgJzM0NTAuMCcgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjc2IGZtYSAgMSAgICcxMkUrMycgICczNDUwLjEnIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI3NyBmbWEgIDEgICAnMTJFKzMnICAnMzQ1NCcgICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyNzggZm1hICAxICAgJzEyRSszJyAgJzM0NTYnICAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworZm1heDMyODEgZm1hICAxICAgJzM0NDQnICAgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjgyIGZtYSAgMSAgICczNDQ2JyAgICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI4MyBmbWEgIDEgICAnMzQ0OS45JyAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyODQgZm1hICAxICAgJzM0NTAuMCcgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjg1IGZtYSAgMSAgICczNDUwLjEnICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI4NiBmbWEgIDEgICAnMzQ1NCcgICAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyODcgZm1hICAxICAgJzM0NTYnICAgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorZm1heDMyOTEgZm1hICAxICAgJzM0NDQnICAgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjkyIGZtYSAgMSAgICczNDQ2JyAgICcxMkUrMycgIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI5MyBmbWEgIDEgICAnMzQ0OS45JyAnMTJFKzMnICAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyOTQgZm1hICAxICAgJzM0NTAuMCcgJzEyRSszJyAgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMjk1IGZtYSAgMSAgICczNDUwLjEnICcxMkUrMycgIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzI5NiBmbWEgIDEgICAnMzQ1NCcgICAnMTJFKzMnICAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorZm1heDMyOTcgZm1hICAxICAgJzM0NTYnICAgJzEyRSszJyAgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gMSBpbiBsYXN0IHBsYWNlIHRlc3RzCityb3VuZGluZzogaGFsZl91cAorZm1heDMzMDEgZm1hICAxICAgIC0xICAgMSAgICAgIC0+ICAgMAorZm1heDMzMDIgZm1hICAxICAgICAwICAgMSAgICAgIC0+ICAgMQorZm1heDMzMDMgZm1hICAxICAgICAxICAgMSAgICAgIC0+ICAgMgorZm1heDMzMDQgZm1hICAxICAgIDEyICAgMSAgICAgIC0+ICAxMworZm1heDMzMDUgZm1hICAxICAgIDk4ICAgMSAgICAgIC0+ICA5OQorZm1heDMzMDYgZm1hICAxICAgIDk5ICAgMSAgICAgIC0+IDEwMAorZm1heDMzMDcgZm1hICAxICAgMTAwICAgMSAgICAgIC0+IDEwMQorZm1heDMzMDggZm1hICAxICAgMTAxICAgMSAgICAgIC0+IDEwMgorZm1heDMzMDkgZm1hICAxICAgIC0xICAtMSAgICAgIC0+ICAtMgorZm1heDMzMTAgZm1hICAxICAgICAwICAtMSAgICAgIC0+ICAtMQorZm1heDMzMTEgZm1hICAxICAgICAxICAtMSAgICAgIC0+ICAgMAorZm1heDMzMTIgZm1hICAxICAgIDEyICAtMSAgICAgIC0+ICAxMQorZm1heDMzMTMgZm1hICAxICAgIDk4ICAtMSAgICAgIC0+ICA5NworZm1heDMzMTQgZm1hICAxICAgIDk5ICAtMSAgICAgIC0+ICA5OAorZm1heDMzMTUgZm1hICAxICAgMTAwICAtMSAgICAgIC0+ICA5OQorZm1heDMzMTYgZm1hICAxICAgMTAxICAtMSAgICAgIC0+IDEwMAorCitmbWF4MzMyMSBmbWEgIDEgICAtMC4wMSAgMC4wMSAgICAtPiAgMC4wMAorZm1heDMzMjIgZm1hICAxICAgIDAuMDAgIDAuMDEgICAgLT4gIDAuMDEKK2ZtYXgzMzIzIGZtYSAgMSAgICAwLjAxICAwLjAxICAgIC0+ICAwLjAyCitmbWF4MzMyNCBmbWEgIDEgICAgMC4xMiAgMC4wMSAgICAtPiAgMC4xMworZm1heDMzMjUgZm1hICAxICAgIDAuOTggIDAuMDEgICAgLT4gIDAuOTkKK2ZtYXgzMzI2IGZtYSAgMSAgICAwLjk5ICAwLjAxICAgIC0+ICAxLjAwCitmbWF4MzMyNyBmbWEgIDEgICAgMS4wMCAgMC4wMSAgICAtPiAgMS4wMQorZm1heDMzMjggZm1hICAxICAgIDEuMDEgIDAuMDEgICAgLT4gIDEuMDIKK2ZtYXgzMzI5IGZtYSAgMSAgIC0wLjAxIC0wLjAxICAgIC0+IC0wLjAyCitmbWF4MzMzMCBmbWEgIDEgICAgMC4wMCAtMC4wMSAgICAtPiAtMC4wMQorZm1heDMzMzEgZm1hICAxICAgIDAuMDEgLTAuMDEgICAgLT4gIDAuMDAKK2ZtYXgzMzMyIGZtYSAgMSAgICAwLjEyIC0wLjAxICAgIC0+ICAwLjExCitmbWF4MzMzMyBmbWEgIDEgICAgMC45OCAtMC4wMSAgICAtPiAgMC45NworZm1heDMzMzQgZm1hICAxICAgIDAuOTkgLTAuMDEgICAgLT4gIDAuOTgKK2ZtYXgzMzM1IGZtYSAgMSAgICAxLjAwIC0wLjAxICAgIC0+ICAwLjk5CitmbWF4MzMzNiBmbWEgIDEgICAgMS4wMSAtMC4wMSAgICAtPiAgMS4wMAorCistLSBzb21lIG1vcmUgY2FzZXMgd2hlcmUgZm1hICAxICBpbmcgMCBhZmZlY3RzIHRoZSBjb2VmZmljaWVudAorcHJlY2lzaW9uOiA5CitmbWF4MzM0MCBmbWEgIDEgICAxRSszICAgIDAgICAgLT4gICAgICAgICAxMDAwCitmbWF4MzM0MSBmbWEgIDEgICAxRSs4ICAgIDAgICAgLT4gICAgMTAwMDAwMDAwCitmbWF4MzM0MiBmbWEgIDEgICAxRSs5ICAgIDAgICAgLT4gICAxLjAwMDAwMDAwRSs5ICAgUm91bmRlZAorZm1heDMzNDMgZm1hICAxICAgMUUrMTAgICAwICAgIC0+ICAgMS4wMDAwMDAwMEUrMTAgIFJvdW5kZWQKKy0tIHdoaWNoIHNpbXBseSBmb2xsb3cgZnJvbSB0aGVzZSBjYXNlcyAuLi4KK2ZtYXgzMzQ0IGZtYSAgMSAgIDFFKzMgICAgMSAgICAtPiAgICAgICAgIDEwMDEKK2ZtYXgzMzQ1IGZtYSAgMSAgIDFFKzggICAgMSAgICAtPiAgICAxMDAwMDAwMDEKK2ZtYXgzMzQ2IGZtYSAgMSAgIDFFKzkgICAgMSAgICAtPiAgIDEuMDAwMDAwMDBFKzkgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMzQ3IGZtYSAgMSAgIDFFKzEwICAgMSAgICAtPiAgIDEuMDAwMDAwMDBFKzEwICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMzQ4IGZtYSAgMSAgIDFFKzMgICAgNyAgICAtPiAgICAgICAgIDEwMDcKK2ZtYXgzMzQ5IGZtYSAgMSAgIDFFKzggICAgNyAgICAtPiAgICAxMDAwMDAwMDcKK2ZtYXgzMzUwIGZtYSAgMSAgIDFFKzkgICAgNyAgICAtPiAgIDEuMDAwMDAwMDFFKzkgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMzUxIGZtYSAgMSAgIDFFKzEwICAgNyAgICAtPiAgIDEuMDAwMDAwMDBFKzEwICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdHJ5emVyb3MgY2FzZXMKK3ByZWNpc2lvbjogICA3Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDkyCittaW5leHBvbmVudDogLTkyCitmbWF4MzM2MSAgZm1hICAxICAgMEUrNTAgMTAwMDBFKzEgIC0+IDEuMDAwMEUrNQorZm1heDMzNjIgIGZtYSAgMSAgIDEwMDAwRSsxIDBFLTUwICAtPiAxMDAwMDAuMCAgUm91bmRlZAorZm1heDMzNjMgIGZtYSAgMSAgIDEwMDAwRSsxIDEwMDAwRS01MCAgLT4gMTAwMDAwLjAgIFJvdW5kZWQgSW5leGFjdAorZm1heDMzNjQgIGZtYSAgMSAgIDkuOTk5OTk5RSs5MiAtOS45OTk5OTlFKzkyIC0+IDBFKzg2CisKKy0tIGEgY3VyaW9zaXR5IGZyb20gSlNSIDEzIHRlc3RpbmcKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KK3ByZWNpc2lvbjogICAxMAorZm1heDMzNzAgZm1hICAxICAgOTk5OTk5OTkgODE1MTIgLT4gMTAwMDgxNTExCitwcmVjaXNpb246ICAgICAgNgorZm1heDMzNzEgZm1hICAxICAgOTk5OTk5OTkgODE1MTIgLT4gMS4wMDA4MkUrOCBSb3VuZGVkIEluZXhhY3QKK3JvdW5kaW5nOiAgICBoYWxmX3VwCitwcmVjaXNpb246ICAgMTAKK2ZtYXgzMzcyIGZtYSAgMSAgIDk5OTk5OTk5IDgxNTEyIC0+IDEwMDA4MTUxMQorcHJlY2lzaW9uOiAgICAgIDYKK2ZtYXgzMzczIGZtYSAgMSAgIDk5OTk5OTk5IDgxNTEyIC0+IDEuMDAwODJFKzggUm91bmRlZCBJbmV4YWN0Cityb3VuZGluZzogICAgaGFsZl9ldmVuCitwcmVjaXNpb246ICAgMTAKK2ZtYXgzMzc0IGZtYSAgMSAgIDk5OTk5OTk5IDgxNTEyIC0+IDEwMDA4MTUxMQorcHJlY2lzaW9uOiAgICAgIDYKK2ZtYXgzMzc1IGZtYSAgMSAgIDk5OTk5OTk5IDgxNTEyIC0+IDEuMDAwODJFKzggUm91bmRlZCBJbmV4YWN0CisKKy0tIHVscCByZXBsYWNlbWVudCB0ZXN0cworcHJlY2lzaW9uOiA5CittYXhleHBvbmVudDogOTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OQorZm1heDM0MDAgZm1hICAxICAgICAxICAgNzdlLTcgICAgICAgLT4gIDEuMDAwMDA3NworZm1heDM0MDEgZm1hICAxICAgICAxICAgNzdlLTggICAgICAgLT4gIDEuMDAwMDAwNzcKK2ZtYXgzNDAyIGZtYSAgMSAgICAgMSAgIDc3ZS05ICAgICAgIC0+ICAxLjAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZm1heDM0MDMgZm1hICAxICAgICAxICAgNzdlLTEwICAgICAgLT4gIDEuMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQwNCBmbWEgIDEgICAgIDEgICA3N2UtMTEgICAgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDA1IGZtYSAgMSAgICAgMSAgIDc3ZS0xMiAgICAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MDYgZm1hICAxICAgICAxICAgNzdlLTk5OSAgICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQwNyBmbWEgIDEgICAgIDEgICA3N2UtOTk5OTk5ICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM0MTAgZm1hICAxICAgIDEwICAgNzdlLTcgICAgICAgLT4gIDEwLjAwMDAwNzcKK2ZtYXgzNDExIGZtYSAgMSAgICAxMCAgIDc3ZS04ICAgICAgIC0+ICAxMC4wMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZm1heDM0MTIgZm1hICAxICAgIDEwICAgNzdlLTkgICAgICAgLT4gIDEwLjAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQxMyBmbWEgIDEgICAgMTAgICA3N2UtMTAgICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDE0IGZtYSAgMSAgICAxMCAgIDc3ZS0xMSAgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MTUgZm1hICAxICAgIDEwICAgNzdlLTEyICAgICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQxNiBmbWEgIDEgICAgMTAgICA3N2UtOTk5ICAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDE3IGZtYSAgMSAgICAxMCAgIDc3ZS05OTk5OTkgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzQyMCBmbWEgIDEgICAgNzdlLTcgICAgICAgIDEgICAtPiAgMS4wMDAwMDc3CitmbWF4MzQyMSBmbWEgIDEgICAgNzdlLTggICAgICAgIDEgICAtPiAgMS4wMDAwMDA3NworZm1heDM0MjIgZm1hICAxICAgIDc3ZS05ICAgICAgICAxICAgLT4gIDEuMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzQyMyBmbWEgIDEgICAgNzdlLTEwICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDI0IGZtYSAgMSAgICA3N2UtMTEgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MjUgZm1hICAxICAgIDc3ZS0xMiAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQyNiBmbWEgIDEgICAgNzdlLTk5OSAgICAgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDI3IGZtYSAgMSAgICA3N2UtOTk5OTk5ICAgMSAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzQzMCBmbWEgIDEgICAgNzdlLTcgICAgICAgMTAgICAtPiAgMTAuMDAwMDA3NworZm1heDM0MzEgZm1hICAxICAgIDc3ZS04ICAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzQzMiBmbWEgIDEgICAgNzdlLTkgICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDMzIGZtYSAgMSAgICA3N2UtMTAgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MzQgZm1hICAxICAgIDc3ZS0xMSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQzNSBmbWEgIDEgICAgNzdlLTEyICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDM2IGZtYSAgMSAgICA3N2UtOTk5ICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0MzcgZm1hICAxICAgIDc3ZS05OTk5OTkgIDEwICAgLT4gIDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2ZtYXgzNDQwIGZtYSAgMSAgICAgMSAgIC03N2UtNyAgICAgICAtPiAgMC45OTk5OTIzCitmbWF4MzQ0MSBmbWEgIDEgICAgIDEgICAtNzdlLTggICAgICAgLT4gIDAuOTk5OTk5MjMKK2ZtYXgzNDQyIGZtYSAgMSAgICAgMSAgIC03N2UtOSAgICAgICAtPiAgMC45OTk5OTk5MjMKK2ZtYXgzNDQzIGZtYSAgMSAgICAgMSAgIC03N2UtMTAgICAgICAtPiAgMC45OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ0NCBmbWEgIDEgICAgIDEgICAtNzdlLTExICAgICAgLT4gIDAuOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM0NDUgZm1hICAxICAgICAxICAgLTc3ZS0xMiAgICAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NDYgZm1hICAxICAgICAxICAgLTc3ZS05OTkgICAgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NDcgZm1hICAxICAgICAxICAgLTc3ZS05OTk5OTkgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzQ1MCBmbWEgIDEgICAgMTAgICAtNzdlLTcgICAgICAgLT4gICA5Ljk5OTk5MjMKK2ZtYXgzNDUxIGZtYSAgMSAgICAxMCAgIC03N2UtOCAgICAgICAtPiAgIDkuOTk5OTk5MjMKK2ZtYXgzNDUyIGZtYSAgMSAgICAxMCAgIC03N2UtOSAgICAgICAtPiAgIDkuOTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ1MyBmbWEgIDEgICAgMTAgICAtNzdlLTEwICAgICAgLT4gICA5Ljk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM0NTQgZm1hICAxICAgIDEwICAgLTc3ZS0xMSAgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NTUgZm1hICAxICAgIDEwICAgLTc3ZS0xMiAgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NTYgZm1hICAxICAgIDEwICAgLTc3ZS05OTkgICAgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0NTcgZm1hICAxICAgIDEwICAgLTc3ZS05OTk5OTkgIC0+ICAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzQ2MCBmbWEgIDEgICAgLTc3ZS03ICAgICAgICAxICAgLT4gIDAuOTk5OTkyMworZm1heDM0NjEgZm1hICAxICAgIC03N2UtOCAgICAgICAgMSAgIC0+ICAwLjk5OTk5OTIzCitmbWF4MzQ2MiBmbWEgIDEgICAgLTc3ZS05ICAgICAgICAxICAgLT4gIDAuOTk5OTk5OTIzCitmbWF4MzQ2MyBmbWEgIDEgICAgLTc3ZS0xMCAgICAgICAxICAgLT4gIDAuOTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM0NjQgZm1hICAxICAgIC03N2UtMTEgICAgICAgMSAgIC0+ICAwLjk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDY1IGZtYSAgMSAgICAtNzdlLTEyICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDY2IGZtYSAgMSAgICAtNzdlLTk5OSAgICAgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDY3IGZtYSAgMSAgICAtNzdlLTk5OTk5OSAgIDEgICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM0NzAgZm1hICAxICAgIC03N2UtNyAgICAgICAxMCAgIC0+ICAgOS45OTk5OTIzCitmbWF4MzQ3MSBmbWEgIDEgICAgLTc3ZS04ICAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTIzCitmbWF4MzQ3MiBmbWEgIDEgICAgLTc3ZS05ICAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM0NzMgZm1hICAxICAgIC03N2UtMTAgICAgICAxMCAgIC0+ICAgOS45OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDc0IGZtYSAgMSAgICAtNzdlLTExICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDc1IGZtYSAgMSAgICAtNzdlLTEyICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDc2IGZtYSAgMSAgICAtNzdlLTk5OSAgICAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDc3IGZtYSAgMSAgICAtNzdlLTk5OTk5OSAgMTAgICAtPiAgMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworLS0gbmVnYXRpdmUgdWxwcworZm1heDM0ODAgZm1hICAxICAgIC0xICAgIDc3ZS03ICAgICAgIC0+ICAtMC45OTk5OTIzCitmbWF4MzQ4MSBmbWEgIDEgICAgLTEgICAgNzdlLTggICAgICAgLT4gIC0wLjk5OTk5OTIzCitmbWF4MzQ4MiBmbWEgIDEgICAgLTEgICAgNzdlLTkgICAgICAgLT4gIC0wLjk5OTk5OTkyMworZm1heDM0ODMgZm1hICAxICAgIC0xICAgIDc3ZS0xMCAgICAgIC0+ICAtMC45OTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ4NCBmbWEgIDEgICAgLTEgICAgNzdlLTExICAgICAgLT4gIC0wLjk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDg1IGZtYSAgMSAgICAtMSAgICA3N2UtMTIgICAgICAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ4NiBmbWEgIDEgICAgLTEgICAgNzdlLTk5OSAgICAgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0ODcgZm1hICAxICAgIC0xICAgIDc3ZS05OTk5OTkgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM0OTAgZm1hICAxICAgLTEwICAgIDc3ZS03ICAgICAgIC0+ICAgLTkuOTk5OTkyMworZm1heDM0OTEgZm1hICAxICAgLTEwICAgIDc3ZS04ICAgICAgIC0+ICAgLTkuOTk5OTk5MjMKK2ZtYXgzNDkyIGZtYSAgMSAgIC0xMCAgICA3N2UtOSAgICAgICAtPiAgIC05Ljk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM0OTMgZm1hICAxICAgLTEwICAgIDc3ZS0xMCAgICAgIC0+ICAgLTkuOTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ5NCBmbWEgIDEgICAtMTAgICAgNzdlLTExICAgICAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM0OTUgZm1hICAxICAgLTEwICAgIDc3ZS0xMiAgICAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNDk2IGZtYSAgMSAgIC0xMCAgICA3N2UtOTk5ICAgICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzQ5NyBmbWEgIDEgICAtMTAgICAgNzdlLTk5OTk5OSAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzUwMCBmbWEgIDEgICAgIDc3ZS03ICAgICAgIC0xICAgLT4gIC0wLjk5OTk5MjMKK2ZtYXgzNTAxIGZtYSAgMSAgICAgNzdlLTggICAgICAgLTEgICAtPiAgLTAuOTk5OTk5MjMKK2ZtYXgzNTAyIGZtYSAgMSAgICAgNzdlLTkgICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTIzCitmbWF4MzUwMyBmbWEgIDEgICAgIDc3ZS0xMCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTA0IGZtYSAgMSAgICAgNzdlLTExICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM1MDUgZm1hICAxICAgICA3N2UtMTIgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTA2IGZtYSAgMSAgICAgNzdlLTk5OSAgICAgLTEgICAtPiAgLTEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUwNyBmbWEgIDEgICAgIDc3ZS05OTk5OTkgIC0xICAgLT4gIC0xLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzUxMCBmbWEgIDEgICAgIDc3ZS03ICAgICAgIC0xMCAgLT4gICAtOS45OTk5OTIzCitmbWF4MzUxMSBmbWEgIDEgICAgIDc3ZS04ICAgICAgIC0xMCAgLT4gICAtOS45OTk5OTkyMworZm1heDM1MTIgZm1hICAxICAgICA3N2UtOSAgICAgICAtMTAgIC0+ICAgLTkuOTk5OTk5OTIgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUxMyBmbWEgIDEgICAgIDc3ZS0xMCAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTE0IGZtYSAgMSAgICAgNzdlLTExICAgICAgLTEwICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUxNSBmbWEgIDEgICAgIDc3ZS0xMiAgICAgIC0xMCAgLT4gIC0xMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM1MTYgZm1hICAxICAgICA3N2UtOTk5ICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTE3IGZtYSAgMSAgICAgNzdlLTk5OTk5OSAgLTEwICAtPiAgLTEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKworLS0gbG9uZyBvcGVyYW5kcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorZm1heDM1MjEgZm1hICAxICAgMTIzNDU2NzgwMDAgMCAtPiAxLjIzNDU2NzgwRSsxMCBSb3VuZGVkCitmbWF4MzUyMiBmbWEgIDEgICAwIDEyMzQ1Njc4MDAwIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK2ZtYXgzNTIzIGZtYSAgMSAgIDEyMzQ1Njc4MDAgIDAgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitmbWF4MzUyNCBmbWEgIDEgICAwIDEyMzQ1Njc4MDAgIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorZm1heDM1MjUgZm1hICAxICAgMTIzNDU2Nzg5MCAgMCAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK2ZtYXgzNTI2IGZtYSAgMSAgIDAgMTIzNDU2Nzg5MCAgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitmbWF4MzUyNyBmbWEgIDEgICAxMjM0NTY3ODkxICAwIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUyOCBmbWEgIDEgICAwIDEyMzQ1Njc4OTEgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzUyOSBmbWEgIDEgICAxMjM0NTY3ODkwMSAwIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorZm1heDM1MzAgZm1hICAxICAgMCAxMjM0NTY3ODkwMSAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTMxIGZtYSAgMSAgIDEyMzQ1Njc4OTYgIDAgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTMyIGZtYSAgMSAgIDAgMTIzNDU2Nzg5NiAgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxNQorLS0gc3RpbGwgY2hlY2tpbmcKK2ZtYXgzNTQxIGZtYSAgMSAgIDEyMzQ1Njc4MDAwIDAgLT4gMTIzNDU2NzgwMDAKK2ZtYXgzNTQyIGZtYSAgMSAgIDAgMTIzNDU2NzgwMDAgLT4gMTIzNDU2NzgwMDAKK2ZtYXgzNTQzIGZtYSAgMSAgIDEyMzQ1Njc4MDAgIDAgLT4gMTIzNDU2NzgwMAorZm1heDM1NDQgZm1hICAxICAgMCAxMjM0NTY3ODAwICAtPiAxMjM0NTY3ODAwCitmbWF4MzU0NSBmbWEgIDEgICAxMjM0NTY3ODkwICAwIC0+IDEyMzQ1Njc4OTAKK2ZtYXgzNTQ2IGZtYSAgMSAgIDAgMTIzNDU2Nzg5MCAgLT4gMTIzNDU2Nzg5MAorZm1heDM1NDcgZm1hICAxICAgMTIzNDU2Nzg5MSAgMCAtPiAxMjM0NTY3ODkxCitmbWF4MzU0OCBmbWEgIDEgICAwIDEyMzQ1Njc4OTEgIC0+IDEyMzQ1Njc4OTEKK2ZtYXgzNTQ5IGZtYSAgMSAgIDEyMzQ1Njc4OTAxIDAgLT4gMTIzNDU2Nzg5MDEKK2ZtYXgzNTUwIGZtYSAgMSAgIDAgMTIzNDU2Nzg5MDEgLT4gMTIzNDU2Nzg5MDEKK2ZtYXgzNTUxIGZtYSAgMSAgIDEyMzQ1Njc4OTYgIDAgLT4gMTIzNDU2Nzg5NgorZm1heDM1NTIgZm1hICAxICAgMCAxMjM0NTY3ODk2ICAtPiAxMjM0NTY3ODk2CisKKy0tIHZlcmlmeSBhIHF1ZXJ5CitwcmVjaXNpb246ICAgIDE2CittYXhFeHBvbmVudDogKzM5NAorbWluRXhwb25lbnQ6IC0zOTMKK3JvdW5kaW5nOiAgICAgZG93bgorZm1heDM1NjEgZm1hICAxICAgMWUtMzk4IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNTYyIGZtYSAgMSAgICAgICAgMCA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgUm91bmRlZAorLS0gYW5kIHVzaW5nIGRlY2ltYWw2NCBib3VuZHMuLi4KK3ByZWNpc2lvbjogICAgMTYKK21heEV4cG9uZW50OiArMzg0CittaW5FeHBvbmVudDogLTM4Mworcm91bmRpbmc6ICAgICBkb3duCitmbWF4MzU2MyBmbWEgIDEgICAxZS0zODggOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IEluZXhhY3QgUm91bmRlZAorZm1heDM1NjQgZm1hICAxICAgICAgICAwIDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCBSb3VuZGVkCisKKworLS0gc29tZSBtb3JlIHJlc2lkdWUgZWZmZWN0cyB3aXRoIGV4dHJlbWUgcm91bmRpbmcKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogaGFsZl91cAorZm1heDM2MDEgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCitmbWF4MzYwMiBmbWEgIDEgICAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2ZtYXgzNjAzIGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCitmbWF4MzYwNCBmbWEgIDEgICAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCitmbWF4MzYwNSBmbWEgIDEgICAxMjM0NTY3ODkgIDAuMDAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorZm1heDM2MDYgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorZm1heDM2MDcgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCitmbWF4MzYxMSBmbWEgIDEgICAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzNjEyIGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorZm1heDM2MTMgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2ZtYXgzNjE0IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2ZtYXgzNjE1IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC4wMDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCitmbWF4MzYxNiBmbWEgIDEgICAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCitmbWF4MzYxNyBmbWEgIDEgICAxMjM0NTY3ODkgLTAuMDAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2ZtYXgzNjIxIGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorZm1heDM2MjIgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCitmbWF4MzYyMyBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorZm1heDM2MjQgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworZm1heDM2MjUgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjQ5OTk5OSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2ZtYXgzNjI2IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2ZtYXgzNjI3IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorZm1heDM2MzEgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9ldmVuCitmbWF4MzYzMiBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK2ZtYXgzNjMzIGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC40OTk5OTkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGZsb29yCitmbWF4MzYzNCBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBjZWlsaW5nCitmbWF4MzYzNSBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNDk5OTk5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiB1cAorZm1heDM2MzYgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorZm1heDM2MzcgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjQ5OTk5OSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCitmbWF4MzY0MSBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzNjQyIGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZG93bgorZm1heDM2NDMgZm1hICAxICAgMTIzNDU2Nzg5ICAwLjUwMDAwMSAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZmxvb3IKK2ZtYXgzNjQ0IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGNlaWxpbmcKK2ZtYXgzNjQ1IGZtYSAgMSAgIDEyMzQ1Njc4OSAgMC41MDAwMDEgLT4gMTIzNDU2NzkwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IHVwCitmbWF4MzY0NiBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBkb3duCitmbWF4MzY0NyBmbWEgIDEgICAxMjM0NTY3ODkgIDAuNTAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK2ZtYXgzNjUxIGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorZm1heDM2NTIgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCitmbWF4MzY1MyBmbWEgIDEgICAxMjM0NTY3ODkgLTAuNTAwMDAxIC0+IDEyMzQ1Njc4OCBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorZm1heDM2NTQgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworZm1heDM2NTUgZm1hICAxICAgMTIzNDU2Nzg5IC0wLjUwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK2ZtYXgzNjU2IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGRvd24KK2ZtYXgzNjU3IGZtYSAgMSAgIDEyMzQ1Njc4OSAtMC41MDAwMDEgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAorCistLSBsb25nIG9wZXJhbmQgdHJpYW5nbGUKK3JvdW5kaW5nOiBoYWxmX3VwCitwcmVjaXNpb246ICAzNworZm1heDM2NjAgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODM0NTM4CitwcmVjaXNpb246ICAzNgorZm1heDM2NjEgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODM0NTQgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzUKK2ZtYXgzNjYyIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNDgzNDUgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDM0CitmbWF4MzY2MyBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTQ4MzUgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzMworZm1heDM2NjQgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE0ODMgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMzIKK2ZtYXgzNjY1IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzExNDggICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDMxCitmbWF4MzY2NiBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcxMTUgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzMAorZm1heDM2NjcgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTEgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjkKK2ZtYXgzNjY4IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMzNzEgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI4CitmbWF4MzY2OSBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIzMzcgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyNworZm1heDM2NzAgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzQgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjYKK2ZtYXgzNjcxIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkyMjMgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDI1CitmbWF4MzY3MiBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2Mzg5MjIgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyNAorZm1heDM2NzMgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjMKK2ZtYXgzNjc0IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYzODkgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDIyCitmbWF4MzY3NSBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjM2MzkgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyMQorZm1heDM2NzYgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjQgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMjAKK2ZtYXgzNjc3IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAyMzYgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE5CitmbWF4MzY3OCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEwMjQgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxOAorZm1heDM2NzkgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTcKK2ZtYXgzNjgwIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIxMTAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDE2CitmbWF4MzY4MSBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIyMTEgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxNQorZm1heDM2ODIgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjEgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTQKK2ZtYXgzNjgzIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2Ni40MjIgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEzCitmbWF4MzY4NCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOTg0NzExNzQxNjYuNDIgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxMgorZm1heDM2ODUgZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMTEKK2ZtYXgzNjg2IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5ODQ3MTE3NDE2NiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEwCitmbWF4MzY4NyBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMTc0MTdFKzEwICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgOQorZm1heDM2ODggZm1hICAxICAgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDkuODQ3MTE3NDJFKzEwICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDgKK2ZtYXgzNjg5IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzExNzRFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA3CitmbWF4MzY5MCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMTdFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA2CitmbWF4MzY5MSBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDcxMkUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDUKK2ZtYXgzNjkyIGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5Ljg0NzFFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA0CitmbWF4MzY5MyBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NDdFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAzCitmbWF4MzY5NCBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gOS44NUUrMTAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDIKK2ZtYXgzNjk1IGZtYSAgMSAgIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiA5LjhFKzEwICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxCitmbWF4MzY5NiBmbWEgIDEgICA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gMUUrMTEgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl91cAorcHJlY2lzaW9uOiAgIDkKKworZm1heDM3MDEgZm1hICAxICAgNS4wMCAxLjAwRS0zIC0+IDUuMDAxMDAKK2ZtYXgzNzAyIGZtYSAgMSAgIDAwLjAwIDAuMDAwICAtPiAwLjAwMAorZm1heDM3MDMgZm1hICAxICAgMDAuMDAgMEUtMyAgIC0+IDAuMDAwCitmbWF4MzcwNCBmbWEgIDEgICAwRS0zICAwMC4wMCAgLT4gMC4wMDAKKworZm1heDM3MTAgZm1hICAxICAgMEUrMyAgMDAuMDAgIC0+IDAuMDAKK2ZtYXgzNzExIGZtYSAgMSAgIDBFKzMgIDAwLjAgICAtPiAwLjAKK2ZtYXgzNzEyIGZtYSAgMSAgIDBFKzMgIDAwLiAgICAtPiAwCitmbWF4MzcxMyBmbWEgIDEgICAwRSszICAwMC5FKzEgLT4gMEUrMQorZm1heDM3MTQgZm1hICAxICAgMEUrMyAgMDAuRSsyIC0+IDBFKzIKK2ZtYXgzNzE1IGZtYSAgMSAgIDBFKzMgIDAwLkUrMyAtPiAwRSszCitmbWF4MzcxNiBmbWEgIDEgICAwRSszICAwMC5FKzQgLT4gMEUrMworZm1heDM3MTcgZm1hICAxICAgMEUrMyAgMDAuRSs1IC0+IDBFKzMKK2ZtYXgzNzE4IGZtYSAgMSAgIDBFKzMgIC0wMC4wICAgLT4gMC4wCitmbWF4MzcxOSBmbWEgIDEgICAwRSszICAtMDAuICAgIC0+IDAKK2ZtYXgzNzMxIGZtYSAgMSAgIDBFKzMgIC0wMC5FKzEgLT4gMEUrMQorCitmbWF4MzcyMCBmbWEgIDEgICAwMC4wMCAgMEUrMyAgLT4gMC4wMAorZm1heDM3MjEgZm1hICAxICAgMDAuMCAgIDBFKzMgIC0+IDAuMAorZm1heDM3MjIgZm1hICAxICAgMDAuICAgIDBFKzMgIC0+IDAKK2ZtYXgzNzIzIGZtYSAgMSAgIDAwLkUrMSAwRSszICAtPiAwRSsxCitmbWF4MzcyNCBmbWEgIDEgICAwMC5FKzIgMEUrMyAgLT4gMEUrMgorZm1heDM3MjUgZm1hICAxICAgMDAuRSszIDBFKzMgIC0+IDBFKzMKK2ZtYXgzNzI2IGZtYSAgMSAgIDAwLkUrNCAwRSszICAtPiAwRSszCitmbWF4MzcyNyBmbWEgIDEgICAwMC5FKzUgMEUrMyAgLT4gMEUrMworZm1heDM3MjggZm1hICAxICAgLTAwLjAwIDBFKzMgIC0+IDAuMDAKK2ZtYXgzNzI5IGZtYSAgMSAgIC0wMC4wICAwRSszICAtPiAwLjAKK2ZtYXgzNzMwIGZtYSAgMSAgIC0wMC4gICAwRSszICAtPiAwCisKK2ZtYXgzNzMyIGZtYSAgMSAgICAwICAgICAwICAgICAtPiAgMAorZm1heDM3MzMgZm1hICAxICAgIDAgICAgLTAgICAgIC0+ICAwCitmbWF4MzczNCBmbWEgIDEgICAtMCAgICAgMCAgICAgLT4gIDAKK2ZtYXgzNzM1IGZtYSAgMSAgIC0wICAgIC0wICAgICAtPiAtMCAgICAgLS0gSUVFRSA4NTQgc3BlY2lhbCBjYXNlCisKK2ZtYXgzNzM2IGZtYSAgMSAgICAxICAgIC0xICAgICAtPiAgMAorZm1heDM3MzcgZm1hICAxICAgLTEgICAgLTEgICAgIC0+IC0yCitmbWF4MzczOCBmbWEgIDEgICAgMSAgICAgMSAgICAgLT4gIDIKK2ZtYXgzNzM5IGZtYSAgMSAgIC0xICAgICAxICAgICAtPiAgMAorCitmbWF4Mzc0MSBmbWEgIDEgICAgMCAgICAtMSAgICAgLT4gLTEKK2ZtYXgzNzQyIGZtYSAgMSAgIC0wICAgIC0xICAgICAtPiAtMQorZm1heDM3NDMgZm1hICAxICAgIDAgICAgIDEgICAgIC0+ICAxCitmbWF4Mzc0NCBmbWEgIDEgICAtMCAgICAgMSAgICAgLT4gIDEKK2ZtYXgzNzQ1IGZtYSAgMSAgIC0xICAgICAwICAgICAtPiAtMQorZm1heDM3NDYgZm1hICAxICAgLTEgICAgLTAgICAgIC0+IC0xCitmbWF4Mzc0NyBmbWEgIDEgICAgMSAgICAgMCAgICAgLT4gIDEKK2ZtYXgzNzQ4IGZtYSAgMSAgICAxICAgIC0wICAgICAtPiAgMQorCitmbWF4Mzc1MSBmbWEgIDEgICAgMC4wICAtMSAgICAgLT4gLTEuMAorZm1heDM3NTIgZm1hICAxICAgLTAuMCAgLTEgICAgIC0+IC0xLjAKK2ZtYXgzNzUzIGZtYSAgMSAgICAwLjAgICAxICAgICAtPiAgMS4wCitmbWF4Mzc1NCBmbWEgIDEgICAtMC4wICAgMSAgICAgLT4gIDEuMAorZm1heDM3NTUgZm1hICAxICAgLTEuMCAgIDAgICAgIC0+IC0xLjAKK2ZtYXgzNzU2IGZtYSAgMSAgIC0xLjAgIC0wICAgICAtPiAtMS4wCitmbWF4Mzc1NyBmbWEgIDEgICAgMS4wICAgMCAgICAgLT4gIDEuMAorZm1heDM3NTggZm1hICAxICAgIDEuMCAgLTAgICAgIC0+ICAxLjAKKworZm1heDM3NjEgZm1hICAxICAgIDAgICAgLTEuMCAgIC0+IC0xLjAKK2ZtYXgzNzYyIGZtYSAgMSAgIC0wICAgIC0xLjAgICAtPiAtMS4wCitmbWF4Mzc2MyBmbWEgIDEgICAgMCAgICAgMS4wICAgLT4gIDEuMAorZm1heDM3NjQgZm1hICAxICAgLTAgICAgIDEuMCAgIC0+ICAxLjAKK2ZtYXgzNzY1IGZtYSAgMSAgIC0xICAgICAwLjAgICAtPiAtMS4wCitmbWF4Mzc2NiBmbWEgIDEgICAtMSAgICAtMC4wICAgLT4gLTEuMAorZm1heDM3NjcgZm1hICAxICAgIDEgICAgIDAuMCAgIC0+ICAxLjAKK2ZtYXgzNzY4IGZtYSAgMSAgICAxICAgIC0wLjAgICAtPiAgMS4wCisKK2ZtYXgzNzcxIGZtYSAgMSAgICAwLjAgIC0xLjAgICAtPiAtMS4wCitmbWF4Mzc3MiBmbWEgIDEgICAtMC4wICAtMS4wICAgLT4gLTEuMAorZm1heDM3NzMgZm1hICAxICAgIDAuMCAgIDEuMCAgIC0+ICAxLjAKK2ZtYXgzNzc0IGZtYSAgMSAgIC0wLjAgICAxLjAgICAtPiAgMS4wCitmbWF4Mzc3NSBmbWEgIDEgICAtMS4wICAgMC4wICAgLT4gLTEuMAorZm1heDM3NzYgZm1hICAxICAgLTEuMCAgLTAuMCAgIC0+IC0xLjAKK2ZtYXgzNzc3IGZtYSAgMSAgICAxLjAgICAwLjAgICAtPiAgMS4wCitmbWF4Mzc3OCBmbWEgIDEgICAgMS4wICAtMC4wICAgLT4gIDEuMAorCistLSBTcGVjaWFscworZm1heDM3ODAgZm1hICAxICAgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3ODEgZm1hICAxICAgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZm1heDM3ODIgZm1hICAxICAgLUluZiAgLTEgICAgIC0+IC1JbmZpbml0eQorZm1heDM3ODMgZm1hICAxICAgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorZm1heDM3ODQgZm1hICAxICAgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZm1heDM3ODUgZm1hICAxICAgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorZm1heDM3ODYgZm1hICAxICAgLUluZiAgIDEwMDAgIC0+IC1JbmZpbml0eQorZm1heDM3ODcgZm1hICAxICAgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3ODggZm1hICAxICAgLUluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3ODkgZm1hICAxICAgLTEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3OTAgZm1hICAxICAgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3OTEgZm1hICAxICAgIDAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3OTIgZm1hICAxICAgIDEgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3OTMgZm1hICAxICAgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM3OTQgZm1hICAxICAgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKK2ZtYXgzODAwIGZtYSAgMSAgICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4MDEgZm1hICAxICAgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZm1heDM4MDIgZm1hICAxICAgIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorZm1heDM4MDMgZm1hICAxICAgIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorZm1heDM4MDQgZm1hICAxICAgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZm1heDM4MDUgZm1hICAxICAgIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorZm1heDM4MDYgZm1hICAxICAgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorZm1heDM4MDcgZm1hICAxICAgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZm1heDM4MDggZm1hICAxICAgLTEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZm1heDM4MDkgZm1hICAxICAgLUluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzgxMCBmbWEgIDEgICAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzgxMSBmbWEgIDEgICAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzgxMiBmbWEgIDEgICAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzgxMyBmbWEgIDEgICAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzgxNCBmbWEgIDEgICAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzgxNSBmbWEgIDEgICAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK2ZtYXgzODIxIGZtYSAgMSAgICBOYU4gLUluZiAgICAtPiAgTmFOCitmbWF4MzgyMiBmbWEgIDEgICAgTmFOIC0xMDAwICAgLT4gIE5hTgorZm1heDM4MjMgZm1hICAxICAgIE5hTiAtMSAgICAgIC0+ICBOYU4KK2ZtYXgzODI0IGZtYSAgMSAgICBOYU4gLTAgICAgICAtPiAgTmFOCitmbWF4MzgyNSBmbWEgIDEgICAgTmFOICAwICAgICAgLT4gIE5hTgorZm1heDM4MjYgZm1hICAxICAgIE5hTiAgMSAgICAgIC0+ICBOYU4KK2ZtYXgzODI3IGZtYSAgMSAgICBOYU4gIDEwMDAgICAtPiAgTmFOCitmbWF4MzgyOCBmbWEgIDEgICAgTmFOICBJbmYgICAgLT4gIE5hTgorZm1heDM4MjkgZm1hICAxICAgIE5hTiAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzODMwIGZtYSAgMSAgIC1JbmYgIE5hTiAgICAtPiAgTmFOCitmbWF4MzgzMSBmbWEgIDEgICAtMTAwMCBOYU4gICAgLT4gIE5hTgorZm1heDM4MzIgZm1hICAxICAgLTEgICAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzODMzIGZtYSAgMSAgIC0wICAgIE5hTiAgICAtPiAgTmFOCitmbWF4MzgzNCBmbWEgIDEgICAgMCAgICBOYU4gICAgLT4gIE5hTgorZm1heDM4MzUgZm1hICAxICAgIDEgICAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzODM2IGZtYSAgMSAgICAxMDAwIE5hTiAgICAtPiAgTmFOCitmbWF4MzgzNyBmbWEgIDEgICAgSW5mICBOYU4gICAgLT4gIE5hTgorCitmbWF4Mzg0MSBmbWEgIDEgICAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODQyIGZtYSAgMSAgICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NDMgZm1hICAxICAgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg0NCBmbWEgIDEgICAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODQ1IGZtYSAgMSAgICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NDYgZm1hICAxICAgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg0NyBmbWEgIDEgICAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODQ4IGZtYSAgMSAgICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NDkgZm1hICAxICAgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg1MCBmbWEgIDEgICAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODUxIGZtYSAgMSAgIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NTIgZm1hICAxICAgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg1MyBmbWEgIDEgICAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODU0IGZtYSAgMSAgIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NTUgZm1hICAxICAgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg1NiBmbWEgIDEgICAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODU3IGZtYSAgMSAgICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NTggZm1hICAxICAgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg1OSBmbWEgIDEgICAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworZm1heDM4NjEgZm1hICAxICAgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitmbWF4Mzg2MiBmbWEgIDEgICArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK2ZtYXgzODYzIGZtYSAgMSAgICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworZm1heDM4NjQgZm1hICAxICAgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitmbWF4Mzg2NSBmbWEgIDEgICAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK2ZtYXgzODY2IGZtYSAgMSAgIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworZm1heDM4NjcgZm1hICAxICAgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitmbWF4Mzg2OCBmbWEgIDEgICAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK2ZtYXgzODY5IGZtYSAgMSAgICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK2ZtYXgzODcxIGZtYSAgMSAgICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg3MiBmbWEgIDEgICAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NzMgZm1hICAxICAgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODc0IGZtYSAgMSAgICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg3NSBmbWEgIDEgICAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NzYgZm1hICAxICAgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODc3IGZtYSAgMSAgIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg3OCBmbWEgIDEgICAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4NzkgZm1hICAxICAgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODgwIGZtYSAgMSAgICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4Mzg4MSBmbWEgIDEgICArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM4ODIgZm1hICAxICAgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorZm1heDM4ODMgZm1hICAxICAgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzODg0IGZtYSAgMSAgICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK2ZtYXgzODg1IGZtYSAgMSAgICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93LCB1bmRlcmZsb3cgYW5kIHN1Ym5vcm1hbCB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTkKK3ByZWNpc2lvbjogOQorZm1heDM4OTAgZm1hICAxICAgMUUrOTk5OTk5ICAgICA5RSs5OTk5OTkgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzODkxIGZtYSAgMSAgIDlFKzk5OTk5OSAgICAgMUUrOTk5OTk5ICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mzg5MiBmbWEgIDEgICAtMS4xRS05OTk5OTkgIDFFLTk5OTk5OSAgIC0+IC0xRS0xMDAwMDAwICAgIFN1Ym5vcm1hbAorZm1heDM4OTMgZm1hICAxICAgMUUtOTk5OTk5ICAgIC0xLjFlLTk5OTk5OSAtPiAtMUUtMTAwMDAwMCAgICBTdWJub3JtYWwKK2ZtYXgzODk0IGZtYSAgMSAgIC0xLjAwMDFFLTk5OTk5OSAgMUUtOTk5OTk5ICAgLT4gLTFFLTEwMDAwMDMgU3Vibm9ybWFsCitmbWF4Mzg5NSBmbWEgIDEgICAxRS05OTk5OTkgICAgLTEuMDAwMWUtOTk5OTk5IC0+IC0xRS0xMDAwMDAzIFN1Ym5vcm1hbAorZm1heDM4OTYgZm1hICAxICAgLTFFKzk5OTk5OSAgIC05RSs5OTk5OTkgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4Mzg5NyBmbWEgIDEgICAtOUUrOTk5OTk5ICAgLTFFKzk5OTk5OSAgIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzODk4IGZtYSAgMSAgICsxLjFFLTk5OTk5OSAtMUUtOTk5OTk5ICAgLT4gMUUtMTAwMDAwMCAgIFN1Ym5vcm1hbAorZm1heDM4OTkgZm1hICAxICAgLTFFLTk5OTk5OSAgICsxLjFlLTk5OTk5OSAtPiAxRS0xMDAwMDAwICAgIFN1Ym5vcm1hbAorZm1heDM5MDAgZm1hICAxICAgKzEuMDAwMUUtOTk5OTk5IC0xRS05OTk5OTkgICAtPiAxRS0xMDAwMDAzIFN1Ym5vcm1hbAorZm1heDM5MDEgZm1hICAxICAgLTFFLTk5OTk5OSAgICsxLjAwMDFlLTk5OTk5OSAtPiAxRS0xMDAwMDAzIFN1Ym5vcm1hbAorZm1heDM5MDIgZm1hICAxICAgLTFFKzk5OTk5OSAgICs5RSs5OTk5OTkgICAtPiAgOEUrOTk5OTk5CitmbWF4MzkwMyBmbWEgIDEgICAtOUUrOTk5OTk5ICAgKzFFKzk5OTk5OSAgIC0+IC04RSs5OTk5OTkKKworcHJlY2lzaW9uOiAzCitmbWF4MzkwNCBmbWEgIDEgICAgICAgIDAgLTkuOTk5RSs5OTk5OTkgICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitmbWF4MzkwNSBmbWEgIDEgICAgICAgICAgLTkuOTk5RSs5OTk5OTkgMCAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitmbWF4MzkwNiBmbWEgIDEgICAgICAgIDAgIDkuOTk5RSs5OTk5OTkgICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitmbWF4MzkwNyBmbWEgIDEgICAgICAgICAgIDkuOTk5RSs5OTk5OTkgMCAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK2ZtYXgzOTEwIGZtYSAgMSAgICAxLjAwRS05OTkgICAwICAgIC0+ICAgMS4wMEUtOTk5CitmbWF4MzkxMSBmbWEgIDEgICAgMC4xRS05OTkgICAgMCAgICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK2ZtYXgzOTEyIGZtYSAgMSAgICAwLjEwRS05OTkgICAwICAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbAorZm1heDM5MTMgZm1hICAxICAgIDAuMTAwRS05OTkgIDAgICAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgzOTE0IGZtYSAgMSAgICAwLjAxRS05OTkgICAwICAgIC0+ICAgMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIE5taW4KK2ZtYXgzOTE1IGZtYSAgMSAgICAwLjk5OUUtOTk5ICAwICAgIC0+ICAgMS4wMEUtOTk5IEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzkxNiBmbWEgIDEgICAgMC4wOTlFLTk5OSAgMCAgICAtPiAgIDEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5MTcgZm1hICAxICAgIDAuMDA5RS05OTkgIDAgICAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTE4IGZtYSAgMSAgICAwLjAwMUUtOTk5ICAwICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzOTE5IGZtYSAgMSAgICAwLjAwMDlFLTk5OSAwICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzOTIwIGZtYSAgMSAgICAwLjAwMDFFLTk5OSAwICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworZm1heDM5MzAgZm1hICAxICAgLTEuMDBFLTk5OSAgIDAgICAgLT4gIC0xLjAwRS05OTkKK2ZtYXgzOTMxIGZtYSAgMSAgIC0wLjFFLTk5OSAgICAwICAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbAorZm1heDM5MzIgZm1hICAxICAgLTAuMTBFLTk5OSAgIDAgICAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsCitmbWF4MzkzMyBmbWEgIDEgICAtMC4xMDBFLTk5OSAgMCAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorZm1heDM5MzQgZm1hICAxICAgLTAuMDFFLTk5OSAgIDAgICAgLT4gIC0xRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gTm1pbgorZm1heDM5MzUgZm1hICAxICAgLTAuOTk5RS05OTkgIDAgICAgLT4gIC0xLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTM2IGZtYSAgMSAgIC0wLjA5OUUtOTk5ICAwICAgIC0+ICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzkzNyBmbWEgIDEgICAtMC4wMDlFLTk5OSAgMCAgICAtPiAgLTFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5MzggZm1hICAxICAgLTAuMDAxRS05OTkgIDAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM5MzkgZm1hICAxICAgLTAuMDAwOUUtOTk5IDAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM5NDAgZm1hICAxICAgLTAuMDAwMUUtOTk5IDAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBzb21lIG5vbi16ZXJvIHN1Ym5vcm1hbCBmbWEgIDEgIHMKK2ZtYXgzOTUwIGZtYSAgMSAgICAxLjAwRS05OTkgICAgMC4xRS05OTkgIC0+ICAgMS4xMEUtOTk5CitmbWF4Mzk1MSBmbWEgIDEgICAgMC4xRS05OTkgICAgIDAuMUUtOTk5ICAtPiAgIDJFLTEwMDAgICAgU3Vibm9ybWFsCitmbWF4Mzk1MiBmbWEgIDEgICAgMC4xMEUtOTk5ICAgIDAuMUUtOTk5ICAtPiAgIDIuMEUtMTAwMCAgU3Vibm9ybWFsCitmbWF4Mzk1MyBmbWEgIDEgICAgMC4xMDBFLTk5OSAgIDAuMUUtOTk5ICAtPiAgIDIuMEUtMTAwMCAgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgzOTU0IGZtYSAgMSAgICAwLjAxRS05OTkgICAgMC4xRS05OTkgIC0+ICAgMS4xRS0xMDAwICBTdWJub3JtYWwKK2ZtYXgzOTU1IGZtYSAgMSAgICAwLjk5OUUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMS4xMEUtOTk5ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzOTU2IGZtYSAgMSAgICAwLjA5OUUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMi4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5NTcgZm1hICAxICAgIDAuMDA5RS05OTkgICAwLjFFLTk5OSAgLT4gICAxLjFFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mzk1OCBmbWEgIDEgICAgMC4wMDFFLTk5OSAgIDAuMUUtOTk5ICAtPiAgIDEuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTU5IGZtYSAgMSAgICAwLjAwMDlFLTk5OSAgMC4xRS05OTkgIC0+ICAgMS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5NjAgZm1hICAxICAgIDAuMDAwMUUtOTk5ICAwLjFFLTk5OSAgLT4gICAxLjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CistLSBuZWdhdGl2ZXMuLi4KK2ZtYXgzOTYxIGZtYSAgMSAgICAxLjAwRS05OTkgICAtMC4xRS05OTkgIC0+ICAgOS4wRS0xMDAwICBTdWJub3JtYWwKK2ZtYXgzOTYyIGZtYSAgMSAgICAwLjFFLTk5OSAgICAtMC4xRS05OTkgIC0+ICAgMEUtMTAwMAorZm1heDM5NjMgZm1hICAxICAgIDAuMTBFLTk5OSAgIC0wLjFFLTk5OSAgLT4gICAwRS0xMDAxCitmbWF4Mzk2NCBmbWEgIDEgICAgMC4xMDBFLTk5OSAgLTAuMUUtOTk5ICAtPiAgIDBFLTEwMDEgICAgQ2xhbXBlZAorZm1heDM5NjUgZm1hICAxICAgIDAuMDFFLTk5OSAgIC0wLjFFLTk5OSAgLT4gICAtOUUtMTAwMSAgIFN1Ym5vcm1hbAorZm1heDM5NjYgZm1hICAxICAgIDAuOTk5RS05OTkgIC0wLjFFLTk5OSAgLT4gICA5LjBFLTEwMDAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mzk2NyBmbWEgIDEgICAgMC4wOTlFLTk5OSAgLTAuMUUtOTk5ICAtPiAgIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM5NjggZm1hICAxICAgIDAuMDA5RS05OTkgIC0wLjFFLTk5OSAgLT4gICAtOUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4Mzk2OSBmbWEgIDEgICAgMC4wMDFFLTk5OSAgLTAuMUUtOTk5ICAtPiAgIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzOTcwIGZtYSAgMSAgICAwLjAwMDlFLTk5OSAtMC4xRS05OTkgIC0+ICAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDM5NzEgZm1hICAxICAgIDAuMDAwMUUtOTk5IC0wLjFFLTk5OSAgLT4gICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIHNvbWUgJ3JlYWwnIG51bWJlcnMKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitwcmVjaXNpb246IDgKK2ZtYXgzNTY2IGZtYSAgMSAgIDk5OTk5MDYxNzM1RS0zOTQgIDBFLTM5NCAtPiA5Ljk5OTkwNkUtMzg0IEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwcmVjaXNpb246IDcKK2ZtYXgzNTY3IGZtYSAgMSAgIDk5OTk5MDYxNzM1RS0zOTQgIDBFLTM5NCAtPiA5Ljk5OTkxRS0zODQgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3ByZWNpc2lvbjogNgorZm1heDM1NjggZm1hICAxICAgOTk5OTkwNjE3MzVFLTM5NCAgMEUtMzk0IC0+IDkuOTk5OUUtMzg0IEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCisKKy0tIG5vdyB0aGUgY2FzZSB3aGVyZSB3ZSBjYW4gZ2V0IHVuZGVyZmxvdyBidXQgdGhlIHJlc3VsdCBpcyBub3JtYWwKKy0tIFtub3RlIHRoaXMgY2FuJ3QgaGFwcGVuIGlmIHRoZSBvcGVyYW5kcyBhcmUgYWxzbyBib3VuZGVkLCBhcyB3ZQorLS0gY2Fubm90IHJlcHJlc2VudCAxRS0zOTksIGZvciBleGFtcGxlXQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKKworZm1heDM1NzEgZm1hICAxICAgICAgICAgMUUtMzgzICAgICAgIDAgIC0+IDFFLTM4MworZm1heDM1NzIgZm1hICAxICAgICAgICAgMUUtMzg0ICAgICAgIDAgIC0+IDFFLTM4NCAgIFN1Ym5vcm1hbAorZm1heDM1NzMgZm1hICAxICAgICAgICAgMUUtMzgzICAxRS0zODQgIC0+IDEuMUUtMzgzCitmbWF4MzU3NCBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zODQgIC0+ICAgOUUtMzg0IFN1Ym5vcm1hbAorCistLSBIZXJlIHdlIGV4cGxvcmUgdGhlIGJvdW5kYXJ5IG9mIHJvdW5kaW5nIGEgc3Vibm9ybWFsIHRvIE5taW4KK2ZtYXgzNTc1IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OCAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorZm1heDM1NzYgc3VidHJhY3QgIDFFLTM4MyAgMUUtMzk4ICAtPiAgIDkuOTk5OTk5OTk5OTk5OTlFLTM4NCAgU3Vibm9ybWFsCitmbWF4MzU3NyBzdWJ0cmFjdCAgMUUtMzgzICAxRS0zOTkgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDM1Nzggc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAwICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgzNTc5IHN1YnRyYWN0ICAxRS0zODMgIDFFLTQwMSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MzU4MCBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDIgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorCistLSBjaGVjayBmb3IgZG91YmxlLXJvdW5kZWQgc3Vibm9ybWFscworcHJlY2lzaW9uOiAgIDUKK21heGV4cG9uZW50OiA3OQorbWluZXhwb25lbnQ6IC03OQorLS0gQWRkOiBsaHMgYW5kIHJocyAwCitmbWF4MzEwMDEgZm1hICAxICAgICAgICAgMS41MjQ0NEUtODAgMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAwMiBmbWEgIDEgICAgICAgICAxLjUyNDQ1RS04MCAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDAzIGZtYSAgMSAgICAgICAgIDEuNTI0NDZFLTgwIDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMDQgZm1hICAxICAgICAgICAgMCAxLjUyNDQ0RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAwNSBmbWEgIDEgICAgICAgICAwIDEuNTI0NDVFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDA2IGZtYSAgMSAgICAgICAgIDAgMS41MjQ0NkUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIEFkZDogbGhzID4+IHJocyBhbmQgdmljZSB2ZXJzYQorZm1heDMxMDExIGZtYSAgMSAgICAgICAgIDEuNTI0NDRFLTgwIDFFLTEwMCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAxMiBmbWEgIDEgICAgICAgICAxLjUyNDQ1RS04MCAxRS0xMDAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMTMgZm1hICAxICAgICAgICAgMS41MjQ0NkUtODAgMUUtMTAwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDE0IGZtYSAgMSAgICAgICAgIDFFLTEwMCAxLjUyNDQ0RS04MCAtPiAxLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAxNSBmbWEgIDEgICAgICAgICAxRS0xMDAgMS41MjQ0NUUtODAgLT4gMS41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMTYgZm1hICAxICAgICAgICAgMUUtMTAwIDEuNTI0NDZFLTgwIC0+IDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBBZGQ6IGxocyArIHJocyBmbWEgIDEgIGl0aW9uIGNhcnJpZWQgb3V0CitmbWF4MzEwMjEgZm1hICAxICAgICAgICAgMS41MjQ0M0UtODAgMS4wMDAwMUUtODAgIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDIyIGZtYSAgMSAgICAgICAgIDEuNTI0NDRFLTgwIDEuMDAwMDFFLTgwICAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAyMyBmbWEgIDEgICAgICAgICAxLjUyNDQ1RS04MCAxLjAwMDAxRS04MCAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzEwMjQgZm1hICAxICAgICAgICAgMS4wMDAwMUUtODAgIDEuNTI0NDNFLTgwIC0+IDIuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMDI1IGZtYSAgMSAgICAgICAgIDEuMDAwMDFFLTgwICAxLjUyNDQ0RS04MCAtPiAyLjUyNEUtODAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTAyNiBmbWEgIDEgICAgICAgICAxLjAwMDAxRS04MCAgMS41MjQ0NUUtODAgLT4gMi41MjRFLTgwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIEFuZCBmb3Igcm91bmQgZG93biBmdWxsIGFuZCBzdWJub3JtYWwgcmVzdWx0cworcHJlY2lzaW9uOiAgICAxNgorbWF4RXhwb25lbnQ6ICszODQKK21pbkV4cG9uZW50OiAtMzgzCityb3VuZGluZzogICAgIGRvd24KKworZm1heDMxMTAwIGZtYSAgMSAgIDFlKzIgLTFlLTM4MyAgICAtPiA5OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTEwMSBmbWEgIDEgICAxZSsxIC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTAzIGZtYSAgMSAgICAgKzEgLTFlLTM4MyAgICAtPiAwLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTA0IGZtYSAgMSAgIDFlLTEgLTFlLTM4MyAgICAtPiAwLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTEwNSBmbWEgIDEgICAxZS0yIC0xZS0zODMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTA2IGZtYSAgMSAgIDFlLTMgLTFlLTM4MyAgICAtPiAwLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTA3IGZtYSAgMSAgIDFlLTQgLTFlLTM4MyAgICAtPiAwLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTEwOCBmbWEgIDEgICAxZS01IC0xZS0zODMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTA5IGZtYSAgMSAgIDFlLTYgLTFlLTM4MyAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgY2VpbGluZworZm1heDMxMTEwIGZtYSAgMSAgIC0xZSsyICsxZS0zODMgICAtPiAtOTkuOTk5OTk5OTk5OTk5OTkgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTEgZm1hICAxICAgLTFlKzEgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTMgZm1hICAxICAgICAgLTEgKzFlLTM4MyAgIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTE0IGZtYSAgMSAgIC0xZS0xICsxZS0zODMgICAtPiAtMC4wOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTUgZm1hICAxICAgLTFlLTIgKzFlLTM4MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTYgZm1hICAxICAgLTFlLTMgKzFlLTM4MyAgIC0+IC0wLjAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDMxMTE3IGZtYSAgMSAgIC0xZS00ICsxZS0zODMgICAtPiAtMC4wMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTggZm1hICAxICAgLTFlLTUgKzFlLTM4MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMTkgZm1hICAxICAgLTFlLTYgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OUUtNyAgUm91bmRlZCBJbmV4YWN0CisKK3JvdW5kaW5nOiAgICAgZG93bgorcHJlY2lzaW9uOiAgICA3CittYXhFeHBvbmVudDogKzk2CittaW5FeHBvbmVudDogLTk1CitmbWF4MzExMzAgZm1hICAxICAgICAxICAgICAgICAgICAgLTFlLTIwMCAgLT4gMC45OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKKy0tIHN1Ym5vcm1hbCBib3VuZGFyeQorZm1heDMxMTMxIGZtYSAgMSAgICAgMS4wMDAwMDBFLTk0ICAtMWUtMjAwICAtPiAgOS45OTk5OTlFLTk1ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzMTEzMiBmbWEgIDEgICAgIDEuMDAwMDAxRS05NSAgLTFlLTIwMCAgLT4gIDEuMDAwMDAwRS05NSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzExMzMgZm1hICAxICAgICAxLjAwMDAwMEUtOTUgIC0xZS0yMDAgIC0+ICA5Ljk5OTk5RS05NiAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTEzNCBmbWEgIDEgICAgIDAuOTk5OTk5RS05NSAgLTFlLTIwMCAgLT4gIDkuOTk5OThFLTk2ICBSb3VuZGVkIEluZXhhY3QgU3Vibm9ybWFsIFVuZGVyZmxvdworZm1heDMxMTM1IGZtYSAgMSAgICAgMC4wMDEwMDBFLTk1ICAtMWUtMjAwICAtPiAgOS45OUUtOTkgIFJvdW5kZWQgSW5leGFjdCBTdWJub3JtYWwgVW5kZXJmbG93CitmbWF4MzExMzYgZm1hICAxICAgICAwLjAwMDk5OUUtOTUgIC0xZS0yMDAgIC0+ICA5Ljk4RS05OSAgUm91bmRlZCBJbmV4YWN0IFN1Ym5vcm1hbCBVbmRlcmZsb3cKK2ZtYXgzMTEzNyBmbWEgIDEgICAgIDEuMDAwMDAwRS05NSAgLTFlLTEwMSAgLT4gIDkuOTk5OTlFLTk2ICBTdWJub3JtYWwKK2ZtYXgzMTEzOCBmbWEgIDEgICAgICAgIDEwMDAwRS0xMDEgLTFlLTIwMCAgLT4gIDkuOTk5RS05OCAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTEzOSBmbWEgIDEgICAgICAgICAxMDAwRS0xMDEgLTFlLTIwMCAgLT4gIDkuOTlFLTk5ICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTE0MCBmbWEgIDEgICAgICAgICAgMTAwRS0xMDEgLTFlLTIwMCAgLT4gIDkuOUUtMTAwICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTE0MSBmbWEgIDEgICAgICAgICAgIDEwRS0xMDEgLTFlLTIwMCAgLT4gIDlFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTE0MiBmbWEgIDEgICAgICAgICAgICAxRS0xMDEgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxMTQzIGZtYSAgMSAgICAgICAgICAgIDBFLTEwMSAtMWUtMjAwICAtPiAtMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzExNDQgZm1hICAxICAgICAgICAgICAgMUUtMTAyIC0xZS0yMDAgIC0+ICAwRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworZm1heDMxMTUxIGZtYSAgMSAgICAgICAgMTAwMDBFLTEwMiAtMWUtMjAwICAtPiAgOS45OUUtOTkgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzExNTIgZm1hICAxICAgICAgICAgMTAwMEUtMTAyIC0xZS0yMDAgIC0+ICA5LjlFLTEwMCAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTE1MyBmbWEgIDEgICAgICAgICAgMTAwRS0xMDIgLTFlLTIwMCAgLT4gIDlFLTEwMSAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzExNTQgZm1hICAxICAgICAgICAgICAxMEUtMTAyIC0xZS0yMDAgIC0+ICAwRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTE1NSBmbWEgIDEgICAgICAgICAgICAxRS0xMDIgLTFlLTIwMCAgLT4gIDBFLTEwMSAgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxMTU2IGZtYSAgMSAgICAgICAgICAgIDBFLTEwMiAtMWUtMjAwICAtPiAtMEUtMTAxICAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzExNTcgZm1hICAxICAgICAgICAgICAgMUUtMTAzIC0xZS0yMDAgIC0+ICAwRS0xMDEgICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworZm1heDMxMTYwIGZtYSAgMSAgICAgICAgICAxMDBFLTEwNSAtMWUtMTAxICAtPiAtMEUtMTAxIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTE2MSBmbWEgIDEgICAgICAgICAgMTAwRS0xMDUgLTFlLTIwMSAgLT4gIDBFLTEwMSBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIHRlc3RzIGJhc2VkIG9uIEd1bm5hciBEZWduYm9sJ3MgZWRnZSBjYXNlCitwcmVjaXNpb246ICAgMTUKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCitmbWF4MzEyMDAgZm1hICAxICAgMUUxNSAgLTAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDBFKzE1IEluZXhhY3QgUm91bmRlZAorZm1heDMxMjAxIGZtYSAgMSAgIDFFMTUgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwRSsxNSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIxMCBmbWEgIDEgICAxRTE1ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMTEgZm1hICAxICAgMUUxNSAgLTAuNTAxICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjEyIGZtYSAgMSAgIDFFMTUgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIxMyBmbWEgIDEgICAxRTE1ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMTQgZm1hICAxICAgMUUxNSAgLTAuNTAwMDAxICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjE1IGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIxNiBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMTcgZm1hICAxICAgMUUxNSAgLTAuNTAwMDAwMDAxICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjE4IGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIxOSBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMjAgZm1hICAxICAgMUUxNSAgLTAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjIxIGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIyMiBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMjMgZm1hICAxICAgMUUxNSAgLTAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMjI0IGZtYSAgMSAgIDFFMTUgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTIyNSBmbWEgIDEgICAxRTE1ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMEUrMTUgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEyMzAgZm1hICAxICAgMUUxNSAgLTUwMDAwMDAuMDAwMDAwMDAxICAgLT4gIDk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246ICAgMTYKKworZm1heDMxMzAwIGZtYSAgMSAgIDFFMTYgIC0wLjUgICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMTAgZm1hICAxICAgMUUxNiAgLTAuNTEgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMxMSBmbWEgIDEgICAxRTE2ICAtMC41MDEgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzEyIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDEgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMTMgZm1hICAxICAgMUUxNiAgLTAuNTAwMDEgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMxNCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDEgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzE1IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDEgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMTYgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDEgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMxNyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDEgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzE4IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDEgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMTkgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMyMCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDEgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzIxIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDEgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMjIgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMyMyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzI0IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwMDEgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMjUgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMyNiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzI3IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMjggZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMyOSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzMwIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMzEgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMzMiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzMzIGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMzQgZm1hICAxICAgMUUxNiAgLTAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMzNSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzM2IGZtYSAgMSAgIDFFMTYgIC0wLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzEzMzcgZm1hICAxICAgMUUxNiAgLTAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTMzOCBmbWEgIDEgICAxRTE2ICAtMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDMxMzM5IGZtYSAgMSAgIDFFMTYgIC0wLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzMTM0MCBmbWEgIDEgICAxRTE2ICAtNTAwMDAwMC4wMDAwMTAwMDEgICAtPiAgOTk5OTk5OTk5NTAwMDAwMCAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDMxMzQxIGZtYSAgMSAgIDFFMTYgIC01MDAwMDAwLjAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzMTM0OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNCAgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDkgICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5ICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OSAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTkgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5ICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OSAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1NiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTkgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1NyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5ICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1OCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OSAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM1OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTkgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5ICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OSAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTkgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5ICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMCAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2NyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2OCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM2OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMCAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMCAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMCAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3NiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3NyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3OCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMCAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM3OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNSAgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDEgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4NiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAxICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4NyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDEgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4OCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM4OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAxICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM5MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDEgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM5MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMSAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM5MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAxICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM5MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDEgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM5NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMSAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM5NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAxICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzMTM5NiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTEgICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKKworLS0gTW9yZSBHRCBlZGdlIGNhc2VzLCB3aGVyZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHVuYWRqdXN0ZWQKKy0tIGV4cG9uZW50cyBpcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBwcmVjaXNpb24gYW5kIG9uZSBzaWRlIGlzIDAKK3ByZWNpc2lvbjogICAxNQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK2ZtYXgzMTQwMCBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MDEgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMSAgLT4gMC4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQwMiBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0yICAtPiAwLjAxMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQwMyBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MDQgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtNCAgLT4gMC4wMDAxMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQwNSBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS01ICAtPiAwLjAwMDAxMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQwNiBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0MDcgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtNyAgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtNworZm1heDMxNDA4IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTggIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTgKK2ZtYXgzMTQwOSBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS05CitmbWF4MzE0MTAgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTAgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTAKK2ZtYXgzMTQxMSBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xMSAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xMQorZm1heDMxNDEyIGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMjM0NTY3ODkwMTIzNDVFLTEyCitmbWF4MzE0MTMgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTMgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTMKK2ZtYXgzMTQxNCBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xNCAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xNAorZm1heDMxNDE1IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE1CitmbWF4MzE0MTYgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTYgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTYKK2ZtYXgzMTQxNyBmbWEgIDEgICAgMCAxLjIzNDU2Nzg5MDEyMzQ1RS0xNyAtPiAxLjIzNDU2Nzg5MDEyMzQ1RS0xNworZm1heDMxNDE4IGZtYSAgMSAgICAwIDEuMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMjM0NTY3ODkwMTIzNDVFLTE4CitmbWF4MzE0MTkgZm1hICAxICAgIDAgMS4yMzQ1Njc4OTAxMjM0NUUtMTkgLT4gMS4yMzQ1Njc4OTAxMjM0NUUtMTkKKworLS0gc2FtZSwgcHJlY2lzaW9uIDE2Li4KK3ByZWNpc2lvbjogICAxNgorZm1heDMxNDIwIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDIxIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xICAtPiAwLjExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQyMiBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDIzIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAtPiAwLjAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDI0IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS00ICAtPiAwLjAwMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQyNSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDI2IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAtPiAwLjAwMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDI3IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS03ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtNworZm1heDMxNDI4IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorZm1heDMxNDI5IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOQorZm1heDMxNDMwIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTAKK2ZtYXgzMTQzMSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCitmbWF4MzE0MzIgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMgorZm1heDMxNDMzIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMyAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTMKK2ZtYXgzMTQzNCBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CitmbWF4MzE0MzUgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNQorZm1heDMxNDM2IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNiAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTYKK2ZtYXgzMTQzNyBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CitmbWF4MzE0MzggZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOAorZm1heDMxNDM5IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTkKKworLS0gc2FtZSwgcmV2ZXJzZWQgMAorZm1heDMxNDQwIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NDEgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIDAgLT4gMC4xMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NDIgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTIgIDAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDQzIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NDQgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIDAgLT4gMC4wMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NDUgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTUgIDAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDQ2IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NDcgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTcKK2ZtYXgzMTQ0OCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtOCAgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorZm1heDMxNDQ5IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CitmbWF4MzE0NTAgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEwCitmbWF4MzE0NTEgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTExIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCitmbWF4MzE0NTIgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCitmbWF4MzE0NTMgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEzCitmbWF4MzE0NTQgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE0IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CitmbWF4MzE0NTUgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CitmbWF4MzE0NTYgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE2CitmbWF4MzE0NTcgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE3IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CitmbWF4MzE0NTggZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CitmbWF4MzE0NTkgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE5CisKKy0tIHNhbWUsIEVzIG9uIHRoZSAwCitmbWF4MzE0NjAgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTAgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDYxIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ2MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NjMgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTMgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDY0IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS00ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ2NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NjYgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTYgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDY3IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS03ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ2OCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NjkgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTkgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDcwIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ3MSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTEgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NzIgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTEyICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDMxNDczIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzMTQ3NCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTQgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzE0NzUgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE1ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorLS0gbmV4dCBmb3VyIGZsYWcgUm91bmRlZCBiZWNhdXNlIHRoZSAwIGV4dGVuZHMgdGhlIHJlc3VsdAorZm1heDMxNDc2IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZm1heDMxNDc3IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZm1heDMxNDc4IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZm1heDMxNDc5IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorCistLSBzdW0gb2YgdHdvIG9wcG9zaXRlLXNpZ24gb3BlcmFuZHMgaXMgZXhhY3RseSAwIGFuZCBmbG9vciA9PiAtMAorcHJlY2lzaW9uOiAgIDE2CittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCityb3VuZGluZzogICAgaGFsZl91cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDMxNTAwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1MDEgZm1hICAxICAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTUwMiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTAzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzE1MDQgZm1hICAxICAgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTUwNSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTA2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1MDcgZm1hICAxICAgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2ZtYXgzMTUxMSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTEyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1MTMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTUxNCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDMxNTE1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1MTYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTUxNyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTE4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2ZtYXgzMTUyMCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTIxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1MjIgZm1hICAxICAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTUyMyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDMxNTI0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1MjUgZm1hICAxICAgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTUyNiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTI3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzE1MzEgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTUzMiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTMzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1MzQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzMTUzNSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTM2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1MzcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTUzOCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl9ldmVuCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzE1NDAgZm1hICAxICAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTU0MSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTQyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1NDMgZm1hICAxICAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2ZtYXgzMTU0NCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTQ1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1NDYgZm1hICAxICAgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU0NyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDMxNTUxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1NTIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTU1MyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTU0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzE1NTUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTU1NiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTU3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1NTggZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIHVwCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzE1NjAgZm1hICAxICAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTU2MSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTYyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1NjMgZm1hICAxICAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2ZtYXgzMTU2NCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTY1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1NjYgZm1hICAxICAgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU2NyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDMxNTcxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxNTcyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxNTczIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxNTc0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDMxNTc1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDMxNTc2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1NzcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU3OCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworcm91bmRpbmc6ICAgIGRvd24KKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2ZtYXgzMTU4MCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNTgxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE1ODIgZm1hICAxICAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTU4MyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDMxNTg0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1ODUgZm1hICAxICAgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU4NiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNTg3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzE1OTEgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTU5MiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTkzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE1OTQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzMTU5NSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNTk2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE1OTcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTU5OCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgY2VpbGluZworLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDMxNjAwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzE2MDEgZm1hICAxICAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTYwMiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDMxNjAzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzE2MDQgZm1hICAxICAgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTYwNSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNjA2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzE2MDcgZm1hICAxICAgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2ZtYXgzMTYxMSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTYxMiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTYxMyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNjE0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzE2MTUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzE2MTYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzMTYxNyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNjE4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIGFuZCB0aGUgZXh0cmEtc3BlY2lhbCB1Z2x5IGNhc2U7IHVudXN1YWwgbWludXNlcyBtYXJrZWQgYnkgLS0gKgorcm91bmRpbmc6ICAgIGZsb29yCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzE2MjAgZm1hICAxICAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzMTYyMSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZm1heDMxNjIyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5ICAgICAgICAgICAtLSAqCitmbWF4MzE2MjMgZm1hICAxICAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2ZtYXgzMTYyNCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDMxNjI1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCitmbWF4MzE2MjYgZm1hICAxICAgIDBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2ZtYXgzMTYyNyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDMxNjMxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzE2MzIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzMTYzMyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzMTYzNCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzMTYzNSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDMxNjM2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCitmbWF4MzE2MzcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IENsYW1wZWQgIC0tICoKK2ZtYXgzMTYzOCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworLS0gQmlnRGVjaW1hbCBwcm9ibGVtIHRlc3RjYXNlcyAyMDA2LjAxLjIzCitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK3JvdW5kaW5nOiAgZG93bgorcHJlY2lzaW9uOiA3CitmbWF4MzE2NTEgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDA4RSs2CitwcmVjaXNpb246IDYKK2ZtYXgzMTY1MiBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNQorZm1heDMxNjUzIGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwRSs2ICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQKK2ZtYXgzMTY1NCBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwRSs2ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzCitmbWF4MzE2NTUgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwRSs2ICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMgorZm1heDMxNjU2IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wRSs2ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEKK2ZtYXgzMTY1NyBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDFFKzYgICAgICAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogIGhhbGZfZXZlbgorcHJlY2lzaW9uOiA3CitmbWF4MzE2NjEgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDA4RSs2CitwcmVjaXNpb246IDYKK2ZtYXgzMTY2MiBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNQorZm1heDMxNjYzIGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAxRSs2ICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQKK2ZtYXgzMTY2NCBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwRSs2ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzCitmbWF4MzE2NjUgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwRSs2ICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMgorZm1heDMxNjY2IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wRSs2ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEKK2ZtYXgzMTY2NyBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDFFKzYgICAgICAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogIHVwCitwcmVjaXNpb246IDcKK2ZtYXgzMTY3MSBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDAwMDhFKzYKK3ByZWNpc2lvbjogNgorZm1heDMxNjcyIGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDAwOEUrNgorcHJlY2lzaW9uOiA1CitmbWF4MzE2NzMgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjAwMDFFKzYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorZm1heDMxNjc0IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMS4wMDFFKzYgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK2ZtYXgzMTY3NSBmbWEgIDEgICAgMTAwMDFFKzIgIC0yRSsxIC0+IDEuMDFFKzYgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyCitmbWF4MzE2NzYgZm1hICAxICAgIDEwMDAxRSsyICAtMkUrMSAtPiAxLjFFKzYgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorZm1heDMxNjc3IGZtYSAgMSAgICAxMDAwMUUrMiAgLTJFKzEgLT4gMkUrNiAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogICAzNAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKKy0tIEV4YW1wbGVzIGZyb20gU1FMIHByb3Bvc2FsIChLcmlzaG5hIEt1bGthcm5pKQorZm1heDMxNzAxICBmbWEgIDEgICAxMzBFLTIgICAgMTIwRS0yICAgIC0+IDIuNTAKK2ZtYXgzMTcwMiAgZm1hICAxICAgMTMwRS0yICAgIDEyRS0xICAgICAtPiAyLjUwCitmbWF4MzE3MDMgIGZtYSAgMSAgIDEzMEUtMiAgICAxRTAgICAgICAgLT4gMi4zMAorZm1heDMxNzA0ICBmbWEgIDEgICAxRTIgICAgICAgMUU0ICAgICAgIC0+IDEuMDFFKzQKK2ZtYXgzMTcwNSAgc3VidHJhY3QgMTMwRS0yICAxMjBFLTIgLT4gMC4xMAorZm1heDMxNzA2ICBzdWJ0cmFjdCAxMzBFLTIgIDEyRS0xICAtPiAwLjEwCitmbWF4MzE3MDcgIHN1YnRyYWN0IDEzMEUtMiAgMUUwICAgIC0+IDAuMzAKK2ZtYXgzMTcwOCAgc3VidHJhY3QgMUUyICAgICAxRTQgICAgLT4gLTkuOUUrMworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFNhbWUgYXMgYWJvdmUsIHVzaW5nIGRlY2ltYWw2NCBkZWZhdWx0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIFtmaXJzdCBncm91cCBhcmUgJ3F1aWNrIGNvbmZpZGVuY2UgY2hlY2snXQorZm1heDM2MDAxIGZtYSAgMSAgIDEgICAgICAgMSAgICAgICAtPiAgMgorZm1heDM2MDAyIGZtYSAgMSAgIDIgICAgICAgMyAgICAgICAtPiAgNQorZm1heDM2MDAzIGZtYSAgMSAgICc1Ljc1JyAgJzMuMycgICAtPiAgOS4wNQorZm1heDM2MDA0IGZtYSAgMSAgICc1JyAgICAgJy0zJyAgICAtPiAgMgorZm1heDM2MDA1IGZtYSAgMSAgICctNScgICAgJy0zJyAgICAtPiAgLTgKK2ZtYXgzNjAwNiBmbWEgIDEgICAnLTcnICAgICcyLjUnICAgLT4gIC00LjUKK2ZtYXgzNjAwNyBmbWEgIDEgICAnMC43JyAgICcwLjMnICAgLT4gIDEuMAorZm1heDM2MDA4IGZtYSAgMSAgICcxLjI1JyAgJzEuMjUnICAtPiAgMi41MAorZm1heDM2MDA5IGZtYSAgMSAgICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcyLjIzNDU2Nzg5JworZm1heDM2MDEwIGZtYSAgMSAgICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMTEnIC0+ICcyLjIzNDU2ODAwJworCitmbWF4MzYwMTEgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1NScgLT4gJzEuMDAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjAxMiBmbWEgIDEgICAnMC40NDQ0NDQ0NDQ0NDQ0NDQ0MCcgICcwLjU1NTU1NTU1NTU1NTU1NTU1JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDEzIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NTU1NTU1NTAnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OTknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDE0IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0OScgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDE1IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0OTknICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDE2IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ0OTk5JyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDE3IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ1MDAwJyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDE4IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ1MDAxJyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDE5IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ1MDEnICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDIwIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQ1MScgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzYwMjEgZm1hICAxICAgMCAxIC0+IDEKK2ZtYXgzNjAyMiBmbWEgIDEgICAxIDEgLT4gMgorZm1heDM2MDIzIGZtYSAgMSAgIDIgMSAtPiAzCitmbWF4MzYwMjQgZm1hICAxICAgMyAxIC0+IDQKK2ZtYXgzNjAyNSBmbWEgIDEgICA0IDEgLT4gNQorZm1heDM2MDI2IGZtYSAgMSAgIDUgMSAtPiA2CitmbWF4MzYwMjcgZm1hICAxICAgNiAxIC0+IDcKK2ZtYXgzNjAyOCBmbWEgIDEgICA3IDEgLT4gOAorZm1heDM2MDI5IGZtYSAgMSAgIDggMSAtPiA5CitmbWF4MzYwMzAgZm1hICAxICAgOSAxIC0+IDEwCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworZm1heDM2MDMxIGZtYSAgMSAgICcwLjk5OTgnICAnMC4wMDAwJyAtPiAnMC45OTk4JworZm1heDM2MDMyIGZtYSAgMSAgICcwLjk5OTgnICAnMC4wMDAxJyAtPiAnMC45OTk5JworZm1heDM2MDMzIGZtYSAgMSAgICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMS4wMDAwJworZm1heDM2MDM0IGZtYSAgMSAgICcwLjk5OTgnICAnMC4wMDAzJyAtPiAnMS4wMDAxJworCitmbWF4MzYwMzUgZm1hICAxICAgJzcwJyAgICAgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDM2IGZtYSAgMSAgICc3MDAnICAgICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjAzNyBmbWEgIDEgICAnNzAwMCcgICAgJzEwMDAwZSsxNicgLT4gJzEuMDAwMDAwMDAwMDAwMDAwRSsyMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYwMzggZm1hICAxICAgJzcwMDAwJyAgICcxMDAwMGUrMTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMUUrMjAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDM5IGZtYSAgMSAgICc3MDAwMDAnICAnMTAwMDBlKzE2JyAtPiAnMS4wMDAwMDAwMDAwMDAwMDdFKzIwJyBSb3VuZGVkCisKKy0tIHN5bW1ldHJ5OgorZm1heDM2MDQwIGZtYSAgMSAgICcxMDAwMGUrMTYnICAnNzAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDQxIGZtYSAgMSAgICcxMDAwMGUrMTYnICAnNzAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDBFKzIwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjA0MiBmbWEgIDEgICAnMTAwMDBlKzE2JyAgJzcwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMEUrMjAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDQ0IGZtYSAgMSAgICcxMDAwMGUrMTYnICAnNzAwMDAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMUUrMjAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MDQ1IGZtYSAgMSAgICcxMDAwMGUrMTYnICAnNzAwMDAwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMDdFKzIwJyBSb3VuZGVkCisKK2ZtYXgzNjA0NiBmbWEgIDEgICAnMTAwMDBlKzknICAnNycgLT4gJzEwMDAwMDAwMDAwMDA3JworZm1heDM2MDQ3IGZtYSAgMSAgICcxMDAwMGUrOScgICc3MCcgLT4gJzEwMDAwMDAwMDAwMDcwJworZm1heDM2MDQ4IGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAnIC0+ICcxMDAwMDAwMDAwMDcwMCcKK2ZtYXgzNjA0OSBmbWEgIDEgICAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzEwMDAwMDAwMDA3MDAwJworZm1heDM2MDUwIGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEwMDAwMDAwMDcwMDAwJworZm1heDM2MDUxIGZtYSAgMSAgICcxMDAwMGUrOScgICc3MDAwMDAnIC0+ICcxMDAwMDAwMDcwMDAwMCcKKworLS0gZXhhbXBsZXMgZnJvbSBkZWNhcml0aAorZm1heDM2MDUzIGZtYSAgMSAgICcxMicgJzcuMDAnIC0+ICcxOS4wMCcKK2ZtYXgzNjA1NCBmbWEgIDEgICAnMS4zJyAnLTEuMDcnIC0+ICcwLjIzJworZm1heDM2MDU1IGZtYSAgMSAgICcxLjMnICctMS4zMCcgLT4gJzAuMDAnCitmbWF4MzYwNTYgZm1hICAxICAgJzEuMycgJy0yLjA3JyAtPiAnLTAuNzcnCitmbWF4MzYwNTcgZm1hICAxICAgJzFFKzInICcxRSs0JyAtPiAnMS4wMUUrNCcKKworLS0gZnJvbSBhYm92ZQorZm1heDM2MDYxIGZtYSAgMSAgIDEgJzAuMScgLT4gJzEuMScKK2ZtYXgzNjA2MiBmbWEgIDEgICAxICcwLjAxJyAtPiAnMS4wMScKK2ZtYXgzNjA2MyBmbWEgIDEgICAxICcwLjAwMScgLT4gJzEuMDAxJworZm1heDM2MDY0IGZtYSAgMSAgIDEgJzAuMDAwMScgLT4gJzEuMDAwMScKK2ZtYXgzNjA2NSBmbWEgIDEgICAxICcwLjAwMDAxJyAtPiAnMS4wMDAwMScKK2ZtYXgzNjA2NiBmbWEgIDEgICAxICcwLjAwMDAwMScgLT4gJzEuMDAwMDAxJworZm1heDM2MDY3IGZtYSAgMSAgIDEgJzAuMDAwMDAwMScgLT4gJzEuMDAwMDAwMScKK2ZtYXgzNjA2OCBmbWEgIDEgICAxICcwLjAwMDAwMDAxJyAtPiAnMS4wMDAwMDAwMScKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorZm1heDM2MDcwIGZtYSAgMSAgIDEgIDAgICAgLT4gMQorZm1heDM2MDcxIGZtYSAgMSAgIDEgMC4gICAgLT4gMQorZm1heDM2MDcyIGZtYSAgMSAgIDEgIC4wICAgLT4gMS4wCitmbWF4MzYwNzMgZm1hICAxICAgMSAwLjAgICAtPiAxLjAKK2ZtYXgzNjA3NCBmbWEgIDEgICAxIDAuMDAgIC0+IDEuMDAKK2ZtYXgzNjA3NSBmbWEgIDEgICAgMCAgMSAgIC0+IDEKK2ZtYXgzNjA3NiBmbWEgIDEgICAwLiAgMSAgIC0+IDEKK2ZtYXgzNjA3NyBmbWEgIDEgICAgLjAgMSAgIC0+IDEuMAorZm1heDM2MDc4IGZtYSAgMSAgIDAuMCAxICAgLT4gMS4wCitmbWF4MzYwNzkgZm1hICAxICAgMC4wMCAxICAtPiAxLjAwCisKKy0tIHNvbWUgY2FycmllcworZm1heDM2MDgwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTggMSAgLT4gOTk5OTk5OTk5OTk5OTk5OQorZm1heDM2MDgxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMSAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE2IFJvdW5kZWQKK2ZtYXgzNjA4MiBmbWEgIDEgICAgOTk5OTk5OTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAwMDAwMDAKK2ZtYXgzNjA4MyBmbWEgIDEgICAgICA5OTk5OTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAwMDAwCitmbWF4MzYwODQgZm1hICAxICAgICAgICA5OTk5OTk5OTk5OSAxICAtPiAxMDAwMDAwMDAwMDAKK2ZtYXgzNjA4NSBmbWEgIDEgICAgICAgICAgOTk5OTk5OTk5IDEgIC0+IDEwMDAwMDAwMDAKK2ZtYXgzNjA4NiBmbWEgIDEgICAgICAgICAgICA5OTk5OTk5IDEgIC0+IDEwMDAwMDAwCitmbWF4MzYwODcgZm1hICAxICAgICAgICAgICAgICA5OTk5OSAxICAtPiAxMDAwMDAKK2ZtYXgzNjA4OCBmbWEgIDEgICAgICAgICAgICAgICAgOTk5IDEgIC0+IDEwMDAKK2ZtYXgzNjA4OSBmbWEgIDEgICAgICAgICAgICAgICAgICA5IDEgIC0+IDEwCisKKworLS0gbW9yZSBMSFMgc3dhcHMKK2ZtYXgzNjA5MCBmbWEgIDEgICAnLTU2MjY3RS0xMCcgICAwIC0+ICAnLTAuMDAwMDA1NjI2NycKK2ZtYXgzNjA5MSBmbWEgIDEgICAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3JworZm1heDM2MDkyIGZtYSAgMSAgICctNTYyNjdFLTUnICAgIDAgLT4gICctMC41NjI2NycKK2ZtYXgzNjA5MyBmbWEgIDEgICAnLTU2MjY3RS00JyAgICAwIC0+ICAnLTUuNjI2NycKK2ZtYXgzNjA5NCBmbWEgIDEgICAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK2ZtYXgzNjA5NSBmbWEgIDEgICAnLTU2MjY3RS0yJyAgICAwIC0+ICAnLTU2Mi42NycKK2ZtYXgzNjA5NiBmbWEgIDEgICAnLTU2MjY3RS0xJyAgICAwIC0+ICAnLTU2MjYuNycKK2ZtYXgzNjA5NyBmbWEgIDEgICAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3JworZm1heDM2MDk4IGZtYSAgMSAgICctNUUtMTAnICAgICAgIDAgLT4gICctNUUtMTAnCitmbWF4MzYwOTkgZm1hICAxICAgJy01RS03JyAgICAgICAgMCAtPiAgJy01RS03JworZm1heDM2MTAwIGZtYSAgMSAgICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCitmbWF4MzYxMDEgZm1hICAxICAgJy01RS01JyAgICAgICAgMCAtPiAgJy0wLjAwMDA1JworZm1heDM2MTAyIGZtYSAgMSAgICctNUUtNCcgICAgICAgIDAgLT4gICctMC4wMDA1JworZm1heDM2MTAzIGZtYSAgMSAgICctNUUtMScgICAgICAgIDAgLT4gICctMC41JworZm1heDM2MTA0IGZtYSAgMSAgICctNUUwJyAgICAgICAgIDAgLT4gICctNScKK2ZtYXgzNjEwNSBmbWEgIDEgICAnLTVFMScgICAgICAgICAwIC0+ICAnLTUwJworZm1heDM2MTA2IGZtYSAgMSAgICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworZm1heDM2MTA3IGZtYSAgMSAgICctNUUxNScgICAgICAgIDAgLT4gICctNTAwMDAwMDAwMDAwMDAwMCcKK2ZtYXgzNjEwOCBmbWEgIDEgICAnLTVFMTYnICAgICAgICAwIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNicgICBSb3VuZGVkCitmbWF4MzYxMDkgZm1hICAxICAgJy01RTE3JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTcnICBSb3VuZGVkCitmbWF4MzYxMTAgZm1hICAxICAgJy01RTE4JyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTgnICBSb3VuZGVkCitmbWF4MzYxMTEgZm1hICAxICAgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwMDAwMDAwMEUrMTAwJyBSb3VuZGVkCisKKy0tIG1vcmUgUkhTIHN3YXBzCitmbWF4MzYxMTMgZm1hICAxICAgMCAgJy01NjI2N0UtMTAnIC0+ICAnLTAuMDAwMDA1NjI2NycKK2ZtYXgzNjExNCBmbWEgIDEgICAwICAnLTU2MjY3RS02JyAgLT4gICctMC4wNTYyNjcnCitmbWF4MzYxMTYgZm1hICAxICAgMCAgJy01NjI2N0UtNScgIC0+ICAnLTAuNTYyNjcnCitmbWF4MzYxMTcgZm1hICAxICAgMCAgJy01NjI2N0UtNCcgIC0+ICAnLTUuNjI2NycKK2ZtYXgzNjExOSBmbWEgIDEgICAwICAnLTU2MjY3RS0zJyAgLT4gICctNTYuMjY3JworZm1heDM2MTIwIGZtYSAgMSAgIDAgICctNTYyNjdFLTInICAtPiAgJy01NjIuNjcnCitmbWF4MzYxMjEgZm1hICAxICAgMCAgJy01NjI2N0UtMScgIC0+ICAnLTU2MjYuNycKK2ZtYXgzNjEyMiBmbWEgIDEgICAwICAnLTU2MjY3RS0wJyAgLT4gICctNTYyNjcnCitmbWF4MzYxMjMgZm1hICAxICAgMCAgJy01RS0xMCcgICAgIC0+ICAnLTVFLTEwJworZm1heDM2MTI0IGZtYSAgMSAgIDAgICctNUUtNycgICAgICAtPiAgJy01RS03JworZm1heDM2MTI1IGZtYSAgMSAgIDAgICctNUUtNicgICAgICAtPiAgJy0wLjAwMDAwNScKK2ZtYXgzNjEyNiBmbWEgIDEgICAwICAnLTVFLTUnICAgICAgLT4gICctMC4wMDAwNScKK2ZtYXgzNjEyNyBmbWEgIDEgICAwICAnLTVFLTQnICAgICAgLT4gICctMC4wMDA1JworZm1heDM2MTI4IGZtYSAgMSAgIDAgICctNUUtMScgICAgICAtPiAgJy0wLjUnCitmbWF4MzYxMjkgZm1hICAxICAgMCAgJy01RTAnICAgICAgIC0+ICAnLTUnCitmbWF4MzYxMzAgZm1hICAxICAgMCAgJy01RTEnICAgICAgIC0+ICAnLTUwJworZm1heDM2MTMxIGZtYSAgMSAgIDAgICctNUU1JyAgICAgICAtPiAgJy01MDAwMDAnCitmbWF4MzYxMzIgZm1hICAxICAgMCAgJy01RTE1JyAgICAgIC0+ICAnLTUwMDAwMDAwMDAwMDAwMDAnCitmbWF4MzYxMzMgZm1hICAxICAgMCAgJy01RTE2JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNicgICBSb3VuZGVkCitmbWF4MzYxMzQgZm1hICAxICAgMCAgJy01RTE3JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxNycgICBSb3VuZGVkCitmbWF4MzYxMzUgZm1hICAxICAgMCAgJy01RTE4JyAgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxOCcgICBSb3VuZGVkCitmbWF4MzYxMzYgZm1hICAxICAgMCAgJy01RTEwMCcgICAgIC0+ICAnLTUuMDAwMDAwMDAwMDAwMDAwRSsxMDAnICBSb3VuZGVkCisKKy0tIHJlbGF0ZWQKK2ZtYXgzNjEzNyBmbWEgIDEgICAgMSAgJzBFLTE5JyAgICAgIC0+ICAnMS4wMDAwMDAwMDAwMDAwMDAnICBSb3VuZGVkCitmbWF4MzYxMzggZm1hICAxICAgLTEgICcwRS0xOScgICAgICAtPiAgJy0xLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZm1heDM2MTM5IGZtYSAgMSAgICcwRS0xOScgMSAgICAgICAgLT4gICcxLjAwMDAwMDAwMDAwMDAwMCcgIFJvdW5kZWQKK2ZtYXgzNjE0MCBmbWEgIDEgICAnMEUtMTknIC0xICAgICAgIC0+ICAnLTEuMDAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitmbWF4MzYxNDEgZm1hICAxICAgMUUrMTEgICAwLjAwMDAgICAtPiAgJzEwMDAwMDAwMDAwMC4wMDAwJworZm1heDM2MTQyIGZtYSAgMSAgIDFFKzExICAgMC4wMDAwMCAgLT4gICcxMDAwMDAwMDAwMDAuMDAwMCcgIFJvdW5kZWQKK2ZtYXgzNjE0MyBmbWEgIDEgICAwLjAwMCAgIDFFKzEyICAgIC0+ICAnMTAwMDAwMDAwMDAwMC4wMDAnCitmbWF4MzYxNDQgZm1hICAxICAgMC4wMDAwICAxRSsxMiAgICAtPiAgJzEwMDAwMDAwMDAwMDAuMDAwJyAgUm91bmRlZAorCistLSBbc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzXQorZm1heDM2MTQ2IGZtYSAgMSAgICcwMC4wJyAgMCAgICAgICAtPiAgJzAuMCcKK2ZtYXgzNjE0NyBmbWEgIDEgICAnMC4wMCcgIDAgICAgICAgLT4gICcwLjAwJworZm1heDM2MTQ4IGZtYSAgMSAgICAwICAgICAgJzAuMDAnICAtPiAgJzAuMDAnCitmbWF4MzYxNDkgZm1hICAxICAgIDAgICAgICAnMDAuMCcgIC0+ICAnMC4wJworZm1heDM2MTUwIGZtYSAgMSAgICcwMC4wJyAgJzAuMDAnICAtPiAgJzAuMDAnCitmbWF4MzYxNTEgZm1hICAxICAgJzAuMDAnICAnMDAuMCcgIC0+ICAnMC4wMCcKK2ZtYXgzNjE1MiBmbWEgIDEgICAnMycgICAgICcuMycgICAgLT4gICczLjMnCitmbWF4MzYxNTMgZm1hICAxICAgJzMuJyAgICAnLjMnICAgIC0+ICAnMy4zJworZm1heDM2MTU0IGZtYSAgMSAgICczLjAnICAgJy4zJyAgICAtPiAgJzMuMycKK2ZtYXgzNjE1NSBmbWEgIDEgICAnMy4wMCcgICcuMycgICAgLT4gICczLjMwJworZm1heDM2MTU2IGZtYSAgMSAgICczJyAgICAgJzMnICAgICAtPiAgJzYnCitmbWF4MzYxNTcgZm1hICAxICAgJzMnICAgICAnKzMnICAgIC0+ICAnNicKK2ZtYXgzNjE1OCBmbWEgIDEgICAnMycgICAgICctMycgICAgLT4gICcwJworZm1heDM2MTU5IGZtYSAgMSAgICcwLjMnICAgJy0wLjMnICAtPiAgJzAuMCcKK2ZtYXgzNjE2MCBmbWEgIDEgICAnMC4wMycgICctMC4wMycgLT4gICcwLjAwJworCistLSB0cnkgYm9yZGVybGluZSBwcmVjaXNpb24sIHdpdGggY2FycmllcywgZXRjLgorZm1heDM2MTYxIGZtYSAgMSAgICcxRSsxMycgJy0xJyAgICAtPiAnOTk5OTk5OTk5OTk5OScKK2ZtYXgzNjE2MiBmbWEgIDEgICAnMUUrMTMnICAnMS4xMScgLT4gJzEwMDAwMDAwMDAwMDAxLjExJworZm1heDM2MTYzIGZtYSAgMSAgICcxLjExJyAgJzFFKzEzJyAtPiAnMTAwMDAwMDAwMDAwMDEuMTEnCitmbWF4MzYxNjQgZm1hICAxICAgJy0xJyAgICAnMUUrMTMnIC0+ICc5OTk5OTk5OTk5OTk5JworZm1heDM2MTY1IGZtYSAgMSAgICc3RSsxMycgJy0xJyAgICAtPiAnNjk5OTk5OTk5OTk5OTknCitmbWF4MzYxNjYgZm1hICAxICAgJzdFKzEzJyAgJzEuMTEnIC0+ICc3MDAwMDAwMDAwMDAwMS4xMScKK2ZtYXgzNjE2NyBmbWEgIDEgICAnMS4xMScgICc3RSsxMycgLT4gJzcwMDAwMDAwMDAwMDAxLjExJworZm1heDM2MTY4IGZtYSAgMSAgICctMScgICAgJzdFKzEzJyAtPiAnNjk5OTk5OTk5OTk5OTknCisKKy0tICAgICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2ICAgICAgMTIzNDU2Nzg5MDEyMzQ1NiAgICAgIDEgMjM0NTY3ODkwMTIzNDU2CitmbWF4MzYxNzAgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjMnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxNzEgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjInIC0+ICcxLjAwMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxNzIgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjEnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxNzMgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NjAnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxNzQgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTknIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxNzUgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTgnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxNzYgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTcnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxNzcgZm1hICAxICAgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTU1NTU1NTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwMCcgUm91bmRlZAorZm1heDM2MTc4IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU1JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk5JworZm1heDM2MTc5IGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTU0JyAtPiAnMC45OTk5OTk5OTk5OTk5OTk4JworZm1heDM2MTgwIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUzJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk3JworZm1heDM2MTgxIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUyJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk2JworZm1heDM2MTgyIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUxJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk1JworZm1heDM2MTgzIGZtYSAgMSAgICcwLjQ0NDQ0NDQ0NDQ0NDQ0NDQnICAnMC41NTU1NTU1NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTk5OTk5OTk0JworCistLSBhbmQgc29tZSBtb3JlLCBpbmNsdWRpbmcgcmVzaWR1ZSBlZmZlY3RzIGFuZCBkaWZmZXJlbnQgcm91bmRpbmdzCityb3VuZGluZzogaGFsZl91cAorZm1heDM2MjAwIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JworZm1heDM2MjAxIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDMgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA0IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDYgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA3IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwOCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDkgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjEwIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIxMSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMTIgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjEzIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIxNCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMTUgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjE2IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJworZm1heDM2MjE3IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIxOCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMTkgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCitmbWF4MzYyMjAgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknCitmbWF4MzYyMjEgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjIyIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIyMyBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMjQgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjI1IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIyNiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OTk5OTkgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMjcgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjI4IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIyOSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MDAwMDAwMDEgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMzAgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjMxIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIzMiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC42ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMzMgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjM0IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIzNSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OTkgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMzYgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnCitmbWF4MzYyMzcgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjM4IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAxICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIzOSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorZm1heDM2MjQwIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg4JyAwLjQ5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI0MSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OCcgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNDIgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODgnIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorZm1heDM2MjUwIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JworZm1heDM2MjUxIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI1MiBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC4wMDAwMDEgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNTMgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjU0IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI1NSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC40OSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNTYgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjU3IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI1OCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41ICAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNTkgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjYwIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI2MSBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC41MSAgICAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNjIgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjYzIGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI2NCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMC45OTk5OSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNjUgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDAuOTk5OTk5ICAgLT4gJzY1NDMyMTAxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjY2IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJworZm1heDM2MjY3IGZtYSAgMSAgICc2NTQzMjEwMTIzNDU2Nzg5JyAxLjAwMDAwMDAxICAgIC0+ICc2NTQzMjEwMTIzNDU2NzkwJyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjI2OCBmbWEgIDEgICAnNjU0MzIxMDEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnNjU0MzIxMDEyMzQ1Njc5MCcgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyNjkgZm1hICAxICAgJzY1NDMyMTAxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzY1NDMyMTAxMjM0NTY3OTAnIEluZXhhY3QgUm91bmRlZAorCistLSAxIGluIGxhc3QgcGxhY2UgdGVzdHMKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzNjMwMSBmbWEgIDEgICAgLTEgICAxICAgICAgLT4gICAwCitmbWF4MzYzMDIgZm1hICAxICAgICAwICAgMSAgICAgIC0+ICAgMQorZm1heDM2MzAzIGZtYSAgMSAgICAgMSAgIDEgICAgICAtPiAgIDIKK2ZtYXgzNjMwNCBmbWEgIDEgICAgMTIgICAxICAgICAgLT4gIDEzCitmbWF4MzYzMDUgZm1hICAxICAgIDk4ICAgMSAgICAgIC0+ICA5OQorZm1heDM2MzA2IGZtYSAgMSAgICA5OSAgIDEgICAgICAtPiAxMDAKK2ZtYXgzNjMwNyBmbWEgIDEgICAxMDAgICAxICAgICAgLT4gMTAxCitmbWF4MzYzMDggZm1hICAxICAgMTAxICAgMSAgICAgIC0+IDEwMgorZm1heDM2MzA5IGZtYSAgMSAgICAtMSAgLTEgICAgICAtPiAgLTIKK2ZtYXgzNjMxMCBmbWEgIDEgICAgIDAgIC0xICAgICAgLT4gIC0xCitmbWF4MzYzMTEgZm1hICAxICAgICAxICAtMSAgICAgIC0+ICAgMAorZm1heDM2MzEyIGZtYSAgMSAgICAxMiAgLTEgICAgICAtPiAgMTEKK2ZtYXgzNjMxMyBmbWEgIDEgICAgOTggIC0xICAgICAgLT4gIDk3CitmbWF4MzYzMTQgZm1hICAxICAgIDk5ICAtMSAgICAgIC0+ICA5OAorZm1heDM2MzE1IGZtYSAgMSAgIDEwMCAgLTEgICAgICAtPiAgOTkKK2ZtYXgzNjMxNiBmbWEgIDEgICAxMDEgIC0xICAgICAgLT4gMTAwCisKK2ZtYXgzNjMyMSBmbWEgIDEgICAtMC4wMSAgMC4wMSAgICAtPiAgMC4wMAorZm1heDM2MzIyIGZtYSAgMSAgICAwLjAwICAwLjAxICAgIC0+ICAwLjAxCitmbWF4MzYzMjMgZm1hICAxICAgIDAuMDEgIDAuMDEgICAgLT4gIDAuMDIKK2ZtYXgzNjMyNCBmbWEgIDEgICAgMC4xMiAgMC4wMSAgICAtPiAgMC4xMworZm1heDM2MzI1IGZtYSAgMSAgICAwLjk4ICAwLjAxICAgIC0+ICAwLjk5CitmbWF4MzYzMjYgZm1hICAxICAgIDAuOTkgIDAuMDEgICAgLT4gIDEuMDAKK2ZtYXgzNjMyNyBmbWEgIDEgICAgMS4wMCAgMC4wMSAgICAtPiAgMS4wMQorZm1heDM2MzI4IGZtYSAgMSAgICAxLjAxICAwLjAxICAgIC0+ICAxLjAyCitmbWF4MzYzMjkgZm1hICAxICAgLTAuMDEgLTAuMDEgICAgLT4gLTAuMDIKK2ZtYXgzNjMzMCBmbWEgIDEgICAgMC4wMCAtMC4wMSAgICAtPiAtMC4wMQorZm1heDM2MzMxIGZtYSAgMSAgICAwLjAxIC0wLjAxICAgIC0+ICAwLjAwCitmbWF4MzYzMzIgZm1hICAxICAgIDAuMTIgLTAuMDEgICAgLT4gIDAuMTEKK2ZtYXgzNjMzMyBmbWEgIDEgICAgMC45OCAtMC4wMSAgICAtPiAgMC45NworZm1heDM2MzM0IGZtYSAgMSAgICAwLjk5IC0wLjAxICAgIC0+ICAwLjk4CitmbWF4MzYzMzUgZm1hICAxICAgIDEuMDAgLTAuMDEgICAgLT4gIDAuOTkKK2ZtYXgzNjMzNiBmbWEgIDEgICAgMS4wMSAtMC4wMSAgICAtPiAgMS4wMAorCistLSBzb21lIG1vcmUgY2FzZXMgd2hlcmUgZm1hICAxICBpbmcgMCBhZmZlY3RzIHRoZSBjb2VmZmljaWVudAorZm1heDM2MzQwIGZtYSAgMSAgIDFFKzMgICAgMCAgICAtPiAgICAgICAgIDEwMDAKK2ZtYXgzNjM0MSBmbWEgIDEgICAxRSsxNSAgIDAgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMAorZm1heDM2MzQyIGZtYSAgMSAgIDFFKzE2ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgUm91bmRlZAorZm1heDM2MzQzIGZtYSAgMSAgIDFFKzE3ICAgMCAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgUm91bmRlZAorLS0gd2hpY2ggc2ltcGx5IGZvbGxvdyBmcm9tIHRoZXNlIGNhc2VzIC4uLgorZm1heDM2MzQ0IGZtYSAgMSAgIDFFKzMgICAgMSAgICAtPiAgICAgICAgIDEwMDEKK2ZtYXgzNjM0NSBmbWEgIDEgICAxRSsxNSAgIDEgICAgLT4gICAgMTAwMDAwMDAwMDAwMDAwMQorZm1heDM2MzQ2IGZtYSAgMSAgIDFFKzE2ICAgMSAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYzNDcgZm1hICAxICAgMUUrMTcgICAxICAgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFKzE3ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjM0OCBmbWEgIDEgICAxRSszICAgIDcgICAgLT4gICAgICAgICAxMDA3CitmbWF4MzYzNDkgZm1hICAxICAgMUUrMTUgICA3ICAgIC0+ICAgIDEwMDAwMDAwMDAwMDAwMDcKK2ZtYXgzNjM1MCBmbWEgIDEgICAxRSsxNiAgIDcgICAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMUUrMTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MzUxIGZtYSAgMSAgIDFFKzE3ICAgNyAgICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRSsxNyAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRyeXplcm9zIGNhc2VzCitmbWF4MzYzNjEgIGZtYSAgMSAgIDBFKzUwIDEwMDAwRSsxICAtPiAxLjAwMDBFKzUKK2ZtYXgzNjM2MiAgZm1hICAxICAgMTAwMDBFKzEgMEUtNTAgIC0+IDEwMDAwMC4wMDAwMDAwMDAwICBSb3VuZGVkCitmbWF4MzYzNjMgIGZtYSAgMSAgIDEwMDAwRSsxIDEwMDAwRS01MCAgLT4gMTAwMDAwLjAwMDAwMDAwMDAgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MzY0ICBmbWEgIDEgICAxMi4zNCAgICAwZS0zOTggIC0+IDEyLjM0MDAwMDAwMDAwMDAwICBSb3VuZGVkCisKKy0tIHVscCByZXBsYWNlbWVudCB0ZXN0cworZm1heDM2NDAwIGZtYSAgMSAgICAgMSAgIDc3ZS0xNCAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDc3CitmbWF4MzY0MDEgZm1hICAxICAgICAxICAgNzdlLTE1ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDc3CitmbWF4MzY0MDIgZm1hICAxICAgICAxICAgNzdlLTE2ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDAzIGZtYSAgMSAgICAgMSAgIDc3ZS0xNyAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQwNCBmbWEgIDEgICAgIDEgICA3N2UtMTggICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MDUgZm1hICAxICAgICAxICAgNzdlLTE5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDA2IGZtYSAgMSAgICAgMSAgIDc3ZS05OSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2NDEwIGZtYSAgMSAgICAxMCAgIDc3ZS0xNCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDA3NworZm1heDM2NDExIGZtYSAgMSAgICAxMCAgIDc3ZS0xNSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQxMiBmbWEgIDEgICAgMTAgICA3N2UtMTYgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MTMgZm1hICAxICAgIDEwICAgNzdlLTE3ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDE0IGZtYSAgMSAgICAxMCAgIDc3ZS0xOCAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQxNSBmbWEgIDEgICAgMTAgICA3N2UtMTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MTYgZm1hICAxICAgIDEwICAgNzdlLTk5ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY0MjAgZm1hICAxICAgIDc3ZS0xNCAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwNzcKK2ZtYXgzNjQyMSBmbWEgIDEgICAgNzdlLTE1ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwNzcKK2ZtYXgzNjQyMiBmbWEgIDEgICAgNzdlLTE2ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MjMgZm1hICAxICAgIDc3ZS0xNyAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDI0IGZtYSAgMSAgICA3N2UtMTggICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQyNSBmbWEgIDEgICAgNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MjYgZm1hICAxICAgIDc3ZS05OSAgICAgICAxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY0MzAgZm1hICAxICAgIDc3ZS0xNCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDc3CitmbWF4MzY0MzEgZm1hICAxICAgIDc3ZS0xNSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDA4IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDMyIGZtYSAgMSAgICA3N2UtMTYgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQzMyBmbWEgIDEgICAgNzdlLTE3ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0MzQgZm1hICAxICAgIDc3ZS0xOCAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDM1IGZtYSAgMSAgICA3N2UtMTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQzNiBmbWEgIDEgICAgNzdlLTk5ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHVscHMKK2ZtYXgzNjQ0MCBmbWEgIDEgICAgIDEgICAtNzdlLTE0ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ0MSBmbWEgIDEgICAgIDEgICAtNzdlLTE1ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTIzCitmbWF4MzY0NDIgZm1hICAxICAgICAxICAgLTc3ZS0xNiAgICAgIC0+ICAwLjk5OTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ0MyBmbWEgIDEgICAgIDEgICAtNzdlLTE3ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ0NCBmbWEgIDEgICAgIDEgICAtNzdlLTE4ICAgICAgLT4gIDAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ0NSBmbWEgIDEgICAgIDEgICAtNzdlLTE5ICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDQ2IGZtYSAgMSAgICAgMSAgIC03N2UtOTkgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjQ1MCBmbWEgIDEgICAgMTAgICAtNzdlLTE0ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTIzCitmbWF4MzY0NTEgZm1hICAxICAgIDEwICAgLTc3ZS0xNSAgICAgIC0+ICAgOS45OTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ1MiBmbWEgIDEgICAgMTAgICAtNzdlLTE2ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ1MyBmbWEgIDEgICAgMTAgICAtNzdlLTE3ICAgICAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ1NCBmbWEgIDEgICAgMTAgICAtNzdlLTE4ICAgICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDU1IGZtYSAgMSAgICAxMCAgIC03N2UtMTkgICAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NTYgZm1hICAxICAgIDEwICAgLTc3ZS05OSAgICAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2NDYwIGZtYSAgMSAgICAtNzdlLTE0ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTkyMworZm1heDM2NDYxIGZtYSAgMSAgICAtNzdlLTE1ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ2MiBmbWEgIDEgICAgLTc3ZS0xNiAgICAgICAxICAgLT4gIDAuOTk5OTk5OTk5OTk5OTkyMworZm1heDM2NDYzIGZtYSAgMSAgICAtNzdlLTE3ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDY0IGZtYSAgMSAgICAtNzdlLTE4ICAgICAgIDEgICAtPiAgMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDY1IGZtYSAgMSAgICAtNzdlLTE5ICAgICAgIDEgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NjYgZm1hICAxICAgIC03N2UtOTkgICAgICAgMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2NDcwIGZtYSAgMSAgICAtNzdlLTE0ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjQ3MSBmbWEgIDEgICAgLTc3ZS0xNSAgICAgIDEwICAgLT4gICA5Ljk5OTk5OTk5OTk5OTkyMworZm1heDM2NDcyIGZtYSAgMSAgICAtNzdlLTE2ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDczIGZtYSAgMSAgICAtNzdlLTE3ICAgICAgMTAgICAtPiAgIDkuOTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorZm1heDM2NDc0IGZtYSAgMSAgICAtNzdlLTE4ICAgICAgMTAgICAtPiAgMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY0NzUgZm1hICAxICAgIC03N2UtMTkgICAgICAxMCAgIC0+ICAxMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ3NiBmbWEgIDEgICAgLTc3ZS05OSAgICAgIDEwICAgLT4gIDEwLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSB1bHBzCitmbWF4MzY0ODAgZm1hICAxICAgIC0xICAgIDc3ZS0xNCAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTkyMworZm1heDM2NDgxIGZtYSAgMSAgICAtMSAgICA3N2UtMTUgICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTIzCitmbWF4MzY0ODIgZm1hICAxICAgIC0xICAgIDc3ZS0xNiAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTIzCitmbWF4MzY0ODMgZm1hICAxICAgIC0xICAgIDc3ZS0xNyAgICAgIC0+ICAtMC45OTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDg0IGZtYSAgMSAgICAtMSAgICA3N2UtMTggICAgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ4NSBmbWEgIDEgICAgLTEgICAgNzdlLTE5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ4NiBmbWEgIDEgICAgLTEgICAgNzdlLTk5ICAgICAgLT4gIC0xLjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2NDkwIGZtYSAgMSAgIC0xMCAgICA3N2UtMTQgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTIzCitmbWF4MzY0OTEgZm1hICAxICAgLTEwICAgIDc3ZS0xNSAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTIzCitmbWF4MzY0OTIgZm1hICAxICAgLTEwICAgIDc3ZS0xNiAgICAgIC0+ICAgLTkuOTk5OTk5OTk5OTk5OTkyIEluZXhhY3QgUm91bmRlZAorZm1heDM2NDkzIGZtYSAgMSAgIC0xMCAgICA3N2UtMTcgICAgICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ5NCBmbWEgIDEgICAtMTAgICAgNzdlLTE4ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ5NSBmbWEgIDEgICAtMTAgICAgNzdlLTE5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjQ5NiBmbWEgIDEgICAtMTAgICAgNzdlLTk5ICAgICAgLT4gIC0xMC4wMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworZm1heDM2NTAwIGZtYSAgMSAgICAgNzdlLTE0ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5MjMKK2ZtYXgzNjUwMSBmbWEgIDEgICAgIDc3ZS0xNSAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTkyMworZm1heDM2NTAyIGZtYSAgMSAgICAgNzdlLTE2ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTkyMworZm1heDM2NTAzIGZtYSAgMSAgICAgNzdlLTE3ICAgICAgLTEgICAtPiAgLTAuOTk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUwNCBmbWEgIDEgICAgIDc3ZS0xOCAgICAgIC0xICAgLT4gIC0wLjk5OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MDUgZm1hICAxICAgICA3N2UtMTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MDYgZm1hICAxICAgICA3N2UtOTkgICAgICAtMSAgIC0+ICAtMS4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjUxMCBmbWEgIDEgICAgIDc3ZS0xNCAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTkyMworZm1heDM2NTExIGZtYSAgMSAgICAgNzdlLTE1ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTkyMworZm1heDM2NTEyIGZtYSAgMSAgICAgNzdlLTE2ICAgICAgLTEwICAtPiAgIC05Ljk5OTk5OTk5OTk5OTk5MiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUxMyBmbWEgIDEgICAgIDc3ZS0xNyAgICAgIC0xMCAgLT4gICAtOS45OTk5OTk5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MTQgZm1hICAxICAgICA3N2UtMTggICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MTUgZm1hICAxICAgICA3N2UtMTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MTYgZm1hICAxICAgICA3N2UtOTkgICAgICAtMTAgIC0+ICAtMTAuMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKKworLS0gbG9uZyBvcGVyYW5kcworZm1heDM2NTIxIGZtYSAgMSAgIDEwMTIzNDU2MjM0NTY3ODAwMCAwIC0+IDEuMDEyMzQ1NjIzNDU2NzgwRSsxNyBSb3VuZGVkCitmbWF4MzY1MjIgZm1hICAxICAgMCAxMDEyMzQ1NjIzNDU2NzgwMDAgLT4gMS4wMTIzNDU2MjM0NTY3ODBFKzE3IFJvdW5kZWQKK2ZtYXgzNjUyMyBmbWEgIDEgICAxMDEyMzQ1NjIzNDU2NzgwMCAgMCAtPiAxLjAxMjM0NTYyMzQ1Njc4MEUrMTYgUm91bmRlZAorZm1heDM2NTI0IGZtYSAgMSAgIDAgMTAxMjM0NTYyMzQ1Njc4MDAgIC0+IDEuMDEyMzQ1NjIzNDU2NzgwRSsxNiBSb3VuZGVkCitmbWF4MzY1MjUgZm1hICAxICAgMTAxMjM0NTYyMzQ1Njc4OTAgIDAgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE2IFJvdW5kZWQKK2ZtYXgzNjUyNiBmbWEgIDEgICAwIDEwMTIzNDU2MjM0NTY3ODkwICAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTYgUm91bmRlZAorZm1heDM2NTI3IGZtYSAgMSAgIDEwMTIzNDU2MjM0NTY3ODkxICAwIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUyOCBmbWEgIDEgICAwIDEwMTIzNDU2MjM0NTY3ODkxICAtPiAxLjAxMjM0NTYyMzQ1Njc4OUUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MjkgZm1hICAxICAgMTAxMjM0NTYyMzQ1Njc4OTAxIDAgLT4gMS4wMTIzNDU2MjM0NTY3ODlFKzE3IEluZXhhY3QgUm91bmRlZAorZm1heDM2NTMwIGZtYSAgMSAgIDAgMTAxMjM0NTYyMzQ1Njc4OTAxIC0+IDEuMDEyMzQ1NjIzNDU2Nzg5RSsxNyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjUzMSBmbWEgIDEgICAxMDEyMzQ1NjIzNDU2Nzg5NiAgMCAtPiAxLjAxMjM0NTYyMzQ1Njc5MEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY1MzIgZm1hICAxICAgMCAxMDEyMzQ1NjIzNDU2Nzg5NiAgLT4gMS4wMTIzNDU2MjM0NTY3OTBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSB2ZXJpZnkgYSBxdWVyeQorcm91bmRpbmc6ICAgICBkb3duCitmbWF4MzY1NjEgZm1hICAxICAgMWUtMzk4IDkuMDAwMDAwMDAwMDAwMDAwRSszODQgLT4gOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjU2MiBmbWEgIDEgICAgICAgIDAgOS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzg0IFJvdW5kZWQKKy0tIGFuZCB1c2luZyBkZWNpbWFsNjQgYm91bmRzLi4uCityb3VuZGluZzogICAgIGRvd24KK2ZtYXgzNjU2MyBmbWEgIDEgICAxZS0zODggOS4wMDAwMDAwMDAwMDAwMDBFKzM3NCAtPiA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IEluZXhhY3QgUm91bmRlZAorZm1heDM2NTY0IGZtYSAgMSAgICAgICAgMCA5LjAwMDAwMDAwMDAwMDAwMEUrMzc0IC0+IDkuMDAwMDAwMDAwMDAwMDAwRSszNzQgUm91bmRlZAorCistLSBtb3JlIHplcm9zLCBldGMuCityb3VuZGluZzogaGFsZl9ldmVuCisKK2ZtYXgzNjcwMSBmbWEgIDEgICA1LjAwIDEuMDBFLTMgLT4gNS4wMDEwMAorZm1heDM2NzAyIGZtYSAgMSAgIDAwLjAwIDAuMDAwICAtPiAwLjAwMAorZm1heDM2NzAzIGZtYSAgMSAgIDAwLjAwIDBFLTMgICAtPiAwLjAwMAorZm1heDM2NzA0IGZtYSAgMSAgIDBFLTMgIDAwLjAwICAtPiAwLjAwMAorCitmbWF4MzY3MTAgZm1hICAxICAgMEUrMyAgMDAuMDAgIC0+IDAuMDAKK2ZtYXgzNjcxMSBmbWEgIDEgICAwRSszICAwMC4wICAgLT4gMC4wCitmbWF4MzY3MTIgZm1hICAxICAgMEUrMyAgMDAuICAgIC0+IDAKK2ZtYXgzNjcxMyBmbWEgIDEgICAwRSszICAwMC5FKzEgLT4gMEUrMQorZm1heDM2NzE0IGZtYSAgMSAgIDBFKzMgIDAwLkUrMiAtPiAwRSsyCitmbWF4MzY3MTUgZm1hICAxICAgMEUrMyAgMDAuRSszIC0+IDBFKzMKK2ZtYXgzNjcxNiBmbWEgIDEgICAwRSszICAwMC5FKzQgLT4gMEUrMworZm1heDM2NzE3IGZtYSAgMSAgIDBFKzMgIDAwLkUrNSAtPiAwRSszCitmbWF4MzY3MTggZm1hICAxICAgMEUrMyAgLTAwLjAgICAtPiAwLjAKK2ZtYXgzNjcxOSBmbWEgIDEgICAwRSszICAtMDAuICAgIC0+IDAKK2ZtYXgzNjczMSBmbWEgIDEgICAwRSszICAtMDAuRSsxIC0+IDBFKzEKKworZm1heDM2NzIwIGZtYSAgMSAgIDAwLjAwICAwRSszICAtPiAwLjAwCitmbWF4MzY3MjEgZm1hICAxICAgMDAuMCAgIDBFKzMgIC0+IDAuMAorZm1heDM2NzIyIGZtYSAgMSAgIDAwLiAgICAwRSszICAtPiAwCitmbWF4MzY3MjMgZm1hICAxICAgMDAuRSsxIDBFKzMgIC0+IDBFKzEKK2ZtYXgzNjcyNCBmbWEgIDEgICAwMC5FKzIgMEUrMyAgLT4gMEUrMgorZm1heDM2NzI1IGZtYSAgMSAgIDAwLkUrMyAwRSszICAtPiAwRSszCitmbWF4MzY3MjYgZm1hICAxICAgMDAuRSs0IDBFKzMgIC0+IDBFKzMKK2ZtYXgzNjcyNyBmbWEgIDEgICAwMC5FKzUgMEUrMyAgLT4gMEUrMworZm1heDM2NzI4IGZtYSAgMSAgIC0wMC4wMCAwRSszICAtPiAwLjAwCitmbWF4MzY3MjkgZm1hICAxICAgLTAwLjAgIDBFKzMgIC0+IDAuMAorZm1heDM2NzMwIGZtYSAgMSAgIC0wMC4gICAwRSszICAtPiAwCisKK2ZtYXgzNjczMiBmbWEgIDEgICAgMCAgICAgMCAgICAgLT4gIDAKK2ZtYXgzNjczMyBmbWEgIDEgICAgMCAgICAtMCAgICAgLT4gIDAKK2ZtYXgzNjczNCBmbWEgIDEgICAtMCAgICAgMCAgICAgLT4gIDAKK2ZtYXgzNjczNSBmbWEgIDEgICAtMCAgICAtMCAgICAgLT4gLTAgICAgIC0tIElFRUUgODU0IHNwZWNpYWwgY2FzZQorCitmbWF4MzY3MzYgZm1hICAxICAgIDEgICAgLTEgICAgIC0+ICAwCitmbWF4MzY3MzcgZm1hICAxICAgLTEgICAgLTEgICAgIC0+IC0yCitmbWF4MzY3MzggZm1hICAxICAgIDEgICAgIDEgICAgIC0+ICAyCitmbWF4MzY3MzkgZm1hICAxICAgLTEgICAgIDEgICAgIC0+ICAwCisKK2ZtYXgzNjc0MSBmbWEgIDEgICAgMCAgICAtMSAgICAgLT4gLTEKK2ZtYXgzNjc0MiBmbWEgIDEgICAtMCAgICAtMSAgICAgLT4gLTEKK2ZtYXgzNjc0MyBmbWEgIDEgICAgMCAgICAgMSAgICAgLT4gIDEKK2ZtYXgzNjc0NCBmbWEgIDEgICAtMCAgICAgMSAgICAgLT4gIDEKK2ZtYXgzNjc0NSBmbWEgIDEgICAtMSAgICAgMCAgICAgLT4gLTEKK2ZtYXgzNjc0NiBmbWEgIDEgICAtMSAgICAtMCAgICAgLT4gLTEKK2ZtYXgzNjc0NyBmbWEgIDEgICAgMSAgICAgMCAgICAgLT4gIDEKK2ZtYXgzNjc0OCBmbWEgIDEgICAgMSAgICAtMCAgICAgLT4gIDEKKworZm1heDM2NzUxIGZtYSAgMSAgICAwLjAgIC0xICAgICAtPiAtMS4wCitmbWF4MzY3NTIgZm1hICAxICAgLTAuMCAgLTEgICAgIC0+IC0xLjAKK2ZtYXgzNjc1MyBmbWEgIDEgICAgMC4wICAgMSAgICAgLT4gIDEuMAorZm1heDM2NzU0IGZtYSAgMSAgIC0wLjAgICAxICAgICAtPiAgMS4wCitmbWF4MzY3NTUgZm1hICAxICAgLTEuMCAgIDAgICAgIC0+IC0xLjAKK2ZtYXgzNjc1NiBmbWEgIDEgICAtMS4wICAtMCAgICAgLT4gLTEuMAorZm1heDM2NzU3IGZtYSAgMSAgICAxLjAgICAwICAgICAtPiAgMS4wCitmbWF4MzY3NTggZm1hICAxICAgIDEuMCAgLTAgICAgIC0+ICAxLjAKKworZm1heDM2NzYxIGZtYSAgMSAgICAwICAgIC0xLjAgICAtPiAtMS4wCitmbWF4MzY3NjIgZm1hICAxICAgLTAgICAgLTEuMCAgIC0+IC0xLjAKK2ZtYXgzNjc2MyBmbWEgIDEgICAgMCAgICAgMS4wICAgLT4gIDEuMAorZm1heDM2NzY0IGZtYSAgMSAgIC0wICAgICAxLjAgICAtPiAgMS4wCitmbWF4MzY3NjUgZm1hICAxICAgLTEgICAgIDAuMCAgIC0+IC0xLjAKK2ZtYXgzNjc2NiBmbWEgIDEgICAtMSAgICAtMC4wICAgLT4gLTEuMAorZm1heDM2NzY3IGZtYSAgMSAgICAxICAgICAwLjAgICAtPiAgMS4wCitmbWF4MzY3NjggZm1hICAxICAgIDEgICAgLTAuMCAgIC0+ICAxLjAKKworZm1heDM2NzcxIGZtYSAgMSAgICAwLjAgIC0xLjAgICAtPiAtMS4wCitmbWF4MzY3NzIgZm1hICAxICAgLTAuMCAgLTEuMCAgIC0+IC0xLjAKK2ZtYXgzNjc3MyBmbWEgIDEgICAgMC4wICAgMS4wICAgLT4gIDEuMAorZm1heDM2Nzc0IGZtYSAgMSAgIC0wLjAgICAxLjAgICAtPiAgMS4wCitmbWF4MzY3NzUgZm1hICAxICAgLTEuMCAgIDAuMCAgIC0+IC0xLjAKK2ZtYXgzNjc3NiBmbWEgIDEgICAtMS4wICAtMC4wICAgLT4gLTEuMAorZm1heDM2Nzc3IGZtYSAgMSAgICAxLjAgICAwLjAgICAtPiAgMS4wCitmbWF4MzY3NzggZm1hICAxICAgIDEuMCAgLTAuMCAgIC0+ICAxLjAKKworLS0gU3BlY2lhbHMKK2ZtYXgzNjc4MCBmbWEgIDEgICAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4MzY3ODEgZm1hICAxICAgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorZm1heDM2NzgyIGZtYSAgMSAgIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc4MyBmbWEgIDEgICAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitmbWF4MzY3ODQgZm1hICAxICAgLUluZiAgIDAgICAgIC0+IC1JbmZpbml0eQorZm1heDM2Nzg1IGZtYSAgMSAgIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc4NiBmbWEgIDEgICAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5CitmbWF4MzY3ODcgZm1hICAxICAgLTEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM2Nzg4IGZtYSAgMSAgIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc4OSBmbWEgIDEgICAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4MzY3OTAgZm1hICAxICAgLTAgICAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM2NzkxIGZtYSAgMSAgICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK2ZtYXgzNjc5MiBmbWEgIDEgICAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5CitmbWF4MzY3OTMgZm1hICAxICAgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorZm1heDM2Nzk0IGZtYSAgMSAgICBJbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitmbWF4MzY4MDAgZm1hICAxICAgIEluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4MDEgZm1hICAxICAgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorZm1heDM2ODAyIGZtYSAgMSAgICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgwMyBmbWEgIDEgICAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitmbWF4MzY4MDQgZm1hICAxICAgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorZm1heDM2ODA1IGZtYSAgMSAgICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgwNiBmbWEgIDEgICAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitmbWF4MzY4MDcgZm1hICAxICAgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorZm1heDM2ODA4IGZtYSAgMSAgIC0xMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgwOSBmbWEgIDEgICAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjgxMCBmbWEgIDEgICAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzY4MTEgZm1hICAxICAgLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorZm1heDM2ODEyIGZtYSAgMSAgICAwICAgICBJbmYgICAtPiAgSW5maW5pdHkKK2ZtYXgzNjgxMyBmbWEgIDEgICAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitmbWF4MzY4MTQgZm1hICAxICAgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorZm1heDM2ODE1IGZtYSAgMSAgICBJbmYgICBJbmYgICAtPiAgSW5maW5pdHkKKworZm1heDM2ODIxIGZtYSAgMSAgICBOYU4gLUluZiAgICAtPiAgTmFOCitmbWF4MzY4MjIgZm1hICAxICAgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK2ZtYXgzNjgyMyBmbWEgIDEgICAgTmFOIC0xICAgICAgLT4gIE5hTgorZm1heDM2ODI0IGZtYSAgMSAgICBOYU4gLTAgICAgICAtPiAgTmFOCitmbWF4MzY4MjUgZm1hICAxICAgIE5hTiAgMCAgICAgIC0+ICBOYU4KK2ZtYXgzNjgyNiBmbWEgIDEgICAgTmFOICAxICAgICAgLT4gIE5hTgorZm1heDM2ODI3IGZtYSAgMSAgICBOYU4gIDEwMDAgICAtPiAgTmFOCitmbWF4MzY4MjggZm1hICAxICAgIE5hTiAgSW5mICAgIC0+ICBOYU4KK2ZtYXgzNjgyOSBmbWEgIDEgICAgTmFOICBOYU4gICAgLT4gIE5hTgorZm1heDM2ODMwIGZtYSAgMSAgIC1JbmYgIE5hTiAgICAtPiAgTmFOCitmbWF4MzY4MzEgZm1hICAxICAgLTEwMDAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzNjgzMiBmbWEgIDEgICAtMSAgICBOYU4gICAgLT4gIE5hTgorZm1heDM2ODMzIGZtYSAgMSAgIC0wICAgIE5hTiAgICAtPiAgTmFOCitmbWF4MzY4MzQgZm1hICAxICAgIDAgICAgTmFOICAgIC0+ICBOYU4KK2ZtYXgzNjgzNSBmbWEgIDEgICAgMSAgICBOYU4gICAgLT4gIE5hTgorZm1heDM2ODM2IGZtYSAgMSAgICAxMDAwIE5hTiAgICAtPiAgTmFOCitmbWF4MzY4MzcgZm1hICAxICAgIEluZiAgTmFOICAgIC0+ICBOYU4KKworZm1heDM2ODQxIGZtYSAgMSAgICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQyIGZtYSAgMSAgICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQzIGZtYSAgMSAgICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQ0IGZtYSAgMSAgICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQ1IGZtYSAgMSAgICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQ2IGZtYSAgMSAgICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQ3IGZtYSAgMSAgICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQ4IGZtYSAgMSAgICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODQ5IGZtYSAgMSAgICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODUwIGZtYSAgMSAgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODUxIGZtYSAgMSAgIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODUyIGZtYSAgMSAgIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODUzIGZtYSAgMSAgIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODU0IGZtYSAgMSAgIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODU1IGZtYSAgMSAgICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODU2IGZtYSAgMSAgICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODU3IGZtYSAgMSAgICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODU4IGZtYSAgMSAgICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODU5IGZtYSAgMSAgICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCitmbWF4MzY4NjEgZm1hICAxICAgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCitmbWF4MzY4NjIgZm1hICAxICAgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitmbWF4MzY4NjMgZm1hICAxICAgIE5hTjMgICAgMTAwMCAgIC0+ICBOYU4zCitmbWF4MzY4NjQgZm1hICAxICAgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40CitmbWF4MzY4NjUgZm1hICAxICAgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitmbWF4MzY4NjYgZm1hICAxICAgLUluZiAgICAgTmFONyAgIC0+ICBOYU43CitmbWF4MzY4NjcgZm1hICAxICAgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44CitmbWF4MzY4NjggZm1hICAxICAgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitmbWF4MzY4NjkgZm1hICAxICAgIEluZiAgICArTmFOMTAgIC0+ICBOYU4xMAorZm1heDM2ODcxIGZtYSAgMSAgICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NzIgZm1hICAxICAgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg3MyBmbWEgIDEgICAgc05hTjEzICAgMTAwMCAgLT4gIE5hTjEzICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODc0IGZtYSAgMSAgICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NzUgZm1hICAxICAgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg3NiBmbWEgIDEgICAgTmFOMTYgICBzTmFOMTkgLT4gIE5hTjE5ICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODc3IGZtYSAgMSAgIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4NzggZm1hICAxICAgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg3OSBmbWEgIDEgICAgMTAwMCAgICBzTmFOMjIgLT4gIE5hTjIyICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2ODgwIGZtYSAgMSAgICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCitmbWF4MzY4ODEgZm1hICAxICAgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg4MiBmbWEgIDEgICAtTmFOMjYgICAgTmFOMjggLT4gLU5hTjI2CitmbWF4MzY4ODMgZm1hICAxICAgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjg4NCBmbWEgIDEgICAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitmbWF4MzY4ODUgZm1hICAxICAgIDEwMDAgICAtc05hTjMxIC0+IC1OYU4zMSAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gbm93IHRoZSBjYXNlIHdoZXJlIHdlIGNhbiBnZXQgdW5kZXJmbG93IGJ1dCB0aGUgcmVzdWx0IGlzIG5vcm1hbAorLS0gW25vdGUgdGhpcyBjYW4ndCBoYXBwZW4gaWYgdGhlIG9wZXJhbmRzIGFyZSBhbHNvIGJvdW5kZWQsIGFzIHdlCistLSBjYW5ub3QgcmVwcmVzZW50IDFFLTM5OSwgZm9yIGV4YW1wbGVdCisKK2ZtYXgzNjU3MSBmbWEgIDEgICAgICAgICAxRS0zODMgICAgICAgMCAgLT4gMUUtMzgzCitmbWF4MzY1NzIgZm1hICAxICAgICAgICAgMUUtMzg0ICAgICAgIDAgIC0+IDFFLTM4NCAgIFN1Ym5vcm1hbAorZm1heDM2NTczIGZtYSAgMSAgICAgICAgIDFFLTM4MyAgMUUtMzg0ICAtPiAxLjFFLTM4MworZm1heDM2NTc0IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM4NCAgLT4gICA5RS0zODQgU3Vibm9ybWFsCisKKy0tIEhlcmUgd2UgZXhwbG9yZSB0aGUgYm91bmRhcnkgb2Ygcm91bmRpbmcgYSBzdWJub3JtYWwgdG8gTm1pbgorZm1heDM2NTc1IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OCAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorZm1heDM2NTc2IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OCAgLT4gICA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgIFN1Ym5vcm1hbAorZm1heDM2NTc3IHN1YnRyYWN0ICAxRS0zODMgIDFFLTM5OSAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCitmbWF4MzY1Nzggc3VidHJhY3QgIDFFLTM4MyAgMUUtNDAwICAtPiAgIDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK2ZtYXgzNjU3OSBzdWJ0cmFjdCAgMUUtMzgzICAxRS00MDEgIC0+ICAgMS4wMDAwMDAwMDAwMDAwMDBFLTM4MyBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorZm1heDM2NTgwIHN1YnRyYWN0ICAxRS0zODMgIDFFLTQwMiAgLT4gICAxLjAwMDAwMDAwMDAwMDAwMEUtMzgzIFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCisKKy0tIGNoZWNrIG92ZXJmbG93IGVkZ2UgY2FzZQorLS0gICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDU2CitmbWF4MzY5NzIgYXBwbHkgICAgICAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0CitmbWF4MzY5NzMgZm1hICAxICAgICAgIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgIDEgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTc0IGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAxICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk3NSBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY5ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk3NiBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOUUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk3NyBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgOEUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk3OCBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgN0UrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk3OSBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNkUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk4MCBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNUUrMzY4ICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk4MSBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgNEUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTgyIGZtYSAgMSAgICAgICAgOTk5OTk5OTk5OTk5OTk5OUUrMzY5ICAzRSszNjggIC0+IDkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5ODMgZm1hICAxICAgICAgICA5OTk5OTk5OTk5OTk5OTk5RSszNjkgIDJFKzM2OCAgLT4gOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk4NCBmbWEgIDEgICAgICAgIDk5OTk5OTk5OTk5OTk5OTlFKzM2OSAgMUUrMzY4ICAtPiA5Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IEluZXhhY3QgUm91bmRlZAorCitmbWF4MzY5ODUgYXBwbHkgICAgICAgLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgICAgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NAorZm1heDM2OTg2IGZtYSAgMSAgICAgIC05Ljk5OTk5OTk5OTk5OTk5OUUrMzg0IC0xICAgICAgLT4gLTkuOTk5OTk5OTk5OTk5OTk5RSszODQgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5ODcgZm1hICAxICAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTEgICAgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk4OCBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMUUrMzY5ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5ODkgZm1hICAxICAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTlFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTkwIGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC04RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk5MSBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtN0UrMzY4ICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitmbWF4MzY5OTIgZm1hICAxICAgICAgIC05OTk5OTk5OTk5OTk5OTk5RSszNjkgLTZFKzM2OCAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorZm1heDM2OTkzIGZtYSAgMSAgICAgICAtOTk5OTk5OTk5OTk5OTk5OUUrMzY5IC01RSszNjggIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk5NCBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtNEUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk5NSBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtM0UrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk5NiBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMkUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjk5NyBmbWEgIDEgICAgICAgLTk5OTk5OTk5OTk5OTk5OTlFKzM2OSAtMUUrMzY4ICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFKzM4NCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQW5kIGZvciByb3VuZCBkb3duIGZ1bGwgYW5kIHN1Ym5vcm1hbCByZXN1bHRzCityb3VuZGluZzogICAgIGRvd24KK2ZtYXgzNjExMDAgZm1hICAxICAgMWUrMiAtMWUtMzgzICAgIC0+IDk5Ljk5OTk5OTk5OTk5OTk5IFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwMSBmbWEgIDEgICAxZSsxIC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwMyBmbWEgIDEgICAgICsxIC0xZS0zODMgICAgLT4gMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMDQgZm1hICAxICAgMWUtMSAtMWUtMzgzICAgIC0+IDAuMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwNSBmbWEgIDEgICAxZS0yIC0xZS0zODMgICAgLT4gMC4wMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwNiBmbWEgIDEgICAxZS0zIC0xZS0zODMgICAgLT4gMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMDcgZm1hICAxICAgMWUtNCAtMWUtMzgzICAgIC0+IDAuMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwOCBmbWEgIDEgICAxZS01IC0xZS0zODMgICAgLT4gMC4wMDAwMDk5OTk5OTk5OTk5OTk5OTkgIFJvdW5kZWQgSW5leGFjdAorZm1heDM2MTEwOSBmbWEgIDEgICAxZS02IC0xZS0zODMgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorCityb3VuZGluZzogICAgIGNlaWxpbmcKK2ZtYXgzNjExMTAgZm1hICAxICAgLTFlKzIgKzFlLTM4MyAgIC0+IC05OS45OTk5OTk5OTk5OTk5OSBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTEgZm1hICAxICAgLTFlKzEgKzFlLTM4MyAgIC0+IC05Ljk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTEzIGZtYSAgMSAgICAgIC0xICsxZS0zODMgICAtPiAtMC45OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTQgZm1hICAxICAgLTFlLTEgKzFlLTM4MyAgIC0+IC0wLjA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTUgZm1hICAxICAgLTFlLTIgKzFlLTM4MyAgIC0+IC0wLjAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTE2IGZtYSAgMSAgIC0xZS0zICsxZS0zODMgICAtPiAtMC4wMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTcgZm1hICAxICAgLTFlLTQgKzFlLTM4MyAgIC0+IC0wLjAwMDA5OTk5OTk5OTk5OTk5OTk5ICBSb3VuZGVkIEluZXhhY3QKK2ZtYXgzNjExMTggZm1hICAxICAgLTFlLTUgKzFlLTM4MyAgIC0+IC0wLjAwMDAwOTk5OTk5OTk5OTk5OTk5OSAgUm91bmRlZCBJbmV4YWN0CitmbWF4MzYxMTE5IGZtYSAgMSAgIC0xZS02ICsxZS0zODMgICAtPiAtOS45OTk5OTk5OTk5OTk5OTlFLTcgIFJvdW5kZWQgSW5leGFjdAorCistLSB0ZXN0cyBiYXNlZCBvbiBHdW5uYXIgRGVnbmJvbCdzIGVkZ2UgY2FzZQorcm91bmRpbmc6ICAgICBoYWxmX2V2ZW4KKworZm1heDM2MTMwMCBmbWEgIDEgICAxRTE2ICAtMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxMCBmbWEgIDEgICAxRTE2ICAtMC41MSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxMSBmbWEgIDEgICAxRTE2ICAtMC41MDEgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxMiBmbWEgIDEgICAxRTE2ICAtMC41MDAxICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxMyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxNCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDEgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxNSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAxICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxNiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxNyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDEgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxOCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAxICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMxOSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyMCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDEgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyMSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAxICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyMiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyMyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDEgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyNCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAxICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyNSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyNiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMDAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyNyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwMCAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyOCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMyOSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMDAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzMCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwMCAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzMSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzMiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMDAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzMyBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwMCAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzNCBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzNSBmbWEgIDEgICAxRTE2ICAtMC41MDAwMDAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzNiBmbWEgIDEgICAxRTE2ICAtMC41MDAwMCAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzNyBmbWEgIDEgICAxRTE2ICAtMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzOCBmbWEgIDEgICAxRTE2ICAtMC41MDAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTMzOSBmbWEgIDEgICAxRTE2ICAtMC41MCAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCitmbWF4MzYxMzQwIGZtYSAgMSAgIDFFMTYgIC01MDAwMDAwLjAwMDAxMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzQxIGZtYSAgMSAgIDFFMTYgIC01MDAwMDAwLjAwMDAwMDAwMSAgIC0+ICA5OTk5OTk5OTk1MDAwMDAwICAgICAgSW5leGFjdCBSb3VuZGVkCisKK2ZtYXgzNjEzNDkgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQgICAgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzUwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OSAgICAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM1MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5ICAgICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNTIgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTkgICAgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzUzIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OSAgICAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM1NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5ICAgICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNTUgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTkgICAgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzU2IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OSAgICAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM1NyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5ICAgICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNTggZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTkgICAgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzU5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OSAgICAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM2MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5ICAgICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNjEgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTkgICAgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzYyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC40OTk5OTk5OTk5OTk5OSAgICAtPiAgOTk5OTk5OTk5OTk5OTk5OSAgICAgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM2MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNDk5OTk5OTk5OTk5OTk5ICAgLT4gIDk5OTk5OTk5OTk5OTk5OTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNjQgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjQ5OTk5OTk5OTk5OTk5OTkgIC0+ICA5OTk5OTk5OTk5OTk5OTk5ICAgICAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzY1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMDAwICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM2NyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNjggZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzY5IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM3MCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNzEgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzcyIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM3MyBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNzQgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzc1IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM3NiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzNzcgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzc4IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM3OSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwICAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzODAgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwICAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzgxIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41ICAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM4MiBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMDAwMSAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzODMgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMDAwMSAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzg0IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMDAwMSAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM4NSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMDAwMSAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzODYgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMDAwMSAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzg3IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMDAwMSAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM4OCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMDAwMSAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzODkgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMDAwMSAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzkwIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMDAwMSAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM5MSBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMDAwMSAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzOTIgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMDAwMSAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzkzIGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MDAwMSAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorZm1heDM2MTM5NCBmbWEgIDEgICA5OTk5OTk5OTk5OTk5OTk5IDAuNTAwMSAgICAgICAgICAgICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjEzOTUgZm1hICAxICAgOTk5OTk5OTk5OTk5OTk5OSAwLjUwMSAgICAgICAgICAgICAgIC0+ICAxLjAwMDAwMDAwMDAwMDAwMEUrMTYgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYxMzk2IGZtYSAgMSAgIDk5OTk5OTk5OTk5OTk5OTkgMC41MSAgICAgICAgICAgICAgICAtPiAgMS4wMDAwMDAwMDAwMDAwMDBFKzE2IEluZXhhY3QgUm91bmRlZAorCistLSBNb3JlIEdEIGVkZ2UgY2FzZXMsIHdoZXJlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdW5hZGp1c3RlZAorLS0gZXhwb25lbnRzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHByZWNpc2lvbiBhbmQgb25lIHNpZGUgaXMgMAorZm1heDM2MTQyMCBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NSAgICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0MjEgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEgIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQyMiBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgLT4gMC4wMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQyMyBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMyAgLT4gMC4wMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0MjQgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTQgIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQyNSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgLT4gMC4wMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQyNiBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtNiAgLT4gMC4wMDAwMDExMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0MjcgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CitmbWF4MzYxNDI4IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtOAorZm1heDM2MTQyOSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTkKK2ZtYXgzNjE0MzAgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZm1heDM2MTQzMSBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTExCitmbWF4MzYxNDMyIGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMiAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTIKK2ZtYXgzNjE0MzMgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTEzIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworZm1heDM2MTQzNCBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE0CitmbWF4MzYxNDM1IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNSAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTUKK2ZtYXgzNjE0MzYgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE2IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZm1heDM2MTQzNyBmbWEgIDEgICAgMCAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE3CitmbWF4MzYxNDM4IGZtYSAgMSAgICAwIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTgKK2ZtYXgzNjE0MzkgZm1hICAxICAgIDAgMS4xMjM0NTY3ODkwMTIzNDVFLTE5IC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCByZXZlcnNlZCAwCitmbWF4MzYxNDQwIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAgICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDQxIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xICAwIC0+IDAuMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ0MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMiAgMCAtPiAwLjAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDQzIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0zICAwIC0+IDAuMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDQ0IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS00ICAwIC0+IDAuMDAwMTEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ0NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtNSAgMCAtPiAwLjAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDQ2IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS02ICAwIC0+IDAuMDAwMDAxMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDQ3IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS03ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS03CitmbWF4MzYxNDQ4IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS04ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS04CitmbWF4MzYxNDQ5IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS05ICAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS05CitmbWF4MzYxNDUwIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMCAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMAorZm1heDM2MTQ1MSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTEKK2ZtYXgzNjE0NTIgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTEyIDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTEyCitmbWF4MzYxNDUzIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMyAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xMworZm1heDM2MTQ1NCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTQKK2ZtYXgzNjE0NTUgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE1IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE1CitmbWF4MzYxNDU2IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNiAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xNgorZm1heDM2MTQ1NyBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcgMCAtPiAxLjEyMzQ1Njc4OTAxMjM0NUUtMTcKK2ZtYXgzNjE0NTggZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDVFLTE4IDAgLT4gMS4xMjM0NTY3ODkwMTIzNDVFLTE4CitmbWF4MzYxNDU5IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOSAwIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1RS0xOQorCistLSBzYW1lLCBFcyBvbiB0aGUgMAorZm1heDM2MTQ2MCBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMCAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDYxIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NjIgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTIgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ2MyBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMyAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDY0IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS00ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NjUgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTUgICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ2NiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtNiAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDY3IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS03ICAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NjggZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTggICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ2OSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtOSAgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDcwIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMCAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NzEgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTExICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ3MiBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTIgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CitmbWF4MzYxNDczIGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xMyAgLT4gMS4xMjM0NTY3ODkwMTIzNDUKK2ZtYXgzNjE0NzQgZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE0ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NQorZm1heDM2MTQ3NSBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTUgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1CistLSBuZXh0IGZvdXIgZmxhZyBSb3VuZGVkIGJlY2F1c2UgdGhlIDAgZXh0ZW5kcyB0aGUgcmVzdWx0CitmbWF4MzYxNDc2IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xNiAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorZm1heDM2MTQ3NyBmbWEgIDEgICAxLjEyMzQ1Njc4OTAxMjM0NSAgMEUtMTcgIC0+IDEuMTIzNDU2Nzg5MDEyMzQ1IFJvdW5kZWQKK2ZtYXgzNjE0NzggZm1hICAxICAgMS4xMjM0NTY3ODkwMTIzNDUgIDBFLTE4ICAtPiAxLjEyMzQ1Njc4OTAxMjM0NSBSb3VuZGVkCitmbWF4MzYxNDc5IGZtYSAgMSAgIDEuMTIzNDU2Nzg5MDEyMzQ1ICAwRS0xOSAgLT4gMS4xMjM0NTY3ODkwMTIzNDUgUm91bmRlZAorCistLSBzdW0gb2YgdHdvIG9wcG9zaXRlLXNpZ24gb3BlcmFuZHMgaXMgZXhhY3RseSAwIGFuZCBmbG9vciA9PiAtMAorcm91bmRpbmc6ICAgIGhhbGZfdXAKKy0tIGV4YWN0IHplcm9zIGZyb20gemVyb3MKK2ZtYXgzNjE1MDAgZm1hICAxICAgIDAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzNjE1MDEgZm1hICAxICAgLTAgICAgICAgIDBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzNjE1MDIgZm1hICAxICAgIDAgICAgICAgLTBFLTE5ICAtPiAgMEUtMTkKK2ZtYXgzNjE1MDMgZm1hICAxICAgLTAgICAgICAgLTBFLTE5ICAtPiAtMEUtMTkKK2ZtYXgzNjE1MDQgZm1hICAxICAgIDBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1MDUgZm1hICAxICAgLTBFLTQwMCAgIDBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1MDYgZm1hICAxICAgIDBFLTQwMCAgLTBFLTE5ICAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1MDcgZm1hICAxICAgLTBFLTQwMCAgLTBFLTE5ICAtPiAtMEUtMzk4IENsYW1wZWQKKy0tIGluZXhhY3QgemVyb3MKK2ZtYXgzNjE1MTEgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1MTIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1MTMgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1MTQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzNjE1MTUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKK2ZtYXgzNjE1MTYgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1MTcgZm1hICAxICAgIDFFLTQwMSAgLTFFLTQwMSAtPiAgMEUtMzk4IENsYW1wZWQKK2ZtYXgzNjE1MTggZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMSAtPiAtMEUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IENsYW1wZWQKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDM2MTUyMCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTUyMSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTUyMiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTUyMyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDM2MTUyNCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUyNSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUyNiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUyNyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDM2MTUzMSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUzMiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUzMyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUzNCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDM2MTUzNSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTUzNiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUzNyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTUzOCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgaGFsZl9ldmVuCistLSBleGFjdCB6ZXJvcyBmcm9tIHplcm9zCitmbWF4MzYxNTQwIGZtYSAgMSAgICAwICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTQxIGZtYSAgMSAgIC0wICAgICAgICAwRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTQyIGZtYSAgMSAgICAwICAgICAgIC0wRS0xOSAgLT4gIDBFLTE5CitmbWF4MzYxNTQzIGZtYSAgMSAgIC0wICAgICAgIC0wRS0xOSAgLT4gLTBFLTE5CitmbWF4MzYxNTQ0IGZtYSAgMSAgICAwRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTQ1IGZtYSAgMSAgIC0wRS00MDAgICAwRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTQ2IGZtYSAgMSAgICAwRS00MDAgIC0wRS0xOSAgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTQ3IGZtYSAgMSAgIC0wRS00MDAgIC0wRS0xOSAgLT4gLTBFLTM5OCBDbGFtcGVkCistLSBpbmV4YWN0IHplcm9zCitmbWF4MzYxNTUxIGZtYSAgMSAgICAxRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTUyIGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDAgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTUzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTU0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzYxNTU1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNTU2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTU3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTU4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCisKK3JvdW5kaW5nOiAgICB1cAorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDM2MTU2MCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTU2MSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTU2MiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTU2MyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDM2MTU2NCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU2NSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU2NiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU2NyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDM2MTU3MSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzNjE1NzIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzYxNTczIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDM2MTU3NCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKy0tIHNvbWUgZXhhY3QgemVyb3MgZnJvbSBub24temVyb3MKK2ZtYXgzNjE1NzUgZm1hICAxICAgIDFFLTQwMSAgIDFFLTQwMSAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzYxNTc2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTc3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gIDBFLTM5OCBDbGFtcGVkCitmbWF4MzYxNTc4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCityb3VuZGluZzogICAgZG93bgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDM2MTU4MCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTU4MSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTU4MiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTU4MyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDM2MTU4NCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU4NSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU4NiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU4NyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDM2MTU5MSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTU5MiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTU5MyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTU5NCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAwIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorLS0gc29tZSBleGFjdCB6ZXJvcyBmcm9tIG5vbi16ZXJvcworZm1heDM2MTU5NSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTU5NiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU5NyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTU5OCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCityb3VuZGluZzogICAgY2VpbGluZworLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDM2MTYwMCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTYwMSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTYwMiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTYwMyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDM2MTYwNCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTYwNSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTYwNiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTYwNyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDM2MTYxMSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAxRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzNjE2MTIgZm1hICAxICAgLTFFLTQwMSAgIDFFLTQwMCAtPiAgMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CitmbWF4MzYxNjEzIGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNjE0IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDAgLT4gLTBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzYxNjE1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworZm1heDM2MTYxNiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTYxNyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAxIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTYxOCBmbWEgIDEgICAtMUUtNDAxICAtMUUtNDAxIC0+IC0wRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBhbmQgdGhlIGV4dHJhLXNwZWNpYWwgdWdseSBjYXNlOyB1bnVzdWFsIG1pbnVzZXMgbWFya2VkIGJ5IC0tICoKK3JvdW5kaW5nOiAgICBmbG9vcgorLS0gZXhhY3QgemVyb3MgZnJvbSB6ZXJvcworZm1heDM2MTYyMCBmbWEgIDEgICAgMCAgICAgICAgMEUtMTkgIC0+ICAwRS0xOQorZm1heDM2MTYyMSBmbWEgIDEgICAtMCAgICAgICAgMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZm1heDM2MTYyMiBmbWEgIDEgICAgMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOSAgICAgICAgICAgLS0gKgorZm1heDM2MTYyMyBmbWEgIDEgICAtMCAgICAgICAtMEUtMTkgIC0+IC0wRS0xOQorZm1heDM2MTYyNCBmbWEgIDEgICAgMEUtNDAwICAgMEUtMTkgIC0+ICAwRS0zOTggQ2xhbXBlZAorZm1heDM2MTYyNSBmbWEgIDEgICAtMEUtNDAwICAgMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorZm1heDM2MTYyNiBmbWEgIDEgICAgMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZCAgLS0gKgorZm1heDM2MTYyNyBmbWEgIDEgICAtMEUtNDAwICAtMEUtMTkgIC0+IC0wRS0zOTggQ2xhbXBlZAorLS0gaW5leGFjdCB6ZXJvcworZm1heDM2MTYzMSBmbWEgIDEgICAgMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTYzMiBmbWEgIDEgICAtMUUtNDAxICAgMUUtNDAwIC0+ICAwRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgQ2xhbXBlZAorZm1heDM2MTYzMyBmbWEgIDEgICAgMUUtNDAxICAtMUUtNDAwIC0+IC0xRS0zOTggU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK2ZtYXgzNjE2MzQgZm1hICAxICAgLTFFLTQwMSAgLTFFLTQwMCAtPiAtMUUtMzk4IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CistLSBzb21lIGV4YWN0IHplcm9zIGZyb20gbm9uLXplcm9zCitmbWF4MzYxNjM1IGZtYSAgMSAgICAxRS00MDEgICAxRS00MDEgLT4gIDBFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBDbGFtcGVkCitmbWF4MzYxNjM2IGZtYSAgMSAgIC0xRS00MDEgICAxRS00MDEgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCitmbWF4MzYxNjM3IGZtYSAgMSAgICAxRS00MDEgIC0xRS00MDEgLT4gLTBFLTM5OCBDbGFtcGVkICAtLSAqCitmbWF4MzYxNjM4IGZtYSAgMSAgIC0xRS00MDEgIC0xRS00MDEgLT4gLTFFLTM5OCBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK2ZtYXgzNjE3MDEgZm1hICAxICAgMTMwRS0yICAgIDEyMEUtMiAgICAtPiAyLjUwCitmbWF4MzYxNzAyIGZtYSAgMSAgIDEzMEUtMiAgICAxMkUtMSAgICAgLT4gMi41MAorZm1heDM2MTcwMyBmbWEgIDEgICAxMzBFLTIgICAgMUUwICAgICAgIC0+IDIuMzAKK2ZtYXgzNjE3MDQgZm1hICAxICAgMUUyICAgICAgIDFFNCAgICAgICAtPiAxLjAxRSs0CitmbWF4MzYxNzA1IHN1YnRyYWN0IDEzMEUtMiAgMTIwRS0yIC0+IDAuMTAKK2ZtYXgzNjE3MDYgc3VidHJhY3QgMTMwRS0yICAxMkUtMSAgLT4gMC4xMAorZm1heDM2MTcwNyBzdWJ0cmFjdCAxMzBFLTIgIDFFMCAgICAtPiAwLjMwCitmbWF4MzYxNzA4IHN1YnRyYWN0IDFFMiAgICAgMUU0ICAgIC0+IC05LjlFKzMKKworLS0gR2FwcHkgY29lZmZpY2llbnRzOyBjaGVjayByZXNpZHVlIGhhbmRsaW5nIGV2ZW4gd2l0aCBmdWxsIGNvZWZmaWNpZW50IGdhcAorcm91bmRpbmc6IGhhbGZfZXZlbgorCitmbWF4MzYyMDAxIGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgMSAgICAgIC0+IDEyMzQ1Njc4OTAxMjM0NTcKK2ZtYXgzNjIwMDIgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiAwLjYgICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NyAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDAzIGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgMC4wNiAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAwNCBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTMgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMDUgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS00ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDA2IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtNSAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAwNyBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTYgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMDggZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS03ICAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDA5IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtOCAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAxMCBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTkgICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMTEgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMCAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDEyIGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTEgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAxMyBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTEyICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMTQgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xMyAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDE1IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTQgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAxNiBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE1ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMTcgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xNiAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDE4IGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMTcgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjAxOSBmbWEgIDEgICAxMjM0NTY3ODkwMTIzNDU2IDZFLTE4ICAtPiAxMjM0NTY3ODkwMTIzNDU2ICBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwMjAgZm1hICAxICAgMTIzNDU2Nzg5MDEyMzQ1NiA2RS0xOSAgLT4gMTIzNDU2Nzg5MDEyMzQ1NiAgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDIxIGZtYSAgMSAgIDEyMzQ1Njc4OTAxMjM0NTYgNkUtMjAgIC0+IDEyMzQ1Njc4OTAxMjM0NTYgIEluZXhhY3QgUm91bmRlZAorCistLSB3aWRlbmluZyBzZWNvbmQgYXJndW1lbnQgYXQgZ2FwCitmbWF4MzYyMDMwIGZtYSAgMSAgIDEyMzQ1Njc4IDEgICAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc5CitmbWF4MzYyMDMxIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMSAgICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEKK2ZtYXgzNjIwMzIgZm1hICAxICAgMTIzNDU2NzggMC4xMiAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIKK2ZtYXgzNjIwMzMgZm1hICAxICAgMTIzNDU2NzggMC4xMjMgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzCitmbWF4MzYyMDM0IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNCAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQKK2ZtYXgzNjIwMzUgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NSAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDUKK2ZtYXgzNjIwMzYgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTYgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2CitmbWF4MzYyMDM3IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2NyAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1NjcKK2ZtYXgzNjIwMzggZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3OCAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzgKK2ZtYXgzNjIwMzkgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODkgICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQwIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1ICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA0MSBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAgICAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNDIgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODUxICAgICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQzIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDEgICAgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA0NCBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMSAgICAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNDUgZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAxICAgICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQ2IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDEgICAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc5IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA0NyBmbWEgIDEgICAxMjM0NTY3OCAwLjEyMzQ1Njc4NTAwMDAwMSAgICAgICAtPiAxMjM0NTY3OC4xMjM0NTY3OSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNDggZm1hICAxICAgMTIzNDU2NzggMC4xMjM0NTY3ODUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMTIzNDU2NzkgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDQ5IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMTIzNDU2Nzg1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjEyMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTAxMjM0NTYKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK2ZtYXgzNjIwNTAgZm1hICAxICAgMTIzNDU2NzggMC4wMjM0NTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDIzNDU2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDUxIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAzNDU2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMzQ1Njc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA1MiBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDQ1Njc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDA0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNTMgZm1hICAxICAgMTIzNDU2NzggMC4wMDAwNTY3NzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDU2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDU0IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwMDA2Nzc1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwNjc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA1NSBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDAwMDc3NTAwMDAwMDAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDA3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNTYgZm1hICAxICAgMTIzNDU2NzggMC4wMDAwMDAwNzUwMDAwMDAwICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDU3IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwMDAwMDA1MDAwMDAwMCAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA2MCBmbWEgIDEgICAxMjM0NTY3OCAwLjAyMzQ1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMjM0NTY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNjEgZm1hICAxICAgMTIzNDU2NzggMC4wMDM0NTY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAzNDU2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDYyIGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwNDU2Nzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDQ1Njc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA2MyBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDA1Njc3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwNTY3OCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNjQgZm1hICAxICAgMTIzNDU2NzggMC4wMDAwMDY3NzUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDA2NzggSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDY1IGZtYSAgMSAgIDEyMzQ1Njc4IDAuMDAwMDAwNzc1MDAwMDAwMSAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDc4IEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA2NiBmbWEgIDEgICAxMjM0NTY3OCAwLjAwMDAwMDA3NTAwMDAwMDEgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwOCBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNjcgZm1hICAxICAgMTIzNDU2NzggMC4wMDAwMDAwMDUwMDAwMDAxICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCistLSBmYXItb3V0IHJlc2lkdWVzIChmdWxsIGNvZWZmaWNpZW50IGdhcCBpcyAxNisxNSBkaWdpdHMpCityb3VuZGluZzogdXAKK2ZtYXgzNjIwNzAgZm1hICAxICAgMTIzNDU2NzggMUUtOCAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEKK2ZtYXgzNjIwNzEgZm1hICAxICAgMTIzNDU2NzggMUUtOSAgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDcyIGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTEwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA3MyBmbWEgIDEgICAxMjM0NTY3OCAxRS0xMSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNzQgZm1hICAxICAgMTIzNDU2NzggMUUtMTIgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDc1IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTEzICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA3NiBmbWEgIDEgICAxMjM0NTY3OCAxRS0xNCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwNzcgZm1hICAxICAgMTIzNDU2NzggMUUtMTUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDc4IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTE2ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA3OSBmbWEgIDEgICAxMjM0NTY3OCAxRS0xNyAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwODAgZm1hICAxICAgMTIzNDU2NzggMUUtMTggICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDgxIGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTE5ICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4MiBmbWEgIDEgICAxMjM0NTY3OCAxRS0yMCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwODMgZm1hICAxICAgMTIzNDU2NzggMUUtMjUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDg0IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTMwICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4NSBmbWEgIDEgICAxMjM0NTY3OCAxRS0zMSAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwODYgZm1hICAxICAgMTIzNDU2NzggMUUtMzIgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCitmbWF4MzYyMDg3IGZtYSAgMSAgIDEyMzQ1Njc4IDFFLTMzICAgICAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4LjAwMDAwMDAxIEluZXhhY3QgUm91bmRlZAorZm1heDM2MjA4OCBmbWEgIDEgICAxMjM0NTY3OCAxRS0zNCAgICAgICAgICAgICAgICAgICAtPiAxMjM0NTY3OC4wMDAwMDAwMSBJbmV4YWN0IFJvdW5kZWQKK2ZtYXgzNjIwODkgZm1hICAxICAgMTIzNDU2NzggMUUtMzUgICAgICAgICAgICAgICAgICAgLT4gMTIzNDU2NzguMDAwMDAwMDEgSW5leGFjdCBSb3VuZGVkCisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZSB4MworcHJlY2lzaW9uOiA1CitmbWF4MzYzMDAwIGZtYSAgMSAxICBzTmFOMTIzNDU2Nzg5MCAgICAgLT4gIE5hTjY3ODkwICBJbnZhbGlkX29wZXJhdGlvbgorZm1heDM2MzAwMSBmbWEgICAgMSAtc05hTjEyMzQ1MTIzNDUgMSAgIC0+IC1OYU4xMjM0NSAgSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzNjMwMDIgZm1hICAgICAgIHNOYU4xMjM0NTU0MzIxIDEgMSAtPiAgTmFONTQzMjEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK2ZtYXgzOTk5MCBmbWEgIDEgICAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ZtYXgzOTk5MSBmbWEgIDEgICAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvaW5leGFjdC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9pbmV4YWN0LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjZWFlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvaW5leGFjdC5kZWNUZXN0CkBAIC0wLDAgKzEsMjE1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGluZXhhY3QuZGVjVGVzdCAtLSBkZWNpbWFsIGluZXhhY3QgYW5kIHJvdW5kZWQgZWRnZSBjYXNlcyAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworaW54MDAxIGFkZCAxICAgICAgICAgIDEgICAgICAgICAgICAgIC0+IDIKK2lueDAwMiBhZGQgMTIzNDU2Nzg5ICAwICAgICAgICAgICAgICAtPiAxMjM0NTY3ODkKK2lueDAwMyBhZGQgMTIzNDU2Nzg5ICAwLjAgICAgICAgICAgICAtPiAxMjM0NTY3ODkgUm91bmRlZAoraW54MDA0IGFkZCAxMjM0NTY3ODkgIDAuMDAgICAgICAgICAgIC0+IDEyMzQ1Njc4OSBSb3VuZGVkCitpbngwMDUgYWRkIDEyMzQ1Njc4OSAgMSAgICAgICAgICAgICAgLT4gMTIzNDU2NzkwCitpbngwMDYgYWRkIDEyMzQ1Njc4OSAgMC4xICAgICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDA3IGFkZCAxMjM0NTY3ODkgIDAuMDEgICAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAwOCBhZGQgMTIzNDU2Nzg5ICAwLjAwMSAgICAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMDkgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDEgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDEwIGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAwMDAxICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAxMSBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwMDAwMDAwMSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCisKK2lueDAxMiBhZGQgMTIzNDU2Nzg5ICAwLjkgICAgICAgICAgICAtPiAxMjM0NTY3OTAgSW5leGFjdCBSb3VuZGVkCitpbngwMTMgYWRkIDEyMzQ1Njc4OSAgMC4wOSAgICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDE0IGFkZCAxMjM0NTY3ODkgIDAuMDA5ICAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAxNSBhZGQgMTIzNDU2Nzg5ICAwLjAwMDAwOSAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMTYgYWRkIDEyMzQ1Njc4OSAgMC4wMDAwMDAwMDkgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDE3IGFkZCAxMjM0NTY3ODkgIDAuMDAwMDAwMDAwMDA5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworaW54MDIxIGFkZCAxICAgICAgICAgIC0xICAgICAgICAgICAgICAtPiAwCitpbngwMjIgYWRkIDEyMzQ1Njc4OSAgLTAgICAgICAgICAgICAgIC0+IDEyMzQ1Njc4OQoraW54MDIzIGFkZCAxMjM0NTY3ODkgIC0wLjAgICAgICAgICAgICAtPiAxMjM0NTY3ODkgUm91bmRlZAoraW54MDI0IGFkZCAxMjM0NTY3ODkgIC0wLjAwICAgICAgICAgICAtPiAxMjM0NTY3ODkgUm91bmRlZAoraW54MDI1IGFkZCAxMjM0NTY3ODkgIC0xICAgICAgICAgICAgICAtPiAxMjM0NTY3ODgKK2lueDAyNiBhZGQgMTIzNDU2Nzg5ICAtMC4xICAgICAgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDI3IGFkZCAxMjM0NTY3ODkgIC0wLjAxICAgICAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMjggYWRkIDEyMzQ1Njc4OSAgLTAuMDAxICAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAyOSBhZGQgMTIzNDU2Nzg5ICAtMC4wMDAwMDEgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDMwIGFkZCAxMjM0NTY3ODkgIC0wLjAwMDAwMDAwMSAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMzEgYWRkIDEyMzQ1Njc4OSAgLTAuMDAwMDAwMDAwMDAxIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAzMiBhZGQgMTIzNDU2Nzg5ICAtMC45ICAgICAgICAgICAgLT4gMTIzNDU2Nzg4IEluZXhhY3QgUm91bmRlZAoraW54MDMzIGFkZCAxMjM0NTY3ODkgIC0wLjA5ICAgICAgICAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMzQgYWRkIDEyMzQ1Njc4OSAgLTAuMDA5ICAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDAzNSBhZGQgMTIzNDU2Nzg5ICAtMC4wMDAwMDkgICAgICAgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDM2IGFkZCAxMjM0NTY3ODkgIC0wLjAwMDAwMDAwOSAgICAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwMzcgYWRkIDEyMzQ1Njc4OSAgLTAuMDAwMDAwMDAwMDA5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKKworaW54MDQyIGFkZCAgMCAgICAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkKK2lueDA0MyBhZGQgIDAuMCAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IFJvdW5kZWQKK2lueDA0NCBhZGQgIDAuMDAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IFJvdW5kZWQKK2lueDA0NSBhZGQgIDEgICAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2NzkwCitpbngwNDYgYWRkICAwLjEgICAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA0NyBhZGQgIDAuMDEgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDQ4IGFkZCAgMC4wMDEgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNDkgYWRkICAwLjAwMDAwMSAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA1MCBhZGQgIDAuMDAwMDAwMDAxICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDUxIGFkZCAgMC4wMDAwMDAwMDAwMDEgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNTIgYWRkICAwLjkgICAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc5MCBJbmV4YWN0IFJvdW5kZWQKK2lueDA1MyBhZGQgIDAuMDkgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDU0IGFkZCAgMC4wMDkgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNTUgYWRkICAwLjAwMDAwOSAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA1NiBhZGQgIDAuMDAwMDAwMDA5ICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDU3IGFkZCAgMC4wMDAwMDAwMDAwMDkgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCisKK2lueDA2MiBhZGQgIC0wICAgICAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5CitpbngwNjMgYWRkICAtMC4wICAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBSb3VuZGVkCitpbngwNjQgYWRkICAtMC4wMCAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBSb3VuZGVkCitpbngwNjUgYWRkICAtMSAgICAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OAoraW54MDY2IGFkZCAgLTAuMSAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNjcgYWRkICAtMC4wMSAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA2OCBhZGQgIC0wLjAwMSAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDY5IGFkZCAgLTAuMDAwMDAxICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNzAgYWRkICAtMC4wMDAwMDAwMDEgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA3MSBhZGQgIC0wLjAwMDAwMDAwMDAwMSAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDcyIGFkZCAgLTAuOSAgICAgICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODggSW5leGFjdCBSb3VuZGVkCitpbngwNzMgYWRkICAtMC4wOSAgICAgICAgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA3NCBhZGQgIC0wLjAwOSAgICAgICAgICAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAoraW54MDc1IGFkZCAgLTAuMDAwMDA5ICAgICAgIDEyMzQ1Njc4OSAtPiAxMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitpbngwNzYgYWRkICAtMC4wMDAwMDAwMDkgICAgMTIzNDU2Nzg5IC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK2lueDA3NyBhZGQgIC0wLjAwMDAwMDAwMDAwOSAxMjM0NTY3ODkgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorCistLSBzb21lIGJvdW5kYXJpZXMKK2lueDA4MSBhZGQgICAgOTk5OTk5OTk5ICAgICAgICAgICAwICAgICAtPiA5OTk5OTk5OTkKK2lueDA4MiBhZGQgIDAuOTk5OTk5OTk5IDAuMDAwMDAwMDAwICAgICAtPiAwLjk5OTk5OTk5OQoraW54MDgzIGFkZCAgICA5OTk5OTk5OTkgICAgICAgICAgIDEgICAgIC0+IDEuMDAwMDAwMDBFKzkgUm91bmRlZAoraW54MDg0IGFkZCAgMC45OTk5OTk5OTkgMC4wMDAwMDAwMDEgICAgIC0+IDEuMDAwMDAwMDAgICAgUm91bmRlZAoraW54MDg1IGFkZCAgICA5OTk5OTk5OTkgICAgICAgICAgIDIgICAgIC0+IDEuMDAwMDAwMDBFKzkgSW5leGFjdCBSb3VuZGVkCitpbngwODYgYWRkICAwLjk5OTk5OTk5OSAwLjAwMDAwMDAwMiAgICAgLT4gMS4wMDAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK2lueDA4NyBhZGQgICAgOTk5OTk5OTk5ICAgICAgICAgICAzICAgICAtPiAxLjAwMDAwMDAwRSs5IEluZXhhY3QgUm91bmRlZAoraW54MDg5IGFkZCAgMC45OTk5OTk5OTkgMC4wMDAwMDAwMDMgICAgIC0+IDEuMDAwMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG1pbnVzLCBwbHVzLCBhbmQgc3VidHJhY3QgYWxsIGFzc3VtZWQgdG8gd29yayBsaWtlIGFkZC4KKworLS0gbXVsdGlwbHkKK3ByZWNpc2lvbjogOAoraW54MTAxIG11bHRpcGx5ICAxMDAwICAxMDAwICAgICAgICAtPiAgMTAwMDAwMAoraW54MTAyIG11bHRpcGx5ICA5MDAwICA5MDAwICAgICAgICAtPiA4MTAwMDAwMAoraW54MTAzIG11bHRpcGx5ICA5OTk5ICA5OTk5ICAgICAgICAtPiA5OTk4MDAwMQoraW54MTA0IG11bHRpcGx5ICAxMDAwIDEwMDAwICAgICAgICAtPiAxMDAwMDAwMAoraW54MTA1IG11bHRpcGx5IDEwMDAwIDEwMDAwICAgICAgICAtPiAxLjAwMDAwMDBFKzggUm91bmRlZAoraW54MTA2IG11bHRpcGx5IDEwMDAxIDEwMDAwICAgICAgICAtPiAxLjAwMDEwMDBFKzggUm91bmRlZAoraW54MTA3IG11bHRpcGx5IDEwMDAxIDEwMDAxICAgICAgICAtPiAxLjAwMDIwMDBFKzggSW5leGFjdCBSb3VuZGVkCitpbngxMDggbXVsdGlwbHkgMTAxMDEgMTAwMDEgICAgICAgIC0+IDEuMDEwMjAxMEUrOCBJbmV4YWN0IFJvdW5kZWQKK2lueDEwOSBtdWx0aXBseSAxMDAwMSAxMDEwMSAgICAgICAgLT4gMS4wMTAyMDEwRSs4IEluZXhhY3QgUm91bmRlZAorCistLSBkaXZpZGUKK3ByZWNpc2lvbjogNAoraW54MjAxIGRpdmlkZSAgMTAwMCAgMTAwMCAgICAgICAgLT4gIDEKK2lueDIwMiBkaXZpZGUgIDEwMDAgICAgIDEgICAgICAgIC0+ICAxMDAwCitpbngyMDMgZGl2aWRlICAxMDAwICAgICAyICAgICAgICAtPiAgIDUwMAoraW54MjA0IGRpdmlkZSAgMTAwMCAgICAgMyAgICAgICAgLT4gICAzMzMuMyAgSW5leGFjdCBSb3VuZGVkCitpbngyMDUgZGl2aWRlICAxMDAwICAgICA0ICAgICAgICAtPiAgIDI1MAoraW54MjA2IGRpdmlkZSAgMTAwMCAgICAgNSAgICAgICAgLT4gICAyMDAKK2lueDIwNyBkaXZpZGUgIDEwMDAgICAgIDYgICAgICAgIC0+ICAgMTY2LjcgIEluZXhhY3QgUm91bmRlZAoraW54MjA4IGRpdmlkZSAgMTAwMCAgICAgNyAgICAgICAgLT4gICAxNDIuOSAgSW5leGFjdCBSb3VuZGVkCitpbngyMDkgZGl2aWRlICAxMDAwICAgICA4ICAgICAgICAtPiAgIDEyNQoraW54MjEwIGRpdmlkZSAgMTAwMCAgICAgOSAgICAgICAgLT4gICAxMTEuMSAgSW5leGFjdCBSb3VuZGVkCitpbngyMTEgZGl2aWRlICAxMDAwICAgIDEwICAgICAgICAtPiAgIDEwMAorCitpbngyMjAgZGl2aWRlICAgICAxICAgICAxICAgICAgICAtPiAgIDEKK2lueDIyMSBkaXZpZGUgICAgIDEgICAgIDIgICAgICAgIC0+ICAgMC41CitpbngyMjIgZGl2aWRlICAgICAxICAgICA0ICAgICAgICAtPiAgIDAuMjUKK2lueDIyMyBkaXZpZGUgICAgIDEgICAgIDggICAgICAgIC0+ICAgMC4xMjUKK2lueDIyNCBkaXZpZGUgICAgIDEgICAgMTYgICAgICAgIC0+ICAgMC4wNjI1CitpbngyMjUgZGl2aWRlICAgICAxICAgIDMyICAgICAgICAtPiAgIDAuMDMxMjUKK2lueDIyNiBkaXZpZGUgICAgIDEgICAgNjQgICAgICAgIC0+ICAgMC4wMTU2MyAgSW5leGFjdCBSb3VuZGVkCitpbngyMjcgZGl2aWRlICAgICAxICAgMTI4ICAgICAgICAtPiAgIDAuMDA3ODEzIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDUKK2lueDIzMCBkaXZpZGUgICAgIDEgICAgIDEgICAgICAgIC0+ICAgMQoraW54MjMxIGRpdmlkZSAgICAgMSAgICAgMiAgICAgICAgLT4gICAwLjUKK2lueDIzMiBkaXZpZGUgICAgIDEgICAgIDQgICAgICAgIC0+ICAgMC4yNQoraW54MjMzIGRpdmlkZSAgICAgMSAgICAgOCAgICAgICAgLT4gICAwLjEyNQoraW54MjM0IGRpdmlkZSAgICAgMSAgICAxNiAgICAgICAgLT4gICAwLjA2MjUKK2lueDIzNSBkaXZpZGUgICAgIDEgICAgMzIgICAgICAgIC0+ICAgMC4wMzEyNQoraW54MjM2IGRpdmlkZSAgICAgMSAgICA2NCAgICAgICAgLT4gICAwLjAxNTYyNQoraW54MjM3IGRpdmlkZSAgICAgMSAgIDEyOCAgICAgICAgLT4gICAwLjAwNzgxMjUKKworcHJlY2lzaW9uOiAzCitpbngyNDAgZGl2aWRlICAgICAxICAgICAxICAgICAgICAtPiAgIDEKK2lueDI0MSBkaXZpZGUgICAgIDEgICAgIDIgICAgICAgIC0+ICAgMC41CitpbngyNDIgZGl2aWRlICAgICAxICAgICA0ICAgICAgICAtPiAgIDAuMjUKK2lueDI0MyBkaXZpZGUgICAgIDEgICAgIDggICAgICAgIC0+ICAgMC4xMjUKK2lueDI0NCBkaXZpZGUgICAgIDEgICAgMTYgICAgICAgIC0+ICAgMC4wNjI1CitpbngyNDUgZGl2aWRlICAgICAxICAgIDMyICAgICAgICAtPiAgIDAuMDMxMyAgIEluZXhhY3QgUm91bmRlZAoraW54MjQ2IGRpdmlkZSAgICAgMSAgICA2NCAgICAgICAgLT4gICAwLjAxNTYgICBJbmV4YWN0IFJvdW5kZWQKK2lueDI0NyBkaXZpZGUgICAgIDEgICAxMjggICAgICAgIC0+ICAgMC4wMDc4MSAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMgoraW54MjUwIGRpdmlkZSAgICAgMSAgICAgMSAgICAgICAgLT4gICAxCitpbngyNTEgZGl2aWRlICAgICAxICAgICAyICAgICAgICAtPiAgIDAuNQoraW54MjUyIGRpdmlkZSAgICAgMSAgICAgNCAgICAgICAgLT4gICAwLjI1CitpbngyNTMgZGl2aWRlICAgICAxICAgICA4ICAgICAgICAtPiAgIDAuMTMgICAgIEluZXhhY3QgUm91bmRlZAoraW54MjU0IGRpdmlkZSAgICAgMSAgICAxNiAgICAgICAgLT4gICAwLjA2MyAgICBJbmV4YWN0IFJvdW5kZWQKK2lueDI1NSBkaXZpZGUgICAgIDEgICAgMzIgICAgICAgIC0+ICAgMC4wMzEgICAgSW5leGFjdCBSb3VuZGVkCitpbngyNTYgZGl2aWRlICAgICAxICAgIDY0ICAgICAgICAtPiAgIDAuMDE2ICAgIEluZXhhY3QgUm91bmRlZAoraW54MjU3IGRpdmlkZSAgICAgMSAgIDEyOCAgICAgICAgLT4gICAwLjAwNzggICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxCitpbngyNjAgZGl2aWRlICAgICAxICAgICAxICAgICAgICAtPiAgIDEKK2lueDI2MSBkaXZpZGUgICAgIDEgICAgIDIgICAgICAgIC0+ICAgMC41CitpbngyNjIgZGl2aWRlICAgICAxICAgICA0ICAgICAgICAtPiAgIDAuMyAgICAgIEluZXhhY3QgUm91bmRlZAoraW54MjYzIGRpdmlkZSAgICAgMSAgICAgOCAgICAgICAgLT4gICAwLjEgICAgICBJbmV4YWN0IFJvdW5kZWQKK2lueDI2NCBkaXZpZGUgICAgIDEgICAgMTYgICAgICAgIC0+ICAgMC4wNiAgICAgSW5leGFjdCBSb3VuZGVkCitpbngyNjUgZGl2aWRlICAgICAxICAgIDMyICAgICAgICAtPiAgIDAuMDMgICAgIEluZXhhY3QgUm91bmRlZAoraW54MjY2IGRpdmlkZSAgICAgMSAgICA2NCAgICAgICAgLT4gICAwLjAyICAgICBJbmV4YWN0IFJvdW5kZWQKK2lueDI2NyBkaXZpZGUgICAgIDEgICAxMjggICAgICAgIC0+ICAgMC4wMDggICAgSW5leGFjdCBSb3VuZGVkCisKKworLS0gcG93ZXIKK3ByZWNpc2lvbjogNAoraW54MzAxIHBvd2VyICAgIDAuNSAgICAgMiAgICAgICAgLT4gICAwLjI1CitpbngzMDIgcG93ZXIgICAgMC41ICAgICA0ICAgICAgICAtPiAgIDAuMDYyNQoraW54MzAzIHBvd2VyICAgIDAuNSAgICAgOCAgICAgICAgLT4gICAwLjAwMzkwNiAgIEluZXhhY3QgUm91bmRlZAoraW54MzA0IHBvd2VyICAgIDAuNSAgICAxNiAgICAgICAgLT4gICAwLjAwMDAxNTI2IEluZXhhY3QgUm91bmRlZAoraW54MzA1IHBvd2VyICAgIDAuNSAgICAzMiAgICAgICAgLT4gICAyLjMyOEUtMTAgIEluZXhhY3QgUm91bmRlZAorCistLSBjb21wYXJlLCBkaXZpZGVJbnRlZ2VyLCBhbmQgcmVtYWluZGVyIGFyZSBhbHdheXMgZXhhY3QKKworLS0gcmVzY2FsZQorcHJlY2lzaW9uOiA0Citpbng0MDEgcmVzY2FsZSAwICAgICAgIDAgICAtPiAwCitpbng0MDIgcmVzY2FsZSAxICAgICAgIDAgICAtPiAxCitpbng0MDMgcmVzY2FsZSAwLjEgICAgKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAoraW54NDA0IHJlc2NhbGUgMC4xICAgICsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK2lueDQwNSByZXNjYWxlIDAuMSAgICAgMCAgIC0+IDAgSW5leGFjdCBSb3VuZGVkCitpbng0MDYgcmVzY2FsZSAwLjEgICAgLTEgICAtPiAwLjEKK2lueDQwNyByZXNjYWxlIDAuMSAgICAtMiAgIC0+IDAuMTAKKworLS0gbG9uZyBvcGVyYW5kcyBjYXVzZSByb3VuZGluZyB0b28KK3ByZWNpc2lvbjogOQoraW54ODAxIHBsdXMgIDEyMzQ1Njc4OSAgLT4gMTIzNDU2Nzg5Citpbng4MDIgcGx1cyAgMTIzNDU2Nzg5MCAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK2lueDgwMyBwbHVzICAxMjM0NTY3ODkxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitpbng4MDQgcGx1cyAgMTIzNDU2Nzg5MiAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAoraW54ODA1IHBsdXMgIDEyMzQ1Njc4OTkgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK2lueDgwNiBwbHVzICAxMjM0NTY3OTAwIC0+IDEuMjM0NTY3OTBFKzkgUm91bmRlZAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2ludmVydC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9pbnZlcnQuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmY3YmU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9pbnZlcnQuZGVjVGVzdApAQCAtMCwwICsxLDE3NiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBpbnZlcnQuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBJTlZFUlQgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNhbml0eSBjaGVjayAodHJ1dGggdGFibGUpLCBhbmQgZXhhbXBsZXMgZnJvbSBkZWNBcml0aAoraW52eDAwMSBpbnZlcnQgICAgICAgICAgICAgMCAtPiAxMTExMTExMTEKK2ludngwMDIgaW52ZXJ0ICAgICAgICAgICAgIDEgLT4gMTExMTExMTEwCitpbnZ4MDAzIGludmVydCAgICAgICAgICAgIDEwIC0+IDExMTExMTEwMQoraW52eDAwNCBpbnZlcnQgICAgIDExMTExMTExMSAtPiAgICAgICAgIDAKK2ludngwMDUgaW52ZXJ0ICAgICAwMDAwMDAwMDAgLT4gMTExMTExMTExCitpbnZ4MDA2IGludmVydCAgICAgMTAxMDEwMTAxIC0+ICcxMDEwMTAxMCcKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCitpbnZ4MDA3IGludmVydCAwMDAwMDAwMDAgLT4gICAxMTExMTExMTEKK2ludngwMDkgaW52ZXJ0IDEwMDAwMDAwMCAtPiAgICAxMTExMTExMQoraW52eDAxMSBpbnZlcnQgMDAwMDAwMDAwIC0+ICAgMTExMTExMTExCitpbnZ4MDEzIGludmVydCAwMTAwMDAwMDAgLT4gICAxMDExMTExMTEKKworLS0gVmFyaW91cyBsZW5ndGhzCistLSAgICAgICAgICAgICAxMjM0NTY3ODkgICAgICAgICAxMjM0NTY3ODkKK2ludngwMjEgaW52ZXJ0IDExMTExMTExMSAgICAgLT4gIDAKK2ludngwMjIgaW52ZXJ0IDExMTExMTExMTExMSAgLT4gIDAKK2ludngwMjMgaW52ZXJ0ICAxMTExMTExMSAgICAgLT4gIDEwMDAwMDAwMAoraW52eDAyNSBpbnZlcnQgICAxMTExMTExICAgICAtPiAgMTEwMDAwMDAwCitpbnZ4MDI2IGludmVydCAgICAxMTExMTEgICAgIC0+ICAxMTEwMDAwMDAKK2ludngwMjcgaW52ZXJ0ICAgICAxMTExMSAgICAgLT4gIDExMTEwMDAwMAoraW52eDAyOCBpbnZlcnQgICAgICAxMTExICAgICAtPiAgMTExMTEwMDAwCitpbnZ4MDI5IGludmVydCAgICAgICAxMTEgICAgIC0+ICAxMTExMTEwMDAKK2ludngwMzEgaW52ZXJ0ICAgICAgICAxMSAgICAgLT4gIDExMTExMTEwMAoraW52eDAzMiBpbnZlcnQgICAgICAgICAxICAgICAtPiAgMTExMTExMTEwCitpbnZ4MDMzIGludmVydCAxMTExMTExMTExMTEgIC0+ICAwCitpbnZ4MDM0IGludmVydCAxMTExMTExMTExMSAgIC0+ICAwCitpbnZ4MDM1IGludmVydCAxMTExMTExMTExICAgIC0+ICAwCitpbnZ4MDM2IGludmVydCAxMTExMTExMTEgICAgIC0+ICAwCisKK2ludngwODAgaW52ZXJ0IDAxMTExMTExMSAgIC0+ICAxMDAwMDAwMDAKK2ludngwODEgaW52ZXJ0IDEwMTExMTExMSAgIC0+ICAgMTAwMDAwMDAKK2ludngwODIgaW52ZXJ0IDExMDExMTExMSAgIC0+ICAgIDEwMDAwMDAKK2ludngwODMgaW52ZXJ0IDExMTAxMTExMSAgIC0+ICAgICAxMDAwMDAKK2ludngwODQgaW52ZXJ0IDExMTEwMTExMSAgIC0+ICAgICAgMTAwMDAKK2ludngwODUgaW52ZXJ0IDExMTExMDExMSAgIC0+ICAgICAgIDEwMDAKK2ludngwODYgaW52ZXJ0IDExMTExMTAxMSAgIC0+ICAgICAgICAxMDAKK2ludngwODcgaW52ZXJ0IDExMTExMTEwMSAgIC0+ICAgICAgICAgMTAKK2ludngwODggaW52ZXJ0IDExMTExMTExMCAgIC0+ICAgICAgICAgIDEKK2ludngwODkgaW52ZXJ0IDAxMTExMTAxMSAgIC0+ICAxMDAwMDAxMDAKK2ludngwOTAgaW52ZXJ0IDEwMTExMTEwMSAgIC0+ICAgMTAwMDAwMTAKK2ludngwOTEgaW52ZXJ0IDExMDExMTExMCAgIC0+ICAgIDEwMDAwMDEKK2ludngwOTIgaW52ZXJ0IDExMTAxMTEwMSAgIC0+ICAgICAxMDAwMTAKK2ludngwOTMgaW52ZXJ0IDExMTEwMTAxMSAgIC0+ICAgICAgMTAxMDAKK2ludngwOTQgaW52ZXJ0IDExMTExMDExMSAgIC0+ICAgICAgIDEwMDAKK2ludngwOTUgaW52ZXJ0IDExMTEwMTAxMSAgIC0+ICAgICAgMTAxMDAKK2ludngwOTYgaW52ZXJ0IDExMTAxMTEwMSAgIC0+ICAgICAxMDAwMTAKK2ludngwOTcgaW52ZXJ0IDExMDExMTExMCAgIC0+ICAgIDEwMDAwMDEKK2ludngwOTggaW52ZXJ0IDEwMTExMTEwMSAgIC0+ICAgMTAwMDAwMTAKK2ludngwOTkgaW52ZXJ0IDAxMTExMTAxMSAgIC0+ICAxMDAwMDAxMDAKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitpbnZ4MjIwIGludmVydCAxMTExMTExMTIgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjIxIGludmVydCAzMzMzMzMzMzMgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjIyIGludmVydCA1NTU1NTU1NTUgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjIzIGludmVydCA3Nzc3Nzc3NzcgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjI0IGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjI1IGludmVydCAyMjIyMjIyMjIgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjI2IGludmVydCA0NDQ0NDQ0NDQgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjI3IGludmVydCA2NjY2NjY2NjYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjI4IGludmVydCA4ODg4ODg4ODggICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjI5IGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjMwIGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjMxIGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjMyIGludmVydCA5OTk5OTk5OTkgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBhIGZldyByYW5kb21zCitpbnZ4MjQwIGludmVydCAgNTY3NDY4Njg5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjQxIGludmVydCAgNTY3MzY3Njg5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjQyIGludmVydCAtNjMxOTE3NzcyICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjQzIGludmVydCAtNzU2MjUzMjU3ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjQ0IGludmVydCAgODM1NTkwMTQ5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAoraW52eDI1MCBpbnZlcnQgIDIwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI1MSBpbnZlcnQgIDMwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI1MiBpbnZlcnQgIDQwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI1MyBpbnZlcnQgIDUwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI1NCBpbnZlcnQgIDYwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI1NSBpbnZlcnQgIDcwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI1NiBpbnZlcnQgIDgwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI1NyBpbnZlcnQgIDkwMDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQoraW52eDI3MCBpbnZlcnQgIDAyMTAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI3MSBpbnZlcnQgIDAzMDEwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI3MiBpbnZlcnQgIDA0MDAxMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI3MyBpbnZlcnQgIDA1MDAwMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI3NCBpbnZlcnQgIDE2MDAwMDEwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI3NSBpbnZlcnQgIDE3MDAwMDAxMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI3NiBpbnZlcnQgIDE4MDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI3NyBpbnZlcnQgIDE5MDAwMDAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK2ludngyODAgaW52ZXJ0ICAwMDAwMDAwMDIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODEgaW52ZXJ0ICAwMDAwMDAwMDMgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODIgaW52ZXJ0ICAwMDAwMDAwMDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODMgaW52ZXJ0ICAwMDAwMDAwMDUgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODQgaW52ZXJ0ICAxMDEwMDAwMDYgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODUgaW52ZXJ0ICAxMDAxMDAwMDcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODYgaW52ZXJ0ICAxMDAwMTAwMDggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludngyODcgaW52ZXJ0ICAxMDAwMDEwMDkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCitpbnZ4Mjg4IGludmVydCAgMDAwMDIwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjg5IGludmVydCAgMDAwMDMwMDAxICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjkwIGludmVydCAgMDAwMDQwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjkxIGludmVydCAgMDAwMDUwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjkyIGludmVydCAgMTAxMDYwMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MjkzIGludmVydCAgMTAwMTcwMDEwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjk0IGludmVydCAgMTAwMDgwMTAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Mjk1IGludmVydCAgMTAwMDkxMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworaW52eDI5NiBpbnZlcnQgLTEwMDAwMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDI5OSBpbnZlcnQgIDEwMDAwMTAwMCAgLT4gIDExMTEwMTExCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitpbnZ4MzQxIGludmVydCAgOS45OTk5OTk5OUUrOTk5ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzQyIGludmVydCAgMUUtOTk5ICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzQzIGludmVydCAgMS4wMDAwMDAwMEUtOTk5ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzQ0IGludmVydCAgMUUtMTAwNyAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzQ1IGludmVydCAgLTFFLTEwMDcgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzQ2IGludmVydCAgLTEuMDAwMDAwMDBFLTk5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzQ3IGludmVydCAgLTFFLTk5OSAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4MzQ4IGludmVydCAgLTkuOTk5OTk5OTlFKzk5OSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEEgZmV3IG90aGVyIG5vbi1pbnRlZ2VycworaW52eDM2MSBpbnZlcnQgIDEuMCAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDM2MiBpbnZlcnQgIDFFKzEgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDM2MyBpbnZlcnQgIDAuMCAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDM2NCBpbnZlcnQgIDBFKzEgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDM2NSBpbnZlcnQgIDkuOSAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDM2NiBpbnZlcnQgIDlFKzEgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBBbGwgU3BlY2lhbHMgYXJlIGluIGVycm9yCitpbnZ4Nzg4IGludmVydCAtSW5mICAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4Nzk0IGludmVydCAgSW5mICAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODIxIGludmVydCAgTmFOICAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODQxIGludmVydCAgc05hTiAgICAtPiBOYU4gIEludmFsaWRfb3BlcmF0aW9uCistLSBwcm9wYWdhdGluZyBOYU5zCitpbnZ4ODYxIGludmVydCAgTmFOMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4NjIgaW52ZXJ0ICtOYU4yICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg2MyBpbnZlcnQgIE5hTjMgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODY0IGludmVydCAgTmFONCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4NjUgaW52ZXJ0ICBOYU41ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg3MSBpbnZlcnQgIHNOYU4xMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODcyIGludmVydCAgc05hTjEyICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4NzMgaW52ZXJ0ICBzTmFOMTMgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg3NCBpbnZlcnQgIHNOYU4xNCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODc1IGludmVydCAgc05hTjE1ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4NzYgaW52ZXJ0ICBOYU4xNiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoraW52eDg4MSBpbnZlcnQgK05hTjI1ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitpbnZ4ODgyIGludmVydCAtTmFOMjYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2ludng4ODMgaW52ZXJ0IC1zTmFOMjcgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9sbi5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9sbi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDJhZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xuLmRlY1Rlc3QKQEAgLTAsMCArMSw2MTEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbG4uZGVjVGVzdCAtLSBkZWNpbWFsIG5hdHVyYWwgbG9nYXJpdGhtICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBiYXNpY3MgKGV4YW1wbGVzIGluIHNwZWNpZmljYXRpb24pCitwcmVjaXNpb246IDkKK2xueHMwMDEgbG4gIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG54czAwMiBsbiAgMS4wMDAgICAgICAgICAgICAgLT4gICAwCitsbnhzMDAzIGxuICAyLjcxODI4MTgzICAgICAgICAtPiAgIDEuMDAwMDAwMDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueHMwMDQgbG4gIDEwICAgICAgICAgICAgICAgIC0+ICAgMi4zMDI1ODUwOSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54czAwNSBsbiArSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CisKKworLS0gYmFzaWNzCitwcmVjaXNpb246ICAgMTYKK2xueDAwMDEgbG4gIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG54MDAwMiBsbiAgMUUtOSAgICAgICAgICAgICAgLT4gLTIwLjcyMzI2NTgzNjk0NjQxICAgSW5leGFjdCBSb3VuZGVkCitsbngwMDAzIGxuICAwLjAwMDcgICAgICAgICAgICAtPiAgLTcuMjY0NDMwMjIyOTIwODY5ICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMDQgbG4gIDAuMSAgICAgICAgICAgICAgIC0+ICAtMi4zMDI1ODUwOTI5OTQwNDYgIEluZXhhY3QgUm91bmRlZAorbG54MDAwNSBsbiAgMC43ICAgICAgICAgICAgICAgLT4gIC0wLjM1NjY3NDk0MzkzODczMjQgSW5leGFjdCBSb3VuZGVkCitsbngwMDA2IGxuICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2xueDAwMDcgbG4gIDEuMDAwICAgICAgICAgICAgIC0+ICAgMAorbG54MDAwOCBsbiAgMS41ICAgICAgICAgICAgICAgLT4gICAwLjQwNTQ2NTEwODEwODE2NDQgSW5leGFjdCBSb3VuZGVkCitsbngwMDA5IGxuICAyICAgICAgICAgICAgICAgICAtPiAgIDAuNjkzMTQ3MTgwNTU5OTQ1MyBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMTAgbG4gIDIuNzE4MjgxODI4NDU5MDQ1IC0+ICAgMC45OTk5OTk5OTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorbG54MDAxMSBsbiAgMi43MTgyODE4Mjg0NTkwNDYgLT4gICAxLjAwMDAwMDAwMDAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitsbngwMDEyIGxuICAyLjcxODI4MTgyODQ1OTA0NyAtPiAgIDEuMDAwMDAwMDAwMDAwMDAxICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMTMgbG4gIDEwICAgICAgICAgICAgICAgIC0+ICAgMi4zMDI1ODUwOTI5OTQwNDYgIEluZXhhY3QgUm91bmRlZAorbG54MDAxNCBsbiAgMTAuNSAgICAgICAgICAgICAgLT4gICAyLjM1MTM3NTI1NzE2MzQ3OCAgSW5leGFjdCBSb3VuZGVkCitsbngwMDE1IGxuICA5OTk5ICAgICAgICAgICAgICAtPiAgIDkuMjEwMjQwMzY2OTc1ODQ5ICBJbmV4YWN0IFJvdW5kZWQKK2xueDAwMTYgbG4gIDFFNiAgICAgICAgICAgICAgIC0+ICAxMy44MTU1MTA1NTc5NjQyNyAgIEluZXhhY3QgUm91bmRlZAorbG54MDAxNyBsbiAgMUUrOSAgICAgICAgICAgICAgLT4gIDIwLjcyMzI2NTgzNjk0NjQxICAgSW5leGFjdCBSb3VuZGVkCitsbngwMDE4IGxuICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gbm90YWJsZSBjYXNlcworLS0gbmVnYXRpdmVzCitsbngwMDIxIGxuIC0xRS05ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xueDAwMjIgbG4gLTAuMDAwNyAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAyMyBsbiAtMC4xICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDI0IGxuIC0wLjcgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xueDAwMjUgbG4gLTEgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAyNiBsbiAtMS41ICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDI3IGxuIC0yICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xueDAwMjkgbG4gLTEwLjUgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAyOCBsbiAtOTk5OSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsbngwMDMwIGxuIC0yLjcxODI4MTgyODQ1OTA0NSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK2xueDAwMzEgbG4gLTIuNzE4MjgxODI4NDU5MDQ2IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDAzMiBsbiAtMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbngwMDMzIGxuIC0wRSsxNyAgICAgICAgICAgICAtPiAtSW5maW5pdHkKK2xueDAwMzQgbG4gLTBFLTE3ICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorLS0gb3RoZXIgemVyb3MKK2xueDAwNDEgbG4gIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG54MDA0MiBsbiAgMEUrMTcgICAgICAgICAgICAgLT4gLUluZmluaXR5CitsbngwMDQzIGxuICAwRS0xNyAgICAgICAgICAgICAtPiAtSW5maW5pdHkKKy0tIGluZmluaXRpZXMKK2xueDAwNDUgbG4gLUluZmluaXR5ICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG54MDA0NiBsbiArSW5maW5pdHkgICAgICAgICAgLT4gSW5maW5pdHkKKy0tIG9uZXMKK2xueDAwNTAgbG4gIDEgICAgICAgICAgICAgICAgIC0+ICAgMAorbG54MDA1MSBsbiAgMS4wICAgICAgICAgICAgICAgLT4gICAwCitsbngwMDUyIGxuICAxLjAwMDAwMDAwMDAwMDAwMCAtPiAgIDAKK2xueDAwNTMgbG4gIDEuMDAwMDAwMDAwMDAwMDAwMDAwIC0+ICAgMAorCistLSBsb3dlciBwcmVjaXNpb24gYmFzaWNzCitQcmVjaXNpb246IDcKK2xueDAxMDEgbG4gIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG54MDEwMiBsbiAgMUUtOSAgICAgICAgICAgICAgLT4gLTIwLjcyMzI3ICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTAzIGxuICAwLjAwMDcgICAgICAgICAgICAtPiAgLTcuMjY0NDMwICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMDQgbG4gIDAuMSAgICAgICAgICAgICAgIC0+ICAtMi4zMDI1ODUgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEwNSBsbiAgMC43ICAgICAgICAgICAgICAgLT4gIC0wLjM1NjY3NDkgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTA2IGxuICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2xueDAxMDcgbG4gIDEuNSAgICAgICAgICAgICAgIC0+ICAgMC40MDU0NjUxICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEwOCBsbiAgMiAgICAgICAgICAgICAgICAgLT4gICAwLjY5MzE0NzIgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTA5IGxuICAyLjcxODI4MTgyODQ1OTA0NSAtPiAgIDEuMDAwMDAwICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMTAgbG4gIDIuNzE4MjgxODI4NDU5MDQ2IC0+ICAgMS4wMDAwMDAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDExMSBsbiAgMi43MTgyODE4Mjg0NTkwNDcgLT4gICAxLjAwMDAwMCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTEyIGxuICAxMCAgICAgICAgICAgICAgICAtPiAgIDIuMzAyNTg1ICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMTMgbG4gIDEwLjUgICAgICAgICAgICAgIC0+ICAgMi4zNTEzNzUgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDExNCBsbiAgOTk5OSAgICAgICAgICAgICAgLT4gICA5LjIxMDI0MCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTE1IGxuICAxRTYgICAgICAgICAgICAgICAtPiAgMTMuODE1NTEgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMTYgbG4gIDFFKzkgICAgICAgICAgICAgIC0+ICAyMC43MjMyNyAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDExNyBsbiArSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CitQcmVjaXNpb246IDIKK2xueDAxMjEgbG4gIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG54MDEyMiBsbiAgMUUtOSAgICAgICAgICAgICAgLT4gLTIxICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTIzIGxuICAwLjAwMDcgICAgICAgICAgICAtPiAgLTcuMyAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMjQgbG4gIDAuMSAgICAgICAgICAgICAgIC0+ICAtMi4zICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEyNSBsbiAgMC43ICAgICAgICAgICAgICAgLT4gIC0wLjM2ICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTI2IGxuICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2xueDAxMjcgbG4gIDEuNSAgICAgICAgICAgICAgIC0+ICAgMC40MSAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEyOCBsbiAgMiAgICAgICAgICAgICAgICAgLT4gICAwLjY5ICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTI5IGxuICAyLjcxODI4MTgyODQ1OTA0NSAtPiAgIDEuMCAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMzAgbG4gIDIuNzE4MjgxODI4NDU5MDQ2IC0+ICAgMS4wICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEzMSBsbiAgMi43MTgyODE4Mjg0NTkwNDcgLT4gICAxLjAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTMyIGxuICAxMCAgICAgICAgICAgICAgICAtPiAgIDIuMyAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMzMgbG4gIDEwLjUgICAgICAgICAgICAgIC0+ICAgMi40ICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEzNCBsbiAgOTk5OSAgICAgICAgICAgICAgLT4gICA5LjIgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTM1IGxuICAxRTYgICAgICAgICAgICAgICAtPiAgMTQgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxMzYgbG4gIDFFKzkgICAgICAgICAgICAgIC0+ICAyMSAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEzNyBsbiArSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CitQcmVjaXNpb246IDEKK2xueDAxNDEgbG4gIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG54MDE0MiBsbiAgMUUtOSAgICAgICAgICAgICAgLT4gLTJFKzEgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTQzIGxuICAwLjAwMDcgICAgICAgICAgICAtPiAgLTcgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNDQgbG4gIDAuMSAgICAgICAgICAgICAgIC0+ICAtMiAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE0NSBsbiAgMC43ICAgICAgICAgICAgICAgLT4gIC0wLjQgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTQ2IGxuICAxICAgICAgICAgICAgICAgICAtPiAgIDAKK2xueDAxNDcgbG4gIDEuNSAgICAgICAgICAgICAgIC0+ICAgMC40ICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE0OCBsbiAgMiAgICAgICAgICAgICAgICAgLT4gICAwLjcgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTQ5IGxuICAyLjcxODI4MTgyODQ1OTA0NSAtPiAgIDEgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNTAgbG4gIDIuNzE4MjgxODI4NDU5MDQ2IC0+ICAgMSAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE1MSBsbiAgMi43MTgyODE4Mjg0NTkwNDcgLT4gICAxICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTUyIGxuICAxMCAgICAgICAgICAgICAgICAtPiAgIDIgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNTMgbG4gIDEwLjUgICAgICAgICAgICAgIC0+ICAgMiAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE1NCBsbiAgOTk5OSAgICAgICAgICAgICAgLT4gICA5ICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwMTU1IGxuICAxRTYgICAgICAgICAgICAgICAtPiAgMUUrMSAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDAxNTYgbG4gIDFFKzkgICAgICAgICAgICAgIC0+ICAyRSsxICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE1NyBsbiArSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CisKKy0tIGdyb3VwIGxvdy1wcmVjaXNpb24gbG4oMSlzOgorcHJlY2lzaW9uOiAxCitsbngwMTYxIGxuICAxIC0+IDAKK3ByZWNpc2lvbjogMgorbG54MDE2MiBsbiAgMSAtPiAwCitwcmVjaXNpb246IDMKK2xueDAxNjMgbG4gIDEgLT4gMAorcHJlY2lzaW9uOiA0CitsbngwMTY0IGxuICAxIC0+IDAKK3ByZWNpc2lvbjogNQorbG54MDE2NSBsbiAgMSAtPiAwCitwcmVjaXNpb246IDYKK2xueDAxNjYgbG4gIDEgLT4gMAorcHJlY2lzaW9uOiA3CitsbngwMTY3IGxuICAxIC0+IDAKK3ByZWNpc2lvbjogOAorbG54MDE2OCBsbiAgMSAtPiAwCisKKy0tIGVkZ2UtdGVzdCBsbigyKSBhbmQgbG4oMTApIGluIGNhc2Ugb2YgbG9va2FzaWRlcworcHJlY2lzaW9uOiA0NQorbG54MjAxICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2ODA3NTUwMDEzNCAgSW5leGFjdCBSb3VuZGVkCitsbngyMDIgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMTAxNDkgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDQKK2xueDIwMyAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NjgwNzU1MDAxMyAgIEluZXhhY3QgUm91bmRlZAorbG54MjA0ICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIwNzYwMTEwMTUgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQzCitsbngyMDUgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4MDc1NTAwMSAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIwNiAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDExMDEgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0MgorbG54MjA3ICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2ODA3NTUwMCAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMDggIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAxMTAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDEKK2xueDIwOSAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NjgwNzU1MCAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjEwICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIwNzYwMTEgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQwCitsbngyMTEgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4MDc1NSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIxMiAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDc2MDEgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzOQorbG54MjEzICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2ODA3NiAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMTQgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjA3NjAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzgKK2xueDIxNSAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NjgwOCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjE2ICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIwNzYgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM3CitsbngyMTcgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NTY4MSAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIxOCAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQyMDggICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzNgorbG54MjE5ICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NjU2OCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMjAgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzY0MjEgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzUKK2xueDIyMSAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxNzY1NyAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjIyICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDM2NDIgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM0CitsbngyMjMgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTc2NiAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIyNCAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQzNjQgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMworbG54MjI1ICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1ODE3NyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMjYgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0Njg0MzYgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzIKK2xueDIyNyAgbG4gIDIgLT4gMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxOCAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MjI4ICBsbiAxMCAtPiAyLjMwMjU4NTA5Mjk5NDA0NTY4NDAxNzk5MTQ1NDY4NDQgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMxCitsbngyMjkgIGxuICAyIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MiAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDIzMCAgbG4gMTAgLT4gMi4zMDI1ODUwOTI5OTQwNDU2ODQwMTc5OTE0NTQ2ODQgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMAorbG54MjMxICBsbiAgMiAtPiAwLjY5MzE0NzE4MDU1OTk0NTMwOTQxNzIzMjEyMTQ1OCAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbngyMzIgIGxuIDEwIC0+IDIuMzAyNTg1MDkyOTk0MDQ1Njg0MDE3OTkxNDU0NjggICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gZXh0cmVtZSBpbnB1dCByYW5nZSB2YWx1ZXMKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitQcmVjaXNpb246IDE2CisKK2xueDA5MDEgbG4gMWUtNDAwICAgIC0+IC05MjEuMDM0MDM3MTk3NjE4MyAgSW5leGFjdCBSb3VuZGVkCitsbngwOTAyIGxuIDFlKzQwMCAgICAtPiAgOTIxLjAzNDAzNzE5NzYxODMgIEluZXhhY3QgUm91bmRlZAorbG54MDkwMyBsbiAxZS05OTk5OTkgLT4gLTIzMDI1ODIuNzkwNDA4OTUzICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MDQgbG4gMWUrOTk5OTk5IC0+ICAyMzAyNTgyLjc5MDQwODk1MyAgSW5leGFjdCBSb3VuZGVkCitsbngwOTA1IGxuIDFlLTEwMDAwMTMgICAgICAgICAgICAgICAgLT4gLTIzMDI2MTUuMDI2NjAwMjU1ICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MDYgbG4gMmUtMTAwMDAxMyAgICAgICAgICAgICAgICAtPiAtMjMwMjYxNC4zMzM0NTMwNzQgIEluZXhhY3QgUm91bmRlZAorCitsbngwOTEwIGxuIDkuOTk5OTk5ZSs5OTk5OTkgICAgICAgICAgLT4gIDIzMDI1ODUuMDkyOTkzOTQ2ICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MTEgbG4gOS45OTk5OTk5ZSs5OTk5OTkgICAgICAgICAtPiAgMjMwMjU4NS4wOTI5OTQwMzYgIEluZXhhY3QgUm91bmRlZAorbG54MDkxMiBsbiA5Ljk5OTk5OTk5ZSs5OTk5OTkgICAgICAgIC0+ICAyMzAyNTg1LjA5Mjk5NDA0NSAgSW5leGFjdCBSb3VuZGVkCitsbngwOTEzIGxuIDkuOTk5OTk5OTk5ZSs5OTk5OTkgICAgICAgLT4gIDIzMDI1ODUuMDkyOTk0MDQ2ICBJbmV4YWN0IFJvdW5kZWQKK2xueDA5MTQgbG4gOS45OTk5OTk5OTk5OTllKzk5OTk5OSAgICAtPiAgMjMwMjU4NS4wOTI5OTQwNDYgIEluZXhhY3QgUm91bmRlZAorbG54MDkxNSBsbiA5Ljk5OTk5OTk5OTk5OTk5OWUrOTk5OTk5IC0+ICAyMzAyNTg1LjA5Mjk5NDA0NiAgSW5leGFjdCBSb3VuZGVkCitsbngwOTE2IGxuIDkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5ZSs5OTk5OTkgLT4gIDIzMDI1ODUuMDkyOTk0MDQ2ICBJbmV4YWN0IFJvdW5kZWQKKworLS0gcmFuZG9tcworLS0gUD01MCwgd2l0aGluIDAtOTk5CitQcmVjaXNpb246IDUwCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworbG54MTUwMSBsbiAwLjAwMDk4ODAwOTA2NTc0NDg2Mzg4NjA0NjA4NDc3ODY5ODEyNTE4ODU3MDIzNzY4OTUxIC0+IC02LjkxOTgxODY4NDQwMzM3ODc5OTU5NDUxNDc4MzY5NTU1ODYwMDk1NDg1MTMwNDM2ODkgSW5leGFjdCBSb3VuZGVkCitsbngxNTAyIGxuIDE1OC4xNTg2NjYyNDY2NDYyMzA3MDE4NDU5NTA0NTMwNDE0NTk0OTkwMDcxNDk4NzgyNyAgLT4gNS4wNjM1OTg3NDU4ODk1NjQ3NDU0OTA3ODA2NTA3NTAzODI1NjAyNzU4MzkyMjg3Njg0IEluZXhhY3QgUm91bmRlZAorbG54MTUwMyBsbiAwLjAwNTY1NjYxNDEyMDU5NTcxOTI1MDQwMjg1ODE0MDIxNzk5Nzc1MjQ5Mjg4MzA5MzIxIC0+IC01LjE3NDkyOTc3NzY3NjA2MzIxMDIwNDc1NDAzMDA0OTE1NTA5MzE2NTEzMTg5NzUyMzcgSW5leGFjdCBSb3VuZGVkCitsbngxNTA0IGxuIDAuMDAwMDAwMDY5MTQyMzI1MzI2MjA0ODk2MDIwMDg0MDIwOTE2NjY1NDc5MDMxODA2MDcgLT4gLTE2LjQ4NzA5ODc3MDg3NzgyNTMwODEzODk3NjgxODY4ODc3MTYzODE3MjMzMzAzNDM0NyBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MDUgbG4gMC4wMDAyNTM4MDM3NDYyMTI5NzY1NzUwNDY2MTU0MDc0OTM1NTI1MTIzMTc3MDA3MDcyMyAtPiAtOC4yNzg5NDkyNDIzMDA1MDAzMjA1MjQyMTYyNzQxNTY5MDMzMTI0MjYwMzIxOTU0NTg5IEluZXhhY3QgUm91bmRlZAorbG54MTUwNiBsbiA4My4wMzM2NTQwNjM4Nzc0MjYyNjExMDg1OTI1OTkxODI0MTg5NTM0NDI2Nzc1NTQ4MDYgIC0+IDQuNDE5MjQ1OTk2MjY0NzEzNzk3Njk0OTI0OTgxMDgxNTY5ODQ2NTAzMTYwOTg0MzY2OSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MDcgbG4gMC4wMDAwMDAwMDQxNjg2MzIyODA5MjQ4MTY1MTYyNzczNDY2ODQ0MDY2MzY3ODExODcyOSAtPiAtMTkuMjk1Njc3ODQ1MTIyMTQxNzcyNzkxMjk0NTk5NzE0OTUwMTc1Mjg0OTE1NjY2NDMwIEluZXhhY3QgUm91bmRlZAorbG54MTUwOCBsbiAwLjAwMDAwMTQwODQ3ODczMTg3ODIwNTcwMTgxMjE0MjcxOTYwNTExMDgwNTIzNDU3NjY5IC0+IC0xMy40NzMwMDAzNDk1ODE5NjcxODk2NjgzMDUzMTQzODQ5NTIyNTE1NTY4MDk0ODAzMzkgSW5leGFjdCBSb3VuZGVkCitsbngxNTA5IGxuIDY2LjE3NjEwNjU1NTE4MTUyNzEwMTYzMDM1MTEyNzU4Mzk0NDY4OTc1MjA2OTEzMjUyMiAgLT4gNC4xOTIzMTk0Njk2MjMyNTA1ODgzNjY2MTcxMTE2OTY2MTM3Njk0MDEzNDMxNTA0MjUyIEluZXhhY3QgUm91bmRlZAorbG54MTUxMCBsbiAwLjAwMDAwMDAwMDAwMDA5ODk5MDQzNDg3NDAzNTkwOTAwMTExNjAyMDI0NTYyMjk3OTA4IC0+IC0yOS45NDM3NTMxNjY4Nzc4NDA5ODU4MjE1MDgxMTI5MTc5OTE1MDY2NTY1NDUxNzQxNjMgSW5leGFjdCBSb3VuZGVkCitsbngxNTExIGxuIDAuMDAwMDAwMDAwMDAzMjQ2MTgyOTY3MjE3NDcwOTc1MTA0NTMzODg2ODM5MTI3MzM1NjkgLT4gLTI2LjQ1MzU0MTI4MTQ0NDU4NjgxOTAwOTU0NjQxODU3NzUwNzE2MzM2MjU5MDEzOTQyMiBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTIgbG4gNzIuNjQ2OTY4ODE4NDYzNTQ2NDQ5NDk5MTQ3NTc5MDIzNTU1MDA4MzkyODYwNDIzMzg1ICAtPiA0LjI4NTYxMTY2NjA2ODk2NDY4ODI4NTIxMjg4NTM0MjM1NjYyNzY3MTgyMzA0MjY0NzkgSW5leGFjdCBSb3VuZGVkCitsbngxNTEzIGxuIDAuMDAwMDAwMDAwMDAwMDAwNjY3NTU0ODMxMjQ2MzU2MTI1NzQyNjMxNTM4MjU5OTA1MjMgLT4gLTM0Ljk0MjkxMDE0MjgwMjc2OTMxOTI2Mjg3NTA4MDM5ODg1MjQ5MTU4ODcwNzE3MjQ4MyBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTQgbG4gNjEuMDAyOTEwNDQ3MjAyMzk4MjA0MTE0OTA5NDUxODUxMTExNDI0NjU3NjcxOTExMDAyICAtPiA0LjExMDkyMTU3NTI4NDMzNzczMjMzNjMxODIwNTE0NDYxNzcwNjY0MzQwMzgwOTY1MjkgSW5leGFjdCBSb3VuZGVkCitsbngxNTE1IGxuIDkxNy4wNjkxNzYxMTMzMTk4MDk5OTIyNzg5MzU4NDAxMDU0NDU0MjMxMjIzOTE3NDc3NCAgLT4gNi44MjExODI5MDY4MzAzMTE0MTI4NzUyNDUzNjYxOTQ2NDQ2OTc5Nzg3ODI2MjgyOTA3IEluZXhhY3QgUm91bmRlZAorbG54MTUxNiBsbiAwLjAwMDAwMDAwMTcwODIzNzk0ODgzNjczMDgzMzU4NTQ5NzQ5MDc4OTcyMDAzOTY1MTk0IC0+IC0yMC4xODc4MDM0MzY5NzYxNTA0NzcyOTcyNDY2NjY3NzE2MjY4MjcwNTcxOTEwMjMwMDQgSW5leGFjdCBSb3VuZGVkCitsbngxNTE3IGxuIDAuNTM3MzE3Njc4NDUzNTgyMjQ0NDU4MDk3NjEzMTUxNTkyNDk4OTg1NjY1NDI5MTA2NDkgLT4gLTAuNjIxMTY1Nzc5Mzk5Njg0MDkyMTE3MzY0MTM2MjgyMzYyODUxNjAwNDgzNTcwMDA5NjEgSW5leGFjdCBSb3VuZGVkCitsbngxNTE4IGxuIDAuMDAwMDAwMDAwMDAwMDAwMDg5NjUyOTEzOTI4ODI4MDQxNjEyOTk3NTg3MDgwMzMzNzMgLT4gLTM2Ljk1MDU4NTk3MDk4MDg1NzM3NjA4MTI2NTA3MzI3NjMwMzY3MDgyMDA1NjkxNjIwNiBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MTkgbG4gMC4wMDAwMDAwMDAwNjk5MDI0NDkxNjAyNjQyOTkwNDQ5ODI3ODk4MjUzMDE3MDI5NTY2OCAtPiAtMjMuMzgzOTIwNDI5MjQ0NDU3NTc4MzczNTIzNTA4NDI3NzgzMTQ0NTg5NDgwNDIwNzUzIEluZXhhY3QgUm91bmRlZAorbG54MTUyMCBsbiA0LjAzMTI1NDI5NzcwNzAzMDAwNzA1MDYwNjQ2NjY1MzY0NzgzNzM4MDE5ODg1NDA2MTQgIC0+IDEuMzk0MDc3NTY3NjU5MjQ1MTk0NTc5NTc1Mjc5NjQyMTM5MTg3MTMwMjAyNDc2MzMwNSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MjEgbG4gMjcxLjg0OTkxMzExNTUxODc1NjAxNDMyNTE4ODE5NTYyMzkxNjk5MzI0NjMyMzk2NDIzICAtPiA1LjYwNTI1MDEyMzk4NzM4NjI1MTc5MTY2Nzk3NDcxNDY1Mzk4MDgwNzc0MzE4NzM0NzggSW5leGFjdCBSb3VuZGVkCitsbngxNTIyIGxuIDcuNDExODY3MTYyOTM3Mzg2NDY2NzIyOTQ0NTc0Njg2MjMxNDQ0Mzg5NTQwNDgxODY4OSAgLT4gMi4wMDMwODIzODYzNzA2MzQ0NjI4MjM5MTQ3NjM5MzE4Mjg5OTYxOTE3MDYwMTIxMTQxIEluZXhhY3QgUm91bmRlZAorbG54MTUyMyBsbiAwLjAwMDAwMDAwMDAwMDAyMDI2MzExNDUyNjI1MzY0OTA1MzU3MzIxNjY0MTg2MDM0MjU4IC0+IC0zMS41Mjk5NzQxODAwNTQ0Mzg3OTIwNDM4NTY4NzczMTQwNDM3OTQzMjA5NTExMzQ3NTQgSW5leGFjdCBSb3VuZGVkCitsbngxNTI0IGxuIDAuMDAwMDAwMDAwMDAwMDk1NjMzOTg2NTEyNjE3NTY5NTIzOTgyNTA2MjQ3Mzc4MDkzNDcgLT4gLTI5Ljk3ODI0ODEzMDU3Njk3Mjk1MzE0MTI4NDEzNjk2MjY3MDAyMTM2ODgzNDc5MjU3OSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MjUgbG4gMC4wMDAwMDAwMDAwOTU1Njc3MjY2OTQwOTg1ODY1MzAyNjU1ODIyMzQ2NTE5NzgwODk5MSAtPiAtMjMuMDcxMTg1OTM5NzQ4Mjg1NTQxMjI4MjA2MTYxNDcyOTU2NjYxMTk2OTU2NzQxMTg2IEluZXhhY3QgUm91bmRlZAorbG54MTUyNiBsbiA2Ljg0NDE2NDgyOTgwMjczMDEyOTIzNDIwNTcyNDg3MzczMjYxNTIyNTA3OTQwMjY3NjEgIC0+IDEuOTIzMzk2NDM5NTgwMTk0NjU5NzI3MjU4OTQ3MzQxNzk0ODAyNDM2MTAwNTA4MjkwOCBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MjcgbG4gMC4wMDAwMDAwMDAwMDA3MzA1OTY5OTg4NDQzOTk3OTM5NDk0NTgyMjAzNTcwNDI2NDU3NyAtPiAtMjcuOTQ0OTE0Mzg4MzUzNzI0NzE4ODM2MTAxODI4Njc3NzcxOTY3MTI4NTA5NjAzMTU4IEluZXhhY3QgUm91bmRlZAorbG54MTUyOCBsbiAwLjAwMDAwMDAwMDAwMDAwMDAyNjEwMDc4MjgwNDE5MDgyMjYzMTM4MDY0NzQ1NDE2Nzg3IC0+IC0zOC4xODQ1NjYzNjc1MTYyMDc4ODU1NzM3NzMzMjAxMzU5NjU3OTg3MTcxMjA3MzUxMTUgSW5leGFjdCBSb3VuZGVkCitsbngxNTI5IGxuIDAuMDAwMDAwMDAwMDAwMDAwMDAxNTAyNTk1MTcxNjYyOTQyNDMwODg1NDY4MDYwODMyODMgLT4gLTQxLjAzOTMzNzk0NjI2NjY3NjEwODUzODE3MDgzNzU4MDA1MTY5OTYxODMzNDkyODQyMSBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MzAgbG4gMC4wMDAwMDAwMDAwMDAwMDA4NzkxOTE2MDU0MTcxNDU4MDcwNzE4MTk2OTcwODUwMjA5MSAtPiAtMzQuNjY3NTI4ODE4ODI3NjcxNTA3NTE0MzE5NzQ0MDQ3NDQwNjk2MTg3MzU4Njc2ODQ4IEluZXhhY3QgUm91bmRlZAorbG54MTUzMSBsbiAwLjAwMDAwMDAwMDAwMzk1NzI2NzI1MTIwNzg3NzYzMjcxODQ5NTc3NzA4MDY4NTg0NTk4IC0+IC0yNi4yNTU0Njc0MTY5NjEzNTc3NDE4MTg3MzU3ODcyMjY2NzE5Mzg2Nzg0MjQ3NDg0MzEgSW5leGFjdCBSb3VuZGVkCitsbngxNTMyIGxuIDAuMDAwMDAwMDAwMDIwMTQzMzQ5MDE2NjkzNjYyMTgwMTgzNzcyMTMxNTA3MTU5MzgzNTUgLT4gLTI0LjYyODE0Njk1NTYzNTM1OTAzNTI4OTEyMzAyNzMxOTk2OTIwMTY5MzczNzE1OTEwOCBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MzMgbG4gMC4wMDAwMDAwODA5NzkyNzEwMTEwMTA5MzExNzc1MzkzODc2NjI0MTQ0Mjg5NjAzMDYzNyAtPiAtMTYuMzI5MDcyNjI4NDY5NzE1MTc4NjM3MTc4MzY1NzEwMzczMzk4MjAzMTkwOTM3NDU0IEluZXhhY3QgUm91bmRlZAorbG54MTUzNCBsbiAwLjAwMDAwMDAwMDAwMDE3MTE1ODM0MTYyNjMyODY0MzkyMDM5NjY4MTE2MjQzOTg0MTc2IC0+IC0yOS4zOTYxODcyOTI0MzQ4OTgyMjU0NTM2MjY3OTQ0NTkyODUxNTcyNjMxNzc1MjgwMzQgSW5leGFjdCBSb3VuZGVkCitsbngxNTM1IGxuIDAuMzkxNjgzMTc1OTM4NjYzMzQwODczMDU0NTk5MzM3MjM4NjQyOTQ4NTcwODYxMDUwMzUgLT4gLTAuOTM3MzAxOTkwNjI3NTcyNDA0ODU4MzY2MzczMDY3ODUwMzczNjg3NDY3Mzc2OTMwMjkgSW5leGFjdCBSb3VuZGVkCitsbngxNTM2IGxuIDc5LjMzNTAzNjc5ODk3MTUxNTAyNjUxOTYzMDEwMzMyNTM2OTcyOTYzNzUxNDEyNzYxNyAgLT4gNC4zNzM2Nzk4NTcwMjg3ODI4ODIzNzcyMTQ5NzM1MTcwNDMxMDEwNjE2OTYxOTc2OTY1IEluZXhhY3QgUm91bmRlZAorbG54MTUzNyBsbiAwLjAwMDAwMDAwMDAwMDAwMDU2MDA0OTUyMTI5OTI2MTM3NDEzNjAyMTE2NTkxNDkzNjI1IC0+IC0zNS4xMTg1MDY0NjMxODE4NzAwMjA3MzA2ODU4ODQzMzMwMDAyNDEwMzkwMjgxMjcyMTMgSW5leGFjdCBSb3VuZGVkCitsbngxNTM4IGxuIDAuMDAwMDAwMDYwMDYwMzU5MDc4NDM4OTA5MTg4MzI0ODEwOTk2NjA2Mzk1NTM2NjYwNzggLT4gLTE2LjYyNzkxNTc5NTc0NzExMjU2NjUzMjcwNTk3NDg1MzExNDQ1NDQwNTAxMDQ3MjA0MyBJbmV4YWN0IFJvdW5kZWQKK2xueDE1MzkgbG4gMC4wMDAwMDAwMDA4NTI0MjAyNDkzNzQxNDkwNjM3MTMzMzgyNjU3NDYzMjQ1MDU4NzU5MCAtPiAtMjAuODgyOTQxNDYwMjY4MTAxMDgwMTg2NDgyMjMwNjU3Nzc0OTk3MjczNDk0MTA3MjIxIEluZXhhY3QgUm91bmRlZAorbG54MTU0MCBsbiAwLjAwMDAwMDAwMDAwMDQzNjcxMDk5NDk5MjYyMzUwMzE2MTczMjQ2NTUwNzcxOTUxNTYxIC0+IC0yOC40NTk1MDQ3NTcyODU2MzkyMjE3NzYzMDU5Njg0NjkwNTg4NTQ1NTg3MjY1OTM5NDUgSW5leGFjdCBSb3VuZGVkCisKKy0tIFA9MzQsIHdpdGhpbiAwLTk5OQorUHJlY2lzaW9uOiAzNAorbG54MTIwMSBsbiAwLjAwODY3MzI4ODA4MTU5MjcxODI5OTc1NjY4MTAzMzQzOTQgLT4gLTQuNzQ3NTA3MzExOTIwODQ0NzUyNDg2OTM4MTg3OTczNzIxIEluZXhhY3QgUm91bmRlZAorbG54MTIwMiBsbiAwLjAwMDcxMDQxMDM2OTM0NjAyNjA2MDk3OTIyMjI1Njk4NTQgLT4gLTcuMjQ5NjY3NzY5OTAzNTAzMDIzMDA1NTQ5MjUwMzQ3Njk1IEluZXhhY3QgUm91bmRlZAorbG54MTIwMyBsbiA3ODYuODM5ODk0NTM4NTEwNTE5MDY5NzU0MTQ5MzM5Mjc0MiAgLT4gNi42NjgwMjQ3OTAwMzE4MzYzNDA0NzE4MjQxNDcwMTA1NDYgSW5leGFjdCBSb3VuZGVkCitsbngxMjA0IGxuIDAuNzcyMzA3MzYyMDI4MjY4NzY1Njg5NTE5MDE3MTk2NzM5OSAtPiAtMC4yNTgzNzI2NzA4NTA2ODUwODY4Nzg2ODE2MjM4MjE3MzI2IEluZXhhY3QgUm91bmRlZAorbG54MTIwNSBsbiAwLjAwNjEwNTc5NTE1MTcxOTc2MzEyODcxODM5Mzg0MTIyMDAgLT4gLTUuMDk4NTE2OTMzOTE4Nzk3MzQ3MDY0NDU0MTAzNzQyNjM1IEluZXhhY3QgUm91bmRlZAorbG54MTIwNiBsbiAwLjYxODEzNzk3MDgxODQzOTM3MzAxMDM5MTc1NjI0OTg3NDUgLT4gLTAuNDgxMDQzNTkyNjkwMzM2NTA4NzQ2MzM4Nzc2MDM1MDAyMSBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMDcgbG4gMDkuMTM4ODgyNjEyMjkwMzk5ODkxMTA3NTMzODkwOTY3NjAgIC0+IDIuMjEyNTM4MTI1NTA3OTc1NTc0NTA5NTYzMDI3Njk2MDIxIEluZXhhY3QgUm91bmRlZAorbG54MTIwOCBsbiA4MDIuMDEwNTQxNzA2MzE0MzY5NjQ5NzI5MjE1ODE0NzE3NCAgLT4gNi42ODcxMjE3NTIwNTIzNDE3MzcyMzQ4MzIyMDMzNTAyMTQgSW5leGFjdCBSb3VuZGVkCitsbngxMjA5IGxuIDc3OC43NzQ5NzEwMzg3NzczNzEzNTIzMDI4NDk3MzMzMDU4ICAtPiA2LjY1NzcyMjEzNTEyNjkzNTQ3MjA4NjYyNTAzMTQxMzAzMSBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMTAgbG4gMC4wMDI0NDU3Mjk1ODk1MzQ2NTAyNTEzNTY3Njc5MzkwNjE2IC0+IC02LjAxMzQxMTc5OTk0MDI0NTM0NTMyMTM0ODI5MDM5ODUxNyBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMTEgbG4gMC4wMDAwNTExMjk2OTQ3ODcyODI4MzEwMzM4ODY0MjE3ODYwIC0+IC05Ljg4MTE0NTExODIzNzI4MTc5ODA4MTU3MzEzMTcxMTYzNiBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMTIgbG4gMC4wMDAwMjQ2ODAzNTA4NjAyNTU0OTI0OTM4Njg1MTU1NjU4IC0+IC0xMC42MDk1MDMxNDI2NDgyNTY2MTgyNTM2MDk3MTQzMDIxOCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMTMgbG4gOS4wMjc4OTgxOTkyNTM1MTE2NjgyNDI5Nzc3NjY2MTYwODIgIC0+IDIuMjAwMzE5NTgyNzc4ODk5MDI5Nzg2MDE3ODMwNTU3MjkzIEluZXhhY3QgUm91bmRlZAorbG54MTIxNCBsbiAwLjA5OTE4MTIzOTY1NDI1MDU2MzE4NTA2OTI4MDA5MDQxODggLT4gLTIuMzEwODA2Mzk4OTY0NjcyMjU4ODIzMDQzMTgwNDAwMzg0IEluZXhhY3QgUm91bmRlZAorbG54MTIxNSBsbiAwLjAwMDAwMDAwMDAwNzAyMzg4MTAxNDMwMjg4MTEyMjM5MjQgLT4gLTI1LjY4MTcwNTE5OTYxNjM2NjQ3MTc0NzE0NTM4MjkwMDc1IEluZXhhY3QgUm91bmRlZAorbG54MTIxNiBsbiAyLjYzMDEwMTY2NTM0MjgyNjQ5NDczMDM5NDcyOTMxMzE2NyAgLT4gMC45NjcwMjI1MDE0NjY0MzY3NDY1MTI4MjQzMDM5NzQ5NTU5IEluZXhhY3QgUm91bmRlZAorbG54MTIxNyBsbiAwLjAwNTY4Nzg5Mjg1OTQzNTk1ODc2OTE1MjYwNjMyNTQ2ODMgLT4gLTUuMTY5NDE1NDIyOTA0MDM3ODE5NzM2NjM3Mzk5NDQ1MDk2IEluZXhhY3QgUm91bmRlZAorbG54MTIxOCBsbiA1NjcuMzQzNjA0NzEyMTA1Nzg0MzkwODEwNjU3MzA5NTU5MCAgLT4gNi4zNDA5NjUxMjQ5NjQyNTg0ODY0NjM0NDQzNjA3ODc5NzAgSW5leGFjdCBSb3VuZGVkCitsbngxMjE5IGxuIDEuMTk5MjkxMjQ4MTI0NjU1OTk2NjE0NjA1NzQ1NjQ5NzI1ICAtPiAwLjE4MTczMDc1NTc0MjU5MTE4MDU3NjUwODc3NTU2NzU2NTcgSW5leGFjdCBSb3VuZGVkCitsbngxMjIwIGxuIDI1LjAyMDUwNDQ4NTgyMDMxMDk4Njk2MjY3NDc5MTM1NTU3ICAtPiAzLjIxOTY5NTY2ODEzNzY1OTEzOTU0NDE3ODkwNTQ1OTMxNyBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjEgbG4gMC4wMDAwMDAwMDAwMDA5OTM5NTk3MDIzNTU4NzU2OTYxMzAwIC0+IC0yNy42MzcwNzk3Mjk5NjUzNzYzNjUwNDM5NjU1ODI1OTA1OCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjIgbG4gMC4wMDAwMDA3OTg4NTUxNjcwMTU5NDI5NzE2NTA2NDMwNDAzIC0+IC0xNC4wNDAwODYxNzU0MjU5NzIzMDk4ODE5ODYxMjM3NjQxNSBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjMgbG4gNC42ODE1MTU4MDAxNzYxMjkxODQ4NzM3NzA2MDU1ODk3OTUgIC0+IDEuNTQzNjIxOTQ2NDE1MzgzMzM4OTcyMTI0NDQ1NDQ1NzQ4IEluZXhhY3QgUm91bmRlZAorbG54MTIyNCBsbiAxNS45NTEyNjY2OTE2MTEwMzAxMTIwNjY1ODc0OTM0NTc4MSAgLT4gMi43Njk1MzgyNDI0Nzk0ODM1MzkyNzU5ODYzOTU0NDM1MzkgSW5leGFjdCBSb3VuZGVkCitsbngxMjI1IGxuIDAuMDMwMTYyNjc4MzkyMjIxMTIxMzY3NTQ1NzI3OTA3NjA2NiAtPiAtMy41MDExNDk5MzM2NzcyODMzNDEwMjM5MzIyODE4MjYzNDEgSW5leGFjdCBSb3VuZGVkCitsbngxMjI2IGxuIDAwMC4wMDQwNTQ0MDY0ODgxODIxNzcwNTI4NDc1MTg1Njc0ICAtPiAtNS41MDc5NTA5Njc1NTcwMjE2NzE2NDcxNjU4ODk2MDgzMjQgSW5leGFjdCBSb3VuZGVkCitsbngxMjI3IGxuIDI5LjAxNjE3MDk1OTM1NTkzNzkyMDk1OTEzNzg1MTAwMzYwICAtPiAzLjM2Nzg1MzI5Mzg2Mjc0NTY1MTg4ODQ1MDAwNDQ3MzI5NyBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMjggbG4gNzguMDE4MzYxNjczNDQ3MzY3MzMwMjQ4MDQyNDMxOTUzMjMgIC0+IDQuMzU2OTQ0MjA1MDU1NzY4NTc1OTg3NzgxMzc1MDAzOTkyIEluZXhhY3QgUm91bmRlZAorbG54MTIyOSBsbiAwLjAwMDAwMDAwOTY1NDUzMTkzMTY5NjUzMjExNTg2MzQ4OTMgLT4gLTE4LjQ1NTgzODQwMTYwOTY1ODE0NDYyMDk1NDc3MzY1MDEzIEluZXhhY3QgUm91bmRlZAorbG54MTIzMCBsbiA5Ny45NTQ3NTIzNzcyMDU3OTc1Mjc3MDU4NzE4NTA3NDQyOCAgLT4gNC41ODQ1MDU2NjE2MTI4MTI3NDIyMDg2MTkzNTgyMTQ3MjkgSW5leGFjdCBSb3VuZGVkCitsbngxMjMxIGxuIDUyOC4wNjA5MjYyMDUwNDIzMjQ2NDAyNTY0MjI4NDMyMzcxICAtPiA2LjI2OTIxMTY2NzU4OTEzODExMzM5NjU4Mzg5NDMxNTk1NiBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMzIgbG4gMC4wMDAwMDAyMjUwMDY0MzQ5NzMyOTY5Njk2NjYwNDUyOTcyIC0+IC0xNS4zMDcxMzY4MzUyNjk2Mzk5NjcxMjE2NzcwMTczODcyNCBJbmV4YWN0IFJvdW5kZWQKK2xueDEyMzMgbG4gNDcuOTcwNjM2Mzc3Njc5OTg2NTg1NjcxOTkwNDk3MjU3NTQgIC0+IDMuODcwNTg5MDgxNTg1NjYwNjkyMTk1OTg5ODU0ODQyMzcyIEluZXhhY3QgUm91bmRlZAorbG54MTIzNCBsbiAwLjAwMDUzOTQzMTEzNDQ1NDE0MzIzMTg4NTM1MTM0MTQzNjEgLT4gLTcuNTI0OTk1NDI4MzkzOTI1OTM0MDg3MTI2NzAyOTc0MTIxIEluZXhhY3QgUm91bmRlZAorbG54MTIzNSBsbiAwLjAwMDAwMDAwOTA5NzMzODU2NDk1Njc0NzE2NzQ5NzI2MzMgLT4gLTE4LjUxNTI4MzkzMTU4OTMxNzgzNDQ3MDM1MDA0MTI1NzkxIEluZXhhY3QgUm91bmRlZAorbG54MTIzNiBsbiAwLjAwMDAwMDAwMDAyMzg3NzY0OTAyMjc1NzYxOTczMTc5NzcgLT4gLTI0LjQ1ODA3ODI4MTg4Mzg5NTYxMzMxMTU4ODc5MjA3MjYyIEluZXhhY3QgUm91bmRlZAorbG54MTIzNyBsbiAwLjAwMDAyMzY1ODcwMDAyMzE5MjE1MzIxNDUzMjYyMTg3NTggLT4gLTEwLjY1MTc3OTY0NDk5ODIzMzE0OTUyNDI5Mjc3OTc5MDM0IEluZXhhY3QgUm91bmRlZAorbG54MTIzOCBsbiA0OTkuMTI3NzQ0ODg0NjEzMDcwOTgyNzE1NDU1NjEyNTk0MiAgLT4gNi4yMTI4NjIwNjQ3NjE0Mjc5Njc0NjExODgwODM1MTQ3NzQgSW5leGFjdCBSb3VuZGVkCitsbngxMjM5IGxuIDAuMDAwMDAwMzk2MDE5MjMwMDI4NDc4NzY2MzcxMjQxNzY0NyAtPiAtMTQuNzQxODAzMDY2MTkyOTg1NDgwOTM2OTc2MDgyOTMyODQgSW5leGFjdCBSb3VuZGVkCitsbngxMjQwIGxuIDQxLjA4MjY4MzUwODI5NDc3NDUxNjY3MjI4ODkyNDk1MTM2ICAtPiAzLjcxNTU4NjcwNjg4NzI3ODAzOTE3MzU4NDg1OTIxODk2MCBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD0xNiwgd2l0aGluIDAtOTkKK1ByZWNpc2lvbjogMTYKK2xueDExMDEgbG4gNy45NjQ4NzUyNjEwMzM5NDggIC0+IDIuMDc1MDQxMjgyMzUyMjQxIEluZXhhY3QgUm91bmRlZAorbG54MTEwMiBsbiAxMy41NDUyNzM5Njg0NTM5NCAgLT4gMi42MDYwMzc3MDE4NzAyNjMgSW5leGFjdCBSb3VuZGVkCitsbngxMTAzIGxuIDAuMDAwODAyNjU1NDM0MTMzMSAtPiAtNy4xMjc1ODUwMzQzMjE4MTQgSW5leGFjdCBSb3VuZGVkCitsbngxMTA0IGxuIDAuMDAwMDAzMDU4MjIzMzI2MSAtPiAtMTIuNjk3Njc2NDIzMDA2MjUgSW5leGFjdCBSb3VuZGVkCitsbngxMTA1IGxuIDAuMDAwNDQ3NzQ5NzUwOTY3MiAtPiAtNy43MTEyNzYwNzMyMTA3NjYgSW5leGFjdCBSb3VuZGVkCitsbngxMTA2IGxuIDcuNjE2MjY4NjIyNDc0MzcxICAtPiAyLjAzMDI4NjU2NzY3NTE0OCBJbmV4YWN0IFJvdW5kZWQKK2xueDExMDcgbG4gNTEuNTgzMjk5MjU4MDYzODEgIC0+IDMuOTQzMTk3OTYyMzA5NTY5IEluZXhhY3QgUm91bmRlZAorbG54MTEwOCBsbiAwLjAwMTgxOTc0OTc5NTEyNjMgLT4gLTYuMzA5MDU2MjYyNTQ5MzQ1IEluZXhhY3QgUm91bmRlZAorbG54MTEwOSBsbiAyLjk1NjI4MjQ1NzA3Mjk4NCAgLT4gMS4wODM5MzI1NTIzMzQ1NzUgSW5leGFjdCBSb3VuZGVkCitsbngxMTEwIGxuIDAuMzg0MzMyNTU3OTE4OTkwNiAtPiAtMC45NTYyNDcwNjQ5NDAwNTU4IEluZXhhY3QgUm91bmRlZAorbG54MTExMSBsbiAwLjAwNzQ0NjYzMjkyNjU2NjMgLT4gLTQuODk5OTkzMzA0OTE5MjM3IEluZXhhY3QgUm91bmRlZAorbG54MTExMiBsbiAwLjAwMDMzNzI0Nzg1MzI5OTMgLT4gLTcuOTk0NjkyNDI4MjA2Mzc4IEluZXhhY3QgUm91bmRlZAorbG54MTExMyBsbiAwLjAwODQ3OTIyNjMxNjc4MDkgLT4gLTQuNzcwMTM2MDY5NTY5MjcxIEluZXhhY3QgUm91bmRlZAorbG54MTExNCBsbiA1LjkyNjc1Njk5ODE1MTEwMiAgLT4gMS43Nzk0NzcxODI4MzQzMDUgSW5leGFjdCBSb3VuZGVkCitsbngxMTE1IGxuIDkuMDI1Njk5MTUyMTgwODk3ICAtPiAyLjIwMDA3NTk2OTYwNDExOSBJbmV4YWN0IFJvdW5kZWQKK2xueDExMTYgbG4gMS45MTAxMjQ2NDM1MzM1MjYgIC0+IDAuNjQ3MTY4NDk4MzIzODE4MyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMTcgbG4gMC44MTU4OTIyNzExNDExMDIwIC0+IC0wLjIwMzQ3Mjk1MzM5MzkzODcgSW5leGFjdCBSb3VuZGVkCitsbngxMTE4IGxuIDAuMDA2NzA4MDAxNjQ3NTMyMiAtPiAtNS4wMDQ0NTQxODk0MTQxMzkgSW5leGFjdCBSb3VuZGVkCitsbngxMTE5IGxuIDAuMDA0NzU4MzI0MjA5MjcxNiAtPiAtNS4zNDc4NTk3Mjk2MDEwOTQgSW5leGFjdCBSb3VuZGVkCitsbngxMTIwIGxuIDAuMDM4NjY0NzQxMTY0MTMzOSAtPiAtMy4yNTI4MjcxNzUyNjMxMTMgSW5leGFjdCBSb3VuZGVkCitsbngxMTIxIGxuIDAuMDA1MDIyNjQyNzg0MTc2MSAtPiAtNS4yOTM3OTkwMzI3NzQxMzEgSW5leGFjdCBSb3VuZGVkCitsbngxMTIyIGxuIDYuOTI3OTM3NTQxNjM3MjYxICAtPiAxLjkzNTU2MjE1NTg2NjkwNiBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjMgbG4gMC4wMDAwMDk1NzQ1MzQzNTEzIC0+IC0xMS41NTY0MDM2NTU3OTgxNCBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjQgbG4gMS42MDI0NjU0OTI5NTY1MzggIC0+IDAuNDcxNTQzMzc2MzI0MzkzNiBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjUgbG4gMzguOTg0MTU2MjUwODc1MzUgIC0+IDMuNjYzMTU1MzEzNjEwMjEzIEluZXhhY3QgUm91bmRlZAorbG54MTEyNiBsbiA1LjM0MzE4MjA0MjI3NjczNCAgLT4gMS42NzU4MjEzNjM1NjgxMTIgSW5leGFjdCBSb3VuZGVkCitsbngxMTI3IGxuIDU1Ljg5NzYzNzAzMjQ1ODE2ICAtPiA0LjAyMzUyMjEwNzkzNDExMCBJbmV4YWN0IFJvdW5kZWQKK2xueDExMjggbG4gMC43NDQ1MjU3ODEwMjgwODQ3IC0+IC0wLjI5NTAwNzc5ODgxMDEwMzAgSW5leGFjdCBSb3VuZGVkCitsbngxMTI5IGxuIDEuNjMxNDA3MzE0OTQ2MDk0ICAtPiAwLjQ4OTQ0MzAyNTcyMDEyNDggSW5leGFjdCBSb3VuZGVkCitsbngxMTMwIGxuIDAuMDAwNTQ2MjQ1MTkzMjYwMiAtPiAtNy41MTI0NDI2MTExMTY4NTIgSW5leGFjdCBSb3VuZGVkCitsbngxMTMxIGxuIDAuMDAwMDg2NDE3MzI2OTM2MiAtPiAtOS4zNTYzMjIzNTkwMTczMTcgSW5leGFjdCBSb3VuZGVkCitsbngxMTMyIGxuIDUuMjI3MTYxNzE5MTMyODQ5ICAtPiAxLjY1Mzg2ODQzODQzOTYzNyBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzMgbG4gNjAuNTcwNzg0NjY5NDE5OTggIC0+IDQuMTAzODEyNjc1NjYyNDUyIEluZXhhY3QgUm91bmRlZAorbG54MTEzNCBsbiAwLjA5OTI4NjQzMjUzMzMxNjAgLT4gLTIuMzA5NzQ2MzQ4MzUwMzE4IEluZXhhY3QgUm91bmRlZAorbG54MTEzNSBsbiAwOS40ODU2NDI2ODQ0NzMyNSAgLT4gMi4yNDk3NzkzNTkwNzQ5ODMgSW5leGFjdCBSb3VuZGVkCitsbngxMTM2IGxuIDAuMDAzNjEwNjA4OTM1NTYzNCAtPiAtNS42MjM4Nzg4NDA2NTA3ODcgSW5leGFjdCBSb3VuZGVkCitsbngxMTM3IGxuIDEuODA1MTc2ODY1NTg3MTcyICAtPiAwLjU5MDY1ODU3MzQ1OTM3MDcgSW5leGFjdCBSb3VuZGVkCitsbngxMTM4IGxuIDYyLjU5MzYzMjU5NjQyMjU1ICAtPiA0LjEzNjY2MzU1NzIyMDU1OSBJbmV4YWN0IFJvdW5kZWQKK2xueDExMzkgbG4gNC4zNzM4MjgyNjExMzcyMDEgIC0+IDEuNDc1NjM4NjU3OTEyMDAwIEluZXhhY3QgUm91bmRlZAorbG54MTE0MCBsbiAwLjk5NDQ4MzUyNDE0ODczOCAgLT4gLTAuMDA1NTMxNzQ3Nzk0OTM4NjkwIEluZXhhY3QgUm91bmRlZAorCistLSBQPTcsIHdpdGhpbiAwLTkKK1ByZWNpc2lvbjogNworbG54MTAwMSBsbiAwLjA5MTIwMjUgLT4gLTIuMzk0NjczIEluZXhhY3QgUm91bmRlZAorbG54MTAwMiBsbiAwLjk3Mjg2MjYgLT4gLTAuMDI3NTEyNDIgSW5leGFjdCBSb3VuZGVkCitsbngxMDAzIGxuIDAuMzg4NjAzMiAtPiAtMC45NDUxOTY1IEluZXhhY3QgUm91bmRlZAorbG54MTAwNCBsbiA4Ljc5ODYzOSAgLT4gMi4xNzQ1OTcgSW5leGFjdCBSb3VuZGVkCitsbngxMDA1IGxuIDIuNDU5MTIxICAtPiAwLjg5OTgwNDAgSW5leGFjdCBSb3VuZGVkCitsbngxMDA2IGxuIDIuMDEzMTkzICAtPiAwLjY5OTcyMjAgSW5leGFjdCBSb3VuZGVkCitsbngxMDA3IGxuIDkuMDY0ODU3ICAtPiAyLjIwNDQwNSBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMDggbG4gNS43OTY0MTcgIC0+IDEuNzU3MjQwIEluZXhhY3QgUm91bmRlZAorbG54MTAwOSBsbiAwLjExNDM0NzEgLT4gLTIuMTY4NTE3IEluZXhhY3QgUm91bmRlZAorbG54MTAxMCBsbiAwLjUzNDE1NDIgLT4gLTAuNjI3MDcwNyBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMTEgbG4gNi42OTM3ODEgIC0+IDEuOTAxMTc5IEluZXhhY3QgUm91bmRlZAorbG54MTAxMiBsbiAwLjAwODE3NzkgLT4gLTQuODA2MzIwIEluZXhhY3QgUm91bmRlZAorbG54MTAxMyBsbiA4LjMxMzYxNiAgLT4gMi4xMTc4OTUgSW5leGFjdCBSb3VuZGVkCitsbngxMDE0IGxuIDMuNDg2OTI1ICAtPiAxLjI0OTAyMCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMTUgbG4gMC4xODAxNDAxIC0+IC0xLjcxNDAyMCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMTYgbG4gMC41MjI3MTQ4IC0+IC0wLjY0ODcxOTMgSW5leGFjdCBSb3VuZGVkCitsbngxMDE3IGxuIDcuODE4MTExICAtPiAyLjA1NjQ0MyBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMTggbG4gMC4wODcwNjcxIC0+IC0yLjQ0MTA3NiBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMTkgbG4gOC4xNTM5NjYgIC0+IDIuMDk4NTA0IEluZXhhY3QgUm91bmRlZAorbG54MTAyMCBsbiAyLjA0MDk3NSAgLT4gMC43MTM0Mjc2IEluZXhhY3QgUm91bmRlZAorbG54MTAyMSBsbiAxLjQ4MTY0MiAgLT4gMC4zOTMxNTA5IEluZXhhY3QgUm91bmRlZAorbG54MTAyMiBsbiAwLjI2MTAxMjMgLT4gLTEuMzQzMTg4IEluZXhhY3QgUm91bmRlZAorbG54MTAyMyBsbiAwLjQ2NjcyMyAgLT4gLTAuNzYyMDE5MyBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMjQgbG4gMC4wNTE4NzU2IC0+IC0yLjk1ODkwNyBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMjUgbG4gMi4wNTY0MTAgIC0+IDAuNzIwOTYxNyBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMjYgbG4gMC4xODE1MjIgIC0+IC0xLjcwNjM3OCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMjcgbG4gMC41MTU1NTEgIC0+IC0wLjY2MjUxOTAgSW5leGFjdCBSb3VuZGVkCitsbngxMDI4IGxuIDguNDI1MDg5ICAtPiAyLjEzMTIxNCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMjkgbG4gMi4wNzcwOTEgIC0+IDAuNzMwOTY4NCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMzAgbG4gNi4yMTI3MDUgIC0+IDEuODI2NTk2IEluZXhhY3QgUm91bmRlZAorbG54MTAzMSBsbiA1LjcyOTM0MyAgLT4gMS43NDU2MDEgSW5leGFjdCBSb3VuZGVkCitsbngxMDMyIGxuIDQuODMxMjUxICAtPiAxLjU3NTEwNSBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMzMgbG4gMi4wMjk3NjAgIC0+IDAuNzA3OTE3NiBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMzQgbG4gOC42MTUwNjAgIC0+IDIuMTUzNTEyIEluZXhhY3QgUm91bmRlZAorbG54MTAzNSBsbiAwLjA2MTE1MTEgLT4gLTIuNzk0NDA3IEluZXhhY3QgUm91bmRlZAorbG54MTAzNiBsbiA1LjE5NTI2OSAgLT4gMS42NDc3NDggSW5leGFjdCBSb3VuZGVkCitsbngxMDM3IGxuIDkuNjE3Njg2ICAtPiAyLjI2MzYwNCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMzggbG4gMC4wMDQ5MzgyIC0+IC01LjMxMDc1NCBJbmV4YWN0IFJvdW5kZWQKK2xueDEwMzkgbG4gMi43ODY4NDAgIC0+IDEuMDI0OTA4IEluZXhhY3QgUm91bmRlZAorbG54MTA0MCBsbiAwLjAwOTEwNzMgLT4gLTQuNjk4Njc5IEluZXhhY3QgUm91bmRlZAorCistLSBmcm9tIGhlcmUgMy1kaWdpdCB0ZXN0cyBhcmUgYmFzZWQgb24gcmV2ZXJzZSBleHAgdGVzdHMKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCitsbngwMDEgIGxuIDAgICAgICAgICAgIC0+ICAtSW5maW5pdHkKK2xueDAwMiAgbG4gMC4zNjc4Nzk0NDEgLT4gIC0xLjAwMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorbG54MDAzICBsbiAxICAgICAgICAgICAtPiAgIDAKK2xueDAwNSAgbG4gMi43MTgyODE4MyAgLT4gICAxLjAwMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorbG54MDA2ICBsbiAyLjAwMDAwMDAwICAtPiAgIDAuNjkzMTQ3MTgxICAgSW5leGFjdCBSb3VuZGVkCitsbngwMDcgIGxuICtJbmZpbml0eSAgIC0+ICAgSW5maW5pdHkKKworLS0gdGlueSBlZGdlIGNhc2VzCitwcmVjaXNpb246ICAgNworbG54MDExICBsbiAxLjEwNTE3MSAtPiAgMC4xMDAwMDAxICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEyICBsbiAxLjAxMDA1MCAtPiAgMC4wMDk5OTk4MzUgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDEzICBsbiAxLjAwMDAxMCAtPiAgMC4wMDAwMDk5OTk5NTAgIEluZXhhY3QgUm91bmRlZAorbG54MDE0ICBsbiAxLjAwMDAwMSAtPiAgOS45OTk5OTVFLTcgICAgIEluZXhhY3QgUm91bmRlZAorbG54MDE1ICBsbiAxLjAwMDAwMCAtPiAgMAorCistLSBiYXNpYyBlPTAsIGU9MSwgZT0yLCBlPTQsIGU+PTggY2FzZXMKK3ByZWNpc2lvbjogICA3CitsbngwNDEgIGxuIDIuNzE4MjgyICAgICAgLT4gIDEuMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorbG54MDQyICBsbiAwLjM2Nzg3OTQgICAgIC0+IC0xLjAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDA0MyAgbG4gMjIwMjYuNDcgICAgICAtPiAgMTAuMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwNDQgIGxuIDAuMDAwMDQ1Mzk5OTMgLT4gLTEwLjAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorbG54MDQ1ICBsbiAyLjY4ODExN0UrNDMgIC0+ICAxMDAuMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDA0NiAgbG4gMy43MjAwNzZFLTQ0ICAtPiAtMTAwLjAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitsbngwNDcgIGxuIEluZmluaXR5ICAgICAgLT4gIEluZmluaXR5CitsbngwNDggIGxuIDBFLTM4OSAgICAgICAgLT4gLUluZmluaXR5CisKKy0tIG1pc2NlbGxhbmVhCitwcmVjaXNpb246IDE2CitsbngwNTUgIGxuIDIuNzE3NjU4NDg2ODg0NTcyRS0yMzYgICAgIC0+IC01NDIuNDEwMzExMjg3NDQxNSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTcKK2xueDA1NiAgbG4gMi43MTc2NTg0ODY4ODQ1NzIxRS0yMzYgICAgLT4gLTU0Mi40MTAzMTEyODc0NDE0NiAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOAorbG54MDU3ICBsbiAyLjcxNzY1ODQ4Njg4NDU3MjExRS0yMzYgICAtPiAtNTQyLjQxMDMxMTI4NzQ0MTQ1OSAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE5CitsbngwNTggIGxuIDIuNzE3NjU4NDg2ODg0NTcyMTEyRS0yMzYgIC0+IC01NDIuNDEwMzExMjg3NDQxNDU5MiAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjAKK2xueDA1OSAgbG4gMi43MTc2NTg0ODY4ODQ1NzIxMTE4RS0yMzYgLT4gLTU0Mi40MTAzMTEyODc0NDE0NTkxNyAgIEluZXhhY3QgUm91bmRlZAorCistLSBpbnB1dHMgZW5kaW5nIGluIC4uNTAwLi4sIC4uNDk5Li4sIC4uMTAwLi4sIC4uOTk5Li4gc2VxdWVuY2VzCitwcmVjaXNpb246ICAgNTAKK2xueDEwMiAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAwMDI3IC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMzM3NDk5NTM4Mjk5OTY0NDYxMjQ4NjE3NTBFLTggIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDMwCitsbngxMDMgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwMDAzIC0+IC04Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk3MzM3NDk5RS04ICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjkKK2xueDEwNCAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MDAwMCAtPiAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAyNzMzNzUwRS04ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI4CitsbngxMDUgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwMCAtPiAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAyNzMzNzVFLTggICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI3CitsbngxMDYgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NTAwIC0+IC05LjAwMDAwMDAwMDAwMDAwMDAwMDAwMDI3MzM4RS04ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjYKK2xueDEwNyAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4Nzg1MCAtPiAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAyNzM0RS04ICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI1CitsbngxMDggIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc4NSAtPiAtOS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAyNzNFLTggICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDI0CitsbngxMDkgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5ODc5IC0+IC04Ljk5OTk5OTk5OTk5OTk5OTk1MDAwMDI3RS04ICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjMKK2xueDExMCAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNDk5OTk4OCAtPiAtOC45OTk5OTk5OTk5OTk5OTk4NTAwMDAzRS04ICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDIyCitsbngxMTEgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDQ5OTk5OSAtPiAtOC45OTk5OTk5OTk5OTk5OTc4NTAwMDBFLTggICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDIxCitsbngxMTIgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDUwMDAwIC0+IC04Ljk5OTk5OTk5OTk5OTk4Nzg1MDAwRS04ICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMjAKK2xueDExMyAgbG4gMC45OTk5OTk5MTAwMDAwMDQwNTAwMCAtPiAtOC45OTk5OTk5OTk5OTk5ODc4NTAwRS04ICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE5CitsbngxMTQgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDUwMCAtPiAtOC45OTk5OTk5OTk5OTk5ODc4NTBFLTggICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE4CitsbngxMTUgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDUwIC0+IC04Ljk5OTk5OTk5OTk5OTk4Nzg1RS04ICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IG1heSBiZSBhID4gMC41dWxwIGNhc2U7IGEgbW9yZSBwcmVjaXNlIGFuc3dlciBpczoKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOC45OTk5OTk5OTk5OTk5ODc4NDk5OTkxOEUtOAorcHJlY2lzaW9uOiAgIDE3CitsbngxMTYgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MDUgLT4gLTguOTk5OTk5OTk5OTk5OTg3OEUtOCAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE2CitsbngxMTcgIGxuIDAuOTk5OTk5OTEwMDAwMDA0MCAtPiAtOS4wMDAwMDAwMDQ5OTk5ODhFLTggICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAxNQorbG54MTE4ICBsbiAwLjk5OTk5OTkxMDAwMDAwNCAtPiAtOS4wMDAwMDAwMDQ5OTk5OUUtOCAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE0CitsbngxMTkgIGxuIDAuOTk5OTk5OTEwMDAwMDAgLT4gLTkuMDAwMDAwNDA1MDAwMEUtOCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDEzCitsbngxMjAgIGxuIDAuOTk5OTk5OTEwMDAwMCAtPiAtOS4wMDAwMDA0MDUwMDBFLTggICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTIKK2xueDEyMSAgbG4gMC45OTk5OTk5MTAwMDAgLT4gLTkuMDAwMDAwNDA1MDBFLTggICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDExCitsbngxMjIgIGxuIDAuOTk5OTk5OTEwMDAgLT4gLTkuMDAwMDAwNDA1MEUtOCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDEwCitsbngxMjMgIGxuIDAuOTk5OTk5OTEwMCAtPiAtOS4wMDAwMDA0MDVFLTggICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDkKK2xueDEyNCAgbG4gMC45OTk5OTk5MTAgLT4gLTkuMDAwMDAwNDFFLTggICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA4CitsbngxMjUgIGxuIDAuOTk5OTk5OTEgLT4gLTkuMDAwMDAwNEUtOCAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA3CitsbngxMjYgIGxuIDAuOTk5OTk5OSAtPiAtMS4wMDAwMDBFLTcgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgMTYKK2xueDEyNmIgbG4gMC45OTk5OTk5IC0+IC0xLjAwMDAwMDA1MDAwMDAwM0UtNyAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgNgorbG54MTI3ICBsbiAwLjk5OTk5OSAtPiAtMC4wMDAwMDEwMDAwMCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICA1CitsbngxMjggIGxuIDAuOTk5OTkgLT4gLTAuMDAwMDEwMDAwICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDQKK2xueDEyOSAgbG4gMC45OTk5IC0+IC0wLjAwMDEwMDAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICAgMworbG54MTMwICBsbiAwLjk5OSAtPiAtMC4wMDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgICAyCitsbngxMzEgIGxuIDAuOTkgLT4gLTAuMDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDEKK2xueDEzMiAgbG4gMC45IC0+IC0wLjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworCistLSBjYXNlcyBuZWFyIDEgICAgICAgICAgICAgIC0tICAxIDIzNDU2Nzg5MDEyMzQ1Njc4OTAKK3ByZWNpc2lvbjogICAgMjAKK2xueDQwMSAgbG4gMi43MTgyODE4Mjg0NTg5MzY1MDQxIC0+IDAuOTk5OTk5OTk5OTk5OTYwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitsbng0MDIgIGxuIDIuNzE4MjgxODI4NDU4OTYzNjg2OSAtPiAwLjk5OTk5OTk5OTk5OTk3MDAwMDAwIEluZXhhY3QgUm91bmRlZAorbG54NDAzICBsbiAyLjcxODI4MTgyODQ1ODk5MDg2OTcgLT4gMC45OTk5OTk5OTk5OTk5Nzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK2xueDQwNCAgbG4gMi43MTgyODE4Mjg0NTkwMTgwNTI1IC0+IDAuOTk5OTk5OTk5OTk5OTg5OTk5OTggSW5leGFjdCBSb3VuZGVkCitsbng0MDUgIGxuIDIuNzE4MjgxODI4NDU5MDQ1MjM1NCAtPiAxLjAwMDAwMDAwMDAwMDAwMDAwMDAgIEluZXhhY3QgUm91bmRlZAorbG54NDA2ICBsbiAyLjcxODI4MTgyODQ1OTMxNzA2MzUgLT4gMS4wMDAwMDAwMDAwMDAxMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK2xueDQwNyAgbG4gMi43MTgyODE4Mjg0NTk1ODg4OTE3IC0+IDEuMDAwMDAwMDAwMDAwMjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAgIDE0Citsbng0MTEgIGxuIDIuNzE4MjgxODI4NDU4OSAtPiAwLjk5OTk5OTk5OTk5OTk1ICAgIEluZXhhY3QgUm91bmRlZAorbG54NDEzICBsbiAyLjcxODI4MTgyODQ1OTAgLT4gMC45OTk5OTk5OTk5OTk5OCAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDQxNiAgbG4gMi43MTgyODE4Mjg0NTkxIC0+IDEuMDAwMDAwMDAwMDAwMCAgICAgSW5leGFjdCBSb3VuZGVkCitsbng0MTcgIGxuIDIuNzE4MjgxODI4NDU5MiAtPiAxLjAwMDAwMDAwMDAwMDEgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBvdmVyZmxvd3MsIGluY2x1ZGluZyBzb21lIGV4cCBvdmVycHJlY2lzZSBib3JkZXJsaW5lcworcHJlY2lzaW9uOiAgIDcKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitsbng3MDkgIGxuIDkuOTk5OTk5RSszODQgLT4gIDg4Ni40OTUzICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDcxMSAgbG4gOS45OTk5OTJFKzM4NCAtPiAgODg2LjQ5NTMgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgIDE2Citsbng3MjIgIGxuIDkuOTk5OTk5OTk5OTk5OTk5RSszODQgLT4gIDg4Ni40OTUyNjA4MDI3MDc2ICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDcyNCAgbG4gOS45OTk5OTk5OTk5OTk5MTdFKzM4NCAtPiAgODg2LjQ5NTI2MDgwMjcwNzYgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzI2ICBsbiA5Ljk5OTk5OTk5OTk5OTExN0UrMzg0IC0+ICA4ODYuNDk1MjYwODAyNzA3NSAgICAgSW5leGFjdCBSb3VuZGVkCistLSBhbmQgbW9yZS4uLgorcHJlY2lzaW9uOiAgIDE1CittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorbG54NzMxICBsbiA5Ljk5OTk5OTk5OTk5OTk5RSs5OTkgLT4gMjMwMi41ODUwOTI5OTQwNSAgICAgICBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgbWF5IGJlIGEgPiAwLjV1bHAgY2FzZTsgYSBtb3JlIHByZWNpc2UgYW5zd2VyIGlzOgorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMwMi41ODUwOTI5OTQwNDQ5NTAwMTc5OTE0NTQ0MgorbG54NzMyICBsbiA5Ljk5OTk5OTk5OTk5MjY2RSs5OTkgLT4gMjMwMi41ODUwOTI5OTQwNCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xueDczMyAgbG4gOS45OTk5OTk5OTk5OTI2NUUrOTk5IC0+IDIzMDIuNTg1MDkyOTk0MDQgICAgICAgSW5leGFjdCBSb3VuZGVkCitsbng3MzQgIGxuIDkuOTk5OTk5OTk5OTkyNjRFKzk5OSAtPiAyMzAyLjU4NTA5Mjk5NDA0ICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3dzIGZvciBleHAsIGluY2x1ZGluZyB1bmRlcmZsb3ctdG8temVybyBlZGdlIHBvaW50CitwcmVjaXNpb246ICAgNworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK2xueDc1MSAgbG4gMEUtMzg5IC0+IC1JbmZpbml0eQorbG54NzU4ICBsbiAxLjAwMDAwMUUtMzgzIC0+IC04ODEuODkwMSAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzU5ICBsbiA5Ljk5OTkxRS0zODQgLT4gLTg4MS44OTAxICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzYwICBsbiA0LjQ2MDVFLTM4NSAtPiAtODg1LjAwMDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzYxICBsbiAyLjIyMUUtMzg2IC0+IC04ODcuOTk5OSAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzYyICBsbiAzLjAxRS0zODcgLT4gLTg4OS45OTg1ICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzYzICBsbiAxLjdFLTM4OCAtPiAtODkyLjg3MjQgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzY0ICBsbiAxLjVFLTM4OCAtPiAtODkyLjk5NzYgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzY1ICBsbiA5RS0zODkgLT4gLTg5My41MDg0ICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54NzY2ICBsbiAxRS0zODkgLT4gLTg5NS43MDU2ICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG54Nzc0ICBsbiAwRS0zODkgLT4gLUluZmluaXR5CisKKy0tIHNwZWNpYWwgdmFsdWVzCitsbng4MjAgIGxuIEluZmluaXR5IC0+ICAgSW5maW5pdHkKK2xueDgyMSAgbG4gMCAgICAgICAgLT4gIC1JbmZpbml0eQorbG54ODIyICBsbiBOYU4gICAgICAtPiAgIE5hTgorbG54ODIzICBsbiBzTmFOICAgICAtPiAgIE5hTiAgICAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2xueDgyNCAgbG4gc05hTjEyMyAgLT4gICBOYU4xMjMgIEludmFsaWRfb3BlcmF0aW9uCitsbng4MjUgIGxuIC1zTmFOMzIxIC0+ICAtTmFOMzIxICBJbnZhbGlkX29wZXJhdGlvbgorbG54ODI2ICBsbiBOYU40NTYgICAtPiAgIE5hTjQ1NgorbG54ODI3ICBsbiAtTmFONjU0ICAtPiAgLU5hTjY1NAorbG54ODI4ICBsbiBOYU4xICAgICAtPiAgIE5hTjEKKworLS0gSW52YWxpZCBvcGVyYXRpb25zIGR1ZSB0byByZXN0cmljdGlvbnMKKy0tIFtuZXh0IHR3byBwcm9iYWJseSBza2lwcGVkIGJ5IG1vc3QgdGVzdCBoYXJuZXNzZXNdCitwcmVjaXNpb246IDEwMDAwMDAwMAorbG54OTAxICBsbiAxIC0+ICBOYU4gICAgICAgICAgICBJbnZhbGlkX2NvbnRleHQKK3ByZWNpc2lvbjogIDk5OTk5OTk5Citsbng5MDIgIGxuIDAgLT4gIE5hTiAgICAgICAgICAgIEludmFsaWRfY29udGV4dAorCitwcmVjaXNpb246IDkKK21heEV4cG9uZW50OiAgIDEwMDAwMDAKK21pbkV4cG9uZW50OiAgIC05OTk5OTkKK2xueDkwMyAgbG4gMSAgIC0+ICBOYU4gICAgICAgICAgSW52YWxpZF9jb250ZXh0CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogICAtOTk5OTk5Citsbng5MDQgIGxuIDAgLT4gIC1JbmZpbml0eQorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAtMTAwMDAwMAorbG54OTA1ICBsbiAxICAgLT4gIE5hTiAgICAgICAgICBJbnZhbGlkX2NvbnRleHQKK21heEV4cG9uZW50OiAgICA5OTk5OTkKK21pbkV4cG9uZW50OiAgIC05OTk5OTgKK2xueDkwNiAgbG4gMCAtPiAgLUluZmluaXR5CisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZQorcHJlY2lzaW9uOiA1Citsbng5MTAgIGxuIC1zTmFOMTIzNDU2Nzg5MCAtPiAtTmFONjc4OTAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdAorbG54OTAwICBsbiAjICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9sb2cxMC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9sb2cxMC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MDJmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xvZzEwLmRlY1Rlc3QKQEAgLTAsMCArMSw1NTEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbG9nMTAuZGVjVGVzdCAtLSBkZWNpbWFsIGxvZ2FyaXRobSBpbiBiYXNlIDEwICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIGVtcGhhc2lzZXMgdGhlIHRlc3Rpbmcgb2Ygbm90YWJsZSBjYXNlcywgYXMgdGhleSB3aWxsIG9mdGVuCistLSBoYXZlIHVudXN1YWwgcGF0aHMgKGVzcGVjaWFsbHkgdGhlIDEwKipuIHJlc3VsdHMpLgorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBleGFtcGxlcyBpbiBzcGVjaWZpY2F0aW9uCitwcmVjaXNpb246ICAgOQorbG9neHMwMDAgbG9nMTAgIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG9neHMwMDEgbG9nMTAgIDAuMDAxICAgICAgICAgICAgIC0+IC0zCitsb2d4czAwMiBsb2cxMCAgMSAgICAgICAgICAgICAgICAgLT4gIDAKK2xvZ3hzMDAzIGxvZzEwICAyICAgICAgICAgICAgICAgICAtPiAgMC4zMDEwMjk5OTYgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3hzMDA0IGxvZzEwICAxMCAgICAgICAgICAgICAgICAtPiAgMQorbG9neHMwMDUgbG9nMTAgIDcwICAgICAgICAgICAgICAgIC0+ICAxLjg0NTA5ODA0ICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorbG9neHMwMDYgbG9nMTAgK0luZmluaXR5ICAgICAgICAgIC0+ICBJbmZpbml0eQorCisKKy0tIGJhc2ljcyAoZXhhbXBsZXMgaW4gc3BlY2lmaWNhdGlvbiwgZXRjLikKK3ByZWNpc2lvbjogICAxNgorbG9neDAwMDAgbG9nMTAgIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG9neDAwMDEgbG9nMTAgIDdFLTEwMDAgICAgICAgICAgIC0+IC05OTkuMTU0OTAxOTU5OTg1NyAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMDIgbG9nMTAgIDEuMUUtOSAgICAgICAgICAgIC0+IC04Ljk1ODYwNzMxNDg0MTc3NSAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMDMgbG9nMTAgIDAuMDAwNyAgICAgICAgICAgIC0+IC0zLjE1NDkwMTk1OTk4NTc0MyAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMDQgbG9nMTAgIDAuMTEgICAgICAgICAgICAgIC0+IC0wLjk1ODYwNzMxNDg0MTc3NTAgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMDUgbG9nMTAgIDAuNyAgICAgICAgICAgICAgIC0+IC0wLjE1NDkwMTk1OTk4NTc0MzIgIEluZXhhY3QgUm91bmRlZAorbG9neDAwMDYgbG9nMTAgIDEgICAgICAgICAgICAgICAgIC0+ICAwCitsb2d4MDAwNyBsb2cxMCAgMS41ICAgICAgICAgICAgICAgLT4gIDAuMTc2MDkxMjU5MDU1NjgxMiAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAwOCBsb2cxMCAgMiAgICAgICAgICAgICAgICAgLT4gIDAuMzAxMDI5OTk1NjYzOTgxMiAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAwOSBsb2cxMCAgMi43MTgyODE4Mjg0NTkwNDUgLT4gIDAuNDM0Mjk0NDgxOTAzMjUxOCAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAxMCBsb2cxMCAgMi43MTgyODE4Mjg0NTkwNDYgLT4gIDAuNDM0Mjk0NDgxOTAzMjUxOSAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAxMSBsb2cxMCAgMi43MTgyODE4Mjg0NTkwNDcgLT4gIDAuNDM0Mjk0NDgxOTAzMjUyMSAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAxMiBsb2cxMCAgNyAgICAgICAgICAgICAgICAgLT4gIDAuODQ1MDk4MDQwMDE0MjU2OCAgSW5leGFjdCBSb3VuZGVkCitsb2d4MDAxMyBsb2cxMCAgMTAgICAgICAgICAgICAgICAgLT4gIDEKK2xvZ3gwMDE0IGxvZzEwICAxMC41ICAgICAgICAgICAgICAtPiAgMS4wMjExODkyOTkwNjk5MzggICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDE1IGxvZzEwICAxMSAgICAgICAgICAgICAgICAtPiAgMS4wNDEzOTI2ODUxNTgyMjUgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDE2IGxvZzEwICA3MCAgICAgICAgICAgICAgICAtPiAgMS44NDUwOTgwNDAwMTQyNTcgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDE3IGxvZzEwICA5OTk5ICAgICAgICAgICAgICAtPiAgMy45OTk5NTY1NjgzODAxOTIgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDE4IGxvZzEwICAxLjIxRTYgICAgICAgICAgICAtPiAgNi4wODI3ODUzNzAzMTY0NTAgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDE5IGxvZzEwICAxLjFFKzkgICAgICAgICAgICAtPiAgOS4wNDEzOTI2ODUxNTgyMjUgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDIwIGxvZzEwICA3RSsxMDAwICAgICAgICAgICAtPiAgMTAwMC44NDUwOTgwNDAwMTQgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gwMDIxIGxvZzEwICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gbm90YWJsZSBjYXNlcworLS0gbmVnYXRpdmVzCitsb2d4MDAzMSBsb2cxMCAtMUUtOSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzMiBsb2cxMCAtMC4wMDA3ICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzMyBsb2cxMCAtMC4xICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzNCBsb2cxMCAtMC43ICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzNSBsb2cxMCAtMSAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzNiBsb2cxMCAtMS41ICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzNyBsb2cxMCAtMiAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzOCBsb2cxMCAtMTAuNSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDAzOSBsb2cxMCAtMTAuNSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDA0MCBsb2cxMCAtOTk5OSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDA0MSBsb2cxMCAtMTAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitsb2d4MDA0MiBsb2cxMCAtMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5Citsb2d4MDA0MyBsb2cxMCAtMEUrMTcgICAgICAgICAgICAgLT4gLUluZmluaXR5Citsb2d4MDA0NCBsb2cxMCAtMEUtMTcgICAgICAgICAgICAgLT4gLUluZmluaXR5CistLSBvdGhlciB6ZXJvcworbG9neDAwNTEgbG9nMTAgIDAgICAgICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG9neDAwNTIgbG9nMTAgIDBFKzE3ICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorbG9neDAwNTMgbG9nMTAgIDBFLTE3ICAgICAgICAgICAgIC0+IC1JbmZpbml0eQorLS0gaW5maW5pdGllcworbG9neDAwNTUgbG9nMTAgLUluZmluaXR5ICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbG9neDAwNTYgbG9nMTAgK0luZmluaXR5ICAgICAgICAgIC0+IEluZmluaXR5CistLSBvbmVzCitsb2d4MDA2MSBsb2cxMCAgMSAgICAgICAgICAgICAgICAgLT4gICAwCitsb2d4MDA2MiBsb2cxMCAgMS4wICAgICAgICAgICAgICAgLT4gICAwCitsb2d4MDA2MyBsb2cxMCAgMS4wMDAwMDAwMDAwMDAwMDAgLT4gICAwCitsb2d4MDA2NCBsb2cxMCAgMS4wMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAwCisKKy0tIG5vdGFibGUgY2FzZXMgLS0gZXhhY3QgcG93ZXJzIG9mIDEwCitsb2d4MTEwMCBsb2cxMCAxICAgICAgICAgICAgIC0+IDAKK2xvZ3gxMTAxIGxvZzEwIDEwICAgICAgICAgICAgLT4gMQorbG9neDExMDIgbG9nMTAgMTAwICAgICAgICAgICAtPiAyCitsb2d4MTEwMyBsb2cxMCAxMDAwICAgICAgICAgIC0+IDMKK2xvZ3gxMTA0IGxvZzEwIDEwMDAwICAgICAgICAgLT4gNAorbG9neDExMDUgbG9nMTAgMTAwMDAwICAgICAgICAtPiA1Citsb2d4MTEwNiBsb2cxMCAxMDAwMDAwICAgICAgIC0+IDYKK2xvZ3gxMTA3IGxvZzEwIDEwMDAwMDAwICAgICAgLT4gNworbG9neDExMDggbG9nMTAgMTAwMDAwMDAwICAgICAtPiA4Citsb2d4MTEwOSBsb2cxMCAxMDAwMDAwMDAwICAgIC0+IDkKK2xvZ3gxMTEwIGxvZzEwIDEwMDAwMDAwMDAwICAgLT4gMTAKK2xvZ3gxMTExIGxvZzEwIDEwMDAwMDAwMDAwMCAgLT4gMTEKK2xvZ3gxMTEyIGxvZzEwIDEwMDAwMDAwMDAwMDAgLT4gMTIKK2xvZ3gxMTEzIGxvZzEwIDAuMDAwMDAwMDAwMDEgLT4gLTExCitsb2d4MTExNCBsb2cxMCAwLjAwMDAwMDAwMDEgLT4gLTEwCitsb2d4MTExNSBsb2cxMCAwLjAwMDAwMDAwMSAtPiAtOQorbG9neDExMTYgbG9nMTAgMC4wMDAwMDAwMSAtPiAtOAorbG9neDExMTcgbG9nMTAgMC4wMDAwMDAxIC0+IC03Citsb2d4MTExOCBsb2cxMCAwLjAwMDAwMSAtPiAtNgorbG9neDExMTkgbG9nMTAgMC4wMDAwMSAtPiAtNQorbG9neDExMjAgbG9nMTAgMC4wMDAxIC0+IC00Citsb2d4MTEyMSBsb2cxMCAwLjAwMSAtPiAtMworbG9neDExMjIgbG9nMTAgMC4wMSAtPiAtMgorbG9neDExMjMgbG9nMTAgMC4xIC0+IC0xCitsb2d4MTEyNCBsb2cxMCAxRS05OSAgLT4gLTk5Citsb2d4MTEyNSBsb2cxMCAxRS0xMDAgLT4gLTEwMAorbG9neDExMjYgbG9nMTAgMUUtMzgzIC0+IC0zODMKKworLS0gY2hlY2sgbm9ybWFsbHkgZXhhY3QgY2FzZXMgcm91bmQgcHJvcGVybHkKK3ByZWNpc2lvbjogMQorbG9neDExNDEgbG9nMTAgMTAwMDAwMDAwMDAgICAtPiAxRSsxICAgICAgICAgUm91bmRlZAorbG9neDExNDIgbG9nMTAgMTAwMDAwMDAwMDAwMCAtPiAxRSsxIEluZXhhY3QgUm91bmRlZAorbG9neDExNDMgbG9nMTAgMUUrMTAwICAgICAgICAtPiAxRSsyICAgICAgICAgUm91bmRlZAorbG9neDExNDQgbG9nMTAgMUUrMTIzICAgICAgICAtPiAxRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNDUgbG9nMTAgMUUrMTI2ICAgICAgICAtPiAxRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNDYgbG9nMTAgMUUrOTE2ICAgICAgICAtPiA5RSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNDcgbG9nMTAgMUUrOTk5ICAgICAgICAtPiAxRSszIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDIKK2xvZ3gxMTUxIGxvZzEwIDEwMDAwMDAwMDAwICAgLT4gMTAKK2xvZ3gxMTUyIGxvZzEwIDEwMDAwMDAwMDAwMDAgLT4gMTIKK2xvZ3gxMTUzIGxvZzEwIDFFKzEwMCAgICAgICAgLT4gMS4wRSsyICAgICAgICAgUm91bmRlZAorbG9neDExNTQgbG9nMTAgMUUrMTIzICAgICAgICAtPiAxLjJFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE1NSBsb2cxMCAxRSsxMjYgICAgICAgIC0+IDEuM0UrMiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMTU2IGxvZzEwIDFFKzkxNiAgICAgICAgLT4gOS4yRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNTcgbG9nMTAgMUUrOTk5ICAgICAgICAtPiAxLjBFKzMgSW5leGFjdCBSb3VuZGVkCistLSBzb21lIGhhbGYtd2F5IHBvaW50IHJvdW5kcywgb3RoZXIgY2FzZXMsIGFuZCBuZWdhdGl2ZXMKK2xvZ3gxMTU4IGxvZzEwIDFFKzEyNSAgICAgICAgLT4gMS4yRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNTkgbG9nMTAgMUUrMTM1ICAgICAgICAtPiAxLjRFKzIgSW5leGFjdCBSb3VuZGVkCitsb2d4MTE2MCBsb2cxMCAxRSsxMjkgICAgICAgIC0+IDEuM0UrMiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMTYxIGxvZzEwIDFFKzEzMSAgICAgICAgLT4gMS4zRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjIgbG9nMTAgMUUtMTIzICAgICAgICAtPiAtMS4yRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjMgbG9nMTAgMUUtMTI2ICAgICAgICAtPiAtMS4zRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjQgbG9nMTAgMUUtOTE2ICAgICAgICAtPiAtOS4yRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjUgbG9nMTAgMUUtOTk5ICAgICAgICAtPiAtMS4wRSszIEluZXhhY3QgUm91bmRlZAorbG9neDExNjYgbG9nMTAgMUUtMTI1ICAgICAgICAtPiAtMS4yRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjcgbG9nMTAgMUUtMTM1ICAgICAgICAtPiAtMS40RSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjggbG9nMTAgMUUtMTI5ICAgICAgICAtPiAtMS4zRSsyIEluZXhhY3QgUm91bmRlZAorbG9neDExNjkgbG9nMTAgMUUtMTMxICAgICAgICAtPiAtMS4zRSsyIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDMKK2xvZ3gxMTcxIGxvZzEwIDEwMDAwMDAwMDAwICAgLT4gMTAKK2xvZ3gxMTcyIGxvZzEwIDEwMDAwMDAwMDAwMDAgLT4gMTIKK2xvZ3gxMTczIGxvZzEwIDFFKzEwMCAgICAgICAgLT4gMTAwCitsb2d4MTE3NCBsb2cxMCAxRSsxMjMgICAgICAgIC0+IDEyMworbG9neDExNzUgbG9nMTAgMUUrMTI2ICAgICAgICAtPiAxMjYKK2xvZ3gxMTc2IGxvZzEwIDFFKzkxNiAgICAgICAgLT4gOTE2Citsb2d4MTE3NyBsb2cxMCAxRSs5OTkgICAgICAgIC0+IDk5OQorCistLSBsb2cxMCgyKSAuLiB0ZXN0cyBib3RoIGxuKDIpIGFuZCBsbigxMCkgY29uc3RhbnRzLCB0b28KK3ByZWNpc2lvbjogNTAKK2xvZ3gxMjAxIGxvZzEwIDIgICAgIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxNDYyMTEgSW5leGFjdCBSb3VuZGVkCitsb2d4MTIwMiBsb2cxMCAyLjAwMCAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2MjExIEluZXhhY3QgUm91bmRlZAorbG9neDEyMDMgbG9nMTAgMC4yRTEgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4ODE0NjIxMSBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDkKK2xvZ3gxMjA0IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4ODE0NjIxIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0OAorbG9neDEyMDUgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2MiAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ3Citsb2d4MTIwNiBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODgxNDYgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDYKK2xvZ3gxMjA3IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4ODE1ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0NQorbG9neDEyMDggbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MSAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ0Citsb2d4MTIwOSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTg5ODggICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDMKK2xvZ3gxMjEwIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk5ICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0MgorbG9neDEyMTEgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE5MCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQxCitsb2d4MTIxMiBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzY4MTkgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNDAKK2xvZ3gxMjEzIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgyICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzOQorbG9neDEyMTQgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2OCAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM4Citsb2d4MTIxNSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDI2NzcgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzcKK2xvZ3gxMjE2IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY4ICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzNgorbG9neDEyMTcgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM1Citsb2d4MTIxOCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkzMDMgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzQKK2xvZ3gxMjE5IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMworbG9neDEyMjAgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MyAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMyCitsb2d4MTIyMSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzI0NDkgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzEKK2xvZ3gxMjIyIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ1ICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMAorbG9neDEyMjMgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNCAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI5Citsb2d4MTIyNCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODk0NzIgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjgKK2xvZ3gxMjI1IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3ICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNworbG9neDEyMjYgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NSAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI2Citsb2d4MTIyNyBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzM4ODkgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjUKK2xvZ3gxMjI4IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg5ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNAorbG9neDEyMjkgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczOSAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIzCitsb2d4MTIzMCBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEzNzQgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjIKK2xvZ3gxMjMxIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMQorbG9neDEyMzIgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIwCitsb2d4MTIzMyBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMTk1MjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTkKK2xvZ3gxMjM0IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODExOTUyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxOAorbG9neDEyMzUgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MTE5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE3Citsb2d4MTIzNiBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTgxMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTYKK2xvZ3gxMjM3IGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjM5ODEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNQorbG9neDEyMzggbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2Mzk4MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE0Citsb2d4MTIzOSBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYzOTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTMKK2xvZ3gxMjQwIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU2NjQwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMgorbG9neDEyNDEgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NTY2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDExCitsb2d4MTI0MiBsb2cxMCAyIC0+IDAuMzAxMDI5OTk1NjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTAKK2xvZ3gxMjQzIGxvZzEwIDIgLT4gMC4zMDEwMjk5OTU3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgOQorbG9neDEyNDQgbG9nMTAgMiAtPiAwLjMwMTAyOTk5NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA4Citsb2d4MTI0NSBsb2cxMCAyIC0+IDAuMzAxMDMwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDcKK2xvZ3gxMjQ2IGxvZzEwIDIgLT4gMC4zMDEwMzAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNgorbG9neDEyNDcgbG9nMTAgMiAtPiAwLjMwMTAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA1Citsb2d4MTI0OCBsb2cxMCAyIC0+IDAuMzAxMDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDQKK2xvZ3gxMjQ5IGxvZzEwIDIgLT4gMC4zMDEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMworbG9neDEyNTAgbG9nMTAgMiAtPiAwLjMwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyCitsb2d4MTI1MSBsb2cxMCAyIC0+IDAuMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDEKK2xvZ3gxMjUyIGxvZzEwIDIgLT4gMC4zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCisKKy0tIE1vcmUgY2xvc2UtdG8tZSwgZXRjLiwgdGVzdHMKK3ByZWNpc2lvbjogICAzNAorbG9neDEzMDEgbG9nMTAgMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjEgIC0+IDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA0OCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzAyIGxvZzEwIDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyICAtPiAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMwMyBsb2cxMCAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MyAgLT4gMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUyIEluZXhhY3QgUm91bmRlZAorbG9neDEzMDQgbG9nMTAgMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgIC0+IC00LjM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA3M0UtMzMgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMwNSBsb2cxMCAwLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAgLT4gLTQuMzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUzRS0zNCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzA2IGxvZzEwIDAuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAtPiAtNC4zNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTFFLTM1IEluZXhhY3QgUm91bmRlZAorbG9neDEzMDcgbG9nMTAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgIC0+IDAKK2xvZ3gxMzA4IGxvZzEwIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAtPiA0LjM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA1MUUtMzUgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMwOSBsb2cxMCAxLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgLT4gNC4zNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNDlFLTM0IEluZXhhY3QgUm91bmRlZAorbG9neDEzMTAgbG9nMTAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSAgIC0+IDQuMzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDI5RS0zMyBJbmV4YWN0IFJvdW5kZWQKKy0tIGxvd2VyIHAKK3ByZWNpc2lvbjogICAgNworbG9neDEzMjAgbG9nMTAgMC45OTk5OTkgICAgLT4gLTQuMzQyOTQ3RS03ICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzIxIGxvZzEwIDAuOTk5OTk5OSAgIC0+IC00LjM0Mjk0NUUtOCAgSW5leGFjdCBSb3VuZGVkCitsb2d4MTMyMiBsb2cxMCAwLjk5OTk5OTk5ICAtPiAtNC4zNDI5NDVFLTkgIEluZXhhY3QgUm91bmRlZAorbG9neDEzMjMgbG9nMTAgMC45OTk5OTk5OTkgLT4gLTQuMzQyOTQ1RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzI0IGxvZzEwIDEuMDAwMDAwMDAgIC0+ICAwCitsb2d4MTMyNSBsb2cxMCAxLjAwMDAwMDAxICAtPiAgNC4zNDI5NDVFLTkgIEluZXhhY3QgUm91bmRlZAorbG9neDEzMjYgbG9nMTAgMS4wMDAwMDAxICAgLT4gIDQuMzQyOTQ1RS04ICBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzI3IGxvZzEwIDEuMDAwMDAxICAgIC0+ICA0LjM0Mjk0M0UtNyAgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lYXIgMTBeMworcHJlY2lzaW9uOiAgIDkKK2xvZ3gxMzMxIGxvZzEwICA5OTkuOTk5OTk5OCAgLT4gMy4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzMyIGxvZzEwICA5OTkuOTk5OTk5OSAgLT4gMy4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzMzIGxvZzEwIDEwMDAuMDAwMDAwICAgLT4gMworbG9neDEzMzQgbG9nMTAgMTAwMC4wMDAwMDEgICAtPiAzLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorbG9neDEzMzUgbG9nMTAgMTAwMC4wMDAwMDIgICAtPiAzLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNgorbG9neDEzNDEgbG9nMTAgIDk5OS45OTk5OTk4ICAtPiAyLjk5OTk5OTk5OTkxMzE0MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gxMzQyIGxvZzEwICA5OTkuOTk5OTk5OSAgLT4gMi45OTk5OTk5OTk5NTY1NzEgSW5leGFjdCBSb3VuZGVkCitsb2d4MTM0MyBsb2cxMCAxMDAwLjAwMDAwMCAgIC0+IDMKK2xvZ3gxMzQ0IGxvZzEwIDEwMDAuMDAwMDAxICAgLT4gMy4wMDAwMDAwMDA0MzQyOTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MTM0NSBsb2cxMCAxMDAwLjAwMDAwMiAgIC0+IDMuMDAwMDAwMDAwODY4NTg5IEluZXhhY3QgUm91bmRlZAorCistLSBzdWdnZXN0aW9ucyBmcm9tIElsYW4gTmVoYW1hCitsb2d4MTQwMCBsb2cxMCAxMEUtMyAgICAtPiAtMgorbG9neDE0MDEgbG9nMTAgMTBFLTIgICAgLT4gLTEKK2xvZ3gxNDAyIGxvZzEwIDEwMEUtMiAgIC0+ICAwCitsb2d4MTQwMyBsb2cxMCAxMDAwRS0yICAtPiAgMQorbG9neDE0MDQgbG9nMTAgMTAwMDBFLTIgLT4gIDIKK2xvZ3gxNDA1IGxvZzEwIDEwRS0xICAgIC0+ICAwCitsb2d4MTQwNiBsb2cxMCAxMDBFLTEgICAtPiAgMQorbG9neDE0MDcgbG9nMTAgMTAwMEUtMSAgLT4gIDIKK2xvZ3gxNDA4IGxvZzEwIDEwMDAwRS0xIC0+ICAzCitsb2d4MTQwOSBsb2cxMCAxMEUwICAgICAtPiAgMQorbG9neDE0MTAgbG9nMTAgMTAwRTAgICAgLT4gIDIKK2xvZ3gxNDExIGxvZzEwIDEwMDBFMCAgIC0+ICAzCitsb2d4MTQxMiBsb2cxMCAxMDAwMEUwICAtPiAgNAorbG9neDE0MTMgbG9nMTAgMTBFMSAgICAgLT4gIDIKK2xvZ3gxNDE0IGxvZzEwIDEwMEUxICAgIC0+ICAzCitsb2d4MTQxNSBsb2cxMCAxMDAwRTEgICAtPiAgNAorbG9neDE0MTYgbG9nMTAgMTAwMDBFMSAgLT4gIDUKK2xvZ3gxNDE3IGxvZzEwIDEwRTIgICAgIC0+ICAzCitsb2d4MTQxOCBsb2cxMCAxMDBFMiAgICAtPiAgNAorbG9neDE0MTkgbG9nMTAgMTAwMEUyICAgLT4gIDUKK2xvZ3gxNDIwIGxvZzEwIDEwMDAwRTIgIC0+ICA2CisKKy0tIFJhbmRvbXMKKy0tIFA9NTAsIHdpdGhpbiAwLTk5OTkKK1ByZWNpc2lvbjogNTAKK2xvZ3gyNTAxIGxvZzEwIDAuMDAwMzU0NDgwMDE2Njc5NjgxNDE3NzU4OTEyNDY5OTE5MTI2NTU5NjExNjMzNDU5MDQgLT4gIC0zLjQ1MDQwODI0MjU0MTE3NzUyOTA4NjQwNTMzMTgyNDcyNzQ5NDQ2ODU1ODYxODg1MDUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUwMiBsb2cxMCA3MC42MzY0NTU3MjY0MjQzMTEyMjgyNTUzMzg2Mzc5MzUzMzA4MjY5OTUxMzY1OTc2NDQgIC0+ICAgMS44NDkwMjg4OTk4NDA4NDkyMDQ1NzkzMDcwMjU1MzAyMzM1NTU4MTQwOTc1NzE5MjQ3IEluZXhhY3QgUm91bmRlZAorbG9neDI1MDMgbG9nMTAgMC4wMDAwMDAwMDAwMDAwMDIzMzU1MDM2MjQ3MzgyMTg4OTA2MDgxMjgwNDA2MzA0MDE2OSAtPiAtMTQuNjMxNjE5NDU0MzQzODM0ODU4MDIzNTc4Mjk5MTQyODY2NTU3NzE3OTA0MjIzNjY3IEluZXhhY3QgUm91bmRlZAorbG9neDI1MDQgbG9nMTAgOTcuNzgzNjI4NjIxNTIzMjQ0Njc5OTAxMjYwMzU4Mjg2ODk4OTU4ODMyMTM1NDMzNzY0ICAtPiAgIDEuOTkwMjY2MTQ5MzIyNDIxOTUxNzg5NzY1Nzk2NDM2MjU3MTY5MDU5MjczNDQwNzMzMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTA1IGxvZzEwIDAwNjIuMjM3NzEzNTMxNTg1ODM5MjgwMjYxMjgxMjAyMjgwNzgzODU5OTU3MjAxNzM0MiAgLT4gICAxLjc5NDA1MzYyOTMwODUwNjYxOTkyODc2MzI3MjUwMjY4MzcwMTg0ODY1MzM1NDQxNDEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUwNiBsb2cxMCA2LjM3Njc2MzQ2NTIwNzEwNTM2MTk5Nzc2MDI4MDQ3MjQxMjk2NTI5ODE3NDc4Nzk1MzIgIC0+ICAgMC44MDQ2MDAzMDc4OTgyNTk2MTYxNTEwMDE2MzU3NjA4MDc2MTMyNjg1NzM3NDA5ODY0NCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTA3IGxvZzEwIDYzLjI5NzA4ODk4MTMxMzI3ODUyOTMwNjUzMzgxNDE5NTA2ODg1MDUzMjY2NjY1ODc5OCAgLT4gICAxLjgwMTM4MzczNzM3MjQ0MjcwOTI0MTcxNzAxNDkwOTg2MTQ0MTA4NDkzNTM4Mzk2NzMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUwOCBsb2cxMCAwLjAwMDAwMDc3MjM5NjkzMzE2ODgxNzk3NzE3ODIwMTEwODk4MTY3NzIxNjAyMjk5MTg3IC0+ICAtNi4xMTIxNTk0NTkyNzE4NTUwNjEzNzczODg2MjQxOTUxOTY2MjY0ODI2NzYwMzEwMDQ3IEluZXhhY3QgUm91bmRlZAorbG9neDI1MDkgbG9nMTAgMC4wMDAwMDAwMzk1MzU4MDM1OTc4MDE4NTUzNDgzMDU3MjQ2MTkyMjUyNzgzMTM5NTAwMiAtPiAgLTcuNDAzMDA5NDI5MzgzMzg0NzEzNjI1MjU0NzA2OTkwNTQ3NzIxMzU0MTc4NzE3NzU2MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTEwIGxvZzEwIDc1NC42MjkwNTgxNzM2OTk4OTE2OTE4ODk5ODExMTUyNzI3MjY4ODc5MTU0NDU3NzIwNCAgLT4gICAyLjg3NzczMzUyNDM3NjEzMDAwNDc3NTg1MzQzMDQzNzE5MTIwOTk5NTgwNTc1NDU0MTYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUxMSBsb2cxMCAwLjAwMDAwMDQ4MzYwMzc4NDEwMjQxNDI4OTM2NjA3MTQ3MDU2MjgzMjgyODQ5MTU4MzEyIC0+ICAtNi4zMTU1MTAzMDk1MzA5MzUzNDU3NjA0MDM4Mzk3OTgwMDkxNjUwNzYwMzQ2MzM0NTEyIEluZXhhY3QgUm91bmRlZAorbG9neDI1MTIgbG9nMTAgMC4wMDAwNzUwOTAzNzU4MzY0NTYxMjU3NzE5NjEwNDU5MTY3MjA4MDU0MjkzMjE2NjA4OSAtPiAgLTQuMTI0NDE1NzIxOTcwMDE2NjMxNDAxMjM0NDcwNTUzODA4ODAzMDU5Mjg5NjExMTAyNiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTEzIGxvZzEwIDAuMDAwMDAwMDAwMDA3MDU0NzU5NDQ2Mzg5MTUwNTM0MTk4MzkwNjM1Njc4OTgwOTIwNjQgLT4gLTExLjE1MTUxNzc5MDI1NjQ2NjA0ODU1MzgxMDAwMjUyNTg2ODE5ODE3ODE2Nzk1MDM3NyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTE0IGxvZzEwIDkuNjIxMDMwMDQ2MDQ5NzY1NzkxNzQ0NTQxMDk0NzA5OTYzMzQ3OTYwOTE2NTEyMDY2MSAgLT4gICAwLjk4MzIyMTU3MDkzMjYwOTc4MjA2NjMzOTIyODc3NzE2MDc4NjgzNTE4NjE3NzY4NDExIEluZXhhY3QgUm91bmRlZAorbG9neDI1MTUgbG9nMTAgMC4wMDAwMDAwMDA1MDE1MDM2MTM4NjU1NTUyNzQ5NjYwNzI0NTk3NjEyMDg2NDk4NTYxMSAtPiAgLTkuMjk5NzI1OTMzMDc5ODI2MTA0MDQxMTA4NjgzNTU2MzIzNDM5MDkzNDkzNDYyOTM0MCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTE2IGxvZzEwIDA5OC4yNDc1NDAyOTczMTk5NDEyNTc5NzcyMzU0NTMzMzY3NzYwNDQ5MDA3NDgxMDc1MSAgLT4gICAxLjk5MjMyMTY4NjI4NzQzMzcwNzc3OTUyNzg2MjkzNTEwNjA4MTkxMDU2Nzk2NzA2MzMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUxNyBsb2cxMCA3LjUwOTE5OTgxNTAwNDY5OTQzMjA0NDE0NjM4NTQzMDE2MjQ3NDI0OTEwMTU3NTI5ODAgIC0+ICAgMC44NzU1OTM2NjA3ODAwNTkyNDA4MDc2NjQ2OTE1ODc2MzQ5OTcyNTQxNDAyNDEyODc4MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTE4IGxvZzEwIDAuMDAwMDAwMDAwMDAwNzk1NDA1NzEyNzMzMzAwNzUxOTM2Njg1OTY5NDIyNjg1NDI0MjUgLT4gLTEyLjA5OTQxMTI5NDE2NTE3NjAyODgxNzMwNTEwODQ3NTMyNjMyNTAwNjI1MDkzNjk2MyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTE5IGxvZzEwIDAuMDAwMDAwNDIzOTUwMzQ3OTk1NTUyMTU3ODI5MDc1MTUwNzQxMzQxNTQ5MTU0OTE3MDEgLT4gIC02LjM3MjY4NTAwMzkxMjUzODExMzQwNjk0NTA4MDIxMDg4OTMwNzU2MDQ0NjQxMzUyOTcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyMCBsb2cxMCA1Ni42ODMzNzYzMDQ2NzQzNTU0ODE5MDUwMjMxNDUyMzg3OTk5MDkzMDE3MzI2OTQ5ODIgIC0+ICAgMS43NTM0NTU3MTA3ODUzNDgwNDM1NzAzNDIxODI2MDc3NjA2MjUwNjM2NTgwMDkxNzU0IEluZXhhY3QgUm91bmRlZAorbG9neDI1MjEgbG9nMTAgNDguNzM0MDMzODExNDQ0MTk1MDcwODA3NjA2NzIxNTE3MTY5ODEwNDM4MDQ5NTgxMjI3ICAtPiAgIDEuNjg3ODMyMzYwMjc0MTA2NTE5MDk0MjY1NDcxMDA0OTQzMzgwODIwODI5MTU2NDA0OSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTIyIGxvZzEwIDAuMDAwNzQ4MzAzMTA5MzAwNDY4NjUwMDk4NTE3MDY5ODk0MzAyMjg1NjE4ODAyMjEwNjMgLT4gIC0zLjEyNTkyMjQ1MDIyMDk5NzQwODIyMjM2Njc3MTIwMTY0NDU1NzI0MzE3OTE5MjA2MTggSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyMyBsb2cxMCAzNi42NzczNDg4ODUxMTE1OTMzODQwMjA4MzY3MjAzOTYyNjI0OTcxMjI3MDg1OTgzNTkgIC0+ICAgMS41NjQzOTc5MzY0MjYwNzk2MDg2NzU0NTMwMjgyMzAyNjA1NDc3NTY3NDY5Mzk1NDI1IEluZXhhY3QgUm91bmRlZAorbG9neDI1MjQgbG9nMTAgMC4wMDAwMDAwMDAwMDAwMDAwNDQ5NTY3ODU2MDQ4MDQzMjg1ODgxMjQxOTE0NTgzMzc0NCAtPiAtMTYuMzQ3MjA0NzQ4MjM5NzQwNTEwMDE0MzIwNjMwMzYzMjQ0MDE1OTE2MDI5NjE5NTYxIEluZXhhY3QgUm91bmRlZAorbG9neDI1MjUgbG9nMTAgOTUwOS41ODU0MDEzNjUwNjQyNzk5Mzc0MTU5MTMxOTQwMTA4NzQ4NTk0Nzc0MzA3MTA0ICAtPiAgIDMuOTc4MTYxNTgyOTkxNjMyNjc0MTEwMDE2NjUxOTcyNjgyNDQzMDk0NTQwNjMwMjY2MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTI2IGxvZzEwIDAuMDc4MzQ4OTEyNjg2ODkxNzcwMTQwNDQ0NTQ3OTM2MDg3MTUyNzY2MTU3NDM4MTkwOTcgLT4gIC0xLjEwNTk2NzAyNjIxOTc2NDMxNDc4MDU1MTczOTg2MjEyODg4OTc2Njk4NzY5OTYzNDggSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyNyBsb2cxMCAwLjAwMDAwMDI5NTg0NTI5ODgwNzA2MTI4NDQ0NDU0Njg4NDU0OTk5MDMyODAxOTA0Nzk0IC0+ICAtNi41Mjg5MzUzMjc1ODE0MDQzNzEwMDc2NTI2OTIwNTY2NzIxNTcwMzc1MDI2OTE3MjA2IEluZXhhY3QgUm91bmRlZAorbG9neDI1MjggbG9nMTAgMy4wNzEzNDk2NTQ0NDk3NjE4MDk4Nzk0MzMyNzg3NzcyMTg2MTc2OTgxMDExOTA0Mjk0ICAtPiAgIDAuNDg3MzI5MjYxMDM4OTY4Mjg1NDY0MjQzNDEwMjk0OTI0NjgxMDA0MzE0MTQwNzI5OTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUyOSBsb2cxMCAzNTIuNjYzOTI2NzA3ODg4MTY0NzQ0MDc0NDI3ODU0NjA4MDM4MzM5MjcxMzY0MTM5NDMgIC0+ICAgMi41NDczNjEwMzg4MTk5NTYyNzE0NzA5ODM2Mzk4MjQzOTMzMzIwMjg0MDc3MDA4MzE0IEluZXhhY3QgUm91bmRlZAorbG9neDI1MzAgbG9nMTAgMC4wMDMwNDc0MzEyNTE4MTg3NjI2NzIxMDUxNjUyNzM2MTc0MjE4NTYxNzA5MTgwMTY1MCAtPiAgLTIuNTE2MDY2MDgzMDE2Mzk4MTk2Nzc3NDEyNDc0NTMxMTQ5NzQ0NzA1MDA1NjQwMDIwNyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTMxIGxvZzEwIDAuMDAwMDAwNzYxMjA1MzU4OTQ5NTIxMzY0OTkyNTAzNjQ2MDQ1MzgxMTc3Mjk0MzcxODMgLT4gIC02LjExODQ5ODE2MjkwNDcwNTE1MzI0NDg0MTM4NjM5NTA3NzY0OTY2NTI0ODMwMTk0MTUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzMiBsb2cxMCA3NjkuODg3OTU5Nzg1MzQzNTMwNTI5NjUyODYxOTUwNTM3MzUwMDc0NzMxODc3MzU4MTUgIC0+ICAgMi44ODY0Mjc1Mjc3ODYyNjUyNzA5OTg2NDk4NTgxMDY0MTE3OTUwMjg4Nzk4MjIyMTAwIEluZXhhY3QgUm91bmRlZAorbG9neDI1MzMgbG9nMTAgMC4wMDAwMDAwMDAwMDAwMDA0MTI5NzQ5NDgwODYxMjIyNjMwNDYxOTU3MDAxNjMzNjE4OCAtPiAtMTUuMzg0MDc2MjkyNzQ1NDE1OTE3NTEwNjY4NDU0MzYxODY4NjU5NDY4NjY5ODA0NzEwIEluZXhhY3QgUm91bmRlZAorbG9neDI1MzQgbG9nMTAgODYwLjg4ODY0NTk1NzE0NDI2OTQwMjQ3OTQwOTYwMjU4NTU4ODc2OTAzNzQxOTY2OTc0ICAtPiAgIDIuOTM0OTQ2OTgwMDU1NDI3NzkxNTkyMDI3ODA5MDY0NzI4MzIzMzQ0MDg1OTE1NTE3NiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTM1IGxvZzEwIDU4MzkuMDMyODgxMjk5NDc4NzIzNTkwMDE3ODU4NzM3MTA1MTA5Njg5ODY4Mzk3MjQ0NCAgLT4gICAzLjc2NjM0MDkyMDg5NzIzOTI1NjkyNjkxMjU1Mzk0Mzg4NzQ3MzcxNDc5MDYyMzg1NDMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzNiBsb2cxMCAwLjAwMDAwMDI4NTMyNzEwMTUxMjg0ODQwNDcxNjcwNDk3MTEyODIxMjAxNTk4Mzc3ODQxIC0+ICAtNi41NDQ2NTY5NzUzNTE0MDI3Njc1ODc4ODc5ODQzMjM4MDY1NDg4NDkwNjE4MTU5NDkwIEluZXhhY3QgUm91bmRlZAorbG9neDI1MzcgbG9nMTAgMC4wMDAwMDAwMDAwMDAwMDAwOTczNDQ5MDA1OTkzMTYzODQ4MzQ0NTYzMTgzNTY1MTU4MSAtPiAtMTYuMDExNjg2Nzk0MDExMjcxMTM1OTc4NjMzODgwODY0Mjc4NjkyMjU0MjQzMTA2OTMxIEluZXhhY3QgUm91bmRlZAorbG9neDI1MzggbG9nMTAgNS44NjEwOTQ5NTI2NDM5NTI5NDg5MjUyMzAyNDYzNDUwMzAyOTgxNTExNzE0MTQ0MzMwICAtPiAgIDAuNzY3OTc4NzU3MjI0NTI1NDkyODEwMjg1NTIwNjc2NDU3MzI0OTA5MjkzNjE5NTIyNzggSW5leGFjdCBSb3VuZGVkCitsb2d4MjUzOSBsb2cxMCA2LjYyODI0MzIyMjExMTU5MjMzNzIxNTExNDg5OTAxMzcxNzk2MTE5Nzc1NzYzMjcyMDYgIC0+ICAgMC44MjEzOTg0MzYzOTIyNzIxMzIxMTAxMjA0NDAwMDc4NTc1NzI2NzE1NTczNjA3MTM2MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyNTQwIGxvZzEwIDAuMDAwMDAwMDAwMDE5OTQwNzE4NjIzODY4NDY2MjY5NTQ4MTk5MjM5MjMzNDQ0MTM0NTQgLT4gLTEwLjcwMDI1OTE5NDYzMjMzOTk4MDI2NjU1OTIyNDQ0NzIxMjI2MDExNTAyMTYzNzYyNiBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD0zNCwgd2l0aGluIDAtOTk5OQorUHJlY2lzaW9uOiAzNAorbG9neDIyMDEgbG9nMTAgMS41MjI1MTMyMDM4ODk3MTQxNzkwODgzMjczMjg4NjQxODMgIC0+IDAuMTgyNTYxMDY3NzA5ODg5NjI1MDQ5NjY1MTMzMDQ5MjEwOSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjAyIGxvZzEwIDAuMTcxMTIzNzc0NzY5NzE3MzE2MTU0MDgwODg4OTMwNDA0ICAtPiAtMC43NjY2ODk2NDgzNTQ4NDYyNTgyNDYxODk4MDkyNzY0NDA4IEluZXhhY3QgUm91bmRlZAorbG9neDIyMDMgbG9nMTAgMC4wMDAwMDAwOTk3NDY3MjM2MjUxNzE0MjgzMTA0OTYzODM4IC0+IC03LjAwMTEwMTM2MDY1MjUxODI3NDI3MTU2OTAxMDMxMjExNSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjA0IGxvZzEwIDAuMDAwODg1NjEwMzYyNDEyMjQ3OTc2OTY0NzU0MzQ2ODYzMyAtPiAtMy4wNTI3NTczMTA0NzYwNzA4OTE4MzA0OTAzMjcxMzgxOTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIwNSBsb2cxMCAxLjkzODI3NDg2ODczODAzMjkzMDcwOTQ5ODIyMTIzNjc1OCAgLT4gMC4yODc0MTUzNjQ4MjU5NDQ5NTIwMjAxNTM2MTcxNzE0NTk0IEluZXhhY3QgUm91bmRlZAorbG9neDIyMDYgbG9nMTAgNDc5LjU2Njc4NDc4MjM4MjY3MTMwODI2MTM0NDUwMTAwOTcgIC0+IDIuNjgwODQ5MDk1ODUwMzYxMDY4NzA5MTY1MTU3Mjg2NDM1IEluZXhhY3QgUm91bmRlZAorbG9neDIyMDcgbG9nMTAgODg1Ni4xMzY1OTkxNzg4MjAyMDIxNDE4MjMxNTczMzY4MDQgIC0+IDMuOTQ3MjQ0MzA2NTg0NzY3MTAxNDgwNDU0MjYxOTUwNTU5IEluZXhhY3QgUm91bmRlZAorbG9neDIyMDggbG9nMTAgMC4wMDAwOTExMDI2MzE4ODAxOTAzOTgyNjQyODcxMzQ0ODU4IC0+IC00LjA0MDQ2OTA3NjQzNDk3OTM5ODQzODYxNzQ2NDAzMzgyNiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjA5IGxvZzEwIDAuMDAwMDAwMDAwMDAxNzI3MTExMjY1MDQyNzQxNDczMjYzMCAtPiAtMTEuNzYyNjc5NjgzMTQwMzg3NDg5OTUxNzgyMTI2NTQ5MjEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxMCBsb2cxMCA2Ljk2MjYwNTM3MDA3ODg4NTY0NzYzOTUwMzU0ODIyOTY5NSAgLT4gMC44NDI3NzE3ODA3MjAwMzIyMzUyNjg2Mzk2OTI1OTkyMjUwIEluZXhhY3QgUm91bmRlZAorbG9neDIyMTEgbG9nMTAgMC4zMzU0ODA0NDI4OTkyNzkzMTMyODU1OTIzNTQxNjkyNzgxIC0+IC0wLjQ3NDMzMjc5MjMwMTIxNTkxNzA5Njc2MzYwNzA4NDQ4MzQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxMiBsb2cxMCAyLjA3OTg2NDI1NzQ3NDg1OTAwODI1MjE2NTgzNjY2MzUwNCAgLT4gMC4zMTgwMzQ5OTE2MTk4MDU5MDQ2ODEyNTA2NzQxMzg4ODU2IEluZXhhY3QgUm91bmRlZAorbG9neDIyMTMgbG9nMTAgMjgwNS40Nzk1MjkyOTI5Mzk0OTkyMjAyNzY5ODY2MjE5ODggIC0+IDMuNDQ4MDA3MTA0MTM5OTc0MzQ0NTY1OTc4NzgwNjI0NzQ0IEluZXhhY3QgUm91bmRlZAorbG9neDIyMTQgbG9nMTAgNjYuNDU3MzExMzMwMzQxODczNzQ1NTcwMjg1MzcyMTM5NDkgIC0+IDEuODIyNTQyNzY3MDA1NjQ0MDQxNjYxNTIwOTM2MjIzMDg2IEluZXhhY3QgUm91bmRlZAorbG9neDIyMTUgbG9nMTAgMC4wMDAwMDAxMjA2NTIxMjYxNzYyNjgxNzM4Mjc0ODIyODM1IC0+IC02LjkxODQ2NTAyMDM5MDIxNjk2OTU2MTQ5NDc1NTc2NzMxOCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjE2IGxvZzEwIDAuMDAwMDAwMDAwMTg4NDg5MTkxNjI2NDQwMTE2MDQ3MjM4MSAtPiAtOS43MjQ3MTM1NDgxMTkwNjUzODYwOTE5MzMwMDc1Mjg2MzMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIxNyBsb2cxMCAwLjAwMDAwMTU0NjcyNzk1NTE3MjYzMjY1ODEzMTQ1ODI3NTkgLT4gLTUuODEwNTg2MDY1MDcwNDM1MzgzNzU1NzU5NTE0NjA4NzM4IEluZXhhY3QgUm91bmRlZAorbG9neDIyMTggbG9nMTAgMC4wMDkwNzc2MzE2NzI4MDY4NTg2NzQ0NjMzOTE0MTM1OTUyIC0+IC0yLjA0MjAyNzQ0Mjg0Mzc0NTg4NDUwMzI4MDk1NDM5MDExNCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjE5IGxvZzEwIDAuMDAwMDAwMDAwMDAyNDU0MTEwNjUyODcxMzM5Mzc0MDAzMCAtPiAtMTEuNjEwMTA1ODU5MzU2MzU3MTMwOTAxMTkxNTYwNjk0NzkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIyMCBsb2cxMCAxNC4xMjkzNjg3OTM4NTg2MzQxMDA4MTA4Nzc1MDY0NTg1NiAgLT4gMS4xNTAxMjI3NjA4OTU0NjY5ODk4NDEwNTczODU3NDI2NjIgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIyMSBsb2cxMCAwLjAwMDAwMzY5MTI0ODE4MzEzOTI5MjI5MjI2NDcyMzEzOTIgLT4gLTUuNDMyODI2NzUzNzg5ODkyMjgzNTU2MjExMzgwODI0MjAzIEluZXhhY3QgUm91bmRlZAorbG9neDIyMjIgbG9nMTAgMC4wMDAwMDAwMDA0MDY3NDc3NTI1NDIwNDI0MjcwMTM4NzM0IC0+IC05LjM5MDY3NDgzODA1MDA3MzEyMjg1Nzg2ODAxMjQ3NTA2MCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjIzIGxvZzEwIDcwODAuMTIyNTYyNzA1Mzk5NzQ0OTY5MzE5NTg5ODA2MTk0ICAtPiAzLjg1MDA0MDc3NTc0NzEwMzMxODcyNDMzMDA0NzU0NjkxNiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjI0IGxvZzEwIDI2MS4zNDkxNDExMzYzNjc5MjA5MTc1NTI0NzkwMjU1NzI1ICAtPiAyLjQxNzIyMTA3NzIyNzUzNjMxOTY1NTY5OTUxNzUzMDg1NSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjI1IGxvZzEwIDAwMy45OTQ1NTgxNDQ5OTE1MjQwMDk0NzI4MzgwMDQxNDk0ICAtPiAwLjYwMTQ2ODc0NzE1MzE5ODgyNjA4MjMwNjY5OTc4NDU2OTEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIyNiBsb2cxMCAwLjAwMDAwMDAwMDA1ODM1NDkxNjQ1ODg0OTUyMDY3Njc4NDAgLT4gLTEwLjIzMzkyMjU0ODM0MTgyNjc3MDIzMjMxNzEzNTE5MzQxIEluZXhhY3QgUm91bmRlZAorbG9neDIyMjcgbG9nMTAgOTU2Ny45NjE4MzI2MDcyNDAyNzgzNDI3NjEwODg0ODc0ODQgIC0+IDMuOTgwODE5NDM0MjExMTA3NjMxNTY5Mzg2MTQ3MDE2MzY4IEluZXhhY3QgUm91bmRlZAorbG9neDIyMjggbG9nMTAgMDYuMjY1OTI5NzkxNjAzNDI5NzI3NzcyMTk4Mjg4NjcwMzMgIC0+IDAuNzk2OTg1NTI0Mzk2NjIyMTQwODU5NTAyNDAxMjU3NDcyOSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjI5IGxvZzEwIDAuMDAwMDAwMDAwMDU4OTg0NzA0NjU5ODA2NzI3MzI4NzMxOSAtPiAtMTAuMjI5MjYwNTkwNzgyMDYyMTg3MTc3NTUyNTM1ODI5MDcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIzMCBsb2cxMCA1NjcuOTM4ODY0ODIzNTU4OTIwNDc2OTQ0Mjg2MzcyNDk5NyAgLT4gMi43NTQzMDE1ODkwNTgzMTM1NzY0NzIzODAyNjI5MDc2MzggSW5leGFjdCBSb3VuZGVkCitsb2d4MjIzMSBsb2cxMCAwMzkuNzc5MDMyNTQ4MDAzNzc3ODkxODE2MjI2NDg4MzQxNSAgLT4gMS41OTk2NTQyMTY1OTIwMTkxOTk2MzkyODUzMDg5OTc4ODYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIzMiBsb2cxMCAwLjAwMDAwMDAwMDUxMjM5NTE5MjE4OTQxNjIxNDk4MTcyMDcgLT4gLTkuMjkwMzk0OTUzODk4ODYyNjk0ODQ3MzI3MTM3MjQyNjkwIEluZXhhY3QgUm91bmRlZAorbG9neDIyMzMgbG9nMTAgMC4wMDAwMDAwMDAwMDM4NTAwOTk5NzIzNjM2OTA0Mjc2NzIzIC0+IC0xMS40MTQ1Mjc5OTMzNzkyNDA1NjE4Njg2NzMyNDg1NDY5MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjM0IGxvZzEwIDAuMDAwNjcyNjUwMDY1ODk3Nzc1OTgyNTYxNjUzNzkzNTg2NCAtPiAtMy4xNzIyMTA4MTA5MjI3Njg3MjU2ODc2NzE4NDk0MjE3OTIgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIzNSBsb2cxMCAyNjAuMjQwMDI1MDQ3NTk2NzUyODQyOTk0Mzc3OTEyNjUwNyAgLT4gMi40MTUzNzQwOTIwNzM3OTkyMDQyMzY4MDEzODMwNzAwNjQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjIzNiBsb2cxMCAwLjAwMDAwMDAwMDYxMDE5NDIzMzkzODUxMDI1ODUwNDI1NDggLT4gLTkuMjE0NTMxOTAwNTYyMDQ2NTU3MTkxMjYxMjI2NjMyNTA5IEluZXhhY3QgUm91bmRlZAorbG9neDIyMzcgbG9nMTAgMC4wMDAwMDAwMDEwODQ2ODY3NTAxMzgyNzQ2NzYwMDY2NTU3IC0+IC04Ljk2NDY5NTY2NDg4MzI4MjQwNjM1OTg3NDI0MjM4NzIzNiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjM4IGxvZzEwIDYwLjI0MDc4Mzc1NTY4ODE0NzY5MDEwMzMzNzExNTA5OTI4ICAtPiAxLjc3OTg5MDYxMzU2NzA4NDI1MzE2ODM3MzI2NjY0ODkyMiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMjM5IGxvZzEwIDAuMDAxMjA1ODczODcxMTc1NzY2OTMzNzYwMDI1Mjk4NjA5MyAtPiAtMi45MTg2OTgxMTUwMTI2MDU5MTU3NTM3MjgyMjA4OTYwMTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjI0MCBsb2cxMCAyMzAuOTQ1MDkzMDE5Nzg0MTYwMDYxMTUwMzA5NTE4NTYwMCAgLT4gMi4zNjM1MDg3MzkwNTY4MjI4NDY3NDI5NDI1OTk2Mjg5NjYgSW5leGFjdCBSb3VuZGVkCisKKy0tIFA9MTYsIHdpdGhpbiAwLTk5OQorUHJlY2lzaW9uOiAxNgorbG9neDIxMDEgbG9nMTAgMC4wMDcyMDY3MTE5NjA1MTg0IC0+IC0yLjE0MjI2MjgzNTU3MzAzOCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTAyIGxvZzEwIDUwMy42ODI4NDgyMjI2NjI0ICAtPiAyLjcwMjE1NzE2MjE5NTY1MiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTAzIGxvZzEwIDY0Ljk2MDc0NDQ3ODIxODE1ICAtPiAxLjgxMjY1MDk5MzQ2NDE3NCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTA0IGxvZzEwIDQ4Ljc1NDA4NTk3NDY3MjQ2ICAtPiAxLjY4ODAxMTAxODg0MjYwMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTA1IGxvZzEwIDAuMDMyOTAwOTgzOTI2OTU4NyAtPiAtMS40ODI3OTExMTM5NzUyODAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEwNiBsb2cxMCAyMjMuNTMyMDQxNTA2MDYzMyAgLT4gMi4zNDkzMzk3ODQ1MjM0MTAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEwNyBsb2cxMCA3My4xMjc2NTAwMjI5MjE5NCAgLT4gMS44NjQwODE2MTc0NzYyNjggSW5leGFjdCBSb3VuZGVkCitsb2d4MjEwOCBsb2cxMCA0ODcuMzc0OTM3ODM1ODUwOSAgLT4gMi42ODc4NjMxOTI4MDIyNTIgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEwOSBsb2cxMCAwLjAwMDAwMTk2NzE5ODc2MjEgLT4gLTUuNzA2MTUxNzU3NTU3OTI2IEluZXhhY3QgUm91bmRlZAorbG9neDIxMTAgbG9nMTAgMC4wNTcwNjgwNjYwNjA5Nzg0IC0+IC0xLjI0MzYwNjg0NDY5Nzg3MyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTExIGxvZzEwIDMzLjEwMzExNjM4Nzg4OTk4ICAtPiAxLjUxOTg2ODg4MDk3Njc3MyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTEyIGxvZzEwIDAuMDY4NzM4MjY5OTE4NzA3NyAtPiAtMS4xNjI4MDE0MDI4NjgxODUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjExMyBsb2cxMCAyNTguOTQxNjE5MzYyNjQ4NCAgLT4gMi40MTMyMDE4NTk2NTQxNDUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjExNCBsb2cxMCAwLjAwMDUzMDYxMDAxMzY3MzYgLT4gLTMuMjc1MjI0NTU4MjY5NzI1IEluZXhhY3QgUm91bmRlZAorbG9neDIxMTUgbG9nMTAgNjUuNzg0OTAzOTM0MDg1NzIgIC0+IDEuODE4MTI2MjQ0ODI1MTA5IEluZXhhY3QgUm91bmRlZAorbG9neDIxMTYgbG9nMTAgNTA0LjIzMjg4NDIwNzM1MTAgIC0+IDIuNzAyNjMxMTY1MzQ2OTU4IEluZXhhY3QgUm91bmRlZAorbG9neDIxMTcgbG9nMTAgOS40MTc0MzI3NTU4MTUwMjcgIC0+IDAuOTczOTMyNTI3ODUyNDUwMyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTE4IGxvZzEwIDAwNi43MDU0ODM1MzU1NDk4ICAtPiAwLjgyNjQzMDEwMDQ5NDc2NDAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjExOSBsb2cxMCAwLjA5MTcwMTIyNzIzNjM5MTUgLT4gLTEuMDM3NjI0ODUyMTMzMzk5IEluZXhhY3QgUm91bmRlZAorbG9neDIxMjAgbG9nMTAgNS45NTk0MDQzODUyNDQ5MjEgIC0+IDAuNzc1MjAyODU2MTk1MzQwMSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTIxIGxvZzEwIDAuMDAwMTIwOTc1OTE0ODQ4NiAtPiAtMy45MTczMDEwODQ5Njg5MDMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEyMiBsb2cxMCAwLjAwMDQ3MDYxMTIxMzk4MzggLT4gLTMuMzI3MzM3NzI4NDI4MDM5IEluZXhhY3QgUm91bmRlZAorbG9neDIxMjMgbG9nMTAgMC4wMDY5NzAwNDU3Mzc3MDQ2IC0+IC0yLjE1Njc2NDM3MjAzNTc3MSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTI0IGxvZzEwIDAuNTE1NTU4NDU2OTg1MjYxOSAtPiAtMC4yODc3MjIwODQ3ODA1MDI1IEluZXhhY3QgUm91bmRlZAorbG9neDIxMjUgbG9nMTAgODguMDYwMDU4ODU2MDc0MTQgIC0+IDEuOTQ0Nzc4OTcxMzg5OTEzIEluZXhhY3QgUm91bmRlZAorbG9neDIxMjYgbG9nMTAgMC4wNDQ4MjQwMDM4MjE5ODY2IC0+IC0xLjM0ODQ4OTM1MzUwOTcwOSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTI3IGxvZzEwIDMuNDE5NjIyNDg0MDU5NTY1ICAtPiAwLjUzMzk3ODE2MzkxMDExNDUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEyOCBsb2cxMCA1LjE3MTEyMzM1Mzg1ODcyMSAgLT4gMC43MTM1ODQ4OTc3MTQyODU0IEluZXhhY3QgUm91bmRlZAorbG9neDIxMjkgbG9nMTAgMC4wMDAyMTMzMTg4MzE5ODA3IC0+IC0zLjY3MDk3MDgwMjk0NTg3MiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTMwIGxvZzEwIDQ2LjIxMDg2NzAzMTM2OTY2ICAtPiAxLjY2NDc0NDExNzA0NTE0OSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTMxIGxvZzEwIDAuMDAwMDYzMTA1MzcxNDQxNSAtPiAtNC4xOTk5MzM2NzI2Mzk4ODAgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEzMiBsb2cxMCA3OC42NjAxOTE5Njg3MDY5OCAgLT4gMS44OTU3NTUwMDE5NjI0NjkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEzMyBsb2cxMCAwLjAwMDcxNTIyNzgzNTExODggLT4gLTMuMTQ1NTU1NTkyMDgyMjk3IEluZXhhY3QgUm91bmRlZAorbG9neDIxMzQgbG9nMTAgNDUuNTI1MDk4MTk5Mjg1MzYgIC0+IDEuNjU4MjUwODkxMjU2ODkyIEluZXhhY3QgUm91bmRlZAorbG9neDIxMzUgbG9nMTAgMC4wMDAwNzAzMjI3Nzk1NzQwIC0+IC00LjE1MjkwMzk3MTY5NzE4MyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTM2IGxvZzEwIDI2LjI0NDM4NjQxNDI2NjY5ICAtPiAxLjQxOTAzNjQyMzU1MDU5OSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTM3IGxvZzEwIDAuMDAwMDA0NDY1NDgyOTUzNSAtPiAtNS4zNTAxMzE1NjQxNjY4MTcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjEzOCBsb2cxMCAwLjczNjA3MDI3MzMwNjI1MjkgLT4gLTAuMTMzMDgwNzIxMTg5MzYxMSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMTM5IGxvZzEwIDguNDE3MDU5MTc2NDY5NjU1ICAtPiAwLjkyNTE2MDM4MDUxMTI3NzggSW5leGFjdCBSb3VuZGVkCitsb2d4MjE0MCBsb2cxMCAwLjAwMDI5MjY1NzA3Njc5NjggLT4gLTMuNTMzNjQwOTY5NjY0ODE4IEluZXhhY3QgUm91bmRlZAorCistLSBQPTcsIHdpdGhpbiAwLTk5CitQcmVjaXNpb246IDcKK2xvZ3gyMDAxIGxvZzEwIDU3LjI2MDg5ICAtPiAxLjc1Nzg1OCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDAyIGxvZzEwIDAuMDU3NTQyMSAtPiAtMS4yNDAwMTQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAwMyBsb2cxMCAwLjU5MTg0NjUgLT4gLTAuMjI3NzkwOSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDA0IGxvZzEwIDAuMDA2ODc3NiAtPiAtMi4xNjI1NjMgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAwNSBsb2cxMCAwLjAwNjY4MzMgLT4gLTIuMTc1MDA5IEluZXhhY3QgUm91bmRlZAorbG9neDIwMDYgbG9nMTAgOS45MjY5NjMgIC0+IDAuOTk2ODE2NCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDA3IGxvZzEwIDAuMDA0MTg1MiAtPiAtMi4zNzgyODQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAwOCBsb2cxMCA4NC4xNTQxMiAgLT4gMS45MjUwNzUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAwOSBsb2cxMCAyLjQ2Njg1NiAgLT4gMC4zOTIxNDM4IEluZXhhY3QgUm91bmRlZAorbG9neDIwMTAgbG9nMTAgMC4wMDU4MDQ3IC0+IC0yLjIzNjIyMCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDExIGxvZzEwIDkuODg1MTU0ICAtPiAwLjk5NDk4MzQgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAxMiBsb2cxMCAwLjY2Njc2NTQgLT4gLTAuMTc2MDI2OSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDEzIGxvZzEwIDM0LjY1NzM2ICAtPiAxLjUzOTc5NSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDE0IGxvZzEwIDAuMDAyNjg4NCAtPiAtMi41NzA1MDYgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAxNSBsb2cxMCAwLjA0MzI3NjcgLT4gLTEuMzYzNzQ2IEluZXhhY3QgUm91bmRlZAorbG9neDIwMTYgbG9nMTAgNjYuMDE0MDcgIC0+IDEuODE5NjM3IEluZXhhY3QgUm91bmRlZAorbG9neDIwMTcgbG9nMTAgMC4wMDcwNTcyIC0+IC0yLjE1MTM2OCBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDE4IGxvZzEwIDAuMDczMTYxMyAtPiAtMS4xMzU3MTkgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAxOSBsb2cxMCA5LjgzODk4MyAgLT4gMC45OTI5NTAyIEluZXhhY3QgUm91bmRlZAorbG9neDIwMjAgbG9nMTAgMTUuODk2OTYgIC0+IDEuMjAxMzE0IEluZXhhY3QgUm91bmRlZAorbG9neDIwMjEgbG9nMTAgOC40NTkyNDcgIC0+IDAuOTI3MzMxNyBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDIyIGxvZzEwIDAuMDAxMDg3MyAtPiAtMi45NjM2NTEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyMyBsb2cxMCAwLjY0OTg2MTkgLT4gLTAuMTg3MTc4OSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDI0IGxvZzEwIDAuMDg0NzAwOCAtPiAtMS4wNzIxMTIgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyNSBsb2cxMCAwLjAwNzU0ODkgLT4gLTIuMTIyMTE2IEluZXhhY3QgUm91bmRlZAorbG9neDIwMjYgbG9nMTAgNTEuMTExNTIgIC0+IDEuNzA4NTE5IEluZXhhY3QgUm91bmRlZAorbG9neDIwMjcgbG9nMTAgMC43MjMzODY2IC0+IC0wLjE0MDYyOTUgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAyOCBsb2cxMCAyLjI1NDcyMSAgLT4gMC4zNTMwOTI4IEluZXhhY3QgUm91bmRlZAorbG9neDIwMjkgbG9nMTAgNi41Njg0NDQgIC0+IDAuODE3NDYyNSBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDMwIGxvZzEwIDgzLjcyNjM5ICAtPiAxLjkyMjg2MiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDMxIGxvZzEwIDYuNzIwNTg1ICAtPiAwLjgyNzQwNzEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAzMiBsb2cxMCA4Ny45MDM2NiAgLT4gMS45NDQwMDcgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAzMyBsb2cxMCAwLjA0MzMzMjQgLT4gLTEuMzYzMTg3IEluZXhhY3QgUm91bmRlZAorbG9neDIwMzQgbG9nMTAgMzQuNjM5MTIgIC0+IDEuNTM5NTY3IEluZXhhY3QgUm91bmRlZAorbG9neDIwMzUgbG9nMTAgMC44MDg5MDU5IC0+IC0wLjA5MjEwMjAwIEluZXhhY3QgUm91bmRlZAorbG9neDIwMzYgbG9nMTAgNy43OTM0MDUgIC0+IDAuODkxNzI3MiBJbmV4YWN0IFJvdW5kZWQKK2xvZ3gyMDM3IGxvZzEwIDAuMDA0MTc1NyAtPiAtMi4zNzkyNzEgSW5leGFjdCBSb3VuZGVkCitsb2d4MjAzOCBsb2cxMCA3LjEzNTQxNyAgLT4gMC44NTM0MTk0IEluZXhhY3QgUm91bmRlZAorbG9neDIwMzkgbG9nMTAgMTIuNDk1NzAgIC0+IDEuMDk2NzYxIEluZXhhY3QgUm91bmRlZAorbG9neDIwNDAgbG9nMTAgNi4zNTYyNzYgIC0+IDAuODAzMjAyNyBJbmV4YWN0IFJvdW5kZWQKKworLS0tLS0tLS0KK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworLS0gc3BlY2lhbCB2YWx1ZXMKK2xvZ3g4MjAgIGxvZzEwICAgSW5maW5pdHkgLT4gICBJbmZpbml0eQorbG9neDgyMSAgbG9nMTAgICAwICAgICAgICAtPiAgLUluZmluaXR5Citsb2d4ODIyICBsb2cxMCAgIE5hTiAgICAgIC0+ICAgTmFOCitsb2d4ODIzICBsb2cxMCAgIHNOYU4gICAgIC0+ICAgTmFOICAgICBJbnZhbGlkX29wZXJhdGlvbgorLS0gcHJvcGFnYXRpbmcgTmFOcworbG9neDgyNCAgbG9nMTAgICBzTmFOMTIzICAtPiAgIE5hTjEyMyAgSW52YWxpZF9vcGVyYXRpb24KK2xvZ3g4MjUgIGxvZzEwICAgLXNOYU4zMjEgLT4gIC1OYU4zMjEgIEludmFsaWRfb3BlcmF0aW9uCitsb2d4ODI2ICBsb2cxMCAgIE5hTjQ1NiAgIC0+ICAgTmFONDU2Citsb2d4ODI3ICBsb2cxMCAgIC1OYU42NTQgIC0+ICAtTmFONjU0Citsb2d4ODI4ICBsb2cxMCAgIE5hTjEgICAgIC0+ICAgTmFOMQorCisKKy0tIEludmFsaWQgb3BlcmF0aW9ucyBkdWUgdG8gcmVzdHJpY3Rpb25zCistLSBbbmV4dCB0d28gcHJvYmFibHkgc2tpcHBlZCBieSBtb3N0IHRlc3QgaGFybmVzc2VzXQorcHJlY2lzaW9uOiAxMDAwMDAwMDAKK2xvZ3g5MDEgIGxvZzEwIDEgLT4gIE5hTiAgICAgICAgICAgIEludmFsaWRfY29udGV4dAorcHJlY2lzaW9uOiAgOTk5OTk5OTkKK2xvZ3g5MDIgIGxvZzEwIDAgLT4gIE5hTiAgICAgICAgICAgIEludmFsaWRfY29udGV4dAorCitwcmVjaXNpb246IDkKK21heEV4cG9uZW50OiAgIDEwMDAwMDAKK21pbkV4cG9uZW50OiAgIC05OTk5OTkKK2xvZ3g5MDMgIGxvZzEwIDEgICAtPiAgTmFOICAgICAgICAgICAgSW52YWxpZF9jb250ZXh0CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogICAtOTk5OTk5Citsb2d4OTA0ICBsb2cxMCAwIC0+ICAtSW5maW5pdHkKK21heEV4cG9uZW50OiAgICA5OTk5OTkKK21pbkV4cG9uZW50OiAgLTEwMDAwMDAKK2xvZ3g5MDUgIGxvZzEwIDEgICAtPiAgTmFOICAgICAgICAgICAgSW52YWxpZF9jb250ZXh0CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogICAtOTk5OTk4Citsb2d4OTA2ICBsb2cxMCAwIC0+ICAtSW5maW5pdHkKKworLS0gTnVsbCB0ZXN0Citsb2d4OTAwICBsb2cxMCAjICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9sb2diLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL2xvZ2IuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc5MDA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9sb2diLmRlY1Rlc3QKQEAgLTAsMCArMSwxODggQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbG9nYi5kZWNUZXN0IC0tIHJldHVybiBpbnRlZ3JhbCBhZGp1c3RlZCBleHBvbmVudCBhcyBwZXIgNzU0ciAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwNSwgMjAwOS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIGVtcGhhc2lzZXMgdGhlIHRlc3Rpbmcgb2Ygbm90YWJsZSBjYXNlcywgYXMgdGhleSB3aWxsIG9mdGVuCistLSBoYXZlIHVudXN1YWwgcGF0aHMgKGVzcGVjaWFsbHkgdGhlIDEwKipuIHJlc3VsdHMpLgorCitleHRlbmRlZDogICAgMQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworLS0gYmFzaWNzICYgZXhhbXBsZXMKK3ByZWNpc2lvbjogICA5Citsb2dieDAwMSBsb2diICAwICAgICAgICAgICAgICAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2xvZ2J4MDAyIGxvZ2IgIDFFLTk5OSAgICAgICAgICAgIC0+IC05OTkKK2xvZ2J4MDAzIGxvZ2IgIDlFLTk5OSAgICAgICAgICAgIC0+IC05OTkKK2xvZ2J4MDA0IGxvZ2IgIDAuMDAxICAgICAgICAgICAgIC0+IC0zCitsb2dieDAwNSBsb2diICAwLjAzICAgICAgICAgICAgICAtPiAtMgorbG9nYngwMDYgbG9nYiAgMSAgICAgICAgICAgICAgICAgLT4gIDAKK2xvZ2J4MDA3IGxvZ2IgIDIgICAgICAgICAgICAgICAgIC0+ICAwCitsb2dieDAwOCBsb2diICAyLjUgICAgICAgICAgICAgICAtPiAgMAorbG9nYngwMDkgbG9nYiAgMi41MCAgICAgICAgICAgICAgLT4gIDAKK2xvZ2J4MDEwIGxvZ2IgIDEwICAgICAgICAgICAgICAgIC0+ICAxCitsb2dieDAxMSBsb2diICA3MCAgICAgICAgICAgICAgICAtPiAgMQorbG9nYngwMTIgbG9nYiAgMTAwICAgICAgICAgICAgICAgLT4gIDIKK2xvZ2J4MDEzIGxvZ2IgIDI1MCAgICAgICAgICAgICAgIC0+ICAyCitsb2dieDAxNCBsb2diICtJbmZpbml0eSAgICAgICAgICAtPiAgSW5maW5pdHkKKworLS0gbmVnYXRpdmVzIGFyZSB0cmVhdGVkIGFzIHBvc2l0aXZlcworbG9nYngwMjEgbG9nYiAtMCAgICAgICAgICAgICAgICAgLT4gLUluZmluaXR5ICBEaXZpc2lvbl9ieV96ZXJvCitsb2dieDAyMiBsb2diIC0xRS05OTkgICAgICAgICAgICAtPiAtOTk5Citsb2dieDAyMyBsb2diIC05RS05OTkgICAgICAgICAgICAtPiAtOTk5Citsb2dieDAyNCBsb2diIC0wLjAwMSAgICAgICAgICAgICAtPiAtMworbG9nYngwMjUgbG9nYiAtMSAgICAgICAgICAgICAgICAgLT4gIDAKK2xvZ2J4MDI2IGxvZ2IgLTIgICAgICAgICAgICAgICAgIC0+ICAwCitsb2dieDAyNyBsb2diIC0xMCAgICAgICAgICAgICAgICAtPiAgMQorbG9nYngwMjggbG9nYiAtNzAgICAgICAgICAgICAgICAgLT4gIDEKK2xvZ2J4MDI5IGxvZ2IgLTEwMCAgICAgICAgICAgICAgIC0+ICAyCitsb2dieDAzMCBsb2diIC0xMDAwMDAwMDAgICAgICAgICAtPiAgOAorbG9nYngwMzEgbG9nYiAtSW5maW5pdHkgICAgICAgICAgLT4gIEluZmluaXR5CisKKy0tIHplcm9zCitsb2dieDExMSBsb2diICAgICAgICAgIDAgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2xvZ2J4MTEyIGxvZ2IgICAgICAgICAtMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworbG9nYngxMTMgbG9nYiAgICAgICAwRSs0ICAgLT4gLUluZmluaXR5ICBEaXZpc2lvbl9ieV96ZXJvCitsb2dieDExNCBsb2diICAgICAgLTBFKzQgICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2xvZ2J4MTE1IGxvZ2IgICAgIDAuMDAwMCAgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworbG9nYngxMTYgbG9nYiAgICAtMC4wMDAwICAgLT4gLUluZmluaXR5ICBEaXZpc2lvbl9ieV96ZXJvCitsb2dieDExNyBsb2diICAgICAgMEUtMTQxICAtPiAtSW5maW5pdHkgIERpdmlzaW9uX2J5X3plcm8KK2xvZ2J4MTE4IGxvZ2IgICAgIC0wRS0xNDEgIC0+IC1JbmZpbml0eSAgRGl2aXNpb25fYnlfemVybworCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworbG9nYngxMjEgbG9nYiAgIDI2ODI2ODI2OCAgICAgICAgLT4gOAorbG9nYngxMjIgbG9nYiAgLTI2ODI2ODI2OCAgICAgICAgLT4gOAorbG9nYngxMjMgbG9nYiAgIDEzNDEzNDEzNCAgICAgICAgLT4gOAorbG9nYngxMjQgbG9nYiAgLTEzNDEzNDEzNCAgICAgICAgLT4gOAorCistLSBObWF4LCBObWluLCBOdGlueQorbG9nYngxMzEgbG9nYiAgOS45OTk5OTk5OUUrOTk5ICAgLT4gOTk5Citsb2dieDEzMiBsb2diICAxRS05OTkgICAgICAgICAgICAtPiAtOTk5Citsb2dieDEzMyBsb2diICAxLjAwMDAwMDAwRS05OTkgICAtPiAtOTk5Citsb2dieDEzNCBsb2diICAxRS0xMDA3ICAgICAgICAgICAtPiAtMTAwNworCitsb2dieDEzNSBsb2diICAtMUUtMTAwNyAgICAgICAgICAtPiAtMTAwNworbG9nYngxMzYgbG9nYiAgLTEuMDAwMDAwMDBFLTk5OSAgLT4gLTk5OQorbG9nYngxMzcgbG9nYiAgLTFFLTk5OSAgICAgICAgICAgLT4gLTk5OQorbG9nYngxMzggbG9nYiAgLTkuOTk5OTk5OTlFKzk5OSAgLT4gIDk5OQorCistLSBvbmVzCitsb2dieDAwNjEgbG9nYiAgMSAgICAgICAgICAgICAgICAgLT4gICAwCitsb2dieDAwNjIgbG9nYiAgMS4wICAgICAgICAgICAgICAgLT4gICAwCitsb2dieDAwNjMgbG9nYiAgMS4wMDAwMDAwMDAwMDAwMDAgLT4gICAwCitsb2dieDAwNjQgbG9nYiAgMS4wMDAwMDAwMDAwMDAwMDAwMDAgLT4gICAwCisKKy0tIG5vdGFibGUgY2FzZXMgLS0gZXhhY3QgcG93ZXJzIG9mIDEwCitsb2dieDExMDAgbG9nYiAxICAgICAgICAgICAgIC0+IDAKK2xvZ2J4MTEwMSBsb2diIDEwICAgICAgICAgICAgLT4gMQorbG9nYngxMTAyIGxvZ2IgMTAwICAgICAgICAgICAtPiAyCitsb2dieDExMDMgbG9nYiAxMDAwICAgICAgICAgIC0+IDMKK2xvZ2J4MTEwNCBsb2diIDEwMDAwICAgICAgICAgLT4gNAorbG9nYngxMTA1IGxvZ2IgMTAwMDAwICAgICAgICAtPiA1Citsb2dieDExMDYgbG9nYiAxMDAwMDAwICAgICAgIC0+IDYKK2xvZ2J4MTEwNyBsb2diIDEwMDAwMDAwICAgICAgLT4gNworbG9nYngxMTA4IGxvZ2IgMTAwMDAwMDAwICAgICAtPiA4Citsb2dieDExMDkgbG9nYiAxMDAwMDAwMDAwICAgIC0+IDkKK2xvZ2J4MTExMCBsb2diIDEwMDAwMDAwMDAwICAgLT4gMTAKK2xvZ2J4MTExMSBsb2diIDEwMDAwMDAwMDAwMCAgLT4gMTEKK2xvZ2J4MTExMiBsb2diIDEwMDAwMDAwMDAwMDAgLT4gMTIKK2xvZ2J4MTExMyBsb2diIDAuMDAwMDAwMDAwMDEgLT4gLTExCitsb2dieDExMTQgbG9nYiAwLjAwMDAwMDAwMDEgLT4gLTEwCitsb2dieDExMTUgbG9nYiAwLjAwMDAwMDAwMSAtPiAtOQorbG9nYngxMTE2IGxvZ2IgMC4wMDAwMDAwMSAtPiAtOAorbG9nYngxMTE3IGxvZ2IgMC4wMDAwMDAxIC0+IC03Citsb2dieDExMTggbG9nYiAwLjAwMDAwMSAtPiAtNgorbG9nYngxMTE5IGxvZ2IgMC4wMDAwMSAtPiAtNQorbG9nYngxMTIwIGxvZ2IgMC4wMDAxIC0+IC00Citsb2dieDExMjEgbG9nYiAwLjAwMSAtPiAtMworbG9nYngxMTIyIGxvZ2IgMC4wMSAtPiAtMgorbG9nYngxMTIzIGxvZ2IgMC4xIC0+IC0xCitsb2dieDExMjQgbG9nYiAxRS05OSAgLT4gLTk5Citsb2dieDExMjUgbG9nYiAxRS0xMDAgLT4gLTEwMAorbG9nYngxMTI2IGxvZ2IgMUUtMzgzIC0+IC0zODMKK2xvZ2J4MTEyNyBsb2diIDFFLTk5OSAtPiAtOTk5CisKKy0tIHN1Z2dlc3Rpb25zIGZyb20gSWxhbiBOZWhhbWEKK2xvZ2J4MTQwMCBsb2diIDEwRS0zICAgIC0+IC0yCitsb2dieDE0MDEgbG9nYiAxMEUtMiAgICAtPiAtMQorbG9nYngxNDAyIGxvZ2IgMTAwRS0yICAgLT4gIDAKK2xvZ2J4MTQwMyBsb2diIDEwMDBFLTIgIC0+ICAxCitsb2dieDE0MDQgbG9nYiAxMDAwMEUtMiAtPiAgMgorbG9nYngxNDA1IGxvZ2IgMTBFLTEgICAgLT4gIDAKK2xvZ2J4MTQwNiBsb2diIDEwMEUtMSAgIC0+ICAxCitsb2dieDE0MDcgbG9nYiAxMDAwRS0xICAtPiAgMgorbG9nYngxNDA4IGxvZ2IgMTAwMDBFLTEgLT4gIDMKK2xvZ2J4MTQwOSBsb2diIDEwRTAgICAgIC0+ICAxCitsb2dieDE0MTAgbG9nYiAxMDBFMCAgICAtPiAgMgorbG9nYngxNDExIGxvZ2IgMTAwMEUwICAgLT4gIDMKK2xvZ2J4MTQxMiBsb2diIDEwMDAwRTAgIC0+ICA0Citsb2dieDE0MTMgbG9nYiAxMEUxICAgICAtPiAgMgorbG9nYngxNDE0IGxvZ2IgMTAwRTEgICAgLT4gIDMKK2xvZ2J4MTQxNSBsb2diIDEwMDBFMSAgIC0+ICA0Citsb2dieDE0MTYgbG9nYiAxMDAwMEUxICAtPiAgNQorbG9nYngxNDE3IGxvZ2IgMTBFMiAgICAgLT4gIDMKK2xvZ2J4MTQxOCBsb2diIDEwMEUyICAgIC0+ICA0Citsb2dieDE0MTkgbG9nYiAxMDAwRTIgICAtPiAgNQorbG9nYngxNDIwIGxvZ2IgMTAwMDBFMiAgLT4gIDYKKworLS0gaW5leGFjdHMKK3ByZWNpc2lvbjogMgorbG9nYngxNTAwIGxvZ2IgMTAwMDBFMiAgICAgICAtPiAgNgorbG9nYngxNTAxIGxvZ2IgMUUrOTkgICAgICAgICAtPiAgOTkKK2xvZ2J4MTUwMiBsb2diIDFFLTk5ICAgICAgICAgLT4gLTk5Citsb2dieDE1MDMgbG9nYiAxRSsxMDAgICAgICAgIC0+ICAxLjBFKzIgIFJvdW5kZWQKK2xvZ2J4MTUwNCBsb2diIDFFKzk5OSAgICAgICAgLT4gIDEuMEUrMyAgSW5leGFjdCBSb3VuZGVkCitsb2dieDE1MDUgbG9nYiAxRS0xMDAgICAgICAgIC0+IC0xLjBFKzIgIFJvdW5kZWQKK2xvZ2J4MTUwNiBsb2diIDFFLTk5OSAgICAgICAgLT4gLTEuMEUrMyAgSW5leGFjdCBSb3VuZGVkCitsb2dieDE1MDcgbG9nYiAxRS0xMTExICAgICAgIC0+IC0xLjFFKzMgIEluZXhhY3QgUm91bmRlZAorbG9nYngxNTA4IGxvZ2IgMUUtMzMzMyAgICAgICAtPiAtMy4zRSszICBJbmV4YWN0IFJvdW5kZWQKK2xvZ2J4MTUwOSBsb2diIDFFLTY2NjYgICAgICAgLT4gLTYuN0UrMyAgSW5leGFjdCBSb3VuZGVkCitsb2dieDE1MTAgbG9nYiAxRSs5OTk5OTk5OTkgIC0+ICAxLjBFKzkgIEluZXhhY3QgUm91bmRlZAorbG9nYngxNTExIGxvZ2IgMUUtOTk5OTk5OTk5ICAtPiAtMS4wRSs5ICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorbG9nYngxNTE3IGxvZ2IgMUUtMTExMSAgICAgICAtPiAtMUUrMyAgICBJbmV4YWN0IFJvdW5kZWQKK2xvZ2J4MTUxOCBsb2diIDFFLTMzMzMgICAgICAgLT4gLTNFKzMgICAgSW5leGFjdCBSb3VuZGVkCitsb2dieDE1MTkgbG9nYiAxRS02NjY2ICAgICAgIC0+IC03RSszICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA4Citsb2dieDE1MjAgbG9nYiAxRSs5OTk5OTk5OTkgIC0+ICAxLjAwMDAwMDBFKzkgSW5leGFjdCBSb3VuZGVkCitsb2dieDE1MjEgbG9nYiAxRS05OTk5OTk5OTkgIC0+IC0xLjAwMDAwMDBFKzkgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDkKK2xvZ2J4MTUyMyBsb2diIDFFKzk5OTk5OTk5OSAgLT4gIDk5OTk5OTk5OQorbG9nYngxNTI0IGxvZ2IgMUUtOTk5OTk5OTk5ICAtPiAtOTk5OTk5OTk5CisKKy0tIHNwZWNpYWwgdmFsdWVzCitwcmVjaXNpb246IDkKK2xvZ2J4ODIwICBsb2diICAgSW5maW5pdHkgLT4gICBJbmZpbml0eQorbG9nYng4MjEgIGxvZ2IgIC1JbmZpbml0eSAtPiAgIEluZmluaXR5Citsb2dieDgyMiAgbG9nYiAgIDAgICAgICAgIC0+ICAtSW5maW5pdHkgRGl2aXNpb25fYnlfemVybworbG9nYng4MjMgIGxvZ2IgICBOYU4gICAgICAtPiAgIE5hTgorbG9nYng4MjQgIGxvZ2IgICBzTmFOICAgICAtPiAgIE5hTiAgICAgSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK2xvZ2J4ODI1ICBsb2diICAgc05hTjEyMyAgLT4gICBOYU4xMjMgIEludmFsaWRfb3BlcmF0aW9uCitsb2dieDgyNiAgbG9nYiAgIC1zTmFOMzIxIC0+ICAtTmFOMzIxICBJbnZhbGlkX29wZXJhdGlvbgorbG9nYng4MjcgIGxvZ2IgICBOYU40NTYgICAtPiAgIE5hTjQ1NgorbG9nYng4MjggIGxvZ2IgICAtTmFONjU0ICAtPiAgLU5hTjY1NAorbG9nYng4MjkgIGxvZ2IgICBOYU4xICAgICAtPiAgIE5hTjEKKworLS0gTnVsbCB0ZXN0Citsb2dieDkwMCAgbG9nYiAjICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tYXguZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWF4LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiNTcxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWF4LmRlY1Rlc3QKQEAgLTAsMCArMSw0MjQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbWF4LmRlY1Rlc3QgLS0gZGVjaW1hbCBtYXhpbXVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSB3ZSBhc3N1bWUgdGhhdCBiYXNlIGNvbXBhcmlzb24gaXMgdGVzdGVkIGluIGNvbXBhcmUuZGVjVGVzdCwgc28KKy0tIHRoZXNlIG1haW5seSBjb3ZlciBzcGVjaWFsIGNhc2VzIGFuZCByb3VuZGluZworCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBzYW5pdHkgY2hlY2tzCittYXh4MDAxIG1heCAgLTIgIC0yICAtPiAtMgorbWF4eDAwMiBtYXggIC0yICAtMSAgLT4gLTEKK21heHgwMDMgbWF4ICAtMiAgIDAgIC0+ICAwCittYXh4MDA0IG1heCAgLTIgICAxICAtPiAgMQorbWF4eDAwNSBtYXggIC0yICAgMiAgLT4gIDIKK21heHgwMDYgbWF4ICAtMSAgLTIgIC0+IC0xCittYXh4MDA3IG1heCAgLTEgIC0xICAtPiAtMQorbWF4eDAwOCBtYXggIC0xICAgMCAgLT4gIDAKK21heHgwMDkgbWF4ICAtMSAgIDEgIC0+ICAxCittYXh4MDEwIG1heCAgLTEgICAyICAtPiAgMgorbWF4eDAxMSBtYXggICAwICAtMiAgLT4gIDAKK21heHgwMTIgbWF4ICAgMCAgLTEgIC0+ICAwCittYXh4MDEzIG1heCAgIDAgICAwICAtPiAgMAorbWF4eDAxNCBtYXggICAwICAgMSAgLT4gIDEKK21heHgwMTUgbWF4ICAgMCAgIDIgIC0+ICAyCittYXh4MDE2IG1heCAgIDEgIC0yICAtPiAgMQorbWF4eDAxNyBtYXggICAxICAtMSAgLT4gIDEKK21heHgwMTggbWF4ICAgMSAgIDAgIC0+ICAxCittYXh4MDE5IG1heCAgIDEgICAxICAtPiAgMQorbWF4eDAyMCBtYXggICAxICAgMiAgLT4gIDIKK21heHgwMjEgbWF4ICAgMiAgLTIgIC0+ICAyCittYXh4MDIyIG1heCAgIDIgIC0xICAtPiAgMgorbWF4eDAyMyBtYXggICAyICAgMCAgLT4gIDIKK21heHgwMjUgbWF4ICAgMiAgIDEgIC0+ICAyCittYXh4MDI2IG1heCAgIDIgICAyICAtPiAgMgorCistLSBleHRlbmRlZCB6ZXJvcworbWF4eDAzMCBtYXggICAwICAgICAwICAgLT4gIDAKK21heHgwMzEgbWF4ICAgMCAgICAtMCAgIC0+ICAwCittYXh4MDMyIG1heCAgIDAgICAgLTAuMCAtPiAgMAorbWF4eDAzMyBtYXggICAwICAgICAwLjAgLT4gIDAKK21heHgwMzQgbWF4ICAtMCAgICAgMCAgIC0+ICAwICAgIC0tIG5vdGU6IC0wID0gMCwgYnV0IDAgY2hvc2VuCittYXh4MDM1IG1heCAgLTAgICAgLTAgICAtPiAtMAorbWF4eDAzNiBtYXggIC0wICAgIC0wLjAgLT4gLTAuMAorbWF4eDAzNyBtYXggIC0wICAgICAwLjAgLT4gIDAuMAorbWF4eDAzOCBtYXggICAwLjAgICAwICAgLT4gIDAKK21heHgwMzkgbWF4ICAgMC4wICAtMCAgIC0+ICAwLjAKK21heHgwNDAgbWF4ICAgMC4wICAtMC4wIC0+ICAwLjAKK21heHgwNDEgbWF4ICAgMC4wICAgMC4wIC0+ICAwLjAKK21heHgwNDIgbWF4ICAtMC4wICAgMCAgIC0+ICAwCittYXh4MDQzIG1heCAgLTAuMCAgLTAgICAtPiAtMC4wCittYXh4MDQ0IG1heCAgLTAuMCAgLTAuMCAtPiAtMC4wCittYXh4MDQ1IG1heCAgLTAuMCAgIDAuMCAtPiAgMC4wCisKK21heHgwNTAgbWF4ICAtMEUxICAgMEUxIC0+ICAwRSsxCittYXh4MDUxIG1heCAgLTBFMiAgIDBFMiAtPiAgMEUrMgorbWF4eDA1MiBtYXggIC0wRTIgICAwRTEgLT4gIDBFKzEKK21heHgwNTMgbWF4ICAtMEUxICAgMEUyIC0+ICAwRSsyCittYXh4MDU0IG1heCAgIDBFMSAgLTBFMSAtPiAgMEUrMQorbWF4eDA1NSBtYXggICAwRTIgIC0wRTIgLT4gIDBFKzIKK21heHgwNTYgbWF4ICAgMEUyICAtMEUxIC0+ICAwRSsyCittYXh4MDU3IG1heCAgIDBFMSAgLTBFMiAtPiAgMEUrMQorCittYXh4MDU4IG1heCAgIDBFMSAgIDBFMSAtPiAgMEUrMQorbWF4eDA1OSBtYXggICAwRTIgICAwRTIgLT4gIDBFKzIKK21heHgwNjAgbWF4ICAgMEUyICAgMEUxIC0+ICAwRSsyCittYXh4MDYxIG1heCAgIDBFMSAgIDBFMiAtPiAgMEUrMgorbWF4eDA2MiBtYXggIC0wRTEgIC0wRTEgLT4gLTBFKzEKK21heHgwNjMgbWF4ICAtMEUyICAtMEUyIC0+IC0wRSsyCittYXh4MDY0IG1heCAgLTBFMiAgLTBFMSAtPiAtMEUrMQorbWF4eDA2NSBtYXggIC0wRTEgIC0wRTIgLT4gLTBFKzEKKworLS0gU3BlY2lhbHMKK3ByZWNpc2lvbjogOQorbWF4eDA5MCBtYXggIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorbWF4eDA5MSBtYXggIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorbWF4eDA5MiBtYXggIEluZiAgLTEgICAgIC0+ICBJbmZpbml0eQorbWF4eDA5MyBtYXggIEluZiAgLTAgICAgIC0+ICBJbmZpbml0eQorbWF4eDA5NCBtYXggIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorbWF4eDA5NSBtYXggIEluZiAgIDEgICAgIC0+ICBJbmZpbml0eQorbWF4eDA5NiBtYXggIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorbWF4eDA5NyBtYXggIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDA5OCBtYXggLTEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDA5OSBtYXggLUluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDEwMCBtYXggLTEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDEwMSBtYXggLTAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDEwMiBtYXggIDAgICAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDEwMyBtYXggIDEgICAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDEwNCBtYXggIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorbWF4eDEwNSBtYXggIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCittYXh4MTIwIG1heCAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5CittYXh4MTIxIG1heCAtSW5mICAtMTAwMCAgLT4gLTEwMDAKK21heHgxMjIgbWF4IC1JbmYgIC0xICAgICAtPiAtMQorbWF4eDEyMyBtYXggLUluZiAgLTAgICAgIC0+IC0wCittYXh4MTI0IG1heCAtSW5mICAgMCAgICAgLT4gIDAKK21heHgxMjUgbWF4IC1JbmYgICAxICAgICAtPiAgMQorbWF4eDEyNiBtYXggLUluZiAgIDEwMDAgIC0+ICAxMDAwCittYXh4MTI3IG1heCAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CittYXh4MTI4IG1heCAtSW5mICAtSW5mICAgLT4gIC1JbmZpbml0eQorbWF4eDEyOSBtYXggLTEwMDAgLUluZiAgIC0+ICAtMTAwMAorbWF4eDEzMCBtYXggLTEgICAgLUluZiAgIC0+ICAtMQorbWF4eDEzMSBtYXggLTAgICAgLUluZiAgIC0+ICAtMAorbWF4eDEzMiBtYXggIDAgICAgLUluZiAgIC0+ICAwCittYXh4MTMzIG1heCAgMSAgICAtSW5mICAgLT4gIDEKK21heHgxMzQgbWF4ICAxMDAwIC1JbmYgICAtPiAgMTAwMAorbWF4eDEzNSBtYXggIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorCistLSAyMDA0LjA4LjAyIDc1NHIgY2hvb3NlcyBudW1iZXIgb3ZlciBOYU4gaW4gbWl4ZWQgY2FzZXMKK21heHgxNDEgbWF4ICBOYU4gLUluZiAgICAtPiAtSW5maW5pdHkKK21heHgxNDIgbWF4ICBOYU4gLTEwMDAgICAtPiAtMTAwMAorbWF4eDE0MyBtYXggIE5hTiAtMSAgICAgIC0+IC0xCittYXh4MTQ0IG1heCAgTmFOIC0wICAgICAgLT4gLTAKK21heHgxNDUgbWF4ICBOYU4gIDAgICAgICAtPiAgMAorbWF4eDE0NiBtYXggIE5hTiAgMSAgICAgIC0+ICAxCittYXh4MTQ3IG1heCAgTmFOICAxMDAwICAgLT4gIDEwMDAKK21heHgxNDggbWF4ICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK21heHgxNDkgbWF4ICBOYU4gIE5hTiAgICAtPiAgTmFOCittYXh4MTUwIG1heCAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5CittYXh4MTUxIG1heCAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK21heHgxNTIgbWF4IC0xICAgIE5hTiAgICAtPiAtMQorbWF4eDE1MyBtYXggLTAgICAgTmFOICAgIC0+IC0wCittYXh4MTU0IG1heCAgMCAgICBOYU4gICAgLT4gIDAKK21heHgxNTUgbWF4ICAxICAgIE5hTiAgICAtPiAgMQorbWF4eDE1NiBtYXggIDEwMDAgTmFOICAgIC0+ICAxMDAwCittYXh4MTU3IG1heCAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK21heHgxNjEgbWF4ICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE2MiBtYXggIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTYzIG1heCAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNjQgbWF4ICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE2NSBtYXggIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTY2IG1heCAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNjcgbWF4ICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE2OCBtYXggIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTY5IG1heCAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNzAgbWF4ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE3MSBtYXggLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTcyIG1heCAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNzMgbWF4IC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE3NCBtYXggLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTc1IG1heCAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNzYgbWF4ICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbWF4eDE3NyBtYXggIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTc4IG1heCAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21heHgxNzkgbWF4ICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCittYXh4MTgxIG1heCAgTmFOOSAgLUluZiAgIC0+IC1JbmZpbml0eQorbWF4eDE4MiBtYXggIE5hTjggICAgIDkgICAtPiAgOQorbWF4eDE4MyBtYXggLU5hTjcgICBJbmYgICAtPiAgSW5maW5pdHkKKworbWF4eDE4NCBtYXggLU5hTjEgICBOYU4xMSAtPiAtTmFOMQorbWF4eDE4NSBtYXggIE5hTjIgICBOYU4xMiAtPiAgTmFOMgorbWF4eDE4NiBtYXggLU5hTjEzIC1OYU43ICAtPiAtTmFOMTMKK21heHgxODcgbWF4ICBOYU4xNCAtTmFONSAgLT4gIE5hTjE0CisKK21heHgxODggbWF4IC1JbmYgICAgTmFONCAgLT4gLUluZmluaXR5CittYXh4MTg5IG1heCAtOSAgICAgLU5hTjMgIC0+IC05CittYXh4MTkwIG1heCAgSW5mICAgIE5hTjIgIC0+ICBJbmZpbml0eQorCittYXh4MTkxIG1heCAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCittYXh4MTkyIG1heCAgc05hTjk4IC0xICAgICAgLT4gIE5hTjk4IEludmFsaWRfb3BlcmF0aW9uCittYXh4MTkzIG1heCAtc05hTjk3ICBOYU4gICAgLT4gLU5hTjk3IEludmFsaWRfb3BlcmF0aW9uCittYXh4MTk0IG1heCAgc05hTjk2IHNOYU45NCAgLT4gIE5hTjk2IEludmFsaWRfb3BlcmF0aW9uCittYXh4MTk1IG1heCAgTmFOOTUgIHNOYU45MyAgLT4gIE5hTjkzIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTk2IG1heCAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTk3IG1heCAgMCAgICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTk4IG1heCAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCittYXh4MTk5IG1heCAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHJvdW5kaW5nIGNoZWNrcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorbWF4eDIwMSBtYXggMTIzNDU2NzgwMDAgMSAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorbWF4eDIwMiBtYXggMSAxMjM0NTY3ODAwMCAgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorbWF4eDIwMyBtYXggMTIzNDU2NzgwMCAgMSAgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCittYXh4MjA0IG1heCAxIDEyMzQ1Njc4MDAgICAtPiAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK21heHgyMDUgbWF4IDEyMzQ1Njc4OTAgIDEgIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorbWF4eDIwNiBtYXggMSAxMjM0NTY3ODkwICAgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCittYXh4MjA3IG1heCAxMjM0NTY3ODkxICAxICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorbWF4eDIwOCBtYXggMSAxMjM0NTY3ODkxICAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK21heHgyMDkgbWF4IDEyMzQ1Njc4OTAxIDEgIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorbWF4eDIxMCBtYXggMSAxMjM0NTY3ODkwMSAgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCittYXh4MjExIG1heCAxMjM0NTY3ODk2ICAxICAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorbWF4eDIxMiBtYXggMSAxMjM0NTY3ODk2ICAgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK21heHgyMTMgbWF4IC0xMjM0NTY3ODkxICAxIC0+IDEKK21heHgyMTQgbWF4IDEgLTEyMzQ1Njc4OTEgIC0+IDEKK21heHgyMTUgbWF4IC0xMjM0NTY3ODkwMSAxIC0+IDEKK21heHgyMTYgbWF4IDEgLTEyMzQ1Njc4OTAxIC0+IDEKK21heHgyMTcgbWF4IC0xMjM0NTY3ODk2ICAxIC0+IDEKK21heHgyMTggbWF4IDEgLTEyMzQ1Njc4OTYgIC0+IDEKKworcHJlY2lzaW9uOiAxNQorbWF4eDIyMSBtYXggMTIzNDU2NzgwMDAgMSAgLT4gMTIzNDU2NzgwMDAKK21heHgyMjIgbWF4IDEgMTIzNDU2NzgwMDAgIC0+IDEyMzQ1Njc4MDAwCittYXh4MjIzIG1heCAxMjM0NTY3ODAwICAxICAtPiAxMjM0NTY3ODAwCittYXh4MjI0IG1heCAxIDEyMzQ1Njc4MDAgICAtPiAxMjM0NTY3ODAwCittYXh4MjI1IG1heCAxMjM0NTY3ODkwICAxICAtPiAxMjM0NTY3ODkwCittYXh4MjI2IG1heCAxIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCittYXh4MjI3IG1heCAxMjM0NTY3ODkxICAxICAtPiAxMjM0NTY3ODkxCittYXh4MjI4IG1heCAxIDEyMzQ1Njc4OTEgICAtPiAxMjM0NTY3ODkxCittYXh4MjI5IG1heCAxMjM0NTY3ODkwMSAxICAtPiAxMjM0NTY3ODkwMQorbWF4eDIzMCBtYXggMSAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK21heHgyMzEgbWF4IDEyMzQ1Njc4OTYgIDEgIC0+IDEyMzQ1Njc4OTYKK21heHgyMzIgbWF4IDEgMTIzNDU2Nzg5NiAgIC0+IDEyMzQ1Njc4OTYKK21heHgyMzMgbWF4IC0xMjM0NTY3ODkxICAxIC0+IDEKK21heHgyMzQgbWF4IDEgLTEyMzQ1Njc4OTEgIC0+IDEKK21heHgyMzUgbWF4IC0xMjM0NTY3ODkwMSAxIC0+IDEKK21heHgyMzYgbWF4IDEgLTEyMzQ1Njc4OTAxIC0+IDEKK21heHgyMzcgbWF4IC0xMjM0NTY3ODk2ICAxIC0+IDEKK21heHgyMzggbWF4IDEgLTEyMzQ1Njc4OTYgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworbWF4eDI4MCBtYXggJzMnICAgJzInICAtPiAgJzMnCittYXh4MjgxIG1heCAnLTEwJyAnMycgIC0+ICAnMycKK21heHgyODIgbWF4ICcxLjAnICcxJyAgLT4gICcxJworbWF4eDI4MyBtYXggJzEnICcxLjAnICAtPiAgJzEnCittYXh4Mjg0IG1heCAnNycgJ05hTicgIC0+ICAnNycKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyAuLi4KK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CittYXh4MzMwIG1heCArMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTk5OTkgLT4gIDlFKzk5OTk5OTk5OQorbWF4eDMzMSBtYXggOUUrOTk5OTk5OTk5ICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+ICA5RSs5OTk5OTk5OTkKK21heHgzMzIgbWF4ICswLjEwMCA5RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAgMC4xMDAKK21heHgzMzMgbWF4IDlFLTk5OTk5OTk5OSArMC4xMDAgICAgICAgICAgICAgICAtPiAgMC4xMDAKK21heHgzMzUgbWF4IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAgOUUrOTk5OTk5OTk5CittYXh4MzM2IG1heCA5RSs5OTk5OTk5OTkgLTEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDlFKzk5OTk5OTk5OQorbWF4eDMzNyBtYXggLTAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+ICA5RS05OTk5OTk5OTkKK21heHgzMzggbWF4IDlFLTk5OTk5OTk5OSAtMC4xMDAgICAgICAgICAgICAgICAtPiAgOUUtOTk5OTk5OTk5CisKK21heHgzMzkgbWF4IDFlLTU5OTk5OTk5OSAxZS00MDAwMDAwMDEgICAtPiAgMUUtNDAwMDAwMDAxCittYXh4MzQwIG1heCAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAwICAgLT4gIDFFLTQwMDAwMDAwMAorbWF4eDM0MSBtYXggMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwMCAgIC0+ICAxRS00MDAwMDAwMDAKK21heHgzNDIgbWF4IDllLTk5OTk5OTk5OCAwLjAxICAgICAgICAgICAtPiAgMC4wMQorbWF4eDM0MyBtYXggOWUtOTk5OTk5OTk4IDAuMSAgICAgICAgICAgIC0+ICAwLjEKK21heHgzNDQgbWF4IDAuMDEgOWUtOTk5OTk5OTk4ICAgICAgICAgICAtPiAgMC4wMQorbWF4eDM0NSBtYXggMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDEgICAgIC0+ICAxRSs1OTk5OTk5OTkKK21heHgzNDYgbWF4IDFlNTk5OTk5OTk5IDFlNDAwMDAwMDAwICAgICAtPiAgMUUrNTk5OTk5OTk5CittYXh4MzQ3IG1heCAxZTYwMDAwMDAwMCAxZTQwMDAwMDAwMCAgICAgLT4gIDFFKzYwMDAwMDAwMAorbWF4eDM0OCBtYXggOWU5OTk5OTk5OTggMTAwICAgICAgICAgICAgIC0+ICA5RSs5OTk5OTk5OTgKK21heHgzNDkgbWF4IDllOTk5OTk5OTk4IDEwICAgICAgICAgICAgICAtPiAgOUUrOTk5OTk5OTk4CittYXh4MzUwIG1heCAxMDAgIDllOTk5OTk5OTk4ICAgICAgICAgICAgLT4gIDlFKzk5OTk5OTk5OAorLS0gc2lnbnMKK21heHgzNTEgbWF4ICAxZSs3Nzc3Nzc3NzcgIDFlKzQxMTExMTExMSAtPiAgMUUrNzc3Nzc3Nzc3CittYXh4MzUyIG1heCAgMWUrNzc3Nzc3Nzc3IC0xZSs0MTExMTExMTEgLT4gIDFFKzc3Nzc3Nzc3NworbWF4eDM1MyBtYXggLTFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExIC0+ICAxRSs0MTExMTExMTEKK21heHgzNTQgbWF4IC0xZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAtMUUrNDExMTExMTExCittYXh4MzU1IG1heCAgMWUtNzc3Nzc3Nzc3ICAxZS00MTExMTExMTEgLT4gIDFFLTQxMTExMTExMQorbWF4eDM1NiBtYXggIDFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+ICAxRS03Nzc3Nzc3NzcKK21heHgzNTcgbWF4IC0xZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAgMUUtNDExMTExMTExCittYXh4MzU4IG1heCAtMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gLTFFLTc3Nzc3Nzc3NworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK21heHg0MDEgbWF4ICBJbmYgICAgMS4xICAgICAtPiAgSW5maW5pdHkKK21heHg0MDIgbWF4ICAxLjEgICAgMSAgICAgICAtPiAgMS4xCittYXh4NDAzIG1heCAgMSAgICAgIDEuMCAgICAgLT4gIDEKK21heHg0MDQgbWF4ICAxLjAgICAgMC4xICAgICAtPiAgMS4wCittYXh4NDA1IG1heCAgMC4xICAgIDAuMTAgICAgLT4gIDAuMQorbWF4eDQwNiBtYXggIDAuMTAgICAwLjEwMCAgIC0+ICAwLjEwCittYXh4NDA3IG1heCAgMC4xMCAgIDAgICAgICAgLT4gIDAuMTAKK21heHg0MDggbWF4ICAwICAgICAgMC4wICAgICAtPiAgMAorbWF4eDQwOSBtYXggIDAuMCAgIC0wICAgICAgIC0+ICAwLjAKK21heHg0MTAgbWF4ICAwLjAgICAtMC4wICAgICAtPiAgMC4wCittYXh4NDExIG1heCAgMC4wMCAgLTAuMCAgICAgLT4gIDAuMDAKK21heHg0MTIgbWF4ICAwLjAgICAtMC4wMCAgICAtPiAgMC4wCittYXh4NDEzIG1heCAgMCAgICAgLTAuMCAgICAgLT4gIDAKK21heHg0MTQgbWF4ICAwICAgICAtMCAgICAgICAtPiAgMAorbWF4eDQxNSBtYXggLTAuMCAgIC0wICAgICAgIC0+IC0wLjAKK21heHg0MTYgbWF4IC0wICAgICAtMC4xMDAgICAtPiAtMAorbWF4eDQxNyBtYXggLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwMAorbWF4eDQxOCBtYXggLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEwCittYXh4NDE5IG1heCAtMC4xICAgLTEuMCAgICAgLT4gLTAuMQorbWF4eDQyMCBtYXggLTEuMCAgIC0xICAgICAgIC0+IC0xLjAKK21heHg0MjEgbWF4IC0xICAgICAtMS4xICAgICAtPiAtMQorbWF4eDQyMyBtYXggLTEuMSAgIC1JbmYgICAgIC0+IC0xLjEKKy0tIHNhbWUgd2l0aCBvcGVyYW5kcyByZXZlcnNlZAorbWF4eDQzMSBtYXggIDEuMSAgICBJbmYgICAgIC0+ICBJbmZpbml0eQorbWF4eDQzMiBtYXggIDEgICAgICAxLjEgICAgIC0+ICAxLjEKK21heHg0MzMgbWF4ICAxLjAgICAgMSAgICAgICAtPiAgMQorbWF4eDQzNCBtYXggIDAuMSAgICAxLjAgICAgIC0+ICAxLjAKK21heHg0MzUgbWF4ICAwLjEwICAgMC4xICAgICAtPiAgMC4xCittYXh4NDM2IG1heCAgMC4xMDAgIDAuMTAgICAgLT4gIDAuMTAKK21heHg0MzcgbWF4ICAwICAgICAgMC4xMCAgICAtPiAgMC4xMAorbWF4eDQzOCBtYXggIDAuMCAgICAwICAgICAgIC0+ICAwCittYXh4NDM5IG1heCAtMCAgICAgIDAuMCAgICAgLT4gIDAuMAorbWF4eDQ0MCBtYXggLTAuMCAgICAwLjAgICAgIC0+ICAwLjAKK21heHg0NDEgbWF4IC0wLjAgICAgMC4wMCAgICAtPiAgMC4wMAorbWF4eDQ0MiBtYXggLTAuMDAgICAwLjAgICAgIC0+ICAwLjAKK21heHg0NDMgbWF4IC0wLjAgICAgMCAgICAgICAtPiAgMAorbWF4eDQ0NCBtYXggLTAgICAgICAwICAgICAgIC0+ICAwCittYXh4NDQ1IG1heCAtMCAgICAgLTAuMCAgICAgLT4gLTAuMAorbWF4eDQ0NiBtYXggLTAuMTAwIC0wICAgICAgIC0+IC0wCittYXh4NDQ3IG1heCAtMC4xMCAgLTAuMTAwICAgLT4gLTAuMTAwCittYXh4NDQ4IG1heCAtMC4xICAgLTAuMTAgICAgLT4gLTAuMTAKK21heHg0NDkgbWF4IC0xLjAgICAtMC4xICAgICAtPiAtMC4xCittYXh4NDUwIG1heCAtMSAgICAgLTEuMCAgICAgLT4gLTEuMAorbWF4eDQ1MSBtYXggLTEuMSAgIC0xICAgICAgIC0+IC0xCittYXh4NDUzIG1heCAtSW5mICAgLTEuMSAgICAgLT4gLTEuMQorLS0gbGFyZ2llcworbWF4eDQ2MCBtYXggIDEwMDAgICAxRSszICAgIC0+ICAxRSszCittYXh4NDYxIG1heCAgMUUrMyAgIDEwMDAgICAgLT4gIDFFKzMKK21heHg0NjIgbWF4ICAxMDAwICAtMUUrMyAgICAtPiAgMTAwMAorbWF4eDQ2MyBtYXggIDFFKzMgIC0xMDAwICAgIC0+ICAxRSszCittYXh4NDY0IG1heCAtMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK21heHg0NjUgbWF4IC0xRSszICAgMTAwMCAgICAtPiAgMTAwMAorbWF4eDQ2NiBtYXggLTEwMDAgIC0xRSszICAgIC0+IC0xMDAwCittYXh4NDY3IG1heCAtMUUrMyAgLTEwMDAgICAgLT4gLTEwMDAKKworLS0gcm91bmRpbmcgKHJlc3VsdHMgdHJlYXRlZCBhcyB0aG91Z2ggcGx1cykKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDMKKworbWF4eDQ3MCBtYXggIDEgICAgICAuNSAgICAgLT4gIDEKK21heHg0NzEgbWF4ICAxMCAgICAgNSAgICAgIC0+ICAxMAorbWF4eDQ3MiBtYXggIDEwMCAgICA1MCAgICAgLT4gIDEwMAorbWF4eDQ3MyBtYXggIDEwMDAgICA1MDAgICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbWF4eDQ3NCBtYXggIDEwMDAwICA1MDAwICAgLT4gIDEuMDBFKzQgUm91bmRlZAorbWF4eDQ3NSBtYXggIDYgICAgICAuNSAgICAgLT4gIDYKK21heHg0NzYgbWF4ICA2NiAgICAgNSAgICAgIC0+ICA2NgorbWF4eDQ3NyBtYXggIDY2NiAgICA1MCAgICAgLT4gIDY2NgorbWF4eDQ3OCBtYXggIDY2NjYgICA1MDAgICAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0CittYXh4NDc5IG1heCAgNjY2NjYgIDUwMDAgICAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK21heHg0ODAgbWF4ICAzMzMzMyAgNTAwMCAgIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorbWF4eDQ4MSBtYXggIC41ICAgICAxICAgICAgLT4gIDEKK21heHg0ODIgbWF4ICAuNSAgICAgMTAgICAgIC0+ICAxMAorbWF4eDQ4MyBtYXggIC41ICAgICAxMDAgICAgLT4gIDEwMAorbWF4eDQ4NCBtYXggIC41ICAgICAxMDAwICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbWF4eDQ4NSBtYXggIC41ICAgICAxMDAwMCAgLT4gIDEuMDBFKzQgUm91bmRlZAorbWF4eDQ4NiBtYXggIC41ICAgICA2ICAgICAgLT4gIDYKK21heHg0ODcgbWF4ICAuNSAgICAgNjYgICAgIC0+ICA2NgorbWF4eDQ4OCBtYXggIC41ICAgICA2NjYgICAgLT4gIDY2NgorbWF4eDQ4OSBtYXggIC41ICAgICA2NjY2ICAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0CittYXh4NDkwIG1heCAgLjUgICAgIDY2NjY2ICAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK21heHg0OTEgbWF4ICAuNSAgICAgMzMzMzMgIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorCistLSBvdmVyZmxvdyB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworbWF4eDUwMCBtYXggOS45OTlFKzk5OTk5OTk5OSAgMCAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittYXh4NTAxIG1heCAtOS45OTlFKzk5OTk5OTk5OSAwIC0+ICAwCisKKy0tIHN1Ym5vcm1hbHMgYW5kIHVuZGVyZmxvdworcHJlY2lzaW9uOiAzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorbWF4eDUxMCBtYXggIDEuMDBFLTk5OSAgICAgICAwICAtPiAgIDEuMDBFLTk5OQorbWF4eDUxMSBtYXggIDAuMUUtOTk5ICAgICAgICAwICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK21heHg1MTIgbWF4ICAwLjEwRS05OTkgICAgICAgMCAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsCittYXh4NTEzIG1heCAgMC4xMDBFLTk5OSAgICAgIDAgIC0+ICAgMS4wRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCittYXh4NTE0IG1heCAgMC4wMUUtOTk5ICAgICAgIDAgIC0+ICAgMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIE5taW4KK21heHg1MTUgbWF4ICAwLjk5OUUtOTk5ICAgICAgMCAgLT4gICAxLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK21heHg1MTYgbWF4ICAwLjA5OUUtOTk5ICAgICAgMCAgLT4gICAxLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK21heHg1MTcgbWF4ICAwLjAwOUUtOTk5ICAgICAgMCAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK21heHg1MTggbWF4ICAwLjAwMUUtOTk5ICAgICAgMCAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorbWF4eDUxOSBtYXggIDAuMDAwOUUtOTk5ICAgICAwICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCittYXh4NTIwIG1heCAgMC4wMDAxRS05OTkgICAgIDAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworbWF4eDUzMCBtYXggLTEuMDBFLTk5OSAgICAgICAwICAtPiAgIDAKK21heHg1MzEgbWF4IC0wLjFFLTk5OSAgICAgICAgMCAgLT4gICAwCittYXh4NTMyIG1heCAtMC4xMEUtOTk5ICAgICAgIDAgIC0+ICAgMAorbWF4eDUzMyBtYXggLTAuMTAwRS05OTkgICAgICAwICAtPiAgIDAKK21heHg1MzQgbWF4IC0wLjAxRS05OTkgICAgICAgMCAgLT4gICAwCittYXh4NTM1IG1heCAtMC45OTlFLTk5OSAgICAgIDAgIC0+ICAgMAorbWF4eDUzNiBtYXggLTAuMDk5RS05OTkgICAgICAwICAtPiAgIDAKK21heHg1MzcgbWF4IC0wLjAwOUUtOTk5ICAgICAgMCAgLT4gICAwCittYXh4NTM4IG1heCAtMC4wMDFFLTk5OSAgICAgIDAgIC0+ICAgMAorbWF4eDUzOSBtYXggLTAuMDAwOUUtOTk5ICAgICAwICAtPiAgIDAKK21heHg1NDAgbWF4IC0wLjAwMDFFLTk5OSAgICAgMCAgLT4gICAwCisKKy0tIG1pc2FsaWdubWVudCB0cmFwcyBmb3IgbGl0dGxlLWVuZGlhbgorcHJlY2lzaW9uOiA5CittYXh4NTUxIG1heCAgICAgIDEuMCAgICAgICAwLjEgIC0+IDEuMAorbWF4eDU1MiBtYXggICAgICAwLjEgICAgICAgMS4wICAtPiAxLjAKK21heHg1NTMgbWF4ICAgICAxMC4wICAgICAgIDAuMSAgLT4gMTAuMAorbWF4eDU1NCBtYXggICAgICAwLjEgICAgICAxMC4wICAtPiAxMC4wCittYXh4NTU1IG1heCAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEwMAorbWF4eDU1NiBtYXggICAgICAxLjAgICAgICAgMTAwICAtPiAxMDAKK21heHg1NTcgbWF4ICAgICAxMDAwICAgICAgMTAuMCAgLT4gMTAwMAorbWF4eDU1OCBtYXggICAgIDEwLjAgICAgICAxMDAwICAtPiAxMDAwCittYXh4NTU5IG1heCAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEwMDAwCittYXh4NTYwIG1heCAgICAxMDAuMCAgICAgMTAwMDAgIC0+IDEwMDAwCittYXh4NjYxIG1heCAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEwMDAwMAorbWF4eDY2MiBtYXggICAxMDAwLjAgICAgMTAwMDAwICAtPiAxMDAwMDAKK21heHg2NjMgbWF4ICAxMDAwMDAwICAgMTAwMDAuMCAgLT4gMTAwMDAwMAorbWF4eDY2NCBtYXggIDEwMDAwLjAgICAxMDAwMDAwICAtPiAxMDAwMDAwCisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZQorcHJlY2lzaW9uOiA1CittYXh4NjcwIG1heCAgICAgIDExIC1zTmFOMTIzNDU2Nzg5MDEgLT4gLU5hTjc4OTAxICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOdWxsIHRlc3RzCittYXh4OTAwIG1heCAxMCAgIyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCittYXh4OTAxIG1heCAgIyAxMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKworCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL21heG1hZy5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tYXhtYWcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjVlOTEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tYXhtYWcuZGVjVGVzdApAQCAtMCwwICsxLDQwNCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBtYXhtYWcuZGVjVGVzdCAtLSBkZWNpbWFsIG1heGltdW0gYnkgbWFnbml0dWRlICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIHdlIGFzc3VtZSB0aGF0IGJhc2UgY29tcGFyaXNvbiBpcyB0ZXN0ZWQgaW4gY29tcGFyZS5kZWNUZXN0LCBzbworLS0gdGhlc2UgbWFpbmx5IGNvdmVyIHNwZWNpYWwgY2FzZXMgYW5kIHJvdW5kaW5nCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MKK214Z3gwMDEgbWF4bWFnICAtMiAgLTIgIC0+IC0yCitteGd4MDAyIG1heG1hZyAgLTIgIC0xICAtPiAtMgorbXhneDAwMyBtYXhtYWcgIC0yICAgMCAgLT4gLTIKK214Z3gwMDQgbWF4bWFnICAtMiAgIDEgIC0+IC0yCitteGd4MDA1IG1heG1hZyAgLTIgICAyICAtPiAgMgorbXhneDAwNiBtYXhtYWcgIC0xICAtMiAgLT4gLTIKK214Z3gwMDcgbWF4bWFnICAtMSAgLTEgIC0+IC0xCitteGd4MDA4IG1heG1hZyAgLTEgICAwICAtPiAtMQorbXhneDAwOSBtYXhtYWcgIC0xICAgMSAgLT4gIDEKK214Z3gwMTAgbWF4bWFnICAtMSAgIDIgIC0+ICAyCitteGd4MDExIG1heG1hZyAgIDAgIC0yICAtPiAtMgorbXhneDAxMiBtYXhtYWcgICAwICAtMSAgLT4gLTEKK214Z3gwMTMgbWF4bWFnICAgMCAgIDAgIC0+ICAwCitteGd4MDE0IG1heG1hZyAgIDAgICAxICAtPiAgMQorbXhneDAxNSBtYXhtYWcgICAwICAgMiAgLT4gIDIKK214Z3gwMTYgbWF4bWFnICAgMSAgLTIgIC0+IC0yCitteGd4MDE3IG1heG1hZyAgIDEgIC0xICAtPiAgMQorbXhneDAxOCBtYXhtYWcgICAxICAgMCAgLT4gIDEKK214Z3gwMTkgbWF4bWFnICAgMSAgIDEgIC0+ICAxCitteGd4MDIwIG1heG1hZyAgIDEgICAyICAtPiAgMgorbXhneDAyMSBtYXhtYWcgICAyICAtMiAgLT4gIDIKK214Z3gwMjIgbWF4bWFnICAgMiAgLTEgIC0+ICAyCitteGd4MDIzIG1heG1hZyAgIDIgICAwICAtPiAgMgorbXhneDAyNSBtYXhtYWcgICAyICAgMSAgLT4gIDIKK214Z3gwMjYgbWF4bWFnICAgMiAgIDIgIC0+ICAyCisKKy0tIGV4dGVuZGVkIHplcm9zCitteGd4MDMwIG1heG1hZyAgIDAgICAgIDAgICAtPiAgMAorbXhneDAzMSBtYXhtYWcgICAwICAgIC0wICAgLT4gIDAKK214Z3gwMzIgbWF4bWFnICAgMCAgICAtMC4wIC0+ICAwCitteGd4MDMzIG1heG1hZyAgIDAgICAgIDAuMCAtPiAgMAorbXhneDAzNCBtYXhtYWcgIC0wICAgICAwICAgLT4gIDAgICAgLS0gbm90ZTogLTAgPSAwLCBidXQgMCBjaG9zZW4KK214Z3gwMzUgbWF4bWFnICAtMCAgICAtMCAgIC0+IC0wCitteGd4MDM2IG1heG1hZyAgLTAgICAgLTAuMCAtPiAtMC4wCitteGd4MDM3IG1heG1hZyAgLTAgICAgIDAuMCAtPiAgMC4wCitteGd4MDM4IG1heG1hZyAgIDAuMCAgIDAgICAtPiAgMAorbXhneDAzOSBtYXhtYWcgICAwLjAgIC0wICAgLT4gIDAuMAorbXhneDA0MCBtYXhtYWcgICAwLjAgIC0wLjAgLT4gIDAuMAorbXhneDA0MSBtYXhtYWcgICAwLjAgICAwLjAgLT4gIDAuMAorbXhneDA0MiBtYXhtYWcgIC0wLjAgICAwICAgLT4gIDAKK214Z3gwNDMgbWF4bWFnICAtMC4wICAtMCAgIC0+IC0wLjAKK214Z3gwNDQgbWF4bWFnICAtMC4wICAtMC4wIC0+IC0wLjAKK214Z3gwNDUgbWF4bWFnICAtMC4wICAgMC4wIC0+ICAwLjAKKworbXhneDA1MCBtYXhtYWcgIC0wRTEgICAwRTEgLT4gIDBFKzEKK214Z3gwNTEgbWF4bWFnICAtMEUyICAgMEUyIC0+ICAwRSsyCitteGd4MDUyIG1heG1hZyAgLTBFMiAgIDBFMSAtPiAgMEUrMQorbXhneDA1MyBtYXhtYWcgIC0wRTEgICAwRTIgLT4gIDBFKzIKK214Z3gwNTQgbWF4bWFnICAgMEUxICAtMEUxIC0+ICAwRSsxCitteGd4MDU1IG1heG1hZyAgIDBFMiAgLTBFMiAtPiAgMEUrMgorbXhneDA1NiBtYXhtYWcgICAwRTIgIC0wRTEgLT4gIDBFKzIKK214Z3gwNTcgbWF4bWFnICAgMEUxICAtMEUyIC0+ICAwRSsxCisKK214Z3gwNTggbWF4bWFnICAgMEUxICAgMEUxIC0+ICAwRSsxCitteGd4MDU5IG1heG1hZyAgIDBFMiAgIDBFMiAtPiAgMEUrMgorbXhneDA2MCBtYXhtYWcgICAwRTIgICAwRTEgLT4gIDBFKzIKK214Z3gwNjEgbWF4bWFnICAgMEUxICAgMEUyIC0+ICAwRSsyCitteGd4MDYyIG1heG1hZyAgLTBFMSAgLTBFMSAtPiAtMEUrMQorbXhneDA2MyBtYXhtYWcgIC0wRTIgIC0wRTIgLT4gLTBFKzIKK214Z3gwNjQgbWF4bWFnICAtMEUyICAtMEUxIC0+IC0wRSsxCitteGd4MDY1IG1heG1hZyAgLTBFMSAgLTBFMiAtPiAtMEUrMQorCistLSBTcGVjaWFscworcHJlY2lzaW9uOiA5CitteGd4MDkwIG1heG1hZyAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitteGd4MDkxIG1heG1hZyAgSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CitteGd4MDkyIG1heG1hZyAgSW5mICAtMSAgICAgLT4gIEluZmluaXR5CitteGd4MDkzIG1heG1hZyAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitteGd4MDk0IG1heG1hZyAgSW5mICAgMCAgICAgLT4gIEluZmluaXR5CitteGd4MDk1IG1heG1hZyAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CitteGd4MDk2IG1heG1hZyAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitteGd4MDk3IG1heG1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MDk4IG1heG1hZyAtMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MDk5IG1heG1hZyAtSW5mICAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MTAwIG1heG1hZyAtMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MTAxIG1heG1hZyAtMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MTAyIG1heG1hZyAgMCAgICAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MTAzIG1heG1hZyAgMSAgICAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MTA0IG1heG1hZyAgMTAwMCAgSW5mICAgLT4gIEluZmluaXR5CitteGd4MTA1IG1heG1hZyAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK214Z3gxMjAgbWF4bWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMjEgbWF4bWFnIC1JbmYgIC0xMDAwICAtPiAtSW5maW5pdHkKK214Z3gxMjIgbWF4bWFnIC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK214Z3gxMjMgbWF4bWFnIC1JbmYgIC0wICAgICAtPiAtSW5maW5pdHkKK214Z3gxMjQgbWF4bWFnIC1JbmYgICAwICAgICAtPiAtSW5maW5pdHkKK214Z3gxMjUgbWF4bWFnIC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK214Z3gxMjYgbWF4bWFnIC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK214Z3gxMjcgbWF4bWFnIC1JbmYgICBJbmYgICAtPiAgSW5maW5pdHkKK214Z3gxMjggbWF4bWFnIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMjkgbWF4bWFnIC0xMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMzAgbWF4bWFnIC0xICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMzEgbWF4bWFnIC0wICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMzIgbWF4bWFnICAwICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMzMgbWF4bWFnICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMzQgbWF4bWFnICAxMDAwIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxMzUgbWF4bWFnICBJbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKKworLS0gMjAwNC4wOC4wMiA3NTRyIGNob29zZXMgbnVtYmVyIG92ZXIgTmFOIGluIG1peGVkIGNhc2VzCitteGd4MTQxIG1heG1hZyAgTmFOIC1JbmYgICAgLT4gLUluZmluaXR5CitteGd4MTQyIG1heG1hZyAgTmFOIC0xMDAwICAgLT4gLTEwMDAKK214Z3gxNDMgbWF4bWFnICBOYU4gLTEgICAgICAtPiAtMQorbXhneDE0NCBtYXhtYWcgIE5hTiAtMCAgICAgIC0+IC0wCitteGd4MTQ1IG1heG1hZyAgTmFOICAwICAgICAgLT4gIDAKK214Z3gxNDYgbWF4bWFnICBOYU4gIDEgICAgICAtPiAgMQorbXhneDE0NyBtYXhtYWcgIE5hTiAgMTAwMCAgIC0+ICAxMDAwCitteGd4MTQ4IG1heG1hZyAgTmFOICBJbmYgICAgLT4gIEluZmluaXR5CitteGd4MTQ5IG1heG1hZyAgTmFOICBOYU4gICAgLT4gIE5hTgorbXhneDE1MCBtYXhtYWcgLUluZiAgTmFOICAgIC0+IC1JbmZpbml0eQorbXhneDE1MSBtYXhtYWcgLTEwMDAgTmFOICAgIC0+IC0xMDAwCitteGd4MTUyIG1heG1hZyAtMSAgICBOYU4gICAgLT4gLTEKK214Z3gxNTMgbWF4bWFnIC0wICAgIE5hTiAgICAtPiAtMAorbXhneDE1NCBtYXhtYWcgIDAgICAgTmFOICAgIC0+ICAwCitteGd4MTU1IG1heG1hZyAgMSAgICBOYU4gICAgLT4gIDEKK214Z3gxNTYgbWF4bWFnICAxMDAwIE5hTiAgICAtPiAgMTAwMAorbXhneDE1NyBtYXhtYWcgIEluZiAgTmFOICAgIC0+ICBJbmZpbml0eQorCitteGd4MTYxIG1heG1hZyAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNjIgbWF4bWFnICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE2MyBtYXhtYWcgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTY0IG1heG1hZyAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNjUgbWF4bWFnICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE2NiBtYXhtYWcgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTY3IG1heG1hZyAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNjggbWF4bWFnICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE2OSBtYXhtYWcgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTcwIG1heG1hZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNzEgbWF4bWFnIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE3MiBtYXhtYWcgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTczIG1heG1hZyAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNzQgbWF4bWFnIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE3NSBtYXhtYWcgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTc2IG1heG1hZyAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK214Z3gxNzcgbWF4bWFnICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE3OCBtYXhtYWcgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitteGd4MTc5IG1heG1hZyAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworbXhneDE4MSBtYXhtYWcgIE5hTjkgIC1JbmYgICAtPiAtSW5maW5pdHkKK214Z3gxODIgbWF4bWFnICBOYU44ICAgICA5ICAgLT4gIDkKK214Z3gxODMgbWF4bWFnIC1OYU43ICAgSW5mICAgLT4gIEluZmluaXR5CisKK214Z3gxODQgbWF4bWFnIC1OYU4xICAgTmFOMTEgLT4gLU5hTjEKK214Z3gxODUgbWF4bWFnICBOYU4yICAgTmFOMTIgLT4gIE5hTjIKK214Z3gxODYgbWF4bWFnIC1OYU4xMyAtTmFONyAgLT4gLU5hTjEzCitteGd4MTg3IG1heG1hZyAgTmFOMTQgLU5hTjUgIC0+ICBOYU4xNAorCitteGd4MTg4IG1heG1hZyAtSW5mICAgIE5hTjQgIC0+IC1JbmZpbml0eQorbXhneDE4OSBtYXhtYWcgLTkgICAgIC1OYU4zICAtPiAtOQorbXhneDE5MCBtYXhtYWcgIEluZiAgICBOYU4yICAtPiAgSW5maW5pdHkKKworbXhneDE5MSBtYXhtYWcgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5MiBtYXhtYWcgIHNOYU45OCAtMSAgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5MyBtYXhtYWcgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5NCBtYXhtYWcgIHNOYU45NiBzTmFOOTQgIC0+ICBOYU45NiBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5NSBtYXhtYWcgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5NiBtYXhtYWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5NyBtYXhtYWcgIDAgICAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5OCBtYXhtYWcgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorbXhneDE5OSBtYXhtYWcgIE5hTiAgICBzTmFOODkgIC0+ICBOYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCistLSByb3VuZGluZyBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK214Z3gyMDEgbWF4bWFnIDEyMzQ1Njc4MDAwIDEgIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK214Z3gyMDIgbWF4bWFnIDEgMTIzNDU2NzgwMDAgIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK214Z3gyMDMgbWF4bWFnIDEyMzQ1Njc4MDAgIDEgIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorbXhneDIwNCBtYXhtYWcgMSAxMjM0NTY3ODAwICAgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitteGd4MjA1IG1heG1hZyAxMjM0NTY3ODkwICAxICAtPiAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK214Z3gyMDYgbWF4bWFnIDEgMTIzNDU2Nzg5MCAgIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorbXhneDIwNyBtYXhtYWcgMTIzNDU2Nzg5MSAgMSAgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMDggbWF4bWFnIDEgMTIzNDU2Nzg5MSAgIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitteGd4MjA5IG1heG1hZyAxMjM0NTY3ODkwMSAxICAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMTAgbWF4bWFnIDEgMTIzNDU2Nzg5MDEgIC0+IDEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorbXhneDIxMSBtYXhtYWcgMTIzNDU2Nzg5NiAgMSAgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMTIgbWF4bWFnIDEgMTIzNDU2Nzg5NiAgIC0+IDEuMjM0NTY3OTBFKzkgSW5leGFjdCBSb3VuZGVkCitteGd4MjEzIG1heG1hZyAtMTIzNDU2Nzg5MSAgMSAtPiAtMS4yMzQ1Njc4OUUrOSAgIEluZXhhY3QgUm91bmRlZAorbXhneDIxNCBtYXhtYWcgMSAtMTIzNDU2Nzg5MSAgLT4gLTEuMjM0NTY3ODlFKzkgICBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMTUgbWF4bWFnIC0xMjM0NTY3ODkwMSAxIC0+IC0xLjIzNDU2Nzg5RSsxMCAgSW5leGFjdCBSb3VuZGVkCitteGd4MjE2IG1heG1hZyAxIC0xMjM0NTY3ODkwMSAtPiAtMS4yMzQ1Njc4OUUrMTAgIEluZXhhY3QgUm91bmRlZAorbXhneDIxNyBtYXhtYWcgLTEyMzQ1Njc4OTYgIDEgLT4gLTEuMjM0NTY3OTBFKzkgICBJbmV4YWN0IFJvdW5kZWQKK214Z3gyMTggbWF4bWFnIDEgLTEyMzQ1Njc4OTYgIC0+IC0xLjIzNDU2NzkwRSs5ICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogMTUKK214Z3gyMjEgbWF4bWFnIDEyMzQ1Njc4MDAwIDEgIC0+IDEyMzQ1Njc4MDAwCitteGd4MjIyIG1heG1hZyAxIDEyMzQ1Njc4MDAwICAtPiAxMjM0NTY3ODAwMAorbXhneDIyMyBtYXhtYWcgMTIzNDU2NzgwMCAgMSAgLT4gMTIzNDU2NzgwMAorbXhneDIyNCBtYXhtYWcgMSAxMjM0NTY3ODAwICAgLT4gMTIzNDU2NzgwMAorbXhneDIyNSBtYXhtYWcgMTIzNDU2Nzg5MCAgMSAgLT4gMTIzNDU2Nzg5MAorbXhneDIyNiBtYXhtYWcgMSAxMjM0NTY3ODkwICAgLT4gMTIzNDU2Nzg5MAorbXhneDIyNyBtYXhtYWcgMTIzNDU2Nzg5MSAgMSAgLT4gMTIzNDU2Nzg5MQorbXhneDIyOCBtYXhtYWcgMSAxMjM0NTY3ODkxICAgLT4gMTIzNDU2Nzg5MQorbXhneDIyOSBtYXhtYWcgMTIzNDU2Nzg5MDEgMSAgLT4gMTIzNDU2Nzg5MDEKK214Z3gyMzAgbWF4bWFnIDEgMTIzNDU2Nzg5MDEgIC0+IDEyMzQ1Njc4OTAxCitteGd4MjMxIG1heG1hZyAxMjM0NTY3ODk2ICAxICAtPiAxMjM0NTY3ODk2CitteGd4MjMyIG1heG1hZyAxIDEyMzQ1Njc4OTYgICAtPiAxMjM0NTY3ODk2CitteGd4MjMzIG1heG1hZyAtMTIzNDU2Nzg5MSAgMSAtPiAtMTIzNDU2Nzg5MQorbXhneDIzNCBtYXhtYWcgMSAtMTIzNDU2Nzg5MSAgLT4gLTEyMzQ1Njc4OTEKK214Z3gyMzUgbWF4bWFnIC0xMjM0NTY3ODkwMSAxIC0+IC0xMjM0NTY3ODkwMQorbXhneDIzNiBtYXhtYWcgMSAtMTIzNDU2Nzg5MDEgLT4gLTEyMzQ1Njc4OTAxCitteGd4MjM3IG1heG1hZyAtMTIzNDU2Nzg5NiAgMSAtPiAtMTIzNDU2Nzg5NgorbXhneDIzOCBtYXhtYWcgMSAtMTIzNDU2Nzg5NiAgLT4gLTEyMzQ1Njc4OTYKKworLS0gZnJvbSBleGFtcGxlcworbXhneDI4MCBtYXhtYWcgJzMnICAgJzInICAtPiAgJzMnCitteGd4MjgxIG1heG1hZyAnLTEwJyAnMycgIC0+ICAnLTEwJworbXhneDI4MiBtYXhtYWcgJzEuMCcgJzEnICAtPiAgJzEnCitteGd4MjgzIG1heG1hZyAnMScgJzEuMCcgIC0+ICAnMScKK214Z3gyODQgbWF4bWFnICc3JyAnTmFOJyAgLT4gICc3JworCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uLgorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK214Z3gzMzAgbWF4bWFnICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAgOUUrOTk5OTk5OTk5CitteGd4MzMxIG1heG1hZyA5RSs5OTk5OTk5OTkgKzEuMjM0NTY3ODkwMTIzNDVFLTAgLT4gIDlFKzk5OTk5OTk5OQorbXhneDMzMiBtYXhtYWcgKzAuMTAwIDlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+ICAwLjEwMAorbXhneDMzMyBtYXhtYWcgOUUtOTk5OTk5OTk5ICswLjEwMCAgICAgICAgICAgICAgIC0+ICAwLjEwMAorbXhneDMzNSBtYXhtYWcgLTEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+ICA5RSs5OTk5OTk5OTkKK214Z3gzMzYgbWF4bWFnIDlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAgOUUrOTk5OTk5OTk5CitteGd4MzM3IG1heG1hZyAtMC4xMDAgOUUtOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gIC0wLjEwMAorbXhneDMzOCBtYXhtYWcgOUUtOTk5OTk5OTk5IC0wLjEwMCAgICAgICAgICAgICAgIC0+ICAtMC4xMDAKKworbXhneDMzOSBtYXhtYWcgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMSAgIC0+ICAxRS00MDAwMDAwMDEKK214Z3gzNDAgbWF4bWFnIDFlLTU5OTk5OTk5OSAxZS00MDAwMDAwMDAgICAtPiAgMUUtNDAwMDAwMDAwCitteGd4MzQxIG1heG1hZyAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAwICAgLT4gIDFFLTQwMDAwMDAwMAorbXhneDM0MiBtYXhtYWcgOWUtOTk5OTk5OTk4IDAuMDEgICAgICAgICAgIC0+ICAwLjAxCitteGd4MzQzIG1heG1hZyA5ZS05OTk5OTk5OTggMC4xICAgICAgICAgICAgLT4gIDAuMQorbXhneDM0NCBtYXhtYWcgMC4wMSA5ZS05OTk5OTk5OTggICAgICAgICAgIC0+ICAwLjAxCitteGd4MzQ1IG1heG1hZyAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMSAgICAgLT4gIDFFKzU5OTk5OTk5OQorbXhneDM0NiBtYXhtYWcgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDAgICAgIC0+ICAxRSs1OTk5OTk5OTkKK214Z3gzNDcgbWF4bWFnIDFlNjAwMDAwMDAwIDFlNDAwMDAwMDAwICAgICAtPiAgMUUrNjAwMDAwMDAwCitteGd4MzQ4IG1heG1hZyA5ZTk5OTk5OTk5OCAxMDAgICAgICAgICAgICAgLT4gIDlFKzk5OTk5OTk5OAorbXhneDM0OSBtYXhtYWcgOWU5OTk5OTk5OTggMTAgICAgICAgICAgICAgIC0+ICA5RSs5OTk5OTk5OTgKK214Z3gzNTAgbWF4bWFnIDEwMCAgOWU5OTk5OTk5OTggICAgICAgICAgICAtPiAgOUUrOTk5OTk5OTk4CistLSBzaWducworbXhneDM1MSBtYXhtYWcgIDFlKzc3Nzc3Nzc3NyAgMWUrNDExMTExMTExIC0+ICAxRSs3Nzc3Nzc3NzcKK214Z3gzNTIgbWF4bWFnICAxZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAgMUUrNzc3Nzc3Nzc3CitteGd4MzUzIG1heG1hZyAtMWUrNzc3Nzc3Nzc3ICAxZSs0MTExMTExMTEgLT4gLTFFKzc3Nzc3Nzc3NworbXhneDM1NCBtYXhtYWcgLTFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+IC0xRSs3Nzc3Nzc3NzcKK214Z3gzNTUgbWF4bWFnICAxZS03Nzc3Nzc3NzcgIDFlLTQxMTExMTExMSAtPiAgMUUtNDExMTExMTExCitteGd4MzU2IG1heG1hZyAgMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gLTFFLTQxMTExMTExMQorbXhneDM1NyBtYXhtYWcgLTFlLTc3Nzc3Nzc3NyAgMWUtNDExMTExMTExIC0+ICAxRS00MTExMTExMTEKK214Z3gzNTggbWF4bWFnIC0xZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAtMUUtNDExMTExMTExCisKKy0tIGV4cGFuZGVkIGxpc3QgZnJvbSBtaW4vbWF4IDc1NHIgcHVycGxlIHByb3NlCistLSBbZXhwbGljaXQgdGVzdHMgZm9yIGV4cG9uZW50IG9yZGVyaW5nXQorbXhneDQwMSBtYXhtYWcgIEluZiAgICAxLjEgICAgIC0+ICBJbmZpbml0eQorbXhneDQwMiBtYXhtYWcgIDEuMSAgICAxICAgICAgIC0+ICAxLjEKK214Z3g0MDMgbWF4bWFnICAxICAgICAgMS4wICAgICAtPiAgMQorbXhneDQwNCBtYXhtYWcgIDEuMCAgICAwLjEgICAgIC0+ICAxLjAKK214Z3g0MDUgbWF4bWFnICAwLjEgICAgMC4xMCAgICAtPiAgMC4xCitteGd4NDA2IG1heG1hZyAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAKK214Z3g0MDcgbWF4bWFnICAwLjEwICAgMCAgICAgICAtPiAgMC4xMAorbXhneDQwOCBtYXhtYWcgIDAgICAgICAwLjAgICAgIC0+ICAwCitteGd4NDA5IG1heG1hZyAgMC4wICAgLTAgICAgICAgLT4gIDAuMAorbXhneDQxMCBtYXhtYWcgIDAuMCAgIC0wLjAgICAgIC0+ICAwLjAKK214Z3g0MTEgbWF4bWFnICAwLjAwICAtMC4wICAgICAtPiAgMC4wMAorbXhneDQxMiBtYXhtYWcgIDAuMCAgIC0wLjAwICAgIC0+ICAwLjAKK214Z3g0MTMgbWF4bWFnICAwICAgICAtMC4wICAgICAtPiAgMAorbXhneDQxNCBtYXhtYWcgIDAgICAgIC0wICAgICAgIC0+ICAwCitteGd4NDE1IG1heG1hZyAtMC4wICAgLTAgICAgICAgLT4gLTAuMAorbXhneDQxNiBtYXhtYWcgLTAgICAgIC0wLjEwMCAgIC0+IC0wLjEwMAorbXhneDQxNyBtYXhtYWcgLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwMAorbXhneDQxOCBtYXhtYWcgLTAuMTAgIC0wLjEgICAgIC0+IC0wLjEwCitteGd4NDE5IG1heG1hZyAtMC4xICAgLTEuMCAgICAgLT4gLTEuMAorbXhneDQyMCBtYXhtYWcgLTEuMCAgIC0xICAgICAgIC0+IC0xLjAKK214Z3g0MjEgbWF4bWFnIC0xICAgICAtMS4xICAgICAtPiAtMS4xCitteGd4NDIzIG1heG1hZyAtMS4xICAgLUluZiAgICAgLT4gLUluZmluaXR5CistLSBzYW1lIHdpdGggb3BlcmFuZHMgcmV2ZXJzZWQKK214Z3g0MzEgbWF4bWFnICAxLjEgICAgSW5mICAgICAtPiAgSW5maW5pdHkKK214Z3g0MzIgbWF4bWFnICAxICAgICAgMS4xICAgICAtPiAgMS4xCitteGd4NDMzIG1heG1hZyAgMS4wICAgIDEgICAgICAgLT4gIDEKK214Z3g0MzQgbWF4bWFnICAwLjEgICAgMS4wICAgICAtPiAgMS4wCitteGd4NDM1IG1heG1hZyAgMC4xMCAgIDAuMSAgICAgLT4gIDAuMQorbXhneDQzNiBtYXhtYWcgIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwCitteGd4NDM3IG1heG1hZyAgMCAgICAgIDAuMTAgICAgLT4gIDAuMTAKK214Z3g0MzggbWF4bWFnICAwLjAgICAgMCAgICAgICAtPiAgMAorbXhneDQzOSBtYXhtYWcgLTAgICAgICAwLjAgICAgIC0+ICAwLjAKK214Z3g0NDAgbWF4bWFnIC0wLjAgICAgMC4wICAgICAtPiAgMC4wCitteGd4NDQxIG1heG1hZyAtMC4wICAgIDAuMDAgICAgLT4gIDAuMDAKK214Z3g0NDIgbWF4bWFnIC0wLjAwICAgMC4wICAgICAtPiAgMC4wCitteGd4NDQzIG1heG1hZyAtMC4wICAgIDAgICAgICAgLT4gIDAKK214Z3g0NDQgbWF4bWFnIC0wICAgICAgMCAgICAgICAtPiAgMAorbXhneDQ0NSBtYXhtYWcgLTAgICAgIC0wLjAgICAgIC0+IC0wLjAKK214Z3g0NDYgbWF4bWFnIC0wLjEwMCAtMCAgICAgICAtPiAtMC4xMDAKK214Z3g0NDcgbWF4bWFnIC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMDAKK214Z3g0NDggbWF4bWFnIC0wLjEgICAtMC4xMCAgICAtPiAtMC4xMAorbXhneDQ0OSBtYXhtYWcgLTEuMCAgIC0wLjEgICAgIC0+IC0xLjAKK214Z3g0NTAgbWF4bWFnIC0xICAgICAtMS4wICAgICAtPiAtMS4wCitteGd4NDUxIG1heG1hZyAtMS4xICAgLTEgICAgICAgLT4gLTEuMQorbXhneDQ1MyBtYXhtYWcgLUluZiAgIC0xLjEgICAgIC0+IC1JbmZpbml0eQorLS0gbGFyZ2llcworbXhneDQ2MCBtYXhtYWcgIDEwMDAgICAxRSszICAgIC0+ICAxRSszCitteGd4NDYxIG1heG1hZyAgMUUrMyAgIDEwMDAgICAgLT4gIDFFKzMKK214Z3g0NjIgbWF4bWFnICAxMDAwICAtMUUrMyAgICAtPiAgMTAwMAorbXhneDQ2MyBtYXhtYWcgIDFFKzMgIC0xMDAwICAgIC0+ICAxRSszCitteGd4NDY0IG1heG1hZyAtMTAwMCAgIDFFKzMgICAgLT4gIDFFKzMKK214Z3g0NjUgbWF4bWFnIC0xRSszICAgMTAwMCAgICAtPiAgMTAwMAorbXhneDQ2NiBtYXhtYWcgLTEwMDAgIC0xRSszICAgIC0+IC0xMDAwCitteGd4NDY3IG1heG1hZyAtMUUrMyAgLTEwMDAgICAgLT4gLTEwMDAKKworLS0gcm91bmRpbmcgKHJlc3VsdHMgdHJlYXRlZCBhcyB0aG91Z2ggcGx1cykKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDMKKworbXhneDQ3MCBtYXhtYWcgIDEgICAgICAuNSAgICAgLT4gIDEKK214Z3g0NzEgbWF4bWFnICAxMCAgICAgNSAgICAgIC0+ICAxMAorbXhneDQ3MiBtYXhtYWcgIDEwMCAgICA1MCAgICAgLT4gIDEwMAorbXhneDQ3MyBtYXhtYWcgIDEwMDAgICA1MDAgICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbXhneDQ3NCBtYXhtYWcgIDEwMDAwICA1MDAwICAgLT4gIDEuMDBFKzQgUm91bmRlZAorbXhneDQ3NSBtYXhtYWcgIDYgICAgICAuNSAgICAgLT4gIDYKK214Z3g0NzYgbWF4bWFnICA2NiAgICAgNSAgICAgIC0+ICA2NgorbXhneDQ3NyBtYXhtYWcgIDY2NiAgICA1MCAgICAgLT4gIDY2NgorbXhneDQ3OCBtYXhtYWcgIDY2NjYgICA1MDAgICAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0CitteGd4NDc5IG1heG1hZyAgNjY2NjYgIDUwMDAgICAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK214Z3g0ODAgbWF4bWFnICAzMzMzMyAgNTAwMCAgIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorbXhneDQ4MSBtYXhtYWcgIC41ICAgICAxICAgICAgLT4gIDEKK214Z3g0ODIgbWF4bWFnICAuNSAgICAgMTAgICAgIC0+ICAxMAorbXhneDQ4MyBtYXhtYWcgIC41ICAgICAxMDAgICAgLT4gIDEwMAorbXhneDQ4NCBtYXhtYWcgIC41ICAgICAxMDAwICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbXhneDQ4NSBtYXhtYWcgIC41ICAgICAxMDAwMCAgLT4gIDEuMDBFKzQgUm91bmRlZAorbXhneDQ4NiBtYXhtYWcgIC41ICAgICA2ICAgICAgLT4gIDYKK214Z3g0ODcgbWF4bWFnICAuNSAgICAgNjYgICAgIC0+ICA2NgorbXhneDQ4OCBtYXhtYWcgIC41ICAgICA2NjYgICAgLT4gIDY2NgorbXhneDQ4OSBtYXhtYWcgIC41ICAgICA2NjY2ICAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0CitteGd4NDkwIG1heG1hZyAgLjUgICAgIDY2NjY2ICAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK214Z3g0OTEgbWF4bWFnICAuNSAgICAgMzMzMzMgIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorCistLSBvdmVyZmxvdyB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworbXhneDUwMCBtYXhtYWcgOS45OTlFKzk5OTk5OTk5OSAgMCAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitteGd4NTAxIG1heG1hZyAtOS45OTlFKzk5OTk5OTk5OSAwIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitteGd4NTEwIG1heG1hZyAgMS4wMEUtOTk5ICAgICAgIDAgIC0+ICAgMS4wMEUtOTk5CitteGd4NTExIG1heG1hZyAgMC4xRS05OTkgICAgICAgIDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorbXhneDUxMiBtYXhtYWcgIDAuMTBFLTk5OSAgICAgICAwICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK214Z3g1MTMgbWF4bWFnICAwLjEwMEUtOTk5ICAgICAgMCAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK214Z3g1MTQgbWF4bWFnICAwLjAxRS05OTkgICAgICAgMCAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gTm1pbgorbXhneDUxNSBtYXhtYWcgIDAuOTk5RS05OTkgICAgICAwICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXhneDUxNiBtYXhtYWcgIDAuMDk5RS05OTkgICAgICAwICAtPiAgIDEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXhneDUxNyBtYXhtYWcgIDAuMDA5RS05OTkgICAgICAwICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXhneDUxOCBtYXhtYWcgIDAuMDAxRS05OTkgICAgICAwICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitteGd4NTE5IG1heG1hZyAgMC4wMDA5RS05OTkgICAgIDAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK214Z3g1MjAgbWF4bWFnICAwLjAwMDFFLTk5OSAgICAgMCAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCitteGd4NTMwIG1heG1hZyAtMS4wMEUtOTk5ICAgICAgIDAgIC0+ICAtMS4wMEUtOTk5CitteGd4NTMxIG1heG1hZyAtMC4xRS05OTkgICAgICAgIDAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbAorbXhneDUzMiBtYXhtYWcgLTAuMTBFLTk5OSAgICAgICAwICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwKK214Z3g1MzMgbWF4bWFnIC0wLjEwMEUtOTk5ICAgICAgMCAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK214Z3g1MzQgbWF4bWFnIC0wLjAxRS05OTkgICAgICAgMCAgLT4gIC0xRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gLU5taW4KK214Z3g1MzUgbWF4bWFnIC0wLjk5OUUtOTk5ICAgICAgMCAgLT4gIC0xLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK214Z3g1MzYgbWF4bWFnIC0wLjA5OUUtOTk5ICAgICAgMCAgLT4gIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK214Z3g1MzcgbWF4bWFnIC0wLjAwOUUtOTk5ICAgICAgMCAgLT4gIC0xRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK214Z3g1MzggbWF4bWFnIC0wLjAwMUUtOTk5ICAgICAgMCAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorbXhneDUzOSBtYXhtYWcgLTAuMDAwOUUtOTk5ICAgICAwICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitteGd4NTQwIG1heG1hZyAtMC4wMDAxRS05OTkgICAgIDAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworLS0gTnVsbCB0ZXN0cworbXhneDkwMCBtYXhtYWcgMTAgICMgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbXhneDkwMSBtYXhtYWcgICMgMTAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCisKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW4uZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWluLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmNzU4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWluLmRlY1Rlc3QKQEAgLTAsMCArMSw0MDcgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbWluLmRlY1Rlc3QgLS0gZGVjaW1hbCBtaW5pbXVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSB3ZSBhc3N1bWUgdGhhdCBiYXNlIGNvbXBhcmlzb24gaXMgdGVzdGVkIGluIGNvbXBhcmUuZGVjVGVzdCwgc28KKy0tIHRoZXNlIG1haW5seSBjb3ZlciBzcGVjaWFsIGNhc2VzIGFuZCByb3VuZGluZworCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBzYW5pdHkgY2hlY2tzCittbm14MDAxIG1pbiAgLTIgIC0yICAtPiAtMgorbW5teDAwMiBtaW4gIC0yICAtMSAgLT4gLTIKK21ubXgwMDMgbWluICAtMiAgIDAgIC0+IC0yCittbm14MDA0IG1pbiAgLTIgICAxICAtPiAtMgorbW5teDAwNSBtaW4gIC0yICAgMiAgLT4gLTIKK21ubXgwMDYgbWluICAtMSAgLTIgIC0+IC0yCittbm14MDA3IG1pbiAgLTEgIC0xICAtPiAtMQorbW5teDAwOCBtaW4gIC0xICAgMCAgLT4gLTEKK21ubXgwMDkgbWluICAtMSAgIDEgIC0+IC0xCittbm14MDEwIG1pbiAgLTEgICAyICAtPiAtMQorbW5teDAxMSBtaW4gICAwICAtMiAgLT4gLTIKK21ubXgwMTIgbWluICAgMCAgLTEgIC0+IC0xCittbm14MDEzIG1pbiAgIDAgICAwICAtPiAgMAorbW5teDAxNCBtaW4gICAwICAgMSAgLT4gIDAKK21ubXgwMTUgbWluICAgMCAgIDIgIC0+ICAwCittbm14MDE2IG1pbiAgIDEgIC0yICAtPiAtMgorbW5teDAxNyBtaW4gICAxICAtMSAgLT4gLTEKK21ubXgwMTggbWluICAgMSAgIDAgIC0+ICAwCittbm14MDE5IG1pbiAgIDEgICAxICAtPiAgMQorbW5teDAyMCBtaW4gICAxICAgMiAgLT4gIDEKK21ubXgwMjEgbWluICAgMiAgLTIgIC0+IC0yCittbm14MDIyIG1pbiAgIDIgIC0xICAtPiAtMQorbW5teDAyMyBtaW4gICAyICAgMCAgLT4gIDAKK21ubXgwMjUgbWluICAgMiAgIDEgIC0+ICAxCittbm14MDI2IG1pbiAgIDIgICAyICAtPiAgMgorCistLSBleHRlbmRlZCB6ZXJvcworbW5teDAzMCBtaW4gICAwICAgICAwICAgLT4gIDAKK21ubXgwMzEgbWluICAgMCAgICAtMCAgIC0+IC0wCittbm14MDMyIG1pbiAgIDAgICAgLTAuMCAtPiAtMC4wCittbm14MDMzIG1pbiAgIDAgICAgIDAuMCAtPiAgMC4wCittbm14MDM0IG1pbiAgLTAgICAgIDAgICAtPiAtMAorbW5teDAzNSBtaW4gIC0wICAgIC0wICAgLT4gLTAKK21ubXgwMzYgbWluICAtMCAgICAtMC4wIC0+IC0wCittbm14MDM3IG1pbiAgLTAgICAgIDAuMCAtPiAtMAorbW5teDAzOCBtaW4gICAwLjAgICAwICAgLT4gIDAuMAorbW5teDAzOSBtaW4gICAwLjAgIC0wICAgLT4gLTAKK21ubXgwNDAgbWluICAgMC4wICAtMC4wIC0+IC0wLjAKK21ubXgwNDEgbWluICAgMC4wICAgMC4wIC0+ICAwLjAKK21ubXgwNDIgbWluICAtMC4wICAgMCAgIC0+IC0wLjAKK21ubXgwNDMgbWluICAtMC4wICAtMCAgIC0+IC0wCittbm14MDQ0IG1pbiAgLTAuMCAgLTAuMCAtPiAtMC4wCittbm14MDQ1IG1pbiAgLTAuMCAgIDAuMCAtPiAtMC4wCisKK21ubXgwNDYgbWluICAgMEUxICAtMEUxIC0+IC0wRSsxCittbm14MDQ3IG1pbiAgLTBFMSAgIDBFMiAtPiAtMEUrMQorbW5teDA0OCBtaW4gICAwRTIgICAwRTEgLT4gIDBFKzEKK21ubXgwNDkgbWluICAgMEUxICAgMEUyIC0+ICAwRSsxCittbm14MDUwIG1pbiAgLTBFMyAgLTBFMiAtPiAtMEUrMworbW5teDA1MSBtaW4gIC0wRTIgIC0wRTMgLT4gLTBFKzMKKworLS0gU3BlY2lhbHMKK3ByZWNpc2lvbjogOQorbW5teDA5MCBtaW4gIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorbW5teDA5MSBtaW4gIEluZiAgLTEwMDAgIC0+IC0xMDAwCittbm14MDkyIG1pbiAgSW5mICAtMSAgICAgLT4gLTEKK21ubXgwOTMgbWluICBJbmYgIC0wICAgICAtPiAtMAorbW5teDA5NCBtaW4gIEluZiAgIDAgICAgIC0+ICAwCittbm14MDk1IG1pbiAgSW5mICAgMSAgICAgLT4gIDEKK21ubXgwOTYgbWluICBJbmYgICAxMDAwICAtPiAgMTAwMAorbW5teDA5NyBtaW4gIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorbW5teDA5OCBtaW4gLTEwMDAgIEluZiAgIC0+IC0xMDAwCittbm14MDk5IG1pbiAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5Cittbm14MTAwIG1pbiAtMSAgICAgSW5mICAgLT4gLTEKK21ubXgxMDEgbWluIC0wICAgICBJbmYgICAtPiAtMAorbW5teDEwMiBtaW4gIDAgICAgIEluZiAgIC0+ICAwCittbm14MTAzIG1pbiAgMSAgICAgSW5mICAgLT4gIDEKK21ubXgxMDQgbWluICAxMDAwICBJbmYgICAtPiAgMTAwMAorbW5teDEwNSBtaW4gIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCittbm14MTIwIG1pbiAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTIxIG1pbiAtSW5mICAtMTAwMCAgLT4gLUluZmluaXR5Cittbm14MTIyIG1pbiAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5Cittbm14MTIzIG1pbiAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5Cittbm14MTI0IG1pbiAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5Cittbm14MTI1IG1pbiAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5Cittbm14MTI2IG1pbiAtSW5mICAgMTAwMCAgLT4gLUluZmluaXR5Cittbm14MTI3IG1pbiAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5Cittbm14MTI4IG1pbiAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTI5IG1pbiAtMTAwMCAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTMwIG1pbiAtMSAgICAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTMxIG1pbiAtMCAgICAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTMyIG1pbiAgMCAgICAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTMzIG1pbiAgMSAgICAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTM0IG1pbiAgMTAwMCAtSW5mICAgLT4gLUluZmluaXR5Cittbm14MTM1IG1pbiAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CisKKy0tIDIwMDQuMDguMDIgNzU0ciBjaG9vc2VzIG51bWJlciBvdmVyIE5hTiBpbiBtaXhlZCBjYXNlcworbW5teDE0MSBtaW4gIE5hTiAtSW5mICAgIC0+ICAtSW5maW5pdHkKK21ubXgxNDIgbWluICBOYU4gLTEwMDAgICAtPiAgLTEwMDAKK21ubXgxNDMgbWluICBOYU4gLTEgICAgICAtPiAgLTEKK21ubXgxNDQgbWluICBOYU4gLTAgICAgICAtPiAgLTAKK21ubXgxNDUgbWluICBOYU4gIDAgICAgICAtPiAgMAorbW5teDE0NiBtaW4gIE5hTiAgMSAgICAgIC0+ICAxCittbm14MTQ3IG1pbiAgTmFOICAxMDAwICAgLT4gIDEwMDAKK21ubXgxNDggbWluICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK21ubXgxNDkgbWluICBOYU4gIE5hTiAgICAtPiAgTmFOCittbm14MTUwIG1pbiAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5Cittbm14MTUxIG1pbiAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK21ubXgxNTIgbWluIC0xICAgLU5hTiAgICAtPiAtMQorbW5teDE1MyBtaW4gLTAgICAgTmFOICAgIC0+IC0wCittbm14MTU0IG1pbiAgMCAgIC1OYU4gICAgLT4gIDAKK21ubXgxNTUgbWluICAxICAgIE5hTiAgICAtPiAgMQorbW5teDE1NiBtaW4gIDEwMDAgTmFOICAgIC0+ICAxMDAwCittbm14MTU3IG1pbiAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK21ubXgxNjEgbWluICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE2MiBtaW4gIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTYzIG1pbiAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNjQgbWluICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE2NSBtaW4gLXNOYU4gIDAgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTY2IG1pbiAtc05hTiAgMSAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNjcgbWluICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE2OCBtaW4gIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTY5IG1pbiAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNzAgbWluICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE3MSBtaW4gLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTcyIG1pbiAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNzMgbWluIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE3NCBtaW4gLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTc1IG1pbiAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNzYgbWluICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE3NyBtaW4gIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbm14MTc4IG1pbiAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21ubXgxNzkgbWluICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCittbm14MTgxIG1pbiAgTmFOOSAgIC1JbmYgICAtPiAtSW5maW5pdHkKK21ubXgxODIgbWluIC1OYU44ICAgIDk5OTAgIC0+ICA5OTkwCittbm14MTgzIG1pbiAgTmFONzEgICBJbmYgICAtPiAgSW5maW5pdHkKKworbW5teDE4NCBtaW4gIE5hTjEgICAgTmFONTQgLT4gIE5hTjEKK21ubXgxODUgbWluICBOYU4yMiAgLU5hTjUzIC0+ICBOYU4yMgorbW5teDE4NiBtaW4gLU5hTjMgICAgTmFONiAgLT4gLU5hTjMKK21ubXgxODcgbWluIC1OYU40NCAgIE5hTjcgIC0+IC1OYU40NAorCittbm14MTg4IG1pbiAtSW5mICAgICBOYU40MSAtPiAtSW5maW5pdHkKK21ubXgxODkgbWluIC05OTk5ICAgLU5hTjMzIC0+IC05OTk5Cittbm14MTkwIG1pbiAgSW5mICAgICBOYU4yICAtPiAgSW5maW5pdHkKKworbW5teDE5MSBtaW4gIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5MiBtaW4gIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5MyBtaW4gLXNOYU45NyAgTmFOOCAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5NCBtaW4gIHNOYU42OSBzTmFOOTQgIC0+ICBOYU42OSBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5NSBtaW4gIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5NiBtaW4gLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5NyBtaW4gIDA4OCAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5OCBtaW4gIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorbW5teDE5OSBtaW4gIE5hTiAgICBzTmFOODYgIC0+ICBOYU44NiBJbnZhbGlkX29wZXJhdGlvbgorCistLSByb3VuZGluZyBjaGVja3MgLS0gY2hvc2VuIGlzIHJvdW5kZWQsIG9yIG5vdAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorbW5teDIwMSBtaW4gLTEyMzQ1Njc4MDAwIDEgIC0+IC0xLjIzNDU2NzgwRSsxMCBSb3VuZGVkCittbm14MjAyIG1pbiAxIC0xMjM0NTY3ODAwMCAgLT4gLTEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK21ubXgyMDMgbWluIC0xMjM0NTY3ODAwICAxICAtPiAtMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCittbm14MjA0IG1pbiAxIC0xMjM0NTY3ODAwICAgLT4gLTEuMjM0NTY3ODBFKzkgUm91bmRlZAorbW5teDIwNSBtaW4gLTEyMzQ1Njc4OTAgIDEgIC0+IC0xLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK21ubXgyMDYgbWluIDEgLTEyMzQ1Njc4OTAgICAtPiAtMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCittbm14MjA3IG1pbiAtMTIzNDU2Nzg5MSAgMSAgLT4gLTEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCittbm14MjA4IG1pbiAxIC0xMjM0NTY3ODkxICAgLT4gLTEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCittbm14MjA5IG1pbiAtMTIzNDU2Nzg5MDEgMSAgLT4gLTEuMjM0NTY3ODlFKzEwIEluZXhhY3QgUm91bmRlZAorbW5teDIxMCBtaW4gMSAtMTIzNDU2Nzg5MDEgIC0+IC0xLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK21ubXgyMTEgbWluIC0xMjM0NTY3ODk2ICAxICAtPiAtMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK21ubXgyMTIgbWluIDEgLTEyMzQ1Njc4OTYgICAtPiAtMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK21ubXgyMTMgbWluIDEyMzQ1Njc4OTEgIDEgICAtPiAxCittbm14MjE0IG1pbiAxIDEyMzQ1Njc4OTEgICAgLT4gMQorbW5teDIxNSBtaW4gMTIzNDU2Nzg5MDEgMSAgIC0+IDEKK21ubXgyMTYgbWluIDEgMTIzNDU2Nzg5MDEgICAtPiAxCittbm14MjE3IG1pbiAxMjM0NTY3ODk2ICAxICAgLT4gMQorbW5teDIxOCBtaW4gMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworcHJlY2lzaW9uOiAxNQorbW5teDIyMSBtaW4gLTEyMzQ1Njc4MDAwIDEgIC0+IC0xMjM0NTY3ODAwMAorbW5teDIyMiBtaW4gMSAtMTIzNDU2NzgwMDAgIC0+IC0xMjM0NTY3ODAwMAorbW5teDIyMyBtaW4gLTEyMzQ1Njc4MDAgIDEgIC0+IC0xMjM0NTY3ODAwCittbm14MjI0IG1pbiAxIC0xMjM0NTY3ODAwICAgLT4gLTEyMzQ1Njc4MDAKK21ubXgyMjUgbWluIC0xMjM0NTY3ODkwICAxICAtPiAtMTIzNDU2Nzg5MAorbW5teDIyNiBtaW4gMSAtMTIzNDU2Nzg5MCAgIC0+IC0xMjM0NTY3ODkwCittbm14MjI3IG1pbiAtMTIzNDU2Nzg5MSAgMSAgLT4gLTEyMzQ1Njc4OTEKK21ubXgyMjggbWluIDEgLTEyMzQ1Njc4OTEgICAtPiAtMTIzNDU2Nzg5MQorbW5teDIyOSBtaW4gLTEyMzQ1Njc4OTAxIDEgIC0+IC0xMjM0NTY3ODkwMQorbW5teDIzMCBtaW4gMSAtMTIzNDU2Nzg5MDEgIC0+IC0xMjM0NTY3ODkwMQorbW5teDIzMSBtaW4gLTEyMzQ1Njc4OTYgIDEgIC0+IC0xMjM0NTY3ODk2Cittbm14MjMyIG1pbiAxIC0xMjM0NTY3ODk2ICAgLT4gLTEyMzQ1Njc4OTYKK21ubXgyMzMgbWluIDEyMzQ1Njc4OTEgIDEgICAtPiAxCittbm14MjM0IG1pbiAxIDEyMzQ1Njc4OTEgICAgLT4gMQorbW5teDIzNSBtaW4gMTIzNDU2Nzg5MDEgMSAgIC0+IDEKK21ubXgyMzYgbWluIDEgMTIzNDU2Nzg5MDEgICAtPiAxCittbm14MjM3IG1pbiAxMjM0NTY3ODk2ICAxICAgLT4gMQorbW5teDIzOCBtaW4gMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gZnJvbSBleGFtcGxlcworbW5teDI4MCBtaW4gJzMnICAgJzInICAtPiAgJzInCittbm14MjgxIG1pbiAnLTEwJyAnMycgIC0+ICAnLTEwJworbW5teDI4MiBtaW4gJzEuMCcgJzEnICAtPiAgJzEuMCcKK21ubXgyODMgbWluICcxJyAnMS4wJyAgLT4gICcxLjAnCittbm14Mjg0IG1pbiAnNycgJ05hTicgIC0+ICAnNycKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyAuLiBzdWJub3JtYWwgcmVzdWx0cyBbaW5wdXRzXSBub3cgYWxsb3dlZAorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK21ubXgzMzAgbWluIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIC05RSs5OTk5OTk5OTkgLT4gLTlFKzk5OTk5OTk5OQorbW5teDMzMSBtaW4gLTlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAtOUUrOTk5OTk5OTk5Cittbm14MzMyIG1pbiAtMC4xMDAgLTlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IC0wLjEwMAorbW5teDMzMyBtaW4gLTlFLTk5OTk5OTk5OSAtMC4xMDAgICAgICAgICAgICAgICAtPiAtMC4xMDAKK21ubXgzMzUgbWluICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC05RSs5OTk5OTk5OTkgLT4gLTlFKzk5OTk5OTk5OQorbW5teDMzNiBtaW4gLTlFKzk5OTk5OTk5OSAxLjIzNDU2Nzg5MDEyMzQ1RS0wICAtPiAtOUUrOTk5OTk5OTk5Cittbm14MzM3IG1pbiArMC4xMDAgLTlFLTk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IC05RS05OTk5OTk5OTkKK21ubXgzMzggbWluIC05RS05OTk5OTk5OTkgMC4xMDAgICAgICAgICAgICAgICAgLT4gLTlFLTk5OTk5OTk5OQorCittbm14MzM5IG1pbiAtMWUtNTk5OTk5OTk5IC0xZS00MDAwMDAwMDEgICAtPiAgLTFFLTQwMDAwMDAwMQorbW5teDM0MCBtaW4gLTFlLTU5OTk5OTk5OSAtMWUtNDAwMDAwMDAwICAgLT4gIC0xRS00MDAwMDAwMDAKK21ubXgzNDEgbWluIC0xZS02MDAwMDAwMDAgLTFlLTQwMDAwMDAwMCAgIC0+ICAtMUUtNDAwMDAwMDAwCittbm14MzQyIG1pbiAtOWUtOTk5OTk5OTk4IC0wLjAxICAgICAgICAgICAtPiAgLTAuMDEKK21ubXgzNDMgbWluIC05ZS05OTk5OTk5OTggLTAuMSAgICAgICAgICAgIC0+ICAtMC4xCittbm14MzQ0IG1pbiAtMC4wMSAgICAgICAgIC05ZS05OTk5OTk5OTggICAtPiAgLTAuMDEKK21ubXgzNDUgbWluIC0xZTU5OTk5OTk5OSAgLTFlNDAwMDAwMDAxICAgIC0+ICAtMUUrNTk5OTk5OTk5Cittbm14MzQ2IG1pbiAtMWU1OTk5OTk5OTkgIC0xZTQwMDAwMDAwMCAgICAtPiAgLTFFKzU5OTk5OTk5OQorbW5teDM0NyBtaW4gLTFlNjAwMDAwMDAwICAtMWU0MDAwMDAwMDAgICAgLT4gIC0xRSs2MDAwMDAwMDAKK21ubXgzNDggbWluIC05ZTk5OTk5OTk5OCAgLTEwMCAgICAgICAgICAgIC0+ICAtOUUrOTk5OTk5OTk4Cittbm14MzQ5IG1pbiAtOWU5OTk5OTk5OTggIC0xMCAgICAgICAgICAgICAtPiAgLTlFKzk5OTk5OTk5OAorbW5teDM1MCBtaW4gLTEwMCAgICAgICAgICAtOWU5OTk5OTk5OTggICAgLT4gIC05RSs5OTk5OTk5OTgKKy0tIHNpZ25zCittbm14MzUxIG1pbiAtMWUrNzc3Nzc3Nzc3IC0xZSs0MTExMTExMTEgLT4gLTFFKzc3Nzc3Nzc3NworbW5teDM1MiBtaW4gLTFlKzc3Nzc3Nzc3NyArMWUrNDExMTExMTExIC0+IC0xRSs3Nzc3Nzc3NzcKK21ubXgzNTMgbWluICsxZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAtMUUrNDExMTExMTExCittbm14MzU0IG1pbiArMWUrNzc3Nzc3Nzc3ICsxZSs0MTExMTExMTEgLT4gIDFFKzQxMTExMTExMQorbW5teDM1NSBtaW4gLTFlLTc3Nzc3Nzc3NyAtMWUtNDExMTExMTExIC0+IC0xRS00MTExMTExMTEKK21ubXgzNTYgbWluIC0xZS03Nzc3Nzc3NzcgKzFlLTQxMTExMTExMSAtPiAtMUUtNzc3Nzc3Nzc3Cittbm14MzU3IG1pbiArMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gLTFFLTQxMTExMTExMQorbW5teDM1OCBtaW4gKzFlLTc3Nzc3Nzc3NyArMWUtNDExMTExMTExIC0+ICAxRS03Nzc3Nzc3NzcKKworLS0gZXhwYW5kZWQgbGlzdCBmcm9tIG1pbi9tYXggNzU0ciBwdXJwbGUgcHJvc2UKKy0tIFtleHBsaWNpdCB0ZXN0cyBmb3IgZXhwb25lbnQgb3JkZXJpbmddCittbm14NDAxIG1pbiAgSW5mICAgIDEuMSAgICAgLT4gIDEuMQorbW5teDQwMiBtaW4gIDEuMSAgICAxICAgICAgIC0+ICAxCittbm14NDAzIG1pbiAgMSAgICAgIDEuMCAgICAgLT4gIDEuMAorbW5teDQwNCBtaW4gIDEuMCAgICAwLjEgICAgIC0+ICAwLjEKK21ubXg0MDUgbWluICAwLjEgICAgMC4xMCAgICAtPiAgMC4xMAorbW5teDQwNiBtaW4gIDAuMTAgICAwLjEwMCAgIC0+ICAwLjEwMAorbW5teDQwNyBtaW4gIDAuMTAgICAwICAgICAgIC0+ICAwCittbm14NDA4IG1pbiAgMCAgICAgIDAuMCAgICAgLT4gIDAuMAorbW5teDQwOSBtaW4gIDAuMCAgIC0wICAgICAgIC0+IC0wCittbm14NDEwIG1pbiAgMC4wICAgLTAuMCAgICAgLT4gLTAuMAorbW5teDQxMSBtaW4gIDAuMDAgIC0wLjAgICAgIC0+IC0wLjAKK21ubXg0MTIgbWluICAwLjAgICAtMC4wMCAgICAtPiAtMC4wMAorbW5teDQxMyBtaW4gIDAgICAgIC0wLjAgICAgIC0+IC0wLjAKK21ubXg0MTQgbWluICAwICAgICAtMCAgICAgICAtPiAtMAorbW5teDQxNSBtaW4gLTAuMCAgIC0wICAgICAgIC0+IC0wCittbm14NDE2IG1pbiAtMCAgICAgLTAuMTAwICAgLT4gLTAuMTAwCittbm14NDE3IG1pbiAtMC4xMDAgLTAuMTAgICAgLT4gLTAuMTAKK21ubXg0MTggbWluIC0wLjEwICAtMC4xICAgICAtPiAtMC4xCittbm14NDE5IG1pbiAtMC4xICAgLTEuMCAgICAgLT4gLTEuMAorbW5teDQyMCBtaW4gLTEuMCAgIC0xICAgICAgIC0+IC0xCittbm14NDIxIG1pbiAtMSAgICAgLTEuMSAgICAgLT4gLTEuMQorbW5teDQyMyBtaW4gLTEuMSAgIC1JbmYgICAgIC0+IC1JbmZpbml0eQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCittbm14NDMxIG1pbiAgMS4xICAgIEluZiAgICAgLT4gIDEuMQorbW5teDQzMiBtaW4gIDEgICAgICAxLjEgICAgIC0+ICAxCittbm14NDMzIG1pbiAgMS4wICAgIDEgICAgICAgLT4gIDEuMAorbW5teDQzNCBtaW4gIDAuMSAgICAxLjAgICAgIC0+ICAwLjEKK21ubXg0MzUgbWluICAwLjEwICAgMC4xICAgICAtPiAgMC4xMAorbW5teDQzNiBtaW4gIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwMAorbW5teDQzNyBtaW4gIDAgICAgICAwLjEwICAgIC0+ICAwCittbm14NDM4IG1pbiAgMC4wICAgIDAgICAgICAgLT4gIDAuMAorbW5teDQzOSBtaW4gLTAgICAgICAwLjAgICAgIC0+IC0wCittbm14NDQwIG1pbiAtMC4wICAgIDAuMCAgICAgLT4gLTAuMAorbW5teDQ0MSBtaW4gLTAuMCAgICAwLjAwICAgIC0+IC0wLjAKK21ubXg0NDIgbWluIC0wLjAwICAgMC4wICAgICAtPiAtMC4wMAorbW5teDQ0MyBtaW4gLTAuMCAgICAwICAgICAgIC0+IC0wLjAKK21ubXg0NDQgbWluIC0wICAgICAgMCAgICAgICAtPiAtMAorbW5teDQ0NSBtaW4gLTAgICAgIC0wLjAgICAgIC0+IC0wCittbm14NDQ2IG1pbiAtMC4xMDAgLTAgICAgICAgLT4gLTAuMTAwCittbm14NDQ3IG1pbiAtMC4xMCAgLTAuMTAwICAgLT4gLTAuMTAKK21ubXg0NDggbWluIC0wLjEgICAtMC4xMCAgICAtPiAtMC4xCittbm14NDQ5IG1pbiAtMS4wICAgLTAuMSAgICAgLT4gLTEuMAorbW5teDQ1MCBtaW4gLTEgICAgIC0xLjAgICAgIC0+IC0xCittbm14NDUxIG1pbiAtMS4xICAgLTEgICAgICAgLT4gLTEuMQorbW5teDQ1MyBtaW4gLUluZiAgIC0xLjEgICAgIC0+IC1JbmZpbml0eQorLS0gbGFyZ2llcworbW5teDQ2MCBtaW4gIDEwMDAgICAxRSszICAgIC0+ICAxMDAwCittbm14NDYxIG1pbiAgMUUrMyAgIDEwMDAgICAgLT4gIDEwMDAKK21ubXg0NjIgbWluICAxMDAwICAtMUUrMyAgICAtPiAtMUUrMworbW5teDQ2MyBtaW4gIDFFKzMgIC0xMDAwICAgIC0+IC0xMDAwCittbm14NDY0IG1pbiAtMTAwMCAgIDFFKzMgICAgLT4gLTEwMDAKK21ubXg0NjUgbWluIC0xRSszICAgMTAwMCAgICAtPiAtMUUrMworbW5teDQ2NiBtaW4gLTEwMDAgIC0xRSszICAgIC0+IC0xRSszCittbm14NDY3IG1pbiAtMUUrMyAgLTEwMDAgICAgLT4gLTFFKzMKKworLS0gcm91bmRpbmcgKHJlc3VsdHMgdHJlYXRlZCBhcyB0aG91Z2ggcGx1cykKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDMKKworbW5teDQ3MCBtaW4gIDEgICAgICA1ICAgICAgLT4gIDEKK21ubXg0NzEgbWluICAxMCAgICAgNTAgICAgIC0+ICAxMAorbW5teDQ3MiBtaW4gIDEwMCAgICA1MDAgICAgLT4gIDEwMAorbW5teDQ3MyBtaW4gIDEwMDAgICA1MDAwICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbW5teDQ3NCBtaW4gIDEwMDAwICA1MDAwMCAgLT4gIDEuMDBFKzQgUm91bmRlZAorbW5teDQ3NSBtaW4gIDYgICAgICA1MCAgICAgLT4gIDYKK21ubXg0NzYgbWluICA2NiAgICAgNTAwICAgIC0+ICA2NgorbW5teDQ3NyBtaW4gIDY2NiAgICA1MDAwICAgLT4gIDY2NgorbW5teDQ3OCBtaW4gIDY2NjYgICA1MDAwMCAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0Cittbm14NDc5IG1pbiAgNjY2NjYgIDUwMDAwMCAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK21ubXg0ODAgbWluICAzMzMzMyAgNTAwMDAwIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorbW5teDQ4MSBtaW4gIDc1NDAxICAxICAgICAgLT4gIDEKK21ubXg0ODIgbWluICA3NTQwMiAgMTAgICAgIC0+ICAxMAorbW5teDQ4MyBtaW4gIDc1NDAzICAxMDAgICAgLT4gIDEwMAorbW5teDQ4NCBtaW4gIDc1NDA0ICAxMDAwICAgLT4gIDEuMDBFKzMgUm91bmRlZAorbW5teDQ4NSBtaW4gIDc1NDA1ICAxMDAwMCAgLT4gIDEuMDBFKzQgUm91bmRlZAorbW5teDQ4NiBtaW4gIDc1NDA2ICA2ICAgICAgLT4gIDYKK21ubXg0ODcgbWluICA3NTQwNyAgNjYgICAgIC0+ICA2NgorbW5teDQ4OCBtaW4gIDc1NDA4ICA2NjYgICAgLT4gIDY2NgorbW5teDQ4OSBtaW4gIDc1NDA5ICA2NjY2ICAgLT4gIDYuNjdFKzMgUm91bmRlZCBJbmV4YWN0Cittbm14NDkwIG1pbiAgNzU0MTAgIDY2NjY2ICAtPiAgNi42N0UrNCBSb3VuZGVkIEluZXhhY3QKK21ubXg0OTEgbWluICA3NTQxMSAgMzMzMzMgIC0+ICAzLjMzRSs0IFJvdW5kZWQgSW5leGFjdAorCisKKy0tIG92ZXJmbG93IHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCittbm14NTAwIG1pbiA5Ljk5OUUrOTk5OTk5OTk5ICAwIC0+ICAwCittbm14NTAxIG1pbiAtOS45OTlFKzk5OTk5OTk5OSAwIC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5Cittbm14NTEwIG1pbiAgMS4wMEUtOTk5ICAgICAgIDAgIC0+ICAgMAorbW5teDUxMSBtaW4gIDAuMUUtOTk5ICAgICAgICAwICAtPiAgIDAKK21ubXg1MTIgbWluICAwLjEwRS05OTkgICAgICAgMCAgLT4gICAwCittbm14NTEzIG1pbiAgMC4xMDBFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5teDUxNCBtaW4gIDAuMDFFLTk5OSAgICAgICAwICAtPiAgIDAKK21ubXg1MTUgbWluICAwLjk5OUUtOTk5ICAgICAgMCAgLT4gICAwCittbm14NTE2IG1pbiAgMC4wOTlFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5teDUxNyBtaW4gIDAuMDA5RS05OTkgICAgICAwICAtPiAgIDAKK21ubXg1MTggbWluICAwLjAwMUUtOTk5ICAgICAgMCAgLT4gICAwCittbm14NTE5IG1pbiAgMC4wMDA5RS05OTkgICAgIDAgIC0+ICAgMAorbW5teDUyMCBtaW4gIDAuMDAwMUUtOTk5ICAgICAwICAtPiAgIDAKKworbW5teDUzMCBtaW4gLTEuMDBFLTk5OSAgICAgICAwICAtPiAgLTEuMDBFLTk5OQorbW5teDUzMSBtaW4gLTAuMUUtOTk5ICAgICAgICAwICAtPiAgLTFFLTEwMDAgICBTdWJub3JtYWwKK21ubXg1MzIgbWluIC0wLjEwRS05OTkgICAgICAgMCAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsCittbm14NTMzIG1pbiAtMC4xMDBFLTk5OSAgICAgIDAgIC0+ICAtMS4wRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCittbm14NTM0IG1pbiAtMC4wMUUtOTk5ICAgICAgIDAgIC0+ICAtMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIE5taW4KK21ubXg1MzUgbWluIC0wLjk5OUUtOTk5ICAgICAgMCAgLT4gIC0xLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK21ubXg1MzYgbWluIC0wLjA5OUUtOTk5ICAgICAgMCAgLT4gIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK21ubXg1MzcgbWluIC0wLjAwOUUtOTk5ICAgICAgMCAgLT4gIC0xRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK21ubXg1MzggbWluIC0wLjAwMUUtOTk5ICAgICAgMCAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorbW5teDUzOSBtaW4gLTAuMDAwOUUtOTk5ICAgICAwICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCittbm14NTQwIG1pbiAtMC4wMDAxRS05OTkgICAgIDAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworLS0gbWlzYWxpZ25tZW50IHRyYXBzIGZvciBsaXR0bGUtZW5kaWFuCitwcmVjaXNpb246IDkKK21ubXg1NTEgbWluICAgICAgMS4wICAgICAgIDAuMSAgLT4gMC4xCittbm14NTUyIG1pbiAgICAgIDAuMSAgICAgICAxLjAgIC0+IDAuMQorbW5teDU1MyBtaW4gICAgIDEwLjAgICAgICAgMC4xICAtPiAwLjEKK21ubXg1NTQgbWluICAgICAgMC4xICAgICAgMTAuMCAgLT4gMC4xCittbm14NTU1IG1pbiAgICAgIDEwMCAgICAgICAxLjAgIC0+IDEuMAorbW5teDU1NiBtaW4gICAgICAxLjAgICAgICAgMTAwICAtPiAxLjAKK21ubXg1NTcgbWluICAgICAxMDAwICAgICAgMTAuMCAgLT4gMTAuMAorbW5teDU1OCBtaW4gICAgIDEwLjAgICAgICAxMDAwICAtPiAxMC4wCittbm14NTU5IG1pbiAgICAxMDAwMCAgICAgMTAwLjAgIC0+IDEwMC4wCittbm14NTYwIG1pbiAgICAxMDAuMCAgICAgMTAwMDAgIC0+IDEwMC4wCittbm14NTYxIG1pbiAgIDEwMDAwMCAgICAxMDAwLjAgIC0+IDEwMDAuMAorbW5teDU2MiBtaW4gICAxMDAwLjAgICAgMTAwMDAwICAtPiAxMDAwLjAKK21ubXg1NjMgbWluICAxMDAwMDAwICAgMTAwMDAuMCAgLT4gMTAwMDAuMAorbW5teDU2NCBtaW4gIDEwMDAwLjAgICAxMDAwMDAwICAtPiAxMDAwMC4wCisKKy0tIE51bGwgdGVzdHMKK21ubTkwMCBtaW4gMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCittbm05MDEgbWluICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW5tYWcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWlubWFnLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFhYzM4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWlubWFnLmRlY1Rlc3QKQEAgLTAsMCArMSwzOTAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gbWlubWFnLmRlY1Rlc3QgLS0gZGVjaW1hbCBtaW5pbXVtIGJ5IG1hZ25pdHVkZSAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSB3ZSBhc3N1bWUgdGhhdCBiYXNlIGNvbXBhcmlzb24gaXMgdGVzdGVkIGluIGNvbXBhcmUuZGVjVGVzdCwgc28KKy0tIHRoZXNlIG1haW5seSBjb3ZlciBzcGVjaWFsIGNhc2VzIGFuZCByb3VuZGluZworCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBzYW5pdHkgY2hlY2tzCittbmd4MDAxIG1pbm1hZyAgLTIgIC0yICAtPiAtMgorbW5neDAwMiBtaW5tYWcgIC0yICAtMSAgLT4gLTEKK21uZ3gwMDMgbWlubWFnICAtMiAgIDAgIC0+ICAwCittbmd4MDA0IG1pbm1hZyAgLTIgICAxICAtPiAgMQorbW5neDAwNSBtaW5tYWcgIC0yICAgMiAgLT4gLTIKK21uZ3gwMDYgbWlubWFnICAtMSAgLTIgIC0+IC0xCittbmd4MDA3IG1pbm1hZyAgLTEgIC0xICAtPiAtMQorbW5neDAwOCBtaW5tYWcgIC0xICAgMCAgLT4gIDAKK21uZ3gwMDkgbWlubWFnICAtMSAgIDEgIC0+IC0xCittbmd4MDEwIG1pbm1hZyAgLTEgICAyICAtPiAtMQorbW5neDAxMSBtaW5tYWcgICAwICAtMiAgLT4gIDAKK21uZ3gwMTIgbWlubWFnICAgMCAgLTEgIC0+ICAwCittbmd4MDEzIG1pbm1hZyAgIDAgICAwICAtPiAgMAorbW5neDAxNCBtaW5tYWcgICAwICAgMSAgLT4gIDAKK21uZ3gwMTUgbWlubWFnICAgMCAgIDIgIC0+ICAwCittbmd4MDE2IG1pbm1hZyAgIDEgIC0yICAtPiAgMQorbW5neDAxNyBtaW5tYWcgICAxICAtMSAgLT4gLTEKK21uZ3gwMTggbWlubWFnICAgMSAgIDAgIC0+ICAwCittbmd4MDE5IG1pbm1hZyAgIDEgICAxICAtPiAgMQorbW5neDAyMCBtaW5tYWcgICAxICAgMiAgLT4gIDEKK21uZ3gwMjEgbWlubWFnICAgMiAgLTIgIC0+IC0yCittbmd4MDIyIG1pbm1hZyAgIDIgIC0xICAtPiAtMQorbW5neDAyMyBtaW5tYWcgICAyICAgMCAgLT4gIDAKK21uZ3gwMjUgbWlubWFnICAgMiAgIDEgIC0+ICAxCittbmd4MDI2IG1pbm1hZyAgIDIgICAyICAtPiAgMgorCistLSBleHRlbmRlZCB6ZXJvcworbW5neDAzMCBtaW5tYWcgICAwICAgICAwICAgLT4gIDAKK21uZ3gwMzEgbWlubWFnICAgMCAgICAtMCAgIC0+IC0wCittbmd4MDMyIG1pbm1hZyAgIDAgICAgLTAuMCAtPiAtMC4wCittbmd4MDMzIG1pbm1hZyAgIDAgICAgIDAuMCAtPiAgMC4wCittbmd4MDM0IG1pbm1hZyAgLTAgICAgIDAgICAtPiAtMAorbW5neDAzNSBtaW5tYWcgIC0wICAgIC0wICAgLT4gLTAKK21uZ3gwMzYgbWlubWFnICAtMCAgICAtMC4wIC0+IC0wCittbmd4MDM3IG1pbm1hZyAgLTAgICAgIDAuMCAtPiAtMAorbW5neDAzOCBtaW5tYWcgICAwLjAgICAwICAgLT4gIDAuMAorbW5neDAzOSBtaW5tYWcgICAwLjAgIC0wICAgLT4gLTAKK21uZ3gwNDAgbWlubWFnICAgMC4wICAtMC4wIC0+IC0wLjAKK21uZ3gwNDEgbWlubWFnICAgMC4wICAgMC4wIC0+ICAwLjAKK21uZ3gwNDIgbWlubWFnICAtMC4wICAgMCAgIC0+IC0wLjAKK21uZ3gwNDMgbWlubWFnICAtMC4wICAtMCAgIC0+IC0wCittbmd4MDQ0IG1pbm1hZyAgLTAuMCAgLTAuMCAtPiAtMC4wCittbmd4MDQ1IG1pbm1hZyAgLTAuMCAgIDAuMCAtPiAtMC4wCisKK21uZ3gwNDYgbWlubWFnICAgMEUxICAtMEUxIC0+IC0wRSsxCittbmd4MDQ3IG1pbm1hZyAgLTBFMSAgIDBFMiAtPiAtMEUrMQorbW5neDA0OCBtaW5tYWcgICAwRTIgICAwRTEgLT4gIDBFKzEKK21uZ3gwNDkgbWlubWFnICAgMEUxICAgMEUyIC0+ICAwRSsxCittbmd4MDUwIG1pbm1hZyAgLTBFMyAgLTBFMiAtPiAtMEUrMworbW5neDA1MSBtaW5tYWcgIC0wRTIgIC0wRTMgLT4gLTBFKzMKKworLS0gU3BlY2lhbHMKK3ByZWNpc2lvbjogOQorbW5neDA5MCBtaW5tYWcgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorbW5neDA5MSBtaW5tYWcgIEluZiAgLTEwMDAgIC0+IC0xMDAwCittbmd4MDkyIG1pbm1hZyAgSW5mICAtMSAgICAgLT4gLTEKK21uZ3gwOTMgbWlubWFnICBJbmYgIC0wICAgICAtPiAtMAorbW5neDA5NCBtaW5tYWcgIEluZiAgIDAgICAgIC0+ICAwCittbmd4MDk1IG1pbm1hZyAgSW5mICAgMSAgICAgLT4gIDEKK21uZ3gwOTYgbWlubWFnICBJbmYgICAxMDAwICAtPiAgMTAwMAorbW5neDA5NyBtaW5tYWcgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorbW5neDA5OCBtaW5tYWcgLTEwMDAgIEluZiAgIC0+IC0xMDAwCittbmd4MDk5IG1pbm1hZyAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5Cittbmd4MTAwIG1pbm1hZyAtMSAgICAgSW5mICAgLT4gLTEKK21uZ3gxMDEgbWlubWFnIC0wICAgICBJbmYgICAtPiAtMAorbW5neDEwMiBtaW5tYWcgIDAgICAgIEluZiAgIC0+ICAwCittbmd4MTAzIG1pbm1hZyAgMSAgICAgSW5mICAgLT4gIDEKK21uZ3gxMDQgbWlubWFnICAxMDAwICBJbmYgICAtPiAgMTAwMAorbW5neDEwNSBtaW5tYWcgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCittbmd4MTIwIG1pbm1hZyAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5Cittbmd4MTIxIG1pbm1hZyAtSW5mICAtMTAwMCAgLT4gLTEwMDAKK21uZ3gxMjIgbWlubWFnIC1JbmYgIC0xICAgICAtPiAtMQorbW5neDEyMyBtaW5tYWcgLUluZiAgLTAgICAgIC0+IC0wCittbmd4MTI0IG1pbm1hZyAtSW5mICAgMCAgICAgLT4gIDAKK21uZ3gxMjUgbWlubWFnIC1JbmYgICAxICAgICAtPiAgMQorbW5neDEyNiBtaW5tYWcgLUluZiAgIDEwMDAgIC0+ICAxMDAwCittbmd4MTI3IG1pbm1hZyAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5Cittbmd4MTI4IG1pbm1hZyAtSW5mICAtSW5mICAgLT4gLUluZmluaXR5Cittbmd4MTI5IG1pbm1hZyAtMTAwMCAtSW5mICAgLT4gLTEwMDAKK21uZ3gxMzAgbWlubWFnIC0xICAgIC1JbmYgICAtPiAtMQorbW5neDEzMSBtaW5tYWcgLTAgICAgLUluZiAgIC0+IC0wCittbmd4MTMyIG1pbm1hZyAgMCAgICAtSW5mICAgLT4gIDAKK21uZ3gxMzMgbWlubWFnICAxICAgIC1JbmYgICAtPiAgMQorbW5neDEzNCBtaW5tYWcgIDEwMDAgLUluZiAgIC0+ICAxMDAwCittbmd4MTM1IG1pbm1hZyAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CisKKy0tIDIwMDQuMDguMDIgNzU0ciBjaG9vc2VzIG51bWJlciBvdmVyIE5hTiBpbiBtaXhlZCBjYXNlcworbW5neDE0MSBtaW5tYWcgIE5hTiAtSW5mICAgIC0+ICAtSW5maW5pdHkKK21uZ3gxNDIgbWlubWFnICBOYU4gLTEwMDAgICAtPiAgLTEwMDAKK21uZ3gxNDMgbWlubWFnICBOYU4gLTEgICAgICAtPiAgLTEKK21uZ3gxNDQgbWlubWFnICBOYU4gLTAgICAgICAtPiAgLTAKK21uZ3gxNDUgbWlubWFnICBOYU4gIDAgICAgICAtPiAgMAorbW5neDE0NiBtaW5tYWcgIE5hTiAgMSAgICAgIC0+ICAxCittbmd4MTQ3IG1pbm1hZyAgTmFOICAxMDAwICAgLT4gIDEwMDAKK21uZ3gxNDggbWlubWFnICBOYU4gIEluZiAgICAtPiAgSW5maW5pdHkKK21uZ3gxNDkgbWlubWFnICBOYU4gIE5hTiAgICAtPiAgTmFOCittbmd4MTUwIG1pbm1hZyAtSW5mICBOYU4gICAgLT4gLUluZmluaXR5Cittbmd4MTUxIG1pbm1hZyAtMTAwMCBOYU4gICAgLT4gLTEwMDAKK21uZ3gxNTIgbWlubWFnIC0xICAgLU5hTiAgICAtPiAtMQorbW5neDE1MyBtaW5tYWcgLTAgICAgTmFOICAgIC0+IC0wCittbmd4MTU0IG1pbm1hZyAgMCAgIC1OYU4gICAgLT4gIDAKK21uZ3gxNTUgbWlubWFnICAxICAgIE5hTiAgICAtPiAgMQorbW5neDE1NiBtaW5tYWcgIDEwMDAgTmFOICAgIC0+ICAxMDAwCittbmd4MTU3IG1pbm1hZyAgSW5mICBOYU4gICAgLT4gIEluZmluaXR5CisKK21uZ3gxNjEgbWlubWFnICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE2MiBtaW5tYWcgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTYzIG1pbm1hZyAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNjQgbWlubWFnICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE2NSBtaW5tYWcgLXNOYU4gIDAgICAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTY2IG1pbm1hZyAtc05hTiAgMSAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNjcgbWlubWFnICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE2OCBtaW5tYWcgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTY5IG1pbm1hZyAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNzAgbWlubWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE3MSBtaW5tYWcgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTcyIG1pbm1hZyAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNzMgbWlubWFnIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE3NCBtaW5tYWcgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTc1IG1pbm1hZyAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNzYgbWlubWFnICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE3NyBtaW5tYWcgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittbmd4MTc4IG1pbm1hZyAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK21uZ3gxNzkgbWlubWFnICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCittbmd4MTgxIG1pbm1hZyAgTmFOOSAgIC1JbmYgICAtPiAtSW5maW5pdHkKK21uZ3gxODIgbWlubWFnIC1OYU44ICAgIDk5OTAgIC0+ICA5OTkwCittbmd4MTgzIG1pbm1hZyAgTmFONzEgICBJbmYgICAtPiAgSW5maW5pdHkKKworbW5neDE4NCBtaW5tYWcgIE5hTjEgICAgTmFONTQgLT4gIE5hTjEKK21uZ3gxODUgbWlubWFnICBOYU4yMiAgLU5hTjUzIC0+ICBOYU4yMgorbW5neDE4NiBtaW5tYWcgLU5hTjMgICAgTmFONiAgLT4gLU5hTjMKK21uZ3gxODcgbWlubWFnIC1OYU40NCAgIE5hTjcgIC0+IC1OYU40NAorCittbmd4MTg4IG1pbm1hZyAtSW5mICAgICBOYU40MSAtPiAtSW5maW5pdHkKK21uZ3gxODkgbWlubWFnIC05OTk5ICAgLU5hTjMzIC0+IC05OTk5Cittbmd4MTkwIG1pbm1hZyAgSW5mICAgICBOYU4yICAtPiAgSW5maW5pdHkKKworbW5neDE5MSBtaW5tYWcgIHNOYU45OSAtSW5mICAgIC0+ICBOYU45OSBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5MiBtaW5tYWcgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5MyBtaW5tYWcgLXNOYU45NyAgTmFOOCAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5NCBtaW5tYWcgIHNOYU42OSBzTmFOOTQgIC0+ICBOYU42OSBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5NSBtaW5tYWcgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5NiBtaW5tYWcgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5NyBtaW5tYWcgIDA4OCAgICBzTmFOOTEgIC0+ICBOYU45MSBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5OCBtaW5tYWcgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorbW5neDE5OSBtaW5tYWcgIE5hTiAgICBzTmFOODYgIC0+ICBOYU44NiBJbnZhbGlkX29wZXJhdGlvbgorCistLSByb3VuZGluZyBjaGVja3MgLS0gY2hvc2VuIGlzIHJvdW5kZWQsIG9yIG5vdAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorbW5neDIwMSBtaW5tYWcgLTEyMzQ1Njc4MDAwIDEgIC0+IDEKK21uZ3gyMDIgbWlubWFnIDEgLTEyMzQ1Njc4MDAwICAtPiAxCittbmd4MjAzIG1pbm1hZyAtMTIzNDU2NzgwMCAgMSAgLT4gMQorbW5neDIwNCBtaW5tYWcgMSAtMTIzNDU2NzgwMCAgIC0+IDEKK21uZ3gyMDUgbWlubWFnIC0xMjM0NTY3ODkwICAxICAtPiAxCittbmd4MjA2IG1pbm1hZyAxIC0xMjM0NTY3ODkwICAgLT4gMQorbW5neDIwNyBtaW5tYWcgLTEyMzQ1Njc4OTEgIDEgIC0+IDEKK21uZ3gyMDggbWlubWFnIDEgLTEyMzQ1Njc4OTEgICAtPiAxCittbmd4MjA5IG1pbm1hZyAtMTIzNDU2Nzg5MDEgMSAgLT4gMQorbW5neDIxMCBtaW5tYWcgMSAtMTIzNDU2Nzg5MDEgIC0+IDEKK21uZ3gyMTEgbWlubWFnIC0xMjM0NTY3ODk2ICAxICAtPiAxCittbmd4MjEyIG1pbm1hZyAxIC0xMjM0NTY3ODk2ICAgLT4gMQorbW5neDIxMyBtaW5tYWcgMTIzNDU2Nzg5MSAgMSAgIC0+IDEKK21uZ3gyMTQgbWlubWFnIDEgMTIzNDU2Nzg5MSAgICAtPiAxCittbmd4MjE1IG1pbm1hZyAxMjM0NTY3ODkwMSAxICAgLT4gMQorbW5neDIxNiBtaW5tYWcgMSAxMjM0NTY3ODkwMSAgIC0+IDEKK21uZ3gyMTcgbWlubWFnIDEyMzQ1Njc4OTYgIDEgICAtPiAxCittbmd4MjE4IG1pbm1hZyAxIDEyMzQ1Njc4OTYgICAgLT4gMQorCitwcmVjaXNpb246IDE1Cittbmd4MjIxIG1pbm1hZyAtMTIzNDU2NzgwMDAgMSAgLT4gMQorbW5neDIyMiBtaW5tYWcgMSAtMTIzNDU2NzgwMDAgIC0+IDEKK21uZ3gyMjMgbWlubWFnIC0xMjM0NTY3ODAwICAxICAtPiAxCittbmd4MjI0IG1pbm1hZyAxIC0xMjM0NTY3ODAwICAgLT4gMQorbW5neDIyNSBtaW5tYWcgLTEyMzQ1Njc4OTAgIDEgIC0+IDEKK21uZ3gyMjYgbWlubWFnIDEgLTEyMzQ1Njc4OTAgICAtPiAxCittbmd4MjI3IG1pbm1hZyAtMTIzNDU2Nzg5MSAgMSAgLT4gMQorbW5neDIyOCBtaW5tYWcgMSAtMTIzNDU2Nzg5MSAgIC0+IDEKK21uZ3gyMjkgbWlubWFnIC0xMjM0NTY3ODkwMSAxICAtPiAxCittbmd4MjMwIG1pbm1hZyAxIC0xMjM0NTY3ODkwMSAgLT4gMQorbW5neDIzMSBtaW5tYWcgLTEyMzQ1Njc4OTYgIDEgIC0+IDEKK21uZ3gyMzIgbWlubWFnIDEgLTEyMzQ1Njc4OTYgICAtPiAxCittbmd4MjMzIG1pbm1hZyAxMjM0NTY3ODkxICAxICAgLT4gMQorbW5neDIzNCBtaW5tYWcgMSAxMjM0NTY3ODkxICAgIC0+IDEKK21uZ3gyMzUgbWlubWFnIDEyMzQ1Njc4OTAxIDEgICAtPiAxCittbmd4MjM2IG1pbm1hZyAxIDEyMzQ1Njc4OTAxICAgLT4gMQorbW5neDIzNyBtaW5tYWcgMTIzNDU2Nzg5NiAgMSAgIC0+IDEKK21uZ3gyMzggbWlubWFnIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKKy0tIGZyb20gZXhhbXBsZXMKK21uZ3gyODAgbWlubWFnICczJyAgICcyJyAgLT4gICcyJworbW5neDI4MSBtaW5tYWcgJy0xMCcgJzMnICAtPiAgJzMnCittbmd4MjgyIG1pbm1hZyAnMS4wJyAnMScgIC0+ICAnMS4wJworbW5neDI4MyBtaW5tYWcgJzEnICcxLjAnICAtPiAgJzEuMCcKK21uZ3gyODQgbWlubWFnICc3JyAnTmFOJyAgLT4gICc3JworCistLSBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IHRlc3RzIC4uIHN1Ym5vcm1hbCByZXN1bHRzIFtpbnB1dHNdIG5vdyBhbGxvd2VkCittYXhFeHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorbW5neDMzMCBtaW5tYWcgLTEuMjM0NTY3ODkwMTIzNDVFLTAgLTlFKzk5OTk5OTk5OSAtPiAtMS4yMzQ1Njc4OTAxMjM0NQorbW5neDMzMSBtaW5tYWcgLTlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAtMS4yMzQ1Njc4OTAxMjM0NQorbW5neDMzMiBtaW5tYWcgLTAuMTAwIC05RS05OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAtOUUtOTk5OTk5OTk5Cittbmd4MzMzIG1pbm1hZyAtOUUtOTk5OTk5OTk5IC0wLjEwMCAgICAgICAgICAgICAgIC0+IC05RS05OTk5OTk5OTkKK21uZ3gzMzUgbWlubWFnICsxLjIzNDU2Nzg5MDEyMzQ1RS0wIC05RSs5OTk5OTk5OTkgLT4gIDEuMjM0NTY3ODkwMTIzNDUKK21uZ3gzMzYgbWlubWFnIC05RSs5OTk5OTk5OTkgMS4yMzQ1Njc4OTAxMjM0NUUtMCAgLT4gIDEuMjM0NTY3ODkwMTIzNDUKK21uZ3gzMzcgbWlubWFnICswLjEwMCAtOUUtOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gLTlFLTk5OTk5OTk5OQorbW5neDMzOCBtaW5tYWcgLTlFLTk5OTk5OTk5OSAwLjEwMCAgICAgICAgICAgICAgICAtPiAtOUUtOTk5OTk5OTk5CisKK21uZ3gzMzkgbWlubWFnIC0xZS01OTk5OTk5OTkgLTFlLTQwMDAwMDAwMSAgIC0+ICAtMUUtNTk5OTk5OTk5Cittbmd4MzQwIG1pbm1hZyAtMWUtNTk5OTk5OTk5IC0xZS00MDAwMDAwMDAgICAtPiAgLTFFLTU5OTk5OTk5OQorbW5neDM0MSBtaW5tYWcgLTFlLTYwMDAwMDAwMCAtMWUtNDAwMDAwMDAwICAgLT4gIC0xRS02MDAwMDAwMDAKK21uZ3gzNDIgbWlubWFnIC05ZS05OTk5OTk5OTggLTAuMDEgICAgICAgICAgIC0+ICAtOUUtOTk5OTk5OTk4Cittbmd4MzQzIG1pbm1hZyAtOWUtOTk5OTk5OTk4IC0wLjEgICAgICAgICAgICAtPiAgLTlFLTk5OTk5OTk5OAorbW5neDM0NCBtaW5tYWcgLTAuMDEgICAgICAgICAtOWUtOTk5OTk5OTk4ICAgLT4gIC05RS05OTk5OTk5OTgKK21uZ3gzNDUgbWlubWFnIC0xZTU5OTk5OTk5OSAgLTFlNDAwMDAwMDAxICAgIC0+ICAtMUUrNDAwMDAwMDAxCittbmd4MzQ2IG1pbm1hZyAtMWU1OTk5OTk5OTkgIC0xZTQwMDAwMDAwMCAgICAtPiAgLTFFKzQwMDAwMDAwMAorbW5neDM0NyBtaW5tYWcgLTFlNjAwMDAwMDAwICAtMWU0MDAwMDAwMDAgICAgLT4gIC0xRSs0MDAwMDAwMDAKK21uZ3gzNDggbWlubWFnIC05ZTk5OTk5OTk5OCAgLTEwMCAgICAgICAgICAgIC0+ICAtMTAwCittbmd4MzQ5IG1pbm1hZyAtOWU5OTk5OTk5OTggIC0xMCAgICAgICAgICAgICAtPiAgLTEwCittbmd4MzUwIG1pbm1hZyAtMTAwICAgICAgICAgIC05ZTk5OTk5OTk5OCAgICAtPiAgLTEwMAorLS0gc2lnbnMKK21uZ3gzNTEgbWlubWFnIC0xZSs3Nzc3Nzc3NzcgLTFlKzQxMTExMTExMSAtPiAtMUUrNDExMTExMTExCittbmd4MzUyIG1pbm1hZyAtMWUrNzc3Nzc3Nzc3ICsxZSs0MTExMTExMTEgLT4gIDFFKzQxMTExMTExMQorbW5neDM1MyBtaW5tYWcgKzFlKzc3Nzc3Nzc3NyAtMWUrNDExMTExMTExIC0+IC0xRSs0MTExMTExMTEKK21uZ3gzNTQgbWlubWFnICsxZSs3Nzc3Nzc3NzcgKzFlKzQxMTExMTExMSAtPiAgMUUrNDExMTExMTExCittbmd4MzU1IG1pbm1hZyAtMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gLTFFLTc3Nzc3Nzc3NworbW5neDM1NiBtaW5tYWcgLTFlLTc3Nzc3Nzc3NyArMWUtNDExMTExMTExIC0+IC0xRS03Nzc3Nzc3NzcKK21uZ3gzNTcgbWlubWFnICsxZS03Nzc3Nzc3NzcgLTFlLTQxMTExMTExMSAtPiAgMUUtNzc3Nzc3Nzc3Cittbmd4MzU4IG1pbm1hZyArMWUtNzc3Nzc3Nzc3ICsxZS00MTExMTExMTEgLT4gIDFFLTc3Nzc3Nzc3NworCistLSBleHBhbmRlZCBsaXN0IGZyb20gbWluL21heCA3NTRyIHB1cnBsZSBwcm9zZQorLS0gW2V4cGxpY2l0IHRlc3RzIGZvciBleHBvbmVudCBvcmRlcmluZ10KK21uZ3g0MDEgbWlubWFnICBJbmYgICAgMS4xICAgICAtPiAgMS4xCittbmd4NDAyIG1pbm1hZyAgMS4xICAgIDEgICAgICAgLT4gIDEKK21uZ3g0MDMgbWlubWFnICAxICAgICAgMS4wICAgICAtPiAgMS4wCittbmd4NDA0IG1pbm1hZyAgMS4wICAgIDAuMSAgICAgLT4gIDAuMQorbW5neDQwNSBtaW5tYWcgIDAuMSAgICAwLjEwICAgIC0+ICAwLjEwCittbmd4NDA2IG1pbm1hZyAgMC4xMCAgIDAuMTAwICAgLT4gIDAuMTAwCittbmd4NDA3IG1pbm1hZyAgMC4xMCAgIDAgICAgICAgLT4gIDAKK21uZ3g0MDggbWlubWFnICAwICAgICAgMC4wICAgICAtPiAgMC4wCittbmd4NDA5IG1pbm1hZyAgMC4wICAgLTAgICAgICAgLT4gLTAKK21uZ3g0MTAgbWlubWFnICAwLjAgICAtMC4wICAgICAtPiAtMC4wCittbmd4NDExIG1pbm1hZyAgMC4wMCAgLTAuMCAgICAgLT4gLTAuMAorbW5neDQxMiBtaW5tYWcgIDAuMCAgIC0wLjAwICAgIC0+IC0wLjAwCittbmd4NDEzIG1pbm1hZyAgMCAgICAgLTAuMCAgICAgLT4gLTAuMAorbW5neDQxNCBtaW5tYWcgIDAgICAgIC0wICAgICAgIC0+IC0wCittbmd4NDE1IG1pbm1hZyAtMC4wICAgLTAgICAgICAgLT4gLTAKK21uZ3g0MTYgbWlubWFnIC0wICAgICAtMC4xMDAgICAtPiAtMAorbW5neDQxNyBtaW5tYWcgLTAuMTAwIC0wLjEwICAgIC0+IC0wLjEwCittbmd4NDE4IG1pbm1hZyAtMC4xMCAgLTAuMSAgICAgLT4gLTAuMQorbW5neDQxOSBtaW5tYWcgLTAuMSAgIC0xLjAgICAgIC0+IC0wLjEKK21uZ3g0MjAgbWlubWFnIC0xLjAgICAtMSAgICAgICAtPiAtMQorbW5neDQyMSBtaW5tYWcgLTEgICAgIC0xLjEgICAgIC0+IC0xCittbmd4NDIzIG1pbm1hZyAtMS4xICAgLUluZiAgICAgLT4gLTEuMQorLS0gc2FtZSB3aXRoIG9wZXJhbmRzIHJldmVyc2VkCittbmd4NDMxIG1pbm1hZyAgMS4xICAgIEluZiAgICAgLT4gIDEuMQorbW5neDQzMiBtaW5tYWcgIDEgICAgICAxLjEgICAgIC0+ICAxCittbmd4NDMzIG1pbm1hZyAgMS4wICAgIDEgICAgICAgLT4gIDEuMAorbW5neDQzNCBtaW5tYWcgIDAuMSAgICAxLjAgICAgIC0+ICAwLjEKK21uZ3g0MzUgbWlubWFnICAwLjEwICAgMC4xICAgICAtPiAgMC4xMAorbW5neDQzNiBtaW5tYWcgIDAuMTAwICAwLjEwICAgIC0+ICAwLjEwMAorbW5neDQzNyBtaW5tYWcgIDAgICAgICAwLjEwICAgIC0+ICAwCittbmd4NDM4IG1pbm1hZyAgMC4wICAgIDAgICAgICAgLT4gIDAuMAorbW5neDQzOSBtaW5tYWcgLTAgICAgICAwLjAgICAgIC0+IC0wCittbmd4NDQwIG1pbm1hZyAtMC4wICAgIDAuMCAgICAgLT4gLTAuMAorbW5neDQ0MSBtaW5tYWcgLTAuMCAgICAwLjAwICAgIC0+IC0wLjAKK21uZ3g0NDIgbWlubWFnIC0wLjAwICAgMC4wICAgICAtPiAtMC4wMAorbW5neDQ0MyBtaW5tYWcgLTAuMCAgICAwICAgICAgIC0+IC0wLjAKK21uZ3g0NDQgbWlubWFnIC0wICAgICAgMCAgICAgICAtPiAtMAorbW5neDQ0NSBtaW5tYWcgLTAgICAgIC0wLjAgICAgIC0+IC0wCittbmd4NDQ2IG1pbm1hZyAtMC4xMDAgLTAgICAgICAgLT4gLTAKK21uZ3g0NDcgbWlubWFnIC0wLjEwICAtMC4xMDAgICAtPiAtMC4xMAorbW5neDQ0OCBtaW5tYWcgLTAuMSAgIC0wLjEwICAgIC0+IC0wLjEKK21uZ3g0NDkgbWlubWFnIC0xLjAgICAtMC4xICAgICAtPiAtMC4xCittbmd4NDUwIG1pbm1hZyAtMSAgICAgLTEuMCAgICAgLT4gLTEKK21uZ3g0NTEgbWlubWFnIC0xLjEgICAtMSAgICAgICAtPiAtMQorbW5neDQ1MyBtaW5tYWcgLUluZiAgIC0xLjEgICAgIC0+IC0xLjEKKy0tIGxhcmdpZXMKK21uZ3g0NjAgbWlubWFnICAxMDAwICAgMUUrMyAgICAtPiAgMTAwMAorbW5neDQ2MSBtaW5tYWcgIDFFKzMgICAxMDAwICAgIC0+ICAxMDAwCittbmd4NDYyIG1pbm1hZyAgMTAwMCAgLTFFKzMgICAgLT4gLTFFKzMKK21uZ3g0NjMgbWlubWFnICAxRSszICAtMTAwMCAgICAtPiAtMTAwMAorbW5neDQ2NCBtaW5tYWcgLTEwMDAgICAxRSszICAgIC0+IC0xMDAwCittbmd4NDY1IG1pbm1hZyAtMUUrMyAgIDEwMDAgICAgLT4gLTFFKzMKK21uZ3g0NjYgbWlubWFnIC0xMDAwICAtMUUrMyAgICAtPiAtMUUrMworbW5neDQ2NyBtaW5tYWcgLTFFKzMgIC0xMDAwICAgIC0+IC0xRSszCisKKy0tIHJvdW5kaW5nIChyZXN1bHRzIHRyZWF0ZWQgYXMgdGhvdWdoIHBsdXMpCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCisKK21uZ3g0NzAgbWlubWFnICAxICAgICAgNSAgICAgIC0+ICAxCittbmd4NDcxIG1pbm1hZyAgMTAgICAgIDUwICAgICAtPiAgMTAKK21uZ3g0NzIgbWlubWFnICAxMDAgICAgNTAwICAgIC0+ICAxMDAKK21uZ3g0NzMgbWlubWFnICAxMDAwICAgNTAwMCAgIC0+ICAxLjAwRSszIFJvdW5kZWQKK21uZ3g0NzQgbWlubWFnICAxMDAwMCAgNTAwMDAgIC0+ICAxLjAwRSs0IFJvdW5kZWQKK21uZ3g0NzUgbWlubWFnICA2ICAgICAgNTAgICAgIC0+ICA2Cittbmd4NDc2IG1pbm1hZyAgNjYgICAgIDUwMCAgICAtPiAgNjYKK21uZ3g0NzcgbWlubWFnICA2NjYgICAgNTAwMCAgIC0+ICA2NjYKK21uZ3g0NzggbWlubWFnICA2NjY2ICAgNTAwMDAgIC0+ICA2LjY3RSszIFJvdW5kZWQgSW5leGFjdAorbW5neDQ3OSBtaW5tYWcgIDY2NjY2ICA1MDAwMDAgLT4gIDYuNjdFKzQgUm91bmRlZCBJbmV4YWN0Cittbmd4NDgwIG1pbm1hZyAgMzMzMzMgIDUwMDAwMCAtPiAgMy4zM0UrNCBSb3VuZGVkIEluZXhhY3QKK21uZ3g0ODEgbWlubWFnICA3NTQwMSAgMSAgICAgIC0+ICAxCittbmd4NDgyIG1pbm1hZyAgNzU0MDIgIDEwICAgICAtPiAgMTAKK21uZ3g0ODMgbWlubWFnICA3NTQwMyAgMTAwICAgIC0+ICAxMDAKK21uZ3g0ODQgbWlubWFnICA3NTQwNCAgMTAwMCAgIC0+ICAxLjAwRSszIFJvdW5kZWQKK21uZ3g0ODUgbWlubWFnICA3NTQwNSAgMTAwMDAgIC0+ICAxLjAwRSs0IFJvdW5kZWQKK21uZ3g0ODYgbWlubWFnICA3NTQwNiAgNiAgICAgIC0+ICA2Cittbmd4NDg3IG1pbm1hZyAgNzU0MDcgIDY2ICAgICAtPiAgNjYKK21uZ3g0ODggbWlubWFnICA3NTQwOCAgNjY2ICAgIC0+ICA2NjYKK21uZ3g0ODkgbWlubWFnICA3NTQwOSAgNjY2NiAgIC0+ICA2LjY3RSszIFJvdW5kZWQgSW5leGFjdAorbW5neDQ5MCBtaW5tYWcgIDc1NDEwICA2NjY2NiAgLT4gIDYuNjdFKzQgUm91bmRlZCBJbmV4YWN0Cittbmd4NDkxIG1pbm1hZyAgNzU0MTEgIDMzMzMzICAtPiAgMy4zM0UrNCBSb3VuZGVkIEluZXhhY3QKKworCistLSBvdmVyZmxvdyB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworbW5neDUwMCBtaW5tYWcgOS45OTlFKzk5OTk5OTk5OSAgMCAtPiAgMAorbW5neDUwMSBtaW5tYWcgLTkuOTk5RSs5OTk5OTk5OTkgMCAtPiAgMAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK21uZ3g1MTAgbWlubWFnICAxLjAwRS05OTkgICAgICAgMCAgLT4gICAwCittbmd4NTExIG1pbm1hZyAgMC4xRS05OTkgICAgICAgIDAgIC0+ICAgMAorbW5neDUxMiBtaW5tYWcgIDAuMTBFLTk5OSAgICAgICAwICAtPiAgIDAKK21uZ3g1MTMgbWlubWFnICAwLjEwMEUtOTk5ICAgICAgMCAgLT4gICAwCittbmd4NTE0IG1pbm1hZyAgMC4wMUUtOTk5ICAgICAgIDAgIC0+ICAgMAorbW5neDUxNSBtaW5tYWcgIDAuOTk5RS05OTkgICAgICAwICAtPiAgIDAKK21uZ3g1MTYgbWlubWFnICAwLjA5OUUtOTk5ICAgICAgMCAgLT4gICAwCittbmd4NTE3IG1pbm1hZyAgMC4wMDlFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5neDUxOCBtaW5tYWcgIDAuMDAxRS05OTkgICAgICAwICAtPiAgIDAKK21uZ3g1MTkgbWlubWFnICAwLjAwMDlFLTk5OSAgICAgMCAgLT4gICAwCittbmd4NTIwIG1pbm1hZyAgMC4wMDAxRS05OTkgICAgIDAgIC0+ICAgMAorCittbmd4NTMwIG1pbm1hZyAtMS4wMEUtOTk5ICAgICAgIDAgIC0+ICAgMAorbW5neDUzMSBtaW5tYWcgLTAuMUUtOTk5ICAgICAgICAwICAtPiAgIDAKK21uZ3g1MzIgbWlubWFnIC0wLjEwRS05OTkgICAgICAgMCAgLT4gICAwCittbmd4NTMzIG1pbm1hZyAtMC4xMDBFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5neDUzNCBtaW5tYWcgLTAuMDFFLTk5OSAgICAgICAwICAtPiAgIDAKK21uZ3g1MzUgbWlubWFnIC0wLjk5OUUtOTk5ICAgICAgMCAgLT4gICAwCittbmd4NTM2IG1pbm1hZyAtMC4wOTlFLTk5OSAgICAgIDAgIC0+ICAgMAorbW5neDUzNyBtaW5tYWcgLTAuMDA5RS05OTkgICAgICAwICAtPiAgIDAKK21uZ3g1MzggbWlubWFnIC0wLjAwMUUtOTk5ICAgICAgMCAgLT4gICAwCittbmd4NTM5IG1pbm1hZyAtMC4wMDA5RS05OTkgICAgIDAgIC0+ICAgMAorbW5neDU0MCBtaW5tYWcgLTAuMDAwMUUtOTk5ICAgICAwICAtPiAgIDAKKworCistLSBOdWxsIHRlc3RzCittbmc5MDAgbWlubWFnIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorbW5nOTAxIG1pbm1hZyAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWludXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbWludXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc0OWMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9taW51cy5kZWNUZXN0CkBAIC0wLDAgKzEsMTgyIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIG1pbnVzLmRlY1Rlc3QgLS0gZGVjaW1hbCBuZWdhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgcHJpbWFyaWx5IHRlc3RzIHRoZSBleGlzdGVuY2Ugb2YgdGhlIG9wZXJhdG9yLgorLS0gU3VidHJhY3Rpb24sIHJvdW5kaW5nLCBhbmQgbW9yZSBvdmVyZmxvd3MgYXJlIHRlc3RlZCBlbHNld2hlcmUuCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK21pbngwMDEgbWludXMgJzEnICAgICAgLT4gJy0xJworbWlueDAwMiBtaW51cyAnLTEnICAgICAtPiAnMScKK21pbngwMDMgbWludXMgJzEuMDAnICAgLT4gJy0xLjAwJworbWlueDAwNCBtaW51cyAnLTEuMDAnICAtPiAnMS4wMCcKK21pbngwMDUgbWludXMgJzAnICAgICAgLT4gJzAnCittaW54MDA2IG1pbnVzICcwLjAwJyAgIC0+ICcwLjAwJworbWlueDAwNyBtaW51cyAnMDAuMCcgICAtPiAnMC4wJworbWlueDAwOCBtaW51cyAnMDAuMDAnICAtPiAnMC4wMCcKK21pbngwMDkgbWludXMgJzAwJyAgICAgLT4gJzAnCisKK21pbngwMTAgbWludXMgJy0yJyAgICAgLT4gJzInCittaW54MDExIG1pbnVzICcyJyAgICAgIC0+ICctMicKK21pbngwMTIgbWludXMgJy0yLjAwJyAgLT4gJzIuMDAnCittaW54MDEzIG1pbnVzICcyLjAwJyAgIC0+ICctMi4wMCcKK21pbngwMTQgbWludXMgJy0wJyAgICAgLT4gJzAnCittaW54MDE1IG1pbnVzICctMC4wMCcgIC0+ICcwLjAwJworbWlueDAxNiBtaW51cyAnLTAwLjAnICAtPiAnMC4wJworbWlueDAxNyBtaW51cyAnLTAwLjAwJyAtPiAnMC4wMCcKK21pbngwMTggbWludXMgJy0wMCcgICAgLT4gJzAnCisKKy0tICJsaHMiIHplcm9zIGluIHBsdXMgYW5kIG1pbnVzIGhhdmUgZXhwb25lbnQgPSBvcGVyYW5kCittaW54MDIwIG1pbnVzICctMEUzJyAgIC0+ICcwRSszJworbWlueDAyMSBtaW51cyAnLTBFMicgICAtPiAnMEUrMicKK21pbngwMjIgbWludXMgJy0wRTEnICAgLT4gJzBFKzEnCittaW54MDIzIG1pbnVzICctMEUwJyAgIC0+ICcwJworbWlueDAyNCBtaW51cyAnKzBFMCcgICAtPiAnMCcKK21pbngwMjUgbWludXMgJyswRTEnICAgLT4gJzBFKzEnCittaW54MDI2IG1pbnVzICcrMEUyJyAgIC0+ICcwRSsyJworbWlueDAyNyBtaW51cyAnKzBFMycgICAtPiAnMEUrMycKKworbWlueDAzMCBtaW51cyAnLTVFMycgICAtPiAnNUUrMycKK21pbngwMzEgbWludXMgJy01RTgnICAgLT4gJzVFKzgnCittaW54MDMyIG1pbnVzICctNUUxMycgIC0+ICc1RSsxMycKK21pbngwMzMgbWludXMgJy01RTE4JyAgLT4gJzVFKzE4JworbWlueDAzNCBtaW51cyAnKzVFMycgICAtPiAnLTVFKzMnCittaW54MDM1IG1pbnVzICcrNUU4JyAgIC0+ICctNUUrOCcKK21pbngwMzYgbWludXMgJys1RTEzJyAgLT4gJy01RSsxMycKK21pbngwMzcgbWludXMgJys1RTE4JyAgLT4gJy01RSsxOCcKKworbWlueDA1MCBtaW51cyAnLTIwMDAwMDAnIC0+ICcyMDAwMDAwJworbWlueDA1MSBtaW51cyAnMjAwMDAwMCcgIC0+ICctMjAwMDAwMCcKK3ByZWNpc2lvbjogNworbWlueDA1MiBtaW51cyAnLTIwMDAwMDAnIC0+ICcyMDAwMDAwJworbWlueDA1MyBtaW51cyAnMjAwMDAwMCcgIC0+ICctMjAwMDAwMCcKK3ByZWNpc2lvbjogNgorbWlueDA1NCBtaW51cyAnLTIwMDAwMDAnIC0+ICcyLjAwMDAwRSs2JyBSb3VuZGVkCittaW54MDU1IG1pbnVzICcyMDAwMDAwJyAgLT4gJy0yLjAwMDAwRSs2JyBSb3VuZGVkCitwcmVjaXNpb246IDMKK21pbngwNTYgbWludXMgJy0yMDAwMDAwJyAtPiAnMi4wMEUrNicgUm91bmRlZAorbWlueDA1NyBtaW51cyAnMjAwMDAwMCcgIC0+ICctMi4wMEUrNicgUm91bmRlZAorCistLSBtb3JlIGZpeGVkLCBwb3RlbnRpYWwgTEhTIHN3YXBzL292ZXJsYXlzIGlmIGRvbmUgYnkgMCBzdWJ0cmFjdCB4CitwcmVjaXNpb246IDkKK21pbngwNjAgbWludXMgJzU2MjY3RS0xMCcgICAtPiAnLTAuMDAwMDA1NjI2NycKK21pbngwNjEgbWludXMgJzU2MjY3RS01JyAgICAtPiAnLTAuNTYyNjcnCittaW54MDYyIG1pbnVzICc1NjI2N0UtMicgICAgLT4gJy01NjIuNjcnCittaW54MDYzIG1pbnVzICc1NjI2N0UtMScgICAgLT4gJy01NjI2LjcnCittaW54MDY1IG1pbnVzICc1NjI2N0UtMCcgICAgLT4gJy01NjI2NycKK21pbngwNjYgbWludXMgJzU2MjY3RSswJyAgICAtPiAnLTU2MjY3JworbWlueDA2NyBtaW51cyAnNTYyNjdFKzEnICAgIC0+ICctNS42MjY3RSs1JworbWlueDA2OCBtaW51cyAnNTYyNjdFKzInICAgIC0+ICctNS42MjY3RSs2JworbWlueDA2OSBtaW51cyAnNTYyNjdFKzMnICAgIC0+ICctNS42MjY3RSs3JworbWlueDA3MCBtaW51cyAnNTYyNjdFKzQnICAgIC0+ICctNS42MjY3RSs4JworbWlueDA3MSBtaW51cyAnNTYyNjdFKzUnICAgIC0+ICctNS42MjY3RSs5JworbWlueDA3MiBtaW51cyAnNTYyNjdFKzYnICAgIC0+ICctNS42MjY3RSsxMCcKK21pbngwODAgbWludXMgJy01NjI2N0UtMTAnICAtPiAnMC4wMDAwMDU2MjY3JworbWlueDA4MSBtaW51cyAnLTU2MjY3RS01JyAgIC0+ICcwLjU2MjY3JworbWlueDA4MiBtaW51cyAnLTU2MjY3RS0yJyAgIC0+ICc1NjIuNjcnCittaW54MDgzIG1pbnVzICctNTYyNjdFLTEnICAgLT4gJzU2MjYuNycKK21pbngwODUgbWludXMgJy01NjI2N0UtMCcgICAtPiAnNTYyNjcnCittaW54MDg2IG1pbnVzICctNTYyNjdFKzAnICAgLT4gJzU2MjY3JworbWlueDA4NyBtaW51cyAnLTU2MjY3RSsxJyAgIC0+ICc1LjYyNjdFKzUnCittaW54MDg4IG1pbnVzICctNTYyNjdFKzInICAgLT4gJzUuNjI2N0UrNicKK21pbngwODkgbWludXMgJy01NjI2N0UrMycgICAtPiAnNS42MjY3RSs3JworbWlueDA5MCBtaW51cyAnLTU2MjY3RSs0JyAgIC0+ICc1LjYyNjdFKzgnCittaW54MDkxIG1pbnVzICctNTYyNjdFKzUnICAgLT4gJzUuNjI2N0UrOScKK21pbngwOTIgbWludXMgJy01NjI2N0UrNicgICAtPiAnNS42MjY3RSsxMCcKKworCistLSBvdmVyZmxvdyB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworbWlueDEwMCBtaW51cyA5Ljk5OUUrOTk5OTk5OTk5ICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittaW54MTAxIG1pbnVzIC05Ljk5OUUrOTk5OTk5OTk5IC0+ICBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CittaW54MTEwIG1pbnVzICAxLjAwRS05OTkgICAgICAgIC0+ICAtMS4wMEUtOTk5CittaW54MTExIG1pbnVzICAwLjFFLTk5OSAgICAgICAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbAorbWlueDExMiBtaW51cyAgMC4xMEUtOTk5ICAgICAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwKK21pbngxMTMgbWludXMgIDAuMTAwRS05OTkgICAgICAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK21pbngxMTQgbWludXMgIDAuMDFFLTk5OSAgICAgICAgLT4gIC0xRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorbWlueDExNSBtaW51cyAgMC45OTlFLTk5OSAgICAgICAtPiAgLTEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWlueDExNiBtaW51cyAgMC4wOTlFLTk5OSAgICAgICAtPiAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWlueDExNyBtaW51cyAgMC4wMDlFLTk5OSAgICAgICAtPiAgLTFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWlueDExOCBtaW51cyAgMC4wMDFFLTk5OSAgICAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCittaW54MTE5IG1pbnVzICAwLjAwMDlFLTk5OSAgICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK21pbngxMjAgbWludXMgIDAuMDAwMUUtOTk5ICAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCittaW54MTMwIG1pbnVzIC0xLjAwRS05OTkgICAgICAgIC0+ICAgMS4wMEUtOTk5CittaW54MTMxIG1pbnVzIC0wLjFFLTk5OSAgICAgICAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorbWlueDEzMiBtaW51cyAtMC4xMEUtOTk5ICAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK21pbngxMzMgbWludXMgLTAuMTAwRS05OTkgICAgICAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK21pbngxMzQgbWludXMgLTAuMDFFLTk5OSAgICAgICAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorbWlueDEzNSBtaW51cyAtMC45OTlFLTk5OSAgICAgICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWlueDEzNiBtaW51cyAtMC4wOTlFLTk5OSAgICAgICAtPiAgIDEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWlueDEzNyBtaW51cyAtMC4wMDlFLTk5OSAgICAgICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbWlueDEzOCBtaW51cyAtMC4wMDFFLTk5OSAgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCittaW54MTM5IG1pbnVzIC0wLjAwMDlFLTk5OSAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK21pbngxNDAgbWludXMgLTAuMDAwMUUtOTk5ICAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCisKKy0tIGxvbmcgb3BlcmFuZCBjaGVja3MKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246IDkKK21pbngzMDEgbWludXMgMTIzNDU2NzgwMDAgIC0+IC0xLjIzNDU2NzgwRSsxMCBSb3VuZGVkCittaW54MzAyIG1pbnVzIDEyMzQ1Njc4MDAgICAtPiAtMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCittaW54MzAzIG1pbnVzIDEyMzQ1Njc4OTAgICAtPiAtMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCittaW54MzA0IG1pbnVzIDEyMzQ1Njc4OTEgICAtPiAtMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK21pbngzMDUgbWludXMgMTIzNDU2Nzg5MDEgIC0+IC0xLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK21pbngzMDYgbWludXMgMTIzNDU2Nzg5NiAgIC0+IC0xLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDE1CistLSBzdGlsbCBjaGVja2luZworbWlueDMyMSBtaW51cyAxMjM0NTY3ODAwMCAgLT4gLTEyMzQ1Njc4MDAwCittaW54MzIyIG1pbnVzIDEyMzQ1Njc4MDAgICAtPiAtMTIzNDU2NzgwMAorbWlueDMyMyBtaW51cyAxMjM0NTY3ODkwICAgLT4gLTEyMzQ1Njc4OTAKK21pbngzMjQgbWludXMgMTIzNDU2Nzg5MSAgIC0+IC0xMjM0NTY3ODkxCittaW54MzI1IG1pbnVzIDEyMzQ1Njc4OTAxICAtPiAtMTIzNDU2Nzg5MDEKK21pbngzMjYgbWludXMgMTIzNDU2Nzg5NiAgIC0+IC0xMjM0NTY3ODk2CisKKy0tIHNwZWNpYWxzCittaW54NDIwIG1pbnVzICdJbmYnICAgIC0+ICctSW5maW5pdHknCittaW54NDIxIG1pbnVzICctSW5mJyAgIC0+ICdJbmZpbml0eScKK21pbng0MjIgbWludXMgICBOYU4gICAgLT4gIE5hTgorbWlueDQyMyBtaW51cyAgc05hTiAgICAtPiAgTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCittaW54NDI0IG1pbnVzICAgTmFOMjU1IC0+ICBOYU4yNTUKK21pbng0MjUgbWludXMgIHNOYU4yNTYgLT4gIE5hTjI1NiBJbnZhbGlkX29wZXJhdGlvbgorbWlueDQyNiBtaW51cyAgLU5hTiAgICAtPiAtTmFOCittaW54NDI3IG1pbnVzIC1zTmFOICAgIC0+IC1OYU4gICAgSW52YWxpZF9vcGVyYXRpb24KK21pbng0MjggbWludXMgIC1OYU4yNTUgLT4gLU5hTjI1NQorbWlueDQyOSBtaW51cyAtc05hTjI1NiAtPiAtTmFOMjU2IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK21pbng5MDAgbWludXMgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbXVsdGlwbHkuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbXVsdGlwbHkuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTIzZDVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9tdWx0aXBseS5kZWNUZXN0CkBAIC0wLDAgKzEsNzMxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIG11bHRpcGx5LmRlY1Rlc3QgLS0gZGVjaW1hbCBtdWx0aXBsaWNhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gc2FuaXR5IGNoZWNrcyAoYXMgYmFzZSwgYWJvdmUpCittdWx4MDAwIG11bHRpcGx5IDIgICAgICAyIC0+IDQKK211bHgwMDEgbXVsdGlwbHkgMiAgICAgIDMgLT4gNgorbXVseDAwMiBtdWx0aXBseSA1ICAgICAgMSAtPiA1CittdWx4MDAzIG11bHRpcGx5IDUgICAgICAyIC0+IDEwCittdWx4MDA0IG11bHRpcGx5IDEuMjAgICAyIC0+IDIuNDAKK211bHgwMDUgbXVsdGlwbHkgMS4yMCAgIDAgLT4gMC4wMAorbXVseDAwNiBtdWx0aXBseSAxLjIwICAtMiAtPiAtMi40MAorbXVseDAwNyBtdWx0aXBseSAtMS4yMCAgMiAtPiAtMi40MAorbXVseDAwOCBtdWx0aXBseSAtMS4yMCAgMCAtPiAtMC4wMAorbXVseDAwOSBtdWx0aXBseSAtMS4yMCAtMiAtPiAyLjQwCittdWx4MDEwIG11bHRpcGx5IDUuMDkgNy4xIC0+IDM2LjEzOQorbXVseDAxMSBtdWx0aXBseSAyLjUgICAgNCAtPiAxMC4wCittdWx4MDEyIG11bHRpcGx5IDIuNTAgICA0IC0+IDEwLjAwCittdWx4MDEzIG11bHRpcGx5IDEuMjM0NTY3ODkgMS4wMDAwMDAwMCAtPiAxLjIzNDU2Nzg5IFJvdW5kZWQKK211bHgwMTQgbXVsdGlwbHkgOS45OTk5OTk5OTkgOS45OTk5OTk5OTkgLT4gMTAwLjAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK211bHgwMTUgbXVsdGlwbHkgMi41MCAgIDQgLT4gMTAuMDAKK3ByZWNpc2lvbjogNgorbXVseDAxNiBtdWx0aXBseSAyLjUwICAgNCAtPiAxMC4wMAorbXVseDAxNyBtdWx0aXBseSAgOS45OTk5OTk5OTkgIDkuOTk5OTk5OTk5IC0+ICAxMDAuMDAwIEluZXhhY3QgUm91bmRlZAorbXVseDAxOCBtdWx0aXBseSAgOS45OTk5OTk5OTkgLTkuOTk5OTk5OTk5IC0+IC0xMDAuMDAwIEluZXhhY3QgUm91bmRlZAorbXVseDAxOSBtdWx0aXBseSAtOS45OTk5OTk5OTkgIDkuOTk5OTk5OTk5IC0+IC0xMDAuMDAwIEluZXhhY3QgUm91bmRlZAorbXVseDAyMCBtdWx0aXBseSAtOS45OTk5OTk5OTkgLTkuOTk5OTk5OTk5IC0+ICAxMDAuMDAwIEluZXhhY3QgUm91bmRlZAorCistLSAxOTk5LjEyLjIxOiBuZXh0IG9uZSBpcyBhIGVkZ2UgY2FzZSBpZiBpbnRlcm1lZGlhdGUgbG9uZ3MgYXJlIHVzZWQKK3ByZWNpc2lvbjogMTUKK211bHgwNTkgbXVsdGlwbHkgOTk5OTk5OTk5OTk5IDk3NjU2MjUgLT4gOS43NjU2MjQ5OTk5OTAyM0UrMTggSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMwCittdWx4MTYwIG11bHRpcGx5IDk5OTk5OTk5OTk5OSA5NzY1NjI1IC0+IDk3NjU2MjQ5OTk5OTAyMzQzNzUKK3ByZWNpc2lvbjogOQorLS0tLS0KKworLS0gemVyb3MsIGV0Yy4KK211bHgwMjEgbXVsdGlwbHkgIDAgICAgICAwICAgICAtPiAgMAorbXVseDAyMiBtdWx0aXBseSAgMCAgICAgLTAgICAgIC0+IC0wCittdWx4MDIzIG11bHRpcGx5IC0wICAgICAgMCAgICAgLT4gLTAKK211bHgwMjQgbXVsdGlwbHkgLTAgICAgIC0wICAgICAtPiAgMAorbXVseDAyNSBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCittdWx4MDI2IG11bHRpcGx5IC0wLjAgICAtMC4wICAgLT4gIDAuMDAKK211bHgwMjcgbXVsdGlwbHkgLTAuMCAgIC0wLjAgICAtPiAgMC4wMAorbXVseDAyOCBtdWx0aXBseSAtMC4wICAgLTAuMCAgIC0+ICAwLjAwCittdWx4MDMwIG11bHRpcGx5ICA1LjAwICAgMUUtMyAgLT4gIDAuMDA1MDAKK211bHgwMzEgbXVsdGlwbHkgIDAwLjAwICAwLjAwMCAtPiAgMC4wMDAwMAorbXVseDAzMiBtdWx0aXBseSAgMDAuMDAgIDBFLTMgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorbXVseDAzMyBtdWx0aXBseSAgMEUtMyAgIDAwLjAwIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorbXVseDAzNCBtdWx0aXBseSAtNS4wMCAgIDFFLTMgIC0+IC0wLjAwNTAwCittdWx4MDM1IG11bHRpcGx5IC0wMC4wMCAgMC4wMDAgLT4gLTAuMDAwMDAKK211bHgwMzYgbXVsdGlwbHkgLTAwLjAwICAwRS0zICAtPiAtMC4wMDAwMCAgICAgLS0gcmhzIGlzIDAKK211bHgwMzcgbXVsdGlwbHkgLTBFLTMgICAwMC4wMCAtPiAtMC4wMDAwMCAgICAgLS0gbGhzIGlzIDAKK211bHgwMzggbXVsdGlwbHkgIDUuMDAgIC0xRS0zICAtPiAtMC4wMDUwMAorbXVseDAzOSBtdWx0aXBseSAgMDAuMDAgLTAuMDAwIC0+IC0wLjAwMDAwCittdWx4MDQwIG11bHRpcGx5ICAwMC4wMCAtMEUtMyAgLT4gLTAuMDAwMDAgICAgIC0tIHJocyBpcyAwCittdWx4MDQxIG11bHRpcGx5ICAwRS0zICAtMDAuMDAgLT4gLTAuMDAwMDAgICAgIC0tIGxocyBpcyAwCittdWx4MDQyIG11bHRpcGx5IC01LjAwICAtMUUtMyAgLT4gIDAuMDA1MDAKK211bHgwNDMgbXVsdGlwbHkgLTAwLjAwIC0wLjAwMCAtPiAgMC4wMDAwMAorbXVseDA0NCBtdWx0aXBseSAtMDAuMDAgLTBFLTMgIC0+ICAwLjAwMDAwICAgICAtLSByaHMgaXMgMAorbXVseDA0NSBtdWx0aXBseSAtMEUtMyAgLTAwLjAwIC0+ICAwLjAwMDAwICAgICAtLSBsaHMgaXMgMAorCistLSBleGFtcGxlcyBmcm9tIGRlY2FyaXRoCittdWx4MDUwIG11bHRpcGx5IDEuMjAgMyAgICAgICAgLT4gMy42MAorbXVseDA1MSBtdWx0aXBseSA3ICAgIDMgICAgICAgIC0+IDIxCittdWx4MDUyIG11bHRpcGx5IDAuOSAgMC44ICAgICAgLT4gMC43MgorbXVseDA1MyBtdWx0aXBseSAwLjkgIC0wICAgICAgIC0+IC0wLjAKK211bHgwNTQgbXVsdGlwbHkgNjU0MzIxIDY1NDMyMSAtPiA0LjI4MTM1OTcxRSsxMSAgSW5leGFjdCBSb3VuZGVkCisKK211bHgwNjAgbXVsdGlwbHkgMTIzLjQ1IDFlNyAgLT4gIDEuMjM0NUUrOQorbXVseDA2MSBtdWx0aXBseSAxMjMuNDUgMWU4ICAtPiAgMS4yMzQ1RSsxMAorbXVseDA2MiBtdWx0aXBseSAxMjMuNDUgMWUrOSAtPiAgMS4yMzQ1RSsxMQorbXVseDA2MyBtdWx0aXBseSAxMjMuNDUgMWUxMCAtPiAgMS4yMzQ1RSsxMgorbXVseDA2NCBtdWx0aXBseSAxMjMuNDUgMWUxMSAtPiAgMS4yMzQ1RSsxMworbXVseDA2NSBtdWx0aXBseSAxMjMuNDUgMWUxMiAtPiAgMS4yMzQ1RSsxNAorbXVseDA2NiBtdWx0aXBseSAxMjMuNDUgMWUxMyAtPiAgMS4yMzQ1RSsxNQorCisKKy0tIHRlc3Qgc29tZSBpbnRlcm1lZGlhdGUgbGVuZ3RocworcHJlY2lzaW9uOiA5CittdWx4MDgwIG11bHRpcGx5IDAuMSAxMjM0NTY3ODkgICAgICAgICAgLT4gMTIzNDU2NzguOQorbXVseDA4MSBtdWx0aXBseSAwLjEgMTIzNDU2Nzg5MSAgICAgICAgIC0+IDEyMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK211bHgwODIgbXVsdGlwbHkgMC4xIDEyMzQ1Njc4OTEyICAgICAgICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorbXVseDA4MyBtdWx0aXBseSAwLjEgMTIzNDU2Nzg5MTIzNDUgICAgIC0+IDEuMjM0NTY3ODlFKzEyIEluZXhhY3QgUm91bmRlZAorbXVseDA4NCBtdWx0aXBseSAwLjEgMTIzNDU2Nzg5ICAgICAgICAgIC0+IDEyMzQ1Njc4LjkKK3ByZWNpc2lvbjogOAorbXVseDA4NSBtdWx0aXBseSAwLjEgMTIzNDU2Nzg5MTIgICAgICAgIC0+IDEuMjM0NTY3OUUrOSBJbmV4YWN0IFJvdW5kZWQKK211bHgwODYgbXVsdGlwbHkgMC4xIDEyMzQ1Njc4OTEyMzQ1ICAgICAtPiAxLjIzNDU2NzlFKzEyIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA3CittdWx4MDg3IG11bHRpcGx5IDAuMSAxMjM0NTY3ODkxMiAgICAgICAgLT4gMS4yMzQ1NjhFKzkgSW5leGFjdCBSb3VuZGVkCittdWx4MDg4IG11bHRpcGx5IDAuMSAxMjM0NTY3ODkxMjM0NSAgICAgLT4gMS4yMzQ1NjhFKzEyIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDkKK211bHgwOTAgbXVsdGlwbHkgMTIzNDU2Nzg5ICAgICAgICAgIDAuMSAtPiAxMjM0NTY3OC45CittdWx4MDkxIG11bHRpcGx5IDEyMzQ1Njc4OTEgICAgICAgICAwLjEgLT4gMTIzNDU2Nzg5IEluZXhhY3QgUm91bmRlZAorbXVseDA5MiBtdWx0aXBseSAxMjM0NTY3ODkxMiAgICAgICAgMC4xIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCittdWx4MDkzIG11bHRpcGx5IDEyMzQ1Njc4OTEyMzQ1ICAgICAwLjEgLT4gMS4yMzQ1Njc4OUUrMTIgSW5leGFjdCBSb3VuZGVkCittdWx4MDk0IG11bHRpcGx5IDEyMzQ1Njc4OSAgICAgICAgICAwLjEgLT4gMTIzNDU2NzguOQorcHJlY2lzaW9uOiA4CittdWx4MDk1IG11bHRpcGx5IDEyMzQ1Njc4OTEyICAgICAgICAwLjEgLT4gMS4yMzQ1Njc5RSs5IEluZXhhY3QgUm91bmRlZAorbXVseDA5NiBtdWx0aXBseSAxMjM0NTY3ODkxMjM0NSAgICAgMC4xIC0+IDEuMjM0NTY3OUUrMTIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDcKK211bHgwOTcgbXVsdGlwbHkgMTIzNDU2Nzg5MTIgICAgICAgIDAuMSAtPiAxLjIzNDU2OEUrOSBJbmV4YWN0IFJvdW5kZWQKK211bHgwOTggbXVsdGlwbHkgMTIzNDU2Nzg5MTIzNDUgICAgIDAuMSAtPiAxLjIzNDU2OEUrMTIgSW5leGFjdCBSb3VuZGVkCisKKy0tIHRlc3Qgc29tZSBtb3JlIGVkZ2UgY2FzZXMgYW5kIGNhcnJpZXMKK21heGV4cG9uZW50OiA5OTk5CittaW5leHBvbmVudDogLTk5OTkKK3ByZWNpc2lvbjogMzMKK211bHgxMDEgbXVsdGlwbHkgOSA5ICAgLT4gODEKK211bHgxMDIgbXVsdGlwbHkgOSA5MCAgIC0+IDgxMAorbXVseDEwMyBtdWx0aXBseSA5IDkwMCAgIC0+IDgxMDAKK211bHgxMDQgbXVsdGlwbHkgOSA5MDAwICAgLT4gODEwMDAKK211bHgxMDUgbXVsdGlwbHkgOSA5MDAwMCAgIC0+IDgxMDAwMAorbXVseDEwNiBtdWx0aXBseSA5IDkwMDAwMCAgIC0+IDgxMDAwMDAKK211bHgxMDcgbXVsdGlwbHkgOSA5MDAwMDAwICAgLT4gODEwMDAwMDAKK211bHgxMDggbXVsdGlwbHkgOSA5MDAwMDAwMCAgIC0+IDgxMDAwMDAwMAorbXVseDEwOSBtdWx0aXBseSA5IDkwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAKK211bHgxMTAgbXVsdGlwbHkgOSA5MDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAKK211bHgxMTEgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMAorbXVseDExMiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAKK211bHgxMTMgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAKK211bHgxMTQgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMAorbXVseDExNSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAKK211bHgxMTYgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAKK211bHgxMTcgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMAorbXVseDExOCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAKK211bHgxMTkgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAKK211bHgxMjAgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDEyMSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAKK211bHgxMjIgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gODEwMDAwMDAwMDAwMDAwMDAwMDAwMDAKK211bHgxMjMgbXVsdGlwbHkgOSA5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDgxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAorLS0gdGVzdCBzb21lIG1vcmUgZWRnZSBjYXNlcyB3aXRob3V0IGNhcnJpZXMKK211bHgxMzEgbXVsdGlwbHkgMyAzICAgLT4gOQorbXVseDEzMiBtdWx0aXBseSAzIDMwICAgLT4gOTAKK211bHgxMzMgbXVsdGlwbHkgMyAzMDAgICAtPiA5MDAKK211bHgxMzQgbXVsdGlwbHkgMyAzMDAwICAgLT4gOTAwMAorbXVseDEzNSBtdWx0aXBseSAzIDMwMDAwICAgLT4gOTAwMDAKK211bHgxMzYgbXVsdGlwbHkgMyAzMDAwMDAgICAtPiA5MDAwMDAKK211bHgxMzcgbXVsdGlwbHkgMyAzMDAwMDAwICAgLT4gOTAwMDAwMAorbXVseDEzOCBtdWx0aXBseSAzIDMwMDAwMDAwICAgLT4gOTAwMDAwMDAKK211bHgxMzkgbXVsdGlwbHkgMyAzMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAKK211bHgxNDAgbXVsdGlwbHkgMyAzMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMAorbXVseDE0MSBtdWx0aXBseSAzIDMwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAKK211bHgxNDIgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAKK211bHgxNDMgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMAorbXVseDE0NCBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAKK211bHgxNDUgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAKK211bHgxNDYgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMAorbXVseDE0NyBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAKK211bHgxNDggbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAKK211bHgxNDkgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDE1MCBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAKK211bHgxNTEgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA5MDAwMDAwMDAwMDAwMDAwMDAwMDAKK211bHgxNTIgbXVsdGlwbHkgMyAzMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwMAorbXVseDE1MyBtdWx0aXBseSAzIDMwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICAgLT4gOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKKworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogOQorLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93L3VuZGVyZmxvdworbXVseDE3MCBtdWx0aXBseSAxIDllOTk5OTk5OTk5ICAgIC0+IDlFKzk5OTk5OTk5OQorbXVseDE3MSBtdWx0aXBseSAxIDkuOWU5OTk5OTk5OTkgIC0+IDkuOUUrOTk5OTk5OTk5CittdWx4MTcyIG11bHRpcGx5IDEgOS45OWU5OTk5OTk5OTkgLT4gOS45OUUrOTk5OTk5OTk5CittdWx4MTczIG11bHRpcGx5IDllOTk5OTk5OTk5ICAgIDEgLT4gOUUrOTk5OTk5OTk5CittdWx4MTc0IG11bHRpcGx5IDkuOWU5OTk5OTk5OTkgIDEgLT4gOS45RSs5OTk5OTk5OTkKK211bHgxNzYgbXVsdGlwbHkgOS45OWU5OTk5OTk5OTkgMSAtPiA5Ljk5RSs5OTk5OTk5OTkKK211bHgxNzcgbXVsdGlwbHkgMSA5Ljk5OTk5OTk5ZTk5OTk5OTk5OSAtPiA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkKK211bHgxNzggbXVsdGlwbHkgOS45OTk5OTk5OWU5OTk5OTk5OTkgMSAtPiA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkKKworbXVseDE4MCBtdWx0aXBseSAwLjEgOWUtOTk5OTk5OTk4ICAgLT4gOUUtOTk5OTk5OTk5CittdWx4MTgxIG11bHRpcGx5IDAuMSA5OWUtOTk5OTk5OTk4ICAtPiA5LjlFLTk5OTk5OTk5OAorbXVseDE4MiBtdWx0aXBseSAwLjEgOTk5ZS05OTk5OTk5OTggLT4gOS45OUUtOTk5OTk5OTk3CisKK211bHgxODMgbXVsdGlwbHkgMC4xIDllLTk5OTk5OTk5OCAgICAgLT4gOUUtOTk5OTk5OTk5CittdWx4MTg0IG11bHRpcGx5IDAuMSA5OWUtOTk5OTk5OTk4ICAgIC0+IDkuOUUtOTk5OTk5OTk4CittdWx4MTg1IG11bHRpcGx5IDAuMSA5OTllLTk5OTk5OTk5OCAgIC0+IDkuOTlFLTk5OTk5OTk5NworbXVseDE4NiBtdWx0aXBseSAwLjEgOTk5ZS05OTk5OTk5OTcgICAtPiA5Ljk5RS05OTk5OTk5OTYKK211bHgxODcgbXVsdGlwbHkgMC4xIDk5OTllLTk5OTk5OTk5NyAgLT4gOS45OTlFLTk5OTk5OTk5NQorbXVseDE4OCBtdWx0aXBseSAwLjEgOTk5OTllLTk5OTk5OTk5NyAtPiA5Ljk5OTlFLTk5OTk5OTk5NAorCittdWx4MTkwIG11bHRpcGx5IDEgOWUtOTk5OTk5OTk4ICAgLT4gOUUtOTk5OTk5OTk4CittdWx4MTkxIG11bHRpcGx5IDEgOTllLTk5OTk5OTk5OCAgLT4gOS45RS05OTk5OTk5OTcKK211bHgxOTIgbXVsdGlwbHkgMSA5OTllLTk5OTk5OTk5OCAtPiA5Ljk5RS05OTk5OTk5OTYKK211bHgxOTMgbXVsdGlwbHkgOWUtOTk5OTk5OTk4ICAgMSAtPiA5RS05OTk5OTk5OTgKK211bHgxOTQgbXVsdGlwbHkgOTllLTk5OTk5OTk5OCAgMSAtPiA5LjlFLTk5OTk5OTk5NworbXVseDE5NSBtdWx0aXBseSA5OTllLTk5OTk5OTk5OCAxIC0+IDkuOTlFLTk5OTk5OTk5NgorCittdWx4MTk2IG11bHRpcGx5IDFlLTU5OTk5OTk5OSAxZS00MDAwMDAwMDAgLT4gMUUtOTk5OTk5OTk5CittdWx4MTk3IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS0zOTk5OTk5OTkgLT4gMUUtOTk5OTk5OTk5CittdWx4MTk4IG11bHRpcGx5IDEuMmUtNTk5OTk5OTk5IDEuMmUtNDAwMDAwMDAwIC0+IDEuNDRFLTk5OTk5OTk5OQorbXVseDE5OSBtdWx0aXBseSAxLjJlLTYwMDAwMDAwMCAxLjJlLTM5OTk5OTk5OSAtPiAxLjQ0RS05OTk5OTk5OTkKKworbXVseDIwMSBtdWx0aXBseSAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMCAtPiAxRSs5OTk5OTk5OTkKK211bHgyMDIgbXVsdGlwbHkgMWU2MDAwMDAwMDAgMWUzOTk5OTk5OTkgLT4gMUUrOTk5OTk5OTk5CittdWx4MjAzIG11bHRpcGx5IDEuMmU1OTk5OTk5OTkgMS4yZTQwMDAwMDAwMCAtPiAxLjQ0RSs5OTk5OTk5OTkKK211bHgyMDQgbXVsdGlwbHkgMS4yZTYwMDAwMDAwMCAxLjJlMzk5OTk5OTk5IC0+IDEuNDRFKzk5OTk5OTk5OQorCistLSBsb25nIG9wZXJhbmQgdHJpYW5nbGUKK3ByZWNpc2lvbjogMzMKK211bHgyNDYgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkyODMwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMgorbXVseDI0NyBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OTI4MyAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMxCittdWx4MjQ4IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMTk5MjggICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMzAKK211bHgyNDkgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkzICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyOQorbXVseDI1MCBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MTE5OSAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI4CittdWx4MjUxIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUxMjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjcKK211bHgyNTIgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTEyICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNgorbXVseDI1MyBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MTY1MSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI1CittdWx4MjU0IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkxNjUgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjQKK211bHgyNTUgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE3ICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMworbXVseDI1NiBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NzE5MiAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIyCittdWx4MjU3IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTY3MTkgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjEKK211bHgyNTggbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcyICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMAorbXVseDI1OSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNjk2NyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE5CittdWx4MjYwIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzM2OTcgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTgKK211bHgyNjEgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzcwICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNworbXVseDI2MiBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOTMzNyAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE2CittdWx4MjYzIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTE5MzQgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTUKK211bHgyNjQgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNAorbXVseDI2NSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MDExOSAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEzCittdWx4MjY2IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDgwMTIgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIKK211bHgyNjcgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMQorbXVseDI2OCBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOTA4MCAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEwCittdWx4MjY5IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjI5MDggICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDkKK211bHgyNzAgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkxICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgOAorbXVseDI3MSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDE0NTQzMy4yOSAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA3CittdWx4MjcyIG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMTQ1NDMzLjMgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogIDYKK211bHgyNzMgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA1CittdWx4Mjc0IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMS40NTQzRSs1ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNAorbXVseDI3NSBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDEuNDU0RSs1ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMworbXVseDI3NiBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDEuNDVFKzUgICAgICAgICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAyCittdWx4Mjc3IG11bHRpcGx5IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMS41RSs1ICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMQorbXVseDI3OCBtdWx0aXBseSAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNC44MDQ2MDA5NzM1OTkwODczMzk1OTM2MzA5NjQwNTQzIC0+IDFFKzUgICAgICAgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IHNvbWUgZWRnZSBjYXNlcyB3aXRoIGV4YWN0IHJvdW5kaW5nCittYXhleHBvbmVudDogOTk5OQorbWluZXhwb25lbnQ6IC05OTk5CitwcmVjaXNpb246IDkKK211bHgzMDEgbXVsdGlwbHkgOSA5ICAgLT4gODEKK211bHgzMDIgbXVsdGlwbHkgOSA5MCAgIC0+IDgxMAorbXVseDMwMyBtdWx0aXBseSA5IDkwMCAgIC0+IDgxMDAKK211bHgzMDQgbXVsdGlwbHkgOSA5MDAwICAgLT4gODEwMDAKK211bHgzMDUgbXVsdGlwbHkgOSA5MDAwMCAgIC0+IDgxMDAwMAorbXVseDMwNiBtdWx0aXBseSA5IDkwMDAwMCAgIC0+IDgxMDAwMDAKK211bHgzMDcgbXVsdGlwbHkgOSA5MDAwMDAwICAgLT4gODEwMDAwMDAKK211bHgzMDggbXVsdGlwbHkgOSA5MDAwMDAwMCAgIC0+IDgxMDAwMDAwMAorbXVseDMwOSBtdWx0aXBseSA5IDkwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzkgICBSb3VuZGVkCittdWx4MzEwIG11bHRpcGx5IDkgOTAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzEwICBSb3VuZGVkCittdWx4MzExIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwRSsxMSAgUm91bmRlZAorbXVseDMxMiBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzEyICBSb3VuZGVkCittdWx4MzEzIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzEzICBSb3VuZGVkCittdWx4MzE0IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwRSsxNCAgUm91bmRlZAorbXVseDMxNSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzE1ICBSb3VuZGVkCittdWx4MzE2IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzE2ICBSb3VuZGVkCittdWx4MzE3IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwRSsxNyAgUm91bmRlZAorbXVseDMxOCBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzE4ICBSb3VuZGVkCittdWx4MzE5IG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzE5ICBSb3VuZGVkCittdWx4MzIwIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwRSsyMCAgUm91bmRlZAorbXVseDMyMSBtdWx0aXBseSA5IDkwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzIxICBSb3VuZGVkCittdWx4MzIyIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgIC0+IDguMTAwMDAwMDBFKzIyICBSb3VuZGVkCittdWx4MzIzIG11bHRpcGx5IDkgOTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgICAtPiA4LjEwMDAwMDAwRSsyMyAgUm91bmRlZAorCistLSBmYXN0cGF0aCBicmVha2VycworcHJlY2lzaW9uOiAgIDI5CittdWx4MzMwIG11bHRpcGx5IDEuNDkxODI0Njk3NjQxMjcwMzE3ODI0ODUyOTUyODM3MjI0IDEuMTA1MTcwOTE4MDc1NjQ3NjI0ODExNzA3ODI2NDkwMjQ2NTE0Njc1NjI4NjE0NTYyODgzNTM3MzQ1NzQ3NjAzIC0+IDEuNjQ4NzIxMjcwNzAwMTI4MTQ2ODQ4NjUwNzg3OCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogICA1NQorbXVseDMzMSBtdWx0aXBseSAwLjg5NTgzNDEzNTI5NjUyODI1MDY3Njg1NDU4Mjg3NjUxMTc4MDM4NzM3MTcyODQ4OTEwNDA0MjggMC44OTU4MzQxMzUyOTY1MjgyNTA2NzY4NTQ1ODI4NzY1MTE3ODAzODczNzE3Mjg0ODkxMDQwNDI4IC0+IDAuODAyNTE4Nzk3OTYyNDc4NDgyOTg0MjU1MzgyOTkzNDA2OTk1NTg5MDk4MzY5Njc1MjIyODI5OSBJbmV4YWN0IFJvdW5kZWQKKworCistLSB0cnl6ZXJvcyBjYXNlcworcHJlY2lzaW9uOiAgIDcKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTIKK21pbmV4cG9uZW50OiAtOTIKK211bHg1MDQgIG11bHRpcGx5ICAwRS02MCAxMDAwRS02MCAgLT4gMEUtOTggQ2xhbXBlZAorbXVseDUwNSAgbXVsdGlwbHkgIDEwMEUrNjAgMEUrNjAgICAtPiAwRSs5MiBDbGFtcGVkCisKKy0tIG1peGVkIHdpdGggemVyb3MKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDkKK211bHg1NDEgbXVsdGlwbHkgIDAgICAgLTEgICAgIC0+IC0wCittdWx4NTQyIG11bHRpcGx5IC0wICAgIC0xICAgICAtPiAgMAorbXVseDU0MyBtdWx0aXBseSAgMCAgICAgMSAgICAgLT4gIDAKK211bHg1NDQgbXVsdGlwbHkgLTAgICAgIDEgICAgIC0+IC0wCittdWx4NTQ1IG11bHRpcGx5IC0xICAgICAwICAgICAtPiAtMAorbXVseDU0NiBtdWx0aXBseSAtMSAgICAtMCAgICAgLT4gIDAKK211bHg1NDcgbXVsdGlwbHkgIDEgICAgIDAgICAgIC0+ICAwCittdWx4NTQ4IG11bHRpcGx5ICAxICAgIC0wICAgICAtPiAtMAorCittdWx4NTUxIG11bHRpcGx5ICAwLjAgIC0xICAgICAtPiAtMC4wCittdWx4NTUyIG11bHRpcGx5IC0wLjAgIC0xICAgICAtPiAgMC4wCittdWx4NTUzIG11bHRpcGx5ICAwLjAgICAxICAgICAtPiAgMC4wCittdWx4NTU0IG11bHRpcGx5IC0wLjAgICAxICAgICAtPiAtMC4wCittdWx4NTU1IG11bHRpcGx5IC0xLjAgICAwICAgICAtPiAtMC4wCittdWx4NTU2IG11bHRpcGx5IC0xLjAgIC0wICAgICAtPiAgMC4wCittdWx4NTU3IG11bHRpcGx5ICAxLjAgICAwICAgICAtPiAgMC4wCittdWx4NTU4IG11bHRpcGx5ICAxLjAgIC0wICAgICAtPiAtMC4wCisKK211bHg1NjEgbXVsdGlwbHkgIDAgICAgLTEuMCAgIC0+IC0wLjAKK211bHg1NjIgbXVsdGlwbHkgLTAgICAgLTEuMCAgIC0+ICAwLjAKK211bHg1NjMgbXVsdGlwbHkgIDAgICAgIDEuMCAgIC0+ICAwLjAKK211bHg1NjQgbXVsdGlwbHkgLTAgICAgIDEuMCAgIC0+IC0wLjAKK211bHg1NjUgbXVsdGlwbHkgLTEgICAgIDAuMCAgIC0+IC0wLjAKK211bHg1NjYgbXVsdGlwbHkgLTEgICAgLTAuMCAgIC0+ICAwLjAKK211bHg1NjcgbXVsdGlwbHkgIDEgICAgIDAuMCAgIC0+ICAwLjAKK211bHg1NjggbXVsdGlwbHkgIDEgICAgLTAuMCAgIC0+IC0wLjAKKworbXVseDU3MSBtdWx0aXBseSAgMC4wICAtMS4wICAgLT4gLTAuMDAKK211bHg1NzIgbXVsdGlwbHkgLTAuMCAgLTEuMCAgIC0+ICAwLjAwCittdWx4NTczIG11bHRpcGx5ICAwLjAgICAxLjAgICAtPiAgMC4wMAorbXVseDU3NCBtdWx0aXBseSAtMC4wICAgMS4wICAgLT4gLTAuMDAKK211bHg1NzUgbXVsdGlwbHkgLTEuMCAgIDAuMCAgIC0+IC0wLjAwCittdWx4NTc2IG11bHRpcGx5IC0xLjAgIC0wLjAgICAtPiAgMC4wMAorbXVseDU3NyBtdWx0aXBseSAgMS4wICAgMC4wICAgLT4gIDAuMDAKK211bHg1NzggbXVsdGlwbHkgIDEuMCAgLTAuMCAgIC0+IC0wLjAwCisKKworLS0gU3BlY2lhbHMKK211bHg1ODAgbXVsdGlwbHkgIEluZiAgLUluZiAgIC0+IC1JbmZpbml0eQorbXVseDU4MSBtdWx0aXBseSAgSW5mICAtMTAwMCAgLT4gLUluZmluaXR5CittdWx4NTgyIG11bHRpcGx5ICBJbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK211bHg1ODMgbXVsdGlwbHkgIEluZiAgLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NTg0IG11bHRpcGx5ICBJbmYgICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDU4NSBtdWx0aXBseSAgSW5mICAgMSAgICAgLT4gIEluZmluaXR5CittdWx4NTg2IG11bHRpcGx5ICBJbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK211bHg1ODcgbXVsdGlwbHkgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorbXVseDU4OCBtdWx0aXBseSAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CittdWx4NTg5IG11bHRpcGx5IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK211bHg1OTAgbXVsdGlwbHkgLTEgICAgIEluZiAgIC0+IC1JbmZpbml0eQorbXVseDU5MSBtdWx0aXBseSAtMCAgICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg1OTIgbXVsdGlwbHkgIDAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NTkzIG11bHRpcGx5ICAxICAgICBJbmYgICAtPiAgSW5maW5pdHkKK211bHg1OTQgbXVsdGlwbHkgIDEwMDAgIEluZiAgIC0+ICBJbmZpbml0eQorbXVseDU5NSBtdWx0aXBseSAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK211bHg2MDAgbXVsdGlwbHkgLUluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorbXVseDYwMSBtdWx0aXBseSAtSW5mICAtMTAwMCAgLT4gIEluZmluaXR5CittdWx4NjAyIG11bHRpcGx5IC1JbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK211bHg2MDMgbXVsdGlwbHkgLUluZiAgLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjA0IG11bHRpcGx5IC1JbmYgICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDYwNSBtdWx0aXBseSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5CittdWx4NjA2IG11bHRpcGx5IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK211bHg2MDcgbXVsdGlwbHkgLUluZiAgIEluZiAgIC0+IC1JbmZpbml0eQorbXVseDYwOCBtdWx0aXBseSAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CittdWx4NjA5IG11bHRpcGx5IC1JbmYgIC1JbmYgICAtPiAgSW5maW5pdHkKK211bHg2MTAgbXVsdGlwbHkgLTEgICAgLUluZiAgIC0+ICBJbmZpbml0eQorbXVseDYxMSBtdWx0aXBseSAtMCAgICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2MTIgbXVsdGlwbHkgIDAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjEzIG11bHRpcGx5ICAxICAgIC1JbmYgICAtPiAtSW5maW5pdHkKK211bHg2MTQgbXVsdGlwbHkgIDEwMDAgLUluZiAgIC0+IC1JbmZpbml0eQorbXVseDYxNSBtdWx0aXBseSAgSW5mICAtSW5mICAgLT4gLUluZmluaXR5CisKK211bHg2MjEgbXVsdGlwbHkgIE5hTiAtSW5mICAgIC0+ICBOYU4KK211bHg2MjIgbXVsdGlwbHkgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK211bHg2MjMgbXVsdGlwbHkgIE5hTiAtMSAgICAgIC0+ICBOYU4KK211bHg2MjQgbXVsdGlwbHkgIE5hTiAtMCAgICAgIC0+ICBOYU4KK211bHg2MjUgbXVsdGlwbHkgIE5hTiAgMCAgICAgIC0+ICBOYU4KK211bHg2MjYgbXVsdGlwbHkgIE5hTiAgMSAgICAgIC0+ICBOYU4KK211bHg2MjcgbXVsdGlwbHkgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK211bHg2MjggbXVsdGlwbHkgIE5hTiAgSW5mICAgIC0+ICBOYU4KK211bHg2MjkgbXVsdGlwbHkgIE5hTiAgTmFOICAgIC0+ICBOYU4KK211bHg2MzAgbXVsdGlwbHkgLUluZiAgTmFOICAgIC0+ICBOYU4KK211bHg2MzEgbXVsdGlwbHkgLTEwMDAgTmFOICAgIC0+ICBOYU4KK211bHg2MzIgbXVsdGlwbHkgLTEgICAgTmFOICAgIC0+ICBOYU4KK211bHg2MzMgbXVsdGlwbHkgLTAgICAgTmFOICAgIC0+ICBOYU4KK211bHg2MzQgbXVsdGlwbHkgIDAgICAgTmFOICAgIC0+ICBOYU4KK211bHg2MzUgbXVsdGlwbHkgIDEgICAgTmFOICAgIC0+ICBOYU4KK211bHg2MzYgbXVsdGlwbHkgIDEwMDAgTmFOICAgIC0+ICBOYU4KK211bHg2MzcgbXVsdGlwbHkgIEluZiAgTmFOICAgIC0+ICBOYU4KKworbXVseDY0MSBtdWx0aXBseSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NDIgbXVsdGlwbHkgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjQzIG11bHRpcGx5ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY0NCBtdWx0aXBseSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NDUgbXVsdGlwbHkgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjQ2IG11bHRpcGx5ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY0NyBtdWx0aXBseSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NDggbXVsdGlwbHkgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjQ5IG11bHRpcGx5ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY1MCBtdWx0aXBseSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NTEgbXVsdGlwbHkgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjUyIG11bHRpcGx5IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY1MyBtdWx0aXBseSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NTQgbXVsdGlwbHkgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjU1IG11bHRpcGx5ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY1NiBtdWx0aXBseSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NTcgbXVsdGlwbHkgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCittdWx4NjU4IG11bHRpcGx5ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY1OSBtdWx0aXBseSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworbXVseDY2MSBtdWx0aXBseSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK211bHg2NjIgbXVsdGlwbHkgIE5hTjggIDk5OSAgIC0+ICBOYU44CittdWx4NjYzIG11bHRpcGx5ICBOYU43MSBJbmYgICAtPiAgTmFONzEKK211bHg2NjQgbXVsdGlwbHkgIE5hTjYgIE5hTjUgIC0+ICBOYU42CittdWx4NjY1IG11bHRpcGx5IC1JbmYgICBOYU40ICAtPiAgTmFONAorbXVseDY2NiBtdWx0aXBseSAtOTk5ICAgTmFOMzMgLT4gIE5hTjMzCittdWx4NjY3IG11bHRpcGx5ICBJbmYgICBOYU4yICAtPiAgTmFOMgorCittdWx4NjcxIG11bHRpcGx5ICBzTmFOOTkgLUluZiAgICAtPiAgTmFOOTkgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NzIgbXVsdGlwbHkgIHNOYU45OCAtMTEgICAgIC0+ICBOYU45OCBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY3MyBtdWx0aXBseSAgc05hTjk3ICBOYU4gICAgLT4gIE5hTjk3IEludmFsaWRfb3BlcmF0aW9uCittdWx4Njc0IG11bHRpcGx5ICBzTmFOMTYgc05hTjk0ICAtPiAgTmFOMTYgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NzUgbXVsdGlwbHkgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY3NiBtdWx0aXBseSAtSW5mICAgIHNOYU45MiAgLT4gIE5hTjkyIEludmFsaWRfb3BlcmF0aW9uCittdWx4Njc3IG11bHRpcGx5ICAwODggICAgc05hTjkxICAtPiAgTmFOOTEgSW52YWxpZF9vcGVyYXRpb24KK211bHg2NzggbXVsdGlwbHkgIEluZiAgICBzTmFOOTAgIC0+ICBOYU45MCBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY3OSBtdWx0aXBseSAgTmFOICAgIHNOYU44OSAgLT4gIE5hTjg5IEludmFsaWRfb3BlcmF0aW9uCisKK211bHg2ODEgbXVsdGlwbHkgLU5hTjkgLUluZiAgIC0+IC1OYU45CittdWx4NjgyIG11bHRpcGx5IC1OYU44ICA5OTkgICAtPiAtTmFOOAorbXVseDY4MyBtdWx0aXBseSAtTmFONzEgSW5mICAgLT4gLU5hTjcxCittdWx4Njg0IG11bHRpcGx5IC1OYU42IC1OYU41ICAtPiAtTmFONgorbXVseDY4NSBtdWx0aXBseSAtSW5mICAtTmFONCAgLT4gLU5hTjQKK211bHg2ODYgbXVsdGlwbHkgLTk5OSAgLU5hTjMzIC0+IC1OYU4zMworbXVseDY4NyBtdWx0aXBseSAgSW5mICAtTmFOMiAgLT4gLU5hTjIKKworbXVseDY5MSBtdWx0aXBseSAtc05hTjk5IC1JbmYgICAgLT4gLU5hTjk5IEludmFsaWRfb3BlcmF0aW9uCittdWx4NjkyIG11bHRpcGx5IC1zTmFOOTggLTExICAgICAtPiAtTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK211bHg2OTMgbXVsdGlwbHkgLXNOYU45NyAgTmFOICAgIC0+IC1OYU45NyBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY5NCBtdWx0aXBseSAtc05hTjE2IC1zTmFOOTQgLT4gLU5hTjE2IEludmFsaWRfb3BlcmF0aW9uCittdWx4Njk1IG11bHRpcGx5IC1OYU45NSAgLXNOYU45MyAtPiAtTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK211bHg2OTYgbXVsdGlwbHkgLUluZiAgICAtc05hTjkyIC0+IC1OYU45MiBJbnZhbGlkX29wZXJhdGlvbgorbXVseDY5NyBtdWx0aXBseSAgMDg4ICAgIC1zTmFOOTEgLT4gLU5hTjkxIEludmFsaWRfb3BlcmF0aW9uCittdWx4Njk4IG11bHRpcGx5ICBJbmYgICAgLXNOYU45MCAtPiAtTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK211bHg2OTkgbXVsdGlwbHkgLU5hTiAgICAtc05hTjg5IC0+IC1OYU44OSBJbnZhbGlkX29wZXJhdGlvbgorCittdWx4NzAxIG11bHRpcGx5IC1OYU4gIC1JbmYgICAtPiAtTmFOCittdWx4NzAyIG11bHRpcGx5IC1OYU4gICA5OTkgICAtPiAtTmFOCittdWx4NzAzIG11bHRpcGx5IC1OYU4gICBJbmYgICAtPiAtTmFOCittdWx4NzA0IG11bHRpcGx5IC1OYU4gIC1OYU4gICAtPiAtTmFOCittdWx4NzA1IG11bHRpcGx5IC1JbmYgIC1OYU4wICAtPiAtTmFOCittdWx4NzA2IG11bHRpcGx5IC05OTkgIC1OYU4gICAtPiAtTmFOCittdWx4NzA3IG11bHRpcGx5ICBJbmYgIC1OYU4gICAtPiAtTmFOCisKK211bHg3MTEgbXVsdGlwbHkgLXNOYU4gICAtSW5mICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTIgbXVsdGlwbHkgLXNOYU4gICAtMTEgICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTMgbXVsdGlwbHkgLXNOYU4wMCAgTmFOICAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTQgbXVsdGlwbHkgLXNOYU4gICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTUgbXVsdGlwbHkgLU5hTiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTYgbXVsdGlwbHkgLUluZiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTcgbXVsdGlwbHkgIDA4OCAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTggbXVsdGlwbHkgIEluZiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg3MTkgbXVsdGlwbHkgLU5hTiAgICAtc05hTiAgIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyAuLiBub3RlIHN1Ym5vcm1hbCByZXN1bHRzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorbXVseDczMCBtdWx0aXBseSArMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTk5OTkgLT4gSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittdWx4NzMxIG11bHRpcGx5IDlFKzk5OTk5OTk5OSArMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK211bHg3MzIgbXVsdGlwbHkgKzAuMTAwIDlFLTk5OTk5OTk5OSAtPiA5LjAwRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorbXVseDczMyBtdWx0aXBseSA5RS05OTk5OTk5OTkgKzAuMTAwIC0+IDkuMDBFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCittdWx4NzM1IG11bHRpcGx5IC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittdWx4NzM2IG11bHRpcGx5IDlFKzk5OTk5OTk5OSAtMS4yMzQ1Njc4OTAxMjM0NUUtMCAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittdWx4NzM3IG11bHRpcGx5IC0wLjEwMCA5RS05OTk5OTk5OTkgLT4gLTkuMDBFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCittdWx4NzM4IG11bHRpcGx5IDlFLTk5OTk5OTk5OSAtMC4xMDAgLT4gLTkuMDBFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCisKK211bHg3MzkgbXVsdGlwbHkgMWUtNTk5OTk5OTk5IDFlLTQwMDAwMDAwMSAtPiAxRS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorbXVseDc0MCBtdWx0aXBseSAxZS01OTk5OTk5OTkgMWUtNDAwMDAwMDAwIC0+IDFFLTk5OTk5OTk5OQorbXVseDc0MSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAwIC0+IDFFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCittdWx4NzQyIG11bHRpcGx5IDllLTk5OTk5OTk5OCAwLjAxIC0+IDlFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCittdWx4NzQzIG11bHRpcGx5IDllLTk5OTk5OTk5OCAwLjEgIC0+IDlFLTk5OTk5OTk5OQorbXVseDc0NCBtdWx0aXBseSAwLjAxIDllLTk5OTk5OTk5OCAtPiA5RS0xMDAwMDAwMDAwIFN1Ym5vcm1hbAorbXVseDc0NSBtdWx0aXBseSAxZTU5OTk5OTk5OSAxZTQwMDAwMDAwMSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK211bHg3NDYgbXVsdGlwbHkgMWU1OTk5OTk5OTkgMWU0MDAwMDAwMDAgLT4gMUUrOTk5OTk5OTk5CittdWx4NzQ3IG11bHRpcGx5IDFlNjAwMDAwMDAwIDFlNDAwMDAwMDAwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbXVseDc0OCBtdWx0aXBseSA5ZTk5OTk5OTk5OCAxMDAgIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbXVseDc0OSBtdWx0aXBseSA5ZTk5OTk5OTk5OCAxMCAgIC0+IDkuMEUrOTk5OTk5OTk5CittdWx4NzUwIG11bHRpcGx5IDEwMCAgOWU5OTk5OTk5OTggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCistLSBzaWducworbXVseDc1MSBtdWx0aXBseSAgMWUrNzc3Nzc3Nzc3ICAxZSs0MTExMTExMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbXVseDc1MiBtdWx0aXBseSAgMWUrNzc3Nzc3Nzc3IC0xZSs0MTExMTExMTEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbXVseDc1MyBtdWx0aXBseSAtMWUrNzc3Nzc3Nzc3ICAxZSs0MTExMTExMTEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbXVseDc1NCBtdWx0aXBseSAtMWUrNzc3Nzc3Nzc3IC0xZSs0MTExMTExMTEgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorbXVseDc1NSBtdWx0aXBseSAgMWUtNzc3Nzc3Nzc3ICAxZS00MTExMTExMTEgLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDc1NiBtdWx0aXBseSAgMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDc1NyBtdWx0aXBseSAtMWUtNzc3Nzc3Nzc3ICAxZS00MTExMTExMTEgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDc1OCBtdWx0aXBseSAtMWUtNzc3Nzc3Nzc3IC0xZS00MTExMTExMTEgLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAnc3Vibm9ybWFsJyBib3VuZGFyeSAoYWxsIGhhcmQgdW5kZXJmbG93IG9yIG92ZXJmbG93IGluIGJhc2UgYXJpdGhlbXRpYykKK3ByZWNpc2lvbjogOQorbXVseDc2MCBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDAxIC0+IDFFLTEwMDAwMDAwMDEgU3Vibm9ybWFsCittdWx4NzYxIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDIgLT4gMUUtMTAwMDAwMDAwMiBTdWJub3JtYWwKK211bHg3NjIgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwMyAtPiAxRS0xMDAwMDAwMDAzIFN1Ym5vcm1hbAorbXVseDc2MyBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDA0IC0+IDFFLTEwMDAwMDAwMDQgU3Vibm9ybWFsCittdWx4NzY0IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDUgLT4gMUUtMTAwMDAwMDAwNSBTdWJub3JtYWwKK211bHg3NjUgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwNiAtPiAxRS0xMDAwMDAwMDA2IFN1Ym5vcm1hbAorbXVseDc2NiBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDA3IC0+IDFFLTEwMDAwMDAwMDcgU3Vibm9ybWFsCittdWx4NzY3IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4NzY4IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4NzY5IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMTAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBbbm8gZXF1aXZhbGVudCBvZiAnc3Vibm9ybWFsJyBmb3Igb3ZlcmZsb3ddCittdWx4NzcwIG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDEgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzcxIG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDIgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzcyIG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4NzczIG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4Nzc0IG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4Nzc1IG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4Nzc2IG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4Nzc3IG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4Nzc4IG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMDkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCittdWx4Nzc5IG11bHRpcGx5IDFlKzYwMDAwMDAwMCAxZSs0MDAwMDAwMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tICdzdWJub3JtYWwnIHRlc3QgZWRnZSBjb25kaXRpb24gYXQgaGlnaGVyIHByZWNpc2lvbnMKK3ByZWNpc2lvbjogOTkKK211bHg3ODAgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDAwNyAtPiAxRS0xMDAwMDAwMDA3IFN1Ym5vcm1hbAorbXVseDc4MSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDA4IC0+IDFFLTEwMDAwMDAwMDggU3Vibm9ybWFsCittdWx4NzgyIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwOTcgLT4gMUUtMTAwMDAwMDA5NyBTdWJub3JtYWwKK211bHg3ODMgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDA5OCAtPiAwRS0xMDAwMDAwMDk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3ByZWNpc2lvbjogOTk5CittdWx4Nzg0IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDA5OTcgLT4gMUUtMTAwMDAwMDk5NyBTdWJub3JtYWwKK211bHg3ODUgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDAwMDk5OCAtPiAwRS0xMDAwMDAwOTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gZm9sbG93aW5nIHRlc3RjYXNlcyBbdGhyb3VnaCBtdWx4ODAwXSBub3QgeWV0IHJ1biBhZ2FpbnN0IGNvZGUKK3ByZWNpc2lvbjogOTk5OQorbXVseDc4NiBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDA5OTk3IC0+IDFFLTEwMDAwMDk5OTcgU3Vibm9ybWFsCittdWx4Nzg3IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDk5OTggLT4gMEUtMTAwMDAwOTk5NyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwcmVjaXNpb246IDk5OTk5CittdWx4Nzg4IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwOTk5OTcgLT4gMUUtMTAwMDA5OTk5NyBTdWJub3JtYWwKK211bHg3ODkgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDA5OTk5OCAtPiAwRS0xMDAwMDk5OTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3ByZWNpc2lvbjogOTk5OTk5CittdWx4NzkwIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDA5OTk5OTcgLT4gMUUtMTAwMDk5OTk5NyBTdWJub3JtYWwKK211bHg3OTEgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQwMDk5OTk5OCAtPiAwRS0xMDAwOTk5OTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3ByZWNpc2lvbjogOTk5OTk5OQorbXVseDc5MiBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDA5OTk5OTk3IC0+IDFFLTEwMDk5OTk5OTcgU3Vibm9ybWFsCittdWx4NzkzIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDk5OTk5OTggLT4gMEUtMTAwOTk5OTk5NyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwcmVjaXNpb246IDk5OTk5OTk5CittdWx4Nzk0IG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00OTk5OTk5OTcgLT4gMUUtMTA5OTk5OTk5NyBTdWJub3JtYWwKK211bHg3OTUgbXVsdGlwbHkgMWUtNjAwMDAwMDAwIDFlLTQ5OTk5OTk5OCAtPiAwRS0xMDk5OTk5OTk3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3ByZWNpc2lvbjogOTk5OTk5OTk5CittdWx4Nzk2IG11bHRpcGx5IDFlLTk5OTk5OTk5OSAxZS05OTk5OTk5OTcgLT4gMUUtMTk5OTk5OTk5NiBTdWJub3JtYWwKK211bHg3OTcgbXVsdGlwbHkgMWUtOTk5OTk5OTk5IDFlLTk5OTk5OTk5OCAtPiAxRS0xOTk5OTk5OTk3IFN1Ym5vcm1hbAorbXVseDc5OCBtdWx0aXBseSAxZS05OTk5OTk5OTkgMWUtOTk5OTk5OTk5IC0+IDBFLTE5OTk5OTk5OTcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDc5OSBtdWx0aXBseSAxZS02MDAwMDAwMDAgMWUtNDAwMDAwMDA3IC0+IDFFLTEwMDAwMDAwMDcgU3Vibm9ybWFsCittdWx4ODAwIG11bHRpcGx5IDFlLTYwMDAwMDAwMCAxZS00MDAwMDAwMDggLT4gMUUtMTAwMDAwMDAwOCBTdWJub3JtYWwKKworLS0gdGVzdCBzdWJub3JtYWxzIHJvdW5kaW5nCitwcmVjaXNpb246ICAgNQorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworbXVseDgwMSBtdWx0aXBseSAgMS4wMDAwRS05OTkgIDEgICAgIC0+IDEuMDAwMEUtOTk5CittdWx4ODAyIG11bHRpcGx5ICAxLjAwMEUtOTk5ICAgMWUtMSAgLT4gMS4wMDBFLTEwMDAgU3Vibm9ybWFsCittdWx4ODAzIG11bHRpcGx5ICAxLjAwRS05OTkgICAgMWUtMiAgLT4gMS4wMEUtMTAwMSAgU3Vibm9ybWFsCittdWx4ODA0IG11bHRpcGx5ICAxLjBFLTk5OSAgICAgMWUtMyAgLT4gMS4wRS0xMDAyICAgU3Vibm9ybWFsCittdWx4ODA1IG11bHRpcGx5ICAxLjBFLTk5OSAgICAgMWUtNCAgLT4gMUUtMTAwMyAgICAgU3Vibm9ybWFsIFJvdW5kZWQKK211bHg4MDYgbXVsdGlwbHkgIDEuM0UtOTk5ICAgICAxZS00ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgwNyBtdWx0aXBseSAgMS41RS05OTkgICAgIDFlLTQgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODA4IG11bHRpcGx5ICAxLjdFLTk5OSAgICAgMWUtNCAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MDkgbXVsdGlwbHkgIDIuM0UtOTk5ICAgICAxZS00ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgxMCBtdWx0aXBseSAgMi41RS05OTkgICAgIDFlLTQgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODExIG11bHRpcGx5ICAyLjdFLTk5OSAgICAgMWUtNCAgLT4gM0UtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MTIgbXVsdGlwbHkgIDEuNDlFLTk5OSAgICAxZS00ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgxMyBtdWx0aXBseSAgMS41MEUtOTk5ICAgIDFlLTQgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODE0IG11bHRpcGx5ICAxLjUxRS05OTkgICAgMWUtNCAgLT4gMkUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MTUgbXVsdGlwbHkgIDIuNDlFLTk5OSAgICAxZS00ICAtPiAyRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgxNiBtdWx0aXBseSAgMi41MEUtOTk5ICAgIDFlLTQgIC0+IDJFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODE3IG11bHRpcGx5ICAyLjUxRS05OTkgICAgMWUtNCAgLT4gM0UtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworbXVseDgxOCBtdWx0aXBseSAgMUUtOTk5ICAgICAgIDFlLTQgIC0+IDFFLTEwMDMgICAgIFN1Ym5vcm1hbAorbXVseDgxOSBtdWx0aXBseSAgM0UtOTk5ICAgICAgIDFlLTUgIC0+IDBFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK211bHg4MjAgbXVsdGlwbHkgIDVFLTk5OSAgICAgICAxZS01ICAtPiAwRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4ODIxIG11bHRpcGx5ICA3RS05OTkgICAgICAgMWUtNSAgLT4gMUUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MjIgbXVsdGlwbHkgIDlFLTk5OSAgICAgICAxZS01ICAtPiAxRS0xMDAzICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgyMyBtdWx0aXBseSAgOS45RS05OTkgICAgIDFlLTUgIC0+IDFFLTEwMDMgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK211bHg4MjQgbXVsdGlwbHkgIDFFLTk5OSAgICAgIC0xZS00ICAtPiAtMUUtMTAwMyAgICBTdWJub3JtYWwKK211bHg4MjUgbXVsdGlwbHkgIDNFLTk5OSAgICAgIC0xZS01ICAtPiAtMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4ODI2IG11bHRpcGx5IC01RS05OTkgICAgICAgMWUtNSAgLT4gLTBFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDgyNyBtdWx0aXBseSAgN0UtOTk5ICAgICAgLTFlLTUgIC0+IC0xRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCittdWx4ODI4IG11bHRpcGx5IC05RS05OTkgICAgICAgMWUtNSAgLT4gLTFFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK211bHg4MjkgbXVsdGlwbHkgIDkuOUUtOTk5ICAgIC0xZS01ICAtPiAtMUUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbXVseDgzMCBtdWx0aXBseSAgMy4wRS05OTkgICAgLTFlLTUgIC0+IC0wRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworbXVseDgzMSBtdWx0aXBseSAgMS4wRS01MDEgICAgIDFlLTUwMSAtPiAxLjBFLTEwMDIgICBTdWJub3JtYWwKK211bHg4MzIgbXVsdGlwbHkgIDIuMEUtNTAxICAgICAyZS01MDEgLT4gNC4wRS0xMDAyICAgU3Vibm9ybWFsCittdWx4ODMzIG11bHRpcGx5ICA0LjBFLTUwMSAgICAgNGUtNTAxIC0+IDEuNjBFLTEwMDEgIFN1Ym5vcm1hbAorbXVseDgzNCBtdWx0aXBseSAxMC4wRS01MDEgICAgMTBlLTUwMSAtPiAxLjAwMEUtMTAwMCBTdWJub3JtYWwKK211bHg4MzUgbXVsdGlwbHkgMzAuMEUtNTAxICAgIDMwZS01MDEgLT4gOS4wMDBFLTEwMDAgU3Vibm9ybWFsCittdWx4ODM2IG11bHRpcGx5IDQwLjBFLTUwMSAgICA0MGUtNTAxIC0+IDEuNjAwMEUtOTk5CisKKy0tIHNxdWFyZXMKK211bHg4NDAgbXVsdGlwbHkgIDFFLTUwMiAgICAgICAxZS01MDIgLT4gMEUtMTAwMyAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDg0MSBtdWx0aXBseSAgMUUtNTAxICAgICAgIDFlLTUwMSAtPiAxRS0xMDAyICAgICBTdWJub3JtYWwKK211bHg4NDIgbXVsdGlwbHkgIDJFLTUwMSAgICAgICAyZS01MDEgLT4gNEUtMTAwMiAgICAgU3Vibm9ybWFsCittdWx4ODQzIG11bHRpcGx5ICA0RS01MDEgICAgICAgNGUtNTAxIC0+IDEuNkUtMTAwMSAgIFN1Ym5vcm1hbAorbXVseDg0NCBtdWx0aXBseSAxMEUtNTAxICAgICAgMTBlLTUwMSAtPiAxLjAwRS0xMDAwICBTdWJub3JtYWwKK211bHg4NDUgbXVsdGlwbHkgMzBFLTUwMSAgICAgIDMwZS01MDEgLT4gOS4wMEUtMTAwMCAgU3Vibm9ybWFsCittdWx4ODQ2IG11bHRpcGx5IDQwRS01MDEgICAgICA0MGUtNTAxIC0+IDEuNjAwRS05OTkKKworLS0gY3ViZXMKK211bHg4NTAgbXVsdGlwbHkgIDFFLTY3MCAgICAgMWUtMzM1IC0+IDBFLTEwMDMgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorbXVseDg1MSBtdWx0aXBseSAgMUUtNjY4ICAgICAxZS0zMzQgLT4gMUUtMTAwMiAgICBTdWJub3JtYWwKK211bHg4NTIgbXVsdGlwbHkgIDRFLTY2OCAgICAgMmUtMzM0IC0+IDhFLTEwMDIgICAgU3Vibm9ybWFsCittdWx4ODUzIG11bHRpcGx5ICA5RS02NjggICAgIDNlLTMzNCAtPiAyLjdFLTEwMDEgIFN1Ym5vcm1hbAorbXVseDg1NCBtdWx0aXBseSAxNkUtNjY4ICAgICA0ZS0zMzQgLT4gNi40RS0xMDAxICBTdWJub3JtYWwKK211bHg4NTUgbXVsdGlwbHkgMjVFLTY2OCAgICAgNWUtMzM0IC0+IDEuMjVFLTEwMDAgU3Vibm9ybWFsCittdWx4ODU2IG11bHRpcGx5IDEwRS02NjggICAxMDBlLTMzNCAtPiAxLjAwMEUtOTk5CisKKy0tIHRlc3QgZGVyaXZlZCBmcm9tIHJlc3VsdCBvZiAwLjA5OSAqKiA5OTkgYXQgMTUgZGlnaXRzIHdpdGggdW5saW1pdGVkIGV4cG9uZW50CitwcmVjaXNpb246IDE5CittdWx4ODYwIG11bHRpcGx5ICA2NjM2ODUxNTU3OTk0NTc4NzE2RS01MjAgNjYzNjg1MTU1Nzk5NDU3ODcxNkUtNTIwIC0+IDQuNDA0Nzc5ODYwMjg1NTFFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gTG9uZyBvcGVyYW5kIG92ZXJmbG93IG1heSBiZSBhIGRpZmZlcmVudCBwYXRoCitwcmVjaXNpb246IDMKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CittdWx4ODcwIG11bHRpcGx5IDEgIDkuOTk5RSs5OTk5OTk5OTkgICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittdWx4ODcxIG11bHRpcGx5IDEgLTkuOTk5RSs5OTk5OTk5OTkgICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittdWx4ODcyIG11bHRpcGx5ICAgIDkuOTk5RSs5OTk5OTk5OTkgMSAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCittdWx4ODczIG11bHRpcGx5ICAgLTkuOTk5RSs5OTk5OTk5OTkgMSAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitwcmVjaXNpb246ICAgNQorbWF4ZXhwb25lbnQ6IDc5CittaW5leHBvbmVudDogLTc5CittdWx4ODgxIG11bHRpcGx5ICAxLjIzNDdFLTQwICAxLjIzNDdFLTQwICAtPiAgMS41MjRFLTgwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXVseDg4MiBtdWx0aXBseSAgMS4yMzRFLTQwICAxLjIzNEUtNDAgICAgLT4gIDEuNTIzRS04MCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK211bHg4ODMgbXVsdGlwbHkgIDEuMjNFLTQwICAgMS4yM0UtNDAgICAgIC0+ICAxLjUxM0UtODAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittdWx4ODg0IG11bHRpcGx5ICAxLjJFLTQwICAgIDEuMkUtNDAgICAgICAtPiAgMS40NEUtODAgICBTdWJub3JtYWwKK211bHg4ODUgbXVsdGlwbHkgIDEuMkUtNDAgICAgMS4yRS00MSAgICAgIC0+ICAxLjQ0RS04MSAgIFN1Ym5vcm1hbAorbXVseDg4NiBtdWx0aXBseSAgMS4yRS00MCAgICAxLjJFLTQyICAgICAgLT4gIDEuNEUtODIgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK211bHg4ODcgbXVsdGlwbHkgIDEuMkUtNDAgICAgMS4zRS00MiAgICAgIC0+ICAxLjZFLTgyICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93CittdWx4ODg4IG11bHRpcGx5ICAxLjNFLTQwICAgIDEuM0UtNDIgICAgICAtPiAgMS43RS04MiAgICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdworbXVseDg4OSBtdWx0aXBseSAgMS4zRS00MCAgICAxLjNFLTQzICAgICAgLT4gICAgMkUtODMgICAgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKK211bHg4OTAgbXVsdGlwbHkgIDEuM0UtNDEgICAgMS4zRS00MyAgICAgIC0+ICAgIDBFLTgzICAgIENsYW1wZWQgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cKKworbXVseDg5MSBtdWx0aXBseSAgMS4yMzQ1RS0zOSAgIDEuMjM0RS00MCAgLT4gIDEuNTIzNEUtNzkgSW5leGFjdCBSb3VuZGVkCittdWx4ODkyIG11bHRpcGx5ICAxLjIzNDU2RS0zOSAgMS4yMzRFLTQwICAtPiAgMS41MjM0RS03OSBJbmV4YWN0IFJvdW5kZWQKK211bHg4OTMgbXVsdGlwbHkgIDEuMjM0NUUtNDAgICAxLjIzNEUtNDAgIC0+ICAxLjUyM0UtODAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CittdWx4ODk0IG11bHRpcGx5ICAxLjIzNDU2RS00MCAgMS4yMzRFLTQwICAtPiAgMS41MjNFLTgwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworbXVseDg5NSBtdWx0aXBseSAgMS4yMzQ1RS00MSAgIDEuMjM0RS00MCAgLT4gIDEuNTJFLTgxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK211bHg4OTYgbXVsdGlwbHkgIDEuMjM0NTZFLTQxICAxLjIzNEUtNDAgIC0+ICAxLjUyRS04MSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CisKKy0tIE5vdyBleHBsb3JlIHRoZSBjYXNlIHdoZXJlIHdlIGdldCBhIG5vcm1hbCByZXN1bHQgd2l0aCBVbmRlcmZsb3cKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKK211bHg5MDAgbXVsdGlwbHkgIDAuMzAwMDAwMDAwMEUtMTkxIDAuMzAwMDAwMDAwMEUtMTkxIC0+IDkuMDAwMDAwMDAwMDAwMDBFLTM4NCBTdWJub3JtYWwgUm91bmRlZAorbXVseDkwMSBtdWx0aXBseSAgMC4zMDAwMDAwMDAxRS0xOTEgMC4zMDAwMDAwMDAxRS0xOTEgLT4gOS4wMDAwMDAwMDYwMDAwMEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCittdWx4OTAyIG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTkgICAgICAgICAtPiA5Ljk5OTk5OTk5OTk5MDAwRS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK211bHg5MDMgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTkgICAgICAgIC0+IDkuOTk5OTk5OTk5OTk5MDBFLTM4NCBVbmRlcmZsb3cgSW5leGFjdCBTdWJub3JtYWwgUm91bmRlZAorbXVseDkwNCBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMC4wOTk5OTk5OTk5OTk5OTkgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5MEUtMzg0IFVuZGVyZmxvdyBJbmV4YWN0IFN1Ym5vcm1hbCBSb3VuZGVkCittdWx4OTA1IG11bHRpcGx5ICA5Ljk5OTk5OTk5OTk5OTk5OUUtMzgzICAwLjA5OTk5OTk5OTk5OTk5OTkgICAgICAtPiA5Ljk5OTk5OTk5OTk5OTk5RS0zODQgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKy0tIHByb3ZlIG9wZXJhbmRzIGFyZSBleGFjdAorbXVseDkwNiBtdWx0aXBseSAgOS45OTk5OTk5OTk5OTk5OTlFLTM4MyAgMSAgICAgICAgICAgICAgICAgICAgICAgLT4gOS45OTk5OTk5OTk5OTk5OTlFLTM4MworbXVseDkwNyBtdWx0aXBseSAgICAgICAgICAgICAgICAgICAgICAgMSAgMC4wOTk5OTk5OTk5OTk5OTk5OSAgICAgLT4gMC4wOTk5OTk5OTk5OTk5OTk5OQorLS0gdGhlIG5leHQgcm91bmRzIHRvIE5taW4KK211bHg5MDggbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OTkgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK211bHg5MDkgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OTk5ICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK211bHg5MTAgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OTk5OSAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKK211bHg5MTEgbXVsdGlwbHkgIDkuOTk5OTk5OTk5OTk5OTk5RS0zODMgIDAuMDk5OTk5OTk5OTk5OTk5OTk5OTkgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRS0zODMgVW5kZXJmbG93IEluZXhhY3QgU3Vibm9ybWFsIFJvdW5kZWQKKworCistLSBFeGFtcGxlcyBmcm9tIFNRTCBwcm9wb3NhbCAoS3Jpc2huYSBLdWxrYXJuaSkKK3ByZWNpc2lvbjogICAzNAorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA2MTQ0CittaW5FeHBvbmVudDogLTYxNDMKK211bHgxMDAxICBtdWx0aXBseSAxMzBFLTIgIDEyMEUtMiAtPiAxLjU2MDAKK211bHgxMDAyICBtdWx0aXBseSAxMzBFLTIgIDEyRS0xICAtPiAxLjU2MAorbXVseDEwMDMgIG11bHRpcGx5IDEzMEUtMiAgMUUwICAgIC0+IDEuMzAKK211bHgxMDA0ICBtdWx0aXBseSAxRTIgICAgIDFFNCAgICAtPiAxRSs2CisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZQorcHJlY2lzaW9uOiA1CittdWx4MTAxMCAgbXVsdGlwbHkgMTEgLXNOYU4xMjM0NTY3ODkwIC0+IC1OYU42Nzg5MCAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworbXVseDk5MCBtdWx0aXBseSAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK211bHg5OTEgbXVsdGlwbHkgICMgMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dG1pbnVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL25leHRtaW51cy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMWM1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL25leHRtaW51cy5kZWNUZXN0CkBAIC0wLDAgKzEsMTQ4IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIG5leHRtaW51cy5kZWNUZXN0IC0tIGRlY2ltYWwgbmV4dCB0aGF0IGlzIGxlc3MgWzc1NHIgbmV4dGRvd25dICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworbmV4dG0wMDEgbmV4dG1pbnVzICAwLjk5OTk5OTk5NSAtPiAgIDAuOTk5OTk5OTk0CituZXh0bTAwMiBuZXh0bWludXMgIDAuOTk5OTk5OTk2IC0+ICAgMC45OTk5OTk5OTUKK25leHRtMDAzIG5leHRtaW51cyAgMC45OTk5OTk5OTcgLT4gICAwLjk5OTk5OTk5NgorbmV4dG0wMDQgbmV4dG1pbnVzICAwLjk5OTk5OTk5OCAtPiAgIDAuOTk5OTk5OTk3CituZXh0bTAwNSBuZXh0bWludXMgIDAuOTk5OTk5OTk5IC0+ICAgMC45OTk5OTk5OTgKK25leHRtMDA2IG5leHRtaW51cyAgMS4wMDAwMDAwMCAgLT4gICAwLjk5OTk5OTk5OQorbmV4dG0wMDcgbmV4dG1pbnVzICAxLjAgICAgICAgICAtPiAgIDAuOTk5OTk5OTk5CituZXh0bTAwOCBuZXh0bWludXMgIDEgICAgICAgICAgIC0+ICAgMC45OTk5OTk5OTkKK25leHRtMDA5IG5leHRtaW51cyAgMS4wMDAwMDAwMSAgLT4gICAxLjAwMDAwMDAwCituZXh0bTAxMCBuZXh0bWludXMgIDEuMDAwMDAwMDIgIC0+ICAgMS4wMDAwMDAwMQorbmV4dG0wMTEgbmV4dG1pbnVzICAxLjAwMDAwMDAzICAtPiAgIDEuMDAwMDAwMDIKK25leHRtMDEyIG5leHRtaW51cyAgMS4wMDAwMDAwNCAgLT4gICAxLjAwMDAwMDAzCituZXh0bTAxMyBuZXh0bWludXMgIDEuMDAwMDAwMDUgIC0+ICAgMS4wMDAwMDAwNAorbmV4dG0wMTQgbmV4dG1pbnVzICAxLjAwMDAwMDA2ICAtPiAgIDEuMDAwMDAwMDUKK25leHRtMDE1IG5leHRtaW51cyAgMS4wMDAwMDAwNyAgLT4gICAxLjAwMDAwMDA2CituZXh0bTAxNiBuZXh0bWludXMgIDEuMDAwMDAwMDggIC0+ICAgMS4wMDAwMDAwNworbmV4dG0wMTcgbmV4dG1pbnVzICAxLjAwMDAwMDA5ICAtPiAgIDEuMDAwMDAwMDgKK25leHRtMDE4IG5leHRtaW51cyAgMS4wMDAwMDAxMCAgLT4gICAxLjAwMDAwMDA5CituZXh0bTAxOSBuZXh0bWludXMgIDEuMDAwMDAwMTEgIC0+ICAgMS4wMDAwMDAxMAorbmV4dG0wMjAgbmV4dG1pbnVzICAxLjAwMDAwMDEyICAtPiAgIDEuMDAwMDAwMTEKKworbmV4dG0wMjEgbmV4dG1pbnVzIC0wLjk5OTk5OTk5NSAtPiAgLTAuOTk5OTk5OTk2CituZXh0bTAyMiBuZXh0bWludXMgLTAuOTk5OTk5OTk2IC0+ICAtMC45OTk5OTk5OTcKK25leHRtMDIzIG5leHRtaW51cyAtMC45OTk5OTk5OTcgLT4gIC0wLjk5OTk5OTk5OAorbmV4dG0wMjQgbmV4dG1pbnVzIC0wLjk5OTk5OTk5OCAtPiAgLTAuOTk5OTk5OTk5CituZXh0bTAyNSBuZXh0bWludXMgLTAuOTk5OTk5OTk5IC0+ICAtMS4wMDAwMDAwMAorbmV4dG0wMjYgbmV4dG1pbnVzIC0xLjAwMDAwMDAwICAtPiAgLTEuMDAwMDAwMDEKK25leHRtMDI3IG5leHRtaW51cyAtMS4wICAgICAgICAgLT4gIC0xLjAwMDAwMDAxCituZXh0bTAyOCBuZXh0bWludXMgLTEgICAgICAgICAgIC0+ICAtMS4wMDAwMDAwMQorbmV4dG0wMjkgbmV4dG1pbnVzIC0xLjAwMDAwMDAxICAtPiAgLTEuMDAwMDAwMDIKK25leHRtMDMwIG5leHRtaW51cyAtMS4wMDAwMDAwMiAgLT4gIC0xLjAwMDAwMDAzCituZXh0bTAzMSBuZXh0bWludXMgLTEuMDAwMDAwMDMgIC0+ICAtMS4wMDAwMDAwNAorbmV4dG0wMzIgbmV4dG1pbnVzIC0xLjAwMDAwMDA0ICAtPiAgLTEuMDAwMDAwMDUKK25leHRtMDMzIG5leHRtaW51cyAtMS4wMDAwMDAwNSAgLT4gIC0xLjAwMDAwMDA2CituZXh0bTAzNCBuZXh0bWludXMgLTEuMDAwMDAwMDYgIC0+ICAtMS4wMDAwMDAwNworbmV4dG0wMzUgbmV4dG1pbnVzIC0xLjAwMDAwMDA3ICAtPiAgLTEuMDAwMDAwMDgKK25leHRtMDM2IG5leHRtaW51cyAtMS4wMDAwMDAwOCAgLT4gIC0xLjAwMDAwMDA5CituZXh0bTAzNyBuZXh0bWludXMgLTEuMDAwMDAwMDkgIC0+ICAtMS4wMDAwMDAxMAorbmV4dG0wMzggbmV4dG1pbnVzIC0xLjAwMDAwMDEwICAtPiAgLTEuMDAwMDAwMTEKK25leHRtMDM5IG5leHRtaW51cyAtMS4wMDAwMDAxMSAgLT4gIC0xLjAwMDAwMDEyCisKKy0tIGlucHV0IG9wZXJhbmQgaXMgPnByZWNpc2lvbgorbmV4dG0wNDEgbmV4dG1pbnVzICAxLjAwMDAwMDEwOTk4ICAtPiAgIDEuMDAwMDAwMTAKK25leHRtMDQyIG5leHRtaW51cyAgMS4wMDAwMDAxMDk5OSAgLT4gICAxLjAwMDAwMDEwCituZXh0bTA0MyBuZXh0bWludXMgIDEuMDAwMDAwMTEwMDAgIC0+ICAgMS4wMDAwMDAxMAorbmV4dG0wNDQgbmV4dG1pbnVzICAxLjAwMDAwMDExMDAxICAtPiAgIDEuMDAwMDAwMTEKK25leHRtMDQ1IG5leHRtaW51cyAgMS4wMDAwMDAxMTAwMiAgLT4gICAxLjAwMDAwMDExCituZXh0bTA0NiBuZXh0bWludXMgIDEuMDAwMDAwMTEwMDIgIC0+ICAgMS4wMDAwMDAxMQorbmV4dG0wNDcgbmV4dG1pbnVzICAxLjAwMDAwMDExMDUyICAtPiAgIDEuMDAwMDAwMTEKK25leHRtMDQ4IG5leHRtaW51cyAgMS4wMDAwMDAxMTU1MiAgLT4gICAxLjAwMDAwMDExCituZXh0bTA0OSBuZXh0bWludXMgLTEuMDAwMDAwMTA5OTggIC0+ICAtMS4wMDAwMDAxMQorbmV4dG0wNTAgbmV4dG1pbnVzIC0xLjAwMDAwMDEwOTk5ICAtPiAgLTEuMDAwMDAwMTEKK25leHRtMDUxIG5leHRtaW51cyAtMS4wMDAwMDAxMTAwMCAgLT4gIC0xLjAwMDAwMDEyCituZXh0bTA1MiBuZXh0bWludXMgLTEuMDAwMDAwMTEwMDEgIC0+ICAtMS4wMDAwMDAxMgorbmV4dG0wNTMgbmV4dG1pbnVzIC0xLjAwMDAwMDExMDAyICAtPiAgLTEuMDAwMDAwMTIKK25leHRtMDU0IG5leHRtaW51cyAtMS4wMDAwMDAxMTAwMiAgLT4gIC0xLjAwMDAwMDEyCituZXh0bTA1NSBuZXh0bWludXMgLTEuMDAwMDAwMTEwNTIgIC0+ICAtMS4wMDAwMDAxMgorbmV4dG0wNTYgbmV4dG1pbnVzIC0xLjAwMDAwMDExNTUyICAtPiAgLTEuMDAwMDAwMTIKKy0tIHVsdHJhLXRpbnkgaW5wdXRzCituZXh0bTA2MCBuZXh0bWludXMgIDFFLTk5OTk5ICAgICAgIC0+ICAgMEUtMzkxCituZXh0bTA2MSBuZXh0bWludXMgIDFFLTk5OTk5OTk5OSAgIC0+ICAgMEUtMzkxCituZXh0bTA2MiBuZXh0bWludXMgIDFFLTM5MSAgICAgICAgIC0+ICAgMEUtMzkxCituZXh0bTA2MyBuZXh0bWludXMgLTFFLTk5OTk5ICAgICAgIC0+ICAtMUUtMzkxCituZXh0bTA2NCBuZXh0bWludXMgLTFFLTk5OTk5OTk5OSAgIC0+ICAtMUUtMzkxCituZXh0bTA2NSBuZXh0bWludXMgLTFFLTM5MSAgICAgICAgIC0+ICAtMkUtMzkxCisKKy0tIFplcm9zCituZXh0bTEwMCBuZXh0bWludXMgLTAgICAgICAgICAgIC0+IC0xRS0zOTEKK25leHRtMTAxIG5leHRtaW51cyAgMCAgICAgICAgICAgLT4gLTFFLTM5MQorbmV4dG0xMDIgbmV4dG1pbnVzICAwLjAwICAgICAgICAtPiAtMUUtMzkxCituZXh0bTEwMyBuZXh0bWludXMgLTAuMDAgICAgICAgIC0+IC0xRS0zOTEKK25leHRtMTA0IG5leHRtaW51cyAgMEUtMzAwICAgICAgLT4gLTFFLTM5MQorbmV4dG0xMDUgbmV4dG1pbnVzICAwRSszMDAgICAgICAtPiAtMUUtMzkxCituZXh0bTEwNiBuZXh0bWludXMgIDBFKzMwMDAwICAgIC0+IC0xRS0zOTEKK25leHRtMTA3IG5leHRtaW51cyAtMEUrMzAwMDAgICAgLT4gLTFFLTM5MQorCitwcmVjaXNpb246IDkKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CistLSBzcGVjaWFscworbmV4dG0xNTAgbmV4dG1pbnVzICAgSW5mICAgIC0+ICA5Ljk5OTk5OTk5RSs5OTkKK25leHRtMTUxIG5leHRtaW51cyAgLUluZiAgICAtPiAtSW5maW5pdHkKK25leHRtMTUyIG5leHRtaW51cyAgIE5hTiAgICAtPiAgTmFOCituZXh0bTE1MyBuZXh0bWludXMgIHNOYU4gICAgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCituZXh0bTE1NCBuZXh0bWludXMgICBOYU43NyAgLT4gIE5hTjc3CituZXh0bTE1NSBuZXh0bWludXMgIHNOYU44OCAgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCituZXh0bTE1NiBuZXh0bWludXMgIC1OYU4gICAgLT4gLU5hTgorbmV4dG0xNTcgbmV4dG1pbnVzIC1zTmFOICAgIC0+IC1OYU4gICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dG0xNTggbmV4dG1pbnVzICAtTmFONzcgIC0+IC1OYU43NworbmV4dG0xNTkgbmV4dG1pbnVzIC1zTmFOODggIC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworbmV4dG0xNzAgbmV4dG1pbnVzICA5Ljk5OTk5OTk5RSs5OTkgICAtPiA5Ljk5OTk5OTk4RSs5OTkKK25leHRtMTcxIG5leHRtaW51cyAgOS45OTk5OTk5OEUrOTk5ICAgLT4gOS45OTk5OTk5N0UrOTk5CituZXh0bTE3MiBuZXh0bWludXMgIDFFLTk5OSAgICAgICAgICAgIC0+IDkuOTk5OTk5OUUtMTAwMAorbmV4dG0xNzMgbmV4dG1pbnVzICAxLjAwMDAwMDAwRS05OTkgICAtPiA5Ljk5OTk5OTlFLTEwMDAKK25leHRtMTc0IG5leHRtaW51cyAgOUUtMTAwNyAgICAgICAgICAgLT4gOEUtMTAwNworbmV4dG0xNzUgbmV4dG1pbnVzICA5LjlFLTEwMDYgICAgICAgICAtPiA5LjhFLTEwMDYKK25leHRtMTc2IG5leHRtaW51cyAgOS45OTk5RS0xMDAzICAgICAgLT4gOS45OTk4RS0xMDAzCituZXh0bTE3NyBuZXh0bWludXMgIDkuOTk5OTk5OUUtMTAwMCAgIC0+IDkuOTk5OTk5OEUtMTAwMAorbmV4dG0xNzggbmV4dG1pbnVzICA5Ljk5OTk5OThFLTEwMDAgICAtPiA5Ljk5OTk5OTdFLTEwMDAKK25leHRtMTc5IG5leHRtaW51cyAgOS45OTk5OTk3RS0xMDAwICAgLT4gOS45OTk5OTk2RS0xMDAwCituZXh0bTE4MCBuZXh0bWludXMgIDBFLTEwMDcgICAgICAgICAgIC0+IC0xRS0xMDA3CituZXh0bTE4MSBuZXh0bWludXMgIDFFLTEwMDcgICAgICAgICAgIC0+IDBFLTEwMDcKK25leHRtMTgyIG5leHRtaW51cyAgMkUtMTAwNyAgICAgICAgICAgLT4gMUUtMTAwNworCituZXh0bTE4MyBuZXh0bWludXMgIC0wRS0xMDA3ICAgICAgICAgIC0+IC0xRS0xMDA3CituZXh0bTE4NCBuZXh0bWludXMgIC0xRS0xMDA3ICAgICAgICAgIC0+IC0yRS0xMDA3CituZXh0bTE4NSBuZXh0bWludXMgIC0yRS0xMDA3ICAgICAgICAgIC0+IC0zRS0xMDA3CituZXh0bTE4NiBuZXh0bWludXMgIC0xMEUtMTAwNyAgICAgICAgIC0+IC0xLjFFLTEwMDYKK25leHRtMTg3IG5leHRtaW51cyAgLTEwMEUtMTAwNyAgICAgICAgLT4gLTEuMDFFLTEwMDUKK25leHRtMTg4IG5leHRtaW51cyAgLTEwMDAwMEUtMTAwNyAgICAgLT4gLTEuMDAwMDFFLTEwMDIKK25leHRtMTg5IG5leHRtaW51cyAgLTEuMDAwMEUtOTk5ICAgICAgLT4gLTEuMDAwMDAwMDFFLTk5OQorbmV4dG0xOTAgbmV4dG1pbnVzICAtMS4wMDAwMDAwMEUtOTk5ICAtPiAtMS4wMDAwMDAwMUUtOTk5CituZXh0bTE5MSBuZXh0bWludXMgIC0xRS05OTkgICAgICAgICAgIC0+IC0xLjAwMDAwMDAxRS05OTkKK25leHRtMTkyIG5leHRtaW51cyAgLTkuOTk5OTk5OThFKzk5OSAgLT4gLTkuOTk5OTk5OTlFKzk5OQorbmV4dG0xOTMgbmV4dG1pbnVzICAtOS45OTk5OTk5OUUrOTk5ICAtPiAtSW5maW5pdHkKKworLS0gTnVsbCB0ZXN0cworbmV4dG05MDAgbmV4dG1pbnVzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL25leHRwbHVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL25leHRwbHVzLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY2ZTMyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dHBsdXMuZGVjVGVzdApAQCAtMCwwICsxLDE1MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBuZXh0cGx1cy5kZWNUZXN0IC0tIGRlY2ltYWwgbmV4dCB0aGF0IGlzIGdyZWF0ZXIgWzc1NHIgbmV4dHVwXSAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK25leHRwMDAxIG5leHRwbHVzICAwLjk5OTk5OTk5NSAtPiAgIDAuOTk5OTk5OTk2CituZXh0cDAwMiBuZXh0cGx1cyAgMC45OTk5OTk5OTYgLT4gICAwLjk5OTk5OTk5NworbmV4dHAwMDMgbmV4dHBsdXMgIDAuOTk5OTk5OTk3IC0+ICAgMC45OTk5OTk5OTgKK25leHRwMDA0IG5leHRwbHVzICAwLjk5OTk5OTk5OCAtPiAgIDAuOTk5OTk5OTk5CituZXh0cDAwNSBuZXh0cGx1cyAgMC45OTk5OTk5OTkgLT4gICAxLjAwMDAwMDAwCituZXh0cDAwNiBuZXh0cGx1cyAgMS4wMDAwMDAwMCAgLT4gICAxLjAwMDAwMDAxCituZXh0cDAwNyBuZXh0cGx1cyAgMS4wICAgICAgICAgLT4gICAxLjAwMDAwMDAxCituZXh0cDAwOCBuZXh0cGx1cyAgMSAgICAgICAgICAgLT4gICAxLjAwMDAwMDAxCituZXh0cDAwOSBuZXh0cGx1cyAgMS4wMDAwMDAwMSAgLT4gICAxLjAwMDAwMDAyCituZXh0cDAxMCBuZXh0cGx1cyAgMS4wMDAwMDAwMiAgLT4gICAxLjAwMDAwMDAzCituZXh0cDAxMSBuZXh0cGx1cyAgMS4wMDAwMDAwMyAgLT4gICAxLjAwMDAwMDA0CituZXh0cDAxMiBuZXh0cGx1cyAgMS4wMDAwMDAwNCAgLT4gICAxLjAwMDAwMDA1CituZXh0cDAxMyBuZXh0cGx1cyAgMS4wMDAwMDAwNSAgLT4gICAxLjAwMDAwMDA2CituZXh0cDAxNCBuZXh0cGx1cyAgMS4wMDAwMDAwNiAgLT4gICAxLjAwMDAwMDA3CituZXh0cDAxNSBuZXh0cGx1cyAgMS4wMDAwMDAwNyAgLT4gICAxLjAwMDAwMDA4CituZXh0cDAxNiBuZXh0cGx1cyAgMS4wMDAwMDAwOCAgLT4gICAxLjAwMDAwMDA5CituZXh0cDAxNyBuZXh0cGx1cyAgMS4wMDAwMDAwOSAgLT4gICAxLjAwMDAwMDEwCituZXh0cDAxOCBuZXh0cGx1cyAgMS4wMDAwMDAxMCAgLT4gICAxLjAwMDAwMDExCituZXh0cDAxOSBuZXh0cGx1cyAgMS4wMDAwMDAxMSAgLT4gICAxLjAwMDAwMDEyCisKK25leHRwMDIxIG5leHRwbHVzIC0wLjk5OTk5OTk5NSAtPiAgLTAuOTk5OTk5OTk0CituZXh0cDAyMiBuZXh0cGx1cyAtMC45OTk5OTk5OTYgLT4gIC0wLjk5OTk5OTk5NQorbmV4dHAwMjMgbmV4dHBsdXMgLTAuOTk5OTk5OTk3IC0+ICAtMC45OTk5OTk5OTYKK25leHRwMDI0IG5leHRwbHVzIC0wLjk5OTk5OTk5OCAtPiAgLTAuOTk5OTk5OTk3CituZXh0cDAyNSBuZXh0cGx1cyAtMC45OTk5OTk5OTkgLT4gIC0wLjk5OTk5OTk5OAorbmV4dHAwMjYgbmV4dHBsdXMgLTEuMDAwMDAwMDAgIC0+ICAtMC45OTk5OTk5OTkKK25leHRwMDI3IG5leHRwbHVzIC0xLjAgICAgICAgICAtPiAgLTAuOTk5OTk5OTk5CituZXh0cDAyOCBuZXh0cGx1cyAtMSAgICAgICAgICAgLT4gIC0wLjk5OTk5OTk5OQorbmV4dHAwMjkgbmV4dHBsdXMgLTEuMDAwMDAwMDEgIC0+ICAtMS4wMDAwMDAwMAorbmV4dHAwMzAgbmV4dHBsdXMgLTEuMDAwMDAwMDIgIC0+ICAtMS4wMDAwMDAwMQorbmV4dHAwMzEgbmV4dHBsdXMgLTEuMDAwMDAwMDMgIC0+ICAtMS4wMDAwMDAwMgorbmV4dHAwMzIgbmV4dHBsdXMgLTEuMDAwMDAwMDQgIC0+ICAtMS4wMDAwMDAwMworbmV4dHAwMzMgbmV4dHBsdXMgLTEuMDAwMDAwMDUgIC0+ICAtMS4wMDAwMDAwNAorbmV4dHAwMzQgbmV4dHBsdXMgLTEuMDAwMDAwMDYgIC0+ICAtMS4wMDAwMDAwNQorbmV4dHAwMzUgbmV4dHBsdXMgLTEuMDAwMDAwMDcgIC0+ICAtMS4wMDAwMDAwNgorbmV4dHAwMzYgbmV4dHBsdXMgLTEuMDAwMDAwMDggIC0+ICAtMS4wMDAwMDAwNworbmV4dHAwMzcgbmV4dHBsdXMgLTEuMDAwMDAwMDkgIC0+ICAtMS4wMDAwMDAwOAorbmV4dHAwMzggbmV4dHBsdXMgLTEuMDAwMDAwMTAgIC0+ICAtMS4wMDAwMDAwOQorbmV4dHAwMzkgbmV4dHBsdXMgLTEuMDAwMDAwMTEgIC0+ICAtMS4wMDAwMDAxMAorbmV4dHAwNDAgbmV4dHBsdXMgLTEuMDAwMDAwMTIgIC0+ICAtMS4wMDAwMDAxMQorCistLSBpbnB1dCBvcGVyYW5kIGlzID5wcmVjaXNpb24KK25leHRwMDQxIG5leHRwbHVzICAxLjAwMDAwMDEwOTk4ICAtPiAgIDEuMDAwMDAwMTEKK25leHRwMDQyIG5leHRwbHVzICAxLjAwMDAwMDEwOTk5ICAtPiAgIDEuMDAwMDAwMTEKK25leHRwMDQzIG5leHRwbHVzICAxLjAwMDAwMDExMDAwICAtPiAgIDEuMDAwMDAwMTIKK25leHRwMDQ0IG5leHRwbHVzICAxLjAwMDAwMDExMDAxICAtPiAgIDEuMDAwMDAwMTIKK25leHRwMDQ1IG5leHRwbHVzICAxLjAwMDAwMDExMDAyICAtPiAgIDEuMDAwMDAwMTIKK25leHRwMDQ2IG5leHRwbHVzICAxLjAwMDAwMDExMDAyICAtPiAgIDEuMDAwMDAwMTIKK25leHRwMDQ3IG5leHRwbHVzICAxLjAwMDAwMDExMDUyICAtPiAgIDEuMDAwMDAwMTIKK25leHRwMDQ4IG5leHRwbHVzICAxLjAwMDAwMDExNTUyICAtPiAgIDEuMDAwMDAwMTIKK25leHRwMDQ5IG5leHRwbHVzIC0xLjAwMDAwMDEwOTk4ICAtPiAgLTEuMDAwMDAwMTAKK25leHRwMDUwIG5leHRwbHVzIC0xLjAwMDAwMDEwOTk5ICAtPiAgLTEuMDAwMDAwMTAKK25leHRwMDUxIG5leHRwbHVzIC0xLjAwMDAwMDExMDAwICAtPiAgLTEuMDAwMDAwMTAKK25leHRwMDUyIG5leHRwbHVzIC0xLjAwMDAwMDExMDAxICAtPiAgLTEuMDAwMDAwMTEKK25leHRwMDUzIG5leHRwbHVzIC0xLjAwMDAwMDExMDAyICAtPiAgLTEuMDAwMDAwMTEKK25leHRwMDU0IG5leHRwbHVzIC0xLjAwMDAwMDExMDAyICAtPiAgLTEuMDAwMDAwMTEKK25leHRwMDU1IG5leHRwbHVzIC0xLjAwMDAwMDExMDUyICAtPiAgLTEuMDAwMDAwMTEKK25leHRwMDU2IG5leHRwbHVzIC0xLjAwMDAwMDExNTUyICAtPiAgLTEuMDAwMDAwMTEKKy0tIHVsdHJhLXRpbnkgaW5wdXRzCituZXh0cDA2MCBuZXh0cGx1cyAgMUUtOTk5OTkgICAgICAgLT4gICAxRS0zOTEKK25leHRwMDYxIG5leHRwbHVzICAxRS05OTk5OTk5OTkgICAtPiAgIDFFLTM5MQorbmV4dHAwNjIgbmV4dHBsdXMgIDFFLTM5MSAgICAgICAgIC0+ICAgMkUtMzkxCituZXh0cDA2MyBuZXh0cGx1cyAtMUUtOTk5OTkgICAgICAgLT4gIC0wRS0zOTEKK25leHRwMDY0IG5leHRwbHVzIC0xRS05OTk5OTk5OTkgICAtPiAgLTBFLTM5MQorbmV4dHAwNjUgbmV4dHBsdXMgLTFFLTM5MSAgICAgICAgIC0+ICAtMEUtMzkxCisKKy0tIFplcm9zCituZXh0cDEwMCBuZXh0cGx1cyAgMCAgICAgICAgICAgLT4gIDFFLTM5MQorbmV4dHAxMDEgbmV4dHBsdXMgIDAuMDAgICAgICAgIC0+ICAxRS0zOTEKK25leHRwMTAyIG5leHRwbHVzICAwRS0zMDAgICAgICAtPiAgMUUtMzkxCituZXh0cDEwMyBuZXh0cGx1cyAgMEUrMzAwICAgICAgLT4gIDFFLTM5MQorbmV4dHAxMDQgbmV4dHBsdXMgIDBFKzMwMDAwICAgIC0+ICAxRS0zOTEKK25leHRwMTA1IG5leHRwbHVzIC0wICAgICAgICAgICAtPiAgMUUtMzkxCituZXh0cDEwNiBuZXh0cGx1cyAtMC4wMCAgICAgICAgLT4gIDFFLTM5MQorbmV4dHAxMDcgbmV4dHBsdXMgLTBFLTMwMCAgICAgIC0+ICAxRS0zOTEKK25leHRwMTA4IG5leHRwbHVzIC0wRSszMDAgICAgICAtPiAgMUUtMzkxCituZXh0cDEwOSBuZXh0cGx1cyAtMEUrMzAwMDAgICAgLT4gIDFFLTM5MQorCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CistLSBzcGVjaWFscworbmV4dHAxNTAgbmV4dHBsdXMgICBJbmYgICAgLT4gIEluZmluaXR5CituZXh0cDE1MSBuZXh0cGx1cyAgLUluZiAgICAtPiAtOS45OTk5OTk5OUUrOTk5CituZXh0cDE1MiBuZXh0cGx1cyAgIE5hTiAgICAtPiAgTmFOCituZXh0cDE1MyBuZXh0cGx1cyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK25leHRwMTU0IG5leHRwbHVzICAgTmFONzcgIC0+ICBOYU43NworbmV4dHAxNTUgbmV4dHBsdXMgIHNOYU44OCAgLT4gIE5hTjg4IEludmFsaWRfb3BlcmF0aW9uCituZXh0cDE1NiBuZXh0cGx1cyAgLU5hTiAgICAtPiAtTmFOCituZXh0cDE1NyBuZXh0cGx1cyAtc05hTiAgICAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK25leHRwMTU4IG5leHRwbHVzICAtTmFONzcgIC0+IC1OYU43NworbmV4dHAxNTkgbmV4dHBsdXMgLXNOYU44OCAgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE5tYXgsIE5taW4sIE50aW55LCBzdWJub3JtYWxzCituZXh0cDE3MCBuZXh0cGx1cyAgOS45OTk5OTk5OUUrOTk5ICAgLT4gSW5maW5pdHkKK25leHRwMTcxIG5leHRwbHVzICA5Ljk5OTk5OTk4RSs5OTkgICAtPiA5Ljk5OTk5OTk5RSs5OTkKK25leHRwMTcyIG5leHRwbHVzICAxRS05OTkgICAgICAgICAgICAtPiAxLjAwMDAwMDAxRS05OTkKK25leHRwMTczIG5leHRwbHVzICAxLjAwMDAwMDAwRS05OTkgICAtPiAxLjAwMDAwMDAxRS05OTkKK25leHRwMTc0IG5leHRwbHVzICA5RS0xMDA3ICAgICAgICAgICAtPiAxLjBFLTEwMDYKK25leHRwMTc1IG5leHRwbHVzICA5LjlFLTEwMDYgICAgICAgICAtPiAxLjAwRS0xMDA1CituZXh0cDE3NiBuZXh0cGx1cyAgOS45OTk5RS0xMDAzICAgICAgLT4gMS4wMDAwMEUtMTAwMgorbmV4dHAxNzcgbmV4dHBsdXMgIDkuOTk5OTk5OUUtMTAwMCAgIC0+IDEuMDAwMDAwMDBFLTk5OQorbmV4dHAxNzggbmV4dHBsdXMgIDkuOTk5OTk5OEUtMTAwMCAgIC0+IDkuOTk5OTk5OUUtMTAwMAorbmV4dHAxNzkgbmV4dHBsdXMgIDkuOTk5OTk5N0UtMTAwMCAgIC0+IDkuOTk5OTk5OEUtMTAwMAorbmV4dHAxODAgbmV4dHBsdXMgIDBFLTEwMDcgICAgICAgICAgIC0+IDFFLTEwMDcKK25leHRwMTgxIG5leHRwbHVzICAxRS0xMDA3ICAgICAgICAgICAtPiAyRS0xMDA3CituZXh0cDE4MiBuZXh0cGx1cyAgMkUtMTAwNyAgICAgICAgICAgLT4gM0UtMTAwNworCituZXh0cDE4MyBuZXh0cGx1cyAgLTBFLTEwMDcgICAgICAgICAgLT4gIDFFLTEwMDcKK25leHRwMTg0IG5leHRwbHVzICAtMUUtMTAwNyAgICAgICAgICAtPiAtMEUtMTAwNworbmV4dHAxODUgbmV4dHBsdXMgIC0yRS0xMDA3ICAgICAgICAgIC0+IC0xRS0xMDA3CituZXh0cDE4NiBuZXh0cGx1cyAgLTEwRS0xMDA3ICAgICAgICAgLT4gLTlFLTEwMDcKK25leHRwMTg3IG5leHRwbHVzICAtMTAwRS0xMDA3ICAgICAgICAtPiAtOS45RS0xMDA2CituZXh0cDE4OCBuZXh0cGx1cyAgLTEwMDAwMEUtMTAwNyAgICAgLT4gLTkuOTk5OUUtMTAwMworbmV4dHAxODkgbmV4dHBsdXMgIC0xLjAwMDBFLTk5OSAgICAgIC0+IC05Ljk5OTk5OTlFLTEwMDAKK25leHRwMTkwIG5leHRwbHVzICAtMS4wMDAwMDAwMEUtOTk5ICAtPiAtOS45OTk5OTk5RS0xMDAwCituZXh0cDE5MSBuZXh0cGx1cyAgLTFFLTk5OSAgICAgICAgICAgLT4gLTkuOTk5OTk5OUUtMTAwMAorbmV4dHAxOTIgbmV4dHBsdXMgIC05Ljk5OTk5OTk4RSs5OTkgIC0+IC05Ljk5OTk5OTk3RSs5OTkKK25leHRwMTkzIG5leHRwbHVzICAtOS45OTk5OTk5OUUrOTk5ICAtPiAtOS45OTk5OTk5OEUrOTk5CisKKy0tIE51bGwgdGVzdHMKK25leHRwOTAwIG5leHRwbHVzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL25leHR0b3dhcmQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvbmV4dHRvd2FyZC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjM4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL25leHR0b3dhcmQuZGVjVGVzdApAQCAtMCwwICsxLDQyNiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBuZXh0dG93YXJkLmRlY1Rlc3QgLS0gZGVjaW1hbCBuZXh0IHRvd2FyZCByaHMgWzc1NHIgbmV4dGFmdGVyXSAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIFNhbml0eSBjaGVjayB3aXRoIGEgc2NhdHRlcmluZyBvZiBudW1lcmljcworbmV4dHQwMDEgbmV4dHRvd2FyZCAgIDEwICAgIDEwICAgLT4gIDEwCituZXh0dDAwMiBuZXh0dG93YXJkICAtMTAgICAtMTAgICAtPiAtMTAKK25leHR0MDAzIG5leHR0b3dhcmQgICAxICAgICAxMCAgIC0+ICAxLjAwMDAwMDAxCituZXh0dDAwNCBuZXh0dG93YXJkICAgMSAgICAtMTAgICAtPiAgMC45OTk5OTk5OTkKK25leHR0MDA1IG5leHR0b3dhcmQgIC0xICAgICAxMCAgIC0+IC0wLjk5OTk5OTk5OQorbmV4dHQwMDYgbmV4dHRvd2FyZCAgLTEgICAgLTEwICAgLT4gLTEuMDAwMDAwMDEKK25leHR0MDA3IG5leHR0b3dhcmQgICAwICAgICAxMCAgIC0+ICAxRS0zOTEgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MDA4IG5leHR0b3dhcmQgICAwICAgIC0xMCAgIC0+IC0xRS0zOTEgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MDA5IG5leHR0b3dhcmQgICA5Ljk5OTk5OTk5RSszODQgK0luZmluaXR5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK25leHR0MDEwIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5RSszODQgLUluZmluaXR5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworLS0tLS0tLSBsaHM9cmhzCistLSBmaW5pdGVzCituZXh0dDEwMSBuZXh0dG93YXJkICAgICAgICAgIDcgICAgICAgNyAtPiAgNworbmV4dHQxMDIgbmV4dHRvd2FyZCAgICAgICAgIC03ICAgICAgLTcgLT4gLTcKK25leHR0MTAzIG5leHR0b3dhcmQgICAgICAgICA3NSAgICAgIDc1IC0+ICA3NQorbmV4dHQxMDQgbmV4dHRvd2FyZCAgICAgICAgLTc1ICAgICAtNzUgLT4gLTc1CituZXh0dDEwNSBuZXh0dG93YXJkICAgICAgIDcuNTAgICAgIDcuNSAtPiAgNy41MAorbmV4dHQxMDYgbmV4dHRvd2FyZCAgICAgIC03LjUwICAgLTcuNTAgLT4gLTcuNTAKK25leHR0MTA3IG5leHR0b3dhcmQgICAgICAgNy41MDAgNy41MDAwIC0+ICA3LjUwMAorbmV4dHQxMDggbmV4dHRvd2FyZCAgICAgIC03LjUwMCAgIC03LjUgLT4gLTcuNTAwCisKKy0tIHplcm9zCituZXh0dDExMSBuZXh0dG93YXJkICAgICAgICAgIDAgICAgICAgMCAtPiAgMAorbmV4dHQxMTIgbmV4dHRvd2FyZCAgICAgICAgIC0wICAgICAgLTAgLT4gLTAKK25leHR0MTEzIG5leHR0b3dhcmQgICAgICAgMEUrNCAgICAgICAwIC0+ICAwRSs0CituZXh0dDExNCBuZXh0dG93YXJkICAgICAgLTBFKzQgICAgICAtMCAtPiAtMEUrNAorbmV4dHQxMTUgbmV4dHRvd2FyZCAgICAgMC4wMDAwIDAuMDAwMDAgLT4gIDAuMDAwMAorbmV4dHQxMTYgbmV4dHRvd2FyZCAgICAtMC4wMDAwICAgLTAuMDAgLT4gLTAuMDAwMAorbmV4dHQxMTcgbmV4dHRvd2FyZCAgICAgIDBFLTE0MSAgICAgIDAgLT4gIDBFLTE0MQorbmV4dHQxMTggbmV4dHRvd2FyZCAgICAgLTBFLTE0MSAgIC0wMDAgLT4gLTBFLTE0MQorCistLSBmdWxsIGNvZWZmaWNpZW50cywgYWx0ZXJuYXRpbmcgYml0cworbmV4dHQxMjEgbmV4dHRvd2FyZCAgIDI2ODI2ODI2OCAgICAyNjgyNjgyNjggLT4gICAyNjgyNjgyNjgKK25leHR0MTIyIG5leHR0b3dhcmQgIC0yNjgyNjgyNjggICAtMjY4MjY4MjY4IC0+ICAtMjY4MjY4MjY4CituZXh0dDEyMyBuZXh0dG93YXJkICAgMTM0MTM0MTM0ICAgIDEzNDEzNDEzNCAtPiAgIDEzNDEzNDEzNAorbmV4dHQxMjQgbmV4dHRvd2FyZCAgLTEzNDEzNDEzNCAgIC0xMzQxMzQxMzQgLT4gIC0xMzQxMzQxMzQKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK25leHR0MTMxIG5leHR0b3dhcmQgIDkuOTk5OTk5OTlFKzM4NCAgOS45OTk5OTk5OUUrMzg0ICAgLT4gICA5Ljk5OTk5OTk5RSszODQKK25leHR0MTMyIG5leHR0b3dhcmQgIDFFLTM4MyAgICAgICAgICAgMUUtMzgzICAgICAgICAgICAgLT4gICAxRS0zODMKK25leHR0MTMzIG5leHR0b3dhcmQgIDEuMDAwMDAwMDBFLTM4MyAgMS4wMDAwMDAwMEUtMzgzICAgLT4gICAxLjAwMDAwMDAwRS0zODMKK25leHR0MTM0IG5leHR0b3dhcmQgIDFFLTM5MSAgICAgICAgICAgMUUtMzkxICAgICAgICAgICAgLT4gICAxRS0zOTEKKworbmV4dHQxMzUgbmV4dHRvd2FyZCAgLTFFLTM5MSAgICAgICAgICAtMUUtMzkxICAgICAgICAgICAtPiAgLTFFLTM5MQorbmV4dHQxMzYgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDBFLTM4MyAtMS4wMDAwMDAwMEUtMzgzICAtPiAgLTEuMDAwMDAwMDBFLTM4MworbmV4dHQxMzcgbmV4dHRvd2FyZCAgLTFFLTM4MyAgICAgICAgICAtMUUtMzgzICAgICAgICAgICAtPiAgLTFFLTM4MworbmV4dHQxMzggbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTlFKzM4NCAtOS45OTk5OTk5OUUrMzg0ICAtPiAgLTkuOTk5OTk5OTlFKzM4NAorCistLS0tLS0tIGxoczxyaHMKK25leHR0MjAxIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk1IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTYKK25leHR0MjAyIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk2IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTcKK25leHR0MjAzIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk3IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTgKK25leHR0MjA0IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk4IEluZmluaXR5IC0+ICAgMC45OTk5OTk5OTkKK25leHR0MjA1IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5IEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMAorbmV4dHQyMDYgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAxCituZXh0dDIwNyBuZXh0dG93YXJkICAxLjAgICAgICAgICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDEKK25leHR0MjA4IG5leHR0b3dhcmQgIDEgICAgICAgICAgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwMQorbmV4dHQyMDkgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDAyCituZXh0dDIxMCBuZXh0dG93YXJkICAxLjAwMDAwMDAyICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDMKK25leHR0MjExIG5leHR0b3dhcmQgIDEuMDAwMDAwMDMgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwNAorbmV4dHQyMTIgbmV4dHRvd2FyZCAgMS4wMDAwMDAwNCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDA1CituZXh0dDIxMyBuZXh0dG93YXJkICAxLjAwMDAwMDA1ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDYKK25leHR0MjE0IG5leHR0b3dhcmQgIDEuMDAwMDAwMDYgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAwNworbmV4dHQyMTUgbmV4dHRvd2FyZCAgMS4wMDAwMDAwNyAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDA4CituZXh0dDIxNiBuZXh0dG93YXJkICAxLjAwMDAwMDA4ICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMDkKK25leHR0MjE3IG5leHR0b3dhcmQgIDEuMDAwMDAwMDkgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAxMAorbmV4dHQyMTggbmV4dHRvd2FyZCAgMS4wMDAwMDAxMCAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDExCituZXh0dDIxOSBuZXh0dG93YXJkICAxLjAwMDAwMDExICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMTIKKworbmV4dHQyMjEgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTUgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5NAorbmV4dHQyMjIgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTYgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5NQorbmV4dHQyMjMgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTcgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5NgorbmV4dHQyMjQgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTggSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5NworbmV4dHQyMjUgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTkgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OAorbmV4dHQyMjYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMCAgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OQorbmV4dHQyMjcgbmV4dHRvd2FyZCAtMS4wICAgICAgICAgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OQorbmV4dHQyMjggbmV4dHRvd2FyZCAtMSAgICAgICAgICAgSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OQorbmV4dHQyMjkgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMSAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAwCituZXh0dDIzMCBuZXh0dG93YXJkIC0xLjAwMDAwMDAyICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDEKK25leHR0MjMxIG5leHR0b3dhcmQgLTEuMDAwMDAwMDMgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAwMgorbmV4dHQyMzIgbmV4dHRvd2FyZCAtMS4wMDAwMDAwNCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAzCituZXh0dDIzMyBuZXh0dG93YXJkIC0xLjAwMDAwMDA1ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDQKK25leHR0MjM0IG5leHR0b3dhcmQgLTEuMDAwMDAwMDYgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAwNQorbmV4dHQyMzUgbmV4dHRvd2FyZCAtMS4wMDAwMDAwNyAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA2CituZXh0dDIzNiBuZXh0dG93YXJkIC0xLjAwMDAwMDA4ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMDcKK25leHR0MjM3IG5leHR0b3dhcmQgLTEuMDAwMDAwMDkgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAwOAorbmV4dHQyMzggbmV4dHRvd2FyZCAtMS4wMDAwMDAxMCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA5CituZXh0dDIzOSBuZXh0dG93YXJkIC0xLjAwMDAwMDExICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMTAKK25leHR0MjQwIG5leHR0b3dhcmQgLTEuMDAwMDAwMTIgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorCistLSBpbnB1dCBvcGVyYW5kIGlzID5wcmVjaXNpb24KK25leHR0MjQxIG5leHR0b3dhcmQgIDEuMDAwMDAwMTA5OTggIEluZmluaXR5IC0+ICAgMS4wMDAwMDAxMQorbmV4dHQyNDIgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMDk5OSAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDExCituZXh0dDI0MyBuZXh0dG93YXJkICAxLjAwMDAwMDExMDAwICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMTIKK25leHR0MjQ0IG5leHR0b3dhcmQgIDEuMDAwMDAwMTEwMDEgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAxMgorbmV4dHQyNDUgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTAwMiAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDEyCituZXh0dDI0NiBuZXh0dG93YXJkICAxLjAwMDAwMDExMDAyICBJbmZpbml0eSAtPiAgIDEuMDAwMDAwMTIKK25leHR0MjQ3IG5leHR0b3dhcmQgIDEuMDAwMDAwMTEwNTIgIEluZmluaXR5IC0+ICAgMS4wMDAwMDAxMgorbmV4dHQyNDggbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTU1MiAgSW5maW5pdHkgLT4gICAxLjAwMDAwMDEyCituZXh0dDI0OSBuZXh0dG93YXJkIC0xLjAwMDAwMDEwOTk4ICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMTAKK25leHR0MjUwIG5leHR0b3dhcmQgLTEuMDAwMDAwMTA5OTkgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMAorbmV4dHQyNTEgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTAwMCAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEwCituZXh0dDI1MiBuZXh0dG93YXJkIC0xLjAwMDAwMDExMDAxICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMTEKK25leHR0MjUzIG5leHR0b3dhcmQgLTEuMDAwMDAwMTEwMDIgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorbmV4dHQyNTQgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTAwMiAgSW5maW5pdHkgLT4gIC0xLjAwMDAwMDExCituZXh0dDI1NSBuZXh0dG93YXJkIC0xLjAwMDAwMDExMDUyICBJbmZpbml0eSAtPiAgLTEuMDAwMDAwMTEKK25leHR0MjU2IG5leHR0b3dhcmQgLTEuMDAwMDAwMTE1NTIgIEluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorLS0gdWx0cmEtdGlueSBpbnB1dHMKK25leHR0MjYwIG5leHR0b3dhcmQgIDFFLTk5OTk5ICAgICAgIEluZmluaXR5IC0+ICAgMUUtMzkxICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDI2MSBuZXh0dG93YXJkICAxRS05OTk5OTk5OTkgICBJbmZpbml0eSAtPiAgIDFFLTM5MSAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQyNjIgbmV4dHRvd2FyZCAgMUUtMzkxICAgICAgICAgSW5maW5pdHkgLT4gICAyRS0zOTEgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MjYzIG5leHR0b3dhcmQgLTFFLTk5OTk5ICAgICAgIEluZmluaXR5IC0+ICAtMEUtMzkxICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK25leHR0MjY0IG5leHR0b3dhcmQgLTFFLTk5OTk5OTk5OSAgIEluZmluaXR5IC0+ICAtMEUtMzkxICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK25leHR0MjY1IG5leHR0b3dhcmQgLTFFLTM5MSAgICAgICAgIEluZmluaXR5IC0+ICAtMEUtMzkxICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gWmVyb3MKK25leHR0MzAwIG5leHR0b3dhcmQgIDAgICAgICAgICAgIEluZmluaXR5IC0+ICAxRS0zOTEgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDMwMSBuZXh0dG93YXJkICAwLjAwICAgICAgICBJbmZpbml0eSAtPiAgMUUtMzkxICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzMDIgbmV4dHRvd2FyZCAgMEUtMzAwICAgICAgSW5maW5pdHkgLT4gIDFFLTM5MSAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzAzIG5leHR0b3dhcmQgIDBFKzMwMCAgICAgIEluZmluaXR5IC0+ICAxRS0zOTEgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDMwNCBuZXh0dG93YXJkICAwRSszMDAwMCAgICBJbmZpbml0eSAtPiAgMUUtMzkxICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzMDUgbmV4dHRvd2FyZCAtMCAgICAgICAgICAgSW5maW5pdHkgLT4gIDFFLTM5MSAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzA2IG5leHR0b3dhcmQgLTAuMDAgICAgICAgIEluZmluaXR5IC0+ICAxRS0zOTEgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDMwNyBuZXh0dG93YXJkIC0wRS0zMDAgICAgICBJbmZpbml0eSAtPiAgMUUtMzkxICAgICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzMDggbmV4dHRvd2FyZCAtMEUrMzAwICAgICAgSW5maW5pdHkgLT4gIDFFLTM5MSAgICAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzA5IG5leHR0b3dhcmQgLTBFKzMwMDAwICAgIEluZmluaXR5IC0+ICAxRS0zOTEgICAgICAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNwZWNpYWxzCituZXh0dDM1MCBuZXh0dG93YXJkICAgSW5mICAgIEluZmluaXR5IC0+ICBJbmZpbml0eQorbmV4dHQzNTEgbmV4dHRvd2FyZCAgLUluZiAgICBJbmZpbml0eSAtPiAtOS45OTk5OTk5OUUrMzg0CituZXh0dDM1MiBuZXh0dG93YXJkICAgTmFOICAgIEluZmluaXR5IC0+ICBOYU4KK25leHR0MzUzIG5leHR0b3dhcmQgIHNOYU4gICAgSW5maW5pdHkgLT4gIE5hTiAgIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDM1NCBuZXh0dG93YXJkICAgTmFONzcgIEluZmluaXR5IC0+ICBOYU43NworbmV4dHQzNTUgbmV4dHRvd2FyZCAgc05hTjg4ICBJbmZpbml0eSAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KK25leHR0MzU2IG5leHR0b3dhcmQgIC1OYU4gICAgSW5maW5pdHkgLT4gLU5hTgorbmV4dHQzNTcgbmV4dHRvd2FyZCAtc05hTiAgICBJbmZpbml0eSAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0MzU4IG5leHR0b3dhcmQgIC1OYU43NyAgSW5maW5pdHkgLT4gLU5hTjc3CituZXh0dDM1OSBuZXh0dG93YXJkIC1zTmFOODggIEluZmluaXR5IC0+IC1OYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCistLSBObWF4LCBObWluLCBOdGlueSwgc3Vibm9ybWFscworbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK25leHR0MzcwIG5leHR0b3dhcmQgIDkuOTk5OTk5OTlFKzk5OSAgIEluZmluaXR5IC0+IEluZmluaXR5ICAgICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzcxIG5leHR0b3dhcmQgIDkuOTk5OTk5OThFKzk5OSAgIEluZmluaXR5IC0+IDkuOTk5OTk5OTlFKzk5OQorbmV4dHQzNzIgbmV4dHRvd2FyZCAgMUUtOTk5ICAgICAgICAgICAgSW5maW5pdHkgLT4gMS4wMDAwMDAwMUUtOTk5CituZXh0dDM3MyBuZXh0dG93YXJkICAxLjAwMDAwMDAwRS05OTkgICBJbmZpbml0eSAtPiAxLjAwMDAwMDAxRS05OTkKK25leHR0Mzc0IG5leHR0b3dhcmQgIDAuOTk5OTk5OTk5RS05OTkgIEluZmluaXR5IC0+IDEuMDAwMDAwMDBFLTk5OQorbmV4dHQzNzUgbmV4dHRvd2FyZCAgMC45OTk5OTk5OUUtOTk5ICAgSW5maW5pdHkgLT4gMS4wMDAwMDAwMEUtOTk5CituZXh0dDM3NiBuZXh0dG93YXJkICA5RS0xMDA3ICAgICAgICAgICBJbmZpbml0eSAtPiAxLjBFLTEwMDYgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0Mzc3IG5leHR0b3dhcmQgIDkuOUUtMTAwNiAgICAgICAgIEluZmluaXR5IC0+IDEuMDBFLTEwMDUgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzNzggbmV4dHRvd2FyZCAgOS45OTk5RS0xMDAzICAgICAgSW5maW5pdHkgLT4gMS4wMDAwMEUtMTAwMiAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM3OSBuZXh0dG93YXJkICA5Ljk5OTk5OThFLTEwMDAgICBJbmZpbml0eSAtPiA5Ljk5OTk5OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzgwIG5leHR0b3dhcmQgIDkuOTk5OTk5N0UtMTAwMCAgIEluZmluaXR5IC0+IDkuOTk5OTk5OEUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzODEgbmV4dHRvd2FyZCAgMEUtMTAwNyAgICAgICAgICAgSW5maW5pdHkgLT4gMUUtMTAwNyAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM4MiBuZXh0dG93YXJkICAxRS0xMDA3ICAgICAgICAgICBJbmZpbml0eSAtPiAyRS0xMDA3ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzgzIG5leHR0b3dhcmQgIDJFLTEwMDcgICAgICAgICAgIEluZmluaXR5IC0+IDNFLTEwMDcgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCituZXh0dDM4NSBuZXh0dG93YXJkICAtMEUtMTAwNyAgICAgICAgICBJbmZpbml0eSAtPiAgMUUtMTAwNyAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0Mzg2IG5leHR0b3dhcmQgIC0xRS0xMDA3ICAgICAgICAgIEluZmluaXR5IC0+IC0wRS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCituZXh0dDM4NyBuZXh0dG93YXJkICAtMkUtMTAwNyAgICAgICAgICBJbmZpbml0eSAtPiAtMUUtMTAwNyAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0Mzg4IG5leHR0b3dhcmQgIC0xMEUtMTAwNyAgICAgICAgIEluZmluaXR5IC0+IC05RS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzODkgbmV4dHRvd2FyZCAgLTEwMEUtMTAwNyAgICAgICAgSW5maW5pdHkgLT4gLTkuOUUtMTAwNiAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM5MCBuZXh0dG93YXJkICAtMTAwMDAwRS0xMDA3ICAgICBJbmZpbml0eSAtPiAtOS45OTk5RS0xMDAzICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0MzkxIG5leHR0b3dhcmQgIC0xLjAwMDBFLTk5OSAgICAgIEluZmluaXR5IC0+IC05Ljk5OTk5OTlFLTEwMDAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDM5MiBuZXh0dG93YXJkICAtMS4wMDAwMDAwMEUtOTk5ICBJbmZpbml0eSAtPiAtOS45OTk5OTk5RS0xMDAwICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQzOTMgbmV4dHRvd2FyZCAgLTFFLTk5OSAgICAgICAgICAgSW5maW5pdHkgLT4gLTkuOTk5OTk5OUUtMTAwMCAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0Mzk0IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk4RSs5OTkgIEluZmluaXR5IC0+IC05Ljk5OTk5OTk3RSs5OTkKK25leHR0Mzk1IG5leHR0b3dhcmQgIC05Ljk5OTk5OTk5RSs5OTkgIEluZmluaXR5IC0+IC05Ljk5OTk5OTk4RSs5OTkKKworLS0tLS0tLSBsaHM+cmhzCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworbmV4dHQ0MDEgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTUgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk0CituZXh0dDQwMiBuZXh0dG93YXJkICAwLjk5OTk5OTk5NiAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTUKK25leHR0NDAzIG5leHR0b3dhcmQgIDAuOTk5OTk5OTk3ICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5NgorbmV4dHQ0MDQgbmV4dHRvd2FyZCAgMC45OTk5OTk5OTggIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk3CituZXh0dDQwNSBuZXh0dG93YXJkICAwLjk5OTk5OTk5OSAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTgKK25leHR0NDA2IG5leHR0b3dhcmQgIDEuMDAwMDAwMDAgICAtSW5maW5pdHkgLT4gICAwLjk5OTk5OTk5OQorbmV4dHQ0MDcgbmV4dHRvd2FyZCAgMS4wICAgICAgICAgIC1JbmZpbml0eSAtPiAgIDAuOTk5OTk5OTk5CituZXh0dDQwOCBuZXh0dG93YXJkICAxICAgICAgICAgICAgLUluZmluaXR5IC0+ICAgMC45OTk5OTk5OTkKK25leHR0NDA5IG5leHR0b3dhcmQgIDEuMDAwMDAwMDEgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAwCituZXh0dDQxMCBuZXh0dG93YXJkICAxLjAwMDAwMDAyICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwMQorbmV4dHQ0MTEgbmV4dHRvd2FyZCAgMS4wMDAwMDAwMyAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDIKK25leHR0NDEyIG5leHR0b3dhcmQgIDEuMDAwMDAwMDQgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDAzCituZXh0dDQxMyBuZXh0dG93YXJkICAxLjAwMDAwMDA1ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwNAorbmV4dHQ0MTQgbmV4dHRvd2FyZCAgMS4wMDAwMDAwNiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDUKK25leHR0NDE1IG5leHR0b3dhcmQgIDEuMDAwMDAwMDcgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDA2CituZXh0dDQxNiBuZXh0dG93YXJkICAxLjAwMDAwMDA4ICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAwNworbmV4dHQ0MTcgbmV4dHRvd2FyZCAgMS4wMDAwMDAwOSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMDgKK25leHR0NDE4IG5leHR0b3dhcmQgIDEuMDAwMDAwMTAgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDA5CituZXh0dDQxOSBuZXh0dG93YXJkICAxLjAwMDAwMDExICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAxMAorbmV4dHQ0MjAgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMTEKKworbmV4dHQ0MjEgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTUgIC1JbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk2CituZXh0dDQyMiBuZXh0dG93YXJkIC0wLjk5OTk5OTk5NiAgLUluZmluaXR5IC0+ICAtMC45OTk5OTk5OTcKK25leHR0NDIzIG5leHR0b3dhcmQgLTAuOTk5OTk5OTk3ICAtSW5maW5pdHkgLT4gIC0wLjk5OTk5OTk5OAorbmV4dHQ0MjQgbmV4dHRvd2FyZCAtMC45OTk5OTk5OTggIC1JbmZpbml0eSAtPiAgLTAuOTk5OTk5OTk5CituZXh0dDQyNSBuZXh0dG93YXJkIC0wLjk5OTk5OTk5OSAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMAorbmV4dHQ0MjYgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDEKK25leHR0NDI3IG5leHR0b3dhcmQgLTEuMCAgICAgICAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAxCituZXh0dDQyOCBuZXh0dG93YXJkIC0xICAgICAgICAgICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwMQorbmV4dHQ0MjkgbmV4dHRvd2FyZCAtMS4wMDAwMDAwMSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDIKK25leHR0NDMwIG5leHR0b3dhcmQgLTEuMDAwMDAwMDIgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDAzCituZXh0dDQzMSBuZXh0dG93YXJkIC0xLjAwMDAwMDAzICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwNAorbmV4dHQ0MzIgbmV4dHRvd2FyZCAtMS4wMDAwMDAwNCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDUKK25leHR0NDMzIG5leHR0b3dhcmQgLTEuMDAwMDAwMDUgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA2CituZXh0dDQzNCBuZXh0dG93YXJkIC0xLjAwMDAwMDA2ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAwNworbmV4dHQ0MzUgbmV4dHRvd2FyZCAtMS4wMDAwMDAwNyAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMDgKK25leHR0NDM2IG5leHR0b3dhcmQgLTEuMDAwMDAwMDggICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDA5CituZXh0dDQzNyBuZXh0dG93YXJkIC0xLjAwMDAwMDA5ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMAorbmV4dHQ0MzggbmV4dHRvd2FyZCAtMS4wMDAwMDAxMCAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMTEKK25leHR0NDM5IG5leHR0b3dhcmQgLTEuMDAwMDAwMTEgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEyCisKKy0tIGlucHV0IG9wZXJhbmQgaXMgPnByZWNpc2lvbgorbmV4dHQ0NDEgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMDk5OCAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMTAKK25leHR0NDQyIG5leHR0b3dhcmQgIDEuMDAwMDAwMTA5OTkgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDEwCituZXh0dDQ0MyBuZXh0dG93YXJkICAxLjAwMDAwMDExMDAwICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAxMAorbmV4dHQ0NDQgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTAwMSAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMTEKK25leHR0NDQ1IG5leHR0b3dhcmQgIDEuMDAwMDAwMTEwMDIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDExCituZXh0dDQ0NiBuZXh0dG93YXJkICAxLjAwMDAwMDExMDAyICAgLUluZmluaXR5IC0+ICAgMS4wMDAwMDAxMQorbmV4dHQ0NDcgbmV4dHRvd2FyZCAgMS4wMDAwMDAxMTA1MiAgIC1JbmZpbml0eSAtPiAgIDEuMDAwMDAwMTEKK25leHR0NDQ4IG5leHR0b3dhcmQgIDEuMDAwMDAwMTE1NTIgICAtSW5maW5pdHkgLT4gICAxLjAwMDAwMDExCituZXh0dDQ0OSBuZXh0dG93YXJkIC0xLjAwMDAwMDEwOTk4ICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMQorbmV4dHQ0NTAgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMDk5OSAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMTEKK25leHR0NDUxIG5leHR0b3dhcmQgLTEuMDAwMDAwMTEwMDAgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEyCituZXh0dDQ1MiBuZXh0dG93YXJkIC0xLjAwMDAwMDExMDAxICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMgorbmV4dHQ0NTMgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTAwMiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMTIKK25leHR0NDU0IG5leHR0b3dhcmQgLTEuMDAwMDAwMTEwMDIgICAtSW5maW5pdHkgLT4gIC0xLjAwMDAwMDEyCituZXh0dDQ1NSBuZXh0dG93YXJkIC0xLjAwMDAwMDExMDUyICAgLUluZmluaXR5IC0+ICAtMS4wMDAwMDAxMgorbmV4dHQ0NTYgbmV4dHRvd2FyZCAtMS4wMDAwMDAxMTU1MiAgIC1JbmZpbml0eSAtPiAgLTEuMDAwMDAwMTIKKy0tIHVsdHJhLXRpbnkgaW5wdXRzCituZXh0dDQ2MCBuZXh0dG93YXJkICAxRS05OTk5OSAgICAgICAgLUluZmluaXR5IC0+ICAgMEUtMzkxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCituZXh0dDQ2MSBuZXh0dG93YXJkICAxRS05OTk5OTk5OTkgICAgLUluZmluaXR5IC0+ICAgMEUtMzkxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCituZXh0dDQ2MiBuZXh0dG93YXJkICAxRS0zOTEgICAgICAgICAgLUluZmluaXR5IC0+ICAgMEUtMzkxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCituZXh0dDQ2MyBuZXh0dG93YXJkIC0xRS05OTk5OSAgICAgICAgLUluZmluaXR5IC0+ICAtMUUtMzkxICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ0NjQgbmV4dHRvd2FyZCAtMUUtOTk5OTk5OTk5ICAgIC1JbmZpbml0eSAtPiAgLTFFLTM5MSAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NDY1IG5leHR0b3dhcmQgLTFFLTM5MSAgICAgICAgICAtSW5maW5pdHkgLT4gIC0yRS0zOTEgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIFplcm9zCituZXh0dDUwMCBuZXh0dG93YXJkIC0wICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTEgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1MDEgbmV4dHRvd2FyZCAgMCAgICAgICAgICAgIC1JbmZpbml0eSAtPiAtMUUtMzkxICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTAyIG5leHR0b3dhcmQgIDAuMDAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5MSAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDUwMyBuZXh0dG93YXJkIC0wLjAwICAgICAgICAgLUluZmluaXR5IC0+IC0xRS0zOTEgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1MDQgbmV4dHRvd2FyZCAgMEUtMzAwICAgICAgIC1JbmZpbml0eSAtPiAtMUUtMzkxICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTA1IG5leHR0b3dhcmQgIDBFKzMwMCAgICAgICAtSW5maW5pdHkgLT4gLTFFLTM5MSAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDUwNiBuZXh0dG93YXJkICAwRSszMDAwMCAgICAgLUluZmluaXR5IC0+IC0xRS0zOTEgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1MDcgbmV4dHRvd2FyZCAtMEUrMzAwMDAgICAgIC1JbmZpbml0eSAtPiAtMUUtMzkxICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTA4IG5leHR0b3dhcmQgIDAuMDAgICAgICAgICAtMC4wMDAwICAgLT4gLTAuMDAKKworLS0gc3BlY2lhbHMKK25leHR0NTUwIG5leHR0b3dhcmQgICBJbmYgICAgIC1JbmZpbml0eSAtPiAgOS45OTk5OTk5OUUrMzg0CituZXh0dDU1MSBuZXh0dG93YXJkICAtSW5mICAgICAtSW5maW5pdHkgLT4gLUluZmluaXR5CituZXh0dDU1MiBuZXh0dG93YXJkICAgTmFOICAgICAtSW5maW5pdHkgLT4gIE5hTgorbmV4dHQ1NTMgbmV4dHRvd2FyZCAgc05hTiAgICAgLUluZmluaXR5IC0+ICBOYU4gICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ1NTQgbmV4dHRvd2FyZCAgIE5hTjc3ICAgLUluZmluaXR5IC0+ICBOYU43NworbmV4dHQ1NTUgbmV4dHRvd2FyZCAgc05hTjg4ICAgLUluZmluaXR5IC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ1NTYgbmV4dHRvd2FyZCAgLU5hTiAgICAgLUluZmluaXR5IC0+IC1OYU4KK25leHR0NTU3IG5leHR0b3dhcmQgLXNOYU4gICAgIC1JbmZpbml0eSAtPiAtTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0NTU4IG5leHR0b3dhcmQgIC1OYU43NyAgIC1JbmZpbml0eSAtPiAtTmFONzcKK25leHR0NTU5IG5leHR0b3dhcmQgLXNOYU44OCAgIC1JbmZpbml0eSAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gTm1heCwgTm1pbiwgTnRpbnksIHN1Ym5vcm1hbHMKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CituZXh0dDU3MCBuZXh0dG93YXJkICA5Ljk5OTk5OTk5RSs5OTkgICAgLUluZmluaXR5IC0+IDkuOTk5OTk5OThFKzk5OQorbmV4dHQ1NzEgbmV4dHRvd2FyZCAgOS45OTk5OTk5OEUrOTk5ICAgIC1JbmZpbml0eSAtPiA5Ljk5OTk5OTk3RSs5OTkKK25leHR0NTcyIG5leHR0b3dhcmQgIDFFLTk5OSAgICAgICAgICAgICAtSW5maW5pdHkgLT4gOS45OTk5OTk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU3MyBuZXh0dG93YXJkICAxLjAwMDAwMDAwRS05OTkgICAgLUluZmluaXR5IC0+IDkuOTk5OTk5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1NzQgbmV4dHRvd2FyZCAgOUUtMTAwNyAgICAgICAgICAgIC1JbmZpbml0eSAtPiA4RS0xMDA3ICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTc1IG5leHR0b3dhcmQgIDkuOUUtMTAwNiAgICAgICAgICAtSW5maW5pdHkgLT4gOS44RS0xMDA2ICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU3NiBuZXh0dG93YXJkICA5Ljk5OTlFLTEwMDMgICAgICAgLUluZmluaXR5IC0+IDkuOTk5OEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1NzcgbmV4dHRvd2FyZCAgOS45OTk5OTk5RS0xMDAwICAgIC1JbmZpbml0eSAtPiA5Ljk5OTk5OThFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTc4IG5leHR0b3dhcmQgIDkuOTk5OTk5OEUtMTAwMCAgICAtSW5maW5pdHkgLT4gOS45OTk5OTk3RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU3OSBuZXh0dG93YXJkICA5Ljk5OTk5OTdFLTEwMDAgICAgLUluZmluaXR5IC0+IDkuOTk5OTk5NkUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1ODAgbmV4dHRvd2FyZCAgMEUtMTAwNyAgICAgICAgICAgIC1JbmZpbml0eSAtPiAtMUUtMTAwNyAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTgxIG5leHR0b3dhcmQgIDFFLTEwMDcgICAgICAgICAgICAtSW5maW5pdHkgLT4gMEUtMTAwNyAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK25leHR0NTgyIG5leHR0b3dhcmQgIDJFLTEwMDcgICAgICAgICAgICAtSW5maW5pdHkgLT4gMUUtMTAwNyAgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK25leHR0NTgzIG5leHR0b3dhcmQgIC0wRS0xMDA3ICAgICAgICAgICAtSW5maW5pdHkgLT4gLTFFLTEwMDcgICAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU4NCBuZXh0dG93YXJkICAtMUUtMTAwNyAgICAgICAgICAgLUluZmluaXR5IC0+IC0yRS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1ODUgbmV4dHRvd2FyZCAgLTJFLTEwMDcgICAgICAgICAgIC1JbmZpbml0eSAtPiAtM0UtMTAwNyAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTg2IG5leHR0b3dhcmQgIC0xMEUtMTAwNyAgICAgICAgICAtSW5maW5pdHkgLT4gLTEuMUUtMTAwNiAgICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCituZXh0dDU4NyBuZXh0dG93YXJkICAtMTAwRS0xMDA3ICAgICAgICAgLUluZmluaXR5IC0+IC0xLjAxRS0xMDA1ICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ1ODggbmV4dHRvd2FyZCAgLTEwMDAwMEUtMTAwNyAgICAgIC1JbmZpbml0eSAtPiAtMS4wMDAwMUUtMTAwMiAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NTg5IG5leHR0b3dhcmQgIC0xLjAwMDBFLTk5OSAgICAgICAtSW5maW5pdHkgLT4gLTEuMDAwMDAwMDFFLTk5OQorbmV4dHQ1OTAgbmV4dHRvd2FyZCAgLTEuMDAwMDAwMDBFLTk5OSAgIC1JbmZpbml0eSAtPiAtMS4wMDAwMDAwMUUtOTk5CituZXh0dDU5MSBuZXh0dG93YXJkICAtMUUtOTk5ICAgICAgICAgICAgLUluZmluaXR5IC0+IC0xLjAwMDAwMDAxRS05OTkKK25leHR0NTkyIG5leHR0b3dhcmQgIC05Ljk5OTk5OTk4RSs5OTkgICAtSW5maW5pdHkgLT4gLTkuOTk5OTk5OTlFKzk5OQorbmV4dHQ1OTMgbmV4dHRvd2FyZCAgLTkuOTk5OTk5OTlFKzk5OSAgIC1JbmZpbml0eSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKworCisKKy0tLS0tLS0gU3BlY2lhbHMKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCituZXh0dDc4MCBuZXh0dG93YXJkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK25leHR0NzgxIG5leHR0b3dhcmQgLUluZiAgLTEwMDAgIC0+IC05Ljk5OTk5OTk5RSszODQKK25leHR0NzgyIG5leHR0b3dhcmQgLUluZiAgLTEgICAgIC0+IC05Ljk5OTk5OTk5RSszODQKK25leHR0NzgzIG5leHR0b3dhcmQgLUluZiAgLTAgICAgIC0+IC05Ljk5OTk5OTk5RSszODQKK25leHR0Nzg0IG5leHR0b3dhcmQgLUluZiAgIDAgICAgIC0+IC05Ljk5OTk5OTk5RSszODQKK25leHR0Nzg1IG5leHR0b3dhcmQgLUluZiAgIDEgICAgIC0+IC05Ljk5OTk5OTk5RSszODQKK25leHR0Nzg2IG5leHR0b3dhcmQgLUluZiAgIDEwMDAgIC0+IC05Ljk5OTk5OTk5RSszODQKK25leHR0Nzg3IG5leHR0b3dhcmQgLTEwMDAgLUluZiAgIC0+IC0xMDAwLjAwMDAxCituZXh0dDc4OCBuZXh0dG93YXJkIC1JbmYgIC1JbmYgICAtPiAtSW5maW5pdHkKK25leHR0Nzg5IG5leHR0b3dhcmQgLTEgICAgLUluZiAgIC0+IC0xLjAwMDAwMDAxCituZXh0dDc5MCBuZXh0dG93YXJkIC0wICAgIC1JbmYgICAtPiAtMUUtMzkxICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ3OTEgbmV4dHRvd2FyZCAgMCAgICAtSW5mICAgLT4gLTFFLTM5MSAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0NzkyIG5leHR0b3dhcmQgIDEgICAgLUluZiAgIC0+ICAwLjk5OTk5OTk5OQorbmV4dHQ3OTMgbmV4dHRvd2FyZCAgMTAwMCAtSW5mICAgLT4gIDk5OS45OTk5OTkKK25leHR0Nzk0IG5leHR0b3dhcmQgIEluZiAgLUluZiAgIC0+ICA5Ljk5OTk5OTk5RSszODQKKworbmV4dHQ4MDAgbmV4dHRvd2FyZCAgSW5mICAtSW5mICAgLT4gIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MDEgbmV4dHRvd2FyZCAgSW5mICAtMTAwMCAgLT4gIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MDIgbmV4dHRvd2FyZCAgSW5mICAtMSAgICAgLT4gIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MDMgbmV4dHRvd2FyZCAgSW5mICAtMCAgICAgLT4gIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MDQgbmV4dHRvd2FyZCAgSW5mICAgMCAgICAgLT4gIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MDUgbmV4dHRvd2FyZCAgSW5mICAgMSAgICAgLT4gIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MDYgbmV4dHRvd2FyZCAgSW5mICAgMTAwMCAgLT4gIDkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MDcgbmV4dHRvd2FyZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CituZXh0dDgwOCBuZXh0dG93YXJkIC0xMDAwICBJbmYgICAtPiAtOTk5Ljk5OTk5OQorbmV4dHQ4MDkgbmV4dHRvd2FyZCAtSW5mICAgSW5mICAgLT4gLTkuOTk5OTk5OTlFKzM4NAorbmV4dHQ4MTAgbmV4dHRvd2FyZCAtMSAgICAgSW5mICAgLT4gLTAuOTk5OTk5OTk5CituZXh0dDgxMSBuZXh0dG93YXJkIC0wICAgICBJbmYgICAtPiAgMUUtMzkxICAgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorbmV4dHQ4MTIgbmV4dHRvd2FyZCAgMCAgICAgSW5mICAgLT4gIDFFLTM5MSAgICAgICAgICAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK25leHR0ODEzIG5leHR0b3dhcmQgIDEgICAgIEluZiAgIC0+ICAxLjAwMDAwMDAxCituZXh0dDgxNCBuZXh0dG93YXJkICAxMDAwICBJbmYgICAtPiAgMTAwMC4wMDAwMQorbmV4dHQ4MTUgbmV4dHRvd2FyZCAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5CisKK25leHR0ODIxIG5leHR0b3dhcmQgIE5hTiAtSW5mICAgIC0+ICBOYU4KK25leHR0ODIyIG5leHR0b3dhcmQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK25leHR0ODIzIG5leHR0b3dhcmQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK25leHR0ODI0IG5leHR0b3dhcmQgIE5hTiAtMCAgICAgIC0+ICBOYU4KK25leHR0ODI1IG5leHR0b3dhcmQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK25leHR0ODI2IG5leHR0b3dhcmQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK25leHR0ODI3IG5leHR0b3dhcmQgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK25leHR0ODI4IG5leHR0b3dhcmQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK25leHR0ODI5IG5leHR0b3dhcmQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK25leHR0ODMwIG5leHR0b3dhcmQgLUluZiAgTmFOICAgIC0+ICBOYU4KK25leHR0ODMxIG5leHR0b3dhcmQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK25leHR0ODMyIG5leHR0b3dhcmQgLTEgICAgTmFOICAgIC0+ICBOYU4KK25leHR0ODMzIG5leHR0b3dhcmQgLTAgICAgTmFOICAgIC0+ICBOYU4KK25leHR0ODM0IG5leHR0b3dhcmQgIDAgICAgTmFOICAgIC0+ICBOYU4KK25leHR0ODM1IG5leHR0b3dhcmQgIDEgICAgTmFOICAgIC0+ICBOYU4KK25leHR0ODM2IG5leHR0b3dhcmQgIDEwMDAgTmFOICAgIC0+ICBOYU4KK25leHR0ODM3IG5leHR0b3dhcmQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworbmV4dHQ4NDEgbmV4dHRvd2FyZCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODQyIG5leHR0b3dhcmQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg0MyBuZXh0dG93YXJkICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NDQgbmV4dHRvd2FyZCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODQ1IG5leHR0b3dhcmQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg0NiBuZXh0dG93YXJkICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NDcgbmV4dHRvd2FyZCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODQ4IG5leHR0b3dhcmQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg0OSBuZXh0dG93YXJkICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NTAgbmV4dHRvd2FyZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODUxIG5leHR0b3dhcmQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg1MiBuZXh0dG93YXJkIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NTMgbmV4dHRvd2FyZCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODU0IG5leHR0b3dhcmQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg1NSBuZXh0dG93YXJkICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NTYgbmV4dHRvd2FyZCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODU3IG5leHR0b3dhcmQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCituZXh0dDg1OCBuZXh0dG93YXJkICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4NTkgbmV4dHRvd2FyZCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworbmV4dHQ4NjEgbmV4dHRvd2FyZCAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK25leHR0ODYyIG5leHR0b3dhcmQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCituZXh0dDg2MyBuZXh0dG93YXJkICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworbmV4dHQ4NjQgbmV4dHRvd2FyZCAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK25leHR0ODY1IG5leHR0b3dhcmQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CituZXh0dDg2NiBuZXh0dG93YXJkIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworbmV4dHQ4NjcgbmV4dHRvd2FyZCAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK25leHR0ODY4IG5leHR0b3dhcmQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CituZXh0dDg2OSBuZXh0dG93YXJkICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK25leHR0ODcxIG5leHR0b3dhcmQgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODcyIG5leHR0b3dhcmQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODczIG5leHR0b3dhcmQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODc0IG5leHR0b3dhcmQgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODc1IG5leHR0b3dhcmQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODc2IG5leHR0b3dhcmQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODc3IG5leHR0b3dhcmQgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODc4IG5leHR0b3dhcmQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODc5IG5leHR0b3dhcmQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODgwIG5leHR0b3dhcmQgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODgxIG5leHR0b3dhcmQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK25leHR0ODgyIG5leHR0b3dhcmQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorbmV4dHQ4ODMgbmV4dHRvd2FyZCAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorbmV4dHQ4ODQgbmV4dHRvd2FyZCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCituZXh0dDg4NSBuZXh0dG93YXJkICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdHMKK25leHR0OTAwIG5leHR0b3dhcmQgMSAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK25leHR0OTAxIG5leHR0b3dhcmQgIyAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9vci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9vci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWJmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL29yLmRlY1Rlc3QKQEAgLTAsMCArMSwzMzQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gb3IuZGVjVGVzdCAtLSBkaWdpdHdpc2UgbG9naWNhbCBPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5FeHBvbmVudDogLTk5OQorCistLSBTYW5pdHkgY2hlY2sgKHRydXRoIHRhYmxlKQorb3J4MDAxIG9yICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCitvcngwMDIgb3IgICAgICAgICAgICAgMCAgICAxIC0+ICAgIDEKK29yeDAwMyBvciAgICAgICAgICAgICAxICAgIDAgLT4gICAgMQorb3J4MDA0IG9yICAgICAgICAgICAgIDEgICAgMSAtPiAgICAxCitvcngwMDUgb3IgICAgICAgICAgMTEwMCAxMDEwIC0+IDExMTAKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCitvcngwMDYgb3IgMDAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgICAgICAgICAgMAorb3J4MDA3IG9yIDAwMDAwMDAwMCAxMDAwMDAwMDAgLT4gICAxMDAwMDAwMDAKK29yeDAwOCBvciAxMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwCitvcngwMDkgb3IgMTAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgIDEwMDAwMDAwMAorb3J4MDEwIG9yIDAwMDAwMDAwMCAwMDAwMDAwMDAgLT4gICAgICAgICAgIDAKK29yeDAxMSBvciAwMDAwMDAwMDAgMDEwMDAwMDAwIC0+ICAgIDEwMDAwMDAwCitvcngwMTIgb3IgMDEwMDAwMDAwIDAwMDAwMDAwMCAtPiAgICAxMDAwMDAwMAorb3J4MDEzIG9yIDAxMDAwMDAwMCAwMTAwMDAwMDAgLT4gICAgMTAwMDAwMDAKKworLS0gVmFyaW91cyBsZW5ndGhzCistLSAgICAgICAgMTIzNDU2Nzg5ICAgICAxMjM0NTY3ODkgICAgICAxMjM0NTY3ODkKK29yeDAyMSBvciAxMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDIyIG9yIDExMTExMTExMTExMSAgMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwMjMgb3IgIDExMTExMTExICAgICAgMTExMTExMTEgIC0+ICAgMTExMTExMTEKK29yeDAyNSBvciAgIDExMTExMTEgICAgICAgMTExMTExMSAgLT4gICAgMTExMTExMQorb3J4MDI2IG9yICAgIDExMTExMSAgICAgICAgMTExMTExICAtPiAgICAgMTExMTExCitvcngwMjcgb3IgICAgIDExMTExICAgICAgICAgMTExMTEgIC0+ICAgICAgMTExMTEKK29yeDAyOCBvciAgICAgIDExMTEgICAgICAgICAgMTExMSAgLT4gICAgICAgMTExMQorb3J4MDI5IG9yICAgICAgIDExMSAgICAgICAgICAgMTExICAtPiAgICAgICAgMTExCitvcngwMzEgb3IgICAgICAgIDExICAgICAgICAgICAgMTEgIC0+ICAgICAgICAgMTEKK29yeDAzMiBvciAgICAgICAgIDEgICAgICAgICAgICAgMSAgLT4gICAgICAgICAgMQorb3J4MDMzIG9yIDExMTExMTExMTExMSAxMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwMzQgb3IgMTExMTExMTExMTEgMTExMTExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDAzNSBvciAxMTExMTExMTExIDExMTExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDM2IG9yIDExMTExMTExMSAxMTExMTExMTExMTExICAtPiAgMTExMTExMTExCisKK29yeDA0MCBvciAxMTExMTExMTEgIDExMTExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDQxIG9yICAxMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTExMTExMTExCitvcngwNDIgb3IgIDExMTExMTExICAgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDA0MyBvciAgIDExMTExMTEgICAgIDEwMDAwMDAxMCAgLT4gIDEwMTExMTExMQorb3J4MDQ0IG9yICAgIDExMTExMSAgICAgMTAwMDAwMTAwICAtPiAgMTAwMTExMTExCitvcngwNDUgb3IgICAgIDExMTExICAgICAxMDAwMDEwMDAgIC0+ICAxMDAwMTExMTEKK29yeDA0NiBvciAgICAgIDExMTEgICAgIDEwMDAxMDAwMCAgLT4gIDEwMDAxMTExMQorb3J4MDQ3IG9yICAgICAgIDExMSAgICAgMTAwMTAwMDAwICAtPiAgMTAwMTAwMTExCitvcngwNDggb3IgICAgICAgIDExICAgICAxMDEwMDAwMDAgIC0+ICAxMDEwMDAwMTEKK29yeDA0OSBvciAgICAgICAgIDEgICAgIDExMDAwMDAwMCAgLT4gIDExMDAwMDAwMQorCitvcngwNTAgb3IgMTExMTExMTExMSAgMSAgLT4gIDExMTExMTExMQorb3J4MDUxIG9yICAxMTExMTExMTEgIDEgIC0+ICAxMTExMTExMTEKK29yeDA1MiBvciAgIDExMTExMTExICAxICAtPiAgMTExMTExMTEKK29yeDA1MyBvciAgICAxMTExMTExICAxICAtPiAgMTExMTExMQorb3J4MDU0IG9yICAgICAxMTExMTEgIDEgIC0+ICAxMTExMTEKK29yeDA1NSBvciAgICAgIDExMTExICAxICAtPiAgMTExMTEKK29yeDA1NiBvciAgICAgICAxMTExICAxICAtPiAgMTExMQorb3J4MDU3IG9yICAgICAgICAxMTEgIDEgIC0+ICAxMTEKK29yeDA1OCBvciAgICAgICAgIDExICAxICAtPiAgMTEKK29yeDA1OSBvciAgICAgICAgICAxICAxICAtPiAgMQorCitvcngwNjAgb3IgMTExMTExMTExMSAgMCAgLT4gIDExMTExMTExMQorb3J4MDYxIG9yICAxMTExMTExMTEgIDAgIC0+ICAxMTExMTExMTEKK29yeDA2MiBvciAgIDExMTExMTExICAwICAtPiAgMTExMTExMTEKK29yeDA2MyBvciAgICAxMTExMTExICAwICAtPiAgMTExMTExMQorb3J4MDY0IG9yICAgICAxMTExMTEgIDAgIC0+ICAxMTExMTEKK29yeDA2NSBvciAgICAgIDExMTExICAwICAtPiAgMTExMTEKK29yeDA2NiBvciAgICAgICAxMTExICAwICAtPiAgMTExMQorb3J4MDY3IG9yICAgICAgICAxMTEgIDAgIC0+ICAxMTEKK29yeDA2OCBvciAgICAgICAgIDExICAwICAtPiAgMTEKK29yeDA2OSBvciAgICAgICAgICAxICAwICAtPiAgMQorCitvcngwNzAgb3IgMSAgMTExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDcxIG9yIDEgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDA3MiBvciAxICAgIDExMTExMTExICAtPiAgMTExMTExMTEKK29yeDA3MyBvciAxICAgICAxMTExMTExICAtPiAgMTExMTExMQorb3J4MDc0IG9yIDEgICAgICAxMTExMTEgIC0+ICAxMTExMTEKK29yeDA3NSBvciAxICAgICAgIDExMTExICAtPiAgMTExMTEKK29yeDA3NiBvciAxICAgICAgICAxMTExICAtPiAgMTExMQorb3J4MDc3IG9yIDEgICAgICAgICAxMTEgIC0+ICAxMTEKK29yeDA3OCBvciAxICAgICAgICAgIDExICAtPiAgMTEKK29yeDA3OSBvciAxICAgICAgICAgICAxICAtPiAgMQorCitvcngwODAgb3IgMCAgMTExMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MDgxIG9yIDAgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDA4MiBvciAwICAgIDExMTExMTExICAtPiAgMTExMTExMTEKK29yeDA4MyBvciAwICAgICAxMTExMTExICAtPiAgMTExMTExMQorb3J4MDg0IG9yIDAgICAgICAxMTExMTEgIC0+ICAxMTExMTEKK29yeDA4NSBvciAwICAgICAgIDExMTExICAtPiAgMTExMTEKK29yeDA4NiBvciAwICAgICAgICAxMTExICAtPiAgMTExMQorb3J4MDg3IG9yIDAgICAgICAgICAxMTEgIC0+ICAxMTEKK29yeDA4OCBvciAwICAgICAgICAgIDExICAtPiAgMTEKK29yeDA4OSBvciAwICAgICAgICAgICAxICAtPiAgMQorCitvcngwOTAgb3IgMDExMTExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK29yeDA5MSBvciAxMDExMTExMTEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorb3J4MDkyIG9yIDExMDExMTExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitvcngwOTMgb3IgMTExMDExMTExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK29yeDA5NCBvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gIDExMTEwMTExMQorb3J4MDk1IG9yIDExMTExMDExMSAgMTExMTAxMTExICAtPiAgMTExMTExMTExCitvcngwOTYgb3IgMTExMTExMDExICAxMTExMDExMTEgIC0+ICAxMTExMTExMTEKK29yeDA5NyBvciAxMTExMTExMDEgIDExMTEwMTExMSAgLT4gIDExMTExMTExMQorb3J4MDk4IG9yIDExMTExMTExMCAgMTExMTAxMTExICAtPiAgMTExMTExMTExCisKK29yeDEwMCBvciAxMTExMDExMTEgIDAxMTExMTExMSAgLT4gIDExMTExMTExMQorb3J4MTAxIG9yIDExMTEwMTExMSAgMTAxMTExMTExICAtPiAgMTExMTExMTExCitvcngxMDIgb3IgMTExMTAxMTExICAxMTAxMTExMTEgIC0+ICAxMTExMTExMTEKK29yeDEwMyBvciAxMTExMDExMTEgIDExMTAxMTExMSAgLT4gIDExMTExMTExMQorb3J4MTA0IG9yIDExMTEwMTExMSAgMTExMTAxMTExICAtPiAgMTExMTAxMTExCitvcngxMDUgb3IgMTExMTAxMTExICAxMTExMTAxMTEgIC0+ICAxMTExMTExMTEKK29yeDEwNiBvciAxMTExMDExMTEgIDExMTExMTAxMSAgLT4gIDExMTExMTExMQorb3J4MTA3IG9yIDExMTEwMTExMSAgMTExMTExMTAxICAtPiAgMTExMTExMTExCitvcngxMDggb3IgMTExMTAxMTExICAxMTExMTExMTAgIC0+ICAxMTExMTExMTEKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCitvcngyMjAgb3IgMTExMTExMTEyICAxMTExMTExMTEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIyMSBvciAzMzMzMzMzMzMgIDMzMzMzMzMzMyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjIyIG9yIDU1NTU1NTU1NSAgNTU1NTU1NTU1ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMjMgb3IgNzc3Nzc3Nzc3ICA3Nzc3Nzc3NzcgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIyNCBvciA5OTk5OTk5OTkgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjI1IG9yIDIyMjIyMjIyMiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMjYgb3IgNDQ0NDQ0NDQ0ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIyNyBvciA2NjY2NjY2NjYgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjI4IG9yIDg4ODg4ODg4OCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMjkgb3IgOTk5OTk5OTk5ICAyMjIyMjIyMjIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDIzMCBvciA5OTk5OTk5OTkgIDQ0NDQ0NDQ0NCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjMxIG9yIDk5OTk5OTk5OSAgNjY2NjY2NjY2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyMzIgb3IgOTk5OTk5OTk5ICA4ODg4ODg4ODggIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGEgZmV3IHJhbmRvbXMKK29yeDI0MCBvciAgNTY3NDY4Njg5IC05MzQ5ODE5NDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjQxIG9yICA1NjczNjc2ODkgIDkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNDIgb3IgLTYzMTkxNzc3MiAtNzA2MDE0NjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI0MyBvciAtNzU2MjUzMjU3ICAxMzg1NzkyMzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjQ0IG9yICA4MzU1OTAxNDkgIDU2NzQzNTQwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAorb3J4MjUwIG9yICAyMDAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI1MSBvciAgNzAwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNTIgb3IgIDgwMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjUzIG9yICA5MDAwMDAwMDAgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI1NCBvciAgMjAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNTUgb3IgIDcwMDAwMDAwMCAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjU2IG9yICA4MDAwMDAwMDAgMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI1NyBvciAgOTAwMDAwMDAwIDAwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNTggb3IgIDEwMDAwMDAwMCAyMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjU5IG9yICAxMDAwMDAwMDAgNzAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI2MCBvciAgMTAwMDAwMDAwIDgwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNjEgb3IgIDEwMDAwMDAwMCA5MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjYyIG9yICAwMDAwMDAwMDAgMjAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI2MyBvciAgMDAwMDAwMDAwIDcwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNjQgb3IgIDAwMDAwMDAwMCA4MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjY1IG9yICAwMDAwMDAwMDAgOTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTVNELTEKK29yeDI3MCBvciAgMDIwMDAwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNzEgb3IgIDA3MDEwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjcyIG9yICAwODAwMTAwMDAgMTAwMDAwMDAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI3MyBvciAgMDkwMDAxMDAwIDEwMDAwMDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNzQgb3IgIDEwMDAwMDEwMCAwMjAwMTAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mjc1IG9yICAxMDAwMDAwMDAgMDcwMDAxMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI3NiBvciAgMTAwMDAwMDEwIDA4MDAxMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyNzcgb3IgIDEwMDAwMDAwMCAwOTAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK29yeDI4MCBvciAgMDAxMDAwMDAyIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyODEgb3IgIDAwMDAwMDAwNyAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjgyIG9yICAwMDAwMDAwMDggMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI4MyBvciAgMDAwMDAwMDA5IDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyODQgb3IgIDEwMDAwMDAwMCAwMDAxMDAwMDIgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mjg1IG9yICAxMDAxMDAwMDAgMDAxMDAwMDA3IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI4NiBvciAgMTAwMDEwMDAwIDAxMDAwMDAwOCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyODcgb3IgIDEwMDAwMTAwMCAxMDAwMDAwMDkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNaWRkaWUKK29yeDI4OCBvciAgMDAxMDIwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyODkgb3IgIDAwMDA3MDAwMSAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjkwIG9yICAwMDAwODAwMDAgMTAwMDEwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI5MSBvciAgMDAwMDkwMDAwIDEwMDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyOTIgb3IgIDEwMDAwMDAxMCAwMDAwMjAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MjkzIG9yICAxMDAxMDAwMDAgMDAwMDcwMDEwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI5NCBvciAgMTAwMDEwMTAwIDAwMDA4MDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyOTUgb3IgIDEwMDAwMTAwMCAwMDAwOTAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gc2lnbnMKK29yeDI5NiBvciAtMTAwMDAxMDAwIC0wMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mjk3IG9yIC0xMDAwMDEwMDAgIDAwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngyOTggb3IgIDEwMDAwMTAwMCAtMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDI5OSBvciAgMTAwMDAxMDAwICAwMDAwMTEwMDAgLT4gIDEwMDAxMTAwMAorCistLSBObWF4LCBObWluLCBOdGlueQorb3J4MzMxIG9yICAyICAgOS45OTk5OTk5OUUrOTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDMzMiBvciAgMyAgIDFFLTk5OSAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzMzMgb3IgIDQgICAxLjAwMDAwMDAwRS05OTkgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzM0IG9yICA1ICAgMUUtMTAwNyAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDMzNSBvciAgNiAgIC0xRS0xMDA3ICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzMzYgb3IgIDcgICAtMS4wMDAwMDAwMEUtOTk5ICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzM3IG9yICA4ICAgLTFFLTk5OSAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDMzOCBvciAgOSAgIC05Ljk5OTk5OTk5RSs5OTkgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNDEgb3IgIDkuOTk5OTk5OTlFKzk5OSAgICAgLTE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzQyIG9yICAxRS05OTkgICAgICAgICAgICAgICAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM0MyBvciAgMS4wMDAwMDAwMEUtOTk5ICAgICAtMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNDQgb3IgIDFFLTEwMDcgICAgICAgICAgICAgIDE4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzQ1IG9yICAtMUUtMTAwNyAgICAgICAgICAgIC0xMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM0NiBvciAgLTEuMDAwMDAwMDBFLTk5OSAgICAgMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNDcgb3IgIC0xRS05OTkgICAgICAgICAgICAgIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzQ4IG9yICAtOS45OTk5OTk5OUUrOTk5ICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCitvcngzNjEgb3IgIDEuMCAgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzYyIG9yICAxRSsxICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM2MyBvciAgMC4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNjQgb3IgIDBFKzEgICAgICAgICAgICAgICAgIDEgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzY1IG9yICA5LjkgICAgICAgICAgICAgICAgICAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM2NiBvciAgOUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNzEgb3IgIDAgMS4wICAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4MzcyIG9yICAwIDFFKzEgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM3MyBvciAgMCAwLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcngzNzQgb3IgIDAgMEUrMSAgICAgICAgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Mzc1IG9yICAwIDkuOSAgICAgICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDM3NiBvciAgMCA5RSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK29yeDc4MCBvciAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3ODEgb3IgLUluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4NzgyIG9yIC1JbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc4MyBvciAtSW5mICAtMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3ODQgb3IgLUluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Nzg1IG9yIC1JbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc4NiBvciAtSW5mICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3ODcgb3IgLTEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Nzg4IG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc4OSBvciAtMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3OTAgb3IgLTAgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4NzkxIG9yICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDc5MiBvciAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng3OTMgb3IgIDEwMDAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4Nzk0IG9yICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworb3J4ODAwIG9yICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgwMSBvciAgSW5mICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MDIgb3IgIEluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODAzIG9yICBJbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgwNCBvciAgSW5mICAgMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MDUgb3IgIEluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODA2IG9yICBJbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgwNyBvciAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MDggb3IgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODA5IG9yIC1JbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgxMCBvciAtMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MTEgb3IgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODEyIG9yICAwICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgxMyBvciAgMSAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MTQgb3IgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODE1IG9yICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworb3J4ODIxIG9yICBOYU4gLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgyMiBvciAgTmFOIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MjMgb3IgIE5hTiAtMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODI0IG9yICBOYU4gLTAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgyNSBvciAgTmFOICAwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MjYgb3IgIE5hTiAgMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODI3IG9yICBOYU4gIDEwMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgyOCBvciAgTmFOICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4Mjkgb3IgIE5hTiAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODMwIG9yIC1JbmYgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgzMSBvciAtMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MzIgb3IgLTEgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODMzIG9yIC0wICAgIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgzNCBvciAgMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4MzUgb3IgIDEgICAgTmFOICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODM2IG9yICAxMDAwIE5hTiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDgzNyBvciAgSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK29yeDg0MSBvciAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0MiBvciAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0MyBvciAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0NCBvciAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0NSBvciAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0NiBvciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0NyBvciAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0OCBvciAgc05hTiAgTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg0OSBvciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1MCBvciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1MSBvciAtSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1MiBvciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1MyBvciAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1NCBvciAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1NSBvciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1NiBvciAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1NyBvciAgMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1OCBvciAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK29yeDg1OSBvciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworb3J4ODYxIG9yICBOYU4xICAgLUluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg2MiBvciArTmFOMiAgIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4NjMgb3IgIE5hTjMgICAgMTAwMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODY0IG9yICBOYU40ICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg2NSBvciAgTmFONSAgICtOYU42ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4NjYgb3IgLUluZiAgICAgTmFONyAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODY3IG9yIC0xMDAwICAgIE5hTjggICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg2OCBvciAgMTAwMCAgICBOYU45ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4Njkgb3IgIEluZiAgICArTmFOMTAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODcxIG9yICBzTmFOMTEgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg3MiBvciAgc05hTjEyICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4NzMgb3IgIHNOYU4xMyAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODc0IG9yICBzTmFOMTQgICBOYU4xNyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg3NSBvciAgc05hTjE1ICBzTmFOMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4NzYgb3IgIE5hTjE2ICAgc05hTjE5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODc3IG9yIC1JbmYgICAgK3NOYU4yMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg3OCBvciAtMTAwMCAgICBzTmFOMjEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4Nzkgb3IgIDEwMDAgICAgc05hTjIyIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODgwIG9yICBJbmYgICAgIHNOYU4yMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg4MSBvciArTmFOMjUgICtzTmFOMjQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4ODIgb3IgLU5hTjI2ICAgIE5hTjI4IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorb3J4ODgzIG9yIC1zTmFOMjcgIHNOYU4yOSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK29yeDg4NCBvciAgMTAwMCAgICAtTmFOMzAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitvcng4ODUgb3IgIDEwMDAgICAtc05hTjMxIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9wbHVzLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3BsdXMuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmU4NDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9wbHVzLmRlY1Rlc3QKQEAgLTAsMCArMSwxOTUgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcGx1cy5kZWNUZXN0IC0tIGRlY2ltYWwgbW9uYWRpYyBhZGRpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGlzIHNldCBvZiB0ZXN0cyBwcmltYXJpbHkgdGVzdHMgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgb3BlcmF0b3IuCistLSBBZGRpdGlvbiBhbmQgcm91bmRpbmcsIGFuZCBtb3N0IG92ZXJmbG93cywgYXJlIHRlc3RlZCBlbHNld2hlcmUuCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK3BsdXgwMDEgcGx1cyAnMScgICAgICAtPiAnMScKK3BsdXgwMDIgcGx1cyAnLTEnICAgICAtPiAnLTEnCitwbHV4MDAzIHBsdXMgJzEuMDAnICAgLT4gJzEuMDAnCitwbHV4MDA0IHBsdXMgJy0xLjAwJyAgLT4gJy0xLjAwJworcGx1eDAwNSBwbHVzICcwJyAgICAgIC0+ICcwJworcGx1eDAwNiBwbHVzICcwLjAwJyAgIC0+ICcwLjAwJworcGx1eDAwNyBwbHVzICcwMC4wJyAgIC0+ICcwLjAnCitwbHV4MDA4IHBsdXMgJzAwLjAwJyAgLT4gJzAuMDAnCitwbHV4MDA5IHBsdXMgJzAwJyAgICAgLT4gJzAnCisKK3BsdXgwMTAgcGx1cyAnLTInICAgICAtPiAnLTInCitwbHV4MDExIHBsdXMgJzInICAgICAgLT4gJzInCitwbHV4MDEyIHBsdXMgJy0yLjAwJyAgLT4gJy0yLjAwJworcGx1eDAxMyBwbHVzICcyLjAwJyAgIC0+ICcyLjAwJworcGx1eDAxNCBwbHVzICctMCcgICAgIC0+ICcwJworcGx1eDAxNSBwbHVzICctMC4wMCcgIC0+ICcwLjAwJworcGx1eDAxNiBwbHVzICctMDAuMCcgIC0+ICcwLjAnCitwbHV4MDE3IHBsdXMgJy0wMC4wMCcgLT4gJzAuMDAnCitwbHV4MDE4IHBsdXMgJy0wMCcgICAgLT4gJzAnCisKK3BsdXgwMjAgcGx1cyAnLTIwMDAwMDAnIC0+ICctMjAwMDAwMCcKK3BsdXgwMjEgcGx1cyAnMjAwMDAwMCcgIC0+ICcyMDAwMDAwJworcHJlY2lzaW9uOiA3CitwbHV4MDIyIHBsdXMgJy0yMDAwMDAwJyAtPiAnLTIwMDAwMDAnCitwbHV4MDIzIHBsdXMgJzIwMDAwMDAnICAtPiAnMjAwMDAwMCcKK3ByZWNpc2lvbjogNgorcGx1eDAyNCBwbHVzICctMjAwMDAwMCcgLT4gJy0yLjAwMDAwRSs2JyBSb3VuZGVkCitwbHV4MDI1IHBsdXMgJzIwMDAwMDAnICAtPiAnMi4wMDAwMEUrNicgUm91bmRlZAorcHJlY2lzaW9uOiAzCitwbHV4MDI2IHBsdXMgJy0yMDAwMDAwJyAtPiAnLTIuMDBFKzYnIFJvdW5kZWQKK3BsdXgwMjcgcGx1cyAnMjAwMDAwMCcgIC0+ICcyLjAwRSs2JyBSb3VuZGVkCisKKy0tIG1vcmUgZml4ZWQsIHBvdGVudGlhbCBMSFMgc3dhcHMgaWYgZG9uZSBieSBhZGQgMAorcHJlY2lzaW9uOiA5CitwbHV4MDYwIHBsdXMgJzU2MjY3RS0xMCcgICAtPiAnMC4wMDAwMDU2MjY3JworcGx1eDA2MSBwbHVzICc1NjI2N0UtNScgICAgLT4gJzAuNTYyNjcnCitwbHV4MDYyIHBsdXMgJzU2MjY3RS0yJyAgICAtPiAnNTYyLjY3JworcGx1eDA2MyBwbHVzICc1NjI2N0UtMScgICAgLT4gJzU2MjYuNycKK3BsdXgwNjUgcGx1cyAnNTYyNjdFLTAnICAgIC0+ICc1NjI2NycKK3BsdXgwNjYgcGx1cyAnNTYyNjdFKzAnICAgIC0+ICc1NjI2NycKK3BsdXgwNjcgcGx1cyAnNTYyNjdFKzEnICAgIC0+ICc1LjYyNjdFKzUnCitwbHV4MDY4IHBsdXMgJzU2MjY3RSsyJyAgICAtPiAnNS42MjY3RSs2JworcGx1eDA2OSBwbHVzICc1NjI2N0UrMycgICAgLT4gJzUuNjI2N0UrNycKK3BsdXgwNzAgcGx1cyAnNTYyNjdFKzQnICAgIC0+ICc1LjYyNjdFKzgnCitwbHV4MDcxIHBsdXMgJzU2MjY3RSs1JyAgICAtPiAnNS42MjY3RSs5JworcGx1eDA3MiBwbHVzICc1NjI2N0UrNicgICAgLT4gJzUuNjI2N0UrMTAnCitwbHV4MDgwIHBsdXMgJy01NjI2N0UtMTAnICAtPiAnLTAuMDAwMDA1NjI2NycKK3BsdXgwODEgcGx1cyAnLTU2MjY3RS01JyAgIC0+ICctMC41NjI2NycKK3BsdXgwODIgcGx1cyAnLTU2MjY3RS0yJyAgIC0+ICctNTYyLjY3JworcGx1eDA4MyBwbHVzICctNTYyNjdFLTEnICAgLT4gJy01NjI2LjcnCitwbHV4MDg1IHBsdXMgJy01NjI2N0UtMCcgICAtPiAnLTU2MjY3JworcGx1eDA4NiBwbHVzICctNTYyNjdFKzAnICAgLT4gJy01NjI2NycKK3BsdXgwODcgcGx1cyAnLTU2MjY3RSsxJyAgIC0+ICctNS42MjY3RSs1JworcGx1eDA4OCBwbHVzICctNTYyNjdFKzInICAgLT4gJy01LjYyNjdFKzYnCitwbHV4MDg5IHBsdXMgJy01NjI2N0UrMycgICAtPiAnLTUuNjI2N0UrNycKK3BsdXgwOTAgcGx1cyAnLTU2MjY3RSs0JyAgIC0+ICctNS42MjY3RSs4JworcGx1eDA5MSBwbHVzICctNTYyNjdFKzUnICAgLT4gJy01LjYyNjdFKzknCitwbHV4MDkyIHBsdXMgJy01NjI2N0UrNicgICAtPiAnLTUuNjI2N0UrMTAnCisKKy0tICJsaHMiIHplcm9zIGluIHBsdXMgYW5kIG1pbnVzIGhhdmUgZXhwb25lbnQgPSBvcGVyYW5kCitwbHV4MTIwIHBsdXMgJy0wRTMnICAgLT4gJzBFKzMnCitwbHV4MTIxIHBsdXMgJy0wRTInICAgLT4gJzBFKzInCitwbHV4MTIyIHBsdXMgJy0wRTEnICAgLT4gJzBFKzEnCitwbHV4MTIzIHBsdXMgJy0wRTAnICAgLT4gJzAnCitwbHV4MTI0IHBsdXMgJyswRTAnICAgLT4gJzAnCitwbHV4MTI1IHBsdXMgJyswRTEnICAgLT4gJzBFKzEnCitwbHV4MTI2IHBsdXMgJyswRTInICAgLT4gJzBFKzInCitwbHV4MTI3IHBsdXMgJyswRTMnICAgLT4gJzBFKzMnCisKK3BsdXgxMzAgcGx1cyAnLTVFMycgICAtPiAnLTVFKzMnCitwbHV4MTMxIHBsdXMgJy01RTgnICAgLT4gJy01RSs4JworcGx1eDEzMiBwbHVzICctNUUxMycgIC0+ICctNUUrMTMnCitwbHV4MTMzIHBsdXMgJy01RTE4JyAgLT4gJy01RSsxOCcKK3BsdXgxMzQgcGx1cyAnKzVFMycgICAtPiAnNUUrMycKK3BsdXgxMzUgcGx1cyAnKzVFOCcgICAtPiAnNUUrOCcKK3BsdXgxMzYgcGx1cyAnKzVFMTMnICAtPiAnNUUrMTMnCitwbHV4MTM3IHBsdXMgJys1RTE4JyAgLT4gJzVFKzE4JworCistLSBzcGVjaWFscworcGx1eDE1MCBwbHVzICdJbmYnICAgIC0+ICdJbmZpbml0eScKK3BsdXgxNTEgcGx1cyAnLUluZicgICAtPiAnLUluZmluaXR5JworcGx1eDE1MiBwbHVzICAgTmFOICAgIC0+ICBOYU4KK3BsdXgxNTMgcGx1cyAgc05hTiAgICAtPiAgTmFOICAgSW52YWxpZF9vcGVyYXRpb24KK3BsdXgxNTQgcGx1cyAgIE5hTjc3ICAtPiAgTmFONzcKK3BsdXgxNTUgcGx1cyAgc05hTjg4ICAtPiAgTmFOODggSW52YWxpZF9vcGVyYXRpb24KK3BsdXgxNTYgcGx1cyAgLU5hTiAgICAtPiAtTmFOCitwbHV4MTU3IHBsdXMgLXNOYU4gICAgLT4gLU5hTiAgIEludmFsaWRfb3BlcmF0aW9uCitwbHV4MTU4IHBsdXMgIC1OYU43NyAgLT4gLU5hTjc3CitwbHV4MTU5IHBsdXMgLXNOYU44OCAgLT4gLU5hTjg4IEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG92ZXJmbG93IHRlc3RzCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcHJlY2lzaW9uOiAzCitwbHV4MTYwIHBsdXMgOS45OTlFKzk5OTk5OTk5OSAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorcGx1eDE2MSBwbHVzIC05Ljk5OUUrOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwbHV4MjEwIHBsdXMgIDEuMDBFLTk5OSAgICAgICAgLT4gICAxLjAwRS05OTkKK3BsdXgyMTEgcGx1cyAgMC4xRS05OTkgICAgICAgICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK3BsdXgyMTIgcGx1cyAgMC4xMEUtOTk5ICAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK3BsdXgyMTMgcGx1cyAgMC4xMDBFLTk5OSAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwgUm91bmRlZAorcGx1eDIxNCBwbHVzICAwLjAxRS05OTkgICAgICAgIC0+ICAgMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK3BsdXgyMTUgcGx1cyAgMC45OTlFLTk5OSAgICAgICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcGx1eDIxNiBwbHVzICAwLjA5OUUtOTk5ICAgICAgIC0+ICAgMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitwbHV4MjE3IHBsdXMgIDAuMDA5RS05OTkgICAgICAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3BsdXgyMTggcGx1cyAgMC4wMDFFLTk5OSAgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitwbHV4MjE5IHBsdXMgIDAuMDAwOUUtOTk5ICAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorcGx1eDIyMCBwbHVzICAwLjAwMDFFLTk5OSAgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworcGx1eDIzMCBwbHVzIC0xLjAwRS05OTkgICAgICAgIC0+ICAtMS4wMEUtOTk5CitwbHV4MjMxIHBsdXMgLTAuMUUtOTk5ICAgICAgICAgLT4gIC0xRS0xMDAwICAgU3Vibm9ybWFsCitwbHV4MjMyIHBsdXMgLTAuMTBFLTk5OSAgICAgICAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsCitwbHV4MjMzIHBsdXMgLTAuMTAwRS05OTkgICAgICAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK3BsdXgyMzQgcGx1cyAtMC4wMUUtOTk5ICAgICAgICAtPiAgLTFFLTEwMDEgICBTdWJub3JtYWwKKy0tIG5leHQgaXMgcm91bmRlZCB0byBFbWluCitwbHV4MjM1IHBsdXMgLTAuOTk5RS05OTkgICAgICAgLT4gIC0xLjAwRS05OTkgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3BsdXgyMzYgcGx1cyAtMC4wOTlFLTk5OSAgICAgICAtPiAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcGx1eDIzNyBwbHVzIC0wLjAwOUUtOTk5ICAgICAgIC0+ICAtMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitwbHV4MjM4IHBsdXMgLTAuMDAxRS05OTkgICAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorcGx1eDIzOSBwbHVzIC0wLjAwMDlFLTk5OSAgICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3BsdXgyNDAgcGx1cyAtMC4wMDAxRS05OTkgICAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCisKKy0tIHN1Ym5vcm1hbHMgY2xhbXBlZCB0byAwLUV0aW55CitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitwbHV4MjUxIHBsdXMgN0UtMzk4ICAgICAtPiA3RS0zOTggU3Vibm9ybWFsCitwbHV4MjUyIHBsdXMgMEUtMzk4ICAgICAtPiAwRS0zOTgKK3BsdXgyNTMgcGx1cyA3RS0zOTkgICAgIC0+IDFFLTM5OCBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorcGx1eDI1NCBwbHVzIDRFLTM5OSAgICAgLT4gMEUtMzk4IENsYW1wZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3BsdXgyNTUgcGx1cyA3RS00MDAgICAgIC0+IDBFLTM5OCBDbGFtcGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwbHV4MjU2IHBsdXMgN0UtNDAxICAgICAtPiAwRS0zOTggQ2xhbXBlZCBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZAorcGx1eDI1NyBwbHVzIDBFLTM5OSAgICAgLT4gMEUtMzk4IENsYW1wZWQKK3BsdXgyNTggcGx1cyAwRS00MDAgICAgIC0+IDBFLTM5OCBDbGFtcGVkCitwbHV4MjU5IHBsdXMgMEUtNDAxICAgICAtPiAwRS0zOTggQ2xhbXBlZAorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CitwbHV4MzAxIHBsdXMgMTIzNDU2NzgwMDAgIC0+IDEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK3BsdXgzMDIgcGx1cyAxMjM0NTY3ODAwICAgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitwbHV4MzAzIHBsdXMgMTIzNDU2Nzg5MCAgIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorcGx1eDMwNCBwbHVzIDEyMzQ1Njc4OTEgICAtPiAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorcGx1eDMwNSBwbHVzIDEyMzQ1Njc4OTAxICAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3BsdXgzMDYgcGx1cyAxMjM0NTY3ODk2ICAgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3RpbGwgY2hlY2tpbmcKK3ByZWNpc2lvbjogMTUKK3BsdXgzMjEgcGx1cyAxMjM0NTY3ODAwMCAgLT4gMTIzNDU2NzgwMDAKK3BsdXgzMjIgcGx1cyAxMjM0NTY3ODAwICAgLT4gMTIzNDU2NzgwMAorcGx1eDMyMyBwbHVzIDEyMzQ1Njc4OTAgICAtPiAxMjM0NTY3ODkwCitwbHV4MzI0IHBsdXMgMTIzNDU2Nzg5MSAgIC0+IDEyMzQ1Njc4OTEKK3BsdXgzMjUgcGx1cyAxMjM0NTY3ODkwMSAgLT4gMTIzNDU2Nzg5MDEKK3BsdXgzMjYgcGx1cyAxMjM0NTY3ODk2ICAgLT4gMTIzNDU2Nzg5NgorcHJlY2lzaW9uOiA5CisKKy0tIE51bGwgdGVzdHMKK3BsdTkwMCBwbHVzICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Bvd2VyLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Bvd2VyLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmMTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcG93ZXIuZGVjVGVzdApAQCAtMCwwICsxLDE2MjQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcG93ZXIuZGVjVGVzdCAtLSBkZWNpbWFsIGV4cG9uZW50aWF0aW9uIFtwb3dlcih4LCB5KV0gICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBJbiBhZGRpdGlvbiB0byB0aGUgcG93ZXIgb3BlcmF0b3IgdGVzdGNhc2VzIGhlcmUsIHNlZSBhbHNvIHRoZSBmaWxlCistLSBwb3dlcnNxcnQuZGVjVGVzdCB3aGljaCBpbmNsdWRlcyBhbGwgdGhlIHRlc3RzIGZyb20KKy0tIHNxdWFyZXJvb3QuZGVjVGVzdCBpbXBsZW1lbnRlZCB1c2luZyBwb3dlcih4LCAwLjUpCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKKy0tIGJhc2UgY2hlY2tzLiAgTm90ZSAwKiowIGlzIGFuIGVycm9yLgorcG93eDAwMSBwb3dlciAgICAnMCcgICcwJyAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcG93eDAwMiBwb3dlciAgICAnMCcgICcxJyAgICAgICAgIC0+ICcwJworcG93eDAwMyBwb3dlciAgICAnMCcgICcyJyAgICAgICAgIC0+ICcwJworcG93eDAwNCBwb3dlciAgICAnMScgICcwJyAgICAgICAgIC0+ICcxJworcG93eDAwNSBwb3dlciAgICAnMScgICcxJyAgICAgICAgIC0+ICcxJworcG93eDAwNiBwb3dlciAgICAnMScgICcyJyAgICAgICAgIC0+ICcxJworCitwb3d4MDEwIHBvd2VyICAgICcyJyAgJzAnICAgICAgICAgLT4gJzEnCitwb3d4MDExIHBvd2VyICAgICcyJyAgJzEnICAgICAgICAgLT4gJzInCitwb3d4MDEyIHBvd2VyICAgICcyJyAgJzInICAgICAgICAgLT4gJzQnCitwb3d4MDEzIHBvd2VyICAgICcyJyAgJzMnICAgICAgICAgLT4gJzgnCitwb3d4MDE0IHBvd2VyICAgICcyJyAgJzQnICAgICAgICAgLT4gJzE2JworcG93eDAxNSBwb3dlciAgICAnMicgICc1JyAgICAgICAgIC0+ICczMicKK3Bvd3gwMTYgcG93ZXIgICAgJzInICAnNicgICAgICAgICAtPiAnNjQnCitwb3d4MDE3IHBvd2VyICAgICcyJyAgJzcnICAgICAgICAgLT4gJzEyOCcKK3Bvd3gwMTggcG93ZXIgICAgJzInICAnOCcgICAgICAgICAtPiAnMjU2JworcG93eDAxOSBwb3dlciAgICAnMicgICc5JyAgICAgICAgIC0+ICc1MTInCitwb3d4MDIwIHBvd2VyICAgICcyJyAgJzEwJyAgICAgICAgLT4gJzEwMjQnCitwb3d4MDIxIHBvd2VyICAgICcyJyAgJzExJyAgICAgICAgLT4gJzIwNDgnCitwb3d4MDIyIHBvd2VyICAgICcyJyAgJzEyJyAgICAgICAgLT4gJzQwOTYnCitwb3d4MDIzIHBvd2VyICAgICcyJyAgJzE1JyAgICAgICAgLT4gJzMyNzY4JworcG93eDAyNCBwb3dlciAgICAnMicgICcxNicgICAgICAgIC0+ICc2NTUzNicKK3Bvd3gwMjUgcG93ZXIgICAgJzInICAnMzEnICAgICAgICAtPiAnMjE0NzQ4MzY0OCcKKy0tIE5CIDAgbm90IHN0cmlwcGVkIGluIG5leHQKK3Bvd3gwMjYgcG93ZXIgICAgJzInICAnMzInICAgICAgICAtPiAnNDI5NDk2NzI5NicKKworcHJlY2lzaW9uOiA5Citwb3d4MDI3IHBvd2VyICAgICcyJyAgJzMxJyAgICAgICAgLT4gJzIuMTQ3NDgzNjVFKzknIEluZXhhY3QgUm91bmRlZAorLS0gTkIgMCBub3Qgc3RyaXBwZWQgaW4gbmV4dAorcG93eDAyOCBwb3dlciAgICAnMicgICczMicgICAgICAgIC0+ICc0LjI5NDk2NzMwRSs5JyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTAKK3Bvd3gwMjkgcG93ZXIgICAgJzInICAnMzEnICAgICAgICAtPiAnMjE0NzQ4MzY0OCcKK3Bvd3gwMzAgcG93ZXIgICAgJzInICAnMzInICAgICAgICAtPiAnNDI5NDk2NzI5NicKK3ByZWNpc2lvbjogOQorCitwb3d4MDMxIHBvd2VyICAgICczJyAgJzInICAgICAgICAgLT4gOQorcG93eDAzMiBwb3dlciAgICAnNCcgICcyJyAgICAgICAgIC0+IDE2Citwb3d4MDMzIHBvd2VyICAgICc1JyAgJzInICAgICAgICAgLT4gMjUKK3Bvd3gwMzQgcG93ZXIgICAgJzYnICAnMicgICAgICAgICAtPiAzNgorcG93eDAzNSBwb3dlciAgICAnNycgICcyJyAgICAgICAgIC0+IDQ5Citwb3d4MDM2IHBvd2VyICAgICc4JyAgJzInICAgICAgICAgLT4gNjQKK3Bvd3gwMzcgcG93ZXIgICAgJzknICAnMicgICAgICAgICAtPiA4MQorcG93eDAzOCBwb3dlciAgICAnMTAnICcyJyAgICAgICAgIC0+IDEwMAorcG93eDAzOSBwb3dlciAgICAnMTEnICcyJyAgICAgICAgIC0+IDEyMQorcG93eDA0MCBwb3dlciAgICAnMTInICcyJyAgICAgICAgIC0+IDE0NAorCitwb3d4MDQxIHBvd2VyICAgICczJyAgJzMnICAgICAgICAgLT4gMjcKK3Bvd3gwNDIgcG93ZXIgICAgJzQnICAnMycgICAgICAgICAtPiA2NAorcG93eDA0MyBwb3dlciAgICAnNScgICczJyAgICAgICAgIC0+IDEyNQorcG93eDA0NCBwb3dlciAgICAnNicgICczJyAgICAgICAgIC0+IDIxNgorcG93eDA0NSBwb3dlciAgICAnNycgICczJyAgICAgICAgIC0+IDM0MworcG93eDA0NyBwb3dlciAgICctMycgICczJyAgICAgICAgIC0+IC0yNworcG93eDA0OCBwb3dlciAgICctNCcgICczJyAgICAgICAgIC0+IC02NAorcG93eDA0OSBwb3dlciAgICctNScgICczJyAgICAgICAgIC0+IC0xMjUKK3Bvd3gwNTAgcG93ZXIgICAnLTYnICAnMycgICAgICAgICAtPiAtMjE2Citwb3d4MDUxIHBvd2VyICAgJy03JyAgJzMnICAgICAgICAgLT4gLTM0MworCitwb3d4MDUyIHBvd2VyICAgJzEwJyAgJzAnICAgICAgICAgLT4gMQorcG93eDA1MyBwb3dlciAgICcxMCcgICcxJyAgICAgICAgIC0+IDEwCitwb3d4MDU0IHBvd2VyICAgJzEwJyAgJzInICAgICAgICAgLT4gMTAwCitwb3d4MDU1IHBvd2VyICAgJzEwJyAgJzMnICAgICAgICAgLT4gMTAwMAorcG93eDA1NiBwb3dlciAgICcxMCcgICc0JyAgICAgICAgIC0+IDEwMDAwCitwb3d4MDU3IHBvd2VyICAgJzEwJyAgJzUnICAgICAgICAgLT4gMTAwMDAwCitwb3d4MDU4IHBvd2VyICAgJzEwJyAgJzYnICAgICAgICAgLT4gMTAwMDAwMAorcG93eDA1OSBwb3dlciAgICcxMCcgICc3JyAgICAgICAgIC0+IDEwMDAwMDAwCitwb3d4MDYwIHBvd2VyICAgJzEwJyAgJzgnICAgICAgICAgLT4gMTAwMDAwMDAwCitwb3d4MDYxIHBvd2VyICAgJzEwJyAgJzknICAgICAgICAgLT4gMS4wMDAwMDAwMEUrOSBSb3VuZGVkCitwb3d4MDYyIHBvd2VyICAgJzEwJyAgJzIyJyAgICAgICAgLT4gMS4wMDAwMDAwMEUrMjIgUm91bmRlZAorcG93eDA2MyBwb3dlciAgICcxMCcgICc3NycgICAgICAgIC0+IDEuMDAwMDAwMDBFKzc3IFJvdW5kZWQKK3Bvd3gwNjQgcG93ZXIgICAnMTAnICAnOTknICAgICAgICAtPiAxLjAwMDAwMDAwRSs5OSBSb3VuZGVkCisKK3Bvd3gwNzAgcG93ZXIgICcwLjMnICAnMCcgICAgICAgICAgIC0+ICcxJworcG93eDA3MSBwb3dlciAgJzAuMycgICcxJyAgICAgICAgICAgLT4gJzAuMycKK3Bvd3gwNzIgcG93ZXIgICcwLjMnICAnMS4wMCcgICAgICAgIC0+ICcwLjMnCitwb3d4MDczIHBvd2VyICAnMC4zJyAgJzIuMDAnICAgICAgICAtPiAnMC4wOScKK3Bvd3gwNzQgcG93ZXIgICcwLjMnICAnMi4wMDAwMDAwMDAnIC0+ICcwLjA5JworcG93eDA3NSBwb3dlciAgJzYuMCcgICcxJyAgICAgICAgICAgLT4gJzYuMCcgICAgIC0tIE5CIHplcm9zIG5vdCBzdHJpcHBlZAorcG93eDA3NiBwb3dlciAgJzYuMCcgICcyJyAgICAgICAgICAgLT4gJzM2LjAwJyAgIC0tIC4uCitwb3d4MDc3IHBvd2VyICAgJy0zJyAgJzInICAgICAgICAgICAtPiAnOScgICAgICAgLS0gZnJvbSBOZXRSZXh4IGJvb2sKK3Bvd3gwNzggcG93ZXIgICAgJzQnICAnMycgICAgICAgICAgIC0+ICc2NCcgICAgICAtLSAuLiAoc29ydCBvZikKKworcG93eDA4MCBwb3dlciAgIDAuMSAgICAwICAgICAgICAgICAgLT4gMQorcG93eDA4MSBwb3dlciAgIDAuMSAgICAxICAgICAgICAgICAgLT4gMC4xCitwb3d4MDgyIHBvd2VyICAgMC4xICAgIDIgICAgICAgICAgICAtPiAwLjAxCitwb3d4MDgzIHBvd2VyICAgMC4xICAgIDMgICAgICAgICAgICAtPiAwLjAwMQorcG93eDA4NCBwb3dlciAgIDAuMSAgICA0ICAgICAgICAgICAgLT4gMC4wMDAxCitwb3d4MDg1IHBvd2VyICAgMC4xICAgIDUgICAgICAgICAgICAtPiAwLjAwMDAxCitwb3d4MDg2IHBvd2VyICAgMC4xICAgIDYgICAgICAgICAgICAtPiAwLjAwMDAwMQorcG93eDA4NyBwb3dlciAgIDAuMSAgICA3ICAgICAgICAgICAgLT4gMUUtNworcG93eDA4OCBwb3dlciAgIDAuMSAgICA4ICAgICAgICAgICAgLT4gMUUtOAorcG93eDA4OSBwb3dlciAgIDAuMSAgICA5ICAgICAgICAgICAgLT4gMUUtOQorCitwb3d4MDkwIHBvd2VyICAgMTAxICAgIDIgICAgICAgICAgICAtPiAxMDIwMQorcG93eDA5MSBwb3dlciAgIDEwMSAgICAzICAgICAgICAgICAgLT4gMTAzMDMwMQorcG93eDA5MiBwb3dlciAgIDEwMSAgICA0ICAgICAgICAgICAgLT4gMTA0MDYwNDAxCitwb3d4MDkzIHBvd2VyICAgMTAxICAgIDUgICAgICAgICAgICAtPiAxLjA1MTAxMDA1RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gwOTQgcG93ZXIgICAxMDEgICAgNiAgICAgICAgICAgIC0+IDEuMDYxNTIwMTVFKzEyIEluZXhhY3QgUm91bmRlZAorcG93eDA5NSBwb3dlciAgIDEwMSAgICA3ICAgICAgICAgICAgLT4gMS4wNzIxMzUzNUUrMTQgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHBvd2VycworcG93eDA5OSBwb3dlciAgJzEnICAnLTEnICAgIC0+IDEKK3Bvd3gxMDAgcG93ZXIgICczJyAgJy0xJyAgICAtPiAwLjMzMzMzMzMzMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMDEgcG93ZXIgICcyJyAgJy0xJyAgICAtPiAwLjUKK3Bvd3gxMDIgcG93ZXIgICcyJyAgJy0yJyAgICAtPiAwLjI1Citwb3d4MTAzIHBvd2VyICAnMicgICctNCcgICAgLT4gMC4wNjI1Citwb3d4MTA0IHBvd2VyICAnMicgICctOCcgICAgLT4gMC4wMDM5MDYyNQorcG93eDEwNSBwb3dlciAgJzInICAnLTE2JyAgIC0+IDAuMDAwMDE1MjU4Nzg5MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMDYgcG93ZXIgICcyJyAgJy0zMicgICAtPiAyLjMyODMwNjQ0RS0xMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMDggcG93ZXIgICcyJyAgJy02NCcgICAtPiA1LjQyMTAxMDg2RS0yMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMTAgcG93ZXIgICcxMCcgICctOCcgICAtPiAxRS04Citwb3d4MTExIHBvd2VyICAnMTAnICAnLTcnICAgLT4gMUUtNworcG93eDExMiBwb3dlciAgJzEwJyAgJy02JyAgIC0+IDAuMDAwMDAxCitwb3d4MTEzIHBvd2VyICAnMTAnICAnLTUnICAgLT4gMC4wMDAwMQorcG93eDExNCBwb3dlciAgJzEwJyAgJy00JyAgIC0+IDAuMDAwMQorcG93eDExNSBwb3dlciAgJzEwJyAgJy0zJyAgIC0+IDAuMDAxCitwb3d4MTE2IHBvd2VyICAnMTAnICAnLTInICAgLT4gMC4wMQorcG93eDExNyBwb3dlciAgJzEwJyAgJy0xJyAgIC0+IDAuMQorcG93eDEyMSBwb3dlciAgJzEwJyAgJy03NycgIC0+ICcxRS03NycKK3Bvd3gxMjIgcG93ZXIgICcxMCcgICctMjInICAtPiAnMUUtMjInCisKK3Bvd3gxMjMgcG93ZXIgICAnMicgICctMScgICAtPiAnMC41JworcG93eDEyNCBwb3dlciAgICcyJyAgJy0yJyAgIC0+ICcwLjI1JworcG93eDEyNSBwb3dlciAgICcyJyAgJy00JyAgIC0+ICcwLjA2MjUnCisKK3Bvd3gxMjYgcG93ZXIgICAnMCcgICctMScgICAtPiBJbmZpbml0eQorcG93eDEyNyBwb3dlciAgICcwJyAgJy0yJyAgIC0+IEluZmluaXR5Citwb3d4MTI4IHBvd2VyICAgLTAgICAnLTEnICAgLT4gLUluZmluaXR5Citwb3d4MTI5IHBvd2VyICAgLTAgICAnLTInICAgLT4gSW5maW5pdHkKKworLS0gIjAuNSIgdGVzdHMgZnJvbSBvcmlnaW5hbCBSZXh4IGRpYWdub3N0aWNzIFtsb29wIHVucm9sbGVkXQorcG93eDIwMCBwb3dlciAgIDAuNSAgICAwICAgIC0+IDEKK3Bvd3gyMDEgcG93ZXIgICAwLjUgICAgMSAgICAtPiAwLjUKK3Bvd3gyMDIgcG93ZXIgICAwLjUgICAgMiAgICAtPiAwLjI1Citwb3d4MjAzIHBvd2VyICAgMC41ICAgIDMgICAgLT4gMC4xMjUKK3Bvd3gyMDQgcG93ZXIgICAwLjUgICAgNCAgICAtPiAwLjA2MjUKK3Bvd3gyMDUgcG93ZXIgICAwLjUgICAgNSAgICAtPiAwLjAzMTI1Citwb3d4MjA2IHBvd2VyICAgMC41ICAgIDYgICAgLT4gMC4wMTU2MjUKK3Bvd3gyMDcgcG93ZXIgICAwLjUgICAgNyAgICAtPiAwLjAwNzgxMjUKK3Bvd3gyMDggcG93ZXIgICAwLjUgICAgOCAgICAtPiAwLjAwMzkwNjI1Citwb3d4MjA5IHBvd2VyICAgMC41ICAgIDkgICAgLT4gMC4wMDE5NTMxMjUKK3Bvd3gyMTAgcG93ZXIgICAwLjUgICAxMCAgICAtPiAwLjAwMDk3NjU2MjUKKworcG93eDIxMSBwb3dlciAxICAxMDAwMDAwMDAgIC0+IDEKK3Bvd3gyMTIgcG93ZXIgMSAgOTk5OTk5OTk4ICAtPiAxCitwb3d4MjEzIHBvd2VyIDEgIDk5OTk5OTk5OSAgLT4gMQorCisKKy0tIFRoZSBWaWVubmEgY2FzZS4gIENoZWNrcyBib3RoIHNldHVwIGFuZCAxL2FjYyB3b3JraW5nIHByZWNpc2lvbgorLS0gTW9kaWZpZWQgMTk5OC4xMi4xNCBhcyBSSFMgbm8gbG9uZ2VyIHJvdW5kZWQgYmVmb3JlIHVzZSAobXVzdCBmaXQpCistLSBNb2RpZmllZCAxOTkwLjAyLjA0IGFzIExIUyBpcyBub3cgcm91bmRlZCAoaW5zdGVhZCBvZiB0cnVuY2F0ZWQgdG8gZ3VhcmQpCistLSAgICAnMTIzNDU2Nzg5RSsxMCcgICAgLS0gbGhzIC4uIHJvdW5kZWQgdG8gMS4yM0UrMTgKKy0tICAgICctMS4yMzAwMGUrMicgICAgICAtLSByaHMgLi4gW3dhczogLTEuMjM0NTVlKzIsIHJvdW5kcyB0byAtMTIzXQorLS0gTW9kaWZpZWQgMjAwMi4xMC4wNiAtLSBmaW5hbGx5LCBubyBpbnB1dCByb3VuZGluZworLS0gV2l0aCBpbnB1dCByb3VuZGluZywgcmVzdWx0IHdvdWxkIGJlIDguNzRFLTIyMjYKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDUwMDAKK21pbmV4cG9uZW50OiAtNTAwMAorcG93eDIxOSBwb3dlciAnMTIzNDU2Nzg5RSsxMCcgJy0xLjIzMDAwZSsyJyAtPiAnNS41NEUtMjIyNicgSW5leGFjdCBSb3VuZGVkCisKKy0tIHplcm9zCittYXhleHBvbmVudDogKzk2CittaW5leHBvbmVudDogLTk1CitwcmVjaXNpb246IDcKK3Bvd3gyMjMgcG93ZXIgICAgICAgICAgMEUtMzAgMyAgLT4gIDAKK3Bvd3gyMjQgcG93ZXIgICAgICAgICAgMEUtMTAgMyAgLT4gIDAKK3Bvd3gyMjUgcG93ZXIgICAgICAgICAgMEUtMSAgMyAgLT4gIDAKK3Bvd3gyMjYgcG93ZXIgICAgICAgICAgMEUrMCAgMyAgLT4gIDAKK3Bvd3gyMjcgcG93ZXIgICAgICAgICAgMCAgICAgMyAgLT4gIDAKK3Bvd3gyMjggcG93ZXIgICAgICAgICAgMEUrMSAgMyAgLT4gIDAKK3Bvd3gyMjkgcG93ZXIgICAgICAgICAgMEUrMTAgMyAgLT4gIDAKK3Bvd3gyMzAgcG93ZXIgICAgICAgICAgMEUrMzAgMyAgLT4gIDAKK3Bvd3gyMzEgcG93ZXIgICAgIDMgICAgMEUtMzAgICAgLT4gIDEKK3Bvd3gyMzIgcG93ZXIgICAgIDMgICAgMEUtMTAgICAgLT4gIDEKK3Bvd3gyMzMgcG93ZXIgICAgIDMgICAgMEUtMSAgICAgLT4gIDEKK3Bvd3gyMzQgcG93ZXIgICAgIDMgICAgMEUrMCAgICAgLT4gIDEKK3Bvd3gyMzUgcG93ZXIgICAgIDMgICAgMCAgICAgICAgLT4gIDEKK3Bvd3gyMzYgcG93ZXIgICAgIDMgICAgMEUrMSAgICAgLT4gIDEKK3Bvd3gyMzcgcG93ZXIgICAgIDMgICAgMEUrMTAgICAgLT4gIDEKK3Bvd3gyMzggcG93ZXIgICAgIDMgICAgMEUrMzAgICAgLT4gIDEKK3Bvd3gyMzkgcG93ZXIgICAgICAgICAgMEUtMzAgLTMgLT4gIEluZmluaXR5Citwb3d4MjQwIHBvd2VyICAgICAgICAgIDBFLTEwIC0zIC0+ICBJbmZpbml0eQorcG93eDI0MSBwb3dlciAgICAgICAgICAwRS0xICAtMyAtPiAgSW5maW5pdHkKK3Bvd3gyNDIgcG93ZXIgICAgICAgICAgMEUrMCAgLTMgLT4gIEluZmluaXR5Citwb3d4MjQzIHBvd2VyICAgICAgICAgIDAgICAgIC0zIC0+ICBJbmZpbml0eQorcG93eDI0NCBwb3dlciAgICAgICAgICAwRSsxICAtMyAtPiAgSW5maW5pdHkKK3Bvd3gyNDUgcG93ZXIgICAgICAgICAgMEUrMTAgLTMgLT4gIEluZmluaXR5Citwb3d4MjQ2IHBvd2VyICAgICAgICAgIDBFKzMwIC0zIC0+ICBJbmZpbml0eQorcG93eDI0NyBwb3dlciAgICAtMyAgICAwRS0zMCAgICAtPiAgMQorcG93eDI0OCBwb3dlciAgICAtMyAgICAwRS0xMCAgICAtPiAgMQorcG93eDI0OSBwb3dlciAgICAtMyAgICAwRS0xICAgICAtPiAgMQorcG93eDI1MCBwb3dlciAgICAtMyAgICAwRSswICAgICAtPiAgMQorcG93eDI1MSBwb3dlciAgICAtMyAgICAwICAgICAgICAtPiAgMQorcG93eDI1MiBwb3dlciAgICAtMyAgICAwRSsxICAgICAtPiAgMQorcG93eDI1MyBwb3dlciAgICAtMyAgICAwRSsxMCAgICAtPiAgMQorcG93eDI1NCBwb3dlciAgICAtMyAgICAwRSszMCAgICAtPiAgMQorCistLSBhIGZldyBsaHMgbmVnYXRpdmVzCitwcmVjaXNpb246IDkKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5Citwb3d4MjYwIHBvd2VyICAgLTEwICAgJzAnICAgICAgICAgLT4gMQorcG93eDI2MSBwb3dlciAgIC0xMCAgICcxJyAgICAgICAgIC0+IC0xMAorcG93eDI2MiBwb3dlciAgIC0xMCAgICcyJyAgICAgICAgIC0+IDEwMAorcG93eDI2MyBwb3dlciAgIC0xMCAgICczJyAgICAgICAgIC0+IC0xMDAwCitwb3d4MjY0IHBvd2VyICAgLTEwICAgJzQnICAgICAgICAgLT4gMTAwMDAKK3Bvd3gyNjUgcG93ZXIgICAtMTAgICAnNScgICAgICAgICAtPiAtMTAwMDAwCitwb3d4MjY2IHBvd2VyICAgLTEwICAgJzYnICAgICAgICAgLT4gMTAwMDAwMAorcG93eDI2NyBwb3dlciAgIC0xMCAgICc3JyAgICAgICAgIC0+IC0xMDAwMDAwMAorcG93eDI2OCBwb3dlciAgIC0xMCAgICc4JyAgICAgICAgIC0+IDEwMDAwMDAwMAorcG93eDI2OSBwb3dlciAgIC0xMCAgICc5JyAgICAgICAgIC0+IC0xLjAwMDAwMDAwRSs5IFJvdW5kZWQKK3Bvd3gyNzAgcG93ZXIgICAtMTAgICAnMjInICAgICAgICAtPiAxLjAwMDAwMDAwRSsyMiBSb3VuZGVkCitwb3d4MjcxIHBvd2VyICAgLTEwICAgJzc3JyAgICAgICAgLT4gLTEuMDAwMDAwMDBFKzc3IFJvdW5kZWQKK3Bvd3gyNzIgcG93ZXIgICAtMTAgICAnOTknICAgICAgICAtPiAtMS4wMDAwMDAwMEUrOTkgUm91bmRlZAorCistLSBzb21lIG1vcmUgZWRnZSBjYXNlcworcHJlY2lzaW9uOiAgIDE1CittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcG93eDM5MSBwb3dlciAgMC4xICAgOTk5IC0+IDFFLTk5OQorcG93eDM5MiBwb3dlciAgMC4wOTkgOTk5IC0+IDQuMzYwNzMyMDYyRS0xMDA0IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MzkzIHBvd2VyICAwLjA5OCA5OTkgLT4gMS43MTczMUUtMTAwOCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM5NCBwb3dlciAgMC4wOTcgOTk5IC0+IDZFLTEwMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzOTUgcG93ZXIgIDAuMDk2IDk5OSAtPiAwRS0xMDEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gzOTYgcG93ZXIgIDAuMDEgIDk5OSAtPiAwRS0xMDEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gzOTcgcG93ZXIgIDAuMDIgMTAwMDAwMDAwIC0+IDBFLTEwMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBtdWx0aXBseSB0ZXN0cyBhcmUgaGVyZSB0byBhaWQgY2hlY2tpbmcgYW5kIHRlc3QgZm9yIGNvbnNpc3RlbnQgaGFuZGxpbmcKKy0tIG9mIHVuZGVyZmxvdworcHJlY2lzaW9uOiA1CittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCistLSBzcXVhcmVzCittdWx4NDAwIG11bHRpcGx5ICAxRS01MDIgICAgIDFlLTUwMiAtPiAwRS0xMDAzICAgIFN1Ym5vcm1hbCBJbmV4YWN0IFVuZGVyZmxvdyBSb3VuZGVkIENsYW1wZWQKK211bHg0MDEgbXVsdGlwbHkgIDFFLTUwMSAgICAgMWUtNTAxIC0+IDFFLTEwMDIgICAgU3Vibm9ybWFsCittdWx4NDAyIG11bHRpcGx5ICAyRS01MDEgICAgIDJlLTUwMSAtPiA0RS0xMDAyICAgIFN1Ym5vcm1hbAorbXVseDQwMyBtdWx0aXBseSAgNEUtNTAxICAgICA0ZS01MDEgLT4gMS42RS0xMDAxICBTdWJub3JtYWwKK211bHg0MDQgbXVsdGlwbHkgMTBFLTUwMSAgICAxMGUtNTAxIC0+IDEuMDBFLTEwMDAgU3Vibm9ybWFsCittdWx4NDA1IG11bHRpcGx5IDMwRS01MDEgICAgMzBlLTUwMSAtPiA5LjAwRS0xMDAwIFN1Ym5vcm1hbAorbXVseDQwNiBtdWx0aXBseSA0MEUtNTAxICAgIDQwZS01MDEgLT4gMS42MDBFLTk5OQorCitwb3d4NDAwIHBvd2VyICAgICAxRS01MDIgICAgIDIgICAgICAtPiAwRS0xMDAzICAgIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3g0MDEgcG93ZXIgICAgIDFFLTUwMSAgICAgMiAgICAgIC0+IDFFLTEwMDIgICAgU3Vibm9ybWFsCitwb3d4NDAyIHBvd2VyICAgICAyRS01MDEgICAgIDIgICAgICAtPiA0RS0xMDAyICAgIFN1Ym5vcm1hbAorcG93eDQwMyBwb3dlciAgICAgNEUtNTAxICAgICAyICAgICAgLT4gMS42RS0xMDAxICBTdWJub3JtYWwKK3Bvd3g0MDQgcG93ZXIgICAgMTBFLTUwMSAgICAgMiAgICAgIC0+IDEuMDBFLTEwMDAgU3Vibm9ybWFsCitwb3d4NDA1IHBvd2VyICAgIDMwRS01MDEgICAgIDIgICAgICAtPiA5LjAwRS0xMDAwIFN1Ym5vcm1hbAorcG93eDQwNiBwb3dlciAgICA0MEUtNTAxICAgICAyICAgICAgLT4gMS42MDBFLTk5OQorCistLSBjdWJlcworbXVseDQxMCBtdWx0aXBseSAgMUUtNjcwICAgICAxZS0zMzUgLT4gMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCittdWx4NDExIG11bHRpcGx5ICAxRS02NjggICAgIDFlLTMzNCAtPiAxRS0xMDAyICAgIFN1Ym5vcm1hbAorbXVseDQxMiBtdWx0aXBseSAgNEUtNjY4ICAgICAyZS0zMzQgLT4gOEUtMTAwMiAgICBTdWJub3JtYWwKK211bHg0MTMgbXVsdGlwbHkgIDlFLTY2OCAgICAgM2UtMzM0IC0+IDIuN0UtMTAwMSAgU3Vibm9ybWFsCittdWx4NDE0IG11bHRpcGx5IDE2RS02NjggICAgIDRlLTMzNCAtPiA2LjRFLTEwMDEgIFN1Ym5vcm1hbAorbXVseDQxNSBtdWx0aXBseSAyNUUtNjY4ICAgICA1ZS0zMzQgLT4gMS4yNUUtMTAwMCBTdWJub3JtYWwKK211bHg0MTYgbXVsdGlwbHkgMTBFLTY2OCAgIDEwMGUtMzM0IC0+IDEuMDAwRS05OTkKKworcG93eDQxMCBwb3dlciAgICAgMUUtMzM1ICAgICAzICAgICAgLT4gMEUtMTAwMyAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4NDExIHBvd2VyICAgICAxRS0zMzQgICAgIDMgICAgICAtPiAxRS0xMDAyICAgIFN1Ym5vcm1hbAorcG93eDQxMiBwb3dlciAgICAgMkUtMzM0ICAgICAzICAgICAgLT4gOEUtMTAwMiAgICBTdWJub3JtYWwKK3Bvd3g0MTMgcG93ZXIgICAgIDNFLTMzNCAgICAgMyAgICAgIC0+IDIuN0UtMTAwMSAgU3Vibm9ybWFsCitwb3d4NDE0IHBvd2VyICAgICA0RS0zMzQgICAgIDMgICAgICAtPiA2LjRFLTEwMDEgIFN1Ym5vcm1hbAorcG93eDQxNSBwb3dlciAgICAgNUUtMzM0ICAgICAzICAgICAgLT4gMS4yNUUtMTAwMCBTdWJub3JtYWwKK3Bvd3g0MTYgcG93ZXIgICAgMTBFLTMzNCAgICAgMyAgICAgIC0+IDEuMDAwRS05OTkKKworLS0gbmVnYXRpdmUgcG93ZXJzLCB0ZXN0aW5nIHN1Ym5vcm1hbHMKK3ByZWNpc2lvbjogICA1CittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcG93eDQyMSBwb3dlciAgMi41RS01MDEgICAgIC0yICAgICAgICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDQyMiBwb3dlciAgMi41RS01MDAgICAgIC0yICAgICAgICAgLT4gIDEuNkUrOTk5CisKK3Bvd3g0MjMgcG93ZXIgIDIuNUUrNDk5ICAgICAtMiAgICAgICAgIC0+ICAxLjZFLTk5OQorcG93eDQyNCBwb3dlciAgMi41RSs1MDAgICAgIC0yICAgICAgICAgLT4gIDEuNkUtMTAwMSBTdWJub3JtYWwKK3Bvd3g0MjUgcG93ZXIgIDIuNUUrNTAxICAgICAtMiAgICAgICAgIC0+ICAgIDJFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjYgcG93ZXIgIDIuNUUrNTAyICAgICAtMiAgICAgICAgIC0+ICAgIDBFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitwb3d4NDI3IHBvd2VyIDAuMjVFKzQ5OSAgICAgLTIgICAgICAgICAtPiAgMS42RS05OTcKK3Bvd3g0MjggcG93ZXIgMC4yNUUrNTAwICAgICAtMiAgICAgICAgIC0+ICAxLjZFLTk5OQorcG93eDQyOSBwb3dlciAwLjI1RSs1MDEgICAgIC0yICAgICAgICAgLT4gIDEuNkUtMTAwMSBTdWJub3JtYWwKK3Bvd3g0MzAgcG93ZXIgMC4yNUUrNTAyICAgICAtMiAgICAgICAgIC0+ICAgIDJFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzEgcG93ZXIgMC4yNUUrNTAzICAgICAtMiAgICAgICAgIC0+ICAgIDBFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitwb3d4NDMyIHBvd2VyIDAuMDRFKzQ5OSAgICAgLTIgICAgICAgICAtPiAgNi4yNUUtOTk2Citwb3d4NDMzIHBvd2VyIDAuMDRFKzUwMCAgICAgLTIgICAgICAgICAtPiAgNi4yNUUtOTk4Citwb3d4NDM0IHBvd2VyIDAuMDRFKzUwMSAgICAgLTIgICAgICAgICAtPiAgNi4yNUUtMTAwMCBTdWJub3JtYWwKK3Bvd3g0MzUgcG93ZXIgMC4wNEUrNTAyICAgICAtMiAgICAgICAgIC0+ICAgNi4yRS0xMDAyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM2IHBvd2VyIDAuMDRFKzUwMyAgICAgLTIgICAgICAgICAtPiAgICAgMUUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDQzNyBwb3dlciAwLjA0RSs1MDQgICAgIC0yICAgICAgICAgLT4gICAgIDBFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCitwb3d4NDQxIHBvd2VyIDAuMDRFKzMzNCAgICAgLTMgICAgICAgICAtPiAgMS41NjI1RS05OTgKK3Bvd3g0NDIgcG93ZXIgMC4wNEUrMzM1ICAgICAtMyAgICAgICAgIC0+ICAgIDEuNTZFLTEwMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0NDMgcG93ZXIgMC4wNEUrMzM2ICAgICAtMyAgICAgICAgIC0+ICAgICAgIDBFLTEwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDQ0NCBwb3dlciAwLjI1RSszMzMgICAgIC0zICAgICAgICAgLT4gICAgIDYuNEUtOTk4Citwb3d4NDQ1IHBvd2VyIDAuMjVFKzMzNCAgICAgLTMgICAgICAgICAtPiAgICAgNi40RS0xMDAxIFN1Ym5vcm1hbAorcG93eDQ0NiBwb3dlciAwLjI1RSszMzUgICAgIC0zICAgICAgICAgLT4gICAgICAgMUUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDQ0NyBwb3dlciAwLjI1RSszMzYgICAgIC0zICAgICAgICAgLT4gICAgICAgMEUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCistLSBjaGVjayBzaWduIGZvciBjdWJlcyAgYW5kIGEgZmV3IHNxdWFyZXMKK3Bvd3g0NDggcG93ZXIgLTAuMDRFKzMzNCAgICAtMyAgICAgICAgIC0+IC0xLjU2MjVFLTk5OAorcG93eDQ0OSBwb3dlciAtMC4wNEUrMzM1ICAgIC0zICAgICAgICAgLT4gICAtMS41NkUtMTAwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDQ1MCBwb3dlciAtMC4wNEUrMzM2ICAgIC0zICAgICAgICAgLT4gICAgICAtMEUtMTAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4NDUxIHBvd2VyIC0wLjI1RSszMzMgICAgLTMgICAgICAgICAtPiAgICAtNi40RS05OTgKK3Bvd3g0NTIgcG93ZXIgLTAuMjVFKzMzNCAgICAtMyAgICAgICAgIC0+ICAgIC02LjRFLTEwMDEgU3Vibm9ybWFsCitwb3d4NDUzIHBvd2VyIC0wLjI1RSszMzUgICAgLTMgICAgICAgICAtPiAgICAgIC0xRS0xMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4NDU0IHBvd2VyIC0wLjI1RSszMzYgICAgLTMgICAgICAgICAtPiAgICAgIC0wRS0xMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3g0NTUgcG93ZXIgLTAuMDRFKzQ5OSAgICAtMiAgICAgICAgIC0+ICAgIDYuMjVFLTk5NgorcG93eDQ1NiBwb3dlciAtMC4wNEUrNTAwICAgIC0yICAgICAgICAgLT4gICAgNi4yNUUtOTk4Citwb3d4NDU3IHBvd2VyIC0wLjA0RSs1MDEgICAgLTIgICAgICAgICAtPiAgICA2LjI1RS0xMDAwIFN1Ym5vcm1hbAorcG93eDQ1OCBwb3dlciAtMC4wNEUrNTAyICAgIC0yICAgICAgICAgLT4gICAgIDYuMkUtMTAwMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IC0wcworcHJlY2lzaW9uOiA5Citwb3d4NTYwIHBvd2VyICAwICAwICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NTYxIHBvd2VyICAwIC0wICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NTYyIHBvd2VyIC0wICAwICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NTYzIHBvd2VyIC0wIC0wICAgICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NTY0IHBvd2VyICAxICAwICAgICAgICAtPiAgMQorcG93eDU2NSBwb3dlciAgMSAtMCAgICAgICAgLT4gIDEKK3Bvd3g1NjYgcG93ZXIgLTEgIDAgICAgICAgIC0+ICAxCitwb3d4NTY3IHBvd2VyIC0xIC0wICAgICAgICAtPiAgMQorcG93eDU2OCBwb3dlciAgMCAgMSAgICAgICAgLT4gIDAKK3Bvd3g1NjkgcG93ZXIgIDAgLTEgICAgICAgIC0+ICBJbmZpbml0eQorcG93eDU3MCBwb3dlciAtMCAgMSAgICAgICAgLT4gLTAKK3Bvd3g1NzEgcG93ZXIgLTAgLTEgICAgICAgIC0+IC1JbmZpbml0eQorcG93eDU3MiBwb3dlciAgMCAgMiAgICAgICAgLT4gIDAKK3Bvd3g1NzMgcG93ZXIgIDAgLTIgICAgICAgIC0+ICBJbmZpbml0eQorcG93eDU3NCBwb3dlciAtMCAgMiAgICAgICAgLT4gIDAKK3Bvd3g1NzUgcG93ZXIgLTAgLTIgICAgICAgIC0+ICBJbmZpbml0eQorcG93eDU3NiBwb3dlciAgMCAgMyAgICAgICAgLT4gIDAKK3Bvd3g1NzcgcG93ZXIgIDAgLTMgICAgICAgIC0+ICBJbmZpbml0eQorcG93eDU3OCBwb3dlciAtMCAgMyAgICAgICAgLT4gLTAKK3Bvd3g1NzkgcG93ZXIgLTAgLTMgICAgICAgIC0+IC1JbmZpbml0eQorCistLSBTcGVjaWFscworcG93eDU4MCBwb3dlciAgSW5mICAtSW5mICAgLT4gIDAKK3Bvd3g1ODEgcG93ZXIgIEluZiAgLTEwMDAgIC0+ICAwCitwb3d4NTgyIHBvd2VyICBJbmYgIC0xICAgICAtPiAgMAorcG93eDU4MyBwb3dlciAgSW5mICAtMC41ICAgLT4gIDAKK3Bvd3g1ODQgcG93ZXIgIEluZiAgLTAgICAgIC0+ICAxCitwb3d4NTg1IHBvd2VyICBJbmYgICAwICAgICAtPiAgMQorcG93eDU4NiBwb3dlciAgSW5mICAgMC41ICAgLT4gIEluZmluaXR5Citwb3d4NTg3IHBvd2VyICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK3Bvd3g1ODggcG93ZXIgIEluZiAgIDEwMDAgIC0+ICBJbmZpbml0eQorcG93eDU4OSBwb3dlciAgSW5mICAgSW5mICAgLT4gIEluZmluaXR5Citwb3d4NTkwIHBvd2VyIC0xMDAwICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDU5MSBwb3dlciAtSW5mICAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g1OTIgcG93ZXIgLTEgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NTkzIHBvd2VyIC0wLjUgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDU5NCBwb3dlciAtMCAgICAgSW5mICAgLT4gIDAKK3Bvd3g1OTUgcG93ZXIgIDAgICAgIEluZiAgIC0+ICAwCitwb3d4NTk2IHBvd2VyICAwLjUgICBJbmYgICAtPiAgMAorcG93eDU5NyBwb3dlciAgMSAgICAgSW5mICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4NTk4IHBvd2VyICAxMDAwICBJbmYgICAtPiAgSW5maW5pdHkKK3Bvd3g1OTkgcG93ZXIgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorCitwb3d4NjAwIHBvd2VyIC1JbmYgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDYwMSBwb3dlciAtSW5mICAtMTAwMCAgLT4gIDAKK3Bvd3g2MDIgcG93ZXIgLUluZiAgLTEgICAgIC0+IC0wCitwb3d4NjAzIHBvd2VyIC1JbmYgIC0wLjUgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDYwNCBwb3dlciAtSW5mICAtMCAgICAgLT4gIDEKK3Bvd3g2MDUgcG93ZXIgLUluZiAgIDAgICAgIC0+ICAxCitwb3d4NjA2IHBvd2VyIC1JbmYgICAwLjUgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDYwNyBwb3dlciAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5Citwb3d4NjA4IHBvd2VyIC1JbmYgICAxMDAwICAtPiAgSW5maW5pdHkKK3Bvd3g2MDkgcG93ZXIgLUluZiAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjEwIHBvd2VyIC0xMDAwICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDYxMSBwb3dlciAtSW5mICAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2MTIgcG93ZXIgLTEgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjEzIHBvd2VyIC0wLjUgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDYxNCBwb3dlciAtMCAgICAtSW5mICAgLT4gIEluZmluaXR5Citwb3d4NjE1IHBvd2VyICAwICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK3Bvd3g2MTYgcG93ZXIgIDAuNSAgLUluZiAgIC0+ICBJbmZpbml0eQorcG93eDYxNyBwb3dlciAgMSAgICAtSW5mICAgLT4gIDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4NjE4IHBvd2VyICAxMDAwIC1JbmYgICAtPiAgMAorcG93eDYxOSBwb3dlciAgSW5mICAtSW5mICAgLT4gIDAKKworcG93eDYyMSBwb3dlciAgTmFOIC1JbmYgICAgLT4gIE5hTgorcG93eDYyMiBwb3dlciAgTmFOIC0xMDAwICAgLT4gIE5hTgorcG93eDYyMyBwb3dlciAgTmFOIC0xICAgICAgLT4gIE5hTgorcG93eDYyNCBwb3dlciAgTmFOIC0wLjUgICAgLT4gIE5hTgorcG93eDYyNSBwb3dlciAgTmFOIC0wICAgICAgLT4gIE5hTgorcG93eDYyNiBwb3dlciAgTmFOICAwICAgICAgLT4gIE5hTgorcG93eDYyNyBwb3dlciAgTmFOICAwLjUgICAgLT4gIE5hTgorcG93eDYyOCBwb3dlciAgTmFOICAxICAgICAgLT4gIE5hTgorcG93eDYyOSBwb3dlciAgTmFOICAxMDAwICAgLT4gIE5hTgorcG93eDYzMCBwb3dlciAgTmFOICBJbmYgICAgLT4gIE5hTgorcG93eDYzMSBwb3dlciAgTmFOICBOYU4gICAgLT4gIE5hTgorcG93eDYzMiBwb3dlciAtSW5mICBOYU4gICAgLT4gIE5hTgorcG93eDYzMyBwb3dlciAtMTAwMCBOYU4gICAgLT4gIE5hTgorcG93eDYzNCBwb3dlciAtMSAgICBOYU4gICAgLT4gIE5hTgorcG93eDYzNSBwb3dlciAtMCAgICBOYU4gICAgLT4gIE5hTgorcG93eDYzNiBwb3dlciAgMCAgICBOYU4gICAgLT4gIE5hTgorcG93eDYzNyBwb3dlciAgMSAgICBOYU4gICAgLT4gIE5hTgorcG93eDYzOCBwb3dlciAgMTAwMCBOYU4gICAgLT4gIE5hTgorcG93eDYzOSBwb3dlciAgSW5mICBOYU4gICAgLT4gIE5hTgorCitwb3d4NjQxIHBvd2VyICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY0MiBwb3dlciAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NDMgcG93ZXIgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjQ0IHBvd2VyICBzTmFOIC0wLjUgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY0NSBwb3dlciAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NDYgcG93ZXIgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjQ3IHBvd2VyICBzTmFOICAwLjUgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY0OCBwb3dlciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NDkgcG93ZXIgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjUwIHBvd2VyICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY1MSBwb3dlciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NTIgcG93ZXIgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjUzIHBvd2VyIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY1NCBwb3dlciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NTUgcG93ZXIgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjU2IHBvd2VyIC0wLjUgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY1NyBwb3dlciAtMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NTggcG93ZXIgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjU5IHBvd2VyICAwLjUgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY2MCBwb3dlciAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2NjEgcG93ZXIgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjYyIHBvd2VyICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY2MyBwb3dlciAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOIHByb3BhZ2F0aW9uCitwb3d4NjcwIHBvd2VyICBOYU4zICBzTmFONyAgLT4gIE5hTjcgIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjcxIHBvd2VyICBzTmFOOCAgTmFONiAgLT4gIE5hTjggIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjcyIHBvd2VyICAxICAgICBzTmFONyAgLT4gIE5hTjcgIEludmFsaWRfb3BlcmF0aW9uCitwb3d4NjczIHBvd2VyICBzTmFOOCAgMSAgICAgLT4gIE5hTjggIEludmFsaWRfb3BlcmF0aW9uCitwb3d4Njc0IHBvd2VyICBJbmYgICBzTmFONyAgLT4gIE5hTjcgIEludmFsaWRfb3BlcmF0aW9uCitwb3d4Njc1IHBvd2VyICBzTmFOOCAgSW5mICAgLT4gIE5hTjggIEludmFsaWRfb3BlcmF0aW9uCitwb3d4Njc2IHBvd2VyICBJbmYgICAgTmFOOSAgLT4gIE5hTjkKK3Bvd3g2NzcgcG93ZXIgIE5hTjYgICBJbmYgICAtPiAgTmFONgorcG93eDY3OCBwb3dlciAgMSAgICAgIE5hTjUgIC0+ICBOYU41Citwb3d4Njc5IHBvd2VyICBOYU4yICAgMSAgICAgLT4gIE5hTjIKK3Bvd3g2ODAgcG93ZXIgIE5hTjIgICBOYW40ICAtPiAgTmFOMgorcG93eDY4MSBwb3dlciAgTmFOICAgIE5hbjQgIC0+ICBOYU4KK3Bvd3g2ODIgcG93ZXIgIE5hTjM0NSBOYW4gICAtPiAgTmFOMzQ1Citwb3d4NjgzIHBvd2VyICBJbmYgICAgLXNOYU43IC0+IC1OYU43ICBJbnZhbGlkX29wZXJhdGlvbgorcG93eDY4NCBwb3dlciAgLXNOYU44ICBJbmYgICAtPiAtTmFOOCAgSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g2ODUgcG93ZXIgIEluZiAgICAtTmFOOSAgLT4gLU5hTjkKK3Bvd3g2ODYgcG93ZXIgIC1OYU42ICAgSW5mICAgLT4gLU5hTjYKK3Bvd3g2ODcgcG93ZXIgIC1OYU4yICAtTmFuNCAgLT4gLU5hTjIKKworLS0gbG9uZyBvcGVyYW5kIGFuZCBSSFMgcmFuZ2UgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5Citwb3d4NzAxIHBvd2VyIDEyMzQ1Njc4MDAwIDEgLT4gMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorcG93eDcwMiBwb3dlciAxMjM0NTY3ODAwICAxIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorcG93eDcwMyBwb3dlciAxMjM0NTY3ODkwICAxIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorcG93eDcwNCBwb3dlciAxMjM0NTY3ODkxICAxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitwb3d4NzA1IHBvd2VyIDEyMzQ1Njc4OTAxIDEgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCitwb3d4NzA2IHBvd2VyIDEyMzQ1Njc4OTYgIDEgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxNQorLS0gc3RpbGwgY2hlY2tpbmcKK3Bvd3g3NDEgcG93ZXIgMTIzNDU2NzgwMDAgMSAtPiAxMjM0NTY3ODAwMAorcG93eDc0MiBwb3dlciAxMjM0NTY3ODAwICAxIC0+IDEyMzQ1Njc4MDAKK3Bvd3g3NDMgcG93ZXIgMTIzNDU2Nzg5MCAgMSAtPiAxMjM0NTY3ODkwCitwb3d4NzQ0IHBvd2VyIDEyMzQ1Njc4OTEgIDEgLT4gMTIzNDU2Nzg5MQorcG93eDc0NSBwb3dlciAxMjM0NTY3ODkwMSAxIC0+IDEyMzQ1Njc4OTAxCitwb3d4NzQ2IHBvd2VyIDEyMzQ1Njc4OTYgIDEgLT4gMTIzNDU2Nzg5NgorCittYXhleHBvbmVudDogOTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OQorcHJlY2lzaW9uOiA5CisKKy0tIG5lYXIgb3V0LW9mLXJhbmdlIGVkZ2UgY2FzZXMKK3Bvd3gxNjMgcG93ZXIgICAnMTAnICAnOTk5OTk5JyAtPiAnMS4wMDAwMDAwMEUrOTk5OTk5JyBSb3VuZGVkCitwb3d4MTY0IHBvd2VyICAgJzEwJyAgJzk5OTk5OCcgLT4gJzEuMDAwMDAwMDBFKzk5OTk5OCcgUm91bmRlZAorcG93eDE2NSBwb3dlciAgICcxMCcgICc5OTk5OTcnIC0+ICcxLjAwMDAwMDAwRSs5OTk5OTcnIFJvdW5kZWQKK3Bvd3gxNjYgcG93ZXIgICAnMTAnICAnMzMzMzMzJyAtPiAnMS4wMDAwMDAwMEUrMzMzMzMzJyBSb3VuZGVkCitwb3d4MTgzIHBvd2VyICAgJzcnICAgJzEwMDAwMDAnICAtPiAxLjA5NjUxNDE5RSs4NDUwOTggSW5leGFjdCBSb3VuZGVkCitwb3d4MTg0IHBvd2VyICAgJzcnICAgJzEwMDAwMDEnICAtPiA3LjY3NTU5OTM0RSs4NDUwOTggSW5leGFjdCBSb3VuZGVkCitwb3d4MTg2IHBvd2VyICAgJzcnICAgJy0xMDAwMDAxJyAtPiAxLjMwMjgyOTg2RS04NDUwOTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MTg3IHBvd2VyICAgJzcnICAgJy0xMDAwMDAwJyAtPiA5LjExOTgwOTAxRS04NDUwOTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MTE4IHBvd2VyICAnMTAnICAnLTMzMzMzMycgICAtPiAxRS0zMzMzMzMKK3Bvd3gxMTkgcG93ZXIgICcxMCcgICctOTk5OTk4JyAgIC0+IDFFLTk5OTk5OAorcG93eDEyMCBwb3dlciAgJzEwJyAgJy05OTk5OTknICAgLT4gMUUtOTk5OTk5Citwb3d4MTgxIHBvd2VyICAgJzcnICAgJzk5OTk5OCcgICAtPiAyLjIzNzc4NDA2RSs4NDUwOTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MTgyIHBvd2VyICAgJzcnICAgJzk5OTk5OScgICAtPiAxLjU2NjQ0ODg0RSs4NDUwOTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MTg5IHBvd2VyICAgJzcnICAgJy05OTk5OTknICAtPiA2LjM4Mzg2NjMxRS04NDUwOTggSW5leGFjdCBSb3VuZGVkCitwb3d4MTkwIHBvd2VyICAgJzcnICAgJy05OTk5OTgnICAtPiA0LjQ2ODcwNjQxRS04NDUwOTcgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMKK3ByZWNpc2lvbjogOQorCitwb3d4Mjc3IHBvd2VyICA5ICAgICAgICAgICAgIDk5OTk5OSAtPiAzLjU5MDg0NjI5RSs5NTQyNDEgSW5leGFjdCBSb3VuZGVkCitwb3d4Mjc4IHBvd2VyICA5Ljk5OTk5OTk5ICAgIDk5OTk5OSAtPiA5Ljk5MDAwNTAxRSs5OTk5OTggSW5leGFjdCBSb3VuZGVkCitwb3d4Mjc5IHBvd2VyIDEwICAgICAgICAgICAgIDk5OTk5OSAtPiAxLjAwMDAwMDAwRSs5OTk5OTkgICAgICAgICBSb3VuZGVkCitwb3d4MjgwIHBvd2VyIDEwLjAwMDAwMDEgICAgIDk5OTk5OSAtPiAxLjAxMDA1MDE2RSs5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MjgxIHBvd2VyIDEwLjAwMDAwMSAgICAgIDk5OTk5OSAtPiAxLjEwNTE3MDgwRSs5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MjgyIHBvd2VyIDEwLjAwMDAxICAgICAgIDk5OTk5OSAtPiAyLjcxODI3Nzc1RSs5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MjgzIHBvd2VyIDEwLjAwMDEgICAgICAgIDk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyODUgcG93ZXIgMTEgICAgICAgICAgICAgOTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDI4NiBwb3dlciAxMiAgICAgICAgICAgICA5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4Mjg3IHBvd2VyIDk5OSAgICAgICAgICAgIDk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyODggcG93ZXIgOTk5OTk5OTk5ICAgICAgOTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDI4OSBwb3dlciA5LjlFOTk5OTk5OTk5ICA5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3Bvd3gyOTAgcG93ZXIgMC41ICAgICAgICAgICAgOTk5OTk5IC0+IDIuMDIwMDY4MTJFLTMwMTAzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyOTEgcG93ZXIgMC4xICAgICAgICAgICAgOTk5OTk5IC0+IDFFLTk5OTk5OSAgLS0gdW5yb3VuZGVkCitwb3d4MjkyIHBvd2VyIDAuMDkgICAgICAgICAgIDk5OTk5OSAtPiAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gyOTMgcG93ZXIgMC4wNSAgICAgICAgICAgOTk5OTk5IC0+IDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDI5NCBwb3dlciAwLjAxICAgICAgICAgICA5OTk5OTkgLT4gMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4Mjk1IHBvd2VyIDAuMDAwMSAgICAgICAgIDk5OTk5OSAtPiAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gyOTcgcG93ZXIgMC4wMDAwMDAxICAgICAgOTk5OTk5IC0+IDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDI5OCBwb3dlciAwLjAwMDAwMDAwMDEgICA5OTk5OTkgLT4gMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4Mjk5IHBvd2VyIDFFLTk5OTk5OTk5OSAgIDk5OTk5OSAtPiAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworcG93eDMxMCBwb3dlciAtOSAgICAgICAgICAgICA5OTk5OTkgLT4gLTMuNTkwODQ2MjlFKzk1NDI0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTEgcG93ZXIgLTEwICAgICAgICAgICAgOTk5OTk5IC0+IC0xLjAwMDAwMDAwRSs5OTk5OTkgUm91bmRlZAorcG93eDMxMiBwb3dlciAtMTAuMDAwMSAgICAgICA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMxMyBwb3dlciAtMTAuMSAgICAgICAgICA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMxNCBwb3dlciAtMTEgICAgICAgICAgICA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMxNSBwb3dlciAtMTIgICAgICAgICAgICA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMxNiBwb3dlciAtOTk5ICAgICAgICAgICA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMxNyBwb3dlciAtOTk5OTk5ICAgICAgICA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMxOCBwb3dlciAtOTk5OTk5OTk5ICAgICA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDMxOSBwb3dlciAtOS45RTk5OTk5OTk5OSA5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwb3d4MzIwIHBvd2VyIC0wLjUgICAgICAgICAgIDk5OTk5OSAtPiAtMi4wMjAwNjgxMkUtMzAxMDMwIEluZXhhY3QgUm91bmRlZAorcG93eDMyMSBwb3dlciAtMC4xICAgICAgICAgICA5OTk5OTkgLT4gLTFFLTk5OTk5OQorcG93eDMyMiBwb3dlciAtMC4wOSAgICAgICAgICA5OTk5OTkgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDMyMyBwb3dlciAtMC4wNSAgICAgICAgICA5OTk5OTkgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDMyNCBwb3dlciAtMC4wMSAgICAgICAgICA5OTk5OTkgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDMyNSBwb3dlciAtMC4wMDAxICAgICAgICA5OTk5OTkgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDMyNyBwb3dlciAtMC4wMDAwMDAxICAgICA5OTk5OTkgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDMyOCBwb3dlciAtMC4wMDAwMDAwMDAxICA5OTk5OTkgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDMyOSBwb3dlciAtMUUtOTk5OTk5OTk5ICA5OTk5OTkgLT4gLTBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBub3RlIG5vIHRyaW0gb2YgbmV4dCByZXN1bHQKK3Bvd3gzMzAgcG93ZXIgLTkgICAgICAgICAgICAgOTk5OTk4IC0+ICAzLjk4OTgyOTIxRSs5NTQyNDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzMxIHBvd2VyIC0xMCAgICAgICAgICAgIDk5OTk5OCAtPiAgMS4wMDAwMDAwMEUrOTk5OTk4IFJvdW5kZWQKK3Bvd3gzMzIgcG93ZXIgLTEwLjAwMDEgICAgICAgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzMgcG93ZXIgLTEwLjEgICAgICAgICAgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzQgcG93ZXIgLTExICAgICAgICAgICAgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzUgcG93ZXIgLTEyICAgICAgICAgICAgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzYgcG93ZXIgLTk5OSAgICAgICAgICAgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzcgcG93ZXIgLTk5OTk5OSAgICAgICAgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzggcG93ZXIgLTk5OTk5OTk5OSAgICAgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzkgcG93ZXIgLTkuOUU5OTk5OTk5OTkgOTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcG93eDM0MCBwb3dlciAtMC41ICAgICAgICAgICA5OTk5OTggLT4gIDQuMDQwMTM2MjRFLTMwMTAzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDEgcG93ZXIgLTAuMSAgICAgICAgICAgOTk5OTk4IC0+ICAxRS05OTk5OTggIC0tIE5CIGV4YWN0IHVucm91bmRlZAorcG93eDM0MiBwb3dlciAtMC4wOSAgICAgICAgICA5OTk5OTggLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM0MyBwb3dlciAtMC4wNSAgICAgICAgICA5OTk5OTggLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM0NCBwb3dlciAtMC4wMSAgICAgICAgICA5OTk5OTggLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM0NSBwb3dlciAtMC4wMDAxICAgICAgICA5OTk5OTggLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM0NyBwb3dlciAtMC4wMDAwMDAxICAgICA5OTk5OTggLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM0OCBwb3dlciAtMC4wMDAwMDAwMDAxICA5OTk5OTggLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM0OSBwb3dlciAtMUUtOTk5OTk5OTk5ICA5OTk5OTggLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBzb21lIHN1Ym5vcm1hbHMKK3ByZWNpc2lvbjogOQorLS0gW3ByZWNpc2lvbiBpcyA5LCBzbyBzbWFsbGVzdCBleHBvbmVudCBpcyAtMTAwMDAwMDAwNworcG93eDM1MCBwb3dlciAgMWUtMSAgICAgICAgICA1MDAwMDAgLT4gIDFFLTUwMDAwMAorcG93eDM1MSBwb3dlciAgMWUtMiAgICAgICAgICA5OTk5OTkgLT4gIDBFLTEwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDM1MiBwb3dlciAgMWUtMiAgICAgICAgICA1MDAwMDAgLT4gIDFFLTEwMDAwMDAgU3Vibm9ybWFsCitwb3d4MzUzIHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMSAtPiAgMUUtMTAwMDAwMiBTdWJub3JtYWwKK3Bvd3gzNTQgcG93ZXIgIDFlLTIgICAgICAgICAgNTAwMDAyIC0+ICAxRS0xMDAwMDA0IFN1Ym5vcm1hbAorcG93eDM1NSBwb3dlciAgMWUtMiAgICAgICAgICA1MDAwMDMgLT4gIDFFLTEwMDAwMDYgU3Vibm9ybWFsCitwb3d4MzU2IHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwNCAtPiAgMEUtMTAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3Bvd3gzNjAgcG93ZXIgIDAuMDEwMDAxICAgICAgNTAwMDAwIC0+ICA1LjE3MTc2MDgyRS05OTk5NzkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYxIHBvd2VyICAwLjAxMDAwMDAwMSAgIDUwMDAwMCAtPiAgMS4wNTEyNzExRS0xMDAwMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MzYyIHBvd2VyICAwLjAxMDAwMDAwMSAgIDUwMDAwMSAtPiAgMS4wNTEyN0UtMTAwMDAwMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM2MyBwb3dlciAgMC4wMTAwMDAwMDA5ICA1MDAwMDAgLT4gIDEuMDQ2MDI3OUUtMTAwMDAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM2NCBwb3dlciAgMC4wMTAwMDAwMDAxICA1MDAwMDAgLT4gIDEuMDA1MDEyNUUtMTAwMDAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM2NSBwb3dlciAgMC4wMSAgICAgICAgICA1MDAwMDAgLT4gIDFFLTEwMDAwMDAgU3Vibm9ybWFsCitwb3d4MzY2IHBvd2VyICAwLjAwOTk5OTk5OTkgIDUwMDAwMCAtPiAgOS45NTAxMjVFLTEwMDAwMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNjcgcG93ZXIgIDAuMDA5OTk5OTk5OCAgNTAwMDAwIC0+ICA5LjkwMDQ5OEUtMTAwMDAwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDM2OCBwb3dlciAgMC4wMDk5OTk5OTk3ICA1MDAwMDAgLT4gIDkuODUxMTE5RS0xMDAwMDAxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MzY5IHBvd2VyICAwLjAwOTk5OTk5OTYgIDUwMDAwMCAtPiAgOS44MDE5ODdFLTEwMDAwMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzAgcG93ZXIgIDAuMDA5ICAgICAgICAgNTAwMDAwIC0+ICAwRS0xMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gMS9zdWJub3JtYWwgLT4gb3ZlcmZsb3cKK3Bvd3gzNzEgcG93ZXIgIDFlLTEgICAgICAgICAtNTAwMDAwIC0+ICAxRSs1MDAwMDAKK3Bvd3gzNzIgcG93ZXIgIDFlLTIgICAgICAgICAtOTk5OTk5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzMgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDAwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzQgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDAxIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzUgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDAyIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzYgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDAzIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzcgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDA0IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcG93eDM4MSBwb3dlciAgMC4wMTAwMDEgICAgIC01MDAwMDAgLT4gIDEuOTMzNTc3NDNFKzk5OTk3OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzODIgcG93ZXIgIDAuMDEwMDAwMDAxICAtNTAwMDAwIC0+ICA5LjUxMjI5NDI3RSs5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzgzIHBvd2VyICAwLjAxMDAwMDAwMSAgLTUwMDAwMSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgIEluZXhhY3QgUm91bmRlZAorcG93eDM4NCBwb3dlciAgMC4wMTAwMDAwMDA5IC01MDAwMDAgLT4gIDkuNTU5OTc0ODRFKzk5OTk5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzODUgcG93ZXIgIDAuMDEwMDAwMDAwMSAtNTAwMDAwIC0+ICA5Ljk1MDEyNDc5RSs5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitwb3d4Mzg2IHBvd2VyICAwLjAxICAgICAgICAgLTUwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4Mzg3IHBvd2VyICAwLjAwOTk5OSAgICAgLTUwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlIHBvd2VyIGdpdmluZyBzdWJub3JtYWwKK3Bvd3gzODggcG93ZXIgIDEwMC4wMDAwMDEgICAtNTAwMDAwIC0+ICA5Ljk1MDEyNUUtMTAwMDAwMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCisKKy0tIHRlc3Qgc29tZSAnZmFsc2UgaW50ZWdlcicgYm91bmRhcmllcworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworcG93eDUwMSBwb3dlciAgMTAwICAxRSsxICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsyMCAgICAgUm91bmRlZAorcG93eDUwMiBwb3dlciAgMTAwICAxRSsyICAgLT4gIDEuMDAwMDAwMDAwMDAwMDAwRSsyMDAgICAgUm91bmRlZAorcG93eDUwMyBwb3dlciAgMTAwICAxRSszICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUwNCBwb3dlciAgMTAwICAxRSs0ICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUwNSBwb3dlciAgMTAwICAxRSs1ICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUwNiBwb3dlciAgMTAwICAxRSs2ICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUwNyBwb3dlciAgMTAwICAxRSs3ICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUwOCBwb3dlciAgMTAwICAxRSs4ICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUwOSBwb3dlciAgMTAwICAxRSs5ICAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxMCBwb3dlciAgMTAwICAxRSsxMCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxMSBwb3dlciAgMTAwICAxRSsxMSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxMiBwb3dlciAgMTAwICAxRSsxMiAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxMyBwb3dlciAgMTAwICAxRSsxMyAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxNCBwb3dlciAgMTAwICAxRSsxNCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxNSBwb3dlciAgMTAwICAxRSsxNSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxNiBwb3dlciAgMTAwICAxRSsxNiAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxNyBwb3dlciAgMTAwICAxRSsxNyAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxOCBwb3dlciAgMTAwICAxRSsxOCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUxOSBwb3dlciAgMTAwICAxRSsxOSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyMCBwb3dlciAgMTAwICAxRSsyMCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyMSBwb3dlciAgMTAwICAxRSsyMSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyMiBwb3dlciAgMTAwICAxRSsyMiAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyMyBwb3dlciAgMTAwICAxRSsyMyAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyNCBwb3dlciAgMTAwICAxRSsyNCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyNSBwb3dlciAgMTAwICAxRSsyNSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyNiBwb3dlciAgMTAwICAxRSsyNiAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyNyBwb3dlciAgMTAwICAxRSsyNyAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyOCBwb3dlciAgMTAwICAxRSsyOCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUyOSBwb3dlciAgMTAwICAxRSsyOSAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUzMCBwb3dlciAgMTAwICAxRSszMCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUzMSBwb3dlciAgMTAwICAxRSs0MCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUzMiBwb3dlciAgMTAwICAxRSs1MCAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUzMyBwb3dlciAgMTAwICAxRSsxMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDUzNCBwb3dlciAgMTAwICAxRSszODMgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSBhIGNoZWNrIGZvciBkb3VibGUtcm91bmRlZCBzdWJub3JtYWxzCitwcmVjaXNpb246ICAgNQorbWF4ZXhwb25lbnQ6IDc5CittaW5leHBvbmVudDogLTc5Citwb3d4NzUwIHBvd2VyICAgICAxLjIzNDdFLTQwICAyICAgICAgLT4gIDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCistLSBOdWxsIHRlc3RzCitwb3d4OTAwIHBvd2VyICAxICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwb3d4OTAxIHBvd2VyICAjIDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIEJlbG93IGhlcmUgYXJlIHRlc3RzIHdpdGggYSBwcmVjaXNpb24gb3IgY29udGV4dCBvdXRzaWRlIG9mIHRoZSAgLS0KKy0tIGRlY051bWJlciAnbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucycgcmVzdHJpY3RlZCByYW5nZS4gIFRoZXNlICAgICAgLS0KKy0tIHJlbWFpbiBzdXBwb3J0ZWQgaW4gZGVjTnVtYmVyIHRvIG1pbmltaXplIGJyZWFrYWdlLCBidXQgbWF5IGJlICAgLS0KKy0tIG91dHNpZGUgdGhlIHJhbmdlIG9mIG90aGVyIGltcGxlbWVudGF0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDkKK3Bvd3gxMDYzIHBvd2VyICAgJzEwJyAgJzk5OTk5OTk5OScgLT4gJzEuMDAwMDAwMDBFKzk5OTk5OTk5OScgUm91bmRlZAorcG93eDEwNjQgcG93ZXIgICAnMTAnICAnOTk5OTk5OTk4JyAtPiAnMS4wMDAwMDAwMEUrOTk5OTk5OTk4JyBSb3VuZGVkCitwb3d4MTA2NSBwb3dlciAgICcxMCcgICc5OTk5OTk5OTcnIC0+ICcxLjAwMDAwMDAwRSs5OTk5OTk5OTcnIFJvdW5kZWQKK3Bvd3gxMDY2IHBvd2VyICAgJzEwJyAgJzMzMzMzMzMzMycgLT4gJzEuMDAwMDAwMDBFKzMzMzMzMzMzMycgUm91bmRlZAorLS0gbmV4dCB0d28gYXJlIGludGVnZXItb3V0LW9mIHJhbmdlCitwb3d4MTE4MyBwb3dlciAgICc3JyAgICcxMDAwMDAwMDAwJyAgLT4gTmFOIEludmFsaWRfY29udGV4dAorcG93eDExODQgcG93ZXIgICAnNycgICAnMTAwMDAwMDAwMScgIC0+IE5hTiBJbnZhbGlkX2NvbnRleHQKK3Bvd3gxMTg2IHBvd2VyICAgJzcnICAgJy0xMDAwMDAwMDAxJyAtPiAxLjM4MjQzNjMwRS04NDUwOTgwNDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MTE4NyBwb3dlciAgICc3JyAgICctMTAwMDAwMDAwMCcgLT4gOS42NzcwNTQxMUUtODQ1MDk4MDQxIEluZXhhY3QgUm91bmRlZAorCistLSBvdXQtb2YtcmFuZ2UgZWRnZSBjYXNlcworcG93eDExMTggcG93ZXIgICcxMCcgICctMzMzMzMzMzMzJyAgIC0+IDFFLTMzMzMzMzMzMworcG93eDExMTkgcG93ZXIgICcxMCcgICctOTk5OTk5OTk4JyAgIC0+IDFFLTk5OTk5OTk5OAorcG93eDExMjAgcG93ZXIgICcxMCcgICctOTk5OTk5OTk5JyAgIC0+IDFFLTk5OTk5OTk5OQorcG93eDExODEgcG93ZXIgICAnNycgICAnOTk5OTk5OTk4JyAgIC0+IDIuMTA4OTIzMTNFKzg0NTA5ODAzOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMTgyIHBvd2VyICAgJzcnICAgJzk5OTk5OTk5OScgICAtPiAxLjQ3NjI0NjE5RSs4NDUwOTgwMzkgSW5leGFjdCBSb3VuZGVkCitwb3d4MTE4OSBwb3dlciAgICc3JyAgICctOTk5OTk5OTk5JyAgLT4gNi43NzM5Mzc4N0UtODQ1MDk4MDQwIEluZXhhY3QgUm91bmRlZAorcG93eDExOTAgcG93ZXIgICAnNycgICAnLTk5OTk5OTk5OCcgIC0+IDQuNzQxNzU2NTFFLTg0NTA5ODAzOSBJbmV4YWN0IFJvdW5kZWQKKworLS0gQSAocmFyZSkgY2FzZSB3aGVyZSB0aGUgbGFzdCBkaWdpdCBpcyBub3Qgd2l0aGluIDAuNSBVTFAgd2l0aCBjbGFzc2ljIHByZWNpc2lvbgorcHJlY2lzaW9uOiA5Citwb3d4MTIxNSBwb3dlciAiLTIxOTcxNTc1LjBFKzMxNDU0NDQxIiAiLTciIC0+ICItNC4wNDU0OTUwMkUtMjIwMTgxMTM5IiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMjAKK3Bvd3gxMjE2IHBvd2VyICItMjE5NzE1NzUuMEUrMzE0NTQ0NDEiICItNyIgLT4gIi00LjA0NTQ5NTAyNDkzMjQ4OTE3ODhFLTIyMDE4MTEzOSIgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMKK3ByZWNpc2lvbjogOQorcG93eDEyODAgcG93ZXIgIDkgICAgICAgICAgICA5OTk5OTk5OTkgLT4gMy4wNTU1MDA1NEUrOTU0MjQyNTA4IEluZXhhY3QgUm91bmRlZAorcG93eDEyODEgcG93ZXIgMTAgICAgICAgICAgICA5OTk5OTk5OTkgLT4gMS4wMDAwMDAwMEUrOTk5OTk5OTk5IFJvdW5kZWQKK3Bvd3gxMjgyIHBvd2VyIDEwLjAwMDEgICAgICAgOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEyODMgcG93ZXIgMTAuMSAgICAgICAgICA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTI4NCBwb3dlciAxMSAgICAgICAgICAgIDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMjg1IHBvd2VyIDEyICAgICAgICAgICAgOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEyODYgcG93ZXIgOTk5ICAgICAgICAgICA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTI4NyBwb3dlciA5OTk5OTkgICAgICAgIDk5OTk5OTk5OSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMjg4IHBvd2VyIDk5OTk5OTk5OSAgICAgOTk5OTk5OTk5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEyODkgcG93ZXIgOS45RTk5OTk5OTk5OSA5OTk5OTk5OTkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKK3Bvd3gxMjkwIHBvd2VyIDAuNSAgICAgICAgICAgOTk5OTk5OTk5IC0+IDQuMzM1NTk1OTRFLTMwMTAyOTk5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMjkxIHBvd2VyIDAuMSAgICAgICAgICAgOTk5OTk5OTk5IC0+IDFFLTk5OTk5OTk5OSAgLS0gdW5yb3VuZGVkCitwb3d4MTI5MiBwb3dlciAwLjA5ICAgICAgICAgIDk5OTk5OTk5OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMjkzIHBvd2VyIDAuMDUgICAgICAgICAgOTk5OTk5OTk5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEyOTQgcG93ZXIgMC4wMSAgICAgICAgICA5OTk5OTk5OTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTI5NSBwb3dlciAwLjAwMDEgICAgICAgIDk5OTk5OTk5OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMjk3IHBvd2VyIDAuMDAwMDAwMSAgICAgOTk5OTk5OTk5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEyOTggcG93ZXIgMC4wMDAwMDAwMDAxICA5OTk5OTk5OTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTI5OSBwb3dlciAxRS05OTk5OTk5OTkgIDk5OTk5OTk5OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworcG93eDEzMTAgcG93ZXIgLTkgICAgICAgICAgICAgOTk5OTk5OTk5IC0+IC0zLjA1NTUwMDU0RSs5NTQyNDI1MDggSW5leGFjdCBSb3VuZGVkCitwb3d4MTMxMSBwb3dlciAtMTAgICAgICAgICAgICA5OTk5OTk5OTkgLT4gLTEuMDAwMDAwMDBFKzk5OTk5OTk5OSBSb3VuZGVkCitwb3d4MTMxMiBwb3dlciAtMTAuMDAwMSAgICAgICA5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMTMgcG93ZXIgLTEwLjEgICAgICAgICAgOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzE0IHBvd2VyIC0xMSAgICAgICAgICAgIDk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMxNSBwb3dlciAtMTIgICAgICAgICAgICA5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMTYgcG93ZXIgLTk5OSAgICAgICAgICAgOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzE3IHBvd2VyIC05OTk5OTkgICAgICAgIDk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMxOCBwb3dlciAtOTk5OTk5OTk5ICAgICA5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMTkgcG93ZXIgLTkuOUU5OTk5OTk5OTkgOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcG93eDEzMjAgcG93ZXIgLTAuNSAgICAgICAgICAgOTk5OTk5OTk5IC0+IC00LjMzNTU5NTk0RS0zMDEwMjk5OTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMyMSBwb3dlciAtMC4xICAgICAgICAgICA5OTk5OTk5OTkgLT4gLTFFLTk5OTk5OTk5OQorcG93eDEzMjIgcG93ZXIgLTAuMDkgICAgICAgICAgOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzIzIHBvd2VyIC0wLjA1ICAgICAgICAgIDk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTMyNCBwb3dlciAtMC4wMSAgICAgICAgICA5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzMjUgcG93ZXIgLTAuMDAwMSAgICAgICAgOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzI3IHBvd2VyIC0wLjAwMDAwMDEgICAgIDk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTMyOCBwb3dlciAtMC4wMDAwMDAwMDAxICA5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzMjkgcG93ZXIgLTFFLTk5OTk5OTk5OSAgOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworLS0gbm90ZSBubyB0cmltIG9mIG5leHQgcmVzdWx0Citwb3d4MTMzMCBwb3dlciAtOSAgICAgICAgICAgICA5OTk5OTk5OTggLT4gIDMuMzk1MDAwNjBFKzk1NDI0MjUwNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzMxIHBvd2VyIC0xMCAgICAgICAgICAgIDk5OTk5OTk5OCAtPiAgMS4wMDAwMDAwMEUrOTk5OTk5OTk4IFJvdW5kZWQKK3Bvd3gxMzMyIHBvd2VyIC0xMC4wMDAxICAgICAgIDk5OTk5OTk5OCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMzMyBwb3dlciAtMTAuMSAgICAgICAgICA5OTk5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMzQgcG93ZXIgLTExICAgICAgICAgICAgOTk5OTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzM1IHBvd2VyIC0xMiAgICAgICAgICAgIDk5OTk5OTk5OCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMzNiBwb3dlciAtOTk5ICAgICAgICAgICA5OTk5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzMzcgcG93ZXIgLTk5OTk5OSAgICAgICAgOTk5OTk5OTk4IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzM4IHBvd2VyIC05OTk5OTk5OTkgICAgIDk5OTk5OTk5OCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTMzOSBwb3dlciAtOS45RTk5OTk5OTk5OSA5OTk5OTk5OTggLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCitwb3d4MTM0MCBwb3dlciAtMC41ICAgICAgICAgICA5OTk5OTk5OTggLT4gIDguNjcxMTkxODdFLTMwMTAyOTk5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzQxIHBvd2VyIC0wLjEgICAgICAgICAgIDk5OTk5OTk5OCAtPiAgMUUtOTk5OTk5OTk4ICAtLSBOQiBleGFjdCB1bnJvdW5kZWQKK3Bvd3gxMzQyIHBvd2VyIC0wLjA5ICAgICAgICAgIDk5OTk5OTk5OCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTM0MyBwb3dlciAtMC4wNSAgICAgICAgICA5OTk5OTk5OTggLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzNDQgcG93ZXIgLTAuMDEgICAgICAgICAgOTk5OTk5OTk4IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzQ1IHBvd2VyIC0wLjAwMDEgICAgICAgIDk5OTk5OTk5OCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTM0NyBwb3dlciAtMC4wMDAwMDAxICAgICA5OTk5OTk5OTggLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDEzNDggcG93ZXIgLTAuMDAwMDAwMDAwMSAgOTk5OTk5OTk4IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzQ5IHBvd2VyIC0xRS05OTk5OTk5OTkgIDk5OTk5OTk5OCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIHNvbWUgc3Vibm9ybWFscworcHJlY2lzaW9uOiA5CistLSBbcHJlY2lzaW9uIGlzIDksIHNvIHNtYWxsZXN0IGV4cG9uZW50IGlzIC0xMDAwMDAwMDA3Citwb3d4MTM1MCBwb3dlciAgMWUtMSAgICAgICAgICA1MDAwMDAwMDAgLT4gIDFFLTUwMDAwMDAwMAorcG93eDEzNTEgcG93ZXIgIDFlLTIgICAgICAgICAgOTk5OTk5OTk5IC0+ICAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gxMzUyIHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMDAwMCAtPiAgMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK3Bvd3gxMzUzIHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMDAwMSAtPiAgMUUtMTAwMDAwMDAwMiBTdWJub3JtYWwKK3Bvd3gxMzU0IHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMDAwMiAtPiAgMUUtMTAwMDAwMDAwNCBTdWJub3JtYWwKK3Bvd3gxMzU1IHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMDAwMyAtPiAgMUUtMTAwMDAwMDAwNiBTdWJub3JtYWwKK3Bvd3gxMzU2IHBvd2VyICAxZS0yICAgICAgICAgIDUwMDAwMDAwNCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3Bvd3gxMzYwIHBvd2VyICAwLjAxMDAwMSAgICAgIDUwMDAwMDAwMCAtPiAgNC4zNDk0MTk4OEUtOTk5OTc4Mjg3IEluZXhhY3QgUm91bmRlZAorcG93eDEzNjEgcG93ZXIgIDAuMDEwMDAwMDAxICAgNTAwMDAwMDAwIC0+ICA1LjE4NDY5MjU3RS05OTk5OTk5NzkgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM2MiBwb3dlciAgMC4wMTAwMDAwMDEgICA1MDAwMDAwMDEgLT4gIDUuMTg0NjkzMDlFLTk5OTk5OTk4MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzYzIHBvd2VyICAwLjAxMDAwMDAwMDkgIDUwMDAwMDAwMCAtPiAgMy40OTM0MjAwM0UtOTk5OTk5OTgxIEluZXhhY3QgUm91bmRlZAorcG93eDEzNjQgcG93ZXIgIDAuMDEwMDAwMDAwMSAgNTAwMDAwMDAwIC0+ICAxLjQ4NDEzMTU1RS05OTk5OTk5OTggSW5leGFjdCBSb3VuZGVkCitwb3d4MTM2NSBwb3dlciAgMC4wMSAgICAgICAgICA1MDAwMDAwMDAgLT4gIDFFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitwb3d4MTM2NiBwb3dlciAgMC4wMDk5OTk5OTk5ICA1MDAwMDAwMDAgLT4gIDYuNzM3OUUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcG93eDEzNjcgcG93ZXIgIDAuMDA5OTk5OTk5OCAgNTAwMDAwMDAwIC0+ICA0LjU0RS0xMDAwMDAwMDA1IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM2OCBwb3dlciAgMC4wMDk5OTk5OTk3ICA1MDAwMDAwMDAgLT4gIDNFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzY5IHBvd2VyICAwLjAwOTk5OTk5OTYgIDUwMDAwMDAwMCAtPiAgMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitwb3d4MTM3MCBwb3dlciAgMC4wMDkgICAgICAgICA1MDAwMDAwMDAgLT4gIDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSAxL3N1Ym5vcm1hbCAtPiBvdmVyZmxvdworcG93eDEzNzEgcG93ZXIgIDFlLTEgICAgICAgICAtNTAwMDAwMDAwIC0+ICAxRSs1MDAwMDAwMDAKK3Bvd3gxMzcyIHBvd2VyICAxZS0yICAgICAgICAgLTk5OTk5OTk5OSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM3MyBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzNzQgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDAwMDAxIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzc1IHBvd2VyICAxZS0yICAgICAgICAgLTUwMDAwMDAwMiAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM3NiBwb3dlciAgMWUtMiAgICAgICAgIC01MDAwMDAwMDMgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcG93eDEzNzcgcG93ZXIgIDFlLTIgICAgICAgICAtNTAwMDAwMDA0IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcG93eDEzODEgcG93ZXIgIDAuMDEwMDAxICAgICAtNTAwMDAwMDAwIC0+ICAyLjI5OTE1NzE5RSs5OTk5NzgyODYgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM4MiBwb3dlciAgMC4wMTAwMDAwMDEgIC01MDAwMDAwMDAgLT4gIDEuOTI4NzU0NjdFKzk5OTk5OTk3OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzgzIHBvd2VyICAwLjAxMDAwMDAwMSAgLTUwMDAwMDAwMSAtPiAgMS45Mjg3NTQ0OEUrOTk5OTk5OTgwIEluZXhhY3QgUm91bmRlZAorcG93eDEzODQgcG93ZXIgIDAuMDEwMDAwMDAwOSAtNTAwMDAwMDAwIC0+ICAyLjg2MjUyNDM4RSs5OTk5OTk5ODAgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM4NSBwb3dlciAgMC4wMTAwMDAwMDAxIC01MDAwMDAwMDAgLT4gIDYuNzM3OTQ3MTdFKzk5OTk5OTk5NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gxMzg2IHBvd2VyICAwLjAxICAgICAgICAgLTUwMDAwMDAwMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MTM4NyBwb3dlciAgMC4wMDk5OTkgICAgIC01MDAwMDAwMDAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSBuZWdhdGl2ZSBwb3dlciBnaXZpbmcgc3Vibm9ybWFsCitwb3d4MTM4OCBwb3dlciAgMTAwLjAwMDAwMSAgIC01MDAwMDAwMDAgLT4gIDYuNzM3OUUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBCZWxvdyBoZXJlIGFyZSB0aGUgdGVzdHMgd2l0aCBhIG5vbi1pbnRlZ2VyIHJocywgaW5jbHVkaW5nIHRoZSAgIC0tCistLSB0ZXN0cyB0aGF0IHByZXZpb3VzbHkgY2F1c2VkIEludmFsaWQgb3BlcmF0aW9uLiAgQW4gaW50ZWdlci1vbmx5IC0tCistLSAob24gcmhzKSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgaGFuZGxlIGFsbCB0aGUgdGVzdHMgYWJvdmUgYXMgICAgIC0tCistLSBzaG93biwgYW5kIHdvdWxkIGZsYWcgbW9zdCBvZiB0aGUgZm9sbG93aW5nIHRlc3RzIGFzIEludmFsaWQuICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitwcmVjaXNpb246ICAgMTYKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKK3Bvd3gyMDAwIHBvd2VyIDcgJzEwMDAwMDAwMDAwJyAgICAgICAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAwMSBwb3dlciAyICcyLjAwMDAwMScgICAgICAgICAgIC0+IDQuMDAwMDAyNzcyNTg5NjgzIEluZXhhY3QgUm91bmRlZAorcG93eDIwMDIgcG93ZXIgMiAnMi4wMDAwMDAwMCcgICAgICAgICAtPiA0Citwb3d4MjAwMyBwb3dlciAyICcyLjAwMDAwMDAwMScgICAgICAgIC0+IDQuMDAwMDAwMDAyNzcyNTg5IEluZXhhY3QgUm91bmRlZAorcG93eDIwMDQgcG93ZXIgMiAnMi4wMDAwMDAwMDAxJyAgICAgICAtPiA0LjAwMDAwMDAwMDI3NzI1OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDA1IHBvd2VyIDIgJzIuMDAwMDAwMDAwMDEnICAgICAgLT4gNC4wMDAwMDAwMDAwMjc3MjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAwNiBwb3dlciAyICcyLjAwMDAwMDAwMDAwMScgICAgIC0+IDQuMDAwMDAwMDAwMDAyNzczIEluZXhhY3QgUm91bmRlZAorcG93eDIwMDcgcG93ZXIgMiAnMi4wMDAwMDAwMDAwMDAxJyAgICAtPiA0LjAwMDAwMDAwMDAwMDI3NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDA4IHBvd2VyIDIgJzIuMDAwMDAwMDAwMDAwMDEnICAgLT4gNC4wMDAwMDAwMDAwMDAwMjggSW5leGFjdCBSb3VuZGVkCitwb3d4MjAwOSBwb3dlciAyICcyLjAwMDAwMDAwMDAwMDAwMScgIC0+IDQuMDAwMDAwMDAwMDAwMDAzIEluZXhhY3QgUm91bmRlZAorcG93eDIwMTAgcG93ZXIgMiAnMi4wMDAwMDAwMDAwMDAwMDAxJyAtPiA0LjAwMDAwMDAwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKKy0tICAgICAgICAgICAgICAgIDEgMjM0NTY3ODkwMTIzNDU2CisKK3Bvd3gyMDExIHBvd2VyIDEgMTIzNCAtPiAxCitwcmVjaXNpb246IDQKK3Bvd3gyMDEyIHBvd2VyIDEgMTIzNCAtPiAxCitwcmVjaXNpb246IDMKK3Bvd3gyMDEzIHBvd2VyIDEgMTIzNCAgICAgLT4gMQorcG93eDIwMTQgcG93ZXIgMSAxMi4zNGUrMiAtPiAxCitwb3d4MjAxNSBwb3dlciAxIDEyLjMgICAgIC0+IDEuMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAxNiBwb3dlciAxIDEyLjAgICAgIC0+IDEKK3Bvd3gyMDE3IHBvd2VyIDEgMS4wMSAgICAgLT4gMS4wMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDE4IHBvd2VyIDIgMS4wMCAgICAgLT4gMgorcG93eDIwMTkgcG93ZXIgMiAyLjAwICAgICAtPiA0CitwcmVjaXNpb246IDkKK3Bvd3gyMDMwIHBvd2VyIDEgMS4wMDAxICAgICAgICAgICAtPiAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIwMzEgcG93ZXIgMSAxLjAwMDAwMDEgICAgICAgIC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAzMiBwb3dlciAxIDEuMDAwMDAwMDAwMSAgICAgLT4gMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDMzIHBvd2VyIDEgMS4wMDAwMDAwMDAwMDAxICAtPiAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA1Citwb3d4MjAzNCBwb3dlciAxIDEuMDAwMSAgICAgICAgICAgLT4gMS4wMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIwMzUgcG93ZXIgMSAxLjAwMDAwMDEgICAgICAgIC0+IDEuMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMDM2IHBvd2VyIDEgMS4wMDAwMDAwMDAxICAgICAtPiAxLjAwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjAzNyBwb3dlciAxIDEuMDAwMDAwMDAwMDAwMSAgLT4gMS4wMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIwMzggcG93ZXIgMSAxLjAwMDAwMDAwMDAwMDEgIC0+IDEuMDAwMCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGNlaWxpbmcKK3ByZWNpc2lvbjogMworcG93eDIwMzkgcG93ZXIgMSAxLjAxICAgICAtPiAxLjAwIEluZXhhY3QgUm91bmRlZAorcG93eDIwNDAgcG93ZXIgMSAxMi4zICAgICAtPiAxLjAwIEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorCistLSAxICoqIGFueSBpbnRlZ2VyLCBpbmNsdWRpbmcgYmlnIG9uZXMsIHNob3VsZCBiZSBleGFjdAorcG93eDIwNDEgcG93ZXIgMSAxMDAwMDAwMDAwICAgLT4gMQorcG93eDIwNDIgcG93ZXIgMSA5OTk5OTk5OTk5ICAgLT4gMQorcG93eDIwNDMgcG93ZXIgMSAxMjM0NTY3ODAwMCAgLT4gMQorcG93eDIwNDQgcG93ZXIgMSAxMjM0NTY3ODAwICAgLT4gMQorcG93eDIwNDUgcG93ZXIgMSAxMjM0NTY3ODkwICAgLT4gMQorcG93eDIwNDYgcG93ZXIgMSAxMTIzNDU2Nzg5MSAgLT4gMQorcG93eDIwNDcgcG93ZXIgMSAxMjM0NTY3ODkwMSAgLT4gMQorcG93eDIwNDggcG93ZXIgMSAxMjM0NTY3ODk2ICAgLT4gMQorcG93eDIwNDkgcG93ZXIgMSAtMTIzNDU2Nzg5NiAgLT4gMQorcG93eDIwNTEgcG93ZXIgMSAxMDAwMDAwMDAwICAgLT4gMQorcG93eDIwNTIgcG93ZXIgMSAtMTAwMDAwMDAwMCAgLT4gMQorcG93eDIwNTMgcG93ZXIgMSAxMjM0NTY3ODAwMCAgLT4gMQorcG93eDIwNTQgcG93ZXIgMSAtMTIzNDU2Nzg5NiAgLT4gMQorcG93eDIwNTUgcG93ZXIgMSAxMDAwMDAwMDAwICAgLT4gMQorcG93eDIwNTYgcG93ZXIgMSA0MzAwMDAwMDAwICAgLT4gMQorcG93eDIwNTcgcG93ZXIgMSAtMTAwMDAwMDAwMCAgLT4gMQorLS0gbmVnYXRpdmVzIC4uLiBidXQgbm90IG91dCBvZiByYW5nZSBmb3IgZGVjTnVtYmVyCitwb3d4MjA2MSBwb3dlciAtMSAxMDAwMDAgICAtPiAxCitwb3d4MjA2MiBwb3dlciAtMSA5OTk5OTkgICAtPiAtMQorcG93eDIwNjMgcG93ZXIgLTEgMTI3ODAwMCAgLT4gMQorcG93eDIwNjQgcG93ZXIgLTEgMTI3ODAzICAgLT4gLTEKK3Bvd3gyMDY1IHBvd2VyIC0xIDEyNzg5MCAgIC0+IDEKK3Bvd3gyMDY2IHBvd2VyIC0xIDExNjc4OTEgIC0+IC0xCitwb3d4MjA2NyBwb3dlciAtMSAxMjc4OTAxICAtPiAtMQorcG93eDIwNjggcG93ZXIgLTEgMTI3ODk2ICAgLT4gMQorcG93eDIwNjkgcG93ZXIgLTEgLTE2Nzg5NyAgLT4gLTEKK3Bvd3gyMDcxIHBvd2VyIC0xIDEwMDAwMCAgIC0+IDEKK3Bvd3gyMDcyIHBvd2VyIC0xIC0xMDAwMDEgIC0+IC0xCitwb3d4MjA3MyBwb3dlciAtMSAxMjc4MDAwICAtPiAxCitwb3d4MjA3NCBwb3dlciAtMSAtMTY3ODk2ICAtPiAxCitwb3d4MjA3NSBwb3dlciAtMSAxMDAwMDAgICAtPiAxCitwb3d4MjA3NiBwb3dlciAtMSAtMTAwMDA5ICAtPiAtMQorCistLSBUaGUgYWJvdmUgd2VyZSBkZXJpdmVkIGZyb20gdGhlIGVhcmxpZXIgdmVyc2lvbiBvZiBwb3dlci5kZWNUZXN0OworLS0gbm93IHN0YXJ0IG5ldyB0ZXN0cyBmb3IgcG93ZXIoeCx5KSBmb3Igbm9uLWludGVnZXIgeQorcHJlY2lzaW9uOiA5CisKKy0tIHRlc3RzIGZyb20gc3BlY2lmaWNhdGlvbgorcG93eDIwODEgcG93ZXIgMiAgICAgICAgICAgMyAgICAtPiAgJzgnCitwb3d4MjA4MiBwb3dlciAtMiAgICAgICAgICAzICAgIC0+ICAnLTgnCitwb3d4MjA4MyBwb3dlciAyICAgICAgICAgIC0zICAgIC0+ICAnMC4xMjUnCitwb3d4MjA4NCBwb3dlciAxLjcgICAgICAgICc4JyAgIC0+ICAnNjkuNzU3NTc0NCcgSW5leGFjdCBSb3VuZGVkCitwb3d4MjA4NSBwb3dlciAxMCAwLjMwMTAyOTk5NiAgIC0+ICAyLjAwMDAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjA4NiBwb3dlciBJbmZpbml0eSAgICctMScgIC0+ICAnMCcKK3Bvd3gyMDg3IHBvd2VyIEluZmluaXR5ICAgJzAnICAgLT4gICcxJworcG93eDIwODggcG93ZXIgSW5maW5pdHkgICAnMScgICAtPiAgJ0luZmluaXR5JworcG93eDIwODkgcG93ZXIgLUluZmluaXR5ICAnLTEnICAtPiAgJy0wJworcG93eDIwOTAgcG93ZXIgLUluZmluaXR5ICAnMCcgICAtPiAgJzEnCitwb3d4MjA5MSBwb3dlciAtSW5maW5pdHkgICcxJyAgIC0+ICAnLUluZmluaXR5JworcG93eDIwOTIgcG93ZXIgLUluZmluaXR5ICAnMicgICAtPiAgJ0luZmluaXR5JworcG93eDIwOTMgcG93ZXIgMCAgMCAgICAgICAgICAgICAtPiAgJ05hTicgSW52YWxpZF9vcGVyYXRpb24KKworcHJlY2lzaW9uOiAgIDE2Cityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogMzg0CittaW5FeHBvbmVudDogLTM4MworCistLSBiYXNpY3MKK3Bvd3gyMTAwIHBvd2VyIDFFLTcgICAgIDFFLTcgICAtPiAwLjk5OTk5ODM4ODE5MTczMzkgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTAxIHBvd2VyIDAuMDAzICAgIDFFLTcgICAtPiAwLjk5OTk5OTQxOTA4NTg2OTcgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTAyIHBvd2VyIDAuNyAgICAgIDFFLTcgICAtPiAwLjk5OTk5OTk2NDMzMjUwNjIgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTAzIHBvd2VyIDEuMiAgICAgIDFFLTcgICAtPiAxLjAwMDAwMDAxODIzMjE1NiAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTA0IHBvd2VyIDcxICAgICAgIDFFLTcgICAtPiAxLjAwMDAwMDQyNjI2ODA3OSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTA1IHBvd2VyIDlFKzkgICAgIDFFLTcgICAtPiAxLjAwMDAwMjI5MjA1MTY2OCAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcG93eDIxMTAgcG93ZXIgMUUtNyAgICAgMC4wMDMgIC0+IDAuOTUyNzk2MTY0MDIzNjUxOSAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMTEgcG93ZXIgMC4wMDMgICAgMC4wMDMgIC0+IDAuOTgyNzIzNTUwMzM2Njc5NyAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMTIgcG93ZXIgMC43ICAgICAgMC4wMDMgIC0+IDAuOTk4OTMwNTQ3NDQwNjIwNyAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMTMgcG93ZXIgMS4yICAgICAgMC4wMDMgIC0+IDEuMDAwNTQ3MTE0MjgyODM0ICAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMTQgcG93ZXIgNzEgICAgICAgMC4wMDMgIC0+IDEuMDEyODcwMTU2MjczNTQ1ICAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDIxMTUgcG93ZXIgOUUrOSAgICAgMC4wMDMgIC0+IDEuMDcxMTgwNjcxMjc4Nzg3ICAgICAgIEluZXhhY3QgUm91bmRlZAorCitwb3d4MjEyMCBwb3dlciAxRS03ICAgICAwLjcgICAgLT4gMC4wMDAwMTI1ODkyNTQxMTc5NDE2NyAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjEyMSBwb3dlciAwLjAwMyAgICAwLjcgICAgLT4gMC4wMTcxMzg5NzYzMDI4MTAzMCAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjEyMiBwb3dlciAwLjcgICAgICAwLjcgICAgLT4gMC43NzkwNTU5MTI2NzA0NDkxICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjEyMyBwb3dlciAxLjIgICAgICAwLjcgICAgLT4gMS4xMzYxMjY5NzcxOTg4ODkgICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjEyNCBwb3dlciA3MSAgICAgICAwLjcgICAgLT4gMTkuNzY0MjczMDAwOTM4NzAgICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjEyNSBwb3dlciA5RSs5ICAgICAwLjcgICAgLT4gOTI4OTAxNi45NzY4NTM3MTAgICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3Bvd3gyMTMwIHBvd2VyIDFFLTcgICAgIDEuMiAgICAtPiAzLjk4MTA3MTcwNTUzNDk3M0UtOSAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTMxIHBvd2VyIDAuMDAzICAgIDEuMiAgICAtPiAwLjAwMDkzODc0MDM5MzM1OTU2OTQgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTMyIHBvd2VyIDAuNyAgICAgIDEuMiAgICAtPiAwLjY1MTgwNDk0MDU2NjM4NjQgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTMzIHBvd2VyIDEuMiAgICAgIDEuMiAgICAtPiAxLjI0NDU2NDc0NzIwMzk3OCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTM0IHBvd2VyIDcxICAgICAgIDEuMiAgICAtPiAxNjYuNTM2NzI0NDYzODU1MiAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTM1IHBvd2VyIDlFKzkgICAgIDEuMiAgICAtPiA4ODEyMzM1MjYxMjQuODc5MSAgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcG93eDIxNDAgcG93ZXIgMUUtNyAgICAgNzEgICAgIC0+IDBFLTM5OCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKK3Bvd3gyMTQxIHBvd2VyIDAuMDAzICAgIDcxICAgICAtPiA3LjUwOTQ2NjUxNDk3OTcyNUUtMTgwICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTQyIHBvd2VyIDAuNyAgICAgIDcxICAgICAtPiAxLjAwNDUyNTIxMTI2OTA3OUUtMTEgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTQzIHBvd2VyIDEuMiAgICAgIDcxICAgICAtPiA0MTg2NjYuNzQ4MzE4NjUxNSAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTQ0IHBvd2VyIDcxICAgICAgIDcxICAgICAtPiAyLjc1MDA2MzczNDgzNDYxNkUrMTMxICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMTQ1IHBvd2VyIDlFKzkgICAgIDcxICAgICAtPiBJbmZpbml0eSAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQgT3ZlcmZsb3cKKworcG93eDIxNTAgcG93ZXIgMUUtNyAgICAgOUUrOSAgIC0+IDBFLTM5OCAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKK3Bvd3gyMTUxIHBvd2VyIDAuMDAzICAgIDlFKzkgICAtPiAwRS0zOTggICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCitwb3d4MjE1MiBwb3dlciAwLjcgICAgICA5RSs5ICAgLT4gMEUtMzk4ICAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorcG93eDIxNTMgcG93ZXIgMS4yICAgICAgOUUrOSAgIC0+IEluZmluaXR5ICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZCBPdmVyZmxvdworcG93eDIxNTQgcG93ZXIgNzEgICAgICAgOUUrOSAgIC0+IEluZmluaXR5ICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZCBPdmVyZmxvdworcG93eDIxNTUgcG93ZXIgOUUrOSAgICAgOUUrOSAgIC0+IEluZmluaXR5ICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZCBPdmVyZmxvdworCistLSBudW1iZXIgbGluZSBtaWxlc3RvbmVzIHdpdGggbGhzPDEgYW5kIGxocz4xCisKKy0tIE92ZXJmbG93IGJvdW5kYXJ5IChObWF4KQorcG93eDIyMDIgcG93ZXIgNzEgICAgIDIwNy45NjY2NTE1ODM5ODMyMDAgLT4gSW5maW5pdHkgSW5leGFjdCBSb3VuZGVkIE92ZXJmbG93Citwb3d4MjIwMSBwb3dlciA3MSAgICAgMjA3Ljk2NjY1MTU4Mzk4MzE5OSAtPiA5Ljk5OTk5OTk5OTk5OTk5NEUrMzg0IEluZXhhY3QgUm91bmRlZAorcG93eDIyMDQgcG93ZXIgMC4wMDMgLTE1Mi42MDM0NDk4MTcwOTM1NzcgLT4gSW5maW5pdHkgSW5leGFjdCBSb3VuZGVkIE92ZXJmbG93Citwb3d4MjIwMyBwb3dlciAwLjAwMyAtMTUyLjYwMzQ0OTgxNzA5MzU3NiAtPiA5Ljk5OTk5OTk5OTk5OTk5NEUrMzg0IEluZXhhY3QgUm91bmRlZAorCistLSBObWluIGJvdW5kYXJ5Citwb3d4MjIxMSBwb3dlciA3MSAgICAtMjA2Ljg4NjMwNTM0MTk4ODQ4MCAtPiAxLjAwMDAwMDAwMDAwMDAwNUUtMzgzIEluZXhhY3QgUm91bmRlZAorcG93eDIyMTIgcG93ZXIgNzEgICAgLTIwNi44ODYzMDUzNDE5ODg0ODEgLT4gMS4wMDAwMDAwMDAwMDAwMDFFLTM4MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMjEzIHBvd2VyIDcxICAgIC0yMDYuODg2MzA1MzQxOTg4NDgyIC0+IDkuOTk5OTk5OTk5OTk5OTdFLTM4NCAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3Bvd3gyMjE0IHBvd2VyIDcxICAgIC0yMDYuODg2MzA1MzQxOTg4NDgzIC0+IDkuOTk5OTk5OTk5OTk5OTJFLTM4NCAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkuOTk5OTk5OTk5OTk5OTI0NTY1MzU3MDE5ODIwCisKK3Bvd3gyMjE1IHBvd2VyIDAuMDAzICAxNTEuODEwNzA0NjIzMjM4NTQzIC0+IDEuMDAwMDAwMDAwMDAwMDA5RS0zODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MjIxNiBwb3dlciAwLjAwMyAgMTUxLjgxMDcwNDYyMzIzODU0NCAtPiAxLjAwMDAwMDAwMDAwMDAwM0UtMzgzIEluZXhhY3QgUm91bmRlZAorcG93eDIyMTcgcG93ZXIgMC4wMDMgIDE1MS44MTA3MDQ2MjMyMzg1NDUgLT4gOS45OTk5OTk5OTk5OTk5N0UtMzg0ICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcG93eDIyMTggcG93ZXIgMC4wMDMgIDE1MS44MTA3MDQ2MjMyMzg1NDYgLT4gOS45OTk5OTk5OTk5OTk5MUUtMzg0ICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorCistLSBOdGlueSBib3VuZGFyeSwgdGhlc2UgZWRnZSBjYXNlcyBkZXRlcm1pbmVkIHVzaW5nIGhhbGZfdXAgcm91bmRpbmcKK3JvdW5kaW5nOiBoYWxmX3VwCitwb3d4MjIyMSBwb3dlciA3MSAgICAtMjE1LjE1MTUxMDQ2OTIyMDQ5OCAtPiAxRS0zOTggICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwKK3Bvd3gyMjIyIHBvd2VyIDcxICAgIC0yMTUuMTUxNTEwNDY5MjIwNDk5IC0+IDFFLTM5OCAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcG93eDIyMjMgcG93ZXIgNzEgICAgLTIxNS4xNTE1MTA0NjkyMjA1MDAgLT4gMEUtMzk4ICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKK3Bvd3gyMjI0IHBvd2VyIDcxICAgIC0yMTUuMTUxNTEwNDY5MjIwNTAxIC0+IDBFLTM5OCAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCisKK3Bvd3gyMjI1IHBvd2VyIDAuMDAzICAxNTcuODc1NjEzNjE4Mjg1NjkxIC0+IDFFLTM5OCAgICBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbAorcG93eDIyMjYgcG93ZXIgMC4wMDMgIDE1Ny44NzU2MTM2MTgyODU2OTIgLT4gMUUtMzk4ICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwb3d4MjIyNyBwb3dlciAwLjAwMyAgMTU3Ljg3NTYxMzYxODI4NTY5MyAtPiAwRS0zOTggICAgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAorcG93eDIyMjggcG93ZXIgMC4wMDMgIDIyMCAgICAgICAgICAgICAgICAgLT4gMEUtMzk4ICAgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsIENsYW1wZWQKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KKworLS0gcG93ZXIoMTAsIHkpIGFyZSBpbXBvcnRhbnQgLi4uCisKKy0tIEludGVnZXIgcG93ZXJzIGFyZSBleGFjdCwgdW5sZXNzIG92ZXIvdW5kZXJmbG93Citwb3d4MjMwMSBwb3dlciAxMCAgICAgMzg1ICAgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzAyIHBvd2VyIDEwICAgICAzODQgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSszODQgUm91bmRlZAorcG93eDIzMDMgcG93ZXIgMTAgICAgICAxNyAgICAgLT4gMS4wMDAwMDAwMDAwMDAwMDBFKzE3IFJvdW5kZWQKK3Bvd3gyMzA0IHBvd2VyIDEwICAgICAgMTYgICAgIC0+IDEuMDAwMDAwMDAwMDAwMDAwRSsxNiBSb3VuZGVkCitwb3d4MjMwNSBwb3dlciAxMCAgICAgIDE1ICAgICAtPiAxMDAwMDAwMDAwMDAwMDAwCitwb3d4MjMwNiBwb3dlciAxMCAgICAgIDEwICAgICAtPiAxMDAwMDAwMDAwMAorcG93eDIzMDcgcG93ZXIgMTAgICAgICAgNSAgICAgLT4gMTAwMDAwCitwb3d4MjMwOCBwb3dlciAxMCAgICAgICAxICAgICAtPiAxMAorcG93eDIzMDkgcG93ZXIgMTAgICAgICAgMCAgICAgLT4gMQorcG93eDIzMTAgcG93ZXIgMTAgICAgICAtMSAgICAgLT4gMC4xCitwb3d4MjMxMSBwb3dlciAxMCAgICAgIC01ICAgICAtPiAwLjAwMDAxCitwb3d4MjMxMiBwb3dlciAxMCAgICAgIC02ICAgICAtPiAwLjAwMDAwMQorcG93eDIzMTMgcG93ZXIgMTAgICAgICAtNyAgICAgLT4gMUUtNworcG93eDIzMTQgcG93ZXIgMTAgICAgICAtOCAgICAgLT4gMUUtOAorcG93eDIzMTUgcG93ZXIgMTAgICAgICAtOSAgICAgLT4gMUUtOQorcG93eDIzMTYgcG93ZXIgMTAgICAgIC0xMCAgICAgLT4gMUUtMTAKK3Bvd3gyMzE3IHBvd2VyIDEwICAgIC0zODMgICAgIC0+IDFFLTM4MworcG93eDIzMTggcG93ZXIgMTAgICAgLTM4NCAgICAgLT4gMUUtMzg0IFN1Ym5vcm1hbAorcG93eDIzMTkgcG93ZXIgMTAgICAgLTM4NSAgICAgLT4gMUUtMzg1IFN1Ym5vcm1hbAorcG93eDIzMjAgcG93ZXIgMTAgICAgLTM5NyAgICAgLT4gMUUtMzk3IFN1Ym5vcm1hbAorcG93eDIzMjEgcG93ZXIgMTAgICAgLTM5OCAgICAgLT4gMUUtMzk4IFN1Ym5vcm1hbAorcG93eDIzMjIgcG93ZXIgMTAgICAgLTM5OSAgICAgLT4gMEUtMzk4IFN1Ym5vcm1hbCBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3Bvd3gyMzIzIHBvd2VyIDEwICAgIC00MDAgICAgIC0+IDBFLTM5OCBTdWJub3JtYWwgVW5kZXJmbG93IEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKKy0tIEluZGVwZW5kZW50IHNhbml0eSBjaGVjazogMTk2MSBHb2RmcmV5ICYgU2lkZG9ucyBmb3VyLWZpZ3VyZSBsb2dzCitwb3d4MjM1MSBwb3dlciAxMCAgIDAuMDAwMCAgICAtPiAxCitwb3d4MjM1MiBwb3dlciAxMCAgIDAuMzAxMCAgICAtPiAxLjk5OTg2MTg2OTYzMjc0NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzUzIHBvd2VyIDEwICAgMC40NzcxICAgIC0+IDIuOTk5ODUzMTgxMTkwNzkzIEluZXhhY3QgUm91bmRlZAorcG93eDIzNTQgcG93ZXIgMTAgICAwLjYwMjEgICAgLT4gNC4wMDAzNjg1MTA0NjEyNTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM1NSBwb3dlciAxMCAgIDAuNjk5MCAgICAtPiA1LjAwMDM0NTM0OTc2OTc4NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzU2IHBvd2VyIDEwICAgMC43NzgyICAgIC0+IDYuMDAwNjczNTM4NjQxMTY0IEluZXhhY3QgUm91bmRlZAorcG93eDIzNTcgcG93ZXIgMTAgICAwLjg0NTEgICAgLT4gNy4wMDAwMzE1OTEzMDg5NjkgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM1OCBwb3dlciAxMCAgIDAuOTAzMSAgICAtPiA4LjAwMDE4NDQ0ODU1MDk5MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzU5IHBvd2VyIDEwICAgMC45NTQyICAgIC0+IDguOTk5MTE5MTA4NzAwNTIwIEluZXhhY3QgUm91bmRlZAorcG93eDIzNjAgcG93ZXIgMTAgICAwLjk5NTYgICAgLT4gOS44OTkxOTc3NTA4MDU4NDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM2MSBwb3dlciAxMCAgIDAuOTk5NiAgICAtPiA5Ljk5MDc5Mzg5OTg0NDYxOCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorcG93eDIzNzEgcG93ZXIgMTAgICAwLjAwMDAgICAgLT4gMQorcG93eDIzNzIgcG93ZXIgMTAgICAwLjMwMTAgICAgLT4gMi4wMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM3MyBwb3dlciAxMCAgIDAuNDc3MSAgICAtPiAzLjAwMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzc0IHBvd2VyIDEwICAgMC42MDIxICAgIC0+IDQuMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIzNzUgcG93ZXIgMTAgICAwLjY5OTAgICAgLT4gNS4wMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM3NiBwb3dlciAxMCAgIDAuNzc4MiAgICAtPiA2LjAwMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzc3IHBvd2VyIDEwICAgMC44NDUxICAgIC0+IDcuMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDIzNzggcG93ZXIgMTAgICAwLjkwMzEgICAgLT4gOC4wMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjM3OSBwb3dlciAxMCAgIDAuOTU0MiAgICAtPiA4Ljk5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyMzgwIHBvd2VyIDEwICAgMC45OTU2ICAgIC0+IDkuODk5IEluZXhhY3QgUm91bmRlZAorcG93eDIzODEgcG93ZXIgMTAgICAwLjk5OTYgICAgLT4gOS45OTEgSW5leGFjdCBSb3VuZGVkCisKKy0tIDEwKip4IH49MiAoaW52ZXJzZSBvZiB0aGUgdGVzdCBpbiBsb2cxMC5kZWNUZXN0KQorcHJlY2lzaW9uOiA1MAorcG93eDI0MDEgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4ODE0NjIxMSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ5Citwb3d4MjQwMiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2MjEgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ4Citwb3d4MjQwMyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTQ2MiAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0NworcG93eDI0MDQgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4ODE0NiAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ2Citwb3d4MjQwNSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MTUgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQ1Citwb3d4MjQwNiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTg4MSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0NAorcG93eDI0MDcgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxODk4OCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQzCitwb3d4MjQwOCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE4OTkgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQyCitwb3d4MjQwOSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODE5MCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0MQorcG93eDI0MTAgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NjgxOSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQwCitwb3d4MjQxMSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2ODIgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM5Citwb3d4MjQxMiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjc2OCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzOAorcG93eDI0MTMgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMjY3NyAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM3Citwb3d4MjQxNCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNjggLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM2Citwb3d4MjQxNSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAyNyAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzNQorcG93eDI0MTYgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OTMwMyAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDM0Citwb3d4MjQxNyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MzAgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMzCitwb3d4MjQxOCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDQ5MyAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzMgorcG93eDI0MTkgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MjQ0OSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMxCitwb3d4MjQyMCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNDUgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMwCitwb3d4MjQyMSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcyNSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyOQorcG93eDI0MjIgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OTQ3MiAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI4Citwb3d4MjQyMyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NDcgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI3Citwb3d4MjQyNCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODg5NSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyNgorcG93eDI0MjUgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3Mzg4OSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI1Citwb3d4MjQyNiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczODkgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDI0Citwb3d4MjQyNyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzczOSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMworcG93eDI0MjggcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMTM3NCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIyCitwb3d4MjQyOSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxMzcgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIxCitwb3d4MjQzMCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIxNCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMAorcG93eDI0MzEgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODExOTUyMSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE5Citwb3d4MjQzMiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NTIgLT4gMi4wMDAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE4Citwb3d4MjQzMyBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTE5NSAtPiAyLjAwMDAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNworcG93eDI0MzQgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5ODEyMCAtPiAyLjAwMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE2Citwb3d4MjQzNSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MTIgLT4gMi4wMDAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE1Citwb3d4MjQzNiBwb3dlciAxMCAwLjMwMTAyOTk5NTY2Mzk4MSAtPiAyLjAwMDAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNAorcG93eDI0MzcgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NjM5OCAtPiAyLjAwMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEzCitwb3d4MjQzOCBwb3dlciAxMCAwLjMwMTAyOTk5NTY2NDAgLT4gMi4wMDAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEyCitwb3d4MjQzOSBwb3dlciAxMCAwLjMwMTAyOTk5NTY2NCAtPiAyLjAwMDAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMQorcG93eDI0NDAgcG93ZXIgMTAgMC4zMDEwMjk5OTU2NiAtPiAyLjAwMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEwCitwb3d4MjQ0MSBwb3dlciAxMCAwLjMwMTAyOTk5NTcgLT4gMi4wMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA5Citwb3d4MjQ0MiBwb3dlciAxMCAwLjMwMTAyOTk5NiAtPiAyLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgOAorcG93eDI0NDMgcG93ZXIgMTAgMC4zMDEwMzAwMCAtPiAyLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA3Citwb3d4MjQ0NCBwb3dlciAxMCAwLjMwMTAzMDAgLT4gMi4wMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA2Citwb3d4MjQ0NSBwb3dlciAxMCAwLjMwMTAzMCAtPiAyLjAwMDAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgNQorcG93eDI0NDYgcG93ZXIgMTAgMC4zMDEwMyAtPiAyLjAwMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICA0Citwb3d4MjQ0NyBwb3dlciAxMCAwLjMwMTAgLT4gMi4wMDAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAzCitwb3d4MjQ0OCBwb3dlciAxMCAwLjMwMSAtPiAyLjAwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAgMgorcG93eDI0NDkgcG93ZXIgMTAgMC4zMCAtPiAyLjAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246ICAxCitwb3d4MjQ1MCBwb3dlciAxMCAwLjMgLT4gMiBJbmV4YWN0IFJvdW5kZWQKKworbWF4RXhwb25lbnQ6IDM4NAorbWluRXhwb25lbnQ6IC0zODMKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCistLSBDbG9zZS10by1lIHRlc3RzCitwcmVjaXNpb246ICAgMzQKK3Bvd3gyNTAwIHBvd2VyIDEwIDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA0OCAgICAgLT4gMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjEgIEluZXhhY3QgUm91bmRlZAorcG93eDI1MDEgcG93ZXIgMTAgMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDQ5ICAgICAtPiAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjUwMiBwb3dlciAxMCAwLjQzNDI5NDQ4MTkwMzI1MTgyNzY1MTEyODkxODkxNjYwNTAgICAgIC0+IDIuNzE4MjgxODI4NDU5MDQ1MjM1MzYwMjg3NDcxMzUyNjYyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNTAzIHBvd2VyIDEwIDAuNDM0Mjk0NDgxOTAzMjUxODI3NjUxMTI4OTE4OTE2NjA1MSAgICAgLT4gMi43MTgyODE4Mjg0NTkwNDUyMzUzNjAyODc0NzEzNTI2NjMgIEluZXhhY3QgUm91bmRlZAorcG93eDI1MDQgcG93ZXIgMTAgMC40MzQyOTQ0ODE5MDMyNTE4Mjc2NTExMjg5MTg5MTY2MDUyICAgICAtPiAyLjcxODI4MTgyODQ1OTA0NTIzNTM2MDI4NzQ3MTM1MjY2MyAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGUqKmUsIDE2LT4zNAorcG93eDI1MDUgcG93ZXIgMi43MTgyODE4Mjg0NTkwNDUgMi43MTgyODE4Mjg0NTkwNDUgLT4gJzE1LjE1NDI2MjI0MTQ3OTI1NzA1NjMzNzM5NTEzMDk4MjE5JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gU2VxdWVuY2UgYXJvdW5kIGFuIGludGVnZXIKK3Bvd3gyNTEyIHBvd2VyIDEwIDIuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NyAgICAgLT4gOTk5Ljk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTMgIEluZXhhY3QgUm91bmRlZAorcG93eDI1MTMgcG93ZXIgMTAgMi45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4ICAgICAtPiA5OTkuOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5NSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjUxNCBwb3dlciAxMCAyLjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkgICAgIC0+IDk5OS45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk4ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNTE1IHBvd2VyIDEwIDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgICAgLT4gMTAwMAorcG93eDI1MTYgcG93ZXIgMTAgMy4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxICAgICAtPiAxMDAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MjUxNyBwb3dlciAxMCAzLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgICAgIC0+IDEwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gyNTE4IHBvd2VyIDEwIDMuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMyAgICAgLT4gMTAwMC4wMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEgIEluZXhhY3QgUm91bmRlZAorCistLSByYW5kb21seSBnZW5lcmF0ZWQgdGVzdHMKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCisKKy0tIFA9MzQsIHdpdGhpbiAwLTk5OSAtLSBwb3NpdGl2ZSBhcmcyCitQcmVjaXNpb246IDM0Citwb3d4MzIwMSBwb3dlciA1LjMwMTU1Nzc0NDEzMTk2OTI0OTE0NTkwNDYxMTI5MDczNSAgMzY5LjMxNzU2NDc5ODQ0MzU1MzQyNDM4MTM0NjYzODA1NzkgLT4gMy40MjcxNjU2NzYzNDU2ODgyNDAwMjMxMTMzMjY2MDM5NjBFKzI2NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjAyIHBvd2VyIDAuMDAwMDAwMDAwMDUwNjg3NTY1NTgxOTE2NTk3MzczODIyNSAyMS45MzUxNDEwMjcwNDQ2NjQzNDEyMTgyNjk2NTE5Njg3OCAtPiAxLjQ5ODE2OTg2MDAzMzQ4NzMyMTU2NjY1OTQ5NTM0MDc4OUUtMjI2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDMgcG93ZXIgOTcuODg4Nzc2ODA3MjE1MTk5MTc4NTgwMDc4MTA0OTQwNDMgIDUuMTU5ODk4NDQ1MjQyNzkzNDcwNDc2NjczMTA5ODk5NTU0IC0+IDE4NzA1OTQyOTA0LjQzMjkwNDY3MjgxNDQ5NTU5NDI3OTgyICAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwNCBwb3dlciA3LjM4MDQ0MTAxNTU5NDM5OTc0Nzk3MzkyNDM4MDQ5Mzc5OSAgMTcuOTM2MTQxNzM5MDQ4MTgzMTM1MDc1MjUxMDkwMzMyODggLT4gMzcxNTc1Nzk4NTgyMDA3Ni4yNzMzMzYwODI3MDI1NzcyNzQgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA1IHBvd2VyIDIuMDQ1NjIzNjI3NjQ3MzUwOTE4ODE5MjE5MTY5ODU1MDQwICAxMDgyLjk5OTY1MjQwNzQzMDY5Nzk1ODE3NTk2Njk5NjI1NCAtPiA0LjIwODgwNjQzNTAwNjcwNDg2NzQ0NzE1MDkwNDI3OTg1NEUrMzM2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDYgcG93ZXIgMC4wMDAwMDAwNzYyNTgyODczMTEyMTE4OTI2MTQyOTU1NDIzIDIwLjMwNTM0MjM3MDU1MDczOTk2OTc1MjAzODY0MTcwNDMyIC0+IDIuOTY3NTc0Mjc4Njc3MDEzMDkwNjk3MTMwMzQ5MTk4ODc3RS0xNDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwNyBwb3dlciAwLjAwMDAwMDAwMDAxOTQwOTE0NzA5MDc4MTQ4NTU2NjA1MzUgMTQuNzExNjQyMTM5NDc3MjIyMzg4NTY4MzU0NDAyNDI5MTEgLT4gMi41NjQzOTEzOTc0Njk1NTQ3MzUwMzcxNTgzNDU5NjMyODBFLTE1OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA4IHBvd2VyIDAuMDAwMDAwMDAwMDUwOTQzNDE4NTM4MjgxODU5Njg1MzUwNCAyMC45NzA1MTQ5ODIwNDE4ODI3NzM0NzIwMzczNTQyMTU5NSAtPiAxLjQyMDE1NzM3Mjc0ODA4MzAwMDkyNzEzODY3ODQxNzI3MkUtMjE2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDkgcG93ZXIgMC4wMDA1Mzg5MjE3MjEyMDczMzA3MzAxMzk1NzUwNzQ1MTE5IDQzLjk2Nzk4MjI1NDg1NzQ3MzE1ODU4Njc4NzU1NTM4OTcxIC0+IDEuOTU3ODUwMTg1NzgxMjkyMDA3OTc3ODk4NjI2MTM3MjQwRS0xNDQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxMCBwb3dlciA0OTguNTY5MDEwNTk4OTEzNjA1MDQ0NDA3NzQ0NzQxMTE5OCAgMTI4LjEwMzg4MTM4MDcyNDMzNzU4Nzg4MzExMDQ3NDU4MDMgLT4gMy44ODIyMTI5NzA5MDM4OTMxMjcwMDkxMDIyOTM1OTYyNjhFKzM0NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjExIHBvd2VyIDAuMDAwMDAwMDkzNTQyODkxODYzNzMwMzk1NDI4MTkzODk3NSA1LjczNjkzMzQ1NDg2MzI3ODU5NzQ2MDA5MTU5NjQ5NjA5OSAtPiA0LjczMzIxOTY0NDU0MDQ5NjE1MjQwMzk2NzgyMzYzNTE5NUUtNDEgIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTIgcG93ZXIgOC41ODE1ODY3ODQ3MzQxNjEzMDkxODAzNjMxMTAxMjYzNTIgIDI1Mi4wMjI5NDU5OTY4ODY5Nzg0NjQzMzc0OTgxNDc3MjA4IC0+IDEuOTA3NDY0ODQyNDU4Njc0NjIyMzU2MTc3ODUwMDQ5ODczRSsyMzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxMyBwb3dlciAyOTQuMTAwNTMwMjk1MTYyMTcwOTE0MzMyMDc5NTI3ODMwNSAgMTU1LjU0NjYzNzQxNDE3MDg2MTU5NzUxMTEwMTQ2NjM3MjIgLT4gOS4yNTE3MTcwMzMyOTIwNzI5NTkxNjY3MzcyODA3Mjk3MjhFKzM4MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE0IHBvd2VyIDAuMDAwMDAwMDA0MTI1MzM0MzY1NDM5Njg2NTg1NTcyMjA5MCAxOS4wMDE3MDk3NDc2MDQyNTU3NjI0NzY2MjEyNTExMDQ3MiAtPiA0Ljc3OTU2NjI4ODU1Mzg2NDQwNTc5MDkyMTM1MzU5MzUxMkUtMTYwIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTUgcG93ZXIgMC4wMDAwMDAwMDAwMDQ2OTEyMjU3MzUyMTQxMzk1MTg0MDkyIDI0LjY2MDg5NTIzMTQ4NzI5MjY5MDk4NzczMjM2NjM2ODc4IC0+IDQuMjA1MTI2ODc0MDQ4NTk3ODQ5NDc2NzIzNTM4MDU3NTI3RS0yODAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxNiBwb3dlciAwLjAwMDAwMDAwMDAwMzY3OTY2NzQyOTY1MjA2Mzk0NTA0OTQgMjIuMDk3MTM5NTY5MDA2OTQ2ODkyMzQzMzU5MTI1MjMwNzggLT4gMi4xNzMwODE4NDM4Mzc1Mzk4MTg0NzIwNzEzMTY0MjA0MDVFLTI1MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE3IHBvd2VyIDkuNjU5ODg3MTAwMzAzMDM3NjU3OTM0MzcyMTQ4NTY3Njg1ICAyNzcuMzc2NTY2NTQyNDMyMDg3NTk5MzAyNjQwNDQ5MjIxNiAtPiAxLjYxNDk3NDA0MzE0NTUxOTM4Mjc0OTc0MDYxNjY2NTA0MUUrMjczIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTggcG93ZXIgMC4wMDAwMDgzMjMxMzEwNjQyMjI5MjA0Mzk4OTQzMDc2NDAzIDI5LjMzMTIzMjExNzgyMTMxNDY2NDcxMzU5MTI4MTkwMzcyIC0+IDEuMDEzMzMwNDM5Nzg2NjYwMjEwNzU3MjI2NTk3Nzg1MzI4RS0xNDkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxOSBwb3dlciAwLjA5MzgwODQ4NTkwODY0NTA5NTQ5NTY4NjM3MjU2NTM2NjQgMjYyLjYwOTE5MTgxOTk5MDUyNzI4MzcyODY3ODQ5NzUwMTIgLT4gMS4yNjI4MDI0ODUyODYzMDEwNjY5Njc1NTU4MjE1MDkzNDRFLTI3MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjIwIHBvd2VyIDguMTk0OTI2OTc3NTgwOTAwMTQ1Njk2MzA1OTEwMjIzMzA0ICAxODQuMzcwNTEzMzk0NTU0NjIwMjAxMjk5NTQ4NTI5NzI0OCAtPiAyLjY5NjM1MzkxMDkwNzgyNDAxNjY5MDAyMTQ5NTgyODU4NEUrMTY4IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjEgcG93ZXIgNzIuMzk1OTQ1OTQ2NTMwODUxNjE1MjIyODUxMTQ1NjYxMjAgIDE2OC43NzIxOTA5NDg5MzIxNDAyMTUyMDMzOTM5ODM2NzI1IC0+IDcuMzc5ODU4MjkzNjMwNDYwMDQzMzYxNTg0NDEwNzk1MDMxRSszMTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyMiBwb3dlciAwLjAwMDAwMDAwMDAwMDM0MzY4NTYwMTAxNDQxODU0NDU1MzcgMjYuMzQzMjk4Njg5NjEyNzQ5ODg5OTQ0NTI1MjYxNzg5ODMgLT4gNC41ODUzNzk1NzM1OTU4NjU2ODk2MDU1Njc3MjAxOTI3NjhFLTMyOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjIzIHBvd2VyIDIwLjE4MzY1NjMzNzYyMjI2NTUwMjU0NTQyNDg5NDkyNjIzICAxMjcuMjA5OTcwNTIzNzAyMTM1MDEwMzY3ODA3MjcwNzc5MCAtPiAxLjAyMDkxOTYyOTMzNjk3OTM1MzY5MDI3MTc2MjIwNjA2MEUrMTY2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjQgcG93ZXIgMC4wMDAwMDAwNTUzNzIzOTkwNzYxNTMwMjkwMTI5MjY4MTMxIDguMTU3NTk3NTY2MTM0NzU0NjM4MDE1MTk5NTAxMTYyNDA1IC0+IDYuMzQ5MDMwNTEzMzk2MTQ3NDgwOTU0NDc0NjE1MDY3MTQ1RS02MCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyNSBwb3dlciAwLjAwMDEwMjg3NDI2NzQyNjU4NDA2NTY2MTQ2ODI2MTgwMzUgOTMuOTk4NDIzMTczMDY2MDM3OTc5NjU0NzAyODE3MTY0ODIgLT4gMS40NTU4NzExMTAyMjI3MzY1MzE4NTQ5OTAzOTc3Njk5NDBFLTM3NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI2IHBvd2VyIDk1LjkwMTk1MTUyNzc1NTQzODc2NDg5NzQ2MzQzMjY2MDUwICAxNDMuNTk5Mjg1MDAwMjIxMTUwOTc3NzcyMDc5OTM1MjQ3NSAtPiAzLjg4MTU0MDAxNTg0ODUzMDQwNTE4OTgzNDM2NjU4ODU2N0UrMjg0IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjcgcG93ZXIgMC4wMDAwMDAwMDAwMDQxNzgzNzQ3MDU3MjMzODc4MzYwMzMzIDEyLjE0NTkxMTY3NzY0OTkzNTA2ODIxMzM0NzYwOTU0NDMwIC0+IDYuMTkwOTk4NTU3NDU2ODg1OTg1MTI0NTkyODA3MzgzMTYzRS0xMzkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyOCBwb3dlciAwLjU1NzI4MzA0OTcwODY3NDA3OTg0MzQ5MTcwOTAwMTg3NjggMTAwMS45MjE4MTEyNjM5MTk1MjIyMzAzMzAyNDEzNDkxNjYgLT4gMy44NzExNDUxNTg1MzcxNzA0NTAwOTM4MzM4ODE2MjU4MzhFLTI1NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI5IHBvd2VyIDUxNi40NzU0NzU5Nzc5MDkzOTU0NzkwODEzODgxMzMzMjMyICAyOS4yMzgxMjQ2MzEyNjMwOTA1NzgwMDc5MzY0NTMzNjM0MyAtPiAyLjExMDk4NjE5MjQwODg3ODI5NDAxMjQ1MDA1MjkyOTE4NUUrNzkgIEluZXhhY3QgUm91bmRlZAorcG93eDMyMzAgcG93ZXIgMC4wMDAwODM1ODkyMDk5NDY0NTg0Nzc2ODQ3Mjk5MDIwNzA2IDI3LjY0Mjc5OTkyODg0ODQzODc3NDUzNTkyNjU5MzQxNTg4IC0+IDEuODkxNTM1MDk4OTA1NTA2Njg5NTEyMzc2MjI0OTQzMjkzRS0xMTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzMSBwb3dlciA3Mi40NTgzNjU3Nzc0ODU3MTgzODEzOTkwMDE2NTE4NDk1NSAgMTY2LjI1NjI4OTA3MzUwMzI1NDUwOTE2ODgwMTUxNjAwODQgLT4gMS43ODQwOTE1NDkwNDE1NjE1MTY5MjMwOTI1NDI5MzkxNDFFKzMwOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjMyIHBvd2VyIDMwNS4xODIzMzE3NjQzMzM1OTI0MDA3NjI5NTYzMDA5MDMyICA4My4wMTA2NTE1OTUwODQ3Mjg4NDIxOTI5MDEzNjMxOTYyMyAtPiAxLjc1NzQ5MzEzNjE2NDM5NTIyOTYwMjQ1Njc4Mjc3OTExMEUrMjA2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMzMgcG93ZXIgNy4xMDg1MjcxMDI5NTE3MTM2MDM1NDI4MzU3OTE3MzM3ODYgIDE0NS43MDU3ODUyNzY2MjM2MzY1NDUwNDYzNDI4ODIxOTQ4IC0+IDEuMjg1OTM0Nzc0MTEzMTA0MzYyNjYzNjE5ODk2NTUwNTI4RSsxMjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzNCBwb3dlciA2LjQ3MTM5MzUwMzE3NTQ2NDgyODE0OTM2NTY5NzA0OTgyNCAgNjQuMTE3NDE5MzcyNjI0NTU3MjUyODQ3NTQxNzE5OTU3MjAgLT4gOS45Nzg5OTAzNTU4ODE4MDMxOTUyODAwMjc1MzMwMTE2OTlFKzUxICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM1IHBvd2VyIDM5LjcyODk4MDk0MTM4NDU5ODg1NjYyMzgwODY2MjY4Mzg1ICAyMzkuOTY3NzI4ODAxNzQ0NzQwMDc4NjY3Mjc3OTczNTE2OCAtPiA1LjQyMjIxODIwODUxNzA5ODMzNTgzMjg0ODQ4NzM3NTA4NkUrMzgzIEluZXhhY3QgUm91bmRlZAorcG93eDMyMzYgcG93ZXIgMC4wMDAyODY1NTkyMzMyNzM2OTczMDAwMTgzMjg3MzI5OTMzIDkwLjM0NzMzODY5NTkwNTgzNzg3MDY1NjQyNTMyNjQxMDk2IC0+IDguMjkzNzMzMTI2OTc2MjEyMDMzMjA5MjQzMjU3MTM2Nzk2RS0zMjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzNyBwb3dlciAwLjAwMDAwMTEzNDMzODQzOTQ4NjQ4MTExOTUwNzczNTc5MzYgMS45MjY1NjgyODU1MjgzOTk2NTY3ODkxNDA4MDkzOTkzOTYgLT4gMy41MTYwNTU2MzkzNzgzNTAxNDY4NzQyNjEwNzc0NzAxNDJFLTEyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM4IHBvd2VyIDAuMDAwMDAwMDAzNTMyMTYxMDI5NTA2NTI5OTM4NDg4OTIyNCA3LjU4Mzg2MTc3ODgyNDI4NDA5MjQzNDA4NTI2NTI2NTU4MiAtPiA3Ljk3MDg5OTgyMzgxNzM2OTc2NDM4MTk3NjI4NjUzNjIzMEUtNjUgIEluZXhhY3QgUm91bmRlZAorcG93eDMyMzkgcG93ZXIgNjU3LjUwMjgzMDE1NjkzNTI2Nzc1NDM3NzA3NTgzNDY2ODMgIDkwLjU1Nzc4NDUzODExOTY1MTE2MjAwMjA2MDIwMTcyNzU4IC0+IDEuNTIyNTMwODk4NTgxNTY0MjAwNjU1MTYwNjY1NzIzMjY4RSsyNTUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI0MCBwb3dlciA4LjQ4NDc1NjM5ODMyNTc0ODg3OTQ1MDU3NzUyMDI1MTQ0NyAgMzg5Ljc0NjgyOTI0NzYyNjI0Nzg1NzgyODA1MzEyMjI0MTcgLT4gOC41OTUxNDI4MDM1ODczNjgwOTMzOTI1MTAzMTA4MTEyMThFKzM2MSBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD0xNiwgd2l0aGluIDAtOTkgLS0gcG9zaXRpdmUgYXJnMgorUHJlY2lzaW9uOiAxNgorcG93eDMxMDEgcG93ZXIgMC4wMDAwMjE1NTI0NjM5MjIzIDQ4LjM3NTMyNTIyMzU1MjUyIC0+IDEuODA0NjYzMjU3Mjg3Mjc3RS0yMjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEwMiBwb3dlciAwMC44MDcwNTg1NjIyNzk5OSAgMjcwNi43Nzc1MzUxMjEzOTEgLT4gMS4wMjk2MjUwNjU4NzYxNTdFLTI1MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTAzIHBvd2VyIDMuNDQ1NDQxNjc2MzgzNjg5ICA0MjguNTE4NTg5MjQ1NTgzMCAtPiAxLjY1NzQwMTY4MzA5NjQ1NEUrMjMwIEluZXhhY3QgUm91bmRlZAorcG93eDMxMDQgcG93ZXIgMC4wMDQwMTU4Njg5NDk1ODI2IDE1OS41NzI1NTU4ODE2MjQwIC0+IDQuMjU1NzQzNjY1NzYyNDkyRS0zODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEwNSBwb3dlciAwLjAwMDA4NDE1NTMyODEyMTUgMzguMzI1MDQ0MTM0NTM5NDQgLT4gNi43Mzg2NTM5MDI1MTIwNTJFLTE1NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTA2IHBvd2VyIDAuNzMyMjYxMDI1MjU3MTM1MyA1MDIuMTI1NDQ1NzY3NDExOCAtPiAxLjEwOTk3ODEyNjk4NTk0M0UtNjggIEluZXhhY3QgUm91bmRlZAorcG93eDMxMDcgcG93ZXIgMTAuNzUwNTI1MzIxNDQ4ODAgIDY3LjM0MTgwNjA0NzM0NzgxIC0+IDIuODczMDE1MDE5NDcwMTg5RSs2OSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEwOCBwb3dlciAyNi4yMDQyNTk1Mjk0NTYxNyAgMTA0LjYwMDI2NzExODY0ODggLT4gMi4zMDE4NTkzNTU3NzcwMzBFKzE0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTA5IHBvd2VyIDAuMDAwMDA1NTczNzQ3Mzg1MCAzMS4xNjI4NTg1OTAwNTQyNCAtPiAxLjg4MzM0ODQ3MDEwMDQ0NkUtMTY0IEluZXhhY3QgUm91bmRlZAorcG93eDMxMTAgcG93ZXIgNjEuMDYwOTYwMTEzNjA3MDAgIDEwLjkzNjA4NDM5MDg4NzI2IC0+IDMuMzgyNjg2NDczMDI4MjQ5RSsxOSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzExMSBwb3dlciA5LjM0MDg4MDg1MzI1NzEzNyAgMTc5LjkwOTQ5MzgxMzE3MjYgLT4gMy44MTkyOTk3OTU5Mzc2OTZFKzE3NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTEyIHBvd2VyIDAuMDAwMDA1MDc2NzM3MTc1NiA3Mi4wMzM0NjM5NDE4Njc0MSAtPiA0LjIxNjIzNjY5MTU2OTg2OUUtMzgyIEluZXhhY3QgUm91bmRlZAorcG93eDMxMTMgcG93ZXIgNi44Mzg0Nzg4MDc4NjA1OTYgIDQ3LjQ5NjY1NTkwNjAyMjg1IC0+IDQuNTQ3NjIxNjMwMDk5MjAzRSszOSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzExNCBwb3dlciAwLjEyOTkzMjQzNDY0MzkwODEgMzk3Ljc0NDA1MjM1NzY5MzggLT4gMy4wNjUwNDc3MDU1NTM5ODFFLTM1MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTE1IHBvd2VyIDAuMDAwMzQxODA0NzAzNDI2NCAyMC4wMDUxNjc5MTUxMjAxOCAtPiA0LjU0NjE4OTY2NTM4MDQ4N0UtNzAgIEluZXhhY3QgUm91bmRlZAorcG93eDMxMTYgcG93ZXIgMC4wMDAxMjc2ODk5NjExNzE1IDc4LjEyOTY4Mjg3MzU1NzAzIC0+IDUuOTYwMjE3NDA1MDYzOTk1RS0zMDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzExNyBwb3dlciAyNS45MzE2MDU4ODE4MDUwOSAgMjUyLjYyNDUwNzEwMDQ2MjAgLT4gMS40NzIxNzE1OTc1ODkxNDZFKzM1NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTE4IHBvd2VyIDM1LjQ3NTE2ODU3NzYzMTc4ICA4Ni4xNDcyMzAzNzM2MDkyNSAtPiAzLjMyNDI5OTkwODQ4MTEyNUUrMTMzIEluZXhhY3QgUm91bmRlZAorcG93eDMxMTkgcG93ZXIgMC4wMDAwMDQ4MTcxMDg2NzIxIDQzLjMxOTY1NjAzMDM4NjY2IC0+IDQuNTcyMzMxNTE2NjE2MjI4RS0yMzEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEyMCBwb3dlciAxNy45NzY1MjY4MTA5Nzg1MSAgMTQ0LjQ2ODQ1NzY1NTAyOTIgLT4gMS44NDI1MDk5MDYwOTc4NjBFKzE4MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTIxIHBvd2VyIDMuNjIyNzY1MTQxNTE4NzI5ICAzMDUuMTk0ODY4MDM0NDk1MCAtPiA0LjEzMjMyMDk2NzU3ODcwNEUrMTcwIEluZXhhY3QgUm91bmRlZAorcG93eDMxMjIgcG93ZXIgMC4wMDgwOTU5MDAyNDUzNTE5IDE0My45ODk5NDQ0OTQ1NjI3IC0+IDYuNDc0NjI3ODEyOTQ3MDQ3RS0zMDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEyMyBwb3dlciA5Ljg0MTY5OTkyNzI3NjU3MSAgMjk5LjI0NjY2Njg4MzcxODggLT4gMS40ODkwOTc2NTYyMDg3MzZFKzI5NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTI0IHBvd2VyIDAuMDc4NjY1OTIwNjIzMjM1NSAzNDcuNDc1MDc5Njk2MjU3MCAtPiAyLjA1NzY0ODA5NjQ2OTI1RS0zODQgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwb3d4MzEyNSBwb3dlciAwLjAwMDAwODQ0NTk3OTI2NDUgNTIuNDczNDg2OTA3NDU0ODcgLT4gNi4wNzYyNTE4NzY1MTY5NDJFLTI2NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTI2IHBvd2VyIDI3Ljg2NTg5OTA5OTY3NTA0ICAxOTEuNzI5NjUzNzEwMjI4MyAtPiAxLjE1NzA2NDExMjk4OTM4NkUrMjc3IEluZXhhY3QgUm91bmRlZAorcG93eDMxMjcgcG93ZXIgMC4wMDAwNDE5OTA3OTM3MjM0IDU4LjQ0OTU3NzAyNzMwNzY3IC0+IDEuNDk2OTUwNjcyMDc1MTYyRS0yNTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEyOCBwb3dlciAwLjAwMDA2NjQ5Nzc3MzkzODIgODAuMDY3NDkyMTMyNjE4NzYgLT4gMy40ODg1MTc2MjAxMDc4NzVFLTMzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTI5IHBvd2VyIDU4LjQ5NTU0NDg0ODg2NjU2ICAxMjUuODQ4MDc2ODM3MzQ5OSAtPiAyLjQ0OTA4OTg2MjE0NjY0MEUrMjIyIEluZXhhY3QgUm91bmRlZAorcG93eDMxMzAgcG93ZXIgMTUuMDI4MjAwNjAwMjQ0NDkgIDIxMi4zNTI3OTg4OTczMzM4IC0+IDguMzA3OTEzOTMyNjgyMDY3RSsyNDkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzMSBwb3dlciAwLjAwMDI2NTAwODk5NDI5OTIgMzAuOTIxNzMxMjM2Nzg3NjEgLT4gMi41MTc4Mjc2NjQ4MzYxNDdFLTExMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTMyIHBvd2VyIDAuMDAwNzM0Mjk3NzQyNjU3OCA2OS40OTE2ODg4MDc0MTEyMyAtPiAxLjYwMDE2ODY2NTY3NDQ0MEUtMjE4IEluZXhhY3QgUm91bmRlZAorcG93eDMxMzMgcG93ZXIgMC4wMDYzODE2MDY4NjUwNjI5IDE1MC4xNDAwMDk0MTgzODEyIC0+IDIuNzA1MDU3Mjk1Nzk5MDAxRS0zMzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzNCBwb3dlciA5LjkxMjkyMTEyMjcyODc5MSAgMjk3LjgyNzQwMTM2MzM0MTEgLT4gNC45Njc2MjQ5OTM0Mzg5MDBFKzI5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTM1IHBvd2VyIDEuOTg4NjAzNTYzOTg5MjQ1ICA3NjguNDg2Mjk2NzkyMjE4MiAtPiAyLjY5Mjg0MjQ3NDg5OTU5NkUrMjI5IEluZXhhY3QgUm91bmRlZAorcG93eDMxMzYgcG93ZXIgOC40MTgwMTQ1MTk1MTc2OTEgIDE2NC4yNDMxMzU5OTgwNzI1IC0+IDkuMTA2MjExNTg1ODg4ODM2RSsxNTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEzNyBwb3dlciA2LjA2ODgyMzYwNDQ1MDY4NiAgMTIwLjI5NTUyMTIzNjU4MzcgLT4gMS41OTk0MzE5MTgxMDU5ODJFKzk0ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMTM4IHBvd2VyIDU2LjkwMDYyNzM4MzAzODUwICA1NC45MDQ2ODI5NDY4MzY0NSAtPiAyLjMxMjgzOTE3NzkwMjQyOEUrOTYgIEluZXhhY3QgUm91bmRlZAorcG93eDMxMzkgcG93ZXIgNS43MTA5MDUxMzk3NTA4NzEgIDczLjQ0NjA4NzUyOTYyMTU2IC0+IDMuNzc1ODc2MDUzNzA5OTI5RSs1NSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzE0MCBwb3dlciAwLjAwMDAwMTc0NDY3NjEyMDMgMS4yMjM5ODE0OTIyMjg4OTkgLT4gOC45NTI5MzY1OTU0NjU2MzVFLTggICBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD03LCB3aXRoaW4gMC05IC0tIHBvc2l0aXZlIGFyZzIKK1ByZWNpc2lvbjogNworcG93eDMwMDEgcG93ZXIgOC43Mzg2ODkgIDU1Ljk2NTIzIC0+IDQuODc4MTgwRSs1MiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwMiBwb3dlciAwLjA0MDQ3NjMgMTQ3LjQ5NjUgLT4gMy42ODk3MjJFLTIwNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDAzIHBvd2VyIDAuMDYwNDIzMiA3Ni42OTc3OCAtPiAzLjMxOTE4M0UtOTQgIEluZXhhY3QgUm91bmRlZAorcG93eDMwMDQgcG93ZXIgMC4wMDU4ODU1IDEwNy41MDE4IC0+IDEuNzY4ODc1RS0yNDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwNSBwb3dlciAyLjA1ODMwMiAgMTE3My4wNTAgLT4gNS43Nzg4OTlFKzM2NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA2IHBvd2VyIDAuMDA1Njk5OCA4NS43MDE1NyAtPiA0LjcxNjc4M0UtMTkzIEluZXhhY3QgUm91bmRlZAorcG93eDMwMDcgcG93ZXIgMC44MTY5Mjk3IDM2OTMuNTM3IC0+IDQuNDc1OTYyRS0zMjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwOCBwb3dlciAwLjI4MTAxNTMgNjU5Ljk1NjggLT4gMS41MzMxNzdFLTM2NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA5IHBvd2VyIDQuNjE3NDc4ICAxNS42ODMwOCAtPiAyLjYyOTc0OEUrMTAgIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTAgcG93ZXIgMC4wMjk2NDE4IDI0NC4yMzAyIC0+IDYuMjA3OTQ5RS0zNzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxMSBwb3dlciAwLjAwMzY0NTYgMTI3Ljk5ODcgLT4gOC4xMjA4OTFFLTMxMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDEyIHBvd2VyIDAuNTAxMjgxMyA1NzcuNTQxOCAtPiA2LjA4ODgwMkUtMTc0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMTMgcG93ZXIgMC4wMDMzMjc1IDExOS45ODAwIC0+IDUuMDU1MDQ5RS0yOTggSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxNCBwb3dlciAwLjAwMzc2NTIgMTExLjcwOTIgLT4gMS41NjAzNTFFLTI3MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE1IHBvd2VyIDAuNjQ2MzI1MiAyMzkuMDU2OCAtPiA0Ljg2NDU2NEUtNDYgIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTYgcG93ZXIgNC43ODQzNzggIDQ3NS4wNTIxIC0+IDguOTY0NDYwRSszMjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxNyBwb3dlciA0LjYxMDMwNSAgNTYzLjE3OTEgLT4gNi4yOTAyOThFKzM3MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE4IHBvd2VyIDAuMDE3NTE2NyA4MC41MjIwOCAtPiAzLjYyMzQ3MkUtMTQyIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTkgcG93ZXIgNS4yMzgzMDcgIDM1Ni43OTQ0IC0+IDQuMDExNDYxRSsyNTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyMCBwb3dlciAwLjAwMDM1MjcgOTYuMjYzNDcgLT4gNC4zNzc5MzJFLTMzMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDIxIHBvd2VyIDAuMDAxNTE1NSAxMzYuMDUxNiAtPiAyLjU3MTEzRS0zODQgIEluZXhhY3QgUm91bmRlZCBVbmRlcmZsb3cgU3Vibm9ybWFsCitwb3d4MzAyMiBwb3dlciA1Ljc1MzU3MyAgMjczLjIzNDAgLT4gNC4zNzMxODRFKzIwNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDIzIHBvd2VyIDcuNzc4NjY1ICAzMzIuNzkxNyAtPiAzLjA2MDY0MEUrMjk2IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjQgcG93ZXIgMS40MzI0NzkgIDIwNDYuMDY0IC0+IDIuMzI1ODI5RSszMTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyNSBwb3dlciA1LjYxMDUxNiAgMTM2LjQ1NjMgLT4gMS42MDc1MDJFKzEwMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDI2IHBvd2VyIDAuMDA1MDY5NyAxMzcuNDUxMyAtPiAzLjUyMjMxNUUtMzE2IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjcgcG93ZXIgNS42Nzg3MzcgIDg1LjE2MjUzIC0+IDEuNzEzOTA5RSs2NCAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyOCBwb3dlciAwLjA4MTYxNjcgMjM2LjE5NzMgLT4gOS4yMjg4MDJFLTI1OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDI5IHBvd2VyIDAuMjYwMjgwNSA1NjIuMDE1NyAtPiAyLjk0NDU1NkUtMzI5IEluZXhhY3QgUm91bmRlZAorcG93eDMwMzAgcG93ZXIgMC4wMDgwOTM2IDI0LjI1MzY3IC0+IDEuODM5NzU1RS01MSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzMSBwb3dlciA0LjA5MjAxNiAgODIuOTQ2MDMgLT4gNS43MjQ5NDhFKzUwICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDMyIHBvd2VyIDAuMDA3ODI1NSA3LjIwNDE4NCAtPiA2LjY3NTM0MkUtMTYgIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzMgcG93ZXIgMC45OTE3NjkzIDI5ODQ2LjQ0IC0+IDcuNDMwMTc3RS0xMDggSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzNCBwb3dlciAxLjYxMDM4MCAgMzAxLjI0NjcgLT4gMi4xNzAxNDJFKzYyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM1IHBvd2VyIDAuMDU4ODIzNiAyMTIuMTA5NyAtPiAxLjAyMzE5NkUtMjYxIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzYgcG93ZXIgMi40OTgwNjkgIDUzMS40NjQ3IC0+IDIuMDU0NTYxRSsyMTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzNyBwb3dlciA5Ljk2NDM0MiAgMzI2LjU0MzggLT4gMS4wODk0NTJFKzMyNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM4IHBvd2VyIDAuMDgyMDYyNiAyNjguODcxOCAtPiAxLjEwNzM1MEUtMjkyIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzkgcG93ZXIgNi4xNzY0ODYgIDM2MC43Nzc5IC0+IDEuOTE0NDQ5RSsyODUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0MCBwb3dlciA0LjIwNjM2MyAgMTYuMTcyODggLT4gMS4yMzEzMTRFKzEwICBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD0zNCwgd2l0aGluIDAtOTk5IC0tIG5lZ2F0aXZlIGFyZzIKK1ByZWNpc2lvbjogMzQKK3Bvd3gzNzAxIHBvd2VyIDM3Ni4wOTE1MjcwMDAwMTA5NDg2NjMzNDAyODI3MDA3OTAyICAtMzUuNjk4MjIzNDk5MDQxMDIxMzE2NDkyNDM3MDE5NTg0NjMgLT4gMS4xNjU3MjI4MzEyMjU1MDY0NTc4Mjg2NTM0MTMyMDAxNDNFLTkyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzAyIHBvd2VyIDAuMDAwMDAwMDUwMzc0NzQ0MDA3NDYxMzE5MTY2NTg0NTMxNCAtOS41MjAzMDgzNDE0OTc5NzkwOTMwMjE4MTM1NzE0NTA1NzUgLT4gMy4wMDA0MzI0Nzg4NjE4ODM5NTM5Nzc5NzEyMjY3NzA0MTBFKzY5ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzAzIHBvd2VyIDI5MC42ODU4NzMxNDk1MzM5Nzc4MzM3OTUzNDA3OTM4MzA4ICAtMTE4LjU0NTkwNDg1OTc3ODk2OTMyOTI0NTU2NzM0MjgzNjcgLT4gOS4zNTc5NjkwNDcxMTM5ODkyMzgzOTI1Mjc1NjUyMDAzMDJFLTI5MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzA0IHBvd2VyIDQuNTk4ODY0NjA3NjIwMDUyMDYyOTA4NzAwOTI4NDU0MTgyICAtMjk5LjgzMjM2Njc2OTg5MzExMjU3MjAyMTg1Mzc0ODM3NTMgLT4gMi4wNjk2NDEyNjk4NTU0MTM1Mzk1NzkxMjgxMTQ0NDg0NzhFLTE5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzA1IHBvd2VyIDIuNTU2OTUyNjc2OTg2ODMwNjQ1NzA4MzQ5MjU0OTM4OTAzICAtNDI1LjE3NTUzNzMyNTE5NDEzODMxNDc5OTg5MjQ3MDM1OTMgLT4gNC40Mjg3OTk3Nzc4MzM1OTg2NTQyNjA4ODM4NjE1MTQ2MzhFLTE3NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzA2IHBvd2VyIDAuMDAwMDAwNTY1NjE5ODc2MzQwNDIyMTk4NjY0MDYxMDExOCAtMzIuODMzNjEzODA2NzgzMDEzMjEyMzAwMjg3MzAwNzUzMTUgLT4gMS4zNDAyNzA2MjI0MDE4MjkxNDU5Njg0Nzc2MDEwMjkyNTFFKzIwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzA3IHBvd2VyIDAxMi40ODQxOTc4NjQyNDUyOTYwNzUwODAxNDEwMzcyMTI1ICAtMjE0LjM3MzQyOTE4Mjg3MTI5NjI4MDk4NjY2NjMzMjE5MjEgLT4gOS4zMTk4NTc3NTExNzA2MDMxNDA0NTkwNTc1MzU5NzEyMDJFLTIzNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzA4IHBvd2VyIDAuMDAwMDAwMDA1NjA0MTU4NjE0ODA2NjkxOTE3NDMxNTU1MSAtMzcuMjExMjkwNDkyMTM4NTgzNDE1MjgwMzMzNDMxMTY1MzMgLT4gMS4xMTgzNDUwMTA2NTI0NTQzMTMxODY3MDIzNDE4NzMxNjlFKzMwNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzA5IHBvd2VyIDAuMDY5NDU2OTIxODk0MTgzMzc2NzE5OTk5ODgwNDIwMjE1MiAtOC42OTc1MDkwNzIzNjg5NzM5MzI1MDEyMzk4MTU2Nzc3MzIgLT4gMTE4NjI4NjY5OTUuNTEwMjY0ODkwMzI4MzgxNzQyOTAyNzEgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzEwIHBvd2VyIDYuMzgwOTg0MDI0MjU5NDUwMzk4NzI5MjQzNTIyMzU0MTQ0ICAtNDUxLjA2MzU2OTY4ODkxOTM1NjE0NTc5ODU0ODYzNjY4MjcgLT4gOC44MDAzNTMxMDkzODczMjI0NzQ4MDkzMjU2NzAzMTQzMzBFLTM2NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzExIHBvd2VyIDc4Ni4wMjY0ODQwNzU2ODA5MDQ4Mjg4MDA3MjA0OTE3ODAxICAtNDMuMDk5MzUzODQ2Nzg3NjI3NzMwNTczNDIxNjE3MTg1NDAgLT4gMS42MTYzMjQxODMzNjU2NDQxMzM5Nzk1ODU0MTk5MjU5MzRFLTEyNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzEyIHBvd2VyIDk2LjA3ODM2NDI3MTEzMjA0NzQ0MTAxMjg3OTQ4NDQ1MTMwICAtMTg1LjE0MTQ1NzI1NDYzMzAwMjQzODg5MTQ3MjAyNzE4NzYgLT4gOC41ODYzMjA4MTUyMTgzODMwMDQwMjMyNjQ5ODAwMTg2MTBFLTM2OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzEzIHBvd2VyIDAuMDAwMDAwMDAwMjMzMjE4OTc5Njg1NTg3MDY1OTc5MjQwNiAtNS43Nzk1NjE2MTMxNjQ2MjgwNzY4ODA2MDk4OTM3NTMzMjcgLT4gNC42Nzg0NTA3NzU4NzYzODU3OTM2MTg1NzA0ODMzNDUwNjZFKzU1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzE0IHBvd2VyIDAuNzI1NDE0NjY3MjAyNDYwMjI0MjM2OTk0MzIzNzk2ODg1NyAtMjExNS41MTI4OTEzOTc4Mjg2MTU3MTAxMzAwOTIyNDU2OTEgLT4gOC41MzkwODA5NTgwNDE2ODkyODgyMDIxMTE0MDMxMDI0OTVFKzI5NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzE1IHBvd2VyIDAuMDAxNzM4MDU0MzY0OTcwMjg2NDc5NjE0NDAwODU5MjEzNyAtNi4zMDc2NjgwMTc3NjEwMjI3ODgyMjA1Nzg2MzM1Mzg3MTMgLT4gMjU2MzA5MTQxNDU5MDc1NjUxLjIyNzU3OTgwMTc2OTUwMTcgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzE2IHBvd2VyIDA1LjI5NDk4NzU4OTUyMjc2OTA4MjY3NjQ5MTE2MTQyMzc5ICAtMjg3LjMyMzM4OTY3MzQxMDM0NDI5OTE5ODEwNTYxMzQxNjcgLT4gMS4wMzkxMzAwMjc4NDc0ODkzNjQwMDkzNjg2MDgxMDQyOTFFLTIwOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzE3IHBvd2VyIDE1LjY0NDAzNTkzODY1OTMyNjIyMDAzNDYyNzc5MTA0MTc4ICAtMTEwLjUyOTY2MzMzNTgwNjMyNjc0Nzg2MDkwMzIwMDI0NzUgLT4gOS43NTA1NDAyNzYwMjY1MjQ1MjczNzUxMjU5ODAyOTYxNDJFLTEzMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzE4IHBvd2VyIDg5LjY5NjM5MDA2NzYxNTcxMDg3NjM0OTQ1MDc3MzczNTA4ICAtMTgxLjMyMDk5MTQxMzkzNTc2NjU2MDkyNjgzMzk0MjI2MjcgLT4gOC4zMzUwMzQyMzIyNzc3NjI5MjQ1MzkzOTU2MzIwMjUyODFFLTM1NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzE5IHBvd2VyIDYuOTc0MDg3NDgzNzMxMDA2MzU5OTE0OTE0MTEwMTM1MDU4ICAtMTc0LjY4MTU2MjU3NDY3MTAzNDUxNzM2MTU1MDgxNzk4NDIgLT4gNC41NTMwNzIyNjUxMjIwMTExNzY2NDE1OTAxMDk1NjgwMzFFLTE0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzIwIHBvd2VyIDAuMDAzNDM5MzAyNDAxMDU1NDgyMTEzMDU1Mzc3MjY4MTk5MyAtOTMuNjA5MzE1OTg0MTM5MTkyNzI1OTU0OTcxMDA0OTczNjQgLT4gNC4wNjc0Njg4NTU4MTcxNDU1Mzk1ODk5ODgzNDk0NDkzOTRFKzIzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzIxIHBvd2VyIDYzLjMyODM0MDcyMzAwMzc5MTU1MDUzNzM3MjYwOTY1NjMzICAtMTY4LjM5MjY3OTk0MzUwODgzMjQ4MjU3NTE0NDY5NTc2MTYgLT4gNC4yMDc5MDc4MzU0NjI2NDA0NzE2MTc1MTk1MDE3NDEwOTRFLTMwNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzIyIHBvd2VyIDAwLjAwMjE2MDg4MTc0MjA2Mjc2MzY5MDExMjU1OTA3Nzg1ICAtNzAuMTIyNzk1NjI4NTU0NDI3ODQ3NTc4NzQ1MDg5OTEwMTMgLT4gOC4wMDA2NTcxNDMzNzgxODcwMjk2MDkzNDM0MzUwNjcwNTdFKzE4NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzIzIHBvd2VyIDkzNC41OTU3OTgyNzAzNTQ1ODkzNTcyMTM0MzkzMDA0Mzc1ICAtMTAyLjIyODc3MzU1NjU4NzgyNTI0ODQwMzE0MjYwMjY3MjYgLT4gMi4wNzM4MTM3NjkyMDkyNTc2MTcyNDY1NDQ0MjQ4MjcyNDBFLTMwNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzI0IHBvd2VyIDEwNy45MTE2NzkyNTU4NzkzOTIxODczOTk1ODg1NDQxMTc3ICAtNDQuMTE5NDEwOTIyNjA4Njk3ODYzMTM4MzgxODE0OTkxNTggLT4gMi4wMDU0NzY1MzM2MzExODMyNjg5MTI1NTIxNjg3NTk1OTVFLTkwICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzI1IHBvd2VyIDAuMDAwMDAwMDAwMDE4ODA0OTgyNzM4MTQyODE5MTc2OTI2MiAtMTkuMzIxMTg5MTcxOTIyNDIwMjc5NjY4NDc1MDE3MjQwNzMgLT4gMS43MTMxNzQyOTcxMDA5MTg4NTcwNTMzMzgyODYzODkwMzRFKzIwNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzI2IHBvd2VyIDYxNC45ODIwOTA3MzY2MjQ4MTQyMTY2NjM2MjU5MDI3NzI4ICAtNC4wNjk5MTMyNTcwMzA3OTE1ODY2NDUyNTAwMzU2OTgxMjMgLT4gNC40NjI0MzI1NzI1NzY5MzU3NTI3MTM4NzYyOTM3NDY3MTdFLTEyICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzI3IHBvd2VyIDc1Mi4wNjU1MTc1NzY5MTgyMDk2MTY1NjUxMjc0MDQ5NDIyICAtMjIuNTkyOTIwNjAzNDg3OTc0NzIwMTM1OTgzNzgzMzQzNzAgLT4gMS4wMzk4ODE1MjY2OTQ2MzUyMDUwNDAxOTI1MzE1MDQxMzFFLTY1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzI4IHBvd2VyIDcyLjIwNDQ2NjMyMDQ3NjU5NDQ5NjE2MTc1NDU2MDU5MDEzICAtMTc1LjQ3MDUzNTY0MDE4NTM5MjQwMjA4NDIzNTY2MDUwNzIgLT4gNy41Mjk1NDAxNzU3OTE1ODI0MjE5NjY5NDc4MTQ1NDkwMjhFLTMyNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzI5IHBvd2VyIDUxOC44MzQ2NDg2NjAwNDAzNDA1NzY0MDU1ODQ3OTM3NDE2ICAtNjUuODczMjAyNjg1OTI3NjE1ODg3NTY5NjMyMTU1ODgyMzIgLT4gMS40MjAxODk0MjY5OTIxNzA5MzY5NTg4OTExODAwNzMxNTFFLTE3OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzMwIHBvd2VyIDMuNDU3MTY0MzcyMDAzOTYwNTc2NDUzNDU4NTAyMjcwNzE2ICAtNDQwLjMyMDExMTgxNzc4NjEyNzM4MTQ1Mjk3MTM0NDM2OTggLT4gNi4xNzY0MTg1OTU3NTEyMDEyODcxODYyOTI2NjQyNTczNjlFLTIzOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzMxIHBvd2VyIDcuOTA4MzUyNzkzMzQ0MTg5NzIwNzM5NDY3Njc1NTAzOTkxICAtMjk4LjY2NDYxMTI4OTQ3MTk2ODAzOTQxNTI2NjQ3NDAyNTUgLT4gNS45MzU4NTcxMjAyMjkxNDc2MzgxMDQ2NzUwNTc2OTUxMjVFLTI2OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzMyIHBvd2VyIDAuMDAwMDAwNDI5NzM5OTQwMzc4ODU5NTAyNzkyNjA3NTA4NiAtMjIuNjY1MDQ2MTcxODUwNzEyOTM1ODg4MTc1MDE0NjgzMzkgLT4gMi4wMTIyNzA0MDU1MjA2MDA4MjA0Njk2NjUxNDU2MzYyMDRFKzE0NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzMzIHBvd2VyIDAuMDAwMDAwODU5MjEyNDA5NzMyMjk2NjM1NDg2ODcxNjQ0MyAtOS45MTMxMDk1ODY1NTgwMzAyMDQ3ODk1MjAxOTAxODA5MDYgLT4gMS4zNTQ5NTg3NjM4NDMzMTAyMzcwNDY4MTg4MzI3NTUyMTVFKzYwICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzM0IHBvd2VyIDE2MS40ODA2MDgwNTYxMjU4MTA1ODgwOTA3NDcwOTg5OTI1ICAtNzAuNzI5MDc4Mzc0MzQ4MTQyNjE3MTYzMTE5OTAyNzE1NzggLT4gNi42MzI1NTUwMDM2OTg5NDU1NDQ5NDEzMjk4NzI5MDE5MjlFLTE1NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzM1IHBvd2VyIDAuMDAwMDAwMDA5MDY2OTU2ODYyNDE3MzgzMjcwNTYzMTkxOCAtMzYuNTM3NTk2MjQ2MTM2NjU5NDAxMjcwNTg0MzkxMDY2NDAgLT4gNy4xNjE4MDg0MDEwMjM0MTQ3MzU0MjgxMzAxMTI5NDE1NTlFKzI5MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzM2IHBvd2VyIDAuMDAwMDAwMDAwMDAyOTQ0MDI5NTk3ODM2NTcwOTM0Mjc1MiAtMS4yOTczNTQyMzg3Mzg5MjE5ODg4ODQ0MjExMTc3MzE1NjIgLT4gOTExNzMxMDYwNTc5MjkxLjc2NjEyNjczNTg4NzI5MTczODAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzM3IHBvd2VyIDIxLjM3NDc3MjIwMTQ0ODMyMTcyMTc1NDYwNDI1MTQzNjkyICAtNzYuOTU5NDk5MzM2NDA1MzkyMjY0NzU2ODY5OTc0Nzc4ODkgLT4gNC40ODE3NDEyNDI0MTgwOTE5MTQwMTE5NjIzOTk5MTI4ODVFLTEwMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzM4IHBvd2VyIDAuMDAwMDAwMDAwMDE4NjY1Nzc5ODIwMTYzNjM0MjE1MDkwMyAtMjAuMTgyOTYyNDAzNTA2NzgyNDU1NjcwNDkxNjE3MzA5MDkgLT4gMy40ODM5NTQwMDcxMTQ5MDA0MDY5MDYzMzg1MjY1NzU2NzJFKzIxNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzM5IHBvd2VyIDAuMDAwNjUyMjQ2NDc5Mjk2MDE5MTk4NTk5Njk1OTEyNjc5MiAtODAuMDM3NjI0OTE0ODM1MTQ2Nzk4ODY1MDQwOTkxOTQ0MTQgLT4gOS4yNjY1NDg1MTM2MTQyMTU1NTcyMjg0Njc1MTcwNTMwMzVFKzI1NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNzQwIHBvd2VyIDAuMDAwMDAwMDAzMjg1MTM0MzY5NDIwMDU2ODk2NjE2ODA1NSAtMjEuNTM0NjIxMTY5MjYzNzU1MTIyNDI0MDMxNjAwMDgwMjYgLT4gNC44NzMyMDE2Nzk2Njg0NTUyNDA4NjEzNzYyMTM2MDExODlFKzE4MiBJbmV4YWN0IFJvdW5kZWQKKworLS0gUD0xNiwgd2l0aGluIDAtOTkgLS0gbmVnYXRpdmUgYXJnMgorUHJlY2lzaW9uOiAxNgorcG93eDM2MDEgcG93ZXIgMC4wMDAwMTUxMzM4NzQ4NDc0IC00MC44NDY1NTYxODM2NDY4OCAtPiA3LjYyODQ3MDgyNDEzNzc1NUUrMTk2IEluZXhhY3QgUm91bmRlZAorcG93eDM2MDIgcG93ZXIgMC4xNTQyNzcxODQ4NjU0ODYyIC00MzUuODgzMDAwOTQ2NjgwMCAtPiA2LjM4OTgxNzE3NzgwMDc0NEUrMzUzIEluZXhhY3QgUm91bmRlZAorcG93eDM2MDMgcG93ZXIgNDguMjg0Nzc3NDkzNjczNjQgIC0yMTguNTkyOTIwOTkwMjA1MCAtPiA4LjUzMTA0OTUzMjU3NjE1NEUtMzY5IEluZXhhY3QgUm91bmRlZAorcG93eDM2MDQgcG93ZXIgNy45NjA3NzU4OTE1ODQ5MTEgIC0xMi43ODExMzczMjE4MjUwNSAtPiAzLjA1MzI3MDg4OTc2OTQ4OEUtMTIgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MDUgcG93ZXIgMC45NDMwMzQwNjUxODYzMDU4IC05MDEwLjQ3MDA1NjkxMzc0OCAtPiAzLjMxMzM3NDY1NDkyMzgwN0UrMjI5IEluZXhhY3QgUm91bmRlZAorcG93eDM2MDYgcG93ZXIgMC4wMDAwMjAyNjYxNTAxNjAyIC02NS41NzkxNTIwNzM4MzMwNiAtPiA1Ljk5NzM3OTE3NjUzNjQ2NEUrMzA3IEluZXhhY3QgUm91bmRlZAorcG93eDM2MDcgcG93ZXIgMDQuMzMwMDc0NDA3OTgzOTAgIC0yMzIuMDQ3NjgzNDY2NjU4OCAtPiAyLjAwNzgyNzE4MzAxMDQ1NkUtMTQ4IEluZXhhY3QgUm91bmRlZAorcG93eDM2MDggcG93ZXIgMC4wMDAwMTQxOTQ0NjQzOTE0IC0xMS4zMjQwNzkyMTk1ODcxNyAtPiA3LjkwMjkzNDQ4NTA3NDg0NkUrNTQgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MDkgcG93ZXIgMC4wMDAwMDIxOTc3NzU4MjYxIC01My41MzcwNjEzODI1MzMwNyAtPiA4LjE5NTYzMTc3MjMxNzgxNUUrMzAyIEluZXhhY3QgUm91bmRlZAorcG93eDM2MTAgcG93ZXIgMzkuNTEyOTc2NTU0NzQxODggIC0xOS40MDM3MDk3NjAxMjMyNiAtPiAxLjA0MDY5OTYwODA3MjY1OUUtMzEgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MTEgcG93ZXIgMzguNzEyMTAyMzI0ODg3NzUgIC02Ni41ODM0MTYxODIyNzkyMSAtPiAxLjg4Njg1NTA2NjE0NjQ5NUUtMTA2IEluZXhhY3QgUm91bmRlZAorcG93eDM2MTIgcG93ZXIgMC4wMDAwODA0MjM1MjI5MDYyIC02LjcxNTIwNzk0ODk5Mjg1OSAtPiAzLjEzNDc1Nzg2NDM4OTMzM0UrMjcgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MTMgcG93ZXIgMC4wMDAwMDczNTQ3MDkyMzk5IC0xMS4yNzcyNTY4NTcxOTkzNCAtPiA3Ljc4MTQyODM5MDk1MzY5NUUrNTcgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MTQgcG93ZXIgNTIuNzIxODEyNzI1OTkzMTYgIC0xODYuMTQyMjMxMTYwNzQzNSAtPiAyLjkxNjYwMTk5ODc0NDE3N0UtMzIxIEluZXhhY3QgUm91bmRlZAorcG93eDM2MTUgcG93ZXIgMC4wOTY5NTE5OTYzMDgzMzA2IC0yODAuODIyMDg2MjE1MTM2OSAtPiAzLjk1NTkwNjg4NTk3MDk4N0UrMjg0IEluZXhhY3QgUm91bmRlZAorcG93eDM2MTYgcG93ZXIgOTQuMDcyNjMzMDIxNTAwODEgIC0xNDguMjAzMTE0NjA3MTIzMCAtPiAzLjM2MTk1ODk5MDc1MjQ5MEUtMjkzIEluZXhhY3QgUm91bmRlZAorcG93eDM2MTcgcG93ZXIgODUuODAyODY5NjUwNTM3MDQgIC05MC4yMTQ1MzY5NTgxMzc1OSAtPiAzLjcxNTYwMjQyOTY0NTc5OEUtMTc1IEluZXhhY3QgUm91bmRlZAorcG93eDM2MTggcG93ZXIgMDMuNTI2OTk4NTgxNTIyNTkgIC00OTIuMDQxNDM2MjUzOTE5NiAtPiA0LjUwNzMwOTIyMDA4MTA5MkUtMjcwIEluZXhhY3QgUm91bmRlZAorcG93eDM2MTkgcG93ZXIgMC4wNTA4Mjc4MDg2Mzk2MDY4IC0xODEuMDg3MTczMTU3MjE2NyAtPiAyLjAzNDQyODAxMzAxNzk0OUUrMjM0IEluZXhhY3QgUm91bmRlZAorcG93eDM2MjAgcG93ZXIgMC4zOTU1NzY3NDAzMDMxNzIgIC05MTUuNTUyNDUwNzQzMjM5MiAtPiA1LjcwNjU4NTE4NzQzNzU3OEUrMzY4IEluZXhhY3QgUm91bmRlZAorcG93eDM2MjEgcG93ZXIgMzguMDYxMDU4MjY3ODkyMDIgIC00OS43NTkxMzc1MzQzNTMzNSAtPiAyLjI3MzE4ODk5MTQzMTczOEUtNzkgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MjIgcG93ZXIgMC4wMDAzNjU2NzQ4OTEwNjQ2IC03My4yODk4ODQ5MTMxMDM1NCAtPiA3Ljc2ODkzNjk0MDU2ODc2M0UrMjUxIEluZXhhY3QgUm91bmRlZAorcG93eDM2MjMgcG93ZXIgMC4wMDAwMDA2MzczNTUxODA5IC01MS4zMDgyNTIzNDIwMDY5MCAtPiA3LjY5NzYxODE2NzcwMTk4NUUrMzE3IEluZXhhY3QgUm91bmRlZAorcG93eDM2MjQgcG93ZXIgODIuNDE3Mjk5MjA2NzM4NTYgIC0zNS43MzMxOTYzMTYyNTY5OSAtPiAzLjQyNDA0MjM1NDU4NTUyOUUtNjkgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MjUgcG93ZXIgMC43ODQ1ODIxNDUzMTI3NjcwIC05NzEuNDk4MjAyODg5NzY2MyAtPiAyLjI4MzQxNTUyNzY2MTA4OUUrMTAyIEluZXhhY3QgUm91bmRlZAorcG93eDM2MjYgcG93ZXIgNC44NDA5ODM2NzM0MzM0OTcgIC0xODIuMzczMDQ1MjM3MDUxNSAtPiAxLjIyMDU5MTQwNzkyNzc3MEUtMTI1IEluZXhhY3QgUm91bmRlZAorcG93eDM2MjcgcG93ZXIgMC4wMDAwMDA2MTM3NTkyMTM5IC0yLjEyMjEzOTQ3NDQzMTQ4NCAtPiAxNTIzMTIxNzAzNDgzOS4yOSAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MjggcG93ZXIgMC4wMDAzNjU3OTYyODYyOTg0IC0zNS45Nzk5Mzc4MjQ0ODA5OSAtPiA0LjUxMjcwMTMxOTI1MDgzOUUrMTIzIEluZXhhY3QgUm91bmRlZAorcG93eDM2MjkgcG93ZXIgNDAuOTM2OTMwMDQ0NDMxNTAgIC0xNjUuMTM2MjQwODc5Mjk5NyAtPiA2LjA0NDI3NjQxMTA1NzIzOUUtMjY3IEluZXhhY3QgUm91bmRlZAorcG93eDM2MzAgcG93ZXIgMC4yOTQxNTUyNTgzMDI4ODk4IC0xNy40MTA0NjI2NDk0NTg5MiAtPiAxNzg3ODMzMTAzLjUwMzM0NiAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MzEgcG93ZXIgNjMuOTkzMzUxMzUzNjk5NzcgIC02OS45MjQxNzIwNTE2ODU3OSAtPiA1LjA5OTM1OTgwNDg3MjUwOUUtMTI3IEluZXhhY3QgUm91bmRlZAorcG93eDM2MzIgcG93ZXIgMC4wMDAwNjU3OTI0NDY3Mzg4IC04OS4xNDQ5NzI5MzU4ODMxMyAtPiA2LjE0NTg3ODI2NjY4ODUyMUUrMzcyIEluZXhhY3QgUm91bmRlZAorcG93eDM2MzMgcG93ZXIgMTEuMzUwNzEyNTAzMzkxNDcgIC0zMjMuMzcwNTg2NTYxNDU0MiAtPiA2Ljg2MzYyNjI0ODc2Njc3NUUtMzQyIEluZXhhY3QgUm91bmRlZAorcG93eDM2MzQgcG93ZXIgMjMuODgwMjQ3MTg0NzA4OTUgIC0yNzcuNzExNzUxMzMyOTUxMCAtPiAyLjAwNjQ0MTQyMjYxMjgxNUUtMzgzIEluZXhhY3QgUm91bmRlZAorcG93eDM2MzUgcG93ZXIgMC4wMDAwMDA5MTExOTM5OTE0IC01OC41MTc4Mjk0NjkyOTE4MiAtPiAyLjk1NDM1Mjg4Mzk5Njc3M0UrMzUzIEluZXhhY3QgUm91bmRlZAorcG93eDM2MzYgcG93ZXIgMC4wMDAwODc4MTc5MDQ4NzgyIC03NS44MTA2MDQyMDIzODY2OSAtPiAzLjMwNjg3ODQ1NTIwNzU4NUUrMzA3IEluZXhhY3QgUm91bmRlZAorcG93eDM2MzcgcG93ZXIgMDcuMzkxOTA1NjQyNzM3NzkgIC0yODcuNTA0NzMwNzI0NDYzNiAtPiAxLjY5MjA4MDM1NDY1OTgwNUUtMjUwIEluZXhhY3QgUm91bmRlZAorcG93eDM2MzggcG93ZXIgMC4wMDAwMjk4MzEwODE5Nzk5IC0xLjg0NDc0MDM3Nzc1OTM1NSAtPiAyMjI4NzQ3MTguNzIzODg4OCAgICAgIEluZXhhY3QgUm91bmRlZAorcG93eDM2MzkgcG93ZXIgMC4wMDAwMDA2NDEyOTI5Mzg0IC0yOC4yNDg1MDA3ODIyOTI5MCAtPiA4LjczNzE2NDIzMDY2NjUyOUUrMTc0IEluZXhhY3QgUm91bmRlZAorcG93eDM2NDAgcG93ZXIgMC4wMDAwMDEwMjAyOTY1OTk4IC00Ny4xNzU3MzcwMTk1NjQ5OCAtPiA0LjM5Mjg0NTMwNjA0OTM0MUUrMjgyIEluZXhhY3QgUm91bmRlZAorCistLSBQPTcsIHdpdGhpbiAwLTkgLS0gbmVnYXRpdmUgYXJnMgorUHJlY2lzaW9uOiA3Citwb3d4MzUwMSBwb3dlciAwLjMyNjMyNCAgLTcxLjk2NTA5ICAtPiAxLjAwMDY3M0UrMzUgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MDIgcG93ZXIgMC4wMDE3NjM1IC0wLjcxODY5NjcgLT4gOTUuMjg0MTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTAzIHBvd2VyIDguNTY0MTU1ICAtMjUzLjA4OTkgIC0+IDguODUwNTEyRS0yMzcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUwNCBwb3dlciA4Ljk4NzI3MiAgLTIuMTU1Nzg5ICAtPiAwLjAwODc5Mzg1OSAgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MDUgcG93ZXIgOS42MDQ4NTYgIC0xMzkuOTYzMCAgLT4gMy4wNzM0OTJFLTEzOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTA2IHBvd2VyIDAuODQ3MjkxOSAtMjUzOS4wODUgIC0+IDUuMzcyNjg2RSsxODIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUwNyBwb3dlciA1LjMxMjMyOSAgLTYwLjMyOTY1ICAtPiAxLjc1MzEyMUUtNDQgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MDggcG93ZXIgMC4wMzM4Mjk0IC0xMDAuNTQ0MCAgLT4gNy40MjM5MzlFKzE0NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTA5IHBvd2VyIDAuMDAxNzc3NyAtMTMwLjg1ODMgIC0+IDcuNTY1NjI5RSszNTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUxMCBwb3dlciA4LjAxNjE1NCAgLTQwNS41Njg5ICAtPiAyLjM5NTk3N0UtMzY3IEluZXhhY3QgUm91bmRlZAorcG93eDM1MTEgcG93ZXIgNS4wMTY1NzAgIC0zMjcuODkwNiAgLT4gMi4yMDM3ODRFLTIzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTEyIHBvd2VyIDAuODE2MTc0MyAtNzQ0LjUyNzYgIC0+IDQuNzg2ODk5RSs2NSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUxMyBwb3dlciAwLjA2NjYzNDMgLTE2NC43MzIwICAtPiA1Ljk1MTI0MEUrMTkzIEluZXhhY3QgUm91bmRlZAorcG93eDM1MTQgcG93ZXIgMC4wODAzOTY2IC0yMDIuMjY2NiAgLT4gMi43MTU1MTJFKzIyMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTE1IHBvd2VyIDAuMDAxNDc1MiAtMTIuNTU1NDcgIC0+IDMuNTE4OTA1RSszNSAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUxNiBwb3dlciA5LjczNzU2NSAgLTE0LjY5NjE1ICAtPiAyLjk3NTY3MkUtMTUgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MTcgcG93ZXIgMC42NjM0MTcyIC0xNTIuNzMwOCAgLT4gMS42NTQ0NThFKzI3ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTE4IHBvd2VyIDAuMDAwOTMzNyAtMzMuMzI5MzkgIC0+IDkuNTc1MDM5RSsxMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUxOSBwb3dlciA4LjY3OTkyMiAgLTIyNC40MTk0ICAtPiAyLjM5MjQ0NkUtMjExIEluZXhhY3QgUm91bmRlZAorcG93eDM1MjAgcG93ZXIgNy4zOTA0OTQgIC0xNjEuOTQ4MyAgLT4gMi4wODgzNzVFLTE0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTIxIHBvd2VyIDAuNDYzMTQ4OSAtNDE3LjE2NzMgIC0+IDIuODIxMTA2RSsxMzkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUyMiBwb3dlciAwLjAwOTU0NzEgLTcuNjc3NDU4ICAtPiAzLjIzMTg1NUUrMTUgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MjMgcG93ZXIgNi41NjYzMzkgIC0xNzYuMTg2NyAgLT4gOS45NjU2MzNFLTE0NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTI0IHBvd2VyIDIuNjk2MTI4ICAtMjYuMTU1MDEgIC0+IDUuNDE5NzMxRS0xMiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUyNSBwb3dlciAwLjQ0NjQzNjYgLTg1Mi4xODkzICAtPiAyLjk1NzcyNUUrMjk4IEluZXhhY3QgUm91bmRlZAorcG93eDM1MjYgcG93ZXIgMC40NzcyMDA2IC05MjEuNDExMSAgLT4gMS4xMTgxMDVFKzI5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTI3IHBvd2VyIDguOTIzNjk2ICAtMzU5LjIyMTEgIC0+IDMuNTAxNTczRS0zNDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUyOCBwb3dlciAwLjAwMTgwMDggLTY2LjkxMjUyICAtPiA0LjQwMjcxOEUrMTgzIEluZXhhY3QgUm91bmRlZAorcG93eDM1MjkgcG93ZXIgMC4wODExOTY0IC05Mi44MzI3OCAgLT4gMS43MDExMTFFKzEwMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTMwIHBvd2VyIDAuMDcxMTIxOSAtNTguOTQzNDcgIC0+IDQuNjQ0MTQ4RSs2NyAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUzMSBwb3dlciA3Ljk1ODEyMSAgLTUwLjY2MTIzICAtPiAyLjMxMTE2MUUtNDYgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MzIgcG93ZXIgNi4xMDY0NjYgIC04MS44MzYxMCAgLT4gNC45NDMyODVFLTY1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTMzIHBvd2VyIDQuNTU3NjM0ICAtMTI5LjUyNjggIC0+IDQuNzM3OTE3RS04NiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUzNCBwb3dlciAwLjAwMjczNDggLTkuMTgwMTM1ICAtPiAzLjM4MzUyNEUrMjMgIEluZXhhY3QgUm91bmRlZAorcG93eDM1MzUgcG93ZXIgMC4wMDgzOTI0IC00Ni4yNDAxNiAgLT4gOS45OTYyMTJFKzk1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTM2IHBvd2VyIDIuMTM4NTIzICAtNDcuMjU4OTcgIC0+IDIuNTA3MDA5RS0xNiAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUzNyBwb3dlciAxLjYyNjcyOCAgLTE1NzMuODMwICAtPiAyLjY2ODExN0UtMzMzIEluZXhhY3QgUm91bmRlZAorcG93eDM1MzggcG93ZXIgMC4wODI2MTUgIC0xNjQuNTg0MiAgLT4gMS43MTc4ODJFKzE3OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNTM5IHBvd2VyIDcuNjM2MDAzICAtMzYzLjY3NjMgIC0+IDguMzY2MTc0RS0zMjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzU0MCBwb3dlciAwLjAwMjE0ODEgLTEzOC4wMDY1ICAtPiAxLjU2MjUwNUUrMzY4IEluZXhhY3QgUm91bmRlZAorCisKKy0tIEludmFsaWQgb3BlcmF0aW9ucyBkdWUgdG8gcmVzdHJpY3Rpb25zCistLSBbbmV4dCB0d28gcHJvYmFibHkgc2tpcHBlZCBieSBtb3N0IHRlc3QgaGFybmVzc2VzXQorcHJlY2lzaW9uOiAxMDAwMDAwMDAKK3Bvd3g0MDAxICBwb3dlciAxIDEuMSAtPiAgTmFOICAgICAgICAgSW52YWxpZF9jb250ZXh0CitwcmVjaXNpb246ICA5OTk5OTk5OQorcG93eDQwMDIgIHBvd2VyIDEgMS4xIC0+ICBOYU4gICAgICAgICBJbnZhbGlkX2NvbnRleHQKKworcHJlY2lzaW9uOiA5CittYXhFeHBvbmVudDogICAxMDAwMDAwCittaW5FeHBvbmVudDogICAtOTk5OTk5Citwb3d4NDAwMyAgcG93ZXIgMSAxLjEgIC0+ICBOYU4gICAgICAgIEludmFsaWRfY29udGV4dAorbWF4RXhwb25lbnQ6ICAgIDk5OTk5OQorbWluRXhwb25lbnQ6ICAgLTk5OTk5OQorcG93eDQwMDQgIHBvd2VyIDEgMS4xICAtPiAgMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK21heEV4cG9uZW50OiAgICA5OTk5OTkKK21pbkV4cG9uZW50OiAgLTEwMDAwMDAKK3Bvd3g0MDA1ICBwb3dlciAxIDEuMSAgLT4gIE5hTiAgICAgICAgSW52YWxpZF9jb250ZXh0CittYXhFeHBvbmVudDogICAgOTk5OTk5CittaW5FeHBvbmVudDogICAtOTk5OTk4Citwb3d4NDAwNiAgcG93ZXIgMSAxLjEgIC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBvcGVyYW5kIHJhbmdlIHZpb2xhdGlvbnMKK3Bvd3g0MDA3ICBwb3dlciAxICAgICAgICAgICAgIDEuMUUrOTk5OTk5ICAtPiAgMQorcG93eDQwMDggIHBvd2VyIDEgICAgICAgICAgICAgMS4xRSsxMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g0MDA5ICBwb3dlciAxLjFFKzk5OTk5OSAgIDEuMSAgICAgICAgICAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwb3d4NDAxMCAgcG93ZXIgMS4xRSsxMDAwMDAwICAxLjEgICAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcG93eDQwMTEgIHBvd2VyIDEgICAgICAgICAgICAgMS4xRS0xOTk5OTk3IC0+ICAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcG93eDQwMTIgIHBvd2VyIDEgICAgICAgICAgICAgMS4xRS0xOTk5OTk4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Bvd3g0MDEzICBwb3dlciAxLjFFLTE5OTk5OTcgIDEuMSAgICAgICAgICAtPiAgMEUtMTAwMDAwNiBVbmRlcmZsb3cgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQgU3Vibm9ybWFsCitwb3d4NDAxNCAgcG93ZXIgMS4xRS0xOTk5OTk4ICAxLjEgICAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSByb3VuZGluZyBtb2RlcyAtLSBwb3dlciBpcyBzZW5zaXRpdmUKK3ByZWNpc2lvbjogICA3CittYXhFeHBvbmVudDogOTkKK21pbkV4cG9uZW50OiAtOTkKKworLS0gICAwLjcgICoqIDMuMyA9PiAgIDAuMzA4MTkzNTQwNTM0MTg5NDM4MjIKKy0tICAgMC43ICAqKiAzLjQgPT4gICAwLjI5NzM5NDc3NjM4MjcyNTMzODU0CistLSAgLTEuMiAgKiogMTcgID0+IC0yMi4xODYxMTEwNjc0MDQzNjk5MgorLS0gIC0xLjMgICoqIDE3ICA9PiAtODYuNTA0MTU5MTkzODEzMzc5MzMKKy0tICAgMC41ICAqKiAxMSAgPT4gICAwLjAwMDQ4ODI4MTI1CistLSAgIDMuMTUgKiogMyAgID0+ICAzMS4yNTU4NzUKKworcm91bmRpbmc6IHVwCitwb3d4NDEwMCAgcG93ZXIgICAgICAwLjcgIDMuMyAtPiAgMC4zMDgxOTM2IEluZXhhY3QgUm91bmRlZAorcG93eDQxMDEgIHBvd2VyICAgICAgMC43ICAzLjQgLT4gIDAuMjk3Mzk0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTAyICBwb3dlciAgICAgLTEuMiAgMTcgIC0+IC0yMi4xODYxMiAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDEwMyAgcG93ZXIgICAgIC0xLjMgIDE3ICAtPiAtODYuNTA0MTYgIEluZXhhY3QgUm91bmRlZAorcG93eDQxMDQgIHBvd2VyICAxNyA4MS4yNzExNSAgLT4gOS45OTk5NzRFKzk5IEluZXhhY3QgUm91bmRlZAorcG93eDQxMDUgIHBvd2VyICAxNyA4MS4yNzExNiAgLT4gSW5maW5pdHkgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorcG93eDQxMjAgIHBvd2VyICAgICAgMC43ICAzLjMgLT4gIDAuMzA4MTkzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTIxICBwb3dlciAgICAgIDAuNyAgMy40IC0+ICAwLjI5NzM5NDcgSW5leGFjdCBSb3VuZGVkCitwb3d4NDEyMiAgcG93ZXIgICAgIC0xLjIgIDE3ICAtPiAtMjIuMTg2MTEgIEluZXhhY3QgUm91bmRlZAorcG93eDQxMjMgIHBvd2VyICAgICAtMS4zICAxNyAgLT4gLTg2LjUwNDE1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTI0ICBwb3dlciAgMTcgODEuMjcxMTUgIC0+IDkuOTk5OTczRSs5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTI1ICBwb3dlciAgMTcgODEuMjcxMTYgIC0+IDkuOTk5OTk5RSs5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGZsb29yCitwb3d4NDE0MCAgcG93ZXIgICAgICAwLjcgIDMuMyAtPiAgMC4zMDgxOTM1IEluZXhhY3QgUm91bmRlZAorcG93eDQxNDEgIHBvd2VyICAgICAgMC43ICAzLjQgLT4gIDAuMjk3Mzk0NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTQyICBwb3dlciAgICAgLTEuMiAgMTcgIC0+IC0yMi4xODYxMiAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE0MyAgcG93ZXIgICAgIC0xLjMgIDE3ICAtPiAtODYuNTA0MTYgIEluZXhhY3QgUm91bmRlZAorcG93eDQxNDQgIHBvd2VyICAxNyA4MS4yNzExNSAgLT4gOS45OTk5NzNFKzk5IEluZXhhY3QgUm91bmRlZAorcG93eDQxNDUgIHBvd2VyICAxNyA4MS4yNzExNiAgLT4gOS45OTk5OTlFKzk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworcG93eDQxNjAgIHBvd2VyICAgICAgMC43ICAzLjMgLT4gIDAuMzA4MTkzNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTYxICBwb3dlciAgICAgIDAuNyAgMy40IC0+ICAwLjI5NzM5NDggSW5leGFjdCBSb3VuZGVkCitwb3d4NDE2MiAgcG93ZXIgICAgIC0xLjIgIDE3ICAtPiAtMjIuMTg2MTEgIEluZXhhY3QgUm91bmRlZAorcG93eDQxNjMgIHBvd2VyICAgICAtMS4zICAxNyAgLT4gLTg2LjUwNDE1ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTY0ICBwb3dlciAgMTcgODEuMjcxMTUgIC0+IDkuOTk5OTc0RSs5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTY1ICBwb3dlciAgMTcgODEuMjcxMTYgIC0+IEluZmluaXR5ICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK3Bvd3g0MTgwICBwb3dlciAgICAgIDAuNyAgMy4zIC0+ICAwLjMwODE5MzUgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE4MSAgcG93ZXIgICAgICAwLjcgIDMuNCAtPiAgMC4yOTczOTQ4IEluZXhhY3QgUm91bmRlZAorcG93eDQxODIgIHBvd2VyICAgICAtMS4yICAxNyAgLT4gLTIyLjE4NjExICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTgzICBwb3dlciAgICAgLTEuMyAgMTcgIC0+IC04Ni41MDQxNiAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDE4NCAgcG93ZXIgICAgICAwLjUgIDExICAtPiAgMC4wMDA0ODgyODEzIEluZXhhY3QgUm91bmRlZAorcG93eDQxODUgIHBvd2VyICAgICAgMy4xNSAgMyAgLT4gIDMxLjI1NTg4ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTg2ICBwb3dlciAgMTcgODEuMjcxMTUgIC0+IDkuOTk5OTc0RSs5OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MTg3ICBwb3dlciAgMTcgODEuMjcxMTYgIC0+IEluZmluaXR5ICAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorcG93eDQyMDAgIHBvd2VyICAgICAgMC43ICAzLjMgLT4gIDAuMzA4MTkzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjAxICBwb3dlciAgICAgIDAuNyAgMy40IC0+ICAwLjI5NzM5NDggSW5leGFjdCBSb3VuZGVkCitwb3d4NDIwMiAgcG93ZXIgICAgIC0xLjIgIDE3ICAtPiAtMjIuMTg2MTEgIEluZXhhY3QgUm91bmRlZAorcG93eDQyMDMgIHBvd2VyICAgICAtMS4zICAxNyAgLT4gLTg2LjUwNDE2ICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjA0ICBwb3dlciAgICAgIDAuNSAgMTEgIC0+ICAwLjAwMDQ4ODI4MTIgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIwNSAgcG93ZXIgICAgICAzLjE1ICAzICAtPiAgMzEuMjU1ODggIEluZXhhY3QgUm91bmRlZAorcG93eDQyMDYgIHBvd2VyICAxNyA4MS4yNzExNSAgLT4gOS45OTk5NzRFKzk5IEluZXhhY3QgUm91bmRlZAorcG93eDQyMDcgIHBvd2VyICAxNyA4MS4yNzExNiAgLT4gSW5maW5pdHkgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9kb3duCitwb3d4NDIyMCAgcG93ZXIgICAgICAwLjcgIDMuMyAtPiAgMC4zMDgxOTM1IEluZXhhY3QgUm91bmRlZAorcG93eDQyMjEgIHBvd2VyICAgICAgMC43ICAzLjQgLT4gIDAuMjk3Mzk0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjIyICBwb3dlciAgICAgLTEuMiAgMTcgIC0+IC0yMi4xODYxMSAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIyMyAgcG93ZXIgICAgIC0xLjMgIDE3ICAtPiAtODYuNTA0MTYgIEluZXhhY3QgUm91bmRlZAorcG93eDQyMjQgIHBvd2VyICAgICAgMC41ICAxMSAgLT4gIDAuMDAwNDg4MjgxMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MjI1ICBwb3dlciAgICAgIDMuMTUgIDMgIC0+ICAzMS4yNTU4NyAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDIyNiAgcG93ZXIgICAgIC0zLjE1ICAzICAtPiAtMzEuMjU1ODcgIEluZXhhY3QgUm91bmRlZAorcG93eDQyMjcgIHBvd2VyICAxNyA4MS4yNzExNSAgLT4gOS45OTk5NzRFKzk5IEluZXhhY3QgUm91bmRlZAorcG93eDQyMjggIHBvd2VyICAxNyA4MS4yNzExNiAgLT4gSW5maW5pdHkgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCisKKy0tIG1vcmUgcm91bmRpbmcgdGVzdHMgYXMgcGVyIElsYW4gTmVoYW1hJ3Mgc3VnZ2VzdGlvbnMgJiBhbmFseXNpcworLS0gdGhlc2UgYXJlIGxpa2VseSB0byBzaG93ID4gMC41IHVscCBlcnJvciBmb3IgdmVyeSBzbWFsbCBwb3dlcnMKK3ByZWNpc2lvbjogICA3CittYXhFeHBvbmVudDogOTYKK21pbkV4cG9uZW50OiAtOTUKKworLS0gRm9yIHg9bmV4dGZwKDEpPTEuMDAuLjAwMSAod2hlcmUgdGhlIG51bWJlciBvZiAwcyBpcyBwcmVjaXNpb24tMikKKy0tICAgcG93ZXIoeCx5KT14IHdoZW4gdGhlIHJvdW5kaW5nIGlzIHVwIChlLmcuLCB0b3dhcmRfcG9zX2luZiBvcgorLS0gICBjZWlsKSBmb3IgYW55IHkgaW4gKDAsMV0uCityb3VuZGluZzogY2VpbGluZworcG93eDQzMDEgIHBvd2VyICAxLjAwMDAwMSAwICAgICAgICAgIC0+IDEKKy0tIFRoZSBuZXh0IHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQgZm9yIGRlY051bWJlcgorcG93eDQzMDIgIHBvd2VyICAxLjAwMDAwMSAxZS0xMDEgICAgIC0+IDEuMDAwMDAxICAgSW5leGFjdCBSb3VuZGVkCistLSBUaGUgbmV4dCB0ZXN0IHNob3VsZCBiZSBza2lwcGVkIGZvciBkZWNOdW1iZXIKK3Bvd3g0MzAzICBwb3dlciAgMS4wMDAwMDEgMWUtOTUgICAgICAtPiAxLjAwMDAwMSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMDQgIHBvd2VyICAxLjAwMDAwMSAxZS0xMCAgICAgIC0+IDEuMDAwMDAxICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMwNSAgcG93ZXIgIDEuMDAwMDAxIDAuMSAgICAgICAgLT4gMS4wMDAwMDEgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzA2ICBwb3dlciAgMS4wMDAwMDEgMC4xMjM0NTY3ICAtPiAxLjAwMDAwMSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMDcgIHBvd2VyICAxLjAwMDAwMSAwLjcgICAgICAgIC0+IDEuMDAwMDAxICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMwOCAgcG93ZXIgIDEuMDAwMDAxIDAuOTk5OTk5OSAgLT4gMS4wMDAwMDEgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzA5ICBwb3dlciAgMS4wMDAwMDEgMS4wMDAwMDAgICAtPiAxLjAwMDAwMQorLS0gICBwb3dlcih4LHkpPTEgd2hlbiB0aGUgcm91bmRpbmcgaXMgZG93biAoZS5nLiB0b3dhcmRfemVybyBvcgorLS0gICBmbG9vcikgZm9yIGFueSB5IGluIFswLDEpLgorcm91bmRpbmc6IGZsb29yCitwb3d4NDMyMSAgcG93ZXIgIDEuMDAwMDAxIDAgICAgICAgICAgLT4gMQorcG93eDQzMjIgIHBvd2VyICAxLjAwMDAwMSAxZS0xMDEgICAgIC0+IDEuMDAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMyMyAgcG93ZXIgIDEuMDAwMDAxIDFlLTk1ICAgICAgLT4gMS4wMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzI0ICBwb3dlciAgMS4wMDAwMDEgMWUtMTAgICAgICAtPiAxLjAwMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMjUgIHBvd2VyICAxLjAwMDAwMSAwLjEgICAgICAgIC0+IDEuMDAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMyNiAgcG93ZXIgIDEuMDAwMDAxIDAuMTIzNDU2NyAgLT4gMS4wMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzI3ICBwb3dlciAgMS4wMDAwMDEgMC43ICAgICAgICAtPiAxLjAwMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzMjggIHBvd2VyICAxLjAwMDAwMSAwLjk5OTk5OTkgIC0+IDEuMDAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDMyOSAgcG93ZXIgIDEuMDAwMDAxIDEuMDAwMDAwICAgLT4gMS4wMDAwMDEKKworLS0gRm9yIHg9cHJldmZwKDEpPTAuOTkuLjk5ICh3aGVyZSB0aGUgbnVtYmVyIG9mIDlzIGlzIHByZWNpc2lvbikKKy0tICAgcG93ZXIoeCx5KT14IHdoZW4gdGhlIHJvdW5kaW5nIGlzIGRvd24gZm9yIGFueSB5IGluICgwLDFdLgorcm91bmRpbmc6IGZsb29yCitwb3d4NDM0MSAgcG93ZXIgIDAuOTk5OTk5OSAwICAgICAgICAgIC0+IDEKKy0tIFRoZSBuZXh0IHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQgZm9yIGRlY051bWJlcgorcG93eDQzNDIgIHBvd2VyICAwLjk5OTk5OTkgMWUtMTAxICAgICAtPiAwLjk5OTk5OTkgICBJbmV4YWN0IFJvdW5kZWQKKy0tIFRoZSBuZXh0IHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQgZm9yIGRlY051bWJlcgorcG93eDQzNDMgIHBvd2VyICAwLjk5OTk5OTkgMWUtOTUgICAgICAtPiAwLjk5OTk5OTkgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzQ0ICBwb3dlciAgMC45OTk5OTk5IDFlLTEwICAgICAgLT4gMC45OTk5OTk5ICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM0NSAgcG93ZXIgIDAuOTk5OTk5OSAwLjEgICAgICAgIC0+IDAuOTk5OTk5OSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNDYgIHBvd2VyICAwLjk5OTk5OTkgMC4xMjM0NTY3ICAtPiAwLjk5OTk5OTkgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzQ3ICBwb3dlciAgMC45OTk5OTk5IDAuNyAgICAgICAgLT4gMC45OTk5OTk5ICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM0OCAgcG93ZXIgIDAuOTk5OTk5OSAwLjk5OTk5OTkgIC0+IDAuOTk5OTk5OSAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNDkgIHBvd2VyICAwLjk5OTk5OTkgMS4wMDAwMDAgICAtPiAwLjk5OTk5OTkKKy0tICAgcG93ZXIoeCx5KT0xIHdoZW4gdGhlIHJvdW5kaW5nIGlzIHVwIGZvciBhbnkgeSBpbiAoMCwxXS4KK3JvdW5kaW5nOiBjZWlsaW5nCitwb3d4NDM2MSAgcG93ZXIgIDAuOTk5OTk5OSAwICAgICAgICAgIC0+IDEKK3Bvd3g0MzYyICBwb3dlciAgMC45OTk5OTk5IDFlLTEwMSAgICAgLT4gMS4wMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM2MyAgcG93ZXIgIDAuOTk5OTk5OSAxZS05NSAgICAgIC0+IDEuMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNjQgIHBvd2VyICAwLjk5OTk5OTkgMWUtMTAgICAgICAtPiAxLjAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzY1ICBwb3dlciAgMC45OTk5OTk5IDAuMSAgICAgICAgLT4gMS4wMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM2NiAgcG93ZXIgIDAuOTk5OTk5OSAwLjEyMzQ1NjcgIC0+IDEuMDAwMDAwICAgIEluZXhhY3QgUm91bmRlZAorcG93eDQzNjcgIHBvd2VyICAwLjk5OTk5OTkgMC43ICAgICAgICAtPiAxLjAwMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0MzY4ICBwb3dlciAgMC45OTk5OTk5IDAuOTk5OTk5OSAgLT4gMS4wMDAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitwb3d4NDM2OSAgcG93ZXIgIDAuOTk5OTk5OSAxLjAwMDAwMCAgIC0+IDAuOTk5OTk5OQorCistLSBGb3IgeD1uZXh0ZnAoMCkKKy0tICAgcG93ZXIoeCx5KT0wIHdoZW4gdGhlIHJvdW5kaW5nIGlzIGRvd24gZm9yIGFueSB5IGxhcmdlciB0aGFuIDEuCityb3VuZGluZzogZmxvb3IKK3Bvd3g0MzgyICBwb3dlciAgMWUtMTAxICAgIDAgICAgICAgICAgLT4gMQorcG93eDQzODMgIHBvd2VyICAxZS0xMDEgICAgMC45OTk5OTk5ICAtPiAxRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3g0Mzg0ICBwb3dlciAgMWUtMTAxICAgIDEuMDAwMDAwICAgLT4gMUUtMTAxIFN1Ym5vcm1hbAorcG93eDQzODUgIHBvd2VyICAxZS0xMDEgICAgMS4wMDAwMDEgICAtPiAwRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcG93eDQzODYgIHBvd2VyICAxZS0xMDEgICAgMi4wMDAwMDAgICAtPiAwRS0xMDEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9wb3dlcnNxcnQuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcG93ZXJzcXJ0LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwYjk0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcG93ZXJzcXJ0LmRlY1Rlc3QKQEAgLTAsMCArMSwyOTcwIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHBvd2Vyc3FydC5kZWNUZXN0IC0tIGRlY2ltYWwgc3F1YXJlIHJvb3QsIHVzaW5nIHBvd2VyICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDQsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSB0YWtlbiBmcm9tIHNxdWFyZXJvb3QuZGVjVGVzdCBidXQgYXJlCistLSBldmFsdWF0ZWQgdXNpbmcgdGhlIHBvd2VyIG9wZXJhdG9yLiAgVGhlIGRpZmZlcmVuY2VzIGluIHJlc3VsdHMKKy0tICgxNTMgb3V0IG9mIDI4NTYpIGZhbGwgaW50byB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXM6CistLQorLS0gICAgeCAgICAqKiAwLjUgKHg+MCkgaGFzIG5vIHByZWZlcnJlZCBleHBvbmVudCwgYW5kIGlzIEluZXhhY3QKKy0tICAgICAgICAgICAgICAgIChhbmQgaGVuY2UgZnVsbCBwcmVjaXNpb24pOyBhbG1vc3QgYWxsIGRpZmZlcmVuY2VzIGFyZQorLS0gICAgICAgICAgICAgICAgaW4gdGhpcyBjYXRlZ29yeQorLS0gICAgMC4wMCAqKiAwLjUgYmVjb21lcyAwIChub3QgMC4wKSwgZXRjLgorLS0gICAtMCAgICAqKiAwLjUgYmVjb21lcyAwIChuZXZlciAtMCkKKy0tICAgIFNvbWUgZXhhY3Qgc3Vibm9ybWFscyBiZWNvbWUgaW5leGFjdCBhbmQgaGVuY2UgdW5kZXJmbG93cworCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIGJhc2ljcworcHdzeDAwMSAgcG93ZXIgMSAgICAgICAgMC41IC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDAyICBwb3dlciAtMSAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDAzICBwb3dlciAxLjAwICAgICAwLjUgLT4gMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwMDQgIHBvd2VyIC0xLjAwICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwMDUgIHBvd2VyIDAgICAgICAgIDAuNSAtPiAwCitwd3N4MDA2ICBwb3dlciAwMC4wICAgICAwLjUgLT4gMAorcHdzeDAwNyAgcG93ZXIgMC4wMCAgICAgMC41IC0+IDAKK3B3c3gwMDggIHBvd2VyIDAwLjAwICAgIDAuNSAtPiAwCitwd3N4MDA5ICBwb3dlciAwMC4wMDAgICAwLjUgLT4gMAorcHdzeDAxMCAgcG93ZXIgMDAuMDAwMCAgMC41IC0+IDAKK3B3c3gwMTEgIHBvd2VyIDAwICAgICAgIDAuNSAtPiAwCisKK3B3c3gwMTIgIHBvd2VyIC0yICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwMTMgIHBvd2VyIDIgICAgICAgIDAuNSAtPiAxLjQxNDIxMzU2IEluZXhhY3QgUm91bmRlZAorcHdzeDAxNCAgcG93ZXIgLTIuMDAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDAxNSAgcG93ZXIgMi4wMCAgICAgMC41IC0+IDEuNDE0MjEzNTYgSW5leGFjdCBSb3VuZGVkCitwd3N4MDE2ICBwb3dlciAtMCAgICAgICAwLjUgLT4gMAorcHdzeDAxNyAgcG93ZXIgLTAuMCAgICAgMC41IC0+IDAKK3B3c3gwMTggIHBvd2VyIC0wMC4wMCAgIDAuNSAtPiAwCitwd3N4MDE5ICBwb3dlciAtMDAuMDAwICAwLjUgLT4gMAorcHdzeDAyMCAgcG93ZXIgLTAuMDAwMCAgMC41IC0+IDAKK3B3c3gwMjEgIHBvd2VyIC0wRSs5ICAgIDAuNSAtPiAwCitwd3N4MDIyICBwb3dlciAtMEUrMTAgICAwLjUgLT4gMAorcHdzeDAyMyAgcG93ZXIgLTBFKzExICAgMC41IC0+IDAKK3B3c3gwMjQgIHBvd2VyIC0wRSsxMiAgIDAuNSAtPiAwCitwd3N4MDI1ICBwb3dlciAtMDAgICAgICAwLjUgLT4gMAorcHdzeDAyNiAgcG93ZXIgMEUrNSAgICAgMC41IC0+IDAKK3B3c3gwMjcgIHBvd2VyIDQuMCAgICAgIDAuNSAtPiAyLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDAyOCAgcG93ZXIgNC4wMCAgICAgMC41IC0+IDIuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCisKK3B3c3gwMzAgIHBvd2VyICswLjEgICAgICAgICAgICAgMC41IC0+IDAuMzE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorcHdzeDAzMSAgcG93ZXIgLTAuMSAgICAgICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDMyICBwb3dlciArMC4wMSAgICAgICAgICAgIDAuNSAtPiAwLjEwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwMzMgIHBvd2VyIC0wLjAxICAgICAgICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDAzNCAgcG93ZXIgKzAuMDAxICAgICAgICAgICAwLjUgLT4gMC4wMzE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorcHdzeDAzNSAgcG93ZXIgLTAuMDAxICAgICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDM2ICBwb3dlciArMC4wMDAwMDEgICAgICAgIDAuNSAtPiAwLjAwMTAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDAzNyAgcG93ZXIgLTAuMDAwMDAxICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDM4ICBwb3dlciArMC4wMDAwMDAwMDAwMDEgIDAuNSAtPiAwLjAwMDAwMTAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDAzOSAgcG93ZXIgLTAuMDAwMDAwMDAwMDAxICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3B3c3gwNDEgIHBvd2VyIDEuMSAgICAgICAgIDAuNSAtPiAxLjA0ODgwODg1IEluZXhhY3QgUm91bmRlZAorcHdzeDA0MiAgcG93ZXIgMS4xMCAgICAgICAgMC41IC0+IDEuMDQ4ODA4ODUgSW5leGFjdCBSb3VuZGVkCitwd3N4MDQzICBwb3dlciAxLjEwMCAgICAgICAwLjUgLT4gMS4wNDg4MDg4NSBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNDQgIHBvd2VyIDEuMTEwICAgICAgIDAuNSAtPiAxLjA1MzU2NTM4IEluZXhhY3QgUm91bmRlZAorcHdzeDA0NSAgcG93ZXIgLTEuMSAgICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDA0NiAgcG93ZXIgLTEuMTAgICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDA0NyAgcG93ZXIgLTEuMTAwICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDA0OCAgcG93ZXIgLTEuMTEwICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDA0OSAgcG93ZXIgOS45ICAgICAgICAgMC41IC0+IDMuMTQ2NDI2NTQgSW5leGFjdCBSb3VuZGVkCitwd3N4MDUwICBwb3dlciA5LjkwICAgICAgICAwLjUgLT4gMy4xNDY0MjY1NCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNTEgIHBvd2VyIDkuOTAwICAgICAgIDAuNSAtPiAzLjE0NjQyNjU0IEluZXhhY3QgUm91bmRlZAorcHdzeDA1MiAgcG93ZXIgOS45OTAgICAgICAgMC41IC0+IDMuMTYwNjk2MTMgSW5leGFjdCBSb3VuZGVkCitwd3N4MDUzICBwb3dlciAtOS45ICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDU0ICBwb3dlciAtOS45MCAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDU1ICBwb3dlciAtOS45MDAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDU2ICBwb3dlciAtOS45OTAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3B3c3gwNjAgIHBvd2VyICAxICAgICAgICAgICAgMC41IC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDYxICBwb3dlciAgMS4wICAgICAgICAgIDAuNSAtPiAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA2MiAgcG93ZXIgIDEuMDAgICAgICAgICAwLjUgLT4gMS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNjMgIHBvd2VyICAxMC4wICAgICAgICAgMC41IC0+IDMuMTYyMjc3NjYgSW5leGFjdCBSb3VuZGVkCitwd3N4MDY0ICBwb3dlciAgMTAuMCAgICAgICAgIDAuNSAtPiAzLjE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorcHdzeDA2NSAgcG93ZXIgIDEwLjAgICAgICAgICAwLjUgLT4gMy4xNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNjYgIHBvd2VyICAxMC4wMCAgICAgICAgMC41IC0+IDMuMTYyMjc3NjYgSW5leGFjdCBSb3VuZGVkCitwd3N4MDY3ICBwb3dlciAgMTAwICAgICAgICAgIDAuNSAtPiAxMC4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA2OCAgcG93ZXIgIDEwMC4wICAgICAgICAwLjUgLT4gMTAuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNjkgIHBvd2VyICAxMDAuMDAgICAgICAgMC41IC0+IDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDcwICBwb3dlciAgMS4xMDAwRSszICAgIDAuNSAtPiAzMy4xNjYyNDc5IEluZXhhY3QgUm91bmRlZAorcHdzeDA3MSAgcG93ZXIgIDEuMTAwMDBFKzMgICAwLjUgLT4gMzMuMTY2MjQ3OSBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwNzIgIHBvd2VyIC0xMC4wICAgICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDA3MyAgcG93ZXIgLTEwLjAwICAgICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDc0ICBwb3dlciAtMTAwLjAgICAgICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3B3c3gwNzUgIHBvd2VyIC0xMDAuMDAgICAgICAgMC41IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcHdzeDA3NiAgcG93ZXIgLTEuMTAwMEUrMyAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4MDc3ICBwb3dlciAtMS4xMDAwMEUrMyAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gZmFtb3VzIHNxdWFyZXMKK3B3c3gwODAgIHBvd2VyICAgICAxICAgMC41IC0+IDEuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDgxICBwb3dlciAgICAgNCAgIDAuNSAtPiAyLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA4MiAgcG93ZXIgICAgIDkgICAwLjUgLT4gMy4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwODMgIHBvd2VyICAgIDE2ICAgMC41IC0+IDQuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDg0ICBwb3dlciAgICAyNSAgIDAuNSAtPiA1LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA4NSAgcG93ZXIgICAgMzYgICAwLjUgLT4gNi4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwODYgIHBvd2VyICAgIDQ5ICAgMC41IC0+IDcuMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDg3ICBwb3dlciAgICA2NCAgIDAuNSAtPiA4LjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA4OCAgcG93ZXIgICAgODEgICAwLjUgLT4gOS4wMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwODkgIHBvd2VyICAgMTAwICAgMC41IC0+IDEwLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDkwICBwb3dlciAgIDEyMSAgIDAuNSAtPiAxMS4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA5MSAgcG93ZXIgICAxNDQgICAwLjUgLT4gMTIuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwOTIgIHBvd2VyICAgMTY5ICAgMC41IC0+IDEzLjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MDkzICBwb3dlciAgIDI1NiAgIDAuNSAtPiAxNi4wMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDA5NCAgcG93ZXIgIDEwMjQgICAwLjUgLT4gMzIuMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gwOTUgIHBvd2VyICA0MDk2ICAgMC41IC0+IDY0LjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTAwICBwb3dlciAgIDAuMDEgIDAuNSAtPiAwLjEwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMDEgIHBvd2VyICAgMC4wNCAgMC41IC0+IDAuMjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDEwMiAgcG93ZXIgICAwLjA5ICAwLjUgLT4gMC4zMDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTAzICBwb3dlciAgIDAuMTYgIDAuNSAtPiAwLjQwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMDQgIHBvd2VyICAgMC4yNSAgMC41IC0+IDAuNTAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDEwNSAgcG93ZXIgICAwLjM2ICAwLjUgLT4gMC42MDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTA2ICBwb3dlciAgIDAuNDkgIDAuNSAtPiAwLjcwMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMDcgIHBvd2VyICAgMC42NCAgMC41IC0+IDAuODAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDEwOCAgcG93ZXIgICAwLjgxICAwLjUgLT4gMC45MDAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTA5ICBwb3dlciAgIDEuMDAgIDAuNSAtPiAxLjAwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDExMCAgcG93ZXIgICAxLjIxICAwLjUgLT4gMS4xMDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMTEgIHBvd2VyICAgMS40NCAgMC41IC0+IDEuMjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTEyICBwb3dlciAgIDEuNjkgIDAuNSAtPiAxLjMwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorcHdzeDExMyAgcG93ZXIgICAyLjU2ICAwLjUgLT4gMS42MDAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMTQgIHBvd2VyICAxMC4yNCAgMC41IC0+IDMuMjAwMDAwMDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTE1ICBwb3dlciAgNDAuOTYgIDAuNSAtPiA2LjQwMDAwMDAwIEluZXhhY3QgUm91bmRlZAorCistLSBQcmVjaXNpb24gMSBzcXVhcmVyb290IHRlc3RzIFtleGhhdXN0aXZlLCBwbHVzIGV4cG9uZW50IGFkanVzdHNdCityb3VuZGluZzogICAgaGFsZl9ldmVuCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiAgIDEKK3B3c3gxMjAxICBwb3dlciAwLjEgIDAuNSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMDIgIHBvd2VyIDAuMDEgIDAuNSAtPiAwLjEgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIwMyAgcG93ZXIgMS4wRS0xICAwLjUgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjA0ICBwb3dlciAxLjAwRS0yICAwLjUgLT4gMC4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjA1ICBwb3dlciAxRS0zICAwLjUgLT4gMC4wMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIwNiAgcG93ZXIgMUUrMSAgMC41IC0+IDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMDcgIHBvd2VyIDFFKzIgIDAuNSAtPiAxRSsxIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMDggIHBvd2VyIDFFKzMgIDAuNSAtPiAzRSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjA5ICBwb3dlciAwLjIgIDAuNSAtPiAwLjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMTAgIHBvd2VyIDAuMDIgIDAuNSAtPiAwLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMTEgIHBvd2VyIDIuMEUtMSAgMC41IC0+IDAuNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxMiAgcG93ZXIgMi4wMEUtMiAgMC41IC0+IDAuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxMyAgcG93ZXIgMkUtMyAgMC41IC0+IDAuMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMTQgIHBvd2VyIDJFKzEgIDAuNSAtPiA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjE1ICBwb3dlciAyRSsyICAwLjUgLT4gMUUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxNiAgcG93ZXIgMkUrMyAgMC41IC0+IDRFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMTcgIHBvd2VyIDAuMyAgMC41IC0+IDAuNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxOCAgcG93ZXIgMC4wMyAgMC41IC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIxOSAgcG93ZXIgMy4wRS0xICAwLjUgLT4gMC41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjIwICBwb3dlciAzLjAwRS0yICAwLjUgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjIxICBwb3dlciAzRS0zICAwLjUgLT4gMC4wNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIyMiAgcG93ZXIgM0UrMSAgMC41IC0+IDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMjMgIHBvd2VyIDNFKzIgIDAuNSAtPiAyRSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjI0ICBwb3dlciAzRSszICAwLjUgLT4gNUUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIyNSAgcG93ZXIgMC40ICAwLjUgLT4gMC42ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjI2ICBwb3dlciAwLjA0ICAwLjUgLT4gMC4yIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMjcgIHBvd2VyIDQuMEUtMSAgMC41IC0+IDAuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIyOCAgcG93ZXIgNC4wMEUtMiAgMC41IC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIyOSAgcG93ZXIgNEUtMyAgMC41IC0+IDAuMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzAgIHBvd2VyIDRFKzEgIDAuNSAtPiA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjMxICBwb3dlciA0RSsyICAwLjUgLT4gMkUrMSBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjMyICBwb3dlciA0RSszICAwLjUgLT4gNkUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIzMyAgcG93ZXIgMC41ICAwLjUgLT4gMC43ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjM0ICBwb3dlciAwLjA1ICAwLjUgLT4gMC4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjM1ICBwb3dlciA1LjBFLTEgIDAuNSAtPiAwLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzYgIHBvd2VyIDUuMDBFLTIgIDAuNSAtPiAwLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyMzcgIHBvd2VyIDVFLTMgIDAuNSAtPiAwLjA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjM4ICBwb3dlciA1RSsxICAwLjUgLT4gNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTIzOSAgcG93ZXIgNUUrMiAgMC41IC0+IDJFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNDAgIHBvd2VyIDVFKzMgIDAuNSAtPiA3RSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjQxICBwb3dlciAwLjYgIDAuNSAtPiAwLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNDIgIHBvd2VyIDAuMDYgIDAuNSAtPiAwLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNDMgIHBvd2VyIDYuMEUtMSAgMC41IC0+IDAuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0NCAgcG93ZXIgNi4wMEUtMiAgMC41IC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0NSAgcG93ZXIgNkUtMyAgMC41IC0+IDAuMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNDYgIHBvd2VyIDZFKzEgIDAuNSAtPiA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjQ3ICBwb3dlciA2RSsyICAwLjUgLT4gMkUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI0OCAgcG93ZXIgNkUrMyAgMC41IC0+IDhFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNDkgIHBvd2VyIDAuNyAgMC41IC0+IDAuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI1MCAgcG93ZXIgMC4wNyAgMC41IC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI1MSAgcG93ZXIgNy4wRS0xICAwLjUgLT4gMC44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjUyICBwb3dlciA3LjAwRS0yICAwLjUgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjUzICBwb3dlciA3RS0zICAwLjUgLT4gMC4wOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI1NCAgcG93ZXIgN0UrMSAgMC41IC0+IDggIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNTUgIHBvd2VyIDdFKzIgIDAuNSAtPiAzRSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjU2ICBwb3dlciA3RSszICAwLjUgLT4gOEUrMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI1NyAgcG93ZXIgMC44ICAwLjUgLT4gMC45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjU4ICBwb3dlciAwLjA4ICAwLjUgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjU5ICBwb3dlciA4LjBFLTEgIDAuNSAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjAgIHBvd2VyIDguMDBFLTIgIDAuNSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjEgIHBvd2VyIDhFLTMgIDAuNSAtPiAwLjA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjYyICBwb3dlciA4RSsxICAwLjUgLT4gOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI2MyAgcG93ZXIgOEUrMiAgMC41IC0+IDNFKzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjQgIHBvd2VyIDhFKzMgIDAuNSAtPiA5RSsxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjY1ICBwb3dlciAwLjkgIDAuNSAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNjYgIHBvd2VyIDAuMDkgIDAuNSAtPiAwLjMgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI2NyAgcG93ZXIgOS4wRS0xICAwLjUgLT4gMC45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjY4ICBwb3dlciA5LjAwRS0yICAwLjUgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gxMjY5ICBwb3dlciA5RS0zICAwLjUgLT4gMC4wOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MTI3MCAgcG93ZXIgOUUrMSAgMC41IC0+IDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNzEgIHBvd2VyIDlFKzIgIDAuNSAtPiAzRSsxIEluZXhhY3QgUm91bmRlZAorcHdzeDEyNzIgIHBvd2VyIDlFKzMgIDAuNSAtPiA5RSsxICBJbmV4YWN0IFJvdW5kZWQKKworLS0gUHJlY2lzaW9uIDIgc3F1YXJlcm9vdCB0ZXN0cyBbZXhoYXVzdGl2ZSwgcGx1cyBleHBvbmVudCBhZGp1c3RzXQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogICAyCitwd3N4MjIwMSAgcG93ZXIgMC4xICAwLjUgLT4gMC4zMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIwMiAgcG93ZXIgMC4wMSAgMC41IC0+IDAuMTAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIwMyAgcG93ZXIgMS4wRS0xICAwLjUgLT4gMC4zMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIwNCAgcG93ZXIgMS4wMEUtMiAgMC41IC0+IDAuMTAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIwNSAgcG93ZXIgMUUtMyAgMC41IC0+IDAuMDMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjA2ICBwb3dlciAxRSsxICAwLjUgLT4gMy4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjA3ICBwb3dlciAxRSsyICAwLjUgLT4gMTAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIwOCAgcG93ZXIgMUUrMyAgMC41IC0+IDMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjA5ICBwb3dlciAwLjIgIDAuNSAtPiAwLjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjEwICBwb3dlciAwLjAyICAwLjUgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIxMSAgcG93ZXIgMi4wRS0xICAwLjUgLT4gMC40NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIxMiAgcG93ZXIgMi4wMEUtMiAgMC41IC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMTMgIHBvd2VyIDJFLTMgIDAuNSAtPiAwLjA0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIxNCAgcG93ZXIgMkUrMSAgMC41IC0+IDQuNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIxNSAgcG93ZXIgMkUrMiAgMC41IC0+IDE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjE2ICBwb3dlciAyRSszICAwLjUgLT4gNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMTcgIHBvd2VyIDAuMyAgMC41IC0+IDAuNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMTggIHBvd2VyIDAuMDMgIDAuNSAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjE5ICBwb3dlciAzLjBFLTEgIDAuNSAtPiAwLjU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjIwICBwb3dlciAzLjAwRS0yICAwLjUgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIyMSAgcG93ZXIgM0UtMyAgMC41IC0+IDAuMDU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjIyICBwb3dlciAzRSsxICAwLjUgLT4gNS41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjIzICBwb3dlciAzRSsyICAwLjUgLT4gMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMjQgIHBvd2VyIDNFKzMgIDAuNSAtPiA1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIyNSAgcG93ZXIgMC40ICAwLjUgLT4gMC42MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIyNiAgcG93ZXIgMC4wNCAgMC41IC0+IDAuMjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIyNyAgcG93ZXIgNC4wRS0xICAwLjUgLT4gMC42MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIyOCAgcG93ZXIgNC4wMEUtMiAgMC41IC0+IDAuMjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIyOSAgcG93ZXIgNEUtMyAgMC41IC0+IDAuMDYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjMwICBwb3dlciA0RSsxICAwLjUgLT4gNi4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjMxICBwb3dlciA0RSsyICAwLjUgLT4gMjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIzMiAgcG93ZXIgNEUrMyAgMC41IC0+IDYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjMzICBwb3dlciAwLjUgIDAuNSAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjM0ICBwb3dlciAwLjA1ICAwLjUgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIzNSAgcG93ZXIgNS4wRS0xICAwLjUgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIzNiAgcG93ZXIgNS4wMEUtMiAgMC41IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyMzcgIHBvd2VyIDVFLTMgIDAuNSAtPiAwLjA3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIzOCAgcG93ZXIgNUUrMSAgMC41IC0+IDcuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjIzOSAgcG93ZXIgNUUrMiAgMC41IC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjQwICBwb3dlciA1RSszICAwLjUgLT4gNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDEgIHBvd2VyIDAuNiAgMC41IC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDIgIHBvd2VyIDAuMDYgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjQzICBwb3dlciA2LjBFLTEgIDAuNSAtPiAwLjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjQ0ICBwb3dlciA2LjAwRS0yICAwLjUgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI0NSAgcG93ZXIgNkUtMyAgMC41IC0+IDAuMDc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjQ2ICBwb3dlciA2RSsxICAwLjUgLT4gNy43ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjQ3ICBwb3dlciA2RSsyICAwLjUgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNDggIHBvd2VyIDZFKzMgIDAuNSAtPiA3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI0OSAgcG93ZXIgMC43ICAwLjUgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI1MCAgcG93ZXIgMC4wNyAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNTEgIHBvd2VyIDcuMEUtMSAgMC41IC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNTIgIHBvd2VyIDcuMDBFLTIgIDAuNSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjUzICBwb3dlciA3RS0zICAwLjUgLT4gMC4wODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNTQgIHBvd2VyIDdFKzEgIDAuNSAtPiA4LjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNTUgIHBvd2VyIDdFKzIgIDAuNSAtPiAyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI1NiAgcG93ZXIgN0UrMyAgMC41IC0+IDg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjU3ICBwb3dlciAwLjggIDAuNSAtPiAwLjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjU4ICBwb3dlciAwLjA4ICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI1OSAgcG93ZXIgOC4wRS0xICAwLjUgLT4gMC44OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI2MCAgcG93ZXIgOC4wMEUtMiAgMC41IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNjEgIHBvd2VyIDhFLTMgIDAuNSAtPiAwLjA4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI2MiAgcG93ZXIgOEUrMSAgMC41IC0+IDguOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI2MyAgcG93ZXIgOEUrMiAgMC41IC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjY0ICBwb3dlciA4RSszICAwLjUgLT4gODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNjUgIHBvd2VyIDAuOSAgMC41IC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNjYgIHBvd2VyIDAuMDkgIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjY3ICBwb3dlciA5LjBFLTEgIDAuNSAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjY4ICBwb3dlciA5LjAwRS0yICAwLjUgLT4gMC4zMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjY5ICBwb3dlciA5RS0zICAwLjUgLT4gMC4wOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzAgIHBvd2VyIDlFKzEgIDAuNSAtPiA5LjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzEgIHBvd2VyIDlFKzIgIDAuNSAtPiAzMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjcyICBwb3dlciA5RSszICAwLjUgLT4gOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzMgIHBvd2VyIDAuMTAgIDAuNSAtPiAwLjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjc0ICBwb3dlciAwLjAxMCAgMC41IC0+IDAuMTAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI3NSAgcG93ZXIgMTAuMEUtMSAgMC41IC0+IDEuMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjc2ICBwb3dlciAxMC4wMEUtMiAgMC41IC0+IDAuMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzcgIHBvd2VyIDEwRS0zICAwLjUgLT4gMC4xMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjc4ICBwb3dlciAxMEUrMSAgMC41IC0+IDEwIEluZXhhY3QgUm91bmRlZAorcHdzeDIyNzkgIHBvd2VyIDEwRSsyICAwLjUgLT4gMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODAgIHBvd2VyIDEwRSszICAwLjUgLT4gMS4wRSsyIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODEgIHBvd2VyIDAuMTEgIDAuNSAtPiAwLjMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjgyICBwb3dlciAwLjAxMSAgMC41IC0+IDAuMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODMgIHBvd2VyIDExLjBFLTEgIDAuNSAtPiAxLjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyODQgIHBvd2VyIDExLjAwRS0yICAwLjUgLT4gMC4zMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI4NSAgcG93ZXIgMTFFLTMgIDAuNSAtPiAwLjEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjg2ICBwb3dlciAxMUUrMSAgMC41IC0+IDEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjg3ICBwb3dlciAxMUUrMiAgMC41IC0+IDMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjg4ICBwb3dlciAxMUUrMyAgMC41IC0+IDEuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI4OSAgcG93ZXIgMC4xMiAgMC41IC0+IDAuMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyOTAgIHBvd2VyIDAuMDEyICAwLjUgLT4gMC4xMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI5MSAgcG93ZXIgMTIuMEUtMSAgMC41IC0+IDEuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI5MiAgcG93ZXIgMTIuMDBFLTIgIDAuNSAtPiAwLjM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjkzICBwb3dlciAxMkUtMyAgMC41IC0+IDAuMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyOTQgIHBvd2VyIDEyRSsxICAwLjUgLT4gMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyOTUgIHBvd2VyIDEyRSsyICAwLjUgLT4gMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIyOTYgIHBvd2VyIDEyRSszICAwLjUgLT4gMS4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjk3ICBwb3dlciAwLjEzICAwLjUgLT4gMC4zNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjI5OCAgcG93ZXIgMC4wMTMgIDAuNSAtPiAwLjExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMjk5ICBwb3dlciAxMy4wRS0xICAwLjUgLT4gMS4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzAwICBwb3dlciAxMy4wMEUtMiAgMC41IC0+IDAuMzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMDEgIHBvd2VyIDEzRS0zICAwLjUgLT4gMC4xMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwMiAgcG93ZXIgMTNFKzEgIDAuNSAtPiAxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwMyAgcG93ZXIgMTNFKzIgIDAuNSAtPiAzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwNCAgcG93ZXIgMTNFKzMgIDAuNSAtPiAxLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMDUgIHBvd2VyIDAuMTQgIDAuNSAtPiAwLjM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzA2ICBwb3dlciAwLjAxNCAgMC41IC0+IDAuMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMDcgIHBvd2VyIDE0LjBFLTEgIDAuNSAtPiAxLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMDggIHBvd2VyIDE0LjAwRS0yICAwLjUgLT4gMC4zNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMwOSAgcG93ZXIgMTRFLTMgIDAuNSAtPiAwLjEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzEwICBwb3dlciAxNEUrMSAgMC41IC0+IDEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzExICBwb3dlciAxNEUrMiAgMC41IC0+IDM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzEyICBwb3dlciAxNEUrMyAgMC41IC0+IDEuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMxMyAgcG93ZXIgMC4xNSAgMC41IC0+IDAuMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMTQgIHBvd2VyIDAuMDE1ICAwLjUgLT4gMC4xMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMxNSAgcG93ZXIgMTUuMEUtMSAgMC41IC0+IDEuMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMxNiAgcG93ZXIgMTUuMDBFLTIgIDAuNSAtPiAwLjM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzE3ICBwb3dlciAxNUUtMyAgMC41IC0+IDAuMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMTggIHBvd2VyIDE1RSsxICAwLjUgLT4gMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMTkgIHBvd2VyIDE1RSsyICAwLjUgLT4gMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjAgIHBvd2VyIDE1RSszICAwLjUgLT4gMS4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzIxICBwb3dlciAwLjE2ICAwLjUgLT4gMC40MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzIyICBwb3dlciAwLjAxNiAgMC41IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjMgIHBvd2VyIDE2LjBFLTEgIDAuNSAtPiAxLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjQgIHBvd2VyIDE2LjAwRS0yICAwLjUgLT4gMC40MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzI1ICBwb3dlciAxNkUtMyAgMC41IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjYgIHBvd2VyIDE2RSsxICAwLjUgLT4gMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjcgIHBvd2VyIDE2RSsyICAwLjUgLT4gNDAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMyOCAgcG93ZXIgMTZFKzMgIDAuNSAtPiAxLjNFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMjkgIHBvd2VyIDAuMTcgIDAuNSAtPiAwLjQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzMwICBwb3dlciAwLjAxNyAgMC41IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMzEgIHBvd2VyIDE3LjBFLTEgIDAuNSAtPiAxLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMzIgIHBvd2VyIDE3LjAwRS0yICAwLjUgLT4gMC40MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMzMyAgcG93ZXIgMTdFLTMgIDAuNSAtPiAwLjEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzM0ICBwb3dlciAxN0UrMSAgMC41IC0+IDEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzM1ICBwb3dlciAxN0UrMiAgMC41IC0+IDQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzM2ICBwb3dlciAxN0UrMyAgMC41IC0+IDEuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMzNyAgcG93ZXIgMC4xOCAgMC41IC0+IDAuNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzMzggIHBvd2VyIDAuMDE4ICAwLjUgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjMzOSAgcG93ZXIgMTguMEUtMSAgMC41IC0+IDEuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM0MCAgcG93ZXIgMTguMDBFLTIgIDAuNSAtPiAwLjQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzQxICBwb3dlciAxOEUtMyAgMC41IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDIgIHBvd2VyIDE4RSsxICAwLjUgLT4gMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDMgIHBvd2VyIDE4RSsyICAwLjUgLT4gNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDQgIHBvd2VyIDE4RSszICAwLjUgLT4gMS4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzQ1ICBwb3dlciAwLjE5ICAwLjUgLT4gMC40NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM0NiAgcG93ZXIgMC4wMTkgIDAuNSAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzQ3ICBwb3dlciAxOS4wRS0xICAwLjUgLT4gMS40ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzQ4ICBwb3dlciAxOS4wMEUtMiAgMC41IC0+IDAuNDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNDkgIHBvd2VyIDE5RS0zICAwLjUgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM1MCAgcG93ZXIgMTlFKzEgIDAuNSAtPiAxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM1MSAgcG93ZXIgMTlFKzIgIDAuNSAtPiA0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM1MiAgcG93ZXIgMTlFKzMgIDAuNSAtPiAxLjRFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNTMgIHBvd2VyIDAuMjAgIDAuNSAtPiAwLjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzU0ICBwb3dlciAwLjAyMCAgMC41IC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNTUgIHBvd2VyIDIwLjBFLTEgIDAuNSAtPiAxLjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNTYgIHBvd2VyIDIwLjAwRS0yICAwLjUgLT4gMC40NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM1NyAgcG93ZXIgMjBFLTMgIDAuNSAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzU4ICBwb3dlciAyMEUrMSAgMC41IC0+IDE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzU5ICBwb3dlciAyMEUrMiAgMC41IC0+IDQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzYwICBwb3dlciAyMEUrMyAgMC41IC0+IDEuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM2MSAgcG93ZXIgMC4yMSAgMC41IC0+IDAuNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNjIgIHBvd2VyIDAuMDIxICAwLjUgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM2MyAgcG93ZXIgMjEuMEUtMSAgMC41IC0+IDEuNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM2NCAgcG93ZXIgMjEuMDBFLTIgIDAuNSAtPiAwLjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzY1ICBwb3dlciAyMUUtMyAgMC41IC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNjYgIHBvd2VyIDIxRSsxICAwLjUgLT4gMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNjcgIHBvd2VyIDIxRSsyICAwLjUgLT4gNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNjggIHBvd2VyIDIxRSszICAwLjUgLT4gMS40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzY5ICBwb3dlciAwLjIyICAwLjUgLT4gMC40NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM3MCAgcG93ZXIgMC4wMjIgIDAuNSAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzcxICBwb3dlciAyMi4wRS0xICAwLjUgLT4gMS41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzcyICBwb3dlciAyMi4wMEUtMiAgMC41IC0+IDAuNDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNzMgIHBvd2VyIDIyRS0zICAwLjUgLT4gMC4xNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM3NCAgcG93ZXIgMjJFKzEgIDAuNSAtPiAxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM3NSAgcG93ZXIgMjJFKzIgIDAuNSAtPiA0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM3NiAgcG93ZXIgMjJFKzMgIDAuNSAtPiAxLjVFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNzcgIHBvd2VyIDAuMjMgIDAuNSAtPiAwLjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzc4ICBwb3dlciAwLjAyMyAgMC41IC0+IDAuMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzNzkgIHBvd2VyIDIzLjBFLTEgIDAuNSAtPiAxLjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzODAgIHBvd2VyIDIzLjAwRS0yICAwLjUgLT4gMC40OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM4MSAgcG93ZXIgMjNFLTMgIDAuNSAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzgyICBwb3dlciAyM0UrMSAgMC41IC0+IDE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzgzICBwb3dlciAyM0UrMiAgMC41IC0+IDQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzg0ICBwb3dlciAyM0UrMyAgMC41IC0+IDEuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM4NSAgcG93ZXIgMC4yNCAgMC41IC0+IDAuNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzODYgIHBvd2VyIDAuMDI0ICAwLjUgLT4gMC4xNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM4NyAgcG93ZXIgMjQuMEUtMSAgMC41IC0+IDEuNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjM4OCAgcG93ZXIgMjQuMDBFLTIgIDAuNSAtPiAwLjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzg5ICBwb3dlciAyNEUtMyAgMC41IC0+IDAuMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTAgIHBvd2VyIDI0RSsxICAwLjUgLT4gMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTEgIHBvd2VyIDI0RSsyICAwLjUgLT4gNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTIgIHBvd2VyIDI0RSszICAwLjUgLT4gMS41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzkzICBwb3dlciAwLjI1ICAwLjUgLT4gMC41MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzk0ICBwb3dlciAwLjAyNSAgMC41IC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTUgIHBvd2VyIDI1LjBFLTEgIDAuNSAtPiAxLjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTYgIHBvd2VyIDI1LjAwRS0yICAwLjUgLT4gMC41MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyMzk3ICBwb3dlciAyNUUtMyAgMC41IC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTggIHBvd2VyIDI1RSsxICAwLjUgLT4gMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDIzOTkgIHBvd2VyIDI1RSsyICAwLjUgLT4gNTAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQwMCAgcG93ZXIgMjVFKzMgIDAuNSAtPiAxLjZFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MDEgIHBvd2VyIDAuMjYgIDAuNSAtPiAwLjUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDAyICBwb3dlciAwLjAyNiAgMC41IC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MDMgIHBvd2VyIDI2LjBFLTEgIDAuNSAtPiAxLjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MDQgIHBvd2VyIDI2LjAwRS0yICAwLjUgLT4gMC41MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQwNSAgcG93ZXIgMjZFLTMgIDAuNSAtPiAwLjE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDA2ICBwb3dlciAyNkUrMSAgMC41IC0+IDE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDA3ICBwb3dlciAyNkUrMiAgMC41IC0+IDUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDA4ICBwb3dlciAyNkUrMyAgMC41IC0+IDEuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQwOSAgcG93ZXIgMC4yNyAgMC41IC0+IDAuNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MTAgIHBvd2VyIDAuMDI3ICAwLjUgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQxMSAgcG93ZXIgMjcuMEUtMSAgMC41IC0+IDEuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQxMiAgcG93ZXIgMjcuMDBFLTIgIDAuNSAtPiAwLjUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDEzICBwb3dlciAyN0UtMyAgMC41IC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MTQgIHBvd2VyIDI3RSsxICAwLjUgLT4gMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MTUgIHBvd2VyIDI3RSsyICAwLjUgLT4gNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MTYgIHBvd2VyIDI3RSszICAwLjUgLT4gMS42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDE3ICBwb3dlciAwLjI4ICAwLjUgLT4gMC41MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQxOCAgcG93ZXIgMC4wMjggIDAuNSAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDE5ICBwb3dlciAyOC4wRS0xICAwLjUgLT4gMS43ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDIwICBwb3dlciAyOC4wMEUtMiAgMC41IC0+IDAuNTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MjEgIHBvd2VyIDI4RS0zICAwLjUgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyMiAgcG93ZXIgMjhFKzEgIDAuNSAtPiAxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyMyAgcG93ZXIgMjhFKzIgIDAuNSAtPiA1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyNCAgcG93ZXIgMjhFKzMgIDAuNSAtPiAxLjdFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MjUgIHBvd2VyIDAuMjkgIDAuNSAtPiAwLjU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDI2ICBwb3dlciAwLjAyOSAgMC41IC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MjcgIHBvd2VyIDI5LjBFLTEgIDAuNSAtPiAxLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MjggIHBvd2VyIDI5LjAwRS0yICAwLjUgLT4gMC41NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQyOSAgcG93ZXIgMjlFLTMgIDAuNSAtPiAwLjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDMwICBwb3dlciAyOUUrMSAgMC41IC0+IDE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDMxICBwb3dlciAyOUUrMiAgMC41IC0+IDU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDMyICBwb3dlciAyOUUrMyAgMC41IC0+IDEuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQzMyAgcG93ZXIgMC4zMCAgMC41IC0+IDAuNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MzQgIHBvd2VyIDAuMDMwICAwLjUgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQzNSAgcG93ZXIgMzAuMEUtMSAgMC41IC0+IDEuNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQzNiAgcG93ZXIgMzAuMDBFLTIgIDAuNSAtPiAwLjU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDM3ICBwb3dlciAzMEUtMyAgMC41IC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MzggIHBvd2VyIDMwRSsxICAwLjUgLT4gMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0MzkgIHBvd2VyIDMwRSsyICAwLjUgLT4gNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NDAgIHBvd2VyIDMwRSszICAwLjUgLT4gMS43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDQxICBwb3dlciAwLjMxICAwLjUgLT4gMC41NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ0MiAgcG93ZXIgMC4wMzEgIDAuNSAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDQzICBwb3dlciAzMS4wRS0xICAwLjUgLT4gMS44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDQ0ICBwb3dlciAzMS4wMEUtMiAgMC41IC0+IDAuNTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NDUgIHBvd2VyIDMxRS0zICAwLjUgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ0NiAgcG93ZXIgMzFFKzEgIDAuNSAtPiAxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ0NyAgcG93ZXIgMzFFKzIgIDAuNSAtPiA1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ0OCAgcG93ZXIgMzFFKzMgIDAuNSAtPiAxLjhFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NDkgIHBvd2VyIDAuMzIgIDAuNSAtPiAwLjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDUwICBwb3dlciAwLjAzMiAgMC41IC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NTEgIHBvd2VyIDMyLjBFLTEgIDAuNSAtPiAxLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NTIgIHBvd2VyIDMyLjAwRS0yICAwLjUgLT4gMC41NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ1MyAgcG93ZXIgMzJFLTMgIDAuNSAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDU0ICBwb3dlciAzMkUrMSAgMC41IC0+IDE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDU1ICBwb3dlciAzMkUrMiAgMC41IC0+IDU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDU2ICBwb3dlciAzMkUrMyAgMC41IC0+IDEuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ1NyAgcG93ZXIgMC4zMyAgMC41IC0+IDAuNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NTggIHBvd2VyIDAuMDMzICAwLjUgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ1OSAgcG93ZXIgMzMuMEUtMSAgMC41IC0+IDEuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ2MCAgcG93ZXIgMzMuMDBFLTIgIDAuNSAtPiAwLjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDYxICBwb3dlciAzM0UtMyAgMC41IC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjIgIHBvd2VyIDMzRSsxICAwLjUgLT4gMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjMgIHBvd2VyIDMzRSsyICAwLjUgLT4gNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjQgIHBvd2VyIDMzRSszICAwLjUgLT4gMS44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDY1ICBwb3dlciAwLjM0ICAwLjUgLT4gMC41OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ2NiAgcG93ZXIgMC4wMzQgIDAuNSAtPiAwLjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDY3ICBwb3dlciAzNC4wRS0xICAwLjUgLT4gMS44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDY4ICBwb3dlciAzNC4wMEUtMiAgMC41IC0+IDAuNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NjkgIHBvd2VyIDM0RS0zICAwLjUgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ3MCAgcG93ZXIgMzRFKzEgIDAuNSAtPiAxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ3MSAgcG93ZXIgMzRFKzIgIDAuNSAtPiA1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ3MiAgcG93ZXIgMzRFKzMgIDAuNSAtPiAxLjhFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NzMgIHBvd2VyIDAuMzUgIDAuNSAtPiAwLjU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDc0ICBwb3dlciAwLjAzNSAgMC41IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NzUgIHBvd2VyIDM1LjBFLTEgIDAuNSAtPiAxLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0NzYgIHBvd2VyIDM1LjAwRS0yICAwLjUgLT4gMC41OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ3NyAgcG93ZXIgMzVFLTMgIDAuNSAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDc4ICBwb3dlciAzNUUrMSAgMC41IC0+IDE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDc5ICBwb3dlciAzNUUrMiAgMC41IC0+IDU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDgwICBwb3dlciAzNUUrMyAgMC41IC0+IDEuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ4MSAgcG93ZXIgMC4zNiAgMC41IC0+IDAuNjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ4MiAgcG93ZXIgMC4wMzYgIDAuNSAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDgzICBwb3dlciAzNi4wRS0xICAwLjUgLT4gMS45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDg0ICBwb3dlciAzNi4wMEUtMiAgMC41IC0+IDAuNjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ4NSAgcG93ZXIgMzZFLTMgIDAuNSAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDg2ICBwb3dlciAzNkUrMSAgMC41IC0+IDE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDg3ICBwb3dlciAzNkUrMiAgMC41IC0+IDYwIEluZXhhY3QgUm91bmRlZAorcHdzeDI0ODggIHBvd2VyIDM2RSszICAwLjUgLT4gMS45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDg5ICBwb3dlciAwLjM3ICAwLjUgLT4gMC42MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ5MCAgcG93ZXIgMC4wMzcgIDAuNSAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDkxICBwb3dlciAzNy4wRS0xICAwLjUgLT4gMS45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDkyICBwb3dlciAzNy4wMEUtMiAgMC41IC0+IDAuNjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0OTMgIHBvd2VyIDM3RS0zICAwLjUgLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ5NCAgcG93ZXIgMzdFKzEgIDAuNSAtPiAxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ5NSAgcG93ZXIgMzdFKzIgIDAuNSAtPiA2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjQ5NiAgcG93ZXIgMzdFKzMgIDAuNSAtPiAxLjlFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0OTcgIHBvd2VyIDAuMzggIDAuNSAtPiAwLjYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNDk4ICBwb3dlciAwLjAzOCAgMC41IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI0OTkgIHBvd2VyIDM4LjBFLTEgIDAuNSAtPiAxLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MDAgIHBvd2VyIDM4LjAwRS0yICAwLjUgLT4gMC42MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUwMSAgcG93ZXIgMzhFLTMgIDAuNSAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTAyICBwb3dlciAzOEUrMSAgMC41IC0+IDE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTAzICBwb3dlciAzOEUrMiAgMC41IC0+IDYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTA0ICBwb3dlciAzOEUrMyAgMC41IC0+IDEuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUwNSAgcG93ZXIgMC4zOSAgMC41IC0+IDAuNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MDYgIHBvd2VyIDAuMDM5ICAwLjUgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUwNyAgcG93ZXIgMzkuMEUtMSAgMC41IC0+IDIuMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUwOCAgcG93ZXIgMzkuMDBFLTIgIDAuNSAtPiAwLjYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTA5ICBwb3dlciAzOUUtMyAgMC41IC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MTAgIHBvd2VyIDM5RSsxICAwLjUgLT4gMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MTEgIHBvd2VyIDM5RSsyICAwLjUgLT4gNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MTIgIHBvd2VyIDM5RSszICAwLjUgLT4gMi4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTEzICBwb3dlciAwLjQwICAwLjUgLT4gMC42MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUxNCAgcG93ZXIgMC4wNDAgIDAuNSAtPiAwLjIwIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MTUgIHBvd2VyIDQwLjBFLTEgIDAuNSAtPiAyLjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUxNiAgcG93ZXIgNDAuMDBFLTIgIDAuNSAtPiAwLjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTE3ICBwb3dlciA0MEUtMyAgMC41IC0+IDAuMjAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUxOCAgcG93ZXIgNDBFKzEgIDAuNSAtPiAyMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTE5ICBwb3dlciA0MEUrMiAgMC41IC0+IDYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTIwICBwb3dlciA0MEUrMyAgMC41IC0+IDIuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTIxICBwb3dlciAwLjQxICAwLjUgLT4gMC42NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUyMiAgcG93ZXIgMC4wNDEgIDAuNSAtPiAwLjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTIzICBwb3dlciA0MS4wRS0xICAwLjUgLT4gMi4wICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTI0ICBwb3dlciA0MS4wMEUtMiAgMC41IC0+IDAuNjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MjUgIHBvd2VyIDQxRS0zICAwLjUgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUyNiAgcG93ZXIgNDFFKzEgIDAuNSAtPiAyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUyNyAgcG93ZXIgNDFFKzIgIDAuNSAtPiA2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUyOCAgcG93ZXIgNDFFKzMgIDAuNSAtPiAyLjBFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MjkgIHBvd2VyIDAuNDIgIDAuNSAtPiAwLjY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTMwICBwb3dlciAwLjA0MiAgMC41IC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MzEgIHBvd2VyIDQyLjBFLTEgIDAuNSAtPiAyLjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MzIgIHBvd2VyIDQyLjAwRS0yICAwLjUgLT4gMC42NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUzMyAgcG93ZXIgNDJFLTMgIDAuNSAtPiAwLjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTM0ICBwb3dlciA0MkUrMSAgMC41IC0+IDIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTM1ICBwb3dlciA0MkUrMiAgMC41IC0+IDY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTM2ICBwb3dlciA0MkUrMyAgMC41IC0+IDIuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUzNyAgcG93ZXIgMC40MyAgMC41IC0+IDAuNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1MzggIHBvd2VyIDAuMDQzICAwLjUgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjUzOSAgcG93ZXIgNDMuMEUtMSAgMC41IC0+IDIuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU0MCAgcG93ZXIgNDMuMDBFLTIgIDAuNSAtPiAwLjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTQxICBwb3dlciA0M0UtMyAgMC41IC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDIgIHBvd2VyIDQzRSsxICAwLjUgLT4gMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDMgIHBvd2VyIDQzRSsyICAwLjUgLT4gNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDQgIHBvd2VyIDQzRSszICAwLjUgLT4gMi4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTQ1ICBwb3dlciAwLjQ0ICAwLjUgLT4gMC42NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU0NiAgcG93ZXIgMC4wNDQgIDAuNSAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTQ3ICBwb3dlciA0NC4wRS0xICAwLjUgLT4gMi4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTQ4ICBwb3dlciA0NC4wMEUtMiAgMC41IC0+IDAuNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NDkgIHBvd2VyIDQ0RS0zICAwLjUgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU1MCAgcG93ZXIgNDRFKzEgIDAuNSAtPiAyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU1MSAgcG93ZXIgNDRFKzIgIDAuNSAtPiA2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU1MiAgcG93ZXIgNDRFKzMgIDAuNSAtPiAyLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NTMgIHBvd2VyIDAuNDUgIDAuNSAtPiAwLjY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTU0ICBwb3dlciAwLjA0NSAgMC41IC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NTUgIHBvd2VyIDQ1LjBFLTEgIDAuNSAtPiAyLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NTYgIHBvd2VyIDQ1LjAwRS0yICAwLjUgLT4gMC42NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU1NyAgcG93ZXIgNDVFLTMgIDAuNSAtPiAwLjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTU4ICBwb3dlciA0NUUrMSAgMC41IC0+IDIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTU5ICBwb3dlciA0NUUrMiAgMC41IC0+IDY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTYwICBwb3dlciA0NUUrMyAgMC41IC0+IDIuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU2MSAgcG93ZXIgMC40NiAgMC41IC0+IDAuNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NjIgIHBvd2VyIDAuMDQ2ICAwLjUgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU2MyAgcG93ZXIgNDYuMEUtMSAgMC41IC0+IDIuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU2NCAgcG93ZXIgNDYuMDBFLTIgIDAuNSAtPiAwLjY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTY1ICBwb3dlciA0NkUtMyAgMC41IC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NjYgIHBvd2VyIDQ2RSsxICAwLjUgLT4gMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NjcgIHBvd2VyIDQ2RSsyICAwLjUgLT4gNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NjggIHBvd2VyIDQ2RSszICAwLjUgLT4gMi4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTY5ICBwb3dlciAwLjQ3ICAwLjUgLT4gMC42OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU3MCAgcG93ZXIgMC4wNDcgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTcxICBwb3dlciA0Ny4wRS0xICAwLjUgLT4gMi4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTcyICBwb3dlciA0Ny4wMEUtMiAgMC41IC0+IDAuNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NzMgIHBvd2VyIDQ3RS0zICAwLjUgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU3NCAgcG93ZXIgNDdFKzEgIDAuNSAtPiAyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU3NSAgcG93ZXIgNDdFKzIgIDAuNSAtPiA2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU3NiAgcG93ZXIgNDdFKzMgIDAuNSAtPiAyLjJFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NzcgIHBvd2VyIDAuNDggIDAuNSAtPiAwLjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTc4ICBwb3dlciAwLjA0OCAgMC41IC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1NzkgIHBvd2VyIDQ4LjBFLTEgIDAuNSAtPiAyLjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1ODAgIHBvd2VyIDQ4LjAwRS0yICAwLjUgLT4gMC42OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU4MSAgcG93ZXIgNDhFLTMgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTgyICBwb3dlciA0OEUrMSAgMC41IC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTgzICBwb3dlciA0OEUrMiAgMC41IC0+IDY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTg0ICBwb3dlciA0OEUrMyAgMC41IC0+IDIuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU4NSAgcG93ZXIgMC40OSAgMC41IC0+IDAuNzAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU4NiAgcG93ZXIgMC4wNDkgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTg3ICBwb3dlciA0OS4wRS0xICAwLjUgLT4gMi4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTg4ICBwb3dlciA0OS4wMEUtMiAgMC41IC0+IDAuNzAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU4OSAgcG93ZXIgNDlFLTMgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTkwICBwb3dlciA0OUUrMSAgMC41IC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTkxICBwb3dlciA0OUUrMiAgMC41IC0+IDcwIEluZXhhY3QgUm91bmRlZAorcHdzeDI1OTIgIHBvd2VyIDQ5RSszICAwLjUgLT4gMi4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTkzICBwb3dlciAwLjUwICAwLjUgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU5NCAgcG93ZXIgMC4wNTAgIDAuNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTk1ICBwb3dlciA1MC4wRS0xICAwLjUgLT4gMi4yICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNTk2ICBwb3dlciA1MC4wMEUtMiAgMC41IC0+IDAuNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI1OTcgIHBvd2VyIDUwRS0zICAwLjUgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU5OCAgcG93ZXIgNTBFKzEgIDAuNSAtPiAyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjU5OSAgcG93ZXIgNTBFKzIgIDAuNSAtPiA3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYwMCAgcG93ZXIgNTBFKzMgIDAuNSAtPiAyLjJFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MDEgIHBvd2VyIDAuNTEgIDAuNSAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjAyICBwb3dlciAwLjA1MSAgMC41IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MDMgIHBvd2VyIDUxLjBFLTEgIDAuNSAtPiAyLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MDQgIHBvd2VyIDUxLjAwRS0yICAwLjUgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYwNSAgcG93ZXIgNTFFLTMgIDAuNSAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjA2ICBwb3dlciA1MUUrMSAgMC41IC0+IDIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjA3ICBwb3dlciA1MUUrMiAgMC41IC0+IDcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjA4ICBwb3dlciA1MUUrMyAgMC41IC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYwOSAgcG93ZXIgMC41MiAgMC41IC0+IDAuNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MTAgIHBvd2VyIDAuMDUyICAwLjUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYxMSAgcG93ZXIgNTIuMEUtMSAgMC41IC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYxMiAgcG93ZXIgNTIuMDBFLTIgIDAuNSAtPiAwLjcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjEzICBwb3dlciA1MkUtMyAgMC41IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MTQgIHBvd2VyIDUyRSsxICAwLjUgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MTUgIHBvd2VyIDUyRSsyICAwLjUgLT4gNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MTYgIHBvd2VyIDUyRSszICAwLjUgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjE3ICBwb3dlciAwLjUzICAwLjUgLT4gMC43MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYxOCAgcG93ZXIgMC4wNTMgIDAuNSAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjE5ICBwb3dlciA1My4wRS0xICAwLjUgLT4gMi4zICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjIwICBwb3dlciA1My4wMEUtMiAgMC41IC0+IDAuNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MjEgIHBvd2VyIDUzRS0zICAwLjUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyMiAgcG93ZXIgNTNFKzEgIDAuNSAtPiAyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyMyAgcG93ZXIgNTNFKzIgIDAuNSAtPiA3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyNCAgcG93ZXIgNTNFKzMgIDAuNSAtPiAyLjNFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MjUgIHBvd2VyIDAuNTQgIDAuNSAtPiAwLjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjI2ICBwb3dlciAwLjA1NCAgMC41IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MjcgIHBvd2VyIDU0LjBFLTEgIDAuNSAtPiAyLjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MjggIHBvd2VyIDU0LjAwRS0yICAwLjUgLT4gMC43MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYyOSAgcG93ZXIgNTRFLTMgIDAuNSAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjMwICBwb3dlciA1NEUrMSAgMC41IC0+IDIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjMxICBwb3dlciA1NEUrMiAgMC41IC0+IDczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjMyICBwb3dlciA1NEUrMyAgMC41IC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYzMyAgcG93ZXIgMC41NSAgMC41IC0+IDAuNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MzQgIHBvd2VyIDAuMDU1ICAwLjUgLT4gMC4yMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYzNSAgcG93ZXIgNTUuMEUtMSAgMC41IC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjYzNiAgcG93ZXIgNTUuMDBFLTIgIDAuNSAtPiAwLjc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjM3ICBwb3dlciA1NUUtMyAgMC41IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MzggIHBvd2VyIDU1RSsxICAwLjUgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2MzkgIHBvd2VyIDU1RSsyICAwLjUgLT4gNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NDAgIHBvd2VyIDU1RSszICAwLjUgLT4gMi4zRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjQxICBwb3dlciAwLjU2ICAwLjUgLT4gMC43NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY0MiAgcG93ZXIgMC4wNTYgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjQzICBwb3dlciA1Ni4wRS0xICAwLjUgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjQ0ICBwb3dlciA1Ni4wMEUtMiAgMC41IC0+IDAuNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NDUgIHBvd2VyIDU2RS0zICAwLjUgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY0NiAgcG93ZXIgNTZFKzEgIDAuNSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY0NyAgcG93ZXIgNTZFKzIgIDAuNSAtPiA3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY0OCAgcG93ZXIgNTZFKzMgIDAuNSAtPiAyLjRFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NDkgIHBvd2VyIDAuNTcgIDAuNSAtPiAwLjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjUwICBwb3dlciAwLjA1NyAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NTEgIHBvd2VyIDU3LjBFLTEgIDAuNSAtPiAyLjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NTIgIHBvd2VyIDU3LjAwRS0yICAwLjUgLT4gMC43NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY1MyAgcG93ZXIgNTdFLTMgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjU0ICBwb3dlciA1N0UrMSAgMC41IC0+IDI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjU1ICBwb3dlciA1N0UrMiAgMC41IC0+IDc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjU2ICBwb3dlciA1N0UrMyAgMC41IC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY1NyAgcG93ZXIgMC41OCAgMC41IC0+IDAuNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NTggIHBvd2VyIDAuMDU4ICAwLjUgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY1OSAgcG93ZXIgNTguMEUtMSAgMC41IC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY2MCAgcG93ZXIgNTguMDBFLTIgIDAuNSAtPiAwLjc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjYxICBwb3dlciA1OEUtMyAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjIgIHBvd2VyIDU4RSsxICAwLjUgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjMgIHBvd2VyIDU4RSsyICAwLjUgLT4gNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjQgIHBvd2VyIDU4RSszICAwLjUgLT4gMi40RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjY1ICBwb3dlciAwLjU5ICAwLjUgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY2NiAgcG93ZXIgMC4wNTkgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjY3ICBwb3dlciA1OS4wRS0xICAwLjUgLT4gMi40ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjY4ICBwb3dlciA1OS4wMEUtMiAgMC41IC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NjkgIHBvd2VyIDU5RS0zICAwLjUgLT4gMC4yNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY3MCAgcG93ZXIgNTlFKzEgIDAuNSAtPiAyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY3MSAgcG93ZXIgNTlFKzIgIDAuNSAtPiA3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY3MiAgcG93ZXIgNTlFKzMgIDAuNSAtPiAyLjRFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NzMgIHBvd2VyIDAuNjAgIDAuNSAtPiAwLjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjc0ICBwb3dlciAwLjA2MCAgMC41IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NzUgIHBvd2VyIDYwLjBFLTEgIDAuNSAtPiAyLjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2NzYgIHBvd2VyIDYwLjAwRS0yICAwLjUgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY3NyAgcG93ZXIgNjBFLTMgIDAuNSAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjc4ICBwb3dlciA2MEUrMSAgMC41IC0+IDI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjc5ICBwb3dlciA2MEUrMiAgMC41IC0+IDc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjgwICBwb3dlciA2MEUrMyAgMC41IC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY4MSAgcG93ZXIgMC42MSAgMC41IC0+IDAuNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDI2ODIgIHBvd2VyIDAuMDYxICAwLjUgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY4MyAgcG93ZXIgNjEuMEUtMSAgMC41IC0+IDIuNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY4NCAgcG93ZXIgNjEuMDBFLTIgIDAuNSAtPiAwLjc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjg1ICBwb3dlciA2MUUtMyAgMC41IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2ODYgIHBvd2VyIDYxRSsxICAwLjUgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2ODcgIHBvd2VyIDYxRSsyICAwLjUgLT4gNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDI2ODggIHBvd2VyIDYxRSszICAwLjUgLT4gMi41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjg5ICBwb3dlciAwLjYyICAwLjUgLT4gMC43OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY5MCAgcG93ZXIgMC4wNjIgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjkxICBwb3dlciA2Mi4wRS0xICAwLjUgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjkyICBwb3dlciA2Mi4wMEUtMiAgMC41IC0+IDAuNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2OTMgIHBvd2VyIDYyRS0zICAwLjUgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY5NCAgcG93ZXIgNjJFKzEgIDAuNSAtPiAyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY5NSAgcG93ZXIgNjJFKzIgIDAuNSAtPiA3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjY5NiAgcG93ZXIgNjJFKzMgIDAuNSAtPiAyLjVFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2OTcgIHBvd2VyIDAuNjMgIDAuNSAtPiAwLjc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNjk4ICBwb3dlciAwLjA2MyAgMC41IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI2OTkgIHBvd2VyIDYzLjBFLTEgIDAuNSAtPiAyLjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MDAgIHBvd2VyIDYzLjAwRS0yICAwLjUgLT4gMC43OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcwMSAgcG93ZXIgNjNFLTMgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzAyICBwb3dlciA2M0UrMSAgMC41IC0+IDI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzAzICBwb3dlciA2M0UrMiAgMC41IC0+IDc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzA0ICBwb3dlciA2M0UrMyAgMC41IC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcwNSAgcG93ZXIgMC42NCAgMC41IC0+IDAuODAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcwNiAgcG93ZXIgMC4wNjQgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzA3ICBwb3dlciA2NC4wRS0xICAwLjUgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzA4ICBwb3dlciA2NC4wMEUtMiAgMC41IC0+IDAuODAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcwOSAgcG93ZXIgNjRFLTMgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzEwICBwb3dlciA2NEUrMSAgMC41IC0+IDI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzExICBwb3dlciA2NEUrMiAgMC41IC0+IDgwIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MTIgIHBvd2VyIDY0RSszICAwLjUgLT4gMi41RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzEzICBwb3dlciAwLjY1ICAwLjUgLT4gMC44MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcxNCAgcG93ZXIgMC4wNjUgIDAuNSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzE1ICBwb3dlciA2NS4wRS0xICAwLjUgLT4gMi41ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzE2ICBwb3dlciA2NS4wMEUtMiAgMC41IC0+IDAuODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MTcgIHBvd2VyIDY1RS0zICAwLjUgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcxOCAgcG93ZXIgNjVFKzEgIDAuNSAtPiAyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcxOSAgcG93ZXIgNjVFKzIgIDAuNSAtPiA4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcyMCAgcG93ZXIgNjVFKzMgIDAuNSAtPiAyLjVFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MjEgIHBvd2VyIDAuNjYgIDAuNSAtPiAwLjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzIyICBwb3dlciAwLjA2NiAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MjMgIHBvd2VyIDY2LjBFLTEgIDAuNSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MjQgIHBvd2VyIDY2LjAwRS0yICAwLjUgLT4gMC44MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcyNSAgcG93ZXIgNjZFLTMgIDAuNSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzI2ICBwb3dlciA2NkUrMSAgMC41IC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzI3ICBwb3dlciA2NkUrMiAgMC41IC0+IDgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzI4ICBwb3dlciA2NkUrMyAgMC41IC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjcyOSAgcG93ZXIgMC42NyAgMC41IC0+IDAuODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MzAgIHBvd2VyIDAuMDY3ICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjczMSAgcG93ZXIgNjcuMEUtMSAgMC41IC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjczMiAgcG93ZXIgNjcuMDBFLTIgIDAuNSAtPiAwLjgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzMzICBwb3dlciA2N0UtMyAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MzQgIHBvd2VyIDY3RSsxICAwLjUgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MzUgIHBvd2VyIDY3RSsyICAwLjUgLT4gODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3MzYgIHBvd2VyIDY3RSszICAwLjUgLT4gMi42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzM3ICBwb3dlciAwLjY4ICAwLjUgLT4gMC44MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjczOCAgcG93ZXIgMC4wNjggIDAuNSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzM5ICBwb3dlciA2OC4wRS0xICAwLjUgLT4gMi42ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzQwICBwb3dlciA2OC4wMEUtMiAgMC41IC0+IDAuODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NDEgIHBvd2VyIDY4RS0zICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0MiAgcG93ZXIgNjhFKzEgIDAuNSAtPiAyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0MyAgcG93ZXIgNjhFKzIgIDAuNSAtPiA4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0NCAgcG93ZXIgNjhFKzMgIDAuNSAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NDUgIHBvd2VyIDAuNjkgIDAuNSAtPiAwLjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzQ2ICBwb3dlciAwLjA2OSAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NDcgIHBvd2VyIDY5LjBFLTEgIDAuNSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NDggIHBvd2VyIDY5LjAwRS0yICAwLjUgLT4gMC44MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc0OSAgcG93ZXIgNjlFLTMgIDAuNSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzUwICBwb3dlciA2OUUrMSAgMC41IC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzUxICBwb3dlciA2OUUrMiAgMC41IC0+IDgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzUyICBwb3dlciA2OUUrMyAgMC41IC0+IDIuNkUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc1MyAgcG93ZXIgMC43MCAgMC41IC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NTQgIHBvd2VyIDAuMDcwICAwLjUgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc1NSAgcG93ZXIgNzAuMEUtMSAgMC41IC0+IDIuNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc1NiAgcG93ZXIgNzAuMDBFLTIgIDAuNSAtPiAwLjg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzU3ICBwb3dlciA3MEUtMyAgMC41IC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NTggIHBvd2VyIDcwRSsxICAwLjUgLT4gMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NTkgIHBvd2VyIDcwRSsyICAwLjUgLT4gODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NjAgIHBvd2VyIDcwRSszICAwLjUgLT4gMi42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzYxICBwb3dlciAwLjcxICAwLjUgLT4gMC44NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc2MiAgcG93ZXIgMC4wNzEgIDAuNSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzYzICBwb3dlciA3MS4wRS0xICAwLjUgLT4gMi43ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzY0ICBwb3dlciA3MS4wMEUtMiAgMC41IC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NjUgIHBvd2VyIDcxRS0zICAwLjUgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc2NiAgcG93ZXIgNzFFKzEgIDAuNSAtPiAyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc2NyAgcG93ZXIgNzFFKzIgIDAuNSAtPiA4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc2OCAgcG93ZXIgNzFFKzMgIDAuNSAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NjkgIHBvd2VyIDAuNzIgIDAuNSAtPiAwLjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzcwICBwb3dlciAwLjA3MiAgMC41IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NzEgIHBvd2VyIDcyLjBFLTEgIDAuNSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NzIgIHBvd2VyIDcyLjAwRS0yICAwLjUgLT4gMC44NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc3MyAgcG93ZXIgNzJFLTMgIDAuNSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzc0ICBwb3dlciA3MkUrMSAgMC41IC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzc1ICBwb3dlciA3MkUrMiAgMC41IC0+IDg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzc2ICBwb3dlciA3MkUrMyAgMC41IC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc3NyAgcG93ZXIgMC43MyAgMC41IC0+IDAuODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3NzggIHBvd2VyIDAuMDczICAwLjUgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc3OSAgcG93ZXIgNzMuMEUtMSAgMC41IC0+IDIuNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc4MCAgcG93ZXIgNzMuMDBFLTIgIDAuNSAtPiAwLjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzgxICBwb3dlciA3M0UtMyAgMC41IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODIgIHBvd2VyIDczRSsxICAwLjUgLT4gMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODMgIHBvd2VyIDczRSsyICAwLjUgLT4gODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODQgIHBvd2VyIDczRSszICAwLjUgLT4gMi43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzg1ICBwb3dlciAwLjc0ICAwLjUgLT4gMC44NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc4NiAgcG93ZXIgMC4wNzQgIDAuNSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzg3ICBwb3dlciA3NC4wRS0xICAwLjUgLT4gMi43ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzg4ICBwb3dlciA3NC4wMEUtMiAgMC41IC0+IDAuODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3ODkgIHBvd2VyIDc0RS0zICAwLjUgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc5MCAgcG93ZXIgNzRFKzEgIDAuNSAtPiAyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc5MSAgcG93ZXIgNzRFKzIgIDAuNSAtPiA4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc5MiAgcG93ZXIgNzRFKzMgIDAuNSAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3OTMgIHBvd2VyIDAuNzUgIDAuNSAtPiAwLjg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzk0ICBwb3dlciAwLjA3NSAgMC41IC0+IDAuMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3OTUgIHBvd2VyIDc1LjBFLTEgIDAuNSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI3OTYgIHBvd2VyIDc1LjAwRS0yICAwLjUgLT4gMC44NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjc5NyAgcG93ZXIgNzVFLTMgIDAuNSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzk4ICBwb3dlciA3NUUrMSAgMC41IC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyNzk5ICBwb3dlciA3NUUrMiAgMC41IC0+IDg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODAwICBwb3dlciA3NUUrMyAgMC41IC0+IDIuN0UrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgwMSAgcG93ZXIgMC43NiAgMC41IC0+IDAuODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MDIgIHBvd2VyIDAuMDc2ICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgwMyAgcG93ZXIgNzYuMEUtMSAgMC41IC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgwNCAgcG93ZXIgNzYuMDBFLTIgIDAuNSAtPiAwLjg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODA1ICBwb3dlciA3NkUtMyAgMC41IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MDYgIHBvd2VyIDc2RSsxICAwLjUgLT4gMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MDcgIHBvd2VyIDc2RSsyICAwLjUgLT4gODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MDggIHBvd2VyIDc2RSszICAwLjUgLT4gMi44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODA5ICBwb3dlciAwLjc3ICAwLjUgLT4gMC44OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgxMCAgcG93ZXIgMC4wNzcgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODExICBwb3dlciA3Ny4wRS0xICAwLjUgLT4gMi44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODEyICBwb3dlciA3Ny4wMEUtMiAgMC41IC0+IDAuODggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MTMgIHBvd2VyIDc3RS0zICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgxNCAgcG93ZXIgNzdFKzEgIDAuNSAtPiAyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgxNSAgcG93ZXIgNzdFKzIgIDAuNSAtPiA4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgxNiAgcG93ZXIgNzdFKzMgIDAuNSAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MTcgIHBvd2VyIDAuNzggIDAuNSAtPiAwLjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODE4ICBwb3dlciAwLjA3OCAgMC41IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MTkgIHBvd2VyIDc4LjBFLTEgIDAuNSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MjAgIHBvd2VyIDc4LjAwRS0yICAwLjUgLT4gMC44OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgyMSAgcG93ZXIgNzhFLTMgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODIyICBwb3dlciA3OEUrMSAgMC41IC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODIzICBwb3dlciA3OEUrMiAgMC41IC0+IDg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODI0ICBwb3dlciA3OEUrMyAgMC41IC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgyNSAgcG93ZXIgMC43OSAgMC41IC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MjYgIHBvd2VyIDAuMDc5ICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgyNyAgcG93ZXIgNzkuMEUtMSAgMC41IC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgyOCAgcG93ZXIgNzkuMDBFLTIgIDAuNSAtPiAwLjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODI5ICBwb3dlciA3OUUtMyAgMC41IC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MzAgIHBvd2VyIDc5RSsxICAwLjUgLT4gMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MzEgIHBvd2VyIDc5RSsyICAwLjUgLT4gODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MzIgIHBvd2VyIDc5RSszICAwLjUgLT4gMi44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODMzICBwb3dlciAwLjgwICAwLjUgLT4gMC44OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgzNCAgcG93ZXIgMC4wODAgIDAuNSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODM1ICBwb3dlciA4MC4wRS0xICAwLjUgLT4gMi44ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODM2ICBwb3dlciA4MC4wMEUtMiAgMC41IC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4MzcgIHBvd2VyIDgwRS0zICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgzOCAgcG93ZXIgODBFKzEgIDAuNSAtPiAyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjgzOSAgcG93ZXIgODBFKzIgIDAuNSAtPiA4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0MCAgcG93ZXIgODBFKzMgIDAuNSAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NDEgIHBvd2VyIDAuODEgIDAuNSAtPiAwLjkwIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NDIgIHBvd2VyIDAuMDgxICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0MyAgcG93ZXIgODEuMEUtMSAgMC41IC0+IDIuOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0NCAgcG93ZXIgODEuMDBFLTIgIDAuNSAtPiAwLjkwIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NDUgIHBvd2VyIDgxRS0zICAwLjUgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0NiAgcG93ZXIgODFFKzEgIDAuNSAtPiAyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0NyAgcG93ZXIgODFFKzIgIDAuNSAtPiA5MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODQ4ICBwb3dlciA4MUUrMyAgMC41IC0+IDIuOEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg0OSAgcG93ZXIgMC44MiAgMC41IC0+IDAuOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NTAgIHBvd2VyIDAuMDgyICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg1MSAgcG93ZXIgODIuMEUtMSAgMC41IC0+IDIuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg1MiAgcG93ZXIgODIuMDBFLTIgIDAuNSAtPiAwLjkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODUzICBwb3dlciA4MkUtMyAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NTQgIHBvd2VyIDgyRSsxICAwLjUgLT4gMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NTUgIHBvd2VyIDgyRSsyICAwLjUgLT4gOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NTYgIHBvd2VyIDgyRSszICAwLjUgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODU3ICBwb3dlciAwLjgzICAwLjUgLT4gMC45MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg1OCAgcG93ZXIgMC4wODMgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODU5ICBwb3dlciA4My4wRS0xICAwLjUgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODYwICBwb3dlciA4My4wMEUtMiAgMC41IC0+IDAuOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NjEgIHBvd2VyIDgzRS0zICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2MiAgcG93ZXIgODNFKzEgIDAuNSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2MyAgcG93ZXIgODNFKzIgIDAuNSAtPiA5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2NCAgcG93ZXIgODNFKzMgIDAuNSAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NjUgIHBvd2VyIDAuODQgIDAuNSAtPiAwLjkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODY2ICBwb3dlciAwLjA4NCAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NjcgIHBvd2VyIDg0LjBFLTEgIDAuNSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NjggIHBvd2VyIDg0LjAwRS0yICAwLjUgLT4gMC45MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg2OSAgcG93ZXIgODRFLTMgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODcwICBwb3dlciA4NEUrMSAgMC41IC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODcxICBwb3dlciA4NEUrMiAgMC41IC0+IDkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODcyICBwb3dlciA4NEUrMyAgMC41IC0+IDIuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg3MyAgcG93ZXIgMC44NSAgMC41IC0+IDAuOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NzQgIHBvd2VyIDAuMDg1ICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg3NSAgcG93ZXIgODUuMEUtMSAgMC41IC0+IDIuOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg3NiAgcG93ZXIgODUuMDBFLTIgIDAuNSAtPiAwLjkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODc3ICBwb3dlciA4NUUtMyAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NzggIHBvd2VyIDg1RSsxICAwLjUgLT4gMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4NzkgIHBvd2VyIDg1RSsyICAwLjUgLT4gOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4ODAgIHBvd2VyIDg1RSszICAwLjUgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODgxICBwb3dlciAwLjg2ICAwLjUgLT4gMC45MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg4MiAgcG93ZXIgMC4wODYgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODgzICBwb3dlciA4Ni4wRS0xICAwLjUgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODg0ICBwb3dlciA4Ni4wMEUtMiAgMC41IC0+IDAuOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4ODUgIHBvd2VyIDg2RS0zICAwLjUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg4NiAgcG93ZXIgODZFKzEgIDAuNSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg4NyAgcG93ZXIgODZFKzIgIDAuNSAtPiA5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg4OCAgcG93ZXIgODZFKzMgIDAuNSAtPiAyLjlFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4ODkgIHBvd2VyIDAuODcgIDAuNSAtPiAwLjkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODkwICBwb3dlciAwLjA4NyAgMC41IC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4OTEgIHBvd2VyIDg3LjBFLTEgIDAuNSAtPiAyLjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4OTIgIHBvd2VyIDg3LjAwRS0yICAwLjUgLT4gMC45MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg5MyAgcG93ZXIgODdFLTMgIDAuNSAtPiAwLjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODk0ICBwb3dlciA4N0UrMSAgMC41IC0+IDI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODk1ICBwb3dlciA4N0UrMiAgMC41IC0+IDkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyODk2ICBwb3dlciA4N0UrMyAgMC41IC0+IDIuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg5NyAgcG93ZXIgMC44OCAgMC41IC0+IDAuOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI4OTggIHBvd2VyIDAuMDg4ICAwLjUgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjg5OSAgcG93ZXIgODguMEUtMSAgMC41IC0+IDMuMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkwMCAgcG93ZXIgODguMDBFLTIgIDAuNSAtPiAwLjk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTAxICBwb3dlciA4OEUtMyAgMC41IC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDIgIHBvd2VyIDg4RSsxICAwLjUgLT4gMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDMgIHBvd2VyIDg4RSsyICAwLjUgLT4gOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDQgIHBvd2VyIDg4RSszICAwLjUgLT4gMy4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTA1ICBwb3dlciAwLjg5ICAwLjUgLT4gMC45NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkwNiAgcG93ZXIgMC4wODkgIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTA3ICBwb3dlciA4OS4wRS0xICAwLjUgLT4gMy4wICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTA4ICBwb3dlciA4OS4wMEUtMiAgMC41IC0+IDAuOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MDkgIHBvd2VyIDg5RS0zICAwLjUgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkxMCAgcG93ZXIgODlFKzEgIDAuNSAtPiAzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkxMSAgcG93ZXIgODlFKzIgIDAuNSAtPiA5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkxMiAgcG93ZXIgODlFKzMgIDAuNSAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MTMgIHBvd2VyIDAuOTAgIDAuNSAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTE0ICBwb3dlciAwLjA5MCAgMC41IC0+IDAuMzAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkxNSAgcG93ZXIgOTAuMEUtMSAgMC41IC0+IDMuMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTE2ICBwb3dlciA5MC4wMEUtMiAgMC41IC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MTcgIHBvd2VyIDkwRS0zICAwLjUgLT4gMC4zMCBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTE4ICBwb3dlciA5MEUrMSAgMC41IC0+IDMwIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MTkgIHBvd2VyIDkwRSsyICAwLjUgLT4gOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjAgIHBvd2VyIDkwRSszICAwLjUgLT4gMy4wRSsyIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjEgIHBvd2VyIDAuOTEgIDAuNSAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTIyICBwb3dlciAwLjA5MSAgMC41IC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjMgIHBvd2VyIDkxLjBFLTEgIDAuNSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MjQgIHBvd2VyIDkxLjAwRS0yICAwLjUgLT4gMC45NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkyNSAgcG93ZXIgOTFFLTMgIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTI2ICBwb3dlciA5MUUrMSAgMC41IC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTI3ICBwb3dlciA5MUUrMiAgMC41IC0+IDk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTI4ICBwb3dlciA5MUUrMyAgMC41IC0+IDMuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkyOSAgcG93ZXIgMC45MiAgMC41IC0+IDAuOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MzAgIHBvd2VyIDAuMDkyICAwLjUgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkzMSAgcG93ZXIgOTIuMEUtMSAgMC41IC0+IDMuMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkzMiAgcG93ZXIgOTIuMDBFLTIgIDAuNSAtPiAwLjk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTMzICBwb3dlciA5MkUtMyAgMC41IC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MzQgIHBvd2VyIDkyRSsxICAwLjUgLT4gMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MzUgIHBvd2VyIDkyRSsyICAwLjUgLT4gOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5MzYgIHBvd2VyIDkyRSszICAwLjUgLT4gMy4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTM3ICBwb3dlciAwLjkzICAwLjUgLT4gMC45NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MjkzOCAgcG93ZXIgMC4wOTMgIDAuNSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTM5ICBwb3dlciA5My4wRS0xICAwLjUgLT4gMy4wICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTQwICBwb3dlciA5My4wMEUtMiAgMC41IC0+IDAuOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NDEgIHBvd2VyIDkzRS0zICAwLjUgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0MiAgcG93ZXIgOTNFKzEgIDAuNSAtPiAzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0MyAgcG93ZXIgOTNFKzIgIDAuNSAtPiA5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0NCAgcG93ZXIgOTNFKzMgIDAuNSAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NDUgIHBvd2VyIDAuOTQgIDAuNSAtPiAwLjk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTQ2ICBwb3dlciAwLjA5NCAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NDcgIHBvd2VyIDk0LjBFLTEgIDAuNSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NDggIHBvd2VyIDk0LjAwRS0yICAwLjUgLT4gMC45NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk0OSAgcG93ZXIgOTRFLTMgIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTUwICBwb3dlciA5NEUrMSAgMC41IC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTUxICBwb3dlciA5NEUrMiAgMC41IC0+IDk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTUyICBwb3dlciA5NEUrMyAgMC41IC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk1MyAgcG93ZXIgMC45NSAgMC41IC0+IDAuOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NTQgIHBvd2VyIDAuMDk1ICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk1NSAgcG93ZXIgOTUuMEUtMSAgMC41IC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk1NiAgcG93ZXIgOTUuMDBFLTIgIDAuNSAtPiAwLjk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTU3ICBwb3dlciA5NUUtMyAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NTggIHBvd2VyIDk1RSsxICAwLjUgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NTkgIHBvd2VyIDk1RSsyICAwLjUgLT4gOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NjAgIHBvd2VyIDk1RSszICAwLjUgLT4gMy4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTYxICBwb3dlciAwLjk2ICAwLjUgLT4gMC45OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk2MiAgcG93ZXIgMC4wOTYgIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTYzICBwb3dlciA5Ni4wRS0xICAwLjUgLT4gMy4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTY0ICBwb3dlciA5Ni4wMEUtMiAgMC41IC0+IDAuOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NjUgIHBvd2VyIDk2RS0zICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk2NiAgcG93ZXIgOTZFKzEgIDAuNSAtPiAzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk2NyAgcG93ZXIgOTZFKzIgIDAuNSAtPiA5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk2OCAgcG93ZXIgOTZFKzMgIDAuNSAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NjkgIHBvd2VyIDAuOTcgIDAuNSAtPiAwLjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTcwICBwb3dlciAwLjA5NyAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NzEgIHBvd2VyIDk3LjBFLTEgIDAuNSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NzIgIHBvd2VyIDk3LjAwRS0yICAwLjUgLT4gMC45OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk3MyAgcG93ZXIgOTdFLTMgIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTc0ICBwb3dlciA5N0UrMSAgMC41IC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTc1ICBwb3dlciA5N0UrMiAgMC41IC0+IDk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTc2ICBwb3dlciA5N0UrMyAgMC41IC0+IDMuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk3NyAgcG93ZXIgMC45OCAgMC41IC0+IDAuOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5NzggIHBvd2VyIDAuMDk4ICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk3OSAgcG93ZXIgOTguMEUtMSAgMC41IC0+IDMuMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk4MCAgcG93ZXIgOTguMDBFLTIgIDAuNSAtPiAwLjk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTgxICBwb3dlciA5OEUtMyAgMC41IC0+IDAuMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODIgIHBvd2VyIDk4RSsxICAwLjUgLT4gMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODMgIHBvd2VyIDk4RSsyICAwLjUgLT4gOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODQgIHBvd2VyIDk4RSszICAwLjUgLT4gMy4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTg1ICBwb3dlciAwLjk5ICAwLjUgLT4gMC45OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk4NiAgcG93ZXIgMC4wOTkgIDAuNSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTg3ICBwb3dlciA5OS4wRS0xICAwLjUgLT4gMy4xICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gyOTg4ICBwb3dlciA5OS4wMEUtMiAgMC41IC0+IDAuOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDI5ODkgIHBvd2VyIDk5RS0zICAwLjUgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk5MCAgcG93ZXIgOTlFKzEgIDAuNSAtPiAzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk5MSAgcG93ZXIgOTlFKzIgIDAuNSAtPiA5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mjk5MiAgcG93ZXIgOTlFKzMgIDAuNSAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorCistLSBQcmVjaXNpb24gMyBzcXVhcmVyb290IHRlc3RzIFtleGhhdXN0aXZlLCBmIGFuZCBmLzEwXQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogICAzCitwd3N4MzAwMSAgcG93ZXIgMC4xICAwLjUgLT4gMC4zMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMDIgIHBvd2VyIDAuMDEgIDAuNSAtPiAwLjEwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwMyAgcG93ZXIgMC4yICAwLjUgLT4gMC40NDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMDQgIHBvd2VyIDAuMDIgIDAuNSAtPiAwLjE0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwNSAgcG93ZXIgMC4zICAwLjUgLT4gMC41NDggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMDYgIHBvd2VyIDAuMDMgIDAuNSAtPiAwLjE3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwNyAgcG93ZXIgMC40ICAwLjUgLT4gMC42MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMDggIHBvd2VyIDAuMDQgIDAuNSAtPiAwLjIwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAwOSAgcG93ZXIgMC41ICAwLjUgLT4gMC43MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMTAgIHBvd2VyIDAuMDUgIDAuNSAtPiAwLjIyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxMSAgcG93ZXIgMC42ICAwLjUgLT4gMC43NzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMTIgIHBvd2VyIDAuMDYgIDAuNSAtPiAwLjI0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxMyAgcG93ZXIgMC43ICAwLjUgLT4gMC44MzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMTQgIHBvd2VyIDAuMDcgIDAuNSAtPiAwLjI2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxNSAgcG93ZXIgMC44ICAwLjUgLT4gMC44OTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMTYgIHBvd2VyIDAuMDggIDAuNSAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxNyAgcG93ZXIgMC45ICAwLjUgLT4gMC45NDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMTggIHBvd2VyIDAuMDkgIDAuNSAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAxOSAgcG93ZXIgMC4xMSAgMC41IC0+IDAuMzMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDIwICBwb3dlciAwLjAxMSAgMC41IC0+IDAuMTA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDIxICBwb3dlciAwLjEyICAwLjUgLT4gMC4zNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjIgIHBvd2VyIDAuMDEyICAwLjUgLT4gMC4xMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjMgIHBvd2VyIDAuMTMgIDAuNSAtPiAwLjM2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAyNCAgcG93ZXIgMC4wMTMgIDAuNSAtPiAwLjExNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAyNSAgcG93ZXIgMC4xNCAgMC41IC0+IDAuMzc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDI2ICBwb3dlciAwLjAxNCAgMC41IC0+IDAuMTE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDI3ICBwb3dlciAwLjE1ICAwLjUgLT4gMC4zODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjggIHBvd2VyIDAuMDE1ICAwLjUgLT4gMC4xMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMjkgIHBvd2VyIDAuMTYgIDAuNSAtPiAwLjQwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAzMCAgcG93ZXIgMC4wMTYgIDAuNSAtPiAwLjEyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAzMSAgcG93ZXIgMC4xNyAgMC41IC0+IDAuNDEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDMyICBwb3dlciAwLjAxNyAgMC41IC0+IDAuMTMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDMzICBwb3dlciAwLjE4ICAwLjUgLT4gMC40MjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMzQgIHBvd2VyIDAuMDE4ICAwLjUgLT4gMC4xMzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwMzUgIHBvd2VyIDAuMTkgIDAuNSAtPiAwLjQzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAzNiAgcG93ZXIgMC4wMTkgIDAuNSAtPiAwLjEzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzAzNyAgcG93ZXIgMC4yMSAgMC41IC0+IDAuNDU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDM4ICBwb3dlciAwLjAyMSAgMC41IC0+IDAuMTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDM5ICBwb3dlciAwLjIyICAwLjUgLT4gMC40NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNDAgIHBvd2VyIDAuMDIyICAwLjUgLT4gMC4xNDggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNDEgIHBvd2VyIDAuMjMgIDAuNSAtPiAwLjQ4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0MiAgcG93ZXIgMC4wMjMgIDAuNSAtPiAwLjE1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0MyAgcG93ZXIgMC4yNCAgMC41IC0+IDAuNDkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDQ0ICBwb3dlciAwLjAyNCAgMC41IC0+IDAuMTU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDQ1ICBwb3dlciAwLjI1ICAwLjUgLT4gMC41MDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNDYgIHBvd2VyIDAuMDI1ICAwLjUgLT4gMC4xNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNDcgIHBvd2VyIDAuMjYgIDAuNSAtPiAwLjUxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0OCAgcG93ZXIgMC4wMjYgIDAuNSAtPiAwLjE2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA0OSAgcG93ZXIgMC4yNyAgMC41IC0+IDAuNTIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDUwICBwb3dlciAwLjAyNyAgMC41IC0+IDAuMTY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDUxICBwb3dlciAwLjI4ICAwLjUgLT4gMC41MjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTIgIHBvd2VyIDAuMDI4ICAwLjUgLT4gMC4xNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTMgIHBvd2VyIDAuMjkgIDAuNSAtPiAwLjUzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA1NCAgcG93ZXIgMC4wMjkgIDAuNSAtPiAwLjE3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA1NSAgcG93ZXIgMC4zMSAgMC41IC0+IDAuNTU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDU2ICBwb3dlciAwLjAzMSAgMC41IC0+IDAuMTc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDU3ICBwb3dlciAwLjMyICAwLjUgLT4gMC41NjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTggIHBvd2VyIDAuMDMyICAwLjUgLT4gMC4xNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNTkgIHBvd2VyIDAuMzMgIDAuNSAtPiAwLjU3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA2MCAgcG93ZXIgMC4wMzMgIDAuNSAtPiAwLjE4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA2MSAgcG93ZXIgMC4zNCAgMC41IC0+IDAuNTgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDYyICBwb3dlciAwLjAzNCAgMC41IC0+IDAuMTg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDYzICBwb3dlciAwLjM1ICAwLjUgLT4gMC41OTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNjQgIHBvd2VyIDAuMDM1ICAwLjUgLT4gMC4xODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNjUgIHBvd2VyIDAuMzYgIDAuNSAtPiAwLjYwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA2NiAgcG93ZXIgMC4wMzYgIDAuNSAtPiAwLjE5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA2NyAgcG93ZXIgMC4zNyAgMC41IC0+IDAuNjA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDY4ICBwb3dlciAwLjAzNyAgMC41IC0+IDAuMTkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDY5ICBwb3dlciAwLjM4ICAwLjUgLT4gMC42MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNzAgIHBvd2VyIDAuMDM4ICAwLjUgLT4gMC4xOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNzEgIHBvd2VyIDAuMzkgIDAuNSAtPiAwLjYyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3MiAgcG93ZXIgMC4wMzkgIDAuNSAtPiAwLjE5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3MyAgcG93ZXIgMC40MSAgMC41IC0+IDAuNjQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDc0ICBwb3dlciAwLjA0MSAgMC41IC0+IDAuMjAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDc1ICBwb3dlciAwLjQyICAwLjUgLT4gMC42NDggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNzYgIHBvd2VyIDAuMDQyICAwLjUgLT4gMC4yMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwNzcgIHBvd2VyIDAuNDMgIDAuNSAtPiAwLjY1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3OCAgcG93ZXIgMC4wNDMgIDAuNSAtPiAwLjIwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA3OSAgcG93ZXIgMC40NCAgMC41IC0+IDAuNjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDgwICBwb3dlciAwLjA0NCAgMC41IC0+IDAuMjEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDgxICBwb3dlciAwLjQ1ICAwLjUgLT4gMC42NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODIgIHBvd2VyIDAuMDQ1ICAwLjUgLT4gMC4yMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODMgIHBvd2VyIDAuNDYgIDAuNSAtPiAwLjY3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA4NCAgcG93ZXIgMC4wNDYgIDAuNSAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA4NSAgcG93ZXIgMC40NyAgMC41IC0+IDAuNjg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDg2ICBwb3dlciAwLjA0NyAgMC41IC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDg3ICBwb3dlciAwLjQ4ICAwLjUgLT4gMC42OTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODggIHBvd2VyIDAuMDQ4ICAwLjUgLT4gMC4yMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwODkgIHBvd2VyIDAuNDkgIDAuNSAtPiAwLjcwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA5MCAgcG93ZXIgMC4wNDkgIDAuNSAtPiAwLjIyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA5MSAgcG93ZXIgMC41MSAgMC41IC0+IDAuNzE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDkyICBwb3dlciAwLjA1MSAgMC41IC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDkzICBwb3dlciAwLjUyICAwLjUgLT4gMC43MjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMwOTQgIHBvd2VyIDAuMDUyICAwLjUgLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDMwOTUgIHBvd2VyIDAuNTMgIDAuNSAtPiAwLjcyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA5NiAgcG93ZXIgMC4wNTMgIDAuNSAtPiAwLjIzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzA5NyAgcG93ZXIgMC41NCAgMC41IC0+IDAuNzM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDk4ICBwb3dlciAwLjA1NCAgMC41IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMDk5ICBwb3dlciAwLjU1ICAwLjUgLT4gMC43NDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMDAgIHBvd2VyIDAuMDU1ICAwLjUgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMDEgIHBvd2VyIDAuNTYgIDAuNSAtPiAwLjc0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwMiAgcG93ZXIgMC4wNTYgIDAuNSAtPiAwLjIzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwMyAgcG93ZXIgMC41NyAgMC41IC0+IDAuNzU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTA0ICBwb3dlciAwLjA1NyAgMC41IC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTA1ICBwb3dlciAwLjU4ICAwLjUgLT4gMC43NjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMDYgIHBvd2VyIDAuMDU4ICAwLjUgLT4gMC4yNDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMDcgIHBvd2VyIDAuNTkgIDAuNSAtPiAwLjc2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwOCAgcG93ZXIgMC4wNTkgIDAuNSAtPiAwLjI0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEwOSAgcG93ZXIgMC42MSAgMC41IC0+IDAuNzgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTEwICBwb3dlciAwLjA2MSAgMC41IC0+IDAuMjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTExICBwb3dlciAwLjYyICAwLjUgLT4gMC43ODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTIgIHBvd2VyIDAuMDYyICAwLjUgLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTMgIHBvd2VyIDAuNjMgIDAuNSAtPiAwLjc5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzExNCAgcG93ZXIgMC4wNjMgIDAuNSAtPiAwLjI1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzExNSAgcG93ZXIgMC42NCAgMC41IC0+IDAuODAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTE2ICBwb3dlciAwLjA2NCAgMC41IC0+IDAuMjUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTE3ICBwb3dlciAwLjY1ICAwLjUgLT4gMC44MDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTggIHBvd2VyIDAuMDY1ICAwLjUgLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMTkgIHBvd2VyIDAuNjYgIDAuNSAtPiAwLjgxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEyMCAgcG93ZXIgMC4wNjYgIDAuNSAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEyMSAgcG93ZXIgMC42NyAgMC41IC0+IDAuODE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTIyICBwb3dlciAwLjA2NyAgMC41IC0+IDAuMjU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTIzICBwb3dlciAwLjY4ICAwLjUgLT4gMC44MjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMjQgIHBvd2VyIDAuMDY4ICAwLjUgLT4gMC4yNjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMjUgIHBvd2VyIDAuNjkgIDAuNSAtPiAwLjgzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEyNiAgcG93ZXIgMC4wNjkgIDAuNSAtPiAwLjI2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEyNyAgcG93ZXIgMC43MSAgMC41IC0+IDAuODQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTI4ICBwb3dlciAwLjA3MSAgMC41IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTI5ICBwb3dlciAwLjcyICAwLjUgLT4gMC44NDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMzAgIHBvd2VyIDAuMDcyICAwLjUgLT4gMC4yNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMzEgIHBvd2VyIDAuNzMgIDAuNSAtPiAwLjg1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzMiAgcG93ZXIgMC4wNzMgIDAuNSAtPiAwLjI3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzMyAgcG93ZXIgMC43NCAgMC41IC0+IDAuODYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTM0ICBwb3dlciAwLjA3NCAgMC41IC0+IDAuMjcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTM1ICBwb3dlciAwLjc1ICAwLjUgLT4gMC44NjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMzYgIHBvd2VyIDAuMDc1ICAwLjUgLT4gMC4yNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxMzcgIHBvd2VyIDAuNzYgIDAuNSAtPiAwLjg3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzOCAgcG93ZXIgMC4wNzYgIDAuNSAtPiAwLjI3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzEzOSAgcG93ZXIgMC43NyAgMC41IC0+IDAuODc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTQwICBwb3dlciAwLjA3NyAgMC41IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTQxICBwb3dlciAwLjc4ICAwLjUgLT4gMC44ODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDIgIHBvd2VyIDAuMDc4ICAwLjUgLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDMgIHBvd2VyIDAuNzkgIDAuNSAtPiAwLjg4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE0NCAgcG93ZXIgMC4wNzkgIDAuNSAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE0NSAgcG93ZXIgMC44MSAgMC41IC0+IDAuOTAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTQ2ICBwb3dlciAwLjA4MSAgMC41IC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTQ3ICBwb3dlciAwLjgyICAwLjUgLT4gMC45MDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDggIHBvd2VyIDAuMDgyICAwLjUgLT4gMC4yODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNDkgIHBvd2VyIDAuODMgIDAuNSAtPiAwLjkxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE1MCAgcG93ZXIgMC4wODMgIDAuNSAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE1MSAgcG93ZXIgMC44NCAgMC41IC0+IDAuOTE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTUyICBwb3dlciAwLjA4NCAgMC41IC0+IDAuMjkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTUzICBwb3dlciAwLjg1ICAwLjUgLT4gMC45MjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNTQgIHBvd2VyIDAuMDg1ICAwLjUgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNTUgIHBvd2VyIDAuODYgIDAuNSAtPiAwLjkyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE1NiAgcG93ZXIgMC4wODYgIDAuNSAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE1NyAgcG93ZXIgMC44NyAgMC41IC0+IDAuOTMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTU4ICBwb3dlciAwLjA4NyAgMC41IC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTU5ICBwb3dlciAwLjg4ICAwLjUgLT4gMC45MzggIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNjAgIHBvd2VyIDAuMDg4ICAwLjUgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNjEgIHBvd2VyIDAuODkgIDAuNSAtPiAwLjk0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2MiAgcG93ZXIgMC4wODkgIDAuNSAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2MyAgcG93ZXIgMC45MSAgMC41IC0+IDAuOTU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTY0ICBwb3dlciAwLjA5MSAgMC41IC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTY1ICBwb3dlciAwLjkyICAwLjUgLT4gMC45NTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNjYgIHBvd2VyIDAuMDkyICAwLjUgLT4gMC4zMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNjcgIHBvd2VyIDAuOTMgIDAuNSAtPiAwLjk2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2OCAgcG93ZXIgMC4wOTMgIDAuNSAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE2OSAgcG93ZXIgMC45NCAgMC41IC0+IDAuOTcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTcwICBwb3dlciAwLjA5NCAgMC41IC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTcxICBwb3dlciAwLjk1ICAwLjUgLT4gMC45NzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzIgIHBvd2VyIDAuMDk1ICAwLjUgLT4gMC4zMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzMgIHBvd2VyIDAuOTYgIDAuNSAtPiAwLjk4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE3NCAgcG93ZXIgMC4wOTYgIDAuNSAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE3NSAgcG93ZXIgMC45NyAgMC41IC0+IDAuOTg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTc2ICBwb3dlciAwLjA5NyAgMC41IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTc3ICBwb3dlciAwLjk4ICAwLjUgLT4gMC45OTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzggIHBvd2VyIDAuMDk4ICAwLjUgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxNzkgIHBvd2VyIDAuOTkgIDAuNSAtPiAwLjk5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4MCAgcG93ZXIgMC4wOTkgIDAuNSAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4MSAgcG93ZXIgMC4xMDEgIDAuNSAtPiAwLjMxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4MiAgcG93ZXIgMC4wMTAxICAwLjUgLT4gMC4xMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxODMgIHBvd2VyIDAuMTAyICAwLjUgLT4gMC4zMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxODQgIHBvd2VyIDAuMDEwMiAgMC41IC0+IDAuMTAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTg1ICBwb3dlciAwLjEwMyAgMC41IC0+IDAuMzIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTg2ICBwb3dlciAwLjAxMDMgIDAuNSAtPiAwLjEwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4NyAgcG93ZXIgMC4xMDQgIDAuNSAtPiAwLjMyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE4OCAgcG93ZXIgMC4wMTA0ICAwLjUgLT4gMC4xMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxODkgIHBvd2VyIDAuMTA1ICAwLjUgLT4gMC4zMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxOTAgIHBvd2VyIDAuMDEwNSAgMC41IC0+IDAuMTAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTkxICBwb3dlciAwLjEwNiAgMC41IC0+IDAuMzI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTkyICBwb3dlciAwLjAxMDYgIDAuNSAtPiAwLjEwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE5MyAgcG93ZXIgMC4xMDcgIDAuNSAtPiAwLjMyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE5NCAgcG93ZXIgMC4wMTA3ICAwLjUgLT4gMC4xMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxOTUgIHBvd2VyIDAuMTA4ICAwLjUgLT4gMC4zMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMxOTYgIHBvd2VyIDAuMDEwOCAgMC41IC0+IDAuMTA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTk3ICBwb3dlciAwLjEwOSAgMC41IC0+IDAuMzMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMTk4ICBwb3dlciAwLjAxMDkgIDAuNSAtPiAwLjEwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzE5OSAgcG93ZXIgMC4xMTEgIDAuNSAtPiAwLjMzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIwMCAgcG93ZXIgMC4wMTExICAwLjUgLT4gMC4xMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMDEgIHBvd2VyIDAuMTEyICAwLjUgLT4gMC4zMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMDIgIHBvd2VyIDAuMDExMiAgMC41IC0+IDAuMTA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjAzICBwb3dlciAwLjExMyAgMC41IC0+IDAuMzM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjA0ICBwb3dlciAwLjAxMTMgIDAuNSAtPiAwLjEwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIwNSAgcG93ZXIgMC4xMTQgIDAuNSAtPiAwLjMzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIwNiAgcG93ZXIgMC4wMTE0ICAwLjUgLT4gMC4xMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMDcgIHBvd2VyIDAuMTE1ICAwLjUgLT4gMC4zMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMDggIHBvd2VyIDAuMDExNSAgMC41IC0+IDAuMTA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjA5ICBwb3dlciAwLjExNiAgMC41IC0+IDAuMzQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjEwICBwb3dlciAwLjAxMTYgIDAuNSAtPiAwLjEwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIxMSAgcG93ZXIgMC4xMTcgIDAuNSAtPiAwLjM0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIxMiAgcG93ZXIgMC4wMTE3ICAwLjUgLT4gMC4xMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMTMgIHBvd2VyIDAuMTE4ICAwLjUgLT4gMC4zNDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMTQgIHBvd2VyIDAuMDExOCAgMC41IC0+IDAuMTA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjE1ICBwb3dlciAwLjExOSAgMC41IC0+IDAuMzQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjE2ICBwb3dlciAwLjAxMTkgIDAuNSAtPiAwLjEwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIxNyAgcG93ZXIgMC4xMjEgIDAuNSAtPiAwLjM0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIxOCAgcG93ZXIgMC4wMTIxICAwLjUgLT4gMC4xMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMTkgIHBvd2VyIDAuMTIyICAwLjUgLT4gMC4zNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMjAgIHBvd2VyIDAuMDEyMiAgMC41IC0+IDAuMTEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjIxICBwb3dlciAwLjEyMyAgMC41IC0+IDAuMzUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjIyICBwb3dlciAwLjAxMjMgIDAuNSAtPiAwLjExMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIyMyAgcG93ZXIgMC4xMjQgIDAuNSAtPiAwLjM1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIyNCAgcG93ZXIgMC4wMTI0ICAwLjUgLT4gMC4xMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMjUgIHBvd2VyIDAuMTI1ICAwLjUgLT4gMC4zNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMjYgIHBvd2VyIDAuMDEyNSAgMC41IC0+IDAuMTEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjI3ICBwb3dlciAwLjEyNiAgMC41IC0+IDAuMzU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjI4ICBwb3dlciAwLjAxMjYgIDAuNSAtPiAwLjExMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIyOSAgcG93ZXIgMC4xMjcgIDAuNSAtPiAwLjM1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIzMCAgcG93ZXIgMC4wMTI3ICAwLjUgLT4gMC4xMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMzEgIHBvd2VyIDAuMTI4ICAwLjUgLT4gMC4zNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMzIgIHBvd2VyIDAuMDEyOCAgMC41IC0+IDAuMTEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjMzICBwb3dlciAwLjEyOSAgMC41IC0+IDAuMzU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjM0ICBwb3dlciAwLjAxMjkgIDAuNSAtPiAwLjExNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIzNSAgcG93ZXIgMC4xMzEgIDAuNSAtPiAwLjM2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzIzNiAgcG93ZXIgMC4wMTMxICAwLjUgLT4gMC4xMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMzcgIHBvd2VyIDAuMTMyICAwLjUgLT4gMC4zNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyMzggIHBvd2VyIDAuMDEzMiAgMC41IC0+IDAuMTE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjM5ICBwb3dlciAwLjEzMyAgMC41IC0+IDAuMzY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjQwICBwb3dlciAwLjAxMzMgIDAuNSAtPiAwLjExNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI0MSAgcG93ZXIgMC4xMzQgIDAuNSAtPiAwLjM2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI0MiAgcG93ZXIgMC4wMTM0ICAwLjUgLT4gMC4xMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNDMgIHBvd2VyIDAuMTM1ICAwLjUgLT4gMC4zNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNDQgIHBvd2VyIDAuMDEzNSAgMC41IC0+IDAuMTE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjQ1ICBwb3dlciAwLjEzNiAgMC41IC0+IDAuMzY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjQ2ICBwb3dlciAwLjAxMzYgIDAuNSAtPiAwLjExNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI0NyAgcG93ZXIgMC4xMzcgIDAuNSAtPiAwLjM3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI0OCAgcG93ZXIgMC4wMTM3ICAwLjUgLT4gMC4xMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNDkgIHBvd2VyIDAuMTM4ICAwLjUgLT4gMC4zNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNTAgIHBvd2VyIDAuMDEzOCAgMC41IC0+IDAuMTE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjUxICBwb3dlciAwLjEzOSAgMC41IC0+IDAuMzczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjUyICBwb3dlciAwLjAxMzkgIDAuNSAtPiAwLjExOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI1MyAgcG93ZXIgMC4xNDEgIDAuNSAtPiAwLjM3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI1NCAgcG93ZXIgMC4wMTQxICAwLjUgLT4gMC4xMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNTUgIHBvd2VyIDAuMTQyICAwLjUgLT4gMC4zNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNTYgIHBvd2VyIDAuMDE0MiAgMC41IC0+IDAuMTE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjU3ICBwb3dlciAwLjE0MyAgMC41IC0+IDAuMzc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjU4ICBwb3dlciAwLjAxNDMgIDAuNSAtPiAwLjEyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI1OSAgcG93ZXIgMC4xNDQgIDAuNSAtPiAwLjM3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI2MCAgcG93ZXIgMC4wMTQ0ICAwLjUgLT4gMC4xMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNjEgIHBvd2VyIDAuMTQ1ICAwLjUgLT4gMC4zODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNjIgIHBvd2VyIDAuMDE0NSAgMC41IC0+IDAuMTIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjYzICBwb3dlciAwLjE0NiAgMC41IC0+IDAuMzgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjY0ICBwb3dlciAwLjAxNDYgIDAuNSAtPiAwLjEyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI2NSAgcG93ZXIgMC4xNDcgIDAuNSAtPiAwLjM4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI2NiAgcG93ZXIgMC4wMTQ3ICAwLjUgLT4gMC4xMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNjcgIHBvd2VyIDAuMTQ4ICAwLjUgLT4gMC4zODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNjggIHBvd2VyIDAuMDE0OCAgMC41IC0+IDAuMTIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjY5ICBwb3dlciAwLjE0OSAgMC41IC0+IDAuMzg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjcwICBwb3dlciAwLjAxNDkgIDAuNSAtPiAwLjEyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI3MSAgcG93ZXIgMC4xNTEgIDAuNSAtPiAwLjM4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI3MiAgcG93ZXIgMC4wMTUxICAwLjUgLT4gMC4xMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNzMgIHBvd2VyIDAuMTUyICAwLjUgLT4gMC4zOTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNzQgIHBvd2VyIDAuMDE1MiAgMC41IC0+IDAuMTIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjc1ICBwb3dlciAwLjE1MyAgMC41IC0+IDAuMzkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjc2ICBwb3dlciAwLjAxNTMgIDAuNSAtPiAwLjEyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI3NyAgcG93ZXIgMC4xNTQgIDAuNSAtPiAwLjM5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI3OCAgcG93ZXIgMC4wMTU0ICAwLjUgLT4gMC4xMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyNzkgIHBvd2VyIDAuMTU1ICAwLjUgLT4gMC4zOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyODAgIHBvd2VyIDAuMDE1NSAgMC41IC0+IDAuMTI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjgxICBwb3dlciAwLjE1NiAgMC41IC0+IDAuMzk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjgyICBwb3dlciAwLjAxNTYgIDAuNSAtPiAwLjEyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI4MyAgcG93ZXIgMC4xNTcgIDAuNSAtPiAwLjM5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI4NCAgcG93ZXIgMC4wMTU3ICAwLjUgLT4gMC4xMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyODUgIHBvd2VyIDAuMTU4ICAwLjUgLT4gMC4zOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyODYgIHBvd2VyIDAuMDE1OCAgMC41IC0+IDAuMTI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjg3ICBwb3dlciAwLjE1OSAgMC41IC0+IDAuMzk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjg4ICBwb3dlciAwLjAxNTkgIDAuNSAtPiAwLjEyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI4OSAgcG93ZXIgMC4xNjEgIDAuNSAtPiAwLjQwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI5MCAgcG93ZXIgMC4wMTYxICAwLjUgLT4gMC4xMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyOTEgIHBvd2VyIDAuMTYyICAwLjUgLT4gMC40MDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyOTIgIHBvd2VyIDAuMDE2MiAgMC41IC0+IDAuMTI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjkzICBwb3dlciAwLjE2MyAgMC41IC0+IDAuNDA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjk0ICBwb3dlciAwLjAxNjMgIDAuNSAtPiAwLjEyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI5NSAgcG93ZXIgMC4xNjQgIDAuNSAtPiAwLjQwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzI5NiAgcG93ZXIgMC4wMTY0ICAwLjUgLT4gMC4xMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDMyOTcgIHBvd2VyIDAuMTY1ICAwLjUgLT4gMC40MDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMyOTggIHBvd2VyIDAuMDE2NSAgMC41IC0+IDAuMTI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMjk5ICBwb3dlciAwLjE2NiAgMC41IC0+IDAuNDA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzAwICBwb3dlciAwLjAxNjYgIDAuNSAtPiAwLjEyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMwMSAgcG93ZXIgMC4xNjcgIDAuNSAtPiAwLjQwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMwMiAgcG93ZXIgMC4wMTY3ICAwLjUgLT4gMC4xMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMDMgIHBvd2VyIDAuMTY4ICAwLjUgLT4gMC40MTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMDQgIHBvd2VyIDAuMDE2OCAgMC41IC0+IDAuMTMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzA1ICBwb3dlciAwLjE2OSAgMC41IC0+IDAuNDExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzA2ICBwb3dlciAwLjAxNjkgIDAuNSAtPiAwLjEzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMwNyAgcG93ZXIgMC4xNzEgIDAuNSAtPiAwLjQxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMwOCAgcG93ZXIgMC4wMTcxICAwLjUgLT4gMC4xMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMDkgIHBvd2VyIDAuMTcyICAwLjUgLT4gMC40MTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMTAgIHBvd2VyIDAuMDE3MiAgMC41IC0+IDAuMTMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzExICBwb3dlciAwLjE3MyAgMC41IC0+IDAuNDE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzEyICBwb3dlciAwLjAxNzMgIDAuNSAtPiAwLjEzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMxMyAgcG93ZXIgMC4xNzQgIDAuNSAtPiAwLjQxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMxNCAgcG93ZXIgMC4wMTc0ICAwLjUgLT4gMC4xMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMTUgIHBvd2VyIDAuMTc1ICAwLjUgLT4gMC40MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMTYgIHBvd2VyIDAuMDE3NSAgMC41IC0+IDAuMTMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzE3ICBwb3dlciAwLjE3NiAgMC41IC0+IDAuNDIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzE4ICBwb3dlciAwLjAxNzYgIDAuNSAtPiAwLjEzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMxOSAgcG93ZXIgMC4xNzcgIDAuNSAtPiAwLjQyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMyMCAgcG93ZXIgMC4wMTc3ICAwLjUgLT4gMC4xMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMjEgIHBvd2VyIDAuMTc4ICAwLjUgLT4gMC40MjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMjIgIHBvd2VyIDAuMDE3OCAgMC41IC0+IDAuMTMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzIzICBwb3dlciAwLjE3OSAgMC41IC0+IDAuNDIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzI0ICBwb3dlciAwLjAxNzkgIDAuNSAtPiAwLjEzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMyNSAgcG93ZXIgMC4xODEgIDAuNSAtPiAwLjQyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMyNiAgcG93ZXIgMC4wMTgxICAwLjUgLT4gMC4xMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMjcgIHBvd2VyIDAuMTgyICAwLjUgLT4gMC40MjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMjggIHBvd2VyIDAuMDE4MiAgMC41IC0+IDAuMTM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzI5ICBwb3dlciAwLjE4MyAgMC41IC0+IDAuNDI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzMwICBwb3dlciAwLjAxODMgIDAuNSAtPiAwLjEzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMzMSAgcG93ZXIgMC4xODQgIDAuNSAtPiAwLjQyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMzMiAgcG93ZXIgMC4wMTg0ICAwLjUgLT4gMC4xMzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMzMgIHBvd2VyIDAuMTg1ICAwLjUgLT4gMC40MzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMzQgIHBvd2VyIDAuMDE4NSAgMC41IC0+IDAuMTM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzM1ICBwb3dlciAwLjE4NiAgMC41IC0+IDAuNDMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzM2ICBwb3dlciAwLjAxODYgIDAuNSAtPiAwLjEzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMzNyAgcG93ZXIgMC4xODcgIDAuNSAtPiAwLjQzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzMzOCAgcG93ZXIgMC4wMTg3ICAwLjUgLT4gMC4xMzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzMzkgIHBvd2VyIDAuMTg4ICAwLjUgLT4gMC40MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNDAgIHBvd2VyIDAuMDE4OCAgMC41IC0+IDAuMTM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzQxICBwb3dlciAwLjE4OSAgMC41IC0+IDAuNDM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzQyICBwb3dlciAwLjAxODkgIDAuNSAtPiAwLjEzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM0MyAgcG93ZXIgMC4xOTEgIDAuNSAtPiAwLjQzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM0NCAgcG93ZXIgMC4wMTkxICAwLjUgLT4gMC4xMzggIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNDUgIHBvd2VyIDAuMTkyICAwLjUgLT4gMC40MzggIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNDYgIHBvd2VyIDAuMDE5MiAgMC41IC0+IDAuMTM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzQ3ICBwb3dlciAwLjE5MyAgMC41IC0+IDAuNDM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzQ4ICBwb3dlciAwLjAxOTMgIDAuNSAtPiAwLjEzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM0OSAgcG93ZXIgMC4xOTQgIDAuNSAtPiAwLjQ0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM1MCAgcG93ZXIgMC4wMTk0ICAwLjUgLT4gMC4xMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNTEgIHBvd2VyIDAuMTk1ICAwLjUgLT4gMC40NDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNTIgIHBvd2VyIDAuMDE5NSAgMC41IC0+IDAuMTQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzUzICBwb3dlciAwLjE5NiAgMC41IC0+IDAuNDQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzU0ICBwb3dlciAwLjAxOTYgIDAuNSAtPiAwLjE0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM1NSAgcG93ZXIgMC4xOTcgIDAuNSAtPiAwLjQ0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM1NiAgcG93ZXIgMC4wMTk3ICAwLjUgLT4gMC4xNDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNTcgIHBvd2VyIDAuMTk4ICAwLjUgLT4gMC40NDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNTggIHBvd2VyIDAuMDE5OCAgMC41IC0+IDAuMTQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzU5ICBwb3dlciAwLjE5OSAgMC41IC0+IDAuNDQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzYwICBwb3dlciAwLjAxOTkgIDAuNSAtPiAwLjE0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM2MSAgcG93ZXIgMC4yMDEgIDAuNSAtPiAwLjQ0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM2MiAgcG93ZXIgMC4wMjAxICAwLjUgLT4gMC4xNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNjMgIHBvd2VyIDAuMjAyICAwLjUgLT4gMC40NDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNjQgIHBvd2VyIDAuMDIwMiAgMC41IC0+IDAuMTQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzY1ICBwb3dlciAwLjIwMyAgMC41IC0+IDAuNDUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzY2ICBwb3dlciAwLjAyMDMgIDAuNSAtPiAwLjE0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM2NyAgcG93ZXIgMC4yMDQgIDAuNSAtPiAwLjQ1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM2OCAgcG93ZXIgMC4wMjA0ICAwLjUgLT4gMC4xNDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNjkgIHBvd2VyIDAuMjA1ICAwLjUgLT4gMC40NTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNzAgIHBvd2VyIDAuMDIwNSAgMC41IC0+IDAuMTQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzcxICBwb3dlciAwLjIwNiAgMC41IC0+IDAuNDU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzcyICBwb3dlciAwLjAyMDYgIDAuNSAtPiAwLjE0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM3MyAgcG93ZXIgMC4yMDcgIDAuNSAtPiAwLjQ1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM3NCAgcG93ZXIgMC4wMjA3ICAwLjUgLT4gMC4xNDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNzUgIHBvd2VyIDAuMjA4ICAwLjUgLT4gMC40NTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzNzYgIHBvd2VyIDAuMDIwOCAgMC41IC0+IDAuMTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzc3ICBwb3dlciAwLjIwOSAgMC41IC0+IDAuNDU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzc4ICBwb3dlciAwLjAyMDkgIDAuNSAtPiAwLjE0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM3OSAgcG93ZXIgMC4yMTEgIDAuNSAtPiAwLjQ1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM4MCAgcG93ZXIgMC4wMjExICAwLjUgLT4gMC4xNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzODEgIHBvd2VyIDAuMjEyICAwLjUgLT4gMC40NjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzODIgIHBvd2VyIDAuMDIxMiAgMC41IC0+IDAuMTQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzgzICBwb3dlciAwLjIxMyAgMC41IC0+IDAuNDYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzg0ICBwb3dlciAwLjAyMTMgIDAuNSAtPiAwLjE0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM4NSAgcG93ZXIgMC4yMTQgIDAuNSAtPiAwLjQ2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM4NiAgcG93ZXIgMC4wMjE0ICAwLjUgLT4gMC4xNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzODcgIHBvd2VyIDAuMjE1ICAwLjUgLT4gMC40NjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzODggIHBvd2VyIDAuMDIxNSAgMC41IC0+IDAuMTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzg5ICBwb3dlciAwLjIxNiAgMC41IC0+IDAuNDY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzkwICBwb3dlciAwLjAyMTYgIDAuNSAtPiAwLjE0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM5MSAgcG93ZXIgMC4yMTcgIDAuNSAtPiAwLjQ2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM5MiAgcG93ZXIgMC4wMjE3ICAwLjUgLT4gMC4xNDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzOTMgIHBvd2VyIDAuMjE4ICAwLjUgLT4gMC40NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzOTQgIHBvd2VyIDAuMDIxOCAgMC41IC0+IDAuMTQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzk1ICBwb3dlciAwLjIxOSAgMC41IC0+IDAuNDY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzMzk2ICBwb3dlciAwLjAyMTkgIDAuNSAtPiAwLjE0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM5NyAgcG93ZXIgMC4yMjEgIDAuNSAtPiAwLjQ3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzM5OCAgcG93ZXIgMC4wMjIxICAwLjUgLT4gMC4xNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDMzOTkgIHBvd2VyIDAuMjIyICAwLjUgLT4gMC40NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MDAgIHBvd2VyIDAuMDIyMiAgMC41IC0+IDAuMTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDAxICBwb3dlciAwLjIyMyAgMC41IC0+IDAuNDcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDAyICBwb3dlciAwLjAyMjMgIDAuNSAtPiAwLjE0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQwMyAgcG93ZXIgMC4yMjQgIDAuNSAtPiAwLjQ3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQwNCAgcG93ZXIgMC4wMjI0ICAwLjUgLT4gMC4xNTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MDUgIHBvd2VyIDAuMjI1ICAwLjUgLT4gMC40NzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MDYgIHBvd2VyIDAuMDIyNSAgMC41IC0+IDAuMTUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDA3ICBwb3dlciAwLjIyNiAgMC41IC0+IDAuNDc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDA4ICBwb3dlciAwLjAyMjYgIDAuNSAtPiAwLjE1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQwOSAgcG93ZXIgMC4yMjcgIDAuNSAtPiAwLjQ3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQxMCAgcG93ZXIgMC4wMjI3ICAwLjUgLT4gMC4xNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MTEgIHBvd2VyIDAuMjI4ICAwLjUgLT4gMC40NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MTIgIHBvd2VyIDAuMDIyOCAgMC41IC0+IDAuMTUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDEzICBwb3dlciAwLjIyOSAgMC41IC0+IDAuNDc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDE0ICBwb3dlciAwLjAyMjkgIDAuNSAtPiAwLjE1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQxNSAgcG93ZXIgMC4yMzEgIDAuNSAtPiAwLjQ4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQxNiAgcG93ZXIgMC4wMjMxICAwLjUgLT4gMC4xNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MTcgIHBvd2VyIDAuMjMyICAwLjUgLT4gMC40ODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MTggIHBvd2VyIDAuMDIzMiAgMC41IC0+IDAuMTUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDE5ICBwb3dlciAwLjIzMyAgMC41IC0+IDAuNDgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDIwICBwb3dlciAwLjAyMzMgIDAuNSAtPiAwLjE1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQyMSAgcG93ZXIgMC4yMzQgIDAuNSAtPiAwLjQ4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQyMiAgcG93ZXIgMC4wMjM0ICAwLjUgLT4gMC4xNTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MjMgIHBvd2VyIDAuMjM1ICAwLjUgLT4gMC40ODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MjQgIHBvd2VyIDAuMDIzNSAgMC41IC0+IDAuMTUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDI1ICBwb3dlciAwLjIzNiAgMC41IC0+IDAuNDg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDI2ICBwb3dlciAwLjAyMzYgIDAuNSAtPiAwLjE1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQyNyAgcG93ZXIgMC4yMzcgIDAuNSAtPiAwLjQ4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQyOCAgcG93ZXIgMC4wMjM3ICAwLjUgLT4gMC4xNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MjkgIHBvd2VyIDAuMjM4ICAwLjUgLT4gMC40ODggIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MzAgIHBvd2VyIDAuMDIzOCAgMC41IC0+IDAuMTU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDMxICBwb3dlciAwLjIzOSAgMC41IC0+IDAuNDg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDMyICBwb3dlciAwLjAyMzkgIDAuNSAtPiAwLjE1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQzMyAgcG93ZXIgMC4yNDEgIDAuNSAtPiAwLjQ5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQzNCAgcG93ZXIgMC4wMjQxICAwLjUgLT4gMC4xNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MzUgIHBvd2VyIDAuMjQyICAwLjUgLT4gMC40OTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0MzYgIHBvd2VyIDAuMDI0MiAgMC41IC0+IDAuMTU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDM3ICBwb3dlciAwLjI0MyAgMC41IC0+IDAuNDkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDM4ICBwb3dlciAwLjAyNDMgIDAuNSAtPiAwLjE1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQzOSAgcG93ZXIgMC4yNDQgIDAuNSAtPiAwLjQ5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ0MCAgcG93ZXIgMC4wMjQ0ICAwLjUgLT4gMC4xNTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NDEgIHBvd2VyIDAuMjQ1ICAwLjUgLT4gMC40OTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NDIgIHBvd2VyIDAuMDI0NSAgMC41IC0+IDAuMTU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDQzICBwb3dlciAwLjI0NiAgMC41IC0+IDAuNDk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDQ0ICBwb3dlciAwLjAyNDYgIDAuNSAtPiAwLjE1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ0NSAgcG93ZXIgMC4yNDcgIDAuNSAtPiAwLjQ5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ0NiAgcG93ZXIgMC4wMjQ3ICAwLjUgLT4gMC4xNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NDcgIHBvd2VyIDAuMjQ4ICAwLjUgLT4gMC40OTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NDggIHBvd2VyIDAuMDI0OCAgMC41IC0+IDAuMTU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDQ5ICBwb3dlciAwLjI0OSAgMC41IC0+IDAuNDk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDUwICBwb3dlciAwLjAyNDkgIDAuNSAtPiAwLjE1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ1MSAgcG93ZXIgMC4yNTEgIDAuNSAtPiAwLjUwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ1MiAgcG93ZXIgMC4wMjUxICAwLjUgLT4gMC4xNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NTMgIHBvd2VyIDAuMjUyICAwLjUgLT4gMC41MDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NTQgIHBvd2VyIDAuMDI1MiAgMC41IC0+IDAuMTU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDU1ICBwb3dlciAwLjI1MyAgMC41IC0+IDAuNTAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDU2ICBwb3dlciAwLjAyNTMgIDAuNSAtPiAwLjE1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ1NyAgcG93ZXIgMC4yNTQgIDAuNSAtPiAwLjUwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ1OCAgcG93ZXIgMC4wMjU0ICAwLjUgLT4gMC4xNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NTkgIHBvd2VyIDAuMjU1ICAwLjUgLT4gMC41MDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NjAgIHBvd2VyIDAuMDI1NSAgMC41IC0+IDAuMTYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDYxICBwb3dlciAwLjI1NiAgMC41IC0+IDAuNTA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDYyICBwb3dlciAwLjAyNTYgIDAuNSAtPiAwLjE2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ2MyAgcG93ZXIgMC4yNTcgIDAuNSAtPiAwLjUwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ2NCAgcG93ZXIgMC4wMjU3ICAwLjUgLT4gMC4xNjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NjUgIHBvd2VyIDAuMjU4ICAwLjUgLT4gMC41MDggIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NjYgIHBvd2VyIDAuMDI1OCAgMC41IC0+IDAuMTYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDY3ICBwb3dlciAwLjI1OSAgMC41IC0+IDAuNTA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDY4ICBwb3dlciAwLjAyNTkgIDAuNSAtPiAwLjE2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ2OSAgcG93ZXIgMC4yNjEgIDAuNSAtPiAwLjUxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ3MCAgcG93ZXIgMC4wMjYxICAwLjUgLT4gMC4xNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NzEgIHBvd2VyIDAuMjYyICAwLjUgLT4gMC41MTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NzIgIHBvd2VyIDAuMDI2MiAgMC41IC0+IDAuMTYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDczICBwb3dlciAwLjI2MyAgMC41IC0+IDAuNTEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDc0ICBwb3dlciAwLjAyNjMgIDAuNSAtPiAwLjE2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ3NSAgcG93ZXIgMC4yNjQgIDAuNSAtPiAwLjUxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ3NiAgcG93ZXIgMC4wMjY0ICAwLjUgLT4gMC4xNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NzcgIHBvd2VyIDAuMjY1ICAwLjUgLT4gMC41MTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0NzggIHBvd2VyIDAuMDI2NSAgMC41IC0+IDAuMTYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDc5ICBwb3dlciAwLjI2NiAgMC41IC0+IDAuNTE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDgwICBwb3dlciAwLjAyNjYgIDAuNSAtPiAwLjE2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ4MSAgcG93ZXIgMC4yNjcgIDAuNSAtPiAwLjUxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ4MiAgcG93ZXIgMC4wMjY3ICAwLjUgLT4gMC4xNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0ODMgIHBvd2VyIDAuMjY4ICAwLjUgLT4gMC41MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM0ODQgIHBvd2VyIDAuMDI2OCAgMC41IC0+IDAuMTY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDg1ICBwb3dlciAwLjI2OSAgMC41IC0+IDAuNTE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDg2ICBwb3dlciAwLjAyNjkgIDAuNSAtPiAwLjE2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ4NyAgcG93ZXIgMC4yNzEgIDAuNSAtPiAwLjUyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ4OCAgcG93ZXIgMC4wMjcxICAwLjUgLT4gMC4xNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0ODkgIHBvd2VyIDAuMjcyICAwLjUgLT4gMC41MjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0OTAgIHBvd2VyIDAuMDI3MiAgMC41IC0+IDAuMTY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDkxICBwb3dlciAwLjI3MyAgMC41IC0+IDAuNTIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDkyICBwb3dlciAwLjAyNzMgIDAuNSAtPiAwLjE2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ5MyAgcG93ZXIgMC4yNzQgIDAuNSAtPiAwLjUyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ5NCAgcG93ZXIgMC4wMjc0ICAwLjUgLT4gMC4xNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0OTUgIHBvd2VyIDAuMjc1ICAwLjUgLT4gMC41MjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM0OTYgIHBvd2VyIDAuMDI3NSAgMC41IC0+IDAuMTY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDk3ICBwb3dlciAwLjI3NiAgMC41IC0+IDAuNTI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNDk4ICBwb3dlciAwLjAyNzYgIDAuNSAtPiAwLjE2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzQ5OSAgcG93ZXIgMC4yNzcgIDAuNSAtPiAwLjUyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUwMCAgcG93ZXIgMC4wMjc3ICAwLjUgLT4gMC4xNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MDEgIHBvd2VyIDAuMjc4ICAwLjUgLT4gMC41MjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MDIgIHBvd2VyIDAuMDI3OCAgMC41IC0+IDAuMTY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTAzICBwb3dlciAwLjI3OSAgMC41IC0+IDAuNTI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTA0ICBwb3dlciAwLjAyNzkgIDAuNSAtPiAwLjE2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUwNSAgcG93ZXIgMC4yODEgIDAuNSAtPiAwLjUzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUwNiAgcG93ZXIgMC4wMjgxICAwLjUgLT4gMC4xNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MDcgIHBvd2VyIDAuMjgyICAwLjUgLT4gMC41MzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MDggIHBvd2VyIDAuMDI4MiAgMC41IC0+IDAuMTY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTA5ICBwb3dlciAwLjI4MyAgMC41IC0+IDAuNTMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTEwICBwb3dlciAwLjAyODMgIDAuNSAtPiAwLjE2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUxMSAgcG93ZXIgMC4yODQgIDAuNSAtPiAwLjUzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUxMiAgcG93ZXIgMC4wMjg0ICAwLjUgLT4gMC4xNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MTMgIHBvd2VyIDAuMjg1ICAwLjUgLT4gMC41MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MTQgIHBvd2VyIDAuMDI4NSAgMC41IC0+IDAuMTY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTE1ICBwb3dlciAwLjI4NiAgMC41IC0+IDAuNTM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTE2ICBwb3dlciAwLjAyODYgIDAuNSAtPiAwLjE2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUxNyAgcG93ZXIgMC4yODcgIDAuNSAtPiAwLjUzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUxOCAgcG93ZXIgMC4wMjg3ICAwLjUgLT4gMC4xNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MTkgIHBvd2VyIDAuMjg4ICAwLjUgLT4gMC41MzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MjAgIHBvd2VyIDAuMDI4OCAgMC41IC0+IDAuMTcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTIxICBwb3dlciAwLjI4OSAgMC41IC0+IDAuNTM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTIyICBwb3dlciAwLjAyODkgIDAuNSAtPiAwLjE3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUyMyAgcG93ZXIgMC4yOTEgIDAuNSAtPiAwLjUzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUyNCAgcG93ZXIgMC4wMjkxICAwLjUgLT4gMC4xNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MjUgIHBvd2VyIDAuMjkyICAwLjUgLT4gMC41NDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MjYgIHBvd2VyIDAuMDI5MiAgMC41IC0+IDAuMTcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTI3ICBwb3dlciAwLjI5MyAgMC41IC0+IDAuNTQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTI4ICBwb3dlciAwLjAyOTMgIDAuNSAtPiAwLjE3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUyOSAgcG93ZXIgMC4yOTQgIDAuNSAtPiAwLjU0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUzMCAgcG93ZXIgMC4wMjk0ICAwLjUgLT4gMC4xNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MzEgIHBvd2VyIDAuMjk1ICAwLjUgLT4gMC41NDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MzIgIHBvd2VyIDAuMDI5NSAgMC41IC0+IDAuMTcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTMzICBwb3dlciAwLjI5NiAgMC41IC0+IDAuNTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTM0ICBwb3dlciAwLjAyOTYgIDAuNSAtPiAwLjE3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUzNSAgcG93ZXIgMC4yOTcgIDAuNSAtPiAwLjU0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzUzNiAgcG93ZXIgMC4wMjk3ICAwLjUgLT4gMC4xNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MzcgIHBvd2VyIDAuMjk4ICAwLjUgLT4gMC41NDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1MzggIHBvd2VyIDAuMDI5OCAgMC41IC0+IDAuMTczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTM5ICBwb3dlciAwLjI5OSAgMC41IC0+IDAuNTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTQwICBwb3dlciAwLjAyOTkgIDAuNSAtPiAwLjE3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU0MSAgcG93ZXIgMC4zMDEgIDAuNSAtPiAwLjU0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU0MiAgcG93ZXIgMC4wMzAxICAwLjUgLT4gMC4xNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NDMgIHBvd2VyIDAuMzAyICAwLjUgLT4gMC41NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NDQgIHBvd2VyIDAuMDMwMiAgMC41IC0+IDAuMTc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTQ1ICBwb3dlciAwLjMwMyAgMC41IC0+IDAuNTUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTQ2ICBwb3dlciAwLjAzMDMgIDAuNSAtPiAwLjE3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU0NyAgcG93ZXIgMC4zMDQgIDAuNSAtPiAwLjU1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU0OCAgcG93ZXIgMC4wMzA0ICAwLjUgLT4gMC4xNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NDkgIHBvd2VyIDAuMzA1ICAwLjUgLT4gMC41NTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NTAgIHBvd2VyIDAuMDMwNSAgMC41IC0+IDAuMTc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTUxICBwb3dlciAwLjMwNiAgMC41IC0+IDAuNTUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTUyICBwb3dlciAwLjAzMDYgIDAuNSAtPiAwLjE3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU1MyAgcG93ZXIgMC4zMDcgIDAuNSAtPiAwLjU1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU1NCAgcG93ZXIgMC4wMzA3ICAwLjUgLT4gMC4xNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NTUgIHBvd2VyIDAuMzA4ICAwLjUgLT4gMC41NTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NTYgIHBvd2VyIDAuMDMwOCAgMC41IC0+IDAuMTc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTU3ICBwb3dlciAwLjMwOSAgMC41IC0+IDAuNTU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTU4ICBwb3dlciAwLjAzMDkgIDAuNSAtPiAwLjE3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU1OSAgcG93ZXIgMC4zMTEgIDAuNSAtPiAwLjU1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU2MCAgcG93ZXIgMC4wMzExICAwLjUgLT4gMC4xNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NjEgIHBvd2VyIDAuMzEyICAwLjUgLT4gMC41NTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NjIgIHBvd2VyIDAuMDMxMiAgMC41IC0+IDAuMTc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTYzICBwb3dlciAwLjMxMyAgMC41IC0+IDAuNTU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTY0ICBwb3dlciAwLjAzMTMgIDAuNSAtPiAwLjE3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU2NSAgcG93ZXIgMC4zMTQgIDAuNSAtPiAwLjU2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU2NiAgcG93ZXIgMC4wMzE0ICAwLjUgLT4gMC4xNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NjcgIHBvd2VyIDAuMzE1ICAwLjUgLT4gMC41NjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NjggIHBvd2VyIDAuMDMxNSAgMC41IC0+IDAuMTc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTY5ICBwb3dlciAwLjMxNiAgMC41IC0+IDAuNTYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTcwICBwb3dlciAwLjAzMTYgIDAuNSAtPiAwLjE3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU3MSAgcG93ZXIgMC4zMTcgIDAuNSAtPiAwLjU2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU3MiAgcG93ZXIgMC4wMzE3ICAwLjUgLT4gMC4xNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NzMgIHBvd2VyIDAuMzE4ICAwLjUgLT4gMC41NjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NzQgIHBvd2VyIDAuMDMxOCAgMC41IC0+IDAuMTc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTc1ICBwb3dlciAwLjMxOSAgMC41IC0+IDAuNTY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTc2ICBwb3dlciAwLjAzMTkgIDAuNSAtPiAwLjE3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU3NyAgcG93ZXIgMC4zMjEgIDAuNSAtPiAwLjU2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU3OCAgcG93ZXIgMC4wMzIxICAwLjUgLT4gMC4xNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1NzkgIHBvd2VyIDAuMzIyICAwLjUgLT4gMC41NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1ODAgIHBvd2VyIDAuMDMyMiAgMC41IC0+IDAuMTc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTgxICBwb3dlciAwLjMyMyAgMC41IC0+IDAuNTY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTgyICBwb3dlciAwLjAzMjMgIDAuNSAtPiAwLjE4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU4MyAgcG93ZXIgMC4zMjQgIDAuNSAtPiAwLjU2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU4NCAgcG93ZXIgMC4wMzI0ICAwLjUgLT4gMC4xODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1ODUgIHBvd2VyIDAuMzI1ICAwLjUgLT4gMC41NzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1ODYgIHBvd2VyIDAuMDMyNSAgMC41IC0+IDAuMTgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTg3ICBwb3dlciAwLjMyNiAgMC41IC0+IDAuNTcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTg4ICBwb3dlciAwLjAzMjYgIDAuNSAtPiAwLjE4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU4OSAgcG93ZXIgMC4zMjcgIDAuNSAtPiAwLjU3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU5MCAgcG93ZXIgMC4wMzI3ICAwLjUgLT4gMC4xODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1OTEgIHBvd2VyIDAuMzI4ICAwLjUgLT4gMC41NzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1OTIgIHBvd2VyIDAuMDMyOCAgMC41IC0+IDAuMTgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTkzICBwb3dlciAwLjMyOSAgMC41IC0+IDAuNTc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTk0ICBwb3dlciAwLjAzMjkgIDAuNSAtPiAwLjE4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU5NSAgcG93ZXIgMC4zMzEgIDAuNSAtPiAwLjU3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzU5NiAgcG93ZXIgMC4wMzMxICAwLjUgLT4gMC4xODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1OTcgIHBvd2VyIDAuMzMyICAwLjUgLT4gMC41NzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM1OTggIHBvd2VyIDAuMDMzMiAgMC41IC0+IDAuMTgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNTk5ICBwb3dlciAwLjMzMyAgMC41IC0+IDAuNTc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjAwICBwb3dlciAwLjAzMzMgIDAuNSAtPiAwLjE4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYwMSAgcG93ZXIgMC4zMzQgIDAuNSAtPiAwLjU3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYwMiAgcG93ZXIgMC4wMzM0ICAwLjUgLT4gMC4xODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MDMgIHBvd2VyIDAuMzM1ICAwLjUgLT4gMC41NzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MDQgIHBvd2VyIDAuMDMzNSAgMC41IC0+IDAuMTgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjA1ICBwb3dlciAwLjMzNiAgMC41IC0+IDAuNTgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjA2ICBwb3dlciAwLjAzMzYgIDAuNSAtPiAwLjE4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYwNyAgcG93ZXIgMC4zMzcgIDAuNSAtPiAwLjU4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYwOCAgcG93ZXIgMC4wMzM3ICAwLjUgLT4gMC4xODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MDkgIHBvd2VyIDAuMzM4ICAwLjUgLT4gMC41ODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MTAgIHBvd2VyIDAuMDMzOCAgMC41IC0+IDAuMTg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjExICBwb3dlciAwLjMzOSAgMC41IC0+IDAuNTgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjEyICBwb3dlciAwLjAzMzkgIDAuNSAtPiAwLjE4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYxMyAgcG93ZXIgMC4zNDEgIDAuNSAtPiAwLjU4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYxNCAgcG93ZXIgMC4wMzQxICAwLjUgLT4gMC4xODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MTUgIHBvd2VyIDAuMzQyICAwLjUgLT4gMC41ODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MTYgIHBvd2VyIDAuMDM0MiAgMC41IC0+IDAuMTg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjE3ICBwb3dlciAwLjM0MyAgMC41IC0+IDAuNTg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjE4ICBwb3dlciAwLjAzNDMgIDAuNSAtPiAwLjE4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYxOSAgcG93ZXIgMC4zNDQgIDAuNSAtPiAwLjU4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYyMCAgcG93ZXIgMC4wMzQ0ICAwLjUgLT4gMC4xODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MjEgIHBvd2VyIDAuMzQ1ICAwLjUgLT4gMC41ODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MjIgIHBvd2VyIDAuMDM0NSAgMC41IC0+IDAuMTg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjIzICBwb3dlciAwLjM0NiAgMC41IC0+IDAuNTg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjI0ICBwb3dlciAwLjAzNDYgIDAuNSAtPiAwLjE4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYyNSAgcG93ZXIgMC4zNDcgIDAuNSAtPiAwLjU4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYyNiAgcG93ZXIgMC4wMzQ3ICAwLjUgLT4gMC4xODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MjcgIHBvd2VyIDAuMzQ4ICAwLjUgLT4gMC41OTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MjggIHBvd2VyIDAuMDM0OCAgMC41IC0+IDAuMTg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjI5ICBwb3dlciAwLjM0OSAgMC41IC0+IDAuNTkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjMwICBwb3dlciAwLjAzNDkgIDAuNSAtPiAwLjE4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYzMSAgcG93ZXIgMC4zNTEgIDAuNSAtPiAwLjU5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYzMiAgcG93ZXIgMC4wMzUxICAwLjUgLT4gMC4xODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MzMgIHBvd2VyIDAuMzUyICAwLjUgLT4gMC41OTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MzQgIHBvd2VyIDAuMDM1MiAgMC41IC0+IDAuMTg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjM1ICBwb3dlciAwLjM1MyAgMC41IC0+IDAuNTk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjM2ICBwb3dlciAwLjAzNTMgIDAuNSAtPiAwLjE4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYzNyAgcG93ZXIgMC4zNTQgIDAuNSAtPiAwLjU5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzYzOCAgcG93ZXIgMC4wMzU0ICAwLjUgLT4gMC4xODggIEluZXhhY3QgUm91bmRlZAorcHdzeDM2MzkgIHBvd2VyIDAuMzU1ICAwLjUgLT4gMC41OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NDAgIHBvd2VyIDAuMDM1NSAgMC41IC0+IDAuMTg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjQxICBwb3dlciAwLjM1NiAgMC41IC0+IDAuNTk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjQyICBwb3dlciAwLjAzNTYgIDAuNSAtPiAwLjE4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY0MyAgcG93ZXIgMC4zNTcgIDAuNSAtPiAwLjU5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY0NCAgcG93ZXIgMC4wMzU3ICAwLjUgLT4gMC4xODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NDUgIHBvd2VyIDAuMzU4ICAwLjUgLT4gMC41OTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NDYgIHBvd2VyIDAuMDM1OCAgMC41IC0+IDAuMTg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjQ3ICBwb3dlciAwLjM1OSAgMC41IC0+IDAuNTk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjQ4ICBwb3dlciAwLjAzNTkgIDAuNSAtPiAwLjE4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY0OSAgcG93ZXIgMC4zNjEgIDAuNSAtPiAwLjYwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY1MCAgcG93ZXIgMC4wMzYxICAwLjUgLT4gMC4xOTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NTEgIHBvd2VyIDAuMzYyICAwLjUgLT4gMC42MDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NTIgIHBvd2VyIDAuMDM2MiAgMC41IC0+IDAuMTkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjUzICBwb3dlciAwLjM2MyAgMC41IC0+IDAuNjAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjU0ICBwb3dlciAwLjAzNjMgIDAuNSAtPiAwLjE5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY1NSAgcG93ZXIgMC4zNjQgIDAuNSAtPiAwLjYwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY1NiAgcG93ZXIgMC4wMzY0ICAwLjUgLT4gMC4xOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NTcgIHBvd2VyIDAuMzY1ICAwLjUgLT4gMC42MDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NTggIHBvd2VyIDAuMDM2NSAgMC41IC0+IDAuMTkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjU5ICBwb3dlciAwLjM2NiAgMC41IC0+IDAuNjA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjYwICBwb3dlciAwLjAzNjYgIDAuNSAtPiAwLjE5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY2MSAgcG93ZXIgMC4zNjcgIDAuNSAtPiAwLjYwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY2MiAgcG93ZXIgMC4wMzY3ICAwLjUgLT4gMC4xOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NjMgIHBvd2VyIDAuMzY4ICAwLjUgLT4gMC42MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NjQgIHBvd2VyIDAuMDM2OCAgMC41IC0+IDAuMTkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjY1ICBwb3dlciAwLjM2OSAgMC41IC0+IDAuNjA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjY2ICBwb3dlciAwLjAzNjkgIDAuNSAtPiAwLjE5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY2NyAgcG93ZXIgMC4zNzEgIDAuNSAtPiAwLjYwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY2OCAgcG93ZXIgMC4wMzcxICAwLjUgLT4gMC4xOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NjkgIHBvd2VyIDAuMzcyICAwLjUgLT4gMC42MTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NzAgIHBvd2VyIDAuMDM3MiAgMC41IC0+IDAuMTkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjcxICBwb3dlciAwLjM3MyAgMC41IC0+IDAuNjExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjcyICBwb3dlciAwLjAzNzMgIDAuNSAtPiAwLjE5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY3MyAgcG93ZXIgMC4zNzQgIDAuNSAtPiAwLjYxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY3NCAgcG93ZXIgMC4wMzc0ICAwLjUgLT4gMC4xOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NzUgIHBvd2VyIDAuMzc1ICAwLjUgLT4gMC42MTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2NzYgIHBvd2VyIDAuMDM3NSAgMC41IC0+IDAuMTk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjc3ICBwb3dlciAwLjM3NiAgMC41IC0+IDAuNjEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjc4ICBwb3dlciAwLjAzNzYgIDAuNSAtPiAwLjE5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY3OSAgcG93ZXIgMC4zNzcgIDAuNSAtPiAwLjYxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY4MCAgcG93ZXIgMC4wMzc3ICAwLjUgLT4gMC4xOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2ODEgIHBvd2VyIDAuMzc4ICAwLjUgLT4gMC42MTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2ODIgIHBvd2VyIDAuMDM3OCAgMC41IC0+IDAuMTk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjgzICBwb3dlciAwLjM3OSAgMC41IC0+IDAuNjE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjg0ICBwb3dlciAwLjAzNzkgIDAuNSAtPiAwLjE5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY4NSAgcG93ZXIgMC4zODEgIDAuNSAtPiAwLjYxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY4NiAgcG93ZXIgMC4wMzgxICAwLjUgLT4gMC4xOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2ODcgIHBvd2VyIDAuMzgyICAwLjUgLT4gMC42MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM2ODggIHBvd2VyIDAuMDM4MiAgMC41IC0+IDAuMTk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjg5ICBwb3dlciAwLjM4MyAgMC41IC0+IDAuNjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjkwICBwb3dlciAwLjAzODMgIDAuNSAtPiAwLjE5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY5MSAgcG93ZXIgMC4zODQgIDAuNSAtPiAwLjYyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY5MiAgcG93ZXIgMC4wMzg0ICAwLjUgLT4gMC4xOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2OTMgIHBvd2VyIDAuMzg1ICAwLjUgLT4gMC42MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2OTQgIHBvd2VyIDAuMDM4NSAgMC41IC0+IDAuMTk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjk1ICBwb3dlciAwLjM4NiAgMC41IC0+IDAuNjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNjk2ICBwb3dlciAwLjAzODYgIDAuNSAtPiAwLjE5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY5NyAgcG93ZXIgMC4zODcgIDAuNSAtPiAwLjYyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzY5OCAgcG93ZXIgMC4wMzg3ICAwLjUgLT4gMC4xOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM2OTkgIHBvd2VyIDAuMzg4ICAwLjUgLT4gMC42MjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MDAgIHBvd2VyIDAuMDM4OCAgMC41IC0+IDAuMTk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzAxICBwb3dlciAwLjM4OSAgMC41IC0+IDAuNjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzAyICBwb3dlciAwLjAzODkgIDAuNSAtPiAwLjE5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcwMyAgcG93ZXIgMC4zOTEgIDAuNSAtPiAwLjYyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcwNCAgcG93ZXIgMC4wMzkxICAwLjUgLT4gMC4xOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MDUgIHBvd2VyIDAuMzkyICAwLjUgLT4gMC42MjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MDYgIHBvd2VyIDAuMDM5MiAgMC41IC0+IDAuMTk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzA3ICBwb3dlciAwLjM5MyAgMC41IC0+IDAuNjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzA4ICBwb3dlciAwLjAzOTMgIDAuNSAtPiAwLjE5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcwOSAgcG93ZXIgMC4zOTQgIDAuNSAtPiAwLjYyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcxMCAgcG93ZXIgMC4wMzk0ICAwLjUgLT4gMC4xOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MTEgIHBvd2VyIDAuMzk1ICAwLjUgLT4gMC42MjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MTIgIHBvd2VyIDAuMDM5NSAgMC41IC0+IDAuMTk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzEzICBwb3dlciAwLjM5NiAgMC41IC0+IDAuNjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzE0ICBwb3dlciAwLjAzOTYgIDAuNSAtPiAwLjE5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcxNSAgcG93ZXIgMC4zOTcgIDAuNSAtPiAwLjYzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcxNiAgcG93ZXIgMC4wMzk3ICAwLjUgLT4gMC4xOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MTcgIHBvd2VyIDAuMzk4ICAwLjUgLT4gMC42MzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MTggIHBvd2VyIDAuMDM5OCAgMC41IC0+IDAuMTk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzE5ICBwb3dlciAwLjM5OSAgMC41IC0+IDAuNjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzIwICBwb3dlciAwLjAzOTkgIDAuNSAtPiAwLjIwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcyMSAgcG93ZXIgMC40MDEgIDAuNSAtPiAwLjYzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcyMiAgcG93ZXIgMC4wNDAxICAwLjUgLT4gMC4yMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MjMgIHBvd2VyIDAuNDAyICAwLjUgLT4gMC42MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MjQgIHBvd2VyIDAuMDQwMiAgMC41IC0+IDAuMjAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzI1ICBwb3dlciAwLjQwMyAgMC41IC0+IDAuNjM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzI2ICBwb3dlciAwLjA0MDMgIDAuNSAtPiAwLjIwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcyNyAgcG93ZXIgMC40MDQgIDAuNSAtPiAwLjYzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzcyOCAgcG93ZXIgMC4wNDA0ICAwLjUgLT4gMC4yMDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MjkgIHBvd2VyIDAuNDA1ICAwLjUgLT4gMC42MzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MzAgIHBvd2VyIDAuMDQwNSAgMC41IC0+IDAuMjAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzMxICBwb3dlciAwLjQwNiAgMC41IC0+IDAuNjM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzMyICBwb3dlciAwLjA0MDYgIDAuNSAtPiAwLjIwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzczMyAgcG93ZXIgMC40MDcgIDAuNSAtPiAwLjYzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzczNCAgcG93ZXIgMC4wNDA3ICAwLjUgLT4gMC4yMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MzUgIHBvd2VyIDAuNDA4ICAwLjUgLT4gMC42MzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3MzYgIHBvd2VyIDAuMDQwOCAgMC41IC0+IDAuMjAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzM3ICBwb3dlciAwLjQwOSAgMC41IC0+IDAuNjQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzM4ICBwb3dlciAwLjA0MDkgIDAuNSAtPiAwLjIwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzczOSAgcG93ZXIgMC40MTEgIDAuNSAtPiAwLjY0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc0MCAgcG93ZXIgMC4wNDExICAwLjUgLT4gMC4yMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NDEgIHBvd2VyIDAuNDEyICAwLjUgLT4gMC42NDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NDIgIHBvd2VyIDAuMDQxMiAgMC41IC0+IDAuMjAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzQzICBwb3dlciAwLjQxMyAgMC41IC0+IDAuNjQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzQ0ICBwb3dlciAwLjA0MTMgIDAuNSAtPiAwLjIwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc0NSAgcG93ZXIgMC40MTQgIDAuNSAtPiAwLjY0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc0NiAgcG93ZXIgMC4wNDE0ICAwLjUgLT4gMC4yMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NDcgIHBvd2VyIDAuNDE1ICAwLjUgLT4gMC42NDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NDggIHBvd2VyIDAuMDQxNSAgMC41IC0+IDAuMjA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzQ5ICBwb3dlciAwLjQxNiAgMC41IC0+IDAuNjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzUwICBwb3dlciAwLjA0MTYgIDAuNSAtPiAwLjIwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc1MSAgcG93ZXIgMC40MTcgIDAuNSAtPiAwLjY0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc1MiAgcG93ZXIgMC4wNDE3ICAwLjUgLT4gMC4yMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NTMgIHBvd2VyIDAuNDE4ICAwLjUgLT4gMC42NDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NTQgIHBvd2VyIDAuMDQxOCAgMC41IC0+IDAuMjA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzU1ICBwb3dlciAwLjQxOSAgMC41IC0+IDAuNjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzU2ICBwb3dlciAwLjA0MTkgIDAuNSAtPiAwLjIwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc1NyAgcG93ZXIgMC40MjEgIDAuNSAtPiAwLjY0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc1OCAgcG93ZXIgMC4wNDIxICAwLjUgLT4gMC4yMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NTkgIHBvd2VyIDAuNDIyICAwLjUgLT4gMC42NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NjAgIHBvd2VyIDAuMDQyMiAgMC41IC0+IDAuMjA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzYxICBwb3dlciAwLjQyMyAgMC41IC0+IDAuNjUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzYyICBwb3dlciAwLjA0MjMgIDAuNSAtPiAwLjIwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc2MyAgcG93ZXIgMC40MjQgIDAuNSAtPiAwLjY1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc2NCAgcG93ZXIgMC4wNDI0ICAwLjUgLT4gMC4yMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NjUgIHBvd2VyIDAuNDI1ICAwLjUgLT4gMC42NTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NjYgIHBvd2VyIDAuMDQyNSAgMC41IC0+IDAuMjA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzY3ICBwb3dlciAwLjQyNiAgMC41IC0+IDAuNjUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzY4ICBwb3dlciAwLjA0MjYgIDAuNSAtPiAwLjIwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc2OSAgcG93ZXIgMC40MjcgIDAuNSAtPiAwLjY1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc3MCAgcG93ZXIgMC4wNDI3ICAwLjUgLT4gMC4yMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NzEgIHBvd2VyIDAuNDI4ICAwLjUgLT4gMC42NTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NzIgIHBvd2VyIDAuMDQyOCAgMC41IC0+IDAuMjA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzczICBwb3dlciAwLjQyOSAgMC41IC0+IDAuNjU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzc0ICBwb3dlciAwLjA0MjkgIDAuNSAtPiAwLjIwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc3NSAgcG93ZXIgMC40MzEgIDAuNSAtPiAwLjY1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc3NiAgcG93ZXIgMC4wNDMxICAwLjUgLT4gMC4yMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NzcgIHBvd2VyIDAuNDMyICAwLjUgLT4gMC42NTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3NzggIHBvd2VyIDAuMDQzMiAgMC41IC0+IDAuMjA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzc5ICBwb3dlciAwLjQzMyAgMC41IC0+IDAuNjU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzgwICBwb3dlciAwLjA0MzMgIDAuNSAtPiAwLjIwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc4MSAgcG93ZXIgMC40MzQgIDAuNSAtPiAwLjY1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc4MiAgcG93ZXIgMC4wNDM0ICAwLjUgLT4gMC4yMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDM3ODMgIHBvd2VyIDAuNDM1ICAwLjUgLT4gMC42NjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3ODQgIHBvd2VyIDAuMDQzNSAgMC41IC0+IDAuMjA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzg1ICBwb3dlciAwLjQzNiAgMC41IC0+IDAuNjYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzg2ICBwb3dlciAwLjA0MzYgIDAuNSAtPiAwLjIwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc4NyAgcG93ZXIgMC40MzcgIDAuNSAtPiAwLjY2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc4OCAgcG93ZXIgMC4wNDM3ICAwLjUgLT4gMC4yMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3ODkgIHBvd2VyIDAuNDM4ICAwLjUgLT4gMC42NjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3OTAgIHBvd2VyIDAuMDQzOCAgMC41IC0+IDAuMjA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzkxICBwb3dlciAwLjQzOSAgMC41IC0+IDAuNjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzkyICBwb3dlciAwLjA0MzkgIDAuNSAtPiAwLjIxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc5MyAgcG93ZXIgMC40NDEgIDAuNSAtPiAwLjY2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc5NCAgcG93ZXIgMC4wNDQxICAwLjUgLT4gMC4yMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3OTUgIHBvd2VyIDAuNDQyICAwLjUgLT4gMC42NjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM3OTYgIHBvd2VyIDAuMDQ0MiAgMC41IC0+IDAuMjEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzk3ICBwb3dlciAwLjQ0MyAgMC41IC0+IDAuNjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzNzk4ICBwb3dlciAwLjA0NDMgIDAuNSAtPiAwLjIxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzc5OSAgcG93ZXIgMC40NDQgIDAuNSAtPiAwLjY2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgwMCAgcG93ZXIgMC4wNDQ0ICAwLjUgLT4gMC4yMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MDEgIHBvd2VyIDAuNDQ1ICAwLjUgLT4gMC42NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MDIgIHBvd2VyIDAuMDQ0NSAgMC41IC0+IDAuMjExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODAzICBwb3dlciAwLjQ0NiAgMC41IC0+IDAuNjY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODA0ICBwb3dlciAwLjA0NDYgIDAuNSAtPiAwLjIxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgwNSAgcG93ZXIgMC40NDcgIDAuNSAtPiAwLjY2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgwNiAgcG93ZXIgMC4wNDQ3ICAwLjUgLT4gMC4yMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MDcgIHBvd2VyIDAuNDQ4ICAwLjUgLT4gMC42NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MDggIHBvd2VyIDAuMDQ0OCAgMC41IC0+IDAuMjEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODA5ICBwb3dlciAwLjQ0OSAgMC41IC0+IDAuNjcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODEwICBwb3dlciAwLjA0NDkgIDAuNSAtPiAwLjIxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgxMSAgcG93ZXIgMC40NTEgIDAuNSAtPiAwLjY3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgxMiAgcG93ZXIgMC4wNDUxICAwLjUgLT4gMC4yMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MTMgIHBvd2VyIDAuNDUyICAwLjUgLT4gMC42NzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MTQgIHBvd2VyIDAuMDQ1MiAgMC41IC0+IDAuMjEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODE1ICBwb3dlciAwLjQ1MyAgMC41IC0+IDAuNjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODE2ICBwb3dlciAwLjA0NTMgIDAuNSAtPiAwLjIxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgxNyAgcG93ZXIgMC40NTQgIDAuNSAtPiAwLjY3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgxOCAgcG93ZXIgMC4wNDU0ICAwLjUgLT4gMC4yMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MTkgIHBvd2VyIDAuNDU1ICAwLjUgLT4gMC42NzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MjAgIHBvd2VyIDAuMDQ1NSAgMC41IC0+IDAuMjEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODIxICBwb3dlciAwLjQ1NiAgMC41IC0+IDAuNjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODIyICBwb3dlciAwLjA0NTYgIDAuNSAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgyMyAgcG93ZXIgMC40NTcgIDAuNSAtPiAwLjY3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgyNCAgcG93ZXIgMC4wNDU3ICAwLjUgLT4gMC4yMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MjUgIHBvd2VyIDAuNDU4ICAwLjUgLT4gMC42NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MjYgIHBvd2VyIDAuMDQ1OCAgMC41IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODI3ICBwb3dlciAwLjQ1OSAgMC41IC0+IDAuNjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODI4ICBwb3dlciAwLjA0NTkgIDAuNSAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgyOSAgcG93ZXIgMC40NjEgIDAuNSAtPiAwLjY3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgzMCAgcG93ZXIgMC4wNDYxICAwLjUgLT4gMC4yMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MzEgIHBvd2VyIDAuNDYyICAwLjUgLT4gMC42ODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MzIgIHBvd2VyIDAuMDQ2MiAgMC41IC0+IDAuMjE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODMzICBwb3dlciAwLjQ2MyAgMC41IC0+IDAuNjgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODM0ICBwb3dlciAwLjA0NjMgIDAuNSAtPiAwLjIxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgzNSAgcG93ZXIgMC40NjQgIDAuNSAtPiAwLjY4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzgzNiAgcG93ZXIgMC4wNDY0ICAwLjUgLT4gMC4yMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MzcgIHBvd2VyIDAuNDY1ICAwLjUgLT4gMC42ODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4MzggIHBvd2VyIDAuMDQ2NSAgMC41IC0+IDAuMjE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODM5ICBwb3dlciAwLjQ2NiAgMC41IC0+IDAuNjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODQwICBwb3dlciAwLjA0NjYgIDAuNSAtPiAwLjIxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg0MSAgcG93ZXIgMC40NjcgIDAuNSAtPiAwLjY4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg0MiAgcG93ZXIgMC4wNDY3ICAwLjUgLT4gMC4yMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NDMgIHBvd2VyIDAuNDY4ICAwLjUgLT4gMC42ODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NDQgIHBvd2VyIDAuMDQ2OCAgMC41IC0+IDAuMjE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODQ1ICBwb3dlciAwLjQ2OSAgMC41IC0+IDAuNjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODQ2ICBwb3dlciAwLjA0NjkgIDAuNSAtPiAwLjIxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg0NyAgcG93ZXIgMC40NzEgIDAuNSAtPiAwLjY4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg0OCAgcG93ZXIgMC4wNDcxICAwLjUgLT4gMC4yMTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NDkgIHBvd2VyIDAuNDcyICAwLjUgLT4gMC42ODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NTAgIHBvd2VyIDAuMDQ3MiAgMC41IC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODUxICBwb3dlciAwLjQ3MyAgMC41IC0+IDAuNjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODUyICBwb3dlciAwLjA0NzMgIDAuNSAtPiAwLjIxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg1MyAgcG93ZXIgMC40NzQgIDAuNSAtPiAwLjY4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg1NCAgcG93ZXIgMC4wNDc0ICAwLjUgLT4gMC4yMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NTUgIHBvd2VyIDAuNDc1ICAwLjUgLT4gMC42ODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NTYgIHBvd2VyIDAuMDQ3NSAgMC41IC0+IDAuMjE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODU3ICBwb3dlciAwLjQ3NiAgMC41IC0+IDAuNjkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODU4ICBwb3dlciAwLjA0NzYgIDAuNSAtPiAwLjIxOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg1OSAgcG93ZXIgMC40NzcgIDAuNSAtPiAwLjY5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg2MCAgcG93ZXIgMC4wNDc3ICAwLjUgLT4gMC4yMTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NjEgIHBvd2VyIDAuNDc4ICAwLjUgLT4gMC42OTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NjIgIHBvd2VyIDAuMDQ3OCAgMC41IC0+IDAuMjE5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODYzICBwb3dlciAwLjQ3OSAgMC41IC0+IDAuNjkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODY0ICBwb3dlciAwLjA0NzkgIDAuNSAtPiAwLjIxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg2NSAgcG93ZXIgMC40ODEgIDAuNSAtPiAwLjY5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg2NiAgcG93ZXIgMC4wNDgxICAwLjUgLT4gMC4yMTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NjcgIHBvd2VyIDAuNDgyICAwLjUgLT4gMC42OTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NjggIHBvd2VyIDAuMDQ4MiAgMC41IC0+IDAuMjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODY5ICBwb3dlciAwLjQ4MyAgMC41IC0+IDAuNjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODcwICBwb3dlciAwLjA0ODMgIDAuNSAtPiAwLjIyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg3MSAgcG93ZXIgMC40ODQgIDAuNSAtPiAwLjY5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg3MiAgcG93ZXIgMC4wNDg0ICAwLjUgLT4gMC4yMjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NzMgIHBvd2VyIDAuNDg1ICAwLjUgLT4gMC42OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NzQgIHBvd2VyIDAuMDQ4NSAgMC41IC0+IDAuMjIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODc1ICBwb3dlciAwLjQ4NiAgMC41IC0+IDAuNjk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODc2ICBwb3dlciAwLjA0ODYgIDAuNSAtPiAwLjIyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg3NyAgcG93ZXIgMC40ODcgIDAuNSAtPiAwLjY5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg3OCAgcG93ZXIgMC4wNDg3ICAwLjUgLT4gMC4yMjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4NzkgIHBvd2VyIDAuNDg4ICAwLjUgLT4gMC42OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4ODAgIHBvd2VyIDAuMDQ4OCAgMC41IC0+IDAuMjIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODgxICBwb3dlciAwLjQ4OSAgMC41IC0+IDAuNjk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODgyICBwb3dlciAwLjA0ODkgIDAuNSAtPiAwLjIyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg4MyAgcG93ZXIgMC40OTEgIDAuNSAtPiAwLjcwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg4NCAgcG93ZXIgMC4wNDkxICAwLjUgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4ODUgIHBvd2VyIDAuNDkyICAwLjUgLT4gMC43MDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4ODYgIHBvd2VyIDAuMDQ5MiAgMC41IC0+IDAuMjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODg3ICBwb3dlciAwLjQ5MyAgMC41IC0+IDAuNzAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODg4ICBwb3dlciAwLjA0OTMgIDAuNSAtPiAwLjIyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg4OSAgcG93ZXIgMC40OTQgIDAuNSAtPiAwLjcwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg5MCAgcG93ZXIgMC4wNDk0ICAwLjUgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4OTEgIHBvd2VyIDAuNDk1ICAwLjUgLT4gMC43MDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4OTIgIHBvd2VyIDAuMDQ5NSAgMC41IC0+IDAuMjIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODkzICBwb3dlciAwLjQ5NiAgMC41IC0+IDAuNzA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODk0ICBwb3dlciAwLjA0OTYgIDAuNSAtPiAwLjIyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg5NSAgcG93ZXIgMC40OTcgIDAuNSAtPiAwLjcwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzg5NiAgcG93ZXIgMC4wNDk3ICAwLjUgLT4gMC4yMjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4OTcgIHBvd2VyIDAuNDk4ICAwLjUgLT4gMC43MDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM4OTggIHBvd2VyIDAuMDQ5OCAgMC41IC0+IDAuMjIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzODk5ICBwb3dlciAwLjQ5OSAgMC41IC0+IDAuNzA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTAwICBwb3dlciAwLjA0OTkgIDAuNSAtPiAwLjIyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkwMSAgcG93ZXIgMC41MDEgIDAuNSAtPiAwLjcwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkwMiAgcG93ZXIgMC4wNTAxICAwLjUgLT4gMC4yMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MDMgIHBvd2VyIDAuNTAyICAwLjUgLT4gMC43MDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MDQgIHBvd2VyIDAuMDUwMiAgMC41IC0+IDAuMjI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTA1ICBwb3dlciAwLjUwMyAgMC41IC0+IDAuNzA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTA2ICBwb3dlciAwLjA1MDMgIDAuNSAtPiAwLjIyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkwNyAgcG93ZXIgMC41MDQgIDAuNSAtPiAwLjcxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkwOCAgcG93ZXIgMC4wNTA0ICAwLjUgLT4gMC4yMjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MDkgIHBvd2VyIDAuNTA1ICAwLjUgLT4gMC43MTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MTAgIHBvd2VyIDAuMDUwNSAgMC41IC0+IDAuMjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTExICBwb3dlciAwLjUwNiAgMC41IC0+IDAuNzExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTEyICBwb3dlciAwLjA1MDYgIDAuNSAtPiAwLjIyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkxMyAgcG93ZXIgMC41MDcgIDAuNSAtPiAwLjcxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkxNCAgcG93ZXIgMC4wNTA3ICAwLjUgLT4gMC4yMjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MTUgIHBvd2VyIDAuNTA4ICAwLjUgLT4gMC43MTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MTYgIHBvd2VyIDAuMDUwOCAgMC41IC0+IDAuMjI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTE3ICBwb3dlciAwLjUwOSAgMC41IC0+IDAuNzEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTE4ICBwb3dlciAwLjA1MDkgIDAuNSAtPiAwLjIyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkxOSAgcG93ZXIgMC41MTEgIDAuNSAtPiAwLjcxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkyMCAgcG93ZXIgMC4wNTExICAwLjUgLT4gMC4yMjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MjEgIHBvd2VyIDAuNTEyICAwLjUgLT4gMC43MTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MjIgIHBvd2VyIDAuMDUxMiAgMC41IC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTIzICBwb3dlciAwLjUxMyAgMC41IC0+IDAuNzE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTI0ICBwb3dlciAwLjA1MTMgIDAuNSAtPiAwLjIyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkyNSAgcG93ZXIgMC41MTQgIDAuNSAtPiAwLjcxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkyNiAgcG93ZXIgMC4wNTE0ICAwLjUgLT4gMC4yMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MjcgIHBvd2VyIDAuNTE1ICAwLjUgLT4gMC43MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MjggIHBvd2VyIDAuMDUxNSAgMC41IC0+IDAuMjI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTI5ICBwb3dlciAwLjUxNiAgMC41IC0+IDAuNzE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTMwICBwb3dlciAwLjA1MTYgIDAuNSAtPiAwLjIyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkzMSAgcG93ZXIgMC41MTcgIDAuNSAtPiAwLjcxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkzMiAgcG93ZXIgMC4wNTE3ICAwLjUgLT4gMC4yMjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MzMgIHBvd2VyIDAuNTE4ICAwLjUgLT4gMC43MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MzQgIHBvd2VyIDAuMDUxOCAgMC41IC0+IDAuMjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTM1ICBwb3dlciAwLjUxOSAgMC41IC0+IDAuNzIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTM2ICBwb3dlciAwLjA1MTkgIDAuNSAtPiAwLjIyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkzNyAgcG93ZXIgMC41MjEgIDAuNSAtPiAwLjcyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4MzkzOCAgcG93ZXIgMC4wNTIxICAwLjUgLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorcHdzeDM5MzkgIHBvd2VyIDAuNTIyICAwLjUgLT4gMC43MjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NDAgIHBvd2VyIDAuMDUyMiAgMC41IC0+IDAuMjI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTQxICBwb3dlciAwLjUyMyAgMC41IC0+IDAuNzIzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTQyICBwb3dlciAwLjA1MjMgIDAuNSAtPiAwLjIyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk0MyAgcG93ZXIgMC41MjQgIDAuNSAtPiAwLjcyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk0NCAgcG93ZXIgMC4wNTI0ICAwLjUgLT4gMC4yMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NDUgIHBvd2VyIDAuNTI1ICAwLjUgLT4gMC43MjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NDYgIHBvd2VyIDAuMDUyNSAgMC41IC0+IDAuMjI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTQ3ICBwb3dlciAwLjUyNiAgMC41IC0+IDAuNzI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTQ4ICBwb3dlciAwLjA1MjYgIDAuNSAtPiAwLjIyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk0OSAgcG93ZXIgMC41MjcgIDAuNSAtPiAwLjcyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk1MCAgcG93ZXIgMC4wNTI3ICAwLjUgLT4gMC4yMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NTEgIHBvd2VyIDAuNTI4ICAwLjUgLT4gMC43MjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NTIgIHBvd2VyIDAuMDUyOCAgMC41IC0+IDAuMjMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTUzICBwb3dlciAwLjUyOSAgMC41IC0+IDAuNzI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTU0ICBwb3dlciAwLjA1MjkgIDAuNSAtPiAwLjIzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk1NSAgcG93ZXIgMC41MzEgIDAuNSAtPiAwLjcyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk1NiAgcG93ZXIgMC4wNTMxICAwLjUgLT4gMC4yMzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NTcgIHBvd2VyIDAuNTMyICAwLjUgLT4gMC43MjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NTggIHBvd2VyIDAuMDUzMiAgMC41IC0+IDAuMjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTU5ICBwb3dlciAwLjUzMyAgMC41IC0+IDAuNzMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTYwICBwb3dlciAwLjA1MzMgIDAuNSAtPiAwLjIzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk2MSAgcG93ZXIgMC41MzQgIDAuNSAtPiAwLjczMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk2MiAgcG93ZXIgMC4wNTM0ICAwLjUgLT4gMC4yMzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NjMgIHBvd2VyIDAuNTM1ICAwLjUgLT4gMC43MzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NjQgIHBvd2VyIDAuMDUzNSAgMC41IC0+IDAuMjMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTY1ICBwb3dlciAwLjUzNiAgMC41IC0+IDAuNzMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTY2ICBwb3dlciAwLjA1MzYgIDAuNSAtPiAwLjIzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk2NyAgcG93ZXIgMC41MzcgIDAuNSAtPiAwLjczMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk2OCAgcG93ZXIgMC4wNTM3ICAwLjUgLT4gMC4yMzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NjkgIHBvd2VyIDAuNTM4ICAwLjUgLT4gMC43MzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NzAgIHBvd2VyIDAuMDUzOCAgMC41IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTcxICBwb3dlciAwLjUzOSAgMC41IC0+IDAuNzM0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTcyICBwb3dlciAwLjA1MzkgIDAuNSAtPiAwLjIzMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk3MyAgcG93ZXIgMC41NDEgIDAuNSAtPiAwLjczNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk3NCAgcG93ZXIgMC4wNTQxICAwLjUgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NzUgIHBvd2VyIDAuNTQyICAwLjUgLT4gMC43MzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5NzYgIHBvd2VyIDAuMDU0MiAgMC41IC0+IDAuMjMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTc3ICBwb3dlciAwLjU0MyAgMC41IC0+IDAuNzM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTc4ICBwb3dlciAwLjA1NDMgIDAuNSAtPiAwLjIzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk3OSAgcG93ZXIgMC41NDQgIDAuNSAtPiAwLjczOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk4MCAgcG93ZXIgMC4wNTQ0ICAwLjUgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5ODEgIHBvd2VyIDAuNTQ1ICAwLjUgLT4gMC43MzggIEluZXhhY3QgUm91bmRlZAorcHdzeDM5ODIgIHBvd2VyIDAuMDU0NSAgMC41IC0+IDAuMjMzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTgzICBwb3dlciAwLjU0NiAgMC41IC0+IDAuNzM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTg0ICBwb3dlciAwLjA1NDYgIDAuNSAtPiAwLjIzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk4NSAgcG93ZXIgMC41NDcgIDAuNSAtPiAwLjc0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk4NiAgcG93ZXIgMC4wNTQ3ICAwLjUgLT4gMC4yMzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5ODcgIHBvd2VyIDAuNTQ4ICAwLjUgLT4gMC43NDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5ODggIHBvd2VyIDAuMDU0OCAgMC41IC0+IDAuMjM0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTg5ICBwb3dlciAwLjU0OSAgMC41IC0+IDAuNzQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTkwICBwb3dlciAwLjA1NDkgIDAuNSAtPiAwLjIzNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk5MSAgcG93ZXIgMC41NTEgIDAuNSAtPiAwLjc0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk5MiAgcG93ZXIgMC4wNTUxICAwLjUgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5OTMgIHBvd2VyIDAuNTUyICAwLjUgLT4gMC43NDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5OTQgIHBvd2VyIDAuMDU1MiAgMC41IC0+IDAuMjM1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTk1ICBwb3dlciAwLjU1MyAgMC41IC0+IDAuNzQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3gzOTk2ICBwb3dlciAwLjA1NTMgIDAuNSAtPiAwLjIzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk5NyAgcG93ZXIgMC41NTQgIDAuNSAtPiAwLjc0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4Mzk5OCAgcG93ZXIgMC4wNTU0ICAwLjUgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDM5OTkgIHBvd2VyIDAuNTU1ICAwLjUgLT4gMC43NDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMDAgIHBvd2VyIDAuMDU1NSAgMC41IC0+IDAuMjM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDAxICBwb3dlciAwLjU1NiAgMC41IC0+IDAuNzQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDAyICBwb3dlciAwLjA1NTYgIDAuNSAtPiAwLjIzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAwMyAgcG93ZXIgMC41NTcgIDAuNSAtPiAwLjc0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAwNCAgcG93ZXIgMC4wNTU3ICAwLjUgLT4gMC4yMzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMDUgIHBvd2VyIDAuNTU4ICAwLjUgLT4gMC43NDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMDYgIHBvd2VyIDAuMDU1OCAgMC41IC0+IDAuMjM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDA3ICBwb3dlciAwLjU1OSAgMC41IC0+IDAuNzQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDA4ICBwb3dlciAwLjA1NTkgIDAuNSAtPiAwLjIzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAwOSAgcG93ZXIgMC41NjEgIDAuNSAtPiAwLjc0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAxMCAgcG93ZXIgMC4wNTYxICAwLjUgLT4gMC4yMzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMTEgIHBvd2VyIDAuNTYyICAwLjUgLT4gMC43NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMTIgIHBvd2VyIDAuMDU2MiAgMC41IC0+IDAuMjM3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDEzICBwb3dlciAwLjU2MyAgMC41IC0+IDAuNzUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDE0ICBwb3dlciAwLjA1NjMgIDAuNSAtPiAwLjIzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAxNSAgcG93ZXIgMC41NjQgIDAuNSAtPiAwLjc1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAxNiAgcG93ZXIgMC4wNTY0ICAwLjUgLT4gMC4yMzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMTcgIHBvd2VyIDAuNTY1ICAwLjUgLT4gMC43NTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMTggIHBvd2VyIDAuMDU2NSAgMC41IC0+IDAuMjM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDE5ICBwb3dlciAwLjU2NiAgMC41IC0+IDAuNzUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDIwICBwb3dlciAwLjA1NjYgIDAuNSAtPiAwLjIzOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAyMSAgcG93ZXIgMC41NjcgIDAuNSAtPiAwLjc1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAyMiAgcG93ZXIgMC4wNTY3ICAwLjUgLT4gMC4yMzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMjMgIHBvd2VyIDAuNTY4ICAwLjUgLT4gMC43NTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMjQgIHBvd2VyIDAuMDU2OCAgMC41IC0+IDAuMjM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDI1ICBwb3dlciAwLjU2OSAgMC41IC0+IDAuNzU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDI2ICBwb3dlciAwLjA1NjkgIDAuNSAtPiAwLjIzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAyNyAgcG93ZXIgMC41NzEgIDAuNSAtPiAwLjc1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAyOCAgcG93ZXIgMC4wNTcxICAwLjUgLT4gMC4yMzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMjkgIHBvd2VyIDAuNTcyICAwLjUgLT4gMC43NTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMzAgIHBvd2VyIDAuMDU3MiAgMC41IC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDMxICBwb3dlciAwLjU3MyAgMC41IC0+IDAuNzU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDMyICBwb3dlciAwLjA1NzMgIDAuNSAtPiAwLjIzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAzMyAgcG93ZXIgMC41NzQgIDAuNSAtPiAwLjc1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAzNCAgcG93ZXIgMC4wNTc0ICAwLjUgLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMzUgIHBvd2VyIDAuNTc1ICAwLjUgLT4gMC43NTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQwMzYgIHBvd2VyIDAuMDU3NSAgMC41IC0+IDAuMjQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDM3ICBwb3dlciAwLjU3NiAgMC41IC0+IDAuNzU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDM4ICBwb3dlciAwLjA1NzYgIDAuNSAtPiAwLjI0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDAzOSAgcG93ZXIgMC41NzcgIDAuNSAtPiAwLjc2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA0MCAgcG93ZXIgMC4wNTc3ICAwLjUgLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNDEgIHBvd2VyIDAuNTc4ICAwLjUgLT4gMC43NjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNDIgIHBvd2VyIDAuMDU3OCAgMC41IC0+IDAuMjQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDQzICBwb3dlciAwLjU3OSAgMC41IC0+IDAuNzYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDQ0ICBwb3dlciAwLjA1NzkgIDAuNSAtPiAwLjI0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA0NSAgcG93ZXIgMC41ODEgIDAuNSAtPiAwLjc2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA0NiAgcG93ZXIgMC4wNTgxICAwLjUgLT4gMC4yNDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNDcgIHBvd2VyIDAuNTgyICAwLjUgLT4gMC43NjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNDggIHBvd2VyIDAuMDU4MiAgMC41IC0+IDAuMjQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDQ5ICBwb3dlciAwLjU4MyAgMC41IC0+IDAuNzY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDUwICBwb3dlciAwLjA1ODMgIDAuNSAtPiAwLjI0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA1MSAgcG93ZXIgMC41ODQgIDAuNSAtPiAwLjc2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA1MiAgcG93ZXIgMC4wNTg0ICAwLjUgLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNTMgIHBvd2VyIDAuNTg1ICAwLjUgLT4gMC43NjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNTQgIHBvd2VyIDAuMDU4NSAgMC41IC0+IDAuMjQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDU1ICBwb3dlciAwLjU4NiAgMC41IC0+IDAuNzY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDU2ICBwb3dlciAwLjA1ODYgIDAuNSAtPiAwLjI0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA1NyAgcG93ZXIgMC41ODcgIDAuNSAtPiAwLjc2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA1OCAgcG93ZXIgMC4wNTg3ICAwLjUgLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNTkgIHBvd2VyIDAuNTg4ICAwLjUgLT4gMC43NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNjAgIHBvd2VyIDAuMDU4OCAgMC41IC0+IDAuMjQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDYxICBwb3dlciAwLjU4OSAgMC41IC0+IDAuNzY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDYyICBwb3dlciAwLjA1ODkgIDAuNSAtPiAwLjI0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA2MyAgcG93ZXIgMC41OTEgIDAuNSAtPiAwLjc2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA2NCAgcG93ZXIgMC4wNTkxICAwLjUgLT4gMC4yNDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNjUgIHBvd2VyIDAuNTkyICAwLjUgLT4gMC43NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNjYgIHBvd2VyIDAuMDU5MiAgMC41IC0+IDAuMjQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDY3ICBwb3dlciAwLjU5MyAgMC41IC0+IDAuNzcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDY4ICBwb3dlciAwLjA1OTMgIDAuNSAtPiAwLjI0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA2OSAgcG93ZXIgMC41OTQgIDAuNSAtPiAwLjc3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA3MCAgcG93ZXIgMC4wNTk0ICAwLjUgLT4gMC4yNDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNzEgIHBvd2VyIDAuNTk1ICAwLjUgLT4gMC43NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNzIgIHBvd2VyIDAuMDU5NSAgMC41IC0+IDAuMjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDczICBwb3dlciAwLjU5NiAgMC41IC0+IDAuNzcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDc0ICBwb3dlciAwLjA1OTYgIDAuNSAtPiAwLjI0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA3NSAgcG93ZXIgMC41OTcgIDAuNSAtPiAwLjc3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA3NiAgcG93ZXIgMC4wNTk3ICAwLjUgLT4gMC4yNDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNzcgIHBvd2VyIDAuNTk4ICAwLjUgLT4gMC43NzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwNzggIHBvd2VyIDAuMDU5OCAgMC41IC0+IDAuMjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDc5ICBwb3dlciAwLjU5OSAgMC41IC0+IDAuNzc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDgwICBwb3dlciAwLjA1OTkgIDAuNSAtPiAwLjI0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA4MSAgcG93ZXIgMC42MDEgIDAuNSAtPiAwLjc3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA4MiAgcG93ZXIgMC4wNjAxICAwLjUgLT4gMC4yNDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwODMgIHBvd2VyIDAuNjAyICAwLjUgLT4gMC43NzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwODQgIHBvd2VyIDAuMDYwMiAgMC41IC0+IDAuMjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDg1ICBwb3dlciAwLjYwMyAgMC41IC0+IDAuNzc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDg2ICBwb3dlciAwLjA2MDMgIDAuNSAtPiAwLjI0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA4NyAgcG93ZXIgMC42MDQgIDAuNSAtPiAwLjc3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA4OCAgcG93ZXIgMC4wNjA0ICAwLjUgLT4gMC4yNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwODkgIHBvd2VyIDAuNjA1ICAwLjUgLT4gMC43NzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQwOTAgIHBvd2VyIDAuMDYwNSAgMC41IC0+IDAuMjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDkxICBwb3dlciAwLjYwNiAgMC41IC0+IDAuNzc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDkyICBwb3dlciAwLjA2MDYgIDAuNSAtPiAwLjI0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA5MyAgcG93ZXIgMC42MDcgIDAuNSAtPiAwLjc3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA5NCAgcG93ZXIgMC4wNjA3ICAwLjUgLT4gMC4yNDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwOTUgIHBvd2VyIDAuNjA4ICAwLjUgLT4gMC43ODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQwOTYgIHBvd2VyIDAuMDYwOCAgMC41IC0+IDAuMjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDk3ICBwb3dlciAwLjYwOSAgMC41IC0+IDAuNzgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MDk4ICBwb3dlciAwLjA2MDkgIDAuNSAtPiAwLjI0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDA5OSAgcG93ZXIgMC42MTEgIDAuNSAtPiAwLjc4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEwMCAgcG93ZXIgMC4wNjExICAwLjUgLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMDEgIHBvd2VyIDAuNjEyICAwLjUgLT4gMC43ODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMDIgIHBvd2VyIDAuMDYxMiAgMC41IC0+IDAuMjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTAzICBwb3dlciAwLjYxMyAgMC41IC0+IDAuNzgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTA0ICBwb3dlciAwLjA2MTMgIDAuNSAtPiAwLjI0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEwNSAgcG93ZXIgMC42MTQgIDAuNSAtPiAwLjc4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEwNiAgcG93ZXIgMC4wNjE0ICAwLjUgLT4gMC4yNDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMDcgIHBvd2VyIDAuNjE1ICAwLjUgLT4gMC43ODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMDggIHBvd2VyIDAuMDYxNSAgMC41IC0+IDAuMjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTA5ICBwb3dlciAwLjYxNiAgMC41IC0+IDAuNzg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTEwICBwb3dlciAwLjA2MTYgIDAuNSAtPiAwLjI0OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDExMSAgcG93ZXIgMC42MTcgIDAuNSAtPiAwLjc4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDExMiAgcG93ZXIgMC4wNjE3ICAwLjUgLT4gMC4yNDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMTMgIHBvd2VyIDAuNjE4ICAwLjUgLT4gMC43ODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMTQgIHBvd2VyIDAuMDYxOCAgMC41IC0+IDAuMjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTE1ICBwb3dlciAwLjYxOSAgMC41IC0+IDAuNzg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTE2ICBwb3dlciAwLjA2MTkgIDAuNSAtPiAwLjI0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDExNyAgcG93ZXIgMC42MjEgIDAuNSAtPiAwLjc4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDExOCAgcG93ZXIgMC4wNjIxICAwLjUgLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMTkgIHBvd2VyIDAuNjIyICAwLjUgLT4gMC43ODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMjAgIHBvd2VyIDAuMDYyMiAgMC41IC0+IDAuMjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTIxICBwb3dlciAwLjYyMyAgMC41IC0+IDAuNzg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTIyICBwb3dlciAwLjA2MjMgIDAuNSAtPiAwLjI1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEyMyAgcG93ZXIgMC42MjQgIDAuNSAtPiAwLjc5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEyNCAgcG93ZXIgMC4wNjI0ICAwLjUgLT4gMC4yNTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMjUgIHBvd2VyIDAuNjI1ICAwLjUgLT4gMC43OTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMjYgIHBvd2VyIDAuMDYyNSAgMC41IC0+IDAuMjUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTI3ICBwb3dlciAwLjYyNiAgMC41IC0+IDAuNzkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTI4ICBwb3dlciAwLjA2MjYgIDAuNSAtPiAwLjI1MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEyOSAgcG93ZXIgMC42MjcgIDAuNSAtPiAwLjc5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEzMCAgcG93ZXIgMC4wNjI3ICAwLjUgLT4gMC4yNTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMzEgIHBvd2VyIDAuNjI4ICAwLjUgLT4gMC43OTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMzIgIHBvd2VyIDAuMDYyOCAgMC41IC0+IDAuMjUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTMzICBwb3dlciAwLjYyOSAgMC41IC0+IDAuNzkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTM0ICBwb3dlciAwLjA2MjkgIDAuNSAtPiAwLjI1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEzNSAgcG93ZXIgMC42MzEgIDAuNSAtPiAwLjc5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDEzNiAgcG93ZXIgMC4wNjMxICAwLjUgLT4gMC4yNTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMzcgIHBvd2VyIDAuNjMyICAwLjUgLT4gMC43OTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxMzggIHBvd2VyIDAuMDYzMiAgMC41IC0+IDAuMjUxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTM5ICBwb3dlciAwLjYzMyAgMC41IC0+IDAuNzk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTQwICBwb3dlciAwLjA2MzMgIDAuNSAtPiAwLjI1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE0MSAgcG93ZXIgMC42MzQgIDAuNSAtPiAwLjc5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE0MiAgcG93ZXIgMC4wNjM0ICAwLjUgLT4gMC4yNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNDMgIHBvd2VyIDAuNjM1ICAwLjUgLT4gMC43OTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNDQgIHBvd2VyIDAuMDYzNSAgMC41IC0+IDAuMjUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTQ1ICBwb3dlciAwLjYzNiAgMC41IC0+IDAuNzk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTQ2ICBwb3dlciAwLjA2MzYgIDAuNSAtPiAwLjI1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE0NyAgcG93ZXIgMC42MzcgIDAuNSAtPiAwLjc5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE0OCAgcG93ZXIgMC4wNjM3ICAwLjUgLT4gMC4yNTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNDkgIHBvd2VyIDAuNjM4ICAwLjUgLT4gMC43OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNTAgIHBvd2VyIDAuMDYzOCAgMC41IC0+IDAuMjUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTUxICBwb3dlciAwLjYzOSAgMC41IC0+IDAuNzk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTUyICBwb3dlciAwLjA2MzkgIDAuNSAtPiAwLjI1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE1MyAgcG93ZXIgMC42NDEgIDAuNSAtPiAwLjgwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE1NCAgcG93ZXIgMC4wNjQxICAwLjUgLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNTUgIHBvd2VyIDAuNjQyICAwLjUgLT4gMC44MDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNTYgIHBvd2VyIDAuMDY0MiAgMC41IC0+IDAuMjUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTU3ICBwb3dlciAwLjY0MyAgMC41IC0+IDAuODAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTU4ICBwb3dlciAwLjA2NDMgIDAuNSAtPiAwLjI1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE1OSAgcG93ZXIgMC42NDQgIDAuNSAtPiAwLjgwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE2MCAgcG93ZXIgMC4wNjQ0ICAwLjUgLT4gMC4yNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNjEgIHBvd2VyIDAuNjQ1ICAwLjUgLT4gMC44MDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNjIgIHBvd2VyIDAuMDY0NSAgMC41IC0+IDAuMjU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTYzICBwb3dlciAwLjY0NiAgMC41IC0+IDAuODA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTY0ICBwb3dlciAwLjA2NDYgIDAuNSAtPiAwLjI1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE2NSAgcG93ZXIgMC42NDcgIDAuNSAtPiAwLjgwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE2NiAgcG93ZXIgMC4wNjQ3ICAwLjUgLT4gMC4yNTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNjcgIHBvd2VyIDAuNjQ4ICAwLjUgLT4gMC44MDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNjggIHBvd2VyIDAuMDY0OCAgMC41IC0+IDAuMjU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTY5ICBwb3dlciAwLjY0OSAgMC41IC0+IDAuODA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTcwICBwb3dlciAwLjA2NDkgIDAuNSAtPiAwLjI1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE3MSAgcG93ZXIgMC42NTEgIDAuNSAtPiAwLjgwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE3MiAgcG93ZXIgMC4wNjUxICAwLjUgLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNzMgIHBvd2VyIDAuNjUyICAwLjUgLT4gMC44MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNzQgIHBvd2VyIDAuMDY1MiAgMC41IC0+IDAuMjU1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTc1ICBwb3dlciAwLjY1MyAgMC41IC0+IDAuODA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTc2ICBwb3dlciAwLjA2NTMgIDAuNSAtPiAwLjI1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE3NyAgcG93ZXIgMC42NTQgIDAuNSAtPiAwLjgwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE3OCAgcG93ZXIgMC4wNjU0ICAwLjUgLT4gMC4yNTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxNzkgIHBvd2VyIDAuNjU1ICAwLjUgLT4gMC44MDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxODAgIHBvd2VyIDAuMDY1NSAgMC41IC0+IDAuMjU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTgxICBwb3dlciAwLjY1NiAgMC41IC0+IDAuODEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTgyICBwb3dlciAwLjA2NTYgIDAuNSAtPiAwLjI1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE4MyAgcG93ZXIgMC42NTcgIDAuNSAtPiAwLjgxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE4NCAgcG93ZXIgMC4wNjU3ICAwLjUgLT4gMC4yNTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxODUgIHBvd2VyIDAuNjU4ICAwLjUgLT4gMC44MTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxODYgIHBvd2VyIDAuMDY1OCAgMC41IC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTg3ICBwb3dlciAwLjY1OSAgMC41IC0+IDAuODEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTg4ICBwb3dlciAwLjA2NTkgIDAuNSAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE4OSAgcG93ZXIgMC42NjEgIDAuNSAtPiAwLjgxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE5MCAgcG93ZXIgMC4wNjYxICAwLjUgLT4gMC4yNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxOTEgIHBvd2VyIDAuNjYyICAwLjUgLT4gMC44MTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxOTIgIHBvd2VyIDAuMDY2MiAgMC41IC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTkzICBwb3dlciAwLjY2MyAgMC41IC0+IDAuODE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTk0ICBwb3dlciAwLjA2NjMgIDAuNSAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE5NSAgcG93ZXIgMC42NjQgIDAuNSAtPiAwLjgxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDE5NiAgcG93ZXIgMC4wNjY0ICAwLjUgLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQxOTcgIHBvd2VyIDAuNjY1ICAwLjUgLT4gMC44MTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQxOTggIHBvd2VyIDAuMDY2NSAgMC41IC0+IDAuMjU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MTk5ICBwb3dlciAwLjY2NiAgMC41IC0+IDAuODE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjAwICBwb3dlciAwLjA2NjYgIDAuNSAtPiAwLjI1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIwMSAgcG93ZXIgMC42NjcgIDAuNSAtPiAwLjgxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIwMiAgcG93ZXIgMC4wNjY3ICAwLjUgLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMDMgIHBvd2VyIDAuNjY4ICAwLjUgLT4gMC44MTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMDQgIHBvd2VyIDAuMDY2OCAgMC41IC0+IDAuMjU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjA1ICBwb3dlciAwLjY2OSAgMC41IC0+IDAuODE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjA2ICBwb3dlciAwLjA2NjkgIDAuNSAtPiAwLjI1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIwNyAgcG93ZXIgMC42NzEgIDAuNSAtPiAwLjgxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIwOCAgcG93ZXIgMC4wNjcxICAwLjUgLT4gMC4yNTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMDkgIHBvd2VyIDAuNjcyICAwLjUgLT4gMC44MjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMTAgIHBvd2VyIDAuMDY3MiAgMC41IC0+IDAuMjU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjExICBwb3dlciAwLjY3MyAgMC41IC0+IDAuODIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjEyICBwb3dlciAwLjA2NzMgIDAuNSAtPiAwLjI1OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIxMyAgcG93ZXIgMC42NzQgIDAuNSAtPiAwLjgyMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIxNCAgcG93ZXIgMC4wNjc0ICAwLjUgLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMTUgIHBvd2VyIDAuNjc1ICAwLjUgLT4gMC44MjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMTYgIHBvd2VyIDAuMDY3NSAgMC41IC0+IDAuMjYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjE3ICBwb3dlciAwLjY3NiAgMC41IC0+IDAuODIyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjE4ICBwb3dlciAwLjA2NzYgIDAuNSAtPiAwLjI2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIxOSAgcG93ZXIgMC42NzcgIDAuNSAtPiAwLjgyMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIyMCAgcG93ZXIgMC4wNjc3ICAwLjUgLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMjEgIHBvd2VyIDAuNjc4ICAwLjUgLT4gMC44MjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMjIgIHBvd2VyIDAuMDY3OCAgMC41IC0+IDAuMjYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjIzICBwb3dlciAwLjY3OSAgMC41IC0+IDAuODI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjI0ICBwb3dlciAwLjA2NzkgIDAuNSAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIyNSAgcG93ZXIgMC42ODEgIDAuNSAtPiAwLjgyNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIyNiAgcG93ZXIgMC4wNjgxICAwLjUgLT4gMC4yNjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMjcgIHBvd2VyIDAuNjgyICAwLjUgLT4gMC44MjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMjggIHBvd2VyIDAuMDY4MiAgMC41IC0+IDAuMjYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjI5ICBwb3dlciAwLjY4MyAgMC41IC0+IDAuODI2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjMwICBwb3dlciAwLjA2ODMgIDAuNSAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIzMSAgcG93ZXIgMC42ODQgIDAuNSAtPiAwLjgyNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIzMiAgcG93ZXIgMC4wNjg0ICAwLjUgLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMzMgIHBvd2VyIDAuNjg1ICAwLjUgLT4gMC44MjggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMzQgIHBvd2VyIDAuMDY4NSAgMC41IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjM1ICBwb3dlciAwLjY4NiAgMC41IC0+IDAuODI4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjM2ICBwb3dlciAwLjA2ODYgIDAuNSAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIzNyAgcG93ZXIgMC42ODcgIDAuNSAtPiAwLjgyOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDIzOCAgcG93ZXIgMC4wNjg3ICAwLjUgLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyMzkgIHBvd2VyIDAuNjg4ICAwLjUgLT4gMC44MjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNDAgIHBvd2VyIDAuMDY4OCAgMC41IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjQxICBwb3dlciAwLjY4OSAgMC41IC0+IDAuODMwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjQyICBwb3dlciAwLjA2ODkgIDAuNSAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI0MyAgcG93ZXIgMC42OTEgIDAuNSAtPiAwLjgzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI0NCAgcG93ZXIgMC4wNjkxICAwLjUgLT4gMC4yNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNDUgIHBvd2VyIDAuNjkyICAwLjUgLT4gMC44MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNDYgIHBvd2VyIDAuMDY5MiAgMC41IC0+IDAuMjYzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjQ3ICBwb3dlciAwLjY5MyAgMC41IC0+IDAuODMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjQ4ICBwb3dlciAwLjA2OTMgIDAuNSAtPiAwLjI2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI0OSAgcG93ZXIgMC42OTQgIDAuNSAtPiAwLjgzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI1MCAgcG93ZXIgMC4wNjk0ICAwLjUgLT4gMC4yNjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNTEgIHBvd2VyIDAuNjk1ICAwLjUgLT4gMC44MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNTIgIHBvd2VyIDAuMDY5NSAgMC41IC0+IDAuMjY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjUzICBwb3dlciAwLjY5NiAgMC41IC0+IDAuODM0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjU0ICBwb3dlciAwLjA2OTYgIDAuNSAtPiAwLjI2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI1NSAgcG93ZXIgMC42OTcgIDAuNSAtPiAwLjgzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI1NiAgcG93ZXIgMC4wNjk3ICAwLjUgLT4gMC4yNjQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNTcgIHBvd2VyIDAuNjk4ICAwLjUgLT4gMC44MzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNTggIHBvd2VyIDAuMDY5OCAgMC41IC0+IDAuMjY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjU5ICBwb3dlciAwLjY5OSAgMC41IC0+IDAuODM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjYwICBwb3dlciAwLjA2OTkgIDAuNSAtPiAwLjI2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI2MSAgcG93ZXIgMC43MDEgIDAuNSAtPiAwLjgzNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI2MiAgcG93ZXIgMC4wNzAxICAwLjUgLT4gMC4yNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNjMgIHBvd2VyIDAuNzAyICAwLjUgLT4gMC44MzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNjQgIHBvd2VyIDAuMDcwMiAgMC41IC0+IDAuMjY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjY1ICBwb3dlciAwLjcwMyAgMC41IC0+IDAuODM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjY2ICBwb3dlciAwLjA3MDMgIDAuNSAtPiAwLjI2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI2NyAgcG93ZXIgMC43MDQgIDAuNSAtPiAwLjgzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI2OCAgcG93ZXIgMC4wNzA0ICAwLjUgLT4gMC4yNjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNjkgIHBvd2VyIDAuNzA1ICAwLjUgLT4gMC44NDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNzAgIHBvd2VyIDAuMDcwNSAgMC41IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjcxICBwb3dlciAwLjcwNiAgMC41IC0+IDAuODQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjcyICBwb3dlciAwLjA3MDYgIDAuNSAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI3MyAgcG93ZXIgMC43MDcgIDAuNSAtPiAwLjg0MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI3NCAgcG93ZXIgMC4wNzA3ICAwLjUgLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNzUgIHBvd2VyIDAuNzA4ICAwLjUgLT4gMC44NDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyNzYgIHBvd2VyIDAuMDcwOCAgMC41IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjc3ICBwb3dlciAwLjcwOSAgMC41IC0+IDAuODQyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjc4ICBwb3dlciAwLjA3MDkgIDAuNSAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI3OSAgcG93ZXIgMC43MTEgIDAuNSAtPiAwLjg0MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI4MCAgcG93ZXIgMC4wNzExICAwLjUgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyODEgIHBvd2VyIDAuNzEyICAwLjUgLT4gMC44NDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyODIgIHBvd2VyIDAuMDcxMiAgMC41IC0+IDAuMjY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjgzICBwb3dlciAwLjcxMyAgMC41IC0+IDAuODQ0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjg0ICBwb3dlciAwLjA3MTMgIDAuNSAtPiAwLjI2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI4NSAgcG93ZXIgMC43MTQgIDAuNSAtPiAwLjg0NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI4NiAgcG93ZXIgMC4wNzE0ICAwLjUgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyODcgIHBvd2VyIDAuNzE1ICAwLjUgLT4gMC44NDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyODggIHBvd2VyIDAuMDcxNSAgMC41IC0+IDAuMjY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjg5ICBwb3dlciAwLjcxNiAgMC41IC0+IDAuODQ2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MjkwICBwb3dlciAwLjA3MTYgIDAuNSAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI5MSAgcG93ZXIgMC43MTcgIDAuNSAtPiAwLjg0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI5MiAgcG93ZXIgMC4wNzE3ICAwLjUgLT4gMC4yNjggIEluZXhhY3QgUm91bmRlZAorcHdzeDQyOTMgIHBvd2VyIDAuNzE4ICAwLjUgLT4gMC44NDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyOTQgIHBvd2VyIDAuMDcxOCAgMC41IC0+IDAuMjY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjk1ICBwb3dlciAwLjcxOSAgMC41IC0+IDAuODQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mjk2ICBwb3dlciAwLjA3MTkgIDAuNSAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI5NyAgcG93ZXIgMC43MjEgIDAuNSAtPiAwLjg0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDI5OCAgcG93ZXIgMC4wNzIxICAwLjUgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQyOTkgIHBvd2VyIDAuNzIyICAwLjUgLT4gMC44NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMDAgIHBvd2VyIDAuMDcyMiAgMC41IC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzAxICBwb3dlciAwLjcyMyAgMC41IC0+IDAuODUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzAyICBwb3dlciAwLjA3MjMgIDAuNSAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMwMyAgcG93ZXIgMC43MjQgIDAuNSAtPiAwLjg1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMwNCAgcG93ZXIgMC4wNzI0ICAwLjUgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMDUgIHBvd2VyIDAuNzI1ICAwLjUgLT4gMC44NTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMDYgIHBvd2VyIDAuMDcyNSAgMC41IC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzA3ICBwb3dlciAwLjcyNiAgMC41IC0+IDAuODUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzA4ICBwb3dlciAwLjA3MjYgIDAuNSAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMwOSAgcG93ZXIgMC43MjcgIDAuNSAtPiAwLjg1MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMxMCAgcG93ZXIgMC4wNzI3ICAwLjUgLT4gMC4yNzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMTEgIHBvd2VyIDAuNzI4ICAwLjUgLT4gMC44NTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMTIgIHBvd2VyIDAuMDcyOCAgMC41IC0+IDAuMjcwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzEzICBwb3dlciAwLjcyOSAgMC41IC0+IDAuODU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzE0ICBwb3dlciAwLjA3MjkgIDAuNSAtPiAwLjI3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMxNSAgcG93ZXIgMC43MzEgIDAuNSAtPiAwLjg1NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMxNiAgcG93ZXIgMC4wNzMxICAwLjUgLT4gMC4yNzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMTcgIHBvd2VyIDAuNzMyICAwLjUgLT4gMC44NTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMTggIHBvd2VyIDAuMDczMiAgMC41IC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzE5ICBwb3dlciAwLjczMyAgMC41IC0+IDAuODU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzIwICBwb3dlciAwLjA3MzMgIDAuNSAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMyMSAgcG93ZXIgMC43MzQgIDAuNSAtPiAwLjg1NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMyMiAgcG93ZXIgMC4wNzM0ICAwLjUgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMjMgIHBvd2VyIDAuNzM1ICAwLjUgLT4gMC44NTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMjQgIHBvd2VyIDAuMDczNSAgMC41IC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzI1ICBwb3dlciAwLjczNiAgMC41IC0+IDAuODU4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzI2ICBwb3dlciAwLjA3MzYgIDAuNSAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMyNyAgcG93ZXIgMC43MzcgIDAuNSAtPiAwLjg1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMyOCAgcG93ZXIgMC4wNzM3ICAwLjUgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMjkgIHBvd2VyIDAuNzM4ICAwLjUgLT4gMC44NTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMzAgIHBvd2VyIDAuMDczOCAgMC41IC0+IDAuMjcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzMxICBwb3dlciAwLjczOSAgMC41IC0+IDAuODYwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzMyICBwb3dlciAwLjA3MzkgIDAuNSAtPiAwLjI3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMzMyAgcG93ZXIgMC43NDEgIDAuNSAtPiAwLjg2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMzNCAgcG93ZXIgMC4wNzQxICAwLjUgLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMzUgIHBvd2VyIDAuNzQyICAwLjUgLT4gMC44NjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzMzYgIHBvd2VyIDAuMDc0MiAgMC41IC0+IDAuMjcyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzM3ICBwb3dlciAwLjc0MyAgMC41IC0+IDAuODYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzM4ICBwb3dlciAwLjA3NDMgIDAuNSAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDMzOSAgcG93ZXIgMC43NDQgIDAuNSAtPiAwLjg2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM0MCAgcG93ZXIgMC4wNzQ0ICAwLjUgLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNDEgIHBvd2VyIDAuNzQ1ICAwLjUgLT4gMC44NjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNDIgIHBvd2VyIDAuMDc0NSAgMC41IC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzQzICBwb3dlciAwLjc0NiAgMC41IC0+IDAuODY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzQ0ICBwb3dlciAwLjA3NDYgIDAuNSAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM0NSAgcG93ZXIgMC43NDcgIDAuNSAtPiAwLjg2NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM0NiAgcG93ZXIgMC4wNzQ3ICAwLjUgLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNDcgIHBvd2VyIDAuNzQ4ICAwLjUgLT4gMC44NjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNDggIHBvd2VyIDAuMDc0OCAgMC41IC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzQ5ICBwb3dlciAwLjc0OSAgMC41IC0+IDAuODY1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzUwICBwb3dlciAwLjA3NDkgIDAuNSAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM1MSAgcG93ZXIgMC43NTEgIDAuNSAtPiAwLjg2NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM1MiAgcG93ZXIgMC4wNzUxICAwLjUgLT4gMC4yNzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNTMgIHBvd2VyIDAuNzUyICAwLjUgLT4gMC44NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNTQgIHBvd2VyIDAuMDc1MiAgMC41IC0+IDAuMjc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzU1ICBwb3dlciAwLjc1MyAgMC41IC0+IDAuODY4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzU2ICBwb3dlciAwLjA3NTMgIDAuNSAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM1NyAgcG93ZXIgMC43NTQgIDAuNSAtPiAwLjg2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM1OCAgcG93ZXIgMC4wNzU0ICAwLjUgLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNTkgIHBvd2VyIDAuNzU1ICAwLjUgLT4gMC44NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNjAgIHBvd2VyIDAuMDc1NSAgMC41IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzYxICBwb3dlciAwLjc1NiAgMC41IC0+IDAuODY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzYyICBwb3dlciAwLjA3NTYgIDAuNSAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM2MyAgcG93ZXIgMC43NTcgIDAuNSAtPiAwLjg3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM2NCAgcG93ZXIgMC4wNzU3ICAwLjUgLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNjUgIHBvd2VyIDAuNzU4ICAwLjUgLT4gMC44NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNjYgIHBvd2VyIDAuMDc1OCAgMC41IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzY3ICBwb3dlciAwLjc1OSAgMC41IC0+IDAuODcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzY4ICBwb3dlciAwLjA3NTkgIDAuNSAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM2OSAgcG93ZXIgMC43NjEgIDAuNSAtPiAwLjg3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM3MCAgcG93ZXIgMC4wNzYxICAwLjUgLT4gMC4yNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNzEgIHBvd2VyIDAuNzYyICAwLjUgLT4gMC44NzMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNzIgIHBvd2VyIDAuMDc2MiAgMC41IC0+IDAuMjc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzczICBwb3dlciAwLjc2MyAgMC41IC0+IDAuODczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzc0ICBwb3dlciAwLjA3NjMgIDAuNSAtPiAwLjI3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM3NSAgcG93ZXIgMC43NjQgIDAuNSAtPiAwLjg3NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM3NiAgcG93ZXIgMC4wNzY0ICAwLjUgLT4gMC4yNzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNzcgIHBvd2VyIDAuNzY1ICAwLjUgLT4gMC44NzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzNzggIHBvd2VyIDAuMDc2NSAgMC41IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzc5ICBwb3dlciAwLjc2NiAgMC41IC0+IDAuODc1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzgwICBwb3dlciAwLjA3NjYgIDAuNSAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM4MSAgcG93ZXIgMC43NjcgIDAuNSAtPiAwLjg3NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM4MiAgcG93ZXIgMC4wNzY3ICAwLjUgLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzODMgIHBvd2VyIDAuNzY4ICAwLjUgLT4gMC44NzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzODQgIHBvd2VyIDAuMDc2OCAgMC41IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzg1ICBwb3dlciAwLjc2OSAgMC41IC0+IDAuODc3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzg2ICBwb3dlciAwLjA3NjkgIDAuNSAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM4NyAgcG93ZXIgMC43NzEgIDAuNSAtPiAwLjg3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM4OCAgcG93ZXIgMC4wNzcxICAwLjUgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQzODkgIHBvd2VyIDAuNzcyICAwLjUgLT4gMC44NzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzOTAgIHBvd2VyIDAuMDc3MiAgMC41IC0+IDAuMjc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzkxICBwb3dlciAwLjc3MyAgMC41IC0+IDAuODc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0MzkyICBwb3dlciAwLjA3NzMgIDAuNSAtPiAwLjI3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM5MyAgcG93ZXIgMC43NzQgIDAuNSAtPiAwLjg4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM5NCAgcG93ZXIgMC4wNzc0ICAwLjUgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorcHdzeDQzOTUgIHBvd2VyIDAuNzc1ICAwLjUgLT4gMC44ODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQzOTYgIHBvd2VyIDAuMDc3NSAgMC41IC0+IDAuMjc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzk3ICBwb3dlciAwLjc3NiAgMC41IC0+IDAuODgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Mzk4ICBwb3dlciAwLjA3NzYgIDAuNSAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDM5OSAgcG93ZXIgMC43NzcgIDAuNSAtPiAwLjg4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQwMCAgcG93ZXIgMC4wNzc3ICAwLjUgLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MDEgIHBvd2VyIDAuNzc4ICAwLjUgLT4gMC44ODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MDIgIHBvd2VyIDAuMDc3OCAgMC41IC0+IDAuMjc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDAzICBwb3dlciAwLjc3OSAgMC41IC0+IDAuODgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDA0ICBwb3dlciAwLjA3NzkgIDAuNSAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQwNSAgcG93ZXIgMC43ODEgIDAuNSAtPiAwLjg4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQwNiAgcG93ZXIgMC4wNzgxICAwLjUgLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MDcgIHBvd2VyIDAuNzgyICAwLjUgLT4gMC44ODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MDggIHBvd2VyIDAuMDc4MiAgMC41IC0+IDAuMjgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDA5ICBwb3dlciAwLjc4MyAgMC41IC0+IDAuODg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDEwICBwb3dlciAwLjA3ODMgIDAuNSAtPiAwLjI4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQxMSAgcG93ZXIgMC43ODQgIDAuNSAtPiAwLjg4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQxMiAgcG93ZXIgMC4wNzg0ICAwLjUgLT4gMC4yODAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MTMgIHBvd2VyIDAuNzg1ICAwLjUgLT4gMC44ODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MTQgIHBvd2VyIDAuMDc4NSAgMC41IC0+IDAuMjgwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDE1ICBwb3dlciAwLjc4NiAgMC41IC0+IDAuODg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDE2ICBwb3dlciAwLjA3ODYgIDAuNSAtPiAwLjI4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQxNyAgcG93ZXIgMC43ODcgIDAuNSAtPiAwLjg4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQxOCAgcG93ZXIgMC4wNzg3ICAwLjUgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MTkgIHBvd2VyIDAuNzg4ICAwLjUgLT4gMC44ODggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MjAgIHBvd2VyIDAuMDc4OCAgMC41IC0+IDAuMjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDIxICBwb3dlciAwLjc4OSAgMC41IC0+IDAuODg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDIyICBwb3dlciAwLjA3ODkgIDAuNSAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQyMyAgcG93ZXIgMC43OTEgIDAuNSAtPiAwLjg4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQyNCAgcG93ZXIgMC4wNzkxICAwLjUgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MjUgIHBvd2VyIDAuNzkyICAwLjUgLT4gMC44OTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MjYgIHBvd2VyIDAuMDc5MiAgMC41IC0+IDAuMjgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDI3ICBwb3dlciAwLjc5MyAgMC41IC0+IDAuODkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDI4ICBwb3dlciAwLjA3OTMgIDAuNSAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQyOSAgcG93ZXIgMC43OTQgIDAuNSAtPiAwLjg5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQzMCAgcG93ZXIgMC4wNzk0ICAwLjUgLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MzEgIHBvd2VyIDAuNzk1ICAwLjUgLT4gMC44OTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MzIgIHBvd2VyIDAuMDc5NSAgMC41IC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDMzICBwb3dlciAwLjc5NiAgMC41IC0+IDAuODkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDM0ICBwb3dlciAwLjA3OTYgIDAuNSAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQzNSAgcG93ZXIgMC43OTcgIDAuNSAtPiAwLjg5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQzNiAgcG93ZXIgMC4wNzk3ICAwLjUgLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MzcgIHBvd2VyIDAuNzk4ICAwLjUgLT4gMC44OTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0MzggIHBvd2VyIDAuMDc5OCAgMC41IC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDM5ICBwb3dlciAwLjc5OSAgMC41IC0+IDAuODk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDQwICBwb3dlciAwLjA3OTkgIDAuNSAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ0MSAgcG93ZXIgMC44MDEgIDAuNSAtPiAwLjg5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ0MiAgcG93ZXIgMC4wODAxICAwLjUgLT4gMC4yODMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NDMgIHBvd2VyIDAuODAyICAwLjUgLT4gMC44OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NDQgIHBvd2VyIDAuMDgwMiAgMC41IC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDQ1ICBwb3dlciAwLjgwMyAgMC41IC0+IDAuODk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDQ2ICBwb3dlciAwLjA4MDMgIDAuNSAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ0NyAgcG93ZXIgMC44MDQgIDAuNSAtPiAwLjg5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ0OCAgcG93ZXIgMC4wODA0ICAwLjUgLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NDkgIHBvd2VyIDAuODA1ICAwLjUgLT4gMC44OTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NTAgIHBvd2VyIDAuMDgwNSAgMC41IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDUxICBwb3dlciAwLjgwNiAgMC41IC0+IDAuODk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDUyICBwb3dlciAwLjA4MDYgIDAuNSAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ1MyAgcG93ZXIgMC44MDcgIDAuNSAtPiAwLjg5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ1NCAgcG93ZXIgMC4wODA3ICAwLjUgLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NTUgIHBvd2VyIDAuODA4ICAwLjUgLT4gMC44OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NTYgIHBvd2VyIDAuMDgwOCAgMC41IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDU3ICBwb3dlciAwLjgwOSAgMC41IC0+IDAuODk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDU4ICBwb3dlciAwLjA4MDkgIDAuNSAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ1OSAgcG93ZXIgMC44MTEgIDAuNSAtPiAwLjkwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ2MCAgcG93ZXIgMC4wODExICAwLjUgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NjEgIHBvd2VyIDAuODEyICAwLjUgLT4gMC45MDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NjIgIHBvd2VyIDAuMDgxMiAgMC41IC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDYzICBwb3dlciAwLjgxMyAgMC41IC0+IDAuOTAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDY0ICBwb3dlciAwLjA4MTMgIDAuNSAtPiAwLjI4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ2NSAgcG93ZXIgMC44MTQgIDAuNSAtPiAwLjkwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ2NiAgcG93ZXIgMC4wODE0ICAwLjUgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NjcgIHBvd2VyIDAuODE1ICAwLjUgLT4gMC45MDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NjggIHBvd2VyIDAuMDgxNSAgMC41IC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDY5ICBwb3dlciAwLjgxNiAgMC41IC0+IDAuOTAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDcwICBwb3dlciAwLjA4MTYgIDAuNSAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ3MSAgcG93ZXIgMC44MTcgIDAuNSAtPiAwLjkwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ3MiAgcG93ZXIgMC4wODE3ICAwLjUgLT4gMC4yODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NzMgIHBvd2VyIDAuODE4ICAwLjUgLT4gMC45MDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NzQgIHBvd2VyIDAuMDgxOCAgMC41IC0+IDAuMjg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDc1ICBwb3dlciAwLjgxOSAgMC41IC0+IDAuOTA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDc2ICBwb3dlciAwLjA4MTkgIDAuNSAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ3NyAgcG93ZXIgMC44MjEgIDAuNSAtPiAwLjkwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ3OCAgcG93ZXIgMC4wODIxICAwLjUgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0NzkgIHBvd2VyIDAuODIyICAwLjUgLT4gMC45MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0ODAgIHBvd2VyIDAuMDgyMiAgMC41IC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDgxICBwb3dlciAwLjgyMyAgMC41IC0+IDAuOTA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDgyICBwb3dlciAwLjA4MjMgIDAuNSAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ4MyAgcG93ZXIgMC44MjQgIDAuNSAtPiAwLjkwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ4NCAgcG93ZXIgMC4wODI0ICAwLjUgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0ODUgIHBvd2VyIDAuODI1ICAwLjUgLT4gMC45MDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0ODYgIHBvd2VyIDAuMDgyNSAgMC41IC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDg3ICBwb3dlciAwLjgyNiAgMC41IC0+IDAuOTA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDg4ICBwb3dlciAwLjA4MjYgIDAuNSAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ4OSAgcG93ZXIgMC44MjcgIDAuNSAtPiAwLjkwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ5MCAgcG93ZXIgMC4wODI3ICAwLjUgLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0OTEgIHBvd2VyIDAuODI4ICAwLjUgLT4gMC45MTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0OTIgIHBvd2VyIDAuMDgyOCAgMC41IC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDkzICBwb3dlciAwLjgyOSAgMC41IC0+IDAuOTEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDk0ICBwb3dlciAwLjA4MjkgIDAuNSAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ5NSAgcG93ZXIgMC44MzEgIDAuNSAtPiAwLjkxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDQ5NiAgcG93ZXIgMC4wODMxICAwLjUgLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0OTcgIHBvd2VyIDAuODMyICAwLjUgLT4gMC45MTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ0OTggIHBvd2VyIDAuMDgzMiAgMC41IC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NDk5ICBwb3dlciAwLjgzMyAgMC41IC0+IDAuOTEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTAwICBwb3dlciAwLjA4MzMgIDAuNSAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUwMSAgcG93ZXIgMC44MzQgIDAuNSAtPiAwLjkxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUwMiAgcG93ZXIgMC4wODM0ICAwLjUgLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MDMgIHBvd2VyIDAuODM1ICAwLjUgLT4gMC45MTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MDQgIHBvd2VyIDAuMDgzNSAgMC41IC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTA1ICBwb3dlciAwLjgzNiAgMC41IC0+IDAuOTE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTA2ICBwb3dlciAwLjA4MzYgIDAuNSAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUwNyAgcG93ZXIgMC44MzcgIDAuNSAtPiAwLjkxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUwOCAgcG93ZXIgMC4wODM3ICAwLjUgLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MDkgIHBvd2VyIDAuODM4ICAwLjUgLT4gMC45MTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MTAgIHBvd2VyIDAuMDgzOCAgMC41IC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTExICBwb3dlciAwLjgzOSAgMC41IC0+IDAuOTE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTEyICBwb3dlciAwLjA4MzkgIDAuNSAtPiAwLjI5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUxMyAgcG93ZXIgMC44NDEgIDAuNSAtPiAwLjkxNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUxNCAgcG93ZXIgMC4wODQxICAwLjUgLT4gMC4yOTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MTUgIHBvd2VyIDAuODQyICAwLjUgLT4gMC45MTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MTYgIHBvd2VyIDAuMDg0MiAgMC41IC0+IDAuMjkwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTE3ICBwb3dlciAwLjg0MyAgMC41IC0+IDAuOTE4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTE4ICBwb3dlciAwLjA4NDMgIDAuNSAtPiAwLjI5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUxOSAgcG93ZXIgMC44NDQgIDAuNSAtPiAwLjkxOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUyMCAgcG93ZXIgMC4wODQ0ICAwLjUgLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MjEgIHBvd2VyIDAuODQ1ICAwLjUgLT4gMC45MTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MjIgIHBvd2VyIDAuMDg0NSAgMC41IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTIzICBwb3dlciAwLjg0NiAgMC41IC0+IDAuOTIwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTI0ICBwb3dlciAwLjA4NDYgIDAuNSAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUyNSAgcG93ZXIgMC44NDcgIDAuNSAtPiAwLjkyMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUyNiAgcG93ZXIgMC4wODQ3ICAwLjUgLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MjcgIHBvd2VyIDAuODQ4ICAwLjUgLT4gMC45MjEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MjggIHBvd2VyIDAuMDg0OCAgMC41IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTI5ICBwb3dlciAwLjg0OSAgMC41IC0+IDAuOTIxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTMwICBwb3dlciAwLjA4NDkgIDAuNSAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUzMSAgcG93ZXIgMC44NTEgIDAuNSAtPiAwLjkyMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUzMiAgcG93ZXIgMC4wODUxICAwLjUgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MzMgIHBvd2VyIDAuODUyICAwLjUgLT4gMC45MjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MzQgIHBvd2VyIDAuMDg1MiAgMC41IC0+IDAuMjkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTM1ICBwb3dlciAwLjg1MyAgMC41IC0+IDAuOTI0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTM2ICBwb3dlciAwLjA4NTMgIDAuNSAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUzNyAgcG93ZXIgMC44NTQgIDAuNSAtPiAwLjkyNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDUzOCAgcG93ZXIgMC4wODU0ICAwLjUgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1MzkgIHBvd2VyIDAuODU1ICAwLjUgLT4gMC45MjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NDAgIHBvd2VyIDAuMDg1NSAgMC41IC0+IDAuMjkyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTQxICBwb3dlciAwLjg1NiAgMC41IC0+IDAuOTI1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTQyICBwb3dlciAwLjA4NTYgIDAuNSAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU0MyAgcG93ZXIgMC44NTcgIDAuNSAtPiAwLjkyNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU0NCAgcG93ZXIgMC4wODU3ICAwLjUgLT4gMC4yOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NDUgIHBvd2VyIDAuODU4ICAwLjUgLT4gMC45MjYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NDYgIHBvd2VyIDAuMDg1OCAgMC41IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTQ3ICBwb3dlciAwLjg1OSAgMC41IC0+IDAuOTI3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTQ4ICBwb3dlciAwLjA4NTkgIDAuNSAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU0OSAgcG93ZXIgMC44NjEgIDAuNSAtPiAwLjkyOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU1MCAgcG93ZXIgMC4wODYxICAwLjUgLT4gMC4yOTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NTEgIHBvd2VyIDAuODYyICAwLjUgLT4gMC45MjggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NTIgIHBvd2VyIDAuMDg2MiAgMC41IC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTUzICBwb3dlciAwLjg2MyAgMC41IC0+IDAuOTI5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTU0ICBwb3dlciAwLjA4NjMgIDAuNSAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU1NSAgcG93ZXIgMC44NjQgIDAuNSAtPiAwLjkzMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU1NiAgcG93ZXIgMC4wODY0ICAwLjUgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NTcgIHBvd2VyIDAuODY1ICAwLjUgLT4gMC45MzAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NTggIHBvd2VyIDAuMDg2NSAgMC41IC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTU5ICBwb3dlciAwLjg2NiAgMC41IC0+IDAuOTMxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTYwICBwb3dlciAwLjA4NjYgIDAuNSAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU2MSAgcG93ZXIgMC44NjcgIDAuNSAtPiAwLjkzMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU2MiAgcG93ZXIgMC4wODY3ICAwLjUgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NjMgIHBvd2VyIDAuODY4ICAwLjUgLT4gMC45MzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NjQgIHBvd2VyIDAuMDg2OCAgMC41IC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTY1ICBwb3dlciAwLjg2OSAgMC41IC0+IDAuOTMyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTY2ICBwb3dlciAwLjA4NjkgIDAuNSAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU2NyAgcG93ZXIgMC44NzEgIDAuNSAtPiAwLjkzMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU2OCAgcG93ZXIgMC4wODcxICAwLjUgLT4gMC4yOTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NjkgIHBvd2VyIDAuODcyICAwLjUgLT4gMC45MzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NzAgIHBvd2VyIDAuMDg3MiAgMC41IC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTcxICBwb3dlciAwLjg3MyAgMC41IC0+IDAuOTM0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTcyICBwb3dlciAwLjA4NzMgIDAuNSAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU3MyAgcG93ZXIgMC44NzQgIDAuNSAtPiAwLjkzNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU3NCAgcG93ZXIgMC4wODc0ICAwLjUgLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NzUgIHBvd2VyIDAuODc1ICAwLjUgLT4gMC45MzUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1NzYgIHBvd2VyIDAuMDg3NSAgMC41IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTc3ICBwb3dlciAwLjg3NiAgMC41IC0+IDAuOTM2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTc4ICBwb3dlciAwLjA4NzYgIDAuNSAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU3OSAgcG93ZXIgMC44NzcgIDAuNSAtPiAwLjkzNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU4MCAgcG93ZXIgMC4wODc3ICAwLjUgLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1ODEgIHBvd2VyIDAuODc4ICAwLjUgLT4gMC45MzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1ODIgIHBvd2VyIDAuMDg3OCAgMC41IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTgzICBwb3dlciAwLjg3OSAgMC41IC0+IDAuOTM4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTg0ICBwb3dlciAwLjA4NzkgIDAuNSAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU4NSAgcG93ZXIgMC44ODEgIDAuNSAtPiAwLjkzOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU4NiAgcG93ZXIgMC4wODgxICAwLjUgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1ODcgIHBvd2VyIDAuODgyICAwLjUgLT4gMC45MzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1ODggIHBvd2VyIDAuMDg4MiAgMC41IC0+IDAuMjk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTg5ICBwb3dlciAwLjg4MyAgMC41IC0+IDAuOTQwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTkwICBwb3dlciAwLjA4ODMgIDAuNSAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU5MSAgcG93ZXIgMC44ODQgIDAuNSAtPiAwLjk0MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU5MiAgcG93ZXIgMC4wODg0ICAwLjUgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1OTMgIHBvd2VyIDAuODg1ICAwLjUgLT4gMC45NDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1OTQgIHBvd2VyIDAuMDg4NSAgMC41IC0+IDAuMjk3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTk1ICBwb3dlciAwLjg4NiAgMC41IC0+IDAuOTQxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NTk2ICBwb3dlciAwLjA4ODYgIDAuNSAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU5NyAgcG93ZXIgMC44ODcgIDAuNSAtPiAwLjk0MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDU5OCAgcG93ZXIgMC4wODg3ICAwLjUgLT4gMC4yOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ1OTkgIHBvd2VyIDAuODg4ICAwLjUgLT4gMC45NDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MDAgIHBvd2VyIDAuMDg4OCAgMC41IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjAxICBwb3dlciAwLjg4OSAgMC41IC0+IDAuOTQzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjAyICBwb3dlciAwLjA4ODkgIDAuNSAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYwMyAgcG93ZXIgMC44OTEgIDAuNSAtPiAwLjk0NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYwNCAgcG93ZXIgMC4wODkxICAwLjUgLT4gMC4yOTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MDUgIHBvd2VyIDAuODkyICAwLjUgLT4gMC45NDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MDYgIHBvd2VyIDAuMDg5MiAgMC41IC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjA3ICBwb3dlciAwLjg5MyAgMC41IC0+IDAuOTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjA4ICBwb3dlciAwLjA4OTMgIDAuNSAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYwOSAgcG93ZXIgMC44OTQgIDAuNSAtPiAwLjk0NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYxMCAgcG93ZXIgMC4wODk0ICAwLjUgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MTEgIHBvd2VyIDAuODk1ICAwLjUgLT4gMC45NDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MTIgIHBvd2VyIDAuMDg5NSAgMC41IC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjEzICBwb3dlciAwLjg5NiAgMC41IC0+IDAuOTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjE0ICBwb3dlciAwLjA4OTYgIDAuNSAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYxNSAgcG93ZXIgMC44OTcgIDAuNSAtPiAwLjk0NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYxNiAgcG93ZXIgMC4wODk3ICAwLjUgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MTcgIHBvd2VyIDAuODk4ICAwLjUgLT4gMC45NDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MTggIHBvd2VyIDAuMDg5OCAgMC41IC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjE5ICBwb3dlciAwLjg5OSAgMC41IC0+IDAuOTQ4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjIwICBwb3dlciAwLjA4OTkgIDAuNSAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYyMSAgcG93ZXIgMC45MDEgIDAuNSAtPiAwLjk0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYyMiAgcG93ZXIgMC4wOTAxICAwLjUgLT4gMC4zMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MjMgIHBvd2VyIDAuOTAyICAwLjUgLT4gMC45NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MjQgIHBvd2VyIDAuMDkwMiAgMC41IC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjI1ICBwb3dlciAwLjkwMyAgMC41IC0+IDAuOTUwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjI2ICBwb3dlciAwLjA5MDMgIDAuNSAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYyNyAgcG93ZXIgMC45MDQgIDAuNSAtPiAwLjk1MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYyOCAgcG93ZXIgMC4wOTA0ICAwLjUgLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MjkgIHBvd2VyIDAuOTA1ICAwLjUgLT4gMC45NTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MzAgIHBvd2VyIDAuMDkwNSAgMC41IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjMxICBwb3dlciAwLjkwNiAgMC41IC0+IDAuOTUyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjMyICBwb3dlciAwLjA5MDYgIDAuNSAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYzMyAgcG93ZXIgMC45MDcgIDAuNSAtPiAwLjk1MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYzNCAgcG93ZXIgMC4wOTA3ICAwLjUgLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MzUgIHBvd2VyIDAuOTA4ICAwLjUgLT4gMC45NTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2MzYgIHBvd2VyIDAuMDkwOCAgMC41IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjM3ICBwb3dlciAwLjkwOSAgMC41IC0+IDAuOTUzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjM4ICBwb3dlciAwLjA5MDkgIDAuNSAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDYzOSAgcG93ZXIgMC45MTEgIDAuNSAtPiAwLjk1NCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY0MCAgcG93ZXIgMC4wOTExICAwLjUgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NDEgIHBvd2VyIDAuOTEyICAwLjUgLT4gMC45NTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NDIgIHBvd2VyIDAuMDkxMiAgMC41IC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjQzICBwb3dlciAwLjkxMyAgMC41IC0+IDAuOTU2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjQ0ICBwb3dlciAwLjA5MTMgIDAuNSAtPiAwLjMwMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY0NSAgcG93ZXIgMC45MTQgIDAuNSAtPiAwLjk1NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY0NiAgcG93ZXIgMC4wOTE0ICAwLjUgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NDcgIHBvd2VyIDAuOTE1ICAwLjUgLT4gMC45NTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NDggIHBvd2VyIDAuMDkxNSAgMC41IC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjQ5ICBwb3dlciAwLjkxNiAgMC41IC0+IDAuOTU3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjUwICBwb3dlciAwLjA5MTYgIDAuNSAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY1MSAgcG93ZXIgMC45MTcgIDAuNSAtPiAwLjk1OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY1MiAgcG93ZXIgMC4wOTE3ICAwLjUgLT4gMC4zMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NTMgIHBvd2VyIDAuOTE4ICAwLjUgLT4gMC45NTggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NTQgIHBvd2VyIDAuMDkxOCAgMC41IC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjU1ICBwb3dlciAwLjkxOSAgMC41IC0+IDAuOTU5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjU2ICBwb3dlciAwLjA5MTkgIDAuNSAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY1NyAgcG93ZXIgMC45MjEgIDAuNSAtPiAwLjk2MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY1OCAgcG93ZXIgMC4wOTIxICAwLjUgLT4gMC4zMDMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NTkgIHBvd2VyIDAuOTIyICAwLjUgLT4gMC45NjAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NjAgIHBvd2VyIDAuMDkyMiAgMC41IC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjYxICBwb3dlciAwLjkyMyAgMC41IC0+IDAuOTYxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjYyICBwb3dlciAwLjA5MjMgIDAuNSAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY2MyAgcG93ZXIgMC45MjQgIDAuNSAtPiAwLjk2MSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY2NCAgcG93ZXIgMC4wOTI0ICAwLjUgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NjUgIHBvd2VyIDAuOTI1ICAwLjUgLT4gMC45NjIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NjYgIHBvd2VyIDAuMDkyNSAgMC41IC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjY3ICBwb3dlciAwLjkyNiAgMC41IC0+IDAuOTYyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjY4ICBwb3dlciAwLjA5MjYgIDAuNSAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY2OSAgcG93ZXIgMC45MjcgIDAuNSAtPiAwLjk2MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY3MCAgcG93ZXIgMC4wOTI3ICAwLjUgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NzEgIHBvd2VyIDAuOTI4ICAwLjUgLT4gMC45NjMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NzIgIHBvd2VyIDAuMDkyOCAgMC41IC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjczICBwb3dlciAwLjkyOSAgMC41IC0+IDAuOTY0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njc0ICBwb3dlciAwLjA5MjkgIDAuNSAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY3NSAgcG93ZXIgMC45MzEgIDAuNSAtPiAwLjk2NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY3NiAgcG93ZXIgMC4wOTMxICAwLjUgLT4gMC4zMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NzcgIHBvd2VyIDAuOTMyICAwLjUgLT4gMC45NjUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2NzggIHBvd2VyIDAuMDkzMiAgMC41IC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njc5ICBwb3dlciAwLjkzMyAgMC41IC0+IDAuOTY2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjgwICBwb3dlciAwLjA5MzMgIDAuNSAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY4MSAgcG93ZXIgMC45MzQgIDAuNSAtPiAwLjk2NiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY4MiAgcG93ZXIgMC4wOTM0ICAwLjUgLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2ODMgIHBvd2VyIDAuOTM1ICAwLjUgLT4gMC45NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2ODQgIHBvd2VyIDAuMDkzNSAgMC41IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njg1ICBwb3dlciAwLjkzNiAgMC41IC0+IDAuOTY3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njg2ICBwb3dlciAwLjA5MzYgIDAuNSAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY4NyAgcG93ZXIgMC45MzcgIDAuNSAtPiAwLjk2OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY4OCAgcG93ZXIgMC4wOTM3ICAwLjUgLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2ODkgIHBvd2VyIDAuOTM4ICAwLjUgLT4gMC45NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2OTAgIHBvd2VyIDAuMDkzOCAgMC41IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjkxICBwb3dlciAwLjkzOSAgMC41IC0+IDAuOTY5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NjkyICBwb3dlciAwLjA5MzkgIDAuNSAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY5MyAgcG93ZXIgMC45NDEgIDAuNSAtPiAwLjk3MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY5NCAgcG93ZXIgMC4wOTQxICAwLjUgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2OTUgIHBvd2VyIDAuOTQyICAwLjUgLT4gMC45NzEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ2OTYgIHBvd2VyIDAuMDk0MiAgMC41IC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njk3ICBwb3dlciAwLjk0MyAgMC41IC0+IDAuOTcxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Njk4ICBwb3dlciAwLjA5NDMgIDAuNSAtPiAwLjMwNyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDY5OSAgcG93ZXIgMC45NDQgIDAuNSAtPiAwLjk3MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcwMCAgcG93ZXIgMC4wOTQ0ICAwLjUgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MDEgIHBvd2VyIDAuOTQ1ICAwLjUgLT4gMC45NzIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MDIgIHBvd2VyIDAuMDk0NSAgMC41IC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzAzICBwb3dlciAwLjk0NiAgMC41IC0+IDAuOTczICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzA0ICBwb3dlciAwLjA5NDYgIDAuNSAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcwNSAgcG93ZXIgMC45NDcgIDAuNSAtPiAwLjk3MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcwNiAgcG93ZXIgMC4wOTQ3ICAwLjUgLT4gMC4zMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MDcgIHBvd2VyIDAuOTQ4ICAwLjUgLT4gMC45NzQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MDggIHBvd2VyIDAuMDk0OCAgMC41IC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzA5ICBwb3dlciAwLjk0OSAgMC41IC0+IDAuOTc0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzEwICBwb3dlciAwLjA5NDkgIDAuNSAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcxMSAgcG93ZXIgMC45NTEgIDAuNSAtPiAwLjk3NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcxMiAgcG93ZXIgMC4wOTUxICAwLjUgLT4gMC4zMDggIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MTMgIHBvd2VyIDAuOTUyICAwLjUgLT4gMC45NzYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MTQgIHBvd2VyIDAuMDk1MiAgMC41IC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzE1ICBwb3dlciAwLjk1MyAgMC41IC0+IDAuOTc2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzE2ICBwb3dlciAwLjA5NTMgIDAuNSAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcxNyAgcG93ZXIgMC45NTQgIDAuNSAtPiAwLjk3NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcxOCAgcG93ZXIgMC4wOTU0ICAwLjUgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MTkgIHBvd2VyIDAuOTU1ICAwLjUgLT4gMC45NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MjAgIHBvd2VyIDAuMDk1NSAgMC41IC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzIxICBwb3dlciAwLjk1NiAgMC41IC0+IDAuOTc4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzIyICBwb3dlciAwLjA5NTYgIDAuNSAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcyMyAgcG93ZXIgMC45NTcgIDAuNSAtPiAwLjk3OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcyNCAgcG93ZXIgMC4wOTU3ICAwLjUgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MjUgIHBvd2VyIDAuOTU4ICAwLjUgLT4gMC45NzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MjYgIHBvd2VyIDAuMDk1OCAgMC41IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzI3ICBwb3dlciAwLjk1OSAgMC41IC0+IDAuOTc5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzI4ICBwb3dlciAwLjA5NTkgIDAuNSAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDcyOSAgcG93ZXIgMC45NjEgIDAuNSAtPiAwLjk4MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDczMCAgcG93ZXIgMC4wOTYxICAwLjUgLT4gMC4zMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MzEgIHBvd2VyIDAuOTYyICAwLjUgLT4gMC45ODEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MzIgIHBvd2VyIDAuMDk2MiAgMC41IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzMzICBwb3dlciAwLjk2MyAgMC41IC0+IDAuOTgxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzM0ICBwb3dlciAwLjA5NjMgIDAuNSAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDczNSAgcG93ZXIgMC45NjQgIDAuNSAtPiAwLjk4MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDczNiAgcG93ZXIgMC4wOTY0ICAwLjUgLT4gMC4zMTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MzcgIHBvd2VyIDAuOTY1ICAwLjUgLT4gMC45ODIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3MzggIHBvd2VyIDAuMDk2NSAgMC41IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzM5ICBwb3dlciAwLjk2NiAgMC41IC0+IDAuOTgzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzQwICBwb3dlciAwLjA5NjYgIDAuNSAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc0MSAgcG93ZXIgMC45NjcgIDAuNSAtPiAwLjk4MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc0MiAgcG93ZXIgMC4wOTY3ICAwLjUgLT4gMC4zMTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NDMgIHBvd2VyIDAuOTY4ICAwLjUgLT4gMC45ODQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NDQgIHBvd2VyIDAuMDk2OCAgMC41IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzQ1ICBwb3dlciAwLjk2OSAgMC41IC0+IDAuOTg0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzQ2ICBwb3dlciAwLjA5NjkgIDAuNSAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc0NyAgcG93ZXIgMC45NzEgIDAuNSAtPiAwLjk4NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc0OCAgcG93ZXIgMC4wOTcxICAwLjUgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NDkgIHBvd2VyIDAuOTcyICAwLjUgLT4gMC45ODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NTAgIHBvd2VyIDAuMDk3MiAgMC41IC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzUxICBwb3dlciAwLjk3MyAgMC41IC0+IDAuOTg2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzUyICBwb3dlciAwLjA5NzMgIDAuNSAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc1MyAgcG93ZXIgMC45NzQgIDAuNSAtPiAwLjk4NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc1NCAgcG93ZXIgMC4wOTc0ICAwLjUgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NTUgIHBvd2VyIDAuOTc1ICAwLjUgLT4gMC45ODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NTYgIHBvd2VyIDAuMDk3NSAgMC41IC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzU3ICBwb3dlciAwLjk3NiAgMC41IC0+IDAuOTg4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzU4ICBwb3dlciAwLjA5NzYgIDAuNSAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc1OSAgcG93ZXIgMC45NzcgIDAuNSAtPiAwLjk4OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc2MCAgcG93ZXIgMC4wOTc3ICAwLjUgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NjEgIHBvd2VyIDAuOTc4ICAwLjUgLT4gMC45ODkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NjIgIHBvd2VyIDAuMDk3OCAgMC41IC0+IDAuMzEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzYzICBwb3dlciAwLjk3OSAgMC41IC0+IDAuOTg5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzY0ICBwb3dlciAwLjA5NzkgIDAuNSAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc2NSAgcG93ZXIgMC45ODEgIDAuNSAtPiAwLjk5MCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc2NiAgcG93ZXIgMC4wOTgxICAwLjUgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NjcgIHBvd2VyIDAuOTgyICAwLjUgLT4gMC45OTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NjggIHBvd2VyIDAuMDk4MiAgMC41IC0+IDAuMzEzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzY5ICBwb3dlciAwLjk4MyAgMC41IC0+IDAuOTkxICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzcwICBwb3dlciAwLjA5ODMgIDAuNSAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc3MSAgcG93ZXIgMC45ODQgIDAuNSAtPiAwLjk5MiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc3MiAgcG93ZXIgMC4wOTg0ICAwLjUgLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NzMgIHBvd2VyIDAuOTg1ICAwLjUgLT4gMC45OTIgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NzQgIHBvd2VyIDAuMDk4NSAgMC41IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzc1ICBwb3dlciAwLjk4NiAgMC41IC0+IDAuOTkzICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzc2ICBwb3dlciAwLjA5ODYgIDAuNSAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc3NyAgcG93ZXIgMC45ODcgIDAuNSAtPiAwLjk5MyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc3OCAgcG93ZXIgMC4wOTg3ICAwLjUgLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3NzkgIHBvd2VyIDAuOTg4ICAwLjUgLT4gMC45OTQgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3ODAgIHBvd2VyIDAuMDk4OCAgMC41IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzgxICBwb3dlciAwLjk4OSAgMC41IC0+IDAuOTk0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzgyICBwb3dlciAwLjA5ODkgIDAuNSAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc4MyAgcG93ZXIgMC45OTEgIDAuNSAtPiAwLjk5NSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc4NCAgcG93ZXIgMC4wOTkxICAwLjUgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3ODUgIHBvd2VyIDAuOTkyICAwLjUgLT4gMC45OTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3ODYgIHBvd2VyIDAuMDk5MiAgMC41IC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzg3ICBwb3dlciAwLjk5MyAgMC41IC0+IDAuOTk2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzg4ICBwb3dlciAwLjA5OTMgIDAuNSAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc4OSAgcG93ZXIgMC45OTQgIDAuNSAtPiAwLjk5NyAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc5MCAgcG93ZXIgMC4wOTk0ICAwLjUgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3OTEgIHBvd2VyIDAuOTk1ICAwLjUgLT4gMC45OTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3OTIgIHBvd2VyIDAuMDk5NSAgMC41IC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0NzkzICBwb3dlciAwLjk5NiAgMC41IC0+IDAuOTk4ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzk0ICBwb3dlciAwLjA5OTYgIDAuNSAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc5NSAgcG93ZXIgMC45OTcgIDAuNSAtPiAwLjk5OCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NDc5NiAgcG93ZXIgMC4wOTk3ICAwLjUgLT4gMC4zMTYgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3OTcgIHBvd2VyIDAuOTk4ICAwLjUgLT4gMC45OTkgIEluZXhhY3QgUm91bmRlZAorcHdzeDQ3OTggIHBvd2VyIDAuMDk5OCAgMC41IC0+IDAuMzE2ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0Nzk5ICBwb3dlciAwLjk5OSAgMC41IC0+IDAuOTk5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g0ODAwICBwb3dlciAwLjA5OTkgIDAuNSAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIEEgZ3JvdXAgb2YgcHJlY2lzaW9uIDQgdGVzdHMgd2hlcmUgSHVsbCAmIEFicmhhbSBhZGp1c3RtZW50cyBhcmUKKy0tIG5lZWRlZCBpbiBzb21lIGNhc2VzIChib3RoIHVwIGFuZCBkb3duKSBbc2VlIEh1bGwxOTg1Yl0KK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246ICAgNAorcHdzeDUwMDEgIHBvd2VyIDAuMDExOCAgIDAuNSAtPiAwLjEwODYgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDIgIHBvd2VyIDAuMTE5ICAgIDAuNSAtPiAwLjM0NTAgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDMgIHBvd2VyIDAuMDExOSAgIDAuNSAtPiAwLjEwOTEgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDQgIHBvd2VyIDAuMTIxICAgIDAuNSAtPiAwLjM0NzkgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDUgIHBvd2VyIDAuMDEyMSAgIDAuNSAtPiAwLjExMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDYgIHBvd2VyIDAuMTIyICAgIDAuNSAtPiAwLjM0OTMgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDcgIHBvd2VyIDAuMDEyMiAgIDAuNSAtPiAwLjExMDUgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDggIHBvd2VyIDAuMTIzICAgIDAuNSAtPiAwLjM1MDcgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMDkgIHBvd2VyIDAuNDk0ICAgIDAuNSAtPiAwLjcwMjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTAgIHBvd2VyIDAuMDY2OSAgIDAuNSAtPiAwLjI1ODcgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTEgIHBvd2VyIDAuOTU1OCAgIDAuNSAtPiAwLjk3NzcgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTIgIHBvd2VyIDAuOTM0OCAgIDAuNSAtPiAwLjk2NjkgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTMgIHBvd2VyIDAuOTM0NSAgIDAuNSAtPiAwLjk2NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTQgIHBvd2VyIDAuMDkzNDUgIDAuNSAtPiAwLjMwNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTUgIHBvd2VyIDAuOTM0NiAgIDAuNSAtPiAwLjk2NjcgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTYgIHBvd2VyIDAuMDkzNDYgIDAuNSAtPiAwLjMwNTcgIEluZXhhY3QgUm91bmRlZAorcHdzeDUwMTcgIHBvd2VyIDAuOTM0NyAgIDAuNSAtPiAwLjk2NjggIEluZXhhY3QgUm91bmRlZAorCistLSBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCitwcmVjaXNpb246IDkKK3B3c3g3MDAgIHBvd2VyICAwICAgICAgICAwLjUgLT4gJzAnCitwd3N4NzAxICBwb3dlciAgLTAgICAgICAgMC41IC0+ICcwJworcHdzeDcwMiAgcG93ZXIgIDAuMzkgICAgIDAuNSAtPiAwLjYyNDQ5OTgwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MDMgIHBvd2VyICAxMDAgICAgICAwLjUgLT4gJzEwLjAwMDAwMDAnICAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzA0ICBwb3dlciAgMS4wMCAgICAgMC41IC0+ICcxLjAwMDAwMDAwJyAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcwNSAgcG93ZXIgIDcgICAgICAgIDAuNSAtPiAnMi42NDU3NTEzMScgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MDYgIHBvd2VyICAxMCAgICAgICAwLjUgLT4gMy4xNjIyNzc2NiAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgb25lLW9mZnMKK3ByZWNpc2lvbjogOQorcHdzeDcxMSAgcG93ZXIgIDAuMSAgICAgIDAuNSAtPiAwLjMxNjIyNzc2NiAgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MTIgIHBvd2VyICAwLjIgICAgICAwLjUgLT4gMC40NDcyMTM1OTUgICAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzEzICBwb3dlciAgMC4zICAgICAgMC41IC0+IDAuNTQ3NzIyNTU4ICAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcxNCAgcG93ZXIgIDAuNCAgICAgIDAuNSAtPiAwLjYzMjQ1NTUzMiAgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MTUgIHBvd2VyICAwLjUgICAgICAwLjUgLT4gMC43MDcxMDY3ODEgICAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzE2ICBwb3dlciAgMC42ICAgICAgMC41IC0+IDAuNzc0NTk2NjY5ICAgIEluZXhhY3QgUm91bmRlZAorcHdzeDcxNyAgcG93ZXIgIDAuNyAgICAgIDAuNSAtPiAwLjgzNjY2MDAyNyAgICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MTggIHBvd2VyICAwLjggICAgICAwLjUgLT4gMC44OTQ0MjcxOTEgICAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzE5ICBwb3dlciAgMC45ICAgICAgMC41IC0+IDAuOTQ4NjgzMjk4ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMCAgICAgICAgICAgICAgIC0tIG5vdGUgbm8gbm9ybWFsaXphdG9pbiBoZXJlCitwd3N4NzIwICBwb3dlciArMC4xICAgICAgMC41IC0+IDAuMzE2MjI3NzY2MCAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMQorcHdzeDcyMSAgcG93ZXIgKzAuMSAgICAgIDAuNSAtPiAwLjMxNjIyNzc2NjAyICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIKK3B3c3g3MjIgIHBvd2VyICswLjEgICAgICAwLjUgLT4gMC4zMTYyMjc3NjYwMTcgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDkKK3B3c3g3MjMgIHBvd2VyICAwLjM5ICAgICAwLjUgLT4gMC42MjQ0OTk4MDAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDE1Citwd3N4NzI0ICBwb3dlciAgMC4zOSAgICAgMC41IC0+IDAuNjI0NDk5Nzk5ODM5ODQwIEluZXhhY3QgUm91bmRlZAorCistLSBkaXNjdXNzaW9uIGNhc2VzCitwcmVjaXNpb246IDcKK3B3c3g3MzEgIHBvd2VyICAgICA5ICAgIDAuNSAtPiAzLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzMyICBwb3dlciAgIDEwMCAgICAwLjUgLT4gMTAuMDAwMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDczMyAgcG93ZXIgICAxMjMgICAgMC41IC0+IDExLjA5MDU0ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3MzQgIHBvd2VyICAgMTQ0ICAgIDAuNSAtPiAxMi4wMDAwMCAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzM1ICBwb3dlciAgIDE1NiAgICAwLjUgLT4gMTIuNDkwMDAgIEluZXhhY3QgUm91bmRlZAorcHdzeDczNiAgcG93ZXIgMTAwMDAgICAgMC41IC0+IDEwMC4wMDAwICBJbmV4YWN0IFJvdW5kZWQKKworLS0gdmFsdWVzIGNsb3NlIHRvIG92ZXJmbG93IChpZiB0aGVyZSB3ZXJlIGlucHV0IHJvdW5kaW5nKQorbWF4ZXhwb25lbnQ6IDk5CittaW5leHBvbmVudDogLTk5CitwcmVjaXNpb246IDUKK3B3c3g3NjAgIHBvd2VyICA5Ljk5OTdFKzk5ICAgIDAuNSAtPiA5Ljk5OThFKzQ5IEluZXhhY3QgUm91bmRlZAorcHdzeDc2MSAgcG93ZXIgIDkuOTk5OEUrOTkgICAgMC41IC0+IDkuOTk5OUUrNDkgSW5leGFjdCBSb3VuZGVkCitwd3N4NzYyICBwb3dlciAgOS45OTk5RSs5OSAgICAwLjUgLT4gOS45OTk5RSs0OSBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NjMgIHBvd2VyICA5Ljk5OTkxRSs5OSAgIDAuNSAtPiAxLjAwMDBFKzUwIEluZXhhY3QgUm91bmRlZAorcHdzeDc2NCAgcG93ZXIgIDkuOTk5OTRFKzk5ICAgMC41IC0+IDEuMDAwMEUrNTAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzY1ICBwb3dlciAgOS45OTk5NUUrOTkgICAwLjUgLT4gMS4wMDAwRSs1MCBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NjYgIHBvd2VyICA5Ljk5OTk5RSs5OSAgIDAuNSAtPiAxLjAwMDBFKzUwIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA5Citwd3N4NzcwICBwb3dlciAgOS45OTk3RSs5OSAgICAwLjUgLT4gOS45OTk4NTAwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDc3MSAgcG93ZXIgIDkuOTk5OEUrOTkgICAgMC41IC0+IDkuOTk5OTAwMDBFKzQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NzIgIHBvd2VyICA5Ljk5OTlFKzk5ICAgIDAuNSAtPiA5Ljk5OTk1MDAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4NzczICBwb3dlciAgOS45OTk5MUUrOTkgICAwLjUgLT4gOS45OTk5NTUwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorcHdzeDc3NCAgcG93ZXIgIDkuOTk5OTRFKzk5ICAgMC41IC0+IDkuOTk5OTcwMDBFKzQ5ICBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3NzUgIHBvd2VyICA5Ljk5OTk1RSs5OSAgIDAuNSAtPiA5Ljk5OTk3NTAwRSs0OSAgSW5leGFjdCBSb3VuZGVkCitwd3N4Nzc2ICBwb3dlciAgOS45OTk5OUUrOTkgICAwLjUgLT4gOS45OTk5OTUwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMAorcHdzeDc4MCAgcG93ZXIgIDkuOTk5N0UrOTkgICAgMC41IC0+ICc5Ljk5OTg0OTk5ODg3NDk4MzEyNDdFKzQ5JyBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3ODEgIHBvd2VyICA5Ljk5OThFKzk5ICAgIDAuNSAtPiAnOS45OTk4OTk5OTk0OTk5OTQ5OTk5RSs0OScgSW5leGFjdCBSb3VuZGVkCitwd3N4NzgyICBwb3dlciAgOS45OTk5RSs5OSAgICAwLjUgLT4gJzkuOTk5OTQ5OTk5ODc0OTk5Mzc1MEUrNDknIEluZXhhY3QgUm91bmRlZAorcHdzeDc4MyAgcG93ZXIgIDkuOTk5OTFFKzk5ICAgMC41IC0+ICc5Ljk5OTk1NDk5OTg5ODc0OTU0NDRFKzQ5JyBJbmV4YWN0IFJvdW5kZWQKK3B3c3g3ODQgIHBvd2VyICA5Ljk5OTk0RSs5OSAgIDAuNSAtPiAnOS45OTk5Njk5OTk5NTQ5OTk4NjUwRSs0OScgSW5leGFjdCBSb3VuZGVkCitwd3N4Nzg1ICBwb3dlciAgOS45OTk5NUUrOTkgICAwLjUgLT4gJzkuOTk5OTc0OTk5OTY4NzQ5OTIxOUUrNDknIEluZXhhY3QgUm91bmRlZAorcHdzeDc4NiAgcG93ZXIgIDkuOTk5OTlFKzk5ICAgMC41IC0+ICc5Ljk5OTk5NDk5OTk5ODc0OTk5OTRFKzQ5JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93cyBbdGhlc2UgY2FuIG9ubHkgcmVzdWx0IHdoZW4gZU1heCBpcyA8IGRpZ2l0cysxXQorLS0gRXRpbnkgPSAtKEVtYXggKyAocHJlY2lzaW9uLTEpKQorLS0gc3RhcnQgd2l0aCBzdWJub3JtYWwgb3BlcmFuZHMgYW5kIG5vcm1hbCByZXN1bHRzCittYXhleHBvbmVudDogOQorbWluZXhwb25lbnQ6IC05CitwcmVjaXNpb246IDkgICAgICAgICAgICAgICAgLS0gRXRpbnk9LTE3Citwd3N4ODAwICBwb3dlciAgMUUtMTcgICAgMC41IC0+IDMuMTYyMjc3NjZFLTkgSW5leGFjdCBSb3VuZGVkCitwd3N4ODAxICBwb3dlciAxMEUtMTcgICAgMC41IC0+IDEuMDAwMDAwMDBFLTggSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEwICAgICAgICAgICAgICAgLS0gRXRpbnk9LTE4Citwd3N4ODAyICBwb3dlciAxMEUtMTggICAgMC41IC0+IDMuMTYyMjc3NjYwRS05IEluZXhhY3QgUm91bmRlZAorcHdzeDgwMyAgcG93ZXIgIDFFLTE4ICAgIDAuNSAtPiAxLjAwMDAwMDAwMEUtOSBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxMSAgICAgICAgICAgICAgIC0tIEV0aW55PS0xOQorcHdzeDgwNCAgcG93ZXIgIDFFLTE5ICAgIDAuNSAtPiAzLjE2MjI3NzY2MEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKy0tIFRoZSBuZXh0IHRlc3Qgc2hvdWxkIGJlIHNraXBwZWQgZm9yIGRlY051bWJlcgorcHdzeDgwNSAgcG93ZXIgMTBFLTE5ICAgIDAuNSAtPiAxLjAwMDAwMDAwMDBFLTkgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEyICAgICAgICAgICAgICAgLS0gRXRpbnk9LTIwCitwd3N4ODA2ICBwb3dlciAxMEUtMjAgICAgMC41IC0+IDMuMTYyMjc3NjYwMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3B3c3g4MDcgIHBvd2VyICAxRS0yMCAgICAwLjUgLT4gMS4wMDAwMDAwMDAwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDEzICAgICAgICAgICAgICAgLS0gRXRpbnk9LTIxCitwd3N4ODA4ICBwb3dlciAgMUUtMjEgICAgMC41IC0+IDMuMTYyMjc3NjYwMkUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3B3c3g4MDkgIHBvd2VyIDEwRS0yMSAgICAwLjUgLT4gMS4wMDAwMDAwMDAwMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTQgICAgICAgICAgICAgICAtLSBFdGlueT0tMjIKK3B3c3g4MTAgIHBvd2VyICAxRS0yMSAgICAwLjUgLT4gMy4xNjIyNzc2NjAxN0UtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3B3c3g4MTEgIHBvd2VyIDEwRS0yMiAgICAwLjUgLT4gMy4xNjIyNzc2NjAxN0UtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3B3c3g4MTIgIHBvd2VyICAxRS0yMiAgICAwLjUgLT4gMS4wMDAwMDAwMDAwMEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworCistLSBzcGVjaWFsIHZhbHVlcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3B3c3g4MjAgIHBvd2VyICAgSW5mICAgICAwLjUgLT4gSW5maW5pdHkKK3B3c3g4MjEgIHBvd2VyICAtSW5mICAgICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitwd3N4ODIyICBwb3dlciAgIE5hTiAgICAgMC41IC0+IE5hTgorcHdzeDgyMyAgcG93ZXIgIHNOYU4gICAgIDAuNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHByb3BhZ2F0aW5nIE5hTnMKK3B3c3g4MjQgIHBvd2VyICBzTmFOMTIzICAwLjUgLT4gTmFOMTIzIEludmFsaWRfb3BlcmF0aW9uCitwd3N4ODI1ICBwb3dlciAtc05hTjMyMSAgMC41IC0+IC1OYU4zMjEgSW52YWxpZF9vcGVyYXRpb24KK3B3c3g4MjYgIHBvd2VyICAgTmFONDU2ICAwLjUgLT4gTmFONDU2Citwd3N4ODI3ICBwb3dlciAgLU5hTjY1NCAgMC41IC0+IC1OYU42NTQKK3B3c3g4MjggIHBvd2VyICAgTmFOMSAgICAwLjUgLT4gTmFOMQorCistLSBOdWxsIHRlc3QKK3B3c3g5MDAgIHBvd2VyICAjICAwLjUgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3F1YW50aXplLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3F1YW50aXplLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmODRiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcXVhbnRpemUuZGVjVGVzdApAQCAtMCwwICsxLDk0OCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBxdWFudGl6ZS5kZWNUZXN0IC0tIGRlY2ltYWwgcXVhbnRpemUgb3BlcmF0aW9uICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIE1vc3Qgb2YgdGhlIHRlc3RzIGhlcmUgYXNzdW1lIGEgInJlZ3VsYXIgcGF0dGVybiIsIHdoZXJlIHRoZQorLS0gc2lnbiBhbmQgY29lZmZpY2llbnQgYXJlICsxLgorLS0gMjAwNC4wMy4xNSBVbmRlcmZsb3cgZm9yIHF1YW50aXplIGlzIHN1cHByZXNzZWQKKy0tIDIwMDUuMDYuMDggTW9yZSBleHRlbnNpdmUgdGVzdHMgZm9yICdkb2VzIG5vdCBmaXQnCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CisKKy0tIHNhbml0eSBjaGVja3MKK3F1YXgwMDEgcXVhbnRpemUgMCAgICAgICAxZTAgICAtPiAwCitxdWF4MDAyIHF1YW50aXplIDEgICAgICAgMWUwICAgLT4gMQorcXVheDAwMyBxdWFudGl6ZSAwLjEgICAgMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDA1IHF1YW50aXplIDAuMSAgICAxZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwMDYgcXVhbnRpemUgMC4xICAgICAxZTAgICAtPiAwIEluZXhhY3QgUm91bmRlZAorcXVheDAwNyBxdWFudGl6ZSAwLjEgICAgMWUtMSAgIC0+IDAuMQorcXVheDAwOCBxdWFudGl6ZSAwLjEgICAgMWUtMiAgIC0+IDAuMTAKK3F1YXgwMDkgcXVhbnRpemUgMC4xICAgIDFlLTMgICAtPiAwLjEwMAorcXVheDAxMCBxdWFudGl6ZSAwLjkgICAgMWUrMiAgIC0+IDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDExIHF1YW50aXplIDAuOSAgICAxZSsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwMTIgcXVhbnRpemUgMC45ICAgIDFlKzAgICAtPiAxIEluZXhhY3QgUm91bmRlZAorcXVheDAxMyBxdWFudGl6ZSAwLjkgICAgMWUtMSAgIC0+IDAuOQorcXVheDAxNCBxdWFudGl6ZSAwLjkgICAgMWUtMiAgIC0+IDAuOTAKK3F1YXgwMTUgcXVhbnRpemUgMC45ICAgIDFlLTMgICAtPiAwLjkwMAorLS0gbmVnYXRpdmVzCitxdWF4MDIxIHF1YW50aXplIC0wICAgICAgMWUwICAgLT4gLTAKK3F1YXgwMjIgcXVhbnRpemUgLTEgICAgICAxZTAgICAtPiAtMQorcXVheDAyMyBxdWFudGl6ZSAtMC4xICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDAyNSBxdWFudGl6ZSAtMC4xICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDAyNiBxdWFudGl6ZSAtMC4xICAgIDFlMCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorcXVheDAyNyBxdWFudGl6ZSAtMC4xICAgMWUtMSAgIC0+IC0wLjEKK3F1YXgwMjggcXVhbnRpemUgLTAuMSAgIDFlLTIgICAtPiAtMC4xMAorcXVheDAyOSBxdWFudGl6ZSAtMC4xICAgMWUtMyAgIC0+IC0wLjEwMAorcXVheDAzMCBxdWFudGl6ZSAtMC45ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDAzMSBxdWFudGl6ZSAtMC45ICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDAzMiBxdWFudGl6ZSAtMC45ICAgMWUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorcXVheDAzMyBxdWFudGl6ZSAtMC45ICAgMWUtMSAgIC0+IC0wLjkKK3F1YXgwMzQgcXVhbnRpemUgLTAuOSAgIDFlLTIgICAtPiAtMC45MAorcXVheDAzNSBxdWFudGl6ZSAtMC45ICAgMWUtMyAgIC0+IC0wLjkwMAorcXVheDAzNiBxdWFudGl6ZSAtMC41ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDAzNyBxdWFudGl6ZSAtMC41ICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDAzOCBxdWFudGl6ZSAtMC41ICAgMWUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorcXVheDAzOSBxdWFudGl6ZSAtMC41ICAgMWUtMSAgIC0+IC0wLjUKK3F1YXgwNDAgcXVhbnRpemUgLTAuNSAgIDFlLTIgICAtPiAtMC41MAorcXVheDA0MSBxdWFudGl6ZSAtMC41ICAgMWUtMyAgIC0+IC0wLjUwMAorcXVheDA0MiBxdWFudGl6ZSAtMC45ICAgMWUrMiAgIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDA0MyBxdWFudGl6ZSAtMC45ICAgMWUrMSAgIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDA0NCBxdWFudGl6ZSAtMC45ICAgMWUrMCAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAorcXVheDA0NSBxdWFudGl6ZSAtMC45ICAgMWUtMSAgIC0+IC0wLjkKK3F1YXgwNDYgcXVhbnRpemUgLTAuOSAgIDFlLTIgICAtPiAtMC45MAorcXVheDA0NyBxdWFudGl6ZSAtMC45ICAgMWUtMyAgIC0+IC0wLjkwMAorCistLSBleGFtcGxlcyBmcm9tIFNwZWNpZmljYXRpb24KK3F1YXgwNjAgcXVhbnRpemUgMi4xNyAgIDAuMDAxICAtPiAyLjE3MAorcXVheDA2MSBxdWFudGl6ZSAyLjE3ICAgMC4wMSAgIC0+IDIuMTcKK3F1YXgwNjIgcXVhbnRpemUgMi4xNyAgIDAuMSAgICAtPiAyLjIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDYzIHF1YW50aXplIDIuMTcgICAxZSswICAgLT4gMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwNjQgcXVhbnRpemUgMi4xNyAgIDFlKzEgICAtPiAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDA2NSBxdWFudGl6ZSAtSW5mICAgIEluZiAgIC0+IC1JbmZpbml0eQorcXVheDA2NiBxdWFudGl6ZSAyICAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDA2NyBxdWFudGl6ZSAtMC4xICAgIDEgICAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAorcXVheDA2OCBxdWFudGl6ZSAtMCAgICAgIDFlKzUgICAgIC0+IC0wRSs1CitxdWF4MDY5IHF1YW50aXplICszNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MDcwIHF1YW50aXplIC0zNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MDcxIHF1YW50aXplIDIxNyAgICAxZS0xICAgLT4gMjE3LjAKK3F1YXgwNzIgcXVhbnRpemUgMjE3ICAgIDFlKzAgICAtPiAyMTcKK3F1YXgwNzMgcXVhbnRpemUgMjE3ICAgIDFlKzEgICAtPiAyLjJFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MDc0IHF1YW50aXplIDIxNyAgICAxZSsyICAgLT4gMkUrMiBJbmV4YWN0IFJvdW5kZWQKKworLS0gZ2VuZXJhbCB0ZXN0cyAuLgorcXVheDA4OSBxdWFudGl6ZSAxMiAgICAgMWUrNCAgIC0+IDBFKzQgSW5leGFjdCBSb3VuZGVkCitxdWF4MDkwIHF1YW50aXplIDEyICAgICAxZSszICAgLT4gMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwOTEgcXVhbnRpemUgMTIgICAgIDFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDA5MiBxdWFudGl6ZSAxMiAgICAgMWUrMSAgIC0+IDFFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MDkzIHF1YW50aXplIDEuMjM0NSAxZS0yICAgLT4gMS4yMyBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwOTQgcXVhbnRpemUgMS4yMzU1IDFlLTIgICAtPiAxLjI0IEluZXhhY3QgUm91bmRlZAorcXVheDA5NSBxdWFudGl6ZSAxLjIzNDUgMWUtNiAgIC0+IDEuMjM0NTAwCitxdWF4MDk2IHF1YW50aXplIDkuOTk5OSAxZS0yICAgLT4gMTAuMDAgSW5leGFjdCBSb3VuZGVkCitxdWF4MDk3IHF1YW50aXplIDAuMDAwMSAxZS0yICAgLT4gMC4wMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgwOTggcXVhbnRpemUgMC4wMDEgIDFlLTIgICAtPiAwLjAwIEluZXhhY3QgUm91bmRlZAorcXVheDA5OSBxdWFudGl6ZSAwLjAwOSAgMWUtMiAgIC0+IDAuMDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTAwIHF1YW50aXplIDkyICAgICAxZSsyICAgLT4gMUUrMiBJbmV4YWN0IFJvdW5kZWQKKworcXVheDEwMSBxdWFudGl6ZSAtMSAgICAgIDFlMCAgIC0+ICAtMQorcXVheDEwMiBxdWFudGl6ZSAtMSAgICAgMWUtMSAgIC0+ICAtMS4wCitxdWF4MTAzIHF1YW50aXplIC0xICAgICAxZS0yICAgLT4gIC0xLjAwCitxdWF4MTA0IHF1YW50aXplICAwICAgICAgMWUwICAgLT4gIDAKK3F1YXgxMDUgcXVhbnRpemUgIDAgICAgIDFlLTEgICAtPiAgMC4wCitxdWF4MTA2IHF1YW50aXplICAwICAgICAxZS0yICAgLT4gIDAuMDAKK3F1YXgxMDcgcXVhbnRpemUgIDAuMDAgICAxZTAgICAtPiAgMAorcXVheDEwOCBxdWFudGl6ZSAgMCAgICAgMWUrMSAgIC0+ICAwRSsxCitxdWF4MTA5IHF1YW50aXplICAwICAgICAxZSsyICAgLT4gIDBFKzIKK3F1YXgxMTAgcXVhbnRpemUgKzEgICAgICAxZTAgICAtPiAgMQorcXVheDExMSBxdWFudGl6ZSArMSAgICAgMWUtMSAgIC0+ICAxLjAKK3F1YXgxMTIgcXVhbnRpemUgKzEgICAgIDFlLTIgICAtPiAgMS4wMAorCitxdWF4MTIwIHF1YW50aXplICAgMS4wNCAgMWUtMyAtPiAgMS4wNDAKK3F1YXgxMjEgcXVhbnRpemUgICAxLjA0ICAxZS0yIC0+ICAxLjA0CitxdWF4MTIyIHF1YW50aXplICAgMS4wNCAgMWUtMSAtPiAgMS4wIEluZXhhY3QgUm91bmRlZAorcXVheDEyMyBxdWFudGl6ZSAgIDEuMDQgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTI0IHF1YW50aXplICAgMS4wNSAgMWUtMyAtPiAgMS4wNTAKK3F1YXgxMjUgcXVhbnRpemUgICAxLjA1ICAxZS0yIC0+ICAxLjA1CitxdWF4MTI2IHF1YW50aXplICAgMS4wNSAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorcXVheDEzMSBxdWFudGl6ZSAgIDEuMDUgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTMyIHF1YW50aXplICAgMS4wNiAgMWUtMyAtPiAgMS4wNjAKK3F1YXgxMzMgcXVhbnRpemUgICAxLjA2ICAxZS0yIC0+ICAxLjA2CitxdWF4MTM0IHF1YW50aXplICAgMS4wNiAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorcXVheDEzNSBxdWFudGl6ZSAgIDEuMDYgICAxZTAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgxNDAgcXVhbnRpemUgICAtMTAgICAgMWUtMiAgLT4gIC0xMC4wMAorcXVheDE0MSBxdWFudGl6ZSAgICsxICAgICAxZS0yICAtPiAgMS4wMAorcXVheDE0MiBxdWFudGl6ZSAgICsxMCAgICAxZS0yICAtPiAgMTAuMDAKK3F1YXgxNDMgcXVhbnRpemUgICAxRSsxMCAgMWUtMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDE0NCBxdWFudGl6ZSAgIDFFLTEwICAxZS0yICAtPiAgMC4wMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxNDUgcXVhbnRpemUgICAxRS0zICAgMWUtMiAgLT4gIDAuMDAgSW5leGFjdCBSb3VuZGVkCitxdWF4MTQ2IHF1YW50aXplICAgMUUtMiAgIDFlLTIgIC0+ICAwLjAxCitxdWF4MTQ3IHF1YW50aXplICAgMUUtMSAgIDFlLTIgIC0+ICAwLjEwCitxdWF4MTQ4IHF1YW50aXplICAgMEUtMTAgIDFlLTIgIC0+ICAwLjAwCisKK3F1YXgxNTAgcXVhbnRpemUgICAxLjA2MDAgMWUtNSAtPiAgMS4wNjAwMAorcXVheDE1MSBxdWFudGl6ZSAgIDEuMDYwMCAxZS00IC0+ICAxLjA2MDAKK3F1YXgxNTIgcXVhbnRpemUgICAxLjA2MDAgMWUtMyAtPiAgMS4wNjAgUm91bmRlZAorcXVheDE1MyBxdWFudGl6ZSAgIDEuMDYwMCAxZS0yIC0+ICAxLjA2IFJvdW5kZWQKK3F1YXgxNTQgcXVhbnRpemUgICAxLjA2MDAgMWUtMSAtPiAgMS4xIEluZXhhY3QgUm91bmRlZAorcXVheDE1NSBxdWFudGl6ZSAgIDEuMDYwMCAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCistLSBiYXNlIHRlc3RzIHdpdGggbm9uLTEgY29lZmZpY2llbnRzCitxdWF4MTYxIHF1YW50aXplIDAgICAgICAtOWUwICAgLT4gMAorcXVheDE2MiBxdWFudGl6ZSAxICAgICAgLTdlMCAgIC0+IDEKK3F1YXgxNjMgcXVhbnRpemUgMC4xICAgLTFlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDE2NSBxdWFudGl6ZSAwLjEgICAgMGUrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTY2IHF1YW50aXplIDAuMSAgICAgMmUwICAgLT4gMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxNjcgcXVhbnRpemUgMC4xICAgIDNlLTEgICAtPiAwLjEKK3F1YXgxNjggcXVhbnRpemUgMC4xICAgNDRlLTIgICAtPiAwLjEwCitxdWF4MTY5IHF1YW50aXplIDAuMSAgNTU1ZS0zICAgLT4gMC4xMDAKK3F1YXgxNzAgcXVhbnRpemUgMC45IDY2NjZlKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDE3MSBxdWFudGl6ZSAwLjkgLTc3N2UrMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTcyIHF1YW50aXplIDAuOSAgLTg4ZSswICAgLT4gMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxNzMgcXVhbnRpemUgMC45ICAgLTllLTEgICAtPiAwLjkKK3F1YXgxNzQgcXVhbnRpemUgMC45ICAgIDBlLTIgICAtPiAwLjkwCitxdWF4MTc1IHF1YW50aXplIDAuOSAgMS4xZS0zICAgLT4gMC45MDAwCistLSBuZWdhdGl2ZXMKK3F1YXgxODEgcXVhbnRpemUgLTAgICAgMS4xZTAgICAtPiAtMC4wCitxdWF4MTgyIHF1YW50aXplIC0xICAgICAtMWUwICAgLT4gLTEKK3F1YXgxODMgcXVhbnRpemUgLTAuMSAgMTFlKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxODUgcXVhbnRpemUgLTAuMSAxMTFlKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxODYgcXVhbnRpemUgLTAuMSAgIDcxZTAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxODcgcXVhbnRpemUgLTAuMSAtOTFlLTEgICAtPiAtMC4xCitxdWF4MTg4IHF1YW50aXplIC0wLjEgLS4xZS0yICAgLT4gLTAuMTAwCitxdWF4MTg5IHF1YW50aXplIC0wLjEgIC0xZS0zICAgLT4gLTAuMTAwCitxdWF4MTkwIHF1YW50aXplIC0wLjkgICAwZSsyICAgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MTkxIHF1YW50aXplIC0wLjkgIC0wZSsxICAgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTkyIHF1YW50aXplIC0wLjkgLTEwZSswICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitxdWF4MTkzIHF1YW50aXplIC0wLjkgMTAwZS0xICAgLT4gLTAuOQorcXVheDE5NCBxdWFudGl6ZSAtMC45IDk5OWUtMiAgIC0+IC0wLjkwCisKKy0tICt2ZSBleHBvbmVudHMgLi4KK3F1YXgyMDEgcXVhbnRpemUgICAtMSAgIDFlKzAgLT4gIC0xCitxdWF4MjAyIHF1YW50aXplICAgLTEgICAxZSsxIC0+ICAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMDMgcXVhbnRpemUgICAtMSAgIDFlKzIgLT4gIC0wRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDIwNCBxdWFudGl6ZSAgICAwICAgMWUrMCAtPiAgMAorcXVheDIwNSBxdWFudGl6ZSAgICAwICAgMWUrMSAtPiAgMEUrMQorcXVheDIwNiBxdWFudGl6ZSAgICAwICAgMWUrMiAtPiAgMEUrMgorcXVheDIwNyBxdWFudGl6ZSAgICsxICAgMWUrMCAtPiAgMQorcXVheDIwOCBxdWFudGl6ZSAgICsxICAgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMDkgcXVhbnRpemUgICArMSAgIDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgyMjAgcXVhbnRpemUgICAxLjA0IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4MjIxIHF1YW50aXplICAgMS4wNCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDIyMiBxdWFudGl6ZSAgIDEuMDQgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMjMgcXVhbnRpemUgICAxLjA0IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitxdWF4MjI0IHF1YW50aXplICAgMS4wNSAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDIyNSBxdWFudGl6ZSAgIDEuMDUgMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMjYgcXVhbnRpemUgICAxLjA1IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MjI3IHF1YW50aXplICAgMS4wNSAxZSswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcXVheDIyOCBxdWFudGl6ZSAgIDEuMDUgMWUrMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMjkgcXVhbnRpemUgICAxLjA1IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4MjMwIHF1YW50aXplICAgMS4wNSAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDIzMSBxdWFudGl6ZSAgIDEuMDUgMWUrMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMzIgcXVhbnRpemUgICAxLjA2IDFlKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCitxdWF4MjMzIHF1YW50aXplICAgMS4wNiAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDIzNCBxdWFudGl6ZSAgIDEuMDYgMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyMzUgcXVhbnRpemUgICAxLjA2IDFlKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgyNDAgcXVhbnRpemUgICAtMTAgICAxZSsxICAtPiAgLTFFKzEgUm91bmRlZAorcXVheDI0MSBxdWFudGl6ZSAgICsxICAgIDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDI0MiBxdWFudGl6ZSAgICsxMCAgIDFlKzEgIC0+ICAxRSsxIFJvdW5kZWQKK3F1YXgyNDMgcXVhbnRpemUgICAxRSsxICAxZSsxICAtPiAgMUUrMSAgICAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitxdWF4MjQ0IHF1YW50aXplICAgMUUrMiAgMWUrMSAgLT4gIDEuMEUrMiAgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcXVheDI0NSBxdWFudGl6ZSAgIDFFKzMgIDFlKzEgIC0+ICAxLjAwRSszICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3F1YXgyNDYgcXVhbnRpemUgICAxRSs0ICAxZSsxICAtPiAgMS4wMDBFKzQgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitxdWF4MjQ3IHF1YW50aXplICAgMUUrNSAgMWUrMSAgLT4gIDEuMDAwMEUrNSAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcXVheDI0OCBxdWFudGl6ZSAgIDFFKzYgIDFlKzEgIC0+ICAxLjAwMDAwRSs2ICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3F1YXgyNDkgcXVhbnRpemUgICAxRSs3ICAxZSsxICAtPiAgMS4wMDAwMDBFKzcgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCitxdWF4MjUwIHF1YW50aXplICAgMUUrOCAgMWUrMSAgLT4gIDEuMDAwMDAwMEUrOCAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcXVheDI1MSBxdWFudGl6ZSAgIDFFKzkgIDFlKzEgIC0+ICAxLjAwMDAwMDAwRSs5IC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKKy0tIG5leHQgb25lIHRyaWVzIHRvIGFkZCA5IHplcm9zCitxdWF4MjUyIHF1YW50aXplICAgMUUrMTAgMWUrMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDI1MyBxdWFudGl6ZSAgIDFFLTEwIDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDI1NCBxdWFudGl6ZSAgIDFFLTIgIDFlKzEgIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDI1NSBxdWFudGl6ZSAgIDBFLTEwIDFlKzEgIC0+ICAwRSsxCitxdWF4MjU2IHF1YW50aXplICAtMEUtMTAgMWUrMSAgLT4gLTBFKzEKK3F1YXgyNTcgcXVhbnRpemUgIC0wRS0xICAxZSsxICAtPiAtMEUrMQorcXVheDI1OCBxdWFudGl6ZSAgLTAgICAgIDFlKzEgIC0+IC0wRSsxCitxdWF4MjU5IHF1YW50aXplICAtMEUrMSAgMWUrMSAgLT4gLTBFKzEKKworcXVheDI2MCBxdWFudGl6ZSAgIC0xMCAgIDFlKzIgIC0+ICAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyNjEgcXVhbnRpemUgICArMSAgICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyNjIgcXVhbnRpemUgICArMTAgICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyNjMgcXVhbnRpemUgICAxRSsxICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyNjQgcXVhbnRpemUgICAxRSsyICAxZSsyICAtPiAgMUUrMgorcXVheDI2NSBxdWFudGl6ZSAgIDFFKzMgIDFlKzIgIC0+ICAxLjBFKzMKK3F1YXgyNjYgcXVhbnRpemUgICAxRSs0ICAxZSsyICAtPiAgMS4wMEUrNAorcXVheDI2NyBxdWFudGl6ZSAgIDFFKzUgIDFlKzIgIC0+ICAxLjAwMEUrNQorcXVheDI2OCBxdWFudGl6ZSAgIDFFKzYgIDFlKzIgIC0+ICAxLjAwMDBFKzYKK3F1YXgyNjkgcXVhbnRpemUgICAxRSs3ICAxZSsyICAtPiAgMS4wMDAwMEUrNworcXVheDI3MCBxdWFudGl6ZSAgIDFFKzggIDFlKzIgIC0+ICAxLjAwMDAwMEUrOAorcXVheDI3MSBxdWFudGl6ZSAgIDFFKzkgIDFlKzIgIC0+ICAxLjAwMDAwMDBFKzkKK3F1YXgyNzIgcXVhbnRpemUgICAxRSsxMCAxZSsyICAtPiAgMS4wMDAwMDAwMEUrMTAKK3F1YXgyNzMgcXVhbnRpemUgICAxRS0xMCAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyNzQgcXVhbnRpemUgICAxRS0yICAxZSsyICAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyNzUgcXVhbnRpemUgICAwRS0xMCAxZSsyICAtPiAgMEUrMgorCitxdWF4MjgwIHF1YW50aXplICAgLTEwICAgMWUrMyAgLT4gIC0wRSszIEluZXhhY3QgUm91bmRlZAorcXVheDI4MSBxdWFudGl6ZSAgICsxICAgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDI4MiBxdWFudGl6ZSAgICsxMCAgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDI4MyBxdWFudGl6ZSAgIDFFKzEgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDI4NCBxdWFudGl6ZSAgIDFFKzIgIDFlKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcXVheDI4NSBxdWFudGl6ZSAgIDFFKzMgIDFlKzMgIC0+ICAxRSszCitxdWF4Mjg2IHF1YW50aXplICAgMUUrNCAgMWUrMyAgLT4gIDEuMEUrNAorcXVheDI4NyBxdWFudGl6ZSAgIDFFKzUgIDFlKzMgIC0+ICAxLjAwRSs1CitxdWF4Mjg4IHF1YW50aXplICAgMUUrNiAgMWUrMyAgLT4gIDEuMDAwRSs2CitxdWF4Mjg5IHF1YW50aXplICAgMUUrNyAgMWUrMyAgLT4gIDEuMDAwMEUrNworcXVheDI5MCBxdWFudGl6ZSAgIDFFKzggIDFlKzMgIC0+ICAxLjAwMDAwRSs4CitxdWF4MjkxIHF1YW50aXplICAgMUUrOSAgMWUrMyAgLT4gIDEuMDAwMDAwRSs5CitxdWF4MjkyIHF1YW50aXplICAgMUUrMTAgMWUrMyAgLT4gIDEuMDAwMDAwMEUrMTAKK3F1YXgyOTMgcXVhbnRpemUgICAxRS0xMCAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyOTQgcXVhbnRpemUgICAxRS0yICAxZSszICAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3F1YXgyOTUgcXVhbnRpemUgICAwRS0xMCAxZSszICAtPiAgMEUrMworCistLSByb3VuZCB1cCBmcm9tIGJlbG93IFtzaWduIHdyb25nIGluIEpJVCBjb21waWxlciBvbmNlXQorcXVheDMwMCBxdWFudGl6ZSAgIDAuMDA3OCAxZS01IC0+ICAwLjAwNzgwCitxdWF4MzAxIHF1YW50aXplICAgMC4wMDc4IDFlLTQgLT4gIDAuMDA3OAorcXVheDMwMiBxdWFudGl6ZSAgIDAuMDA3OCAxZS0zIC0+ICAwLjAwOCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMDMgcXVhbnRpemUgICAwLjAwNzggMWUtMiAtPiAgMC4wMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMDQgcXVhbnRpemUgICAwLjAwNzggMWUtMSAtPiAgMC4wIEluZXhhY3QgUm91bmRlZAorcXVheDMwNSBxdWFudGl6ZSAgIDAuMDA3OCAgMWUwIC0+ICAwIEluZXhhY3QgUm91bmRlZAorcXVheDMwNiBxdWFudGl6ZSAgIDAuMDA3OCAxZSsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDMwNyBxdWFudGl6ZSAgIDAuMDA3OCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCitxdWF4MzEwIHF1YW50aXplICAtMC4wMDc4IDFlLTUgLT4gLTAuMDA3ODAKK3F1YXgzMTEgcXVhbnRpemUgIC0wLjAwNzggMWUtNCAtPiAtMC4wMDc4CitxdWF4MzEyIHF1YW50aXplICAtMC4wMDc4IDFlLTMgLT4gLTAuMDA4IEluZXhhY3QgUm91bmRlZAorcXVheDMxMyBxdWFudGl6ZSAgLTAuMDA3OCAxZS0yIC0+IC0wLjAxIEluZXhhY3QgUm91bmRlZAorcXVheDMxNCBxdWFudGl6ZSAgLTAuMDA3OCAxZS0xIC0+IC0wLjAgSW5leGFjdCBSb3VuZGVkCitxdWF4MzE1IHF1YW50aXplICAtMC4wMDc4ICAxZTAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitxdWF4MzE2IHF1YW50aXplICAtMC4wMDc4IDFlKzEgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzE3IHF1YW50aXplICAtMC4wMDc4IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgzMjAgcXVhbnRpemUgICAwLjA3OCAxZS01IC0+ICAwLjA3ODAwCitxdWF4MzIxIHF1YW50aXplICAgMC4wNzggMWUtNCAtPiAgMC4wNzgwCitxdWF4MzIyIHF1YW50aXplICAgMC4wNzggMWUtMyAtPiAgMC4wNzgKK3F1YXgzMjMgcXVhbnRpemUgICAwLjA3OCAxZS0yIC0+ICAwLjA4IEluZXhhY3QgUm91bmRlZAorcXVheDMyNCBxdWFudGl6ZSAgIDAuMDc4IDFlLTEgLT4gIDAuMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMjUgcXVhbnRpemUgICAwLjA3OCAgMWUwIC0+ICAwIEluZXhhY3QgUm91bmRlZAorcXVheDMyNiBxdWFudGl6ZSAgIDAuMDc4IDFlKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzI3IHF1YW50aXplICAgMC4wNzggMWUrMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcXVheDMzMCBxdWFudGl6ZSAgLTAuMDc4IDFlLTUgLT4gLTAuMDc4MDAKK3F1YXgzMzEgcXVhbnRpemUgIC0wLjA3OCAxZS00IC0+IC0wLjA3ODAKK3F1YXgzMzIgcXVhbnRpemUgIC0wLjA3OCAxZS0zIC0+IC0wLjA3OAorcXVheDMzMyBxdWFudGl6ZSAgLTAuMDc4IDFlLTIgLT4gLTAuMDggSW5leGFjdCBSb3VuZGVkCitxdWF4MzM0IHF1YW50aXplICAtMC4wNzggMWUtMSAtPiAtMC4xIEluZXhhY3QgUm91bmRlZAorcXVheDMzNSBxdWFudGl6ZSAgLTAuMDc4ICAxZTAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitxdWF4MzM2IHF1YW50aXplICAtMC4wNzggMWUrMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzMzcgcXVhbnRpemUgIC0wLjA3OCAxZSsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCitxdWF4MzQwIHF1YW50aXplICAgMC43OCAxZS01IC0+ICAwLjc4MDAwCitxdWF4MzQxIHF1YW50aXplICAgMC43OCAxZS00IC0+ICAwLjc4MDAKK3F1YXgzNDIgcXVhbnRpemUgICAwLjc4IDFlLTMgLT4gIDAuNzgwCitxdWF4MzQzIHF1YW50aXplICAgMC43OCAxZS0yIC0+ICAwLjc4CitxdWF4MzQ0IHF1YW50aXplICAgMC43OCAxZS0xIC0+ICAwLjggSW5leGFjdCBSb3VuZGVkCitxdWF4MzQ1IHF1YW50aXplICAgMC43OCAgMWUwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcXVheDM0NiBxdWFudGl6ZSAgIDAuNzggMWUrMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzNDcgcXVhbnRpemUgICAwLjc4IDFlKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3F1YXgzNTAgcXVhbnRpemUgIC0wLjc4IDFlLTUgLT4gLTAuNzgwMDAKK3F1YXgzNTEgcXVhbnRpemUgIC0wLjc4IDFlLTQgLT4gLTAuNzgwMAorcXVheDM1MiBxdWFudGl6ZSAgLTAuNzggMWUtMyAtPiAtMC43ODAKK3F1YXgzNTMgcXVhbnRpemUgIC0wLjc4IDFlLTIgLT4gLTAuNzgKK3F1YXgzNTQgcXVhbnRpemUgIC0wLjc4IDFlLTEgLT4gLTAuOCBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzNTUgcXVhbnRpemUgIC0wLjc4ICAxZTAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzU2IHF1YW50aXplICAtMC43OCAxZSsxIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDM1NyBxdWFudGl6ZSAgLTAuNzggMWUrMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcXVheDM2MCBxdWFudGl6ZSAgIDcuOCAxZS01IC0+ICA3LjgwMDAwCitxdWF4MzYxIHF1YW50aXplICAgNy44IDFlLTQgLT4gIDcuODAwMAorcXVheDM2MiBxdWFudGl6ZSAgIDcuOCAxZS0zIC0+ICA3LjgwMAorcXVheDM2MyBxdWFudGl6ZSAgIDcuOCAxZS0yIC0+ICA3LjgwCitxdWF4MzY0IHF1YW50aXplICAgNy44IDFlLTEgLT4gIDcuOAorcXVheDM2NSBxdWFudGl6ZSAgIDcuOCAgMWUwIC0+ICA4IEluZXhhY3QgUm91bmRlZAorcXVheDM2NiBxdWFudGl6ZSAgIDcuOCAxZSsxIC0+ICAxRSsxIEluZXhhY3QgUm91bmRlZAorcXVheDM2NyBxdWFudGl6ZSAgIDcuOCAxZSsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcXVheDM2OCBxdWFudGl6ZSAgIDcuOCAxZSszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorCitxdWF4MzcwIHF1YW50aXplICAtNy44IDFlLTUgLT4gLTcuODAwMDAKK3F1YXgzNzEgcXVhbnRpemUgIC03LjggMWUtNCAtPiAtNy44MDAwCitxdWF4MzcyIHF1YW50aXplICAtNy44IDFlLTMgLT4gLTcuODAwCitxdWF4MzczIHF1YW50aXplICAtNy44IDFlLTIgLT4gLTcuODAKK3F1YXgzNzQgcXVhbnRpemUgIC03LjggMWUtMSAtPiAtNy44CitxdWF4Mzc1IHF1YW50aXplICAtNy44ICAxZTAgLT4gLTggSW5leGFjdCBSb3VuZGVkCitxdWF4Mzc2IHF1YW50aXplICAtNy44IDFlKzEgLT4gLTFFKzEgSW5leGFjdCBSb3VuZGVkCitxdWF4Mzc3IHF1YW50aXplICAtNy44IDFlKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCitxdWF4Mzc4IHF1YW50aXplICAtNy44IDFlKzMgLT4gLTBFKzMgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgaW5kaXZpZHVhbHMKK3ByZWNpc2lvbjogOQorcXVheDM4MCBxdWFudGl6ZSAgIDM1MjM2NC41MDYgMWUtMiAtPiAzNTIzNjQuNTEgSW5leGFjdCBSb3VuZGVkCitxdWF4MzgxIHF1YW50aXplICAgMzUyMzY0NS4wNiAxZS0yIC0+IDM1MjM2NDUuMDYKK3F1YXgzODIgcXVhbnRpemUgICAzNTIzNjQ1MC42IDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MzgzIHF1YW50aXplICAgMzUyMzY0NTA2ICAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDM4NCBxdWFudGl6ZSAgLTM1MjM2NC41MDYgMWUtMiAtPiAtMzUyMzY0LjUxIEluZXhhY3QgUm91bmRlZAorcXVheDM4NSBxdWFudGl6ZSAgLTM1MjM2NDUuMDYgMWUtMiAtPiAtMzUyMzY0NS4wNgorcXVheDM4NiBxdWFudGl6ZSAgLTM1MjM2NDUwLjYgMWUtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXgzODcgcXVhbnRpemUgIC0zNTIzNjQ1MDYgIDFlLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3JvdW5kaW5nOiBkb3duCitxdWF4Mzg5IHF1YW50aXplICAgMzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gPyBzaG91bGQgdGhhdCBvbmUgaW5zdGVhZCBoYXZlIGJlZW46CistLSBxdWF4Mzg5IHF1YW50aXplICAgMzUyMzY0NTAuNiAxZS0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm91bmRpbmc6IGhhbGZfdXAKKworLS0gYW5kIGEgZmV3IG1vcmUgZnJvbSBlLW1haWwgZGlzY3Vzc2lvbnMKK3ByZWNpc2lvbjogNworcXVheDM5MSBxdWFudGl6ZSAgMTIuMzQ1NjcgIDFlLTMgLT4gMTIuMzQ2ICAgSW5leGFjdCBSb3VuZGVkCitxdWF4MzkyIHF1YW50aXplICAxMjMuNDU2NyAgMWUtMyAtPiAxMjMuNDU3ICBJbmV4YWN0IFJvdW5kZWQKK3F1YXgzOTMgcXVhbnRpemUgIDEyMzQuNTY3ICAxZS0zIC0+IDEyMzQuNTY3CitxdWF4Mzk0IHF1YW50aXplICAxMjM0NS42NyAgMWUtMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXgzOTUgcXVhbnRpemUgIDEyMzQ1Ni43ICAxZS0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDM5NiBxdWFudGl6ZSAgMTIzNDU2Ny4gIDFlLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHNvbWUgOTk5OSByb3VuZC11cCBjYXNlcworcHJlY2lzaW9uOiA5CitxdWF4NDAwIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTUgIC0+ICA5Ljk5OTAwCitxdWF4NDAxIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTQgIC0+ICA5Ljk5OTAKK3F1YXg0MDIgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtMyAgLT4gIDkuOTk5CitxdWF4NDAzIHF1YW50aXplICAgOS45OTkgICAgICAgIDFlLTIgIC0+IDEwLjAwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MDQgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgMWUtMSAgLT4gMTAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQwNSBxdWFudGl6ZSAgIDkuOTk5ICAgICAgICAgMWUwICAtPiAxMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDA2IHF1YW50aXplICAgOS45OTkgICAgICAgICAxZTEgIC0+IDFFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MDcgcXVhbnRpemUgICA5Ljk5OSAgICAgICAgIDFlMiAgLT4gMEUrMiAgICAgIEluZXhhY3QgUm91bmRlZAorCitxdWF4NDEwIHF1YW50aXplICAgMC45OTkgICAgICAgIDFlLTUgIC0+ICAwLjk5OTAwCitxdWF4NDExIHF1YW50aXplICAgMC45OTkgICAgICAgIDFlLTQgIC0+ICAwLjk5OTAKK3F1YXg0MTIgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMyAgLT4gIDAuOTk5CitxdWF4NDEzIHF1YW50aXplICAgMC45OTkgICAgICAgIDFlLTIgIC0+ICAxLjAwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MTQgcXVhbnRpemUgICAwLjk5OSAgICAgICAgMWUtMSAgLT4gIDEuMCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQxNSBxdWFudGl6ZSAgIDAuOTk5ICAgICAgICAgMWUwICAtPiAgMSAgICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDE2IHF1YW50aXplICAgMC45OTkgICAgICAgICAxZTEgIC0+IDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcXVheDQyMCBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS01ICAtPiAgMC4wOTk5MAorcXVheDQyMSBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS00ICAtPiAgMC4wOTk5CitxdWF4NDIyIHF1YW50aXplICAgMC4wOTk5ICAgICAgIDFlLTMgIC0+ICAwLjEwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MjMgcXVhbnRpemUgICAwLjA5OTkgICAgICAgMWUtMiAgLT4gIDAuMTAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQyNCBxdWFudGl6ZSAgIDAuMDk5OSAgICAgICAxZS0xICAtPiAgMC4xICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDI1IHF1YW50aXplICAgMC4wOTk5ICAgICAgICAxZTAgIC0+ICAwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MjYgcXVhbnRpemUgICAwLjA5OTkgICAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitxdWF4NDMwIHF1YW50aXplICAgMC4wMDk5OSAgICAgIDFlLTUgIC0+ICAwLjAwOTk5CitxdWF4NDMxIHF1YW50aXplICAgMC4wMDk5OSAgICAgIDFlLTQgIC0+ICAwLjAxMDAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MzIgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgMWUtMyAgLT4gIDAuMDEwICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQzMyBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAxZS0yICAtPiAgMC4wMSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDM0IHF1YW50aXplICAgMC4wMDk5OSAgICAgIDFlLTEgIC0+ICAwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0MzUgcXVhbnRpemUgICAwLjAwOTk5ICAgICAgIDFlMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQzNiBxdWFudGl6ZSAgIDAuMDA5OTkgICAgICAgMWUxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3F1YXg0NDAgcXVhbnRpemUgICAwLjAwMDk5OSAgICAgMWUtNSAgLT4gIDAuMDAxMDAgIEluZXhhY3QgUm91bmRlZAorcXVheDQ0MSBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS00ICAtPiAgMC4wMDEwICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDQyIHF1YW50aXplICAgMC4wMDA5OTkgICAgIDFlLTMgIC0+ICAwLjAwMSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NDMgcXVhbnRpemUgICAwLjAwMDk5OSAgICAgMWUtMiAgLT4gIDAuMDAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDQ0NCBxdWFudGl6ZSAgIDAuMDAwOTk5ICAgICAxZS0xICAtPiAgMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDQ1IHF1YW50aXplICAgMC4wMDA5OTkgICAgICAxZTAgIC0+ICAwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0NDYgcXVhbnRpemUgICAwLjAwMDk5OSAgICAgIDFlMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDgKK3F1YXg0NDkgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDQ1MCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMiAtPiAgOS45OTkwMDAwRS0xNQorcXVheDQ1MSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMSAtPiAgOS45OTkwMDBFLTE1CitxdWF4NDUyIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIwIC0+ICA5Ljk5OTAwRS0xNQorcXVheDQ1MyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xOSAtPiAgOS45OTkwRS0xNQorcXVheDQ1NCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xOCAtPiAgOS45OTlFLTE1CitxdWF4NDU1IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE3IC0+ICAxLjAwMEUtMTQgSW5leGFjdCBSb3VuZGVkCitxdWF4NDU2IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE2IC0+ICAxLjAwRS0xNCAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDU3IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE1IC0+ICAxLjBFLTE0ICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDU4IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE0IC0+ICAxRS0xNCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDU5IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTEzIC0+ICAwRS0xMyAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDYwIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTEyIC0+ICAwRS0xMiAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDYxIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTExIC0+ICAwRS0xMSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDYyIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTEwIC0+ICAwRS0xMCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDYzIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS05IC0+ICAwRS05ICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDY0IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS04IC0+ICAwRS04ICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDY1IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS03IC0+ICAwRS03ICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDY2IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS02IC0+ICAwLjAwMDAwMCAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDY3IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS01IC0+ICAwLjAwMDAwICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDY4IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS00IC0+ICAwLjAwMDAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDY5IHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS0zIC0+ICAwLjAwMCAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDcwIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS0yIC0+ICAwLjAwICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDcxIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAxZS0xIC0+ICAwLjAgICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDcyIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAgMWUwIC0+ICAwICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDczIHF1YW50aXplICAgOS45OTlFLTE1ICAgICAgMWUxIC0+ICAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogNworcXVheDkwMCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMiAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4OTAxIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIxIC0+ICA5Ljk5OTAwMEUtMTUKK3F1YXg5MDIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjAgLT4gIDkuOTk5MDBFLTE1CitxdWF4OTAzIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE5IC0+ICA5Ljk5OTBFLTE1CitxdWF4OTA0IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE4IC0+ICA5Ljk5OUUtMTUKK3F1YXg5MDUgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTcgLT4gIDEuMDAwRS0xNCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MDYgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTYgLT4gIDEuMDBFLTE0ICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MDcgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTUgLT4gIDEuMEUtMTQgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MDggcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTQgLT4gIDFFLTE0ICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MDkgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTMgLT4gIDBFLTEzICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTIgLT4gIDBFLTEyICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTEgLT4gIDBFLTExICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTAgLT4gIDBFLTEwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTkgLT4gIDBFLTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTQgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTggLT4gIDBFLTggICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTUgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTcgLT4gIDBFLTcgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTYgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTYgLT4gIDAuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTcgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTUgLT4gIDAuMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTggcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTQgLT4gIDAuMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MTkgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTMgLT4gIDAuMDAwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MjAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTIgLT4gIDAuMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MjEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTEgLT4gIDAuMCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MjIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgICAxZTAgLT4gIDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5MjMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgICAxZTEgLT4gIDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiA2CitxdWF4OTMwIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIyIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg5MzEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjEgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDkzMiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMCAtPiAgOS45OTkwMEUtMTUKK3F1YXg5MzMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTkgLT4gIDkuOTk5MEUtMTUKK3F1YXg5MzQgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTggLT4gIDkuOTk5RS0xNQorcXVheDkzNSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNyAtPiAgMS4wMDBFLTE0IEluZXhhY3QgUm91bmRlZAorcXVheDkzNiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNiAtPiAgMS4wMEUtMTQgIEluZXhhY3QgUm91bmRlZAorcXVheDkzNyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNSAtPiAgMS4wRS0xNCAgIEluZXhhY3QgUm91bmRlZAorcXVheDkzOCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xNCAtPiAgMUUtMTQgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDkzOSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMyAtPiAgMEUtMTMgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0MCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMiAtPiAgMEUtMTIgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0MSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMSAtPiAgMEUtMTEgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0MiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xMCAtPiAgMEUtMTAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0MyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtOSAtPiAgMEUtOSAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0NCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtOCAtPiAgMEUtOCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0NSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNyAtPiAgMEUtNyAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0NiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNiAtPiAgMC4wMDAwMDAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0NyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNSAtPiAgMC4wMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0OCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtNCAtPiAgMC4wMDAwICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk0OSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMyAtPiAgMC4wMDAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk1MCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMiAtPiAgMC4wMCAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk1MSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgMWUtMSAtPiAgMC4wICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk1MiBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgIDFlMCAtPiAgMCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDk1MyBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAgIDFlMSAtPiAgMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDMKK3F1YXg5NjAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMjIgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDk2MSBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0yMSAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4OTYyIHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTIwIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg5NjMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTkgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDk2NCBxdWFudGl6ZSAgIDkuOTk5RS0xNSAgICAxZS0xOCAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4OTY1IHF1YW50aXplICAgOS45OTlFLTE1ICAgIDFlLTE3IC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg5NjYgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTYgLT4gIDEuMDBFLTE0ICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NjcgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTUgLT4gIDEuMEUtMTQgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NjggcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTQgLT4gIDFFLTE0ICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NjkgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTMgLT4gIDBFLTEzICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTIgLT4gIDBFLTEyICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTEgLT4gIDBFLTExICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgMWUtMTAgLT4gIDBFLTEwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTkgLT4gIDBFLTkgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzQgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTggLT4gIDBFLTggICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzUgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTcgLT4gIDBFLTcgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzYgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTYgLT4gIDAuMDAwMDAwICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzcgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTUgLT4gIDAuMDAwMDAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzggcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTQgLT4gIDAuMDAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5NzkgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTMgLT4gIDAuMDAwICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5ODAgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTIgLT4gIDAuMDAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5ODEgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgIDFlLTEgLT4gIDAuMCAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5ODIgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgICAxZTAgLT4gIDAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg5ODMgcXVhbnRpemUgICA5Ljk5OUUtMTUgICAgICAxZTEgLT4gIDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gRnVuZyBMZWUncyBjYXNlICYgc2ltaWxhcgorcHJlY2lzaW9uOiAzCitxdWF4MTAwMSBxdWFudGl6ZSAgMC4wMDAgICAgICAgIDAuMDAxIC0+ICAwLjAwMAorcXVheDEwMDIgcXVhbnRpemUgIDAuMDAxICAgICAgICAwLjAwMSAtPiAgMC4wMDEKK3F1YXgxMDAzIHF1YW50aXplICAwLjAwMTIgICAgICAgMC4wMDEgLT4gIDAuMDAxICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxMDA0IHF1YW50aXplICAwLjAwMTggICAgICAgMC4wMDEgLT4gIDAuMDAyICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXgxMDA1IHF1YW50aXplICAwLjUwMSAgICAgICAgMC4wMDEgLT4gIDAuNTAxCitxdWF4MTAwNiBxdWFudGl6ZSAgMC41MDEyICAgICAgIDAuMDAxIC0+ICAwLjUwMSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4MTAwNyBxdWFudGl6ZSAgMC41MDE4ICAgICAgIDAuMDAxIC0+ICAwLjUwMiAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4MTAwOCBxdWFudGl6ZSAgMC45OTkgICAgICAgIDAuMDAxIC0+ICAwLjk5OQorcXVheDEwMDkgcXVhbnRpemUgIDAuOTk5MiAgICAgICAwLjAwMSAtPiAgMC45OTkgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDEwMTAgcXVhbnRpemUgIDAuOTk5OCAgICAgICAwLjAwMSAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MTAxMSBxdWFudGl6ZSAgMS4wMDAxICAgICAgIDAuMDAxIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXgxMDEyIHF1YW50aXplICAxLjAwNTEgICAgICAgMC4wMDEgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDEwMTMgcXVhbnRpemUgIDEuMDU1MSAgICAgICAwLjAwMSAtPiAgTmFOICAgICAgIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MTAxNCBxdWFudGl6ZSAgMS41NTUxICAgICAgIDAuMDAxIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXgxMDE1IHF1YW50aXplICAxLjk5OTkgICAgICAgMC4wMDEgLT4gIE5hTiAgICAgICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzIFtyaHMgY2hlY2tzIHJlbW92ZWRdCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CitxdWF4NDgxIHF1YW50aXplIDEyMzQ1Njc4MDAwIDFlKzMgLT4gMS4yMzQ1Njc4RSsxMCBSb3VuZGVkCitxdWF4NDgyIHF1YW50aXplIDEyMzQ1Njc4MDAgIDFlKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCitxdWF4NDgzIHF1YW50aXplIDEyMzQ1Njc4OTAgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCitxdWF4NDg0IHF1YW50aXplIDEyMzQ1Njc4OTEgIDFlKzEgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0ODUgcXVhbnRpemUgMTIzNDU2Nzg5MDEgMWUrMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0ODYgcXVhbnRpemUgMTIzNDU2Nzg5NiAgMWUrMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorLS0gYSBwb3RlbnRpYWwgZG91YmxlLXJvdW5kCitxdWF4NDg3IHF1YW50aXplIDEyMzQuOTg3NjQzIDFlLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorcXVheDQ4OCBxdWFudGl6ZSAxMjM0Ljk4NzY0NyAxZS00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxNQorcXVheDQ5MSBxdWFudGl6ZSAxMjM0NTY3ODAwMCAxZSszIC0+IDEuMjM0NTY3OEUrMTAgUm91bmRlZAorcXVheDQ5MiBxdWFudGl6ZSAxMjM0NTY3ODAwICAxZSsxIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorcXVheDQ5MyBxdWFudGl6ZSAxMjM0NTY3ODkwICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorcXVheDQ5NCBxdWFudGl6ZSAxMjM0NTY3ODkxICAxZSsxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitxdWF4NDk1IHF1YW50aXplIDEyMzQ1Njc4OTAxIDFlKzIgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCitxdWF4NDk2IHF1YW50aXplIDEyMzQ1Njc4OTYgIDFlKzEgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK3F1YXg0OTcgcXVhbnRpemUgMTIzNC45ODc2NDMgMWUtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCitxdWF4NDk4IHF1YW50aXplIDEyMzQuOTg3NjQ3IDFlLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorCistLSBaZXJvcworcXVheDUwMCBxdWFudGl6ZSAgIDAgICAgIDFlMSAtPiAgMEUrMQorcXVheDUwMSBxdWFudGl6ZSAgIDAgICAgIDFlMCAtPiAgMAorcXVheDUwMiBxdWFudGl6ZSAgIDAgICAgMWUtMSAtPiAgMC4wCitxdWF4NTAzIHF1YW50aXplICAgMC4wICAxZS0xIC0+ICAwLjAKK3F1YXg1MDQgcXVhbnRpemUgICAwLjAgICAxZTAgLT4gIDAKK3F1YXg1MDUgcXVhbnRpemUgICAwLjAgIDFlKzEgLT4gIDBFKzEKK3F1YXg1MDYgcXVhbnRpemUgICAwRSsxIDFlLTEgLT4gIDAuMAorcXVheDUwNyBxdWFudGl6ZSAgIDBFKzEgIDFlMCAtPiAgMAorcXVheDUwOCBxdWFudGl6ZSAgIDBFKzEgMWUrMSAtPiAgMEUrMQorcXVheDUwOSBxdWFudGl6ZSAgLTAgICAgIDFlMSAtPiAtMEUrMQorcXVheDUxMCBxdWFudGl6ZSAgLTAgICAgIDFlMCAtPiAtMAorcXVheDUxMSBxdWFudGl6ZSAgLTAgICAgMWUtMSAtPiAtMC4wCitxdWF4NTEyIHF1YW50aXplICAtMC4wICAxZS0xIC0+IC0wLjAKK3F1YXg1MTMgcXVhbnRpemUgIC0wLjAgICAxZTAgLT4gLTAKK3F1YXg1MTQgcXVhbnRpemUgIC0wLjAgIDFlKzEgLT4gLTBFKzEKK3F1YXg1MTUgcXVhbnRpemUgIC0wRSsxIDFlLTEgLT4gLTAuMAorcXVheDUxNiBxdWFudGl6ZSAgLTBFKzEgIDFlMCAtPiAtMAorcXVheDUxNyBxdWFudGl6ZSAgLTBFKzEgMWUrMSAtPiAtMEUrMQorCistLSBTdXNwaWNpb3VzIFJIUyB2YWx1ZXMKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDE1CitxdWF4NTIwIHF1YW50aXplICAgMS4yMzQgICAgMWU5OTk5OTkwMDAgLT4gMEUrOTk5OTk5MDAwIEluZXhhY3QgUm91bmRlZAorcXVheDUyMSBxdWFudGl6ZSAxMjMuNDU2ICAgIDFlOTk5OTk5MDAwIC0+IDBFKzk5OTk5OTAwMCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1MjIgcXVhbnRpemUgICAxLjIzNCAgICAxZTk5OTk5OTk5OSAtPiAwRSs5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCitxdWF4NTIzIHF1YW50aXplIDEyMy40NTYgICAgMWU5OTk5OTk5OTkgLT4gMEUrOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorcXVheDUyNCBxdWFudGl6ZSAxMjMuNDU2ICAgMWUxMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUyNSBxdWFudGl6ZSAxMjMuNDU2ICAxZTEyMzQ1Njc4OTAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gbmV4dCBmb3VyIGFyZSAid29uJ3QgZml0IiBvdmVyZmxvd3MKK3F1YXg1MjYgcXVhbnRpemUgICAxLjIzNCAgIDFlLTk5OTk5OTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1MjcgcXVhbnRpemUgMTIzLjQ1NiAgIDFlLTk5OTk5OTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1MjggcXVhbnRpemUgICAxLjIzNCAgIDFlLTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1MjkgcXVhbnRpemUgMTIzLjQ1NiAgIDFlLTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1MzAgcXVhbnRpemUgMTIzLjQ1NiAgMWUtMTAwMDAwMDAxNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg1MzEgcXVhbnRpemUgMTIzLjQ1NiAxZS0xMjM0NTY3ODkwMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogMTUKK3F1YXg1MzIgcXVhbnRpemUgICAxLjIzNEUrOTk5ICAgIDFlOTk5IC0+IDFFKzk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1MzMgcXVhbnRpemUgICAxLjIzNEUrOTk4ICAgIDFlOTk5IC0+IDBFKzk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1MzQgcXVhbnRpemUgICAxLjIzNCAgICAgICAgIDFlOTk5IC0+IDBFKzk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1MzUgcXVhbnRpemUgICAxLjIzNCAgICAgICAgMWUxMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUzNiBxdWFudGl6ZSAgIDEuMjM0ICAgICAgICAxZTUwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTM3IHF1YW50aXplICAgMCAgICAgICAgICAgIDFlLTk5OSAtPiAwRS05OTkKKy0tIG5leHQgdHdvIGFyZSAid29uJ3QgZml0IiBvdmVyZmxvd3MKK3F1YXg1MzggcXVhbnRpemUgICAxLjIzNCAgICAgICAgMWUtOTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDUzOSBxdWFudGl6ZSAgIDEuMjM0ICAgICAgIDFlLTEwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTQwIHF1YW50aXplICAgMS4yMzQgICAgICAgMWUtNTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIFttb3JlIGJlbG93XQorCistLSBjaGVjayBib3VuZHMgKGxocyBtYXliZSBvdXQgb2YgcmFuZ2UgZm9yIGRlc3RpbmF0aW9uLCBldGMuKQorcHJlY2lzaW9uOiAgICAgNworcXVheDU0MSBxdWFudGl6ZSAgIDFFKzk5OSAgIDFlKzk5OSAtPiAxRSs5OTkKK3F1YXg1NDIgcXVhbnRpemUgICAxRSsxMDAwICAxZSs5OTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTQzIHF1YW50aXplICAgMUUrOTk5ICAxZSsxMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDU0NCBxdWFudGl6ZSAgIDFFLTk5OSAgIDFlLTk5OSAtPiAxRS05OTkKK3F1YXg1NDUgcXVhbnRpemUgICAxRS0xMDAwICAxZS05OTkgLT4gMEUtOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcXVheDU0NiBxdWFudGl6ZSAgIDFFLTk5OSAgMWUtMTAwMCAtPiAxLjBFLTk5OQorcXVheDU0NyBxdWFudGl6ZSAgIDFFLTEwMDUgIDFlLTk5OSAtPiAwRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NTQ4IHF1YW50aXplICAgMUUtMTAwNiAgMWUtOTk5IC0+IDBFLTk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NDkgcXVhbnRpemUgICAxRS0xMDA3ICAxZS05OTkgLT4gMEUtOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcXVheDU1MCBxdWFudGl6ZSAgIDFFLTk5OCAgMWUtMTAwNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24gIC0tIHdvbid0IGZpdAorcXVheDU1MSBxdWFudGl6ZSAgIDFFLTk5OSAgMWUtMTAwNSAtPiAxLjAwMDAwMEUtOTk5CitxdWF4NTUyIHF1YW50aXplICAgMUUtMTAwMCAxZS0xMDA1IC0+IDEuMDAwMDBFLTEwMDAgU3Vibm9ybWFsCitxdWF4NTUzIHF1YW50aXplICAgMUUtOTk5ICAxZS0xMDA2IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDU1NCBxdWFudGl6ZSAgIDFFLTk5OSAgMWUtMTAwNyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHJlbGF0ZWQgc3Vibm9ybWFsIHJvdW5kaW5nCitxdWF4NTU1IHF1YW50aXplICAgMS42NjY2NjZFLTk5OSAgMWUtMTAwNSAtPiAxLjY2NjY2NkUtOTk5CitxdWF4NTU2IHF1YW50aXplICAgMS42NjY2NjZFLTEwMDAgMWUtMTAwNSAtPiAxLjY2NjY3RS0xMDAwICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitxdWF4NTU3IHF1YW50aXplICAgMS42NjY2NjZFLTEwMDEgMWUtMTAwNSAtPiAxLjY2NjdFLTEwMDEgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NTggcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwMiAxZS0xMDA1IC0+IDEuNjY3RS0xMDAyICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitxdWF4NTU5IHF1YW50aXplICAgMS42NjY2NjZFLTEwMDMgMWUtMTAwNSAtPiAxLjY3RS0xMDAzICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitxdWF4NTYwIHF1YW50aXplICAgMS42NjY2NjZFLTEwMDQgMWUtMTAwNSAtPiAxLjdFLTEwMDQgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NjEgcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwNSAxZS0xMDA1IC0+IDJFLTEwMDUgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NjIgcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwNiAxZS0xMDA1IC0+IDBFLTEwMDUgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg1NjMgcXVhbnRpemUgICAxLjY2NjY2NkUtMTAwNyAxZS0xMDA1IC0+IDBFLTEwMDUgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gU3BlY2lhbHMKK3F1YXg1ODAgcXVhbnRpemUgIEluZiAgICAtSW5mICAgLT4gIEluZmluaXR5CitxdWF4NTgxIHF1YW50aXplICBJbmYgIDFlLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTgyIHF1YW50aXplICBJbmYgIDFlLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTgzIHF1YW50aXplICBJbmYgICAxZTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTg0IHF1YW50aXplICBJbmYgICAxZTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTg1IHF1YW50aXplICBJbmYgICAxZTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTg2IHF1YW50aXplICBJbmYgICAgIEluZiAgIC0+ICBJbmZpbml0eQorcXVheDU4NyBxdWFudGl6ZSAtMTAwMCAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDU4OCBxdWFudGl6ZSAtSW5mICAgICBJbmYgICAtPiAgLUluZmluaXR5CitxdWF4NTg5IHF1YW50aXplIC0xICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTkwIHF1YW50aXplICAwICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTkxIHF1YW50aXplICAxICAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTkyIHF1YW50aXplICAxMDAwICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NTkzIHF1YW50aXplICBJbmYgICAgIEluZiAgIC0+ICBJbmZpbml0eQorcXVheDU5NCBxdWFudGl6ZSAgSW5mICAxZS0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDU5NSBxdWFudGl6ZSAtMCAgICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitxdWF4NjAwIHF1YW50aXplIC1JbmYgICAgLUluZiAgIC0+ICAtSW5maW5pdHkKK3F1YXg2MDEgcXVhbnRpemUgLUluZiAgMWUtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MDIgcXVhbnRpemUgLUluZiAgMWUtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MDMgcXVhbnRpemUgLUluZiAgIDFlMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MDQgcXVhbnRpemUgLUluZiAgIDFlMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MDUgcXVhbnRpemUgLUluZiAgIDFlMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2MDYgcXVhbnRpemUgLUluZiAgICAgSW5mICAgLT4gIC1JbmZpbml0eQorcXVheDYwNyBxdWFudGl6ZSAtMTAwMCAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDYwOCBxdWFudGl6ZSAtSW5mICAgIC1JbmYgICAtPiAgLUluZmluaXR5CitxdWF4NjA5IHF1YW50aXplIC0xICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjEwIHF1YW50aXplICAwICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjExIHF1YW50aXplICAxICAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjEyIHF1YW50aXplICAxMDAwICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjEzIHF1YW50aXplICBJbmYgICAgLUluZiAgIC0+ICBJbmZpbml0eQorcXVheDYxNCBxdWFudGl6ZSAtSW5mICAxZS0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcXVheDYxNSBxdWFudGl6ZSAtMCAgICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCitxdWF4NjIxIHF1YW50aXplICBOYU4gICAtSW5mICAgIC0+ICBOYU4KK3F1YXg2MjIgcXVhbnRpemUgIE5hTiAxZS0xMDAwICAgLT4gIE5hTgorcXVheDYyMyBxdWFudGl6ZSAgTmFOIDFlLTEgICAgICAtPiAgTmFOCitxdWF4NjI0IHF1YW50aXplICBOYU4gIDFlMCAgICAgIC0+ICBOYU4KK3F1YXg2MjUgcXVhbnRpemUgIE5hTiAgMWUxICAgICAgLT4gIE5hTgorcXVheDYyNiBxdWFudGl6ZSAgTmFOICAxZTEwMDAgICAtPiAgTmFOCitxdWF4NjI3IHF1YW50aXplICBOYU4gICAgSW5mICAgIC0+ICBOYU4KK3F1YXg2MjggcXVhbnRpemUgIE5hTiAgICBOYU4gICAgLT4gIE5hTgorcXVheDYyOSBxdWFudGl6ZSAtSW5mICAgIE5hTiAgICAtPiAgTmFOCitxdWF4NjMwIHF1YW50aXplIC0xMDAwICAgTmFOICAgIC0+ICBOYU4KK3F1YXg2MzEgcXVhbnRpemUgLTEgICAgICBOYU4gICAgLT4gIE5hTgorcXVheDYzMiBxdWFudGl6ZSAgMCAgICAgIE5hTiAgICAtPiAgTmFOCitxdWF4NjMzIHF1YW50aXplICAxICAgICAgTmFOICAgIC0+ICBOYU4KK3F1YXg2MzQgcXVhbnRpemUgIDEwMDAgICBOYU4gICAgLT4gIE5hTgorcXVheDYzNSBxdWFudGl6ZSAgSW5mICAgIE5hTiAgICAtPiAgTmFOCitxdWF4NjM2IHF1YW50aXplICBOYU4gMWUtMCAgICAgIC0+ICBOYU4KK3F1YXg2MzcgcXVhbnRpemUgLTAgICAgICBOYU4gICAgLT4gIE5hTgorCitxdWF4NjQxIHF1YW50aXplICBzTmFOICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQyIHF1YW50aXplICBzTmFOIDFlLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQzIHF1YW50aXplICBzTmFOIDFlLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQ0IHF1YW50aXplICBzTmFOICAxZTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQ1IHF1YW50aXplICBzTmFOICAxZTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQ2IHF1YW50aXplICBzTmFOICAxZTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQ3IHF1YW50aXplICBzTmFOICAgIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQ4IHF1YW50aXplICBzTmFOICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjQ5IHF1YW50aXplICBOYU4gICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjUwIHF1YW50aXplIC1JbmYgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjUxIHF1YW50aXplIC0xMDAwICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjUyIHF1YW50aXplIC0xICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjUzIHF1YW50aXplICAwICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjU0IHF1YW50aXplICAxICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjU1IHF1YW50aXplICAxMDAwICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjU2IHF1YW50aXplICBJbmYgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjU3IHF1YW50aXplICBOYU4gICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjU4IHF1YW50aXplICBzTmFOIDFlLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjU5IHF1YW50aXplIC0wICAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK3F1YXg2NjEgcXVhbnRpemUgIE5hTjkgLUluZiAgIC0+ICBOYU45CitxdWF4NjYyIHF1YW50aXplICBOYU44ICA5MTkgICAtPiAgTmFOOAorcXVheDY2MyBxdWFudGl6ZSAgTmFONzEgSW5mICAgLT4gIE5hTjcxCitxdWF4NjY0IHF1YW50aXplICBOYU42ICBOYU41ICAtPiAgTmFONgorcXVheDY2NSBxdWFudGl6ZSAtSW5mICAgTmFONCAgLT4gIE5hTjQKK3F1YXg2NjYgcXVhbnRpemUgLTkxOSAgIE5hTjMxIC0+ICBOYU4zMQorcXVheDY2NyBxdWFudGl6ZSAgSW5mICAgTmFOMiAgLT4gIE5hTjIKKworcXVheDY3MSBxdWFudGl6ZSAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjcyIHF1YW50aXplICBzTmFOOTggLTExICAgICAtPiAgTmFOOTggSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NzMgcXVhbnRpemUgIHNOYU45NyAgTmFOICAgIC0+ICBOYU45NyBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY3NCBxdWFudGl6ZSAgc05hTjE2IHNOYU45NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njc1IHF1YW50aXplICBOYU45NSAgc05hTjkzICAtPiAgTmFOOTMgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NzYgcXVhbnRpemUgLUluZiAgICBzTmFOOTIgIC0+ICBOYU45MiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY3NyBxdWFudGl6ZSAgMDg4ICAgIHNOYU45MSAgLT4gIE5hTjkxIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njc4IHF1YW50aXplICBJbmYgICAgc05hTjkwICAtPiAgTmFOOTAgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2NzkgcXVhbnRpemUgIE5hTiAgICBzTmFOODggIC0+ICBOYU44OCBJbnZhbGlkX29wZXJhdGlvbgorCitxdWF4NjgxIHF1YW50aXplIC1OYU45IC1JbmYgICAtPiAtTmFOOQorcXVheDY4MiBxdWFudGl6ZSAtTmFOOCAgOTE5ICAgLT4gLU5hTjgKK3F1YXg2ODMgcXVhbnRpemUgLU5hTjcxIEluZiAgIC0+IC1OYU43MQorcXVheDY4NCBxdWFudGl6ZSAtTmFONiAtTmFONSAgLT4gLU5hTjYKK3F1YXg2ODUgcXVhbnRpemUgLUluZiAgLU5hTjQgIC0+IC1OYU40CitxdWF4Njg2IHF1YW50aXplIC05MTkgIC1OYU4zMSAtPiAtTmFOMzEKK3F1YXg2ODcgcXVhbnRpemUgIEluZiAgLU5hTjIgIC0+IC1OYU4yCisKK3F1YXg2OTEgcXVhbnRpemUgLXNOYU45OSAtSW5mICAgIC0+IC1OYU45OSBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY5MiBxdWFudGl6ZSAtc05hTjk4IC0xMSAgICAgLT4gLU5hTjk4IEludmFsaWRfb3BlcmF0aW9uCitxdWF4NjkzIHF1YW50aXplIC1zTmFOOTcgIE5hTiAgICAtPiAtTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2OTQgcXVhbnRpemUgLXNOYU4xNiBzTmFOOTQgIC0+IC1OYU4xNiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY5NSBxdWFudGl6ZSAtTmFOOTUgLXNOYU45MyAgLT4gLU5hTjkzIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njk2IHF1YW50aXplIC1JbmYgICAtc05hTjkyICAtPiAtTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK3F1YXg2OTcgcXVhbnRpemUgIDA4OCAgIC1zTmFOOTEgIC0+IC1OYU45MSBJbnZhbGlkX29wZXJhdGlvbgorcXVheDY5OCBxdWFudGl6ZSAgSW5mICAgLXNOYU45MCAgLT4gLU5hTjkwIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Njk5IHF1YW50aXplICBOYU4gICAtc05hTjg4ICAtPiAtTmFOODggSW52YWxpZF9vcGVyYXRpb24KKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDQKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitxdWF4NzEwIHF1YW50aXplICAxLjAwRS05OTkgICAgMWUtOTk5ICAtPiAgIDFFLTk5OSAgICBSb3VuZGVkCitxdWF4NzExIHF1YW50aXplICAwLjFFLTk5OSAgICAyZS0xMDAwICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK3F1YXg3MTIgcXVhbnRpemUgIDAuMTBFLTk5OSAgIDNlLTEwMDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbCBSb3VuZGVkCitxdWF4NzEzIHF1YW50aXplICAwLjEwMEUtOTk5ICA0ZS0xMDAwICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwgUm91bmRlZAorcXVheDcxNCBxdWFudGl6ZSAgMC4wMUUtOTk5ICAgNWUtMTAwMSAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcXVheDcxNSBxdWFudGl6ZSAgMC45OTlFLTk5OSAgIDFlLTk5OSAgLT4gICAxRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzE2IHF1YW50aXplICAwLjA5OUUtOTk5IDEwZS0xMDAwICAtPiAgIDFFLTEwMDAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCisKK3F1YXg3MTcgcXVhbnRpemUgIDAuMDA5RS05OTkgIDFlLTEwMDEgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKK3F1YXg3MTggcXVhbnRpemUgIDAuMDAxRS05OTkgIDFlLTEwMDEgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZAorcXVheDcxOSBxdWFudGl6ZSAgMC4wMDA5RS05OTkgMWUtMTAwMSAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzIwIHF1YW50aXplICAwLjAwMDFFLTk5OSAxZS0xMDAxICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQKKworcXVheDczMCBxdWFudGl6ZSAtMS4wMEUtOTk5ICAgMWUtOTk5ICAtPiAgLTFFLTk5OSAgICAgUm91bmRlZAorcXVheDczMSBxdWFudGl6ZSAtMC4xRS05OTkgICAgMWUtOTk5ICAtPiAgLTBFLTk5OSAgICAgUm91bmRlZCBJbmV4YWN0CitxdWF4NzMyIHF1YW50aXplIC0wLjEwRS05OTkgICAxZS05OTkgIC0+ICAtMEUtOTk5ICAgICBSb3VuZGVkIEluZXhhY3QKK3F1YXg3MzMgcXVhbnRpemUgLTAuMTAwRS05OTkgIDFlLTk5OSAgLT4gIC0wRS05OTkgICAgIFJvdW5kZWQgSW5leGFjdAorcXVheDczNCBxdWFudGl6ZSAtMC4wMUUtOTk5ICAgMWUtOTk5ICAtPiAgLTBFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcXVheDczNSBxdWFudGl6ZSAtMC45OTlFLTk5OSA5MGUtOTk5ICAtPiAgLTFFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzM2IHF1YW50aXplIC0wLjA5OUUtOTk5IC0xZS05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3MzcgcXVhbnRpemUgLTAuMDA5RS05OTkgLTFlLTk5OSAgLT4gIC0wRS05OTkgICAgIEluZXhhY3QgUm91bmRlZAorcXVheDczOCBxdWFudGl6ZSAtMC4wMDFFLTk5OSAtMGUtOTk5ICAtPiAgLTBFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzM5IHF1YW50aXplIC0wLjAwMDFFLTk5OSAwZS05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKKworcXVheDc0MCBxdWFudGl6ZSAtMS4wMEUtOTk5ICAgMWUtMTAwMCAtPiAgLTEuMEUtOTk5ICAgUm91bmRlZAorcXVheDc0MSBxdWFudGl6ZSAtMC4xRS05OTkgICAgMWUtMTAwMCAtPiAgLTFFLTEwMDAgICAgU3Vibm9ybWFsCitxdWF4NzQyIHF1YW50aXplIC0wLjEwRS05OTkgICAxZS0xMDAwIC0+ICAtMUUtMTAwMCAgICBTdWJub3JtYWwgUm91bmRlZAorcXVheDc0MyBxdWFudGl6ZSAtMC4xMDBFLTk5OSAgMWUtMTAwMCAtPiAgLTFFLTEwMDAgICAgU3Vibm9ybWFsIFJvdW5kZWQKK3F1YXg3NDQgcXVhbnRpemUgLTAuMDFFLTk5OSAgIDFlLTEwMDAgLT4gIC0wRS0xMDAwICAgIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK3F1YXg3NDUgcXVhbnRpemUgLTAuOTk5RS05OTkgIDFlLTEwMDAgLT4gIC0xLjBFLTk5OSAgIEluZXhhY3QgUm91bmRlZAorcXVheDc0NiBxdWFudGl6ZSAtMC4wOTlFLTk5OSAgMWUtMTAwMCAtPiAgLTFFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcXVheDc0NyBxdWFudGl6ZSAtMC4wMDlFLTk5OSAgMWUtMTAwMCAtPiAgLTBFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzQ4IHF1YW50aXplIC0wLjAwMUUtOTk5ICAxZS0xMDAwIC0+ICAtMEUtMTAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3F1YXg3NDkgcXVhbnRpemUgLTAuMDAwMUUtOTk5IDFlLTEwMDAgLT4gIC0wRS0xMDAwICAgIEluZXhhY3QgUm91bmRlZAorCitxdWF4NzUwIHF1YW50aXplIC0xLjAwRS05OTkgICAxZS0xMDAxIC0+ICAtMS4wMEUtOTk5CitxdWF4NzUxIHF1YW50aXplIC0wLjFFLTk5OSAgICAxZS0xMDAxIC0+ICAtMS4wRS0xMDAwICBTdWJub3JtYWwKK3F1YXg3NTIgcXVhbnRpemUgLTAuMTBFLTk5OSAgIDFlLTEwMDEgLT4gIC0xLjBFLTEwMDAgIFN1Ym5vcm1hbAorcXVheDc1MyBxdWFudGl6ZSAtMC4xMDBFLTk5OSAgMWUtMTAwMSAtPiAgLTEuMEUtMTAwMCAgU3Vibm9ybWFsIFJvdW5kZWQKK3F1YXg3NTQgcXVhbnRpemUgLTAuMDFFLTk5OSAgIDFlLTEwMDEgLT4gIC0xRS0xMDAxICAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK3F1YXg3NTUgcXVhbnRpemUgLTAuOTk5RS05OTkgIDFlLTEwMDEgLT4gIC0xLjAwRS05OTkgIEluZXhhY3QgUm91bmRlZAorcXVheDc1NiBxdWFudGl6ZSAtMC4wOTlFLTk5OSAgMWUtMTAwMSAtPiAgLTEuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcXVheDc1NyBxdWFudGl6ZSAtMC4wMDlFLTk5OSAgMWUtMTAwMSAtPiAgLTFFLTEwMDEgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcXVheDc1OCBxdWFudGl6ZSAtMC4wMDFFLTk5OSAgMWUtMTAwMSAtPiAgLTBFLTEwMDEgICAgSW5leGFjdCBSb3VuZGVkCitxdWF4NzU5IHF1YW50aXplIC0wLjAwMDFFLTk5OSAxZS0xMDAxIC0+ICAtMEUtMTAwMSAgICBJbmV4YWN0IFJvdW5kZWQKKworcXVheDc2MCBxdWFudGl6ZSAtMS4wMEUtOTk5ICAgMWUtMTAwMiAtPiAgLTEuMDAwRS05OTkKK3F1YXg3NjEgcXVhbnRpemUgLTAuMUUtOTk5ICAgIDFlLTEwMDIgLT4gIC0xLjAwRS0xMDAwICBTdWJub3JtYWwKK3F1YXg3NjIgcXVhbnRpemUgLTAuMTBFLTk5OSAgIDFlLTEwMDIgLT4gIC0xLjAwRS0xMDAwICBTdWJub3JtYWwKK3F1YXg3NjMgcXVhbnRpemUgLTAuMTAwRS05OTkgIDFlLTEwMDIgLT4gIC0xLjAwRS0xMDAwICBTdWJub3JtYWwKK3F1YXg3NjQgcXVhbnRpemUgLTAuMDFFLTk5OSAgIDFlLTEwMDIgLT4gIC0xLjBFLTEwMDEgICBTdWJub3JtYWwKK3F1YXg3NjUgcXVhbnRpemUgLTAuOTk5RS05OTkgIDFlLTEwMDIgLT4gIC05Ljk5RS0xMDAwICBTdWJub3JtYWwKK3F1YXg3NjYgcXVhbnRpemUgLTAuMDk5RS05OTkgIDFlLTEwMDIgLT4gIC05LjlFLTEwMDEgICBTdWJub3JtYWwKK3F1YXg3NjcgcXVhbnRpemUgLTAuMDA5RS05OTkgIDFlLTEwMDIgLT4gIC05RS0xMDAyICAgICBTdWJub3JtYWwKK3F1YXg3NjggcXVhbnRpemUgLTAuMDAxRS05OTkgIDFlLTEwMDIgLT4gIC0xRS0xMDAyICAgICBTdWJub3JtYWwKK3F1YXg3NjkgcXVhbnRpemUgLTAuMDAwMUUtOTk5IDFlLTEwMDIgLT4gIC0wRS0xMDAyICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gcmhzIG11c3QgYmUgbm8gbGVzcyB0aGFuIEV0aW55CitxdWF4NzcwIHF1YW50aXplIC0xLjAwRS05OTkgICAxZS0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg3NzEgcXVhbnRpemUgLTAuMUUtOTk5ICAgIDFlLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDc3MiBxdWFudGl6ZSAtMC4xMEUtOTk5ICAgMWUtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4NzczIHF1YW50aXplIC0wLjEwMEUtOTk5ICAxZS0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg3NzQgcXVhbnRpemUgLTAuMDFFLTk5OSAgIDFlLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDc3NSBxdWFudGl6ZSAtMC45OTlFLTk5OSAgMWUtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Nzc2IHF1YW50aXplIC0wLjA5OUUtOTk5ICAxZS0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg3NzcgcXVhbnRpemUgLTAuMDA5RS05OTkgIDFlLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDc3OCBxdWFudGl6ZSAtMC4wMDFFLTk5OSAgMWUtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4Nzc5IHF1YW50aXplIC0wLjAwMDFFLTk5OSAxZS0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg3ODAgcXVhbnRpemUgLTAuMDAwMUUtOTk5IDFlLTEwMDQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitwcmVjaXNpb246ICAgOQorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKKworLS0gc29tZSBleHRyZW1lcyBkZXJpdmVkIGZyb20gUmVzY2FsZSB0ZXN0Y2FzZXMKK3F1YXg4MDEgcXVhbnRpemUgICAwICAgMWUxMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgwMiBxdWFudGl6ZSAgIDAgIDFlLTEwMDAwMDAwMDAgLT4gMEUtMTAwMDAwMDAwMAorcXVheDgwMyBxdWFudGl6ZSAgIDAgICAxZTIwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODA0IHF1YW50aXplICAgMCAgMWUtMjAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MDUgcXVhbnRpemUgICAwICAgMWUzMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgwNiBxdWFudGl6ZSAgIDAgIDFlLTMwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODA3IHF1YW50aXplICAgMCAgIDFlNDAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MDggcXVhbnRpemUgICAwICAxZS00MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgwOSBxdWFudGl6ZSAgIDAgICAxZTUwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODEwIHF1YW50aXplICAgMCAgMWUtNTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MTEgcXVhbnRpemUgICAwICAgMWU2MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgxMiBxdWFudGl6ZSAgIDAgIDFlLTYwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODEzIHF1YW50aXplICAgMCAgIDFlNzAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MTQgcXVhbnRpemUgICAwICAxZS03MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgxNSBxdWFudGl6ZSAgIDAgICAxZTgwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODE2IHF1YW50aXplICAgMCAgMWUtODAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MTcgcXVhbnRpemUgICAwICAgMWU5MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgxOCBxdWFudGl6ZSAgIDAgIDFlLTkwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODE5IHF1YW50aXplICAgMCAgIDFlOTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4MjAgcXVhbnRpemUgICAwICAxZS05OTk5OTk5OTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgyMSBxdWFudGl6ZSAgIDAgICAxZTEwMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDgyMiBxdWFudGl6ZSAgIDAgIDFlLTEwMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitxdWF4ODQzIHF1YW50aXplICAgMCAgICAxZTk5OTk5OTk5OSAtPiAwRSs5OTk5OTk5OTkKK3F1YXg4NDQgcXVhbnRpemUgICAwICAgMWUxMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDg0NSBxdWFudGl6ZSAgIDAgICAxZS05OTk5OTk5OTkgLT4gMEUtOTk5OTk5OTk5CitxdWF4ODQ2IHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwMCAtPiAwRS0xMDAwMDAwMDAwCitxdWF4ODQ3IHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwMSAtPiAwRS0xMDAwMDAwMDAxCitxdWF4ODQ4IHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwMiAtPiAwRS0xMDAwMDAwMDAyCitxdWF4ODQ5IHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwMyAtPiAwRS0xMDAwMDAwMDAzCitxdWF4ODUwIHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwNCAtPiAwRS0xMDAwMDAwMDA0CitxdWF4ODUxIHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwNSAtPiAwRS0xMDAwMDAwMDA1CitxdWF4ODUyIHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwNiAtPiAwRS0xMDAwMDAwMDA2CitxdWF4ODUzIHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwNyAtPiAwRS0xMDAwMDAwMDA3CitxdWF4ODU0IHF1YW50aXplICAgMCAgMWUtMTAwMDAwMDAwOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcXVheDg2MSBxdWFudGl6ZSAgIDEgIDFlKzIxNDc0ODM2NDkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODYyIHF1YW50aXplICAgMSAgMWUrMjE0NzQ4MzY0OCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4NjMgcXVhbnRpemUgICAxICAxZSsyMTQ3NDgzNjQ3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDg2NCBxdWFudGl6ZSAgIDEgIDFlLTIxNDc0ODM2NDcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4ODY1IHF1YW50aXplICAgMSAgMWUtMjE0NzQ4MzY0OCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3F1YXg4NjYgcXVhbnRpemUgICAxICAxZS0yMTQ3NDgzNjQ5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBNb3JlIGZyb20gRnVuZyBMZWUKK3ByZWNpc2lvbjogICAxNgorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCitxdWF4MTAyMSBxdWFudGl6ZSAgICA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0ICAgICAxLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICAtPiA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0CitxdWF4MTAyMiBxdWFudGl6ZSA2NCM4LjY2NjY2NjY2NjY2NjAwMEUrMzg0ICA2NCMxLjAwMDAwMDAwMDAwMDAwMEUrMzg0ICAtPiA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0CitxdWF4MTAyMyBxdWFudGl6ZSA2NCM4LjY2NjY2NjY2NjY2NjAwMEUrMzg0ICAxMjgjMS4wMDAwMDAwMDAwMDAwMDBFKzM4NCAtPiA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0CitxdWF4MTAyNCBxdWFudGl6ZSA2NCM4LjY2NjY2NjY2NjY2NjAwMEUrMzg0ICA2NCMxRSszODQgICAgICAgICAgICAgICAgICAtPiA4LjY2NjY2NjY2NjY2NjAwMEUrMzg0CitxdWF4MTAyNSBxdWFudGl6ZSA2NCM4LjY2NjY2NjY2NjY2NjAwMEUrMzg0ICA2NCMxRSszODQgICAtPiA2NCM4LjY2NjY2NjY2NjY2NjAwMEUrMzg0CitxdWF4MTAyNiBxdWFudGl6ZSA2NCM4LjY2NjY2NjY2NjY2NjAwMEUrMzg0IDEyOCMxRSszODQgICAtPiA2NCM5RSszODQgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3F1YXgxMDI3IHF1YW50aXplIDY0IzguNjY2NjY2NjY2NjY2MDAwRSszMjMgIDY0IzFFKzMxICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcXVheDEwMjggcXVhbnRpemUgNjQjOC42NjY2NjY2NjY2NjYwMDBFKzMyMyAxMjgjMUUrMzEgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4MTAyOSBxdWFudGl6ZSA2NCM4LjY2NjY2NjY2RSszICAgICAgICAgIDEyOCMxRSsxMCAgICAtPiA2NCMwRTEwIEluZXhhY3QgUm91bmRlZAorcXVheDEwMzAgcXVhbnRpemUgICAgOC42NjY2NjY2NkUrMyAgICAgICAgICAgICAgMUUrMyAgICAgLT4gOUUrMyBJbmV4YWN0IFJvdW5kZWQKKworLS0gSW50IGFuZCB1SW50MzIgZWRnZSB2YWx1ZXMgZm9yIHRlc3RpbmcgY29udmVyc2lvbnMKK3F1YXgxMDQwIHF1YW50aXplIC0yMTQ3NDgzNjQ2ICAgICAwIC0+IC0yMTQ3NDgzNjQ2CitxdWF4MTA0MSBxdWFudGl6ZSAtMjE0NzQ4MzY0NyAgICAgMCAtPiAtMjE0NzQ4MzY0NworcXVheDEwNDIgcXVhbnRpemUgLTIxNDc0ODM2NDggICAgIDAgLT4gLTIxNDc0ODM2NDgKK3F1YXgxMDQzIHF1YW50aXplIC0yMTQ3NDgzNjQ5ICAgICAwIC0+IC0yMTQ3NDgzNjQ5CitxdWF4MTA0NCBxdWFudGl6ZSAgMjE0NzQ4MzY0NiAgICAgMCAtPiAgMjE0NzQ4MzY0NgorcXVheDEwNDUgcXVhbnRpemUgIDIxNDc0ODM2NDcgICAgIDAgLT4gIDIxNDc0ODM2NDcKK3F1YXgxMDQ2IHF1YW50aXplICAyMTQ3NDgzNjQ4ICAgICAwIC0+ICAyMTQ3NDgzNjQ4CitxdWF4MTA0NyBxdWFudGl6ZSAgMjE0NzQ4MzY0OSAgICAgMCAtPiAgMjE0NzQ4MzY0OQorcXVheDEwNDggcXVhbnRpemUgIDQyOTQ5NjcyOTQgICAgIDAgLT4gIDQyOTQ5NjcyOTQKK3F1YXgxMDQ5IHF1YW50aXplICA0Mjk0OTY3Mjk1ICAgICAwIC0+ICA0Mjk0OTY3Mjk1CitxdWF4MTA1MCBxdWFudGl6ZSAgNDI5NDk2NzI5NiAgICAgMCAtPiAgNDI5NDk2NzI5NgorcXVheDEwNTEgcXVhbnRpemUgIDQyOTQ5NjcyOTcgICAgIDAgLT4gIDQyOTQ5NjcyOTcKKy0tIGFuZCBwb3dlcnMgb2YgdGVuIGZvciBzYW1lCitxdWF4MTEwMSBxdWFudGl6ZSAgNTAwMDAwMDAwMCAgICAgMCAtPiAgNTAwMDAwMDAwMAorcXVheDExMDIgcXVhbnRpemUgIDQwMDAwMDAwMDAgICAgIDAgLT4gIDQwMDAwMDAwMDAKK3F1YXgxMTAzIHF1YW50aXplICAyMDAwMDAwMDAwICAgICAwIC0+ICAyMDAwMDAwMDAwCitxdWF4MTEwNCBxdWFudGl6ZSAgMTAwMDAwMDAwMCAgICAgMCAtPiAgMTAwMDAwMDAwMAorcXVheDExMDUgcXVhbnRpemUgIDAxMDAwMDAwMDAgICAgIDAgLT4gIDEwMDAwMDAwMAorcXVheDExMDYgcXVhbnRpemUgIDAwMTAwMDAwMDAgICAgIDAgLT4gIDEwMDAwMDAwCitxdWF4MTEwNyBxdWFudGl6ZSAgMDAwMTAwMDAwMCAgICAgMCAtPiAgMTAwMDAwMAorcXVheDExMDggcXVhbnRpemUgIDAwMDAxMDAwMDAgICAgIDAgLT4gIDEwMDAwMAorcXVheDExMDkgcXVhbnRpemUgIDAwMDAwMTAwMDAgICAgIDAgLT4gIDEwMDAwCitxdWF4MTExMCBxdWFudGl6ZSAgMDAwMDAwMTAwMCAgICAgMCAtPiAgMTAwMAorcXVheDExMTEgcXVhbnRpemUgIDAwMDAwMDAxMDAgICAgIDAgLT4gIDEwMAorcXVheDExMTIgcXVhbnRpemUgIDAwMDAwMDAwMTAgICAgIDAgLT4gIDEwCitxdWF4MTExMyBxdWFudGl6ZSAgMDAwMDAwMDAwMSAgICAgMCAtPiAgMQorcXVheDExMTQgcXVhbnRpemUgIDAwMDAwMDAwMDAgICAgIDAgLT4gIDAKKy0tIGFuZCBwb3dlcnMgb2YgdGVuIGZvciBzYW1lCitxdWF4MTEyMSBxdWFudGl6ZSAtNTAwMDAwMDAwMCAgICAgMCAtPiAtNTAwMDAwMDAwMAorcXVheDExMjIgcXVhbnRpemUgLTQwMDAwMDAwMDAgICAgIDAgLT4gLTQwMDAwMDAwMDAKK3F1YXgxMTIzIHF1YW50aXplIC0yMDAwMDAwMDAwICAgICAwIC0+IC0yMDAwMDAwMDAwCitxdWF4MTEyNCBxdWFudGl6ZSAtMTAwMDAwMDAwMCAgICAgMCAtPiAtMTAwMDAwMDAwMAorcXVheDExMjUgcXVhbnRpemUgLTAxMDAwMDAwMDAgICAgIDAgLT4gLTEwMDAwMDAwMAorcXVheDExMjYgcXVhbnRpemUgLTAwMTAwMDAwMDAgICAgIDAgLT4gLTEwMDAwMDAwCitxdWF4MTEyNyBxdWFudGl6ZSAtMDAwMTAwMDAwMCAgICAgMCAtPiAtMTAwMDAwMAorcXVheDExMjggcXVhbnRpemUgLTAwMDAxMDAwMDAgICAgIDAgLT4gLTEwMDAwMAorcXVheDExMjkgcXVhbnRpemUgLTAwMDAwMTAwMDAgICAgIDAgLT4gLTEwMDAwCitxdWF4MTEzMCBxdWFudGl6ZSAtMDAwMDAwMTAwMCAgICAgMCAtPiAtMTAwMAorcXVheDExMzEgcXVhbnRpemUgLTAwMDAwMDAxMDAgICAgIDAgLT4gLTEwMAorcXVheDExMzIgcXVhbnRpemUgLTAwMDAwMDAwMTAgICAgIDAgLT4gLTEwCitxdWF4MTEzMyBxdWFudGl6ZSAtMDAwMDAwMDAwMSAgICAgMCAtPiAtMQorcXVheDExMzQgcXVhbnRpemUgLTAwMDAwMDAwMDAgICAgIDAgLT4gLTAKKworLS0gU29tZSBtaXNjZWxsYW55CitwcmVjaXNpb246ICAgMzQKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogNjE0NAorbWluRXhwb25lbnQ6IC02MTQzCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIDIgICAgICAgICAzCistLSAgICAgICAgICAgICAgICAgICAxIDIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNAorcXVheDBhMSBxdWFudGl6ZSAgICAgOC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTVFKzYxNDMgIDFFKzYxNDMgICAgICAtPiA5RSs2MTQzICAgSW5leGFjdCBSb3VuZGVkCitxdWF4MGEyIHF1YW50aXplIDEyOCM4LjU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NUUrNjE0MyAgMTI4IzFFKzYxNDMgIC0+IDguNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTZFKzYxNDMgICBSb3VuZGVkIEluZXhhY3QKK3F1YXgwYTMgcXVhbnRpemUgMTI4IzguNTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1RSs2MTQ0ICAxMjgjMUUrNjE0NCAgLT4gOC41NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1NTVFKzYxNDQKKworLS0gcGF5bG9hZCBkZWNhcGl0YXRlCitwcmVjaXNpb246IDUKK3F1YXg2MjEwMCBxdWFudGl6ZSAxMSAtc05hTjEyMzQ1Njc4OTAgLT4gLU5hTjY3ODkwICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOdWxsIHRlc3RzCitxdWF4OTk4IHF1YW50aXplIDEwICAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitxdWF4OTk5IHF1YW50aXplICAjIDFlMTAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JhbmRvbUJvdW5kMzIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmFuZG9tQm91bmQzMi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTliOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JhbmRvbUJvdW5kMzIuZGVjVGVzdApAQCAtMCwwICsxLDI0NDMgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcmFuZG9tQm91bmQzMi5kZWNUZXN0IC0tIGRlY2ltYWwgdGVzdGNhc2VzIC0tIGJvdW5kYXJpZXMgbmVhciAzMiAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBUaGVzZSB0ZXN0Y2FzZXMgdGVzdCBjYWxjdWxhdGlvbnMgYXQgcHJlY2lzaW9ucyAzMSwgMzIsIGFuZCAzMywgdG8KKy0tIGV4ZXJjaXNlIHRoZSBib3VuZGFyaWVzIGFyb3VuZCAyKio1CisKKy0tIHJhbmRvbWx5IGdlbmVyYXRlZCB0ZXN0Y2FzZXMgWzI2IFNlcCAyMDAxXQorZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICAzMQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTk5CittaW5leHBvbmVudDogLTk5OTkKKworYWRkeDMwMDEgYWRkIDQ5NTM3MzQ2NzU5MTMuMDY1MzE0NzM4NzQzMzIyNTc5IDAyMTguOTMyMDEwMzk2NTM0MzcxNzA0OTMwNzE0ODYwRSs3OTcgLT4gMi4xODkzMjAxMDM5NjUzNDM3MTcwNDkzMDcxNDg2MDBFKzc5OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDAxIGNvbXBhcmUgNDk1MzczNDY3NTkxMy4wNjUzMTQ3Mzg3NDMzMjI1NzkgMDIxOC45MzIwMTAzOTY1MzQzNzE3MDQ5MzA3MTQ4NjBFKzc5NyAtPiAtMQorZGl2eDMwMDEgZGl2aWRlIDQ5NTM3MzQ2NzU5MTMuMDY1MzE0NzM4NzQzMzIyNTc5IDAyMTguOTMyMDEwMzk2NTM0MzcxNzA0OTMwNzE0ODYwRSs3OTcgLT4gMi4yNjI2ODE3NjQ1MDc5NjUwMDUyODQwODA4MDA0MzhFLTc4NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDAxIGRpdmlkZWludCA0OTUzNzM0Njc1OTEzLjA2NTMxNDczODc0MzMyMjU3OSAwMjE4LjkzMjAxMDM5NjUzNDM3MTcwNDkzMDcxNDg2MEUrNzk3IC0+IDAKK211bHgzMDAxIG11bHRpcGx5IDQ5NTM3MzQ2NzU5MTMuMDY1MzE0NzM4NzQzMzIyNTc5IDAyMTguOTMyMDEwMzk2NTM0MzcxNzA0OTMwNzE0ODYwRSs3OTcgLT4gMS4wODQ1MzEwOTE1Njg2NzIwNDE5MjMxNTE2MzIwNjZFKzgxMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDAxIHBvd2VyIDQ5NTM3MzQ2NzU5MTMuMDY1MzE0NzM4NzQzMzIyNTc5IDIgLT4gMjQ1Mzk0ODcyMzkzNDM1MjIyNDYxNTU4OTAuOTk0OTUgSW5leGFjdCBSb3VuZGVkCityZW14MzAwMSByZW1haW5kZXIgNDk1MzczNDY3NTkxMy4wNjUzMTQ3Mzg3NDMzMjI1NzkgMDIxOC45MzIwMTAzOTY1MzQzNzE3MDQ5MzA3MTQ4NjBFKzc5NyAtPiA0OTUzNzM0Njc1OTEzLjA2NTMxNDczODc0MzMyMjU3OQorc3VieDMwMDEgc3VidHJhY3QgNDk1MzczNDY3NTkxMy4wNjUzMTQ3Mzg3NDMzMjI1NzkgMDIxOC45MzIwMTAzOTY1MzQzNzE3MDQ5MzA3MTQ4NjBFKzc5NyAtPiAtMi4xODkzMjAxMDM5NjUzNDM3MTcwNDkzMDcxNDg2MDBFKzc5OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDAyIGFkZCA5NjQxLjY4NDMyMzM4Njk1NTg4MTU5NTQ5MDM0NzkxMEUtODQ0IC03ODg2NDUzMjA0Ny4xMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTM0IC0+IC03Ljg4NjQ1MzIwNDcxMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTQ0IEluZXhhY3QgUm91bmRlZAorY29teDMwMDIgY29tcGFyZSA5NjQxLjY4NDMyMzM4Njk1NTg4MTU5NTQ5MDM0NzkxMEUtODQ0IC03ODg2NDUzMjA0Ny4xMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTM0IC0+IDEKK2RpdngzMDAyIGRpdmlkZSA5NjQxLjY4NDMyMzM4Njk1NTg4MTU5NTQ5MDM0NzkxMEUtODQ0IC03ODg2NDUzMjA0Ny4xMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTM0IC0+IC0xLjIyMjU2MjgwMTQ0MTA2OTY2Nzg0OTQwMjc4MjcxNkUtMTc4NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDAyIGRpdmlkZWludCA5NjQxLjY4NDMyMzM4Njk1NTg4MTU5NTQ5MDM0NzkxMEUtODQ0IC03ODg2NDUzMjA0Ny4xMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTM0IC0+IC0wCittdWx4MzAwMiBtdWx0aXBseSA5NjQxLjY4NDMyMzM4Njk1NTg4MTU5NTQ5MDM0NzkxMEUtODQ0IC03ODg2NDUzMjA0Ny4xMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTM0IC0+IC03LjYwMzg2OTIyMzA5OTkyODE0MTY1OTgzMTU4OTkwNUUrMTA0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMDIgcG93ZXIgOTY0MS42ODQzMjMzODY5NTU4ODE1OTU0OTAzNDc5MTBFLTg0NCAtOCAtPiAxLjMzODk4ODE1MjA2NzE4MDMzNzczODk1NTc1NzU4N0UrNjcyMCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDAyIHJlbWFpbmRlciA5NjQxLjY4NDMyMzM4Njk1NTg4MTU5NTQ5MDM0NzkxMEUtODQ0IC03ODg2NDUzMjA0Ny4xMjI4NzQ4NDQzMDk4MDYzNjc5OEUrOTM0IC0+IDkuNjQxNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDEKK3N1YngzMDAyIHN1YnRyYWN0IDk2NDEuNjg0MzIzMzg2OTU1ODgxNTk1NDkwMzQ3OTEwRS04NDQgLTc4ODY0NTMyMDQ3LjEyMjg3NDg0NDMwOTgwNjM2Nzk4RSs5MzQgLT4gNy44ODY0NTMyMDQ3MTIyODc0ODQ0MzA5ODA2MzY3OThFKzk0NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDAzIGFkZCAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA0OTIwMDAwODY0NTY5OS4zNTU3NzkzNzU4MjcxNDczOSAtPiAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDAzIGNvbXBhcmUgLTEuMDI4MDQ4NTcxNjI4MzI2ODcxMDU0OTY0MzA3Nzc0RSs1MjkgNDkyMDAwMDg2NDU2OTkuMzU1Nzc5Mzc1ODI3MTQ3MzkgLT4gLTEKK2RpdngzMDAzIGRpdmlkZSAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA0OTIwMDAwODY0NTY5OS4zNTU3NzkzNzU4MjcxNDczOSAtPiAtMi4wODk1MjkyNDk5NDY5NzE0ODI4NjE4NDM2OTI0NjVFKzUxNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDAzIGRpdmlkZWludCAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA0OTIwMDAwODY0NTY5OS4zNTU3NzkzNzU4MjcxNDczOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwMDMgbXVsdGlwbHkgLTEuMDI4MDQ4NTcxNjI4MzI2ODcxMDU0OTY0MzA3Nzc0RSs1MjkgNDkyMDAwMDg2NDU2OTkuMzU1Nzc5Mzc1ODI3MTQ3MzkgLT4gLTUuMDU3OTk5ODYxMjMxMjU1NTQ5MjgzNzM3ODYxMjA3RSs1NDIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwMyBwb3dlciAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA1IC0+IC0xLjE0ODMzMzg1ODI1MzcwNDI4NDIzMjc4MDgxOTczOUUrMjY0NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDAzIHJlbWFpbmRlciAtMS4wMjgwNDg1NzE2MjgzMjY4NzEwNTQ5NjQzMDc3NzRFKzUyOSA0OTIwMDAwODY0NTY5OS4zNTU3NzkzNzU4MjcxNDczOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwMDMgc3VidHJhY3QgLTEuMDI4MDQ4NTcxNjI4MzI2ODcxMDU0OTY0MzA3Nzc0RSs1MjkgNDkyMDAwMDg2NDU2OTkuMzU1Nzc5Mzc1ODI3MTQ3MzkgLT4gLTEuMDI4MDQ4NTcxNjI4MzI2ODcxMDU0OTY0MzA3Nzc0RSs1MjkgSW5leGFjdCBSb3VuZGVkCithZGR4MzAwNCBhZGQgNDc5MDg0Ljg1NjE4MDg5MzA1MjU0MTc3MzUyMDU1MTkgMDg0MTU3NTcxMDU0LjI2OTE3ODQ2NjA5ODM5ODk5MzEgLT4gODQxNTgwNTAxMzkuMTI1MzU5MzU5MTUwOTQwNzY2NjIgSW5leGFjdCBSb3VuZGVkCitjb214MzAwNCBjb21wYXJlIDQ3OTA4NC44NTYxODA4OTMwNTI1NDE3NzM1MjA1NTE5IDA4NDE1NzU3MTA1NC4yNjkxNzg0NjYwOTgzOTg5OTMxIC0+IC0xCitkaXZ4MzAwNCBkaXZpZGUgNDc5MDg0Ljg1NjE4MDg5MzA1MjU0MTc3MzUyMDU1MTkgMDg0MTU3NTcxMDU0LjI2OTE3ODQ2NjA5ODM5ODk5MzEgLT4gMC4wMDAwMDU2OTI3MTI0OTM3MDk2MTc5MDU0OTM3MTAyMDc5NjkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAwNCBkaXZpZGVpbnQgNDc5MDg0Ljg1NjE4MDg5MzA1MjU0MTc3MzUyMDU1MTkgMDg0MTU3NTcxMDU0LjI2OTE3ODQ2NjA5ODM5ODk5MzEgLT4gMAorbXVseDMwMDQgbXVsdGlwbHkgNDc5MDg0Ljg1NjE4MDg5MzA1MjU0MTc3MzUyMDU1MTkgMDg0MTU3NTcxMDU0LjI2OTE3ODQ2NjA5ODM5ODk5MzEgLT4gNDAzMTg2MTc4MjUwNjc4MzcuNDczMTc3MDA1MjM2ODcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwNCBwb3dlciA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOSA4IC0+IDIuNzc1MjMzNTk4MDIxMjM1OTczNTQ1OTMzMDQ1ODM3RSs0NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDA0IHJlbWFpbmRlciA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOSAwODQxNTc1NzEwNTQuMjY5MTc4NDY2MDk4Mzk4OTkzMSAtPiA0NzkwODQuODU2MTgwODkzMDUyNTQxNzczNTIwNTUxOQorc3VieDMwMDQgc3VidHJhY3QgNDc5MDg0Ljg1NjE4MDg5MzA1MjU0MTc3MzUyMDU1MTkgMDg0MTU3NTcxMDU0LjI2OTE3ODQ2NjA5ODM5ODk5MzEgLT4gLTg0MTU3MDkxOTY5LjQxMjk5NzU3MzA0NTg1NzIxOTU4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMDUgYWRkIC0wMzYzNzUwNzg4LjU3Mzc4MjIwNTY2NDM0OTU2MjkzMSAtMzE3Mi4wODA5MzQ0NjQxMzM2OTE5MDk5MDU5ODAwOTYgLT4gLTM2Mzc1Mzk2MC42NTQ3MTY2Njk3OTgwNDE0NzI4MzcwIEluZXhhY3QgUm91bmRlZAorY29teDMwMDUgY29tcGFyZSAtMDM2Mzc1MDc4OC41NzM3ODIyMDU2NjQzNDk1NjI5MzEgLTMxNzIuMDgwOTM0NDY0MTMzNjkxOTA5OTA1OTgwMDk2IC0+IC0xCitkaXZ4MzAwNSBkaXZpZGUgLTAzNjM3NTA3ODguNTczNzgyMjA1NjY0MzQ5NTYyOTMxIC0zMTcyLjA4MDkzNDQ2NDEzMzY5MTkwOTkwNTk4MDA5NiAtPiAxMTQ2NzIuNjA2NDMzNzQyMDE2NzA5NjI5NTI5MDg5MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDA1IGRpdmlkZWludCAtMDM2Mzc1MDc4OC41NzM3ODIyMDU2NjQzNDk1NjI5MzEgLTMxNzIuMDgwOTM0NDY0MTMzNjkxOTA5OTA1OTgwMDk2IC0+IDExNDY3MgorbXVseDMwMDUgbXVsdGlwbHkgLTAzNjM3NTA3ODguNTczNzgyMjA1NjY0MzQ5NTYyOTMxIC0zMTcyLjA4MDkzNDQ2NDEzMzY5MTkwOTkwNTk4MDA5NiAtPiAxMTUzODQ2OTQxMzMxLjE4ODU4MzI5MjIzOTIzMDgxOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA1IHBvd2VyIC0wMzYzNzUwNzg4LjU3Mzc4MjIwNTY2NDM0OTU2MjkzMSAtMzE3MiAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzAwNSByZW1haW5kZXIgLTAzNjM3NTA3ODguNTczNzgyMjA1NjY0MzQ5NTYyOTMxIC0zMTcyLjA4MDkzNDQ2NDEzMzY5MTkwOTkwNTk4MDA5NiAtPiAtMTkyMy42NTY5MTEwNjY5NDU2NTY4MjQzODE0MzE0ODgKK3N1YngzMDA1IHN1YnRyYWN0IC0wMzYzNzUwNzg4LjU3Mzc4MjIwNTY2NDM0OTU2MjkzMSAtMzE3Mi4wODA5MzQ0NjQxMzM2OTE5MDk5MDU5ODAwOTYgLT4gLTM2Mzc0NzYxNi40OTI4NDc3NDE1MzA2NTc2NTMwMjUwIEluZXhhY3QgUm91bmRlZAorYWRkeDMwMDYgYWRkIDEzODEwMjY1NTE0MjM2Njk5MTkwMTAxOTE4Nzg0NDkgLTgyLjY2NjE0Nzc1NDQ1MzcxMjU0OTk5MzU3ODAwNzM5IC0+IDEzODEwMjY1NTE0MjM2Njk5MTkwMTAxOTE4NzgzNjYgSW5leGFjdCBSb3VuZGVkCitjb214MzAwNiBjb21wYXJlIDEzODEwMjY1NTE0MjM2Njk5MTkwMTAxOTE4Nzg0NDkgLTgyLjY2NjE0Nzc1NDQ1MzcxMjU0OTk5MzU3ODAwNzM5IC0+IDEKK2RpdngzMDA2IGRpdmlkZSAxMzgxMDI2NTUxNDIzNjY5OTE5MDEwMTkxODc4NDQ5IC04Mi42NjYxNDc3NTQ0NTM3MTI1NDk5OTM1NzgwMDczOSAtPiAtMTY3MDYwNzEyMTQ2MTM1NTIzNzczNzY2Mzk1NTcuOTAgSW5leGFjdCBSb3VuZGVkCitkdml4MzAwNiBkaXZpZGVpbnQgMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODQ0OSAtODIuNjY2MTQ3NzU0NDUzNzEyNTQ5OTkzNTc4MDA3MzkgLT4gLTE2NzA2MDcxMjE0NjEzNTUyMzc3Mzc2NjM5NTU3CittdWx4MzAwNiBtdWx0aXBseSAxMzgxMDI2NTUxNDIzNjY5OTE5MDEwMTkxODc4NDQ5IC04Mi42NjYxNDc3NTQ0NTM3MTI1NDk5OTM1NzgwMDczOSAtPiAtMS4xNDE2NDE0NDk1MjgxMjc2NTY1NjA3NzAwNTcyMjhFKzMyIEluZXhhY3QgUm91bmRlZAorcG93eDMwMDYgcG93ZXIgMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODQ0OSAtODMgLT4gMi4zMDc5Nzc5MDgxMDY1NjQyOTk5MjUxOTMwMTEwNTJFLTI1MDIgSW5leGFjdCBSb3VuZGVkCityZW14MzAwNiByZW1haW5kZXIgMTM4MTAyNjU1MTQyMzY2OTkxOTAxMDE5MTg3ODQ0OSAtODIuNjY2MTQ3NzU0NDUzNzEyNTQ5OTkzNTc4MDA3MzkgLT4gNzQuMjIxMTU5NTM1NTM2MDIwMzYwNDIxNjg3NjczNzcKK3N1YngzMDA2IHN1YnRyYWN0IDEzODEwMjY1NTE0MjM2Njk5MTkwMTAxOTE4Nzg0NDkgLTgyLjY2NjE0Nzc1NDQ1MzcxMjU0OTk5MzU3ODAwNzM5IC0+IDEzODEwMjY1NTE0MjM2Njk5MTkwMTAxOTE4Nzg1MzIgSW5leGFjdCBSb3VuZGVkCithZGR4MzAwNyBhZGQgNDYyNy4wMjY5NjA0MjMwNzIxMjc5NTM1NTY2MzU1ODUgLTQ0MTA1ODMxMzI5MDEuODMwMDE3NDc5NzQxMjMxMTMxIC0+IC00NDEwNTgzMTI4Mjc0LjgwMzA1NzA1NjY2OTEwMzE3NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDA3IGNvbXBhcmUgNDYyNy4wMjY5NjA0MjMwNzIxMjc5NTM1NTY2MzU1ODUgLTQ0MTA1ODMxMzI5MDEuODMwMDE3NDc5NzQxMjMxMTMxIC0+IDEKK2RpdngzMDA3IGRpdmlkZSA0NjI3LjAyNjk2MDQyMzA3MjEyNzk1MzU1NjYzNTU4NSAtNDQxMDU4MzEzMjkwMS44MzAwMTc0Nzk3NDEyMzExMzEgLT4gLTEuMDQ5MDczNzQzOTkyNDA0NTcwNTY5MDAzMTI5MzQ2RS05IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMDcgZGl2aWRlaW50IDQ2MjcuMDI2OTYwNDIzMDcyMTI3OTUzNTU2NjM1NTg1IC00NDEwNTgzMTMyOTAxLjgzMDAxNzQ3OTc0MTIzMTEzMSAtPiAtMAorbXVseDMwMDcgbXVsdGlwbHkgNDYyNy4wMjY5NjA0MjMwNzIxMjc5NTM1NTY2MzU1ODUgLTQ0MTA1ODMxMzI5MDEuODMwMDE3NDc5NzQxMjMxMTMxIC0+IC0yMDQwNzg4NzA2NzEyNDAyNS4zMTU3Njg4NzU2NTExMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA3IHBvd2VyIDQ2MjcuMDI2OTYwNDIzMDcyMTI3OTUzNTU2NjM1NTg1IC00IC0+IDIuMTgxNjg0MTY3MjIyMzM0OTM0MjIxNDA3NzgxNzAxRS0xNSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDA3IHJlbWFpbmRlciA0NjI3LjAyNjk2MDQyMzA3MjEyNzk1MzU1NjYzNTU4NSAtNDQxMDU4MzEzMjkwMS44MzAwMTc0Nzk3NDEyMzExMzEgLT4gNDYyNy4wMjY5NjA0MjMwNzIxMjc5NTM1NTY2MzU1ODUKK3N1YngzMDA3IHN1YnRyYWN0IDQ2MjcuMDI2OTYwNDIzMDcyMTI3OTUzNTU2NjM1NTg1IC00NDEwNTgzMTMyOTAxLjgzMDAxNzQ3OTc0MTIzMTEzMSAtPiA0NDEwNTgzMTM3NTI4Ljg1Njk3NzkwMjgxMzM1OTA4NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDA4IGFkZCA3NTM1MzU3NDQ5My44NDQ4NDE1MzQ4NDkxODIxMjA0MiAtODY4NDExMTY5NTA5NTg0OTkyMjI2MzA0NDE5MTIyMSAtPiAtODY4NDExMTY5NTA5NTg0OTkyMjE4NzY5MDYxNjcyNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDA4IGNvbXBhcmUgNzUzNTM1NzQ0OTMuODQ0ODQxNTM0ODQ5MTgyMTIwNDIgLTg2ODQxMTE2OTUwOTU4NDk5MjIyNjMwNDQxOTEyMjEgLT4gMQorZGl2eDMwMDggZGl2aWRlIDc1MzUzNTc0NDkzLjg0NDg0MTUzNDg0OTE4MjEyMDQyIC04Njg0MTExNjk1MDk1ODQ5OTIyMjYzMDQ0MTkxMjIxIC0+IC04LjY3NzE3NzAyNjIyMzUzNjQ3NTUzMTU5MjQzMjExOEUtMjEgSW5leGFjdCBSb3VuZGVkCitkdml4MzAwOCBkaXZpZGVpbnQgNzUzNTM1NzQ0OTMuODQ0ODQxNTM0ODQ5MTgyMTIwNDIgLTg2ODQxMTE2OTUwOTU4NDk5MjIyNjMwNDQxOTEyMjEgLT4gLTAKK211bHgzMDA4IG11bHRpcGx5IDc1MzUzNTc0NDkzLjg0NDg0MTUzNDg0OTE4MjEyMDQyIC04Njg0MTExNjk1MDk1ODQ5OTIyMjYzMDQ0MTkxMjIxIC0+IC02LjU0Mzc4ODU3NTI5Mjc0MzI4MTQ1NjgzMDcwMTEyN0UrNDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAwOCBwb3dlciA3NTM1MzU3NDQ5My44NDQ4NDE1MzQ4NDkxODIxMjA0MiAtOSAtPiAxLjI3NjYzMDY3MDI4NzkwNjkyNTU3MDY0NTQ5MDcwN0UtOTggSW5leGFjdCBSb3VuZGVkCityZW14MzAwOCByZW1haW5kZXIgNzUzNTM1NzQ0OTMuODQ0ODQxNTM0ODQ5MTgyMTIwNDIgLTg2ODQxMTE2OTUwOTU4NDk5MjIyNjMwNDQxOTEyMjEgLT4gNzUzNTM1NzQ0OTMuODQ0ODQxNTM0ODQ5MTgyMTIwNDIKK3N1YngzMDA4IHN1YnRyYWN0IDc1MzUzNTc0NDkzLjg0NDg0MTUzNDg0OTE4MjEyMDQyIC04Njg0MTExNjk1MDk1ODQ5OTIyMjYzMDQ0MTkxMjIxIC0+IDg2ODQxMTE2OTUwOTU4NDk5MjIzMzgzOTc3NjU3MTUgSW5leGFjdCBSb3VuZGVkCithZGR4MzAwOSBhZGQgNjkwNzA1OC4yMTY0MzUzNTU4NzQ3Mjk1OTIzNzMwMTEgMi44NTcwMDU0NDY5MTc2NzA1MTU2NjIzOTg3NDE1NDUgLT4gNjkwNzA2MS4wNzM0NDA4MDI3OTI0MDAxMDgwMzU0MTAgSW5leGFjdCBSb3VuZGVkCitjb214MzAwOSBjb21wYXJlIDY5MDcwNTguMjE2NDM1MzU1ODc0NzI5NTkyMzczMDExIDIuODU3MDA1NDQ2OTE3NjcwNTE1NjYyMzk4NzQxNTQ1IC0+IDEKK2RpdngzMDA5IGRpdmlkZSA2OTA3MDU4LjIxNjQzNTM1NTg3NDcyOTU5MjM3MzAxMSAyLjg1NzAwNTQ0NjkxNzY3MDUxNTY2MjM5ODc0MTU0NSAtPiAyNDE3NTg2LjY0NjE0NjI4Mzg1NjQzNjg2NDEyMTEwNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDA5IGRpdmlkZWludCA2OTA3MDU4LjIxNjQzNTM1NTg3NDcyOTU5MjM3MzAxMSAyLjg1NzAwNTQ0NjkxNzY3MDUxNTY2MjM5ODc0MTU0NSAtPiAyNDE3NTg2CittdWx4MzAwOSBtdWx0aXBseSA2OTA3MDU4LjIxNjQzNTM1NTg3NDcyOTU5MjM3MzAxMSAyLjg1NzAwNTQ0NjkxNzY3MDUxNTY2MjM5ODc0MTU0NSAtPiAxOTczMzUwMi45NDY1MzMyNjIxMTYyMzY5ODAzNDcxNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDA5IHBvd2VyIDY5MDcwNTguMjE2NDM1MzU1ODc0NzI5NTkyMzczMDExIDMgLT4gMzI5NTE4MTU2NjQ2MzY5NTA1NDk0Ljg5NzEzNTMyNDAgSW5leGFjdCBSb3VuZGVkCityZW14MzAwOSByZW1haW5kZXIgNjkwNzA1OC4yMTY0MzUzNTU4NzQ3Mjk1OTIzNzMwMTEgMi44NTcwMDU0NDY5MTc2NzA1MTU2NjIzOTg3NDE1NDUgLT4gMS44NDYwNDM0NTI0ODM0NTEzOTY0NDkwMzQxODk2MzAKK3N1YngzMDA5IHN1YnRyYWN0IDY5MDcwNTguMjE2NDM1MzU1ODc0NzI5NTkyMzczMDExIDIuODU3MDA1NDQ2OTE3NjcwNTE1NjYyMzk4NzQxNTQ1IC0+IDY5MDcwNTUuMzU5NDI5OTA4OTU3MDU5MDc2NzEwNjEyIEluZXhhY3QgUm91bmRlZAorYWRkeDMwMTAgYWRkIC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCA3MTIxNjgwMjEuMTI2NTM4NDQ2NjQ0MjU3NjYxOTA2NEUtOTkyIC0+IC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDEwIGNvbXBhcmUgLTM4OTQ5NTMwNDI3MjUzLjI0MDMwNjgwNDY4Njc3MTkwIDcxMjE2ODAyMS4xMjY1Mzg0NDY2NDQyNTc2NjE5MDY0RS05OTIgLT4gLTEKK2RpdngzMDEwIGRpdmlkZSAtMzg5NDk1MzA0MjcyNTMuMjQwMzA2ODA0Njg2NzcxOTAgNzEyMTY4MDIxLjEyNjUzODQ0NjY0NDI1NzY2MTkwNjRFLTk5MiAtPiAtNS40NjkxNDkwMzExMDA5OTk3MDA0ODkyMjExMjI1MDlFKzk5NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDEwIGRpdmlkZWludCAtMzg5NDk1MzA0MjcyNTMuMjQwMzA2ODA0Njg2NzcxOTAgNzEyMTY4MDIxLjEyNjUzODQ0NjY0NDI1NzY2MTkwNjRFLTk5MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwMTAgbXVsdGlwbHkgLTM4OTQ5NTMwNDI3MjUzLjI0MDMwNjgwNDY4Njc3MTkwIDcxMjE2ODAyMS4xMjY1Mzg0NDY2NDQyNTc2NjE5MDY0RS05OTIgLT4gLTIuNzczODYxMDAwODE4NDgzNzY5MjkyMjQwMTA5NDE3RS05NzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxMCBwb3dlciAtMzg5NDk1MzA0MjcyNTMuMjQwMzA2ODA0Njg2NzcxOTAgNyAtPiAtMS4zNTk5MjY5NTk4MjMwNzEzMzI1OTk4MTczNjM4NzdFKzk1IEluZXhhY3QgUm91bmRlZAorcmVteDMwMTAgcmVtYWluZGVyIC0zODk0OTUzMDQyNzI1My4yNDAzMDY4MDQ2ODY3NzE5MCA3MTIxNjgwMjEuMTI2NTM4NDQ2NjQ0MjU3NjYxOTA2NEUtOTkyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzAxMCBzdWJ0cmFjdCAtMzg5NDk1MzA0MjcyNTMuMjQwMzA2ODA0Njg2NzcxOTAgNzEyMTY4MDIxLjEyNjUzODQ0NjY0NDI1NzY2MTkwNjRFLTk5MiAtPiAtMzg5NDk1MzA0MjcyNTMuMjQwMzA2ODA0Njg2NzcxOTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzAxMSBhZGQgLTA3MDgwNjkuMDI1NjY3NDcxOTk2Mzc4MDgxNDgyNTQ5IC01NjI4NDIuNDcwMTUyMDc4NzgzMTAxODczMjIwMjgwNCAtPiAtMTI3MDkxMS40OTU4MTk1NTA3Nzk0Nzk5NTQ3MDI4MjkgSW5leGFjdCBSb3VuZGVkCitjb214MzAxMSBjb21wYXJlIC0wNzA4MDY5LjAyNTY2NzQ3MTk5NjM3ODA4MTQ4MjU0OSAtNTYyODQyLjQ3MDE1MjA3ODc4MzEwMTg3MzIyMDI4MDQgLT4gLTEKK2RpdngzMDExIGRpdmlkZSAtMDcwODA2OS4wMjU2Njc0NzE5OTYzNzgwODE0ODI1NDkgLTU2Mjg0Mi40NzAxNTIwNzg3ODMxMDE4NzMyMjAyODA0IC0+IDEuMjU4MDIzNDQ5MjE4NjY1NjA4MzQ5MTQ1Mzk0MDY5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMTEgZGl2aWRlaW50IC0wNzA4MDY5LjAyNTY2NzQ3MTk5NjM3ODA4MTQ4MjU0OSAtNTYyODQyLjQ3MDE1MjA3ODc4MzEwMTg3MzIyMDI4MDQgLT4gMQorbXVseDMwMTEgbXVsdGlwbHkgLTA3MDgwNjkuMDI1NjY3NDcxOTk2Mzc4MDgxNDgyNTQ5IC01NjI4NDIuNDcwMTUyMDc4NzgzMTAxODczMjIwMjgwNCAtPiAzOTg1MzEzMTk0NDQuODU1NjEyODcyOTA4NjExMjIwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDExIHBvd2VyIC0wNzA4MDY5LjAyNTY2NzQ3MTk5NjM3ODA4MTQ4MjU0OSAtNTYyODQyIC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDExIHJlbWFpbmRlciAtMDcwODA2OS4wMjU2Njc0NzE5OTYzNzgwODE0ODI1NDkgLTU2Mjg0Mi40NzAxNTIwNzg3ODMxMDE4NzMyMjAyODA0IC0+IC0xNDUyMjYuNTU1NTE1MzkzMjEzMjc2MjA4MjYyMjY4Ngorc3VieDMwMTEgc3VidHJhY3QgLTA3MDgwNjkuMDI1NjY3NDcxOTk2Mzc4MDgxNDgyNTQ5IC01NjI4NDIuNDcwMTUyMDc4NzgzMTAxODczMjIwMjgwNCAtPiAtMTQ1MjI2LjU1NTUxNTM5MzIxMzI3NjIwODI2MjI2ODYKK2FkZHgzMDEyIGFkZCA0MDU1MDg3LjI0Njk5NDY0NDcwOTcyOTk0MjY3Mzk3NiAtNDMxODMxNDY5MjE4OTcuNjczODM0NzYxMDQwODQ1NzVFKzIxMSAtPiAtNC4zMTgzMTQ2OTIxODk3NjczODM0NzYxMDQwODQ1NzVFKzIyNCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDEyIGNvbXBhcmUgNDA1NTA4Ny4yNDY5OTQ2NDQ3MDk3Mjk5NDI2NzM5NzYgLTQzMTgzMTQ2OTIxODk3LjY3MzgzNDc2MTA0MDg0NTc1RSsyMTEgLT4gMQorZGl2eDMwMTIgZGl2aWRlIDQwNTUwODcuMjQ2OTk0NjQ0NzA5NzI5OTQyNjczOTc2IC00MzE4MzE0NjkyMTg5Ny42NzM4MzQ3NjEwNDA4NDU3NUUrMjExIC0+IC05LjM5MDQzOTQwOTkxMzMwNzkwNjkyMzkwOTYzMDI0N0UtMjE5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMTIgZGl2aWRlaW50IDQwNTUwODcuMjQ2OTk0NjQ0NzA5NzI5OTQyNjczOTc2IC00MzE4MzE0NjkyMTg5Ny42NzM4MzQ3NjEwNDA4NDU3NUUrMjExIC0+IC0wCittdWx4MzAxMiBtdWx0aXBseSA0MDU1MDg3LjI0Njk5NDY0NDcwOTcyOTk0MjY3Mzk3NiAtNDMxODMxNDY5MjE4OTcuNjczODM0NzYxMDQwODQ1NzVFKzIxMSAtPiAtMS43NTExMTQyODM2ODA4MzMwMzkxOTc2Mzc4NzQ0NTNFKzIzMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDEyIHBvd2VyIDQwNTUwODcuMjQ2OTk0NjQ0NzA5NzI5OTQyNjczOTc2IC00IC0+IDMuNjk4Mjc0ODkzODQ5MjQxMTE2MTk1Nzk1NTE1MzAyRS0yNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDEyIHJlbWFpbmRlciA0MDU1MDg3LjI0Njk5NDY0NDcwOTcyOTk0MjY3Mzk3NiAtNDMxODMxNDY5MjE4OTcuNjczODM0NzYxMDQwODQ1NzVFKzIxMSAtPiA0MDU1MDg3LjI0Njk5NDY0NDcwOTcyOTk0MjY3Mzk3Ngorc3VieDMwMTIgc3VidHJhY3QgNDA1NTA4Ny4yNDY5OTQ2NDQ3MDk3Mjk5NDI2NzM5NzYgLTQzMTgzMTQ2OTIxODk3LjY3MzgzNDc2MTA0MDg0NTc1RSsyMTEgLT4gNC4zMTgzMTQ2OTIxODk3NjczODM0NzYxMDQwODQ1NzVFKzIyNCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDEzIGFkZCA0NTAyODk1ODkyNTIwLjM5NjU4MTM0ODExMDkwNjkwOUUtNTEyIC04MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCAtPiAtODE1LjkwNDczMDU5MjE4NjIzNDgyNjM1MjE4NzYwMzQgSW5leGFjdCBSb3VuZGVkCitjb214MzAxMyBjb21wYXJlIDQ1MDI4OTU4OTI1MjAuMzk2NTgxMzQ4MTEwOTA2OTA5RS01MTIgLTgxNS45MDQ3MzA1OTIxODYyMzQ4MjYzNTIxODc2MDM0IC0+IDEKK2RpdngzMDEzIGRpdmlkZSA0NTAyODk1ODkyNTIwLjM5NjU4MTM0ODExMDkwNjkwOUUtNTEyIC04MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCAtPiAtNS41MTg4OTkxMTEyMzgzNjc4NjIyMzQ3OTg0MzM1NTFFLTUwMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDEzIGRpdmlkZWludCA0NTAyODk1ODkyNTIwLjM5NjU4MTM0ODExMDkwNjkwOUUtNTEyIC04MTUuOTA0NzMwNTkyMTg2MjM0ODI2MzUyMTg3NjAzNCAtPiAtMAorbXVseDMwMTMgbXVsdGlwbHkgNDUwMjg5NTg5MjUyMC4zOTY1ODEzNDgxMTA5MDY5MDlFLTUxMiAtODE1LjkwNDczMDU5MjE4NjIzNDgyNjM1MjE4NzYwMzQgLT4gLTMuNjczOTM0MDYwMDcxNTE2MTU2NjA0NDUzNzU2NTQxRS00OTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxMyBwb3dlciA0NTAyODk1ODkyNTIwLjM5NjU4MTM0ODExMDkwNjkwOUUtNTEyIC04MTYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzAxMyByZW1haW5kZXIgNDUwMjg5NTg5MjUyMC4zOTY1ODEzNDgxMTA5MDY5MDlFLTUxMiAtODE1LjkwNDczMDU5MjE4NjIzNDgyNjM1MjE4NzYwMzQgLT4gNC41MDI4OTU4OTI1MjAzOTY1ODEzNDgxMTA5MDY5MDlFLTUwMAorc3VieDMwMTMgc3VidHJhY3QgNDUwMjg5NTg5MjUyMC4zOTY1ODEzNDgxMTA5MDY5MDlFLTUxMiAtODE1LjkwNDczMDU5MjE4NjIzNDgyNjM1MjE4NzYwMzQgLT4gODE1LjkwNDczMDU5MjE4NjIzNDgyNjM1MjE4NzYwMzQgSW5leGFjdCBSb3VuZGVkCithZGR4MzAxNCBhZGQgNDY3LjY3MjEyOTUwNzI2MjgxMDAyNjAyMzkxNzk4NjUgLTAyLjA3MTU1MDczMzk1NTczNTY5ODUyMzE2MDczMDI1IC0+IDQ2NS42MDA1Nzg3NzMzMDcwNzQzMjc1MDA3NTcyNTYzIEluZXhhY3QgUm91bmRlZAorY29teDMwMTQgY29tcGFyZSA0NjcuNjcyMTI5NTA3MjYyODEwMDI2MDIzOTE3OTg2NSAtMDIuMDcxNTUwNzMzOTU1NzM1Njk4NTIzMTYwNzMwMjUgLT4gMQorZGl2eDMwMTQgZGl2aWRlIDQ2Ny42NzIxMjk1MDcyNjI4MTAwMjYwMjM5MTc5ODY1IC0wMi4wNzE1NTA3MzM5NTU3MzU2OTg1MjMxNjA3MzAyNSAtPiAtMjI1Ljc1OTQzODAxMDEwMjc3MDU5OTc0OTYwNDU5OTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAxNCBkaXZpZGVpbnQgNDY3LjY3MjEyOTUwNzI2MjgxMDAyNjAyMzkxNzk4NjUgLTAyLjA3MTU1MDczMzk1NTczNTY5ODUyMzE2MDczMDI1IC0+IC0yMjUKK211bHgzMDE0IG11bHRpcGx5IDQ2Ny42NzIxMjk1MDcyNjI4MTAwMjYwMjM5MTc5ODY1IC0wMi4wNzE1NTA3MzM5NTU3MzU2OTg1MjMxNjA3MzAyNSAtPiAtOTY4LjgwNjU0MzEzMTQxMjE1MjMwNzQ4NzUwNjk4MDcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAxNCBwb3dlciA0NjcuNjcyMTI5NTA3MjYyODEwMDI2MDIzOTE3OTg2NSAtMiAtPiAwLjAwMDAwNDU3MjExMzY5NDE5MzIyMTgxMDYwOTgzNjA4MDkzMSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDE0IHJlbWFpbmRlciA0NjcuNjcyMTI5NTA3MjYyODEwMDI2MDIzOTE3OTg2NSAtMDIuMDcxNTUwNzMzOTU1NzM1Njk4NTIzMTYwNzMwMjUgLT4gMS41NzMyMTQzNjcyMjIyNzc4NTgzMTI3NTM2ODAyNQorc3VieDMwMTQgc3VidHJhY3QgNDY3LjY3MjEyOTUwNzI2MjgxMDAyNjAyMzkxNzk4NjUgLTAyLjA3MTU1MDczMzk1NTczNTY5ODUyMzE2MDczMDI1IC0+IDQ2OS43NDM2ODAyNDEyMTg1NDU3MjQ1NDcwNzg3MTY4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMTUgYWRkIDIuMTU2Nzk1MzEzMzExMTUwMTQzOTQ5OTk3NTUyNTAxRS01NzEgLTg2NzcxNDcuNTg2Mzg5NDAxNjgyNzEyMTgwMTQ2ODU1IC0+IC04Njc3MTQ3LjU4NjM4OTQwMTY4MjcxMjE4MDE0Njg1NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDE1IGNvbXBhcmUgMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MSAtODY3NzE0Ny41ODYzODk0MDE2ODI3MTIxODAxNDY4NTUgLT4gMQorZGl2eDMwMTUgZGl2aWRlIDIuMTU2Nzk1MzEzMzExMTUwMTQzOTQ5OTk3NTUyNTAxRS01NzEgLTg2NzcxNDcuNTg2Mzg5NDAxNjgyNzEyMTgwMTQ2ODU1IC0+IC0yLjQ4NTYwNDA0NDIzMDE2Mzc5OTYwNDI0MzUyOTAwNUUtNTc4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMTUgZGl2aWRlaW50IDIuMTU2Nzk1MzEzMzExMTUwMTQzOTQ5OTk3NTUyNTAxRS01NzEgLTg2NzcxNDcuNTg2Mzg5NDAxNjgyNzEyMTgwMTQ2ODU1IC0+IC0wCittdWx4MzAxNSBtdWx0aXBseSAyLjE1Njc5NTMxMzMxMTE1MDE0Mzk0OTk5NzU1MjUwMUUtNTcxIC04Njc3MTQ3LjU4NjM4OTQwMTY4MjcxMjE4MDE0Njg1NSAtPiAtMS44NzE0ODMxMjQ3MjMzODE5ODYyNzI4Mzc5NDI1NzdFLTU2NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE1IHBvd2VyIDIuMTU2Nzk1MzEzMzExMTUwMTQzOTQ5OTk3NTUyNTAxRS01NzEgLTg2NzcxNDggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzAxNSByZW1haW5kZXIgMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MSAtODY3NzE0Ny41ODYzODk0MDE2ODI3MTIxODAxNDY4NTUgLT4gMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MQorc3VieDMwMTUgc3VidHJhY3QgMi4xNTY3OTUzMTMzMTExNTAxNDM5NDk5OTc1NTI1MDFFLTU3MSAtODY3NzE0Ny41ODYzODk0MDE2ODI3MTIxODAxNDY4NTUgLT4gODY3NzE0Ny41ODYzODk0MDE2ODI3MTIxODAxNDY4NTUgSW5leGFjdCBSb3VuZGVkCithZGR4MzAxNiBhZGQgLTk3NDk1My4yODAxNjM3MjA4MzY4MDAyNTg1ODIyNDU3IC02OTMwOTU3OTMuMzY2NzU3ODA2NzgwMjY5ODE5MTI0NiAtPiAtNjk0MDcwNzQ2LjY0NjkyMTUyNzYxNzA3MDA3NzcwNjggSW5leGFjdCBSb3VuZGVkCitjb214MzAxNiBjb21wYXJlIC05NzQ5NTMuMjgwMTYzNzIwODM2ODAwMjU4NTgyMjQ1NyAtNjkzMDk1NzkzLjM2Njc1NzgwNjc4MDI2OTgxOTEyNDYgLT4gMQorZGl2eDMwMTYgZGl2aWRlIC05NzQ5NTMuMjgwMTYzNzIwODM2ODAwMjU4NTgyMjQ1NyAtNjkzMDk1NzkzLjM2Njc1NzgwNjc4MDI2OTgxOTEyNDYgLT4gMC4wMDE0MDY2NjQ1NDY5NDIwOTI5NDE5NjEwNzU2MDg3NjkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAxNiBkaXZpZGVpbnQgLTk3NDk1My4yODAxNjM3MjA4MzY4MDAyNTg1ODIyNDU3IC02OTMwOTU3OTMuMzY2NzU3ODA2NzgwMjY5ODE5MTI0NiAtPiAwCittdWx4MzAxNiBtdWx0aXBseSAtOTc0OTUzLjI4MDE2MzcyMDgzNjgwMDI1ODU4MjI0NTcgLTY5MzA5NTc5My4zNjY3NTc4MDY3ODAyNjk4MTkxMjQ2IC0+IDY3NTczNjAxNzIxMDU5Ni45ODk5NTg3NzQ5OTkxMzYzIEluZXhhY3QgUm91bmRlZAorcG93eDMwMTYgcG93ZXIgLTk3NDk1My4yODAxNjM3MjA4MzY4MDAyNTg1ODIyNDU3IC02OTMwOTU3OTMgLT4gLTBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDE2IHJlbWFpbmRlciAtOTc0OTUzLjI4MDE2MzcyMDgzNjgwMDI1ODU4MjI0NTcgLTY5MzA5NTc5My4zNjY3NTc4MDY3ODAyNjk4MTkxMjQ2IC0+IC05NzQ5NTMuMjgwMTYzNzIwODM2ODAwMjU4NTgyMjQ1Nworc3VieDMwMTYgc3VidHJhY3QgLTk3NDk1My4yODAxNjM3MjA4MzY4MDAyNTg1ODIyNDU3IC02OTMwOTU3OTMuMzY2NzU3ODA2NzgwMjY5ODE5MTI0NiAtPiA2OTIxMjA4NDAuMDg2NTk0MDg1OTQzNDY5NTYwNTQyNCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDE3IGFkZCAtNzYzNDY4MDE0MDAwOTU3MTg0NjE1NTY1NDMzOTc4MSAzMDA5NjMwOTQ5NTAyLjAzNTg1MjQzMzQzNDIxNDQxM0UtNDkwIC0+IC03NjM0NjgwMTQwMDA5NTcxODQ2MTU1NjU0MzM5NzgxIEluZXhhY3QgUm91bmRlZAorY29teDMwMTcgY29tcGFyZSAtNzYzNDY4MDE0MDAwOTU3MTg0NjE1NTY1NDMzOTc4MSAzMDA5NjMwOTQ5NTAyLjAzNTg1MjQzMzQzNDIxNDQxM0UtNDkwIC0+IC0xCitkaXZ4MzAxNyBkaXZpZGUgLTc2MzQ2ODAxNDAwMDk1NzE4NDYxNTU2NTQzMzk3ODEgMzAwOTYzMDk0OTUwMi4wMzU4NTI0MzM0MzQyMTQ0MTNFLTQ5MCAtPiAtMi41MzY3NDk2MTA4NjkzMjY3NTM3NDEwMjQ2NTk5NDhFKzUwOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDE3IGRpdmlkZWludCAtNzYzNDY4MDE0MDAwOTU3MTg0NjE1NTY1NDMzOTc4MSAzMDA5NjMwOTQ5NTAyLjAzNTg1MjQzMzQzNDIxNDQxM0UtNDkwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzAxNyBtdWx0aXBseSAtNzYzNDY4MDE0MDAwOTU3MTg0NjE1NTY1NDMzOTc4MSAzMDA5NjMwOTQ5NTAyLjAzNTg1MjQzMzQzNDIxNDQxM0UtNDkwIC0+IC0yLjI5Nzc1Njk2Mzg5MjEzNDM3MzY1NzU0NDAyNTEwN0UtNDQ3IEluZXhhY3QgUm91bmRlZAorcG93eDMwMTcgcG93ZXIgLTc2MzQ2ODAxNDAwMDk1NzE4NDYxNTU2NTQzMzk3ODEgMyAtPiAtNC40NTAxMjgzODIwNzIxNTcxNzAyMDc1ODQ4NDc4MzFFKzkyIEluZXhhY3QgUm91bmRlZAorcmVteDMwMTcgcmVtYWluZGVyIC03NjM0NjgwMTQwMDA5NTcxODQ2MTU1NjU0MzM5NzgxIDMwMDk2MzA5NDk1MDIuMDM1ODUyNDMzNDM0MjE0NDEzRS00OTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDE3IHN1YnRyYWN0IC03NjM0NjgwMTQwMDA5NTcxODQ2MTU1NjU0MzM5NzgxIDMwMDk2MzA5NDk1MDIuMDM1ODUyNDMzNDM0MjE0NDEzRS00OTAgLT4gLTc2MzQ2ODAxNDAwMDk1NzE4NDYxNTU2NTQzMzk3ODEgSW5leGFjdCBSb3VuZGVkCithZGR4MzAxOCBhZGQgMjYyMjczLjAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYyNCA3NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCAtPiA3NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDE4IGNvbXBhcmUgMjYyMjczLjAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYyNCA3NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCAtPiAtMQorZGl2eDMwMTggZGl2aWRlIDI2MjI3My4wMjIyODUxMTg2NTIzNjUwODg5ODk2NDI4RS02MjQgNzQxNzcuMjEwNzMzMzgwOTA4NDMxNDU4Mzg4MzU0ODAgLT4gMy41MzU3NjI3OTk1NDUyNzQzMjkzNTgyOTIwNjUzNDNFLTYyNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDE4IGRpdmlkZWludCAyNjIyNzMuMDIyMjg1MTE4NjUyMzY1MDg4OTg5NjQyOEUtNjI0IDc0MTc3LjIxMDczMzM4MDkwODQzMTQ1ODM4ODM1NDgwIC0+IDAKK211bHgzMDE4IG11bHRpcGx5IDI2MjI3My4wMjIyODUxMTg2NTIzNjUwODg5ODk2NDI4RS02MjQgNzQxNzcuMjEwNzMzMzgwOTA4NDMxNDU4Mzg4MzU0ODAgLT4gMS45NDU0NjgxMjQzNzIzOTUzNDkxOTI2NjUwMzE2NzVFLTYxNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE4IHBvd2VyIDI2MjI3My4wMjIyODUxMTg2NTIzNjUwODg5ODk2NDI4RS02MjQgNzQxNzcgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMTggcmVtYWluZGVyIDI2MjI3My4wMjIyODUxMTg2NTIzNjUwODg5ODk2NDI4RS02MjQgNzQxNzcuMjEwNzMzMzgwOTA4NDMxNDU4Mzg4MzU0ODAgLT4gMi42MjI3MzAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYxOQorc3VieDMwMTggc3VidHJhY3QgMjYyMjczLjAyMjI4NTExODY1MjM2NTA4ODk4OTY0MjhFLTYyNCA3NDE3Ny4yMTA3MzMzODA5MDg0MzE0NTgzODgzNTQ4MCAtPiAtNzQxNzcuMjEwNzMzMzgwOTA4NDMxNDU4Mzg4MzU0ODAgSW5leGFjdCBSb3VuZGVkCithZGR4MzAxOSBhZGQgLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ3MTY1ODE3MzIgLTA2NjY3NzM1Ny40NDM4ODA5NTQ4ODUwOTY2MTY3NTczIC0+IC04MDM2MDUyNzQ4ODE1OTAzMTc3NjI0NzgzMjU5MDg5IEluZXhhY3QgUm91bmRlZAorY29teDMwMTkgY29tcGFyZSAtODAzNjA1Mjc0ODgxNTkwMzE3NzYyNDcxNjU4MTczMiAtMDY2Njc3MzU3LjQ0Mzg4MDk1NDg4NTA5NjYxNjc1NzMgLT4gLTEKK2RpdngzMDE5IGRpdmlkZSAtODAzNjA1Mjc0ODgxNTkwMzE3NzYyNDcxNjU4MTczMiAtMDY2Njc3MzU3LjQ0Mzg4MDk1NDg4NTA5NjYxNjc1NzMgLT4gMTIwNTIxNDY0MjEwMzg3MzUxNzMyNzMyLjYyNzE0NjkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAxOSBkaXZpZGVpbnQgLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ3MTY1ODE3MzIgLTA2NjY3NzM1Ny40NDM4ODA5NTQ4ODUwOTY2MTY3NTczIC0+IDEyMDUyMTQ2NDIxMDM4NzM1MTczMjczMgorbXVseDMwMTkgbXVsdGlwbHkgLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ3MTY1ODE3MzIgLTA2NjY3NzM1Ny40NDM4ODA5NTQ4ODUwOTY2MTY3NTczIC0+IDUuMzU4MjI3NjE1NzA2ODAwNzExMDMzMjYyMTI0NTk4RSszOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDE5IHBvd2VyIC04MDM2MDUyNzQ4ODE1OTAzMTc3NjI0NzE2NTgxNzMyIC02NjY3NzM1NyAtPiAtMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMTkgcmVtYWluZGVyIC04MDM2MDUyNzQ4ODE1OTAzMTc3NjI0NzE2NTgxNzMyIC0wNjY2NzczNTcuNDQzODgwOTU0ODg1MDk2NjE2NzU3MyAtPiAtNDE4MTY0OTkuNTA0ODk5MzAyODI4ODk3ODkwMDU2NAorc3VieDMwMTkgc3VidHJhY3QgLTgwMzYwNTI3NDg4MTU5MDMxNzc2MjQ3MTY1ODE3MzIgLTA2NjY3NzM1Ny40NDM4ODA5NTQ4ODUwOTY2MTY3NTczIC0+IC04MDM2MDUyNzQ4ODE1OTAzMTc3NjI0NjQ5OTA0Mzc1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMjAgYWRkIDg4MzQyOS41OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NjUgLTQzOTc4Ljk3MjgzNzEyOTM5MTk4MTExMDQzMDMyNzI2IC0+IDguODM0Mjk1OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NzAgSW5leGFjdCBSb3VuZGVkCitjb214MzAyMCBjb21wYXJlIDg4MzQyOS41OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NjUgLTQzOTc4Ljk3MjgzNzEyOTM5MTk4MTExMDQzMDMyNzI2IC0+IDEKK2RpdngzMDIwIGRpdmlkZSA4ODM0MjkuNTkyODAzMTQ5ODEwMzYzNzcxMzU3MDE2NkUrNzY1IC00Mzk3OC45NzI4MzcxMjkzOTE5ODExMTA0MzAzMjcyNiAtPiAtMi4wMDg3NTQ0OTI5MTM3Mzk2MzMyMDg2NzI0NTUwMjVFKzc2NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDIwIGRpdmlkZWludCA4ODM0MjkuNTkyODAzMTQ5ODEwMzYzNzcxMzU3MDE2NkUrNzY1IC00Mzk3OC45NzI4MzcxMjkzOTE5ODExMTA0MzAzMjcyNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwMjAgbXVsdGlwbHkgODgzNDI5LjU5MjgwMzE0OTgxMDM2Mzc3MTM1NzAxNjZFKzc2NSAtNDM5NzguOTcyODM3MTI5MzkxOTgxMTEwNDMwMzI3MjYgLT4gLTMuODg1MjMyNjA2NTQwNjAwNDkwMzIxNDM4MTkxNTE2RSs3NzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAyMCBwb3dlciA4ODM0MjkuNTkyODAzMTQ5ODEwMzYzNzcxMzU3MDE2NkUrNzY1IC00Mzk3OSAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzAyMCByZW1haW5kZXIgODgzNDI5LjU5MjgwMzE0OTgxMDM2Mzc3MTM1NzAxNjZFKzc2NSAtNDM5NzguOTcyODM3MTI5MzkxOTgxMTEwNDMwMzI3MjYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDIwIHN1YnRyYWN0IDg4MzQyOS41OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NjUgLTQzOTc4Ljk3MjgzNzEyOTM5MTk4MTExMDQzMDMyNzI2IC0+IDguODM0Mjk1OTI4MDMxNDk4MTAzNjM3NzEzNTcwMTY2RSs3NzAgSW5leGFjdCBSb3VuZGVkCithZGR4MzAyMSBhZGQgMjQ3OTEzMDEwNjAuMzc5MzgzNjA1Njc3NzU1MDY5NzMgLTU2MTMzMjc4NjY0ODAuMzIyNjQ5MDgwMjA1ODc3NTY0IC0+IC01NTg4NTM2NTY1NDE5Ljk0MzI2NTQ3NDUyODEyMjQ5NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDIxIGNvbXBhcmUgMjQ3OTEzMDEwNjAuMzc5MzgzNjA1Njc3NzU1MDY5NzMgLTU2MTMzMjc4NjY0ODAuMzIyNjQ5MDgwMjA1ODc3NTY0IC0+IDEKK2RpdngzMDIxIGRpdmlkZSAyNDc5MTMwMTA2MC4zNzkzODM2MDU2Nzc3NTUwNjk3MyAtNTYxMzMyNzg2NjQ4MC4zMjI2NDkwODAyMDU4Nzc1NjQgLT4gLTAuMDA0NDE2NTA2ODY1NDU4NDE1Mjc1MTgyMTIwMDM4Mzk5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMjEgZGl2aWRlaW50IDI0NzkxMzAxMDYwLjM3OTM4MzYwNTY3Nzc1NTA2OTczIC01NjEzMzI3ODY2NDgwLjMyMjY0OTA4MDIwNTg3NzU2NCAtPiAtMAorbXVseDMwMjEgbXVsdGlwbHkgMjQ3OTEzMDEwNjAuMzc5MzgzNjA1Njc3NzU1MDY5NzMgLTU2MTMzMjc4NjY0ODAuMzIyNjQ5MDgwMjA1ODc3NTY0IC0+IC0xMzkxNjE3MDEwODg1MzA3NjU5MjUxMjAuODQwODg1MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDIxIHBvd2VyIDI0NzkxMzAxMDYwLjM3OTM4MzYwNTY3Nzc1NTA2OTczIC02IC0+IDQuMzA3Mjg5NzEyMzc1NjczMDI4OTk2MTI2MjQ5NjU2RS02MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDIxIHJlbWFpbmRlciAyNDc5MTMwMTA2MC4zNzkzODM2MDU2Nzc3NTUwNjk3MyAtNTYxMzMyNzg2NjQ4MC4zMjI2NDkwODAyMDU4Nzc1NjQgLT4gMjQ3OTEzMDEwNjAuMzc5MzgzNjA1Njc3NzU1MDY5NzMKK3N1YngzMDIxIHN1YnRyYWN0IDI0NzkxMzAxMDYwLjM3OTM4MzYwNTY3Nzc1NTA2OTczIC01NjEzMzI3ODY2NDgwLjMyMjY0OTA4MDIwNTg3NzU2NCAtPiA1NjM4MTE5MTY3NTQwLjcwMjAzMjY4NTg4MzYzMjYzNCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDIyIGFkZCAtOTMwNzExNDQzLjk0NzQ3ODE1ODYxNjI5MTA3NzYxMzkgLTc0MC4zODYwOTc5MjkyNzc1NDcyNjIyNzk4MzQ4MDMwIC0+IC05MzA3MTIxODQuMzMzNTc2MDg3ODkzODM4MzM5ODkzNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDIyIGNvbXBhcmUgLTkzMDcxMTQ0My45NDc0NzgxNTg2MTYyOTEwNzc2MTM5IC03NDAuMzg2MDk3OTI5Mjc3NTQ3MjYyMjc5ODM0ODAzMCAtPiAtMQorZGl2eDMwMjIgZGl2aWRlIC05MzA3MTE0NDMuOTQ3NDc4MTU4NjE2MjkxMDc3NjEzOSAtNzQwLjM4NjA5NzkyOTI3NzU0NzI2MjI3OTgzNDgwMzAgLT4gMTI1NzA2Mi4yOTAyNzA1ODM1MDcxMzE2MDI5NTg3OTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzAyMiBkaXZpZGVpbnQgLTkzMDcxMTQ0My45NDc0NzgxNTg2MTYyOTEwNzc2MTM5IC03NDAuMzg2MDk3OTI5Mjc3NTQ3MjYyMjc5ODM0ODAzMCAtPiAxMjU3MDYyCittdWx4MzAyMiBtdWx0aXBseSAtOTMwNzExNDQzLjk0NzQ3ODE1ODYxNjI5MTA3NzYxMzkgLTc0MC4zODYwOTc5MjkyNzc1NDcyNjIyNzk4MzQ4MDMwIC0+IDY4OTA4NTgxNDI4Mi4zOTY4NzQ2OTExMTAwMTU0MTMzIEluZXhhY3QgUm91bmRlZAorcG93eDMwMjIgcG93ZXIgLTkzMDcxMTQ0My45NDc0NzgxNTg2MTYyOTEwNzc2MTM5IC03NDAgLT4gMS4xOTM2MDMzOTQxNjUwNTE4OTk5OTcyMjY5OTUxNzhFLTY2MzcgSW5leGFjdCBSb3VuZGVkCityZW14MzAyMiByZW1haW5kZXIgLTkzMDcxMTQ0My45NDc0NzgxNTg2MTYyOTEwNzc2MTM5IC03NDAuMzg2MDk3OTI5Mjc3NTQ3MjYyMjc5ODM0ODAzMCAtPiAtMjE0LjkxMjMwNDY2NjQ5OTY3NTA2MzkxNjc3MTIxNDAKK3N1YngzMDIyIHN1YnRyYWN0IC05MzA3MTE0NDMuOTQ3NDc4MTU4NjE2MjkxMDc3NjEzOSAtNzQwLjM4NjA5NzkyOTI3NzU0NzI2MjI3OTgzNDgwMzAgLT4gLTkzMDcxMDcwMy41NjEzODAyMjkzMzg3NDM4MTUzMzQxIEluZXhhY3QgUm91bmRlZAorYWRkeDMwMjMgYWRkIDIzNTgyNzY0Mjg3NjUuMDY0MTkxMDgyNzczMzg1NTM5IDIxNC4zNTg5Nzk2MDgyMzI4NjY1ODc4NjAyMzA0NDY5IC0+IDIzNTgyNzY0Mjg5NzkuNDIzMTcwNjkxMDA2MjUyMTI3IEluZXhhY3QgUm91bmRlZAorY29teDMwMjMgY29tcGFyZSAyMzU4Mjc2NDI4NzY1LjA2NDE5MTA4Mjc3MzM4NTUzOSAyMTQuMzU4OTc5NjA4MjMyODY2NTg3ODYwMjMwNDQ2OSAtPiAxCitkaXZ4MzAyMyBkaXZpZGUgMjM1ODI3NjQyODc2NS4wNjQxOTEwODI3NzMzODU1MzkgMjE0LjM1ODk3OTYwODIzMjg2NjU4Nzg2MDIzMDQ0NjkgLT4gMTEwMDE1Mjg1MjUuMDcwODk1MDIxNTI3MzY0ODk0NzMgSW5leGFjdCBSb3VuZGVkCitkdml4MzAyMyBkaXZpZGVpbnQgMjM1ODI3NjQyODc2NS4wNjQxOTEwODI3NzMzODU1MzkgMjE0LjM1ODk3OTYwODIzMjg2NjU4Nzg2MDIzMDQ0NjkgLT4gMTEwMDE1Mjg1MjUKK211bHgzMDIzIG11bHRpcGx5IDIzNTgyNzY0Mjg3NjUuMDY0MTkxMDgyNzczMzg1NTM5IDIxNC4zNTg5Nzk2MDgyMzI4NjY1ODc4NjAyMzA0NDY5IC0+IDUwNTUxNzcyODkwNDIyNi42MjMzNDQzMjA5NjU5MDAxIEluZXhhY3QgUm91bmRlZAorcG93eDMwMjMgcG93ZXIgMjM1ODI3NjQyODc2NS4wNjQxOTEwODI3NzMzODU1MzkgMjE0IC0+IDUuNDM1ODU2NDgwNzgyODUwMDgwNzQxMjc2OTM5MjU2RSsyNjQ3IEluZXhhY3QgUm91bmRlZAorcmVteDMwMjMgcmVtYWluZGVyIDIzNTgyNzY0Mjg3NjUuMDY0MTkxMDgyNzczMzg1NTM5IDIxNC4zNTg5Nzk2MDgyMzI4NjY1ODc4NjAyMzA0NDY5IC0+IDE1LjE5Njk4NDQ3MzkwOTY0MTU2NDM1NjE1MjE3NzUKK3N1YngzMDIzIHN1YnRyYWN0IDIzNTgyNzY0Mjg3NjUuMDY0MTkxMDgyNzczMzg1NTM5IDIxNC4zNTg5Nzk2MDgyMzI4NjY1ODc4NjAyMzA0NDY5IC0+IDIzNTgyNzY0Mjg1NTAuNzA1MjExNDc0NTQwNTE4OTUxIEluZXhhY3QgUm91bmRlZAorYWRkeDMwMjQgYWRkIC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIDgyNzAuNDcyNDkyOTY1NTU5ODcyMzg0MDE4MzI5NDE4IC0+IC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIEluZXhhY3QgUm91bmRlZAorY29teDMwMjQgY29tcGFyZSAtMy44Njg3NDQ0NDk3OTU2NTM2NTE2MzgzMDg5MjY5ODdFKzc1MCA4MjcwLjQ3MjQ5Mjk2NTU1OTg3MjM4NDAxODMyOTQxOCAtPiAtMQorZGl2eDMwMjQgZGl2aWRlIC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIDgyNzAuNDcyNDkyOTY1NTU5ODcyMzg0MDE4MzI5NDE4IC0+IC00LjY3Nzc3OTIzNTgxMjk1OTIzMzA5MjczOTQzMzQ1M0UrNzQ2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMjQgZGl2aWRlaW50IC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIDgyNzAuNDcyNDkyOTY1NTU5ODcyMzg0MDE4MzI5NDE4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzAyNCBtdWx0aXBseSAtMy44Njg3NDQ0NDk3OTU2NTM2NTE2MzgzMDg5MjY5ODdFKzc1MCA4MjcwLjQ3MjQ5Mjk2NTU1OTg3MjM4NDAxODMyOTQxOCAtPiAtMy4xOTk2MzQ0NTU0MzQ4MTMyOTQ0MjY1MDU1MjYwNjNFKzc1NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDI0IHBvd2VyIC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIDgyNzAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzAyNCByZW1haW5kZXIgLTMuODY4NzQ0NDQ5Nzk1NjUzNjUxNjM4MzA4OTI2OTg3RSs3NTAgODI3MC40NzI0OTI5NjU1NTk4NzIzODQwMTgzMjk0MTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDI0IHN1YnRyYWN0IC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIDgyNzAuNDcyNDkyOTY1NTU5ODcyMzg0MDE4MzI5NDE4IC0+IC0zLjg2ODc0NDQ0OTc5NTY1MzY1MTYzODMwODkyNjk4N0UrNzUwIEluZXhhY3QgUm91bmRlZAorYWRkeDMwMjUgYWRkIDE0MDQyMjA2OS41ODYzMjQ2NDkwMTgwMjA2ODE0Mzc0RS00NDcgLTU2NzE5NTY1MjU4Ni4yNDU0MjE3MDY5MDAzMTg2NDg3IC0+IC01NjcxOTU2NTI1ODYuMjQ1NDIxNzA2OTAwMzE4NjQ4NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDI1IGNvbXBhcmUgMTQwNDIyMDY5LjU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQ0NyAtNTY3MTk1NjUyNTg2LjI0NTQyMTcwNjkwMDMxODY0ODcgLT4gMQorZGl2eDMwMjUgZGl2aWRlIDE0MDQyMjA2OS41ODYzMjQ2NDkwMTgwMjA2ODE0Mzc0RS00NDcgLTU2NzE5NTY1MjU4Ni4yNDU0MjE3MDY5MDAzMTg2NDg3IC0+IC0yLjQ3NTcyNTQyMTEzMTg2Njg1MTE5MDY0MDIwMzYzM0UtNDUxIEluZXhhY3QgUm91bmRlZAorZHZpeDMwMjUgZGl2aWRlaW50IDE0MDQyMjA2OS41ODYzMjQ2NDkwMTgwMjA2ODE0Mzc0RS00NDcgLTU2NzE5NTY1MjU4Ni4yNDU0MjE3MDY5MDAzMTg2NDg3IC0+IC0wCittdWx4MzAyNSBtdWx0aXBseSAxNDA0MjIwNjkuNTg2MzI0NjQ5MDE4MDIwNjgxNDM3NEUtNDQ3IC01NjcxOTU2NTI1ODYuMjQ1NDIxNzA2OTAwMzE4NjQ4NyAtPiAtNy45NjQ2Nzg3Mzk2NTI2NTc0OTg1MDM3OTk1NTk5NTBFLTQyOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDI1IHBvd2VyIDE0MDQyMjA2OS41ODYzMjQ2NDkwMTgwMjA2ODE0Mzc0RS00NDcgLTYgLT4gMS4zMDQzMzA4OTk3MzE5ODgzOTU0NzM1Nzg0MjU4NTRFKzI2MzMgSW5leGFjdCBSb3VuZGVkCityZW14MzAyNSByZW1haW5kZXIgMTQwNDIyMDY5LjU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQ0NyAtNTY3MTk1NjUyNTg2LjI0NTQyMTcwNjkwMDMxODY0ODcgLT4gMS40MDQyMjA2OTU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQzOQorc3VieDMwMjUgc3VidHJhY3QgMTQwNDIyMDY5LjU4NjMyNDY0OTAxODAyMDY4MTQzNzRFLTQ0NyAtNTY3MTk1NjUyNTg2LjI0NTQyMTcwNjkwMDMxODY0ODcgLT4gNTY3MTk1NjUyNTg2LjI0NTQyMTcwNjkwMDMxODY0ODcgSW5leGFjdCBSb3VuZGVkCithZGR4MzAyNiBhZGQgNzU5MjkwOTY0NzUuNjM0NTA0MjUzMzk0NzI1NTk2NDZFKzE1MyAtMDk0NTI2MDE5My41MDM4MDM1MTk1NzI2MDQxNTEyOTBFKzQ1OSAtPiAtOS40NTI2MDE5MzUwMzgwMzUxOTU3MjYwNDE1MTI5MDBFKzQ2NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDI2IGNvbXBhcmUgNzU5MjkwOTY0NzUuNjM0NTA0MjUzMzk0NzI1NTk2NDZFKzE1MyAtMDk0NTI2MDE5My41MDM4MDM1MTk1NzI2MDQxNTEyOTBFKzQ1OSAtPiAxCitkaXZ4MzAyNiBkaXZpZGUgNzU5MjkwOTY0NzUuNjM0NTA0MjUzMzk0NzI1NTk2NDZFKzE1MyAtMDk0NTI2MDE5My41MDM4MDM1MTk1NzI2MDQxNTEyOTBFKzQ1OSAtPiAtOC4wMzI2MTMzNDc4ODU0NjU4MDU2MTMyNjU2MDQ5NzNFLTMwNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDI2IGRpdmlkZWludCA3NTkyOTA5NjQ3NS42MzQ1MDQyNTMzOTQ3MjU1OTY0NkUrMTUzIC0wOTQ1MjYwMTkzLjUwMzgwMzUxOTU3MjYwNDE1MTI5MEUrNDU5IC0+IC0wCittdWx4MzAyNiBtdWx0aXBseSA3NTkyOTA5NjQ3NS42MzQ1MDQyNTMzOTQ3MjU1OTY0NkUrMTUzIC0wOTQ1MjYwMTkzLjUwMzgwMzUxOTU3MjYwNDE1MTI5MEUrNDU5IC0+IC03LjE3NzI3NTI0MjcxMjcyMzczMzA0MTU2OTYwNjg4MkUrNjMxIEluZXhhY3QgUm91bmRlZAorcG93eDMwMjYgcG93ZXIgNzU5MjkwOTY0NzUuNjM0NTA0MjUzMzk0NzI1NTk2NDZFKzE1MyAtOSAtPiAxLjE5MjEzNjI5OTY1NzE3NzMyNDA1MTQ3NzM3NTU2MUUtMTQ3NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDI2IHJlbWFpbmRlciA3NTkyOTA5NjQ3NS42MzQ1MDQyNTMzOTQ3MjU1OTY0NkUrMTUzIC0wOTQ1MjYwMTkzLjUwMzgwMzUxOTU3MjYwNDE1MTI5MEUrNDU5IC0+IDcuNTkyOTA5NjQ3NTYzNDUwNDI1MzM5NDcyNTU5NjQ2RSsxNjMKK3N1YngzMDI2IHN1YnRyYWN0IDc1OTI5MDk2NDc1LjYzNDUwNDI1MzM5NDcyNTU5NjQ2RSsxNTMgLTA5NDUyNjAxOTMuNTAzODAzNTE5NTcyNjA0MTUxMjkwRSs0NTkgLT4gOS40NTI2MDE5MzUwMzgwMzUxOTU3MjYwNDE1MTI5MDBFKzQ2NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDI3IGFkZCA2MzEyMzE4MzA5LjE0MjA0NDk1MzM1NzQ2MDQ2MzczMiAtNTY0MTMxNzgyMy4yMDIyNzQwODM5ODI0ODc1NTg1MTRFKzYyOCAtPiAtNS42NDEzMTc4MjMyMDIyNzQwODM5ODI0ODc1NTg1MTRFKzYzNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDI3IGNvbXBhcmUgNjMxMjMxODMwOS4xNDIwNDQ5NTMzNTc0NjA0NjM3MzIgLTU2NDEzMTc4MjMuMjAyMjc0MDgzOTgyNDg3NTU4NTE0RSs2MjggLT4gMQorZGl2eDMwMjcgZGl2aWRlIDYzMTIzMTgzMDkuMTQyMDQ0OTUzMzU3NDYwNDYzNzMyIC01NjQxMzE3ODIzLjIwMjI3NDA4Mzk4MjQ4NzU1ODUxNEUrNjI4IC0+IC0xLjExODk0MzkyNTMzMjQ4MTk0NDc2NTgwOTY4MjUwMkUtNjI4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMjcgZGl2aWRlaW50IDYzMTIzMTgzMDkuMTQyMDQ0OTUzMzU3NDYwNDYzNzMyIC01NjQxMzE3ODIzLjIwMjI3NDA4Mzk4MjQ4NzU1ODUxNEUrNjI4IC0+IC0wCittdWx4MzAyNyBtdWx0aXBseSA2MzEyMzE4MzA5LjE0MjA0NDk1MzM1NzQ2MDQ2MzczMiAtNTY0MTMxNzgyMy4yMDIyNzQwODM5ODI0ODc1NTg1MTRFKzYyOCAtPiAtMy41NjA5NzkzNzgzMDg5MDYwNDM3ODMwMjM3MjY3ODdFKzY0NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDI3IHBvd2VyIDYzMTIzMTgzMDkuMTQyMDQ0OTUzMzU3NDYwNDYzNzMyIC02IC0+IDEuNTgwNzYyNjExNTEyNzg3NzIwMDc2NTMzNzQ3MjY1RS01OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDI3IHJlbWFpbmRlciA2MzEyMzE4MzA5LjE0MjA0NDk1MzM1NzQ2MDQ2MzczMiAtNTY0MTMxNzgyMy4yMDIyNzQwODM5ODI0ODc1NTg1MTRFKzYyOCAtPiA2MzEyMzE4MzA5LjE0MjA0NDk1MzM1NzQ2MDQ2MzczMgorc3VieDMwMjcgc3VidHJhY3QgNjMxMjMxODMwOS4xNDIwNDQ5NTMzNTc0NjA0NjM3MzIgLTU2NDEzMTc4MjMuMjAyMjc0MDgzOTgyNDg3NTU4NTE0RSs2MjggLT4gNS42NDEzMTc4MjMyMDIyNzQwODM5ODI0ODc1NTg1MTRFKzYzNyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDI4IGFkZCA5Mzc5MzY1MjQyODEwMC41MjEwNTkyODIzOTQ2OTkzNyA5MTcuMjU3MTMxMzEwOTczMDQzMzM2OTU5NDkzNjQxNkUtNzEyIC0+IDkzNzkzNjUyNDI4MTAwLjUyMTA1OTI4MjM5NDY5OTM3IEluZXhhY3QgUm91bmRlZAorY29teDMwMjggY29tcGFyZSA5Mzc5MzY1MjQyODEwMC41MjEwNTkyODIzOTQ2OTkzNyA5MTcuMjU3MTMxMzEwOTczMDQzMzM2OTU5NDkzNjQxNkUtNzEyIC0+IDEKK2RpdngzMDI4IGRpdmlkZSA5Mzc5MzY1MjQyODEwMC41MjEwNTkyODIzOTQ2OTkzNyA5MTcuMjU3MTMxMzEwOTczMDQzMzM2OTU5NDkzNjQxNkUtNzEyIC0+IDEuMDIyNTQ0ODE1Njk0Njc0OTcyNTU5OTI0OTk3MjU2RSs3MjMgSW5leGFjdCBSb3VuZGVkCitkdml4MzAyOCBkaXZpZGVpbnQgOTM3OTM2NTI0MjgxMDAuNTIxMDU5MjgyMzk0Njk5MzcgOTE3LjI1NzEzMTMxMDk3MzA0MzMzNjk1OTQ5MzY0MTZFLTcxMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwMjggbXVsdGlwbHkgOTM3OTM2NTI0MjgxMDAuNTIxMDU5MjgyMzk0Njk5MzcgOTE3LjI1NzEzMTMxMDk3MzA0MzMzNjk1OTQ5MzY0MTZFLTcxMiAtPiA4LjYwMzI4OTY1NjEzNzc5NjUyNjc2OTc4Njk2NTM0MUUtNjk2IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjggcG93ZXIgOTM3OTM2NTI0MjgxMDAuNTIxMDU5MjgyMzk0Njk5MzcgOSAtPiA1LjYxNzczMjIwNjY2MzEzNjY1NDE4NzI2Mzk2NDM2NUUrMTI1IEluZXhhY3QgUm91bmRlZAorcmVteDMwMjggcmVtYWluZGVyIDkzNzkzNjUyNDI4MTAwLjUyMTA1OTI4MjM5NDY5OTM3IDkxNy4yNTcxMzEzMTA5NzMwNDMzMzY5NTk0OTM2NDE2RS03MTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDI4IHN1YnRyYWN0IDkzNzkzNjUyNDI4MTAwLjUyMTA1OTI4MjM5NDY5OTM3IDkxNy4yNTcxMzEzMTA5NzMwNDMzMzY5NTk0OTM2NDE2RS03MTIgLT4gOTM3OTM2NTI0MjgxMDAuNTIxMDU5MjgyMzk0Njk5MzcgSW5leGFjdCBSb3VuZGVkCithZGR4MzAyOSBhZGQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMTc0MTY2LjQyMjExMDIzNjM4OTIyMzM3MTE1IEluZXhhY3QgUm91bmRlZAorY29teDMwMjkgY29tcGFyZSA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gMQorZGl2eDMwMjkgZGl2aWRlIDk4NDcxMTk4MTYwLjU2NTI0NDE3NTc4NjY1ODg2MDYwIC0yMzk5NC4xNDMxMzM5MzkzOTc0MzU0ODk0NTE2NTQ2MiAtPiAtNDEwMzk2OC4xMDYzMzY3MTAxMjYyNDEyNjY2ODU0MzQgSW5leGFjdCBSb3VuZGVkCitkdml4MzAyOSBkaXZpZGVpbnQgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IC00MTAzOTY4CittdWx4MzAyOSBtdWx0aXBseSA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gLTIzNjI3MzIwMjMyMzUxMTIuMzc1OTYwNTI4MzA0OTc0IEluZXhhY3QgUm91bmRlZAorcG93eDMwMjkgcG93ZXIgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0IC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDI5IHJlbWFpbmRlciA5ODQ3MTE5ODE2MC41NjUyNDQxNzU3ODY2NTg4NjA2MCAtMjM5OTQuMTQzMTMzOTM5Mzk3NDM1NDg5NDUxNjU0NjIgLT4gMjU1MS40NTgyNDMxNjEyNTU4ODQ5MzI0OTI0Njc4NAorc3VieDMwMjkgc3VidHJhY3QgOTg0NzExOTgxNjAuNTY1MjQ0MTc1Nzg2NjU4ODYwNjAgLTIzOTk0LjE0MzEzMzkzOTM5NzQzNTQ4OTQ1MTY1NDYyIC0+IDk4NDcxMjIyMTU0LjcwODM3ODExNTE4NDA5NDM1MDA1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzAgYWRkIDMyOTMyNjU1Mi4wMjA4Mzk4MDAyMjUwODM2NTkyMDQzIC0wMjQ1MS4xMDA2NTM5NzAxMDU5MTU0NjA0MTAzNDA0MSAtPiAzMjkzMjQxMDAuOTIwMTg1ODMwMTE5MTY4MTk4Nzk0MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDMwIGNvbXBhcmUgMzI5MzI2NTUyLjAyMDgzOTgwMDIyNTA4MzY1OTIwNDMgLTAyNDUxLjEwMDY1Mzk3MDEwNTkxNTQ2MDQxMDM0MDQxIC0+IDEKK2RpdngzMDMwIGRpdmlkZSAzMjkzMjY1NTIuMDIwODM5ODAwMjI1MDgzNjU5MjA0MyAtMDI0NTEuMTAwNjUzOTcwMTA1OTE1NDYwNDEwMzQwNDEgLT4gLTEzNDM1OC42NDA2NzMyOTE3MTczNzM5MTg3NDIxOTc4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMzAgZGl2aWRlaW50IDMyOTMyNjU1Mi4wMjA4Mzk4MDAyMjUwODM2NTkyMDQzIC0wMjQ1MS4xMDA2NTM5NzAxMDU5MTU0NjA0MTAzNDA0MSAtPiAtMTM0MzU4CittdWx4MzAzMCBtdWx0aXBseSAzMjkzMjY1NTIuMDIwODM5ODAwMjI1MDgzNjU5MjA0MyAtMDI0NTEuMTAwNjUzOTcwMTA1OTE1NDYwNDEwMzQwNDEgLT4gLTgwNzIxMjUyNzAyOC4wMDA1NDAxNzM2ODkzNDc0NDMwIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzAgcG93ZXIgMzI5MzI2NTUyLjAyMDgzOTgwMDIyNTA4MzY1OTIwNDMgLTI0NTEgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMzAgcmVtYWluZGVyIDMyOTMyNjU1Mi4wMjA4Mzk4MDAyMjUwODM2NTkyMDQzIC0wMjQ1MS4xMDA2NTM5NzAxMDU5MTU0NjA0MTAzNDA0MSAtPiAxNTcwLjM1NDcyNDMwOTYzNTY1Mzg0NjY4NzQ5MzIyCitzdWJ4MzAzMCBzdWJ0cmFjdCAzMjkzMjY1NTIuMDIwODM5ODAwMjI1MDgzNjU5MjA0MyAtMDI0NTEuMTAwNjUzOTcwMTA1OTE1NDYwNDEwMzQwNDEgLT4gMzI5MzI5MDAzLjEyMTQ5Mzc3MDMzMDk5OTExOTYxNDYgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzMSBhZGQgLTkyOTgwLjY4NDMxMzcxMDkwMzU0NDM1NzYzMjE4NDM5IC0yMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAwOTk3MDY1IC0+IC0yMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAxMDkwMDQ2IEluZXhhY3QgUm91bmRlZAorY29teDMwMzEgY29tcGFyZSAtOTI5ODAuNjg0MzEzNzEwOTAzNTQ0MzU3NjMyMTg0MzkgLTIyODIxNzg1MDcwNDYwMTk3MjE5MjU4MDA5OTcwNjUgLT4gMQorZGl2eDMwMzEgZGl2aWRlIC05Mjk4MC42ODQzMTM3MTA5MDM1NDQzNTc2MzIxODQzOSAtMjI4MjE3ODUwNzA0NjAxOTcyMTkyNTgwMDk5NzA2NSAtPiA0LjA3NDIwNzM0Mjk2ODE5Njg2MzA3MDQ5Njk5NDQ1N0UtMjYgSW5leGFjdCBSb3VuZGVkCitkdml4MzAzMSBkaXZpZGVpbnQgLTkyOTgwLjY4NDMxMzcxMDkwMzU0NDM1NzYzMjE4NDM5IC0yMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAwOTk3MDY1IC0+IDAKK211bHgzMDMxIG11bHRpcGx5IC05Mjk4MC42ODQzMTM3MTA5MDM1NDQzNTc2MzIxODQzOSAtMjI4MjE3ODUwNzA0NjAxOTcyMTkyNTgwMDk5NzA2NSAtPiAyLjEyMTk4NTE5MzExMTgyMDE0NzE3MDcwNzcxNzkzOEUrMzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzMSBwb3dlciAtOTI5ODAuNjg0MzEzNzEwOTAzNTQ0MzU3NjMyMTg0MzkgLTIgLT4gMS4xNTY2ODM0NTUzNzE5MDk3OTM4NzAyMDcxODQzMzdFLTEwIEluZXhhY3QgUm91bmRlZAorcmVteDMwMzEgcmVtYWluZGVyIC05Mjk4MC42ODQzMTM3MTA5MDM1NDQzNTc2MzIxODQzOSAtMjI4MjE3ODUwNzA0NjAxOTcyMTkyNTgwMDk5NzA2NSAtPiAtOTI5ODAuNjg0MzEzNzEwOTAzNTQ0MzU3NjMyMTg0MzkKK3N1YngzMDMxIHN1YnRyYWN0IC05Mjk4MC42ODQzMTM3MTA5MDM1NDQzNTc2MzIxODQzOSAtMjI4MjE3ODUwNzA0NjAxOTcyMTkyNTgwMDk5NzA2NSAtPiAyMjgyMTc4NTA3MDQ2MDE5NzIxOTI1ODAwOTA0MDg0IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzIgYWRkIDEyMTM1ODE3NzYyLjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3MzggOTguMzU2NDkxNjc4NzIzNTYxMzIyNDk1NjEwMjE5MTBFLTkwMiAtPiAxLjIxMzU4MTc3NjIyNzg1ODYwNjI1OTgyMjI1Njk4N0UrNzQ4IEluZXhhY3QgUm91bmRlZAorY29teDMwMzIgY29tcGFyZSAxMjEzNTgxNzc2Mi4yNzg1ODYwNjI1OTgyMjI1Njk4N0UrNzM4IDk4LjM1NjQ5MTY3ODcyMzU2MTMyMjQ5NTYxMDIxOTEwRS05MDIgLT4gMQorZGl2eDMwMzIgZGl2aWRlIDEyMTM1ODE3NzYyLjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3MzggOTguMzU2NDkxNjc4NzIzNTYxMzIyNDk1NjEwMjE5MTBFLTkwMiAtPiAxLjIzMzg2MDM3NDE0OTk0NTU2MTg4Njk1NTM5ODcyNEUrMTY0OCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDMyIGRpdmlkZWludCAxMjEzNTgxNzc2Mi4yNzg1ODYwNjI1OTgyMjI1Njk4N0UrNzM4IDk4LjM1NjQ5MTY3ODcyMzU2MTMyMjQ5NTYxMDIxOTEwRS05MDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDMyIG11bHRpcGx5IDEyMTM1ODE3NzYyLjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3MzggOTguMzU2NDkxNjc4NzIzNTYxMzIyNDk1NjEwMjE5MTBFLTkwMiAtPiAxLjE5MzYzNjQ1ODc1MDA1OTM0MDczMzE4ODg3NjAxNUUtMTUyIEluZXhhY3QgUm91bmRlZAorcG93eDMwMzIgcG93ZXIgMTIxMzU4MTc3NjIuMjc4NTg2MDYyNTk4MjIyNTY5ODdFKzczOCAxMCAtPiA2LjkyOTMxNzUyMDU3NzQzNzcyMDQ1NzUxNzQ5OTkzNkUrNzQ4MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDMyIHJlbWFpbmRlciAxMjEzNTgxNzc2Mi4yNzg1ODYwNjI1OTgyMjI1Njk4N0UrNzM4IDk4LjM1NjQ5MTY3ODcyMzU2MTMyMjQ5NTYxMDIxOTEwRS05MDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDMyIHN1YnRyYWN0IDEyMTM1ODE3NzYyLjI3ODU4NjA2MjU5ODIyMjU2OTg3RSs3MzggOTguMzU2NDkxNjc4NzIzNTYxMzIyNDk1NjEwMjE5MTBFLTkwMiAtPiAxLjIxMzU4MTc3NjIyNzg1ODYwNjI1OTgyMjI1Njk4N0UrNzQ4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzMgYWRkIDM3LjI3NDU3NTc4NzkzNTIxMTY2ODA5NzM5MTQwMDgxIC0zOTI1NTAuNDc5MDA5NTAzNTk3OTk5ODM1NTU2OTkxNiAtPiAtMzkyNTEzLjIwNDQzMzcxNTY2Mjc4ODE2NzQ1OTYwMDIgSW5leGFjdCBSb3VuZGVkCitjb214MzAzMyBjb21wYXJlIDM3LjI3NDU3NTc4NzkzNTIxMTY2ODA5NzM5MTQwMDgxIC0zOTI1NTAuNDc5MDA5NTAzNTk3OTk5ODM1NTU2OTkxNiAtPiAxCitkaXZ4MzAzMyBkaXZpZGUgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MC40NzkwMDk1MDM1OTc5OTk4MzU1NTY5OTE2IC0+IC0wLjAwMDA5NDk1NDg2MDAyNzE0MjY0NjQxMTc3MjExMDYyMTk5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMzMgZGl2aWRlaW50IDM3LjI3NDU3NTc4NzkzNTIxMTY2ODA5NzM5MTQwMDgxIC0zOTI1NTAuNDc5MDA5NTAzNTk3OTk5ODM1NTU2OTkxNiAtPiAtMAorbXVseDMwMzMgbXVsdGlwbHkgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MC40NzkwMDk1MDM1OTc5OTk4MzU1NTY5OTE2IC0+IC0xNDYzMjE1Mi41ODA0MzAwMTIzNDUxODA5NTk5NzE0MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDMzIHBvd2VyIDM3LjI3NDU3NTc4NzkzNTIxMTY2ODA5NzM5MTQwMDgxIC0zOTI1NTAgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwMzMgcmVtYWluZGVyIDM3LjI3NDU3NTc4NzkzNTIxMTY2ODA5NzM5MTQwMDgxIC0zOTI1NTAuNDc5MDA5NTAzNTk3OTk5ODM1NTU2OTkxNiAtPiAzNy4yNzQ1NzU3ODc5MzUyMTE2NjgwOTczOTE0MDA4MQorc3VieDMwMzMgc3VidHJhY3QgMzcuMjc0NTc1Nzg3OTM1MjExNjY4MDk3MzkxNDAwODEgLTM5MjU1MC40NzkwMDk1MDM1OTc5OTk4MzU1NTY5OTE2IC0+IDM5MjU4Ny43NTM1ODUyOTE1MzMyMTE1MDM2NTQzODMwIEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzQgYWRkIC0yNzg3Ljk4MDU5MDMwNDE5OTg3ODc1NTI2NTI3MzcwMyA3MTE3NjMxMTc5MzA1MzE5MjA4MjEwMzg3NTY1MzI0IC0+IDcxMTc2MzExNzkzMDUzMTkyMDgyMTAzODc1NjI1MzYgSW5leGFjdCBSb3VuZGVkCitjb214MzAzNCBjb21wYXJlIC0yNzg3Ljk4MDU5MDMwNDE5OTg3ODc1NTI2NTI3MzcwMyA3MTE3NjMxMTc5MzA1MzE5MjA4MjEwMzg3NTY1MzI0IC0+IC0xCitkaXZ4MzAzNCBkaXZpZGUgLTI3ODcuOTgwNTkwMzA0MTk5ODc4NzU1MjY1MjczNzAzIDcxMTc2MzExNzkzMDUzMTkyMDgyMTAzODc1NjUzMjQgLT4gLTMuOTE3MDA2MjYyNDM1MDYzMDkzNDc1MTQwMjUwODcwRS0yOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDM0IGRpdmlkZWludCAtMjc4Ny45ODA1OTAzMDQxOTk4Nzg3NTUyNjUyNzM3MDMgNzExNzYzMTE3OTMwNTMxOTIwODIxMDM4NzU2NTMyNCAtPiAtMAorbXVseDMwMzQgbXVsdGlwbHkgLTI3ODcuOTgwNTkwMzA0MTk5ODc4NzU1MjY1MjczNzAzIDcxMTc2MzExNzkzMDUzMTkyMDgyMTAzODc1NjUzMjQgLT4gLTEuOTg0MzgxNzU3Njg0NzIyMjE3ODAxNDEwMzA1NzE0RSszNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM0IHBvd2VyIC0yNzg3Ljk4MDU5MDMwNDE5OTg3ODc1NTI2NTI3MzcwMyA3IC0+IC0xMzA5MjY2OTk5MjMzMDk5MjIwMTI3MTM5LjQ0MDA4MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDM0IHJlbWFpbmRlciAtMjc4Ny45ODA1OTAzMDQxOTk4Nzg3NTUyNjUyNzM3MDMgNzExNzYzMTE3OTMwNTMxOTIwODIxMDM4NzU2NTMyNCAtPiAtMjc4Ny45ODA1OTAzMDQxOTk4Nzg3NTUyNjUyNzM3MDMKK3N1YngzMDM0IHN1YnRyYWN0IC0yNzg3Ljk4MDU5MDMwNDE5OTg3ODc1NTI2NTI3MzcwMyA3MTE3NjMxMTc5MzA1MzE5MjA4MjEwMzg3NTY1MzI0IC0+IC03MTE3NjMxMTc5MzA1MzE5MjA4MjEwMzg3NTY4MTEyIEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzUgYWRkIC05ODkwNjMzLjg1NDYwOTQzNDk0MzU1OTgzMTkxMTI3NkUrOTcxIC0xOTM5OTg1NzI5LjQzNjgyNzc3NzA1NTY5OTM2MTIzNyAtPiAtOS44OTA2MzM4NTQ2MDk0MzQ5NDM1NTk4MzE5MTEyNzZFKzk3NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDM1IGNvbXBhcmUgLTk4OTA2MzMuODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzEgLTE5Mzk5ODU3MjkuNDM2ODI3Nzc3MDU1Njk5MzYxMjM3IC0+IC0xCitkaXZ4MzAzNSBkaXZpZGUgLTk4OTA2MzMuODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzEgLTE5Mzk5ODU3MjkuNDM2ODI3Nzc3MDU1Njk5MzYxMjM3IC0+IDUuMDk4MzAyMzc2NDIwMzk2MjYwNDA0ODIxMTU4MTU4RSs5NjggSW5leGFjdCBSb3VuZGVkCitkdml4MzAzNSBkaXZpZGVpbnQgLTk4OTA2MzMuODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzEgLTE5Mzk5ODU3MjkuNDM2ODI3Nzc3MDU1Njk5MzYxMjM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzAzNSBtdWx0aXBseSAtOTg5MDYzMy44NTQ2MDk0MzQ5NDM1NTk4MzE5MTEyNzZFKzk3MSAtMTkzOTk4NTcyOS40MzY4Mjc3NzcwNTU2OTkzNjEyMzcgLT4gMS45MTg3Njg4NTMzMDI3MDY4MjU5NjQwODc3MDIzMDdFKzk4NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM1IHBvd2VyIC05ODkwNjMzLjg1NDYwOTQzNDk0MzU1OTgzMTkxMTI3NkUrOTcxIC0yIC0+IDEuMDIyMjM3MzYyNjY3NTkyODY3NzY4NTExNDg3ODE0RS0xOTU2IEluZXhhY3QgUm91bmRlZAorcmVteDMwMzUgcmVtYWluZGVyIC05ODkwNjMzLjg1NDYwOTQzNDk0MzU1OTgzMTkxMTI3NkUrOTcxIC0xOTM5OTg1NzI5LjQzNjgyNzc3NzA1NTY5OTM2MTIzNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwMzUgc3VidHJhY3QgLTk4OTA2MzMuODU0NjA5NDM0OTQzNTU5ODMxOTExMjc2RSs5NzEgLTE5Mzk5ODU3MjkuNDM2ODI3Nzc3MDU1Njk5MzYxMjM3IC0+IC05Ljg5MDYzMzg1NDYwOTQzNDk0MzU1OTgzMTkxMTI3NkUrOTc3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzYgYWRkIDM5NDQ1NzAzMjMuMzMxMTIxNzUwNjYxOTIwNDc1MTkxIC0xNzM2MDcyMi4yODg3ODE0NTY0MTM5NDk2MjQ4NDM2NiAtPiAzOTI3MjA5NjAxLjA0MjM0MDI5NDI0Nzk3MDg1MDM0NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDM2IGNvbXBhcmUgMzk0NDU3MDMyMy4zMzExMjE3NTA2NjE5MjA0NzUxOTEgLTE3MzYwNzIyLjI4ODc4MTQ1NjQxMzk0OTYyNDg0MzY2IC0+IDEKK2RpdngzMDM2IGRpdmlkZSAzOTQ0NTcwMzIzLjMzMTEyMTc1MDY2MTkyMDQ3NTE5MSAtMTczNjA3MjIuMjg4NzgxNDU2NDEzOTQ5NjI0ODQzNjYgLT4gLTIyNy4yMTIzMzkzMDkxODM3NzA2ODI3NzA4MTk2MTAxIEluZXhhY3QgUm91bmRlZAorZHZpeDMwMzYgZGl2aWRlaW50IDM5NDQ1NzAzMjMuMzMxMTIxNzUwNjYxOTIwNDc1MTkxIC0xNzM2MDcyMi4yODg3ODE0NTY0MTM5NDk2MjQ4NDM2NiAtPiAtMjI3CittdWx4MzAzNiBtdWx0aXBseSAzOTQ0NTcwMzIzLjMzMTEyMTc1MDY2MTkyMDQ3NTE5MSAtMTczNjA3MjIuMjg4NzgxNDU2NDEzOTQ5NjI0ODQzNjYgLT4gLTY4NDgwNTg5OTMxOTIwNDgxLjU2MDIwMDQzMjEzNzY3IEluZXhhY3QgUm91bmRlZAorcG93eDMwMzYgcG93ZXIgMzk0NDU3MDMyMy4zMzExMjE3NTA2NjE5MjA0NzUxOTEgLTE3MzYwNzIyIC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDM2IHJlbWFpbmRlciAzOTQ0NTcwMzIzLjMzMTEyMTc1MDY2MTkyMDQ3NTE5MSAtMTczNjA3MjIuMjg4NzgxNDU2NDEzOTQ5NjI0ODQzNjYgLT4gMzY4NjM2My43Nzc3MzExNDQ2OTUzNTU2MzU2ODAxOAorc3VieDMwMzYgc3VidHJhY3QgMzk0NDU3MDMyMy4zMzExMjE3NTA2NjE5MjA0NzUxOTEgLTE3MzYwNzIyLjI4ODc4MTQ1NjQxMzk0OTYyNDg0MzY2IC0+IDM5NjE5MzEwNDUuNjE5OTAzMjA3MDc1ODcwMTAwMDM1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwMzcgYWRkIDE5NTQ0LjE0MDE4NTAzNDI3MDI5MDAyNTUyODcyNzA3IDE3ODY2OTc3NjIuODg1MTc4OTk0MTgyMTMzODM5NTQ2IC0+IDE3ODY3MTczMDcuMDI1MzY0MDI4NDUyNDIzODY1MDc1IEluZXhhY3QgUm91bmRlZAorY29teDMwMzcgY29tcGFyZSAxOTU0NC4xNDAxODUwMzQyNzAyOTAwMjU1Mjg3MjcwNyAxNzg2Njk3NzYyLjg4NTE3ODk5NDE4MjEzMzgzOTU0NiAtPiAtMQorZGl2eDMwMzcgZGl2aWRlIDE5NTQ0LjE0MDE4NTAzNDI3MDI5MDAyNTUyODcyNzA3IDE3ODY2OTc3NjIuODg1MTc4OTk0MTgyMTMzODM5NTQ2IC0+IDAuMDAwMDEwOTM4Njk0MDQ4MzI4Njc3NTkyMzQzNTk4NzE5OTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzAzNyBkaXZpZGVpbnQgMTk1NDQuMTQwMTg1MDM0MjcwMjkwMDI1NTI4NzI3MDcgMTc4NjY5Nzc2Mi44ODUxNzg5OTQxODIxMzM4Mzk1NDYgLT4gMAorbXVseDMwMzcgbXVsdGlwbHkgMTk1NDQuMTQwMTg1MDM0MjcwMjkwMDI1NTI4NzI3MDcgMTc4NjY5Nzc2Mi44ODUxNzg5OTQxODIxMzM4Mzk1NDYgLT4gMzQ5MTk0NzE1NDYxMTUuMDU4OTcxNjM0OTYxNjIyOTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzAzNyBwb3dlciAxOTU0NC4xNDAxODUwMzQyNzAyOTAwMjU1Mjg3MjcwNyAyIC0+IDM4MTk3MzQxNS41NzIyNzE0MDA5Mjk4ODAyNTU3OTQwIEluZXhhY3QgUm91bmRlZAorcmVteDMwMzcgcmVtYWluZGVyIDE5NTQ0LjE0MDE4NTAzNDI3MDI5MDAyNTUyODcyNzA3IDE3ODY2OTc3NjIuODg1MTc4OTk0MTgyMTMzODM5NTQ2IC0+IDE5NTQ0LjE0MDE4NTAzNDI3MDI5MDAyNTUyODcyNzA3CitzdWJ4MzAzNyBzdWJ0cmFjdCAxOTU0NC4xNDAxODUwMzQyNzAyOTAwMjU1Mjg3MjcwNyAxNzg2Njk3NzYyLjg4NTE3ODk5NDE4MjEzMzgzOTU0NiAtPiAtMTc4NjY3ODIxOC43NDQ5OTM5NTk5MTE4NDM4MTQwMTcgSW5leGFjdCBSb3VuZGVkCithZGR4MzAzOCBhZGQgLTA1Ljc1NDg1OTU3OTM3NjE3NzU3OTgzNTEzNjYyOTgxIDU1NjQ0NzY4NzUuOTg5NjQwNDMxMTczNjk0MzcyMDgzIC0+IDU1NjQ0NzY4NzAuMjM0NzgwODUxNzk3NTE2NzkyMjQ4IEluZXhhY3QgUm91bmRlZAorY29teDMwMzggY29tcGFyZSAtMDUuNzU0ODU5NTc5Mzc2MTc3NTc5ODM1MTM2NjI5ODEgNTU2NDQ3Njg3NS45ODk2NDA0MzExNzM2OTQzNzIwODMgLT4gLTEKK2RpdngzMDM4IGRpdmlkZSAtMDUuNzU0ODU5NTc5Mzc2MTc3NTc5ODM1MTM2NjI5ODEgNTU2NDQ3Njg3NS45ODk2NDA0MzExNzM2OTQzNzIwODMgLT4gLTEuMDM0MjEzOTQ0NTY4MjcxMzI0ODQxNjA4ODI1MTM2RS05IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMzggZGl2aWRlaW50IC0wNS43NTQ4NTk1NzkzNzYxNzc1Nzk4MzUxMzY2Mjk4MSA1NTY0NDc2ODc1Ljk4OTY0MDQzMTE3MzY5NDM3MjA4MyAtPiAtMAorbXVseDMwMzggbXVsdGlwbHkgLTA1Ljc1NDg1OTU3OTM3NjE3NzU3OTgzNTEzNjYyOTgxIDU1NjQ0NzY4NzUuOTg5NjQwNDMxMTczNjk0MzcyMDgzIC0+IC0zMjAyMjc4MzA1NC4wMDYyMDg3ODQzNjM5ODk5MDEzNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM4IHBvd2VyIC0wNS43NTQ4NTk1NzkzNzYxNzc1Nzk4MzUxMzY2Mjk4MSA2IC0+IDM2MzI1LjIzMTE4MjIzNjExNDIxMzAzMjM4OTA4NDcyIEluZXhhY3QgUm91bmRlZAorcmVteDMwMzggcmVtYWluZGVyIC0wNS43NTQ4NTk1NzkzNzYxNzc1Nzk4MzUxMzY2Mjk4MSA1NTY0NDc2ODc1Ljk4OTY0MDQzMTE3MzY5NDM3MjA4MyAtPiAtNS43NTQ4NTk1NzkzNzYxNzc1Nzk4MzUxMzY2Mjk4MQorc3VieDMwMzggc3VidHJhY3QgLTA1Ljc1NDg1OTU3OTM3NjE3NzU3OTgzNTEzNjYyOTgxIDU1NjQ0NzY4NzUuOTg5NjQwNDMxMTczNjk0MzcyMDgzIC0+IC01NTY0NDc2ODgxLjc0NDUwMDAxMDU0OTg3MTk1MTkxOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDM5IGFkZCAtNDIwODgyMC44OTg3MTgwNjkxOTQwMDg1MjYzMDI3NDYgNjI2ODg3Ljc1NTM3NzQ3MDU2NzgyMDExMTI4NDU0NjJFKzIwNiAtPiA2LjI2ODg3NzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjExIEluZXhhY3QgUm91bmRlZAorY29teDMwMzkgY29tcGFyZSAtNDIwODgyMC44OTg3MTgwNjkxOTQwMDg1MjYzMDI3NDYgNjI2ODg3Ljc1NTM3NzQ3MDU2NzgyMDExMTI4NDU0NjJFKzIwNiAtPiAtMQorZGl2eDMwMzkgZGl2aWRlIC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2MjY4ODcuNzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjA2IC0+IC02LjcxMzgzNDkxMzIxMTUyNzE4NDkwNzQyMTg1NjQzNEUtMjA2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwMzkgZGl2aWRlaW50IC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2MjY4ODcuNzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjA2IC0+IC0wCittdWx4MzAzOSBtdWx0aXBseSAtNDIwODgyMC44OTg3MTgwNjkxOTQwMDg1MjYzMDI3NDYgNjI2ODg3Ljc1NTM3NzQ3MDU2NzgyMDExMTI4NDU0NjJFKzIwNiAtPiAtMi42Mzg0NTgyODU5ODMxNTg3ODk0NTg5MjUxNzAyNjdFKzIxOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDM5IHBvd2VyIC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2IC0+IDUuNTU4NTY0NzgzMjkxMjYwMzU5MTQyMjIzMzM3OTk0RSszOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDM5IHJlbWFpbmRlciAtNDIwODgyMC44OTg3MTgwNjkxOTQwMDg1MjYzMDI3NDYgNjI2ODg3Ljc1NTM3NzQ3MDU2NzgyMDExMTI4NDU0NjJFKzIwNiAtPiAtNDIwODgyMC44OTg3MTgwNjkxOTQwMDg1MjYzMDI3NDYKK3N1YngzMDM5IHN1YnRyYWN0IC00MjA4ODIwLjg5ODcxODA2OTE5NDAwODUyNjMwMjc0NiA2MjY4ODcuNzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjA2IC0+IC02LjI2ODg3NzU1Mzc3NDcwNTY3ODIwMTExMjg0NTQ2MkUrMjExIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDAgYWRkIC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcuMTYzMjQ4NTU0MTU1NDgzNjgxNDMwMDEzMDczIC0+IC03LjAwNzcxOTU0NzgwNjYzMDg5Njk3OTA4NTgyMTI2OUUrNTYyIEluZXhhY3QgUm91bmRlZAorY29teDMwNDAgY29tcGFyZSAtNzAwNzcxOTU0NzgwNjYuMzA4OTY5NzkwODU4MjEyNjlFKzU0OSA0NjA3LjE2MzI0ODU1NDE1NTQ4MzY4MTQzMDAxMzA3MyAtPiAtMQorZGl2eDMwNDAgZGl2aWRlIC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcuMTYzMjQ4NTU0MTU1NDgzNjgxNDMwMDEzMDczIC0+IC0xLjUyMTA0ODY3MzQ5ODk5NzYyNzM2MDIzMDA3ODMwNkUrNTU5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNDAgZGl2aWRlaW50IC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcuMTYzMjQ4NTU0MTU1NDgzNjgxNDMwMDEzMDczIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA0MCBtdWx0aXBseSAtNzAwNzcxOTU0NzgwNjYuMzA4OTY5NzkwODU4MjEyNjlFKzU0OSA0NjA3LjE2MzI0ODU1NDE1NTQ4MzY4MTQzMDAxMzA3MyAtPiAtMy4yMjg1NzA3OTU2ODI5MjU1MDk0NzgxOTEzOTc4NzhFKzU2NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQwIHBvd2VyIC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMwNDAgcmVtYWluZGVyIC03MDA3NzE5NTQ3ODA2Ni4zMDg5Njk3OTA4NTgyMTI2OUUrNTQ5IDQ2MDcuMTYzMjQ4NTU0MTU1NDgzNjgxNDMwMDEzMDczIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA0MCBzdWJ0cmFjdCAtNzAwNzcxOTU0NzgwNjYuMzA4OTY5NzkwODU4MjEyNjlFKzU0OSA0NjA3LjE2MzI0ODU1NDE1NTQ4MzY4MTQzMDAxMzA3MyAtPiAtNy4wMDc3MTk1NDc4MDY2MzA4OTY5NzkwODU4MjEyNjlFKzU2MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDQxIGFkZCAtNDQyOTQxLjc1NDE4MTE1Mjc5NDA5MTgyNDQzODM0NTQgLTA2ODEyNjc2OC4wNTYzNTU5ODE5MTU2Mzc5MTUxMDE2IC0+IC02ODU2OTcwOS44MTA1MzcxMzQ3MDk3Mjk3Mzk1Mzk5NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDQxIGNvbXBhcmUgLTQ0Mjk0MS43NTQxODExNTI3OTQwOTE4MjQ0MzgzNDU0IC0wNjgxMjY3NjguMDU2MzU1OTgxOTE1NjM3OTE1MTAxNiAtPiAxCitkaXZ4MzA0MSBkaXZpZGUgLTQ0Mjk0MS43NTQxODExNTI3OTQwOTE4MjQ0MzgzNDU0IC0wNjgxMjY3NjguMDU2MzU1OTgxOTE1NjM3OTE1MTAxNiAtPiAwLjAwNjUwMTcyODU2ODkzNDA0MjE0MzkxMzExMTc2ODU1NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDQxIGRpdmlkZWludCAtNDQyOTQxLjc1NDE4MTE1Mjc5NDA5MTgyNDQzODM0NTQgLTA2ODEyNjc2OC4wNTYzNTU5ODE5MTU2Mzc5MTUxMDE2IC0+IDAKK211bHgzMDQxIG11bHRpcGx5IC00NDI5NDEuNzU0MTgxMTUyNzk0MDkxODI0NDM4MzQ1NCAtMDY4MTI2NzY4LjA1NjM1NTk4MTkxNTYzNzkxNTEwMTYgLT4gMzAxNzYxOTAxNDk1NzQuODQzODYzOTU5NDc1OTM5NzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0MSBwb3dlciAtNDQyOTQxLjc1NDE4MTE1Mjc5NDA5MTgyNDQzODM0NTQgLTY4MTI2NzY4IC0+IDBFLTEwMDI5IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMDQxIHJlbWFpbmRlciAtNDQyOTQxLjc1NDE4MTE1Mjc5NDA5MTgyNDQzODM0NTQgLTA2ODEyNjc2OC4wNTYzNTU5ODE5MTU2Mzc5MTUxMDE2IC0+IC00NDI5NDEuNzU0MTgxMTUyNzk0MDkxODI0NDM4MzQ1NAorc3VieDMwNDEgc3VidHJhY3QgLTQ0Mjk0MS43NTQxODExNTI3OTQwOTE4MjQ0MzgzNDU0IC0wNjgxMjY3NjguMDU2MzU1OTgxOTE1NjM3OTE1MTAxNiAtPiA2NzY4MzgyNi4zMDIxNzQ4MjkxMjE1NDYwOTA2NjMyNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDQyIGFkZCAtMDQwNzI2Nzc4NzExLjg2Nzc2MTU2MTY3MTE2NzYxNTkgMjk5NjkxLjk0MzAzNDUyNTkxNzQ2MTQ5OTcwNjQ5MTYgLT4gLTQwNzI2NDc5MDE5LjkyNDcyNzAzNTc1MzcwNjExNjE5IEluZXhhY3QgUm91bmRlZAorY29teDMwNDIgY29tcGFyZSAtMDQwNzI2Nzc4NzExLjg2Nzc2MTU2MTY3MTE2NzYxNTkgMjk5NjkxLjk0MzAzNDUyNTkxNzQ2MTQ5OTcwNjQ5MTYgLT4gLTEKK2RpdngzMDQyIGRpdmlkZSAtMDQwNzI2Nzc4NzExLjg2Nzc2MTU2MTY3MTE2NzYxNTkgMjk5NjkxLjk0MzAzNDUyNTkxNzQ2MTQ5OTcwNjQ5MTYgLT4gLTEzNTg5NS40NzQxOTc1NjkwODcyNTQ4MjMzMTExODg4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNDIgZGl2aWRlaW50IC0wNDA3MjY3Nzg3MTEuODY3NzYxNTYxNjcxMTY3NjE1OSAyOTk2OTEuOTQzMDM0NTI1OTE3NDYxNDk5NzA2NDkxNiAtPiAtMTM1ODk1CittdWx4MzA0MiBtdWx0aXBseSAtMDQwNzI2Nzc4NzExLjg2Nzc2MTU2MTY3MTE2NzYxNTkgMjk5NjkxLjk0MzAzNDUyNTkxNzQ2MTQ5OTcwNjQ5MTYgLT4gLTEyMjA1NDg3NDQ1Njk2ODE2LjAyMTc1NjY1NjIyMjQyIEluZXhhY3QgUm91bmRlZAorcG93eDMwNDIgcG93ZXIgLTA0MDcyNjc3ODcxMS44Njc3NjE1NjE2NzExNjc2MTU5IDI5OTY5MiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDQyIHJlbWFpbmRlciAtMDQwNzI2Nzc4NzExLjg2Nzc2MTU2MTY3MTE2NzYxNTkgMjk5NjkxLjk0MzAzNDUyNTkxNzQ2MTQ5OTcwNjQ5MTYgLT4gLTE0MjExMy4xOTA4NjIwMDgyNDA2NjUwMDIyMjQwMTgwCitzdWJ4MzA0MiBzdWJ0cmFjdCAtMDQwNzI2Nzc4NzExLjg2Nzc2MTU2MTY3MTE2NzYxNTkgMjk5NjkxLjk0MzAzNDUyNTkxNzQ2MTQ5OTcwNjQ5MTYgLT4gLTQwNzI3MDc4NDAzLjgxMDc5NjA4NzU4ODYyOTExNTYxIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDMgYWRkIC0xOTM0MTk3NTIwLjczODM2NjkxMjE3OTE0MzA4NTk1NSAzLjgxMDc1MTQyMjUxNTE3ODQwMDI5MzY5MzM3MTUxOSAtPiAtMTkzNDE5NzUxNi45Mjc2MTU0ODk2NjM5NjQ2ODU2NjEgSW5leGFjdCBSb3VuZGVkCitjb214MzA0MyBjb21wYXJlIC0xOTM0MTk3NTIwLjczODM2NjkxMjE3OTE0MzA4NTk1NSAzLjgxMDc1MTQyMjUxNTE3ODQwMDI5MzY5MzM3MTUxOSAtPiAtMQorZGl2eDMwNDMgZGl2aWRlIC0xOTM0MTk3NTIwLjczODM2NjkxMjE3OTE0MzA4NTk1NSAzLjgxMDc1MTQyMjUxNTE3ODQwMDI5MzY5MzM3MTUxOSAtPiAtNTA3NTYzMjg3LjczMTI1NjYwNzE1MzcyMzM2OTc0NzMgSW5leGFjdCBSb3VuZGVkCitkdml4MzA0MyBkaXZpZGVpbnQgLTE5MzQxOTc1MjAuNzM4MzY2OTEyMTc5MTQzMDg1OTU1IDMuODEwNzUxNDIyNTE1MTc4NDAwMjkzNjkzMzcxNTE5IC0+IC01MDc1NjMyODcKK211bHgzMDQzIG11bHRpcGx5IC0xOTM0MTk3NTIwLjczODM2NjkxMjE3OTE0MzA4NTk1NSAzLjgxMDc1MTQyMjUxNTE3ODQwMDI5MzY5MzM3MTUxOSAtPiAtNzM3MDc0NTk1My41NzkwNjI5ODUxMzA0MzgzMDkwMjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0MyBwb3dlciAtMTkzNDE5NzUyMC43MzgzNjY5MTIxNzkxNDMwODU5NTUgNCAtPiAxLjM5OTU5NzkyMjI3NTQwMDk0NzQ5Nzg1NTUzOTQ3NUUrMzcgSW5leGFjdCBSb3VuZGVkCityZW14MzA0MyByZW1haW5kZXIgLTE5MzQxOTc1MjAuNzM4MzY2OTEyMTc5MTQzMDg1OTU1IDMuODEwNzUxNDIyNTE1MTc4NDAwMjkzNjkzMzcxNTE5IC0+IC0yLjc4NjYzNzE1NTkzNDY3NDMxMjkzNjcwNDE3NzA0Nworc3VieDMwNDMgc3VidHJhY3QgLTE5MzQxOTc1MjAuNzM4MzY2OTEyMTc5MTQzMDg1OTU1IDMuODEwNzUxNDIyNTE1MTc4NDAwMjkzNjkzMzcxNTE5IC0+IC0xOTM0MTk3NTI0LjU0OTExODMzNDY5NDMyMTQ4NjI0OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDQ0IGFkZCA4MTMyNjIuNzcyMzUzMzgzMzAzODgyOTU1OTY0NjgzMCAtMzAzMjg0ODIyNzE2LjgyODIxNzgxMzExMTgxODU5MDcgLT4gLTMwMzI4NDAwOTQ1NC4wNTU4NjQ0Mjk4MDc5MzU2MzQ3IEluZXhhY3QgUm91bmRlZAorY29teDMwNDQgY29tcGFyZSA4MTMyNjIuNzcyMzUzMzgzMzAzODgyOTU1OTY0NjgzMCAtMzAzMjg0ODIyNzE2LjgyODIxNzgxMzExMTgxODU5MDcgLT4gMQorZGl2eDMwNDQgZGl2aWRlIDgxMzI2Mi43NzIzNTMzODMzMDM4ODI5NTU5NjQ2ODMwIC0zMDMyODQ4MjI3MTYuODI4MjE3ODEzMTExODE4NTkwNyAtPiAtMC4wMDAwMDI2ODE1MTQ5MDQyNjc3NzAyOTQyMTMzODE0ODUxMDggSW5leGFjdCBSb3VuZGVkCitkdml4MzA0NCBkaXZpZGVpbnQgODEzMjYyLjc3MjM1MzM4MzMwMzg4Mjk1NTk2NDY4MzAgLTMwMzI4NDgyMjcxNi44MjgyMTc4MTMxMTE4MTg1OTA3IC0+IC0wCittdWx4MzA0NCBtdWx0aXBseSA4MTMyNjIuNzcyMzUzMzgzMzAzODgyOTU1OTY0NjgzMCAtMzAzMjg0ODIyNzE2LjgyODIxNzgxMzExMTgxODU5MDcgLT4gLTI0NjY1MDI1NTczNTM5MjA4MC4xMzU3NDA0MjgwNDMxIEluZXhhY3QgUm91bmRlZAorcG93eDMwNDQgcG93ZXIgODEzMjYyLjc3MjM1MzM4MzMwMzg4Mjk1NTk2NDY4MzAgLTMgLT4gMS44NTkxMTk1NjgzMTA5OTc2MDU1NDU5MTQ4OTUxMzNFLTE4IEluZXhhY3QgUm91bmRlZAorcmVteDMwNDQgcmVtYWluZGVyIDgxMzI2Mi43NzIzNTMzODMzMDM4ODI5NTU5NjQ2ODMwIC0zMDMyODQ4MjI3MTYuODI4MjE3ODEzMTExODE4NTkwNyAtPiA4MTMyNjIuNzcyMzUzMzgzMzAzODgyOTU1OTY0NjgzMAorc3VieDMwNDQgc3VidHJhY3QgODEzMjYyLjc3MjM1MzM4MzMwMzg4Mjk1NTk2NDY4MzAgLTMwMzI4NDgyMjcxNi44MjgyMTc4MTMxMTE4MTg1OTA3IC0+IDMwMzI4NTYzNTk3OS42MDA1NzExOTY0MTU3MDE1NDY3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDUgYWRkIDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDc0NTU1ODIwNS43NjkyMzk3NDgxMzEzMDA1NjU5NTIzRS05NTIgLT4gMzYxMDU5NTQ4ODQuOTQ2MjE0MzQ5NzkzNjU1ODkzMTEgSW5leGFjdCBSb3VuZGVkCitjb214MzA0NSBjb21wYXJlIDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDc0NTU1ODIwNS43NjkyMzk3NDgxMzEzMDA1NjU5NTIzRS05NTIgLT4gMQorZGl2eDMwNDUgZGl2aWRlIDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIDc0NTU1ODIwNS43NjkyMzk3NDgxMzEzMDA1NjU5NTIzRS05NTIgLT4gNC44NDI4MDgzMjg3ODY4MDU4MjE0MTE2NzQzMDI2ODZFKzk1MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDQ1IGRpdmlkZWludCAzNjEwNTk1NDg4NC45NDYyMTQzNDk3OTM2NTU4OTMxMSA3NDU1NTgyMDUuNzY5MjM5NzQ4MTMxMzAwNTY1OTUyM0UtOTUyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA0NSBtdWx0aXBseSAzNjEwNTk1NDg4NC45NDYyMTQzNDk3OTM2NTU4OTMxMSA3NDU1NTgyMDUuNzY5MjM5NzQ4MTMxMzAwNTY1OTUyM0UtOTUyIC0+IDIuNjkxOTA5MDk0MTYwNTYxNjczMzkxMzUyNzQzODY5RS05MzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0NSBwb3dlciAzNjEwNTk1NDg4NC45NDYyMTQzNDk3OTM2NTU4OTMxMSA3IC0+IDcuOTk5Mjk3NDQ5NzEzMzAxNzE5NTgyNzMyNDQ3Mzg2RSs3MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDQ1IHJlbWFpbmRlciAzNjEwNTk1NDg4NC45NDYyMTQzNDk3OTM2NTU4OTMxMSA3NDU1NTgyMDUuNzY5MjM5NzQ4MTMxMzAwNTY1OTUyM0UtOTUyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA0NSBzdWJ0cmFjdCAzNjEwNTk1NDg4NC45NDYyMTQzNDk3OTM2NTU4OTMxMSA3NDU1NTgyMDUuNzY5MjM5NzQ4MTMxMzAwNTY1OTUyM0UtOTUyIC0+IDM2MTA1OTU0ODg0Ljk0NjIxNDM0OTc5MzY1NTg5MzExIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDYgYWRkIC0wNzU1MzcxNzc1MzguMTgxNDUxNjYyMTk2MjE4NTQ5MCAyNjk4MDc3NTI1NS41MTU0Mjg1NjQ4MzEyMjQ4NDg5OCAtPiAtNDg1NTY0MDIyODIuNjY2MDIzMDk3MzY0OTkzNzAwMDIKK2NvbXgzMDQ2IGNvbXBhcmUgLTA3NTUzNzE3NzUzOC4xODE0NTE2NjIxOTYyMTg1NDkwIDI2OTgwNzc1MjU1LjUxNTQyODU2NDgzMTIyNDg0ODk4IC0+IC0xCitkaXZ4MzA0NiBkaXZpZGUgLTA3NTUzNzE3NzUzOC4xODE0NTE2NjIxOTYyMTg1NDkwIDI2OTgwNzc1MjU1LjUxNTQyODU2NDgzMTIyNDg0ODk4IC0+IC0yLjc5OTY2NjY4MjAyOTA4OTk1NjI2OTAxODU0MTY0OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDQ2IGRpdmlkZWludCAtMDc1NTM3MTc3NTM4LjE4MTQ1MTY2MjE5NjIxODU0OTAgMjY5ODA3NzUyNTUuNTE1NDI4NTY0ODMxMjI0ODQ4OTggLT4gLTIKK211bHgzMDQ2IG11bHRpcGx5IC0wNzU1MzcxNzc1MzguMTgxNDUxNjYyMTk2MjE4NTQ5MCAyNjk4MDc3NTI1NS41MTU0Mjg1NjQ4MzEyMjQ4NDg5OCAtPiAtMjAzODA1MTYxMDU5MzY0MTk0NzcxNy4yNjg2NTIxNzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0NiBwb3dlciAtMDc1NTM3MTc3NTM4LjE4MTQ1MTY2MjE5NjIxODU0OTAgMyAtPiAtNC4zMTAwNDk1MTg5ODc5ODgwODQ1OTUyNjQ2MTc3MjdFKzMyIEluZXhhY3QgUm91bmRlZAorcmVteDMwNDYgcmVtYWluZGVyIC0wNzU1MzcxNzc1MzguMTgxNDUxNjYyMTk2MjE4NTQ5MCAyNjk4MDc3NTI1NS41MTU0Mjg1NjQ4MzEyMjQ4NDg5OCAtPiAtMjE1NzU2MjcwMjcuMTUwNTk0NTMyNTMzNzY4ODUxMDQKK3N1YngzMDQ2IHN1YnRyYWN0IC0wNzU1MzcxNzc1MzguMTgxNDUxNjYyMTk2MjE4NTQ5MCAyNjk4MDc3NTI1NS41MTU0Mjg1NjQ4MzEyMjQ4NDg5OCAtPiAtMTAyNTE3OTUyNzkzLjY5Njg4MDIyNzAyNzQ0MzM5ODAgSW5leGFjdCBSb3VuZGVkCithZGR4MzA0NyBhZGQgLTQyMjM3NjUuNDE1MzE5NTY0ODk4ODQwMDQwNjk3NjQ3IC0yNTkwNTkwMzA1NDk3NDU0MTg1NDU1NDU5MTQ5OTE4RS0yMTUgLT4gLTQyMjM3NjUuNDE1MzE5NTY0ODk4ODQwMDQwNjk3NjQ3IEluZXhhY3QgUm91bmRlZAorY29teDMwNDcgY29tcGFyZSAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgLTI1OTA1OTAzMDU0OTc0NTQxODU0NTU0NTkxNDk5MThFLTIxNSAtPiAtMQorZGl2eDMwNDcgZGl2aWRlIC00MjIzNzY1LjQxNTMxOTU2NDg5ODg0MDA0MDY5NzY0NyAtMjU5MDU5MDMwNTQ5NzQ1NDE4NTQ1NTQ1OTE0OTkxOEUtMjE1IC0+IDEuNjMwNDI1ODU1NTg4MzQ3MzU2NTcwMDc2OTA5MDUzRSsxOTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzA0NyBkaXZpZGVpbnQgLTQyMjM3NjUuNDE1MzE5NTY0ODk4ODQwMDQwNjk3NjQ3IC0yNTkwNTkwMzA1NDk3NDU0MTg1NDU1NDU5MTQ5OTE4RS0yMTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDQ3IG11bHRpcGx5IC00MjIzNzY1LjQxNTMxOTU2NDg5ODg0MDA0MDY5NzY0NyAtMjU5MDU5MDMwNTQ5NzQ1NDE4NTQ1NTQ1OTE0OTkxOEUtMjE1IC0+IDEuMDk0MjA0NTczNzYyMjI5MzA4Nzk4NjA0ODQ1Mzk1RS0xNzggSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0NyBwb3dlciAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgLTMgLT4gLTEuMzI3MDkwNzc1ODYzNjE2OTM5MzA5NTY5NzkxMTM4RS0yMCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDQ3IHJlbWFpbmRlciAtNDIyMzc2NS40MTUzMTk1NjQ4OTg4NDAwNDA2OTc2NDcgLTI1OTA1OTAzMDU0OTc0NTQxODU0NTU0NTkxNDk5MThFLTIxNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwNDcgc3VidHJhY3QgLTQyMjM3NjUuNDE1MzE5NTY0ODk4ODQwMDQwNjk3NjQ3IC0yNTkwNTkwMzA1NDk3NDU0MTg1NDU1NDU5MTQ5OTE4RS0yMTUgLT4gLTQyMjM3NjUuNDE1MzE5NTY0ODk4ODQwMDQwNjk3NjQ3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDggYWRkIC02NDY4LjkwMzczODUyMjk1MTI1OTA2MzA5OTk0NjE5NSAtNzg3Ny4zMjQzMTQyNzM2OTQzMTIxNjQ0MDc3OTQ5MzlFKzI2NyAtPiAtNy44NzczMjQzMTQyNzM2OTQzMTIxNjQ0MDc3OTQ5MzlFKzI3MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDQ4IGNvbXBhcmUgLTY0NjguOTAzNzM4NTIyOTUxMjU5MDYzMDk5OTQ2MTk1IC03ODc3LjMyNDMxNDI3MzY5NDMxMjE2NDQwNzc5NDkzOUUrMjY3IC0+IDEKK2RpdngzMDQ4IGRpdmlkZSAtNjQ2OC45MDM3Mzg1MjI5NTEyNTkwNjMwOTk5NDYxOTUgLTc4NzcuMzI0MzE0MjczNjk0MzEyMTY0NDA3Nzk0OTM5RSsyNjcgLT4gOC4yMTIwNTcxNDA3NzQ3MDY4NzQ2NjYzMDcyNDY2MjhFLTI2OCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDQ4IGRpdmlkZWludCAtNjQ2OC45MDM3Mzg1MjI5NTEyNTkwNjMwOTk5NDYxOTUgLTc4NzcuMzI0MzE0MjczNjk0MzEyMTY0NDA3Nzk0OTM5RSsyNjcgLT4gMAorbXVseDMwNDggbXVsdGlwbHkgLTY0NjguOTAzNzM4NTIyOTUxMjU5MDYzMDk5OTQ2MTk1IC03ODc3LjMyNDMxNDI3MzY5NDMxMjE2NDQwNzc5NDkzOUUrMjY3IC0+IDUuMDk1NzY1MjcwNjE2Mjg0NDU1OTIyNzQ3NTMwNjc2RSsyNzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA0OCBwb3dlciAtNjQ2OC45MDM3Mzg1MjI5NTEyNTkwNjMwOTk5NDYxOTUgLTggLT4gMy4yNjEwMjc3MjQ5ODIwODkyOTgwMzAzNjIzNjc2MTZFLTMxIEluZXhhY3QgUm91bmRlZAorcmVteDMwNDggcmVtYWluZGVyIC02NDY4LjkwMzczODUyMjk1MTI1OTA2MzA5OTk0NjE5NSAtNzg3Ny4zMjQzMTQyNzM2OTQzMTIxNjQ0MDc3OTQ5MzlFKzI2NyAtPiAtNjQ2OC45MDM3Mzg1MjI5NTEyNTkwNjMwOTk5NDYxOTUKK3N1YngzMDQ4IHN1YnRyYWN0IC02NDY4LjkwMzczODUyMjk1MTI1OTA2MzA5OTk0NjE5NSAtNzg3Ny4zMjQzMTQyNzM2OTQzMTIxNjQ0MDc3OTQ5MzlFKzI2NyAtPiA3Ljg3NzMyNDMxNDI3MzY5NDMxMjE2NDQwNzc5NDkzOUUrMjcwIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNDkgYWRkIC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IC0+IDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IEluZXhhY3QgUm91bmRlZAorY29teDMwNDkgY29tcGFyZSAtOTU2NzIyMS4xODM2NjMyMzY4MTcyMzkyNTQ3ODMzNzJFLTIwMyAxNjUwLjE5ODk2MTI1NjA2MTE2NTM2MjMxOTQ3MTI2NCAtPiAtMQorZGl2eDMwNDkgZGl2aWRlIC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IC0+IC01Ljc5NzYxNjc3NzMwMTI1MDcxMTk4NTcyOTc3Njk1N0UtMjAwIEluZXhhY3QgUm91bmRlZAorZHZpeDMwNDkgZGl2aWRlaW50IC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IC0+IC0wCittdWx4MzA0OSBtdWx0aXBseSAtOTU2NzIyMS4xODM2NjMyMzY4MTcyMzkyNTQ3ODMzNzJFLTIwMyAxNjUwLjE5ODk2MTI1NjA2MTE2NTM2MjMxOTQ3MTI2NCAtPiAtMS41Nzg3ODE4NDU5Mzg4MDU3Mzc1MjczMDQzMDM5NzZFLTE5MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDQ5IHBvd2VyIC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwNDkgcmVtYWluZGVyIC05NTY3MjIxLjE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMjAzIDE2NTAuMTk4OTYxMjU2MDYxMTY1MzYyMzE5NDcxMjY0IC0+IC05LjU2NzIyMTE4MzY2MzIzNjgxNzIzOTI1NDc4MzM3MkUtMTk3CitzdWJ4MzA0OSBzdWJ0cmFjdCAtOTU2NzIyMS4xODM2NjMyMzY4MTcyMzkyNTQ3ODMzNzJFLTIwMyAxNjUwLjE5ODk2MTI1NjA2MTE2NTM2MjMxOTQ3MTI2NCAtPiAtMTY1MC4xOTg5NjEyNTYwNjExNjUzNjIzMTk0NzEyNjQgSW5leGFjdCBSb3VuZGVkCithZGR4MzA1MCBhZGQgODgxMjMwNjA5ODc3MC4yMDA3NTIxMzkxNDIwMzM1NjlFLTQyOCAyNjc5MC4xNzM4MDE2Mzk3NTE4Njk3MjcyMDQyNzAzMEUrNTY4IC0+IDIuNjc5MDE3MzgwMTYzOTc1MTg2OTcyNzIwNDI3MDMwRSs1NzIgSW5leGFjdCBSb3VuZGVkCitjb214MzA1MCBjb21wYXJlIDg4MTIzMDYwOTg3NzAuMjAwNzUyMTM5MTQyMDMzNTY5RS00MjggMjY3OTAuMTczODAxNjM5NzUxODY5NzI3MjA0MjcwMzBFKzU2OCAtPiAtMQorZGl2eDMwNTAgZGl2aWRlIDg4MTIzMDYwOTg3NzAuMjAwNzUyMTM5MTQyMDMzNTY5RS00MjggMjY3OTAuMTczODAxNjM5NzUxODY5NzI3MjA0MjcwMzBFKzU2OCAtPiAzLjI4OTM3OTk2NTk2MDA2NTU3MzQ0NDE0MDc0OTYzNUUtOTg4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNTAgZGl2aWRlaW50IDg4MTIzMDYwOTg3NzAuMjAwNzUyMTM5MTQyMDMzNTY5RS00MjggMjY3OTAuMTczODAxNjM5NzUxODY5NzI3MjA0MjcwMzBFKzU2OCAtPiAwCittdWx4MzA1MCBtdWx0aXBseSA4ODEyMzA2MDk4NzcwLjIwMDc1MjEzOTE0MjAzMzU2OUUtNDI4IDI2NzkwLjE3MzgwMTYzOTc1MTg2OTcyNzIwNDI3MDMwRSs1NjggLT4gMi4zNjA4MzIxMTk3OTMwMzYzOTgxMjc2NTIxODc3MzJFKzE1NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDUwIHBvd2VyIDg4MTIzMDYwOTg3NzAuMjAwNzUyMTM5MTQyMDMzNTY5RS00MjggMyAtPiA2Ljg0MzM0OTUyNzQ3Njk2NzI3NDEyOTA0Mzk0OTk2OUUtMTI0NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDUwIHJlbWFpbmRlciA4ODEyMzA2MDk4NzcwLjIwMDc1MjEzOTE0MjAzMzU2OUUtNDI4IDI2NzkwLjE3MzgwMTYzOTc1MTg2OTcyNzIwNDI3MDMwRSs1NjggLT4gOC44MTIzMDYwOTg3NzAyMDA3NTIxMzkxNDIwMzM1NjlFLTQxNgorc3VieDMwNTAgc3VidHJhY3QgODgxMjMwNjA5ODc3MC4yMDA3NTIxMzkxNDIwMzM1NjlFLTQyOCAyNjc5MC4xNzM4MDE2Mzk3NTE4Njk3MjcyMDQyNzAzMEUrNTY4IC0+IC0yLjY3OTAxNzM4MDE2Mzk3NTE4Njk3MjcyMDQyNzAzMEUrNTcyIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNTEgYWRkIDgwMTA4MDMzLjEyNzI0ODM4NzE4NzM2OTIyNTAwOTA0IC03MDYyMDcyNTUwOTIuNzY0NTE5MjMxMDA3ODg5Mjg2OSAtPiAtNzA2MTI3MTQ3MDU5LjYzNzI3MDg0MzgyMDUyMDA2MTkgSW5leGFjdCBSb3VuZGVkCitjb214MzA1MSBjb21wYXJlIDgwMTA4MDMzLjEyNzI0ODM4NzE4NzM2OTIyNTAwOTA0IC03MDYyMDcyNTUwOTIuNzY0NTE5MjMxMDA3ODg5Mjg2OSAtPiAxCitkaXZ4MzA1MSBkaXZpZGUgODAxMDgwMzMuMTI3MjQ4Mzg3MTg3MzY5MjI1MDA5MDQgLTcwNjIwNzI1NTA5Mi43NjQ1MTkyMzEwMDc4ODkyODY5IC0+IC0wLjAwMDExMzQzNDE2OTAwNTcwNjAxMDUzMjUzOTc4NjM5OTYgSW5leGFjdCBSb3VuZGVkCitkdml4MzA1MSBkaXZpZGVpbnQgODAxMDgwMzMuMTI3MjQ4Mzg3MTg3MzY5MjI1MDA5MDQgLTcwNjIwNzI1NTA5Mi43NjQ1MTkyMzEwMDc4ODkyODY5IC0+IC0wCittdWx4MzA1MSBtdWx0aXBseSA4MDEwODAzMy4xMjcyNDgzODcxODczNjkyMjUwMDkwNCAtNzA2MjA3MjU1MDkyLjc2NDUxOTIzMTAwNzg4OTI4NjkgLT4gLTU2NTcyODc0MTg1Njc0MzMyMzk4LjM2MDA0MTE0MzcyIEluZXhhY3QgUm91bmRlZAorcG93eDMwNTEgcG93ZXIgODAxMDgwMzMuMTI3MjQ4Mzg3MTg3MzY5MjI1MDA5MDQgLTcgLT4gNC43MjM1MzkxNDUwNDIzMzY0ODMwMDg2NzQwNjAzMjRFLTU2IEluZXhhY3QgUm91bmRlZAorcmVteDMwNTEgcmVtYWluZGVyIDgwMTA4MDMzLjEyNzI0ODM4NzE4NzM2OTIyNTAwOTA0IC03MDYyMDcyNTUwOTIuNzY0NTE5MjMxMDA3ODg5Mjg2OSAtPiA4MDEwODAzMy4xMjcyNDgzODcxODczNjkyMjUwMDkwNAorc3VieDMwNTEgc3VidHJhY3QgODAxMDgwMzMuMTI3MjQ4Mzg3MTg3MzY5MjI1MDA5MDQgLTcwNjIwNzI1NTA5Mi43NjQ1MTkyMzEwMDc4ODkyODY5IC0+IDcwNjI4NzM2MzEyNS44OTE3Njc2MTgxOTUyNTg1MTE5IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNTIgYWRkIC0zNzk0Mjg0NjI4Mi43NjEwMTY2Mzc4OTA1OTAwMzUwNSAtNS42NDk0NTYwNTM5NDI4NTAzNTEzMTM4Njk5ODMxOTcgLT4gLTM3OTQyODQ2Mjg4LjQxMDQ3MjY5MTgzMzQ0MDM4NjM2IEluZXhhY3QgUm91bmRlZAorY29teDMwNTIgY29tcGFyZSAtMzc5NDI4NDYyODIuNzYxMDE2NjM3ODkwNTkwMDM1MDUgLTUuNjQ5NDU2MDUzOTQyODUwMzUxMzEzODY5OTgzMTk3IC0+IC0xCitkaXZ4MzA1MiBkaXZpZGUgLTM3OTQyODQ2MjgyLjc2MTAxNjYzNzg5MDU5MDAzNTA1IC01LjY0OTQ1NjA1Mzk0Mjg1MDM1MTMxMzg2OTk4MzE5NyAtPiA2NzE2MTk0NjA3LjEzOTIyNDczNTAzMjU2NjMyODk2MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDUyIGRpdmlkZWludCAtMzc5NDI4NDYyODIuNzYxMDE2NjM3ODkwNTkwMDM1MDUgLTUuNjQ5NDU2MDUzOTQyODUwMzUxMzEzODY5OTgzMTk3IC0+IDY3MTYxOTQ2MDcKK211bHgzMDUyIG11bHRpcGx5IC0zNzk0Mjg0NjI4Mi43NjEwMTY2Mzc4OTA1OTAwMzUwNSAtNS42NDk0NTYwNTM5NDI4NTAzNTEzMTM4Njk5ODMxOTcgLT4gMjE0MzU2NDQyNjM1Ljk2NzIwMDk0NDkxNDA5MzMzNjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA1MiBwb3dlciAtMzc5NDI4NDYyODIuNzYxMDE2NjM3ODkwNTkwMDM1MDUgLTYgLT4gMy4zNTEzNTU5ODYzODI2NDYwNDY3NzMwMDg3NTM4ODVFLTY0IEluZXhhY3QgUm91bmRlZAorcmVteDMwNTIgcmVtYWluZGVyIC0zNzk0Mjg0NjI4Mi43NjEwMTY2Mzc4OTA1OTAwMzUwNSAtNS42NDk0NTYwNTM5NDI4NTAzNTEzMTM4Njk5ODMxOTcgLT4gLTAuNzg2NTQ0MDIyMTg4MzIxMDg5NjAzMTI3OTgxNDIxCitzdWJ4MzA1MiBzdWJ0cmFjdCAtMzc5NDI4NDYyODIuNzYxMDE2NjM3ODkwNTkwMDM1MDUgLTUuNjQ5NDU2MDUzOTQyODUwMzUxMzEzODY5OTgzMTk3IC0+IC0zNzk0Mjg0NjI3Ny4xMTE1NjA1ODM5NDc3Mzk2ODM3NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDUzIGFkZCA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2NDgzNDM4LjMxNzg2Mjg1MTY3NjQ2ODA5NDI2MTQxMEUtMTM5IC0+IDkyNjU5NjMyMTE1MzA1LjEzNzM1NDM3NzI4NDQ1NTQxIEluZXhhY3QgUm91bmRlZAorY29teDMwNTMgY29tcGFyZSA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2NDgzNDM4LjMxNzg2Mjg1MTY3NjQ2ODA5NDI2MTQxMEUtMTM5IC0+IDEKK2RpdngzMDUzIGRpdmlkZSA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSA2NDgzNDM4LjMxNzg2Mjg1MTY3NjQ2ODA5NDI2MTQxMEUtMTM5IC0+IDEuNDI5MTc0MjY3OTE5MTM1NzEwNDEwNTI5MjExNzkxRSsxNDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzA1MyBkaXZpZGVpbnQgOTI2NTk2MzIxMTUzMDUuMTM3MzU0Mzc3Mjg0NDU1NDEgNjQ4MzQzOC4zMTc4NjI4NTE2NzY0NjgwOTQyNjE0MTBFLTEzOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwNTMgbXVsdGlwbHkgOTI2NTk2MzIxMTUzMDUuMTM3MzU0Mzc3Mjg0NDU1NDEgNjQ4MzQzOC4zMTc4NjI4NTE2NzY0NjgwOTQyNjE0MTBFLTEzOSAtPiA2LjAwNzUzMDA5Mzc1NDQ0NjA4NTgxOTI1NTk4Nzg3OEUtMTE5IEluZXhhY3QgUm91bmRlZAorcG93eDMwNTMgcG93ZXIgOTI2NTk2MzIxMTUzMDUuMTM3MzU0Mzc3Mjg0NDU1NDEgNiAtPiA2LjMyOTEyMTQ1MTk1MzQ2MTU0NjY5NjA1MTU2MzMyM0UrODMgSW5leGFjdCBSb3VuZGVkCityZW14MzA1MyByZW1haW5kZXIgOTI2NTk2MzIxMTUzMDUuMTM3MzU0Mzc3Mjg0NDU1NDEgNjQ4MzQzOC4zMTc4NjI4NTE2NzY0NjgwOTQyNjE0MTBFLTEzOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwNTMgc3VidHJhY3QgOTI2NTk2MzIxMTUzMDUuMTM3MzU0Mzc3Mjg0NDU1NDEgNjQ4MzQzOC4zMTc4NjI4NTE2NzY0NjgwOTQyNjE0MTBFLTEzOSAtPiA5MjY1OTYzMjExNTMwNS4xMzczNTQzNzcyODQ0NTU0MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDU0IGFkZCAyODM4OTQ4LjU4OTgzNzU5NTQ5NDE1MjE1MDY0NzE5NCA1Njk1NDcwMjYyNDcuNTQ2OTU2MzcwMTQxNTcxNTk2MCAtPiA1Njk1NDk4NjUxOTYuMTM2NzkzOTY1NjM1NzIzNzQ2NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDU0IGNvbXBhcmUgMjgzODk0OC41ODk4Mzc1OTU0OTQxNTIxNTA2NDcxOTQgNTY5NTQ3MDI2MjQ3LjU0Njk1NjM3MDE0MTU3MTU5NjAgLT4gLTEKK2RpdngzMDU0IGRpdmlkZSAyODM4OTQ4LjU4OTgzNzU5NTQ5NDE1MjE1MDY0NzE5NCA1Njk1NDcwMjYyNDcuNTQ2OTU2MzcwMTQxNTcxNTk2MCAtPiAwLjAwMDAwNDk4NDU3Mjc1NTE5ODA1NzQ4MTkwNzI4MTA4MDQwNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDU0IGRpdmlkZWludCAyODM4OTQ4LjU4OTgzNzU5NTQ5NDE1MjE1MDY0NzE5NCA1Njk1NDcwMjYyNDcuNTQ2OTU2MzcwMTQxNTcxNTk2MCAtPiAwCittdWx4MzA1NCBtdWx0aXBseSAyODM4OTQ4LjU4OTgzNzU5NTQ5NDE1MjE1MDY0NzE5NCA1Njk1NDcwMjYyNDcuNTQ2OTU2MzcwMTQxNTcxNTk2MCAtPiAxNjE2OTE0NzI3MDExNjY5NDE5LjM5MDk1OTk4NDI3MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDU0IHBvd2VyIDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0IDYgLT4gNS4yMzUzNDMzMzQ5ODYwNTk3NTMwOTY4ODQwODA2NzNFKzM4IEluZXhhY3QgUm91bmRlZAorcmVteDMwNTQgcmVtYWluZGVyIDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0IDU2OTU0NzAyNjI0Ny41NDY5NTYzNzAxNDE1NzE1OTYwIC0+IDI4Mzg5NDguNTg5ODM3NTk1NDk0MTUyMTUwNjQ3MTk0CitzdWJ4MzA1NCBzdWJ0cmFjdCAyODM4OTQ4LjU4OTgzNzU5NTQ5NDE1MjE1MDY0NzE5NCA1Njk1NDcwMjYyNDcuNTQ2OTU2MzcwMTQxNTcxNTk2MCAtPiAtNTY5NTQ0MTg3Mjk4Ljk1NzExODc3NDY0NzQxOTQ0NTQgSW5leGFjdCBSb3VuZGVkCithZGR4MzA1NSBhZGQgNTI0OTk1MjA0NTIzLjYwNTMzMDc5NDE3NzU3OTQyODdFKzY5NCAxNTg5NjAwODc5Njg5NTE3MTAwNTI3MjkzMDI4NTUzIC0+IDUuMjQ5OTUyMDQ1MjM2MDUzMzA3OTQxNzc1Nzk0Mjg3RSs3MDUgSW5leGFjdCBSb3VuZGVkCitjb214MzA1NSBjb21wYXJlIDUyNDk5NTIwNDUyMy42MDUzMzA3OTQxNzc1Nzk0Mjg3RSs2OTQgMTU4OTYwMDg3OTY4OTUxNzEwMDUyNzI5MzAyODU1MyAtPiAxCitkaXZ4MzA1NSBkaXZpZGUgNTI0OTk1MjA0NTIzLjYwNTMzMDc5NDE3NzU3OTQyODdFKzY5NCAxNTg5NjAwODc5Njg5NTE3MTAwNTI3MjkzMDI4NTUzIC0+IDMuMzAyNjg1NjY5Mjg2NjcwNzA4NTU0NzUzMTM5MjMzRSs2NzUgSW5leGFjdCBSb3VuZGVkCitkdml4MzA1NSBkaXZpZGVpbnQgNTI0OTk1MjA0NTIzLjYwNTMzMDc5NDE3NzU3OTQyODdFKzY5NCAxNTg5NjAwODc5Njg5NTE3MTAwNTI3MjkzMDI4NTUzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA1NSBtdWx0aXBseSA1MjQ5OTUyMDQ1MjMuNjA1MzMwNzk0MTc3NTc5NDI4N0UrNjk0IDE1ODk2MDA4Nzk2ODk1MTcxMDA1MjcyOTMwMjg1NTMgLT4gOC4zNDUzMjgzODk0MzUwMDk4MTI5MzM1OTk4ODk0NDdFKzczNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDU1IHBvd2VyIDUyNDk5NTIwNDUyMy42MDUzMzA3OTQxNzc1Nzk0Mjg3RSs2OTQgMiAtPiAyLjc1NjE5OTY0NzcyNzgyMTkxMTg1NzE2MDIzMDg0OUUrMTQxMSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDU1IHJlbWFpbmRlciA1MjQ5OTUyMDQ1MjMuNjA1MzMwNzk0MTc3NTc5NDI4N0UrNjk0IDE1ODk2MDA4Nzk2ODk1MTcxMDA1MjcyOTMwMjg1NTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDU1IHN1YnRyYWN0IDUyNDk5NTIwNDUyMy42MDUzMzA3OTQxNzc1Nzk0Mjg3RSs2OTQgMTU4OTYwMDg3OTY4OTUxNzEwMDUyNzI5MzAyODU1MyAtPiA1LjI0OTk1MjA0NTIzNjA1MzMwNzk0MTc3NTc5NDI4N0UrNzA1IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNTYgYWRkIC01NzEzMTU3MzY3NzQ1Mi4xNTQ0OTkyMTcyNTA5NzI5MCA0NjY5NjgxNDMwNzM2LjMyNjg1ODUwODcxNTY0Mzc2OSAtPiAtNTI0NjE4OTIyNDY3MTUuODI3NjQwNzA4NTM1MzI5MTMgSW5leGFjdCBSb3VuZGVkCitjb214MzA1NiBjb21wYXJlIC01NzEzMTU3MzY3NzQ1Mi4xNTQ0OTkyMTcyNTA5NzI5MCA0NjY5NjgxNDMwNzM2LjMyNjg1ODUwODcxNTY0Mzc2OSAtPiAtMQorZGl2eDMwNTYgZGl2aWRlIC01NzEzMTU3MzY3NzQ1Mi4xNTQ0OTkyMTcyNTA5NzI5MCA0NjY5NjgxNDMwNzM2LjMyNjg1ODUwODcxNTY0Mzc2OSAtPiAtMTIuMjM0NTc2MjgyMTAwNTc3MzM2NDM1NzUxNDM2OTQgSW5leGFjdCBSb3VuZGVkCitkdml4MzA1NiBkaXZpZGVpbnQgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDQ2Njk2ODE0MzA3MzYuMzI2ODU4NTA4NzE1NjQzNzY5IC0+IC0xMgorbXVseDMwNTYgbXVsdGlwbHkgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDQ2Njk2ODE0MzA3MzYuMzI2ODU4NTA4NzE1NjQzNzY5IC0+IC0yNjY3ODYyNDg3MTAzNDI2NDc3NDYwNjMzMjIuMDU0NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDU2IHBvd2VyIC01NzEzMTU3MzY3NzQ1Mi4xNTQ0OTkyMTcyNTA5NzI5MCA1IC0+IC02LjA4NjY4NjUwMzc1MjY3OTM3NTQzMDAxOTUwMzY3OUUrNjggSW5leGFjdCBSb3VuZGVkCityZW14MzA1NiByZW1haW5kZXIgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDQ2Njk2ODE0MzA3MzYuMzI2ODU4NTA4NzE1NjQzNzY5IC0+IC0xMDk1Mzk2NTA4NjE2LjIzMjE5NzExMjY2MzI0NzY3Mgorc3VieDMwNTYgc3VidHJhY3QgLTU3MTMxNTczNjc3NDUyLjE1NDQ5OTIxNzI1MDk3MjkwIDQ2Njk2ODE0MzA3MzYuMzI2ODU4NTA4NzE1NjQzNzY5IC0+IC02MTgwMTI1NTEwODE4OC40ODEzNTc3MjU5NjY2MTY2NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDU3IGFkZCA5MDc5NDgyNi41NTUyODAxODc4MTgzMDQ2MzM4MzQxMSAtNS40NzE1MDIyNzAzNTEyMzExMTAwMjc2NDcyMTYxMjggLT4gOTA3OTQ4MjEuMDgzNzc3OTE3NDY3MDczNTIzODA2NDYgSW5leGFjdCBSb3VuZGVkCitjb214MzA1NyBjb21wYXJlIDkwNzk0ODI2LjU1NTI4MDE4NzgxODMwNDYzMzgzNDExIC01LjQ3MTUwMjI3MDM1MTIzMTExMDAyNzY0NzIxNjEyOCAtPiAxCitkaXZ4MzA1NyBkaXZpZGUgOTA3OTQ4MjYuNTU1MjgwMTg3ODE4MzA0NjMzODM0MTEgLTUuNDcxNTAyMjcwMzUxMjMxMTEwMDI3NjQ3MjE2MTI4IC0+IC0xNjU5NDEzMS4yMDM2NTA1NDkyODQyODMxMzIzMjI0NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDU3IGRpdmlkZWludCA5MDc5NDgyNi41NTUyODAxODc4MTgzMDQ2MzM4MzQxMSAtNS40NzE1MDIyNzAzNTEyMzExMTAwMjc2NDcyMTYxMjggLT4gLTE2NTk0MTMxCittdWx4MzA1NyBtdWx0aXBseSA5MDc5NDgyNi41NTUyODAxODc4MTgzMDQ2MzM4MzQxMSAtNS40NzE1MDIyNzAzNTEyMzExMTAwMjc2NDcyMTYxMjggLT4gLTQ5Njc4NDA5OS42MzMzNjE3OTU4NDk2NTg5MTI0OTY0IEluZXhhY3QgUm91bmRlZAorcG93eDMwNTcgcG93ZXIgOTA3OTQ4MjYuNTU1MjgwMTg3ODE4MzA0NjMzODM0MTEgLTUgLT4gMS42MjA2Njk1OTA1MzI4NTY1MjM1NjU3NDI5NTM5OTdFLTQwIEluZXhhY3QgUm91bmRlZAorcmVteDMwNTcgcmVtYWluZGVyIDkwNzk0ODI2LjU1NTI4MDE4NzgxODMwNDYzMzgzNDExIC01LjQ3MTUwMjI3MDM1MTIzMTExMDAyNzY0NzIxNjEyOCAtPiAxLjExNDI3NDQ0Mjc2NzIzMDQ0MjMwNzg5NjY1NTIzMgorc3VieDMwNTcgc3VidHJhY3QgOTA3OTQ4MjYuNTU1MjgwMTg3ODE4MzA0NjMzODM0MTEgLTUuNDcxNTAyMjcwMzUxMjMxMTEwMDI3NjQ3MjE2MTI4IC0+IDkwNzk0ODMyLjAyNjc4MjQ1ODE2OTUzNTc0Mzg2MTc2IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNTggYWRkIDU4NTA4Nzk0NzI5LjM1MTkxMTYwODQwOTgwNDg5MTM4IC00NzA2MDg2Ny4yNDk4ODI3OTY4MDgyNDM5NzQ0NzU1MSAtPiA1ODQ2MTczMzg2Mi4xMDIwMjg4MTE2MDE1NjA5MTY5MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDU4IGNvbXBhcmUgNTg1MDg3OTQ3MjkuMzUxOTExNjA4NDA5ODA0ODkxMzggLTQ3MDYwODY3LjI0OTg4Mjc5NjgwODI0Mzk3NDQ3NTUxIC0+IDEKK2RpdngzMDU4IGRpdmlkZSA1ODUwODc5NDcyOS4zNTE5MTE2MDg0MDk4MDQ4OTEzOCAtNDcwNjA4NjcuMjQ5ODgyNzk2ODA4MjQzOTc0NDc1NTEgLT4gLTEyNDMuMjU3ODk0NDc3MDIxNjc4ODA5MzM3ODc1MzA0IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNTggZGl2aWRlaW50IDU4NTA4Nzk0NzI5LjM1MTkxMTYwODQwOTgwNDg5MTM4IC00NzA2MDg2Ny4yNDk4ODI3OTY4MDgyNDM5NzQ0NzU1MSAtPiAtMTI0MworbXVseDMwNTggbXVsdGlwbHkgNTg1MDg3OTQ3MjkuMzUxOTExNjA4NDA5ODA0ODkxMzggLTQ3MDYwODY3LjI0OTg4Mjc5NjgwODI0Mzk3NDQ3NTUxIC0+IC0yNzUzNDc0NjIxNzA4NjcyNTczLjI0OTAyOTY0Mzk2NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDU4IHBvd2VyIDU4NTA4Nzk0NzI5LjM1MTkxMTYwODQwOTgwNDg5MTM4IC00NzA2MDg2NyAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzA1OCByZW1haW5kZXIgNTg1MDg3OTQ3MjkuMzUxOTExNjA4NDA5ODA0ODkxMzggLTQ3MDYwODY3LjI0OTg4Mjc5NjgwODI0Mzk3NDQ3NTUxIC0+IDEyMTM2NzM3Ljc0NzU5NTE3NTc2MjU0NDYxODMyMTA3CitzdWJ4MzA1OCBzdWJ0cmFjdCA1ODUwODc5NDcyOS4zNTE5MTE2MDg0MDk4MDQ4OTEzOCAtNDcwNjA4NjcuMjQ5ODgyNzk2ODA4MjQzOTc0NDc1NTEgLT4gNTg1NTU4NTU1OTYuNjAxNzk0NDA1MjE4MDQ4ODY1ODYgSW5leGFjdCBSb3VuZGVkCithZGR4MzA1OSBhZGQgLTc0NjEwNC4wNzY4MDc4NDc0NDI2NDY0MjE5NDE2MzMyRSswMDYgOTU5NTQxOC4zMDA2MTM3NTQ1NTY2NzE4NTI4MDE2NjdFKzM4NSAtPiA5LjU5NTQxODMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzkxIEluZXhhY3QgUm91bmRlZAorY29teDMwNTkgY29tcGFyZSAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiA5NTk1NDE4LjMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzg1IC0+IC0xCitkaXZ4MzA1OSBkaXZpZGUgLTc0NjEwNC4wNzY4MDc4NDc0NDI2NDY0MjE5NDE2MzMyRSswMDYgOTU5NTQxOC4zMDA2MTM3NTQ1NTY2NzE4NTI4MDE2NjdFKzM4NSAtPiAtNy43NzU2Mjg0NjU5MzI3ODk3MDA1NDc4NzI1MTE3NDVFLTM4MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDU5IGRpdmlkZWludCAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiA5NTk1NDE4LjMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzg1IC0+IC0wCittdWx4MzA1OSBtdWx0aXBseSAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiA5NTk1NDE4LjMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzg1IC0+IC03LjE1OTE4MDcxMjc2NDU0OTcxMTY2OTkzOTk0NzA4NEUrNDAzIEluZXhhY3QgUm91bmRlZAorcG93eDMwNTkgcG93ZXIgLTc0NjEwNC4wNzY4MDc4NDc0NDI2NDY0MjE5NDE2MzMyRSswMDYgMTAgLT4gNS4zNDU1NzEzNDYzMDI1ODI4ODI4MDUwMzU5OTY2OTZFKzExOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDU5IHJlbWFpbmRlciAtNzQ2MTA0LjA3NjgwNzg0NzQ0MjY0NjQyMTk0MTYzMzJFKzAwNiA5NTk1NDE4LjMwMDYxMzc1NDU1NjY3MTg1MjgwMTY2N0UrMzg1IC0+IC03NDYxMDQwNzY4MDcuODQ3NDQyNjQ2NDIxOTQxNjMzMgorc3VieDMwNTkgc3VidHJhY3QgLTc0NjEwNC4wNzY4MDc4NDc0NDI2NDY0MjE5NDE2MzMyRSswMDYgOTU5NTQxOC4zMDA2MTM3NTQ1NTY2NzE4NTI4MDE2NjdFKzM4NSAtPiAtOS41OTU0MTgzMDA2MTM3NTQ1NTY2NzE4NTI4MDE2NjdFKzM5MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDYwIGFkZCA1NS45OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTE5IC05LjE3MDUzMDQ1MDg4MTYxMjg1Mzk5ODQ4OTM0MDEyNyAtPiA1LjU5OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTIwIEluZXhhY3QgUm91bmRlZAorY29teDMwNjAgY29tcGFyZSA1NS45OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTE5IC05LjE3MDUzMDQ1MDg4MTYxMjg1Mzk5ODQ4OTM0MDEyNyAtPiAxCitkaXZ4MzA2MCBkaXZpZGUgNTUuOTk0Mjc2MzI2ODgzODc0MDA0MDM3ODk2NTk0NTlFKzExOSAtOS4xNzA1MzA0NTA4ODE2MTI4NTM5OTg0ODkzNDAxMjcgLT4gLTYuMTA1ODkyODUxNzU5ODI4MTc2NjU1Njg1MTExNDkxRSsxMTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzA2MCBkaXZpZGVpbnQgNTUuOTk0Mjc2MzI2ODgzODc0MDA0MDM3ODk2NTk0NTlFKzExOSAtOS4xNzA1MzA0NTA4ODE2MTI4NTM5OTg0ODkzNDAxMjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDYwIG11bHRpcGx5IDU1Ljk5NDI3NjMyNjg4Mzg3NDAwNDAzNzg5NjU5NDU5RSsxMTkgLTkuMTcwNTMwNDUwODgxNjEyODUzOTk4NDg5MzQwMTI3IC0+IC01LjEzNDk3MjE2MTMwNzY3OTkzOTI4MTE3MDk0NDU1NkUrMTIxIEluZXhhY3QgUm91bmRlZAorcG93eDMwNjAgcG93ZXIgNTUuOTk0Mjc2MzI2ODgzODc0MDA0MDM3ODk2NTk0NTlFKzExOSAtOSAtPiAxLjg0ODAyMjU4NDc2NDM4NDA3NzY3MjA0MTA1NjM5NkUtMTA4NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDYwIHJlbWFpbmRlciA1NS45OTQyNzYzMjY4ODM4NzQwMDQwMzc4OTY1OTQ1OUUrMTE5IC05LjE3MDUzMDQ1MDg4MTYxMjg1Mzk5ODQ4OTM0MDEyNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwNjAgc3VidHJhY3QgNTUuOTk0Mjc2MzI2ODgzODc0MDA0MDM3ODk2NTk0NTlFKzExOSAtOS4xNzA1MzA0NTA4ODE2MTI4NTM5OTg0ODkzNDAxMjcgLT4gNS41OTk0Mjc2MzI2ODgzODc0MDA0MDM3ODk2NTk0NTlFKzEyMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDYxIGFkZCAtNDEyMTQyNjU2MjguODM4MDEyNDE0NjczMTcyNzA1OTUgMTAxNTMzNjMyMzc5ODM4OTkwMzM2MTk3ODI3MTM1NCAtPiAxMDE1MzM2MzIzNzk4Mzg5OTAzMzIwNzY0MDA1NzI1IEluZXhhY3QgUm91bmRlZAorY29teDMwNjEgY29tcGFyZSAtNDEyMTQyNjU2MjguODM4MDEyNDE0NjczMTcyNzA1OTUgMTAxNTMzNjMyMzc5ODM4OTkwMzM2MTk3ODI3MTM1NCAtPiAtMQorZGl2eDMwNjEgZGl2aWRlIC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NSAxMDE1MzM2MzIzNzk4Mzg5OTAzMzYxOTc4MjcxMzU0IC0+IC00LjA1OTE3Mzc1OTc1MDM0MjI0NzYyMDcwNjM4NDAyN0UtMjAgSW5leGFjdCBSb3VuZGVkCitkdml4MzA2MSBkaXZpZGVpbnQgLTQxMjE0MjY1NjI4LjgzODAxMjQxNDY3MzE3MjcwNTk1IDEwMTUzMzYzMjM3OTgzODk5MDMzNjE5NzgyNzEzNTQgLT4gLTAKK211bHgzMDYxIG11bHRpcGx5IC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NSAxMDE1MzM2MzIzNzk4Mzg5OTAzMzYxOTc4MjcxMzU0IC0+IC00LjE4NDYzNDA5NTE2MzQ3MjM4NDAyODU0OTM3ODM5MkUrNDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2MSBwb3dlciAtNDEyMTQyNjU2MjguODM4MDEyNDE0NjczMTcyNzA1OTUgMSAtPiAtNDEyMTQyNjU2MjguODM4MDEyNDE0NjczMTcyNzA1OTUKK3JlbXgzMDYxIHJlbWFpbmRlciAtNDEyMTQyNjU2MjguODM4MDEyNDE0NjczMTcyNzA1OTUgMTAxNTMzNjMyMzc5ODM4OTkwMzM2MTk3ODI3MTM1NCAtPiAtNDEyMTQyNjU2MjguODM4MDEyNDE0NjczMTcyNzA1OTUKK3N1YngzMDYxIHN1YnRyYWN0IC00MTIxNDI2NTYyOC44MzgwMTI0MTQ2NzMxNzI3MDU5NSAxMDE1MzM2MzIzNzk4Mzg5OTAzMzYxOTc4MjcxMzU0IC0+IC0xMDE1MzM2MzIzNzk4Mzg5OTAzNDAzMTkyNTM2OTgzIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNjIgYWRkIDg5OTM3LjM5NzQ5MjAxMDk1NTcwMzU3NTU3NDMwODIyIDgyMzUxNTU0MjEwMDkzLjYwODc5NDc2MDI3ODAwMzMxIC0+IDgyMzUxNTU0MzAwMDMxLjAwNjI4Njc3MTIzMzcwNjg5IEluZXhhY3QgUm91bmRlZAorY29teDMwNjIgY29tcGFyZSA4OTkzNy4zOTc0OTIwMTA5NTU3MDM1NzU1NzQzMDgyMiA4MjM1MTU1NDIxMDA5My42MDg3OTQ3NjAyNzgwMDMzMSAtPiAtMQorZGl2eDMwNjIgZGl2aWRlIDg5OTM3LjM5NzQ5MjAxMDk1NTcwMzU3NTU3NDMwODIyIDgyMzUxNTU0MjEwMDkzLjYwODc5NDc2MDI3ODAwMzMxIC0+IDEuMDkyMTE1MzYyNjYyOTEzNDE1NTkyOTMwOTgyMTI5RS05IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNjIgZGl2aWRlaW50IDg5OTM3LjM5NzQ5MjAxMDk1NTcwMzU3NTU3NDMwODIyIDgyMzUxNTU0MjEwMDkzLjYwODc5NDc2MDI3ODAwMzMxIC0+IDAKK211bHgzMDYyIG11bHRpcGx5IDg5OTM3LjM5NzQ5MjAxMDk1NTcwMzU3NTU3NDMwODIyIDgyMzUxNTU0MjEwMDkzLjYwODc5NDc2MDI3ODAwMzMxIC0+IDc0MDY0ODQ0NjUwNzgwNzcxOTEuOTIwMDE1NzkzNjYyIEluZXhhY3QgUm91bmRlZAorcG93eDMwNjIgcG93ZXIgODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIgOCAtPiA0LjI4MDc3NjI2NzcyMzkxMzA0MzA1MDEwMDkzNDI5MUUrMzkgSW5leGFjdCBSb3VuZGVkCityZW14MzA2MiByZW1haW5kZXIgODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIgODIzNTE1NTQyMTAwOTMuNjA4Nzk0NzYwMjc4MDAzMzEgLT4gODk5MzcuMzk3NDkyMDEwOTU1NzAzNTc1NTc0MzA4MjIKK3N1YngzMDYyIHN1YnRyYWN0IDg5OTM3LjM5NzQ5MjAxMDk1NTcwMzU3NTU3NDMwODIyIDgyMzUxNTU0MjEwMDkzLjYwODc5NDc2MDI3ODAwMzMxIC0+IC04MjM1MTU1NDEyMDE1Ni4yMTEzMDI3NDkzMjIyOTk3MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDYzIGFkZCAwMTcxMjY2MS42NDY3NzA4MjE1NjI4NDEyNTQ4Njk0M0UrMzU5IDU3OTMyLjc4NDM1NTI5NDgzMjQxNTUyMDQyMTE1ODM3RS0wMzcgLT4gMS43MTI2NjE2NDY3NzA4MjE1NjI4NDEyNTQ4Njk0MzBFKzM2NSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDYzIGNvbXBhcmUgMDE3MTI2NjEuNjQ2NzcwODIxNTYyODQxMjU0ODY5NDNFKzM1OSA1NzkzMi43ODQzNTUyOTQ4MzI0MTU1MjA0MjExNTgzN0UtMDM3IC0+IDEKK2RpdngzMDYzIGRpdmlkZSAwMTcxMjY2MS42NDY3NzA4MjE1NjI4NDEyNTQ4Njk0M0UrMzU5IDU3OTMyLjc4NDM1NTI5NDgzMjQxNTUyMDQyMTE1ODM3RS0wMzcgLT4gMi45NTYyOTA5MjU0NzU0MTQxODU5NjA5OTk3ODg4NDhFKzM5NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDYzIGRpdmlkZWludCAwMTcxMjY2MS42NDY3NzA4MjE1NjI4NDEyNTQ4Njk0M0UrMzU5IDU3OTMyLjc4NDM1NTI5NDgzMjQxNTUyMDQyMTE1ODM3RS0wMzcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDYzIG11bHRpcGx5IDAxNzEyNjYxLjY0Njc3MDgyMTU2Mjg0MTI1NDg2OTQzRSszNTkgNTc5MzIuNzg0MzU1Mjk0ODMyNDE1NTIwNDIxMTU4MzdFLTAzNyAtPiA5LjkyMTkyNTc4NTU5NTgxMzU4NzY1NTMxMjMwNzkzMEUrMzMyIEluZXhhY3QgUm91bmRlZAorcG93eDMwNjMgcG93ZXIgMDE3MTI2NjEuNjQ2NzcwODIxNTYyODQxMjU0ODY5NDNFKzM1OSA2IC0+IDIuNTIzNjUxODAzMzIzMDQ3NzExNzM1NTAxOTQ0OTU5RSsyMTkxIEluZXhhY3QgUm91bmRlZAorcmVteDMwNjMgcmVtYWluZGVyIDAxNzEyNjYxLjY0Njc3MDgyMTU2Mjg0MTI1NDg2OTQzRSszNTkgNTc5MzIuNzg0MzU1Mjk0ODMyNDE1NTIwNDIxMTU4MzdFLTAzNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwNjMgc3VidHJhY3QgMDE3MTI2NjEuNjQ2NzcwODIxNTYyODQxMjU0ODY5NDNFKzM1OSA1NzkzMi43ODQzNTUyOTQ4MzI0MTU1MjA0MjExNTgzN0UtMDM3IC0+IDEuNzEyNjYxNjQ2NzcwODIxNTYyODQxMjU0ODY5NDMwRSszNjUgSW5leGFjdCBSb3VuZGVkCithZGR4MzA2NCBhZGQgLTI2NDc1OTMzMDYuNTI4NjE3NjkxMzczNDcwMDU5MjEzIC02NTU1MzE1NTg3MDkuNDU4MjE2ODkzMDE5MTAxNDQ2MSAtPiAtNjU4MTc5MTUyMDE1Ljk4NjgzNDU4NDM5MjU3MTUwNTMgSW5leGFjdCBSb3VuZGVkCitjb214MzA2NCBjb21wYXJlIC0yNjQ3NTkzMzA2LjUyODYxNzY5MTM3MzQ3MDA1OTIxMyAtNjU1NTMxNTU4NzA5LjQ1ODIxNjg5MzAxOTEwMTQ0NjEgLT4gMQorZGl2eDMwNjQgZGl2aWRlIC0yNjQ3NTkzMzA2LjUyODYxNzY5MTM3MzQ3MDA1OTIxMyAtNjU1NTMxNTU4NzA5LjQ1ODIxNjg5MzAxOTEwMTQ0NjEgLT4gMC4wMDQwMzg4NDk0OTc1NjAzMDMxNTg2MzkxOTI4OTU1NDQgSW5leGFjdCBSb3VuZGVkCitkdml4MzA2NCBkaXZpZGVpbnQgLTI2NDc1OTMzMDYuNTI4NjE3NjkxMzczNDcwMDU5MjEzIC02NTU1MzE1NTg3MDkuNDU4MjE2ODkzMDE5MTAxNDQ2MSAtPiAwCittdWx4MzA2NCBtdWx0aXBseSAtMjY0NzU5MzMwNi41Mjg2MTc2OTEzNzM0NzAwNTkyMTMgLTY1NTUzMTU1ODcwOS40NTgyMTY4OTMwMTkxMDE0NDYxIC0+IDE3MzU1ODA5NjcwNTc0MzMxNTMxMjAuMDk5NjQzNjQxIEluZXhhY3QgUm91bmRlZAorcG93eDMwNjQgcG93ZXIgLTI2NDc1OTMzMDYuNTI4NjE3NjkxMzczNDcwMDU5MjEzIC03IC0+IC0xLjA5NjU4MTkxNDAwNTkwMjU4MzQxMzgxMDIwMTU3MUUtNjYgSW5leGFjdCBSb3VuZGVkCityZW14MzA2NCByZW1haW5kZXIgLTI2NDc1OTMzMDYuNTI4NjE3NjkxMzczNDcwMDU5MjEzIC02NTU1MzE1NTg3MDkuNDU4MjE2ODkzMDE5MTAxNDQ2MSAtPiAtMjY0NzU5MzMwNi41Mjg2MTc2OTEzNzM0NzAwNTkyMTMKK3N1YngzMDY0IHN1YnRyYWN0IC0yNjQ3NTkzMzA2LjUyODYxNzY5MTM3MzQ3MDA1OTIxMyAtNjU1NTMxNTU4NzA5LjQ1ODIxNjg5MzAxOTEwMTQ0NjEgLT4gNjUyODgzOTY1NDAyLjkyOTU5OTIwMTY0NTYzMTM4NjkgSW5leGFjdCBSb3VuZGVkCithZGR4MzA2NSBhZGQgMjkwNDA3ODY5MDY2NTc2NTExNjYwMzI1MzA5OTY2OEUtMzI5IC03MS40NTU4NjYxOTE3NjA5MTU5OTI2NDcxNzA0Nzg4NUUrNzg3IC0+IC03LjE0NTU4NjYxOTE3NjA5MTU5OTI2NDcxNzA0Nzg4NUUrNzg4IEluZXhhY3QgUm91bmRlZAorY29teDMwNjUgY29tcGFyZSAyOTA0MDc4NjkwNjY1NzY1MTE2NjAzMjUzMDk5NjY4RS0zMjkgLTcxLjQ1NTg2NjE5MTc2MDkxNTk5MjY0NzE3MDQ3ODg1RSs3ODcgLT4gMQorZGl2eDMwNjUgZGl2aWRlIDI5MDQwNzg2OTA2NjU3NjUxMTY2MDMyNTMwOTk2NjhFLTMyOSAtNzEuNDU1ODY2MTkxNzYwOTE1OTkyNjQ3MTcwNDc4ODVFKzc4NyAtPiAtNC4wNjQxNTcxNDQwMzY3MTIzMjUwODQ0NzIwMjIzMTZFLTEwODggSW5leGFjdCBSb3VuZGVkCitkdml4MzA2NSBkaXZpZGVpbnQgMjkwNDA3ODY5MDY2NTc2NTExNjYwMzI1MzA5OTY2OEUtMzI5IC03MS40NTU4NjYxOTE3NjA5MTU5OTI2NDcxNzA0Nzg4NUUrNzg3IC0+IC0wCittdWx4MzA2NSBtdWx0aXBseSAyOTA0MDc4NjkwNjY1NzY1MTE2NjAzMjUzMDk5NjY4RS0zMjkgLTcxLjQ1NTg2NjE5MTc2MDkxNTk5MjY0NzE3MDQ3ODg1RSs3ODcgLT4gLTIuMDc1MTM0NTgzMzA1NTcxNTI3OTYyNzEwMDE3MjYyRSs0OTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA2NSBwb3dlciAyOTA0MDc4NjkwNjY1NzY1MTE2NjAzMjUzMDk5NjY4RS0zMjkgLTcgLT4gNS43NDAzODkyMDg4NDI4OTU1NjEyNTAxMjg0MDc4MDNFKzIwODkgSW5leGFjdCBSb3VuZGVkCityZW14MzA2NSByZW1haW5kZXIgMjkwNDA3ODY5MDY2NTc2NTExNjYwMzI1MzA5OTY2OEUtMzI5IC03MS40NTU4NjYxOTE3NjA5MTU5OTI2NDcxNzA0Nzg4NUUrNzg3IC0+IDIuOTA0MDc4NjkwNjY1NzY1MTE2NjAzMjUzMDk5NjY4RS0yOTkKK3N1YngzMDY1IHN1YnRyYWN0IDI5MDQwNzg2OTA2NjU3NjUxMTY2MDMyNTMwOTk2NjhFLTMyOSAtNzEuNDU1ODY2MTkxNzYwOTE1OTkyNjQ3MTcwNDc4ODVFKzc4NyAtPiA3LjE0NTU4NjYxOTE3NjA5MTU5OTI2NDcxNzA0Nzg4NUUrNzg4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNjYgYWRkIDIyMDk0MzM4OTcyLjM5MTA5NzI2NTIyNDc3OTk5NTE1IC00MDk4NDY1NDkzNzEuMzkwMDgwNTAzOTY2ODQxNzIwM0UtNDk5IC0+IDIyMDk0MzM4OTcyLjM5MTA5NzI2NTIyNDc3OTk5NTE1IEluZXhhY3QgUm91bmRlZAorY29teDMwNjYgY29tcGFyZSAyMjA5NDMzODk3Mi4zOTEwOTcyNjUyMjQ3Nzk5OTUxNSAtNDA5ODQ2NTQ5MzcxLjM5MDA4MDUwMzk2Njg0MTcyMDNFLTQ5OSAtPiAxCitkaXZ4MzA2NiBkaXZpZGUgMjIwOTQzMzg5NzIuMzkxMDk3MjY1MjI0Nzc5OTk1MTUgLTQwOTg0NjU0OTM3MS4zOTAwODA1MDM5NjY4NDE3MjAzRS00OTkgLT4gLTUuMzkwODgwODA4MDE5MTc0MTk0MDEwMjI0NzM2OTY1RSs0OTcgSW5leGFjdCBSb3VuZGVkCitkdml4MzA2NiBkaXZpZGVpbnQgMjIwOTQzMzg5NzIuMzkxMDk3MjY1MjI0Nzc5OTk1MTUgLTQwOTg0NjU0OTM3MS4zOTAwODA1MDM5NjY4NDE3MjAzRS00OTkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDY2IG11bHRpcGx5IDIyMDk0MzM4OTcyLjM5MTA5NzI2NTIyNDc3OTk5NTE1IC00MDk4NDY1NDkzNzEuMzkwMDgwNTAzOTY2ODQxNzIwM0UtNDk5IC0+IC05LjA1NTI4ODU4ODQ3NjMxNTgyMjExMzk3NTQyNjczMEUtNDc4IEluZXhhY3QgUm91bmRlZAorcG93eDMwNjYgcG93ZXIgMjIwOTQzMzg5NzIuMzkxMDk3MjY1MjI0Nzc5OTk1MTUgLTQgLT4gNC4xOTYzOTEwMjIzNTQxMjI2ODY3MjUzMTUyMDk5NjdFLTQyIEluZXhhY3QgUm91bmRlZAorcmVteDMwNjYgcmVtYWluZGVyIDIyMDk0MzM4OTcyLjM5MTA5NzI2NTIyNDc3OTk5NTE1IC00MDk4NDY1NDkzNzEuMzkwMDgwNTAzOTY2ODQxNzIwM0UtNDk5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA2NiBzdWJ0cmFjdCAyMjA5NDMzODk3Mi4zOTEwOTcyNjUyMjQ3Nzk5OTUxNSAtNDA5ODQ2NTQ5MzcxLjM5MDA4MDUwMzk2Njg0MTcyMDNFLTQ5OSAtPiAyMjA5NDMzODk3Mi4zOTEwOTcyNjUyMjQ3Nzk5OTUxNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDY3IGFkZCAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtMzM3NDk4ODU4MTYwNzU4NjA2MTE3MzI0ODMwNTkyMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDY3IGNvbXBhcmUgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTEKK2RpdngzMDY3IGRpdmlkZSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtNDEwMTE0MDg4ODM3OTY4MTc3OTcuODEzMTA5NzcwMzggSW5leGFjdCBSb3VuZGVkCitkdml4MzA2NyBkaXZpZGVpbnQgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTQxMDExNDA4ODgzNzk2ODE3Nzk3CittdWx4MzA2NyBtdWx0aXBseSAtMzM3NDk4ODU4MTYwNzU4NjA2MTI1NTU0MjIwMTA0OCA4MjI5Mzg5NTEyNC45MDA0NTI3MTUwNDgzNjU2ODY4MSAtPiAtMi43Nzc0MDk1NjM4MjU1MTIyMDI3OTMzMzYxMzIzMTBFKzQxIEluZXhhY3QgUm91bmRlZAorcG93eDMwNjcgcG93ZXIgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggOCAtPiAxLjY4MzM2NTY1NzIzODg3ODA1NzYyMDYzNDIwNzI2N0UrMjQ0IEluZXhhY3QgUm91bmRlZAorcmVteDMwNjcgcmVtYWluZGVyIC0zMzc0OTg4NTgxNjA3NTg2MDYxMjU1NTQyMjAxMDQ4IDgyMjkzODk1MTI0LjkwMDQ1MjcxNTA0ODM2NTY4NjgxIC0+IC02NjkxMzk3MDE2OC42MjA0NjI1NzE3NTU2NjM4NDI0Mworc3VieDMwNjcgc3VidHJhY3QgLTMzNzQ5ODg1ODE2MDc1ODYwNjEyNTU1NDIyMDEwNDggODIyOTM4OTUxMjQuOTAwNDUyNzE1MDQ4MzY1Njg2ODEgLT4gLTMzNzQ5ODg1ODE2MDc1ODYwNjEzMzc4MzYwOTYxNzMgSW5leGFjdCBSb3VuZGVkCithZGR4MzA2OCBhZGQgLTg0MTcyNTU4MTYwNjYxLjM1ODYzODMxMDI5MzUyMzIzIC0xMTI3MS41ODkxNjYwMDkzMTE1NTkzNzI5MTkwNDg5MCAtPiAtODQxNzI1NTgxNzE5MzIuOTQ3ODA0MzE5NjA1MDgyNjAgSW5leGFjdCBSb3VuZGVkCitjb214MzA2OCBjb21wYXJlIC04NDE3MjU1ODE2MDY2MS4zNTg2MzgzMTAyOTM1MjMyMyAtMTEyNzEuNTg5MTY2MDA5MzExNTU5MzcyOTE5MDQ4OTAgLT4gLTEKK2RpdngzMDY4IGRpdmlkZSAtODQxNzI1NTgxNjA2NjEuMzU4NjM4MzEwMjkzNTIzMjMgLTExMjcxLjU4OTE2NjAwOTMxMTU1OTM3MjkxOTA0ODkwIC0+IDc0Njc2NzQ0MjYuNDY3OTg2NzM2NDU5Njc4MzQ3NTg3IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNjggZGl2aWRlaW50IC04NDE3MjU1ODE2MDY2MS4zNTg2MzgzMTAyOTM1MjMyMyAtMTEyNzEuNTg5MTY2MDA5MzExNTU5MzcyOTE5MDQ4OTAgLT4gNzQ2NzY3NDQyNgorbXVseDMwNjggbXVsdGlwbHkgLTg0MTcyNTU4MTYwNjYxLjM1ODYzODMxMDI5MzUyMzIzIC0xMTI3MS41ODkxNjYwMDkzMTE1NTkzNzI5MTkwNDg5MCAtPiA5NDg3NTg0OTQ2Mzg5OTkyMzUuMTk1MzAyMjk3MDc1NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDY4IHBvd2VyIC04NDE3MjU1ODE2MDY2MS4zNTg2MzgzMTAyOTM1MjMyMyAtMTEyNzIgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwNjggcmVtYWluZGVyIC04NDE3MjU1ODE2MDY2MS4zNTg2MzgzMTAyOTM1MjMyMyAtMTEyNzEuNTg5MTY2MDA5MzExNTU5MzcyOTE5MDQ4OTAgLT4gLTUyNzQuOTU0MjI4NTE0OTY1MzQ0NzkxMjI2NTY4NjAKK3N1YngzMDY4IHN1YnRyYWN0IC04NDE3MjU1ODE2MDY2MS4zNTg2MzgzMTAyOTM1MjMyMyAtMTEyNzEuNTg5MTY2MDA5MzExNTU5MzcyOTE5MDQ4OTAgLT4gLTg0MTcyNTU4MTQ5Mzg5Ljc2OTQ3MjMwMDk4MTk2Mzg2IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNjkgYWRkIC03MDA0NjkzMjMyNDYxNC45MDU5NjM5NjIzNzUwODU0MUUtNTY4IDMzLjYzMTYzOTY0MDA0NjA4ODY1ODM2NTc3Mjk3Njk4RS05MTggLT4gLTcuMDA0NjkzMjMyNDYxNDkwNTk2Mzk2MjM3NTA4NTQxRS01NTUgSW5leGFjdCBSb3VuZGVkCitjb214MzA2OSBjb21wYXJlIC03MDA0NjkzMjMyNDYxNC45MDU5NjM5NjIzNzUwODU0MUUtNTY4IDMzLjYzMTYzOTY0MDA0NjA4ODY1ODM2NTc3Mjk3Njk4RS05MTggLT4gLTEKK2RpdngzMDY5IGRpdmlkZSAtNzAwNDY5MzIzMjQ2MTQuOTA1OTYzOTYyMzc1MDg1NDFFLTU2OCAzMy42MzE2Mzk2NDAwNDYwODg2NTgzNjU3NzI5NzY5OEUtOTE4IC0+IC0yLjA4Mjc2ODg3Njk5NTQ2MzQ4NzkyNjkyMDA3MjM1OUUrMzYyIEluZXhhY3QgUm91bmRlZAorZHZpeDMwNjkgZGl2aWRlaW50IC03MDA0NjkzMjMyNDYxNC45MDU5NjM5NjIzNzUwODU0MUUtNTY4IDMzLjYzMTYzOTY0MDA0NjA4ODY1ODM2NTc3Mjk3Njk4RS05MTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMDY5IG11bHRpcGx5IC03MDA0NjkzMjMyNDYxNC45MDU5NjM5NjIzNzUwODU0MUUtNTY4IDMzLjYzMTYzOTY0MDA0NjA4ODY1ODM2NTc3Mjk3Njk4RS05MTggLT4gLTIuMzU1NzkzMTg1ODMyMTQ0Mzg4Mjg1OTQ5MDIxNzM4RS0xNDcxIEluZXhhY3QgUm91bmRlZAorcG93eDMwNjkgcG93ZXIgLTcwMDQ2OTMyMzI0NjE0LjkwNTk2Mzk2MjM3NTA4NTQxRS01NjggMyAtPiAtMy40MzY5MDM2NzgzMDI2Mzk2NzcyODA1MDg0MDk4MjlFLTE2NjMgSW5leGFjdCBSb3VuZGVkCityZW14MzA2OSByZW1haW5kZXIgLTcwMDQ2OTMyMzI0NjE0LjkwNTk2Mzk2MjM3NTA4NTQxRS01NjggMzMuNjMxNjM5NjQwMDQ2MDg4NjU4MzY1NzcyOTc2OThFLTkxOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwNjkgc3VidHJhY3QgLTcwMDQ2OTMyMzI0NjE0LjkwNTk2Mzk2MjM3NTA4NTQxRS01NjggMzMuNjMxNjM5NjQwMDQ2MDg4NjU4MzY1NzcyOTc2OThFLTkxOCAtPiAtNy4wMDQ2OTMyMzI0NjE0OTA1OTYzOTYyMzc1MDg1NDFFLTU1NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDcwIGFkZCAwMDA0MTI1Mzg0NDA3LjA1Mzc4MjY2MDExNTY4MDg4NiAtMzkxNDI5MDg0LjU4NDczMjE0MDI1MTQzODU2MDMyMjNFLTY0OCAtPiA0MTI1Mzg0NDA3LjA1Mzc4MjY2MDExNTY4MDg4NjAwMCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDcwIGNvbXBhcmUgMDAwNDEyNTM4NDQwNy4wNTM3ODI2NjAxMTU2ODA4ODYgLTM5MTQyOTA4NC41ODQ3MzIxNDAyNTE0Mzg1NjAzMjIzRS02NDggLT4gMQorZGl2eDMwNzAgZGl2aWRlIDAwMDQxMjUzODQ0MDcuMDUzNzgyNjYwMTE1NjgwODg2IC0zOTE0MjkwODQuNTg0NzMyMTQwMjUxNDM4NTYwMzIyM0UtNjQ4IC0+IC0xLjA1MzkyODk0MTI4NzEzMjcxNzI1MDU0MDk1NTQ1N0UrNjQ5IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNzAgZGl2aWRlaW50IDAwMDQxMjUzODQ0MDcuMDUzNzgyNjYwMTE1NjgwODg2IC0zOTE0MjkwODQuNTg0NzMyMTQwMjUxNDM4NTYwMzIyM0UtNjQ4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA3MCBtdWx0aXBseSAwMDA0MTI1Mzg0NDA3LjA1Mzc4MjY2MDExNTY4MDg4NiAtMzkxNDI5MDg0LjU4NDczMjE0MDI1MTQzODU2MDMyMjNFLTY0OCAtPiAtMS42MTQ3OTU0NDIwMTMxOTAxMzkwODA2MzQ0NDkyNzNFLTYzMCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDcwIHBvd2VyIDAwMDQxMjUzODQ0MDcuMDUzNzgyNjYwMTE1NjgwODg2IC00IC0+IDMuNDUyNTY4NTQxNTk3NDUwMTA2MjY2NTU1NzgzMzYyRS0zOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDcwIHJlbWFpbmRlciAwMDA0MTI1Mzg0NDA3LjA1Mzc4MjY2MDExNTY4MDg4NiAtMzkxNDI5MDg0LjU4NDczMjE0MDI1MTQzODU2MDMyMjNFLTY0OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwNzAgc3VidHJhY3QgMDAwNDEyNTM4NDQwNy4wNTM3ODI2NjAxMTU2ODA4ODYgLTM5MTQyOTA4NC41ODQ3MzIxNDAyNTE0Mzg1NjAzMjIzRS02NDggLT4gNDEyNTM4NDQwNy4wNTM3ODI2NjAxMTU2ODA4ODYwMDAgSW5leGFjdCBSb3VuZGVkCithZGR4MzA3MSBhZGQgLTMxODIzMTMxLjE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00NDAgOTI5MTMuOTE1ODI5NDcyMzcyMDAyODY0MjcwMzAwMjhFKzc3MSAtPiA5LjI5MTM5MTU4Mjk0NzIzNzIwMDI4NjQyNzAzMDAyOEUrNzc1IEluZXhhY3QgUm91bmRlZAorY29teDMwNzEgY29tcGFyZSAtMzE4MjMxMzEuMTU2OTE1ODMzOTM4MjA2Mjg0ODA5OTdFLTQ0MCA5MjkxMy45MTU4Mjk0NzIzNzIwMDI4NjQyNzAzMDAyOEUrNzcxIC0+IC0xCitkaXZ4MzA3MSBkaXZpZGUgLTMxODIzMTMxLjE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00NDAgOTI5MTMuOTE1ODI5NDcyMzcyMDAyODY0MjcwMzAwMjhFKzc3MSAtPiAtMy40MjUwMTIzNzU0NjgyNTE0NDcxOTQ0MDA4NDE2NThFLTEyMDkgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3MSBkaXZpZGVpbnQgLTMxODIzMTMxLjE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00NDAgOTI5MTMuOTE1ODI5NDcyMzcyMDAyODY0MjcwMzAwMjhFKzc3MSAtPiAtMAorbXVseDMwNzEgbXVsdGlwbHkgLTMxODIzMTMxLjE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00NDAgOTI5MTMuOTE1ODI5NDcyMzcyMDAyODY0MjcwMzAwMjhFKzc3MSAtPiAtMi45NTY4MTE3Mjk3NDM5Mzc1NDE5NzM4NDUwMjk4MTZFKzM0MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDcxIHBvd2VyIC0zMTgyMzEzMS4xNTY5MTU4MzM5MzgyMDYyODQ4MDk5N0UtNDQwIDkgLT4gLTMuMzQ3MjM0ODAzNDg3NTc1ODcwMzIxMzM4MzA4NjU1RS0zODkzIEluZXhhY3QgUm91bmRlZAorcmVteDMwNzEgcmVtYWluZGVyIC0zMTgyMzEzMS4xNTY5MTU4MzM5MzgyMDYyODQ4MDk5N0UtNDQwIDkyOTEzLjkxNTgyOTQ3MjM3MjAwMjg2NDI3MDMwMDI4RSs3NzEgLT4gLTMuMTgyMzEzMTE1NjkxNTgzMzkzODIwNjI4NDgwOTk3RS00MzMKK3N1YngzMDcxIHN1YnRyYWN0IC0zMTgyMzEzMS4xNTY5MTU4MzM5MzgyMDYyODQ4MDk5N0UtNDQwIDkyOTEzLjkxNTgyOTQ3MjM3MjAwMjg2NDI3MDMwMDI4RSs3NzEgLT4gLTkuMjkxMzkxNTgyOTQ3MjM3MjAwMjg2NDI3MDMwMDI4RSs3NzUgSW5leGFjdCBSb3VuZGVkCithZGR4MzA3MiBhZGQgNTU1NzM4Njc4ODguOTE1NzUzMzA1NjM2OTgxMjgxNTAgNTk5LjUyMzE2MTQ3MzYyMzIxODgzNTQzOTMyMTIyMzQgLT4gNTU1NzM4Njg0ODguNDM4OTE0Nzc5MjYwMjAwMTE2OTQgSW5leGFjdCBSb3VuZGVkCitjb214MzA3MiBjb21wYXJlIDU1NTczODY3ODg4LjkxNTc1MzMwNTYzNjk4MTI4MTUwIDU5OS41MjMxNjE0NzM2MjMyMTg4MzU0MzkzMjEyMjM0IC0+IDEKK2RpdngzMDcyIGRpdmlkZSA1NTU3Mzg2Nzg4OC45MTU3NTMzMDU2MzY5ODEyODE1MCA1OTkuNTIzMTYxNDczNjIzMjE4ODM1NDM5MzIxMjIzNCAtPiA5MjY5Njc4Mi4xNDMxODc5Njc2MzA5ODMzNTQ5ODY1NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDcyIGRpdmlkZWludCA1NTU3Mzg2Nzg4OC45MTU3NTMzMDU2MzY5ODEyODE1MCA1OTkuNTIzMTYxNDczNjIzMjE4ODM1NDM5MzIxMjIzNCAtPiA5MjY5Njc4MgorbXVseDMwNzIgbXVsdGlwbHkgNTU1NzM4Njc4ODguOTE1NzUzMzA1NjM2OTgxMjgxNTAgNTk5LjUyMzE2MTQ3MzYyMzIxODgzNTQzOTMyMTIyMzQgLT4gMzMzMTc4MjA5NzIwODAuMjQzNDc3MTc1NDIyMjE0NzcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA3MiBwb3dlciA1NTU3Mzg2Nzg4OC45MTU3NTMzMDU2MzY5ODEyODE1MCA2MDAgLT4gOC4zNjMyNDA2NzEwNzAxMzYyNzgyMjE5NjU2MTY5NzNFKzY0NDYgSW5leGFjdCBSb3VuZGVkCityZW14MzA3MiByZW1haW5kZXIgNTU1NzM4Njc4ODguOTE1NzUzMzA1NjM2OTgxMjgxNTAgNTk5LjUyMzE2MTQ3MzYyMzIxODgzNTQzOTMyMTIyMzQgLT4gODUuODQ0NTAzMDM5MTA5OTY4NjQ3ODI2NTE2OTAxMgorc3VieDMwNzIgc3VidHJhY3QgNTU1NzM4Njc4ODguOTE1NzUzMzA1NjM2OTgxMjgxNTAgNTk5LjUyMzE2MTQ3MzYyMzIxODgzNTQzOTMyMTIyMzQgLT4gNTU1NzM4NjcyODkuMzkyNTkxODMyMDEzNzYyNDQ2MDYgSW5leGFjdCBSb3VuZGVkCithZGR4MzA3MyBhZGQgLTU0NDc3Mjc0NDg0MzE2ODA4Nzg2OTk1NTU3MTQ3OTZFLTgwMCA1NDg3MjA3LjE0MjY4NzAwMTYwNzAyNjY2NTUxNTM0OUUtMzYyIC0+IDUuNDg3MjA3MTQyNjg3MDAxNjA3MDI2NjY1NTE1MzQ5RS0zNTYgSW5leGFjdCBSb3VuZGVkCitjb214MzA3MyBjb21wYXJlIC01NDQ3NzI3NDQ4NDMxNjgwODc4Njk5NTU1NzE0Nzk2RS04MDAgNTQ4NzIwNy4xNDI2ODcwMDE2MDcwMjY2NjU1MTUzNDlFLTM2MiAtPiAtMQorZGl2eDMwNzMgZGl2aWRlIC01NDQ3NzI3NDQ4NDMxNjgwODc4Njk5NTU1NzE0Nzk2RS04MDAgNTQ4NzIwNy4xNDI2ODcwMDE2MDcwMjY2NjU1MTUzNDlFLTM2MiAtPiAtOS45MjgwNTEzODcxMTA1ODczMjc4ODkwMDkzNjMwNjlFLTQxNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDczIGRpdmlkZWludCAtNTQ0NzcyNzQ0ODQzMTY4MDg3ODY5OTU1NTcxNDc5NkUtODAwIDU0ODcyMDcuMTQyNjg3MDAxNjA3MDI2NjY1NTE1MzQ5RS0zNjIgLT4gLTAKK211bHgzMDczIG11bHRpcGx5IC01NDQ3NzI3NDQ4NDMxNjgwODc4Njk5NTU1NzE0Nzk2RS04MDAgNTQ4NzIwNy4xNDI2ODcwMDE2MDcwMjY2NjU1MTUzNDlFLTM2MiAtPiAtMi45ODkyODA4OTY2NDQ2MzUzNTI4MzgwODc4NjQzNzNFLTExMjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA3MyBwb3dlciAtNTQ0NzcyNzQ0ODQzMTY4MDg3ODY5OTU1NTcxNDc5NkUtODAwIDUgLT4gLTQuNzk4MTgzNTUzMjc4NTQzMDY1MjA0ODMzMzAwNzI1RS0zODQ3IEluZXhhY3QgUm91bmRlZAorcmVteDMwNzMgcmVtYWluZGVyIC01NDQ3NzI3NDQ4NDMxNjgwODc4Njk5NTU1NzE0Nzk2RS04MDAgNTQ4NzIwNy4xNDI2ODcwMDE2MDcwMjY2NjU1MTUzNDlFLTM2MiAtPiAtNS40NDc3Mjc0NDg0MzE2ODA4Nzg2OTk1NTU3MTQ3OTZFLTc3MAorc3VieDMwNzMgc3VidHJhY3QgLTU0NDc3Mjc0NDg0MzE2ODA4Nzg2OTk1NTU3MTQ3OTZFLTgwMCA1NDg3MjA3LjE0MjY4NzAwMTYwNzAyNjY2NTUxNTM0OUUtMzYyIC0+IC01LjQ4NzIwNzE0MjY4NzAwMTYwNzAyNjY2NTUxNTM0OUUtMzU2IEluZXhhY3QgUm91bmRlZAorYWRkeDMwNzQgYWRkIDA0MTgzNDk0MDQ4MzQuNTQ3MTEwMjM5NTQyMjkwMTM0IDA5ODE5OTE1LjkyNDA1Mjg4MDY2NjA2MTI0NTU0ODQxIC0+IDQxODM1OTIyNDc1MC40NzExNjMxMjAyMDgzNTEzNzk1IEluZXhhY3QgUm91bmRlZAorY29teDMwNzQgY29tcGFyZSAwNDE4MzQ5NDA0ODM0LjU0NzExMDIzOTU0MjI5MDEzNCAwOTgxOTkxNS45MjQwNTI4ODA2NjYwNjEyNDU1NDg0MSAtPiAxCitkaXZ4MzA3NCBkaXZpZGUgMDQxODM0OTQwNDgzNC41NDcxMTAyMzk1NDIyOTAxMzQgMDk4MTk5MTUuOTI0MDUyODgwNjY2MDYxMjQ1NTQ4NDEgLT4gNDI2MDIuMTM3MTMzMzU4MDM1MTM4NzQzMzkzMDkxMzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3NCBkaXZpZGVpbnQgMDQxODM0OTQwNDgzNC41NDcxMTAyMzk1NDIyOTAxMzQgMDk4MTk5MTUuOTI0MDUyODgwNjY2MDYxMjQ1NTQ4NDEgLT4gNDI2MDIKK211bHgzMDc0IG11bHRpcGx5IDA0MTgzNDk0MDQ4MzQuNTQ3MTEwMjM5NTQyMjkwMTM0IDA5ODE5OTE1LjkyNDA1Mjg4MDY2NjA2MTI0NTU0ODQxIC0+IDQxMDgxNTU5ODIzNTI4MTQzNDguMzQzNDQxMjk5MDgyIEluZXhhY3QgUm91bmRlZAorcG93eDMwNzQgcG93ZXIgMDQxODM0OTQwNDgzNC41NDcxMTAyMzk1NDIyOTAxMzQgOTgxOTkxNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDc0IHJlbWFpbmRlciAwNDE4MzQ5NDA0ODM0LjU0NzExMDIzOTU0MjI5MDEzNCAwOTgxOTkxNS45MjQwNTI4ODA2NjYwNjEyNDU1NDg0MSAtPiAxMzQ2NjM4LjA0NjI4ODEwNDAwMTEwNzI4MDYzNzE4CitzdWJ4MzA3NCBzdWJ0cmFjdCAwNDE4MzQ5NDA0ODM0LjU0NzExMDIzOTU0MjI5MDEzNCAwOTgxOTkxNS45MjQwNTI4ODA2NjYwNjEyNDU1NDg0MSAtPiA0MTgzMzk1ODQ5MTguNjIzMDU3MzU4ODc2MjI4ODg4NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDc1IGFkZCAtMjYyMDIxLjc1NjUxOTQ3MzczOTY0NDgwMTQyODY0MzYgLTc5ODM5OTI2MDAwOTQ4MzYzMDQzODczMjQxNjIwNDJFKzM5MCAtPiAtNy45ODM5OTI2MDAwOTQ4MzYzMDQzODczMjQxNjIwNDJFKzQyMCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDc1IGNvbXBhcmUgLTI2MjAyMS43NTY1MTk0NzM3Mzk2NDQ4MDE0Mjg2NDM2IC03OTgzOTkyNjAwMDk0ODM2MzA0Mzg3MzI0MTYyMDQyRSszOTAgLT4gMQorZGl2eDMwNzUgZGl2aWRlIC0yNjIwMjEuNzU2NTE5NDczNzM5NjQ0ODAxNDI4NjQzNiAtNzk4Mzk5MjYwMDA5NDgzNjMwNDM4NzMyNDE2MjA0MkUrMzkwIC0+IDMuMjgxODM4NjY5NDk0Mjc0ODk2MTgwMzc2MzI4NDMzRS00MTYgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3NSBkaXZpZGVpbnQgLTI2MjAyMS43NTY1MTk0NzM3Mzk2NDQ4MDE0Mjg2NDM2IC03OTgzOTkyNjAwMDk0ODM2MzA0Mzg3MzI0MTYyMDQyRSszOTAgLT4gMAorbXVseDMwNzUgbXVsdGlwbHkgLTI2MjAyMS43NTY1MTk0NzM3Mzk2NDQ4MDE0Mjg2NDM2IC03OTgzOTkyNjAwMDk0ODM2MzA0Mzg3MzI0MTYyMDQyRSszOTAgLT4gMi4wOTE5Nzk3NjUxMTUzMjkyNjgyNzU4MDMzODU1MzRFKzQyNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDc1IHBvd2VyIC0yNjIwMjEuNzU2NTE5NDczNzM5NjQ0ODAxNDI4NjQzNiAtOCAtPiA0LjUwMDkxODcyMTAzMzAzMzAzMjcwNjc4MjMwNDE5NUUtNDQgSW5leGFjdCBSb3VuZGVkCityZW14MzA3NSByZW1haW5kZXIgLTI2MjAyMS43NTY1MTk0NzM3Mzk2NDQ4MDE0Mjg2NDM2IC03OTgzOTkyNjAwMDk0ODM2MzA0Mzg3MzI0MTYyMDQyRSszOTAgLT4gLTI2MjAyMS43NTY1MTk0NzM3Mzk2NDQ4MDE0Mjg2NDM2CitzdWJ4MzA3NSBzdWJ0cmFjdCAtMjYyMDIxLjc1NjUxOTQ3MzczOTY0NDgwMTQyODY0MzYgLTc5ODM5OTI2MDAwOTQ4MzYzMDQzODczMjQxNjIwNDJFKzM5MCAtPiA3Ljk4Mzk5MjYwMDA5NDgzNjMwNDM4NzMyNDE2MjA0MkUrNDIwIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNzYgYWRkIDQ4Njk2MDUwNjMxLjQyNTY1MzgwMzAxMjA0NTkyMzkyRS01MDUgLTMzODY4NzUyMzM5Ljg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MjEgLT4gLTMuMzg2ODc1MjMzOTg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MzEgSW5leGFjdCBSb3VuZGVkCitjb214MzA3NiBjb21wYXJlIDQ4Njk2MDUwNjMxLjQyNTY1MzgwMzAxMjA0NTkyMzkyRS01MDUgLTMzODY4NzUyMzM5Ljg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MjEgLT4gMQorZGl2eDMwNzYgZGl2aWRlIDQ4Njk2MDUwNjMxLjQyNTY1MzgwMzAxMjA0NTkyMzkyRS01MDUgLTMzODY4NzUyMzM5Ljg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MjEgLT4gLTEuNDM3Nzg2OTY0ODkyOTc2NTgyMDA5OTUyMTcyNDIwRS0xMzI2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwNzYgZGl2aWRlaW50IDQ4Njk2MDUwNjMxLjQyNTY1MzgwMzAxMjA0NTkyMzkyRS01MDUgLTMzODY4NzUyMzM5Ljg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MjEgLT4gLTAKK211bHgzMDc2IG11bHRpcGx5IDQ4Njk2MDUwNjMxLjQyNTY1MzgwMzAxMjA0NTkyMzkyRS01MDUgLTMzODY4NzUyMzM5Ljg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MjEgLT4gLTEuNjQ5Mjc0NDc4NzY0NTc5NTY5MjQ2NDI1NjExNjI5RSszMzcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA3NiBwb3dlciA0ODY5NjA1MDYzMS40MjU2NTM4MDMwMTIwNDU5MjM5MkUtNTA1IC0zIC0+IDguNjYwMDE3Njg4NzczNzU5NDYzMDIwMzQwNzc4ODUzRSsxNDgyIEluZXhhY3QgUm91bmRlZAorcmVteDMwNzYgcmVtYWluZGVyIDQ4Njk2MDUwNjMxLjQyNTY1MzgwMzAxMjA0NTkyMzkyRS01MDUgLTMzODY4NzUyMzM5Ljg1MDU3MjY3NjA5OTY3ODA2MTg3RSs4MjEgLT4gNC44Njk2MDUwNjMxNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTQ5NQorc3VieDMwNzYgc3VidHJhY3QgNDg2OTYwNTA2MzEuNDI1NjUzODAzMDEyMDQ1OTIzOTJFLTUwNSAtMzM4Njg3NTIzMzkuODUwNTcyNjc2MDk5Njc4MDYxODdFKzgyMSAtPiAzLjM4Njg3NTIzMzk4NTA1NzI2NzYwOTk2NzgwNjE4N0UrODMxIEluZXhhY3QgUm91bmRlZAorYWRkeDMwNzcgYWRkIDk1MzE2OTk5LjE5NDQwMTQ0MzU2NDcxMTI2NjgwNzA4IC02MDc5MS4zMzgwNTA1NzQwMjg0NTg4NTk3ODM5MDQzNSAtPiA5NTI1NjIwNy44NTYzNTA4Njk1MzYyNTI0MDcwMjMxOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDc3IGNvbXBhcmUgOTUzMTY5OTkuMTk0NDAxNDQzNTY0NzExMjY2ODA3MDggLTYwNzkxLjMzODA1MDU3NDAyODQ1ODg1OTc4MzkwNDM1IC0+IDEKK2RpdngzMDc3IGRpdmlkZSA5NTMxNjk5OS4xOTQ0MDE0NDM1NjQ3MTEyNjY4MDcwOCAtNjA3OTEuMzM4MDUwNTc0MDI4NDU4ODU5NzgzOTA0MzUgLT4gLTE1NjcuOTM3MTgwNzA2NjQxODU2ODcwMjg2MTIyNjIzIEluZXhhY3QgUm91bmRlZAorZHZpeDMwNzcgZGl2aWRlaW50IDk1MzE2OTk5LjE5NDQwMTQ0MzU2NDcxMTI2NjgwNzA4IC02MDc5MS4zMzgwNTA1NzQwMjg0NTg4NTk3ODM5MDQzNSAtPiAtMTU2NworbXVseDMwNzcgbXVsdGlwbHkgOTUzMTY5OTkuMTk0NDAxNDQzNTY0NzExMjY2ODA3MDggLTYwNzkxLjMzODA1MDU3NDAyODQ1ODg1OTc4MzkwNDM1IC0+IC01Nzk0NDQ3OTE5OTkzLjE1MDQ5MzMwMTA2MTE5NTcxNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDc3IHBvd2VyIDk1MzE2OTk5LjE5NDQwMTQ0MzU2NDcxMTI2NjgwNzA4IC02MDc5MSAtPiAwRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzA3NyByZW1haW5kZXIgOTUzMTY5OTkuMTk0NDAxNDQzNTY0NzExMjY2ODA3MDggLTYwNzkxLjMzODA1MDU3NDAyODQ1ODg1OTc4MzkwNDM1IC0+IDU2OTcyLjQ2OTE1MTk0MDk2OTY3Nzk4NTQyODk2MzU1CitzdWJ4MzA3NyBzdWJ0cmFjdCA5NTMxNjk5OS4xOTQ0MDE0NDM1NjQ3MTEyNjY4MDcwOCAtNjA3OTEuMzM4MDUwNTc0MDI4NDU4ODU5NzgzOTA0MzUgLT4gOTUzNzc3OTAuNTMyNDUyMDE3NTkzMTcwMTI2NTkwOTggSW5leGFjdCBSb3VuZGVkCithZGR4MzA3OCBhZGQgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCAtPiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDc4IGNvbXBhcmUgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCAtPiAtMQorZGl2eDMwNzggZGl2aWRlIC01MzI2NzAyMjk2NDAyNzA4MjM0NzIyMjE1MjI0OTc5RS0xMzYgODAzMjQ1OS40NTA5OTg4MjAyMDU5MTY1Mzg1NDMyNTggLT4gLTYuNjMxNDcxMTMxNDczMTE3NDg3ODM5MjQzNTgyODczRS0xMTMgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3OCBkaXZpZGVpbnQgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCAtPiAtMAorbXVseDMwNzggbXVsdGlwbHkgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCAtPiAtNC4yNzg2NTIwMjAzMzk3MDUyNjUwMTM2MzI3NTczNDlFLTk5IEluZXhhY3QgUm91bmRlZAorcG93eDMwNzggcG93ZXIgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5IC0+IC0wRS0xMDAyOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzA3OCByZW1haW5kZXIgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCAtPiAtNS4zMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEwNgorc3VieDMwNzggc3VidHJhY3QgLTUzMjY3MDIyOTY0MDI3MDgyMzQ3MjIyMTUyMjQ5NzlFLTEzNiA4MDMyNDU5LjQ1MDk5ODgyMDIwNTkxNjUzODU0MzI1OCAtPiAtODAzMjQ1OS40NTA5OTg4MjAyMDU5MTY1Mzg1NDMyNTggSW5leGFjdCBSb3VuZGVkCithZGR4MzA3OSBhZGQgNjcuMTg3NTA2ODQwNzk1MDE1NzUzMzU0ODI2MTU3ODBFLTI4MSA3MzQuMTE2ODg0MTY4MzQzODQxMDMxNDg0MzAxMTU0MUUtODU0IC0+IDYuNzE4NzUwNjg0MDc5NTAxNTc1MzM1NDgyNjE1NzgwRS0yODAgSW5leGFjdCBSb3VuZGVkCitjb214MzA3OSBjb21wYXJlIDY3LjE4NzUwNjg0MDc5NTAxNTc1MzM1NDgyNjE1NzgwRS0yODEgNzM0LjExNjg4NDE2ODM0Mzg0MTAzMTQ4NDMwMTE1NDFFLTg1NCAtPiAxCitkaXZ4MzA3OSBkaXZpZGUgNjcuMTg3NTA2ODQwNzk1MDE1NzUzMzU0ODI2MTU3ODBFLTI4MSA3MzQuMTE2ODg0MTY4MzQzODQxMDMxNDg0MzAxMTU0MUUtODU0IC0+IDkuMTUyMTUzODcyMTg3NDYwNTk4OTU4NjE2NTkyNDQyRSs1NzEgSW5leGFjdCBSb3VuZGVkCitkdml4MzA3OSBkaXZpZGVpbnQgNjcuMTg3NTA2ODQwNzk1MDE1NzUzMzU0ODI2MTU3ODBFLTI4MSA3MzQuMTE2ODg0MTY4MzQzODQxMDMxNDg0MzAxMTU0MUUtODU0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA3OSBtdWx0aXBseSA2Ny4xODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgxIDczNC4xMTY4ODQxNjgzNDM4NDEwMzE0ODQzMDExNTQxRS04NTQgLT4gNC45MzIzNDgzMTc3MDAzNzI0MDE4NDkyMzE3NjcwMDdFLTExMzEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA3OSBwb3dlciA2Ny4xODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgxIDcgLT4gNi4xODA0NDQwNzEwMjMxMTEzMDA4MTc1MTg0MDk1NTBFLTE5NTUgSW5leGFjdCBSb3VuZGVkCityZW14MzA3OSByZW1haW5kZXIgNjcuMTg3NTA2ODQwNzk1MDE1NzUzMzU0ODI2MTU3ODBFLTI4MSA3MzQuMTE2ODg0MTY4MzQzODQxMDMxNDg0MzAxMTU0MUUtODU0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzA3OSBzdWJ0cmFjdCA2Ny4xODc1MDY4NDA3OTUwMTU3NTMzNTQ4MjYxNTc4MEUtMjgxIDczNC4xMTY4ODQxNjgzNDM4NDEwMzE0ODQzMDExNTQxRS04NTQgLT4gNi43MTg3NTA2ODQwNzk1MDE1NzUzMzU0ODI2MTU3ODBFLTI4MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDgwIGFkZCAtODczOTI5OTM3MjExNC4wOTI0ODI5MTQxMzkyODE2NjkgNTA3NjEwMDc0LjczNDM1NzcwMjkzNDUwNzczODU4MzggLT4gLTg3Mzg3OTE3NjIwMzkuMzU4MTI1MjExMjA0NzczOTMwIEluZXhhY3QgUm91bmRlZAorY29teDMwODAgY29tcGFyZSAtODczOTI5OTM3MjExNC4wOTI0ODI5MTQxMzkyODE2NjkgNTA3NjEwMDc0LjczNDM1NzcwMjkzNDUwNzczODU4MzggLT4gLTEKK2RpdngzMDgwIGRpdmlkZSAtODczOTI5OTM3MjExNC4wOTI0ODI5MTQxMzkyODE2NjkgNTA3NjEwMDc0LjczNDM1NzcwMjkzNDUwNzczODU4MzggLT4gLTE3MjE2LjU2MDEyNTc3NjczNzMxNjEyMTMwMDY4MTMwIEluZXhhY3QgUm91bmRlZAorZHZpeDMwODAgZGl2aWRlaW50IC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzQuNzM0MzU3NzAyOTM0NTA3NzM4NTgzOCAtPiAtMTcyMTYKK211bHgzMDgwIG11bHRpcGx5IC04NzM5Mjk5MzcyMTE0LjA5MjQ4MjkxNDEzOTI4MTY2OSA1MDc2MTAwNzQuNzM0MzU3NzAyOTM0NTA3NzM4NTgzOCAtPiAtNDQzNjE1NjQwNzQwNDc1OTgzMzg1Ny41ODA3MDcwMjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA4MCBwb3dlciAtODczOTI5OTM3MjExNC4wOTI0ODI5MTQxMzkyODE2NjkgNTA3NjEwMDc1IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDgwIHJlbWFpbmRlciAtODczOTI5OTM3MjExNC4wOTI0ODI5MTQxMzkyODE2NjkgNTA3NjEwMDc0LjczNDM1NzcwMjkzNDUwNzczODU4MzggLT4gLTI4NDMyNTQ4Ny4zOTAyNjkxOTM2NTQwNTQyMTAyOTkyCitzdWJ4MzA4MCBzdWJ0cmFjdCAtODczOTI5OTM3MjExNC4wOTI0ODI5MTQxMzkyODE2NjkgNTA3NjEwMDc0LjczNDM1NzcwMjkzNDUwNzczODU4MzggLT4gLTg3Mzk4MDY5ODIxODguODI2ODQwNjE3MDczNzg5NDA4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwODEgYWRkIDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDU4MzU0NjAzOS42MjMzODQyODY5MTE5OTUwOTgyMDA5RS0xNDcgLT4gMjQ1NC4wMDIwNzg0Njg5Mjg2NjUwMDgyMTc3Mjc3MzEgSW5leGFjdCBSb3VuZGVkCitjb214MzA4MSBjb21wYXJlIDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDU4MzU0NjAzOS42MjMzODQyODY5MTE5OTUwOTgyMDA5RS0xNDcgLT4gMQorZGl2eDMwODEgZGl2aWRlIDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDU4MzU0NjAzOS42MjMzODQyODY5MTE5OTUwOTgyMDA5RS0xNDcgLT4gNC4yMDUzMjcyNzgxMjMxMTI2MTEwMDY2NTI1MzM2MThFKzE0MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDgxIGRpdmlkZWludCAyNDU0LjAwMjA3ODQ2ODkyODY2NTAwODIxNzcyNzczMSA1ODM1NDYwMzkuNjIzMzg0Mjg2OTExOTk1MDk4MjAwOUUtMTQ3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA4MSBtdWx0aXBseSAyNDU0LjAwMjA3ODQ2ODkyODY2NTAwODIxNzcyNzczMSA1ODM1NDYwMzkuNjIzMzg0Mjg2OTExOTk1MDk4MjAwOUUtMTQ3IC0+IDEuNDMyMDIzMTk0MTE4MDk2ODQyODA2MDEwMjkzMDI3RS0xMzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA4MSBwb3dlciAyNDU0LjAwMjA3ODQ2ODkyODY2NTAwODIxNzcyNzczMSA2IC0+IDIxODM5ODQ1Mjc5MjI5Mzg1Mzc4Ni45MjYzMDU0NDIwIEluZXhhY3QgUm91bmRlZAorcmVteDMwODEgcmVtYWluZGVyIDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDU4MzU0NjAzOS42MjMzODQyODY5MTE5OTUwOTgyMDA5RS0xNDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDgxIHN1YnRyYWN0IDI0NTQuMDAyMDc4NDY4OTI4NjY1MDA4MjE3NzI3NzMxIDU4MzU0NjAzOS42MjMzODQyODY5MTE5OTUwOTgyMDA5RS0xNDcgLT4gMjQ1NC4wMDIwNzg0Njg5Mjg2NjUwMDgyMTc3Mjc3MzEgSW5leGFjdCBSb3VuZGVkCithZGR4MzA4MiBhZGQgNzY0NTc4LjUyMDQ4NDk5MzY5MTIwNjYwMzMxNzc0MjkgNjQ2MDMuMTM1NzEyNTkxNjQ4MTI2MDk0MzY4MzI1MDYgLT4gODI5MTgxLjY1NjE5NzU4NTMzOTMzMjY5NzY4NjA2ODAgSW5leGFjdCBSb3VuZGVkCitjb214MzA4MiBjb21wYXJlIDc2NDU3OC41MjA0ODQ5OTM2OTEyMDY2MDMzMTc3NDI5IDY0NjAzLjEzNTcxMjU5MTY0ODEyNjA5NDM2ODMyNTA2IC0+IDEKK2RpdngzMDgyIGRpdmlkZSA3NjQ1NzguNTIwNDg0OTkzNjkxMjA2NjAzMzE3NzQyOSA2NDYwMy4xMzU3MTI1OTE2NDgxMjYwOTQzNjgzMjUwNiAtPiAxMS44MzUwMDYzMzYwMTU1MzU3ODg1MTEyNDI4MTQxNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDgyIGRpdmlkZWludCA3NjQ1NzguNTIwNDg0OTkzNjkxMjA2NjAzMzE3NzQyOSA2NDYwMy4xMzU3MTI1OTE2NDgxMjYwOTQzNjgzMjUwNiAtPiAxMQorbXVseDMwODIgbXVsdGlwbHkgNzY0NTc4LjUyMDQ4NDk5MzY5MTIwNjYwMzMxNzc0MjkgNjQ2MDMuMTM1NzEyNTkxNjQ4MTI2MDk0MzY4MzI1MDYgLT4gNDkzOTQxNjk5MjEuODI0NTgwOTQxMzgwOTY2Mjg5NTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA4MiBwb3dlciA3NjQ1NzguNTIwNDg0OTkzNjkxMjA2NjAzMzE3NzQyOSA2NDYwMyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDgyIHJlbWFpbmRlciA3NjQ1NzguNTIwNDg0OTkzNjkxMjA2NjAzMzE3NzQyOSA2NDYwMy4xMzU3MTI1OTE2NDgxMjYwOTQzNjgzMjUwNiAtPiA1Mzk0NC4wMjc2NDY0ODU1NjE4MTk1NjUyNjYxNjcyNAorc3VieDMwODIgc3VidHJhY3QgNzY0NTc4LjUyMDQ4NDk5MzY5MTIwNjYwMzMxNzc0MjkgNjQ2MDMuMTM1NzEyNTkxNjQ4MTI2MDk0MzY4MzI1MDYgLT4gNjk5OTc1LjM4NDc3MjQwMjA0MzA4MDUwODk0OTQxNzggSW5leGFjdCBSb3VuZGVkCithZGR4MzA4MyBhZGQgMDc5MjAzLjczMzAxMDM3Nzc3MTY5MDM1MTgzNjc1NjAgODQ2Mzg4OTM0MzQ3LjYzMjQwMzYxMzI5NTk2NjQ3MDUgLT4gODQ2Mzg5MDEzNTUxLjM2NTQxMzk5MTA2NzY1NjgyMjMgSW5leGFjdCBSb3VuZGVkCitjb214MzA4MyBjb21wYXJlIDA3OTIwMy43MzMwMTAzNzc3NzE2OTAzNTE4MzY3NTYwIDg0NjM4ODkzNDM0Ny42MzI0MDM2MTMyOTU5NjY0NzA1IC0+IC0xCitkaXZ4MzA4MyBkaXZpZGUgMDc5MjAzLjczMzAxMDM3Nzc3MTY5MDM1MTgzNjc1NjAgODQ2Mzg4OTM0MzQ3LjYzMjQwMzYxMzI5NTk2NjQ3MDUgLT4gOS4zNTc4NDEyNzA4NjAzMzk4NTgxNDY0NzE4NzYwNDRFLTggSW5leGFjdCBSb3VuZGVkCitkdml4MzA4MyBkaXZpZGVpbnQgMDc5MjAzLjczMzAxMDM3Nzc3MTY5MDM1MTgzNjc1NjAgODQ2Mzg4OTM0MzQ3LjYzMjQwMzYxMzI5NTk2NjQ3MDUgLT4gMAorbXVseDMwODMgbXVsdGlwbHkgMDc5MjAzLjczMzAxMDM3Nzc3MTY5MDM1MTgzNjc1NjAgODQ2Mzg4OTM0MzQ3LjYzMjQwMzYxMzI5NTk2NjQ3MDUgLT4gNjcwMzcxNjMxNzkwMDgwMzcuMTk5ODM1NjQ3ODkyMDMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA4MyBwb3dlciAwNzkyMDMuNzMzMDEwMzc3NzcxNjkwMzUxODM2NzU2MCA4IC0+IDEuNTQ4NjkyNTQ5NTAzMzU2Nzg4MTE1NjgyOTk2NzU2RSszOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDgzIHJlbWFpbmRlciAwNzkyMDMuNzMzMDEwMzc3NzcxNjkwMzUxODM2NzU2MCA4NDYzODg5MzQzNDcuNjMyNDAzNjEzMjk1OTY2NDcwNSAtPiA3OTIwMy43MzMwMTAzNzc3NzE2OTAzNTE4MzY3NTYwCitzdWJ4MzA4MyBzdWJ0cmFjdCAwNzkyMDMuNzMzMDEwMzc3NzcxNjkwMzUxODM2NzU2MCA4NDYzODg5MzQzNDcuNjMyNDAzNjEzMjk1OTY2NDcwNSAtPiAtODQ2Mzg4ODU1MTQzLjg5OTM5MzIzNTUyNDI3NjExODcgSW5leGFjdCBSb3VuZGVkCithZGR4MzA4NCBhZGQgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgLT4gNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgSW5leGFjdCBSb3VuZGVkCitjb214MzA4NCBjb21wYXJlIC00Mjc4LjU4MTUxNDY4ODY2OTI0OTI0NzAwNzEyNzg5OUUtMzI5IDUuNDc0OTczOTkyOTUzOTAyNjMxODkwMjA4MzYwODI5IC0+IC0xCitkaXZ4MzA4NCBkaXZpZGUgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgLT4gLTcuODE0Nzk3ODc4ODQ4NDY5MjgyMDMzODk2OTY5NTMyRS0zMjcgSW5leGFjdCBSb3VuZGVkCitkdml4MzA4NCBkaXZpZGVpbnQgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgLT4gLTAKK211bHgzMDg0IG11bHRpcGx5IC00Mjc4LjU4MTUxNDY4ODY2OTI0OTI0NzAwNzEyNzg5OUUtMzI5IDUuNDc0OTczOTkyOTUzOTAyNjMxODkwMjA4MzYwODI5IC0+IC0yLjM0MjUxMjI1MTk2NTM3ODAyODQzMzU4NDUzODg3MEUtMzI1IEluZXhhY3QgUm91bmRlZAorcG93eDMwODQgcG93ZXIgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNSAtPiAtMS40MzM4MzQ1ODc4MDE3NzEyNDQxMDQ2NzY2ODI5ODZFLTE2MjcgSW5leGFjdCBSb3VuZGVkCityZW14MzA4NCByZW1haW5kZXIgLTQyNzguNTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjkgNS40NzQ5NzM5OTI5NTM5MDI2MzE4OTAyMDgzNjA4MjkgLT4gLTQuMjc4NTgxNTE0Njg4NjY5MjQ5MjQ3MDA3MTI3ODk5RS0zMjYKK3N1YngzMDg0IHN1YnRyYWN0IC00Mjc4LjU4MTUxNDY4ODY2OTI0OTI0NzAwNzEyNzg5OUUtMzI5IDUuNDc0OTczOTkyOTUzOTAyNjMxODkwMjA4MzYwODI5IC0+IC01LjQ3NDk3Mzk5Mjk1MzkwMjYzMTg5MDIwODM2MDgyOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDg1IGFkZCA2MDg2NzAxOS44MTc2NDc5ODg0NTQ2ODQ0NTE5Njg2OUUrNjUxIDYuMTQ5NjEyNTY1NDA0MDgwNTAxMTU3MDkzODUxODk1RSs4MTcgLT4gNi4xNDk2MTI1NjU0MDQwODA1MDExNTcwOTM4NTE4OTVFKzgxNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDg1IGNvbXBhcmUgNjA4NjcwMTkuODE3NjQ3OTg4NDU0Njg0NDUxOTY4NjlFKzY1MSA2LjE0OTYxMjU2NTQwNDA4MDUwMTE1NzA5Mzg1MTg5NUUrODE3IC0+IC0xCitkaXZ4MzA4NSBkaXZpZGUgNjA4NjcwMTkuODE3NjQ3OTg4NDU0Njg0NDUxOTY4NjlFKzY1MSA2LjE0OTYxMjU2NTQwNDA4MDUwMTE1NzA5Mzg1MTg5NUUrODE3IC0+IDkuODk3Njk5OTIzNDE3NjE3OTIwOTk2MTg3NDIwOTY4RS0xNjAgSW5leGFjdCBSb3VuZGVkCitkdml4MzA4NSBkaXZpZGVpbnQgNjA4NjcwMTkuODE3NjQ3OTg4NDU0Njg0NDUxOTY4NjlFKzY1MSA2LjE0OTYxMjU2NTQwNDA4MDUwMTE1NzA5Mzg1MTg5NUUrODE3IC0+IDAKK211bHgzMDg1IG11bHRpcGx5IDYwODY3MDE5LjgxNzY0Nzk4ODQ1NDY4NDQ1MTk2ODY5RSs2NTEgNi4xNDk2MTI1NjU0MDQwODA1MDExNTcwOTM4NTE4OTVFKzgxNyAtPiAzLjc0MzA4NTg5ODg5MzA3MjU0NDE5NzU2NDAxMzQ5N0UrMTQ3NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDg1IHBvd2VyIDYwODY3MDE5LjgxNzY0Nzk4ODQ1NDY4NDQ1MTk2ODY5RSs2NTEgNiAtPiA1LjA4NTAxNDg5NzM4ODg3MTczNjc2NzYwMjA4NjY0NkUrMzk1MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDg1IHJlbWFpbmRlciA2MDg2NzAxOS44MTc2NDc5ODg0NTQ2ODQ0NTE5Njg2OUUrNjUxIDYuMTQ5NjEyNTY1NDA0MDgwNTAxMTU3MDkzODUxODk1RSs4MTcgLT4gNi4wODY3MDE5ODE3NjQ3OTg4NDU0Njg0NDUxOTY4NjlFKzY1OAorc3VieDMwODUgc3VidHJhY3QgNjA4NjcwMTkuODE3NjQ3OTg4NDU0Njg0NDUxOTY4NjlFKzY1MSA2LjE0OTYxMjU2NTQwNDA4MDUwMTE1NzA5Mzg1MTg5NUUrODE3IC0+IC02LjE0OTYxMjU2NTQwNDA4MDUwMTE1NzA5Mzg1MTg5NUUrODE3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwODYgYWRkIDE4NTU0NDE3NzM4MjE3LjYyMjE4NTkwOTY1ODAzNjA1RS0zODIgLTA4OTQ1MDU5MDk1MjkuMDUyMzc4NDc0NjE4NDM1NzgyRSs1MjcgLT4gLTguOTQ1MDU5MDk1MjkwNTIzNzg0NzQ2MTg0MzU3ODIwRSs1MzggSW5leGFjdCBSb3VuZGVkCitjb214MzA4NiBjb21wYXJlIDE4NTU0NDE3NzM4MjE3LjYyMjE4NTkwOTY1ODAzNjA1RS0zODIgLTA4OTQ1MDU5MDk1MjkuMDUyMzc4NDc0NjE4NDM1NzgyRSs1MjcgLT4gMQorZGl2eDMwODYgZGl2aWRlIDE4NTU0NDE3NzM4MjE3LjYyMjE4NTkwOTY1ODAzNjA1RS0zODIgLTA4OTQ1MDU5MDk1MjkuMDUyMzc4NDc0NjE4NDM1NzgyRSs1MjcgLT4gLTIuMDc0MjY0NDExMjg2NzA5MjI4Njc0ODQxNjcyOTU0RS05MDggSW5leGFjdCBSb3VuZGVkCitkdml4MzA4NiBkaXZpZGVpbnQgMTg1NTQ0MTc3MzgyMTcuNjIyMTg1OTA5NjU4MDM2MDVFLTM4MiAtMDg5NDUwNTkwOTUyOS4wNTIzNzg0NzQ2MTg0MzU3ODJFKzUyNyAtPiAtMAorbXVseDMwODYgbXVsdGlwbHkgMTg1NTQ0MTc3MzgyMTcuNjIyMTg1OTA5NjU4MDM2MDVFLTM4MiAtMDg5NDUwNTkwOTUyOS4wNTIzNzg0NzQ2MTg0MzU3ODJFKzUyNyAtPiAtMS42NTk3MDM2MzE0NzA2MzM3MDA4ODQxMzY4ODc2MTRFKzE3MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDg2IHBvd2VyIDE4NTU0NDE3NzM4MjE3LjYyMjE4NTkwOTY1ODAzNjA1RS0zODIgLTkgLT4gMy44MzY4NDI5OTgyOTU1MzE4OTkwODI2ODg3MjE1MzFFKzMzMTggSW5leGFjdCBSb3VuZGVkCityZW14MzA4NiByZW1haW5kZXIgMTg1NTQ0MTc3MzgyMTcuNjIyMTg1OTA5NjU4MDM2MDVFLTM4MiAtMDg5NDUwNTkwOTUyOS4wNTIzNzg0NzQ2MTg0MzU3ODJFKzUyNyAtPiAxLjg1NTQ0MTc3MzgyMTc2MjIxODU5MDk2NTgwMzYwNUUtMzY5CitzdWJ4MzA4NiBzdWJ0cmFjdCAxODU1NDQxNzczODIxNy42MjIxODU5MDk2NTgwMzYwNUUtMzgyIC0wODk0NTA1OTA5NTI5LjA1MjM3ODQ3NDYxODQzNTc4MkUrNTI3IC0+IDguOTQ1MDU5MDk1MjkwNTIzNzg0NzQ2MTg0MzU3ODIwRSs1MzggSW5leGFjdCBSb3VuZGVkCithZGR4MzA4NyBhZGQgNjkwNzMzNTU1MTcxNDQuMzYzNTY2ODg2NDIyMTM4MzkgOTk3Nzg0NzgyNTM1LjYxMDQ2MzQ4MjM2MjczMjcwMzNFKzExNiAtPiA5Ljk3Nzg0NzgyNTM1NjEwNDYzNDgyMzYyNzMyNzAzM0UrMTI3IEluZXhhY3QgUm91bmRlZAorY29teDMwODcgY29tcGFyZSA2OTA3MzM1NTUxNzE0NC4zNjM1NjY4ODY0MjIxMzgzOSA5OTc3ODQ3ODI1MzUuNjEwNDYzNDgyMzYyNzMyNzAzM0UrMTE2IC0+IC0xCitkaXZ4MzA4NyBkaXZpZGUgNjkwNzMzNTU1MTcxNDQuMzYzNTY2ODg2NDIyMTM4MzkgOTk3Nzg0NzgyNTM1LjYxMDQ2MzQ4MjM2MjczMjcwMzNFKzExNiAtPiA2LjkyMjY3MDc3MjkxMDgwNzM4ODM5NTM4NDg2Njg4NEUtMTE1IEluZXhhY3QgUm91bmRlZAorZHZpeDMwODcgZGl2aWRlaW50IDY5MDczMzU1NTE3MTQ0LjM2MzU2Njg4NjQyMjEzODM5IDk5Nzc4NDc4MjUzNS42MTA0NjM0ODIzNjI3MzI3MDMzRSsxMTYgLT4gMAorbXVseDMwODcgbXVsdGlwbHkgNjkwNzMzNTU1MTcxNDQuMzYzNTY2ODg2NDIyMTM4MzkgOTk3Nzg0NzgyNTM1LjYxMDQ2MzQ4MjM2MjczMjcwMzNFKzExNiAtPiA2Ljg5MjAzNDMwMTM2Nzg3OTgwMjY5MzQyMjA2NjQyNUUrMTQxIEluZXhhY3QgUm91bmRlZAorcG93eDMwODcgcG93ZXIgNjkwNzMzNTU1MTcxNDQuMzYzNTY2ODg2NDIyMTM4MzkgMTAgLT4gMi40NzIzMjQ4OTA4NDEzMzQzMDI2Mjg0MzU0NjE1MTZFKzEzOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDg3IHJlbWFpbmRlciA2OTA3MzM1NTUxNzE0NC4zNjM1NjY4ODY0MjIxMzgzOSA5OTc3ODQ3ODI1MzUuNjEwNDYzNDgyMzYyNzMyNzAzM0UrMTE2IC0+IDY5MDczMzU1NTE3MTQ0LjM2MzU2Njg4NjQyMjEzODM5CitzdWJ4MzA4NyBzdWJ0cmFjdCA2OTA3MzM1NTUxNzE0NC4zNjM1NjY4ODY0MjIxMzgzOSA5OTc3ODQ3ODI1MzUuNjEwNDYzNDgyMzYyNzMyNzAzM0UrMTE2IC0+IC05Ljk3Nzg0NzgyNTM1NjEwNDYzNDgyMzYyNzMyNzAzM0UrMTI3IEluZXhhY3QgUm91bmRlZAorYWRkeDMwODggYWRkIDQ1MDI4MjI1OTA3Mi44NjU3MDk5MzU5MTA0Mjc3NDc3IC0xNzkxMzA3OTY1MzE0MzA5MTc1NDc3OTExMzY5ODI0IC0+IC0xNzkxMzA3OTY1MzE0MzA5MTc1MDI3NjI5MTEwNzUxIEluZXhhY3QgUm91bmRlZAorY29teDMwODggY29tcGFyZSA0NTAyODIyNTkwNzIuODY1NzA5OTM1OTEwNDI3NzQ3NyAtMTc5MTMwNzk2NTMxNDMwOTE3NTQ3NzkxMTM2OTgyNCAtPiAxCitkaXZ4MzA4OCBkaXZpZGUgNDUwMjgyMjU5MDcyLjg2NTcwOTkzNTkxMDQyNzc0NzcgLTE3OTEzMDc5NjUzMTQzMDkxNzU0Nzc5MTEzNjk4MjQgLT4gLTIuNTEzNzA2NTY0MDk2MzUwNzE0MjEzNzcxMDA2NDgzRS0xOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDg4IGRpdmlkZWludCA0NTAyODIyNTkwNzIuODY1NzA5OTM1OTEwNDI3NzQ3NyAtMTc5MTMwNzk2NTMxNDMwOTE3NTQ3NzkxMTM2OTgyNCAtPiAtMAorbXVseDMwODggbXVsdGlwbHkgNDUwMjgyMjU5MDcyLjg2NTcwOTkzNTkxMDQyNzc0NzcgLTE3OTEzMDc5NjUzMTQzMDkxNzU0Nzc5MTEzNjk4MjQgLT4gLTguMDY1OTQxOTczMTY5NDU3MDcxNjUwOTk2ODYxNjc3RSs0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDg4IHBvd2VyIDQ1MDI4MjI1OTA3Mi44NjU3MDk5MzU5MTA0Mjc3NDc3IC0yIC0+IDQuOTMyMDgyNDQyMTk0NTQ0NjcxNjMzNTcwMzQ4ODM4RS0yNCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDg4IHJlbWFpbmRlciA0NTAyODIyNTkwNzIuODY1NzA5OTM1OTEwNDI3NzQ3NyAtMTc5MTMwNzk2NTMxNDMwOTE3NTQ3NzkxMTM2OTgyNCAtPiA0NTAyODIyNTkwNzIuODY1NzA5OTM1OTEwNDI3NzQ3Nworc3VieDMwODggc3VidHJhY3QgNDUwMjgyMjU5MDcyLjg2NTcwOTkzNTkxMDQyNzc0NzcgLTE3OTEzMDc5NjUzMTQzMDkxNzU0Nzc5MTEzNjk4MjQgLT4gMTc5MTMwNzk2NTMxNDMwOTE3NTkyODE5MzYyODg5NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDg5IGFkZCA5NTQ2Nzg0MTEuNzgzODE0OTI2NjQ1NTE3Nzg1MDAzNyAxNDI5ODguNzA5NjIwNDI1NDUyOTI4NDMzNDI3ODc5NCAtPiA5NTQ4MjE0MDAuNDkzNDM1MzUyMDk4NDQ2MjE4NDMxNiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDg5IGNvbXBhcmUgOTU0Njc4NDExLjc4MzgxNDkyNjY0NTUxNzc4NTAwMzcgMTQyOTg4LjcwOTYyMDQyNTQ1MjkyODQzMzQyNzg3OTQgLT4gMQorZGl2eDMwODkgZGl2aWRlIDk1NDY3ODQxMS43ODM4MTQ5MjY2NDU1MTc3ODUwMDM3IDE0Mjk4OC43MDk2MjA0MjU0NTI5Mjg0MzM0Mjc4Nzk0IC0+IDY2NzYuNTk5OTUxOTY4ODExNTg5MzM1NDI3NzcwMDQ2IEluZXhhY3QgUm91bmRlZAorZHZpeDMwODkgZGl2aWRlaW50IDk1NDY3ODQxMS43ODM4MTQ5MjY2NDU1MTc3ODUwMDM3IDE0Mjk4OC43MDk2MjA0MjU0NTI5Mjg0MzM0Mjc4Nzk0IC0+IDY2NzYKK211bHgzMDg5IG11bHRpcGx5IDk1NDY3ODQxMS43ODM4MTQ5MjY2NDU1MTc3ODUwMDM3IDE0Mjk4OC43MDk2MjA0MjU0NTI5Mjg0MzM0Mjc4Nzk0IC0+IDEzNjUwODIzNDIwMzQ0NC44Njk0ODc5NDMxNDEyMzc1IEluZXhhY3QgUm91bmRlZAorcG93eDMwODkgcG93ZXIgOTU0Njc4NDExLjc4MzgxNDkyNjY0NTUxNzc4NTAwMzcgMTQyOTg5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMwODkgcmVtYWluZGVyIDk1NDY3ODQxMS43ODM4MTQ5MjY2NDU1MTc3ODUwMDM3IDE0Mjk4OC43MDk2MjA0MjU0NTI5Mjg0MzM0Mjc4Nzk0IC0+IDg1Nzg2LjM1Nzg1NDYwMjg5NTI5NjIyMDQ4MDgyNTYKK3N1YngzMDg5IHN1YnRyYWN0IDk1NDY3ODQxMS43ODM4MTQ5MjY2NDU1MTc3ODUwMDM3IDE0Mjk4OC43MDk2MjA0MjU0NTI5Mjg0MzM0Mjc4Nzk0IC0+IDk1NDUzNTQyMy4wNzQxOTQ1MDExOTI1ODkzNTE1NzU4IEluZXhhY3QgUm91bmRlZAorYWRkeDMwOTAgYWRkIC05MjQ0NTMwOTc2LjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTU3IDU0MTA4OS40NzE1NDQ2ODU4ODk2NjE5MDc4NjI3OTQxIC0+IC05LjI0NDUzMDk3NjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTY2IEluZXhhY3QgUm91bmRlZAorY29teDMwOTAgY29tcGFyZSAtOTI0NDUzMDk3Ni4yMjA4MTIxMjcxNTU4NTIzODk4MDdFKzU1NyA1NDEwODkuNDcxNTQ0Njg1ODg5NjYxOTA3ODYyNzk0MSAtPiAtMQorZGl2eDMwOTAgZGl2aWRlIC05MjQ0NTMwOTc2LjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTU3IDU0MTA4OS40NzE1NDQ2ODU4ODk2NjE5MDc4NjI3OTQxIC0+IC0xLjcwODUwMzIwNzM5NTU5MTAwMjM3MDY0OTg0ODc1N0UrNTYxIEluZXhhY3QgUm91bmRlZAorZHZpeDMwOTAgZGl2aWRlaW50IC05MjQ0NTMwOTc2LjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTU3IDU0MTA4OS40NzE1NDQ2ODU4ODk2NjE5MDc4NjI3OTQxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzA5MCBtdWx0aXBseSAtOTI0NDUzMDk3Ni4yMjA4MTIxMjcxNTU4NTIzODk4MDdFKzU1NyA1NDEwODkuNDcxNTQ0Njg1ODg5NjYxOTA3ODYyNzk0MSAtPiAtNS4wMDIxMTgzODA2MDE3OTgzOTIzNjMwNDM1NTg5NDFFKzU3MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDkwIHBvd2VyIC05MjQ0NTMwOTc2LjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTU3IDU0MTA4OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzA5MCByZW1haW5kZXIgLTkyNDQ1MzA5NzYuMjIwODEyMTI3MTU1ODUyMzg5ODA3RSs1NTcgNTQxMDg5LjQ3MTU0NDY4NTg4OTY2MTkwNzg2Mjc5NDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMDkwIHN1YnRyYWN0IC05MjQ0NTMwOTc2LjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTU3IDU0MTA4OS40NzE1NDQ2ODU4ODk2NjE5MDc4NjI3OTQxIC0+IC05LjI0NDUzMDk3NjIyMDgxMjEyNzE1NTg1MjM4OTgwN0UrNTY2IEluZXhhY3QgUm91bmRlZAorYWRkeDMwOTEgYWRkIC03NTQ5MjAyNC4yMDk5MDE5NzAwNTk3NDI0MTk3NTQ0OSAtMTQ3NjA0MjEzMTEzNDguMzUyNjkwNDQ2MzMwMDA5MjcgLT4gLTE0NzYwNDk2ODAzMzcyLjU2MjU5MjQxNjM4OTc1MTY5IEluZXhhY3QgUm91bmRlZAorY29teDMwOTEgY29tcGFyZSAtNzU0OTIwMjQuMjA5OTAxOTcwMDU5NzQyNDE5NzU0NDkgLTE0NzYwNDIxMzExMzQ4LjM1MjY5MDQ0NjMzMDAwOTI3IC0+IDEKK2RpdngzMDkxIGRpdmlkZSAtNzU0OTIwMjQuMjA5OTAxOTcwMDU5NzQyNDE5NzU0NDkgLTE0NzYwNDIxMzExMzQ4LjM1MjY5MDQ0NjMzMDAwOTI3IC0+IDAuMDAwMDA1MTE0NDg5Nzk3OTIwNjY4ODM2Mjc4MzQ0NjM1MTA4IEluZXhhY3QgUm91bmRlZAorZHZpeDMwOTEgZGl2aWRlaW50IC03NTQ5MjAyNC4yMDk5MDE5NzAwNTk3NDI0MTk3NTQ0OSAtMTQ3NjA0MjEzMTEzNDguMzUyNjkwNDQ2MzMwMDA5MjcgLT4gMAorbXVseDMwOTEgbXVsdGlwbHkgLTc1NDkyMDI0LjIwOTkwMTk3MDA1OTc0MjQxOTc1NDQ5IC0xNDc2MDQyMTMxMTM0OC4zNTI2OTA0NDYzMzAwMDkyNyAtPiAxMTE0Mjk0MDgyOTg0NjYyODI1ODMxLjQ2NDc4NzQ4NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDkxIHBvd2VyIC03NTQ5MjAyNC4yMDk5MDE5NzAwNTk3NDI0MTk3NTQ0OSAtMSAtPiAtMS4zMjQ2NDMyNDYwNDYxNjIwODIzNDg5NzA3MzU1NzZFLTggSW5leGFjdCBSb3VuZGVkCityZW14MzA5MSByZW1haW5kZXIgLTc1NDkyMDI0LjIwOTkwMTk3MDA1OTc0MjQxOTc1NDQ5IC0xNDc2MDQyMTMxMTM0OC4zNTI2OTA0NDYzMzAwMDkyNyAtPiAtNzU0OTIwMjQuMjA5OTAxOTcwMDU5NzQyNDE5NzU0NDkKK3N1YngzMDkxIHN1YnRyYWN0IC03NTQ5MjAyNC4yMDk5MDE5NzAwNTk3NDI0MTk3NTQ0OSAtMTQ3NjA0MjEzMTEzNDguMzUyNjkwNDQ2MzMwMDA5MjcgLT4gMTQ3NjAzNDU4MTkzMjQuMTQyNzg4NDc2MjcwMjY2ODUgSW5leGFjdCBSb3VuZGVkCithZGR4MzA5MiBhZGQgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyNDc1OTc2My4zMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrMDkyIC0+IDIuNDc1OTc2MzMzMTQ0ODI0NjEzNTkxMjI4MDk3MzMwRSs5OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDkyIGNvbXBhcmUgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyNDc1OTc2My4zMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrMDkyIC0+IC0xCitkaXZ4MzA5MiBkaXZpZGUgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyNDc1OTc2My4zMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrMDkyIC0+IDEuMjgzMzIyODM3MDA3ODUyMjQ3NTk0MjE2MTUxNjM0RS01NDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzA5MiBkaXZpZGVpbnQgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyNDc1OTc2My4zMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrMDkyIC0+IDAKK211bHgzMDkyIG11bHRpcGx5IDMxNzc0Ny42OTcyMjE1NzE1NDM0MTg2NTk2MTc4MDM2RS00NTIgMjQ3NTk3NjMuMzMxNDQ4MjQ2MTM1OTEyMjgwOTczMzBFKzA5MiAtPiA3Ljg2NzM1Nzc4MjMxODc4Njg2MDQwNDk5NzY0NzUxM0UtMzQ4IEluZXhhY3QgUm91bmRlZAorcG93eDMwOTIgcG93ZXIgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyIC0+IDEuMDA5NjM1OTkwODk2MTE1MDQzMzMxMjMxNDk2MjA5RS04OTMgSW5leGFjdCBSb3VuZGVkCityZW14MzA5MiByZW1haW5kZXIgMzE3NzQ3LjY5NzIyMTU3MTU0MzQxODY1OTYxNzgwMzZFLTQ1MiAyNDc1OTc2My4zMzE0NDgyNDYxMzU5MTIyODA5NzMzMEUrMDkyIC0+IDMuMTc3NDc2OTcyMjE1NzE1NDM0MTg2NTk2MTc4MDM2RS00NDcKK3N1YngzMDkyIHN1YnRyYWN0IDMxNzc0Ny42OTcyMjE1NzE1NDM0MTg2NTk2MTc4MDM2RS00NTIgMjQ3NTk3NjMuMzMxNDQ4MjQ2MTM1OTEyMjgwOTczMzBFKzA5MiAtPiAtMi40NzU5NzYzMzMxNDQ4MjQ2MTM1OTEyMjgwOTczMzBFKzk5IEluZXhhY3QgUm91bmRlZAorYWRkeDMwOTMgYWRkIC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNyAtOS43MTc4NzIwMjU4MTQ1OTY1NDg0NjI4NTQ4NTM1MjIgLT4gLTE3Ljg3MTIwNjQ1NjE3MzI0MzY4Mjc5NzQwMDIwNjk1IEluZXhhY3QgUm91bmRlZAorY29teDMwOTMgY29tcGFyZSAtOC4xNTMzMzQ0MzAzNTg2NDcxMzQzMzQ1NDUzNTM0MjcgLTkuNzE3ODcyMDI1ODE0NTk2NTQ4NDYyODU0ODUzNTIyIC0+IDEKK2RpdngzMDkzIGRpdmlkZSAtOC4xNTMzMzQ0MzAzNTg2NDcxMzQzMzQ1NDUzNTM0MjcgLTkuNzE3ODcyMDI1ODE0NTk2NTQ4NDYyODU0ODUzNTIyIC0+IDAuODM5MDA0MDk1NjE4ODg1OTk3MjA0NDM0NDUzMjAxOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDkzIGRpdmlkZWludCAtOC4xNTMzMzQ0MzAzNTg2NDcxMzQzMzQ1NDUzNTM0MjcgLTkuNzE3ODcyMDI1ODE0NTk2NTQ4NDYyODU0ODUzNTIyIC0+IDAKK211bHgzMDkzIG11bHRpcGx5IC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNyAtOS43MTc4NzIwMjU4MTQ1OTY1NDg0NjI4NTQ4NTM1MjIgLT4gNzkuMjMzMDYwNTc3ODkzMjg1Nzg5MDI5NjA2MDUyMjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA5MyBwb3dlciAtOC4xNTMzMzQ0MzAzNTg2NDcxMzQzMzQ1NDUzNTM0MjcgLTEwIC0+IDcuNzAyNzc4OTY2ODc2NzI3MDU2NjM1OTUyODAxMTYyRS0xMCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMDkzIHJlbWFpbmRlciAtOC4xNTMzMzQ0MzAzNTg2NDcxMzQzMzQ1NDUzNTM0MjcgLTkuNzE3ODcyMDI1ODE0NTk2NTQ4NDYyODU0ODUzNTIyIC0+IC04LjE1MzMzNDQzMDM1ODY0NzEzNDMzNDU0NTM1MzQyNworc3VieDMwOTMgc3VidHJhY3QgLTguMTUzMzM0NDMwMzU4NjQ3MTM0MzM0NTQ1MzUzNDI3IC05LjcxNzg3MjAyNTgxNDU5NjU0ODQ2Mjg1NDg1MzUyMiAtPiAxLjU2NDUzNzU5NTQ1NTk0OTQxNDEyODMwOTUwMDA5NQorYWRkeDMwOTQgYWRkIDcuMjY3MzQ1MTk3NDkyOTY3MzMyMzIwNDU2MDYyOTYxRS00NzggNTA1NDAxNTQ4MTgzMy4yNjM1NDExODk5MTYyMDgwNjUgLT4gNTA1NDAxNTQ4MTgzMy4yNjM1NDExODk5MTYyMDgwNjUgSW5leGFjdCBSb3VuZGVkCitjb214MzA5NCBjb21wYXJlIDcuMjY3MzQ1MTk3NDkyOTY3MzMyMzIwNDU2MDYyOTYxRS00NzggNTA1NDAxNTQ4MTgzMy4yNjM1NDExODk5MTYyMDgwNjUgLT4gLTEKK2RpdngzMDk0IGRpdmlkZSA3LjI2NzM0NTE5NzQ5Mjk2NzMzMjMyMDQ1NjA2Mjk2MUUtNDc4IDUwNTQwMTU0ODE4MzMuMjYzNTQxMTg5OTE2MjA4MDY1IC0+IDEuNDM3OTM0ODkwMzA5NjA2NTk0ODk1Mjk5NTU4NjU0RS00OTAgSW5leGFjdCBSb3VuZGVkCitkdml4MzA5NCBkaXZpZGVpbnQgNy4yNjczNDUxOTc0OTI5NjczMzIzMjA0NTYwNjI5NjFFLTQ3OCA1MDU0MDE1NDgxODMzLjI2MzU0MTE4OTkxNjIwODA2NSAtPiAwCittdWx4MzA5NCBtdWx0aXBseSA3LjI2NzM0NTE5NzQ5Mjk2NzMzMjMyMDQ1NjA2Mjk2MUUtNDc4IDUwNTQwMTU0ODE4MzMuMjYzNTQxMTg5OTE2MjA4MDY1IC0+IDMuNjcyOTI3NTEzOTk1NjA3MzA4MDQ4NzM3NzUxOTcyRS00NjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA5NCBwb3dlciA3LjI2NzM0NTE5NzQ5Mjk2NzMzMjMyMDQ1NjA2Mjk2MUUtNDc4IDUgLT4gMi4wMjcxMTc2MTY4NDY2Njg1NjgxMDgwOTY1ODM4OTdFLTIzODYgSW5leGFjdCBSb3VuZGVkCityZW14MzA5NCByZW1haW5kZXIgNy4yNjczNDUxOTc0OTI5NjczMzIzMjA0NTYwNjI5NjFFLTQ3OCA1MDU0MDE1NDgxODMzLjI2MzU0MTE4OTkxNjIwODA2NSAtPiA3LjI2NzM0NTE5NzQ5Mjk2NzMzMjMyMDQ1NjA2Mjk2MUUtNDc4CitzdWJ4MzA5NCBzdWJ0cmFjdCA3LjI2NzM0NTE5NzQ5Mjk2NzMzMjMyMDQ1NjA2Mjk2MUUtNDc4IDUwNTQwMTU0ODE4MzMuMjYzNTQxMTg5OTE2MjA4MDY1IC0+IC01MDU0MDE1NDgxODMzLjI2MzU0MTE4OTkxNjIwODA2NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDk1IGFkZCAtMTIyMzM1NDAyOS44NjI1NjcwNTQyMzA5MTIyNzExNzEgODEzNTc3NDIyMzQwMTMyMjc4NTQ3NTAxNDg1NTYyNSAtPiA4MTM1Nzc0MjIzNDAxMzIyNzg1NDczNzkxNTAxNTk1IEluZXhhY3QgUm91bmRlZAorY29teDMwOTUgY29tcGFyZSAtMTIyMzM1NDAyOS44NjI1NjcwNTQyMzA5MTIyNzExNzEgODEzNTc3NDIyMzQwMTMyMjc4NTQ3NTAxNDg1NTYyNSAtPiAtMQorZGl2eDMwOTUgZGl2aWRlIC0xMjIzMzU0MDI5Ljg2MjU2NzA1NDIzMDkxMjI3MTE3MSA4MTM1Nzc0MjIzNDAxMzIyNzg1NDc1MDE0ODU1NjI1IC0+IC0xLjUwMzY3MjU0MDg5MjAyMDMzNzY4ODI3NzU1MzY5MkUtMjIgSW5leGFjdCBSb3VuZGVkCitkdml4MzA5NSBkaXZpZGVpbnQgLTEyMjMzNTQwMjkuODYyNTY3MDU0MjMwOTEyMjcxMTcxIDgxMzU3NzQyMjM0MDEzMjI3ODU0NzUwMTQ4NTU2MjUgLT4gLTAKK211bHgzMDk1IG11bHRpcGx5IC0xMjIzMzU0MDI5Ljg2MjU2NzA1NDIzMDkxMjI3MTE3MSA4MTM1Nzc0MjIzNDAxMzIyNzg1NDc1MDE0ODU1NjI1IC0+IC05Ljk1MjkzMjE4MjI1MDAwNTExOTMwNzQyOTA2MDg5NEUrMzkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA5NSBwb3dlciAtMTIyMzM1NDAyOS44NjI1NjcwNTQyMzA5MTIyNzExNzEgOCAtPiA1LjAxNjY4OTg4NzE5MjgzMDY2Njg0ODA2ODg0MTIyN0UrNzIgSW5leGFjdCBSb3VuZGVkCityZW14MzA5NSByZW1haW5kZXIgLTEyMjMzNTQwMjkuODYyNTY3MDU0MjMwOTEyMjcxMTcxIDgxMzU3NzQyMjM0MDEzMjI3ODU0NzUwMTQ4NTU2MjUgLT4gLTEyMjMzNTQwMjkuODYyNTY3MDU0MjMwOTEyMjcxMTcxCitzdWJ4MzA5NSBzdWJ0cmFjdCAtMTIyMzM1NDAyOS44NjI1NjcwNTQyMzA5MTIyNzExNzEgODEzNTc3NDIyMzQwMTMyMjc4NTQ3NTAxNDg1NTYyNSAtPiAtODEzNTc3NDIyMzQwMTMyMjc4NTQ3NjIzODIwOTY1NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDk2IGFkZCAyODUzOTc2NDQxMTEuNTY1NTY3OTk2MTIxMTM0OTk4MkUrNjQ1IC0yNDc5NDk5NDI3NjEzMTU3NTE5MzU5NjI3MjgwNzA0IC0+IDIuODUzOTc2NDQxMTE1NjU1Njc5OTYxMjExMzQ5OTgyRSs2NTYgSW5leGFjdCBSb3VuZGVkCitjb214MzA5NiBjb21wYXJlIDI4NTM5NzY0NDExMS41NjU1Njc5OTYxMjExMzQ5OTgyRSs2NDUgLTI0Nzk0OTk0Mjc2MTMxNTc1MTkzNTk2MjcyODA3MDQgLT4gMQorZGl2eDMwOTYgZGl2aWRlIDI4NTM5NzY0NDExMS41NjU1Njc5OTYxMjExMzQ5OTgyRSs2NDUgLTI0Nzk0OTk0Mjc2MTMxNTc1MTkzNTk2MjcyODA3MDQgLT4gLTEuMTUxMDI5MjgwMDc2NDk1NjI2NDIxMTM0NzMzMTIyRSs2MjYgSW5leGFjdCBSb3VuZGVkCitkdml4MzA5NiBkaXZpZGVpbnQgMjg1Mzk3NjQ0MTExLjU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY0NSAtMjQ3OTQ5OTQyNzYxMzE1NzUxOTM1OTYyNzI4MDcwNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMwOTYgbXVsdGlwbHkgMjg1Mzk3NjQ0MTExLjU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY0NSAtMjQ3OTQ5OTQyNzYxMzE1NzUxOTM1OTYyNzI4MDcwNCAtPiAtNy4wNzY0MzI5NTIxNjc3MDQ2MTQxMzg0MTE3NDAwMDFFKzY4NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDk2IHBvd2VyIDI4NTM5NzY0NDExMS41NjU1Njc5OTYxMjExMzQ5OTgyRSs2NDUgLTIgLT4gMS4yMjc3MTk3MjIwODc4NjA0MDEyMzMwMzA0Nzk0NTFFLTEzMTMgSW5leGFjdCBSb3VuZGVkCityZW14MzA5NiByZW1haW5kZXIgMjg1Mzk3NjQ0MTExLjU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY0NSAtMjQ3OTQ5OTQyNzYxMzE1NzUxOTM1OTYyNzI4MDcwNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMwOTYgc3VidHJhY3QgMjg1Mzk3NjQ0MTExLjU2NTU2Nzk5NjEyMTEzNDk5ODJFKzY0NSAtMjQ3OTQ5OTQyNzYxMzE1NzUxOTM1OTYyNzI4MDcwNCAtPiAyLjg1Mzk3NjQ0MTExNTY1NTY3OTk2MTIxMTM0OTk4MkUrNjU2IEluZXhhY3QgUm91bmRlZAorYWRkeDMwOTcgYWRkIC00NjczMTEyLjY2MzQ0MjM2NjI5MzgxMjM0NjY1MzQyOSAtMzQyOS45OTg0MDMxNDI1NDYwMDE0MzgyMzg0NjA5NTggLT4gLTQ2NzY1NDIuNjYxODQ1NTA4ODM5ODEzNzg0ODkxODkwIEluZXhhY3QgUm91bmRlZAorY29teDMwOTcgY29tcGFyZSAtNDY3MzExMi42NjM0NDIzNjYyOTM4MTIzNDY2NTM0MjkgLTM0MjkuOTk4NDAzMTQyNTQ2MDAxNDM4MjM4NDYwOTU4IC0+IC0xCitkaXZ4MzA5NyBkaXZpZGUgLTQ2NzMxMTIuNjYzNDQyMzY2MjkzODEyMzQ2NjUzNDI5IC0zNDI5Ljk5ODQwMzE0MjU0NjAwMTQzODIzODQ2MDk1OCAtPiAxMzYyLjQyNDE1MTMyMzQ3NzUwNTA2NDY4NjU4OTcxNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDk3IGRpdmlkZWludCAtNDY3MzExMi42NjM0NDIzNjYyOTM4MTIzNDY2NTM0MjkgLTM0MjkuOTk4NDAzMTQyNTQ2MDAxNDM4MjM4NDYwOTU4IC0+IDEzNjIKK211bHgzMDk3IG11bHRpcGx5IC00NjczMTEyLjY2MzQ0MjM2NjI5MzgxMjM0NjY1MzQyOSAtMzQyOS45OTg0MDMxNDI1NDYwMDE0MzgyMzg0NjA5NTggLT4gMTYwMjg3Njg5NzMuMzEyNTI2Mzk0NzYxNDgzNzEzNjEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA5NyBwb3dlciAtNDY3MzExMi42NjM0NDIzNjYyOTM4MTIzNDY2NTM0MjkgLTM0MzAgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwOTcgcmVtYWluZGVyIC00NjczMTEyLjY2MzQ0MjM2NjI5MzgxMjM0NjY1MzQyOSAtMzQyOS45OTg0MDMxNDI1NDYwMDE0MzgyMzg0NjA5NTggLT4gLTE0NTQuODM4MzYyMjE4NjM5ODUzNDY1ODY5NjA0MjA0CitzdWJ4MzA5NyBzdWJ0cmFjdCAtNDY3MzExMi42NjM0NDIzNjYyOTM4MTIzNDY2NTM0MjkgLTM0MjkuOTk4NDAzMTQyNTQ2MDAxNDM4MjM4NDYwOTU4IC0+IC00NjY5NjgyLjY2NTAzOTIyMzc0NzgxMDkwODQxNDk2OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMDk4IGFkZCA4OC45NjQ5MjQ3OTY4MTI3ODA3OTg2MTQ1NjA1MTEwMyAzODY5MzkuNDYyMTAwNjUxNDc1MTg4OTA5NjUxMDkyM0UrMTM5IC0+IDMuODY5Mzk0NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxNDQgSW5leGFjdCBSb3VuZGVkCitjb214MzA5OCBjb21wYXJlIDg4Ljk2NDkyNDc5NjgxMjc4MDc5ODYxNDU2MDUxMTAzIDM4NjkzOS40NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxMzkgLT4gLTEKK2RpdngzMDk4IGRpdmlkZSA4OC45NjQ5MjQ3OTY4MTI3ODA3OTg2MTQ1NjA1MTEwMyAzODY5MzkuNDYyMTAwNjUxNDc1MTg4OTA5NjUxMDkyM0UrMTM5IC0+IDIuMjk5MTk0OTI2MDk1OTg1NjQ3ODIxMzg1OTM3NjE4RS0xNDMgSW5leGFjdCBSb3VuZGVkCitkdml4MzA5OCBkaXZpZGVpbnQgODguOTY0OTI0Nzk2ODEyNzgwNzk4NjE0NTYwNTExMDMgMzg2OTM5LjQ2MjEwMDY1MTQ3NTE4ODkwOTY1MTA5MjNFKzEzOSAtPiAwCittdWx4MzA5OCBtdWx0aXBseSA4OC45NjQ5MjQ3OTY4MTI3ODA3OTg2MTQ1NjA1MTEwMyAzODY5MzkuNDYyMTAwNjUxNDc1MTg4OTA5NjUxMDkyM0UrMTM5IC0+IDMuNDQyNDA0MDE0NjcwMzY0NzYzNzgwOTQ2Mjk3ODU2RSsxNDYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzA5OCBwb3dlciA4OC45NjQ5MjQ3OTY4MTI3ODA3OTg2MTQ1NjA1MTEwMyA0IC0+IDYyNjQzMzkxLjczMDc4MjkwMjI2NDc0NzU4ODU4OTcwIEluZXhhY3QgUm91bmRlZAorcmVteDMwOTggcmVtYWluZGVyIDg4Ljk2NDkyNDc5NjgxMjc4MDc5ODYxNDU2MDUxMTAzIDM4NjkzOS40NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxMzkgLT4gODguOTY0OTI0Nzk2ODEyNzgwNzk4NjE0NTYwNTExMDMKK3N1YngzMDk4IHN1YnRyYWN0IDg4Ljk2NDkyNDc5NjgxMjc4MDc5ODYxNDU2MDUxMTAzIDM4NjkzOS40NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxMzkgLT4gLTMuODY5Mzk0NjIxMDA2NTE0NzUxODg5MDk2NTEwOTIzRSsxNDQgSW5leGFjdCBSb3VuZGVkCithZGR4MzA5OSBhZGQgMDY0MzI2ODQ2LjQyODY0MzczMDQ3ODgwNjk0NDQzMjZFLTk0MiA5Mi4yMzY0OTk0MjAxMDg2MjA4NzE0OTAxNTA5MTM1MCAtPiA5Mi4yMzY0OTk0MjAxMDg2MjA4NzE0OTAxNTA5MTM1MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMDk5IGNvbXBhcmUgMDY0MzI2ODQ2LjQyODY0MzczMDQ3ODgwNjk0NDQzMjZFLTk0MiA5Mi4yMzY0OTk0MjAxMDg2MjA4NzE0OTAxNTA5MTM1MCAtPiAtMQorZGl2eDMwOTkgZGl2aWRlIDA2NDMyNjg0Ni40Mjg2NDM3MzA0Nzg4MDY5NDQ0MzI2RS05NDIgOTIuMjM2NDk5NDIwMTA4NjIwODcxNDkwMTUwOTEzNTAgLT4gNi45NzQxMjA1MzA3MDgyMzAyMjkzNDQzNDk1MzE3MTlFLTkzNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMDk5IGRpdmlkZWludCAwNjQzMjY4NDYuNDI4NjQzNzMwNDc4ODA2OTQ0NDMyNkUtOTQyIDkyLjIzNjQ5OTQyMDEwODYyMDg3MTQ5MDE1MDkxMzUwIC0+IDAKK211bHgzMDk5IG11bHRpcGx5IDA2NDMyNjg0Ni40Mjg2NDM3MzA0Nzg4MDY5NDQ0MzI2RS05NDIgOTIuMjM2NDk5NDIwMTA4NjIwODcxNDkwMTUwOTEzNTAgLT4gNS45MzMyODMxMzMzMTMwMTM3NTU4MTQ0MDU0MzYzNDJFLTkzMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMDk5IHBvd2VyIDA2NDMyNjg0Ni40Mjg2NDM3MzA0Nzg4MDY5NDQ0MzI2RS05NDIgOTIgLT4gMEUtMTAwMjkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMwOTkgcmVtYWluZGVyIDA2NDMyNjg0Ni40Mjg2NDM3MzA0Nzg4MDY5NDQ0MzI2RS05NDIgOTIuMjM2NDk5NDIwMTA4NjIwODcxNDkwMTUwOTEzNTAgLT4gNi40MzI2ODQ2NDI4NjQzNzMwNDc4ODA2OTQ0NDMyNkUtOTM1CitzdWJ4MzA5OSBzdWJ0cmFjdCAwNjQzMjY4NDYuNDI4NjQzNzMwNDc4ODA2OTQ0NDMyNkUtOTQyIDkyLjIzNjQ5OTQyMDEwODYyMDg3MTQ5MDE1MDkxMzUwIC0+IC05Mi4yMzY0OTk0MjAxMDg2MjA4NzE0OTAxNTA5MTM1MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMTAwIGFkZCA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MCA2MDUzODcuNzE3NTUyMjk1NTM0NDY1OTMxMTA3MjA5OSAtPiAxMTA5ODk0LjcyMTk0NzIyNzk3Nzc4Mjk3MTY3NzE0NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMTAwIGNvbXBhcmUgNTA0NTA3LjAwNDM5NDkzMjQ0MzMxNzA0MDU2OTkzNjAgNjA1Mzg3LjcxNzU1MjI5NTUzNDQ2NTkzMTEwNzIwOTkgLT4gLTEKK2RpdngzMTAwIGRpdmlkZSA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MCA2MDUzODcuNzE3NTUyMjk1NTM0NDY1OTMxMTA3MjA5OSAtPiAwLjgzMzM2MTgxMDU2Nzg3MTg4OTUyMTYwNjc0NjM4MzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzEwMCBkaXZpZGVpbnQgNTA0NTA3LjAwNDM5NDkzMjQ0MzMxNzA0MDU2OTkzNjAgNjA1Mzg3LjcxNzU1MjI5NTUzNDQ2NTkzMTEwNzIwOTkgLT4gMAorbXVseDMxMDAgbXVsdGlwbHkgNTA0NTA3LjAwNDM5NDkzMjQ0MzMxNzA0MDU2OTkzNjAgNjA1Mzg3LjcxNzU1MjI5NTUzNDQ2NTkzMTEwNzIwOTkgLT4gMzA1NDIyMzQzODc5Ljc5NDA4Mzg2MzA0MDE2NTY1ODUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzEwMCBwb3dlciA1MDQ1MDcuMDA0Mzk0OTMyNDQzMzE3MDQwNTY5OTM2MCA2MDUzODggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzEwMCByZW1haW5kZXIgNTA0NTA3LjAwNDM5NDkzMjQ0MzMxNzA0MDU2OTkzNjAgNjA1Mzg3LjcxNzU1MjI5NTUzNDQ2NTkzMTEwNzIwOTkgLT4gNTA0NTA3LjAwNDM5NDkzMjQ0MzMxNzA0MDU2OTkzNjAKK3N1YngzMTAwIHN1YnRyYWN0IDUwNDUwNy4wMDQzOTQ5MzI0NDMzMTcwNDA1Njk5MzYwIDYwNTM4Ny43MTc1NTIyOTU1MzQ0NjU5MzExMDcyMDk5IC0+IC0xMDA4ODAuNzEzMTU3MzYzMDkxMTQ4ODkwNTM3MjczOQorCistLSByYW5kb21seSBnZW5lcmF0ZWQgdGVzdGNhc2VzIFsyNiBTZXAgMjAwMV0KK3ByZWNpc2lvbjogMzIKK3JvdW5kaW5nOiBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5OQorCithZGR4MzIwMSBhZGQgMS41MjgzNTUwMTYzODM5Nzg5MzE5MTQyNDMwMjUzNjQ0IC0xLjY1NzgxNTg0ODQ4MjI5Njk1MjA0MDUyOTEzNzk0OTIgLT4gLTAuMTI5NDYwODMyMDk4MzE4MDIwMTI2Mjg2MTEyNTg0OAorY29teDMyMDEgY29tcGFyZSAxLjUyODM1NTAxNjM4Mzk3ODkzMTkxNDI0MzAyNTM2NDQgLTEuNjU3ODE1ODQ4NDgyMjk2OTUyMDQwNTI5MTM3OTQ5MiAtPiAxCitkaXZ4MzIwMSBkaXZpZGUgMS41MjgzNTUwMTYzODM5Nzg5MzE5MTQyNDMwMjUzNjQ0IC0xLjY1NzgxNTg0ODQ4MjI5Njk1MjA0MDUyOTEzNzk0OTIgLT4gLTAuOTIxOTA4Nzk4MTIzMjQzMTM2MzAyODI5ODAxMTAyODAgSW5leGFjdCBSb3VuZGVkCitkdml4MzIwMSBkaXZpZGVpbnQgMS41MjgzNTUwMTYzODM5Nzg5MzE5MTQyNDMwMjUzNjQ0IC0xLjY1NzgxNTg0ODQ4MjI5Njk1MjA0MDUyOTEzNzk0OTIgLT4gLTAKK211bHgzMjAxIG11bHRpcGx5IDEuNTI4MzU1MDE2MzgzOTc4OTMxOTE0MjQzMDI1MzY0NCAtMS42NTc4MTU4NDg0ODIyOTY5NTIwNDA1MjkxMzc5NDkyIC0+IC0yLjUzMzczMTE2ODI2ODc4MDg5MjY2MzM5MTA3NjE2MTQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwMSBwb3dlciAxLjUyODM1NTAxNjM4Mzk3ODkzMTkxNDI0MzAyNTM2NDQgLTIgLT4gMC40MjgxMDYxODkxNjU4NDkyNDQ1MTQ2NjY5MTYwMzEyOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjAxIHJlbWFpbmRlciAxLjUyODM1NTAxNjM4Mzk3ODkzMTkxNDI0MzAyNTM2NDQgLTEuNjU3ODE1ODQ4NDgyMjk2OTUyMDQwNTI5MTM3OTQ5MiAtPiAxLjUyODM1NTAxNjM4Mzk3ODkzMTkxNDI0MzAyNTM2NDQKK3N1YngzMjAxIHN1YnRyYWN0IDEuNTI4MzU1MDE2MzgzOTc4OTMxOTE0MjQzMDI1MzY0NCAtMS42NTc4MTU4NDg0ODIyOTY5NTIwNDA1MjkxMzc5NDkyIC0+IDMuMTg2MTcwODY0ODY2Mjc1ODgzOTU0NzcyMTYzMzEzNgorYWRkeDMyMDIgYWRkIC02MjI5MDMwMzA2MDUuMjg2NzUwMzkzNzgzNjUwNzMyNiA2NTE5Mzg4NjA3LjEzMzE4NTU3MDQ0NzEzMjg3OTU4MjEgLT4gLTYxNjM4MzY0MTk5OC4xNTM1NjQ4MjMzMzY1MTc4NTMwMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjAyIGNvbXBhcmUgLTYyMjkwMzAzMDYwNS4yODY3NTAzOTM3ODM2NTA3MzI2IDY1MTkzODg2MDcuMTMzMTg1NTcwNDQ3MTMyODc5NTgyMSAtPiAtMQorZGl2eDMyMDIgZGl2aWRlIC02MjI5MDMwMzA2MDUuMjg2NzUwMzkzNzgzNjUwNzMyNiA2NTE5Mzg4NjA3LjEzMzE4NTU3MDQ0NzEzMjg3OTU4MjEgLT4gLTk1LjU0NjIzNDE4NTc4NTExMDQ5MTY3Njg5NDE1MzUxMCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjAyIGRpdmlkZWludCAtNjIyOTAzMDMwNjA1LjI4Njc1MDM5Mzc4MzY1MDczMjYgNjUxOTM4ODYwNy4xMzMxODU1NzA0NDcxMzI4Nzk1ODIxIC0+IC05NQorbXVseDMyMDIgbXVsdGlwbHkgLTYyMjkwMzAzMDYwNS4yODY3NTAzOTM3ODM2NTA3MzI2IDY1MTkzODg2MDcuMTMzMTg1NTcwNDQ3MTMyODc5NTgyMSAtPiAtNDA2MDk0NjkyMTA3Njg0MDQ0OTk0OS42OTg4ODI4NDg2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMDIgcG93ZXIgLTYyMjkwMzAzMDYwNS4yODY3NTAzOTM3ODM2NTA3MzI2IDcgLT4gLTMuNjM4NjczNjU5NzcwMjQwNDM1MjgxMzMwODA2NDMwMEUrODIgSW5leGFjdCBSb3VuZGVkCityZW14MzIwMiByZW1haW5kZXIgLTYyMjkwMzAzMDYwNS4yODY3NTAzOTM3ODM2NTA3MzI2IDY1MTkzODg2MDcuMTMzMTg1NTcwNDQ3MTMyODc5NTgyMSAtPiAtMzU2MTExMjkyNy42MzQxMjEyMDEzMDYwMjcxNzIzMDA1CitzdWJ4MzIwMiBzdWJ0cmFjdCAtNjIyOTAzMDMwNjA1LjI4Njc1MDM5Mzc4MzY1MDczMjYgNjUxOTM4ODYwNy4xMzMxODU1NzA0NDcxMzI4Nzk1ODIxIC0+IC02Mjk0MjI0MTkyMTIuNDE5OTM1OTY0MjMwNzgzNjEyMTggSW5leGFjdCBSb3VuZGVkCithZGR4MzIwMyBhZGQgLTU2NzU5MTUuMjQ2NTQ1NzQ4NzYzMjI1MDI0NTIwOTA1NCA3MzkxMzkwOTg4MC4zODEzNjc4OTUyMDUwODYwMjc0MTYgLT4gNzM5MDgyMzM5NjUuMTM0ODIyMTQ2NDQxODYxMDAyODk1IEluZXhhY3QgUm91bmRlZAorY29teDMyMDMgY29tcGFyZSAtNTY3NTkxNS4yNDY1NDU3NDg3NjMyMjUwMjQ1MjA5MDU0IDczOTEzOTA5ODgwLjM4MTM2Nzg5NTIwNTA4NjAyNzQxNiAtPiAtMQorZGl2eDMyMDMgZGl2aWRlIC01Njc1OTE1LjI0NjU0NTc0ODc2MzIyNTAyNDUyMDkwNTQgNzM5MTM5MDk4ODAuMzgxMzY3ODk1MjA1MDg2MDI3NDE2IC0+IC0wLjAwMDA3Njc5MDg5NDM3NjA1NjgyNzU1MjM4ODA1NDY1NzA4MiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjAzIGRpdmlkZWludCAtNTY3NTkxNS4yNDY1NDU3NDg3NjMyMjUwMjQ1MjA5MDU0IDczOTEzOTA5ODgwLjM4MTM2Nzg5NTIwNTA4NjAyNzQxNiAtPiAtMAorbXVseDMyMDMgbXVsdGlwbHkgLTU2NzU5MTUuMjQ2NTQ1NzQ4NzYzMjI1MDI0NTIwOTA1NCA3MzkxMzkwOTg4MC4zODEzNjc4OTUyMDUwODYwMjc0MTYgLT4gLTQxOTUyOTA4ODAyMTg2NTA2Ny4yMzMwNzM1Mjk3MzU4OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjAzIHBvd2VyIC01Njc1OTE1LjI0NjU0NTc0ODc2MzIyNTAyNDUyMDkwNTQgNyAtPiAtMS44OTc4MDM4MDYwMjA3Nzc3MjMxMzg5MjM0NzIxOTA4RSs0NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjAzIHJlbWFpbmRlciAtNTY3NTkxNS4yNDY1NDU3NDg3NjMyMjUwMjQ1MjA5MDU0IDczOTEzOTA5ODgwLjM4MTM2Nzg5NTIwNTA4NjAyNzQxNiAtPiAtNTY3NTkxNS4yNDY1NDU3NDg3NjMyMjUwMjQ1MjA5MDU0CitzdWJ4MzIwMyBzdWJ0cmFjdCAtNTY3NTkxNS4yNDY1NDU3NDg3NjMyMjUwMjQ1MjA5MDU0IDczOTEzOTA5ODgwLjM4MTM2Nzg5NTIwNTA4NjAyNzQxNiAtPiAtNzM5MTk1ODU3OTUuNjI3OTEzNjQzOTY4MzExMDUxOTM3IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMDQgYWRkIDk3LjY0NzMyMTE3MjU1NTE0NDkwMDY4NTYwNTMxODYzNSA0Ljg2MjA5MTE1ODc1NDc1NDg3NTEyMDk4NDE1NzA4ODUgLT4gMTAyLjUwOTQxMjMzMTMwOTg5OTc3NTgwNjU4OTQ3NTcyIEluZXhhY3QgUm91bmRlZAorY29teDMyMDQgY29tcGFyZSA5Ny42NDczMjExNzI1NTUxNDQ5MDA2ODU2MDUzMTg2MzUgNC44NjIwOTExNTg3NTQ3NTQ4NzUxMjA5ODQxNTcwODg1IC0+IDEKK2RpdngzMjA0IGRpdmlkZSA5Ny42NDczMjExNzI1NTUxNDQ5MDA2ODU2MDUzMTg2MzUgNC44NjIwOTExNTg3NTQ3NTQ4NzUxMjA5ODQxNTcwODg1IC0+IDIwLjA4MzM5OTkxNjY2NTQ2NjM3NDc0MTcwODk0OTYyMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjA0IGRpdmlkZWludCA5Ny42NDczMjExNzI1NTUxNDQ5MDA2ODU2MDUzMTg2MzUgNC44NjIwOTExNTg3NTQ3NTQ4NzUxMjA5ODQxNTcwODg1IC0+IDIwCittdWx4MzIwNCBtdWx0aXBseSA5Ny42NDczMjExNzI1NTUxNDQ5MDA2ODU2MDUzMTg2MzUgNC44NjIwOTExNTg3NTQ3NTQ4NzUxMjA5ODQxNTcwODg1IC0+IDQ3NC43NzAxNzY5NDkxNjYzNTM5ODY1MjI3NjA0MjE3NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA0IHBvd2VyIDk3LjY0NzMyMTE3MjU1NTE0NDkwMDY4NTYwNTMxODYzNSA1IC0+IDg4Nzc3MjQ1NzguNzkzNTMxMjkzOTIzMTgyODcxOTg0MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjA0IHJlbWFpbmRlciA5Ny42NDczMjExNzI1NTUxNDQ5MDA2ODU2MDUzMTg2MzUgNC44NjIwOTExNTg3NTQ3NTQ4NzUxMjA5ODQxNTcwODg1IC0+IDAuNDA1NDk3OTk3NDYwMDQ3Mzk4MjY1OTIyMTc2ODY1MAorc3VieDMyMDQgc3VidHJhY3QgOTcuNjQ3MzIxMTcyNTU1MTQ0OTAwNjg1NjA1MzE4NjM1IDQuODYyMDkxMTU4NzU0NzU0ODc1MTIwOTg0MTU3MDg4NSAtPiA5Mi43ODUyMzAwMTM4MDAzOTAwMjU1NjQ2MjExNjE1NDcgSW5leGFjdCBSb3VuZGVkCithZGR4MzIwNSBhZGQgLTk3MTcyNTMyNjcwMjQuNTM4MDY1MTQzNTQzNTYwMzU1MiAtMjY2OS4yNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjMgLT4gLTIuNjY5MjUzOTY5NTE5MzgyMDQyNDAwMjAxMzQ4ODQ4MEUrMzY2IEluZXhhY3QgUm91bmRlZAorY29teDMyMDUgY29tcGFyZSAtOTcxNzI1MzI2NzAyNC41MzgwNjUxNDM1NDM1NjAzNTUyIC0yNjY5LjI1Mzk2OTUxOTM4MjA0MjQwMDIwMTM0ODg0ODBFKzM2MyAtPiAxCitkaXZ4MzIwNSBkaXZpZGUgLTk3MTcyNTMyNjcwMjQuNTM4MDY1MTQzNTQzNTYwMzU1MiAtMjY2OS4yNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjMgLT4gMy42NDA0Mzc4ODE4OTAzNDYyNjk1NjMzMzM3NjMxMDk4RS0zNTQgSW5leGFjdCBSb3VuZGVkCitkdml4MzIwNSBkaXZpZGVpbnQgLTk3MTcyNTMyNjcwMjQuNTM4MDY1MTQzNTQzNTYwMzU1MiAtMjY2OS4yNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjMgLT4gMAorbXVseDMyMDUgbXVsdGlwbHkgLTk3MTcyNTMyNjcwMjQuNTM4MDY1MTQzNTQzNTYwMzU1MiAtMjY2OS4yNTM5Njk1MTkzODIwNDI0MDAyMDEzNDg4NDgwRSszNjMgLT4gMi41OTM3ODE2ODU1ODMwNDMxODk5MTIzMjE3OTEyMTQ0RSszNzkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwNSBwb3dlciAtOTcxNzI1MzI2NzAyNC41MzgwNjUxNDM1NDM1NjAzNTUyIC0zIC0+IC0xLjA4OTg1Njc4ODAwODUzMzc3ODAwNDEzMjg2NjEzMzBFLTM5IEluZXhhY3QgUm91bmRlZAorcmVteDMyMDUgcmVtYWluZGVyIC05NzE3MjUzMjY3MDI0LjUzODA2NTE0MzU0MzU2MDM1NTIgLTI2NjkuMjUzOTY5NTE5MzgyMDQyNDAwMjAxMzQ4ODQ4MEUrMzYzIC0+IC05NzE3MjUzMjY3MDI0LjUzODA2NTE0MzU0MzU2MDM1NTIKK3N1YngzMjA1IHN1YnRyYWN0IC05NzE3MjUzMjY3MDI0LjUzODA2NTE0MzU0MzU2MDM1NTIgLTI2NjkuMjUzOTY5NTE5MzgyMDQyNDAwMjAxMzQ4ODQ4MEUrMzYzIC0+IDIuNjY5MjUzOTY5NTE5MzgyMDQyNDAwMjAxMzQ4ODQ4MEUrMzY2IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMDYgYWRkIC00LjA4MTczOTE3MTcxOTAxMjg1MDYwODMwMDE3MDIzMzVFLTc2NyAxMjc3Mi44MDcxMDU5MjA3MTI2NjA5OTEwMzM2ODkyMDYgLT4gMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IEluZXhhY3QgUm91bmRlZAorY29teDMyMDYgY29tcGFyZSAtNC4wODE3MzkxNzE3MTkwMTI4NTA2MDgzMDAxNzAyMzM1RS03NjcgMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IC0+IC0xCitkaXZ4MzIwNiBkaXZpZGUgLTQuMDgxNzM5MTcxNzE5MDEyODUwNjA4MzAwMTcwMjMzNUUtNzY3IDEyNzcyLjgwNzEwNTkyMDcxMjY2MDk5MTAzMzY4OTIwNiAtPiAtMy4xOTU2NDc3MDUyMTUwNTkzMTc1MjA2NzY5ODkxNDM0RS03NzEgSW5leGFjdCBSb3VuZGVkCitkdml4MzIwNiBkaXZpZGVpbnQgLTQuMDgxNzM5MTcxNzE5MDEyODUwNjA4MzAwMTcwMjMzNUUtNzY3IDEyNzcyLjgwNzEwNTkyMDcxMjY2MDk5MTAzMzY4OTIwNiAtPiAtMAorbXVseDMyMDYgbXVsdGlwbHkgLTQuMDgxNzM5MTcxNzE5MDEyODUwNjA4MzAwMTcwMjMzNUUtNzY3IDEyNzcyLjgwNzEwNTkyMDcxMjY2MDk5MTAzMzY4OTIwNiAtPiAtNS4yMTM1MjY3MDk3MDQ3NTMxMzM2MTAwNzUwMTEwMzE0RS03NjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwNiBwb3dlciAtNC4wODE3MzkxNzE3MTkwMTI4NTA2MDgzMDAxNzAyMzM1RS03NjcgMTI3NzMgLT4gLTBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjA2IHJlbWFpbmRlciAtNC4wODE3MzkxNzE3MTkwMTI4NTA2MDgzMDAxNzAyMzM1RS03NjcgMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IC0+IC00LjA4MTczOTE3MTcxOTAxMjg1MDYwODMwMDE3MDIzMzVFLTc2Nworc3VieDMyMDYgc3VidHJhY3QgLTQuMDgxNzM5MTcxNzE5MDEyODUwNjA4MzAwMTcwMjMzNUUtNzY3IDEyNzcyLjgwNzEwNTkyMDcxMjY2MDk5MTAzMzY4OTIwNiAtPiAtMTI3NzIuODA3MTA1OTIwNzEyNjYwOTkxMDMzNjg5MjA2IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMDcgYWRkIDY4NjI1MzIyNjU1OTM0MTQ2ODQ1MDAzMDI4OTI4NjQ3IC01OS42MzQxNjk5NDQ4NDAyODAxNTk3ODI0ODgwOTg3MDAgLT4gNjg2MjUzMjI2NTU5MzQxNDY4NDUwMDMwMjg5Mjg1ODcgSW5leGFjdCBSb3VuZGVkCitjb214MzIwNyBjb21wYXJlIDY4NjI1MzIyNjU1OTM0MTQ2ODQ1MDAzMDI4OTI4NjQ3IC01OS42MzQxNjk5NDQ4NDAyODAxNTk3ODI0ODgwOTg3MDAgLT4gMQorZGl2eDMyMDcgZGl2aWRlIDY4NjI1MzIyNjU1OTM0MTQ2ODQ1MDAzMDI4OTI4NjQ3IC01OS42MzQxNjk5NDQ4NDAyODAxNTk3ODI0ODgwOTg3MDAgLT4gLTExNTA3NzE4MjYyNzY5NTQ5NDY4NDQzMjI5ODgxOTIuNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjA3IGRpdmlkZWludCA2ODYyNTMyMjY1NTkzNDE0Njg0NTAwMzAyODkyODY0NyAtNTkuNjM0MTY5OTQ0ODQwMjgwMTU5NzgyNDg4MDk4NzAwIC0+IC0xMTUwNzcxODI2Mjc2OTU0OTQ2ODQ0MzIyOTg4MTkyCittdWx4MzIwNyBtdWx0aXBseSA2ODYyNTMyMjY1NTkzNDE0Njg0NTAwMzAyODkyODY0NyAtNTkuNjM0MTY5OTQ0ODQwMjgwMTU5NzgyNDg4MDk4NzAwIC0+IC00LjA5MjQxNDE1Mzc4MzQ3NDg1MDExNDAxNTE5OTc3NzhFKzMzIEluZXhhY3QgUm91bmRlZAorcG93eDMyMDcgcG93ZXIgNjg2MjUzMjI2NTU5MzQxNDY4NDUwMDMwMjg5Mjg2NDcgLTYwIC0+IDYuNDcwNDczMTExMTk0MzM3MDE3MTcxMTEzMTk0MjYwM0UtMTkxMSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjA3IHJlbWFpbmRlciA2ODYyNTMyMjY1NTkzNDE0Njg0NTAwMzAyODkyODY0NyAtNTkuNjM0MTY5OTQ0ODQwMjgwMTU5NzgyNDg4MDk4NzAwIC0+IDI4LjIwMTI1NDAwNDg5NzI1NzU1MjkzOTM2OTQ0OTYwMAorc3VieDMyMDcgc3VidHJhY3QgNjg2MjUzMjI2NTU5MzQxNDY4NDUwMDMwMjg5Mjg2NDcgLTU5LjYzNDE2OTk0NDg0MDI4MDE1OTc4MjQ4ODA5ODcwMCAtPiA2ODYyNTMyMjY1NTkzNDE0Njg0NTAwMzAyODkyODcwNyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjA4IGFkZCA3MzI1MTUuNzY1MzIwNDkyOTA4MTU2NjU4NTY3Mjc2NDEgLTkyMTM0NDc5ODM1ODIxLjMxOTYxOTgyNzAyMzcyOTgyOSAtPiAtOTIxMzQ0NzkxMDMzMDUuNTU0Mjk5MzM0MTE1NTczMTcwIEluZXhhY3QgUm91bmRlZAorY29teDMyMDggY29tcGFyZSA3MzI1MTUuNzY1MzIwNDkyOTA4MTU2NjU4NTY3Mjc2NDEgLTkyMTM0NDc5ODM1ODIxLjMxOTYxOTgyNzAyMzcyOTgyOSAtPiAxCitkaXZ4MzIwOCBkaXZpZGUgNzMyNTE1Ljc2NTMyMDQ5MjkwODE1NjY1ODU2NzI3NjQxIC05MjEzNDQ3OTgzNTgyMS4zMTk2MTk4MjcwMjM3Mjk4MjkgLT4gLTcuOTUwNTA2MzMxODk0Mzg0NjY1NTU5Mzg4Nzk5MTkxNEUtOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjA4IGRpdmlkZWludCA3MzI1MTUuNzY1MzIwNDkyOTA4MTU2NjU4NTY3Mjc2NDEgLTkyMTM0NDc5ODM1ODIxLjMxOTYxOTgyNzAyMzcyOTgyOSAtPiAtMAorbXVseDMyMDggbXVsdGlwbHkgNzMyNTE1Ljc2NTMyMDQ5MjkwODE1NjY1ODU2NzI3NjQxIC05MjEzNDQ3OTgzNTgyMS4zMTk2MTk4MjcwMjM3Mjk4MjkgLT4gLTY3NDg5OTU5MDA5MzQyMTc1NzI4LjcxMDQ5NDM1NjMyMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjA4IHBvd2VyIDczMjUxNS43NjUzMjA0OTI5MDgxNTY2NTg1NjcyNzY0MSAtOSAtPiAxLjY0NjgyNDEwNTA0NDM0NzEzNTkzNTgwMTY1ODU4NzdFLTUzIEluZXhhY3QgUm91bmRlZAorcmVteDMyMDggcmVtYWluZGVyIDczMjUxNS43NjUzMjA0OTI5MDgxNTY2NTg1NjcyNzY0MSAtOTIxMzQ0Nzk4MzU4MjEuMzE5NjE5ODI3MDIzNzI5ODI5IC0+IDczMjUxNS43NjUzMjA0OTI5MDgxNTY2NTg1NjcyNzY0MQorc3VieDMyMDggc3VidHJhY3QgNzMyNTE1Ljc2NTMyMDQ5MjkwODE1NjY1ODU2NzI3NjQxIC05MjEzNDQ3OTgzNTgyMS4zMTk2MTk4MjcwMjM3Mjk4MjkgLT4gOTIxMzQ0ODA1NjgzMzcuMDg0OTQwMzE5OTMxODg2NDg4IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMDkgYWRkIC0zMC40NTgwMTE5NDI5NzgzMzg0MjE2NzY0NTQ3Nzg3MzMgLTUwMjMzNzIwMjQ1OTc2NjUxMDIzMzY0MzA0MTA0MDNFKzgzMSAtPiAtNS4wMjMzNzIwMjQ1OTc2NjUxMDIzMzY0MzA0MTA0MDMwRSs4NjEgSW5leGFjdCBSb3VuZGVkCitjb214MzIwOSBjb21wYXJlIC0zMC40NTgwMTE5NDI5NzgzMzg0MjE2NzY0NTQ3Nzg3MzMgLTUwMjMzNzIwMjQ1OTc2NjUxMDIzMzY0MzA0MTA0MDNFKzgzMSAtPiAxCitkaXZ4MzIwOSBkaXZpZGUgLTMwLjQ1ODAxMTk0Mjk3ODMzODQyMTY3NjQ1NDc3ODczMyAtNTAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwM0UrODMxIC0+IDYuMDYzMjYwMjU1MDMxMTQxMDgyMTQ4MzAwMTMwNTAxMEUtODYxIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMDkgZGl2aWRlaW50IC0zMC40NTgwMTE5NDI5NzgzMzg0MjE2NzY0NTQ3Nzg3MzMgLTUwMjMzNzIwMjQ1OTc2NjUxMDIzMzY0MzA0MTA0MDNFKzgzMSAtPiAwCittdWx4MzIwOSBtdWx0aXBseSAtMzAuNDU4MDExOTQyOTc4MzM4NDIxNjc2NDU0Nzc4NzMzIC01MDIzMzcyMDI0NTk3NjY1MTAyMzM2NDMwNDEwNDAzRSs4MzEgLT4gMS41MzAwMTkyNTExOTIxODk1OTI5MDMxODE4NjM4OTYxRSs4NjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIwOSBwb3dlciAtMzAuNDU4MDExOTQyOTc4MzM4NDIxNjc2NDU0Nzc4NzMzIC01IC0+IC0zLjgxNDk3OTc0ODE0MDUxMzYwNDI0ODc2NDMyNTMxMDlFLTggSW5leGFjdCBSb3VuZGVkCityZW14MzIwOSByZW1haW5kZXIgLTMwLjQ1ODAxMTk0Mjk3ODMzODQyMTY3NjQ1NDc3ODczMyAtNTAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwM0UrODMxIC0+IC0zMC40NTgwMTE5NDI5NzgzMzg0MjE2NzY0NTQ3Nzg3MzMKK3N1YngzMjA5IHN1YnRyYWN0IC0zMC40NTgwMTE5NDI5NzgzMzg0MjE2NzY0NTQ3Nzg3MzMgLTUwMjMzNzIwMjQ1OTc2NjUxMDIzMzY0MzA0MTA0MDNFKzgzMSAtPiA1LjAyMzM3MjAyNDU5NzY2NTEwMjMzNjQzMDQxMDQwMzBFKzg2MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjEwIGFkZCAtODk2NDAuMDk0MTQ5NDE0NjQ0NjYwNDgwMjg2NDMwNDYyIC01ODcwMzQxOTc1OC44MDA4ODk5MDMyMjc1MDkyMTU0NzQgLT4gLTU4NzAzNTA5Mzk4Ljg5NTAzOTMxNzg3MjE2OTY5NTc2MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjEwIGNvbXBhcmUgLTg5NjQwLjA5NDE0OTQxNDY0NDY2MDQ4MDI4NjQzMDQ2MiAtNTg3MDM0MTk3NTguODAwODg5OTAzMjI3NTA5MjE1NDc0IC0+IDEKK2RpdngzMjEwIGRpdmlkZSAtODk2NDAuMDk0MTQ5NDE0NjQ0NjYwNDgwMjg2NDMwNDYyIC01ODcwMzQxOTc1OC44MDA4ODk5MDMyMjc1MDkyMTU0NzQgLT4gMC4wMDAwMDE1MjY5OTk1MjYwNTM2MDI1MjM3MTY3MTk5OTcwMjM4IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMTAgZGl2aWRlaW50IC04OTY0MC4wOTQxNDk0MTQ2NDQ2NjA0ODAyODY0MzA0NjIgLTU4NzAzNDE5NzU4LjgwMDg4OTkwMzIyNzUwOTIxNTQ3NCAtPiAwCittdWx4MzIxMCBtdWx0aXBseSAtODk2NDAuMDk0MTQ5NDE0NjQ0NjYwNDgwMjg2NDMwNDYyIC01ODcwMzQxOTc1OC44MDA4ODk5MDMyMjc1MDkyMTU0NzQgLT4gNTI2MjE4MDA3NDA3MTUxOS43MDE4MjUyMTcxNTc5NzUzIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTAgcG93ZXIgLTg5NjQwLjA5NDE0OTQxNDY0NDY2MDQ4MDI4NjQzMDQ2MiAtNiAtPiAxLjkyNzQ2MzU1OTExNjU0MDU4ODg3MjQ1OTUxNjU3NDFFLTMwIEluZXhhY3QgUm91bmRlZAorcmVteDMyMTAgcmVtYWluZGVyIC04OTY0MC4wOTQxNDk0MTQ2NDQ2NjA0ODAyODY0MzA0NjIgLTU4NzAzNDE5NzU4LjgwMDg4OTkwMzIyNzUwOTIxNTQ3NCAtPiAtODk2NDAuMDk0MTQ5NDE0NjQ0NjYwNDgwMjg2NDMwNDYyCitzdWJ4MzIxMCBzdWJ0cmFjdCAtODk2NDAuMDk0MTQ5NDE0NjQ0NjYwNDgwMjg2NDMwNDYyIC01ODcwMzQxOTc1OC44MDA4ODk5MDMyMjc1MDkyMTU0NzQgLT4gNTg3MDMzMzAxMTguNzA2NzQwNDg4NTgyODQ4NzM1MTg4IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMTEgYWRkIDQ1ODY1My4xNTY3ODcwMDgxODEwMDUyOTE3NzE0MjU5IDE4MzUzMTA2MjM4LjUxNjIzNTExNjA4MDQ0OTgxNDA1M0UtMDM4IC0+IDQ1ODY1My4xNTY3ODcwMDgxODEwMDUyOTE3NzE0MjU5MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjExIGNvbXBhcmUgNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkgMTgzNTMxMDYyMzguNTE2MjM1MTE2MDgwNDQ5ODE0MDUzRS0wMzggLT4gMQorZGl2eDMyMTEgZGl2aWRlIDQ1ODY1My4xNTY3ODcwMDgxODEwMDUyOTE3NzE0MjU5IDE4MzUzMTA2MjM4LjUxNjIzNTExNjA4MDQ0OTgxNDA1M0UtMDM4IC0+IDIuNDk5MDQ5MjExNzU5NDE2MDIxNTY0MTMxMTc2MDQ5OEUrMzMgSW5leGFjdCBSb3VuZGVkCitkdml4MzIxMSBkaXZpZGVpbnQgNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkgMTgzNTMxMDYyMzguNTE2MjM1MTE2MDgwNDQ5ODE0MDUzRS0wMzggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjExIG11bHRpcGx5IDQ1ODY1My4xNTY3ODcwMDgxODEwMDUyOTE3NzE0MjU5IDE4MzUzMTA2MjM4LjUxNjIzNTExNjA4MDQ0OTgxNDA1M0UtMDM4IC0+IDguNDE3NzEwMTEzMTQyODA0NzQ5Nzk5ODU5NDM3OTU5M0UtMjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxMSBwb3dlciA0NTg2NTMuMTU2Nzg3MDA4MTgxMDA1MjkxNzcxNDI1OSAyIC0+IDIxMDM2MjcxODIzMC42ODc5MDg2NTExNzQ1MjQyOTk5MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjExIHJlbWFpbmRlciA0NTg2NTMuMTU2Nzg3MDA4MTgxMDA1MjkxNzcxNDI1OSAxODM1MzEwNjIzOC41MTYyMzUxMTYwODA0NDk4MTQwNTNFLTAzOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyMTEgc3VidHJhY3QgNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkgMTgzNTMxMDYyMzguNTE2MjM1MTE2MDgwNDQ5ODE0MDUzRS0wMzggLT4gNDU4NjUzLjE1Njc4NzAwODE4MTAwNTI5MTc3MTQyNTkwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMTIgYWRkIDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMjEwNTE2MzguODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzIgLT4gLTIuMTA1MTYzODgxNjQzMjgxNzM5MzIwMjI2MjcxMDYzMEUrNDM5IEluZXhhY3QgUm91bmRlZAorY29teDMyMTIgY29tcGFyZSA5MTMzOTEuNDI3NDQyMjQ0NTgyMTYxNzQ5Njc4NTM3MjIgLTIxMDUxNjM4LjgxNjQzMjgxNzM5MzIwMjI2MjcxMDYzMEUrNDMyIC0+IDEKK2RpdngzMjEyIGRpdmlkZSA5MTMzOTEuNDI3NDQyMjQ0NTgyMTYxNzQ5Njc4NTM3MjIgLTIxMDUxNjM4LjgxNjQzMjgxNzM5MzIwMjI2MjcxMDYzMEUrNDMyIC0+IC00LjMzODgxMzg4MjQxMDIxNTExMjcyNzMyNTkwOTI2MTNFLTQzNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjEyIGRpdmlkZWludCA5MTMzOTEuNDI3NDQyMjQ0NTgyMTYxNzQ5Njc4NTM3MjIgLTIxMDUxNjM4LjgxNjQzMjgxNzM5MzIwMjI2MjcxMDYzMEUrNDMyIC0+IC0wCittdWx4MzIxMiBtdWx0aXBseSA5MTMzOTEuNDI3NDQyMjQ0NTgyMTYxNzQ5Njc4NTM3MjIgLTIxMDUxNjM4LjgxNjQzMjgxNzM5MzIwMjI2MjcxMDYzMEUrNDMyIC0+IC0xLjkyMjgzODY0Mjg1NDAxMzUzNDA2MDA4MzY3MDcyNzBFKzQ0NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjEyIHBvd2VyIDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMiAtPiAxLjE5ODYzMjc0Mzk5NzE1MzI0NzAyOTczMDAxMjgwNzRFLTEyIEluZXhhY3QgUm91bmRlZAorcmVteDMyMTIgcmVtYWluZGVyIDkxMzM5MS40Mjc0NDIyNDQ1ODIxNjE3NDk2Nzg1MzcyMiAtMjEwNTE2MzguODE2NDMyODE3MzkzMjAyMjYyNzEwNjMwRSs0MzIgLT4gOTEzMzkxLjQyNzQ0MjI0NDU4MjE2MTc0OTY3ODUzNzIyCitzdWJ4MzIxMiBzdWJ0cmFjdCA5MTMzOTEuNDI3NDQyMjQ0NTgyMTYxNzQ5Njc4NTM3MjIgLTIxMDUxNjM4LjgxNjQzMjgxNzM5MzIwMjI2MjcxMDYzMEUrNDMyIC0+IDIuMTA1MTYzODgxNjQzMjgxNzM5MzIwMjI2MjcxMDYzMEUrNDM5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMTMgYWRkIC05MTc1OTE0NTY4MjkuMTIxMDkwMjc0ODQzOTk1MzY1NjcgLTI4ODkyMTc3NzI2ODU4MDI2OTU1NTEzNDM4ODQzMzcxRSs3MDggLT4gLTIuODg5MjE3NzcyNjg1ODAyNjk1NTUxMzQzODg0MzM3MUUrNzM5IEluZXhhY3QgUm91bmRlZAorY29teDMyMTMgY29tcGFyZSAtOTE3NTkxNDU2ODI5LjEyMTA5MDI3NDg0Mzk5NTM2NTY3IC0yODg5MjE3NzcyNjg1ODAyNjk1NTUxMzQzODg0MzM3MUUrNzA4IC0+IDEKK2RpdngzMjEzIGRpdmlkZSAtOTE3NTkxNDU2ODI5LjEyMTA5MDI3NDg0Mzk5NTM2NTY3IC0yODg5MjE3NzcyNjg1ODAyNjk1NTUxMzQzODg0MzM3MUUrNzA4IC0+IDMuMTc1OTE2NTU5NTA1NzY3NDE5NjY0NDkyNzEwNjQ0N0UtNzI4IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMTMgZGl2aWRlaW50IC05MTc1OTE0NTY4MjkuMTIxMDkwMjc0ODQzOTk1MzY1NjcgLTI4ODkyMTc3NzI2ODU4MDI2OTU1NTEzNDM4ODQzMzcxRSs3MDggLT4gMAorbXVseDMyMTMgbXVsdGlwbHkgLTkxNzU5MTQ1NjgyOS4xMjEwOTAyNzQ4NDM5OTUzNjU2NyAtMjg4OTIxNzc3MjY4NTgwMjY5NTU1MTM0Mzg4NDMzNzFFKzcwOCAtPiAyLjY1MTEyMTU0NTEzNTM1NDExNTY3MDM5MTQ3MjE3MjVFKzc1MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjEzIHBvd2VyIC05MTc1OTE0NTY4MjkuMTIxMDkwMjc0ODQzOTk1MzY1NjcgLTMgLT4gLTEuMjk0MzUwNTU5MTg1MzczOTI0MDAwMzQ1MzM0MTkxMUUtMzYgSW5leGFjdCBSb3VuZGVkCityZW14MzIxMyByZW1haW5kZXIgLTkxNzU5MTQ1NjgyOS4xMjEwOTAyNzQ4NDM5OTUzNjU2NyAtMjg4OTIxNzc3MjY4NTgwMjY5NTU1MTM0Mzg4NDMzNzFFKzcwOCAtPiAtOTE3NTkxNDU2ODI5LjEyMTA5MDI3NDg0Mzk5NTM2NTY3CitzdWJ4MzIxMyBzdWJ0cmFjdCAtOTE3NTkxNDU2ODI5LjEyMTA5MDI3NDg0Mzk5NTM2NTY3IC0yODg5MjE3NzcyNjg1ODAyNjk1NTUxMzQzODg0MzM3MUUrNzA4IC0+IDIuODg5MjE3NzcyNjg1ODAyNjk1NTUxMzQzODg0MzM3MUUrNzM5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMTQgYWRkIDM0OTM4NDEwODQwNjQ1LjkxMzM5OTY5OTIxOTIyODIxOCAzMC44MTgyMjAzOTMyNDI0MDI4NDYwNzc3NTU0ODA1NDggLT4gMzQ5Mzg0MTA4NDA2NzYuNzMxNjIwMDkyNDYxNjMxMDY0IEluZXhhY3QgUm91bmRlZAorY29teDMyMTQgY29tcGFyZSAzNDkzODQxMDg0MDY0NS45MTMzOTk2OTkyMTkyMjgyMTggMzAuODE4MjIwMzkzMjQyNDAyODQ2MDc3NzU1NDgwNTQ4IC0+IDEKK2RpdngzMjE0IGRpdmlkZSAzNDkzODQxMDg0MDY0NS45MTMzOTk2OTkyMTkyMjgyMTggMzAuODE4MjIwMzkzMjQyNDAyODQ2MDc3NzU1NDgwNTQ4IC0+IDExMzM2OTMzMjc5OTkuNzg3OTUwMzI2MDA5ODY2Njk2NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjE0IGRpdmlkZWludCAzNDkzODQxMDg0MDY0NS45MTMzOTk2OTkyMTkyMjgyMTggMzAuODE4MjIwMzkzMjQyNDAyODQ2MDc3NzU1NDgwNTQ4IC0+IDExMzM2OTMzMjc5OTkKK211bHgzMjE0IG11bHRpcGx5IDM0OTM4NDEwODQwNjQ1LjkxMzM5OTY5OTIxOTIyODIxOCAzMC44MTgyMjAzOTMyNDI0MDI4NDYwNzc3NTU0ODA1NDggLT4gMTA3NjczOTY0NTQ3NjY3NS4zMzE4NTE5Mjg5MTI4OTYxIEluZXhhY3QgUm91bmRlZAorcG93eDMyMTQgcG93ZXIgMzQ5Mzg0MTA4NDA2NDUuOTEzMzk5Njk5MjE5MjI4MjE4IDMxIC0+IDYuOTU2NjA4NTk1ODc5ODczMjc4NjUwOTkwOTY4MzI2N0UrNDE5IEluZXhhY3QgUm91bmRlZAorcmVteDMyMTQgcmVtYWluZGVyIDM0OTM4NDEwODQwNjQ1LjkxMzM5OTY5OTIxOTIyODIxOCAzMC44MTgyMjAzOTMyNDI0MDI4NDYwNzc3NTU0ODA1NDggLT4gMjQuMjgzMjI2ODA1ODk5MjczNTUxMzc2MzcxNzM2NTQ4CitzdWJ4MzIxNCBzdWJ0cmFjdCAzNDkzODQxMDg0MDY0NS45MTMzOTk2OTkyMTkyMjgyMTggMzAuODE4MjIwMzkzMjQyNDAyODQ2MDc3NzU1NDgwNTQ4IC0+IDM0OTM4NDEwODQwNjE1LjA5NTE3OTMwNTk3NjgyNTM3MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjE1IGFkZCA2MDM0LjczNzQ0MTEwMjI1OTgwODE3NDUwMDY3NjkwMjNFLTUxNyAyOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyAtPiAyOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjE1IGNvbXBhcmUgNjAzNC43Mzc0NDExMDIyNTk4MDgxNzQ1MDA2NzY5MDIzRS01MTcgMjk3NzE4MzM0MjgwNTQ3MDkwNzc4NTA1ODg5MDQ2NTMgLT4gLTEKK2RpdngzMjE1IGRpdmlkZSA2MDM0LjczNzQ0MTEwMjI1OTgwODE3NDUwMDY3NjkwMjNFLTUxNyAyOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyAtPiAyLjAyNjk5NTU2ODAzNzY2ODM1MjYwOTk0NDQ1MjM2OTFFLTU0NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjE1IGRpdmlkZWludCA2MDM0LjczNzQ0MTEwMjI1OTgwODE3NDUwMDY3NjkwMjNFLTUxNyAyOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyAtPiAwCittdWx4MzIxNSBtdWx0aXBseSA2MDM0LjczNzQ0MTEwMjI1OTgwODE3NDUwMDY3NjkwMjNFLTUxNyAyOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyAtPiAxLjc5NjY1MTk3ODc4NTQxNTk0NjQzODIzNTk0MTE2NDJFLTQ4MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjE1IHBvd2VyIDYwMzQuNzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE3IDMgLT4gMi4xOTc3MzQwNTk3MzAxODQwNjgxNTI4NTA3NjQwMDMyRS0xNTQwIEluZXhhY3QgUm91bmRlZAorcmVteDMyMTUgcmVtYWluZGVyIDYwMzQuNzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE3IDI5NzcxODMzNDI4MDU0NzA5MDc3ODUwNTg4OTA0NjUzIC0+IDYuMDM0NzM3NDQxMTAyMjU5ODA4MTc0NTAwNjc2OTAyM0UtNTE0CitzdWJ4MzIxNSBzdWJ0cmFjdCA2MDM0LjczNzQ0MTEwMjI1OTgwODE3NDUwMDY3NjkwMjNFLTUxNyAyOTc3MTgzMzQyODA1NDcwOTA3Nzg1MDU4ODkwNDY1MyAtPiAtMjk3NzE4MzM0MjgwNTQ3MDkwNzc4NTA1ODg5MDQ2NTMgSW5leGFjdCBSb3VuZGVkCithZGR4MzIxNiBhZGQgLTU1NjU3NDc2NzE3MzQuMTY4NjAwOTcwNTU3NDUwMzE1MiAtNDkwLjMwODk5NDk0ODgxMDcxMjgyNzg3NDg3MDMwMzAzIC0+IC01NTY1NzQ3NjcyMjI0LjQ3NzU5NTkxOTM2ODE2MzE0MzEgSW5leGFjdCBSb3VuZGVkCitjb214MzIxNiBjb21wYXJlIC01NTY1NzQ3NjcxNzM0LjE2ODYwMDk3MDU1NzQ1MDMxNTIgLTQ5MC4zMDg5OTQ5NDg4MTA3MTI4Mjc4NzQ4NzAzMDMwMyAtPiAtMQorZGl2eDMyMTYgZGl2aWRlIC01NTY1NzQ3NjcxNzM0LjE2ODYwMDk3MDU1NzQ1MDMxNTIgLTQ5MC4zMDg5OTQ5NDg4MTA3MTI4Mjc4NzQ4NzAzMDMwMyAtPiAxMTM1MTUxMDQzMy4zNjUwNzQ4NzE1NzQ1MTk3NTYyNDUgSW5leGFjdCBSb3VuZGVkCitkdml4MzIxNiBkaXZpZGVpbnQgLTU1NjU3NDc2NzE3MzQuMTY4NjAwOTcwNTU3NDUwMzE1MiAtNDkwLjMwODk5NDk0ODgxMDcxMjgyNzg3NDg3MDMwMzAzIC0+IDExMzUxNTEwNDMzCittdWx4MzIxNiBtdWx0aXBseSAtNTU2NTc0NzY3MTczNC4xNjg2MDA5NzA1NTc0NTAzMTUyIC00OTAuMzA4OTk0OTQ4ODEwNzEyODI3ODc0ODcwMzAzMDMgLT4gMjcyODkzNjE0NzA2NjY2My40NTgwMDY0NDI4NjM5NzQ1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMTYgcG93ZXIgLTU1NjU3NDc2NzE3MzQuMTY4NjAwOTcwNTU3NDUwMzE1MiAtNDkwIC0+IDQuOTM3MTc0NTI5NzYxOTUyNjExMzk5MTcyODk1MzE5N0UtNjI0NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjE2IHJlbWFpbmRlciAtNTU2NTc0NzY3MTczNC4xNjg2MDA5NzA1NTc0NTAzMTUyIC00OTAuMzA4OTk0OTQ4ODEwNzEyODI3ODc0ODcwMzAzMDMgLT4gLTE3OC45OTk0OTMzNjI3Njg5MjY4NTE4MzMwODM0ODgwMQorc3VieDMyMTYgc3VidHJhY3QgLTU1NjU3NDc2NzE3MzQuMTY4NjAwOTcwNTU3NDUwMzE1MiAtNDkwLjMwODk5NDk0ODgxMDcxMjgyNzg3NDg3MDMwMzAzIC0+IC01NTY1NzQ3NjcxMjQzLjg1OTYwNjAyMTc0NjczNzQ4NzMgSW5leGFjdCBSb3VuZGVkCithZGR4MzIxNyBhZGQgMzE5NTQ1NTExLjg5MjAzNDk1NTQ2Njg5MjczNTY0NzI4RSswMzYgLTI5NTU5NDM1MzM5NDMzMjE4OTkxNTAzMTAxOTIwNjEgLT4gMy4xOTU0NTUxMTg5MjAzMTk5OTUyMzM1ODc5MjMyNTM4RSs0NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjE3IGNvbXBhcmUgMzE5NTQ1NTExLjg5MjAzNDk1NTQ2Njg5MjczNTY0NzI4RSswMzYgLTI5NTU5NDM1MzM5NDMzMjE4OTkxNTAzMTAxOTIwNjEgLT4gMQorZGl2eDMyMTcgZGl2aWRlIDMxOTU0NTUxMS44OTIwMzQ5NTU0NjY4OTI3MzU2NDcyOEUrMDM2IC0yOTU1OTQzNTMzOTQzMzIxODk5MTUwMzEwMTkyMDYxIC0+IC0xMDgxMDI3MTE3ODE0MjIuNjg2NjMwODQ4NTk5MDI5MzEgSW5leGFjdCBSb3VuZGVkCitkdml4MzIxNyBkaXZpZGVpbnQgMzE5NTQ1NTExLjg5MjAzNDk1NTQ2Njg5MjczNTY0NzI4RSswMzYgLTI5NTU5NDM1MzM5NDMzMjE4OTkxNTAzMTAxOTIwNjEgLT4gLTEwODEwMjcxMTc4MTQyMgorbXVseDMyMTcgbXVsdGlwbHkgMzE5NTQ1NTExLjg5MjAzNDk1NTQ2Njg5MjczNTY0NzI4RSswMzYgLTI5NTU5NDM1MzM5NDMzMjE4OTkxNTAzMTAxOTIwNjEgLT4gLTkuNDQ1NTg0ODk2Nzc4Njk1OTk5NjUyNTcwMjE5NzEzOUUrNzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxNyBwb3dlciAzMTk1NDU1MTEuODkyMDM0OTU1NDY2ODkyNzM1NjQ3MjhFKzAzNiAtMyAtPiAzLjA2NDc5Nzg0NDg5NDYyOTQ0NTc5ODUyMjM5NTM0NzJFLTEzNCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjE3IHJlbWFpbmRlciAzMTk1NDU1MTEuODkyMDM0OTU1NDY2ODkyNzM1NjQ3MjhFKzAzNiAtMjk1NTk0MzUzMzk0MzMyMTg5OTE1MDMxMDE5MjA2MSAtPiAyMDI5NjQyMDE3MTIyMzE2NzIxNTMxNzI4MzA5MjU4CitzdWJ4MzIxNyBzdWJ0cmFjdCAzMTk1NDU1MTEuODkyMDM0OTU1NDY2ODkyNzM1NjQ3MjhFKzAzNiAtMjk1NTk0MzUzMzk0MzMyMTg5OTE1MDMxMDE5MjA2MSAtPiAzLjE5NTQ1NTExODkyMDM3OTExNDEwNDI2Njc4OTY5MThFKzQ0IEluZXhhY3QgUm91bmRlZAorYWRkeDMyMTggYWRkIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzE2MzYwMzU3OTQwIC0+IC00MjY4Mjc2NC42NzY2NTE0NjUwODkzMDc0MzAzMjUxMDQgUm91bmRlZAorY29teDMyMTggY29tcGFyZSAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTU4MzA2MjkuODM0NzA4NTAyNTgwODcxNjM2MDM1Nzk0MCAtPiAtMQorZGl2eDMyMTggZGl2aWRlIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzE2MzYwMzU3OTQwIC0+IDYuMzIwNDM4MDgwNzMxODY1NTQ3NTQ1OTA0NzQxMDE2MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjE4IGRpdmlkZWludCAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTU4MzA2MjkuODM0NzA4NTAyNTgwODcxNjM2MDM1Nzk0MCAtPiA2CittdWx4MzIxOCBtdWx0aXBseSAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTU4MzA2MjkuODM0NzA4NTAyNTgwODcxNjM2MDM1Nzk0MCAtPiAyMTQ4NzExNTY4ODIxMzMuMzQ0Mzc0MTc1MzQ4NzMwOTggSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxOCBwb3dlciAtMzY4NTIxMzQuODQxOTQyOTYyNTA4NDM1Nzk0Mjg5MzEgLTU4MzA2MzAgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyMTggcmVtYWluZGVyIC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzE2MzYwMzU3OTQwIC0+IC0xODY4MzU1LjgzMzY5MTk0NzAyMzIwNTk3ODA3NDU0NjAKK3N1YngzMjE4IHN1YnRyYWN0IC0zNjg1MjEzNC44NDE5NDI5NjI1MDg0MzU3OTQyODkzMSAtNTgzMDYyOS44MzQ3MDg1MDI1ODA4NzE2MzYwMzU3OTQwIC0+IC0zMTAyMTUwNS4wMDcyMzQ0NTk5Mjc1NjQxNTgyNTM1MTYgUm91bmRlZAorYWRkeDMyMTkgYWRkIDguNjAyMTkwNTAwMTc5ODU3ODY1OTI3NTg4MDAxODIyMUUtMzc0IC0zOTUwNTI4NTM0NDk0My43Mjk2ODE4MzUzNzc1MzA5MDggLT4gLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjE5IGNvbXBhcmUgOC42MDIxOTA1MDAxNzk4NTc4NjU5Mjc1ODgwMDE4MjIxRS0zNzQgLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCAtPiAxCitkaXZ4MzIxOSBkaXZpZGUgOC42MDIxOTA1MDAxNzk4NTc4NjU5Mjc1ODgwMDE4MjIxRS0zNzQgLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCAtPiAtMi4xNzc0NzgzODY3NzAwNTAyMDAyNTExNDg2ODg1MjcyRS0zODcgSW5leGFjdCBSb3VuZGVkCitkdml4MzIxOSBkaXZpZGVpbnQgOC42MDIxOTA1MDAxNzk4NTc4NjU5Mjc1ODgwMDE4MjIxRS0zNzQgLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCAtPiAtMAorbXVseDMyMTkgbXVsdGlwbHkgOC42MDIxOTA1MDAxNzk4NTc4NjU5Mjc1ODgwMDE4MjIxRS0zNzQgLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCAtPiAtMy4zOTgzMTk5MDMwMTE2OTUxMDgxODY1NDMwMzYyMDUzRS0zNjAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIxOSBwb3dlciA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NCAtNCAtPiAxLjgyNjI2NDkxNTU4MjA0MzMxMjYyNDA3NTQxMjMyNTdFKzE0OTIgSW5leGFjdCBSb3VuZGVkCityZW14MzIxOSByZW1haW5kZXIgOC42MDIxOTA1MDAxNzk4NTc4NjU5Mjc1ODgwMDE4MjIxRS0zNzQgLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCAtPiA4LjYwMjE5MDUwMDE3OTg1Nzg2NTkyNzU4ODAwMTgyMjFFLTM3NAorc3VieDMyMTkgc3VidHJhY3QgOC42MDIxOTA1MDAxNzk4NTc4NjU5Mjc1ODgwMDE4MjIxRS0zNzQgLTM5NTA1Mjg1MzQ0OTQzLjcyOTY4MTgzNTM3NzUzMDkwOCAtPiAzOTUwNTI4NTM0NDk0My43Mjk2ODE4MzUzNzc1MzA5MDggSW5leGFjdCBSb3VuZGVkCithZGR4MzIyMCBhZGQgLTU0ODYzMTY1LjE1MjE3NDEwOTcyMDMxMjg4NzgwNTAxNyA3MzYuMTM5ODQ3NjU2MDE2OTE0MTEwNTMyODI1NjYyOCAtPiAtNTQ4NjI0MjkuMDEyMzI2NDUzNzAzMzk4Nzc3MjcyMTkxIEluZXhhY3QgUm91bmRlZAorY29teDMyMjAgY29tcGFyZSAtNTQ4NjMxNjUuMTUyMTc0MTA5NzIwMzEyODg3ODA1MDE3IDczNi4xMzk4NDc2NTYwMTY5MTQxMTA1MzI4MjU2NjI4IC0+IC0xCitkaXZ4MzIyMCBkaXZpZGUgLTU0ODYzMTY1LjE1MjE3NDEwOTcyMDMxMjg4NzgwNTAxNyA3MzYuMTM5ODQ3NjU2MDE2OTE0MTEwNTMyODI1NjYyOCAtPiAtNzQ1MjguMTgyODI2NzY0Mzg0MDg4NjAyODEzMTQyODQ3IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMjAgZGl2aWRlaW50IC01NDg2MzE2NS4xNTIxNzQxMDk3MjAzMTI4ODc4MDUwMTcgNzM2LjEzOTg0NzY1NjAxNjkxNDExMDUzMjgyNTY2MjggLT4gLTc0NTI4CittdWx4MzIyMCBtdWx0aXBseSAtNTQ4NjMxNjUuMTUyMTc0MTA5NzIwMzEyODg3ODA1MDE3IDczNi4xMzk4NDc2NTYwMTY5MTQxMTA1MzI4MjU2NjI4IC0+IC00MDM4Njk2MjAzNy4wNDgzNDUxNDgzMzgxMjI1Mzk0MDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyMCBwb3dlciAtNTQ4NjMxNjUuMTUyMTc0MTA5NzIwMzEyODg3ODA1MDE3IDczNiAtPiAxLjI5MDM2NDM5ODE2NzkxMTE2MjUzNzAxNzQ1NzM2MzlFKzU2OTYgSW5leGFjdCBSb3VuZGVkCityZW14MzIyMCByZW1haW5kZXIgLTU0ODYzMTY1LjE1MjE3NDEwOTcyMDMxMjg4NzgwNTAxNyA3MzYuMTM5ODQ3NjU2MDE2OTE0MTEwNTMyODI1NjYyOCAtPiAtMTM0LjU4NjA2NjQ4MTE0NTQ4MzA5NzM3NDAxOTg0MTYKK3N1YngzMjIwIHN1YnRyYWN0IC01NDg2MzE2NS4xNTIxNzQxMDk3MjAzMTI4ODc4MDUwMTcgNzM2LjEzOTg0NzY1NjAxNjkxNDExMDUzMjgyNTY2MjggLT4gLTU0ODYzOTAxLjI5MjAyMTc2NTczNzIyNjk5ODMzNzg0MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjIxIGFkZCAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwODgxMDMwNyAyNDU3MjA2LjI0NzEyNDgzODIxMzYyNzM2NDMyMDgxMDkgLT4gLTMyNjM3NDM0NjQ1MTc4NTEwMTI1MzE3MDYzNTMxMDAuOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjIxIGNvbXBhcmUgLTMyNjM3NDM0NjQ1MTc4NTEwMTI1MzE3MDg4MTAzMDcgMjQ1NzIwNi4yNDcxMjQ4MzgyMTM2MjczNjQzMjA4MTA5IC0+IC0xCitkaXZ4MzIyMSBkaXZpZGUgLTMyNjM3NDM0NjQ1MTc4NTEwMTI1MzE3MDg4MTAzMDcgMjQ1NzIwNi4yNDcxMjQ4MzgyMTM2MjczNjQzMjA4MTA5IC0+IC0xMzI4MjMzNDIyOTUyMDc2OTc1MDU1MDgyLjU3NjgwODIgSW5leGFjdCBSb3VuZGVkCitkdml4MzIyMSBkaXZpZGVpbnQgLTMyNjM3NDM0NjQ1MTc4NTEwMTI1MzE3MDg4MTAzMDcgMjQ1NzIwNi4yNDcxMjQ4MzgyMTM2MjczNjQzMjA4MTA5IC0+IC0xMzI4MjMzNDIyOTUyMDc2OTc1MDU1MDgyCittdWx4MzIyMSBtdWx0aXBseSAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwODgxMDMwNyAyNDU3MjA2LjI0NzEyNDgzODIxMzYyNzM2NDMyMDgxMDkgLT4gLTguMDE5NjkwODMwMDI2MTI2MjU0ODU2NTgzODAzMTk0M0UrMzYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyMSBwb3dlciAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwODgxMDMwNyAyNDU3MjA2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyMjEgcmVtYWluZGVyIC0zMjYzNzQzNDY0NTE3ODUxMDEyNTMxNzA4ODEwMzA3IDI0NTcyMDYuMjQ3MTI0ODM4MjEzNjI3MzY0MzIwODEwOSAtPiAtMTQxNzMzNi43NTczMzk4MzY2MDYyOTk0NTM1OTQwMDYyCitzdWJ4MzIyMSBzdWJ0cmFjdCAtMzI2Mzc0MzQ2NDUxNzg1MTAxMjUzMTcwODgxMDMwNyAyNDU3MjA2LjI0NzEyNDgzODIxMzYyNzM2NDMyMDgxMDkgLT4gLTMyNjM3NDM0NjQ1MTc4NTEwMTI1MzE3MTEyNjc1MTMuMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjIyIGFkZCAyODU2NTg2NzQ0LjA1NDg2Mzc3OTcyOTExNTExNTQ5MDJFLTg5NSA5NTM1NDU2Mzc2NDYuNTc2OTQ4MzU4NjAzMzk1ODI4MjFFKzA4MCAtPiA5LjUzNTQ1NjM3NjQ2NTc2OTQ4MzU4NjAzMzk1ODI4MjFFKzkxIEluZXhhY3QgUm91bmRlZAorY29teDMyMjIgY29tcGFyZSAyODU2NTg2NzQ0LjA1NDg2Mzc3OTcyOTExNTExNTQ5MDJFLTg5NSA5NTM1NDU2Mzc2NDYuNTc2OTQ4MzU4NjAzMzk1ODI4MjFFKzA4MCAtPiAtMQorZGl2eDMyMjIgZGl2aWRlIDI4NTY1ODY3NDQuMDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODk1IDk1MzU0NTYzNzY0Ni41NzY5NDgzNTg2MDMzOTU4MjgyMUUrMDgwIC0+IDIuOTk1NzUyNTE3MDAwNzk4MDAwODcxMjgyODk2ODMwMEUtOTc4IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMjIgZGl2aWRlaW50IDI4NTY1ODY3NDQuMDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODk1IDk1MzU0NTYzNzY0Ni41NzY5NDgzNTg2MDMzOTU4MjgyMUUrMDgwIC0+IDAKK211bHgzMjIyIG11bHRpcGx5IDI4NTY1ODY3NDQuMDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODk1IDk1MzU0NTYzNzY0Ni41NzY5NDgzNTg2MDMzOTU4MjgyMUUrMDgwIC0+IDIuNzIzODg1ODI4MzUyNTU0MTg1NDgyNjU5NDM0Mzk1NEUtNzk0IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjIgcG93ZXIgMjg1NjU4Njc0NC4wNTQ4NjM3Nzk3MjkxMTUxMTU0OTAyRS04OTUgMTAgLT4gMy42MTgwNDY2NzUzMzA3MDcyMjU2ODA3NTkzOTg4MzM2RS04ODU2IEluZXhhY3QgUm91bmRlZAorcmVteDMyMjIgcmVtYWluZGVyIDI4NTY1ODY3NDQuMDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODk1IDk1MzU0NTYzNzY0Ni41NzY5NDgzNTg2MDMzOTU4MjgyMUUrMDgwIC0+IDIuODU2NTg2NzQ0MDU0ODYzNzc5NzI5MTE1MTE1NDkwMkUtODg2CitzdWJ4MzIyMiBzdWJ0cmFjdCAyODU2NTg2NzQ0LjA1NDg2Mzc3OTcyOTExNTExNTQ5MDJFLTg5NSA5NTM1NDU2Mzc2NDYuNTc2OTQ4MzU4NjAzMzk1ODI4MjFFKzA4MCAtPiAtOS41MzU0NTYzNzY0NjU3Njk0ODM1ODYwMzM5NTgyODIxRSs5MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjIzIGFkZCA1NjI0MTU3MjMzLjM0MzM2NjEwMDkyMDM1Mjk5Mzc2MjUgNjI2MDk4NDA5MjY1LjkzNzM4NTg2NzUwMDkwMTYwNjM4IC0+IDYzMTcyMjU2NjQ5OS4yODA3NTE5Njg0MjEyNTQ2MDAxNCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjIzIGNvbXBhcmUgNTYyNDE1NzIzMy4zNDMzNjYxMDA5MjAzNTI5OTM3NjI1IDYyNjA5ODQwOTI2NS45MzczODU4Njc1MDA5MDE2MDYzOCAtPiAtMQorZGl2eDMyMjMgZGl2aWRlIDU2MjQxNTcyMzMuMzQzMzY2MTAwOTIwMzUyOTkzNzYyNSA2MjYwOTg0MDkyNjUuOTM3Mzg1ODY3NTAwOTAxNjA2MzggLT4gMC4wMDg5ODI4NjQ1OTQ2MjA3NTgwNDkyNzUyNTQ0MjE4MzE2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyMjMgZGl2aWRlaW50IDU2MjQxNTcyMzMuMzQzMzY2MTAwOTIwMzUyOTkzNzYyNSA2MjYwOTg0MDkyNjUuOTM3Mzg1ODY3NTAwOTAxNjA2MzggLT4gMAorbXVseDMyMjMgbXVsdGlwbHkgNTYyNDE1NzIzMy4zNDMzNjYxMDA5MjAzNTI5OTM3NjI1IDYyNjA5ODQwOTI2NS45MzczODU4Njc1MDA5MDE2MDYzOCAtPiAzNTIxMjc1ODk3MjU3Nzk2OTM4ODMzLjg5NzUwMzc5MDkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyMyBwb3dlciA1NjI0MTU3MjMzLjM0MzM2NjEwMDkyMDM1Mjk5Mzc2MjUgNiAtPiAzLjE2NDc4ODcxOTYzMDMyNjI1NDAxNTgzMjg0NTkwMzBFKzU4IEluZXhhY3QgUm91bmRlZAorcmVteDMyMjMgcmVtYWluZGVyIDU2MjQxNTcyMzMuMzQzMzY2MTAwOTIwMzUyOTkzNzYyNSA2MjYwOTg0MDkyNjUuOTM3Mzg1ODY3NTAwOTAxNjA2MzggLT4gNTYyNDE1NzIzMy4zNDMzNjYxMDA5MjAzNTI5OTM3NjI1CitzdWJ4MzIyMyBzdWJ0cmFjdCA1NjI0MTU3MjMzLjM0MzM2NjEwMDkyMDM1Mjk5Mzc2MjUgNjI2MDk4NDA5MjY1LjkzNzM4NTg2NzUwMDkwMTYwNjM4IC0+IC02MjA0NzQyNTIwMzIuNTk0MDE5NzY2NTgwNTQ4NjEyNjIgSW5leGFjdCBSb3VuZGVkCithZGR4MzIyNCBhZGQgLTIxMzQ5OTM2Mi45MTQ3Njk5ODcwMTgzNDA2NzA5MjYxMSA0MTkyNzI0MzguMDI1NTU3NTc2OTk4NjMwMjI2NDM0NDQgLT4gMjA1NzczMDc1LjExMDc4NzU4OTk4MDI4OTU1NTUwODMzCitjb214MzIyNCBjb21wYXJlIC0yMTM0OTkzNjIuOTE0NzY5OTg3MDE4MzQwNjcwOTI2MTEgNDE5MjcyNDM4LjAyNTU1NzU3Njk5ODYzMDIyNjQzNDQ0IC0+IC0xCitkaXZ4MzIyNCBkaXZpZGUgLTIxMzQ5OTM2Mi45MTQ3Njk5ODcwMTgzNDA2NzA5MjYxMSA0MTkyNzI0MzguMDI1NTU3NTc2OTk4NjMwMjI2NDM0NDQgLT4gLTAuNTA5MjEzOTIyODYxNjY4NTU3Nzk4MjgwNjExNDc3ODYgSW5leGFjdCBSb3VuZGVkCitkdml4MzIyNCBkaXZpZGVpbnQgLTIxMzQ5OTM2Mi45MTQ3Njk5ODcwMTgzNDA2NzA5MjYxMSA0MTkyNzI0MzguMDI1NTU3NTc2OTk4NjMwMjI2NDM0NDQgLT4gLTAKK211bHgzMjI0IG11bHRpcGx5IC0yMTM0OTkzNjIuOTE0NzY5OTg3MDE4MzQwNjcwOTI2MTEgNDE5MjcyNDM4LjAyNTU1NzU3Njk5ODYzMDIyNjQzNDQ0IC0+IC04OTUxNDM5ODQwNjE3ODkyNS4wNzMyNjA3NzY0MTA2NzIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyNCBwb3dlciAtMjEzNDk5MzYyLjkxNDc2OTk4NzAxODM0MDY3MDkyNjExIDQxOTI3MjQzOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjI0IHJlbWFpbmRlciAtMjEzNDk5MzYyLjkxNDc2OTk4NzAxODM0MDY3MDkyNjExIDQxOTI3MjQzOC4wMjU1NTc1NzY5OTg2MzAyMjY0MzQ0NCAtPiAtMjEzNDk5MzYyLjkxNDc2OTk4NzAxODM0MDY3MDkyNjExCitzdWJ4MzIyNCBzdWJ0cmFjdCAtMjEzNDk5MzYyLjkxNDc2OTk4NzAxODM0MDY3MDkyNjExIDQxOTI3MjQzOC4wMjU1NTc1NzY5OTg2MzAyMjY0MzQ0NCAtPiAtNjMyNzcxODAwLjk0MDMyNzU2NDAxNjk3MDg5NzM2MDU1CithZGR4MzIyNSBhZGQgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAzMDI3NC4zOTIzNTY2MTQxMDEyMzgzMTY4NDU0MDE1MTggSW5leGFjdCBSb3VuZGVkCitjb214MzIyNSBjb21wYXJlIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMQorZGl2eDMyMjUgZGl2aWRlIDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gNjMwMC4xMjUyMTc4ODM3NjU1MzU5ODMxNTI3MTczODMyIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMjUgZGl2aWRlaW50IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gNjMwMAorbXVseDMyMjUgbXVsdGlwbHkgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAxNDU0MzMuMjkwODAxMTkzMzY5NjcxOTE2NTExOTkyODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyNSBwb3dlciAzMDI2OS41ODc3NTU2NDA1MDIxNTA5NzcyNTE3NzA1NTQgNSAtPiAyNTQxMTYzMDQ4MTU0NzQ2NDEyODM4My4yMjAzNjgyMDggSW5leGFjdCBSb3VuZGVkCityZW14MzIyNSByZW1haW5kZXIgMzAyNjkuNTg3NzU1NjQwNTAyMTUwOTc3MjUxNzcwNTU0IDQuODA0NjAwOTczNTk5MDg3MzM5NTkzNjMwOTY0MDU0MyAtPiAwLjYwMTYyMTk2NjI1MTkxMTUzNzM3NjY5NzAxMTkxMDAKK3N1YngzMjI1IHN1YnRyYWN0IDMwMjY5LjU4Nzc1NTY0MDUwMjE1MDk3NzI1MTc3MDU1NCA0LjgwNDYwMDk3MzU5OTA4NzMzOTU5MzYzMDk2NDA1NDMgLT4gMzAyNjQuNzgzMTU0NjY2OTAzMDYzNjM3NjU4MTM5NTkwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMjYgYWRkIDQ3LjUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA0IC01ODYzMTk0MzUwODQzNjY1NzM4MzM2OTc2MDk3MDIxMCAtPiA0Ljc1MjU2NzY0NTkzNTE1MDU2ODIwMDUzNTk2OTk2ODBFKzcwNSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjI2IGNvbXBhcmUgNDcuNTI1Njc2NDU5MzUxNTA1NjgyMDA1MzU5Njk5NjgwRSs3MDQgLTU4NjMxOTQzNTA4NDM2NjU3MzgzMzY5NzYwOTcwMjEwIC0+IDEKK2RpdngzMjI2IGRpdmlkZSA0Ny41MjU2NzY0NTkzNTE1MDU2ODIwMDUzNTk2OTk2ODBFKzcwNCAtNTg2MzE5NDM1MDg0MzY2NTczODMzNjk3NjA5NzAyMTAgLT4gLTguMTA1NzY1MTUzODU1NTg1NDUyMDk5NDQzODAzODUzN0UrNjczIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMjYgZGl2aWRlaW50IDQ3LjUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA0IC01ODYzMTk0MzUwODQzNjY1NzM4MzM2OTc2MDk3MDIxMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyMjYgbXVsdGlwbHkgNDcuNTI1Njc2NDU5MzUxNTA1NjgyMDA1MzU5Njk5NjgwRSs3MDQgLTU4NjMxOTQzNTA4NDM2NjU3MzgzMzY5NzYwOTcwMjEwIC0+IC0yLjc4NjUyMjc3NzM2NDkzNTM3Njk4NzY5NzUzNjY1MDZFKzczNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI2IHBvd2VyIDQ3LjUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA0IC02IC0+IDguNjc4MjEwMDM5Mzk0MTIyNjUzNTE1MDM4NTQ3NTQ2NEUtNDIzNSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjI2IHJlbWFpbmRlciA0Ny41MjU2NzY0NTkzNTE1MDU2ODIwMDUzNTk2OTk2ODBFKzcwNCAtNTg2MzE5NDM1MDg0MzY2NTczODMzNjk3NjA5NzAyMTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjI2IHN1YnRyYWN0IDQ3LjUyNTY3NjQ1OTM1MTUwNTY4MjAwNTM1OTY5OTY4MEUrNzA0IC01ODYzMTk0MzUwODQzNjY1NzM4MzM2OTc2MDk3MDIxMCAtPiA0Ljc1MjU2NzY0NTkzNTE1MDU2ODIwMDUzNTk2OTk2ODBFKzcwNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjI3IGFkZCAtNzQzOTY4NjIyNzM4MDAuNjI1Njc5MTMwNzcyOTM1NTUwIC0xMTU2MTY2MDUuNTI4MjY5ODEyODQxODM5OTIwMTMxNTcgLT4gLTc0Mzk2OTc3ODkwNDA2LjE1Mzk0ODk0MzYxNDc3NTQ3MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjI3IGNvbXBhcmUgLTc0Mzk2ODYyMjczODAwLjYyNTY3OTEzMDc3MjkzNTU1MCAtMTE1NjE2NjA1LjUyODI2OTgxMjg0MTgzOTkyMDEzMTU3IC0+IC0xCitkaXZ4MzIyNyBkaXZpZGUgLTc0Mzk2ODYyMjczODAwLjYyNTY3OTEzMDc3MjkzNTU1MCAtMTE1NjE2NjA1LjUyODI2OTgxMjg0MTgzOTkyMDEzMTU3IC0+IDY0MzQ3OS4wMzk0ODQ1OTcxNjQyNDc3ODAwNTYxMzExMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjI3IGRpdmlkZWludCAtNzQzOTY4NjIyNzM4MDAuNjI1Njc5MTMwNzcyOTM1NTUwIC0xMTU2MTY2MDUuNTI4MjY5ODEyODQxODM5OTIwMTMxNTcgLT4gNjQzNDc5CittdWx4MzIyNyBtdWx0aXBseSAtNzQzOTY4NjIyNzM4MDAuNjI1Njc5MTMwNzcyOTM1NTUwIC0xMTU2MTY2MDUuNTI4MjY5ODEyODQxODM5OTIwMTMxNTcgLT4gODYwMTUxMjY3ODA1MTAyNTI5NzI5Ny43MTY5NjU0NDY3IEluZXhhY3QgUm91bmRlZAorcG93eDMyMjcgcG93ZXIgLTc0Mzk2ODYyMjczODAwLjYyNTY3OTEzMDc3MjkzNTU1MCAtMTE1NjE2NjA2IC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjI3IHJlbWFpbmRlciAtNzQzOTY4NjIyNzM4MDAuNjI1Njc5MTMwNzcyOTM1NTUwIC0xMTU2MTY2MDUuNTI4MjY5ODEyODQxODM5OTIwMTMxNTcgLT4gLTQ1NjUwNzUuMDk0NzgxNDc2NDYyOTY5MjA3NDY3OTcKK3N1YngzMjI3IHN1YnRyYWN0IC03NDM5Njg2MjI3MzgwMC42MjU2NzkxMzA3NzI5MzU1NTAgLTExNTYxNjYwNS41MjgyNjk4MTI4NDE4Mzk5MjAxMzE1NyAtPiAtNzQzOTY3NDY2NTcxOTUuMDk3NDA5MzE3OTMxMDk1NjMwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMjggYWRkIDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjYuOTYyOTAyODg2MDg1NjY3MzcxNzc1MDM0NTE2MTMgLT4gNjc1ODYzODcuNTI1NDY0MTE1NTgzMzg4MzI3NDgxMDE0IEluZXhhY3QgUm91bmRlZAorY29teDMyMjggY29tcGFyZSA2NzU4NTU2MC41NjI1NjEyMjk0OTc3MjA5NTU3MDU5NzkgODI2Ljk2MjkwMjg4NjA4NTY2NzM3MTc3NTAzNDUxNjEzIC0+IDEKK2RpdngzMjI4IGRpdmlkZSA2NzU4NTU2MC41NjI1NjEyMjk0OTc3MjA5NTU3MDU5NzkgODI2Ljk2MjkwMjg4NjA4NTY2NzM3MTc3NTAzNDUxNjEzIC0+IDgxNzI3LjQzOTQzNzM1NDI0ODc4OTg1MjcxNTU4NjUxMCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjI4IGRpdmlkZWludCA2NzU4NTU2MC41NjI1NjEyMjk0OTc3MjA5NTU3MDU5NzkgODI2Ljk2MjkwMjg4NjA4NTY2NzM3MTc3NTAzNDUxNjEzIC0+IDgxNzI3CittdWx4MzIyOCBtdWx0aXBseSA2NzU4NTU2MC41NjI1NjEyMjk0OTc3MjA5NTU3MDU5NzkgODI2Ljk2MjkwMjg4NjA4NTY2NzM3MTc3NTAzNDUxNjEzIC0+IDU1ODkwNzUxMzU1Ljk5ODk4MzQzMzg5NTkxMDI5NTU5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjI4IHBvd2VyIDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjcgLT4gMS45NDYyMjA0NTgzMzUyMTkxMTA4NzgxMTk3Nzg4MjU1RSs2NDc1IEluZXhhY3QgUm91bmRlZAorcmVteDMyMjggcmVtYWluZGVyIDY3NTg1NTYwLjU2MjU2MTIyOTQ5NzcyMDk1NTcwNTk3OSA4MjYuOTYyOTAyODg2MDg1NjY3MzcxNzc1MDM0NTE2MTMgLT4gMzYzLjM5ODM5MDEwNjE2MDQyNzg5NzQ2MDA3OTI0MzQ5CitzdWJ4MzIyOCBzdWJ0cmFjdCA2NzU4NTU2MC41NjI1NjEyMjk0OTc3MjA5NTU3MDU5NzkgODI2Ljk2MjkwMjg4NjA4NTY2NzM3MTc3NTAzNDUxNjEzIC0+IDY3NTg0NzMzLjU5OTY1ODM0MzQxMjA1MzU4MzkzMDk0NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjI5IGFkZCA2ODc3Mzg2ODY4Ljk0OTgwNTE4NjA3NDIyOTg3MzUxNTZFLTIzMiAzOTAuMzE1NDI4OTg2MDY0MzUwOTM5Mzc2OTc1NDU1MSAtPiAzOTAuMzE1NDI4OTg2MDY0MzUwOTM5Mzc2OTc1NDU1MTAgSW5leGFjdCBSb3VuZGVkCitjb214MzIyOSBjb21wYXJlIDY4NzczODY4NjguOTQ5ODA1MTg2MDc0MjI5ODczNTE1NkUtMjMyIDM5MC4zMTU0Mjg5ODYwNjQzNTA5MzkzNzY5NzU0NTUxIC0+IC0xCitkaXZ4MzIyOSBkaXZpZGUgNjg3NzM4Njg2OC45NDk4MDUxODYwNzQyMjk4NzM1MTU2RS0yMzIgMzkwLjMxNTQyODk4NjA2NDM1MDkzOTM3Njk3NTQ1NTEgLT4gMS43NjIwMDc0MzI1MDU0MDM4MTc0NTcxNTY0NDA5ODcxRS0yMjUgSW5leGFjdCBSb3VuZGVkCitkdml4MzIyOSBkaXZpZGVpbnQgNjg3NzM4Njg2OC45NDk4MDUxODYwNzQyMjk4NzM1MTU2RS0yMzIgMzkwLjMxNTQyODk4NjA2NDM1MDkzOTM3Njk3NTQ1NTEgLT4gMAorbXVseDMyMjkgbXVsdGlwbHkgNjg3NzM4Njg2OC45NDk4MDUxODYwNzQyMjk4NzM1MTU2RS0yMzIgMzkwLjMxNTQyODk4NjA2NDM1MDkzOTM3Njk3NTQ1NTEgLT4gMi42ODQzNTAyMDYwNTcyNjkxNDA4MDkxNjYzODIyNzMyRS0yMjAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIyOSBwb3dlciA2ODc3Mzg2ODY4Ljk0OTgwNTE4NjA3NDIyOTg3MzUxNTZFLTIzMiAzOTAgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyMjkgcmVtYWluZGVyIDY4NzczODY4NjguOTQ5ODA1MTg2MDc0MjI5ODczNTE1NkUtMjMyIDM5MC4zMTU0Mjg5ODYwNjQzNTA5MzkzNzY5NzU0NTUxIC0+IDYuODc3Mzg2ODY4OTQ5ODA1MTg2MDc0MjI5ODczNTE1NkUtMjIzCitzdWJ4MzIyOSBzdWJ0cmFjdCA2ODc3Mzg2ODY4Ljk0OTgwNTE4NjA3NDIyOTg3MzUxNTZFLTIzMiAzOTAuMzE1NDI4OTg2MDY0MzUwOTM5Mzc2OTc1NDU1MSAtPiAtMzkwLjMxNTQyODk4NjA2NDM1MDkzOTM3Njk3NTQ1NTEwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMzAgYWRkIC0xNjQ3MzM1LjIwMTE0NDYwOTI1NjEzNDkyNTgzODkzNyAtMTg2NjU0ODIzNzgyLjUwNDU5ODAyMjM1MDI0MjMwODU2IC0+IC0xODY2NTY0NzExMTcuNzA1NzQyNjMxNjA2Mzc3MjM0NDAgSW5leGFjdCBSb3VuZGVkCitjb214MzIzMCBjb21wYXJlIC0xNjQ3MzM1LjIwMTE0NDYwOTI1NjEzNDkyNTgzODkzNyAtMTg2NjU0ODIzNzgyLjUwNDU5ODAyMjM1MDI0MjMwODU2IC0+IDEKK2RpdngzMjMwIGRpdmlkZSAtMTY0NzMzNS4yMDExNDQ2MDkyNTYxMzQ5MjU4Mzg5MzcgLTE4NjY1NDgyMzc4Mi41MDQ1OTgwMjIzNTAyNDIzMDg1NiAtPiAwLjAwMDAwODgyNTU2OTkzNTc4NzYyMzM0NTg2NjAzMzExNDY1ODMgSW5leGFjdCBSb3VuZGVkCitkdml4MzIzMCBkaXZpZGVpbnQgLTE2NDczMzUuMjAxMTQ0NjA5MjU2MTM0OTI1ODM4OTM3IC0xODY2NTQ4MjM3ODIuNTA0NTk4MDIyMzUwMjQyMzA4NTYgLT4gMAorbXVseDMyMzAgbXVsdGlwbHkgLTE2NDczMzUuMjAxMTQ0NjA5MjU2MTM0OTI1ODM4OTM3IC0xODY2NTQ4MjM3ODIuNTA0NTk4MDIyMzUwMjQyMzA4NTYgLT4gMzA3NDgzMDYxNjgwMzYzODA3LjQ4Nzc1NjE5MzMzMjg1IEluZXhhY3QgUm91bmRlZAorcG93eDMyMzAgcG93ZXIgLTE2NDczMzUuMjAxMTQ0NjA5MjU2MTM0OTI1ODM4OTM3IC0yIC0+IDMuNjg0OTg3Njk5MDQzOTUwMjE1Mjc4NDM4OTIzNzg5MUUtMTMgSW5leGFjdCBSb3VuZGVkCityZW14MzIzMCByZW1haW5kZXIgLTE2NDczMzUuMjAxMTQ0NjA5MjU2MTM0OTI1ODM4OTM3IC0xODY2NTQ4MjM3ODIuNTA0NTk4MDIyMzUwMjQyMzA4NTYgLT4gLTE2NDczMzUuMjAxMTQ0NjA5MjU2MTM0OTI1ODM4OTM3CitzdWJ4MzIzMCBzdWJ0cmFjdCAtMTY0NzMzNS4yMDExNDQ2MDkyNTYxMzQ5MjU4Mzg5MzcgLTE4NjY1NDgyMzc4Mi41MDQ1OTgwMjIzNTAyNDIzMDg1NiAtPiAxODY2NTMxNzY0NDcuMzAzNDUzNDEzMDk0MTA3MzgyNzIgSW5leGFjdCBSb3VuZGVkCithZGR4MzIzMSBhZGQgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01MTU2Ljc2MjQ1MzQwMDAzMTEzNDIzMTAxMDY2NzE2MjdFLTk2MyAtPiA0MTQwNzgxODE0MDk0OC44NjY2MzA5MjM5MzQxMzgxNTUgSW5leGFjdCBSb3VuZGVkCitjb214MzIzMSBjb21wYXJlIDQxNDA3ODE4MTQwOTQ4Ljg2NjYzMDkyMzkzNDEzODE1NSAtNTE1Ni43NjI0NTM0MDAwMzExMzQyMzEwMTA2NjcxNjI3RS05NjMgLT4gMQorZGl2eDMyMzEgZGl2aWRlIDQxNDA3ODE4MTQwOTQ4Ljg2NjYzMDkyMzkzNDEzODE1NSAtNTE1Ni43NjI0NTM0MDAwMzExMzQyMzEwMTA2NjcxNjI3RS05NjMgLT4gLTguMDI5ODA5MTEyODE3OTIwNDA3Njc5NjUwNzY5NzUxN0UrOTcyIEluZXhhY3QgUm91bmRlZAorZHZpeDMyMzEgZGl2aWRlaW50IDQxNDA3ODE4MTQwOTQ4Ljg2NjYzMDkyMzkzNDEzODE1NSAtNTE1Ni43NjI0NTM0MDAwMzExMzQyMzEwMTA2NjcxNjI3RS05NjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjMxIG11bHRpcGx5IDQxNDA3ODE4MTQwOTQ4Ljg2NjYzMDkyMzkzNDEzODE1NSAtNTE1Ni43NjI0NTM0MDAwMzExMzQyMzEwMTA2NjcxNjI3RS05NjMgLT4gLTIuMTM1MzAyODE4NjY0NjE3OTM2OTIyMDgzNDY5MTE1NkUtOTQ2IEluZXhhY3QgUm91bmRlZAorcG93eDMyMzEgcG93ZXIgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01IC0+IDguMjE0NjM0ODU1NjY0ODU0NzUyNTY5MzUyODAwNDA4MUUtNjkgSW5leGFjdCBSb3VuZGVkCityZW14MzIzMSByZW1haW5kZXIgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01MTU2Ljc2MjQ1MzQwMDAzMTEzNDIzMTAxMDY2NzE2MjdFLTk2MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyMzEgc3VidHJhY3QgNDE0MDc4MTgxNDA5NDguODY2NjMwOTIzOTM0MTM4MTU1IC01MTU2Ljc2MjQ1MzQwMDAzMTEzNDIzMTAxMDY2NzE2MjdFLTk2MyAtPiA0MTQwNzgxODE0MDk0OC44NjY2MzA5MjM5MzQxMzgxNTUgSW5leGFjdCBSb3VuZGVkCithZGR4MzIzMiBhZGQgLTYuNjU0NzQyNDAxMjUxNjgzNDY2MjAxMTcwNjE2NTI5NyAtNTc0NDU0NTg1NTgwLjA2MjE1OTc0MTM5ODg0NzQ2NDQxIC0+IC01NzQ0NTQ1ODU1ODYuNzE2OTAyMTQyNjUwNTMwOTMwNjEgSW5leGFjdCBSb3VuZGVkCitjb214MzIzMiBjb21wYXJlIC02LjY1NDc0MjQwMTI1MTY4MzQ2NjIwMTE3MDYxNjUyOTcgLTU3NDQ1NDU4NTU4MC4wNjIxNTk3NDEzOTg4NDc0NjQ0MSAtPiAxCitkaXZ4MzIzMiBkaXZpZGUgLTYuNjU0NzQyNDAxMjUxNjgzNDY2MjAxMTcwNjE2NTI5NyAtNTc0NDU0NTg1NTgwLjA2MjE1OTc0MTM5ODg0NzQ2NDQxIC0+IDEuMTU4NDQ1MzQ0MjA5NzU2ODc0NTQxMTU2ODAzNzA3OEUtMTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzIzMiBkaXZpZGVpbnQgLTYuNjU0NzQyNDAxMjUxNjgzNDY2MjAxMTcwNjE2NTI5NyAtNTc0NDU0NTg1NTgwLjA2MjE1OTc0MTM5ODg0NzQ2NDQxIC0+IDAKK211bHgzMjMyIG11bHRpcGx5IC02LjY1NDc0MjQwMTI1MTY4MzQ2NjIwMTE3MDYxNjUyOTcgLTU3NDQ1NDU4NTU4MC4wNjIxNTk3NDEzOTg4NDc0NjQ0MSAtPiAzODIyODQ3Mjg4MjUzLjEwMzU1NTkyMDY2OTE1MzI4MjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzMiBwb3dlciAtNi42NTQ3NDI0MDEyNTE2ODM0NjYyMDExNzA2MTY1Mjk3IC02IC0+IDAuMDAwMDExNTEzNjM2MjgzMzg4NzkxNDg4MTI4MjM5MjMyOTA2IEluZXhhY3QgUm91bmRlZAorcmVteDMyMzIgcmVtYWluZGVyIC02LjY1NDc0MjQwMTI1MTY4MzQ2NjIwMTE3MDYxNjUyOTcgLTU3NDQ1NDU4NTU4MC4wNjIxNTk3NDEzOTg4NDc0NjQ0MSAtPiAtNi42NTQ3NDI0MDEyNTE2ODM0NjYyMDExNzA2MTY1Mjk3CitzdWJ4MzIzMiBzdWJ0cmFjdCAtNi42NTQ3NDI0MDEyNTE2ODM0NjYyMDExNzA2MTY1Mjk3IC01NzQ0NTQ1ODU1ODAuMDYyMTU5NzQxMzk4ODQ3NDY0NDEgLT4gNTc0NDU0NTg1NTczLjQwNzQxNzM0MDE0NzE2Mzk5ODIxIEluZXhhY3QgUm91bmRlZAorYWRkeDMyMzMgYWRkIC0yNzYyNy43NTg3NDUzODEyNjc3ODA4ODUwNjc0NDc2NzEgLTIzMzg1OTcyMTg5NDQxLjcwOTU4NjQzMzc1ODExMTA2MiAtPiAtMjMzODU5NzIyMTcwNjkuNDY4MzMxODE1MDI1ODkxOTQ3IEluZXhhY3QgUm91bmRlZAorY29teDMyMzMgY29tcGFyZSAtMjc2MjcuNzU4NzQ1MzgxMjY3NzgwODg1MDY3NDQ3NjcxIC0yMzM4NTk3MjE4OTQ0MS43MDk1ODY0MzM3NTgxMTEwNjIgLT4gMQorZGl2eDMyMzMgZGl2aWRlIC0yNzYyNy43NTg3NDUzODEyNjc3ODA4ODUwNjc0NDc2NzEgLTIzMzg1OTcyMTg5NDQxLjcwOTU4NjQzMzc1ODExMTA2MiAtPiAxLjE4MTM4MTY2NDI1NDg5MjAxOTQ3MDk4OTgxMTE2MjRFLTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzIzMyBkaXZpZGVpbnQgLTI3NjI3Ljc1ODc0NTM4MTI2Nzc4MDg4NTA2NzQ0NzY3MSAtMjMzODU5NzIxODk0NDEuNzA5NTg2NDMzNzU4MTExMDYyIC0+IDAKK211bHgzMjMzIG11bHRpcGx5IC0yNzYyNy43NTg3NDUzODEyNjc3ODA4ODUwNjc0NDc2NzEgLTIzMzg1OTcyMTg5NDQxLjcwOTU4NjQzMzc1ODExMTA2MiAtPiA2NDYxMDE5OTc2NzYwOTEzMDYuNDE0ODUzOTM2Nzg2NTUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzMyBwb3dlciAtMjc2MjcuNzU4NzQ1MzgxMjY3NzgwODg1MDY3NDQ3NjcxIC0yIC0+IDEuMzEwMTEyODAwOTU2MDgxMjUyOTE5ODUyMTkyMjI2OUUtOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjMzIHJlbWFpbmRlciAtMjc2MjcuNzU4NzQ1MzgxMjY3NzgwODg1MDY3NDQ3NjcxIC0yMzM4NTk3MjE4OTQ0MS43MDk1ODY0MzM3NTgxMTEwNjIgLT4gLTI3NjI3Ljc1ODc0NTM4MTI2Nzc4MDg4NTA2NzQ0NzY3MQorc3VieDMyMzMgc3VidHJhY3QgLTI3NjI3Ljc1ODc0NTM4MTI2Nzc4MDg4NTA2NzQ0NzY3MSAtMjMzODU5NzIxODk0NDEuNzA5NTg2NDMzNzU4MTExMDYyIC0+IDIzMzg1OTcyMTYxODEzLjk1MDg0MTA1MjQ5MDMzMDE3NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjM0IGFkZCAyMDk4MTkuNzQzNzkwOTk5MTQ3NTI5NjM3MTE5NDQzMDdFLTIyOCAtNDQwMjMwLjY3MDA5ODk1MzI0Njc4MzEzNzAzMjAyNjZFLTk2MCAtPiAyLjA5ODE5NzQzNzkwOTk5MTQ3NTI5NjM3MTE5NDQzMDdFLTIyMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjM0IGNvbXBhcmUgMjA5ODE5Ljc0Mzc5MDk5OTE0NzUyOTYzNzExOTQ0MzA3RS0yMjggLTQ0MDIzMC42NzAwOTg5NTMyNDY3ODMxMzcwMzIwMjY2RS05NjAgLT4gMQorZGl2eDMyMzQgZGl2aWRlIDIwOTgxOS43NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjI4IC00NDAyMzAuNjcwMDk4OTUzMjQ2NzgzMTM3MDMyMDI2NkUtOTYwIC0+IC00Ljc2NjEzMTg5NDk4NjcwNjA1OTU1NDU3NjUwNTMxODdFKzczMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjM0IGRpdmlkZWludCAyMDk4MTkuNzQzNzkwOTk5MTQ3NTI5NjM3MTE5NDQzMDdFLTIyOCAtNDQwMjMwLjY3MDA5ODk1MzI0Njc4MzEzNzAzMjAyNjZFLTk2MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyMzQgbXVsdGlwbHkgMjA5ODE5Ljc0Mzc5MDk5OTE0NzUyOTYzNzExOTQ0MzA3RS0yMjggLTQ0MDIzMC42NzAwOTg5NTMyNDY3ODMxMzcwMzIwMjY2RS05NjAgLT4gLTkuMjM2OTA4NjQwOTEwMjIzOTU3MzcyNjMxNjU5MzY0OEUtMTE3OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM0IHBvd2VyIDIwOTgxOS43NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjI4IC00IC0+IDUuMTU5NTgyODQ5NDExMTY5MDkxMDY1MDkxOTc3NjcwNUUrODkwIEluZXhhY3QgUm91bmRlZAorcmVteDMyMzQgcmVtYWluZGVyIDIwOTgxOS43NDM3OTA5OTkxNDc1Mjk2MzcxMTk0NDMwN0UtMjI4IC00NDAyMzAuNjcwMDk4OTUzMjQ2NzgzMTM3MDMyMDI2NkUtOTYwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzIzNCBzdWJ0cmFjdCAyMDk4MTkuNzQzNzkwOTk5MTQ3NTI5NjM3MTE5NDQzMDdFLTIyOCAtNDQwMjMwLjY3MDA5ODk1MzI0Njc4MzEzNzAzMjAyNjZFLTk2MCAtPiAyLjA5ODE5NzQzNzkwOTk5MTQ3NTI5NjM3MTE5NDQzMDdFLTIyMyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjM1IGFkZCAyLjM0ODg0NTc2MDA0MTU0NzQyNzAyNTkzMzA4NjUxODQgOTE4MjQzNC42NjYwMjEyNDgyNTAwMzc2MjIwNTA4NjA1RS02MTIgLT4gMi4zNDg4NDU3NjAwNDE1NDc0MjcwMjU5MzMwODY1MTg0IEluZXhhY3QgUm91bmRlZAorY29teDMyMzUgY29tcGFyZSAyLjM0ODg0NTc2MDA0MTU0NzQyNzAyNTkzMzA4NjUxODQgOTE4MjQzNC42NjYwMjEyNDgyNTAwMzc2MjIwNTA4NjA1RS02MTIgLT4gMQorZGl2eDMyMzUgZGl2aWRlIDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5MTgyNDM0LjY2NjAyMTI0ODI1MDAzNzYyMjA1MDg2MDVFLTYxMiAtPiAyLjU1Nzk3NzEwMDI3MDg0MDI3NTM0MTIyNjY1NzQ5NDFFKzYwNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjM1IGRpdmlkZWludCAyLjM0ODg0NTc2MDA0MTU0NzQyNzAyNTkzMzA4NjUxODQgOTE4MjQzNC42NjYwMjEyNDgyNTAwMzc2MjIwNTA4NjA1RS02MTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjM1IG11bHRpcGx5IDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5MTgyNDM0LjY2NjAyMTI0ODI1MDAzNzYyMjA1MDg2MDVFLTYxMiAtPiAyLjE1NjgxMjI3MzIxNDI1MzE1NTYyMTUyMDQ0NTk0MDdFLTYwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM1IHBvd2VyIDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5IC0+IDIxNzYuMTU4MzQ0NjE0NzUxMTU3OTExMzAyMjYyMjI1NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjM1IHJlbWFpbmRlciAyLjM0ODg0NTc2MDA0MTU0NzQyNzAyNTkzMzA4NjUxODQgOTE4MjQzNC42NjYwMjEyNDgyNTAwMzc2MjIwNTA4NjA1RS02MTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjM1IHN1YnRyYWN0IDIuMzQ4ODQ1NzYwMDQxNTQ3NDI3MDI1OTMzMDg2NTE4NCA5MTgyNDM0LjY2NjAyMTI0ODI1MDAzNzYyMjA1MDg2MDVFLTYxMiAtPiAyLjM0ODg0NTc2MDA0MTU0NzQyNzAyNTkzMzA4NjUxODQgSW5leGFjdCBSb3VuZGVkCithZGR4MzIzNiBhZGQgLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSA1NjYwOS4wNTQ4NjA1NTA1NzgzODY3ODAzOTQ5NjY4NkUtNzY4IC0+IC01MTA3NTg2MzAwMTk3Ljk3MDM5NDEwMzQ0MDQ1NTc0MDkgSW5leGFjdCBSb3VuZGVkCitjb214MzIzNiBjb21wYXJlIC01MTA3NTg2MzAwMTk3Ljk3MDM5NDEwMzQ0MDQ1NTc0MDkgNTY2MDkuMDU0ODYwNTUwNTc4Mzg2NzgwMzk0OTY2ODZFLTc2OCAtPiAtMQorZGl2eDMyMzYgZGl2aWRlIC01MTA3NTg2MzAwMTk3Ljk3MDM5NDEwMzQ0MDQ1NTc0MDkgNTY2MDkuMDU0ODYwNTUwNTc4Mzg2NzgwMzk0OTY2ODZFLTc2OCAtPiAtOS4wMjI1NjA2MzU4OTA5ODc3ODU1MzI2MzU3NDAyMjQyRSs3NzUgSW5leGFjdCBSb3VuZGVkCitkdml4MzIzNiBkaXZpZGVpbnQgLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSA1NjYwOS4wNTQ4NjA1NTA1NzgzODY3ODAzOTQ5NjY4NkUtNzY4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzIzNiBtdWx0aXBseSAtNTEwNzU4NjMwMDE5Ny45NzAzOTQxMDM0NDA0NTU3NDA5IDU2NjA5LjA1NDg2MDU1MDU3ODM4Njc4MDM5NDk2Njg2RS03NjggLT4gLTIuODkxMzU2MzMwNzI5MDM0NjE1MjU5NjIxMjU5MzUzMkUtNzUxIEluZXhhY3QgUm91bmRlZAorcG93eDMyMzYgcG93ZXIgLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSA2IC0+IDEuNzc1MzkyMDg5NDE4ODAyMjEyNTkxOTU1OTU2NTAyOUUrNzYgSW5leGFjdCBSb3VuZGVkCityZW14MzIzNiByZW1haW5kZXIgLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSA1NjYwOS4wNTQ4NjA1NTA1NzgzODY3ODAzOTQ5NjY4NkUtNzY4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzIzNiBzdWJ0cmFjdCAtNTEwNzU4NjMwMDE5Ny45NzAzOTQxMDM0NDA0NTU3NDA5IDU2NjA5LjA1NDg2MDU1MDU3ODM4Njc4MDM5NDk2Njg2RS03NjggLT4gLTUxMDc1ODYzMDAxOTcuOTcwMzk0MTAzNDQwNDU1NzQwOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjM3IGFkZCAtNzA0NTQwNzAwOTU4NjkuNzA3MTc4NzEyMTI2MDEzOTAgLTYyMDAxNzguMzcwMjQ5MjYwMDA5MTY4ODg4MzkyNDA2IC0+IC03MDQ1NDA3NjI5NjA0OC4wNzc0Mjc5NzIxMzUxODI3ODggSW5leGFjdCBSb3VuZGVkCitjb214MzIzNyBjb21wYXJlIC03MDQ1NDA3MDA5NTg2OS43MDcxNzg3MTIxMjYwMTM5MCAtNjIwMDE3OC4zNzAyNDkyNjAwMDkxNjg4ODgzOTI0MDYgLT4gLTEKK2RpdngzMjM3IGRpdmlkZSAtNzA0NTQwNzAwOTU4NjkuNzA3MTc4NzEyMTI2MDEzOTAgLTYyMDAxNzguMzcwMjQ5MjYwMDA5MTY4ODg4MzkyNDA2IC0+IDExMzYzMjMyLjc3OTU0OTQyMjQ5MDU0ODk5NzUxNzE5NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjM3IGRpdmlkZWludCAtNzA0NTQwNzAwOTU4NjkuNzA3MTc4NzEyMTI2MDEzOTAgLTYyMDAxNzguMzcwMjQ5MjYwMDA5MTY4ODg4MzkyNDA2IC0+IDExMzYzMjMyCittdWx4MzIzNyBtdWx0aXBseSAtNzA0NTQwNzAwOTU4NjkuNzA3MTc4NzEyMTI2MDEzOTAgLTYyMDAxNzguMzcwMjQ5MjYwMDA5MTY4ODg4MzkyNDA2IC0+IDQzNjgyNzgwMTUwNDQzNjU2Njk0NS43NjY2MzY4NzkyNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM3IHBvd2VyIC03MDQ1NDA3MDA5NTg2OS43MDcxNzg3MTIxMjYwMTM5MCAtNjIwMDE3OCAtPiAwRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzIzNyByZW1haW5kZXIgLTcwNDU0MDcwMDk1ODY5LjcwNzE3ODcxMjEyNjAxMzkwIC02MjAwMTc4LjM3MDI0OTI2MDAwOTE2ODg4ODM5MjQwNiAtPiAtNDgzMzM0NS40Njc4NjYyMDM5MjAwMjg4ODM1ODM4MDgKK3N1YngzMjM3IHN1YnRyYWN0IC03MDQ1NDA3MDA5NTg2OS43MDcxNzg3MTIxMjYwMTM5MCAtNjIwMDE3OC4zNzAyNDkyNjAwMDkxNjg4ODgzOTI0MDYgLT4gLTcwNDU0MDYzODk1NjkxLjMzNjkyOTQ1MjExNjg0NTAxMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjM4IGFkZCAyOTExOS4yMjA2MjE1MTEwNDY1NTg3NTc5MDA2NDUyMjggMzUxNzYxMi44ODEwNzYxNDcwMDE4Njc2MzExODYzMDEwRS0yMjIgLT4gMjkxMTkuMjIwNjIxNTExMDQ2NTU4NzU3OTAwNjQ1MjI4IEluZXhhY3QgUm91bmRlZAorY29teDMyMzggY29tcGFyZSAyOTExOS4yMjA2MjE1MTEwNDY1NTg3NTc5MDA2NDUyMjggMzUxNzYxMi44ODEwNzYxNDcwMDE4Njc2MzExODYzMDEwRS0yMjIgLT4gMQorZGl2eDMyMzggZGl2aWRlIDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCAzNTE3NjEyLjg4MTA3NjE0NzAwMTg2NzYzMTE4NjMwMTBFLTIyMiAtPiA4LjI3ODExOTczODAwODk2ODQwNjMyMzk3NTIzMzc0NjdFKzIxOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjM4IGRpdmlkZWludCAyOTExOS4yMjA2MjE1MTEwNDY1NTg3NTc5MDA2NDUyMjggMzUxNzYxMi44ODEwNzYxNDcwMDE4Njc2MzExODYzMDEwRS0yMjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjM4IG11bHRpcGx5IDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCAzNTE3NjEyLjg4MTA3NjE0NzAwMTg2NzYzMTE4NjMwMTBFLTIyMiAtPiAxLjAyNDMwMTQ1NTQ1MTI1NDI0NDA1OTI3NjgwODg2MDBFLTIxMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjM4IHBvd2VyIDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCA0IC0+IDcxODk4MzYwNTMyODQxNzQ2MS4zMjgzNTk4NDIxNzI1NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjM4IHJlbWFpbmRlciAyOTExOS4yMjA2MjE1MTEwNDY1NTg3NTc5MDA2NDUyMjggMzUxNzYxMi44ODEwNzYxNDcwMDE4Njc2MzExODYzMDEwRS0yMjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjM4IHN1YnRyYWN0IDI5MTE5LjIyMDYyMTUxMTA0NjU1ODc1NzkwMDY0NTIyOCAzNTE3NjEyLjg4MTA3NjE0NzAwMTg2NzYzMTE4NjMwMTBFLTIyMiAtPiAyOTExOS4yMjA2MjE1MTEwNDY1NTg3NTc5MDA2NDUyMjggSW5leGFjdCBSb3VuZGVkCithZGR4MzIzOSBhZGQgLTUxNjguMjIxNDExMTA5MTEzMjkxMzc3NjA0MjIxNDUyNSAtNTY5MDI3NC4wOTcxMTczNDc2NTI3MTIzNTY4NjI3NzIwIC0+IC01Njk1NDQyLjMxODUyODQ1Njc2NjAwMzczNDQ2Njk5MzUgSW5leGFjdCBSb3VuZGVkCitjb214MzIzOSBjb21wYXJlIC01MTY4LjIyMTQxMTEwOTExMzI5MTM3NzYwNDIyMTQ1MjUgLTU2OTAyNzQuMDk3MTE3MzQ3NjUyNzEyMzU2ODYyNzcyMCAtPiAxCitkaXZ4MzIzOSBkaXZpZGUgLTUxNjguMjIxNDExMTA5MTEzMjkxMzc3NjA0MjIxNDUyNSAtNTY5MDI3NC4wOTcxMTczNDc2NTI3MTIzNTY4NjI3NzIwIC0+IDAuMDAwOTA4MjU1MjY1NTQ2Mzk5MTU1ODA1MzkzMTY3MTQ0NTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzIzOSBkaXZpZGVpbnQgLTUxNjguMjIxNDExMTA5MTEzMjkxMzc3NjA0MjIxNDUyNSAtNTY5MDI3NC4wOTcxMTczNDc2NTI3MTIzNTY4NjI3NzIwIC0+IDAKK211bHgzMjM5IG11bHRpcGx5IC01MTY4LjIyMTQxMTEwOTExMzI5MTM3NzYwNDIyMTQ1MjUgLTU2OTAyNzQuMDk3MTE3MzQ3NjUyNzEyMzU2ODYyNzcyMCAtPiAyOTQwODU5NjQyMy44MDE0NTQwNTM4NTU3OTM4OTgzMjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzIzOSBwb3dlciAtNTE2OC4yMjE0MTExMDkxMTMyOTEzNzc2MDQyMjE0NTI1IC01NjkwMjc0IC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjM5IHJlbWFpbmRlciAtNTE2OC4yMjE0MTExMDkxMTMyOTEzNzc2MDQyMjE0NTI1IC01NjkwMjc0LjA5NzExNzM0NzY1MjcxMjM1Njg2Mjc3MjAgLT4gLTUxNjguMjIxNDExMTA5MTEzMjkxMzc3NjA0MjIxNDUyNQorc3VieDMyMzkgc3VidHJhY3QgLTUxNjguMjIxNDExMTA5MTEzMjkxMzc3NjA0MjIxNDUyNSAtNTY5MDI3NC4wOTcxMTczNDc2NTI3MTIzNTY4NjI3NzIwIC0+IDU2ODUxMDUuODc1NzA2MjM4NTM5NDIwOTc5MjU4NTUwNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQwIGFkZCAzMzc4My4wNjA4NTcxOTcwNjczOTE0NjIxNDQ1MTc5NjQgLTIwNzAuMDgwNjk1OTQ2NTA4ODE5ODUwODMyMjgxNTQwNiAtPiAzMTcxMi45ODAxNjEyNTA1NTg1NzE2MTEzMTIyMzY0MjMgSW5leGFjdCBSb3VuZGVkCitjb214MzI0MCBjb21wYXJlIDMzNzgzLjA2MDg1NzE5NzA2NzM5MTQ2MjE0NDUxNzk2NCAtMjA3MC4wODA2OTU5NDY1MDg4MTk4NTA4MzIyODE1NDA2IC0+IDEKK2RpdngzMjQwIGRpdmlkZSAzMzc4My4wNjA4NTcxOTcwNjczOTE0NjIxNDQ1MTc5NjQgLTIwNzAuMDgwNjk1OTQ2NTA4ODE5ODUwODMyMjgxNTQwNiAtPiAtMTYuMzE5NjgzMDU1NTE5ODkyODgxMzk0MzU4NDQ5MjIwIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNDAgZGl2aWRlaW50IDMzNzgzLjA2MDg1NzE5NzA2NzM5MTQ2MjE0NDUxNzk2NCAtMjA3MC4wODA2OTU5NDY1MDg4MTk4NTA4MzIyODE1NDA2IC0+IC0xNgorbXVseDMyNDAgbXVsdGlwbHkgMzM3ODMuMDYwODU3MTk3MDY3MzkxNDYyMTQ0NTE3OTY0IC0yMDcwLjA4MDY5NTk0NjUwODgxOTg1MDgzMjI4MTU0MDYgLT4gLTY5OTMzNjYyLjEzMDQ2OTc2NjA4MDU3NDIzNTg0MzQ0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQwIHBvd2VyIDMzNzgzLjA2MDg1NzE5NzA2NzM5MTQ2MjE0NDUxNzk2NCAtMjA3MCAtPiAzLjkxODEzMzYwMDE4MDMwMDg1OTcyOTM4MTg5ODQ0MDZFLTkzNzUgSW5leGFjdCBSb3VuZGVkCityZW14MzI0MCByZW1haW5kZXIgMzM3ODMuMDYwODU3MTk3MDY3MzkxNDYyMTQ0NTE3OTY0IC0yMDcwLjA4MDY5NTk0NjUwODgxOTg1MDgzMjI4MTU0MDYgLT4gNjYxLjc2OTcyMjA1MjkyNjI3Mzg0ODgyODAxMzMxNDQKK3N1YngzMjQwIHN1YnRyYWN0IDMzNzgzLjA2MDg1NzE5NzA2NzM5MTQ2MjE0NDUxNzk2NCAtMjA3MC4wODA2OTU5NDY1MDg4MTk4NTA4MzIyODE1NDA2IC0+IDM1ODUzLjE0MTU1MzE0MzU3NjIxMTMxMjk3Njc5OTUwNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQxIGFkZCA0MjIwNzQzNTA5MTA1MC44NDAyOTYzNTM4NzQ3MzMxNjlFLTkwNSA3MzMzMDYzMzA3OC44MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk3NiAtPiA3LjMzMzA2MzMwNzg4MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk4NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjQxIGNvbXBhcmUgNDIyMDc0MzUwOTEwNTAuODQwMjk2MzUzODc0NzMzMTY5RS05MDUgNzMzMzA2MzMwNzguODI4MjE2MDE4NTM2MzI2NzQzMzI1RSs5NzYgLT4gLTEKK2RpdngzMjQxIGRpdmlkZSA0MjIwNzQzNTA5MTA1MC44NDAyOTYzNTM4NzQ3MzMxNjlFLTkwNSA3MzMzMDYzMzA3OC44MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk3NiAtPiA1Ljc1NTc3MTI2NzYwNjQyMDY2MzYxNzgyNDc1NTQwNTZFLTE4NzkgSW5leGFjdCBSb3VuZGVkCitkdml4MzI0MSBkaXZpZGVpbnQgNDIyMDc0MzUwOTEwNTAuODQwMjk2MzUzODc0NzMzMTY5RS05MDUgNzMzMzA2MzMwNzguODI4MjE2MDE4NTM2MzI2NzQzMzI1RSs5NzYgLT4gMAorbXVseDMyNDEgbXVsdGlwbHkgNDIyMDc0MzUwOTEwNTAuODQwMjk2MzUzODc0NzMzMTY5RS05MDUgNzMzMzA2MzMwNzguODI4MjE2MDE4NTM2MzI2NzQzMzI1RSs5NzYgLT4gMy4wOTUwOTc5MzU4NjAzMDc1NjUwNTkyNDMzMzk4OTM5RSs5NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQxIHBvd2VyIDQyMjA3NDM1MDkxMDUwLjg0MDI5NjM1Mzg3NDczMzE2OUUtOTA1IDcgLT4gMi4zODYyODcyOTQwNjE1MjgzNTk5NTczMDgyOTY2NjQyRS02MjQwIEluZXhhY3QgUm91bmRlZAorcmVteDMyNDEgcmVtYWluZGVyIDQyMjA3NDM1MDkxMDUwLjg0MDI5NjM1Mzg3NDczMzE2OUUtOTA1IDczMzMwNjMzMDc4LjgyODIxNjAxODUzNjMyNjc0MzMyNUUrOTc2IC0+IDQuMjIwNzQzNTA5MTA1MDg0MDI5NjM1Mzg3NDczMzE2OUUtODkyCitzdWJ4MzI0MSBzdWJ0cmFjdCA0MjIwNzQzNTA5MTA1MC44NDAyOTYzNTM4NzQ3MzMxNjlFLTkwNSA3MzMzMDYzMzA3OC44MjgyMTYwMTg1MzYzMjY3NDMzMjVFKzk3NiAtPiAtNy4zMzMwNjMzMDc4ODI4MjE2MDE4NTM2MzI2NzQzMzI1RSs5ODYgSW5leGFjdCBSb3VuZGVkCithZGR4MzI0MiBhZGQgLTcxODAwLjgwNjcwMDg2ODc4NDg0MTA0NTQwNjY3OTY0MSAtMzk2MTc0NTY5NjQyNTA2OTc5MDI1MTkxNTA1MjY3MDEgLT4gLTM5NjE3NDU2OTY0MjUwNjk3OTAyNTE5MTUwNTk4NTAyIEluZXhhY3QgUm91bmRlZAorY29teDMyNDIgY29tcGFyZSAtNzE4MDAuODA2NzAwODY4Nzg0ODQxMDQ1NDA2Njc5NjQxIC0zOTYxNzQ1Njk2NDI1MDY5NzkwMjUxOTE1MDUyNjcwMSAtPiAxCitkaXZ4MzI0MiBkaXZpZGUgLTcxODAwLjgwNjcwMDg2ODc4NDg0MTA0NTQwNjY3OTY0MSAtMzk2MTc0NTY5NjQyNTA2OTc5MDI1MTkxNTA1MjY3MDEgLT4gMS44MTIzNTI3NDA1MDE3MjIwMTc4NTc5MDQ5OTY0MTI2RS0yNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjQyIGRpdmlkZWludCAtNzE4MDAuODA2NzAwODY4Nzg0ODQxMDQ1NDA2Njc5NjQxIC0zOTYxNzQ1Njk2NDI1MDY5NzkwMjUxOTE1MDUyNjcwMSAtPiAwCittdWx4MzI0MiBtdWx0aXBseSAtNzE4MDAuODA2NzAwODY4Nzg0ODQxMDQ1NDA2Njc5NjQxIC0zOTYxNzQ1Njk2NDI1MDY5NzkwMjUxOTE1MDUyNjcwMSAtPiAyLjg0NDU2NTM2OTQ3MDE1MjIxNjQ5MDE4Mjc1MjQ1MzhFKzM2IEluZXhhY3QgUm91bmRlZAorcG93eDMyNDIgcG93ZXIgLTcxODAwLjgwNjcwMDg2ODc4NDg0MTA0NTQwNjY3OTY0MSAtNCAtPiAzLjc2MjU1MzY4NTA4OTU0ODA4ODIxNzg1OTk0Mjg3NzRFLTIwIEluZXhhY3QgUm91bmRlZAorcmVteDMyNDIgcmVtYWluZGVyIC03MTgwMC44MDY3MDA4Njg3ODQ4NDEwNDU0MDY2Nzk2NDEgLTM5NjE3NDU2OTY0MjUwNjk3OTAyNTE5MTUwNTI2NzAxIC0+IC03MTgwMC44MDY3MDA4Njg3ODQ4NDEwNDU0MDY2Nzk2NDEKK3N1YngzMjQyIHN1YnRyYWN0IC03MTgwMC44MDY3MDA4Njg3ODQ4NDEwNDU0MDY2Nzk2NDEgLTM5NjE3NDU2OTY0MjUwNjk3OTAyNTE5MTUwNTI2NzAxIC0+IDM5NjE3NDU2OTY0MjUwNjk3OTAyNTE5MTUwNDU0OTAwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNDMgYWRkIDUzNjI3NDgwODAxLjYzMTUwNDg5MjMxMDAxNjA2MjE2MCAzMjgyNTkuNTY5NDc2NjEwNDkzMTMzMTE5ODMxMDk1MDMgLT4gNTM2Mjc4MDkwNjEuMjAwOTgxNTAyODAzMTQ5MTgxOTkxIEluZXhhY3QgUm91bmRlZAorY29teDMyNDMgY29tcGFyZSA1MzYyNzQ4MDgwMS42MzE1MDQ4OTIzMTAwMTYwNjIxNjAgMzI4MjU5LjU2OTQ3NjYxMDQ5MzEzMzExOTgzMTA5NTAzIC0+IDEKK2RpdngzMjQzIGRpdmlkZSA1MzYyNzQ4MDgwMS42MzE1MDQ4OTIzMTAwMTYwNjIxNjAgMzI4MjU5LjU2OTQ3NjYxMDQ5MzEzMzExOTgzMTA5NTAzIC0+IDE2MzM2OS4xMzE1OTAzOTcxNzkwMTUwMDQ2NTEwOTgzOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjQzIGRpdmlkZWludCA1MzYyNzQ4MDgwMS42MzE1MDQ4OTIzMTAwMTYwNjIxNjAgMzI4MjU5LjU2OTQ3NjYxMDQ5MzEzMzExOTgzMTA5NTAzIC0+IDE2MzM2OQorbXVseDMyNDMgbXVsdGlwbHkgNTM2Mjc0ODA4MDEuNjMxNTA0ODkyMzEwMDE2MDYyMTYwIDMyODI1OS41Njk0NzY2MTA0OTMxMzMxMTk4MzEwOTUwMyAtPiAxNzYwMzczMzc2MDA1ODc1Mi4zNjMxMjM1ODUyMjQzNjkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI0MyBwb3dlciA1MzYyNzQ4MDgwMS42MzE1MDQ4OTIzMTAwMTYwNjIxNjAgMzI4MjYwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDMyNDMgcmVtYWluZGVyIDUzNjI3NDgwODAxLjYzMTUwNDg5MjMxMDAxNjA2MjE2MCAzMjgyNTkuNTY5NDc2NjEwNDkzMTMzMTE5ODMxMDk1MDMgLT4gNDMxOTUuODA3MTI1MjM5NjQ1MzYyMzc1OTk2MDQzOTMKK3N1YngzMjQzIHN1YnRyYWN0IDUzNjI3NDgwODAxLjYzMTUwNDg5MjMxMDAxNjA2MjE2MCAzMjgyNTkuNTY5NDc2NjEwNDkzMTMzMTE5ODMxMDk1MDMgLT4gNTM2MjcxNTI1NDIuMDYyMDI4MjgxODE2ODgyOTQyMzI5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNDQgYWRkIC01MDUyNjAxNTk4LjU1NTkzNzEzMzg0MjgzNjg0Mzg3MjggLTk3ODU1MzcyLjIyNDMyMTY2NDc4NTMxNDc4MjU1NjA2NCAtPiAtNTE1MDQ1Njk3MC43ODAyNTg3OTg2MjgxNTE2MjY0Mjg5IEluZXhhY3QgUm91bmRlZAorY29teDMyNDQgY29tcGFyZSAtNTA1MjYwMTU5OC41NTU5MzcxMzM4NDI4MzY4NDM4NzI4IC05Nzg1NTM3Mi4yMjQzMjE2NjQ3ODUzMTQ3ODI1NTYwNjQgLT4gLTEKK2RpdngzMjQ0IGRpdmlkZSAtNTA1MjYwMTU5OC41NTU5MzcxMzM4NDI4MzY4NDM4NzI4IC05Nzg1NTM3Mi4yMjQzMjE2NjQ3ODUzMTQ3ODI1NTYwNjQgLT4gNTEuNjMzMzU5MzUxNzMyNDMyMjgzODc5Mjc0MTkyOTQ3IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNDQgZGl2aWRlaW50IC01MDUyNjAxNTk4LjU1NTkzNzEzMzg0MjgzNjg0Mzg3MjggLTk3ODU1MzcyLjIyNDMyMTY2NDc4NTMxNDc4MjU1NjA2NCAtPiA1MQorbXVseDMyNDQgbXVsdGlwbHkgLTUwNTI2MDE1OTguNTU1OTM3MTMzODQyODM2ODQzODcyOCAtOTc4NTUzNzIuMjI0MzIxNjY0Nzg1MzE0NzgyNTU2MDY0IC0+IDQ5NDQyNDIxMDEyNzg5Mzg5My4xMjU4MTUxMjk1NDc4NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQ0IHBvd2VyIC01MDUyNjAxNTk4LjU1NTkzNzEzMzg0MjgzNjg0Mzg3MjggLTk3ODU1MzcyIC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjQ0IHJlbWFpbmRlciAtNTA1MjYwMTU5OC41NTU5MzcxMzM4NDI4MzY4NDM4NzI4IC05Nzg1NTM3Mi4yMjQzMjE2NjQ3ODUzMTQ3ODI1NTYwNjQgLT4gLTYxOTc3NjE1LjExNTUzMjIyOTc5MTc4MjkzMzUxMzUzNgorc3VieDMyNDQgc3VidHJhY3QgLTUwNTI2MDE1OTguNTU1OTM3MTMzODQyODM2ODQzODcyOCAtOTc4NTUzNzIuMjI0MzIxNjY0Nzg1MzE0NzgyNTU2MDY0IC0+IC00OTU0NzQ2MjI2LjMzMTYxNTQ2OTA1NzUyMjA2MTMxNjcgSW5leGFjdCBSb3VuZGVkCithZGR4MzI0NSBhZGQgNDIwODEzNDMyMDczMy43MDY5NzQyOTg4MjI4MDY4MTkxRSsxNDYgNDI3MDg2OS4xNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzEgLT4gNC4yNzA4NjkxNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzcgSW5leGFjdCBSb3VuZGVkCitjb214MzI0NSBjb21wYXJlIDQyMDgxMzQzMjA3MzMuNzA2OTc0Mjk4ODIyODA2ODE5MUUrMTQ2IDQyNzA4NjkuMTc2MDE0OTQ3NzU5ODkyMDk2MDYyODM5MkUrNDcxIC0+IC0xCitkaXZ4MzI0NSBkaXZpZGUgNDIwODEzNDMyMDczMy43MDY5NzQyOTg4MjI4MDY4MTkxRSsxNDYgNDI3MDg2OS4xNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzEgLT4gOS44NTMxMDk4NjQzMDIxOTUxMDQ4NzQ0MDc4MDI3MjgzRS0zMjAgSW5leGFjdCBSb3VuZGVkCitkdml4MzI0NSBkaXZpZGVpbnQgNDIwODEzNDMyMDczMy43MDY5NzQyOTg4MjI4MDY4MTkxRSsxNDYgNDI3MDg2OS4xNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzEgLT4gMAorbXVseDMyNDUgbXVsdGlwbHkgNDIwODEzNDMyMDczMy43MDY5NzQyOTg4MjI4MDY4MTkxRSsxNDYgNDI3MDg2OS4xNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzEgLT4gMS43OTcyMzkxMTU4OTUyMTg5MDAyMTY5MDgyNzUzMTgzRSs2MzYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI0NSBwb3dlciA0MjA4MTM0MzIwNzMzLjcwNjk3NDI5ODgyMjgwNjgxOTFFKzE0NiA0IC0+IDMuMTM1ODcyMzQzOTgzMDg3MjEyNzEyOTgyMTk2Mzg1N0UrNjM0IEluZXhhY3QgUm91bmRlZAorcmVteDMyNDUgcmVtYWluZGVyIDQyMDgxMzQzMjA3MzMuNzA2OTc0Mjk4ODIyODA2ODE5MUUrMTQ2IDQyNzA4NjkuMTc2MDE0OTQ3NzU5ODkyMDk2MDYyODM5MkUrNDcxIC0+IDQuMjA4MTM0MzIwNzMzNzA2OTc0Mjk4ODIyODA2ODE5MUUrMTU4CitzdWJ4MzI0NSBzdWJ0cmFjdCA0MjA4MTM0MzIwNzMzLjcwNjk3NDI5ODgyMjgwNjgxOTFFKzE0NiA0MjcwODY5LjE3NjAxNDk0Nzc1OTg5MjA5NjA2MjgzOTJFKzQ3MSAtPiAtNC4yNzA4NjkxNzYwMTQ5NDc3NTk4OTIwOTYwNjI4MzkyRSs0NzcgSW5leGFjdCBSb3VuZGVkCithZGR4MzI0NiBhZGQgLTguNTA3NzAwOTY1Nzk0MjU4MTUxNTU5MDQ3MTE4OTA4NEUrMzA4IDk2NTIxNDUxNTUuMzc0MjE3MDQ3ODQyMTE0MDQyMzc2RS0yNTAgLT4gLTguNTA3NzAwOTY1Nzk0MjU4MTUxNTU5MDQ3MTE4OTA4NEUrMzA4IEluZXhhY3QgUm91bmRlZAorY29teDMyNDYgY29tcGFyZSAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggOTY1MjE0NTE1NS4zNzQyMTcwNDc4NDIxMTQwNDIzNzZFLTI1MCAtPiAtMQorZGl2eDMyNDYgZGl2aWRlIC04LjUwNzcwMDk2NTc5NDI1ODE1MTU1OTA0NzExODkwODRFKzMwOCA5NjUyMTQ1MTU1LjM3NDIxNzA0Nzg0MjExNDA0MjM3NkUtMjUwIC0+IC04LjgxNDMxMTA0NTcyMzYwODk5NzgwNzA0MTkwNDc5NzBFKzU0OCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjQ2IGRpdmlkZWludCAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggOTY1MjE0NTE1NS4zNzQyMTcwNDc4NDIxMTQwNDIzNzZFLTI1MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNDYgbXVsdGlwbHkgLTguNTA3NzAwOTY1Nzk0MjU4MTUxNTU5MDQ3MTE4OTA4NEUrMzA4IDk2NTIxNDUxNTUuMzc0MjE3MDQ3ODQyMTE0MDQyMzc2RS0yNTAgLT4gLTguMjExNzU2NDY2MDM2MzU5NjI4MzczMjk0MjA5MTg1MkUrNjggSW5leGFjdCBSb3VuZGVkCitwb3d4MzI0NiBwb3dlciAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggMTAgLT4gMS45ODY2NTM2ODEyNTczMjA3ODY4MzUwNjQwNzYwNjc4RSszMDg5IEluZXhhY3QgUm91bmRlZAorcmVteDMyNDYgcmVtYWluZGVyIC04LjUwNzcwMDk2NTc5NDI1ODE1MTU1OTA0NzExODkwODRFKzMwOCA5NjUyMTQ1MTU1LjM3NDIxNzA0Nzg0MjExNDA0MjM3NkUtMjUwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI0NiBzdWJ0cmFjdCAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggOTY1MjE0NTE1NS4zNzQyMTcwNDc4NDIxMTQwNDIzNzZFLTI1MCAtPiAtOC41MDc3MDA5NjU3OTQyNTgxNTE1NTkwNDcxMTg5MDg0RSszMDggSW5leGFjdCBSb3VuZGVkCithZGR4MzI0NyBhZGQgLTk1MDQuOTcwMzAzMjI4Njk2MDc5MDkwNDE4MTA3ODA2M0UrNjE5IC04Ni4yNDU5NTY5NDkwNDkxODY1MzM0NjkyMDY0ODUwMDMgLT4gLTkuNTA0OTcwMzAzMjI4Njk2MDc5MDkwNDE4MTA3ODA2M0UrNjIyIEluZXhhY3QgUm91bmRlZAorY29teDMyNDcgY29tcGFyZSAtOTUwNC45NzAzMDMyMjg2OTYwNzkwOTA0MTgxMDc4MDYzRSs2MTkgLTg2LjI0NTk1Njk0OTA0OTE4NjUzMzQ2OTIwNjQ4NTAwMyAtPiAtMQorZGl2eDMyNDcgZGl2aWRlIC05NTA0Ljk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYxOSAtODYuMjQ1OTU2OTQ5MDQ5MTg2NTMzNDY5MjA2NDg1MDAzIC0+IDEuMTAyMDc3MjAzMzIyNTcwNzEyNTM5MTIxMjUxOTQyMUUrNjIxIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNDcgZGl2aWRlaW50IC05NTA0Ljk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYxOSAtODYuMjQ1OTU2OTQ5MDQ5MTg2NTMzNDY5MjA2NDg1MDAzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI0NyBtdWx0aXBseSAtOTUwNC45NzAzMDMyMjg2OTYwNzkwOTA0MTgxMDc4MDYzRSs2MTkgLTg2LjI0NTk1Njk0OTA0OTE4NjUzMzQ2OTIwNjQ4NTAwMyAtPiA4LjE5NzY1MjU5NTc0MjUzMTE0Mjc4NTgwODcxMTc2NTVFKzYyNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjQ3IHBvd2VyIC05NTA0Ljk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYxOSAtODYgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyNDcgcmVtYWluZGVyIC05NTA0Ljk3MDMwMzIyODY5NjA3OTA5MDQxODEwNzgwNjNFKzYxOSAtODYuMjQ1OTU2OTQ5MDQ5MTg2NTMzNDY5MjA2NDg1MDAzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI0NyBzdWJ0cmFjdCAtOTUwNC45NzAzMDMyMjg2OTYwNzkwOTA0MTgxMDc4MDYzRSs2MTkgLTg2LjI0NTk1Njk0OTA0OTE4NjUzMzQ2OTIwNjQ4NTAwMyAtPiAtOS41MDQ5NzAzMDMyMjg2OTYwNzkwOTA0MTgxMDc4MDYzRSs2MjIgSW5leGFjdCBSb3VuZGVkCithZGR4MzI0OCBhZGQgLTQ0MDIyMDkxNi42NjcxNjc0MzAyNjg5NjkzMTE5NDc0OSAtMTAyNzI1LjAxNTk0Mzc3ODcxNTYwNTY0ODI0MzU4Nzc1IC0+IC00NDAzMjM2NDEuNjgzMTExMjA4OTg0NTc0OTYwMTkxMDggSW5leGFjdCBSb3VuZGVkCitjb214MzI0OCBjb21wYXJlIC00NDAyMjA5MTYuNjY3MTY3NDMwMjY4OTY5MzExOTQ3NDkgLTEwMjcyNS4wMTU5NDM3Nzg3MTU2MDU2NDgyNDM1ODc3NSAtPiAtMQorZGl2eDMyNDggZGl2aWRlIC00NDAyMjA5MTYuNjY3MTY3NDMwMjY4OTY5MzExOTQ3NDkgLTEwMjcyNS4wMTU5NDM3Nzg3MTU2MDU2NDgyNDM1ODc3NSAtPiA0Mjg1LjQzMDUwMjIyNjQ0NzMyNjk3NzAyNDYxMjYyMzQgSW5leGFjdCBSb3VuZGVkCitkdml4MzI0OCBkaXZpZGVpbnQgLTQ0MDIyMDkxNi42NjcxNjc0MzAyNjg5NjkzMTE5NDc0OSAtMTAyNzI1LjAxNTk0Mzc3ODcxNTYwNTY0ODI0MzU4Nzc1IC0+IDQyODUKK211bHgzMjQ4IG11bHRpcGx5IC00NDAyMjA5MTYuNjY3MTY3NDMwMjY4OTY5MzExOTQ3NDkgLTEwMjcyNS4wMTU5NDM3Nzg3MTU2MDU2NDgyNDM1ODc3NSAtPiA0NTIyMTcwMDY4MzQxOS42NTU1OTY3NzE3MTE2MDM1MDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI0OCBwb3dlciAtNDQwMjIwOTE2LjY2NzE2NzQzMDI2ODk2OTMxMTk0NzQ5IC0xMDI3MjUgLT4gLTBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjQ4IHJlbWFpbmRlciAtNDQwMjIwOTE2LjY2NzE2NzQzMDI2ODk2OTMxMTk0NzQ5IC0xMDI3MjUuMDE1OTQzNzc4NzE1NjA1NjQ4MjQzNTg3NzUgLT4gLTQ0MjIzLjM0ODA3NTYzMzg5ODc2NjU4ODE3Mzk4MTI1CitzdWJ4MzI0OCBzdWJ0cmFjdCAtNDQwMjIwOTE2LjY2NzE2NzQzMDI2ODk2OTMxMTk0NzQ5IC0xMDI3MjUuMDE1OTQzNzc4NzE1NjA1NjQ4MjQzNTg3NzUgLT4gLTQ0MDExODE5MS42NTEyMjM2NTE1NTMzNjM2NjM3MDM5MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjQ5IGFkZCAtNDYuMjUwNzM1MDg2MDA2MzUwNTE3OTQzNDY0NzU4MDE5IDE0NjU2MzU3NTU1MTc0LjI2MzI5NTI2NjA3NDkwODAyNCAtPiAxNDY1NjM1NzU1NTEyOC4wMTI1NjAxODAwNjg1NTc1MDYgSW5leGFjdCBSb3VuZGVkCitjb214MzI0OSBjb21wYXJlIC00Ni4yNTA3MzUwODYwMDYzNTA1MTc5NDM0NjQ3NTgwMTkgMTQ2NTYzNTc1NTUxNzQuMjYzMjk1MjY2MDc0OTA4MDI0IC0+IC0xCitkaXZ4MzI0OSBkaXZpZGUgLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOSAxNDY1NjM1NzU1NTE3NC4yNjMyOTUyNjYwNzQ5MDgwMjQgLT4gLTMuMTU1Njc3MzE2OTUyMzMxMzkzMjIwNzcyNTUyMjg2NkUtMTIgSW5leGFjdCBSb3VuZGVkCitkdml4MzI0OSBkaXZpZGVpbnQgLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOSAxNDY1NjM1NzU1NTE3NC4yNjMyOTUyNjYwNzQ5MDgwMjQgLT4gLTAKK211bHgzMjQ5IG11bHRpcGx5IC00Ni4yNTA3MzUwODYwMDYzNTA1MTc5NDM0NjQ3NTgwMTkgMTQ2NTYzNTc1NTUxNzQuMjYzMjk1MjY2MDc0OTA4MDI0IC0+IC02Nzc4NjczMTA2MTAxNTIuNTU1Njk2MjA0NTk3ODg1MzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI0OSBwb3dlciAtNDYuMjUwNzM1MDg2MDA2MzUwNTE3OTQzNDY0NzU4MDE5IDEgLT4gLTQ2LjI1MDczNTA4NjAwNjM1MDUxNzk0MzQ2NDc1ODAxOQorcmVteDMyNDkgcmVtYWluZGVyIC00Ni4yNTA3MzUwODYwMDYzNTA1MTc5NDM0NjQ3NTgwMTkgMTQ2NTYzNTc1NTUxNzQuMjYzMjk1MjY2MDc0OTA4MDI0IC0+IC00Ni4yNTA3MzUwODYwMDYzNTA1MTc5NDM0NjQ3NTgwMTkKK3N1YngzMjQ5IHN1YnRyYWN0IC00Ni4yNTA3MzUwODYwMDYzNTA1MTc5NDM0NjQ3NTgwMTkgMTQ2NTYzNTc1NTUxNzQuMjYzMjk1MjY2MDc0OTA4MDI0IC0+IC0xNDY1NjM1NzU1NTIyMC41MTQwMzAzNTIwODEyNTg1NDIgSW5leGFjdCBSb3VuZGVkCithZGR4MzI1MCBhZGQgLTYxNjQxMTIxMjk5MzkxLjMxNjQyMDY0NzEwMjY5OTYyN0UrNzYzIC05MTg5NjQ2OTg2My40NjEwMDY5MDM1OTAwMDQxODgxODdFKzQ3NCAtPiAtNi4xNjQxMTIxMjk5MzkxMzE2NDIwNjQ3MTAyNjk5NjI3RSs3NzYgSW5leGFjdCBSb3VuZGVkCitjb214MzI1MCBjb21wYXJlIC02MTY0MTEyMTI5OTM5MS4zMTY0MjA2NDcxMDI2OTk2MjdFKzc2MyAtOTE4OTY0Njk4NjMuNDYxMDA2OTAzNTkwMDA0MTg4MTg3RSs0NzQgLT4gLTEKK2RpdngzMjUwIGRpdmlkZSAtNjE2NDExMjEyOTkzOTEuMzE2NDIwNjQ3MTAyNjk5NjI3RSs3NjMgLTkxODk2NDY5ODYzLjQ2MTAwNjkwMzU5MDAwNDE4ODE4N0UrNDc0IC0+IDYuNzA3NjcwMjA2NTg5NzgxOTYwNDcxNjk0Njg1MjU4MUUrMjkxIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNTAgZGl2aWRlaW50IC02MTY0MTEyMTI5OTM5MS4zMTY0MjA2NDcxMDI2OTk2MjdFKzc2MyAtOTE4OTY0Njk4NjMuNDYxMDA2OTAzNTkwMDA0MTg4MTg3RSs0NzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjUwIG11bHRpcGx5IC02MTY0MTEyMTI5OTM5MS4zMTY0MjA2NDcxMDI2OTk2MjdFKzc2MyAtOTE4OTY0Njk4NjMuNDYxMDA2OTAzNTkwMDA0MTg4MTg3RSs0NzQgLT4gNS42NjQ2MDE0NDU4Mzk0NTg0OTIxNTc5NDE3NTA0OTM5RSsxMjYxIEluZXhhY3QgUm91bmRlZAorcG93eDMyNTAgcG93ZXIgLTYxNjQxMTIxMjk5MzkxLjMxNjQyMDY0NzEwMjY5OTYyN0UrNzYzIC05IC0+IC03Ljc4MzMyNjExNzk5NzU1MzI1MDg3NDgxNTA3MDg2MDVFLTY5OTIgSW5leGFjdCBSb3VuZGVkCityZW14MzI1MCByZW1haW5kZXIgLTYxNjQxMTIxMjk5MzkxLjMxNjQyMDY0NzEwMjY5OTYyN0UrNzYzIC05MTg5NjQ2OTg2My40NjEwMDY5MDM1OTAwMDQxODgxODdFKzQ3NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyNTAgc3VidHJhY3QgLTYxNjQxMTIxMjk5MzkxLjMxNjQyMDY0NzEwMjY5OTYyN0UrNzYzIC05MTg5NjQ2OTg2My40NjEwMDY5MDM1OTAwMDQxODgxODdFKzQ3NCAtPiAtNi4xNjQxMTIxMjk5MzkxMzE2NDIwNjQ3MTAyNjk5NjI3RSs3NzYgSW5leGFjdCBSb3VuZGVkCithZGR4MzI1MSBhZGQgOTY2Njg0MTk4MDI3NDkuNTU1NzM4MDEwMjM5MDg3NDQ5RS04MzggLTE5NDk4NzMyMTMxMzY1ODI0OTIxNjM5NDY3MDQ0OTI3RS01NDIgLT4gLTEuOTQ5ODczMjEzMTM2NTgyNDkyMTYzOTQ2NzA0NDkyN0UtNTExIEluZXhhY3QgUm91bmRlZAorY29teDMyNTEgY29tcGFyZSA5NjY2ODQxOTgwMjc0OS41NTU3MzgwMTAyMzkwODc0NDlFLTgzOCAtMTk0OTg3MzIxMzEzNjU4MjQ5MjE2Mzk0NjcwNDQ5MjdFLTU0MiAtPiAxCitkaXZ4MzI1MSBkaXZpZGUgOTY2Njg0MTk4MDI3NDkuNTU1NzM4MDEwMjM5MDg3NDQ5RS04MzggLTE5NDk4NzMyMTMxMzY1ODI0OTIxNjM5NDY3MDQ0OTI3RS01NDIgLT4gLTQuOTU3Njc3MjA0NDE5MjUxNDcxNTQ1MzIxNTkzMzcwNEUtMzE0IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNTEgZGl2aWRlaW50IDk2NjY4NDE5ODAyNzQ5LjU1NTczODAxMDIzOTA4NzQ0OUUtODM4IC0xOTQ5ODczMjEzMTM2NTgyNDkyMTYzOTQ2NzA0NDkyN0UtNTQyIC0+IC0wCittdWx4MzI1MSBtdWx0aXBseSA5NjY2ODQxOTgwMjc0OS41NTU3MzgwMTAyMzkwODc0NDlFLTgzOCAtMTk0OTg3MzIxMzEzNjU4MjQ5MjE2Mzk0NjcwNDQ5MjdFLTU0MiAtPiAtMS44ODQ5MTE2MjMyOTYyMzMxNjE3MTQwNjc2Mjc0NjExRS0xMzM1IEluZXhhY3QgUm91bmRlZAorcG93eDMyNTEgcG93ZXIgOTY2Njg0MTk4MDI3NDkuNTU1NzM4MDEwMjM5MDg3NDQ5RS04MzggLTIgLT4gMS4wNzAxMTU3NjI1MjY4ODk2MzIzNjExNjMzMzUwMDAzRSsxNjQ4IEluZXhhY3QgUm91bmRlZAorcmVteDMyNTEgcmVtYWluZGVyIDk2NjY4NDE5ODAyNzQ5LjU1NTczODAxMDIzOTA4NzQ0OUUtODM4IC0xOTQ5ODczMjEzMTM2NTgyNDkyMTYzOTQ2NzA0NDkyN0UtNTQyIC0+IDkuNjY2ODQxOTgwMjc0OTU1NTczODAxMDIzOTA4NzQ0OUUtODI1CitzdWJ4MzI1MSBzdWJ0cmFjdCA5NjY2ODQxOTgwMjc0OS41NTU3MzgwMTAyMzkwODc0NDlFLTgzOCAtMTk0OTg3MzIxMzEzNjU4MjQ5MjE2Mzk0NjcwNDQ5MjdFLTU0MiAtPiAxLjk0OTg3MzIxMzEzNjU4MjQ5MjE2Mzk0NjcwNDQ5MjdFLTUxMSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjUyIGFkZCAtODUzNDU0MzkxMTE5Nzk5NTkwNjAzMTI0NTcxOTUxOUUrMTI0IDE2NDg3MTE3MDUwMDMxLjU5NDg4NjU0MTY1MDg5Nzk3NCAtPiAtOC41MzQ1NDM5MTExOTc5OTU5MDYwMzEyNDU3MTk1MTkwRSsxNTQgSW5leGFjdCBSb3VuZGVkCitjb214MzI1MiBjb21wYXJlIC04NTM0NTQzOTExMTk3OTk1OTA2MDMxMjQ1NzE5NTE5RSsxMjQgMTY0ODcxMTcwNTAwMzEuNTk0ODg2NTQxNjUwODk3OTc0IC0+IC0xCitkaXZ4MzI1MiBkaXZpZGUgLTg1MzQ1NDM5MTExOTc5OTU5MDYwMzEyNDU3MTk1MTlFKzEyNCAxNjQ4NzExNzA1MDAzMS41OTQ4ODY1NDE2NTA4OTc5NzQgLT4gLTUuMTc2NDkyNTgyMjM4MTA2MjI4Nzk1OTUyMzM3MTMxNkUrMTQxIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNTIgZGl2aWRlaW50IC04NTM0NTQzOTExMTk3OTk1OTA2MDMxMjQ1NzE5NTE5RSsxMjQgMTY0ODcxMTcwNTAwMzEuNTk0ODg2NTQxNjUwODk3OTc0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI1MiBtdWx0aXBseSAtODUzNDU0MzkxMTE5Nzk5NTkwNjAzMTI0NTcxOTUxOUUrMTI0IDE2NDg3MTE3MDUwMDMxLjU5NDg4NjU0MTY1MDg5Nzk3NCAtPiAtMS40MDcxMDAyNDQzMjU1NTgxMjE3NDcxNjk4NzMxMjQwRSsxNjggSW5leGFjdCBSb3VuZGVkCitwb3d4MzI1MiBwb3dlciAtODUzNDU0MzkxMTE5Nzk5NTkwNjAzMTI0NTcxOTUxOUUrMTI0IDIgLT4gNy4yODM4NDM5NzcyMTY2Nzg1NDI5NDgyOTk1MDQxMzM3RSszMDkgSW5leGFjdCBSb3VuZGVkCityZW14MzI1MiByZW1haW5kZXIgLTg1MzQ1NDM5MTExOTc5OTU5MDYwMzEyNDU3MTk1MTlFKzEyNCAxNjQ4NzExNzA1MDAzMS41OTQ4ODY1NDE2NTA4OTc5NzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjUyIHN1YnRyYWN0IC04NTM0NTQzOTExMTk3OTk1OTA2MDMxMjQ1NzE5NTE5RSsxMjQgMTY0ODcxMTcwNTAwMzEuNTk0ODg2NTQxNjUwODk3OTc0IC0+IC04LjUzNDU0MzkxMTE5Nzk5NTkwNjAzMTI0NTcxOTUxOTBFKzE1NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjUzIGFkZCAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IC0+IDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IEluZXhhY3QgUm91bmRlZAorY29teDMyNTMgY29tcGFyZSAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IC0+IC0xCitkaXZ4MzI1MyBkaXZpZGUgLTYyNjYzNDA0Nzc3LjM1MjUwODk3OTU4Mjg0NjkzMTA1MCA5LjI1NzA5Mzg4MzcyMzkxMzQwNTI1ODkxODQ5MTcxODZFKzkxNiAtPiAtNi43NjkyMzA3NzIwMzg0MTQyNTkyNTk3MTI0OTU2OTUxRS05MDcgSW5leGFjdCBSb3VuZGVkCitkdml4MzI1MyBkaXZpZGVpbnQgLTYyNjYzNDA0Nzc3LjM1MjUwODk3OTU4Mjg0NjkzMTA1MCA5LjI1NzA5Mzg4MzcyMzkxMzQwNTI1ODkxODQ5MTcxODZFKzkxNiAtPiAtMAorbXVseDMyNTMgbXVsdGlwbHkgLTYyNjYzNDA0Nzc3LjM1MjUwODk3OTU4Mjg0NjkzMTA1MCA5LjI1NzA5Mzg4MzcyMzkxMzQwNTI1ODkxODQ5MTcxODZFKzkxNiAtPiAtNS44MDA4MTAyMTA5Nzc0NTc2NjU0NzA5MDE4MDEyODc2RSs5MjcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI1MyBwb3dlciAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkgLT4gLTEuNDg5NzkyODgxNDEzMzA1OTYxNTY3MDQ2Mjc1MzgyNUUrOTcgSW5leGFjdCBSb3VuZGVkCityZW14MzI1MyByZW1haW5kZXIgLTYyNjYzNDA0Nzc3LjM1MjUwODk3OTU4Mjg0NjkzMTA1MCA5LjI1NzA5Mzg4MzcyMzkxMzQwNTI1ODkxODQ5MTcxODZFKzkxNiAtPiAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwCitzdWJ4MzI1MyBzdWJ0cmFjdCAtNjI2NjM0MDQ3NzcuMzUyNTA4OTc5NTgyODQ2OTMxMDUwIDkuMjU3MDkzODgzNzIzOTEzNDA1MjU4OTE4NDkxNzE4NkUrOTE2IC0+IC05LjI1NzA5Mzg4MzcyMzkxMzQwNTI1ODkxODQ5MTcxODZFKzkxNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjU0IGFkZCAxLjc0NDYwMTIxNDQ3NDU2MDk5Mjc1NDUyOTMyMDE3MkUtODI3IC0xNy4zNTM2Njk1MDQyNTM0MTk0ODk0OTQwMzA2NTE1MDdFLTYzMSAtPiAtMS43MzUzNjY5NTA0MjUzNDE5NDg5NDk0MDMwNjUxNTA3RS02MzAgSW5leGFjdCBSb3VuZGVkCitjb214MzI1NCBjb21wYXJlIDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcgLTE3LjM1MzY2OTUwNDI1MzQxOTQ4OTQ5NDAzMDY1MTUwN0UtNjMxIC0+IDEKK2RpdngzMjU0IGRpdmlkZSAxLjc0NDYwMTIxNDQ3NDU2MDk5Mjc1NDUyOTMyMDE3MkUtODI3IC0xNy4zNTM2Njk1MDQyNTM0MTk0ODk0OTQwMzA2NTE1MDdFLTYzMSAtPiAtMS4wMDUzMjEyMTY5NjA0NTY1MjMwNDk3MTE3OTY2MDA0RS0xOTcgSW5leGFjdCBSb3VuZGVkCitkdml4MzI1NCBkaXZpZGVpbnQgMS43NDQ2MDEyMTQ0NzQ1NjA5OTI3NTQ1MjkzMjAxNzJFLTgyNyAtMTcuMzUzNjY5NTA0MjUzNDE5NDg5NDk0MDMwNjUxNTA3RS02MzEgLT4gLTAKK211bHgzMjU0IG11bHRpcGx5IDEuNzQ0NjAxMjE0NDc0NTYwOTkyNzU0NTI5MzIwMTcyRS04MjcgLTE3LjM1MzY2OTUwNDI1MzQxOTQ4OTQ5NDAzMDY1MTUwN0UtNjMxIC0+IC0zLjAyNzUyMzI4OTI3MTA2Njg0MzI4OTUwNDk1NDYyMzNFLTE0NTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI1NCBwb3dlciAxLjc0NDYwMTIxNDQ3NDU2MDk5Mjc1NDUyOTMyMDE3MkUtODI3IC0yIC0+IDMuMjg1NTQ2ODA5OTYxNTI4MjM5NDk5MjU0MjUxNTk4MEUrMTY1MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjU0IHJlbWFpbmRlciAxLjc0NDYwMTIxNDQ3NDU2MDk5Mjc1NDUyOTMyMDE3MkUtODI3IC0xNy4zNTM2Njk1MDQyNTM0MTk0ODk0OTQwMzA2NTE1MDdFLTYzMSAtPiAxLjc0NDYwMTIxNDQ3NDU2MDk5Mjc1NDUyOTMyMDE3MkUtODI3CitzdWJ4MzI1NCBzdWJ0cmFjdCAxLjc0NDYwMTIxNDQ3NDU2MDk5Mjc1NDUyOTMyMDE3MkUtODI3IC0xNy4zNTM2Njk1MDQyNTM0MTk0ODk0OTQwMzA2NTE1MDdFLTYzMSAtPiAxLjczNTM2Njk1MDQyNTM0MTk0ODk0OTQwMzA2NTE1MDdFLTYzMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjU1IGFkZCAwMzY3MTkxNTQ5MDM2NzAyMjI0ODI3NzM0ODUzNDcxIDQ0MTAzMjA2NjI0MTUyNjY1MzM3NjMxNDM4Mzc3NDJFKzcyMSAtPiA0LjQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MjBFKzc1MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjU1IGNvbXBhcmUgMDM2NzE5MTU0OTAzNjcwMjIyNDgyNzczNDg1MzQ3MSA0NDEwMzIwNjYyNDE1MjY2NTMzNzYzMTQzODM3NzQyRSs3MjEgLT4gLTEKK2RpdngzMjU1IGRpdmlkZSAwMzY3MTkxNTQ5MDM2NzAyMjI0ODI3NzM0ODUzNDcxIDQ0MTAzMjA2NjI0MTUyNjY1MzM3NjMxNDM4Mzc3NDJFKzcyMSAtPiA4LjMyNTczMzU5NDk3MjA2MTkwOTM5NjM5MTc5NDI1MjVFLTcyMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjU1IGRpdmlkZWludCAwMzY3MTkxNTQ5MDM2NzAyMjI0ODI3NzM0ODUzNDcxIDQ0MTAzMjA2NjI0MTUyNjY1MzM3NjMxNDM4Mzc3NDJFKzcyMSAtPiAwCittdWx4MzI1NSBtdWx0aXBseSAwMzY3MTkxNTQ5MDM2NzAyMjI0ODI3NzM0ODUzNDcxIDQ0MTAzMjA2NjI0MTUyNjY1MzM3NjMxNDM4Mzc3NDJFKzcyMSAtPiAxLjYxOTQzMjQ3NTc4MDgzNjM4MDI5NDcxOTIwNTQ5NjZFKzc4MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjU1IHBvd2VyIDAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEgNCAtPiAxLjgxNzkwMzAxMTkzNTQzMTgxODI0OTM3MDMyNjkyNThFKzExOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjU1IHJlbWFpbmRlciAwMzY3MTkxNTQ5MDM2NzAyMjI0ODI3NzM0ODUzNDcxIDQ0MTAzMjA2NjI0MTUyNjY1MzM3NjMxNDM4Mzc3NDJFKzcyMSAtPiAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEKK3N1YngzMjU1IHN1YnRyYWN0IDAzNjcxOTE1NDkwMzY3MDIyMjQ4Mjc3MzQ4NTM0NzEgNDQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MkUrNzIxIC0+IC00LjQxMDMyMDY2MjQxNTI2NjUzMzc2MzE0MzgzNzc0MjBFKzc1MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjU2IGFkZCAwOTc3MDQxMTYuNDQ5MjU2NjcyMTk2NTcxMDM2NTA3MyAtOTY3MzYuNDAwOTM5ODA5NDMzNTU2MDY3NTA0Mjg5MTQ1IC0+IDk3NjA3MzgwLjA0ODMxNjg2Mjc2MzAxNDk2OTAwMzAxMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjU2IGNvbXBhcmUgMDk3NzA0MTE2LjQ0OTI1NjY3MjE5NjU3MTAzNjUwNzMgLTk2NzM2LjQwMDkzOTgwOTQzMzU1NjA2NzUwNDI4OTE0NSAtPiAxCitkaXZ4MzI1NiBkaXZpZGUgMDk3NzA0MTE2LjQ0OTI1NjY3MjE5NjU3MTAzNjUwNzMgLTk2NzM2LjQwMDkzOTgwOTQzMzU1NjA2NzUwNDI4OTE0NSAtPiAtMTAxMC4wMDM2MzM1ODYxNzU3MjUyMzI0NTkyNTcxODc0IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNTYgZGl2aWRlaW50IDA5NzcwNDExNi40NDkyNTY2NzIxOTY1NzEwMzY1MDczIC05NjczNi40MDA5Mzk4MDk0MzM1NTYwNjc1MDQyODkxNDUgLT4gLTEwMTAKK211bHgzMjU2IG11bHRpcGx5IDA5NzcwNDExNi40NDkyNTY2NzIxOTY1NzEwMzY1MDczIC05NjczNi40MDA5Mzk4MDk0MzM1NTYwNjc1MDQyODkxNDUgLT4gLTk0NTE1NDQ1ODIzMDUuMTIzNDgwNTQ4MzQ0OTc3MjI1MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjU2IHBvd2VyIDA5NzcwNDExNi40NDkyNTY2NzIxOTY1NzEwMzY1MDczIC05NjczNiAtPiAwRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzI1NiByZW1haW5kZXIgMDk3NzA0MTE2LjQ0OTI1NjY3MjE5NjU3MTAzNjUwNzMgLTk2NzM2LjQwMDkzOTgwOTQzMzU1NjA2NzUwNDI4OTE0NSAtPiAzNTEuNTAwMDQ5MTQ0MzA0OTQyODU3MTc1MjYzNTUwCitzdWJ4MzI1NiBzdWJ0cmFjdCAwOTc3MDQxMTYuNDQ5MjU2NjcyMTk2NTcxMDM2NTA3MyAtOTY3MzYuNDAwOTM5ODA5NDMzNTU2MDY3NTA0Mjg5MTQ1IC0+IDk3ODAwODUyLjg1MDE5NjQ4MTYzMDEyNzEwNDAxMTU4OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjU3IGFkZCAxOTUzMzI5OC4xNDcxNTAxNTg5MzE5NTg3MzM4MDc4NzggODAuMTQxNjY4MzM4MzUwNzA4NDc2NjM3Mzc3NjQ3MDI1RS02NDEgLT4gMTk1MzMyOTguMTQ3MTUwMTU4OTMxOTU4NzMzODA3ODc4IEluZXhhY3QgUm91bmRlZAorY29teDMyNTcgY29tcGFyZSAxOTUzMzI5OC4xNDcxNTAxNTg5MzE5NTg3MzM4MDc4NzggODAuMTQxNjY4MzM4MzUwNzA4NDc2NjM3Mzc3NjQ3MDI1RS02NDEgLT4gMQorZGl2eDMyNTcgZGl2aWRlIDE5NTMzMjk4LjE0NzE1MDE1ODkzMTk1ODczMzgwNzg3OCA4MC4xNDE2NjgzMzgzNTA3MDg0NzY2MzczNzc2NDcwMjVFLTY0MSAtPiAyLjQzNzM0NjA4Mzc3Mjg0ODUzOTU2NzI4ODIzOTUxNzFFKzY0NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjU3IGRpdmlkZWludCAxOTUzMzI5OC4xNDcxNTAxNTg5MzE5NTg3MzM4MDc4NzggODAuMTQxNjY4MzM4MzUwNzA4NDc2NjM3Mzc3NjQ3MDI1RS02NDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjU3IG11bHRpcGx5IDE5NTMzMjk4LjE0NzE1MDE1ODkzMTk1ODczMzgwNzg3OCA4MC4xNDE2NjgzMzgzNTA3MDg0NzY2MzczNzc2NDcwMjVFLTY0MSAtPiAxLjU2NTQzMTEwMTY2MzAyODQ1MDI0NTkxNTg5NzEyNzJFLTYzMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjU3IHBvd2VyIDE5NTMzMjk4LjE0NzE1MDE1ODkzMTk1ODczMzgwNzg3OCA4IC0+IDIuMTE5MzU5NTA0NzYzODIzMDQyNzUzMDA2MzY1NDYxM0UrNTggSW5leGFjdCBSb3VuZGVkCityZW14MzI1NyByZW1haW5kZXIgMTk1MzMyOTguMTQ3MTUwMTU4OTMxOTU4NzMzODA3ODc4IDgwLjE0MTY2ODMzODM1MDcwODQ3NjYzNzM3NzY0NzAyNUUtNjQxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI1NyBzdWJ0cmFjdCAxOTUzMzI5OC4xNDcxNTAxNTg5MzE5NTg3MzM4MDc4NzggODAuMTQxNjY4MzM4MzUwNzA4NDc2NjM3Mzc3NjQ3MDI1RS02NDEgLT4gMTk1MzMyOTguMTQ3MTUwMTU4OTMxOTU4NzMzODA3ODc4IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNTggYWRkIC0yMzc2NTAwMzIyMTIyMDE3NzQzMDc5NzAyODk5NzM3OCAtMTUyMDMzNjk1NjkuMzczNDExNTA2Mzc5MDk2ODcxMjI0RS05NDUgLT4gLTIzNzY1MDAzMjIxMjIwMTc3NDMwNzk3MDI4OTk3Mzc4IEluZXhhY3QgUm91bmRlZAorY29teDMyNTggY29tcGFyZSAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggLTE1MjAzMzY5NTY5LjM3MzQxMTUwNjM3OTA5Njg3MTIyNEUtOTQ1IC0+IC0xCitkaXZ4MzI1OCBkaXZpZGUgLTIzNzY1MDAzMjIxMjIwMTc3NDMwNzk3MDI4OTk3Mzc4IC0xNTIwMzM2OTU2OS4zNzM0MTE1MDYzNzkwOTY4NzEyMjRFLTk0NSAtPiAxLjU2MzE0MDUzMzYwMjA5MzAwNjQ4MjQxMzU2Njk1NDFFKzk2NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjU4IGRpdmlkZWludCAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggLTE1MjAzMzY5NTY5LjM3MzQxMTUwNjM3OTA5Njg3MTIyNEUtOTQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI1OCBtdWx0aXBseSAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggLTE1MjAzMzY5NTY5LjM3MzQxMTUwNjM3OTA5Njg3MTIyNEUtOTQ1IC0+IDMuNjEzMDgxMjY3ODk1NTk5NDYyNTIxMDAwNzAwNTIxNkUtOTA0IEluZXhhY3QgUm91bmRlZAorcG93eDMyNTggcG93ZXIgLTIzNzY1MDAzMjIxMjIwMTc3NDMwNzk3MDI4OTk3Mzc4IC0yIC0+IDEuNzcwNjE1NDMxODQ4MzQ4MTE5MDM2NDk3OTIwOTQzNkUtNjMgSW5leGFjdCBSb3VuZGVkCityZW14MzI1OCByZW1haW5kZXIgLTIzNzY1MDAzMjIxMjIwMTc3NDMwNzk3MDI4OTk3Mzc4IC0xNTIwMzM2OTU2OS4zNzM0MTE1MDYzNzkwOTY4NzEyMjRFLTk0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyNTggc3VidHJhY3QgLTIzNzY1MDAzMjIxMjIwMTc3NDMwNzk3MDI4OTk3Mzc4IC0xNTIwMzM2OTU2OS4zNzM0MTE1MDYzNzkwOTY4NzEyMjRFLTk0NSAtPiAtMjM3NjUwMDMyMjEyMjAxNzc0MzA3OTcwMjg5OTczNzggSW5leGFjdCBSb3VuZGVkCithZGR4MzI1OSBhZGQgMTI5MjU1LjQxOTM3OTMyNDMzMzU5MTkzMzM4OTEwNTUyRSs5MzIgLTI4MTI1Mzk1My4zODk5MDM4Mjc5OTUwODg3MzU2MDMyMCAtPiAxLjI5MjU1NDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjU5IGNvbXBhcmUgMTI5MjU1LjQxOTM3OTMyNDMzMzU5MTkzMzM4OTEwNTUyRSs5MzIgLTI4MTI1Mzk1My4zODk5MDM4Mjc5OTUwODg3MzU2MDMyMCAtPiAxCitkaXZ4MzI1OSBkaXZpZGUgMTI5MjU1LjQxOTM3OTMyNDMzMzU5MTkzMzM4OTEwNTUyRSs5MzIgLTI4MTI1Mzk1My4zODk5MDM4Mjc5OTUwODg3MzU2MDMyMCAtPiAtNC41OTU2ODM2NDUzODI4MjEzMDUwMjIzMjYwNTUxMDY0RSs5MjggSW5leGFjdCBSb3VuZGVkCitkdml4MzI1OSBkaXZpZGVpbnQgMTI5MjU1LjQxOTM3OTMyNDMzMzU5MTkzMzM4OTEwNTUyRSs5MzIgLTI4MTI1Mzk1My4zODk5MDM4Mjc5OTUwODg3MzU2MDMyMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNTkgbXVsdGlwbHkgMTI5MjU1LjQxOTM3OTMyNDMzMzU5MTkzMzM4OTEwNTUyRSs5MzIgLTI4MTI1Mzk1My4zODk5MDM4Mjc5OTUwODg3MzU2MDMyMCAtPiAtMy42MzUzNTk3Njk3NTA0OTU4MDk2OTMxMDg4NzgwMzY3RSs5NDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI1OSBwb3dlciAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzIC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjU5IHJlbWFpbmRlciAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzLjM4OTkwMzgyNzk5NTA4ODczNTYwMzIwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI1OSBzdWJ0cmFjdCAxMjkyNTUuNDE5Mzc5MzI0MzMzNTkxOTMzMzg5MTA1NTJFKzkzMiAtMjgxMjUzOTUzLjM4OTkwMzgyNzk5NTA4ODczNTYwMzIwIC0+IDEuMjkyNTU0MTkzNzkzMjQzMzM1OTE5MzMzODkxMDU1MkUrOTM3IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNjAgYWRkIC04Njg2My4yNzYyNDk0NjYwMDgyODkyMTQ3NjI5ODA4MzggNTMxLjUwNjAyNjUyNzMyMDg4MjA4Mzk3NjU1NDg0NDc2IC0+IC04NjMzMS43NzAyMjI5Mzg2ODc0MDcxMzA3ODY0MjU5OTMgSW5leGFjdCBSb3VuZGVkCitjb214MzI2MCBjb21wYXJlIC04Njg2My4yNzYyNDk0NjYwMDgyODkyMTQ3NjI5ODA4MzggNTMxLjUwNjAyNjUyNzMyMDg4MjA4Mzk3NjU1NDg0NDc2IC0+IC0xCitkaXZ4MzI2MCBkaXZpZGUgLTg2ODYzLjI3NjI0OTQ2NjAwODI4OTIxNDc2Mjk4MDgzOCA1MzEuNTA2MDI2NTI3MzIwODgyMDgzOTc2NTU0ODQ0NzYgLT4gLTE2My40Mjg1ODIwMTgxNTg5MTQwODQ3NTkwMjIyOTY0OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjYwIGRpdmlkZWludCAtODY4NjMuMjc2MjQ5NDY2MDA4Mjg5MjE0NzYyOTgwODM4IDUzMS41MDYwMjY1MjczMjA4ODIwODM5NzY1NTQ4NDQ3NiAtPiAtMTYzCittdWx4MzI2MCBtdWx0aXBseSAtODY4NjMuMjc2MjQ5NDY2MDA4Mjg5MjE0NzYyOTgwODM4IDUzMS41MDYwMjY1MjczMjA4ODIwODM5NzY1NTQ4NDQ3NiAtPiAtNDYxNjgzNTQuODEwNDk4NjgyMTQwNDU2MTQzNTM0NTI0IEluZXhhY3QgUm91bmRlZAorcG93eDMyNjAgcG93ZXIgLTg2ODYzLjI3NjI0OTQ2NjAwODI4OTIxNDc2Mjk4MDgzOCA1MzIgLT4gMi44ODk3NTc5MTg0MTczODM5NTE5ODU5NzEwMjE3NTEwRSsyNjI3IEluZXhhY3QgUm91bmRlZAorcmVteDMyNjAgcmVtYWluZGVyIC04Njg2My4yNzYyNDk0NjYwMDgyODkyMTQ3NjI5ODA4MzggNTMxLjUwNjAyNjUyNzMyMDg4MjA4Mzk3NjU1NDg0NDc2IC0+IC0yMjcuNzkzOTI1NTEyNzA0NTA5NTI2NTg0NTQxMTQyMTIKK3N1YngzMjYwIHN1YnRyYWN0IC04Njg2My4yNzYyNDk0NjYwMDgyODkyMTQ3NjI5ODA4MzggNTMxLjUwNjAyNjUyNzMyMDg4MjA4Mzk3NjU1NDg0NDc2IC0+IC04NzM5NC43ODIyNzU5OTMzMjkxNzEyOTg3Mzk1MzU2ODMgSW5leGFjdCBSb3VuZGVkCithZGR4MzI2MSBhZGQgLTQwNzA3LjE2OTAwNjc3MTExMTg1NTU3MzUyNDE1NzA4MyAtNjg3OTU1MjE0MjEzMjE4NTMzMzMyNzQ0MTE4Mjc3NDkgLT4gLTY4Nzk1NTIxNDIxMzIxODUzMzMzMjc0NDExODY4NDU2IEluZXhhY3QgUm91bmRlZAorY29teDMyNjEgY29tcGFyZSAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC02ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTgyNzc0OSAtPiAxCitkaXZ4MzI2MSBkaXZpZGUgLTQwNzA3LjE2OTAwNjc3MTExMTg1NTU3MzUyNDE1NzA4MyAtNjg3OTU1MjE0MjEzMjE4NTMzMzMyNzQ0MTE4Mjc3NDkgLT4gNS45MTcxMjQ4NjAxMzAwMjM2Njk0Mzg2MTg1NTEzMTM5RS0yOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjYxIGRpdmlkZWludCAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC02ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTgyNzc0OSAtPiAwCittdWx4MzI2MSBtdWx0aXBseSAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC02ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTgyNzc0OSAtPiAyLjgwMDQ3MDkxNzQwNjY5MTA1NzczNzA4OTU0OTk1NzVFKzM2IEluZXhhY3QgUm91bmRlZAorcG93eDMyNjEgcG93ZXIgLTQwNzA3LjE2OTAwNjc3MTExMTg1NTU3MzUyNDE1NzA4MyAtNyAtPiAtNS4zOTg4ODAyOTE1ODk3NTk1NzIyNDQwMzkyODg0MDUxRS0zMyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjYxIHJlbWFpbmRlciAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC02ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTgyNzc0OSAtPiAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzCitzdWJ4MzI2MSBzdWJ0cmFjdCAtNDA3MDcuMTY5MDA2NzcxMTExODU1NTczNTI0MTU3MDgzIC02ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTgyNzc0OSAtPiA2ODc5NTUyMTQyMTMyMTg1MzMzMzI3NDQxMTc4NzA0MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjYyIGFkZCAtOTA4Mzg3NTI1Njg2NzMuNzI4NjMwNDk0NjU4Nzc4MDAzRSswOTUgLTczOC4wMTM3MDMwMTIxNzYwNjU3NzUzMzEwNzk4MTQzMSAtPiAtOS4wODM4NzUyNTY4NjczNzI4NjMwNDk0NjU4Nzc4MDAzRSsxMDggSW5leGFjdCBSb3VuZGVkCitjb214MzI2MiBjb21wYXJlIC05MDgzODc1MjU2ODY3My43Mjg2MzA0OTQ2NTg3NzgwMDNFKzA5NSAtNzM4LjAxMzcwMzAxMjE3NjA2NTc3NTMzMTA3OTgxNDMxIC0+IC0xCitkaXZ4MzI2MiBkaXZpZGUgLTkwODM4NzUyNTY4NjczLjcyODYzMDQ5NDY1ODc3ODAwM0UrMDk1IC03MzguMDEzNzAzMDEyMTc2MDY1Nzc1MzMxMDc5ODE0MzEgLT4gMS4yMzA4NTQ1NTE4NTg4NDMwODc1MjY4NTUzODUxNDI0RSsxMDYgSW5leGFjdCBSb3VuZGVkCitkdml4MzI2MiBkaXZpZGVpbnQgLTkwODM4NzUyNTY4NjczLjcyODYzMDQ5NDY1ODc3ODAwM0UrMDk1IC03MzguMDEzNzAzMDEyMTc2MDY1Nzc1MzMxMDc5ODE0MzEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjYyIG11bHRpcGx5IC05MDgzODc1MjU2ODY3My43Mjg2MzA0OTQ2NTg3NzgwMDNFKzA5NSAtNzM4LjAxMzcwMzAxMjE3NjA2NTc3NTMzMTA3OTgxNDMxIC0+IDYuNzA0MDI0NDE2MDIxMzcxODg5MTYzMzY3ODI0ODEyN0UrMTExIEluZXhhY3QgUm91bmRlZAorcG93eDMyNjIgcG93ZXIgLTkwODM4NzUyNTY4NjczLjcyODYzMDQ5NDY1ODc3ODAwM0UrMDk1IC03MzggLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyNjIgcmVtYWluZGVyIC05MDgzODc1MjU2ODY3My43Mjg2MzA0OTQ2NTg3NzgwMDNFKzA5NSAtNzM4LjAxMzcwMzAxMjE3NjA2NTc3NTMzMTA3OTgxNDMxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI2MiBzdWJ0cmFjdCAtOTA4Mzg3NTI1Njg2NzMuNzI4NjMwNDk0NjU4Nzc4MDAzRSswOTUgLTczOC4wMTM3MDMwMTIxNzYwNjU3NzUzMzEwNzk4MTQzMSAtPiAtOS4wODM4NzUyNTY4NjczNzI4NjMwNDk0NjU4Nzc4MDAzRSsxMDggSW5leGFjdCBSb3VuZGVkCithZGR4MzI2MyBhZGQgLTQyNDUzNjA5Njc1OTMuOTIwNjc3MTU1NTgzOTcxODE1OEUtNjgyIC0zLjExOTYwNjIzOTA0MjUzMDIwNzEwMzIwMzUwODA1NyAtPiAtMy4xMTk2MDYyMzkwNDI1MzAyMDcxMDMyMDM1MDgwNTcwIEluZXhhY3QgUm91bmRlZAorY29teDMyNjMgY29tcGFyZSAtNDI0NTM2MDk2NzU5My45MjA2NzcxNTU1ODM5NzE4MTU4RS02ODIgLTMuMTE5NjA2MjM5MDQyNTMwMjA3MTAzMjAzNTA4MDU3IC0+IDEKK2RpdngzMjYzIGRpdmlkZSAtNDI0NTM2MDk2NzU5My45MjA2NzcxNTU1ODM5NzE4MTU4RS02ODIgLTMuMTE5NjA2MjM5MDQyNTMwMjA3MTAzMjAzNTA4MDU3IC0+IDEuMzYwODY0MzY2Mjk4MDA2NjM1NjQzNzIzNjA4MTk2OUUtNjcwIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjMgZGl2aWRlaW50IC00MjQ1MzYwOTY3NTkzLjkyMDY3NzE1NTU4Mzk3MTgxNThFLTY4MiAtMy4xMTk2MDYyMzkwNDI1MzAyMDcxMDMyMDM1MDgwNTcgLT4gMAorbXVseDMyNjMgbXVsdGlwbHkgLTQyNDUzNjA5Njc1OTMuOTIwNjc3MTU1NTgzOTcxODE1OEUtNjgyIC0zLjExOTYwNjIzOTA0MjUzMDIwNzEwMzIwMzUwODA1NyAtPiAxLjMyNDM4NTQ1NjE0OTM2Mjc4NDQxMDUyOTA0MTUzMzBFLTY2OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjYzIHBvd2VyIC00MjQ1MzYwOTY3NTkzLjkyMDY3NzE1NTU4Mzk3MTgxNThFLTY4MiAtMyAtPiAtMS4zMDY5NDE0NTA0OTMzMjUzMjg4MDQyODIwNDI5ODk0RSsyMDA4IEluZXhhY3QgUm91bmRlZAorcmVteDMyNjMgcmVtYWluZGVyIC00MjQ1MzYwOTY3NTkzLjkyMDY3NzE1NTU4Mzk3MTgxNThFLTY4MiAtMy4xMTk2MDYyMzkwNDI1MzAyMDcxMDMyMDM1MDgwNTcgLT4gLTQuMjQ1MzYwOTY3NTkzOTIwNjc3MTU1NTgzOTcxODE1OEUtNjcwCitzdWJ4MzI2MyBzdWJ0cmFjdCAtNDI0NTM2MDk2NzU5My45MjA2NzcxNTU1ODM5NzE4MTU4RS02ODIgLTMuMTE5NjA2MjM5MDQyNTMwMjA3MTAzMjAzNTA4MDU3IC0+IDMuMTE5NjA2MjM5MDQyNTMwMjA3MTAzMjAzNTA4MDU3MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjY0IGFkZCAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODEwLjk2NDY1NjQwOTY1MDgzOTAxMTMyMTcwNjMxMCAtPiAtNjA4MTAuOTY0NjU2NDA5Njg1MDYwNDY1Mzc5NDQ3MTEwIEluZXhhY3QgUm91bmRlZAorY29teDMyNjQgY29tcGFyZSAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODEwLjk2NDY1NjQwOTY1MDgzOTAxMTMyMTcwNjMxMCAtPiAxCitkaXZ4MzI2NCBkaXZpZGUgLTM0MjIxNDU0MDU3NzQuMDgwMDIxMzAwMDU0NzYxMjI0MEUtMDIzIC02MDgxMC45NjQ2NTY0MDk2NTA4MzkwMTEzMjE3MDYzMTAgLT4gNS42Mjc1MTM3NjM1Mjg3ODgyODc1OTE0MTI0NzQyNjUwRS0xNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjY0IGRpdmlkZWludCAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODEwLjk2NDY1NjQwOTY1MDgzOTAxMTMyMTcwNjMxMCAtPiAwCittdWx4MzI2NCBtdWx0aXBseSAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODEwLjk2NDY1NjQwOTY1MDgzOTAxMTMyMTcwNjMxMCAtPiAwLjAwMDAwMjA4MTAzOTYzMzE5NjIyMjQzMjMyODg3NDQ5MTA2MDcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI2NCBwb3dlciAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODExIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjY0IHJlbWFpbmRlciAtMzQyMjE0NTQwNTc3NC4wODAwMjEzMDAwNTQ3NjEyMjQwRS0wMjMgLTYwODEwLjk2NDY1NjQwOTY1MDgzOTAxMTMyMTcwNjMxMCAtPiAtMy40MjIxNDU0MDU3NzQwODAwMjEzMDAwNTQ3NjEyMjQwRS0xMQorc3VieDMyNjQgc3VidHJhY3QgLTM0MjIxNDU0MDU3NzQuMDgwMDIxMzAwMDU0NzYxMjI0MEUtMDIzIC02MDgxMC45NjQ2NTY0MDk2NTA4MzkwMTEzMjE3MDYzMTAgLT4gNjA4MTAuOTY0NjU2NDA5NjE2NjE3NTU3MjYzOTY1NTEwIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNjUgYWRkIC0yNDUyMTgxMS4wNzY0OTQ4NTc5NjU5ODM4NzYyNzQ3OEUtNjYxIC05NDg2MDg0NjEzMzQwNDgxNTQxMDgxNjIzNDAwMDY5NCAtPiAtOTQ4NjA4NDYxMzM0MDQ4MTU0MTA4MTYyMzQwMDA2OTQgSW5leGFjdCBSb3VuZGVkCitjb214MzI2NSBjb21wYXJlIC0yNDUyMTgxMS4wNzY0OTQ4NTc5NjU5ODM4NzYyNzQ3OEUtNjYxIC05NDg2MDg0NjEzMzQwNDgxNTQxMDgxNjIzNDAwMDY5NCAtPiAxCitkaXZ4MzI2NSBkaXZpZGUgLTI0NTIxODExLjA3NjQ5NDg1Nzk2NTk4Mzg3NjI3NDc4RS02NjEgLTk0ODYwODQ2MTMzNDA0ODE1NDEwODE2MjM0MDAwNjk0IC0+IDIuNTg1MDI5NzY0NzU3NjY1NzgxOTQ4Mzk4ODg0NTkwNEUtNjg2IEluZXhhY3QgUm91bmRlZAorZHZpeDMyNjUgZGl2aWRlaW50IC0yNDUyMTgxMS4wNzY0OTQ4NTc5NjU5ODM4NzYyNzQ3OEUtNjYxIC05NDg2MDg0NjEzMzQwNDgxNTQxMDgxNjIzNDAwMDY5NCAtPiAwCittdWx4MzI2NSBtdWx0aXBseSAtMjQ1MjE4MTEuMDc2NDk0ODU3OTY1OTgzODc2Mjc0NzhFLTY2MSAtOTQ4NjA4NDYxMzM0MDQ4MTU0MTA4MTYyMzQwMDA2OTQgLT4gMi4zMjYxNTk3NDc0Mzk4MDA2MjE1MDE3NzUxNzg1MTA0RS02MjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI2NSBwb3dlciAtMjQ1MjE4MTEuMDc2NDk0ODU3OTY1OTgzODc2Mjc0NzhFLTY2MSAtOSAtPiAtMy4xMTkwODQzNTU5OTQ5MTg0NjE4NTkwMjY0MjQ2NTg2RSs1ODgyIEluZXhhY3QgUm91bmRlZAorcmVteDMyNjUgcmVtYWluZGVyIC0yNDUyMTgxMS4wNzY0OTQ4NTc5NjU5ODM4NzYyNzQ3OEUtNjYxIC05NDg2MDg0NjEzMzQwNDgxNTQxMDgxNjIzNDAwMDY5NCAtPiAtMi40NTIxODExMDc2NDk0ODU3OTY1OTgzODc2Mjc0NzhFLTY1NAorc3VieDMyNjUgc3VidHJhY3QgLTI0NTIxODExLjA3NjQ5NDg1Nzk2NTk4Mzg3NjI3NDc4RS02NjEgLTk0ODYwODQ2MTMzNDA0ODE1NDEwODE2MjM0MDAwNjk0IC0+IDk0ODYwODQ2MTMzNDA0ODE1NDEwODE2MjM0MDAwNjk0IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNjYgYWRkIC01MDQyNTI5OTM3NDk4Ljg5NDQ0OTIyNDg1Mzg5NTE0MzggMzg5MTkwNDY3NC40NTQ5MTcwOTY4ODA3MTQ1NjEyNTQ5IC0+IC01MDM4NjM4MDMyODI0LjQzOTUzMjEyNzk3MzE4MDU4MjUgSW5leGFjdCBSb3VuZGVkCitjb214MzI2NiBjb21wYXJlIC01MDQyNTI5OTM3NDk4Ljg5NDQ0OTIyNDg1Mzg5NTE0MzggMzg5MTkwNDY3NC40NTQ5MTcwOTY4ODA3MTQ1NjEyNTQ5IC0+IC0xCitkaXZ4MzI2NiBkaXZpZGUgLTUwNDI1Mjk5Mzc0OTguODk0NDQ5MjI0ODUzODk1MTQzOCAzODkxOTA0Njc0LjQ1NDkxNzA5Njg4MDcxNDU2MTI1NDkgLT4gLTEyOTUuNjQ1Nzk3OTU0OTg5NDM1MTM3ODEyNzQxMzI4MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjY2IGRpdmlkZWludCAtNTA0MjUyOTkzNzQ5OC44OTQ0NDkyMjQ4NTM4OTUxNDM4IDM4OTE5MDQ2NzQuNDU0OTE3MDk2ODgwNzE0NTYxMjU0OSAtPiAtMTI5NQorbXVseDMyNjYgbXVsdGlwbHkgLTUwNDI1Mjk5Mzc0OTguODk0NDQ5MjI0ODUzODk1MTQzOCAzODkxOTA0Njc0LjQ1NDkxNzA5Njg4MDcxNDU2MTI1NDkgLT4gLTE5NjI1MDQ1ODM0ODMwODA4MjU2ODcxLjk1MjY1OTA0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjY2IHBvd2VyIC01MDQyNTI5OTM3NDk4Ljg5NDQ0OTIyNDg1Mzg5NTE0MzggNCAtPiA2LjQ2NTM3ODI5OTE4MDAwMDk0OTI1ODAxODA5NjA4MzlFKzUwIEluZXhhY3QgUm91bmRlZAorcmVteDMyNjYgcmVtYWluZGVyIC01MDQyNTI5OTM3NDk4Ljg5NDQ0OTIyNDg1Mzg5NTE0MzggMzg5MTkwNDY3NC40NTQ5MTcwOTY4ODA3MTQ1NjEyNTQ5IC0+IC0yNTEzMzg0MDc5Ljc3NjgwODc2NDMyODUzODMxODcwNDUKK3N1YngzMjY2IHN1YnRyYWN0IC01MDQyNTI5OTM3NDk4Ljg5NDQ0OTIyNDg1Mzg5NTE0MzggMzg5MTkwNDY3NC40NTQ5MTcwOTY4ODA3MTQ1NjEyNTQ5IC0+IC01MDQ2NDIxODQyMTczLjM0OTM2NjMyMTczNDYwOTcwNTEgSW5leGFjdCBSb3VuZGVkCithZGR4MzI2NyBhZGQgLTUzNTgyNDE2My41NDUzMTc0NzY0NjI5MzY5Mzg2ODY1MUUtNjY1IDI3MzI5ODguNTg5MTM2MzYzOTMyNTAwODIwNjA5OTcxMiAtPiAyNzMyOTg4LjU4OTEzNjM2MzkzMjUwMDgyMDYwOTk3MTIgSW5leGFjdCBSb3VuZGVkCitjb214MzI2NyBjb21wYXJlIC01MzU4MjQxNjMuNTQ1MzE3NDc2NDYyOTM2OTM4Njg2NTFFLTY2NSAyNzMyOTg4LjU4OTEzNjM2MzkzMjUwMDgyMDYwOTk3MTIgLT4gLTEKK2RpdngzMjY3IGRpdmlkZSAtNTM1ODI0MTYzLjU0NTMxNzQ3NjQ2MjkzNjkzODY4NjUxRS02NjUgMjczMjk4OC41ODkxMzYzNjM5MzI1MDA4MjA2MDk5NzEyIC0+IC0xLjk2MDU3OTU4NTU2ODc3OTEyNDY2MTE2ODMzMjgzNDZFLTY2MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjY3IGRpdmlkZWludCAtNTM1ODI0MTYzLjU0NTMxNzQ3NjQ2MjkzNjkzODY4NjUxRS02NjUgMjczMjk4OC41ODkxMzYzNjM5MzI1MDA4MjA2MDk5NzEyIC0+IC0wCittdWx4MzI2NyBtdWx0aXBseSAtNTM1ODI0MTYzLjU0NTMxNzQ3NjQ2MjkzNjkzODY4NjUxRS02NjUgMjczMjk4OC41ODkxMzYzNjM5MzI1MDA4MjA2MDk5NzEyIC0+IC0xLjQ2NDQwMTMyNDc1Mjg4OTUzNzYyNTQ4NTA3MDU1OTdFLTY1MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjY3IHBvd2VyIC01MzU4MjQxNjMuNTQ1MzE3NDc2NDYyOTM2OTM4Njg2NTFFLTY2NSAyNzMyOTg5IC0+IC0wRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzI2NyByZW1haW5kZXIgLTUzNTgyNDE2My41NDUzMTc0NzY0NjI5MzY5Mzg2ODY1MUUtNjY1IDI3MzI5ODguNTg5MTM2MzYzOTMyNTAwODIwNjA5OTcxMiAtPiAtNS4zNTgyNDE2MzU0NTMxNzQ3NjQ2MjkzNjkzODY4NjUxRS02NTcKK3N1YngzMjY3IHN1YnRyYWN0IC01MzU4MjQxNjMuNTQ1MzE3NDc2NDYyOTM2OTM4Njg2NTFFLTY2NSAyNzMyOTg4LjU4OTEzNjM2MzkzMjUwMDgyMDYwOTk3MTIgLT4gLTI3MzI5ODguNTg5MTM2MzYzOTMyNTAwODIwNjA5OTcxMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjY4IGFkZCAyNDAzMi43MDIwMDg1NTMwODQyNTI5MjUxNDA4NTgxMzRFLTUwOSA1Mjg2NDg1NC44OTk0MjA2MzIzNzU1ODkyMDY3MDQwNjggLT4gNTI4NjQ4NTQuODk5NDIwNjMyMzc1NTg5MjA2NzA0MDY4IEluZXhhY3QgUm91bmRlZAorY29teDMyNjggY29tcGFyZSAyNDAzMi43MDIwMDg1NTMwODQyNTI5MjUxNDA4NTgxMzRFLTUwOSA1Mjg2NDg1NC44OTk0MjA2MzIzNzU1ODkyMDY3MDQwNjggLT4gLTEKK2RpdngzMjY4IGRpdmlkZSAyNDAzMi43MDIwMDg1NTMwODQyNTI5MjUxNDA4NTgxMzRFLTUwOSA1Mjg2NDg1NC44OTk0MjA2MzIzNzU1ODkyMDY3MDQwNjggLT4gNC41NDYwNjQxMjAzNDU1Njk3OTE3NTczNDMxOTYxNTExRS01MTMgSW5leGFjdCBSb3VuZGVkCitkdml4MzI2OCBkaXZpZGVpbnQgMjQwMzIuNzAyMDA4NTUzMDg0MjUyOTI1MTQwODU4MTM0RS01MDkgNTI4NjQ4NTQuODk5NDIwNjMyMzc1NTg5MjA2NzA0MDY4IC0+IDAKK211bHgzMjY4IG11bHRpcGx5IDI0MDMyLjcwMjAwODU1MzA4NDI1MjkyNTE0MDg1ODEzNEUtNTA5IDUyODY0ODU0Ljg5OTQyMDYzMjM3NTU4OTIwNjcwNDA2OCAtPiAxLjI3MDQ4NTMwNDUyMzE3MzU4ODUwNzQ5NDU3MTA1NzZFLTQ5NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjY4IHBvd2VyIDI0MDMyLjcwMjAwODU1MzA4NDI1MjkyNTE0MDg1ODEzNEUtNTA5IDUyODY0ODU1IC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjY4IHJlbWFpbmRlciAyNDAzMi43MDIwMDg1NTMwODQyNTI5MjUxNDA4NTgxMzRFLTUwOSA1Mjg2NDg1NC44OTk0MjA2MzIzNzU1ODkyMDY3MDQwNjggLT4gMi40MDMyNzAyMDA4NTUzMDg0MjUyOTI1MTQwODU4MTM0RS01MDUKK3N1YngzMjY4IHN1YnRyYWN0IDI0MDMyLjcwMjAwODU1MzA4NDI1MjkyNTE0MDg1ODEzNEUtNTA5IDUyODY0ODU0Ljg5OTQyMDYzMjM3NTU4OTIwNjcwNDA2OCAtPiAtNTI4NjQ4NTQuODk5NDIwNjMyMzc1NTg5MjA2NzA0MDY4IEluZXhhY3QgUm91bmRlZAorYWRkeDMyNjkgYWRkIDcxNTUzMjIwMjU5LjkzODk1MDY5ODAzMDUxOTkwNjcyN0UtNDk2IDc1NC40NDIyMDQxNzQxNTMyNTQ0NDk0MzU2NjAxNjA2MiAtPiA3NTQuNDQyMjA0MTc0MTUzMjU0NDQ5NDM1NjYwMTYwNjIgSW5leGFjdCBSb3VuZGVkCitjb214MzI2OSBjb21wYXJlIDcxNTUzMjIwMjU5LjkzODk1MDY5ODAzMDUxOTkwNjcyN0UtNDk2IDc1NC40NDIyMDQxNzQxNTMyNTQ0NDk0MzU2NjAxNjA2MiAtPiAtMQorZGl2eDMyNjkgZGl2aWRlIDcxNTUzMjIwMjU5LjkzODk1MDY5ODAzMDUxOTkwNjcyN0UtNDk2IDc1NC40NDIyMDQxNzQxNTMyNTQ0NDk0MzU2NjAxNjA2MiAtPiA5LjQ4NDI1NDcwNjg2MTc4Nzk3OTQyMTgwNTAwMDgzNTNFLTQ4OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjY5IGRpdmlkZWludCA3MTU1MzIyMDI1OS45Mzg5NTA2OTgwMzA1MTk5MDY3MjdFLTQ5NiA3NTQuNDQyMjA0MTc0MTUzMjU0NDQ5NDM1NjYwMTYwNjIgLT4gMAorbXVseDMyNjkgbXVsdGlwbHkgNzE1NTMyMjAyNTkuOTM4OTUwNjk4MDMwNTE5OTA2NzI3RS00OTYgNzU0LjQ0MjIwNDE3NDE1MzI1NDQ0OTQzNTY2MDE2MDYyIC0+IDUuMzk4Mjc2OTIwODY2NzAyMTA0NDY3NTE0Njc4NzI0OEUtNDgzIEluZXhhY3QgUm91bmRlZAorcG93eDMyNjkgcG93ZXIgNzE1NTMyMjAyNTkuOTM4OTUwNjk4MDMwNTE5OTA2NzI3RS00OTYgNzU0IC0+IDBFLTEwMDMwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzMjY5IHJlbWFpbmRlciA3MTU1MzIyMDI1OS45Mzg5NTA2OTgwMzA1MTk5MDY3MjdFLTQ5NiA3NTQuNDQyMjA0MTc0MTUzMjU0NDQ5NDM1NjYwMTYwNjIgLT4gNy4xNTUzMjIwMjU5OTM4OTUwNjk4MDMwNTE5OTA2NzI3RS00ODYKK3N1YngzMjY5IHN1YnRyYWN0IDcxNTUzMjIwMjU5LjkzODk1MDY5ODAzMDUxOTkwNjcyN0UtNDk2IDc1NC40NDIyMDQxNzQxNTMyNTQ0NDk0MzU2NjAxNjA2MiAtPiAtNzU0LjQ0MjIwNDE3NDE1MzI1NDQ0OTQzNTY2MDE2MDYyIEluZXhhY3QgUm91bmRlZAorYWRkeDMyNzAgYWRkIDM1NTcyLjk2MDI4NDc5NTk2MjY5Nzc0MDk1MzkzMjUwOCA1MjAuMzk1MDYzNjQ2ODc1OTQwODI3MjU3NTQ4Nzg5MTBFLTczMSAtPiAzNTU3Mi45NjAyODQ3OTU5NjI2OTc3NDA5NTM5MzI1MDggSW5leGFjdCBSb3VuZGVkCitjb214MzI3MCBjb21wYXJlIDM1NTcyLjk2MDI4NDc5NTk2MjY5Nzc0MDk1MzkzMjUwOCA1MjAuMzk1MDYzNjQ2ODc1OTQwODI3MjU3NTQ4Nzg5MTBFLTczMSAtPiAxCitkaXZ4MzI3MCBkaXZpZGUgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUyMC4zOTUwNjM2NDY4NzU5NDA4MjcyNTc1NDg3ODkxMEUtNzMxIC0+IDYuODM1NzYwNTE1Mzg2OTU1NjUwNDg2OTA2MTQ2OTg1MkUrNzMyIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNzAgZGl2aWRlaW50IDM1NTcyLjk2MDI4NDc5NTk2MjY5Nzc0MDk1MzkzMjUwOCA1MjAuMzk1MDYzNjQ2ODc1OTQwODI3MjU3NTQ4Nzg5MTBFLTczMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNzAgbXVsdGlwbHkgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUyMC4zOTUwNjM2NDY4NzU5NDA4MjcyNTc1NDg3ODkxMEUtNzMxIC0+IDEuODUxMTk5MjkzMTUxNDE4NTEwMjQ3NDYwOTY4NjA2NkUtNzI0IEluZXhhY3QgUm91bmRlZAorcG93eDMyNzAgcG93ZXIgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUgLT4gNTY5NjM5NDIyNDc5ODU0MDQzMzc0MDEuMTQ5MzUzMTY5IEluZXhhY3QgUm91bmRlZAorcmVteDMyNzAgcmVtYWluZGVyIDM1NTcyLjk2MDI4NDc5NTk2MjY5Nzc0MDk1MzkzMjUwOCA1MjAuMzk1MDYzNjQ2ODc1OTQwODI3MjU3NTQ4Nzg5MTBFLTczMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyNzAgc3VidHJhY3QgMzU1NzIuOTYwMjg0Nzk1OTYyNjk3NzQwOTUzOTMyNTA4IDUyMC4zOTUwNjM2NDY4NzU5NDA4MjcyNTc1NDg3ODkxMEUtNzMxIC0+IDM1NTcyLjk2MDI4NDc5NTk2MjY5Nzc0MDk1MzkzMjUwOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjcxIGFkZCA1MzAzNTQwNTAxODEyMzc2MDU5ODMzNDg5NTQxMzA1N0UrODE4IC05NTU4NDY0MjQ3MjQwLjQ0NzY3OTAwNDI5MTEzNzkxNTEgLT4gNS4zMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4NDkgSW5leGFjdCBSb3VuZGVkCitjb214MzI3MSBjb21wYXJlIDUzMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4MTggLTk1NTg0NjQyNDcyNDAuNDQ3Njc5MDA0MjkxMTM3OTE1MSAtPiAxCitkaXZ4MzI3MSBkaXZpZGUgNTMwMzU0MDUwMTgxMjM3NjA1OTgzMzQ4OTU0MTMwNTdFKzgxOCAtOTU1ODQ2NDI0NzI0MC40NDc2NzkwMDQyOTExMzc5MTUxIC0+IC01LjU0ODUyNzg0MzYyNjY4MDI0NzAyMDI0ODcyMzMyODVFKzgzNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjcxIGRpdmlkZWludCA1MzAzNTQwNTAxODEyMzc2MDU5ODMzNDg5NTQxMzA1N0UrODE4IC05NTU4NDY0MjQ3MjQwLjQ0NzY3OTAwNDI5MTEzNzkxNTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzMjcxIG11bHRpcGx5IDUzMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4MTggLTk1NTg0NjQyNDcyNDAuNDQ3Njc5MDA0MjkxMTM3OTE1MSAtPiAtNS4wNjkzNzAyMjcwMzY1MjU5Mjc0MjAzMTgxODk0NjEzRSs4NjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI3MSBwb3dlciA1MzAzNTQwNTAxODEyMzc2MDU5ODMzNDg5NTQxMzA1N0UrODE4IC0xMCAtPiA1LjY3OTkwNTM5MzU0MjcyNjc5NDQ0NTU4NDgxMzU2MThFLTg0OTggSW5leGFjdCBSb3VuZGVkCityZW14MzI3MSByZW1haW5kZXIgNTMwMzU0MDUwMTgxMjM3NjA1OTgzMzQ4OTU0MTMwNTdFKzgxOCAtOTU1ODQ2NDI0NzI0MC40NDc2NzkwMDQyOTExMzc5MTUxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI3MSBzdWJ0cmFjdCA1MzAzNTQwNTAxODEyMzc2MDU5ODMzNDg5NTQxMzA1N0UrODE4IC05NTU4NDY0MjQ3MjQwLjQ0NzY3OTAwNDI5MTEzNzkxNTEgLT4gNS4zMDM1NDA1MDE4MTIzNzYwNTk4MzM0ODk1NDEzMDU3RSs4NDkgSW5leGFjdCBSb3VuZGVkCithZGR4MzI3MiBhZGQgOTUuNDkwNzUxMTI3MjQ5OTQ1ODg2ODI4MjU3MzEyMTE4IDk4Ny4wMTQ5ODMxNjMwNzM2NTcxNDE2NzQxMDY5MDE5MkUrMTMzIC0+IDkuODcwMTQ5ODMxNjMwNzM2NTcxNDE2NzQxMDY5MDE5MkUrMTM1IEluZXhhY3QgUm91bmRlZAorY29teDMyNzIgY29tcGFyZSA5NS40OTA3NTExMjcyNDk5NDU4ODY4MjgyNTczMTIxMTggOTg3LjAxNDk4MzE2MzA3MzY1NzE0MTY3NDEwNjkwMTkyRSsxMzMgLT4gLTEKK2RpdngzMjcyIGRpdmlkZSA5NS40OTA3NTExMjcyNDk5NDU4ODY4MjgyNTczMTIxMTggOTg3LjAxNDk4MzE2MzA3MzY1NzE0MTY3NDEwNjkwMTkyRSsxMzMgLT4gOS42NzQ3MDEyNzE2MjkzMzQxOTI3NTY2NTE1OTE1MDE2RS0xMzUgSW5leGFjdCBSb3VuZGVkCitkdml4MzI3MiBkaXZpZGVpbnQgOTUuNDkwNzUxMTI3MjQ5OTQ1ODg2ODI4MjU3MzEyMTE4IDk4Ny4wMTQ5ODMxNjMwNzM2NTcxNDE2NzQxMDY5MDE5MkUrMTMzIC0+IDAKK211bHgzMjcyIG11bHRpcGx5IDk1LjQ5MDc1MTEyNzI0OTk0NTg4NjgyODI1NzMxMjExOCA5ODcuMDE0OTgzMTYzMDczNjU3MTQxNjc0MTA2OTAxOTJFKzEzMyAtPiA5LjQyNTA4MDIxMTYwOTE4NjIxODU3NjQ4MDAyMjcwMDRFKzEzNyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjcyIHBvd2VyIDk1LjQ5MDc1MTEyNzI0OTk0NTg4NjgyODI1NzMxMjExOCAxMCAtPiA2MzAzOTU0ODY0NjE4Njg2NDE2Mi44NDc0OTE1MzQzMzcgSW5leGFjdCBSb3VuZGVkCityZW14MzI3MiByZW1haW5kZXIgOTUuNDkwNzUxMTI3MjQ5OTQ1ODg2ODI4MjU3MzEyMTE4IDk4Ny4wMTQ5ODMxNjMwNzM2NTcxNDE2NzQxMDY5MDE5MkUrMTMzIC0+IDk1LjQ5MDc1MTEyNzI0OTk0NTg4NjgyODI1NzMxMjExOAorc3VieDMyNzIgc3VidHJhY3QgOTUuNDkwNzUxMTI3MjQ5OTQ1ODg2ODI4MjU3MzEyMTE4IDk4Ny4wMTQ5ODMxNjMwNzM2NTcxNDE2NzQxMDY5MDE5MkUrMTMzIC0+IC05Ljg3MDE0OTgzMTYzMDczNjU3MTQxNjc0MTA2OTAxOTJFKzEzNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjczIGFkZCA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMgLTM1MTE5MTM2NTQ5MDE1MDQ0MjQxNTY5ODI3NTQyMjY0IC0+IC0zNTExOTEzNjU0OTAxNTA0NDI0MTUwMDM5MjY5MTk3NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjczIGNvbXBhcmUgNjk0MzQ4NTAyODcuNDYwNzg4NTUwOTM2NzMwMjk2MTUzIC0zNTExOTEzNjU0OTAxNTA0NDI0MTU2OTgyNzU0MjI2NCAtPiAxCitkaXZ4MzI3MyBkaXZpZGUgNjk0MzQ4NTAyODcuNDYwNzg4NTUwOTM2NzMwMjk2MTUzIC0zNTExOTEzNjU0OTAxNTA0NDI0MTU2OTgyNzU0MjI2NCAtPiAtMS45NzcxMjI5MzM4MzI3MjczNjQ0MTI5Mzk0NzM0Mjk5RS0yMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjczIGRpdmlkZWludCA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMgLTM1MTE5MTM2NTQ5MDE1MDQ0MjQxNTY5ODI3NTQyMjY0IC0+IC0wCittdWx4MzI3MyBtdWx0aXBseSA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMgLTM1MTE5MTM2NTQ5MDE1MDQ0MjQxNTY5ODI3NTQyMjY0IC0+IC0yLjQzODQ5MTk4ODUwNTc1MTkzMDI2NDY1MjI0MjU5ODBFKzQyIEluZXhhY3QgUm91bmRlZAorcG93eDMyNzMgcG93ZXIgNjk0MzQ4NTAyODcuNDYwNzg4NTUwOTM2NzMwMjk2MTUzIC00IC0+IDQuMzAyMTkzOTYwNTg0MjAzODk5NTM3MDQ0Mzc0Mzg0NEUtNDQgSW5leGFjdCBSb3VuZGVkCityZW14MzI3MyByZW1haW5kZXIgNjk0MzQ4NTAyODcuNDYwNzg4NTUwOTM2NzMwMjk2MTUzIC0zNTExOTEzNjU0OTAxNTA0NDI0MTU2OTgyNzU0MjI2NCAtPiA2OTQzNDg1MDI4Ny40NjA3ODg1NTA5MzY3MzAyOTYxNTMKK3N1YngzMjczIHN1YnRyYWN0IDY5NDM0ODUwMjg3LjQ2MDc4ODU1MDkzNjczMDI5NjE1MyAtMzUxMTkxMzY1NDkwMTUwNDQyNDE1Njk4Mjc1NDIyNjQgLT4gMzUxMTkxMzY1NDkwMTUwNDQyNDE2MzkyNjIzOTI1NTEgSW5leGFjdCBSb3VuZGVkCithZGR4MzI3NCBhZGQgLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNyAtNjU1NTEyNzQuOTg3MTYwOTk4MTk1MjgyMTA5NjEyMTM2IC0+IC02NTU1MTY2Ny4yMTQ1NjAyNDQ0MTQ5MzgzMjcwMDMxMjMgSW5leGFjdCBSb3VuZGVkCitjb214MzI3NCBjb21wYXJlIC0zOTIuMjI3Mzk5MjQ2MjE5NjU2MjE3MzkwOTg3MjU0MDcgLTY1NTUxMjc0Ljk4NzE2MDk5ODE5NTI4MjEwOTYxMjEzNiAtPiAxCitkaXZ4MzI3NCBkaXZpZGUgLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNyAtNjU1NTEyNzQuOTg3MTYwOTk4MTk1MjgyMTA5NjEyMTM2IC0+IDAuMDAwMDA1OTgzNTIwNTIzNzg5MDgwOTQ0OTY4NDMxNzI0NTAzMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjc0IGRpdmlkZWludCAtMzkyLjIyNzM5OTI0NjIxOTY1NjIxNzM5MDk4NzI1NDA3IC02NTU1MTI3NC45ODcxNjA5OTgxOTUyODIxMDk2MTIxMzYgLT4gMAorbXVseDMyNzQgbXVsdGlwbHkgLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNyAtNjU1NTEyNzQuOTg3MTYwOTk4MTk1MjgyMTA5NjEyMTM2IC0+IDI1NzExMDA2MTA1LjQ4NzkyOTEwODMyOTYzNzcwMTg4MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjc0IHBvd2VyIC0zOTIuMjI3Mzk5MjQ2MjE5NjU2MjE3MzkwOTg3MjU0MDcgLTY1NTUxMjc1IC0+IC0wRS0xMDAzMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzI3NCByZW1haW5kZXIgLTM5Mi4yMjczOTkyNDYyMTk2NTYyMTczOTA5ODcyNTQwNyAtNjU1NTEyNzQuOTg3MTYwOTk4MTk1MjgyMTA5NjEyMTM2IC0+IC0zOTIuMjI3Mzk5MjQ2MjE5NjU2MjE3MzkwOTg3MjU0MDcKK3N1YngzMjc0IHN1YnRyYWN0IC0zOTIuMjI3Mzk5MjQ2MjE5NjU2MjE3MzkwOTg3MjU0MDcgLTY1NTUxMjc0Ljk4NzE2MDk5ODE5NTI4MjEwOTYxMjEzNiAtPiA2NTU1MDg4Mi43NTk3NjE3NTE5NzU2MjU4OTIyMjExNDkgSW5leGFjdCBSb3VuZGVkCithZGR4MzI3NSBhZGQgNjQxMzI2NS40NDIzNTYxMTkxNzkyOTcyMDg1NTM5NDU3IDI0NTE0LjIyMjcwNDcxNDEzOTM1MDAyNjE2NTcyMTE0NiAtPiA2NDM3Nzc5LjY2NTA2MDgzMzMxODY0NzIzNDcxOTY2NjggSW5leGFjdCBSb3VuZGVkCitjb214MzI3NSBjb21wYXJlIDY0MTMyNjUuNDQyMzU2MTE5MTc5Mjk3MjA4NTUzOTQ1NyAyNDUxNC4yMjI3MDQ3MTQxMzkzNTAwMjYxNjU3MjExNDYgLT4gMQorZGl2eDMyNzUgZGl2aWRlIDY0MTMyNjUuNDQyMzU2MTE5MTc5Mjk3MjA4NTUzOTQ1NyAyNDUxNC4yMjI3MDQ3MTQxMzkzNTAwMjYxNjU3MjExNDYgLT4gMjYxLjYxNDA2NDYwMjcwMjQxNDk4NzU3ODY4NjgxODgzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyNzUgZGl2aWRlaW50IDY0MTMyNjUuNDQyMzU2MTE5MTc5Mjk3MjA4NTUzOTQ1NyAyNDUxNC4yMjI3MDQ3MTQxMzkzNTAwMjYxNjU3MjExNDYgLT4gMjYxCittdWx4MzI3NSBtdWx0aXBseSA2NDEzMjY1LjQ0MjM1NjExOTE3OTI5NzIwODU1Mzk0NTcgMjQ1MTQuMjIyNzA0NzE0MTM5MzUwMDI2MTY1NzIxMTQ2IC0+IDE1NzIxNjIxNzMxOC4zNjQ5NDUyNTMwMDY5NDU4MzEzOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjc1IHBvd2VyIDY0MTMyNjUuNDQyMzU2MTE5MTc5Mjk3MjA4NTUzOTQ1NyAyNDUxNCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjc1IHJlbWFpbmRlciA2NDEzMjY1LjQ0MjM1NjExOTE3OTI5NzIwODU1Mzk0NTcgMjQ1MTQuMjIyNzA0NzE0MTM5MzUwMDI2MTY1NzIxMTQ2IC0+IDE1MDUzLjMxNjQyNTcyODgwODk0MDM3OTMwMDcyNjU5NAorc3VieDMyNzUgc3VidHJhY3QgNjQxMzI2NS40NDIzNTYxMTkxNzkyOTcyMDg1NTM5NDU3IDI0NTE0LjIyMjcwNDcxNDEzOTM1MDAyNjE2NTcyMTE0NiAtPiA2Mzg4NzUxLjIxOTY1MTQwNTAzOTk0NzE4MjM4ODIyNDYgSW5leGFjdCBSb3VuZGVkCithZGR4MzI3NiBhZGQgLTYuOTY2NzcwNjM4OTEyMjEwNzc2MDA0NjE4NDA2NDA1N0UrNDg3IDMyLjQwNTgxMDcwMzk3MTUzODI3ODQxOTYyNTUyNzIzNCAtPiAtNi45NjY3NzA2Mzg5MTIyMTA3NzYwMDQ2MTg0MDY0MDU3RSs0ODcgSW5leGFjdCBSb3VuZGVkCitjb214MzI3NiBjb21wYXJlIC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyAzMi40MDU4MTA3MDM5NzE1MzgyNzg0MTk2MjU1MjcyMzQgLT4gLTEKK2RpdngzMjc2IGRpdmlkZSAtNi45NjY3NzA2Mzg5MTIyMTA3NzYwMDQ2MTg0MDY0MDU3RSs0ODcgMzIuNDA1ODEwNzAzOTcxNTM4Mjc4NDE5NjI1NTI3MjM0IC0+IC0yLjE0OTg1MjI5MTE2ODk5OTczNDEzNDcyOTM0MTk3NjFFKzQ4NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjc2IGRpdmlkZWludCAtNi45NjY3NzA2Mzg5MTIyMTA3NzYwMDQ2MTg0MDY0MDU3RSs0ODcgMzIuNDA1ODEwNzAzOTcxNTM4Mjc4NDE5NjI1NTI3MjM0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI3NiBtdWx0aXBseSAtNi45NjY3NzA2Mzg5MTIyMTA3NzYwMDQ2MTg0MDY0MDU3RSs0ODcgMzIuNDA1ODEwNzAzOTcxNTM4Mjc4NDE5NjI1NTI3MjM0IC0+IC0yLjI1NzYzODUwNTQyNTc1OTUyNTk1MTE1NTYyNTg0NzBFKzQ4OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjc2IHBvd2VyIC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyAzMiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjc2IHJlbWFpbmRlciAtNi45NjY3NzA2Mzg5MTIyMTA3NzYwMDQ2MTg0MDY0MDU3RSs0ODcgMzIuNDA1ODEwNzAzOTcxNTM4Mjc4NDE5NjI1NTI3MjM0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI3NiBzdWJ0cmFjdCAtNi45NjY3NzA2Mzg5MTIyMTA3NzYwMDQ2MTg0MDY0MDU3RSs0ODcgMzIuNDA1ODEwNzAzOTcxNTM4Mjc4NDE5NjI1NTI3MjM0IC0+IC02Ljk2Njc3MDYzODkxMjIxMDc3NjAwNDYxODQwNjQwNTdFKzQ4NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjc3IGFkZCAzNzgyMDQ3MTY2MzMuNDAwMjQxMDA2MDI4OTYwNTc2MTUgLTAzMDAyMTg3MTQzNzguMzIyMjMxMjY5NjA2MjE2NTE2IC0+IDc3OTg2MDAyMjU1LjA3ODAwOTczNjQyMjc0NDA2MDE1Citjb214MzI3NyBjb21wYXJlIDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMDMwMDIxODcxNDM3OC4zMjIyMzEyNjk2MDYyMTY1MTYgLT4gMQorZGl2eDMyNzcgZGl2aWRlIDM3ODIwNDcxNjYzMy40MDAyNDEwMDYwMjg5NjA1NzYxNSAtMDMwMDIxODcxNDM3OC4zMjIyMzEyNjk2MDYyMTY1MTYgLT4gLTEuMjU5NzYzOTYwNDczMTc1MzI4NDU5OTc0ODgyMDg3NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjc3IGRpdmlkZWludCAzNzgyMDQ3MTY2MzMuNDAwMjQxMDA2MDI4OTYwNTc2MTUgLTAzMDAyMTg3MTQzNzguMzIyMjMxMjY5NjA2MjE2NTE2IC0+IC0xCittdWx4MzI3NyBtdWx0aXBseSAzNzgyMDQ3MTY2MzMuNDAwMjQxMDA2MDI4OTYwNTc2MTUgLTAzMDAyMTg3MTQzNzguMzIyMjMxMjY5NjA2MjE2NTE2IC0+IC0xMTM1NDQxMzM3OTk0OTcwODIwNzU1NTcuMjExODA0MzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI3NyBwb3dlciAzNzgyMDQ3MTY2MzMuNDAwMjQxMDA2MDI4OTYwNTc2MTUgLTMgLT4gMS44NDg0OTg4MjEyNDAxODg2ODg3NTYyNzc5OTk2NzM3RS0zNSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjc3IHJlbWFpbmRlciAzNzgyMDQ3MTY2MzMuNDAwMjQxMDA2MDI4OTYwNTc2MTUgLTAzMDAyMTg3MTQzNzguMzIyMjMxMjY5NjA2MjE2NTE2IC0+IDc3OTg2MDAyMjU1LjA3ODAwOTczNjQyMjc0NDA2MDE1CitzdWJ4MzI3NyBzdWJ0cmFjdCAzNzgyMDQ3MTY2MzMuNDAwMjQxMDA2MDI4OTYwNTc2MTUgLTAzMDAyMTg3MTQzNzguMzIyMjMxMjY5NjA2MjE2NTE2IC0+IDY3ODQyMzQzMTAxMS43MjI0NzIyNzU2MzUxNzcwOTIxNQorYWRkeDMyNzggYWRkIC00NDIzNC41MTIwMTI0NTcxNDgwMjc2ODUyODI5NjkyMzVFKzUwMSAyMTMyNTcyLjQ1NzE5ODc5MDgzNzUwMDIxMDA4OTQ5MjcgLT4gLTQuNDIzNDUxMjAxMjQ1NzE0ODAyNzY4NTI4Mjk2OTIzNUUrNTA1IEluZXhhY3QgUm91bmRlZAorY29teDMyNzggY29tcGFyZSAtNDQyMzQuNTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDEgMjEzMjU3Mi40NTcxOTg3OTA4Mzc1MDAyMTAwODk0OTI3IC0+IC0xCitkaXZ4MzI3OCBkaXZpZGUgLTQ0MjM0LjUxMjAxMjQ1NzE0ODAyNzY4NTI4Mjk2OTIzNUUrNTAxIDIxMzI1NzIuNDU3MTk4NzkwODM3NTAwMjEwMDg5NDkyNyAtPiAtMi4wNzQyMzI1NDc3OTE2MzQ3MTkzMTgxNjAzOTYzMjU3RSs0OTkgSW5leGFjdCBSb3VuZGVkCitkdml4MzI3OCBkaXZpZGVpbnQgLTQ0MjM0LjUxMjAxMjQ1NzE0ODAyNzY4NTI4Mjk2OTIzNUUrNTAxIDIxMzI1NzIuNDU3MTk4NzkwODM3NTAwMjEwMDg5NDkyNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyNzggbXVsdGlwbHkgLTQ0MjM0LjUxMjAxMjQ1NzE0ODAyNzY4NTI4Mjk2OTIzNUUrNTAxIDIxMzI1NzIuNDU3MTk4NzkwODM3NTAwMjEwMDg5NDkyNyAtPiAtOS40MzMzMzAxOTc1Mzk1MTcwNDY1OTgyOTY4MDE5OTE1RSs1MTEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI3OCBwb3dlciAtNDQyMzQuNTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDEgMjEzMjU3MiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjc4IHJlbWFpbmRlciAtNDQyMzQuNTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDEgMjEzMjU3Mi40NTcxOTg3OTA4Mzc1MDAyMTAwODk0OTI3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI3OCBzdWJ0cmFjdCAtNDQyMzQuNTEyMDEyNDU3MTQ4MDI3Njg1MjgyOTY5MjM1RSs1MDEgMjEzMjU3Mi40NTcxOTg3OTA4Mzc1MDAyMTAwODk0OTI3IC0+IC00LjQyMzQ1MTIwMTI0NTcxNDgwMjc2ODUyODI5NjkyMzVFKzUwNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjc5IGFkZCAtMzU1NC41ODk1OTc0OTY4NzQxNDY1NjU0MDIyNzcyMTAwRS0wNzMgOTc1Mi4wNDI4NzQ2NzIyNDk3NjIxOTM2OTk4NTMzODQ4RSs1MTYgLT4gOS43NTIwNDI4NzQ2NzIyNDk3NjIxOTM2OTk4NTMzODQ4RSs1MTkgSW5leGFjdCBSb3VuZGVkCitjb214MzI3OSBjb21wYXJlIC0zNTU0LjU4OTU5NzQ5Njg3NDE0NjU2NTQwMjI3NzIxMDBFLTA3MyA5NzUyLjA0Mjg3NDY3MjI0OTc2MjE5MzY5OTg1MzM4NDhFKzUxNiAtPiAtMQorZGl2eDMyNzkgZGl2aWRlIC0zNTU0LjU4OTU5NzQ5Njg3NDE0NjU2NTQwMjI3NzIxMDBFLTA3MyA5NzUyLjA0Mjg3NDY3MjI0OTc2MjE5MzY5OTg1MzM4NDhFKzUxNiAtPiAtMy42NDQ5NjkyMDYxMjI3MTAwNTcyNzY4MzMwOTEyMTYyRS01OTAgSW5leGFjdCBSb3VuZGVkCitkdml4MzI3OSBkaXZpZGVpbnQgLTM1NTQuNTg5NTk3NDk2ODc0MTQ2NTY1NDAyMjc3MjEwMEUtMDczIDk3NTIuMDQyODc0NjcyMjQ5NzYyMTkzNjk5ODUzMzg0OEUrNTE2IC0+IC0wCittdWx4MzI3OSBtdWx0aXBseSAtMzU1NC41ODk1OTc0OTY4NzQxNDY1NjU0MDIyNzcyMTAwRS0wNzMgOTc1Mi4wNDI4NzQ2NzIyNDk3NjIxOTM2OTk4NTMzODQ4RSs1MTYgLT4gLTMuNDY2NDUxMDE1NjY1MzQ5MTc2OTkwMTQzNTc3NzA2MEUrNDUwIEluZXhhY3QgUm91bmRlZAorcG93eDMyNzkgcG93ZXIgLTM1NTQuNTg5NTk3NDk2ODc0MTQ2NTY1NDAyMjc3MjEwMEUtMDczIDEwIC0+IDMuMjIwMjg3NTcxNjAxOTI2NjkzMzIxNTM4NzQ1NjE5N0UtNjk1IEluZXhhY3QgUm91bmRlZAorcmVteDMyNzkgcmVtYWluZGVyIC0zNTU0LjU4OTU5NzQ5Njg3NDE0NjU2NTQwMjI3NzIxMDBFLTA3MyA5NzUyLjA0Mjg3NDY3MjI0OTc2MjE5MzY5OTg1MzM4NDhFKzUxNiAtPiAtMy41NTQ1ODk1OTc0OTY4NzQxNDY1NjU0MDIyNzcyMTAwRS03MAorc3VieDMyNzkgc3VidHJhY3QgLTM1NTQuNTg5NTk3NDk2ODc0MTQ2NTY1NDAyMjc3MjEwMEUtMDczIDk3NTIuMDQyODc0NjcyMjQ5NzYyMTkzNjk5ODUzMzg0OEUrNTE2IC0+IC05Ljc1MjA0Mjg3NDY3MjI0OTc2MjE5MzY5OTg1MzM4NDhFKzUxOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjgwIGFkZCA3NTAxODc2ODUuNjM2MzI2MDg5MjMzOTcyMzQzOTE2NjggNDYzMzE5NDI1Mjg2My42NzMwNjI1OTcyNjY5MjQ2MDI1IC0+IDQ2MzM5NDQ0NDA1NDkuMzA5Mzg4Njg2NTAwODk2OTQ2NCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjgwIGNvbXBhcmUgNzUwMTg3Njg1LjYzNjMyNjA4OTIzMzk3MjM0MzkxNjY4IDQ2MzMxOTQyNTI4NjMuNjczMDYyNTk3MjY2OTI0NjAyNSAtPiAtMQorZGl2eDMyODAgZGl2aWRlIDc1MDE4NzY4NS42MzYzMjYwODkyMzM5NzIzNDM5MTY2OCA0NjMzMTk0MjUyODYzLjY3MzA2MjU5NzI2NjkyNDYwMjUgLT4gMC4wMDAxNjE5MTU4NzE1NzY2NDU0MTQ2Mzg3MTgwNzM4Mjc1OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjgwIGRpdmlkZWludCA3NTAxODc2ODUuNjM2MzI2MDg5MjMzOTcyMzQzOTE2NjggNDYzMzE5NDI1Mjg2My42NzMwNjI1OTcyNjY5MjQ2MDI1IC0+IDAKK211bHgzMjgwIG11bHRpcGx5IDc1MDE4NzY4NS42MzYzMjYwODkyMzM5NzIzNDM5MTY2OCA0NjMzMTk0MjUyODYzLjY3MzA2MjU5NzI2NjkyNDYwMjUgLT4gMzQ3NTc2NTI3MzY1OTMyNTg5NTAxMi43NjEyMTA3NTU2IEluZXhhY3QgUm91bmRlZAorcG93eDMyODAgcG93ZXIgNzUwMTg3Njg1LjYzNjMyNjA4OTIzMzk3MjM0MzkxNjY4IDUgLT4gMi4zNzYwMTc2MDY4ODI5NTI5NzQ1MTUyMTg4Nzk4NTU3RSs0NCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjgwIHJlbWFpbmRlciA3NTAxODc2ODUuNjM2MzI2MDg5MjMzOTcyMzQzOTE2NjggNDYzMzE5NDI1Mjg2My42NzMwNjI1OTcyNjY5MjQ2MDI1IC0+IDc1MDE4NzY4NS42MzYzMjYwODkyMzM5NzIzNDM5MTY2OAorc3VieDMyODAgc3VidHJhY3QgNzUwMTg3Njg1LjYzNjMyNjA4OTIzMzk3MjM0MzkxNjY4IDQ2MzMxOTQyNTI4NjMuNjczMDYyNTk3MjY2OTI0NjAyNSAtPiAtNDYzMjQ0NDA2NTE3OC4wMzY3MzY1MDgwMzI5NTIyNTg2IEluZXhhY3QgUm91bmRlZAorYWRkeDMyODEgYWRkIDMwMTkwMDM0MjQyODUzLjI1MTE2NTk1MTQ1NzU4OTM4NkUtMDI4IDgwMzg4ODU2NzYuMzIwNDIzODMyMjk3NjA4Nzc5OTc1MUUrMDE4IC0+IDgwMzg4ODU2NzYzMjA0MjM4MzIyOTc2MDg3NzkuOTc1MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjgxIGNvbXBhcmUgMzAxOTAwMzQyNDI4NTMuMjUxMTY1OTUxNDU3NTg5Mzg2RS0wMjggODAzODg4NTY3Ni4zMjA0MjM4MzIyOTc2MDg3Nzk5NzUxRSswMTggLT4gLTEKK2RpdngzMjgxIGRpdmlkZSAzMDE5MDAzNDI0Mjg1My4yNTExNjU5NTE0NTc1ODkzODZFLTAyOCA4MDM4ODg1Njc2LjMyMDQyMzgzMjI5NzYwODc3OTk3NTFFKzAxOCAtPiAzLjc1NTQ5OTg4NjIzMTk4MDcyOTU5MDMzNDg5NjAyODBFLTQzIEluZXhhY3QgUm91bmRlZAorZHZpeDMyODEgZGl2aWRlaW50IDMwMTkwMDM0MjQyODUzLjI1MTE2NTk1MTQ1NzU4OTM4NkUtMDI4IDgwMzg4ODU2NzYuMzIwNDIzODMyMjk3NjA4Nzc5OTc1MUUrMDE4IC0+IDAKK211bHgzMjgxIG11bHRpcGx5IDMwMTkwMDM0MjQyODUzLjI1MTE2NTk1MTQ1NzU4OTM4NkUtMDI4IDgwMzg4ODU2NzYuMzIwNDIzODMyMjk3NjA4Nzc5OTc1MUUrMDE4IC0+IDI0MjY5NDIzMzg0MjQ5LjYxMTI2MzcyODg1NDc5MzczMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjgxIHBvd2VyIDMwMTkwMDM0MjQyODUzLjI1MTE2NTk1MTQ1NzU4OTM4NkUtMDI4IDggLT4gNi45MDA5NDk0MzA1NjEyNTg5NTc4MzMyNjkwNjkyMTEzRS0xMTcgSW5leGFjdCBSb3VuZGVkCityZW14MzI4MSByZW1haW5kZXIgMzAxOTAwMzQyNDI4NTMuMjUxMTY1OTUxNDU3NTg5Mzg2RS0wMjggODAzODg4NTY3Ni4zMjA0MjM4MzIyOTc2MDg3Nzk5NzUxRSswMTggLT4gMy4wMTkwMDM0MjQyODUzMjUxMTY1OTUxNDU3NTg5Mzg2RS0xNQorc3VieDMyODEgc3VidHJhY3QgMzAxOTAwMzQyNDI4NTMuMjUxMTY1OTUxNDU3NTg5Mzg2RS0wMjggODAzODg4NTY3Ni4zMjA0MjM4MzIyOTc2MDg3Nzk5NzUxRSswMTggLT4gLTgwMzg4ODU2NzYzMjA0MjM4MzIyOTc2MDg3NzkuOTc1MSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjgyIGFkZCA2NS41Mzc5NDI2NzY3NzQ3MTU5NTM0MDA3Njg4MDM1MzkgMTI1OTQ2OTE3MjYwLjg3NTM2NTA2MTk3MTkxNzgyMTk4IC0+IDEyNTk0NjkxNzMyNi40MTMzMDc3Mzg3NDY2MzM3NzUzOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjgyIGNvbXBhcmUgNjUuNTM3OTQyNjc2Nzc0NzE1OTUzNDAwNzY4ODAzNTM5IDEyNTk0NjkxNzI2MC44NzUzNjUwNjE5NzE5MTc4MjE5OCAtPiAtMQorZGl2eDMyODIgZGl2aWRlIDY1LjUzNzk0MjY3Njc3NDcxNTk1MzQwMDc2ODgwMzUzOSAxMjU5NDY5MTcyNjAuODc1MzY1MDYxOTcxOTE3ODIxOTggLT4gNS4yMDM2MTYyNjE2ODQ2ODk0OTIwMzg5NDE0NzM1ODc4RS0xMCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjgyIGRpdmlkZWludCA2NS41Mzc5NDI2NzY3NzQ3MTU5NTM0MDA3Njg4MDM1MzkgMTI1OTQ2OTE3MjYwLjg3NTM2NTA2MTk3MTkxNzgyMTk4IC0+IDAKK211bHgzMjgyIG11bHRpcGx5IDY1LjUzNzk0MjY3Njc3NDcxNTk1MzQwMDc2ODgwMzUzOSAxMjU5NDY5MTcyNjAuODc1MzY1MDYxOTcxOTE3ODIxOTggLT4gODI1NDMwMTg0Mzc1OS43Mzc2OTkwOTU3MzU1NDExMzcwIEluZXhhY3QgUm91bmRlZAorcG93eDMyODIgcG93ZXIgNjUuNTM3OTQyNjc2Nzc0NzE1OTUzNDAwNzY4ODAzNTM5IDEgLT4gNjUuNTM3OTQyNjc2Nzc0NzE1OTUzNDAwNzY4ODAzNTM5CityZW14MzI4MiByZW1haW5kZXIgNjUuNTM3OTQyNjc2Nzc0NzE1OTUzNDAwNzY4ODAzNTM5IDEyNTk0NjkxNzI2MC44NzUzNjUwNjE5NzE5MTc4MjE5OCAtPiA2NS41Mzc5NDI2NzY3NzQ3MTU5NTM0MDA3Njg4MDM1MzkKK3N1YngzMjgyIHN1YnRyYWN0IDY1LjUzNzk0MjY3Njc3NDcxNTk1MzQwMDc2ODgwMzUzOSAxMjU5NDY5MTcyNjAuODc1MzY1MDYxOTcxOTE3ODIxOTggLT4gLTEyNTk0NjkxNzE5NS4zMzc0MjIzODUxOTcyMDE4Njg1OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjgzIGFkZCA4MDE1MjcyMzQ4Njc3LjU0ODkzOTQxODM4ODE4MTM3MDAgOTQ5LjIzMDI3MTExNDk5Nzc5MjU4Mjg0ODc3OTIwMDIyIC0+IDgwMTUyNzIzNDk2MjYuNzc5MjEwNTMzMzg1OTczOTUyOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjgzIGNvbXBhcmUgODAxNTI3MjM0ODY3Ny41NDg5Mzk0MTgzODgxODEzNzAwIDk0OS4yMzAyNzExMTQ5OTc3OTI1ODI4NDg3NzkyMDAyMiAtPiAxCitkaXZ4MzI4MyBkaXZpZGUgODAxNTI3MjM0ODY3Ny41NDg5Mzk0MTgzODgxODEzNzAwIDk0OS4yMzAyNzExMTQ5OTc3OTI1ODI4NDg3NzkyMDAyMiAtPiA4NDQzOTcwNDM4LjU1NjAxMDc5Nzg3OTAwODQ0MzAxMTAgSW5leGFjdCBSb3VuZGVkCitkdml4MzI4MyBkaXZpZGVpbnQgODAxNTI3MjM0ODY3Ny41NDg5Mzk0MTgzODgxODEzNzAwIDk0OS4yMzAyNzExMTQ5OTc3OTI1ODI4NDg3NzkyMDAyMiAtPiA4NDQzOTcwNDM4CittdWx4MzI4MyBtdWx0aXBseSA4MDE1MjcyMzQ4Njc3LjU0ODkzOTQxODM4ODE4MTM3MDAgOTQ5LjIzMDI3MTExNDk5Nzc5MjU4Mjg0ODc3OTIwMDIyIC0+IDc2MDgzMzkxNDQ1OTU3MzQuODk4NDI4MTQzMTQ3MTc0MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjgzIHBvd2VyIDgwMTUyNzIzNDg2NzcuNTQ4OTM5NDE4Mzg4MTgxMzcwMCA5NDkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzI4MyByZW1haW5kZXIgODAxNTI3MjM0ODY3Ny41NDg5Mzk0MTgzODgxODEzNzAwIDk0OS4yMzAyNzExMTQ5OTc3OTI1ODI4NDg3NzkyMDAyMiAtPiA1MjcuNzgyMjgwNDEzNTU3NDIzOTc4OTUzMDM2OTAzNjQKK3N1YngzMjgzIHN1YnRyYWN0IDgwMTUyNzIzNDg2NzcuNTQ4OTM5NDE4Mzg4MTgxMzcwMCA5NDkuMjMwMjcxMTE0OTk3NzkyNTgyODQ4Nzc5MjAwMjIgLT4gODAxNTI3MjM0NzcyOC4zMTg2NjgzMDMzOTAzODg3ODcyIEluZXhhY3QgUm91bmRlZAorYWRkeDMyODQgYWRkIC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNSA2OTEzMC4wNTIyMzM2NDk4MDg3NTAxMTMxNDE1MDI0NjVFLTg2MiAtPiAtMzI1OTUzMzM5ODIuNjcwNjg2MjIxMjA0NTE4MDQyMjUwIEluZXhhY3QgUm91bmRlZAorY29teDMyODQgY29tcGFyZSAtMzI1OTUzMzM5ODIuNjcwNjg2MjIxMjA0NTE4MDQyMjUgNjkxMzAuMDUyMjMzNjQ5ODA4NzUwMTEzMTQxNTAyNDY1RS04NjIgLT4gLTEKK2RpdngzMjg0IGRpdmlkZSAtMzI1OTUzMzM5ODIuNjcwNjg2MjIxMjA0NTE4MDQyMjUgNjkxMzAuMDUyMjMzNjQ5ODA4NzUwMTEzMTQxNTAyNDY1RS04NjIgLT4gLTQuNzE1MDc0NDAzODkzNTU3NDU3NDY4MTYwOTQ1NzcyN0UrODY3IEluZXhhY3QgUm91bmRlZAorZHZpeDMyODQgZGl2aWRlaW50IC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNSA2OTEzMC4wNTIyMzM2NDk4MDg3NTAxMTMxNDE1MDI0NjVFLTg2MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyODQgbXVsdGlwbHkgLTMyNTk1MzMzOTgyLjY3MDY4NjIyMTIwNDUxODA0MjI1IDY5MTMwLjA1MjIzMzY0OTgwODc1MDExMzE0MTUwMjQ2NUUtODYyIC0+IC0yLjI1MzMxNzE0MDc5NTI4NTE4ODU0NDYyMTM2OTc3MTVFLTg0NyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjg0IHBvd2VyIC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNSA3IC0+IC0zLjkwOTIwMTQxNDgwMzE3Mzk2NjY1MjU2MDYwOTMzMDZFKzczIEluZXhhY3QgUm91bmRlZAorcmVteDMyODQgcmVtYWluZGVyIC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNSA2OTEzMC4wNTIyMzM2NDk4MDg3NTAxMTMxNDE1MDI0NjVFLTg2MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDMyODQgc3VidHJhY3QgLTMyNTk1MzMzOTgyLjY3MDY4NjIyMTIwNDUxODA0MjI1IDY5MTMwLjA1MjIzMzY0OTgwODc1MDExMzE0MTUwMjQ2NUUtODYyIC0+IC0zMjU5NTMzMzk4Mi42NzA2ODYyMjEyMDQ1MTgwNDIyNTAgSW5leGFjdCBSb3VuZGVkCithZGR4MzI4NSBhZGQgLTE3NTQ0MTg5MDE3MTQ1LjcxMDExNzYzMzAyMTgwMDQyNkUtNTM3IDI5MjE3ODAwMC4wNjQ1MDgwNDYxODI5OTUyMDA5NDg0MyAtPiAyOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgSW5leGFjdCBSb3VuZGVkCitjb214MzI4NSBjb21wYXJlIC0xNzU0NDE4OTAxNzE0NS43MTAxMTc2MzMwMjE4MDA0MjZFLTUzNyAyOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgLT4gLTEKK2RpdngzMjg1IGRpdmlkZSAtMTc1NDQxODkwMTcxNDUuNzEwMTE3NjMzMDIxODAwNDI2RS01MzcgMjkyMTc4MDAwLjA2NDUwODA0NjE4Mjk5NTIwMDk0ODQzIC0+IC02LjAwNDYyMzU1NTkzOTI3MTUzMzQ2NjgyNzcwMjY4OTZFLTUzMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjg1IGRpdmlkZWludCAtMTc1NDQxODkwMTcxNDUuNzEwMTE3NjMzMDIxODAwNDI2RS01MzcgMjkyMTc4MDAwLjA2NDUwODA0NjE4Mjk5NTIwMDk0ODQzIC0+IC0wCittdWx4MzI4NSBtdWx0aXBseSAtMTc1NDQxODkwMTcxNDUuNzEwMTE3NjMzMDIxODAwNDI2RS01MzcgMjkyMTc4MDAwLjA2NDUwODA0NjE4Mjk5NTIwMDk0ODQzIC0+IC01LjEyNjAyNjA1OTc4MzM0MDY0NjExMTAxMzY5NTI0NTZFLTUxNiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjg1IHBvd2VyIC0xNzU0NDE4OTAxNzE0NS43MTAxMTc2MzMwMjE4MDA0MjZFLTUzNyAyOTIxNzgwMDAgLT4gMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyODUgcmVtYWluZGVyIC0xNzU0NDE4OTAxNzE0NS43MTAxMTc2MzMwMjE4MDA0MjZFLTUzNyAyOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgLT4gLTEuNzU0NDE4OTAxNzE0NTcxMDExNzYzMzAyMTgwMDQyNkUtNTI0CitzdWJ4MzI4NSBzdWJ0cmFjdCAtMTc1NDQxODkwMTcxNDUuNzEwMTE3NjMzMDIxODAwNDI2RS01MzcgMjkyMTc4MDAwLjA2NDUwODA0NjE4Mjk5NTIwMDk0ODQzIC0+IC0yOTIxNzgwMDAuMDY0NTA4MDQ2MTgyOTk1MjAwOTQ4NDMgSW5leGFjdCBSb3VuZGVkCithZGR4MzI4NiBhZGQgLTUwNjY1MC45OTM5NTY0OTkwNzEzOTIwNDA1MjQ0MTYzMCAxMS4wMTg0Mjc1MDIwMzE2NTAxNDg5NjIwNjczNjcxNTggLT4gLTUwNjYzOS45NzU1Mjg5OTcwMzk3NDE4OTE1NjIzNDg5MyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjg2IGNvbXBhcmUgLTUwNjY1MC45OTM5NTY0OTkwNzEzOTIwNDA1MjQ0MTYzMCAxMS4wMTg0Mjc1MDIwMzE2NTAxNDg5NjIwNjczNjcxNTggLT4gLTEKK2RpdngzMjg2IGRpdmlkZSAtNTA2NjUwLjk5Mzk1NjQ5OTA3MTM5MjA0MDUyNDQxNjMwIDExLjAxODQyNzUwMjAzMTY1MDE0ODk2MjA2NzM2NzE1OCAtPiAtNDU5ODIuMTUwNzA3MzU2MzI5MDI3Njk4NzE3MTg5MTA0IEluZXhhY3QgUm91bmRlZAorZHZpeDMyODYgZGl2aWRlaW50IC01MDY2NTAuOTkzOTU2NDk5MDcxMzkyMDQwNTI0NDE2MzAgMTEuMDE4NDI3NTAyMDMxNjUwMTQ4OTYyMDY3MzY3MTU4IC0+IC00NTk4MgorbXVseDMyODYgbXVsdGlwbHkgLTUwNjY1MC45OTM5NTY0OTkwNzEzOTIwNDA1MjQ0MTYzMCAxMS4wMTg0Mjc1MDIwMzE2NTAxNDg5NjIwNjczNjcxNTggLT4gLTU1ODI0OTcuMjQ1NzQxOTYwNzM5Mjk0MDIzNDI3MTIyMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjg2IHBvd2VyIC01MDY2NTAuOTkzOTU2NDk5MDcxMzkyMDQwNTI0NDE2MzAgMTEgLT4gLTUuNjQ2NzQxMjY3ODgwOTg4NTMzMzMxMzgxODA3ODgyOUUrNjIgSW5leGFjdCBSb3VuZGVkCityZW14MzI4NiByZW1haW5kZXIgLTUwNjY1MC45OTM5NTY0OTkwNzEzOTIwNDA1MjQ0MTYzMCAxMS4wMTg0Mjc1MDIwMzE2NTAxNDg5NjIwNjczNjcxNTggLT4gLTEuNjYwNTU4MDc5NzM0MjQyNDY2NzQyNzM5NjQwODQ0CitzdWJ4MzI4NiBzdWJ0cmFjdCAtNTA2NjUwLjk5Mzk1NjQ5OTA3MTM5MjA0MDUyNDQxNjMwIDExLjAxODQyNzUwMjAzMTY1MDE0ODk2MjA2NzM2NzE1OCAtPiAtNTA2NjYyLjAxMjM4NDAwMTEwMzA0MjE4OTQ4NjQ4MzY3IEluZXhhY3QgUm91bmRlZAorYWRkeDMyODcgYWRkIDQ4NDY4MzUxNTkuNTkyMjM3MjMwNzY1NjAwMDc2OTM5NUUtMjQxIC04NC4wMDE4OTMwNDA4NjU4NjQ1OTAxMjIzMzA4MDA3NjggLT4gLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjg3IGNvbXBhcmUgNDg0NjgzNTE1OS41OTIyMzcyMzA3NjU2MDAwNzY5Mzk1RS0yNDEgLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCAtPiAxCitkaXZ4MzI4NyBkaXZpZGUgNDg0NjgzNTE1OS41OTIyMzcyMzA3NjU2MDAwNzY5Mzk1RS0yNDEgLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCAtPiAtNS43Njk5MTE4MjQ3NjYwMzU3ODE0NjQxODEzMjYwNTI0RS0yMzQgSW5leGFjdCBSb3VuZGVkCitkdml4MzI4NyBkaXZpZGVpbnQgNDg0NjgzNTE1OS41OTIyMzcyMzA3NjU2MDAwNzY5Mzk1RS0yNDEgLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCAtPiAtMAorbXVseDMyODcgbXVsdGlwbHkgNDg0NjgzNTE1OS41OTIyMzcyMzA3NjU2MDAwNzY5Mzk1RS0yNDEgLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCAtPiAtNC4wNzE0MzMyODY2Mjc3NTE0NDgxMTkyODU2OTI1Nzc1RS0yMzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI4NyBwb3dlciA0ODQ2ODM1MTU5LjU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTI0MSAtODQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzI4NyByZW1haW5kZXIgNDg0NjgzNTE1OS41OTIyMzcyMzA3NjU2MDAwNzY5Mzk1RS0yNDEgLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCAtPiA0Ljg0NjgzNTE1OTU5MjIzNzIzMDc2NTYwMDA3NjkzOTVFLTIzMgorc3VieDMyODcgc3VidHJhY3QgNDg0NjgzNTE1OS41OTIyMzcyMzA3NjU2MDAwNzY5Mzk1RS0yNDEgLTg0LjAwMTg5MzA0MDg2NTg2NDU5MDEyMjMzMDgwMDc2OCAtPiA4NC4wMDE4OTMwNDA4NjU4NjQ1OTAxMjIzMzA4MDA3NjggSW5leGFjdCBSb3VuZGVkCithZGR4MzI4OCBhZGQgLTM1LjAyOTMxMTAxMzgyMjI1OTM1ODExNjU1NjE2NDkwOCAtMzk5NDMwODg3OC4xOTk0NjQ1MzEzNDE0NTM0MjA5MTI3IC0+IC0zOTk0MzA4OTEzLjIyODc3NTU0NTE2MzcxMjc3OTAyOTMgSW5leGFjdCBSb3VuZGVkCitjb214MzI4OCBjb21wYXJlIC0zNS4wMjkzMTEwMTM4MjIyNTkzNTgxMTY1NTYxNjQ5MDggLTM5OTQzMDg4NzguMTk5NDY0NTMxMzQxNDUzNDIwOTEyNyAtPiAxCitkaXZ4MzI4OCBkaXZpZGUgLTM1LjAyOTMxMTAxMzgyMjI1OTM1ODExNjU1NjE2NDkwOCAtMzk5NDMwODg3OC4xOTk0NjQ1MzEzNDE0NTM0MjA5MTI3IC0+IDguNzY5ODA1MjYwOTMyMzAwNDU0MzUzODE2MzA2MTc3NEUtOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjg4IGRpdmlkZWludCAtMzUuMDI5MzExMDEzODIyMjU5MzU4MTE2NTU2MTY0OTA4IC0zOTk0MzA4ODc4LjE5OTQ2NDUzMTM0MTQ1MzQyMDkxMjcgLT4gMAorbXVseDMyODggbXVsdGlwbHkgLTM1LjAyOTMxMTAxMzgyMjI1OTM1ODExNjU1NjE2NDkwOCAtMzk5NDMwODg3OC4xOTk0NjQ1MzEzNDE0NTM0MjA5MTI3IC0+IDEzOTkxNzg4Nzk3OS43MjA1MzYzNzI3Mjk2MTEyMDYzOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjg4IHBvd2VyIC0zNS4wMjkzMTEwMTM4MjIyNTkzNTgxMTY1NTYxNjQ5MDggLTQgLT4gNi42NDE2MTM4MDQwNTIyMTI0NjkzNDk1MTc4MjE4MDk2RS03IEluZXhhY3QgUm91bmRlZAorcmVteDMyODggcmVtYWluZGVyIC0zNS4wMjkzMTEwMTM4MjIyNTkzNTgxMTY1NTYxNjQ5MDggLTM5OTQzMDg4NzguMTk5NDY0NTMxMzQxNDUzNDIwOTEyNyAtPiAtMzUuMDI5MzExMDEzODIyMjU5MzU4MTE2NTU2MTY0OTA4CitzdWJ4MzI4OCBzdWJ0cmFjdCAtMzUuMDI5MzExMDEzODIyMjU5MzU4MTE2NTU2MTY0OTA4IC0zOTk0MzA4ODc4LjE5OTQ2NDUzMTM0MTQ1MzQyMDkxMjcgLT4gMzk5NDMwODg0My4xNzAxNTM1MTc1MTkxOTQwNjI3OTYxIEluZXhhY3QgUm91bmRlZAorYWRkeDMyODkgYWRkIDc2MDY2NjM3NTAuNjczNTI2NTIzMzA0NDQyMDg4NzAxOEUrMTY2IC01NDkxODE0NjM5LjQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM2NSAtPiAtNS40OTE4MTQ2Mzk0NDg0NTY1NDE4Mjg0Njg2MTI3NTUyRSszNzQgSW5leGFjdCBSb3VuZGVkCitjb214MzI4OSBjb21wYXJlIDc2MDY2NjM3NTAuNjczNTI2NTIzMzA0NDQyMDg4NzAxOEUrMTY2IC01NDkxODE0NjM5LjQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM2NSAtPiAxCitkaXZ4MzI4OSBkaXZpZGUgNzYwNjY2Mzc1MC42NzM1MjY1MjMzMDQ0NDIwODg3MDE4RSsxNjYgLTU0OTE4MTQ2MzkuNDQ4NDU2NTQxODI4NDY4NjEyNzU1MkUrMzY1IC0+IC0xLjM4NTA5MTEzMTA4Njk0ODc4OTU5NDc3MzMwOTAyMDRFLTE5OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjg5IGRpdmlkZWludCA3NjA2NjYzNzUwLjY3MzUyNjUyMzMwNDQ0MjA4ODcwMThFKzE2NiAtNTQ5MTgxNDYzOS40NDg0NTY1NDE4Mjg0Njg2MTI3NTUyRSszNjUgLT4gLTAKK211bHgzMjg5IG11bHRpcGx5IDc2MDY2NjM3NTAuNjczNTI2NTIzMzA0NDQyMDg4NzAxOEUrMTY2IC01NDkxODE0NjM5LjQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM2NSAtPiAtNC4xNzc0Mzg3MzQzMzEwNzc3MTkwOTE3MTI4MDA2NTg5RSs1NTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI4OSBwb3dlciA3NjA2NjYzNzUwLjY3MzUyNjUyMzMwNDQ0MjA4ODcwMThFKzE2NiAtNSAtPiAzLjkyNjcxMDY5Nzg4ODczNDYzNzM5NTczMTQ4MTgxNzhFLTg4MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjg5IHJlbWFpbmRlciA3NjA2NjYzNzUwLjY3MzUyNjUyMzMwNDQ0MjA4ODcwMThFKzE2NiAtNTQ5MTgxNDYzOS40NDg0NTY1NDE4Mjg0Njg2MTI3NTUyRSszNjUgLT4gNy42MDY2NjM3NTA2NzM1MjY1MjMzMDQ0NDIwODg3MDE4RSsxNzUKK3N1YngzMjg5IHN1YnRyYWN0IDc2MDY2NjM3NTAuNjczNTI2NTIzMzA0NDQyMDg4NzAxOEUrMTY2IC01NDkxODE0NjM5LjQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM2NSAtPiA1LjQ5MTgxNDYzOTQ0ODQ1NjU0MTgyODQ2ODYxMjc1NTJFKzM3NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjkwIGFkZCAtMjU2NzcuODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNjMgLTk0MTM1Mzk1MTI0MTkzMDQ4NTYwMTcyNzA1MDgyMDI5RS04NjIgLT4gLTIuNTY3NzgyOTY2MDgzMTc0MTI3NDIwNzMyNjY5NzA1MkUtMTU5IEluZXhhY3QgUm91bmRlZAorY29teDMyOTAgY29tcGFyZSAtMjU2NzcuODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNjMgLTk0MTM1Mzk1MTI0MTkzMDQ4NTYwMTcyNzA1MDgyMDI5RS04NjIgLT4gLTEKK2RpdngzMjkwIGRpdmlkZSAtMjU2NzcuODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNjMgLTk0MTM1Mzk1MTI0MTkzMDQ4NTYwMTcyNzA1MDgyMDI5RS04NjIgLT4gMi43Mjc3NTUwMTk5ODUzMDA5NzA4NDkzMTY3Mjk5ODM4RSs2NzEgSW5leGFjdCBSb3VuZGVkCitkdml4MzI5MCBkaXZpZGVpbnQgLTI1Njc3LjgyOTY2MDgzMTc0MTI3NDIwNzMyNjY5NzA1MkUtMTYzIC05NDEzNTM5NTEyNDE5MzA0ODU2MDE3MjcwNTA4MjAyOUUtODYyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI5MCBtdWx0aXBseSAtMjU2NzcuODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNjMgLTk0MTM1Mzk1MTI0MTkzMDQ4NTYwMTcyNzA1MDgyMDI5RS04NjIgLT4gMi40MTcxOTI2NDEwNTQxMTk5MzkzNzI4Mjk0NzYyNTU5RS05ODkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5MCBwb3dlciAtMjU2NzcuODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNjMgLTkgLT4gLTIuMDYwNTEyMTQyMDY4Mjc2NDg5Nzg2NzIyMTk5MjE3NEUrMTQyNyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjkwIHJlbWFpbmRlciAtMjU2NzcuODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNjMgLTk0MTM1Mzk1MTI0MTkzMDQ4NTYwMTcyNzA1MDgyMDI5RS04NjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjkwIHN1YnRyYWN0IC0yNTY3Ny44Mjk2NjA4MzE3NDEyNzQyMDczMjY2OTcwNTJFLTE2MyAtOTQxMzUzOTUxMjQxOTMwNDg1NjAxNzI3MDUwODIwMjlFLTg2MiAtPiAtMi41Njc3ODI5NjYwODMxNzQxMjc0MjA3MzI2Njk3MDUyRS0xNTkgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5MSBhZGQgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCAtPiAtMS41NDEyNTYzODM3NTQwODEwNzkzNjk3OTU1MDYzMjk1RSs1NTQgSW5leGFjdCBSb3VuZGVkCitjb214MzI5MSBjb21wYXJlIDk3MjcxNTc2MDk0LjQ1NjQwNjcyOTY3MTcyOTIyNDgyNyAtMS41NDEyNTYzODM3NTQwODEwNzkzNjk3OTU1MDYzMjk1RSs1NTQgLT4gMQorZGl2eDMyOTEgZGl2aWRlIDk3MjcxNTc2MDk0LjQ1NjQwNjcyOTY3MTcyOTIyNDgyNyAtMS41NDEyNTYzODM3NTQwODEwNzkzNjk3OTU1MDYzMjk1RSs1NTQgLT4gLTYuMzExMTg3MjMxMzg5MDY0NjE0NDQ3MzY1MjY0NTAzMEUtNTQ0IEluZXhhY3QgUm91bmRlZAorZHZpeDMyOTEgZGl2aWRlaW50IDk3MjcxNTc2MDk0LjQ1NjQwNjcyOTY3MTcyOTIyNDgyNyAtMS41NDEyNTYzODM3NTQwODEwNzkzNjk3OTU1MDYzMjk1RSs1NTQgLT4gLTAKK211bHgzMjkxIG11bHRpcGx5IDk3MjcxNTc2MDk0LjQ1NjQwNjcyOTY3MTcyOTIyNDgyNyAtMS41NDEyNTYzODM3NTQwODEwNzkzNjk3OTU1MDYzMjk1RSs1NTQgLT4gLTEuNDk5MjA0Mzc2MTM0MDE4MDI4ODA2NTk1OTMwMDA5MEUrNTY1IEluZXhhY3QgUm91bmRlZAorcG93eDMyOTEgcG93ZXIgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0yIC0+IDEuMDU2ODg1ODc2NTg1MjA3MzE4MTM1MjMwOTQwMTM0M0UtMjIgSW5leGFjdCBSb3VuZGVkCityZW14MzI5MSByZW1haW5kZXIgOTcyNzE1NzYwOTQuNDU2NDA2NzI5NjcxNzI5MjI0ODI3IC0xLjU0MTI1NjM4Mzc1NDA4MTA3OTM2OTc5NTUwNjMyOTVFKzU1NCAtPiA5NzI3MTU3NjA5NC40NTY0MDY3Mjk2NzE3MjkyMjQ4MjcKK3N1YngzMjkxIHN1YnRyYWN0IDk3MjcxNTc2MDk0LjQ1NjQwNjcyOTY3MTcyOTIyNDgyNyAtMS41NDEyNTYzODM3NTQwODEwNzkzNjk3OTU1MDYzMjk1RSs1NTQgLT4gMS41NDEyNTYzODM3NTQwODEwNzkzNjk3OTU1MDYzMjk1RSs1NTQgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5MiBhZGQgNDExMzk3ODk4OTQuNDAxODI2OTE1NzU3MzkxNzc3NTYzIC0xLjg3Mjk5MjAzMDU2NzEwNTc5NTcxNTYxNTk2OTA4MjNFLTAyMCAtPiA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1NDQgSW5leGFjdCBSb3VuZGVkCitjb214MzI5MiBjb21wYXJlIDQxMTM5Nzg5ODk0LjQwMTgyNjkxNTc1NzM5MTc3NzU2MyAtMS44NzI5OTIwMzA1NjcxMDU3OTU3MTU2MTU5NjkwODIzRS0wMjAgLT4gMQorZGl2eDMyOTIgZGl2aWRlIDQxMTM5Nzg5ODk0LjQwMTgyNjkxNTc1NzM5MTc3NzU2MyAtMS44NzI5OTIwMzA1NjcxMDU3OTU3MTU2MTU5NjkwODIzRS0wMjAgLT4gLTIxOTY0NzQzNjk1MTE2MjUzODkyODk1MDY0NjE1NTEuMCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjkyIGRpdmlkZWludCA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1NjMgLTEuODcyOTkyMDMwNTY3MTA1Nzk1NzE1NjE1OTY5MDgyM0UtMDIwIC0+IC0yMTk2NDc0MzY5NTExNjI1Mzg5Mjg5NTA2NDYxNTUxCittdWx4MzI5MiBtdWx0aXBseSA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1NjMgLTEuODcyOTkyMDMwNTY3MTA1Nzk1NzE1NjE1OTY5MDgyM0UtMDIwIC0+IC03LjcwNTQ0OTg2MTE0MTk3NzY3MTQyOTEwODA5Mjg2MDFFLTEwIEluZXhhY3QgUm91bmRlZAorcG93eDMyOTIgcG93ZXIgNDExMzk3ODk4OTQuNDAxODI2OTE1NzU3MzkxNzc3NTYzIC0yIC0+IDUuOTA4NDgxMjQ0Mjc0MTA5MTU1MDg5MTQ1MTA2OTkxOUUtMjIgSW5leGFjdCBSb3VuZGVkCityZW14MzI5MiByZW1haW5kZXIgNDExMzk3ODk4OTQuNDAxODI2OTE1NzU3MzkxNzc3NTYzIC0xLjg3Mjk5MjAzMDU2NzEwNTc5NTcxNTYxNTk2OTA4MjNFLTAyMCAtPiA2Ljk4MTQxMDIyNjQwNTQ0MDE4OTM1MTAyOTUzNTI3RS0yMgorc3VieDMyOTIgc3VidHJhY3QgNDExMzk3ODk4OTQuNDAxODI2OTE1NzU3MzkxNzc3NTYzIC0xLjg3Mjk5MjAzMDU2NzEwNTc5NTcxNTYxNTk2OTA4MjNFLTAyMCAtPiA0MTEzOTc4OTg5NC40MDE4MjY5MTU3NTczOTE3Nzc1ODIgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5MyBhZGQgLTgzMzEwODMxMjg3MjQxLjc3NzU5ODY5Njg1MzQ5ODE0OSAtNTQ3OTk4MjUwMzMuNzk3MTAwNDE4MTYyOTg1MTAzNTE5RS0zMzAgLT4gLTgzMzEwODMxMjg3MjQxLjc3NzU5ODY5Njg1MzQ5ODE0OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjkzIGNvbXBhcmUgLTgzMzEwODMxMjg3MjQxLjc3NzU5ODY5Njg1MzQ5ODE0OSAtNTQ3OTk4MjUwMzMuNzk3MTAwNDE4MTYyOTg1MTAzNTE5RS0zMzAgLT4gLTEKK2RpdngzMjkzIGRpdmlkZSAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IC01NDc5OTgyNTAzMy43OTcxMDA0MTgxNjI5ODUxMDM1MTlFLTMzMCAtPiAxLjUyMDI3NTQ5Nzg4NDU0Mzg2MzY2MDUxNzA4NTc0NzhFKzMzMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjkzIGRpdmlkZWludCAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IC01NDc5OTgyNTAzMy43OTcxMDA0MTgxNjI5ODUxMDM1MTlFLTMzMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDMyOTMgbXVsdGlwbHkgLTgzMzEwODMxMjg3MjQxLjc3NzU5ODY5Njg1MzQ5ODE0OSAtNTQ3OTk4MjUwMzMuNzk3MTAwNDE4MTYyOTg1MTAzNTE5RS0zMzAgLT4gNC41NjU0MTg5Nzc5NjEwMzg2NzYwMzMwNTI3ODM5NTg4RS0zMDYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5MyBwb3dlciAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IC01IC0+IC0yLjQ5MTY4MjI2MDY2ODI2MjQ4Mjc5MDA1ODE3MjgzODdFLTcwIEluZXhhY3QgUm91bmRlZAorcmVteDMyOTMgcmVtYWluZGVyIC04MzMxMDgzMTI4NzI0MS43Nzc1OTg2OTY4NTM0OTgxNDkgLTU0Nzk5ODI1MDMzLjc5NzEwMDQxODE2Mjk4NTEwMzUxOUUtMzMwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzI5MyBzdWJ0cmFjdCAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IC01NDc5OTgyNTAzMy43OTcxMDA0MTgxNjI5ODUxMDM1MTlFLTMzMCAtPiAtODMzMTA4MzEyODcyNDEuNzc3NTk4Njk2ODUzNDk4MTQ5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyOTQgYWRkIDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNzQ5NTU0NzAuOTc3NjUzMDM4MDEwMDMxNDU3MTgxOTU3RS04ODcgLT4gNDUwNjY1MzQ2MS40NDE0OTc0MjMzNjc4MzMxNzcxMTY5IEluZXhhY3QgUm91bmRlZAorY29teDMyOTQgY29tcGFyZSA0NTA2NjUzNDYxLjQ0MTQ5NzQyMzM2NzgzMzE3NzExNjkgLTc0OTU1NDcwLjk3NzY1MzAzODAxMDAzMTQ1NzE4MTk1N0UtODg3IC0+IDEKK2RpdngzMjk0IGRpdmlkZSA0NTA2NjUzNDYxLjQ0MTQ5NzQyMzM2NzgzMzE3NzExNjkgLTc0OTU1NDcwLjk3NzY1MzAzODAxMDAzMTQ1NzE4MTk1N0UtODg3IC0+IC02LjAxMjQ0MDk5MDE3ODE0OTAwNTQ0MzgyMjAwNDg2MjlFKzg4OCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjk0IGRpdmlkZWludCA0NTA2NjUzNDYxLjQ0MTQ5NzQyMzM2NzgzMzE3NzExNjkgLTc0OTU1NDcwLjk3NzY1MzAzODAxMDAzMTQ1NzE4MTk1N0UtODg3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzI5NCBtdWx0aXBseSA0NTA2NjUzNDYxLjQ0MTQ5NzQyMzM2NzgzMzE3NzExNjkgLTc0OTU1NDcwLjk3NzY1MzAzODAxMDAzMTQ1NzE4MTk1N0UtODg3IC0+IC0zLjM3Nzk4MzMyNzM1NDE3NzY0NzA5MDI5MDM1MTI5NDlFLTg3MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjk0IHBvd2VyIDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNyAtPiAyLjY0ODYyNzI5MTE0ODY0NjExMDI3MzU0MTI0NjMxODlFLTY4IEluZXhhY3QgUm91bmRlZAorcmVteDMyOTQgcmVtYWluZGVyIDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNzQ5NTU0NzAuOTc3NjUzMDM4MDEwMDMxNDU3MTgxOTU3RS04ODcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzMjk0IHN1YnRyYWN0IDQ1MDY2NTM0NjEuNDQxNDk3NDIzMzY3ODMzMTc3MTE2OSAtNzQ5NTU0NzAuOTc3NjUzMDM4MDEwMDMxNDU3MTgxOTU3RS04ODcgLT4gNDUwNjY1MzQ2MS40NDE0OTc0MjMzNjc4MzMxNzcxMTY5IEluZXhhY3QgUm91bmRlZAorYWRkeDMyOTUgYWRkIDIzNzc3Ljg1Nzk1MTExNDk2NzY4NDc2NzYwOTQwMTYyNiA3MjA3NjAuMDM4OTcxNDQxNTcwMTIzMDEzODUyMjc1MjggLT4gNzQ0NTM3Ljg5NjkyMjU1NjUzNzgwNzc4MTQ2MTY3NjkxIEluZXhhY3QgUm91bmRlZAorY29teDMyOTUgY29tcGFyZSAyMzc3Ny44NTc5NTExMTQ5Njc2ODQ3Njc2MDk0MDE2MjYgNzIwNzYwLjAzODk3MTQ0MTU3MDEyMzAxMzg1MjI3NTI4IC0+IC0xCitkaXZ4MzI5NSBkaXZpZGUgMjM3NzcuODU3OTUxMTE0OTY3Njg0NzY3NjA5NDAxNjI2IDcyMDc2MC4wMzg5NzE0NDE1NzAxMjMwMTM4NTIyNzUyOCAtPiAwLjAzMjk4OTk3ODE2OTQ5ODgwODI3NTMwODAzOTAzNDc5NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjk1IGRpdmlkZWludCAyMzc3Ny44NTc5NTExMTQ5Njc2ODQ3Njc2MDk0MDE2MjYgNzIwNzYwLjAzODk3MTQ0MTU3MDEyMzAxMzg1MjI3NTI4IC0+IDAKK211bHgzMjk1IG11bHRpcGx5IDIzNzc3Ljg1Nzk1MTExNDk2NzY4NDc2NzYwOTQwMTYyNiA3MjA3NjAuMDM4OTcxNDQxNTcwMTIzMDEzODUyMjc1MjggLT4gMTcxMzgxMjk4MjMuNTAzMDI1OTEzMDM0OTg3NTM3MDk2IEluZXhhY3QgUm91bmRlZAorcG93eDMyOTUgcG93ZXIgMjM3NzcuODU3OTUxMTE0OTY3Njg0NzY3NjA5NDAxNjI2IDcyMDc2MCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjk1IHJlbWFpbmRlciAyMzc3Ny44NTc5NTExMTQ5Njc2ODQ3Njc2MDk0MDE2MjYgNzIwNzYwLjAzODk3MTQ0MTU3MDEyMzAxMzg1MjI3NTI4IC0+IDIzNzc3Ljg1Nzk1MTExNDk2NzY4NDc2NzYwOTQwMTYyNgorc3VieDMyOTUgc3VidHJhY3QgMjM3NzcuODU3OTUxMTE0OTY3Njg0NzY3NjA5NDAxNjI2IDcyMDc2MC4wMzg5NzE0NDE1NzAxMjMwMTM4NTIyNzUyOCAtPiAtNjk2OTgyLjE4MTAyMDMyNjYwMjQzODI0NjI0Mjg3MzY1IEluZXhhY3QgUm91bmRlZAorYWRkeDMyOTYgYWRkIC0yMTMzNzg1MzMyMzk4MDg1ODA1NTI5MjQ2OTYxMTk0OCA2MDgwMjcyODQwLjMwNzE0OTA0NDUyNTY3ODY5ODIxMDBFKzUzMiAtPiA2LjA4MDI3Mjg0MDMwNzE0OTA0NDUyNTY3ODY5ODIxMDBFKzU0MSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjk2IGNvbXBhcmUgLTIxMzM3ODUzMzIzOTgwODU4MDU1MjkyNDY5NjExOTQ4IDYwODAyNzI4NDAuMzA3MTQ5MDQ0NTI1Njc4Njk4MjEwMEUrNTMyIC0+IC0xCitkaXZ4MzI5NiBkaXZpZGUgLTIxMzM3ODUzMzIzOTgwODU4MDU1MjkyNDY5NjExOTQ4IDYwODAyNzI4NDAuMzA3MTQ5MDQ0NTI1Njc4Njk4MjEwMEUrNTMyIC0+IC0zLjUwOTM1Nzg2NjcyNzQwMjAxMjM3ODg1MTQwNjk4ODVFLTUxMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjk2IGRpdmlkZWludCAtMjEzMzc4NTMzMjM5ODA4NTgwNTUyOTI0Njk2MTE5NDggNjA4MDI3Mjg0MC4zMDcxNDkwNDQ1MjU2Nzg2OTgyMTAwRSs1MzIgLT4gLTAKK211bHgzMjk2IG11bHRpcGx5IC0yMTMzNzg1MzMyMzk4MDg1ODA1NTI5MjQ2OTYxMTk0OCA2MDgwMjcyODQwLjMwNzE0OTA0NDUyNTY3ODY5ODIxMDBFKzUzMiAtPiAtMS4yOTczOTk3MDAzNjI1ODQzMzE3NDE3OTgxOTAyMTk4RSs1NzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5NiBwb3dlciAtMjEzMzc4NTMzMjM5ODA4NTgwNTUyOTI0Njk2MTE5NDggNiAtPiA5LjQzODUyOTgzMjEzMDQ5NzAzMDYxODA2NTIwOTc4NzRFKzE4NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjk2IHJlbWFpbmRlciAtMjEzMzc4NTMzMjM5ODA4NTgwNTUyOTI0Njk2MTE5NDggNjA4MDI3Mjg0MC4zMDcxNDkwNDQ1MjU2Nzg2OTgyMTAwRSs1MzIgLT4gLTIxMzM3ODUzMzIzOTgwODU4MDU1MjkyNDY5NjExOTQ4CitzdWJ4MzI5NiBzdWJ0cmFjdCAtMjEzMzc4NTMzMjM5ODA4NTgwNTUyOTI0Njk2MTE5NDggNjA4MDI3Mjg0MC4zMDcxNDkwNDQ1MjU2Nzg2OTgyMTAwRSs1MzIgLT4gLTYuMDgwMjcyODQwMzA3MTQ5MDQ0NTI1Njc4Njk4MjEwMEUrNTQxIEluZXhhY3QgUm91bmRlZAorYWRkeDMyOTcgYWRkIC04MTg0MDkyMzguMDQyMzg5MzQzOTg0OTc0Mzg1Njk0NyA3NTYuMzkxNTYyNjU5NzI3NTMyNTkyNjcwNjkxNTg3NjAgLT4gLTgxODQwODQ4MS42NTA4MjY2ODQyNTc0NDE3OTMwMjQwMSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzMjk3IGNvbXBhcmUgLTgxODQwOTIzOC4wNDIzODkzNDM5ODQ5NzQzODU2OTQ3IDc1Ni4zOTE1NjI2NTk3Mjc1MzI1OTI2NzA2OTE1ODc2MCAtPiAtMQorZGl2eDMyOTcgZGl2aWRlIC04MTg0MDkyMzguMDQyMzg5MzQzOTg0OTc0Mzg1Njk0NyA3NTYuMzkxNTYyNjU5NzI3NTMyNTkyNjcwNjkxNTg3NjAgLT4gLTEwODE5OTEuNDk1NDY5MDc1MjY3NjQ5NDEyOTQ5MzQwMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMjk3IGRpdmlkZWludCAtODE4NDA5MjM4LjA0MjM4OTM0Mzk4NDk3NDM4NTY5NDcgNzU2LjM5MTU2MjY1OTcyNzUzMjU5MjY3MDY5MTU4NzYwIC0+IC0xMDgxOTkxCittdWx4MzI5NyBtdWx0aXBseSAtODE4NDA5MjM4LjA0MjM4OTM0Mzk4NDk3NDM4NTY5NDcgNzU2LjM5MTU2MjY1OTcyNzUzMjU5MjY3MDY5MTU4NzYwIC0+IC02MTkwMzc4NDI0NTguMDM5ODA1MzczNzAzMjgyNTI4MTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzI5NyBwb3dlciAtODE4NDA5MjM4LjA0MjM4OTM0Mzk4NDk3NDM4NTY5NDcgNzU2IC0+IDEuNjA1ODg4Mzk0NjM3MzIzMjc1MDk5NTU0MzU3MzQ2MUUrNjczOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMjk3IHJlbWFpbmRlciAtODE4NDA5MjM4LjA0MjM4OTM0Mzk4NDk3NDM4NTY5NDcgNzU2LjM5MTU2MjY1OTcyNzUzMjU5MjY3MDY5MTU4NzYwIC0+IC0zNzQuNzY4NjI4MDkxMjY3NDk4MDMxNDMzMTQxMDg4NDAKK3N1YngzMjk3IHN1YnRyYWN0IC04MTg0MDkyMzguMDQyMzg5MzQzOTg0OTc0Mzg1Njk0NyA3NTYuMzkxNTYyNjU5NzI3NTMyNTkyNjcwNjkxNTg3NjAgLT4gLTgxODQwOTk5NC40MzM5NTIwMDM3MTI1MDY5NzgzNjUzOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMjk4IGFkZCA0NzU2NzM4MDM4NDk0My44NzAxMzYwMDI4NjE1NTA0NiA2NS4wODQ3MDkzNzQ5MDgyNzU4MjY5NDIwNzY0ODAzMjYgLT4gNDc1NjczODAzODUwMDguOTU0ODQ1Mzc3NzY5ODI2Mjg3IEluZXhhY3QgUm91bmRlZAorY29teDMyOTggY29tcGFyZSA0NzU2NzM4MDM4NDk0My44NzAxMzYwMDI4NjE1NTA0NiA2NS4wODQ3MDkzNzQ5MDgyNzU4MjY5NDIwNzY0ODAzMjYgLT4gMQorZGl2eDMyOTggZGl2aWRlIDQ3NTY3MzgwMzg0OTQzLjg3MDEzNjAwMjg2MTU1MDQ2IDY1LjA4NDcwOTM3NDkwODI3NTgyNjk0MjA3NjQ4MDMyNiAtPiA3MzA4NTMzODg0ODAuODYyNDc2OTA0NzQzMDM0OTM5NzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzI5OCBkaXZpZGVpbnQgNDc1NjczODAzODQ5NDMuODcwMTM2MDAyODYxNTUwNDYgNjUuMDg0NzA5Mzc0OTA4Mjc1ODI2OTQyMDc2NDgwMzI2IC0+IDczMDg1MzM4ODQ4MAorbXVseDMyOTggbXVsdGlwbHkgNDc1NjczODAzODQ5NDMuODcwMTM2MDAyODYxNTUwNDYgNjUuMDg0NzA5Mzc0OTA4Mjc1ODI2OTQyMDc2NDgwMzI2IC0+IDMwOTU5MDkxMjgwNzk3ODQuMzM0ODU5MTQ3Mjk5OTQ2OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMjk4IHBvd2VyIDQ3NTY3MzgwMzg0OTQzLjg3MDEzNjAwMjg2MTU1MDQ2IDY1IC0+IDEuMDU5NDk4Mjg3Njc2MzIxNDMwMTA0MjQzNzQ4MjYzNEUrODg5IEluZXhhY3QgUm91bmRlZAorcmVteDMyOTggcmVtYWluZGVyIDQ3NTY3MzgwMzg0OTQzLjg3MDEzNjAwMjg2MTU1MDQ2IDY1LjA4NDcwOTM3NDkwODI3NTgyNjk0MjA3NjQ4MDMyNiAtPiA1Ni4xMzQwNTg2ODc3NzA4NzgxMjY0MzA4NDQ5NTU1MjAKK3N1YngzMjk4IHN1YnRyYWN0IDQ3NTY3MzgwMzg0OTQzLjg3MDEzNjAwMjg2MTU1MDQ2IDY1LjA4NDcwOTM3NDkwODI3NTgyNjk0MjA3NjQ4MDMyNiAtPiA0NzU2NzM4MDM4NDg3OC43ODU0MjY2Mjc5NTMyNzQ2MzMgSW5leGFjdCBSb3VuZGVkCithZGR4MzI5OSBhZGQgLTI5NjYxNTU0NC4wNTg5Nzk4NDU0NTEyNzExNTI5MDI1MSAtNTQxNjExNS40MzE1MDUzNTM2MDE0MDE2NDUwOTczMjY0IC0+IC0zMDIwMzE2NTkuNDkwNDg1MTk5MDUyNjcyNzk3OTk5ODQgSW5leGFjdCBSb3VuZGVkCitjb214MzI5OSBjb21wYXJlIC0yOTY2MTU1NDQuMDU4OTc5ODQ1NDUxMjcxMTUyOTAyNTEgLTU0MTYxMTUuNDMxNTA1MzUzNjAxNDAxNjQ1MDk3MzI2NCAtPiAtMQorZGl2eDMyOTkgZGl2aWRlIC0yOTY2MTU1NDQuMDU4OTc5ODQ1NDUxMjcxMTUyOTAyNTEgLTU0MTYxMTUuNDMxNTA1MzUzNjAxNDAxNjQ1MDk3MzI2NCAtPiA1NC43NjUzNjYwMjg0OTY2NjQ1MzA2ODgyNTkyNzI1OTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzI5OSBkaXZpZGVpbnQgLTI5NjYxNTU0NC4wNTg5Nzk4NDU0NTEyNzExNTI5MDI1MSAtNTQxNjExNS40MzE1MDUzNTM2MDE0MDE2NDUwOTczMjY0IC0+IDU0CittdWx4MzI5OSBtdWx0aXBseSAtMjk2NjE1NTQ0LjA1ODk3OTg0NTQ1MTI3MTE1MjkwMjUxIC01NDE2MTE1LjQzMTUwNTM1MzYwMTQwMTY0NTA5NzMyNjQgLT4gMTYwNjUwNDAyNTQwMjE5Ni44NDg0ODg1Mzg2NTAxNDc4IEluZXhhY3QgUm91bmRlZAorcG93eDMyOTkgcG93ZXIgLTI5NjYxNTU0NC4wNTg5Nzk4NDU0NTEyNzExNTI5MDI1MSAtNTQxNjExNSAtPiAtMEUtMTAwMzAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDMyOTkgcmVtYWluZGVyIC0yOTY2MTU1NDQuMDU4OTc5ODQ1NDUxMjcxMTUyOTAyNTEgLTU0MTYxMTUuNDMxNTA1MzUzNjAxNDAxNjQ1MDk3MzI2NCAtPiAtNDE0NTMxMC43NTc2OTA3NTA5NzU1ODIzMTc2NDY4ODQ0CitzdWJ4MzI5OSBzdWJ0cmFjdCAtMjk2NjE1NTQ0LjA1ODk3OTg0NTQ1MTI3MTE1MjkwMjUxIC01NDE2MTE1LjQzMTUwNTM1MzYwMTQwMTY0NTA5NzMyNjQgLT4gLTI5MTE5OTQyOC42Mjc0NzQ0OTE4NDk4Njk1MDc4MDUxOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzMzAwIGFkZCA2MTM5MTcwNTkxNC4wNDY3MDcxODA2NTIxODUyNDc1ODRFKzczOSAtNjc1OTgyMDg3NzIxLjkxODU2NDU2MTI1MjQyMjk3MzQ2IC0+IDYuMTM5MTcwNTkxNDA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzQ5IEluZXhhY3QgUm91bmRlZAorY29teDMzMDAgY29tcGFyZSA2MTM5MTcwNTkxNC4wNDY3MDcxODA2NTIxODUyNDc1ODRFKzczOSAtNjc1OTgyMDg3NzIxLjkxODU2NDU2MTI1MjQyMjk3MzQ2IC0+IDEKK2RpdngzMzAwIGRpdmlkZSA2MTM5MTcwNTkxNC4wNDY3MDcxODA2NTIxODUyNDc1ODRFKzczOSAtNjc1OTgyMDg3NzIxLjkxODU2NDU2MTI1MjQyMjk3MzQ2IC0+IC05LjA4MTg1Mzk0Njg5MDYyNDg1OTM2OTk3MDAwNDAwNjhFKzczNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzMzAwIGRpdmlkZWludCA2MTM5MTcwNTkxNC4wNDY3MDcxODA2NTIxODUyNDc1ODRFKzczOSAtNjc1OTgyMDg3NzIxLjkxODU2NDU2MTI1MjQyMjk3MzQ2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzMwMCBtdWx0aXBseSA2MTM5MTcwNTkxNC4wNDY3MDcxODA2NTIxODUyNDc1ODRFKzczOSAtNjc1OTgyMDg3NzIxLjkxODU2NDU2MTI1MjQyMjk3MzQ2IC0+IC00LjE0OTk2OTM1MzI1ODczNDc5NDQ4OTAzMDAxNzYyOTBFKzc2MSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzMzAwIHBvd2VyIDYxMzkxNzA1OTE0LjA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzM5IC03IC0+IDMuMDQyNTEwNTI5MTIxMDk0NzQ3MzQyMDk5OTg5MDEyNEUtNTI0OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzMzAwIHJlbWFpbmRlciA2MTM5MTcwNTkxNC4wNDY3MDcxODA2NTIxODUyNDc1ODRFKzczOSAtNjc1OTgyMDg3NzIxLjkxODU2NDU2MTI1MjQyMjk3MzQ2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzMwMCBzdWJ0cmFjdCA2MTM5MTcwNTkxNC4wNDY3MDcxODA2NTIxODUyNDc1ODRFKzczOSAtNjc1OTgyMDg3NzIxLjkxODU2NDU2MTI1MjQyMjk3MzQ2IC0+IDYuMTM5MTcwNTkxNDA0NjcwNzE4MDY1MjE4NTI0NzU4NEUrNzQ5IEluZXhhY3QgUm91bmRlZAorCistLSByYW5kb21seSBnZW5lcmF0ZWQgdGVzdGNhc2VzIFsyNiBTZXAgMjAwMV0KK3ByZWNpc2lvbjogMzMKK3JvdW5kaW5nOiBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5OQorCithZGR4MzQwMSBhZGQgMDQyLjY2ODA1NjgzMDQ4NTU3MTQyODg3NzIxMjk0NDQxOCAtMDEzNjQxMTIzNzQ2MzkuNDk0MTEyNDAxNjQ1NTMyMTA3MSAtPiAtMTM2NDExMjM3NDU5Ni44MjYwNTU1NzExNTk5NjA2NzgyMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDAxIGNvbXBhcmUgMDQyLjY2ODA1NjgzMDQ4NTU3MTQyODg3NzIxMjk0NDQxOCAtMDEzNjQxMTIzNzQ2MzkuNDk0MTEyNDAxNjQ1NTMyMTA3MSAtPiAxCitkaXZ4MzQwMSBkaXZpZGUgMDQyLjY2ODA1NjgzMDQ4NTU3MTQyODg3NzIxMjk0NDQxOCAtMDEzNjQxMTIzNzQ2MzkuNDk0MTEyNDAxNjQ1NTMyMTA3MSAtPiAtMy4xMjc4OTg5NjM3MzE3Njk2MzE2MDgxMTE1MDU5Mzg2N0UtMTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzQwMSBkaXZpZGVpbnQgMDQyLjY2ODA1NjgzMDQ4NTU3MTQyODg3NzIxMjk0NDQxOCAtMDEzNjQxMTIzNzQ2MzkuNDk0MTEyNDAxNjQ1NTMyMTA3MSAtPiAtMAorbXVseDM0MDEgbXVsdGlwbHkgMDQyLjY2ODA1NjgzMDQ4NTU3MTQyODg3NzIxMjk0NDQxOCAtMDEzNjQxMTIzNzQ2MzkuNDk0MTEyNDAxNjQ1NTMyMTA3MSAtPiAtNTgyMDQwMjQzMjQyODYuNTU5NTQ1MzA2NjA2NTIzNDkyMyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDAxIHBvd2VyIDA0Mi42NjgwNTY4MzA0ODU1NzE0Mjg4NzcyMTI5NDQ0MTggLTEgLT4gMC4wMjM0MzY3MzYzODUwODY5NzQ0NTIzNDE3MjI3MTQ4OTA5IEluZXhhY3QgUm91bmRlZAorcmVteDM0MDEgcmVtYWluZGVyIDA0Mi42NjgwNTY4MzA0ODU1NzE0Mjg4NzcyMTI5NDQ0MTggLTAxMzY0MTEyMzc0NjM5LjQ5NDExMjQwMTY0NTUzMjEwNzEgLT4gNDIuNjY4MDU2ODMwNDg1NTcxNDI4ODc3MjEyOTQ0NDE4CitzdWJ4MzQwMSBzdWJ0cmFjdCAwNDIuNjY4MDU2ODMwNDg1NTcxNDI4ODc3MjEyOTQ0NDE4IC0wMTM2NDExMjM3NDYzOS40OTQxMTI0MDE2NDU1MzIxMDcxIC0+IDEzNjQxMTIzNzQ2ODIuMTYyMTY5MjMyMTMxMTAzNTM1OTggSW5leGFjdCBSb3VuZGVkCithZGR4MzQwMiBhZGQgLTMyNy4xNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1MyA3NTkwNjc0NTcuMTA3NTE4NjYzNDQ0ODk5MzU2NzYwNzkzIC0+IC0zLjI3MTc5NDI2MzQxNjUzMjU2MzYzNTMxODA5MjI3MzQ0RSs0NTUgSW5leGFjdCBSb3VuZGVkCitjb214MzQwMiBjb21wYXJlIC0zMjcuMTc5NDI2MzQxNjUzMjU2MzYzNTMxODA5MjI3MzQ0RSs0NTMgNzU5MDY3NDU3LjEwNzUxODY2MzQ0NDg5OTM1Njc2MDc5MyAtPiAtMQorZGl2eDM0MDIgZGl2aWRlIC0zMjcuMTc5NDI2MzQxNjUzMjU2MzYzNTMxODA5MjI3MzQ0RSs0NTMgNzU5MDY3NDU3LjEwNzUxODY2MzQ0NDg5OTM1Njc2MDc5MyAtPiAtNC4zMTAyODEyOTY4NDgwMzA4MzI1NTcwNDY4MDYxMTU4OUUrNDQ2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MDIgZGl2aWRlaW50IC0zMjcuMTc5NDI2MzQxNjUzMjU2MzYzNTMxODA5MjI3MzQ0RSs0NTMgNzU5MDY3NDU3LjEwNzUxODY2MzQ0NDg5OTM1Njc2MDc5MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MDIgbXVsdGlwbHkgLTMyNy4xNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1MyA3NTkwNjc0NTcuMTA3NTE4NjYzNDQ0ODk5MzU2NzYwNzkzIC0+IC0yLjQ4MzUxMjU1MTcxMDU1NDQ1MTEwNTU4NjEzNjI3Mzc5RSs0NjQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQwMiBwb3dlciAtMzI3LjE3OTQyNjM0MTY1MzI1NjM2MzUzMTgwOTIyNzM0NEUrNDUzIDc1OTA2NzQ1NyAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQwMiByZW1haW5kZXIgLTMyNy4xNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1MyA3NTkwNjc0NTcuMTA3NTE4NjYzNDQ0ODk5MzU2NzYwNzkzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQwMiBzdWJ0cmFjdCAtMzI3LjE3OTQyNjM0MTY1MzI1NjM2MzUzMTgwOTIyNzM0NEUrNDUzIDc1OTA2NzQ1Ny4xMDc1MTg2NjM0NDQ4OTkzNTY3NjA3OTMgLT4gLTMuMjcxNzk0MjYzNDE2NTMyNTYzNjM1MzE4MDkyMjczNDRFKzQ1NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDAzIGFkZCA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3My4yNDU4MDk2MjgwNzY3OTA3NTcyMTczMjggLT4gOTAwMTgxMTk0LjgyNjExOTI0NjYxOTA2OTUyNzQ3MTE3NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDAzIGNvbXBhcmUgODE3MjEuNTgwMzA5NjE4NTQyMjc4NzcwMjUzODQ5MzQ3MSA5MDAwOTk0NzMuMjQ1ODA5NjI4MDc2NzkwNzU3MjE3MzI4IC0+IC0xCitkaXZ4MzQwMyBkaXZpZGUgODE3MjEuNTgwMzA5NjE4NTQyMjc4NzcwMjUzODQ5MzQ3MSA5MDAwOTk0NzMuMjQ1ODA5NjI4MDc2NzkwNzU3MjE3MzI4IC0+IDAuMDAwMDkwNzkxNzIxMDY5MzY3OTIyMDYxMDUxMTMxOTgxMjgyNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDAzIGRpdmlkZWludCA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3My4yNDU4MDk2MjgwNzY3OTA3NTcyMTczMjggLT4gMAorbXVseDM0MDMgbXVsdGlwbHkgODE3MjEuNTgwMzA5NjE4NTQyMjc4NzcwMjUzODQ5MzQ3MSA5MDAwOTk0NzMuMjQ1ODA5NjI4MDc2NzkwNzU3MjE3MzI4IC0+IDczNTU3NTUxMzg5NTAyLjc3Nzk5NzkwNDI0NTMxMDI5MjYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQwMyBwb3dlciA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3MyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDAzIHJlbWFpbmRlciA4MTcyMS41ODAzMDk2MTg1NDIyNzg3NzAyNTM4NDkzNDcxIDkwMDA5OTQ3My4yNDU4MDk2MjgwNzY3OTA3NTcyMTczMjggLT4gODE3MjEuNTgwMzA5NjE4NTQyMjc4NzcwMjUzODQ5MzQ3MQorc3VieDM0MDMgc3VidHJhY3QgODE3MjEuNTgwMzA5NjE4NTQyMjc4NzcwMjUzODQ5MzQ3MSA5MDAwOTk0NzMuMjQ1ODA5NjI4MDc2NzkwNzU3MjE3MzI4IC0+IC05MDAwMTc3NTEuNjY1NTAwMDA5NTM0NTExOTg2OTYzNDc5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MDQgYWRkIDM5OTEuNTY3MzQ2MzUxODM0MDM4MTQ2MzYzNTQzOTIxNjNFLTgwNyA3Mi4zMjM5ODIyMjU1ODcxMzA1NzMxMzE0NTY1MDY5MTMyIC0+IDcyLjMyMzk4MjIyNTU4NzEzMDU3MzEzMTQ1NjUwNjkxMzIgSW5leGFjdCBSb3VuZGVkCitjb214MzQwNCBjb21wYXJlIDM5OTEuNTY3MzQ2MzUxODM0MDM4MTQ2MzYzNTQzOTIxNjNFLTgwNyA3Mi4zMjM5ODIyMjU1ODcxMzA1NzMxMzE0NTY1MDY5MTMyIC0+IC0xCitkaXZ4MzQwNCBkaXZpZGUgMzk5MS41NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA3IDcyLjMyMzk4MjIyNTU4NzEzMDU3MzEzMTQ1NjUwNjkxMzIgLT4gNS41MTkwMDkzNTY5NTM5MDY2NDk4NDU5ODI0ODExNTI5MEUtODA2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MDQgZGl2aWRlaW50IDM5OTEuNTY3MzQ2MzUxODM0MDM4MTQ2MzYzNTQzOTIxNjNFLTgwNyA3Mi4zMjM5ODIyMjU1ODcxMzA1NzMxMzE0NTY1MDY5MTMyIC0+IDAKK211bHgzNDA0IG11bHRpcGx5IDM5OTEuNTY3MzQ2MzUxODM0MDM4MTQ2MzYzNTQzOTIxNjNFLTgwNyA3Mi4zMjM5ODIyMjU1ODcxMzA1NzMxMzE0NTY1MDY5MTMyIC0+IDIuODg2ODYwNDU4MDk3ODQwMzQ3OTQ4MDM5MjgxNzc4NTRFLTgwMiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDA0IHBvd2VyIDM5OTEuNTY3MzQ2MzUxODM0MDM4MTQ2MzYzNTQzOTIxNjNFLTgwNyA3MiAtPiAwRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQwNCByZW1haW5kZXIgMzk5MS41NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA3IDcyLjMyMzk4MjIyNTU4NzEzMDU3MzEzMTQ1NjUwNjkxMzIgLT4gMy45OTE1NjczNDYzNTE4MzQwMzgxNDYzNjM1NDM5MjE2M0UtODA0CitzdWJ4MzQwNCBzdWJ0cmFjdCAzOTkxLjU2NzM0NjM1MTgzNDAzODE0NjM2MzU0MzkyMTYzRS04MDcgNzIuMzIzOTgyMjI1NTg3MTMwNTczMTMxNDU2NTA2OTEzMiAtPiAtNzIuMzIzOTgyMjI1NTg3MTMwNTczMTMxNDU2NTA2OTEzMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDA1IGFkZCAtNjYuMzM5MzMwODU5NTk1NzcyNjQ1NjQxNjk3OTE2MzMwNiA1LjA4NDg2NTczMDUwNDU5MjEzODY0Njg0NTg5NjYyNTU5IC0+IC02MS4yNTQ0NjUxMjkwOTExODA1MDY5OTQ4NTIwMTk3MDUwIEluZXhhY3QgUm91bmRlZAorY29teDM0MDUgY29tcGFyZSAtNjYuMzM5MzMwODU5NTk1NzcyNjQ1NjQxNjk3OTE2MzMwNiA1LjA4NDg2NTczMDUwNDU5MjEzODY0Njg0NTg5NjYyNTU5IC0+IC0xCitkaXZ4MzQwNSBkaXZpZGUgLTY2LjMzOTMzMDg1OTU5NTc3MjY0NTY0MTY5NzkxNjMzMDYgNS4wODQ4NjU3MzA1MDQ1OTIxMzg2NDY4NDU4OTY2MjU1OSAtPiAtMTMuMDQ2NDI3MjU2MDA3OTI3NjY5NDc0OTkyNDkxNTg1MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDA1IGRpdmlkZWludCAtNjYuMzM5MzMwODU5NTk1NzcyNjQ1NjQxNjk3OTE2MzMwNiA1LjA4NDg2NTczMDUwNDU5MjEzODY0Njg0NTg5NjYyNTU5IC0+IC0xMworbXVseDM0MDUgbXVsdGlwbHkgLTY2LjMzOTMzMDg1OTU5NTc3MjY0NTY0MTY5NzkxNjMzMDYgNS4wODQ4NjU3MzA1MDQ1OTIxMzg2NDY4NDU4OTY2MjU1OSAtPiAtMzM3LjMyNjU5MDA3MjU2NDI5MDgxMzUzOTAzNjI4MDIwNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDA1IHBvd2VyIC02Ni4zMzkzMzA4NTk1OTU3NzI2NDU2NDE2OTc5MTYzMzA2IDUgLT4gLTEyODQ4NTg4ODguMjcyODU4MjIyNTkxODQ4OTY2Njc5OTAgSW5leGFjdCBSb3VuZGVkCityZW14MzQwNSByZW1haW5kZXIgLTY2LjMzOTMzMDg1OTU5NTc3MjY0NTY0MTY5NzkxNjMzMDYgNS4wODQ4NjU3MzA1MDQ1OTIxMzg2NDY4NDU4OTY2MjU1OSAtPiAtMC4yMzYwNzYzNjMwMzYwNzQ4NDMyMzI3MDEyNjAxOTc5Mworc3VieDM0MDUgc3VidHJhY3QgLTY2LjMzOTMzMDg1OTU5NTc3MjY0NTY0MTY5NzkxNjMzMDYgNS4wODQ4NjU3MzA1MDQ1OTIxMzg2NDY4NDU4OTY2MjU1OSAtPiAtNzEuNDI0MTk2NTkwMTAwMzY0Nzg0Mjg4NTQzODEyOTU2MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDA2IGFkZCAtMzkzNjA2Ljg3MzcwMzU2Nzc1MzI1NTA5NzA5NTIwODExMkUrMTExIC0yMTI0MzM5NTUwLjg2ODkxMDkzMjAwNzU4MDk1NjYwNTU3IC0+IC0zLjkzNjA2ODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTYgSW5leGFjdCBSb3VuZGVkCitjb214MzQwNiBjb21wYXJlIC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIxMjQzMzk1NTAuODY4OTEwOTMyMDA3NTgwOTU2NjA1NTcgLT4gLTEKK2RpdngzNDA2IGRpdmlkZSAtMzkzNjA2Ljg3MzcwMzU2Nzc1MzI1NTA5NzA5NTIwODExMkUrMTExIC0yMTI0MzM5NTUwLjg2ODkxMDkzMjAwNzU4MDk1NjYwNTU3IC0+IDEuODUyODQzNTAzOTYxMzcwNzUwMTA0Mjg3MzY1NjQ3MzdFKzEwNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDA2IGRpdmlkZWludCAtMzkzNjA2Ljg3MzcwMzU2Nzc1MzI1NTA5NzA5NTIwODExMkUrMTExIC0yMTI0MzM5NTUwLjg2ODkxMDkzMjAwNzU4MDk1NjYwNTU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQwNiBtdWx0aXBseSAtMzkzNjA2Ljg3MzcwMzU2Nzc1MzI1NTA5NzA5NTIwODExMkUrMTExIC0yMTI0MzM5NTUwLjg2ODkxMDkzMjAwNzU4MDk1NjYwNTU3IC0+IDguMzYxNTQ2NDkzMDIzNTMyNjk4MTg4MDEyNjMyNzU5NDFFKzEyNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDA2IHBvd2VyIC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIgLT4gNi40NTQ2NzkwNDEyMzEwMzU2MDUyODkxOTc0NzY4ODQ0M0UtMjM0IEluZXhhY3QgUm91bmRlZAorcmVteDM0MDYgcmVtYWluZGVyIC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIxMjQzMzk1NTAuODY4OTEwOTMyMDA3NTgwOTU2NjA1NTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDA2IHN1YnRyYWN0IC0zOTM2MDYuODczNzAzNTY3NzUzMjU1MDk3MDk1MjA4MTEyRSsxMTEgLTIxMjQzMzk1NTAuODY4OTEwOTMyMDA3NTgwOTU2NjA1NTcgLT4gLTMuOTM2MDY4NzM3MDM1Njc3NTMyNTUwOTcwOTUyMDgxMTJFKzExNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDA3IGFkZCAtMDE5MTMzNTk4LjYwOTgxMjUyNDYyMjE1MDQyMTU4NDM0NiAtODU4NDM5ODQ2LjYyODM2NzczNDY0MjYyMjkyMjAzMDA1MSAtPiAtODc3NTczNDQ1LjIzODE4MDI1OTI2NDc3MzM0MzYxNDM5NworY29teDM0MDcgY29tcGFyZSAtMDE5MTMzNTk4LjYwOTgxMjUyNDYyMjE1MDQyMTU4NDM0NiAtODU4NDM5ODQ2LjYyODM2NzczNDY0MjYyMjkyMjAzMDA1MSAtPiAxCitkaXZ4MzQwNyBkaXZpZGUgLTAxOTEzMzU5OC42MDk4MTI1MjQ2MjIxNTA0MjE1ODQzNDYgLTg1ODQzOTg0Ni42MjgzNjc3MzQ2NDI2MjI5MjIwMzAwNTEgLT4gMC4wMjIyODg4MDUzMDc2MzEyNTY1Nzk3NDYwNjUwMzExMDcwIEluZXhhY3QgUm91bmRlZAorZHZpeDM0MDcgZGl2aWRlaW50IC0wMTkxMzM1OTguNjA5ODEyNTI0NjIyMTUwNDIxNTg0MzQ2IC04NTg0Mzk4NDYuNjI4MzY3NzM0NjQyNjIyOTIyMDMwMDUxIC0+IDAKK211bHgzNDA3IG11bHRpcGx5IC0wMTkxMzM1OTguNjA5ODEyNTI0NjIyMTUwNDIxNTg0MzQ2IC04NTg0Mzk4NDYuNjI4MzY3NzM0NjQyNjIyOTIyMDMwMDUxIC0+IDE2NDI1MDQzNDU2MDU2MjEzLjczOTUxOTE1MTQwMjkyODggSW5leGFjdCBSb3VuZGVkCitwb3d4MzQwNyBwb3dlciAtMDE5MTMzNTk4LjYwOTgxMjUyNDYyMjE1MDQyMTU4NDM0NiAtODU4NDM5ODQ3IC0+IC0wRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQwNyByZW1haW5kZXIgLTAxOTEzMzU5OC42MDk4MTI1MjQ2MjIxNTA0MjE1ODQzNDYgLTg1ODQzOTg0Ni42MjgzNjc3MzQ2NDI2MjI5MjIwMzAwNTEgLT4gLTE5MTMzNTk4LjYwOTgxMjUyNDYyMjE1MDQyMTU4NDM0Ngorc3VieDM0MDcgc3VidHJhY3QgLTAxOTEzMzU5OC42MDk4MTI1MjQ2MjIxNTA0MjE1ODQzNDYgLTg1ODQzOTg0Ni42MjgzNjc3MzQ2NDI2MjI5MjIwMzAwNTEgLT4gODM5MzA2MjQ4LjAxODU1NTIxMDAyMDQ3MjUwMDQ0NTcwNQorYWRkeDM0MDggYWRkIDQ2NS4zNTE5ODIxNTkwNDY1MjU3NjI3MTU1NDk3NjE4MTQgMjQwNDQ0Ljk3NTk0NDY2NjkyNDY1NzYyOTE3Mjg0NDc4MCAtPiAyNDA5MTAuMzI3OTI2ODI1OTcxMTgzMzkxODg4Mzk0NTQyIEluZXhhY3QgUm91bmRlZAorY29teDM0MDggY29tcGFyZSA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0IDI0MDQ0NC45NzU5NDQ2NjY5MjQ2NTc2MjkxNzI4NDQ3ODAgLT4gLTEKK2RpdngzNDA4IGRpdmlkZSA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0IDI0MDQ0NC45NzU5NDQ2NjY5MjQ2NTc2MjkxNzI4NDQ3ODAgLT4gMC4wMDE5MzUzNzgyNzI0MzMyNjEyMjc4Mjk3NDEzMjgyOTA5NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDA4IGRpdmlkZWludCA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0IDI0MDQ0NC45NzU5NDQ2NjY5MjQ2NTc2MjkxNzI4NDQ3ODAgLT4gMAorbXVseDM0MDggbXVsdGlwbHkgNDY1LjM1MTk4MjE1OTA0NjUyNTc2MjcxNTU0OTc2MTgxNCAyNDA0NDQuOTc1OTQ0NjY2OTI0NjU3NjI5MTcyODQ0NzgwIC0+IDExMTg5MTU0Ni4xNTYwMzUwMTM3ODAzNzEzOTU2Njg2NzQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQwOCBwb3dlciA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0IDI0MDQ0NSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDA4IHJlbWFpbmRlciA0NjUuMzUxOTgyMTU5MDQ2NTI1NzYyNzE1NTQ5NzYxODE0IDI0MDQ0NC45NzU5NDQ2NjY5MjQ2NTc2MjkxNzI4NDQ3ODAgLT4gNDY1LjM1MTk4MjE1OTA0NjUyNTc2MjcxNTU0OTc2MTgxNAorc3VieDM0MDggc3VidHJhY3QgNDY1LjM1MTk4MjE1OTA0NjUyNTc2MjcxNTU0OTc2MTgxNCAyNDA0NDQuOTc1OTQ0NjY2OTI0NjU3NjI5MTcyODQ0NzgwIC0+IC0yMzk5NzkuNjIzOTYyNTA3ODc4MTMxODY2NDU3Mjk1MDE4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MDkgYWRkIDI4MDY2OTU1MDA0NzgzLjEwNzY4MjQyMjI4NzMzODQ4MjggNTcxNjk5OTY5LjIyMDc1MzUzNTc1ODUwNDkwNzU2MTAxNkUtNzE4IC0+IDI4MDY2OTU1MDA0NzgzLjEwNzY4MjQyMjI4NzMzODQ4MjggSW5leGFjdCBSb3VuZGVkCitjb214MzQwOSBjb21wYXJlIDI4MDY2OTU1MDA0NzgzLjEwNzY4MjQyMjI4NzMzODQ4MjggNTcxNjk5OTY5LjIyMDc1MzUzNTc1ODUwNDkwNzU2MTAxNkUtNzE4IC0+IDEKK2RpdngzNDA5IGRpdmlkZSAyODA2Njk1NTAwNDc4My4xMDc2ODI0MjIyODczMzg0ODI4IDU3MTY5OTk2OS4yMjA3NTM1MzU3NTg1MDQ5MDc1NjEwMTZFLTcxOCAtPiA0LjkwOTM4NTQzMjE5NDMyMzkwMDEzNjU2OTY4MTIzODE1RSs3MjIgSW5leGFjdCBSb3VuZGVkCitkdml4MzQwOSBkaXZpZGVpbnQgMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCA1NzE2OTk5NjkuMjIwNzUzNTM1NzU4NTA0OTA3NTYxMDE2RS03MTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDA5IG11bHRpcGx5IDI4MDY2OTU1MDA0NzgzLjEwNzY4MjQyMjI4NzMzODQ4MjggNTcxNjk5OTY5LjIyMDc1MzUzNTc1ODUwNDkwNzU2MTAxNkUtNzE4IC0+IDEuNjA0NTg3NzMxMjM1NDc3NzA2OTA0NTIxOTU1NjkyMjNFLTY5NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDA5IHBvd2VyIDI4MDY2OTU1MDA0NzgzLjEwNzY4MjQyMjI4NzMzODQ4MjggNiAtPiA0Ljg4ODQ1Njg5OTM4OTUxNTgzMDIwMTcxMzI1NTY4MjE4RSs4MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDA5IHJlbWFpbmRlciAyODA2Njk1NTAwNDc4My4xMDc2ODI0MjIyODczMzg0ODI4IDU3MTY5OTk2OS4yMjA3NTM1MzU3NTg1MDQ5MDc1NjEwMTZFLTcxOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0MDkgc3VidHJhY3QgMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCA1NzE2OTk5NjkuMjIwNzUzNTM1NzU4NTA0OTA3NTYxMDE2RS03MTggLT4gMjgwNjY5NTUwMDQ3ODMuMTA3NjgyNDIyMjg3MzM4NDgyOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDEwIGFkZCAyODI3NTIzNjkyNzM5Mi40OTYwOTAyODI0MTA1MjQ2MDQ3IDI4MjEyMDM4LjQ4MjUyNDMxMjcwOTY2MTMxNTg0MTkyNzBFKzQyMiAtPiAyLjgyMTIwMzg0ODI1MjQzMTI3MDk2NjEzMTU4NDE5MjcwRSs0MjkgSW5leGFjdCBSb3VuZGVkCitjb214MzQxMCBjb21wYXJlIDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcgMjgyMTIwMzguNDgyNTI0MzEyNzA5NjYxMzE1ODQxOTI3MEUrNDIyIC0+IC0xCitkaXZ4MzQxMCBkaXZpZGUgMjgyNzUyMzY5MjczOTIuNDk2MDkwMjgyNDEwNTI0NjA0NyAyODIxMjAzOC40ODI1MjQzMTI3MDk2NjEzMTU4NDE5MjcwRSs0MjIgLT4gMS4wMDIyNDAxMjMzMDQzNTkyNzQ2NzU1OTIwMzY4ODg2MUUtNDE2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MTAgZGl2aWRlaW50IDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcgMjgyMTIwMzguNDgyNTI0MzEyNzA5NjYxMzE1ODQxOTI3MEUrNDIyIC0+IDAKK211bHgzNDEwIG11bHRpcGx5IDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcgMjgyMTIwMzguNDgyNTI0MzEyNzA5NjYxMzE1ODQxOTI3MEUrNDIyIC0+IDcuOTc3MDIwNzIyOTgwODk2MDU3MDY3OTg3NzAwMTM1NjFFKzQ0MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDEwIHBvd2VyIDI4Mjc1MjM2OTI3MzkyLjQ5NjA5MDI4MjQxMDUyNDYwNDcgMyAtPiAyLjI2MDU3NDE1NTQ2NjIyMTYxMzQ3MzIyMDYxMjgxNTE2RSs0MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDEwIHJlbWFpbmRlciAyODI3NTIzNjkyNzM5Mi40OTYwOTAyODI0MTA1MjQ2MDQ3IDI4MjEyMDM4LjQ4MjUyNDMxMjcwOTY2MTMxNTg0MTkyNzBFKzQyMiAtPiAyODI3NTIzNjkyNzM5Mi40OTYwOTAyODI0MTA1MjQ2MDQ3CitzdWJ4MzQxMCBzdWJ0cmFjdCAyODI3NTIzNjkyNzM5Mi40OTYwOTAyODI0MTA1MjQ2MDQ3IDI4MjEyMDM4LjQ4MjUyNDMxMjcwOTY2MTMxNTg0MTkyNzBFKzQyMiAtPiAtMi44MjEyMDM4NDgyNTI0MzEyNzA5NjYxMzE1ODQxOTI3MEUrNDI5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MTEgYWRkIDExNzkxLjg2NDQyMTE4NzQ2MzAyMzQyNzE4MDE3ODk5OTYgLTguNDU0NTcyNzU5MzAzNjM4NjA5ODIyNjEzNDMxNTk3NDEgLT4gMTE3ODMuNDA5ODQ4NDI4MTU5Mzg0ODE3MzU3NTY1NTY4MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDExIGNvbXBhcmUgMTE3OTEuODY0NDIxMTg3NDYzMDIzNDI3MTgwMTc4OTk5NiAtOC40NTQ1NzI3NTkzMDM2Mzg2MDk4MjI2MTM0MzE1OTc0MSAtPiAxCitkaXZ4MzQxMSBkaXZpZGUgMTE3OTEuODY0NDIxMTg3NDYzMDIzNDI3MTgwMTc4OTk5NiAtOC40NTQ1NzI3NTkzMDM2Mzg2MDk4MjI2MTM0MzE1OTc0MSAtPiAtMTM5NC43MzIxNDc1NDgzNjQxODczMTMzNTc2MTg1ODE1MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDExIGRpdmlkZWludCAxMTc5MS44NjQ0MjExODc0NjMwMjM0MjcxODAxNzg5OTk2IC04LjQ1NDU3Mjc1OTMwMzYzODYwOTgyMjYxMzQzMTU5NzQxIC0+IC0xMzk0CittdWx4MzQxMSBtdWx0aXBseSAxMTc5MS44NjQ0MjExODc0NjMwMjM0MjcxODAxNzg5OTk2IC04LjQ1NDU3Mjc1OTMwMzYzODYwOTgyMjYxMzQzMTU5NzQxIC0+IC05OTY5NS4xNzU3MTY3NzMyOTI2MzAyNTMzMTM4MTg2NzE2IEluZXhhY3QgUm91bmRlZAorcG93eDM0MTEgcG93ZXIgMTE3OTEuODY0NDIxMTg3NDYzMDIzNDI3MTgwMTc4OTk5NiAtOCAtPiAyLjY3NTEwMDk5MzE4NzIzNTE2NTY1MzMyOTI4MjUzNzExRS0zMyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDExIHJlbWFpbmRlciAxMTc5MS44NjQ0MjExODc0NjMwMjM0MjcxODAxNzg5OTk2IC04LjQ1NDU3Mjc1OTMwMzYzODYwOTgyMjYxMzQzMTU5NzQxIC0+IDYuMTg5OTk0NzE4MTkwODAxMzM0NDU3MDU1MzUyODEwNDYKK3N1YngzNDExIHN1YnRyYWN0IDExNzkxLjg2NDQyMTE4NzQ2MzAyMzQyNzE4MDE3ODk5OTYgLTguNDU0NTcyNzU5MzAzNjM4NjA5ODIyNjEzNDMxNTk3NDEgLT4gMTE4MDAuMzE4OTkzOTQ2NzY2NjYyMDM3MDAyNzkyNDMxMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDEyIGFkZCA0NC43MDg1MzQwNzM5NTgxNjY4OTc1NTAyMzQyNzg3NTc4IC05MzM3LjA1NDA4MTMzMDIzOTIwNjQwNDg1NTU2NjQ3OTM3IC0+IC05MjkyLjM0NTU0NzI1NjI4MTAzOTUwNzMwNTMzMjIwMDYxIEluZXhhY3QgUm91bmRlZAorY29teDM0MTIgY29tcGFyZSA0NC43MDg1MzQwNzM5NTgxNjY4OTc1NTAyMzQyNzg3NTc4IC05MzM3LjA1NDA4MTMzMDIzOTIwNjQwNDg1NTU2NjQ3OTM3IC0+IDEKK2RpdngzNDEyIGRpdmlkZSA0NC43MDg1MzQwNzM5NTgxNjY4OTc1NTAyMzQyNzg3NTc4IC05MzM3LjA1NDA4MTMzMDIzOTIwNjQwNDg1NTU2NjQ3OTM3IC0+IC0wLjAwNDc4ODI5MTIxOTUzNTEyMjgxNTI3MjQyNjMxNzc1NjEzIEluZXhhY3QgUm91bmRlZAorZHZpeDM0MTIgZGl2aWRlaW50IDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcuMDU0MDgxMzMwMjM5MjA2NDA0ODU1NTY2NDc5MzcgLT4gLTAKK211bHgzNDEyIG11bHRpcGx5IDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcuMDU0MDgxMzMwMjM5MjA2NDA0ODU1NTY2NDc5MzcgLT4gLTQxNzQ0Ni4wMDA1NDU1NDMxNjg4NjYxNTg5MTMwNzc0MTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQxMiBwb3dlciA0NC43MDg1MzQwNzM5NTgxNjY4OTc1NTAyMzQyNzg3NTc4IC05MzM3IC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDEyIHJlbWFpbmRlciA0NC43MDg1MzQwNzM5NTgxNjY4OTc1NTAyMzQyNzg3NTc4IC05MzM3LjA1NDA4MTMzMDIzOTIwNjQwNDg1NTU2NjQ3OTM3IC0+IDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzgKK3N1YngzNDEyIHN1YnRyYWN0IDQ0LjcwODUzNDA3Mzk1ODE2Njg5NzU1MDIzNDI3ODc1NzggLTkzMzcuMDU0MDgxMzMwMjM5MjA2NDA0ODU1NTY2NDc5MzcgLT4gOTM4MS43NjI2MTU0MDQxOTczNzMzMDI0MDU4MDA3NTgxMyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDEzIGFkZCA5MzM1NDUyNzQyODgwNC41NDU4MDUzMjk1NTgxOTY1ODY3RSs1NzYgLTg1NjUyNTkwOTg1Mi4zMTg3OTAzMjEzMDA5NDE2MTUzMTQgLT4gOS4zMzU0NTI3NDI4ODA0NTQ1ODA1MzI5NTU4MTk2NTg2N0UrNTg5IEluZXhhY3QgUm91bmRlZAorY29teDM0MTMgY29tcGFyZSA5MzM1NDUyNzQyODgwNC41NDU4MDUzMjk1NTgxOTY1ODY3RSs1NzYgLTg1NjUyNTkwOTg1Mi4zMTg3OTAzMjEzMDA5NDE2MTUzMTQgLT4gMQorZGl2eDM0MTMgZGl2aWRlIDkzMzU0NTI3NDI4ODA0LjU0NTgwNTMyOTU1ODE5NjU4NjdFKzU3NiAtODU2NTI1OTA5ODUyLjMxODc5MDMyMTMwMDk0MTYxNTMxNCAtPiAtMS4wODk5MjA2NDc1MjQ4NDQwMDM1MzIzMTA1NjI3MTYxNEUrNTc4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MTMgZGl2aWRlaW50IDkzMzU0NTI3NDI4ODA0LjU0NTgwNTMyOTU1ODE5NjU4NjdFKzU3NiAtODU2NTI1OTA5ODUyLjMxODc5MDMyMTMwMDk0MTYxNTMxNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MTMgbXVsdGlwbHkgOTMzNTQ1Mjc0Mjg4MDQuNTQ1ODA1MzI5NTU4MTk2NTg2N0UrNTc2IC04NTY1MjU5MDk4NTIuMzE4NzkwMzIxMzAwOTQxNjE1MzE0IC0+IC03Ljk5NjA1NzE1NDQ3OTAwNjQyNjgzNzc0MzYwNzMxMjU0RSs2MDEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQxMyBwb3dlciA5MzM1NDUyNzQyODgwNC41NDU4MDUzMjk1NTgxOTY1ODY3RSs1NzYgLTkgLT4gMS44NTY4NzAxNTY5MTc2MzQwNjQ0ODAwNTUyMTIyMTUxOEUtNTMxMCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDEzIHJlbWFpbmRlciA5MzM1NDUyNzQyODgwNC41NDU4MDUzMjk1NTgxOTY1ODY3RSs1NzYgLTg1NjUyNTkwOTg1Mi4zMTg3OTAzMjEzMDA5NDE2MTUzMTQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDEzIHN1YnRyYWN0IDkzMzU0NTI3NDI4ODA0LjU0NTgwNTMyOTU1ODE5NjU4NjdFKzU3NiAtODU2NTI1OTA5ODUyLjMxODc5MDMyMTMwMDk0MTYxNTMxNCAtPiA5LjMzNTQ1Mjc0Mjg4MDQ1NDU4MDUzMjk1NTgxOTY1ODY3RSs1ODkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQxNCBhZGQgLTM2NzM5OTQxNTc5ODgwNDUwMzE3Nzk1MDA0MDQ0MzQ4MiAtNTQ4NDU2ODMuOTY5MTc3NjM5NzI4NTUwNjcxMjgxMjc1NCAtPiAtMzY3Mzk5NDE1Nzk4ODA0NTAzMTc3OTUwMDk1Mjg5MTY2IEluZXhhY3QgUm91bmRlZAorY29teDM0MTQgY29tcGFyZSAtMzY3Mzk5NDE1Nzk4ODA0NTAzMTc3OTUwMDQwNDQzNDgyIC01NDg0NTY4My45NjkxNzc2Mzk3Mjg1NTA2NzEyODEyNzU0IC0+IC0xCitkaXZ4MzQxNCBkaXZpZGUgLTM2NzM5OTQxNTc5ODgwNDUwMzE3Nzk1MDA0MDQ0MzQ4MiAtNTQ4NDU2ODMuOTY5MTc3NjM5NzI4NTUwNjcxMjgxMjc1NCAtPiA2Njk4Nzg0NDY1OTgwNTI5MTQwMDcyMTc0LjMwNDc0NzY5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MTQgZGl2aWRlaW50IC0zNjczOTk0MTU3OTg4MDQ1MDMxNzc5NTAwNDA0NDM0ODIgLTU0ODQ1NjgzLjk2OTE3NzYzOTcyODU1MDY3MTI4MTI3NTQgLT4gNjY5ODc4NDQ2NTk4MDUyOTE0MDA3MjE3NAorbXVseDM0MTQgbXVsdGlwbHkgLTM2NzM5OTQxNTc5ODgwNDUwMzE3Nzk1MDA0MDQ0MzQ4MiAtNTQ4NDU2ODMuOTY5MTc3NjM5NzI4NTUwNjcxMjgxMjc1NCAtPiAyLjAxNTAyNzIyNDkzNjE3MjIyMDE4MDQwNzg5MjkxNDE0RSs0MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDE0IHBvd2VyIC0zNjczOTk0MTU3OTg4MDQ1MDMxNzc5NTAwNDA0NDM0ODIgLTU0ODQ1Njg0IC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDE0IHJlbWFpbmRlciAtMzY3Mzk5NDE1Nzk4ODA0NTAzMTc3OTUwMDQwNDQzNDgyIC01NDg0NTY4My45NjkxNzc2Mzk3Mjg1NTA2NzEyODEyNzU0IC0+IC0xNjcxNDA5NS42NTQ5NjU3MTg5MTc3ODU3ODkyMjkyODA0CitzdWJ4MzQxNCBzdWJ0cmFjdCAtMzY3Mzk5NDE1Nzk4ODA0NTAzMTc3OTUwMDQwNDQzNDgyIC01NDg0NTY4My45NjkxNzc2Mzk3Mjg1NTA2NzEyODEyNzU0IC0+IC0zNjczOTk0MTU3OTg4MDQ1MDMxNzc5NDk5ODU1OTc3OTggSW5leGFjdCBSb3VuZGVkCithZGR4MzQxNSBhZGQgLTIuODcxNTU5MTk3ODEwMjQxMDg1MDM2NzAxNzU0NDM3NDAgODk1Mjk3MzAxMzAuNjQyNzg4MTMzMjc3Njc5NzE5MzgwNyAtPiA4OTUyOTczMDEyNy43NzEyMjg5MzU0Njc0Mzg2MzQzNDQwIEluZXhhY3QgUm91bmRlZAorY29teDM0MTUgY29tcGFyZSAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MCA4OTUyOTczMDEzMC42NDI3ODgxMzMyNzc2Nzk3MTkzODA3IC0+IC0xCitkaXZ4MzQxNSBkaXZpZGUgLTIuODcxNTU5MTk3ODEwMjQxMDg1MDM2NzAxNzU0NDM3NDAgODk1Mjk3MzAxMzAuNjQyNzg4MTMzMjc3Njc5NzE5MzgwNyAtPiAtMy4yMDczODA2MDI2NDQ1NDAxMzE3NDgzNTkyODc1NDQzMEUtMTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzQxNSBkaXZpZGVpbnQgLTIuODcxNTU5MTk3ODEwMjQxMDg1MDM2NzAxNzU0NDM3NDAgODk1Mjk3MzAxMzAuNjQyNzg4MTMzMjc3Njc5NzE5MzgwNyAtPiAtMAorbXVseDM0MTUgbXVsdGlwbHkgLTIuODcxNTU5MTk3ODEwMjQxMDg1MDM2NzAxNzU0NDM3NDAgODk1Mjk3MzAxMzAuNjQyNzg4MTMzMjc3Njc5NzE5MzgwNyAtPiAtMjU3MDg5OTIwMDM0LjExNTk3NTQ2OTkzMTA4NTUyNzY0MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDE1IHBvd2VyIC0yLjg3MTU1OTE5NzgxMDI0MTA4NTAzNjcwMTc1NDQzNzQwIDkgLT4gLTEzMjc1Ljc3NzQ2ODMyNTEzNTQ1MjczMTA4MjA4ODU3MzcgSW5leGFjdCBSb3VuZGVkCityZW14MzQxNSByZW1haW5kZXIgLTIuODcxNTU5MTk3ODEwMjQxMDg1MDM2NzAxNzU0NDM3NDAgODk1Mjk3MzAxMzAuNjQyNzg4MTMzMjc3Njc5NzE5MzgwNyAtPiAtMi44NzE1NTkxOTc4MTAyNDEwODUwMzY3MDE3NTQ0Mzc0MAorc3VieDM0MTUgc3VidHJhY3QgLTIuODcxNTU5MTk3ODEwMjQxMDg1MDM2NzAxNzU0NDM3NDAgODk1Mjk3MzAxMzAuNjQyNzg4MTMzMjc3Njc5NzE5MzgwNyAtPiAtODk1Mjk3MzAxMzMuNTE0MzQ3MzMxMDg3OTIwODA0NDE3NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDE2IGFkZCAtMDEwLjY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNEUrMTg4IDI2NDg0Ljg4ODc3MzE5NzMxNTM3NDU2NjY1MTQyNjA2ODQgLT4gLTEuMDY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNDBFKzE4OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDE2IGNvbXBhcmUgLTAxMC42OTM5MzQzMzgxNzk0Nzk2NTIxNzgwNTcyNzkyMDRFKzE4OCAyNjQ4NC44ODg3NzMxOTczMTUzNzQ1NjY2NTE0MjYwNjg0IC0+IC0xCitkaXZ4MzQxNiBkaXZpZGUgLTAxMC42OTM5MzQzMzgxNzk0Nzk2NTIxNzgwNTcyNzkyMDRFKzE4OCAyNjQ4NC44ODg3NzMxOTczMTUzNzQ1NjY2NTE0MjYwNjg0IC0+IC00LjAzNzc0OTM4NTk4MjU5NTQ3NTc1NzA3NTAzMDg3NjM4RSsxODQgSW5leGFjdCBSb3VuZGVkCitkdml4MzQxNiBkaXZpZGVpbnQgLTAxMC42OTM5MzQzMzgxNzk0Nzk2NTIxNzgwNTcyNzkyMDRFKzE4OCAyNjQ4NC44ODg3NzMxOTczMTUzNzQ1NjY2NTE0MjYwNjg0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQxNiBtdWx0aXBseSAtMDEwLjY5MzkzNDMzODE3OTQ3OTY1MjE3ODA1NzI3OTIwNEUrMTg4IDI2NDg0Ljg4ODc3MzE5NzMxNTM3NDU2NjY1MTQyNjA2ODQgLT4gLTIuODMyMjc2NjE0OTQ1NTg5NjM1NTg0ODE2MzM4ODA2NDdFKzE5MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDE2IHBvd2VyIC0wMTAuNjkzOTM0MzM4MTc5NDc5NjUyMTc4MDU3Mjc5MjA0RSsxODggMjY0ODUgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0MTYgcmVtYWluZGVyIC0wMTAuNjkzOTM0MzM4MTc5NDc5NjUyMTc4MDU3Mjc5MjA0RSsxODggMjY0ODQuODg4NzczMTk3MzE1Mzc0NTY2NjUxNDI2MDY4NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0MTYgc3VidHJhY3QgLTAxMC42OTM5MzQzMzgxNzk0Nzk2NTIxNzgwNTcyNzkyMDRFKzE4OCAyNjQ4NC44ODg3NzMxOTczMTUzNzQ1NjY2NTE0MjYwNjg0IC0+IC0xLjA2OTM5MzQzMzgxNzk0Nzk2NTIxNzgwNTcyNzkyMDQwRSsxODkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQxNyBhZGQgNjExNjU1NTY5NTY4LjgzMjY5ODkxMjc2MjA3NTg4OTE4NiAwMTAxODI3NDMyMTkuNDc1ODM5MDMwNTA1OTY2MDE2OTgyIC0+IDYyMTgzODMxMjc4OC4zMDg1Mzc5NDMyNjgwNDE5MDYxNjgKK2NvbXgzNDE3IGNvbXBhcmUgNjExNjU1NTY5NTY4LjgzMjY5ODkxMjc2MjA3NTg4OTE4NiAwMTAxODI3NDMyMTkuNDc1ODM5MDMwNTA1OTY2MDE2OTgyIC0+IDEKK2RpdngzNDE3IGRpdmlkZSA2MTE2NTU1Njk1NjguODMyNjk4OTEyNzYyMDc1ODg5MTg2IDAxMDE4Mjc0MzIxOS40NzU4MzkwMzA1MDU5NjYwMTY5ODIgLT4gNjAuMDY3ODU3NTg4NjA3NDM2NzA4MTgzNjQzNjgxMjk1OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDE3IGRpdmlkZWludCA2MTE2NTU1Njk1NjguODMyNjk4OTEyNzYyMDc1ODg5MTg2IDAxMDE4Mjc0MzIxOS40NzU4MzkwMzA1MDU5NjYwMTY5ODIgLT4gNjAKK211bHgzNDE3IG11bHRpcGx5IDYxMTY1NTU2OTU2OC44MzI2OTg5MTI3NjIwNzU4ODkxODYgMDEwMTgyNzQzMjE5LjQ3NTgzOTAzMDUwNTk2NjAxNjk4MiAtPiA2MjI4MzMxNjAzNjgxNjYzNTExODI2LjYwNDUwMjgwMzUwIEluZXhhY3QgUm91bmRlZAorcG93eDM0MTcgcG93ZXIgNjExNjU1NTY5NTY4LjgzMjY5ODkxMjc2MjA3NTg4OTE4NiAxIC0+IDYxMTY1NTU2OTU2OC44MzI2OTg5MTI3NjIwNzU4ODkxODYKK3JlbXgzNDE3IHJlbWFpbmRlciA2MTE2NTU1Njk1NjguODMyNjk4OTEyNzYyMDc1ODg5MTg2IDAxMDE4Mjc0MzIxOS40NzU4MzkwMzA1MDU5NjYwMTY5ODIgLT4gNjkwOTc2NDAwLjI4MjM1NzA4MjQwNDExNDg3MDI2Ngorc3VieDM0MTcgc3VidHJhY3QgNjExNjU1NTY5NTY4LjgzMjY5ODkxMjc2MjA3NTg4OTE4NiAwMTAxODI3NDMyMTkuNDc1ODM5MDMwNTA1OTY2MDE2OTgyIC0+IDYwMTQ3MjgyNjM0OS4zNTY4NTk4ODIyNTYxMDk4NzIyMDQKK2FkZHgzNDE4IGFkZCAzNDU3OTQ3LjM5MDYyODYzNjc0ODgyNjcyNTE4MzA0NDQyIC0wMS45OTk1MjE4ODY4OTA4ODQ5MDU2ODY2NTQ5ODExNDI1IC0+IDM0NTc5NDUuMzkxMTA2NzQ5ODU3OTQxODE5NDk2Mzg5NDQgSW5leGFjdCBSb3VuZGVkCitjb214MzQxOCBjb21wYXJlIDM0NTc5NDcuMzkwNjI4NjM2NzQ4ODI2NzI1MTgzMDQ0NDIgLTAxLjk5OTUyMTg4Njg5MDg4NDkwNTY4NjY1NDk4MTE0MjUgLT4gMQorZGl2eDM0MTggZGl2aWRlIDM0NTc5NDcuMzkwNjI4NjM2NzQ4ODI2NzI1MTgzMDQ0NDIgLTAxLjk5OTUyMTg4Njg5MDg4NDkwNTY4NjY1NDk4MTE0MjUgLT4gLTE3MjkzODcuMTE2NjM5OTE4NTI0MjY0MjgyNjMyMzA0NzUgSW5leGFjdCBSb3VuZGVkCitkdml4MzQxOCBkaXZpZGVpbnQgMzQ1Nzk0Ny4zOTA2Mjg2MzY3NDg4MjY3MjUxODMwNDQ0MiAtMDEuOTk5NTIxODg2ODkwODg0OTA1Njg2NjU0OTgxMTQyNSAtPiAtMTcyOTM4NworbXVseDM0MTggbXVsdGlwbHkgMzQ1Nzk0Ny4zOTA2Mjg2MzY3NDg4MjY3MjUxODMwNDQ0MiAtMDEuOTk5NTIxODg2ODkwODg0OTA1Njg2NjU0OTgxMTQyNSAtPiAtNjkxNDI0MS40OTEyNzkxODM2MTI1OTI1Mjk1NjU3NjY1NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDE4IHBvd2VyIDM0NTc5NDcuMzkwNjI4NjM2NzQ4ODI2NzI1MTgzMDQ0NDIgLTIgLT4gOC4zNjMwMjE5NTIyOTcwMTkxMzM3NjgwMjM3MzY1OTUyNkUtMTQgSW5leGFjdCBSb3VuZGVkCityZW14MzQxOCByZW1haW5kZXIgMzQ1Nzk0Ny4zOTA2Mjg2MzY3NDg4MjY3MjUxODMwNDQ0MiAtMDEuOTk5NTIxODg2ODkwODg0OTA1Njg2NjU0OTgxMTQyNSAtPiAwLjIzMzIyNDA2OTk3NDQzNTk5Nzk4NTE3MTMzNTM1MjUKK3N1YngzNDE4IHN1YnRyYWN0IDM0NTc5NDcuMzkwNjI4NjM2NzQ4ODI2NzI1MTgzMDQ0NDIgLTAxLjk5OTUyMTg4Njg5MDg4NDkwNTY4NjY1NDk4MTE0MjUgLT4gMzQ1Nzk0OS4zOTAxNTA1MjM2Mzk3MTE2MzA4Njk2OTk0MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDE5IGFkZCAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNjUyNy4wMDU0NzYyOTQ3NTU3ODY5NDUyMTQzNjc2NDU5NkUtNDQyIC0+IC01MzMwODY2Njk2MDUzNS43MzkzMzkxMjg5MzY0NTkxNTEzIEluZXhhY3QgUm91bmRlZAorY29teDM0MTkgY29tcGFyZSAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNjUyNy4wMDU0NzYyOTQ3NTU3ODY5NDUyMTQzNjc2NDU5NkUtNDQyIC0+IC0xCitkaXZ4MzQxOSBkaXZpZGUgLTUzMzA4NjY2OTYwNTM1LjczOTMzOTEyODkzNjQ1OTE1MTMgLTY1MjcuMDA1NDc2Mjk0NzU1Nzg2OTQ1MjE0MzY3NjQ1OTZFLTQ0MiAtPiA4LjE2NzQwMDM3MjgyNzMxODcwODgzMTM2NzE0NDQxMjA0RSs0NTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzQxOSBkaXZpZGVpbnQgLTUzMzA4NjY2OTYwNTM1LjczOTMzOTEyODkzNjQ1OTE1MTMgLTY1MjcuMDA1NDc2Mjk0NzU1Nzg2OTQ1MjE0MzY3NjQ1OTZFLTQ0MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MTkgbXVsdGlwbHkgLTUzMzA4NjY2OTYwNTM1LjczOTMzOTEyODkzNjQ1OTE1MTMgLTY1MjcuMDA1NDc2Mjk0NzU1Nzg2OTQ1MjE0MzY3NjQ1OTZFLTQ0MiAtPiAzLjQ3OTQ1OTYxMTg1MzkwMDg0NjQxMTU2MjUwMTAwMDg1RS00MjUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQxOSBwb3dlciAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyAtNyAtPiAtOC4xNzM2MzUwMjM4MDQ5NzAzMzM0MjM4MDQ5ODk4ODk1OEUtOTcgSW5leGFjdCBSb3VuZGVkCityZW14MzQxOSByZW1haW5kZXIgLTUzMzA4NjY2OTYwNTM1LjczOTMzOTEyODkzNjQ1OTE1MTMgLTY1MjcuMDA1NDc2Mjk0NzU1Nzg2OTQ1MjE0MzY3NjQ1OTZFLTQ0MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0MTkgc3VidHJhY3QgLTUzMzA4NjY2OTYwNTM1LjczOTMzOTEyODkzNjQ1OTE1MTMgLTY1MjcuMDA1NDc2Mjk0NzU1Nzg2OTQ1MjE0MzY3NjQ1OTZFLTQ0MiAtPiAtNTMzMDg2NjY5NjA1MzUuNzM5MzM5MTI4OTM2NDU5MTUxMyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDIwIGFkZCAtNTU2ODA1Ny4xNzg3MDEzOTU0OTQ3ODI3Nzk4MDU0MDAzNCAtNDA3OTA2NDQzLjE0MTM0MjE3NTc0MDQ3MTg0OTcyMzYzOCAtPiAtNDEzNDc0NTAwLjMyMDA0MzU3MTIzNTI1NDYyOTUyOTAzOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDIwIGNvbXBhcmUgLTU1NjgwNTcuMTc4NzAxMzk1NDk0NzgyNzc5ODA1NDAwMzQgLTQwNzkwNjQ0My4xNDEzNDIxNzU3NDA0NzE4NDk3MjM2MzggLT4gMQorZGl2eDM0MjAgZGl2aWRlIC01NTY4MDU3LjE3ODcwMTM5NTQ5NDc4Mjc3OTgwNTQwMDM0IC00MDc5MDY0NDMuMTQxMzQyMTc1NzQwNDcxODQ5NzIzNjM4IC0+IDAuMDEzNjUwMzI5MDcwMTE5NzA5NDk1MzQyOTAxODAxMzE0NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDIwIGRpdmlkZWludCAtNTU2ODA1Ny4xNzg3MDEzOTU0OTQ3ODI3Nzk4MDU0MDAzNCAtNDA3OTA2NDQzLjE0MTM0MjE3NTc0MDQ3MTg0OTcyMzYzOCAtPiAwCittdWx4MzQyMCBtdWx0aXBseSAtNTU2ODA1Ny4xNzg3MDEzOTU0OTQ3ODI3Nzk4MDU0MDAzNCAtNDA3OTA2NDQzLjE0MTM0MjE3NTc0MDQ3MTg0OTcyMzYzOCAtPiAyMjcxMjQ2Mzk4OTcxNzAyLjkxMTY5ODA3NzI4MTMyMDg5IEluZXhhY3QgUm91bmRlZAorcG93eDM0MjAgcG93ZXIgLTU1NjgwNTcuMTc4NzAxMzk1NDk0NzgyNzc5ODA1NDAwMzQgLTQwNzkwNjQ0MyAtPiAtMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0MjAgcmVtYWluZGVyIC01NTY4MDU3LjE3ODcwMTM5NTQ5NDc4Mjc3OTgwNTQwMDM0IC00MDc5MDY0NDMuMTQxMzQyMTc1NzQwNDcxODQ5NzIzNjM4IC0+IC01NTY4MDU3LjE3ODcwMTM5NTQ5NDc4Mjc3OTgwNTQwMDM0CitzdWJ4MzQyMCBzdWJ0cmFjdCAtNTU2ODA1Ny4xNzg3MDEzOTU0OTQ3ODI3Nzk4MDU0MDAzNCAtNDA3OTA2NDQzLjE0MTM0MjE3NTc0MDQ3MTg0OTcyMzYzOCAtPiA0MDIzMzgzODUuOTYyNjQwNzgwMjQ1Njg5MDY5OTE4MjM4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjEgYWRkIDk4MDQzODUyNzMuNDk1MzM1MjQ0MTY0MTUxODk5OTA4NTcgODQuMTQzMzkyOTc0MzU0NDY1OTU1Mzk2NDgwNDY0NjU2OSAtPiA5ODA0Mzg1MzU3LjYzODcyODIxODUxODYxNzg1NTMwNTA1IEluZXhhY3QgUm91bmRlZAorY29teDM0MjEgY29tcGFyZSA5ODA0Mzg1MjczLjQ5NTMzNTI0NDE2NDE1MTg5OTkwODU3IDg0LjE0MzM5Mjk3NDM1NDQ2NTk1NTM5NjQ4MDQ2NDY1NjkgLT4gMQorZGl2eDM0MjEgZGl2aWRlIDk4MDQzODUyNzMuNDk1MzM1MjQ0MTY0MTUxODk5OTA4NTcgODQuMTQzMzkyOTc0MzU0NDY1OTU1Mzk2NDgwNDY0NjU2OSAtPiAxMTY1MTk5NjUuODIxNzE5OTc3NDAyMzk4MTkwNTU4NDM5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjEgZGl2aWRlaW50IDk4MDQzODUyNzMuNDk1MzM1MjQ0MTY0MTUxODk5OTA4NTcgODQuMTQzMzkyOTc0MzU0NDY1OTU1Mzk2NDgwNDY0NjU2OSAtPiAxMTY1MTk5NjUKK211bHgzNDIxIG11bHRpcGx5IDk4MDQzODUyNzMuNDk1MzM1MjQ0MTY0MTUxODk5OTA4NTcgODQuMTQzMzkyOTc0MzU0NDY1OTU1Mzk2NDgwNDY0NjU2OSAtPiA4MjQ5NzQyNDI5MzkuNjkxNzgwNzk4NjIxMTgwOTAxNzE0IEluZXhhY3QgUm91bmRlZAorcG93eDM0MjEgcG93ZXIgOTgwNDM4NTI3My40OTUzMzUyNDQxNjQxNTE4OTk5MDg1NyA4NCAtPiAxLjkwMjQ0MDEwNzc5NjkyNzM5MDM3MDgwNDE4NTA3OTA5RSs4MzkgSW5leGFjdCBSb3VuZGVkCityZW14MzQyMSByZW1haW5kZXIgOTgwNDM4NTI3My40OTUzMzUyNDQxNjQxNTE4OTk5MDg1NyA4NC4xNDMzOTI5NzQzNTQ0NjU5NTUzOTY0ODA0NjQ2NTY5IC0+IDY5LjE0MjMwNjk3MzQ0NzY2MjQzNTA0MzU2NDI3NDk5MTUKK3N1YngzNDIxIHN1YnRyYWN0IDk4MDQzODUyNzMuNDk1MzM1MjQ0MTY0MTUxODk5OTA4NTcgODQuMTQzMzkyOTc0MzU0NDY1OTU1Mzk2NDgwNDY0NjU2OSAtPiA5ODA0Mzg1MTg5LjM1MTk0MjI2OTgwOTY4NTk0NDUxMjA5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjIgYWRkIC01MjM0OTEwOTg2NTkyLjE4ODAxNzI3MDQ2NTgwMDE0MjczRS01NDcgLTU4NzQyMjA3MTU4OTIuOTE0NDAwNjkyMTA1MTI1MTUxNTQgLT4gLTU4NzQyMjA3MTU4OTIuOTE0NDAwNjkyMTA1MTI1MTUxNTQgSW5leGFjdCBSb3VuZGVkCitjb214MzQyMiBjb21wYXJlIC01MjM0OTEwOTg2NTkyLjE4ODAxNzI3MDQ2NTgwMDE0MjczRS01NDcgLTU4NzQyMjA3MTU4OTIuOTE0NDAwNjkyMTA1MTI1MTUxNTQgLT4gMQorZGl2eDM0MjIgZGl2aWRlIC01MjM0OTEwOTg2NTkyLjE4ODAxNzI3MDQ2NTgwMDE0MjczRS01NDcgLTU4NzQyMjA3MTU4OTIuOTE0NDAwNjkyMTA1MTI1MTUxNTQgLT4gOC45MTE2Njg4NjYwMTQ3NzAyMTc1NzQzOTgyNjkwMzc3NkUtNTQ4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjIgZGl2aWRlaW50IC01MjM0OTEwOTg2NTkyLjE4ODAxNzI3MDQ2NTgwMDE0MjczRS01NDcgLTU4NzQyMjA3MTU4OTIuOTE0NDAwNjkyMTA1MTI1MTUxNTQgLT4gMAorbXVseDM0MjIgbXVsdGlwbHkgLTUyMzQ5MTA5ODY1OTIuMTg4MDE3MjcwNDY1ODAwMTQyNzNFLTU0NyAtNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCAtPiAzLjA3NTEwMjI1NjMyOTUyNDU1MTQ0OTQ0MjgyOTI1NTgzRS01MjIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyMiBwb3dlciAtNTIzNDkxMDk4NjU5Mi4xODgwMTcyNzA0NjU4MDAxNDI3M0UtNTQ3IC02IC0+IDQuODU4OTY5NzA3MDMxMTcxNDkyMzU5MzUwMzcyNzEwODRFKzMyMDUgSW5leGFjdCBSb3VuZGVkCityZW14MzQyMiByZW1haW5kZXIgLTUyMzQ5MTA5ODY1OTIuMTg4MDE3MjcwNDY1ODAwMTQyNzNFLTU0NyAtNTg3NDIyMDcxNTg5Mi45MTQ0MDA2OTIxMDUxMjUxNTE1NCAtPiAtNS4yMzQ5MTA5ODY1OTIxODgwMTcyNzA0NjU4MDAxNDI3M0UtNTM1CitzdWJ4MzQyMiBzdWJ0cmFjdCAtNTIzNDkxMDk4NjU5Mi4xODgwMTcyNzA0NjU4MDAxNDI3M0UtNTQ3IC01ODc0MjIwNzE1ODkyLjkxNDQwMDY5MjEwNTEyNTE1MTU0IC0+IDU4NzQyMjA3MTU4OTIuOTE0NDAwNjkyMTA1MTI1MTUxNTQgSW5leGFjdCBSb3VuZGVkCithZGR4MzQyMyBhZGQgNjk4NDE2NTYwMTUxOTU1Mjg1OTI5NzQ3NjMzNzg2ODY3RS00OTUgNTE3NTQ2ODEuNjc4NDg3MjYyODkzMzIxODk4NTIxNjkxNkUtMjY2IC0+IDUuMTc1NDY4MTY3ODQ4NzI2Mjg5MzMyMTg5ODUyMTY5MTZFLTI1OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDIzIGNvbXBhcmUgNjk4NDE2NTYwMTUxOTU1Mjg1OTI5NzQ3NjMzNzg2ODY3RS00OTUgNTE3NTQ2ODEuNjc4NDg3MjYyODkzMzIxODk4NTIxNjkxNkUtMjY2IC0+IC0xCitkaXZ4MzQyMyBkaXZpZGUgNjk4NDE2NTYwMTUxOTU1Mjg1OTI5NzQ3NjMzNzg2ODY3RS00OTUgNTE3NTQ2ODEuNjc4NDg3MjYyODkzMzIxODk4NTIxNjkxNkUtMjY2IC0+IDEuMzQ5NDc1MTM0NDI0OTE5NzE0ODgzNjMyNTAzOTg5MDhFLTIwNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDIzIGRpdmlkZWludCA2OTg0MTY1NjAxNTE5NTUyODU5Mjk3NDc2MzM3ODY4NjdFLTQ5NSA1MTc1NDY4MS42Nzg0ODcyNjI4OTMzMjE4OTg1MjE2OTE2RS0yNjYgLT4gMAorbXVseDM0MjMgbXVsdGlwbHkgNjk4NDE2NTYwMTUxOTU1Mjg1OTI5NzQ3NjMzNzg2ODY3RS00OTUgNTE3NTQ2ODEuNjc4NDg3MjYyODkzMzIxODk4NTIxNjkxNkUtMjY2IC0+IDMuNjE0NjMyNjc0OTY0ODQ5NzYwNjQyNzEzMDU2Nzk3OTZFLTcyMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDIzIHBvd2VyIDY5ODQxNjU2MDE1MTk1NTI4NTkyOTc0NzYzMzc4Njg2N0UtNDk1IDUgLT4gMS42NjE3NzY2MTAwNzE4OTQzMDc2MTM5Njk3OTc4NzQxM0UtMjMxMSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDIzIHJlbWFpbmRlciA2OTg0MTY1NjAxNTE5NTUyODU5Mjk3NDc2MzM3ODY4NjdFLTQ5NSA1MTc1NDY4MS42Nzg0ODcyNjI4OTMzMjE4OTg1MjE2OTE2RS0yNjYgLT4gNi45ODQxNjU2MDE1MTk1NTI4NTkyOTc0NzYzMzc4Njg2N0UtNDYzCitzdWJ4MzQyMyBzdWJ0cmFjdCA2OTg0MTY1NjAxNTE5NTUyODU5Mjk3NDc2MzM3ODY4NjdFLTQ5NSA1MTc1NDY4MS42Nzg0ODcyNjI4OTMzMjE4OTg1MjE2OTE2RS0yNjYgLT4gLTUuMTc1NDY4MTY3ODQ4NzI2Mjg5MzMyMTg5ODUyMTY5MTZFLTI1OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDI0IGFkZCAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IC0zOTcyMDc1LjgzOTg5NTEyNjY4MzYyNjA5NjA5MDA2NDI1RS02MDUgLT4gMTA3NjM1LjQ5NzczNTMxNjUxNTA4MDcyMDMzMDUzNjAyNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDI0IGNvbXBhcmUgMTA3NjM1LjQ5NzczNTMxNjUxNTA4MDcyMDMzMDUzNjAyNyAtMzk3MjA3NS44Mzk4OTUxMjY2ODM2MjYwOTYwOTAwNjQyNUUtNjA1IC0+IDEKK2RpdngzNDI0IGRpdmlkZSAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IC0zOTcyMDc1LjgzOTg5NTEyNjY4MzYyNjA5NjA5MDA2NDI1RS02MDUgLT4gLTIuNzA5ODA0Njk4NDQ1OTk4ODg0NDMzMDk1NzEyMzU1OTdFKzYwMyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDI0IGRpdmlkZWludCAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IC0zOTcyMDc1LjgzOTg5NTEyNjY4MzYyNjA5NjA5MDA2NDI1RS02MDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDI0IG11bHRpcGx5IDEwNzYzNS40OTc3MzUzMTY1MTUwODA3MjAzMzA1MzYwMjcgLTM5NzIwNzUuODM5ODk1MTI2NjgzNjI2MDk2MDkwMDY0MjVFLTYwNSAtPiAtNC4yNzUzNjM2MDA2OTUzNzM1MjY5ODA2NjQwODAyMTc3M0UtNTk0IEluZXhhY3QgUm91bmRlZAorcG93eDM0MjQgcG93ZXIgMTA3NjM1LjQ5NzczNTMxNjUxNTA4MDcyMDMzMDUzNjAyNyAtNCAtPiA3LjQ1MDM3MTExNTAyOTEwNDg3ODAzNDMyODA2MzM0NzE0RS0yMSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDI0IHJlbWFpbmRlciAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IC0zOTcyMDc1LjgzOTg5NTEyNjY4MzYyNjA5NjA5MDA2NDI1RS02MDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDI0IHN1YnRyYWN0IDEwNzYzNS40OTc3MzUzMTY1MTUwODA3MjAzMzA1MzYwMjcgLTM5NzIwNzUuODM5ODk1MTI2NjgzNjI2MDk2MDkwMDY0MjVFLTYwNSAtPiAxMDc2MzUuNDk3NzM1MzE2NTE1MDgwNzIwMzMwNTM2MDI3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjUgYWRkIC0zMjE3NDI5MTM0NTY4Ni41MzcxNDQ2NjE2NjcwOTYxODA3IDc5NTE4ODYzNzU5Mzg1LjU5MjUwNTI3NDc4NjcwOTkwOTFFKzQwOCAtPiA3Ljk1MTg4NjM3NTkzODU1OTI1MDUyNzQ3ODY3MDk5MDkxRSs0MjEgSW5leGFjdCBSb3VuZGVkCitjb214MzQyNSBjb21wYXJlIC0zMjE3NDI5MTM0NTY4Ni41MzcxNDQ2NjE2NjcwOTYxODA3IDc5NTE4ODYzNzU5Mzg1LjU5MjUwNTI3NDc4NjcwOTkwOTFFKzQwOCAtPiAtMQorZGl2eDM0MjUgZGl2aWRlIC0zMjE3NDI5MTM0NTY4Ni41MzcxNDQ2NjE2NjcwOTYxODA3IDc5NTE4ODYzNzU5Mzg1LjU5MjUwNTI3NDc4NjcwOTkwOTFFKzQwOCAtPiAtNC4wNDYxMjA2MDg5NDY1ODAwNzcxNTYyMTgwNzg4MTA3NkUtNDA5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MjUgZGl2aWRlaW50IC0zMjE3NDI5MTM0NTY4Ni41MzcxNDQ2NjE2NjcwOTYxODA3IDc5NTE4ODYzNzU5Mzg1LjU5MjUwNTI3NDc4NjcwOTkwOTFFKzQwOCAtPiAtMAorbXVseDM0MjUgbXVsdGlwbHkgLTMyMTc0MjkxMzQ1Njg2LjUzNzE0NDY2MTY2NzA5NjE4MDcgNzk1MTg4NjM3NTkzODUuNTkyNTA1Mjc0Nzg2NzA5OTA5MUUrNDA4IC0+IC0yLjU1ODQ2MzA5MDA3MjQyNjY4NTEzMjI2ODE0MDQzNTkzRSs0MzUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQyNSBwb3dlciAtMzIxNzQyOTEzNDU2ODYuNTM3MTQ0NjYxNjY3MDk2MTgwNyA4IC0+IDEuMTQ4MzQzNzc2NTYxMDkxNDMyMTAwNTg2OTA1OTA2NjZFKzEwOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDI1IHJlbWFpbmRlciAtMzIxNzQyOTEzNDU2ODYuNTM3MTQ0NjYxNjY3MDk2MTgwNyA3OTUxODg2Mzc1OTM4NS41OTI1MDUyNzQ3ODY3MDk5MDkxRSs0MDggLT4gLTMyMTc0MjkxMzQ1Njg2LjUzNzE0NDY2MTY2NzA5NjE4MDcKK3N1YngzNDI1IHN1YnRyYWN0IC0zMjE3NDI5MTM0NTY4Ni41MzcxNDQ2NjE2NjcwOTYxODA3IDc5NTE4ODYzNzU5Mzg1LjU5MjUwNTI3NDc4NjcwOTkwOTFFKzQwOCAtPiAtNy45NTE4ODYzNzU5Mzg1NTkyNTA1Mjc0Nzg2NzA5OTA5MUUrNDIxIEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjYgYWRkIC04MTUxNzMwNDk0LjUzMTkwNTIzNjIwODk5NDEwNTQ0MDk5RSs2ODggLTkzMTczLjA2MzE0NzQ1MjcxNDIzMDc2NDQyMzk5MTk0ODBFKzkwMCAtPiAtOS4zMTczMDYzMTQ3NDUyNzE0MjMwNzY0NDIzOTkxOTQ4MEUrOTA0IEluZXhhY3QgUm91bmRlZAorY29teDM0MjYgY29tcGFyZSAtODE1MTczMDQ5NC41MzE5MDUyMzYyMDg5OTQxMDU0NDA5OUUrNjg4IC05MzE3My4wNjMxNDc0NTI3MTQyMzA3NjQ0MjM5OTE5NDgwRSs5MDAgLT4gMQorZGl2eDM0MjYgZGl2aWRlIC04MTUxNzMwNDk0LjUzMTkwNTIzNjIwODk5NDEwNTQ0MDk5RSs2ODggLTkzMTczLjA2MzE0NzQ1MjcxNDIzMDc2NDQyMzk5MTk0ODBFKzkwMCAtPiA4Ljc0OTAyMDYwNjU1Nzk2NzE3MDQzNjc4NDQxODg0MjgzRS0yMDggSW5leGFjdCBSb3VuZGVkCitkdml4MzQyNiBkaXZpZGVpbnQgLTgxNTE3MzA0OTQuNTMxOTA1MjM2MjA4OTk0MTA1NDQwOTlFKzY4OCAtOTMxNzMuMDYzMTQ3NDUyNzE0MjMwNzY0NDIzOTkxOTQ4MEUrOTAwIC0+IDAKK211bHgzNDI2IG11bHRpcGx5IC04MTUxNzMwNDk0LjUzMTkwNTIzNjIwODk5NDEwNTQ0MDk5RSs2ODggLTkzMTczLjA2MzE0NzQ1MjcxNDIzMDc2NDQyMzk5MTk0ODBFKzkwMCAtPiA3LjU5NTIxNzAwMTI4MDM3MTQ5MTc5NzUxNDY3NzMwOTYyRSsxNjAyIEluZXhhY3QgUm91bmRlZAorcG93eDM0MjYgcG93ZXIgLTgxNTE3MzA0OTQuNTMxOTA1MjM2MjA4OTk0MTA1NDQwOTlFKzY4OCAtOSAtPiAtNi4yOTE0NjM1Mjc3NDg0MjQ0ODM3NTI3NTI4MjE4MzcwMEUtNjI4MiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDI2IHJlbWFpbmRlciAtODE1MTczMDQ5NC41MzE5MDUyMzYyMDg5OTQxMDU0NDA5OUUrNjg4IC05MzE3My4wNjMxNDc0NTI3MTQyMzA3NjQ0MjM5OTE5NDgwRSs5MDAgLT4gLTguMTUxNzMwNDk0NTMxOTA1MjM2MjA4OTk0MTA1NDQwOTlFKzY5Nworc3VieDM0MjYgc3VidHJhY3QgLTgxNTE3MzA0OTQuNTMxOTA1MjM2MjA4OTk0MTA1NDQwOTlFKzY4OCAtOTMxNzMuMDYzMTQ3NDUyNzE0MjMwNzY0NDIzOTkxOTQ4MEUrOTAwIC0+IDkuMzE3MzA2MzE0NzQ1MjcxNDIzMDc2NDQyMzk5MTk0ODBFKzkwNCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDI3IGFkZCAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwIC01NjYyMy4wNTMwMDM5NTI4OTY5ODI1NDgwNzU1MTU5NTYyRSs0NTkgLT4gLTUuNjYyMzA1MzAwMzk1Mjg5Njk4MjU0ODA3NTUxNTk1NjJFKzQ2MyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDI3IGNvbXBhcmUgMS4zMzY0OTgwMTM0NTk3NjE5OTcwODM0MTc5OTUwNTIyMCAtNTY2MjMuMDUzMDAzOTUyODk2OTgyNTQ4MDc1NTE1OTU2MkUrNDU5IC0+IDEKK2RpdngzNDI3IGRpdmlkZSAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwIC01NjYyMy4wNTMwMDM5NTI4OTY5ODI1NDgwNzU1MTU5NTYyRSs0NTkgLT4gLTIuMzYwMzQyNTUwNTI3MDA5MDAzOTU3ODcxMzEzMzQ2MDhFLTQ2NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDI3IGRpdmlkZWludCAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwIC01NjYyMy4wNTMwMDM5NTI4OTY5ODI1NDgwNzU1MTU5NTYyRSs0NTkgLT4gLTAKK211bHgzNDI3IG11bHRpcGx5IDEuMzM2NDk4MDEzNDU5NzYxOTk3MDgzNDE3OTk1MDUyMjAgLTU2NjIzLjA1MzAwMzk1Mjg5Njk4MjU0ODA3NTUxNTk1NjJFKzQ1OSAtPiAtNy41Njc2NTk3ODU1ODA5ODU1ODkyODI2ODEyOTcwMDA1MkUrNDYzIEluZXhhY3QgUm91bmRlZAorcG93eDM0MjcgcG93ZXIgMS4zMzY0OTgwMTM0NTk3NjE5OTcwODM0MTc5OTUwNTIyMCAtNiAtPiAwLjE3NTQ2NDgzNTkxMjI4NDkwMDE4MDMwNTAyODk2NTE4OCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDI3IHJlbWFpbmRlciAxLjMzNjQ5ODAxMzQ1OTc2MTk5NzA4MzQxNzk5NTA1MjIwIC01NjYyMy4wNTMwMDM5NTI4OTY5ODI1NDgwNzU1MTU5NTYyRSs0NTkgLT4gMS4zMzY0OTgwMTM0NTk3NjE5OTcwODM0MTc5OTUwNTIyMAorc3VieDM0Mjcgc3VidHJhY3QgMS4zMzY0OTgwMTM0NTk3NjE5OTcwODM0MTc5OTUwNTIyMCAtNTY2MjMuMDUzMDAzOTUyODk2OTgyNTQ4MDc1NTE1OTU2MkUrNDU5IC0+IDUuNjYyMzA1MzAwMzk1Mjg5Njk4MjU0ODA3NTUxNTk1NjJFKzQ2MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDI4IGFkZCA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IC02MTQwLjc1ODM3OTU5MjQ4MTAwMzUyNzg4ODUzODA5Mzc2RS04MjIgLT4gNjc3NjIyMzgxNjI3ODguNjU1MTA2MTQ3NjAxODE4NTE5NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDI4IGNvbXBhcmUgNjc3NjIyMzgxNjI3ODguNjU1MTA2MTQ3NjAxODE4NTE5NiAtNjE0MC43NTgzNzk1OTI0ODEwMDM1Mjc4ODg1MzgwOTM3NkUtODIyIC0+IDEKK2RpdngzNDI4IGRpdmlkZSA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IC02MTQwLjc1ODM3OTU5MjQ4MTAwMzUyNzg4ODUzODA5Mzc2RS04MjIgLT4gLTEuMTAzNDgzMjE3NzcyOTQxNTcwMTQ5NDE5NTE4NzA0MDlFKzgzMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDI4IGRpdmlkZWludCA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IC02MTQwLjc1ODM3OTU5MjQ4MTAwMzUyNzg4ODUzODA5Mzc2RS04MjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDI4IG11bHRpcGx5IDY3NzYyMjM4MTYyNzg4LjY1NTEwNjE0NzYwMTgxODUxOTYgLTYxNDAuNzU4Mzc5NTkyNDgxMDAzNTI3ODg4NTM4MDkzNzZFLTgyMiAtPiAtNC4xNjExMTUzMTgxODA4NTgzODcxNzIwMTgyODc3Mzg1N0UtODA1IEluZXhhY3QgUm91bmRlZAorcG93eDM0MjggcG93ZXIgNjc3NjIyMzgxNjI3ODguNjU1MTA2MTQ3NjAxODE4NTE5NiAtNiAtPiAxLjAzMjkzNjMxNzA4MDA2NTA5MDc0OTcyNzY0NjcwMjgxRS04MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDI4IHJlbWFpbmRlciA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IC02MTQwLjc1ODM3OTU5MjQ4MTAwMzUyNzg4ODUzODA5Mzc2RS04MjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDI4IHN1YnRyYWN0IDY3NzYyMjM4MTYyNzg4LjY1NTEwNjE0NzYwMTgxODUxOTYgLTYxNDAuNzU4Mzc5NTkyNDgxMDAzNTI3ODg4NTM4MDkzNzZFLTgyMiAtPiA2Nzc2MjIzODE2Mjc4OC42NTUxMDYxNDc2MDE4MTg1MTk2IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MjkgYWRkIDQyODY1NjIuNzY1Njg4NjY3NTE1NzczMDYwNTY0OTgyNzEgNjI4Ni43NzI5MTU3ODQ5NzU4MDAxNTU1Nzk3OTM0OTg5M0UrODIwIC0+IDYuMjg2NzcyOTE1Nzg0OTc1ODAwMTU1NTc5NzkzNDk4OTNFKzgyMyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDI5IGNvbXBhcmUgNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MSA2Mjg2Ljc3MjkxNTc4NDk3NTgwMDE1NTU3OTc5MzQ5ODkzRSs4MjAgLT4gLTEKK2RpdngzNDI5IGRpdmlkZSA0Mjg2NTYyLjc2NTY4ODY2NzUxNTc3MzA2MDU2NDk4MjcxIDYyODYuNzcyOTE1Nzg0OTc1ODAwMTU1NTc5NzkzNDk4OTNFKzgyMCAtPiA2LjgxODM4MzMzMTMzNjYwMDI1NzQwNjgxNDU5MzQ5MzcyRS04MTggSW5leGFjdCBSb3VuZGVkCitkdml4MzQyOSBkaXZpZGVpbnQgNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MSA2Mjg2Ljc3MjkxNTc4NDk3NTgwMDE1NTU3OTc5MzQ5ODkzRSs4MjAgLT4gMAorbXVseDM0MjkgbXVsdGlwbHkgNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MSA2Mjg2Ljc3MjkxNTc4NDk3NTgwMDE1NTU3OTc5MzQ5ODkzRSs4MjAgLT4gMi42OTQ4NjQ2Njk3MTQzODU0Mjk3NTE1OTg5MzMwNjIxOUUrODMwIEluZXhhY3QgUm91bmRlZAorcG93eDM0MjkgcG93ZXIgNDI4NjU2Mi43NjU2ODg2Njc1MTU3NzMwNjA1NjQ5ODI3MSA2IC0+IDYuMjAzNzYxOTMwNjQ0MTIwODEwNTgxODE4ODE4MDUxMDhFKzM5IEluZXhhY3QgUm91bmRlZAorcmVteDM0MjkgcmVtYWluZGVyIDQyODY1NjIuNzY1Njg4NjY3NTE1NzczMDYwNTY0OTgyNzEgNjI4Ni43NzI5MTU3ODQ5NzU4MDAxNTU1Nzk3OTM0OTg5M0UrODIwIC0+IDQyODY1NjIuNzY1Njg4NjY3NTE1NzczMDYwNTY0OTgyNzEKK3N1YngzNDI5IHN1YnRyYWN0IDQyODY1NjIuNzY1Njg4NjY3NTE1NzczMDYwNTY0OTgyNzEgNjI4Ni43NzI5MTU3ODQ5NzU4MDAxNTU1Nzk3OTM0OTg5M0UrODIwIC0+IC02LjI4Njc3MjkxNTc4NDk3NTgwMDE1NTU3OTc5MzQ5ODkzRSs4MjMgSW5leGFjdCBSb3VuZGVkCithZGR4MzQzMCBhZGQgLTc2NTc4Mi44Mjc0MzI2NDI2OTczMDU2NDQwOTYzNjU1NjYgNjcuMTYzNDM2ODQ1OTU3NjgzNDY5Mjc1ODExNDYxODY1MiAtPiAtNzY1NzE1LjY2Mzk5NTc5NjczOTYyMjE3NDgyMDU1NDEwNCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDMwIGNvbXBhcmUgLTc2NTc4Mi44Mjc0MzI2NDI2OTczMDU2NDQwOTYzNjU1NjYgNjcuMTYzNDM2ODQ1OTU3NjgzNDY5Mjc1ODExNDYxODY1MiAtPiAtMQorZGl2eDM0MzAgZGl2aWRlIC03NjU3ODIuODI3NDMyNjQyNjk3MzA1NjQ0MDk2MzY1NTY2IDY3LjE2MzQzNjg0NTk1NzY4MzQ2OTI3NTgxMTQ2MTg2NTIgLT4gLTExNDAxLjc4MTQzNjM2Mzk0Nzg3NzQ3NjE2OTc2NTA4NjcgSW5leGFjdCBSb3VuZGVkCitkdml4MzQzMCBkaXZpZGVpbnQgLTc2NTc4Mi44Mjc0MzI2NDI2OTczMDU2NDQwOTYzNjU1NjYgNjcuMTYzNDM2ODQ1OTU3NjgzNDY5Mjc1ODExNDYxODY1MiAtPiAtMTE0MDEKK211bHgzNDMwIG11bHRpcGx5IC03NjU3ODIuODI3NDMyNjQyNjk3MzA1NjQ0MDk2MzY1NTY2IDY3LjE2MzQzNjg0NTk1NzY4MzQ2OTI3NTgxMTQ2MTg2NTIgLT4gLTUxNDMyNjA2LjU2Nzk5MTIwODg0NjgyNTYxMjIzMTU5NDQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQzMCBwb3dlciAtNzY1NzgyLjgyNzQzMjY0MjY5NzMwNTY0NDA5NjM2NTU2NiA2NyAtPiAtMS43MTgyMTIwMDc3MDc0OTc3MzU5NTQ3MzU5NDEzNjU4MkUrMzk0IEluZXhhY3QgUm91bmRlZAorcmVteDM0MzAgcmVtYWluZGVyIC03NjU3ODIuODI3NDMyNjQyNjk3MzA1NjQ0MDk2MzY1NTY2IDY3LjE2MzQzNjg0NTk1NzY4MzQ2OTI3NTgxMTQ2MTg2NTIgLT4gLTUyLjQ4Mzk1MTg3OTE0ODA3MjQzMDU2OTg4ODg0MDg1NDgKK3N1YngzNDMwIHN1YnRyYWN0IC03NjU3ODIuODI3NDMyNjQyNjk3MzA1NjQ0MDk2MzY1NTY2IDY3LjE2MzQzNjg0NTk1NzY4MzQ2OTI3NTgxMTQ2MTg2NTIgLT4gLTc2NTg0OS45OTA4Njk0ODg2NTQ5ODkxMTMzNzIxNzcwMjggSW5leGFjdCBSb3VuZGVkCithZGR4MzQzMSBhZGQgNDYuMjgzNTkzMTkxNjEwNjI1Mjc1NjQ2NTcyNDIxMTI3NiA1OS4yOTg5MjM3ODM0MDkzMTE4MzMyODI2NjE3OTU3NzkxIC0+IDEwNS41ODI1MTY5NzUwMTk5MzcxMDg5MjkyMzQyMTY5MDcgSW5leGFjdCBSb3VuZGVkCitjb214MzQzMSBjb21wYXJlIDQ2LjI4MzU5MzE5MTYxMDYyNTI3NTY0NjU3MjQyMTEyNzYgNTkuMjk4OTIzNzgzNDA5MzExODMzMjgyNjYxNzk1Nzc5MSAtPiAtMQorZGl2eDM0MzEgZGl2aWRlIDQ2LjI4MzU5MzE5MTYxMDYyNTI3NTY0NjU3MjQyMTEyNzYgNTkuMjk4OTIzNzgzNDA5MzExODMzMjgyNjYxNzk1Nzc5MSAtPiAwLjc4MDUxMzIwNzI5OTcyMjk3NTg4MjQxNjk5NTE0MDcwMSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDMxIGRpdmlkZWludCA0Ni4yODM1OTMxOTE2MTA2MjUyNzU2NDY1NzI0MjExMjc2IDU5LjI5ODkyMzc4MzQwOTMxMTgzMzI4MjY2MTc5NTc3OTEgLT4gMAorbXVseDM0MzEgbXVsdGlwbHkgNDYuMjgzNTkzMTkxNjEwNjI1Mjc1NjQ2NTcyNDIxMTI3NiA1OS4yOTg5MjM3ODM0MDkzMTE4MzMyODI2NjE3OTU3NzkxIC0+IDI3NDQuNTY3MjY1MDkxNjQwNjA1NjEzNzA2NTMyODY2MTQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQzMSBwb3dlciA0Ni4yODM1OTMxOTE2MTA2MjUyNzU2NDY1NzI0MjExMjc2IDU5IC0+IDEuODIwNTI2NDU3ODA2MDEwMDI2NzEwMDc5NDM5MjM5OTNFKzk4IEluZXhhY3QgUm91bmRlZAorcmVteDM0MzEgcmVtYWluZGVyIDQ2LjI4MzU5MzE5MTYxMDYyNTI3NTY0NjU3MjQyMTEyNzYgNTkuMjk4OTIzNzgzNDA5MzExODMzMjgyNjYxNzk1Nzc5MSAtPiA0Ni4yODM1OTMxOTE2MTA2MjUyNzU2NDY1NzI0MjExMjc2CitzdWJ4MzQzMSBzdWJ0cmFjdCA0Ni4yODM1OTMxOTE2MTA2MjUyNzU2NDY1NzI0MjExMjc2IDU5LjI5ODkyMzc4MzQwOTMxMTgzMzI4MjY2MTc5NTc3OTEgLT4gLTEzLjAxNTMzMDU5MTc5ODY4NjU1NzYzNjA4OTM3NDY1MTUKK2FkZHgzNDMyIGFkZCAtMzAyOTU1NS44MjI5ODg0MDIzNDAyOTQ3NDQ1OTY5NDY0NCA4NTc1MzU4NDQ2NTUwMDQ3MzczNzMwODk2MDExMjg1MzIgLT4gODU3NTM1ODQ0NjU1MDA0NzM3MzczMDg5NTk4MDk4OTc2IEluZXhhY3QgUm91bmRlZAorY29teDM0MzIgY29tcGFyZSAtMzAyOTU1NS44MjI5ODg0MDIzNDAyOTQ3NDQ1OTY5NDY0NCA4NTc1MzU4NDQ2NTUwMDQ3MzczNzMwODk2MDExMjg1MzIgLT4gLTEKK2RpdngzNDMyIGRpdmlkZSAtMzAyOTU1NS44MjI5ODg0MDIzNDAyOTQ3NDQ1OTY5NDY0NCA4NTc1MzU4NDQ2NTUwMDQ3MzczNzMwODk2MDExMjg1MzIgLT4gLTMuNTMyODYyMDI3NzE3NTk3MDQ1MDIxMjY4MTEzMjM5MzdFLTI3IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MzIgZGl2aWRlaW50IC0zMDI5NTU1LjgyMjk4ODQwMjM0MDI5NDc0NDU5Njk0NjQ0IDg1NzUzNTg0NDY1NTAwNDczNzM3MzA4OTYwMTEyODUzMiAtPiAtMAorbXVseDM0MzIgbXVsdGlwbHkgLTMwMjk1NTUuODIyOTg4NDAyMzQwMjk0NzQ0NTk2OTQ2NDQgODU3NTM1ODQ0NjU1MDA0NzM3MzczMDg5NjAxMTI4NTMyIC0+IC0yLjU5Nzk1MjcxMTU5NTg0NzYxOTI4OTg2MTgxOTI1NzIxRSszOSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDMyIHBvd2VyIC0zMDI5NTU1LjgyMjk4ODQwMjM0MDI5NDc0NDU5Njk0NjQ0IDkgLT4gLTIuMTQ5ODYyMjQ3OTA0MzEzMDI1NjEzNDAxMDA3NDYzNjBFKzU4IEluZXhhY3QgUm91bmRlZAorcmVteDM0MzIgcmVtYWluZGVyIC0zMDI5NTU1LjgyMjk4ODQwMjM0MDI5NDc0NDU5Njk0NjQ0IDg1NzUzNTg0NDY1NTAwNDczNzM3MzA4OTYwMTEyODUzMiAtPiAtMzAyOTU1NS44MjI5ODg0MDIzNDAyOTQ3NDQ1OTY5NDY0NAorc3VieDM0MzIgc3VidHJhY3QgLTMwMjk1NTUuODIyOTg4NDAyMzQwMjk0NzQ0NTk2OTQ2NDQgODU3NTM1ODQ0NjU1MDA0NzM3MzczMDg5NjAxMTI4NTMyIC0+IC04NTc1MzU4NDQ2NTUwMDQ3MzczNzMwODk2MDQxNTgwODggSW5leGFjdCBSb3VuZGVkCithZGR4MzQzMyBhZGQgLTAxMzg0NjY3ODk1MjMuMTA2OTQxNzY1NDM3MDA1MDE5NDVFLTk0OCA0ODEwMjY5Nzk5MTg4ODI0ODczODM2NTQzNjc5MjQ2MTkgLT4gNDgxMDI2OTc5OTE4ODgyNDg3MzgzNjU0MzY3OTI0NjE5IEluZXhhY3QgUm91bmRlZAorY29teDM0MzMgY29tcGFyZSAtMDEzODQ2Njc4OTUyMy4xMDY5NDE3NjU0MzcwMDUwMTk0NUUtOTQ4IDQ4MTAyNjk3OTkxODg4MjQ4NzM4MzY1NDM2NzkyNDYxOSAtPiAtMQorZGl2eDM0MzMgZGl2aWRlIC0wMTM4NDY2Nzg5NTIzLjEwNjk0MTc2NTQzNzAwNTAxOTQ1RS05NDggNDgxMDI2OTc5OTE4ODgyNDg3MzgzNjU0MzY3OTI0NjE5IC0+IC0yLjg3ODU2NTk3MDM4Mzk3MjA3Nzk3Nzc3ODExMTk5ODA0RS05NzAgSW5leGFjdCBSb3VuZGVkCitkdml4MzQzMyBkaXZpZGVpbnQgLTAxMzg0NjY3ODk1MjMuMTA2OTQxNzY1NDM3MDA1MDE5NDVFLTk0OCA0ODEwMjY5Nzk5MTg4ODI0ODczODM2NTQzNjc5MjQ2MTkgLT4gLTAKK211bHgzNDMzIG11bHRpcGx5IC0wMTM4NDY2Nzg5NTIzLjEwNjk0MTc2NTQzNzAwNTAxOTQ1RS05NDggNDgxMDI2OTc5OTE4ODgyNDg3MzgzNjU0MzY3OTI0NjE5IC0+IC02LjY2MDYyNjE1ODMzNjM2OTA4NjgzNzg1MjgzNjg3NDE2RS05MDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQzMyBwb3dlciAtMDEzODQ2Njc4OTUyMy4xMDY5NDE3NjU0MzcwMDUwMTk0NUUtOTQ4IDUgLT4gLTUuMDkwMTIxMDkwOTI2Mzc1MjU4NDM2MzYwNTY3NDY2NjdFLTQ2ODUgSW5leGFjdCBSb3VuZGVkCityZW14MzQzMyByZW1haW5kZXIgLTAxMzg0NjY3ODk1MjMuMTA2OTQxNzY1NDM3MDA1MDE5NDVFLTk0OCA0ODEwMjY5Nzk5MTg4ODI0ODczODM2NTQzNjc5MjQ2MTkgLT4gLTEuMzg0NjY3ODk1MjMxMDY5NDE3NjU0MzcwMDUwMTk0NUUtOTM3CitzdWJ4MzQzMyBzdWJ0cmFjdCAtMDEzODQ2Njc4OTUyMy4xMDY5NDE3NjU0MzcwMDUwMTk0NUUtOTQ4IDQ4MTAyNjk3OTkxODg4MjQ4NzM4MzY1NDM2NzkyNDYxOSAtPiAtNDgxMDI2OTc5OTE4ODgyNDg3MzgzNjU0MzY3OTI0NjE5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MzQgYWRkIC05NTkzNTY2NDY2Ljk2NjkwNTc1NzE0MjQ0NDQyMTA5ODcwIC04NzYzMjAzNDM0Ny40ODQ1NDc3OTYxOTc2Nzc2ODMzNzcwRSs3NjkgLT4gLTguNzYzMjAzNDM0NzQ4NDU0Nzc5NjE5NzY3NzY4MzM3NzBFKzc3OSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDM0IGNvbXBhcmUgLTk1OTM1NjY0NjYuOTY2OTA1NzU3MTQyNDQ0NDIxMDk4NzAgLTg3NjMyMDM0MzQ3LjQ4NDU0Nzc5NjE5NzY3NzY4MzM3NzBFKzc2OSAtPiAxCitkaXZ4MzQzNCBkaXZpZGUgLTk1OTM1NjY0NjYuOTY2OTA1NzU3MTQyNDQ0NDIxMDk4NzAgLTg3NjMyMDM0MzQ3LjQ4NDU0Nzc5NjE5NzY3NzY4MzM3NzBFKzc2OSAtPiAxLjA5NDc1NTY0OTM5MjUzMTM0MDcwNzMwMjk5ODYzNzY1RS03NzAgSW5leGFjdCBSb3VuZGVkCitkdml4MzQzNCBkaXZpZGVpbnQgLTk1OTM1NjY0NjYuOTY2OTA1NzU3MTQyNDQ0NDIxMDk4NzAgLTg3NjMyMDM0MzQ3LjQ4NDU0Nzc5NjE5NzY3NzY4MzM3NzBFKzc2OSAtPiAwCittdWx4MzQzNCBtdWx0aXBseSAtOTU5MzU2NjQ2Ni45NjY5MDU3NTcxNDI0NDQ0MjEwOTg3MCAtODc2MzIwMzQzNDcuNDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzY5IC0+IDguNDA3MDM3NDYxNDgxMTk4Njc3MTE0NjM0ODUwNjUzMzZFKzc4OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDM0IHBvd2VyIC05NTkzNTY2NDY2Ljk2NjkwNTc1NzE0MjQ0NDQyMTA5ODcwIC05IC0+IC0xLjQ1MjcxMDkxODQxODgyOTYwMDEwOTY0NDIxMDY2NzQ1RS05MCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDM0IHJlbWFpbmRlciAtOTU5MzU2NjQ2Ni45NjY5MDU3NTcxNDI0NDQ0MjEwOTg3MCAtODc2MzIwMzQzNDcuNDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzY5IC0+IC05NTkzNTY2NDY2Ljk2NjkwNTc1NzE0MjQ0NDQyMTA5ODcwCitzdWJ4MzQzNCBzdWJ0cmFjdCAtOTU5MzU2NjQ2Ni45NjY5MDU3NTcxNDI0NDQ0MjEwOTg3MCAtODc2MzIwMzQzNDcuNDg0NTQ3Nzk2MTk3Njc3NjgzMzc3MEUrNzY5IC0+IDguNzYzMjAzNDM0NzQ4NDU0Nzc5NjE5NzY3NzY4MzM3NzBFKzc3OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDM1IGFkZCAtMzE4OS4zMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk4IDU2NTY4ODg4OS4zNTUyNDE5NDYxNTQ4OTQzMTEyNTMyMDJFLTQ2NiAtPiA1LjY1Njg4ODg5MzU1MjQxOTQ2MTU0ODk0MzExMjUzMjAyRS00NTggSW5leGFjdCBSb3VuZGVkCitjb214MzQzNSBjb21wYXJlIC0zMTg5LjMwNzY1NDc3NjcwNTI2ODIzMTA2MTAwMjQxODYzRS04OTggNTY1Njg4ODg5LjM1NTI0MTk0NjE1NDg5NDMxMTI1MzIwMkUtNDY2IC0+IC0xCitkaXZ4MzQzNSBkaXZpZGUgLTMxODkuMzA3NjU0Nzc2NzA1MjY4MjMxMDYxMDAyNDE4NjNFLTg5OCA1NjU2ODg4ODkuMzU1MjQxOTQ2MTU0ODk0MzExMjUzMjAyRS00NjYgLT4gLTUuNjM3OTE4MTQ2ODY2NTU0ODY2MTI1Njk5NzA2MjkxMjhFLTQzOCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDM1IGRpdmlkZWludCAtMzE4OS4zMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk4IDU2NTY4ODg4OS4zNTUyNDE5NDYxNTQ4OTQzMTEyNTMyMDJFLTQ2NiAtPiAtMAorbXVseDM0MzUgbXVsdGlwbHkgLTMxODkuMzA3NjU0Nzc2NzA1MjY4MjMxMDYxMDAyNDE4NjNFLTg5OCA1NjU2ODg4ODkuMzU1MjQxOTQ2MTU0ODk0MzExMjUzMjAyRS00NjYgLT4gLTEuODA0MTU1OTA1MDQyODA1ODA0NDM1NjU0NDgxMjY1NDhFLTEzNTIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQzNSBwb3dlciAtMzE4OS4zMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk4IDYgLT4gMS4wNTIzOTQzMTAyNzY4MzkwNDUxNDMxMTUyNzIyODczNkUtNTM2NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDM1IHJlbWFpbmRlciAtMzE4OS4zMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk4IDU2NTY4ODg4OS4zNTUyNDE5NDYxNTQ4OTQzMTEyNTMyMDJFLTQ2NiAtPiAtMy4xODkzMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk1CitzdWJ4MzQzNSBzdWJ0cmFjdCAtMzE4OS4zMDc2NTQ3NzY3MDUyNjgyMzEwNjEwMDI0MTg2M0UtODk4IDU2NTY4ODg4OS4zNTUyNDE5NDYxNTQ4OTQzMTEyNTMyMDJFLTQ2NiAtPiAtNS42NTY4ODg4OTM1NTI0MTk0NjE1NDg5NDMxMTI1MzIwMkUtNDU4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MzYgYWRkIC0xNzA4NDU1MjM5NS42NzE0ODM0NjgwMDg4MTUwNTQzOTY1IC02MzE5MjU4MDI2NzIuNjg1MDM0Mzc5MTk3MzI4MzcwODEyRSs1MjcgLT4gLTYuMzE5MjU4MDI2NzI2ODUwMzQzNzkxOTczMjgzNzA4MTJFKzUzOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDM2IGNvbXBhcmUgLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUgLTYzMTkyNTgwMjY3Mi42ODUwMzQzNzkxOTczMjgzNzA4MTJFKzUyNyAtPiAxCitkaXZ4MzQzNiBkaXZpZGUgLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUgLTYzMTkyNTgwMjY3Mi42ODUwMzQzNzkxOTczMjgzNzA4MTJFKzUyNyAtPiAyLjcwMzU2OTM2MjYzOTM0NjIyMDUwMzQxMzI4NTE5NTM0RS01MjkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQzNiBkaXZpZGVpbnQgLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUgLTYzMTkyNTgwMjY3Mi42ODUwMzQzNzkxOTczMjgzNzA4MTJFKzUyNyAtPiAwCittdWx4MzQzNiBtdWx0aXBseSAtMTcwODQ1NTIzOTUuNjcxNDgzNDY4MDA4ODE1MDU0Mzk2NSAtNjMxOTI1ODAyNjcyLjY4NTAzNDM3OTE5NzMyODM3MDgxMkUrNTI3IC0+IDEuMDc5NjE2OTQ4NTkzODI0NjIzNDY4NjY4MTczMDY3NjlFKzU0OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDM2IHBvd2VyIC0xNzA4NDU1MjM5NS42NzE0ODM0NjgwMDg4MTUwNTQzOTY1IC02IC0+IDQuMDIxNDEwMTQ5NzcxNzc5ODQxMjMwMTE4NjgzODc2MjJFLTYyIEluZXhhY3QgUm91bmRlZAorcmVteDM0MzYgcmVtYWluZGVyIC0xNzA4NDU1MjM5NS42NzE0ODM0NjgwMDg4MTUwNTQzOTY1IC02MzE5MjU4MDI2NzIuNjg1MDM0Mzc5MTk3MzI4MzcwODEyRSs1MjcgLT4gLTE3MDg0NTUyMzk1LjY3MTQ4MzQ2ODAwODgxNTA1NDM5NjUKK3N1YngzNDM2IHN1YnRyYWN0IC0xNzA4NDU1MjM5NS42NzE0ODM0NjgwMDg4MTUwNTQzOTY1IC02MzE5MjU4MDI2NzIuNjg1MDM0Mzc5MTk3MzI4MzcwODEyRSs1MjcgLT4gNi4zMTkyNTgwMjY3MjY4NTAzNDM3OTE5NzMyODM3MDgxMkUrNTM4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0MzcgYWRkIDAzNDk1NjgzMC4zNDk4MjMzMDY4MTU5MTE4ODc0Njk3NjAgLTYxNjAwODE2LjA2NzIyNzQxMjY5NjYwNDI5NTY3ODE2NjVFLTY2NyAtPiAzNDk1NjgzMC4zNDk4MjMzMDY4MTU5MTE4ODc0Njk3NjAwIEluZXhhY3QgUm91bmRlZAorY29teDM0MzcgY29tcGFyZSAwMzQ5NTY4MzAuMzQ5ODIzMzA2ODE1OTExODg3NDY5NzYwIC02MTYwMDgxNi4wNjcyMjc0MTI2OTY2MDQyOTU2NzgxNjY1RS02NjcgLT4gMQorZGl2eDM0MzcgZGl2aWRlIDAzNDk1NjgzMC4zNDk4MjMzMDY4MTU5MTE4ODc0Njk3NjAgLTYxNjAwODE2LjA2NzIyNzQxMjY5NjYwNDI5NTY3ODE2NjVFLTY2NyAtPiAtNS42NzQ3MzQ5NDM3MTc4NzczNzYwNzE2OTk3OTYwMjM0M0UrNjY2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MzcgZGl2aWRlaW50IDAzNDk1NjgzMC4zNDk4MjMzMDY4MTU5MTE4ODc0Njk3NjAgLTYxNjAwODE2LjA2NzIyNzQxMjY5NjYwNDI5NTY3ODE2NjVFLTY2NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0MzcgbXVsdGlwbHkgMDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MCAtNjE2MDA4MTYuMDY3MjI3NDEyNjk2NjA0Mjk1Njc4MTY2NUUtNjY3IC0+IC0yLjE1MzM2OTI3NjY3MjczODQxNjE3MTI4NzgxMTczMjkzRS02NTIgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQzNyBwb3dlciAwMzQ5NTY4MzAuMzQ5ODIzMzA2ODE1OTExODg3NDY5NzYwIC02IC0+IDUuNDgwMzQyNzI1NjYwOTg0OTM0NjIxNjk0MzE3NjI1OTdFLTQ2IEluZXhhY3QgUm91bmRlZAorcmVteDM0MzcgcmVtYWluZGVyIDAzNDk1NjgzMC4zNDk4MjMzMDY4MTU5MTE4ODc0Njk3NjAgLTYxNjAwODE2LjA2NzIyNzQxMjY5NjYwNDI5NTY3ODE2NjVFLTY2NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0Mzcgc3VidHJhY3QgMDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MCAtNjE2MDA4MTYuMDY3MjI3NDEyNjk2NjA0Mjk1Njc4MTY2NUUtNjY3IC0+IDM0OTU2ODMwLjM0OTgyMzMwNjgxNTkxMTg4NzQ2OTc2MDAgSW5leGFjdCBSb3VuZGVkCithZGR4MzQzOCBhZGQgLTc2My40NDAwNjc3ODEyNTY2MzI2OTU3OTE5ODE4OTM2MDggMTkuOTI2MzgxMTM1MDYxMTAwNzgzMzIyMDYyMDc0NTQxMyAtPiAtNzQzLjUxMzY4NjY0NjE5NTUzMTkxMjQ2OTkxOTgxOTA2NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDM4IGNvbXBhcmUgLTc2My40NDAwNjc3ODEyNTY2MzI2OTU3OTE5ODE4OTM2MDggMTkuOTI2MzgxMTM1MDYxMTAwNzgzMzIyMDYyMDc0NTQxMyAtPiAtMQorZGl2eDM0MzggZGl2aWRlIC03NjMuNDQwMDY3NzgxMjU2NjMyNjk1NzkxOTgxODkzNjA4IDE5LjkyNjM4MTEzNTA2MTEwMDc4MzMyMjA2MjA3NDU0MTMgLT4gLTM4LjMxMzAzMTQ4MzU3MjI3NjY4MDc3MDM1ODU0MzU2ODggSW5leGFjdCBSb3VuZGVkCitkdml4MzQzOCBkaXZpZGVpbnQgLTc2My40NDAwNjc3ODEyNTY2MzI2OTU3OTE5ODE4OTM2MDggMTkuOTI2MzgxMTM1MDYxMTAwNzgzMzIyMDYyMDc0NTQxMyAtPiAtMzgKK211bHgzNDM4IG11bHRpcGx5IC03NjMuNDQwMDY3NzgxMjU2NjMyNjk1NzkxOTgxODkzNjA4IDE5LjkyNjM4MTEzNTA2MTEwMDc4MzMyMjA2MjA3NDU0MTMgLT4gLTE1MjEyLjU5Nzc2NDM4NjIwMDI1ODUwMzkzNjQ4Njg4ODMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQzOCBwb3dlciAtNzYzLjQ0MDA2Nzc4MTI1NjYzMjY5NTc5MTk4MTg5MzYwOCAyMCAtPiA0LjUyMzc1NDA3NzI3MzM2NzY5NTUyNDgxNjYxMjUwOTI0RSs1NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDM4IHJlbWFpbmRlciAtNzYzLjQ0MDA2Nzc4MTI1NjYzMjY5NTc5MTk4MTg5MzYwOCAxOS45MjYzODExMzUwNjExMDA3ODMzMjIwNjIwNzQ1NDEzIC0+IC02LjIzNzU4NDY0ODkzNDgwMjkyOTU1MzYyMzA2MTAzODYKK3N1YngzNDM4IHN1YnRyYWN0IC03NjMuNDQwMDY3NzgxMjU2NjMyNjk1NzkxOTgxODkzNjA4IDE5LjkyNjM4MTEzNTA2MTEwMDc4MzMyMjA2MjA3NDU0MTMgLT4gLTc4My4zNjY0NDg5MTYzMTc3MzM0NzkxMTQwNDM5NjgxNDkgSW5leGFjdCBSb3VuZGVkCithZGR4MzQzOSBhZGQgLTUxMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrNzg5IDgzNDg3MjM3ODU1MDgwMTg4OTk4MzkyNzE0ODU4NzkwOSAtPiAtNS4xMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrODIxIEluZXhhY3QgUm91bmRlZAorY29teDM0MzkgY29tcGFyZSAtNTEwNDcyMDI3ODY4NDQwNjY3Njg0NTc1MTQ3NTU2NjU0RSs3ODkgODM0ODcyMzc4NTUwODAxODg5OTgzOTI3MTQ4NTg3OTA5IC0+IC0xCitkaXZ4MzQzOSBkaXZpZGUgLTUxMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrNzg5IDgzNDg3MjM3ODU1MDgwMTg4OTk4MzkyNzE0ODU4NzkwOSAtPiAtNi4xMTQzNzE5ODA0NzYwMzc1NDEwNzUyNjg3NDA3MTczN0UrNzg4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0MzkgZGl2aWRlaW50IC01MTA0NzIwMjc4Njg0NDA2Njc2ODQ1NzUxNDc1NTY2NTRFKzc4OSA4MzQ4NzIzNzg1NTA4MDE4ODk5ODM5MjcxNDg1ODc5MDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDM5IG11bHRpcGx5IC01MTA0NzIwMjc4Njg0NDA2Njc2ODQ1NzUxNDc1NTY2NTRFKzc4OSA4MzQ4NzIzNzg1NTA4MDE4ODk5ODM5MjcxNDg1ODc5MDkgLT4gLTQuMjYxNzg5OTYwOTAxNzYyODkxMTU1OTQwNTc0MTk4OTJFKzg1NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDM5IHBvd2VyIC01MTA0NzIwMjc4Njg0NDA2Njc2ODQ1NzUxNDc1NTY2NTRFKzc4OSA4IC0+IDQuNjEwNzkyNjY2MTk1MjIxNDcyNjI2MDA3NTUyNzQxODJFKzY1NzMgSW5leGFjdCBSb3VuZGVkCityZW14MzQzOSByZW1haW5kZXIgLTUxMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrNzg5IDgzNDg3MjM3ODU1MDgwMTg4OTk4MzkyNzE0ODU4NzkwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0Mzkgc3VidHJhY3QgLTUxMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrNzg5IDgzNDg3MjM3ODU1MDgwMTg4OTk4MzkyNzE0ODU4NzkwOSAtPiAtNS4xMDQ3MjAyNzg2ODQ0MDY2NzY4NDU3NTE0NzU1NjY1NEUrODIxIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NDAgYWRkIDA3MDMwNDc2MS41NjA1MTcwODY2NzY5OTM1MDMwMzQ4MjhFLTA5NCAtMTc3NzMuNzQ0Njk1OTc3MTA3NzEwNDA1Nzg0NTI3Mzk5MkUtNzYxIC0+IDcuMDMwNDc2MTU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyODBFLTg3IEluZXhhY3QgUm91bmRlZAorY29teDM0NDAgY29tcGFyZSAwNzAzMDQ3NjEuNTYwNTE3MDg2Njc2OTkzNTAzMDM0ODI4RS0wOTQgLTE3NzczLjc0NDY5NTk3NzEwNzcxMDQwNTc4NDUyNzM5OTJFLTc2MSAtPiAxCitkaXZ4MzQ0MCBkaXZpZGUgMDcwMzA0NzYxLjU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyOEUtMDk0IC0xNzc3My43NDQ2OTU5NzcxMDc3MTA0MDU3ODQ1MjczOTkyRS03NjEgLT4gLTMuOTU1NTQwMTk0OTk1MDI1Mzc3NDM4ODM0ODM0MDI2MDhFKzY3MCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDQwIGRpdmlkZWludCAwNzAzMDQ3NjEuNTYwNTE3MDg2Njc2OTkzNTAzMDM0ODI4RS0wOTQgLTE3NzczLjc0NDY5NTk3NzEwNzcxMDQwNTc4NDUyNzM5OTJFLTc2MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NDAgbXVsdGlwbHkgMDcwMzA0NzYxLjU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyOEUtMDk0IC0xNzc3My43NDQ2OTU5NzcxMDc3MTA0MDU3ODQ1MjczOTkyRS03NjEgLT4gLTEuMjQ5NTc4ODgyODg4MTc1ODE1MzgxMDg5OTE0NTM3MzJFLTg0MyBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDQwIHBvd2VyIDA3MDMwNDc2MS41NjA1MTcwODY2NzY5OTM1MDMwMzQ4MjhFLTA5NCAtMiAtPiAyLjAyMzE2MTM1NDI3NjMxNDg4NDc5OTAyOTE5OTU5NjI3RSsxNzIgSW5leGFjdCBSb3VuZGVkCityZW14MzQ0MCByZW1haW5kZXIgMDcwMzA0NzYxLjU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyOEUtMDk0IC0xNzc3My43NDQ2OTU5NzcxMDc3MTA0MDU3ODQ1MjczOTkyRS03NjEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDQwIHN1YnRyYWN0IDA3MDMwNDc2MS41NjA1MTcwODY2NzY5OTM1MDMwMzQ4MjhFLTA5NCAtMTc3NzMuNzQ0Njk1OTc3MTA3NzEwNDA1Nzg0NTI3Mzk5MkUtNzYxIC0+IDcuMDMwNDc2MTU2MDUxNzA4NjY3Njk5MzUwMzAzNDgyODBFLTg3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NDEgYWRkIC0wOTcwNzI1Njk3NjYyLjI3NjA1NDU0MzM2MjMxMTk1NDYzIC00NTQxLjQxODk3NTQ2Njk3MTg3MTU3OTEzODg2NDMzNDc0IC0+IC05NzA3MjU3MDIyMDMuNjk1MDMwMDEwMzM0MTgzNTMzNzY5IEluZXhhY3QgUm91bmRlZAorY29teDM0NDEgY29tcGFyZSAtMDk3MDcyNTY5NzY2Mi4yNzYwNTQ1NDMzNjIzMTE5NTQ2MyAtNDU0MS40MTg5NzU0NjY5NzE4NzE1NzkxMzg4NjQzMzQ3NCAtPiAtMQorZGl2eDM0NDEgZGl2aWRlIC0wOTcwNzI1Njk3NjYyLjI3NjA1NDU0MzM2MjMxMTk1NDYzIC00NTQxLjQxODk3NTQ2Njk3MTg3MTU3OTEzODg2NDMzNDc0IC0+IDIxMzc0OTQyNS42NTQ0NDc4MTE2OTg4ODQwMDc1NTM2MTQgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ0MSBkaXZpZGVpbnQgLTA5NzA3MjU2OTc2NjIuMjc2MDU0NTQzMzYyMzExOTU0NjMgLTQ1NDEuNDE4OTc1NDY2OTcxODcxNTc5MTM4ODY0MzM0NzQgLT4gMjEzNzQ5NDI1CittdWx4MzQ0MSBtdWx0aXBseSAtMDk3MDcyNTY5NzY2Mi4yNzYwNTQ1NDMzNjIzMTE5NTQ2MyAtNDU0MS40MTg5NzU0NjY5NzE4NzE1NzkxMzg4NjQzMzQ3NCAtPiA0NDA4NDcyMTAzMzM2ODc1LjIxMTYxODY3ODkxNzI0MzkyIEluZXhhY3QgUm91bmRlZAorcG93eDM0NDEgcG93ZXIgLTA5NzA3MjU2OTc2NjIuMjc2MDU0NTQzMzYyMzExOTU0NjMgLTQ1NDEgLT4gLTBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDQxIHJlbWFpbmRlciAtMDk3MDcyNTY5NzY2Mi4yNzYwNTQ1NDMzNjIzMTE5NTQ2MyAtNDU0MS40MTg5NzU0NjY5NzE4NzE1NzkxMzg4NjQzMzQ3NCAtPiAtMjk3Mi4xMjE3MTA1MDIxNDc1Mzc3MDc5MjYzMTc0NzU1MAorc3VieDM0NDEgc3VidHJhY3QgLTA5NzA3MjU2OTc2NjIuMjc2MDU0NTQzMzYyMzExOTU0NjMgLTQ1NDEuNDE4OTc1NDY2OTcxODcxNTc5MTM4ODY0MzM0NzQgLT4gLTk3MDcyNTY5MzEyMC44NTcwNzkwNzYzOTA0NDAzNzU0OTEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ0MiBhZGQgLTgwODE3ODIzODYzMTg0NDI2ODMxNjExMTI1OTU1ODY3NSAtNTk4NDAwLjI2NTEwODY0NDUxNDIxMTI0NDk4MDQyNjUyMCAtPiAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjYwMTU3MDc1IEluZXhhY3QgUm91bmRlZAorY29teDM0NDIgY29tcGFyZSAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjU5NTU4Njc1IC01OTg0MDAuMjY1MTA4NjQ0NTE0MjExMjQ0OTgwNDI2NTIwIC0+IC0xCitkaXZ4MzQ0MiBkaXZpZGUgLTgwODE3ODIzODYzMTg0NDI2ODMxNjExMTI1OTU1ODY3NSAtNTk4NDAwLjI2NTEwODY0NDUxNDIxMTI0NDk4MDQyNjUyMCAtPiAxMzUwNTY0NjQwMDE1ODQ3NjM1MTc4OTQ1ODg0Ljk3ODM2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NDIgZGl2aWRlaW50IC04MDgxNzgyMzg2MzE4NDQyNjgzMTYxMTEyNTk1NTg2NzUgLTU5ODQwMC4yNjUxMDg2NDQ1MTQyMTEyNDQ5ODA0MjY1MjAgLT4gMTM1MDU2NDY0MDAxNTg0NzYzNTE3ODk0NTg4NAorbXVseDM0NDIgbXVsdGlwbHkgLTgwODE3ODIzODYzMTg0NDI2ODMxNjExMTI1OTU1ODY3NSAtNTk4NDAwLjI2NTEwODY0NDUxNDIxMTI0NDk4MDQyNjUyMCAtPiA0LjgzNjE0MDcyMjUyMzMyOTc5NzMxMzQ4NDIzMTQ1MjA4RSszOCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDQyIHBvd2VyIC04MDgxNzgyMzg2MzE4NDQyNjgzMTYxMTEyNTk1NTg2NzUgLTU5ODQwMCAtPiAwRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQ0MiByZW1haW5kZXIgLTgwODE3ODIzODYzMTg0NDI2ODMxNjExMTI1OTU1ODY3NSAtNTk4NDAwLjI2NTEwODY0NDUxNDIxMTI0NDk4MDQyNjUyMCAtPiAtNTg1NDUyLjA5Nzc2NDUzNjU3MDk1NjgxMzY4MTU1NjMyMAorc3VieDM0NDIgc3VidHJhY3QgLTgwODE3ODIzODYzMTg0NDI2ODMxNjExMTI1OTU1ODY3NSAtNTk4NDAwLjI2NTEwODY0NDUxNDIxMTI0NDk4MDQyNjUyMCAtPiAtODA4MTc4MjM4NjMxODQ0MjY4MzE2MTExMjU4OTYwMjc1IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NDMgYWRkIC05LjkwODI2NTk1MDY5MDUzNTY0MzExMzcxNzY2MzE1MjAwIC0wMzEuNjI1OTE2NzgxMzA3ODQ3ODY0ODcyMzI5ODA2NjQ2IC0+IC00MS41MzQxODI3MzE5OTgzODM1MDc5ODYwNDc0Njk3OTgwIFJvdW5kZWQKK2NvbXgzNDQzIGNvbXBhcmUgLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAgLTAzMS42MjU5MTY3ODEzMDc4NDc4NjQ4NzIzMjk4MDY2NDYgLT4gMQorZGl2eDM0NDMgZGl2aWRlIC05LjkwODI2NTk1MDY5MDUzNTY0MzExMzcxNzY2MzE1MjAwIC0wMzEuNjI1OTE2NzgxMzA3ODQ3ODY0ODcyMzI5ODA2NjQ2IC0+IDAuMzEzMjk1NzcwMDIzMjMzMjE4NjM5MjEzMTQwNTk5ODU2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NDMgZGl2aWRlaW50IC05LjkwODI2NTk1MDY5MDUzNTY0MzExMzcxNzY2MzE1MjAwIC0wMzEuNjI1OTE2NzgxMzA3ODQ3ODY0ODcyMzI5ODA2NjQ2IC0+IDAKK211bHgzNDQzIG11bHRpcGx5IC05LjkwODI2NTk1MDY5MDUzNTY0MzExMzcxNzY2MzE1MjAwIC0wMzEuNjI1OTE2NzgxMzA3ODQ3ODY0ODcyMzI5ODA2NjQ2IC0+IDMxMy4zNTc5OTQ0MDM2MDQ5NjgyNTA5MzYwMzY5NzgwODYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ0MyBwb3dlciAtOS45MDgyNjU5NTA2OTA1MzU2NDMxMTM3MTc2NjMxNTIwMCAtMzIgLT4gMS4zNDI5OTY5ODI1OTAzODAwMzAxMTQzOTU2ODAwNDYyNUUtMzIgSW5leGFjdCBSb3VuZGVkCityZW14MzQ0MyByZW1haW5kZXIgLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAgLTAzMS42MjU5MTY3ODEzMDc4NDc4NjQ4NzIzMjk4MDY2NDYgLT4gLTkuOTA4MjY1OTUwNjkwNTM1NjQzMTEzNzE3NjYzMTUyMDAKK3N1YngzNDQzIHN1YnRyYWN0IC05LjkwODI2NTk1MDY5MDUzNTY0MzExMzcxNzY2MzE1MjAwIC0wMzEuNjI1OTE2NzgxMzA3ODQ3ODY0ODcyMzI5ODA2NjQ2IC0+IDIxLjcxNzY1MDgzMDYxNzMxMjIyMTc1ODYxMjE0MzQ5NDAgUm91bmRlZAorYWRkeDM0NDQgYWRkIC0xOTY5MjUuNDY5ODkxODk3NzE5MTYwNjk4NDgzNzUyOTA3IC00MTI2OC45OTc1NDQ0NTMzNzk0MDY3NzIzOTU4NzM5Nzc4IC0+IC0yMzgxOTQuNDY3NDM2MzUxMDk4NTY3NDcwODc5NjI2ODg1IEluZXhhY3QgUm91bmRlZAorY29teDM0NDQgY29tcGFyZSAtMTk2OTI1LjQ2OTg5MTg5NzcxOTE2MDY5ODQ4Mzc1MjkwNyAtNDEyNjguOTk3NTQ0NDUzMzc5NDA2NzcyMzk1ODczOTc3OCAtPiAtMQorZGl2eDM0NDQgZGl2aWRlIC0xOTY5MjUuNDY5ODkxODk3NzE5MTYwNjk4NDgzNzUyOTA3IC00MTI2OC45OTc1NDQ0NTMzNzk0MDY3NzIzOTU4NzM5Nzc4IC0+IDQuNzcxNzUzMTcwODgyNzQ3MTUyMjY1NTM1MTY4MjA1ODkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ0NCBkaXZpZGVpbnQgLTE5NjkyNS40Njk4OTE4OTc3MTkxNjA2OTg0ODM3NTI5MDcgLTQxMjY4Ljk5NzU0NDQ1MzM3OTQwNjc3MjM5NTg3Mzk3NzggLT4gNAorbXVseDM0NDQgbXVsdGlwbHkgLTE5NjkyNS40Njk4OTE4OTc3MTkxNjA2OTg0ODM3NTI5MDcgLTQxMjY4Ljk5NzU0NDQ1MzM3OTQwNjc3MjM5NTg3Mzk3NzggLT4gODEyNjkxNjczMy40MDkwNTQ4NzAyNjAwMzEzNTk4NzQ3MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDQ0IHBvd2VyIC0xOTY5MjUuNDY5ODkxODk3NzE5MTYwNjk4NDgzNzUyOTA3IC00MTI2OSAtPiAtMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0NDQgcmVtYWluZGVyIC0xOTY5MjUuNDY5ODkxODk3NzE5MTYwNjk4NDgzNzUyOTA3IC00MTI2OC45OTc1NDQ0NTMzNzk0MDY3NzIzOTU4NzM5Nzc4IC0+IC0zMTg0OS40Nzk3MTQwODQyMDE1MzM2MDg5MDAyNTY5OTU4CitzdWJ4MzQ0NCBzdWJ0cmFjdCAtMTk2OTI1LjQ2OTg5MTg5NzcxOTE2MDY5ODQ4Mzc1MjkwNyAtNDEyNjguOTk3NTQ0NDUzMzc5NDA2NzcyMzk1ODczOTc3OCAtPiAtMTU1NjU2LjQ3MjM0NzQ0NDMzOTc1MzkyNjA4Nzg3ODkyOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDQ1IGFkZCA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMTMzNTMyMDMzMC4wODk2NDM1NDg0NTc5NjUxMDE0NTI0NkUtNjA0IC0+IDQyMTA3MTEzNTIxMjE1MjIyNTE2MjA4NjAwNTgyNDMxMCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDQ1IGNvbXBhcmUgNDIxMDcxMTM1MjEyMTUyMjI1MTYyMDg2MDA1ODI0MzEwIDEzMzUzMjAzMzAuMDg5NjQzNTQ4NDU3OTY1MTAxNDUyNDZFLTYwNCAtPiAxCitkaXZ4MzQ0NSBkaXZpZGUgNDIxMDcxMTM1MjEyMTUyMjI1MTYyMDg2MDA1ODI0MzEwIDEzMzUzMjAzMzAuMDg5NjQzNTQ4NDU3OTY1MTAxNDUyNDZFLTYwNCAtPiAzLjE1MzMzNDI2NTM3MzQ5NzQ0MjgxODYwMDA1NDk3MzA0RSs2MjcgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ0NSBkaXZpZGVpbnQgNDIxMDcxMTM1MjEyMTUyMjI1MTYyMDg2MDA1ODI0MzEwIDEzMzUzMjAzMzAuMDg5NjQzNTQ4NDU3OTY1MTAxNDUyNDZFLTYwNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NDUgbXVsdGlwbHkgNDIxMDcxMTM1MjEyMTUyMjI1MTYyMDg2MDA1ODI0MzEwIDEzMzUzMjAzMzAuMDg5NjQzNTQ4NDU3OTY1MTAxNDUyNDZFLTYwNCAtPiA1LjYyMjY0ODQ3MjYyNzEyMDQwMDI3MzExOTMyMTIxNDYwRS01NjMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ0NSBwb3dlciA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMSAtPiA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAKK3JlbXgzNDQ1IHJlbWFpbmRlciA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMTMzNTMyMDMzMC4wODk2NDM1NDg0NTc5NjUxMDE0NTI0NkUtNjA0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ0NSBzdWJ0cmFjdCA0MjEwNzExMzUyMTIxNTIyMjUxNjIwODYwMDU4MjQzMTAgMTMzNTMyMDMzMC4wODk2NDM1NDg0NTc5NjUxMDE0NTI0NkUtNjA0IC0+IDQyMTA3MTEzNTIxMjE1MjIyNTE2MjA4NjAwNTgyNDMxMCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDQ2IGFkZCAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IC0wMjg5ODQ4LjcxMjA4OTEyMjgxOTc2Mzc0NzA1MTgwODM2RS02NzYgLT4gMTI0OTQ0MS40NjQyMTUxNDI4MjMwMTE4Mjc3MjI0NzIyNyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDQ2IGNvbXBhcmUgMTI0OTQ0MS40NjQyMTUxNDI4MjMwMTE4Mjc3MjI0NzIyNyAtMDI4OTg0OC43MTIwODkxMjI4MTk3NjM3NDcwNTE4MDgzNkUtNjc2IC0+IDEKK2RpdngzNDQ2IGRpdmlkZSAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IC0wMjg5ODQ4LjcxMjA4OTEyMjgxOTc2Mzc0NzA1MTgwODM2RS02NzYgLT4gLTQuMzEwNjY3NjQxNzgzMjg5OTI0NDA2MzUzODcyNTU4MTZFKzY3NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDQ2IGRpdmlkZWludCAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IC0wMjg5ODQ4LjcxMjA4OTEyMjgxOTc2Mzc0NzA1MTgwODM2RS02NzYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDQ2IG11bHRpcGx5IDEyNDk0NDEuNDY0MjE1MTQyODIzMDExODI3NzIyNDcyMjcgLTAyODk4NDguNzEyMDg5MTIyODE5NzYzNzQ3MDUxODA4MzZFLTY3NiAtPiAtMy42MjE0ODk5OTIzMzUwNjk4NDU2NjYyMDYxMTcwMDM0OUUtNjY1IEluZXhhY3QgUm91bmRlZAorcG93eDM0NDYgcG93ZXIgMTI0OTQ0MS40NjQyMTUxNDI4MjMwMTE4Mjc3MjI0NzIyNyAtMyAtPiA1LjEyNjg2OTQyNTcyMTkxMjgyMzQ4NDE1MDI0OTMyMzIyRS0xOSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDQ2IHJlbWFpbmRlciAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IC0wMjg5ODQ4LjcxMjA4OTEyMjgxOTc2Mzc0NzA1MTgwODM2RS02NzYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDQ2IHN1YnRyYWN0IDEyNDk0NDEuNDY0MjE1MTQyODIzMDExODI3NzIyNDcyMjcgLTAyODk4NDguNzEyMDg5MTIyODE5NzYzNzQ3MDUxODA4MzZFLTY3NiAtPiAxMjQ5NDQxLjQ2NDIxNTE0MjgyMzAxMTgyNzcyMjQ3MjI3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NDcgYWRkIDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMgLTY5MDQyNTQwMTcwODE2NzYyMjE5NDI0MTkxNTE5NTAwMUUrODkxIC0+IC02LjkwNDI1NDAxNzA4MTY3NjIyMTk0MjQxOTE1MTk1MDAxRSs5MjMgSW5leGFjdCBSb3VuZGVkCitjb214MzQ0NyBjb21wYXJlIDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMgLTY5MDQyNTQwMTcwODE2NzYyMjE5NDI0MTkxNTE5NTAwMUUrODkxIC0+IDEKK2RpdngzNDQ3IGRpdmlkZSA3NDgxNTAwMC40NzE2ODc1NTU4MzU4OTM3Mjc5MDUyOTAzIC02OTA0MjU0MDE3MDgxNjc2MjIxOTQyNDE5MTUxOTUwMDFFKzg5MSAtPiAtMS4wODM2MDcyOTkwMTU3ODQ1NTEwOTk2ODM4ODMwOTA3OUUtOTE2IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NDcgZGl2aWRlaW50IDc0ODE1MDAwLjQ3MTY4NzU1NTgzNTg5MzcyNzkwNTI5MDMgLTY5MDQyNTQwMTcwODE2NzYyMjE5NDI0MTkxNTE5NTAwMUUrODkxIC0+IC0wCittdWx4MzQ0NyBtdWx0aXBseSA3NDgxNTAwMC40NzE2ODc1NTU4MzU4OTM3Mjc5MDUyOTAzIC02OTA0MjU0MDE3MDgxNjc2MjIxOTQyNDE5MTUxOTUwMDFFKzg5MSAtPiAtNS4xNjU0MTc2NzU0NDYxNjMwODczMjAyODgxMDAyNjI3NUUrOTMxIEluZXhhY3QgUm91bmRlZAorcG93eDM0NDcgcG93ZXIgNzQ4MTUwMDAuNDcxNjg3NTU1ODM1ODkzNzI3OTA1MjkwMyAtNyAtPiA3LjYyMjE4MDMyMjUyNjgzODE1NTM3OTA2OTcyNDM5OTg1RS01NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDQ3IHJlbWFpbmRlciA3NDgxNTAwMC40NzE2ODc1NTU4MzU4OTM3Mjc5MDUyOTAzIC02OTA0MjU0MDE3MDgxNjc2MjIxOTQyNDE5MTUxOTUwMDFFKzg5MSAtPiA3NDgxNTAwMC40NzE2ODc1NTU4MzU4OTM3Mjc5MDUyOTAzCitzdWJ4MzQ0NyBzdWJ0cmFjdCA3NDgxNTAwMC40NzE2ODc1NTU4MzU4OTM3Mjc5MDUyOTAzIC02OTA0MjU0MDE3MDgxNjc2MjIxOTQyNDE5MTUxOTUwMDFFKzg5MSAtPiA2LjkwNDI1NDAxNzA4MTY3NjIyMTk0MjQxOTE1MTk1MDAxRSs5MjMgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ0OCBhZGQgLTE2ODM5OTMuNTEyMTAyNDE1NTU2Njg3OTA1NTY3NTkwMjEgLTcyMzk0Mzg0OTI3MzQ0Ljg0MDI1ODUyMjgyNjc0OTMzNzQgLT4gLTcyMzk0Mzg2NjExMzM4LjM1MjM2MDkzODM4MzQzNzI0MzAgSW5leGFjdCBSb3VuZGVkCitjb214MzQ0OCBjb21wYXJlIC0xNjgzOTkzLjUxMjEwMjQxNTU1NjY4NzkwNTU2NzU5MDIxIC03MjM5NDM4NDkyNzM0NC44NDAyNTg1MjI4MjY3NDkzMzc0IC0+IDEKK2RpdngzNDQ4IGRpdmlkZSAtMTY4Mzk5My41MTIxMDI0MTU1NTY2ODc5MDU1Njc1OTAyMSAtNzIzOTQzODQ5MjczNDQuODQwMjU4NTIyODI2NzQ5MzM3NCAtPiAyLjMyNjEzODI5NjIxMjQ0MTEzMjg0MzAxMDA0MTU4Nzk0RS04IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NDggZGl2aWRlaW50IC0xNjgzOTkzLjUxMjEwMjQxNTU1NjY4NzkwNTU2NzU5MDIxIC03MjM5NDM4NDkyNzM0NC44NDAyNTg1MjI4MjY3NDkzMzc0IC0+IDAKK211bHgzNDQ4IG11bHRpcGx5IC0xNjgzOTkzLjUxMjEwMjQxNTU1NjY4NzkwNTU2NzU5MDIxIC03MjM5NDM4NDkyNzM0NC44NDAyNTg1MjI4MjY3NDkzMzc0IC0+IDEyMTkxMTY3NDUzMDI5MzYxMzYxNS40NDEzODQ4MjIzODEgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ0OCBwb3dlciAtMTY4Mzk5My41MTIxMDI0MTU1NTY2ODc5MDU1Njc1OTAyMSAtNyAtPiAtMi42MDM4NTY4MzUwOTk1Njg4OTAwMDY3NjExMzg2MDI5MkUtNDQgSW5leGFjdCBSb3VuZGVkCityZW14MzQ0OCByZW1haW5kZXIgLTE2ODM5OTMuNTEyMTAyNDE1NTU2Njg3OTA1NTY3NTkwMjEgLTcyMzk0Mzg0OTI3MzQ0Ljg0MDI1ODUyMjgyNjc0OTMzNzQgLT4gLTE2ODM5OTMuNTEyMTAyNDE1NTU2Njg3OTA1NTY3NTkwMjEKK3N1YngzNDQ4IHN1YnRyYWN0IC0xNjgzOTkzLjUxMjEwMjQxNTU1NjY4NzkwNTU2NzU5MDIxIC03MjM5NDM4NDkyNzM0NC44NDAyNTg1MjI4MjY3NDkzMzc0IC0+IDcyMzk0MzgzMjQzMzUxLjMyODE1NjEwNzI3MDA2MTQzMTggSW5leGFjdCBSb3VuZGVkCithZGR4MzQ0OSBhZGQgLTc2My4xNDg1MzA5NzQ3NDE3NjYxNzE3NTY5NzA0NDgxNTggNTE3MzcwLjgwODk1Njk1NzYwMTQ3MzY0MjI3MjY2NDY0NyAtPiA1MTY2MDcuNjYwNDI1OTgyODU5NzA3NDcwNTE1Njk0MTk5IEluZXhhY3QgUm91bmRlZAorY29teDM0NDkgY29tcGFyZSAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzAuODA4OTU2OTU3NjAxNDczNjQyMjcyNjY0NjQ3IC0+IC0xCitkaXZ4MzQ0OSBkaXZpZGUgLTc2My4xNDg1MzA5NzQ3NDE3NjYxNzE3NTY5NzA0NDgxNTggNTE3MzcwLjgwODk1Njk1NzYwMTQ3MzY0MjI3MjY2NDY0NyAtPiAtMC4wMDE0NzUwNTEzOTAxNDk1MTk0NjM4MTE1NTUyNTE3Mzg2NyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDQ5IGRpdmlkZWludCAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzAuODA4OTU2OTU3NjAxNDczNjQyMjcyNjY0NjQ3IC0+IC0wCittdWx4MzQ0OSBtdWx0aXBseSAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzAuODA4OTU2OTU3NjAxNDczNjQyMjcyNjY0NjQ3IC0+IC0zOTQ4MzA3NzIuODI0NzE1OTYyOTI1MzUxNDQ3MzIyMTg3IEluZXhhY3QgUm91bmRlZAorcG93eDM0NDkgcG93ZXIgLTc2My4xNDg1MzA5NzQ3NDE3NjYxNzE3NTY5NzA0NDgxNTggNTE3MzcxIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDQ5IHJlbWFpbmRlciAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzAuODA4OTU2OTU3NjAxNDczNjQyMjcyNjY0NjQ3IC0+IC03NjMuMTQ4NTMwOTc0NzQxNzY2MTcxNzU2OTcwNDQ4MTU4CitzdWJ4MzQ0OSBzdWJ0cmFjdCAtNzYzLjE0ODUzMDk3NDc0MTc2NjE3MTc1Njk3MDQ0ODE1OCA1MTczNzAuODA4OTU2OTU3NjAxNDczNjQyMjcyNjY0NjQ3IC0+IC01MTgxMzMuOTU3NDg3OTMyMzQzMjM5ODE0MDI5NjM1MDk1IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NTAgYWRkIC03Ny41ODQxMzM4ODEyMzEyNTIzNDYwNTkxMjI2MTc4NzU0IC05Mjc1NDA0MjIuNjQxMDI1MDUwOTY4ODMwMTU0NTc4MTUxRSs1MjQgLT4gLTkuMjc1NDA0MjI2NDEwMjUwNTA5Njg4MzAxNTQ1NzgxNTFFKzUzMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDUwIGNvbXBhcmUgLTc3LjU4NDEzMzg4MTIzMTI1MjM0NjA1OTEyMjYxNzg3NTQgLTkyNzU0MDQyMi42NDEwMjUwNTA5Njg4MzAxNTQ1NzgxNTFFKzUyNCAtPiAxCitkaXZ4MzQ1MCBkaXZpZGUgLTc3LjU4NDEzMzg4MTIzMTI1MjM0NjA1OTEyMjYxNzg3NTQgLTkyNzU0MDQyMi42NDEwMjUwNTA5Njg4MzAxNTQ1NzgxNTFFKzUyNCAtPiA4LjM2NDUwMTY0MTkxNDcxNzY5OTc4NDE1NzU4MzQyMjM3RS01MzIgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ1MCBkaXZpZGVpbnQgLTc3LjU4NDEzMzg4MTIzMTI1MjM0NjA1OTEyMjYxNzg3NTQgLTkyNzU0MDQyMi42NDEwMjUwNTA5Njg4MzAxNTQ1NzgxNTFFKzUyNCAtPiAwCittdWx4MzQ1MCBtdWx0aXBseSAtNzcuNTg0MTMzODgxMjMxMjUyMzQ2MDU5MTIyNjE3ODc1NCAtOTI3NTQwNDIyLjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTI0IC0+IDcuMTk2MjQyMDMzMDQzNTEwNzA1NjI0MDk3NDY0NzU5NDNFKzUzNCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDUwIHBvd2VyIC03Ny41ODQxMzM4ODEyMzEyNTIzNDYwNTkxMjI2MTc4NzU0IC05IC0+IC05LjgxODQ2ODU2ODczOTM4NTQ5NDY2MzQxNjkzOTk3ODI5RS0xOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDUwIHJlbWFpbmRlciAtNzcuNTg0MTMzODgxMjMxMjUyMzQ2MDU5MTIyNjE3ODc1NCAtOTI3NTQwNDIyLjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTI0IC0+IC03Ny41ODQxMzM4ODEyMzEyNTIzNDYwNTkxMjI2MTc4NzU0CitzdWJ4MzQ1MCBzdWJ0cmFjdCAtNzcuNTg0MTMzODgxMjMxMjUyMzQ2MDU5MTIyNjE3ODc1NCAtOTI3NTQwNDIyLjY0MTAyNTA1MDk2ODgzMDE1NDU3ODE1MUUrNTI0IC0+IDkuMjc1NDA0MjI2NDEwMjUwNTA5Njg4MzAxNTQ1NzgxNTFFKzUzMiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDUxIGFkZCA1MTc2Mjk1MzA5Ljg5OTQzNzQ2MjM2MTAyMjA5ODM3ODEzIC0xMjk3MzMuMTAzNjI4Nzk3NDc3MTY3OTA4Njk4NTY1NDY1IC0+IDUxNzYxNjU1NzYuNzk1ODA4NjY0ODgzODU0MTg5Njc5NTYgSW5leGFjdCBSb3VuZGVkCitjb214MzQ1MSBjb21wYXJlIDUxNzYyOTUzMDkuODk5NDM3NDYyMzYxMDIyMDk4Mzc4MTMgLTEyOTczMy4xMDM2Mjg3OTc0NzcxNjc5MDg2OTg1NjU0NjUgLT4gMQorZGl2eDM0NTEgZGl2aWRlIDUxNzYyOTUzMDkuODk5NDM3NDYyMzYxMDIyMDk4Mzc4MTMgLTEyOTczMy4xMDM2Mjg3OTc0NzcxNjc5MDg2OTg1NjU0NjUgLT4gLTM5ODk5LjU3MjAwNjc3MzY4NTU0NDQwODk0MzI1MjQwOTQgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ1MSBkaXZpZGVpbnQgNTE3NjI5NTMwOS44OTk0Mzc0NjIzNjEwMjIwOTgzNzgxMyAtMTI5NzMzLjEwMzYyODc5NzQ3NzE2NzkwODY5ODU2NTQ2NSAtPiAtMzk4OTkKK211bHgzNDUxIG11bHRpcGx5IDUxNzYyOTUzMDkuODk5NDM3NDYyMzYxMDIyMDk4Mzc4MTMgLTEyOTczMy4xMDM2Mjg3OTc0NzcxNjc5MDg2OTg1NjU0NjUgLT4gLTY3MTUzNjg1NTg1MjQ0Mi4wNzE4ODczODU1MTIwMDE3OTQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ1MSBwb3dlciA1MTc2Mjk1MzA5Ljg5OTQzNzQ2MjM2MTAyMjA5ODM3ODEzIC0xMjk3MzMgLT4gMEUtMTAwMzEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcmVteDM0NTEgcmVtYWluZGVyIDUxNzYyOTUzMDkuODk5NDM3NDYyMzYxMDIyMDk4Mzc4MTMgLTEyOTczMy4xMDM2Mjg3OTc0NzcxNjc5MDg2OTg1NjU0NjUgLT4gNzQyMDguMjE0MDQ2OTIwODM4NjMyOTM0MzE0NjQxOTY1CitzdWJ4MzQ1MSBzdWJ0cmFjdCA1MTc2Mjk1MzA5Ljg5OTQzNzQ2MjM2MTAyMjA5ODM3ODEzIC0xMjk3MzMuMTAzNjI4Nzk3NDc3MTY3OTA4Njk4NTY1NDY1IC0+IDUxNzY0MjUwNDMuMDAzMDY2MjU5ODM4MTkwMDA3MDc2NzAgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1MiBhZGQgNDQ3MTYzNDg0MTE2Ni45MDE5NzIyOTI4NjUzMDMwNzMyNkUrMTcyIDMxNTExMTA0Mzk3Ljg2NzE3MjcwMDMyMDE4OTA4MjU4NzlFLTk1NSAtPiA0LjQ3MTYzNDg0MTE2NjkwMTk3MjI5Mjg2NTMwMzA3MzI2RSsxODQgSW5leGFjdCBSb3VuZGVkCitjb214MzQ1MiBjb21wYXJlIDQ0NzE2MzQ4NDExNjYuOTAxOTcyMjkyODY1MzAzMDczMjZFKzE3MiAzMTUxMTEwNDM5Ny44NjcxNzI3MDAzMjAxODkwODI1ODc5RS05NTUgLT4gMQorZGl2eDM0NTIgZGl2aWRlIDQ0NzE2MzQ4NDExNjYuOTAxOTcyMjkyODY1MzAzMDczMjZFKzE3MiAzMTUxMTEwNDM5Ny44NjcxNzI3MDAzMjAxODkwODI1ODc5RS05NTUgLT4gMS40MTkwNjYzNjYxNjMxNDk4NzcwNTUzNjczNzAyNTkzMkUrMTEyOSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDUyIGRpdmlkZWludCA0NDcxNjM0ODQxMTY2LjkwMTk3MjI5Mjg2NTMwMzA3MzI2RSsxNzIgMzE1MTExMDQzOTcuODY3MTcyNzAwMzIwMTg5MDgyNTg3OUUtOTU1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ1MiBtdWx0aXBseSA0NDcxNjM0ODQxMTY2LjkwMTk3MjI5Mjg2NTMwMzA3MzI2RSsxNzIgMzE1MTExMDQzOTcuODY3MTcyNzAwMzIwMTg5MDgyNTg3OUUtOTU1IC0+IDEuNDA5MDYxNTIzMDkxNTA0NDEwMTAwNDYyMjIyMTQ4MTBFLTc2MCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDUyIHBvd2VyIDQ0NzE2MzQ4NDExNjYuOTAxOTcyMjkyODY1MzAzMDczMjZFKzE3MiAzIC0+IDguOTQxMjY1NTYzODk2NzM0OTgzODYzOTc1NjkyNDk1MTZFKzU1MyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDUyIHJlbWFpbmRlciA0NDcxNjM0ODQxMTY2LjkwMTk3MjI5Mjg2NTMwMzA3MzI2RSsxNzIgMzE1MTExMDQzOTcuODY3MTcyNzAwMzIwMTg5MDgyNTg3OUUtOTU1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ1MiBzdWJ0cmFjdCA0NDcxNjM0ODQxMTY2LjkwMTk3MjI5Mjg2NTMwMzA3MzI2RSsxNzIgMzE1MTExMDQzOTcuODY3MTcyNzAwMzIwMTg5MDgyNTg3OUUtOTU1IC0+IDQuNDcxNjM0ODQxMTY2OTAxOTcyMjkyODY1MzAzMDczMjZFKzE4NCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDUzIGFkZCAtODE4OTEzMC4xNTk0NTIzMTA0OTY3MDI4NTcyNjc3NDMxNyAyLjU3OTEyNDAyODcxNDA0MzI1ODMxNjcwOTIzODY0OTM2RS0zNjYgLT4gLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgSW5leGFjdCBSb3VuZGVkCitjb214MzQ1MyBjb21wYXJlIC04MTg5MTMwLjE1OTQ1MjMxMDQ5NjcwMjg1NzI2Nzc0MzE3IDIuNTc5MTI0MDI4NzE0MDQzMjU4MzE2NzA5MjM4NjQ5MzZFLTM2NiAtPiAtMQorZGl2eDM0NTMgZGl2aWRlIC04MTg5MTMwLjE1OTQ1MjMxMDQ5NjcwMjg1NzI2Nzc0MzE3IDIuNTc5MTI0MDI4NzE0MDQzMjU4MzE2NzA5MjM4NjQ5MzZFLTM2NiAtPiAtMy4xNzUxNTk0OTkyMjU1Njc3ODM0MzUyNjA5OTgzMDA5M0UrMzcyIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NTMgZGl2aWRlaW50IC04MTg5MTMwLjE1OTQ1MjMxMDQ5NjcwMjg1NzI2Nzc0MzE3IDIuNTc5MTI0MDI4NzE0MDQzMjU4MzE2NzA5MjM4NjQ5MzZFLTM2NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NTMgbXVsdGlwbHkgLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgMi41NzkxMjQwMjg3MTQwNDMyNTgzMTY3MDkyMzg2NDkzNkUtMzY2IC0+IC0yLjExMjA3ODIzNjg1MTAzMTg1MDM5OTc5MTQ0MTYxODQ4RS0zNTkgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ1MyBwb3dlciAtODE4OTEzMC4xNTk0NTIzMTA0OTY3MDI4NTcyNjc3NDMxNyAzIC0+IC01NDkxNzgyNDEwNTQ4NzU5ODI3MzEuMDAwOTM3ODc1ODg1IEluZXhhY3QgUm91bmRlZAorcmVteDM0NTMgcmVtYWluZGVyIC04MTg5MTMwLjE1OTQ1MjMxMDQ5NjcwMjg1NzI2Nzc0MzE3IDIuNTc5MTI0MDI4NzE0MDQzMjU4MzE2NzA5MjM4NjQ5MzZFLTM2NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NTMgc3VidHJhY3QgLTgxODkxMzAuMTU5NDUyMzEwNDk2NzAyODU3MjY3NzQzMTcgMi41NzkxMjQwMjg3MTQwNDMyNTgzMTY3MDkyMzg2NDkzNkUtMzY2IC0+IC04MTg5MTMwLjE1OTQ1MjMxMDQ5NjcwMjg1NzI2Nzc0MzE3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NTQgYWRkIC0yNTQzNDYyMzI5ODEzNTMyOTMzOTI4ODg3ODU2NDMyNDUgLTc2NC40MTY5MDI0ODYxNTIwOTM3NTgyODc5Mjk2Nzg0NDUgLT4gLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0NDAwOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDU0IGNvbXBhcmUgLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0MzI0NSAtNzY0LjQxNjkwMjQ4NjE1MjA5Mzc1ODI4NzkyOTY3ODQ0NSAtPiAtMQorZGl2eDM0NTQgZGl2aWRlIC0yNTQzNDYyMzI5ODEzNTMyOTMzOTI4ODg3ODU2NDMyNDUgLTc2NC40MTY5MDI0ODYxNTIwOTM3NTgyODc5Mjk2Nzg0NDUgLT4gMzMyNzMyMzUwODMzODU3ODg5MjA0NDA2MzU2OTAwLjY2NSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDU0IGRpdmlkZWludCAtMjU0MzQ2MjMyOTgxMzUzMjkzMzkyODg4Nzg1NjQzMjQ1IC03NjQuNDE2OTAyNDg2MTUyMDkzNzU4Mjg3OTI5Njc4NDQ1IC0+IDMzMjczMjM1MDgzMzg1Nzg4OTIwNDQwNjM1NjkwMAorbXVseDM0NTQgbXVsdGlwbHkgLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0MzI0NSAtNzY0LjQxNjkwMjQ4NjE1MjA5Mzc1ODI4NzkyOTY3ODQ0NSAtPiAxLjk0NDI2NTU5NTc0NjI3MjYyMDA2MzA3MzI2MzM2Mjg5RSszNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDU0IHBvd2VyIC0yNTQzNDYyMzI5ODEzNTMyOTMzOTI4ODg3ODU2NDMyNDUgLTc2NCAtPiAwRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQ1NCByZW1haW5kZXIgLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0MzI0NSAtNzY0LjQxNjkwMjQ4NjE1MjA5Mzc1ODI4NzkyOTY3ODQ0NSAtPiAtNTA4LjI5OTMyMzk2MjUzODYxMDU4MDY2OTA5Mjk3OTUwMAorc3VieDM0NTQgc3VidHJhY3QgLTI1NDM0NjIzMjk4MTM1MzI5MzM5Mjg4ODc4NTY0MzI0NSAtNzY0LjQxNjkwMjQ4NjE1MjA5Mzc1ODI4NzkyOTY3ODQ0NSAtPiAtMjU0MzQ2MjMyOTgxMzUzMjkzMzkyODg4Nzg1NjQyNDgxIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NTUgYWRkIC0yODc1LjM2NzQ1NDk5NTQ0MTc3OTY0ODA0Mjc3MzI5NzI2IC0xMzE4Ny44NDkyMDQ1MDU0ODAyMjA1NjkxMjQ4MjY3NjM4IC0+IC0xNjA2My4yMTY2NTk1MDA5MjIwMDAyMTcxNjc2MDAwNjExIEluZXhhY3QgUm91bmRlZAorY29teDM0NTUgY29tcGFyZSAtMjg3NS4zNjc0NTQ5OTU0NDE3Nzk2NDgwNDI3NzMyOTcyNiAtMTMxODcuODQ5MjA0NTA1NDgwMjIwNTY5MTI0ODI2NzYzOCAtPiAxCitkaXZ4MzQ1NSBkaXZpZGUgLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYgLTEzMTg3Ljg0OTIwNDUwNTQ4MDIyMDU2OTEyNDgyNjc2MzggLT4gMC4yMTgwMzE1NjkwOTExMjI1MjAzOTE1OTk1NDE1NzU2MTUgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ1NSBkaXZpZGVpbnQgLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYgLTEzMTg3Ljg0OTIwNDUwNTQ4MDIyMDU2OTEyNDgyNjc2MzggLT4gMAorbXVseDM0NTUgbXVsdGlwbHkgLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYgLTEzMTg3Ljg0OTIwNDUwNTQ4MDIyMDU2OTEyNDgyNjc2MzggLT4gMzc5MTk5MTIuNDA0MDIyNTg0MDcyNzI4MTYzMzAyNDY2NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDU1IHBvd2VyIC0yODc1LjM2NzQ1NDk5NTQ0MTc3OTY0ODA0Mjc3MzI5NzI2IC0xMzE4OCAtPiAwRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQ1NSByZW1haW5kZXIgLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYgLTEzMTg3Ljg0OTIwNDUwNTQ4MDIyMDU2OTEyNDgyNjc2MzggLT4gLTI4NzUuMzY3NDU0OTk1NDQxNzc5NjQ4MDQyNzczMjk3MjYKK3N1YngzNDU1IHN1YnRyYWN0IC0yODc1LjM2NzQ1NDk5NTQ0MTc3OTY0ODA0Mjc3MzI5NzI2IC0xMzE4Ny44NDkyMDQ1MDU0ODAyMjA1NjkxMjQ4MjY3NjM4IC0+IDEwMzEyLjQ4MTc0OTUxMDAzODQ0MDkyMTA4MjA1MzQ2NjUgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1NiBhZGQgLTcuMjY5Mjc1NzA5ODQyMTk5NDQ2OTM2MDIxNDAyMjMxMDMgMDE2MDg4MzAyMTU0MS4zMjI3NTI4Njc2OTExMDAwMzk3MUUtNDM4IC0+IC03LjI2OTI3NTcwOTg0MjE5OTQ0NjkzNjAyMTQwMjIzMTAzIEluZXhhY3QgUm91bmRlZAorY29teDM0NTYgY29tcGFyZSAtNy4yNjkyNzU3MDk4NDIxOTk0NDY5MzYwMjE0MDIyMzEwMyAwMTYwODgzMDIxNTQxLjMyMjc1Mjg2NzY5MTEwMDAzOTcxRS00MzggLT4gLTEKK2RpdngzNDU2IGRpdmlkZSAtNy4yNjkyNzU3MDk4NDIxOTk0NDY5MzYwMjE0MDIyMzEwMyAwMTYwODgzMDIxNTQxLjMyMjc1Mjg2NzY5MTEwMDAzOTcxRS00MzggLT4gLTQuNTE4MzYxMDA1NTMwMzk5MTc1NzQ1NTcyMzUyNzUxNzNFKzQyNyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDU2IGRpdmlkZWludCAtNy4yNjkyNzU3MDk4NDIxOTk0NDY5MzYwMjE0MDIyMzEwMyAwMTYwODgzMDIxNTQxLjMyMjc1Mjg2NzY5MTEwMDAzOTcxRS00MzggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDU2IG11bHRpcGx5IC03LjI2OTI3NTcwOTg0MjE5OTQ0NjkzNjAyMTQwMjIzMTAzIDAxNjA4ODMwMjE1NDEuMzIyNzUyODY3NjkxMTAwMDM5NzFFLTQzOCAtPiAtMS4xNjk1MDMwNDA2MTYzNTY4MTg5MTM2MTUwNDQ0MjQ3OUUtNDI2IEluZXhhY3QgUm91bmRlZAorcG93eDM0NTYgcG93ZXIgLTcuMjY5Mjc1NzA5ODQyMTk5NDQ2OTM2MDIxNDAyMjMxMDMgMiAtPiA1Mi44NDIzNjkzNDU3MDE4MTI2NDUxOTk4MDk2MjExMDM2IEluZXhhY3QgUm91bmRlZAorcmVteDM0NTYgcmVtYWluZGVyIC03LjI2OTI3NTcwOTg0MjE5OTQ0NjkzNjAyMTQwMjIzMTAzIDAxNjA4ODMwMjE1NDEuMzIyNzUyODY3NjkxMTAwMDM5NzFFLTQzOCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NTYgc3VidHJhY3QgLTcuMjY5Mjc1NzA5ODQyMTk5NDQ2OTM2MDIxNDAyMjMxMDMgMDE2MDg4MzAyMTU0MS4zMjI3NTI4Njc2OTExMDAwMzk3MUUtNDM4IC0+IC03LjI2OTI3NTcwOTg0MjE5OTQ0NjkzNjAyMTQwMjIzMTAzIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NTcgYWRkIC0yODU2NzE1MS42ODY4NzYyNzUyMjQxMDU2NTQwMDI4NTE1RSs0OTggLTQ0NzAuMTU0NTUxMzc1NDY0Mjc2NDUyOTAyMTA5ODk2NzUgLT4gLTIuODU2NzE1MTY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzUwNSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDU3IGNvbXBhcmUgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MC4xNTQ1NTEzNzU0NjQyNzY0NTI5MDIxMDk4OTY3NSAtPiAtMQorZGl2eDM0NTcgZGl2aWRlIC0yODU2NzE1MS42ODY4NzYyNzUyMjQxMDU2NTQwMDI4NTE1RSs0OTggLTQ0NzAuMTU0NTUxMzc1NDY0Mjc2NDUyOTAyMTA5ODk2NzUgLT4gNi4zOTA2NDA3MTY5MDQ1NTkxOTc5MjcwNzU4OTA1NDEwNkUrNTAxIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NTcgZGl2aWRlaW50IC0yODU2NzE1MS42ODY4NzYyNzUyMjQxMDU2NTQwMDI4NTE1RSs0OTggLTQ0NzAuMTU0NTUxMzc1NDY0Mjc2NDUyOTAyMTA5ODk2NzUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDU3IG11bHRpcGx5IC0yODU2NzE1MS42ODY4NzYyNzUyMjQxMDU2NTQwMDI4NTE1RSs0OTggLTQ0NzAuMTU0NTUxMzc1NDY0Mjc2NDUyOTAyMTA5ODk2NzUgLT4gMS4yNzY5OTU4MzEzMjkyMzI1MzYwNTM5NzczNjc5NzAwMEUrNTA5IEluZXhhY3QgUm91bmRlZAorcG93eDM0NTcgcG93ZXIgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MCAtPiAwRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQ1NyByZW1haW5kZXIgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MC4xNTQ1NTEzNzU0NjQyNzY0NTI5MDIxMDk4OTY3NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NTcgc3VidHJhY3QgLTI4NTY3MTUxLjY4Njg3NjI3NTIyNDEwNTY1NDAwMjg1MTVFKzQ5OCAtNDQ3MC4xNTQ1NTEzNzU0NjQyNzY0NTI5MDIxMDk4OTY3NSAtPiAtMi44NTY3MTUxNjg2ODc2Mjc1MjI0MTA1NjU0MDAyODUxNUUrNTA1IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NTggYWRkIDcxOTE3NTMuNzk5NzQxMzY0NDcyNTc0NjgyODIwNzM3MTggODEuMzg3ODQyNjE3NjAzODQ4Nzk0ODM3NTc3NzM4NDQyOSAtPiA3MTkxODM1LjE4NzU4Mzk4MjA3NjQyMzQ3NzY1ODMxNDkyIEluZXhhY3QgUm91bmRlZAorY29teDM0NTggY29tcGFyZSA3MTkxNzUzLjc5OTc0MTM2NDQ3MjU3NDY4MjgyMDczNzE4IDgxLjM4Nzg0MjYxNzYwMzg0ODc5NDgzNzU3NzczODQ0MjkgLT4gMQorZGl2eDM0NTggZGl2aWRlIDcxOTE3NTMuNzk5NzQxMzY0NDcyNTc0NjgyODIwNzM3MTggODEuMzg3ODQyNjE3NjAzODQ4Nzk0ODM3NTc3NzM4NDQyOSAtPiA4ODM2My45ODEyNTg2MTg4MTg2NzMzOTM1NTY5ODc0MTAwIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NTggZGl2aWRlaW50IDcxOTE3NTMuNzk5NzQxMzY0NDcyNTc0NjgyODIwNzM3MTggODEuMzg3ODQyNjE3NjAzODQ4Nzk0ODM3NTc3NzM4NDQyOSAtPiA4ODM2MworbXVseDM0NTggbXVsdGlwbHkgNzE5MTc1My43OTk3NDEzNjQ0NzI1NzQ2ODI4MjA3MzcxOCA4MS4zODc4NDI2MTc2MDM4NDg3OTQ4Mzc1Nzc3Mzg0NDI5IC0+IDU4NTMyMTMyNi4zOTc5MDQ2Mzg4NjM0ODU4OTE1MjQ1NTUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ1OCBwb3dlciA3MTkxNzUzLjc5OTc0MTM2NDQ3MjU3NDY4MjgyMDczNzE4IDgxIC0+IDIuNTMyOTA5ODMxMzg1NjE0ODI2MTI1NTc0MDQxNDg3NjBFKzU1NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDU4IHJlbWFpbmRlciA3MTkxNzUzLjc5OTc0MTM2NDQ3MjU3NDY4MjgyMDczNzE4IDgxLjM4Nzg0MjYxNzYwMzg0ODc5NDgzNzU3NzczODQ0MjkgLT4gNzkuODYyNTIyMDM1NTgxNTE2NDQ5OTM5MDM1MTUwMDI3Mworc3VieDM0NTggc3VidHJhY3QgNzE5MTc1My43OTk3NDEzNjQ0NzI1NzQ2ODI4MjA3MzcxOCA4MS4zODc4NDI2MTc2MDM4NDg3OTQ4Mzc1Nzc3Mzg0NDI5IC0+IDcxOTE2NzIuNDExODk4NzQ2ODY4NzI1ODg3OTgzMTU5NDQgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ1OSBhZGQgNTAyOTc1ODA0LjA2OTg2NDUzNjEwNDYyMTcwMDQwNDc3MCA2ODQuNzkwMDI4NDMyMDc0NTI3OTYwMjY5NTE1MjI3MjQzIC0+IDUwMjk3NjQ4OC44NTk4OTI5NjgxNzkxNDk2NjA2NzQyODUgSW5leGFjdCBSb3VuZGVkCitjb214MzQ1OSBjb21wYXJlIDUwMjk3NTgwNC4wNjk4NjQ1MzYxMDQ2MjE3MDA0MDQ3NzAgNjg0Ljc5MDAyODQzMjA3NDUyNzk2MDI2OTUxNTIyNzI0MyAtPiAxCitkaXZ4MzQ1OSBkaXZpZGUgNTAyOTc1ODA0LjA2OTg2NDUzNjEwNDYyMTcwMDQwNDc3MCA2ODQuNzkwMDI4NDMyMDc0NTI3OTYwMjY5NTE1MjI3MjQzIC0+IDczNDQ5Ni4zOTA0MDY3MDYzMjM4OTk4MDE2NDEyNzg5MzMgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ1OSBkaXZpZGVpbnQgNTAyOTc1ODA0LjA2OTg2NDUzNjEwNDYyMTcwMDQwNDc3MCA2ODQuNzkwMDI4NDMyMDc0NTI3OTYwMjY5NTE1MjI3MjQzIC0+IDczNDQ5NgorbXVseDM0NTkgbXVsdGlwbHkgNTAyOTc1ODA0LjA2OTg2NDUzNjEwNDYyMTcwMDQwNDc3MCA2ODQuNzkwMDI4NDMyMDc0NTI3OTYwMjY5NTE1MjI3MjQzIC0+IDM0NDQzMjgxNTE2OS42NDgwODI3NTQyMTQ2MzEwODYyNzAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ1OSBwb3dlciA1MDI5NzU4MDQuMDY5ODY0NTM2MTA0NjIxNzAwNDA0NzcwIDY4NSAtPiAzLjYyODc2NzE2NTczNjIzNTUyNzYxNzM5MTc3NTkyNjc3RSs1OTYwIEluZXhhY3QgUm91bmRlZAorcmVteDM0NTkgcmVtYWluZGVyIDUwMjk3NTgwNC4wNjk4NjQ1MzYxMDQ2MjE3MDA0MDQ3NzAgNjg0Ljc5MDAyODQzMjA3NDUyNzk2MDI2OTUxNTIyNzI0MyAtPiAyNjcuMzQ2NjE5NTIzNjE1OTE1NTgyNTQ4NDIwOTI1NDcyCitzdWJ4MzQ1OSBzdWJ0cmFjdCA1MDI5NzU4MDQuMDY5ODY0NTM2MTA0NjIxNzAwNDA0NzcwIDY4NC43OTAwMjg0MzIwNzQ1Mjc5NjAyNjk1MTUyMjcyNDMgLT4gNTAyOTc1MTE5LjI3OTgzNjEwNDAzMDA5Mzc0MDEzNTI1NSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDYwIGFkZCAxNTA1MzY4LjQyMDYzNzMxODYxNTkwNDYwNDUzNjU5NTcwIC00NjUyNDIuNjc4NDM5OTUxNDYyNzY3NjMwMDIyODE5MTA1IC0+IDEwNDAxMjUuNzQyMTk3MzY3MTUzMTM2OTc0NTEzNzc2NjAgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2MCBjb21wYXJlIDE1MDUzNjguNDIwNjM3MzE4NjE1OTA0NjA0NTM2NTk1NzAgLTQ2NTI0Mi42Nzg0Mzk5NTE0NjI3Njc2MzAwMjI4MTkxMDUgLT4gMQorZGl2eDM0NjAgZGl2aWRlIDE1MDUzNjguNDIwNjM3MzE4NjE1OTA0NjA0NTM2NTk1NzAgLTQ2NTI0Mi42Nzg0Mzk5NTE0NjI3Njc2MzAwMjI4MTkxMDUgLT4gLTMuMjM1NjYyNzg1MDMzMTk5NDcwNTkyMTMwMDE0MDUwNjUgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ2MCBkaXZpZGVpbnQgMTUwNTM2OC40MjA2MzczMTg2MTU5MDQ2MDQ1MzY1OTU3MCAtNDY1MjQyLjY3ODQzOTk1MTQ2Mjc2NzYzMDAyMjgxOTEwNSAtPiAtMworbXVseDM0NjAgbXVsdGlwbHkgMTUwNTM2OC40MjA2MzczMTg2MTU5MDQ2MDQ1MzY1OTU3MCAtNDY1MjQyLjY3ODQzOTk1MTQ2Mjc2NzYzMDAyMjgxOTEwNSAtPiAtNzAwMzYxNjM2MDU2LjIyNTYxODI2NjI5Njg5OTA0ODc2NSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDYwIHBvd2VyIDE1MDUzNjguNDIwNjM3MzE4NjE1OTA0NjA0NTM2NTk1NzAgLTQ2NTI0MyAtPiAwRS0xMDAzMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityZW14MzQ2MCByZW1haW5kZXIgMTUwNTM2OC40MjA2MzczMTg2MTU5MDQ2MDQ1MzY1OTU3MCAtNDY1MjQyLjY3ODQzOTk1MTQ2Mjc2NzYzMDAyMjgxOTEwNSAtPiAxMDk2NDAuMzg1MzE3NDY0MjI3NjAxNzE0NDY4MTM4Mzg1CitzdWJ4MzQ2MCBzdWJ0cmFjdCAxNTA1MzY4LjQyMDYzNzMxODYxNTkwNDYwNDUzNjU5NTcwIC00NjUyNDIuNjc4NDM5OTUxNDYyNzY3NjMwMDIyODE5MTA1IC0+IDE5NzA2MTEuMDk5MDc3MjcwMDc4NjcyMjM0NTU5NDE0ODEgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ2MSBhZGQgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwLjA2NjQ4MTkxNzk4ODM0ODE5OTk1MzI1NjkzIC0+IDc3ODA5MDczLjM1MTQ5NjE5NjM5NDY4OTgxMzY2NzczOTggSW5leGFjdCBSb3VuZGVkCitjb214MzQ2MSBjb21wYXJlIDY5MjI1MDIzLjI4NTAxNDI3ODQwNjM0MTYxMzcxNDQ4MjkgODU4NDA1MC4wNjY0ODE5MTc5ODgzNDgxOTk5NTMyNTY5MyAtPiAxCitkaXZ4MzQ2MSBkaXZpZGUgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwLjA2NjQ4MTkxNzk4ODM0ODE5OTk1MzI1NjkzIC0+IDguMDY0Mzc3ODU3NjQwNTA0MzEyOTU2NTI0MTExNjMzODIgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ2MSBkaXZpZGVpbnQgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwLjA2NjQ4MTkxNzk4ODM0ODE5OTk1MzI1NjkzIC0+IDgKK211bHgzNDYxIG11bHRpcGx5IDY5MjI1MDIzLjI4NTAxNDI3ODQwNjM0MTYxMzcxNDQ4MjkgODU4NDA1MC4wNjY0ODE5MTc5ODgzNDgxOTk5NTMyNTY5MyAtPiA1OTQyMzEwNjU3MzE5MzkuMTM3MzI5NzcwNDg1NDk3MjYxIEluZXhhY3QgUm91bmRlZAorcG93eDM0NjEgcG93ZXIgNjkyMjUwMjMuMjg1MDE0Mjc4NDA2MzQxNjEzNzE0NDgyOSA4NTg0MDUwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0NjEgcmVtYWluZGVyIDY5MjI1MDIzLjI4NTAxNDI3ODQwNjM0MTYxMzcxNDQ4MjkgODU4NDA1MC4wNjY0ODE5MTc5ODgzNDgxOTk5NTMyNTY5MyAtPiA1NTI2MjIuNzUzMTU4OTM0NDk5NTU2MDE0MDg4NDI3NDYKK3N1YngzNDYxIHN1YnRyYWN0IDY5MjI1MDIzLjI4NTAxNDI3ODQwNjM0MTYxMzcxNDQ4MjkgODU4NDA1MC4wNjY0ODE5MTc5ODgzNDgxOTk5NTMyNTY5MyAtPiA2MDY0MDk3My4yMTg1MzIzNjA0MTc5OTM0MTM3NjEyMjYwIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjIgYWRkIC01NTY2OTUwMTg1My43NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MTQgMDYxNDAwNTM4LjE4NjA0NDY5MzIzMzgxNjU2Njk3NzE4OSAtPiAtNS41NjY5NTAxODUzNzc1MTAwNjg0MTk0MDQ3MTMzOTMxMEUrNjI0IEluZXhhY3QgUm91bmRlZAorY29teDM0NjIgY29tcGFyZSAtNTU2Njk1MDE4NTMuNzc1MTAwNjg0MTk0MDQ3MTMzOTMxMEUrNjE0IDA2MTQwMDUzOC4xODYwNDQ2OTMyMzM4MTY1NjY5NzcxODkgLT4gLTEKK2RpdngzNDYyIGRpdmlkZSAtNTU2Njk1MDE4NTMuNzc1MTAwNjg0MTk0MDQ3MTMzOTMxMEUrNjE0IDA2MTQwMDUzOC4xODYwNDQ2OTMyMzM4MTY1NjY5NzcxODkgLT4gLTkuMDY2NjE0NjQxODkzNzgwNTkwNjc3OTI1NTQzMDA2NzZFKzYxNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDYyIGRpdmlkZWludCAtNTU2Njk1MDE4NTMuNzc1MTAwNjg0MTk0MDQ3MTMzOTMxMEUrNjE0IDA2MTQwMDUzOC4xODYwNDQ2OTMyMzM4MTY1NjY5NzcxODkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDYyIG11bHRpcGx5IC01NTY2OTUwMTg1My43NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MTQgMDYxNDAwNTM4LjE4NjA0NDY5MzIzMzgxNjU2Njk3NzE4OSAtPiAtMy40MTgxMzczNzQzNzA4MDM5MDc4Nzg2NTM4OTcwMzU2NUUrNjMyIEluZXhhY3QgUm91bmRlZAorcG93eDM0NjIgcG93ZXIgLTU1NjY5NTAxODUzLjc3NTEwMDY4NDE5NDA0NzEzMzkzMTBFKzYxNCA2MTQwMDUzOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDYyIHJlbWFpbmRlciAtNTU2Njk1MDE4NTMuNzc1MTAwNjg0MTk0MDQ3MTMzOTMxMEUrNjE0IDA2MTQwMDUzOC4xODYwNDQ2OTMyMzM4MTY1NjY5NzcxODkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDYyIHN1YnRyYWN0IC01NTY2OTUwMTg1My43NzUxMDA2ODQxOTQwNDcxMzM5MzEwRSs2MTQgMDYxNDAwNTM4LjE4NjA0NDY5MzIzMzgxNjU2Njk3NzE4OSAtPiAtNS41NjY5NTAxODUzNzc1MTAwNjg0MTk0MDQ3MTMzOTMxMEUrNjI0IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjMgYWRkIC01Mjc1NjYuNTIxMjczOTkyNDI0NjQ5MzQ2ODM3MzM3NjAyRS00MDggLTgzNDY2Mi41OTk5ODM5NTMzNDU3MTg1MjM4MDcxMjM5NzIgLT4gLTgzNDY2Mi41OTk5ODM5NTMzNDU3MTg1MjM4MDcxMjM5NzIgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2MyBjb21wYXJlIC01Mjc1NjYuNTIxMjczOTkyNDI0NjQ5MzQ2ODM3MzM3NjAyRS00MDggLTgzNDY2Mi41OTk5ODM5NTMzNDU3MTg1MjM4MDcxMjM5NzIgLT4gMQorZGl2eDM0NjMgZGl2aWRlIC01Mjc1NjYuNTIxMjczOTkyNDI0NjQ5MzQ2ODM3MzM3NjAyRS00MDggLTgzNDY2Mi41OTk5ODM5NTMzNDU3MTg1MjM4MDcxMjM5NzIgLT4gNi4zMjA3MTU5NTQ5NzU1MjAxNTY1NjkwOTg5MjMzOTIyNkUtNDA5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NjMgZGl2aWRlaW50IC01Mjc1NjYuNTIxMjczOTkyNDI0NjQ5MzQ2ODM3MzM3NjAyRS00MDggLTgzNDY2Mi41OTk5ODM5NTMzNDU3MTg1MjM4MDcxMjM5NzIgLT4gMAorbXVseDM0NjMgbXVsdGlwbHkgLTUyNzU2Ni41MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwOCAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiAtPiA0LjQwMzQwMDQ0MzExMDQwMTUxOTYwNzYzMTA4MDE5OTU3RS0zOTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ2MyBwb3dlciAtNTI3NTY2LjUyMTI3Mzk5MjQyNDY0OTM0NjgzNzMzNzYwMkUtNDA4IC04MzQ2NjMgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0NjMgcmVtYWluZGVyIC01Mjc1NjYuNTIxMjczOTkyNDI0NjQ5MzQ2ODM3MzM3NjAyRS00MDggLTgzNDY2Mi41OTk5ODM5NTMzNDU3MTg1MjM4MDcxMjM5NzIgLT4gLTUuMjc1NjY1MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwMworc3VieDM0NjMgc3VidHJhY3QgLTUyNzU2Ni41MjEyNzM5OTI0MjQ2NDkzNDY4MzczMzc2MDJFLTQwOCAtODM0NjYyLjU5OTk4Mzk1MzM0NTcxODUyMzgwNzEyMzk3MiAtPiA4MzQ2NjIuNTk5OTgzOTUzMzQ1NzE4NTIzODA3MTIzOTcyIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjQgYWRkIDY5MDY1NTEwLjA0NTk2NTM2OTk0MTgwODM0NTUzMzUzNjYgNjk0ODQ4NjQzODQ4MjEyNTIwMDg2OTYwODg2ODE4MTU3RS04NTMgLT4gNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDY0IGNvbXBhcmUgNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiA2OTQ4NDg2NDM4NDgyMTI1MjAwODY5NjA4ODY4MTgxNTdFLTg1MyAtPiAxCitkaXZ4MzQ2NCBkaXZpZGUgNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiA2OTQ4NDg2NDM4NDgyMTI1MjAwODY5NjA4ODY4MTgxNTdFLTg1MyAtPiA5LjkzOTY0ODEwMjg1Mzk2NjQ2ODg5ODMwOTE5NDkyNjgzRSs4MjcgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ2NCBkaXZpZGVpbnQgNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiA2OTQ4NDg2NDM4NDgyMTI1MjAwODY5NjA4ODY4MTgxNTdFLTg1MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NjQgbXVsdGlwbHkgNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiA2OTQ4NDg2NDM4NDgyMTI1MjAwODY5NjA4ODY4MTgxNTdFLTg1MyAtPiA0Ljc5OTAwNzU5OTIxMjQxMzUyNTYyMzgxMTgxMzMyNzIwRS04MTMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ2NCBwb3dlciA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IDcgLT4gNy40OTU5ODI0OTc2MzQxNjQ4MzgyNDkxOTExODk3MzU2N0UrNTQgSW5leGFjdCBSb3VuZGVkCityZW14MzQ2NCByZW1haW5kZXIgNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiA2OTQ4NDg2NDM4NDgyMTI1MjAwODY5NjA4ODY4MTgxNTdFLTg1MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NjQgc3VidHJhY3QgNjkwNjU1MTAuMDQ1OTY1MzY5OTQxODA4MzQ1NTMzNTM2NiA2OTQ4NDg2NDM4NDgyMTI1MjAwODY5NjA4ODY4MTgxNTdFLTg1MyAtPiA2OTA2NTUxMC4wNDU5NjUzNjk5NDE4MDgzNDU1MzM1MzY2IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjUgYWRkIC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03Mjk5NC42NTIzODQwMjk4MDE3NDcxOTYyNTY5Nzc4ODAzRS03NjMgLT4gLTI5MjE5ODIuODI0MTEyODU1MDUyMjkxMjI4OTAwNDE4NDEgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2NSBjb21wYXJlIC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03Mjk5NC42NTIzODQwMjk4MDE3NDcxOTYyNTY5Nzc4ODAzRS03NjMgLT4gLTEKK2RpdngzNDY1IGRpdmlkZSAtMjkyMTk4Mi44MjQxMTI4NTUwNTIyOTEyMjg5MDA0MTg0MSAtNzI5OTQuNjUyMzg0MDI5ODAxNzQ3MTk2MjU2OTc3ODgwM0UtNzYzIC0+IDQuMDAzMDA5NDM3OTI0NDQ2NjM0Njc3MzIwMjk1MDE3MTZFKzc2NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDY1IGRpdmlkZWludCAtMjkyMTk4Mi44MjQxMTI4NTUwNTIyOTEyMjg5MDA0MTg0MSAtNzI5OTQuNjUyMzg0MDI5ODAxNzQ3MTk2MjU2OTc3ODgwM0UtNzYzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ2NSBtdWx0aXBseSAtMjkyMTk4Mi44MjQxMTI4NTUwNTIyOTEyMjg5MDA0MTg0MSAtNzI5OTQuNjUyMzg0MDI5ODAxNzQ3MTk2MjU2OTc3ODgwM0UtNzYzIC0+IDIuMTMyODkxMjA1MTgyMjM1NDc5MjEyMTI0MTI2NDI0MTFFLTc1MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDY1IHBvd2VyIC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIC03IC0+IC01LjQ5ODY1Mzk0ODcwNjMxMjQ4NDc5NjY4NzgyMTU0MTMxRS00NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDY1IHJlbWFpbmRlciAtMjkyMTk4Mi44MjQxMTI4NTUwNTIyOTEyMjg5MDA0MTg0MSAtNzI5OTQuNjUyMzg0MDI5ODAxNzQ3MTk2MjU2OTc3ODgwM0UtNzYzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ2NSBzdWJ0cmFjdCAtMjkyMTk4Mi44MjQxMTI4NTUwNTIyOTEyMjg5MDA0MTg0MSAtNzI5OTQuNjUyMzg0MDI5ODAxNzQ3MTk2MjU2OTc3ODgwM0UtNzYzIC0+IC0yOTIxOTgyLjgyNDExMjg1NTA1MjI5MTIyODkwMDQxODQxIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjYgYWRkIDQuNTExMTc0NTk0NjY0OTE0NTE0MDE4MzU3NTY1OTM3OTMgMzg3MzM4NS4xOTk4MTgxMTY0MDA2MzE0NDMzODA4NzIzMCAtPiAzODczMzg5LjcxMDk5MjcxMTA2NTU0NTk1NzM5OTIyOTg3IEluZXhhY3QgUm91bmRlZAorY29teDM0NjYgY29tcGFyZSA0LjUxMTE3NDU5NDY2NDkxNDUxNDAxODM1NzU2NTkzNzkzIDM4NzMzODUuMTk5ODE4MTE2NDAwNjMxNDQzMzgwODcyMzAgLT4gLTEKK2RpdngzNDY2IGRpdmlkZSA0LjUxMTE3NDU5NDY2NDkxNDUxNDAxODM1NzU2NTkzNzkzIDM4NzMzODUuMTk5ODE4MTE2NDAwNjMxNDQzMzgwODcyMzAgLT4gMC4wMDAwMDExNjQ2NTk0Mjg4ODMyMjc3Njc1MzA2MjU4MDEwNjM1MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDY2IGRpdmlkZWludCA0LjUxMTE3NDU5NDY2NDkxNDUxNDAxODM1NzU2NTkzNzkzIDM4NzMzODUuMTk5ODE4MTE2NDAwNjMxNDQzMzgwODcyMzAgLT4gMAorbXVseDM0NjYgbXVsdGlwbHkgNC41MTExNzQ1OTQ2NjQ5MTQ1MTQwMTgzNTc1NjU5Mzc5MyAzODczMzg1LjE5OTgxODExNjQwMDYzMTQ0MzM4MDg3MjMwIC0+IDE3NDczNTE2LjkwODc3MDU3MDE2NTIwNjI1NDYxNjQ3MDUgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ2NiBwb3dlciA0LjUxMTE3NDU5NDY2NDkxNDUxNDAxODM1NzU2NTkzNzkzIDM4NzMzODUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ2NiByZW1haW5kZXIgNC41MTExNzQ1OTQ2NjQ5MTQ1MTQwMTgzNTc1NjU5Mzc5MyAzODczMzg1LjE5OTgxODExNjQwMDYzMTQ0MzM4MDg3MjMwIC0+IDQuNTExMTc0NTk0NjY0OTE0NTE0MDE4MzU3NTY1OTM3OTMKK3N1YngzNDY2IHN1YnRyYWN0IDQuNTExMTc0NTk0NjY0OTE0NTE0MDE4MzU3NTY1OTM3OTMgMzg3MzM4NS4xOTk4MTgxMTY0MDA2MzE0NDMzODA4NzIzMCAtPiAtMzg3MzM4MC42ODg2NDM1MjE3MzU3MTY5MjkzNjI1MTQ3MyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDY3IGFkZCA0OTU1Mzc2MzQ3NDY5OC44MTE4NjYxNzU4ODExMDkxMTIwIDM2LjE3MTM4NjEyOTM4OTYyMTY1OTM4NDA4MTc5NTA3ODFFKzQxMCAtPiAzLjYxNzEzODYxMjkzODk2MjE2NTkzODQwODE3OTUwNzgxRSs0MTEgSW5leGFjdCBSb3VuZGVkCitjb214MzQ2NyBjb21wYXJlIDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAgMzYuMTcxMzg2MTI5Mzg5NjIxNjU5Mzg0MDgxNzk1MDc4MUUrNDEwIC0+IC0xCitkaXZ4MzQ2NyBkaXZpZGUgNDk1NTM3NjM0NzQ2OTguODExODY2MTc1ODgxMTA5MTEyMCAzNi4xNzEzODYxMjkzODk2MjE2NTkzODQwODE3OTUwNzgxRSs0MTAgLT4gMS4zNjk5NzEzNzE3NzU0MzQxNjE5MDgxMTgyNzY4NTIzMUUtMzk4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NjcgZGl2aWRlaW50IDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAgMzYuMTcxMzg2MTI5Mzg5NjIxNjU5Mzg0MDgxNzk1MDc4MUUrNDEwIC0+IDAKK211bHgzNDY3IG11bHRpcGx5IDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAgMzYuMTcxMzg2MTI5Mzg5NjIxNjU5Mzg0MDgxNzk1MDc4MUUrNDEwIC0+IDEuNzkyNDI4MzEyODA3Nzc0NjY1NTQyNzEzMzI0MjU3MzVFKzQyNSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDY3IHBvd2VyIDQ5NTUzNzYzNDc0Njk4LjgxMTg2NjE3NTg4MTEwOTExMjAgNCAtPiA2LjAyOTg1MDkxMDk5NzMwMjM2NjM1OTU0ODAxNDc0ODAyRSs1NCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDY3IHJlbWFpbmRlciA0OTU1Mzc2MzQ3NDY5OC44MTE4NjYxNzU4ODExMDkxMTIwIDM2LjE3MTM4NjEyOTM4OTYyMTY1OTM4NDA4MTc5NTA3ODFFKzQxMCAtPiA0OTU1Mzc2MzQ3NDY5OC44MTE4NjYxNzU4ODExMDkxMTIwCitzdWJ4MzQ2NyBzdWJ0cmFjdCA0OTU1Mzc2MzQ3NDY5OC44MTE4NjYxNzU4ODExMDkxMTIwIDM2LjE3MTM4NjEyOTM4OTYyMTY1OTM4NDA4MTc5NTA3ODFFKzQxMCAtPiAtMy42MTcxMzg2MTI5Mzg5NjIxNjU5Mzg0MDgxNzk1MDc4MUUrNDExIEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjggYWRkIDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3NDY5MjEwOTU1Njk5NzE0NzczNzM2NDM0ODcyODU3ODAgLT4gNy41NTk4NTU4MzM0NDM3OTk1MTUwNjA3MTQ5OTE3MDc0OUUrOTY3IEluZXhhY3QgUm91bmRlZAorY29teDM0NjggY29tcGFyZSA3NTU5ODU1ODMzNDQuMzc5OTUxNTA2MDcxNDk5MTcwNzQ5RSs5NTYgNzQ2OTIxMDk1NTY5OTcxNDc3MzczNjQzNDg3Mjg1NzgwIC0+IDEKK2RpdngzNDY4IGRpdmlkZSA3NTU5ODU1ODMzNDQuMzc5OTUxNTA2MDcxNDk5MTcwNzQ5RSs5NTYgNzQ2OTIxMDk1NTY5OTcxNDc3MzczNjQzNDg3Mjg1NzgwIC0+IDEuMDEyMTM1ODAzNjcyMTI4NzMwMjU2NzE5MTY3NTg2NjlFKzkzNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDY4IGRpdmlkZWludCA3NTU5ODU1ODMzNDQuMzc5OTUxNTA2MDcxNDk5MTcwNzQ5RSs5NTYgNzQ2OTIxMDk1NTY5OTcxNDc3MzczNjQzNDg3Mjg1NzgwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ2OCBtdWx0aXBseSA3NTU5ODU1ODMzNDQuMzc5OTUxNTA2MDcxNDk5MTcwNzQ5RSs5NTYgNzQ2OTIxMDk1NTY5OTcxNDc3MzczNjQzNDg3Mjg1NzgwIC0+IDUuNjQ2NjE1ODAxNDY2ODgyNTUyODY5MzM3NTM2MTY1ODBFKzEwMDAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ2OCBwb3dlciA3NTU5ODU1ODMzNDQuMzc5OTUxNTA2MDcxNDk5MTcwNzQ5RSs5NTYgNyAtPiAxLjQxMTIxOTU4NTE2NTQ3NzI1Njc3MTQyOTgxMzc1NDY5RSs2Nzc1IEluZXhhY3QgUm91bmRlZAorcmVteDM0NjggcmVtYWluZGVyIDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3NDY5MjEwOTU1Njk5NzE0NzczNzM2NDM0ODcyODU3ODAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDY4IHN1YnRyYWN0IDc1NTk4NTU4MzM0NC4zNzk5NTE1MDYwNzE0OTkxNzA3NDlFKzk1NiA3NDY5MjEwOTU1Njk5NzE0NzczNzM2NDM0ODcyODU3ODAgLT4gNy41NTk4NTU4MzM0NDM3OTk1MTUwNjA3MTQ5OTE3MDc0OUUrOTY3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NjkgYWRkIC0yMDEwMTY2ODU0MS43NDcyMjYwNDk3NTk0MjMwMTA1NDU2IC0zOTU1NjIxNDguMzQ1MDAzOTMxMTYxNTMyMTAxMTA5OTY0IC0+IC0yMDQ5NzIzMDY5MC4wOTIyMjk5ODA5MjA5NTUxMTE2NTU2IEluZXhhY3QgUm91bmRlZAorY29teDM0NjkgY29tcGFyZSAtMjAxMDE2Njg1NDEuNzQ3MjI2MDQ5NzU5NDIzMDEwNTQ1NiAtMzk1NTYyMTQ4LjM0NTAwMzkzMTE2MTUzMjEwMTEwOTk2NCAtPiAtMQorZGl2eDM0NjkgZGl2aWRlIC0yMDEwMTY2ODU0MS43NDcyMjYwNDk3NTk0MjMwMTA1NDU2IC0zOTU1NjIxNDguMzQ1MDAzOTMxMTYxNTMyMTAxMTA5OTY0IC0+IDUwLjgxNzk3Nzk3MzUwMTIwNTM2NjE0NDc4NzM2NjY4MTYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ2OSBkaXZpZGVpbnQgLTIwMTAxNjY4NTQxLjc0NzIyNjA0OTc1OTQyMzAxMDU0NTYgLTM5NTU2MjE0OC4zNDUwMDM5MzExNjE1MzIxMDExMDk5NjQgLT4gNTAKK211bHgzNDY5IG11bHRpcGx5IC0yMDEwMTY2ODU0MS43NDcyMjYwNDk3NTk0MjMwMTA1NDU2IC0zOTU1NjIxNDguMzQ1MDAzOTMxMTYxNTMyMTAxMTA5OTY0IC0+IDc5NTE0NTkxOTM2OTI3MTUwNzkuMDkzMjg3NjAwMTY5MTQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ2OSBwb3dlciAtMjAxMDE2Njg1NDEuNzQ3MjI2MDQ5NzU5NDIzMDEwNTQ1NiAtMzk1NTYyMTQ4IC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDY5IHJlbWFpbmRlciAtMjAxMDE2Njg1NDEuNzQ3MjI2MDQ5NzU5NDIzMDEwNTQ1NiAtMzk1NTYyMTQ4LjM0NTAwMzkzMTE2MTUzMjEwMTEwOTk2NCAtPiAtMzIzNTYxMTI0LjQ5NzAyOTQ5MTY4MjgxNzk1NTA0NzQwMAorc3VieDM0Njkgc3VidHJhY3QgLTIwMTAxNjY4NTQxLjc0NzIyNjA0OTc1OTQyMzAxMDU0NTYgLTM5NTU2MjE0OC4zNDUwMDM5MzExNjE1MzIxMDExMDk5NjQgLT4gLTE5NzA2MTA2MzkzLjQwMjIyMjExODU5Nzg5MDkwOTQzNTYgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3MCBhZGQgNTU4MzkwMy4xODA3MjEwMDcxNjA3MjAxMTI2NDY2ODYzMSA0NjA4Njg5MTQ2OTQuMDg4Mzg3MDY3NDUxMzEyNTAwNzIzIC0+IDQ2MDg3NDQ5ODU5Ny4yNjkxMDgwNzQ2MTIwMzI2MTMzNzAgSW5leGFjdCBSb3VuZGVkCitjb214MzQ3MCBjb21wYXJlIDU1ODM5MDMuMTgwNzIxMDA3MTYwNzIwMTEyNjQ2Njg2MzEgNDYwODY4OTE0Njk0LjA4ODM4NzA2NzQ1MTMxMjUwMDcyMyAtPiAtMQorZGl2eDM0NzAgZGl2aWRlIDU1ODM5MDMuMTgwNzIxMDA3MTYwNzIwMTEyNjQ2Njg2MzEgNDYwODY4OTE0Njk0LjA4ODM4NzA2NzQ1MTMxMjUwMDcyMyAtPiAwLjAwMDAxMjExNjAzMzQzNzQ2MzMyNDAxNjgwNjg0MDU0NjczMDcgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ3MCBkaXZpZGVpbnQgNTU4MzkwMy4xODA3MjEwMDcxNjA3MjAxMTI2NDY2ODYzMSA0NjA4Njg5MTQ2OTQuMDg4Mzg3MDY3NDUxMzEyNTAwNzIzIC0+IDAKK211bHgzNDcwIG11bHRpcGx5IDU1ODM5MDMuMTgwNzIxMDA3MTYwNzIwMTEyNjQ2Njg2MzEgNDYwODY4OTE0Njk0LjA4ODM4NzA2NzQ1MTMxMjUwMDcyMyAtPiAyNTczNDQ3Mzk4NjU1NzU4NjU5LjM5NDc1NjcyOTA1MjI1IEluZXhhY3QgUm91bmRlZAorcG93eDM0NzAgcG93ZXIgNTU4MzkwMy4xODA3MjEwMDcxNjA3MjAxMTI2NDY2ODYzMSA1IC0+IDUuNDI4NjE5NDM1ODk0MTg2MDMyOTg2NzA0NTQ3MDI5MDFFKzMzIEluZXhhY3QgUm91bmRlZAorcmVteDM0NzAgcmVtYWluZGVyIDU1ODM5MDMuMTgwNzIxMDA3MTYwNzIwMTEyNjQ2Njg2MzEgNDYwODY4OTE0Njk0LjA4ODM4NzA2NzQ1MTMxMjUwMDcyMyAtPiA1NTgzOTAzLjE4MDcyMTAwNzE2MDcyMDExMjY0NjY4NjMxCitzdWJ4MzQ3MCBzdWJ0cmFjdCA1NTgzOTAzLjE4MDcyMTAwNzE2MDcyMDExMjY0NjY4NjMxIDQ2MDg2ODkxNDY5NC4wODgzODcwNjc0NTEzMTI1MDA3MjMgLT4gLTQ2MDg2MzMzMDc5MC45MDc2NjYwNjAyOTA1OTIzODgwNzYgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3MSBhZGQgLTk1NTYzODM5Nzk3NTI0MDY4NTAxNzk5MjQzNjExNjI1N0UrMDIwIC01MDg1ODAuMTQ4OTU4NzY5MTA0NTExNzUxOTc1NzIwNDcwRSs2NjIgLT4gLTUuMDg1ODAxNDg5NTg3NjkxMDQ1MTE3NTE5NzU3MjA0NzBFKzY2NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDcxIGNvbXBhcmUgLTk1NTYzODM5Nzk3NTI0MDY4NTAxNzk5MjQzNjExNjI1N0UrMDIwIC01MDg1ODAuMTQ4OTU4NzY5MTA0NTExNzUxOTc1NzIwNDcwRSs2NjIgLT4gMQorZGl2eDM0NzEgZGl2aWRlIC05NTU2MzgzOTc5NzUyNDA2ODUwMTc5OTI0MzYxMTYyNTdFKzAyMCAtNTA4NTgwLjE0ODk1ODc2OTEwNDUxMTc1MTk3NTcyMDQ3MEUrNjYyIC0+IDEuODc5MDMyMDQ2MjQwMzk0NzY0MDgxOTEyNjQ1NjQ1NjhFLTYxNSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDcxIGRpdmlkZWludCAtOTU1NjM4Mzk3OTc1MjQwNjg1MDE3OTkyNDM2MTE2MjU3RSswMjAgLTUwODU4MC4xNDg5NTg3NjkxMDQ1MTE3NTE5NzU3MjA0NzBFKzY2MiAtPiAwCittdWx4MzQ3MSBtdWx0aXBseSAtOTU1NjM4Mzk3OTc1MjQwNjg1MDE3OTkyNDM2MTE2MjU3RSswMjAgLTUwODU4MC4xNDg5NTg3NjkxMDQ1MTE3NTE5NzU3MjA0NzBFKzY2MiAtPiA0Ljg2MDE4NzE4NzkyOTY3Mzc4OTg1ODM4NzM5ODIwMTA4RSs3MjAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3MSBwb3dlciAtOTU1NjM4Mzk3OTc1MjQwNjg1MDE3OTkyNDM2MTE2MjU3RSswMjAgLTUgLT4gLTEuMjU0Njc3MzA0MjAzMDQxODkxNjE3Njg0MDg0NjI0MTRFLTI2NSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDcxIHJlbWFpbmRlciAtOTU1NjM4Mzk3OTc1MjQwNjg1MDE3OTkyNDM2MTE2MjU3RSswMjAgLTUwODU4MC4xNDg5NTg3NjkxMDQ1MTE3NTE5NzU3MjA0NzBFKzY2MiAtPiAtOS41NTYzODM5Nzk3NTI0MDY4NTAxNzk5MjQzNjExNjI1N0UrNTIKK3N1YngzNDcxIHN1YnRyYWN0IC05NTU2MzgzOTc5NzUyNDA2ODUwMTc5OTI0MzYxMTYyNTdFKzAyMCAtNTA4NTgwLjE0ODk1ODc2OTEwNDUxMTc1MTk3NTcyMDQ3MEUrNjYyIC0+IDUuMDg1ODAxNDg5NTg3NjkxMDQ1MTE3NTE5NzU3MjA0NzBFKzY2NyBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDcyIGFkZCAtMTM2MjQzNzk2MDk4MDIwOTgzODE0MTE1NTg0NDAyNDA3RSs3OTYgNjU4OTEwODA4My45OTc1MDMxMTY1MTU4MTAzMjQ0NzM5MCAtPiAtMS4zNjI0Mzc5NjA5ODAyMDk4MzgxNDExNTU4NDQwMjQwN0UrODI4IEluZXhhY3QgUm91bmRlZAorY29teDM0NzIgY29tcGFyZSAtMTM2MjQzNzk2MDk4MDIwOTgzODE0MTE1NTg0NDAyNDA3RSs3OTYgNjU4OTEwODA4My45OTc1MDMxMTY1MTU4MTAzMjQ0NzM5MCAtPiAtMQorZGl2eDM0NzIgZGl2aWRlIC0xMzYyNDM3OTYwOTgwMjA5ODM4MTQxMTU1ODQ0MDI0MDdFKzc5NiA2NTg5MTA4MDgzLjk5NzUwMzExNjUxNTgxMDMyNDQ3MzkwIC0+IC0yLjA2NzcxMjI2NjM4MjU1NjAwNjM0OTM5MzcxMzY1OTIwRSs4MTggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ3MiBkaXZpZGVpbnQgLTEzNjI0Mzc5NjA5ODAyMDk4MzgxNDExNTU4NDQwMjQwN0UrNzk2IDY1ODkxMDgwODMuOTk3NTAzMTE2NTE1ODEwMzI0NDczOTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDcyIG11bHRpcGx5IC0xMzYyNDM3OTYwOTgwMjA5ODM4MTQxMTU1ODQ0MDI0MDdFKzc5NiA2NTg5MTA4MDgzLjk5NzUwMzExNjUxNTgxMDMyNDQ3MzkwIC0+IC04Ljk3NzI1MDk4MjYzOTc3NTM1OTY2OTIxNjk2MTQzMDExRSs4MzcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3MiBwb3dlciAtMTM2MjQzNzk2MDk4MDIwOTgzODE0MTE1NTg0NDAyNDA3RSs3OTYgNyAtPiAtOC43MTM5OTE4NTU1MTc0MjE5OTc1MjgzMjI4Njk4NDAwNUUrNTc5NiBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDcyIHJlbWFpbmRlciAtMTM2MjQzNzk2MDk4MDIwOTgzODE0MTE1NTg0NDAyNDA3RSs3OTYgNjU4OTEwODA4My45OTc1MDMxMTY1MTU4MTAzMjQ0NzM5MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NzIgc3VidHJhY3QgLTEzNjI0Mzc5NjA5ODAyMDk4MzgxNDExNTU4NDQwMjQwN0UrNzk2IDY1ODkxMDgwODMuOTk3NTAzMTE2NTE1ODEwMzI0NDczOTAgLT4gLTEuMzYyNDM3OTYwOTgwMjA5ODM4MTQxMTU1ODQ0MDI0MDdFKzgyOCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDczIGFkZCAtODA4NDk4LjQ4MjcxODMwNDU5ODIxMzA5MjkzNzU0MzkzNEUrNTIxIDQ4MDA1LjE0NjUwOTc5MTQzNTUwOTYzMDE0ODM3ODg5MDUgLT4gLTguMDg0OTg0ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyNiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDczIGNvbXBhcmUgLTgwODQ5OC40ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyMSA0ODAwNS4xNDY1MDk3OTE0MzU1MDk2MzAxNDgzNzg4OTA1IC0+IC0xCitkaXZ4MzQ3MyBkaXZpZGUgLTgwODQ5OC40ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyMSA0ODAwNS4xNDY1MDk3OTE0MzU1MDk2MzAxNDgzNzg4OTA1IC0+IC0xLjY4NDE5MTI2MTc3MTA2NDY4NTY1Mzk3MDE3MTA3NzM2RSs1MjIgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ3MyBkaXZpZGVpbnQgLTgwODQ5OC40ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyMSA0ODAwNS4xNDY1MDk3OTE0MzU1MDk2MzAxNDgzNzg4OTA1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ3MyBtdWx0aXBseSAtODA4NDk4LjQ4MjcxODMwNDU5ODIxMzA5MjkzNzU0MzkzNEUrNTIxIDQ4MDA1LjE0NjUwOTc5MTQzNTUwOTYzMDE0ODM3ODg5MDUgLT4gLTMuODgxMjA4ODExNTgzNjI5MTIyMjAxMzI2OTE4MDM1MzlFKzUzMSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDczIHBvd2VyIC04MDg0OTguNDgyNzE4MzA0NTk4MjEzMDkyOTM3NTQzOTM0RSs1MjEgNDgwMDUgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0NzMgcmVtYWluZGVyIC04MDg0OTguNDgyNzE4MzA0NTk4MjEzMDkyOTM3NTQzOTM0RSs1MjEgNDgwMDUuMTQ2NTA5NzkxNDM1NTA5NjMwMTQ4Mzc4ODkwNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0NzMgc3VidHJhY3QgLTgwODQ5OC40ODI3MTgzMDQ1OTgyMTMwOTI5Mzc1NDM5MzRFKzUyMSA0ODAwNS4xNDY1MDk3OTE0MzU1MDk2MzAxNDgzNzg4OTA1IC0+IC04LjA4NDk4NDgyNzE4MzA0NTk4MjEzMDkyOTM3NTQzOTM0RSs1MjYgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3NCBhZGQgLTgxMi4yNjYzNDA1NTQyODEzMDU5ODU1MjQ4MTMwNzQyMTFFKzM5NiAtMzE5NS42MzExMTU1OTExNDAwMTU5NDI1NzQ0ODk3MDgxMkUrOTg2IC0+IC0zLjE5NTYzMTExNTU5MTE0MDAxNTk0MjU3NDQ4OTcwODEyRSs5ODkgSW5leGFjdCBSb3VuZGVkCitjb214MzQ3NCBjb21wYXJlIC04MTIuMjY2MzQwNTU0MjgxMzA1OTg1NTI0ODEzMDc0MjExRSszOTYgLTMxOTUuNjMxMTE1NTkxMTQwMDE1OTQyNTc0NDg5NzA4MTJFKzk4NiAtPiAxCitkaXZ4MzQ3NCBkaXZpZGUgLTgxMi4yNjYzNDA1NTQyODEzMDU5ODU1MjQ4MTMwNzQyMTFFKzM5NiAtMzE5NS42MzExMTU1OTExNDAwMTU5NDI1NzQ0ODk3MDgxMkUrOTg2IC0+IDIuNTQxODAyNTc3MjQ3Nzk3MjE0NDg0ODQ3ODEwNTYwNDBFLTU5MSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDc0IGRpdmlkZWludCAtODEyLjI2NjM0MDU1NDI4MTMwNTk4NTUyNDgxMzA3NDIxMUUrMzk2IC0zMTk1LjYzMTExNTU5MTE0MDAxNTk0MjU3NDQ4OTcwODEyRSs5ODYgLT4gMAorbXVseDM0NzQgbXVsdGlwbHkgLTgxMi4yNjYzNDA1NTQyODEzMDU5ODU1MjQ4MTMwNzQyMTFFKzM5NiAtMzE5NS42MzExMTU1OTExNDAwMTU5NDI1NzQ0ODk3MDgxMkUrOTg2IC0+IDIuNTk1NzAzNTkyMDIyNjEwODI1Mzc1MDUzMzIzMjU0MDRFKzEzODggSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3NCBwb3dlciAtODEyLjI2NjM0MDU1NDI4MTMwNTk4NTUyNDgxMzA3NDIxMUUrMzk2IC0zIC0+IC0xLjg2NTk2OTg4MDMwOTE0NjE2MjE2NzQxODA4MjE2NDY5RS0xMTk3IEluZXhhY3QgUm91bmRlZAorcmVteDM0NzQgcmVtYWluZGVyIC04MTIuMjY2MzQwNTU0MjgxMzA1OTg1NTI0ODEzMDc0MjExRSszOTYgLTMxOTUuNjMxMTE1NTkxMTQwMDE1OTQyNTc0NDg5NzA4MTJFKzk4NiAtPiAtOC4xMjI2NjM0MDU1NDI4MTMwNTk4NTUyNDgxMzA3NDIxMUUrMzk4CitzdWJ4MzQ3NCBzdWJ0cmFjdCAtODEyLjI2NjM0MDU1NDI4MTMwNTk4NTUyNDgxMzA3NDIxMUUrMzk2IC0zMTk1LjYzMTExNTU5MTE0MDAxNTk0MjU3NDQ4OTcwODEyRSs5ODYgLT4gMy4xOTU2MzExMTU1OTExNDAwMTU5NDI1NzQ0ODk3MDgxMkUrOTg5IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NzUgYWRkIC05Mjk4ODkuNzIwOTA1MTgzMzk3Njc4ODY2NjQ4MjE3NzkzRSsxMzQgLTI4MDMwMDE5MDc3NC4wNTc1OTU2NzEwNzkyNjQ4NDEzNDkgLT4gLTkuMjk4ODk3MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzOSBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDc1IGNvbXBhcmUgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMjgwMzAwMTkwNzc0LjA1NzU5NTY3MTA3OTI2NDg0MTM0OSAtPiAtMQorZGl2eDM0NzUgZGl2aWRlIC05Mjk4ODkuNzIwOTA1MTgzMzk3Njc4ODY2NjQ4MjE3NzkzRSsxMzQgLTI4MDMwMDE5MDc3NC4wNTc1OTU2NzEwNzkyNjQ4NDEzNDkgLT4gMy4zMTc0NzgwMTY0Njk2NDM5OTMzMTU1Njk3MTA1NTE5N0UrMTI4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NzUgZGl2aWRlaW50IC05Mjk4ODkuNzIwOTA1MTgzMzk3Njc4ODY2NjQ4MjE3NzkzRSsxMzQgLTI4MDMwMDE5MDc3NC4wNTc1OTU2NzEwNzkyNjQ4NDEzNDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDc1IG11bHRpcGx5IC05Mjk4ODkuNzIwOTA1MTgzMzk3Njc4ODY2NjQ4MjE3NzkzRSsxMzQgLTI4MDMwMDE5MDc3NC4wNTc1OTU2NzEwNzkyNjQ4NDEzNDkgLT4gMi42MDY0ODI2NjE2ODU1ODA3OTk1NzM0OTA3NDYwOTkyMEUrMTUxIEluZXhhY3QgUm91bmRlZAorcG93eDM0NzUgcG93ZXIgLTkyOTg4OS43MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzNCAtMyAtPiAtMS4yNDM2NzE0MzM3MDMwMDE4OTUxODc3ODUwNTgzMDE4MUUtNDIwIEluZXhhY3QgUm91bmRlZAorcmVteDM0NzUgcmVtYWluZGVyIC05Mjk4ODkuNzIwOTA1MTgzMzk3Njc4ODY2NjQ4MjE3NzkzRSsxMzQgLTI4MDMwMDE5MDc3NC4wNTc1OTU2NzEwNzkyNjQ4NDEzNDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDc1IHN1YnRyYWN0IC05Mjk4ODkuNzIwOTA1MTgzMzk3Njc4ODY2NjQ4MjE3NzkzRSsxMzQgLTI4MDMwMDE5MDc3NC4wNTc1OTU2NzEwNzkyNjQ4NDEzNDkgLT4gLTkuMjk4ODk3MjA5MDUxODMzOTc2Nzg4NjY2NDgyMTc3OTNFKzEzOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDc2IGFkZCA4Mzk0Ni4wMTU3ODAxOTUzNjM2MjU1MDc4OTk2MTg1NTQwIDQ5MjY3MDM3My4yMzUzOTE2NjU3NTg3MDE1MDAzMTQ0NzMgLT4gNDkyNzU0MzE5LjI1MTE3MTg2MTEyMjMyNzAwODIxNDA5MiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDc2IGNvbXBhcmUgODM5NDYuMDE1NzgwMTk1MzYzNjI1NTA3ODk5NjE4NTU0MCA0OTI2NzAzNzMuMjM1MzkxNjY1NzU4NzAxNTAwMzE0NDczIC0+IC0xCitkaXZ4MzQ3NiBkaXZpZGUgODM5NDYuMDE1NzgwMTk1MzYzNjI1NTA3ODk5NjE4NTU0MCA0OTI2NzAzNzMuMjM1MzkxNjY1NzU4NzAxNTAwMzE0NDczIC0+IDAuMDAwMTcwMzg5ODE5MTE3NjMzNDg1Njk1ODkwMDQxMTg1NzgyIEluZXhhY3QgUm91bmRlZAorZHZpeDM0NzYgZGl2aWRlaW50IDgzOTQ2LjAxNTc4MDE5NTM2MzYyNTUwNzg5OTYxODU1NDAgNDkyNjcwMzczLjIzNTM5MTY2NTc1ODcwMTUwMDMxNDQ3MyAtPiAwCittdWx4MzQ3NiBtdWx0aXBseSA4Mzk0Ni4wMTU3ODAxOTUzNjM2MjU1MDc4OTk2MTg1NTQwIDQ5MjY3MDM3My4yMzUzOTE2NjU3NTg3MDE1MDAzMTQ0NzMgLT4gNDEzNTc3MTQ5MjYwNTIuOTI4Mjk4NTU2MDM4MDA2NDY0OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDc2IHBvd2VyIDgzOTQ2LjAxNTc4MDE5NTM2MzYyNTUwNzg5OTYxODU1NDAgNDkyNjcwMzczIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0NzYgcmVtYWluZGVyIDgzOTQ2LjAxNTc4MDE5NTM2MzYyNTUwNzg5OTYxODU1NDAgNDkyNjcwMzczLjIzNTM5MTY2NTc1ODcwMTUwMDMxNDQ3MyAtPiA4Mzk0Ni4wMTU3ODAxOTUzNjM2MjU1MDc4OTk2MTg1NTQwCitzdWJ4MzQ3NiBzdWJ0cmFjdCA4Mzk0Ni4wMTU3ODAxOTUzNjM2MjU1MDc4OTk2MTg1NTQwIDQ5MjY3MDM3My4yMzUzOTE2NjU3NTg3MDE1MDAzMTQ0NzMgLT4gLTQ5MjU4NjQyNy4yMTk2MTE0NzAzOTUwNzU5OTI0MTQ4NTQgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3NyBhZGQgNzgxMjc1ODExMzgxNy45OTEzNTg1MTgyNTIyMzEyMjUwOCAzMDM3NDkyLjM2NzE2MzAxNDQzMzA5NTcxOTE4MDAyMTIzRS0xNTcgLT4gNzgxMjc1ODExMzgxNy45OTEzNTg1MTgyNTIyMzEyMjUwOCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDc3IGNvbXBhcmUgNzgxMjc1ODExMzgxNy45OTEzNTg1MTgyNTIyMzEyMjUwOCAzMDM3NDkyLjM2NzE2MzAxNDQzMzA5NTcxOTE4MDAyMTIzRS0xNTcgLT4gMQorZGl2eDM0NzcgZGl2aWRlIDc4MTI3NTgxMTM4MTcuOTkxMzU4NTE4MjUyMjMxMjI1MDggMzAzNzQ5Mi4zNjcxNjMwMTQ0MzMwOTU3MTkxODAwMjEyM0UtMTU3IC0+IDIuNTcyMTA3OTAwMDE1OTAxNzE4MDk1MTI4NzE4NTczODFFKzE2MyBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDc3IGRpdmlkZWludCA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IDMwMzc0OTIuMzY3MTYzMDE0NDMzMDk1NzE5MTgwMDIxMjNFLTE1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NzcgbXVsdGlwbHkgNzgxMjc1ODExMzgxNy45OTEzNTg1MTgyNTIyMzEyMjUwOCAzMDM3NDkyLjM2NzE2MzAxNDQzMzA5NTcxOTE4MDAyMTIzRS0xNTcgLT4gMi4zNzMxMTkzMTM3MjEzMDU4MzEzNjA5MTcxNzA5MzkzNUUtMTM4IEluZXhhY3QgUm91bmRlZAorcG93eDM0NzcgcG93ZXIgNzgxMjc1ODExMzgxNy45OTEzNTg1MTgyNTIyMzEyMjUwOCAzIC0+IDQuNzY4ODQ0MjE4MTYyNDY4OTYwOTA0MTQzMTQ5MzQyNTNFKzM4IEluZXhhY3QgUm91bmRlZAorcmVteDM0NzcgcmVtYWluZGVyIDc4MTI3NTgxMTM4MTcuOTkxMzU4NTE4MjUyMjMxMjI1MDggMzAzNzQ5Mi4zNjcxNjMwMTQ0MzMwOTU3MTkxODAwMjEyM0UtMTU3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ3NyBzdWJ0cmFjdCA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IDMwMzc0OTIuMzY3MTYzMDE0NDMzMDk1NzE5MTgwMDIxMjNFLTE1NyAtPiA3ODEyNzU4MTEzODE3Ljk5MTM1ODUxODI1MjIzMTIyNTA4IEluZXhhY3QgUm91bmRlZAorYWRkeDM0NzggYWRkIDQ4OTE5MTc0Ny4xNDg2NzQzMjY3NTc3NjczNTY2MjYwMTYgMDExMzY5NDIuMTE4MjI3NzU4MDA5MzAyNzc2ODQ5MDU0NSAtPiA0OTAzMjg2ODkuMjY2OTAyMDg0NzY3MDcwMTMzNDc1MDcxIEluZXhhY3QgUm91bmRlZAorY29teDM0NzggY29tcGFyZSA0ODkxOTE3NDcuMTQ4Njc0MzI2NzU3NzY3MzU2NjI2MDE2IDAxMTM2OTQyLjExODIyNzc1ODAwOTMwMjc3Njg0OTA1NDUgLT4gMQorZGl2eDM0NzggZGl2aWRlIDQ4OTE5MTc0Ny4xNDg2NzQzMjY3NTc3NjczNTY2MjYwMTYgMDExMzY5NDIuMTE4MjI3NzU4MDA5MzAyNzc2ODQ5MDU0NSAtPiA0MzAuMjY5NzAyNjU3NTI1MjIzMTI0MTQ4MjU4NjQxMzU4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0NzggZGl2aWRlaW50IDQ4OTE5MTc0Ny4xNDg2NzQzMjY3NTc3NjczNTY2MjYwMTYgMDExMzY5NDIuMTE4MjI3NzU4MDA5MzAyNzc2ODQ5MDU0NSAtPiA0MzAKK211bHgzNDc4IG11bHRpcGx5IDQ4OTE5MTc0Ny4xNDg2NzQzMjY3NTc3NjczNTY2MjYwMTYgMDExMzY5NDIuMTE4MjI3NzU4MDA5MzAyNzc2ODQ5MDU0NSAtPiA1NTYxODI3MDEyMjI3NTEuNTg4NDU0MTI5NTE4ODMwNTUwIEluZXhhY3QgUm91bmRlZAorcG93eDM0NzggcG93ZXIgNDg5MTkxNzQ3LjE0ODY3NDMyNjc1Nzc2NzM1NjYyNjAxNiAxMTM2OTQyIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0NzggcmVtYWluZGVyIDQ4OTE5MTc0Ny4xNDg2NzQzMjY3NTc3NjczNTY2MjYwMTYgMDExMzY5NDIuMTE4MjI3NzU4MDA5MzAyNzc2ODQ5MDU0NSAtPiAzMDY2MzYuMzEwNzM4MzgyNzU3NTczMzExNTMyNTgxMAorc3VieDM0Nzggc3VidHJhY3QgNDg5MTkxNzQ3LjE0ODY3NDMyNjc1Nzc2NzM1NjYyNjAxNiAwMTEzNjk0Mi4xMTgyMjc3NTgwMDkzMDI3NzY4NDkwNTQ1IC0+IDQ4ODA1NDgwNS4wMzA0NDY1Njg3NDg0NjQ1Nzk3NzY5NjIgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ3OSBhZGQgLTU5OTM2OTU0MC4zNzMxNzQ0ODIzMzU4NjU1Njc5Mzc4NTNFKzI4OSAtMzgyODgzODMyMDUuNjc0OTQzOTU4ODcwNzk1NTU4NTIwOSAtPiAtNS45OTM2OTU0MDM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjk3IEluZXhhY3QgUm91bmRlZAorY29teDM0NzkgY29tcGFyZSAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC0zODI4ODM4MzIwNS42NzQ5NDM5NTg4NzA3OTU1NTg1MjA5IC0+IC0xCitkaXZ4MzQ3OSBkaXZpZGUgLTU5OTM2OTU0MC4zNzMxNzQ0ODIzMzU4NjU1Njc5Mzc4NTNFKzI4OSAtMzgyODgzODMyMDUuNjc0OTQzOTU4ODcwNzk1NTU4NTIwOSAtPiAxLjU2NTQwODMzMDY1MDg5Njg0MTMyNjg4MTQzNzM3NTg2RSsyODcgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ3OSBkaXZpZGVpbnQgLTU5OTM2OTU0MC4zNzMxNzQ0ODIzMzU4NjU1Njc5Mzc4NTNFKzI4OSAtMzgyODgzODMyMDUuNjc0OTQzOTU4ODcwNzk1NTU4NTIwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0NzkgbXVsdGlwbHkgLTU5OTM2OTU0MC4zNzMxNzQ0ODIzMzU4NjU1Njc5Mzc4NTNFKzI4OSAtMzgyODgzODMyMDUuNjc0OTQzOTU4ODcwNzk1NTU4NTIwOSAtPiAyLjI5NDg4OTA2NDM2MTczNjQxMzI0MDkxNjM4OTYzNzE1RSszMDggSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ3OSBwb3dlciAtNTk5MzY5NTQwLjM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjg5IC00IC0+IDcuNzQ4NTY1ODA2NDYyOTEzNjYyNzAzMjkxNjU1NDA5NThFLTExOTIgSW5leGFjdCBSb3VuZGVkCityZW14MzQ3OSByZW1haW5kZXIgLTU5OTM2OTU0MC4zNzMxNzQ0ODIzMzU4NjU1Njc5Mzc4NTNFKzI4OSAtMzgyODgzODMyMDUuNjc0OTQzOTU4ODcwNzk1NTU4NTIwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0Nzkgc3VidHJhY3QgLTU5OTM2OTU0MC4zNzMxNzQ0ODIzMzU4NjU1Njc5Mzc4NTNFKzI4OSAtMzgyODgzODMyMDUuNjc0OTQzOTU4ODcwNzk1NTU4NTIwOSAtPiAtNS45OTM2OTU0MDM3MzE3NDQ4MjMzNTg2NTU2NzkzNzg1M0UrMjk3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0ODAgYWRkIC0zMzc2ODgzODcwLjg1OTYxNjkyMTQ4MDIyNTIxOTYwMTM5IC02NTI0NzQ4OTQ0OS43MzM0NTg5NzMxMTcxOTgwNDA4Mjg0IC0+IC02ODYyNDM3MzMyMC41OTMwNzU4OTQ1OTc0MjMyNjA0Mjk4IEluZXhhY3QgUm91bmRlZAorY29teDM0ODAgY29tcGFyZSAtMzM3Njg4Mzg3MC44NTk2MTY5MjE0ODAyMjUyMTk2MDEzOSAtNjUyNDc0ODk0NDkuNzMzNDU4OTczMTE3MTk4MDQwODI4NCAtPiAxCitkaXZ4MzQ4MCBkaXZpZGUgLTMzNzY4ODM4NzAuODU5NjE2OTIxNDgwMjI1MjE5NjAxMzkgLTY1MjQ3NDg5NDQ5LjczMzQ1ODk3MzExNzE5ODA0MDgyODQgLT4gMC4wNTE3NTUwMDA4MzM1NzQ3ODEzNTk2MzMyNDA0NjY0NzMxIEluZXhhY3QgUm91bmRlZAorZHZpeDM0ODAgZGl2aWRlaW50IC0zMzc2ODgzODcwLjg1OTYxNjkyMTQ4MDIyNTIxOTYwMTM5IC02NTI0NzQ4OTQ0OS43MzM0NTg5NzMxMTcxOTgwNDA4Mjg0IC0+IDAKK211bHgzNDgwIG11bHRpcGx5IC0zMzc2ODgzODcwLjg1OTYxNjkyMTQ4MDIyNTIxOTYwMTM5IC02NTI0NzQ4OTQ0OS43MzM0NTg5NzMxMTcxOTgwNDA4Mjg0IC0+IDIyMDMzMzE5NDczNjg4NzkzOTQyMC43MTk1Nzk5MDYyNTcgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ4MCBwb3dlciAtMzM3Njg4Mzg3MC44NTk2MTY5MjE0ODAyMjUyMTk2MDEzOSAtNyAtPiAtMS45OTcwNDE2MzcxODM2MTE1MzEyNTczNTc1NjE3OTI4MEUtNjcgSW5leGFjdCBSb3VuZGVkCityZW14MzQ4MCByZW1haW5kZXIgLTMzNzY4ODM4NzAuODU5NjE2OTIxNDgwMjI1MjE5NjAxMzkgLTY1MjQ3NDg5NDQ5LjczMzQ1ODk3MzExNzE5ODA0MDgyODQgLT4gLTMzNzY4ODM4NzAuODU5NjE2OTIxNDgwMjI1MjE5NjAxMzkKK3N1YngzNDgwIHN1YnRyYWN0IC0zMzc2ODgzODcwLjg1OTYxNjkyMTQ4MDIyNTIxOTYwMTM5IC02NTI0NzQ4OTQ0OS43MzM0NTg5NzMxMTcxOTgwNDA4Mjg0IC0+IDYxODcwNjA1NTc4Ljg3Mzg0MjA1MTYzNjk3MjgyMTIyNzAgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ4MSBhZGQgNTguNjc3Njc4MDM3MDAwODM2NDU5MDYyMTc3MjQyMTAyNSAwMS41OTI1NTE4ODY2NTI5MDQ0NDk0MzA5MjI5OTc1MTYwIC0+IDYwLjI3MDIyOTkyMzY1Mzc0MDkwODQ5MzEwMDIzOTYxODUKK2NvbXgzNDgxIGNvbXBhcmUgNTguNjc3Njc4MDM3MDAwODM2NDU5MDYyMTc3MjQyMTAyNSAwMS41OTI1NTE4ODY2NTI5MDQ0NDk0MzA5MjI5OTc1MTYwIC0+IDEKK2RpdngzNDgxIGRpdmlkZSA1OC42Nzc2NzgwMzcwMDA4MzY0NTkwNjIxNzcyNDIxMDI1IDAxLjU5MjU1MTg4NjY1MjkwNDQ0OTQzMDkyMjk5NzUxNjAgLT4gMzYuODQ1MDY1MTYxNjI4NjA0ODQzNzQ5ODU3NjYxMzYyMiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDgxIGRpdmlkZWludCA1OC42Nzc2NzgwMzcwMDA4MzY0NTkwNjIxNzcyNDIxMDI1IDAxLjU5MjU1MTg4NjY1MjkwNDQ0OTQzMDkyMjk5NzUxNjAgLT4gMzYKK211bHgzNDgxIG11bHRpcGx5IDU4LjY3NzY3ODAzNzAwMDgzNjQ1OTA2MjE3NzI0MjEwMjUgMDEuNTkyNTUxODg2NjUyOTA0NDQ5NDMwOTIyOTk3NTE2MCAtPiA5My40NDcyNDY4NjIyMzczNzY5NTkwOTAwMjU4MDYwMDI5IEluZXhhY3QgUm91bmRlZAorcG93eDM0ODEgcG93ZXIgNTguNjc3Njc4MDM3MDAwODM2NDU5MDYyMTc3MjQyMTAyNSAyIC0+IDM0NDMuMDY5ODk5ODEzOTMwMzM2MzIwMDgzMTM1MDUyMzAgSW5leGFjdCBSb3VuZGVkCityZW14MzQ4MSByZW1haW5kZXIgNTguNjc3Njc4MDM3MDAwODM2NDU5MDYyMTc3MjQyMTAyNSAwMS41OTI1NTE4ODY2NTI5MDQ0NDk0MzA5MjI5OTc1MTYwIC0+IDEuMzQ1ODEwMTE3NDk2Mjc2Mjc5NTQ4OTQ5MzMxNTI2NQorc3VieDM0ODEgc3VidHJhY3QgNTguNjc3Njc4MDM3MDAwODM2NDU5MDYyMTc3MjQyMTAyNSAwMS41OTI1NTE4ODY2NTI5MDQ0NDk0MzA5MjI5OTc1MTYwIC0+IDU3LjA4NTEyNjE1MDM0NzkzMjAwOTYzMTI1NDI0NDU4NjUKK2FkZHgzNDgyIGFkZCA0MDk5NjE2MzM5Ljk2MjQ5NDk5NTUyODA4NTc1NzE3NTc5IDI5MC43OTUxODczNjEwNzI0ODk4MTY3OTE1MjUxMzk4OTUgLT4gNDA5OTYxNjYzMC43NTc2ODIzNTY2MDA1NzU1NzM5NjczMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDgyIGNvbXBhcmUgNDA5OTYxNjMzOS45NjI0OTQ5OTU1MjgwODU3NTcxNzU3OSAyOTAuNzk1MTg3MzYxMDcyNDg5ODE2NzkxNTI1MTM5ODk1IC0+IDEKK2RpdngzNDgyIGRpdmlkZSA0MDk5NjE2MzM5Ljk2MjQ5NDk5NTUyODA4NTc1NzE3NTc5IDI5MC43OTUxODczNjEwNzI0ODk4MTY3OTE1MjUxMzk4OTUgLT4gMTQwOTc5NTEuMTI4OTkyMDc4ODEzNDIwOTAwMjM5MDgzNCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDgyIGRpdmlkZWludCA0MDk5NjE2MzM5Ljk2MjQ5NDk5NTUyODA4NTc1NzE3NTc5IDI5MC43OTUxODczNjEwNzI0ODk4MTY3OTE1MjUxMzk4OTUgLT4gMTQwOTc5NTEKK211bHgzNDgyIG11bHRpcGx5IDQwOTk2MTYzMzkuOTYyNDk0OTk1NTI4MDg1NzU3MTc1NzkgMjkwLjc5NTE4NzM2MTA3MjQ4OTgxNjc5MTUyNTEzOTg5NSAtPiAxMTkyMTQ4NzAxNjg3LjkwNzk4NDM3NTAxMzk3OTAwMTc0IEluZXhhY3QgUm91bmRlZAorcG93eDM0ODIgcG93ZXIgNDA5OTYxNjMzOS45NjI0OTQ5OTU1MjgwODU3NTcxNzU3OSAyOTEgLT4gMi4wMzM2NDc1Nzg3NzgwMDQ5NzQwOTc2NTk3OTg3NzI1OEUrMjc5NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDgyIHJlbWFpbmRlciA0MDk5NjE2MzM5Ljk2MjQ5NDk5NTUyODA4NTc1NzE3NTc5IDI5MC43OTUxODczNjEwNzI0ODk4MTY3OTE1MjUxMzk4OTUgLT4gMzcuNTEwMjc1NzI2NjQyOTU5ODU4NTM4MjgyMTQ0ODU1CitzdWJ4MzQ4MiBzdWJ0cmFjdCA0MDk5NjE2MzM5Ljk2MjQ5NDk5NTUyODA4NTc1NzE3NTc5IDI5MC43OTUxODczNjEwNzI0ODk4MTY3OTE1MjUxMzk4OTUgLT4gNDA5OTYxNjA0OS4xNjczMDc2MzQ0NTU1OTU5NDAzODQyNiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDgzIGFkZCA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4IC0yMTQwMzkyODYxMTUzLjY5NDAxMzQ2Mzk4NDc4MTEzNzE1IC0+IC0yMTQwMzA2OTkwMzc2LjQ2NTczMDE0OTgxMzc4NDA2NTc4IEluZXhhY3QgUm91bmRlZAorY29teDM0ODMgY29tcGFyZSA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4IC0yMTQwMzkyODYxMTUzLjY5NDAxMzQ2Mzk4NDc4MTEzNzE1IC0+IDEKK2RpdngzNDgzIGRpdmlkZSA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4IC0yMTQwMzkyODYxMTUzLjY5NDAxMzQ2Mzk4NDc4MTEzNzE1IC0+IC0wLjAwMDA0MDExOTE2NjMzOTM5NzE4NTMwOTI3NDgyNjMyMzMxMjggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ4MyBkaXZpZGVpbnQgODU4NzA3NzcuMjI4MjgzMzE0MTcwOTk3MDcxMzczOTEwOCAtMjE0MDM5Mjg2MTE1My42OTQwMTM0NjM5ODQ3ODExMzcxNSAtPiAtMAorbXVseDM0ODMgbXVsdGlwbHkgODU4NzA3NzcuMjI4MjgzMzE0MTcwOTk3MDcxMzczOTEwOCAtMjE0MDM5Mjg2MTE1My42OTQwMTM0NjM5ODQ3ODExMzcxNSAtPiAtMTgzNzk3MTk4NTYxMTM2Nzk3MzI4LjUwODg3ODI1NDg0OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDgzIHBvd2VyIDg1ODcwNzc3LjIyODI4MzMxNDE3MDk5NzA3MTM3MzkxMDggLTIgLT4gMS4zNTYxNTQ2MzQ0ODcwNzU3MzQyNDU3ODc4NTk3MzI2OUUtMTYgSW5leGFjdCBSb3VuZGVkCityZW14MzQ4MyByZW1haW5kZXIgODU4NzA3NzcuMjI4MjgzMzE0MTcwOTk3MDcxMzczOTEwOCAtMjE0MDM5Mjg2MTE1My42OTQwMTM0NjM5ODQ3ODExMzcxNSAtPiA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4CitzdWJ4MzQ4MyBzdWJ0cmFjdCA4NTg3MDc3Ny4yMjgyODMzMTQxNzA5OTcwNzEzNzM5MTA4IC0yMTQwMzkyODYxMTUzLjY5NDAxMzQ2Mzk4NDc4MTEzNzE1IC0+IDIxNDA0Nzg3MzE5MzAuOTIyMjk2Nzc4MTU1Nzc4MjA4NTIgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ4NCBhZGQgMjA5MDAuOTY5Mzc2MTU1NTE2NTc0MjAxMDMzOTkyOTc3OSAtMzguNzU0NjE0NzY0OTUyMzc5MzQ2MzI2MDk0MDI4OTU4NSAtPiAyMDg2Mi4yMTQ3NjEzOTA1NjQxOTQ4NTQ3MDc4OTg5NDg5IEluZXhhY3QgUm91bmRlZAorY29teDM0ODQgY29tcGFyZSAyMDkwMC45NjkzNzYxNTU1MTY1NzQyMDEwMzM5OTI5Nzc5IC0zOC43NTQ2MTQ3NjQ5NTIzNzkzNDYzMjYwOTQwMjg5NTg1IC0+IDEKK2RpdngzNDg0IGRpdmlkZSAyMDkwMC45NjkzNzYxNTU1MTY1NzQyMDEwMzM5OTI5Nzc5IC0zOC43NTQ2MTQ3NjQ5NTIzNzkzNDYzMjYwOTQwMjg5NTg1IC0+IC01MzkuMzE1NjI3Mzg4Mzg2NDMwMTg4NjI3NDEyNjM5NzY3IEluZXhhY3QgUm91bmRlZAorZHZpeDM0ODQgZGl2aWRlaW50IDIwOTAwLjk2OTM3NjE1NTUxNjU3NDIwMTAzMzk5Mjk3NzkgLTM4Ljc1NDYxNDc2NDk1MjM3OTM0NjMyNjA5NDAyODk1ODUgLT4gLTUzOQorbXVseDM0ODQgbXVsdGlwbHkgMjA5MDAuOTY5Mzc2MTU1NTE2NTc0MjAxMDMzOTkyOTc3OSAtMzguNzU0NjE0NzY0OTUyMzc5MzQ2MzI2MDk0MDI4OTU4NSAtPiAtODEwMDA5LjAxNjM4Njk3NDEwMzczODYyMjc5MzY3MDU2NiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDg0IHBvd2VyIDIwOTAwLjk2OTM3NjE1NTUxNjU3NDIwMTAzMzk5Mjk3NzkgLTM5IC0+IDMuMjYyMTkwMTQ3MDE1MjYzMzUyOTYwNDQ0Mzk5ODk2NjVFLTE2OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDg0IHJlbWFpbmRlciAyMDkwMC45NjkzNzYxNTU1MTY1NzQyMDEwMzM5OTI5Nzc5IC0zOC43NTQ2MTQ3NjQ5NTIzNzkzNDYzMjYwOTQwMjg5NTg1IC0+IDEyLjIzMjAxNzg0NjE4NDEwNjUzMTI2OTMxMTM2OTI2ODUKK3N1YngzNDg0IHN1YnRyYWN0IDIwOTAwLjk2OTM3NjE1NTUxNjU3NDIwMTAzMzk5Mjk3NzkgLTM4Ljc1NDYxNDc2NDk1MjM3OTM0NjMyNjA5NDAyODk1ODUgLT4gMjA5MzkuNzIzOTkwOTIwNDY4OTUzNTQ3MzYwMDg3MDA2OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDg1IGFkZCA0NDguODI3NTk2MTU1NTg3OTEwOTQ3NTExMTcwMzE5NDU2IDM3OTEzMDE1My4zODI3OTQwNDI2NTI5NzQ1OTYyODYwNjIgLT4gMzc5MTMwNjAyLjIxMDM5MDE5ODI0MDg4NTU0Mzc5NzIzMiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDg1IGNvbXBhcmUgNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1NiAzNzkxMzAxNTMuMzgyNzk0MDQyNjUyOTc0NTk2Mjg2MDYyIC0+IC0xCitkaXZ4MzQ4NSBkaXZpZGUgNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1NiAzNzkxMzAxNTMuMzgyNzk0MDQyNjUyOTc0NTk2Mjg2MDYyIC0+IDAuMDAwMDAxMTgzODM1MTM0NTg2MTUwNjEzOTQxNDA4OTU1OTY5NzkgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ4NSBkaXZpZGVpbnQgNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1NiAzNzkxMzAxNTMuMzgyNzk0MDQyNjUyOTc0NTk2Mjg2MDYyIC0+IDAKK211bHgzNDg1IG11bHRpcGx5IDQ0OC44Mjc1OTYxNTU1ODc5MTA5NDc1MTExNzAzMTk0NTYgMzc5MTMwMTUzLjM4Mjc5NDA0MjY1Mjk3NDU5NjI4NjA2MiAtPiAxNzAxNjQwNzUzNzIuODk4Nzg2NDY5MDk0NDYwNjkyMDk3IEluZXhhY3QgUm91bmRlZAorcG93eDM0ODUgcG93ZXIgNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1NiAzNzkxMzAxNTMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ4NSByZW1haW5kZXIgNDQ4LjgyNzU5NjE1NTU4NzkxMDk0NzUxMTE3MDMxOTQ1NiAzNzkxMzAxNTMuMzgyNzk0MDQyNjUyOTc0NTk2Mjg2MDYyIC0+IDQ0OC44Mjc1OTYxNTU1ODc5MTA5NDc1MTExNzAzMTk0NTYKK3N1YngzNDg1IHN1YnRyYWN0IDQ0OC44Mjc1OTYxNTU1ODc5MTA5NDc1MTExNzAzMTk0NTYgMzc5MTMwMTUzLjM4Mjc5NDA0MjY1Mjk3NDU5NjI4NjA2MiAtPiAtMzc5MTI5NzA0LjU1NTE5Nzg4NzA2NTA2MzY0ODc3NDg5MiBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDg2IGFkZCA5OC40MTM0ODA3OTIxMDAyODE3MzU3MDAwMTQwNDgyMDM5IDM0MDQ3MjU1NDMuNzcwMzI5NDU0NDQ2NTQzNTE1NDY3NzkgLT4gMzQwNDcyNTY0Mi4xODM4MTAyNDY1NDY4MjUyNTExNjc4MCBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDg2IGNvbXBhcmUgOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOSAzNDA0NzI1NTQzLjc3MDMyOTQ1NDQ0NjU0MzUxNTQ2Nzc5IC0+IC0xCitkaXZ4MzQ4NiBkaXZpZGUgOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOSAzNDA0NzI1NTQzLjc3MDMyOTQ1NDQ0NjU0MzUxNTQ2Nzc5IC0+IDIuODkwNDk2NzM4MzM5NzA4NjM0MjAyMDE5NzkyOTE1MjNFLTggSW5leGFjdCBSb3VuZGVkCitkdml4MzQ4NiBkaXZpZGVpbnQgOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOSAzNDA0NzI1NTQzLjc3MDMyOTQ1NDQ0NjU0MzUxNTQ2Nzc5IC0+IDAKK211bHgzNDg2IG11bHRpcGx5IDk4LjQxMzQ4MDc5MjEwMDI4MTczNTcwMDAxNDA0ODIwMzkgMzQwNDcyNTU0My43NzAzMjk0NTQ0NDY1NDM1MTU0Njc3OSAtPiAzMzUwNzA4OTE5MDQuMjE0NTA0ODExNzk4MjEyMDQwNDEzIEluZXhhY3QgUm91bmRlZAorcG93eDM0ODYgcG93ZXIgOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOSAzIC0+IDk1MzE1NS41NDMzODQ3Mzk2Njc5NjUwNTU4Mzk4OTQ2ODIgSW5leGFjdCBSb3VuZGVkCityZW14MzQ4NiByZW1haW5kZXIgOTguNDEzNDgwNzkyMTAwMjgxNzM1NzAwMDE0MDQ4MjAzOSAzNDA0NzI1NTQzLjc3MDMyOTQ1NDQ0NjU0MzUxNTQ2Nzc5IC0+IDk4LjQxMzQ4MDc5MjEwMDI4MTczNTcwMDAxNDA0ODIwMzkKK3N1YngzNDg2IHN1YnRyYWN0IDk4LjQxMzQ4MDc5MjEwMDI4MTczNTcwMDAxNDA0ODIwMzkgMzQwNDcyNTU0My43NzAzMjk0NTQ0NDY1NDM1MTU0Njc3OSAtPiAtMzQwNDcyNTQ0NS4zNTY4NDg2NjIzNDYyNjE3Nzk3Njc3OCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDg3IGFkZCA1NDU3NDY0MzMuNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03ODcgLTUxNDk5NTcwOTk3MDkuMTI4MzAwNzI4MDIwNDM1NjA2NTBFLTQzNyAtPiAtNS4xNDk5NTcwOTk3MDkxMjgzMDA3MjgwMjA0MzU2MDY1MEUtNDI1IEluZXhhY3QgUm91bmRlZAorY29teDM0ODcgY29tcGFyZSA1NDU3NDY0MzMuNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03ODcgLTUxNDk5NTcwOTk3MDkuMTI4MzAwNzI4MDIwNDM1NjA2NTBFLTQzNyAtPiAxCitkaXZ4MzQ4NyBkaXZpZGUgNTQ1NzQ2NDMzLjY0OTM1OTczNDEzNjQ3NjcxODE3NjMzMEUtNzg3IC01MTQ5OTU3MDk5NzA5LjEyODMwMDcyODAyMDQzNTYwNjUwRS00MzcgLT4gLTEuMDU5NzEwNjQwNDYzNzUwMTEwODY4NTA3MjI3NTI2MTRFLTM1NCBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDg3IGRpdmlkZWludCA1NDU3NDY0MzMuNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03ODcgLTUxNDk5NTcwOTk3MDkuMTI4MzAwNzI4MDIwNDM1NjA2NTBFLTQzNyAtPiAtMAorbXVseDM0ODcgbXVsdGlwbHkgNTQ1NzQ2NDMzLjY0OTM1OTczNDEzNjQ3NjcxODE3NjMzMEUtNzg3IC01MTQ5OTU3MDk5NzA5LjEyODMwMDcyODAyMDQzNTYwNjUwRS00MzcgLT4gLTIuODEwNTcwNzIwNjEzNDU2ODgwNzQzMDQ4NzMwMzMzMTdFLTEyMDMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ4NyBwb3dlciA1NDU3NDY0MzMuNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03ODcgLTUgLT4gMi4wNjU1OTY0MDA5MjY2NzE2Njk3NjE4NjgwMTM0ODY2MkUrMzg5MSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDg3IHJlbWFpbmRlciA1NDU3NDY0MzMuNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03ODcgLTUxNDk5NTcwOTk3MDkuMTI4MzAwNzI4MDIwNDM1NjA2NTBFLTQzNyAtPiA1LjQ1NzQ2NDMzNjQ5MzU5NzM0MTM2NDc2NzE4MTc2MzMwRS03NzkKK3N1YngzNDg3IHN1YnRyYWN0IDU0NTc0NjQzMy42NDkzNTk3MzQxMzY0NzY3MTgxNzYzMzBFLTc4NyAtNTE0OTk1NzA5OTcwOS4xMjgzMDA3MjgwMjA0MzU2MDY1MEUtNDM3IC0+IDUuMTQ5OTU3MDk5NzA5MTI4MzAwNzI4MDIwNDM1NjA2NTBFLTQyNSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDg4IGFkZCA3NDEzMDQ1MTM1NDcuMjczODIwNTI1ODAxNjA4MjMxNzM3IDAzOTYuMjI4MjMxMjgyNzI1ODQ5MjgwMTkzMjMxODYzNTVFLTgzMCAtPiA3NDEzMDQ1MTM1NDcuMjczODIwNTI1ODAxNjA4MjMxNzM3IEluZXhhY3QgUm91bmRlZAorY29teDM0ODggY29tcGFyZSA3NDEzMDQ1MTM1NDcuMjczODIwNTI1ODAxNjA4MjMxNzM3IDAzOTYuMjI4MjMxMjgyNzI1ODQ5MjgwMTkzMjMxODYzNTVFLTgzMCAtPiAxCitkaXZ4MzQ4OCBkaXZpZGUgNzQxMzA0NTEzNTQ3LjI3MzgyMDUyNTgwMTYwODIzMTczNyAwMzk2LjIyODIzMTI4MjcyNTg0OTI4MDE5MzIzMTg2MzU1RS04MzAgLT4gMS44NzA5MDI4MTU2NTEwMTYxMjYyMzM5ODE3NDcyNzY1M0UrODM5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0ODggZGl2aWRlaW50IDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgMDM5Ni4yMjgyMzEyODI3MjU4NDkyODAxOTMyMzE4NjM1NUUtODMwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ4OCBtdWx0aXBseSA3NDEzMDQ1MTM1NDcuMjczODIwNTI1ODAxNjA4MjMxNzM3IDAzOTYuMjI4MjMxMjgyNzI1ODQ5MjgwMTkzMjMxODYzNTVFLTgzMCAtPiAyLjkzNzI1Nzc2MjQ0NzM3Nzg4OTQ3NDQzMzYxMDc2MDk1RS04MTYgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ4OCBwb3dlciA3NDEzMDQ1MTM1NDcuMjczODIwNTI1ODAxNjA4MjMxNzM3IDQgLT4gMy4wMTk4NTgzODY1Mjg5MjA3MzkwMzE5NDg0NjY2ODcxMkUrNDcgSW5leGFjdCBSb3VuZGVkCityZW14MzQ4OCByZW1haW5kZXIgNzQxMzA0NTEzNTQ3LjI3MzgyMDUyNTgwMTYwODIzMTczNyAwMzk2LjIyODIzMTI4MjcyNTg0OTI4MDE5MzIzMTg2MzU1RS04MzAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDg4IHN1YnRyYWN0IDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgMDM5Ni4yMjgyMzEyODI3MjU4NDkyODAxOTMyMzE4NjM1NUUtODMwIC0+IDc0MTMwNDUxMzU0Ny4yNzM4MjA1MjU4MDE2MDgyMzE3MzcgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ4OSBhZGQgLTcwNi4xNDUwMDUwOTQyOTIzMTU2MTM5MDcyNTQyNDA1NTMgNDczOS44MjQ4NjE5NTczOTc1ODMwODczNTk0NjMzMjIzNCAtPiA0MDMzLjY3OTg1Njg2MzEwNTI2NzQ3MzQ1MjIwOTA4MTc5IEluZXhhY3QgUm91bmRlZAorY29teDM0ODkgY29tcGFyZSAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1MyA0NzM5LjgyNDg2MTk1NzM5NzU4MzA4NzM1OTQ2MzMyMjM0IC0+IC0xCitkaXZ4MzQ4OSBkaXZpZGUgLTcwNi4xNDUwMDUwOTQyOTIzMTU2MTM5MDcyNTQyNDA1NTMgNDczOS44MjQ4NjE5NTczOTc1ODMwODczNTk0NjMzMjIzNCAtPiAtMC4xNDg5ODEyNDQxNzI1Mjc2NzE5MDc1MzQxMTc3NzE2MjYgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ4OSBkaXZpZGVpbnQgLTcwNi4xNDUwMDUwOTQyOTIzMTU2MTM5MDcyNTQyNDA1NTMgNDczOS44MjQ4NjE5NTczOTc1ODMwODczNTk0NjMzMjIzNCAtPiAtMAorbXVseDM0ODkgbXVsdGlwbHkgLTcwNi4xNDUwMDUwOTQyOTIzMTU2MTM5MDcyNTQyNDA1NTMgNDczOS44MjQ4NjE5NTczOTc1ODMwODczNTk0NjMzMjIzNCAtPiAtMzM0NzAwMy42NTEyOTI5NTk4ODc5MzQ1NDI2Nzk3MzQ2NCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDg5IHBvd2VyIC03MDYuMTQ1MDA1MDk0MjkyMzE1NjEzOTA3MjU0MjQwNTUzIDQ3NDAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityZW14MzQ4OSByZW1haW5kZXIgLTcwNi4xNDUwMDUwOTQyOTIzMTU2MTM5MDcyNTQyNDA1NTMgNDczOS44MjQ4NjE5NTczOTc1ODMwODczNTk0NjMzMjIzNCAtPiAtNzA2LjE0NTAwNTA5NDI5MjMxNTYxMzkwNzI1NDI0MDU1Mworc3VieDM0ODkgc3VidHJhY3QgLTcwNi4xNDUwMDUwOTQyOTIzMTU2MTM5MDcyNTQyNDA1NTMgNDczOS44MjQ4NjE5NTczOTc1ODMwODczNTk0NjMzMjIzNCAtPiAtNTQ0NS45Njk4NjcwNTE2ODk4OTg3MDEyNjY3MTc1NjI4OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDkwIGFkZCAtNzY5OTI1Nzg2LjgyMzA5OTA4MzIyODc5NTE4Nzk3NTg5MyAtMzEyMDEuOTk4MDQ2OTc2MDIzOTg3MDA2NzgyMDU5NDc5MCAtPiAtNzY5OTU2OTg4LjgyMTE0NjA1OTI1Mjc4MjE5NDc1Nzk1MiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDkwIGNvbXBhcmUgLTc2OTkyNTc4Ni44MjMwOTkwODMyMjg3OTUxODc5NzU4OTMgLTMxMjAxLjk5ODA0Njk3NjAyMzk4NzAwNjc4MjA1OTQ3OTAgLT4gLTEKK2RpdngzNDkwIGRpdmlkZSAtNzY5OTI1Nzg2LjgyMzA5OTA4MzIyODc5NTE4Nzk3NTg5MyAtMzEyMDEuOTk4MDQ2OTc2MDIzOTg3MDA2NzgyMDU5NDc5MCAtPiAyNDY3NS41MjgzMzE5OTc4Njk4OTMyMjkyMDI4NjUwODAzIEluZXhhY3QgUm91bmRlZAorZHZpeDM0OTAgZGl2aWRlaW50IC03Njk5MjU3ODYuODIzMDk5MDgzMjI4Nzk1MTg3OTc1ODkzIC0zMTIwMS45OTgwNDY5NzYwMjM5ODcwMDY3ODIwNTk0NzkwIC0+IDI0Njc1CittdWx4MzQ5MCBtdWx0aXBseSAtNzY5OTI1Nzg2LjgyMzA5OTA4MzIyODc5NTE4Nzk3NTg5MyAtMzEyMDEuOTk4MDQ2OTc2MDIzOTg3MDA2NzgyMDU5NDc5MCAtPiAyNDAyMzIyMjg5Njc3MC44MTYxNzg3MjM2NzM3Mzk1NDc3IEluZXhhY3QgUm91bmRlZAorcG93eDM0OTAgcG93ZXIgLTc2OTkyNTc4Ni44MjMwOTkwODMyMjg3OTUxODc5NzU4OTMgLTMxMjAyIC0+IDBFLTEwMDMxIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JlbXgzNDkwIHJlbWFpbmRlciAtNzY5OTI1Nzg2LjgyMzA5OTA4MzIyODc5NTE4Nzk3NTg5MyAtMzEyMDEuOTk4MDQ2OTc2MDIzOTg3MDA2NzgyMDU5NDc5MCAtPiAtMTY0ODUuMDEzOTY1NjkxMzQ5NDAyODQwNjU4MjQ4Njc1MAorc3VieDM0OTAgc3VidHJhY3QgLTc2OTkyNTc4Ni44MjMwOTkwODMyMjg3OTUxODc5NzU4OTMgLTMxMjAxLjk5ODA0Njk3NjAyMzk4NzAwNjc4MjA1OTQ3OTAgLT4gLTc2OTg5NDU4NC44MjUwNTIxMDcyMDQ4MDgxODExOTM4MzQgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ5MSBhZGQgODQ0Mzg2MTA1NDYwNDkuNzI1NjUwNzQxOTI4OTY5Mjg1N0UrOTA2IDA1MjYwNDI0MDc2NjczNjQ2MTg5ODg0NDExMTc5MDMxMSAtPiA4LjQ0Mzg2MTA1NDYwNDk3MjU2NTA3NDE5Mjg5NjkyODU3RSs5MTkgSW5leGFjdCBSb3VuZGVkCitjb214MzQ5MSBjb21wYXJlIDg0NDM4NjEwNTQ2MDQ5LjcyNTY1MDc0MTkyODk2OTI4NTdFKzkwNiAwNTI2MDQyNDA3NjY3MzY0NjE4OTg4NDQxMTE3OTAzMTEgLT4gMQorZGl2eDM0OTEgZGl2aWRlIDg0NDM4NjEwNTQ2MDQ5LjcyNTY1MDc0MTkyODk2OTI4NTdFKzkwNiAwNTI2MDQyNDA3NjY3MzY0NjE4OTg4NDQxMTE3OTAzMTEgLT4gMS42MDUxNjczNjUxMjcwMTk3ODY5NTU1OTAwMzM0MTkyMkUrODg4IEluZXhhY3QgUm91bmRlZAorZHZpeDM0OTEgZGl2aWRlaW50IDg0NDM4NjEwNTQ2MDQ5LjcyNTY1MDc0MTkyODk2OTI4NTdFKzkwNiAwNTI2MDQyNDA3NjY3MzY0NjE4OTg4NDQxMTE3OTAzMTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDkxIG11bHRpcGx5IDg0NDM4NjEwNTQ2MDQ5LjcyNTY1MDc0MTkyODk2OTI4NTdFKzkwNiAwNTI2MDQyNDA3NjY3MzY0NjE4OTg4NDQxMTE3OTAzMTEgLT4gNC40NDE4Mjg5OTkxNzMwOTIzMTc3OTgzNzY2ODIxMDYxMEUrOTUxIEluZXhhY3QgUm91bmRlZAorcG93eDM0OTEgcG93ZXIgODQ0Mzg2MTA1NDYwNDkuNzI1NjUwNzQxOTI4OTY5Mjg1N0UrOTA2IDUgLT4gNC4yOTI0NTE0NDcxOTY4OTI4MzI0NzM0Mjg2Njk4ODIxM0UrNDU5OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDkxIHJlbWFpbmRlciA4NDQzODYxMDU0NjA0OS43MjU2NTA3NDE5Mjg5NjkyODU3RSs5MDYgMDUyNjA0MjQwNzY2NzM2NDYxODk4ODQ0MTExNzkwMzExIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ5MSBzdWJ0cmFjdCA4NDQzODYxMDU0NjA0OS43MjU2NTA3NDE5Mjg5NjkyODU3RSs5MDYgMDUyNjA0MjQwNzY2NzM2NDYxODk4ODQ0MTExNzkwMzExIC0+IDguNDQzODYxMDU0NjA0OTcyNTY1MDc0MTkyODk2OTI4NTdFKzkxOSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDkyIGFkZCA1NDk3NjAuOTExMzA0NzI1Nzk1MTY0NTg5NjE5Mjg2NTE0IDE2NS4xNjAwODk2MTU2MDQ5MjQyMDc3NTQ4ODM5NTM0ODQgLT4gNTQ5OTI2LjA3MTM5NDM0MTQwMDA4ODc5NzM3NDE3MDQ2NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDkyIGNvbXBhcmUgNTQ5NzYwLjkxMTMwNDcyNTc5NTE2NDU4OTYxOTI4NjUxNCAxNjUuMTYwMDg5NjE1NjA0OTI0MjA3NzU0ODgzOTUzNDg0IC0+IDEKK2RpdngzNDkyIGRpdmlkZSA1NDk3NjAuOTExMzA0NzI1Nzk1MTY0NTg5NjE5Mjg2NTE0IDE2NS4xNjAwODk2MTU2MDQ5MjQyMDc3NTQ4ODM5NTM0ODQgLT4gMzMyOC42NTQ3MTY2NzA2MjEwNzU5ODM5NTcxNDM0ODA4OSBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDkyIGRpdmlkZWludCA1NDk3NjAuOTExMzA0NzI1Nzk1MTY0NTg5NjE5Mjg2NTE0IDE2NS4xNjAwODk2MTU2MDQ5MjQyMDc3NTQ4ODM5NTM0ODQgLT4gMzMyOAorbXVseDM0OTIgbXVsdGlwbHkgNTQ5NzYwLjkxMTMwNDcyNTc5NTE2NDU4OTYxOTI4NjUxNCAxNjUuMTYwMDg5NjE1NjA0OTI0MjA3NzU0ODgzOTUzNDg0IC0+IDkwNzk4NTYxLjM3ODI0NTE0MjU4NjExMTM2OTQ3MzI0ODQgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ5MiBwb3dlciA1NDk3NjAuOTExMzA0NzI1Nzk1MTY0NTg5NjE5Mjg2NTE0IDE2NSAtPiAxLjM0NDg4OTI1NDQyMzg2NTQ0MDI4ODc1NjAzMzQ3NjU0RSs5NDcgSW5leGFjdCBSb3VuZGVkCityZW14MzQ5MiByZW1haW5kZXIgNTQ5NzYwLjkxMTMwNDcyNTc5NTE2NDU4OTYxOTI4NjUxNCAxNjUuMTYwMDg5NjE1NjA0OTI0MjA3NzU0ODgzOTUzNDg0IC0+IDEwOC4xMzMwNjM5OTI2MDc0MDExODEzNjU0ODkzMTkyNDgKK3N1YngzNDkyIHN1YnRyYWN0IDU0OTc2MC45MTEzMDQ3MjU3OTUxNjQ1ODk2MTkyODY1MTQgMTY1LjE2MDA4OTYxNTYwNDkyNDIwNzc1NDg4Mzk1MzQ4NCAtPiA1NDk1OTUuNzUxMjE1MTEwMTkwMjQwMzgxODY0NDAyNTYxIEluZXhhY3QgUm91bmRlZAorYWRkeDM0OTMgYWRkIDM2NTA1MTQuMTg2NDk3Mzc5NTY4NTU4Mjg5Mzk2NjI3OTQgMDgwODY3MjEuNDAzNjg4Njk0ODI0ODI3NDgzNDczNTYyOSAtPiAxMTczNzIzNS41OTAxODYwNzQzOTMzODU3NzI4NzAxOTA4IEluZXhhY3QgUm91bmRlZAorY29teDM0OTMgY29tcGFyZSAzNjUwNTE0LjE4NjQ5NzM3OTU2ODU1ODI4OTM5NjYyNzk0IDA4MDg2NzIxLjQwMzY4ODY5NDgyNDgyNzQ4MzQ3MzU2MjkgLT4gLTEKK2RpdngzNDkzIGRpdmlkZSAzNjUwNTE0LjE4NjQ5NzM3OTU2ODU1ODI4OTM5NjYyNzk0IDA4MDg2NzIxLjQwMzY4ODY5NDgyNDgyNzQ4MzQ3MzU2MjkgLT4gMC40NTE0MjA3OTI3MTIzODcyNTA4NjU0MjMyMDgyMzQyOTEgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ5MyBkaXZpZGVpbnQgMzY1MDUxNC4xODY0OTczNzk1Njg1NTgyODkzOTY2Mjc5NCAwODA4NjcyMS40MDM2ODg2OTQ4MjQ4Mjc0ODM0NzM1NjI5IC0+IDAKK211bHgzNDkzIG11bHRpcGx5IDM2NTA1MTQuMTg2NDk3Mzc5NTY4NTU4Mjg5Mzk2NjI3OTQgMDgwODY3MjEuNDAzNjg4Njk0ODI0ODI3NDgzNDczNTYyOSAtPiAyOTUyMDY5MTIwNjQxNy41ODMxODg2NzUyODA4NzQ1NDIxIEluZXhhY3QgUm91bmRlZAorcG93eDM0OTMgcG93ZXIgMzY1MDUxNC4xODY0OTczNzk1Njg1NTgyODkzOTY2Mjc5NCA4MDg2NzIxIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcmVteDM0OTMgcmVtYWluZGVyIDM2NTA1MTQuMTg2NDk3Mzc5NTY4NTU4Mjg5Mzk2NjI3OTQgMDgwODY3MjEuNDAzNjg4Njk0ODI0ODI3NDgzNDczNTYyOSAtPiAzNjUwNTE0LjE4NjQ5NzM3OTU2ODU1ODI4OTM5NjYyNzk0CitzdWJ4MzQ5MyBzdWJ0cmFjdCAzNjUwNTE0LjE4NjQ5NzM3OTU2ODU1ODI4OTM5NjYyNzk0IDA4MDg2NzIxLjQwMzY4ODY5NDgyNDgyNzQ4MzQ3MzU2MjkgLT4gLTQ0MzYyMDcuMjE3MTkxMzE1MjU2MjY5MTk0MDc2OTM0OTYKK2FkZHgzNDk0IGFkZCA1NTA2NzcyMzg4MTk1MC4xMzQ2OTU4MTc5NjA0MDk5NTk0IC04LjkwNDgxNDgxNjg3MTgyOTMxNDMxMDU0Nzg1MTkyMDgzIC0+IDU1MDY3NzIzODgxOTQxLjIyOTg4MTAwMTA4ODU4MDY0NTEgSW5leGFjdCBSb3VuZGVkCitjb214MzQ5NCBjb21wYXJlIDU1MDY3NzIzODgxOTUwLjEzNDY5NTgxNzk2MDQwOTk1OTQgLTguOTA0ODE0ODE2ODcxODI5MzE0MzEwNTQ3ODUxOTIwODMgLT4gMQorZGl2eDM0OTQgZGl2aWRlIDU1MDY3NzIzODgxOTUwLjEzNDY5NTgxNzk2MDQwOTk1OTQgLTguOTA0ODE0ODE2ODcxODI5MzE0MzEwNTQ3ODUxOTIwODMgLT4gLTYxODQwMzkxOTgzOTEuMTk4NTMwODg0MTk0ODQxMTcwNTQgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ5NCBkaXZpZGVpbnQgNTUwNjc3MjM4ODE5NTAuMTM0Njk1ODE3OTYwNDA5OTU5NCAtOC45MDQ4MTQ4MTY4NzE4MjkzMTQzMTA1NDc4NTE5MjA4MyAtPiAtNjE4NDAzOTE5ODM5MQorbXVseDM0OTQgbXVsdGlwbHkgNTUwNjc3MjM4ODE5NTAuMTM0Njk1ODE3OTYwNDA5OTU5NCAtOC45MDQ4MTQ4MTY4NzE4MjkzMTQzMTA1NDc4NTE5MjA4MyAtPiAtNDkwMzY3ODgzNTU1Mzk2LjI1MDM2NTE1ODU5MzM3MzI3OSBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDk0IHBvd2VyIDU1MDY3NzIzODgxOTUwLjEzNDY5NTgxNzk2MDQwOTk1OTQgLTkgLT4gMi4xNDc0NjM4NjUzODUyOTI3MDE3Mzc4ODQ1Nzg4NzEyMUUtMTI0IEluZXhhY3QgUm91bmRlZAorcmVteDM0OTQgcmVtYWluZGVyIDU1MDY3NzIzODgxOTUwLjEzNDY5NTgxNzk2MDQwOTk1OTQgLTguOTA0ODE0ODE2ODcxODI5MzE0MzEwNTQ3ODUxOTIwODMgLT4gMS43Njc4ODA3NTkxODQ4ODY5MzA4NjM0NzcyMDQ2MTU0Nworc3VieDM0OTQgc3VidHJhY3QgNTUwNjc3MjM4ODE5NTAuMTM0Njk1ODE3OTYwNDA5OTU5NCAtOC45MDQ4MTQ4MTY4NzE4MjkzMTQzMTA1NDc4NTE5MjA4MyAtPiA1NTA2NzcyMzg4MTk1OS4wMzk1MTA2MzQ4MzIyMzkyNzM3IEluZXhhY3QgUm91bmRlZAorYWRkeDM0OTUgYWRkIDg2ODI1MTEyMy40MTM5OTI2NTMzNjI4NjA2Mzc1NDEwNjBFKzAxOSA1NTc5NjY1MDQ1LjM3ODU4MzA4NTQxMTU0ODU4NTY3NjU2RSsxMzEgLT4gNS41Nzk2NjUwNDUzNzg1ODMwODU0MTE1NDg1ODU2NzY1NkUrMTQwIEluZXhhY3QgUm91bmRlZAorY29teDM0OTUgY29tcGFyZSA4NjgyNTExMjMuNDEzOTkyNjUzMzYyODYwNjM3NTQxMDYwRSswMTkgNTU3OTY2NTA0NS4zNzg1ODMwODU0MTE1NDg1ODU2NzY1NkUrMTMxIC0+IC0xCitkaXZ4MzQ5NSBkaXZpZGUgODY4MjUxMTIzLjQxMzk5MjY1MzM2Mjg2MDYzNzU0MTA2MEUrMDE5IDU1Nzk2NjUwNDUuMzc4NTgzMDg1NDExNTQ4NTg1Njc2NTZFKzEzMSAtPiAxLjU1NjA5OTAwNjU3NTkwNzA2MTU1MjUxOTAyNzI1MDI3RS0xMTMgSW5leGFjdCBSb3VuZGVkCitkdml4MzQ5NSBkaXZpZGVpbnQgODY4MjUxMTIzLjQxMzk5MjY1MzM2Mjg2MDYzNzU0MTA2MEUrMDE5IDU1Nzk2NjUwNDUuMzc4NTgzMDg1NDExNTQ4NTg1Njc2NTZFKzEzMSAtPiAwCittdWx4MzQ5NSBtdWx0aXBseSA4NjgyNTExMjMuNDEzOTkyNjUzMzYyODYwNjM3NTQxMDYwRSswMTkgNTU3OTY2NTA0NS4zNzg1ODMwODU0MTE1NDg1ODU2NzY1NkUrMTMxIC0+IDQuODQ0NTUwNDQzOTIzNzQxMDYxMDY5NjY3NzkzMjI0ODNFKzE2OCBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDk1IHBvd2VyIDg2ODI1MTEyMy40MTM5OTI2NTMzNjI4NjA2Mzc1NDEwNjBFKzAxOSA2IC0+IDQuMjg0MjIzNTQzMDQyOTE4ODQ4MDI2OTA3MzM4NTMyMjdFKzE2NyBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDk1IHJlbWFpbmRlciA4NjgyNTExMjMuNDEzOTkyNjUzMzYyODYwNjM3NTQxMDYwRSswMTkgNTU3OTY2NTA0NS4zNzg1ODMwODU0MTE1NDg1ODU2NzY1NkUrMTMxIC0+IDg2ODI1MTEyMzQxMzk5MjY1MzM2Mjg2MDYzNzUuNDEwNjAKK3N1YngzNDk1IHN1YnRyYWN0IDg2ODI1MTEyMy40MTM5OTI2NTMzNjI4NjA2Mzc1NDEwNjBFKzAxOSA1NTc5NjY1MDQ1LjM3ODU4MzA4NTQxMTU0ODU4NTY3NjU2RSsxMzEgLT4gLTUuNTc5NjY1MDQ1Mzc4NTgzMDg1NDExNTQ4NTg1Njc2NTZFKzE0MCBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDk2IGFkZCAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtNzk4LjY3OTU2MDAyMDQxNDUyMzg0MTMyMTcyNDY0OTU5NEUtMDM3IC0+IC02NDYuNDY0NDMxNTc0MDE0NDA3NTM2MDA0OTkwMDU5MDY5IEluZXhhY3QgUm91bmRlZAorY29teDM0OTYgY29tcGFyZSAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtNzk4LjY3OTU2MDAyMDQxNDUyMzg0MTMyMTcyNDY0OTU5NEUtMDM3IC0+IC0xCitkaXZ4MzQ5NiBkaXZpZGUgLTY0Ni40NjQ0MzE1NzQwMTQ0MDc1MzYwMDQ5OTAwNTkwNjkgLTc5OC42Nzk1NjAwMjA0MTQ1MjM4NDEzMjE3MjQ2NDk1OTRFLTAzNyAtPiA4LjA5NDE2NTIxODg3MDYzODg2NjEzNTI3MjI4MzUzNTQzRSszNiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDk2IGRpdmlkZWludCAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtNzk4LjY3OTU2MDAyMDQxNDUyMzg0MTMyMTcyNDY0OTU5NEUtMDM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ5NiBtdWx0aXBseSAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSAtNzk4LjY3OTU2MDAyMDQxNDUyMzg0MTMyMTcyNDY0OTU5NEUtMDM3IC0+IDUuMTYzMTc5Mjc3NzgzODExOTc5OTU0NTEzNjM0Mzk2MjZFLTMyIEluZXhhY3QgUm91bmRlZAorcG93eDM0OTYgcG93ZXIgLTY0Ni40NjQ0MzE1NzQwMTQ0MDc1MzYwMDQ5OTAwNTkwNjkgLTggLT4gMy4yNzgyNTY0MTU2OTg2MDg2MTc3NDcwMDU0ODAzNTY5MUUtMjMgSW5leGFjdCBSb3VuZGVkCityZW14MzQ5NiByZW1haW5kZXIgLTY0Ni40NjQ0MzE1NzQwMTQ0MDc1MzYwMDQ5OTAwNTkwNjkgLTc5OC42Nzk1NjAwMjA0MTQ1MjM4NDEzMjE3MjQ2NDk1OTRFLTAzNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0OTYgc3VidHJhY3QgLTY0Ni40NjQ0MzE1NzQwMTQ0MDc1MzYwMDQ5OTAwNTkwNjkgLTc5OC42Nzk1NjAwMjA0MTQ1MjM4NDEzMjE3MjQ2NDk1OTRFLTAzNyAtPiAtNjQ2LjQ2NDQzMTU3NDAxNDQwNzUzNjAwNDk5MDA1OTA2OSBJbmV4YWN0IFJvdW5kZWQKK2FkZHgzNDk3IGFkZCAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IC03MDM5LjQ2Mzg2ODEyMjM5MDE1MTQ0NTgxNzYxNzUyOTI3RS00NDggLT4gMzU0LjU0NjY3OTk3NTIxOTc1MzU5ODU1ODI3MzQyMTU1NiBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDk3IGNvbXBhcmUgMzU0LjU0NjY3OTk3NTIxOTc1MzU5ODU1ODI3MzQyMTU1NiAtNzAzOS40NjM4NjgxMjIzOTAxNTE0NDU4MTc2MTc1MjkyN0UtNDQ4IC0+IDEKK2RpdngzNDk3IGRpdmlkZSAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IC03MDM5LjQ2Mzg2ODEyMjM5MDE1MTQ0NTgxNzYxNzUyOTI3RS00NDggLT4gLTUuMDM2NTU3OTkxMDI0NzcxOTI1Nzk0MTQ1MjMzNTIwMjhFKzQ0NiBJbmV4YWN0IFJvdW5kZWQKK2R2aXgzNDk3IGRpdmlkZWludCAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IC03MDM5LjQ2Mzg2ODEyMjM5MDE1MTQ0NTgxNzYxNzUyOTI3RS00NDggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK211bHgzNDk3IG11bHRpcGx5IDM1NC41NDY2Nzk5NzUyMTk3NTM1OTg1NTgyNzM0MjE1NTYgLTcwMzkuNDYzODY4MTIyMzkwMTUxNDQ1ODE3NjE3NTI5MjdFLTQ0OCAtPiAtMi40OTU4MTg1NDMyNDgzMTE2MTI2NzM2OTI5MjA3MTQwOEUtNDQyIEluZXhhY3QgUm91bmRlZAorcG93eDM0OTcgcG93ZXIgMzU0LjU0NjY3OTk3NTIxOTc1MzU5ODU1ODI3MzQyMTU1NiAtNyAtPiAxLjQxOTk5MjQ2MzY1ODc1NjE3Mjk4MjcwNDE0MzA0MjMzRS0xOCBJbmV4YWN0IFJvdW5kZWQKK3JlbXgzNDk3IHJlbWFpbmRlciAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IC03MDM5LjQ2Mzg2ODEyMjM5MDE1MTQ0NTgxNzYxNzUyOTI3RS00NDggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3N1YngzNDk3IHN1YnRyYWN0IDM1NC41NDY2Nzk5NzUyMTk3NTM1OTg1NTgyNzM0MjE1NTYgLTcwMzkuNDYzODY4MTIyMzkwMTUxNDQ1ODE3NjE3NTI5MjdFLTQ0OCAtPiAzNTQuNTQ2Njc5OTc1MjE5NzUzNTk4NTU4MjczNDIxNTU2IEluZXhhY3QgUm91bmRlZAorYWRkeDM0OTggYWRkIDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgLTY3MDgwODIzMzQ0Ljg5MDMzOTI1ODQzMjcxMzYwODI0ODZFLTc1NyAtPiA5MTkzNjA4NzkxNzQzNS41OTc0ODg5NDk1Mjc4MjE1ODc0IEluZXhhY3QgUm91bmRlZAorY29teDM0OTggY29tcGFyZSA5MTkzNjA4NzkxNzQzNS41OTc0ODg5NDk1Mjc4MjE1ODc0IC02NzA4MDgyMzM0NC44OTAzMzkyNTg0MzI3MTM2MDgyNDg2RS03NTcgLT4gMQorZGl2eDM0OTggZGl2aWRlIDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgLTY3MDgwODIzMzQ0Ljg5MDMzOTI1ODQzMjcxMzYwODI0ODZFLTc1NyAtPiAtMS4zNzA1MjcxMjQzNDMwMzM2NjU2OTMwNDY4ODk5Mzc4M0UrNzYwIEluZXhhY3QgUm91bmRlZAorZHZpeDM0OTggZGl2aWRlaW50IDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgLTY3MDgwODIzMzQ0Ljg5MDMzOTI1ODQzMjcxMzYwODI0ODZFLTc1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorbXVseDM0OTggbXVsdGlwbHkgOTE5MzYwODc5MTc0MzUuNTk3NDg4OTQ5NTI3ODIxNTg3NCAtNjcwODA4MjMzNDQuODkwMzM5MjU4NDMyNzEzNjA4MjQ4NkUtNzU3IC0+IC02LjE2NzE0ODQ3MjYwOTgwNDQ4MDk5MjkyNzYzOTM5NDIzRS03MzMgSW5leGFjdCBSb3VuZGVkCitwb3d4MzQ5OCBwb3dlciA5MTkzNjA4NzkxNzQzNS41OTc0ODg5NDk1Mjc4MjE1ODc0IC03IC0+IDEuODAxMzQ4OTk5MzkwMzU3MDg3MTk2NTkwNjUwODI2MzBFLTk4IEluZXhhY3QgUm91bmRlZAorcmVteDM0OTggcmVtYWluZGVyIDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgLTY3MDgwODIzMzQ0Ljg5MDMzOTI1ODQzMjcxMzYwODI0ODZFLTc1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorc3VieDM0OTggc3VidHJhY3QgOTE5MzYwODc5MTc0MzUuNTk3NDg4OTQ5NTI3ODIxNTg3NCAtNjcwODA4MjMzNDQuODkwMzM5MjU4NDMyNzEzNjA4MjQ4NkUtNzU3IC0+IDkxOTM2MDg3OTE3NDM1LjU5NzQ4ODk0OTUyNzgyMTU4NzQgSW5leGFjdCBSb3VuZGVkCithZGR4MzQ5OSBhZGQgLTA3MzQ1LjY0MjI1MTg1Mjg1NTYxMzY1MjE0MTcyNTk4MTFFLTYwMCA0MTE4ODMyNS43MDQxMzYyNjA4OTM0OTU3NTg0NTgzMzgxRS03NjMgLT4gLTcuMzQ1NjQyMjUxODUyODU1NjEzNjUyMTQxNzI1OTgxMTBFLTU5NyBJbmV4YWN0IFJvdW5kZWQKK2NvbXgzNDk5IGNvbXBhcmUgLTA3MzQ1LjY0MjI1MTg1Mjg1NTYxMzY1MjE0MTcyNTk4MTFFLTYwMCA0MTE4ODMyNS43MDQxMzYyNjA4OTM0OTU3NTg0NTgzMzgxRS03NjMgLT4gLTEKK2RpdngzNDk5IGRpdmlkZSAtMDczNDUuNjQyMjUxODUyODU1NjEzNjUyMTQxNzI1OTgxMUUtNjAwIDQxMTg4MzI1LjcwNDEzNjI2MDg5MzQ5NTc1ODQ1ODMzODFFLTc2MyAtPiAtMS43ODM0MjgyMjI5OTE2Mzg0MjI0NzE4NDMwMzg3ODAyMkUrMTU5IEluZXhhY3QgUm91bmRlZAorZHZpeDM0OTkgZGl2aWRlaW50IC0wNzM0NS42NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExRS02MDAgNDExODgzMjUuNzA0MTM2MjYwODkzNDk1NzU4NDU4MzM4MUUtNzYzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCittdWx4MzQ5OSBtdWx0aXBseSAtMDczNDUuNjQyMjUxODUyODU1NjEzNjUyMTQxNzI1OTgxMUUtNjAwIDQxMTg4MzI1LjcwNDEzNjI2MDg5MzQ5NTc1ODQ1ODMzODFFLTc2MyAtPiAtMy4wMjU1NDcwNTU3NTM4MDMzODI3NDEyNjg2NzY1NTY3NkUtMTM1MiBJbmV4YWN0IFJvdW5kZWQKK3Bvd3gzNDk5IHBvd2VyIC0wNzM0NS42NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExRS02MDAgNCAtPiAyLjkxMTUxNTQxNTUyMjE3NTgyMDgyOTM3MjM2MjU1OTk2RS0yMzg1IEluZXhhY3QgUm91bmRlZAorcmVteDM0OTkgcmVtYWluZGVyIC0wNzM0NS42NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExRS02MDAgNDExODgzMjUuNzA0MTM2MjYwODkzNDk1NzU4NDU4MzM4MUUtNzYzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitzdWJ4MzQ5OSBzdWJ0cmFjdCAtMDczNDUuNjQyMjUxODUyODU1NjEzNjUyMTQxNzI1OTgxMUUtNjAwIDQxMTg4MzI1LjcwNDEzNjI2MDg5MzQ5NTc1ODQ1ODMzODFFLTc2MyAtPiAtNy4zNDU2NDIyNTE4NTI4NTU2MTM2NTIxNDE3MjU5ODExMEUtNTk3IEluZXhhY3QgUm91bmRlZAorYWRkeDM1MDAgYWRkIC0yNTMyODA3MjQuOTM5NDU4MDIxNTg4MTY3OTY1MDM4MTg0IDYxNjk4OC40MjY0MjU5MDg4NzIzOTgxNzA4OTYzNzU2MzRFKzM5NiAtPiA2LjE2OTg4NDI2NDI1OTA4ODcyMzk4MTcwODk2Mzc1NjM0RSs0MDEgSW5leGFjdCBSb3VuZGVkCitjb214MzUwMCBjb21wYXJlIC0yNTMyODA3MjQuOTM5NDU4MDIxNTg4MTY3OTY1MDM4MTg0IDYxNjk4OC40MjY0MjU5MDg4NzIzOTgxNzA4OTYzNzU2MzRFKzM5NiAtPiAtMQorZGl2eDM1MDAgZGl2aWRlIC0yNTMyODA3MjQuOTM5NDU4MDIxNTg4MTY3OTY1MDM4MTg0IDYxNjk4OC40MjY0MjU5MDg4NzIzOTgxNzA4OTYzNzU2MzRFKzM5NiAtPiAtNC4xMDUxMTMwNjM1NzMzNzc1MzM1MTY1NTUxMTg2NjE3MEUtMzk0IEluZXhhY3QgUm91bmRlZAorZHZpeDM1MDAgZGl2aWRlaW50IC0yNTMyODA3MjQuOTM5NDU4MDIxNTg4MTY3OTY1MDM4MTg0IDYxNjk4OC40MjY0MjU5MDg4NzIzOTgxNzA4OTYzNzU2MzRFKzM5NiAtPiAtMAorbXVseDM1MDAgbXVsdGlwbHkgLTI1MzI4MDcyNC45Mzk0NTgwMjE1ODgxNjc5NjUwMzgxODQgNjE2OTg4LjQyNjQyNTkwODg3MjM5ODE3MDg5NjM3NTYzNEUrMzk2IC0+IC0xLjU2MjcxMjc1OTI0NDA5NjU3OTkxOTEzNjIwNTIyMzE1RSs0MTAgSW5leGFjdCBSb3VuZGVkCitwb3d4MzUwMCBwb3dlciAtMjUzMjgwNzI0LjkzOTQ1ODAyMTU4ODE2Nzk2NTAzODE4NCA2IC0+IDIuNjQwMDU0MjAyMjE0MDY4MDg3ODIyODQ0NTk3OTQ0MjRFKzUwIEluZXhhY3QgUm91bmRlZAorcmVteDM1MDAgcmVtYWluZGVyIC0yNTMyODA3MjQuOTM5NDU4MDIxNTg4MTY3OTY1MDM4MTg0IDYxNjk4OC40MjY0MjU5MDg4NzIzOTgxNzA4OTYzNzU2MzRFKzM5NiAtPiAtMjUzMjgwNzI0LjkzOTQ1ODAyMTU4ODE2Nzk2NTAzODE4NAorc3VieDM1MDAgc3VidHJhY3QgLTI1MzI4MDcyNC45Mzk0NTgwMjE1ODgxNjc5NjUwMzgxODQgNjE2OTg4LjQyNjQyNTkwODg3MjM5ODE3MDg5NjM3NTYzNEUrMzk2IC0+IC02LjE2OTg4NDI2NDI1OTA4ODcyMzk4MTcwODk2Mzc1NjM0RSs0MDEgSW5leGFjdCBSb3VuZGVkCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JhbmRvbXMuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmFuZG9tcy5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNDQyOGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JhbmRvbXMuZGVjVGVzdApAQCAtMCwwICsxLDQwMzAgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcmFuZG9tcy5kZWNUZXN0IC0tIGRlY2ltYWwgcmFuZG9tIHRlc3RjYXNlcyAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorCistLSBSYW5kb21seSBnZW5lcmF0ZWQgdGVzdGNhc2VzIFszMSBEZWMgMjAwMCwgd2l0aCByZXN1bHRzIGRlZmluZWQgZm9yCistLSBhbGwgY2FzZXMgWzI3IE9jdCAyMDAxXSwgYW5kIG5vIHRyaW0vZmluaXNoIFs5IEp1biAyMDAyXQoreGFkZDAwMSBhZGQgOTA1LjY3NDAyIC0yMDI4OTY2MTEuRS03ODA0NzI2MjAgLT4gOTA1LjY3NDAyMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMDEgY29tcGFyZSA5MDUuNjc0MDIgLTIwMjg5NjYxMS5FLTc4MDQ3MjYyMCAtPiAxCit4ZGl2MDAxIGRpdmlkZSA5MDUuNjc0MDIgLTIwMjg5NjYxMS5FLTc4MDQ3MjYyMCAtPiAtNC40NjM3MjE3N0UrNzgwNDcyNjE0IEluZXhhY3QgUm91bmRlZAoreGR2aTAwMSBkaXZpZGVpbnQgOTA1LjY3NDAyIC0yMDI4OTY2MTEuRS03ODA0NzI2MjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMDEgbXVsdGlwbHkgOTA1LjY3NDAyIC0yMDI4OTY2MTEuRS03ODA0NzI2MjAgLT4gLTEuODM3NTgxODlFLTc4MDQ3MjYwOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMDEgcG93ZXIgOTA1LjY3NDAyIC0yIC0+IDAuMDAwMDAxMjE5MTQ3MzAgSW5leGFjdCBSb3VuZGVkCit4cmVtMDAxIHJlbWFpbmRlciA5MDUuNjc0MDIgLTIwMjg5NjYxMS5FLTc4MDQ3MjYyMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAwMSBzdWJ0cmFjdCA5MDUuNjc0MDIgLTIwMjg5NjYxMS5FLTc4MDQ3MjYyMCAtPiA5MDUuNjc0MDIwIEluZXhhY3QgUm91bmRlZAoreGFkZDAwMiBhZGQgMzkxNTEzNC43IC01OTcxNjQ5MDcuIC0+IC01OTMyNDk3NzIgSW5leGFjdCBSb3VuZGVkCit4Y29tMDAyIGNvbXBhcmUgMzkxNTEzNC43IC01OTcxNjQ5MDcuIC0+IDEKK3hkaXYwMDIgZGl2aWRlIDM5MTUxMzQuNyAtNTk3MTY0OTA3LiAtPiAtMC4wMDY1NTYyMDM1OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMDIgZGl2aWRlaW50IDM5MTUxMzQuNyAtNTk3MTY0OTA3LiAtPiAtMAoreG11bDAwMiBtdWx0aXBseSAzOTE1MTM0LjcgLTU5NzE2NDkwNy4gLT4gLTIuMzM3OTgxMDVFKzE1IEluZXhhY3QgUm91bmRlZAoreHBvdzAwMiBwb3dlciAzOTE1MTM0LjcgLTU5NzE2NDkwNyAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wMDIgcmVtYWluZGVyIDM5MTUxMzQuNyAtNTk3MTY0OTA3LiAtPiAzOTE1MTM0LjcKK3hzdWIwMDIgc3VidHJhY3QgMzkxNTEzNC43IC01OTcxNjQ5MDcuIC0+IDYwMTA4MDA0MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMDMgYWRkIDMwOTc1OTI2MSA2MjY2My40ODcgLT4gMzA5ODIxOTI0IEluZXhhY3QgUm91bmRlZAoreGNvbTAwMyBjb21wYXJlIDMwOTc1OTI2MSA2MjY2My40ODcgLT4gMQoreGRpdjAwMyBkaXZpZGUgMzA5NzU5MjYxIDYyNjYzLjQ4NyAtPiA0OTQzLjIxNzc1IEluZXhhY3QgUm91bmRlZAoreGR2aTAwMyBkaXZpZGVpbnQgMzA5NzU5MjYxIDYyNjYzLjQ4NyAtPiA0OTQzCit4bXVsMDAzIG11bHRpcGx5IDMwOTc1OTI2MSA2MjY2My40ODcgLT4gMS45NDEwNTk1NEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MDAzIHBvd2VyIDMwOTc1OTI2MSA2MjY2MyAtPiAxLjEzNjc5MTk5RSs1MzIwNzMgSW5leGFjdCBSb3VuZGVkCit4cmVtMDAzIHJlbWFpbmRlciAzMDk3NTkyNjEgNjI2NjMuNDg3IC0+IDEzNjQ0Ljc1OQoreHN1YjAwMyBzdWJ0cmFjdCAzMDk3NTkyNjEgNjI2NjMuNDg3IC0+IDMwOTY5NjU5OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMDQgYWRkIDMuOTM1OTE4ODhFLTIzNjU5NTYyNiA3MjQyMzc1LjAwIC0+IDcyNDIzNzUuMDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDA0IGNvbXBhcmUgMy45MzU5MTg4OEUtMjM2NTk1NjI2IDcyNDIzNzUuMDAgLT4gLTEKK3hkaXYwMDQgZGl2aWRlIDMuOTM1OTE4ODhFLTIzNjU5NTYyNiA3MjQyMzc1LjAwIC0+IDUuNDM0NTY5MzBFLTIzNjU5NTYzMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMDQgZGl2aWRlaW50IDMuOTM1OTE4ODhFLTIzNjU5NTYyNiA3MjQyMzc1LjAwIC0+IDAKK3htdWwwMDQgbXVsdGlwbHkgMy45MzU5MTg4OEUtMjM2NTk1NjI2IDcyNDIzNzUuMDAgLT4gMi44NTA1NDAwNUUtMjM2NTk1NjE5IEluZXhhY3QgUm91bmRlZAoreHBvdzAwNCBwb3dlciAzLjkzNTkxODg4RS0yMzY1OTU2MjYgNzI0MjM3NSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wMDQgcmVtYWluZGVyIDMuOTM1OTE4ODhFLTIzNjU5NTYyNiA3MjQyMzc1LjAwIC0+IDMuOTM1OTE4ODhFLTIzNjU5NTYyNgoreHN1YjAwNCBzdWJ0cmFjdCAzLjkzNTkxODg4RS0yMzY1OTU2MjYgNzI0MjM3NS4wMCAtPiAtNzI0MjM3NS4wMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMDUgYWRkIDMyMzkwMi43MTQgLTYwODY2OS42MDdFLTY1NzA2MDU2OCAtPiAzMjM5MDIuNzE0IEluZXhhY3QgUm91bmRlZAoreGNvbTAwNSBjb21wYXJlIDMyMzkwMi43MTQgLTYwODY2OS42MDdFLTY1NzA2MDU2OCAtPiAxCit4ZGl2MDA1IGRpdmlkZSAzMjM5MDIuNzE0IC02MDg2NjkuNjA3RS02NTcwNjA1NjggLT4gLTUuMzIxNDg2NTdFKzY1NzA2MDU2NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMDUgZGl2aWRlaW50IDMyMzkwMi43MTQgLTYwODY2OS42MDdFLTY1NzA2MDU2OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAwNSBtdWx0aXBseSAzMjM5MDIuNzE0IC02MDg2NjkuNjA3RS02NTcwNjA1NjggLT4gLTEuOTcxNDk3MzhFLTY1NzA2MDU1NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMDUgcG93ZXIgMzIzOTAyLjcxNCAtNiAtPiA4LjY1OTg5MjA0RS0zNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMDUgcmVtYWluZGVyIDMyMzkwMi43MTQgLTYwODY2OS42MDdFLTY1NzA2MDU2OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAwNSBzdWJ0cmFjdCAzMjM5MDIuNzE0IC02MDg2NjkuNjA3RS02NTcwNjA1NjggLT4gMzIzOTAyLjcxNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMDYgYWRkIDUuMTE5NzAwOTIgLTg4MDcuMjIwMzYgLT4gLTg4MDIuMTAwNjYgSW5leGFjdCBSb3VuZGVkCit4Y29tMDA2IGNvbXBhcmUgNS4xMTk3MDA5MiAtODgwNy4yMjAzNiAtPiAxCit4ZGl2MDA2IGRpdmlkZSA1LjExOTcwMDkyIC04ODA3LjIyMDM2IC0+IC0wLjAwMDU4MTMwNzIzNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMDYgZGl2aWRlaW50IDUuMTE5NzAwOTIgLTg4MDcuMjIwMzYgLT4gLTAKK3htdWwwMDYgbXVsdGlwbHkgNS4xMTk3MDA5MiAtODgwNy4yMjAzNiAtPiAtNDUwOTAuMzM0MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMDYgcG93ZXIgNS4xMTk3MDA5MiAtODgwNyAtPiA0LjgxODE5MjYyRS02MjQ3IEluZXhhY3QgUm91bmRlZAoreHJlbTAwNiByZW1haW5kZXIgNS4xMTk3MDA5MiAtODgwNy4yMjAzNiAtPiA1LjExOTcwMDkyCit4c3ViMDA2IHN1YnRyYWN0IDUuMTE5NzAwOTIgLTg4MDcuMjIwMzYgLT4gODgxMi4zNDAwNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMDcgYWRkIC03Ljk5ODc0NTE2IDQ1NjEuODM3NTggLT4gNDU1My44Mzg4MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMDcgY29tcGFyZSAtNy45OTg3NDUxNiA0NTYxLjgzNzU4IC0+IC0xCit4ZGl2MDA3IGRpdmlkZSAtNy45OTg3NDUxNiA0NTYxLjgzNzU4IC0+IC0wLjAwMTc1MzQwNDIwIEluZXhhY3QgUm91bmRlZAoreGR2aTAwNyBkaXZpZGVpbnQgLTcuOTk4NzQ1MTYgNDU2MS44Mzc1OCAtPiAtMAoreG11bDAwNyBtdWx0aXBseSAtNy45OTg3NDUxNiA0NTYxLjgzNzU4IC0+IC0zNjQ4OC45NzYzIEluZXhhY3QgUm91bmRlZAoreHBvdzAwNyBwb3dlciAtNy45OTg3NDUxNiA0NTYyIC0+IDMuODUyMzYxOTlFKzQxMTkgSW5leGFjdCBSb3VuZGVkCit4cmVtMDA3IHJlbWFpbmRlciAtNy45OTg3NDUxNiA0NTYxLjgzNzU4IC0+IC03Ljk5ODc0NTE2Cit4c3ViMDA3IHN1YnRyYWN0IC03Ljk5ODc0NTE2IDQ1NjEuODM3NTggLT4gLTQ1NjkuODM2MzMgSW5leGFjdCBSb3VuZGVkCit4YWRkMDA4IGFkZCAyOTc4MDI4NzggLTkyNzIwNi4zMjQgLT4gMjk2ODc1NjcyIEluZXhhY3QgUm91bmRlZAoreGNvbTAwOCBjb21wYXJlIDI5NzgwMjg3OCAtOTI3MjA2LjMyNCAtPiAxCit4ZGl2MDA4IGRpdmlkZSAyOTc4MDI4NzggLTkyNzIwNi4zMjQgLT4gLTMyMS4xODI5NjcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDA4IGRpdmlkZWludCAyOTc4MDI4NzggLTkyNzIwNi4zMjQgLT4gLTMyMQoreG11bDAwOCBtdWx0aXBseSAyOTc4MDI4NzggLTkyNzIwNi4zMjQgLT4gLTIuNzYxMjQ3MTJFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzAwOCBwb3dlciAyOTc4MDI4NzggLTkyNzIwNiAtPiAxLjk0NjAyODEwRS03ODU3MDc4IEluZXhhY3QgUm91bmRlZAoreHJlbTAwOCByZW1haW5kZXIgMjk3ODAyODc4IC05MjcyMDYuMzI0IC0+IDE2OTY0Ny45OTYKK3hzdWIwMDggc3VidHJhY3QgMjk3ODAyODc4IC05MjcyMDYuMzI0IC0+IDI5ODczMDA4NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMDkgYWRkIC03NjYuNjUxODI0IDMxMzAwLjM2MTkgLT4gMzA1MzMuNzEwMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMDkgY29tcGFyZSAtNzY2LjY1MTgyNCAzMTMwMC4zNjE5IC0+IC0xCit4ZGl2MDA5IGRpdmlkZSAtNzY2LjY1MTgyNCAzMTMwMC4zNjE5IC0+IC0wLjAyNDQ5MzM4NTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDA5IGRpdmlkZWludCAtNzY2LjY1MTgyNCAzMTMwMC4zNjE5IC0+IC0wCit4bXVsMDA5IG11bHRpcGx5IC03NjYuNjUxODI0IDMxMzAwLjM2MTkgLT4gLTIzOTk2NDc5LjUgSW5leGFjdCBSb3VuZGVkCit4cG93MDA5IHBvd2VyIC03NjYuNjUxODI0IDMxMzAwIC0+IDguMzcxODkwMTFFKzkwMjg3IEluZXhhY3QgUm91bmRlZAoreHJlbTAwOSByZW1haW5kZXIgLTc2Ni42NTE4MjQgMzEzMDAuMzYxOSAtPiAtNzY2LjY1MTgyNAoreHN1YjAwOSBzdWJ0cmFjdCAtNzY2LjY1MTgyNCAzMTMwMC4zNjE5IC0+IC0zMjA2Ny4wMTM3IEluZXhhY3QgUm91bmRlZAoreGFkZDAxMCBhZGQgLTU2NzQ2Ljg2ODlFKzkzNDk4MTk0MiA0NzEwMDI1MjEuIC0+IC01LjY3NDY4Njg5RSs5MzQ5ODE5NDYgSW5leGFjdCBSb3VuZGVkCit4Y29tMDEwIGNvbXBhcmUgLTU2NzQ2Ljg2ODlFKzkzNDk4MTk0MiA0NzEwMDI1MjEuIC0+IC0xCit4ZGl2MDEwIGRpdmlkZSAtNTY3NDYuODY4OUUrOTM0OTgxOTQyIDQ3MTAwMjUyMS4gLT4gLTEuMjA0ODEwMzBFKzkzNDk4MTkzOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMTAgZGl2aWRlaW50IC01Njc0Ni44Njg5RSs5MzQ5ODE5NDIgNDcxMDAyNTIxLiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAxMCBtdWx0aXBseSAtNTY3NDYuODY4OUUrOTM0OTgxOTQyIDQ3MTAwMjUyMS4gLT4gLTIuNjcyNzkxODNFKzkzNDk4MTk1NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMTAgcG93ZXIgLTU2NzQ2Ljg2ODlFKzkzNDk4MTk0MiA0NzEwMDI1MjEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTAxMCByZW1haW5kZXIgLTU2NzQ2Ljg2ODlFKzkzNDk4MTk0MiA0NzEwMDI1MjEuIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDEwIHN1YnRyYWN0IC01Njc0Ni44Njg5RSs5MzQ5ODE5NDIgNDcxMDAyNTIxLiAtPiAtNS42NzQ2ODY4OUUrOTM0OTgxOTQ2IEluZXhhY3QgUm91bmRlZAoreGFkZDAxMSBhZGQgNDU2NDE3MTYwIC00MTM0Ni4xMDI0IC0+IDQ1NjM3NTgxNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMTEgY29tcGFyZSA0NTY0MTcxNjAgLTQxMzQ2LjEwMjQgLT4gMQoreGRpdjAxMSBkaXZpZGUgNDU2NDE3MTYwIC00MTM0Ni4xMDI0IC0+IC0xMTAzOC45NDA0IEluZXhhY3QgUm91bmRlZAoreGR2aTAxMSBkaXZpZGVpbnQgNDU2NDE3MTYwIC00MTM0Ni4xMDI0IC0+IC0xMTAzOAoreG11bDAxMSBtdWx0aXBseSA0NTY0MTcxNjAgLTQxMzQ2LjEwMjQgLT4gLTEuODg3MTA3MDZFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzAxMSBwb3dlciA0NTY0MTcxNjAgLTQxMzQ2IC0+IDEuMDQ3NjY4NjNFLTM1ODAzMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTEgcmVtYWluZGVyIDQ1NjQxNzE2MCAtNDEzNDYuMTAyNCAtPiAzODg4MS43MDg4Cit4c3ViMDExIHN1YnRyYWN0IDQ1NjQxNzE2MCAtNDEzNDYuMTAyNCAtPiA0NTY0NTg1MDYgSW5leGFjdCBSb3VuZGVkCit4YWRkMDEyIGFkZCAxMDI4OTUuNzIyIC0yLjYyMjE0ODI2IC0+IDEwMjg5My4xMDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDEyIGNvbXBhcmUgMTAyODk1LjcyMiAtMi42MjIxNDgyNiAtPiAxCit4ZGl2MDEyIGRpdmlkZSAxMDI4OTUuNzIyIC0yLjYyMjE0ODI2IC0+IC0zOTI0MS4wMDA4IEluZXhhY3QgUm91bmRlZAoreGR2aTAxMiBkaXZpZGVpbnQgMTAyODk1LjcyMiAtMi42MjIxNDgyNiAtPiAtMzkyNDEKK3htdWwwMTIgbXVsdGlwbHkgMTAyODk1LjcyMiAtMi42MjIxNDgyNiAtPiAtMjY5ODA3LjgzOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMTIgcG93ZXIgMTAyODk1LjcyMiAtMyAtPiA5LjE3OTI2Nzg2RS0xNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTIgcmVtYWluZGVyIDEwMjg5NS43MjIgLTIuNjIyMTQ4MjYgLT4gMC4wMDIxMjkzNAoreHN1YjAxMiBzdWJ0cmFjdCAxMDI4OTUuNzIyIC0yLjYyMjE0ODI2IC0+IDEwMjg5OC4zNDQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDEzIGFkZCA2MS4zMDMzMzMxRSsxNTc2NDQxNDEgLTU2Nzc0MC45MThFLTg5MzQzOTQ1NiAtPiA2LjEzMDMzMzMxRSsxNTc2NDQxNDIgSW5leGFjdCBSb3VuZGVkCit4Y29tMDEzIGNvbXBhcmUgNjEuMzAzMzMzMUUrMTU3NjQ0MTQxIC01Njc3NDAuOTE4RS04OTM0Mzk0NTYgLT4gMQoreGRpdjAxMyBkaXZpZGUgNjEuMzAzMzMzMUUrMTU3NjQ0MTQxIC01Njc3NDAuOTE4RS04OTM0Mzk0NTYgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreGR2aTAxMyBkaXZpZGVpbnQgNjEuMzAzMzMzMUUrMTU3NjQ0MTQxIC01Njc3NDAuOTE4RS04OTM0Mzk0NTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMTMgbXVsdGlwbHkgNjEuMzAzMzMzMUUrMTU3NjQ0MTQxIC01Njc3NDAuOTE4RS04OTM0Mzk0NTYgLT4gLTMuNDgwNDQxMDZFLTczNTc5NTMwOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMTMgcG93ZXIgNjEuMzAzMzMzMUUrMTU3NjQ0MTQxIC02IC0+IDEuODg0MDYzMjJFLTk0NTg2NDg1NyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTMgcmVtYWluZGVyIDYxLjMwMzMzMzFFKzE1NzY0NDE0MSAtNTY3NzQwLjkxOEUtODkzNDM5NDU2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDEzIHN1YnRyYWN0IDYxLjMwMzMzMzFFKzE1NzY0NDE0MSAtNTY3NzQwLjkxOEUtODkzNDM5NDU2IC0+IDYuMTMwMzMzMzFFKzE1NzY0NDE0MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMTQgYWRkIDgwMjIzLjM4OTcgNzM5MjEuMDM4M0UtNDY3NzcyNjc1IC0+IDgwMjIzLjM4OTcgSW5leGFjdCBSb3VuZGVkCit4Y29tMDE0IGNvbXBhcmUgODAyMjMuMzg5NyA3MzkyMS4wMzgzRS00Njc3NzI2NzUgLT4gMQoreGRpdjAxNCBkaXZpZGUgODAyMjMuMzg5NyA3MzkyMS4wMzgzRS00Njc3NzI2NzUgLT4gMS4wODUyNTc4OUUrNDY3NzcyNjc1IEluZXhhY3QgUm91bmRlZAoreGR2aTAxNCBkaXZpZGVpbnQgODAyMjMuMzg5NyA3MzkyMS4wMzgzRS00Njc3NzI2NzUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMTQgbXVsdGlwbHkgODAyMjMuMzg5NyA3MzkyMS4wMzgzRS00Njc3NzI2NzUgLT4gNS45MzAxOTYyNkUtNDY3NzcyNjY2IEluZXhhY3QgUm91bmRlZAoreHBvdzAxNCBwb3dlciA4MDIyMy4zODk3IDcgLT4gMi4xMzg0ODkxOUUrMzQgSW5leGFjdCBSb3VuZGVkCit4cmVtMDE0IHJlbWFpbmRlciA4MDIyMy4zODk3IDczOTIxLjAzODNFLTQ2Nzc3MjY3NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAxNCBzdWJ0cmFjdCA4MDIyMy4zODk3IDczOTIxLjAzODNFLTQ2Nzc3MjY3NSAtPiA4MDIyMy4zODk3IEluZXhhY3QgUm91bmRlZAoreGFkZDAxNSBhZGQgLTY1NDY0NS45NTQgLTkuMTI1MzU3NTIgLT4gLTY1NDY1NS4wNzkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDE1IGNvbXBhcmUgLTY1NDY0NS45NTQgLTkuMTI1MzU3NTIgLT4gLTEKK3hkaXYwMTUgZGl2aWRlIC02NTQ2NDUuOTU0IC05LjEyNTM1NzUyIC0+IDcxNzM5LjIxMTYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDE1IGRpdmlkZWludCAtNjU0NjQ1Ljk1NCAtOS4xMjUzNTc1MiAtPiA3MTczOQoreG11bDAxNSBtdWx0aXBseSAtNjU0NjQ1Ljk1NCAtOS4xMjUzNTc1MiAtPiA1OTczODc4LjM4IEluZXhhY3QgUm91bmRlZAoreHBvdzAxNSBwb3dlciAtNjU0NjQ1Ljk1NCAtOSAtPiAtNC41MjgzNjY5MEUtNTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMDE1IHJlbWFpbmRlciAtNjU0NjQ1Ljk1NCAtOS4xMjUzNTc1MiAtPiAtMS45MzA4NzI3MgoreHN1YjAxNSBzdWJ0cmFjdCAtNjU0NjQ1Ljk1NCAtOS4xMjUzNTc1MiAtPiAtNjU0NjM2LjgyOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMTYgYWRkIDYzLjE5MTc3NzJFLTcwNjAxNDYzNCAtNy41NjI1MzI1N0UtMTM4NTc5MjM0IC0+IC03LjU2MjUzMjU3RS0xMzg1NzkyMzQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDE2IGNvbXBhcmUgNjMuMTkxNzc3MkUtNzA2MDE0NjM0IC03LjU2MjUzMjU3RS0xMzg1NzkyMzQgLT4gMQoreGRpdjAxNiBkaXZpZGUgNjMuMTkxNzc3MkUtNzA2MDE0NjM0IC03LjU2MjUzMjU3RS0xMzg1NzkyMzQgLT4gLTguMzU1OTAxNDlFLTU2NzQzNTQwMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMTYgZGl2aWRlaW50IDYzLjE5MTc3NzJFLTcwNjAxNDYzNCAtNy41NjI1MzI1N0UtMTM4NTc5MjM0IC0+IC0wCit4bXVsMDE2IG11bHRpcGx5IDYzLjE5MTc3NzJFLTcwNjAxNDYzNCAtNy41NjI1MzI1N0UtMTM4NTc5MjM0IC0+IC00Ljc3ODg5ODczRS04NDQ1OTM4NjYgSW5leGFjdCBSb3VuZGVkCit4cG93MDE2IHBvd2VyIDYzLjE5MTc3NzJFLTcwNjAxNDYzNCAtOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTYgcmVtYWluZGVyIDYzLjE5MTc3NzJFLTcwNjAxNDYzNCAtNy41NjI1MzI1N0UtMTM4NTc5MjM0IC0+IDYuMzE5MTc3NzJFLTcwNjAxNDYzMworeHN1YjAxNiBzdWJ0cmFjdCA2My4xOTE3NzcyRS03MDYwMTQ2MzQgLTcuNTYyNTMyNTdFLTEzODU3OTIzNCAtPiA3LjU2MjUzMjU3RS0xMzg1NzkyMzQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDE3IGFkZCAtMzk2NzQuNzE5MCAyNDkwNjA3Ljc4IC0+IDI0NTA5MzMuMDYgSW5leGFjdCBSb3VuZGVkCit4Y29tMDE3IGNvbXBhcmUgLTM5Njc0LjcxOTAgMjQ5MDYwNy43OCAtPiAtMQoreGRpdjAxNyBkaXZpZGUgLTM5Njc0LjcxOTAgMjQ5MDYwNy43OCAtPiAtMC4wMTU5Mjk3MzM4IEluZXhhY3QgUm91bmRlZAoreGR2aTAxNyBkaXZpZGVpbnQgLTM5Njc0LjcxOTAgMjQ5MDYwNy43OCAtPiAtMAoreG11bDAxNyBtdWx0aXBseSAtMzk2NzQuNzE5MCAyNDkwNjA3Ljc4IC0+IC05Ljg4MTQxNjM4RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMTcgcG93ZXIgLTM5Njc0LjcxOTAgMjQ5MDYwOCAtPiAyLjU1MDMyMzI5RSsxMTQ1MzA5NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMTcgcmVtYWluZGVyIC0zOTY3NC43MTkwIDI0OTA2MDcuNzggLT4gLTM5Njc0LjcxOTAKK3hzdWIwMTcgc3VidHJhY3QgLTM5Njc0LjcxOTAgMjQ5MDYwNy43OCAtPiAtMjUzMDI4Mi41MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMTggYWRkIC0zMzY0LjU5NzM3RS02MDAzNjM2ODEgODk2NDg3LjQ1MSAtPiA4OTY0ODcuNDUxIEluZXhhY3QgUm91bmRlZAoreGNvbTAxOCBjb21wYXJlIC0zMzY0LjU5NzM3RS02MDAzNjM2ODEgODk2NDg3LjQ1MSAtPiAtMQoreGRpdjAxOCBkaXZpZGUgLTMzNjQuNTk3MzdFLTYwMDM2MzY4MSA4OTY0ODcuNDUxIC0+IC0zLjc1MzA4OTIwRS02MDAzNjM2ODQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDE4IGRpdmlkZWludCAtMzM2NC41OTczN0UtNjAwMzYzNjgxIDg5NjQ4Ny40NTEgLT4gLTAKK3htdWwwMTggbXVsdGlwbHkgLTMzNjQuNTk3MzdFLTYwMDM2MzY4MSA4OTY0ODcuNDUxIC0+IC0zLjAxNjMxOTMyRS02MDAzNjM2NzIgSW5leGFjdCBSb3VuZGVkCit4cG93MDE4IHBvd2VyIC0zMzY0LjU5NzM3RS02MDAzNjM2ODEgODk2NDg3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wMTggcmVtYWluZGVyIC0zMzY0LjU5NzM3RS02MDAzNjM2ODEgODk2NDg3LjQ1MSAtPiAtMy4zNjQ1OTczN0UtNjAwMzYzNjc4Cit4c3ViMDE4IHN1YnRyYWN0IC0zMzY0LjU5NzM3RS02MDAzNjM2ODEgODk2NDg3LjQ1MSAtPiAtODk2NDg3LjQ1MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMTkgYWRkIC02NDEzOC4wNTc4IDMxNzU5MDExLjNFKzY5NzQ4ODM0MiAtPiAzLjE3NTkwMTEzRSs2OTc0ODgzNDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDE5IGNvbXBhcmUgLTY0MTM4LjA1NzggMzE3NTkwMTEuM0UrNjk3NDg4MzQyIC0+IC0xCit4ZGl2MDE5IGRpdmlkZSAtNjQxMzguMDU3OCAzMTc1OTAxMS4zRSs2OTc0ODgzNDIgLT4gLTIuMDE5NTIzMTNFLTY5NzQ4ODM0NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMTkgZGl2aWRlaW50IC02NDEzOC4wNTc4IDMxNzU5MDExLjNFKzY5NzQ4ODM0MiAtPiAtMAoreG11bDAxOSBtdWx0aXBseSAtNjQxMzguMDU3OCAzMTc1OTAxMS4zRSs2OTc0ODgzNDIgLT4gLTIuMDM2OTYxMzBFKzY5NzQ4ODM1NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMTkgcG93ZXIgLTY0MTM4LjA1NzggMyAtPiAtMi42Mzg0NDExNkUrMTQgSW5leGFjdCBSb3VuZGVkCit4cmVtMDE5IHJlbWFpbmRlciAtNjQxMzguMDU3OCAzMTc1OTAxMS4zRSs2OTc0ODgzNDIgLT4gLTY0MTM4LjA1NzgKK3hzdWIwMTkgc3VidHJhY3QgLTY0MTM4LjA1NzggMzE3NTkwMTEuM0UrNjk3NDg4MzQyIC0+IC0zLjE3NTkwMTEzRSs2OTc0ODgzNDkgSW5leGFjdCBSb3VuZGVkCit4YWRkMDIwIGFkZCA2MTM5OS44NTI3IC02NDM0NDQ4NC41IC0+IC02NDI4MzA4NC42IEluZXhhY3QgUm91bmRlZAoreGNvbTAyMCBjb21wYXJlIDYxMzk5Ljg1MjcgLTY0MzQ0NDg0LjUgLT4gMQoreGRpdjAyMCBkaXZpZGUgNjEzOTkuODUyNyAtNjQzNDQ0ODQuNSAtPiAtMC4wMDA5NTQyMzY0NTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDIwIGRpdmlkZWludCA2MTM5OS44NTI3IC02NDM0NDQ4NC41IC0+IC0wCit4bXVsMDIwIG11bHRpcGx5IDYxMzk5Ljg1MjcgLTY0MzQ0NDg0LjUgLT4gLTMuOTUwNzQxODdFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzAyMCBwb3dlciA2MTM5OS44NTI3IC02NDM0NDQ4NSAtPiAxLjI3Mzc4ODQyRS0zMDgwOTIxNjEgSW5leGFjdCBSb3VuZGVkCit4cmVtMDIwIHJlbWFpbmRlciA2MTM5OS44NTI3IC02NDM0NDQ4NC41IC0+IDYxMzk5Ljg1MjcKK3hzdWIwMjAgc3VidHJhY3QgNjEzOTkuODUyNyAtNjQzNDQ0ODQuNSAtPiA2NDQwNTg4NC40IEluZXhhY3QgUm91bmRlZAoreGFkZDAyMSBhZGQgLTcyMjk2MC4yMDQgLTI2MTU0NTk5LjggLT4gLTI2ODc3NTYwLjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDIxIGNvbXBhcmUgLTcyMjk2MC4yMDQgLTI2MTU0NTk5LjggLT4gMQoreGRpdjAyMSBkaXZpZGUgLTcyMjk2MC4yMDQgLTI2MTU0NTk5LjggLT4gMC4wMjc2NDE3OTk1IEluZXhhY3QgUm91bmRlZAoreGR2aTAyMSBkaXZpZGVpbnQgLTcyMjk2MC4yMDQgLTI2MTU0NTk5LjggLT4gMAoreG11bDAyMSBtdWx0aXBseSAtNzIyOTYwLjIwNCAtMjYxNTQ1OTkuOCAtPiAxLjg5MDg3MzQ4RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMjEgcG93ZXIgLTcyMjk2MC4yMDQgLTI2MTU0NjAwIC0+IDUuMzQyMzYxMzlFLTE1MzI0Mjc5NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMjEgcmVtYWluZGVyIC03MjI5NjAuMjA0IC0yNjE1NDU5OS44IC0+IC03MjI5NjAuMjA0Cit4c3ViMDIxIHN1YnRyYWN0IC03MjI5NjAuMjA0IC0yNjE1NDU5OS44IC0+IDI1NDMxNjM5LjYgSW5leGFjdCBSb3VuZGVkCit4YWRkMDIyIGFkZCA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMuMiAtPiA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMDIyIGNvbXBhcmUgOS40NzEwOTk1OUUrMjMwNTY1MDkzIDczMzU0NzIzLjIgLT4gMQoreGRpdjAyMiBkaXZpZGUgOS40NzEwOTk1OUUrMjMwNTY1MDkzIDczMzU0NzIzLjIgLT4gMS4yOTExMzY5OEUrMjMwNTY1MDg2IEluZXhhY3QgUm91bmRlZAoreGR2aTAyMiBkaXZpZGVpbnQgOS40NzEwOTk1OUUrMjMwNTY1MDkzIDczMzU0NzIzLjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMjIgbXVsdGlwbHkgOS40NzEwOTk1OUUrMjMwNTY1MDkzIDczMzU0NzIzLjIgLT4gNi45NDc0OTg4OUUrMjMwNTY1MTAxIEluZXhhY3QgUm91bmRlZAoreHBvdzAyMiBwb3dlciA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDIyIHJlbWFpbmRlciA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMuMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAyMiBzdWJ0cmFjdCA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgNzMzNTQ3MjMuMiAtPiA5LjQ3MTA5OTU5RSsyMzA1NjUwOTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMDIzIGFkZCA0My43NDU2MjQ1IDU0NzQ0MTk1Ni4gLT4gNTQ3NDQyMDAwIEluZXhhY3QgUm91bmRlZAoreGNvbTAyMyBjb21wYXJlIDQzLjc0NTYyNDUgNTQ3NDQxOTU2LiAtPiAtMQoreGRpdjAyMyBkaXZpZGUgNDMuNzQ1NjI0NSA1NDc0NDE5NTYuIC0+IDcuOTkwOTE1NTdFLTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDIzIGRpdmlkZWludCA0My43NDU2MjQ1IDU0NzQ0MTk1Ni4gLT4gMAoreG11bDAyMyBtdWx0aXBseSA0My43NDU2MjQ1IDU0NzQ0MTk1Ni4gLT4gMi4zOTQ4MTkwMkUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MDIzIHBvd2VyIDQzLjc0NTYyNDUgNTQ3NDQxOTU2IC0+IDIuOTE3NDIzOTFFKzg5ODMxNjQ1OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMjMgcmVtYWluZGVyIDQzLjc0NTYyNDUgNTQ3NDQxOTU2LiAtPiA0My43NDU2MjQ1Cit4c3ViMDIzIHN1YnRyYWN0IDQzLjc0NTYyNDUgNTQ3NDQxOTU2LiAtPiAtNTQ3NDQxOTEyIEluZXhhY3QgUm91bmRlZAoreGFkZDAyNCBhZGQgLTczMTUwNTQyRS0yNDIwMTczOTAgLTguMTU4Njk5NTQgLT4gLTguMTU4Njk5NTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDI0IGNvbXBhcmUgLTczMTUwNTQyRS0yNDIwMTczOTAgLTguMTU4Njk5NTQgLT4gMQoreGRpdjAyNCBkaXZpZGUgLTczMTUwNTQyRS0yNDIwMTczOTAgLTguMTU4Njk5NTQgLT4gOC45NjU5NTYxMUUtMjQyMDE3Mzg0IEluZXhhY3QgUm91bmRlZAoreGR2aTAyNCBkaXZpZGVpbnQgLTczMTUwNTQyRS0yNDIwMTczOTAgLTguMTU4Njk5NTQgLT4gMAoreG11bDAyNCBtdWx0aXBseSAtNzMxNTA1NDJFLTI0MjAxNzM5MCAtOC4xNTg2OTk1NCAtPiA1Ljk2ODEzMjkzRS0yNDIwMTczODIgSW5leGFjdCBSb3VuZGVkCit4cG93MDI0IHBvd2VyIC03MzE1MDU0MkUtMjQyMDE3MzkwIC04IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTAyNCByZW1haW5kZXIgLTczMTUwNTQyRS0yNDIwMTczOTAgLTguMTU4Njk5NTQgLT4gLTcuMzE1MDU0MkUtMjQyMDE3MzgzCit4c3ViMDI0IHN1YnRyYWN0IC03MzE1MDU0MkUtMjQyMDE3MzkwIC04LjE1ODY5OTU0IC0+IDguMTU4Njk5NTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDI1IGFkZCAyMDE1LjYyMTA5RSsyOTk4OTc1OTYgLTExNzg4OTE2LjEgLT4gMi4wMTU2MjEwOUUrMjk5ODk3NTk5IEluZXhhY3QgUm91bmRlZAoreGNvbTAyNSBjb21wYXJlIDIwMTUuNjIxMDlFKzI5OTg5NzU5NiAtMTE3ODg5MTYuMSAtPiAxCit4ZGl2MDI1IGRpdmlkZSAyMDE1LjYyMTA5RSsyOTk4OTc1OTYgLTExNzg4OTE2LjEgLT4gLTEuNzA5NzU5NDdFKzI5OTg5NzU5MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMjUgZGl2aWRlaW50IDIwMTUuNjIxMDlFKzI5OTg5NzU5NiAtMTE3ODg5MTYuMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDAyNSBtdWx0aXBseSAyMDE1LjYyMTA5RSsyOTk4OTc1OTYgLTExNzg4OTE2LjEgLT4gLTIuMzc2MTk4NzlFKzI5OTg5NzYwNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMjUgcG93ZXIgMjAxNS42MjEwOUUrMjk5ODk3NTk2IC0xMTc4ODkxNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wMjUgcmVtYWluZGVyIDIwMTUuNjIxMDlFKzI5OTg5NzU5NiAtMTE3ODg5MTYuMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAyNSBzdWJ0cmFjdCAyMDE1LjYyMTA5RSsyOTk4OTc1OTYgLTExNzg4OTE2LjEgLT4gMi4wMTU2MjEwOUUrMjk5ODk3NTk5IEluZXhhY3QgUm91bmRlZAoreGFkZDAyNiBhZGQgMjkuNDk4MTE0IC0yNjQ4NjQ1MSAtPiAtMjY0ODY0MjEuNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMjYgY29tcGFyZSAyOS40OTgxMTQgLTI2NDg2NDUxIC0+IDEKK3hkaXYwMjYgZGl2aWRlIDI5LjQ5ODExNCAtMjY0ODY0NTEgLT4gLTAuMDAwMDAxMTEzNzA1ODAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDI2IGRpdmlkZWludCAyOS40OTgxMTQgLTI2NDg2NDUxIC0+IC0wCit4bXVsMDI2IG11bHRpcGx5IDI5LjQ5ODExNCAtMjY0ODY0NTEgLT4gLTc4MTMwMDM1MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMjYgcG93ZXIgMjkuNDk4MTE0IC0yNjQ4NjQ1MSAtPiA0LjIyMjUyNTEzRS0zODkyOTYzNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMjYgcmVtYWluZGVyIDI5LjQ5ODExNCAtMjY0ODY0NTEgLT4gMjkuNDk4MTE0Cit4c3ViMDI2IHN1YnRyYWN0IDI5LjQ5ODExNCAtMjY0ODY0NTEgLT4gMjY0ODY0ODAuNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMjcgYWRkIDI0NDM3NTA0My5FKzEzMDg0MDg3OCAtOS40NDUyMjAyOSAtPiAyLjQ0Mzc1MDQzRSsxMzA4NDA4ODYgSW5leGFjdCBSb3VuZGVkCit4Y29tMDI3IGNvbXBhcmUgMjQ0Mzc1MDQzLkUrMTMwODQwODc4IC05LjQ0NTIyMDI5IC0+IDEKK3hkaXYwMjcgZGl2aWRlIDI0NDM3NTA0My5FKzEzMDg0MDg3OCAtOS40NDUyMjAyOSAtPiAtMi41ODcyODc5MUUrMTMwODQwODg1IEluZXhhY3QgUm91bmRlZAoreGR2aTAyNyBkaXZpZGVpbnQgMjQ0Mzc1MDQzLkUrMTMwODQwODc4IC05LjQ0NTIyMDI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDI3IG11bHRpcGx5IDI0NDM3NTA0My5FKzEzMDg0MDg3OCAtOS40NDUyMjAyOSAtPiAtMi4zMDgxNzYxMUUrMTMwODQwODg3IEluZXhhY3QgUm91bmRlZAoreHBvdzAyNyBwb3dlciAyNDQzNzUwNDMuRSsxMzA4NDA4NzggLTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDI3IHJlbWFpbmRlciAyNDQzNzUwNDMuRSsxMzA4NDA4NzggLTkuNDQ1MjIwMjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwMjcgc3VidHJhY3QgMjQ0Mzc1MDQzLkUrMTMwODQwODc4IC05LjQ0NTIyMDI5IC0+IDIuNDQzNzUwNDNFKzEzMDg0MDg4NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMjggYWRkIC0zNDkzODguNzU5IC0xOTYyMTUuNzc2IC0+IC01NDU2MDQuNTM1Cit4Y29tMDI4IGNvbXBhcmUgLTM0OTM4OC43NTkgLTE5NjIxNS43NzYgLT4gLTEKK3hkaXYwMjggZGl2aWRlIC0zNDkzODguNzU5IC0xOTYyMTUuNzc2IC0+IDEuNzgwNjM1NDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDI4IGRpdmlkZWludCAtMzQ5Mzg4Ljc1OSAtMTk2MjE1Ljc3NiAtPiAxCit4bXVsMDI4IG11bHRpcGx5IC0zNDkzODguNzU5IC0xOTYyMTUuNzc2IC0+IDYuODU1NTU4NjVFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzAyOCBwb3dlciAtMzQ5Mzg4Ljc1OSAtMTk2MjE2IC0+IDEuMjQ1NTE3NTJFLTEwODc2ODYgSW5leGFjdCBSb3VuZGVkCit4cmVtMDI4IHJlbWFpbmRlciAtMzQ5Mzg4Ljc1OSAtMTk2MjE1Ljc3NiAtPiAtMTUzMTcyLjk4MworeHN1YjAyOCBzdWJ0cmFjdCAtMzQ5Mzg4Ljc1OSAtMTk2MjE1Ljc3NiAtPiAtMTUzMTcyLjk4MworeGFkZDAyOSBhZGQgLTcwOTA1MTEyLjQgLTkxMzUzOTY4LjggLT4gLTE2MjI1OTA4MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMjkgY29tcGFyZSAtNzA5MDUxMTIuNCAtOTEzNTM5NjguOCAtPiAxCit4ZGl2MDI5IGRpdmlkZSAtNzA5MDUxMTIuNCAtOTEzNTM5NjguOCAtPiAwLjc3NjE1Nzk4NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwMjkgZGl2aWRlaW50IC03MDkwNTExMi40IC05MTM1Mzk2OC44IC0+IDAKK3htdWwwMjkgbXVsdGlwbHkgLTcwOTA1MTEyLjQgLTkxMzUzOTY4LjggLT4gNi40Nzc0NjM0M0UrMTUgSW5leGFjdCBSb3VuZGVkCit4cG93MDI5IHBvd2VyIC03MDkwNTExMi40IC05MTM1Mzk2OSAtPiAtMy4wNTk0NDc0MUUtNzE3MTkwNTU0IEluZXhhY3QgUm91bmRlZAoreHJlbTAyOSByZW1haW5kZXIgLTcwOTA1MTEyLjQgLTkxMzUzOTY4LjggLT4gLTcwOTA1MTEyLjQKK3hzdWIwMjkgc3VidHJhY3QgLTcwOTA1MTEyLjQgLTkxMzUzOTY4LjggLT4gMjA0NDg4NTYuNAoreGFkZDAzMCBhZGQgLTIyNTA5NC4yOCAtODguNzcyMzU0MiAtPiAtMjI1MTgzLjA1MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMzAgY29tcGFyZSAtMjI1MDk0LjI4IC04OC43NzIzNTQyIC0+IC0xCit4ZGl2MDMwIGRpdmlkZSAtMjI1MDk0LjI4IC04OC43NzIzNTQyIC0+IDI1MzUuNjM0OTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDMwIGRpdmlkZWludCAtMjI1MDk0LjI4IC04OC43NzIzNTQyIC0+IDI1MzUKK3htdWwwMzAgbXVsdGlwbHkgLTIyNTA5NC4yOCAtODguNzcyMzU0MiAtPiAxOTk4MjE0OS4yIEluZXhhY3QgUm91bmRlZAoreHBvdzAzMCBwb3dlciAtMjI1MDk0LjI4IC04OSAtPiAtNC4zNjA3Njk2NUUtNDc3IEluZXhhY3QgUm91bmRlZAoreHJlbTAzMCByZW1haW5kZXIgLTIyNTA5NC4yOCAtODguNzcyMzU0MiAtPiAtNTYuMzYyMTAzMAoreHN1YjAzMCBzdWJ0cmFjdCAtMjI1MDk0LjI4IC04OC43NzIzNTQyIC0+IC0yMjUwMDUuNTA4IEluZXhhY3QgUm91bmRlZAoreGFkZDAzMSBhZGQgNTAuNDQ0MjM0MCA4Mi43OTUyMTY5RSs4ODAxMjA3NTkgLT4gOC4yNzk1MjE2OUUrODgwMTIwNzYwIEluZXhhY3QgUm91bmRlZAoreGNvbTAzMSBjb21wYXJlIDUwLjQ0NDIzNDAgODIuNzk1MjE2OUUrODgwMTIwNzU5IC0+IC0xCit4ZGl2MDMxIGRpdmlkZSA1MC40NDQyMzQwIDgyLjc5NTIxNjlFKzg4MDEyMDc1OSAtPiA2LjA5MjY1MDc1RS04ODAxMjA3NjAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDMxIGRpdmlkZWludCA1MC40NDQyMzQwIDgyLjc5NTIxNjlFKzg4MDEyMDc1OSAtPiAwCit4bXVsMDMxIG11bHRpcGx5IDUwLjQ0NDIzNDAgODIuNzk1MjE2OUUrODgwMTIwNzU5IC0+IDQuMTc2NTQxMzBFKzg4MDEyMDc2MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMzEgcG93ZXIgNTAuNDQ0MjM0MCA4IC0+IDQuMTkyNjg1MThFKzEzIEluZXhhY3QgUm91bmRlZAoreHJlbTAzMSByZW1haW5kZXIgNTAuNDQ0MjM0MCA4Mi43OTUyMTY5RSs4ODAxMjA3NTkgLT4gNTAuNDQ0MjM0MAoreHN1YjAzMSBzdWJ0cmFjdCA1MC40NDQyMzQwIDgyLjc5NTIxNjlFKzg4MDEyMDc1OSAtPiAtOC4yNzk1MjE2OUUrODgwMTIwNzYwIEluZXhhY3QgUm91bmRlZAoreGFkZDAzMiBhZGQgLTMyMzExLjkwMzcgOC4zNjM3OTQ0OSAtPiAtMzIzMDMuNTM5OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMzIgY29tcGFyZSAtMzIzMTEuOTAzNyA4LjM2Mzc5NDQ5IC0+IC0xCit4ZGl2MDMyIGRpdmlkZSAtMzIzMTEuOTAzNyA4LjM2Mzc5NDQ5IC0+IC0zODYzLjMwNjc1IEluZXhhY3QgUm91bmRlZAoreGR2aTAzMiBkaXZpZGVpbnQgLTMyMzExLjkwMzcgOC4zNjM3OTQ0OSAtPiAtMzg2MworeG11bDAzMiBtdWx0aXBseSAtMzIzMTEuOTAzNyA4LjM2Mzc5NDQ5IC0+IC0yNzAyNTAuMTIyIEluZXhhY3QgUm91bmRlZAoreHBvdzAzMiBwb3dlciAtMzIzMTEuOTAzNyA4IC0+IDEuMTg4MjI5NjBFKzM2IEluZXhhY3QgUm91bmRlZAoreHJlbTAzMiByZW1haW5kZXIgLTMyMzExLjkwMzcgOC4zNjM3OTQ0OSAtPiAtMi41NjU1ODUxMworeHN1YjAzMiBzdWJ0cmFjdCAtMzIzMTEuOTAzNyA4LjM2Mzc5NDQ5IC0+IC0zMjMyMC4yNjc1IEluZXhhY3QgUm91bmRlZAoreGFkZDAzMyBhZGQgNjE1Mzk2MTU2LkUrNTQ5ODk1MjkxIC0yOTUzMDI0Ny40IC0+IDYuMTUzOTYxNTZFKzU0OTg5NTI5OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMzMgY29tcGFyZSA2MTUzOTYxNTYuRSs1NDk4OTUyOTEgLTI5NTMwMjQ3LjQgLT4gMQoreGRpdjAzMyBkaXZpZGUgNjE1Mzk2MTU2LkUrNTQ5ODk1MjkxIC0yOTUzMDI0Ny40IC0+IC0yLjA4Mzk1MTkxRSs1NDk4OTUyOTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDMzIGRpdmlkZWludCA2MTUzOTYxNTYuRSs1NDk4OTUyOTEgLTI5NTMwMjQ3LjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMzMgbXVsdGlwbHkgNjE1Mzk2MTU2LkUrNTQ5ODk1MjkxIC0yOTUzMDI0Ny40IC0+IC0xLjgxNzI4MDA3RSs1NDk4OTUzMDcgSW5leGFjdCBSb3VuZGVkCit4cG93MDMzIHBvd2VyIDYxNTM5NjE1Ni5FKzU0OTg5NTI5MSAtMjk1MzAyNDcgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDMzIHJlbWFpbmRlciA2MTUzOTYxNTYuRSs1NDk4OTUyOTEgLTI5NTMwMjQ3LjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwMzMgc3VidHJhY3QgNjE1Mzk2MTU2LkUrNTQ5ODk1MjkxIC0yOTUzMDI0Ny40IC0+IDYuMTUzOTYxNTZFKzU0OTg5NTI5OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMzQgYWRkIDU5Mi4xNDIxNzNFLTQxOTk0MTQxNiAtMy40NjA3OTEwOUUtODQ0MDExODQ1IC0+IDUuOTIxNDIxNzNFLTQxOTk0MTQxNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMzQgY29tcGFyZSA1OTIuMTQyMTczRS00MTk5NDE0MTYgLTMuNDYwNzkxMDlFLTg0NDAxMTg0NSAtPiAxCit4ZGl2MDM0IGRpdmlkZSA1OTIuMTQyMTczRS00MTk5NDE0MTYgLTMuNDYwNzkxMDlFLTg0NDAxMTg0NSAtPiAtMS43MTEwMDIzNkUrNDI0MDcwNDMxIEluZXhhY3QgUm91bmRlZAoreGR2aTAzNCBkaXZpZGVpbnQgNTkyLjE0MjE3M0UtNDE5OTQxNDE2IC0zLjQ2MDc5MTA5RS04NDQwMTE4NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwMzQgbXVsdGlwbHkgNTkyLjE0MjE3M0UtNDE5OTQxNDE2IC0zLjQ2MDc5MTA5RS04NDQwMTE4NDUgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzAzNCBwb3dlciA1OTIuMTQyMTczRS00MTk5NDE0MTYgLTMgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDM0IHJlbWFpbmRlciA1OTIuMTQyMTczRS00MTk5NDE0MTYgLTMuNDYwNzkxMDlFLTg0NDAxMTg0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAzNCBzdWJ0cmFjdCA1OTIuMTQyMTczRS00MTk5NDE0MTYgLTMuNDYwNzkxMDlFLTg0NDAxMTg0NSAtPiA1LjkyMTQyMTczRS00MTk5NDE0MTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDM1IGFkZCA4NDkuNTE1OTkzRS04Nzg0NDY0NzMgLTEwMzkuMDg3NzggLT4gLTEwMzkuMDg3NzggSW5leGFjdCBSb3VuZGVkCit4Y29tMDM1IGNvbXBhcmUgODQ5LjUxNTk5M0UtODc4NDQ2NDczIC0xMDM5LjA4Nzc4IC0+IDEKK3hkaXYwMzUgZGl2aWRlIDg0OS41MTU5OTNFLTg3ODQ0NjQ3MyAtMTAzOS4wODc3OCAtPiAtOC4xNzU1OTQxMUUtODc4NDQ2NDc0IEluZXhhY3QgUm91bmRlZAoreGR2aTAzNSBkaXZpZGVpbnQgODQ5LjUxNTk5M0UtODc4NDQ2NDczIC0xMDM5LjA4Nzc4IC0+IC0wCit4bXVsMDM1IG11bHRpcGx5IDg0OS41MTU5OTNFLTg3ODQ0NjQ3MyAtMTAzOS4wODc3OCAtPiAtOC44MjcyMTY4N0UtODc4NDQ2NDY4IEluZXhhY3QgUm91bmRlZAoreHBvdzAzNSBwb3dlciA4NDkuNTE1OTkzRS04Nzg0NDY0NzMgLTEwMzkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDM1IHJlbWFpbmRlciA4NDkuNTE1OTkzRS04Nzg0NDY0NzMgLTEwMzkuMDg3NzggLT4gOC40OTUxNTk5M0UtODc4NDQ2NDcxCit4c3ViMDM1IHN1YnRyYWN0IDg0OS41MTU5OTNFLTg3ODQ0NjQ3MyAtMTAzOS4wODc3OCAtPiAxMDM5LjA4Nzc4IEluZXhhY3QgUm91bmRlZAoreGFkZDAzNiBhZGQgMjEzMzYxNzg5IC01OTkuNjQ0ODUxIC0+IDIxMzM2MTE4OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wMzYgY29tcGFyZSAyMTMzNjE3ODkgLTU5OS42NDQ4NTEgLT4gMQoreGRpdjAzNiBkaXZpZGUgMjEzMzYxNzg5IC01OTkuNjQ0ODUxIC0+IC0zNTU4MTMuNTkzIEluZXhhY3QgUm91bmRlZAoreGR2aTAzNiBkaXZpZGVpbnQgMjEzMzYxNzg5IC01OTkuNjQ0ODUxIC0+IC0zNTU4MTMKK3htdWwwMzYgbXVsdGlwbHkgMjEzMzYxNzg5IC01OTkuNjQ0ODUxIC0+IC0xLjI3OTQxMjk4RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMzYgcG93ZXIgMjEzMzYxNzg5IC02MDAgLT4gMy4zODg1NDY4NEUtNDk5OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMzYgcmVtYWluZGVyIDIxMzM2MTc4OSAtNTk5LjY0NDg1MSAtPiAzNTUuNjMxMTM3Cit4c3ViMDM2IHN1YnRyYWN0IDIxMzM2MTc4OSAtNTk5LjY0NDg1MSAtPiAyMTMzNjIzODkgSW5leGFjdCBSb3VuZGVkCit4YWRkMDM3IGFkZCAtNzk1NTIyNTU1LiAtMjk4LjAzNzcwMiAtPiAtNzk1NTIyODUzIEluZXhhY3QgUm91bmRlZAoreGNvbTAzNyBjb21wYXJlIC03OTU1MjI1NTUuIC0yOTguMDM3NzAyIC0+IC0xCit4ZGl2MDM3IGRpdmlkZSAtNzk1NTIyNTU1LiAtMjk4LjAzNzcwMiAtPiAyNjY5MjAxLjA4IEluZXhhY3QgUm91bmRlZAoreGR2aTAzNyBkaXZpZGVpbnQgLTc5NTUyMjU1NS4gLTI5OC4wMzc3MDIgLT4gMjY2OTIwMQoreG11bDAzNyBtdWx0aXBseSAtNzk1NTIyNTU1LiAtMjk4LjAzNzcwMiAtPiAyLjM3MDk1NzE0RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwMzcgcG93ZXIgLTc5NTUyMjU1NS4gLTI5OCAtPiA0LjAzMjMyNzEyRS0yNjUzIEluZXhhY3QgUm91bmRlZAoreHJlbTAzNyByZW1haW5kZXIgLTc5NTUyMjU1NS4gLTI5OC4wMzc3MDIgLT4gLTIyLjc4Mzg5OAoreHN1YjAzNyBzdWJ0cmFjdCAtNzk1NTIyNTU1LiAtMjk4LjAzNzcwMiAtPiAtNzk1NTIyMjU3IEluZXhhY3QgUm91bmRlZAoreGFkZDAzOCBhZGQgLTUwMTI2MDY1MS4gLTg3NjE4OTMuMEUtNjg5MjgxNDc5IC0+IC01MDEyNjA2NTEgSW5leGFjdCBSb3VuZGVkCit4Y29tMDM4IGNvbXBhcmUgLTUwMTI2MDY1MS4gLTg3NjE4OTMuMEUtNjg5MjgxNDc5IC0+IC0xCit4ZGl2MDM4IGRpdmlkZSAtNTAxMjYwNjUxLiAtODc2MTg5My4wRS02ODkyODE0NzkgLT4gNS43MjA5MTcyOEUrNjg5MjgxNDgwIEluZXhhY3QgUm91bmRlZAoreGR2aTAzOCBkaXZpZGVpbnQgLTUwMTI2MDY1MS4gLTg3NjE4OTMuMEUtNjg5MjgxNDc5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDM4IG11bHRpcGx5IC01MDEyNjA2NTEuIC04NzYxODkzLjBFLTY4OTI4MTQ3OSAtPiA0LjM5MTk5MjE5RS02ODkyODE0NjQgSW5leGFjdCBSb3VuZGVkCit4cG93MDM4IHBvd2VyIC01MDEyNjA2NTEuIC05IC0+IC01LjAwNTI2OTYxRS03OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wMzggcmVtYWluZGVyIC01MDEyNjA2NTEuIC04NzYxODkzLjBFLTY4OTI4MTQ3OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjAzOCBzdWJ0cmFjdCAtNTAxMjYwNjUxLiAtODc2MTg5My4wRS02ODkyODE0NzkgLT4gLTUwMTI2MDY1MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwMzkgYWRkIC0xLjcwNzgxMTA1RS04NDg4ODkwMjMgMzY1MDQ3NjkuNCAtPiAzNjUwNDc2OS40IEluZXhhY3QgUm91bmRlZAoreGNvbTAzOSBjb21wYXJlIC0xLjcwNzgxMTA1RS04NDg4ODkwMjMgMzY1MDQ3NjkuNCAtPiAtMQoreGRpdjAzOSBkaXZpZGUgLTEuNzA3ODExMDVFLTg0ODg4OTAyMyAzNjUwNDc2OS40IC0+IC00LjY3ODMyMzA3RS04NDg4ODkwMzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDM5IGRpdmlkZWludCAtMS43MDc4MTEwNUUtODQ4ODg5MDIzIDM2NTA0NzY5LjQgLT4gLTAKK3htdWwwMzkgbXVsdGlwbHkgLTEuNzA3ODExMDVFLTg0ODg4OTAyMyAzNjUwNDc2OS40IC0+IC02LjIzNDMyNDg2RS04NDg4ODkwMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MDM5IHBvd2VyIC0xLjcwNzgxMTA1RS04NDg4ODkwMjMgMzY1MDQ3NjkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTAzOSByZW1haW5kZXIgLTEuNzA3ODExMDVFLTg0ODg4OTAyMyAzNjUwNDc2OS40IC0+IC0xLjcwNzgxMTA1RS04NDg4ODkwMjMKK3hzdWIwMzkgc3VidHJhY3QgLTEuNzA3ODExMDVFLTg0ODg4OTAyMyAzNjUwNDc2OS40IC0+IC0zNjUwNDc2OS40IEluZXhhY3QgUm91bmRlZAoreGFkZDA0MCBhZGQgLTUyOTAuNTQ5ODRFLTQ5MDYyNjY3NiA4NDI1MzUyNTQgLT4gODQyNTM1MjU0IEluZXhhY3QgUm91bmRlZAoreGNvbTA0MCBjb21wYXJlIC01MjkwLjU0OTg0RS00OTA2MjY2NzYgODQyNTM1MjU0IC0+IC0xCit4ZGl2MDQwIGRpdmlkZSAtNTI5MC41NDk4NEUtNDkwNjI2Njc2IDg0MjUzNTI1NCAtPiAtNi4yNzkzMjE2MkUtNDkwNjI2NjgyIEluZXhhY3QgUm91bmRlZAoreGR2aTA0MCBkaXZpZGVpbnQgLTUyOTAuNTQ5ODRFLTQ5MDYyNjY3NiA4NDI1MzUyNTQgLT4gLTAKK3htdWwwNDAgbXVsdGlwbHkgLTUyOTAuNTQ5ODRFLTQ5MDYyNjY3NiA4NDI1MzUyNTQgLT4gLTQuNDU3NDc0NzVFLTQ5MDYyNjY2NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNDAgcG93ZXIgLTUyOTAuNTQ5ODRFLTQ5MDYyNjY3NiA4NDI1MzUyNTQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDQwIHJlbWFpbmRlciAtNTI5MC41NDk4NEUtNDkwNjI2Njc2IDg0MjUzNTI1NCAtPiAtNS4yOTA1NDk4NEUtNDkwNjI2NjczCit4c3ViMDQwIHN1YnRyYWN0IC01MjkwLjU0OTg0RS00OTA2MjY2NzYgODQyNTM1MjU0IC0+IC04NDI1MzUyNTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDQxIGFkZCA2MDguMzE4MjVFKzUzNTI2ODEyMCAtNTk2MDkuMDk5MyAtPiA2LjA4MzE4MjUwRSs1MzUyNjgxMjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMDQxIGNvbXBhcmUgNjA4LjMxODI1RSs1MzUyNjgxMjAgLTU5NjA5LjA5OTMgLT4gMQoreGRpdjA0MSBkaXZpZGUgNjA4LjMxODI1RSs1MzUyNjgxMjAgLTU5NjA5LjA5OTMgLT4gLTEuMDIwNTEyNDBFKzUzNTI2ODExOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNDEgZGl2aWRlaW50IDYwOC4zMTgyNUUrNTM1MjY4MTIwIC01OTYwOS4wOTkzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDQxIG11bHRpcGx5IDYwOC4zMTgyNUUrNTM1MjY4MTIwIC01OTYwOS4wOTkzIC0+IC0zLjYyNjEzMDMwRSs1MzUyNjgxMjcgSW5leGFjdCBSb3VuZGVkCit4cG93MDQxIHBvd2VyIDYwOC4zMTgyNUUrNTM1MjY4MTIwIC01OTYwOSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNDEgcmVtYWluZGVyIDYwOC4zMTgyNUUrNTM1MjY4MTIwIC01OTYwOS4wOTkzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDQxIHN1YnRyYWN0IDYwOC4zMTgyNUUrNTM1MjY4MTIwIC01OTYwOS4wOTkzIC0+IDYuMDgzMTgyNTBFKzUzNTI2ODEyMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNDIgYWRkIC00NjI5MDM1LjMxIC0xNjcuODg0Mzk4IC0+IC00NjI5MjAzLjE5IEluZXhhY3QgUm91bmRlZAoreGNvbTA0MiBjb21wYXJlIC00NjI5MDM1LjMxIC0xNjcuODg0Mzk4IC0+IC0xCit4ZGl2MDQyIGRpdmlkZSAtNDYyOTAzNS4zMSAtMTY3Ljg4NDM5OCAtPiAyNzU3Mi43NTQ2IEluZXhhY3QgUm91bmRlZAoreGR2aTA0MiBkaXZpZGVpbnQgLTQ2MjkwMzUuMzEgLTE2Ny44ODQzOTggLT4gMjc1NzIKK3htdWwwNDIgbXVsdGlwbHkgLTQ2MjkwMzUuMzEgLTE2Ny44ODQzOTggLT4gNzc3MTQyODA2IEluZXhhY3QgUm91bmRlZAoreHBvdzA0MiBwb3dlciAtNDYyOTAzNS4zMSAtMTY4IC0+IDEuNTc2MTQ4MzFFLTExMjAgSW5leGFjdCBSb3VuZGVkCit4cmVtMDQyIHJlbWFpbmRlciAtNDYyOTAzNS4zMSAtMTY3Ljg4NDM5OCAtPiAtMTI2LjY4ODM0NAoreHN1YjA0MiBzdWJ0cmFjdCAtNDYyOTAzNS4zMSAtMTY3Ljg4NDM5OCAtPiAtNDYyODg2Ny40MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNDMgYWRkIC02NjUyNzM3OC4gLTcwNjQwMDI2OC4gLT4gLTc3MjkyNzY0NgoreGNvbTA0MyBjb21wYXJlIC02NjUyNzM3OC4gLTcwNjQwMDI2OC4gLT4gMQoreGRpdjA0MyBkaXZpZGUgLTY2NTI3Mzc4LiAtNzA2NDAwMjY4LiAtPiAwLjA5NDE3ODAxOTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDQzIGRpdmlkZWludCAtNjY1MjczNzguIC03MDY0MDAyNjguIC0+IDAKK3htdWwwNDMgbXVsdGlwbHkgLTY2NTI3Mzc4LiAtNzA2NDAwMjY4LiAtPiA0LjY5OTQ5NTc2RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNDMgcG93ZXIgLTY2NTI3Mzc4LiAtNzA2NDAwMjY4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA0MyByZW1haW5kZXIgLTY2NTI3Mzc4LiAtNzA2NDAwMjY4LiAtPiAtNjY1MjczNzgKK3hzdWIwNDMgc3VidHJhY3QgLTY2NTI3Mzc4LiAtNzA2NDAwMjY4LiAtPiA2Mzk4NzI4OTAKK3hhZGQwNDQgYWRkIC0yNTEwNDk3LjUzIDM3Mjg4MjQ2Mi4gLT4gMzcwMzcxOTY0IEluZXhhY3QgUm91bmRlZAoreGNvbTA0NCBjb21wYXJlIC0yNTEwNDk3LjUzIDM3Mjg4MjQ2Mi4gLT4gLTEKK3hkaXYwNDQgZGl2aWRlIC0yNTEwNDk3LjUzIDM3Mjg4MjQ2Mi4gLT4gLTAuMDA2NzMyNjc3OTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDQ0IGRpdmlkZWludCAtMjUxMDQ5Ny41MyAzNzI4ODI0NjIuIC0+IC0wCit4bXVsMDQ0IG11bHRpcGx5IC0yNTEwNDk3LjUzIDM3Mjg4MjQ2Mi4gLT4gLTkuMzYxMjA1MDBFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzA0NCBwb3dlciAtMjUxMDQ5Ny41MyAzNzI4ODI0NjIgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDQ0IHJlbWFpbmRlciAtMjUxMDQ5Ny41MyAzNzI4ODI0NjIuIC0+IC0yNTEwNDk3LjUzCit4c3ViMDQ0IHN1YnRyYWN0IC0yNTEwNDk3LjUzIDM3Mjg4MjQ2Mi4gLT4gLTM3NTM5Mjk2MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNDUgYWRkIDEzNi4yNTUzOTNFKzUzMzI5OTYxIC01MzQ5NC43MjAxRSs3MjAwNTgwNjAgLT4gLTUuMzQ5NDcyMDFFKzcyMDA1ODA2NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNDUgY29tcGFyZSAxMzYuMjU1MzkzRSs1MzMyOTk2MSAtNTM0OTQuNzIwMUUrNzIwMDU4MDYwIC0+IDEKK3hkaXYwNDUgZGl2aWRlIDEzNi4yNTUzOTNFKzUzMzI5OTYxIC01MzQ5NC43MjAxRSs3MjAwNTgwNjAgLT4gLTIuNTQ3MDgxMTVFLTY2NjcyODEwMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNDUgZGl2aWRlaW50IDEzNi4yNTUzOTNFKzUzMzI5OTYxIC01MzQ5NC43MjAxRSs3MjAwNTgwNjAgLT4gLTAKK3htdWwwNDUgbXVsdGlwbHkgMTM2LjI1NTM5M0UrNTMzMjk5NjEgLTUzNDk0LjcyMDFFKzcyMDA1ODA2MCAtPiAtNy4yODg5NDQxMUUrNzczMzg4MDI3IEluZXhhY3QgUm91bmRlZAoreHBvdzA0NSBwb3dlciAxMzYuMjU1MzkzRSs1MzMyOTk2MSAtNSAtPiAyLjEyOTI3MzczRS0yNjY2NDk4MTYgSW5leGFjdCBSb3VuZGVkCit4cmVtMDQ1IHJlbWFpbmRlciAxMzYuMjU1MzkzRSs1MzMyOTk2MSAtNTM0OTQuNzIwMUUrNzIwMDU4MDYwIC0+IDEuMzYyNTUzOTNFKzUzMzI5OTYzCit4c3ViMDQ1IHN1YnRyYWN0IDEzNi4yNTUzOTNFKzUzMzI5OTYxIC01MzQ5NC43MjAxRSs3MjAwNTgwNjAgLT4gNS4zNDk0NzIwMUUrNzIwMDU4MDY0IEluZXhhY3QgUm91bmRlZAoreGFkZDA0NiBhZGQgLTg3NjY3My4xMDAgLTYxNTAuOTIyNjYgLT4gLTg4MjgyNC4wMjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMDQ2IGNvbXBhcmUgLTg3NjY3My4xMDAgLTYxNTAuOTIyNjYgLT4gLTEKK3hkaXYwNDYgZGl2aWRlIC04NzY2NzMuMTAwIC02MTUwLjkyMjY2IC0+IDE0Mi41MjcwODkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDQ2IGRpdmlkZWludCAtODc2NjczLjEwMCAtNjE1MC45MjI2NiAtPiAxNDIKK3htdWwwNDYgbXVsdGlwbHkgLTg3NjY3My4xMDAgLTYxNTAuOTIyNjYgLT4gNS4zOTIzNDg0NEUrOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNDYgcG93ZXIgLTg3NjY3My4xMDAgLTYxNTEgLT4gLTQuMDMxMTE3NzRFLTM2NTU1IEluZXhhY3QgUm91bmRlZAoreHJlbTA0NiByZW1haW5kZXIgLTg3NjY3My4xMDAgLTYxNTAuOTIyNjYgLT4gLTMyNDIuMDgyMjgKK3hzdWIwNDYgc3VidHJhY3QgLTg3NjY3My4xMDAgLTYxNTAuOTIyNjYgLT4gLTg3MDUyMi4xNzcgSW5leGFjdCBSb3VuZGVkCit4YWRkMDQ3IGFkZCAtMi40NTE1MTc5N0UrOTExMzA2MTE3IDI3MjM1NzcxIC0+IC0yLjQ1MTUxNzk3RSs5MTEzMDYxMTcgSW5leGFjdCBSb3VuZGVkCit4Y29tMDQ3IGNvbXBhcmUgLTIuNDUxNTE3OTdFKzkxMTMwNjExNyAyNzIzNTc3MSAtPiAtMQoreGRpdjA0NyBkaXZpZGUgLTIuNDUxNTE3OTdFKzkxMTMwNjExNyAyNzIzNTc3MSAtPiAtOS4wMDEwOTYyOEUrOTExMzA2MTA5IEluZXhhY3QgUm91bmRlZAoreGR2aTA0NyBkaXZpZGVpbnQgLTIuNDUxNTE3OTdFKzkxMTMwNjExNyAyNzIzNTc3MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA0NyBtdWx0aXBseSAtMi40NTE1MTc5N0UrOTExMzA2MTE3IDI3MjM1NzcxIC0+IC02LjY3Njg5ODIwRSs5MTEzMDYxMjQgSW5leGFjdCBSb3VuZGVkCit4cG93MDQ3IHBvd2VyIC0yLjQ1MTUxNzk3RSs5MTEzMDYxMTcgMjcyMzU3NzEgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTA0NyByZW1haW5kZXIgLTIuNDUxNTE3OTdFKzkxMTMwNjExNyAyNzIzNTc3MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA0NyBzdWJ0cmFjdCAtMi40NTE1MTc5N0UrOTExMzA2MTE3IDI3MjM1NzcxIC0+IC0yLjQ1MTUxNzk3RSs5MTEzMDYxMTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMDQ4IGFkZCAtOS4xNTExNzU1MSAtNC45NTEwMDczM0UtMzE0NTExMzI2IC0+IC05LjE1MTE3NTUxIEluZXhhY3QgUm91bmRlZAoreGNvbTA0OCBjb21wYXJlIC05LjE1MTE3NTUxIC00Ljk1MTAwNzMzRS0zMTQ1MTEzMjYgLT4gLTEKK3hkaXYwNDggZGl2aWRlIC05LjE1MTE3NTUxIC00Ljk1MTAwNzMzRS0zMTQ1MTEzMjYgLT4gMS44NDgzNDYxOEUrMzE0NTExMzI2IEluZXhhY3QgUm91bmRlZAoreGR2aTA0OCBkaXZpZGVpbnQgLTkuMTUxMTc1NTEgLTQuOTUxMDA3MzNFLTMxNDUxMTMyNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA0OCBtdWx0aXBseSAtOS4xNTExNzU1MSAtNC45NTEwMDczM0UtMzE0NTExMzI2IC0+IDQuNTMwNzUzNzBFLTMxNDUxMTMyNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNDggcG93ZXIgLTkuMTUxMTc1NTEgLTUgLT4gLTAuMDAwMDE1NTgxNzI2NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNDggcmVtYWluZGVyIC05LjE1MTE3NTUxIC00Ljk1MTAwNzMzRS0zMTQ1MTEzMjYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNDggc3VidHJhY3QgLTkuMTUxMTc1NTEgLTQuOTUxMDA3MzNFLTMxNDUxMTMyNiAtPiAtOS4xNTExNzU1MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNDkgYWRkIDMuNjE4OTA0NTNFLTk4NTYwNjEyOCAzMDY2NDQxNi4gLT4gMzA2NjQ0MTYuMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNDkgY29tcGFyZSAzLjYxODkwNDUzRS05ODU2MDYxMjggMzA2NjQ0MTYuIC0+IC0xCit4ZGl2MDQ5IGRpdmlkZSAzLjYxODkwNDUzRS05ODU2MDYxMjggMzA2NjQ0MTYuIC0+IDEuMTgwMTY0MThFLTk4NTYwNjEzNSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNDkgZGl2aWRlaW50IDMuNjE4OTA0NTNFLTk4NTYwNjEyOCAzMDY2NDQxNi4gLT4gMAoreG11bDA0OSBtdWx0aXBseSAzLjYxODkwNDUzRS05ODU2MDYxMjggMzA2NjQ0MTYuIC0+IDEuMTA5NzE1OTRFLTk4NTYwNjEyMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNDkgcG93ZXIgMy42MTg5MDQ1M0UtOTg1NjA2MTI4IDMwNjY0NDE2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA0OSByZW1haW5kZXIgMy42MTg5MDQ1M0UtOTg1NjA2MTI4IDMwNjY0NDE2LiAtPiAzLjYxODkwNDUzRS05ODU2MDYxMjgKK3hzdWIwNDkgc3VidHJhY3QgMy42MTg5MDQ1M0UtOTg1NjA2MTI4IDMwNjY0NDE2LiAtPiAtMzA2NjQ0MTYuMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTAgYWRkIC0yNTc2NzQ2MDJFKzIxNjcyMzM4MiAtNzA4MjA5NTkuNCAtPiAtMi41NzY3NDYwMkUrMjE2NzIzMzkwIEluZXhhY3QgUm91bmRlZAoreGNvbTA1MCBjb21wYXJlIC0yNTc2NzQ2MDJFKzIxNjcyMzM4MiAtNzA4MjA5NTkuNCAtPiAtMQoreGRpdjA1MCBkaXZpZGUgLTI1NzY3NDYwMkUrMjE2NzIzMzgyIC03MDgyMDk1OS40IC0+IDMuNjM4Mzk0NjhFKzIxNjcyMzM4MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNTAgZGl2aWRlaW50IC0yNTc2NzQ2MDJFKzIxNjcyMzM4MiAtNzA4MjA5NTkuNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA1MCBtdWx0aXBseSAtMjU3Njc0NjAyRSsyMTY3MjMzODIgLTcwODIwOTU5LjQgLT4gMS44MjQ4NzYyNUUrMjE2NzIzMzk4IEluZXhhY3QgUm91bmRlZAoreHBvdzA1MCBwb3dlciAtMjU3Njc0NjAyRSsyMTY3MjMzODIgLTcwODIwOTU5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNTAgcmVtYWluZGVyIC0yNTc2NzQ2MDJFKzIxNjcyMzM4MiAtNzA4MjA5NTkuNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA1MCBzdWJ0cmFjdCAtMjU3Njc0NjAyRSsyMTY3MjMzODIgLTcwODIwOTU5LjQgLT4gLTIuNTc2NzQ2MDJFKzIxNjcyMzM5MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTEgYWRkIDIxODY5OS4yMDYgNTU2OTQ0MjQxLiAtPiA1NTcxNjI5NDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDUxIGNvbXBhcmUgMjE4Njk5LjIwNiA1NTY5NDQyNDEuIC0+IC0xCit4ZGl2MDUxIGRpdmlkZSAyMTg2OTkuMjA2IDU1Njk0NDI0MS4gLT4gMC4wMDAzOTI2NzcwMjIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDUxIGRpdmlkZWludCAyMTg2OTkuMjA2IDU1Njk0NDI0MS4gLT4gMAoreG11bDA1MSBtdWx0aXBseSAyMTg2OTkuMjA2IDU1Njk0NDI0MS4gLT4gMS4yMTgwMzI2M0UrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MDUxIHBvd2VyIDIxODY5OS4yMDYgNTU2OTQ0MjQxIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTA1MSByZW1haW5kZXIgMjE4Njk5LjIwNiA1NTY5NDQyNDEuIC0+IDIxODY5OS4yMDYKK3hzdWIwNTEgc3VidHJhY3QgMjE4Njk5LjIwNiA1NTY5NDQyNDEuIC0+IC01NTY3MjU1NDIgSW5leGFjdCBSb3VuZGVkCit4YWRkMDUyIGFkZCAxMDYyMTE3MTYuIC0zNDU2NzkzLjc0IC0+IDEwMjc1NDkyMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTIgY29tcGFyZSAxMDYyMTE3MTYuIC0zNDU2NzkzLjc0IC0+IDEKK3hkaXYwNTIgZGl2aWRlIDEwNjIxMTcxNi4gLTM0NTY3OTMuNzQgLT4gLTMwLjcyNTUwMDAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDUyIGRpdmlkZWludCAxMDYyMTE3MTYuIC0zNDU2NzkzLjc0IC0+IC0zMAoreG11bDA1MiBtdWx0aXBseSAxMDYyMTE3MTYuIC0zNDU2NzkzLjc0IC0+IC0zLjY3MTUxOTk1RSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNTIgcG93ZXIgMTA2MjExNzE2LiAtMzQ1Njc5NCAtPiAyLjA3MjI1NTgxRS0yNzc0NDgyNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNTIgcmVtYWluZGVyIDEwNjIxMTcxNi4gLTM0NTY3OTMuNzQgLT4gMjUwNzkwMy44MAoreHN1YjA1MiBzdWJ0cmFjdCAxMDYyMTE3MTYuIC0zNDU2NzkzLjc0IC0+IDEwOTY2ODUxMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTMgYWRkIDEuMjUwMTgwNzggMzk5ODU2Ljc2M0UtNzI2ODE2NzQwIC0+IDEuMjUwMTgwNzggSW5leGFjdCBSb3VuZGVkCit4Y29tMDUzIGNvbXBhcmUgMS4yNTAxODA3OCAzOTk4NTYuNzYzRS03MjY4MTY3NDAgLT4gMQoreGRpdjA1MyBkaXZpZGUgMS4yNTAxODA3OCAzOTk4NTYuNzYzRS03MjY4MTY3NDAgLT4gMy4xMjY1NzE1NUUrNzI2ODE2NzM0IEluZXhhY3QgUm91bmRlZAoreGR2aTA1MyBkaXZpZGVpbnQgMS4yNTAxODA3OCAzOTk4NTYuNzYzRS03MjY4MTY3NDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwNTMgbXVsdGlwbHkgMS4yNTAxODA3OCAzOTk4NTYuNzYzRS03MjY4MTY3NDAgLT4gNC45OTg5MzI0MEUtNzI2ODE2NzM1IEluZXhhY3QgUm91bmRlZAoreHBvdzA1MyBwb3dlciAxLjI1MDE4MDc4IDQgLT4gMi40NDI4MTg5MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNTMgcmVtYWluZGVyIDEuMjUwMTgwNzggMzk5ODU2Ljc2M0UtNzI2ODE2NzQwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDUzIHN1YnRyYWN0IDEuMjUwMTgwNzggMzk5ODU2Ljc2M0UtNzI2ODE2NzQwIC0+IDEuMjUwMTgwNzggSW5leGFjdCBSb3VuZGVkCit4YWRkMDU0IGFkZCAzNjQuOTk4MTEgLTQ2MjIyLjA1MDUgLT4gLTQ1ODU3LjA1MjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDU0IGNvbXBhcmUgMzY0Ljk5ODExIC00NjIyMi4wNTA1IC0+IDEKK3hkaXYwNTQgZGl2aWRlIDM2NC45OTgxMSAtNDYyMjIuMDUwNSAtPiAtMC4wMDc4OTY2MjMwNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNTQgZGl2aWRlaW50IDM2NC45OTgxMSAtNDYyMjIuMDUwNSAtPiAtMAoreG11bDA1NCBtdWx0aXBseSAzNjQuOTk4MTEgLTQ2MjIyLjA1MDUgLT4gLTE2ODcwOTYxLjEgSW5leGFjdCBSb3VuZGVkCit4cG93MDU0IHBvd2VyIDM2NC45OTgxMSAtNDYyMjIgLT4gNi4zNTU3MDg1NkUtMTE4NDM1IEluZXhhY3QgUm91bmRlZAoreHJlbTA1NCByZW1haW5kZXIgMzY0Ljk5ODExIC00NjIyMi4wNTA1IC0+IDM2NC45OTgxMQoreHN1YjA1NCBzdWJ0cmFjdCAzNjQuOTk4MTEgLTQ2MjIyLjA1MDUgLT4gNDY1ODcuMDQ4NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTUgYWRkIC0zOTIyMTc1NzYuIC05NTgzNjQwOTYgLT4gLTEuMzUwNTgxNjdFKzkgSW5leGFjdCBSb3VuZGVkCit4Y29tMDU1IGNvbXBhcmUgLTM5MjIxNzU3Ni4gLTk1ODM2NDA5NiAtPiAxCit4ZGl2MDU1IGRpdmlkZSAtMzkyMjE3NTc2LiAtOTU4MzY0MDk2IC0+IDAuNDA5MjU3Mzc3IEluZXhhY3QgUm91bmRlZAoreGR2aTA1NSBkaXZpZGVpbnQgLTM5MjIxNzU3Ni4gLTk1ODM2NDA5NiAtPiAwCit4bXVsMDU1IG11bHRpcGx5IC0zOTIyMTc1NzYuIC05NTgzNjQwOTYgLT4gMy43NTg4NzI0M0UrMTcgSW5leGFjdCBSb3VuZGVkCit4cG93MDU1IHBvd2VyIC0zOTIyMTc1NzYuIC05NTgzNjQwOTYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDU1IHJlbWFpbmRlciAtMzkyMjE3NTc2LiAtOTU4MzY0MDk2IC0+IC0zOTIyMTc1NzYKK3hzdWIwNTUgc3VidHJhY3QgLTM5MjIxNzU3Ni4gLTk1ODM2NDA5NiAtPiA1NjYxNDY1MjAKK3hhZGQwNTYgYWRkIDE2OTYwMTI4NSA3MTQ1MjYuNjM5IC0+IDE3MDMxNTgxMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTYgY29tcGFyZSAxNjk2MDEyODUgNzE0NTI2LjYzOSAtPiAxCit4ZGl2MDU2IGRpdmlkZSAxNjk2MDEyODUgNzE0NTI2LjYzOSAtPiAyMzcuMzYxNzM4IEluZXhhY3QgUm91bmRlZAoreGR2aTA1NiBkaXZpZGVpbnQgMTY5NjAxMjg1IDcxNDUyNi42MzkgLT4gMjM3Cit4bXVsMDU2IG11bHRpcGx5IDE2OTYwMTI4NSA3MTQ1MjYuNjM5IC0+IDEuMjExODQ2MzZFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzA1NiBwb3dlciAxNjk2MDEyODUgNzE0NTI3IC0+IDIuMDYwNTI0NDRFKzU4ODAxNDkgSW5leGFjdCBSb3VuZGVkCit4cmVtMDU2IHJlbWFpbmRlciAxNjk2MDEyODUgNzE0NTI2LjYzOSAtPiAyNTg0NzEuNTU3Cit4c3ViMDU2IHN1YnRyYWN0IDE2OTYwMTI4NSA3MTQ1MjYuNjM5IC0+IDE2ODg4Njc1OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTcgYWRkIC02NzQuMDk0NTUyRSs1ODY5NDQzMTkgNjM1NC4yNjY4RSs1ODk2NTcyNjYgLT4gNi4zNTQyNjY4MEUrNTg5NjU3MjY5IEluZXhhY3QgUm91bmRlZAoreGNvbTA1NyBjb21wYXJlIC02NzQuMDk0NTUyRSs1ODY5NDQzMTkgNjM1NC4yNjY4RSs1ODk2NTcyNjYgLT4gLTEKK3hkaXYwNTcgZGl2aWRlIC02NzQuMDk0NTUyRSs1ODY5NDQzMTkgNjM1NC4yNjY4RSs1ODk2NTcyNjYgLT4gLTEuMDYwODUzNDBFLTI3MTI5NDggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDU3IGRpdmlkZWludCAtNjc0LjA5NDU1MkUrNTg2OTQ0MzE5IDYzNTQuMjY2OEUrNTg5NjU3MjY2IC0+IC0wCit4bXVsMDU3IG11bHRpcGx5IC02NzQuMDk0NTUyRSs1ODY5NDQzMTkgNjM1NC4yNjY4RSs1ODk2NTcyNjYgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzA1NyBwb3dlciAtNjc0LjA5NDU1MkUrNTg2OTQ0MzE5IDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDU3IHJlbWFpbmRlciAtNjc0LjA5NDU1MkUrNTg2OTQ0MzE5IDYzNTQuMjY2OEUrNTg5NjU3MjY2IC0+IC02Ljc0MDk0NTUyRSs1ODY5NDQzMjEKK3hzdWIwNTcgc3VidHJhY3QgLTY3NC4wOTQ1NTJFKzU4Njk0NDMxOSA2MzU0LjI2NjhFKzU4OTY1NzI2NiAtPiAtNi4zNTQyNjY4MEUrNTg5NjU3MjY5IEluZXhhY3QgUm91bmRlZAoreGFkZDA1OCBhZGQgMTUxNzk1MTYzRS0zNzE3MjcxODIgLTQ4OC4wOTc4OEUtNzM4ODUyMjQ1IC0+IDEuNTE3OTUxNjNFLTM3MTcyNzE3NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTggY29tcGFyZSAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNDg4LjA5Nzg4RS03Mzg4NTIyNDUgLT4gMQoreGRpdjA1OCBkaXZpZGUgMTUxNzk1MTYzRS0zNzE3MjcxODIgLTQ4OC4wOTc4OEUtNzM4ODUyMjQ1IC0+IC0zLjEwOTkzMjg1RSszNjcxMjUwNjggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDU4IGRpdmlkZWludCAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNDg4LjA5Nzg4RS03Mzg4NTIyNDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwNTggbXVsdGlwbHkgMTUxNzk1MTYzRS0zNzE3MjcxODIgLTQ4OC4wOTc4OEUtNzM4ODUyMjQ1IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3cwNTggcG93ZXIgMTUxNzk1MTYzRS0zNzE3MjcxODIgLTUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDU4IHJlbWFpbmRlciAxNTE3OTUxNjNFLTM3MTcyNzE4MiAtNDg4LjA5Nzg4RS03Mzg4NTIyNDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwNTggc3VidHJhY3QgMTUxNzk1MTYzRS0zNzE3MjcxODIgLTQ4OC4wOTc4OEUtNzM4ODUyMjQ1IC0+IDEuNTE3OTUxNjNFLTM3MTcyNzE3NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNTkgYWRkIC03NDYuMjkzMzg2IDkyNzc0OS42NDcgLT4gOTI3MDAzLjM1NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNTkgY29tcGFyZSAtNzQ2LjI5MzM4NiA5Mjc3NDkuNjQ3IC0+IC0xCit4ZGl2MDU5IGRpdmlkZSAtNzQ2LjI5MzM4NiA5Mjc3NDkuNjQ3IC0+IC0wLjAwMDgwNDQxMjQ3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNTkgZGl2aWRlaW50IC03NDYuMjkzMzg2IDkyNzc0OS42NDcgLT4gLTAKK3htdWwwNTkgbXVsdGlwbHkgLTc0Ni4yOTMzODYgOTI3NzQ5LjY0NyAtPiAtNjkyMzczNDI1IEluZXhhY3QgUm91bmRlZAoreHBvdzA1OSBwb3dlciAtNzQ2LjI5MzM4NiA5Mjc3NTAgLT4gNy40OTI3ODc0MUUrMjY2NTM0MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNTkgcmVtYWluZGVyIC03NDYuMjkzMzg2IDkyNzc0OS42NDcgLT4gLTc0Ni4yOTMzODYKK3hzdWIwNTkgc3VidHJhY3QgLTc0Ni4yOTMzODYgOTI3NzQ5LjY0NyAtPiAtOTI4NDk1Ljk0MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjAgYWRkIDg4ODk0NjQ3MUUrMjQxMzMxNTkyIC0yMzU3MzkuNTk1IC0+IDguODg5NDY0NzFFKzI0MTMzMTYwMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNjAgY29tcGFyZSA4ODg5NDY0NzFFKzI0MTMzMTU5MiAtMjM1NzM5LjU5NSAtPiAxCit4ZGl2MDYwIGRpdmlkZSA4ODg5NDY0NzFFKzI0MTMzMTU5MiAtMjM1NzM5LjU5NSAtPiAtMy43NzA4ODMxN0UrMjQxMzMxNTk1IEluZXhhY3QgUm91bmRlZAoreGR2aTA2MCBkaXZpZGVpbnQgODg4OTQ2NDcxRSsyNDEzMzE1OTIgLTIzNTczOS41OTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwNjAgbXVsdGlwbHkgODg4OTQ2NDcxRSsyNDEzMzE1OTIgLTIzNTczOS41OTUgLT4gLTIuMDk1NTk4ODFFKzI0MTMzMTYwNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNjAgcG93ZXIgODg4OTQ2NDcxRSsyNDEzMzE1OTIgLTIzNTc0MCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNjAgcmVtYWluZGVyIDg4ODk0NjQ3MUUrMjQxMzMxNTkyIC0yMzU3MzkuNTk1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDYwIHN1YnRyYWN0IDg4ODk0NjQ3MUUrMjQxMzMxNTkyIC0yMzU3MzkuNTk1IC0+IDguODg5NDY0NzFFKzI0MTMzMTYwMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjEgYWRkIDYuNjQzNzcyNDkgNzkxNjEuMTA3MEUrNjE5NDUzNzc2IC0+IDcuOTE2MTEwNzBFKzYxOTQ1Mzc4MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNjEgY29tcGFyZSA2LjY0Mzc3MjQ5IDc5MTYxLjEwNzBFKzYxOTQ1Mzc3NiAtPiAtMQoreGRpdjA2MSBkaXZpZGUgNi42NDM3NzI0OSA3OTE2MS4xMDcwRSs2MTk0NTM3NzYgLT4gOC4zOTI3MjMwN0UtNjE5NDUzNzgxIEluZXhhY3QgUm91bmRlZAoreGR2aTA2MSBkaXZpZGVpbnQgNi42NDM3NzI0OSA3OTE2MS4xMDcwRSs2MTk0NTM3NzYgLT4gMAoreG11bDA2MSBtdWx0aXBseSA2LjY0Mzc3MjQ5IDc5MTYxLjEwNzBFKzYxOTQ1Mzc3NiAtPiA1LjI1OTI4Mzg1RSs2MTk0NTM3ODEgSW5leGFjdCBSb3VuZGVkCit4cG93MDYxIHBvd2VyIDYuNjQzNzcyNDkgOCAtPiAzNzk1OTI4LjQ0IEluZXhhY3QgUm91bmRlZAoreHJlbTA2MSByZW1haW5kZXIgNi42NDM3NzI0OSA3OTE2MS4xMDcwRSs2MTk0NTM3NzYgLT4gNi42NDM3NzI0OQoreHN1YjA2MSBzdWJ0cmFjdCA2LjY0Mzc3MjQ5IDc5MTYxLjEwNzBFKzYxOTQ1Mzc3NiAtPiAtNy45MTYxMTA3MEUrNjE5NDUzNzgwIEluZXhhY3QgUm91bmRlZAoreGFkZDA2MiBhZGQgMzE0Ni42NjU3MUUtMzEzMzczMzY2IDg4LjUyODIwMTAgLT4gODguNTI4MjAxMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNjIgY29tcGFyZSAzMTQ2LjY2NTcxRS0zMTMzNzMzNjYgODguNTI4MjAxMCAtPiAtMQoreGRpdjA2MiBkaXZpZGUgMzE0Ni42NjU3MUUtMzEzMzczMzY2IDg4LjUyODIwMTAgLT4gMy41NTQ0MjE4NEUtMzEzMzczMzY1IEluZXhhY3QgUm91bmRlZAoreGR2aTA2MiBkaXZpZGVpbnQgMzE0Ni42NjU3MUUtMzEzMzczMzY2IDg4LjUyODIwMTAgLT4gMAoreG11bDA2MiBtdWx0aXBseSAzMTQ2LjY2NTcxRS0zMTMzNzMzNjYgODguNTI4MjAxMCAtPiAyLjc4NTY4NjU0RS0zMTMzNzMzNjEgSW5leGFjdCBSb3VuZGVkCit4cG93MDYyIHBvd2VyIDMxNDYuNjY1NzFFLTMxMzM3MzM2NiA4OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNjIgcmVtYWluZGVyIDMxNDYuNjY1NzFFLTMxMzM3MzM2NiA4OC41MjgyMDEwIC0+IDMuMTQ2NjY1NzFFLTMxMzM3MzM2MworeHN1YjA2MiBzdWJ0cmFjdCAzMTQ2LjY2NTcxRS0zMTMzNzMzNjYgODguNTI4MjAxMCAtPiAtODguNTI4MjAxMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjMgYWRkIDYuNDQ2OTMwOTcgLTg3MTk1Ljg3MTEgLT4gLTg3MTg5LjQyNDIgSW5leGFjdCBSb3VuZGVkCit4Y29tMDYzIGNvbXBhcmUgNi40NDY5MzA5NyAtODcxOTUuODcxMSAtPiAxCit4ZGl2MDYzIGRpdmlkZSA2LjQ0NjkzMDk3IC04NzE5NS44NzExIC0+IC0wLjAwMDA3MzkzNjE5NTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDYzIGRpdmlkZWludCA2LjQ0NjkzMDk3IC04NzE5NS44NzExIC0+IC0wCit4bXVsMDYzIG11bHRpcGx5IDYuNDQ2OTMwOTcgLTg3MTk1Ljg3MTEgLT4gLTU2MjE0NS43NjIgSW5leGFjdCBSb3VuZGVkCit4cG93MDYzIHBvd2VyIDYuNDQ2OTMwOTcgLTg3MTk2IC0+IDQuNTA4ODE3MzBFLTcwNTczIEluZXhhY3QgUm91bmRlZAoreHJlbTA2MyByZW1haW5kZXIgNi40NDY5MzA5NyAtODcxOTUuODcxMSAtPiA2LjQ0NjkzMDk3Cit4c3ViMDYzIHN1YnRyYWN0IDYuNDQ2OTMwOTcgLTg3MTk1Ljg3MTEgLT4gODcyMDIuMzE4MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjQgYWRkIC0yMTEzMTMyLjU2RSs1Nzc5NTc4NDAgOTgxMTI1ODIxIC0+IC0yLjExMzEzMjU2RSs1Nzc5NTc4NDYgSW5leGFjdCBSb3VuZGVkCit4Y29tMDY0IGNvbXBhcmUgLTIxMTMxMzIuNTZFKzU3Nzk1Nzg0MCA5ODExMjU4MjEgLT4gLTEKK3hkaXYwNjQgZGl2aWRlIC0yMTEzMTMyLjU2RSs1Nzc5NTc4NDAgOTgxMTI1ODIxIC0+IC0yLjE1Mzc4MzQ1RSs1Nzc5NTc4MzcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDY0IGRpdmlkZWludCAtMjExMzEzMi41NkUrNTc3OTU3ODQwIDk4MTEyNTgyMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA2NCBtdWx0aXBseSAtMjExMzEzMi41NkUrNTc3OTU3ODQwIDk4MTEyNTgyMSAtPiAtMi4wNzMyNDg5MkUrNTc3OTU3ODU1IEluZXhhY3QgUm91bmRlZAoreHBvdzA2NCBwb3dlciAtMjExMzEzMi41NkUrNTc3OTU3ODQwIDk4MTEyNTgyMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDY0IHJlbWFpbmRlciAtMjExMzEzMi41NkUrNTc3OTU3ODQwIDk4MTEyNTgyMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA2NCBzdWJ0cmFjdCAtMjExMzEzMi41NkUrNTc3OTU3ODQwIDk4MTEyNTgyMSAtPiAtMi4xMTMxMzI1NkUrNTc3OTU3ODQ2IEluZXhhY3QgUm91bmRlZAoreGFkZDA2NSBhZGQgLTc3MDEuNDI4MTQgNzI2NjcuNTE4MSAtPiA2NDk2Ni4wOTAwIEluZXhhY3QgUm91bmRlZAoreGNvbTA2NSBjb21wYXJlIC03NzAxLjQyODE0IDcyNjY3LjUxODEgLT4gLTEKK3hkaXYwNjUgZGl2aWRlIC03NzAxLjQyODE0IDcyNjY3LjUxODEgLT4gLTAuMTA1OTgxNzE0IEluZXhhY3QgUm91bmRlZAoreGR2aTA2NSBkaXZpZGVpbnQgLTc3MDEuNDI4MTQgNzI2NjcuNTE4MSAtPiAtMAoreG11bDA2NSBtdWx0aXBseSAtNzcwMS40MjgxNCA3MjY2Ny41MTgxIC0+IC01NTk2NDM2NjkgSW5leGFjdCBSb3VuZGVkCit4cG93MDY1IHBvd2VyIC03NzAxLjQyODE0IDcyNjY4IC0+IDIuMjk1NDM4MzdFKzI4MjQyOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNjUgcmVtYWluZGVyIC03NzAxLjQyODE0IDcyNjY3LjUxODEgLT4gLTc3MDEuNDI4MTQKK3hzdWIwNjUgc3VidHJhY3QgLTc3MDEuNDI4MTQgNzI2NjcuNTE4MSAtPiAtODAzNjguOTQ2MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjYgYWRkIC04NTEuNzU0Nzg5IC01ODI2NTkuMTQ5IC0+IC01ODM1MTAuOTA0IEluZXhhY3QgUm91bmRlZAoreGNvbTA2NiBjb21wYXJlIC04NTEuNzU0Nzg5IC01ODI2NTkuMTQ5IC0+IDEKK3hkaXYwNjYgZGl2aWRlIC04NTEuNzU0Nzg5IC01ODI2NTkuMTQ5IC0+IDAuMDAxNDYxODQwNTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDY2IGRpdmlkZWludCAtODUxLjc1NDc4OSAtNTgyNjU5LjE0OSAtPiAwCit4bXVsMDY2IG11bHRpcGx5IC04NTEuNzU0Nzg5IC01ODI2NTkuMTQ5IC0+IDQ5NjI4MjcyMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNjYgcG93ZXIgLTg1MS43NTQ3ODkgLTU4MjY1OSAtPiAtNi44MzUzMjU5M0UtMTcwNzM3NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNjYgcmVtYWluZGVyIC04NTEuNzU0Nzg5IC01ODI2NTkuMTQ5IC0+IC04NTEuNzU0Nzg5Cit4c3ViMDY2IHN1YnRyYWN0IC04NTEuNzU0Nzg5IC01ODI2NTkuMTQ5IC0+IDU4MTgwNy4zOTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMDY3IGFkZCAtNS4wMTk5Mjk0MyA3ODUyLjE2NTMxIC0+IDc4NDcuMTQ1MzggSW5leGFjdCBSb3VuZGVkCit4Y29tMDY3IGNvbXBhcmUgLTUuMDE5OTI5NDMgNzg1Mi4xNjUzMSAtPiAtMQoreGRpdjA2NyBkaXZpZGUgLTUuMDE5OTI5NDMgNzg1Mi4xNjUzMSAtPiAtMC4wMDA2MzkzMDUxMTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDY3IGRpdmlkZWludCAtNS4wMTk5Mjk0MyA3ODUyLjE2NTMxIC0+IC0wCit4bXVsMDY3IG11bHRpcGx5IC01LjAxOTkyOTQzIDc4NTIuMTY1MzEgLT4gLTM5NDE3LjMxNTcgSW5leGFjdCBSb3VuZGVkCit4cG93MDY3IHBvd2VyIC01LjAxOTkyOTQzIDc4NTIgLT4gNy41NDQ4MTQ0OEUrNTUwMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNjcgcmVtYWluZGVyIC01LjAxOTkyOTQzIDc4NTIuMTY1MzEgLT4gLTUuMDE5OTI5NDMKK3hzdWIwNjcgc3VidHJhY3QgLTUuMDE5OTI5NDMgNzg1Mi4xNjUzMSAtPiAtNzg1Ny4xODUyNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNjggYWRkIC0xMjM5MzI1Ny4yIDc2ODAzNjg5RSs5NDkxMjU3NzAgLT4gNy42ODAzNjg5MEUrOTQ5MTI1Nzc3IEluZXhhY3QgUm91bmRlZAoreGNvbTA2OCBjb21wYXJlIC0xMjM5MzI1Ny4yIDc2ODAzNjg5RSs5NDkxMjU3NzAgLT4gLTEKK3hkaXYwNjggZGl2aWRlIC0xMjM5MzI1Ny4yIDc2ODAzNjg5RSs5NDkxMjU3NzAgLT4gLTEuNjEzNjI3ODZFLTk0OTEyNTc3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNjggZGl2aWRlaW50IC0xMjM5MzI1Ny4yIDc2ODAzNjg5RSs5NDkxMjU3NzAgLT4gLTAKK3htdWwwNjggbXVsdGlwbHkgLTEyMzkzMjU3LjIgNzY4MDM2ODlFKzk0OTEyNTc3MCAtPiAtOS41MTg0Nzg3MkUrOTQ5MTI1Nzg0IEluZXhhY3QgUm91bmRlZAoreHBvdzA2OCBwb3dlciAtMTIzOTMyNTcuMiA4IC0+IDUuNTY1MjM3NDlFKzU2IEluZXhhY3QgUm91bmRlZAoreHJlbTA2OCByZW1haW5kZXIgLTEyMzkzMjU3LjIgNzY4MDM2ODlFKzk0OTEyNTc3MCAtPiAtMTIzOTMyNTcuMgoreHN1YjA2OCBzdWJ0cmFjdCAtMTIzOTMyNTcuMiA3NjgwMzY4OUUrOTQ5MTI1NzcwIC0+IC03LjY4MDM2ODkwRSs5NDkxMjU3NzcgSW5leGFjdCBSb3VuZGVkCit4YWRkMDY5IGFkZCAtNzU0NzcxNjM0LkUrNzE2NTU1MDI2IC0yOTIzMzYuMzExIC0+IC03LjU0NzcxNjM0RSs3MTY1NTUwMzQgSW5leGFjdCBSb3VuZGVkCit4Y29tMDY5IGNvbXBhcmUgLTc1NDc3MTYzNC5FKzcxNjU1NTAyNiAtMjkyMzM2LjMxMSAtPiAtMQoreGRpdjA2OSBkaXZpZGUgLTc1NDc3MTYzNC5FKzcxNjU1NTAyNiAtMjkyMzM2LjMxMSAtPiAyLjU4MTg2MDcwRSs3MTY1NTUwMjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDY5IGRpdmlkZWludCAtNzU0NzcxNjM0LkUrNzE2NTU1MDI2IC0yOTIzMzYuMzExIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDY5IG11bHRpcGx5IC03NTQ3NzE2MzQuRSs3MTY1NTUwMjYgLTI5MjMzNi4zMTEgLT4gMi4yMDY0NzE1NUUrNzE2NTU1MDQwIEluZXhhY3QgUm91bmRlZAoreHBvdzA2OSBwb3dlciAtNzU0NzcxNjM0LkUrNzE2NTU1MDI2IC0yOTIzMzYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDY5IHJlbWFpbmRlciAtNzU0NzcxNjM0LkUrNzE2NTU1MDI2IC0yOTIzMzYuMzExIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDY5IHN1YnRyYWN0IC03NTQ3NzE2MzQuRSs3MTY1NTUwMjYgLTI5MjMzNi4zMTEgLT4gLTcuNTQ3NzE2MzRFKzcxNjU1NTAzNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNzAgYWRkIC05MTUwMDYuMTcxRSs2MTQ1NDg2NTIgLTMxNDA4Njk2NS4gLT4gLTkuMTUwMDYxNzFFKzYxNDU0ODY1NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzAgY29tcGFyZSAtOTE1MDA2LjE3MUUrNjE0NTQ4NjUyIC0zMTQwODY5NjUuIC0+IC0xCit4ZGl2MDcwIGRpdmlkZSAtOTE1MDA2LjE3MUUrNjE0NTQ4NjUyIC0zMTQwODY5NjUuIC0+IDIuOTEzMjI1NTVFKzYxNDU0ODY0OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNzAgZGl2aWRlaW50IC05MTUwMDYuMTcxRSs2MTQ1NDg2NTIgLTMxNDA4Njk2NS4gLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwNzAgbXVsdGlwbHkgLTkxNTAwNi4xNzFFKzYxNDU0ODY1MiAtMzE0MDg2OTY1LiAtPiAyLjg3MzkxNTExRSs2MTQ1NDg2NjYgSW5leGFjdCBSb3VuZGVkCit4cG93MDcwIHBvd2VyIC05MTUwMDYuMTcxRSs2MTQ1NDg2NTIgLTMxNDA4Njk2NSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDcwIHJlbWFpbmRlciAtOTE1MDA2LjE3MUUrNjE0NTQ4NjUyIC0zMTQwODY5NjUuIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDcwIHN1YnRyYWN0IC05MTUwMDYuMTcxRSs2MTQ1NDg2NTIgLTMxNDA4Njk2NS4gLT4gLTkuMTUwMDYxNzFFKzYxNDU0ODY1NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwNzEgYWRkIC0yOTY1OTAwMzUgLTQ4MTczNDUyOSAtPiAtNzc4MzI0NTY0Cit4Y29tMDcxIGNvbXBhcmUgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IDEKK3hkaXYwNzEgZGl2aWRlIC0yOTY1OTAwMzUgLTQ4MTczNDUyOSAtPiAwLjYxNTY3MTExNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNzEgZGl2aWRlaW50IC0yOTY1OTAwMzUgLTQ4MTczNDUyOSAtPiAwCit4bXVsMDcxIG11bHRpcGx5IC0yOTY1OTAwMzUgLTQ4MTczNDUyOSAtPiAxLjQyODc3NjYxRSsxNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNzEgcG93ZXIgLTI5NjU5MDAzNSAtNDgxNzM0NTI5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wNzEgcmVtYWluZGVyIC0yOTY1OTAwMzUgLTQ4MTczNDUyOSAtPiAtMjk2NTkwMDM1Cit4c3ViMDcxIHN1YnRyYWN0IC0yOTY1OTAwMzUgLTQ4MTczNDUyOSAtPiAxODUxNDQ0OTQKK3hhZGQwNzIgYWRkIDguMjc4MjI2MDUgOTI0MTU1Ny4xOSAtPiA5MjQxNTY1LjQ3IEluZXhhY3QgUm91bmRlZAoreGNvbTA3MiBjb21wYXJlIDguMjc4MjI2MDUgOTI0MTU1Ny4xOSAtPiAtMQoreGRpdjA3MiBkaXZpZGUgOC4yNzgyMjYwNSA5MjQxNTU3LjE5IC0+IDguOTU3NjA5NTBFLTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDcyIGRpdmlkZWludCA4LjI3ODIyNjA1IDkyNDE1NTcuMTkgLT4gMAoreG11bDA3MiBtdWx0aXBseSA4LjI3ODIyNjA1IDkyNDE1NTcuMTkgLT4gNzY1MDM2OTkuNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNzIgcG93ZXIgOC4yNzgyMjYwNSA5MjQxNTU3IC0+IDUuMTAyMTk5NjlFKzg0ODMxNjkgSW5leGFjdCBSb3VuZGVkCit4cmVtMDcyIHJlbWFpbmRlciA4LjI3ODIyNjA1IDkyNDE1NTcuMTkgLT4gOC4yNzgyMjYwNQoreHN1YjA3MiBzdWJ0cmFjdCA4LjI3ODIyNjA1IDkyNDE1NTcuMTkgLT4gLTkyNDE1NDguOTEgSW5leGFjdCBSb3VuZGVkCit4YWRkMDczIGFkZCAtMS40MzU4MTA5OCA3Mjg2MzEzLjU0IC0+IDcyODYzMTIuMTAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDczIGNvbXBhcmUgLTEuNDM1ODEwOTggNzI4NjMxMy41NCAtPiAtMQoreGRpdjA3MyBkaXZpZGUgLTEuNDM1ODEwOTggNzI4NjMxMy41NCAtPiAtMS45NzA1NTg4N0UtNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNzMgZGl2aWRlaW50IC0xLjQzNTgxMDk4IDcyODYzMTMuNTQgLT4gLTAKK3htdWwwNzMgbXVsdGlwbHkgLTEuNDM1ODEwOTggNzI4NjMxMy41NCAtPiAtMTA0NjE3NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNzMgcG93ZXIgLTEuNDM1ODEwOTggNzI4NjMxNCAtPiAxLjA5Mzg5NzQxRSsxMTQ0NjYwIEluZXhhY3QgUm91bmRlZAoreHJlbTA3MyByZW1haW5kZXIgLTEuNDM1ODEwOTggNzI4NjMxMy41NCAtPiAtMS40MzU4MTA5OAoreHN1YjA3MyBzdWJ0cmFjdCAtMS40MzU4MTA5OCA3Mjg2MzEzLjU0IC0+IC03Mjg2MzE0Ljk4IEluZXhhY3QgUm91bmRlZAoreGFkZDA3NCBhZGQgLTY5OTAzNjE5My4gNzU5MjYzLjUwOUUrNTMzNTQzNjI1IC0+IDcuNTkyNjM1MDlFKzUzMzU0MzYzMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzQgY29tcGFyZSAtNjk5MDM2MTkzLiA3NTkyNjMuNTA5RSs1MzM1NDM2MjUgLT4gLTEKK3hkaXYwNzQgZGl2aWRlIC02OTkwMzYxOTMuIDc1OTI2My41MDlFKzUzMzU0MzYyNSAtPiAtOS4yMDY3NjY2MkUtNTMzNTQzNjIzIEluZXhhY3QgUm91bmRlZAoreGR2aTA3NCBkaXZpZGVpbnQgLTY5OTAzNjE5My4gNzU5MjYzLjUwOUUrNTMzNTQzNjI1IC0+IC0wCit4bXVsMDc0IG11bHRpcGx5IC02OTkwMzYxOTMuIDc1OTI2My41MDlFKzUzMzU0MzYyNSAtPiAtNS4zMDc1MjY3M0UrNTMzNTQzNjM5IEluZXhhY3QgUm91bmRlZAoreHBvdzA3NCBwb3dlciAtNjk5MDM2MTkzLiA4IC0+IDUuNzAxNjA3MjRFKzcwIEluZXhhY3QgUm91bmRlZAoreHJlbTA3NCByZW1haW5kZXIgLTY5OTAzNjE5My4gNzU5MjYzLjUwOUUrNTMzNTQzNjI1IC0+IC02OTkwMzYxOTMKK3hzdWIwNzQgc3VidHJhY3QgLTY5OTAzNjE5My4gNzU5MjYzLjUwOUUrNTMzNTQzNjI1IC0+IC03LjU5MjYzNTA5RSs1MzM1NDM2MzAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDc1IGFkZCAtODMuNzI3MzYxNUUtMzA1MjgxOTU3IC0yODc3Nzk1OTMuRSs0NTg3Nzc3NzQgLT4gLTIuODc3Nzk1OTNFKzQ1ODc3Nzc4MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzUgY29tcGFyZSAtODMuNzI3MzYxNUUtMzA1MjgxOTU3IC0yODc3Nzk1OTMuRSs0NTg3Nzc3NzQgLT4gMQoreGRpdjA3NSBkaXZpZGUgLTgzLjcyNzM2MTVFLTMwNTI4MTk1NyAtMjg3Nzc5NTkzLkUrNDU4Nzc3Nzc0IC0+IDIuOTA5NDI2NjRFLTc2NDA1OTczOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNzUgZGl2aWRlaW50IC04My43MjczNjE1RS0zMDUyODE5NTcgLTI4Nzc3OTU5My5FKzQ1ODc3Nzc3NCAtPiAwCit4bXVsMDc1IG11bHRpcGx5IC04My43MjczNjE1RS0zMDUyODE5NTcgLTI4Nzc3OTU5My5FKzQ1ODc3Nzc3NCAtPiAyLjQwOTUwMjYwRSsxNTM0OTU4MjcgSW5leGFjdCBSb3VuZGVkCit4cG93MDc1IHBvd2VyIC04My43MjczNjE1RS0zMDUyODE5NTcgLTMgLT4gLTEuNzAzNzE4MjhFKzkxNTg0NTg2NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNzUgcmVtYWluZGVyIC04My43MjczNjE1RS0zMDUyODE5NTcgLTI4Nzc3OTU5My5FKzQ1ODc3Nzc3NCAtPiAtOC4zNzI3MzYxNUUtMzA1MjgxOTU2Cit4c3ViMDc1IHN1YnRyYWN0IC04My43MjczNjE1RS0zMDUyODE5NTcgLTI4Nzc3OTU5My5FKzQ1ODc3Nzc3NCAtPiAyLjg3Nzc5NTkzRSs0NTg3Nzc3ODIgSW5leGFjdCBSb3VuZGVkCit4YWRkMDc2IGFkZCA4LjQ4NTAzMjI0IDY1MjIuMDMzMTYgLT4gNjUzMC41MTgxOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzYgY29tcGFyZSA4LjQ4NTAzMjI0IDY1MjIuMDMzMTYgLT4gLTEKK3hkaXYwNzYgZGl2aWRlIDguNDg1MDMyMjQgNjUyMi4wMzMxNiAtPiAwLjAwMTMwMDk3OTYyIEluZXhhY3QgUm91bmRlZAoreGR2aTA3NiBkaXZpZGVpbnQgOC40ODUwMzIyNCA2NTIyLjAzMzE2IC0+IDAKK3htdWwwNzYgbXVsdGlwbHkgOC40ODUwMzIyNCA2NTIyLjAzMzE2IC0+IDU1MzM5LjY2MTYgSW5leGFjdCBSb3VuZGVkCit4cG93MDc2IHBvd2VyIDguNDg1MDMyMjQgNjUyMiAtPiA0Ljc2NTQ3NTQyRSs2MDU2IEluZXhhY3QgUm91bmRlZAoreHJlbTA3NiByZW1haW5kZXIgOC40ODUwMzIyNCA2NTIyLjAzMzE2IC0+IDguNDg1MDMyMjQKK3hzdWIwNzYgc3VidHJhY3QgOC40ODUwMzIyNCA2NTIyLjAzMzE2IC0+IC02NTEzLjU0ODEzIEluZXhhY3QgUm91bmRlZAoreGFkZDA3NyBhZGQgNTI3OTE2MDkxIC04MDkuMDU0MDcwIC0+IDUyNzkxNTI4MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wNzcgY29tcGFyZSA1Mjc5MTYwOTEgLTgwOS4wNTQwNzAgLT4gMQoreGRpdjA3NyBkaXZpZGUgNTI3OTE2MDkxIC04MDkuMDU0MDcwIC0+IC02NTI1MTAuMjcyIEluZXhhY3QgUm91bmRlZAoreGR2aTA3NyBkaXZpZGVpbnQgNTI3OTE2MDkxIC04MDkuMDU0MDcwIC0+IC02NTI1MTAKK3htdWwwNzcgbXVsdGlwbHkgNTI3OTE2MDkxIC04MDkuMDU0MDcwIC0+IC00LjI3MTEyNjYyRSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwNzcgcG93ZXIgNTI3OTE2MDkxIC04MDkgLT4gMi43ODYwOTY5N0UtNzA1NyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wNzcgcmVtYWluZGVyIDUyNzkxNjA5MSAtODA5LjA1NDA3MCAtPiAyMTkuNzg0MzAwCit4c3ViMDc3IHN1YnRyYWN0IDUyNzkxNjA5MSAtODA5LjA1NDA3MCAtPiA1Mjc5MTY5MDAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDc4IGFkZCAzODU3MDU4LjYwIDU3OTI5OTcuNThFKzg4MTA3NzQwOSAtPiA1Ljc5Mjk5NzU4RSs4ODEwNzc0MTUgSW5leGFjdCBSb3VuZGVkCit4Y29tMDc4IGNvbXBhcmUgMzg1NzA1OC42MCA1NzkyOTk3LjU4RSs4ODEwNzc0MDkgLT4gLTEKK3hkaXYwNzggZGl2aWRlIDM4NTcwNTguNjAgNTc5Mjk5Ny41OEUrODgxMDc3NDA5IC0+IDYuNjU4MTM5NTBFLTg4MTA3NzQxMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwNzggZGl2aWRlaW50IDM4NTcwNTguNjAgNTc5Mjk5Ny41OEUrODgxMDc3NDA5IC0+IDAKK3htdWwwNzggbXVsdGlwbHkgMzg1NzA1OC42MCA1NzkyOTk3LjU4RSs4ODEwNzc0MDkgLT4gMi4yMzQzOTMxMUUrODgxMDc3NDIyIEluZXhhY3QgUm91bmRlZAoreHBvdzA3OCBwb3dlciAzODU3MDU4LjYwIDYgLT4gMy4yOTI1ODgyNEUrMzkgSW5leGFjdCBSb3VuZGVkCit4cmVtMDc4IHJlbWFpbmRlciAzODU3MDU4LjYwIDU3OTI5OTcuNThFKzg4MTA3NzQwOSAtPiAzODU3MDU4LjYwCit4c3ViMDc4IHN1YnRyYWN0IDM4NTcwNTguNjAgNTc5Mjk5Ny41OEUrODgxMDc3NDA5IC0+IC01Ljc5Mjk5NzU4RSs4ODEwNzc0MTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMDc5IGFkZCAtNjY1ODczNjMuRSs1NTY1MzgxNzMgLTU1MTkwMjQwMkUrMzU3MzA5MTQ2IC0+IC02LjY1ODczNjMwRSs1NTY1MzgxODAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDc5IGNvbXBhcmUgLTY2NTg3MzYzLkUrNTU2NTM4MTczIC01NTE5MDI0MDJFKzM1NzMwOTE0NiAtPiAtMQoreGRpdjA3OSBkaXZpZGUgLTY2NTg3MzYzLkUrNTU2NTM4MTczIC01NTE5MDI0MDJFKzM1NzMwOTE0NiAtPiAxLjIwNjUwNjEzRSsxOTkyMjkwMjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDc5IGRpdmlkZWludCAtNjY1ODczNjMuRSs1NTY1MzgxNzMgLTU1MTkwMjQwMkUrMzU3MzA5MTQ2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDc5IG11bHRpcGx5IC02NjU4NzM2My5FKzU1NjUzODE3MyAtNTUxOTAyNDAyRSszNTczMDkxNDYgLT4gMy42NzQ5NzI1NkUrOTEzODQ3MzM1IEluZXhhY3QgUm91bmRlZAoreHBvdzA3OSBwb3dlciAtNjY1ODczNjMuRSs1NTY1MzgxNzMgLTYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMDc5IHJlbWFpbmRlciAtNjY1ODczNjMuRSs1NTY1MzgxNzMgLTU1MTkwMjQwMkUrMzU3MzA5MTQ2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDc5IHN1YnRyYWN0IC02NjU4NzM2My5FKzU1NjUzODE3MyAtNTUxOTAyNDAyRSszNTczMDkxNDYgLT4gLTYuNjU4NzM2MzBFKzU1NjUzODE4MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwODAgYWRkIC01ODAuNTAyOTU1IDM4MTI1NTIxLjcgLT4gMzgxMjQ5NDEuMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20wODAgY29tcGFyZSAtNTgwLjUwMjk1NSAzODEyNTUyMS43IC0+IC0xCit4ZGl2MDgwIGRpdmlkZSAtNTgwLjUwMjk1NSAzODEyNTUyMS43IC0+IC0wLjAwMDAxNTIyNjA5ODcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDgwIGRpdmlkZWludCAtNTgwLjUwMjk1NSAzODEyNTUyMS43IC0+IC0wCit4bXVsMDgwIG11bHRpcGx5IC01ODAuNTAyOTU1IDM4MTI1NTIxLjcgLT4gLTIuMjEzMTk3ODBFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzA4MCBwb3dlciAtNTgwLjUwMjk1NSAzODEyNTUyMiAtPiA2LjA3MjYyMDc4RSsxMDUzNzE0ODYgSW5leGFjdCBSb3VuZGVkCit4cmVtMDgwIHJlbWFpbmRlciAtNTgwLjUwMjk1NSAzODEyNTUyMS43IC0+IC01ODAuNTAyOTU1Cit4c3ViMDgwIHN1YnRyYWN0IC01ODAuNTAyOTU1IDM4MTI1NTIxLjcgLT4gLTM4MTI2MTAyLjIgSW5leGFjdCBSb3VuZGVkCit4YWRkMDgxIGFkZCAtOTYyNzM2My4wMCAtODA2MTY4ODVFLTc0OTg5MTM5NCAtPiAtOTYyNzM2My4wMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wODEgY29tcGFyZSAtOTYyNzM2My4wMCAtODA2MTY4ODVFLTc0OTg5MTM5NCAtPiAtMQoreGRpdjA4MSBkaXZpZGUgLTk2MjczNjMuMDAgLTgwNjE2ODg1RS03NDk4OTEzOTQgLT4gMS4xOTQyMTE3M0UrNzQ5ODkxMzkzIEluZXhhY3QgUm91bmRlZAoreGR2aTA4MSBkaXZpZGVpbnQgLTk2MjczNjMuMDAgLTgwNjE2ODg1RS03NDk4OTEzOTQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwODEgbXVsdGlwbHkgLTk2MjczNjMuMDAgLTgwNjE2ODg1RS03NDk4OTEzOTQgLT4gNy43NjEyODAxNkUtNzQ5ODkxMzgwIEluZXhhY3QgUm91bmRlZAoreHBvdzA4MSBwb3dlciAtOTYyNzM2My4wMCAtOCAtPiAxLjM1NTAwNjAxRS01NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wODEgcmVtYWluZGVyIC05NjI3MzYzLjAwIC04MDYxNjg4NUUtNzQ5ODkxMzk0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDgxIHN1YnRyYWN0IC05NjI3MzYzLjAwIC04MDYxNjg4NUUtNzQ5ODkxMzk0IC0+IC05NjI3MzYzLjAwIEluZXhhY3QgUm91bmRlZAoreGFkZDA4MiBhZGQgLTUyNi41OTQ4NTVFKzgwMzExMDEwNyAtNjQuNTQ1MTYzOSAtPiAtNS4yNjU5NDg1NUUrODAzMTEwMTA5IEluZXhhY3QgUm91bmRlZAoreGNvbTA4MiBjb21wYXJlIC01MjYuNTk0ODU1RSs4MDMxMTAxMDcgLTY0LjU0NTE2MzkgLT4gLTEKK3hkaXYwODIgZGl2aWRlIC01MjYuNTk0ODU1RSs4MDMxMTAxMDcgLTY0LjU0NTE2MzkgLT4gOC4xNTg1NDg1OEUrODAzMTEwMTA3IEluZXhhY3QgUm91bmRlZAoreGR2aTA4MiBkaXZpZGVpbnQgLTUyNi41OTQ4NTVFKzgwMzExMDEwNyAtNjQuNTQ1MTYzOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA4MiBtdWx0aXBseSAtNTI2LjU5NDg1NUUrODAzMTEwMTA3IC02NC41NDUxNjM5IC0+IDMuMzk4OTE1MTJFKzgwMzExMDExMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwODIgcG93ZXIgLTUyNi41OTQ4NTVFKzgwMzExMDEwNyAtNjUgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTA4MiByZW1haW5kZXIgLTUyNi41OTQ4NTVFKzgwMzExMDEwNyAtNjQuNTQ1MTYzOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA4MiBzdWJ0cmFjdCAtNTI2LjU5NDg1NUUrODAzMTEwMTA3IC02NC41NDUxNjM5IC0+IC01LjI2NTk0ODU1RSs4MDMxMTAxMDkgSW5leGFjdCBSb3VuZGVkCit4YWRkMDgzIGFkZCAtODM3OC41NTQ5OSA3NjAuMTMxMjU3IC0+IC03NjE4LjQyMzczIEluZXhhY3QgUm91bmRlZAoreGNvbTA4MyBjb21wYXJlIC04Mzc4LjU1NDk5IDc2MC4xMzEyNTcgLT4gLTEKK3hkaXYwODMgZGl2aWRlIC04Mzc4LjU1NDk5IDc2MC4xMzEyNTcgLT4gLTExLjAyMjUxMDggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDgzIGRpdmlkZWludCAtODM3OC41NTQ5OSA3NjAuMTMxMjU3IC0+IC0xMQoreG11bDA4MyBtdWx0aXBseSAtODM3OC41NTQ5OSA3NjAuMTMxMjU3IC0+IC02MzY4ODAxLjU0IEluZXhhY3QgUm91bmRlZAoreHBvdzA4MyBwb3dlciAtODM3OC41NTQ5OSA3NjAgLT4gNC4wNjAwNzkyOEUrMjk4MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wODMgcmVtYWluZGVyIC04Mzc4LjU1NDk5IDc2MC4xMzEyNTcgLT4gLTE3LjExMTE2MworeHN1YjA4MyBzdWJ0cmFjdCAtODM3OC41NTQ5OSA3NjAuMTMxMjU3IC0+IC05MTM4LjY4NjI1IEluZXhhY3QgUm91bmRlZAoreGFkZDA4NCBhZGQgLTcxNy42OTc3MTggOTg0MzA0NDEzIC0+IDk4NDMwMzY5NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wODQgY29tcGFyZSAtNzE3LjY5NzcxOCA5ODQzMDQ0MTMgLT4gLTEKK3hkaXYwODQgZGl2aWRlIC03MTcuNjk3NzE4IDk4NDMwNDQxMyAtPiAtNy4yOTE0MjAzMEUtNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwODQgZGl2aWRlaW50IC03MTcuNjk3NzE4IDk4NDMwNDQxMyAtPiAtMAoreG11bDA4NCBtdWx0aXBseSAtNzE3LjY5NzcxOCA5ODQzMDQ0MTMgLT4gLTcuMDY0MzMwMzFFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzA4NCBwb3dlciAtNzE3LjY5NzcxOCA5ODQzMDQ0MTMgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTA4NCByZW1haW5kZXIgLTcxNy42OTc3MTggOTg0MzA0NDEzIC0+IC03MTcuNjk3NzE4Cit4c3ViMDg0IHN1YnRyYWN0IC03MTcuNjk3NzE4IDk4NDMwNDQxMyAtPiAtOTg0MzA1MTMxIEluZXhhY3QgUm91bmRlZAoreGFkZDA4NSBhZGQgLTc2NzYyMjQzLjRFLTc0MTEwMDA5NCAtMjczLjcwNjY3NCAtPiAtMjczLjcwNjY3NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wODUgY29tcGFyZSAtNzY3NjIyNDMuNEUtNzQxMTAwMDk0IC0yNzMuNzA2Njc0IC0+IDEKK3hkaXYwODUgZGl2aWRlIC03Njc2MjI0My40RS03NDExMDAwOTQgLTI3My43MDY2NzQgLT4gMi44MDQ1NDQwOUUtNzQxMTAwMDg5IEluZXhhY3QgUm91bmRlZAoreGR2aTA4NSBkaXZpZGVpbnQgLTc2NzYyMjQzLjRFLTc0MTEwMDA5NCAtMjczLjcwNjY3NCAtPiAwCit4bXVsMDg1IG11bHRpcGx5IC03Njc2MjI0My40RS03NDExMDAwOTQgLTI3My43MDY2NzQgLT4gMi4xMDEwMzM4M0UtNzQxMTAwMDg0IEluZXhhY3QgUm91bmRlZAoreHBvdzA4NSBwb3dlciAtNzY3NjIyNDMuNEUtNzQxMTAwMDk0IC0yNzQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMDg1IHJlbWFpbmRlciAtNzY3NjIyNDMuNEUtNzQxMTAwMDk0IC0yNzMuNzA2Njc0IC0+IC03LjY3NjIyNDM0RS03NDExMDAwODcKK3hzdWIwODUgc3VidHJhY3QgLTc2NzYyMjQzLjRFLTc0MTEwMDA5NCAtMjczLjcwNjY3NCAtPiAyNzMuNzA2Njc0IEluZXhhY3QgUm91bmRlZAoreGFkZDA4NiBhZGQgLTcwMS41MTgzNTRFKzc4NjI3NDkxOCA4ODIyNzUwLjY4RSsyNDMwNTIxMDcgLT4gLTcuMDE1MTgzNTRFKzc4NjI3NDkyMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wODYgY29tcGFyZSAtNzAxLjUxODM1NEUrNzg2Mjc0OTE4IDg4MjI3NTAuNjhFKzI0MzA1MjEwNyAtPiAtMQoreGRpdjA4NiBkaXZpZGUgLTcwMS41MTgzNTRFKzc4NjI3NDkxOCA4ODIyNzUwLjY4RSsyNDMwNTIxMDcgLT4gLTcuOTUxMjQzMDlFKzU0MzIyMjgwNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwODYgZGl2aWRlaW50IC03MDEuNTE4MzU0RSs3ODYyNzQ5MTggODgyMjc1MC42OEUrMjQzMDUyMTA3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDg2IG11bHRpcGx5IC03MDEuNTE4MzU0RSs3ODYyNzQ5MTggODgyMjc1MC42OEUrMjQzMDUyMTA3IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hwb3cwODYgcG93ZXIgLTcwMS41MTgzNTRFKzc4NjI3NDkxOCA5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wODYgcmVtYWluZGVyIC03MDEuNTE4MzU0RSs3ODYyNzQ5MTggODgyMjc1MC42OEUrMjQzMDUyMTA3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMDg2IHN1YnRyYWN0IC03MDEuNTE4MzU0RSs3ODYyNzQ5MTggODgyMjc1MC42OEUrMjQzMDUyMTA3IC0+IC03LjAxNTE4MzU0RSs3ODYyNzQ5MjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDg3IGFkZCAtMzU5ODY2ODQ1LiAtNC41NzQzNDExNyAtPiAtMzU5ODY2ODUwIEluZXhhY3QgUm91bmRlZAoreGNvbTA4NyBjb21wYXJlIC0zNTk4NjY4NDUuIC00LjU3NDM0MTE3IC0+IC0xCit4ZGl2MDg3IGRpdmlkZSAtMzU5ODY2ODQ1LiAtNC41NzQzNDExNyAtPiA3ODY3MDc0OC44IEluZXhhY3QgUm91bmRlZAoreGR2aTA4NyBkaXZpZGVpbnQgLTM1OTg2Njg0NS4gLTQuNTc0MzQxMTcgLT4gNzg2NzA3NDgKK3htdWwwODcgbXVsdGlwbHkgLTM1OTg2Njg0NS4gLTQuNTc0MzQxMTcgLT4gMS42NDYxNTM3MkUrOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwODcgcG93ZXIgLTM1OTg2Njg0NS4gLTUgLT4gLTEuNjU2ODc5MDlFLTQzIEluZXhhY3QgUm91bmRlZAoreHJlbTA4NyByZW1haW5kZXIgLTM1OTg2Njg0NS4gLTQuNTc0MzQxMTcgLT4gLTMuNTQ4OTA0ODQKK3hzdWIwODcgc3VidHJhY3QgLTM1OTg2Njg0NS4gLTQuNTc0MzQxMTcgLT4gLTM1OTg2Njg0MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwODggYWRkIDc3OTkzNDUzNi4gLTc2NTYyNjQ1LjcgLT4gNzAzMzcxODkwIEluZXhhY3QgUm91bmRlZAoreGNvbTA4OCBjb21wYXJlIDc3OTkzNDUzNi4gLTc2NTYyNjQ1LjcgLT4gMQoreGRpdjA4OCBkaXZpZGUgNzc5OTM0NTM2LiAtNzY1NjI2NDUuNyAtPiAtMTAuMTg2ODgwNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwODggZGl2aWRlaW50IDc3OTkzNDUzNi4gLTc2NTYyNjQ1LjcgLT4gLTEwCit4bXVsMDg4IG11bHRpcGx5IDc3OTkzNDUzNi4gLTc2NTYyNjQ1LjcgLT4gLTUuOTcxMzg1MTVFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzA4OCBwb3dlciA3Nzk5MzQ1MzYuIC03NjU2MjY0NiAtPiAzLjM2NzM5MDYzRS02ODA3OTk1MDEgSW5leGFjdCBSb3VuZGVkCit4cmVtMDg4IHJlbWFpbmRlciA3Nzk5MzQ1MzYuIC03NjU2MjY0NS43IC0+IDE0MzA4MDc5LjAKK3hzdWIwODggc3VidHJhY3QgNzc5OTM0NTM2LiAtNzY1NjI2NDUuNyAtPiA4NTY0OTcxODIgSW5leGFjdCBSb3VuZGVkCit4YWRkMDg5IGFkZCAtNDgyMC45NTQ1MSAzNTE2MjM0Ljk5RSszMDMzMDMxNzYgLT4gMy41MTYyMzQ5OUUrMzAzMzAzMTgyIEluZXhhY3QgUm91bmRlZAoreGNvbTA4OSBjb21wYXJlIC00ODIwLjk1NDUxIDM1MTYyMzQuOTlFKzMwMzMwMzE3NiAtPiAtMQoreGRpdjA4OSBkaXZpZGUgLTQ4MjAuOTU0NTEgMzUxNjIzNC45OUUrMzAzMzAzMTc2IC0+IC0xLjM3MTA1NTg0RS0zMDMzMDMxNzkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDg5IGRpdmlkZWludCAtNDgyMC45NTQ1MSAzNTE2MjM0Ljk5RSszMDMzMDMxNzYgLT4gLTAKK3htdWwwODkgbXVsdGlwbHkgLTQ4MjAuOTU0NTEgMzUxNjIzNC45OUUrMzAzMzAzMTc2IC0+IC0xLjY5NTE2MDg5RSszMDMzMDMxODYgSW5leGFjdCBSb3VuZGVkCit4cG93MDg5IHBvd2VyIC00ODIwLjk1NDUxIDQgLT4gNS40MDE3MjA4MkUrMTQgSW5leGFjdCBSb3VuZGVkCit4cmVtMDg5IHJlbWFpbmRlciAtNDgyMC45NTQ1MSAzNTE2MjM0Ljk5RSszMDMzMDMxNzYgLT4gLTQ4MjAuOTU0NTEKK3hzdWIwODkgc3VidHJhY3QgLTQ4MjAuOTU0NTEgMzUxNjIzNC45OUUrMzAzMzAzMTc2IC0+IC0zLjUxNjIzNDk5RSszMDMzMDMxODIgSW5leGFjdCBSb3VuZGVkCit4YWRkMDkwIGFkZCA2OTM1NTk3Ni45IC05LjU3ODM4NTYyRSs3NTg4MDQ5ODQgLT4gLTkuNTc4Mzg1NjJFKzc1ODgwNDk4NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20wOTAgY29tcGFyZSA2OTM1NTk3Ni45IC05LjU3ODM4NTYyRSs3NTg4MDQ5ODQgLT4gMQoreGRpdjA5MCBkaXZpZGUgNjkzNTU5NzYuOSAtOS41NzgzODU2MkUrNzU4ODA0OTg0IC0+IC03LjI0MDg4Mzc2RS03NTg4MDQ5NzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMDkwIGRpdmlkZWludCA2OTM1NTk3Ni45IC05LjU3ODM4NTYyRSs3NTg4MDQ5ODQgLT4gLTAKK3htdWwwOTAgbXVsdGlwbHkgNjkzNTU5NzYuOSAtOS41NzgzODU2MkUrNzU4ODA0OTg0IC0+IC02LjY0MzE4MjkyRSs3NTg4MDQ5OTIgSW5leGFjdCBSb3VuZGVkCit4cG93MDkwIHBvd2VyIDY5MzU1OTc2LjkgLTEwIC0+IDMuODgyOTQzNDZFLTc5IEluZXhhY3QgUm91bmRlZAoreHJlbTA5MCByZW1haW5kZXIgNjkzNTU5NzYuOSAtOS41NzgzODU2MkUrNzU4ODA0OTg0IC0+IDY5MzU1OTc2LjkKK3hzdWIwOTAgc3VidHJhY3QgNjkzNTU5NzYuOSAtOS41NzgzODU2MkUrNzU4ODA0OTg0IC0+IDkuNTc4Mzg1NjJFKzc1ODgwNDk4NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTEgYWRkIC0xMjY3MjA5My4xIDg1NjkuNzgyNTVFLTM4Mjg2NjAyNSAtPiAtMTI2NzIwOTMuMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20wOTEgY29tcGFyZSAtMTI2NzIwOTMuMSA4NTY5Ljc4MjU1RS0zODI4NjYwMjUgLT4gLTEKK3hkaXYwOTEgZGl2aWRlIC0xMjY3MjA5My4xIDg1NjkuNzgyNTVFLTM4Mjg2NjAyNSAtPiAtMS40Nzg2OTQ4MkUrMzgyODY2MDI4IEluZXhhY3QgUm91bmRlZAoreGR2aTA5MSBkaXZpZGVpbnQgLTEyNjcyMDkzLjEgODU2OS43ODI1NUUtMzgyODY2MDI1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMDkxIG11bHRpcGx5IC0xMjY3MjA5My4xIDg1NjkuNzgyNTVFLTM4Mjg2NjAyNSAtPiAtMS4wODU5NzA4MkUtMzgyODY2MDE0IEluZXhhY3QgUm91bmRlZAoreHBvdzA5MSBwb3dlciAtMTI2NzIwOTMuMSA5IC0+IC04LjQyNjI2NjU4RSs2MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wOTEgcmVtYWluZGVyIC0xMjY3MjA5My4xIDg1NjkuNzgyNTVFLTM4Mjg2NjAyNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA5MSBzdWJ0cmFjdCAtMTI2NzIwOTMuMSA4NTY5Ljc4MjU1RS0zODI4NjYwMjUgLT4gLTEyNjcyMDkzLjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMDkyIGFkZCAtNTkxMDc1MC4yIDY2MTUwMzgzRS02NjI0NTkyNDEgLT4gLTU5MTA3NTAuMjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMDkyIGNvbXBhcmUgLTU5MTA3NTAuMiA2NjE1MDM4M0UtNjYyNDU5MjQxIC0+IC0xCit4ZGl2MDkyIGRpdmlkZSAtNTkxMDc1MC4yIDY2MTUwMzgzRS02NjI0NTkyNDEgLT4gLTguOTM1MzIyNzJFKzY2MjQ1OTIzOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwOTIgZGl2aWRlaW50IC01OTEwNzUwLjIgNjYxNTAzODNFLTY2MjQ1OTI0MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA5MiBtdWx0aXBseSAtNTkxMDc1MC4yIDY2MTUwMzgzRS02NjI0NTkyNDEgLT4gLTMuOTA5OTgzOTBFLTY2MjQ1OTIyNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cwOTIgcG93ZXIgLTU5MTA3NTAuMiA3IC0+IC0yLjUyMDU2Njk2RSs0NyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0wOTIgcmVtYWluZGVyIC01OTEwNzUwLjIgNjYxNTAzODNFLTY2MjQ1OTI0MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA5MiBzdWJ0cmFjdCAtNTkxMDc1MC4yIDY2MTUwMzgzRS02NjI0NTkyNDEgLT4gLTU5MTA3NTAuMjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMDkzIGFkZCAtNTMyNTc3MjY4LkUtMTYzODA2NjI5IC0yNDA2NTAzOThFLTY1MDExMDU1OCAtPiAtNS4zMjU3NzI2OEUtMTYzODA2NjIxIEluZXhhY3QgUm91bmRlZAoreGNvbTA5MyBjb21wYXJlIC01MzI1NzcyNjguRS0xNjM4MDY2MjkgLTI0MDY1MDM5OEUtNjUwMTEwNTU4IC0+IC0xCit4ZGl2MDkzIGRpdmlkZSAtNTMyNTc3MjY4LkUtMTYzODA2NjI5IC0yNDA2NTAzOThFLTY1MDExMDU1OCAtPiAyLjIxMzA3NDU0RSs0ODYzMDM5MjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDkzIGRpdmlkZWludCAtNTMyNTc3MjY4LkUtMTYzODA2NjI5IC0yNDA2NTAzOThFLTY1MDExMDU1OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA5MyBtdWx0aXBseSAtNTMyNTc3MjY4LkUtMTYzODA2NjI5IC0yNDA2NTAzOThFLTY1MDExMDU1OCAtPiAxLjI4MTY0OTMyRS04MTM5MTcxNzAgSW5leGFjdCBSb3VuZGVkCit4cG93MDkzIHBvd2VyIC01MzI1NzcyNjguRS0xNjM4MDY2MjkgLTIgLT4gMy41MjU2MTM4OUUrMzI3NjEzMjQwIEluZXhhY3QgUm91bmRlZAoreHJlbTA5MyByZW1haW5kZXIgLTUzMjU3NzI2OC5FLTE2MzgwNjYyOSAtMjQwNjUwMzk4RS02NTAxMTA1NTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwOTMgc3VidHJhY3QgLTUzMjU3NzI2OC5FLTE2MzgwNjYyOSAtMjQwNjUwMzk4RS02NTAxMTA1NTggLT4gLTUuMzI1NzcyNjhFLTE2MzgwNjYyMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTQgYWRkIC02NzEuNTA3MTk4RS05MDg1ODc4OTAgMzA1NzQyOS4zMkUtNTU1MjMwNjIzIC0+IDMuMDU3NDI5MzJFLTU1NTIzMDYxNyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wOTQgY29tcGFyZSAtNjcxLjUwNzE5OEUtOTA4NTg3ODkwIDMwNTc0MjkuMzJFLTU1NTIzMDYyMyAtPiAtMQoreGRpdjA5NCBkaXZpZGUgLTY3MS41MDcxOThFLTkwODU4Nzg5MCAzMDU3NDI5LjMyRS01NTUyMzA2MjMgLT4gLTIuMTk2MzEzMDdFLTM1MzM1NzI3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwOTQgZGl2aWRlaW50IC02NzEuNTA3MTk4RS05MDg1ODc4OTAgMzA1NzQyOS4zMkUtNTU1MjMwNjIzIC0+IC0wCit4bXVsMDk0IG11bHRpcGx5IC02NzEuNTA3MTk4RS05MDg1ODc4OTAgMzA1NzQyOS4zMkUtNTU1MjMwNjIzIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3cwOTQgcG93ZXIgLTY3MS41MDcxOThFLTkwODU4Nzg5MCAzIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wOTQgcmVtYWluZGVyIC02NzEuNTA3MTk4RS05MDg1ODc4OTAgMzA1NzQyOS4zMkUtNTU1MjMwNjIzIC0+IC02LjcxNTA3MTk4RS05MDg1ODc4ODgKK3hzdWIwOTQgc3VidHJhY3QgLTY3MS41MDcxOThFLTkwODU4Nzg5MCAzMDU3NDI5LjMyRS01NTUyMzA2MjMgLT4gLTMuMDU3NDI5MzJFLTU1NTIzMDYxNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTUgYWRkIC0yOTQuOTk0MzUyRSszNDY0NTIwMjcgLTYwNjE4NTMuMCAtPiAtMi45NDk5NDM1MkUrMzQ2NDUyMDI5IEluZXhhY3QgUm91bmRlZAoreGNvbTA5NSBjb21wYXJlIC0yOTQuOTk0MzUyRSszNDY0NTIwMjcgLTYwNjE4NTMuMCAtPiAtMQoreGRpdjA5NSBkaXZpZGUgLTI5NC45OTQzNTJFKzM0NjQ1MjAyNyAtNjA2MTg1My4wIC0+IDQuODY2NDA1NTdFKzM0NjQ1MjAyMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkwOTUgZGl2aWRlaW50IC0yOTQuOTk0MzUyRSszNDY0NTIwMjcgLTYwNjE4NTMuMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDA5NSBtdWx0aXBseSAtMjk0Ljk5NDM1MkUrMzQ2NDUyMDI3IC02MDYxODUzLjAgLT4gMS43ODgyMTI0MEUrMzQ2NDUyMDM2IEluZXhhY3QgUm91bmRlZAoreHBvdzA5NSBwb3dlciAtMjk0Ljk5NDM1MkUrMzQ2NDUyMDI3IC02MDYxODUzIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wOTUgcmVtYWluZGVyIC0yOTQuOTk0MzUyRSszNDY0NTIwMjcgLTYwNjE4NTMuMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjA5NSBzdWJ0cmFjdCAtMjk0Ljk5NDM1MkUrMzQ2NDUyMDI3IC02MDYxODUzLjAgLT4gLTIuOTQ5OTQzNTJFKzM0NjQ1MjAyOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTYgYWRkIDMyOTU3OTExNCAxNDY3ODA1NDguIC0+IDQ3NjM1OTY2MgoreGNvbTA5NiBjb21wYXJlIDMyOTU3OTExNCAxNDY3ODA1NDguIC0+IDEKK3hkaXYwOTYgZGl2aWRlIDMyOTU3OTExNCAxNDY3ODA1NDguIC0+IDIuMjQ1Mzg2ODYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDk2IGRpdmlkZWludCAzMjk1NzkxMTQgMTQ2NzgwNTQ4LiAtPiAyCit4bXVsMDk2IG11bHRpcGx5IDMyOTU3OTExNCAxNDY3ODA1NDguIC0+IDQuODM3NTgwMzBFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzA5NiBwb3dlciAzMjk1NzkxMTQgMTQ2NzgwNTQ4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTA5NiByZW1haW5kZXIgMzI5NTc5MTE0IDE0Njc4MDU0OC4gLT4gMzYwMTgwMTgKK3hzdWIwOTYgc3VidHJhY3QgMzI5NTc5MTE0IDE0Njc4MDU0OC4gLT4gMTgyNzk4NTY2Cit4YWRkMDk3IGFkZCAtNzg5OTA0LjY4NkUtMjE3MjI1MDAwIC0xOTkxLjA3MTgxRS04NDA4MDA1OSAtPiAtMS45OTEwNzE4MUUtODQwODAwNTYgSW5leGFjdCBSb3VuZGVkCit4Y29tMDk3IGNvbXBhcmUgLTc4OTkwNC42ODZFLTIxNzIyNTAwMCAtMTk5MS4wNzE4MUUtODQwODAwNTkgLT4gMQoreGRpdjA5NyBkaXZpZGUgLTc4OTkwNC42ODZFLTIxNzIyNTAwMCAtMTk5MS4wNzE4MUUtODQwODAwNTkgLT4gMy45NjcyMzM1NEUtMTMzMTQ0OTM5IEluZXhhY3QgUm91bmRlZAoreGR2aTA5NyBkaXZpZGVpbnQgLTc4OTkwNC42ODZFLTIxNzIyNTAwMCAtMTk5MS4wNzE4MUUtODQwODAwNTkgLT4gMAoreG11bDA5NyBtdWx0aXBseSAtNzg5OTA0LjY4NkUtMjE3MjI1MDAwIC0xOTkxLjA3MTgxRS04NDA4MDA1OSAtPiAxLjU3Mjc1Njk1RS0zMDEzMDUwNTAgSW5leGFjdCBSb3VuZGVkCit4cG93MDk3IHBvd2VyIC03ODk5MDQuNjg2RS0yMTcyMjUwMDAgLTIgLT4gMS42MDI2OTQwM0UrNDM0NDQ5OTg4IEluZXhhY3QgUm91bmRlZAoreHJlbTA5NyByZW1haW5kZXIgLTc4OTkwNC42ODZFLTIxNzIyNTAwMCAtMTk5MS4wNzE4MUUtODQwODAwNTkgLT4gLTcuODk5MDQ2ODZFLTIxNzIyNDk5NQoreHN1YjA5NyBzdWJ0cmFjdCAtNzg5OTA0LjY4NkUtMjE3MjI1MDAwIC0xOTkxLjA3MTgxRS04NDA4MDA1OSAtPiAxLjk5MTA3MTgxRS04NDA4MDA1NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQwOTggYWRkIDU5ODkzLjM1NDQgLTQwODU5NTg2OCAtPiAtNDA4NTM1OTc1IEluZXhhY3QgUm91bmRlZAoreGNvbTA5OCBjb21wYXJlIDU5ODkzLjM1NDQgLTQwODU5NTg2OCAtPiAxCit4ZGl2MDk4IGRpdmlkZSA1OTg5My4zNTQ0IC00MDg1OTU4NjggLT4gLTAuMDAwMTQ2NTgzMzU4IEluZXhhY3QgUm91bmRlZAoreGR2aTA5OCBkaXZpZGVpbnQgNTk4OTMuMzU0NCAtNDA4NTk1ODY4IC0+IC0wCit4bXVsMDk4IG11bHRpcGx5IDU5ODkzLjM1NDQgLTQwODU5NTg2OCAtPiAtMi40NDcyMTc3MUUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MDk4IHBvd2VyIDU5ODkzLjM1NDQgLTQwODU5NTg2OCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0wOTggcmVtYWluZGVyIDU5ODkzLjM1NDQgLTQwODU5NTg2OCAtPiA1OTg5My4zNTQ0Cit4c3ViMDk4IHN1YnRyYWN0IDU5ODkzLjM1NDQgLTQwODU5NTg2OCAtPiA0MDg2NTU3NjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMDk5IGFkZCAxMjkuODc4NjEzIC01NDY1Mi43Mjg4RS05NjM1NjQ5NDAgLT4gMTI5Ljg3ODYxMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20wOTkgY29tcGFyZSAxMjkuODc4NjEzIC01NDY1Mi43Mjg4RS05NjM1NjQ5NDAgLT4gMQoreGRpdjA5OSBkaXZpZGUgMTI5Ljg3ODYxMyAtNTQ2NTIuNzI4OEUtOTYzNTY0OTQwIC0+IC0yLjM3NjQzNDE4RSs5NjM1NjQ5MzcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMDk5IGRpdmlkZWludCAxMjkuODc4NjEzIC01NDY1Mi43Mjg4RS05NjM1NjQ5NDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwwOTkgbXVsdGlwbHkgMTI5Ljg3ODYxMyAtNTQ2NTIuNzI4OEUtOTYzNTY0OTQwIC0+IC03LjA5ODIyMDYxRS05NjM1NjQ5MzQgSW5leGFjdCBSb3VuZGVkCit4cG93MDk5IHBvd2VyIDEyOS44Nzg2MTMgLTUgLT4gMi43MDU5MDAyOUUtMTEgSW5leGFjdCBSb3VuZGVkCit4cmVtMDk5IHJlbWFpbmRlciAxMjkuODc4NjEzIC01NDY1Mi43Mjg4RS05NjM1NjQ5NDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIwOTkgc3VidHJhY3QgMTI5Ljg3ODYxMyAtNTQ2NTIuNzI4OEUtOTYzNTY0OTQwIC0+IDEyOS44Nzg2MTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMTAwIGFkZCA5ODY2Ljk5MjA4IDcwODc1NjUwMS4gLT4gNzA4NzY2MzY4IEluZXhhY3QgUm91bmRlZAoreGNvbTEwMCBjb21wYXJlIDk4NjYuOTkyMDggNzA4NzU2NTAxLiAtPiAtMQoreGRpdjEwMCBkaXZpZGUgOTg2Ni45OTIwOCA3MDg3NTY1MDEuIC0+IDAuMDAwMDEzOTIxNTU0MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMDAgZGl2aWRlaW50IDk4NjYuOTkyMDggNzA4NzU2NTAxLiAtPiAwCit4bXVsMTAwIG11bHRpcGx5IDk4NjYuOTkyMDggNzA4NzU2NTAxLiAtPiA2Ljk5MzI5NDc4RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMDAgcG93ZXIgOTg2Ni45OTIwOCA3MDg3NTY1MDEgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTAwIHJlbWFpbmRlciA5ODY2Ljk5MjA4IDcwODc1NjUwMS4gLT4gOTg2Ni45OTIwOAoreHN1YjEwMCBzdWJ0cmFjdCA5ODY2Ljk5MjA4IDcwODc1NjUwMS4gLT4gLTcwODc0NjYzNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMDEgYWRkIC03ODgxMC42Mjk3IC0zOTk4ODQuNjggLT4gLTQ3ODY5NS4zMTAgSW5leGFjdCBSb3VuZGVkCit4Y29tMTAxIGNvbXBhcmUgLTc4ODEwLjYyOTcgLTM5OTg4NC42OCAtPiAxCit4ZGl2MTAxIGRpdmlkZSAtNzg4MTAuNjI5NyAtMzk5ODg0LjY4IC0+IDAuMTk3MDgzMzkzIEluZXhhY3QgUm91bmRlZAoreGR2aTEwMSBkaXZpZGVpbnQgLTc4ODEwLjYyOTcgLTM5OTg4NC42OCAtPiAwCit4bXVsMTAxIG11bHRpcGx5IC03ODgxMC42Mjk3IC0zOTk4ODQuNjggLT4gMy4xNTE1MTYzNEUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MTAxIHBvd2VyIC03ODgxMC42Mjk3IC0zOTk4ODUgLT4gLTEuNTQyNTI0MDhFLTE5NTgwNzEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTAxIHJlbWFpbmRlciAtNzg4MTAuNjI5NyAtMzk5ODg0LjY4IC0+IC03ODgxMC42Mjk3Cit4c3ViMTAxIHN1YnRyYWN0IC03ODgxMC42Mjk3IC0zOTk4ODQuNjggLT4gMzIxMDc0LjA1MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMDIgYWRkIDQwOTE4OTc2MSAtNzcxLjQ3MTQ2MCAtPiA0MDkxODg5OTAgSW5leGFjdCBSb3VuZGVkCit4Y29tMTAyIGNvbXBhcmUgNDA5MTg5NzYxIC03NzEuNDcxNDYwIC0+IDEKK3hkaXYxMDIgZGl2aWRlIDQwOTE4OTc2MSAtNzcxLjQ3MTQ2MCAtPiAtNTMwNDAxLjY4MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMDIgZGl2aWRlaW50IDQwOTE4OTc2MSAtNzcxLjQ3MTQ2MCAtPiAtNTMwNDAxCit4bXVsMTAyIG11bHRpcGx5IDQwOTE4OTc2MSAtNzcxLjQ3MTQ2MCAtPiAtMy4xNTY3ODIyMkUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93MTAyIHBvd2VyIDQwOTE4OTc2MSAtNzcxIC0+IDEuNjA2OTg0MTRFLTY2NDAgSW5leGFjdCBSb3VuZGVkCit4cmVtMTAyIHJlbWFpbmRlciA0MDkxODk3NjEgLTc3MS40NzE0NjAgLT4gNTI3LjE0NDU0MAoreHN1YjEwMiBzdWJ0cmFjdCA0MDkxODk3NjEgLTc3MS40NzE0NjAgLT4gNDA5MTkwNTMyIEluZXhhY3QgUm91bmRlZAoreGFkZDEwMyBhZGQgLTEuNjg3NDg4MzggNDYwLjQ2OTI0IC0+IDQ1OC43ODE3NTIgSW5leGFjdCBSb3VuZGVkCit4Y29tMTAzIGNvbXBhcmUgLTEuNjg3NDg4MzggNDYwLjQ2OTI0IC0+IC0xCit4ZGl2MTAzIGRpdmlkZSAtMS42ODc0ODgzOCA0NjAuNDY5MjQgLT4gLTAuMDAzNjY0NzE0NjcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTAzIGRpdmlkZWludCAtMS42ODc0ODgzOCA0NjAuNDY5MjQgLT4gLTAKK3htdWwxMDMgbXVsdGlwbHkgLTEuNjg3NDg4MzggNDYwLjQ2OTI0IC0+IC03NzcuMDM2NDkyIEluZXhhY3QgUm91bmRlZAoreHBvdzEwMyBwb3dlciAtMS42ODc0ODgzOCA0NjAgLT4gMy4zOTQ0MDY0OEUrMTA0IEluZXhhY3QgUm91bmRlZAoreHJlbTEwMyByZW1haW5kZXIgLTEuNjg3NDg4MzggNDYwLjQ2OTI0IC0+IC0xLjY4NzQ4ODM4Cit4c3ViMTAzIHN1YnRyYWN0IC0xLjY4NzQ4ODM4IDQ2MC40NjkyNCAtPiAtNDYyLjE1NjcyOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMDQgYWRkIDU1MzUyNzI5Ni4gLTc5MjQuNDAxODUgLT4gNTUzNTE5MzcyIEluZXhhY3QgUm91bmRlZAoreGNvbTEwNCBjb21wYXJlIDU1MzUyNzI5Ni4gLTc5MjQuNDAxODUgLT4gMQoreGRpdjEwNCBkaXZpZGUgNTUzNTI3Mjk2LiAtNzkyNC40MDE4NSAtPiAtNjk4NTAuOTg3NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMDQgZGl2aWRlaW50IDU1MzUyNzI5Ni4gLTc5MjQuNDAxODUgLT4gLTY5ODUwCit4bXVsMTA0IG11bHRpcGx5IDU1MzUyNzI5Ni4gLTc5MjQuNDAxODUgLT4gLTQuMzg2MzcyNzNFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzEwNCBwb3dlciA1NTM1MjcyOTYuIC03OTI0IC0+IDIuMzIzOTcyMTRFLTY5MjgxIEluZXhhY3QgUm91bmRlZAoreHJlbTEwNCByZW1haW5kZXIgNTUzNTI3Mjk2LiAtNzkyNC40MDE4NSAtPiA3ODI2Ljc3NzUwCit4c3ViMTA0IHN1YnRyYWN0IDU1MzUyNzI5Ni4gLTc5MjQuNDAxODUgLT4gNTUzNTM1MjIwIEluZXhhY3QgUm91bmRlZAoreGFkZDEwNSBhZGQgLTM4Ljc0NjUyMDcgNjQ5MzYuMjk0MiAtPiA2NDg5Ny41NDc3IEluZXhhY3QgUm91bmRlZAoreGNvbTEwNSBjb21wYXJlIC0zOC43NDY1MjA3IDY0OTM2LjI5NDIgLT4gLTEKK3hkaXYxMDUgZGl2aWRlIC0zOC43NDY1MjA3IDY0OTM2LjI5NDIgLT4gLTAuMDAwNTk2Njg1MTIzIEluZXhhY3QgUm91bmRlZAoreGR2aTEwNSBkaXZpZGVpbnQgLTM4Ljc0NjUyMDcgNjQ5MzYuMjk0MiAtPiAtMAoreG11bDEwNSBtdWx0aXBseSAtMzguNzQ2NTIwNyA2NDkzNi4yOTQyIC0+IC0yNTE2MDU1LjQ3IEluZXhhY3QgUm91bmRlZAoreHBvdzEwNSBwb3dlciAtMzguNzQ2NTIwNyA2NDkzNiAtPiAzLjAxNTAwNzYyRSsxMDMxMzMgSW5leGFjdCBSb3VuZGVkCit4cmVtMTA1IHJlbWFpbmRlciAtMzguNzQ2NTIwNyA2NDkzNi4yOTQyIC0+IC0zOC43NDY1MjA3Cit4c3ViMTA1IHN1YnRyYWN0IC0zOC43NDY1MjA3IDY0OTM2LjI5NDIgLT4gLTY0OTc1LjA0MDcgSW5leGFjdCBSb3VuZGVkCit4YWRkMTA2IGFkZCAtMjAxMDc1LjI0OCA4NDUuNjYzOTI4IC0+IC0yMDAyMjkuNTg0IEluZXhhY3QgUm91bmRlZAoreGNvbTEwNiBjb21wYXJlIC0yMDEwNzUuMjQ4IDg0NS42NjM5MjggLT4gLTEKK3hkaXYxMDYgZGl2aWRlIC0yMDEwNzUuMjQ4IDg0NS42NjM5MjggLT4gLTIzNy43NzIwNTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTA2IGRpdmlkZWludCAtMjAxMDc1LjI0OCA4NDUuNjYzOTI4IC0+IC0yMzcKK3htdWwxMDYgbXVsdGlwbHkgLTIwMTA3NS4yNDggODQ1LjY2MzkyOCAtPiAtMTcwMDQyMDg0IEluZXhhY3QgUm91bmRlZAoreHBvdzEwNiBwb3dlciAtMjAxMDc1LjI0OCA4NDYgLT4gNC4zNzkxMTc2N0UrNDQ4NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMDYgcmVtYWluZGVyIC0yMDEwNzUuMjQ4IDg0NS42NjM5MjggLT4gLTY1Mi44OTcwNjQKK3hzdWIxMDYgc3VidHJhY3QgLTIwMTA3NS4yNDggODQ1LjY2MzkyOCAtPiAtMjAxOTIwLjkxMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMDcgYWRkIDkxMDQ4LjQ1NTkgNzU5NTM2MDkuMyAtPiA3NjA0NDY1Ny44IEluZXhhY3QgUm91bmRlZAoreGNvbTEwNyBjb21wYXJlIDkxMDQ4LjQ1NTkgNzU5NTM2MDkuMyAtPiAtMQoreGRpdjEwNyBkaXZpZGUgOTEwNDguNDU1OSA3NTk1MzYwOS4zIC0+IDAuMDAxMTk4NzM3NzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTA3IGRpdmlkZWludCA5MTA0OC40NTU5IDc1OTUzNjA5LjMgLT4gMAoreG11bDEwNyBtdWx0aXBseSA5MTA0OC40NTU5IDc1OTUzNjA5LjMgLT4gNi45MTU0NTg4NUUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93MTA3IHBvd2VyIDkxMDQ4LjQ1NTkgNzU5NTM2MDkgLT4gNi45NDQ2Nzc0NkUrMzc2Njc0NjUwIEluZXhhY3QgUm91bmRlZAoreHJlbTEwNyByZW1haW5kZXIgOTEwNDguNDU1OSA3NTk1MzYwOS4zIC0+IDkxMDQ4LjQ1NTkKK3hzdWIxMDcgc3VidHJhY3QgOTEwNDguNDU1OSA3NTk1MzYwOS4zIC0+IC03NTg2MjU2MC44IEluZXhhY3QgUm91bmRlZAoreGFkZDEwOCBhZGQgNjg5ODI3My44NkUtMjUyMDk3NDYwIDE1LjM0NTYxOTYgLT4gMTUuMzQ1NjE5NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMDggY29tcGFyZSA2ODk4MjczLjg2RS0yNTIwOTc0NjAgMTUuMzQ1NjE5NiAtPiAtMQoreGRpdjEwOCBkaXZpZGUgNjg5ODI3My44NkUtMjUyMDk3NDYwIDE1LjM0NTYxOTYgLT4gNC40OTUyNzIyOUUtMjUyMDk3NDU1IEluZXhhY3QgUm91bmRlZAoreGR2aTEwOCBkaXZpZGVpbnQgNjg5ODI3My44NkUtMjUyMDk3NDYwIDE1LjM0NTYxOTYgLT4gMAoreG11bDEwOCBtdWx0aXBseSA2ODk4MjczLjg2RS0yNTIwOTc0NjAgMTUuMzQ1NjE5NiAtPiAxLjA1ODU4Mjg3RS0yNTIwOTc0NTIgSW5leGFjdCBSb3VuZGVkCit4cG93MTA4IHBvd2VyIDY4OTgyNzMuODZFLTI1MjA5NzQ2MCAxNSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xMDggcmVtYWluZGVyIDY4OTgyNzMuODZFLTI1MjA5NzQ2MCAxNS4zNDU2MTk2IC0+IDYuODk4MjczODZFLTI1MjA5NzQ1NAoreHN1YjEwOCBzdWJ0cmFjdCA2ODk4MjczLjg2RS0yNTIwOTc0NjAgMTUuMzQ1NjE5NiAtPiAtMTUuMzQ1NjE5NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMDkgYWRkIDg4LjQzNzAzNDMgLTk4MDcwOTEwNUUtODY5ODk5Mjg5IC0+IDg4LjQzNzAzNDMgSW5leGFjdCBSb3VuZGVkCit4Y29tMTA5IGNvbXBhcmUgODguNDM3MDM0MyAtOTgwNzA5MTA1RS04Njk4OTkyODkgLT4gMQoreGRpdjEwOSBkaXZpZGUgODguNDM3MDM0MyAtOTgwNzA5MTA1RS04Njk4OTkyODkgLT4gLTkuMDE3NjYyMjBFKzg2OTg5OTI4MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMDkgZGl2aWRlaW50IDg4LjQzNzAzNDMgLTk4MDcwOTEwNUUtODY5ODk5Mjg5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTA5IG11bHRpcGx5IDg4LjQzNzAzNDMgLTk4MDcwOTEwNUUtODY5ODk5Mjg5IC0+IC04LjY3MzEwMDQ4RS04Njk4OTkyNzkgSW5leGFjdCBSb3VuZGVkCit4cG93MTA5IHBvd2VyIDg4LjQzNzAzNDMgLTEwIC0+IDMuNDE3MTA0NzlFLTIwIEluZXhhY3QgUm91bmRlZAoreHJlbTEwOSByZW1haW5kZXIgODguNDM3MDM0MyAtOTgwNzA5MTA1RS04Njk4OTkyODkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxMDkgc3VidHJhY3QgODguNDM3MDM0MyAtOTgwNzA5MTA1RS04Njk4OTkyODkgLT4gODguNDM3MDM0MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTAgYWRkIC0xNzY0My4zOSAyLjAzNTI1NjhFKzMwNDg3MTMzMSAtPiAyLjAzNTI1NjgwRSszMDQ4NzEzMzEgSW5leGFjdCBSb3VuZGVkCit4Y29tMTEwIGNvbXBhcmUgLTE3NjQzLjM5IDIuMDM1MjU2OEUrMzA0ODcxMzMxIC0+IC0xCit4ZGl2MTEwIGRpdmlkZSAtMTc2NDMuMzkgMi4wMzUyNTY4RSszMDQ4NzEzMzEgLT4gLTguNjY4ODc2NThFLTMwNDg3MTMyOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMTAgZGl2aWRlaW50IC0xNzY0My4zOSAyLjAzNTI1NjhFKzMwNDg3MTMzMSAtPiAtMAoreG11bDExMCBtdWx0aXBseSAtMTc2NDMuMzkgMi4wMzUyNTY4RSszMDQ4NzEzMzEgLT4gLTMuNTkwODgyOTVFKzMwNDg3MTMzNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMTAgcG93ZXIgLTE3NjQzLjM5IDIgLT4gMzExMjg5MjExIEluZXhhY3QgUm91bmRlZAoreHJlbTExMCByZW1haW5kZXIgLTE3NjQzLjM5IDIuMDM1MjU2OEUrMzA0ODcxMzMxIC0+IC0xNzY0My4zOQoreHN1YjExMCBzdWJ0cmFjdCAtMTc2NDMuMzkgMi4wMzUyNTY4RSszMDQ4NzEzMzEgLT4gLTIuMDM1MjU2ODBFKzMwNDg3MTMzMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTEgYWRkIDQ1ODk3ODUuMTYgNzQ1OS4wNDIzNyAtPiA0NTk3MjQ0LjIwIEluZXhhY3QgUm91bmRlZAoreGNvbTExMSBjb21wYXJlIDQ1ODk3ODUuMTYgNzQ1OS4wNDIzNyAtPiAxCit4ZGl2MTExIGRpdmlkZSA0NTg5Nzg1LjE2IDc0NTkuMDQyMzcgLT4gNjE1LjMzMTY5MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMTEgZGl2aWRlaW50IDQ1ODk3ODUuMTYgNzQ1OS4wNDIzNyAtPiA2MTUKK3htdWwxMTEgbXVsdGlwbHkgNDU4OTc4NS4xNiA3NDU5LjA0MjM3IC0+IDMuNDIzNTQwMjBFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzExMSBwb3dlciA0NTg5Nzg1LjE2IDc0NTkgLT4gMi4wMzc5NTI1OEUrNDk2OTAgSW5leGFjdCBSb3VuZGVkCit4cmVtMTExIHJlbWFpbmRlciA0NTg5Nzg1LjE2IDc0NTkuMDQyMzcgLT4gMjQ3NC4xMDI0NQoreHN1YjExMSBzdWJ0cmFjdCA0NTg5Nzg1LjE2IDc0NTkuMDQyMzcgLT4gNDU4MjMyNi4xMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTIgYWRkIC01MS4xNjMyMDkwRS03NTM5NjgwODIgOC45NjIwNzQ3MUUtNTg1Nzk3ODg3IC0+IDguOTYyMDc0NzFFLTU4NTc5Nzg4NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMTIgY29tcGFyZSAtNTEuMTYzMjA5MEUtNzUzOTY4MDgyIDguOTYyMDc0NzFFLTU4NTc5Nzg4NyAtPiAtMQoreGRpdjExMiBkaXZpZGUgLTUxLjE2MzIwOTBFLTc1Mzk2ODA4MiA4Ljk2MjA3NDcxRS01ODU3OTc4ODcgLT4gLTUuNzA4ODU3NjhFLTE2ODE3MDE5NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMTIgZGl2aWRlaW50IC01MS4xNjMyMDkwRS03NTM5NjgwODIgOC45NjIwNzQ3MUUtNTg1Nzk3ODg3IC0+IC0wCit4bXVsMTEyIG11bHRpcGx5IC01MS4xNjMyMDkwRS03NTM5NjgwODIgOC45NjIwNzQ3MUUtNTg1Nzk3ODg3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3cxMTIgcG93ZXIgLTUxLjE2MzIwOTBFLTc1Mzk2ODA4MiA5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xMTIgcmVtYWluZGVyIC01MS4xNjMyMDkwRS03NTM5NjgwODIgOC45NjIwNzQ3MUUtNTg1Nzk3ODg3IC0+IC01LjExNjMyMDkwRS03NTM5NjgwODEKK3hzdWIxMTIgc3VidHJhY3QgLTUxLjE2MzIwOTBFLTc1Mzk2ODA4MiA4Ljk2MjA3NDcxRS01ODU3OTc4ODcgLT4gLTguOTYyMDc0NzFFLTU4NTc5Nzg4NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMTMgYWRkIDk4Mi4yMTc4MTcgNzIyNDkwOS40RS00NTI0MzgxNiAtPiA5ODIuMjE3ODE3IEluZXhhY3QgUm91bmRlZAoreGNvbTExMyBjb21wYXJlIDk4Mi4yMTc4MTcgNzIyNDkwOS40RS00NTI0MzgxNiAtPiAxCit4ZGl2MTEzIGRpdmlkZSA5ODIuMjE3ODE3IDcyMjQ5MDkuNEUtNDUyNDM4MTYgLT4gMS4zNTk0ODgwN0UrNDUyNDM4MTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTEzIGRpdmlkZWludCA5ODIuMjE3ODE3IDcyMjQ5MDkuNEUtNDUyNDM4MTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMTMgbXVsdGlwbHkgOTgyLjIxNzgxNyA3MjI0OTA5LjRFLTQ1MjQzODE2IC0+IDcuMDk2NDM0NzRFLTQ1MjQzODA3IEluZXhhY3QgUm91bmRlZAoreHBvdzExMyBwb3dlciA5ODIuMjE3ODE3IDcgLT4gOC44MTk3MTcwOUUrMjAgSW5leGFjdCBSb3VuZGVkCit4cmVtMTEzIHJlbWFpbmRlciA5ODIuMjE3ODE3IDcyMjQ5MDkuNEUtNDUyNDM4MTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxMTMgc3VidHJhY3QgOTgyLjIxNzgxNyA3MjI0OTA5LjRFLTQ1MjQzODE2IC0+IDk4Mi4yMTc4MTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMTE0IGFkZCA1MDM3MTIwNTYuIC01NzQ5MDcwMy41RSs5MjQ4OTAxODMgLT4gLTUuNzQ5MDcwMzVFKzkyNDg5MDE5MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMTQgY29tcGFyZSA1MDM3MTIwNTYuIC01NzQ5MDcwMy41RSs5MjQ4OTAxODMgLT4gMQoreGRpdjExNCBkaXZpZGUgNTAzNzEyMDU2LiAtNTc0OTA3MDMuNUUrOTI0ODkwMTgzIC0+IC04Ljc2MTYyNjIzRS05MjQ4OTAxODMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTE0IGRpdmlkZWludCA1MDM3MTIwNTYuIC01NzQ5MDcwMy41RSs5MjQ4OTAxODMgLT4gLTAKK3htdWwxMTQgbXVsdGlwbHkgNTAzNzEyMDU2LiAtNTc0OTA3MDMuNUUrOTI0ODkwMTgzIC0+IC0yLjg5NTg3NjA1RSs5MjQ4OTAxOTkgSW5leGFjdCBSb3VuZGVkCit4cG93MTE0IHBvd2VyIDUwMzcxMjA1Ni4gLTYgLT4gNi4xMjIxNzc2NEUtNTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMTE0IHJlbWFpbmRlciA1MDM3MTIwNTYuIC01NzQ5MDcwMy41RSs5MjQ4OTAxODMgLT4gNTAzNzEyMDU2Cit4c3ViMTE0IHN1YnRyYWN0IDUwMzcxMjA1Ni4gLTU3NDkwNzAzLjVFKzkyNDg5MDE4MyAtPiA1Ljc0OTA3MDM1RSs5MjQ4OTAxOTAgSW5leGFjdCBSb3VuZGVkCit4YWRkMTE1IGFkZCA4ODMuODQ5MjIzIDI0OTI1OTE3MSAtPiAyNDkyNjAwNTUgSW5leGFjdCBSb3VuZGVkCit4Y29tMTE1IGNvbXBhcmUgODgzLjg0OTIyMyAyNDkyNTkxNzEgLT4gLTEKK3hkaXYxMTUgZGl2aWRlIDg4My44NDkyMjMgMjQ5MjU5MTcxIC0+IDAuMDAwMDAzNTQ1OTA0NTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTE1IGRpdmlkZWludCA4ODMuODQ5MjIzIDI0OTI1OTE3MSAtPiAwCit4bXVsMTE1IG11bHRpcGx5IDg4My44NDkyMjMgMjQ5MjU5MTcxIC0+IDIuMjAzMDc1MjVFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzExNSBwb3dlciA4ODMuODQ5MjIzIDI0OTI1OTE3MSAtPiA1LjE1NjQyODQ0RSs3MzQ0MTE3ODMgSW5leGFjdCBSb3VuZGVkCit4cmVtMTE1IHJlbWFpbmRlciA4ODMuODQ5MjIzIDI0OTI1OTE3MSAtPiA4ODMuODQ5MjIzCit4c3ViMTE1IHN1YnRyYWN0IDg4My44NDkyMjMgMjQ5MjU5MTcxIC0+IC0yNDkyNTgyODcgSW5leGFjdCBSb3VuZGVkCit4YWRkMTE2IGFkZCAyNDUuMDkyODUzRSs4NzI2NDI4NzQgODI4MTk1LjE1MkUrNDE5NzcxNTMyIC0+IDIuNDUwOTI4NTNFKzg3MjY0Mjg3NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMTYgY29tcGFyZSAyNDUuMDkyODUzRSs4NzI2NDI4NzQgODI4MTk1LjE1MkUrNDE5NzcxNTMyIC0+IDEKK3hkaXYxMTYgZGl2aWRlIDI0NS4wOTI4NTNFKzg3MjY0Mjg3NCA4MjgxOTUuMTUyRSs0MTk3NzE1MzIgLT4gMi45NTkzNjExMkUrNDUyODcxMzM4IEluZXhhY3QgUm91bmRlZAoreGR2aTExNiBkaXZpZGVpbnQgMjQ1LjA5Mjg1M0UrODcyNjQyODc0IDgyODE5NS4xNTJFKzQxOTc3MTUzMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDExNiBtdWx0aXBseSAyNDUuMDkyODUzRSs4NzI2NDI4NzQgODI4MTk1LjE1MkUrNDE5NzcxNTMyIC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzExNiBwb3dlciAyNDUuMDkyODUzRSs4NzI2NDI4NzQgOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTYgcmVtYWluZGVyIDI0NS4wOTI4NTNFKzg3MjY0Mjg3NCA4MjgxOTUuMTUyRSs0MTk3NzE1MzIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxMTYgc3VidHJhY3QgMjQ1LjA5Mjg1M0UrODcyNjQyODc0IDgyODE5NS4xNTJFKzQxOTc3MTUzMiAtPiAyLjQ1MDkyODUzRSs4NzI2NDI4NzYgSW5leGFjdCBSb3VuZGVkCit4YWRkMTE3IGFkZCAtODM2NTg2MzguNkUrNzI4NTUxOTI4IDI5NTI0NzguNDIgLT4gLTguMzY1ODYzODZFKzcyODU1MTkzNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMTcgY29tcGFyZSAtODM2NTg2MzguNkUrNzI4NTUxOTI4IDI5NTI0NzguNDIgLT4gLTEKK3hkaXYxMTcgZGl2aWRlIC04MzY1ODYzOC42RSs3Mjg1NTE5MjggMjk1MjQ3OC40MiAtPiAtMi44MzM1MDU1MUUrNzI4NTUxOTI5IEluZXhhY3QgUm91bmRlZAoreGR2aTExNyBkaXZpZGVpbnQgLTgzNjU4NjM4LjZFKzcyODU1MTkyOCAyOTUyNDc4LjQyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTE3IG11bHRpcGx5IC04MzY1ODYzOC42RSs3Mjg1NTE5MjggMjk1MjQ3OC40MiAtPiAtMi40NzAwMDMyNUUrNzI4NTUxOTQyIEluZXhhY3QgUm91bmRlZAoreHBvdzExNyBwb3dlciAtODM2NTg2MzguNkUrNzI4NTUxOTI4IDI5NTI0NzggLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTE3IHJlbWFpbmRlciAtODM2NTg2MzguNkUrNzI4NTUxOTI4IDI5NTI0NzguNDIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxMTcgc3VidHJhY3QgLTgzNjU4NjM4LjZFKzcyODU1MTkyOCAyOTUyNDc4LjQyIC0+IC04LjM2NTg2Mzg2RSs3Mjg1NTE5MzUgSW5leGFjdCBSb3VuZGVkCit4YWRkMTE4IGFkZCAtNjI5MTc4MC45NyAyNjk5NjcuMzk0RS0yMjAwMDgxNyAtPiAtNjI5MTc4MC45NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMTggY29tcGFyZSAtNjI5MTc4MC45NyAyNjk5NjcuMzk0RS0yMjAwMDgxNyAtPiAtMQoreGRpdjExOCBkaXZpZGUgLTYyOTE3ODAuOTcgMjY5OTY3LjM5NEUtMjIwMDA4MTcgLT4gLTIuMzMwNTcwNjlFKzIyMDAwODE4IEluZXhhY3QgUm91bmRlZAoreGR2aTExOCBkaXZpZGVpbnQgLTYyOTE3ODAuOTcgMjY5OTY3LjM5NEUtMjIwMDA4MTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMTggbXVsdGlwbHkgLTYyOTE3ODAuOTcgMjY5OTY3LjM5NEUtMjIwMDA4MTcgLT4gLTEuNjk4NTc1NzFFLTIyMDAwODA1IEluZXhhY3QgUm91bmRlZAoreHBvdzExOCBwb3dlciAtNjI5MTc4MC45NyAzIC0+IC0yLjQ5MDY5NjM2RSsyMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMTggcmVtYWluZGVyIC02MjkxNzgwLjk3IDI2OTk2Ny4zOTRFLTIyMDAwODE3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTE4IHN1YnRyYWN0IC02MjkxNzgwLjk3IDI2OTk2Ny4zOTRFLTIyMDAwODE3IC0+IC02MjkxNzgwLjk3IEluZXhhY3QgUm91bmRlZAoreGFkZDExOSBhZGQgOTc4NTcxMzQ4LkUrMjIyMzgyNTQ3IDYwMDYuMTkzNzAgLT4gOS43ODU3MTM0OEUrMjIyMzgyNTU1IEluZXhhY3QgUm91bmRlZAoreGNvbTExOSBjb21wYXJlIDk3ODU3MTM0OC5FKzIyMjM4MjU0NyA2MDA2LjE5MzcwIC0+IDEKK3hkaXYxMTkgZGl2aWRlIDk3ODU3MTM0OC5FKzIyMjM4MjU0NyA2MDA2LjE5MzcwIC0+IDEuNjI5MjcwMzhFKzIyMjM4MjU1MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMTkgZGl2aWRlaW50IDk3ODU3MTM0OC5FKzIyMjM4MjU0NyA2MDA2LjE5MzcwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTE5IG11bHRpcGx5IDk3ODU3MTM0OC5FKzIyMjM4MjU0NyA2MDA2LjE5MzcwIC0+IDUuODc3NDg5MDdFKzIyMjM4MjU1OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMTkgcG93ZXIgOTc4NTcxMzQ4LkUrMjIyMzgyNTQ3IDYwMDYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTE5IHJlbWFpbmRlciA5Nzg1NzEzNDguRSsyMjIzODI1NDcgNjAwNi4xOTM3MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjExOSBzdWJ0cmFjdCA5Nzg1NzEzNDguRSsyMjIzODI1NDcgNjAwNi4xOTM3MCAtPiA5Ljc4NTcxMzQ4RSsyMjIzODI1NTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMTIwIGFkZCAxNDIzOTAyOS4gLTM2NTI3LjIyMjEgLT4gMTQyMDI1MDEuOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMjAgY29tcGFyZSAxNDIzOTAyOS4gLTM2NTI3LjIyMjEgLT4gMQoreGRpdjEyMCBkaXZpZGUgMTQyMzkwMjkuIC0zNjUyNy4yMjIxIC0+IC0zODkuODE5NjUyIEluZXhhY3QgUm91bmRlZAoreGR2aTEyMCBkaXZpZGVpbnQgMTQyMzkwMjkuIC0zNjUyNy4yMjIxIC0+IC0zODkKK3htdWwxMjAgbXVsdGlwbHkgMTQyMzkwMjkuIC0zNjUyNy4yMjIxIC0+IC01LjIwMTEyMTc1RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMjAgcG93ZXIgMTQyMzkwMjkuIC0zNjUyNyAtPiA2LjY0MjkyNzMxRS0yNjEyOTYgSW5leGFjdCBSb3VuZGVkCit4cmVtMTIwIHJlbWFpbmRlciAxNDIzOTAyOS4gLTM2NTI3LjIyMjEgLT4gMjk5MzkuNjAzMQoreHN1YjEyMCBzdWJ0cmFjdCAxNDIzOTAyOS4gLTM2NTI3LjIyMjEgLT4gMTQyNzU1NTYuMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjEgYWRkIDcyMzMzLjI2NTRFLTU0NDQyNTU0OCAtNjkwLjY2NDgzNkUrNjYyMTU1MTIwIC0+IC02LjkwNjY0ODM2RSs2NjIxNTUxMjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMTIxIGNvbXBhcmUgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC02OTAuNjY0ODM2RSs2NjIxNTUxMjAgLT4gMQoreGRpdjEyMSBkaXZpZGUgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC02OTAuNjY0ODM2RSs2NjIxNTUxMjAgLT4gLTBFLTEwMDAwMDAwMDcgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAoreGR2aTEyMSBkaXZpZGVpbnQgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC02OTAuNjY0ODM2RSs2NjIxNTUxMjAgLT4gLTAKK3htdWwxMjEgbXVsdGlwbHkgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC02OTAuNjY0ODM2RSs2NjIxNTUxMjAgLT4gLTQuOTk1ODA0MjlFKzExNzcyOTU3OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMjEgcG93ZXIgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC03IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTEyMSByZW1haW5kZXIgNzIzMzMuMjY1NEUtNTQ0NDI1NTQ4IC02OTAuNjY0ODM2RSs2NjIxNTUxMjAgLT4gNy4yMzMzMjY1NEUtNTQ0NDI1NTQ0Cit4c3ViMTIxIHN1YnRyYWN0IDcyMzMzLjI2NTRFLTU0NDQyNTU0OCAtNjkwLjY2NDgzNkUrNjYyMTU1MTIwIC0+IDYuOTA2NjQ4MzZFKzY2MjE1NTEyMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjIgYWRkIC0zNzcyMS4xNTY3RS0xMTU3ODczNDEgLTgyODk0OTg2NEUtNzYyNTE3NDcgLT4gLTguMjg5NDk4NjRFLTc2MjUxNzM5IEluZXhhY3QgUm91bmRlZAoreGNvbTEyMiBjb21wYXJlIC0zNzcyMS4xNTY3RS0xMTU3ODczNDEgLTgyODk0OTg2NEUtNzYyNTE3NDcgLT4gMQoreGRpdjEyMiBkaXZpZGUgLTM3NzIxLjE1NjdFLTExNTc4NzM0MSAtODI4OTQ5ODY0RS03NjI1MTc0NyAtPiA0LjU1MDQ3NTA1RS0zOTUzNTU5OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMjIgZGl2aWRlaW50IC0zNzcyMS4xNTY3RS0xMTU3ODczNDEgLTgyODk0OTg2NEUtNzYyNTE3NDcgLT4gMAoreG11bDEyMiBtdWx0aXBseSAtMzc3MjEuMTU2N0UtMTE1Nzg3MzQxIC04Mjg5NDk4NjRFLTc2MjUxNzQ3IC0+IDMuMTI2ODk0NzdFLTE5MjAzOTA3NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMjIgcG93ZXIgLTM3NzIxLjE1NjdFLTExNTc4NzM0MSAtOCAtPiAyLjQzOTYwNzY1RSs5MjYyOTg2OTEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTIyIHJlbWFpbmRlciAtMzc3MjEuMTU2N0UtMTE1Nzg3MzQxIC04Mjg5NDk4NjRFLTc2MjUxNzQ3IC0+IC0zLjc3MjExNTY3RS0xMTU3ODczMzcKK3hzdWIxMjIgc3VidHJhY3QgLTM3NzIxLjE1NjdFLTExNTc4NzM0MSAtODI4OTQ5ODY0RS03NjI1MTc0NyAtPiA4LjI4OTQ5ODY0RS03NjI1MTczOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjMgYWRkIC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTExOTc3OTg1OC5FKzczNDY2NTQ2MSAtPiAtMS4xOTc3OTg1OEUrNzM0NjY1NDY5IEluZXhhY3QgUm91bmRlZAoreGNvbTEyMyBjb21wYXJlIC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTExOTc3OTg1OC5FKzczNDY2NTQ2MSAtPiAxCit4ZGl2MTIzIGRpdmlkZSAtMjA3ODg1Mi44M0UtNjQ3MDgwMDg5IC0xMTk3Nzk4NTguRSs3MzQ2NjU0NjEgLT4gMEUtMTAwMDAwMDAwNyBJbmV4YWN0IFJvdW5kZWQgVW5kZXJmbG93IFN1Ym5vcm1hbCBDbGFtcGVkCit4ZHZpMTIzIGRpdmlkZWludCAtMjA3ODg1Mi44M0UtNjQ3MDgwMDg5IC0xMTk3Nzk4NTguRSs3MzQ2NjU0NjEgLT4gMAoreG11bDEyMyBtdWx0aXBseSAtMjA3ODg1Mi44M0UtNjQ3MDgwMDg5IC0xMTk3Nzk4NTguRSs3MzQ2NjU0NjEgLT4gMi40OTAwNDY5N0UrODc1ODUzODYgSW5leGFjdCBSb3VuZGVkCit4cG93MTIzIHBvd2VyIC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTEgLT4gLTQuODEwMzQ1MzNFKzY0NzA4MDA4MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMjMgcmVtYWluZGVyIC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTExOTc3OTg1OC5FKzczNDY2NTQ2MSAtPiAtMi4wNzg4NTI4M0UtNjQ3MDgwMDgzCit4c3ViMTIzIHN1YnRyYWN0IC0yMDc4ODUyLjgzRS02NDcwODAwODkgLTExOTc3OTg1OC5FKzczNDY2NTQ2MSAtPiAxLjE5Nzc5ODU4RSs3MzQ2NjU0NjkgSW5leGFjdCBSb3VuZGVkCit4YWRkMTI0IGFkZCAtNzkxNDUuMzYyNSAtNzcxOC41NzMwNyAtPiAtODY4NjMuOTM1NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMjQgY29tcGFyZSAtNzkxNDUuMzYyNSAtNzcxOC41NzMwNyAtPiAtMQoreGRpdjEyNCBkaXZpZGUgLTc5MTQ1LjM2MjUgLTc3MTguNTczMDcgLT4gMTAuMjUzODg1MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMjQgZGl2aWRlaW50IC03OTE0NS4zNjI1IC03NzE4LjU3MzA3IC0+IDEwCit4bXVsMTI0IG11bHRpcGx5IC03OTE0NS4zNjI1IC03NzE4LjU3MzA3IC0+IDYxMDg4OTI2NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMjQgcG93ZXIgLTc5MTQ1LjM2MjUgLTc3MTkgLT4gLTEuMTMxODE5NDFFLTM3ODExIEluZXhhY3QgUm91bmRlZAoreHJlbTEyNCByZW1haW5kZXIgLTc5MTQ1LjM2MjUgLTc3MTguNTczMDcgLT4gLTE5NTkuNjMxODAKK3hzdWIxMjQgc3VidHJhY3QgLTc5MTQ1LjM2MjUgLTc3MTguNTczMDcgLT4gLTcxNDI2Ljc4OTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMTI1IGFkZCAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQuMzAxNyAtPiAyLjEwMzg5MDQ5RSs5NTkyNDcyNDMgSW5leGFjdCBSb3VuZGVkCit4Y29tMTI1IGNvbXBhcmUgMjEwMzg5MC40OUUrOTU5MjQ3MjM3IDIwMDI0LjMwMTcgLT4gMQoreGRpdjEyNSBkaXZpZGUgMjEwMzg5MC40OUUrOTU5MjQ3MjM3IDIwMDI0LjMwMTcgLT4gMS4wNTA2Njg1OUUrOTU5MjQ3MjM5IEluZXhhY3QgUm91bmRlZAoreGR2aTEyNSBkaXZpZGVpbnQgMjEwMzg5MC40OUUrOTU5MjQ3MjM3IDIwMDI0LjMwMTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMjUgbXVsdGlwbHkgMjEwMzg5MC40OUUrOTU5MjQ3MjM3IDIwMDI0LjMwMTcgLT4gNC4yMTI4OTM3OUUrOTU5MjQ3MjQ3IEluZXhhY3QgUm91bmRlZAoreHBvdzEyNSBwb3dlciAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTI1IHJlbWFpbmRlciAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQuMzAxNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjEyNSBzdWJ0cmFjdCAyMTAzODkwLjQ5RSs5NTkyNDcyMzcgMjAwMjQuMzAxNyAtPiAyLjEwMzg5MDQ5RSs5NTkyNDcyNDMgSW5leGFjdCBSb3VuZGVkCit4YWRkMTI2IGFkZCA5MTEyNDk1NTcgNzk4MTA4MDQuOSAtPiA5OTEwNjAzNjIgSW5leGFjdCBSb3VuZGVkCit4Y29tMTI2IGNvbXBhcmUgOTExMjQ5NTU3IDc5ODEwODA0LjkgLT4gMQoreGRpdjEyNiBkaXZpZGUgOTExMjQ5NTU3IDc5ODEwODA0LjkgLT4gMTEuNDE3NjIxNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMjYgZGl2aWRlaW50IDkxMTI0OTU1NyA3OTgxMDgwNC45IC0+IDExCit4bXVsMTI2IG11bHRpcGx5IDkxMTI0OTU1NyA3OTgxMDgwNC45IC0+IDcuMjcyNzU2MDZFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzEyNiBwb3dlciA5MTEyNDk1NTcgNzk4MTA4MDUgLT4gNi43NzU5NTc0MUUrNzE1MDc1ODY3IEluZXhhY3QgUm91bmRlZAoreHJlbTEyNiByZW1haW5kZXIgOTExMjQ5NTU3IDc5ODEwODA0LjkgLT4gMzMzMzA3MDMuMQoreHN1YjEyNiBzdWJ0cmFjdCA5MTEyNDk1NTcgNzk4MTA4MDQuOSAtPiA4MzE0Mzg3NTIgSW5leGFjdCBSb3VuZGVkCit4YWRkMTI3IGFkZCAzNDExMzQuOTk0IDMuMzc0ODYyOTIgLT4gMzQxMTM4LjM2OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMjcgY29tcGFyZSAzNDExMzQuOTk0IDMuMzc0ODYyOTIgLT4gMQoreGRpdjEyNyBkaXZpZGUgMzQxMTM0Ljk5NCAzLjM3NDg2MjkyIC0+IDEwMTA4MS4xNDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTI3IGRpdmlkZWludCAzNDExMzQuOTk0IDMuMzc0ODYyOTIgLT4gMTAxMDgxCit4bXVsMTI3IG11bHRpcGx5IDM0MTEzNC45OTQgMy4zNzQ4NjI5MiAtPiAxMTUxMjgzLjg0IEluZXhhY3QgUm91bmRlZAoreHBvdzEyNyBwb3dlciAzNDExMzQuOTk0IDMgLT4gMy45Njk4OTMxNEUrMTYgSW5leGFjdCBSb3VuZGVkCit4cmVtMTI3IHJlbWFpbmRlciAzNDExMzQuOTk0IDMuMzc0ODYyOTIgLT4gMC40NzUxODM0OAoreHN1YjEyNyBzdWJ0cmFjdCAzNDExMzQuOTk0IDMuMzc0ODYyOTIgLT4gMzQxMTMxLjYxOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMjggYWRkIDI0NC4yMzYzNCA1MTI3MDYxOTBFLTM0MTQ1OTgzNiAtPiAyNDQuMjM2MzQwIEluZXhhY3QgUm91bmRlZAoreGNvbTEyOCBjb21wYXJlIDI0NC4yMzYzNCA1MTI3MDYxOTBFLTM0MTQ1OTgzNiAtPiAxCit4ZGl2MTI4IGRpdmlkZSAyNDQuMjM2MzQgNTEyNzA2MTkwRS0zNDE0NTk4MzYgLT4gNC43NjM2NzA1OUUrMzQxNDU5ODI5IEluZXhhY3QgUm91bmRlZAoreGR2aTEyOCBkaXZpZGVpbnQgMjQ0LjIzNjM0IDUxMjcwNjE5MEUtMzQxNDU5ODM2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTI4IG11bHRpcGx5IDI0NC4yMzYzNCA1MTI3MDYxOTBFLTM0MTQ1OTgzNiAtPiAxLjI1MjIxNDgzRS0zNDE0NTk4MjUgSW5leGFjdCBSb3VuZGVkCit4cG93MTI4IHBvd2VyIDI0NC4yMzYzNCA1IC0+IDguNjkwNjMzMTJFKzExIEluZXhhY3QgUm91bmRlZAoreHJlbTEyOCByZW1haW5kZXIgMjQ0LjIzNjM0IDUxMjcwNjE5MEUtMzQxNDU5ODM2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTI4IHN1YnRyYWN0IDI0NC4yMzYzNCA1MTI3MDYxOTBFLTM0MTQ1OTgzNiAtPiAyNDQuMjM2MzQwIEluZXhhY3QgUm91bmRlZAoreGFkZDEyOSBhZGQgLTkuMjI3ODM4NDlFKzE3MTU4NTk1NCAtOTkuMDk0NjgwMCAtPiAtOS4yMjc4Mzg0OUUrMTcxNTg1OTU0IEluZXhhY3QgUm91bmRlZAoreGNvbTEyOSBjb21wYXJlIC05LjIyNzgzODQ5RSsxNzE1ODU5NTQgLTk5LjA5NDY4MDAgLT4gLTEKK3hkaXYxMjkgZGl2aWRlIC05LjIyNzgzODQ5RSsxNzE1ODU5NTQgLTk5LjA5NDY4MDAgLT4gOS4zMTIxNDMxOEUrMTcxNTg1OTUyIEluZXhhY3QgUm91bmRlZAoreGR2aTEyOSBkaXZpZGVpbnQgLTkuMjI3ODM4NDlFKzE3MTU4NTk1NCAtOTkuMDk0NjgwMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDEyOSBtdWx0aXBseSAtOS4yMjc4Mzg0OUUrMTcxNTg1OTU0IC05OS4wOTQ2ODAwIC0+IDkuMTQ0Mjk3MDJFKzE3MTU4NTk1NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMjkgcG93ZXIgLTkuMjI3ODM4NDlFKzE3MTU4NTk1NCAtOTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTEyOSByZW1haW5kZXIgLTkuMjI3ODM4NDlFKzE3MTU4NTk1NCAtOTkuMDk0NjgwMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjEyOSBzdWJ0cmFjdCAtOS4yMjc4Mzg0OUUrMTcxNTg1OTU0IC05OS4wOTQ2ODAwIC0+IC05LjIyNzgzODQ5RSsxNzE1ODU5NTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMTMwIGFkZCA2OTk2MzEuODkzIC0yMjYuNDIzOTU4IC0+IDY5OTQwNS40NjkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTMwIGNvbXBhcmUgNjk5NjMxLjg5MyAtMjI2LjQyMzk1OCAtPiAxCit4ZGl2MTMwIGRpdmlkZSA2OTk2MzEuODkzIC0yMjYuNDIzOTU4IC0+IC0zMDg5LjkxOTkwIEluZXhhY3QgUm91bmRlZAoreGR2aTEzMCBkaXZpZGVpbnQgNjk5NjMxLjg5MyAtMjI2LjQyMzk1OCAtPiAtMzA4OQoreG11bDEzMCBtdWx0aXBseSA2OTk2MzEuODkzIC0yMjYuNDIzOTU4IC0+IC0xNTg0MTM0MjIgSW5leGFjdCBSb3VuZGVkCit4cG93MTMwIHBvd2VyIDY5OTYzMS44OTMgLTIyNiAtPiAxLjE0Njc1NTExRS0xMzIxIEluZXhhY3QgUm91bmRlZAoreHJlbTEzMCByZW1haW5kZXIgNjk5NjMxLjg5MyAtMjI2LjQyMzk1OCAtPiAyMDguMjg2NzM4Cit4c3ViMTMwIHN1YnRyYWN0IDY5OTYzMS44OTMgLTIyNi40MjM5NTggLT4gNjk5ODU4LjMxNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzEgYWRkIC0yNDkzNTAxMzkuRS01NzE3OTM2NzMgNzc1NzMyNDI4LiAtPiA3NzU3MzI0MjggSW5leGFjdCBSb3VuZGVkCit4Y29tMTMxIGNvbXBhcmUgLTI0OTM1MDEzOS5FLTU3MTc5MzY3MyA3NzU3MzI0MjguIC0+IC0xCit4ZGl2MTMxIGRpdmlkZSAtMjQ5MzUwMTM5LkUtNTcxNzkzNjczIDc3NTczMjQyOC4gLT4gLTMuMjE0MzgzMzRFLTU3MTc5MzY3NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMzEgZGl2aWRlaW50IC0yNDkzNTAxMzkuRS01NzE3OTM2NzMgNzc1NzMyNDI4LiAtPiAtMAoreG11bDEzMSBtdWx0aXBseSAtMjQ5MzUwMTM5LkUtNTcxNzkzNjczIDc3NTczMjQyOC4gLT4gLTEuOTM0Mjg5ODlFLTU3MTc5MzY1NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzEgcG93ZXIgLTI0OTM1MDEzOS5FLTU3MTc5MzY3MyA3NzU3MzI0MjggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTMxIHJlbWFpbmRlciAtMjQ5MzUwMTM5LkUtNTcxNzkzNjczIDc3NTczMjQyOC4gLT4gLTIuNDkzNTAxMzlFLTU3MTc5MzY2NQoreHN1YjEzMSBzdWJ0cmFjdCAtMjQ5MzUwMTM5LkUtNTcxNzkzNjczIDc3NTczMjQyOC4gLT4gLTc3NTczMjQyOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzIgYWRkIDUuMTE2MjkwMjAgLTQ4MC41MzE5NCAtPiAtNDc1LjQxNTY1MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzIgY29tcGFyZSA1LjExNjI5MDIwIC00ODAuNTMxOTQgLT4gMQoreGRpdjEzMiBkaXZpZGUgNS4xMTYyOTAyMCAtNDgwLjUzMTk0IC0+IC0wLjAxMDY0NzEzODcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTMyIGRpdmlkZWludCA1LjExNjI5MDIwIC00ODAuNTMxOTQgLT4gLTAKK3htdWwxMzIgbXVsdGlwbHkgNS4xMTYyOTAyMCAtNDgwLjUzMTk0IC0+IC0yNDU4LjU0MDg2IEluZXhhY3QgUm91bmRlZAoreHBvdzEzMiBwb3dlciA1LjExNjI5MDIwIC00ODEgLT4gOS44MzAyMTk1MUUtMzQyIEluZXhhY3QgUm91bmRlZAoreHJlbTEzMiByZW1haW5kZXIgNS4xMTYyOTAyMCAtNDgwLjUzMTk0IC0+IDUuMTE2MjkwMjAKK3hzdWIxMzIgc3VidHJhY3QgNS4xMTYyOTAyMCAtNDgwLjUzMTk0IC0+IDQ4NS42NDgyMzAgSW5leGFjdCBSb3VuZGVkCit4YWRkMTMzIGFkZCAtOC4yMzM1MjY3M0UtNDQ2NzIzMTQ3IC01MzA3MTAuODY2IC0+IC01MzA3MTAuODY2IEluZXhhY3QgUm91bmRlZAoreGNvbTEzMyBjb21wYXJlIC04LjIzMzUyNjczRS00NDY3MjMxNDcgLTUzMDcxMC44NjYgLT4gMQoreGRpdjEzMyBkaXZpZGUgLTguMjMzNTI2NzNFLTQ0NjcyMzE0NyAtNTMwNzEwLjg2NiAtPiAxLjU1MTQxNDc2RS00NDY3MjMxNTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTMzIGRpdmlkZWludCAtOC4yMzM1MjY3M0UtNDQ2NzIzMTQ3IC01MzA3MTAuODY2IC0+IDAKK3htdWwxMzMgbXVsdGlwbHkgLTguMjMzNTI2NzNFLTQ0NjcyMzE0NyAtNTMwNzEwLjg2NiAtPiA0LjM2OTYyMjEwRS00NDY3MjMxNDEgSW5leGFjdCBSb3VuZGVkCit4cG93MTMzIHBvd2VyIC04LjIzMzUyNjczRS00NDY3MjMxNDcgLTUzMDcxMSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTMzIHJlbWFpbmRlciAtOC4yMzM1MjY3M0UtNDQ2NzIzMTQ3IC01MzA3MTAuODY2IC0+IC04LjIzMzUyNjczRS00NDY3MjMxNDcKK3hzdWIxMzMgc3VidHJhY3QgLTguMjMzNTI2NzNFLTQ0NjcyMzE0NyAtNTMwNzEwLjg2NiAtPiA1MzA3MTAuODY2IEluZXhhY3QgUm91bmRlZAoreGFkZDEzNCBhZGQgNy4wNTk4NjA4IC05NTkwOC4zNSAtPiAtOTU5MDEuMjkwMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzQgY29tcGFyZSA3LjA1OTg2MDggLTk1OTA4LjM1IC0+IDEKK3hkaXYxMzQgZGl2aWRlIDcuMDU5ODYwOCAtOTU5MDguMzUgLT4gLTAuMDAwMDczNjEwNDkxNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMzQgZGl2aWRlaW50IDcuMDU5ODYwOCAtOTU5MDguMzUgLT4gLTAKK3htdWwxMzQgbXVsdGlwbHkgNy4wNTk4NjA4IC05NTkwOC4zNSAtPiAtNjc3MDk5LjYwMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzQgcG93ZXIgNy4wNTk4NjA4IC05NTkwOCAtPiA0LjU3MDczODc3RS04MTQwNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMzQgcmVtYWluZGVyIDcuMDU5ODYwOCAtOTU5MDguMzUgLT4gNy4wNTk4NjA4Cit4c3ViMTM0IHN1YnRyYWN0IDcuMDU5ODYwOCAtOTU5MDguMzUgLT4gOTU5MTUuNDA5OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzUgYWRkIC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYgMTUzMi43MTg0N0UrNTA5OTQ0MzM1IC0+IDEuNTMyNzE4NDdFKzUwOTk0NDMzOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzUgY29tcGFyZSAtNy45MTE4OTg0NUUrMjA3MjAyNzA2IDE1MzIuNzE4NDdFKzUwOTk0NDMzNSAtPiAtMQoreGRpdjEzNSBkaXZpZGUgLTcuOTExODk4NDVFKzIwNzIwMjcwNiAxNTMyLjcxODQ3RSs1MDk5NDQzMzUgLT4gLTUuMTYyMDAzNzJFLTMwMjc0MTYzMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMzUgZGl2aWRlaW50IC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYgMTUzMi43MTg0N0UrNTA5OTQ0MzM1IC0+IC0wCit4bXVsMTM1IG11bHRpcGx5IC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYgMTUzMi43MTg0N0UrNTA5OTQ0MzM1IC0+IC0xLjIxMjY3MTI5RSs3MTcxNDcwNDUgSW5leGFjdCBSb3VuZGVkCit4cG93MTM1IHBvd2VyIC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYgMiAtPiA2LjI1OTgxMzcxRSs0MTQ0MDU0MTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMTM1IHJlbWFpbmRlciAtNy45MTE4OTg0NUUrMjA3MjAyNzA2IDE1MzIuNzE4NDdFKzUwOTk0NDMzNSAtPiAtNy45MTE4OTg0NUUrMjA3MjAyNzA2Cit4c3ViMTM1IHN1YnRyYWN0IC03LjkxMTg5ODQ1RSsyMDcyMDI3MDYgMTUzMi43MTg0N0UrNTA5OTQ0MzM1IC0+IC0xLjUzMjcxODQ3RSs1MDk5NDQzMzggSW5leGFjdCBSb3VuZGVkCit4YWRkMTM2IGFkZCAyMDg4MzkzNzAuRS0yMTUxNDc0MzIgLTc1Ljk0MjA1NTkgLT4gLTc1Ljk0MjA1NTkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTM2IGNvbXBhcmUgMjA4ODM5MzcwLkUtMjE1MTQ3NDMyIC03NS45NDIwNTU5IC0+IDEKK3hkaXYxMzYgZGl2aWRlIDIwODgzOTM3MC5FLTIxNTE0NzQzMiAtNzUuOTQyMDU1OSAtPiAtMi43NDk5ODMxMEUtMjE1MTQ3NDI2IEluZXhhY3QgUm91bmRlZAoreGR2aTEzNiBkaXZpZGVpbnQgMjA4ODM5MzcwLkUtMjE1MTQ3NDMyIC03NS45NDIwNTU5IC0+IC0wCit4bXVsMTM2IG11bHRpcGx5IDIwODgzOTM3MC5FLTIxNTE0NzQzMiAtNzUuOTQyMDU1OSAtPiAtMS41ODU5NjkxMUUtMjE1MTQ3NDIyIEluZXhhY3QgUm91bmRlZAoreHBvdzEzNiBwb3dlciAyMDg4MzkzNzAuRS0yMTUxNDc0MzIgLTc2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTEzNiByZW1haW5kZXIgMjA4ODM5MzcwLkUtMjE1MTQ3NDMyIC03NS45NDIwNTU5IC0+IDIuMDg4MzkzNzBFLTIxNTE0NzQyNAoreHN1YjEzNiBzdWJ0cmFjdCAyMDg4MzkzNzAuRS0yMTUxNDc0MzIgLTc1Ljk0MjA1NTkgLT4gNzUuOTQyMDU1OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxMzcgYWRkIDQyNy43NTQyNDRFLTM1MzMyODM2OSA0NzA1LjA3OTYgLT4gNDcwNS4wNzk2MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzcgY29tcGFyZSA0MjcuNzU0MjQ0RS0zNTMzMjgzNjkgNDcwNS4wNzk2IC0+IC0xCit4ZGl2MTM3IGRpdmlkZSA0MjcuNzU0MjQ0RS0zNTMzMjgzNjkgNDcwNS4wNzk2IC0+IDkuMDkxMzI4NTNFLTM1MzMyODM3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxMzcgZGl2aWRlaW50IDQyNy43NTQyNDRFLTM1MzMyODM2OSA0NzA1LjA3OTYgLT4gMAoreG11bDEzNyBtdWx0aXBseSA0MjcuNzU0MjQ0RS0zNTMzMjgzNjkgNDcwNS4wNzk2IC0+IDIuMDEyNjE3NzdFLTM1MzMyODM2MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzcgcG93ZXIgNDI3Ljc1NDI0NEUtMzUzMzI4MzY5IDQ3MDUgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTM3IHJlbWFpbmRlciA0MjcuNzU0MjQ0RS0zNTMzMjgzNjkgNDcwNS4wNzk2IC0+IDQuMjc3NTQyNDRFLTM1MzMyODM2NworeHN1YjEzNyBzdWJ0cmFjdCA0MjcuNzU0MjQ0RS0zNTMzMjgzNjkgNDcwNS4wNzk2IC0+IC00NzA1LjA3OTYwIEluZXhhY3QgUm91bmRlZAoreGFkZDEzOCBhZGQgNDQ5MTEuMDg5IC05NS4xNzMzNjA1RS0zMTMwODE4NDggLT4gNDQ5MTEuMDg5MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzggY29tcGFyZSA0NDkxMS4wODkgLTk1LjE3MzM2MDVFLTMxMzA4MTg0OCAtPiAxCit4ZGl2MTM4IGRpdmlkZSA0NDkxMS4wODkgLTk1LjE3MzM2MDVFLTMxMzA4MTg0OCAtPiAtNC43MTg4NzE4M0UrMzEzMDgxODUwIEluZXhhY3QgUm91bmRlZAoreGR2aTEzOCBkaXZpZGVpbnQgNDQ5MTEuMDg5IC05NS4xNzMzNjA1RS0zMTMwODE4NDggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxMzggbXVsdGlwbHkgNDQ5MTEuMDg5IC05NS4xNzMzNjA1RS0zMTMwODE4NDggLT4gLTQuMjc0MzM5MjZFLTMxMzA4MTg0MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxMzggcG93ZXIgNDQ5MTEuMDg5IC0xMCAtPiAyLjk5NTQ2NDI1RS00NyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xMzggcmVtYWluZGVyIDQ0OTExLjA4OSAtOTUuMTczMzYwNUUtMzEzMDgxODQ4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTM4IHN1YnRyYWN0IDQ0OTExLjA4OSAtOTUuMTczMzYwNUUtMzEzMDgxODQ4IC0+IDQ0OTExLjA4OTAgSW5leGFjdCBSb3VuZGVkCit4YWRkMTM5IGFkZCA0NTIzNzE4MjEuIC00MTA5NzA5LjE5IC0+IDQ0ODI2MjExMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xMzkgY29tcGFyZSA0NTIzNzE4MjEuIC00MTA5NzA5LjE5IC0+IDEKK3hkaXYxMzkgZGl2aWRlIDQ1MjM3MTgyMS4gLTQxMDk3MDkuMTkgLT4gLTExMC4wNzM5MjUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTM5IGRpdmlkZWludCA0NTIzNzE4MjEuIC00MTA5NzA5LjE5IC0+IC0xMTAKK3htdWwxMzkgbXVsdGlwbHkgNDUyMzcxODIxLiAtNDEwOTcwOS4xOSAtPiAtMS44NTkxMTY2M0UrMTUgSW5leGFjdCBSb3VuZGVkCit4cG93MTM5IHBvd2VyIDQ1MjM3MTgyMS4gLTQxMDk3MDkgLT4gMS4xNTUyODgwN0UtMzU1NzE1NjggSW5leGFjdCBSb3VuZGVkCit4cmVtMTM5IHJlbWFpbmRlciA0NTIzNzE4MjEuIC00MTA5NzA5LjE5IC0+IDMwMzgxMC4xMAoreHN1YjEzOSBzdWJ0cmFjdCA0NTIzNzE4MjEuIC00MTA5NzA5LjE5IC0+IDQ1NjQ4MTUzMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNDAgYWRkIDk0MDA3LjQzOTIgLTk0Njc3MjUuNUUrNjgxODk4MjM0IC0+IC05LjQ2NzcyNTUwRSs2ODE4OTgyNDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMTQwIGNvbXBhcmUgOTQwMDcuNDM5MiAtOTQ2NzcyNS41RSs2ODE4OTgyMzQgLT4gMQoreGRpdjE0MCBkaXZpZGUgOTQwMDcuNDM5MiAtOTQ2NzcyNS41RSs2ODE4OTgyMzQgLT4gLTkuOTI5MjUyNzJFLTY4MTg5ODIzNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDAgZGl2aWRlaW50IDk0MDA3LjQzOTIgLTk0Njc3MjUuNUUrNjgxODk4MjM0IC0+IC0wCit4bXVsMTQwIG11bHRpcGx5IDk0MDA3LjQzOTIgLTk0Njc3MjUuNUUrNjgxODk4MjM0IC0+IC04LjkwMDM2NjI5RSs2ODE4OTgyNDUgSW5leGFjdCBSb3VuZGVkCit4cG93MTQwIHBvd2VyIDk0MDA3LjQzOTIgLTkgLT4gMS43NDM5NzM5N0UtNDUgSW5leGFjdCBSb3VuZGVkCit4cmVtMTQwIHJlbWFpbmRlciA5NDAwNy40MzkyIC05NDY3NzI1LjVFKzY4MTg5ODIzNCAtPiA5NDAwNy40MzkyCit4c3ViMTQwIHN1YnRyYWN0IDk0MDA3LjQzOTIgLTk0Njc3MjUuNUUrNjgxODk4MjM0IC0+IDkuNDY3NzI1NTBFKzY4MTg5ODI0MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNDEgYWRkIDk5MTQ3NTU0LjBFLTc1MTQxMDU4NiAzODMxMy42NDIzIC0+IDM4MzEzLjY0MjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMTQxIGNvbXBhcmUgOTkxNDc1NTQuMEUtNzUxNDEwNTg2IDM4MzEzLjY0MjMgLT4gLTEKK3hkaXYxNDEgZGl2aWRlIDk5MTQ3NTU0LjBFLTc1MTQxMDU4NiAzODMxMy42NDIzIC0+IDIuNTg3Nzg3MjJFLTc1MTQxMDU4MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDEgZGl2aWRlaW50IDk5MTQ3NTU0LjBFLTc1MTQxMDU4NiAzODMxMy42NDIzIC0+IDAKK3htdWwxNDEgbXVsdGlwbHkgOTkxNDc1NTQuMEUtNzUxNDEwNTg2IDM4MzEzLjY0MjMgLT4gMy43OTg3MDM5MkUtNzUxNDEwNTc0IEluZXhhY3QgUm91bmRlZAoreHBvdzE0MSBwb3dlciA5OTE0NzU1NC4wRS03NTE0MTA1ODYgMzgzMTQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTQxIHJlbWFpbmRlciA5OTE0NzU1NC4wRS03NTE0MTA1ODYgMzgzMTMuNjQyMyAtPiA5LjkxNDc1NTQwRS03NTE0MTA1NzkKK3hzdWIxNDEgc3VidHJhY3QgOTkxNDc1NTQuMEUtNzUxNDEwNTg2IDM4MzEzLjY0MjMgLT4gLTM4MzEzLjY0MjMgSW5leGFjdCBSb3VuZGVkCit4YWRkMTQyIGFkZCAtNzkxOS4zMDI1NCAtNjY5LjYwNzg1NCAtPiAtODU4OC45MTAzOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDIgY29tcGFyZSAtNzkxOS4zMDI1NCAtNjY5LjYwNzg1NCAtPiAtMQoreGRpdjE0MiBkaXZpZGUgLTc5MTkuMzAyNTQgLTY2OS42MDc4NTQgLT4gMTEuODI2Nzc2NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDIgZGl2aWRlaW50IC03OTE5LjMwMjU0IC02NjkuNjA3ODU0IC0+IDExCit4bXVsMTQyIG11bHRpcGx5IC03OTE5LjMwMjU0IC02NjkuNjA3ODU0IC0+IDUzMDI4MjcuMTggSW5leGFjdCBSb3VuZGVkCit4cG93MTQyIHBvd2VyIC03OTE5LjMwMjU0IC02NzAgLT4gNy41ODE0NzcyNEUtMjYxMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNDIgcmVtYWluZGVyIC03OTE5LjMwMjU0IC02NjkuNjA3ODU0IC0+IC01NTMuNjE2MTQ2Cit4c3ViMTQyIHN1YnRyYWN0IC03OTE5LjMwMjU0IC02NjkuNjA3ODU0IC0+IC03MjQ5LjY5NDY5IEluZXhhY3QgUm91bmRlZAoreGFkZDE0MyBhZGQgNDYxLjU4MjgwRSsxMzYxMTA4MjEgNzEwNjY2MDUyLkUtMzgzNzU0MjMxIC0+IDQuNjE1ODI4MDBFKzEzNjExMDgyMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDMgY29tcGFyZSA0NjEuNTgyODBFKzEzNjExMDgyMSA3MTA2NjYwNTIuRS0zODM3NTQyMzEgLT4gMQoreGRpdjE0MyBkaXZpZGUgNDYxLjU4MjgwRSsxMzYxMTA4MjEgNzEwNjY2MDUyLkUtMzgzNzU0MjMxIC0+IDYuNDk1MDczMTZFKzUxOTg2NTA0NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDMgZGl2aWRlaW50IDQ2MS41ODI4MEUrMTM2MTEwODIxIDcxMDY2NjA1Mi5FLTM4Mzc1NDIzMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE0MyBtdWx0aXBseSA0NjEuNTgyODBFKzEzNjExMDgyMSA3MTA2NjYwNTIuRS0zODM3NTQyMzEgLT4gMy4yODAzMTIyNkUtMjQ3NjQzMzk5IEluZXhhY3QgUm91bmRlZAoreHBvdzE0MyBwb3dlciA0NjEuNTgyODBFKzEzNjExMDgyMSA3IC0+IDQuNDY0MjM3ODFFKzk1Mjc3NTc2NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNDMgcmVtYWluZGVyIDQ2MS41ODI4MEUrMTM2MTEwODIxIDcxMDY2NjA1Mi5FLTM4Mzc1NDIzMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE0MyBzdWJ0cmFjdCA0NjEuNTgyODBFKzEzNjExMDgyMSA3MTA2NjYwNTIuRS0zODM3NTQyMzEgLT4gNC42MTU4MjgwMEUrMTM2MTEwODIzIEluZXhhY3QgUm91bmRlZAoreGFkZDE0NCBhZGQgMzQ1NTc1NS40N0UtMTEyNDY1NTA2IDc3MS42NzQzMDYgLT4gNzcxLjY3NDMwNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDQgY29tcGFyZSAzNDU1NzU1LjQ3RS0xMTI0NjU1MDYgNzcxLjY3NDMwNiAtPiAtMQoreGRpdjE0NCBkaXZpZGUgMzQ1NTc1NS40N0UtMTEyNDY1NTA2IDc3MS42NzQzMDYgLT4gNC40NzgyNTY0OUUtMTEyNDY1NTAzIEluZXhhY3QgUm91bmRlZAoreGR2aTE0NCBkaXZpZGVpbnQgMzQ1NTc1NS40N0UtMTEyNDY1NTA2IDc3MS42NzQzMDYgLT4gMAoreG11bDE0NCBtdWx0aXBseSAzNDU1NzU1LjQ3RS0xMTI0NjU1MDYgNzcxLjY3NDMwNiAtPiAyLjY2NjcxNzcwRS0xMTI0NjU0OTcgSW5leGFjdCBSb3VuZGVkCit4cG93MTQ0IHBvd2VyIDM0NTU3NTUuNDdFLTExMjQ2NTUwNiA3NzIgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTQ0IHJlbWFpbmRlciAzNDU1NzU1LjQ3RS0xMTI0NjU1MDYgNzcxLjY3NDMwNiAtPiAzLjQ1NTc1NTQ3RS0xMTI0NjU1MDAKK3hzdWIxNDQgc3VidHJhY3QgMzQ1NTc1NS40N0UtMTEyNDY1NTA2IDc3MS42NzQzMDYgLT4gLTc3MS42NzQzMDYgSW5leGFjdCBSb3VuZGVkCit4YWRkMTQ1IGFkZCAtNDc3MDY3NzU3LkUtOTYxNjg0OTQwIDcuNzAxMjI2MDhFLTc0MTA3MjI0NSAtPiA3LjcwMTIyNjA4RS03NDEwNzIyNDUgSW5leGFjdCBSb3VuZGVkCit4Y29tMTQ1IGNvbXBhcmUgLTQ3NzA2Nzc1Ny5FLTk2MTY4NDk0MCA3LjcwMTIyNjA4RS03NDEwNzIyNDUgLT4gLTEKK3hkaXYxNDUgZGl2aWRlIC00NzcwNjc3NTcuRS05NjE2ODQ5NDAgNy43MDEyMjYwOEUtNzQxMDcyMjQ1IC0+IC02LjE5NDY5ODc3RS0yMjA2MTI2ODggSW5leGFjdCBSb3VuZGVkCit4ZHZpMTQ1IGRpdmlkZWludCAtNDc3MDY3NzU3LkUtOTYxNjg0OTQwIDcuNzAxMjI2MDhFLTc0MTA3MjI0NSAtPiAtMAoreG11bDE0NSBtdWx0aXBseSAtNDc3MDY3NzU3LkUtOTYxNjg0OTQwIDcuNzAxMjI2MDhFLTc0MTA3MjI0NSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cG93MTQ1IHBvd2VyIC00NzcwNjc3NTcuRS05NjE2ODQ5NDAgOCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xNDUgcmVtYWluZGVyIC00NzcwNjc3NTcuRS05NjE2ODQ5NDAgNy43MDEyMjYwOEUtNzQxMDcyMjQ1IC0+IC00Ljc3MDY3NzU3RS05NjE2ODQ5MzIKK3hzdWIxNDUgc3VidHJhY3QgLTQ3NzA2Nzc1Ny5FLTk2MTY4NDk0MCA3LjcwMTIyNjA4RS03NDEwNzIyNDUgLT4gLTcuNzAxMjI2MDhFLTc0MTA3MjI0NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNDYgYWRkIDc2NDgyLjM1MiA4MjM3ODA2LjggLT4gODMxNDI4OS4xNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDYgY29tcGFyZSA3NjQ4Mi4zNTIgODIzNzgwNi44IC0+IC0xCit4ZGl2MTQ2IGRpdmlkZSA3NjQ4Mi4zNTIgODIzNzgwNi44IC0+IDAuMDA5Mjg0MzA5OTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTQ2IGRpdmlkZWludCA3NjQ4Mi4zNTIgODIzNzgwNi44IC0+IDAKK3htdWwxNDYgbXVsdGlwbHkgNzY0ODIuMzUyIDgyMzc4MDYuOCAtPiA2LjMwMDQ2ODM5RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNDYgcG93ZXIgNzY0ODIuMzUyIDgyMzc4MDcgLT4gOC40NDIxNjU1OUUrNDAyMjk4MzQgSW5leGFjdCBSb3VuZGVkCit4cmVtMTQ2IHJlbWFpbmRlciA3NjQ4Mi4zNTIgODIzNzgwNi44IC0+IDc2NDgyLjM1MgoreHN1YjE0NiBzdWJ0cmFjdCA3NjQ4Mi4zNTIgODIzNzgwNi44IC0+IC04MTYxMzI0LjQ1IEluZXhhY3QgUm91bmRlZAoreGFkZDE0NyBhZGQgMS4yMTUwNTE2NEUtNTY1NTU2NTA0IDkuMjYxNDY1NzMgLT4gOS4yNjE0NjU3MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDcgY29tcGFyZSAxLjIxNTA1MTY0RS01NjU1NTY1MDQgOS4yNjE0NjU3MyAtPiAtMQoreGRpdjE0NyBkaXZpZGUgMS4yMTUwNTE2NEUtNTY1NTU2NTA0IDkuMjYxNDY1NzMgLT4gMS4zMTE5NDMxNEUtNTY1NTU2NTA1IEluZXhhY3QgUm91bmRlZAoreGR2aTE0NyBkaXZpZGVpbnQgMS4yMTUwNTE2NEUtNTY1NTU2NTA0IDkuMjYxNDY1NzMgLT4gMAoreG11bDE0NyBtdWx0aXBseSAxLjIxNTA1MTY0RS01NjU1NTY1MDQgOS4yNjE0NjU3MyAtPiAxLjEyNTMxNTkxRS01NjU1NTY1MDMgSW5leGFjdCBSb3VuZGVkCit4cG93MTQ3IHBvd2VyIDEuMjE1MDUxNjRFLTU2NTU1NjUwNCA5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE0NyByZW1haW5kZXIgMS4yMTUwNTE2NEUtNTY1NTU2NTA0IDkuMjYxNDY1NzMgLT4gMS4yMTUwNTE2NEUtNTY1NTU2NTA0Cit4c3ViMTQ3IHN1YnRyYWN0IDEuMjE1MDUxNjRFLTU2NTU1NjUwNCA5LjI2MTQ2NTczIC0+IC05LjI2MTQ2NTczIEluZXhhY3QgUm91bmRlZAoreGFkZDE0OCBhZGQgLTgzMDMwNjAuMjVFLTE2OTg5NDg4MyA5MDE1NjEuOTg1IC0+IDkwMTU2MS45ODUgSW5leGFjdCBSb3VuZGVkCit4Y29tMTQ4IGNvbXBhcmUgLTgzMDMwNjAuMjVFLTE2OTg5NDg4MyA5MDE1NjEuOTg1IC0+IC0xCit4ZGl2MTQ4IGRpdmlkZSAtODMwMzA2MC4yNUUtMTY5ODk0ODgzIDkwMTU2MS45ODUgLT4gLTkuMjA5NjM4ODFFLTE2OTg5NDg4MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDggZGl2aWRlaW50IC04MzAzMDYwLjI1RS0xNjk4OTQ4ODMgOTAxNTYxLjk4NSAtPiAtMAoreG11bDE0OCBtdWx0aXBseSAtODMwMzA2MC4yNUUtMTY5ODk0ODgzIDkwMTU2MS45ODUgLT4gLTcuNDg1NzIzNDhFLTE2OTg5NDg3MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNDggcG93ZXIgLTgzMDMwNjAuMjVFLTE2OTg5NDg4MyA5MDE1NjIgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTQ4IHJlbWFpbmRlciAtODMwMzA2MC4yNUUtMTY5ODk0ODgzIDkwMTU2MS45ODUgLT4gLTguMzAzMDYwMjVFLTE2OTg5NDg3NworeHN1YjE0OCBzdWJ0cmFjdCAtODMwMzA2MC4yNUUtMTY5ODk0ODgzIDkwMTU2MS45ODUgLT4gLTkwMTU2MS45ODUgSW5leGFjdCBSb3VuZGVkCit4YWRkMTQ5IGFkZCAtNTkyNDY0LjkyIDcxNDQ1NTEwLjcgLT4gNzA4NTMwNDUuOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNDkgY29tcGFyZSAtNTkyNDY0LjkyIDcxNDQ1NTEwLjcgLT4gLTEKK3hkaXYxNDkgZGl2aWRlIC01OTI0NjQuOTIgNzE0NDU1MTAuNyAtPiAtMC4wMDgyOTI1NDIzMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNDkgZGl2aWRlaW50IC01OTI0NjQuOTIgNzE0NDU1MTAuNyAtPiAtMAoreG11bDE0OSBtdWx0aXBseSAtNTkyNDY0LjkyIDcxNDQ1NTEwLjcgLT4gLTQuMjMyODk1ODhFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzE0OSBwb3dlciAtNTkyNDY0LjkyIDcxNDQ1NTExIC0+IC0xLjU4MjY5MTA4RSs0MTI0MzA4MzIgSW5leGFjdCBSb3VuZGVkCit4cmVtMTQ5IHJlbWFpbmRlciAtNTkyNDY0LjkyIDcxNDQ1NTEwLjcgLT4gLTU5MjQ2NC45MgoreHN1YjE0OSBzdWJ0cmFjdCAtNTkyNDY0LjkyIDcxNDQ1NTEwLjcgLT4gLTcyMDM3OTc1LjYgSW5leGFjdCBSb3VuZGVkCit4YWRkMTUwIGFkZCAtNzM3NzQuNDE2NSAtMzkuODI0MzAyNyAtPiAtNzM4MTQuMjQwOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNTAgY29tcGFyZSAtNzM3NzQuNDE2NSAtMzkuODI0MzAyNyAtPiAtMQoreGRpdjE1MCBkaXZpZGUgLTczNzc0LjQxNjUgLTM5LjgyNDMwMjcgLT4gMTg1Mi40OTczOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNTAgZGl2aWRlaW50IC03Mzc3NC40MTY1IC0zOS44MjQzMDI3IC0+IDE4NTIKK3htdWwxNTAgbXVsdGlwbHkgLTczNzc0LjQxNjUgLTM5LjgyNDMwMjcgLT4gMjkzODAxNC42OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNTAgcG93ZXIgLTczNzc0LjQxNjUgLTQwIC0+IDEuOTIyMDY3NjVFLTE5NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTAgcmVtYWluZGVyIC03Mzc3NC40MTY1IC0zOS44MjQzMDI3IC0+IC0xOS44MDc4OTk2Cit4c3ViMTUwIHN1YnRyYWN0IC03Mzc3NC40MTY1IC0zOS44MjQzMDI3IC0+IC03MzczNC41OTIyIEluZXhhY3QgUm91bmRlZAoreGFkZDE1MSBhZGQgLTUyNDcyNDcxNS4gLTU1NzYzLjc5MzcgLT4gLTUyNDc4MDQ3OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNTEgY29tcGFyZSAtNTI0NzI0NzE1LiAtNTU3NjMuNzkzNyAtPiAtMQoreGRpdjE1MSBkaXZpZGUgLTUyNDcyNDcxNS4gLTU1NzYzLjc5MzcgLT4gOTQwOS43NzQzNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNTEgZGl2aWRlaW50IC01MjQ3MjQ3MTUuIC01NTc2My43OTM3IC0+IDk0MDkKK3htdWwxNTEgbXVsdGlwbHkgLTUyNDcyNDcxNS4gLTU1NzYzLjc5MzcgLT4gMi45MjYwNjQwOEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MTUxIHBvd2VyIC01MjQ3MjQ3MTUuIC01NTc2NCAtPiA1LjQ3ODk4MzUxRS00ODYyNTkgSW5leGFjdCBSb3VuZGVkCit4cmVtMTUxIHJlbWFpbmRlciAtNTI0NzI0NzE1LiAtNTU3NjMuNzkzNyAtPiAtNDMxODAuMDc2NworeHN1YjE1MSBzdWJ0cmFjdCAtNTI0NzI0NzE1LiAtNTU3NjMuNzkzNyAtPiAtNTI0NjY4OTUxIEluZXhhY3QgUm91bmRlZAoreGFkZDE1MiBhZGQgNy41MzgwMDQyNyA3ODQ4NzM3NjhFLTk5ODExNDYgLT4gNy41MzgwMDQyNyBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNTIgY29tcGFyZSA3LjUzODAwNDI3IDc4NDg3Mzc2OEUtOTk4MTE0NiAtPiAxCit4ZGl2MTUyIGRpdmlkZSA3LjUzODAwNDI3IDc4NDg3Mzc2OEUtOTk4MTE0NiAtPiA5LjYwNDA5NzYwRSs5OTgxMTM3IEluZXhhY3QgUm91bmRlZAoreGR2aTE1MiBkaXZpZGVpbnQgNy41MzgwMDQyNyA3ODQ4NzM3NjhFLTk5ODExNDYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxNTIgbXVsdGlwbHkgNy41MzgwMDQyNyA3ODQ4NzM3NjhFLTk5ODExNDYgLT4gNS45MTYzODE4MUUtOTk4MTEzNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNTIgcG93ZXIgNy41MzgwMDQyNyA4IC0+IDEwNDI0Mzk5LjIgSW5leGFjdCBSb3VuZGVkCit4cmVtMTUyIHJlbWFpbmRlciA3LjUzODAwNDI3IDc4NDg3Mzc2OEUtOTk4MTE0NiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE1MiBzdWJ0cmFjdCA3LjUzODAwNDI3IDc4NDg3Mzc2OEUtOTk4MTE0NiAtPiA3LjUzODAwNDI3IEluZXhhY3QgUm91bmRlZAoreGFkZDE1MyBhZGQgMzcuNjAyNzQ1MiA3LjIyNDU0MjMzIC0+IDQ0LjgyNzI4NzUgSW5leGFjdCBSb3VuZGVkCit4Y29tMTUzIGNvbXBhcmUgMzcuNjAyNzQ1MiA3LjIyNDU0MjMzIC0+IDEKK3hkaXYxNTMgZGl2aWRlIDM3LjYwMjc0NTIgNy4yMjQ1NDIzMyAtPiA1LjIwNDg2MTkxIEluZXhhY3QgUm91bmRlZAoreGR2aTE1MyBkaXZpZGVpbnQgMzcuNjAyNzQ1MiA3LjIyNDU0MjMzIC0+IDUKK3htdWwxNTMgbXVsdGlwbHkgMzcuNjAyNzQ1MiA3LjIyNDU0MjMzIC0+IDI3MS42NjI2MjQgSW5leGFjdCBSb3VuZGVkCit4cG93MTUzIHBvd2VyIDM3LjYwMjc0NTIgNyAtPiAxLjA2MzAwODgxRSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTMgcmVtYWluZGVyIDM3LjYwMjc0NTIgNy4yMjQ1NDIzMyAtPiAxLjQ4MDAzMzU1Cit4c3ViMTUzIHN1YnRyYWN0IDM3LjYwMjc0NTIgNy4yMjQ1NDIzMyAtPiAzMC4zNzgyMDI5IEluZXhhY3QgUm91bmRlZAoreGFkZDE1NCBhZGQgMjQ0NzY2MC4zOSAtMzY5ODEuNDI1MyAtPiAyNDEwNjc4Ljk2IEluZXhhY3QgUm91bmRlZAoreGNvbTE1NCBjb21wYXJlIDI0NDc2NjAuMzkgLTM2OTgxLjQyNTMgLT4gMQoreGRpdjE1NCBkaXZpZGUgMjQ0NzY2MC4zOSAtMzY5ODEuNDI1MyAtPiAtNjYuMTg2MjEwMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNTQgZGl2aWRlaW50IDI0NDc2NjAuMzkgLTM2OTgxLjQyNTMgLT4gLTY2Cit4bXVsMTU0IG11bHRpcGx5IDI0NDc2NjAuMzkgLTM2OTgxLjQyNTMgLT4gLTkuMDUxNzk2OTlFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzE1NCBwb3dlciAyNDQ3NjYwLjM5IC0zNjk4MSAtPiAzLjkyMDY2MDY0RS0yMzYyNjMgSW5leGFjdCBSb3VuZGVkCit4cmVtMTU0IHJlbWFpbmRlciAyNDQ3NjYwLjM5IC0zNjk4MS40MjUzIC0+IDY4ODYuMzIwMgoreHN1YjE1NCBzdWJ0cmFjdCAyNDQ3NjYwLjM5IC0zNjk4MS40MjUzIC0+IDI0ODQ2NDEuODIgSW5leGFjdCBSb3VuZGVkCit4YWRkMTU1IGFkZCAyMTYwLjM2NDE5IDE0MTguMzM1NzRFKzY1NjI2NTM4MiAtPiAxLjQxODMzNTc0RSs2NTYyNjUzODUgSW5leGFjdCBSb3VuZGVkCit4Y29tMTU1IGNvbXBhcmUgMjE2MC4zNjQxOSAxNDE4LjMzNTc0RSs2NTYyNjUzODIgLT4gLTEKK3hkaXYxNTUgZGl2aWRlIDIxNjAuMzY0MTkgMTQxOC4zMzU3NEUrNjU2MjY1MzgyIC0+IDEuNTIzMTY4NDFFLTY1NjI2NTM4MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNTUgZGl2aWRlaW50IDIxNjAuMzY0MTkgMTQxOC4zMzU3NEUrNjU2MjY1MzgyIC0+IDAKK3htdWwxNTUgbXVsdGlwbHkgMjE2MC4zNjQxOSAxNDE4LjMzNTc0RSs2NTYyNjUzODIgLT4gMy4wNjQxMjE3NEUrNjU2MjY1Mzg4IEluZXhhY3QgUm91bmRlZAoreHBvdzE1NSBwb3dlciAyMTYwLjM2NDE5IDEgLT4gMjE2MC4zNjQxOQoreHJlbTE1NSByZW1haW5kZXIgMjE2MC4zNjQxOSAxNDE4LjMzNTc0RSs2NTYyNjUzODIgLT4gMjE2MC4zNjQxOQoreHN1YjE1NSBzdWJ0cmFjdCAyMTYwLjM2NDE5IDE0MTguMzM1NzRFKzY1NjI2NTM4MiAtPiAtMS40MTgzMzU3NEUrNjU2MjY1Mzg1IEluZXhhY3QgUm91bmRlZAoreGFkZDE1NiBhZGQgODkyNi40NDkzOSA1NC45NDMwMDI3IC0+IDg5ODEuMzkyMzkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTU2IGNvbXBhcmUgODkyNi40NDkzOSA1NC45NDMwMDI3IC0+IDEKK3hkaXYxNTYgZGl2aWRlIDg5MjYuNDQ5MzkgNTQuOTQzMDAyNyAtPiAxNjIuNDY3NDQ3IEluZXhhY3QgUm91bmRlZAoreGR2aTE1NiBkaXZpZGVpbnQgODkyNi40NDkzOSA1NC45NDMwMDI3IC0+IDE2MgoreG11bDE1NiBtdWx0aXBseSA4OTI2LjQ0OTM5IDU0Ljk0MzAwMjcgLT4gNDkwNDQ1LjkzMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNTYgcG93ZXIgODkyNi40NDkzOSA1NSAtPiAxLjkzNzg5ODc3RSsyMTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMTU2IHJlbWFpbmRlciA4OTI2LjQ0OTM5IDU0Ljk0MzAwMjcgLT4gMjUuNjgyOTUyNgoreHN1YjE1NiBzdWJ0cmFjdCA4OTI2LjQ0OTM5IDU0Ljk0MzAwMjcgLT4gODg3MS41MDYzOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNTcgYWRkIDg2MTU4ODAyOSAtNDE2NTczOThFKzc3OTU1OTI1IC0+IC00LjE2NTczOTgwRSs3Nzk1NTkzMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNTcgY29tcGFyZSA4NjE1ODgwMjkgLTQxNjU3Mzk4RSs3Nzk1NTkyNSAtPiAxCit4ZGl2MTU3IGRpdmlkZSA4NjE1ODgwMjkgLTQxNjU3Mzk4RSs3Nzk1NTkyNSAtPiAtMi4wNjgyNzEzNUUtNzc5NTU5MjQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTU3IGRpdmlkZWludCA4NjE1ODgwMjkgLTQxNjU3Mzk4RSs3Nzk1NTkyNSAtPiAtMAoreG11bDE1NyBtdWx0aXBseSA4NjE1ODgwMjkgLTQxNjU3Mzk4RSs3Nzk1NTkyNSAtPiAtMy41ODkxNTE1NEUrNzc5NTU5NDEgSW5leGFjdCBSb3VuZGVkCit4cG93MTU3IHBvd2VyIDg2MTU4ODAyOSAtNCAtPiAxLjgxNDY4NTUzRS0zNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTcgcmVtYWluZGVyIDg2MTU4ODAyOSAtNDE2NTczOThFKzc3OTU1OTI1IC0+IDg2MTU4ODAyOQoreHN1YjE1NyBzdWJ0cmFjdCA4NjE1ODgwMjkgLTQxNjU3Mzk4RSs3Nzk1NTkyNSAtPiA0LjE2NTczOTgwRSs3Nzk1NTkzMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNTggYWRkIC0zNC41MjUzMDYyIDUyLjY3MjIwMTkgLT4gMTguMTQ2ODk1NworeGNvbTE1OCBjb21wYXJlIC0zNC41MjUzMDYyIDUyLjY3MjIwMTkgLT4gLTEKK3hkaXYxNTggZGl2aWRlIC0zNC41MjUzMDYyIDUyLjY3MjIwMTkgLT4gLTAuNjU1NDc0ODk5IEluZXhhY3QgUm91bmRlZAoreGR2aTE1OCBkaXZpZGVpbnQgLTM0LjUyNTMwNjIgNTIuNjcyMjAxOSAtPiAtMAoreG11bDE1OCBtdWx0aXBseSAtMzQuNTI1MzA2MiA1Mi42NzIyMDE5IC0+IC0xODE4LjUyMzkwIEluZXhhY3QgUm91bmRlZAoreHBvdzE1OCBwb3dlciAtMzQuNTI1MzA2MiA1MyAtPiAtMy4zMjExNTgyMUUrODEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTU4IHJlbWFpbmRlciAtMzQuNTI1MzA2MiA1Mi42NzIyMDE5IC0+IC0zNC41MjUzMDYyCit4c3ViMTU4IHN1YnRyYWN0IC0zNC41MjUzMDYyIDUyLjY3MjIwMTkgLT4gLTg3LjE5NzUwODEKK3hhZGQxNTkgYWRkIC0xODg2MTY0Ny4gOTk3OTQ1ODYuNyAtPiA4MDkzMjkzOS43Cit4Y29tMTU5IGNvbXBhcmUgLTE4ODYxNjQ3LiA5OTc5NDU4Ni43IC0+IC0xCit4ZGl2MTU5IGRpdmlkZSAtMTg4NjE2NDcuIDk5Nzk0NTg2LjcgLT4gLTAuMTg5MDA0NzExIEluZXhhY3QgUm91bmRlZAoreGR2aTE1OSBkaXZpZGVpbnQgLTE4ODYxNjQ3LiA5OTc5NDU4Ni43IC0+IC0wCit4bXVsMTU5IG11bHRpcGx5IC0xODg2MTY0Ny4gOTk3OTQ1ODYuNyAtPiAtMS44ODIyOTAyN0UrMTUgSW5leGFjdCBSb3VuZGVkCit4cG93MTU5IHBvd2VyIC0xODg2MTY0Ny4gOTk3OTQ1ODcgLT4gLTQuMjg5NTc0NTlFKzcyNjA2MzQ2MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNTkgcmVtYWluZGVyIC0xODg2MTY0Ny4gOTk3OTQ1ODYuNyAtPiAtMTg4NjE2NDcuMAoreHN1YjE1OSBzdWJ0cmFjdCAtMTg4NjE2NDcuIDk5Nzk0NTg2LjcgLT4gLTExODY1NjIzNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjAgYWRkIDMyMjE5Mi40MDcgNDYxLjY3MDQ0IC0+IDMyMjY1NC4wNzcgSW5leGFjdCBSb3VuZGVkCit4Y29tMTYwIGNvbXBhcmUgMzIyMTkyLjQwNyA0NjEuNjcwNDQgLT4gMQoreGRpdjE2MCBkaXZpZGUgMzIyMTkyLjQwNyA0NjEuNjcwNDQgLT4gNjk3Ljg4Mzk4NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNjAgZGl2aWRlaW50IDMyMjE5Mi40MDcgNDYxLjY3MDQ0IC0+IDY5NworeG11bDE2MCBtdWx0aXBseSAzMjIxOTIuNDA3IDQ2MS42NzA0NCAtPiAxNDg3NDY3MTAgSW5leGFjdCBSb3VuZGVkCit4cG93MTYwIHBvd2VyIDMyMjE5Mi40MDcgNDYyIC0+IDUuNjEzOTU4NzNFKzI1NDQgSW5leGFjdCBSb3VuZGVkCit4cmVtMTYwIHJlbWFpbmRlciAzMjIxOTIuNDA3IDQ2MS42NzA0NCAtPiA0MDguMTEwMzIKK3hzdWIxNjAgc3VidHJhY3QgMzIyMTkyLjQwNyA0NjEuNjcwNDQgLT4gMzIxNzMwLjczNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjEgYWRkIC04OTYyOTg1MThFKzYxNDEyMzE0IDc4ODczLjgwNDkgLT4gLTguOTYyOTg1MThFKzYxNDEyMzIyIEluZXhhY3QgUm91bmRlZAoreGNvbTE2MSBjb21wYXJlIC04OTYyOTg1MThFKzYxNDEyMzE0IDc4ODczLjgwNDkgLT4gLTEKK3hkaXYxNjEgZGl2aWRlIC04OTYyOTg1MThFKzYxNDEyMzE0IDc4ODczLjgwNDkgLT4gLTEuMTM2MzcwMzNFKzYxNDEyMzE4IEluZXhhY3QgUm91bmRlZAoreGR2aTE2MSBkaXZpZGVpbnQgLTg5NjI5ODUxOEUrNjE0MTIzMTQgNzg4NzMuODA0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE2MSBtdWx0aXBseSAtODk2Mjk4NTE4RSs2MTQxMjMxNCA3ODg3My44MDQ5IC0+IC03LjA2OTQ0NzQ0RSs2MTQxMjMyNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNjEgcG93ZXIgLTg5NjI5ODUxOEUrNjE0MTIzMTQgNzg4NzQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTYxIHJlbWFpbmRlciAtODk2Mjk4NTE4RSs2MTQxMjMxNCA3ODg3My44MDQ5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTYxIHN1YnRyYWN0IC04OTYyOTg1MThFKzYxNDEyMzE0IDc4ODczLjgwNDkgLT4gLTguOTYyOTg1MThFKzYxNDEyMzIyIEluZXhhY3QgUm91bmRlZAoreGFkZDE2MiBhZGQgMjkzLjc3MzczMiA0Nzk4OTkwNTJFKzc4OTk1MDE3NyAtPiA0Ljc5ODk5MDUyRSs3ODk5NTAxODUgSW5leGFjdCBSb3VuZGVkCit4Y29tMTYyIGNvbXBhcmUgMjkzLjc3MzczMiA0Nzk4OTkwNTJFKzc4OTk1MDE3NyAtPiAtMQoreGRpdjE2MiBkaXZpZGUgMjkzLjc3MzczMiA0Nzk4OTkwNTJFKzc4OTk1MDE3NyAtPiA2LjEyMTU3MzUwRS03ODk5NTAxODQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTYyIGRpdmlkZWludCAyOTMuNzczNzMyIDQ3OTg5OTA1MkUrNzg5OTUwMTc3IC0+IDAKK3htdWwxNjIgbXVsdGlwbHkgMjkzLjc3MzczMiA0Nzk4OTkwNTJFKzc4OTk1MDE3NyAtPiAxLjQwOTgxNzM1RSs3ODk5NTAxODggSW5leGFjdCBSb3VuZGVkCit4cG93MTYyIHBvd2VyIDI5My43NzM3MzIgNSAtPiAyLjE4ODA4ODA5RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNjIgcmVtYWluZGVyIDI5My43NzM3MzIgNDc5ODk5MDUyRSs3ODk5NTAxNzcgLT4gMjkzLjc3MzczMgoreHN1YjE2MiBzdWJ0cmFjdCAyOTMuNzczNzMyIDQ3OTg5OTA1MkUrNzg5OTUwMTc3IC0+IC00Ljc5ODk5MDUyRSs3ODk5NTAxODUgSW5leGFjdCBSb3VuZGVkCit4YWRkMTYzIGFkZCAtMTAzNTE5MzYyIDUxODk3OTU1LjMgLT4gLTUxNjIxNDA2LjcKK3hjb20xNjMgY29tcGFyZSAtMTAzNTE5MzYyIDUxODk3OTU1LjMgLT4gLTEKK3hkaXYxNjMgZGl2aWRlIC0xMDM1MTkzNjIgNTE4OTc5NTUuMyAtPiAtMS45OTQ2NzEzMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNjMgZGl2aWRlaW50IC0xMDM1MTkzNjIgNTE4OTc5NTUuMyAtPiAtMQoreG11bDE2MyBtdWx0aXBseSAtMTAzNTE5MzYyIDUxODk3OTU1LjMgLT4gLTUuMzcyNDQzMjJFKzE1IEluZXhhY3QgUm91bmRlZAoreHBvdzE2MyBwb3dlciAtMTAzNTE5MzYyIDUxODk3OTU1IC0+IC00LjI4ODU4MjI5RSs0MTU5NjMyMjkgSW5leGFjdCBSb3VuZGVkCit4cmVtMTYzIHJlbWFpbmRlciAtMTAzNTE5MzYyIDUxODk3OTU1LjMgLT4gLTUxNjIxNDA2LjcKK3hzdWIxNjMgc3VidHJhY3QgLTEwMzUxOTM2MiA1MTg5Nzk1NS4zIC0+IC0xNTU0MTczMTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMTY0IGFkZCAzNzM4MC43ODAyIC0yNzc3MTk3ODguIC0+IC0yNzc2ODI0MDcgSW5leGFjdCBSb3VuZGVkCit4Y29tMTY0IGNvbXBhcmUgMzczODAuNzgwMiAtMjc3NzE5Nzg4LiAtPiAxCit4ZGl2MTY0IGRpdmlkZSAzNzM4MC43ODAyIC0yNzc3MTk3ODguIC0+IC0wLjAwMDEzNDU5ODkwOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNjQgZGl2aWRlaW50IDM3MzgwLjc4MDIgLTI3NzcxOTc4OC4gLT4gLTAKK3htdWwxNjQgbXVsdGlwbHkgMzczODAuNzgwMiAtMjc3NzE5Nzg4LiAtPiAtMS4wMzgxMzgyNEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MTY0IHBvd2VyIDM3MzgwLjc4MDIgLTI3NzcxOTc4OCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xNjQgcmVtYWluZGVyIDM3MzgwLjc4MDIgLTI3NzcxOTc4OC4gLT4gMzczODAuNzgwMgoreHN1YjE2NCBzdWJ0cmFjdCAzNzM4MC43ODAyIC0yNzc3MTk3ODguIC0+IDI3Nzc1NzE2OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjUgYWRkIDMyMDEzMzg0NC4gLTk3NzUxNzQ3NyAtPiAtNjU3MzgzNjMzCit4Y29tMTY1IGNvbXBhcmUgMzIwMTMzODQ0LiAtOTc3NTE3NDc3IC0+IDEKK3hkaXYxNjUgZGl2aWRlIDMyMDEzMzg0NC4gLTk3NzUxNzQ3NyAtPiAtMC4zMjc0OTY3OTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMTY1IGRpdmlkZWludCAzMjAxMzM4NDQuIC05Nzc1MTc0NzcgLT4gLTAKK3htdWwxNjUgbXVsdGlwbHkgMzIwMTMzODQ0LiAtOTc3NTE3NDc3IC0+IC0zLjEyOTM2NDI3RSsxNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNjUgcG93ZXIgMzIwMTMzODQ0LiAtOTc3NTE3NDc3IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE2NSByZW1haW5kZXIgMzIwMTMzODQ0LiAtOTc3NTE3NDc3IC0+IDMyMDEzMzg0NAoreHN1YjE2NSBzdWJ0cmFjdCAzMjAxMzM4NDQuIC05Nzc1MTc0NzcgLT4gMS4yOTc2NTEzMkUrOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjYgYWRkIDcyMTc3NjcwMUUrOTMzNjQ2MTYxIC01Njg5Mjc5LjY0RSs2Njk5MDM2NDUgLT4gNy4yMTc3NjcwMUUrOTMzNjQ2MTY5IEluZXhhY3QgUm91bmRlZAoreGNvbTE2NiBjb21wYXJlIDcyMTc3NjcwMUUrOTMzNjQ2MTYxIC01Njg5Mjc5LjY0RSs2Njk5MDM2NDUgLT4gMQoreGRpdjE2NiBkaXZpZGUgNzIxNzc2NzAxRSs5MzM2NDYxNjEgLTU2ODkyNzkuNjRFKzY2OTkwMzY0NSAtPiAtMS4yNjg2NjA5N0UrMjYzNzQyNTE4IEluZXhhY3QgUm91bmRlZAoreGR2aTE2NiBkaXZpZGVpbnQgNzIxNzc2NzAxRSs5MzM2NDYxNjEgLTU2ODkyNzkuNjRFKzY2OTkwMzY0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE2NiBtdWx0aXBseSA3MjE3NzY3MDFFKzkzMzY0NjE2MSAtNTY4OTI3OS42NEUrNjY5OTAzNjQ1IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hwb3cxNjYgcG93ZXIgNzIxNzc2NzAxRSs5MzM2NDYxNjEgLTYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTY2IHJlbWFpbmRlciA3MjE3NzY3MDFFKzkzMzY0NjE2MSAtNTY4OTI3OS42NEUrNjY5OTAzNjQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTY2IHN1YnRyYWN0IDcyMTc3NjcwMUUrOTMzNjQ2MTYxIC01Njg5Mjc5LjY0RSs2Njk5MDM2NDUgLT4gNy4yMTc3NjcwMUUrOTMzNjQ2MTY5IEluZXhhY3QgUm91bmRlZAoreGFkZDE2NyBhZGQgLTU0MDkuMDA0ODIgLTIuMTYxNDkzODYgLT4gLTU0MTEuMTY2MzEgSW5leGFjdCBSb3VuZGVkCit4Y29tMTY3IGNvbXBhcmUgLTU0MDkuMDA0ODIgLTIuMTYxNDkzODYgLT4gLTEKK3hkaXYxNjcgZGl2aWRlIC01NDA5LjAwNDgyIC0yLjE2MTQ5Mzg2IC0+IDI1MDIuNDM4MjEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTY3IGRpdmlkZWludCAtNTQwOS4wMDQ4MiAtMi4xNjE0OTM4NiAtPiAyNTAyCit4bXVsMTY3IG11bHRpcGx5IC01NDA5LjAwNDgyIC0yLjE2MTQ5Mzg2IC0+IDExNjkxLjUzMDcgSW5leGFjdCBSb3VuZGVkCit4cG93MTY3IHBvd2VyIC01NDA5LjAwNDgyIC0yIC0+IDMuNDE3OTQ2NTJFLTggSW5leGFjdCBSb3VuZGVkCit4cmVtMTY3IHJlbWFpbmRlciAtNTQwOS4wMDQ4MiAtMi4xNjE0OTM4NiAtPiAtMC45NDcxODIyOAoreHN1YjE2NyBzdWJ0cmFjdCAtNTQwOS4wMDQ4MiAtMi4xNjE0OTM4NiAtPiAtNTQwNi44NDMzMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjggYWRkIC05NTc5NjAuMzY3IDMyMi44NTgxNzAgLT4gLTk1NzYzNy41MDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTY4IGNvbXBhcmUgLTk1Nzk2MC4zNjcgMzIyLjg1ODE3MCAtPiAtMQoreGRpdjE2OCBkaXZpZGUgLTk1Nzk2MC4zNjcgMzIyLjg1ODE3MCAtPiAtMjk2Ny4xMjQ0NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNjggZGl2aWRlaW50IC05NTc5NjAuMzY3IDMyMi44NTgxNzAgLT4gLTI5NjcKK3htdWwxNjggbXVsdGlwbHkgLTk1Nzk2MC4zNjcgMzIyLjg1ODE3MCAtPiAtMzA5Mjg1MzMxIEluZXhhY3QgUm91bmRlZAoreHBvdzE2OCBwb3dlciAtOTU3OTYwLjM2NyAzMjMgLT4gLTkuNDQ2MTc0NjBFKzE5MzEgSW5leGFjdCBSb3VuZGVkCit4cmVtMTY4IHJlbWFpbmRlciAtOTU3OTYwLjM2NyAzMjIuODU4MTcwIC0+IC00MC4xNzY2MTAKK3hzdWIxNjggc3VidHJhY3QgLTk1Nzk2MC4zNjcgMzIyLjg1ODE3MCAtPiAtOTU4MjgzLjIyNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNjkgYWRkIC0xMTgxNy44NzU0RSs2MTM4OTM0NDIgLTMuODQ3MzUwODJFKzg4ODMzMzI0OSAtPiAtMy44NDczNTA4MkUrODg4MzMzMjQ5IEluZXhhY3QgUm91bmRlZAoreGNvbTE2OSBjb21wYXJlIC0xMTgxNy44NzU0RSs2MTM4OTM0NDIgLTMuODQ3MzUwODJFKzg4ODMzMzI0OSAtPiAxCit4ZGl2MTY5IGRpdmlkZSAtMTE4MTcuODc1NEUrNjEzODkzNDQyIC0zLjg0NzM1MDgyRSs4ODgzMzMyNDkgLT4gMy4wNzE2OTE2NUUtMjc0NDM5ODA0IEluZXhhY3QgUm91bmRlZAoreGR2aTE2OSBkaXZpZGVpbnQgLTExODE3Ljg3NTRFKzYxMzg5MzQ0MiAtMy44NDczNTA4MkUrODg4MzMzMjQ5IC0+IDAKK3htdWwxNjkgbXVsdGlwbHkgLTExODE3Ljg3NTRFKzYxMzg5MzQ0MiAtMy44NDczNTA4MkUrODg4MzMzMjQ5IC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzE2OSBwb3dlciAtMTE4MTcuODc1NEUrNjEzODkzNDQyIC00IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE2OSByZW1haW5kZXIgLTExODE3Ljg3NTRFKzYxMzg5MzQ0MiAtMy44NDczNTA4MkUrODg4MzMzMjQ5IC0+IC0xLjE4MTc4NzU0RSs2MTM4OTM0NDYKK3hzdWIxNjkgc3VidHJhY3QgLTExODE3Ljg3NTRFKzYxMzg5MzQ0MiAtMy44NDczNTA4MkUrODg4MzMzMjQ5IC0+IDMuODQ3MzUwODJFKzg4ODMzMzI0OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzAgYWRkIDg0MDI1ODIwMyA1ODM2My45ODBFLTkwNjU4NDcyMyAtPiA4NDAyNTgyMDMgSW5leGFjdCBSb3VuZGVkCit4Y29tMTcwIGNvbXBhcmUgODQwMjU4MjAzIDU4MzYzLjk4MEUtOTA2NTg0NzIzIC0+IDEKK3hkaXYxNzAgZGl2aWRlIDg0MDI1ODIwMyA1ODM2My45ODBFLTkwNjU4NDcyMyAtPiAxLjQzOTY4NjI2RSs5MDY1ODQ3MjcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTcwIGRpdmlkZWludCA4NDAyNTgyMDMgNTgzNjMuOTgwRS05MDY1ODQ3MjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxNzAgbXVsdGlwbHkgODQwMjU4MjAzIDU4MzYzLjk4MEUtOTA2NTg0NzIzIC0+IDQuOTA0MDgxMzBFLTkwNjU4NDcxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNzAgcG93ZXIgODQwMjU4MjAzIDYgLT4gMy41MTk0NjQzMUUrNTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMTcwIHJlbWFpbmRlciA4NDAyNTgyMDMgNTgzNjMuOTgwRS05MDY1ODQ3MjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxNzAgc3VidHJhY3QgODQwMjU4MjAzIDU4MzYzLjk4MEUtOTA2NTg0NzIzIC0+IDg0MDI1ODIwMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzEgYWRkIC0yMDU4NDIwOTYuIC0xOTEzNDIuNzIxIC0+IC0yMDYwMzM0MzkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTcxIGNvbXBhcmUgLTIwNTg0MjA5Ni4gLTE5MTM0Mi43MjEgLT4gLTEKK3hkaXYxNzEgZGl2aWRlIC0yMDU4NDIwOTYuIC0xOTEzNDIuNzIxIC0+IDEwNzUuNzc2OTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTcxIGRpdmlkZWludCAtMjA1ODQyMDk2LiAtMTkxMzQyLjcyMSAtPiAxMDc1Cit4bXVsMTcxIG11bHRpcGx5IC0yMDU4NDIwOTYuIC0xOTEzNDIuNzIxIC0+IDMuOTM4NjM4NjdFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzE3MSBwb3dlciAtMjA1ODQyMDk2LiAtMTkxMzQzIC0+IC0yLjY2OTU1NTUzRS0xNTkwNzM3IEluZXhhY3QgUm91bmRlZAoreHJlbTE3MSByZW1haW5kZXIgLTIwNTg0MjA5Ni4gLTE5MTM0Mi43MjEgLT4gLTE0ODY3MC45MjUKK3hzdWIxNzEgc3VidHJhY3QgLTIwNTg0MjA5Ni4gLTE5MTM0Mi43MjEgLT4gLTIwNTY1MDc1MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzIgYWRkIDQyNTAxMTI0LiA4ODQuOTM4NDk4RSsxMjMzNDE0ODAgLT4gOC44NDkzODQ5OEUrMTIzMzQxNDgyIEluZXhhY3QgUm91bmRlZAoreGNvbTE3MiBjb21wYXJlIDQyNTAxMTI0LiA4ODQuOTM4NDk4RSsxMjMzNDE0ODAgLT4gLTEKK3hkaXYxNzIgZGl2aWRlIDQyNTAxMTI0LiA4ODQuOTM4NDk4RSsxMjMzNDE0ODAgLT4gNC44MDI3MjA2NUUtMTIzMzQxNDc2IEluZXhhY3QgUm91bmRlZAoreGR2aTE3MiBkaXZpZGVpbnQgNDI1MDExMjQuIDg4NC45Mzg0OThFKzEyMzM0MTQ4MCAtPiAwCit4bXVsMTcyIG11bHRpcGx5IDQyNTAxMTI0LiA4ODQuOTM4NDk4RSsxMjMzNDE0ODAgLT4gMy43NjEwODgwOEUrMTIzMzQxNDkwIEluZXhhY3QgUm91bmRlZAoreHBvdzE3MiBwb3dlciA0MjUwMTEyNC4gOSAtPiA0LjUyNDg0NTM2RSs2OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNzIgcmVtYWluZGVyIDQyNTAxMTI0LiA4ODQuOTM4NDk4RSsxMjMzNDE0ODAgLT4gNDI1MDExMjQKK3hzdWIxNzIgc3VidHJhY3QgNDI1MDExMjQuIDg4NC45Mzg0OThFKzEyMzM0MTQ4MCAtPiAtOC44NDkzODQ5OEUrMTIzMzQxNDgyIEluZXhhY3QgUm91bmRlZAoreGFkZDE3MyBhZGQgLTU3ODA5NDUyLiAtNjIwMzgwNzQ2IC0+IC02NzgxOTAxOTgKK3hjb20xNzMgY29tcGFyZSAtNTc4MDk0NTIuIC02MjAzODA3NDYgLT4gMQoreGRpdjE3MyBkaXZpZGUgLTU3ODA5NDUyLiAtNjIwMzgwNzQ2IC0+IDAuMDkzMTgzODI2OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNzMgZGl2aWRlaW50IC01NzgwOTQ1Mi4gLTYyMDM4MDc0NiAtPiAwCit4bXVsMTczIG11bHRpcGx5IC01NzgwOTQ1Mi4gLTYyMDM4MDc0NiAtPiAzLjU4NjM4NzEwRSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNzMgcG93ZXIgLTU3ODA5NDUyLiAtNjIwMzgwNzQ2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE3MyByZW1haW5kZXIgLTU3ODA5NDUyLiAtNjIwMzgwNzQ2IC0+IC01NzgwOTQ1MgoreHN1YjE3MyBzdWJ0cmFjdCAtNTc4MDk0NTIuIC02MjAzODA3NDYgLT4gNTYyNTcxMjk0Cit4YWRkMTc0IGFkZCAtODAyMjM3MC4zMSA5ODU4NTgxLjYgLT4gMTgzNjIxMS4yOQoreGNvbTE3NCBjb21wYXJlIC04MDIyMzcwLjMxIDk4NTg1ODEuNiAtPiAtMQoreGRpdjE3NCBkaXZpZGUgLTgwMjIzNzAuMzEgOTg1ODU4MS42IC0+IC0wLjgxMzc0NDg4MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNzQgZGl2aWRlaW50IC04MDIyMzcwLjMxIDk4NTg1ODEuNiAtPiAtMAoreG11bDE3NCBtdWx0aXBseSAtODAyMjM3MC4zMSA5ODU4NTgxLjYgLT4gLTcuOTA4OTE5MjNFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzE3NCBwb3dlciAtODAyMjM3MC4zMSA5ODU4NTgyIC0+IDIuMzQ0NTgyNDlFKzY4MDY2NjM0IEluZXhhY3QgUm91bmRlZAoreHJlbTE3NCByZW1haW5kZXIgLTgwMjIzNzAuMzEgOTg1ODU4MS42IC0+IC04MDIyMzcwLjMxCit4c3ViMTc0IHN1YnRyYWN0IC04MDIyMzcwLjMxIDk4NTg1ODEuNiAtPiAtMTc4ODA5NTEuOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzUgYWRkIDIuNDkwNjUwNjBFKzU5MjEzOTE0MSAtNTQzMi43MjAxNEUtNDE5OTY1MzU3IC0+IDIuNDkwNjUwNjBFKzU5MjEzOTE0MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNzUgY29tcGFyZSAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgLTU0MzIuNzIwMTRFLTQxOTk2NTM1NyAtPiAxCit4ZGl2MTc1IGRpdmlkZSAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgLTU0MzIuNzIwMTRFLTQxOTk2NTM1NyAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4ZHZpMTc1IGRpdmlkZWludCAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgLTU0MzIuNzIwMTRFLTQxOTk2NTM1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE3NSBtdWx0aXBseSAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgLTU0MzIuNzIwMTRFLTQxOTk2NTM1NyAtPiAtMS4zNTMxMDA3N0UrMTcyMTczNzg4IEluZXhhY3QgUm91bmRlZAoreHBvdzE3NSBwb3dlciAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgLTUgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTc1IHJlbWFpbmRlciAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgLTU0MzIuNzIwMTRFLTQxOTk2NTM1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE3NSBzdWJ0cmFjdCAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgLTU0MzIuNzIwMTRFLTQxOTk2NTM1NyAtPiAyLjQ5MDY1MDYwRSs1OTIxMzkxNDEgSW5leGFjdCBSb3VuZGVkCit4YWRkMTc2IGFkZCAtNjk3MjczNzE1RS0yNDI4MjQ4NzAgLTMuODE3NTc1MDYgLT4gLTMuODE3NTc1MDYgSW5leGFjdCBSb3VuZGVkCit4Y29tMTc2IGNvbXBhcmUgLTY5NzI3MzcxNUUtMjQyODI0ODcwIC0zLjgxNzU3NTA2IC0+IDEKK3hkaXYxNzYgZGl2aWRlIC02OTcyNzM3MTVFLTI0MjgyNDg3MCAtMy44MTc1NzUwNiAtPiAxLjgyNjQ4MzMxRS0yNDI4MjQ4NjIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTc2IGRpdmlkZWludCAtNjk3MjczNzE1RS0yNDI4MjQ4NzAgLTMuODE3NTc1MDYgLT4gMAoreG11bDE3NiBtdWx0aXBseSAtNjk3MjczNzE1RS0yNDI4MjQ4NzAgLTMuODE3NTc1MDYgLT4gMi42NjE4OTQ3NEUtMjQyODI0ODYxIEluZXhhY3QgUm91bmRlZAoreHBvdzE3NiBwb3dlciAtNjk3MjczNzE1RS0yNDI4MjQ4NzAgLTQgLT4gNC4yMzA0NTI1MUUrOTcxMjk5NDQ0IEluZXhhY3QgUm91bmRlZAoreHJlbTE3NiByZW1haW5kZXIgLTY5NzI3MzcxNUUtMjQyODI0ODcwIC0zLjgxNzU3NTA2IC0+IC02Ljk3MjczNzE1RS0yNDI4MjQ4NjIKK3hzdWIxNzYgc3VidHJhY3QgLTY5NzI3MzcxNUUtMjQyODI0ODcwIC0zLjgxNzU3NTA2IC0+IDMuODE3NTc1MDYgSW5leGFjdCBSb3VuZGVkCit4YWRkMTc3IGFkZCAtNy40MjIwNDQwM0UtMzE1NzE2MjgwIC04MTU2MTExLjY3RSsyODMyNjE2MzYgLT4gLTguMTU2MTExNjdFKzI4MzI2MTY0MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xNzcgY29tcGFyZSAtNy40MjIwNDQwM0UtMzE1NzE2MjgwIC04MTU2MTExLjY3RSsyODMyNjE2MzYgLT4gMQoreGRpdjE3NyBkaXZpZGUgLTcuNDIyMDQ0MDNFLTMxNTcxNjI4MCAtODE1NjExMS42N0UrMjgzMjYxNjM2IC0+IDkuMDk5OTc4NDNFLTU5ODk3NzkyMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNzcgZGl2aWRlaW50IC03LjQyMjA0NDAzRS0zMTU3MTYyODAgLTgxNTYxMTEuNjdFKzI4MzI2MTYzNiAtPiAwCit4bXVsMTc3IG11bHRpcGx5IC03LjQyMjA0NDAzRS0zMTU3MTYyODAgLTgxNTYxMTEuNjdFKzI4MzI2MTYzNiAtPiA2LjA1MzUwMTk5RS0zMjQ1NDYzNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxNzcgcG93ZXIgLTcuNDIyMDQ0MDNFLTMxNTcxNjI4MCAtOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xNzcgcmVtYWluZGVyIC03LjQyMjA0NDAzRS0zMTU3MTYyODAgLTgxNTYxMTEuNjdFKzI4MzI2MTYzNiAtPiAtNy40MjIwNDQwM0UtMzE1NzE2MjgwCit4c3ViMTc3IHN1YnRyYWN0IC03LjQyMjA0NDAzRS0zMTU3MTYyODAgLTgxNTYxMTEuNjdFKzI4MzI2MTYzNiAtPiA4LjE1NjExMTY3RSsyODMyNjE2NDIgSW5leGFjdCBSb3VuZGVkCit4YWRkMTc4IGFkZCA3MzgwNjM4OTIgODk5MDA0NjcuOCAtPiA4Mjc5NjQzNjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMTc4IGNvbXBhcmUgNzM4MDYzODkyIDg5OTAwNDY3LjggLT4gMQoreGRpdjE3OCBkaXZpZGUgNzM4MDYzODkyIDg5OTAwNDY3LjggLT4gOC4yMDk3ODkyMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxNzggZGl2aWRlaW50IDczODA2Mzg5MiA4OTkwMDQ2Ny44IC0+IDgKK3htdWwxNzggbXVsdGlwbHkgNzM4MDYzODkyIDg5OTAwNDY3LjggLT4gNi42MzUyMjg5MkUrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MTc4IHBvd2VyIDczODA2Mzg5MiA4OTkwMDQ2OCAtPiAxLjUzMTY2NzIzRSs3OTcyNDU3OTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMTc4IHJlbWFpbmRlciA3MzgwNjM4OTIgODk5MDA0NjcuOCAtPiAxODg2MDE0OS42Cit4c3ViMTc4IHN1YnRyYWN0IDczODA2Mzg5MiA4OTkwMDQ2Ny44IC0+IDY0ODE2MzQyNCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxNzkgYWRkIC02MzAzMDkzNjYgLTg4NDc4My4zMzhFLTIxNTk1NDEwIC0+IC02MzAzMDkzNjYgSW5leGFjdCBSb3VuZGVkCit4Y29tMTc5IGNvbXBhcmUgLTYzMDMwOTM2NiAtODg0NzgzLjMzOEUtMjE1OTU0MTAgLT4gLTEKK3hkaXYxNzkgZGl2aWRlIC02MzAzMDkzNjYgLTg4NDc4My4zMzhFLTIxNTk1NDEwIC0+IDcuMTIzODgzNzdFKzIxNTk1NDEyIEluZXhhY3QgUm91bmRlZAoreGR2aTE3OSBkaXZpZGVpbnQgLTYzMDMwOTM2NiAtODg0NzgzLjMzOEUtMjE1OTU0MTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxNzkgbXVsdGlwbHkgLTYzMDMwOTM2NiAtODg0NzgzLjMzOEUtMjE1OTU0MTAgLT4gNS41NzY4NzIyNUUtMjE1OTUzOTYgSW5leGFjdCBSb3VuZGVkCit4cG93MTc5IHBvd2VyIC02MzAzMDkzNjYgLTkgLT4gLTYuMzY4MTkyMTBFLTgwIEluZXhhY3QgUm91bmRlZAoreHJlbTE3OSByZW1haW5kZXIgLTYzMDMwOTM2NiAtODg0NzgzLjMzOEUtMjE1OTU0MTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxNzkgc3VidHJhY3QgLTYzMDMwOTM2NiAtODg0NzgzLjMzOEUtMjE1OTU0MTAgLT4gLTYzMDMwOTM2NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODAgYWRkIDYxMy4yMDc3NzQgLTMwMDcuNzg2MDggLT4gLTIzOTQuNTc4MzEgSW5leGFjdCBSb3VuZGVkCit4Y29tMTgwIGNvbXBhcmUgNjEzLjIwNzc3NCAtMzAwNy43ODYwOCAtPiAxCit4ZGl2MTgwIGRpdmlkZSA2MTMuMjA3Nzc0IC0zMDA3Ljc4NjA4IC0+IC0wLjIwMzg3MzQ2NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxODAgZGl2aWRlaW50IDYxMy4yMDc3NzQgLTMwMDcuNzg2MDggLT4gLTAKK3htdWwxODAgbXVsdGlwbHkgNjEzLjIwNzc3NCAtMzAwNy43ODYwOCAtPiAtMTg0NDM5Ny44MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxODAgcG93ZXIgNjEzLjIwNzc3NCAtMzAwOCAtPiA3LjUxOTM5MTYwRS04Mzg2IEluZXhhY3QgUm91bmRlZAoreHJlbTE4MCByZW1haW5kZXIgNjEzLjIwNzc3NCAtMzAwNy43ODYwOCAtPiA2MTMuMjA3Nzc0Cit4c3ViMTgwIHN1YnRyYWN0IDYxMy4yMDc3NzQgLTMwMDcuNzg2MDggLT4gMzYyMC45OTM4NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODEgYWRkIC05MzAwNjIyMi4zIC0zLjA4OTY0NjE5IC0+IC05MzAwNjIyNS40IEluZXhhY3QgUm91bmRlZAoreGNvbTE4MSBjb21wYXJlIC05MzAwNjIyMi4zIC0zLjA4OTY0NjE5IC0+IC0xCit4ZGl2MTgxIGRpdmlkZSAtOTMwMDYyMjIuMyAtMy4wODk2NDYxOSAtPiAzMDEwMjU0Ny45IEluZXhhY3QgUm91bmRlZAoreGR2aTE4MSBkaXZpZGVpbnQgLTkzMDA2MjIyLjMgLTMuMDg5NjQ2MTkgLT4gMzAxMDI1NDcKK3htdWwxODEgbXVsdGlwbHkgLTkzMDA2MjIyLjMgLTMuMDg5NjQ2MTkgLT4gMjg3MzU2MzIwIEluZXhhY3QgUm91bmRlZAoreHBvdzE4MSBwb3dlciAtOTMwMDYyMjIuMyAtMyAtPiAtMS4yNDI5Nzk1NkUtMjQgSW5leGFjdCBSb3VuZGVkCit4cmVtMTgxIHJlbWFpbmRlciAtOTMwMDYyMjIuMyAtMy4wODk2NDYxOSAtPiAtMi42NTIxNTQwNworeHN1YjE4MSBzdWJ0cmFjdCAtOTMwMDYyMjIuMyAtMy4wODk2NDYxOSAtPiAtOTMwMDYyMTkuMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODIgYWRkIC0xODExNi4wNjIxIDM0MDk2LjMwNkUtMjcwMzQ3MDkyIC0+IC0xODExNi4wNjIxIEluZXhhY3QgUm91bmRlZAoreGNvbTE4MiBjb21wYXJlIC0xODExNi4wNjIxIDM0MDk2LjMwNkUtMjcwMzQ3MDkyIC0+IC0xCit4ZGl2MTgyIGRpdmlkZSAtMTgxMTYuMDYyMSAzNDA5Ni4zMDZFLTI3MDM0NzA5MiAtPiAtNS4zMTMyMDM3NUUrMjcwMzQ3MDkxIEluZXhhY3QgUm91bmRlZAoreGR2aTE4MiBkaXZpZGVpbnQgLTE4MTE2LjA2MjEgMzQwOTYuMzA2RS0yNzAzNDcwOTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxODIgbXVsdGlwbHkgLTE4MTE2LjA2MjEgMzQwOTYuMzA2RS0yNzAzNDcwOTIgLT4gLTYuMTc2OTA3OTdFLTI3MDM0NzA4NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxODIgcG93ZXIgLTE4MTE2LjA2MjEgMyAtPiAtNS45NDU1NDEzM0UrMTIgSW5leGFjdCBSb3VuZGVkCit4cmVtMTgyIHJlbWFpbmRlciAtMTgxMTYuMDYyMSAzNDA5Ni4zMDZFLTI3MDM0NzA5MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE4MiBzdWJ0cmFjdCAtMTgxMTYuMDYyMSAzNDA5Ni4zMDZFLTI3MDM0NzA5MiAtPiAtMTgxMTYuMDYyMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODMgYWRkIDE5MjcyMzg2LjkgLTQxMDQ0MjM3OS4gLT4gLTM5MTE2OTk5MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20xODMgY29tcGFyZSAxOTI3MjM4Ni45IC00MTA0NDIzNzkuIC0+IDEKK3hkaXYxODMgZGl2aWRlIDE5MjcyMzg2LjkgLTQxMDQ0MjM3OS4gLT4gLTAuMDQ2OTU1MTU4NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxODMgZGl2aWRlaW50IDE5MjcyMzg2LjkgLTQxMDQ0MjM3OS4gLT4gLTAKK3htdWwxODMgbXVsdGlwbHkgMTkyNzIzODYuOSAtNDEwNDQyMzc5LiAtPiAtNy45MTAyMDQzM0UrMTUgSW5leGFjdCBSb3VuZGVkCit4cG93MTgzIHBvd2VyIDE5MjcyMzg2LjkgLTQxMDQ0MjM3OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0xODMgcmVtYWluZGVyIDE5MjcyMzg2LjkgLTQxMDQ0MjM3OS4gLT4gMTkyNzIzODYuOQoreHN1YjE4MyBzdWJ0cmFjdCAxOTI3MjM4Ni45IC00MTA0NDIzNzkuIC0+IDQyOTcxNDc2NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODQgYWRkIDQxODAuMzA4MjEgLTEuNjQzOTU0M0UtNjI0NzU5MTA0IC0+IDQxODAuMzA4MjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMTg0IGNvbXBhcmUgNDE4MC4zMDgyMSAtMS42NDM5NTQzRS02MjQ3NTkxMDQgLT4gMQoreGRpdjE4NCBkaXZpZGUgNDE4MC4zMDgyMSAtMS42NDM5NTQzRS02MjQ3NTkxMDQgLT4gLTIuNTQyODM3MjRFKzYyNDc1OTEwNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxODQgZGl2aWRlaW50IDQxODAuMzA4MjEgLTEuNjQzOTU0M0UtNjI0NzU5MTA0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTg0IG11bHRpcGx5IDQxODAuMzA4MjEgLTEuNjQzOTU0M0UtNjI0NzU5MTA0IC0+IC02Ljg3MjIzNTY2RS02MjQ3NTkxMDEgSW5leGFjdCBSb3VuZGVkCit4cG93MTg0IHBvd2VyIDQxODAuMzA4MjEgLTIgLT4gNS43MjI0NjgyOEUtOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xODQgcmVtYWluZGVyIDQxODAuMzA4MjEgLTEuNjQzOTU0M0UtNjI0NzU5MTA0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTg0IHN1YnRyYWN0IDQxODAuMzA4MjEgLTEuNjQzOTU0M0UtNjI0NzU5MTA0IC0+IDQxODAuMzA4MjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMTg1IGFkZCA1NzEuNTM2NzI1IDM4OS44OTkyMjAgLT4gOTYxLjQzNTk0NQoreGNvbTE4NSBjb21wYXJlIDU3MS41MzY3MjUgMzg5Ljg5OTIyMCAtPiAxCit4ZGl2MTg1IGRpdmlkZSA1NzEuNTM2NzI1IDM4OS44OTkyMjAgLT4gMS40NjU4NTc1NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxODUgZGl2aWRlaW50IDU3MS41MzY3MjUgMzg5Ljg5OTIyMCAtPiAxCit4bXVsMTg1IG11bHRpcGx5IDU3MS41MzY3MjUgMzg5Ljg5OTIyMCAtPiAyMjI4NDEuNzIzIEluZXhhY3QgUm91bmRlZAoreHBvdzE4NSBwb3dlciA1NzEuNTM2NzI1IDM5MCAtPiAxLjc2NjkxMzczRSsxMDc1IEluZXhhY3QgUm91bmRlZAoreHJlbTE4NSByZW1haW5kZXIgNTcxLjUzNjcyNSAzODkuODk5MjIwIC0+IDE4MS42Mzc1MDUKK3hzdWIxODUgc3VidHJhY3QgNTcxLjUzNjcyNSAzODkuODk5MjIwIC0+IDE4MS42Mzc1MDUKK3hhZGQxODYgYWRkIC02MjIwMDczMDYuRSsxNTk5MjQ4ODYgLTEyNi45NzE3NDUgLT4gLTYuMjIwMDczMDZFKzE1OTkyNDg5NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xODYgY29tcGFyZSAtNjIyMDA3MzA2LkUrMTU5OTI0ODg2IC0xMjYuOTcxNzQ1IC0+IC0xCit4ZGl2MTg2IGRpdmlkZSAtNjIyMDA3MzA2LkUrMTU5OTI0ODg2IC0xMjYuOTcxNzQ1IC0+IDQuODk4Nzg1MjFFKzE1OTkyNDg5MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxODYgZGl2aWRlaW50IC02MjIwMDczMDYuRSsxNTk5MjQ4ODYgLTEyNi45NzE3NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxODYgbXVsdGlwbHkgLTYyMjAwNzMwNi5FKzE1OTkyNDg4NiAtMTI2Ljk3MTc0NSAtPiA3Ljg5NzczNTMwRSsxNTk5MjQ4OTYgSW5leGFjdCBSb3VuZGVkCit4cG93MTg2IHBvd2VyIC02MjIwMDczMDYuRSsxNTk5MjQ4ODYgLTEyNyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTg2IHJlbWFpbmRlciAtNjIyMDA3MzA2LkUrMTU5OTI0ODg2IC0xMjYuOTcxNzQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTg2IHN1YnRyYWN0IC02MjIwMDczMDYuRSsxNTk5MjQ4ODYgLTEyNi45NzE3NDUgLT4gLTYuMjIwMDczMDZFKzE1OTkyNDg5NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODcgYWRkIC0yOS4zNTY1NTFFLTI4MjgxNjEzOSAzNzE0MTc0OEUtOTAzMzk3ODIxIC0+IC0yLjkzNTY1NTEwRS0yODI4MTYxMzggSW5leGFjdCBSb3VuZGVkCit4Y29tMTg3IGNvbXBhcmUgLTI5LjM1NjU1MUUtMjgyODE2MTM5IDM3MTQxNzQ4RS05MDMzOTc4MjEgLT4gLTEKK3hkaXYxODcgZGl2aWRlIC0yOS4zNTY1NTFFLTI4MjgxNjEzOSAzNzE0MTc0OEUtOTAzMzk3ODIxIC0+IC03LjkwMzkyMjgzRSs2MjA1ODE2NzUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTg3IGRpdmlkZWludCAtMjkuMzU2NTUxRS0yODI4MTYxMzkgMzcxNDE3NDhFLTkwMzM5NzgyMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE4NyBtdWx0aXBseSAtMjkuMzU2NTUxRS0yODI4MTYxMzkgMzcxNDE3NDhFLTkwMzM5NzgyMSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cG93MTg3IHBvd2VyIC0yOS4zNTY1NTFFLTI4MjgxNjEzOSA0IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE4NyByZW1haW5kZXIgLTI5LjM1NjU1MUUtMjgyODE2MTM5IDM3MTQxNzQ4RS05MDMzOTc4MjEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxODcgc3VidHJhY3QgLTI5LjM1NjU1MUUtMjgyODE2MTM5IDM3MTQxNzQ4RS05MDMzOTc4MjEgLT4gLTIuOTM1NjU1MTBFLTI4MjgxNjEzOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxODggYWRkIDkyNDI3NDQyLjQgNjc0MzM0ODk4LiAtPiA3NjY3NjIzNDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMTg4IGNvbXBhcmUgOTI0Mjc0NDIuNCA2NzQzMzQ4OTguIC0+IC0xCit4ZGl2MTg4IGRpdmlkZSA5MjQyNzQ0Mi40IDY3NDMzNDg5OC4gLT4gMC4xMzcwNjQ1OTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTg4IGRpdmlkZWludCA5MjQyNzQ0Mi40IDY3NDMzNDg5OC4gLT4gMAoreG11bDE4OCBtdWx0aXBseSA5MjQyNzQ0Mi40IDY3NDMzNDg5OC4gLT4gNi4yMzI3MDQ5OUUrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MTg4IHBvd2VyIDkyNDI3NDQyLjQgNjc0MzM0ODk4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTE4OCByZW1haW5kZXIgOTI0Mjc0NDIuNCA2NzQzMzQ4OTguIC0+IDkyNDI3NDQyLjQKK3hzdWIxODggc3VidHJhY3QgOTI0Mjc0NDIuNCA2NzQzMzQ4OTguIC0+IC01ODE5MDc0NTYgSW5leGFjdCBSb3VuZGVkCit4YWRkMTg5IGFkZCA0NDY1MTg5NS43IC05MTA1MDguNDM4IC0+IDQzNzQxMzg3LjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMTg5IGNvbXBhcmUgNDQ2NTE4OTUuNyAtOTEwNTA4LjQzOCAtPiAxCit4ZGl2MTg5IGRpdmlkZSA0NDY1MTg5NS43IC05MTA1MDguNDM4IC0+IC00OS4wNDA2MTcxIEluZXhhY3QgUm91bmRlZAoreGR2aTE4OSBkaXZpZGVpbnQgNDQ2NTE4OTUuNyAtOTEwNTA4LjQzOCAtPiAtNDkKK3htdWwxODkgbXVsdGlwbHkgNDQ2NTE4OTUuNyAtOTEwNTA4LjQzOCAtPiAtNC4wNjU1OTI3OEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MTg5IHBvd2VyIDQ0NjUxODk1LjcgLTkxMDUwOCAtPiAzLjcyMjY0Mjc3RS02OTY1MjQxIEluZXhhY3QgUm91bmRlZAoreHJlbTE4OSByZW1haW5kZXIgNDQ2NTE4OTUuNyAtOTEwNTA4LjQzOCAtPiAzNjk4Mi4yMzgKK3hzdWIxODkgc3VidHJhY3QgNDQ2NTE4OTUuNyAtOTEwNTA4LjQzOCAtPiA0NTU2MjQwNC4xIEluZXhhY3QgUm91bmRlZAoreGFkZDE5MCBhZGQgNjQ3ODk3ODcyLkUrMzc0MDIxNzkwIC00NjcuNDIzMDI5IC0+IDYuNDc4OTc4NzJFKzM3NDAyMTc5OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xOTAgY29tcGFyZSA2NDc4OTc4NzIuRSszNzQwMjE3OTAgLTQ2Ny40MjMwMjkgLT4gMQoreGRpdjE5MCBkaXZpZGUgNjQ3ODk3ODcyLkUrMzc0MDIxNzkwIC00NjcuNDIzMDI5IC0+IC0xLjM4NjEwNjAxRSszNzQwMjE3OTYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTkwIGRpdmlkZWludCA2NDc4OTc4NzIuRSszNzQwMjE3OTAgLTQ2Ny40MjMwMjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwxOTAgbXVsdGlwbHkgNjQ3ODk3ODcyLkUrMzc0MDIxNzkwIC00NjcuNDIzMDI5IC0+IC0zLjAyODQyMzg2RSszNzQwMjE4MDEgSW5leGFjdCBSb3VuZGVkCit4cG93MTkwIHBvd2VyIDY0Nzg5Nzg3Mi5FKzM3NDAyMTc5MCAtNDY3IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTE5MCByZW1haW5kZXIgNjQ3ODk3ODcyLkUrMzc0MDIxNzkwIC00NjcuNDIzMDI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMTkwIHN1YnRyYWN0IDY0Nzg5Nzg3Mi5FKzM3NDAyMTc5MCAtNDY3LjQyMzAyOSAtPiA2LjQ3ODk3ODcyRSszNzQwMjE3OTggSW5leGFjdCBSb3VuZGVkCit4YWRkMTkxIGFkZCAyNS4yNTkyMTQ5IDU5LjA0MzY5ODEgLT4gODQuMzAyOTEzMAoreGNvbTE5MSBjb21wYXJlIDI1LjI1OTIxNDkgNTkuMDQzNjk4MSAtPiAtMQoreGRpdjE5MSBkaXZpZGUgMjUuMjU5MjE0OSA1OS4wNDM2OTgxIC0+IDAuNDI3ODA1NDM0IEluZXhhY3QgUm91bmRlZAoreGR2aTE5MSBkaXZpZGVpbnQgMjUuMjU5MjE0OSA1OS4wNDM2OTgxIC0+IDAKK3htdWwxOTEgbXVsdGlwbHkgMjUuMjU5MjE0OSA1OS4wNDM2OTgxIC0+IDE0OTEuMzk3NDYgSW5leGFjdCBSb3VuZGVkCit4cG93MTkxIHBvd2VyIDI1LjI1OTIxNDkgNTkgLT4gNS41MzA1ODQzNUUrODIgSW5leGFjdCBSb3VuZGVkCit4cmVtMTkxIHJlbWFpbmRlciAyNS4yNTkyMTQ5IDU5LjA0MzY5ODEgLT4gMjUuMjU5MjE0OQoreHN1YjE5MSBzdWJ0cmFjdCAyNS4yNTkyMTQ5IDU5LjA0MzY5ODEgLT4gLTMzLjc4NDQ4MzIKK3hhZGQxOTIgYWRkIC02Ljg1MDgzNSAtMTI3My40ODI0MCAtPiAtMTI4MC4zMzMyNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20xOTIgY29tcGFyZSAtNi44NTA4MzUgLTEyNzMuNDgyNDAgLT4gMQoreGRpdjE5MiBkaXZpZGUgLTYuODUwODM1IC0xMjczLjQ4MjQwIC0+IDAuMDA1Mzc5NjA3MTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMTkyIGRpdmlkZWludCAtNi44NTA4MzUgLTEyNzMuNDgyNDAgLT4gMAoreG11bDE5MiBtdWx0aXBseSAtNi44NTA4MzUgLTEyNzMuNDgyNDAgLT4gODcyNC40MTc4MCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTIgcG93ZXIgLTYuODUwODM1IC0xMjczIC0+IC0xLjI1NDYyNjc4RS0xMDY0IEluZXhhY3QgUm91bmRlZAoreHJlbTE5MiByZW1haW5kZXIgLTYuODUwODM1IC0xMjczLjQ4MjQwIC0+IC02Ljg1MDgzNQoreHN1YjE5MiBzdWJ0cmFjdCAtNi44NTA4MzUgLTEyNzMuNDgyNDAgLT4gMTI2Ni42MzE1NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxOTMgYWRkIDE3NC4yNzIzMjUgNTYzOC4xNjIyOSAtPiA1ODEyLjQzNDYyIEluZXhhY3QgUm91bmRlZAoreGNvbTE5MyBjb21wYXJlIDE3NC4yNzIzMjUgNTYzOC4xNjIyOSAtPiAtMQoreGRpdjE5MyBkaXZpZGUgMTc0LjI3MjMyNSA1NjM4LjE2MjI5IC0+IDAuMDMwOTA5NDE5OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTMgZGl2aWRlaW50IDE3NC4yNzIzMjUgNTYzOC4xNjIyOSAtPiAwCit4bXVsMTkzIG11bHRpcGx5IDE3NC4yNzIzMjUgNTYzOC4xNjIyOSAtPiA5ODI1NzUuNjUxIEluZXhhY3QgUm91bmRlZAoreHBvdzE5MyBwb3dlciAxNzQuMjcyMzI1IDU2MzggLT4gMS4xMTEzNzcyNEUrMTI2MzYgSW5leGFjdCBSb3VuZGVkCit4cmVtMTkzIHJlbWFpbmRlciAxNzQuMjcyMzI1IDU2MzguMTYyMjkgLT4gMTc0LjI3MjMyNQoreHN1YjE5MyBzdWJ0cmFjdCAxNzQuMjcyMzI1IDU2MzguMTYyMjkgLT4gLTU0NjMuODg5OTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMTk0IGFkZCAzNDU1NjI5Ljc2IC04LjI3MzMyMzIyIC0+IDM0NTU2MjEuNDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTk0IGNvbXBhcmUgMzQ1NTYyOS43NiAtOC4yNzMzMjMyMiAtPiAxCit4ZGl2MTk0IGRpdmlkZSAzNDU1NjI5Ljc2IC04LjI3MzMyMzIyIC0+IC00MTc2ODMuMzk5IEluZXhhY3QgUm91bmRlZAoreGR2aTE5NCBkaXZpZGVpbnQgMzQ1NTYyOS43NiAtOC4yNzMzMjMyMiAtPiAtNDE3NjgzCit4bXVsMTk0IG11bHRpcGx5IDM0NTU2MjkuNzYgLTguMjczMzIzMjIgLT4gLTI4NTg5NTQxLjkgSW5leGFjdCBSb3VuZGVkCit4cG93MTk0IHBvd2VyIDM0NTU2MjkuNzYgLTggLT4gNC45MTc5MzAxNUUtNTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMTk0IHJlbWFpbmRlciAzNDU1NjI5Ljc2IC04LjI3MzMyMzIyIC0+IDMuMjk3NTAwNzQKK3hzdWIxOTQgc3VidHJhY3QgMzQ1NTYyOS43NiAtOC4yNzMzMjMyMiAtPiAzNDU1NjM4LjAzIEluZXhhY3QgUm91bmRlZAoreGFkZDE5NSBhZGQgLTkyNDMzNzcyM0UtNjQwNzcxMjM1IDg2NjM5Mzc3LjEgLT4gODY2MzkzNzcuMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20xOTUgY29tcGFyZSAtOTI0MzM3NzIzRS02NDA3NzEyMzUgODY2MzkzNzcuMSAtPiAtMQoreGRpdjE5NSBkaXZpZGUgLTkyNDMzNzcyM0UtNjQwNzcxMjM1IDg2NjM5Mzc3LjEgLT4gLTEuMDY2ODc5NDdFLTY0MDc3MTIzNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTUgZGl2aWRlaW50IC05MjQzMzc3MjNFLTY0MDc3MTIzNSA4NjYzOTM3Ny4xIC0+IC0wCit4bXVsMTk1IG11bHRpcGx5IC05MjQzMzc3MjNFLTY0MDc3MTIzNSA4NjYzOTM3Ny4xIC0+IC04LjAwODQwNDQ2RS02NDA3NzEyMTkgSW5leGFjdCBSb3VuZGVkCit4cG93MTk1IHBvd2VyIC05MjQzMzc3MjNFLTY0MDc3MTIzNSA4NjYzOTM3NyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMTk1IHJlbWFpbmRlciAtOTI0MzM3NzIzRS02NDA3NzEyMzUgODY2MzkzNzcuMSAtPiAtOS4yNDMzNzcyM0UtNjQwNzcxMjI3Cit4c3ViMTk1IHN1YnRyYWN0IC05MjQzMzc3MjNFLTY0MDc3MTIzNSA4NjYzOTM3Ny4xIC0+IC04NjYzOTM3Ny4xIEluZXhhY3QgUm91bmRlZAoreGFkZDE5NiBhZGQgLTYyMDIzNjkzMi5FKzY1NjgyMzk2OSAzMzY0NzIyLjczIC0+IC02LjIwMjM2OTMyRSs2NTY4MjM5NzcgSW5leGFjdCBSb3VuZGVkCit4Y29tMTk2IGNvbXBhcmUgLTYyMDIzNjkzMi5FKzY1NjgyMzk2OSAzMzY0NzIyLjczIC0+IC0xCit4ZGl2MTk2IGRpdmlkZSAtNjIwMjM2OTMyLkUrNjU2ODIzOTY5IDMzNjQ3MjIuNzMgLT4gLTEuODQzMzUyMjhFKzY1NjgyMzk3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTYgZGl2aWRlaW50IC02MjAyMzY5MzIuRSs2NTY4MjM5NjkgMzM2NDcyMi43MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDE5NiBtdWx0aXBseSAtNjIwMjM2OTMyLkUrNjU2ODIzOTY5IDMzNjQ3MjIuNzMgLT4gLTIuMDg2OTI1MzBFKzY1NjgyMzk4NCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cxOTYgcG93ZXIgLTYyMDIzNjkzMi5FKzY1NjgyMzk2OSAzMzY0NzIzIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0xOTYgcmVtYWluZGVyIC02MjAyMzY5MzIuRSs2NTY4MjM5NjkgMzM2NDcyMi43MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjE5NiBzdWJ0cmFjdCAtNjIwMjM2OTMyLkUrNjU2ODIzOTY5IDMzNjQ3MjIuNzMgLT4gLTYuMjAyMzY5MzJFKzY1NjgyMzk3NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxOTcgYWRkIDkuMTAwMjUwNzkgNzAyNzc3ODgyRS04MTkyMjM0IC0+IDkuMTAwMjUwNzkgSW5leGFjdCBSb3VuZGVkCit4Y29tMTk3IGNvbXBhcmUgOS4xMDAyNTA3OSA3MDI3Nzc4ODJFLTgxOTIyMzQgLT4gMQoreGRpdjE5NyBkaXZpZGUgOS4xMDAyNTA3OSA3MDI3Nzc4ODJFLTgxOTIyMzQgLT4gMS4yOTQ4OTcxNUUrODE5MjIyNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTcgZGl2aWRlaW50IDkuMTAwMjUwNzkgNzAyNzc3ODgyRS04MTkyMjM0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMTk3IG11bHRpcGx5IDkuMTAwMjUwNzkgNzAyNzc3ODgyRS04MTkyMjM0IC0+IDYuMzk1NDU0OThFLTgxOTIyMjUgSW5leGFjdCBSb3VuZGVkCit4cG93MTk3IHBvd2VyIDkuMTAwMjUwNzkgNyAtPiA1MTY4NjA3LjE5IEluZXhhY3QgUm91bmRlZAoreHJlbTE5NyByZW1haW5kZXIgOS4xMDAyNTA3OSA3MDI3Nzc4ODJFLTgxOTIyMzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIxOTcgc3VidHJhY3QgOS4xMDAyNTA3OSA3MDI3Nzc4ODJFLTgxOTIyMzQgLT4gOS4xMDAyNTA3OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxOTggYWRkIC0xODg1NzUzOS45IDgxMzAxMzEyOS4gLT4gNzk0MTU1NTg5IEluZXhhY3QgUm91bmRlZAoreGNvbTE5OCBjb21wYXJlIC0xODg1NzUzOS45IDgxMzAxMzEyOS4gLT4gLTEKK3hkaXYxOTggZGl2aWRlIC0xODg1NzUzOS45IDgxMzAxMzEyOS4gLT4gLTAuMDIzMTk0NjMxNSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkxOTggZGl2aWRlaW50IC0xODg1NzUzOS45IDgxMzAxMzEyOS4gLT4gLTAKK3htdWwxOTggbXVsdGlwbHkgLTE4ODU3NTM5LjkgODEzMDEzMTI5LiAtPiAtMS41MzMxNDI3NUUrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93MTk4IHBvd2VyIC0xODg1NzUzOS45IDgxMzAxMzEyOSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMTk4IHJlbWFpbmRlciAtMTg4NTc1MzkuOSA4MTMwMTMxMjkuIC0+IC0xODg1NzUzOS45Cit4c3ViMTk4IHN1YnRyYWN0IC0xODg1NzUzOS45IDgxMzAxMzEyOS4gLT4gLTgzMTg3MDY2OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQxOTkgYWRkIC04LjI5NTMwMzI3IDMyNDM0MTkuNTdFKzM1Njg4MzMyIC0+IDMuMjQzNDE5NTdFKzM1Njg4MzM4IEluZXhhY3QgUm91bmRlZAoreGNvbTE5OSBjb21wYXJlIC04LjI5NTMwMzI3IDMyNDM0MTkuNTdFKzM1Njg4MzMyIC0+IC0xCit4ZGl2MTk5IGRpdmlkZSAtOC4yOTUzMDMyNyAzMjQzNDE5LjU3RSszNTY4ODMzMiAtPiAtMi41NTc1Nzk0NkUtMzU2ODgzMzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMTk5IGRpdmlkZWludCAtOC4yOTUzMDMyNyAzMjQzNDE5LjU3RSszNTY4ODMzMiAtPiAtMAoreG11bDE5OSBtdWx0aXBseSAtOC4yOTUzMDMyNyAzMjQzNDE5LjU3RSszNTY4ODMzMiAtPiAtMi42OTA1MTQ5MEUrMzU2ODgzMzkgSW5leGFjdCBSb3VuZGVkCit4cG93MTk5IHBvd2VyIC04LjI5NTMwMzI3IDMgLT4gLTU3MC44MTY4NzYgSW5leGFjdCBSb3VuZGVkCit4cmVtMTk5IHJlbWFpbmRlciAtOC4yOTUzMDMyNyAzMjQzNDE5LjU3RSszNTY4ODMzMiAtPiAtOC4yOTUzMDMyNworeHN1YjE5OSBzdWJ0cmFjdCAtOC4yOTUzMDMyNyAzMjQzNDE5LjU3RSszNTY4ODMzMiAtPiAtMy4yNDM0MTk1N0UrMzU2ODgzMzggSW5leGFjdCBSb3VuZGVkCit4YWRkMjAwIGFkZCAtNTcxMDE2ODMuNSA3NjM1NTEzNDFFKzk5MTQ5MTcxMiAtPiA3LjYzNTUxMzQxRSs5OTE0OTE3MjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjAwIGNvbXBhcmUgLTU3MTAxNjgzLjUgNzYzNTUxMzQxRSs5OTE0OTE3MTIgLT4gLTEKK3hkaXYyMDAgZGl2aWRlIC01NzEwMTY4My41IDc2MzU1MTM0MUUrOTkxNDkxNzEyIC0+IC03LjQ3ODQzNDA1RS05OTE0OTE3MTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjAwIGRpdmlkZWludCAtNTcxMDE2ODMuNSA3NjM1NTEzNDFFKzk5MTQ5MTcxMiAtPiAtMAoreG11bDIwMCBtdWx0aXBseSAtNTcxMDE2ODMuNSA3NjM1NTEzNDFFKzk5MTQ5MTcxMiAtPiAtNC4zNjAwMDY3MEUrOTkxNDkxNzI4IEluZXhhY3QgUm91bmRlZAoreHBvdzIwMCBwb3dlciAtNTcxMDE2ODMuNSA4IC0+IDEuMTMwMjkzNjhFKzYyIEluZXhhY3QgUm91bmRlZAoreHJlbTIwMCByZW1haW5kZXIgLTU3MTAxNjgzLjUgNzYzNTUxMzQxRSs5OTE0OTE3MTIgLT4gLTU3MTAxNjgzLjUKK3hzdWIyMDAgc3VidHJhY3QgLTU3MTAxNjgzLjUgNzYzNTUxMzQxRSs5OTE0OTE3MTIgLT4gLTcuNjM1NTEzNDFFKzk5MTQ5MTcyMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMDEgYWRkIC02MDMzMjYuNzQwIDE3MTAuOTUxODMgLT4gLTYwMTYxNS43ODggSW5leGFjdCBSb3VuZGVkCit4Y29tMjAxIGNvbXBhcmUgLTYwMzMyNi43NDAgMTcxMC45NTE4MyAtPiAtMQoreGRpdjIwMSBkaXZpZGUgLTYwMzMyNi43NDAgMTcxMC45NTE4MyAtPiAtMzUyLjYyNjM3NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMDEgZGl2aWRlaW50IC02MDMzMjYuNzQwIDE3MTAuOTUxODMgLT4gLTM1MgoreG11bDIwMSBtdWx0aXBseSAtNjAzMzI2Ljc0MCAxNzEwLjk1MTgzIC0+IC0xLjAzMjI2Mjk5RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzIwMSBwb3dlciAtNjAzMzI2Ljc0MCAxNzExIC0+IC0zLjM1MzE1OTc2RSs5ODkwIEluZXhhY3QgUm91bmRlZAoreHJlbTIwMSByZW1haW5kZXIgLTYwMzMyNi43NDAgMTcxMC45NTE4MyAtPiAtMTA3MS42OTU4NAoreHN1YjIwMSBzdWJ0cmFjdCAtNjAzMzI2Ljc0MCAxNzEwLjk1MTgzIC0+IC02MDUwMzcuNjkyIEluZXhhY3QgUm91bmRlZAoreGFkZDIwMiBhZGQgLTQ4MTQyNzYzLjMgLTk0MzQzNDExNCAtPiAtOTkxNTc2ODc3IEluZXhhY3QgUm91bmRlZAoreGNvbTIwMiBjb21wYXJlIC00ODE0Mjc2My4zIC05NDM0MzQxMTQgLT4gMQoreGRpdjIwMiBkaXZpZGUgLTQ4MTQyNzYzLjMgLTk0MzQzNDExNCAtPiAwLjA1MTAyOTI3OTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjAyIGRpdmlkZWludCAtNDgxNDI3NjMuMyAtOTQzNDM0MTE0IC0+IDAKK3htdWwyMDIgbXVsdGlwbHkgLTQ4MTQyNzYzLjMgLTk0MzQzNDExNCAtPiA0LjU0MTk1MjUyRSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMDIgcG93ZXIgLTQ4MTQyNzYzLjMgLTk0MzQzNDExNCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yMDIgcmVtYWluZGVyIC00ODE0Mjc2My4zIC05NDM0MzQxMTQgLT4gLTQ4MTQyNzYzLjMKK3hzdWIyMDIgc3VidHJhY3QgLTQ4MTQyNzYzLjMgLTk0MzQzNDExNCAtPiA4OTUyOTEzNTEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjAzIGFkZCAtMjA0LjU4Njc2NyAtMjM1LjUzMTg0NyAtPiAtNDQwLjExODYxNAoreGNvbTIwMyBjb21wYXJlIC0yMDQuNTg2NzY3IC0yMzUuNTMxODQ3IC0+IDEKK3hkaXYyMDMgZGl2aWRlIC0yMDQuNTg2NzY3IC0yMzUuNTMxODQ3IC0+IDAuODY4NjE2MTU0IEluZXhhY3QgUm91bmRlZAoreGR2aTIwMyBkaXZpZGVpbnQgLTIwNC41ODY3NjcgLTIzNS41MzE4NDcgLT4gMAoreG11bDIwMyBtdWx0aXBseSAtMjA0LjU4Njc2NyAtMjM1LjUzMTg0NyAtPiA0ODE4Ni42OTkxIEluZXhhY3QgUm91bmRlZAoreHBvdzIwMyBwb3dlciAtMjA0LjU4Njc2NyAtMjM2IC0+IDQuMjk0MzgyMjJFLTU0NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMDMgcmVtYWluZGVyIC0yMDQuNTg2NzY3IC0yMzUuNTMxODQ3IC0+IC0yMDQuNTg2NzY3Cit4c3ViMjAzIHN1YnRyYWN0IC0yMDQuNTg2NzY3IC0yMzUuNTMxODQ3IC0+IDMwLjk0NTA4MAoreGFkZDIwNCBhZGQgLTcwLjM4MDU1ODEgODMwMTM3LjkxMyAtPiA4MzAwNjcuNTMyIEluZXhhY3QgUm91bmRlZAoreGNvbTIwNCBjb21wYXJlIC03MC4zODA1NTgxIDgzMDEzNy45MTMgLT4gLTEKK3hkaXYyMDQgZGl2aWRlIC03MC4zODA1NTgxIDgzMDEzNy45MTMgLT4gLTAuMDAwMDg0NzgxNzY1OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMDQgZGl2aWRlaW50IC03MC4zODA1NTgxIDgzMDEzNy45MTMgLT4gLTAKK3htdWwyMDQgbXVsdGlwbHkgLTcwLjM4MDU1ODEgODMwMTM3LjkxMyAtPiAtNTg0MjU1NjkuNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMDQgcG93ZXIgLTcwLjM4MDU1ODEgODMwMTM4IC0+IDQuOTUxNjU4NDFFKzE1MzM2NDAgSW5leGFjdCBSb3VuZGVkCit4cmVtMjA0IHJlbWFpbmRlciAtNzAuMzgwNTU4MSA4MzAxMzcuOTEzIC0+IC03MC4zODA1NTgxCit4c3ViMjA0IHN1YnRyYWN0IC03MC4zODA1NTgxIDgzMDEzNy45MTMgLT4gLTgzMDIwOC4yOTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMjA1IGFkZCAtODgxOC40NzYwNiAtNjA3NjYuNDU3MSAtPiAtNjk1ODQuOTMzMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMDUgY29tcGFyZSAtODgxOC40NzYwNiAtNjA3NjYuNDU3MSAtPiAxCit4ZGl2MjA1IGRpdmlkZSAtODgxOC40NzYwNiAtNjA3NjYuNDU3MSAtPiAwLjE0NTEyMDc4NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMDUgZGl2aWRlaW50IC04ODE4LjQ3NjA2IC02MDc2Ni40NTcxIC0+IDAKK3htdWwyMDUgbXVsdGlwbHkgLTg4MTguNDc2MDYgLTYwNzY2LjQ1NzEgLT4gNTM1ODY3NTQ3IEluZXhhY3QgUm91bmRlZAoreHBvdzIwNSBwb3dlciAtODgxOC40NzYwNiAtNjA3NjYgLT4gMS42NDQ4Nzc1NUUtMjM5NzQ2IEluZXhhY3QgUm91bmRlZAoreHJlbTIwNSByZW1haW5kZXIgLTg4MTguNDc2MDYgLTYwNzY2LjQ1NzEgLT4gLTg4MTguNDc2MDYKK3hzdWIyMDUgc3VidHJhY3QgLTg4MTguNDc2MDYgLTYwNzY2LjQ1NzEgLT4gNTE5NDcuOTgxMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMDYgYWRkIDM3MDYwOTI5LjNFLTE2ODQzOTUwOSAtNzk1NzY3MTcuMSAtPiAtNzk1NzY3MTcuMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMDYgY29tcGFyZSAzNzA2MDkyOS4zRS0xNjg0Mzk1MDkgLTc5NTc2NzE3LjEgLT4gMQoreGRpdjIwNiBkaXZpZGUgMzcwNjA5MjkuM0UtMTY4NDM5NTA5IC03OTU3NjcxNy4xIC0+IC00LjY1NzI1Nzg4RS0xNjg0Mzk1MTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjA2IGRpdmlkZWludCAzNzA2MDkyOS4zRS0xNjg0Mzk1MDkgLTc5NTc2NzE3LjEgLT4gLTAKK3htdWwyMDYgbXVsdGlwbHkgMzcwNjA5MjkuM0UtMTY4NDM5NTA5IC03OTU3NjcxNy4xIC0+IC0yLjk0OTE4NzA5RS0xNjg0Mzk0OTQgSW5leGFjdCBSb3VuZGVkCit4cG93MjA2IHBvd2VyIDM3MDYwOTI5LjNFLTE2ODQzOTUwOSAtNzk1NzY3MTcgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMjA2IHJlbWFpbmRlciAzNzA2MDkyOS4zRS0xNjg0Mzk1MDkgLTc5NTc2NzE3LjEgLT4gMy43MDYwOTI5M0UtMTY4NDM5NTAyCit4c3ViMjA2IHN1YnRyYWN0IDM3MDYwOTI5LjNFLTE2ODQzOTUwOSAtNzk1NzY3MTcuMSAtPiA3OTU3NjcxNy4xIEluZXhhY3QgUm91bmRlZAoreGFkZDIwNyBhZGQgLTY1NjI4NTMxMC4gLTEwNzIyMTQ2Mi4gLT4gLTc2MzUwNjc3MgoreGNvbTIwNyBjb21wYXJlIC02NTYyODUzMTAuIC0xMDcyMjE0NjIuIC0+IC0xCit4ZGl2MjA3IGRpdmlkZSAtNjU2Mjg1MzEwLiAtMTA3MjIxNDYyLiAtPiA2LjEyMDgzOTA0IEluZXhhY3QgUm91bmRlZAoreGR2aTIwNyBkaXZpZGVpbnQgLTY1NjI4NTMxMC4gLTEwNzIyMTQ2Mi4gLT4gNgoreG11bDIwNyBtdWx0aXBseSAtNjU2Mjg1MzEwLiAtMTA3MjIxNDYyLiAtPiA3LjAzNjc4NzA0RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMDcgcG93ZXIgLTY1NjI4NTMxMC4gLTEwNzIyMTQ2MiAtPiA4LjA1MzM4MDgwRS05NDUzODE1NjkgSW5leGFjdCBSb3VuZGVkCit4cmVtMjA3IHJlbWFpbmRlciAtNjU2Mjg1MzEwLiAtMTA3MjIxNDYyLiAtPiAtMTI5NTY1MzgKK3hzdWIyMDcgc3VidHJhY3QgLTY1NjI4NTMxMC4gLTEwNzIyMTQ2Mi4gLT4gLTU0OTA2Mzg0OAoreGFkZDIwOCBhZGQgNjUzMzk3LjEyNSA3MTk1LjMwOTkwIC0+IDY2MDU5Mi40MzUgSW5leGFjdCBSb3VuZGVkCit4Y29tMjA4IGNvbXBhcmUgNjUzMzk3LjEyNSA3MTk1LjMwOTkwIC0+IDEKK3hkaXYyMDggZGl2aWRlIDY1MzM5Ny4xMjUgNzE5NS4zMDk5MCAtPiA5MC44MDg3NTM4IEluZXhhY3QgUm91bmRlZAoreGR2aTIwOCBkaXZpZGVpbnQgNjUzMzk3LjEyNSA3MTk1LjMwOTkwIC0+IDkwCit4bXVsMjA4IG11bHRpcGx5IDY1MzM5Ny4xMjUgNzE5NS4zMDk5MCAtPiA0LjcwMTM5NDgwRSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzIwOCBwb3dlciA2NTMzOTcuMTI1IDcxOTUgLT4gMS41ODUyMjk4M0UrNDE4NDAgSW5leGFjdCBSb3VuZGVkCit4cmVtMjA4IHJlbWFpbmRlciA2NTMzOTcuMTI1IDcxOTUuMzA5OTAgLT4gNTgxOS4yMzQwMAoreHN1YjIwOCBzdWJ0cmFjdCA2NTMzOTcuMTI1IDcxOTUuMzA5OTAgLT4gNjQ2MjAxLjgxNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMDkgYWRkIDU2MjIxOTEwLjBFKzg1NzkwOTM3NCAtNTguNzI0NzkyOSAtPiA1LjYyMjE5MTAwRSs4NTc5MDkzODEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjA5IGNvbXBhcmUgNTYyMjE5MTAuMEUrODU3OTA5Mzc0IC01OC43MjQ3OTI5IC0+IDEKK3hkaXYyMDkgZGl2aWRlIDU2MjIxOTEwLjBFKzg1NzkwOTM3NCAtNTguNzI0NzkyOSAtPiAtOS41NzM3OTQ1MUUrODU3OTA5Mzc5IEluZXhhY3QgUm91bmRlZAoreGR2aTIwOSBkaXZpZGVpbnQgNTYyMjE5MTAuMEUrODU3OTA5Mzc0IC01OC43MjQ3OTI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjA5IG11bHRpcGx5IDU2MjIxOTEwLjBFKzg1NzkwOTM3NCAtNTguNzI0NzkyOSAtPiAtMy4zMDE2MjAwMkUrODU3OTA5MzgzIEluZXhhY3QgUm91bmRlZAoreHBvdzIwOSBwb3dlciA1NjIyMTkxMC4wRSs4NTc5MDkzNzQgLTU5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTIwOSByZW1haW5kZXIgNTYyMjE5MTAuMEUrODU3OTA5Mzc0IC01OC43MjQ3OTI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjA5IHN1YnRyYWN0IDU2MjIxOTEwLjBFKzg1NzkwOTM3NCAtNTguNzI0NzkyOSAtPiA1LjYyMjE5MTAwRSs4NTc5MDkzODEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjEwIGFkZCA4MDk4NjI4NTlFKzY0Mzc2OTk3NCAtNS4wNjc4NDAxNiAtPiA4LjA5ODYyODU5RSs2NDM3Njk5ODIgSW5leGFjdCBSb3VuZGVkCit4Y29tMjEwIGNvbXBhcmUgODA5ODYyODU5RSs2NDM3Njk5NzQgLTUuMDY3ODQwMTYgLT4gMQoreGRpdjIxMCBkaXZpZGUgODA5ODYyODU5RSs2NDM3Njk5NzQgLTUuMDY3ODQwMTYgLT4gLTEuNTk4MDQzNDFFKzY0Mzc2OTk4MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMTAgZGl2aWRlaW50IDgwOTg2Mjg1OUUrNjQzNzY5OTc0IC01LjA2Nzg0MDE2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjEwIG11bHRpcGx5IDgwOTg2Mjg1OUUrNjQzNzY5OTc0IC01LjA2Nzg0MDE2IC0+IC00LjEwNDI1NTUyRSs2NDM3Njk5ODMgSW5leGFjdCBSb3VuZGVkCit4cG93MjEwIHBvd2VyIDgwOTg2Mjg1OUUrNjQzNzY5OTc0IC01IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTIxMCByZW1haW5kZXIgODA5ODYyODU5RSs2NDM3Njk5NzQgLTUuMDY3ODQwMTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMTAgc3VidHJhY3QgODA5ODYyODU5RSs2NDM3Njk5NzQgLTUuMDY3ODQwMTYgLT4gOC4wOTg2Mjg1OUUrNjQzNzY5OTgyIEluZXhhY3QgUm91bmRlZAoreGFkZDIxMSBhZGQgLTYyMDExLjQ1NjNFLTExNzU2MzI0MCAtNTcuMTczMTU4NkUrMTE1NjU3MjA0IC0+IC01LjcxNzMxNTg2RSsxMTU2NTcyMDUgSW5leGFjdCBSb3VuZGVkCit4Y29tMjExIGNvbXBhcmUgLTYyMDExLjQ1NjNFLTExNzU2MzI0MCAtNTcuMTczMTU4NkUrMTE1NjU3MjA0IC0+IDEKK3hkaXYyMTEgZGl2aWRlIC02MjAxMS40NTYzRS0xMTc1NjMyNDAgLTU3LjE3MzE1ODZFKzExNTY1NzIwNCAtPiAxLjA4NDYyNTM0RS0yMzMyMjA0NDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjExIGRpdmlkZWludCAtNjIwMTEuNDU2M0UtMTE3NTYzMjQwIC01Ny4xNzMxNTg2RSsxMTU2NTcyMDQgLT4gMAoreG11bDIxMSBtdWx0aXBseSAtNjIwMTEuNDU2M0UtMTE3NTYzMjQwIC01Ny4xNzMxNTg2RSsxMTU2NTcyMDQgLT4gMy41NDUzOTA4M0UtMTkwNjAzMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMTEgcG93ZXIgLTYyMDExLjQ1NjNFLTExNzU2MzI0MCAtNiAtPiAxLjc1ODYwNTQ2RSs3MDUzNzk0MTEgSW5leGFjdCBSb3VuZGVkCit4cmVtMjExIHJlbWFpbmRlciAtNjIwMTEuNDU2M0UtMTE3NTYzMjQwIC01Ny4xNzMxNTg2RSsxMTU2NTcyMDQgLT4gLTYuMjAxMTQ1NjNFLTExNzU2MzIzNgoreHN1YjIxMSBzdWJ0cmFjdCAtNjIwMTEuNDU2M0UtMTE3NTYzMjQwIC01Ny4xNzMxNTg2RSsxMTU2NTcyMDQgLT4gNS43MTczMTU4NkUrMTE1NjU3MjA1IEluZXhhY3QgUm91bmRlZAoreGFkZDIxMiBhZGQgMzE1LjMzMzUxIDkxNTg4LjgzN0UtNTM2MDIwMTQ5IC0+IDMxNS4zMzM1MTAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjEyIGNvbXBhcmUgMzE1LjMzMzUxIDkxNTg4LjgzN0UtNTM2MDIwMTQ5IC0+IDEKK3hkaXYyMTIgZGl2aWRlIDMxNS4zMzM1MSA5MTU4OC44MzdFLTUzNjAyMDE0OSAtPiAzLjQ0MjkyNTE1RSs1MzYwMjAxNDYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjEyIGRpdmlkZWludCAzMTUuMzMzNTEgOTE1ODguODM3RS01MzYwMjAxNDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMTIgbXVsdGlwbHkgMzE1LjMzMzUxIDkxNTg4LjgzN0UtNTM2MDIwMTQ5IC0+IDIuODg4MTAyOTRFLTUzNjAyMDE0MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMTIgcG93ZXIgMzE1LjMzMzUxIDkgLT4gMy4wODI2OTkwMkUrMjIgSW5leGFjdCBSb3VuZGVkCit4cmVtMjEyIHJlbWFpbmRlciAzMTUuMzMzNTEgOTE1ODguODM3RS01MzYwMjAxNDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMTIgc3VidHJhY3QgMzE1LjMzMzUxIDkxNTg4LjgzN0UtNTM2MDIwMTQ5IC0+IDMxNS4zMzM1MTAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjEzIGFkZCA3MzkuOTQ0NzEwIDIwMjk0OS4xNzUgLT4gMjAzNjg5LjEyMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTMgY29tcGFyZSA3MzkuOTQ0NzEwIDIwMjk0OS4xNzUgLT4gLTEKK3hkaXYyMTMgZGl2aWRlIDczOS45NDQ3MTAgMjAyOTQ5LjE3NSAtPiAwLjAwMzY0NTk2MDY3IEluZXhhY3QgUm91bmRlZAoreGR2aTIxMyBkaXZpZGVpbnQgNzM5Ljk0NDcxMCAyMDI5NDkuMTc1IC0+IDAKK3htdWwyMTMgbXVsdGlwbHkgNzM5Ljk0NDcxMCAyMDI5NDkuMTc1IC0+IDE1MDE3MTE2OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMTMgcG93ZXIgNzM5Ljk0NDcxMCAyMDI5NDkgLT4gMS4zMjYxMTcyOUUrNTgyMzAxIEluZXhhY3QgUm91bmRlZAoreHJlbTIxMyByZW1haW5kZXIgNzM5Ljk0NDcxMCAyMDI5NDkuMTc1IC0+IDczOS45NDQ3MTAKK3hzdWIyMTMgc3VidHJhY3QgNzM5Ljk0NDcxMCAyMDI5NDkuMTc1IC0+IC0yMDIyMDkuMjMwIEluZXhhY3QgUm91bmRlZAoreGFkZDIxNCBhZGQgODc2ODYuODAxNiA0MjA0ODkwLjQwIC0+IDQyOTI1NzcuMjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjE0IGNvbXBhcmUgODc2ODYuODAxNiA0MjA0ODkwLjQwIC0+IC0xCit4ZGl2MjE0IGRpdmlkZSA4NzY4Ni44MDE2IDQyMDQ4OTAuNDAgLT4gMC4wMjA4NTM1Mjg1IEluZXhhY3QgUm91bmRlZAoreGR2aTIxNCBkaXZpZGVpbnQgODc2ODYuODAxNiA0MjA0ODkwLjQwIC0+IDAKK3htdWwyMTQgbXVsdGlwbHkgODc2ODYuODAxNiA0MjA0ODkwLjQwIC0+IDMuNjg3MTMzOTBFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzIxNCBwb3dlciA4NzY4Ni44MDE2IDQyMDQ4OTAgLT4gNS4xNDg0Njk4MUUrMjA3ODQ0OTQgSW5leGFjdCBSb3VuZGVkCit4cmVtMjE0IHJlbWFpbmRlciA4NzY4Ni44MDE2IDQyMDQ4OTAuNDAgLT4gODc2ODYuODAxNgoreHN1YjIxNCBzdWJ0cmFjdCA4NzY4Ni44MDE2IDQyMDQ4OTAuNDAgLT4gLTQxMTcyMDMuNjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjE1IGFkZCA5ODcxMjY3MjEuRS03MjU3OTQ4MzQgNDg3NDE2Ni4yMyAtPiA0ODc0MTY2LjIzIEluZXhhY3QgUm91bmRlZAoreGNvbTIxNSBjb21wYXJlIDk4NzEyNjcyMS5FLTcyNTc5NDgzNCA0ODc0MTY2LjIzIC0+IC0xCit4ZGl2MjE1IGRpdmlkZSA5ODcxMjY3MjEuRS03MjU3OTQ4MzQgNDg3NDE2Ni4yMyAtPiAyLjAyNTIyMTcwRS03MjU3OTQ4MzIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjE1IGRpdmlkZWludCA5ODcxMjY3MjEuRS03MjU3OTQ4MzQgNDg3NDE2Ni4yMyAtPiAwCit4bXVsMjE1IG11bHRpcGx5IDk4NzEyNjcyMS5FLTcyNTc5NDgzNCA0ODc0MTY2LjIzIC0+IDQuODExNDE5NzNFLTcyNTc5NDgxOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMTUgcG93ZXIgOTg3MTI2NzIxLkUtNzI1Nzk0ODM0IDQ4NzQxNjYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjE1IHJlbWFpbmRlciA5ODcxMjY3MjEuRS03MjU3OTQ4MzQgNDg3NDE2Ni4yMyAtPiA5Ljg3MTI2NzIxRS03MjU3OTQ4MjYKK3hzdWIyMTUgc3VidHJhY3QgOTg3MTI2NzIxLkUtNzI1Nzk0ODM0IDQ4NzQxNjYuMjMgLT4gLTQ4NzQxNjYuMjMgSW5leGFjdCBSb3VuZGVkCit4YWRkMjE2IGFkZCA3MjgxNDg3MjYuRS02NjE2OTU5MzggMzI3OTguNTIwMiAtPiAzMjc5OC41MjAyIEluZXhhY3QgUm91bmRlZAoreGNvbTIxNiBjb21wYXJlIDcyODE0ODcyNi5FLTY2MTY5NTkzOCAzMjc5OC41MjAyIC0+IC0xCit4ZGl2MjE2IGRpdmlkZSA3MjgxNDg3MjYuRS02NjE2OTU5MzggMzI3OTguNTIwMiAtPiAyLjIyMDA2NTc5RS02NjE2OTU5MzQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjE2IGRpdmlkZWludCA3MjgxNDg3MjYuRS02NjE2OTU5MzggMzI3OTguNTIwMiAtPiAwCit4bXVsMjE2IG11bHRpcGx5IDcyODE0ODcyNi5FLTY2MTY5NTkzOCAzMjc5OC41MjAyIC0+IDIuMzg4MjIwMDdFLTY2MTY5NTkyNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMTYgcG93ZXIgNzI4MTQ4NzI2LkUtNjYxNjk1OTM4IDMyNzk5IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTIxNiByZW1haW5kZXIgNzI4MTQ4NzI2LkUtNjYxNjk1OTM4IDMyNzk4LjUyMDIgLT4gNy4yODE0ODcyNkUtNjYxNjk1OTMwCit4c3ViMjE2IHN1YnRyYWN0IDcyODE0ODcyNi5FLTY2MTY5NTkzOCAzMjc5OC41MjAyIC0+IC0zMjc5OC41MjAyIEluZXhhY3QgUm91bmRlZAoreGFkZDIxNyBhZGQgNzQyODIxOS45NyA2NjcuMzI2NzYwIC0+IDc0Mjg4ODcuMzAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjE3IGNvbXBhcmUgNzQyODIxOS45NyA2NjcuMzI2NzYwIC0+IDEKK3hkaXYyMTcgZGl2aWRlIDc0MjgyMTkuOTcgNjY3LjMyNjc2MCAtPiAxMTEzMS4zMDg0IEluZXhhY3QgUm91bmRlZAoreGR2aTIxNyBkaXZpZGVpbnQgNzQyODIxOS45NyA2NjcuMzI2NzYwIC0+IDExMTMxCit4bXVsMjE3IG11bHRpcGx5IDc0MjgyMTkuOTcgNjY3LjMyNjc2MCAtPiA0Ljk1NzA0OTk3RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzIxNyBwb3dlciA3NDI4MjE5Ljk3IDY2NyAtPiA3LjU4ODA4NTA5RSs0NTgyIEluZXhhY3QgUm91bmRlZAoreHJlbTIxNyByZW1haW5kZXIgNzQyODIxOS45NyA2NjcuMzI2NzYwIC0+IDIwNS44MDQ0NDAKK3hzdWIyMTcgc3VidHJhY3QgNzQyODIxOS45NyA2NjcuMzI2NzYwIC0+IDc0Mjc1NTIuNjQgSW5leGFjdCBSb3VuZGVkCit4YWRkMjE4IGFkZCAtNzI5MS4xOTIxMiAyMDkuNjQ5NjZFLTU4ODUyNjQ3NiAtPiAtNzI5MS4xOTIxMiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMTggY29tcGFyZSAtNzI5MS4xOTIxMiAyMDkuNjQ5NjZFLTU4ODUyNjQ3NiAtPiAtMQoreGRpdjIxOCBkaXZpZGUgLTcyOTEuMTkyMTIgMjA5LjY0OTY2RS01ODg1MjY0NzYgLT4gLTMuNDc3Nzk4MjFFKzU4ODUyNjQ3NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMTggZGl2aWRlaW50IC03MjkxLjE5MjEyIDIwOS42NDk2NkUtNTg4NTI2NDc2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjE4IG11bHRpcGx5IC03MjkxLjE5MjEyIDIwOS42NDk2NkUtNTg4NTI2NDc2IC0+IC0xLjUyODU5NTk1RS01ODg1MjY0NzAgSW5leGFjdCBSb3VuZGVkCit4cG93MjE4IHBvd2VyIC03MjkxLjE5MjEyIDIgLT4gNTMxNjE0ODIuNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMTggcmVtYWluZGVyIC03MjkxLjE5MjEyIDIwOS42NDk2NkUtNTg4NTI2NDc2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjE4IHN1YnRyYWN0IC03MjkxLjE5MjEyIDIwOS42NDk2NkUtNTg4NTI2NDc2IC0+IC03MjkxLjE5MjEyIEluZXhhY3QgUm91bmRlZAoreGFkZDIxOSBhZGQgLTM1OC4yNDU1MCAtNDQ0Ny43ODY3NUUrNjAxNDAyNTA5IC0+IC00LjQ0Nzc4Njc1RSs2MDE0MDI1MTIgSW5leGFjdCBSb3VuZGVkCit4Y29tMjE5IGNvbXBhcmUgLTM1OC4yNDU1MCAtNDQ0Ny43ODY3NUUrNjAxNDAyNTA5IC0+IDEKK3hkaXYyMTkgZGl2aWRlIC0zNTguMjQ1NTAgLTQ0NDcuNzg2NzVFKzYwMTQwMjUwOSAtPiA4LjA1NDQ2NjY0RS02MDE0MDI1MTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjE5IGRpdmlkZWludCAtMzU4LjI0NTUwIC00NDQ3Ljc4Njc1RSs2MDE0MDI1MDkgLT4gMAoreG11bDIxOSBtdWx0aXBseSAtMzU4LjI0NTUwIC00NDQ3Ljc4Njc1RSs2MDE0MDI1MDkgLT4gMS41OTMzOTk1OUUrNjAxNDAyNTE1IEluZXhhY3QgUm91bmRlZAoreHBvdzIxOSBwb3dlciAtMzU4LjI0NTUwIC00IC0+IDYuMDcxMjM0NzRFLTExIEluZXhhY3QgUm91bmRlZAoreHJlbTIxOSByZW1haW5kZXIgLTM1OC4yNDU1MCAtNDQ0Ny43ODY3NUUrNjAxNDAyNTA5IC0+IC0zNTguMjQ1NTAKK3hzdWIyMTkgc3VidHJhY3QgLTM1OC4yNDU1MCAtNDQ0Ny43ODY3NUUrNjAxNDAyNTA5IC0+IDQuNDQ3Nzg2NzVFKzYwMTQwMjUxMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMjAgYWRkIDExOC42MjE4MjYgLTIuNzIwMTAwMzggLT4gMTE1LjkwMTcyNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjAgY29tcGFyZSAxMTguNjIxODI2IC0yLjcyMDEwMDM4IC0+IDEKK3hkaXYyMjAgZGl2aWRlIDExOC42MjE4MjYgLTIuNzIwMTAwMzggLT4gLTQzLjYwOTM1NjEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjIwIGRpdmlkZWludCAxMTguNjIxODI2IC0yLjcyMDEwMDM4IC0+IC00MworeG11bDIyMCBtdWx0aXBseSAxMTguNjIxODI2IC0yLjcyMDEwMDM4IC0+IC0zMjIuNjYzMjc0IEluZXhhY3QgUm91bmRlZAoreHBvdzIyMCBwb3dlciAxMTguNjIxODI2IC0zIC0+IDUuOTkxMDk0NzFFLTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMjIwIHJlbWFpbmRlciAxMTguNjIxODI2IC0yLjcyMDEwMDM4IC0+IDEuNjU3NTA5NjYKK3hzdWIyMjAgc3VidHJhY3QgMTE4LjYyMTgyNiAtMi43MjAxMDAzOCAtPiAxMjEuMzQxOTI2IEluZXhhY3QgUm91bmRlZAoreGFkZDIyMSBhZGQgODA3MTk2MS45NCAtMTM1NTMzNzQwLkUtMTAyNDUxNTQzIC0+IDgwNzE5NjEuOTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjIxIGNvbXBhcmUgODA3MTk2MS45NCAtMTM1NTMzNzQwLkUtMTAyNDUxNTQzIC0+IDEKK3hkaXYyMjEgZGl2aWRlIDgwNzE5NjEuOTQgLTEzNTUzMzc0MC5FLTEwMjQ1MTU0MyAtPiAtNS45NTU2ODQ1MEUrMTAyNDUxNTQxIEluZXhhY3QgUm91bmRlZAoreGR2aTIyMSBkaXZpZGVpbnQgODA3MTk2MS45NCAtMTM1NTMzNzQwLkUtMTAyNDUxNTQzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjIxIG11bHRpcGx5IDgwNzE5NjEuOTQgLTEzNTUzMzc0MC5FLTEwMjQ1MTU0MyAtPiAtMS4wOTQwMjMxOUUtMTAyNDUxNTI4IEluZXhhY3QgUm91bmRlZAoreHBvdzIyMSBwb3dlciA4MDcxOTYxLjk0IC0xIC0+IDEuMjM4ODU2MTlFLTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMjIxIHJlbWFpbmRlciA4MDcxOTYxLjk0IC0xMzU1MzM3NDAuRS0xMDI0NTE1NDMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMjEgc3VidHJhY3QgODA3MTk2MS45NCAtMTM1NTMzNzQwLkUtMTAyNDUxNTQzIC0+IDgwNzE5NjEuOTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMjIyIGFkZCA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTg2OTIuOTQ0NDdFLTczMjE4Njk0NyAtPiA2LjQyNjI1Mjg1RSs4MTIxMTg2ODkgSW5leGFjdCBSb3VuZGVkCit4Y29tMjIyIGNvbXBhcmUgNjQyNjI1MjguNUUrODEyMTE4NjgyIC04NjkyLjk0NDQ3RS03MzIxODY5NDcgLT4gMQoreGRpdjIyMiBkaXZpZGUgNjQyNjI1MjguNUUrODEyMTE4NjgyIC04NjkyLjk0NDQ3RS03MzIxODY5NDcgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreGR2aTIyMiBkaXZpZGVpbnQgNjQyNjI1MjguNUUrODEyMTE4NjgyIC04NjkyLjk0NDQ3RS03MzIxODY5NDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMjIgbXVsdGlwbHkgNjQyNjI1MjguNUUrODEyMTE4NjgyIC04NjkyLjk0NDQ3RS03MzIxODY5NDcgLT4gLTUuNTg2MzA1OTJFKzc5OTMxNzQ2IEluZXhhY3QgUm91bmRlZAoreHBvdzIyMiBwb3dlciA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTkgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjIyIHJlbWFpbmRlciA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTg2OTIuOTQ0NDdFLTczMjE4Njk0NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjIyMiBzdWJ0cmFjdCA2NDI2MjUyOC41RSs4MTIxMTg2ODIgLTg2OTIuOTQ0NDdFLTczMjE4Njk0NyAtPiA2LjQyNjI1Mjg1RSs4MTIxMTg2ODkgSW5leGFjdCBSb3VuZGVkCit4YWRkMjIzIGFkZCAtMzU1NDQuNDAyOSAtNTY3ODMwLjEzMCAtPiAtNjAzMzc0LjUzMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjMgY29tcGFyZSAtMzU1NDQuNDAyOSAtNTY3ODMwLjEzMCAtPiAxCit4ZGl2MjIzIGRpdmlkZSAtMzU1NDQuNDAyOSAtNTY3ODMwLjEzMCAtPiAwLjA2MjU5Njg5NDggSW5leGFjdCBSb3VuZGVkCit4ZHZpMjIzIGRpdmlkZWludCAtMzU1NDQuNDAyOSAtNTY3ODMwLjEzMCAtPiAwCit4bXVsMjIzIG11bHRpcGx5IC0zNTU0NC40MDI5IC01Njc4MzAuMTMwIC0+IDIuMDE4MzE4MjlFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzIyMyBwb3dlciAtMzU1NDQuNDAyOSAtNTY3ODMwIC0+IDMuNzcwNjkzNjhFLTI1ODQwNjUgSW5leGFjdCBSb3VuZGVkCit4cmVtMjIzIHJlbWFpbmRlciAtMzU1NDQuNDAyOSAtNTY3ODMwLjEzMCAtPiAtMzU1NDQuNDAyOQoreHN1YjIyMyBzdWJ0cmFjdCAtMzU1NDQuNDAyOSAtNTY3ODMwLjEzMCAtPiA1MzIyODUuNzI3IEluZXhhY3QgUm91bmRlZAoreGFkZDIyNCBhZGQgLTcuMTY1MTMwNDdFKzU5Mjk3MTAzIDg3NzY3LjgyMTEgLT4gLTcuMTY1MTMwNDdFKzU5Mjk3MTAzIEluZXhhY3QgUm91bmRlZAoreGNvbTIyNCBjb21wYXJlIC03LjE2NTEzMDQ3RSs1OTI5NzEwMyA4Nzc2Ny44MjExIC0+IC0xCit4ZGl2MjI0IGRpdmlkZSAtNy4xNjUxMzA0N0UrNTkyOTcxMDMgODc3NjcuODIxMSAtPiAtOC4xNjM3MzI4OEUrNTkyOTcwOTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMjI0IGRpdmlkZWludCAtNy4xNjUxMzA0N0UrNTkyOTcxMDMgODc3NjcuODIxMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDIyNCBtdWx0aXBseSAtNy4xNjUxMzA0N0UrNTkyOTcxMDMgODc3NjcuODIxMSAtPiAtNi4yODg2Nzg4OUUrNTkyOTcxMDggSW5leGFjdCBSb3VuZGVkCit4cG93MjI0IHBvd2VyIC03LjE2NTEzMDQ3RSs1OTI5NzEwMyA4Nzc2OCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMjQgcmVtYWluZGVyIC03LjE2NTEzMDQ3RSs1OTI5NzEwMyA4Nzc2Ny44MjExIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjI0IHN1YnRyYWN0IC03LjE2NTEzMDQ3RSs1OTI5NzEwMyA4Nzc2Ny44MjExIC0+IC03LjE2NTEzMDQ3RSs1OTI5NzEwMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMjUgYWRkIC01MDkuNDgzMzk1IC0xNDcyNDI5MTUuIC0+IC0xNDcyNDM0MjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjI1IGNvbXBhcmUgLTUwOS40ODMzOTUgLTE0NzI0MjkxNS4gLT4gMQoreGRpdjIyNSBkaXZpZGUgLTUwOS40ODMzOTUgLTE0NzI0MjkxNS4gLT4gMC4wMDAwMDM0NjAxNTU1OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMjUgZGl2aWRlaW50IC01MDkuNDgzMzk1IC0xNDcyNDI5MTUuIC0+IDAKK3htdWwyMjUgbXVsdGlwbHkgLTUwOS40ODMzOTUgLTE0NzI0MjkxNS4gLT4gNy41MDE3ODIwMkUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MjI1IHBvd2VyIC01MDkuNDgzMzk1IC0xNDcyNDI5MTUgLT4gLTMuMTA3NjA1MTlFLTM5ODYwNTcxOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMjUgcmVtYWluZGVyIC01MDkuNDgzMzk1IC0xNDcyNDI5MTUuIC0+IC01MDkuNDgzMzk1Cit4c3ViMjI1IHN1YnRyYWN0IC01MDkuNDgzMzk1IC0xNDcyNDI5MTUuIC0+IDE0NzI0MjQwNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMjYgYWRkIC03OTE5MDQ3LjI4RSs5NTYwNDE2MjkgLTM2NzY2NzMyOSAtPiAtNy45MTkwNDcyOEUrOTU2MDQxNjM1IEluZXhhY3QgUm91bmRlZAoreGNvbTIyNiBjb21wYXJlIC03OTE5MDQ3LjI4RSs5NTYwNDE2MjkgLTM2NzY2NzMyOSAtPiAtMQoreGRpdjIyNiBkaXZpZGUgLTc5MTkwNDcuMjhFKzk1NjA0MTYyOSAtMzY3NjY3MzI5IC0+IDIuMTUzODYyMTFFKzk1NjA0MTYyNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMjYgZGl2aWRlaW50IC03OTE5MDQ3LjI4RSs5NTYwNDE2MjkgLTM2NzY2NzMyOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDIyNiBtdWx0aXBseSAtNzkxOTA0Ny4yOEUrOTU2MDQxNjI5IC0zNjc2NjczMjkgLT4gMi45MTE1NzQ5NkUrOTU2MDQxNjQ0IEluZXhhY3QgUm91bmRlZAoreHBvdzIyNiBwb3dlciAtNzkxOTA0Ny4yOEUrOTU2MDQxNjI5IC0zNjc2NjczMjkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTIyNiByZW1haW5kZXIgLTc5MTkwNDcuMjhFKzk1NjA0MTYyOSAtMzY3NjY3MzI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjI2IHN1YnRyYWN0IC03OTE5MDQ3LjI4RSs5NTYwNDE2MjkgLTM2NzY2NzMyOSAtPiAtNy45MTkwNDcyOEUrOTU2MDQxNjM1IEluZXhhY3QgUm91bmRlZAoreGFkZDIyNyBhZGQgODk1NjEyNjMwLiAtMzYuNDEwNDA0MCAtPiA4OTU2MTI1OTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjI3IGNvbXBhcmUgODk1NjEyNjMwLiAtMzYuNDEwNDA0MCAtPiAxCit4ZGl2MjI3IGRpdmlkZSA4OTU2MTI2MzAuIC0zNi40MTA0MDQwIC0+IC0yNDU5NzcxMi4wIEluZXhhY3QgUm91bmRlZAoreGR2aTIyNyBkaXZpZGVpbnQgODk1NjEyNjMwLiAtMzYuNDEwNDA0MCAtPiAtMjQ1OTc3MTEKK3htdWwyMjcgbXVsdGlwbHkgODk1NjEyNjMwLiAtMzYuNDEwNDA0MCAtPiAtMy4yNjA5NjE3N0UrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MjI3IHBvd2VyIDg5NTYxMjYzMC4gLTM2IC0+IDUuMjkyNjQxMzBFLTMyMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMjcgcmVtYWluZGVyIDg5NTYxMjYzMC4gLTM2LjQxMDQwNDAgLT4gMzUuMDE0NzU2MAoreHN1YjIyNyBzdWJ0cmFjdCA4OTU2MTI2MzAuIC0zNi40MTA0MDQwIC0+IDg5NTYxMjY2NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMjggYWRkIDI1NDU1LjQ5NzMgMjk1NS4wMDAwNkUrNTI4MTk2MjE4IC0+IDIuOTU1MDAwMDZFKzUyODE5NjIyMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjggY29tcGFyZSAyNTQ1NS40OTczIDI5NTUuMDAwMDZFKzUyODE5NjIxOCAtPiAtMQoreGRpdjIyOCBkaXZpZGUgMjU0NTUuNDk3MyAyOTU1LjAwMDA2RSs1MjgxOTYyMTggLT4gOC42MTQzODEzMUUtNTI4MTk2MjE4IEluZXhhY3QgUm91bmRlZAoreGR2aTIyOCBkaXZpZGVpbnQgMjU0NTUuNDk3MyAyOTU1LjAwMDA2RSs1MjgxOTYyMTggLT4gMAoreG11bDIyOCBtdWx0aXBseSAyNTQ1NS40OTczIDI5NTUuMDAwMDZFKzUyODE5NjIxOCAtPiA3LjUyMjA5OTYwRSs1MjgxOTYyMjUgSW5leGFjdCBSb3VuZGVkCit4cG93MjI4IHBvd2VyIDI1NDU1LjQ5NzMgMyAtPiAxLjY0OTQ3MTI4RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMjggcmVtYWluZGVyIDI1NDU1LjQ5NzMgMjk1NS4wMDAwNkUrNTI4MTk2MjE4IC0+IDI1NDU1LjQ5NzMKK3hzdWIyMjggc3VidHJhY3QgMjU0NTUuNDk3MyAyOTU1LjAwMDA2RSs1MjgxOTYyMTggLT4gLTIuOTU1MDAwMDZFKzUyODE5NjIyMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMjkgYWRkIC0xMTIuMjk0MTQ0RSsyNzM0MTQxNzIgLTcxNDQ4MDA3LjcgLT4gLTEuMTIyOTQxNDRFKzI3MzQxNDE3NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMjkgY29tcGFyZSAtMTEyLjI5NDE0NEUrMjczNDE0MTcyIC03MTQ0ODAwNy43IC0+IC0xCit4ZGl2MjI5IGRpdmlkZSAtMTEyLjI5NDE0NEUrMjczNDE0MTcyIC03MTQ0ODAwNy43IC0+IDEuNTcxNjkwMzVFKzI3MzQxNDE2NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMjkgZGl2aWRlaW50IC0xMTIuMjk0MTQ0RSsyNzM0MTQxNzIgLTcxNDQ4MDA3LjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyMjkgbXVsdGlwbHkgLTExMi4yOTQxNDRFKzI3MzQxNDE3MiAtNzE0NDgwMDcuNyAtPiA4LjAyMzE5Mjg3RSsyNzM0MTQxODEgSW5leGFjdCBSb3VuZGVkCit4cG93MjI5IHBvd2VyIC0xMTIuMjk0MTQ0RSsyNzM0MTQxNzIgLTcxNDQ4MDA4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTIyOSByZW1haW5kZXIgLTExMi4yOTQxNDRFKzI3MzQxNDE3MiAtNzE0NDgwMDcuNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjIyOSBzdWJ0cmFjdCAtMTEyLjI5NDE0NEUrMjczNDE0MTcyIC03MTQ0ODAwNy43IC0+IC0xLjEyMjk0MTQ0RSsyNzM0MTQxNzQgSW5leGFjdCBSb3VuZGVkCit4YWRkMjMwIGFkZCA2Mjg3MS4yMjAyIDI0ODQuMDM4MkUrMjExNjYyNTU3IC0+IDIuNDg0MDM4MjBFKzIxMTY2MjU2MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yMzAgY29tcGFyZSA2Mjg3MS4yMjAyIDI0ODQuMDM4MkUrMjExNjYyNTU3IC0+IC0xCit4ZGl2MjMwIGRpdmlkZSA2Mjg3MS4yMjAyIDI0ODQuMDM4MkUrMjExNjYyNTU3IC0+IDIuNTMxMDA4NTlFLTIxMTY2MjU1NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMzAgZGl2aWRlaW50IDYyODcxLjIyMDIgMjQ4NC4wMzgyRSsyMTE2NjI1NTcgLT4gMAoreG11bDIzMCBtdWx0aXBseSA2Mjg3MS4yMjAyIDI0ODQuMDM4MkUrMjExNjYyNTU3IC0+IDEuNTYxNzQ1MTNFKzIxMTY2MjU2NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMzAgcG93ZXIgNjI4NzEuMjIwMiAyIC0+IDMuOTUyNzkwMzNFKzkgSW5leGFjdCBSb3VuZGVkCit4cmVtMjMwIHJlbWFpbmRlciA2Mjg3MS4yMjAyIDI0ODQuMDM4MkUrMjExNjYyNTU3IC0+IDYyODcxLjIyMDIKK3hzdWIyMzAgc3VidHJhY3QgNjI4NzEuMjIwMiAyNDg0LjAzODJFKzIxMTY2MjU1NyAtPiAtMi40ODQwMzgyMEUrMjExNjYyNTYwIEluZXhhY3QgUm91bmRlZAoreGFkZDIzMSBhZGQgNzEuOTI4MTU3NSAtOTgxMDAxMi41IC0+IC05ODA5OTQwLjU3IEluZXhhY3QgUm91bmRlZAoreGNvbTIzMSBjb21wYXJlIDcxLjkyODE1NzUgLTk4MTAwMTIuNSAtPiAxCit4ZGl2MjMxIGRpdmlkZSA3MS45MjgxNTc1IC05ODEwMDEyLjUgLT4gLTAuMDAwMDA3MzMyMTE2ODAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjMxIGRpdmlkZWludCA3MS45MjgxNTc1IC05ODEwMDEyLjUgLT4gLTAKK3htdWwyMzEgbXVsdGlwbHkgNzEuOTI4MTU3NSAtOTgxMDAxMi41IC0+IC03MDU2MTYxMjQgSW5leGFjdCBSb3VuZGVkCit4cG93MjMxIHBvd2VyIDcxLjkyODE1NzUgLTk4MTAwMTMgLT4gMi4wMDM2Mzc5OEUtMTgyMTYyMDMgSW5leGFjdCBSb3VuZGVkCit4cmVtMjMxIHJlbWFpbmRlciA3MS45MjgxNTc1IC05ODEwMDEyLjUgLT4gNzEuOTI4MTU3NQoreHN1YjIzMSBzdWJ0cmFjdCA3MS45MjgxNTc1IC05ODEwMDEyLjUgLT4gOTgxMDA4NC40MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzIgYWRkIC02Mzg4MDIyLiAtODguMDQyOTY3IC0+IC02Mzg4MTEwLjA0IEluZXhhY3QgUm91bmRlZAoreGNvbTIzMiBjb21wYXJlIC02Mzg4MDIyLiAtODguMDQyOTY3IC0+IC0xCit4ZGl2MjMyIGRpdmlkZSAtNjM4ODAyMi4gLTg4LjA0Mjk2NyAtPiA3MjU1NS43MzI5IEluZXhhY3QgUm91bmRlZAoreGR2aTIzMiBkaXZpZGVpbnQgLTYzODgwMjIuIC04OC4wNDI5NjcgLT4gNzI1NTUKK3htdWwyMzIgbXVsdGlwbHkgLTYzODgwMjIuIC04OC4wNDI5NjcgLT4gNTYyNDIwNDEwIEluZXhhY3QgUm91bmRlZAoreHBvdzIzMiBwb3dlciAtNjM4ODAyMi4gLTg4IC0+IDEuMzQyMDEyMzhFLTU5OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzIgcmVtYWluZGVyIC02Mzg4MDIyLiAtODguMDQyOTY3IC0+IC02NC41MjkzMTUKK3hzdWIyMzIgc3VidHJhY3QgLTYzODgwMjIuIC04OC4wNDI5NjcgLT4gLTYzODc5MzMuOTYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjMzIGFkZCAzNzI1Njc0NDUuIDk2LjA5OTIxNDEgLT4gMzcyNTY3NTQxIEluZXhhY3QgUm91bmRlZAoreGNvbTIzMyBjb21wYXJlIDM3MjU2NzQ0NS4gOTYuMDk5MjE0MSAtPiAxCit4ZGl2MjMzIGRpdmlkZSAzNzI1Njc0NDUuIDk2LjA5OTIxNDEgLT4gMzg3NjkwNC4xOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMzMgZGl2aWRlaW50IDM3MjU2NzQ0NS4gOTYuMDk5MjE0MSAtPiAzODc2OTA0Cit4bXVsMjMzIG11bHRpcGx5IDM3MjU2NzQ0NS4gOTYuMDk5MjE0MSAtPiAzLjU4MDM0Mzg3RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMzMgcG93ZXIgMzcyNTY3NDQ1LiA5NiAtPiA2Ljg0OTY4NzE1RSs4MjIgSW5leGFjdCBSb3VuZGVkCit4cmVtMjMzIHJlbWFpbmRlciAzNzI1Njc0NDUuIDk2LjA5OTIxNDEgLT4gMTcuNDU4ODUzNgoreHN1YjIzMyBzdWJ0cmFjdCAzNzI1Njc0NDUuIDk2LjA5OTIxNDEgLT4gMzcyNTY3MzQ5IEluZXhhY3QgUm91bmRlZAoreGFkZDIzNCBhZGQgODAyLjE1NjUxNyAtMTc0NDA5MzEwLkUtMjU1MzM4MDIwIC0+IDgwMi4xNTY1MTcgSW5leGFjdCBSb3VuZGVkCit4Y29tMjM0IGNvbXBhcmUgODAyLjE1NjUxNyAtMTc0NDA5MzEwLkUtMjU1MzM4MDIwIC0+IDEKK3hkaXYyMzQgZGl2aWRlIDgwMi4xNTY1MTcgLTE3NDQwOTMxMC5FLTI1NTMzODAyMCAtPiAtNC41OTkyNzU3OUUrMjU1MzM4MDE0IEluZXhhY3QgUm91bmRlZAoreGR2aTIzNCBkaXZpZGVpbnQgODAyLjE1NjUxNyAtMTc0NDA5MzEwLkUtMjU1MzM4MDIwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjM0IG11bHRpcGx5IDgwMi4xNTY1MTcgLTE3NDQwOTMxMC5FLTI1NTMzODAyMCAtPiAtMS4zOTkwMzU2NUUtMjU1MzM4MDA5IEluZXhhY3QgUm91bmRlZAoreHBvdzIzNCBwb3dlciA4MDIuMTU2NTE3IC0yIC0+IDAuMDAwMDAxNTU0MTEwMDUgSW5leGFjdCBSb3VuZGVkCit4cmVtMjM0IHJlbWFpbmRlciA4MDIuMTU2NTE3IC0xNzQ0MDkzMTAuRS0yNTUzMzgwMjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyMzQgc3VidHJhY3QgODAyLjE1NjUxNyAtMTc0NDA5MzEwLkUtMjU1MzM4MDIwIC0+IDgwMi4xNTY1MTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMjM1IGFkZCAtMy42NTIwNzU0MSA3NDUwMTk4Mi4wIC0+IDc0NTAxOTc4LjMgSW5leGFjdCBSb3VuZGVkCit4Y29tMjM1IGNvbXBhcmUgLTMuNjUyMDc1NDEgNzQ1MDE5ODIuMCAtPiAtMQoreGRpdjIzNSBkaXZpZGUgLTMuNjUyMDc1NDEgNzQ1MDE5ODIuMCAtPiAtNC45MDE5ODQyM0UtOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMzUgZGl2aWRlaW50IC0zLjY1MjA3NTQxIDc0NTAxOTgyLjAgLT4gLTAKK3htdWwyMzUgbXVsdGlwbHkgLTMuNjUyMDc1NDEgNzQ1MDE5ODIuMCAtPiAtMjcyMDg2ODU2IEluZXhhY3QgUm91bmRlZAoreHBvdzIzNSBwb3dlciAtMy42NTIwNzU0MSA3NDUwMTk4MiAtPiAyLjEwMzM5NDUyRSs0MTkxMDMyNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzUgcmVtYWluZGVyIC0zLjY1MjA3NTQxIDc0NTAxOTgyLjAgLT4gLTMuNjUyMDc1NDEKK3hzdWIyMzUgc3VidHJhY3QgLTMuNjUyMDc1NDEgNzQ1MDE5ODIuMCAtPiAtNzQ1MDE5ODUuNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzYgYWRkIC01Mjk3Ljc2OTgxIC04NTkuNzE5NDA0IC0+IC02MTU3LjQ4OTIxIEluZXhhY3QgUm91bmRlZAoreGNvbTIzNiBjb21wYXJlIC01Mjk3Ljc2OTgxIC04NTkuNzE5NDA0IC0+IC0xCit4ZGl2MjM2IGRpdmlkZSAtNTI5Ny43Njk4MSAtODU5LjcxOTQwNCAtPiA2LjE2MjIwODAyIEluZXhhY3QgUm91bmRlZAoreGR2aTIzNiBkaXZpZGVpbnQgLTUyOTcuNzY5ODEgLTg1OS43MTk0MDQgLT4gNgoreG11bDIzNiBtdWx0aXBseSAtNTI5Ny43Njk4MSAtODU5LjcxOTQwNCAtPiA0NTU0NTk1LjUwIEluZXhhY3QgUm91bmRlZAoreHBvdzIzNiBwb3dlciAtNTI5Ny43Njk4MSAtODYwIC0+IDEuOTA1MjMxMDhFLTMyMDMgSW5leGFjdCBSb3VuZGVkCit4cmVtMjM2IHJlbWFpbmRlciAtNTI5Ny43Njk4MSAtODU5LjcxOTQwNCAtPiAtMTM5LjQ1MzM4NgoreHN1YjIzNiBzdWJ0cmFjdCAtNTI5Ny43Njk4MSAtODU5LjcxOTQwNCAtPiAtNDQzOC4wNTA0MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzcgYWRkIC02ODQxNzIuNTkyIDc2Ni40NDg1OTdFKzI4ODM2MTk1OSAtPiA3LjY2NDQ4NTk3RSsyODgzNjE5NjEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjM3IGNvbXBhcmUgLTY4NDE3Mi41OTIgNzY2LjQ0ODU5N0UrMjg4MzYxOTU5IC0+IC0xCit4ZGl2MjM3IGRpdmlkZSAtNjg0MTcyLjU5MiA3NjYuNDQ4NTk3RSsyODgzNjE5NTkgLT4gLTguOTI2NTI5MzhFLTI4ODM2MTk1NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMzcgZGl2aWRlaW50IC02ODQxNzIuNTkyIDc2Ni40NDg1OTdFKzI4ODM2MTk1OSAtPiAtMAoreG11bDIzNyBtdWx0aXBseSAtNjg0MTcyLjU5MiA3NjYuNDQ4NTk3RSsyODgzNjE5NTkgLT4gLTUuMjQzODMxMjNFKzI4ODM2MTk2NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyMzcgcG93ZXIgLTY4NDE3Mi41OTIgOCAtPiA0LjgwMDkzMDA1RSs0NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yMzcgcmVtYWluZGVyIC02ODQxNzIuNTkyIDc2Ni40NDg1OTdFKzI4ODM2MTk1OSAtPiAtNjg0MTcyLjU5MgoreHN1YjIzNyBzdWJ0cmFjdCAtNjg0MTcyLjU5MiA3NjYuNDQ4NTk3RSsyODgzNjE5NTkgLT4gLTcuNjY0NDg1OTdFKzI4ODM2MTk2MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyMzggYWRkIDYyNjkxOS4yMTkgNTc0NjkuODcyN0UrMTMxODg2MTAgLT4gNS43NDY5ODcyN0UrMTMxODg2MTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjM4IGNvbXBhcmUgNjI2OTE5LjIxOSA1NzQ2OS44NzI3RSsxMzE4ODYxMCAtPiAtMQoreGRpdjIzOCBkaXZpZGUgNjI2OTE5LjIxOSA1NzQ2OS44NzI3RSsxMzE4ODYxMCAtPiAxLjA5MDg2NTg2RS0xMzE4ODYwOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyMzggZGl2aWRlaW50IDYyNjkxOS4yMTkgNTc0NjkuODcyN0UrMTMxODg2MTAgLT4gMAoreG11bDIzOCBtdWx0aXBseSA2MjY5MTkuMjE5IDU3NDY5Ljg3MjdFKzEzMTg4NjEwIC0+IDMuNjAyODk2NzdFKzEzMTg4NjIwIEluZXhhY3QgUm91bmRlZAoreHBvdzIzOCBwb3dlciA2MjY5MTkuMjE5IDYgLT4gNi4wNzExMjk1OUUrMzQgSW5leGFjdCBSb3VuZGVkCit4cmVtMjM4IHJlbWFpbmRlciA2MjY5MTkuMjE5IDU3NDY5Ljg3MjdFKzEzMTg4NjEwIC0+IDYyNjkxOS4yMTkKK3hzdWIyMzggc3VidHJhY3QgNjI2OTE5LjIxOSA1NzQ2OS44NzI3RSsxMzE4ODYxMCAtPiAtNS43NDY5ODcyN0UrMTMxODg2MTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMjM5IGFkZCAtNzc0ODAuNTg0MCA4OTMyNjUuNTk0RSsyODc5ODI1NTIgLT4gOC45MzI2NTU5NEUrMjg3OTgyNTU3IEluZXhhY3QgUm91bmRlZAoreGNvbTIzOSBjb21wYXJlIC03NzQ4MC41ODQwIDg5MzI2NS41OTRFKzI4Nzk4MjU1MiAtPiAtMQoreGRpdjIzOSBkaXZpZGUgLTc3NDgwLjU4NDAgODkzMjY1LjU5NEUrMjg3OTgyNTUyIC0+IC04LjY3Mzg1NzQyRS0yODc5ODI1NTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjM5IGRpdmlkZWludCAtNzc0ODAuNTg0MCA4OTMyNjUuNTk0RSsyODc5ODI1NTIgLT4gLTAKK3htdWwyMzkgbXVsdGlwbHkgLTc3NDgwLjU4NDAgODkzMjY1LjU5NEUrMjg3OTgyNTUyIC0+IC02LjkyMTA3Mzk5RSsyODc5ODI1NjIgSW5leGFjdCBSb3VuZGVkCit4cG93MjM5IHBvd2VyIC03NzQ4MC41ODQwIDkgLT4gLTEuMDA2MzE5NjlFKzQ0IEluZXhhY3QgUm91bmRlZAoreHJlbTIzOSByZW1haW5kZXIgLTc3NDgwLjU4NDAgODkzMjY1LjU5NEUrMjg3OTgyNTUyIC0+IC03NzQ4MC41ODQwCit4c3ViMjM5IHN1YnRyYWN0IC03NzQ4MC41ODQwIDg5MzI2NS41OTRFKzI4Nzk4MjU1MiAtPiAtOC45MzI2NTU5NEUrMjg3OTgyNTU3IEluZXhhY3QgUm91bmRlZAoreGFkZDI0MCBhZGQgLTcxNzc2MjAuMjkgNzc4NjM0My44MyAtPiA2MDg3MjMuNTQKK3hjb20yNDAgY29tcGFyZSAtNzE3NzYyMC4yOSA3Nzg2MzQzLjgzIC0+IC0xCit4ZGl2MjQwIGRpdmlkZSAtNzE3NzYyMC4yOSA3Nzg2MzQzLjgzIC0+IC0wLjkyMTgyMTY0NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNDAgZGl2aWRlaW50IC03MTc3NjIwLjI5IDc3ODYzNDMuODMgLT4gLTAKK3htdWwyNDAgbXVsdGlwbHkgLTcxNzc2MjAuMjkgNzc4NjM0My44MyAtPiAtNS41ODg3NDE5NUUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MjQwIHBvd2VyIC03MTc3NjIwLjI5IDc3ODYzNDQgLT4gMi45NjAzNzA3NEUrNTMzODMwMjIgSW5leGFjdCBSb3VuZGVkCit4cmVtMjQwIHJlbWFpbmRlciAtNzE3NzYyMC4yOSA3Nzg2MzQzLjgzIC0+IC03MTc3NjIwLjI5Cit4c3ViMjQwIHN1YnRyYWN0IC03MTc3NjIwLjI5IDc3ODYzNDMuODMgLT4gLTE0OTYzOTY0LjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjQxIGFkZCA5LjYyMjQxMzAgNC41MDM1NTExMiAtPiAxNC4xMjU5NjQxIEluZXhhY3QgUm91bmRlZAoreGNvbTI0MSBjb21wYXJlIDkuNjIyNDEzMCA0LjUwMzU1MTEyIC0+IDEKK3hkaXYyNDEgZGl2aWRlIDkuNjIyNDEzMCA0LjUwMzU1MTEyIC0+IDIuMTM2NjI3OTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQxIGRpdmlkZWludCA5LjYyMjQxMzAgNC41MDM1NTExMiAtPiAyCit4bXVsMjQxIG11bHRpcGx5IDkuNjIyNDEzMCA0LjUwMzU1MTEyIC0+IDQzLjMzNTAyODggSW5leGFjdCBSb3VuZGVkCit4cG93MjQxIHBvd2VyIDkuNjIyNDEzMCA1IC0+IDgyNDkzLjU0NDggSW5leGFjdCBSb3VuZGVkCit4cmVtMjQxIHJlbWFpbmRlciA5LjYyMjQxMzAgNC41MDM1NTExMiAtPiAwLjYxNTMxMDc2Cit4c3ViMjQxIHN1YnRyYWN0IDkuNjIyNDEzMCA0LjUwMzU1MTEyIC0+IDUuMTE4ODYxODgKK3hhZGQyNDIgYWRkIC02Ni42MzM3MzQ3RS01OTc0MTAwODYgLTgxODgxMjg4NSAtPiAtODE4ODEyODg1IEluZXhhY3QgUm91bmRlZAoreGNvbTI0MiBjb21wYXJlIC02Ni42MzM3MzQ3RS01OTc0MTAwODYgLTgxODgxMjg4NSAtPiAxCit4ZGl2MjQyIGRpdmlkZSAtNjYuNjMzNzM0N0UtNTk3NDEwMDg2IC04MTg4MTI4ODUgLT4gOC4xMzc4NDYzOEUtNTk3NDEwMDk0IEluZXhhY3QgUm91bmRlZAoreGR2aTI0MiBkaXZpZGVpbnQgLTY2LjYzMzczNDdFLTU5NzQxMDA4NiAtODE4ODEyODg1IC0+IDAKK3htdWwyNDIgbXVsdGlwbHkgLTY2LjYzMzczNDdFLTU5NzQxMDA4NiAtODE4ODEyODg1IC0+IDUuNDU2MDU2MDVFLTU5NzQxMDA3NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNDIgcG93ZXIgLTY2LjYzMzczNDdFLTU5NzQxMDA4NiAtODE4ODEyODg1IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNDIgcmVtYWluZGVyIC02Ni42MzM3MzQ3RS01OTc0MTAwODYgLTgxODgxMjg4NSAtPiAtNi42NjMzNzM0N0UtNTk3NDEwMDg1Cit4c3ViMjQyIHN1YnRyYWN0IC02Ni42MzM3MzQ3RS01OTc0MTAwODYgLTgxODgxMjg4NSAtPiA4MTg4MTI4ODUgSW5leGFjdCBSb3VuZGVkCit4YWRkMjQzIGFkZCA2NTU4NzU1My43IDYwMDU3NC43MzYgLT4gNjYxODgxMjguNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNDMgY29tcGFyZSA2NTU4NzU1My43IDYwMDU3NC43MzYgLT4gMQoreGRpdjI0MyBkaXZpZGUgNjU1ODc1NTMuNyA2MDA1NzQuNzM2IC0+IDEwOS4yMDc5ODAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQzIGRpdmlkZWludCA2NTU4NzU1My43IDYwMDU3NC43MzYgLT4gMTA5Cit4bXVsMjQzIG11bHRpcGx5IDY1NTg3NTUzLjcgNjAwNTc0LjczNiAtPiAzLjkzOTAyMjc3RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNDMgcG93ZXIgNjU1ODc1NTMuNyA2MDA1NzUgLT4gMy40MDQwNDgxN0UrNDY5NDU4NyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNDMgcmVtYWluZGVyIDY1NTg3NTUzLjcgNjAwNTc0LjczNiAtPiAxMjQ5MDcuNDc2Cit4c3ViMjQzIHN1YnRyYWN0IDY1NTg3NTUzLjcgNjAwNTc0LjczNiAtPiA2NDk4Njk3OS4wIEluZXhhY3QgUm91bmRlZAoreGFkZDI0NCBhZGQgLTMyNDAxLjkzOSAtNTg1MjAwMjE3LiAtPiAtNTg1MjMyNjE5IEluZXhhY3QgUm91bmRlZAoreGNvbTI0NCBjb21wYXJlIC0zMjQwMS45MzkgLTU4NTIwMDIxNy4gLT4gMQoreGRpdjI0NCBkaXZpZGUgLTMyNDAxLjkzOSAtNTg1MjAwMjE3LiAtPiAwLjAwMDA1NTM2ODk3OTggSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQ0IGRpdmlkZWludCAtMzI0MDEuOTM5IC01ODUyMDAyMTcuIC0+IDAKK3htdWwyNDQgbXVsdGlwbHkgLTMyNDAxLjkzOSAtNTg1MjAwMjE3LiAtPiAxLjg5NjE2MjE3RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNDQgcG93ZXIgLTMyNDAxLjkzOSAtNTg1MjAwMjE3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNDQgcmVtYWluZGVyIC0zMjQwMS45MzkgLTU4NTIwMDIxNy4gLT4gLTMyNDAxLjkzOQoreHN1YjI0NCBzdWJ0cmFjdCAtMzI0MDEuOTM5IC01ODUyMDAyMTcuIC0+IDU4NTE2NzgxNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNDUgYWRkIDY5NTczLjk4OCAtOS43NzAwMzQ2NUUrNzQwOTMzNjY4IC0+IC05Ljc3MDAzNDY1RSs3NDA5MzM2NjggSW5leGFjdCBSb3VuZGVkCit4Y29tMjQ1IGNvbXBhcmUgNjk1NzMuOTg4IC05Ljc3MDAzNDY1RSs3NDA5MzM2NjggLT4gMQoreGRpdjI0NSBkaXZpZGUgNjk1NzMuOTg4IC05Ljc3MDAzNDY1RSs3NDA5MzM2NjggLT4gLTcuMTIxMTYwODJFLTc0MDkzMzY2NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNDUgZGl2aWRlaW50IDY5NTczLjk4OCAtOS43NzAwMzQ2NUUrNzQwOTMzNjY4IC0+IC0wCit4bXVsMjQ1IG11bHRpcGx5IDY5NTczLjk4OCAtOS43NzAwMzQ2NUUrNzQwOTMzNjY4IC0+IC02Ljc5NzQwMjczRSs3NDA5MzM2NzMgSW5leGFjdCBSb3VuZGVkCit4cG93MjQ1IHBvd2VyIDY5NTczLjk4OCAtMTAgLT4gMy43NjI5NzIyOUUtNDkgSW5leGFjdCBSb3VuZGVkCit4cmVtMjQ1IHJlbWFpbmRlciA2OTU3My45ODggLTkuNzcwMDM0NjVFKzc0MDkzMzY2OCAtPiA2OTU3My45ODgKK3hzdWIyNDUgc3VidHJhY3QgNjk1NzMuOTg4IC05Ljc3MDAzNDY1RSs3NDA5MzM2NjggLT4gOS43NzAwMzQ2NUUrNzQwOTMzNjY4IEluZXhhY3QgUm91bmRlZAoreGFkZDI0NiBhZGQgMjM2Mi4wNjI1MSAtNDMzMTQ5NTQ2LkUtMTUyNjQzNjI5IC0+IDIzNjIuMDYyNTEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjQ2IGNvbXBhcmUgMjM2Mi4wNjI1MSAtNDMzMTQ5NTQ2LkUtMTUyNjQzNjI5IC0+IDEKK3hkaXYyNDYgZGl2aWRlIDIzNjIuMDYyNTEgLTQzMzE0OTU0Ni5FLTE1MjY0MzYyOSAtPiAtNS40NTMyMjYzM0UrMTUyNjQzNjIzIEluZXhhY3QgUm91bmRlZAoreGR2aTI0NiBkaXZpZGVpbnQgMjM2Mi4wNjI1MSAtNDMzMTQ5NTQ2LkUtMTUyNjQzNjI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjQ2IG11bHRpcGx5IDIzNjIuMDYyNTEgLTQzMzE0OTU0Ni5FLTE1MjY0MzYyOSAtPiAtMS4wMjMxMjYzMEUtMTUyNjQzNjE3IEluZXhhY3QgUm91bmRlZAoreHBvdzI0NiBwb3dlciAyMzYyLjA2MjUxIC00IC0+IDMuMjEyNDM1NzdFLTE0IEluZXhhY3QgUm91bmRlZAoreHJlbTI0NiByZW1haW5kZXIgMjM2Mi4wNjI1MSAtNDMzMTQ5NTQ2LkUtMTUyNjQzNjI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjQ2IHN1YnRyYWN0IDIzNjIuMDYyNTEgLTQzMzE0OTU0Ni5FLTE1MjY0MzYyOSAtPiAyMzYyLjA2MjUxIEluZXhhY3QgUm91bmRlZAoreGFkZDI0NyBhZGQgLTYxNS4yMzQ4OEUrMjQ5OTUzNDUyIC0yMTQzNzQ4My43IC0+IC02LjE1MjM0ODgwRSsyNDk5NTM0NTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjQ3IGNvbXBhcmUgLTYxNS4yMzQ4OEUrMjQ5OTUzNDUyIC0yMTQzNzQ4My43IC0+IC0xCit4ZGl2MjQ3IGRpdmlkZSAtNjE1LjIzNDg4RSsyNDk5NTM0NTIgLTIxNDM3NDgzLjcgLT4gMi44Njk5MDI1MEUrMjQ5OTUzNDQ3IEluZXhhY3QgUm91bmRlZAoreGR2aTI0NyBkaXZpZGVpbnQgLTYxNS4yMzQ4OEUrMjQ5OTUzNDUyIC0yMTQzNzQ4My43IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjQ3IG11bHRpcGx5IC02MTUuMjM0ODhFKzI0OTk1MzQ1MiAtMjE0Mzc0ODMuNyAtPiAxLjMxODkwODc3RSsyNDk5NTM0NjIgSW5leGFjdCBSb3VuZGVkCit4cG93MjQ3IHBvd2VyIC02MTUuMjM0ODhFKzI0OTk1MzQ1MiAtMjE0Mzc0ODQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjQ3IHJlbWFpbmRlciAtNjE1LjIzNDg4RSsyNDk5NTM0NTIgLTIxNDM3NDgzLjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNDcgc3VidHJhY3QgLTYxNS4yMzQ4OEUrMjQ5OTUzNDUyIC0yMTQzNzQ4My43IC0+IC02LjE1MjM0ODgwRSsyNDk5NTM0NTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMjQ4IGFkZCAyMTY3NDEwODIuIDI1MDI5MDI0NCAtPiA0NjcwMzEzMjYKK3hjb20yNDggY29tcGFyZSAyMTY3NDEwODIuIDI1MDI5MDI0NCAtPiAtMQoreGRpdjI0OCBkaXZpZGUgMjE2NzQxMDgyLiAyNTAyOTAyNDQgLT4gMC44NjU5NTg5NzAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQ4IGRpdmlkZWludCAyMTY3NDEwODIuIDI1MDI5MDI0NCAtPiAwCit4bXVsMjQ4IG11bHRpcGx5IDIxNjc0MTA4Mi4gMjUwMjkwMjQ0IC0+IDUuNDI0ODE3ODNFKzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzI0OCBwb3dlciAyMTY3NDEwODIuIDI1MDI5MDI0NCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNDggcmVtYWluZGVyIDIxNjc0MTA4Mi4gMjUwMjkwMjQ0IC0+IDIxNjc0MTA4MgoreHN1YjI0OCBzdWJ0cmFjdCAyMTY3NDEwODIuIDI1MDI5MDI0NCAtPiAtMzM1NDkxNjIKK3hhZGQyNDkgYWRkIC02MzY0NzIwLjQ5IDU1MzkyNDUuNjQgLT4gLTgyNTQ3NC44NQoreGNvbTI0OSBjb21wYXJlIC02MzY0NzIwLjQ5IDU1MzkyNDUuNjQgLT4gLTEKK3hkaXYyNDkgZGl2aWRlIC02MzY0NzIwLjQ5IDU1MzkyNDUuNjQgLT4gLTEuMTQ5MDIyOTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjQ5IGRpdmlkZWludCAtNjM2NDcyMC40OSA1NTM5MjQ1LjY0IC0+IC0xCit4bXVsMjQ5IG11bHRpcGx5IC02MzY0NzIwLjQ5IDU1MzkyNDUuNjQgLT4gLTMuNTI1NTc1MDJFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzI0OSBwb3dlciAtNjM2NDcyMC40OSA1NTM5MjQ2IC0+IDIuOTY4OTQ2NDFFKzM3Njg3ODA3IEluZXhhY3QgUm91bmRlZAoreHJlbTI0OSByZW1haW5kZXIgLTYzNjQ3MjAuNDkgNTUzOTI0NS42NCAtPiAtODI1NDc0Ljg1Cit4c3ViMjQ5IHN1YnRyYWN0IC02MzY0NzIwLjQ5IDU1MzkyNDUuNjQgLT4gLTExOTAzOTY2LjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjUwIGFkZCAtODE0NTk5LjQ3NSAtMTQuNTQzMTE5MSAtPiAtODE0NjE0LjAxOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNTAgY29tcGFyZSAtODE0NTk5LjQ3NSAtMTQuNTQzMTE5MSAtPiAtMQoreGRpdjI1MCBkaXZpZGUgLTgxNDU5OS40NzUgLTE0LjU0MzExOTEgLT4gNTYwMTIuNzA3NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNTAgZGl2aWRlaW50IC04MTQ1OTkuNDc1IC0xNC41NDMxMTkxIC0+IDU2MDEyCit4bXVsMjUwIG11bHRpcGx5IC04MTQ1OTkuNDc1IC0xNC41NDMxMTkxIC0+IDExODQ2ODE3LjIgSW5leGFjdCBSb3VuZGVkCit4cG93MjUwIHBvd2VyIC04MTQ1OTkuNDc1IC0xNSAtPiAtMi4xNjY4OTYyMkUtODkgSW5leGFjdCBSb3VuZGVkCit4cmVtMjUwIHJlbWFpbmRlciAtODE0NTk5LjQ3NSAtMTQuNTQzMTE5MSAtPiAtMTAuMjg3OTcwOAoreHN1YjI1MCBzdWJ0cmFjdCAtODE0NTk5LjQ3NSAtMTQuNTQzMTE5MSAtPiAtODE0NTg0LjkzMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTEgYWRkIC04Nzc0OTguNzU1IDUwNzQwODcyNEUtMTY4NjI4MTA2IC0+IC04Nzc0OTguNzU1IEluZXhhY3QgUm91bmRlZAoreGNvbTI1MSBjb21wYXJlIC04Nzc0OTguNzU1IDUwNzQwODcyNEUtMTY4NjI4MTA2IC0+IC0xCit4ZGl2MjUxIGRpdmlkZSAtODc3NDk4Ljc1NSA1MDc0MDg3MjRFLTE2ODYyODEwNiAtPiAtMS43MjkzNzI2MkUrMTY4NjI4MTAzIEluZXhhY3QgUm91bmRlZAoreGR2aTI1MSBkaXZpZGVpbnQgLTg3NzQ5OC43NTUgNTA3NDA4NzI0RS0xNjg2MjgxMDYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNTEgbXVsdGlwbHkgLTg3NzQ5OC43NTUgNTA3NDA4NzI0RS0xNjg2MjgxMDYgLT4gLTQuNDUyNTA1MjRFLTE2ODYyODA5MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNTEgcG93ZXIgLTg3NzQ5OC43NTUgNSAtPiAtNS4yMDI3NDUwNUUrMjkgSW5leGFjdCBSb3VuZGVkCit4cmVtMjUxIHJlbWFpbmRlciAtODc3NDk4Ljc1NSA1MDc0MDg3MjRFLTE2ODYyODEwNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI1MSBzdWJ0cmFjdCAtODc3NDk4Ljc1NSA1MDc0MDg3MjRFLTE2ODYyODEwNiAtPiAtODc3NDk4Ljc1NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTIgYWRkIDEwNjM0NDQ2LjVFKzQ3NTc4Mzg2MSA1MC43MjEzMDU2RSsxNzgwNzgwOSAtPiAxLjA2MzQ0NDY1RSs0NzU3ODM4NjggSW5leGFjdCBSb3VuZGVkCit4Y29tMjUyIGNvbXBhcmUgMTA2MzQ0NDYuNUUrNDc1NzgzODYxIDUwLjcyMTMwNTZFKzE3ODA3ODA5IC0+IDEKK3hkaXYyNTIgZGl2aWRlIDEwNjM0NDQ2LjVFKzQ3NTc4Mzg2MSA1MC43MjEzMDU2RSsxNzgwNzgwOSAtPiAyLjA5NjY0Mjg5RSs0NTc5NzYwNTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjUyIGRpdmlkZWludCAxMDYzNDQ0Ni41RSs0NzU3ODM4NjEgNTAuNzIxMzA1NkUrMTc4MDc4MDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNTIgbXVsdGlwbHkgMTA2MzQ0NDYuNUUrNDc1NzgzODYxIDUwLjcyMTMwNTZFKzE3ODA3ODA5IC0+IDUuMzkzOTMwMTFFKzQ5MzU5MTY3OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNTIgcG93ZXIgMTA2MzQ0NDYuNUUrNDc1NzgzODYxIDUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMjUyIHJlbWFpbmRlciAxMDYzNDQ0Ni41RSs0NzU3ODM4NjEgNTAuNzIxMzA1NkUrMTc4MDc4MDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNTIgc3VidHJhY3QgMTA2MzQ0NDYuNUUrNDc1NzgzODYxIDUwLjcyMTMwNTZFKzE3ODA3ODA5IC0+IDEuMDYzNDQ0NjVFKzQ3NTc4Mzg2OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTMgYWRkIC0xNjI3MjYuMjU3RS01OTcyODU5MTggLTQzOTEuNTQ3OTkgLT4gLTQzOTEuNTQ3OTkgSW5leGFjdCBSb3VuZGVkCit4Y29tMjUzIGNvbXBhcmUgLTE2MjcyNi4yNTdFLTU5NzI4NTkxOCAtNDM5MS41NDc5OSAtPiAxCit4ZGl2MjUzIGRpdmlkZSAtMTYyNzI2LjI1N0UtNTk3Mjg1OTE4IC00MzkxLjU0Nzk5IC0+IDMuNzA1NDQxODVFLTU5NzI4NTkxNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNTMgZGl2aWRlaW50IC0xNjI3MjYuMjU3RS01OTcyODU5MTggLTQzOTEuNTQ3OTkgLT4gMAoreG11bDI1MyBtdWx0aXBseSAtMTYyNzI2LjI1N0UtNTk3Mjg1OTE4IC00MzkxLjU0Nzk5IC0+IDcuMTQ2MjAxNjdFLTU5NzI4NTkxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNTMgcG93ZXIgLTE2MjcyNi4yNTdFLTU5NzI4NTkxOCAtNDM5MiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTMgcmVtYWluZGVyIC0xNjI3MjYuMjU3RS01OTcyODU5MTggLTQzOTEuNTQ3OTkgLT4gLTEuNjI3MjYyNTdFLTU5NzI4NTkxMworeHN1YjI1MyBzdWJ0cmFjdCAtMTYyNzI2LjI1N0UtNTk3Mjg1OTE4IC00MzkxLjU0Nzk5IC0+IDQzOTEuNTQ3OTkgSW5leGFjdCBSb3VuZGVkCit4YWRkMjU0IGFkZCA3MDAzNTQ1ODYuRS05OTg1NjcwNyA3MTk4LjA0OTNFKzQzNjI1MDI5OSAtPiA3LjE5ODA0OTMwRSs0MzYyNTAzMDIgSW5leGFjdCBSb3VuZGVkCit4Y29tMjU0IGNvbXBhcmUgNzAwMzU0NTg2LkUtOTk4NTY3MDcgNzE5OC4wNDkzRSs0MzYyNTAyOTkgLT4gLTEKK3hkaXYyNTQgZGl2aWRlIDcwMDM1NDU4Ni5FLTk5ODU2NzA3IDcxOTguMDQ5M0UrNDM2MjUwMjk5IC0+IDkuNzI5NzgzMTJFLTUzNjEwNzAwMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNTQgZGl2aWRlaW50IDcwMDM1NDU4Ni5FLTk5ODU2NzA3IDcxOTguMDQ5M0UrNDM2MjUwMjk5IC0+IDAKK3htdWwyNTQgbXVsdGlwbHkgNzAwMzU0NTg2LkUtOTk4NTY3MDcgNzE5OC4wNDkzRSs0MzYyNTAyOTkgLT4gNS4wNDExODY4NEUrMzM2MzkzNjA0IEluZXhhY3QgUm91bmRlZAoreHBvdzI1NCBwb3dlciA3MDAzNTQ1ODYuRS05OTg1NjcwNyA3IC0+IDguMjY0Njc2MTBFLTY5ODk5Njg4OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTQgcmVtYWluZGVyIDcwMDM1NDU4Ni5FLTk5ODU2NzA3IDcxOTguMDQ5M0UrNDM2MjUwMjk5IC0+IDcuMDAzNTQ1ODZFLTk5ODU2Njk5Cit4c3ViMjU0IHN1YnRyYWN0IDcwMDM1NDU4Ni5FLTk5ODU2NzA3IDcxOTguMDQ5M0UrNDM2MjUwMjk5IC0+IC03LjE5ODA0OTMwRSs0MzYyNTAzMDIgSW5leGFjdCBSb3VuZGVkCit4YWRkMjU1IGFkZCAzOTYxNzY2M0UtNDYzNzA0NjY0IC04OTUuMjkwMzQ2IC0+IC04OTUuMjkwMzQ2IEluZXhhY3QgUm91bmRlZAoreGNvbTI1NSBjb21wYXJlIDM5NjE3NjYzRS00NjM3MDQ2NjQgLTg5NS4yOTAzNDYgLT4gMQoreGRpdjI1NSBkaXZpZGUgMzk2MTc2NjNFLTQ2MzcwNDY2NCAtODk1LjI5MDM0NiAtPiAtNC40MjUxMTg5OEUtNDYzNzA0NjYwIEluZXhhY3QgUm91bmRlZAoreGR2aTI1NSBkaXZpZGVpbnQgMzk2MTc2NjNFLTQ2MzcwNDY2NCAtODk1LjI5MDM0NiAtPiAtMAoreG11bDI1NSBtdWx0aXBseSAzOTYxNzY2M0UtNDYzNzA0NjY0IC04OTUuMjkwMzQ2IC0+IC0zLjU0NjkzMTEyRS00NjM3MDQ2NTQgSW5leGFjdCBSb3VuZGVkCit4cG93MjU1IHBvd2VyIDM5NjE3NjYzRS00NjM3MDQ2NjQgLTg5NSAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTUgcmVtYWluZGVyIDM5NjE3NjYzRS00NjM3MDQ2NjQgLTg5NS4yOTAzNDYgLT4gMy45NjE3NjYzRS00NjM3MDQ2NTcKK3hzdWIyNTUgc3VidHJhY3QgMzk2MTc2NjNFLTQ2MzcwNDY2NCAtODk1LjI5MDM0NiAtPiA4OTUuMjkwMzQ2IEluZXhhY3QgUm91bmRlZAoreGFkZDI1NiBhZGQgNTM1MDg4Mi41OSAtMzYzMjk4MjkgLT4gLTMwOTc4OTQ2LjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjU2IGNvbXBhcmUgNTM1MDg4Mi41OSAtMzYzMjk4MjkgLT4gMQoreGRpdjI1NiBkaXZpZGUgNTM1MDg4Mi41OSAtMzYzMjk4MjkgLT4gLTAuMTQ3Mjg2MjA0IEluZXhhY3QgUm91bmRlZAoreGR2aTI1NiBkaXZpZGVpbnQgNTM1MDg4Mi41OSAtMzYzMjk4MjkgLT4gLTAKK3htdWwyNTYgbXVsdGlwbHkgNTM1MDg4Mi41OSAtMzYzMjk4MjkgLT4gLTEuOTQzOTY2NDlFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzI1NiBwb3dlciA1MzUwODgyLjU5IC0zNjMyOTgyOSAtPiA5Ljc3MDA2MTA3RS0yNDQ0NDI1NDYgSW5leGFjdCBSb3VuZGVkCit4cmVtMjU2IHJlbWFpbmRlciA1MzUwODgyLjU5IC0zNjMyOTgyOSAtPiA1MzUwODgyLjU5Cit4c3ViMjU2IHN1YnRyYWN0IDUzNTA4ODIuNTkgLTM2MzI5ODI5IC0+IDQxNjgwNzExLjYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjU3IGFkZCA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMTY2NzQwLjQ2RS00MjAwMTM5MCAtPiA5LjE5NjY0MDg0RSsyMTAzODI5NTYgSW5leGFjdCBSb3VuZGVkCit4Y29tMjU3IGNvbXBhcmUgOTE5NjYuNDA4NEUrMjEwMzgyOTUyIDE2Njc0MC40NkUtNDIwMDEzOTAgLT4gMQoreGRpdjI1NyBkaXZpZGUgOTE5NjYuNDA4NEUrMjEwMzgyOTUyIDE2Njc0MC40NkUtNDIwMDEzOTAgLT4gNS41MTU1NDI0NEUrMjUyMzg0MzQxIEluZXhhY3QgUm91bmRlZAoreGR2aTI1NyBkaXZpZGVpbnQgOTE5NjYuNDA4NEUrMjEwMzgyOTUyIDE2Njc0MC40NkUtNDIwMDEzOTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNTcgbXVsdGlwbHkgOTE5NjYuNDA4NEUrMjEwMzgyOTUyIDE2Njc0MC40NkUtNDIwMDEzOTAgLT4gMS41MzM0NTIxMkUrMTY4MzgxNTcyIEluZXhhY3QgUm91bmRlZAoreHBvdzI1NyBwb3dlciA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMiAtPiA4LjQ1NzgyMDI3RSs0MjA3NjU5MTMgSW5leGFjdCBSb3VuZGVkCit4cmVtMjU3IHJlbWFpbmRlciA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMTY2NzQwLjQ2RS00MjAwMTM5MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI1NyBzdWJ0cmFjdCA5MTk2Ni40MDg0RSsyMTAzODI5NTIgMTY2NzQwLjQ2RS00MjAwMTM5MCAtPiA5LjE5NjY0MDg0RSsyMTAzODI5NTYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjU4IGFkZCAyMzE4OTkwMzEuRS00ODE3NTkwNzYgNzI2LjMzNzEwMCAtPiA3MjYuMzM3MTAwIEluZXhhY3QgUm91bmRlZAoreGNvbTI1OCBjb21wYXJlIDIzMTg5OTAzMS5FLTQ4MTc1OTA3NiA3MjYuMzM3MTAwIC0+IC0xCit4ZGl2MjU4IGRpdmlkZSAyMzE4OTkwMzEuRS00ODE3NTkwNzYgNzI2LjMzNzEwMCAtPiAzLjE5MjcxOTA3RS00ODE3NTkwNzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjU4IGRpdmlkZWludCAyMzE4OTkwMzEuRS00ODE3NTkwNzYgNzI2LjMzNzEwMCAtPiAwCit4bXVsMjU4IG11bHRpcGx5IDIzMTg5OTAzMS5FLTQ4MTc1OTA3NiA3MjYuMzM3MTAwIC0+IDEuNjg0MzY4NzBFLTQ4MTc1OTA2NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNTggcG93ZXIgMjMxODk5MDMxLkUtNDgxNzU5MDc2IDcyNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNTggcmVtYWluZGVyIDIzMTg5OTAzMS5FLTQ4MTc1OTA3NiA3MjYuMzM3MTAwIC0+IDIuMzE4OTkwMzFFLTQ4MTc1OTA2OAoreHN1YjI1OCBzdWJ0cmFjdCAyMzE4OTkwMzEuRS00ODE3NTkwNzYgNzI2LjMzNzEwMCAtPiAtNzI2LjMzNzEwMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNTkgYWRkIC05NjExMzEyLjMzIDIyMTA5NzM1LjkgLT4gMTI0OTg0MjMuNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNTkgY29tcGFyZSAtOTYxMTMxMi4zMyAyMjEwOTczNS45IC0+IC0xCit4ZGl2MjU5IGRpdmlkZSAtOTYxMTMxMi4zMyAyMjEwOTczNS45IC0+IC0wLjQzNDcwOTUwNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNTkgZGl2aWRlaW50IC05NjExMzEyLjMzIDIyMTA5NzM1LjkgLT4gLTAKK3htdWwyNTkgbXVsdGlwbHkgLTk2MTEzMTIuMzMgMjIxMDk3MzUuOSAtPiAtMi4xMjUwMzU3N0UrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93MjU5IHBvd2VyIC05NjExMzEyLjMzIDIyMTA5NzM2IC0+IDYuNzQ1MzA4MjhFKzE1NDM4NzQ4MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNTkgcmVtYWluZGVyIC05NjExMzEyLjMzIDIyMTA5NzM1LjkgLT4gLTk2MTEzMTIuMzMKK3hzdWIyNTkgc3VidHJhY3QgLTk2MTEzMTIuMzMgMjIxMDk3MzUuOSAtPiAtMzE3MjEwNDguMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNjAgYWRkIC01NjA0OTM4LjE1RS0zNjgxMjU0MiA3MzU5Mzc1NzcuIC0+IDczNTkzNzU3NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjAgY29tcGFyZSAtNTYwNDkzOC4xNUUtMzY4MTI1NDIgNzM1OTM3NTc3LiAtPiAtMQoreGRpdjI2MCBkaXZpZGUgLTU2MDQ5MzguMTVFLTM2ODEyNTQyIDczNTkzNzU3Ny4gLT4gLTcuNjE2MDUxMDRFLTM2ODEyNTQ1IEluZXhhY3QgUm91bmRlZAoreGR2aTI2MCBkaXZpZGVpbnQgLTU2MDQ5MzguMTVFLTM2ODEyNTQyIDczNTkzNzU3Ny4gLT4gLTAKK3htdWwyNjAgbXVsdGlwbHkgLTU2MDQ5MzguMTVFLTM2ODEyNTQyIDczNTkzNzU3Ny4gLT4gLTQuMTI0ODg0NjBFLTM2ODEyNTI3IEluZXhhY3QgUm91bmRlZAoreHBvdzI2MCBwb3dlciAtNTYwNDkzOC4xNUUtMzY4MTI1NDIgNzM1OTM3NTc3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0yNjAgcmVtYWluZGVyIC01NjA0OTM4LjE1RS0zNjgxMjU0MiA3MzU5Mzc1NzcuIC0+IC01LjYwNDkzODE1RS0zNjgxMjUzNgoreHN1YjI2MCBzdWJ0cmFjdCAtNTYwNDkzOC4xNUUtMzY4MTI1NDIgNzM1OTM3NTc3LiAtPiAtNzM1OTM3NTc3IEluZXhhY3QgUm91bmRlZAoreGFkZDI2MSBhZGQgNjkzODgxNDEzLiAyNjA1NDcyMjRFLTQ4MDI4MTQxOCAtPiA2OTM4ODE0MTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMjYxIGNvbXBhcmUgNjkzODgxNDEzLiAyNjA1NDcyMjRFLTQ4MDI4MTQxOCAtPiAxCit4ZGl2MjYxIGRpdmlkZSA2OTM4ODE0MTMuIDI2MDU0NzIyNEUtNDgwMjgxNDE4IC0+IDIuNjYzMTY5NDdFKzQ4MDI4MTQxOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNjEgZGl2aWRlaW50IDY5Mzg4MTQxMy4gMjYwNTQ3MjI0RS00ODAyODE0MTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNjEgbXVsdGlwbHkgNjkzODgxNDEzLiAyNjA1NDcyMjRFLTQ4MDI4MTQxOCAtPiAxLjgwNzg4ODc2RS00ODAyODE0MDEgSW5leGFjdCBSb3VuZGVkCit4cG93MjYxIHBvd2VyIDY5Mzg4MTQxMy4gMyAtPiAzLjM0MDg0MDY2RSsyNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNjEgcmVtYWluZGVyIDY5Mzg4MTQxMy4gMjYwNTQ3MjI0RS00ODAyODE0MTggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNjEgc3VidHJhY3QgNjkzODgxNDEzLiAyNjA1NDcyMjRFLTQ4MDI4MTQxOCAtPiA2OTM4ODE0MTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMjYyIGFkZCAtMzQ4NjUuNzM3OEUtMzY4NzY4MDI0IDIyOTcxMTcuODggLT4gMjI5NzExNy44OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjIgY29tcGFyZSAtMzQ4NjUuNzM3OEUtMzY4NzY4MDI0IDIyOTcxMTcuODggLT4gLTEKK3hkaXYyNjIgZGl2aWRlIC0zNDg2NS43Mzc4RS0zNjg3NjgwMjQgMjI5NzExNy44OCAtPiAtMS41MTc4MDM2MEUtMzY4NzY4MDI2IEluZXhhY3QgUm91bmRlZAoreGR2aTI2MiBkaXZpZGVpbnQgLTM0ODY1LjczNzhFLTM2ODc2ODAyNCAyMjk3MTE3Ljg4IC0+IC0wCit4bXVsMjYyIG11bHRpcGx5IC0zNDg2NS43Mzc4RS0zNjg3NjgwMjQgMjI5NzExNy44OCAtPiAtOC4wMDkwNzA5N0UtMzY4NzY4MDE0IEluZXhhY3QgUm91bmRlZAoreHBvdzI2MiBwb3dlciAtMzQ4NjUuNzM3OEUtMzY4NzY4MDI0IDIyOTcxMTggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjYyIHJlbWFpbmRlciAtMzQ4NjUuNzM3OEUtMzY4NzY4MDI0IDIyOTcxMTcuODggLT4gLTMuNDg2NTczNzhFLTM2ODc2ODAyMAoreHN1YjI2MiBzdWJ0cmFjdCAtMzQ4NjUuNzM3OEUtMzY4NzY4MDI0IDIyOTcxMTcuODggLT4gLTIyOTcxMTcuODggSW5leGFjdCBSb3VuZGVkCit4YWRkMjYzIGFkZCAxMTIzLjMyNDU2IDcuODY3NDc5MThFKzkzMDg4ODc5NiAtPiA3Ljg2NzQ3OTE4RSs5MzA4ODg3OTYgSW5leGFjdCBSb3VuZGVkCit4Y29tMjYzIGNvbXBhcmUgMTEyMy4zMjQ1NiA3Ljg2NzQ3OTE4RSs5MzA4ODg3OTYgLT4gLTEKK3hkaXYyNjMgZGl2aWRlIDExMjMuMzI0NTYgNy44Njc0NzkxOEUrOTMwODg4Nzk2IC0+IDEuNDI3ODA3NDhFLTkzMDg4ODc5NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNjMgZGl2aWRlaW50IDExMjMuMzI0NTYgNy44Njc0NzkxOEUrOTMwODg4Nzk2IC0+IDAKK3htdWwyNjMgbXVsdGlwbHkgMTEyMy4zMjQ1NiA3Ljg2NzQ3OTE4RSs5MzA4ODg3OTYgLT4gOC44Mzc3MzI1OUUrOTMwODg4Nzk5IEluZXhhY3QgUm91bmRlZAoreHBvdzI2MyBwb3dlciAxMTIzLjMyNDU2IDggLT4gMi41MzUzNzQwMUUrMjQgSW5leGFjdCBSb3VuZGVkCit4cmVtMjYzIHJlbWFpbmRlciAxMTIzLjMyNDU2IDcuODY3NDc5MThFKzkzMDg4ODc5NiAtPiAxMTIzLjMyNDU2Cit4c3ViMjYzIHN1YnRyYWN0IDExMjMuMzI0NTYgNy44Njc0NzkxOEUrOTMwODg4Nzk2IC0+IC03Ljg2NzQ3OTE4RSs5MzA4ODg3OTYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjY0IGFkZCA1Ni42NjA3NDY1RSs0Njc4MTI1NjUgOTA5NTUyNTEyRSs3NjQ1MTYyMDAgLT4gOS4wOTU1MjUxMkUrNzY0NTE2MjA4IEluZXhhY3QgUm91bmRlZAoreGNvbTI2NCBjb21wYXJlIDU2LjY2MDc0NjVFKzQ2NzgxMjU2NSA5MDk1NTI1MTJFKzc2NDUxNjIwMCAtPiAtMQoreGRpdjI2NCBkaXZpZGUgNTYuNjYwNzQ2NUUrNDY3ODEyNTY1IDkwOTU1MjUxMkUrNzY0NTE2MjAwIC0+IDYuMjI5NTE4OTlFLTI5NjcwMzY0MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNjQgZGl2aWRlaW50IDU2LjY2MDc0NjVFKzQ2NzgxMjU2NSA5MDk1NTI1MTJFKzc2NDUxNjIwMCAtPiAwCit4bXVsMjY0IG11bHRpcGx5IDU2LjY2MDc0NjVFKzQ2NzgxMjU2NSA5MDk1NTI1MTJFKzc2NDUxNjIwMCAtPiBJbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hwb3cyNjQgcG93ZXIgNTYuNjYwNzQ2NUUrNDY3ODEyNTY1IDkgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMjY0IHJlbWFpbmRlciA1Ni42NjA3NDY1RSs0Njc4MTI1NjUgOTA5NTUyNTEyRSs3NjQ1MTYyMDAgLT4gNS42NjYwNzQ2NUUrNDY3ODEyNTY2Cit4c3ViMjY0IHN1YnRyYWN0IDU2LjY2MDc0NjVFKzQ2NzgxMjU2NSA5MDk1NTI1MTJFKzc2NDUxNjIwMCAtPiAtOS4wOTU1MjUxMkUrNzY0NTE2MjA4IEluZXhhY3QgUm91bmRlZAoreGFkZDI2NSBhZGQgLTEuODU3NzE4NDBFKzM2NTU1MjU0MCAtNzMwMjgzMzkuNyAtPiAtMS44NTc3MTg0MEUrMzY1NTUyNTQwIEluZXhhY3QgUm91bmRlZAoreGNvbTI2NSBjb21wYXJlIC0xLjg1NzcxODQwRSszNjU1NTI1NDAgLTczMDI4MzM5LjcgLT4gLTEKK3hkaXYyNjUgZGl2aWRlIC0xLjg1NzcxODQwRSszNjU1NTI1NDAgLTczMDI4MzM5LjcgLT4gMi41NDM4MzIxN0UrMzY1NTUyNTMyIEluZXhhY3QgUm91bmRlZAoreGR2aTI2NSBkaXZpZGVpbnQgLTEuODU3NzE4NDBFKzM2NTU1MjU0MCAtNzMwMjgzMzkuNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI2NSBtdWx0aXBseSAtMS44NTc3MTg0MEUrMzY1NTUyNTQwIC03MzAyODMzOS43IC0+IDEuMzU2NjYwOTBFKzM2NTU1MjU0OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNjUgcG93ZXIgLTEuODU3NzE4NDBFKzM2NTU1MjU0MCAtNzMwMjgzNDAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjY1IHJlbWFpbmRlciAtMS44NTc3MTg0MEUrMzY1NTUyNTQwIC03MzAyODMzOS43IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjY1IHN1YnRyYWN0IC0xLjg1NzcxODQwRSszNjU1NTI1NDAgLTczMDI4MzM5LjcgLT4gLTEuODU3NzE4NDBFKzM2NTU1MjU0MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNjYgYWRkIDM0LjE5MzU1MjUgLTQwNzY3LjY0NTAgLT4gLTQwNzMzLjQ1MTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjY2IGNvbXBhcmUgMzQuMTkzNTUyNSAtNDA3NjcuNjQ1MCAtPiAxCit4ZGl2MjY2IGRpdmlkZSAzNC4xOTM1NTI1IC00MDc2Ny42NDUwIC0+IC0wLjAwMDgzODc0MjQwMiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNjYgZGl2aWRlaW50IDM0LjE5MzU1MjUgLTQwNzY3LjY0NTAgLT4gLTAKK3htdWwyNjYgbXVsdGlwbHkgMzQuMTkzNTUyNSAtNDA3NjcuNjQ1MCAtPiAtMTM5Mzk5MC42MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNjYgcG93ZXIgMzQuMTkzNTUyNSAtNDA3NjggLT4gMS40NTE3NDIxMEUtNjI1MzYgSW5leGFjdCBSb3VuZGVkCit4cmVtMjY2IHJlbWFpbmRlciAzNC4xOTM1NTI1IC00MDc2Ny42NDUwIC0+IDM0LjE5MzU1MjUKK3hzdWIyNjYgc3VidHJhY3QgMzQuMTkzNTUyNSAtNDA3NjcuNjQ1MCAtPiA0MDgwMS44Mzg2IEluZXhhY3QgUm91bmRlZAoreGFkZDI2NyBhZGQgMjYuMDAwOTE2OEUrNzUxNjE4Mjk0IC0zMDQwMTkuOTI5IC0+IDIuNjAwMDkxNjhFKzc1MTYxODI5NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjcgY29tcGFyZSAyNi4wMDA5MTY4RSs3NTE2MTgyOTQgLTMwNDAxOS45MjkgLT4gMQoreGRpdjI2NyBkaXZpZGUgMjYuMDAwOTE2OEUrNzUxNjE4Mjk0IC0zMDQwMTkuOTI5IC0+IC04LjU1MjM3MjUwRSs3NTE2MTgyODkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjY3IGRpdmlkZWludCAyNi4wMDA5MTY4RSs3NTE2MTgyOTQgLTMwNDAxOS45MjkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNjcgbXVsdGlwbHkgMjYuMDAwOTE2OEUrNzUxNjE4Mjk0IC0zMDQwMTkuOTI5IC0+IC03LjkwNDc5Njg4RSs3NTE2MTgzMDAgSW5leGFjdCBSb3VuZGVkCit4cG93MjY3IHBvd2VyIDI2LjAwMDkxNjhFKzc1MTYxODI5NCAtMzA0MDIwIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTI2NyByZW1haW5kZXIgMjYuMDAwOTE2OEUrNzUxNjE4Mjk0IC0zMDQwMTkuOTI5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjY3IHN1YnRyYWN0IDI2LjAwMDkxNjhFKzc1MTYxODI5NCAtMzA0MDE5LjkyOSAtPiAyLjYwMDA5MTY4RSs3NTE2MTgyOTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMjY4IGFkZCAtNTguNDg1MzA3MkUrNTg4NTQwMDU1IC00NjQ3LjMyMDUgLT4gLTUuODQ4NTMwNzJFKzU4ODU0MDA1NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNjggY29tcGFyZSAtNTguNDg1MzA3MkUrNTg4NTQwMDU1IC00NjQ3LjMyMDUgLT4gLTEKK3hkaXYyNjggZGl2aWRlIC01OC40ODUzMDcyRSs1ODg1NDAwNTUgLTQ2NDcuMzIwNSAtPiAxLjI1ODQ3MzcyRSs1ODg1NDAwNTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjY4IGRpdmlkZWludCAtNTguNDg1MzA3MkUrNTg4NTQwMDU1IC00NjQ3LjMyMDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNjggbXVsdGlwbHkgLTU4LjQ4NTMwNzJFKzU4ODU0MDA1NSAtNDY0Ny4zMjA1IC0+IDIuNzE3OTk5NjdFKzU4ODU0MDA2MCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNjggcG93ZXIgLTU4LjQ4NTMwNzJFKzU4ODU0MDA1NSAtNDY0NyAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjY4IHJlbWFpbmRlciAtNTguNDg1MzA3MkUrNTg4NTQwMDU1IC00NjQ3LjMyMDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyNjggc3VidHJhY3QgLTU4LjQ4NTMwNzJFKzU4ODU0MDA1NSAtNDY0Ny4zMjA1IC0+IC01Ljg0ODUzMDcyRSs1ODg1NDAwNTYgSW5leGFjdCBSb3VuZGVkCit4YWRkMjY5IGFkZCA1MS4wMjUxMDEgLTQ0Njc2OTEuNTcgLT4gLTQ0Njc2NDAuNTQgSW5leGFjdCBSb3VuZGVkCit4Y29tMjY5IGNvbXBhcmUgNTEuMDI1MTAxIC00NDY3NjkxLjU3IC0+IDEKK3hkaXYyNjkgZGl2aWRlIDUxLjAyNTEwMSAtNDQ2NzY5MS41NyAtPiAtMC4wMDAwMTE0MjA5MDk1IEluZXhhY3QgUm91bmRlZAoreGR2aTI2OSBkaXZpZGVpbnQgNTEuMDI1MTAxIC00NDY3NjkxLjU3IC0+IC0wCit4bXVsMjY5IG11bHRpcGx5IDUxLjAyNTEwMSAtNDQ2NzY5MS41NyAtPiAtMjI3OTY0NDE0IEluZXhhY3QgUm91bmRlZAoreHBvdzI2OSBwb3dlciA1MS4wMjUxMDEgLTQ0Njc2OTIgLT4gNC40OTQ2MjU4OUUtNzYyOTg1MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNjkgcmVtYWluZGVyIDUxLjAyNTEwMSAtNDQ2NzY5MS41NyAtPiA1MS4wMjUxMDEKK3hzdWIyNjkgc3VidHJhY3QgNTEuMDI1MTAxIC00NDY3NjkxLjU3IC0+IDQ0Njc3NDIuNjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjcwIGFkZCAtMjIxNC43NjU4MiAzNzk3ODUzNzJFKzIyMzExNzU3MiAtPiAzLjc5Nzg1MzcyRSsyMjMxMTc1ODAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjcwIGNvbXBhcmUgLTIyMTQuNzY1ODIgMzc5Nzg1MzcyRSsyMjMxMTc1NzIgLT4gLTEKK3hkaXYyNzAgZGl2aWRlIC0yMjE0Ljc2NTgyIDM3OTc4NTM3MkUrMjIzMTE3NTcyIC0+IC01LjgzMTYyNDg3RS0yMjMxMTc1NzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMjcwIGRpdmlkZWludCAtMjIxNC43NjU4MiAzNzk3ODUzNzJFKzIyMzExNzU3MiAtPiAtMAoreG11bDI3MCBtdWx0aXBseSAtMjIxNC43NjU4MiAzNzk3ODUzNzJFKzIyMzExNzU3MiAtPiAtOC40MTEzNTY2MUUrMjIzMTE3NTgzIEluZXhhY3QgUm91bmRlZAoreHBvdzI3MCBwb3dlciAtMjIxNC43NjU4MiA0IC0+IDIuNDA2MDg2NThFKzEzIEluZXhhY3QgUm91bmRlZAoreHJlbTI3MCByZW1haW5kZXIgLTIyMTQuNzY1ODIgMzc5Nzg1MzcyRSsyMjMxMTc1NzIgLT4gLTIyMTQuNzY1ODIKK3hzdWIyNzAgc3VidHJhY3QgLTIyMTQuNzY1ODIgMzc5Nzg1MzcyRSsyMjMxMTc1NzIgLT4gLTMuNzk3ODUzNzJFKzIyMzExNzU4MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNzEgYWRkIC0yNTY0Ljc1MjA3RS04NDE0NDM5MjkgLTY1MzQ5ODE4NyAtPiAtNjUzNDk4MTg3IEluZXhhY3QgUm91bmRlZAoreGNvbTI3MSBjb21wYXJlIC0yNTY0Ljc1MjA3RS04NDE0NDM5MjkgLTY1MzQ5ODE4NyAtPiAxCit4ZGl2MjcxIGRpdmlkZSAtMjU2NC43NTIwN0UtODQxNDQzOTI5IC02NTM0OTgxODcgLT4gMy45MjQ2NTA2M0UtODQxNDQzOTM1IEluZXhhY3QgUm91bmRlZAoreGR2aTI3MSBkaXZpZGVpbnQgLTI1NjQuNzUyMDdFLTg0MTQ0MzkyOSAtNjUzNDk4MTg3IC0+IDAKK3htdWwyNzEgbXVsdGlwbHkgLTI1NjQuNzUyMDdFLTg0MTQ0MzkyOSAtNjUzNDk4MTg3IC0+IDEuNjc2MDYwODNFLTg0MTQ0MzkxNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNzEgcG93ZXIgLTI1NjQuNzUyMDdFLTg0MTQ0MzkyOSAtNjUzNDk4MTg3IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNzEgcmVtYWluZGVyIC0yNTY0Ljc1MjA3RS04NDE0NDM5MjkgLTY1MzQ5ODE4NyAtPiAtMi41NjQ3NTIwN0UtODQxNDQzOTI2Cit4c3ViMjcxIHN1YnRyYWN0IC0yNTY0Ljc1MjA3RS04NDE0NDM5MjkgLTY1MzQ5ODE4NyAtPiA2NTM0OTgxODcgSW5leGFjdCBSb3VuZGVkCit4YWRkMjcyIGFkZCA1MTMxMTU1MjkuIDI3Nzc1MDc1LjZFKzIxNzEzMzM1MiAtPiAyLjc3NzUwNzU2RSsyMTcxMzMzNTkgSW5leGFjdCBSb3VuZGVkCit4Y29tMjcyIGNvbXBhcmUgNTEzMTE1NTI5LiAyNzc3NTA3NS42RSsyMTcxMzMzNTIgLT4gLTEKK3hkaXYyNzIgZGl2aWRlIDUxMzExNTUyOS4gMjc3NzUwNzUuNkUrMjE3MTMzMzUyIC0+IDEuODQ3Mzk1NjJFLTIxNzEzMzM1MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzIgZGl2aWRlaW50IDUxMzExNTUyOS4gMjc3NzUwNzUuNkUrMjE3MTMzMzUyIC0+IDAKK3htdWwyNzIgbXVsdGlwbHkgNTEzMTE1NTI5LiAyNzc3NTA3NS42RSsyMTcxMzMzNTIgLT4gMS40MjUxODIyNkUrMjE3MTMzMzY4IEluZXhhY3QgUm91bmRlZAoreHBvdzI3MiBwb3dlciA1MTMxMTU1MjkuIDMgLT4gMS4zNTA5NjkyOEUrMjYgSW5leGFjdCBSb3VuZGVkCit4cmVtMjcyIHJlbWFpbmRlciA1MTMxMTU1MjkuIDI3Nzc1MDc1LjZFKzIxNzEzMzM1MiAtPiA1MTMxMTU1MjkKK3hzdWIyNzIgc3VidHJhY3QgNTEzMTE1NTI5LiAyNzc3NTA3NS42RSsyMTcxMzMzNTIgLT4gLTIuNzc3NTA3NTZFKzIxNzEzMzM1OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNzMgYWRkIC0yNDcxNTcuMjA4IC01MzI5OTAuNDUzIC0+IC03ODAxNDcuNjYxCit4Y29tMjczIGNvbXBhcmUgLTI0NzE1Ny4yMDggLTUzMjk5MC40NTMgLT4gMQoreGRpdjI3MyBkaXZpZGUgLTI0NzE1Ny4yMDggLTUzMjk5MC40NTMgLT4gMC40NjM3MTc4OTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjczIGRpdmlkZWludCAtMjQ3MTU3LjIwOCAtNTMyOTkwLjQ1MyAtPiAwCit4bXVsMjczIG11bHRpcGx5IC0yNDcxNTcuMjA4IC01MzI5OTAuNDUzIC0+IDEuMzE3MzI0MzJFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzI3MyBwb3dlciAtMjQ3MTU3LjIwOCAtNTMyOTkwIC0+IDEuNDgzMTQwMzNFLTI4NzQ0MDEgSW5leGFjdCBSb3VuZGVkCit4cmVtMjczIHJlbWFpbmRlciAtMjQ3MTU3LjIwOCAtNTMyOTkwLjQ1MyAtPiAtMjQ3MTU3LjIwOAoreHN1YjI3MyBzdWJ0cmFjdCAtMjQ3MTU3LjIwOCAtNTMyOTkwLjQ1MyAtPiAyODU4MzMuMjQ1Cit4YWRkMjc0IGFkZCA0MC4yNDkwNzY0RS0zMzk0ODIyNTMgNzYyNi44NTQ0MkUrNTk0MjY0NTQwIC0+IDcuNjI2ODU0NDJFKzU5NDI2NDU0MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNzQgY29tcGFyZSA0MC4yNDkwNzY0RS0zMzk0ODIyNTMgNzYyNi44NTQ0MkUrNTk0MjY0NTQwIC0+IC0xCit4ZGl2Mjc0IGRpdmlkZSA0MC4yNDkwNzY0RS0zMzk0ODIyNTMgNzYyNi44NTQ0MkUrNTk0MjY0NTQwIC0+IDUuMjc3MjgzOTVFLTkzMzc0Njc5NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzQgZGl2aWRlaW50IDQwLjI0OTA3NjRFLTMzOTQ4MjI1MyA3NjI2Ljg1NDQyRSs1OTQyNjQ1NDAgLT4gMAoreG11bDI3NCBtdWx0aXBseSA0MC4yNDkwNzY0RS0zMzk0ODIyNTMgNzYyNi44NTQ0MkUrNTk0MjY0NTQwIC0+IDMuMDY5NzM4NDZFKzI1NDc4MjI5MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNzQgcG93ZXIgNDAuMjQ5MDc2NEUtMzM5NDgyMjUzIDggLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjc0IHJlbWFpbmRlciA0MC4yNDkwNzY0RS0zMzk0ODIyNTMgNzYyNi44NTQ0MkUrNTk0MjY0NTQwIC0+IDQuMDI0OTA3NjRFLTMzOTQ4MjI1MgoreHN1YjI3NCBzdWJ0cmFjdCA0MC4yNDkwNzY0RS0zMzk0ODIyNTMgNzYyNi44NTQ0MkUrNTk0MjY0NTQwIC0+IC03LjYyNjg1NDQyRSs1OTQyNjQ1NDMgSW5leGFjdCBSb3VuZGVkCit4YWRkMjc1IGFkZCAtMTE1NjAwOC44IC04ODcwMzgyLjM2IC0+IC0xMDAyNjM5MS4yIEluZXhhY3QgUm91bmRlZAoreGNvbTI3NSBjb21wYXJlIC0xMTU2MDA4LjggLTg4NzAzODIuMzYgLT4gMQoreGRpdjI3NSBkaXZpZGUgLTExNTYwMDguOCAtODg3MDM4Mi4zNiAtPiAwLjEzMDMyMjMxOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzUgZGl2aWRlaW50IC0xMTU2MDA4LjggLTg4NzAzODIuMzYgLT4gMAoreG11bDI3NSBtdWx0aXBseSAtMTE1NjAwOC44IC04ODcwMzgyLjM2IC0+IDEuMDI1NDI0MDFFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzI3NSBwb3dlciAtMTE1NjAwOC44IC04ODcwMzgyIC0+IDQuMzI0OTQ5OTZFLTUzNzgwNzgyIEluZXhhY3QgUm91bmRlZAoreHJlbTI3NSByZW1haW5kZXIgLTExNTYwMDguOCAtODg3MDM4Mi4zNiAtPiAtMTE1NjAwOC44MAoreHN1YjI3NSBzdWJ0cmFjdCAtMTE1NjAwOC44IC04ODcwMzgyLjM2IC0+IDc3MTQzNzMuNTYKK3hhZGQyNzYgYWRkIDg4MDA5NzkyOC4gLTUyNDU1MDExLjFFKzIwNDUzODIxOCAtPiAtNS4yNDU1MDExMUUrMjA0NTM4MjI1IEluZXhhY3QgUm91bmRlZAoreGNvbTI3NiBjb21wYXJlIDg4MDA5NzkyOC4gLTUyNDU1MDExLjFFKzIwNDUzODIxOCAtPiAxCit4ZGl2Mjc2IGRpdmlkZSA4ODAwOTc5MjguIC01MjQ1NTAxMS4xRSsyMDQ1MzgyMTggLT4gLTEuNjc3ODE0NzhFLTIwNDUzODIxNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyNzYgZGl2aWRlaW50IDg4MDA5NzkyOC4gLTUyNDU1MDExLjFFKzIwNDUzODIxOCAtPiAtMAoreG11bDI3NiBtdWx0aXBseSA4ODAwOTc5MjguIC01MjQ1NTAxMS4xRSsyMDQ1MzgyMTggLT4gLTQuNjE2NTU0NjZFKzIwNDUzODIzNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNzYgcG93ZXIgODgwMDk3OTI4LiAtNSAtPiAxLjg5Mzg0NzUxRS00NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNzYgcmVtYWluZGVyIDg4MDA5NzkyOC4gLTUyNDU1MDExLjFFKzIwNDUzODIxOCAtPiA4ODAwOTc5MjgKK3hzdWIyNzYgc3VidHJhY3QgODgwMDk3OTI4LiAtNTI0NTUwMTEuMUUrMjA0NTM4MjE4IC0+IDUuMjQ1NTAxMTFFKzIwNDUzODIyNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNzcgYWRkIDU3OTYuMjUyNCAzNDQ1ODMyOS43RSs4MzIxMjk0MjYgLT4gMy40NDU4MzI5N0UrODMyMTI5NDMzIEluZXhhY3QgUm91bmRlZAoreGNvbTI3NyBjb21wYXJlIDU3OTYuMjUyNCAzNDQ1ODMyOS43RSs4MzIxMjk0MjYgLT4gLTEKK3hkaXYyNzcgZGl2aWRlIDU3OTYuMjUyNCAzNDQ1ODMyOS43RSs4MzIxMjk0MjYgLT4gMS42ODIxMDQ4NkUtODMyMTI5NDMwIEluZXhhY3QgUm91bmRlZAoreGR2aTI3NyBkaXZpZGVpbnQgNTc5Ni4yNTI0IDM0NDU4MzI5LjdFKzgzMjEyOTQyNiAtPiAwCit4bXVsMjc3IG11bHRpcGx5IDU3OTYuMjUyNCAzNDQ1ODMyOS43RSs4MzIxMjk0MjYgLT4gMS45OTcyOTE3NkUrODMyMTI5NDM3IEluZXhhY3QgUm91bmRlZAoreHBvdzI3NyBwb3dlciA1Nzk2LjI1MjQgMyAtPiAxLjk0NzM0MDM3RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yNzcgcmVtYWluZGVyIDU3OTYuMjUyNCAzNDQ1ODMyOS43RSs4MzIxMjk0MjYgLT4gNTc5Ni4yNTI0Cit4c3ViMjc3IHN1YnRyYWN0IDU3OTYuMjUyNCAzNDQ1ODMyOS43RSs4MzIxMjk0MjYgLT4gLTMuNDQ1ODMyOTdFKzgzMjEyOTQzMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyNzggYWRkIDI3LjEwMDA5MjNFLTIxODAzMjIyMyAtNDUuMDE5ODM0MSAtPiAtNDUuMDE5ODM0MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yNzggY29tcGFyZSAyNy4xMDAwOTIzRS0yMTgwMzIyMjMgLTQ1LjAxOTgzNDEgLT4gMQoreGRpdjI3OCBkaXZpZGUgMjcuMTAwMDkyM0UtMjE4MDMyMjIzIC00NS4wMTk4MzQxIC0+IC02LjAxOTU4OTU1RS0yMTgwMzIyMjQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjc4IGRpdmlkZWludCAyNy4xMDAwOTIzRS0yMTgwMzIyMjMgLTQ1LjAxOTgzNDEgLT4gLTAKK3htdWwyNzggbXVsdGlwbHkgMjcuMTAwMDkyM0UtMjE4MDMyMjIzIC00NS4wMTk4MzQxIC0+IC0xLjIyMDA0MTY2RS0yMTgwMzIyMjAgSW5leGFjdCBSb3VuZGVkCit4cG93Mjc4IHBvd2VyIDI3LjEwMDA5MjNFLTIxODAzMjIyMyAtNDUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMjc4IHJlbWFpbmRlciAyNy4xMDAwOTIzRS0yMTgwMzIyMjMgLTQ1LjAxOTgzNDEgLT4gMi43MTAwMDkyM0UtMjE4MDMyMjIyCit4c3ViMjc4IHN1YnRyYWN0IDI3LjEwMDA5MjNFLTIxODAzMjIyMyAtNDUuMDE5ODM0MSAtPiA0NS4wMTk4MzQxIEluZXhhY3QgUm91bmRlZAoreGFkZDI3OSBhZGQgNDI2NDM0NzcuOCAyNjExODQ2NUUtNzMwMzkwNTQ5IC0+IDQyNjQzNDc3LjggSW5leGFjdCBSb3VuZGVkCit4Y29tMjc5IGNvbXBhcmUgNDI2NDM0NzcuOCAyNjExODQ2NUUtNzMwMzkwNTQ5IC0+IDEKK3hkaXYyNzkgZGl2aWRlIDQyNjQzNDc3LjggMjYxMTg0NjVFLTczMDM5MDU0OSAtPiAxLjYzMjY5NDY0RSs3MzAzOTA1NDkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjc5IGRpdmlkZWludCA0MjY0MzQ3Ny44IDI2MTE4NDY1RS03MzAzOTA1NDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwyNzkgbXVsdGlwbHkgNDI2NDM0NzcuOCAyNjExODQ2NUUtNzMwMzkwNTQ5IC0+IDEuMTEzNzgyMThFLTczMDM5MDUzNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyNzkgcG93ZXIgNDI2NDM0NzcuOCAzIC0+IDcuNzU0NTcyMzBFKzIyIEluZXhhY3QgUm91bmRlZAoreHJlbTI3OSByZW1haW5kZXIgNDI2NDM0NzcuOCAyNjExODQ2NUUtNzMwMzkwNTQ5IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjc5IHN1YnRyYWN0IDQyNjQzNDc3LjggMjYxMTg0NjVFLTczMDM5MDU0OSAtPiA0MjY0MzQ3Ny44IEluZXhhY3QgUm91bmRlZAoreGFkZDI4MCBhZGQgLTMxOTE4LjkxNzZFLTE2MzAzMTY1NyAtMjEuNTQyMjgyNEUtODA3MzE3MjU4IC0+IC0zLjE5MTg5MTc2RS0xNjMwMzE2NTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMjgwIGNvbXBhcmUgLTMxOTE4LjkxNzZFLTE2MzAzMTY1NyAtMjEuNTQyMjgyNEUtODA3MzE3MjU4IC0+IC0xCit4ZGl2MjgwIGRpdmlkZSAtMzE5MTguOTE3NkUtMTYzMDMxNjU3IC0yMS41NDIyODI0RS04MDczMTcyNTggLT4gMS40ODE2ODY5MEUrNjQ0Mjg1NjA0IEluZXhhY3QgUm91bmRlZAoreGR2aTI4MCBkaXZpZGVpbnQgLTMxOTE4LjkxNzZFLTE2MzAzMTY1NyAtMjEuNTQyMjgyNEUtODA3MzE3MjU4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjgwIG11bHRpcGx5IC0zMTkxOC45MTc2RS0xNjMwMzE2NTcgLTIxLjU0MjI4MjRFLTgwNzMxNzI1OCAtPiA2Ljg3NjA2MzM3RS05NzAzNDg5MTAgSW5leGFjdCBSb3VuZGVkCit4cG93MjgwIHBvd2VyIC0zMTkxOC45MTc2RS0xNjMwMzE2NTcgLTIgLT4gOS44MTUzMDI1MEUrMzI2MDYzMzA0IEluZXhhY3QgUm91bmRlZAoreHJlbTI4MCByZW1haW5kZXIgLTMxOTE4LjkxNzZFLTE2MzAzMTY1NyAtMjEuNTQyMjgyNEUtODA3MzE3MjU4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjgwIHN1YnRyYWN0IC0zMTkxOC45MTc2RS0xNjMwMzE2NTcgLTIxLjU0MjI4MjRFLTgwNzMxNzI1OCAtPiAtMy4xOTE4OTE3NkUtMTYzMDMxNjUzIEluZXhhY3QgUm91bmRlZAoreGFkZDI4MSBhZGQgODQyMjQ4NDEuMCAyLjYyNTQ4MjU1RSs2NDcwODc2MDggLT4gMi42MjU0ODI1NUUrNjQ3MDg3NjA4IEluZXhhY3QgUm91bmRlZAoreGNvbTI4MSBjb21wYXJlIDg0MjI0ODQxLjAgMi42MjU0ODI1NUUrNjQ3MDg3NjA4IC0+IC0xCit4ZGl2MjgxIGRpdmlkZSA4NDIyNDg0MS4wIDIuNjI1NDgyNTVFKzY0NzA4NzYwOCAtPiAzLjIwNzk3NTY1RS02NDcwODc2MDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjgxIGRpdmlkZWludCA4NDIyNDg0MS4wIDIuNjI1NDgyNTVFKzY0NzA4NzYwOCAtPiAwCit4bXVsMjgxIG11bHRpcGx5IDg0MjI0ODQxLjAgMi42MjU0ODI1NUUrNjQ3MDg3NjA4IC0+IDIuMjExMzA4NTBFKzY0NzA4NzYxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyODEgcG93ZXIgODQyMjQ4NDEuMCAzIC0+IDUuOTc0NzYxODVFKzIzIEluZXhhY3QgUm91bmRlZAoreHJlbTI4MSByZW1haW5kZXIgODQyMjQ4NDEuMCAyLjYyNTQ4MjU1RSs2NDcwODc2MDggLT4gODQyMjQ4NDEuMAoreHN1YjI4MSBzdWJ0cmFjdCA4NDIyNDg0MS4wIDIuNjI1NDgyNTVFKzY0NzA4NzYwOCAtPiAtMi42MjU0ODI1NUUrNjQ3MDg3NjA4IEluZXhhY3QgUm91bmRlZAoreGFkZDI4MiBhZGQgLTY0NDEzNjk4LjkgLTY2NzQuMTA1NUUtNzAxMDQ3ODUyIC0+IC02NDQxMzY5OC45IEluZXhhY3QgUm91bmRlZAoreGNvbTI4MiBjb21wYXJlIC02NDQxMzY5OC45IC02Njc0LjEwNTVFLTcwMTA0Nzg1MiAtPiAtMQoreGRpdjI4MiBkaXZpZGUgLTY0NDEzNjk4LjkgLTY2NzQuMTA1NUUtNzAxMDQ3ODUyIC0+IDkuNjUxMjg1NjlFKzcwMTA0Nzg1NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyODIgZGl2aWRlaW50IC02NDQxMzY5OC45IC02Njc0LjEwNTVFLTcwMTA0Nzg1MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI4MiBtdWx0aXBseSAtNjQ0MTM2OTguOSAtNjY3NC4xMDU1RS03MDEwNDc4NTIgLT4gNC4yOTkwMzgyMkUtNzAxMDQ3ODQxIEluZXhhY3QgUm91bmRlZAoreHBvdzI4MiBwb3dlciAtNjQ0MTM2OTguOSAtNyAtPiAtMi4xNzM0NjMzOEUtNTUgSW5leGFjdCBSb3VuZGVkCit4cmVtMjgyIHJlbWFpbmRlciAtNjQ0MTM2OTguOSAtNjY3NC4xMDU1RS03MDEwNDc4NTIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyODIgc3VidHJhY3QgLTY0NDEzNjk4LjkgLTY2NzQuMTA1NUUtNzAxMDQ3ODUyIC0+IC02NDQxMzY5OC45IEluZXhhY3QgUm91bmRlZAoreGFkZDI4MyBhZGQgLTYyLjUwNTkyMDggOS41Nzk1Nzc5RS04OTgzNTAwMTIgLT4gLTYyLjUwNTkyMDggSW5leGFjdCBSb3VuZGVkCit4Y29tMjgzIGNvbXBhcmUgLTYyLjUwNTkyMDggOS41Nzk1Nzc5RS04OTgzNTAwMTIgLT4gLTEKK3hkaXYyODMgZGl2aWRlIC02Mi41MDU5MjA4IDkuNTc5NTc3OUUtODk4MzUwMDEyIC0+IC02LjUyNDkxMzg4RSs4OTgzNTAwMTIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjgzIGRpdmlkZWludCAtNjIuNTA1OTIwOCA5LjU3OTU3NzlFLTg5ODM1MDAxMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI4MyBtdWx0aXBseSAtNjIuNTA1OTIwOCA5LjU3OTU3NzlFLTg5ODM1MDAxMiAtPiAtNS45ODc4MDMzOEUtODk4MzUwMDEwIEluZXhhY3QgUm91bmRlZAoreHBvdzI4MyBwb3dlciAtNjIuNTA1OTIwOCAxMCAtPiA5LjEwMzU2NjU5RSsxNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yODMgcmVtYWluZGVyIC02Mi41MDU5MjA4IDkuNTc5NTc3OUUtODk4MzUwMDEyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjgzIHN1YnRyYWN0IC02Mi41MDU5MjA4IDkuNTc5NTc3OUUtODk4MzUwMDEyIC0+IC02Mi41MDU5MjA4IEluZXhhY3QgUm91bmRlZAoreGFkZDI4NCBhZGQgOTA5MDk1MC44MCA0MzYuNDAwOTMyIC0+IDkwOTEzODcuMjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjg0IGNvbXBhcmUgOTA5MDk1MC44MCA0MzYuNDAwOTMyIC0+IDEKK3hkaXYyODQgZGl2aWRlIDkwOTA5NTAuODAgNDM2LjQwMDkzMiAtPiAyMDgzMS42NDg1IEluZXhhY3QgUm91bmRlZAoreGR2aTI4NCBkaXZpZGVpbnQgOTA5MDk1MC44MCA0MzYuNDAwOTMyIC0+IDIwODMxCit4bXVsMjg0IG11bHRpcGx5IDkwOTA5NTAuODAgNDM2LjQwMDkzMiAtPiAzLjk2NzI5OTQwRSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzI4NCBwb3dlciA5MDkwOTUwLjgwIDQzNiAtPiA4Ljk4Nzg5NTU3RSszMDMzIEluZXhhY3QgUm91bmRlZAoreHJlbTI4NCByZW1haW5kZXIgOTA5MDk1MC44MCA0MzYuNDAwOTMyIC0+IDI4Mi45ODU1MDgKK3hzdWIyODQgc3VidHJhY3QgOTA5MDk1MC44MCA0MzYuNDAwOTMyIC0+IDkwOTA1MTQuNDAgSW5leGFjdCBSb3VuZGVkCit4YWRkMjg1IGFkZCAtODk4MzM4MjUuN0UrMzI5MjA1MzkzIC03Nzk0MzAuMTk0IC0+IC04Ljk4MzM4MjU3RSszMjkyMDU0MDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjg1IGNvbXBhcmUgLTg5ODMzODI1LjdFKzMyOTIwNTM5MyAtNzc5NDMwLjE5NCAtPiAtMQoreGRpdjI4NSBkaXZpZGUgLTg5ODMzODI1LjdFKzMyOTIwNTM5MyAtNzc5NDMwLjE5NCAtPiAxLjE1MjU1NzY4RSszMjkyMDUzOTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjg1IGRpdmlkZWludCAtODk4MzM4MjUuN0UrMzI5MjA1MzkzIC03Nzk0MzAuMTk0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjg1IG11bHRpcGx5IC04OTgzMzgyNS43RSszMjkyMDUzOTMgLTc3OTQzMC4xOTQgLT4gNy4wMDE5MTk2MkUrMzI5MjA1NDA2IEluZXhhY3QgUm91bmRlZAoreHBvdzI4NSBwb3dlciAtODk4MzM4MjUuN0UrMzI5MjA1MzkzIC03Nzk0MzAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMjg1IHJlbWFpbmRlciAtODk4MzM4MjUuN0UrMzI5MjA1MzkzIC03Nzk0MzAuMTk0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjg1IHN1YnRyYWN0IC04OTgzMzgyNS43RSszMjkyMDUzOTMgLTc3OTQzMC4xOTQgLT4gLTguOTgzMzgyNTdFKzMyOTIwNTQwMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyODYgYWRkIC03MTQ1NjIuMDE5RSs3NTAyMDU2ODggNzA0MDc5NzY0IC0+IC03LjE0NTYyMDE5RSs3NTAyMDU2OTMgSW5leGFjdCBSb3VuZGVkCit4Y29tMjg2IGNvbXBhcmUgLTcxNDU2Mi4wMTlFKzc1MDIwNTY4OCA3MDQwNzk3NjQgLT4gLTEKK3hkaXYyODYgZGl2aWRlIC03MTQ1NjIuMDE5RSs3NTAyMDU2ODggNzA0MDc5NzY0IC0+IC0xLjAxNDg4Nzg4RSs3NTAyMDU2ODUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjg2IGRpdmlkZWludCAtNzE0NTYyLjAxOUUrNzUwMjA1Njg4IDcwNDA3OTc2NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDI4NiBtdWx0aXBseSAtNzE0NTYyLjAxOUUrNzUwMjA1Njg4IDcwNDA3OTc2NCAtPiAtNS4wMzEwODY1OEUrNzUwMjA1NzAyIEluZXhhY3QgUm91bmRlZAoreHBvdzI4NiBwb3dlciAtNzE0NTYyLjAxOUUrNzUwMjA1Njg4IDcwNDA3OTc2NCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yODYgcmVtYWluZGVyIC03MTQ1NjIuMDE5RSs3NTAyMDU2ODggNzA0MDc5NzY0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMjg2IHN1YnRyYWN0IC03MTQ1NjIuMDE5RSs3NTAyMDU2ODggNzA0MDc5NzY0IC0+IC03LjE0NTYyMDE5RSs3NTAyMDU2OTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMjg3IGFkZCAtNTg0NTM3NjcwLiAzMTEzOS43NzM3RS0xNDY2ODc1NjAgLT4gLTU4NDUzNzY3MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODcgY29tcGFyZSAtNTg0NTM3NjcwLiAzMTEzOS43NzM3RS0xNDY2ODc1NjAgLT4gLTEKK3hkaXYyODcgZGl2aWRlIC01ODQ1Mzc2NzAuIDMxMTM5Ljc3MzdFLTE0NjY4NzU2MCAtPiAtMS44NzcxNDE2OEUrMTQ2Njg3NTY0IEluZXhhY3QgUm91bmRlZAoreGR2aTI4NyBkaXZpZGVpbnQgLTU4NDUzNzY3MC4gMzExMzkuNzczN0UtMTQ2Njg3NTYwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjg3IG11bHRpcGx5IC01ODQ1Mzc2NzAuIDMxMTM5Ljc3MzdFLTE0NjY4NzU2MCAtPiAtMS44MjAyMzcwOEUtMTQ2Njg3NTQ3IEluZXhhY3QgUm91bmRlZAoreHBvdzI4NyBwb3dlciAtNTg0NTM3NjcwLiAzIC0+IC0xLjk5NzI3MzM3RSsyNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yODcgcmVtYWluZGVyIC01ODQ1Mzc2NzAuIDMxMTM5Ljc3MzdFLTE0NjY4NzU2MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI4NyBzdWJ0cmFjdCAtNTg0NTM3NjcwLiAzMTEzOS43NzM3RS0xNDY2ODc1NjAgLT4gLTU4NDUzNzY3MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyODggYWRkIC00LjE4MDc0NjUwRS04NTg3NDY4NzkgNTcxMDM1LjI3N0UtMjc5NDA5MTY1IC0+IDUuNzEwMzUyNzdFLTI3OTQwOTE2MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yODggY29tcGFyZSAtNC4xODA3NDY1MEUtODU4NzQ2ODc5IDU3MTAzNS4yNzdFLTI3OTQwOTE2NSAtPiAtMQoreGRpdjI4OCBkaXZpZGUgLTQuMTgwNzQ2NTBFLTg1ODc0Njg3OSA1NzEwMzUuMjc3RS0yNzk0MDkxNjUgLT4gLTcuMzIxMzQ1NDBFLTU3OTMzNzcyMCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyODggZGl2aWRlaW50IC00LjE4MDc0NjUwRS04NTg3NDY4NzkgNTcxMDM1LjI3N0UtMjc5NDA5MTY1IC0+IC0wCit4bXVsMjg4IG11bHRpcGx5IC00LjE4MDc0NjUwRS04NTg3NDY4NzkgNTcxMDM1LjI3N0UtMjc5NDA5MTY1IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3cyODggcG93ZXIgLTQuMTgwNzQ2NTBFLTg1ODc0Njg3OSA2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTI4OCByZW1haW5kZXIgLTQuMTgwNzQ2NTBFLTg1ODc0Njg3OSA1NzEwMzUuMjc3RS0yNzk0MDkxNjUgLT4gLTQuMTgwNzQ2NTBFLTg1ODc0Njg3OQoreHN1YjI4OCBzdWJ0cmFjdCAtNC4xODA3NDY1MEUtODU4NzQ2ODc5IDU3MTAzNS4yNzdFLTI3OTQwOTE2NSAtPiAtNS43MTAzNTI3N0UtMjc5NDA5MTYwIEluZXhhY3QgUm91bmRlZAoreGFkZDI4OSBhZGQgNS4xNTMwOTYzNSAtNjk1NjQ5LjIxOUUrNDUxOTQ4MTgzIC0+IC02Ljk1NjQ5MjE5RSs0NTE5NDgxODggSW5leGFjdCBSb3VuZGVkCit4Y29tMjg5IGNvbXBhcmUgNS4xNTMwOTYzNSAtNjk1NjQ5LjIxOUUrNDUxOTQ4MTgzIC0+IDEKK3hkaXYyODkgZGl2aWRlIDUuMTUzMDk2MzUgLTY5NTY0OS4yMTlFKzQ1MTk0ODE4MyAtPiAtNy40MDc2MDc0N0UtNDUxOTQ4MTg5IEluZXhhY3QgUm91bmRlZAoreGR2aTI4OSBkaXZpZGVpbnQgNS4xNTMwOTYzNSAtNjk1NjQ5LjIxOUUrNDUxOTQ4MTgzIC0+IC0wCit4bXVsMjg5IG11bHRpcGx5IDUuMTUzMDk2MzUgLTY5NTY0OS4yMTlFKzQ1MTk0ODE4MyAtPiAtMy41ODQ3NDc0NUUrNDUxOTQ4MTg5IEluZXhhY3QgUm91bmRlZAoreHBvdzI4OSBwb3dlciA1LjE1MzA5NjM1IC03IC0+IDAuMDAwMDEwMzYzODc0OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yODkgcmVtYWluZGVyIDUuMTUzMDk2MzUgLTY5NTY0OS4yMTlFKzQ1MTk0ODE4MyAtPiA1LjE1MzA5NjM1Cit4c3ViMjg5IHN1YnRyYWN0IDUuMTUzMDk2MzUgLTY5NTY0OS4yMTlFKzQ1MTk0ODE4MyAtPiA2Ljk1NjQ5MjE5RSs0NTE5NDgxODggSW5leGFjdCBSb3VuZGVkCit4YWRkMjkwIGFkZCAtOTQwMDMwMTUzLkUrODM3OTc2NTcgLTQuMTE1MTAxOTMgLT4gLTkuNDAwMzAxNTNFKzgzNzk3NjY1IEluZXhhY3QgUm91bmRlZAoreGNvbTI5MCBjb21wYXJlIC05NDAwMzAxNTMuRSs4Mzc5NzY1NyAtNC4xMTUxMDE5MyAtPiAtMQoreGRpdjI5MCBkaXZpZGUgLTk0MDAzMDE1My5FKzgzNzk3NjU3IC00LjExNTEwMTkzIC0+IDIuMjg0MzQyMzNFKzgzNzk3NjY1IEluZXhhY3QgUm91bmRlZAoreGR2aTI5MCBkaXZpZGVpbnQgLTk0MDAzMDE1My5FKzgzNzk3NjU3IC00LjExNTEwMTkzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjkwIG11bHRpcGx5IC05NDAwMzAxNTMuRSs4Mzc5NzY1NyAtNC4xMTUxMDE5MyAtPiAzLjg2ODMxOTkwRSs4Mzc5NzY2NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyOTAgcG93ZXIgLTk0MDAzMDE1My5FKzgzNzk3NjU3IC00IC0+IDEuMjgwNjU3MTBFLTMzNTE5MDY2NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yOTAgcmVtYWluZGVyIC05NDAwMzAxNTMuRSs4Mzc5NzY1NyAtNC4xMTUxMDE5MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI5MCBzdWJ0cmFjdCAtOTQwMDMwMTUzLkUrODM3OTc2NTcgLTQuMTE1MTAxOTMgLT4gLTkuNDAwMzAxNTNFKzgzNzk3NjY1IEluZXhhY3QgUm91bmRlZAoreGFkZDI5MSBhZGQgODkwODguOTY4M0UrNTg3NzM5MjkwIDEuMzE5MzIxMTAgLT4gOC45MDg4OTY4M0UrNTg3NzM5Mjk0IEluZXhhY3QgUm91bmRlZAoreGNvbTI5MSBjb21wYXJlIDg5MDg4Ljk2ODNFKzU4NzczOTI5MCAxLjMxOTMyMTEwIC0+IDEKK3hkaXYyOTEgZGl2aWRlIDg5MDg4Ljk2ODNFKzU4NzczOTI5MCAxLjMxOTMyMTEwIC0+IDYuNzUyNjM3MjdFKzU4NzczOTI5NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyOTEgZGl2aWRlaW50IDg5MDg4Ljk2ODNFKzU4NzczOTI5MCAxLjMxOTMyMTEwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjkxIG11bHRpcGx5IDg5MDg4Ljk2ODNFKzU4NzczOTI5MCAxLjMxOTMyMTEwIC0+IDEuMTc1MzY5NTZFKzU4NzczOTI5NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyOTEgcG93ZXIgODkwODguOTY4M0UrNTg3NzM5MjkwIDEgLT4gOC45MDg4OTY4M0UrNTg3NzM5Mjk0Cit4cmVtMjkxIHJlbWFpbmRlciA4OTA4OC45NjgzRSs1ODc3MzkyOTAgMS4zMTkzMjExMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjI5MSBzdWJ0cmFjdCA4OTA4OC45NjgzRSs1ODc3MzkyOTAgMS4zMTkzMjExMCAtPiA4LjkwODg5NjgzRSs1ODc3MzkyOTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMjkyIGFkZCAzMzM2NzUwIDYuNDc5NjExMjYgLT4gMzMzNjc1Ni40OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20yOTIgY29tcGFyZSAzMzM2NzUwIDYuNDc5NjExMjYgLT4gMQoreGRpdjI5MiBkaXZpZGUgMzMzNjc1MCA2LjQ3OTYxMTI2IC0+IDUxNDk2MS40NDggSW5leGFjdCBSb3VuZGVkCit4ZHZpMjkyIGRpdmlkZWludCAzMzM2NzUwIDYuNDc5NjExMjYgLT4gNTE0OTYxCit4bXVsMjkyIG11bHRpcGx5IDMzMzY3NTAgNi40Nzk2MTEyNiAtPiAyMTYyMDg0Mi45IEluZXhhY3QgUm91bmRlZAoreHBvdzI5MiBwb3dlciAzMzM2NzUwIDYgLT4gMS4zODAxOTk5N0UrMzkgSW5leGFjdCBSb3VuZGVkCit4cmVtMjkyIHJlbWFpbmRlciAzMzM2NzUwIDYuNDc5NjExMjYgLT4gMi45MDU5MzkxNAoreHN1YjI5MiBzdWJ0cmFjdCAzMzM2NzUwIDYuNDc5NjExMjYgLT4gMzMzNjc0My41MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyOTMgYWRkIDkwNDY1NDYyMi4gNjkyMDY1MjcwLkUrMzI5MDgxOTE1IC0+IDYuOTIwNjUyNzBFKzMyOTA4MTkyMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20yOTMgY29tcGFyZSA5MDQ2NTQ2MjIuIDY5MjA2NTI3MC5FKzMyOTA4MTkxNSAtPiAtMQoreGRpdjI5MyBkaXZpZGUgOTA0NjU0NjIyLiA2OTIwNjUyNzAuRSszMjkwODE5MTUgLT4gMS4zMDcxODEwN0UtMzI5MDgxOTE1IEluZXhhY3QgUm91bmRlZAoreGR2aTI5MyBkaXZpZGVpbnQgOTA0NjU0NjIyLiA2OTIwNjUyNzAuRSszMjkwODE5MTUgLT4gMAoreG11bDI5MyBtdWx0aXBseSA5MDQ2NTQ2MjIuIDY5MjA2NTI3MC5FKzMyOTA4MTkxNSAtPiA2LjI2MDgwMDQ1RSszMjkwODE5MzIgSW5leGFjdCBSb3VuZGVkCit4cG93MjkzIHBvd2VyIDkwNDY1NDYyMi4gNyAtPiA0Ljk1ODgzNDg1RSs2MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yOTMgcmVtYWluZGVyIDkwNDY1NDYyMi4gNjkyMDY1MjcwLkUrMzI5MDgxOTE1IC0+IDkwNDY1NDYyMgoreHN1YjI5MyBzdWJ0cmFjdCA5MDQ2NTQ2MjIuIDY5MjA2NTI3MC5FKzMyOTA4MTkxNSAtPiAtNi45MjA2NTI3MEUrMzI5MDgxOTIzIEluZXhhY3QgUm91bmRlZAoreGFkZDI5NCBhZGQgMzA0ODA0MzgwIC00NjgxLjIzNjk4IC0+IDMwNDc5OTY5OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20yOTQgY29tcGFyZSAzMDQ4MDQzODAgLTQ2ODEuMjM2OTggLT4gMQoreGRpdjI5NCBkaXZpZGUgMzA0ODA0MzgwIC00NjgxLjIzNjk4IC0+IC02NTExMS45MzEyIEluZXhhY3QgUm91bmRlZAoreGR2aTI5NCBkaXZpZGVpbnQgMzA0ODA0MzgwIC00NjgxLjIzNjk4IC0+IC02NTExMQoreG11bDI5NCBtdWx0aXBseSAzMDQ4MDQzODAgLTQ2ODEuMjM2OTggLT4gLTEuNDI2ODYxNTRFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzI5NCBwb3dlciAzMDQ4MDQzODAgLTQ2ODEgLT4gMS45ODAzNzEwMkUtMzk3MTQgSW5leGFjdCBSb3VuZGVkCit4cmVtMjk0IHJlbWFpbmRlciAzMDQ4MDQzODAgLTQ2ODEuMjM2OTggLT4gNDM1OC45OTUyMgoreHN1YjI5NCBzdWJ0cmFjdCAzMDQ4MDQzODAgLTQ2ODEuMjM2OTggLT4gMzA0ODA5MDYxIEluZXhhY3QgUm91bmRlZAoreGFkZDI5NSBhZGQgNjc0LjU1NTY5IC04Mjk4MS4yNjg0RSs4NTI4OTA3NTIgLT4gLTguMjk4MTI2ODRFKzg1Mjg5MDc1NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20yOTUgY29tcGFyZSA2NzQuNTU1NjkgLTgyOTgxLjI2ODRFKzg1Mjg5MDc1MiAtPiAxCit4ZGl2Mjk1IGRpdmlkZSA2NzQuNTU1NjkgLTgyOTgxLjI2ODRFKzg1Mjg5MDc1MiAtPiAtOC4xMjkwMTE1NkUtODUyODkwNzU1IEluZXhhY3QgUm91bmRlZAoreGR2aTI5NSBkaXZpZGVpbnQgNjc0LjU1NTY5IC04Mjk4MS4yNjg0RSs4NTI4OTA3NTIgLT4gLTAKK3htdWwyOTUgbXVsdGlwbHkgNjc0LjU1NTY5IC04Mjk4MS4yNjg0RSs4NTI4OTA3NTIgLT4gLTUuNTk3NTQ4NjhFKzg1Mjg5MDc1OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3cyOTUgcG93ZXIgNjc0LjU1NTY5IC04IC0+IDIuMzMyNjkyNjVFLTIzIEluZXhhY3QgUm91bmRlZAoreHJlbTI5NSByZW1haW5kZXIgNjc0LjU1NTY5IC04Mjk4MS4yNjg0RSs4NTI4OTA3NTIgLT4gNjc0LjU1NTY5Cit4c3ViMjk1IHN1YnRyYWN0IDY3NC41NTU2OSAtODI5ODEuMjY4NEUrODUyODkwNzUyIC0+IDguMjk4MTI2ODRFKzg1Mjg5MDc1NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyOTYgYWRkIC01MTExLjUxMDI1RS0xMDgwMDYwOTYgNTQ0ODg3MC40RSsyNzkyMTIyNTUgLT4gNS40NDg4NzA0MEUrMjc5MjEyMjYxIEluZXhhY3QgUm91bmRlZAoreGNvbTI5NiBjb21wYXJlIC01MTExLjUxMDI1RS0xMDgwMDYwOTYgNTQ0ODg3MC40RSsyNzkyMTIyNTUgLT4gLTEKK3hkaXYyOTYgZGl2aWRlIC01MTExLjUxMDI1RS0xMDgwMDYwOTYgNTQ0ODg3MC40RSsyNzkyMTIyNTUgLT4gLTkuMzgwODYyMjJFLTM4NzIxODM1NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkyOTYgZGl2aWRlaW50IC01MTExLjUxMDI1RS0xMDgwMDYwOTYgNTQ0ODg3MC40RSsyNzkyMTIyNTUgLT4gLTAKK3htdWwyOTYgbXVsdGlwbHkgLTUxMTEuNTEwMjVFLTEwODAwNjA5NiA1NDQ4ODcwLjRFKzI3OTIxMjI1NSAtPiAtMi43ODUxOTU2OUUrMTcxMjA2MTY5IEluZXhhY3QgUm91bmRlZAoreHBvdzI5NiBwb3dlciAtNTExMS41MTAyNUUtMTA4MDA2MDk2IDUgLT4gLTMuNDg5MzYzMjNFLTU0MDAzMDQ2MiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yOTYgcmVtYWluZGVyIC01MTExLjUxMDI1RS0xMDgwMDYwOTYgNTQ0ODg3MC40RSsyNzkyMTIyNTUgLT4gLTUuMTExNTEwMjVFLTEwODAwNjA5MworeHN1YjI5NiBzdWJ0cmFjdCAtNTExMS41MTAyNUUtMTA4MDA2MDk2IDU0NDg4NzAuNEUrMjc5MjEyMjU1IC0+IC01LjQ0ODg3MDQwRSsyNzkyMTIyNjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMjk3IGFkZCAtMjYyMy40NTA2OCAtNDY2NDYzOTM4LiAtPiAtNDY2NDY2NTYxIEluZXhhY3QgUm91bmRlZAoreGNvbTI5NyBjb21wYXJlIC0yNjIzLjQ1MDY4IC00NjY0NjM5MzguIC0+IDEKK3hkaXYyOTcgZGl2aWRlIC0yNjIzLjQ1MDY4IC00NjY0NjM5MzguIC0+IDAuMDAwMDA1NjI0MTIzMjUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjk3IGRpdmlkZWludCAtMjYyMy40NTA2OCAtNDY2NDYzOTM4LiAtPiAwCit4bXVsMjk3IG11bHRpcGx5IC0yNjIzLjQ1MDY4IC00NjY0NjM5MzguIC0+IDEuMjIzNzQ1MTRFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzI5NyBwb3dlciAtMjYyMy40NTA2OCAtNDY2NDYzOTM4IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTI5NyByZW1haW5kZXIgLTI2MjMuNDUwNjggLTQ2NjQ2MzkzOC4gLT4gLTI2MjMuNDUwNjgKK3hzdWIyOTcgc3VidHJhY3QgLTI2MjMuNDUwNjggLTQ2NjQ2MzkzOC4gLT4gNDY2NDYxMzE1IEluZXhhY3QgUm91bmRlZAoreGFkZDI5OCBhZGQgMjk5MzUwLjQzNSAzMzczLjMzNTUxIC0+IDMwMjcyMy43NzEgSW5leGFjdCBSb3VuZGVkCit4Y29tMjk4IGNvbXBhcmUgMjk5MzUwLjQzNSAzMzczLjMzNTUxIC0+IDEKK3hkaXYyOTggZGl2aWRlIDI5OTM1MC40MzUgMzM3My4zMzU1MSAtPiA4OC43NDAxOTAzIEluZXhhY3QgUm91bmRlZAoreGR2aTI5OCBkaXZpZGVpbnQgMjk5MzUwLjQzNSAzMzczLjMzNTUxIC0+IDg4Cit4bXVsMjk4IG11bHRpcGx5IDI5OTM1MC40MzUgMzM3My4zMzU1MSAtPiAxLjAwOTgwOTQ1RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzI5OCBwb3dlciAyOTkzNTAuNDM1IDMzNzMgLT4gMS40MjgxNzM3MEUrMTg0NzEgSW5leGFjdCBSb3VuZGVkCit4cmVtMjk4IHJlbWFpbmRlciAyOTkzNTAuNDM1IDMzNzMuMzM1NTEgLT4gMjQ5Ni45MTAxMgoreHN1YjI5OCBzdWJ0cmFjdCAyOTkzNTAuNDM1IDMzNzMuMzM1NTEgLT4gMjk1OTc3LjA5OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQyOTkgYWRkIC02NTg5OTQ3LjgwIC0yNDQ4Ljc1OTMzRS01OTE1NDk3MzQgLT4gLTY1ODk5NDcuODAgSW5leGFjdCBSb3VuZGVkCit4Y29tMjk5IGNvbXBhcmUgLTY1ODk5NDcuODAgLTI0NDguNzU5MzNFLTU5MTU0OTczNCAtPiAtMQoreGRpdjI5OSBkaXZpZGUgLTY1ODk5NDcuODAgLTI0NDguNzU5MzNFLTU5MTU0OTczNCAtPiAyLjY5MTEzNzM5RSs1OTE1NDk3MzcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMjk5IGRpdmlkZWludCAtNjU4OTk0Ny44MCAtMjQ0OC43NTkzM0UtNTkxNTQ5NzM0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMjk5IG11bHRpcGx5IC02NTg5OTQ3LjgwIC0yNDQ4Ljc1OTMzRS01OTE1NDk3MzQgLT4gMS42MTM3MTk2MkUtNTkxNTQ5NzI0IEluZXhhY3QgUm91bmRlZAoreHBvdzI5OSBwb3dlciAtNjU4OTk0Ny44MCAtMiAtPiAyLjMwMjY5MzA1RS0xNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0yOTkgcmVtYWluZGVyIC02NTg5OTQ3LjgwIC0yNDQ4Ljc1OTMzRS01OTE1NDk3MzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIyOTkgc3VidHJhY3QgLTY1ODk5NDcuODAgLTI0NDguNzU5MzNFLTU5MTU0OTczNCAtPiAtNjU4OTk0Ny44MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMDAgYWRkIDM3NzQuNTM1OEUtNDkxMDkwNTIwIDE3My4wNjAwOTAgLT4gMTczLjA2MDA5MCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMDAgY29tcGFyZSAzNzc0LjUzNThFLTQ5MTA5MDUyMCAxNzMuMDYwMDkwIC0+IC0xCit4ZGl2MzAwIGRpdmlkZSAzNzc0LjUzNThFLTQ5MTA5MDUyMCAxNzMuMDYwMDkwIC0+IDIuMTgxMDU1MDNFLTQ5MTA5MDUxOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDAgZGl2aWRlaW50IDM3NzQuNTM1OEUtNDkxMDkwNTIwIDE3My4wNjAwOTAgLT4gMAoreG11bDMwMCBtdWx0aXBseSAzNzc0LjUzNThFLTQ5MTA5MDUyMCAxNzMuMDYwMDkwIC0+IDYuNTMyMjE1MDVFLTQ5MTA5MDUxNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDAgcG93ZXIgMzc3NC41MzU4RS00OTEwOTA1MjAgMTczIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMwMCByZW1haW5kZXIgMzc3NC41MzU4RS00OTEwOTA1MjAgMTczLjA2MDA5MCAtPiAzLjc3NDUzNThFLTQ5MTA5MDUxNworeHN1YjMwMCBzdWJ0cmFjdCAzNzc0LjUzNThFLTQ5MTA5MDUyMCAxNzMuMDYwMDkwIC0+IC0xNzMuMDYwMDkwIEluZXhhY3QgUm91bmRlZAoreGFkZDMwMSBhZGQgLTEzLjY3ODM2OTAgLTQ1My42MTAxMTcgLT4gLTQ2Ny4yODg0ODYgUm91bmRlZAoreGNvbTMwMSBjb21wYXJlIC0xMy42NzgzNjkwIC00NTMuNjEwMTE3IC0+IDEKK3hkaXYzMDEgZGl2aWRlIC0xMy42NzgzNjkwIC00NTMuNjEwMTE3IC0+IDAuMDMwMTU0NDYxOSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDEgZGl2aWRlaW50IC0xMy42NzgzNjkwIC00NTMuNjEwMTE3IC0+IDAKK3htdWwzMDEgbXVsdGlwbHkgLTEzLjY3ODM2OTAgLTQ1My42MTAxMTcgLT4gNjIwNC42NDY1NiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDEgcG93ZXIgLTEzLjY3ODM2OTAgLTQ1NCAtPiAxLjczOTQ4NTM1RS01MTYgSW5leGFjdCBSb3VuZGVkCit4cmVtMzAxIHJlbWFpbmRlciAtMTMuNjc4MzY5MCAtNDUzLjYxMDExNyAtPiAtMTMuNjc4MzY5MAoreHN1YjMwMSBzdWJ0cmFjdCAtMTMuNjc4MzY5MCAtNDUzLjYxMDExNyAtPiA0MzkuOTMxNzQ4IFJvdW5kZWQKK3hhZGQzMDIgYWRkIC05OTAxMDA5MjcuRS02MTUyNDQ2MzQgMjIzODAxLjQyMUUrMjQ3NjMyNjE4IC0+IDIuMjM4MDE0MjFFKzI0NzYzMjYyMyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMDIgY29tcGFyZSAtOTkwMTAwOTI3LkUtNjE1MjQ0NjM0IDIyMzgwMS40MjFFKzI0NzYzMjYxOCAtPiAtMQoreGRpdjMwMiBkaXZpZGUgLTk5MDEwMDkyNy5FLTYxNTI0NDYzNCAyMjM4MDEuNDIxRSsyNDc2MzI2MTggLT4gLTQuNDI0MDE1MzdFLTg2Mjg3NzI0OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDIgZGl2aWRlaW50IC05OTAxMDA5MjcuRS02MTUyNDQ2MzQgMjIzODAxLjQyMUUrMjQ3NjMyNjE4IC0+IC0wCit4bXVsMzAyIG11bHRpcGx5IC05OTAxMDA5MjcuRS02MTUyNDQ2MzQgMjIzODAxLjQyMUUrMjQ3NjMyNjE4IC0+IC0yLjIxNTg1OTk0RS0zNjc2MTIwMDIgSW5leGFjdCBSb3VuZGVkCit4cG93MzAyIHBvd2VyIC05OTAxMDA5MjcuRS02MTUyNDQ2MzQgMiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0zMDIgcmVtYWluZGVyIC05OTAxMDA5MjcuRS02MTUyNDQ2MzQgMjIzODAxLjQyMUUrMjQ3NjMyNjE4IC0+IC05LjkwMTAwOTI3RS02MTUyNDQ2MjYKK3hzdWIzMDIgc3VidHJhY3QgLTk5MDEwMDkyNy5FLTYxNTI0NDYzNCAyMjM4MDEuNDIxRSsyNDc2MzI2MTggLT4gLTIuMjM4MDE0MjFFKzI0NzYzMjYyMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMDMgYWRkIDEyNzUuMTAyOTIgLTY2Nzk2NTM1MyAtPiAtNjY3OTY0MDc4IEluZXhhY3QgUm91bmRlZAoreGNvbTMwMyBjb21wYXJlIDEyNzUuMTAyOTIgLTY2Nzk2NTM1MyAtPiAxCit4ZGl2MzAzIGRpdmlkZSAxMjc1LjEwMjkyIC02Njc5NjUzNTMgLT4gLTAuMDAwMDAxOTA4OTM1NzIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzAzIGRpdmlkZWludCAxMjc1LjEwMjkyIC02Njc5NjUzNTMgLT4gLTAKK3htdWwzMDMgbXVsdGlwbHkgMTI3NS4xMDI5MiAtNjY3OTY1MzUzIC0+IC04LjUxNzI0NTcyRSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDMgcG93ZXIgMTI3NS4xMDI5MiAtNjY3OTY1MzUzIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMwMyByZW1haW5kZXIgMTI3NS4xMDI5MiAtNjY3OTY1MzUzIC0+IDEyNzUuMTAyOTIKK3hzdWIzMDMgc3VidHJhY3QgMTI3NS4xMDI5MiAtNjY3OTY1MzUzIC0+IDY2Nzk2NjYyOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMDQgYWRkIC04Ljc2Mzc1NDgwRS01OTY3OTIxOTcgOTkyLjA3NzM2MSAtPiA5OTIuMDc3MzYxIEluZXhhY3QgUm91bmRlZAoreGNvbTMwNCBjb21wYXJlIC04Ljc2Mzc1NDgwRS01OTY3OTIxOTcgOTkyLjA3NzM2MSAtPiAtMQoreGRpdjMwNCBkaXZpZGUgLTguNzYzNzU0ODBFLTU5Njc5MjE5NyA5OTIuMDc3MzYxIC0+IC04LjgzMzc0MTM0RS01OTY3OTIyMDAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzA0IGRpdmlkZWludCAtOC43NjM3NTQ4MEUtNTk2NzkyMTk3IDk5Mi4wNzczNjEgLT4gLTAKK3htdWwzMDQgbXVsdGlwbHkgLTguNzYzNzU0ODBFLTU5Njc5MjE5NyA5OTIuMDc3MzYxIC0+IC04LjY5NDMyMjczRS01OTY3OTIxOTQgSW5leGFjdCBSb3VuZGVkCit4cG93MzA0IHBvd2VyIC04Ljc2Mzc1NDgwRS01OTY3OTIxOTcgOTkyIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMwNCByZW1haW5kZXIgLTguNzYzNzU0ODBFLTU5Njc5MjE5NyA5OTIuMDc3MzYxIC0+IC04Ljc2Mzc1NDgwRS01OTY3OTIxOTcKK3hzdWIzMDQgc3VidHJhY3QgLTguNzYzNzU0ODBFLTU5Njc5MjE5NyA5OTIuMDc3MzYxIC0+IC05OTIuMDc3MzYxIEluZXhhY3QgUm91bmRlZAoreGFkZDMwNSBhZGQgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzLjMzNzggLT4gOS41Mzk3NjkzNUUrMzg1NDQ0NzIyIEluZXhhY3QgUm91bmRlZAoreGNvbTMwNSBjb21wYXJlIDk1My45NzY5MzVFKzM4NTQ0NDcyMCA5NjUwMy4zMzc4IC0+IDEKK3hkaXYzMDUgZGl2aWRlIDk1My45NzY5MzVFKzM4NTQ0NDcyMCA5NjUwMy4zMzc4IC0+IDkuODg1NDI5NDJFKzM4NTQ0NDcxNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDUgZGl2aWRlaW50IDk1My45NzY5MzVFKzM4NTQ0NDcyMCA5NjUwMy4zMzc4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzA1IG11bHRpcGx5IDk1My45NzY5MzVFKzM4NTQ0NDcyMCA5NjUwMy4zMzc4IC0+IDkuMjA2MTk1ODRFKzM4NTQ0NDcyNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMDUgcG93ZXIgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTMwNSByZW1haW5kZXIgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzLjMzNzggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMDUgc3VidHJhY3QgOTUzLjk3NjkzNUUrMzg1NDQ0NzIwIDk2NTAzLjMzNzggLT4gOS41Mzk3NjkzNUUrMzg1NDQ0NzIyIEluZXhhY3QgUm91bmRlZAoreGFkZDMwNiBhZGQgMjEzNTc3MTUyIC05ODY3MTAwNzNFKzMxOTAwMDQ2IC0+IC05Ljg2NzEwMDczRSszMTkwMDA1NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMDYgY29tcGFyZSAyMTM1NzcxNTIgLTk4NjcxMDA3M0UrMzE5MDAwNDYgLT4gMQoreGRpdjMwNiBkaXZpZGUgMjEzNTc3MTUyIC05ODY3MTAwNzNFKzMxOTAwMDQ2IC0+IC0yLjE2NDUzODA3RS0zMTkwMDA0NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDYgZGl2aWRlaW50IDIxMzU3NzE1MiAtOTg2NzEwMDczRSszMTkwMDA0NiAtPiAtMAoreG11bDMwNiBtdWx0aXBseSAyMTM1NzcxNTIgLTk4NjcxMDA3M0UrMzE5MDAwNDYgLT4gLTIuMTA3Mzg3MjdFKzMxOTAwMDYzIEluZXhhY3QgUm91bmRlZAoreHBvdzMwNiBwb3dlciAyMTM1NzcxNTIgLTEwIC0+IDUuMDYzNTE0ODdFLTg0IEluZXhhY3QgUm91bmRlZAoreHJlbTMwNiByZW1haW5kZXIgMjEzNTc3MTUyIC05ODY3MTAwNzNFKzMxOTAwMDQ2IC0+IDIxMzU3NzE1MgoreHN1YjMwNiBzdWJ0cmFjdCAyMTM1NzcxNTIgLTk4NjcxMDA3M0UrMzE5MDAwNDYgLT4gOS44NjcxMDA3M0UrMzE5MDAwNTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzA3IGFkZCA5MTM5My45Mzk4RS0zMjM0MzkyMjggLTEzNS43MDEwMDAgLT4gLTEzNS43MDEwMDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMzA3IGNvbXBhcmUgOTEzOTMuOTM5OEUtMzIzNDM5MjI4IC0xMzUuNzAxMDAwIC0+IDEKK3hkaXYzMDcgZGl2aWRlIDkxMzkzLjkzOThFLTMyMzQzOTIyOCAtMTM1LjcwMTAwMCAtPiAtNi43MzQ5NDk2MkUtMzIzNDM5MjI2IEluZXhhY3QgUm91bmRlZAoreGR2aTMwNyBkaXZpZGVpbnQgOTEzOTMuOTM5OEUtMzIzNDM5MjI4IC0xMzUuNzAxMDAwIC0+IC0wCit4bXVsMzA3IG11bHRpcGx5IDkxMzkzLjkzOThFLTMyMzQzOTIyOCAtMTM1LjcwMTAwMCAtPiAtMS4yNDAyMjQ5MEUtMzIzNDM5MjIxIEluZXhhY3QgUm91bmRlZAoreHBvdzMwNyBwb3dlciA5MTM5My45Mzk4RS0zMjM0MzkyMjggLTEzNiAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMDcgcmVtYWluZGVyIDkxMzkzLjkzOThFLTMyMzQzOTIyOCAtMTM1LjcwMTAwMCAtPiA5LjEzOTM5Mzk4RS0zMjM0MzkyMjQKK3hzdWIzMDcgc3VidHJhY3QgOTEzOTMuOTM5OEUtMzIzNDM5MjI4IC0xMzUuNzAxMDAwIC0+IDEzNS43MDEwMDAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzA4IGFkZCAtMzk2LjUwMzU1NyA0NTc1NzI2NC5FLTI1NDM2Mzc4OCAtPiAtMzk2LjUwMzU1NyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMDggY29tcGFyZSAtMzk2LjUwMzU1NyA0NTc1NzI2NC5FLTI1NDM2Mzc4OCAtPiAtMQoreGRpdjMwOCBkaXZpZGUgLTM5Ni41MDM1NTcgNDU3NTcyNjQuRS0yNTQzNjM3ODggLT4gLTguNjY1MzY4NTZFKzI1NDM2Mzc4MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMDggZGl2aWRlaW50IC0zOTYuNTAzNTU3IDQ1NzU3MjY0LkUtMjU0MzYzNzg4IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzA4IG11bHRpcGx5IC0zOTYuNTAzNTU3IDQ1NzU3MjY0LkUtMjU0MzYzNzg4IC0+IC0xLjgxNDI5MTc5RS0yNTQzNjM3NzggSW5leGFjdCBSb3VuZGVkCit4cG93MzA4IHBvd2VyIC0zOTYuNTAzNTU3IDUgLT4gLTkuODAwMjExMjhFKzEyIEluZXhhY3QgUm91bmRlZAoreHJlbTMwOCByZW1haW5kZXIgLTM5Ni41MDM1NTcgNDU3NTcyNjQuRS0yNTQzNjM3ODggLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMDggc3VidHJhY3QgLTM5Ni41MDM1NTcgNDU3NTcyNjQuRS0yNTQzNjM3ODggLT4gLTM5Ni41MDM1NTcgSW5leGFjdCBSb3VuZGVkCit4YWRkMzA5IGFkZCA1OTgwNzg0Ni4xIDEuNTMzNDUyNTQgLT4gNTk4MDc4NDcuNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMDkgY29tcGFyZSA1OTgwNzg0Ni4xIDEuNTMzNDUyNTQgLT4gMQoreGRpdjMwOSBkaXZpZGUgNTk4MDc4NDYuMSAxLjUzMzQ1MjU0IC0+IDM5MDAyMDg0LjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzA5IGRpdmlkZWludCA1OTgwNzg0Ni4xIDEuNTMzNDUyNTQgLT4gMzkwMDIwODQKK3htdWwzMDkgbXVsdGlwbHkgNTk4MDc4NDYuMSAxLjUzMzQ1MjU0IC0+IDkxNzEyNDkzLjUgSW5leGFjdCBSb3VuZGVkCit4cG93MzA5IHBvd2VyIDU5ODA3ODQ2LjEgMiAtPiAzLjU3Njk3ODQ2RSsxNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMDkgcmVtYWluZGVyIDU5ODA3ODQ2LjEgMS41MzM0NTI1NCAtPiAxLjMyNDkwNjY0Cit4c3ViMzA5IHN1YnRyYWN0IDU5ODA3ODQ2LjEgMS41MzM0NTI1NCAtPiA1OTgwNzg0NC42IEluZXhhY3QgUm91bmRlZAoreGFkZDMxMCBhZGQgLTgwNDYxNTguNDUgOC4zNjM1Mzk3IC0+IC04MDQ2MTUwLjA5IEluZXhhY3QgUm91bmRlZAoreGNvbTMxMCBjb21wYXJlIC04MDQ2MTU4LjQ1IDguMzYzNTM5NyAtPiAtMQoreGRpdjMxMCBkaXZpZGUgLTgwNDYxNTguNDUgOC4zNjM1Mzk3IC0+IC05NjIwNTEuODAzIEluZXhhY3QgUm91bmRlZAoreGR2aTMxMCBkaXZpZGVpbnQgLTgwNDYxNTguNDUgOC4zNjM1Mzk3IC0+IC05NjIwNTEKK3htdWwzMTAgbXVsdGlwbHkgLTgwNDYxNTguNDUgOC4zNjM1Mzk3IC0+IC02NzI5NDM2NS42IEluZXhhY3QgUm91bmRlZAoreHBvdzMxMCBwb3dlciAtODA0NjE1OC40NSA4IC0+IDEuNzU2NzQ0NjdFKzU1IEluZXhhY3QgUm91bmRlZAoreHJlbTMxMCByZW1haW5kZXIgLTgwNDYxNTguNDUgOC4zNjM1Mzk3IC0+IC02LjcxODA3NTMKK3hzdWIzMTAgc3VidHJhY3QgLTgwNDYxNTguNDUgOC4zNjM1Mzk3IC0+IC04MDQ2MTY2LjgxIEluZXhhY3QgUm91bmRlZAoreGFkZDMxMSBhZGQgNTUuMTEyMzM4MUUrNTA2MjcyNTAgLTk0LjAzNTUwNDdFLTE2MjU0MDMxNiAtPiA1LjUxMTIzMzgxRSs1MDYyNzI1MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMTEgY29tcGFyZSA1NS4xMTIzMzgxRSs1MDYyNzI1MCAtOTQuMDM1NTA0N0UtMTYyNTQwMzE2IC0+IDEKK3hkaXYzMTEgZGl2aWRlIDU1LjExMjMzODFFKzUwNjI3MjUwIC05NC4wMzU1MDQ3RS0xNjI1NDAzMTYgLT4gLTUuODYwODAxMDFFKzIxMzE2NzU2NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMTEgZGl2aWRlaW50IDU1LjExMjMzODFFKzUwNjI3MjUwIC05NC4wMzU1MDQ3RS0xNjI1NDAzMTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMTEgbXVsdGlwbHkgNTUuMTEyMzM4MUUrNTA2MjcyNTAgLTk0LjAzNTUwNDdFLTE2MjU0MDMxNiAtPiAtNS4xODI1MTY1M0UtMTExOTEzMDYzIEluZXhhY3QgUm91bmRlZAoreHBvdzMxMSBwb3dlciA1NS4xMTIzMzgxRSs1MDYyNzI1MCAtOSAtPiAyLjEzMTg2ODgxRS00NTU2NDUyNjYgSW5leGFjdCBSb3VuZGVkCit4cmVtMzExIHJlbWFpbmRlciA1NS4xMTIzMzgxRSs1MDYyNzI1MCAtOTQuMDM1NTA0N0UtMTYyNTQwMzE2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzExIHN1YnRyYWN0IDU1LjExMjMzODFFKzUwNjI3MjUwIC05NC4wMzU1MDQ3RS0xNjI1NDAzMTYgLT4gNS41MTEyMzM4MUUrNTA2MjcyNTEgSW5leGFjdCBSb3VuZGVkCit4YWRkMzEyIGFkZCAtOTQ4LjAzODA1NCAzNTgwLjg0NTEwIC0+IDI2MzIuODA3MDUgSW5leGFjdCBSb3VuZGVkCit4Y29tMzEyIGNvbXBhcmUgLTk0OC4wMzgwNTQgMzU4MC44NDUxMCAtPiAtMQoreGRpdjMxMiBkaXZpZGUgLTk0OC4wMzgwNTQgMzU4MC44NDUxMCAtPiAtMC4yNjQ3NTI2MDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzEyIGRpdmlkZWludCAtOTQ4LjAzODA1NCAzNTgwLjg0NTEwIC0+IC0wCit4bXVsMzEyIG11bHRpcGx5IC05NDguMDM4MDU0IDM1ODAuODQ1MTAgLT4gLTMzOTQ3NzcuNDIgSW5leGFjdCBSb3VuZGVkCit4cG93MzEyIHBvd2VyIC05NDguMDM4MDU0IDM1ODEgLT4gLTEuMDMwNTgyODhFKzEwNjYwIEluZXhhY3QgUm91bmRlZAoreHJlbTMxMiByZW1haW5kZXIgLTk0OC4wMzgwNTQgMzU4MC44NDUxMCAtPiAtOTQ4LjAzODA1NAoreHN1YjMxMiBzdWJ0cmFjdCAtOTQ4LjAzODA1NCAzNTgwLjg0NTEwIC0+IC00NTI4Ljg4MzE1IEluZXhhY3QgUm91bmRlZAoreGFkZDMxMyBhZGQgLTYwMjYuNDI3NTIgLTE0LjIyODY0MDZFLTMzNDkyMTM2NCAtPiAtNjAyNi40Mjc1MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMTMgY29tcGFyZSAtNjAyNi40Mjc1MiAtMTQuMjI4NjQwNkUtMzM0OTIxMzY0IC0+IC0xCit4ZGl2MzEzIGRpdmlkZSAtNjAyNi40Mjc1MiAtMTQuMjI4NjQwNkUtMzM0OTIxMzY0IC0+IDQuMjM1NDIwNDRFKzMzNDkyMTM2NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMTMgZGl2aWRlaW50IC02MDI2LjQyNzUyIC0xNC4yMjg2NDA2RS0zMzQ5MjEzNjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMTMgbXVsdGlwbHkgLTYwMjYuNDI3NTIgLTE0LjIyODY0MDZFLTMzNDkyMTM2NCAtPiA4LjU3NDc4NzEzRS0zMzQ5MjEzNjAgSW5leGFjdCBSb3VuZGVkCit4cG93MzEzIHBvd2VyIC02MDI2LjQyNzUyIC0xIC0+IC0wLjAwMDE2NTkzNTc4OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMTMgcmVtYWluZGVyIC02MDI2LjQyNzUyIC0xNC4yMjg2NDA2RS0zMzQ5MjEzNjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMTMgc3VidHJhY3QgLTYwMjYuNDI3NTIgLTE0LjIyODY0MDZFLTMzNDkyMTM2NCAtPiAtNjAyNi40Mjc1MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMTQgYWRkIDc5NTUxLjUwMTQgLTUzOC4xODYyMjkgLT4gNzkwMTMuMzE1MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMTQgY29tcGFyZSA3OTU1MS41MDE0IC01MzguMTg2MjI5IC0+IDEKK3hkaXYzMTQgZGl2aWRlIDc5NTUxLjUwMTQgLTUzOC4xODYyMjkgLT4gLTE0Ny44MTQwNzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMzE0IGRpdmlkZWludCA3OTU1MS41MDE0IC01MzguMTg2MjI5IC0+IC0xNDcKK3htdWwzMTQgbXVsdGlwbHkgNzk1NTEuNTAxNCAtNTM4LjE4NjIyOSAtPiAtNDI4MTM1MjIuNSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMTQgcG93ZXIgNzk1NTEuNTAxNCAtNTM4IC0+IDIuODI1OTkzODlFLTI2MzcgSW5leGFjdCBSb3VuZGVkCit4cmVtMzE0IHJlbWFpbmRlciA3OTU1MS41MDE0IC01MzguMTg2MjI5IC0+IDQzOC4xMjU3MzcKK3hzdWIzMTQgc3VidHJhY3QgNzk1NTEuNTAxNCAtNTM4LjE4NjIyOSAtPiA4MDA4OS42ODc2IEluZXhhY3QgUm91bmRlZAoreGFkZDMxNSBhZGQgNDI3MDYwNTYuRSs2MjM1NzgyOTIgLTY5MC4zMjc3NDUgLT4gNC4yNzA2MDU2MEUrNjIzNTc4Mjk5IEluZXhhY3QgUm91bmRlZAoreGNvbTMxNSBjb21wYXJlIDQyNzA2MDU2LkUrNjIzNTc4MjkyIC02OTAuMzI3NzQ1IC0+IDEKK3hkaXYzMTUgZGl2aWRlIDQyNzA2MDU2LkUrNjIzNTc4MjkyIC02OTAuMzI3NzQ1IC0+IC02LjE4NjM0NTAxRSs2MjM1NzgyOTYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzE1IGRpdmlkZWludCA0MjcwNjA1Ni5FKzYyMzU3ODI5MiAtNjkwLjMyNzc0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMxNSBtdWx0aXBseSA0MjcwNjA1Ni5FKzYyMzU3ODI5MiAtNjkwLjMyNzc0NSAtPiAtMi45NDgxMTc1M0UrNjIzNTc4MzAyIEluZXhhY3QgUm91bmRlZAoreHBvdzMxNSBwb3dlciA0MjcwNjA1Ni5FKzYyMzU3ODI5MiAtNjkwIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMxNSByZW1haW5kZXIgNDI3MDYwNTYuRSs2MjM1NzgyOTIgLTY5MC4zMjc3NDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMTUgc3VidHJhY3QgNDI3MDYwNTYuRSs2MjM1NzgyOTIgLTY5MC4zMjc3NDUgLT4gNC4yNzA2MDU2MEUrNjIzNTc4Mjk5IEluZXhhY3QgUm91bmRlZAoreGFkZDMxNiBhZGQgMjQ1NDEzNi4wOEUrNTAyMzc0MDc3IDg1NjI2OC43OTVFLTM1NjY2NDkzNCAtPiAyLjQ1NDEzNjA4RSs1MDIzNzQwODMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzE2IGNvbXBhcmUgMjQ1NDEzNi4wOEUrNTAyMzc0MDc3IDg1NjI2OC43OTVFLTM1NjY2NDkzNCAtPiAxCit4ZGl2MzE2IGRpdmlkZSAyNDU0MTM2LjA4RSs1MDIzNzQwNzcgODU2MjY4Ljc5NUUtMzU2NjY0OTM0IC0+IDIuODY2MDgxNDJFKzg1OTAzOTAxMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMTYgZGl2aWRlaW50IDI0NTQxMzYuMDhFKzUwMjM3NDA3NyA4NTYyNjguNzk1RS0zNTY2NjQ5MzQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMTYgbXVsdGlwbHkgMjQ1NDEzNi4wOEUrNTAyMzc0MDc3IDg1NjI2OC43OTVFLTM1NjY2NDkzNCAtPiAyLjEwMTQwMDE0RSsxNDU3MDkxNTUgSW5leGFjdCBSb3VuZGVkCit4cG93MzE2IHBvd2VyIDI0NTQxMzYuMDhFKzUwMjM3NDA3NyA5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTMxNiByZW1haW5kZXIgMjQ1NDEzNi4wOEUrNTAyMzc0MDc3IDg1NjI2OC43OTVFLTM1NjY2NDkzNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMxNiBzdWJ0cmFjdCAyNDU0MTM2LjA4RSs1MDIzNzQwNzcgODU2MjY4Ljc5NUUtMzU2NjY0OTM0IC0+IDIuNDU0MTM2MDhFKzUwMjM3NDA4MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMTcgYWRkIC0zMjY0MjA0LjU0IC00MjcwNC41MDEgLT4gLTMzMDY5MDkuMDQgSW5leGFjdCBSb3VuZGVkCit4Y29tMzE3IGNvbXBhcmUgLTMyNjQyMDQuNTQgLTQyNzA0LjUwMSAtPiAtMQoreGRpdjMxNyBkaXZpZGUgLTMyNjQyMDQuNTQgLTQyNzA0LjUwMSAtPiA3Ni40MzcwMTQwIEluZXhhY3QgUm91bmRlZAoreGR2aTMxNyBkaXZpZGVpbnQgLTMyNjQyMDQuNTQgLTQyNzA0LjUwMSAtPiA3NgoreG11bDMxNyBtdWx0aXBseSAtMzI2NDIwNC41NCAtNDI3MDQuNTAxIC0+IDEuMzkzOTYyMjZFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzMxNyBwb3dlciAtMzI2NDIwNC41NCAtNDI3MDUgLT4gLTEuMzcyOTM0MTBFLTI3ODE3MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMTcgcmVtYWluZGVyIC0zMjY0MjA0LjU0IC00MjcwNC41MDEgLT4gLTE4NjYyLjQ2NAoreHN1YjMxNyBzdWJ0cmFjdCAtMzI2NDIwNC41NCAtNDI3MDQuNTAxIC0+IC0zMjIxNTAwLjA0IEluZXhhY3QgUm91bmRlZAoreGFkZDMxOCBhZGQgMS4yMTI2NTQ5MiA0NDEwMi42MDczIC0+IDQ0MTAzLjgyMDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMzE4IGNvbXBhcmUgMS4yMTI2NTQ5MiA0NDEwMi42MDczIC0+IC0xCit4ZGl2MzE4IGRpdmlkZSAxLjIxMjY1NDkyIDQ0MTAyLjYwNzMgLT4gMC4wMDAwMjc0OTYyMTgzIEluZXhhY3QgUm91bmRlZAoreGR2aTMxOCBkaXZpZGVpbnQgMS4yMTI2NTQ5MiA0NDEwMi42MDczIC0+IDAKK3htdWwzMTggbXVsdGlwbHkgMS4yMTI2NTQ5MiA0NDEwMi42MDczIC0+IDUzNDgxLjI0MzcgSW5leGFjdCBSb3VuZGVkCit4cG93MzE4IHBvd2VyIDEuMjEyNjU0OTIgNDQxMDMgLT4gMS4xNTY2MjU3M0UrMzY5MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMTggcmVtYWluZGVyIDEuMjEyNjU0OTIgNDQxMDIuNjA3MyAtPiAxLjIxMjY1NDkyCit4c3ViMzE4IHN1YnRyYWN0IDEuMjEyNjU0OTIgNDQxMDIuNjA3MyAtPiAtNDQxMDEuMzk0NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMTkgYWRkIC0xOS4wNTQ3MTFFKzk3NTUxNDY1MiAtMjIxNDQuMDgyMiAtPiAtMS45MDU0NzExMEUrOTc1NTE0NjUzIEluZXhhY3QgUm91bmRlZAoreGNvbTMxOSBjb21wYXJlIC0xOS4wNTQ3MTFFKzk3NTUxNDY1MiAtMjIxNDQuMDgyMiAtPiAtMQoreGRpdjMxOSBkaXZpZGUgLTE5LjA1NDcxMUUrOTc1NTE0NjUyIC0yMjE0NC4wODIyIC0+IDguNjA0ODc3MjlFKzk3NTUxNDY0OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMTkgZGl2aWRlaW50IC0xOS4wNTQ3MTFFKzk3NTUxNDY1MiAtMjIxNDQuMDgyMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMxOSBtdWx0aXBseSAtMTkuMDU0NzExRSs5NzU1MTQ2NTIgLTIyMTQ0LjA4MjIgLT4gNC4yMTk0OTA4N0UrOTc1NTE0NjU3IEluZXhhY3QgUm91bmRlZAoreHBvdzMxOSBwb3dlciAtMTkuMDU0NzExRSs5NzU1MTQ2NTIgLTIyMTQ0IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTMxOSByZW1haW5kZXIgLTE5LjA1NDcxMUUrOTc1NTE0NjUyIC0yMjE0NC4wODIyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzE5IHN1YnRyYWN0IC0xOS4wNTQ3MTFFKzk3NTUxNDY1MiAtMjIxNDQuMDgyMiAtPiAtMS45MDU0NzExMEUrOTc1NTE0NjUzIEluZXhhY3QgUm91bmRlZAoreGFkZDMyMCBhZGQgNzQ1Ljc4NDUyIC0xOTIyLjAwNjcwRSszNzU5MjMzMDIgLT4gLTEuOTIyMDA2NzBFKzM3NTkyMzMwNSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMjAgY29tcGFyZSA3NDUuNzg0NTIgLTE5MjIuMDA2NzBFKzM3NTkyMzMwMiAtPiAxCit4ZGl2MzIwIGRpdmlkZSA3NDUuNzg0NTIgLTE5MjIuMDA2NzBFKzM3NTkyMzMwMiAtPiAtMy44ODAyMzg5MkUtMzc1OTIzMzAzIEluZXhhY3QgUm91bmRlZAoreGR2aTMyMCBkaXZpZGVpbnQgNzQ1Ljc4NDUyIC0xOTIyLjAwNjcwRSszNzU5MjMzMDIgLT4gLTAKK3htdWwzMjAgbXVsdGlwbHkgNzQ1Ljc4NDUyIC0xOTIyLjAwNjcwRSszNzU5MjMzMDIgLT4gLTEuNDMzNDAyODRFKzM3NTkyMzMwOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjAgcG93ZXIgNzQ1Ljc4NDUyIC0yIC0+IDAuMDAwMDAxNzk3OTMyMDQgSW5leGFjdCBSb3VuZGVkCit4cmVtMzIwIHJlbWFpbmRlciA3NDUuNzg0NTIgLTE5MjIuMDA2NzBFKzM3NTkyMzMwMiAtPiA3NDUuNzg0NTIKK3hzdWIzMjAgc3VidHJhY3QgNzQ1Ljc4NDUyIC0xOTIyLjAwNjcwRSszNzU5MjMzMDIgLT4gMS45MjIwMDY3MEUrMzc1OTIzMzA1IEluZXhhY3QgUm91bmRlZAoreGFkZDMyMSBhZGQgLTk2MzcxNzgzNiAtODIzOTg5MzA4IC0+IC0xLjc4NzcwNzE0RSs5IEluZXhhY3QgUm91bmRlZAoreGNvbTMyMSBjb21wYXJlIC05NjM3MTc4MzYgLTgyMzk4OTMwOCAtPiAtMQoreGRpdjMyMSBkaXZpZGUgLTk2MzcxNzgzNiAtODIzOTg5MzA4IC0+IDEuMTY5NTc1NjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzIxIGRpdmlkZWludCAtOTYzNzE3ODM2IC04MjM5ODkzMDggLT4gMQoreG11bDMyMSBtdWx0aXBseSAtOTYzNzE3ODM2IC04MjM5ODkzMDggLT4gNy45NDA5MzE5M0UrMTcgSW5leGFjdCBSb3VuZGVkCit4cG93MzIxIHBvd2VyIC05NjM3MTc4MzYgLTgyMzk4OTMwOCAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0zMjEgcmVtYWluZGVyIC05NjM3MTc4MzYgLTgyMzk4OTMwOCAtPiAtMTM5NzI4NTI4Cit4c3ViMzIxIHN1YnRyYWN0IC05NjM3MTc4MzYgLTgyMzk4OTMwOCAtPiAtMTM5NzI4NTI4Cit4YWRkMzIyIGFkZCA4Mi40MTg1MjkxRS0zMjE5MTkzMDMgLTIxNTc0NzczNy5FLTk5NTE0NzQwMCAtPiA4LjI0MTg1MjkxRS0zMjE5MTkzMDIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzIyIGNvbXBhcmUgODIuNDE4NTI5MUUtMzIxOTE5MzAzIC0yMTU3NDc3MzcuRS05OTUxNDc0MDAgLT4gMQoreGRpdjMyMiBkaXZpZGUgODIuNDE4NTI5MUUtMzIxOTE5MzAzIC0yMTU3NDc3MzcuRS05OTUxNDc0MDAgLT4gLTMuODIwMTM0MTJFKzY3MzIyODA5MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMjIgZGl2aWRlaW50IDgyLjQxODUyOTFFLTMyMTkxOTMwMyAtMjE1NzQ3NzM3LkUtOTk1MTQ3NDAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzIyIG11bHRpcGx5IDgyLjQxODUyOTFFLTMyMTkxOTMwMyAtMjE1NzQ3NzM3LkUtOTk1MTQ3NDAwIC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3czMjIgcG93ZXIgODIuNDE4NTI5MUUtMzIxOTE5MzAzIC0yIC0+IDEuNDcyMTQzOTZFKzY0MzgzODYwMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMjIgcmVtYWluZGVyIDgyLjQxODUyOTFFLTMyMTkxOTMwMyAtMjE1NzQ3NzM3LkUtOTk1MTQ3NDAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzIyIHN1YnRyYWN0IDgyLjQxODUyOTFFLTMyMTkxOTMwMyAtMjE1NzQ3NzM3LkUtOTk1MTQ3NDAwIC0+IDguMjQxODUyOTFFLTMyMTkxOTMwMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMjMgYWRkIC04MDgzMjguNjA3RS03OTA4MTAzNDIgNTMwNzUuNzA4MiAtPiA1MzA3NS43MDgyIEluZXhhY3QgUm91bmRlZAoreGNvbTMyMyBjb21wYXJlIC04MDgzMjguNjA3RS03OTA4MTAzNDIgNTMwNzUuNzA4MiAtPiAtMQoreGRpdjMyMyBkaXZpZGUgLTgwODMyOC42MDdFLTc5MDgxMDM0MiA1MzA3NS43MDgyIC0+IC0xLjUyMjk3MjgxRS03OTA4MTAzNDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzIzIGRpdmlkZWludCAtODA4MzI4LjYwN0UtNzkwODEwMzQyIDUzMDc1LjcwODIgLT4gLTAKK3htdWwzMjMgbXVsdGlwbHkgLTgwODMyOC42MDdFLTc5MDgxMDM0MiA1MzA3NS43MDgyIC0+IC00LjI5MDI2MTMzRS03OTA4MTAzMzIgSW5leGFjdCBSb3VuZGVkCit4cG93MzIzIHBvd2VyIC04MDgzMjguNjA3RS03OTA4MTAzNDIgNTMwNzYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzIzIHJlbWFpbmRlciAtODA4MzI4LjYwN0UtNzkwODEwMzQyIDUzMDc1LjcwODIgLT4gLTguMDgzMjg2MDdFLTc5MDgxMDMzNworeHN1YjMyMyBzdWJ0cmFjdCAtODA4MzI4LjYwN0UtNzkwODEwMzQyIDUzMDc1LjcwODIgLT4gLTUzMDc1LjcwODIgSW5leGFjdCBSb3VuZGVkCit4YWRkMzI0IGFkZCA3MDA1OTIuNzIwIC02OTg0ODUuMDg1IC0+IDIxMDcuNjM1Cit4Y29tMzI0IGNvbXBhcmUgNzAwNTkyLjcyMCAtNjk4NDg1LjA4NSAtPiAxCit4ZGl2MzI0IGRpdmlkZSA3MDA1OTIuNzIwIC02OTg0ODUuMDg1IC0+IC0xLjAwMzAxNzQ0IEluZXhhY3QgUm91bmRlZAoreGR2aTMyNCBkaXZpZGVpbnQgNzAwNTkyLjcyMCAtNjk4NDg1LjA4NSAtPiAtMQoreG11bDMyNCBtdWx0aXBseSA3MDA1OTIuNzIwIC02OTg0ODUuMDg1IC0+IC00Ljg5MzUzNTY2RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjQgcG93ZXIgNzAwNTkyLjcyMCAtNjk4NDg1IC0+IDguODM2OTAwMDBFLTQwODI5NzEgSW5leGFjdCBSb3VuZGVkCit4cmVtMzI0IHJlbWFpbmRlciA3MDA1OTIuNzIwIC02OTg0ODUuMDg1IC0+IDIxMDcuNjM1Cit4c3ViMzI0IHN1YnRyYWN0IDcwMDU5Mi43MjAgLTY5ODQ4NS4wODUgLT4gMTM5OTA3Ny44MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMjUgYWRkIC04MDI3MzkyOC4wIDY2MTM0Ni4yMzkgLT4gLTc5NjEyNTgxLjggSW5leGFjdCBSb3VuZGVkCit4Y29tMzI1IGNvbXBhcmUgLTgwMjczOTI4LjAgNjYxMzQ2LjIzOSAtPiAtMQoreGRpdjMyNSBkaXZpZGUgLTgwMjczOTI4LjAgNjYxMzQ2LjIzOSAtPiAtMTIxLjM3OTU3OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMjUgZGl2aWRlaW50IC04MDI3MzkyOC4wIDY2MTM0Ni4yMzkgLT4gLTEyMQoreG11bDMyNSBtdWx0aXBseSAtODAyNzM5MjguMCA2NjEzNDYuMjM5IC0+IC01LjMwODg4NjA0RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjUgcG93ZXIgLTgwMjczOTI4LjAgNjYxMzQ2IC0+IDUuNDU2NjQ4NTZFKzUyMjc2NTggSW5leGFjdCBSb3VuZGVkCit4cmVtMzI1IHJlbWFpbmRlciAtODAyNzM5MjguMCA2NjEzNDYuMjM5IC0+IC0yNTEwMzMuMDgxCit4c3ViMzI1IHN1YnRyYWN0IC04MDI3MzkyOC4wIDY2MTM0Ni4yMzkgLT4gLTgwOTM1Mjc0LjIgSW5leGFjdCBSb3VuZGVkCit4YWRkMzI2IGFkZCAtMjQwMTgyNTEuMEUrODE5Nzg2NzY0IDU5MTQxLjk2MDBFLTE2NzE2NTA2NSAtPiAtMi40MDE4MjUxMEUrODE5Nzg2NzcxIEluZXhhY3QgUm91bmRlZAoreGNvbTMyNiBjb21wYXJlIC0yNDAxODI1MS4wRSs4MTk3ODY3NjQgNTkxNDEuOTYwMEUtMTY3MTY1MDY1IC0+IC0xCit4ZGl2MzI2IGRpdmlkZSAtMjQwMTgyNTEuMEUrODE5Nzg2NzY0IDU5MTQxLjk2MDBFLTE2NzE2NTA2NSAtPiAtNC4wNjExMTg1NEUrOTg2OTUxODMxIEluZXhhY3QgUm91bmRlZAoreGR2aTMyNiBkaXZpZGVpbnQgLTI0MDE4MjUxLjBFKzgxOTc4Njc2NCA1OTE0MS45NjAwRS0xNjcxNjUwNjUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMjYgbXVsdGlwbHkgLTI0MDE4MjUxLjBFKzgxOTc4Njc2NCA1OTE0MS45NjAwRS0xNjcxNjUwNjUgLT4gLTEuNDIwNDg2NDRFKzY1MjYyMTcxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjYgcG93ZXIgLTI0MDE4MjUxLjBFKzgxOTc4Njc2NCA2IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTMyNiByZW1haW5kZXIgLTI0MDE4MjUxLjBFKzgxOTc4Njc2NCA1OTE0MS45NjAwRS0xNjcxNjUwNjUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMjYgc3VidHJhY3QgLTI0MDE4MjUxLjBFKzgxOTc4Njc2NCA1OTE0MS45NjAwRS0xNjcxNjUwNjUgLT4gLTIuNDAxODI1MTBFKzgxOTc4Njc3MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMjcgYWRkIDI1MTI5NTMuMyAtMzc2OTE3MC4zNUUtOTkzNjIxNjQ1IC0+IDI1MTI5NTMuMzAgSW5leGFjdCBSb3VuZGVkCit4Y29tMzI3IGNvbXBhcmUgMjUxMjk1My4zIC0zNzY5MTcwLjM1RS05OTM2MjE2NDUgLT4gMQoreGRpdjMyNyBkaXZpZGUgMjUxMjk1My4zIC0zNzY5MTcwLjM1RS05OTM2MjE2NDUgLT4gLTYuNjY3MTI1ODNFKzk5MzYyMTY0NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMjcgZGl2aWRlaW50IDI1MTI5NTMuMyAtMzc2OTE3MC4zNUUtOTkzNjIxNjQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzI3IG11bHRpcGx5IDI1MTI5NTMuMyAtMzc2OTE3MC4zNUUtOTkzNjIxNjQ1IC0+IC05LjQ3MTc0OTA3RS05OTM2MjE2MzMgSW5leGFjdCBSb3VuZGVkCit4cG93MzI3IHBvd2VyIDI1MTI5NTMuMyAtNCAtPiAyLjUwNzYyMzQ4RS0yNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMjcgcmVtYWluZGVyIDI1MTI5NTMuMyAtMzc2OTE3MC4zNUUtOTkzNjIxNjQ1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzI3IHN1YnRyYWN0IDI1MTI5NTMuMyAtMzc2OTE3MC4zNUUtOTkzNjIxNjQ1IC0+IDI1MTI5NTMuMzAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzI4IGFkZCAtNjgyLjc5NjM3MCA3MTEzMS4wMjI0IC0+IDcwNDQ4LjIyNjAgSW5leGFjdCBSb3VuZGVkCit4Y29tMzI4IGNvbXBhcmUgLTY4Mi43OTYzNzAgNzExMzEuMDIyNCAtPiAtMQoreGRpdjMyOCBkaXZpZGUgLTY4Mi43OTYzNzAgNzExMzEuMDIyNCAtPiAtMC4wMDk1OTkxMzYxNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMjggZGl2aWRlaW50IC02ODIuNzk2MzcwIDcxMTMxLjAyMjQgLT4gLTAKK3htdWwzMjggbXVsdGlwbHkgLTY4Mi43OTYzNzAgNzExMzEuMDIyNCAtPiAtNDg1NjgwMDMuOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMjggcG93ZXIgLTY4Mi43OTYzNzAgNzExMzEgLT4gLTkuMjgxMTQ3NDFFKzIwMTYwNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMjggcmVtYWluZGVyIC02ODIuNzk2MzcwIDcxMTMxLjAyMjQgLT4gLTY4Mi43OTYzNzAKK3hzdWIzMjggc3VidHJhY3QgLTY4Mi43OTYzNzAgNzExMzEuMDIyNCAtPiAtNzE4MTMuODE4OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMjkgYWRkIDg5Ljk5OTc0OTAgLTQ5OTMuNjk4MzEgLT4gLTQ5MDMuNjk4NTYgSW5leGFjdCBSb3VuZGVkCit4Y29tMzI5IGNvbXBhcmUgODkuOTk5NzQ5MCAtNDk5My42OTgzMSAtPiAxCit4ZGl2MzI5IGRpdmlkZSA4OS45OTk3NDkwIC00OTkzLjY5ODMxIC0+IC0wLjAxODAyMjY2NDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzI5IGRpdmlkZWludCA4OS45OTk3NDkwIC00OTkzLjY5ODMxIC0+IC0wCit4bXVsMzI5IG11bHRpcGx5IDg5Ljk5OTc0OTAgLTQ5OTMuNjk4MzEgLT4gLTQ0OTQzMS41OTQgSW5leGFjdCBSb3VuZGVkCit4cG93MzI5IHBvd2VyIDg5Ljk5OTc0OTAgLTQ5OTQgLT4gMy4zMDMzNjUyNUUtOTc2MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMjkgcmVtYWluZGVyIDg5Ljk5OTc0OTAgLTQ5OTMuNjk4MzEgLT4gODkuOTk5NzQ5MAoreHN1YjMyOSBzdWJ0cmFjdCA4OS45OTk3NDkwIC00OTkzLjY5ODMxIC0+IDUwODMuNjk4MDYgSW5leGFjdCBSb3VuZGVkCit4YWRkMzMwIGFkZCA3NjU2MzM1NC42RS0xMTIzMzg4MzYgMjc4MjcxLjU4NUUtNTExNDgxMDk1IC0+IDcuNjU2MzM1NDZFLTExMjMzODgyOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMzAgY29tcGFyZSA3NjU2MzM1NC42RS0xMTIzMzg4MzYgMjc4MjcxLjU4NUUtNTExNDgxMDk1IC0+IDEKK3hkaXYzMzAgZGl2aWRlIDc2NTYzMzU0LjZFLTExMjMzODgzNiAyNzgyNzEuNTg1RS01MTE0ODEwOTUgLT4gMi43NTEzODk2MEUrMzk5MTQyMjYxIEluZXhhY3QgUm91bmRlZAoreGR2aTMzMCBkaXZpZGVpbnQgNzY1NjMzNTQuNkUtMTEyMzM4ODM2IDI3ODI3MS41ODVFLTUxMTQ4MTA5NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDMzMCBtdWx0aXBseSA3NjU2MzM1NC42RS0xMTIzMzg4MzYgMjc4MjcxLjU4NUUtNTExNDgxMDk1IC0+IDIuMTMwNTQwNjBFLTYyMzgxOTkxOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMzAgcG93ZXIgNzY1NjMzNTQuNkUtMTEyMzM4ODM2IDMgLT4gNC40ODgxMDM0N0UtMzM3MDE2NDg1IEluZXhhY3QgUm91bmRlZAoreHJlbTMzMCByZW1haW5kZXIgNzY1NjMzNTQuNkUtMTEyMzM4ODM2IDI3ODI3MS41ODVFLTUxMTQ4MTA5NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMzMCBzdWJ0cmFjdCA3NjU2MzM1NC42RS0xMTIzMzg4MzYgMjc4MjcxLjU4NUUtNTExNDgxMDk1IC0+IDcuNjU2MzM1NDZFLTExMjMzODgyOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMzEgYWRkIC05MzI0OTkuMDEwIDg3My4zNzc3MDFFLTUwMjE5MDQ1MiAtPiAtOTMyNDk5LjAxMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMzEgY29tcGFyZSAtOTMyNDk5LjAxMCA4NzMuMzc3NzAxRS01MDIxOTA0NTIgLT4gLTEKK3hkaXYzMzEgZGl2aWRlIC05MzI0OTkuMDEwIDg3My4zNzc3MDFFLTUwMjE5MDQ1MiAtPiAtMS4wNjc2OTI3MkUrNTAyMTkwNDU1IEluZXhhY3QgUm91bmRlZAoreGR2aTMzMSBkaXZpZGVpbnQgLTkzMjQ5OS4wMTAgODczLjM3NzcwMUUtNTAyMTkwNDUyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzMxIG11bHRpcGx5IC05MzI0OTkuMDEwIDg3My4zNzc3MDFFLTUwMjE5MDQ1MiAtPiAtOC4xNDQyMzg0MkUtNTAyMTkwNDQ0IEluZXhhY3QgUm91bmRlZAoreHBvdzMzMSBwb3dlciAtOTMyNDk5LjAxMCA5IC0+IC01LjMzMTMyODE1RSs1MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMzEgcmVtYWluZGVyIC05MzI0OTkuMDEwIDg3My4zNzc3MDFFLTUwMjE5MDQ1MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMzMSBzdWJ0cmFjdCAtOTMyNDk5LjAxMCA4NzMuMzc3NzAxRS01MDIxOTA0NTIgLT4gLTkzMjQ5OS4wMTAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzMyIGFkZCAtNzczNTkxOC4yMUUrNzk5NTE0Nzk3IC03NzQ4Ljc4MDIzIC0+IC03LjczNTkxODIxRSs3OTk1MTQ4MDMgSW5leGFjdCBSb3VuZGVkCit4Y29tMzMyIGNvbXBhcmUgLTc3MzU5MTguMjFFKzc5OTUxNDc5NyAtNzc0OC43ODAyMyAtPiAtMQoreGRpdjMzMiBkaXZpZGUgLTc3MzU5MTguMjFFKzc5OTUxNDc5NyAtNzc0OC43ODAyMyAtPiA5Ljk4MzQwMTIzRSs3OTk1MTQ3OTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzMyIGRpdmlkZWludCAtNzczNTkxOC4yMUUrNzk5NTE0Nzk3IC03NzQ4Ljc4MDIzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzMyIG11bHRpcGx5IC03NzM1OTE4LjIxRSs3OTk1MTQ3OTcgLTc3NDguNzgwMjMgLT4gNS45OTQzOTMwMUUrNzk5NTE0ODA3IEluZXhhY3QgUm91bmRlZAoreHBvdzMzMiBwb3dlciAtNzczNTkxOC4yMUUrNzk5NTE0Nzk3IC03NzQ5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0zMzIgcmVtYWluZGVyIC03NzM1OTE4LjIxRSs3OTk1MTQ3OTcgLTc3NDguNzgwMjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzMzIgc3VidHJhY3QgLTc3MzU5MTguMjFFKzc5OTUxNDc5NyAtNzc0OC43ODAyMyAtPiAtNy43MzU5MTgyMUUrNzk5NTE0ODAzIEluZXhhY3QgUm91bmRlZAoreGFkZDMzMyBhZGQgLTM3MDg3ODAuNzVFKzQ0NTIzMjc4NyA5ODAuMDA2NTY3RS03ODA3Mjg2MjMgLT4gLTMuNzA4NzgwNzVFKzQ0NTIzMjc5MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMzMgY29tcGFyZSAtMzcwODc4MC43NUUrNDQ1MjMyNzg3IDk4MC4wMDY1NjdFLTc4MDcyODYyMyAtPiAtMQoreGRpdjMzMyBkaXZpZGUgLTM3MDg3ODAuNzVFKzQ0NTIzMjc4NyA5ODAuMDA2NTY3RS03ODA3Mjg2MjMgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreGR2aTMzMyBkaXZpZGVpbnQgLTM3MDg3ODAuNzVFKzQ0NTIzMjc4NyA5ODAuMDA2NTY3RS03ODA3Mjg2MjMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMzMgbXVsdGlwbHkgLTM3MDg3ODAuNzVFKzQ0NTIzMjc4NyA5ODAuMDA2NTY3RS03ODA3Mjg2MjMgLT4gLTMuNjM0NjI5NDlFLTMzNTQ5NTgyNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMzMgcG93ZXIgLTM3MDg3ODAuNzVFKzQ0NTIzMjc4NyAxMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMzMgcmVtYWluZGVyIC0zNzA4NzgwLjc1RSs0NDUyMzI3ODcgOTgwLjAwNjU2N0UtNzgwNzI4NjIzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzMzIHN1YnRyYWN0IC0zNzA4NzgwLjc1RSs0NDUyMzI3ODcgOTgwLjAwNjU2N0UtNzgwNzI4NjIzIC0+IC0zLjcwODc4MDc1RSs0NDUyMzI3OTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMzM0IGFkZCAtNTIwNTEyNC40NEUtMTQwNTg4NjYxIC00OTUzOTQwMjkuRS02MjA4NTYzMTMgLT4gLTUuMjA1MTI0NDRFLTE0MDU4ODY1NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMzQgY29tcGFyZSAtNTIwNTEyNC40NEUtMTQwNTg4NjYxIC00OTUzOTQwMjkuRS02MjA4NTYzMTMgLT4gLTEKK3hkaXYzMzQgZGl2aWRlIC01MjA1MTI0LjQ0RS0xNDA1ODg2NjEgLTQ5NTM5NDAyOS5FLTYyMDg1NjMxMyAtPiAxLjA1MDcwMzkxRSs0ODAyNjc2NTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzM0IGRpdmlkZWludCAtNTIwNTEyNC40NEUtMTQwNTg4NjYxIC00OTUzOTQwMjkuRS02MjA4NTYzMTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzMzQgbXVsdGlwbHkgLTUyMDUxMjQuNDRFLTE0MDU4ODY2MSAtNDk1Mzk0MDI5LkUtNjIwODU2MzEzIC0+IDIuNTc4NTg3NTdFLTc2MTQ0NDk1OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMzQgcG93ZXIgLTUyMDUxMjQuNDRFLTE0MDU4ODY2MSAtNSAtPiAtMi42MTcyNDUyM0UrNzAyOTQzMjcxIEluZXhhY3QgUm91bmRlZAoreHJlbTMzNCByZW1haW5kZXIgLTUyMDUxMjQuNDRFLTE0MDU4ODY2MSAtNDk1Mzk0MDI5LkUtNjIwODU2MzEzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzM0IHN1YnRyYWN0IC01MjA1MTI0LjQ0RS0xNDA1ODg2NjEgLTQ5NTM5NDAyOS5FLTYyMDg1NjMxMyAtPiAtNS4yMDUxMjQ0NEUtMTQwNTg4NjU1IEluZXhhY3QgUm91bmRlZAoreGFkZDMzNSBhZGQgLTg4NjguNzIwNzQgNTU5MjM5OS45MyAtPiA1NTgzNTMxLjIxIEluZXhhY3QgUm91bmRlZAoreGNvbTMzNSBjb21wYXJlIC04ODY4LjcyMDc0IDU1OTIzOTkuOTMgLT4gLTEKK3hkaXYzMzUgZGl2aWRlIC04ODY4LjcyMDc0IDU1OTIzOTkuOTMgLT4gLTAuMDAxNTg1ODUyMzggSW5leGFjdCBSb3VuZGVkCit4ZHZpMzM1IGRpdmlkZWludCAtODg2OC43MjA3NCA1NTkyMzk5LjkzIC0+IC0wCit4bXVsMzM1IG11bHRpcGx5IC04ODY4LjcyMDc0IDU1OTIzOTkuOTMgLT4gLTQuOTU5NzQzMzJFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzMzNSBwb3dlciAtODg2OC43MjA3NCA1NTkyNDAwIC0+IDUuNTUwNzQxNDJFKzIyMDc4MDE3IEluZXhhY3QgUm91bmRlZAoreHJlbTMzNSByZW1haW5kZXIgLTg4NjguNzIwNzQgNTU5MjM5OS45MyAtPiAtODg2OC43MjA3NAoreHN1YjMzNSBzdWJ0cmFjdCAtODg2OC43MjA3NCA1NTkyMzk5LjkzIC0+IC01NjAxMjY4LjY1IEluZXhhY3QgUm91bmRlZAoreGFkZDMzNiBhZGQgLTc0Ljc4NTIwMzdFLTE3NTIwNTgwOSA0LjE0MzE2NTQyIC0+IDQuMTQzMTY1NDIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzM2IGNvbXBhcmUgLTc0Ljc4NTIwMzdFLTE3NTIwNTgwOSA0LjE0MzE2NTQyIC0+IC0xCit4ZGl2MzM2IGRpdmlkZSAtNzQuNzg1MjAzN0UtMTc1MjA1ODA5IDQuMTQzMTY1NDIgLT4gLTEuODA1MDI1NzdFLTE3NTIwNTgwOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMzYgZGl2aWRlaW50IC03NC43ODUyMDM3RS0xNzUyMDU4MDkgNC4xNDMxNjU0MiAtPiAtMAoreG11bDMzNiBtdWx0aXBseSAtNzQuNzg1MjAzN0UtMTc1MjA1ODA5IDQuMTQzMTY1NDIgLT4gLTMuMDk4NDc0NzBFLTE3NTIwNTgwNyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMzYgcG93ZXIgLTc0Ljc4NTIwMzdFLTE3NTIwNTgwOSA0IC0+IDMuMTI3OTcxMDRFLTcwMDgyMzIyOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMzYgcmVtYWluZGVyIC03NC43ODUyMDM3RS0xNzUyMDU4MDkgNC4xNDMxNjU0MiAtPiAtNy40Nzg1MjAzN0UtMTc1MjA1ODA4Cit4c3ViMzM2IHN1YnRyYWN0IC03NC43ODUyMDM3RS0xNzUyMDU4MDkgNC4xNDMxNjU0MiAtPiAtNC4xNDMxNjU0MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMzcgYWRkIDg0MTk2LjEwOTFFKzI0MjYyODc0OCA4LjA3NTIzMDM2RS0yODgyMzE0NjcgLT4gOC40MTk2MTA5MUUrMjQyNjI4NzUyIEluZXhhY3QgUm91bmRlZAoreGNvbTMzNyBjb21wYXJlIDg0MTk2LjEwOTFFKzI0MjYyODc0OCA4LjA3NTIzMDM2RS0yODgyMzE0NjcgLT4gMQoreGRpdjMzNyBkaXZpZGUgODQxOTYuMTA5MUUrMjQyNjI4NzQ4IDguMDc1MjMwMzZFLTI4ODIzMTQ2NyAtPiAxLjA0MjY0NjUzRSs1MzA4NjAyMTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzM3IGRpdmlkZWludCA4NDE5Ni4xMDkxRSsyNDI2Mjg3NDggOC4wNzUyMzAzNkUtMjg4MjMxNDY3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzM3IG11bHRpcGx5IDg0MTk2LjEwOTFFKzI0MjYyODc0OCA4LjA3NTIzMDM2RS0yODgyMzE0NjcgLT4gNi43OTkwMjk3NkUtNDU2MDI3MTQgSW5leGFjdCBSb3VuZGVkCit4cG93MzM3IHBvd2VyIDg0MTk2LjEwOTFFKzI0MjYyODc0OCA4IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTMzNyByZW1haW5kZXIgODQxOTYuMTA5MUUrMjQyNjI4NzQ4IDguMDc1MjMwMzZFLTI4ODIzMTQ2NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjMzNyBzdWJ0cmFjdCA4NDE5Ni4xMDkxRSsyNDI2Mjg3NDggOC4wNzUyMzAzNkUtMjg4MjMxNDY3IC0+IDguNDE5NjEwOTFFKzI0MjYyODc1MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzMzggYWRkIDM4NjYwMTAzLjEgLTY2NzEuNzMwODVFKzkwMDk5ODQ3NyAtPiAtNi42NzE3MzA4NUUrOTAwOTk4NDgwIEluZXhhY3QgUm91bmRlZAoreGNvbTMzOCBjb21wYXJlIDM4NjYwMTAzLjEgLTY2NzEuNzMwODVFKzkwMDk5ODQ3NyAtPiAxCit4ZGl2MzM4IGRpdmlkZSAzODY2MDEwMy4xIC02NjcxLjczMDg1RSs5MDA5OTg0NzcgLT4gLTUuNzk0NjEzNzJFLTkwMDk5ODQ3NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMzggZGl2aWRlaW50IDM4NjYwMTAzLjEgLTY2NzEuNzMwODVFKzkwMDk5ODQ3NyAtPiAtMAoreG11bDMzOCBtdWx0aXBseSAzODY2MDEwMy4xIC02NjcxLjczMDg1RSs5MDA5OTg0NzcgLT4gLTIuNTc5Mjk4MDNFKzkwMDk5ODQ4OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czMzggcG93ZXIgMzg2NjAxMDMuMSAtNyAtPiA3Ljc0NzQ1MjkwRS01NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zMzggcmVtYWluZGVyIDM4NjYwMTAzLjEgLTY2NzEuNzMwODVFKzkwMDk5ODQ3NyAtPiAzODY2MDEwMy4xCit4c3ViMzM4IHN1YnRyYWN0IDM4NjYwMTAzLjEgLTY2NzEuNzMwODVFKzkwMDk5ODQ3NyAtPiA2LjY3MTczMDg1RSs5MDA5OTg0ODAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzM5IGFkZCAtNTIuMjY1OTQ2MCAtMjk2NDA0MTk5RSszNzIwNTA0NzYgLT4gLTIuOTY0MDQxOTlFKzM3MjA1MDQ4NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zMzkgY29tcGFyZSAtNTIuMjY1OTQ2MCAtMjk2NDA0MTk5RSszNzIwNTA0NzYgLT4gMQoreGRpdjMzOSBkaXZpZGUgLTUyLjI2NTk0NjAgLTI5NjQwNDE5OUUrMzcyMDUwNDc2IC0+IDEuNzYzMzMzNTJFLTM3MjA1MDQ4MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzMzkgZGl2aWRlaW50IC01Mi4yNjU5NDYwIC0yOTY0MDQxOTlFKzM3MjA1MDQ3NiAtPiAwCit4bXVsMzM5IG11bHRpcGx5IC01Mi4yNjU5NDYwIC0yOTY0MDQxOTlFKzM3MjA1MDQ3NiAtPiAxLjU0OTE4NDU5RSszNzIwNTA0ODYgSW5leGFjdCBSb3VuZGVkCit4cG93MzM5IHBvd2VyIC01Mi4yNjU5NDYwIC0zIC0+IC0wLjAwMDAwNzAwMzk1ODMzIEluZXhhY3QgUm91bmRlZAoreHJlbTMzOSByZW1haW5kZXIgLTUyLjI2NTk0NjAgLTI5NjQwNDE5OUUrMzcyMDUwNDc2IC0+IC01Mi4yNjU5NDYwCit4c3ViMzM5IHN1YnRyYWN0IC01Mi4yNjU5NDYwIC0yOTY0MDQxOTlFKzM3MjA1MDQ3NiAtPiAyLjk2NDA0MTk5RSszNzIwNTA0ODQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQwIGFkZCA2LjA2NjI1MDEzIC0yNzYuMzU5MTg2IC0+IC0yNzAuMjkyOTM2IEluZXhhY3QgUm91bmRlZAoreGNvbTM0MCBjb21wYXJlIDYuMDY2MjUwMTMgLTI3Ni4zNTkxODYgLT4gMQoreGRpdjM0MCBkaXZpZGUgNi4wNjYyNTAxMyAtMjc2LjM1OTE4NiAtPiAtMC4wMjE5NTA2MDA3IEluZXhhY3QgUm91bmRlZAoreGR2aTM0MCBkaXZpZGVpbnQgNi4wNjYyNTAxMyAtMjc2LjM1OTE4NiAtPiAtMAoreG11bDM0MCBtdWx0aXBseSA2LjA2NjI1MDEzIC0yNzYuMzU5MTg2IC0+IC0xNjc2LjQ2Mzk1IEluZXhhY3QgUm91bmRlZAoreHBvdzM0MCBwb3dlciA2LjA2NjI1MDEzIC0yNzYgLT4gOC4yMDMzOTE0OUUtMjE3IEluZXhhY3QgUm91bmRlZAoreHJlbTM0MCByZW1haW5kZXIgNi4wNjYyNTAxMyAtMjc2LjM1OTE4NiAtPiA2LjA2NjI1MDEzCit4c3ViMzQwIHN1YnRyYWN0IDYuMDY2MjUwMTMgLTI3Ni4zNTkxODYgLT4gMjgyLjQyNTQzNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNDEgYWRkIC02Mjk3MTYxNy41RS0yNDE0NDQ3NDQgNDYyNjY3OTkuMyAtPiA0NjI2Njc5OS4zIEluZXhhY3QgUm91bmRlZAoreGNvbTM0MSBjb21wYXJlIC02Mjk3MTYxNy41RS0yNDE0NDQ3NDQgNDYyNjY3OTkuMyAtPiAtMQoreGRpdjM0MSBkaXZpZGUgLTYyOTcxNjE3LjVFLTI0MTQ0NDc0NCA0NjI2Njc5OS4zIC0+IC0xLjM2MTA1NDExRS0yNDE0NDQ3NDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzQxIGRpdmlkZWludCAtNjI5NzE2MTcuNUUtMjQxNDQ0NzQ0IDQ2MjY2Nzk5LjMgLT4gLTAKK3htdWwzNDEgbXVsdGlwbHkgLTYyOTcxNjE3LjVFLTI0MTQ0NDc0NCA0NjI2Njc5OS4zIC0+IC0yLjkxMzQ5NTE5RS0yNDE0NDQ3MjkgSW5leGFjdCBSb3VuZGVkCit4cG93MzQxIHBvd2VyIC02Mjk3MTYxNy41RS0yNDE0NDQ3NDQgNDYyNjY3OTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM0MSByZW1haW5kZXIgLTYyOTcxNjE3LjVFLTI0MTQ0NDc0NCA0NjI2Njc5OS4zIC0+IC02LjI5NzE2MTc1RS0yNDE0NDQ3MzcKK3hzdWIzNDEgc3VidHJhY3QgLTYyOTcxNjE3LjVFLTI0MTQ0NDc0NCA0NjI2Njc5OS4zIC0+IC00NjI2Njc5OS4zIEluZXhhY3QgUm91bmRlZAoreGFkZDM0MiBhZGQgLTUuMzY5MTc4MDAgLTMxMTEyNDU5My5FLTk3NjA2NjQ5MSAtPiAtNS4zNjkxNzgwMCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNDIgY29tcGFyZSAtNS4zNjkxNzgwMCAtMzExMTI0NTkzLkUtOTc2MDY2NDkxIC0+IC0xCit4ZGl2MzQyIGRpdmlkZSAtNS4zNjkxNzgwMCAtMzExMTI0NTkzLkUtOTc2MDY2NDkxIC0+IDEuNzI1NzMyNDNFKzk3NjA2NjQ4MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDIgZGl2aWRlaW50IC01LjM2OTE3ODAwIC0zMTExMjQ1OTMuRS05NzYwNjY0OTEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzNDIgbXVsdGlwbHkgLTUuMzY5MTc4MDAgLTMxMTEyNDU5My5FLTk3NjA2NjQ5MSAtPiAxLjY3MDQ4MzMyRS05NzYwNjY0ODIgSW5leGFjdCBSb3VuZGVkCit4cG93MzQyIHBvd2VyIC01LjM2OTE3ODAwIC0zIC0+IC0wLjAwNjQ2MDY1NTY1IEluZXhhY3QgUm91bmRlZAoreHJlbTM0MiByZW1haW5kZXIgLTUuMzY5MTc4MDAgLTMxMTEyNDU5My5FLTk3NjA2NjQ5MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM0MiBzdWJ0cmFjdCAtNS4zNjkxNzgwMCAtMzExMTI0NTkzLkUtOTc2MDY2NDkxIC0+IC01LjM2OTE3ODAwIEluZXhhY3QgUm91bmRlZAoreGFkZDM0MyBhZGQgMjQ2NzkxNS4wMSAtOTIuNTU1ODMyMiAtPiAyNDY3ODIyLjQ1IEluZXhhY3QgUm91bmRlZAoreGNvbTM0MyBjb21wYXJlIDI0Njc5MTUuMDEgLTkyLjU1NTgzMjIgLT4gMQoreGRpdjM0MyBkaXZpZGUgMjQ2NzkxNS4wMSAtOTIuNTU1ODMyMiAtPiAtMjY2NjQuMDY4MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDMgZGl2aWRlaW50IDI0Njc5MTUuMDEgLTkyLjU1NTgzMjIgLT4gLTI2NjY0Cit4bXVsMzQzIG11bHRpcGx5IDI0Njc5MTUuMDEgLTkyLjU1NTgzMjIgLT4gLTIyODQxOTkyOCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDMgcG93ZXIgMjQ2NzkxNS4wMSAtOTMgLT4gMy4yNjA1NTQ0NEUtNTk1IEluZXhhY3QgUm91bmRlZAoreHJlbTM0MyByZW1haW5kZXIgMjQ2NzkxNS4wMSAtOTIuNTU1ODMyMiAtPiA2LjMwMDIxOTIKK3hzdWIzNDMgc3VidHJhY3QgMjQ2NzkxNS4wMSAtOTIuNTU1ODMyMiAtPiAyNDY4MDA3LjU3IEluZXhhY3QgUm91bmRlZAoreGFkZDM0NCBhZGQgMTg3LjIzMjY3MSAtODQwLjQ2OTM0NyAtPiAtNjUzLjIzNjY3NgoreGNvbTM0NCBjb21wYXJlIDE4Ny4yMzI2NzEgLTg0MC40NjkzNDcgLT4gMQoreGRpdjM0NCBkaXZpZGUgMTg3LjIzMjY3MSAtODQwLjQ2OTM0NyAtPiAtMC4yMjI3NzE1NjQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzQ0IGRpdmlkZWludCAxODcuMjMyNjcxIC04NDAuNDY5MzQ3IC0+IC0wCit4bXVsMzQ0IG11bHRpcGx5IDE4Ny4yMzI2NzEgLTg0MC40NjkzNDcgLT4gLTE1NzM2My4zMjEgSW5leGFjdCBSb3VuZGVkCit4cG93MzQ0IHBvd2VyIDE4Ny4yMzI2NzEgLTg0MCAtPiAxLjU4MjgwODYyRS0xOTA5IEluZXhhY3QgUm91bmRlZAoreHJlbTM0NCByZW1haW5kZXIgMTg3LjIzMjY3MSAtODQwLjQ2OTM0NyAtPiAxODcuMjMyNjcxCit4c3ViMzQ0IHN1YnRyYWN0IDE4Ny4yMzI2NzEgLTg0MC40NjkzNDcgLT4gMTAyNy43MDIwMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNDUgYWRkIDgxMjMzLjY4MjMgLTUxOTIuMjE2NjZFKzMwOTMxNTA5MyAtPiAtNS4xOTIyMTY2NkUrMzA5MzE1MDk2IEluZXhhY3QgUm91bmRlZAoreGNvbTM0NSBjb21wYXJlIDgxMjMzLjY4MjMgLTUxOTIuMjE2NjZFKzMwOTMxNTA5MyAtPiAxCit4ZGl2MzQ1IGRpdmlkZSA4MTIzMy42ODIzIC01MTkyLjIxNjY2RSszMDkzMTUwOTMgLT4gLTEuNTY0NTI3OThFLTMwOTMxNTA5MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDUgZGl2aWRlaW50IDgxMjMzLjY4MjMgLTUxOTIuMjE2NjZFKzMwOTMxNTA5MyAtPiAtMAoreG11bDM0NSBtdWx0aXBseSA4MTIzMy42ODIzIC01MTkyLjIxNjY2RSszMDkzMTUwOTMgLT4gLTQuMjE3ODI4NzlFKzMwOTMxNTEwMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDUgcG93ZXIgODEyMzMuNjgyMyAtNSAtPiAyLjgyNjk1NzYzRS0yNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNDUgcmVtYWluZGVyIDgxMjMzLjY4MjMgLTUxOTIuMjE2NjZFKzMwOTMxNTA5MyAtPiA4MTIzMy42ODIzCit4c3ViMzQ1IHN1YnRyYWN0IDgxMjMzLjY4MjMgLTUxOTIuMjE2NjZFKzMwOTMxNTA5MyAtPiA1LjE5MjIxNjY2RSszMDkzMTUwOTYgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQ2IGFkZCAtODU0LjU4NjExMyAtNzkuODcxNTc2MkUtODUzMDY1MTAzIC0+IC04NTQuNTg2MTEzIEluZXhhY3QgUm91bmRlZAoreGNvbTM0NiBjb21wYXJlIC04NTQuNTg2MTEzIC03OS44NzE1NzYyRS04NTMwNjUxMDMgLT4gLTEKK3hkaXYzNDYgZGl2aWRlIC04NTQuNTg2MTEzIC03OS44NzE1NzYyRS04NTMwNjUxMDMgLT4gMS4wNjk5NTAyM0UrODUzMDY1MTA0IEluZXhhY3QgUm91bmRlZAoreGR2aTM0NiBkaXZpZGVpbnQgLTg1NC41ODYxMTMgLTc5Ljg3MTU3NjJFLTg1MzA2NTEwMyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM0NiBtdWx0aXBseSAtODU0LjU4NjExMyAtNzkuODcxNTc2MkUtODUzMDY1MTAzIC0+IDYuODI1NzEzOThFLTg1MzA2NTA5OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDYgcG93ZXIgLTg1NC41ODYxMTMgLTggLT4gMy41MTUyMjY3OUUtMjQgSW5leGFjdCBSb3VuZGVkCit4cmVtMzQ2IHJlbWFpbmRlciAtODU0LjU4NjExMyAtNzkuODcxNTc2MkUtODUzMDY1MTAzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzQ2IHN1YnRyYWN0IC04NTQuNTg2MTEzIC03OS44NzE1NzYyRS04NTMwNjUxMDMgLT4gLTg1NC41ODYxMTMgSW5leGFjdCBSb3VuZGVkCit4YWRkMzQ3IGFkZCA3ODg3MjY2NS4zIDE3Mi4xMDIxMTkgLT4gNzg4NzI4MzcuNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNDcgY29tcGFyZSA3ODg3MjY2NS4zIDE3Mi4xMDIxMTkgLT4gMQoreGRpdjM0NyBkaXZpZGUgNzg4NzI2NjUuMyAxNzIuMTAyMTE5IC0+IDQ1ODI4OS45MTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzQ3IGRpdmlkZWludCA3ODg3MjY2NS4zIDE3Mi4xMDIxMTkgLT4gNDU4Mjg5Cit4bXVsMzQ3IG11bHRpcGx5IDc4ODcyNjY1LjMgMTcyLjEwMjExOSAtPiAxLjM1NzQxNTI4RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDcgcG93ZXIgNzg4NzI2NjUuMyAxNzIgLT4gMS44Njc5MzEzN0UrMTM1OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNDcgcmVtYWluZGVyIDc4ODcyNjY1LjMgMTcyLjEwMjExOSAtPiAxNTcuMjg1NjA5Cit4c3ViMzQ3IHN1YnRyYWN0IDc4ODcyNjY1LjMgMTcyLjEwMjExOSAtPiA3ODg3MjQ5My4yIEluZXhhY3QgUm91bmRlZAoreGFkZDM0OCBhZGQgMzI4MjY4LjFFLTQzNjMxNTYxNyAtMjA0LjUyMjI0NSAtPiAtMjA0LjUyMjI0NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNDggY29tcGFyZSAzMjgyNjguMUUtNDM2MzE1NjE3IC0yMDQuNTIyMjQ1IC0+IDEKK3hkaXYzNDggZGl2aWRlIDMyODI2OC4xRS00MzYzMTU2MTcgLTIwNC41MjIyNDUgLT4gLTEuNjA1MDQ4MzlFLTQzNjMxNTYxNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDggZGl2aWRlaW50IDMyODI2OC4xRS00MzYzMTU2MTcgLTIwNC41MjIyNDUgLT4gLTAKK3htdWwzNDggbXVsdGlwbHkgMzI4MjY4LjFFLTQzNjMxNTYxNyAtMjA0LjUyMjI0NSAtPiAtNi43MTM4MTI4OEUtNDM2MzE1NjEwIEluZXhhY3QgUm91bmRlZAoreHBvdzM0OCBwb3dlciAzMjgyNjguMUUtNDM2MzE1NjE3IC0yMDUgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzQ4IHJlbWFpbmRlciAzMjgyNjguMUUtNDM2MzE1NjE3IC0yMDQuNTIyMjQ1IC0+IDMuMjgyNjgxRS00MzYzMTU2MTIKK3hzdWIzNDggc3VidHJhY3QgMzI4MjY4LjFFLTQzNjMxNTYxNyAtMjA0LjUyMjI0NSAtPiAyMDQuNTIyMjQ1IEluZXhhY3QgUm91bmRlZAoreGFkZDM0OSBhZGQgLTQwMzc5MTEuMDJFKzY0MTM2NzY0NSAyOS41NzEzMDEwIC0+IC00LjAzNzkxMTAyRSs2NDEzNjc2NTEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzQ5IGNvbXBhcmUgLTQwMzc5MTEuMDJFKzY0MTM2NzY0NSAyOS41NzEzMDEwIC0+IC0xCit4ZGl2MzQ5IGRpdmlkZSAtNDAzNzkxMS4wMkUrNjQxMzY3NjQ1IDI5LjU3MTMwMTAgLT4gLTEuMzY1NDgzMDVFKzY0MTM2NzY1MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNDkgZGl2aWRlaW50IC00MDM3OTExLjAyRSs2NDEzNjc2NDUgMjkuNTcxMzAxMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM0OSBtdWx0aXBseSAtNDAzNzkxMS4wMkUrNjQxMzY3NjQ1IDI5LjU3MTMwMTAgLT4gLTEuMTk0MDYyODJFKzY0MTM2NzY1MyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNDkgcG93ZXIgLTQwMzc5MTEuMDJFKzY0MTM2NzY0NSAzMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNDkgcmVtYWluZGVyIC00MDM3OTExLjAyRSs2NDEzNjc2NDUgMjkuNTcxMzAxMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM0OSBzdWJ0cmFjdCAtNDAzNzkxMS4wMkUrNjQxMzY3NjQ1IDI5LjU3MTMwMTAgLT4gLTQuMDM3OTExMDJFKzY0MTM2NzY1MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNTAgYWRkIC02ODg3NTU1NjEuRS05NTMwMTY5OSA5NzguMjc1MzEyRSs5MTM4MTI2MDkgLT4gOS43ODI3NTMxMkUrOTEzODEyNjExIEluZXhhY3QgUm91bmRlZAoreGNvbTM1MCBjb21wYXJlIC02ODg3NTU1NjEuRS05NTMwMTY5OSA5NzguMjc1MzEyRSs5MTM4MTI2MDkgLT4gLTEKK3hkaXYzNTAgZGl2aWRlIC02ODg3NTU1NjEuRS05NTMwMTY5OSA5NzguMjc1MzEyRSs5MTM4MTI2MDkgLT4gLTBFLTEwMDAwMDAwMDcgSW5leGFjdCBSb3VuZGVkIFVuZGVyZmxvdyBTdWJub3JtYWwgQ2xhbXBlZAoreGR2aTM1MCBkaXZpZGVpbnQgLTY4ODc1NTU2MS5FLTk1MzAxNjk5IDk3OC4yNzUzMTJFKzkxMzgxMjYwOSAtPiAtMAoreG11bDM1MCBtdWx0aXBseSAtNjg4NzU1NTYxLkUtOTUzMDE2OTkgOTc4LjI3NTMxMkUrOTEzODEyNjA5IC0+IC02LjczNzkyNTYxRSs4MTg1MTA5MjEgSW5leGFjdCBSb3VuZGVkCit4cG93MzUwIHBvd2VyIC02ODg3NTU1NjEuRS05NTMwMTY5OSAxMCAtPiAyLjQwMjQzMjQ0RS05NTMwMTY5MDIgSW5leGFjdCBSb3VuZGVkCit4cmVtMzUwIHJlbWFpbmRlciAtNjg4NzU1NTYxLkUtOTUzMDE2OTkgOTc4LjI3NTMxMkUrOTEzODEyNjA5IC0+IC02Ljg4NzU1NTYxRS05NTMwMTY5MQoreHN1YjM1MCBzdWJ0cmFjdCAtNjg4NzU1NTYxLkUtOTUzMDE2OTkgOTc4LjI3NTMxMkUrOTEzODEyNjA5IC0+IC05Ljc4Mjc1MzEyRSs5MTM4MTI2MTEgSW5leGFjdCBSb3VuZGVkCit4YWRkMzUxIGFkZCAtNS40NzM0NTUwMiA1OTgxOC43NTgwIC0+IDU5ODEzLjI4NDUgSW5leGFjdCBSb3VuZGVkCit4Y29tMzUxIGNvbXBhcmUgLTUuNDczNDU1MDIgNTk4MTguNzU4MCAtPiAtMQoreGRpdjM1MSBkaXZpZGUgLTUuNDczNDU1MDIgNTk4MTguNzU4MCAtPiAtMC4wMDAwOTE1MDA2NDYzIEluZXhhY3QgUm91bmRlZAoreGR2aTM1MSBkaXZpZGVpbnQgLTUuNDczNDU1MDIgNTk4MTguNzU4MCAtPiAtMAoreG11bDM1MSBtdWx0aXBseSAtNS40NzM0NTUwMiA1OTgxOC43NTgwIC0+IC0zMjc0MTUuMjgxIEluZXhhY3QgUm91bmRlZAoreHBvdzM1MSBwb3dlciAtNS40NzM0NTUwMiA1OTgxOSAtPiAtMS4xNjkxNDE0NkUrNDQxNjIgSW5leGFjdCBSb3VuZGVkCit4cmVtMzUxIHJlbWFpbmRlciAtNS40NzM0NTUwMiA1OTgxOC43NTgwIC0+IC01LjQ3MzQ1NTAyCit4c3ViMzUxIHN1YnRyYWN0IC01LjQ3MzQ1NTAyIDU5ODE4Ljc1ODAgLT4gLTU5ODI0LjIzMTUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzUyIGFkZCA1NjM4OTE2MjBFLTM2MTM1NDU2NyAtODQ1OTAwMzYyLiAtPiAtODQ1OTAwMzYyIEluZXhhY3QgUm91bmRlZAoreGNvbTM1MiBjb21wYXJlIDU2Mzg5MTYyMEUtMzYxMzU0NTY3IC04NDU5MDAzNjIuIC0+IDEKK3hkaXYzNTIgZGl2aWRlIDU2Mzg5MTYyMEUtMzYxMzU0NTY3IC04NDU5MDAzNjIuIC0+IC02LjY2NjE3MDY5RS0zNjEzNTQ1NjggSW5leGFjdCBSb3VuZGVkCit4ZHZpMzUyIGRpdmlkZWludCA1NjM4OTE2MjBFLTM2MTM1NDU2NyAtODQ1OTAwMzYyLiAtPiAtMAoreG11bDM1MiBtdWx0aXBseSA1NjM4OTE2MjBFLTM2MTM1NDU2NyAtODQ1OTAwMzYyLiAtPiAtNC43Njk5NjEyNUUtMzYxMzU0NTUwIEluZXhhY3QgUm91bmRlZAoreHBvdzM1MiBwb3dlciA1NjM4OTE2MjBFLTM2MTM1NDU2NyAtODQ1OTAwMzYyIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTM1MiByZW1haW5kZXIgNTYzODkxNjIwRS0zNjEzNTQ1NjcgLTg0NTkwMDM2Mi4gLT4gNS42Mzg5MTYyMEUtMzYxMzU0NTU5Cit4c3ViMzUyIHN1YnRyYWN0IDU2Mzg5MTYyMEUtMzYxMzU0NTY3IC04NDU5MDAzNjIuIC0+IDg0NTkwMDM2MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNTMgYWRkIC02OS43MjMxMjg2IDg1NzczLjc1MDQgLT4gODU3MDQuMDI3MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNTMgY29tcGFyZSAtNjkuNzIzMTI4NiA4NTc3My43NTA0IC0+IC0xCit4ZGl2MzUzIGRpdmlkZSAtNjkuNzIzMTI4NiA4NTc3My43NTA0IC0+IC0wLjAwMDgxMjg3MjU2NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNTMgZGl2aWRlaW50IC02OS43MjMxMjg2IDg1NzczLjc1MDQgLT4gLTAKK3htdWwzNTMgbXVsdGlwbHkgLTY5LjcyMzEyODYgODU3NzMuNzUwNCAtPiAtNTk4MDQxNC4yMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNTMgcG93ZXIgLTY5LjcyMzEyODYgODU3NzQgLT4gNi40MTcxNDI2MUUrMTU4MTEzIEluZXhhY3QgUm91bmRlZAoreHJlbTM1MyByZW1haW5kZXIgLTY5LjcyMzEyODYgODU3NzMuNzUwNCAtPiAtNjkuNzIzMTI4NgoreHN1YjM1MyBzdWJ0cmFjdCAtNjkuNzIzMTI4NiA4NTc3My43NTA0IC0+IC04NTg0My40NzM1IEluZXhhY3QgUm91bmRlZAoreGFkZDM1NCBhZGQgNTEyNS41MTE4OCA3MzgxNDYzOC40RS01MDA5MzQ3NDEgLT4gNTEyNS41MTE4OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNTQgY29tcGFyZSA1MTI1LjUxMTg4IDczODE0NjM4LjRFLTUwMDkzNDc0MSAtPiAxCit4ZGl2MzU0IGRpdmlkZSA1MTI1LjUxMTg4IDczODE0NjM4LjRFLTUwMDkzNDc0MSAtPiA2Ljk0Mzc2MDc0RSs1MDA5MzQ3MzYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzU0IGRpdmlkZWludCA1MTI1LjUxMTg4IDczODE0NjM4LjRFLTUwMDkzNDc0MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM1NCBtdWx0aXBseSA1MTI1LjUxMTg4IDczODE0NjM4LjRFLTUwMDkzNDc0MSAtPiAzLjc4MzM3ODA2RS01MDA5MzQ3MzAgSW5leGFjdCBSb3VuZGVkCit4cG93MzU0IHBvd2VyIDUxMjUuNTExODggNyAtPiA5LjI5MzEwMjE2RSsyNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNTQgcmVtYWluZGVyIDUxMjUuNTExODggNzM4MTQ2MzguNEUtNTAwOTM0NzQxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzU0IHN1YnRyYWN0IDUxMjUuNTExODggNzM4MTQ2MzguNEUtNTAwOTM0NzQxIC0+IDUxMjUuNTExODggSW5leGFjdCBSb3VuZGVkCit4YWRkMzU1IGFkZCAtNTQuNjI1NDA5NiAtMzMyOTIxODk5LiAtPiAtMzMyOTIxOTU0IEluZXhhY3QgUm91bmRlZAoreGNvbTM1NSBjb21wYXJlIC01NC42MjU0MDk2IC0zMzI5MjE4OTkuIC0+IDEKK3hkaXYzNTUgZGl2aWRlIC01NC42MjU0MDk2IC0zMzI5MjE4OTkuIC0+IDEuNjQwNzg3NTJFLTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzU1IGRpdmlkZWludCAtNTQuNjI1NDA5NiAtMzMyOTIxODk5LiAtPiAwCit4bXVsMzU1IG11bHRpcGx5IC01NC42MjU0MDk2IC0zMzI5MjE4OTkuIC0+IDEuODE4NTk5NTFFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzM1NSBwb3dlciAtNTQuNjI1NDA5NiAtMzMyOTIxODk5IC0+IC0xLjAxNDgyNTY5RS01Nzg0MTY3NDUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzU1IHJlbWFpbmRlciAtNTQuNjI1NDA5NiAtMzMyOTIxODk5LiAtPiAtNTQuNjI1NDA5NgoreHN1YjM1NSBzdWJ0cmFjdCAtNTQuNjI1NDA5NiAtMzMyOTIxODk5LiAtPiAzMzI5MjE4NDQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzU2IGFkZCAtOS4wNDc3ODA5NUUtNTkxODc0MDc5IDg3MTkuNDAyODYgLT4gODcxOS40MDI4NiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNTYgY29tcGFyZSAtOS4wNDc3ODA5NUUtNTkxODc0MDc5IDg3MTkuNDAyODYgLT4gLTEKK3hkaXYzNTYgZGl2aWRlIC05LjA0Nzc4MDk1RS01OTE4NzQwNzkgODcxOS40MDI4NiAtPiAtMS4wMzc2NjA2MkUtNTkxODc0MDgyIEluZXhhY3QgUm91bmRlZAoreGR2aTM1NiBkaXZpZGVpbnQgLTkuMDQ3NzgwOTVFLTU5MTg3NDA3OSA4NzE5LjQwMjg2IC0+IC0wCit4bXVsMzU2IG11bHRpcGx5IC05LjA0Nzc4MDk1RS01OTE4NzQwNzkgODcxOS40MDI4NiAtPiAtNy44ODkxMjQ3MUUtNTkxODc0MDc1IEluZXhhY3QgUm91bmRlZAoreHBvdzM1NiBwb3dlciAtOS4wNDc3ODA5NUUtNTkxODc0MDc5IDg3MTkgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM1NiByZW1haW5kZXIgLTkuMDQ3NzgwOTVFLTU5MTg3NDA3OSA4NzE5LjQwMjg2IC0+IC05LjA0Nzc4MDk1RS01OTE4NzQwNzkKK3hzdWIzNTYgc3VidHJhY3QgLTkuMDQ3NzgwOTVFLTU5MTg3NDA3OSA4NzE5LjQwMjg2IC0+IC04NzE5LjQwMjg2IEluZXhhY3QgUm91bmRlZAoreGFkZDM1NyBhZGQgLTIxMDA2LjE3MzNFKzg4NDY4NDQzMSAtNDg4NzIuOTE3NSAtPiAtMi4xMDA2MTczM0UrODg0Njg0NDM1IEluZXhhY3QgUm91bmRlZAoreGNvbTM1NyBjb21wYXJlIC0yMTAwNi4xNzMzRSs4ODQ2ODQ0MzEgLTQ4ODcyLjkxNzUgLT4gLTEKK3hkaXYzNTcgZGl2aWRlIC0yMTAwNi4xNzMzRSs4ODQ2ODQ0MzEgLTQ4ODcyLjkxNzUgLT4gNC4yOTgxMjE0MUUrODg0Njg0NDMwIEluZXhhY3QgUm91bmRlZAoreGR2aTM1NyBkaXZpZGVpbnQgLTIxMDA2LjE3MzNFKzg4NDY4NDQzMSAtNDg4NzIuOTE3NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM1NyBtdWx0aXBseSAtMjEwMDYuMTczM0UrODg0Njg0NDMxIC00ODg3Mi45MTc1IC0+IDEuMDI2NjMyOTdFKzg4NDY4NDQ0MCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNTcgcG93ZXIgLTIxMDA2LjE3MzNFKzg4NDY4NDQzMSAtNDg4NzMgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM1NyByZW1haW5kZXIgLTIxMDA2LjE3MzNFKzg4NDY4NDQzMSAtNDg4NzIuOTE3NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM1NyBzdWJ0cmFjdCAtMjEwMDYuMTczM0UrODg0Njg0NDMxIC00ODg3Mi45MTc1IC0+IC0yLjEwMDYxNzMzRSs4ODQ2ODQ0MzUgSW5leGFjdCBSb3VuZGVkCit4YWRkMzU4IGFkZCAtMTU0Njc4MyAtNTE5MzUzNzAuNCAtPiAtNTM0ODIxNTMuNAoreGNvbTM1OCBjb21wYXJlIC0xNTQ2NzgzIC01MTkzNTM3MC40IC0+IDEKK3hkaXYzNTggZGl2aWRlIC0xNTQ2NzgzIC01MTkzNTM3MC40IC0+IDAuMDI5NzgyODQzMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNTggZGl2aWRlaW50IC0xNTQ2NzgzIC01MTkzNTM3MC40IC0+IDAKK3htdWwzNTggbXVsdGlwbHkgLTE1NDY3ODMgLTUxOTM1MzcwLjQgLT4gOC4wMzMyNzQ4MEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93MzU4IHBvd2VyIC0xNTQ2NzgzIC01MTkzNTM3MCAtPiAzLjM2MDIyNDYxRS0zMjE0NTAzMDYgSW5leGFjdCBSb3VuZGVkCit4cmVtMzU4IHJlbWFpbmRlciAtMTU0Njc4MyAtNTE5MzUzNzAuNCAtPiAtMTU0Njc4My4wCit4c3ViMzU4IHN1YnRyYWN0IC0xNTQ2NzgzIC01MTkzNTM3MC40IC0+IDUwMzg4NTg3LjQKK3hhZGQzNTkgYWRkIDYxMzAyNDg2LjggMjA1LjQ5MDQxNyAtPiA2MTMwMjY5Mi4zIEluZXhhY3QgUm91bmRlZAoreGNvbTM1OSBjb21wYXJlIDYxMzAyNDg2LjggMjA1LjQ5MDQxNyAtPiAxCit4ZGl2MzU5IGRpdmlkZSA2MTMwMjQ4Ni44IDIwNS40OTA0MTcgLT4gMjk4MzIyLjg1MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNTkgZGl2aWRlaW50IDYxMzAyNDg2LjggMjA1LjQ5MDQxNyAtPiAyOTgzMjIKK3htdWwzNTkgbXVsdGlwbHkgNjEzMDI0ODYuOCAyMDUuNDkwNDE3IC0+IDEuMjU5NzA3MzZFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzM1OSBwb3dlciA2MTMwMjQ4Ni44IDIwNSAtPiAyLjcxMDI0NzU1RSsxNTk2IEluZXhhY3QgUm91bmRlZAoreHJlbTM1OSByZW1haW5kZXIgNjEzMDI0ODYuOCAyMDUuNDkwNDE3IC0+IDE3NC42MTk3MjYKK3hzdWIzNTkgc3VidHJhY3QgNjEzMDI0ODYuOCAyMDUuNDkwNDE3IC0+IDYxMzAyMjgxLjMgSW5leGFjdCBSb3VuZGVkCit4YWRkMzYwIGFkZCAtMzE4MTgwMTA5LiAtNTQwMDg3NDQuNkUtMTcwOTMxMDAyIC0+IC0zMTgxODAxMDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMzYwIGNvbXBhcmUgLTMxODE4MDEwOS4gLTU0MDA4NzQ0LjZFLTE3MDkzMTAwMiAtPiAtMQoreGRpdjM2MCBkaXZpZGUgLTMxODE4MDEwOS4gLTU0MDA4NzQ0LjZFLTE3MDkzMTAwMiAtPiA1Ljg5MTI3MDIzRSsxNzA5MzEwMDIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzYwIGRpdmlkZWludCAtMzE4MTgwMTA5LiAtNTQwMDg3NDQuNkUtMTcwOTMxMDAyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzYwIG11bHRpcGx5IC0zMTgxODAxMDkuIC01NDAwODc0NC42RS0xNzA5MzEwMDIgLT4gMS43MTg0NTA4MkUtMTcwOTMwOTg2IEluZXhhY3QgUm91bmRlZAoreHBvdzM2MCBwb3dlciAtMzE4MTgwMTA5LiAtNSAtPiAtMy4wNjY0NDI4MEUtNDMgSW5leGFjdCBSb3VuZGVkCit4cmVtMzYwIHJlbWFpbmRlciAtMzE4MTgwMTA5LiAtNTQwMDg3NDQuNkUtMTcwOTMxMDAyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzYwIHN1YnRyYWN0IC0zMTgxODAxMDkuIC01NDAwODc0NC42RS0xNzA5MzEwMDIgLT4gLTMxODE4MDEwOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjEgYWRkIC0yODQ4NjEzNy4xRSs5MDE0NDE3MTQgLTQyNDU0Ljk0MCAtPiAtMi44NDg2MTM3MUUrOTAxNDQxNzIxIEluZXhhY3QgUm91bmRlZAoreGNvbTM2MSBjb21wYXJlIC0yODQ4NjEzNy4xRSs5MDE0NDE3MTQgLTQyNDU0Ljk0MCAtPiAtMQoreGRpdjM2MSBkaXZpZGUgLTI4NDg2MTM3LjFFKzkwMTQ0MTcxNCAtNDI0NTQuOTQwIC0+IDYuNzA5NzM0MzlFKzkwMTQ0MTcxNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjEgZGl2aWRlaW50IC0yODQ4NjEzNy4xRSs5MDE0NDE3MTQgLTQyNDU0Ljk0MCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM2MSBtdWx0aXBseSAtMjg0ODYxMzcuMUUrOTAxNDQxNzE0IC00MjQ1NC45NDAgLT4gMS4yMDkzNzcyNEUrOTAxNDQxNzI2IEluZXhhY3QgUm91bmRlZAoreHBvdzM2MSBwb3dlciAtMjg0ODYxMzcuMUUrOTAxNDQxNzE0IC00MjQ1NSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtMzYxIHJlbWFpbmRlciAtMjg0ODYxMzcuMUUrOTAxNDQxNzE0IC00MjQ1NC45NDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzNjEgc3VidHJhY3QgLTI4NDg2MTM3LjFFKzkwMTQ0MTcxNCAtNDI0NTQuOTQwIC0+IC0yLjg0ODYxMzcxRSs5MDE0NDE3MjEgSW5leGFjdCBSb3VuZGVkCit4YWRkMzYyIGFkZCAtNTQ2Mzk4MzI4LiAtMjcuOTE0OTcxMiAtPiAtNTQ2Mzk4MzU2IEluZXhhY3QgUm91bmRlZAoreGNvbTM2MiBjb21wYXJlIC01NDYzOTgzMjguIC0yNy45MTQ5NzEyIC0+IC0xCit4ZGl2MzYyIGRpdmlkZSAtNTQ2Mzk4MzI4LiAtMjcuOTE0OTcxMiAtPiAxOTU3MzY2Ni4yIEluZXhhY3QgUm91bmRlZAoreGR2aTM2MiBkaXZpZGVpbnQgLTU0NjM5ODMyOC4gLTI3LjkxNDk3MTIgLT4gMTk1NzM2NjYKK3htdWwzNjIgbXVsdGlwbHkgLTU0NjM5ODMyOC4gLTI3LjkxNDk3MTIgLT4gMS41MjUyNjkzNkUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzYyIHBvd2VyIC01NDYzOTgzMjguIC0yOCAtPiAyLjIzNzM3MDMyRS0yNDUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzYyIHJlbWFpbmRlciAtNTQ2Mzk4MzI4LiAtMjcuOTE0OTcxMiAtPiAtNS4zMzE1ODA4Cit4c3ViMzYyIHN1YnRyYWN0IC01NDYzOTgzMjguIC0yNy45MTQ5NzEyIC0+IC01NDYzOTgzMDAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzYzIGFkZCA1NDAyMDY2LjFFLTI4NDk3ODIxNiA2MjIuNzUxMTI4IC0+IDYyMi43NTExMjggSW5leGFjdCBSb3VuZGVkCit4Y29tMzYzIGNvbXBhcmUgNTQwMjA2Ni4xRS0yODQ5NzgyMTYgNjIyLjc1MTEyOCAtPiAtMQoreGRpdjM2MyBkaXZpZGUgNTQwMjA2Ni4xRS0yODQ5NzgyMTYgNjIyLjc1MTEyOCAtPiA4LjY3NDUxODM3RS0yODQ5NzgyMTMgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzYzIGRpdmlkZWludCA1NDAyMDY2LjFFLTI4NDk3ODIxNiA2MjIuNzUxMTI4IC0+IDAKK3htdWwzNjMgbXVsdGlwbHkgNTQwMjA2Ni4xRS0yODQ5NzgyMTYgNjIyLjc1MTEyOCAtPiAzLjM2NDE0Mjc2RS0yODQ5NzgyMDcgSW5leGFjdCBSb3VuZGVkCit4cG93MzYzIHBvd2VyIDU0MDIwNjYuMUUtMjg0OTc4MjE2IDYyMyAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0zNjMgcmVtYWluZGVyIDU0MDIwNjYuMUUtMjg0OTc4MjE2IDYyMi43NTExMjggLT4gNS40MDIwNjYxRS0yODQ5NzgyMTAKK3hzdWIzNjMgc3VidHJhY3QgNTQwMjA2Ni4xRS0yODQ5NzgyMTYgNjIyLjc1MTEyOCAtPiAtNjIyLjc1MTEyOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjQgYWRkIDE4ODQ1NjIwIDMxMjkuNDM3NTMgLT4gMTg4NDg3NDkuNCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNjQgY29tcGFyZSAxODg0NTYyMCAzMTI5LjQzNzUzIC0+IDEKK3hkaXYzNjQgZGl2aWRlIDE4ODQ1NjIwIDMxMjkuNDM3NTMgLT4gNjAyMi4wNDcwNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjQgZGl2aWRlaW50IDE4ODQ1NjIwIDMxMjkuNDM3NTMgLT4gNjAyMgoreG11bDM2NCBtdWx0aXBseSAxODg0NTYyMCAzMTI5LjQzNzUzIC0+IDUuODk3NjE5MDVFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzM2NCBwb3dlciAxODg0NTYyMCAzMTI5IC0+IDEuMzU5Njc0NDNFKzIyNzY0IEluZXhhY3QgUm91bmRlZAoreHJlbTM2NCByZW1haW5kZXIgMTg4NDU2MjAgMzEyOS40Mzc1MyAtPiAxNDcuMTk0MzQKK3hzdWIzNjQgc3VidHJhY3QgMTg4NDU2MjAgMzEyOS40Mzc1MyAtPiAxODg0MjQ5MC42IEluZXhhY3QgUm91bmRlZAoreGFkZDM2NSBhZGQgNTA3MDcuMTQxMkUrOTEyNDc1NjcwIC0xOTgwOTguMTg2RSs3MDE0MDc1MjQgLT4gNS4wNzA3MTQxMkUrOTEyNDc1Njc0IEluZXhhY3QgUm91bmRlZAoreGNvbTM2NSBjb21wYXJlIDUwNzA3LjE0MTJFKzkxMjQ3NTY3MCAtMTk4MDk4LjE4NkUrNzAxNDA3NTI0IC0+IDEKK3hkaXYzNjUgZGl2aWRlIDUwNzA3LjE0MTJFKzkxMjQ3NTY3MCAtMTk4MDk4LjE4NkUrNzAxNDA3NTI0IC0+IC0yLjU1OTY5NzQwRSsyMTEwNjgxNDUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzY1IGRpdmlkZWludCA1MDcwNy4xNDEyRSs5MTI0NzU2NzAgLTE5ODA5OC4xODZFKzcwMTQwNzUyNCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM2NSBtdWx0aXBseSA1MDcwNy4xNDEyRSs5MTI0NzU2NzAgLTE5ODA5OC4xODZFKzcwMTQwNzUyNCAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4cG93MzY1IHBvd2VyIDUwNzA3LjE0MTJFKzkxMjQ3NTY3MCAtMiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW0zNjUgcmVtYWluZGVyIDUwNzA3LjE0MTJFKzkxMjQ3NTY3MCAtMTk4MDk4LjE4NkUrNzAxNDA3NTI0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzY1IHN1YnRyYWN0IDUwNzA3LjE0MTJFKzkxMjQ3NTY3MCAtMTk4MDk4LjE4NkUrNzAxNDA3NTI0IC0+IDUuMDcwNzE0MTJFKzkxMjQ3NTY3NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNjYgYWRkIDU1LjgyNDUwMDZFKzkyODg4NTk5MSA5OTE3MDg0My45RS00NzQwMjE2NyAtPiA1LjU4MjQ1MDA2RSs5Mjg4ODU5OTIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzY2IGNvbXBhcmUgNTUuODI0NTAwNkUrOTI4ODg1OTkxIDk5MTcwODQzLjlFLTQ3NDAyMTY3IC0+IDEKK3hkaXYzNjYgZGl2aWRlIDU1LjgyNDUwMDZFKzkyODg4NTk5MSA5OTE3MDg0My45RS00NzQwMjE2NyAtPiA1LjYyOTEyNDI5RSs5NzYyODgxNTEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzY2IGRpdmlkZWludCA1NS44MjQ1MDA2RSs5Mjg4ODU5OTEgOTkxNzA4NDMuOUUtNDc0MDIxNjcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzNjYgbXVsdGlwbHkgNTUuODI0NTAwNkUrOTI4ODg1OTkxIDk5MTcwODQzLjlFLTQ3NDAyMTY3IC0+IDUuNTM2MTYyODNFKzg4MTQ4MzgzMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNjYgcG93ZXIgNTUuODI0NTAwNkUrOTI4ODg1OTkxIDEwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTM2NiByZW1haW5kZXIgNTUuODI0NTAwNkUrOTI4ODg1OTkxIDk5MTcwODQzLjlFLTQ3NDAyMTY3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzY2IHN1YnRyYWN0IDU1LjgyNDUwMDZFKzkyODg4NTk5MSA5OTE3MDg0My45RS00NzQwMjE2NyAtPiA1LjU4MjQ1MDA2RSs5Mjg4ODU5OTIgSW5leGFjdCBSb3VuZGVkCit4YWRkMzY3IGFkZCAxMy44MDAzODgzRS0zODYyMjQ5MjEgLTg0MTI2NDgxLjlFLTI5NjM3ODM0MSAtPiAtOC40MTI2NDgxOUUtMjk2Mzc4MzM0IEluZXhhY3QgUm91bmRlZAoreGNvbTM2NyBjb21wYXJlIDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtODQxMjY0ODEuOUUtMjk2Mzc4MzQxIC0+IDEKK3hkaXYzNjcgZGl2aWRlIDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtODQxMjY0ODEuOUUtMjk2Mzc4MzQxIC0+IC0xLjY0MDQzMzMxRS04OTg0NjU4NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjcgZGl2aWRlaW50IDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtODQxMjY0ODEuOUUtMjk2Mzc4MzQxIC0+IC0wCit4bXVsMzY3IG11bHRpcGx5IDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtODQxMjY0ODEuOUUtMjk2Mzc4MzQxIC0+IC0xLjE2MDk3ODEyRS02ODI2MDMyNTMgSW5leGFjdCBSb3VuZGVkCit4cG93MzY3IHBvd2VyIDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNjcgcmVtYWluZGVyIDEzLjgwMDM4ODNFLTM4NjIyNDkyMSAtODQxMjY0ODEuOUUtMjk2Mzc4MzQxIC0+IDEuMzgwMDM4ODNFLTM4NjIyNDkyMAoreHN1YjM2NyBzdWJ0cmFjdCAxMy44MDAzODgzRS0zODYyMjQ5MjEgLTg0MTI2NDgxLjlFLTI5NjM3ODM0MSAtPiA4LjQxMjY0ODE5RS0yOTYzNzgzMzQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzY4IGFkZCA5ODIwLjkwNDU3IDQ2NjcxLjU5MTUgLT4gNTY0OTIuNDk2MSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNjggY29tcGFyZSA5ODIwLjkwNDU3IDQ2NjcxLjU5MTUgLT4gLTEKK3hkaXYzNjggZGl2aWRlIDk4MjAuOTA0NTcgNDY2NzEuNTkxNSAtPiAwLjIxMDQyNTc0OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNjggZGl2aWRlaW50IDk4MjAuOTA0NTcgNDY2NzEuNTkxNSAtPiAwCit4bXVsMzY4IG11bHRpcGx5IDk4MjAuOTA0NTcgNDY2NzEuNTkxNSAtPiA0NTgzNTcyNDYgSW5leGFjdCBSb3VuZGVkCit4cG93MzY4IHBvd2VyIDk4MjAuOTA0NTcgNDY2NzIgLT4gNC45NDc1MzA3MEUrMTg2MzIxIEluZXhhY3QgUm91bmRlZAoreHJlbTM2OCByZW1haW5kZXIgOTgyMC45MDQ1NyA0NjY3MS41OTE1IC0+IDk4MjAuOTA0NTcKK3hzdWIzNjggc3VidHJhY3QgOTgyMC45MDQ1NyA0NjY3MS41OTE1IC0+IC0zNjg1MC42ODY5IEluZXhhY3QgUm91bmRlZAoreGFkZDM2OSBhZGQgNy4yMjQzNjAwNkUrODMxOTQ5MTUzIC0xMTE2ODgzMEUrMzIyMzMxMDQ1IC0+IDcuMjI0MzYwMDZFKzgzMTk0OTE1MyBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNjkgY29tcGFyZSA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgLTExMTY4ODMwRSszMjIzMzEwNDUgLT4gMQoreGRpdjM2OSBkaXZpZGUgNy4yMjQzNjAwNkUrODMxOTQ5MTUzIC0xMTE2ODgzMEUrMzIyMzMxMDQ1IC0+IC02LjQ2ODMyMzA2RSs1MDk2MTgxMDEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzY5IGRpdmlkZWludCA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgLTExMTY4ODMwRSszMjIzMzEwNDUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzNjkgbXVsdGlwbHkgNy4yMjQzNjAwNkUrODMxOTQ5MTUzIC0xMTE2ODgzMEUrMzIyMzMxMDQ1IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hwb3czNjkgcG93ZXIgNy4yMjQzNjAwNkUrODMxOTQ5MTUzIC0xIC0+IDEuMzg0MjA1NjVFLTgzMTk0OTE1NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNjkgcmVtYWluZGVyIDcuMjI0MzYwMDZFKzgzMTk0OTE1MyAtMTExNjg4MzBFKzMyMjMzMTA0NSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM2OSBzdWJ0cmFjdCA3LjIyNDM2MDA2RSs4MzE5NDkxNTMgLTExMTY4ODMwRSszMjIzMzEwNDUgLT4gNy4yMjQzNjAwNkUrODMxOTQ5MTUzIEluZXhhY3QgUm91bmRlZAoreGFkZDM3MCBhZGQgNDcyNjQ4OTAwIC0yMDcuNzg0MTUzIC0+IDQ3MjY0ODY5MiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNzAgY29tcGFyZSA0NzI2NDg5MDAgLTIwNy43ODQxNTMgLT4gMQoreGRpdjM3MCBkaXZpZGUgNDcyNjQ4OTAwIC0yMDcuNzg0MTUzIC0+IC0yMjc0NzExLjAxIEluZXhhY3QgUm91bmRlZAoreGR2aTM3MCBkaXZpZGVpbnQgNDcyNjQ4OTAwIC0yMDcuNzg0MTUzIC0+IC0yMjc0NzExCit4bXVsMzcwIG11bHRpcGx5IDQ3MjY0ODkwMCAtMjA3Ljc4NDE1MyAtPiAtOS44MjA4OTUxNEUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93MzcwIHBvd2VyIDQ3MjY0ODkwMCAtMjA4IC0+IDQuOTY1NDcxNDVFLTE4MDUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzcwIHJlbWFpbmRlciA0NzI2NDg5MDAgLTIwNy43ODQxNTMgLT4gMS41NDUyMTcKK3hzdWIzNzAgc3VidHJhY3QgNDcyNjQ4OTAwIC0yMDcuNzg0MTUzIC0+IDQ3MjY0OTEwOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNzEgYWRkIC04NzU0LjQ5MzA2IC04MTguMTY1MTUzRSs2MzE0NzU0NTcgLT4gLTguMTgxNjUxNTNFKzYzMTQ3NTQ1OSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNzEgY29tcGFyZSAtODc1NC40OTMwNiAtODE4LjE2NTE1M0UrNjMxNDc1NDU3IC0+IDEKK3hkaXYzNzEgZGl2aWRlIC04NzU0LjQ5MzA2IC04MTguMTY1MTUzRSs2MzE0NzU0NTcgLT4gMS4wNzAwMTUzOUUtNjMxNDc1NDU2IEluZXhhY3QgUm91bmRlZAoreGR2aTM3MSBkaXZpZGVpbnQgLTg3NTQuNDkzMDYgLTgxOC4xNjUxNTNFKzYzMTQ3NTQ1NyAtPiAwCit4bXVsMzcxIG11bHRpcGx5IC04NzU0LjQ5MzA2IC04MTguMTY1MTUzRSs2MzE0NzU0NTcgLT4gNy4xNjI2MjExNUUrNjMxNDc1NDYzIEluZXhhY3QgUm91bmRlZAoreHBvdzM3MSBwb3dlciAtODc1NC40OTMwNiAtOCAtPiAyLjg5ODM1NzY3RS0zMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzEgcmVtYWluZGVyIC04NzU0LjQ5MzA2IC04MTguMTY1MTUzRSs2MzE0NzU0NTcgLT4gLTg3NTQuNDkzMDYKK3hzdWIzNzEgc3VidHJhY3QgLTg3NTQuNDkzMDYgLTgxOC4xNjUxNTNFKzYzMTQ3NTQ1NyAtPiA4LjE4MTY1MTUzRSs2MzE0NzU0NTkgSW5leGFjdCBSb3VuZGVkCit4YWRkMzcyIGFkZCA5ODc1MDg2NCAxOTEzODAuNTUxIC0+IDk4OTQyMjQ0LjYgSW5leGFjdCBSb3VuZGVkCit4Y29tMzcyIGNvbXBhcmUgOTg3NTA4NjQgMTkxMzgwLjU1MSAtPiAxCit4ZGl2MzcyIGRpdmlkZSA5ODc1MDg2NCAxOTEzODAuNTUxIC0+IDUxNS45OTIxNjEgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzcyIGRpdmlkZWludCA5ODc1MDg2NCAxOTEzODAuNTUxIC0+IDUxNQoreG11bDM3MiBtdWx0aXBseSA5ODc1MDg2NCAxOTEzODAuNTUxIC0+IDEuODg5ODk5NDhFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzM3MiBwb3dlciA5ODc1MDg2NCAxOTEzODEgLT4gMS43MDkwODgwOUUrMTUzMDAwMyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzIgcmVtYWluZGVyIDk4NzUwODY0IDE5MTM4MC41NTEgLT4gMTg5ODgwLjIzNQoreHN1YjM3MiBzdWJ0cmFjdCA5ODc1MDg2NCAxOTEzODAuNTUxIC0+IDk4NTU5NDgzLjQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzczIGFkZCA3MjUyOTI1NjEuIC03Njg5NjM2MDYuRSszNDA3NjI5ODYgLT4gLTcuNjg5NjM2MDZFKzM0MDc2Mjk5NCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNzMgY29tcGFyZSA3MjUyOTI1NjEuIC03Njg5NjM2MDYuRSszNDA3NjI5ODYgLT4gMQoreGRpdjM3MyBkaXZpZGUgNzI1MjkyNTYxLiAtNzY4OTYzNjA2LkUrMzQwNzYyOTg2IC0+IC05LjQzMjA3OTE3RS0zNDA3NjI5ODcgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzczIGRpdmlkZWludCA3MjUyOTI1NjEuIC03Njg5NjM2MDYuRSszNDA3NjI5ODYgLT4gLTAKK3htdWwzNzMgbXVsdGlwbHkgNzI1MjkyNTYxLiAtNzY4OTYzNjA2LkUrMzQwNzYyOTg2IC0+IC01LjU3NzIzNTgzRSszNDA3NjMwMDMgSW5leGFjdCBSb3VuZGVkCit4cG93MzczIHBvd2VyIDcyNTI5MjU2MS4gLTggLT4gMS4zMDU4NTI3N0UtNzEgSW5leGFjdCBSb3VuZGVkCit4cmVtMzczIHJlbWFpbmRlciA3MjUyOTI1NjEuIC03Njg5NjM2MDYuRSszNDA3NjI5ODYgLT4gNzI1MjkyNTYxCit4c3ViMzczIHN1YnRyYWN0IDcyNTI5MjU2MS4gLTc2ODk2MzYwNi5FKzM0MDc2Mjk4NiAtPiA3LjY4OTYzNjA2RSszNDA3NjI5OTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzc0IGFkZCAxODYyLjgwNDQ1IDY0ODI1NDQ4My4gLT4gNjQ4MjU2MzQ2IEluZXhhY3QgUm91bmRlZAoreGNvbTM3NCBjb21wYXJlIDE4NjIuODA0NDUgNjQ4MjU0NDgzLiAtPiAtMQoreGRpdjM3NCBkaXZpZGUgMTg2Mi44MDQ0NSA2NDgyNTQ0ODMuIC0+IDAuMDAwMDAyODczNTY5NzIgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzc0IGRpdmlkZWludCAxODYyLjgwNDQ1IDY0ODI1NDQ4My4gLT4gMAoreG11bDM3NCBtdWx0aXBseSAxODYyLjgwNDQ1IDY0ODI1NDQ4My4gLT4gMS4yMDc1NzEzNEUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93Mzc0IHBvd2VyIDE4NjIuODA0NDUgNjQ4MjU0NDgzIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTM3NCByZW1haW5kZXIgMTg2Mi44MDQ0NSA2NDgyNTQ0ODMuIC0+IDE4NjIuODA0NDUKK3hzdWIzNzQgc3VidHJhY3QgMTg2Mi44MDQ0NSA2NDgyNTQ0ODMuIC0+IC02NDgyNTI2MjAgSW5leGFjdCBSb3VuZGVkCit4YWRkMzc1IGFkZCAtNTU0OTMyMC4xIC05MzU4MDY4NC4xIC0+IC05OTEzMDAwNC4yCit4Y29tMzc1IGNvbXBhcmUgLTU1NDkzMjAuMSAtOTM1ODA2ODQuMSAtPiAxCit4ZGl2Mzc1IGRpdmlkZSAtNTU0OTMyMC4xIC05MzU4MDY4NC4xIC0+IDAuMDU5Mjk5ODQ1NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNzUgZGl2aWRlaW50IC01NTQ5MzIwLjEgLTkzNTgwNjg0LjEgLT4gMAoreG11bDM3NSBtdWx0aXBseSAtNTU0OTMyMC4xIC05MzU4MDY4NC4xIC0+IDUuMTkzMDkxNzFFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzM3NSBwb3dlciAtNTU0OTMyMC4xIC05MzU4MDY4NCAtPiA0LjIwNjYyMDc5RS02MzExMzA1NzIgSW5leGFjdCBSb3VuZGVkCit4cmVtMzc1IHJlbWFpbmRlciAtNTU0OTMyMC4xIC05MzU4MDY4NC4xIC0+IC01NTQ5MzIwLjEKK3hzdWIzNzUgc3VidHJhY3QgLTU1NDkzMjAuMSAtOTM1ODA2ODQuMSAtPiA4ODAzMTM2NC4wCit4YWRkMzc2IGFkZCAtMTQ2NzcwNTMuMSAtMjU3ODQuNzM1OCAtPiAtMTQ3MDI4MzcuOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNzYgY29tcGFyZSAtMTQ2NzcwNTMuMSAtMjU3ODQuNzM1OCAtPiAtMQoreGRpdjM3NiBkaXZpZGUgLTE0Njc3MDUzLjEgLTI1Nzg0LjczNTggLT4gNTY5LjIxNDc5NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNzYgZGl2aWRlaW50IC0xNDY3NzA1My4xIC0yNTc4NC43MzU4IC0+IDU2OQoreG11bDM3NiBtdWx0aXBseSAtMTQ2NzcwNTMuMSAtMjU3ODQuNzM1OCAtPiAzLjc4NDQzOTM3RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNzYgcG93ZXIgLTE0Njc3MDUzLjEgLTI1Nzg1IC0+IC0xLjY0NzYwODMxRS0xODQ3OTIgSW5leGFjdCBSb3VuZGVkCit4cmVtMzc2IHJlbWFpbmRlciAtMTQ2NzcwNTMuMSAtMjU3ODQuNzM1OCAtPiAtNTUzOC40Mjk4Cit4c3ViMzc2IHN1YnRyYWN0IC0xNDY3NzA1My4xIC0yNTc4NC43MzU4IC0+IC0xNDY1MTI2OC40IEluZXhhY3QgUm91bmRlZAoreGFkZDM3NyBhZGQgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC03ODM1Nzk3LjAxRSs1MDAwNjczNjQgLT4gNS40NzQwMjMwOEUrNTcxNjg3NjIyIEluZXhhY3QgUm91bmRlZAoreGNvbTM3NyBjb21wYXJlIDU0NzQwMi4zMDhFKzU3MTY4NzYxNyAtNzgzNTc5Ny4wMUUrNTAwMDY3MzY0IC0+IDEKK3hkaXYzNzcgZGl2aWRlIDU0NzQwMi4zMDhFKzU3MTY4NzYxNyAtNzgzNTc5Ny4wMUUrNTAwMDY3MzY0IC0+IC02Ljk4NTkxNzQyRSs3MTYyMDI1MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNzcgZGl2aWRlaW50IDU0NzQwMi4zMDhFKzU3MTY4NzYxNyAtNzgzNTc5Ny4wMUUrNTAwMDY3MzY0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzc3IG11bHRpcGx5IDU0NzQwMi4zMDhFKzU3MTY4NzYxNyAtNzgzNTc5Ny4wMUUrNTAwMDY3MzY0IC0+IC1JbmZpbml0eSBJbmV4YWN0IE92ZXJmbG93IFJvdW5kZWQKK3hwb3czNzcgcG93ZXIgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC04IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM3NyByZW1haW5kZXIgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC03ODM1Nzk3LjAxRSs1MDAwNjczNjQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWIzNzcgc3VidHJhY3QgNTQ3NDAyLjMwOEUrNTcxNjg3NjE3IC03ODM1Nzk3LjAxRSs1MDAwNjczNjQgLT4gNS40NzQwMjMwOEUrNTcxNjg3NjIyIEluZXhhY3QgUm91bmRlZAoreGFkZDM3OCBhZGQgLTQxMzE3MzguMDkgNzU3OS4wNzU2NiAtPiAtNDEyNDE1OS4wMSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zNzggY29tcGFyZSAtNDEzMTczOC4wOSA3NTc5LjA3NTY2IC0+IC0xCit4ZGl2Mzc4IGRpdmlkZSAtNDEzMTczOC4wOSA3NTc5LjA3NTY2IC0+IC01NDUuMTUwNjU5IEluZXhhY3QgUm91bmRlZAoreGR2aTM3OCBkaXZpZGVpbnQgLTQxMzE3MzguMDkgNzU3OS4wNzU2NiAtPiAtNTQ1Cit4bXVsMzc4IG11bHRpcGx5IC00MTMxNzM4LjA5IDc1NzkuMDc1NjYgLT4gLTMuMTMxNDc1NTZFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzM3OCBwb3dlciAtNDEzMTczOC4wOSA3NTc5IC0+IC00LjY4MTMyNzk0RSs1MDE0MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzggcmVtYWluZGVyIC00MTMxNzM4LjA5IDc1NzkuMDc1NjYgLT4gLTExNDEuODU1MzAKK3hzdWIzNzggc3VidHJhY3QgLTQxMzE3MzguMDkgNzU3OS4wNzU2NiAtPiAtNDEzOTMxNy4xNyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzNzkgYWRkIDUwNDU0NC42NDggLTc2NzguOTYxMzNFLTY2MjE0MzI2OCAtPiA1MDQ1NDQuNjQ4IEluZXhhY3QgUm91bmRlZAoreGNvbTM3OSBjb21wYXJlIDUwNDU0NC42NDggLTc2NzguOTYxMzNFLTY2MjE0MzI2OCAtPiAxCit4ZGl2Mzc5IGRpdmlkZSA1MDQ1NDQuNjQ4IC03Njc4Ljk2MTMzRS02NjIxNDMyNjggLT4gLTYuNTcwNDgwMzlFKzY2MjE0MzI2OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzNzkgZGl2aWRlaW50IDUwNDU0NC42NDggLTc2NzguOTYxMzNFLTY2MjE0MzI2OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDM3OSBtdWx0aXBseSA1MDQ1NDQuNjQ4IC03Njc4Ljk2MTMzRS02NjIxNDMyNjggLT4gLTMuODc0Mzc4ODRFLTY2MjE0MzI1OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czNzkgcG93ZXIgNTA0NTQ0LjY0OCAtOCAtPiAyLjM4MTI0MDAxRS00NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zNzkgcmVtYWluZGVyIDUwNDU0NC42NDggLTc2NzguOTYxMzNFLTY2MjE0MzI2OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM3OSBzdWJ0cmFjdCA1MDQ1NDQuNjQ4IC03Njc4Ljk2MTMzRS02NjIxNDMyNjggLT4gNTA0NTQ0LjY0OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzODAgYWRkIDgyOTg5ODI0MSA4OTEyLjk5MTE0RSs5MjkyMjgxNDkgLT4gOC45MTI5OTExNEUrOTI5MjI4MTUyIEluZXhhY3QgUm91bmRlZAoreGNvbTM4MCBjb21wYXJlIDgyOTg5ODI0MSA4OTEyLjk5MTE0RSs5MjkyMjgxNDkgLT4gLTEKK3hkaXYzODAgZGl2aWRlIDgyOTg5ODI0MSA4OTEyLjk5MTE0RSs5MjkyMjgxNDkgLT4gOS4zMTExMDgxMUUtOTI5MjI4MTQ1IEluZXhhY3QgUm91bmRlZAoreGR2aTM4MCBkaXZpZGVpbnQgODI5ODk4MjQxIDg5MTIuOTkxMTRFKzkyOTIyODE0OSAtPiAwCit4bXVsMzgwIG11bHRpcGx5IDgyOTg5ODI0MSA4OTEyLjk5MTE0RSs5MjkyMjgxNDkgLT4gNy4zOTY4NzU2N0UrOTI5MjI4MTYxIEluZXhhY3QgUm91bmRlZAoreHBvdzM4MCBwb3dlciA4Mjk4OTgyNDEgOSAtPiAxLjg2NzM0MDg0RSs4MCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zODAgcmVtYWluZGVyIDgyOTg5ODI0MSA4OTEyLjk5MTE0RSs5MjkyMjgxNDkgLT4gODI5ODk4MjQxCit4c3ViMzgwIHN1YnRyYWN0IDgyOTg5ODI0MSA4OTEyLjk5MTE0RSs5MjkyMjgxNDkgLT4gLTguOTEyOTkxMTRFKzkyOTIyODE1MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzODEgYWRkIDUzLjY4OTE2OTEgLTExLjIzNzExNDAgLT4gNDIuNDUyMDU1MQoreGNvbTM4MSBjb21wYXJlIDUzLjY4OTE2OTEgLTExLjIzNzExNDAgLT4gMQoreGRpdjM4MSBkaXZpZGUgNTMuNjg5MTY5MSAtMTEuMjM3MTE0MCAtPiAtNC43Nzc4NDMyMyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzODEgZGl2aWRlaW50IDUzLjY4OTE2OTEgLTExLjIzNzExNDAgLT4gLTQKK3htdWwzODEgbXVsdGlwbHkgNTMuNjg5MTY5MSAtMTEuMjM3MTE0MCAtPiAtNjAzLjMxMTMxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czODEgcG93ZXIgNTMuNjg5MTY5MSAtMTEgLT4gOS4zNTkzNjcyNUUtMjAgSW5leGFjdCBSb3VuZGVkCit4cmVtMzgxIHJlbWFpbmRlciA1My42ODkxNjkxIC0xMS4yMzcxMTQwIC0+IDguNzQwNzEzMQoreHN1YjM4MSBzdWJ0cmFjdCA1My42ODkxNjkxIC0xMS4yMzcxMTQwIC0+IDY0LjkyNjI4MzEKK3hhZGQzODIgYWRkIC05Mzk1MTgyMy40IC0yNTMxNy44NjQ1IC0+IC05Mzk3NzE0MS4zIEluZXhhY3QgUm91bmRlZAoreGNvbTM4MiBjb21wYXJlIC05Mzk1MTgyMy40IC0yNTMxNy44NjQ1IC0+IC0xCit4ZGl2MzgyIGRpdmlkZSAtOTM5NTE4MjMuNCAtMjUzMTcuODY0NSAtPiAzNzEwLjg5MDUyIEluZXhhY3QgUm91bmRlZAoreGR2aTM4MiBkaXZpZGVpbnQgLTkzOTUxODIzLjQgLTI1MzE3Ljg2NDUgLT4gMzcxMAoreG11bDM4MiBtdWx0aXBseSAtOTM5NTE4MjMuNCAtMjUzMTcuODY0NSAtPiAyLjM3ODY1OTUzRSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3czODIgcG93ZXIgLTkzOTUxODIzLjQgLTI1MzE4IC0+IDkuNjc4NTc3MTRFLTIwMTg1OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zODIgcmVtYWluZGVyIC05Mzk1MTgyMy40IC0yNTMxNy44NjQ1IC0+IC0yMjU0Ni4xMDUwCit4c3ViMzgyIHN1YnRyYWN0IC05Mzk1MTgyMy40IC0yNTMxNy44NjQ1IC0+IC05MzkyNjUwNS41IEluZXhhY3QgUm91bmRlZAoreGFkZDM4MyBhZGQgNDQ2OTE5LjEyMyA5NTEzMzg0OTAuIC0+IDk1MTc4NTQwOSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zODMgY29tcGFyZSA0NDY5MTkuMTIzIDk1MTMzODQ5MC4gLT4gLTEKK3hkaXYzODMgZGl2aWRlIDQ0NjkxOS4xMjMgOTUxMzM4NDkwLiAtPiAwLjAwMDQ2OTc3OTI5MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzODMgZGl2aWRlaW50IDQ0NjkxOS4xMjMgOTUxMzM4NDkwLiAtPiAwCit4bXVsMzgzIG11bHRpcGx5IDQ0NjkxOS4xMjMgOTUxMzM4NDkwLiAtPiA0LjI1MTcxMzY0RSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czODMgcG93ZXIgNDQ2OTE5LjEyMyA5NTEzMzg0OTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzgzIHJlbWFpbmRlciA0NDY5MTkuMTIzIDk1MTMzODQ5MC4gLT4gNDQ2OTE5LjEyMworeHN1YjM4MyBzdWJ0cmFjdCA0NDY5MTkuMTIzIDk1MTMzODQ5MC4gLT4gLTk1MDg5MTU3MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzODQgYWRkIC04LjAxNzg3NzQ4IC04OC4zMDc2ODUyIC0+IC05Ni4zMjU1NjI3IEluZXhhY3QgUm91bmRlZAoreGNvbTM4NCBjb21wYXJlIC04LjAxNzg3NzQ4IC04OC4zMDc2ODUyIC0+IDEKK3hkaXYzODQgZGl2aWRlIC04LjAxNzg3NzQ4IC04OC4zMDc2ODUyIC0+IDAuMDkwNzk0Nzg3MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzODQgZGl2aWRlaW50IC04LjAxNzg3NzQ4IC04OC4zMDc2ODUyIC0+IDAKK3htdWwzODQgbXVsdGlwbHkgLTguMDE3ODc3NDggLTg4LjMwNzY4NTIgLT4gNzA4LjA0MDIwMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czODQgcG93ZXIgLTguMDE3ODc3NDggLTg4IC0+IDIuNzcxODYwODhFLTgwIEluZXhhY3QgUm91bmRlZAoreHJlbTM4NCByZW1haW5kZXIgLTguMDE3ODc3NDggLTg4LjMwNzY4NTIgLT4gLTguMDE3ODc3NDgKK3hzdWIzODQgc3VidHJhY3QgLTguMDE3ODc3NDggLTg4LjMwNzY4NTIgLT4gODAuMjg5ODA3NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzODUgYWRkIDUxNzQ1ODEzOSAtOTk5NzMxLjU0OCAtPiA1MTY0NTg0MDcgSW5leGFjdCBSb3VuZGVkCit4Y29tMzg1IGNvbXBhcmUgNTE3NDU4MTM5IC05OTk3MzEuNTQ4IC0+IDEKK3hkaXYzODUgZGl2aWRlIDUxNzQ1ODEzOSAtOTk5NzMxLjU0OCAtPiAtNTE3LjU5NzA4OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzODUgZGl2aWRlaW50IDUxNzQ1ODEzOSAtOTk5NzMxLjU0OCAtPiAtNTE3Cit4bXVsMzg1IG11bHRpcGx5IDUxNzQ1ODEzOSAtOTk5NzMxLjU0OCAtPiAtNS4xNzMxOTIyNkUrMTQgSW5leGFjdCBSb3VuZGVkCit4cG93Mzg1IHBvd2VyIDUxNzQ1ODEzOSAtOTk5NzMyIC0+IDEuMjQ4MjEzNDZFLTg3MTE1NDAgSW5leGFjdCBSb3VuZGVkCit4cmVtMzg1IHJlbWFpbmRlciA1MTc0NTgxMzkgLTk5OTczMS41NDggLT4gNTk2OTI4LjY4NAoreHN1YjM4NSBzdWJ0cmFjdCA1MTc0NTgxMzkgLTk5OTczMS41NDggLT4gNTE4NDU3ODcxIEluZXhhY3QgUm91bmRlZAoreGFkZDM4NiBhZGQgLTQwNTU0MzQ0MCAtNDAxMy4xODI5NSAtPiAtNDA1NTQ3NDUzIEluZXhhY3QgUm91bmRlZAoreGNvbTM4NiBjb21wYXJlIC00MDU1NDM0NDAgLTQwMTMuMTgyOTUgLT4gLTEKK3hkaXYzODYgZGl2aWRlIC00MDU1NDM0NDAgLTQwMTMuMTgyOTUgLT4gMTAxMDUyLjgxNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzODYgZGl2aWRlaW50IC00MDU1NDM0NDAgLTQwMTMuMTgyOTUgLT4gMTAxMDUyCit4bXVsMzg2IG11bHRpcGx5IC00MDU1NDM0NDAgLTQwMTMuMTgyOTUgLT4gMS42Mjc1MjAwMkUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93Mzg2IHBvd2VyIC00MDU1NDM0NDAgLTQwMTMgLT4gLTguODMwNjE5MzJFLTM0NTQ1IEluZXhhY3QgUm91bmRlZAoreHJlbTM4NiByZW1haW5kZXIgLTQwNTU0MzQ0MCAtNDAxMy4xODI5NSAtPiAtMzI3Ni41MzY2MAoreHN1YjM4NiBzdWJ0cmFjdCAtNDA1NTQzNDQwIC00MDEzLjE4Mjk1IC0+IC00MDU1Mzk0MjcgSW5leGFjdCBSb3VuZGVkCit4YWRkMzg3IGFkZCAtNDkyNDUyNTAuMUUrNjgyNzYwODI1IC04NDg3NzYuNjM3IC0+IC00LjkyNDUyNTAxRSs2ODI3NjA4MzIgSW5leGFjdCBSb3VuZGVkCit4Y29tMzg3IGNvbXBhcmUgLTQ5MjQ1MjUwLjFFKzY4Mjc2MDgyNSAtODQ4Nzc2LjYzNyAtPiAtMQoreGRpdjM4NyBkaXZpZGUgLTQ5MjQ1MjUwLjFFKzY4Mjc2MDgyNSAtODQ4Nzc2LjYzNyAtPiA1LjgwMTkwOTI0RSs2ODI3NjA4MjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzg3IGRpdmlkZWludCAtNDkyNDUyNTAuMUUrNjgyNzYwODI1IC04NDg3NzYuNjM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzg3IG11bHRpcGx5IC00OTI0NTI1MC4xRSs2ODI3NjA4MjUgLTg0ODc3Ni42MzcgLT4gNC4xNzk4MjE3OEUrNjgyNzYwODM4IEluZXhhY3QgUm91bmRlZAoreHBvdzM4NyBwb3dlciAtNDkyNDUyNTAuMUUrNjgyNzYwODI1IC04NDg3NzcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM4NyByZW1haW5kZXIgLTQ5MjQ1MjUwLjFFKzY4Mjc2MDgyNSAtODQ4Nzc2LjYzNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjM4NyBzdWJ0cmFjdCAtNDkyNDUyNTAuMUUrNjgyNzYwODI1IC04NDg3NzYuNjM3IC0+IC00LjkyNDUyNTAxRSs2ODI3NjA4MzIgSW5leGFjdCBSb3VuZGVkCit4YWRkMzg4IGFkZCAtMTUxMTQ0NDU1IC0xNzAzNzEuMjkgLT4gLTE1MTMxNDgyNiBJbmV4YWN0IFJvdW5kZWQKK3hjb20zODggY29tcGFyZSAtMTUxMTQ0NDU1IC0xNzAzNzEuMjkgLT4gLTEKK3hkaXYzODggZGl2aWRlIC0xNTExNDQ0NTUgLTE3MDM3MS4yOSAtPiA4ODcuMTQ3NDQ3IEluZXhhY3QgUm91bmRlZAoreGR2aTM4OCBkaXZpZGVpbnQgLTE1MTE0NDQ1NSAtMTcwMzcxLjI5IC0+IDg4NworeG11bDM4OCBtdWx0aXBseSAtMTUxMTQ0NDU1IC0xNzAzNzEuMjkgLT4gMi41NzUwNjc1OEUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93Mzg4IHBvd2VyIC0xNTExNDQ0NTUgLTE3MDM3MSAtPiAtNS44NjQ5NjM2OUUtMTM5MzUzMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zODggcmVtYWluZGVyIC0xNTExNDQ0NTUgLTE3MDM3MS4yOSAtPiAtMjUxMjAuNzcKK3hzdWIzODggc3VidHJhY3QgLTE1MTE0NDQ1NSAtMTcwMzcxLjI5IC0+IC0xNTA5NzQwODQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzg5IGFkZCAtNzI5MjM2NzQ2LkUrNjYyNzM3MDY3IDkuMTA4MjM2MDIgLT4gLTcuMjkyMzY3NDZFKzY2MjczNzA3NSBJbmV4YWN0IFJvdW5kZWQKK3hjb20zODkgY29tcGFyZSAtNzI5MjM2NzQ2LkUrNjYyNzM3MDY3IDkuMTA4MjM2MDIgLT4gLTEKK3hkaXYzODkgZGl2aWRlIC03MjkyMzY3NDYuRSs2NjI3MzcwNjcgOS4xMDgyMzYwMiAtPiAtOC4wMDYzNDQ0MkUrNjYyNzM3MDc0IEluZXhhY3QgUm91bmRlZAoreGR2aTM4OSBkaXZpZGVpbnQgLTcyOTIzNjc0Ni5FKzY2MjczNzA2NyA5LjEwODIzNjAyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsMzg5IG11bHRpcGx5IC03MjkyMzY3NDYuRSs2NjI3MzcwNjcgOS4xMDgyMzYwMiAtPiAtNi42NDIwNjA0MEUrNjYyNzM3MDc2IEluZXhhY3QgUm91bmRlZAoreHBvdzM4OSBwb3dlciAtNzI5MjM2NzQ2LkUrNjYyNzM3MDY3IDkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTM4OSByZW1haW5kZXIgLTcyOTIzNjc0Ni5FKzY2MjczNzA2NyA5LjEwODIzNjAyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzg5IHN1YnRyYWN0IC03MjkyMzY3NDYuRSs2NjI3MzcwNjcgOS4xMDgyMzYwMiAtPiAtNy4yOTIzNjc0NkUrNjYyNzM3MDc1IEluZXhhY3QgUm91bmRlZAoreGFkZDM5MCBhZGQgNTM0LjM5NDcyOSAtMjM2OTgzOS4zNyAtPiAtMjM2OTMwNC45OCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zOTAgY29tcGFyZSA1MzQuMzk0NzI5IC0yMzY5ODM5LjM3IC0+IDEKK3hkaXYzOTAgZGl2aWRlIDUzNC4zOTQ3MjkgLTIzNjk4MzkuMzcgLT4gLTAuMDAwMjI1NDk4MjkxIEluZXhhY3QgUm91bmRlZAoreGR2aTM5MCBkaXZpZGVpbnQgNTM0LjM5NDcyOSAtMjM2OTgzOS4zNyAtPiAtMAoreG11bDM5MCBtdWx0aXBseSA1MzQuMzk0NzI5IC0yMzY5ODM5LjM3IC0+IC0xLjI2NjQyOTY3RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzM5MCBwb3dlciA1MzQuMzk0NzI5IC0yMzY5ODM5IC0+IDcuMTI1MjI4OTZFLTY0NjQ1OTUgSW5leGFjdCBSb3VuZGVkCit4cmVtMzkwIHJlbWFpbmRlciA1MzQuMzk0NzI5IC0yMzY5ODM5LjM3IC0+IDUzNC4zOTQ3MjkKK3hzdWIzOTAgc3VidHJhY3QgNTM0LjM5NDcyOSAtMjM2OTgzOS4zNyAtPiAyMzcwMzczLjc2IEluZXhhY3QgUm91bmRlZAoreGFkZDM5MSBhZGQgODkxMDAuMTc5NyAyMjQuMzcwMzA5IC0+IDg5MzI0LjU1MDAgSW5leGFjdCBSb3VuZGVkCit4Y29tMzkxIGNvbXBhcmUgODkxMDAuMTc5NyAyMjQuMzcwMzA5IC0+IDEKK3hkaXYzOTEgZGl2aWRlIDg5MTAwLjE3OTcgMjI0LjM3MDMwOSAtPiAzOTcuMTEyMTY3IEluZXhhY3QgUm91bmRlZAoreGR2aTM5MSBkaXZpZGVpbnQgODkxMDAuMTc5NyAyMjQuMzcwMzA5IC0+IDM5NworeG11bDM5MSBtdWx0aXBseSA4OTEwMC4xNzk3IDIyNC4zNzAzMDkgLT4gMTk5OTE0MzQuOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3czOTEgcG93ZXIgODkxMDAuMTc5NyAyMjQgLT4gNS45MjY1NDkzNkUrMTEwOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTEgcmVtYWluZGVyIDg5MTAwLjE3OTcgMjI0LjM3MDMwOSAtPiAyNS4xNjcwMjcKK3hzdWIzOTEgc3VidHJhY3QgODkxMDAuMTc5NyAyMjQuMzcwMzA5IC0+IDg4ODc1LjgwOTQgSW5leGFjdCBSb3VuZGVkCit4YWRkMzkyIGFkZCAtODIxMzc3Ljc3NyAzOC41NTI4MjEgLT4gLTgyMTMzOS4yMjQgSW5leGFjdCBSb3VuZGVkCit4Y29tMzkyIGNvbXBhcmUgLTgyMTM3Ny43NzcgMzguNTUyODIxIC0+IC0xCit4ZGl2MzkyIGRpdmlkZSAtODIxMzc3Ljc3NyAzOC41NTI4MjEgLT4gLTIxMzA1LjI1NzUgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzkyIGRpdmlkZWludCAtODIxMzc3Ljc3NyAzOC41NTI4MjEgLT4gLTIxMzA1Cit4bXVsMzkyIG11bHRpcGx5IC04MjEzNzcuNzc3IDM4LjU1MjgyMSAtPiAtMzE2NjY0MzAuNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czOTIgcG93ZXIgLTgyMTM3Ny43NzcgMzkgLT4gLTQuNjQ3MDI0ODJFKzIzMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTIgcmVtYWluZGVyIC04MjEzNzcuNzc3IDM4LjU1MjgyMSAtPiAtOS45MjU1OTUKK3hzdWIzOTIgc3VidHJhY3QgLTgyMTM3Ny43NzcgMzguNTUyODIxIC0+IC04MjE0MTYuMzMwIEluZXhhY3QgUm91bmRlZAoreGFkZDM5MyBhZGQgLTM5MjY0MC43ODIgLTI1NzE2MTkuNUUrMTEzMjM3ODY1IC0+IC0yLjU3MTYxOTUwRSsxMTMyMzc4NzEgSW5leGFjdCBSb3VuZGVkCit4Y29tMzkzIGNvbXBhcmUgLTM5MjY0MC43ODIgLTI1NzE2MTkuNUUrMTEzMjM3ODY1IC0+IDEKK3hkaXYzOTMgZGl2aWRlIC0zOTI2NDAuNzgyIC0yNTcxNjE5LjVFKzExMzIzNzg2NSAtPiAxLjUyNjgyMzAxRS0xMTMyMzc4NjYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzkzIGRpdmlkZWludCAtMzkyNjQwLjc4MiAtMjU3MTYxOS41RSsxMTMyMzc4NjUgLT4gMAoreG11bDM5MyBtdWx0aXBseSAtMzkyNjQwLjc4MiAtMjU3MTYxOS41RSsxMTMyMzc4NjUgLT4gMS4wMDk3MjI2OUUrMTEzMjM3ODc3IEluZXhhY3QgUm91bmRlZAoreHBvdzM5MyBwb3dlciAtMzkyNjQwLjc4MiAtMyAtPiAtMS42NTIwMTQyMkUtMTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMzkzIHJlbWFpbmRlciAtMzkyNjQwLjc4MiAtMjU3MTYxOS41RSsxMTMyMzc4NjUgLT4gLTM5MjY0MC43ODIKK3hzdWIzOTMgc3VidHJhY3QgLTM5MjY0MC43ODIgLTI1NzE2MTkuNUUrMTEzMjM3ODY1IC0+IDIuNTcxNjE5NTBFKzExMzIzNzg3MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzOTQgYWRkIC02NTEzOTcuNzEyIC03MjMuNTk2NzMgLT4gLTY1MjEyMS4zMDkgSW5leGFjdCBSb3VuZGVkCit4Y29tMzk0IGNvbXBhcmUgLTY1MTM5Ny43MTIgLTcyMy41OTY3MyAtPiAtMQoreGRpdjM5NCBkaXZpZGUgLTY1MTM5Ny43MTIgLTcyMy41OTY3MyAtPiA5MDAuMjIyMDIzIEluZXhhY3QgUm91bmRlZAoreGR2aTM5NCBkaXZpZGVpbnQgLTY1MTM5Ny43MTIgLTcyMy41OTY3MyAtPiA5MDAKK3htdWwzOTQgbXVsdGlwbHkgLTY1MTM5Ny43MTIgLTcyMy41OTY3MyAtPiA0NzEzNDkyNTQgSW5leGFjdCBSb3VuZGVkCit4cG93Mzk0IHBvd2VyIC02NTEzOTcuNzEyIC03MjQgLT4gNS45NjExNTQxNUUtNDIxMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTQgcmVtYWluZGVyIC02NTEzOTcuNzEyIC03MjMuNTk2NzMgLT4gLTE2MC42NTUwMAoreHN1YjM5NCBzdWJ0cmFjdCAtNjUxMzk3LjcxMiAtNzIzLjU5NjczIC0+IC02NTA2NzQuMTE1IEluZXhhY3QgUm91bmRlZAoreGFkZDM5NSBhZGQgODYuNjg5MDg5MiA5NDAzODA4NjQgLT4gOTQwMzgwOTUxIEluZXhhY3QgUm91bmRlZAoreGNvbTM5NSBjb21wYXJlIDg2LjY4OTA4OTIgOTQwMzgwODY0IC0+IC0xCit4ZGl2Mzk1IGRpdmlkZSA4Ni42ODkwODkyIDk0MDM4MDg2NCAtPiA5LjIxODUwODQzRS04IEluZXhhY3QgUm91bmRlZAoreGR2aTM5NSBkaXZpZGVpbnQgODYuNjg5MDg5MiA5NDAzODA4NjQgLT4gMAoreG11bDM5NSBtdWx0aXBseSA4Ni42ODkwODkyIDk0MDM4MDg2NCAtPiA4LjE1MjA3NjA2RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3czOTUgcG93ZXIgODYuNjg5MDg5MiA5NDAzODA4NjQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtMzk1IHJlbWFpbmRlciA4Ni42ODkwODkyIDk0MDM4MDg2NCAtPiA4Ni42ODkwODkyCit4c3ViMzk1IHN1YnRyYWN0IDg2LjY4OTA4OTIgOTQwMzgwODY0IC0+IC05NDAzODA3NzcgSW5leGFjdCBSb3VuZGVkCit4YWRkMzk2IGFkZCA0ODgwLjA2NDQyRS0zODIyMjI2MjEgLTExNTYyNzIzOUUtOTEyODM0MDMxIC0+IDQuODgwMDY0NDJFLTM4MjIyMjYxOCBJbmV4YWN0IFJvdW5kZWQKK3hjb20zOTYgY29tcGFyZSA0ODgwLjA2NDQyRS0zODIyMjI2MjEgLTExNTYyNzIzOUUtOTEyODM0MDMxIC0+IDEKK3hkaXYzOTYgZGl2aWRlIDQ4ODAuMDY0NDJFLTM4MjIyMjYyMSAtMTE1NjI3MjM5RS05MTI4MzQwMzEgLT4gLTQuMjIwNTE0NTNFKzUzMDYxMTQwNSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzOTYgZGl2aWRlaW50IDQ4ODAuMDY0NDJFLTM4MjIyMjYyMSAtMTE1NjI3MjM5RS05MTI4MzQwMzEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWwzOTYgbXVsdGlwbHkgNDg4MC4wNjQ0MkUtMzgyMjIyNjIxIC0xMTU2MjcyMzlFLTkxMjgzNDAzMSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cG93Mzk2IHBvd2VyIDQ4ODAuMDY0NDJFLTM4MjIyMjYyMSAtMSAtPiAyLjA0OTE1MzI4RSszODIyMjI2MTcgSW5leGFjdCBSb3VuZGVkCit4cmVtMzk2IHJlbWFpbmRlciA0ODgwLjA2NDQyRS0zODIyMjI2MjEgLTExNTYyNzIzOUUtOTEyODM0MDMxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViMzk2IHN1YnRyYWN0IDQ4ODAuMDY0NDJFLTM4MjIyMjYyMSAtMTE1NjI3MjM5RS05MTI4MzQwMzEgLT4gNC44ODAwNjQ0MkUtMzgyMjIyNjE4IEluZXhhY3QgUm91bmRlZAoreGFkZDM5NyBhZGQgMTczMzk4MjY1RS01MzIzODMxNTggMzQ2Mi41MTQ1MEUrODA5ODY5MTUgLT4gMy40NjI1MTQ1MEUrODA5ODY5MTggSW5leGFjdCBSb3VuZGVkCit4Y29tMzk3IGNvbXBhcmUgMTczMzk4MjY1RS01MzIzODMxNTggMzQ2Mi41MTQ1MEUrODA5ODY5MTUgLT4gLTEKK3hkaXYzOTcgZGl2aWRlIDE3MzM5ODI2NUUtNTMyMzgzMTU4IDM0NjIuNTE0NTBFKzgwOTg2OTE1IC0+IDUuMDA3ODcxMTZFLTYxMzM3MDA2OSBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzOTcgZGl2aWRlaW50IDE3MzM5ODI2NUUtNTMyMzgzMTU4IDM0NjIuNTE0NTBFKzgwOTg2OTE1IC0+IDAKK3htdWwzOTcgbXVsdGlwbHkgMTczMzk4MjY1RS01MzIzODMxNTggMzQ2Mi41MTQ1MEUrODA5ODY5MTUgLT4gNi4wMDM5NDAwN0UtNDUxMzk2MjMyIEluZXhhY3QgUm91bmRlZAoreHBvdzM5NyBwb3dlciAxNzMzOTgyNjVFLTUzMjM4MzE1OCAzIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTM5NyByZW1haW5kZXIgMTczMzk4MjY1RS01MzIzODMxNTggMzQ2Mi41MTQ1MEUrODA5ODY5MTUgLT4gMS43MzM5ODI2NUUtNTMyMzgzMTUwCit4c3ViMzk3IHN1YnRyYWN0IDE3MzM5ODI2NUUtNTMyMzgzMTU4IDM0NjIuNTE0NTBFKzgwOTg2OTE1IC0+IC0zLjQ2MjUxNDUwRSs4MDk4NjkxOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQzOTggYWRkIC0xNTIyMTc2Ljc4IC02NjMxMDYxLjc3IC0+IC04MTUzMjM4LjU1Cit4Y29tMzk4IGNvbXBhcmUgLTE1MjIxNzYuNzggLTY2MzEwNjEuNzcgLT4gMQoreGRpdjM5OCBkaXZpZGUgLTE1MjIxNzYuNzggLTY2MzEwNjEuNzcgLT4gMC4yMjk1NTI0OTYgSW5leGFjdCBSb3VuZGVkCit4ZHZpMzk4IGRpdmlkZWludCAtMTUyMjE3Ni43OCAtNjYzMTA2MS43NyAtPiAwCit4bXVsMzk4IG11bHRpcGx5IC0xNTIyMTc2Ljc4IC02NjMxMDYxLjc3IC0+IDEuMDA5MzY0ODNFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzM5OCBwb3dlciAtMTUyMjE3Ni43OCAtNjYzMTA2MiAtPiA0LjU0MjY4ODU0RS00MDk5NjMxMCBJbmV4YWN0IFJvdW5kZWQKK3hyZW0zOTggcmVtYWluZGVyIC0xNTIyMTc2Ljc4IC02NjMxMDYxLjc3IC0+IC0xNTIyMTc2Ljc4Cit4c3ViMzk4IHN1YnRyYWN0IC0xNTIyMTc2Ljc4IC02NjMxMDYxLjc3IC0+IDUxMDg4ODQuOTkKK3hhZGQzOTkgYWRkIDUzOC4xMDQ1MyA1MjI5MzQzMTAgLT4gNTIyOTM0ODQ4IEluZXhhY3QgUm91bmRlZAoreGNvbTM5OSBjb21wYXJlIDUzOC4xMDQ1MyA1MjI5MzQzMTAgLT4gLTEKK3hkaXYzOTkgZGl2aWRlIDUzOC4xMDQ1MyA1MjI5MzQzMTAgLT4gMC4wMDAwMDEwMjkwMDk4MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmkzOTkgZGl2aWRlaW50IDUzOC4xMDQ1MyA1MjI5MzQzMTAgLT4gMAoreG11bDM5OSBtdWx0aXBseSA1MzguMTA0NTMgNTIyOTM0MzEwIC0+IDIuODEzOTMzMjFFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzM5OSBwb3dlciA1MzguMTA0NTMgNTIyOTM0MzEwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTM5OSByZW1haW5kZXIgNTM4LjEwNDUzIDUyMjkzNDMxMCAtPiA1MzguMTA0NTMKK3hzdWIzOTkgc3VidHJhY3QgNTM4LjEwNDUzIDUyMjkzNDMxMCAtPiAtNTIyOTMzNzcyIEluZXhhY3QgUm91bmRlZAoreGFkZDQwMCBhZGQgODgwMjQzLjQ0NEUtNzUwOTQwOTc3IC0zNTQuNjAxNTc4RS0yMDQ5NDM3NDAgLT4gLTMuNTQ2MDE1NzhFLTIwNDk0MzczOCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MDAgY29tcGFyZSA4ODAyNDMuNDQ0RS03NTA5NDA5NzcgLTM1NC42MDE1NzhFLTIwNDk0Mzc0MCAtPiAxCit4ZGl2NDAwIGRpdmlkZSA4ODAyNDMuNDQ0RS03NTA5NDA5NzcgLTM1NC42MDE1NzhFLTIwNDk0Mzc0MCAtPiAtMi40ODIzNDQ5N0UtNTQ1OTk3MjM0IEluZXhhY3QgUm91bmRlZAoreGR2aTQwMCBkaXZpZGVpbnQgODgwMjQzLjQ0NEUtNzUwOTQwOTc3IC0zNTQuNjAxNTc4RS0yMDQ5NDM3NDAgLT4gLTAKK3htdWw0MDAgbXVsdGlwbHkgODgwMjQzLjQ0NEUtNzUwOTQwOTc3IC0zNTQuNjAxNTc4RS0yMDQ5NDM3NDAgLT4gLTMuMTIxMzU3MTRFLTk1NTg4NDcwOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MDAgcG93ZXIgODgwMjQzLjQ0NEUtNzUwOTQwOTc3IC00IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTQwMCByZW1haW5kZXIgODgwMjQzLjQ0NEUtNzUwOTQwOTc3IC0zNTQuNjAxNTc4RS0yMDQ5NDM3NDAgLT4gOC44MDI0MzQ0NEUtNzUwOTQwOTcyCit4c3ViNDAwIHN1YnRyYWN0IDg4MDI0My40NDRFLTc1MDk0MDk3NyAtMzU0LjYwMTU3OEUtMjA0OTQzNzQwIC0+IDMuNTQ2MDE1NzhFLTIwNDk0MzczOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MDEgYWRkIDk2ODM3MC43ODAgNjY3NzI2OC43MyAtPiA3NjQ1NjM5LjUxIFJvdW5kZWQKK3hjb200MDEgY29tcGFyZSA5NjgzNzAuNzgwIDY2NzcyNjguNzMgLT4gLTEKK3hkaXY0MDEgZGl2aWRlIDk2ODM3MC43ODAgNjY3NzI2OC43MyAtPiAwLjE0NTAyNDk4MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MDEgZGl2aWRlaW50IDk2ODM3MC43ODAgNjY3NzI2OC43MyAtPiAwCit4bXVsNDAxIG11bHRpcGx5IDk2ODM3MC43ODAgNjY3NzI2OC43MyAtPiA2LjQ2NjA3MTkzRSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MDEgcG93ZXIgOTY4MzcwLjc4MCA2Njc3MjY5IC0+IDMuMjk5OTA5MzFFKzM5OTcwNDEwIEluZXhhY3QgUm91bmRlZAoreHJlbTQwMSByZW1haW5kZXIgOTY4MzcwLjc4MCA2Njc3MjY4LjczIC0+IDk2ODM3MC43ODAKK3hzdWI0MDEgc3VidHJhY3QgOTY4MzcwLjc4MCA2Njc3MjY4LjczIC0+IC01NzA4ODk3Ljk1IFJvdW5kZWQKK3hhZGQ0MDIgYWRkIC05Ny43NDc0OTQ1IDMxMjQ4MjQxLjUgLT4gMzEyNDgxNDMuOCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MDIgY29tcGFyZSAtOTcuNzQ3NDk0NSAzMTI0ODI0MS41IC0+IC0xCit4ZGl2NDAyIGRpdmlkZSAtOTcuNzQ3NDk0NSAzMTI0ODI0MS41IC0+IC0wLjAwMDAwMzEyODA5NTg1IEluZXhhY3QgUm91bmRlZAoreGR2aTQwMiBkaXZpZGVpbnQgLTk3Ljc0NzQ5NDUgMzEyNDgyNDEuNSAtPiAtMAoreG11bDQwMiBtdWx0aXBseSAtOTcuNzQ3NDk0NSAzMTI0ODI0MS41IC0+IC0zLjA1NDQzNzMxRSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzQwMiBwb3dlciAtOTcuNzQ3NDk0NSAzMTI0ODI0MiAtPiAyLjkwNzE0MjU3RSs2MjE4NzMwMiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MDIgcmVtYWluZGVyIC05Ny43NDc0OTQ1IDMxMjQ4MjQxLjUgLT4gLTk3Ljc0NzQ5NDUKK3hzdWI0MDIgc3VidHJhY3QgLTk3Ljc0NzQ5NDUgMzEyNDgyNDEuNSAtPiAtMzEyNDgzMzkuMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MDMgYWRkIC0xODc1ODI3ODYuRSszNjk5MTY5NTIgOTU3ODQwNDM1RSs3NDQzNjU1NjcgLT4gOS41Nzg0MDQzNUUrNzQ0MzY1NTc1IEluZXhhY3QgUm91bmRlZAoreGNvbTQwMyBjb21wYXJlIC0xODc1ODI3ODYuRSszNjk5MTY5NTIgOTU3ODQwNDM1RSs3NDQzNjU1NjcgLT4gLTEKK3hkaXY0MDMgZGl2aWRlIC0xODc1ODI3ODYuRSszNjk5MTY5NTIgOTU3ODQwNDM1RSs3NDQzNjU1NjcgLT4gLTEuOTU4MzkyODVFLTM3NDQ0ODYxNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MDMgZGl2aWRlaW50IC0xODc1ODI3ODYuRSszNjk5MTY5NTIgOTU3ODQwNDM1RSs3NDQzNjU1NjcgLT4gLTAKK3htdWw0MDMgbXVsdGlwbHkgLTE4NzU4Mjc4Ni5FKzM2OTkxNjk1MiA5NTc4NDA0MzVFKzc0NDM2NTU2NyAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4cG93NDAzIHBvd2VyIC0xODc1ODI3ODYuRSszNjk5MTY5NTIgMTAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDAzIHJlbWFpbmRlciAtMTg3NTgyNzg2LkUrMzY5OTE2OTUyIDk1Nzg0MDQzNUUrNzQ0MzY1NTY3IC0+IC0xLjg3NTgyNzg2RSszNjk5MTY5NjAKK3hzdWI0MDMgc3VidHJhY3QgLTE4NzU4Mjc4Ni5FKzM2OTkxNjk1MiA5NTc4NDA0MzVFKzc0NDM2NTU2NyAtPiAtOS41Nzg0MDQzNUUrNzQ0MzY1NTc1IEluZXhhY3QgUm91bmRlZAoreGFkZDQwNCBhZGQgLTMyODAyNjE0NC4gLTEyNTQ5OTczNS4gLT4gLTQ1MzUyNTg3OQoreGNvbTQwNCBjb21wYXJlIC0zMjgwMjYxNDQuIC0xMjU0OTk3MzUuIC0+IC0xCit4ZGl2NDA0IGRpdmlkZSAtMzI4MDI2MTQ0LiAtMTI1NDk5NzM1LiAtPiAyLjYxMzc1OTY1IEluZXhhY3QgUm91bmRlZAoreGR2aTQwNCBkaXZpZGVpbnQgLTMyODAyNjE0NC4gLTEyNTQ5OTczNS4gLT4gMgoreG11bDQwNCBtdWx0aXBseSAtMzI4MDI2MTQ0LiAtMTI1NDk5NzM1LiAtPiA0LjExNjcxOTQxRSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MDQgcG93ZXIgLTMyODAyNjE0NC4gLTEyNTQ5OTczNSAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDA0IHJlbWFpbmRlciAtMzI4MDI2MTQ0LiAtMTI1NDk5NzM1LiAtPiAtNzcwMjY2NzQKK3hzdWI0MDQgc3VidHJhY3QgLTMyODAyNjE0NC4gLTEyNTQ5OTczNS4gLT4gLTIwMjUyNjQwOQoreGFkZDQwNSBhZGQgLTk5NDI0MTUwLjJFLTUyMzY2MjEwMiAzNzEyLjM1MDMwIC0+IDM3MTIuMzUwMzAgSW5leGFjdCBSb3VuZGVkCit4Y29tNDA1IGNvbXBhcmUgLTk5NDI0MTUwLjJFLTUyMzY2MjEwMiAzNzEyLjM1MDMwIC0+IC0xCit4ZGl2NDA1IGRpdmlkZSAtOTk0MjQxNTAuMkUtNTIzNjYyMTAyIDM3MTIuMzUwMzAgLT4gLTIuNjc4MTk5NThFLTUyMzY2MjA5OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MDUgZGl2aWRlaW50IC05OTQyNDE1MC4yRS01MjM2NjIxMDIgMzcxMi4zNTAzMCAtPiAtMAoreG11bDQwNSBtdWx0aXBseSAtOTk0MjQxNTAuMkUtNTIzNjYyMTAyIDM3MTIuMzUwMzAgLT4gLTMuNjkwOTcyNzRFLTUyMzY2MjA5MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MDUgcG93ZXIgLTk5NDI0MTUwLjJFLTUyMzY2MjEwMiAzNzEyIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQwNSByZW1haW5kZXIgLTk5NDI0MTUwLjJFLTUyMzY2MjEwMiAzNzEyLjM1MDMwIC0+IC05Ljk0MjQxNTAyRS01MjM2NjIwOTUKK3hzdWI0MDUgc3VidHJhY3QgLTk5NDI0MTUwLjJFLTUyMzY2MjEwMiAzNzEyLjM1MDMwIC0+IC0zNzEyLjM1MDMwIEluZXhhY3QgUm91bmRlZAoreGFkZDQwNiBhZGQgMTQ4MzguMDcxOCA5NDg5ODkzLjI4RSs4MzA2MzEyNjYgLT4gOS40ODk4OTMyOEUrODMwNjMxMjcyIEluZXhhY3QgUm91bmRlZAoreGNvbTQwNiBjb21wYXJlIDE0ODM4LjA3MTggOTQ4OTg5My4yOEUrODMwNjMxMjY2IC0+IC0xCit4ZGl2NDA2IGRpdmlkZSAxNDgzOC4wNzE4IDk0ODk4OTMuMjhFKzgzMDYzMTI2NiAtPiAxLjU2MzU2NTcyRS04MzA2MzEyNjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDA2IGRpdmlkZWludCAxNDgzOC4wNzE4IDk0ODk4OTMuMjhFKzgzMDYzMTI2NiAtPiAwCit4bXVsNDA2IG11bHRpcGx5IDE0ODM4LjA3MTggOTQ4OTg5My4yOEUrODMwNjMxMjY2IC0+IDEuNDA4MTE3MThFKzgzMDYzMTI3NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MDYgcG93ZXIgMTQ4MzguMDcxOCA5IC0+IDMuNDg2NTYwNTdFKzM3IEluZXhhY3QgUm91bmRlZAoreHJlbTQwNiByZW1haW5kZXIgMTQ4MzguMDcxOCA5NDg5ODkzLjI4RSs4MzA2MzEyNjYgLT4gMTQ4MzguMDcxOAoreHN1YjQwNiBzdWJ0cmFjdCAxNDgzOC4wNzE4IDk0ODk4OTMuMjhFKzgzMDYzMTI2NiAtPiAtOS40ODk4OTMyOEUrODMwNjMxMjcyIEluZXhhY3QgUm91bmRlZAoreGFkZDQwNyBhZGQgNzEyMDc0NzIuOCAtMzE4MzUuMDgwOSAtPiA3MTE3NTYzNy43IEluZXhhY3QgUm91bmRlZAoreGNvbTQwNyBjb21wYXJlIDcxMjA3NDcyLjggLTMxODM1LjA4MDkgLT4gMQoreGRpdjQwNyBkaXZpZGUgNzEyMDc0NzIuOCAtMzE4MzUuMDgwOSAtPiAtMjIzNi43NjExNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MDcgZGl2aWRlaW50IDcxMjA3NDcyLjggLTMxODM1LjA4MDkgLT4gLTIyMzYKK3htdWw0MDcgbXVsdGlwbHkgNzEyMDc0NzIuOCAtMzE4MzUuMDgwOSAtPiAtMi4yNjY4OTU2NkUrMTIgSW5leGFjdCBSb3VuZGVkCit4cG93NDA3IHBvd2VyIDcxMjA3NDcyLjggLTMxODM1IC0+IDcuMDUzMzM5NTNFLTI0OTk4NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MDcgcmVtYWluZGVyIDcxMjA3NDcyLjggLTMxODM1LjA4MDkgLT4gMjQyMzEuOTA3NgoreHN1YjQwNyBzdWJ0cmFjdCA3MTIwNzQ3Mi44IC0zMTgzNS4wODA5IC0+IDcxMjM5MzA3LjkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDA4IGFkZCAtMjA0NDAuNDM5NCAtNDQuNDA2NDMyOEUrNTExMDg1ODA2IC0+IC00LjQ0MDY0MzI4RSs1MTEwODU4MDcgSW5leGFjdCBSb3VuZGVkCit4Y29tNDA4IGNvbXBhcmUgLTIwNDQwLjQzOTQgLTQ0LjQwNjQzMjhFKzUxMTA4NTgwNiAtPiAxCit4ZGl2NDA4IGRpdmlkZSAtMjA0NDAuNDM5NCAtNDQuNDA2NDMyOEUrNTExMDg1ODA2IC0+IDQuNjAzMDM1NjdFLTUxMTA4NTgwNCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MDggZGl2aWRlaW50IC0yMDQ0MC40Mzk0IC00NC40MDY0MzI4RSs1MTEwODU4MDYgLT4gMAoreG11bDQwOCBtdWx0aXBseSAtMjA0NDAuNDM5NCAtNDQuNDA2NDMyOEUrNTExMDg1ODA2IC0+IDkuMDc2ODY5OTlFKzUxMTA4NTgxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MDggcG93ZXIgLTIwNDQwLjQzOTQgLTQgLT4gNS43Mjg0NzU5MEUtMTggSW5leGFjdCBSb3VuZGVkCit4cmVtNDA4IHJlbWFpbmRlciAtMjA0NDAuNDM5NCAtNDQuNDA2NDMyOEUrNTExMDg1ODA2IC0+IC0yMDQ0MC40Mzk0Cit4c3ViNDA4IHN1YnRyYWN0IC0yMDQ0MC40Mzk0IC00NC40MDY0MzI4RSs1MTEwODU4MDYgLT4gNC40NDA2NDMyOEUrNTExMDg1ODA3IEluZXhhY3QgUm91bmRlZAoreGFkZDQwOSBhZGQgLTU0LjM2ODQxNzFFLTgwNzIxMDE5MiAxLjA0NTkyOTczRS05ODQwNDE4MDcgLT4gLTUuNDM2ODQxNzFFLTgwNzIxMDE5MSBJbmV4YWN0IFJvdW5kZWQKK3hjb200MDkgY29tcGFyZSAtNTQuMzY4NDE3MUUtODA3MjEwMTkyIDEuMDQ1OTI5NzNFLTk4NDA0MTgwNyAtPiAtMQoreGRpdjQwOSBkaXZpZGUgLTU0LjM2ODQxNzFFLTgwNzIxMDE5MiAxLjA0NTkyOTczRS05ODQwNDE4MDcgLT4gLTUuMTk4MDk0NjNFKzE3NjgzMTYxNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MDkgZGl2aWRlaW50IC01NC4zNjg0MTcxRS04MDcyMTAxOTIgMS4wNDU5Mjk3M0UtOTg0MDQxODA3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDA5IG11bHRpcGx5IC01NC4zNjg0MTcxRS04MDcyMTAxOTIgMS4wNDU5Mjk3M0UtOTg0MDQxODA3IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hwb3c0MDkgcG93ZXIgLTU0LjM2ODQxNzFFLTgwNzIxMDE5MiAxIC0+IC01LjQzNjg0MTcxRS04MDcyMTAxOTEKK3hyZW00MDkgcmVtYWluZGVyIC01NC4zNjg0MTcxRS04MDcyMTAxOTIgMS4wNDU5Mjk3M0UtOTg0MDQxODA3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDA5IHN1YnRyYWN0IC01NC4zNjg0MTcxRS04MDcyMTAxOTIgMS4wNDU5Mjk3M0UtOTg0MDQxODA3IC0+IC01LjQzNjg0MTcxRS04MDcyMTAxOTEgSW5leGFjdCBSb3VuZGVkCit4YWRkNDEwIGFkZCA1NDMxMDA2MC41RSs5NDgxNTk3MzkgMjc0MzIwNzAxLkUrMjA1ODgwNDg0IC0+IDUuNDMxMDA2MDVFKzk0ODE1OTc0NiBJbmV4YWN0IFJvdW5kZWQKK3hjb200MTAgY29tcGFyZSA1NDMxMDA2MC41RSs5NDgxNTk3MzkgMjc0MzIwNzAxLkUrMjA1ODgwNDg0IC0+IDEKK3hkaXY0MTAgZGl2aWRlIDU0MzEwMDYwLjVFKzk0ODE1OTczOSAyNzQzMjA3MDEuRSsyMDU4ODA0ODQgLT4gMS45Nzk4MDE3NUUrNzQyMjc5MjU0IEluZXhhY3QgUm91bmRlZAoreGR2aTQxMCBkaXZpZGVpbnQgNTQzMTAwNjAuNUUrOTQ4MTU5NzM5IDI3NDMyMDcwMS5FKzIwNTg4MDQ4NCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQxMCBtdWx0aXBseSA1NDMxMDA2MC41RSs5NDgxNTk3MzkgMjc0MzIwNzAxLkUrMjA1ODgwNDg0IC0+IEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAoreHBvdzQxMCBwb3dlciA1NDMxMDA2MC41RSs5NDgxNTk3MzkgMyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MTAgcmVtYWluZGVyIDU0MzEwMDYwLjVFKzk0ODE1OTczOSAyNzQzMjA3MDEuRSsyMDU4ODA0ODQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0MTAgc3VidHJhY3QgNTQzMTAwNjAuNUUrOTQ4MTU5NzM5IDI3NDMyMDcwMS5FKzIwNTg4MDQ4NCAtPiA1LjQzMTAwNjA1RSs5NDgxNTk3NDYgSW5leGFjdCBSb3VuZGVkCit4YWRkNDExIGFkZCAtNjU3LjE4NjcwMiA0MjY4NDQuMzkgLT4gNDI2MTg3LjIwMyBJbmV4YWN0IFJvdW5kZWQKK3hjb200MTEgY29tcGFyZSAtNjU3LjE4NjcwMiA0MjY4NDQuMzkgLT4gLTEKK3hkaXY0MTEgZGl2aWRlIC02NTcuMTg2NzAyIDQyNjg0NC4zOSAtPiAtMC4wMDE1Mzk2NDAwMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MTEgZGl2aWRlaW50IC02NTcuMTg2NzAyIDQyNjg0NC4zOSAtPiAtMAoreG11bDQxMSBtdWx0aXBseSAtNjU3LjE4NjcwMiA0MjY4NDQuMzkgLT4gLTI4MDUxNjQ1NyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTEgcG93ZXIgLTY1Ny4xODY3MDIgNDI2ODQ0IC0+IDMuNTAwMDA1NzVFKzEyMDI3MTMgSW5leGFjdCBSb3VuZGVkCit4cmVtNDExIHJlbWFpbmRlciAtNjU3LjE4NjcwMiA0MjY4NDQuMzkgLT4gLTY1Ny4xODY3MDIKK3hzdWI0MTEgc3VidHJhY3QgLTY1Ny4xODY3MDIgNDI2ODQ0LjM5IC0+IC00Mjc1MDEuNTc3IEluZXhhY3QgUm91bmRlZAoreGFkZDQxMiBhZGQgLTQxNTkzMDc3LjAgLTY4ODYwNy41NjQgLT4gLTQyMjgxNjg0LjYgSW5leGFjdCBSb3VuZGVkCit4Y29tNDEyIGNvbXBhcmUgLTQxNTkzMDc3LjAgLTY4ODYwNy41NjQgLT4gLTEKK3hkaXY0MTIgZGl2aWRlIC00MTU5MzA3Ny4wIC02ODg2MDcuNTY0IC0+IDYwLjQwMTcxMzggSW5leGFjdCBSb3VuZGVkCit4ZHZpNDEyIGRpdmlkZWludCAtNDE1OTMwNzcuMCAtNjg4NjA3LjU2NCAtPiA2MAoreG11bDQxMiBtdWx0aXBseSAtNDE1OTMwNzcuMCAtNjg4NjA3LjU2NCAtPiAyLjg2NDEzMDc0RSsxMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTIgcG93ZXIgLTQxNTkzMDc3LjAgLTY4ODYwOCAtPiAxLjQyMTUwNzUwRS01MjQ2NTE5IEluZXhhY3QgUm91bmRlZAoreHJlbTQxMiByZW1haW5kZXIgLTQxNTkzMDc3LjAgLTY4ODYwNy41NjQgLT4gLTI3NjYyMy4xNjAKK3hzdWI0MTIgc3VidHJhY3QgLTQxNTkzMDc3LjAgLTY4ODYwNy41NjQgLT4gLTQwOTA0NDY5LjQgSW5leGFjdCBSb3VuZGVkCit4YWRkNDEzIGFkZCAtNTc4Ni4zODEzMiAxOTA1NTY2NTIuRSsxNzcwNDU4NzcgLT4gMS45MDU1NjY1MkUrMTc3MDQ1ODg1IEluZXhhY3QgUm91bmRlZAoreGNvbTQxMyBjb21wYXJlIC01Nzg2LjM4MTMyIDE5MDU1NjY1Mi5FKzE3NzA0NTg3NyAtPiAtMQoreGRpdjQxMyBkaXZpZGUgLTU3ODYuMzgxMzIgMTkwNTU2NjUyLkUrMTc3MDQ1ODc3IC0+IC0zLjAzNjU2NzQ4RS0xNzcwNDU4ODIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDEzIGRpdmlkZWludCAtNTc4Ni4zODEzMiAxOTA1NTY2NTIuRSsxNzcwNDU4NzcgLT4gLTAKK3htdWw0MTMgbXVsdGlwbHkgLTU3ODYuMzgxMzIgMTkwNTU2NjUyLkUrMTc3MDQ1ODc3IC0+IC0xLjEwMjYzMzQ1RSsxNzcwNDU4ODkgSW5leGFjdCBSb3VuZGVkCit4cG93NDEzIHBvd2VyIC01Nzg2LjM4MTMyIDIgLT4gMzM0ODIyMDguOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MTMgcmVtYWluZGVyIC01Nzg2LjM4MTMyIDE5MDU1NjY1Mi5FKzE3NzA0NTg3NyAtPiAtNTc4Ni4zODEzMgoreHN1YjQxMyBzdWJ0cmFjdCAtNTc4Ni4zODEzMiAxOTA1NTY2NTIuRSsxNzcwNDU4NzcgLT4gLTEuOTA1NTY2NTJFKzE3NzA0NTg4NSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MTQgYWRkIDczNzYyMi45NzQgLTI0MTU2MDY5M0UrMjQ5NTA2NTY1IC0+IC0yLjQxNTYwNjkzRSsyNDk1MDY1NzMgSW5leGFjdCBSb3VuZGVkCit4Y29tNDE0IGNvbXBhcmUgNzM3NjIyLjk3NCAtMjQxNTYwNjkzRSsyNDk1MDY1NjUgLT4gMQoreGRpdjQxNCBkaXZpZGUgNzM3NjIyLjk3NCAtMjQxNTYwNjkzRSsyNDk1MDY1NjUgLT4gLTMuMDUzNTcyMDJFLTI0OTUwNjU2OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MTQgZGl2aWRlaW50IDczNzYyMi45NzQgLTI0MTU2MDY5M0UrMjQ5NTA2NTY1IC0+IC0wCit4bXVsNDE0IG11bHRpcGx5IDczNzYyMi45NzQgLTI0MTU2MDY5M0UrMjQ5NTA2NTY1IC0+IC0xLjc4MTgwNzE3RSsyNDk1MDY1NzkgSW5leGFjdCBSb3VuZGVkCit4cG93NDE0IHBvd2VyIDczNzYyMi45NzQgLTIgLT4gMS44Mzc5MzkxNkUtMTIgSW5leGFjdCBSb3VuZGVkCit4cmVtNDE0IHJlbWFpbmRlciA3Mzc2MjIuOTc0IC0yNDE1NjA2OTNFKzI0OTUwNjU2NSAtPiA3Mzc2MjIuOTc0Cit4c3ViNDE0IHN1YnRyYWN0IDczNzYyMi45NzQgLTI0MTU2MDY5M0UrMjQ5NTA2NTY1IC0+IDIuNDE1NjA2OTNFKzI0OTUwNjU3MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MTUgYWRkIDU2MTUzNzMuNTIgLTcuMjc1ODM4MDhFLTk0OTc4MTA0OCAtPiA1NjE1MzczLjUyIEluZXhhY3QgUm91bmRlZAoreGNvbTQxNSBjb21wYXJlIDU2MTUzNzMuNTIgLTcuMjc1ODM4MDhFLTk0OTc4MTA0OCAtPiAxCit4ZGl2NDE1IGRpdmlkZSA1NjE1MzczLjUyIC03LjI3NTgzODA4RS05NDk3ODEwNDggLT4gLTcuNzE3ODM3MzlFKzk0OTc4MTA1MyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MTUgZGl2aWRlaW50IDU2MTUzNzMuNTIgLTcuMjc1ODM4MDhFLTk0OTc4MTA0OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQxNSBtdWx0aXBseSA1NjE1MzczLjUyIC03LjI3NTgzODA4RS05NDk3ODEwNDggLT4gLTQuMDg1NjU0ODVFLTk0OTc4MTA0MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTUgcG93ZXIgNTYxNTM3My41MiAtNyAtPiA1LjY4MDAxNDYwRS00OCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MTUgcmVtYWluZGVyIDU2MTUzNzMuNTIgLTcuMjc1ODM4MDhFLTk0OTc4MTA0OCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQxNSBzdWJ0cmFjdCA1NjE1MzczLjUyIC03LjI3NTgzODA4RS05NDk3ODEwNDggLT4gNTYxNTM3My41MiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MTYgYWRkIDY0NDEzNi4xNzkgLTgzNTcwOC4xMDMgLT4gLTE5MTU3MS45MjQKK3hjb200MTYgY29tcGFyZSA2NDQxMzYuMTc5IC04MzU3MDguMTAzIC0+IDEKK3hkaXY0MTYgZGl2aWRlIDY0NDEzNi4xNzkgLTgzNTcwOC4xMDMgLT4gLTAuNzcwNzY2OTQyIEluZXhhY3QgUm91bmRlZAoreGR2aTQxNiBkaXZpZGVpbnQgNjQ0MTM2LjE3OSAtODM1NzA4LjEwMyAtPiAtMAoreG11bDQxNiBtdWx0aXBseSA2NDQxMzYuMTc5IC04MzU3MDguMTAzIC0+IC01LjM4MzA5ODI0RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MTYgcG93ZXIgNjQ0MTM2LjE3OSAtODM1NzA4IC0+IDcuNDE5MzY4NThFLTQ4NTQ2MTAgSW5leGFjdCBSb3VuZGVkCit4cmVtNDE2IHJlbWFpbmRlciA2NDQxMzYuMTc5IC04MzU3MDguMTAzIC0+IDY0NDEzNi4xNzkKK3hzdWI0MTYgc3VidHJhY3QgNjQ0MTM2LjE3OSAtODM1NzA4LjEwMyAtPiAxNDc5ODQ0LjI4IEluZXhhY3QgUm91bmRlZAoreGFkZDQxNyBhZGQgLTMwNy40MTk1MjFFKzQ2Njg2MTg0MyAtNzM4Njg5OTc2LkUtMTk5MDMyNzExIC0+IC0zLjA3NDE5NTIxRSs0NjY4NjE4NDUgSW5leGFjdCBSb3VuZGVkCit4Y29tNDE3IGNvbXBhcmUgLTMwNy40MTk1MjFFKzQ2Njg2MTg0MyAtNzM4Njg5OTc2LkUtMTk5MDMyNzExIC0+IC0xCit4ZGl2NDE3IGRpdmlkZSAtMzA3LjQxOTUyMUUrNDY2ODYxODQzIC03Mzg2ODk5NzYuRS0xOTkwMzI3MTEgLT4gNC4xNjE2ODUyOUUrNjY1ODk0NTQ3IEluZXhhY3QgUm91bmRlZAoreGR2aTQxNyBkaXZpZGVpbnQgLTMwNy40MTk1MjFFKzQ2Njg2MTg0MyAtNzM4Njg5OTc2LkUtMTk5MDMyNzExIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDE3IG11bHRpcGx5IC0zMDcuNDE5NTIxRSs0NjY4NjE4NDMgLTczODY4OTk3Ni5FLTE5OTAzMjcxMSAtPiAyLjI3MDg3NzE5RSsyNjc4MjkxNDMgSW5leGFjdCBSb3VuZGVkCit4cG93NDE3IHBvd2VyIC0zMDcuNDE5NTIxRSs0NjY4NjE4NDMgLTcgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQxNyByZW1haW5kZXIgLTMwNy40MTk1MjFFKzQ2Njg2MTg0MyAtNzM4Njg5OTc2LkUtMTk5MDMyNzExIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDE3IHN1YnRyYWN0IC0zMDcuNDE5NTIxRSs0NjY4NjE4NDMgLTczODY4OTk3Ni5FLTE5OTAzMjcxMSAtPiAtMy4wNzQxOTUyMUUrNDY2ODYxODQ1IEluZXhhY3QgUm91bmRlZAoreGFkZDQxOCBhZGQgLTYxOTY0Mi4xMzAgLTIyNjc0MDUzNy5FLTkwMjU5MDE1MyAtPiAtNjE5NjQyLjEzMCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MTggY29tcGFyZSAtNjE5NjQyLjEzMCAtMjI2NzQwNTM3LkUtOTAyNTkwMTUzIC0+IC0xCit4ZGl2NDE4IGRpdmlkZSAtNjE5NjQyLjEzMCAtMjI2NzQwNTM3LkUtOTAyNTkwMTUzIC0+IDIuNzMyODI0NjZFKzkwMjU5MDE1MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MTggZGl2aWRlaW50IC02MTk2NDIuMTMwIC0yMjY3NDA1MzcuRS05MDI1OTAxNTMgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0MTggbXVsdGlwbHkgLTYxOTY0Mi4xMzAgLTIyNjc0MDUzNy5FLTkwMjU5MDE1MyAtPiAxLjQwNDk3OTg5RS05MDI1OTAxMzkgSW5leGFjdCBSb3VuZGVkCit4cG93NDE4IHBvd2VyIC02MTk2NDIuMTMwIC0yIC0+IDIuNjA0NDYyNTlFLTEyIEluZXhhY3QgUm91bmRlZAoreHJlbTQxOCByZW1haW5kZXIgLTYxOTY0Mi4xMzAgLTIyNjc0MDUzNy5FLTkwMjU5MDE1MyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQxOCBzdWJ0cmFjdCAtNjE5NjQyLjEzMCAtMjI2NzQwNTM3LkUtOTAyNTkwMTUzIC0+IC02MTk2NDIuMTMwIEluZXhhY3QgUm91bmRlZAoreGFkZDQxOSBhZGQgLTMxMDY4Ljc1NDkgLTMuNDE0OTUwNDJFKzg2MDAxMzc5IC0+IC0zLjQxNDk1MDQyRSs4NjAwMTM3OSBJbmV4YWN0IFJvdW5kZWQKK3hjb200MTkgY29tcGFyZSAtMzEwNjguNzU0OSAtMy40MTQ5NTA0MkUrODYwMDEzNzkgLT4gMQoreGRpdjQxOSBkaXZpZGUgLTMxMDY4Ljc1NDkgLTMuNDE0OTUwNDJFKzg2MDAxMzc5IC0+IDkuMDk3ODY0MTJFLTg2MDAxMzc2IEluZXhhY3QgUm91bmRlZAoreGR2aTQxOSBkaXZpZGVpbnQgLTMxMDY4Ljc1NDkgLTMuNDE0OTUwNDJFKzg2MDAxMzc5IC0+IDAKK3htdWw0MTkgbXVsdGlwbHkgLTMxMDY4Ljc1NDkgLTMuNDE0OTUwNDJFKzg2MDAxMzc5IC0+IDEuMDYwOTgyNThFKzg2MDAxMzg0IEluZXhhY3QgUm91bmRlZAoreHBvdzQxOSBwb3dlciAtMzEwNjguNzU0OSAtMyAtPiAtMy4zMzQ0ODI1OEUtMTQgSW5leGFjdCBSb3VuZGVkCit4cmVtNDE5IHJlbWFpbmRlciAtMzEwNjguNzU0OSAtMy40MTQ5NTA0MkUrODYwMDEzNzkgLT4gLTMxMDY4Ljc1NDkKK3hzdWI0MTkgc3VidHJhY3QgLTMxMDY4Ljc1NDkgLTMuNDE0OTUwNDJFKzg2MDAxMzc5IC0+IDMuNDE0OTUwNDJFKzg2MDAxMzc5IEluZXhhY3QgUm91bmRlZAoreGFkZDQyMCBhZGQgLTY4OTUxMTczLiAtMjExODA0OTc3LkUtOTczMTgxMjYgLT4gLTY4OTUxMTczLjAgSW5leGFjdCBSb3VuZGVkCit4Y29tNDIwIGNvbXBhcmUgLTY4OTUxMTczLiAtMjExODA0OTc3LkUtOTczMTgxMjYgLT4gLTEKK3hkaXY0MjAgZGl2aWRlIC02ODk1MTE3My4gLTIxMTgwNDk3Ny5FLTk3MzE4MTI2IC0+IDMuMjU1NDA4NTRFKzk3MzE4MTI1IEluZXhhY3QgUm91bmRlZAoreGR2aTQyMCBkaXZpZGVpbnQgLTY4OTUxMTczLiAtMjExODA0OTc3LkUtOTczMTgxMjYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0MjAgbXVsdGlwbHkgLTY4OTUxMTczLiAtMjExODA0OTc3LkUtOTczMTgxMjYgLT4gMS40NjA0MjAxNkUtOTczMTgxMTAgSW5leGFjdCBSb3VuZGVkCit4cG93NDIwIHBvd2VyIC02ODk1MTE3My4gLTIgLT4gMi4xMDMzNzQ4OEUtMTYgSW5leGFjdCBSb3VuZGVkCit4cmVtNDIwIHJlbWFpbmRlciAtNjg5NTExNzMuIC0yMTE4MDQ5NzcuRS05NzMxODEyNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQyMCBzdWJ0cmFjdCAtNjg5NTExNzMuIC0yMTE4MDQ5NzcuRS05NzMxODEyNiAtPiAtNjg5NTExNzMuMCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MjEgYWRkIC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNDM0LjIwMTk5RS03NDkzOTA5NTIgLT4gLTQuMDk0OTI1NzFFLTMwMTc0OTQ5MCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MjEgY29tcGFyZSAtNC4wOTQ5MjU3MUUtMzAxNzQ5NDkwIDQzNC4yMDE5OUUtNzQ5MzkwOTUyIC0+IC0xCit4ZGl2NDIxIGRpdmlkZSAtNC4wOTQ5MjU3MUUtMzAxNzQ5NDkwIDQzNC4yMDE5OUUtNzQ5MzkwOTUyIC0+IC05LjQzMDkyMzQxRSs0NDc2NDE0NTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDIxIGRpdmlkZWludCAtNC4wOTQ5MjU3MUUtMzAxNzQ5NDkwIDQzNC4yMDE5OUUtNzQ5MzkwOTUyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDIxIG11bHRpcGx5IC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNDM0LjIwMTk5RS03NDkzOTA5NTIgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzQyMSBwb3dlciAtNC4wOTQ5MjU3MUUtMzAxNzQ5NDkwIDQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDIxIHJlbWFpbmRlciAtNC4wOTQ5MjU3MUUtMzAxNzQ5NDkwIDQzNC4yMDE5OUUtNzQ5MzkwOTUyIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDIxIHN1YnRyYWN0IC00LjA5NDkyNTcxRS0zMDE3NDk0OTAgNDM0LjIwMTk5RS03NDkzOTA5NTIgLT4gLTQuMDk0OTI1NzFFLTMwMTc0OTQ5MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MjIgYWRkIDM4OTguMDMxODggLTgyNTcyLjYxNSAtPiAtNzg2NzQuNTgzMSBJbmV4YWN0IFJvdW5kZWQKK3hjb200MjIgY29tcGFyZSAzODk4LjAzMTg4IC04MjU3Mi42MTUgLT4gMQoreGRpdjQyMiBkaXZpZGUgMzg5OC4wMzE4OCAtODI1NzIuNjE1IC0+IC0wLjA0NzIwNzMyMDIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDIyIGRpdmlkZWludCAzODk4LjAzMTg4IC04MjU3Mi42MTUgLT4gLTAKK3htdWw0MjIgbXVsdGlwbHkgMzg5OC4wMzE4OCAtODI1NzIuNjE1IC0+IC0zMjE4NzA2ODYgSW5leGFjdCBSb3VuZGVkCit4cG93NDIyIHBvd2VyIDM4OTguMDMxODggLTgyNTczIC0+IDEuMzMwMTA3MzdFLTI5NjUwNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MjIgcmVtYWluZGVyIDM4OTguMDMxODggLTgyNTcyLjYxNSAtPiAzODk4LjAzMTg4Cit4c3ViNDIyIHN1YnRyYWN0IDM4OTguMDMxODggLTgyNTcyLjYxNSAtPiA4NjQ3MC42NDY5IEluZXhhY3QgUm91bmRlZAoreGFkZDQyMyBhZGQgLTEuNzYxOTM1NiAtMjU0Ni42NDA0MyAtPiAtMjU0OC40MDIzNyBJbmV4YWN0IFJvdW5kZWQKK3hjb200MjMgY29tcGFyZSAtMS43NjE5MzU2IC0yNTQ2LjY0MDQzIC0+IDEKK3hkaXY0MjMgZGl2aWRlIC0xLjc2MTkzNTYgLTI1NDYuNjQwNDMgLT4gMC4wMDA2OTE4NjY2NTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDIzIGRpdmlkZWludCAtMS43NjE5MzU2IC0yNTQ2LjY0MDQzIC0+IDAKK3htdWw0MjMgbXVsdGlwbHkgLTEuNzYxOTM1NiAtMjU0Ni42NDA0MyAtPiA0NDg3LjAxNjQzIEluZXhhY3QgUm91bmRlZAoreHBvdzQyMyBwb3dlciAtMS43NjE5MzU2IC0yNTQ3IC0+IC0yLjkwNjY0NTU3RS02MjcgSW5leGFjdCBSb3VuZGVkCit4cmVtNDIzIHJlbWFpbmRlciAtMS43NjE5MzU2IC0yNTQ2LjY0MDQzIC0+IC0xLjc2MTkzNTYKK3hzdWI0MjMgc3VidHJhY3QgLTEuNzYxOTM1NiAtMjU0Ni42NDA0MyAtPiAyNTQ0Ljg3ODQ5IEluZXhhY3QgUm91bmRlZAoreGFkZDQyNCBhZGQgNTk3MTQuMTk2OCAyOTczNDM4OC42RS01NjQ1MjU1MjUgLT4gNTk3MTQuMTk2OCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MjQgY29tcGFyZSA1OTcxNC4xOTY4IDI5NzM0Mzg4LjZFLTU2NDUyNTUyNSAtPiAxCit4ZGl2NDI0IGRpdmlkZSA1OTcxNC4xOTY4IDI5NzM0Mzg4LjZFLTU2NDUyNTUyNSAtPiAyLjAwODI1MzczRSs1NjQ1MjU1MjIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDI0IGRpdmlkZWludCA1OTcxNC4xOTY4IDI5NzM0Mzg4LjZFLTU2NDUyNTUyNSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQyNCBtdWx0aXBseSA1OTcxNC4xOTY4IDI5NzM0Mzg4LjZFLTU2NDUyNTUyNSAtPiAxLjc3NTU2NTEzRS01NjQ1MjU1MTMgSW5leGFjdCBSb3VuZGVkCit4cG93NDI0IHBvd2VyIDU5NzE0LjE5NjggMyAtPiAyLjEyOTI4MDA1RSsxNCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MjQgcmVtYWluZGVyIDU5NzE0LjE5NjggMjk3MzQzODguNkUtNTY0NTI1NTI1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDI0IHN1YnRyYWN0IDU5NzE0LjE5NjggMjk3MzQzODguNkUtNTY0NTI1NTI1IC0+IDU5NzE0LjE5NjggSW5leGFjdCBSb3VuZGVkCit4YWRkNDI1IGFkZCA2Ljg4ODkxMTM2RS05MzU0NjczOTUgLTc4NTA0OS41NjJFLTc0MTY3MTQ0MiAtPiAtNy44NTA0OTU2MkUtNzQxNjcxNDM3IEluZXhhY3QgUm91bmRlZAoreGNvbTQyNSBjb21wYXJlIDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtNzg1MDQ5LjU2MkUtNzQxNjcxNDQyIC0+IDEKK3hkaXY0MjUgZGl2aWRlIDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtNzg1MDQ5LjU2MkUtNzQxNjcxNDQyIC0+IC04Ljc3NTEyOTIzRS0xOTM3OTU5NTkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDI1IGRpdmlkZWludCA2Ljg4ODkxMTM2RS05MzU0NjczOTUgLTc4NTA0OS41NjJFLTc0MTY3MTQ0MiAtPiAtMAoreG11bDQyNSBtdWx0aXBseSA2Ljg4ODkxMTM2RS05MzU0NjczOTUgLTc4NTA0OS41NjJFLTc0MTY3MTQ0MiAtPiAtMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cG93NDI1IHBvd2VyIDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtOCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MjUgcmVtYWluZGVyIDYuODg4OTExMzZFLTkzNTQ2NzM5NSAtNzg1MDQ5LjU2MkUtNzQxNjcxNDQyIC0+IDYuODg4OTExMzZFLTkzNTQ2NzM5NQoreHN1YjQyNSBzdWJ0cmFjdCA2Ljg4ODkxMTM2RS05MzU0NjczOTUgLTc4NTA0OS41NjJFLTc0MTY3MTQ0MiAtPiA3Ljg1MDQ5NTYyRS03NDE2NzE0MzcgSW5leGFjdCBSb3VuZGVkCit4YWRkNDI2IGFkZCA5NzU1NjYyNTEgLTUxOS44NTg1MzAgLT4gOTc1NTY1NzMxIEluZXhhY3QgUm91bmRlZAoreGNvbTQyNiBjb21wYXJlIDk3NTU2NjI1MSAtNTE5Ljg1ODUzMCAtPiAxCit4ZGl2NDI2IGRpdmlkZSA5NzU1NjYyNTEgLTUxOS44NTg1MzAgLT4gLTE4NzY1OTkuNDkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDI2IGRpdmlkZWludCA5NzU1NjYyNTEgLTUxOS44NTg1MzAgLT4gLTE4NzY1OTkKK3htdWw0MjYgbXVsdGlwbHkgOTc1NTY2MjUxIC01MTkuODU4NTMwIC0+IC01LjA3MTU2NDM3RSsxMSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0MjYgcG93ZXIgOTc1NTY2MjUxIC01MjAgLT4gMy44NTkwNTMwMEUtNDY3NSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MjYgcmVtYWluZGVyIDk3NTU2NjI1MSAtNTE5Ljg1ODUzMCAtPiAyNTMuNDYwNTMwCit4c3ViNDI2IHN1YnRyYWN0IDk3NTU2NjI1MSAtNTE5Ljg1ODUzMCAtPiA5NzU1NjY3NzEgSW5leGFjdCBSb3VuZGVkCit4YWRkNDI3IGFkZCAzMDc0MDE5NTQgLTIzMTQ4MTU4Mi4gLT4gNzU5MjAzNzIKK3hjb200MjcgY29tcGFyZSAzMDc0MDE5NTQgLTIzMTQ4MTU4Mi4gLT4gMQoreGRpdjQyNyBkaXZpZGUgMzA3NDAxOTU0IC0yMzE0ODE1ODIuIC0+IC0xLjMyNzk3NTg2IEluZXhhY3QgUm91bmRlZAoreGR2aTQyNyBkaXZpZGVpbnQgMzA3NDAxOTU0IC0yMzE0ODE1ODIuIC0+IC0xCit4bXVsNDI3IG11bHRpcGx5IDMwNzQwMTk1NCAtMjMxNDgxNTgyLiAtPiAtNy4xMTU3ODkwNkUrMTYgSW5leGFjdCBSb3VuZGVkCit4cG93NDI3IHBvd2VyIDMwNzQwMTk1NCAtMjMxNDgxNTgyIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQyNyByZW1haW5kZXIgMzA3NDAxOTU0IC0yMzE0ODE1ODIuIC0+IDc1OTIwMzcyCit4c3ViNDI3IHN1YnRyYWN0IDMwNzQwMTk1NCAtMjMxNDgxNTgyLiAtPiA1Mzg4ODM1MzYKK3hhZGQ0MjggYWRkIDIyMzc2NDUuNDhFKzk5Mjk0NzM4OCAtNjA2MTgwNTUuM0UtODU3MzE2NzA2IC0+IDIuMjM3NjQ1NDhFKzk5Mjk0NzM5NCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MjggY29tcGFyZSAyMjM3NjQ1LjQ4RSs5OTI5NDczODggLTYwNjE4MDU1LjNFLTg1NzMxNjcwNiAtPiAxCit4ZGl2NDI4IGRpdmlkZSAyMjM3NjQ1LjQ4RSs5OTI5NDczODggLTYwNjE4MDU1LjNFLTg1NzMxNjcwNiAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCit4ZHZpNDI4IGRpdmlkZWludCAyMjM3NjQ1LjQ4RSs5OTI5NDczODggLTYwNjE4MDU1LjNFLTg1NzMxNjcwNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQyOCBtdWx0aXBseSAyMjM3NjQ1LjQ4RSs5OTI5NDczODggLTYwNjE4MDU1LjNFLTg1NzMxNjcwNiAtPiAtMS4zNTY0MTcxN0UrMTM1NjMwNjk2IEluZXhhY3QgUm91bmRlZAoreHBvdzQyOCBwb3dlciAyMjM3NjQ1LjQ4RSs5OTI5NDczODggLTYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDI4IHJlbWFpbmRlciAyMjM3NjQ1LjQ4RSs5OTI5NDczODggLTYwNjE4MDU1LjNFLTg1NzMxNjcwNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQyOCBzdWJ0cmFjdCAyMjM3NjQ1LjQ4RSs5OTI5NDczODggLTYwNjE4MDU1LjNFLTg1NzMxNjcwNiAtPiAyLjIzNzY0NTQ4RSs5OTI5NDczOTQgSW5leGFjdCBSb3VuZGVkCit4YWRkNDI5IGFkZCAtNDAzOTAzLjg1MSAzNS41MDQ5Njg3RS03MjA5NTE1NSAtPiAtNDAzOTAzLjg1MSBJbmV4YWN0IFJvdW5kZWQKK3hjb200MjkgY29tcGFyZSAtNDAzOTAzLjg1MSAzNS41MDQ5Njg3RS03MjA5NTE1NSAtPiAtMQoreGRpdjQyOSBkaXZpZGUgLTQwMzkwMy44NTEgMzUuNTA0OTY4N0UtNzIwOTUxNTUgLT4gLTEuMTM3NTk4MTBFKzcyMDk1MTU5IEluZXhhY3QgUm91bmRlZAoreGR2aTQyOSBkaXZpZGVpbnQgLTQwMzkwMy44NTEgMzUuNTA0OTY4N0UtNzIwOTUxNTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0MjkgbXVsdGlwbHkgLTQwMzkwMy44NTEgMzUuNTA0OTY4N0UtNzIwOTUxNTUgLT4gLTEuNDM0MDU5MzZFLTcyMDk1MTQ4IEluZXhhY3QgUm91bmRlZAoreHBvdzQyOSBwb3dlciAtNDAzOTAzLjg1MSA0IC0+IDIuNjYxNDExMTdFKzIyIEluZXhhY3QgUm91bmRlZAoreHJlbTQyOSByZW1haW5kZXIgLTQwMzkwMy44NTEgMzUuNTA0OTY4N0UtNzIwOTUxNTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0Mjkgc3VidHJhY3QgLTQwMzkwMy44NTEgMzUuNTA0OTY4N0UtNzIwOTUxNTUgLT4gLTQwMzkwMy44NTEgSW5leGFjdCBSb3VuZGVkCit4YWRkNDMwIGFkZCA2LjQ4Njc0OTc5IC02MjE3MzIuNTMyRSs0MjI1NzU4MDAgLT4gLTYuMjE3MzI1MzJFKzQyMjU3NTgwNSBJbmV4YWN0IFJvdW5kZWQKK3hjb200MzAgY29tcGFyZSA2LjQ4Njc0OTc5IC02MjE3MzIuNTMyRSs0MjI1NzU4MDAgLT4gMQoreGRpdjQzMCBkaXZpZGUgNi40ODY3NDk3OSAtNjIxNzMyLjUzMkUrNDIyNTc1ODAwIC0+IC0xLjA0MzMzNDQ3RS00MjI1NzU4MDUgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDMwIGRpdmlkZWludCA2LjQ4Njc0OTc5IC02MjE3MzIuNTMyRSs0MjI1NzU4MDAgLT4gLTAKK3htdWw0MzAgbXVsdGlwbHkgNi40ODY3NDk3OSAtNjIxNzMyLjUzMkUrNDIyNTc1ODAwIC0+IC00LjAzMzAyMzM3RSs0MjI1NzU4MDYgSW5leGFjdCBSb3VuZGVkCit4cG93NDMwIHBvd2VyIDYuNDg2NzQ5NzkgLTYgLT4gMC4wMDAwMTM0MjI2MTQ2IEluZXhhY3QgUm91bmRlZAoreHJlbTQzMCByZW1haW5kZXIgNi40ODY3NDk3OSAtNjIxNzMyLjUzMkUrNDIyNTc1ODAwIC0+IDYuNDg2NzQ5NzkKK3hzdWI0MzAgc3VidHJhY3QgNi40ODY3NDk3OSAtNjIxNzMyLjUzMkUrNDIyNTc1ODAwIC0+IDYuMjE3MzI1MzJFKzQyMjU3NTgwNSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzEgYWRkIC0zMTQwMS45NDE4IDM2LjM5NjA2NzkgLT4gLTMxMzY1LjU0NTcgSW5leGFjdCBSb3VuZGVkCit4Y29tNDMxIGNvbXBhcmUgLTMxNDAxLjk0MTggMzYuMzk2MDY3OSAtPiAtMQoreGRpdjQzMSBkaXZpZGUgLTMxNDAxLjk0MTggMzYuMzk2MDY3OSAtPiAtODYyLjc4MzkxMSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzEgZGl2aWRlaW50IC0zMTQwMS45NDE4IDM2LjM5NjA2NzkgLT4gLTg2MgoreG11bDQzMSBtdWx0aXBseSAtMzE0MDEuOTQxOCAzNi4zOTYwNjc5IC0+IC0xMTQyOTA3LjIxIEluZXhhY3QgUm91bmRlZAoreHBvdzQzMSBwb3dlciAtMzE0MDEuOTQxOCAzNiAtPiA3Ljc3MDIzNTA1RSsxNjEgSW5leGFjdCBSb3VuZGVkCit4cmVtNDMxIHJlbWFpbmRlciAtMzE0MDEuOTQxOCAzNi4zOTYwNjc5IC0+IC0yOC41MzEyNzAyCit4c3ViNDMxIHN1YnRyYWN0IC0zMTQwMS45NDE4IDM2LjM5NjA2NzkgLT4gLTMxNDM4LjMzNzkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDMyIGFkZCAzMTM0NTMyMS4xIDUxLjU0ODIxOTEgLT4gMzEzNDUzNzIuNiBJbmV4YWN0IFJvdW5kZWQKK3hjb200MzIgY29tcGFyZSAzMTM0NTMyMS4xIDUxLjU0ODIxOTEgLT4gMQoreGRpdjQzMiBkaXZpZGUgMzEzNDUzMjEuMSA1MS41NDgyMTkxIC0+IDYwODA3Ny42NzMgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDMyIGRpdmlkZWludCAzMTM0NTMyMS4xIDUxLjU0ODIxOTEgLT4gNjA4MDc3Cit4bXVsNDMyIG11bHRpcGx5IDMxMzQ1MzIxLjEgNTEuNTQ4MjE5MSAtPiAxLjYxNTc5NTQ4RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzQzMiBwb3dlciAzMTM0NTMyMS4xIDUyIC0+IDYuMzIzODUwNTlFKzM4OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00MzIgcmVtYWluZGVyIDMxMzQ1MzIxLjEgNTEuNTQ4MjE5MSAtPiAzNC42NzQzMjkzCit4c3ViNDMyIHN1YnRyYWN0IDMxMzQ1MzIxLjEgNTEuNTQ4MjE5MSAtPiAzMTM0NTI2OS42IEluZXhhY3QgUm91bmRlZAoreGFkZDQzMyBhZGQgLTY0LjE3Mjg0NCAtMjg1MDYyMjcuMkUtNzY3OTY1ODAwIC0+IC02NC4xNzI4NDQwIEluZXhhY3QgUm91bmRlZAoreGNvbTQzMyBjb21wYXJlIC02NC4xNzI4NDQgLTI4NTA2MjI3LjJFLTc2Nzk2NTgwMCAtPiAtMQoreGRpdjQzMyBkaXZpZGUgLTY0LjE3Mjg0NCAtMjg1MDYyMjcuMkUtNzY3OTY1ODAwIC0+IDIuMjUxMTg2ODZFKzc2Nzk2NTc5NCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzMgZGl2aWRlaW50IC02NC4xNzI4NDQgLTI4NTA2MjI3LjJFLTc2Nzk2NTgwMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQzMyBtdWx0aXBseSAtNjQuMTcyODQ0IC0yODUwNjIyNy4yRS03Njc5NjU4MDAgLT4gMS44MjkzMjU2N0UtNzY3OTY1NzkxIEluZXhhY3QgUm91bmRlZAoreHBvdzQzMyBwb3dlciAtNjQuMTcyODQ0IC0zIC0+IC0wLjAwMDAwMzc4Mzk1NjU0IEluZXhhY3QgUm91bmRlZAoreHJlbTQzMyByZW1haW5kZXIgLTY0LjE3Mjg0NCAtMjg1MDYyMjcuMkUtNzY3OTY1ODAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDMzIHN1YnRyYWN0IC02NC4xNzI4NDQgLTI4NTA2MjI3LjJFLTc2Nzk2NTgwMCAtPiAtNjQuMTcyODQ0MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzQgYWRkIDcwNDM3LjE1NTEgLTYyOTE2LjEyMzMgLT4gNzUyMS4wMzE4Cit4Y29tNDM0IGNvbXBhcmUgNzA0MzcuMTU1MSAtNjI5MTYuMTIzMyAtPiAxCit4ZGl2NDM0IGRpdmlkZSA3MDQzNy4xNTUxIC02MjkxNi4xMjMzIC0+IC0xLjExOTU0MDYxIEluZXhhY3QgUm91bmRlZAoreGR2aTQzNCBkaXZpZGVpbnQgNzA0MzcuMTU1MSAtNjI5MTYuMTIzMyAtPiAtMQoreG11bDQzNCBtdWx0aXBseSA3MDQzNy4xNTUxIC02MjkxNi4xMjMzIC0+IC00LjQzMTYzMjc0RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzQzNCBwb3dlciA3MDQzNy4xNTUxIC02MjkxNiAtPiA1LjAyOTQ1MDYwRS0zMDUwMDUgSW5leGFjdCBSb3VuZGVkCit4cmVtNDM0IHJlbWFpbmRlciA3MDQzNy4xNTUxIC02MjkxNi4xMjMzIC0+IDc1MjEuMDMxOAoreHN1YjQzNCBzdWJ0cmFjdCA3MDQzNy4xNTUxIC02MjkxNi4xMjMzIC0+IDEzMzM1My4yNzggSW5leGFjdCBSb3VuZGVkCit4YWRkNDM1IGFkZCA5MTYyNjAxNjQgLTU4LjQwMTczMjUgLT4gOTE2MjYwMTA2IEluZXhhY3QgUm91bmRlZAoreGNvbTQzNSBjb21wYXJlIDkxNjI2MDE2NCAtNTguNDAxNzMyNSAtPiAxCit4ZGl2NDM1IGRpdmlkZSA5MTYyNjAxNjQgLTU4LjQwMTczMjUgLT4gLTE1Njg4OTIwLjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDM1IGRpdmlkZWludCA5MTYyNjAxNjQgLTU4LjQwMTczMjUgLT4gLTE1Njg4OTIwCit4bXVsNDM1IG11bHRpcGx5IDkxNjI2MDE2NCAtNTguNDAxNzMyNSAtPiAtNS4zNTExMTgxMEUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93NDM1IHBvd2VyIDkxNjI2MDE2NCAtNTggLT4gMS41OTU1NDU4N0UtNTIwIEluZXhhY3QgUm91bmRlZAoreHJlbTQzNSByZW1haW5kZXIgOTE2MjYwMTY0IC01OC40MDE3MzI1IC0+IDU0Ljk0NjEwMDAKK3hzdWI0MzUgc3VidHJhY3QgOTE2MjYwMTY0IC01OC40MDE3MzI1IC0+IDkxNjI2MDIyMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0MzYgYWRkIDE5ODg5MDg1LjNFLTQ2ODE2NDgwIDE1ODE2ODMuOTQgLT4gMTU4MTY4My45NCBJbmV4YWN0IFJvdW5kZWQKK3hjb200MzYgY29tcGFyZSAxOTg4OTA4NS4zRS00NjgxNjQ4MCAxNTgxNjgzLjk0IC0+IC0xCit4ZGl2NDM2IGRpdmlkZSAxOTg4OTA4NS4zRS00NjgxNjQ4MCAxNTgxNjgzLjk0IC0+IDEuMjU3NDYyNjhFLTQ2ODE2NDc5IEluZXhhY3QgUm91bmRlZAoreGR2aTQzNiBkaXZpZGVpbnQgMTk4ODkwODUuM0UtNDY4MTY0ODAgMTU4MTY4My45NCAtPiAwCit4bXVsNDM2IG11bHRpcGx5IDE5ODg5MDg1LjNFLTQ2ODE2NDgwIDE1ODE2ODMuOTQgLT4gMy4xNDU4MjQ2OEUtNDY4MTY0NjcgSW5leGFjdCBSb3VuZGVkCit4cG93NDM2IHBvd2VyIDE5ODg5MDg1LjNFLTQ2ODE2NDgwIDE1ODE2ODQgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDM2IHJlbWFpbmRlciAxOTg4OTA4NS4zRS00NjgxNjQ4MCAxNTgxNjgzLjk0IC0+IDEuOTg4OTA4NTNFLTQ2ODE2NDczCit4c3ViNDM2IHN1YnRyYWN0IDE5ODg5MDg1LjNFLTQ2ODE2NDgwIDE1ODE2ODMuOTQgLT4gLTE1ODE2ODMuOTQgSW5leGFjdCBSb3VuZGVkCit4YWRkNDM3IGFkZCAtNTYzMTIuMzM4MyA3ODkuNDY2MDY0IC0+IC01NTUyMi44NzIyIEluZXhhY3QgUm91bmRlZAoreGNvbTQzNyBjb21wYXJlIC01NjMxMi4zMzgzIDc4OS40NjYwNjQgLT4gLTEKK3hkaXY0MzcgZGl2aWRlIC01NjMxMi4zMzgzIDc4OS40NjYwNjQgLT4gLTcxLjMyOTY1MDMgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDM3IGRpdmlkZWludCAtNTYzMTIuMzM4MyA3ODkuNDY2MDY0IC0+IC03MQoreG11bDQzNyBtdWx0aXBseSAtNTYzMTIuMzM4MyA3ODkuNDY2MDY0IC0+IC00NDQ1NjY4MC4xIEluZXhhY3QgUm91bmRlZAoreHBvdzQzNyBwb3dlciAtNTYzMTIuMzM4MyA3ODkgLT4gLTEuNjgzNDg3MjRFKzM3NDggSW5leGFjdCBSb3VuZGVkCit4cmVtNDM3IHJlbWFpbmRlciAtNTYzMTIuMzM4MyA3ODkuNDY2MDY0IC0+IC0yNjAuMjQ3NzU2Cit4c3ViNDM3IHN1YnRyYWN0IC01NjMxMi4zMzgzIDc4OS40NjYwNjQgLT4gLTU3MTAxLjgwNDQgSW5leGFjdCBSb3VuZGVkCit4YWRkNDM4IGFkZCAxODM0NDIuODQ5IC05MjU4NzYxMDYgLT4gLTkyNTY5MjY2MyBJbmV4YWN0IFJvdW5kZWQKK3hjb200MzggY29tcGFyZSAxODM0NDIuODQ5IC05MjU4NzYxMDYgLT4gMQoreGRpdjQzOCBkaXZpZGUgMTgzNDQyLjg0OSAtOTI1ODc2MTA2IC0+IC0wLjAwMDE5ODEyODkzNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0MzggZGl2aWRlaW50IDE4MzQ0Mi44NDkgLTkyNTg3NjEwNiAtPiAtMAoreG11bDQzOCBtdWx0aXBseSAxODM0NDIuODQ5IC05MjU4NzYxMDYgLT4gLTEuNjk4NDUzNTFFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzQzOCBwb3dlciAxODM0NDIuODQ5IC05MjU4NzYxMDYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDM4IHJlbWFpbmRlciAxODM0NDIuODQ5IC05MjU4NzYxMDYgLT4gMTgzNDQyLjg0OQoreHN1YjQzOCBzdWJ0cmFjdCAxODM0NDIuODQ5IC05MjU4NzYxMDYgLT4gOTI2MDU5NTQ5IEluZXhhY3QgUm91bmRlZAoreGFkZDQzOSBhZGQgOTcxMTEzLjY1NUUtNjk1NTQwMjQ5IC00MTkzNTExMjBFLTk3Nzc0MzgyMyAtPiA5LjcxMTEzNjU1RS02OTU1NDAyNDQgSW5leGFjdCBSb3VuZGVkCit4Y29tNDM5IGNvbXBhcmUgOTcxMTEzLjY1NUUtNjk1NTQwMjQ5IC00MTkzNTExMjBFLTk3Nzc0MzgyMyAtPiAxCit4ZGl2NDM5IGRpdmlkZSA5NzExMTMuNjU1RS02OTU1NDAyNDkgLTQxOTM1MTEyMEUtOTc3NzQzODIzIC0+IC0yLjMxNTc1MzEwRSsyODIyMDM1NzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDM5IGRpdmlkZWludCA5NzExMTMuNjU1RS02OTU1NDAyNDkgLTQxOTM1MTEyMEUtOTc3NzQzODIzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDM5IG11bHRpcGx5IDk3MTExMy42NTVFLTY5NTU0MDI0OSAtNDE5MzUxMTIwRS05Nzc3NDM4MjMgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHBvdzQzOSBwb3dlciA5NzExMTMuNjU1RS02OTU1NDAyNDkgLTQgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDM5IHJlbWFpbmRlciA5NzExMTMuNjU1RS02OTU1NDAyNDkgLTQxOTM1MTEyMEUtOTc3NzQzODIzIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDM5IHN1YnRyYWN0IDk3MTExMy42NTVFLTY5NTU0MDI0OSAtNDE5MzUxMTIwRS05Nzc3NDM4MjMgLT4gOS43MTExMzY1NUUtNjk1NTQwMjQ0IEluZXhhY3QgUm91bmRlZAoreGFkZDQ0MCBhZGQgODU5NjU4NTUxLiA3MjMzOC4yMDU0IC0+IDg1OTczMDg4OSBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDAgY29tcGFyZSA4NTk2NTg1NTEuIDcyMzM4LjIwNTQgLT4gMQoreGRpdjQ0MCBkaXZpZGUgODU5NjU4NTUxLiA3MjMzOC4yMDU0IC0+IDExODgzLjg4MDAgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQwIGRpdmlkZWludCA4NTk2NTg1NTEuIDcyMzM4LjIwNTQgLT4gMTE4ODMKK3htdWw0NDAgbXVsdGlwbHkgODU5NjU4NTUxLiA3MjMzOC4yMDU0IC0+IDYuMjE4NjE1NjhFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzQ0MCBwb3dlciA4NTk2NTg1NTEuIDcyMzM4IC0+IDEuODc2MjA0NTBFKzY0NjI5MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NDAgcmVtYWluZGVyIDg1OTY1ODU1MS4gNzIzMzguMjA1NCAtPiA2MzY1Ni4yMzE4Cit4c3ViNDQwIHN1YnRyYWN0IDg1OTY1ODU1MS4gNzIzMzguMjA1NCAtPiA4NTk1ODYyMTMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDQxIGFkZCAtMy44NjQ0NjYzMEUrNDI2ODE2MDY4IC02NjQuNTM0NzM3IC0+IC0zLjg2NDQ2NjMwRSs0MjY4MTYwNjggSW5leGFjdCBSb3VuZGVkCit4Y29tNDQxIGNvbXBhcmUgLTMuODY0NDY2MzBFKzQyNjgxNjA2OCAtNjY0LjUzNDczNyAtPiAtMQoreGRpdjQ0MSBkaXZpZGUgLTMuODY0NDY2MzBFKzQyNjgxNjA2OCAtNjY0LjUzNDczNyAtPiA1LjgxNTI5NjE1RSs0MjY4MTYwNjUgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQxIGRpdmlkZWludCAtMy44NjQ0NjYzMEUrNDI2ODE2MDY4IC02NjQuNTM0NzM3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDQxIG11bHRpcGx5IC0zLjg2NDQ2NjMwRSs0MjY4MTYwNjggLTY2NC41MzQ3MzcgLT4gMi41NjgwNzIxMEUrNDI2ODE2MDcxIEluZXhhY3QgUm91bmRlZAoreHBvdzQ0MSBwb3dlciAtMy44NjQ0NjYzMEUrNDI2ODE2MDY4IC02NjUgLT4gLTBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ0MSByZW1haW5kZXIgLTMuODY0NDY2MzBFKzQyNjgxNjA2OCAtNjY0LjUzNDczNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ0MSBzdWJ0cmFjdCAtMy44NjQ0NjYzMEUrNDI2ODE2MDY4IC02NjQuNTM0NzM3IC0+IC0zLjg2NDQ2NjMwRSs0MjY4MTYwNjggSW5leGFjdCBSb3VuZGVkCit4YWRkNDQyIGFkZCAtOTY5Ljg4MTgxOCAzMTE3MC44NTU1IC0+IDMwMjAwLjk3MzcgSW5leGFjdCBSb3VuZGVkCit4Y29tNDQyIGNvbXBhcmUgLTk2OS44ODE4MTggMzExNzAuODU1NSAtPiAtMQoreGRpdjQ0MiBkaXZpZGUgLTk2OS44ODE4MTggMzExNzAuODU1NSAtPiAtMC4wMzExMTUwMjA4IEluZXhhY3QgUm91bmRlZAoreGR2aTQ0MiBkaXZpZGVpbnQgLTk2OS44ODE4MTggMzExNzAuODU1NSAtPiAtMAoreG11bDQ0MiBtdWx0aXBseSAtOTY5Ljg4MTgxOCAzMTE3MC44NTU1IC0+IC0zMDIzMjA0Ni4wIEluZXhhY3QgUm91bmRlZAoreHBvdzQ0MiBwb3dlciAtOTY5Ljg4MTgxOCAzMTE3MSAtPiAtMS4wMjg2NTg5NEUrOTMwOTkgSW5leGFjdCBSb3VuZGVkCit4cmVtNDQyIHJlbWFpbmRlciAtOTY5Ljg4MTgxOCAzMTE3MC44NTU1IC0+IC05NjkuODgxODE4Cit4c3ViNDQyIHN1YnRyYWN0IC05NjkuODgxODE4IDMxMTcwLjg1NTUgLT4gLTMyMTQwLjczNzMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDQzIGFkZCA3OTgwNTM3LjI3IDg1LjQwNDA1MTIgLT4gNzk4MDYyMi42NyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDMgY29tcGFyZSA3OTgwNTM3LjI3IDg1LjQwNDA1MTIgLT4gMQoreGRpdjQ0MyBkaXZpZGUgNzk4MDUzNy4yNyA4NS40MDQwNTEyIC0+IDkzNDQ0LjQ4MTQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQzIGRpdmlkZWludCA3OTgwNTM3LjI3IDg1LjQwNDA1MTIgLT4gOTM0NDQKK3htdWw0NDMgbXVsdGlwbHkgNzk4MDUzNy4yNyA4NS40MDQwNTEyIC0+IDY4MTU3MDIxNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NDMgcG93ZXIgNzk4MDUzNy4yNyA4NSAtPiA0LjcwNjg1NzYzRSs1ODYgSW5leGFjdCBSb3VuZGVkCit4cmVtNDQzIHJlbWFpbmRlciA3OTgwNTM3LjI3IDg1LjQwNDA1MTIgLT4gNDEuMTA5NjY3MgoreHN1YjQ0MyBzdWJ0cmFjdCA3OTgwNTM3LjI3IDg1LjQwNDA1MTIgLT4gNzk4MDQ1MS44NyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDQgYWRkIC0xMTQ2MDk5MTYuIDc1MjUuMTQ5ODEgLT4gLTExNDYwMjM5MSBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDQgY29tcGFyZSAtMTE0NjA5OTE2LiA3NTI1LjE0OTgxIC0+IC0xCit4ZGl2NDQ0IGRpdmlkZSAtMTE0NjA5OTE2LiA3NTI1LjE0OTgxIC0+IC0xNTIzMC4yNTA0IEluZXhhY3QgUm91bmRlZAoreGR2aTQ0NCBkaXZpZGVpbnQgLTExNDYwOTkxNi4gNzUyNS4xNDk4MSAtPiAtMTUyMzAKK3htdWw0NDQgbXVsdGlwbHkgLTExNDYwOTkxNi4gNzUyNS4xNDk4MSAtPiAtOC42MjQ1Njc4OEUrMTEgSW5leGFjdCBSb3VuZGVkCit4cG93NDQ0IHBvd2VyIC0xMTQ2MDk5MTYuIDc1MjUgLT4gLTQuNDM2MjA0NDVFKzYwNjQ1IEluZXhhY3QgUm91bmRlZAoreHJlbTQ0NCByZW1haW5kZXIgLTExNDYwOTkxNi4gNzUyNS4xNDk4MSAtPiAtMTg4NC4zOTM3MAoreHN1YjQ0NCBzdWJ0cmFjdCAtMTE0NjA5OTE2LiA3NTI1LjE0OTgxIC0+IC0xMTQ2MTc0NDEgSW5leGFjdCBSb3VuZGVkCit4YWRkNDQ1IGFkZCA4LjQzNDA0NjgyRS01MDA1NzI1NjggNDc0NTI2NzE5IC0+IDQ3NDUyNjcxOSBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDUgY29tcGFyZSA4LjQzNDA0NjgyRS01MDA1NzI1NjggNDc0NTI2NzE5IC0+IC0xCit4ZGl2NDQ1IGRpdmlkZSA4LjQzNDA0NjgyRS01MDA1NzI1NjggNDc0NTI2NzE5IC0+IDEuNzc3MzU5NzNFLTUwMDU3MjU3NiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NDUgZGl2aWRlaW50IDguNDM0MDQ2ODJFLTUwMDU3MjU2OCA0NzQ1MjY3MTkgLT4gMAoreG11bDQ0NSBtdWx0aXBseSA4LjQzNDA0NjgyRS01MDA1NzI1NjggNDc0NTI2NzE5IC0+IDQuMDAyMTgwNTdFLTUwMDU3MjU1OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NDUgcG93ZXIgOC40MzQwNDY4MkUtNTAwNTcyNTY4IDQ3NDUyNjcxOSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00NDUgcmVtYWluZGVyIDguNDM0MDQ2ODJFLTUwMDU3MjU2OCA0NzQ1MjY3MTkgLT4gOC40MzQwNDY4MkUtNTAwNTcyNTY4Cit4c3ViNDQ1IHN1YnRyYWN0IDguNDM0MDQ2ODJFLTUwMDU3MjU2OCA0NzQ1MjY3MTkgLT4gLTQ3NDUyNjcxOSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NDYgYWRkIDE4ODAwNjQzMyAyMjYwLjE3MDM3RS05NzgxOTI1MjUgLT4gMTg4MDA2NDMzIEluZXhhY3QgUm91bmRlZAoreGNvbTQ0NiBjb21wYXJlIDE4ODAwNjQzMyAyMjYwLjE3MDM3RS05NzgxOTI1MjUgLT4gMQoreGRpdjQ0NiBkaXZpZGUgMTg4MDA2NDMzIDIyNjAuMTcwMzdFLTk3ODE5MjUyNSAtPiA4LjMxODI0MTY1RSs5NzgxOTI1MjkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQ2IGRpdmlkZWludCAxODgwMDY0MzMgMjI2MC4xNzAzN0UtOTc4MTkyNTI1IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDQ2IG11bHRpcGx5IDE4ODAwNjQzMyAyMjYwLjE3MDM3RS05NzgxOTI1MjUgLT4gNC4yNDkyNjU2OUUtOTc4MTkyNTE0IEluZXhhY3QgUm91bmRlZAoreHBvdzQ0NiBwb3dlciAxODgwMDY0MzMgMiAtPiAzLjUzNDY0MTg4RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NDYgcmVtYWluZGVyIDE4ODAwNjQzMyAyMjYwLjE3MDM3RS05NzgxOTI1MjUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0NDYgc3VidHJhY3QgMTg4MDA2NDMzIDIyNjAuMTcwMzdFLTk3ODE5MjUyNSAtPiAxODgwMDY0MzMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDQ3IGFkZCAtOS45NTgzNjMxMiAtODY2NDY2NzAzIC0+IC04NjY0NjY3MTMgSW5leGFjdCBSb3VuZGVkCit4Y29tNDQ3IGNvbXBhcmUgLTkuOTU4MzYzMTIgLTg2NjQ2NjcwMyAtPiAxCit4ZGl2NDQ3IGRpdmlkZSAtOS45NTgzNjMxMiAtODY2NDY2NzAzIC0+IDEuMTQ5MzA3MDdFLTggSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQ3IGRpdmlkZWludCAtOS45NTgzNjMxMiAtODY2NDY2NzAzIC0+IDAKK3htdWw0NDcgbXVsdGlwbHkgLTkuOTU4MzYzMTIgLTg2NjQ2NjcwMyAtPiA4LjYyODU5MDA2RSs5IEluZXhhY3QgUm91bmRlZAoreHBvdzQ0NyBwb3dlciAtOS45NTgzNjMxMiAtODY2NDY2NzAzIC0+IC02LjcxNzQ0MzY5RS04NjQ4OTY2MzAgSW5leGFjdCBSb3VuZGVkCit4cmVtNDQ3IHJlbWFpbmRlciAtOS45NTgzNjMxMiAtODY2NDY2NzAzIC0+IC05Ljk1ODM2MzEyCit4c3ViNDQ3IHN1YnRyYWN0IC05Ljk1ODM2MzEyIC04NjY0NjY3MDMgLT4gODY2NDY2NjkzIEluZXhhY3QgUm91bmRlZAoreGFkZDQ0OCBhZGQgODA5MTkzMzkuMkUtOTY3MjMxNTg2IDIxOS44MjQyNjYgLT4gMjE5LjgyNDI2NiBJbmV4YWN0IFJvdW5kZWQKK3hjb200NDggY29tcGFyZSA4MDkxOTMzOS4yRS05NjcyMzE1ODYgMjE5LjgyNDI2NiAtPiAtMQoreGRpdjQ0OCBkaXZpZGUgODA5MTkzMzkuMkUtOTY3MjMxNTg2IDIxOS44MjQyNjYgLT4gMy42ODEwOTIyMEUtOTY3MjMxNTgxIEluZXhhY3QgUm91bmRlZAoreGR2aTQ0OCBkaXZpZGVpbnQgODA5MTkzMzkuMkUtOTY3MjMxNTg2IDIxOS44MjQyNjYgLT4gMAoreG11bDQ0OCBtdWx0aXBseSA4MDkxOTMzOS4yRS05NjcyMzE1ODYgMjE5LjgyNDI2NiAtPiAxLjc3ODgwMzQzRS05NjcyMzE1NzYgSW5leGFjdCBSb3VuZGVkCit4cG93NDQ4IHBvd2VyIDgwOTE5MzM5LjJFLTk2NzIzMTU4NiAyMjAgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDQ4IHJlbWFpbmRlciA4MDkxOTMzOS4yRS05NjcyMzE1ODYgMjE5LjgyNDI2NiAtPiA4LjA5MTkzMzkyRS05NjcyMzE1NzkKK3hzdWI0NDggc3VidHJhY3QgODA5MTkzMzkuMkUtOTY3MjMxNTg2IDIxOS44MjQyNjYgLT4gLTIxOS44MjQyNjYgSW5leGFjdCBSb3VuZGVkCit4YWRkNDQ5IGFkZCAxNTk1NzkuNDQ0IC04OTgyNy41MjI5IC0+IDY5NzUxLjkyMTEKK3hjb200NDkgY29tcGFyZSAxNTk1NzkuNDQ0IC04OTgyNy41MjI5IC0+IDEKK3hkaXY0NDkgZGl2aWRlIDE1OTU3OS40NDQgLTg5ODI3LjUyMjkgLT4gLTEuNzc2NTA5NDYgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDQ5IGRpdmlkZWludCAxNTk1NzkuNDQ0IC04OTgyNy41MjI5IC0+IC0xCit4bXVsNDQ5IG11bHRpcGx5IDE1OTU3OS40NDQgLTg5ODI3LjUyMjkgLT4gLTEuNDMzNDYyNjJFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzQ0OSBwb3dlciAxNTk1NzkuNDQ0IC04OTgyOCAtPiA5LjY5OTU1ODUwRS00NjczNzQgSW5leGFjdCBSb3VuZGVkCit4cmVtNDQ5IHJlbWFpbmRlciAxNTk1NzkuNDQ0IC04OTgyNy41MjI5IC0+IDY5NzUxLjkyMTEKK3hzdWI0NDkgc3VidHJhY3QgMTU5NTc5LjQ0NCAtODk4MjcuNTIyOSAtPiAyNDk0MDYuOTY3IEluZXhhY3QgUm91bmRlZAoreGFkZDQ1MCBhZGQgLTQuNTQwMDAxNTMgNjk2NjMzMy43NCAtPiA2OTY2MzI5LjIwIEluZXhhY3QgUm91bmRlZAoreGNvbTQ1MCBjb21wYXJlIC00LjU0MDAwMTUzIDY5NjYzMzMuNzQgLT4gLTEKK3hkaXY0NTAgZGl2aWRlIC00LjU0MDAwMTUzIDY5NjYzMzMuNzQgLT4gLTYuNTE3MDYwMDVFLTcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDUwIGRpdmlkZWludCAtNC41NDAwMDE1MyA2OTY2MzMzLjc0IC0+IC0wCit4bXVsNDUwIG11bHRpcGx5IC00LjU0MDAwMTUzIDY5NjYzMzMuNzQgLT4gLTMxNjI3MTY1LjggSW5leGFjdCBSb3VuZGVkCit4cG93NDUwIHBvd2VyIC00LjU0MDAwMTUzIDY5NjYzMzQgLT4gMy41MjU2ODkxM0UrNDU3NzI3MSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NTAgcmVtYWluZGVyIC00LjU0MDAwMTUzIDY5NjYzMzMuNzQgLT4gLTQuNTQwMDAxNTMKK3hzdWI0NTAgc3VidHJhY3QgLTQuNTQwMDAxNTMgNjk2NjMzMy43NCAtPiAtNjk2NjMzOC4yOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NTEgYWRkIDI4NzAxNTM4LjdFLTM5MTAxNTY0OSAtOTIwOTk5MTkyLiAtPiAtOTIwOTk5MTkyIEluZXhhY3QgUm91bmRlZAoreGNvbTQ1MSBjb21wYXJlIDI4NzAxNTM4LjdFLTM5MTAxNTY0OSAtOTIwOTk5MTkyLiAtPiAxCit4ZGl2NDUxIGRpdmlkZSAyODcwMTUzOC43RS0zOTEwMTU2NDkgLTkyMDk5OTE5Mi4gLT4gLTMuMTE2MzQ3ODdFLTM5MTAxNTY1MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NTEgZGl2aWRlaW50IDI4NzAxNTM4LjdFLTM5MTAxNTY0OSAtOTIwOTk5MTkyLiAtPiAtMAoreG11bDQ1MSBtdWx0aXBseSAyODcwMTUzOC43RS0zOTEwMTU2NDkgLTkyMDk5OTE5Mi4gLT4gLTIuNjQzNDA5NDBFLTM5MTAxNTYzMyBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTEgcG93ZXIgMjg3MDE1MzguN0UtMzkxMDE1NjQ5IC05MjA5OTkxOTIgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDUxIHJlbWFpbmRlciAyODcwMTUzOC43RS0zOTEwMTU2NDkgLTkyMDk5OTE5Mi4gLT4gMi44NzAxNTM4N0UtMzkxMDE1NjQyCit4c3ViNDUxIHN1YnRyYWN0IDI4NzAxNTM4LjdFLTM5MTAxNTY0OSAtOTIwOTk5MTkyLiAtPiA5MjA5OTkxOTIgSW5leGFjdCBSb3VuZGVkCit4YWRkNDUyIGFkZCAtMzYxMzgyNTc1LiAtNzk3Ni4xNTI4NkUrODk4NDkxMTY5IC0+IC03Ljk3NjE1Mjg2RSs4OTg0OTExNzIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDUyIGNvbXBhcmUgLTM2MTM4MjU3NS4gLTc5NzYuMTUyODZFKzg5ODQ5MTE2OSAtPiAxCit4ZGl2NDUyIGRpdmlkZSAtMzYxMzgyNTc1LiAtNzk3Ni4xNTI4NkUrODk4NDkxMTY5IC0+IDQuNTMwNzg3OThFLTg5ODQ5MTE2NSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NTIgZGl2aWRlaW50IC0zNjEzODI1NzUuIC03OTc2LjE1Mjg2RSs4OTg0OTExNjkgLT4gMAoreG11bDQ1MiBtdWx0aXBseSAtMzYxMzgyNTc1LiAtNzk3Ni4xNTI4NkUrODk4NDkxMTY5IC0+IDIuODgyNDQyNjZFKzg5ODQ5MTE4MSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTIgcG93ZXIgLTM2MTM4MjU3NS4gLTggLT4gMy40Mzc2NTUzN0UtNjkgSW5leGFjdCBSb3VuZGVkCit4cmVtNDUyIHJlbWFpbmRlciAtMzYxMzgyNTc1LiAtNzk3Ni4xNTI4NkUrODk4NDkxMTY5IC0+IC0zNjEzODI1NzUKK3hzdWI0NTIgc3VidHJhY3QgLTM2MTM4MjU3NS4gLTc5NzYuMTUyODZFKzg5ODQ5MTE2OSAtPiA3Ljk3NjE1Mjg2RSs4OTg0OTExNzIgSW5leGFjdCBSb3VuZGVkCit4YWRkNDUzIGFkZCA3MDIxODA1LjYxIDEyMjI5NTIuODMgLT4gODI0NDc1OC40NAoreGNvbTQ1MyBjb21wYXJlIDcwMjE4MDUuNjEgMTIyMjk1Mi44MyAtPiAxCit4ZGl2NDUzIGRpdmlkZSA3MDIxODA1LjYxIDEyMjI5NTIuODMgLT4gNS43NDE2ODE0OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NTMgZGl2aWRlaW50IDcwMjE4MDUuNjEgMTIyMjk1Mi44MyAtPiA1Cit4bXVsNDUzIG11bHRpcGx5IDcwMjE4MDUuNjEgMTIyMjk1Mi44MyAtPiA4LjU4NzMzNzA0RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTMgcG93ZXIgNzAyMTgwNS42MSAxMjIyOTUzIC0+IDEuMjY1NDA1NTNFKzgzNzI4ODUgSW5leGFjdCBSb3VuZGVkCit4cmVtNDUzIHJlbWFpbmRlciA3MDIxODA1LjYxIDEyMjI5NTIuODMgLT4gOTA3MDQxLjQ2Cit4c3ViNDUzIHN1YnRyYWN0IDcwMjE4MDUuNjEgMTIyMjk1Mi44MyAtPiA1Nzk4ODUyLjc4Cit4YWRkNDU0IGFkZCAtNDAuNDgxMTY2NyAtNzk2NTUuNTYzNSAtPiAtNzk2OTYuMDQ0NyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NTQgY29tcGFyZSAtNDAuNDgxMTY2NyAtNzk2NTUuNTYzNSAtPiAxCit4ZGl2NDU0IGRpdmlkZSAtNDAuNDgxMTY2NyAtNzk2NTUuNTYzNSAtPiAwLjAwMDUwODIwMjYyOCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NTQgZGl2aWRlaW50IC00MC40ODExNjY3IC03OTY1NS41NjM1IC0+IDAKK3htdWw0NTQgbXVsdGlwbHkgLTQwLjQ4MTE2NjcgLTc5NjU1LjU2MzUgLT4gMzIyNDU1MC4xNCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTQgcG93ZXIgLTQwLjQ4MTE2NjcgLTc5NjU2IC0+IDQuNTAxNzQyNzVFLTEyODAyOCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NTQgcmVtYWluZGVyIC00MC40ODExNjY3IC03OTY1NS41NjM1IC0+IC00MC40ODExNjY3Cit4c3ViNDU0IHN1YnRyYWN0IC00MC40ODExNjY3IC03OTY1NS41NjM1IC0+IDc5NjE1LjA4MjMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDU1IGFkZCAtODc1NTY3NC4zOEUrMTE3MTY4MTc3IDE0OC45MDM0MDQgLT4gLTguNzU1Njc0MzhFKzExNzE2ODE4MyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NTUgY29tcGFyZSAtODc1NTY3NC4zOEUrMTE3MTY4MTc3IDE0OC45MDM0MDQgLT4gLTEKK3hkaXY0NTUgZGl2aWRlIC04NzU1Njc0LjM4RSsxMTcxNjgxNzcgMTQ4LjkwMzQwNCAtPiAtNS44ODAxMDM1N0UrMTE3MTY4MTgxIEluZXhhY3QgUm91bmRlZAoreGR2aTQ1NSBkaXZpZGVpbnQgLTg3NTU2NzQuMzhFKzExNzE2ODE3NyAxNDguOTAzNDA0IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDU1IG11bHRpcGx5IC04NzU1Njc0LjM4RSsxMTcxNjgxNzcgMTQ4LjkwMzQwNCAtPiAtMS4zMDM3NDk3MkUrMTE3MTY4MTg2IEluZXhhY3QgUm91bmRlZAoreHBvdzQ1NSBwb3dlciAtODc1NTY3NC4zOEUrMTE3MTY4MTc3IDE0OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDU1IHJlbWFpbmRlciAtODc1NTY3NC4zOEUrMTE3MTY4MTc3IDE0OC45MDM0MDQgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0NTUgc3VidHJhY3QgLTg3NTU2NzQuMzhFKzExNzE2ODE3NyAxNDguOTAzNDA0IC0+IC04Ljc1NTY3NDM4RSsxMTcxNjgxODMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDU2IGFkZCAzNC41MzI5NzgxRSszODI4MjkzOTIgLTQ1LjIxNzczMDkgLT4gMy40NTMyOTc4MUUrMzgyODI5MzkzIEluZXhhY3QgUm91bmRlZAoreGNvbTQ1NiBjb21wYXJlIDM0LjUzMjk3ODFFKzM4MjgyOTM5MiAtNDUuMjE3NzMwOSAtPiAxCit4ZGl2NDU2IGRpdmlkZSAzNC41MzI5NzgxRSszODI4MjkzOTIgLTQ1LjIxNzczMDkgLT4gLTcuNjM3MDQzNTdFKzM4MjgyOTM5MSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NTYgZGl2aWRlaW50IDM0LjUzMjk3ODFFKzM4MjgyOTM5MiAtNDUuMjE3NzMwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ1NiBtdWx0aXBseSAzNC41MzI5NzgxRSszODI4MjkzOTIgLTQ1LjIxNzczMDkgLT4gLTEuNTYxNTAyOTFFKzM4MjgyOTM5NSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NTYgcG93ZXIgMzQuNTMyOTc4MUUrMzgyODI5MzkyIC00NSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00NTYgcmVtYWluZGVyIDM0LjUzMjk3ODFFKzM4MjgyOTM5MiAtNDUuMjE3NzMwOSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ1NiBzdWJ0cmFjdCAzNC41MzI5NzgxRSszODI4MjkzOTIgLTQ1LjIxNzczMDkgLT4gMy40NTMyOTc4MUUrMzgyODI5MzkzIEluZXhhY3QgUm91bmRlZAoreGFkZDQ1NyBhZGQgLTM3OTU4NDc2LjAgNTg0MzY3LjkzNSAtPiAtMzczNzQxMDguMSBJbmV4YWN0IFJvdW5kZWQKK3hjb200NTcgY29tcGFyZSAtMzc5NTg0NzYuMCA1ODQzNjcuOTM1IC0+IC0xCit4ZGl2NDU3IGRpdmlkZSAtMzc5NTg0NzYuMCA1ODQzNjcuOTM1IC0+IC02NC45NTY0NjYyIEluZXhhY3QgUm91bmRlZAoreGR2aTQ1NyBkaXZpZGVpbnQgLTM3OTU4NDc2LjAgNTg0MzY3LjkzNSAtPiAtNjQKK3htdWw0NTcgbXVsdGlwbHkgLTM3OTU4NDc2LjAgNTg0MzY3LjkzNSAtPiAtMi4yMTgxNzE2MkUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93NDU3IHBvd2VyIC0zNzk1ODQ3Ni4wIDU4NDM2OCAtPiAzLjIwNTM4MjY4RSs0NDI5MTA1IEluZXhhY3QgUm91bmRlZAoreHJlbTQ1NyByZW1haW5kZXIgLTM3OTU4NDc2LjAgNTg0MzY3LjkzNSAtPiAtNTU4OTI4LjE2MAoreHN1YjQ1NyBzdWJ0cmFjdCAtMzc5NTg0NzYuMCA1ODQzNjcuOTM1IC0+IC0zODU0Mjg0My45IEluZXhhY3QgUm91bmRlZAoreGFkZDQ1OCBhZGQgNDk1MjMzLjU1M0UtNDE0MTUyMjE1IDYyMzUyNzU5LjIgLT4gNjIzNTI3NTkuMiBJbmV4YWN0IFJvdW5kZWQKK3hjb200NTggY29tcGFyZSA0OTUyMzMuNTUzRS00MTQxNTIyMTUgNjIzNTI3NTkuMiAtPiAtMQoreGRpdjQ1OCBkaXZpZGUgNDk1MjMzLjU1M0UtNDE0MTUyMjE1IDYyMzUyNzU5LjIgLT4gNy45NDI0NDgwOUUtNDE0MTUyMjE4IEluZXhhY3QgUm91bmRlZAoreGR2aTQ1OCBkaXZpZGVpbnQgNDk1MjMzLjU1M0UtNDE0MTUyMjE1IDYyMzUyNzU5LjIgLT4gMAoreG11bDQ1OCBtdWx0aXBseSA0OTUyMzMuNTUzRS00MTQxNTIyMTUgNjIzNTI3NTkuMiAtPiAzLjA4NzkxNzg1RS00MTQxNTIyMDIgSW5leGFjdCBSb3VuZGVkCit4cG93NDU4IHBvd2VyIDQ5NTIzMy41NTNFLTQxNDE1MjIxNSA2MjM1Mjc1OSAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00NTggcmVtYWluZGVyIDQ5NTIzMy41NTNFLTQxNDE1MjIxNSA2MjM1Mjc1OS4yIC0+IDQuOTUyMzM1NTNFLTQxNDE1MjIxMAoreHN1YjQ1OCBzdWJ0cmFjdCA0OTUyMzMuNTUzRS00MTQxNTIyMTUgNjIzNTI3NTkuMiAtPiAtNjIzNTI3NTkuMiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NTkgYWRkIC01MDIzNDMwNjAgLTk2ODI4Ljk5NCAtPiAtNTAyNDM5ODg5IEluZXhhY3QgUm91bmRlZAoreGNvbTQ1OSBjb21wYXJlIC01MDIzNDMwNjAgLTk2ODI4Ljk5NCAtPiAtMQoreGRpdjQ1OSBkaXZpZGUgLTUwMjM0MzA2MCAtOTY4MjguOTk0IC0+IDUxODcuOTQwNTAgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDU5IGRpdmlkZWludCAtNTAyMzQzMDYwIC05NjgyOC45OTQgLT4gNTE4NworeG11bDQ1OSBtdWx0aXBseSAtNTAyMzQzMDYwIC05NjgyOC45OTQgLT4gNC44NjQxMzczMUUrMTMgSW5leGFjdCBSb3VuZGVkCit4cG93NDU5IHBvd2VyIC01MDIzNDMwNjAgLTk2ODI5IC0+IC02Ljc4NjAyMTE5RS04NDI1MTAgSW5leGFjdCBSb3VuZGVkCit4cmVtNDU5IHJlbWFpbmRlciAtNTAyMzQzMDYwIC05NjgyOC45OTQgLT4gLTkxMDY4LjEyMgoreHN1YjQ1OSBzdWJ0cmFjdCAtNTAyMzQzMDYwIC05NjgyOC45OTQgLT4gLTUwMjI0NjIzMSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjAgYWRkIC0yMi40Mzk2MzlFKzkxNjM2Mjg3OCAtMzkuNDAzNzY4MSAtPiAtMi4yNDM5NjM5MEUrOTE2MzYyODc5IEluZXhhY3QgUm91bmRlZAoreGNvbTQ2MCBjb21wYXJlIC0yMi40Mzk2MzlFKzkxNjM2Mjg3OCAtMzkuNDAzNzY4MSAtPiAtMQoreGRpdjQ2MCBkaXZpZGUgLTIyLjQzOTYzOUUrOTE2MzYyODc4IC0zOS40MDM3NjgxIC0+IDUuNjk0Nzk1MjFFKzkxNjM2Mjg3NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NjAgZGl2aWRlaW50IC0yMi40Mzk2MzlFKzkxNjM2Mjg3OCAtMzkuNDAzNzY4MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ2MCBtdWx0aXBseSAtMjIuNDM5NjM5RSs5MTYzNjI4NzggLTM5LjQwMzc2ODEgLT4gOC44NDIwNjMzMUUrOTE2MzYyODgwIEluZXhhY3QgUm91bmRlZAoreHBvdzQ2MCBwb3dlciAtMjIuNDM5NjM5RSs5MTYzNjI4NzggLTM5IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00NjAgcmVtYWluZGVyIC0yMi40Mzk2MzlFKzkxNjM2Mjg3OCAtMzkuNDAzNzY4MSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ2MCBzdWJ0cmFjdCAtMjIuNDM5NjM5RSs5MTYzNjI4NzggLTM5LjQwMzc2ODEgLT4gLTIuMjQzOTYzOTBFKzkxNjM2Mjg3OSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjEgYWRkIDcxODE4MC41ODdFLTk1NzQ3MzcyMiAxLjY2MjIzNDQzIC0+IDEuNjYyMjM0NDMgSW5leGFjdCBSb3VuZGVkCit4Y29tNDYxIGNvbXBhcmUgNzE4MTgwLjU4N0UtOTU3NDczNzIyIDEuNjYyMjM0NDMgLT4gLTEKK3hkaXY0NjEgZGl2aWRlIDcxODE4MC41ODdFLTk1NzQ3MzcyMiAxLjY2MjIzNDQzIC0+IDQuMzIwNTczNDBFLTk1NzQ3MzcxNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NjEgZGl2aWRlaW50IDcxODE4MC41ODdFLTk1NzQ3MzcyMiAxLjY2MjIzNDQzIC0+IDAKK3htdWw0NjEgbXVsdGlwbHkgNzE4MTgwLjU4N0UtOTU3NDczNzIyIDEuNjYyMjM0NDMgLT4gMS4xOTM3ODQ1MEUtOTU3NDczNzE2IEluZXhhY3QgUm91bmRlZAoreHBvdzQ2MSBwb3dlciA3MTgxODAuNTg3RS05NTc0NzM3MjIgMiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00NjEgcmVtYWluZGVyIDcxODE4MC41ODdFLTk1NzQ3MzcyMiAxLjY2MjIzNDQzIC0+IDcuMTgxODA1ODdFLTk1NzQ3MzcxNworeHN1YjQ2MSBzdWJ0cmFjdCA3MTgxODAuNTg3RS05NTc0NzM3MjIgMS42NjIyMzQ0MyAtPiAtMS42NjIyMzQ0MyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjIgYWRkIC01MTU5Mi4yNjk4IC03MTM4ODUuNzQxIC0+IC03NjU0NzguMDExIEluZXhhY3QgUm91bmRlZAoreGNvbTQ2MiBjb21wYXJlIC01MTU5Mi4yNjk4IC03MTM4ODUuNzQxIC0+IDEKK3hkaXY0NjIgZGl2aWRlIC01MTU5Mi4yNjk4IC03MTM4ODUuNzQxIC0+IDAuMDcyMjY5NjQ2MCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NjIgZGl2aWRlaW50IC01MTU5Mi4yNjk4IC03MTM4ODUuNzQxIC0+IDAKK3htdWw0NjIgbXVsdGlwbHkgLTUxNTkyLjI2OTggLTcxMzg4NS43NDEgLT4gMy42ODMwOTg1OEUrMTAgSW5leGFjdCBSb3VuZGVkCit4cG93NDYyIHBvd2VyIC01MTU5Mi4yNjk4IC03MTM4ODYgLT4gNi4zODU3NjkyMEUtMzM2NDI0OSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NjIgcmVtYWluZGVyIC01MTU5Mi4yNjk4IC03MTM4ODUuNzQxIC0+IC01MTU5Mi4yNjk4Cit4c3ViNDYyIHN1YnRyYWN0IC01MTU5Mi4yNjk4IC03MTM4ODUuNzQxIC0+IDY2MjI5My40NzEgSW5leGFjdCBSb3VuZGVkCit4YWRkNDYzIGFkZCA1MS4yMjc5ODQ4RSs4MDQzOTc0NSAyMDcuNTU5MjVFKzg2NTE2NTA3MCAtPiAyLjA3NTU5MjUwRSs4NjUxNjUwNzIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDYzIGNvbXBhcmUgNTEuMjI3OTg0OEUrODA0Mzk3NDUgMjA3LjU1OTI1RSs4NjUxNjUwNzAgLT4gLTEKK3hkaXY0NjMgZGl2aWRlIDUxLjIyNzk4NDhFKzgwNDM5NzQ1IDIwNy41NTkyNUUrODY1MTY1MDcwIC0+IDIuNDY4MTEzNzlFLTc4NDcyNTMyNiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NjMgZGl2aWRlaW50IDUxLjIyNzk4NDhFKzgwNDM5NzQ1IDIwNy41NTkyNUUrODY1MTY1MDcwIC0+IDAKK3htdWw0NjMgbXVsdGlwbHkgNTEuMjI3OTg0OEUrODA0Mzk3NDUgMjA3LjU1OTI1RSs4NjUxNjUwNzAgLT4gMS4wNjMyODQyMUUrOTQ1NjA0ODE5IEluZXhhY3QgUm91bmRlZAoreHBvdzQ2MyBwb3dlciA1MS4yMjc5ODQ4RSs4MDQzOTc0NSAyIC0+IDIuNjI0MzA2NDNFKzE2MDg3OTQ5MyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NjMgcmVtYWluZGVyIDUxLjIyNzk4NDhFKzgwNDM5NzQ1IDIwNy41NTkyNUUrODY1MTY1MDcwIC0+IDUuMTIyNzk4NDhFKzgwNDM5NzQ2Cit4c3ViNDYzIHN1YnRyYWN0IDUxLjIyNzk4NDhFKzgwNDM5NzQ1IDIwNy41NTkyNUUrODY1MTY1MDcwIC0+IC0yLjA3NTU5MjUwRSs4NjUxNjUwNzIgSW5leGFjdCBSb3VuZGVkCit4YWRkNDY0IGFkZCAtNTk4My4yMzQ2OCAtMzkuOTU0NDUxMyAtPiAtNjAyMy4xODkxMyBJbmV4YWN0IFJvdW5kZWQKK3hjb200NjQgY29tcGFyZSAtNTk4My4yMzQ2OCAtMzkuOTU0NDUxMyAtPiAtMQoreGRpdjQ2NCBkaXZpZGUgLTU5ODMuMjM0NjggLTM5Ljk1NDQ1MTMgLT4gMTQ5Ljc1MTM5MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NjQgZGl2aWRlaW50IC01OTgzLjIzNDY4IC0zOS45NTQ0NTEzIC0+IDE0OQoreG11bDQ2NCBtdWx0aXBseSAtNTk4My4yMzQ2OCAtMzkuOTU0NDUxMyAtPiAyMzkwNTYuODU5IEluZXhhY3QgUm91bmRlZAoreHBvdzQ2NCBwb3dlciAtNTk4My4yMzQ2OCAtNDAgLT4gOC4zNjY3ODI5MUUtMTUyIEluZXhhY3QgUm91bmRlZAoreHJlbTQ2NCByZW1haW5kZXIgLTU5ODMuMjM0NjggLTM5Ljk1NDQ1MTMgLT4gLTMwLjAyMTQzNjMKK3hzdWI0NjQgc3VidHJhY3QgLTU5ODMuMjM0NjggLTM5Ljk1NDQ1MTMgLT4gLTU5NDMuMjgwMjMgSW5leGFjdCBSb3VuZGVkCit4YWRkNDY1IGFkZCA5MjE2MzkzMzIuRS05MTc1NDI5NjMgMjg3MzI1Ljg5MSAtPiAyODczMjUuODkxIEluZXhhY3QgUm91bmRlZAoreGNvbTQ2NSBjb21wYXJlIDkyMTYzOTMzMi5FLTkxNzU0Mjk2MyAyODczMjUuODkxIC0+IC0xCit4ZGl2NDY1IGRpdmlkZSA5MjE2MzkzMzIuRS05MTc1NDI5NjMgMjg3MzI1Ljg5MSAtPiAzLjIwNzY0NDU2RS05MTc1NDI5NjAgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDY1IGRpdmlkZWludCA5MjE2MzkzMzIuRS05MTc1NDI5NjMgMjg3MzI1Ljg5MSAtPiAwCit4bXVsNDY1IG11bHRpcGx5IDkyMTYzOTMzMi5FLTkxNzU0Mjk2MyAyODczMjUuODkxIC0+IDIuNjQ4MTA4NDJFLTkxNzU0Mjk0OSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NjUgcG93ZXIgOTIxNjM5MzMyLkUtOTE3NTQyOTYzIDI4NzMyNiAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00NjUgcmVtYWluZGVyIDkyMTYzOTMzMi5FLTkxNzU0Mjk2MyAyODczMjUuODkxIC0+IDkuMjE2MzkzMzJFLTkxNzU0Mjk1NQoreHN1YjQ2NSBzdWJ0cmFjdCA5MjE2MzkzMzIuRS05MTc1NDI5NjMgMjg3MzI1Ljg5MSAtPiAtMjg3MzI1Ljg5MSBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjYgYWRkIDkxMDk1OTE2LjhFLTc4NzMxMjk2OSAtNTg2NDMuNDE4RSs1ODE4OTg4MCAtPiAtNS44NjQzNDE4MEUrNTgxODk4ODQgSW5leGFjdCBSb3VuZGVkCit4Y29tNDY2IGNvbXBhcmUgOTEwOTU5MTYuOEUtNzg3MzEyOTY5IC01ODY0My40MThFKzU4MTg5ODgwIC0+IDEKK3hkaXY0NjYgZGl2aWRlIDkxMDk1OTE2LjhFLTc4NzMxMjk2OSAtNTg2NDMuNDE4RSs1ODE4OTg4MCAtPiAtMS41NTMzODY4OUUtODQ1NTAyODQ2IEluZXhhY3QgUm91bmRlZAoreGR2aTQ2NiBkaXZpZGVpbnQgOTEwOTU5MTYuOEUtNzg3MzEyOTY5IC01ODY0My40MThFKzU4MTg5ODgwIC0+IC0wCit4bXVsNDY2IG11bHRpcGx5IDkxMDk1OTE2LjhFLTc4NzMxMjk2OSAtNTg2NDMuNDE4RSs1ODE4OTg4MCAtPiAtNS4zNDIxNzU5M0UtNzI5MTIzMDc3IEluZXhhY3QgUm91bmRlZAoreHBvdzQ2NiBwb3dlciA5MTA5NTkxNi44RS03ODczMTI5NjkgLTYgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDY2IHJlbWFpbmRlciA5MTA5NTkxNi44RS03ODczMTI5NjkgLTU4NjQzLjQxOEUrNTgxODk4ODAgLT4gOS4xMDk1OTE2OEUtNzg3MzEyOTYyCit4c3ViNDY2IHN1YnRyYWN0IDkxMDk1OTE2LjhFLTc4NzMxMjk2OSAtNTg2NDMuNDE4RSs1ODE4OTg4MCAtPiA1Ljg2NDM0MTgwRSs1ODE4OTg4NCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjcgYWRkIC02NDEwLjU1NTUgLTIzNDk2NDI1OSAtPiAtMjM0OTcwNjcwIEluZXhhY3QgUm91bmRlZAoreGNvbTQ2NyBjb21wYXJlIC02NDEwLjU1NTUgLTIzNDk2NDI1OSAtPiAxCit4ZGl2NDY3IGRpdmlkZSAtNjQxMC41NTU1IC0yMzQ5NjQyNTkgLT4gMC4wMDAwMjcyODMxMDkwIEluZXhhY3QgUm91bmRlZAoreGR2aTQ2NyBkaXZpZGVpbnQgLTY0MTAuNTU1NSAtMjM0OTY0MjU5IC0+IDAKK3htdWw0NjcgbXVsdGlwbHkgLTY0MTAuNTU1NSAtMjM0OTY0MjU5IC0+IDEuNTA2MjUxNDJFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzQ2NyBwb3dlciAtNjQxMC41NTU1IC0yMzQ5NjQyNTkgLT4gLTEuMjcwNjQ0NjdFLTg5NDQ4NDQxOSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NjcgcmVtYWluZGVyIC02NDEwLjU1NTUgLTIzNDk2NDI1OSAtPiAtNjQxMC41NTU1Cit4c3ViNDY3IHN1YnRyYWN0IC02NDEwLjU1NTUgLTIzNDk2NDI1OSAtPiAyMzQ5NTc4NDggSW5leGFjdCBSb3VuZGVkCit4YWRkNDY4IGFkZCAtNS4zMjcxMTYwNiAtODQ0NzI4Ni4yMSAtPiAtODQ0NzI5MS41NCBJbmV4YWN0IFJvdW5kZWQKK3hjb200NjggY29tcGFyZSAtNS4zMjcxMTYwNiAtODQ0NzI4Ni4yMSAtPiAxCit4ZGl2NDY4IGRpdmlkZSAtNS4zMjcxMTYwNiAtODQ0NzI4Ni4yMSAtPiA2LjMwNjMwNDY4RS03IEluZXhhY3QgUm91bmRlZAoreGR2aTQ2OCBkaXZpZGVpbnQgLTUuMzI3MTE2MDYgLTg0NDcyODYuMjEgLT4gMAoreG11bDQ2OCBtdWx0aXBseSAtNS4zMjcxMTYwNiAtODQ0NzI4Ni4yMSAtPiA0NDk5OTY3NC4wIEluZXhhY3QgUm91bmRlZAoreHBvdzQ2OCBwb3dlciAtNS4zMjcxMTYwNiAtODQ0NzI4NiAtPiA5LjA5MTM4NzI4RS02MTM2ODg4IEluZXhhY3QgUm91bmRlZAoreHJlbTQ2OCByZW1haW5kZXIgLTUuMzI3MTE2MDYgLTg0NDcyODYuMjEgLT4gLTUuMzI3MTE2MDYKK3hzdWI0Njggc3VidHJhY3QgLTUuMzI3MTE2MDYgLTg0NDcyODYuMjEgLT4gODQ0NzI4MC44OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NjkgYWRkIC04MjI3MjE3MS44IC03NzYuMjM4NTg3RS0zNzI2OTA0MTYgLT4gLTgyMjcyMTcxLjggSW5leGFjdCBSb3VuZGVkCit4Y29tNDY5IGNvbXBhcmUgLTgyMjcyMTcxLjggLTc3Ni4yMzg1ODdFLTM3MjY5MDQxNiAtPiAtMQoreGRpdjQ2OSBkaXZpZGUgLTgyMjcyMTcxLjggLTc3Ni4yMzg1ODdFLTM3MjY5MDQxNiAtPiAxLjA1OTg4MjUzRSszNzI2OTA0MjEgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDY5IGRpdmlkZWludCAtODIyNzIxNzEuOCAtNzc2LjIzODU4N0UtMzcyNjkwNDE2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDY5IG11bHRpcGx5IC04MjI3MjE3MS44IC03NzYuMjM4NTg3RS0zNzI2OTA0MTYgLT4gNi4zODYyODM0NEUtMzcyNjkwNDA2IEluZXhhY3QgUm91bmRlZAoreHBvdzQ2OSBwb3dlciAtODIyNzIxNzEuOCAtOCAtPiA0Ljc2NDA0OTk0RS02NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NjkgcmVtYWluZGVyIC04MjI3MjE3MS44IC03NzYuMjM4NTg3RS0zNzI2OTA0MTYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0Njkgc3VidHJhY3QgLTgyMjcyMTcxLjggLTc3Ni4yMzg1ODdFLTM3MjY5MDQxNiAtPiAtODIyNzIxNzEuOCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NzAgYWRkIDQxMjQxMTI0NC5FLTc3NDMzOTI2NCA4NjY0NTIuNDY1IC0+IDg2NjQ1Mi40NjUgSW5leGFjdCBSb3VuZGVkCit4Y29tNDcwIGNvbXBhcmUgNDEyNDExMjQ0LkUtNzc0MzM5MjY0IDg2NjQ1Mi40NjUgLT4gLTEKK3hkaXY0NzAgZGl2aWRlIDQxMjQxMTI0NC5FLTc3NDMzOTI2NCA4NjY0NTIuNDY1IC0+IDQuNzU5NzY3NjhFLTc3NDMzOTI2MiBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NzAgZGl2aWRlaW50IDQxMjQxMTI0NC5FLTc3NDMzOTI2NCA4NjY0NTIuNDY1IC0+IDAKK3htdWw0NzAgbXVsdGlwbHkgNDEyNDExMjQ0LkUtNzc0MzM5MjY0IDg2NjQ1Mi40NjUgLT4gMy41NzMzNDczOUUtNzc0MzM5MjUwIEluZXhhY3QgUm91bmRlZAoreHBvdzQ3MCBwb3dlciA0MTI0MTEyNDQuRS03NzQzMzkyNjQgODY2NDUyIC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ3MCByZW1haW5kZXIgNDEyNDExMjQ0LkUtNzc0MzM5MjY0IDg2NjQ1Mi40NjUgLT4gNC4xMjQxMTI0NEUtNzc0MzM5MjU2Cit4c3ViNDcwIHN1YnRyYWN0IDQxMjQxMTI0NC5FLTc3NDMzOTI2NCA4NjY0NTIuNDY1IC0+IC04NjY0NTIuNDY1IEluZXhhY3QgUm91bmRlZAoreGFkZDQ3MSBhZGQgLTEwMy40NzQ1OTggLTMuMDE2NjA2NjFFLTQ0NjY2MTI1NyAtPiAtMTAzLjQ3NDU5OCBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzEgY29tcGFyZSAtMTAzLjQ3NDU5OCAtMy4wMTY2MDY2MUUtNDQ2NjYxMjU3IC0+IC0xCit4ZGl2NDcxIGRpdmlkZSAtMTAzLjQ3NDU5OCAtMy4wMTY2MDY2MUUtNDQ2NjYxMjU3IC0+IDMuNDMwMTY1NDZFKzQ0NjY2MTI1OCBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0NzEgZGl2aWRlaW50IC0xMDMuNDc0NTk4IC0zLjAxNjYwNjYxRS00NDY2NjEyNTcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NzEgbXVsdGlwbHkgLTEwMy40NzQ1OTggLTMuMDE2NjA2NjFFLTQ0NjY2MTI1NyAtPiAzLjEyMTQyMTU2RS00NDY2NjEyNTUgSW5leGFjdCBSb3VuZGVkCit4cG93NDcxIHBvd2VyIC0xMDMuNDc0NTk4IC0zIC0+IC05LjAyNjA3MTIzRS03IEluZXhhY3QgUm91bmRlZAoreHJlbTQ3MSByZW1haW5kZXIgLTEwMy40NzQ1OTggLTMuMDE2NjA2NjFFLTQ0NjY2MTI1NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ3MSBzdWJ0cmFjdCAtMTAzLjQ3NDU5OCAtMy4wMTY2MDY2MUUtNDQ2NjYxMjU3IC0+IC0xMDMuNDc0NTk4IEluZXhhY3QgUm91bmRlZAoreGFkZDQ3MiBhZGQgLTMxMDI3LjgzMjMgLTQ3NTM3ODE4Ni4gLT4gLTQ3NTQwOTIxNCBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzIgY29tcGFyZSAtMzEwMjcuODMyMyAtNDc1Mzc4MTg2LiAtPiAxCit4ZGl2NDcyIGRpdmlkZSAtMzEwMjcuODMyMyAtNDc1Mzc4MTg2LiAtPiAwLjAwMDA2NTI2OTc4NTYgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDcyIGRpdmlkZWludCAtMzEwMjcuODMyMyAtNDc1Mzc4MTg2LiAtPiAwCit4bXVsNDcyIG11bHRpcGx5IC0zMTAyNy44MzIzIC00NzUzNzgxODYuIC0+IDEuNDc0OTk1NDZFKzEzIEluZXhhY3QgUm91bmRlZAoreHBvdzQ3MiBwb3dlciAtMzEwMjcuODMyMyAtNDc1Mzc4MTg2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ3MiByZW1haW5kZXIgLTMxMDI3LjgzMjMgLTQ3NTM3ODE4Ni4gLT4gLTMxMDI3LjgzMjMKK3hzdWI0NzIgc3VidHJhY3QgLTMxMDI3LjgzMjMgLTQ3NTM3ODE4Ni4gLT4gNDc1MzQ3MTU4IEluZXhhY3QgUm91bmRlZAoreGFkZDQ3MyBhZGQgLTExOTkzMzkuNzIgLTUuNzMwNjgzOTJFKzUzNzc0NjMyIC0+IC01LjczMDY4MzkyRSs1Mzc3NDYzMiBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzMgY29tcGFyZSAtMTE5OTMzOS43MiAtNS43MzA2ODM5MkUrNTM3NzQ2MzIgLT4gMQoreGRpdjQ3MyBkaXZpZGUgLTExOTkzMzkuNzIgLTUuNzMwNjgzOTJFKzUzNzc0NjMyIC0+IDIuMDkyODM4NzJFLTUzNzc0NjI3IEluZXhhY3QgUm91bmRlZAoreGR2aTQ3MyBkaXZpZGVpbnQgLTExOTkzMzkuNzIgLTUuNzMwNjgzOTJFKzUzNzc0NjMyIC0+IDAKK3htdWw0NzMgbXVsdGlwbHkgLTExOTkzMzkuNzIgLTUuNzMwNjgzOTJFKzUzNzc0NjMyIC0+IDYuODczMDM2ODVFKzUzNzc0NjM4IEluZXhhY3QgUm91bmRlZAoreHBvdzQ3MyBwb3dlciAtMTE5OTMzOS43MiAtNiAtPiAzLjM2MDA1NzQxRS0zNyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NzMgcmVtYWluZGVyIC0xMTk5MzM5LjcyIC01LjczMDY4MzkyRSs1Mzc3NDYzMiAtPiAtMTE5OTMzOS43MgoreHN1YjQ3MyBzdWJ0cmFjdCAtMTE5OTMzOS43MiAtNS43MzA2ODM5MkUrNTM3NzQ2MzIgLT4gNS43MzA2ODM5MkUrNTM3NzQ2MzIgSW5leGFjdCBSb3VuZGVkCit4YWRkNDc0IGFkZCAtNzMyOTA4LjkzMEUrMzY0MzQ1NDMzIC0zNDg2MTQ2LjI2IC0+IC03LjMyOTA4OTMwRSszNjQzNDU0MzggSW5leGFjdCBSb3VuZGVkCit4Y29tNDc0IGNvbXBhcmUgLTczMjkwOC45MzBFKzM2NDM0NTQzMyAtMzQ4NjE0Ni4yNiAtPiAtMQoreGRpdjQ3NCBkaXZpZGUgLTczMjkwOC45MzBFKzM2NDM0NTQzMyAtMzQ4NjE0Ni4yNiAtPiAyLjEwMjM0NzA1RSszNjQzNDU0MzIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDc0IGRpdmlkZWludCAtNzMyOTA4LjkzMEUrMzY0MzQ1NDMzIC0zNDg2MTQ2LjI2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDc0IG11bHRpcGx5IC03MzI5MDguOTMwRSszNjQzNDU0MzMgLTM0ODYxNDYuMjYgLT4gMi41NTUwMjc3M0UrMzY0MzQ1NDQ1IEluZXhhY3QgUm91bmRlZAoreHBvdzQ3NCBwb3dlciAtNzMyOTA4LjkzMEUrMzY0MzQ1NDMzIC0zNDg2MTQ2IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ3NCByZW1haW5kZXIgLTczMjkwOC45MzBFKzM2NDM0NTQzMyAtMzQ4NjE0Ni4yNiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ3NCBzdWJ0cmFjdCAtNzMyOTA4LjkzMEUrMzY0MzQ1NDMzIC0zNDg2MTQ2LjI2IC0+IC03LjMyOTA4OTMwRSszNjQzNDU0MzggSW5leGFjdCBSb3VuZGVkCit4YWRkNDc1IGFkZCAtMjM3NjE1MC44MyAtNDY3Nzc1ODMuMyAtPiAtNDkxNTM3MzQuMSBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzUgY29tcGFyZSAtMjM3NjE1MC44MyAtNDY3Nzc1ODMuMyAtPiAxCit4ZGl2NDc1IGRpdmlkZSAtMjM3NjE1MC44MyAtNDY3Nzc1ODMuMyAtPiAwLjA1MDc5Njc4NDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDc1IGRpdmlkZWludCAtMjM3NjE1MC44MyAtNDY3Nzc1ODMuMyAtPiAwCit4bXVsNDc1IG11bHRpcGx5IC0yMzc2MTUwLjgzIC00Njc3NzU4My4zIC0+IDEuMTExNTA1OTNFKzE0IEluZXhhY3QgUm91bmRlZAoreHBvdzQ3NSBwb3dlciAtMjM3NjE1MC44MyAtNDY3Nzc1ODMgLT4gLTMuNTE4ODYxOTNFLTI5ODI0Nzk3NiBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NzUgcmVtYWluZGVyIC0yMzc2MTUwLjgzIC00Njc3NzU4My4zIC0+IC0yMzc2MTUwLjgzCit4c3ViNDc1IHN1YnRyYWN0IC0yMzc2MTUwLjgzIC00Njc3NzU4My4zIC0+IDQ0NDAxNDMyLjUgSW5leGFjdCBSb3VuZGVkCit4YWRkNDc2IGFkZCA2LjM2NjQyMTEgLTE0MDg1NDkwOC4gLT4gLTE0MDg1NDkwMiBJbmV4YWN0IFJvdW5kZWQKK3hjb200NzYgY29tcGFyZSA2LjM2NjQyMTEgLTE0MDg1NDkwOC4gLT4gMQoreGRpdjQ3NiBkaXZpZGUgNi4zNjY0MjExIC0xNDA4NTQ5MDguIC0+IC00LjUxOTg0MzI4RS04IEluZXhhY3QgUm91bmRlZAoreGR2aTQ3NiBkaXZpZGVpbnQgNi4zNjY0MjExIC0xNDA4NTQ5MDguIC0+IC0wCit4bXVsNDc2IG11bHRpcGx5IDYuMzY2NDIxMSAtMTQwODU0OTA4LiAtPiAtODk2NzQxNjU4IEluZXhhY3QgUm91bmRlZAoreHBvdzQ3NiBwb3dlciA2LjM2NjQyMTEgLTE0MDg1NDkwOCAtPiA3LjI1NDMyODAzRS0xMTMyMzI2MDggSW5leGFjdCBSb3VuZGVkCit4cmVtNDc2IHJlbWFpbmRlciA2LjM2NjQyMTEgLTE0MDg1NDkwOC4gLT4gNi4zNjY0MjExCit4c3ViNDc2IHN1YnRyYWN0IDYuMzY2NDIxMSAtMTQwODU0OTA4LiAtPiAxNDA4NTQ5MTQgSW5leGFjdCBSb3VuZGVkCit4YWRkNDc3IGFkZCAtMTUuNzkxNTIyIDE5MDIuMzAyMTBFKzkwNzQxODQ0IC0+IDEuOTAyMzAyMTBFKzkwNzQxODQ3IEluZXhhY3QgUm91bmRlZAoreGNvbTQ3NyBjb21wYXJlIC0xNS43OTE1MjIgMTkwMi4zMDIxMEUrOTA3NDE4NDQgLT4gLTEKK3hkaXY0NzcgZGl2aWRlIC0xNS43OTE1MjIgMTkwMi4zMDIxMEUrOTA3NDE4NDQgLT4gLTguMzAxMjY5MjlFLTkwNzQxODQ3IEluZXhhY3QgUm91bmRlZAoreGR2aTQ3NyBkaXZpZGVpbnQgLTE1Ljc5MTUyMiAxOTAyLjMwMjEwRSs5MDc0MTg0NCAtPiAtMAoreG11bDQ3NyBtdWx0aXBseSAtMTUuNzkxNTIyIDE5MDIuMzAyMTBFKzkwNzQxODQ0IC0+IC0zLjAwNDAyNDU1RSs5MDc0MTg0OCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0NzcgcG93ZXIgLTE1Ljc5MTUyMiAyIC0+IDI0OS4zNzIxNjcgSW5leGFjdCBSb3VuZGVkCit4cmVtNDc3IHJlbWFpbmRlciAtMTUuNzkxNTIyIDE5MDIuMzAyMTBFKzkwNzQxODQ0IC0+IC0xNS43OTE1MjIKK3hzdWI0Nzcgc3VidHJhY3QgLTE1Ljc5MTUyMiAxOTAyLjMwMjEwRSs5MDc0MTg0NCAtPiAtMS45MDIzMDIxMEUrOTA3NDE4NDcgSW5leGFjdCBSb3VuZGVkCit4YWRkNDc4IGFkZCAxNTM1Ni4xNTA1RSszNzM5NTA0MjkgMi44ODAyMDQwMCAtPiAxLjUzNTYxNTA1RSszNzM5NTA0MzMgSW5leGFjdCBSb3VuZGVkCit4Y29tNDc4IGNvbXBhcmUgMTUzNTYuMTUwNUUrMzczOTUwNDI5IDIuODgwMjA0MDAgLT4gMQoreGRpdjQ3OCBkaXZpZGUgMTUzNTYuMTUwNUUrMzczOTUwNDI5IDIuODgwMjA0MDAgLT4gNS4zMzE2MTkwNUUrMzczOTUwNDMyIEluZXhhY3QgUm91bmRlZAoreGR2aTQ3OCBkaXZpZGVpbnQgMTUzNTYuMTUwNUUrMzczOTUwNDI5IDIuODgwMjA0MDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NzggbXVsdGlwbHkgMTUzNTYuMTUwNUUrMzczOTUwNDI5IDIuODgwMjA0MDAgLT4gNC40MjI4ODQ2MUUrMzczOTUwNDMzIEluZXhhY3QgUm91bmRlZAoreHBvdzQ3OCBwb3dlciAxNTM1Ni4xNTA1RSszNzM5NTA0MjkgMyAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3hyZW00NzggcmVtYWluZGVyIDE1MzU2LjE1MDVFKzM3Mzk1MDQyOSAyLjg4MDIwNDAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDc4IHN1YnRyYWN0IDE1MzU2LjE1MDVFKzM3Mzk1MDQyOSAyLjg4MDIwNDAwIC0+IDEuNTM1NjE1MDVFKzM3Mzk1MDQzMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0NzkgYWRkIC0zLjEyMDAxMzI2RSszMTg4ODQ3NjIgOTU2Ny4yMTU5NSAtPiAtMy4xMjAwMTMyNkUrMzE4ODg0NzYyIEluZXhhY3QgUm91bmRlZAoreGNvbTQ3OSBjb21wYXJlIC0zLjEyMDAxMzI2RSszMTg4ODQ3NjIgOTU2Ny4yMTU5NSAtPiAtMQoreGRpdjQ3OSBkaXZpZGUgLTMuMTIwMDEzMjZFKzMxODg4NDc2MiA5NTY3LjIxNTk1IC0+IC0zLjI2MTE1MDY2RSszMTg4ODQ3NTggSW5leGFjdCBSb3VuZGVkCit4ZHZpNDc5IGRpdmlkZWludCAtMy4xMjAwMTMyNkUrMzE4ODg0NzYyIDk1NjcuMjE1OTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0NzkgbXVsdGlwbHkgLTMuMTIwMDEzMjZFKzMxODg4NDc2MiA5NTY3LjIxNTk1IC0+IC0yLjk4NDk4NDA2RSszMTg4ODQ3NjYgSW5leGFjdCBSb3VuZGVkCit4cG93NDc5IHBvd2VyIC0zLjEyMDAxMzI2RSszMTg4ODQ3NjIgOTU2NyAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDc5IHJlbWFpbmRlciAtMy4xMjAwMTMyNkUrMzE4ODg0NzYyIDk1NjcuMjE1OTUgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0Nzkgc3VidHJhY3QgLTMuMTIwMDEzMjZFKzMxODg4NDc2MiA5NTY3LjIxNTk1IC0+IC0zLjEyMDAxMzI2RSszMTg4ODQ3NjIgSW5leGFjdCBSb3VuZGVkCit4YWRkNDgwIGFkZCA0OTQzNi42NTI4IDc1MS45MTk1MTcgLT4gNTAxODguNTcyMyBJbmV4YWN0IFJvdW5kZWQKK3hjb200ODAgY29tcGFyZSA0OTQzNi42NTI4IDc1MS45MTk1MTcgLT4gMQoreGRpdjQ4MCBkaXZpZGUgNDk0MzYuNjUyOCA3NTEuOTE5NTE3IC0+IDY1Ljc0NzI2NjQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDgwIGRpdmlkZWludCA0OTQzNi42NTI4IDc1MS45MTk1MTcgLT4gNjUKK3htdWw0ODAgbXVsdGlwbHkgNDk0MzYuNjUyOCA3NTEuOTE5NTE3IC0+IDM3MTcyMzg0LjEgSW5leGFjdCBSb3VuZGVkCit4cG93NDgwIHBvd2VyIDQ5NDM2LjY1MjggNzUyIC0+IDguNDExODU3MThFKzM1MjkgSW5leGFjdCBSb3VuZGVkCit4cmVtNDgwIHJlbWFpbmRlciA0OTQzNi42NTI4IDc1MS45MTk1MTcgLT4gNTYxLjg4NDE5NQoreHN1YjQ4MCBzdWJ0cmFjdCA0OTQzNi42NTI4IDc1MS45MTk1MTcgLT4gNDg2ODQuNzMzMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODEgYWRkIDU1Mi42Njk0NTMgOC4zNzI1NzYwRSsxNjIyMzUyNiAtPiA4LjM3MjU3NjAwRSsxNjIyMzUyNiBJbmV4YWN0IFJvdW5kZWQKK3hjb200ODEgY29tcGFyZSA1NTIuNjY5NDUzIDguMzcyNTc2MEUrMTYyMjM1MjYgLT4gLTEKK3hkaXY0ODEgZGl2aWRlIDU1Mi42Njk0NTMgOC4zNzI1NzYwRSsxNjIyMzUyNiAtPiA2LjYwMDk0ODc4RS0xNjIyMzUyNSBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0ODEgZGl2aWRlaW50IDU1Mi42Njk0NTMgOC4zNzI1NzYwRSsxNjIyMzUyNiAtPiAwCit4bXVsNDgxIG11bHRpcGx5IDU1Mi42Njk0NTMgOC4zNzI1NzYwRSsxNjIyMzUyNiAtPiA0LjYyNzI2NzAwRSsxNjIyMzUyOSBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODEgcG93ZXIgNTUyLjY2OTQ1MyA4IC0+IDguNzA0MDk2MzJFKzIxIEluZXhhY3QgUm91bmRlZAoreHJlbTQ4MSByZW1haW5kZXIgNTUyLjY2OTQ1MyA4LjM3MjU3NjBFKzE2MjIzNTI2IC0+IDU1Mi42Njk0NTMKK3hzdWI0ODEgc3VidHJhY3QgNTUyLjY2OTQ1MyA4LjM3MjU3NjBFKzE2MjIzNTI2IC0+IC04LjM3MjU3NjAwRSsxNjIyMzUyNiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODIgYWRkIC0zMjY2MzAzIDQ1Mzc0MS41MjAgLT4gLTI4MTI1NjEuNDggUm91bmRlZAoreGNvbTQ4MiBjb21wYXJlIC0zMjY2MzAzIDQ1Mzc0MS41MjAgLT4gLTEKK3hkaXY0ODIgZGl2aWRlIC0zMjY2MzAzIDQ1Mzc0MS41MjAgLT4gLTcuMTk4NTk4NDQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDgyIGRpdmlkZWludCAtMzI2NjMwMyA0NTM3NDEuNTIwIC0+IC03Cit4bXVsNDgyIG11bHRpcGx5IC0zMjY2MzAzIDQ1Mzc0MS41MjAgLT4gLTEuNDgyMDU3MjlFKzEyIEluZXhhY3QgUm91bmRlZAoreHBvdzQ4MiBwb3dlciAtMzI2NjMwMyA0NTM3NDIgLT4gMS4wMjQ5NzMxNUUrMjk1NTcwMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00ODIgcmVtYWluZGVyIC0zMjY2MzAzIDQ1Mzc0MS41MjAgLT4gLTkwMTEyLjM2MAoreHN1YjQ4MiBzdWJ0cmFjdCAtMzI2NjMwMyA0NTM3NDEuNTIwIC0+IC0zNzIwMDQ0LjUyIFJvdW5kZWQKK3hhZGQ0ODMgYWRkIDEyMzAyNzU3LjQgNTQyOTIyLjQ4N0UrNDE0NDQzMzUzIC0+IDUuNDI5MjI0ODdFKzQxNDQ0MzM1OCBJbmV4YWN0IFJvdW5kZWQKK3hjb200ODMgY29tcGFyZSAxMjMwMjc1Ny40IDU0MjkyMi40ODdFKzQxNDQ0MzM1MyAtPiAtMQoreGRpdjQ4MyBkaXZpZGUgMTIzMDI3NTcuNCA1NDI5MjIuNDg3RSs0MTQ0NDMzNTMgLT4gMi4yNjYwMjQ2NUUtNDE0NDQzMzUyIEluZXhhY3QgUm91bmRlZAoreGR2aTQ4MyBkaXZpZGVpbnQgMTIzMDI3NTcuNCA1NDI5MjIuNDg3RSs0MTQ0NDMzNTMgLT4gMAoreG11bDQ4MyBtdWx0aXBseSAxMjMwMjc1Ny40IDU0MjkyMi40ODdFKzQxNDQ0MzM1MyAtPiA2LjY3OTQ0MzY0RSs0MTQ0NDMzNjUgSW5leGFjdCBSb3VuZGVkCit4cG93NDgzIHBvd2VyIDEyMzAyNzU3LjQgNSAtPiAyLjgxODQ2Mjc2RSszNSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00ODMgcmVtYWluZGVyIDEyMzAyNzU3LjQgNTQyOTIyLjQ4N0UrNDE0NDQzMzUzIC0+IDEyMzAyNzU3LjQKK3hzdWI0ODMgc3VidHJhY3QgMTIzMDI3NTcuNCA1NDI5MjIuNDg3RSs0MTQ0NDMzNTMgLT4gLTUuNDI5MjI0ODdFKzQxNDQ0MzM1OCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODQgYWRkIC01NjcwNzU3Ljc5RS03ODQ3NTQ5ODQgMTI4MTQ0LjUwMyAtPiAxMjgxNDQuNTAzIEluZXhhY3QgUm91bmRlZAoreGNvbTQ4NCBjb21wYXJlIC01NjcwNzU3Ljc5RS03ODQ3NTQ5ODQgMTI4MTQ0LjUwMyAtPiAtMQoreGRpdjQ4NCBkaXZpZGUgLTU2NzA3NTcuNzlFLTc4NDc1NDk4NCAxMjgxNDQuNTAzIC0+IC00LjQyNTI4MzY5RS03ODQ3NTQ5ODMgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDg0IGRpdmlkZWludCAtNTY3MDc1Ny43OUUtNzg0NzU0OTg0IDEyODE0NC41MDMgLT4gLTAKK3htdWw0ODQgbXVsdGlwbHkgLTU2NzA3NTcuNzlFLTc4NDc1NDk4NCAxMjgxNDQuNTAzIC0+IC03LjI2Njc2NDM5RS03ODQ3NTQ5NzMgSW5leGFjdCBSb3VuZGVkCit4cG93NDg0IHBvd2VyIC01NjcwNzU3Ljc5RS03ODQ3NTQ5ODQgMTI4MTQ1IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00ODQgcmVtYWluZGVyIC01NjcwNzU3Ljc5RS03ODQ3NTQ5ODQgMTI4MTQ0LjUwMyAtPiAtNS42NzA3NTc3OUUtNzg0NzU0OTc4Cit4c3ViNDg0IHN1YnRyYWN0IC01NjcwNzU3Ljc5RS03ODQ3NTQ5ODQgMTI4MTQ0LjUwMyAtPiAtMTI4MTQ0LjUwMyBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0ODUgYWRkIDIyLjc3MjE5NjhFKzg0MjUzMDY5OCA1MjIzLjcwNDYyIC0+IDIuMjc3MjE5NjhFKzg0MjUzMDY5OSBJbmV4YWN0IFJvdW5kZWQKK3hjb200ODUgY29tcGFyZSAyMi43NzIxOTY4RSs4NDI1MzA2OTggNTIyMy43MDQ2MiAtPiAxCit4ZGl2NDg1IGRpdmlkZSAyMi43NzIxOTY4RSs4NDI1MzA2OTggNTIyMy43MDQ2MiAtPiA0LjM1OTM5NTk2RSs4NDI1MzA2OTUgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDg1IGRpdmlkZWludCAyMi43NzIxOTY4RSs4NDI1MzA2OTggNTIyMy43MDQ2MiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ4NSBtdWx0aXBseSAyMi43NzIxOTY4RSs4NDI1MzA2OTggNTIyMy43MDQ2MiAtPiAxLjE4OTU1MjMwRSs4NDI1MzA3MDMgSW5leGFjdCBSb3VuZGVkCit4cG93NDg1IHBvd2VyIDIyLjc3MjE5NjhFKzg0MjUzMDY5OCA1MjI0IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTQ4NSByZW1haW5kZXIgMjIuNzcyMTk2OEUrODQyNTMwNjk4IDUyMjMuNzA0NjIgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0ODUgc3VidHJhY3QgMjIuNzcyMTk2OEUrODQyNTMwNjk4IDUyMjMuNzA0NjIgLT4gMi4yNzcyMTk2OEUrODQyNTMwNjk5IEluZXhhY3QgUm91bmRlZAoreGFkZDQ4NiBhZGQgODguNTE1ODE5OUUtOTgwMTY0MzU3IDMyNTg0NjExNiAtPiAzMjU4NDYxMTYgSW5leGFjdCBSb3VuZGVkCit4Y29tNDg2IGNvbXBhcmUgODguNTE1ODE5OUUtOTgwMTY0MzU3IDMyNTg0NjExNiAtPiAtMQoreGRpdjQ4NiBkaXZpZGUgODguNTE1ODE5OUUtOTgwMTY0MzU3IDMyNTg0NjExNiAtPiAyLjcxNjQ5MTQ4RS05ODAxNjQzNjQgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDg2IGRpdmlkZWludCA4OC41MTU4MTk5RS05ODAxNjQzNTcgMzI1ODQ2MTE2IC0+IDAKK3htdWw0ODYgbXVsdGlwbHkgODguNTE1ODE5OUUtOTgwMTY0MzU3IDMyNTg0NjExNiAtPiAyLjg4NDI1MzYxRS05ODAxNjQzNDcgSW5leGFjdCBSb3VuZGVkCit4cG93NDg2IHBvd2VyIDg4LjUxNTgxOTlFLTk4MDE2NDM1NyAzMjU4NDYxMTYgLT4gMEUtMTAwMDAwMDAwNyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCit4cmVtNDg2IHJlbWFpbmRlciA4OC41MTU4MTk5RS05ODAxNjQzNTcgMzI1ODQ2MTE2IC0+IDguODUxNTgxOTlFLTk4MDE2NDM1NgoreHN1YjQ4NiBzdWJ0cmFjdCA4OC41MTU4MTk5RS05ODAxNjQzNTcgMzI1ODQ2MTE2IC0+IC0zMjU4NDYxMTYgSW5leGFjdCBSb3VuZGVkCit4YWRkNDg3IGFkZCAtMjI4ODEuMDQwOCA1LjYzNjYxNTYyIC0+IC0yMjg3NS40MDQyIEluZXhhY3QgUm91bmRlZAoreGNvbTQ4NyBjb21wYXJlIC0yMjg4MS4wNDA4IDUuNjM2NjE1NjIgLT4gLTEKK3hkaXY0ODcgZGl2aWRlIC0yMjg4MS4wNDA4IDUuNjM2NjE1NjIgLT4gLTQwNTkuMzU4MDIgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDg3IGRpdmlkZWludCAtMjI4ODEuMDQwOCA1LjYzNjYxNTYyIC0+IC00MDU5Cit4bXVsNDg3IG11bHRpcGx5IC0yMjg4MS4wNDA4IDUuNjM2NjE1NjIgLT4gLTEyODk3MS42MzIgSW5leGFjdCBSb3VuZGVkCit4cG93NDg3IHBvd2VyIC0yMjg4MS4wNDA4IDYgLT4gMS40MzUwMDkwOUUrMjYgSW5leGFjdCBSb3VuZGVkCit4cmVtNDg3IHJlbWFpbmRlciAtMjI4ODEuMDQwOCA1LjYzNjYxNTYyIC0+IC0yLjAxNzk5ODQyCit4c3ViNDg3IHN1YnRyYWN0IC0yMjg4MS4wNDA4IDUuNjM2NjE1NjIgLT4gLTIyODg2LjY3NzQgSW5leGFjdCBSb3VuZGVkCit4YWRkNDg4IGFkZCAtNzE1Ny41NzQ0OSAtNzYuNDQ1NTUxOUUtODU2NDcwNDcgLT4gLTcxNTcuNTc0NDkgSW5leGFjdCBSb3VuZGVkCit4Y29tNDg4IGNvbXBhcmUgLTcxNTcuNTc0NDkgLTc2LjQ0NTU1MTlFLTg1NjQ3MDQ3IC0+IC0xCit4ZGl2NDg4IGRpdmlkZSAtNzE1Ny41NzQ0OSAtNzYuNDQ1NTUxOUUtODU2NDcwNDcgLT4gOS4zNjI5NzA1MkUrODU2NDcwNDggSW5leGFjdCBSb3VuZGVkCit4ZHZpNDg4IGRpdmlkZWludCAtNzE1Ny41NzQ0OSAtNzYuNDQ1NTUxOUUtODU2NDcwNDcgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0ODggbXVsdGlwbHkgLTcxNTcuNTc0NDkgLTc2LjQ0NTU1MTlFLTg1NjQ3MDQ3IC0+IDUuNDcxNjQ3MzJFLTg1NjQ3MDQyIEluZXhhY3QgUm91bmRlZAoreHBvdzQ4OCBwb3dlciAtNzE1Ny41NzQ0OSAtOCAtPiAxLjQ1MTY4NzAwRS0zMSBJbmV4YWN0IFJvdW5kZWQKK3hyZW00ODggcmVtYWluZGVyIC03MTU3LjU3NDQ5IC03Ni40NDU1NTE5RS04NTY0NzA0NyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ4OCBzdWJ0cmFjdCAtNzE1Ny41NzQ0OSAtNzYuNDQ1NTUxOUUtODU2NDcwNDcgLT4gLTcxNTcuNTc0NDkgSW5leGFjdCBSb3VuZGVkCit4YWRkNDg5IGFkZCAtNTAzMTEzLjgwMSAtOTcxNTE0OS44MkUtNjEyMTg0NDIyIC0+IC01MDMxMTMuODAxIEluZXhhY3QgUm91bmRlZAoreGNvbTQ4OSBjb21wYXJlIC01MDMxMTMuODAxIC05NzE1MTQ5LjgyRS02MTIxODQ0MjIgLT4gLTEKK3hkaXY0ODkgZGl2aWRlIC01MDMxMTMuODAxIC05NzE1MTQ5LjgyRS02MTIxODQ0MjIgLT4gNS4xNzg2NTIwMUUrNjEyMTg0NDIwIEluZXhhY3QgUm91bmRlZAoreGR2aTQ4OSBkaXZpZGVpbnQgLTUwMzExMy44MDEgLTk3MTUxNDkuODJFLTYxMjE4NDQyMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ4OSBtdWx0aXBseSAtNTAzMTEzLjgwMSAtOTcxNTE0OS44MkUtNjEyMTg0NDIyIC0+IDQuODg3ODI1OTVFLTYxMjE4NDQxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0ODkgcG93ZXIgLTUwMzExMy44MDEgLTEwIC0+IDkuNjIzNjAyODdFLTU4IEluZXhhY3QgUm91bmRlZAoreHJlbTQ4OSByZW1haW5kZXIgLTUwMzExMy44MDEgLTk3MTUxNDkuODJFLTYxMjE4NDQyMiAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ4OSBzdWJ0cmFjdCAtNTAzMTEzLjgwMSAtOTcxNTE0OS44MkUtNjEyMTg0NDIyIC0+IC01MDMxMTMuODAxIEluZXhhY3QgUm91bmRlZAoreGFkZDQ5MCBhZGQgLTMwNjY5NjIuNDEgLTU1LjMwOTY4NzkgLT4gLTMwNjcwMTcuNzIgSW5leGFjdCBSb3VuZGVkCit4Y29tNDkwIGNvbXBhcmUgLTMwNjY5NjIuNDEgLTU1LjMwOTY4NzkgLT4gLTEKK3hkaXY0OTAgZGl2aWRlIC0zMDY2OTYyLjQxIC01NS4zMDk2ODc5IC0+IDU1NDUwLjcyNzEgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDkwIGRpdmlkZWludCAtMzA2Njk2Mi40MSAtNTUuMzA5Njg3OSAtPiA1NTQ1MAoreG11bDQ5MCBtdWx0aXBseSAtMzA2Njk2Mi40MSAtNTUuMzA5Njg3OSAtPiAxNjk2MzI3MzQgSW5leGFjdCBSb3VuZGVkCit4cG93NDkwIHBvd2VyIC0zMDY2OTYyLjQxIC01NSAtPiAtMS43MDIyOTYwMEUtMzU3IEluZXhhY3QgUm91bmRlZAoreHJlbTQ5MCByZW1haW5kZXIgLTMwNjY5NjIuNDEgLTU1LjMwOTY4NzkgLT4gLTQwLjIxNTk0NTAKK3hzdWI0OTAgc3VidHJhY3QgLTMwNjY5NjIuNDEgLTU1LjMwOTY4NzkgLT4gLTMwNjY5MDcuMTAgSW5leGFjdCBSb3VuZGVkCit4YWRkNDkxIGFkZCAtNTMzMTEuNTczOEUrMTU2NjA4OTM2IC03LjQ1ODkwNjY2IC0+IC01LjMzMTE1NzM4RSsxNTY2MDg5NDAgSW5leGFjdCBSb3VuZGVkCit4Y29tNDkxIGNvbXBhcmUgLTUzMzExLjU3MzhFKzE1NjYwODkzNiAtNy40NTg5MDY2NiAtPiAtMQoreGRpdjQ5MSBkaXZpZGUgLTUzMzExLjU3MzhFKzE1NjYwODkzNiAtNy40NTg5MDY2NiAtPiA3LjE0NzM3MTA5RSsxNTY2MDg5MzkgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDkxIGRpdmlkZWludCAtNTMzMTEuNTczOEUrMTU2NjA4OTM2IC03LjQ1ODkwNjY2IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDkxIG11bHRpcGx5IC01MzMxMS41NzM4RSsxNTY2MDg5MzYgLTcuNDU4OTA2NjYgLT4gMy45NzY0NjA1M0UrMTU2NjA4OTQxIEluZXhhY3QgUm91bmRlZAoreHBvdzQ5MSBwb3dlciAtNTMzMTEuNTczOEUrMTU2NjA4OTM2IC03IC0+IC0wRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00OTEgcmVtYWluZGVyIC01MzMxMS41NzM4RSsxNTY2MDg5MzYgLTcuNDU4OTA2NjYgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0OTEgc3VidHJhY3QgLTUzMzExLjU3MzhFKzE1NjYwODkzNiAtNy40NTg5MDY2NiAtPiAtNS4zMzExNTczOEUrMTU2NjA4OTQwIEluZXhhY3QgUm91bmRlZAoreGFkZDQ5MiBhZGQgOTk4ODkwMDY4LiAtOTIuMDU3ODc5IC0+IDk5ODg4OTk3NiBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTIgY29tcGFyZSA5OTg4OTAwNjguIC05Mi4wNTc4NzkgLT4gMQoreGRpdjQ5MiBkaXZpZGUgOTk4ODkwMDY4LiAtOTIuMDU3ODc5IC0+IC0xMDg1MDY3NC40IEluZXhhY3QgUm91bmRlZAoreGR2aTQ5MiBkaXZpZGVpbnQgOTk4ODkwMDY4LiAtOTIuMDU3ODc5IC0+IC0xMDg1MDY3NAoreG11bDQ5MiBtdWx0aXBseSA5OTg4OTAwNjguIC05Mi4wNTc4NzkgLT4gLTkuMTk1NTcwMTBFKzEwIEluZXhhY3QgUm91bmRlZAoreHBvdzQ5MiBwb3dlciA5OTg4OTAwNjguIC05MiAtPiAxLjEwNzU3MjI1RS04MjggSW5leGFjdCBSb3VuZGVkCit4cmVtNDkyIHJlbWFpbmRlciA5OTg4OTAwNjguIC05Mi4wNTc4NzkgLT4gMzMuODM5NTU0Cit4c3ViNDkyIHN1YnRyYWN0IDk5ODg5MDA2OC4gLTkyLjA1Nzg3OSAtPiA5OTg4OTAxNjAgSW5leGFjdCBSb3VuZGVkCit4YWRkNDkzIGFkZCAxMjIuNDk1NTkxIC00MDc4MzYwMjguIC0+IC00MDc4MzU5MDYgSW5leGFjdCBSb3VuZGVkCit4Y29tNDkzIGNvbXBhcmUgMTIyLjQ5NTU5MSAtNDA3ODM2MDI4LiAtPiAxCit4ZGl2NDkzIGRpdmlkZSAxMjIuNDk1NTkxIC00MDc4MzYwMjguIC0+IC0zLjAwMzU1MDAyRS03IEluZXhhY3QgUm91bmRlZAoreGR2aTQ5MyBkaXZpZGVpbnQgMTIyLjQ5NTU5MSAtNDA3ODM2MDI4LiAtPiAtMAoreG11bDQ5MyBtdWx0aXBseSAxMjIuNDk1NTkxIC00MDc4MzYwMjguIC0+IC00Ljk5NTgxMTUzRSsxMCBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0OTMgcG93ZXIgMTIyLjQ5NTU5MSAtNDA3ODM2MDI4IC0+IDQuODI0NjM3NzNFLTg1MTYxMDc1NCBJbmV4YWN0IFJvdW5kZWQKK3hyZW00OTMgcmVtYWluZGVyIDEyMi40OTU1OTEgLTQwNzgzNjAyOC4gLT4gMTIyLjQ5NTU5MQoreHN1YjQ5MyBzdWJ0cmFjdCAxMjIuNDk1NTkxIC00MDc4MzYwMjguIC0+IDQwNzgzNjE1MCBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0OTQgYWRkIDE4NzA5OC40ODggNjIyMC4wNTU4NEUtMjM2NTQxMjQ5IC0+IDE4NzA5OC40ODggSW5leGFjdCBSb3VuZGVkCit4Y29tNDk0IGNvbXBhcmUgMTg3MDk4LjQ4OCA2MjIwLjA1NTg0RS0yMzY1NDEyNDkgLT4gMQoreGRpdjQ5NCBkaXZpZGUgMTg3MDk4LjQ4OCA2MjIwLjA1NTg0RS0yMzY1NDEyNDkgLT4gMy4wMDc5ODcyN0UrMjM2NTQxMjUwIEluZXhhY3QgUm91bmRlZAoreGR2aTQ5NCBkaXZpZGVpbnQgMTg3MDk4LjQ4OCA2MjIwLjA1NTg0RS0yMzY1NDEyNDkgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0OTQgbXVsdGlwbHkgMTg3MDk4LjQ4OCA2MjIwLjA1NTg0RS0yMzY1NDEyNDkgLT4gMS4xNjM3NjMwNEUtMjM2NTQxMjQwIEluZXhhY3QgUm91bmRlZAoreHBvdzQ5NCBwb3dlciAxODcwOTguNDg4IDYgLT4gNC4yODk2NDgxMUUrMzEgSW5leGFjdCBSb3VuZGVkCit4cmVtNDk0IHJlbWFpbmRlciAxODcwOTguNDg4IDYyMjAuMDU1ODRFLTIzNjU0MTI0OSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreHN1YjQ5NCBzdWJ0cmFjdCAxODcwOTguNDg4IDYyMjAuMDU1ODRFLTIzNjU0MTI0OSAtPiAxODcwOTguNDg4IEluZXhhY3QgUm91bmRlZAoreGFkZDQ5NSBhZGQgNDgxOTg5OS4yMUUrNDMyOTgyNTUwIC03Mjc0NDE5MTcgLT4gNC44MTk4OTkyMUUrNDMyOTgyNTU2IEluZXhhY3QgUm91bmRlZAoreGNvbTQ5NSBjb21wYXJlIDQ4MTk4OTkuMjFFKzQzMjk4MjU1MCAtNzI3NDQxOTE3IC0+IDEKK3hkaXY0OTUgZGl2aWRlIDQ4MTk4OTkuMjFFKzQzMjk4MjU1MCAtNzI3NDQxOTE3IC0+IC02LjYyNTgyMDAxRSs0MzI5ODI1NDcgSW5leGFjdCBSb3VuZGVkCit4ZHZpNDk1IGRpdmlkZWludCA0ODE5ODk5LjIxRSs0MzI5ODI1NTAgLTcyNzQ0MTkxNyAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQoreG11bDQ5NSBtdWx0aXBseSA0ODE5ODk5LjIxRSs0MzI5ODI1NTAgLTcyNzQ0MTkxNyAtPiAtMy41MDYxOTY3MkUrNDMyOTgyNTY1IEluZXhhY3QgUm91bmRlZAoreHBvdzQ5NSBwb3dlciA0ODE5ODk5LjIxRSs0MzI5ODI1NTAgLTcyNzQ0MTkxNyAtPiAwRS0xMDAwMDAwMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3hyZW00OTUgcmVtYWluZGVyIDQ4MTk4OTkuMjFFKzQzMjk4MjU1MCAtNzI3NDQxOTE3IC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4c3ViNDk1IHN1YnRyYWN0IDQ4MTk4OTkuMjFFKzQzMjk4MjU1MCAtNzI3NDQxOTE3IC0+IDQuODE5ODk5MjFFKzQzMjk4MjU1NiBJbmV4YWN0IFJvdW5kZWQKK3hhZGQ0OTYgYWRkIDU3NzAuMDEwMjBFKzUwNzQ1OTc1MiAtNDIwODMzOS4zM0UtMTI5NzY2NjgwIC0+IDUuNzcwMDEwMjBFKzUwNzQ1OTc1NSBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTYgY29tcGFyZSA1NzcwLjAxMDIwRSs1MDc0NTk3NTIgLTQyMDgzMzkuMzNFLTEyOTc2NjY4MCAtPiAxCit4ZGl2NDk2IGRpdmlkZSA1NzcwLjAxMDIwRSs1MDc0NTk3NTIgLTQyMDgzMzkuMzNFLTEyOTc2NjY4MCAtPiAtMS4zNzEwODk1OEUrNjM3MjI2NDI5IEluZXhhY3QgUm91bmRlZAoreGR2aTQ5NiBkaXZpZGVpbnQgNTc3MC4wMTAyMEUrNTA3NDU5NzUyIC00MjA4MzM5LjMzRS0xMjk3NjY2ODAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3htdWw0OTYgbXVsdGlwbHkgNTc3MC4wMTAyMEUrNTA3NDU5NzUyIC00MjA4MzM5LjMzRS0xMjk3NjY2ODAgLT4gLTIuNDI4MjE2MDlFKzM3NzY5MzA4MiBJbmV4YWN0IFJvdW5kZWQKK3hwb3c0OTYgcG93ZXIgNTc3MC4wMTAyMEUrNTA3NDU5NzUyIC00IC0+IDBFLTEwMDAwMDAwMDcgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAoreHJlbTQ5NiByZW1haW5kZXIgNTc3MC4wMTAyMEUrNTA3NDU5NzUyIC00MjA4MzM5LjMzRS0xMjk3NjY2ODAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0OTYgc3VidHJhY3QgNTc3MC4wMTAyMEUrNTA3NDU5NzUyIC00MjA4MzM5LjMzRS0xMjk3NjY2ODAgLT4gNS43NzAwMTAyMEUrNTA3NDU5NzU1IEluZXhhY3QgUm91bmRlZAoreGFkZDQ5NyBhZGQgLTI4Ni4zNzEzMjAgNzEwMzE5MTUyIC0+IDcxMDMxODg2NiBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTcgY29tcGFyZSAtMjg2LjM3MTMyMCA3MTAzMTkxNTIgLT4gLTEKK3hkaXY0OTcgZGl2aWRlIC0yODYuMzcxMzIwIDcxMDMxOTE1MiAtPiAtNC4wMzE1ODY2NEUtNyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk0OTcgZGl2aWRlaW50IC0yODYuMzcxMzIwIDcxMDMxOTE1MiAtPiAtMAoreG11bDQ5NyBtdWx0aXBseSAtMjg2LjM3MTMyMCA3MTAzMTkxNTIgLT4gLTIuMDM0MTUwMzNFKzExIEluZXhhY3QgUm91bmRlZAoreHBvdzQ5NyBwb3dlciAtMjg2LjM3MTMyMCA3MTAzMTkxNTIgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCit4cmVtNDk3IHJlbWFpbmRlciAtMjg2LjM3MTMyMCA3MTAzMTkxNTIgLT4gLTI4Ni4zNzEzMjAKK3hzdWI0OTcgc3VidHJhY3QgLTI4Ni4zNzEzMjAgNzEwMzE5MTUyIC0+IC03MTAzMTk0MzggSW5leGFjdCBSb3VuZGVkCit4YWRkNDk4IGFkZCAtNy4yNzQwMzUzNiAtNDgxNDY5NjU2RS04MzUxODM3MDAgLT4gLTcuMjc0MDM1MzYgSW5leGFjdCBSb3VuZGVkCit4Y29tNDk4IGNvbXBhcmUgLTcuMjc0MDM1MzYgLTQ4MTQ2OTY1NkUtODM1MTgzNzAwIC0+IC0xCit4ZGl2NDk4IGRpdmlkZSAtNy4yNzQwMzUzNiAtNDgxNDY5NjU2RS04MzUxODM3MDAgLT4gMS41MTA3OTgzMEUrODM1MTgzNjkyIEluZXhhY3QgUm91bmRlZAoreGR2aTQ5OCBkaXZpZGVpbnQgLTcuMjc0MDM1MzYgLTQ4MTQ2OTY1NkUtODM1MTgzNzAwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNDk4IG11bHRpcGx5IC03LjI3NDAzNTM2IC00ODE0Njk2NTZFLTgzNTE4MzcwMCAtPiAzLjUwMjIyNzMwRS04MzUxODM2OTEgSW5leGFjdCBSb3VuZGVkCit4cG93NDk4IHBvd2VyIC03LjI3NDAzNTM2IC01IC0+IC0wLjAwMDA0OTEwNDY4ODUgSW5leGFjdCBSb3VuZGVkCit4cmVtNDk4IHJlbWFpbmRlciAtNy4yNzQwMzUzNiAtNDgxNDY5NjU2RS04MzUxODM3MDAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI0OTggc3VidHJhY3QgLTcuMjc0MDM1MzYgLTQ4MTQ2OTY1NkUtODM1MTgzNzAwIC0+IC03LjI3NDAzNTM2IEluZXhhY3QgUm91bmRlZAoreGFkZDQ5OSBhZGQgLTYxNTcuNzQyOTIgLTk0MDc1Mjg2LjJFKzkyNTU1ODc3IC0+IC05LjQwNzUyODYyRSs5MjU1NTg4NCBJbmV4YWN0IFJvdW5kZWQKK3hjb200OTkgY29tcGFyZSAtNjE1Ny43NDI5MiAtOTQwNzUyODYuMkUrOTI1NTU4NzcgLT4gMQoreGRpdjQ5OSBkaXZpZGUgLTYxNTcuNzQyOTIgLTk0MDc1Mjg2LjJFKzkyNTU1ODc3IC0+IDYuNTQ1NTQ3OTBFLTkyNTU1ODgyIEluZXhhY3QgUm91bmRlZAoreGR2aTQ5OSBkaXZpZGVpbnQgLTYxNTcuNzQyOTIgLTk0MDc1Mjg2LjJFKzkyNTU1ODc3IC0+IDAKK3htdWw0OTkgbXVsdGlwbHkgLTYxNTcuNzQyOTIgLTk0MDc1Mjg2LjJFKzkyNTU1ODc3IC0+IDUuNzkyOTE0MjhFKzkyNTU1ODg4IEluZXhhY3QgUm91bmRlZAoreHBvdzQ5OSBwb3dlciAtNjE1Ny43NDI5MiAtOSAtPiAtNy44NTYwODIxOEUtMzUgSW5leGFjdCBSb3VuZGVkCit4cmVtNDk5IHJlbWFpbmRlciAtNjE1Ny43NDI5MiAtOTQwNzUyODYuMkUrOTI1NTU4NzcgLT4gLTYxNTcuNzQyOTIKK3hzdWI0OTkgc3VidHJhY3QgLTYxNTcuNzQyOTIgLTk0MDc1Mjg2LjJFKzkyNTU1ODc3IC0+IDkuNDA3NTI4NjJFKzkyNTU1ODg0IEluZXhhY3QgUm91bmRlZAoreGFkZDUwMCBhZGQgLTUyNTQ0NTA4Ny5FKzIzMTUyOTE2NyAxODgyMjc0NjAgLT4gLTUuMjU0NDUwODdFKzIzMTUyOTE3NSBJbmV4YWN0IFJvdW5kZWQKK3hjb201MDAgY29tcGFyZSAtNTI1NDQ1MDg3LkUrMjMxNTI5MTY3IDE4ODIyNzQ2MCAtPiAtMQoreGRpdjUwMCBkaXZpZGUgLTUyNTQ0NTA4Ny5FKzIzMTUyOTE2NyAxODgyMjc0NjAgLT4gLTIuNzkxNTQzMjFFKzIzMTUyOTE2NyBJbmV4YWN0IFJvdW5kZWQKK3hkdmk1MDAgZGl2aWRlaW50IC01MjU0NDUwODcuRSsyMzE1MjkxNjcgMTg4MjI3NDYwIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCit4bXVsNTAwIG11bHRpcGx5IC01MjU0NDUwODcuRSsyMzE1MjkxNjcgMTg4MjI3NDYwIC0+IC05Ljg5MDMxOTQxRSsyMzE1MjkxODMgSW5leGFjdCBSb3VuZGVkCit4cG93NTAwIHBvd2VyIC01MjU0NDUwODcuRSsyMzE1MjkxNjcgMTg4MjI3NDYwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAoreHJlbTUwMCByZW1haW5kZXIgLTUyNTQ0NTA4Ny5FKzIzMTUyOTE2NyAxODgyMjc0NjAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3hzdWI1MDAgc3VidHJhY3QgLTUyNTQ0NTA4Ny5FKzIzMTUyOTE2NyAxODgyMjc0NjAgLT4gLTUuMjU0NDUwODdFKzIzMTUyOTE3NSBJbmV4YWN0IFJvdW5kZWQKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZWR1Y2UuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmVkdWNlLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljODVmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmVkdWNlLmRlY1Rlc3QKQEAgLTAsMCArMSwyMzQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcmVkdWNlLmRlY1Rlc3QgLS0gcmVtb3ZlIHRyYWlsaW5nIHplcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMywgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gW1RoaXMgdXNlZCB0byBiZSBjYWxsZWQgbm9ybWFsaXplLl0KKwordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCityZWR4MDAxIHJlZHVjZSAnMScgICAgICAtPiAnMScKK3JlZHgwMDIgcmVkdWNlICctMScgICAgIC0+ICctMScKK3JlZHgwMDMgcmVkdWNlICcxLjAwJyAgIC0+ICcxJworcmVkeDAwNCByZWR1Y2UgJy0xLjAwJyAgLT4gJy0xJworcmVkeDAwNSByZWR1Y2UgJzAnICAgICAgLT4gJzAnCityZWR4MDA2IHJlZHVjZSAnMC4wMCcgICAtPiAnMCcKK3JlZHgwMDcgcmVkdWNlICcwMC4wJyAgIC0+ICcwJworcmVkeDAwOCByZWR1Y2UgJzAwLjAwJyAgLT4gJzAnCityZWR4MDA5IHJlZHVjZSAnMDAnICAgICAtPiAnMCcKK3JlZHgwMTAgcmVkdWNlICcwRSsxJyAgIC0+ICcwJworcmVkeDAxMSByZWR1Y2UgJzBFKzUnICAgLT4gJzAnCisKK3JlZHgwMTIgcmVkdWNlICctMicgICAgIC0+ICctMicKK3JlZHgwMTMgcmVkdWNlICcyJyAgICAgIC0+ICcyJworcmVkeDAxNCByZWR1Y2UgJy0yLjAwJyAgLT4gJy0yJworcmVkeDAxNSByZWR1Y2UgJzIuMDAnICAgLT4gJzInCityZWR4MDE2IHJlZHVjZSAnLTAnICAgICAtPiAnLTAnCityZWR4MDE3IHJlZHVjZSAnLTAuMDAnICAtPiAnLTAnCityZWR4MDE4IHJlZHVjZSAnLTAwLjAnICAtPiAnLTAnCityZWR4MDE5IHJlZHVjZSAnLTAwLjAwJyAtPiAnLTAnCityZWR4MDIwIHJlZHVjZSAnLTAwJyAgICAtPiAnLTAnCityZWR4MDIxIHJlZHVjZSAnLTBFKzUnICAgLT4gJy0wJworcmVkeDAyMiByZWR1Y2UgJy0wRSsxJyAgLT4gJy0wJworCityZWR4MDMwIHJlZHVjZSAnKzAuMScgICAgICAgICAgICAtPiAnMC4xJworcmVkeDAzMSByZWR1Y2UgJy0wLjEnICAgICAgICAgICAgLT4gJy0wLjEnCityZWR4MDMyIHJlZHVjZSAnKzAuMDEnICAgICAgICAgICAtPiAnMC4wMScKK3JlZHgwMzMgcmVkdWNlICctMC4wMScgICAgICAgICAgIC0+ICctMC4wMScKK3JlZHgwMzQgcmVkdWNlICcrMC4wMDEnICAgICAgICAgIC0+ICcwLjAwMScKK3JlZHgwMzUgcmVkdWNlICctMC4wMDEnICAgICAgICAgIC0+ICctMC4wMDEnCityZWR4MDM2IHJlZHVjZSAnKzAuMDAwMDAxJyAgICAgICAtPiAnMC4wMDAwMDEnCityZWR4MDM3IHJlZHVjZSAnLTAuMDAwMDAxJyAgICAgICAtPiAnLTAuMDAwMDAxJworcmVkeDAzOCByZWR1Y2UgJyswLjAwMDAwMDAwMDAwMScgLT4gJzFFLTEyJworcmVkeDAzOSByZWR1Y2UgJy0wLjAwMDAwMDAwMDAwMScgLT4gJy0xRS0xMicKKworcmVkeDA0MSByZWR1Y2UgMS4xICAgICAgICAtPiAxLjEKK3JlZHgwNDIgcmVkdWNlIDEuMTAgICAgICAgLT4gMS4xCityZWR4MDQzIHJlZHVjZSAxLjEwMCAgICAgIC0+IDEuMQorcmVkeDA0NCByZWR1Y2UgMS4xMTAgICAgICAtPiAxLjExCityZWR4MDQ1IHJlZHVjZSAtMS4xICAgICAgIC0+IC0xLjEKK3JlZHgwNDYgcmVkdWNlIC0xLjEwICAgICAgLT4gLTEuMQorcmVkeDA0NyByZWR1Y2UgLTEuMTAwICAgICAtPiAtMS4xCityZWR4MDQ4IHJlZHVjZSAtMS4xMTAgICAgIC0+IC0xLjExCityZWR4MDQ5IHJlZHVjZSA5LjkgICAgICAgIC0+IDkuOQorcmVkeDA1MCByZWR1Y2UgOS45MCAgICAgICAtPiA5LjkKK3JlZHgwNTEgcmVkdWNlIDkuOTAwICAgICAgLT4gOS45CityZWR4MDUyIHJlZHVjZSA5Ljk5MCAgICAgIC0+IDkuOTkKK3JlZHgwNTMgcmVkdWNlIC05LjkgICAgICAgLT4gLTkuOQorcmVkeDA1NCByZWR1Y2UgLTkuOTAgICAgICAtPiAtOS45CityZWR4MDU1IHJlZHVjZSAtOS45MDAgICAgIC0+IC05LjkKK3JlZHgwNTYgcmVkdWNlIC05Ljk5MCAgICAgLT4gLTkuOTkKKworLS0gc29tZSB0cmFpbGluZyBmcmFjdGlvbmFsIHplcm9zIHdpdGggemVyb3MgaW4gdW5pdHMKK3JlZHgwNjAgcmVkdWNlICAxMC4wICAgICAgICAtPiAxRSsxCityZWR4MDYxIHJlZHVjZSAgMTAuMDAgICAgICAgLT4gMUUrMQorcmVkeDA2MiByZWR1Y2UgIDEwMC4wICAgICAgIC0+IDFFKzIKK3JlZHgwNjMgcmVkdWNlICAxMDAuMDAgICAgICAtPiAxRSsyCityZWR4MDY0IHJlZHVjZSAgMS4xMDAwRSszICAgLT4gMS4xRSszCityZWR4MDY1IHJlZHVjZSAgMS4xMDAwMEUrMyAgLT4gMS4xRSszCityZWR4MDY2IHJlZHVjZSAtMTAuMCAgICAgICAgLT4gLTFFKzEKK3JlZHgwNjcgcmVkdWNlIC0xMC4wMCAgICAgICAtPiAtMUUrMQorcmVkeDA2OCByZWR1Y2UgLTEwMC4wICAgICAgIC0+IC0xRSsyCityZWR4MDY5IHJlZHVjZSAtMTAwLjAwICAgICAgLT4gLTFFKzIKK3JlZHgwNzAgcmVkdWNlIC0xLjEwMDBFKzMgICAtPiAtMS4xRSszCityZWR4MDcxIHJlZHVjZSAtMS4xMDAwMEUrMyAgLT4gLTEuMUUrMworCistLSBzb21lIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3Mgd2l0aCBwb3NpdGl2ZSBleHBvbmVudAorcmVkeDA4MCByZWR1Y2UgIDEwRSsxICAgICAgIC0+IDFFKzIKK3JlZHgwODEgcmVkdWNlICAxMDBFKzEgICAgICAtPiAxRSszCityZWR4MDgyIHJlZHVjZSAgMS4wRSsyICAgICAgLT4gMUUrMgorcmVkeDA4MyByZWR1Y2UgIDEuMEUrMyAgICAgIC0+IDFFKzMKK3JlZHgwODQgcmVkdWNlICAxLjFFKzMgICAgICAtPiAxLjFFKzMKK3JlZHgwODUgcmVkdWNlICAxLjAwRSszICAgICAtPiAxRSszCityZWR4MDg2IHJlZHVjZSAgMS4xMEUrMyAgICAgLT4gMS4xRSszCityZWR4MDg3IHJlZHVjZSAtMTBFKzEgICAgICAgLT4gLTFFKzIKK3JlZHgwODggcmVkdWNlIC0xMDBFKzEgICAgICAtPiAtMUUrMworcmVkeDA4OSByZWR1Y2UgLTEuMEUrMiAgICAgIC0+IC0xRSsyCityZWR4MDkwIHJlZHVjZSAtMS4wRSszICAgICAgLT4gLTFFKzMKK3JlZHgwOTEgcmVkdWNlIC0xLjFFKzMgICAgICAtPiAtMS4xRSszCityZWR4MDkyIHJlZHVjZSAtMS4wMEUrMyAgICAgLT4gLTFFKzMKK3JlZHgwOTMgcmVkdWNlIC0xLjEwRSszICAgICAtPiAtMS4xRSszCisKKy0tIHNvbWUgc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MsIHdlcmUgd2UgdG8gYmUgdHJpbW1pbmcKK3JlZHgxMDAgcmVkdWNlICAxMSAgICAgICAgICAtPiAxMQorcmVkeDEwMSByZWR1Y2UgIDEwICAgICAgICAgIC0+IDFFKzEKK3JlZHgxMDIgcmVkdWNlICAxMC4gICAgICAgICAtPiAxRSsxCityZWR4MTAzIHJlZHVjZSAgMS4xRSsxICAgICAgLT4gMTEKK3JlZHgxMDQgcmVkdWNlICAxLjBFKzEgICAgICAtPiAxRSsxCityZWR4MTA1IHJlZHVjZSAgMS4xMEUrMiAgICAgLT4gMS4xRSsyCityZWR4MTA2IHJlZHVjZSAgMS4wMEUrMiAgICAgLT4gMUUrMgorcmVkeDEwNyByZWR1Y2UgIDEuMTAwRSszICAgIC0+IDEuMUUrMworcmVkeDEwOCByZWR1Y2UgIDEuMDAwRSszICAgIC0+IDFFKzMKK3JlZHgxMDkgcmVkdWNlICAxLjAwMDAwMEUrNiAtPiAxRSs2CityZWR4MTEwIHJlZHVjZSAtMTEgICAgICAgICAgLT4gLTExCityZWR4MTExIHJlZHVjZSAtMTAgICAgICAgICAgLT4gLTFFKzEKK3JlZHgxMTIgcmVkdWNlIC0xMC4gICAgICAgICAtPiAtMUUrMQorcmVkeDExMyByZWR1Y2UgLTEuMUUrMSAgICAgIC0+IC0xMQorcmVkeDExNCByZWR1Y2UgLTEuMEUrMSAgICAgIC0+IC0xRSsxCityZWR4MTE1IHJlZHVjZSAtMS4xMEUrMiAgICAgLT4gLTEuMUUrMgorcmVkeDExNiByZWR1Y2UgLTEuMDBFKzIgICAgIC0+IC0xRSsyCityZWR4MTE3IHJlZHVjZSAtMS4xMDBFKzMgICAgLT4gLTEuMUUrMworcmVkeDExOCByZWR1Y2UgLTEuMDAwRSszICAgIC0+IC0xRSszCityZWR4MTE5IHJlZHVjZSAtMS4wMDAwMEUrNSAgLT4gLTFFKzUKK3JlZHgxMjAgcmVkdWNlIC0xLjAwMDAwMEUrNiAtPiAtMUUrNgorcmVkeDEyMSByZWR1Y2UgLTEwLjAwMDAwRSs2IC0+IC0xRSs3CityZWR4MTIyIHJlZHVjZSAtMTAwLjAwMDBFKzYgLT4gLTFFKzgKK3JlZHgxMjMgcmVkdWNlIC0xMDAwLjAwMEUrNiAtPiAtMUUrOQorcmVkeDEyNCByZWR1Y2UgLTEwMDAwLjAwRSs2IC0+IC0xRSsxMAorcmVkeDEyNSByZWR1Y2UgLTEwMDAwMC4wRSs2IC0+IC0xRSsxMQorcmVkeDEyNiByZWR1Y2UgLTEwMDAwMDAuRSs2IC0+IC0xRSsxMgorCistLSBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCityZWR4MTQwIHJlZHVjZSAnMi4xJyAgICAgLT4gICcyLjEnCityZWR4MTQxIHJlZHVjZSAnLTIuMCcgICAgLT4gICctMicKK3JlZHgxNDIgcmVkdWNlICcxLjIwMCcgICAtPiAgJzEuMicKK3JlZHgxNDMgcmVkdWNlICctMTIwJyAgICAtPiAgJy0xLjJFKzInCityZWR4MTQ0IHJlZHVjZSAnMTIwLjAwJyAgLT4gICcxLjJFKzInCityZWR4MTQ1IHJlZHVjZSAnMC4wMCcgICAgLT4gICcwJworCistLSBvdmVyZmxvdyB0ZXN0cworbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogMworcmVkeDE2MCByZWR1Y2UgOS45OTlFKzk5OTk5OTk5OSAgLT4gIEluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorcmVkeDE2MSByZWR1Y2UgLTkuOTk5RSs5OTk5OTk5OTkgLT4gLUluZmluaXR5IEluZXhhY3QgT3ZlcmZsb3cgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3cKK3ByZWNpc2lvbjogMworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3JlZHgyMTAgcmVkdWNlICAxLjAwRS05OTkgICAgICAgIC0+ICAgMUUtOTk5CityZWR4MjExIHJlZHVjZSAgMC4xRS05OTkgICAgICAgICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK3JlZHgyMTIgcmVkdWNlICAwLjEwRS05OTkgICAgICAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorcmVkeDIxMyByZWR1Y2UgIDAuMTAwRS05OTkgICAgICAgLT4gICAxRS0xMDAwICAgU3Vibm9ybWFsIFJvdW5kZWQKK3JlZHgyMTQgcmVkdWNlICAwLjAxRS05OTkgICAgICAgIC0+ICAgMUUtMTAwMSAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK3JlZHgyMTUgcmVkdWNlICAwLjk5OUUtOTk5ICAgICAgIC0+ICAgMUUtOTk5ICAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CityZWR4MjE2IHJlZHVjZSAgMC4wOTlFLTk5OSAgICAgICAtPiAgIDFFLTEwMDAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcmVkeDIxNyByZWR1Y2UgIDAuMDA5RS05OTkgICAgICAgLT4gICAxRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3JlZHgyMTggcmVkdWNlICAwLjAwMUUtOTk5ICAgICAgIC0+ICAgMCAgICAgICAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3JlZHgyMTkgcmVkdWNlICAwLjAwMDlFLTk5OSAgICAgIC0+ICAgMCAgICAgICAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3JlZHgyMjAgcmVkdWNlICAwLjAwMDFFLTk5OSAgICAgIC0+ICAgMCAgICAgICAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKKworcmVkeDIzMCByZWR1Y2UgLTEuMDBFLTk5OSAgICAgICAgLT4gIC0xRS05OTkKK3JlZHgyMzEgcmVkdWNlIC0wLjFFLTk5OSAgICAgICAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbAorcmVkeDIzMiByZWR1Y2UgLTAuMTBFLTk5OSAgICAgICAgLT4gIC0xRS0xMDAwICAgU3Vibm9ybWFsCityZWR4MjMzIHJlZHVjZSAtMC4xMDBFLTk5OSAgICAgICAtPiAgLTFFLTEwMDAgICBTdWJub3JtYWwgUm91bmRlZAorcmVkeDIzNCByZWR1Y2UgLTAuMDFFLTk5OSAgICAgICAgLT4gIC0xRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcmVkeDIzNSByZWR1Y2UgLTAuOTk5RS05OTkgICAgICAgLT4gIC0xRS05OTkgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3JlZHgyMzYgcmVkdWNlIC0wLjA5OUUtOTk5ICAgICAgIC0+ICAtMUUtMTAwMCAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CityZWR4MjM3IHJlZHVjZSAtMC4wMDlFLTk5OSAgICAgICAtPiAgLTFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworcmVkeDIzOCByZWR1Y2UgLTAuMDAxRS05OTkgICAgICAgLT4gIC0wICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorcmVkeDIzOSByZWR1Y2UgLTAuMDAwOUUtOTk5ICAgICAgLT4gIC0wICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorcmVkeDI0MCByZWR1Y2UgLTAuMDAwMUUtOTk5ICAgICAgLT4gIC0wICAgICAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBtb3JlIHJlc2hhcGluZworcHJlY2lzaW9uOiA5CityZWR4MjYwIHJlZHVjZSAnNTYyNjBFLTEwJyAgIC0+ICcwLjAwMDAwNTYyNicKK3JlZHgyNjEgcmVkdWNlICc1NjI2MEUtNScgICAgLT4gJzAuNTYyNicKK3JlZHgyNjIgcmVkdWNlICc1NjI2MEUtMicgICAgLT4gJzU2Mi42JworcmVkeDI2MyByZWR1Y2UgJzU2MjYwRS0xJyAgICAtPiAnNTYyNicKK3JlZHgyNjUgcmVkdWNlICc1NjI2MEUtMCcgICAgLT4gJzUuNjI2RSs0JworcmVkeDI2NiByZWR1Y2UgJzU2MjYwRSswJyAgICAtPiAnNS42MjZFKzQnCityZWR4MjY3IHJlZHVjZSAnNTYyNjBFKzEnICAgIC0+ICc1LjYyNkUrNScKK3JlZHgyNjggcmVkdWNlICc1NjI2MEUrMicgICAgLT4gJzUuNjI2RSs2JworcmVkeDI2OSByZWR1Y2UgJzU2MjYwRSszJyAgICAtPiAnNS42MjZFKzcnCityZWR4MjcwIHJlZHVjZSAnNTYyNjBFKzQnICAgIC0+ICc1LjYyNkUrOCcKK3JlZHgyNzEgcmVkdWNlICc1NjI2MEUrNScgICAgLT4gJzUuNjI2RSs5JworcmVkeDI3MiByZWR1Y2UgJzU2MjYwRSs2JyAgICAtPiAnNS42MjZFKzEwJworcmVkeDI4MCByZWR1Y2UgJy01NjI2MEUtMTAnICAtPiAnLTAuMDAwMDA1NjI2JworcmVkeDI4MSByZWR1Y2UgJy01NjI2MEUtNScgICAtPiAnLTAuNTYyNicKK3JlZHgyODIgcmVkdWNlICctNTYyNjBFLTInICAgLT4gJy01NjIuNicKK3JlZHgyODMgcmVkdWNlICctNTYyNjBFLTEnICAgLT4gJy01NjI2JworcmVkeDI4NSByZWR1Y2UgJy01NjI2MEUtMCcgICAtPiAnLTUuNjI2RSs0JworcmVkeDI4NiByZWR1Y2UgJy01NjI2MEUrMCcgICAtPiAnLTUuNjI2RSs0JworcmVkeDI4NyByZWR1Y2UgJy01NjI2MEUrMScgICAtPiAnLTUuNjI2RSs1JworcmVkeDI4OCByZWR1Y2UgJy01NjI2MEUrMicgICAtPiAnLTUuNjI2RSs2JworcmVkeDI4OSByZWR1Y2UgJy01NjI2MEUrMycgICAtPiAnLTUuNjI2RSs3JworcmVkeDI5MCByZWR1Y2UgJy01NjI2MEUrNCcgICAtPiAnLTUuNjI2RSs4JworcmVkeDI5MSByZWR1Y2UgJy01NjI2MEUrNScgICAtPiAnLTUuNjI2RSs5JworcmVkeDI5MiByZWR1Y2UgJy01NjI2MEUrNicgICAtPiAnLTUuNjI2RSsxMCcKKworLS0gRkwgdGVzdAorcHJlY2lzaW9uOiA0MAorcmVkeDI5NSByZWR1Y2UgOTg5MjM0NTY3My4wMTIzNDU2NzgwMDAwMDAwMDAwIC0+IDk4OTIzNDU2NzMuMDEyMzQ1Njc4CisKKy0tIHNwZWNpYWxzCityZWR4ODIwIHJlZHVjZSAnSW5mJyAgICAtPiAnSW5maW5pdHknCityZWR4ODIxIHJlZHVjZSAnLUluZicgICAtPiAnLUluZmluaXR5JworcmVkeDgyMiByZWR1Y2UgICBOYU4gICAgLT4gIE5hTgorcmVkeDgyMyByZWR1Y2UgIHNOYU4gICAgLT4gIE5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorcmVkeDgyNCByZWR1Y2UgICBOYU4xMDEgLT4gIE5hTjEwMQorcmVkeDgyNSByZWR1Y2UgIHNOYU4wMTAgLT4gIE5hTjEwICBJbnZhbGlkX29wZXJhdGlvbgorcmVkeDgyNyByZWR1Y2UgIC1OYU4gICAgLT4gLU5hTgorcmVkeDgyOCByZWR1Y2UgLXNOYU4gICAgLT4gLU5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorcmVkeDgyOSByZWR1Y2UgIC1OYU4xMDEgLT4gLU5hTjEwMQorcmVkeDgzMCByZWR1Y2UgLXNOYU4wMTAgLT4gLU5hTjEwICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwYXlsb2FkIGRlY2FwaXRhdGUKK3ByZWNpc2lvbjogNQorcmVkeDYyMTAwIHJlZHVjZSAgc05hTjEyMzQ1Njc4OTAgLT4gTmFONjc4OTAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIE51bGwgdGVzdAorcmVkeDkwMCByZWR1Y2UgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JlbWFpbmRlci5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZW1haW5kZXIuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTEwNjFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZW1haW5kZXIuZGVjVGVzdApAQCAtMCwwICsxLDY0MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByZW1haW5kZXIuZGVjVGVzdCAtLSBkZWNpbWFsIHJlbWFpbmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKKy0tIHNhbml0eSBjaGVja3MgKGFzIGJhc2UsIGFib3ZlKQorcmVteDAwMSByZW1haW5kZXIgIDEgICAgIDEgICAgLT4gIDAKK3JlbXgwMDIgcmVtYWluZGVyICAyICAgICAxICAgIC0+ICAwCityZW14MDAzIHJlbWFpbmRlciAgMSAgICAgMiAgICAtPiAgMQorcmVteDAwNCByZW1haW5kZXIgIDIgICAgIDIgICAgLT4gIDAKK3JlbXgwMDUgcmVtYWluZGVyICAwICAgICAxICAgIC0+ICAwCityZW14MDA2IHJlbWFpbmRlciAgMCAgICAgMiAgICAtPiAgMAorcmVteDAwNyByZW1haW5kZXIgIDEgICAgIDMgICAgLT4gIDEKK3JlbXgwMDggcmVtYWluZGVyICAyICAgICAzICAgIC0+ICAyCityZW14MDA5IHJlbWFpbmRlciAgMyAgICAgMyAgICAtPiAgMAorCityZW14MDEwIHJlbWFpbmRlciAgMi40ICAgMSAgICAtPiAgMC40CityZW14MDExIHJlbWFpbmRlciAgMi40ICAgLTEgICAtPiAgMC40CityZW14MDEyIHJlbWFpbmRlciAgLTIuNCAgMSAgICAtPiAgLTAuNAorcmVteDAxMyByZW1haW5kZXIgIC0yLjQgIC0xICAgLT4gIC0wLjQKK3JlbXgwMTQgcmVtYWluZGVyICAyLjQwICAxICAgIC0+ICAwLjQwCityZW14MDE1IHJlbWFpbmRlciAgMi40MDAgMSAgICAtPiAgMC40MDAKK3JlbXgwMTYgcmVtYWluZGVyICAyLjQgICAyICAgIC0+ICAwLjQKK3JlbXgwMTcgcmVtYWluZGVyICAyLjQwMCAyICAgIC0+ICAwLjQwMAorcmVteDAxOCByZW1haW5kZXIgIDIuICAgIDIgICAgLT4gIDAKK3JlbXgwMTkgcmVtYWluZGVyICAyMCAgICAyMCAgIC0+ICAwCisKK3JlbXgwMjAgcmVtYWluZGVyICAxODcgICAxODcgICAgLT4gIDAKK3JlbXgwMjEgcmVtYWluZGVyICA1ICAgICAyICAgICAgLT4gIDEKK3JlbXgwMjIgcmVtYWluZGVyICA1ICAgICAyLjAgICAgLT4gIDEuMAorcmVteDAyMyByZW1haW5kZXIgIDUgICAgIDIuMDAwICAtPiAgMS4wMDAKK3JlbXgwMjQgcmVtYWluZGVyICA1ICAgICAwLjIwMCAgLT4gIDAuMDAwCityZW14MDI1IHJlbWFpbmRlciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorCityZW14MDMwIHJlbWFpbmRlciAgMSAgICAgMiAgICAgIC0+ICAxCityZW14MDMxIHJlbWFpbmRlciAgMSAgICAgNCAgICAgIC0+ICAxCityZW14MDMyIHJlbWFpbmRlciAgMSAgICAgOCAgICAgIC0+ICAxCisKK3JlbXgwMzMgcmVtYWluZGVyICAxICAgICAxNiAgICAgLT4gIDEKK3JlbXgwMzQgcmVtYWluZGVyICAxICAgICAzMiAgICAgLT4gIDEKK3JlbXgwMzUgcmVtYWluZGVyICAxICAgICA2NCAgICAgLT4gIDEKK3JlbXgwNDAgcmVtYWluZGVyICAxICAgIC0yICAgICAgLT4gIDEKK3JlbXgwNDEgcmVtYWluZGVyICAxICAgIC00ICAgICAgLT4gIDEKK3JlbXgwNDIgcmVtYWluZGVyICAxICAgIC04ICAgICAgLT4gIDEKK3JlbXgwNDMgcmVtYWluZGVyICAxICAgIC0xNiAgICAgLT4gIDEKK3JlbXgwNDQgcmVtYWluZGVyICAxICAgIC0zMiAgICAgLT4gIDEKK3JlbXgwNDUgcmVtYWluZGVyICAxICAgIC02NCAgICAgLT4gIDEKK3JlbXgwNTAgcmVtYWluZGVyIC0xICAgICAyICAgICAgLT4gIC0xCityZW14MDUxIHJlbWFpbmRlciAtMSAgICAgNCAgICAgIC0+ICAtMQorcmVteDA1MiByZW1haW5kZXIgLTEgICAgIDggICAgICAtPiAgLTEKK3JlbXgwNTMgcmVtYWluZGVyIC0xICAgICAxNiAgICAgLT4gIC0xCityZW14MDU0IHJlbWFpbmRlciAtMSAgICAgMzIgICAgIC0+ICAtMQorcmVteDA1NSByZW1haW5kZXIgLTEgICAgIDY0ICAgICAtPiAgLTEKK3JlbXgwNjAgcmVtYWluZGVyIC0xICAgIC0yICAgICAgLT4gIC0xCityZW14MDYxIHJlbWFpbmRlciAtMSAgICAtNCAgICAgIC0+ICAtMQorcmVteDA2MiByZW1haW5kZXIgLTEgICAgLTggICAgICAtPiAgLTEKK3JlbXgwNjMgcmVtYWluZGVyIC0xICAgIC0xNiAgICAgLT4gIC0xCityZW14MDY0IHJlbWFpbmRlciAtMSAgICAtMzIgICAgIC0+ICAtMQorcmVteDA2NSByZW1haW5kZXIgLTEgICAgLTY0ICAgICAtPiAgLTEKKworcmVteDA2NiByZW1haW5kZXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gMAorcmVteDA2NyByZW1haW5kZXIgIDk5OTk5OTk5OS40ICAgMSAgLT4gMC40CityZW14MDY4IHJlbWFpbmRlciAgOTk5OTk5OTk5LjUgICAxICAtPiAwLjUKK3JlbXgwNjkgcmVtYWluZGVyICA5OTk5OTk5OTkuOSAgIDEgIC0+IDAuOQorcmVteDA3MCByZW1haW5kZXIgIDk5OTk5OTk5OS45OTkgMSAgLT4gMC45OTkKK3ByZWNpc2lvbjogNgorcmVteDA3MSByZW1haW5kZXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgwNzIgcmVtYWluZGVyICA5OTk5OTk5OSAgICAgIDEgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14MDczIHJlbWFpbmRlciAgOTk5OTk5OSAgICAgICAxICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDA3NCByZW1haW5kZXIgIDk5OTk5OSAgICAgICAgMSAgLT4gMAorcmVteDA3NSByZW1haW5kZXIgIDk5OTk5ICAgICAgICAgMSAgLT4gMAorcmVteDA3NiByZW1haW5kZXIgIDk5OTkgICAgICAgICAgMSAgLT4gMAorcmVteDA3NyByZW1haW5kZXIgIDk5OSAgICAgICAgICAgMSAgLT4gMAorcmVteDA3OCByZW1haW5kZXIgIDk5ICAgICAgICAgICAgMSAgLT4gMAorcmVteDA3OSByZW1haW5kZXIgIDkgICAgICAgICAgICAgMSAgLT4gMAorCitwcmVjaXNpb246IDkKK3JlbXgwODAgcmVtYWluZGVyICAwLiAgICAgICAgICAgIDEgIC0+IDAKK3JlbXgwODEgcmVtYWluZGVyICAuMCAgICAgICAgICAgIDEgIC0+IDAuMAorcmVteDA4MiByZW1haW5kZXIgIDAuMDAgICAgICAgICAgMSAgLT4gMC4wMAorcmVteDA4MyByZW1haW5kZXIgIDAuMDBFKzkgICAgICAgMSAgLT4gMAorcmVteDA4NCByZW1haW5kZXIgIDAuMDBFKzMgICAgICAgMSAgLT4gMAorcmVteDA4NSByZW1haW5kZXIgIDAuMDBFKzIgICAgICAgMSAgLT4gMAorcmVteDA4NiByZW1haW5kZXIgIDAuMDBFKzEgICAgICAgMSAgLT4gMC4wCityZW14MDg3IHJlbWFpbmRlciAgMC4wMEUrMCAgICAgICAxICAtPiAwLjAwCityZW14MDg4IHJlbWFpbmRlciAgMC4wMEUtMCAgICAgICAxICAtPiAwLjAwCityZW14MDg5IHJlbWFpbmRlciAgMC4wMEUtMSAgICAgICAxICAtPiAwLjAwMAorcmVteDA5MCByZW1haW5kZXIgIDAuMDBFLTIgICAgICAgMSAgLT4gMC4wMDAwCityZW14MDkxIHJlbWFpbmRlciAgMC4wMEUtMyAgICAgICAxICAtPiAwLjAwMDAwCityZW14MDkyIHJlbWFpbmRlciAgMC4wMEUtNCAgICAgICAxICAtPiAwLjAwMDAwMAorcmVteDA5MyByZW1haW5kZXIgIDAuMDBFLTUgICAgICAgMSAgLT4gMEUtNworcmVteDA5NCByZW1haW5kZXIgIDAuMDBFLTYgICAgICAgMSAgLT4gMEUtOAorcmVteDA5NSByZW1haW5kZXIgIDAuMDAwMEUtNTAgICAgMSAgLT4gMEUtNTQKKworLS0gVmFyaW91cyBmbGF2b3VycyBvZiByZW1haW5kZXIgYnkgMAorcHJlY2lzaW9uOiA5CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcmVteDEwMSByZW1haW5kZXIgIDAgICAgICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JlbXgxMDIgcmVtYWluZGVyICAwICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCityZW14MTAzIHJlbWFpbmRlciAtMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcmVteDEwNCByZW1haW5kZXIgLTAgICAgICAtMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JlbXgxMDUgcmVtYWluZGVyICAwLjBFNSAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCityZW14MTA2IHJlbWFpbmRlciAgMC4wMDAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorLS0gW1NvbWUgdGhpbmsgdGhpcyBuZXh0IGdyb3VwIHNob3VsZCBiZSBEaXZpc2lvbl9ieV96ZXJvIGV4Y2VwdGlvbiwgYnV0CistLSBJRUVFIDg1NCBpcyBleHBsaWNpdCB0aGF0IGl0IGlzIEludmFsaWQgb3BlcmF0aW9uIC4uIGZvcgorLS0gcmVtYWluZGVyLW5lYXIsIGFueXdheV0KK3JlbXgxMDcgcmVtYWluZGVyICAwLjAwMDEgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMDggcmVtYWluZGVyICAwLjAxICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMDkgcmVtYWluZGVyICAwLjEgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTAgcmVtYWluZGVyICAxICAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTEgcmVtYWluZGVyICAxICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTIgcmVtYWluZGVyIDEwICAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTMgcmVtYWluZGVyIDFFKzEwMCAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTQgcmVtYWluZGVyIDFFKzEwMDAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTUgcmVtYWluZGVyICAwLjAwMDEgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTYgcmVtYWluZGVyICAwLjAxICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMTkgcmVtYWluZGVyICAwLjEgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMjAgcmVtYWluZGVyICAxICAgICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMjEgcmVtYWluZGVyICAxICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMjIgcmVtYWluZGVyIDEwICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMjMgcmVtYWluZGVyIDFFKzEwMCAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgxMjQgcmVtYWluZGVyIDFFKzEwMDAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB6ZXJvcyBvbiBsZWZ0CityZW14MTMwIHJlbWFpbmRlciAgMCAgICAgIDEgICAtPiAgMAorcmVteDEzMSByZW1haW5kZXIgIDAgICAgIC0xICAgLT4gIDAKK3JlbXgxMzIgcmVtYWluZGVyICAwLjAgICAgMSAgIC0+ICAwLjAKK3JlbXgxMzMgcmVtYWluZGVyICAwLjAgICAtMSAgIC0+ICAwLjAKK3JlbXgxMzQgcmVtYWluZGVyIC0wICAgICAgMSAgIC0+IC0wCityZW14MTM1IHJlbWFpbmRlciAtMCAgICAgLTEgICAtPiAtMAorcmVteDEzNiByZW1haW5kZXIgLTAuMCAgICAxICAgLT4gLTAuMAorcmVteDEzNyByZW1haW5kZXIgLTAuMCAgIC0xICAgLT4gLTAuMAorCistLSAwLjVlcnMKK3JlbXgxNDMgcmVtYWluZGVyICAgMC41ICAyICAgICAtPiAgMC41CityZW14MTQ0IHJlbWFpbmRlciAgIDAuNSAgMi4xICAgLT4gIDAuNQorcmVteDE0NSByZW1haW5kZXIgICAwLjUgIDIuMDEgIC0+ICAwLjUwCityZW14MTQ2IHJlbWFpbmRlciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCityZW14MTQ3IHJlbWFpbmRlciAgIDAuNTAgMiAgICAgLT4gIDAuNTAKK3JlbXgxNDggcmVtYWluZGVyICAgMC41MCAyLjAxICAtPiAgMC41MAorcmVteDE0OSByZW1haW5kZXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCistLSBzdGVhZGllcworcmVteDE1MCByZW1haW5kZXIgIDEgIDEgICAtPiAwCityZW14MTUxIHJlbWFpbmRlciAgMSAgMiAgIC0+IDEKK3JlbXgxNTIgcmVtYWluZGVyICAxICAzICAgLT4gMQorcmVteDE1MyByZW1haW5kZXIgIDEgIDQgICAtPiAxCityZW14MTU0IHJlbWFpbmRlciAgMSAgNSAgIC0+IDEKK3JlbXgxNTUgcmVtYWluZGVyICAxICA2ICAgLT4gMQorcmVteDE1NiByZW1haW5kZXIgIDEgIDcgICAtPiAxCityZW14MTU3IHJlbWFpbmRlciAgMSAgOCAgIC0+IDEKK3JlbXgxNTggcmVtYWluZGVyICAxICA5ICAgLT4gMQorcmVteDE1OSByZW1haW5kZXIgIDEgIDEwICAtPiAxCityZW14MTYwIHJlbWFpbmRlciAgMSAgMSAgIC0+IDAKK3JlbXgxNjEgcmVtYWluZGVyICAyICAxICAgLT4gMAorcmVteDE2MiByZW1haW5kZXIgIDMgIDEgICAtPiAwCityZW14MTYzIHJlbWFpbmRlciAgNCAgMSAgIC0+IDAKK3JlbXgxNjQgcmVtYWluZGVyICA1ICAxICAgLT4gMAorcmVteDE2NSByZW1haW5kZXIgIDYgIDEgICAtPiAwCityZW14MTY2IHJlbWFpbmRlciAgNyAgMSAgIC0+IDAKK3JlbXgxNjcgcmVtYWluZGVyICA4ICAxICAgLT4gMAorcmVteDE2OCByZW1haW5kZXIgIDkgIDEgICAtPiAwCityZW14MTY5IHJlbWFpbmRlciAgMTAgMSAgIC0+IDAKKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlck5lYXIKK3JlbXgxNzEgcmVtYWluZGVyICAgMC40ICAxLjAyMCAtPiAgMC40MDAKK3JlbXgxNzIgcmVtYWluZGVyICAgMC41MCAxLjAyMCAtPiAgMC41MDAKK3JlbXgxNzMgcmVtYWluZGVyICAgMC41MSAxLjAyMCAtPiAgMC41MTAKK3JlbXgxNzQgcmVtYWluZGVyICAgMC41MiAxLjAyMCAtPiAgMC41MjAKK3JlbXgxNzUgcmVtYWluZGVyICAgMC42ICAxLjAyMCAtPiAgMC42MDAKKworCistLSBNb3JlIGZsYXZvdXJzIG9mIHJlbWFpbmRlciBieSAwCittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcmVteDIwMSByZW1haW5kZXIgIDAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcmVteDIwMiByZW1haW5kZXIgIDAuMEU1ICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcmVteDIwMyByZW1haW5kZXIgIDAuMDAwICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcmVteDIwNCByZW1haW5kZXIgIDAuMDAwMSAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14MjA1IHJlbWFpbmRlciAgMC4wMSAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgyMDYgcmVtYWluZGVyICAwLjEgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDIwNyByZW1haW5kZXIgIDEgICAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14MjA4IHJlbWFpbmRlciAgMSAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXgyMDkgcmVtYWluZGVyIDEwICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDIxMCByZW1haW5kZXIgMUUrMTAwICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14MjExIHJlbWFpbmRlciAxRSsxMDAwIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gc29tZSBkaWZmZXJlbmNlcyBmcm9tIHJlbWFpbmRlck5lYXIKK3JlbXgyMzEgcmVtYWluZGVyICAtMC40ICAxLjAyMCAtPiAtMC40MDAKK3JlbXgyMzIgcmVtYWluZGVyICAtMC41MCAxLjAyMCAtPiAtMC41MDAKK3JlbXgyMzMgcmVtYWluZGVyICAtMC41MSAxLjAyMCAtPiAtMC41MTAKK3JlbXgyMzQgcmVtYWluZGVyICAtMC41MiAxLjAyMCAtPiAtMC41MjAKK3JlbXgyMzUgcmVtYWluZGVyICAtMC42ICAxLjAyMCAtPiAtMC42MDAKKworLS0gaGlnaCBYcworcmVteDI0MCByZW1haW5kZXIgIDFFKzIgIDEuMDAgIC0+ICAwLjAwCisKKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcmVteDI3MCByZW1haW5kZXIgMSAxZTk5OTk5OTk5OSAgICAtPiAxCityZW14MjcxIHJlbWFpbmRlciAxIDAuOWU5OTk5OTk5OTkgIC0+IDEKK3JlbXgyNzIgcmVtYWluZGVyIDEgMC45OWU5OTk5OTk5OTkgLT4gMQorcmVteDI3MyByZW1haW5kZXIgMSAwLjk5OTk5OTk5OWU5OTk5OTk5OTkgLT4gMQorcmVteDI3NCByZW1haW5kZXIgOWU5OTk5OTk5OTkgICAgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI3NSByZW1haW5kZXIgOS45ZTk5OTk5OTk5OSAgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI3NiByZW1haW5kZXIgOS45OWU5OTk5OTk5OTkgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDI3NyByZW1haW5kZXIgOS45OTk5OTk5OWU5OTk5OTk5OTkgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCityZW14MjgwIHJlbWFpbmRlciAwLjEgOWUtOTk5OTk5OTk5ICAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14MjgxIHJlbWFpbmRlciAwLjEgOTllLTk5OTk5OTk5OSAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14MjgyIHJlbWFpbmRlciAwLjEgOTk5ZS05OTk5OTk5OTkgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKK3JlbXgyODMgcmVtYWluZGVyIDAuMSA5ZS05OTk5OTk5OTggICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgyODQgcmVtYWluZGVyIDAuMSA5OWUtOTk5OTk5OTk4ICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgyODUgcmVtYWluZGVyIDAuMSA5OTllLTk5OTk5OTk5OCAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgyODYgcmVtYWluZGVyIDAuMSA5OTllLTk5OTk5OTk5NyAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgyODcgcmVtYWluZGVyIDAuMSA5OTk5ZS05OTk5OTk5OTcgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXgyODggcmVtYWluZGVyIDAuMSA5OTk5OWUtOTk5OTk5OTk3ICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworLS0gcmVteDN4eCBhcmUgZnJvbSBEaWFnQmlnRGVjaW1hbAorcmVteDMwMSByZW1haW5kZXIgICAxICAgIDMgICAgIC0+ICAxCityZW14MzAyIHJlbWFpbmRlciAgIDUgICAgNSAgICAgLT4gIDAKK3JlbXgzMDMgcmVtYWluZGVyICAgMTMgICAxMCAgICAtPiAgMworcmVteDMwNCByZW1haW5kZXIgICAxMyAgIDUwICAgIC0+ICAxMworcmVteDMwNSByZW1haW5kZXIgICAxMyAgIDEwMCAgIC0+ICAxMworcmVteDMwNiByZW1haW5kZXIgICAxMyAgIDEwMDAgIC0+ICAxMworcmVteDMwNyByZW1haW5kZXIgICAuMTMgICAgMSAgIC0+ICAwLjEzCityZW14MzA4IHJlbWFpbmRlciAgIDAuMTMzICAxICAgLT4gIDAuMTMzCityZW14MzA5IHJlbWFpbmRlciAgIDAuMTAzMyAxICAgLT4gIDAuMTAzMworcmVteDMxMCByZW1haW5kZXIgICAxLjAzMyAgMSAgIC0+ICAwLjAzMworcmVteDMxMSByZW1haW5kZXIgICAxMC4zMyAgMSAgIC0+ICAwLjMzCityZW14MzEyIHJlbWFpbmRlciAgIDEwLjMzIDEwICAgLT4gIDAuMzMKK3JlbXgzMTMgcmVtYWluZGVyICAgMTAzLjMgIDEgICAtPiAgMC4zCityZW14MzE0IHJlbWFpbmRlciAgIDEzMyAgIDEwICAgLT4gIDMKK3JlbXgzMTUgcmVtYWluZGVyICAgMTAzMyAgMTAgICAtPiAgMworcmVteDMxNiByZW1haW5kZXIgICAxMDMzICA1MCAgIC0+ICAzMworcmVteDMxNyByZW1haW5kZXIgICAxMDEuMCAgMyAgIC0+ICAyLjAKK3JlbXgzMTggcmVtYWluZGVyICAgMTAyLjAgIDMgICAtPiAgMC4wCityZW14MzE5IHJlbWFpbmRlciAgIDEwMy4wICAzICAgLT4gIDEuMAorcmVteDMyMCByZW1haW5kZXIgICAyLjQwICAgMSAgIC0+ICAwLjQwCityZW14MzIxIHJlbWFpbmRlciAgIDIuNDAwICAxICAgLT4gIDAuNDAwCityZW14MzIyIHJlbWFpbmRlciAgIDIuNCAgICAxICAgLT4gIDAuNAorcmVteDMyMyByZW1haW5kZXIgICAyLjQgICAgMiAgIC0+ICAwLjQKK3JlbXgzMjQgcmVtYWluZGVyICAgMi40MDAgIDIgICAtPiAgMC40MDAKK3JlbXgzMjUgcmVtYWluZGVyICAgMSAgIDAuMyAgICAtPiAgMC4xCityZW14MzI2IHJlbWFpbmRlciAgIDEgICAwLjMwICAgLT4gIDAuMTAKK3JlbXgzMjcgcmVtYWluZGVyICAgMSAgIDAuMzAwICAtPiAgMC4xMDAKK3JlbXgzMjggcmVtYWluZGVyICAgMSAgIDAuMzAwMCAtPiAgMC4xMDAwCityZW14MzI5IHJlbWFpbmRlciAgIDEuMCAgICAwLjMgLT4gIDAuMQorcmVteDMzMCByZW1haW5kZXIgICAxLjAwICAgMC4zIC0+ICAwLjEwCityZW14MzMxIHJlbWFpbmRlciAgIDEuMDAwICAwLjMgLT4gIDAuMTAwCityZW14MzMyIHJlbWFpbmRlciAgIDEuMDAwMCAwLjMgLT4gIDAuMTAwMAorcmVteDMzMyByZW1haW5kZXIgICAwLjUgIDIgICAgIC0+ICAwLjUKK3JlbXgzMzQgcmVtYWluZGVyICAgMC41ICAyLjEgICAtPiAgMC41CityZW14MzM1IHJlbWFpbmRlciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK3JlbXgzMzYgcmVtYWluZGVyICAgMC41ICAyLjAwMSAtPiAgMC41MDAKK3JlbXgzMzcgcmVtYWluZGVyICAgMC41MCAyICAgICAtPiAgMC41MAorcmVteDMzOCByZW1haW5kZXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCityZW14MzM5IHJlbWFpbmRlciAgIDAuNTAgMi4wMDEgLT4gIDAuNTAwCisKK3JlbXgzNDAgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAxICAgIC0+ICAwLjUwMDAwMDAKK3JlbXgzNDEgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAwMSAgICAtPiAgMC41MDAwMDAwMAorcmVteDM0MiByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAwMSAgICAtPiAgMC41MDAwMDAwMDAKK3JlbXgzNDMgcmVtYWluZGVyICAgMC41ICAgMC41MDAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMCAgUm91bmRlZAorcmVteDM0NCByZW1haW5kZXIgICAwLjUgICAwLjUwMDAwMDAwMDAxICAgIC0+ICAwLjUwMDAwMDAwMCAgUm91bmRlZAorcmVteDM0NSByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTkgICAgLT4gIDFFLTcKK3JlbXgzNDYgcmVtYWluZGVyICAgMC41ICAgMC40OTk5OTk5OSAgICAtPiAgMUUtOAorcmVteDM0NyByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5OSAgICAtPiAgMUUtOQorcmVteDM0OCByZW1haW5kZXIgICAwLjUgICAwLjQ5OTk5OTk5OTkgICAgLT4gIDFFLTEwCityZW14MzQ5IHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OTkgICAgLT4gIDFFLTExCityZW14MzUwIHJlbWFpbmRlciAgIDAuNSAgIDAuNDk5OTk5OTk5OTk5ICAgIC0+ICAxRS0xMgorCityZW14MzUxIHJlbWFpbmRlciAgIDAuMDMgIDcgIC0+ICAwLjAzCityZW14MzUyIHJlbWFpbmRlciAgIDUgICAyICAgIC0+ICAxCityZW14MzUzIHJlbWFpbmRlciAgIDQuMSAgIDIgICAgLT4gIDAuMQorcmVteDM1NCByZW1haW5kZXIgICA0LjAxICAgMiAgICAtPiAgMC4wMQorcmVteDM1NSByZW1haW5kZXIgICA0LjAwMSAgIDIgICAgLT4gIDAuMDAxCityZW14MzU2IHJlbWFpbmRlciAgIDQuMDAwMSAgIDIgICAgLT4gIDAuMDAwMQorcmVteDM1NyByZW1haW5kZXIgICA0LjAwMDAxICAgMiAgICAtPiAgMC4wMDAwMQorcmVteDM1OCByZW1haW5kZXIgICA0LjAwMDAwMSAgIDIgICAgLT4gIDAuMDAwMDAxCityZW14MzU5IHJlbWFpbmRlciAgIDQuMDAwMDAwMSAgIDIgICAgLT4gIDFFLTcKKworcmVteDM2MCByZW1haW5kZXIgICAxLjIgICAwLjczNDUgLT4gIDAuNDY1NQorcmVteDM2MSByZW1haW5kZXIgICAwLjggICAxMiAgICAgLT4gIDAuOAorcmVteDM2MiByZW1haW5kZXIgICAwLjggICAwLjIgICAgLT4gIDAuMAorcmVteDM2MyByZW1haW5kZXIgICAwLjggICAwLjMgICAgLT4gIDAuMgorcmVteDM2NCByZW1haW5kZXIgICAwLjgwMCAgIDEyICAgLT4gIDAuODAwCityZW14MzY1IHJlbWFpbmRlciAgIDAuODAwICAgMS43ICAtPiAgMC44MDAKK3JlbXgzNjYgcmVtYWluZGVyICAgMi40MDAgICAyICAgIC0+ICAwLjQwMAorCitwcmVjaXNpb246IDYKK3JlbXgzNzEgcmVtYWluZGVyICAgMi40MDAgIDIgICAgICAgIC0+ICAwLjQwMAorcHJlY2lzaW9uOiAzCistLSBsb25nIG9wZXJhbmQsIHJvdW5kZWQsIGNhc2UKK3JlbXgzNzIgcmVtYWluZGVyICAgMTIzNDU2Nzg5MDAwMDAgMTJlKzEyIC0+IDMuNDZFKzExIEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAxMjAwMDAwMDAwMDAwMAorCitwcmVjaXNpb246IDUKK3JlbXgzODEgcmVtYWluZGVyIDEyMzQ1ICAxICAgICAgICAgLT4gIDAKK3JlbXgzODIgcmVtYWluZGVyIDEyMzQ1ICAxLjAwMDEgICAgLT4gIDAuNzY1NworcmVteDM4MyByZW1haW5kZXIgMTIzNDUgIDEuMDAxICAgICAtPiAgMC42NjgKK3JlbXgzODQgcmVtYWluZGVyIDEyMzQ1ICAxLjAxICAgICAgLT4gIDAuNzgKK3JlbXgzODUgcmVtYWluZGVyIDEyMzQ1ICAxLjEgICAgICAgLT4gIDAuOAorcmVteDM4NiByZW1haW5kZXIgMTIzNTUgIDQgICAgICAgICAtPiAgMworcmVteDM4NyByZW1haW5kZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMQorcmVteDM4OCByZW1haW5kZXIgMTIzNTUgIDQuMDAwMSAgICAtPiAgMi42OTEyCityZW14Mzg5IHJlbWFpbmRlciAxMjM0NSAgNC4wMDAxICAgIC0+ICAwLjY5MTQKK3JlbXgzOTAgcmVtYWluZGVyIDEyMzQ1ICA0LjkgICAgICAgLT4gIDEuOQorcmVteDM5MSByZW1haW5kZXIgMTIzNDUgIDQuOTkgICAgICAtPiAgNC43MworcmVteDM5MiByZW1haW5kZXIgMTIzNDUgIDQuOTk5ICAgICAtPiAgMi40NjkKK3JlbXgzOTMgcmVtYWluZGVyIDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDAuMjQ2OQorcmVteDM5NCByZW1haW5kZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMAorcmVteDM5NSByZW1haW5kZXIgMTIzNDUgIDUuMDAwMSAgICAtPiAgNC43NTMyCityZW14Mzk2IHJlbWFpbmRlciAxMjM0NSAgNS4wMDEgICAgIC0+ICAyLjUzMgorcmVteDM5NyByZW1haW5kZXIgMTIzNDUgIDUuMDEgICAgICAtPiAgMC4zNgorcmVteDM5OCByZW1haW5kZXIgMTIzNDUgIDUuMSAgICAgICAtPiAgMy4wCisKK3ByZWNpc2lvbjogOQorLS0gdGhlIG5hc3R5IGRpdmlzaW9uLWJ5LTEgY2FzZXMKK3JlbXg0MDEgcmVtYWluZGVyICAgMC41ICAgICAgICAgMSAgIC0+ICAwLjUKK3JlbXg0MDIgcmVtYWluZGVyICAgMC41NSAgICAgICAgMSAgIC0+ICAwLjU1CityZW14NDAzIHJlbWFpbmRlciAgIDAuNTU1ICAgICAgIDEgICAtPiAgMC41NTUKK3JlbXg0MDQgcmVtYWluZGVyICAgMC41NTU1ICAgICAgMSAgIC0+ICAwLjU1NTUKK3JlbXg0MDUgcmVtYWluZGVyICAgMC41NTU1NSAgICAgMSAgIC0+ICAwLjU1NTU1CityZW14NDA2IHJlbWFpbmRlciAgIDAuNTU1NTU1ICAgIDEgICAtPiAgMC41NTU1NTUKK3JlbXg0MDcgcmVtYWluZGVyICAgMC41NTU1NTU1ICAgMSAgIC0+ICAwLjU1NTU1NTUKK3JlbXg0MDggcmVtYWluZGVyICAgMC41NTU1NTU1NSAgMSAgIC0+ICAwLjU1NTU1NTU1CityZW14NDA5IHJlbWFpbmRlciAgIDAuNTU1NTU1NTU1IDEgICAtPiAgMC41NTU1NTU1NTUKKworLS0gemVybyBzaWducworcmVteDY1MCByZW1haW5kZXIgIDEgIDEgLT4gIDAKK3JlbXg2NTEgcmVtYWluZGVyIC0xICAxIC0+IC0wCityZW14NjUyIHJlbWFpbmRlciAgMSAtMSAtPiAgMAorcmVteDY1MyByZW1haW5kZXIgLTEgLTEgLT4gLTAKK3JlbXg2NTQgcmVtYWluZGVyICAwICAxIC0+ICAwCityZW14NjU1IHJlbWFpbmRlciAtMCAgMSAtPiAtMAorcmVteDY1NiByZW1haW5kZXIgIDAgLTEgLT4gIDAKK3JlbXg2NTcgcmVtYWluZGVyIC0wIC0xIC0+IC0wCityZW14NjU4IHJlbWFpbmRlciAgMC4wMCAgMSAgLT4gIDAuMDAKK3JlbXg2NTkgcmVtYWluZGVyIC0wLjAwICAxICAtPiAtMC4wMAorCistLSBTcGVjaWFscworcmVteDY4MCByZW1haW5kZXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg2ODEgcmVtYWluZGVyICBJbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NjgyIHJlbWFpbmRlciAgSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDY4MyByZW1haW5kZXIgIEluZiAgIDAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg2ODQgcmVtYWluZGVyICBJbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14Njg1IHJlbWFpbmRlciAgSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDY4NiByZW1haW5kZXIgIEluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg2ODcgcmVtYWluZGVyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14Njg4IHJlbWFpbmRlciAtMTAwMCAgSW5mICAgLT4gLTEwMDAKK3JlbXg2ODkgcmVtYWluZGVyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NjkxIHJlbWFpbmRlciAtMSAgICAgSW5mICAgLT4gLTEKK3JlbXg2OTIgcmVtYWluZGVyICAwICAgICBJbmYgICAtPiAgMAorcmVteDY5MyByZW1haW5kZXIgLTAgICAgIEluZiAgIC0+IC0wCityZW14Njk0IHJlbWFpbmRlciAgMSAgICAgSW5mICAgLT4gIDEKK3JlbXg2OTUgcmVtYWluZGVyICAxMDAwICBJbmYgICAtPiAgMTAwMAorcmVteDY5NiByZW1haW5kZXIgIEluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcmVteDcwMCByZW1haW5kZXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3MDEgcmVtYWluZGVyIC1JbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NzAyIHJlbWFpbmRlciAtSW5mICAtMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDcwMyByZW1haW5kZXIgLUluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3MDQgcmVtYWluZGVyIC1JbmYgICAwICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NzA1IHJlbWFpbmRlciAtSW5mICAgMSAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDcwNiByZW1haW5kZXIgLUluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3MDcgcmVtYWluZGVyIC1JbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZW14NzA4IHJlbWFpbmRlciAtSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDcwOSByZW1haW5kZXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCityZW14NzEwIHJlbWFpbmRlciAtMSAgICAtSW5mICAgLT4gLTEKK3JlbXg3MTEgcmVtYWluZGVyIC0wICAgIC1JbmYgICAtPiAtMAorcmVteDcxMiByZW1haW5kZXIgIDAgICAgLUluZiAgIC0+ICAwCityZW14NzEzIHJlbWFpbmRlciAgMSAgICAtSW5mICAgLT4gIDEKK3JlbXg3MTQgcmVtYWluZGVyICAxMDAwIC1JbmYgICAtPiAgMTAwMAorcmVteDcxNSByZW1haW5kZXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcmVteDcyMSByZW1haW5kZXIgIE5hTiAtSW5mICAgIC0+ICBOYU4KK3JlbXg3MjIgcmVtYWluZGVyICBOYU4gLTEwMDAgICAtPiAgTmFOCityZW14NzIzIHJlbWFpbmRlciAgTmFOIC0xICAgICAgLT4gIE5hTgorcmVteDcyNCByZW1haW5kZXIgIE5hTiAtMCAgICAgIC0+ICBOYU4KK3JlbXg3MjUgcmVtYWluZGVyIC1OYU4gIDAgICAgICAtPiAtTmFOCityZW14NzI2IHJlbWFpbmRlciAgTmFOICAxICAgICAgLT4gIE5hTgorcmVteDcyNyByZW1haW5kZXIgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK3JlbXg3MjggcmVtYWluZGVyICBOYU4gIEluZiAgICAtPiAgTmFOCityZW14NzI5IHJlbWFpbmRlciAgTmFOIC1OYU4gICAgLT4gIE5hTgorcmVteDczMCByZW1haW5kZXIgLUluZiAgTmFOICAgIC0+ICBOYU4KK3JlbXg3MzEgcmVtYWluZGVyIC0xMDAwIE5hTiAgICAtPiAgTmFOCityZW14NzMyIHJlbWFpbmRlciAtMSAgICBOYU4gICAgLT4gIE5hTgorcmVteDczMyByZW1haW5kZXIgLTAgICAtTmFOICAgIC0+IC1OYU4KK3JlbXg3MzQgcmVtYWluZGVyICAwICAgIE5hTiAgICAtPiAgTmFOCityZW14NzM1IHJlbWFpbmRlciAgMSAgIC1OYU4gICAgLT4gLU5hTgorcmVteDczNiByZW1haW5kZXIgIDEwMDAgTmFOICAgIC0+ICBOYU4KK3JlbXg3MzcgcmVtYWluZGVyICBJbmYgIE5hTiAgICAtPiAgTmFOCisKK3JlbXg3NDEgcmVtYWluZGVyICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc0MiByZW1haW5kZXIgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzQzIHJlbWFpbmRlciAtc05hTiAtMSAgICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NDQgcmVtYWluZGVyICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc0NSByZW1haW5kZXIgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzQ2IHJlbWFpbmRlciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NDcgcmVtYWluZGVyICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc0OSByZW1haW5kZXIgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzUwIHJlbWFpbmRlciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NTEgcmVtYWluZGVyICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc1MiByZW1haW5kZXIgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzUzIHJlbWFpbmRlciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NTQgcmVtYWluZGVyIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc1NSByZW1haW5kZXIgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzU2IHJlbWFpbmRlciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NTcgcmVtYWluZGVyICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc1OCByZW1haW5kZXIgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZW14NzU5IHJlbWFpbmRlciAgSW5mIC1zTmFOICAgLT4gLU5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnaW5nIE5hTnMKK3JlbXg3NjAgcmVtYWluZGVyICBOYU4xICAgTmFONyAgIC0+ICBOYU4xCityZW14NzYxIHJlbWFpbmRlciBzTmFOMiAgIE5hTjggICAtPiAgTmFOMiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDc2MiByZW1haW5kZXIgIE5hTjMgIHNOYU45ICAgLT4gIE5hTjkgSW52YWxpZF9vcGVyYXRpb24KK3JlbXg3NjMgcmVtYWluZGVyIHNOYU40ICBzTmFOMTAgIC0+ICBOYU40IEludmFsaWRfb3BlcmF0aW9uCityZW14NzY0IHJlbWFpbmRlciAgICAxNSAgIE5hTjExICAtPiAgTmFOMTEKK3JlbXg3NjUgcmVtYWluZGVyICBOYU42ICAgTmFOMTIgIC0+ICBOYU42CityZW14NzY2IHJlbWFpbmRlciAgSW5mICAgIE5hTjEzICAtPiAgTmFOMTMKK3JlbXg3NjcgcmVtYWluZGVyICBOYU4xNCAgLUluZiAgIC0+ICBOYU4xNAorcmVteDc2OCByZW1haW5kZXIgICAgMCAgICBOYU4xNSAgLT4gIE5hTjE1CityZW14NzY5IHJlbWFpbmRlciAgTmFOMTYgICAtMCAgICAtPiAgTmFOMTYKKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcmVteDc3MCByZW1haW5kZXIgMSAxZTk5OTk5OTk5OSAgICAtPiAxCityZW14NzcxIHJlbWFpbmRlciAxIDAuOWU5OTk5OTk5OTkgIC0+IDEKK3JlbXg3NzIgcmVtYWluZGVyIDEgMC45OWU5OTk5OTk5OTkgLT4gMQorcmVteDc3MyByZW1haW5kZXIgMSAwLjk5OTk5OTk5OWU5OTk5OTk5OTkgLT4gMQorcmVteDc3NCByZW1haW5kZXIgOWU5OTk5OTk5OTkgICAgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDc3NSByZW1haW5kZXIgOS45ZTk5OTk5OTk5OSAgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDc3NiByZW1haW5kZXIgOS45OWU5OTk5OTk5OTkgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDc3NyByZW1haW5kZXIgOS45OTk5OTk5OWU5OTk5OTk5OTkgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CityZW14ODAxIHJlbWFpbmRlciAxMjM0NTY3ODAwMCAxMDAgLT4gMAorcmVteDgwMiByZW1haW5kZXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK3JlbXg4MDMgcmVtYWluZGVyIDEyMzQ1Njc4MDAgIDEwICAtPiAwCityZW14ODA0IHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAgICAgLT4gMQorcmVteDgwNSByZW1haW5kZXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK3JlbXg4MDYgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MCAgICAtPiAxCityZW14ODA3IHJlbWFpbmRlciAxMjM0NTY3ODkxICAxMCAgLT4gMQorcmVteDgwOCByZW1haW5kZXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK3JlbXg4MDkgcmVtYWluZGVyIDEyMzQ1Njc4OTAxIDEwMCAtPiAxCityZW14ODEwIHJlbWFpbmRlciAxIDEyMzQ1Njc4OTAxICAgLT4gMQorcmVteDgxMSByZW1haW5kZXIgMTIzNDU2Nzg5NiAgMTAgIC0+IDYKK3JlbXg4MTIgcmVtYWluZGVyIDEgMTIzNDU2Nzg5NiAgICAtPiAxCisKK3ByZWNpc2lvbjogMTUKK3JlbXg4MjEgcmVtYWluZGVyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCityZW14ODIyIHJlbWFpbmRlciAxIDEyMzQ1Njc4MDAwICAgLT4gMQorcmVteDgyMyByZW1haW5kZXIgMTIzNDU2NzgwMCAgMTAgIC0+IDAKK3JlbXg4MjQgcmVtYWluZGVyIDEgMTIzNDU2NzgwMCAgICAtPiAxCityZW14ODI1IHJlbWFpbmRlciAxMjM0NTY3ODkwICAxMCAgLT4gMAorcmVteDgyNiByZW1haW5kZXIgMSAxMjM0NTY3ODkwICAgIC0+IDEKK3JlbXg4MjcgcmVtYWluZGVyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCityZW14ODI4IHJlbWFpbmRlciAxIDEyMzQ1Njc4OTEgICAgLT4gMQorcmVteDgyOSByZW1haW5kZXIgMTIzNDU2Nzg5MDEgMTAwIC0+IDEKK3JlbXg4MzAgcmVtYWluZGVyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCityZW14ODMxIHJlbWFpbmRlciAxMjM0NTY3ODk2ICAxMCAgLT4gNgorcmVteDgzMiByZW1haW5kZXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gd29ycmllcyBmcm9tIGRpdmlkZWludAorcHJlY2lzaW9uOiA4CityZW14ODQwIHJlbWFpbmRlciAgMTAwMDAwMDAwLjAgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXg4NDEgcmVtYWluZGVyICAxMDAwMDAwMDAuNCAgIDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDg0MiByZW1haW5kZXIgIDEwMDAwMDAwMC41ICAgMSAgLT4gIE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCityZW14ODQzIHJlbWFpbmRlciAgMTAwMDAwMDAwLjkgICAxICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXg4NDQgcmVtYWluZGVyICAxMDAwMDAwMDAuOTk5IDEgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcHJlY2lzaW9uOiA2CityZW14ODUwIHJlbWFpbmRlciAgMTAwMDAwMDAzICAgICA1ICAtPiAgTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXg4NTEgcmVtYWluZGVyICAxMDAwMDAwMyAgICAgIDUgIC0+ICBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDg1MiByZW1haW5kZXIgIDEwMDAwMDMgICAgICAgNSAgLT4gIDMKK3JlbXg4NTMgcmVtYWluZGVyICAxMDAwMDMgICAgICAgIDUgIC0+ICAzCityZW14ODU0IHJlbWFpbmRlciAgMTAwMDMgICAgICAgICA1ICAtPiAgMworcmVteDg1NSByZW1haW5kZXIgIDEwMDMgICAgICAgICAgNSAgLT4gIDMKK3JlbXg4NTYgcmVtYWluZGVyICAxMDMgICAgICAgICAgIDUgIC0+ICAzCityZW14ODU3IHJlbWFpbmRlciAgMTMgICAgICAgICAgICA1ICAtPiAgMworcmVteDg1OCByZW1haW5kZXIgIDEgICAgICAgICAgICAgNSAgLT4gIDEKKworLS0gVmxhZGltaXIncyBjYXNlcworcmVteDg2MCByZW1haW5kZXIgMTIzLjBlMSAxMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODYxIHJlbWFpbmRlciAxMjMwICAgIDEwMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NjIgcmVtYWluZGVyIDEyLjNlMiAgMTAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg2MyByZW1haW5kZXIgMS4yM2UzICAxMDAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODY0IHJlbWFpbmRlciAxMjNlMSAgIDEwMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NzAgcmVtYWluZGVyIDEyM2UxICAgIDEwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg3MSByZW1haW5kZXIgMTIzZTEgICAgIDEwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODcyIHJlbWFpbmRlciAxMjNlMSAgICAgIDEwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NzMgcmVtYWluZGVyIDEyM2UxICAgICAgIDEwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg3NCByZW1haW5kZXIgMTIzZTEgICAgICAgIDEwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODc1IHJlbWFpbmRlciAxMjNlMSAgICAgICAgIDEwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NzYgcmVtYWluZGVyIDEyM2UxICAgICAgICAgIDEwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg3NyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgIDEwMDAwMDAwMCAtPiAxMjMwCityZW14ODc4IHJlbWFpbmRlciAxMjMwICAgICAgICAgICAgMTAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4NzkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgMTAwMDAwMDAgLT4gMTIzMAorcmVteDg4MCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgMTAwMDAwMCAtPiAxMjMwCityZW14ODgxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgMTAwMDAwIC0+IDEyMzAKK3JlbXg4ODIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgMTAwMDAgLT4gMTIzMAorcmVteDg4MyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgMTAwMCAtPiAgMjMwCityZW14ODg0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgMTAwIC0+ICAgMzAKK3JlbXg4ODUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgMTAgLT4gICAgMAorcmVteDg4NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMSAtPiAgICAwCisKK3JlbXg4ODkgcmVtYWluZGVyIDEyM2UxICAgMjAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg5MCByZW1haW5kZXIgMTIzZTEgICAgMjAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODkxIHJlbWFpbmRlciAxMjNlMSAgICAgMjAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4OTIgcmVtYWluZGVyIDEyM2UxICAgICAgMjAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg5MyByZW1haW5kZXIgMTIzZTEgICAgICAgMjAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14ODk0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgMjAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4OTUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgMjAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDg5NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgMjAwMDAwMDAwMCAtPiAxMjMwCityZW14ODk3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgMjAwMDAwMDAwIC0+IDEyMzAKK3JlbXg4OTkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgMjAwMDAwMDAgLT4gMTIzMAorcmVteDkwMCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgMjAwMDAwMCAtPiAxMjMwCityZW14OTAxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgMjAwMDAwIC0+IDEyMzAKK3JlbXg5MDIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgMjAwMDAgLT4gMTIzMAorcmVteDkwMyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgMjAwMCAtPiAxMjMwCityZW14OTA0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgMjAwIC0+ICAgMzAKK3JlbXg5MDUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgMjAgLT4gICAxMAorcmVteDkwNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgMiAtPiAgICAwCisKK3JlbXg5MDkgcmVtYWluZGVyIDEyM2UxICAgNTAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkxMCByZW1haW5kZXIgMTIzZTEgICAgNTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTExIHJlbWFpbmRlciAxMjNlMSAgICAgNTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MTIgcmVtYWluZGVyIDEyM2UxICAgICAgNTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkxMyByZW1haW5kZXIgMTIzZTEgICAgICAgNTAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTE0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgNTAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MTUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgNTAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkxNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgNTAwMDAwMDAwMCAtPiAxMjMwCityZW14OTE3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgNTAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MTkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgNTAwMDAwMDAgLT4gMTIzMAorcmVteDkyMCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgNTAwMDAwMCAtPiAxMjMwCityZW14OTIxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgNTAwMDAwIC0+IDEyMzAKK3JlbXg5MjIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgNTAwMDAgLT4gMTIzMAorcmVteDkyMyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgNTAwMCAtPiAxMjMwCityZW14OTI0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgNTAwIC0+ICAyMzAKK3JlbXg5MjUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgNTAgLT4gICAzMAorcmVteDkyNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgNSAtPiAgICAwCisKK3JlbXg5MjkgcmVtYWluZGVyIDEyM2UxICAgOTAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkzMCByZW1haW5kZXIgMTIzZTEgICAgOTAwMDAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTMxIHJlbWFpbmRlciAxMjNlMSAgICAgOTAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MzIgcmVtYWluZGVyIDEyM2UxICAgICAgOTAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkzMyByZW1haW5kZXIgMTIzZTEgICAgICAgOTAwMDAwMDAwMDAwMCAtPiAxMjMwCityZW14OTM0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgOTAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MzUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgOTAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDkzNiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgOTAwMDAwMDAwMCAtPiAxMjMwCityZW14OTM3IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgOTAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5MzkgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgOTAwMDAwMDAgLT4gMTIzMAorcmVteDk0MCByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgOTAwMDAwMCAtPiAxMjMwCityZW14OTQxIHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgOTAwMDAwIC0+IDEyMzAKK3JlbXg5NDIgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgOTAwMDAgLT4gMTIzMAorcmVteDk0MyByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgOTAwMCAtPiAxMjMwCityZW14OTQ0IHJlbWFpbmRlciAxMjNlMSAgICAgICAgICAgICAgICAgOTAwIC0+ICAzMzAKK3JlbXg5NDUgcmVtYWluZGVyIDEyM2UxICAgICAgICAgICAgICAgICAgOTAgLT4gICA2MAorcmVteDk0NiByZW1haW5kZXIgMTIzZTEgICAgICAgICAgICAgICAgICAgOSAtPiAgICA2CisKK3JlbXg5NTAgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1MSByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1MiByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5NTMgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1NCByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1NSByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5NTYgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1NyByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorcmVteDk1OCByZW1haW5kZXIgMTIzZTEgICAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIC0+IDEyMzAKK3JlbXg5NTkgcmVtYWluZGVyIDEyM2UxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTIzMAorCityZW14OTYwIHJlbWFpbmRlciAxMjNlMSAgIDE5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK3JlbXg5NjEgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTkwIC0+IDEyMzAKK3JlbXg5NjIgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCityZW14OTYzIHJlbWFpbmRlciAxMjNlMSAgIDE5OTk5OTk5OTk5OTk5OTk5OTkwIC0+IDEyMzAKK3JlbXg5NjQgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK3JlbXg5NjUgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OTk5MCAtPiAxMjMwCityZW14OTY2IHJlbWFpbmRlciAxMjNlMSAgIDE5OTk5OTk5OTk5OTk5OTk5OTk5OTk5IC0+IDEyMzAKK3JlbXg5NjcgcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwIC0+IDEyMzAKK3JlbXg5NjggcmVtYWluZGVyIDEyM2UxICAgMTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSAtPiAxMjMwCityZW14OTY5IHJlbWFpbmRlciAxMjNlMSAgIDE5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkwIC0+IDEyMzAKKworcmVteDk3MCByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAgLT4gMTAKK3JlbXg5NzEgcmVtYWluZGVyIDFlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3MiByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3MyByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAKK3JlbXg5NzQgcmVtYWluZGVyIDFlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3NSByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3NiByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAKK3JlbXg5NzcgcmVtYWluZGVyIDFlMSAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3OCByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCAtPiAxMAorcmVteDk3OSByZW1haW5kZXIgMWUxICAgMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAgLT4gMTAKKworcmVteDk4MCByZW1haW5kZXIgMTIzZTEgMTAwMEU5OTk5OTkgLT4gMS4yM0UrMyAgLS0gMTIzRSsxIGludGVybmFsbHkKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyBbZnJvbSBkaXZpZGVdCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CityZW14OTkwIHJlbWFpbmRlciArMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTk5OTkgLT4gMS4yMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3JlbXg5OTEgcmVtYWluZGVyIDlFKzk5OTk5OTk5OSArMC4yMzQ1Njc4OTAxMjM0NUUtMCAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcmVteDk5MiByZW1haW5kZXIgKzAuMTAwIDlFKzk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IDAuMTAwCityZW14OTkzIHJlbWFpbmRlciA5RS05OTk5OTk5OTkgKzkuMTAwICAgICAgICAgICAgICAgLT4gOUUtOTk5OTk5OTk5CityZW14OTk1IHJlbWFpbmRlciAtMS4yMzQ1Njc4OTAxMjM0NUUtMCA5RSs5OTk5OTk5OTkgLT4gLTEuMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCityZW14OTk2IHJlbWFpbmRlciA5RSs5OTk5OTk5OTkgLTAuODM0NTY3ODkwMTIzNDVFLTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JlbXg5OTcgcmVtYWluZGVyIC0wLjEwMCA5RSs5OTk5OTk5OTkgICAgICAgICAgICAgICAtPiAtMC4xMDAKK3JlbXg5OTggcmVtYWluZGVyIDlFLTk5OTk5OTk5OSAtOS4xMDAgICAgICAgICAgICAgICAtPiA5RS05OTk5OTk5OTkKKworLS0gTnVsbCB0ZXN0cworcmVteDEwMDAgcmVtYWluZGVyIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVteDEwMDEgcmVtYWluZGVyICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JlbWFpbmRlck5lYXIuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcmVtYWluZGVyTmVhci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NjhiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JlbWFpbmRlck5lYXIuZGVjVGVzdApAQCAtMCwwICsxLDU3MiBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByZW1haW5kZXJOZWFyLmRlY1Rlc3QgLS0gZGVjaW1hbCByZW1haW5kZXItbmVhciAoSUVFRSByZW1haW5kZXIpICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiAzODQKK21pbmV4cG9uZW50OiAtMzgzCisKK3JtbngwMDEgcmVtYWluZGVybmVhciAgMSAgICAgMSAgICAtPiAgMAorcm1ueDAwMiByZW1haW5kZXJuZWFyICAyICAgICAxICAgIC0+ICAwCitybW54MDAzIHJlbWFpbmRlcm5lYXIgIDEgICAgIDIgICAgLT4gIDEKK3JtbngwMDQgcmVtYWluZGVybmVhciAgMiAgICAgMiAgICAtPiAgMAorcm1ueDAwNSByZW1haW5kZXJuZWFyICAwICAgICAxICAgIC0+ICAwCitybW54MDA2IHJlbWFpbmRlcm5lYXIgIDAgICAgIDIgICAgLT4gIDAKK3JtbngwMDcgcmVtYWluZGVybmVhciAgMSAgICAgMyAgICAtPiAgMQorcm1ueDAwOCByZW1haW5kZXJuZWFyICAyICAgICAzICAgIC0+IC0xCitybW54MDA5IHJlbWFpbmRlcm5lYXIgIDMgICAgIDMgICAgLT4gIDAKKworcm1ueDAxMCByZW1haW5kZXJuZWFyICAyLjQgICAxICAgIC0+ICAwLjQKK3JtbngwMTEgcmVtYWluZGVybmVhciAgMi40ICAgLTEgICAtPiAgMC40CitybW54MDEyIHJlbWFpbmRlcm5lYXIgIC0yLjQgIDEgICAgLT4gIC0wLjQKK3JtbngwMTMgcmVtYWluZGVybmVhciAgLTIuNCAgLTEgICAtPiAgLTAuNAorcm1ueDAxNCByZW1haW5kZXJuZWFyICAyLjQwICAxICAgIC0+ICAwLjQwCitybW54MDE1IHJlbWFpbmRlcm5lYXIgIDIuNDAwIDEgICAgLT4gIDAuNDAwCitybW54MDE2IHJlbWFpbmRlcm5lYXIgIDIuNCAgIDIgICAgLT4gIDAuNAorcm1ueDAxNyByZW1haW5kZXJuZWFyICAyLjQwMCAyICAgIC0+ICAwLjQwMAorcm1ueDAxOCByZW1haW5kZXJuZWFyICAyLiAgICAyICAgIC0+ICAwCitybW54MDE5IHJlbWFpbmRlcm5lYXIgIDIwICAgIDIwICAgLT4gIDAKKworcm1ueDAyMCByZW1haW5kZXJuZWFyICAxODcgICAxODcgICAgLT4gIDAKK3JtbngwMjEgcmVtYWluZGVybmVhciAgNSAgICAgMiAgICAgIC0+ICAxCitybW54MDIyIHJlbWFpbmRlcm5lYXIgIDUgICAgIDIuMCAgICAtPiAgMS4wCitybW54MDIzIHJlbWFpbmRlcm5lYXIgIDUgICAgIDIuMDAwICAtPiAgMS4wMDAKK3JtbngwMjQgcmVtYWluZGVybmVhciAgNSAgICAgMC4yMDAgIC0+ICAwLjAwMAorcm1ueDAyNSByZW1haW5kZXJuZWFyICA1ICAgICAwLjIwMCAgLT4gIDAuMDAwCisKK3JtbngwMzAgcmVtYWluZGVybmVhciAgMSAgICAgMiAgICAgIC0+ICAxCitybW54MDMxIHJlbWFpbmRlcm5lYXIgIDEgICAgIDQgICAgICAtPiAgMQorcm1ueDAzMiByZW1haW5kZXJuZWFyICAxICAgICA4ICAgICAgLT4gIDEKK3JtbngwMzMgcmVtYWluZGVybmVhciAgMSAgICAgMTYgICAgIC0+ICAxCitybW54MDM0IHJlbWFpbmRlcm5lYXIgIDEgICAgIDMyICAgICAtPiAgMQorcm1ueDAzNSByZW1haW5kZXJuZWFyICAxICAgICA2NCAgICAgLT4gIDEKK3JtbngwNDAgcmVtYWluZGVybmVhciAgMSAgICAtMiAgICAgIC0+ICAxCitybW54MDQxIHJlbWFpbmRlcm5lYXIgIDEgICAgLTQgICAgICAtPiAgMQorcm1ueDA0MiByZW1haW5kZXJuZWFyICAxICAgIC04ICAgICAgLT4gIDEKK3JtbngwNDMgcmVtYWluZGVybmVhciAgMSAgICAtMTYgICAgIC0+ICAxCitybW54MDQ0IHJlbWFpbmRlcm5lYXIgIDEgICAgLTMyICAgICAtPiAgMQorcm1ueDA0NSByZW1haW5kZXJuZWFyICAxICAgIC02NCAgICAgLT4gIDEKK3JtbngwNTAgcmVtYWluZGVybmVhciAtMSAgICAgMiAgICAgIC0+ICAtMQorcm1ueDA1MSByZW1haW5kZXJuZWFyIC0xICAgICA0ICAgICAgLT4gIC0xCitybW54MDUyIHJlbWFpbmRlcm5lYXIgLTEgICAgIDggICAgICAtPiAgLTEKK3JtbngwNTMgcmVtYWluZGVybmVhciAtMSAgICAgMTYgICAgIC0+ICAtMQorcm1ueDA1NCByZW1haW5kZXJuZWFyIC0xICAgICAzMiAgICAgLT4gIC0xCitybW54MDU1IHJlbWFpbmRlcm5lYXIgLTEgICAgIDY0ICAgICAtPiAgLTEKK3JtbngwNjAgcmVtYWluZGVybmVhciAtMSAgICAtMiAgICAgIC0+ICAtMQorcm1ueDA2MSByZW1haW5kZXJuZWFyIC0xICAgIC00ICAgICAgLT4gIC0xCitybW54MDYyIHJlbWFpbmRlcm5lYXIgLTEgICAgLTggICAgICAtPiAgLTEKK3JtbngwNjMgcmVtYWluZGVybmVhciAtMSAgICAtMTYgICAgIC0+ICAtMQorcm1ueDA2NCByZW1haW5kZXJuZWFyIC0xICAgIC0zMiAgICAgLT4gIC0xCitybW54MDY1IHJlbWFpbmRlcm5lYXIgLTEgICAgLTY0ICAgICAtPiAgLTEKKworcm1ueDA2NiByZW1haW5kZXJuZWFyICA5OTk5OTk5OTcgICAgIDEgIC0+IDAKK3JtbngwNjcgcmVtYWluZGVybmVhciAgOTk5OTk5OTk3LjQgICAxICAtPiAwLjQKK3JtbngwNjggcmVtYWluZGVybmVhciAgOTk5OTk5OTk3LjUgICAxICAtPiAtMC41CitybW54MDY5IHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5Ny45ICAgMSAgLT4gLTAuMQorcm1ueDA3MCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTcuOTk5IDEgIC0+IC0wLjAwMQorCitybW54MDcxIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OCAgICAgMSAgLT4gMAorcm1ueDA3MiByZW1haW5kZXJuZWFyICA5OTk5OTk5OTguNCAgIDEgIC0+IDAuNAorcm1ueDA3MyByZW1haW5kZXJuZWFyICA5OTk5OTk5OTguNSAgIDEgIC0+IDAuNQorcm1ueDA3NCByZW1haW5kZXJuZWFyICA5OTk5OTk5OTguOSAgIDEgIC0+IC0wLjEKK3JtbngwNzUgcmVtYWluZGVybmVhciAgOTk5OTk5OTk4Ljk5OSAxICAtPiAtMC4wMDEKKworcm1ueDA3NiByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkgICAgIDEgIC0+IDAKK3JtbngwNzcgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5LjQgICAxICAtPiAwLjQKK3JtbngwNzggcmVtYWluZGVybmVhciAgOTk5OTk5OTk5LjUgICAxICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDA3OSByZW1haW5kZXJuZWFyICA5OTk5OTk5OTkuOSAgIDEgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54MDgwIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OS45OTkgMSAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworcHJlY2lzaW9uOiA2CitybW54MDgxIHJlbWFpbmRlcm5lYXIgIDk5OTk5OTk5OSAgICAgMSAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngwODIgcmVtYWluZGVybmVhciAgOTk5OTk5OTkgICAgICAxICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDA4MyByZW1haW5kZXJuZWFyICA5OTk5OTk5ICAgICAgIDEgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54MDg0IHJlbWFpbmRlcm5lYXIgIDk5OTk5OSAgICAgICAgMSAgLT4gMAorcm1ueDA4NSByZW1haW5kZXJuZWFyICA5OTk5OSAgICAgICAgIDEgIC0+IDAKK3JtbngwODYgcmVtYWluZGVybmVhciAgOTk5OSAgICAgICAgICAxICAtPiAwCitybW54MDg3IHJlbWFpbmRlcm5lYXIgIDk5OSAgICAgICAgICAgMSAgLT4gMAorcm1ueDA4OCByZW1haW5kZXJuZWFyICA5OSAgICAgICAgICAgIDEgIC0+IDAKK3JtbngwODkgcmVtYWluZGVybmVhciAgOSAgICAgICAgICAgICAxICAtPiAwCisKK3ByZWNpc2lvbjogOQorcm1ueDA5MCByZW1haW5kZXJuZWFyICAwLiAgICAgICAgICAgIDEgIC0+IDAKK3JtbngwOTEgcmVtYWluZGVybmVhciAgLjAgICAgICAgICAgICAxICAtPiAwLjAKK3JtbngwOTIgcmVtYWluZGVybmVhciAgMC4wMCAgICAgICAgICAxICAtPiAwLjAwCitybW54MDkzIHJlbWFpbmRlcm5lYXIgIDAuMDBFKzkgICAgICAgMSAgLT4gMAorcm1ueDA5NCByZW1haW5kZXJuZWFyICAwLjAwMDBFLTUwICAgIDEgIC0+IDBFLTU0CisKKworLS0gVmFyaW91cyBmbGF2b3VycyBvZiByZW1haW5kZXJuZWFyIGJ5IDAKK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3JtbngxMDEgcmVtYWluZGVybmVhciAgMCAgICAgICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcm1ueDEwMiByZW1haW5kZXJuZWFyICAwICAgICAgLTAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitybW54MTAzIHJlbWFpbmRlcm5lYXIgLTAgICAgICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JtbngxMDQgcmVtYWluZGVybmVhciAtMCAgICAgIC0wICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcm1ueDEwNSByZW1haW5kZXJuZWFyICAwLjBFNSAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitybW54MTA2IHJlbWFpbmRlcm5lYXIgIDAuMDAwICAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKKy0tIFtTb21lIHRoaW5rIHRoaXMgbmV4dCBncm91cCBzaG91bGQgYmUgRGl2aXNpb25fYnlfemVybyBleGNlcHRpb24sCistLSBidXQgSUVFRSA4NTQgaXMgZXhwbGljaXQgdGhhdCBpdCBpcyBJbnZhbGlkIG9wZXJhdGlvbiAuLiBmb3IKKy0tIHJlbWFpbmRlcm5lYXItbmVhciwgYW55d2F5XQorcm1ueDEwNyByZW1haW5kZXJuZWFyICAwLjAwMDEgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMDggcmVtYWluZGVybmVhciAgMC4wMSAgICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTA5IHJlbWFpbmRlcm5lYXIgIDAuMSAgICAgMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDExMCByZW1haW5kZXJuZWFyICAxICAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMTEgcmVtYWluZGVybmVhciAgMSAgICAgICAwLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTEyIHJlbWFpbmRlcm5lYXIgMTAgICAgICAgMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDExMyByZW1haW5kZXJuZWFyIDFFKzEwMCAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMTQgcmVtYWluZGVybmVhciAxRSsxMDAwICAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTE1IHJlbWFpbmRlcm5lYXIgIDAuMDAwMSAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDExNiByZW1haW5kZXJuZWFyICAwLjAxICAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMTkgcmVtYWluZGVybmVhciAgMC4xICAgIC0wICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTIwIHJlbWFpbmRlcm5lYXIgIDEgICAgICAtMCAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDEyMSByZW1haW5kZXJuZWFyICAxICAgICAgLTAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngxMjIgcmVtYWluZGVybmVhciAxMCAgICAgIC0wLjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54MTIzIHJlbWFpbmRlcm5lYXIgMUUrMTAwICAtMC4wIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDEyNCByZW1haW5kZXJuZWFyIDFFKzEwMDAgLTAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB6ZXJvcyBvbiBsZWZ0CitybW54MTMwIHJlbWFpbmRlcm5lYXIgIDAgICAgICAxICAgLT4gIDAKK3JtbngxMzEgcmVtYWluZGVybmVhciAgMCAgICAgLTEgICAtPiAgMAorcm1ueDEzMiByZW1haW5kZXJuZWFyICAwLjAgICAgMSAgIC0+ICAwLjAKK3JtbngxMzMgcmVtYWluZGVybmVhciAgMC4wICAgLTEgICAtPiAgMC4wCitybW54MTM0IHJlbWFpbmRlcm5lYXIgLTAgICAgICAxICAgLT4gLTAKK3JtbngxMzUgcmVtYWluZGVybmVhciAtMCAgICAgLTEgICAtPiAtMAorcm1ueDEzNiByZW1haW5kZXJuZWFyIC0wLjAgICAgMSAgIC0+IC0wLjAKK3JtbngxMzcgcmVtYWluZGVybmVhciAtMC4wICAgLTEgICAtPiAtMC4wCisKKy0tIDAuNWVycworcm1teDE0MyByZW1haW5kZXJuZWFyICAgMC41ICAyICAgICAtPiAgMC41CitybW14MTQ0IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK3JtbXgxNDUgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK3JtbXgxNDYgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCitybW14MTQ3IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCitybW14MTQ4IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitybW14MTQ5IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCistLSBzb21lIGRpZmZlcmVuY2VzIGZyb20gcmVtYWluZGVyCitybW54MTUwIHJlbWFpbmRlcm5lYXIgICAwLjQgIDEuMDIwIC0+ICAwLjQwMAorcm1ueDE1MSByZW1haW5kZXJuZWFyICAgMC41MCAxLjAyMCAtPiAgMC41MDAKK3JtbngxNTIgcmVtYWluZGVybmVhciAgIDAuNTEgMS4wMjAgLT4gIDAuNTEwCitybW54MTUzIHJlbWFpbmRlcm5lYXIgICAwLjUyIDEuMDIwIC0+IC0wLjUwMAorcm1ueDE1NCByZW1haW5kZXJuZWFyICAgMC42ICAxLjAyMCAtPiAtMC40MjAKK3JtbngxNTUgcmVtYWluZGVybmVhciAgIDAuNDkgMSAgICAgLT4gIDAuNDkKK3JtbngxNTYgcmVtYWluZGVybmVhciAgIDAuNTAgMSAgICAgLT4gIDAuNTAKK3JtbngxNTcgcmVtYWluZGVybmVhciAgIDEuNTAgMSAgICAgLT4gLTAuNTAKK3JtbngxNTggcmVtYWluZGVybmVhciAgIDIuNTAgMSAgICAgLT4gIDAuNTAKK3JtbngxNTkgcmVtYWluZGVybmVhciAgIDkuNTAgMSAgICAgLT4gLTAuNTAKK3JtbngxNjAgcmVtYWluZGVybmVhciAgIDAuNTEgMSAgICAgLT4gLTAuNDkKKworLS0gdGhlIG5hc3R5IGRpdmlzaW9uLWJ5LTEgY2FzZXMKK3JtbngxNjEgcmVtYWluZGVybmVhciAgIDAuNCAgICAgICAgIDEgICAtPiAgMC40CitybW54MTYyIHJlbWFpbmRlcm5lYXIgICAwLjQ1ICAgICAgICAxICAgLT4gIDAuNDUKK3JtbngxNjMgcmVtYWluZGVybmVhciAgIDAuNDU1ICAgICAgIDEgICAtPiAgMC40NTUKK3JtbngxNjQgcmVtYWluZGVybmVhciAgIDAuNDU1NSAgICAgIDEgICAtPiAgMC40NTU1CitybW54MTY1IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1ICAgICAxICAgLT4gIDAuNDU1NTUKK3JtbngxNjYgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1ICAgIDEgICAtPiAgMC40NTU1NTUKK3JtbngxNjcgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NSAgIDEgICAtPiAgMC40NTU1NTU1CitybW54MTY4IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1ICAxICAgLT4gIDAuNDU1NTU1NTUKK3JtbngxNjkgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTU1IDEgICAtPiAgMC40NTU1NTU1NTUKKy0tIHdpdGggc3BpbGwuLi4KK3JtbngxNzEgcmVtYWluZGVybmVhciAgIDAuNSAgICAgICAgIDEgICAtPiAgMC41CitybW54MTcyIHJlbWFpbmRlcm5lYXIgICAwLjU1ICAgICAgICAxICAgLT4gLTAuNDUKK3JtbngxNzMgcmVtYWluZGVybmVhciAgIDAuNTU1ICAgICAgIDEgICAtPiAtMC40NDUKK3JtbngxNzQgcmVtYWluZGVybmVhciAgIDAuNTU1NSAgICAgIDEgICAtPiAtMC40NDQ1CitybW54MTc1IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1ICAgICAxICAgLT4gLTAuNDQ0NDUKK3JtbngxNzYgcmVtYWluZGVybmVhciAgIDAuNTU1NTU1ICAgIDEgICAtPiAtMC40NDQ0NDUKK3JtbngxNzcgcmVtYWluZGVybmVhciAgIDAuNTU1NTU1NSAgIDEgICAtPiAtMC40NDQ0NDQ1CitybW54MTc4IHJlbWFpbmRlcm5lYXIgICAwLjU1NTU1NTU1ICAxICAgLT4gLTAuNDQ0NDQ0NDUKK3JtbngxNzkgcmVtYWluZGVybmVhciAgIDAuNTU1NTU1NTU1IDEgICAtPiAtMC40NDQ0NDQ0NDUKKworLS0gcHJvZ3Jlc3Npb24KK3JtbngxODAgcmVtYWluZGVybmVhciAgMSAgMSAgIC0+IDAKK3JtbngxODEgcmVtYWluZGVybmVhciAgMSAgMiAgIC0+IDEKK3JtbngxODIgcmVtYWluZGVybmVhciAgMSAgMyAgIC0+IDEKK3JtbngxODMgcmVtYWluZGVybmVhciAgMSAgNCAgIC0+IDEKK3JtbngxODQgcmVtYWluZGVybmVhciAgMSAgNSAgIC0+IDEKK3JtbngxODUgcmVtYWluZGVybmVhciAgMSAgNiAgIC0+IDEKK3JtbngxODYgcmVtYWluZGVybmVhciAgMSAgNyAgIC0+IDEKK3JtbngxODcgcmVtYWluZGVybmVhciAgMSAgOCAgIC0+IDEKK3JtbngxODggcmVtYWluZGVybmVhciAgMSAgOSAgIC0+IDEKK3JtbngxODkgcmVtYWluZGVybmVhciAgMSAgMTAgIC0+IDEKK3JtbngxOTAgcmVtYWluZGVybmVhciAgMSAgMSAgIC0+IDAKK3JtbngxOTEgcmVtYWluZGVybmVhciAgMiAgMSAgIC0+IDAKK3JtbngxOTIgcmVtYWluZGVybmVhciAgMyAgMSAgIC0+IDAKK3JtbngxOTMgcmVtYWluZGVybmVhciAgNCAgMSAgIC0+IDAKK3JtbngxOTQgcmVtYWluZGVybmVhciAgNSAgMSAgIC0+IDAKK3JtbngxOTUgcmVtYWluZGVybmVhciAgNiAgMSAgIC0+IDAKK3JtbngxOTYgcmVtYWluZGVybmVhciAgNyAgMSAgIC0+IDAKK3JtbngxOTcgcmVtYWluZGVybmVhciAgOCAgMSAgIC0+IDAKK3JtbngxOTggcmVtYWluZGVybmVhciAgOSAgMSAgIC0+IDAKK3JtbngxOTkgcmVtYWluZGVybmVhciAgMTAgMSAgIC0+IDAKKworCistLSBWYXJpb3VzIGZsYXZvdXJzIG9mIHJlbWFpbmRlcm5lYXIgYnkgMAorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3JtbngyMDEgcmVtYWluZGVybmVhciAgMCAgICAgIDAgICAtPiBOYU4gRGl2aXNpb25fdW5kZWZpbmVkCitybW54MjAyIHJlbWFpbmRlcm5lYXIgIDAuMEU1ICAwICAgLT4gTmFOIERpdmlzaW9uX3VuZGVmaW5lZAorcm1ueDIwMyByZW1haW5kZXJuZWFyICAwLjAwMCAgMCAgIC0+IE5hTiBEaXZpc2lvbl91bmRlZmluZWQKK3JtbngyMDQgcmVtYWluZGVybmVhciAgMC4wMDAxIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngyMDUgcmVtYWluZGVybmVhciAgMC4wMSAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngyMDYgcmVtYWluZGVybmVhciAgMC4xICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngyMDcgcmVtYWluZGVybmVhciAgMSAgICAgIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngyMDggcmVtYWluZGVybmVhciAgMSAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngyMDkgcmVtYWluZGVybmVhciAxMCAgICAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngyMTAgcmVtYWluZGVybmVhciAxRSsxMDAgIDAuMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JtbngyMTEgcmVtYWluZGVybmVhciAxRSsxMDAwIDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gdGVzdHMgZnJvbSB0aGUgZXh0ZW5kZWQgc3BlY2lmaWNhdGlvbgorcm1ueDIyMSByZW1haW5kZXJuZWFyIDIuMSAgICAgMyAgIC0+IC0wLjkKK3JtbngyMjIgcmVtYWluZGVybmVhciAgMTAgICAgIDYgICAtPiAtMgorcm1ueDIyMyByZW1haW5kZXJuZWFyICAxMCAgICAgMyAgIC0+ICAxCitybW54MjI0IHJlbWFpbmRlcm5lYXIgLTEwICAgICAzICAgLT4gLTEKK3JtbngyMjUgcmVtYWluZGVybmVhciAgMTAuMiAgIDEgICAtPiAwLjIKK3JtbngyMjYgcmVtYWluZGVybmVhciAgMTAgICAgIDAuMyAtPiAwLjEKK3JtbngyMjcgcmVtYWluZGVybmVhciAgIDMuNiAgIDEuMyAtPiAtMC4zCisKKy0tIHNvbWUgZGlmZmVyZW5jZXMgZnJvbSByZW1haW5kZXIKK3JtbngyMzEgcmVtYWluZGVybmVhciAgIDAuNCAgMS4wMjAgLT4gIDAuNDAwCitybW54MjMyIHJlbWFpbmRlcm5lYXIgICAwLjUwIDEuMDIwIC0+ICAwLjUwMAorcm1ueDIzMyByZW1haW5kZXJuZWFyICAgMC41MSAxLjAyMCAtPiAgMC41MTAKK3JtbngyMzQgcmVtYWluZGVybmVhciAgIDAuNTIgMS4wMjAgLT4gLTAuNTAwCitybW54MjM1IHJlbWFpbmRlcm5lYXIgICAwLjYgIDEuMDIwIC0+IC0wLjQyMAorCistLSB0ZXN0IHNvbWUgY2FzZXMgdGhhdCBhcmUgY2xvc2UgdG8gZXhwb25lbnQgb3ZlcmZsb3cKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitybW54MjcwIHJlbWFpbmRlcm5lYXIgMSAxZTk5OTk5OTk5OSAgICAtPiAxCitybW54MjcxIHJlbWFpbmRlcm5lYXIgMSAwLjllOTk5OTk5OTk5ICAtPiAxCitybW54MjcyIHJlbWFpbmRlcm5lYXIgMSAwLjk5ZTk5OTk5OTk5OSAtPiAxCitybW54MjczIHJlbWFpbmRlcm5lYXIgMSAwLjk5OTk5OTk5OWU5OTk5OTk5OTkgLT4gMQorcm1ueDI3NCByZW1haW5kZXJuZWFyIDllOTk5OTk5OTk5ICAgICAgICAgIDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngyNzUgcmVtYWluZGVybmVhciA5LjllOTk5OTk5OTk5ICAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54Mjc2IHJlbWFpbmRlcm5lYXIgOS45OWU5OTk5OTk5OTkgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDI3NyByZW1haW5kZXJuZWFyIDkuOTk5OTk5OTllOTk5OTk5OTk5IDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKKworcm1ueDI4MCByZW1haW5kZXJuZWFyIDAuMSA5ZS05OTk5OTk5OTkgICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngyODEgcmVtYWluZGVybmVhciAwLjEgOTllLTk5OTk5OTk5OSAgICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54MjgyIHJlbWFpbmRlcm5lYXIgMC4xIDk5OWUtOTk5OTk5OTk5ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorCitybW54MjgzIHJlbWFpbmRlcm5lYXIgMC4xIDllLTk5OTk5OTk5OCAgICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDI4NCByZW1haW5kZXJuZWFyIDAuMSA5OWUtOTk5OTk5OTk4ICAgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngyODUgcmVtYWluZGVybmVhciAwLjEgOTk5ZS05OTk5OTk5OTggICAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54Mjg2IHJlbWFpbmRlcm5lYXIgMC4xIDk5OWUtOTk5OTk5OTk3ICAgICAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDI4NyByZW1haW5kZXJuZWFyIDAuMSA5OTk5ZS05OTk5OTk5OTcgICAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3JtbngyODggcmVtYWluZGVybmVhciAwLjEgOTk5OTllLTk5OTk5OTk5NyAgIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKy0tIHJtbngzeHggYXJlIGZyb20gRGlhZ0JpZ0RlY2ltYWwKK3JtbngzMDEgcmVtYWluZGVybmVhciAgIDEgICAgMyAgICAgLT4gIDEKK3JtbngzMDIgcmVtYWluZGVybmVhciAgIDUgICAgNSAgICAgLT4gIDAKK3JtbngzMDMgcmVtYWluZGVybmVhciAgIDEzICAgMTAgICAgLT4gIDMKK3JtbngzMDQgcmVtYWluZGVybmVhciAgIDEzICAgNTAgICAgLT4gIDEzCitybW54MzA1IHJlbWFpbmRlcm5lYXIgICAxMyAgIDEwMCAgIC0+ICAxMworcm1ueDMwNiByZW1haW5kZXJuZWFyICAgMTMgICAxMDAwICAtPiAgMTMKK3JtbngzMDcgcmVtYWluZGVybmVhciAgIC4xMyAgICAxICAgLT4gIDAuMTMKK3JtbngzMDggcmVtYWluZGVybmVhciAgIDAuMTMzICAxICAgLT4gIDAuMTMzCitybW54MzA5IHJlbWFpbmRlcm5lYXIgICAwLjEwMzMgMSAgIC0+ICAwLjEwMzMKK3JtbngzMTAgcmVtYWluZGVybmVhciAgIDEuMDMzICAxICAgLT4gIDAuMDMzCitybW54MzExIHJlbWFpbmRlcm5lYXIgICAxMC4zMyAgMSAgIC0+ICAwLjMzCitybW54MzEyIHJlbWFpbmRlcm5lYXIgICAxMC4zMyAxMCAgIC0+ICAwLjMzCitybW54MzEzIHJlbWFpbmRlcm5lYXIgICAxMDMuMyAgMSAgIC0+ICAwLjMKK3JtbngzMTQgcmVtYWluZGVybmVhciAgIDEzMyAgIDEwICAgLT4gIDMKK3JtbngzMTUgcmVtYWluZGVybmVhciAgIDEwMzMgIDEwICAgLT4gIDMKK3JtbngzMTYgcmVtYWluZGVybmVhciAgIDEwMzMgIDUwICAgLT4gLTE3CitybW54MzE3IHJlbWFpbmRlcm5lYXIgICAxMDEuMCAgMyAgIC0+IC0xLjAKK3JtbngzMTggcmVtYWluZGVybmVhciAgIDEwMi4wICAzICAgLT4gIDAuMAorcm1ueDMxOSByZW1haW5kZXJuZWFyICAgMTAzLjAgIDMgICAtPiAgMS4wCitybW54MzIwIHJlbWFpbmRlcm5lYXIgICAyLjQwICAgMSAgIC0+ICAwLjQwCitybW54MzIxIHJlbWFpbmRlcm5lYXIgICAyLjQwMCAgMSAgIC0+ICAwLjQwMAorcm1ueDMyMiByZW1haW5kZXJuZWFyICAgMi40ICAgIDEgICAtPiAgMC40CitybW54MzIzIHJlbWFpbmRlcm5lYXIgICAyLjQgICAgMiAgIC0+ICAwLjQKK3JtbngzMjQgcmVtYWluZGVybmVhciAgIDIuNDAwICAyICAgLT4gIDAuNDAwCitybW54MzI1IHJlbWFpbmRlcm5lYXIgICAxICAgMC4zICAgIC0+ICAwLjEKK3JtbngzMjYgcmVtYWluZGVybmVhciAgIDEgICAwLjMwICAgLT4gIDAuMTAKK3JtbngzMjcgcmVtYWluZGVybmVhciAgIDEgICAwLjMwMCAgLT4gIDAuMTAwCitybW54MzI4IHJlbWFpbmRlcm5lYXIgICAxICAgMC4zMDAwIC0+ICAwLjEwMDAKK3JtbngzMjkgcmVtYWluZGVybmVhciAgIDEuMCAgICAwLjMgLT4gIDAuMQorcm1ueDMzMCByZW1haW5kZXJuZWFyICAgMS4wMCAgIDAuMyAtPiAgMC4xMAorcm1ueDMzMSByZW1haW5kZXJuZWFyICAgMS4wMDAgIDAuMyAtPiAgMC4xMDAKK3JtbngzMzIgcmVtYWluZGVybmVhciAgIDEuMDAwMCAwLjMgLT4gIDAuMTAwMAorcm1ueDMzMyByZW1haW5kZXJuZWFyICAgMC41ICAyICAgICAtPiAgMC41CitybW54MzM0IHJlbWFpbmRlcm5lYXIgICAwLjUgIDIuMSAgIC0+ICAwLjUKK3JtbngzMzUgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMSAgLT4gIDAuNTAKK3JtbngzMzYgcmVtYWluZGVybmVhciAgIDAuNSAgMi4wMDEgLT4gIDAuNTAwCitybW54MzM3IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIgICAgIC0+ICAwLjUwCitybW54MzM4IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDEgIC0+ICAwLjUwCitybW54MzM5IHJlbWFpbmRlcm5lYXIgICAwLjUwIDIuMDAxIC0+ICAwLjUwMAorCitybW54MzQwIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDEgICAgLT4gIC0xRS03CitybW54MzQxIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAxICAgIC0+ICAtMUUtOAorcm1ueDM0MiByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDEgICAgLT4gIC0xRS05CitybW54MzQzIHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjUwMDAwMDAwMDEgICAgLT4gIC0xRS0xMAorcm1ueDM0NCByZW1haW5kZXJuZWFyICAgMC41ICAgMC41MDAwMDAwMDAwMSAgICAtPiAgLTFFLTExCitybW54MzQ1IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTkgICAgLT4gIDFFLTcKK3JtbngzNDYgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTkgICAgLT4gIDFFLTgKK3JtbngzNDcgcmVtYWluZGVybmVhciAgIDAuNSAgIDAuNDk5OTk5OTk5ICAgIC0+ICAxRS05CitybW54MzQ4IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5OTkgICAgLT4gIDFFLTEwCitybW54MzQ5IHJlbWFpbmRlcm5lYXIgICAwLjUgICAwLjQ5OTk5OTk5OTk5ICAgIC0+ICAxRS0xMQorCitybW54MzUwIHJlbWFpbmRlcm5lYXIgICAwLjAzICA3ICAtPiAgMC4wMworcm1ueDM1MSByZW1haW5kZXJuZWFyICAgNSAgIDIgICAgLT4gIDEKK3JtbngzNTIgcmVtYWluZGVybmVhciAgIDQuMSAgIDIgICAgLT4gIDAuMQorcm1ueDM1MyByZW1haW5kZXJuZWFyICAgNC4wMSAgIDIgICAgLT4gIDAuMDEKK3JtbngzNTQgcmVtYWluZGVybmVhciAgIDQuMDAxICAgMiAgICAtPiAgMC4wMDEKK3JtbngzNTUgcmVtYWluZGVybmVhciAgIDQuMDAwMSAgIDIgICAgLT4gIDAuMDAwMQorcm1ueDM1NiByZW1haW5kZXJuZWFyICAgNC4wMDAwMSAgIDIgICAgLT4gIDAuMDAwMDEKK3JtbngzNTcgcmVtYWluZGVybmVhciAgIDQuMDAwMDAxICAgMiAgICAtPiAgMC4wMDAwMDEKK3JtbngzNTggcmVtYWluZGVybmVhciAgIDQuMDAwMDAwMSAgIDIgICAgLT4gIDFFLTcKKworcm1ueDM2MCByZW1haW5kZXJuZWFyICAgMS4yICAgMC43MzQ1IC0+IC0wLjI2OTAKK3JtbngzNjEgcmVtYWluZGVybmVhciAgIDAuOCAgIDEyICAgICAtPiAgMC44CitybW54MzYyIHJlbWFpbmRlcm5lYXIgICAwLjggICAwLjIgICAgLT4gIDAuMAorcm1ueDM2MyByZW1haW5kZXJuZWFyICAgMC44ICAgMC4zICAgIC0+IC0wLjEKK3JtbngzNjQgcmVtYWluZGVybmVhciAgIDAuODAwICAgMTIgICAtPiAgMC44MDAKK3JtbngzNjUgcmVtYWluZGVybmVhciAgIDAuODAwICAgMS43ICAtPiAgMC44MDAKK3JtbngzNjYgcmVtYWluZGVybmVhciAgIDIuNDAwICAgMiAgICAtPiAgMC40MDAKKworcHJlY2lzaW9uOiA2CitybW54MzcxIHJlbWFpbmRlcm5lYXIgICAyLjQwMCAgMiAgICAgICAgLT4gIDAuNDAwCitwcmVjaXNpb246IDMKK3JtbngzNzIgcmVtYWluZGVybmVhciAgIDEyMzQ1Njc4OTAwMDAwIDEyZSsxMiAtPiAzLjQ2RSsxMSBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiA1CitybW54MzgxIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEgICAgICAgICAtPiAgMAorcm1ueDM4MiByZW1haW5kZXJuZWFyIDEyMzQ1ICAxLjAwMDEgICAgLT4gLTAuMjM0NAorcm1ueDM4MyByZW1haW5kZXJuZWFyIDEyMzQ1ICAxLjAwMSAgICAgLT4gLTAuMzMzCitybW54Mzg0IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDEuMDEgICAgICAtPiAtMC4yMworcm1ueDM4NSByZW1haW5kZXJuZWFyIDEyMzQ1ICAxLjEgICAgICAgLT4gLTAuMworcm1ueDM4NiByZW1haW5kZXJuZWFyIDEyMzU1ICA0ICAgICAgICAgLT4gLTEKK3JtbngzODcgcmVtYWluZGVybmVhciAxMjM0NSAgNCAgICAgICAgIC0+ICAxCitybW54Mzg4IHJlbWFpbmRlcm5lYXIgMTIzNTUgIDQuMDAwMSAgICAtPiAtMS4zMDg5CitybW54Mzg5IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuMDAwMSAgICAtPiAgMC42OTE0CitybW54MzkwIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOSAgICAgICAtPiAgMS45CitybW54MzkxIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOTkgICAgICAtPiAtMC4yNgorcm1ueDM5MiByZW1haW5kZXJuZWFyIDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDIuNDY5CitybW54MzkzIHJlbWFpbmRlcm5lYXIgMTIzNDUgIDQuOTk5OSAgICAtPiAgMC4yNDY5CitybW54Mzk0IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUgICAgICAgICAtPiAgMAorcm1ueDM5NSByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAwMDEgICAgLT4gLTAuMjQ2OQorcm1ueDM5NiByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjAwMSAgICAgLT4gLTIuNDY5CitybW54Mzk3IHJlbWFpbmRlcm5lYXIgMTIzNDUgIDUuMDEgICAgICAtPiAgMC4zNgorcm1ueDM5OCByZW1haW5kZXJuZWFyIDEyMzQ1ICA1LjEgICAgICAgLT4gLTIuMQorCitwcmVjaXNpb246IDkKKy0tIHNvbWUgbmFzdHkgZGl2aXNpb24tYnktMSBjYXNlcyBbc29tZSBzaW1pbGFyIGFib3ZlXQorcm1ueDQwMSByZW1haW5kZXJuZWFyICAgMC40ICAgICAgICAgMSAgIC0+ICAwLjQKK3Jtbng0MDIgcmVtYWluZGVybmVhciAgIDAuNDUgICAgICAgIDEgICAtPiAgMC40NQorcm1ueDQwMyByZW1haW5kZXJuZWFyICAgMC40NTUgICAgICAgMSAgIC0+ICAwLjQ1NQorcm1ueDQwNCByZW1haW5kZXJuZWFyICAgMC40NTU1ICAgICAgMSAgIC0+ICAwLjQ1NTUKK3Jtbng0MDUgcmVtYWluZGVybmVhciAgIDAuNDU1NTUgICAgIDEgICAtPiAgMC40NTU1NQorcm1ueDQwNiByZW1haW5kZXJuZWFyICAgMC40NTU1NTUgICAgMSAgIC0+ICAwLjQ1NTU1NQorcm1ueDQwNyByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1ICAgMSAgIC0+ICAwLjQ1NTU1NTUKK3Jtbng0MDggcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTUgIDEgICAtPiAgMC40NTU1NTU1NQorcm1ueDQwOSByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTU1NTU1NQorCistLSBzb21lIHRyaWNreSBMSFNzCitybW54NDIwIHJlbWFpbmRlcm5lYXIgICA5OTk5OTk5OS45OTk5OTk5OTkgICAxRSs4ICAgLT4gLTFFLTkKK3Jtbng0MjEgcmVtYWluZGVybmVhciAgOTk5OTk5OTk5Ljk5OTk5OTk5OSAgIDFFKzkgICAtPiAtMUUtOQorcHJlY2lzaW9uOiA5CitybW54NDMwIHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU1NTU1NTU1CitwcmVjaXNpb246IDgKK3Jtbng0MzEgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTU1IDEgICAtPiAgMC40NTU1NTU1NiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNworcm1ueDQzMiByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTU1NTYgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA2CitybW54NDMzIHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU1NTU2ICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDUKK3Jtbng0MzQgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTU1IDEgICAtPiAgMC40NTU1NiAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNAorcm1ueDQzNSByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjQ1NTYgICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAzCitybW54NDM2IHJlbWFpbmRlcm5lYXIgICAwLjQ1NTU1NTU1NSAxICAgLT4gIDAuNDU2ICAgICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIKK3Jtbng0MzcgcmVtYWluZGVybmVhciAgIDAuNDU1NTU1NTU1IDEgICAtPiAgMC40NiAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorcm1ueDQzOCByZW1haW5kZXJuZWFyICAgMC40NTU1NTU1NTUgMSAgIC0+ICAwLjUgICAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBlYXJseSB0ZXN0czsgZnJvbSB0ZXh0IGRlc2NyaXB0aW9ucworcHJlY2lzaW9uOiA5CitybW54NjAxIHJlbWFpbmRlcm5lYXIgIDEwICAgNiAgLT4gLTIKK3Jtbng2MDIgcmVtYWluZGVybmVhciAtMTAgICA2ICAtPiAyCitybW54NjAzIHJlbWFpbmRlcm5lYXIgIDExICAgMyAgLT4gLTEKK3Jtbng2MDQgcmVtYWluZGVybmVhciAgMTEgICA1ICAtPiAxCitybW54NjA1IHJlbWFpbmRlcm5lYXIgICA3LjcgOCAgLT4gLTAuMworcm1ueDYwNiByZW1haW5kZXJuZWFyICAzMS41IDMgIC0+IDEuNSAgICAtLSBpPTEwCitybW54NjA3IHJlbWFpbmRlcm5lYXIgIDM0LjUgMyAgLT4gLTEuNSAgIC0tIGk9MTEKKworLS0gemVybyBzaWducworcm1ueDY1MCByZW1haW5kZXJuZWFyICAxICAxIC0+ICAwCitybW54NjUxIHJlbWFpbmRlcm5lYXIgLTEgIDEgLT4gLTAKK3Jtbng2NTIgcmVtYWluZGVybmVhciAgMSAtMSAtPiAgMAorcm1ueDY1MyByZW1haW5kZXJuZWFyIC0xIC0xIC0+IC0wCitybW54NjU0IHJlbWFpbmRlcm5lYXIgIDAgIDEgLT4gIDAKK3Jtbng2NTUgcmVtYWluZGVybmVhciAtMCAgMSAtPiAtMAorcm1ueDY1NiByZW1haW5kZXJuZWFyICAwIC0xIC0+ICAwCitybW54NjU3IHJlbWFpbmRlcm5lYXIgLTAgLTEgLT4gLTAKK3Jtbng2NTggcmVtYWluZGVybmVhciAgMC4wMCAgMSAgLT4gIDAuMDAKK3Jtbng2NTkgcmVtYWluZGVybmVhciAtMC4wMCAgMSAgLT4gLTAuMDAKKworLS0gU3BlY2lhbHMKK3Jtbng2ODAgcmVtYWluZGVybmVhciAgSW5mICAtSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDY4MSByZW1haW5kZXJuZWFyICBJbmYgIC0xMDAwICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NjgyIHJlbWFpbmRlcm5lYXIgIEluZiAgLTEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng2ODMgcmVtYWluZGVybmVhciAgSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDY4NCByZW1haW5kZXJuZWFyICBJbmYgIC0wICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54Njg1IHJlbWFpbmRlcm5lYXIgIEluZiAgIDEgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng2ODYgcmVtYWluZGVybmVhciAgSW5mICAgMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDY4NyByZW1haW5kZXJuZWFyICBJbmYgICBJbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54Njg4IHJlbWFpbmRlcm5lYXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitybW54Njg5IHJlbWFpbmRlcm5lYXIgLUluZiAgIEluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng2OTEgcmVtYWluZGVybmVhciAtMSAgICAgSW5mICAgLT4gLTEKK3Jtbng2OTIgcmVtYWluZGVybmVhciAgMCAgICAgSW5mICAgLT4gIDAKK3Jtbng2OTMgcmVtYWluZGVybmVhciAtMCAgICAgSW5mICAgLT4gLTAKK3Jtbng2OTQgcmVtYWluZGVybmVhciAgMSAgICAgSW5mICAgLT4gIDEKK3Jtbng2OTUgcmVtYWluZGVybmVhciAgMTAwMCAgSW5mICAgLT4gIDEwMDAKK3Jtbng2OTYgcmVtYWluZGVybmVhciAgSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCitybW54NzAwIHJlbWFpbmRlcm5lYXIgLUluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3MDEgcmVtYWluZGVybmVhciAtSW5mICAtMTAwMCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDcwMiByZW1haW5kZXJuZWFyIC1JbmYgIC0xICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NzAzIHJlbWFpbmRlcm5lYXIgLUluZiAgLTAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3MDQgcmVtYWluZGVybmVhciAtSW5mICAgMCAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDcwNSByZW1haW5kZXJuZWFyIC1JbmYgICAxICAgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NzA2IHJlbWFpbmRlcm5lYXIgLUluZiAgIDEwMDAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3MDcgcmVtYWluZGVybmVhciAtSW5mICAgSW5mICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDcwOCByZW1haW5kZXJuZWFyIC1JbmYgIC1JbmYgICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitybW54NzA5IHJlbWFpbmRlcm5lYXIgLTEwMDAgIEluZiAgIC0+IC0xMDAwCitybW54NzEwIHJlbWFpbmRlcm5lYXIgLTEgICAgLUluZiAgIC0+IC0xCitybW54NzExIHJlbWFpbmRlcm5lYXIgLTAgICAgLUluZiAgIC0+IC0wCitybW54NzEyIHJlbWFpbmRlcm5lYXIgIDAgICAgLUluZiAgIC0+ICAwCitybW54NzEzIHJlbWFpbmRlcm5lYXIgIDEgICAgLUluZiAgIC0+ICAxCitybW54NzE0IHJlbWFpbmRlcm5lYXIgIDEwMDAgLUluZiAgIC0+ICAxMDAwCitybW54NzE1IHJlbWFpbmRlcm5lYXIgIEluZiAgLUluZiAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcm1ueDcyMSByZW1haW5kZXJuZWFyICBOYU4gLUluZiAgICAtPiAgTmFOCitybW54NzIyIHJlbWFpbmRlcm5lYXIgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK3Jtbng3MjMgcmVtYWluZGVybmVhciAgTmFOIC0xICAgICAgLT4gIE5hTgorcm1ueDcyNCByZW1haW5kZXJuZWFyICBOYU4gLTAgICAgICAtPiAgTmFOCitybW54NzI1IHJlbWFpbmRlcm5lYXIgIE5hTiAgMCAgICAgIC0+ICBOYU4KK3Jtbng3MjYgcmVtYWluZGVybmVhciAgTmFOICAxICAgICAgLT4gIE5hTgorcm1ueDcyNyByZW1haW5kZXJuZWFyICBOYU4gIDEwMDAgICAtPiAgTmFOCitybW54NzI4IHJlbWFpbmRlcm5lYXIgIE5hTiAgSW5mICAgIC0+ICBOYU4KK3Jtbng3MjkgcmVtYWluZGVybmVhciAgTmFOICBOYU4gICAgLT4gIE5hTgorcm1ueDczMCByZW1haW5kZXJuZWFyIC1JbmYgIE5hTiAgICAtPiAgTmFOCitybW54NzMxIHJlbWFpbmRlcm5lYXIgLTEwMDAgTmFOICAgIC0+ICBOYU4KK3Jtbng3MzIgcmVtYWluZGVybmVhciAtMSAgIC1OYU4gICAgLT4gLU5hTgorcm1ueDczMyByZW1haW5kZXJuZWFyIC0wICAgIE5hTiAgICAtPiAgTmFOCitybW54NzM0IHJlbWFpbmRlcm5lYXIgIDAgICAgTmFOICAgIC0+ICBOYU4KK3Jtbng3MzUgcmVtYWluZGVybmVhciAgMSAgICBOYU4gICAgLT4gIE5hTgorcm1ueDczNiByZW1haW5kZXJuZWFyICAxMDAwIE5hTiAgICAtPiAgTmFOCitybW54NzM3IHJlbWFpbmRlcm5lYXIgIEluZiAgTmFOICAgIC0+ICBOYU4KKworcm1ueDc0MSByZW1haW5kZXJuZWFyICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc0MiByZW1haW5kZXJuZWFyICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc0MyByZW1haW5kZXJuZWFyIC1zTmFOIC0xICAgICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc0NCByZW1haW5kZXJuZWFyICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc0NSByZW1haW5kZXJuZWFyICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc0NiByZW1haW5kZXJuZWFyICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc0NyByZW1haW5kZXJuZWFyICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc0OSByZW1haW5kZXJuZWFyICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1MCByZW1haW5kZXJuZWFyICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1MSByZW1haW5kZXJuZWFyICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1MiByZW1haW5kZXJuZWFyIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1MyByZW1haW5kZXJuZWFyIC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1NCByZW1haW5kZXJuZWFyIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1NSByZW1haW5kZXJuZWFyIC0wICAgLXNOYU4gICAtPiAtTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1NiByZW1haW5kZXJuZWFyICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1NyByZW1haW5kZXJuZWFyICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1OCByZW1haW5kZXJuZWFyICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc1OSByZW1haW5kZXJuZWFyICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc2MCByZW1haW5kZXJuZWFyICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdpbmcgTmFOcworcm1ueDc2MSByZW1haW5kZXJuZWFyICBOYU4xICAgTmFONyAgIC0+ICBOYU4xCitybW54NzYyIHJlbWFpbmRlcm5lYXIgc05hTjIgICBOYU44ICAgLT4gIE5hTjIgSW52YWxpZF9vcGVyYXRpb24KK3Jtbng3NjMgcmVtYWluZGVybmVhciAgTmFOMyAtc05hTjkgICAtPiAtTmFOOSBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDc2NCByZW1haW5kZXJuZWFyIHNOYU40ICBzTmFOMTAgIC0+ICBOYU40IEludmFsaWRfb3BlcmF0aW9uCitybW54NzY1IHJlbWFpbmRlcm5lYXIgICAgMTUgICBOYU4xMSAgLT4gIE5hTjExCitybW54NzY2IHJlbWFpbmRlcm5lYXIgIE5hTjYgICBOYU4xMiAgLT4gIE5hTjYKK3Jtbng3NjcgcmVtYWluZGVybmVhciAgSW5mICAgLU5hTjEzICAtPiAtTmFOMTMKK3Jtbng3NjggcmVtYWluZGVybmVhciAgTmFOMTQgIC1JbmYgICAtPiAgTmFOMTQKK3Jtbng3NjkgcmVtYWluZGVybmVhciAgICAwICAgIE5hTjE1ICAtPiAgTmFOMTUKK3Jtbng3NzAgcmVtYWluZGVybmVhciAtTmFOMTYgICAtMCAgICAtPiAtTmFOMTYKKworLS0gdGVzdCBzb21lIGNhc2VzIHRoYXQgYXJlIGNsb3NlIHRvIGV4cG9uZW50IG92ZXJmbG93CittYXhleHBvbmVudDogOTk5OTk5OTk5CittaW5leHBvbmVudDogLTk5OTk5OTk5OQorcm1ueDc4MCByZW1haW5kZXJuZWFyIDEgMWU5OTk5OTk5OTkgICAgLT4gMQorcm1ueDc4MSByZW1haW5kZXJuZWFyIDEgMC45ZTk5OTk5OTk5OSAgLT4gMQorcm1ueDc4MiByZW1haW5kZXJuZWFyIDEgMC45OWU5OTk5OTk5OTkgLT4gMQorcm1ueDc4MyByZW1haW5kZXJuZWFyIDEgMC45OTk5OTk5OTllOTk5OTk5OTk5IC0+IDEKK3Jtbng3ODQgcmVtYWluZGVybmVhciA5ZTk5OTk5OTk5OSAgICAgICAgICAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54Nzg1IHJlbWFpbmRlcm5lYXIgOS45ZTk5OTk5OTk5OSAgICAgICAgMSAtPiBOYU4gRGl2aXNpb25faW1wb3NzaWJsZQorcm1ueDc4NiByZW1haW5kZXJuZWFyIDkuOTllOTk5OTk5OTk5ICAgICAgIDEgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3Jtbng3ODcgcmVtYWluZGVybmVhciA5Ljk5OTk5OTk5ZTk5OTk5OTk5OSAxIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCisKKworLS0gb3ZlcmZsb3cgYW5kIHVuZGVyZmxvdyB0ZXN0cyBbZnJvbSBkaXZpZGVdCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitybW54NzkwIHJlbWFpbmRlcm5lYXIgKzEuMjM0NTY3ODkwMTIzNDVFLTAgOUUrOTk5OTk5OTk5IC0+IDEuMjM0NTY3ODkgSW5leGFjdCBSb3VuZGVkCitybW54NzkxIHJlbWFpbmRlcm5lYXIgOUUrOTk5OTk5OTk5ICswLjIzNDU2Nzg5MDEyMzQ1RS0wIC0+IE5hTiBEaXZpc2lvbl9pbXBvc3NpYmxlCitybW54NzkyIHJlbWFpbmRlcm5lYXIgKzAuMTAwIDlFKzk5OTk5OTk5OSAgICAgICAgICAgICAgIC0+IDAuMTAwCitybW54NzkzIHJlbWFpbmRlcm5lYXIgOUUtOTk5OTk5OTk5ICs5LjEwMCAgICAgICAgICAgICAgIC0+IDlFLTk5OTk5OTk5OQorcm1ueDc5NSByZW1haW5kZXJuZWFyIC0xLjIzNDU2Nzg5MDEyMzQ1RS0wIDlFKzk5OTk5OTk5OSAtPiAtMS4yMzQ1Njc4OSBJbmV4YWN0IFJvdW5kZWQKK3Jtbng3OTYgcmVtYWluZGVybmVhciA5RSs5OTk5OTk5OTkgLTAuODM0NTY3ODkwMTIzNDVFLTAgLT4gTmFOIERpdmlzaW9uX2ltcG9zc2libGUKK3Jtbng3OTcgcmVtYWluZGVybmVhciAtMC4xMDAgOUUrOTk5OTk5OTk5ICAgICAgICAgICAgICAgLT4gLTAuMTAwCitybW54Nzk4IHJlbWFpbmRlcm5lYXIgOUUtOTk5OTk5OTk5IC05LjEwMCAgICAgICAgICAgICAgIC0+IDlFLTk5OTk5OTk5OQorCistLSBsb25nIG9wZXJhbmRzIGNoZWNrcworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogOQorcm1ueDgwMSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCitybW54ODAyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK3Jtbng4MDMgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwICAxMCAgLT4gMAorcm1ueDgwNCByZW1haW5kZXJuZWFyIDEgMTIzNDU2NzgwMCAgICAtPiAxCitybW54ODA1IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK3Jtbng4MDYgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorcm1ueDgwNyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCitybW54ODA4IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK3Jtbng4MDkgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorcm1ueDgxMCByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitybW54ODExIHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5NiAgMTAgIC0+IC00CitybW54ODEyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworcHJlY2lzaW9uOiAxNQorcm1ueDg0MSByZW1haW5kZXJuZWFyIDEyMzQ1Njc4MDAwIDEwMCAtPiAwCitybW54ODQyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODAwMCAgIC0+IDEKK3Jtbng4NDMgcmVtYWluZGVybmVhciAxMjM0NTY3ODAwICAxMCAgLT4gMAorcm1ueDg0NCByZW1haW5kZXJuZWFyIDEgMTIzNDU2NzgwMCAgICAtPiAxCitybW54ODQ1IHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5MCAgMTAgIC0+IDAKK3Jtbng4NDYgcmVtYWluZGVybmVhciAxIDEyMzQ1Njc4OTAgICAgLT4gMQorcm1ueDg0NyByZW1haW5kZXJuZWFyIDEyMzQ1Njc4OTEgIDEwICAtPiAxCitybW54ODQ4IHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODkxICAgIC0+IDEKK3Jtbng4NDkgcmVtYWluZGVybmVhciAxMjM0NTY3ODkwMSAxMDAgLT4gMQorcm1ueDg1MCByZW1haW5kZXJuZWFyIDEgMTIzNDU2Nzg5MDEgICAtPiAxCitybW54ODUxIHJlbWFpbmRlcm5lYXIgMTIzNDU2Nzg5NiAgMTAgIC0+IC00CitybW54ODUyIHJlbWFpbmRlcm5lYXIgMSAxMjM0NTY3ODk2ICAgIC0+IDEKKworLS0gTnVsbCB0ZXN0cworcm1ueDkwMCByZW1haW5kZXJuZWFyIDEwICAjIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcm1ueDkwMSByZW1haW5kZXJuZWFyICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZXNjYWxlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Jlc2NhbGUuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGQ5MzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yZXNjYWxlLmRlY1Rlc3QKQEAgLTAsMCArMSw3NjQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gcmVzY2FsZS5kZWNUZXN0IC0tIGRlY2ltYWwgcmVzY2FsZSBvcGVyYXRpb24gICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMTk4MSwgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCistLSBbb2Jzb2xldGVdICAgUXVhbnRpemUuZGVjVGVzdCBoYXMgdGhlIGltcHJvdmVkIHZlcnNpb24KKworLS0gMjAwNC4wMy4xNSBVbmRlcmZsb3cgZm9yIHF1YW50aXplIGlzIHN1cHByZXNzZWQKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKKworLS0gc2FuaXR5IGNoZWNrcworCityZXN4MDAxIHJlc2NhbGUgMCAgICAgICAwICAgLT4gMAorcmVzeDAwMiByZXNjYWxlIDEgICAgICAgMCAgIC0+IDEKK3Jlc3gwMDMgcmVzY2FsZSAwLjEgICAgKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDAwNSByZXNjYWxlIDAuMSAgICArMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MDA2IHJlc2NhbGUgMC4xICAgICAwICAgLT4gMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMDcgcmVzY2FsZSAwLjEgICAgLTEgICAtPiAwLjEKK3Jlc3gwMDggcmVzY2FsZSAwLjEgICAgLTIgICAtPiAwLjEwCityZXN4MDA5IHJlc2NhbGUgMC4xICAgIC0zICAgLT4gMC4xMDAKK3Jlc3gwMTAgcmVzY2FsZSAwLjkgICAgKzIgICAtPiAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDAxMSByZXNjYWxlIDAuOSAgICArMSAgIC0+IDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MDEyIHJlc2NhbGUgMC45ICAgICswICAgLT4gMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMTMgcmVzY2FsZSAwLjkgICAgLTEgICAtPiAwLjkKK3Jlc3gwMTQgcmVzY2FsZSAwLjkgICAgLTIgICAtPiAwLjkwCityZXN4MDE1IHJlc2NhbGUgMC45ICAgIC0zICAgLT4gMC45MDAKKy0tIG5lZ2F0aXZlcworcmVzeDAyMSByZXNjYWxlIC0wICAgICAgMCAgIC0+IC0wCityZXN4MDIyIHJlc2NhbGUgLTEgICAgICAwICAgLT4gLTEKK3Jlc3gwMjMgcmVzY2FsZSAtMC4xICAgKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMjUgcmVzY2FsZSAtMC4xICAgKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMjYgcmVzY2FsZSAtMC4xICAgIDAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMjcgcmVzY2FsZSAtMC4xICAgLTEgICAtPiAtMC4xCityZXN4MDI4IHJlc2NhbGUgLTAuMSAgIC0yICAgLT4gLTAuMTAKK3Jlc3gwMjkgcmVzY2FsZSAtMC4xICAgLTMgICAtPiAtMC4xMDAKK3Jlc3gwMzAgcmVzY2FsZSAtMC45ICAgKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMzEgcmVzY2FsZSAtMC45ICAgKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMzIgcmVzY2FsZSAtMC45ICAgKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMzMgcmVzY2FsZSAtMC45ICAgLTEgICAtPiAtMC45CityZXN4MDM0IHJlc2NhbGUgLTAuOSAgIC0yICAgLT4gLTAuOTAKK3Jlc3gwMzUgcmVzY2FsZSAtMC45ICAgLTMgICAtPiAtMC45MDAKK3Jlc3gwMzYgcmVzY2FsZSAtMC41ICAgKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMzcgcmVzY2FsZSAtMC41ICAgKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMzggcmVzY2FsZSAtMC41ICAgKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwMzkgcmVzY2FsZSAtMC41ICAgLTEgICAtPiAtMC41CityZXN4MDQwIHJlc2NhbGUgLTAuNSAgIC0yICAgLT4gLTAuNTAKK3Jlc3gwNDEgcmVzY2FsZSAtMC41ICAgLTMgICAtPiAtMC41MDAKK3Jlc3gwNDIgcmVzY2FsZSAtMC45ICAgKzIgICAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwNDMgcmVzY2FsZSAtMC45ICAgKzEgICAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwNDQgcmVzY2FsZSAtMC45ICAgKzAgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwNDUgcmVzY2FsZSAtMC45ICAgLTEgICAtPiAtMC45CityZXN4MDQ2IHJlc2NhbGUgLTAuOSAgIC0yICAgLT4gLTAuOTAKK3Jlc3gwNDcgcmVzY2FsZSAtMC45ICAgLTMgICAtPiAtMC45MDAKKworLS0gZXhhbXBsZXMgZnJvbSBTcGVjaWZpY2F0aW9uCityZXN4MDYwIHJlc2NhbGUgMi4xNyAgIC0zICAgLT4gMi4xNzAKK3Jlc3gwNjEgcmVzY2FsZSAyLjE3ICAgLTIgICAtPiAyLjE3CityZXN4MDYyIHJlc2NhbGUgMi4xNyAgIC0xICAgLT4gMi4yIEluZXhhY3QgUm91bmRlZAorcmVzeDA2MyByZXNjYWxlIDIuMTcgICAgMCAgIC0+IDIgSW5leGFjdCBSb3VuZGVkCityZXN4MDY0IHJlc2NhbGUgMi4xNyAgICsxICAgLT4gMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwNjUgcmVzY2FsZSAyICAgICAgSW5mICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3gwNjYgcmVzY2FsZSAtMC4xICAgIDAgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwNjcgcmVzY2FsZSAtMCAgICAgIDUgICAtPiAtMEUrNQorcmVzeDA2OCByZXNjYWxlICszNTIzNjQ1MC42IC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDA2OSByZXNjYWxlIC0zNTIzNjQ1MC42IC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDA3MCByZXNjYWxlIDIxNyAgICAtMSAgIC0+IDIxNy4wCityZXN4MDcxIHJlc2NhbGUgMjE3ICAgICAwICAgLT4gMjE3CityZXN4MDcyIHJlc2NhbGUgMjE3ICAgICsxICAgLT4gMi4yRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDA3MyByZXNjYWxlIDIxNyAgICArMiAgIC0+IDJFKzIgSW5leGFjdCBSb3VuZGVkCisKKy0tIGdlbmVyYWwgdGVzdHMgLi4KK3Jlc3gwODkgcmVzY2FsZSAxMiAgICAgKzQgICAtPiAwRSs0IEluZXhhY3QgUm91bmRlZAorcmVzeDA5MCByZXNjYWxlIDEyICAgICArMyAgIC0+IDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4MDkxIHJlc2NhbGUgMTIgICAgICsyICAgLT4gMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwOTIgcmVzY2FsZSAxMiAgICAgKzEgICAtPiAxRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDA5MyByZXNjYWxlIDEuMjM0NSAtMiAgIC0+IDEuMjMgSW5leGFjdCBSb3VuZGVkCityZXN4MDk0IHJlc2NhbGUgMS4yMzU1IC0yICAgLT4gMS4yNCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwOTUgcmVzY2FsZSAxLjIzNDUgLTYgICAtPiAxLjIzNDUwMAorcmVzeDA5NiByZXNjYWxlIDkuOTk5OSAtMiAgIC0+IDEwLjAwIEluZXhhY3QgUm91bmRlZAorcmVzeDA5NyByZXNjYWxlIDAuMDAwMSAtMiAgIC0+IDAuMDAgSW5leGFjdCBSb3VuZGVkCityZXN4MDk4IHJlc2NhbGUgMC4wMDEgIC0yICAgLT4gMC4wMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gwOTkgcmVzY2FsZSAwLjAwOSAgLTIgICAtPiAwLjAxIEluZXhhY3QgUm91bmRlZAorcmVzeDEwMCByZXNjYWxlIDkyICAgICArMiAgIC0+IDFFKzIgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3gxMDEgcmVzY2FsZSAtMSAgICAgIDAgICAtPiAgLTEKK3Jlc3gxMDIgcmVzY2FsZSAtMSAgICAgLTEgICAtPiAgLTEuMAorcmVzeDEwMyByZXNjYWxlIC0xICAgICAtMiAgIC0+ICAtMS4wMAorcmVzeDEwNCByZXNjYWxlICAwICAgICAgMCAgIC0+ICAwCityZXN4MTA1IHJlc2NhbGUgIDAgICAgIC0xICAgLT4gIDAuMAorcmVzeDEwNiByZXNjYWxlICAwICAgICAtMiAgIC0+ICAwLjAwCityZXN4MTA3IHJlc2NhbGUgIDAuMDAgICAwICAgLT4gIDAKK3Jlc3gxMDggcmVzY2FsZSAgMCAgICAgKzEgICAtPiAgMEUrMQorcmVzeDEwOSByZXNjYWxlICAwICAgICArMiAgIC0+ICAwRSsyCityZXN4MTEwIHJlc2NhbGUgKzEgICAgICAwICAgLT4gIDEKK3Jlc3gxMTEgcmVzY2FsZSArMSAgICAgLTEgICAtPiAgMS4wCityZXN4MTEyIHJlc2NhbGUgKzEgICAgIC0yICAgLT4gIDEuMDAKKworcmVzeDEyMCByZXNjYWxlICAgMS4wNCAgLTMgLT4gIDEuMDQwCityZXN4MTIxIHJlc2NhbGUgICAxLjA0ICAtMiAtPiAgMS4wNAorcmVzeDEyMiByZXNjYWxlICAgMS4wNCAgLTEgLT4gIDEuMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gxMjMgcmVzY2FsZSAgIDEuMDQgICAwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcmVzeDEyNCByZXNjYWxlICAgMS4wNSAgLTMgLT4gIDEuMDUwCityZXN4MTI1IHJlc2NhbGUgICAxLjA1ICAtMiAtPiAgMS4wNQorcmVzeDEyNiByZXNjYWxlICAgMS4wNSAgLTEgLT4gIDEuMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gxMjcgcmVzY2FsZSAgIDEuMDUgICAwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcmVzeDEyOCByZXNjYWxlICAgMS4wNSAgLTMgLT4gIDEuMDUwCityZXN4MTI5IHJlc2NhbGUgICAxLjA1ICAtMiAtPiAgMS4wNQorcmVzeDEzMCByZXNjYWxlICAgMS4wNSAgLTEgLT4gIDEuMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gxMzEgcmVzY2FsZSAgIDEuMDUgICAwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcmVzeDEzMiByZXNjYWxlICAgMS4wNiAgLTMgLT4gIDEuMDYwCityZXN4MTMzIHJlc2NhbGUgICAxLjA2ICAtMiAtPiAgMS4wNgorcmVzeDEzNCByZXNjYWxlICAgMS4wNiAgLTEgLT4gIDEuMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gxMzUgcmVzY2FsZSAgIDEuMDYgICAwIC0+ICAxIEluZXhhY3QgUm91bmRlZAorCityZXN4MTQwIHJlc2NhbGUgICAtMTAgICAgLTIgIC0+ICAtMTAuMDAKK3Jlc3gxNDEgcmVzY2FsZSAgICsxICAgICAtMiAgLT4gIDEuMDAKK3Jlc3gxNDIgcmVzY2FsZSAgICsxMCAgICAtMiAgLT4gIDEwLjAwCityZXN4MTQzIHJlc2NhbGUgICAxRSsxMCAgLTIgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3gxNDQgcmVzY2FsZSAgIDFFLTEwICAtMiAgLT4gIDAuMDAgSW5leGFjdCBSb3VuZGVkCityZXN4MTQ1IHJlc2NhbGUgICAxRS0zICAgLTIgIC0+ICAwLjAwIEluZXhhY3QgUm91bmRlZAorcmVzeDE0NiByZXNjYWxlICAgMUUtMiAgIC0yICAtPiAgMC4wMQorcmVzeDE0NyByZXNjYWxlICAgMUUtMSAgIC0yICAtPiAgMC4xMAorcmVzeDE0OCByZXNjYWxlICAgMEUtMTAgIC0yICAtPiAgMC4wMAorCityZXN4MTUwIHJlc2NhbGUgICAxLjA2MDAgLTUgLT4gIDEuMDYwMDAKK3Jlc3gxNTEgcmVzY2FsZSAgIDEuMDYwMCAtNCAtPiAgMS4wNjAwCityZXN4MTUyIHJlc2NhbGUgICAxLjA2MDAgLTMgLT4gIDEuMDYwIFJvdW5kZWQKK3Jlc3gxNTMgcmVzY2FsZSAgIDEuMDYwMCAtMiAtPiAgMS4wNiBSb3VuZGVkCityZXN4MTU0IHJlc2NhbGUgICAxLjA2MDAgLTEgLT4gIDEuMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gxNTUgcmVzY2FsZSAgIDEuMDYwMCAgMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworLS0gK3ZlIGV4cG9uZW50cyAuLgorcmVzeDIwMSByZXNjYWxlICAgLTEgICArMCAtPiAgLTEKK3Jlc3gyMDIgcmVzY2FsZSAgIC0xICAgKzEgLT4gIC0wRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDIwMyByZXNjYWxlICAgLTEgICArMiAtPiAgLTBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjA0IHJlc2NhbGUgICAgMCAgICswIC0+ICAwCityZXN4MjA1IHJlc2NhbGUgICAgMCAgICsxIC0+ICAwRSsxCityZXN4MjA2IHJlc2NhbGUgICAgMCAgICsyIC0+ICAwRSsyCityZXN4MjA3IHJlc2NhbGUgICArMSAgICswIC0+ICAxCityZXN4MjA4IHJlc2NhbGUgICArMSAgICsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDIwOSByZXNjYWxlICAgKzEgICArMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDIyMCByZXNjYWxlICAgMS4wNCArMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMjEgcmVzY2FsZSAgIDEuMDQgKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjIyIHJlc2NhbGUgICAxLjA0ICsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDIyMyByZXNjYWxlICAgMS4wNCArMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMjQgcmVzY2FsZSAgIDEuMDUgKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4MjI1IHJlc2NhbGUgICAxLjA1ICsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDIyNiByZXNjYWxlICAgMS4wNSArMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMjcgcmVzY2FsZSAgIDEuMDUgKzAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCityZXN4MjI4IHJlc2NhbGUgICAxLjA1ICszIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcmVzeDIyOSByZXNjYWxlICAgMS4wNSArMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMzAgcmVzY2FsZSAgIDEuMDUgKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjMxIHJlc2NhbGUgICAxLjA1ICswIC0+ICAxIEluZXhhY3QgUm91bmRlZAorcmVzeDIzMiByZXNjYWxlICAgMS4wNiArMyAtPiAgMEUrMyBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gyMzMgcmVzY2FsZSAgIDEuMDYgKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MjM0IHJlc2NhbGUgICAxLjA2ICsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDIzNSByZXNjYWxlICAgMS4wNiArMCAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDI0MCByZXNjYWxlICAgLTEwICAgKzEgIC0+ICAtMUUrMSBSb3VuZGVkCityZXN4MjQxIHJlc2NhbGUgICArMSAgICArMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjQyIHJlc2NhbGUgICArMTAgICArMSAgLT4gIDFFKzEgUm91bmRlZAorcmVzeDI0MyByZXNjYWxlICAgMUUrMSAgKzEgIC0+ICAxRSsxICAgICAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3Jlc3gyNDQgcmVzY2FsZSAgIDFFKzIgICsxICAtPiAgMS4wRSsyICAgICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCityZXN4MjQ1IHJlc2NhbGUgICAxRSszICArMSAgLT4gIDEuMDBFKzMgICAgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcmVzeDI0NiByZXNjYWxlICAgMUUrNCAgKzEgIC0+ICAxLjAwMEUrNCAgICAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3Jlc3gyNDcgcmVzY2FsZSAgIDFFKzUgICsxICAtPiAgMS4wMDAwRSs1ICAgICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCityZXN4MjQ4IHJlc2NhbGUgICAxRSs2ICArMSAgLT4gIDEuMDAwMDBFKzYgICAgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorcmVzeDI0OSByZXNjYWxlICAgMUUrNyAgKzEgIC0+ICAxLjAwMDAwMEUrNyAgIC0tIHVuZGVybmVhdGggdGhpcyBpcyBFKzEKK3Jlc3gyNTAgcmVzY2FsZSAgIDFFKzggICsxICAtPiAgMS4wMDAwMDAwRSs4ICAtLSB1bmRlcm5lYXRoIHRoaXMgaXMgRSsxCityZXN4MjUxIHJlc2NhbGUgICAxRSs5ICArMSAgLT4gIDEuMDAwMDAwMDBFKzkgLS0gdW5kZXJuZWF0aCB0aGlzIGlzIEUrMQorLS0gbmV4dCBvbmUgdHJpZXMgdG8gYWRkIDkgemVyb3MKK3Jlc3gyNTIgcmVzY2FsZSAgIDFFKzEwICsxICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4MjUzIHJlc2NhbGUgICAxRS0xMCArMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjU0IHJlc2NhbGUgICAxRS0yICArMSAgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MjU1IHJlc2NhbGUgICAwRS0xMCArMSAgLT4gIDBFKzEKK3Jlc3gyNTYgcmVzY2FsZSAgLTBFLTEwICsxICAtPiAtMEUrMQorcmVzeDI1NyByZXNjYWxlICAtMEUtMSAgKzEgIC0+IC0wRSsxCityZXN4MjU4IHJlc2NhbGUgIC0wICAgICArMSAgLT4gLTBFKzEKK3Jlc3gyNTkgcmVzY2FsZSAgLTBFKzEgICsxICAtPiAtMEUrMQorCityZXN4MjYwIHJlc2NhbGUgICAtMTAgICArMiAgLT4gIC0wRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDI2MSByZXNjYWxlICAgKzEgICAgKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDI2MiByZXNjYWxlICAgKzEwICAgKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDI2MyByZXNjYWxlICAgMUUrMSAgKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDI2NCByZXNjYWxlICAgMUUrMiAgKzIgIC0+ICAxRSsyCityZXN4MjY1IHJlc2NhbGUgICAxRSszICArMiAgLT4gIDEuMEUrMworcmVzeDI2NiByZXNjYWxlICAgMUUrNCAgKzIgIC0+ICAxLjAwRSs0CityZXN4MjY3IHJlc2NhbGUgICAxRSs1ICArMiAgLT4gIDEuMDAwRSs1CityZXN4MjY4IHJlc2NhbGUgICAxRSs2ICArMiAgLT4gIDEuMDAwMEUrNgorcmVzeDI2OSByZXNjYWxlICAgMUUrNyAgKzIgIC0+ICAxLjAwMDAwRSs3CityZXN4MjcwIHJlc2NhbGUgICAxRSs4ICArMiAgLT4gIDEuMDAwMDAwRSs4CityZXN4MjcxIHJlc2NhbGUgICAxRSs5ICArMiAgLT4gIDEuMDAwMDAwMEUrOQorcmVzeDI3MiByZXNjYWxlICAgMUUrMTAgKzIgIC0+ICAxLjAwMDAwMDAwRSsxMAorcmVzeDI3MyByZXNjYWxlICAgMUUtMTAgKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDI3NCByZXNjYWxlICAgMUUtMiAgKzIgIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorcmVzeDI3NSByZXNjYWxlICAgMEUtMTAgKzIgIC0+ICAwRSsyCisKK3Jlc3gyODAgcmVzY2FsZSAgIC0xMCAgICszICAtPiAgLTBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4MjgxIHJlc2NhbGUgICArMSAgICArMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4MjgyIHJlc2NhbGUgICArMTAgICArMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4MjgzIHJlc2NhbGUgICAxRSsxICArMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4Mjg0IHJlc2NhbGUgICAxRSsyICArMyAgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCityZXN4Mjg1IHJlc2NhbGUgICAxRSszICArMyAgLT4gIDFFKzMKK3Jlc3gyODYgcmVzY2FsZSAgIDFFKzQgICszICAtPiAgMS4wRSs0CityZXN4Mjg3IHJlc2NhbGUgICAxRSs1ICArMyAgLT4gIDEuMDBFKzUKK3Jlc3gyODggcmVzY2FsZSAgIDFFKzYgICszICAtPiAgMS4wMDBFKzYKK3Jlc3gyODkgcmVzY2FsZSAgIDFFKzcgICszICAtPiAgMS4wMDAwRSs3CityZXN4MjkwIHJlc2NhbGUgICAxRSs4ICArMyAgLT4gIDEuMDAwMDBFKzgKK3Jlc3gyOTEgcmVzY2FsZSAgIDFFKzkgICszICAtPiAgMS4wMDAwMDBFKzkKK3Jlc3gyOTIgcmVzY2FsZSAgIDFFKzEwICszICAtPiAgMS4wMDAwMDAwRSsxMAorcmVzeDI5MyByZXNjYWxlICAgMUUtMTAgKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcmVzeDI5NCByZXNjYWxlICAgMUUtMiAgKzMgIC0+ICAwRSszIEluZXhhY3QgUm91bmRlZAorcmVzeDI5NSByZXNjYWxlICAgMEUtMTAgKzMgIC0+ICAwRSszCisKKy0tIHJvdW5kIHVwIGZyb20gYmVsb3cgW3NpZ24gd3JvbmcgaW4gSklUIGNvbXBpbGVyIG9uY2VdCityZXN4MzAwIHJlc2NhbGUgICAwLjAwNzggLTUgLT4gIDAuMDA3ODAKK3Jlc3gzMDEgcmVzY2FsZSAgIDAuMDA3OCAtNCAtPiAgMC4wMDc4CityZXN4MzAyIHJlc2NhbGUgICAwLjAwNzggLTMgLT4gIDAuMDA4IEluZXhhY3QgUm91bmRlZAorcmVzeDMwMyByZXNjYWxlICAgMC4wMDc4IC0yIC0+ICAwLjAxIEluZXhhY3QgUm91bmRlZAorcmVzeDMwNCByZXNjYWxlICAgMC4wMDc4IC0xIC0+ICAwLjAgSW5leGFjdCBSb3VuZGVkCityZXN4MzA1IHJlc2NhbGUgICAwLjAwNzggIDAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCityZXN4MzA2IHJlc2NhbGUgICAwLjAwNzggKzEgLT4gIDBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MzA3IHJlc2NhbGUgICAwLjAwNzggKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3gzMTAgcmVzY2FsZSAgLTAuMDA3OCAtNSAtPiAtMC4wMDc4MAorcmVzeDMxMSByZXNjYWxlICAtMC4wMDc4IC00IC0+IC0wLjAwNzgKK3Jlc3gzMTIgcmVzY2FsZSAgLTAuMDA3OCAtMyAtPiAtMC4wMDggSW5leGFjdCBSb3VuZGVkCityZXN4MzEzIHJlc2NhbGUgIC0wLjAwNzggLTIgLT4gLTAuMDEgSW5leGFjdCBSb3VuZGVkCityZXN4MzE0IHJlc2NhbGUgIC0wLjAwNzggLTEgLT4gLTAuMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMTUgcmVzY2FsZSAgLTAuMDA3OCAgMCAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMTYgcmVzY2FsZSAgLTAuMDA3OCArMSAtPiAtMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMTcgcmVzY2FsZSAgLTAuMDA3OCArMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDMyMCByZXNjYWxlICAgMC4wNzggLTUgLT4gIDAuMDc4MDAKK3Jlc3gzMjEgcmVzY2FsZSAgIDAuMDc4IC00IC0+ICAwLjA3ODAKK3Jlc3gzMjIgcmVzY2FsZSAgIDAuMDc4IC0zIC0+ICAwLjA3OAorcmVzeDMyMyByZXNjYWxlICAgMC4wNzggLTIgLT4gIDAuMDggSW5leGFjdCBSb3VuZGVkCityZXN4MzI0IHJlc2NhbGUgICAwLjA3OCAtMSAtPiAgMC4xIEluZXhhY3QgUm91bmRlZAorcmVzeDMyNSByZXNjYWxlICAgMC4wNzggIDAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCityZXN4MzI2IHJlc2NhbGUgICAwLjA3OCArMSAtPiAgMEUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMjcgcmVzY2FsZSAgIDAuMDc4ICsyIC0+ICAwRSsyIEluZXhhY3QgUm91bmRlZAorCityZXN4MzMwIHJlc2NhbGUgIC0wLjA3OCAtNSAtPiAtMC4wNzgwMAorcmVzeDMzMSByZXNjYWxlICAtMC4wNzggLTQgLT4gLTAuMDc4MAorcmVzeDMzMiByZXNjYWxlICAtMC4wNzggLTMgLT4gLTAuMDc4CityZXN4MzMzIHJlc2NhbGUgIC0wLjA3OCAtMiAtPiAtMC4wOCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMzQgcmVzY2FsZSAgLTAuMDc4IC0xIC0+IC0wLjEgSW5leGFjdCBSb3VuZGVkCityZXN4MzM1IHJlc2NhbGUgIC0wLjA3OCAgMCAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzMzYgcmVzY2FsZSAgLTAuMDc4ICsxIC0+IC0wRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDMzNyByZXNjYWxlICAtMC4wNzggKzIgLT4gLTBFKzIgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3gzNDAgcmVzY2FsZSAgIDAuNzggLTUgLT4gIDAuNzgwMDAKK3Jlc3gzNDEgcmVzY2FsZSAgIDAuNzggLTQgLT4gIDAuNzgwMAorcmVzeDM0MiByZXNjYWxlICAgMC43OCAtMyAtPiAgMC43ODAKK3Jlc3gzNDMgcmVzY2FsZSAgIDAuNzggLTIgLT4gIDAuNzgKK3Jlc3gzNDQgcmVzY2FsZSAgIDAuNzggLTEgLT4gIDAuOCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNDUgcmVzY2FsZSAgIDAuNzggIDAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCityZXN4MzQ2IHJlc2NhbGUgICAwLjc4ICsxIC0+ICAwRSsxIEluZXhhY3QgUm91bmRlZAorcmVzeDM0NyByZXNjYWxlICAgMC43OCArMiAtPiAgMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDM1MCByZXNjYWxlICAtMC43OCAtNSAtPiAtMC43ODAwMAorcmVzeDM1MSByZXNjYWxlICAtMC43OCAtNCAtPiAtMC43ODAwCityZXN4MzUyIHJlc2NhbGUgIC0wLjc4IC0zIC0+IC0wLjc4MAorcmVzeDM1MyByZXNjYWxlICAtMC43OCAtMiAtPiAtMC43OAorcmVzeDM1NCByZXNjYWxlICAtMC43OCAtMSAtPiAtMC44IEluZXhhY3QgUm91bmRlZAorcmVzeDM1NSByZXNjYWxlICAtMC43OCAgMCAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNTYgcmVzY2FsZSAgLTAuNzggKzEgLT4gLTBFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MzU3IHJlc2NhbGUgIC0wLjc4ICsyIC0+IC0wRSsyIEluZXhhY3QgUm91bmRlZAorCityZXN4MzYwIHJlc2NhbGUgICA3LjggLTUgLT4gIDcuODAwMDAKK3Jlc3gzNjEgcmVzY2FsZSAgIDcuOCAtNCAtPiAgNy44MDAwCityZXN4MzYyIHJlc2NhbGUgICA3LjggLTMgLT4gIDcuODAwCityZXN4MzYzIHJlc2NhbGUgICA3LjggLTIgLT4gIDcuODAKK3Jlc3gzNjQgcmVzY2FsZSAgIDcuOCAtMSAtPiAgNy44CityZXN4MzY1IHJlc2NhbGUgICA3LjggIDAgLT4gIDggSW5leGFjdCBSb3VuZGVkCityZXN4MzY2IHJlc2NhbGUgICA3LjggKzEgLT4gIDFFKzEgSW5leGFjdCBSb3VuZGVkCityZXN4MzY3IHJlc2NhbGUgICA3LjggKzIgLT4gIDBFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4MzY4IHJlc2NhbGUgICA3LjggKzMgLT4gIDBFKzMgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3gzNzAgcmVzY2FsZSAgLTcuOCAtNSAtPiAtNy44MDAwMAorcmVzeDM3MSByZXNjYWxlICAtNy44IC00IC0+IC03LjgwMDAKK3Jlc3gzNzIgcmVzY2FsZSAgLTcuOCAtMyAtPiAtNy44MDAKK3Jlc3gzNzMgcmVzY2FsZSAgLTcuOCAtMiAtPiAtNy44MAorcmVzeDM3NCByZXNjYWxlICAtNy44IC0xIC0+IC03LjgKK3Jlc3gzNzUgcmVzY2FsZSAgLTcuOCAgMCAtPiAtOCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNzYgcmVzY2FsZSAgLTcuOCArMSAtPiAtMUUrMSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNzcgcmVzY2FsZSAgLTcuOCArMiAtPiAtMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzNzggcmVzY2FsZSAgLTcuOCArMyAtPiAtMEUrMyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBpbmRpdmlkdWFscworcHJlY2lzaW9uOiA5CityZXN4MzgwIHJlc2NhbGUgICAzNTIzNjQuNTA2IC0yIC0+IDM1MjM2NC41MSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzODEgcmVzY2FsZSAgIDM1MjM2NDUuMDYgLTIgLT4gMzUyMzY0NS4wNgorcmVzeDM4MiByZXNjYWxlICAgMzUyMzY0NTAuNiAtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3gzODMgcmVzY2FsZSAgIDM1MjM2NDUwNiAgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Mzg0IHJlc2NhbGUgIC0zNTIzNjQuNTA2IC0yIC0+IC0zNTIzNjQuNTEgSW5leGFjdCBSb3VuZGVkCityZXN4Mzg1IHJlc2NhbGUgIC0zNTIzNjQ1LjA2IC0yIC0+IC0zNTIzNjQ1LjA2CityZXN4Mzg2IHJlc2NhbGUgIC0zNTIzNjQ1MC42IC0yIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDM4NyByZXNjYWxlICAtMzUyMzY0NTA2ICAtMiAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcm91bmRpbmc6IGRvd24KK3Jlc3gzODkgcmVzY2FsZSAgIDM1MjM2NDUwLjYgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSA/IHNob3VsZCB0aGF0IG9uZSBpbnN0ZWFkIGhhdmUgYmVlbjoKKy0tIHJlc3gzODkgcmVzY2FsZSAgIDM1MjM2NDUwLjYgLTIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3VuZGluZzogaGFsZl91cAorCistLSBhbmQgYSBmZXcgbW9yZSBmcm9tIGUtbWFpbCBkaXNjdXNzaW9ucworcHJlY2lzaW9uOiA3CityZXN4MzkxIHJlc2NhbGUgIDEyLjM0NTY3ICAtMyAtPiAxMi4zNDYgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3gzOTIgcmVzY2FsZSAgMTIzLjQ1NjcgIC0zIC0+IDEyMy40NTcgIEluZXhhY3QgUm91bmRlZAorcmVzeDM5MyByZXNjYWxlICAxMjM0LjU2NyAgLTMgLT4gMTIzNC41NjcKK3Jlc3gzOTQgcmVzY2FsZSAgMTIzNDUuNjcgIC0zIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDM5NSByZXNjYWxlICAxMjM0NTYuNyAgLTMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Mzk2IHJlc2NhbGUgIDEyMzQ1NjcuICAtMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gc29tZSA5OTk5IHJvdW5kLXVwIGNhc2VzCitwcmVjaXNpb246IDkKK3Jlc3g0MDAgcmVzY2FsZSAgIDkuOTk5ICAgICAgICAtNSAgLT4gIDkuOTk5MDAKK3Jlc3g0MDEgcmVzY2FsZSAgIDkuOTk5ICAgICAgICAtNCAgLT4gIDkuOTk5MAorcmVzeDQwMiByZXNjYWxlICAgOS45OTkgICAgICAgIC0zICAtPiAgOS45OTkKK3Jlc3g0MDMgcmVzY2FsZSAgIDkuOTk5ICAgICAgICAtMiAgLT4gMTAuMDAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQwNCByZXNjYWxlICAgOS45OTkgICAgICAgIC0xICAtPiAxMC4wICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDA1IHJlc2NhbGUgICA5Ljk5OSAgICAgICAgIDAgIC0+IDEwICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MDYgcmVzY2FsZSAgIDkuOTk5ICAgICAgICAgMSAgLT4gMUUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQwNyByZXNjYWxlICAgOS45OTkgICAgICAgICAyICAtPiAwRSsyICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3g0MTAgcmVzY2FsZSAgIDAuOTk5ICAgICAgICAtNSAgLT4gIDAuOTk5MDAKK3Jlc3g0MTEgcmVzY2FsZSAgIDAuOTk5ICAgICAgICAtNCAgLT4gIDAuOTk5MAorcmVzeDQxMiByZXNjYWxlICAgMC45OTkgICAgICAgIC0zICAtPiAgMC45OTkKK3Jlc3g0MTMgcmVzY2FsZSAgIDAuOTk5ICAgICAgICAtMiAgLT4gIDEuMDAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQxNCByZXNjYWxlICAgMC45OTkgICAgICAgIC0xICAtPiAgMS4wICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDE1IHJlc2NhbGUgICAwLjk5OSAgICAgICAgIDAgIC0+ICAxICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MTYgcmVzY2FsZSAgIDAuOTk5ICAgICAgICAgMSAgLT4gMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCityZXN4NDIwIHJlc2NhbGUgICAwLjA5OTkgICAgICAgLTUgIC0+ICAwLjA5OTkwCityZXN4NDIxIHJlc2NhbGUgICAwLjA5OTkgICAgICAgLTQgIC0+ICAwLjA5OTkKK3Jlc3g0MjIgcmVzY2FsZSAgIDAuMDk5OSAgICAgICAtMyAgLT4gIDAuMTAwICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQyMyByZXNjYWxlICAgMC4wOTk5ICAgICAgIC0yICAtPiAgMC4xMCAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDI0IHJlc2NhbGUgICAwLjA5OTkgICAgICAgLTEgIC0+ICAwLjEgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MjUgcmVzY2FsZSAgIDAuMDk5OSAgICAgICAgMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQyNiByZXNjYWxlICAgMC4wOTk5ICAgICAgICAxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3Jlc3g0MzAgcmVzY2FsZSAgIDAuMDA5OTkgICAgICAtNSAgLT4gIDAuMDA5OTkKK3Jlc3g0MzEgcmVzY2FsZSAgIDAuMDA5OTkgICAgICAtNCAgLT4gIDAuMDEwMCAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQzMiByZXNjYWxlICAgMC4wMDk5OSAgICAgIC0zICAtPiAgMC4wMTAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDMzIHJlc2NhbGUgICAwLjAwOTk5ICAgICAgLTIgIC0+ICAwLjAxICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0MzQgcmVzY2FsZSAgIDAuMDA5OTkgICAgICAtMSAgLT4gIDAuMCAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQzNSByZXNjYWxlICAgMC4wMDk5OSAgICAgICAwICAtPiAgMCAgICAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDM2IHJlc2NhbGUgICAwLjAwOTk5ICAgICAgIDEgIC0+IDBFKzEgICAgICBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDQ0MCByZXNjYWxlICAgMC4wMDA5OTkgICAgIC01ICAtPiAgMC4wMDEwMCAgSW5leGFjdCBSb3VuZGVkCityZXN4NDQxIHJlc2NhbGUgICAwLjAwMDk5OSAgICAgLTQgIC0+ICAwLjAwMTAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0NDIgcmVzY2FsZSAgIDAuMDAwOTk5ICAgICAtMyAgLT4gIDAuMDAxICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ0MyByZXNjYWxlICAgMC4wMDA5OTkgICAgIC0yICAtPiAgMC4wMCAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NDQ0IHJlc2NhbGUgICAwLjAwMDk5OSAgICAgLTEgIC0+ICAwLjAgICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0NDUgcmVzY2FsZSAgIDAuMDAwOTk5ICAgICAgMCAgLT4gIDAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ0NiByZXNjYWxlICAgMC4wMDA5OTkgICAgICAxICAtPiAwRSsxICAgICAgSW5leGFjdCBSb3VuZGVkCisKK3ByZWNpc2lvbjogOAorcmVzeDQ0OSByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0yMyAtPiAgTmFOICAgICAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g0NTAgcmVzY2FsZSAgIDkuOTk5RS0xNSAgICAtMjIgLT4gIDkuOTk5MDAwMEUtMTUKK3Jlc3g0NTEgcmVzY2FsZSAgIDkuOTk5RS0xNSAgICAtMjEgLT4gIDkuOTk5MDAwRS0xNQorcmVzeDQ1MiByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0yMCAtPiAgOS45OTkwMEUtMTUKK3Jlc3g0NTMgcmVzY2FsZSAgIDkuOTk5RS0xNSAgICAtMTkgLT4gIDkuOTk5MEUtMTUKK3Jlc3g0NTQgcmVzY2FsZSAgIDkuOTk5RS0xNSAgICAtMTggLT4gIDkuOTk5RS0xNQorcmVzeDQ1NSByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xNyAtPiAgMS4wMDBFLTE0IEluZXhhY3QgUm91bmRlZAorcmVzeDQ1NiByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xNiAtPiAgMS4wMEUtMTQgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ1NyByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xNSAtPiAgMS4wRS0xNCAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ1OCByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xNCAtPiAgMUUtMTQgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ1OSByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xMyAtPiAgMEUtMTMgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2MCByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xMiAtPiAgMEUtMTIgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2MSByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xMSAtPiAgMEUtMTEgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2MiByZXNjYWxlICAgOS45OTlFLTE1ICAgIC0xMCAtPiAgMEUtMTAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2MyByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtOSAtPiAgMEUtOSAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2NCByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtOCAtPiAgMEUtOCAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2NSByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtNyAtPiAgMEUtNyAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2NiByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtNiAtPiAgMC4wMDAwMDAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2NyByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtNSAtPiAgMC4wMDAwMCAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2OCByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtNCAtPiAgMC4wMDAwICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ2OSByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtMyAtPiAgMC4wMDAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ3MCByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtMiAtPiAgMC4wMCAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ3MSByZXNjYWxlICAgOS45OTlFLTE1ICAgICAtMSAtPiAgMC4wICAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ3MiByZXNjYWxlICAgOS45OTlFLTE1ICAgICAgMCAtPiAgMCAgICAgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDQ3MyByZXNjYWxlICAgOS45OTlFLTE1ICAgICAgMSAtPiAgMEUrMSAgICAgIEluZXhhY3QgUm91bmRlZAorCistLSBbYWRkaXRpb25hbCB0ZXN0cyBmb3IgImRvbid0IGZpdCIgZWRnZSBjYXNlcyBhcmUgaW4KKy0tIHF1YW50aXplLmRlY1Rlc3QuICBIZXJlJ3MgYSBjcml0aWNhbCBvbmUuXQorcHJlY2lzaW9uOiAzCityZXN4NDgwIHJlc2NhbGUgICAwLjk5OTkgICAgICAgIC0zIC0+ICBOYU4gICAgICAgSW52YWxpZF9vcGVyYXRpb24KKworCistLSBsb25nIG9wZXJhbmQgY2hlY2tzIFtyaHMgY2hlY2tzIHJlbW92ZWRdCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CityZXN4NDgxIHJlc2NhbGUgMTIzNDU2NzgwMDAgKzMgLT4gMS4yMzQ1Njc4RSsxMCBSb3VuZGVkCityZXN4NDgyIHJlc2NhbGUgMTIzNDU2NzgwMCAgKzEgLT4gMS4yMzQ1Njc4MEUrOSBSb3VuZGVkCityZXN4NDgzIHJlc2NhbGUgMTIzNDU2Nzg5MCAgKzEgLT4gMS4yMzQ1Njc4OUUrOSBSb3VuZGVkCityZXN4NDg0IHJlc2NhbGUgMTIzNDU2Nzg5MSAgKzEgLT4gMS4yMzQ1Njc4OUUrOSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0ODUgcmVzY2FsZSAxMjM0NTY3ODkwMSArMiAtPiAxLjIzNDU2Nzg5RSsxMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0ODYgcmVzY2FsZSAxMjM0NTY3ODk2ICArMSAtPiAxLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorLS0gYSBwb3RlbnRpYWwgZG91YmxlLXJvdW5kCityZXN4NDg3IHJlc2NhbGUgMTIzNC45ODc2NDMgLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorcmVzeDQ4OCByZXNjYWxlIDEyMzQuOTg3NjQ3IC00IC0+IDEyMzQuOTg3NiBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAxNQorcmVzeDQ5MSByZXNjYWxlIDEyMzQ1Njc4MDAwICszIC0+IDEuMjM0NTY3OEUrMTAgUm91bmRlZAorcmVzeDQ5MiByZXNjYWxlIDEyMzQ1Njc4MDAgICsxIC0+IDEuMjM0NTY3ODBFKzkgUm91bmRlZAorcmVzeDQ5MyByZXNjYWxlIDEyMzQ1Njc4OTAgICsxIC0+IDEuMjM0NTY3ODlFKzkgUm91bmRlZAorcmVzeDQ5NCByZXNjYWxlIDEyMzQ1Njc4OTEgICsxIC0+IDEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCityZXN4NDk1IHJlc2NhbGUgMTIzNDU2Nzg5MDEgKzIgLT4gMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCityZXN4NDk2IHJlc2NhbGUgMTIzNDU2Nzg5NiAgKzEgLT4gMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g0OTcgcmVzY2FsZSAxMjM0Ljk4NzY0MyAtNCAtPiAxMjM0Ljk4NzYgSW5leGFjdCBSb3VuZGVkCityZXN4NDk4IHJlc2NhbGUgMTIzNC45ODc2NDcgLTQgLT4gMTIzNC45ODc2IEluZXhhY3QgUm91bmRlZAorCistLSBaZXJvcworcmVzeDUwMCByZXNjYWxlICAgMCAgICAgMSAtPiAgMEUrMQorcmVzeDUwMSByZXNjYWxlICAgMCAgICAgMCAtPiAgMAorcmVzeDUwMiByZXNjYWxlICAgMCAgICAtMSAtPiAgMC4wCityZXN4NTAzIHJlc2NhbGUgICAwLjAgIC0xIC0+ICAwLjAKK3Jlc3g1MDQgcmVzY2FsZSAgIDAuMCAgIDAgLT4gIDAKK3Jlc3g1MDUgcmVzY2FsZSAgIDAuMCAgKzEgLT4gIDBFKzEKK3Jlc3g1MDYgcmVzY2FsZSAgIDBFKzEgLTEgLT4gIDAuMAorcmVzeDUwNyByZXNjYWxlICAgMEUrMSAgMCAtPiAgMAorcmVzeDUwOCByZXNjYWxlICAgMEUrMSArMSAtPiAgMEUrMQorcmVzeDUwOSByZXNjYWxlICAtMCAgICAgMSAtPiAtMEUrMQorcmVzeDUxMCByZXNjYWxlICAtMCAgICAgMCAtPiAtMAorcmVzeDUxMSByZXNjYWxlICAtMCAgICAtMSAtPiAtMC4wCityZXN4NTEyIHJlc2NhbGUgIC0wLjAgIC0xIC0+IC0wLjAKK3Jlc3g1MTMgcmVzY2FsZSAgLTAuMCAgIDAgLT4gLTAKK3Jlc3g1MTQgcmVzY2FsZSAgLTAuMCAgKzEgLT4gLTBFKzEKK3Jlc3g1MTUgcmVzY2FsZSAgLTBFKzEgLTEgLT4gLTAuMAorcmVzeDUxNiByZXNjYWxlICAtMEUrMSAgMCAtPiAtMAorcmVzeDUxNyByZXNjYWxlICAtMEUrMSArMSAtPiAtMEUrMQorCistLSBTdXNwaWNpb3VzIFJIUyB2YWx1ZXMKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CitwcmVjaXNpb246IDE1CityZXN4NTIwIHJlc2NhbGUgICAxLjIzNCAgICA5OTk5OTlFKzMgLT4gMEUrOTk5OTk5MDAwIEluZXhhY3QgUm91bmRlZAorcmVzeDUyMSByZXNjYWxlIDEyMy40NTYgICAgOTk5OTk5RSszIC0+IDBFKzk5OTk5OTAwMCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1MjIgcmVzY2FsZSAgIDEuMjM0ICAgIDk5OTk5OTk5OSAtPiAwRSs5OTk5OTk5OTkgSW5leGFjdCBSb3VuZGVkCityZXN4NTIzIHJlc2NhbGUgMTIzLjQ1NiAgICA5OTk5OTk5OTkgLT4gMEUrOTk5OTk5OTk5IEluZXhhY3QgUm91bmRlZAorcmVzeDUyNCByZXNjYWxlIDEyMy40NTYgICAxMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUyNSByZXNjYWxlIDEyMy40NTYgIDEyMzQ1Njc4OTAzIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gbmV4dCBmb3VyIGFyZSAid29uJ3QgZml0IiBvdmVyZmxvd3MKK3Jlc3g1MjYgcmVzY2FsZSAgIDEuMjM0ICAgLTk5OTk5OUUrMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1MjcgcmVzY2FsZSAxMjMuNDU2ICAgLTk5OTk5OUUrMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1MjggcmVzY2FsZSAgIDEuMjM0ICAgLTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1MjkgcmVzY2FsZSAxMjMuNDU2ICAgLTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1MzAgcmVzY2FsZSAxMjMuNDU2ICAtMTAwMDAwMDAxNCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1MzEgcmVzY2FsZSAxMjMuNDU2IC0xMjM0NTY3ODkwMyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogMTUKK3Jlc3g1MzIgcmVzY2FsZSAgIDEuMjM0RSs5OTkgICAgOTk5IC0+IDFFKzk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1MzMgcmVzY2FsZSAgIDEuMjM0RSs5OTggICAgOTk5IC0+IDBFKzk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1MzQgcmVzY2FsZSAgIDEuMjM0ICAgICAgICAgOTk5IC0+IDBFKzk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1MzUgcmVzY2FsZSAgIDEuMjM0ICAgICAgICAxMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUzNiByZXNjYWxlICAgMS4yMzQgICAgICAgIDUwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTM3IHJlc2NhbGUgICAwICAgICAgICAgICAgLTk5OSAtPiAwRS05OTkKKy0tIG5leHQgdHdvIGFyZSAid29uJ3QgZml0IiBvdmVyZmxvd3MKK3Jlc3g1MzggcmVzY2FsZSAgIDEuMjM0ICAgICAgICAtOTk5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDUzOSByZXNjYWxlICAgMS4yMzQgICAgICAgLTEwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTQwIHJlc2NhbGUgICAxLjIzNCAgICAgICAtNTAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIFttb3JlIGJlbG93XQorCistLSBjaGVjayBib3VuZHMgKGxocyBtYXliZSBvdXQgb2YgcmFuZ2UgZm9yIGRlc3RpbmF0aW9uLCBldGMuKQorcHJlY2lzaW9uOiAgICAgNworcmVzeDU0MSByZXNjYWxlICAgMUUrOTk5ICAgKzk5OSAtPiAxRSs5OTkKK3Jlc3g1NDIgcmVzY2FsZSAgIDFFKzEwMDAgICs5OTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTQzIHJlc2NhbGUgICAxRSs5OTkgICsxMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU0NCByZXNjYWxlICAgMUUtOTk5ICAgLTk5OSAtPiAxRS05OTkKK3Jlc3g1NDUgcmVzY2FsZSAgIDFFLTEwMDAgIC05OTkgLT4gMEUtOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDU0NiByZXNjYWxlICAgMUUtOTk5ICAtMTAwMCAtPiAxLjBFLTk5OQorcmVzeDU0NyByZXNjYWxlICAgMUUtMTAwNSAgLTk5OSAtPiAwRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NTQ4IHJlc2NhbGUgICAxRS0xMDA2ICAtOTk5IC0+IDBFLTk5OSAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NDkgcmVzY2FsZSAgIDFFLTEwMDcgIC05OTkgLT4gMEUtOTk5ICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDU1MCByZXNjYWxlICAgMUUtOTk4ICAtMTAwNSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24gIC0tIHdvbid0IGZpdAorcmVzeDU1MSByZXNjYWxlICAgMUUtOTk5ICAtMTAwNSAtPiAxLjAwMDAwMEUtOTk5CityZXN4NTUyIHJlc2NhbGUgICAxRS0xMDAwIC0xMDA1IC0+IDEuMDAwMDBFLTEwMDAgU3Vibm9ybWFsCityZXN4NTUzIHJlc2NhbGUgICAxRS05OTkgIC0xMDA2IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU1NCByZXNjYWxlICAgMUUtOTk5ICAtMTAwNyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHJlbGF0ZWQgc3Vibm9ybWFsIHJvdW5kaW5nCityZXN4NTU1IHJlc2NhbGUgICAxLjY2NjY2NkUtOTk5ICAtMTAwNSAtPiAxLjY2NjY2NkUtOTk5CityZXN4NTU2IHJlc2NhbGUgICAxLjY2NjY2NkUtMTAwMCAtMTAwNSAtPiAxLjY2NjY3RS0xMDAwICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCityZXN4NTU3IHJlc2NhbGUgICAxLjY2NjY2NkUtMTAwMSAtMTAwNSAtPiAxLjY2NjdFLTEwMDEgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NTggcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDAyIC0xMDA1IC0+IDEuNjY3RS0xMDAyICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCityZXN4NTU5IHJlc2NhbGUgICAxLjY2NjY2NkUtMTAwMyAtMTAwNSAtPiAxLjY3RS0xMDAzICBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCityZXN4NTYwIHJlc2NhbGUgICAxLjY2NjY2NkUtMTAwNCAtMTAwNSAtPiAxLjdFLTEwMDQgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NjEgcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDA1IC0xMDA1IC0+IDJFLTEwMDUgIFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NjIgcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDA2IC0xMDA1IC0+IDBFLTEwMDUgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NjMgcmVzY2FsZSAgIDEuNjY2NjY2RS0xMDA3IC0xMDA1IC0+IDBFLTEwMDUgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gZnJhY3Rpb25hbCBSSFMsIHNvbWUgZ29vZCBhbmQgc29tZSBiYWQKK3ByZWNpc2lvbjogOQorcmVzeDU2NCByZXNjYWxlICAgMjIyICsyLjAgICAgICAgICAgIC0+IDJFKzIgSW5leGFjdCBSb3VuZGVkCityZXN4NTY1IHJlc2NhbGUgICAyMjIgKzIuMDAwMDAwMDAgICAgLT4gMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g1NjYgcmVzY2FsZSAgIDIyMiArMi4wMDEwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NjcgcmVzY2FsZSAgIDIyMiArMi4wMDAwMDEgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NjggcmVzY2FsZSAgIDIyMiArMi4wMDAwMDAwMDEgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NjkgcmVzY2FsZSAgIDIyMiArMi4wMDAwMDAwMDAxICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NzAgcmVzY2FsZSAgIDIyMiArMi4wMDAwMDAwMDAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NzEgcmVzY2FsZSAgIDIyMiArMi45OTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NzIgcmVzY2FsZSAgIDIyMiAtMi4wMDAwMDAwMCAgICAtPiAyMjIuMDAKK3Jlc3g1NzMgcmVzY2FsZSAgIDIyMiAtMi4wMDEwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NzQgcmVzY2FsZSAgIDIyMiAtMi4wMDAwMDAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NzUgcmVzY2FsZSAgIDIyMiAtMi4wMDAwMDAwMDAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g1NzYgcmVzY2FsZSAgIDIyMiAtMi45OTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gU3BlY2lhbHMKK3Jlc3g1ODAgcmVzY2FsZSAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CityZXN4NTgxIHJlc2NhbGUgIEluZiAgLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTgyIHJlc2NhbGUgIEluZiAgLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTgzIHJlc2NhbGUgIEluZiAgIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTg0IHJlc2NhbGUgIEluZiAgIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTg1IHJlc2NhbGUgIEluZiAgIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTg2IHJlc2NhbGUgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorcmVzeDU4NyByZXNjYWxlIC0xMDAwICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU4OCByZXNjYWxlIC1JbmYgICBJbmYgICAtPiAgLUluZmluaXR5CityZXN4NTg5IHJlc2NhbGUgLTEgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTkwIHJlc2NhbGUgIDAgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTkxIHJlc2NhbGUgIDEgICAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTkyIHJlc2NhbGUgIDEwMDAgIEluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NTkzIHJlc2NhbGUgIEluZiAgIEluZiAgIC0+ICBJbmZpbml0eQorcmVzeDU5NCByZXNjYWxlICBJbmYgIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDU5NSByZXNjYWxlIC0wICAgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCityZXN4NjAwIHJlc2NhbGUgLUluZiAgLUluZiAgIC0+ICAtSW5maW5pdHkKK3Jlc3g2MDEgcmVzY2FsZSAtSW5mICAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MDIgcmVzY2FsZSAtSW5mICAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MDMgcmVzY2FsZSAtSW5mICAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MDQgcmVzY2FsZSAtSW5mICAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MDUgcmVzY2FsZSAtSW5mICAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2MDYgcmVzY2FsZSAtSW5mICAgSW5mICAgLT4gIC1JbmZpbml0eQorcmVzeDYwNyByZXNjYWxlIC0xMDAwICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDYwOCByZXNjYWxlIC1JbmYgIC1JbmYgICAtPiAgLUluZmluaXR5CityZXN4NjA5IHJlc2NhbGUgLTEgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjEwIHJlc2NhbGUgIDAgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjExIHJlc2NhbGUgIDEgICAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjEyIHJlc2NhbGUgIDEwMDAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjEzIHJlc2NhbGUgIEluZiAgLUluZiAgIC0+ICBJbmZpbml0eQorcmVzeDYxNCByZXNjYWxlIC1JbmYgIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDYxNSByZXNjYWxlIC0wICAgIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCityZXN4NjIxIHJlc2NhbGUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK3Jlc3g2MjIgcmVzY2FsZSAgTmFOIC0xMDAwICAgLT4gIE5hTgorcmVzeDYyMyByZXNjYWxlICBOYU4gLTEgICAgICAtPiAgTmFOCityZXN4NjI0IHJlc2NhbGUgIE5hTiAgMCAgICAgIC0+ICBOYU4KK3Jlc3g2MjUgcmVzY2FsZSAgTmFOICAxICAgICAgLT4gIE5hTgorcmVzeDYyNiByZXNjYWxlICBOYU4gIDEwMDAgICAtPiAgTmFOCityZXN4NjI3IHJlc2NhbGUgIE5hTiAgSW5mICAgIC0+ICBOYU4KK3Jlc3g2MjggcmVzY2FsZSAgTmFOICBOYU4gICAgLT4gIE5hTgorcmVzeDYyOSByZXNjYWxlIC1JbmYgIE5hTiAgICAtPiAgTmFOCityZXN4NjMwIHJlc2NhbGUgLTEwMDAgTmFOICAgIC0+ICBOYU4KK3Jlc3g2MzEgcmVzY2FsZSAtMSAgICBOYU4gICAgLT4gIE5hTgorcmVzeDYzMiByZXNjYWxlICAwICAgIE5hTiAgICAtPiAgTmFOCityZXN4NjMzIHJlc2NhbGUgIDEgICAtTmFOICAgIC0+IC1OYU4KK3Jlc3g2MzQgcmVzY2FsZSAgMTAwMCBOYU4gICAgLT4gIE5hTgorcmVzeDYzNSByZXNjYWxlICBJbmYgIE5hTiAgICAtPiAgTmFOCityZXN4NjM2IHJlc2NhbGUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK3Jlc3g2MzcgcmVzY2FsZSAtMCAgICBOYU4gICAgLT4gIE5hTgorCityZXN4NjQxIHJlc2NhbGUgIHNOYU4gLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQyIHJlc2NhbGUgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQzIHJlc2NhbGUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQ0IHJlc2NhbGUgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQ1IHJlc2NhbGUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQ2IHJlc2NhbGUgIHNOYU4gIDEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQ3IHJlc2NhbGUgLXNOYU4gIE5hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQ4IHJlc2NhbGUgIHNOYU4gLXNOYU4gIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjQ5IHJlc2NhbGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjUwIHJlc2NhbGUgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjUxIHJlc2NhbGUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjUyIHJlc2NhbGUgLTEgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjUzIHJlc2NhbGUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjU0IHJlc2NhbGUgIDEgICAtc05hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjU1IHJlc2NhbGUgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjU2IHJlc2NhbGUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjU3IHJlc2NhbGUgIE5hTiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjU4IHJlc2NhbGUgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityZXN4NjU5IHJlc2NhbGUgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHByb3BhZ2F0aW5nIE5hTnMKK3Jlc3g2NjEgcmVzY2FsZSAgTmFOOSAtSW5mICAgLT4gIE5hTjkKK3Jlc3g2NjIgcmVzY2FsZSAgTmFOODEgOTE5ICAgLT4gIE5hTjgxCityZXN4NjYzIHJlc2NhbGUgIE5hTjcyIEluZiAgIC0+ICBOYU43MgorcmVzeDY2NCByZXNjYWxlIC1OYU42NiBOYU41ICAtPiAtTmFONjYKK3Jlc3g2NjUgcmVzY2FsZSAtSW5mICAgTmFONCAgLT4gIE5hTjQKK3Jlc3g2NjYgcmVzY2FsZSAtOTE5ICAgTmFOMzIgLT4gIE5hTjMyCityZXN4NjY3IHJlc2NhbGUgIEluZiAgIE5hTjIgIC0+ICBOYU4yCisKK3Jlc3g2NzEgcmVzY2FsZSAgc05hTjk5IC1JbmYgICAgLT4gIE5hTjk5IEludmFsaWRfb3BlcmF0aW9uCityZXN4NjcyIHJlc2NhbGUgLXNOYU45OCAtMTEgICAgIC0+IC1OYU45OCBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDY3MyByZXNjYWxlICBzTmFOOTcgIE5hTiAgICAtPiAgTmFOOTcgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NzQgcmVzY2FsZSAgc05hTjE2IHNOYU45NCAgLT4gIE5hTjE2IEludmFsaWRfb3BlcmF0aW9uCityZXN4Njc1IHJlc2NhbGUgIE5hTjk1ICBzTmFOOTMgIC0+ICBOYU45MyBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDY3NiByZXNjYWxlIC1JbmYgICAgc05hTjkyICAtPiAgTmFOOTIgSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g2NzcgcmVzY2FsZSAgMDg4ICAgLXNOYU45MSAgLT4gLU5hTjkxIEludmFsaWRfb3BlcmF0aW9uCityZXN4Njc4IHJlc2NhbGUgIEluZiAgIC1zTmFOOTAgIC0+IC1OYU45MCBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDY3OSByZXNjYWxlICBOYU4gICAgc05hTjg3ICAtPiAgTmFOODcgSW52YWxpZF9vcGVyYXRpb24KKworLS0gc3Vibm9ybWFscyBhbmQgdW5kZXJmbG93CitwcmVjaXNpb246IDQKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CityZXN4NzEwIHJlc2NhbGUgIDEuMDBFLTk5OSAgICAtOTk5ICAtPiAgIDFFLTk5OSAgICBSb3VuZGVkCityZXN4NzExIHJlc2NhbGUgIDAuMUUtOTk5ICAgIC0xMDAwICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwKK3Jlc3g3MTIgcmVzY2FsZSAgMC4xMEUtOTk5ICAgLTEwMDAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbCBSb3VuZGVkCityZXN4NzEzIHJlc2NhbGUgIDAuMTAwRS05OTkgIC0xMDAwICAtPiAgIDFFLTEwMDAgICBTdWJub3JtYWwgUm91bmRlZAorcmVzeDcxNCByZXNjYWxlICAwLjAxRS05OTkgICAtMTAwMSAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcmVzeDcxNSByZXNjYWxlICAwLjk5OUUtOTk5ICAgLTk5OSAgLT4gICAxRS05OTkgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzE2IHJlc2NhbGUgIDAuMDk5RS05OTkgIC0xMDAwICAtPiAgIDFFLTEwMDAgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsCisKK3Jlc3g3MTcgcmVzY2FsZSAgMC4wMDlFLTk5OSAgLTEwMDEgIC0+ICAgMUUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwKK3Jlc3g3MTggcmVzY2FsZSAgMC4wMDFFLTk5OSAgLTEwMDEgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZAorcmVzeDcxOSByZXNjYWxlICAwLjAwMDlFLTk5OSAtMTAwMSAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzIwIHJlc2NhbGUgIDAuMDAwMUUtOTk5IC0xMDAxICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDczMCByZXNjYWxlIC0xLjAwRS05OTkgICAtOTk5ICAtPiAgLTFFLTk5OSAgICAgUm91bmRlZAorcmVzeDczMSByZXNjYWxlIC0wLjFFLTk5OSAgICAtOTk5ICAtPiAgLTBFLTk5OSAgICAgUm91bmRlZCBJbmV4YWN0CityZXN4NzMyIHJlc2NhbGUgLTAuMTBFLTk5OSAgIC05OTkgIC0+ICAtMEUtOTk5ICAgICBSb3VuZGVkIEluZXhhY3QKK3Jlc3g3MzMgcmVzY2FsZSAtMC4xMDBFLTk5OSAgLTk5OSAgLT4gIC0wRS05OTkgICAgIFJvdW5kZWQgSW5leGFjdAorcmVzeDczNCByZXNjYWxlIC0wLjAxRS05OTkgICAtOTk5ICAtPiAgLTBFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorcmVzeDczNSByZXNjYWxlIC0wLjk5OUUtOTk5ICAtOTk5ICAtPiAgLTFFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzM2IHJlc2NhbGUgLTAuMDk5RS05OTkgIC05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3MzcgcmVzY2FsZSAtMC4wMDlFLTk5OSAgLTk5OSAgLT4gIC0wRS05OTkgICAgIEluZXhhY3QgUm91bmRlZAorcmVzeDczOCByZXNjYWxlIC0wLjAwMUUtOTk5ICAtOTk5ICAtPiAgLTBFLTk5OSAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzM5IHJlc2NhbGUgLTAuMDAwMUUtOTk5IC05OTkgIC0+ICAtMEUtOTk5ICAgICBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDc0MCByZXNjYWxlIC0xLjAwRS05OTkgICAtMTAwMCAtPiAgLTEuMEUtOTk5ICAgUm91bmRlZAorcmVzeDc0MSByZXNjYWxlIC0wLjFFLTk5OSAgICAtMTAwMCAtPiAgLTFFLTEwMDAgICAgU3Vibm9ybWFsCityZXN4NzQyIHJlc2NhbGUgLTAuMTBFLTk5OSAgIC0xMDAwIC0+ICAtMUUtMTAwMCAgICBTdWJub3JtYWwgUm91bmRlZAorcmVzeDc0MyByZXNjYWxlIC0wLjEwMEUtOTk5ICAtMTAwMCAtPiAgLTFFLTEwMDAgICAgU3Vibm9ybWFsIFJvdW5kZWQKK3Jlc3g3NDQgcmVzY2FsZSAtMC4wMUUtOTk5ICAgLTEwMDAgLT4gIC0wRS0xMDAwICAgIEluZXhhY3QgUm91bmRlZAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK3Jlc3g3NDUgcmVzY2FsZSAtMC45OTlFLTk5OSAgLTEwMDAgLT4gIC0xLjBFLTk5OSAgIEluZXhhY3QgUm91bmRlZAorcmVzeDc0NiByZXNjYWxlIC0wLjA5OUUtOTk5ICAtMTAwMCAtPiAgLTFFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcmVzeDc0NyByZXNjYWxlIC0wLjAwOUUtOTk5ICAtMTAwMCAtPiAgLTBFLTEwMDAgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzQ4IHJlc2NhbGUgLTAuMDAxRS05OTkgIC0xMDAwIC0+ICAtMEUtMTAwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3Jlc3g3NDkgcmVzY2FsZSAtMC4wMDAxRS05OTkgLTEwMDAgLT4gIC0wRS0xMDAwICAgIEluZXhhY3QgUm91bmRlZAorCityZXN4NzUwIHJlc2NhbGUgLTEuMDBFLTk5OSAgIC0xMDAxIC0+ICAtMS4wMEUtOTk5CityZXN4NzUxIHJlc2NhbGUgLTAuMUUtOTk5ICAgIC0xMDAxIC0+ICAtMS4wRS0xMDAwICBTdWJub3JtYWwKK3Jlc3g3NTIgcmVzY2FsZSAtMC4xMEUtOTk5ICAgLTEwMDEgLT4gIC0xLjBFLTEwMDAgIFN1Ym5vcm1hbAorcmVzeDc1MyByZXNjYWxlIC0wLjEwMEUtOTk5ICAtMTAwMSAtPiAgLTEuMEUtMTAwMCAgU3Vibm9ybWFsIFJvdW5kZWQKK3Jlc3g3NTQgcmVzY2FsZSAtMC4wMUUtOTk5ICAgLTEwMDEgLT4gIC0xRS0xMDAxICAgIFN1Ym5vcm1hbAorLS0gbmV4dCBpcyByb3VuZGVkIHRvIEVtaW4KK3Jlc3g3NTUgcmVzY2FsZSAtMC45OTlFLTk5OSAgLTEwMDEgLT4gIC0xLjAwRS05OTkgIEluZXhhY3QgUm91bmRlZAorcmVzeDc1NiByZXNjYWxlIC0wLjA5OUUtOTk5ICAtMTAwMSAtPiAgLTEuMEUtMTAwMCAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcmVzeDc1NyByZXNjYWxlIC0wLjAwOUUtOTk5ICAtMTAwMSAtPiAgLTFFLTEwMDEgICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbAorcmVzeDc1OCByZXNjYWxlIC0wLjAwMUUtOTk5ICAtMTAwMSAtPiAgLTBFLTEwMDEgICAgSW5leGFjdCBSb3VuZGVkCityZXN4NzU5IHJlc2NhbGUgLTAuMDAwMUUtOTk5IC0xMDAxIC0+ICAtMEUtMTAwMSAgICBJbmV4YWN0IFJvdW5kZWQKKworcmVzeDc2MCByZXNjYWxlIC0xLjAwRS05OTkgICAtMTAwMiAtPiAgLTEuMDAwRS05OTkKK3Jlc3g3NjEgcmVzY2FsZSAtMC4xRS05OTkgICAgLTEwMDIgLT4gIC0xLjAwRS0xMDAwICBTdWJub3JtYWwKK3Jlc3g3NjIgcmVzY2FsZSAtMC4xMEUtOTk5ICAgLTEwMDIgLT4gIC0xLjAwRS0xMDAwICBTdWJub3JtYWwKK3Jlc3g3NjMgcmVzY2FsZSAtMC4xMDBFLTk5OSAgLTEwMDIgLT4gIC0xLjAwRS0xMDAwICBTdWJub3JtYWwKK3Jlc3g3NjQgcmVzY2FsZSAtMC4wMUUtOTk5ICAgLTEwMDIgLT4gIC0xLjBFLTEwMDEgICBTdWJub3JtYWwKK3Jlc3g3NjUgcmVzY2FsZSAtMC45OTlFLTk5OSAgLTEwMDIgLT4gIC05Ljk5RS0xMDAwICBTdWJub3JtYWwKK3Jlc3g3NjYgcmVzY2FsZSAtMC4wOTlFLTk5OSAgLTEwMDIgLT4gIC05LjlFLTEwMDEgICBTdWJub3JtYWwKK3Jlc3g3NjcgcmVzY2FsZSAtMC4wMDlFLTk5OSAgLTEwMDIgLT4gIC05RS0xMDAyICAgICBTdWJub3JtYWwKK3Jlc3g3NjggcmVzY2FsZSAtMC4wMDFFLTk5OSAgLTEwMDIgLT4gIC0xRS0xMDAyICAgICBTdWJub3JtYWwKK3Jlc3g3NjkgcmVzY2FsZSAtMC4wMDAxRS05OTkgLTEwMDIgLT4gIC0wRS0xMDAyICAgICBJbmV4YWN0IFJvdW5kZWQKKworLS0gcmhzIG11c3QgYmUgbm8gbGVzcyB0aGFuIEV0aW55CityZXN4NzcwIHJlc2NhbGUgLTEuMDBFLTk5OSAgIC0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g3NzEgcmVzY2FsZSAtMC4xRS05OTkgICAgLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDc3MiByZXNjYWxlIC0wLjEwRS05OTkgICAtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4NzczIHJlc2NhbGUgLTAuMTAwRS05OTkgIC0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g3NzQgcmVzY2FsZSAtMC4wMUUtOTk5ICAgLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDc3NSByZXNjYWxlIC0wLjk5OUUtOTk5ICAtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Nzc2IHJlc2NhbGUgLTAuMDk5RS05OTkgIC0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g3NzcgcmVzY2FsZSAtMC4wMDlFLTk5OSAgLTEwMDMgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDc3OCByZXNjYWxlIC0wLjAwMUUtOTk5ICAtMTAwMyAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4Nzc5IHJlc2NhbGUgLTAuMDAwMUUtOTk5IC0xMDAzIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcHJlY2lzaW9uOiAgIDkKK21heEV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CisKKy0tIGdldEludCB3b3JyaWVzCityZXN4ODAxIHJlc2NhbGUgICAwICAgMTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MDIgcmVzY2FsZSAgIDAgIC0xMDAwMDAwMDAwIC0+IDBFLTEwMDAwMDAwMDAKK3Jlc3g4MDMgcmVzY2FsZSAgIDAgICAyMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgwNCByZXNjYWxlICAgMCAgLTIwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODA1IHJlc2NhbGUgICAwICAgMzAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MDYgcmVzY2FsZSAgIDAgIC0zMDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgwNyByZXNjYWxlICAgMCAgIDQwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODA4IHJlc2NhbGUgICAwICAtNDAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MDkgcmVzY2FsZSAgIDAgICA1MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgxMCByZXNjYWxlICAgMCAgLTUwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODExIHJlc2NhbGUgICAwICAgNjAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MTIgcmVzY2FsZSAgIDAgIC02MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgxMyByZXNjYWxlICAgMCAgIDcwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODE0IHJlc2NhbGUgICAwICAtNzAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MTUgcmVzY2FsZSAgIDAgICA4MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgxNiByZXNjYWxlICAgMCAgLTgwMDAwMDAwMDAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODE3IHJlc2NhbGUgICAwICAgOTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MTggcmVzY2FsZSAgIDAgIC05MDAwMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDgxOSByZXNjYWxlICAgMCAgIDk5OTk5OTk5OTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODIwIHJlc2NhbGUgICAwICAtOTk5OTk5OTk5OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MjEgcmVzY2FsZSAgIDAgICAxMDAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4MjIgcmVzY2FsZSAgIDAgIC0xMDAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcmVzeDgzMSByZXNjYWxlICAgMSAgIDBFLTEgICAgICAgLT4gMQorcmVzeDgzMiByZXNjYWxlICAgMSAgIDBFLTIgICAgICAgLT4gMQorcmVzeDgzMyByZXNjYWxlICAgMSAgIDBFLTMgICAgICAgLT4gMQorcmVzeDgzNCByZXNjYWxlICAgMSAgIDBFLTQgICAgICAgLT4gMQorcmVzeDgzNSByZXNjYWxlICAgMSAgIDBFLTEwMCAgICAgLT4gMQorcmVzeDgzNiByZXNjYWxlICAgMSAgIDBFLTEwMDAwMCAgLT4gMQorcmVzeDgzNyByZXNjYWxlICAgMSAgIDBFKzEwMCAgICAgLT4gMQorcmVzeDgzOCByZXNjYWxlICAgMSAgIDBFKzEwMDAwMCAgLT4gMQorCityZXN4ODQxIHJlc2NhbGUgICAwICAgNUUtMTAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4NDIgcmVzY2FsZSAgIDAgICA1RS0xMDAwMDAwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDg0MyByZXNjYWxlICAgMCAgICA5OTk5OTk5OTkgLT4gMEUrOTk5OTk5OTk5CityZXN4ODQ0IHJlc2NhbGUgICAwICAgMTAwMDAwMDAwMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4NDUgcmVzY2FsZSAgIDAgICAtOTk5OTk5OTk5IC0+IDBFLTk5OTk5OTk5OQorcmVzeDg0NiByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDAgLT4gMEUtMTAwMDAwMDAwMAorcmVzeDg0NyByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDEgLT4gMEUtMTAwMDAwMDAwMQorcmVzeDg0OCByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDIgLT4gMEUtMTAwMDAwMDAwMgorcmVzeDg0OSByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDMgLT4gMEUtMTAwMDAwMDAwMworcmVzeDg1MCByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDQgLT4gMEUtMTAwMDAwMDAwNAorcmVzeDg1MSByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDUgLT4gMEUtMTAwMDAwMDAwNQorcmVzeDg1MiByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDYgLT4gMEUtMTAwMDAwMDAwNgorcmVzeDg1MyByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDcgLT4gMEUtMTAwMDAwMDAwNworcmVzeDg1NCByZXNjYWxlICAgMCAgLTEwMDAwMDAwMDggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3Jlc3g4NjEgcmVzY2FsZSAgIDEgICsyMTQ3NDgzNjQ5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDg2MiByZXNjYWxlICAgMSAgKzIxNDc0ODM2NDggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODYzIHJlc2NhbGUgICAxICArMjE0NzQ4MzY0NyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3Jlc3g4NjQgcmVzY2FsZSAgIDEgIC0yMTQ3NDgzNjQ3IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorcmVzeDg2NSByZXNjYWxlICAgMSAgLTIxNDc0ODM2NDggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXN4ODY2IHJlc2NhbGUgICAxICAtMjE0NzQ4MzY0OSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTnVsbCB0ZXN0cworcmVzOTAwIHJlc2NhbGUgMTAgICMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityZXM5MDEgcmVzY2FsZSAgIyAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcm90YXRlLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JvdGF0ZS5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYWRlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3JvdGF0ZS5kZWNUZXN0CkBAIC0wLDAgKzEsMjQ3IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHJvdGF0ZS5kZWNUZXN0IC0tIHJvdGF0ZSBjb2VmZmljaWVudCBsZWZ0IG9yIHJpZ2h0ICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU2FuaXR5IGNoZWNrCityb3R4MDAxIHJvdGF0ZSAgICAgICAgICAwICAgIDAgIC0+ICAwCityb3R4MDAyIHJvdGF0ZSAgICAgICAgICAwICAgIDIgIC0+ICAwCityb3R4MDAzIHJvdGF0ZSAgICAgICAgICAxICAgIDIgIC0+ICAxMDAKK3JvdHgwMDQgcm90YXRlICAgICAgICAgMzQgICAgOCAgLT4gIDQwMDAwMDAwMworcm90eDAwNSByb3RhdGUgICAgICAgICAgMSAgICA5ICAtPiAgMQorcm90eDAwNiByb3RhdGUgICAgICAgICAgMSAgIC0xICAtPiAgMTAwMDAwMDAwCityb3R4MDA3IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgLTEgIC0+ICA5MTIzNDU2NzgKK3JvdHgwMDggcm90YXRlICAxMjM0NTY3ODkgICAtOCAgLT4gIDIzNDU2Nzg5MQorcm90eDAwOSByb3RhdGUgIDEyMzQ1Njc4OSAgIC05ICAtPiAgMTIzNDU2Nzg5Cityb3R4MDEwIHJvdGF0ZSAgICAgICAgICAwICAgLTIgIC0+ICAwCisKKy0tIHJocyBtdXN0IGJlIGFuIGludGVnZXIKK3JvdHgwMTEgcm90YXRlICAgICAgICAxICAgIDEuNSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMTIgcm90YXRlICAgICAgICAxICAgIDEuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMTMgcm90YXRlICAgICAgICAxICAgIDAuMSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMTQgcm90YXRlICAgICAgICAxICAgIDAuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMTUgcm90YXRlICAgICAgICAxICAgIDFFKzEgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMTYgcm90YXRlICAgICAgICAxICAgIDFFKzk5ICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMTcgcm90YXRlICAgICAgICAxICAgIEluZiAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMTggcm90YXRlICAgICAgICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB8cmhzfCA8PSBwcmVjaXNpb24KK3JvdHgwMjAgcm90YXRlICAgICAgICAxICAgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMjEgcm90YXRlICAgICAgICAxICAgIC0xMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMjIgcm90YXRlICAgICAgICAxICAgICAxMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHgwMjMgcm90YXRlICAgICAgICAxICAgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gZnVsbCBwYXR0ZXJuCityb3R4MDMwIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC05ICAgLT4gMTIzNDU2Nzg5Cityb3R4MDMxIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC04ICAgLT4gMjM0NTY3ODkxCityb3R4MDMyIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC03ICAgLT4gMzQ1Njc4OTEyCityb3R4MDMzIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC02ICAgLT4gNDU2Nzg5MTIzCityb3R4MDM0IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC01ICAgLT4gNTY3ODkxMjM0Cityb3R4MDM1IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC00ICAgLT4gNjc4OTEyMzQ1Cityb3R4MDM2IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC0zICAgLT4gNzg5MTIzNDU2Cityb3R4MDM3IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC0yICAgLT4gODkxMjM0NTY3Cityb3R4MDM4IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC0xICAgLT4gOTEyMzQ1Njc4Cityb3R4MDM5IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgIC0wICAgLT4gMTIzNDU2Nzg5Cityb3R4MDQwIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICswICAgLT4gMTIzNDU2Nzg5Cityb3R4MDQxIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICsxICAgLT4gMjM0NTY3ODkxCityb3R4MDQyIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICsyICAgLT4gMzQ1Njc4OTEyCityb3R4MDQzIHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICszICAgLT4gNDU2Nzg5MTIzCityb3R4MDQ0IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICs0ICAgLT4gNTY3ODkxMjM0Cityb3R4MDQ1IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICs1ICAgLT4gNjc4OTEyMzQ1Cityb3R4MDQ2IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICs2ICAgLT4gNzg5MTIzNDU2Cityb3R4MDQ3IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICs3ICAgLT4gODkxMjM0NTY3Cityb3R4MDQ4IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICs4ICAgLT4gOTEyMzQ1Njc4Cityb3R4MDQ5IHJvdGF0ZSAgMTIzNDU2Nzg5ICAgICAgICAgICs5ICAgLT4gMTIzNDU2Nzg5CisKKy0tIHplcm9zCityb3R4MDYwIHJvdGF0ZSAgMEUtMTAgICAgICAgICAgICAgICs5ICAgLT4gICAwRS0xMAorcm90eDA2MSByb3RhdGUgIDBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAgMEUtMTAKK3JvdHgwNjIgcm90YXRlICAwLjAwMCAgICAgICAgICAgICAgKzkgICAtPiAgIDAuMDAwCityb3R4MDYzIHJvdGF0ZSAgMC4wMDAgICAgICAgICAgICAgIC05ICAgLT4gICAwLjAwMAorcm90eDA2NCByb3RhdGUgIDBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAgMEUrMTAKK3JvdHgwNjUgcm90YXRlICAwRSsxMCAgICAgICAgICAgICAgLTkgICAtPiAgIDBFKzEwCityb3R4MDY2IHJvdGF0ZSAtMEUtMTAgICAgICAgICAgICAgICs5ICAgLT4gIC0wRS0xMAorcm90eDA2NyByb3RhdGUgLTBFLTEwICAgICAgICAgICAgICAtOSAgIC0+ICAtMEUtMTAKK3JvdHgwNjggcm90YXRlIC0wLjAwMCAgICAgICAgICAgICAgKzkgICAtPiAgLTAuMDAwCityb3R4MDY5IHJvdGF0ZSAtMC4wMDAgICAgICAgICAgICAgIC05ICAgLT4gIC0wLjAwMAorcm90eDA3MCByb3RhdGUgLTBFKzEwICAgICAgICAgICAgICArOSAgIC0+ICAtMEUrMTAKK3JvdHgwNzEgcm90YXRlIC0wRSsxMCAgICAgICAgICAgICAgLTkgICAtPiAgLTBFKzEwCisKKy0tIE5tYXgsIE5taW4sIE50aW55Cityb3R4MTQxIHJvdGF0ZSAgOS45OTk5OTk5OUUrOTk5ICAgICAtMSAgLT4gOS45OTk5OTk5OUUrOTk5Cityb3R4MTQyIHJvdGF0ZSAgOS45OTk5OTk5OUUrOTk5ICAgICAtOCAgLT4gOS45OTk5OTk5OUUrOTk5Cityb3R4MTQzIHJvdGF0ZSAgOS45OTk5OTk5OUUrOTk5ICAgICAgMSAgLT4gOS45OTk5OTk5OUUrOTk5Cityb3R4MTQ0IHJvdGF0ZSAgOS45OTk5OTk5OUUrOTk5ICAgICAgOCAgLT4gOS45OTk5OTk5OUUrOTk5Cityb3R4MTQ1IHJvdGF0ZSAgMUUtOTk5ICAgICAgICAgICAgICAtMSAgLT4gMS4wMDAwMDAwMEUtOTkxCityb3R4MTQ2IHJvdGF0ZSAgMUUtOTk5ICAgICAgICAgICAgICAtOCAgLT4gMS4wRS05OTgKK3JvdHgxNDcgcm90YXRlICAxRS05OTkgICAgICAgICAgICAgICAxICAtPiAxLjBFLTk5OAorcm90eDE0OCByb3RhdGUgIDFFLTk5OSAgICAgICAgICAgICAgIDggIC0+IDEuMDAwMDAwMDBFLTk5MQorcm90eDE1MSByb3RhdGUgIDEuMDAwMDAwMDBFLTk5OSAgICAgLTEgIC0+IDEuMDAwMDAwMEUtMTAwMAorcm90eDE1MiByb3RhdGUgIDEuMDAwMDAwMDBFLTk5OSAgICAgLTggIC0+IDFFLTEwMDcKK3JvdHgxNTMgcm90YXRlICAxLjAwMDAwMDAwRS05OTkgICAgICAxICAtPiAxRS0xMDA3Cityb3R4MTU0IHJvdGF0ZSAgMS4wMDAwMDAwMEUtOTk5ICAgICAgOCAgLT4gMS4wMDAwMDAwRS0xMDAwCityb3R4MTU1IHJvdGF0ZSAgOS4wMDAwMDAwMEUtOTk5ICAgICAtMSAgLT4gOS4wMDAwMDAwRS0xMDAwCityb3R4MTU2IHJvdGF0ZSAgOS4wMDAwMDAwMEUtOTk5ICAgICAtOCAgLT4gOUUtMTAwNworcm90eDE1NyByb3RhdGUgIDkuMDAwMDAwMDBFLTk5OSAgICAgIDEgIC0+IDlFLTEwMDcKK3JvdHgxNTggcm90YXRlICA5LjAwMDAwMDAwRS05OTkgICAgICA4ICAtPiA5LjAwMDAwMDBFLTEwMDAKK3JvdHgxNjAgcm90YXRlICAxRS0xMDA3ICAgICAgICAgICAgIC0xICAtPiAxLjAwMDAwMDAwRS05OTkKK3JvdHgxNjEgcm90YXRlICAxRS0xMDA3ICAgICAgICAgICAgIC04ICAtPiAxLjBFLTEwMDYKK3JvdHgxNjIgcm90YXRlICAxRS0xMDA3ICAgICAgICAgICAgICAxICAtPiAxLjBFLTEwMDYKK3JvdHgxNjMgcm90YXRlICAxRS0xMDA3ICAgICAgICAgICAgICA4ICAtPiAxLjAwMDAwMDAwRS05OTkKKy0tICBuZWdhdGl2ZXMKK3JvdHgxNzEgcm90YXRlIC05Ljk5OTk5OTk5RSs5OTkgICAgIC0xICAtPiAtOS45OTk5OTk5OUUrOTk5Cityb3R4MTcyIHJvdGF0ZSAtOS45OTk5OTk5OUUrOTk5ICAgICAtOCAgLT4gLTkuOTk5OTk5OTlFKzk5OQorcm90eDE3MyByb3RhdGUgLTkuOTk5OTk5OTlFKzk5OSAgICAgIDEgIC0+IC05Ljk5OTk5OTk5RSs5OTkKK3JvdHgxNzQgcm90YXRlIC05Ljk5OTk5OTk5RSs5OTkgICAgICA4ICAtPiAtOS45OTk5OTk5OUUrOTk5Cityb3R4MTc1IHJvdGF0ZSAtMUUtOTk5ICAgICAgICAgICAgICAtMSAgLT4gLTEuMDAwMDAwMDBFLTk5MQorcm90eDE3NiByb3RhdGUgLTFFLTk5OSAgICAgICAgICAgICAgLTggIC0+IC0xLjBFLTk5OAorcm90eDE3NyByb3RhdGUgLTFFLTk5OSAgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTk5OAorcm90eDE3OCByb3RhdGUgLTFFLTk5OSAgICAgICAgICAgICAgIDggIC0+IC0xLjAwMDAwMDAwRS05OTEKK3JvdHgxODEgcm90YXRlIC0xLjAwMDAwMDAwRS05OTkgICAgIC0xICAtPiAtMS4wMDAwMDAwRS0xMDAwCityb3R4MTgyIHJvdGF0ZSAtMS4wMDAwMDAwMEUtOTk5ICAgICAtOCAgLT4gLTFFLTEwMDcKK3JvdHgxODMgcm90YXRlIC0xLjAwMDAwMDAwRS05OTkgICAgICAxICAtPiAtMUUtMTAwNworcm90eDE4NCByb3RhdGUgLTEuMDAwMDAwMDBFLTk5OSAgICAgIDggIC0+IC0xLjAwMDAwMDBFLTEwMDAKK3JvdHgxODUgcm90YXRlIC05LjAwMDAwMDAwRS05OTkgICAgIC0xICAtPiAtOS4wMDAwMDAwRS0xMDAwCityb3R4MTg2IHJvdGF0ZSAtOS4wMDAwMDAwMEUtOTk5ICAgICAtOCAgLT4gLTlFLTEwMDcKK3JvdHgxODcgcm90YXRlIC05LjAwMDAwMDAwRS05OTkgICAgICAxICAtPiAtOUUtMTAwNworcm90eDE4OCByb3RhdGUgLTkuMDAwMDAwMDBFLTk5OSAgICAgIDggIC0+IC05LjAwMDAwMDBFLTEwMDAKK3JvdHgxOTAgcm90YXRlIC0xRS0xMDA3ICAgICAgICAgICAgIC0xICAtPiAtMS4wMDAwMDAwMEUtOTk5Cityb3R4MTkxIHJvdGF0ZSAtMUUtMTAwNyAgICAgICAgICAgICAtOCAgLT4gLTEuMEUtMTAwNgorcm90eDE5MiByb3RhdGUgLTFFLTEwMDcgICAgICAgICAgICAgIDEgIC0+IC0xLjBFLTEwMDYKK3JvdHgxOTMgcm90YXRlIC0xRS0xMDA3ICAgICAgICAgICAgICA4ICAtPiAtMS4wMDAwMDAwMEUtOTk5CisKKy0tIG1vcmUgbmVnYXRpdmVzIChvZiBzYW5pdGllcykKK3JvdHgyMDEgcm90YXRlICAgICAgICAgLTAgICAgMCAgLT4gIC0wCityb3R4MjAyIHJvdGF0ZSAgICAgICAgIC0wICAgIDIgIC0+ICAtMAorcm90eDIwMyByb3RhdGUgICAgICAgICAtMSAgICAyICAtPiAgLTEwMAorcm90eDIwNCByb3RhdGUgICAgICAgICAtMSAgICA4ICAtPiAgLTEwMDAwMDAwMAorcm90eDIwNSByb3RhdGUgICAgICAgICAtMSAgICA5ICAtPiAgLTEKK3JvdHgyMDYgcm90YXRlICAgICAgICAgLTEgICAtMSAgLT4gIC0xMDAwMDAwMDAKK3JvdHgyMDcgcm90YXRlIC0xMjM0NTY3ODkgICAtMSAgLT4gIC05MTIzNDU2NzgKK3JvdHgyMDggcm90YXRlIC0xMjM0NTY3ODkgICAtOCAgLT4gIC0yMzQ1Njc4OTEKK3JvdHgyMDkgcm90YXRlIC0xMjM0NTY3ODkgICAtOSAgLT4gIC0xMjM0NTY3ODkKK3JvdHgyMTAgcm90YXRlICAgICAgICAgLTAgICAtMiAgLT4gIC0wCisKKy0tIFNwZWNpYWxzOyBOYU5zIGFyZSBoYW5kbGVkIGFzIHVzdWFsCityb3R4NzgxIHJvdGF0ZSAtSW5mICAtOCAgICAgLT4gLUluZmluaXR5Cityb3R4NzgyIHJvdGF0ZSAtSW5mICAtMSAgICAgLT4gLUluZmluaXR5Cityb3R4NzgzIHJvdGF0ZSAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5Cityb3R4Nzg0IHJvdGF0ZSAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5Cityb3R4Nzg1IHJvdGF0ZSAtSW5mICAgMSAgICAgLT4gLUluZmluaXR5Cityb3R4Nzg2IHJvdGF0ZSAtSW5mICAgOCAgICAgLT4gLUluZmluaXR5Cityb3R4Nzg3IHJvdGF0ZSAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3R4Nzg4IHJvdGF0ZSAtSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3R4Nzg5IHJvdGF0ZSAtMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3R4NzkwIHJvdGF0ZSAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3R4NzkxIHJvdGF0ZSAgMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3R4NzkyIHJvdGF0ZSAgMSAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3R4NzkzIHJvdGF0ZSAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCityb3R4Nzk0IHJvdGF0ZSAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3JvdHg4MDAgcm90YXRlICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MDEgcm90YXRlICBJbmYgIC04ICAgICAtPiBJbmZpbml0eQorcm90eDgwMiByb3RhdGUgIEluZiAgLTEgICAgIC0+IEluZmluaXR5Cityb3R4ODAzIHJvdGF0ZSAgSW5mICAtMCAgICAgLT4gSW5maW5pdHkKK3JvdHg4MDQgcm90YXRlICBJbmYgICAwICAgICAtPiBJbmZpbml0eQorcm90eDgwNSByb3RhdGUgIEluZiAgIDEgICAgIC0+IEluZmluaXR5Cityb3R4ODA2IHJvdGF0ZSAgSW5mICAgOCAgICAgLT4gSW5maW5pdHkKK3JvdHg4MDcgcm90YXRlICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MDggcm90YXRlIC0xMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MDkgcm90YXRlIC1JbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MTAgcm90YXRlIC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MTEgcm90YXRlIC0wICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MTIgcm90YXRlICAwICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MTMgcm90YXRlICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MTQgcm90YXRlICAxMDAwICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4MTUgcm90YXRlICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworcm90eDgyMSByb3RhdGUgIE5hTiAtSW5mICAgIC0+ICBOYU4KK3JvdHg4MjIgcm90YXRlICBOYU4gLTEwMDAgICAtPiAgTmFOCityb3R4ODIzIHJvdGF0ZSAgTmFOIC0xICAgICAgLT4gIE5hTgorcm90eDgyNCByb3RhdGUgIE5hTiAtMCAgICAgIC0+ICBOYU4KK3JvdHg4MjUgcm90YXRlICBOYU4gIDAgICAgICAtPiAgTmFOCityb3R4ODI2IHJvdGF0ZSAgTmFOICAxICAgICAgLT4gIE5hTgorcm90eDgyNyByb3RhdGUgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK3JvdHg4Mjggcm90YXRlICBOYU4gIEluZiAgICAtPiAgTmFOCityb3R4ODI5IHJvdGF0ZSAgTmFOICBOYU4gICAgLT4gIE5hTgorcm90eDgzMCByb3RhdGUgLUluZiAgTmFOICAgIC0+ICBOYU4KK3JvdHg4MzEgcm90YXRlIC0xMDAwIE5hTiAgICAtPiAgTmFOCityb3R4ODMyIHJvdGF0ZSAtMSAgICBOYU4gICAgLT4gIE5hTgorcm90eDgzMyByb3RhdGUgLTAgICAgTmFOICAgIC0+ICBOYU4KK3JvdHg4MzQgcm90YXRlICAwICAgIE5hTiAgICAtPiAgTmFOCityb3R4ODM1IHJvdGF0ZSAgMSAgICBOYU4gICAgLT4gIE5hTgorcm90eDgzNiByb3RhdGUgIDEwMDAgTmFOICAgIC0+ICBOYU4KK3JvdHg4Mzcgcm90YXRlICBJbmYgIE5hTiAgICAtPiAgTmFOCisKKworCityb3R4ODQxIHJvdGF0ZSAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NDIgcm90YXRlICBzTmFOIC0xMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg0MyByb3RhdGUgIHNOYU4gLTEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODQ0IHJvdGF0ZSAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NDUgcm90YXRlICBzTmFOICAwICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg0NiByb3RhdGUgIHNOYU4gIDEgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODQ3IHJvdGF0ZSAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NDggcm90YXRlICBzTmFOICBOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg0OSByb3RhdGUgIHNOYU4gc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODUwIHJvdGF0ZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NTEgcm90YXRlIC1JbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg1MiByb3RhdGUgLTEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODUzIHJvdGF0ZSAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NTQgcm90YXRlIC0wICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg1NSByb3RhdGUgIDAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODU2IHJvdGF0ZSAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NTcgcm90YXRlICAxMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg1OCByb3RhdGUgIEluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODU5IHJvdGF0ZSAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworcm90eDg2MSByb3RhdGUgIE5hTjEgICAtSW5mICAgIC0+ICBOYU4xCityb3R4ODYyIHJvdGF0ZSArTmFOMiAgIC0xMDAwICAgLT4gIE5hTjIKK3JvdHg4NjMgcm90YXRlICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworcm90eDg2NCByb3RhdGUgIE5hTjQgICAgSW5mICAgIC0+ICBOYU40Cityb3R4ODY1IHJvdGF0ZSAgTmFONSAgICtOYU42ICAgLT4gIE5hTjUKK3JvdHg4NjYgcm90YXRlIC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworcm90eDg2NyByb3RhdGUgLTEwMDAgICAgTmFOOCAgIC0+ICBOYU44Cityb3R4ODY4IHJvdGF0ZSAgMTAwMCAgICBOYU45ICAgLT4gIE5hTjkKK3JvdHg4Njkgcm90YXRlICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK3JvdHg4NzEgcm90YXRlICBzTmFOMTEgIC1JbmYgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODcyIHJvdGF0ZSAgc05hTjEyICAtMTAwMCAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg3MyByb3RhdGUgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4NzQgcm90YXRlICBzTmFOMTQgICBOYU4xNyAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODc1IHJvdGF0ZSAgc05hTjE1ICBzTmFOMTggLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg3NiByb3RhdGUgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4Nzcgcm90YXRlIC1JbmYgICAgK3NOYU4yMCAtPiAgTmFOMjAgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODc4IHJvdGF0ZSAtMTAwMCAgICBzTmFOMjEgLT4gIE5hTjIxICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg3OSByb3RhdGUgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4ODAgcm90YXRlICBJbmYgICAgIHNOYU4yMyAtPiAgTmFOMjMgIEludmFsaWRfb3BlcmF0aW9uCityb3R4ODgxIHJvdGF0ZSArTmFOMjUgICtzTmFOMjQgLT4gIE5hTjI0ICBJbnZhbGlkX29wZXJhdGlvbgorcm90eDg4MiByb3RhdGUgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorcm90eDg4MyByb3RhdGUgLXNOYU4yNyAgc05hTjI5IC0+IC1OYU4yNyAgSW52YWxpZF9vcGVyYXRpb24KK3JvdHg4ODQgcm90YXRlICAxMDAwICAgIC1OYU4zMCAtPiAtTmFOMzAKK3JvdHg4ODUgcm90YXRlICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZQorcHJlY2lzaW9uOiA1Cityb3R4ODg2IHJvdGF0ZSAgMTEgLXNOYU4xMjM0NTY3ODkwIC0+IC1OYU42Nzg5MCAgSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcm91bmRpbmcuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvcm91bmRpbmcuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWYxMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9yb3VuZGluZy5kZWNUZXN0CkBAIC0wLDAgKzEsMTMwMyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSByb3VuZGluZy5kZWNUZXN0IC0tIGRlY2ltYWwgcm91bmRpbmcgbW9kZXMgdGVzdGNhc2VzICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoZXNlIHRlc3RzIHJlcXVpcmUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgdGFrZSBhY2NvdW50IG9mIHJlc2lkdWVzIGluCistLSBvcmRlciB0byBnZXQgY29ycmVjdCByZXN1bHRzIGZvciBzb21lIHJvdW5kaW5nIG1vZGVzLiAgUmF0aGVyIHRoYW4KKy0tIHNpbmdsZSByb3VuZGluZyB0ZXN0cyB3ZSB0aGVyZWZvcmUgbmVlZCB0ZXN0cyBmb3IgbW9zdCBvcGVyYXRvcnMuCistLSBbV2UgZG8gYXNzdW1lIGFkZC9taW51cy9wbHVzL3N1YnRyYWN0IGFyZSBjb21tb24gcGF0aHMsIGhvd2V2ZXIsIGFzCistLSBpcyByb3VuZGluZyBvZiBuZWdhdGl2ZXMgKGlmIHRoZSBsYXR0ZXIgd29ya3MgZm9yIGFkZGl0aW9uLCBhc3N1bWUgaXQKKy0tIHdvcmtzIGZvciB0aGUgb3RoZXJzLCB0b28pLl0KKy0tCistLSBSb3VuZC1mb3ItcmVyb3VuZCAoMDVVUCkgaXMgdGVzdGVkIGFzIGEgc2VwYXJhdGUgYmxvY2ssIG1vc3RseSBmb3IKKy0tICdoaXN0b3JpY2FsJyByZWFzb25zLgorLS0KKy0tIFVuZGVyZmxvdyBTdWJub3JtYWwgYW5kIG92ZXJmbG93IGJlaGF2aW91cnMgYXJlIHRlc3RlZCB1bmRlciB0aGUKKy0tIGluZGl2aWR1YWwgb3BlcmF0b3JzLgorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDUgICAgICAgICAgIC0tIGZvciBlYXNpZXIgdmlzdWFsIGluc3BlY3Rpb24KK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CisKKy0tIEFkZGl0aW9uIG9wZXJhdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCityb3VuZGluZzogZG93bgorCityYWR4MTAwICBhZGQgMTIzNDUgLTAuMSAgICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMDEgIGFkZCAxMjM0NSAtMC4wMSAgICAgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDEwMiAgYWRkIDEyMzQ1IC0wLjAwMSAgICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MTAzICBhZGQgMTIzNDUgLTAuMDAwMDEgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMDQgIGFkZCAxMjM0NSAtMC4wMDAwMDEgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDEwNSAgYWRkIDEyMzQ1IC0wLjAwMDAwMDEgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MTA2ICBhZGQgMTIzNDUgIDAgICAgICAgICAtPiAxMjM0NQorcmFkeDEwNyAgYWRkIDEyMzQ1ICAwLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTA4ICBhZGQgMTIzNDUgIDAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMDkgIGFkZCAxMjM0NSAgMC4wMDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDExMCAgYWRkIDEyMzQ1ICAwLjAwMDEgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTExICBhZGQgMTIzNDUgIDAuMDAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMTIgIGFkZCAxMjM0NSAgMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDExMyAgYWRkIDEyMzQ1ICAwLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgxMTUgIGFkZCAxMjM0NiAgMC40OTk5OSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDExNiAgYWRkIDEyMzQ2ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTE3ICBhZGQgMTIzNDYgIDAuNTAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDEyMCAgYWRkIDEyMzQ1ICAwLjQgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTIxICBhZGQgMTIzNDUgIDAuNDkgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMjIgIGFkZCAxMjM0NSAgMC40OTkgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDEyMyAgYWRkIDEyMzQ1ICAwLjQ5OTk5ICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTI0ICBhZGQgMTIzNDUgIDAuNSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMjUgIGFkZCAxMjM0NSAgMC41MDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDEyNiAgYWRkIDEyMzQ1ICAwLjUwMDEgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTI3ICBhZGQgMTIzNDUgIDAuNTAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxMjggIGFkZCAxMjM0NSAgMC41MSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDEyOSAgYWRkIDEyMzQ1ICAwLjYgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KKworcmFkeDE0MCAgYWRkIDEyMzQ1IC0wLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTQxICBhZGQgMTIzNDUgLTAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNDIgIGFkZCAxMjM0NSAtMC4wMDEgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE0MyAgYWRkIDEyMzQ1IC0wLjAwMDAxICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTQ0ICBhZGQgMTIzNDUgLTAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNDUgIGFkZCAxMjM0NSAtMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE0NiAgYWRkIDEyMzQ1ICAwICAgICAgICAgLT4gMTIzNDUKK3JhZHgxNDcgIGFkZCAxMjM0NSAgMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE0OCAgYWRkIDEyMzQ1ICAwLjAwMDAwMSAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTQ5ICBhZGQgMTIzNDUgIDAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNTAgIGFkZCAxMjM0NSAgMC4wMDAxICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE1MSAgYWRkIDEyMzQ1ICAwLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTUyICBhZGQgMTIzNDUgIDAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNTMgIGFkZCAxMjM0NSAgMC4xICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityYWR4MTU1ICBhZGQgMTIzNDYgIDAuNDk5OTkgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNTYgIGFkZCAxMjM0NiAgMC41ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE1NyAgYWRkIDEyMzQ2ICAwLjUwMDAxICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgxNjAgIGFkZCAxMjM0NSAgMC40ICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE2MSAgYWRkIDEyMzQ1ICAwLjQ5ICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTYyICBhZGQgMTIzNDUgIDAuNDk5ICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNjMgIGFkZCAxMjM0NSAgMC40OTk5OSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE2NCAgYWRkIDEyMzQ1ICAwLjUgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTY1ICBhZGQgMTIzNDUgIDAuNTAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNjYgIGFkZCAxMjM0NSAgMC41MDAxICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE2NyAgYWRkIDEyMzQ1ICAwLjUwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTY4ICBhZGQgMTIzNDUgIDAuNTEgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNjkgIGFkZCAxMjM0NSAgMC42ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCisKK3JhZHgxNzAgIGFkZCAxMjM0NSAtMC4xICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE3MSAgYWRkIDEyMzQ1IC0wLjAxICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTcyICBhZGQgMTIzNDUgLTAuMDAxICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNzMgIGFkZCAxMjM0NSAtMC4wMDAwMSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE3NCAgYWRkIDEyMzQ1IC0wLjAwMDAwMSAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTc1ICBhZGQgMTIzNDUgLTAuMDAwMDAwMSAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNzYgIGFkZCAxMjM0NSAgMCAgICAgICAgIC0+IDEyMzQ1CityYWR4MTc3ICBhZGQgMTIzNDUgIDAuMDAwMDAwMSAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxNzggIGFkZCAxMjM0NSAgMC4wMDAwMDEgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE3OSAgYWRkIDEyMzQ1ICAwLjAwMDAxICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTgwICBhZGQgMTIzNDUgIDAuMDAwMSAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxODEgIGFkZCAxMjM0NSAgMC4wMDEgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE4MiAgYWRkIDEyMzQ1ICAwLjAxICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTgzICBhZGQgMTIzNDUgIDAuMSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDE4NSAgYWRkIDEyMzQ2ICAwLjQ5OTk5ICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTg2ICBhZGQgMTIzNDYgIDAuNSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxODcgIGFkZCAxMjM0NiAgMC41MDAwMSAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorCityYWR4MTkwICBhZGQgMTIzNDUgIDAuNCAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxOTEgIGFkZCAxMjM0NSAgMC40OSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDE5MiAgYWRkIDEyMzQ1ICAwLjQ5OSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MTkzICBhZGQgMTIzNDUgIDAuNDk5OTkgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxOTQgIGFkZCAxMjM0NSAgMC41ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE5NSAgYWRkIDEyMzQ1ICAwLjUwMDAxICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTk2ICBhZGQgMTIzNDUgIDAuNTAwMSAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgxOTcgIGFkZCAxMjM0NSAgMC41MDEgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDE5OCAgYWRkIDEyMzQ1ICAwLjUxICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MTk5ICBhZGQgMTIzNDUgIDAuNiAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKKworcmFkeDIwMCAgYWRkIDEyMzQ1IC0wLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjAxICBhZGQgMTIzNDUgLTAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMDIgIGFkZCAxMjM0NSAtMC4wMDEgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIwMyAgYWRkIDEyMzQ1IC0wLjAwMDAxICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjA0ICBhZGQgMTIzNDUgLTAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMDUgIGFkZCAxMjM0NSAtMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIwNiAgYWRkIDEyMzQ1ICAwICAgICAgICAgLT4gMTIzNDUKK3JhZHgyMDcgIGFkZCAxMjM0NSAgMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIwOCAgYWRkIDEyMzQ1ICAwLjAwMDAwMSAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjA5ICBhZGQgMTIzNDUgIDAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMTAgIGFkZCAxMjM0NSAgMC4wMDAxICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIxMSAgYWRkIDEyMzQ1ICAwLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjEyICBhZGQgMTIzNDUgIDAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMTMgIGFkZCAxMjM0NSAgMC4xICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityYWR4MjE1ICBhZGQgMTIzNDYgIDAuNDk5OTkgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMTYgIGFkZCAxMjM0NiAgMC41ICAgICAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcmFkeDIxNyAgYWRkIDEyMzQ2ICAwLjUwMDAxICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgyMjAgIGFkZCAxMjM0NSAgMC40ICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIyMSAgYWRkIDEyMzQ1ICAwLjQ5ICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjIyICBhZGQgMTIzNDUgIDAuNDk5ICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMjMgIGFkZCAxMjM0NSAgMC40OTk5OSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIyNCAgYWRkIDEyMzQ1ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjI1ICBhZGQgMTIzNDUgIDAuNTAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMjYgIGFkZCAxMjM0NSAgMC41MDAxICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDIyNyAgYWRkIDEyMzQ1ICAwLjUwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjI4ICBhZGQgMTIzNDUgIDAuNTEgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMjkgIGFkZCAxMjM0NSAgMC42ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogdXAKKworcmFkeDIzMCAgYWRkIDEyMzQ1IC0wLjEgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjMxICBhZGQgMTIzNDUgLTAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMzIgIGFkZCAxMjM0NSAtMC4wMDEgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIzMyAgYWRkIDEyMzQ1IC0wLjAwMDAxICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MjM0ICBhZGQgMTIzNDUgLTAuMDAwMDAxICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyMzUgIGFkZCAxMjM0NSAtMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDIzNiAgYWRkIDEyMzQ1ICAwICAgICAgICAgLT4gMTIzNDUKK3JhZHgyMzcgIGFkZCAxMjM0NSAgMC4wMDAwMDAxIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDIzOCAgYWRkIDEyMzQ1ICAwLjAwMDAwMSAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjM5ICBhZGQgMTIzNDUgIDAuMDAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNDAgIGFkZCAxMjM0NSAgMC4wMDAxICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI0MSAgYWRkIDEyMzQ1ICAwLjAwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjQyICBhZGQgMTIzNDUgIDAuMDEgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNDMgIGFkZCAxMjM0NSAgMC4xICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityYWR4MjQ1ICBhZGQgMTIzNDYgIDAuNDk5OTkgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNDYgIGFkZCAxMjM0NiAgMC41ICAgICAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcmFkeDI0NyAgYWRkIDEyMzQ2ICAwLjUwMDAxICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgyNTAgIGFkZCAxMjM0NSAgMC40ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI1MSAgYWRkIDEyMzQ1ICAwLjQ5ICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjUyICBhZGQgMTIzNDUgIDAuNDk5ICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNTMgIGFkZCAxMjM0NSAgMC40OTk5OSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI1NCAgYWRkIDEyMzQ1ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjU1ICBhZGQgMTIzNDUgIDAuNTAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNTYgIGFkZCAxMjM0NSAgMC41MDAxICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDI1NyAgYWRkIDEyMzQ1ICAwLjUwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MjU4ICBhZGQgMTIzNDUgIDAuNTEgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgyNTkgIGFkZCAxMjM0NSAgMC42ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZmxvb3IKKworcmFkeDMwMCAgYWRkIDEyMzQ1IC0wLjEgICAgICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MzAxICBhZGQgMTIzNDUgLTAuMDEgICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMDIgIGFkZCAxMjM0NSAtMC4wMDEgICAgIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDMwMyAgYWRkIDEyMzQ1IC0wLjAwMDAxICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityYWR4MzA0ICBhZGQgMTIzNDUgLTAuMDAwMDAxICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMDUgIGFkZCAxMjM0NSAtMC4wMDAwMDAxIC0+IDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmFkeDMwNiAgYWRkIDEyMzQ1ICAwICAgICAgICAgLT4gMTIzNDUKK3JhZHgzMDcgIGFkZCAxMjM0NSAgMC4wMDAwMDAxIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMwOCAgYWRkIDEyMzQ1ICAwLjAwMDAwMSAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzA5ICBhZGQgMTIzNDUgIDAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMTAgIGFkZCAxMjM0NSAgMC4wMDAxICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMxMSAgYWRkIDEyMzQ1ICAwLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzEyICBhZGQgMTIzNDUgIDAuMDEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMTMgIGFkZCAxMjM0NSAgMC4xICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityYWR4MzE1ICBhZGQgMTIzNDYgIDAuNDk5OTkgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMTYgIGFkZCAxMjM0NiAgMC41ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDMxNyAgYWRkIDEyMzQ2ICAwLjUwMDAxICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgzMjAgIGFkZCAxMjM0NSAgMC40ICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMyMSAgYWRkIDEyMzQ1ICAwLjQ5ICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzIyICBhZGQgMTIzNDUgIDAuNDk5ICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMjMgIGFkZCAxMjM0NSAgMC40OTk5OSAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMyNCAgYWRkIDEyMzQ1ICAwLjUgICAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzI1ICBhZGQgMTIzNDUgIDAuNTAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMjYgIGFkZCAxMjM0NSAgMC41MDAxICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMyNyAgYWRkIDEyMzQ1ICAwLjUwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzI4ICBhZGQgMTIzNDUgIDAuNTEgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMjkgIGFkZCAxMjM0NSAgMC42ICAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworCityYWR4MzMwICBhZGQgMTIzNDUgLTAuMSAgICAgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMzEgIGFkZCAxMjM0NSAtMC4wMSAgICAgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMzMiAgYWRkIDEyMzQ1IC0wLjAwMSAgICAgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzMzICBhZGQgMTIzNDUgLTAuMDAwMDEgICAtPiAxMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMzQgIGFkZCAxMjM0NSAtMC4wMDAwMDEgIC0+IDEyMzQ1IEluZXhhY3QgUm91bmRlZAorcmFkeDMzNSAgYWRkIDEyMzQ1IC0wLjAwMDAwMDEgLT4gMTIzNDUgSW5leGFjdCBSb3VuZGVkCityYWR4MzM2ICBhZGQgMTIzNDUgIDAgICAgICAgICAtPiAxMjM0NQorcmFkeDMzNyAgYWRkIDEyMzQ1ICAwLjAwMDAwMDEgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzM4ICBhZGQgMTIzNDUgIDAuMDAwMDAxICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzMzkgIGFkZCAxMjM0NSAgMC4wMDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM0MCAgYWRkIDEyMzQ1ICAwLjAwMDEgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzQxICBhZGQgMTIzNDUgIDAuMDAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNDIgIGFkZCAxMjM0NSAgMC4wMSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM0MyAgYWRkIDEyMzQ1ICAwLjEgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKK3JhZHgzNDUgIGFkZCAxMjM0NiAgMC40OTk5OSAgIC0+IDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcmFkeDM0NiAgYWRkIDEyMzQ2ICAwLjUgICAgICAgLT4gMTIzNDcgSW5leGFjdCBSb3VuZGVkCityYWR4MzQ3ICBhZGQgMTIzNDYgIDAuNTAwMDEgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKKworcmFkeDM1MCAgYWRkIDEyMzQ1ICAwLjQgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzUxICBhZGQgMTIzNDUgIDAuNDkgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNTIgIGFkZCAxMjM0NSAgMC40OTkgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM1MyAgYWRkIDEyMzQ1ICAwLjQ5OTk5ICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzU0ICBhZGQgMTIzNDUgIDAuNSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNTUgIGFkZCAxMjM0NSAgMC41MDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM1NiAgYWRkIDEyMzQ1ICAwLjUwMDEgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityYWR4MzU3ICBhZGQgMTIzNDUgIDAuNTAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JhZHgzNTggIGFkZCAxMjM0NSAgMC41MSAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcmFkeDM1OSAgYWRkIDEyMzQ1ICAwLjYgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlcy4uLgorCityb3VuZGluZzogZG93bgorCityc3V4MTAwICBhZGQgLTEyMzQ1IC0wLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDEwMSAgYWRkIC0xMjM0NSAtMC4wMSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMDIgIGFkZCAtMTIzNDUgLTAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTAzICBhZGQgLTEyMzQ1IC0wLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDEwNCAgYWRkIC0xMjM0NSAtMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMDUgIGFkZCAtMTIzNDUgLTAuMDAwMDAwMSAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTA2ICBhZGQgLTEyMzQ1ICAwICAgICAgICAgLT4gLTEyMzQ1Cityc3V4MTA3ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMDEgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEwOCAgYWRkIC0xMjM0NSAgMC4wMDAwMDEgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMDkgIGFkZCAtMTIzNDUgIDAuMDAwMDEgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTEwICBhZGQgLTEyMzQ1ICAwLjAwMDEgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDExMSAgYWRkIC0xMjM0NSAgMC4wMDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMTIgIGFkZCAtMTIzNDUgIDAuMDEgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTEzICBhZGQgLTEyMzQ1ICAwLjEgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorCityc3V4MTE1ICBhZGQgLTEyMzQ2ICAwLjQ5OTk5ICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDExNiAgYWRkIC0xMjM0NiAgMC41ICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMTcgIGFkZCAtMTIzNDYgIDAuNTAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgxMjAgIGFkZCAtMTIzNDUgIDAuNCAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTIxICBhZGQgLTEyMzQ1ICAwLjQ5ICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEyMiAgYWRkIC0xMjM0NSAgMC40OTkgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMjMgIGFkZCAtMTIzNDUgIDAuNDk5OTkgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTI0ICBhZGQgLTEyMzQ1ICAwLjUgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEyNSAgYWRkIC0xMjM0NSAgMC41MDAwMSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMjYgIGFkZCAtMTIzNDUgIDAuNTAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTI3ICBhZGQgLTEyMzQ1ICAwLjUwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDEyOCAgYWRkIC0xMjM0NSAgMC41MSAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxMjkgIGFkZCAtMTIzNDUgIDAuNiAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KKworcnN1eDE0MCAgYWRkIC0xMjM0NSAtMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNDEgIGFkZCAtMTIzNDUgLTAuMDEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTQyICBhZGQgLTEyMzQ1IC0wLjAwMSAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE0MyAgYWRkIC0xMjM0NSAtMC4wMDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNDQgIGFkZCAtMTIzNDUgLTAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTQ1ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMDEgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE0NiAgYWRkIC0xMjM0NSAgMCAgICAgICAgIC0+IC0xMjM0NQorcnN1eDE0NyAgYWRkIC0xMjM0NSAgMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNDggIGFkZCAtMTIzNDUgIDAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTQ5ICBhZGQgLTEyMzQ1ICAwLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE1MCAgYWRkIC0xMjM0NSAgMC4wMDAxICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNTEgIGFkZCAtMTIzNDUgIDAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTUyICBhZGQgLTEyMzQ1ICAwLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE1MyAgYWRkIC0xMjM0NSAgMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDE1NSAgYWRkIC0xMjM0NiAgMC40OTk5OSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNTYgIGFkZCAtMTIzNDYgIDAuNSAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTU3ICBhZGQgLTEyMzQ2ICAwLjUwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityc3V4MTYwICBhZGQgLTEyMzQ1ICAwLjQgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE2MSAgYWRkIC0xMjM0NSAgMC40OSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNjIgIGFkZCAtMTIzNDUgIDAuNDk5ICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTYzICBhZGQgLTEyMzQ1ICAwLjQ5OTk5ICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE2NCAgYWRkIC0xMjM0NSAgMC41ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNjUgIGFkZCAtMTIzNDUgIDAuNTAwMDEgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTY2ICBhZGQgLTEyMzQ1ICAwLjUwMDEgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDE2NyAgYWRkIC0xMjM0NSAgMC41MDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNjggIGFkZCAtMTIzNDUgIDAuNTEgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTY5ICBhZGQgLTEyMzQ1ICAwLjYgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9ldmVuCisKK3JzdXgxNzAgIGFkZCAtMTIzNDUgLTAuMSAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTcxICBhZGQgLTEyMzQ1IC0wLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE3MiAgYWRkIC0xMjM0NSAtMC4wMDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNzMgIGFkZCAtMTIzNDUgLTAuMDAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTc0ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMSAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE3NSAgYWRkIC0xMjM0NSAtMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxNzYgIGFkZCAtMTIzNDUgIDAgICAgICAgICAtPiAtMTIzNDUKK3JzdXgxNzcgIGFkZCAtMTIzNDUgIDAuMDAwMDAwMSAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTc4ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMSAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE3OSAgYWRkIC0xMjM0NSAgMC4wMDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxODAgIGFkZCAtMTIzNDUgIDAuMDAwMSAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTgxICBhZGQgLTEyMzQ1ICAwLjAwMSAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE4MiAgYWRkIC0xMjM0NSAgMC4wMSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxODMgIGFkZCAtMTIzNDUgIDAuMSAgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgxODUgIGFkZCAtMTIzNDYgIDAuNDk5OTkgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MTg2ICBhZGQgLTEyMzQ2ICAwLjUgICAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDE4NyAgYWRkIC0xMjM0NiAgMC41MDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDE5MCAgYWRkIC0xMjM0NSAgMC40ICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxOTEgIGFkZCAtMTIzNDUgIDAuNDkgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MTkyICBhZGQgLTEyMzQ1ICAwLjQ5OSAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDE5MyAgYWRkIC0xMjM0NSAgMC40OTk5OSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxOTQgIGFkZCAtMTIzNDUgIDAuNSAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTk1ICBhZGQgLTEyMzQ1ICAwLjUwMDAxICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDE5NiAgYWRkIC0xMjM0NSAgMC41MDAxICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgxOTcgIGFkZCAtMTIzNDUgIDAuNTAxICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MTk4ICBhZGQgLTEyMzQ1ICAwLjUxICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDE5OSAgYWRkIC0xMjM0NSAgMC42ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKKworcnN1eDIwMCAgYWRkIC0xMjM0NSAtMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMDEgIGFkZCAtMTIzNDUgLTAuMDEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjAyICBhZGQgLTEyMzQ1IC0wLjAwMSAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIwMyAgYWRkIC0xMjM0NSAtMC4wMDAwMSAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMDQgIGFkZCAtMTIzNDUgLTAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjA1ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMDEgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIwNiAgYWRkIC0xMjM0NSAgMCAgICAgICAgIC0+IC0xMjM0NQorcnN1eDIwNyAgYWRkIC0xMjM0NSAgMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMDggIGFkZCAtMTIzNDUgIDAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjA5ICBhZGQgLTEyMzQ1ICAwLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIxMCAgYWRkIC0xMjM0NSAgMC4wMDAxICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMTEgIGFkZCAtMTIzNDUgIDAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjEyICBhZGQgLTEyMzQ1ICAwLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIxMyAgYWRkIC0xMjM0NSAgMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDIxNSAgYWRkIC0xMjM0NiAgMC40OTk5OSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMTYgIGFkZCAtMTIzNDYgIDAuNSAgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MjE3ICBhZGQgLTEyMzQ2ICAwLjUwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityc3V4MjIwICBhZGQgLTEyMzQ1ICAwLjQgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIyMSAgYWRkIC0xMjM0NSAgMC40OSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMjIgIGFkZCAtMTIzNDUgIDAuNDk5ICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjIzICBhZGQgLTEyMzQ1ICAwLjQ5OTk5ICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDIyNCAgYWRkIC0xMjM0NSAgMC41ICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMjUgIGFkZCAtMTIzNDUgIDAuNTAwMDEgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MjI2ICBhZGQgLTEyMzQ1ICAwLjUwMDEgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDIyNyAgYWRkIC0xMjM0NSAgMC41MDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMjggIGFkZCAtMTIzNDUgIDAuNTEgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MjI5ICBhZGQgLTEyMzQ1ICAwLjYgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogdXAKKworcnN1eDIzMCAgYWRkIC0xMjM0NSAtMC4xICAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMzEgIGFkZCAtMTIzNDUgLTAuMDEgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MjMyICBhZGQgLTEyMzQ1IC0wLjAwMSAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDIzMyAgYWRkIC0xMjM0NSAtMC4wMDAwMSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMzQgIGFkZCAtMTIzNDUgLTAuMDAwMDAxICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MjM1ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMDEgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDIzNiAgYWRkIC0xMjM0NSAgMCAgICAgICAgIC0+IC0xMjM0NQorcnN1eDIzNyAgYWRkIC0xMjM0NSAgMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyMzggIGFkZCAtMTIzNDUgIDAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjM5ICBhZGQgLTEyMzQ1ICAwLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI0MCAgYWRkIC0xMjM0NSAgMC4wMDAxICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNDEgIGFkZCAtMTIzNDUgIDAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjQyICBhZGQgLTEyMzQ1ICAwLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI0MyAgYWRkIC0xMjM0NSAgMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDI0NSAgYWRkIC0xMjM0NiAgMC40OTk5OSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNDYgIGFkZCAtMTIzNDYgIDAuNSAgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MjQ3ICBhZGQgLTEyMzQ2ICAwLjUwMDAxICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityc3V4MjUwICBhZGQgLTEyMzQ1ICAwLjQgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI1MSAgYWRkIC0xMjM0NSAgMC40OSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNTIgIGFkZCAtMTIzNDUgIDAuNDk5ICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjUzICBhZGQgLTEyMzQ1ICAwLjQ5OTk5ICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI1NCAgYWRkIC0xMjM0NSAgMC41ICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNTUgIGFkZCAtMTIzNDUgIDAuNTAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjU2ICBhZGQgLTEyMzQ1ICAwLjUwMDEgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDI1NyAgYWRkIC0xMjM0NSAgMC41MDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgyNTggIGFkZCAtMTIzNDUgIDAuNTEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MjU5ICBhZGQgLTEyMzQ1ICAwLjYgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZmxvb3IKKworcnN1eDMwMCAgYWRkIC0xMjM0NSAtMC4xICAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMDEgIGFkZCAtMTIzNDUgLTAuMDEgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MzAyICBhZGQgLTEyMzQ1IC0wLjAwMSAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDMwMyAgYWRkIC0xMjM0NSAtMC4wMDAwMSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMDQgIGFkZCAtMTIzNDUgLTAuMDAwMDAxICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MzA1ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMDEgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcnN1eDMwNiAgYWRkIC0xMjM0NSAgMCAgICAgICAgIC0+IC0xMjM0NQorcnN1eDMwNyAgYWRkIC0xMjM0NSAgMC4wMDAwMDAxIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMDggIGFkZCAtMTIzNDUgIDAuMDAwMDAxICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzA5ICBhZGQgLTEyMzQ1ICAwLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMxMCAgYWRkIC0xMjM0NSAgMC4wMDAxICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMTEgIGFkZCAtMTIzNDUgIDAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzEyICBhZGQgLTEyMzQ1ICAwLjAxICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMxMyAgYWRkIC0xMjM0NSAgMC4xICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKKworcnN1eDMxNSAgYWRkIC0xMjM0NiAgMC40OTk5OSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMTYgIGFkZCAtMTIzNDYgIDAuNSAgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityc3V4MzE3ICBhZGQgLTEyMzQ2ICAwLjUwMDAxICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityc3V4MzIwICBhZGQgLTEyMzQ1ICAwLjQgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMyMSAgYWRkIC0xMjM0NSAgMC40OSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMjIgIGFkZCAtMTIzNDUgIDAuNDk5ICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzIzICBhZGQgLTEyMzQ1ICAwLjQ5OTk5ICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMyNCAgYWRkIC0xMjM0NSAgMC41ICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMjUgIGFkZCAtMTIzNDUgIDAuNTAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzI2ICBhZGQgLTEyMzQ1ICAwLjUwMDEgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMyNyAgYWRkIC0xMjM0NSAgMC41MDEgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMjggIGFkZCAtMTIzNDUgIDAuNTEgICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzI5ICBhZGQgLTEyMzQ1ICAwLjYgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworCityc3V4MzMwICBhZGQgLTEyMzQ1IC0wLjEgICAgICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMzMSAgYWRkIC0xMjM0NSAtMC4wMSAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMzIgIGFkZCAtMTIzNDUgLTAuMDAxICAgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzMzICBhZGQgLTEyMzQ1IC0wLjAwMDAxICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDMzNCAgYWRkIC0xMjM0NSAtMC4wMDAwMDEgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMzUgIGFkZCAtMTIzNDUgLTAuMDAwMDAwMSAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCityc3V4MzM2ICBhZGQgLTEyMzQ1ICAwICAgICAgICAgLT4gLTEyMzQ1Cityc3V4MzM3ICBhZGQgLTEyMzQ1ICAwLjAwMDAwMDEgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDMzOCAgYWRkIC0xMjM0NSAgMC4wMDAwMDEgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzMzkgIGFkZCAtMTIzNDUgIDAuMDAwMDEgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzQwICBhZGQgLTEyMzQ1ICAwLjAwMDEgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM0MSAgYWRkIC0xMjM0NSAgMC4wMDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNDIgIGFkZCAtMTIzNDUgIDAuMDEgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzQzICBhZGQgLTEyMzQ1ICAwLjEgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorCityc3V4MzQ1ICBhZGQgLTEyMzQ2ICAwLjQ5OTk5ICAgLT4gLTEyMzQ1IEluZXhhY3QgUm91bmRlZAorcnN1eDM0NiAgYWRkIC0xMjM0NiAgMC41ICAgICAgIC0+IC0xMjM0NSBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNDcgIGFkZCAtMTIzNDYgIDAuNTAwMDEgICAtPiAtMTIzNDUgSW5leGFjdCBSb3VuZGVkCisKK3JzdXgzNTAgIGFkZCAtMTIzNDUgIDAuNCAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzUxICBhZGQgLTEyMzQ1ICAwLjQ5ICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM1MiAgYWRkIC0xMjM0NSAgMC40OTkgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNTMgIGFkZCAtMTIzNDUgIDAuNDk5OTkgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzU0ICBhZGQgLTEyMzQ1ICAwLjUgICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM1NSAgYWRkIC0xMjM0NSAgMC41MDAwMSAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNTYgIGFkZCAtMTIzNDUgIDAuNTAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityc3V4MzU3ICBhZGQgLTEyMzQ1ICAwLjUwMSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcnN1eDM1OCAgYWRkIC0xMjM0NSAgMC41MSAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JzdXgzNTkgIGFkZCAtMTIzNDUgIDAuNiAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKKy0tIENoZWNrIGNhbmNlbGxhdGlvbiBzdWJ0cmFjdGlvbnMKKy0tIChUaGUgSUVFRSA4NTQgJ2N1cmlvdXMgcnVsZScgaW4gJDYuMykKKworcm91bmRpbmc6IGRvd24KK3J6ZXgwMDEgIGFkZCAgMCAgICAwICAgIC0+ICAwCityemV4MDAyICBhZGQgIDAgICAtMCAgICAtPiAgMAorcnpleDAwMyAgYWRkIC0wICAgIDAgICAgLT4gIDAKK3J6ZXgwMDQgIGFkZCAtMCAgIC0wICAgIC0+IC0wCityemV4MDA1ICBhZGQgIDEgICAtMSAgICAtPiAgMAorcnpleDAwNiAgYWRkIC0xICAgIDEgICAgLT4gIDAKK3J6ZXgwMDcgIGFkZCAgMS41IC0xLjUgIC0+ICAwLjAKK3J6ZXgwMDggIGFkZCAtMS41ICAxLjUgIC0+ICAwLjAKK3J6ZXgwMDkgIGFkZCAgMiAgIC0yICAgIC0+ICAwCityemV4MDEwICBhZGQgLTIgICAgMiAgICAtPiAgMAorCityb3VuZGluZzogdXAKK3J6ZXgwMTEgIGFkZCAgMCAgICAwICAgIC0+ICAwCityemV4MDEyICBhZGQgIDAgICAtMCAgICAtPiAgMAorcnpleDAxMyAgYWRkIC0wICAgIDAgICAgLT4gIDAKK3J6ZXgwMTQgIGFkZCAtMCAgIC0wICAgIC0+IC0wCityemV4MDE1ICBhZGQgIDEgICAtMSAgICAtPiAgMAorcnpleDAxNiAgYWRkIC0xICAgIDEgICAgLT4gIDAKK3J6ZXgwMTcgIGFkZCAgMS41IC0xLjUgIC0+ICAwLjAKK3J6ZXgwMTggIGFkZCAtMS41ICAxLjUgIC0+ICAwLjAKK3J6ZXgwMTkgIGFkZCAgMiAgIC0yICAgIC0+ICAwCityemV4MDIwICBhZGQgLTIgICAgMiAgICAtPiAgMAorCityb3VuZGluZzogaGFsZl91cAorcnpleDAyMSAgYWRkICAwICAgIDAgICAgLT4gIDAKK3J6ZXgwMjIgIGFkZCAgMCAgIC0wICAgIC0+ICAwCityemV4MDIzICBhZGQgLTAgICAgMCAgICAtPiAgMAorcnpleDAyNCAgYWRkIC0wICAgLTAgICAgLT4gLTAKK3J6ZXgwMjUgIGFkZCAgMSAgIC0xICAgIC0+ICAwCityemV4MDI2ICBhZGQgLTEgICAgMSAgICAtPiAgMAorcnpleDAyNyAgYWRkICAxLjUgLTEuNSAgLT4gIDAuMAorcnpleDAyOCAgYWRkIC0xLjUgIDEuNSAgLT4gIDAuMAorcnpleDAyOSAgYWRkICAyICAgLTIgICAgLT4gIDAKK3J6ZXgwMzAgIGFkZCAtMiAgICAyICAgIC0+ICAwCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK3J6ZXgwMzEgIGFkZCAgMCAgICAwICAgIC0+ICAwCityemV4MDMyICBhZGQgIDAgICAtMCAgICAtPiAgMAorcnpleDAzMyAgYWRkIC0wICAgIDAgICAgLT4gIDAKK3J6ZXgwMzQgIGFkZCAtMCAgIC0wICAgIC0+IC0wCityemV4MDM1ICBhZGQgIDEgICAtMSAgICAtPiAgMAorcnpleDAzNiAgYWRkIC0xICAgIDEgICAgLT4gIDAKK3J6ZXgwMzcgIGFkZCAgMS41IC0xLjUgIC0+ICAwLjAKK3J6ZXgwMzggIGFkZCAtMS41ICAxLjUgIC0+ICAwLjAKK3J6ZXgwMzkgIGFkZCAgMiAgIC0yICAgIC0+ICAwCityemV4MDQwICBhZGQgLTIgICAgMiAgICAtPiAgMAorCityb3VuZGluZzogaGFsZl9ldmVuCityemV4MDQxICBhZGQgIDAgICAgMCAgICAtPiAgMAorcnpleDA0MiAgYWRkICAwICAgLTAgICAgLT4gIDAKK3J6ZXgwNDMgIGFkZCAtMCAgICAwICAgIC0+ICAwCityemV4MDQ0ICBhZGQgLTAgICAtMCAgICAtPiAtMAorcnpleDA0NSAgYWRkICAxICAgLTEgICAgLT4gIDAKK3J6ZXgwNDYgIGFkZCAtMSAgICAxICAgIC0+ICAwCityemV4MDQ3ICBhZGQgIDEuNSAtMS41ICAtPiAgMC4wCityemV4MDQ4ICBhZGQgLTEuNSAgMS41ICAtPiAgMC4wCityemV4MDQ5ICBhZGQgIDIgICAtMiAgICAtPiAgMAorcnpleDA1MCAgYWRkIC0yICAgIDIgICAgLT4gIDAKKworcm91bmRpbmc6IGZsb29yCityemV4MDUxICBhZGQgIDAgICAgMCAgICAtPiAgMAorcnpleDA1MiAgYWRkICAwICAgLTAgICAgLT4gLTAgICAgLS0gaGVyZSBhcmUgdHdvICdjdXJpb3VzJworcnpleDA1MyAgYWRkIC0wICAgIDAgICAgLT4gLTAgICAgLS0KK3J6ZXgwNTQgIGFkZCAtMCAgIC0wICAgIC0+IC0wCityemV4MDU1ICBhZGQgIDEgICAtMSAgICAtPiAtMCAgICAtLSBoZXJlIGFyZSB0aGUgcmVzdAorcnpleDA1NiAgYWRkIC0xICAgIDEgICAgLT4gLTAgICAgLS0gLi4KK3J6ZXgwNTcgIGFkZCAgMS41IC0xLjUgIC0+IC0wLjAgIC0tIC4uCityemV4MDU4ICBhZGQgLTEuNSAgMS41ICAtPiAtMC4wICAtLSAuLgorcnpleDA1OSAgYWRkICAyICAgLTIgICAgLT4gLTAgICAgLS0gLi4KK3J6ZXgwNjAgIGFkZCAtMiAgICAyICAgIC0+IC0wICAgIC0tIC4uCisKK3JvdW5kaW5nOiBjZWlsaW5nCityemV4MDYxICBhZGQgIDAgICAgMCAgICAtPiAgMAorcnpleDA2MiAgYWRkICAwICAgLTAgICAgLT4gIDAKK3J6ZXgwNjMgIGFkZCAtMCAgICAwICAgIC0+ICAwCityemV4MDY0ICBhZGQgLTAgICAtMCAgICAtPiAtMAorcnpleDA2NSAgYWRkICAxICAgLTEgICAgLT4gIDAKK3J6ZXgwNjYgIGFkZCAtMSAgICAxICAgIC0+ICAwCityemV4MDY3ICBhZGQgIDEuNSAtMS41ICAtPiAgMC4wCityemV4MDY4ICBhZGQgLTEuNSAgMS41ICAtPiAgMC4wCityemV4MDY5ICBhZGQgIDIgICAtMiAgICAtPiAgMAorcnpleDA3MCAgYWRkIC0yICAgIDIgICAgLT4gIDAKKworCistLSBEaXZpc2lvbiBvcGVyYXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityb3VuZGluZzogZG93bgorcmR2eDEwMSAgZGl2aWRlIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CityZHZ4MTAyICBkaXZpZGUgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDMgSW5leGFjdCBSb3VuZGVkCityZHZ4MTAzICBkaXZpZGUgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzMzIgSW5leGFjdCBSb3VuZGVkCityZHZ4MTA0ICBkaXZpZGUgMTIzNDUgIDEuMDEgICAgICAtPiAgMTIyMjIgSW5leGFjdCBSb3VuZGVkCityZHZ4MTA1ICBkaXZpZGUgMTIzNDUgIDEuMSAgICAgICAtPiAgMTEyMjIgSW5leGFjdCBSb3VuZGVkCityZHZ4MTA2ICBkaXZpZGUgMTIzNTUgIDQgICAgICAgICAtPiAgIDMwODguNyBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMDcgIGRpdmlkZSAxMjM0NSAgNCAgICAgICAgIC0+ICAgMzA4Ni4yIEluZXhhY3QgUm91bmRlZAorcmR2eDEwOCAgZGl2aWRlIDEyMzU1ICA0LjAwMDEgICAgLT4gICAzMDg4LjYgSW5leGFjdCBSb3VuZGVkCityZHZ4MTA5ICBkaXZpZGUgMTIzNDUgIDQuMDAwMSAgICAtPiAgIDMwODYuMSBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMTAgIGRpdmlkZSAxMjM0NSAgNC45ICAgICAgIC0+ICAgMjUxOS4zIEluZXhhY3QgUm91bmRlZAorcmR2eDExMSAgZGl2aWRlIDEyMzQ1ICA0Ljk5ICAgICAgLT4gICAyNDczLjkgSW5leGFjdCBSb3VuZGVkCityZHZ4MTEyICBkaXZpZGUgMTIzNDUgIDQuOTk5ICAgICAtPiAgIDI0NjkuNCBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMTMgIGRpdmlkZSAxMjM0NSAgNC45OTk5ICAgIC0+ICAgMjQ2OS4wIEluZXhhY3QgUm91bmRlZAorcmR2eDExNCAgZGl2aWRlIDEyMzQ1ICA1ICAgICAgICAgLT4gICAyNDY5CityZHZ4MTE1ICBkaXZpZGUgMTIzNDUgIDUuMDAwMSAgICAtPiAgMjQ2OC45IEluZXhhY3QgUm91bmRlZAorcmR2eDExNiAgZGl2aWRlIDEyMzQ1ICA1LjAwMSAgICAgLT4gIDI0NjguNSBJbmV4YWN0IFJvdW5kZWQKK3JkdngxMTcgIGRpdmlkZSAxMjM0NSAgNS4wMSAgICAgIC0+ICAyNDY0LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4MTE4ICBkaXZpZGUgMTIzNDUgIDUuMSAgICAgICAtPiAgMjQyMC41IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl9kb3duCityZHZ4MjAxICBkaXZpZGUgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JkdngyMDIgIGRpdmlkZSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMDMgIGRpdmlkZSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjMzMyBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMDQgIGRpdmlkZSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjIyMyBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMDUgIGRpdmlkZSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMTIyMyBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMDYgIGRpdmlkZSAxMjM1NSAgNCAgICAgICAgIC0+ICAgMzA4OC43IEluZXhhY3QgUm91bmRlZAorcmR2eDIwNyAgZGl2aWRlIDEyMzQ1ICA0ICAgICAgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityZHZ4MjA4ICBkaXZpZGUgMTIzNTUgIDQuMDAwMSAgICAtPiAgIDMwODguNyBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMDkgIGRpdmlkZSAxMjM0NSAgNC4wMDAxICAgIC0+ICAgMzA4Ni4yIEluZXhhY3QgUm91bmRlZAorcmR2eDIxMCAgZGl2aWRlIDEyMzQ1ICA0LjkgICAgICAgLT4gICAyNTE5LjQgSW5leGFjdCBSb3VuZGVkCityZHZ4MjExICBkaXZpZGUgMTIzNDUgIDQuOTkgICAgICAtPiAgIDI0NzMuOSBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMTIgIGRpdmlkZSAxMjM0NSAgNC45OTkgICAgIC0+ICAgMjQ2OS41IEluZXhhY3QgUm91bmRlZAorcmR2eDIxMyAgZGl2aWRlIDEyMzQ1ICA0Ljk5OTkgICAgLT4gICAyNDY5LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4MjE0ICBkaXZpZGUgMTIzNDUgIDUgICAgICAgICAtPiAgIDI0NjkKK3JkdngyMTUgIGRpdmlkZSAxMjM0NSAgNS4wMDAxICAgIC0+ICAyNDY5LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4MjE2ICBkaXZpZGUgMTIzNDUgIDUuMDAxICAgICAtPiAgMjQ2OC41IEluZXhhY3QgUm91bmRlZAorcmR2eDIxNyAgZGl2aWRlIDEyMzQ1ICA1LjAxICAgICAgLT4gIDI0NjQuMSBJbmV4YWN0IFJvdW5kZWQKK3JkdngyMTggIGRpdmlkZSAxMjM0NSAgNS4xICAgICAgIC0+ICAyNDIwLjYgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3JkdngzMDEgIGRpdmlkZSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcmR2eDMwMiAgZGl2aWRlIDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmR2eDMwMyAgZGl2aWRlIDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzMzIEluZXhhY3QgUm91bmRlZAorcmR2eDMwNCAgZGl2aWRlIDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDMwNSAgZGl2aWRlIDEyMzQ1ICAxLjEgICAgICAgLT4gIDExMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDMwNiAgZGl2aWRlIDEyMzU1ICA0ICAgICAgICAgLT4gICAzMDg4LjggSW5leGFjdCBSb3VuZGVkCityZHZ4MzA3ICBkaXZpZGUgMTIzNDUgIDQgICAgICAgICAtPiAgIDMwODYuMiBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMDggIGRpdmlkZSAxMjM1NSAgNC4wMDAxICAgIC0+ICAgMzA4OC43IEluZXhhY3QgUm91bmRlZAorcmR2eDMwOSAgZGl2aWRlIDEyMzQ1ICA0LjAwMDEgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityZHZ4MzEwICBkaXZpZGUgMTIzNDUgIDQuOSAgICAgICAtPiAgIDI1MTkuNCBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMTEgIGRpdmlkZSAxMjM0NSAgNC45OSAgICAgIC0+ICAgMjQ3My45IEluZXhhY3QgUm91bmRlZAorcmR2eDMxMiAgZGl2aWRlIDEyMzQ1ICA0Ljk5OSAgICAgLT4gICAyNDY5LjUgSW5leGFjdCBSb3VuZGVkCityZHZ4MzEzICBkaXZpZGUgMTIzNDUgIDQuOTk5OSAgICAtPiAgIDI0NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMTQgIGRpdmlkZSAxMjM0NSAgNSAgICAgICAgIC0+ICAgMjQ2OQorcmR2eDMxNSAgZGl2aWRlIDEyMzQ1ICA1LjAwMDEgICAgLT4gIDI0NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3JkdngzMTYgIGRpdmlkZSAxMjM0NSAgNS4wMDEgICAgIC0+ICAyNDY4LjUgSW5leGFjdCBSb3VuZGVkCityZHZ4MzE3ICBkaXZpZGUgMTIzNDUgIDUuMDEgICAgICAtPiAgMjQ2NC4xIEluZXhhY3QgUm91bmRlZAorcmR2eDMxOCAgZGl2aWRlIDEyMzQ1ICA1LjEgICAgICAgLT4gIDI0MjAuNiBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfdXAKK3Jkdng0MDEgIGRpdmlkZSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcmR2eDQwMiAgZGl2aWRlIDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ0IEluZXhhY3QgUm91bmRlZAorcmR2eDQwMyAgZGl2aWRlIDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzMzIEluZXhhY3QgUm91bmRlZAorcmR2eDQwNCAgZGl2aWRlIDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDQwNSAgZGl2aWRlIDEyMzQ1ICAxLjEgICAgICAgLT4gIDExMjIzIEluZXhhY3QgUm91bmRlZAorcmR2eDQwNiAgZGl2aWRlIDEyMzU1ICA0ICAgICAgICAgLT4gICAzMDg4LjggSW5leGFjdCBSb3VuZGVkCityZHZ4NDA3ICBkaXZpZGUgMTIzNDUgIDQgICAgICAgICAtPiAgIDMwODYuMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MDggIGRpdmlkZSAxMjM1NSAgNC4wMDAxICAgIC0+ICAgMzA4OC43IEluZXhhY3QgUm91bmRlZAorcmR2eDQwOSAgZGl2aWRlIDEyMzQ1ICA0LjAwMDEgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityZHZ4NDEwICBkaXZpZGUgMTIzNDUgIDQuOSAgICAgICAtPiAgIDI1MTkuNCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MTEgIGRpdmlkZSAxMjM0NSAgNC45OSAgICAgIC0+ICAgMjQ3My45IEluZXhhY3QgUm91bmRlZAorcmR2eDQxMiAgZGl2aWRlIDEyMzQ1ICA0Ljk5OSAgICAgLT4gICAyNDY5LjUgSW5leGFjdCBSb3VuZGVkCityZHZ4NDEzICBkaXZpZGUgMTIzNDUgIDQuOTk5OSAgICAtPiAgIDI0NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MTQgIGRpdmlkZSAxMjM0NSAgNSAgICAgICAgIC0+ICAgMjQ2OQorcmR2eDQxNSAgZGl2aWRlIDEyMzQ1ICA1LjAwMDEgICAgLT4gIDI0NjkuMCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng0MTYgIGRpdmlkZSAxMjM0NSAgNS4wMDEgICAgIC0+ICAyNDY4LjUgSW5leGFjdCBSb3VuZGVkCityZHZ4NDE3ICBkaXZpZGUgMTIzNDUgIDUuMDEgICAgICAtPiAgMjQ2NC4xIEluZXhhY3QgUm91bmRlZAorcmR2eDQxOCAgZGl2aWRlIDEyMzQ1ICA1LjEgICAgICAgLT4gIDI0MjAuNiBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IHVwCityZHZ4NTAxICBkaXZpZGUgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jkdng1MDIgIGRpdmlkZSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MDMgIGRpdmlkZSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjMzMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MDQgIGRpdmlkZSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjIyMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MDUgIGRpdmlkZSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMTIyMyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MDYgIGRpdmlkZSAxMjM1NSAgNCAgICAgICAgIC0+ICAgMzA4OC44IEluZXhhY3QgUm91bmRlZAorcmR2eDUwNyAgZGl2aWRlIDEyMzQ1ICA0ICAgICAgICAgLT4gICAzMDg2LjMgSW5leGFjdCBSb3VuZGVkCityZHZ4NTA4ICBkaXZpZGUgMTIzNTUgIDQuMDAwMSAgICAtPiAgIDMwODguNyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MDkgIGRpdmlkZSAxMjM0NSAgNC4wMDAxICAgIC0+ICAgMzA4Ni4yIEluZXhhY3QgUm91bmRlZAorcmR2eDUxMCAgZGl2aWRlIDEyMzQ1ICA0LjkgICAgICAgLT4gICAyNTE5LjQgSW5leGFjdCBSb3VuZGVkCityZHZ4NTExICBkaXZpZGUgMTIzNDUgIDQuOTkgICAgICAtPiAgIDI0NzQuMCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MTIgIGRpdmlkZSAxMjM0NSAgNC45OTkgICAgIC0+ICAgMjQ2OS41IEluZXhhY3QgUm91bmRlZAorcmR2eDUxMyAgZGl2aWRlIDEyMzQ1ICA0Ljk5OTkgICAgLT4gICAyNDY5LjEgSW5leGFjdCBSb3VuZGVkCityZHZ4NTE0ICBkaXZpZGUgMTIzNDUgIDUgICAgICAgICAtPiAgIDI0NjkKK3Jkdng1MTUgIGRpdmlkZSAxMjM0NSAgNS4wMDAxICAgIC0+ICAyNDY5LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4NTE2ICBkaXZpZGUgMTIzNDUgIDUuMDAxICAgICAtPiAgMjQ2OC42IEluZXhhY3QgUm91bmRlZAorcmR2eDUxNyAgZGl2aWRlIDEyMzQ1ICA1LjAxICAgICAgLT4gIDI0NjQuMSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng1MTggIGRpdmlkZSAxMjM0NSAgNS4xICAgICAgIC0+ICAyNDIwLjYgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBmbG9vcgorcmR2eDYwMSAgZGl2aWRlIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CityZHZ4NjAyICBkaXZpZGUgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDMgSW5leGFjdCBSb3VuZGVkCityZHZ4NjAzICBkaXZpZGUgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzMzIgSW5leGFjdCBSb3VuZGVkCityZHZ4NjA0ICBkaXZpZGUgMTIzNDUgIDEuMDEgICAgICAtPiAgMTIyMjIgSW5leGFjdCBSb3VuZGVkCityZHZ4NjA1ICBkaXZpZGUgMTIzNDUgIDEuMSAgICAgICAtPiAgMTEyMjIgSW5leGFjdCBSb3VuZGVkCityZHZ4NjA2ICBkaXZpZGUgMTIzNTUgIDQgICAgICAgICAtPiAgIDMwODguNyBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MDcgIGRpdmlkZSAxMjM0NSAgNCAgICAgICAgIC0+ICAgMzA4Ni4yIEluZXhhY3QgUm91bmRlZAorcmR2eDYwOCAgZGl2aWRlIDEyMzU1ICA0LjAwMDEgICAgLT4gICAzMDg4LjYgSW5leGFjdCBSb3VuZGVkCityZHZ4NjA5ICBkaXZpZGUgMTIzNDUgIDQuMDAwMSAgICAtPiAgIDMwODYuMSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MTAgIGRpdmlkZSAxMjM0NSAgNC45ICAgICAgIC0+ICAgMjUxOS4zIEluZXhhY3QgUm91bmRlZAorcmR2eDYxMSAgZGl2aWRlIDEyMzQ1ICA0Ljk5ICAgICAgLT4gICAyNDczLjkgSW5leGFjdCBSb3VuZGVkCityZHZ4NjEyICBkaXZpZGUgMTIzNDUgIDQuOTk5ICAgICAtPiAgIDI0NjkuNCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MTMgIGRpdmlkZSAxMjM0NSAgNC45OTk5ICAgIC0+ICAgMjQ2OS4wIEluZXhhY3QgUm91bmRlZAorcmR2eDYxNCAgZGl2aWRlIDEyMzQ1ICA1ICAgICAgICAgLT4gICAyNDY5CityZHZ4NjE1ICBkaXZpZGUgMTIzNDUgIDUuMDAwMSAgICAtPiAgMjQ2OC45IEluZXhhY3QgUm91bmRlZAorcmR2eDYxNiAgZGl2aWRlIDEyMzQ1ICA1LjAwMSAgICAgLT4gIDI0NjguNSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng2MTcgIGRpdmlkZSAxMjM0NSAgNS4wMSAgICAgIC0+ICAyNDY0LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4NjE4ICBkaXZpZGUgMTIzNDUgIDUuMSAgICAgICAtPiAgMjQyMC41IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworcmR2eDcwMSAgZGl2aWRlIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CityZHZ4NzAyICBkaXZpZGUgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDQgSW5leGFjdCBSb3VuZGVkCityZHZ4NzAzICBkaXZpZGUgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzMzMgSW5leGFjdCBSb3VuZGVkCityZHZ4NzA0ICBkaXZpZGUgMTIzNDUgIDEuMDEgICAgICAtPiAgMTIyMjMgSW5leGFjdCBSb3VuZGVkCityZHZ4NzA1ICBkaXZpZGUgMTIzNDUgIDEuMSAgICAgICAtPiAgMTEyMjMgSW5leGFjdCBSb3VuZGVkCityZHZ4NzA2ICBkaXZpZGUgMTIzNTUgIDQgICAgICAgICAtPiAgIDMwODguOCBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MDcgIGRpdmlkZSAxMjM0NSAgNCAgICAgICAgIC0+ICAgMzA4Ni4zIEluZXhhY3QgUm91bmRlZAorcmR2eDcwOCAgZGl2aWRlIDEyMzU1ICA0LjAwMDEgICAgLT4gICAzMDg4LjcgSW5leGFjdCBSb3VuZGVkCityZHZ4NzA5ICBkaXZpZGUgMTIzNDUgIDQuMDAwMSAgICAtPiAgIDMwODYuMiBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MTAgIGRpdmlkZSAxMjM0NSAgNC45ICAgICAgIC0+ICAgMjUxOS40IEluZXhhY3QgUm91bmRlZAorcmR2eDcxMSAgZGl2aWRlIDEyMzQ1ICA0Ljk5ICAgICAgLT4gICAyNDc0LjAgSW5leGFjdCBSb3VuZGVkCityZHZ4NzEyICBkaXZpZGUgMTIzNDUgIDQuOTk5ICAgICAtPiAgIDI0NjkuNSBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MTMgIGRpdmlkZSAxMjM0NSAgNC45OTk5ICAgIC0+ICAgMjQ2OS4xIEluZXhhY3QgUm91bmRlZAorcmR2eDcxNCAgZGl2aWRlIDEyMzQ1ICA1ICAgICAgICAgLT4gICAyNDY5CityZHZ4NzE1ICBkaXZpZGUgMTIzNDUgIDUuMDAwMSAgICAtPiAgMjQ2OS4wIEluZXhhY3QgUm91bmRlZAorcmR2eDcxNiAgZGl2aWRlIDEyMzQ1ICA1LjAwMSAgICAgLT4gIDI0NjguNiBJbmV4YWN0IFJvdW5kZWQKK3Jkdng3MTcgIGRpdmlkZSAxMjM0NSAgNS4wMSAgICAgIC0+ICAyNDY0LjEgSW5leGFjdCBSb3VuZGVkCityZHZ4NzE4ICBkaXZpZGUgMTIzNDUgIDUuMSAgICAgICAtPiAgMjQyMC42IEluZXhhY3QgUm91bmRlZAorCistLSBbZGl2aWRlSW50ZWdlciBhbmQgcmVtYWluZGVyIHVuYWZmZWN0ZWRdCisKKy0tIE11bHRpcGxpY2F0aW9uIG9wZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JvdW5kaW5nOiBkb3duCitybXV4MTAxICBtdWx0aXBseSAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcm11eDEwMiAgbXVsdGlwbHkgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDYgSW5leGFjdCBSb3VuZGVkCitybXV4MTAzICBtdWx0aXBseSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjM1NyBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMDQgIG11bHRpcGx5IDEyMzQ1ICAxLjAxICAgICAgLT4gIDEyNDY4IEluZXhhY3QgUm91bmRlZAorcm11eDEwNSAgbXVsdGlwbHkgMTIzNDUgIDEuMSAgICAgICAtPiAgMTM1NzkgSW5leGFjdCBSb3VuZGVkCitybXV4MTA2ICBtdWx0aXBseSAxMjM0NSAgNCAgICAgICAgIC0+ICA0OTM4MAorcm11eDEwNyAgbXVsdGlwbHkgMTIzNDUgIDQuMDAwMSAgICAtPiAgNDkzODEgSW5leGFjdCBSb3VuZGVkCitybXV4MTA4ICBtdWx0aXBseSAxMjM0NSAgNC45ICAgICAgIC0+ICA2MDQ5MCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMDkgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDYxNjAxIEluZXhhY3QgUm91bmRlZAorcm11eDExMCAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5ICAgICAtPiAgNjE3MTIgSW5leGFjdCBSb3VuZGVkCitybXV4MTExICBtdWx0aXBseSAxMjM0NSAgNC45OTk5ICAgIC0+ICA2MTcyMyBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMTIgIG11bHRpcGx5IDEyMzQ1ICA1ICAgICAgICAgLT4gIDYxNzI1CitybXV4MTEzICBtdWx0aXBseSAxMjM0NSAgNS4wMDAxICAgIC0+ICA2MTcyNiBJbmV4YWN0IFJvdW5kZWQKK3JtdXgxMTQgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMSAgICAgLT4gIDYxNzM3IEluZXhhY3QgUm91bmRlZAorcm11eDExNSAgbXVsdGlwbHkgMTIzNDUgIDUuMDEgICAgICAtPiAgNjE4NDggSW5leGFjdCBSb3VuZGVkCitybXV4MTE2ICBtdWx0aXBseSAxMjM0NSAgMTIgICAgICAgIC0+ICAxLjQ4MTRFKzUgUm91bmRlZAorcm11eDExNyAgbXVsdGlwbHkgMTIzNDUgIDEzICAgICAgICAtPiAgMS42MDQ4RSs1IEluZXhhY3QgUm91bmRlZAorcm11eDExOCAgbXVsdGlwbHkgMTIzNTUgIDEyICAgICAgICAtPiAgMS40ODI2RSs1IFJvdW5kZWQKK3JtdXgxMTkgIG11bHRpcGx5IDEyMzU1ICAxMyAgICAgICAgLT4gIDEuNjA2MUUrNSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorcm11eDIwMSAgbXVsdGlwbHkgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JtdXgyMDIgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcm11eDIwMyAgbXVsdGlwbHkgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzNTcgSW5leGFjdCBSb3VuZGVkCitybXV4MjA0ICBtdWx0aXBseSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjQ2OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMDUgIG11bHRpcGx5IDEyMzQ1ICAxLjEgICAgICAgLT4gIDEzNTc5IEluZXhhY3QgUm91bmRlZAorcm11eDIwNiAgbXVsdGlwbHkgMTIzNDUgIDQgICAgICAgICAtPiAgNDkzODAKK3JtdXgyMDcgIG11bHRpcGx5IDEyMzQ1ICA0LjAwMDEgICAgLT4gIDQ5MzgxIEluZXhhY3QgUm91bmRlZAorcm11eDIwOCAgbXVsdGlwbHkgMTIzNDUgIDQuOSAgICAgICAtPiAgNjA0OTAgSW5leGFjdCBSb3VuZGVkCitybXV4MjA5ICBtdWx0aXBseSAxMjM0NSAgNC45OSAgICAgIC0+ICA2MTYwMiBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMTAgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDYxNzEzIEluZXhhY3QgUm91bmRlZAorcm11eDIxMSAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5OSAgICAtPiAgNjE3MjQgSW5leGFjdCBSb3VuZGVkCitybXV4MjEyICBtdWx0aXBseSAxMjM0NSAgNSAgICAgICAgIC0+ICA2MTcyNQorcm11eDIxMyAgbXVsdGlwbHkgMTIzNDUgIDUuMDAwMSAgICAtPiAgNjE3MjYgSW5leGFjdCBSb3VuZGVkCitybXV4MjE0ICBtdWx0aXBseSAxMjM0NSAgNS4wMDEgICAgIC0+ICA2MTczNyBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMTUgIG11bHRpcGx5IDEyMzQ1ICA1LjAxICAgICAgLT4gIDYxODQ4IEluZXhhY3QgUm91bmRlZAorcm11eDIxNiAgbXVsdGlwbHkgMTIzNDUgIDEyICAgICAgICAtPiAgMS40ODE0RSs1IFJvdW5kZWQKK3JtdXgyMTcgIG11bHRpcGx5IDEyMzQ1ICAxMyAgICAgICAgLT4gIDEuNjA0OEUrNSBJbmV4YWN0IFJvdW5kZWQKK3JtdXgyMTggIG11bHRpcGx5IDEyMzU1ICAxMiAgICAgICAgLT4gIDEuNDgyNkUrNSBSb3VuZGVkCitybXV4MjE5ICBtdWx0aXBseSAxMjM1NSAgMTMgICAgICAgIC0+ICAxLjYwNjFFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3JtdXgzMDEgIG11bHRpcGx5IDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitybXV4MzAyICBtdWx0aXBseSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMDMgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzU3IEluZXhhY3QgUm91bmRlZAorcm11eDMwNCAgbXVsdGlwbHkgMTIzNDUgIDEuMDEgICAgICAtPiAgMTI0NjggSW5leGFjdCBSb3VuZGVkCitybXV4MzA1ICBtdWx0aXBseSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMzU4MCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMDYgIG11bHRpcGx5IDEyMzQ1ICA0ICAgICAgICAgLT4gIDQ5MzgwCitybXV4MzA3ICBtdWx0aXBseSAxMjM0NSAgNC4wMDAxICAgIC0+ICA0OTM4MSBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMDggIG11bHRpcGx5IDEyMzQ1ICA0LjkgICAgICAgLT4gIDYwNDkwIEluZXhhY3QgUm91bmRlZAorcm11eDMwOSAgbXVsdGlwbHkgMTIzNDUgIDQuOTkgICAgICAtPiAgNjE2MDIgSW5leGFjdCBSb3VuZGVkCitybXV4MzEwICBtdWx0aXBseSAxMjM0NSAgNC45OTkgICAgIC0+ICA2MTcxMyBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMTEgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDYxNzI0IEluZXhhY3QgUm91bmRlZAorcm11eDMxMiAgbXVsdGlwbHkgMTIzNDUgIDUgICAgICAgICAtPiAgNjE3MjUKK3JtdXgzMTMgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMDEgICAgLT4gIDYxNzI2IEluZXhhY3QgUm91bmRlZAorcm11eDMxNCAgbXVsdGlwbHkgMTIzNDUgIDUuMDAxICAgICAtPiAgNjE3MzcgSW5leGFjdCBSb3VuZGVkCitybXV4MzE1ICBtdWx0aXBseSAxMjM0NSAgNS4wMSAgICAgIC0+ICA2MTg0OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXgzMTYgIG11bHRpcGx5IDEyMzQ1ICAxMiAgICAgICAgLT4gIDEuNDgxNEUrNSBSb3VuZGVkCitybXV4MzE3ICBtdWx0aXBseSAxMjM0NSAgMTMgICAgICAgIC0+ICAxLjYwNDhFKzUgSW5leGFjdCBSb3VuZGVkCitybXV4MzE4ICBtdWx0aXBseSAxMjM1NSAgMTIgICAgICAgIC0+ICAxLjQ4MjZFKzUgUm91bmRlZAorcm11eDMxOSAgbXVsdGlwbHkgMTIzNTUgIDEzICAgICAgICAtPiAgMS42MDYyRSs1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorcm11eDQwMSAgbXVsdGlwbHkgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JtdXg0MDIgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcm11eDQwMyAgbXVsdGlwbHkgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzNTcgSW5leGFjdCBSb3VuZGVkCitybXV4NDA0ICBtdWx0aXBseSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjQ2OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MDUgIG11bHRpcGx5IDEyMzQ1ICAxLjEgICAgICAgLT4gIDEzNTgwIEluZXhhY3QgUm91bmRlZAorcm11eDQwNiAgbXVsdGlwbHkgMTIzNDUgIDQgICAgICAgICAtPiAgNDkzODAKK3JtdXg0MDcgIG11bHRpcGx5IDEyMzQ1ICA0LjAwMDEgICAgLT4gIDQ5MzgxIEluZXhhY3QgUm91bmRlZAorcm11eDQwOCAgbXVsdGlwbHkgMTIzNDUgIDQuOSAgICAgICAtPiAgNjA0OTEgSW5leGFjdCBSb3VuZGVkCitybXV4NDA5ICBtdWx0aXBseSAxMjM0NSAgNC45OSAgICAgIC0+ICA2MTYwMiBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MTAgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDYxNzEzIEluZXhhY3QgUm91bmRlZAorcm11eDQxMSAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5OSAgICAtPiAgNjE3MjQgSW5leGFjdCBSb3VuZGVkCitybXV4NDEyICBtdWx0aXBseSAxMjM0NSAgNSAgICAgICAgIC0+ICA2MTcyNQorcm11eDQxMyAgbXVsdGlwbHkgMTIzNDUgIDUuMDAwMSAgICAtPiAgNjE3MjYgSW5leGFjdCBSb3VuZGVkCitybXV4NDE0ICBtdWx0aXBseSAxMjM0NSAgNS4wMDEgICAgIC0+ICA2MTczNyBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MTUgIG11bHRpcGx5IDEyMzQ1ICA1LjAxICAgICAgLT4gIDYxODQ4IEluZXhhY3QgUm91bmRlZAorcm11eDQxNiAgbXVsdGlwbHkgMTIzNDUgIDEyICAgICAgICAtPiAgMS40ODE0RSs1IFJvdW5kZWQKK3JtdXg0MTcgIG11bHRpcGx5IDEyMzQ1ICAxMyAgICAgICAgLT4gIDEuNjA0OUUrNSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg0MTggIG11bHRpcGx5IDEyMzU1ICAxMiAgICAgICAgLT4gIDEuNDgyNkUrNSBSb3VuZGVkCitybXV4NDE5ICBtdWx0aXBseSAxMjM1NSAgMTMgICAgICAgIC0+ICAxLjYwNjJFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiB1cAorcm11eDUwMSAgbXVsdGlwbHkgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JtdXg1MDIgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcm11eDUwMyAgbXVsdGlwbHkgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzNTggSW5leGFjdCBSb3VuZGVkCitybXV4NTA0ICBtdWx0aXBseSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjQ2OSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MDUgIG11bHRpcGx5IDEyMzQ1ICAxLjEgICAgICAgLT4gIDEzNTgwIEluZXhhY3QgUm91bmRlZAorcm11eDUwNiAgbXVsdGlwbHkgMTIzNDUgIDQgICAgICAgICAtPiAgNDkzODAKK3JtdXg1MDcgIG11bHRpcGx5IDEyMzQ1ICA0LjAwMDEgICAgLT4gIDQ5MzgyIEluZXhhY3QgUm91bmRlZAorcm11eDUwOCAgbXVsdGlwbHkgMTIzNDUgIDQuOSAgICAgICAtPiAgNjA0OTEgSW5leGFjdCBSb3VuZGVkCitybXV4NTA5ICBtdWx0aXBseSAxMjM0NSAgNC45OSAgICAgIC0+ICA2MTYwMiBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MTAgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDYxNzEzIEluZXhhY3QgUm91bmRlZAorcm11eDUxMSAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5OSAgICAtPiAgNjE3MjQgSW5leGFjdCBSb3VuZGVkCitybXV4NTEyICBtdWx0aXBseSAxMjM0NSAgNSAgICAgICAgIC0+ICA2MTcyNQorcm11eDUxMyAgbXVsdGlwbHkgMTIzNDUgIDUuMDAwMSAgICAtPiAgNjE3MjcgSW5leGFjdCBSb3VuZGVkCitybXV4NTE0ICBtdWx0aXBseSAxMjM0NSAgNS4wMDEgICAgIC0+ICA2MTczOCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MTUgIG11bHRpcGx5IDEyMzQ1ICA1LjAxICAgICAgLT4gIDYxODQ5IEluZXhhY3QgUm91bmRlZAorcm11eDUxNiAgbXVsdGlwbHkgMTIzNDUgIDEyICAgICAgICAtPiAgMS40ODE0RSs1IFJvdW5kZWQKK3JtdXg1MTcgIG11bHRpcGx5IDEyMzQ1ICAxMyAgICAgICAgLT4gIDEuNjA0OUUrNSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg1MTggIG11bHRpcGx5IDEyMzU1ICAxMiAgICAgICAgLT4gIDEuNDgyNkUrNSBSb3VuZGVkCitybXV4NTE5ICBtdWx0aXBseSAxMjM1NSAgMTMgICAgICAgIC0+ICAxLjYwNjJFKzUgSW5leGFjdCBSb3VuZGVkCistLSBbcm11eDUxNiAmIHJtdXg1MThdIGNhbiBzdXJwcmlzZQorCityb3VuZGluZzogZmxvb3IKK3JtdXg2MDEgIG11bHRpcGx5IDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitybXV4NjAyICBtdWx0aXBseSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MDMgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzU3IEluZXhhY3QgUm91bmRlZAorcm11eDYwNCAgbXVsdGlwbHkgMTIzNDUgIDEuMDEgICAgICAtPiAgMTI0NjggSW5leGFjdCBSb3VuZGVkCitybXV4NjA1ICBtdWx0aXBseSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMzU3OSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MDYgIG11bHRpcGx5IDEyMzQ1ICA0ICAgICAgICAgLT4gIDQ5MzgwCitybXV4NjA3ICBtdWx0aXBseSAxMjM0NSAgNC4wMDAxICAgIC0+ICA0OTM4MSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MDggIG11bHRpcGx5IDEyMzQ1ICA0LjkgICAgICAgLT4gIDYwNDkwIEluZXhhY3QgUm91bmRlZAorcm11eDYwOSAgbXVsdGlwbHkgMTIzNDUgIDQuOTkgICAgICAtPiAgNjE2MDEgSW5leGFjdCBSb3VuZGVkCitybXV4NjEwICBtdWx0aXBseSAxMjM0NSAgNC45OTkgICAgIC0+ICA2MTcxMiBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MTEgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDYxNzIzIEluZXhhY3QgUm91bmRlZAorcm11eDYxMiAgbXVsdGlwbHkgMTIzNDUgIDUgICAgICAgICAtPiAgNjE3MjUKK3JtdXg2MTMgIG11bHRpcGx5IDEyMzQ1ICA1LjAwMDEgICAgLT4gIDYxNzI2IEluZXhhY3QgUm91bmRlZAorcm11eDYxNCAgbXVsdGlwbHkgMTIzNDUgIDUuMDAxICAgICAtPiAgNjE3MzcgSW5leGFjdCBSb3VuZGVkCitybXV4NjE1ICBtdWx0aXBseSAxMjM0NSAgNS4wMSAgICAgIC0+ICA2MTg0OCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg2MTYgIG11bHRpcGx5IDEyMzQ1ICAxMiAgICAgICAgLT4gIDEuNDgxNEUrNSBSb3VuZGVkCitybXV4NjE3ICBtdWx0aXBseSAxMjM0NSAgMTMgICAgICAgIC0+ICAxLjYwNDhFKzUgSW5leGFjdCBSb3VuZGVkCitybXV4NjE4ICBtdWx0aXBseSAxMjM1NSAgMTIgICAgICAgIC0+ICAxLjQ4MjZFKzUgUm91bmRlZAorcm11eDYxOSAgbXVsdGlwbHkgMTIzNTUgIDEzICAgICAgICAtPiAgMS42MDYxRSs1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogY2VpbGluZworcm11eDcwMSAgbXVsdGlwbHkgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3JtdXg3MDIgIG11bHRpcGx5IDEyMzQ1ICAxLjAwMDEgICAgLT4gIDEyMzQ3IEluZXhhY3QgUm91bmRlZAorcm11eDcwMyAgbXVsdGlwbHkgMTIzNDUgIDEuMDAxICAgICAtPiAgMTIzNTggSW5leGFjdCBSb3VuZGVkCitybXV4NzA0ICBtdWx0aXBseSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjQ2OSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MDUgIG11bHRpcGx5IDEyMzQ1ICAxLjEgICAgICAgLT4gIDEzNTgwIEluZXhhY3QgUm91bmRlZAorcm11eDcwNiAgbXVsdGlwbHkgMTIzNDUgIDQgICAgICAgICAtPiAgNDkzODAKK3JtdXg3MDcgIG11bHRpcGx5IDEyMzQ1ICA0LjAwMDEgICAgLT4gIDQ5MzgyIEluZXhhY3QgUm91bmRlZAorcm11eDcwOCAgbXVsdGlwbHkgMTIzNDUgIDQuOSAgICAgICAtPiAgNjA0OTEgSW5leGFjdCBSb3VuZGVkCitybXV4NzA5ICBtdWx0aXBseSAxMjM0NSAgNC45OSAgICAgIC0+ICA2MTYwMiBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MTAgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDYxNzEzIEluZXhhY3QgUm91bmRlZAorcm11eDcxMSAgbXVsdGlwbHkgMTIzNDUgIDQuOTk5OSAgICAtPiAgNjE3MjQgSW5leGFjdCBSb3VuZGVkCitybXV4NzEyICBtdWx0aXBseSAxMjM0NSAgNSAgICAgICAgIC0+ICA2MTcyNQorcm11eDcxMyAgbXVsdGlwbHkgMTIzNDUgIDUuMDAwMSAgICAtPiAgNjE3MjcgSW5leGFjdCBSb3VuZGVkCitybXV4NzE0ICBtdWx0aXBseSAxMjM0NSAgNS4wMDEgICAgIC0+ICA2MTczOCBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MTUgIG11bHRpcGx5IDEyMzQ1ICA1LjAxICAgICAgLT4gIDYxODQ5IEluZXhhY3QgUm91bmRlZAorcm11eDcxNiAgbXVsdGlwbHkgMTIzNDUgIDEyICAgICAgICAtPiAgMS40ODE0RSs1IFJvdW5kZWQKK3JtdXg3MTcgIG11bHRpcGx5IDEyMzQ1ICAxMyAgICAgICAgLT4gIDEuNjA0OUUrNSBJbmV4YWN0IFJvdW5kZWQKK3JtdXg3MTggIG11bHRpcGx5IDEyMzU1ICAxMiAgICAgICAgLT4gIDEuNDgyNkUrNSBSb3VuZGVkCitybXV4NzE5ICBtdWx0aXBseSAxMjM1NSAgMTMgICAgICAgIC0+ICAxLjYwNjJFKzUgSW5leGFjdCBSb3VuZGVkCisKKy0tIFBvd2VyIG9wZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JvdW5kaW5nOiBkb3duCitycG94MTAxICBwb3dlciAxMjM0NSAgLTUgICAgICAgIC0+ICAzLjQ4NzdFLTIxIEluZXhhY3QgUm91bmRlZAorcnBveDEwMiAgcG93ZXIgMTIzNDUgIC00ICAgICAgICAtPiAgNC4zMDU2RS0xNyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMDMgIHBvd2VyIDEyMzQ1ICAtMyAgICAgICAgLT4gIDUuMzE1MkUtMTMgSW5leGFjdCBSb3VuZGVkCitycG94MTA0ICBwb3dlciAxMjM0NSAgLTIgICAgICAgIC0+ICA2LjU2MTdFLTkgSW5leGFjdCBSb3VuZGVkCitycG94MTA1ICBwb3dlciAxMjM0NSAgLTEgICAgICAgIC0+ICAwLjAwMDA4MTAwNCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMDYgIHBvd2VyIDEyMzQ1ICAwICAgICAgICAgLT4gIDEKK3Jwb3gxMDcgIHBvd2VyIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitycG94MTA4ICBwb3dlciAxMjM0NSAgMiAgICAgICAgIC0+ICAxLjUyMzlFKzggSW5leGFjdCBSb3VuZGVkCitycG94MTA5ICBwb3dlciAxMjM0NSAgMyAgICAgICAgIC0+ICAxLjg4MTNFKzEyIEluZXhhY3QgUm91bmRlZAorcnBveDExMCAgcG93ZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMi4zMjI1RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gxMTEgIHBvd2VyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDIuODY3MUUrMjAgSW5leGFjdCBSb3VuZGVkCitycG94MTEyICBwb3dlciAgIDQxNSAgMiAgICAgICAgIC0+ICAxLjcyMjJFKzUgSW5leGFjdCBSb3VuZGVkCitycG94MTEzICBwb3dlciAgICA3NSAgMyAgICAgICAgIC0+ICA0LjIxODdFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2Rvd24KK3Jwb3gyMDEgIHBvd2VyIDEyMzQ1ICAtNSAgICAgICAgLT4gIDMuNDg3N0UtMjEgSW5leGFjdCBSb3VuZGVkCitycG94MjAyICBwb3dlciAxMjM0NSAgLTQgICAgICAgIC0+ICA0LjMwNTZFLTE3IEluZXhhY3QgUm91bmRlZAorcnBveDIwMyAgcG93ZXIgMTIzNDUgIC0zICAgICAgICAtPiAgNS4zMTUzRS0xMyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gyMDQgIHBvd2VyIDEyMzQ1ICAtMiAgICAgICAgLT4gIDYuNTYxN0UtOSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gyMDUgIHBvd2VyIDEyMzQ1ICAtMSAgICAgICAgLT4gIDAuMDAwMDgxMDA0IEluZXhhY3QgUm91bmRlZAorcnBveDIwNiAgcG93ZXIgMTIzNDUgIDAgICAgICAgICAtPiAgMQorcnBveDIwNyAgcG93ZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jwb3gyMDggIHBvd2VyIDEyMzQ1ICAyICAgICAgICAgLT4gIDEuNTI0MEUrOCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gyMDkgIHBvd2VyIDEyMzQ1ICAzICAgICAgICAgLT4gIDEuODgxNEUrMTIgSW5leGFjdCBSb3VuZGVkCitycG94MjEwICBwb3dlciAxMjM0NSAgNCAgICAgICAgIC0+ICAyLjMyMjVFKzE2IEluZXhhY3QgUm91bmRlZAorcnBveDIxMSAgcG93ZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMi44NjcyRSsyMCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gyMTIgIHBvd2VyICAgNDE1ICAyICAgICAgICAgLT4gIDEuNzIyMkUrNSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gyMTMgIHBvd2VyICAgIDc1ICAzICAgICAgICAgLT4gIDQuMjE4N0UrNSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGhhbGZfZXZlbgorcnBveDMwMSAgcG93ZXIgMTIzNDUgIC01ICAgICAgICAtPiAgMy40ODc3RS0yMSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gzMDIgIHBvd2VyIDEyMzQ1ICAtNCAgICAgICAgLT4gIDQuMzA1NkUtMTcgSW5leGFjdCBSb3VuZGVkCitycG94MzAzICBwb3dlciAxMjM0NSAgLTMgICAgICAgIC0+ICA1LjMxNTNFLTEzIEluZXhhY3QgUm91bmRlZAorcnBveDMwNCAgcG93ZXIgMTIzNDUgIC0yICAgICAgICAtPiAgNi41NjE3RS05IEluZXhhY3QgUm91bmRlZAorcnBveDMwNSAgcG93ZXIgMTIzNDUgIC0xICAgICAgICAtPiAgMC4wMDAwODEwMDQgSW5leGFjdCBSb3VuZGVkCitycG94MzA2ICBwb3dlciAxMjM0NSAgMCAgICAgICAgIC0+ICAxCitycG94MzA3ICBwb3dlciAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcnBveDMwOCAgcG93ZXIgMTIzNDUgIDIgICAgICAgICAtPiAgMS41MjQwRSs4IEluZXhhY3QgUm91bmRlZAorcnBveDMwOSAgcG93ZXIgMTIzNDUgIDMgICAgICAgICAtPiAgMS44ODE0RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3gzMTAgIHBvd2VyIDEyMzQ1ICA0ICAgICAgICAgLT4gIDIuMzIyNUUrMTYgSW5leGFjdCBSb3VuZGVkCitycG94MzExICBwb3dlciAxMjM0NSAgNSAgICAgICAgIC0+ICAyLjg2NzJFKzIwIEluZXhhY3QgUm91bmRlZAorcnBveDMxMiAgcG93ZXIgICA0MTUgIDIgICAgICAgICAtPiAgMS43MjIyRSs1IEluZXhhY3QgUm91bmRlZAorcnBveDMxMyAgcG93ZXIgICAgNzUgIDMgICAgICAgICAtPiAgNC4yMTg4RSs1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogaGFsZl91cAorcnBveDQwMSAgcG93ZXIgMTIzNDUgIC01ICAgICAgICAtPiAgMy40ODc3RS0yMSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g0MDIgIHBvd2VyIDEyMzQ1ICAtNCAgICAgICAgLT4gIDQuMzA1NkUtMTcgSW5leGFjdCBSb3VuZGVkCitycG94NDAzICBwb3dlciAxMjM0NSAgLTMgICAgICAgIC0+ICA1LjMxNTNFLTEzIEluZXhhY3QgUm91bmRlZAorcnBveDQwNCAgcG93ZXIgMTIzNDUgIC0yICAgICAgICAtPiAgNi41NjE3RS05IEluZXhhY3QgUm91bmRlZAorcnBveDQwNSAgcG93ZXIgMTIzNDUgIC0xICAgICAgICAtPiAgMC4wMDAwODEwMDQgSW5leGFjdCBSb3VuZGVkCitycG94NDA2ICBwb3dlciAxMjM0NSAgMCAgICAgICAgIC0+ICAxCitycG94NDA3ICBwb3dlciAxMjM0NSAgMSAgICAgICAgIC0+ICAxMjM0NQorcnBveDQwOCAgcG93ZXIgMTIzNDUgIDIgICAgICAgICAtPiAgMS41MjQwRSs4IEluZXhhY3QgUm91bmRlZAorcnBveDQwOSAgcG93ZXIgMTIzNDUgIDMgICAgICAgICAtPiAgMS44ODE0RSsxMiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g0MTAgIHBvd2VyIDEyMzQ1ICA0ICAgICAgICAgLT4gIDIuMzIyNUUrMTYgSW5leGFjdCBSb3VuZGVkCitycG94NDExICBwb3dlciAxMjM0NSAgNSAgICAgICAgIC0+ICAyLjg2NzJFKzIwIEluZXhhY3QgUm91bmRlZAorcnBveDQxMiAgcG93ZXIgICA0MTUgIDIgICAgICAgICAtPiAgMS43MjIzRSs1IEluZXhhY3QgUm91bmRlZAorcnBveDQxMyAgcG93ZXIgICAgNzUgIDMgICAgICAgICAtPiAgNC4yMTg4RSs1IEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogdXAKK3Jwb3g1MDEgIHBvd2VyIDEyMzQ1ICAtNSAgICAgICAgLT4gIDMuNDg3OEUtMjEgSW5leGFjdCBSb3VuZGVkCitycG94NTAyICBwb3dlciAxMjM0NSAgLTQgICAgICAgIC0+ICA0LjMwNTdFLTE3IEluZXhhY3QgUm91bmRlZAorcnBveDUwMyAgcG93ZXIgMTIzNDUgIC0zICAgICAgICAtPiAgNS4zMTUzRS0xMyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g1MDQgIHBvd2VyIDEyMzQ1ICAtMiAgICAgICAgLT4gIDYuNTYxOEUtOSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g1MDUgIHBvd2VyIDEyMzQ1ICAtMSAgICAgICAgLT4gIDAuMDAwMDgxMDA1IEluZXhhY3QgUm91bmRlZAorcnBveDUwNiAgcG93ZXIgMTIzNDUgIDAgICAgICAgICAtPiAgMQorcnBveDUwNyAgcG93ZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3Jwb3g1MDggIHBvd2VyIDEyMzQ1ICAyICAgICAgICAgLT4gIDEuNTI0MEUrOCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g1MDkgIHBvd2VyIDEyMzQ1ICAzICAgICAgICAgLT4gIDEuODgxNEUrMTIgSW5leGFjdCBSb3VuZGVkCitycG94NTEwICBwb3dlciAxMjM0NSAgNCAgICAgICAgIC0+ICAyLjMyMjZFKzE2IEluZXhhY3QgUm91bmRlZAorcnBveDUxMSAgcG93ZXIgMTIzNDUgIDUgICAgICAgICAtPiAgMi44NjcyRSsyMCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g1MTIgIHBvd2VyICAgNDE1ICAyICAgICAgICAgLT4gIDEuNzIyM0UrNSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g1MTMgIHBvd2VyICAgIDc1ICAzICAgICAgICAgLT4gIDQuMjE4OEUrNSBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6IGZsb29yCitycG94NjAxICBwb3dlciAxMjM0NSAgLTUgICAgICAgIC0+ICAzLjQ4NzdFLTIxIEluZXhhY3QgUm91bmRlZAorcnBveDYwMiAgcG93ZXIgMTIzNDUgIC00ICAgICAgICAtPiAgNC4zMDU2RS0xNyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MDMgIHBvd2VyIDEyMzQ1ICAtMyAgICAgICAgLT4gIDUuMzE1MkUtMTMgSW5leGFjdCBSb3VuZGVkCitycG94NjA0ICBwb3dlciAxMjM0NSAgLTIgICAgICAgIC0+ICA2LjU2MTdFLTkgSW5leGFjdCBSb3VuZGVkCitycG94NjA1ICBwb3dlciAxMjM0NSAgLTEgICAgICAgIC0+ICAwLjAwMDA4MTAwNCBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MDYgIHBvd2VyIDEyMzQ1ICAwICAgICAgICAgLT4gIDEKK3Jwb3g2MDcgIHBvd2VyIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitycG94NjA4ICBwb3dlciAxMjM0NSAgMiAgICAgICAgIC0+ICAxLjUyMzlFKzggSW5leGFjdCBSb3VuZGVkCitycG94NjA5ICBwb3dlciAxMjM0NSAgMyAgICAgICAgIC0+ICAxLjg4MTNFKzEyIEluZXhhY3QgUm91bmRlZAorcnBveDYxMCAgcG93ZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMi4zMjI1RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g2MTEgIHBvd2VyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDIuODY3MUUrMjAgSW5leGFjdCBSb3VuZGVkCitycG94NjEyICBwb3dlciAgIDQxNSAgMiAgICAgICAgIC0+ICAxLjcyMjJFKzUgSW5leGFjdCBSb3VuZGVkCitycG94NjEzICBwb3dlciAgICA3NSAgMyAgICAgICAgIC0+ICA0LjIxODdFKzUgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCitycG94NzAxICBwb3dlciAxMjM0NSAgLTUgICAgICAgIC0+ICAzLjQ4NzhFLTIxIEluZXhhY3QgUm91bmRlZAorcnBveDcwMiAgcG93ZXIgMTIzNDUgIC00ICAgICAgICAtPiAgNC4zMDU3RS0xNyBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MDMgIHBvd2VyIDEyMzQ1ICAtMyAgICAgICAgLT4gIDUuMzE1M0UtMTMgSW5leGFjdCBSb3VuZGVkCitycG94NzA0ICBwb3dlciAxMjM0NSAgLTIgICAgICAgIC0+ICA2LjU2MThFLTkgSW5leGFjdCBSb3VuZGVkCitycG94NzA1ICBwb3dlciAxMjM0NSAgLTEgICAgICAgIC0+ICAwLjAwMDA4MTAwNSBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MDYgIHBvd2VyIDEyMzQ1ICAwICAgICAgICAgLT4gIDEKK3Jwb3g3MDcgIHBvd2VyIDEyMzQ1ICAxICAgICAgICAgLT4gIDEyMzQ1CitycG94NzA4ICBwb3dlciAxMjM0NSAgMiAgICAgICAgIC0+ICAxLjUyNDBFKzggSW5leGFjdCBSb3VuZGVkCitycG94NzA5ICBwb3dlciAxMjM0NSAgMyAgICAgICAgIC0+ICAxLjg4MTRFKzEyIEluZXhhY3QgUm91bmRlZAorcnBveDcxMCAgcG93ZXIgMTIzNDUgIDQgICAgICAgICAtPiAgMi4zMjI2RSsxNiBJbmV4YWN0IFJvdW5kZWQKK3Jwb3g3MTEgIHBvd2VyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDIuODY3MkUrMjAgSW5leGFjdCBSb3VuZGVkCitycG94NzEyICBwb3dlciAgIDQxNSAgMiAgICAgICAgIC0+ICAxLjcyMjNFKzUgSW5leGFjdCBSb3VuZGVkCitycG94NzEzICBwb3dlciAgICA3NSAgMyAgICAgICAgIC0+ICA0LjIxODhFKzUgSW5leGFjdCBSb3VuZGVkCisKKy0tIFVuZGVyZmxvdyBTdWJub3JtYWwgYW5kIG92ZXJmbG93IHZhbHVlcyB2YXJ5IHdpdGggcm91bmRpbmcgbW9kZSBhbmQgc2lnbgorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3JvdW5kaW5nOiBkb3duCityb3Z4MTAwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgOS45OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTAxICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtOS45OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTAyICBkaXZpZGUgICAgIDFFLTkgIDlFKzk5OTk5OTk5OSAtPiAgMEUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityb3Z4MTA0ICBkaXZpZGUgICAgLTFFLTkgIDlFKzk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3JvdW5kaW5nOiB1cAorcm92eDExMCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDExMSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDExMiAgZGl2aWRlICAgICAxRS05ICA5RSs5OTk5OTk5OTkgLT4gIDFFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3JvdngxMTQgIGRpdmlkZSAgICAtMUUtOSAgOUUrOTk5OTk5OTk5IC0+IC0xRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBjZWlsaW5nCityb3Z4MTIwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTIxICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtOS45OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTIyICBkaXZpZGUgICAgIDFFLTkgIDlFKzk5OTk5OTk5OSAtPiAgMUUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcm92eDEyNCAgZGl2aWRlICAgIC0xRS05ICA5RSs5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCityb3VuZGluZzogZmxvb3IKK3JvdngxMzAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxMzEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxMzIgIGRpdmlkZSAgICAgMUUtOSAgOUUrOTk5OTk5OTk5IC0+ICAwRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JvdngxMzQgIGRpdmlkZSAgICAtMUUtOSAgOUUrOTk5OTk5OTk5IC0+IC0xRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX3VwCityb3Z4MTQwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTQxICBtdWx0aXBseSAgLTEwICAgIDlFKzk5OTk5OTk5OSAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3Z4MTQyICBkaXZpZGUgICAgIDFFLTkgIDlFKzk5OTk5OTk5OSAtPiAgMEUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCityb3Z4MTQ0ICBkaXZpZGUgICAgLTFFLTkgIDlFKzk5OTk5OTk5OSAtPiAtMEUtMTAwMDAwMDAwMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3JvdngxNTAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxNTEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngxNTIgIGRpdmlkZSAgICAgMUUtOSAgOUUrOTk5OTk5OTk5IC0+ICAwRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3JvdngxNTQgIGRpdmlkZSAgICAtMUUtOSAgOUUrOTk5OTk5OTk5IC0+IC0wRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKKworcm91bmRpbmc6IGhhbGZfZG93bgorcm92eDE2MCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDE2MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDE2MiAgZGl2aWRlICAgICAxRS05ICA5RSs5OTk5OTk5OTkgLT4gIDBFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorcm92eDE2NCAgZGl2aWRlICAgIC0xRS05ICA5RSs5OTk5OTk5OTkgLT4gLTBFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorCistLSBjaGVjayBtYXhpbXVtIGZpbml0ZSB2YWx1ZSBvdmVyIGEgcmFuZ2Ugb2YgcHJlY2lzaW9ucworcm91bmRpbmc6IGRvd24KK3ByZWNpc2lvbjogMQorcm92eDIwMCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyMDEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDIKK3JvdngyMTAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5LjlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyMTEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05LjlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMworcm92eDIyMCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyMjEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDQKK3JvdngyMzAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDIzMSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDUKK3JvdngyNDAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyNDEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogNgorcm92eDI1MCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyNTEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDcKK3JvdngyNjAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm92eDI2MSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDgKK3JvdngyNzAgIG11bHRpcGx5ICAgMTAgICAgOUUrOTk5OTk5OTk5IC0+ICA5Ljk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyNzEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogOQorcm92eDI4MCAgbXVsdGlwbHkgICAxMCAgICA5RSs5OTk5OTk5OTkgLT4gIDkuOTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyODEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEwCityb3Z4MjkwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgOS45OTk5OTk5OTlFKzk5OTk5OTk5OSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdngyOTEgIG11bHRpcGx5ICAtMTAgICAgOUUrOTk5OTk5OTk5IC0+IC05Ljk5OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLSByZXByaXNlIHJvdW5kaW5nIG1vZGUgZWZmZWN0ICh1c2luZyBtdWx0aXBsaWVzIHNvIHByZWNpc2lvbiBkaXJlY3RpdmUgdXNlZCkKK3ByZWNpc2lvbjogOQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorcm91bmRpbmc6IGhhbGZfdXAKK3JtZXg0MDAgbXVsdGlwbHkgLTkuOTk5RSs5OTk5OTk5OTkgMTAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm1leDQwMSBtdWx0aXBseSAgOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogaGFsZl9kb3duCitybWV4NDAyIG11bHRpcGx5IC05Ljk5OUUrOTk5OTk5OTk5IDEwIC0+IC1JbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JtZXg0MDMgbXVsdGlwbHkgIDkuOTk5RSs5OTk5OTk5OTkgMTAgLT4gIEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfZXZlbgorcm1leDQwNCBtdWx0aXBseSAtOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitybWV4NDA1IG11bHRpcGx5ICA5Ljk5OUUrOTk5OTk5OTk5IDEwIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3JvdW5kaW5nOiBmbG9vcgorcm1leDQwNiBtdWx0aXBseSAtOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitybWV4NDA3IG11bHRpcGx5ICA5Ljk5OUUrOTk5OTk5OTk5IDEwIC0+ICA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogY2VpbGluZworcm1leDQwOCBtdWx0aXBseSAtOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm1leDQwOSBtdWx0aXBseSAgOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogdXAKK3JtZXg0MTAgbXVsdGlwbHkgLTkuOTk5RSs5OTk5OTk5OTkgMTAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm1leDQxMSBtdWx0aXBseSAgOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAgSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityb3VuZGluZzogZG93bgorcm1leDQxMiBtdWx0aXBseSAtOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAtOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm1leDQxMyBtdWx0aXBseSAgOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAgOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCistLS0tLSBSb3VuZC1mb3ItcmVyb3VuZCAtLS0tLQorcm91bmRpbmc6ICAgIDA1dXAKK3ByZWNpc2lvbjogICA1ICAgICAgICAgICAtLSBmb3IgZWFzaWVyIHZpc3VhbCBpbnNwZWN0aW9uCittYXhFeHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorCistLSBiYXNpYyByb3VuZGluZzsgcmVhbGx5IGlzIGp1c3QgMCBhbmQgNSB1cAorcjA1dXAwMDEgYWRkIDEyMzQwICAwLjAwMSAgICAgLT4gMTIzNDEgSW5leGFjdCBSb3VuZGVkCityMDV1cDAwMiBhZGQgMTIzNDEgIDAuMDAxICAgICAtPiAxMjM0MSBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDAzIGFkZCAxMjM0MiAgMC4wMDEgICAgIC0+IDEyMzQyIEluZXhhY3QgUm91bmRlZAorcjA1dXAwMDQgYWRkIDEyMzQzICAwLjAwMSAgICAgLT4gMTIzNDMgSW5leGFjdCBSb3VuZGVkCityMDV1cDAwNSBhZGQgMTIzNDQgIDAuMDAxICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDA2IGFkZCAxMjM0NSAgMC4wMDEgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMDcgYWRkIDEyMzQ2ICAwLjAwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMDV1cDAwOCBhZGQgMTIzNDcgIDAuMDAxICAgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDA5IGFkZCAxMjM0OCAgMC4wMDEgICAgIC0+IDEyMzQ4IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMTAgYWRkIDEyMzQ5ICAwLjAwMSAgICAgLT4gMTIzNDkgSW5leGFjdCBSb3VuZGVkCisKK3IwNXVwMDExIGFkZCAxMjM0MCAgMC4wMDAgICAgIC0+IDEyMzQwIFJvdW5kZWQKK3IwNXVwMDEyIGFkZCAxMjM0MSAgMC4wMDAgICAgIC0+IDEyMzQxIFJvdW5kZWQKK3IwNXVwMDEzIGFkZCAxMjM0MiAgMC4wMDAgICAgIC0+IDEyMzQyIFJvdW5kZWQKK3IwNXVwMDE0IGFkZCAxMjM0MyAgMC4wMDAgICAgIC0+IDEyMzQzIFJvdW5kZWQKK3IwNXVwMDE1IGFkZCAxMjM0NCAgMC4wMDAgICAgIC0+IDEyMzQ0IFJvdW5kZWQKK3IwNXVwMDE2IGFkZCAxMjM0NSAgMC4wMDAgICAgIC0+IDEyMzQ1IFJvdW5kZWQKK3IwNXVwMDE3IGFkZCAxMjM0NiAgMC4wMDAgICAgIC0+IDEyMzQ2IFJvdW5kZWQKK3IwNXVwMDE4IGFkZCAxMjM0NyAgMC4wMDAgICAgIC0+IDEyMzQ3IFJvdW5kZWQKK3IwNXVwMDE5IGFkZCAxMjM0OCAgMC4wMDAgICAgIC0+IDEyMzQ4IFJvdW5kZWQKK3IwNXVwMDIwIGFkZCAxMjM0OSAgMC4wMDAgICAgIC0+IDEyMzQ5IFJvdW5kZWQKKworcjA1dXAwMjEgYWRkIDEyMzQwICAwLjkwMSAgICAgLT4gMTIzNDEgSW5leGFjdCBSb3VuZGVkCityMDV1cDAyMiBhZGQgMTIzNDEgIDAuOTAxICAgICAtPiAxMjM0MSBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDIzIGFkZCAxMjM0MiAgMC45MDEgICAgIC0+IDEyMzQyIEluZXhhY3QgUm91bmRlZAorcjA1dXAwMjQgYWRkIDEyMzQzICAwLjkwMSAgICAgLT4gMTIzNDMgSW5leGFjdCBSb3VuZGVkCityMDV1cDAyNSBhZGQgMTIzNDQgIDAuOTAxICAgICAtPiAxMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDI2IGFkZCAxMjM0NSAgMC45MDEgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMjcgYWRkIDEyMzQ2ICAwLjkwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMDV1cDAyOCBhZGQgMTIzNDcgIDAuOTAxICAgICAtPiAxMjM0NyBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDI5IGFkZCAxMjM0OCAgMC45MDEgICAgIC0+IDEyMzQ4IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMzAgYWRkIDEyMzQ5ICAwLjkwMSAgICAgLT4gMTIzNDkgSW5leGFjdCBSb3VuZGVkCisKK3IwNXVwMDMxIGFkZCAtMTIzNDAgIC0wLjAwMSAgICAgLT4gLTEyMzQxIEluZXhhY3QgUm91bmRlZAorcjA1dXAwMzIgYWRkIC0xMjM0MSAgLTAuMDAxICAgICAtPiAtMTIzNDEgSW5leGFjdCBSb3VuZGVkCityMDV1cDAzMyBhZGQgLTEyMzQyICAtMC4wMDEgICAgIC0+IC0xMjM0MiBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDM0IGFkZCAtMTIzNDMgIC0wLjAwMSAgICAgLT4gLTEyMzQzIEluZXhhY3QgUm91bmRlZAorcjA1dXAwMzUgYWRkIC0xMjM0NCAgLTAuMDAxICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMDV1cDAzNiBhZGQgLTEyMzQ1ICAtMC4wMDEgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDM3IGFkZCAtMTIzNDYgIC0wLjAwMSAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjA1dXAwMzggYWRkIC0xMjM0NyAgLTAuMDAxICAgICAtPiAtMTIzNDcgSW5leGFjdCBSb3VuZGVkCityMDV1cDAzOSBhZGQgLTEyMzQ4ICAtMC4wMDEgICAgIC0+IC0xMjM0OCBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDQwIGFkZCAtMTIzNDkgIC0wLjAwMSAgICAgLT4gLTEyMzQ5IEluZXhhY3QgUm91bmRlZAorCityMDV1cDA0MSBhZGQgLTEyMzQwICAgMC4wMDEgICAgIC0+IC0xMjMzOSBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDQyIGFkZCAtMTIzNDEgICAwLjAwMSAgICAgLT4gLTEyMzQxIEluZXhhY3QgUm91bmRlZAorcjA1dXAwNDMgYWRkIC0xMjM0MiAgIDAuMDAxICAgICAtPiAtMTIzNDEgSW5leGFjdCBSb3VuZGVkCityMDV1cDA0NCBhZGQgLTEyMzQzICAgMC4wMDEgICAgIC0+IC0xMjM0MiBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDQ1IGFkZCAtMTIzNDQgICAwLjAwMSAgICAgLT4gLTEyMzQzIEluZXhhY3QgUm91bmRlZAorcjA1dXAwNDYgYWRkIC0xMjM0NSAgIDAuMDAxICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMDV1cDA0NyBhZGQgLTEyMzQ2ICAgMC4wMDEgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwNXVwMDQ4IGFkZCAtMTIzNDcgICAwLjAwMSAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjA1dXAwNDkgYWRkIC0xMjM0OCAgIDAuMDAxICAgICAtPiAtMTIzNDcgSW5leGFjdCBSb3VuZGVkCityMDV1cDA1MCBhZGQgLTEyMzQ5ICAgMC4wMDEgICAgIC0+IC0xMjM0OCBJbmV4YWN0IFJvdW5kZWQKKworLS0gQWRkaXRpb24gb3BlcmF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFtUaGUgZmlyc3QgZmV3IG9mIHRoZXNlIGNoZWNrIG5lZ2F0aXZlIHJlc2lkdWUgcG9zc2liaWxpdGllczsgdGhlc2UKKy0tIGNhc2VzIG1heSBiZSBpbXBsZW1lbnRlZCBhcyBhIG5lZ2F0aXZlIHJlc2lkdWUgaW4gZmFzdHBhdGhzXQorCityMGFkeDEwMCAgYWRkIDEyMzQ1IC0wLjEgICAgICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMGFkeDEwMSAgYWRkIDEyMzQ1IC0wLjAxICAgICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMGFkeDEwMiAgYWRkIDEyMzQ1IC0wLjAwMSAgICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMGFkeDEwMyAgYWRkIDEyMzQ1IC0wLjAwMDAxICAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMGFkeDEwNCAgYWRkIDEyMzQ1IC0wLjAwMDAwMSAgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMGFkeDEwNSAgYWRkIDEyMzQ1IC0wLjAwMDAwMDEgLT4gMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMGFkeDEwNiAgYWRkIDEyMzQ1ICAwICAgICAgICAgLT4gMTIzNDUKK3IwYWR4MTA3ICBhZGQgMTIzNDUgIDAuMDAwMDAwMSAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTA4ICBhZGQgMTIzNDUgIDAuMDAwMDAxICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTA5ICBhZGQgMTIzNDUgIDAuMDAwMDEgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTEwICBhZGQgMTIzNDUgIDAuMDAwMSAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTExICBhZGQgMTIzNDUgIDAuMDAxICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTEyICBhZGQgMTIzNDUgIDAuMDEgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwYWR4MTEzICBhZGQgMTIzNDUgIDAuMSAgICAgICAtPiAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworcjBhZHgxMTUgIGFkZCAxMjM0NiAgMC40OTk5OSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMTYgIGFkZCAxMjM0NiAgMC41ICAgICAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBhZHgxMTcgIGFkZCAxMjM0NiAgMC41MDAwMSAgIC0+IDEyMzQ2IEluZXhhY3QgUm91bmRlZAorCityMGFkeDEyMCAgYWRkIDEyMzQ1ICAwLjQgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyMSAgYWRkIDEyMzQ1ICAwLjQ5ICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyMiAgYWRkIDEyMzQ1ICAwLjQ5OSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyMyAgYWRkIDEyMzQ1ICAwLjQ5OTk5ICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyNCAgYWRkIDEyMzQ1ICAwLjUgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyNSAgYWRkIDEyMzQ1ICAwLjUwMDAxICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyNiAgYWRkIDEyMzQ1ICAwLjUwMDEgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyNyAgYWRkIDEyMzQ1ICAwLjUwMSAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyOCAgYWRkIDEyMzQ1ICAwLjUxICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMGFkeDEyOSAgYWRkIDEyMzQ1ICAwLjYgICAgICAgLT4gMTIzNDYgSW5leGFjdCBSb3VuZGVkCisKKy0tIG5lZ2F0aXZlcy4uLgorCityMHN1eDEwMCAgYWRkIC0xMjM0NSAtMC4xICAgICAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTAxICBhZGQgLTEyMzQ1IC0wLjAxICAgICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMDIgIGFkZCAtMTIzNDUgLTAuMDAxICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMHN1eDEwMyAgYWRkIC0xMjM0NSAtMC4wMDAwMSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTA0ICBhZGQgLTEyMzQ1IC0wLjAwMDAwMSAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMDUgIGFkZCAtMTIzNDUgLTAuMDAwMDAwMSAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMHN1eDEwNiAgYWRkIC0xMjM0NSAgMCAgICAgICAgIC0+IC0xMjM0NQorcjBzdXgxMDcgIGFkZCAtMTIzNDUgIDAuMDAwMDAwMSAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDEwOCAgYWRkIC0xMjM0NSAgMC4wMDAwMDEgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTA5ICBhZGQgLTEyMzQ1ICAwLjAwMDAxICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMTAgIGFkZCAtMTIzNDUgIDAuMDAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDExMSAgYWRkIC0xMjM0NSAgMC4wMDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTEyICBhZGQgLTEyMzQ1ICAwLjAxICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMTMgIGFkZCAtMTIzNDUgIDAuMSAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKK3Iwc3V4MTE1ICBhZGQgLTEyMzQ2ICAwLjQ5OTk5ICAgLT4gLTEyMzQ2IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMTYgIGFkZCAtMTIzNDYgIDAuNSAgICAgICAtPiAtMTIzNDYgSW5leGFjdCBSb3VuZGVkCityMHN1eDExNyAgYWRkIC0xMjM0NiAgMC41MDAwMSAgIC0+IC0xMjM0NiBJbmV4YWN0IFJvdW5kZWQKKworcjBzdXgxMjAgIGFkZCAtMTIzNDUgIDAuNCAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDEyMSAgYWRkIC0xMjM0NSAgMC40OSAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTIyICBhZGQgLTEyMzQ1ICAwLjQ5OSAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMjMgIGFkZCAtMTIzNDUgIDAuNDk5OTkgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDEyNCAgYWRkIC0xMjM0NSAgMC41ICAgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTI1ICBhZGQgLTEyMzQ1ICAwLjUwMDAxICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMjYgIGFkZCAtMTIzNDUgIDAuNTAwMSAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCityMHN1eDEyNyAgYWRkIC0xMjM0NSAgMC41MDEgICAgIC0+IC0xMjM0NCBJbmV4YWN0IFJvdW5kZWQKK3Iwc3V4MTI4ICBhZGQgLTEyMzQ1ICAwLjUxICAgICAgLT4gLTEyMzQ0IEluZXhhY3QgUm91bmRlZAorcjBzdXgxMjkgIGFkZCAtMTIzNDUgIDAuNiAgICAgICAtPiAtMTIzNDQgSW5leGFjdCBSb3VuZGVkCisKKy0tIENoZWNrIGNhbmNlbGxhdGlvbiBzdWJ0cmFjdGlvbnMKKy0tIChUaGUgSUVFRSA4NTQgJ2N1cmlvdXMgcnVsZScgaW4gJDYuMykKKworcjB6ZXgwMDEgIGFkZCAgMCAgICAwICAgIC0+ICAwCityMHpleDAwMiAgYWRkICAwICAgLTAgICAgLT4gIDAKK3IwemV4MDAzICBhZGQgLTAgICAgMCAgICAtPiAgMAorcjB6ZXgwMDQgIGFkZCAtMCAgIC0wICAgIC0+IC0wCityMHpleDAwNSAgYWRkICAxICAgLTEgICAgLT4gIDAKK3IwemV4MDA2ICBhZGQgLTEgICAgMSAgICAtPiAgMAorcjB6ZXgwMDcgIGFkZCAgMS41IC0xLjUgIC0+ICAwLjAKK3IwemV4MDA4ICBhZGQgLTEuNSAgMS41ICAtPiAgMC4wCityMHpleDAwOSAgYWRkICAyICAgLTIgICAgLT4gIDAKK3IwemV4MDEwICBhZGQgLTIgICAgMiAgICAtPiAgMAorCisKKy0tIERpdmlzaW9uIG9wZXJhdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3IwZHZ4MTAxICBkaXZpZGUgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3IwZHZ4MTAyICBkaXZpZGUgMTIzNDUgIDEuMDAwMSAgICAtPiAgMTIzNDMgSW5leGFjdCBSb3VuZGVkCityMGR2eDEwMyAgZGl2aWRlIDEyMzQ1ICAxLjAwMSAgICAgLT4gIDEyMzMyIEluZXhhY3QgUm91bmRlZAorcjBkdngxMDQgIGRpdmlkZSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjIyMiBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTA1ICBkaXZpZGUgMTIzNDUgIDEuMSAgICAgICAtPiAgMTEyMjIgSW5leGFjdCBSb3VuZGVkCityMGR2eDEwNiAgZGl2aWRlIDEyMzU1ICA0ICAgICAgICAgLT4gICAzMDg4LjcgSW5leGFjdCBSb3VuZGVkCityMGR2eDEwNyAgZGl2aWRlIDEyMzQ1ICA0ICAgICAgICAgLT4gICAzMDg2LjIgSW5leGFjdCBSb3VuZGVkCityMGR2eDEwOCAgZGl2aWRlIDEyMzU1ICA0LjAwMDEgICAgLT4gICAzMDg4LjYgSW5leGFjdCBSb3VuZGVkCityMGR2eDEwOSAgZGl2aWRlIDEyMzQ1ICA0LjAwMDEgICAgLT4gICAzMDg2LjEgSW5leGFjdCBSb3VuZGVkCityMGR2eDExMCAgZGl2aWRlIDEyMzQ1ICA0LjkgICAgICAgLT4gICAyNTE5LjMgSW5leGFjdCBSb3VuZGVkCityMGR2eDExMSAgZGl2aWRlIDEyMzQ1ICA0Ljk5ICAgICAgLT4gICAyNDczLjkgSW5leGFjdCBSb3VuZGVkCityMGR2eDExMiAgZGl2aWRlIDEyMzQ1ICA0Ljk5OSAgICAgLT4gICAyNDY5LjQgSW5leGFjdCBSb3VuZGVkCityMGR2eDExMyAgZGl2aWRlIDEyMzQ1ICA0Ljk5OTkgICAgLT4gICAyNDY5LjEgSW5leGFjdCBSb3VuZGVkCityMGR2eDExNCAgZGl2aWRlIDEyMzQ1ICA1ICAgICAgICAgLT4gICAyNDY5CityMGR2eDExNSAgZGl2aWRlIDEyMzQ1ICA1LjAwMDEgICAgLT4gIDI0NjguOSBJbmV4YWN0IFJvdW5kZWQKK3IwZHZ4MTE2ICBkaXZpZGUgMTIzNDUgIDUuMDAxICAgICAtPiAgMjQ2OC42IEluZXhhY3QgUm91bmRlZAorcjBkdngxMTcgIGRpdmlkZSAxMjM0NSAgNS4wMSAgICAgIC0+ICAyNDY0LjEgSW5leGFjdCBSb3VuZGVkCityMGR2eDExOCAgZGl2aWRlIDEyMzQ1ICA1LjEgICAgICAgLT4gIDI0MjAuNiBJbmV4YWN0IFJvdW5kZWQKKworLS0gW2RpdmlkZUludGVnZXIgYW5kIHJlbWFpbmRlciB1bmFmZmVjdGVkXQorCistLSBNdWx0aXBsaWNhdGlvbiBvcGVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCityMG11eDEwMSAgbXVsdGlwbHkgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3IwbXV4MTAyICBtdWx0aXBseSAxMjM0NSAgMS4wMDAxICAgIC0+ICAxMjM0NiBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTAzICBtdWx0aXBseSAxMjM0NSAgMS4wMDEgICAgIC0+ICAxMjM1NyBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTA0ICBtdWx0aXBseSAxMjM0NSAgMS4wMSAgICAgIC0+ICAxMjQ2OCBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTA1ICBtdWx0aXBseSAxMjM0NSAgMS4xICAgICAgIC0+ICAxMzU3OSBJbmV4YWN0IFJvdW5kZWQKK3IwbXV4MTA2ICBtdWx0aXBseSAxMjM0NSAgNCAgICAgICAgIC0+ICA0OTM4MAorcjBtdXgxMDcgIG11bHRpcGx5IDEyMzQ1ICA0LjAwMDEgICAgLT4gIDQ5MzgxIEluZXhhY3QgUm91bmRlZAorcjBtdXgxMDggIG11bHRpcGx5IDEyMzQ1ICA0LjkgICAgICAgLT4gIDYwNDkxIEluZXhhY3QgUm91bmRlZAorcjBtdXgxMDkgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5ICAgICAgLT4gIDYxNjAxIEluZXhhY3QgUm91bmRlZAorcjBtdXgxMTAgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OSAgICAgLT4gIDYxNzEyIEluZXhhY3QgUm91bmRlZAorcjBtdXgxMTEgIG11bHRpcGx5IDEyMzQ1ICA0Ljk5OTkgICAgLT4gIDYxNzIzIEluZXhhY3QgUm91bmRlZAorcjBtdXgxMTIgIG11bHRpcGx5IDEyMzQ1ICA1ICAgICAgICAgLT4gIDYxNzI1CityMG11eDExMyAgbXVsdGlwbHkgMTIzNDUgIDUuMDAwMSAgICAtPiAgNjE3MjYgSW5leGFjdCBSb3VuZGVkCityMG11eDExNCAgbXVsdGlwbHkgMTIzNDUgIDUuMDAxICAgICAtPiAgNjE3MzcgSW5leGFjdCBSb3VuZGVkCityMG11eDExNSAgbXVsdGlwbHkgMTIzNDUgIDUuMDEgICAgICAtPiAgNjE4NDggSW5leGFjdCBSb3VuZGVkCityMG11eDExNiAgbXVsdGlwbHkgMTIzNDUgIDEyICAgICAgICAtPiAgMS40ODE0RSs1IFJvdW5kZWQKK3IwbXV4MTE3ICBtdWx0aXBseSAxMjM0NSAgMTMgICAgICAgIC0+ICAxLjYwNDhFKzUgSW5leGFjdCBSb3VuZGVkCityMG11eDExOCAgbXVsdGlwbHkgMTIzNTUgIDEyICAgICAgICAtPiAgMS40ODI2RSs1IFJvdW5kZWQKK3IwbXV4MTE5ICBtdWx0aXBseSAxMjM1NSAgMTMgICAgICAgIC0+ICAxLjYwNjFFKzUgSW5leGFjdCBSb3VuZGVkCisKKworLS0gUG93ZXIgb3BlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcjBwb3gxMDEgIHBvd2VyIDEyMzQ1ICAtNSAgICAgICAgLT4gIDMuNDg3N0UtMjEgSW5leGFjdCBSb3VuZGVkCityMHBveDEwMiAgcG93ZXIgMTIzNDUgIC00ICAgICAgICAtPiAgNC4zMDU2RS0xNyBJbmV4YWN0IFJvdW5kZWQKK3IwcG94MTAzICBwb3dlciAxMjM0NSAgLTMgICAgICAgIC0+ICA1LjMxNTJFLTEzIEluZXhhY3QgUm91bmRlZAorcjBwb3gxMDQgIHBvd2VyIDEyMzQ1ICAtMiAgICAgICAgLT4gIDYuNTYxN0UtOSBJbmV4YWN0IFJvdW5kZWQKK3IwcG94MTA1ICBwb3dlciAxMjM0NSAgLTEgICAgICAgIC0+ICAwLjAwMDA4MTAwNCBJbmV4YWN0IFJvdW5kZWQKK3IwcG94MTA2ICBwb3dlciAxMjM0NSAgMCAgICAgICAgIC0+ICAxCityMHBveDEwNyAgcG93ZXIgMTIzNDUgIDEgICAgICAgICAtPiAgMTIzNDUKK3IwcG94MTA4ICBwb3dlciAxMjM0NSAgMiAgICAgICAgIC0+ICAxLjUyMzlFKzggSW5leGFjdCBSb3VuZGVkCityMHBveDEwOSAgcG93ZXIgMTIzNDUgIDMgICAgICAgICAtPiAgMS44ODEzRSsxMiBJbmV4YWN0IFJvdW5kZWQKK3IwcG94MTEwICBwb3dlciAxMjM0NSAgNCAgICAgICAgIC0+ICAyLjMyMjZFKzE2IEluZXhhY3QgUm91bmRlZAorcjBwb3gxMTEgIHBvd2VyIDEyMzQ1ICA1ICAgICAgICAgLT4gIDIuODY3MUUrMjAgSW5leGFjdCBSb3VuZGVkCityMHBveDExMiAgcG93ZXIgICA0MTUgIDIgICAgICAgICAtPiAgMS43MjIyRSs1IEluZXhhY3QgUm91bmRlZAorcjBwb3gxMTMgIHBvd2VyICAgIDc1ICAzICAgICAgICAgLT4gIDQuMjE4N0UrNSBJbmV4YWN0IFJvdW5kZWQKKworCistLSBVbmRlcmZsb3cgU3Vibm9ybWFsIGFuZCBvdmVyZmxvdyB2YWx1ZXMgdmFyeSB3aXRoIHJvdW5kaW5nIG1vZGUgYW5kIHNpZ24KK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK21pbmV4cG9uZW50OiAtOTk5OTk5OTk5CistLSBbcm91bmQgZG93biBnaXZlcyBObWF4IG9uIGZpcnN0IHR3byBhbmQgLjBFLi4uIG9uIHRoZSBuZXh0IHR3b10KK3Iwb3Z4MTAwICBtdWx0aXBseSAgIDEwICAgIDlFKzk5OTk5OTk5OSAtPiAgOS45OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityMG92eDEwMSAgbXVsdGlwbHkgIC0xMCAgICA5RSs5OTk5OTk5OTkgLT4gLTkuOTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcjBvdngxMDIgIGRpdmlkZSAgICAgMUUtOSAgOUUrOTk5OTk5OTk5IC0+ICAxRS0xMDAwMDAwMDAzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCityMG92eDEwNCAgZGl2aWRlICAgIC0xRS05ICA5RSs5OTk5OTk5OTkgLT4gLTFFLTEwMDAwMDAwMDMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS0gcmVwcmlzZSByb3VuZGluZyBtb2RlIGVmZmVjdCAodXNpbmcgbXVsdGlwbGllcyBzbyBwcmVjaXNpb24gZGlyZWN0aXZlIHVzZWQpCitwcmVjaXNpb246IDkKK21heGV4cG9uZW50OiA5OTk5OTk5OTkKK3IwbWV4NDEyIG11bHRpcGx5IC05Ljk5OUUrOTk5OTk5OTk5IDEwIC0+IC05Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCityMG1leDQxMyBtdWx0aXBseSAgOS45OTlFKzk5OTk5OTk5OSAxMCAtPiAgOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NhbWVxdWFudHVtLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NhbWVxdWFudHVtLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzViMTNlYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2FtZXF1YW50dW0uZGVjVGVzdApAQCAtMCwwICsxLDM4OSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBzYW1lcXVhbnR1bS5kZWNUZXN0IC0tIGNoZWNrIHF1YW50dW1zIG1hdGNoICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKK3NhbXEwMDEgc2FtZXF1YW50dW0gIDAgICAgICAwICAgICAgLT4gIDEKK3NhbXEwMDIgc2FtZXF1YW50dW0gIDAgICAgICAxICAgICAgLT4gIDEKK3NhbXEwMDMgc2FtZXF1YW50dW0gIDEgICAgICAwICAgICAgLT4gIDEKK3NhbXEwMDQgc2FtZXF1YW50dW0gIDEgICAgICAxICAgICAgLT4gIDEKKworc2FtcTAxMSBzYW1lcXVhbnR1bSAgMTAgICAgIDFFKzEgICAtPiAwCitzYW1xMDEyIHNhbWVxdWFudHVtICAxMEUrMSAgMTBFKzEgIC0+IDEKK3NhbXEwMTMgc2FtZXF1YW50dW0gIDEwMCAgICAxMEUrMSAgLT4gMAorc2FtcTAxNCBzYW1lcXVhbnR1bSAgMTAwICAgIDFFKzIgICAtPiAwCitzYW1xMDE1IHNhbWVxdWFudHVtICAwLjEgICAgMUUtMiAgIC0+IDAKK3NhbXEwMTYgc2FtZXF1YW50dW0gIDAuMSAgICAxRS0xICAgLT4gMQorc2FtcTAxNyBzYW1lcXVhbnR1bSAgMC4xICAgIDFFLTAgICAtPiAwCitzYW1xMDE4IHNhbWVxdWFudHVtICA5OTkgICAgOTk5ICAgIC0+IDEKK3NhbXEwMTkgc2FtZXF1YW50dW0gIDk5OUUtMSA5OS45ICAgLT4gMQorc2FtcTAyMCBzYW1lcXVhbnR1bSAgMTExRS0xIDIyLjIgICAtPiAxCitzYW1xMDIxIHNhbWVxdWFudHVtICAxMTFFLTEgMTIzNC4yIC0+IDEKKworLS0gemVyb3MKK3NhbXEwMzAgc2FtZXF1YW50dW0gIDAuMCAgICAxLjEgICAgLT4gMQorc2FtcTAzMSBzYW1lcXVhbnR1bSAgMC4wICAgIDEuMTEgICAtPiAwCitzYW1xMDMyIHNhbWVxdWFudHVtICAwLjAgICAgMCAgICAgIC0+IDAKK3NhbXEwMzMgc2FtZXF1YW50dW0gIDAuMCAgICAwLjAgICAgLT4gMQorc2FtcTAzNCBzYW1lcXVhbnR1bSAgMC4wICAgIDAuMDAgICAtPiAwCitzYW1xMDM1IHNhbWVxdWFudHVtICAwRSsxICAgMEUrMCAgIC0+IDAKK3NhbXEwMzYgc2FtZXF1YW50dW0gIDBFKzEgICAwRSsxICAgLT4gMQorc2FtcTAzNyBzYW1lcXVhbnR1bSAgMEUrMSAgIDBFKzIgICAtPiAwCitzYW1xMDM4IHNhbWVxdWFudHVtICAwRS0xNyAgMEUtMTYgIC0+IDAKK3NhbXEwMzkgc2FtZXF1YW50dW0gIDBFLTE3ICAwRS0xNyAgLT4gMQorc2FtcTA0MCBzYW1lcXVhbnR1bSAgMEUtMTcgIDBFLTE4ICAtPiAwCitzYW1xMDQxIHNhbWVxdWFudHVtICAwRS0xNyAgMC4wRS0xNSAtPiAwCitzYW1xMDQyIHNhbWVxdWFudHVtICAwRS0xNyAgMC4wRS0xNiAtPiAxCitzYW1xMDQzIHNhbWVxdWFudHVtICAwRS0xNyAgMC4wRS0xNyAtPiAwCitzYW1xMDQ0IHNhbWVxdWFudHVtIC0wRS0xNyAgMC4wRS0xNiAtPiAxCitzYW1xMDQ1IHNhbWVxdWFudHVtICAwRS0xNyAtMC4wRS0xNyAtPiAwCitzYW1xMDQ2IHNhbWVxdWFudHVtICAwRS0xNyAtMC4wRS0xNiAtPiAxCitzYW1xMDQ3IHNhbWVxdWFudHVtIC0wRS0xNyAgMC4wRS0xNyAtPiAwCitzYW1xMDQ4IHNhbWVxdWFudHVtIC0wRS0xNyAtMC4wRS0xNiAtPiAxCitzYW1xMDQ5IHNhbWVxdWFudHVtIC0wRS0xNyAtMC4wRS0xNyAtPiAwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitzYW1xMDUxIHNhbWVxdWFudHVtICA5Ljk5OTk5OTk5RSs5OTkgICAgOS45OTk5OTk5OUUrOTk5ICAtPiAxCitzYW1xMDUyIHNhbWVxdWFudHVtICAxRS05OTkgICAgICAgICAgICAgMUUtOTk5ICAgICAgICAgICAtPiAxCitzYW1xMDUzIHNhbWVxdWFudHVtICAxLjAwMDAwMDAwRS05OTkgICAgMS4wMDAwMDAwMEUtOTk5ICAtPiAxCitzYW1xMDU0IHNhbWVxdWFudHVtICAxRS0xMDA3ICAgICAgICAgICAgMUUtMTAwNyAgICAgICAgICAtPiAxCitzYW1xMDU1IHNhbWVxdWFudHVtICA5Ljk5OTk5OTk5RSs5OTkgICAgOS45OTk5OTk5OUUrOTk5ICAtPiAxCitzYW1xMDU2IHNhbWVxdWFudHVtICAxRS05OTkgICAgICAgICAgICAgMUUtOTk5ICAgICAgICAgICAtPiAxCitzYW1xMDU3IHNhbWVxdWFudHVtICAxLjAwMDAwMDAwRS05OTkgICAgMS4wMDAwMDAwMEUtOTk5ICAtPiAxCitzYW1xMDU4IHNhbWVxdWFudHVtICAxRS0xMDA3ICAgICAgICAgICAgMUUtMTAwNyAgICAgICAgICAtPiAxCisKK3NhbXEwNjEgc2FtZXF1YW50dW0gIC0xRS0xMDA3ICAgICAgICAgICAtMUUtMTAwNyAgICAgICAgIC0+IDEKK3NhbXEwNjIgc2FtZXF1YW50dW0gIC0xLjAwMDAwMDAwRS05OTkgICAtMS4wMDAwMDAwMEUtOTk5IC0+IDEKK3NhbXEwNjMgc2FtZXF1YW50dW0gIC0xRS05OTkgICAgICAgICAgICAtMUUtOTk5ICAgICAgICAgIC0+IDEKK3NhbXEwNjQgc2FtZXF1YW50dW0gIC05Ljk5OTk5OTk5RSs5OTkgICAtOS45OTk5OTk5OUUrOTk5IC0+IDEKK3NhbXEwNjUgc2FtZXF1YW50dW0gIC0xRS0xMDA3ICAgICAgICAgICAtMUUtMTAwNyAgICAgICAgIC0+IDEKK3NhbXEwNjYgc2FtZXF1YW50dW0gIC0xLjAwMDAwMDAwRS05OTkgICAtMS4wMDAwMDAwMEUtOTk5IC0+IDEKK3NhbXEwNjcgc2FtZXF1YW50dW0gIC0xRS05OTkgICAgICAgICAgICAtMUUtOTk5ICAgICAgICAgIC0+IDEKK3NhbXEwNjggc2FtZXF1YW50dW0gIC05Ljk5OTk5OTk5RSs5OTkgICAtOS45OTk5OTk5OUUrOTk5IC0+IDEKKworc2FtcTA3MSBzYW1lcXVhbnR1bSAgLTRFLTEwMDcgICAgICAgICAgIC0xRS0xMDA3ICAgICAgICAgLT4gMQorc2FtcTA3MiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDBFLTk5OSAgIC0xLjAwMDA0MDAwRS05OTkgLT4gMQorc2FtcTA3MyBzYW1lcXVhbnR1bSAgLTRFLTk5OSAgICAgICAgICAgIC0xRS05OTkgICAgICAgICAgLT4gMQorc2FtcTA3NCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTlFKzk5OSAgIC05Ljk5OTQ5OTk5RSs5OTkgLT4gMQorc2FtcTA3NSBzYW1lcXVhbnR1bSAgLTRFLTEwMDcgICAgICAgICAgIC0xRS0xMDA3ICAgICAgICAgLT4gMQorc2FtcTA3NiBzYW1lcXVhbnR1bSAgLTQuMDAwMDAwMDBFLTk5OSAgIC0xLjAwNDAwMDAwRS05OTkgLT4gMQorc2FtcTA3NyBzYW1lcXVhbnR1bSAgLTRFLTk5OSAgICAgICAgICAgIC0xRS05OTkgICAgICAgICAgLT4gMQorc2FtcTA3OCBzYW1lcXVhbnR1bSAgLTQuOTk5OTk5OTlFKzk5OSAgIC05Ljk0OTk5OTk5RSs5OTkgLT4gMQorCitzYW1xMDgxIHNhbWVxdWFudHVtICAtNEUtMTAwNiAgICAgICAgICAgLTFFLTEwMDcgICAgICAgICAtPiAwCitzYW1xMDgyIHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMEUtOTk5ICAgLTEuMDAwMDQwMDBFLTk5NiAtPiAwCitzYW1xMDgzIHNhbWVxdWFudHVtICAtNEUtOTk2ICAgICAgICAgICAgLTFFLTk5OSAgICAgICAgICAtPiAwCitzYW1xMDg0IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OUUrOTk5ICAgLTkuOTk5NDk5OTlFKzk5NiAtPiAwCitzYW1xMDg1IHNhbWVxdWFudHVtICAtNEUtMTAwNiAgICAgICAgICAgLTFFLTEwMDcgICAgICAgICAtPiAwCitzYW1xMDg2IHNhbWVxdWFudHVtICAtNC4wMDAwMDAwMEUtOTk5ICAgLTEuMDA0MDAwMDBFLTk5NiAtPiAwCitzYW1xMDg3IHNhbWVxdWFudHVtICAtNEUtOTk2ICAgICAgICAgICAgLTFFLTk5OSAgICAgICAgICAtPiAwCitzYW1xMDg4IHNhbWVxdWFudHVtICAtNC45OTk5OTk5OUUrOTk5ICAgLTkuOTQ5OTk5OTlFKzk5NiAtPiAwCisKKy0tIHNwZWNpYWxzICYgY29tYmluYXRpb25zCitzYW1xMDExMCBzYW1lcXVhbnR1bSAgLUluZiAgICAtSW5mICAgLT4gMQorc2FtcTAxMTEgc2FtZXF1YW50dW0gIC1JbmYgICAgIEluZiAgIC0+IDEKK3NhbXEwMTEyIHNhbWVxdWFudHVtICAtSW5mICAgICBOYU4gICAtPiAwCitzYW1xMDExMyBzYW1lcXVhbnR1bSAgLUluZiAgICAtN0UrMyAgLT4gMAorc2FtcTAxMTQgc2FtZXF1YW50dW0gIC1JbmYgICAgLTcgICAgIC0+IDAKK3NhbXEwMTE1IHNhbWVxdWFudHVtICAtSW5mICAgIC03RS0zICAtPiAwCitzYW1xMDExNiBzYW1lcXVhbnR1bSAgLUluZiAgICAtMEUtMyAgLT4gMAorc2FtcTAxMTcgc2FtZXF1YW50dW0gIC1JbmYgICAgLTAgICAgIC0+IDAKK3NhbXEwMTE4IHNhbWVxdWFudHVtICAtSW5mICAgIC0wRSszICAtPiAwCitzYW1xMDExOSBzYW1lcXVhbnR1bSAgLUluZiAgICAgMEUtMyAgLT4gMAorc2FtcTAxMjAgc2FtZXF1YW50dW0gIC1JbmYgICAgIDAgICAgIC0+IDAKK3NhbXEwMTIxIHNhbWVxdWFudHVtICAtSW5mICAgICAwRSszICAtPiAwCitzYW1xMDEyMiBzYW1lcXVhbnR1bSAgLUluZiAgICAgN0UtMyAgLT4gMAorc2FtcTAxMjMgc2FtZXF1YW50dW0gIC1JbmYgICAgIDcgICAgIC0+IDAKK3NhbXEwMTI0IHNhbWVxdWFudHVtICAtSW5mICAgICA3RSszICAtPiAwCitzYW1xMDEyNSBzYW1lcXVhbnR1bSAgLUluZiAgICAgc05hTiAgLT4gMAorCitzYW1xMDIxMCBzYW1lcXVhbnR1bSAgIEluZiAgICAtSW5mICAgLT4gMQorc2FtcTAyMTEgc2FtZXF1YW50dW0gICBJbmYgICAgIEluZiAgIC0+IDEKK3NhbXEwMjEyIHNhbWVxdWFudHVtICAgSW5mICAgICBOYU4gICAtPiAwCitzYW1xMDIxMyBzYW1lcXVhbnR1bSAgIEluZiAgICAtN0UrMyAgLT4gMAorc2FtcTAyMTQgc2FtZXF1YW50dW0gICBJbmYgICAgLTcgICAgIC0+IDAKK3NhbXEwMjE1IHNhbWVxdWFudHVtICAgSW5mICAgIC03RS0zICAtPiAwCitzYW1xMDIxNiBzYW1lcXVhbnR1bSAgIEluZiAgICAtMEUtMyAgLT4gMAorc2FtcTAyMTcgc2FtZXF1YW50dW0gICBJbmYgICAgLTAgICAgIC0+IDAKK3NhbXEwMjE4IHNhbWVxdWFudHVtICAgSW5mICAgIC0wRSszICAtPiAwCitzYW1xMDIxOSBzYW1lcXVhbnR1bSAgIEluZiAgICAgMEUtMyAgLT4gMAorc2FtcTAyMjAgc2FtZXF1YW50dW0gICBJbmYgICAgIDAgICAgIC0+IDAKK3NhbXEwMjIxIHNhbWVxdWFudHVtICAgSW5mICAgICAwRSszICAtPiAwCitzYW1xMDIyMiBzYW1lcXVhbnR1bSAgIEluZiAgICAgN0UtMyAgLT4gMAorc2FtcTAyMjMgc2FtZXF1YW50dW0gICBJbmYgICAgIDcgICAgIC0+IDAKK3NhbXEwMjI0IHNhbWVxdWFudHVtICAgSW5mICAgICA3RSszICAtPiAwCitzYW1xMDIyNSBzYW1lcXVhbnR1bSAgIEluZiAgICAgc05hTiAgLT4gMAorCitzYW1xMDMxMCBzYW1lcXVhbnR1bSAgIE5hTiAgICAtSW5mICAgLT4gMAorc2FtcTAzMTEgc2FtZXF1YW50dW0gICBOYU4gICAgIEluZiAgIC0+IDAKK3NhbXEwMzEyIHNhbWVxdWFudHVtICAgTmFOICAgICBOYU4gICAtPiAxCitzYW1xMDMxMyBzYW1lcXVhbnR1bSAgIE5hTiAgICAtN0UrMyAgLT4gMAorc2FtcTAzMTQgc2FtZXF1YW50dW0gICBOYU4gICAgLTcgICAgIC0+IDAKK3NhbXEwMzE1IHNhbWVxdWFudHVtICAgTmFOICAgIC03RS0zICAtPiAwCitzYW1xMDMxNiBzYW1lcXVhbnR1bSAgIE5hTiAgICAtMEUtMyAgLT4gMAorc2FtcTAzMTcgc2FtZXF1YW50dW0gICBOYU4gICAgLTAgICAgIC0+IDAKK3NhbXEwMzE4IHNhbWVxdWFudHVtICAgTmFOICAgIC0wRSszICAtPiAwCitzYW1xMDMxOSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgMEUtMyAgLT4gMAorc2FtcTAzMjAgc2FtZXF1YW50dW0gICBOYU4gICAgIDAgICAgIC0+IDAKK3NhbXEwMzIxIHNhbWVxdWFudHVtICAgTmFOICAgICAwRSszICAtPiAwCitzYW1xMDMyMiBzYW1lcXVhbnR1bSAgIE5hTiAgICAgN0UtMyAgLT4gMAorc2FtcTAzMjMgc2FtZXF1YW50dW0gICBOYU4gICAgIDcgICAgIC0+IDAKK3NhbXEwMzI0IHNhbWVxdWFudHVtICAgTmFOICAgICA3RSszICAtPiAwCitzYW1xMDMyNSBzYW1lcXVhbnR1bSAgIE5hTiAgICAgc05hTiAgLT4gMQorCitzYW1xMDQxMCBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLUluZiAgIC0+IDAKK3NhbXEwNDExIHNhbWVxdWFudHVtICAtN0UrMyAgICAgSW5mICAgLT4gMAorc2FtcTA0MTIgc2FtZXF1YW50dW0gIC03RSszICAgICBOYU4gICAtPiAwCitzYW1xMDQxMyBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTdFKzMgIC0+IDEKK3NhbXEwNDE0IHNhbWVxdWFudHVtICAtN0UrMyAgICAtNyAgICAgLT4gMAorc2FtcTA0MTUgc2FtZXF1YW50dW0gIC03RSszICAgIC03RS0zICAtPiAwCitzYW1xMDQxNiBzYW1lcXVhbnR1bSAgLTdFKzMgICAgLTBFLTMgIC0+IDAKK3NhbXEwNDE3IHNhbWVxdWFudHVtICAtN0UrMyAgICAtMCAgICAgLT4gMAorc2FtcTA0MTggc2FtZXF1YW50dW0gIC03RSszICAgIC0wRSszICAtPiAxCitzYW1xMDQxOSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDBFLTMgIC0+IDAKK3NhbXEwNDIwIHNhbWVxdWFudHVtICAtN0UrMyAgICAgMCAgICAgLT4gMAorc2FtcTA0MjEgc2FtZXF1YW50dW0gIC03RSszICAgICAwRSszICAtPiAxCitzYW1xMDQyMiBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIDdFLTMgIC0+IDAKK3NhbXEwNDIzIHNhbWVxdWFudHVtICAtN0UrMyAgICAgNyAgICAgLT4gMAorc2FtcTA0MjQgc2FtZXF1YW50dW0gIC03RSszICAgICA3RSszICAtPiAxCitzYW1xMDQyNSBzYW1lcXVhbnR1bSAgLTdFKzMgICAgIHNOYU4gIC0+IDAKKworc2FtcTA1MTAgc2FtZXF1YW50dW0gIC03ICAgICAgLUluZiAgIC0+IDAKK3NhbXEwNTExIHNhbWVxdWFudHVtICAtNyAgICAgICBJbmYgICAtPiAwCitzYW1xMDUxMiBzYW1lcXVhbnR1bSAgLTcgICAgICAgTmFOICAgLT4gMAorc2FtcTA1MTMgc2FtZXF1YW50dW0gIC03ICAgICAgLTdFKzMgIC0+IDAKK3NhbXEwNTE0IHNhbWVxdWFudHVtICAtNyAgICAgIC03ICAgICAtPiAxCitzYW1xMDUxNSBzYW1lcXVhbnR1bSAgLTcgICAgICAtN0UtMyAgLT4gMAorc2FtcTA1MTYgc2FtZXF1YW50dW0gIC03ICAgICAgLTBFLTMgIC0+IDAKK3NhbXEwNTE3IHNhbWVxdWFudHVtICAtNyAgICAgIC0wICAgICAtPiAxCitzYW1xMDUxOCBzYW1lcXVhbnR1bSAgLTcgICAgICAtMEUrMyAgLT4gMAorc2FtcTA1MTkgc2FtZXF1YW50dW0gIC03ICAgICAgIDBFLTMgIC0+IDAKK3NhbXEwNTIwIHNhbWVxdWFudHVtICAtNyAgICAgICAwICAgICAtPiAxCitzYW1xMDUyMSBzYW1lcXVhbnR1bSAgLTcgICAgICAgMEUrMyAgLT4gMAorc2FtcTA1MjIgc2FtZXF1YW50dW0gIC03ICAgICAgIDdFLTMgIC0+IDAKK3NhbXEwNTIzIHNhbWVxdWFudHVtICAtNyAgICAgICA3ICAgICAtPiAxCitzYW1xMDUyNCBzYW1lcXVhbnR1bSAgLTcgICAgICAgN0UrMyAgLT4gMAorc2FtcTA1MjUgc2FtZXF1YW50dW0gIC03ICAgICAgIHNOYU4gIC0+IDAKKworc2FtcTA2MTAgc2FtZXF1YW50dW0gIC03RS0zICAgIC1JbmYgICAtPiAwCitzYW1xMDYxMSBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIEluZiAgIC0+IDAKK3NhbXEwNjEyIHNhbWVxdWFudHVtICAtN0UtMyAgICAgTmFOICAgLT4gMAorc2FtcTA2MTMgc2FtZXF1YW50dW0gIC03RS0zICAgIC03RSszICAtPiAwCitzYW1xMDYxNCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTcgICAgIC0+IDAKK3NhbXEwNjE1IHNhbWVxdWFudHVtICAtN0UtMyAgICAtN0UtMyAgLT4gMQorc2FtcTA2MTYgc2FtZXF1YW50dW0gIC03RS0zICAgIC0wRS0zICAtPiAxCitzYW1xMDYxNyBzYW1lcXVhbnR1bSAgLTdFLTMgICAgLTAgICAgIC0+IDAKK3NhbXEwNjE4IHNhbWVxdWFudHVtICAtN0UtMyAgICAtMEUrMyAgLT4gMAorc2FtcTA2MTkgc2FtZXF1YW50dW0gIC03RS0zICAgICAwRS0zICAtPiAxCitzYW1xMDYyMCBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDAgICAgIC0+IDAKK3NhbXEwNjIxIHNhbWVxdWFudHVtICAtN0UtMyAgICAgMEUrMyAgLT4gMAorc2FtcTA2MjIgc2FtZXF1YW50dW0gIC03RS0zICAgICA3RS0zICAtPiAxCitzYW1xMDYyMyBzYW1lcXVhbnR1bSAgLTdFLTMgICAgIDcgICAgIC0+IDAKK3NhbXEwNjI0IHNhbWVxdWFudHVtICAtN0UtMyAgICAgN0UrMyAgLT4gMAorc2FtcTA2MjUgc2FtZXF1YW50dW0gIC03RS0zICAgICBzTmFOICAtPiAwCisKK3NhbXEwNzEwIHNhbWVxdWFudHVtICAtMEUtMyAgICAtSW5mICAgLT4gMAorc2FtcTA3MTEgc2FtZXF1YW50dW0gIC0wRS0zICAgICBJbmYgICAtPiAwCitzYW1xMDcxMiBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIE5hTiAgIC0+IDAKK3NhbXEwNzEzIHNhbWVxdWFudHVtICAtMEUtMyAgICAtN0UrMyAgLT4gMAorc2FtcTA3MTQgc2FtZXF1YW50dW0gIC0wRS0zICAgIC03ICAgICAtPiAwCitzYW1xMDcxNSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTdFLTMgIC0+IDEKK3NhbXEwNzE2IHNhbWVxdWFudHVtICAtMEUtMyAgICAtMEUtMyAgLT4gMQorc2FtcTA3MTcgc2FtZXF1YW50dW0gIC0wRS0zICAgIC0wICAgICAtPiAwCitzYW1xMDcxOCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgLTBFKzMgIC0+IDAKK3NhbXEwNzE5IHNhbWVxdWFudHVtICAtMEUtMyAgICAgMEUtMyAgLT4gMQorc2FtcTA3MjAgc2FtZXF1YW50dW0gIC0wRS0zICAgICAwICAgICAtPiAwCitzYW1xMDcyMSBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDBFKzMgIC0+IDAKK3NhbXEwNzIyIHNhbWVxdWFudHVtICAtMEUtMyAgICAgN0UtMyAgLT4gMQorc2FtcTA3MjMgc2FtZXF1YW50dW0gIC0wRS0zICAgICA3ICAgICAtPiAwCitzYW1xMDcyNCBzYW1lcXVhbnR1bSAgLTBFLTMgICAgIDdFKzMgIC0+IDAKK3NhbXEwNzI1IHNhbWVxdWFudHVtICAtMEUtMyAgICAgc05hTiAgLT4gMAorCitzYW1xMDgxMCBzYW1lcXVhbnR1bSAgLTAgICAgICAtSW5mICAgLT4gMAorc2FtcTA4MTEgc2FtZXF1YW50dW0gIC0wICAgICAgIEluZiAgIC0+IDAKK3NhbXEwODEyIHNhbWVxdWFudHVtICAtMCAgICAgICBOYU4gICAtPiAwCitzYW1xMDgxMyBzYW1lcXVhbnR1bSAgLTAgICAgICAtN0UrMyAgLT4gMAorc2FtcTA4MTQgc2FtZXF1YW50dW0gIC0wICAgICAgLTcgICAgIC0+IDEKK3NhbXEwODE1IHNhbWVxdWFudHVtICAtMCAgICAgIC03RS0zICAtPiAwCitzYW1xMDgxNiBzYW1lcXVhbnR1bSAgLTAgICAgICAtMEUtMyAgLT4gMAorc2FtcTA4MTcgc2FtZXF1YW50dW0gIC0wICAgICAgLTAgICAgIC0+IDEKK3NhbXEwODE4IHNhbWVxdWFudHVtICAtMCAgICAgIC0wRSszICAtPiAwCitzYW1xMDgxOSBzYW1lcXVhbnR1bSAgLTAgICAgICAgMEUtMyAgLT4gMAorc2FtcTA4MjAgc2FtZXF1YW50dW0gIC0wICAgICAgIDAgICAgIC0+IDEKK3NhbXEwODIxIHNhbWVxdWFudHVtICAtMCAgICAgICAwRSszICAtPiAwCitzYW1xMDgyMiBzYW1lcXVhbnR1bSAgLTAgICAgICAgN0UtMyAgLT4gMAorc2FtcTA4MjMgc2FtZXF1YW50dW0gIC0wICAgICAgIDcgICAgIC0+IDEKK3NhbXEwODI0IHNhbWVxdWFudHVtICAtMCAgICAgICA3RSszICAtPiAwCitzYW1xMDgyNSBzYW1lcXVhbnR1bSAgLTAgICAgICAgc05hTiAgLT4gMAorCitzYW1xMDkxMCBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLUluZiAgIC0+IDAKK3NhbXEwOTExIHNhbWVxdWFudHVtICAtMEUrMyAgICAgSW5mICAgLT4gMAorc2FtcTA5MTIgc2FtZXF1YW50dW0gIC0wRSszICAgICBOYU4gICAtPiAwCitzYW1xMDkxMyBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTdFKzMgIC0+IDEKK3NhbXEwOTE0IHNhbWVxdWFudHVtICAtMEUrMyAgICAtNyAgICAgLT4gMAorc2FtcTA5MTUgc2FtZXF1YW50dW0gIC0wRSszICAgIC03RS0zICAtPiAwCitzYW1xMDkxNiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgLTBFLTMgIC0+IDAKK3NhbXEwOTE3IHNhbWVxdWFudHVtICAtMEUrMyAgICAtMCAgICAgLT4gMAorc2FtcTA5MTggc2FtZXF1YW50dW0gIC0wRSszICAgIC0wRSszICAtPiAxCitzYW1xMDkxOSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDBFLTMgIC0+IDAKK3NhbXEwOTIwIHNhbWVxdWFudHVtICAtMEUrMyAgICAgMCAgICAgLT4gMAorc2FtcTA5MjEgc2FtZXF1YW50dW0gIC0wRSszICAgICAwRSszICAtPiAxCitzYW1xMDkyMiBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIDdFLTMgIC0+IDAKK3NhbXEwOTIzIHNhbWVxdWFudHVtICAtMEUrMyAgICAgNyAgICAgLT4gMAorc2FtcTA5MjQgc2FtZXF1YW50dW0gIC0wRSszICAgICA3RSszICAtPiAxCitzYW1xMDkyNSBzYW1lcXVhbnR1bSAgLTBFKzMgICAgIHNOYU4gIC0+IDAKKworc2FtcTExMTAgc2FtZXF1YW50dW0gIDBFLTMgICAgLUluZiAgIC0+IDAKK3NhbXExMTExIHNhbWVxdWFudHVtICAwRS0zICAgICBJbmYgICAtPiAwCitzYW1xMTExMiBzYW1lcXVhbnR1bSAgMEUtMyAgICAgTmFOICAgLT4gMAorc2FtcTExMTMgc2FtZXF1YW50dW0gIDBFLTMgICAgLTdFKzMgIC0+IDAKK3NhbXExMTE0IHNhbWVxdWFudHVtICAwRS0zICAgIC03ICAgICAtPiAwCitzYW1xMTExNSBzYW1lcXVhbnR1bSAgMEUtMyAgICAtN0UtMyAgLT4gMQorc2FtcTExMTYgc2FtZXF1YW50dW0gIDBFLTMgICAgLTBFLTMgIC0+IDEKK3NhbXExMTE3IHNhbWVxdWFudHVtICAwRS0zICAgIC0wICAgICAtPiAwCitzYW1xMTExOCBzYW1lcXVhbnR1bSAgMEUtMyAgICAtMEUrMyAgLT4gMAorc2FtcTExMTkgc2FtZXF1YW50dW0gIDBFLTMgICAgIDBFLTMgIC0+IDEKK3NhbXExMTIwIHNhbWVxdWFudHVtICAwRS0zICAgICAwICAgICAtPiAwCitzYW1xMTEyMSBzYW1lcXVhbnR1bSAgMEUtMyAgICAgMEUrMyAgLT4gMAorc2FtcTExMjIgc2FtZXF1YW50dW0gIDBFLTMgICAgIDdFLTMgIC0+IDEKK3NhbXExMTIzIHNhbWVxdWFudHVtICAwRS0zICAgICA3ICAgICAtPiAwCitzYW1xMTEyNCBzYW1lcXVhbnR1bSAgMEUtMyAgICAgN0UrMyAgLT4gMAorc2FtcTExMjUgc2FtZXF1YW50dW0gIDBFLTMgICAgIHNOYU4gIC0+IDAKKworc2FtcTEyMTAgc2FtZXF1YW50dW0gIDAgICAgICAgLUluZiAgIC0+IDAKK3NhbXExMjExIHNhbWVxdWFudHVtICAwICAgICAgICBJbmYgICAtPiAwCitzYW1xMTIxMiBzYW1lcXVhbnR1bSAgMCAgICAgICAgTmFOICAgLT4gMAorc2FtcTEyMTMgc2FtZXF1YW50dW0gIDAgICAgICAgLTdFKzMgIC0+IDAKK3NhbXExMjE0IHNhbWVxdWFudHVtICAwICAgICAgIC03ICAgICAtPiAxCitzYW1xMTIxNSBzYW1lcXVhbnR1bSAgMCAgICAgICAtN0UtMyAgLT4gMAorc2FtcTEyMTYgc2FtZXF1YW50dW0gIDAgICAgICAgLTBFLTMgIC0+IDAKK3NhbXExMjE3IHNhbWVxdWFudHVtICAwICAgICAgIC0wICAgICAtPiAxCitzYW1xMTIxOCBzYW1lcXVhbnR1bSAgMCAgICAgICAtMEUrMyAgLT4gMAorc2FtcTEyMTkgc2FtZXF1YW50dW0gIDAgICAgICAgIDBFLTMgIC0+IDAKK3NhbXExMjIwIHNhbWVxdWFudHVtICAwICAgICAgICAwICAgICAtPiAxCitzYW1xMTIyMSBzYW1lcXVhbnR1bSAgMCAgICAgICAgMEUrMyAgLT4gMAorc2FtcTEyMjIgc2FtZXF1YW50dW0gIDAgICAgICAgIDdFLTMgIC0+IDAKK3NhbXExMjIzIHNhbWVxdWFudHVtICAwICAgICAgICA3ICAgICAtPiAxCitzYW1xMTIyNCBzYW1lcXVhbnR1bSAgMCAgICAgICAgN0UrMyAgLT4gMAorc2FtcTEyMjUgc2FtZXF1YW50dW0gIDAgICAgICAgIHNOYU4gIC0+IDAKKworc2FtcTEzMTAgc2FtZXF1YW50dW0gIDBFKzMgICAgLUluZiAgIC0+IDAKK3NhbXExMzExIHNhbWVxdWFudHVtICAwRSszICAgICBJbmYgICAtPiAwCitzYW1xMTMxMiBzYW1lcXVhbnR1bSAgMEUrMyAgICAgTmFOICAgLT4gMAorc2FtcTEzMTMgc2FtZXF1YW50dW0gIDBFKzMgICAgLTdFKzMgIC0+IDEKK3NhbXExMzE0IHNhbWVxdWFudHVtICAwRSszICAgIC03ICAgICAtPiAwCitzYW1xMTMxNSBzYW1lcXVhbnR1bSAgMEUrMyAgICAtN0UtMyAgLT4gMAorc2FtcTEzMTYgc2FtZXF1YW50dW0gIDBFKzMgICAgLTBFLTMgIC0+IDAKK3NhbXExMzE3IHNhbWVxdWFudHVtICAwRSszICAgIC0wICAgICAtPiAwCitzYW1xMTMxOCBzYW1lcXVhbnR1bSAgMEUrMyAgICAtMEUrMyAgLT4gMQorc2FtcTEzMTkgc2FtZXF1YW50dW0gIDBFKzMgICAgIDBFLTMgIC0+IDAKK3NhbXExMzIwIHNhbWVxdWFudHVtICAwRSszICAgICAwICAgICAtPiAwCitzYW1xMTMyMSBzYW1lcXVhbnR1bSAgMEUrMyAgICAgMEUrMyAgLT4gMQorc2FtcTEzMjIgc2FtZXF1YW50dW0gIDBFKzMgICAgIDdFLTMgIC0+IDAKK3NhbXExMzIzIHNhbWVxdWFudHVtICAwRSszICAgICA3ICAgICAtPiAwCitzYW1xMTMyNCBzYW1lcXVhbnR1bSAgMEUrMyAgICAgN0UrMyAgLT4gMQorc2FtcTEzMjUgc2FtZXF1YW50dW0gIDBFKzMgICAgIHNOYU4gIC0+IDAKKworc2FtcTE0MTAgc2FtZXF1YW50dW0gIDdFLTMgICAgLUluZiAgIC0+IDAKK3NhbXExNDExIHNhbWVxdWFudHVtICA3RS0zICAgICBJbmYgICAtPiAwCitzYW1xMTQxMiBzYW1lcXVhbnR1bSAgN0UtMyAgICAgTmFOICAgLT4gMAorc2FtcTE0MTMgc2FtZXF1YW50dW0gIDdFLTMgICAgLTdFKzMgIC0+IDAKK3NhbXExNDE0IHNhbWVxdWFudHVtICA3RS0zICAgIC03ICAgICAtPiAwCitzYW1xMTQxNSBzYW1lcXVhbnR1bSAgN0UtMyAgICAtN0UtMyAgLT4gMQorc2FtcTE0MTYgc2FtZXF1YW50dW0gIDdFLTMgICAgLTBFLTMgIC0+IDEKK3NhbXExNDE3IHNhbWVxdWFudHVtICA3RS0zICAgIC0wICAgICAtPiAwCitzYW1xMTQxOCBzYW1lcXVhbnR1bSAgN0UtMyAgICAtMEUrMyAgLT4gMAorc2FtcTE0MTkgc2FtZXF1YW50dW0gIDdFLTMgICAgIDBFLTMgIC0+IDEKK3NhbXExNDIwIHNhbWVxdWFudHVtICA3RS0zICAgICAwICAgICAtPiAwCitzYW1xMTQyMSBzYW1lcXVhbnR1bSAgN0UtMyAgICAgMEUrMyAgLT4gMAorc2FtcTE0MjIgc2FtZXF1YW50dW0gIDdFLTMgICAgIDdFLTMgIC0+IDEKK3NhbXExNDIzIHNhbWVxdWFudHVtICA3RS0zICAgICA3ICAgICAtPiAwCitzYW1xMTQyNCBzYW1lcXVhbnR1bSAgN0UtMyAgICAgN0UrMyAgLT4gMAorc2FtcTE0MjUgc2FtZXF1YW50dW0gIDdFLTMgICAgIHNOYU4gIC0+IDAKKworc2FtcTE1MTAgc2FtZXF1YW50dW0gIDcgICAgICAtSW5mICAgLT4gMAorc2FtcTE1MTEgc2FtZXF1YW50dW0gIDcgICAgICAgSW5mICAgLT4gMAorc2FtcTE1MTIgc2FtZXF1YW50dW0gIDcgICAgICAgTmFOICAgLT4gMAorc2FtcTE1MTMgc2FtZXF1YW50dW0gIDcgICAgICAtN0UrMyAgLT4gMAorc2FtcTE1MTQgc2FtZXF1YW50dW0gIDcgICAgICAtNyAgICAgLT4gMQorc2FtcTE1MTUgc2FtZXF1YW50dW0gIDcgICAgICAtN0UtMyAgLT4gMAorc2FtcTE1MTYgc2FtZXF1YW50dW0gIDcgICAgICAtMEUtMyAgLT4gMAorc2FtcTE1MTcgc2FtZXF1YW50dW0gIDcgICAgICAtMCAgICAgLT4gMQorc2FtcTE1MTggc2FtZXF1YW50dW0gIDcgICAgICAtMEUrMyAgLT4gMAorc2FtcTE1MTkgc2FtZXF1YW50dW0gIDcgICAgICAgMEUtMyAgLT4gMAorc2FtcTE1MjAgc2FtZXF1YW50dW0gIDcgICAgICAgMCAgICAgLT4gMQorc2FtcTE1MjEgc2FtZXF1YW50dW0gIDcgICAgICAgMEUrMyAgLT4gMAorc2FtcTE1MjIgc2FtZXF1YW50dW0gIDcgICAgICAgN0UtMyAgLT4gMAorc2FtcTE1MjMgc2FtZXF1YW50dW0gIDcgICAgICAgNyAgICAgLT4gMQorc2FtcTE1MjQgc2FtZXF1YW50dW0gIDcgICAgICAgN0UrMyAgLT4gMAorc2FtcTE1MjUgc2FtZXF1YW50dW0gIDcgICAgICAgc05hTiAgLT4gMAorCitzYW1xMTYxMCBzYW1lcXVhbnR1bSAgN0UrMyAgICAtSW5mICAgLT4gMAorc2FtcTE2MTEgc2FtZXF1YW50dW0gIDdFKzMgICAgIEluZiAgIC0+IDAKK3NhbXExNjEyIHNhbWVxdWFudHVtICA3RSszICAgICBOYU4gICAtPiAwCitzYW1xMTYxMyBzYW1lcXVhbnR1bSAgN0UrMyAgICAtN0UrMyAgLT4gMQorc2FtcTE2MTQgc2FtZXF1YW50dW0gIDdFKzMgICAgLTcgICAgIC0+IDAKK3NhbXExNjE1IHNhbWVxdWFudHVtICA3RSszICAgIC03RS0zICAtPiAwCitzYW1xMTYxNiBzYW1lcXVhbnR1bSAgN0UrMyAgICAtMEUtMyAgLT4gMAorc2FtcTE2MTcgc2FtZXF1YW50dW0gIDdFKzMgICAgLTAgICAgIC0+IDAKK3NhbXExNjE4IHNhbWVxdWFudHVtICA3RSszICAgIC0wRSszICAtPiAxCitzYW1xMTYxOSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgMEUtMyAgLT4gMAorc2FtcTE2MjAgc2FtZXF1YW50dW0gIDdFKzMgICAgIDAgICAgIC0+IDAKK3NhbXExNjIxIHNhbWVxdWFudHVtICA3RSszICAgICAwRSszICAtPiAxCitzYW1xMTYyMiBzYW1lcXVhbnR1bSAgN0UrMyAgICAgN0UtMyAgLT4gMAorc2FtcTE2MjMgc2FtZXF1YW50dW0gIDdFKzMgICAgIDcgICAgIC0+IDAKK3NhbXExNjI0IHNhbWVxdWFudHVtICA3RSszICAgICA3RSszICAtPiAxCitzYW1xMTYyNSBzYW1lcXVhbnR1bSAgN0UrMyAgICAgc05hTiAgLT4gMAorCitzYW1xMTcxMCBzYW1lcXVhbnR1bSAgc05hTiAgICAtSW5mICAgLT4gMAorc2FtcTE3MTEgc2FtZXF1YW50dW0gIHNOYU4gICAgIEluZiAgIC0+IDAKK3NhbXExNzEyIHNhbWVxdWFudHVtICBzTmFOICAgICBOYU4gICAtPiAxCitzYW1xMTcxMyBzYW1lcXVhbnR1bSAgc05hTiAgICAtN0UrMyAgLT4gMAorc2FtcTE3MTQgc2FtZXF1YW50dW0gIHNOYU4gICAgLTcgICAgIC0+IDAKK3NhbXExNzE1IHNhbWVxdWFudHVtICBzTmFOICAgIC03RS0zICAtPiAwCitzYW1xMTcxNiBzYW1lcXVhbnR1bSAgc05hTiAgICAtMEUtMyAgLT4gMAorc2FtcTE3MTcgc2FtZXF1YW50dW0gIHNOYU4gICAgLTAgICAgIC0+IDAKK3NhbXExNzE4IHNhbWVxdWFudHVtICBzTmFOICAgIC0wRSszICAtPiAwCitzYW1xMTcxOSBzYW1lcXVhbnR1bSAgc05hTiAgICAgMEUtMyAgLT4gMAorc2FtcTE3MjAgc2FtZXF1YW50dW0gIHNOYU4gICAgIDAgICAgIC0+IDAKK3NhbXExNzIxIHNhbWVxdWFudHVtICBzTmFOICAgICAwRSszICAtPiAwCitzYW1xMTcyMiBzYW1lcXVhbnR1bSAgc05hTiAgICAgN0UtMyAgLT4gMAorc2FtcTE3MjMgc2FtZXF1YW50dW0gIHNOYU4gICAgIDcgICAgIC0+IDAKK3NhbXExNzI0IHNhbWVxdWFudHVtICBzTmFOICAgICA3RSszICAtPiAwCitzYW1xMTcyNSBzYW1lcXVhbnR1bSAgc05hTiAgICAgc05hTiAgLT4gMQorLS0gbm9pc3kgTmFOcworc2FtcTE3MzAgc2FtZXF1YW50dW0gIHNOYU4zICAgIHNOYU4zIC0+IDEKK3NhbXExNzMxIHNhbWVxdWFudHVtICBzTmFOMyAgICBzTmFONCAtPiAxCitzYW1xMTczMiBzYW1lcXVhbnR1bSAgIE5hTjMgICAgIE5hTjMgLT4gMQorc2FtcTE3MzMgc2FtZXF1YW50dW0gICBOYU4zICAgICBOYU40IC0+IDEKK3NhbXExNzM0IHNhbWVxdWFudHVtICBzTmFOMyAgICAgMyAgICAtPiAwCitzYW1xMTczNSBzYW1lcXVhbnR1bSAgIE5hTjMgICAgIDMgICAgLT4gMAorc2FtcTE3MzYgc2FtZXF1YW50dW0gICAgICA0ICAgIHNOYU40IC0+IDAKK3NhbXExNzM3IHNhbWVxdWFudHVtICAgICAgMyAgICAgTmFOMyAtPiAwCitzYW1xMTczOCBzYW1lcXVhbnR1bSAgICBJbmYgICAgc05hTjQgLT4gMAorc2FtcTE3Mzkgc2FtZXF1YW50dW0gICAtSW5mICAgICBOYU4zIC0+IDAKKworCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2NhbGViLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NjYWxlYi5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTY1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NjYWxlYi5kZWNUZXN0CkBAIC0wLDAgKzEsMjA5IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHNjYWxlYi5kZWNUZXN0IC0tIHNjYWxlIGEgbnVtYmVyIGJ5IHBvd2VycyBvZiAxMCAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gTWF4IHxyaHN8IGlzIDIqKDk5OSs5KSA9IDIwMTYKKworLS0gU2FuaXR5IGNoZWNrcworc2NieDAwMSBzY2FsZWIgICAgICAgNy41MCAgIDEwIC0+IDcuNTBFKzEwCitzY2J4MDAyIHNjYWxlYiAgICAgICA3LjUwICAgIDMgLT4gNy41MEUrMworc2NieDAwMyBzY2FsZWIgICAgICAgNy41MCAgICAyIC0+IDc1MAorc2NieDAwNCBzY2FsZWIgICAgICAgNy41MCAgICAxIC0+IDc1LjAKK3NjYngwMDUgc2NhbGViICAgICAgIDcuNTAgICAgMCAtPiA3LjUwCitzY2J4MDA2IHNjYWxlYiAgICAgICA3LjUwICAgLTEgLT4gMC43NTAKK3NjYngwMDcgc2NhbGViICAgICAgIDcuNTAgICAtMiAtPiAwLjA3NTAKK3NjYngwMDggc2NhbGViICAgICAgIDcuNTAgIC0xMCAtPiA3LjUwRS0xMAorc2NieDAwOSBzY2FsZWIgICAgICAtNy41MCAgICAzIC0+IC03LjUwRSszCitzY2J4MDEwIHNjYWxlYiAgICAgIC03LjUwICAgIDIgLT4gLTc1MAorc2NieDAxMSBzY2FsZWIgICAgICAtNy41MCAgICAxIC0+IC03NS4wCitzY2J4MDEyIHNjYWxlYiAgICAgIC03LjUwICAgIDAgLT4gLTcuNTAKK3NjYngwMTMgc2NhbGViICAgICAgLTcuNTAgICAtMSAtPiAtMC43NTAKKworLS0gSW5maW5pdGllcworc2NieDAxNCBzY2FsZWIgIEluZmluaXR5ICAgMSAtPiBJbmZpbml0eQorc2NieDAxNSBzY2FsZWIgIC1JbmZpbml0eSAgMiAtPiAtSW5maW5pdHkKK3NjYngwMTYgc2NhbGViICBJbmZpbml0eSAgLTEgLT4gSW5maW5pdHkKK3NjYngwMTcgc2NhbGViICAtSW5maW5pdHkgLTIgLT4gLUluZmluaXR5CisKKy0tIE5leHQgdHdvIGFyZSBzb21ld2hhdCB1bmRlZmluZWQgaW4gNzU0cjsgdHJlYXQgYXMgbm9uLWludGVnZXIKK3NjYngwMTggc2NhbGViICAxMCAgSW5maW5pdHkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDE5IHNjYWxlYiAgMTAgLUluZmluaXR5IC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBOYU5zIGFyZSB1bmRlZmluZWQgaW4gNzU0cjsgYXNzdW1lIHVzdWFsIHByb2Nlc3NpbmcKKy0tIE5hTnMsIDAgcGF5bG9hZAorc2NieDAyMSBzY2FsZWIgICAgICAgICBOYU4gIDEgLT4gTmFOCitzY2J4MDIyIHNjYWxlYiAgICAgICAgLU5hTiAtMSAtPiAtTmFOCitzY2J4MDIzIHNjYWxlYiAgICAgICAgc05hTiAgMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMjQgc2NhbGViICAgICAgIC1zTmFOICAxIC0+IC1OYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMjUgc2NhbGViICAgIDQgICAgTmFOICAgIC0+IE5hTgorc2NieDAyNiBzY2FsZWIgLUluZiAgIC1OYU4gICAgLT4gLU5hTgorc2NieDAyNyBzY2FsZWIgICAgNCAgIHNOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDI4IHNjYWxlYiAgSW5mICAtc05hTiAgICAtPiAtTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIG5vbi1pbnRlZ2VyIFJIUworc2NieDAzMCBzY2FsZWIgIDEuMjMgICAgMSAgICAtPiAgMTIuMworc2NieDAzMSBzY2FsZWIgIDEuMjMgICAgMS4wMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDMyIHNjYWxlYiAgMS4yMyAgICAxLjEgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMzMgc2NhbGViICAxLjIzICAgIDEuMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDAzNCBzY2FsZWIgIDEuMjMgICAgMC4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDM1IHNjYWxlYiAgMS4yMyAgICAwLjExIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMzYgc2NhbGViICAxLjIzICAgIDAuOTk5OTk5OTk5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMzcgc2NhbGViICAxLjIzICAgLTEgICAgLT4gIDAuMTIzCitzY2J4MDM4IHNjYWxlYiAgMS4yMyAgIC0xLjAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwMzkgc2NhbGViICAxLjIzICAgLTEuMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDA0MCBzY2FsZWIgIDEuMjMgICAtMS4wMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCitzY2J4MDQxIHNjYWxlYiAgMS4yMyAgIC0wLjAxIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngwNDIgc2NhbGViICAxLjIzICAgLTAuMTEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDA0MyBzY2FsZWIgIDEuMjMgICAtMC45OTk5OTk5OTkgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDA0NCBzY2FsZWIgIDEuMjMgICAgMC4xICAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDA0NSBzY2FsZWIgIDEuMjMgICAgMUUrMSAgICAgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDA0NiBzY2FsZWIgIDEuMjMgICAgMS4xMjM0RSs2ICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2NieDA0NyBzY2FsZWIgIDEuMjMgICAgMS4xMjNFKzQgICAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCisKK3NjYngxMjAgc2NhbGViICAxLjIzICAgIDIwMTUgICAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3NjYngxMjEgc2NhbGViICAxLjIzICAgIDIwMTYgICAgICAgIC0+ICBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3NjYngxMjIgc2NhbGViICAxLjIzICAgIDIwMTcgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngxMjMgc2NhbGViICAxLjIzICAgIDIwMTggICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngxMjQgc2NhbGViICAxLjIzICAgLTIwMTUgICAgICAgIC0+ICAwRS0xMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3NjYngxMjUgc2NhbGViICAxLjIzICAgLTIwMTYgICAgICAgIC0+ICAwRS0xMDA3IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3NjYngxMjYgc2NhbGViICAxLjIzICAgLTIwMTcgICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NjYngxMjcgc2NhbGViICAxLjIzICAgLTIwMTggICAgICAgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gTmFOcywgbm9uLTAgcGF5bG9hZAorLS0gcHJvcGFnYXRpbmcgTmFOcworc2NieDg2MSBzY2FsZWIgIE5hTjAxICAgLUluZiAgICAgLT4gIE5hTjEKK3NjYng4NjIgc2NhbGViIC1OYU4wMiAgIC0xMDAwICAgIC0+IC1OYU4yCitzY2J4ODYzIHNjYWxlYiAgTmFOMDMgICAgMTAwMCAgICAtPiAgTmFOMworc2NieDg2NCBzY2FsZWIgIE5hTjA0ICAgIEluZiAgICAgLT4gIE5hTjQKK3NjYng4NjUgc2NhbGViICBOYU4wNSAgICBOYU42MSAgIC0+ICBOYU41CitzY2J4ODY2IHNjYWxlYiAtSW5mICAgICAtTmFONzEgICAtPiAtTmFONzEKK3NjYng4Njcgc2NhbGViIC0xMDAwICAgICBOYU44MSAgIC0+ICBOYU44MQorc2NieDg2OCBzY2FsZWIgIDEwMDAgICAgIE5hTjkxICAgLT4gIE5hTjkxCitzY2J4ODY5IHNjYWxlYiAgSW5mICAgICAgTmFOMTAxICAtPiAgTmFOMTAxCitzY2J4ODcxIHNjYWxlYiAgc05hTjAxMSAgLUluZiAgICAtPiAgTmFOMTEgIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODcyIHNjYWxlYiAgc05hTjAxMiAgLTEwMDAgICAtPiAgTmFOMTIgIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODczIHNjYWxlYiAtc05hTjAxMyAgIDEwMDAgICAtPiAtTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODc0IHNjYWxlYiAgc05hTjAxNCAgIE5hTjE3MSAtPiAgTmFOMTQgIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODc1IHNjYWxlYiAgc05hTjAxNSAgc05hTjE4MSAtPiAgTmFOMTUgIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODc2IHNjYWxlYiAgTmFOMDE2ICAgc05hTjE5MSAtPiAgTmFOMTkxIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODc3IHNjYWxlYiAtSW5mICAgICAgc05hTjIwMSAtPiAgTmFOMjAxIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODc4IHNjYWxlYiAtMTAwMCAgICAgc05hTjIxMSAtPiAgTmFOMjExIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODc5IHNjYWxlYiAgMTAwMCAgICAtc05hTjIyMSAtPiAtTmFOMjIxIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODgwIHNjYWxlYiAgSW5mICAgICAgc05hTjIzMSAtPiAgTmFOMjMxIEludmFsaWRfb3BlcmF0aW9uCitzY2J4ODgxIHNjYWxlYiAgTmFOMDI1ICAgc05hTjI0MSAtPiAgTmFOMjQxIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGZpbml0ZXMKK3NjYngwNTEgc2NhbGViICAgICAgICAgIDcgICAtMiAgLT4gMC4wNworc2NieDA1MiBzY2FsZWIgICAgICAgICAtNyAgIC0yICAtPiAtMC4wNworc2NieDA1MyBzY2FsZWIgICAgICAgICA3NSAgIC0yICAtPiAwLjc1CitzY2J4MDU0IHNjYWxlYiAgICAgICAgLTc1ICAgLTIgIC0+IC0wLjc1CitzY2J4MDU1IHNjYWxlYiAgICAgICA3LjUwICAgLTIgIC0+IDAuMDc1MAorc2NieDA1NiBzY2FsZWIgICAgICAtNy41MCAgIC0yICAtPiAtMC4wNzUwCitzY2J4MDU3IHNjYWxlYiAgICAgICA3LjUwMCAgLTIgIC0+IDAuMDc1MDAKK3NjYngwNTggc2NhbGViICAgICAgLTcuNTAwICAtMiAgLT4gLTAuMDc1MDAKK3NjYngwNjEgc2NhbGViICAgICAgICAgIDcgICAtMSAgLT4gMC43CitzY2J4MDYyIHNjYWxlYiAgICAgICAgIC03ICAgLTEgIC0+IC0wLjcKK3NjYngwNjMgc2NhbGViICAgICAgICAgNzUgICAtMSAgLT4gNy41CitzY2J4MDY0IHNjYWxlYiAgICAgICAgLTc1ICAgLTEgIC0+IC03LjUKK3NjYngwNjUgc2NhbGViICAgICAgIDcuNTAgICAtMSAgLT4gMC43NTAKK3NjYngwNjYgc2NhbGViICAgICAgLTcuNTAgICAtMSAgLT4gLTAuNzUwCitzY2J4MDY3IHNjYWxlYiAgICAgICA3LjUwMCAgLTEgIC0+IDAuNzUwMAorc2NieDA2OCBzY2FsZWIgICAgICAtNy41MDAgIC0xICAtPiAtMC43NTAwCitzY2J4MDcxIHNjYWxlYiAgICAgICAgICA3ICAgIDAgIC0+IDcKK3NjYngwNzIgc2NhbGViICAgICAgICAgLTcgICAgMCAgLT4gLTcKK3NjYngwNzMgc2NhbGViICAgICAgICAgNzUgICAgMCAgLT4gNzUKK3NjYngwNzQgc2NhbGViICAgICAgICAtNzUgICAgMCAgLT4gLTc1CitzY2J4MDc1IHNjYWxlYiAgICAgICA3LjUwICAgIDAgIC0+IDcuNTAKK3NjYngwNzYgc2NhbGViICAgICAgLTcuNTAgICAgMCAgLT4gLTcuNTAKK3NjYngwNzcgc2NhbGViICAgICAgIDcuNTAwICAgMCAgLT4gNy41MDAKK3NjYngwNzggc2NhbGViICAgICAgLTcuNTAwICAgMCAgLT4gLTcuNTAwCitzY2J4MDgxIHNjYWxlYiAgICAgICAgICA3ICAgIDEgIC0+IDdFKzEKK3NjYngwODIgc2NhbGViICAgICAgICAgLTcgICAgMSAgLT4gLTdFKzEKK3NjYngwODMgc2NhbGViICAgICAgICAgNzUgICAgMSAgLT4gNy41RSsyCitzY2J4MDg0IHNjYWxlYiAgICAgICAgLTc1ICAgIDEgIC0+IC03LjVFKzIKK3NjYngwODUgc2NhbGViICAgICAgIDcuNTAgICAgMSAgLT4gNzUuMAorc2NieDA4NiBzY2FsZWIgICAgICAtNy41MCAgICAxICAtPiAtNzUuMAorc2NieDA4NyBzY2FsZWIgICAgICAgNy41MDAgICAxICAtPiA3NS4wMAorc2NieDA4OCBzY2FsZWIgICAgICAtNy41MDAgICAxICAtPiAtNzUuMDAKK3NjYngwOTEgc2NhbGViICAgICAgICAgIDcgICAgMiAgLT4gN0UrMgorc2NieDA5MiBzY2FsZWIgICAgICAgICAtNyAgICAyICAtPiAtN0UrMgorc2NieDA5MyBzY2FsZWIgICAgICAgICA3NSAgICAyICAtPiA3LjVFKzMKK3NjYngwOTQgc2NhbGViICAgICAgICAtNzUgICAgMiAgLT4gLTcuNUUrMworc2NieDA5NSBzY2FsZWIgICAgICAgNy41MCAgICAyICAtPiA3NTAKK3NjYngwOTYgc2NhbGViICAgICAgLTcuNTAgICAgMiAgLT4gLTc1MAorc2NieDA5NyBzY2FsZWIgICAgICAgNy41MDAgICAyICAtPiA3NTAuMAorc2NieDA5OCBzY2FsZWIgICAgICAtNy41MDAgICAyICAtPiAtNzUwLjAKKworLS0gemVyb3MKK3NjYngxMTEgc2NhbGViICAgICAgICAgIDAgIDEgLT4gMEUrMQorc2NieDExMiBzY2FsZWIgICAgICAgICAtMCAgMiAtPiAtMEUrMgorc2NieDExMyBzY2FsZWIgICAgICAgMEUrNCAgMyAtPiAwRSs3CitzY2J4MTE0IHNjYWxlYiAgICAgIC0wRSs0ICA0IC0+IC0wRSs4CitzY2J4MTE1IHNjYWxlYiAgICAgMC4wMDAwICA1IC0+IDBFKzEKK3NjYngxMTYgc2NhbGViICAgIC0wLjAwMDAgIDYgLT4gLTBFKzIKK3NjYngxMTcgc2NhbGViICAgICAgMEUtMTQxIDcgLT4gMEUtMTM0CitzY2J4MTE4IHNjYWxlYiAgICAgLTBFLTE0MSA4IC0+IC0wRS0xMzMKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK3NjYngxMzIgc2NhbGViICA5Ljk5OTk5OTk5RSs5OTkgKzk5OSAtPiBJbmZpbml0eSAgICBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3NjYngxMzMgc2NhbGViICA5Ljk5OTk5OTk5RSs5OTkgICsxMCAtPiBJbmZpbml0eSAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzY2J4MTM0IHNjYWxlYiAgOS45OTk5OTk5OUUrOTk5ICArMSAgLT4gSW5maW5pdHkgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc2NieDEzNSBzY2FsZWIgIDkuOTk5OTk5OTlFKzk5OSAgIDAgIC0+IDkuOTk5OTk5OTlFKzk5OQorc2NieDEzNiBzY2FsZWIgIDkuOTk5OTk5OTlFKzk5OSAgLTEgIC0+IDkuOTk5OTk5OTlFKzk5OAorc2NieDEzNyBzY2FsZWIgIDFFLTk5OSAgICAgICAgICAgKzEgIC0+IDFFLTk5OAorc2NieDEzOCBzY2FsZWIgIDFFLTk5OSAgICAgICAgICAgLTAgIC0+IDFFLTk5OQorc2NieDEzOSBzY2FsZWIgIDFFLTk5OSAgICAgICAgICAgLTEgIC0+IDFFLTEwMDAgICAgICAgICBTdWJub3JtYWwKK3NjYngxNDAgc2NhbGViICAxLjAwMDAwMDAwRS05OTkgICsxICAtPiAxLjAwMDAwMDAwRS05OTgKK3NjYngxNDEgc2NhbGViICAxLjAwMDAwMDAwRS05OTkgICAwICAtPiAxLjAwMDAwMDAwRS05OTkKK3NjYngxNDIgc2NhbGViICAxLjAwMDAwMDAwRS05OTkgIC0xICAtPiAxLjAwMDAwMDBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK3NjYngxNDMgc2NhbGViICAxRS0xMDA3ICAgICAgICAgICsxICAtPiAxRS0xMDA2ICAgICAgICAgU3Vibm9ybWFsCitzY2J4MTQ0IHNjYWxlYiAgMUUtMTAwNyAgICAgICAgICAtMCAgLT4gMUUtMTAwNyAgICAgICAgIFN1Ym5vcm1hbAorc2NieDE0NSBzY2FsZWIgIDFFLTEwMDcgICAgICAgICAgLTEgIC0+IDBFLTEwMDcgICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCisKK3NjYngxNTAgc2NhbGViICAtMUUtMTAwNyAgICAgICAgICsxICAtPiAtMUUtMTAwNiAgICAgICAgU3Vibm9ybWFsCitzY2J4MTUxIHNjYWxlYiAgLTFFLTEwMDcgICAgICAgICAtMCAgLT4gLTFFLTEwMDcgICAgICAgIFN1Ym5vcm1hbAorc2NieDE1MiBzY2FsZWIgIC0xRS0xMDA3ICAgICAgICAgLTEgIC0+IC0wRS0xMDA3ICAgICAgICBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitzY2J4MTUzIHNjYWxlYiAgLTEuMDAwMDAwMDBFLTk5OSArMSAgLT4gLTEuMDAwMDAwMDBFLTk5OAorc2NieDE1NCBzY2FsZWIgIC0xLjAwMDAwMDAwRS05OTkgKzAgIC0+IC0xLjAwMDAwMDAwRS05OTkKK3NjYngxNTUgc2NhbGViICAtMS4wMDAwMDAwMEUtOTk5IC0xICAtPiAtMS4wMDAwMDAwRS0xMDAwIFN1Ym5vcm1hbCBSb3VuZGVkCitzY2J4MTU2IHNjYWxlYiAgLTFFLTk5OSAgICAgICAgICArMSAgLT4gLTFFLTk5OAorc2NieDE1NyBzY2FsZWIgIC0xRS05OTkgICAgICAgICAgLTAgIC0+IC0xRS05OTkKK3NjYngxNTggc2NhbGViICAtMUUtOTk5ICAgICAgICAgIC0xICAtPiAtMUUtMTAwMCAgICAgICAgIFN1Ym5vcm1hbAorc2NieDE1OSBzY2FsZWIgIC05Ljk5OTk5OTk5RSs5OTkgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzY2J4MTYwIHNjYWxlYiAgLTkuOTk5OTk5OTlFKzk5OSArMCAgLT4gLTkuOTk5OTk5OTlFKzk5OQorc2NieDE2MSBzY2FsZWIgIC05Ljk5OTk5OTk5RSs5OTkgLTEgIC0+IC05Ljk5OTk5OTk5RSs5OTgKK3NjYngxNjIgc2NhbGViICAtOUUrOTk5ICAgICAgICAgICsxICAtPiAtSW5maW5pdHkgICAgICAgIE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc2NieDE2MyBzY2FsZWIgIC0xRSs5OTkgICAgICAgICAgKzEgIC0+IC1JbmZpbml0eSAgICAgICAgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCisKKy0tIEtyYWggZXhhbXBsZXMKK3ByZWNpc2lvbjogICAzNAorbWF4RXhwb25lbnQ6IDk5OTk5OTk5OQorbWluRXhwb25lbnQ6IC05OTk5OTk5OTkKKy0tIGludGVnZXIgb3ZlcmZsb3cgaW4gMy42MSBvciBlYXJsaWVyCitzY2J4MTY0IHNjYWxlYiAgMUUtOTk5OTk5OTk5ICAtMTIwMDAwMDAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBvdXQgb2YgcmFuZ2UKK3NjYngxNjUgc2NhbGViICAtMUUtOTk5OTk5OTk5ICArMTIwMDAwMDAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NoaWZ0LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NoaWZ0LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MzhjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc2hpZnQuZGVjVGVzdApAQCAtMCwwICsxLDI1MCBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBzaGlmdC5kZWNUZXN0IC0tIHNoaWZ0IGNvZWZmaWNpZW50IGxlZnQgb3IgcmlnaHQgICAgICAgICAgICAgICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKKy0tIFNhbml0eSBjaGVjaworc2hpeDAwMSBzaGlmdCAgICAgICAgICAwICAgIDAgIC0+ICAwCitzaGl4MDAyIHNoaWZ0ICAgICAgICAgIDAgICAgMiAgLT4gIDAKK3NoaXgwMDMgc2hpZnQgICAgICAgICAgMSAgICAyICAtPiAgMTAwCitzaGl4MDA0IHNoaWZ0ICAgICAgICAgIDEgICAgOCAgLT4gIDEwMDAwMDAwMAorc2hpeDAwNSBzaGlmdCAgICAgICAgICAxICAgIDkgIC0+ICAwCitzaGl4MDA2IHNoaWZ0ICAgICAgICAgIDEgICAtMSAgLT4gIDAKK3NoaXgwMDcgc2hpZnQgIDEyMzQ1Njc4OSAgIC0xICAtPiAgMTIzNDU2NzgKK3NoaXgwMDggc2hpZnQgIDEyMzQ1Njc4OSAgIC04ICAtPiAgMQorc2hpeDAwOSBzaGlmdCAgMTIzNDU2Nzg5ICAgLTkgIC0+ICAwCitzaGl4MDEwIHNoaWZ0ICAgICAgICAgIDAgICAtMiAgLT4gIDAKKworLS0gcmhzIG11c3QgYmUgYW4gaW50ZWdlcgorc2hpeDAxMSBzaGlmdCAgICAgICAgMSAgICAxLjUgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4MDEyIHNoaWZ0ICAgICAgICAxICAgIDEuMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXgwMTMgc2hpZnQgICAgICAgIDEgICAgMC4xICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDAxNCBzaGlmdCAgICAgICAgMSAgICAwLjAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4MDE1IHNoaWZ0ICAgICAgICAxICAgIDFFKzEgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXgwMTYgc2hpZnQgICAgICAgIDEgICAgMUUrOTkgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDAxNyBzaGlmdCAgICAgICAgMSAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4MDE4IHNoaWZ0ICAgICAgICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIGFuZCB8cmhzfCA8PSBwcmVjaXNpb24KK3NoaXgwMjAgc2hpZnQgICAgICAgIDEgICAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDAyMSBzaGlmdCAgICAgICAgMSAgICAtMTAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4MDIyIHNoaWZ0ICAgICAgICAxICAgICAxMCAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXgwMjMgc2hpZnQgICAgICAgIDEgICAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCistLSBmdWxsIHNoaWZ0aW5nIHBhdHRlcm4KK3NoaXgwMzAgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtOSAgIC0+IDAKK3NoaXgwMzEgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtOCAgIC0+IDEKK3NoaXgwMzIgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtNyAgIC0+IDEyCitzaGl4MDMzIHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgLTYgICAtPiAxMjMKK3NoaXgwMzQgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtNSAgIC0+IDEyMzQKK3NoaXgwMzUgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtNCAgIC0+IDEyMzQ1CitzaGl4MDM2IHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgLTMgICAtPiAxMjM0NTYKK3NoaXgwMzcgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtMiAgIC0+IDEyMzQ1NjcKK3NoaXgwMzggc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICAtMSAgIC0+IDEyMzQ1Njc4CitzaGl4MDM5IHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgLTAgICAtPiAxMjM0NTY3ODkKK3NoaXgwNDAgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICArMCAgIC0+IDEyMzQ1Njc4OQorc2hpeDA0MSBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgICsxICAgLT4gMjM0NTY3ODkwCitzaGl4MDQyIHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgKzIgICAtPiAzNDU2Nzg5MDAKK3NoaXgwNDMgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICArMyAgIC0+IDQ1Njc4OTAwMAorc2hpeDA0NCBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgICs0ICAgLT4gNTY3ODkwMDAwCitzaGl4MDQ1IHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgKzUgICAtPiA2Nzg5MDAwMDAKK3NoaXgwNDYgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICArNiAgIC0+IDc4OTAwMDAwMAorc2hpeDA0NyBzaGlmdCAgMTIzNDU2Nzg5ICAgICAgICAgICs3ICAgLT4gODkwMDAwMDAwCitzaGl4MDQ4IHNoaWZ0ICAxMjM0NTY3ODkgICAgICAgICAgKzggICAtPiA5MDAwMDAwMDAKK3NoaXgwNDkgc2hpZnQgIDEyMzQ1Njc4OSAgICAgICAgICArOSAgIC0+IDAKKworLS0gZnJvbSBleGFtcGxlcworc2hpeDA1MSBzaGlmdCAzNCAgICAgICAgOCAgIC0+ICAnNDAwMDAwMDAwJworc2hpeDA1MiBzaGlmdCAxMiAgICAgICAgOSAgIC0+ICAnMCcKK3NoaXgwNTMgc2hpZnQgMTIzNDU2Nzg5IC0yICAtPiAgJzEyMzQ1NjcnCitzaGl4MDU0IHNoaWZ0IDEyMzQ1Njc4OSAwICAgLT4gICcxMjM0NTY3ODknCitzaGl4MDU1IHNoaWZ0IDEyMzQ1Njc4OSArMiAgLT4gICczNDU2Nzg5MDAnCisKKy0tIHplcm9zCitzaGl4MDYwIHNoaWZ0ICAwRS0xMCAgICAgICAgICAgICAgKzkgICAtPiAgIDBFLTEwCitzaGl4MDYxIHNoaWZ0ICAwRS0xMCAgICAgICAgICAgICAgLTkgICAtPiAgIDBFLTEwCitzaGl4MDYyIHNoaWZ0ICAwLjAwMCAgICAgICAgICAgICAgKzkgICAtPiAgIDAuMDAwCitzaGl4MDYzIHNoaWZ0ICAwLjAwMCAgICAgICAgICAgICAgLTkgICAtPiAgIDAuMDAwCitzaGl4MDY0IHNoaWZ0ICAwRSsxMCAgICAgICAgICAgICAgKzkgICAtPiAgIDBFKzEwCitzaGl4MDY1IHNoaWZ0ICAwRSsxMCAgICAgICAgICAgICAgLTkgICAtPiAgIDBFKzEwCitzaGl4MDY2IHNoaWZ0IC0wRS0xMCAgICAgICAgICAgICAgKzkgICAtPiAgLTBFLTEwCitzaGl4MDY3IHNoaWZ0IC0wRS0xMCAgICAgICAgICAgICAgLTkgICAtPiAgLTBFLTEwCitzaGl4MDY4IHNoaWZ0IC0wLjAwMCAgICAgICAgICAgICAgKzkgICAtPiAgLTAuMDAwCitzaGl4MDY5IHNoaWZ0IC0wLjAwMCAgICAgICAgICAgICAgLTkgICAtPiAgLTAuMDAwCitzaGl4MDcwIHNoaWZ0IC0wRSsxMCAgICAgICAgICAgICAgKzkgICAtPiAgLTBFKzEwCitzaGl4MDcxIHNoaWZ0IC0wRSsxMCAgICAgICAgICAgICAgLTkgICAtPiAgLTBFKzEwCisKKy0tIE5tYXgsIE5taW4sIE50aW55CitzaGl4MTQxIHNoaWZ0ICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0xICAtPiA5Ljk5OTk5OTlFKzk5OAorc2hpeDE0MiBzaGlmdCAgOS45OTk5OTk5OUUrOTk5ICAgICAtOCAgLT4gOUUrOTkxCitzaGl4MTQzIHNoaWZ0ICA5Ljk5OTk5OTk5RSs5OTkgICAgICAxICAtPiA5Ljk5OTk5OTkwRSs5OTkKK3NoaXgxNDQgc2hpZnQgIDkuOTk5OTk5OTlFKzk5OSAgICAgIDggIC0+IDkuMDAwMDAwMDBFKzk5OQorc2hpeDE0NSBzaGlmdCAgMUUtOTk5ICAgICAgICAgICAgICAtMSAgLT4gMEUtOTk5CitzaGl4MTQ2IHNoaWZ0ICAxRS05OTkgICAgICAgICAgICAgIC04ICAtPiAwRS05OTkKK3NoaXgxNDcgc2hpZnQgIDFFLTk5OSAgICAgICAgICAgICAgIDEgIC0+IDEuMEUtOTk4CitzaGl4MTQ4IHNoaWZ0ICAxRS05OTkgICAgICAgICAgICAgICA4ICAtPiAxLjAwMDAwMDAwRS05OTEKK3NoaXgxNTEgc2hpZnQgIDEuMDAwMDAwMDBFLTk5OSAgICAgLTEgIC0+IDEuMDAwMDAwMEUtMTAwMAorc2hpeDE1MiBzaGlmdCAgMS4wMDAwMDAwMEUtOTk5ICAgICAtOCAgLT4gMUUtMTAwNworc2hpeDE1MyBzaGlmdCAgMS4wMDAwMDAwMEUtOTk5ICAgICAgMSAgLT4gMEUtMTAwNworc2hpeDE1NCBzaGlmdCAgMS4wMDAwMDAwMEUtOTk5ICAgICAgOCAgLT4gMEUtMTAwNworc2hpeDE1NSBzaGlmdCAgOS4wMDAwMDAwMEUtOTk5ICAgICAtMSAgLT4gOS4wMDAwMDAwRS0xMDAwCitzaGl4MTU2IHNoaWZ0ICA5LjAwMDAwMDAwRS05OTkgICAgIC04ICAtPiA5RS0xMDA3CitzaGl4MTU3IHNoaWZ0ICA5LjAwMDAwMDAwRS05OTkgICAgICAxICAtPiAwRS0xMDA3CitzaGl4MTU4IHNoaWZ0ICA5LjAwMDAwMDAwRS05OTkgICAgICA4ICAtPiAwRS0xMDA3CitzaGl4MTYwIHNoaWZ0ICAxRS0xMDA3ICAgICAgICAgICAgIC0xICAtPiAwRS0xMDA3CitzaGl4MTYxIHNoaWZ0ICAxRS0xMDA3ICAgICAgICAgICAgIC04ICAtPiAwRS0xMDA3CitzaGl4MTYyIHNoaWZ0ICAxRS0xMDA3ICAgICAgICAgICAgICAxICAtPiAxLjBFLTEwMDYKK3NoaXgxNjMgc2hpZnQgIDFFLTEwMDcgICAgICAgICAgICAgIDggIC0+IDEuMDAwMDAwMDBFLTk5OQorLS0gIG5lZ2F0aXZlcworc2hpeDE3MSBzaGlmdCAtOS45OTk5OTk5OUUrOTk5ICAgICAtMSAgLT4gLTkuOTk5OTk5OUUrOTk4CitzaGl4MTcyIHNoaWZ0IC05Ljk5OTk5OTk5RSs5OTkgICAgIC04ICAtPiAtOUUrOTkxCitzaGl4MTczIHNoaWZ0IC05Ljk5OTk5OTk5RSs5OTkgICAgICAxICAtPiAtOS45OTk5OTk5MEUrOTk5CitzaGl4MTc0IHNoaWZ0IC05Ljk5OTk5OTk5RSs5OTkgICAgICA4ICAtPiAtOS4wMDAwMDAwMEUrOTk5CitzaGl4MTc1IHNoaWZ0IC0xRS05OTkgICAgICAgICAgICAgIC0xICAtPiAtMEUtOTk5CitzaGl4MTc2IHNoaWZ0IC0xRS05OTkgICAgICAgICAgICAgIC04ICAtPiAtMEUtOTk5CitzaGl4MTc3IHNoaWZ0IC0xRS05OTkgICAgICAgICAgICAgICAxICAtPiAtMS4wRS05OTgKK3NoaXgxNzggc2hpZnQgLTFFLTk5OSAgICAgICAgICAgICAgIDggIC0+IC0xLjAwMDAwMDAwRS05OTEKK3NoaXgxODEgc2hpZnQgLTEuMDAwMDAwMDBFLTk5OSAgICAgLTEgIC0+IC0xLjAwMDAwMDBFLTEwMDAKK3NoaXgxODIgc2hpZnQgLTEuMDAwMDAwMDBFLTk5OSAgICAgLTggIC0+IC0xRS0xMDA3CitzaGl4MTgzIHNoaWZ0IC0xLjAwMDAwMDAwRS05OTkgICAgICAxICAtPiAtMEUtMTAwNworc2hpeDE4NCBzaGlmdCAtMS4wMDAwMDAwMEUtOTk5ICAgICAgOCAgLT4gLTBFLTEwMDcKK3NoaXgxODUgc2hpZnQgLTkuMDAwMDAwMDBFLTk5OSAgICAgLTEgIC0+IC05LjAwMDAwMDBFLTEwMDAKK3NoaXgxODYgc2hpZnQgLTkuMDAwMDAwMDBFLTk5OSAgICAgLTggIC0+IC05RS0xMDA3CitzaGl4MTg3IHNoaWZ0IC05LjAwMDAwMDAwRS05OTkgICAgICAxICAtPiAtMEUtMTAwNworc2hpeDE4OCBzaGlmdCAtOS4wMDAwMDAwMEUtOTk5ICAgICAgOCAgLT4gLTBFLTEwMDcKK3NoaXgxOTAgc2hpZnQgLTFFLTEwMDcgICAgICAgICAgICAgLTEgIC0+IC0wRS0xMDA3CitzaGl4MTkxIHNoaWZ0IC0xRS0xMDA3ICAgICAgICAgICAgIC04ICAtPiAtMEUtMTAwNworc2hpeDE5MiBzaGlmdCAtMUUtMTAwNyAgICAgICAgICAgICAgMSAgLT4gLTEuMEUtMTAwNgorc2hpeDE5MyBzaGlmdCAtMUUtMTAwNyAgICAgICAgICAgICAgOCAgLT4gLTEuMDAwMDAwMDBFLTk5OQorCistLSBtb3JlIG5lZ2F0aXZlcyAob2Ygc2FuaXRpZXMpCitzaGl4MjAxIHNoaWZ0ICAgICAgICAgLTAgICAgMCAgLT4gIC0wCitzaGl4MjAyIHNoaWZ0ICAgICAgICAgLTAgICAgMiAgLT4gIC0wCitzaGl4MjAzIHNoaWZ0ICAgICAgICAgLTEgICAgMiAgLT4gIC0xMDAKK3NoaXgyMDQgc2hpZnQgICAgICAgICAtMSAgICA4ICAtPiAgLTEwMDAwMDAwMAorc2hpeDIwNSBzaGlmdCAgICAgICAgIC0xICAgIDkgIC0+ICAtMAorc2hpeDIwNiBzaGlmdCAgICAgICAgIC0xICAgLTEgIC0+ICAtMAorc2hpeDIwNyBzaGlmdCAtMTIzNDU2Nzg5ICAgLTEgIC0+ICAtMTIzNDU2NzgKK3NoaXgyMDggc2hpZnQgLTEyMzQ1Njc4OSAgIC04ICAtPiAgLTEKK3NoaXgyMDkgc2hpZnQgLTEyMzQ1Njc4OSAgIC05ICAtPiAgLTAKK3NoaXgyMTAgc2hpZnQgICAgICAgICAtMCAgIC0yICAtPiAgLTAKK3NoaXgyMTEgc2hpZnQgICAgICAgICAtMCAgIC0wICAtPiAgLTAKKworCistLSBTcGVjaWFsczsgTmFOcyBhcmUgaGFuZGxlZCBhcyB1c3VhbAorc2hpeDc4MSBzaGlmdCAtSW5mICAtOCAgICAgLT4gLUluZmluaXR5CitzaGl4NzgyIHNoaWZ0IC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK3NoaXg3ODMgc2hpZnQgLUluZiAgLTAgICAgIC0+IC1JbmZpbml0eQorc2hpeDc4NCBzaGlmdCAtSW5mICAgMCAgICAgLT4gLUluZmluaXR5CitzaGl4Nzg1IHNoaWZ0IC1JbmYgICAxICAgICAtPiAtSW5maW5pdHkKK3NoaXg3ODYgc2hpZnQgLUluZiAgIDggICAgIC0+IC1JbmZpbml0eQorc2hpeDc4NyBzaGlmdCAtMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4Nzg4IHNoaWZ0IC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg3ODkgc2hpZnQgLTEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDc5MCBzaGlmdCAtMCAgICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4NzkxIHNoaWZ0ICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg3OTIgc2hpZnQgIDEgICAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDc5MyBzaGlmdCAgMTAwMCAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4Nzk0IHNoaWZ0ICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworc2hpeDgwMCBzaGlmdCAgSW5mICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODAxIHNoaWZ0ICBJbmYgIC04ICAgICAtPiBJbmZpbml0eQorc2hpeDgwMiBzaGlmdCAgSW5mICAtMSAgICAgLT4gSW5maW5pdHkKK3NoaXg4MDMgc2hpZnQgIEluZiAgLTAgICAgIC0+IEluZmluaXR5CitzaGl4ODA0IHNoaWZ0ICBJbmYgICAwICAgICAtPiBJbmZpbml0eQorc2hpeDgwNSBzaGlmdCAgSW5mICAgMSAgICAgLT4gSW5maW5pdHkKK3NoaXg4MDYgc2hpZnQgIEluZiAgIDggICAgIC0+IEluZmluaXR5CitzaGl4ODA3IHNoaWZ0ICBJbmYgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4MDggc2hpZnQgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDgwOSBzaGlmdCAtSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODEwIHNoaWZ0IC0xICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4MTEgc2hpZnQgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDgxMiBzaGlmdCAgMCAgICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODEzIHNoaWZ0ICAxICAgICBJbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4MTQgc2hpZnQgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDgxNSBzaGlmdCAgSW5mICAgSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3NoaXg4MjEgc2hpZnQgIE5hTiAtSW5mICAgIC0+ICBOYU4KK3NoaXg4MjIgc2hpZnQgIE5hTiAtMTAwMCAgIC0+ICBOYU4KK3NoaXg4MjMgc2hpZnQgIE5hTiAtMSAgICAgIC0+ICBOYU4KK3NoaXg4MjQgc2hpZnQgIE5hTiAtMCAgICAgIC0+ICBOYU4KK3NoaXg4MjUgc2hpZnQgIE5hTiAgMCAgICAgIC0+ICBOYU4KK3NoaXg4MjYgc2hpZnQgIE5hTiAgMSAgICAgIC0+ICBOYU4KK3NoaXg4Mjcgc2hpZnQgIE5hTiAgMTAwMCAgIC0+ICBOYU4KK3NoaXg4Mjggc2hpZnQgIE5hTiAgSW5mICAgIC0+ICBOYU4KK3NoaXg4Mjkgc2hpZnQgIE5hTiAgTmFOICAgIC0+ICBOYU4KK3NoaXg4MzAgc2hpZnQgLUluZiAgTmFOICAgIC0+ICBOYU4KK3NoaXg4MzEgc2hpZnQgLTEwMDAgTmFOICAgIC0+ICBOYU4KK3NoaXg4MzIgc2hpZnQgLTEgICAgTmFOICAgIC0+ICBOYU4KK3NoaXg4MzMgc2hpZnQgLTAgICAgTmFOICAgIC0+ICBOYU4KK3NoaXg4MzQgc2hpZnQgIDAgICAgTmFOICAgIC0+ICBOYU4KK3NoaXg4MzUgc2hpZnQgIDEgICAgTmFOICAgIC0+ICBOYU4KK3NoaXg4MzYgc2hpZnQgIDEwMDAgTmFOICAgIC0+ICBOYU4KK3NoaXg4Mzcgc2hpZnQgIEluZiAgTmFOICAgIC0+ICBOYU4KKworc2hpeDg0MSBzaGlmdCAgc05hTiAtSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NDIgc2hpZnQgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODQzIHNoaWZ0ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg0NCBzaGlmdCAgc05hTiAtMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NDUgc2hpZnQgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODQ2IHNoaWZ0ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg0NyBzaGlmdCAgc05hTiAgMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NDggc2hpZnQgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODQ5IHNoaWZ0ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg1MCBzaGlmdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NTEgc2hpZnQgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODUyIHNoaWZ0IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg1MyBzaGlmdCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NTQgc2hpZnQgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODU1IHNoaWZ0ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg1NiBzaGlmdCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NTcgc2hpZnQgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzaGl4ODU4IHNoaWZ0ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg1OSBzaGlmdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworc2hpeDg2MSBzaGlmdCAgTmFOMSAgIC1JbmYgICAgLT4gIE5hTjEKK3NoaXg4NjIgc2hpZnQgK05hTjIgICAtMTAwMCAgIC0+ICBOYU4yCitzaGl4ODYzIHNoaWZ0ICBOYU4zICAgIDEwMDAgICAtPiAgTmFOMworc2hpeDg2NCBzaGlmdCAgTmFONCAgICBJbmYgICAgLT4gIE5hTjQKK3NoaXg4NjUgc2hpZnQgIE5hTjUgICArTmFONiAgIC0+ICBOYU41CitzaGl4ODY2IHNoaWZ0IC1JbmYgICAgIE5hTjcgICAtPiAgTmFONworc2hpeDg2NyBzaGlmdCAtMTAwMCAgICBOYU44ICAgLT4gIE5hTjgKK3NoaXg4Njggc2hpZnQgIDEwMDAgICAgTmFOOSAgIC0+ICBOYU45CitzaGl4ODY5IHNoaWZ0ICBJbmYgICAgK05hTjEwICAtPiAgTmFOMTAKK3NoaXg4NzEgc2hpZnQgIHNOYU4xMSAgLUluZiAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NzIgc2hpZnQgIHNOYU4xMiAgLTEwMDAgIC0+ICBOYU4xMiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NzMgc2hpZnQgIHNOYU4xMyAgIDEwMDAgIC0+ICBOYU4xMyAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NzQgc2hpZnQgIHNOYU4xNCAgIE5hTjE3IC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NzUgc2hpZnQgIHNOYU4xNSAgc05hTjE4IC0+ICBOYU4xNSAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4NzYgc2hpZnQgIE5hTjE2ICAgc05hTjE5IC0+ICBOYU4xOSAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4Nzcgc2hpZnQgLUluZiAgICArc05hTjIwIC0+ICBOYU4yMCAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4Nzggc2hpZnQgLTEwMDAgICAgc05hTjIxIC0+ICBOYU4yMSAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4Nzkgc2hpZnQgIDEwMDAgICAgc05hTjIyIC0+ICBOYU4yMiAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4ODAgc2hpZnQgIEluZiAgICAgc05hTjIzIC0+ICBOYU4yMyAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4ODEgc2hpZnQgK05hTjI1ICArc05hTjI0IC0+ICBOYU4yNCAgSW52YWxpZF9vcGVyYXRpb24KK3NoaXg4ODIgc2hpZnQgLU5hTjI2ICAgIE5hTjI4IC0+IC1OYU4yNgorc2hpeDg4MyBzaGlmdCAtc05hTjI3ICBzTmFOMjkgLT4gLU5hTjI3ICBJbnZhbGlkX29wZXJhdGlvbgorc2hpeDg4NCBzaGlmdCAgMTAwMCAgICAtTmFOMzAgLT4gLU5hTjMwCitzaGl4ODg1IHNoaWZ0ICAxMDAwICAgLXNOYU4zMSAtPiAtTmFOMzEgIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NxdWFyZXJvb3QuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc3F1YXJlcm9vdC5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGU1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3NxdWFyZXJvb3QuZGVjVGVzdApAQCAtMCwwICsxLDM4MzQgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gc3F1YXJlcm9vdC5kZWNUZXN0IC0tIGRlY2ltYWwgc3F1YXJlIHJvb3QgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBDb3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiwgMjAwMywgMjAwOC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gUGxlYXNlIHNlZSB0aGUgZG9jdW1lbnQgIkdlbmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFRlc3RjYXNlcyIgICAgIC0tCistLSBhdCBodHRwOi8vd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbCBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mICAgICAgLS0KKy0tIHRoZXNlIHRlc3RjYXNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBUaGVzZSB0ZXN0Y2FzZXMgYXJlIGV4cGVyaW1lbnRhbCAoJ2JldGEnIHZlcnNpb25zKSwgYW5kIHRoZXkgICAgICAgLS0KKy0tIG1heSBjb250YWluIGVycm9ycy4gIFRoZXkgYXJlIG9mZmVyZWQgb24gYW4gYXMtaXMgYmFzaXMuICBJbiAgICAgICAtLQorLS0gcGFydGljdWxhciwgYWNoaWV2aW5nIHRoZSBzYW1lIHJlc3VsdHMgYXMgdGhlIHRlc3RzIGhlcmUgaXMgbm90ICAgIC0tCistLSBhIGd1YXJhbnRlZSB0aGF0IGFuIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggYW55IFN0YW5kYXJkICAgICAgLS0KKy0tIG9yIHNwZWNpZmljYXRpb24uICBUaGUgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgICAgICAgICAgICAgICAgICAtLQorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSBQbGVhc2Ugc2VuZCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBjb3JyZWN0aW9ucyB0byB0aGUgYXV0aG9yOiAgLS0KKy0tICAgTWlrZSBDb3dsaXNoYXcsIElCTSBGZWxsb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gICBJQk0gVUssIFBPIEJveCAzMSwgQmlybWluZ2hhbSBSb2FkLCBXYXJ3aWNrIENWMzQgNUpMLCBVSyAgICAgICAgIC0tCistLSAgIG1mY0B1ay5pYm0uY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordmVyc2lvbjogMi41OQorCitleHRlbmRlZDogICAgMQorcHJlY2lzaW9uOiAgIDkKK3JvdW5kaW5nOiAgICBoYWxmX3VwCittYXhFeHBvbmVudDogMzg0CittaW5leHBvbmVudDogLTM4MworCistLSBiYXNpY3MKK3NxdHgwMDEgc3F1YXJlcm9vdCAxICAgICAgIC0+IDEKK3NxdHgwMDIgc3F1YXJlcm9vdCAtMSAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDAwMyBzcXVhcmVyb290IDEuMDAgICAgLT4gMS4wCitzcXR4MDA0IHNxdWFyZXJvb3QgLTEuMDAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwMDUgc3F1YXJlcm9vdCAwICAgICAgIC0+IDAKK3NxdHgwMDYgc3F1YXJlcm9vdCAwMC4wICAgIC0+IDAuMAorc3F0eDAwNyBzcXVhcmVyb290IDAuMDAgICAgLT4gMC4wCitzcXR4MDA4IHNxdWFyZXJvb3QgMDAuMDAgICAtPiAwLjAKK3NxdHgwMDkgc3F1YXJlcm9vdCAwMC4wMDAgIC0+IDAuMDAKK3NxdHgwMTAgc3F1YXJlcm9vdCAwMC4wMDAwIC0+IDAuMDAKK3NxdHgwMTEgc3F1YXJlcm9vdCAwMCAgICAgIC0+IDAKKworc3F0eDAxMiBzcXVhcmVyb290IC0yICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDEzIHNxdWFyZXJvb3QgMiAgICAgICAtPiAxLjQxNDIxMzU2IEluZXhhY3QgUm91bmRlZAorc3F0eDAxNCBzcXVhcmVyb290IC0yLjAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDE1IHNxdWFyZXJvb3QgMi4wMCAgICAtPiAxLjQxNDIxMzU2IEluZXhhY3QgUm91bmRlZAorc3F0eDAxNiBzcXVhcmVyb290IC0wICAgICAgLT4gLTAKK3NxdHgwMTcgc3F1YXJlcm9vdCAtMC4wICAgIC0+IC0wLjAKK3NxdHgwMTggc3F1YXJlcm9vdCAtMDAuMDAgIC0+IC0wLjAKK3NxdHgwMTkgc3F1YXJlcm9vdCAtMDAuMDAwIC0+IC0wLjAwCitzcXR4MDIwIHNxdWFyZXJvb3QgLTAuMDAwMCAtPiAtMC4wMAorc3F0eDAyMSBzcXVhcmVyb290IC0wRSs5ICAgLT4gLTBFKzQKK3NxdHgwMjIgc3F1YXJlcm9vdCAtMEUrMTAgIC0+IC0wRSs1CitzcXR4MDIzIHNxdWFyZXJvb3QgLTBFKzExICAtPiAtMEUrNQorc3F0eDAyNCBzcXVhcmVyb290IC0wRSsxMiAgLT4gLTBFKzYKK3NxdHgwMjUgc3F1YXJlcm9vdCAtMDAgICAgIC0+IC0wCitzcXR4MDI2IHNxdWFyZXJvb3QgMEUrNSAgICAtPiAwRSsyCitzcXR4MDI3IHNxdWFyZXJvb3QgNC4wICAgICAtPiAyLjAKK3NxdHgwMjggc3F1YXJlcm9vdCA0LjAwICAgIC0+IDIuMAorCitzcXR4MDMwIHNxdWFyZXJvb3QgKzAuMSAgICAgICAgICAgIC0+IDAuMzE2MjI3NzY2IEluZXhhY3QgUm91bmRlZAorc3F0eDAzMSBzcXVhcmVyb290IC0wLjEgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwMzIgc3F1YXJlcm9vdCArMC4wMSAgICAgICAgICAgLT4gMC4xCitzcXR4MDMzIHNxdWFyZXJvb3QgLTAuMDEgICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDAzNCBzcXVhcmVyb290ICswLjAwMSAgICAgICAgICAtPiAwLjAzMTYyMjc3NjYgSW5leGFjdCBSb3VuZGVkCitzcXR4MDM1IHNxdWFyZXJvb3QgLTAuMDAxICAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDAzNiBzcXVhcmVyb290ICswLjAwMDAwMSAgICAgICAtPiAwLjAwMQorc3F0eDAzNyBzcXVhcmVyb290IC0wLjAwMDAwMSAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwMzggc3F1YXJlcm9vdCArMC4wMDAwMDAwMDAwMDEgLT4gMC4wMDAwMDEKK3NxdHgwMzkgc3F1YXJlcm9vdCAtMC4wMDAwMDAwMDAwMDEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3NxdHgwNDEgc3F1YXJlcm9vdCAxLjEgICAgICAgIC0+IDEuMDQ4ODA4ODUgSW5leGFjdCBSb3VuZGVkCitzcXR4MDQyIHNxdWFyZXJvb3QgMS4xMCAgICAgICAtPiAxLjA0ODgwODg1IEluZXhhY3QgUm91bmRlZAorc3F0eDA0MyBzcXVhcmVyb290IDEuMTAwICAgICAgLT4gMS4wNDg4MDg4NSBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNDQgc3F1YXJlcm9vdCAxLjExMCAgICAgIC0+IDEuMDUzNTY1MzggSW5leGFjdCBSb3VuZGVkCitzcXR4MDQ1IHNxdWFyZXJvb3QgLTEuMSAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNDYgc3F1YXJlcm9vdCAtMS4xMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA0NyBzcXVhcmVyb290IC0xLjEwMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDQ4IHNxdWFyZXJvb3QgLTEuMTEwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNDkgc3F1YXJlcm9vdCA5LjkgICAgICAgIC0+IDMuMTQ2NDI2NTQgSW5leGFjdCBSb3VuZGVkCitzcXR4MDUwIHNxdWFyZXJvb3QgOS45MCAgICAgICAtPiAzLjE0NjQyNjU0IEluZXhhY3QgUm91bmRlZAorc3F0eDA1MSBzcXVhcmVyb290IDkuOTAwICAgICAgLT4gMy4xNDY0MjY1NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNTIgc3F1YXJlcm9vdCA5Ljk5MCAgICAgIC0+IDMuMTYwNjk2MTMgSW5leGFjdCBSb3VuZGVkCitzcXR4MDUzIHNxdWFyZXJvb3QgLTkuOSAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNTQgc3F1YXJlcm9vdCAtOS45MCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA1NSBzcXVhcmVyb290IC05LjkwMCAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDU2IHNxdWFyZXJvb3QgLTkuOTkwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworc3F0eDA2MCBzcXVhcmVyb290ICAxICAgICAgICAgICAtPiAxCitzcXR4MDYxIHNxdWFyZXJvb3QgIDEuMCAgICAgICAgIC0+IDEuMAorc3F0eDA2MiBzcXVhcmVyb290ICAxLjAwICAgICAgICAtPiAxLjAKK3NxdHgwNjMgc3F1YXJlcm9vdCAgMTAuMCAgICAgICAgLT4gMy4xNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNjQgc3F1YXJlcm9vdCAgMTAuMCAgICAgICAgLT4gMy4xNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNjUgc3F1YXJlcm9vdCAgMTAuMCAgICAgICAgLT4gMy4xNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNjYgc3F1YXJlcm9vdCAgMTAuMDAgICAgICAgLT4gMy4xNjIyNzc2NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHgwNjcgc3F1YXJlcm9vdCAgMTAwICAgICAgICAgLT4gMTAKK3NxdHgwNjggc3F1YXJlcm9vdCAgMTAwLjAgICAgICAgLT4gMTAuMAorc3F0eDA2OSBzcXVhcmVyb290ICAxMDAuMDAgICAgICAtPiAxMC4wCitzcXR4MDcwIHNxdWFyZXJvb3QgIDEuMTAwMEUrMyAgIC0+IDMzLjE2NjI0NzkgSW5leGFjdCBSb3VuZGVkCitzcXR4MDcxIHNxdWFyZXJvb3QgIDEuMTAwMDBFKzMgIC0+IDMzLjE2NjI0NzkgSW5leGFjdCBSb3VuZGVkCitzcXR4MDcyIHNxdWFyZXJvb3QgLTEwLjAgICAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA3MyBzcXVhcmVyb290IC0xMC4wMCAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNzQgc3F1YXJlcm9vdCAtMTAwLjAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDc1IHNxdWFyZXJvb3QgLTEwMC4wMCAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDA3NiBzcXVhcmVyb290IC0xLjEwMDBFKzMgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3NxdHgwNzcgc3F1YXJlcm9vdCAtMS4xMDAwMEUrMyAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4MDc4IHNxdWFyZXJvb3QgIDEuMDAwICAgICAgIC0+IDEuMDAKK3NxdHgwNzkgc3F1YXJlcm9vdCAgMS4wMDAwICAgICAgLT4gMS4wMAorCistLSBmYW1vdXMgc3F1YXJlcworc3F0eDA4MCBzcXVhcmVyb290ICAgICAxICAtPiAxCitzcXR4MDgxIHNxdWFyZXJvb3QgICAgIDQgIC0+IDIKK3NxdHgwODIgc3F1YXJlcm9vdCAgICAgOSAgLT4gMworc3F0eDA4MyBzcXVhcmVyb290ICAgIDE2ICAtPiA0CitzcXR4MDg0IHNxdWFyZXJvb3QgICAgMjUgIC0+IDUKK3NxdHgwODUgc3F1YXJlcm9vdCAgICAzNiAgLT4gNgorc3F0eDA4NiBzcXVhcmVyb290ICAgIDQ5ICAtPiA3CitzcXR4MDg3IHNxdWFyZXJvb3QgICAgNjQgIC0+IDgKK3NxdHgwODggc3F1YXJlcm9vdCAgICA4MSAgLT4gOQorc3F0eDA4OSBzcXVhcmVyb290ICAgMTAwICAtPiAxMAorc3F0eDA5MCBzcXVhcmVyb290ICAgMTIxICAtPiAxMQorc3F0eDA5MSBzcXVhcmVyb290ICAgMTQ0ICAtPiAxMgorc3F0eDA5MiBzcXVhcmVyb290ICAgMTY5ICAtPiAxMworc3F0eDA5MyBzcXVhcmVyb290ICAgMjU2ICAtPiAxNgorc3F0eDA5NCBzcXVhcmVyb290ICAxMDI0ICAtPiAzMgorc3F0eDA5NSBzcXVhcmVyb290ICA0MDk2ICAtPiA2NAorc3F0eDEwMCBzcXVhcmVyb290ICAgMC4wMSAtPiAwLjEKK3NxdHgxMDEgc3F1YXJlcm9vdCAgIDAuMDQgLT4gMC4yCitzcXR4MTAyIHNxdWFyZXJvb3QgICAwLjA5IC0+IDAuMworc3F0eDEwMyBzcXVhcmVyb290ICAgMC4xNiAtPiAwLjQKK3NxdHgxMDQgc3F1YXJlcm9vdCAgIDAuMjUgLT4gMC41CitzcXR4MTA1IHNxdWFyZXJvb3QgICAwLjM2IC0+IDAuNgorc3F0eDEwNiBzcXVhcmVyb290ICAgMC40OSAtPiAwLjcKK3NxdHgxMDcgc3F1YXJlcm9vdCAgIDAuNjQgLT4gMC44CitzcXR4MTA4IHNxdWFyZXJvb3QgICAwLjgxIC0+IDAuOQorc3F0eDEwOSBzcXVhcmVyb290ICAgMS4wMCAtPiAxLjAKK3NxdHgxMTAgc3F1YXJlcm9vdCAgIDEuMjEgLT4gMS4xCitzcXR4MTExIHNxdWFyZXJvb3QgICAxLjQ0IC0+IDEuMgorc3F0eDExMiBzcXVhcmVyb290ICAgMS42OSAtPiAxLjMKK3NxdHgxMTMgc3F1YXJlcm9vdCAgIDIuNTYgLT4gMS42CitzcXR4MTE0IHNxdWFyZXJvb3QgIDEwLjI0IC0+IDMuMgorc3F0eDExNSBzcXVhcmVyb290ICA0MC45NiAtPiA2LjQKKworLS0gUHJlY2lzaW9uIDEgc3F1YXJlcm9vdCB0ZXN0cyBbZXhoYXVzdGl2ZSwgcGx1cyBleHBvbmVudCBhZGp1c3RzXQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogICAxCitzcXR4MTIwMSBzcXVhcmVyb290IDAuMSAtPiAwLjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMDIgc3F1YXJlcm9vdCAwLjAxIC0+IDAuMQorc3F0eDEyMDMgc3F1YXJlcm9vdCAxLjBFLTEgLT4gMC4zICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjA0IHNxdWFyZXJvb3QgMS4wMEUtMiAtPiAwLjEgIFJvdW5kZWQKK3NxdHgxMjA1IHNxdWFyZXJvb3QgMUUtMyAtPiAwLjAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjA2IHNxdWFyZXJvb3QgMUUrMSAtPiAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjA3IHNxdWFyZXJvb3QgMUUrMiAtPiAxRSsxCitzcXR4MTIwOCBzcXVhcmVyb290IDFFKzMgLT4gM0UrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIwOSBzcXVhcmVyb290IDAuMiAtPiAwLjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMTAgc3F1YXJlcm9vdCAwLjAyIC0+IDAuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxMSBzcXVhcmVyb290IDIuMEUtMSAtPiAwLjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMTIgc3F1YXJlcm9vdCAyLjAwRS0yIC0+IDAuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxMyBzcXVhcmVyb290IDJFLTMgLT4gMC4wNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxNCBzcXVhcmVyb290IDJFKzEgLT4gNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxNSBzcXVhcmVyb290IDJFKzIgLT4gMUUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxNiBzcXVhcmVyb290IDJFKzMgLT4gNEUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxNyBzcXVhcmVyb290IDAuMyAtPiAwLjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMTggc3F1YXJlcm9vdCAwLjAzIC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIxOSBzcXVhcmVyb290IDMuMEUtMSAtPiAwLjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMjAgc3F1YXJlcm9vdCAzLjAwRS0yIC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIyMSBzcXVhcmVyb290IDNFLTMgLT4gMC4wNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIyMiBzcXVhcmVyb290IDNFKzEgLT4gNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIyMyBzcXVhcmVyb290IDNFKzIgLT4gMkUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIyNCBzcXVhcmVyb290IDNFKzMgLT4gNUUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIyNSBzcXVhcmVyb290IDAuNCAtPiAwLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMjYgc3F1YXJlcm9vdCAwLjA0IC0+IDAuMgorc3F0eDEyMjcgc3F1YXJlcm9vdCA0LjBFLTEgLT4gMC42ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjI4IHNxdWFyZXJvb3QgNC4wMEUtMiAtPiAwLjIgIFJvdW5kZWQKK3NxdHgxMjI5IHNxdWFyZXJvb3QgNEUtMyAtPiAwLjA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjMwIHNxdWFyZXJvb3QgNEUrMSAtPiA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjMxIHNxdWFyZXJvb3QgNEUrMiAtPiAyRSsxCitzcXR4MTIzMiBzcXVhcmVyb290IDRFKzMgLT4gNkUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIzMyBzcXVhcmVyb290IDAuNSAtPiAwLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMzQgc3F1YXJlcm9vdCAwLjA1IC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIzNSBzcXVhcmVyb290IDUuMEUtMSAtPiAwLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyMzYgc3F1YXJlcm9vdCA1LjAwRS0yIC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIzNyBzcXVhcmVyb290IDVFLTMgLT4gMC4wNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIzOCBzcXVhcmVyb290IDVFKzEgLT4gNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTIzOSBzcXVhcmVyb290IDVFKzIgLT4gMkUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0MCBzcXVhcmVyb290IDVFKzMgLT4gN0UrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0MSBzcXVhcmVyb290IDAuNiAtPiAwLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNDIgc3F1YXJlcm9vdCAwLjA2IC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0MyBzcXVhcmVyb290IDYuMEUtMSAtPiAwLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNDQgc3F1YXJlcm9vdCA2LjAwRS0yIC0+IDAuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0NSBzcXVhcmVyb290IDZFLTMgLT4gMC4wOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0NiBzcXVhcmVyb290IDZFKzEgLT4gOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0NyBzcXVhcmVyb290IDZFKzIgLT4gMkUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0OCBzcXVhcmVyb290IDZFKzMgLT4gOEUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI0OSBzcXVhcmVyb290IDAuNyAtPiAwLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNTAgc3F1YXJlcm9vdCAwLjA3IC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1MSBzcXVhcmVyb290IDcuMEUtMSAtPiAwLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNTIgc3F1YXJlcm9vdCA3LjAwRS0yIC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1MyBzcXVhcmVyb290IDdFLTMgLT4gMC4wOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1NCBzcXVhcmVyb290IDdFKzEgLT4gOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1NSBzcXVhcmVyb290IDdFKzIgLT4gM0UrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1NiBzcXVhcmVyb290IDdFKzMgLT4gOEUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1NyBzcXVhcmVyb290IDAuOCAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNTggc3F1YXJlcm9vdCAwLjA4IC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI1OSBzcXVhcmVyb290IDguMEUtMSAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNjAgc3F1YXJlcm9vdCA4LjAwRS0yIC0+IDAuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI2MSBzcXVhcmVyb290IDhFLTMgLT4gMC4wOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI2MiBzcXVhcmVyb290IDhFKzEgLT4gOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI2MyBzcXVhcmVyb290IDhFKzIgLT4gM0UrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI2NCBzcXVhcmVyb290IDhFKzMgLT4gOUUrMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MTI2NSBzcXVhcmVyb290IDAuOSAtPiAwLjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDEyNjYgc3F1YXJlcm9vdCAwLjA5IC0+IDAuMworc3F0eDEyNjcgc3F1YXJlcm9vdCA5LjBFLTEgLT4gMC45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjY4IHNxdWFyZXJvb3QgOS4wMEUtMiAtPiAwLjMgIFJvdW5kZWQKK3NxdHgxMjY5IHNxdWFyZXJvb3QgOUUtMyAtPiAwLjA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjcwIHNxdWFyZXJvb3QgOUUrMSAtPiA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgxMjcxIHNxdWFyZXJvb3QgOUUrMiAtPiAzRSsxCitzcXR4MTI3MiBzcXVhcmVyb290IDlFKzMgLT4gOUUrMSAgSW5leGFjdCBSb3VuZGVkCisKKy0tIFByZWNpc2lvbiAyIHNxdWFyZXJvb3QgdGVzdHMgW2V4aGF1c3RpdmUsIHBsdXMgZXhwb25lbnQgYWRqdXN0c10KK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246ICAgMgorc3F0eDIyMDEgc3F1YXJlcm9vdCAwLjEgLT4gMC4zMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIwMiBzcXVhcmVyb290IDAuMDEgLT4gMC4xCitzcXR4MjIwMyBzcXVhcmVyb290IDEuMEUtMSAtPiAwLjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjA0IHNxdWFyZXJvb3QgMS4wMEUtMiAtPiAwLjEwCitzcXR4MjIwNSBzcXVhcmVyb290IDFFLTMgLT4gMC4wMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMDYgc3F1YXJlcm9vdCAxRSsxIC0+IDMuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIwNyBzcXVhcmVyb290IDFFKzIgLT4gMUUrMQorc3F0eDIyMDggc3F1YXJlcm9vdCAxRSszIC0+IDMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjA5IHNxdWFyZXJvb3QgMC4yIC0+IDAuNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMTAgc3F1YXJlcm9vdCAwLjAyIC0+IDAuMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMTEgc3F1YXJlcm9vdCAyLjBFLTEgLT4gMC40NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxMiBzcXVhcmVyb290IDIuMDBFLTIgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxMyBzcXVhcmVyb290IDJFLTMgLT4gMC4wNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMTQgc3F1YXJlcm9vdCAyRSsxIC0+IDQuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIxNSBzcXVhcmVyb290IDJFKzIgLT4gMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMTYgc3F1YXJlcm9vdCAyRSszIC0+IDQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjE3IHNxdWFyZXJvb3QgMC4zIC0+IDAuNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMTggc3F1YXJlcm9vdCAwLjAzIC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMTkgc3F1YXJlcm9vdCAzLjBFLTEgLT4gMC41NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIyMCBzcXVhcmVyb290IDMuMDBFLTIgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIyMSBzcXVhcmVyb290IDNFLTMgLT4gMC4wNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMjIgc3F1YXJlcm9vdCAzRSsxIC0+IDUuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIyMyBzcXVhcmVyb290IDNFKzIgLT4gMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMjQgc3F1YXJlcm9vdCAzRSszIC0+IDU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjI1IHNxdWFyZXJvb3QgMC40IC0+IDAuNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMjYgc3F1YXJlcm9vdCAwLjA0IC0+IDAuMgorc3F0eDIyMjcgc3F1YXJlcm9vdCA0LjBFLTEgLT4gMC42MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIyOCBzcXVhcmVyb290IDQuMDBFLTIgLT4gMC4yMAorc3F0eDIyMjkgc3F1YXJlcm9vdCA0RS0zIC0+IDAuMDYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjMwIHNxdWFyZXJvb3QgNEUrMSAtPiA2LjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzEgc3F1YXJlcm9vdCA0RSsyIC0+IDJFKzEKK3NxdHgyMjMyIHNxdWFyZXJvb3QgNEUrMyAtPiA2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjIzMyBzcXVhcmVyb290IDAuNSAtPiAwLjcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjM0IHNxdWFyZXJvb3QgMC4wNSAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjM1IHNxdWFyZXJvb3QgNS4wRS0xIC0+IDAuNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzYgc3F1YXJlcm9vdCA1LjAwRS0yIC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzcgc3F1YXJlcm9vdCA1RS0zIC0+IDAuMDcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjM4IHNxdWFyZXJvb3QgNUUrMSAtPiA3LjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyMzkgc3F1YXJlcm9vdCA1RSsyIC0+IDIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjQwIHNxdWFyZXJvb3QgNUUrMyAtPiA3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI0MSBzcXVhcmVyb290IDAuNiAtPiAwLjc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjQyIHNxdWFyZXJvb3QgMC4wNiAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjQzIHNxdWFyZXJvb3QgNi4wRS0xIC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDQgc3F1YXJlcm9vdCA2LjAwRS0yIC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDUgc3F1YXJlcm9vdCA2RS0zIC0+IDAuMDc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjQ2IHNxdWFyZXJvb3QgNkUrMSAtPiA3LjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNDcgc3F1YXJlcm9vdCA2RSsyIC0+IDI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjQ4IHNxdWFyZXJvb3QgNkUrMyAtPiA3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI0OSBzcXVhcmVyb290IDAuNyAtPiAwLjg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjUwIHNxdWFyZXJvb3QgMC4wNyAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjUxIHNxdWFyZXJvb3QgNy4wRS0xIC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTIgc3F1YXJlcm9vdCA3LjAwRS0yIC0+IDAuMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTMgc3F1YXJlcm9vdCA3RS0zIC0+IDAuMDg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjU0IHNxdWFyZXJvb3QgN0UrMSAtPiA4LjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNTUgc3F1YXJlcm9vdCA3RSsyIC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjU2IHNxdWFyZXJvb3QgN0UrMyAtPiA4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI1NyBzcXVhcmVyb290IDAuOCAtPiAwLjg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjU4IHNxdWFyZXJvb3QgMC4wOCAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjU5IHNxdWFyZXJvb3QgOC4wRS0xIC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNjAgc3F1YXJlcm9vdCA4LjAwRS0yIC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNjEgc3F1YXJlcm9vdCA4RS0zIC0+IDAuMDg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjYyIHNxdWFyZXJvb3QgOEUrMSAtPiA4LjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNjMgc3F1YXJlcm9vdCA4RSsyIC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjY0IHNxdWFyZXJvb3QgOEUrMyAtPiA4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI2NSBzcXVhcmVyb290IDAuOSAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjY2IHNxdWFyZXJvb3QgMC4wOSAtPiAwLjMKK3NxdHgyMjY3IHNxdWFyZXJvb3QgOS4wRS0xIC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNjggc3F1YXJlcm9vdCA5LjAwRS0yIC0+IDAuMzAKK3NxdHgyMjY5IHNxdWFyZXJvb3QgOUUtMyAtPiAwLjA5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI3MCBzcXVhcmVyb290IDlFKzEgLT4gOS41ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjcxIHNxdWFyZXJvb3QgOUUrMiAtPiAzRSsxCitzcXR4MjI3MiBzcXVhcmVyb290IDlFKzMgLT4gOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNzMgc3F1YXJlcm9vdCAwLjEwIC0+IDAuMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNzQgc3F1YXJlcm9vdCAwLjAxMCAtPiAwLjEwCitzcXR4MjI3NSBzcXVhcmVyb290IDEwLjBFLTEgLT4gMS4wCitzcXR4MjI3NiBzcXVhcmVyb290IDEwLjAwRS0yIC0+IDAuMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyNzcgc3F1YXJlcm9vdCAxMEUtMyAtPiAwLjEwCitzcXR4MjI3OCBzcXVhcmVyb290IDEwRSsxIC0+IDEwCitzcXR4MjI3OSBzcXVhcmVyb290IDEwRSsyIC0+IDMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjgwIHNxdWFyZXJvb3QgMTBFKzMgLT4gMS4wRSsyCitzcXR4MjI4MSBzcXVhcmVyb290IDAuMTEgLT4gMC4zMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI4MiBzcXVhcmVyb290IDAuMDExIC0+IDAuMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyODMgc3F1YXJlcm9vdCAxMS4wRS0xIC0+IDEuMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI4NCBzcXVhcmVyb290IDExLjAwRS0yIC0+IDAuMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyODUgc3F1YXJlcm9vdCAxMUUtMyAtPiAwLjEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjg2IHNxdWFyZXJvb3QgMTFFKzEgLT4gMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyODcgc3F1YXJlcm9vdCAxMUUrMiAtPiAzMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI4OCBzcXVhcmVyb290IDExRSszIC0+IDEuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI4OSBzcXVhcmVyb290IDAuMTIgLT4gMC4zNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5MCBzcXVhcmVyb290IDAuMDEyIC0+IDAuMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyOTEgc3F1YXJlcm9vdCAxMi4wRS0xIC0+IDEuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5MiBzcXVhcmVyb290IDEyLjAwRS0yIC0+IDAuMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyOTMgc3F1YXJlcm9vdCAxMkUtMyAtPiAwLjExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMjk0IHNxdWFyZXJvb3QgMTJFKzEgLT4gMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyOTUgc3F1YXJlcm9vdCAxMkUrMiAtPiAzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5NiBzcXVhcmVyb290IDEyRSszIC0+IDEuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5NyBzcXVhcmVyb290IDAuMTMgLT4gMC4zNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjI5OCBzcXVhcmVyb290IDAuMDEzIC0+IDAuMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIyOTkgc3F1YXJlcm9vdCAxMy4wRS0xIC0+IDEuMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwMCBzcXVhcmVyb290IDEzLjAwRS0yIC0+IDAuMzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMDEgc3F1YXJlcm9vdCAxM0UtMyAtPiAwLjExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzAyIHNxdWFyZXJvb3QgMTNFKzEgLT4gMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMDMgc3F1YXJlcm9vdCAxM0UrMiAtPiAzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwNCBzcXVhcmVyb290IDEzRSszIC0+IDEuMUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwNSBzcXVhcmVyb290IDAuMTQgLT4gMC4zNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwNiBzcXVhcmVyb290IDAuMDE0IC0+IDAuMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMDcgc3F1YXJlcm9vdCAxNC4wRS0xIC0+IDEuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMwOCBzcXVhcmVyb290IDE0LjAwRS0yIC0+IDAuMzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMDkgc3F1YXJlcm9vdCAxNEUtMyAtPiAwLjEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzEwIHNxdWFyZXJvb3QgMTRFKzEgLT4gMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMTEgc3F1YXJlcm9vdCAxNEUrMiAtPiAzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxMiBzcXVhcmVyb290IDE0RSszIC0+IDEuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxMyBzcXVhcmVyb290IDAuMTUgLT4gMC4zOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxNCBzcXVhcmVyb290IDAuMDE1IC0+IDAuMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMTUgc3F1YXJlcm9vdCAxNS4wRS0xIC0+IDEuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMxNiBzcXVhcmVyb290IDE1LjAwRS0yIC0+IDAuMzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMTcgc3F1YXJlcm9vdCAxNUUtMyAtPiAwLjEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzE4IHNxdWFyZXJvb3QgMTVFKzEgLT4gMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMTkgc3F1YXJlcm9vdCAxNUUrMiAtPiAzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMyMCBzcXVhcmVyb290IDE1RSszIC0+IDEuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMyMSBzcXVhcmVyb290IDAuMTYgLT4gMC40CitzcXR4MjMyMiBzcXVhcmVyb290IDAuMDE2IC0+IDAuMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMjMgc3F1YXJlcm9vdCAxNi4wRS0xIC0+IDEuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMyNCBzcXVhcmVyb290IDE2LjAwRS0yIC0+IDAuNDAKK3NxdHgyMzI1IHNxdWFyZXJvb3QgMTZFLTMgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMyNiBzcXVhcmVyb290IDE2RSsxIC0+IDEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzI3IHNxdWFyZXJvb3QgMTZFKzIgLT4gNEUrMQorc3F0eDIzMjggc3F1YXJlcm9vdCAxNkUrMyAtPiAxLjNFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMjkgc3F1YXJlcm9vdCAwLjE3IC0+IDAuNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzAgc3F1YXJlcm9vdCAwLjAxNyAtPiAwLjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzMxIHNxdWFyZXJvb3QgMTcuMEUtMSAtPiAxLjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzIgc3F1YXJlcm9vdCAxNy4wMEUtMiAtPiAwLjQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzMzIHNxdWFyZXJvb3QgMTdFLTMgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjMzNCBzcXVhcmVyb290IDE3RSsxIC0+IDEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzM1IHNxdWFyZXJvb3QgMTdFKzIgLT4gNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzYgc3F1YXJlcm9vdCAxN0UrMyAtPiAxLjNFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzcgc3F1YXJlcm9vdCAwLjE4IC0+IDAuNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzMzggc3F1YXJlcm9vdCAwLjAxOCAtPiAwLjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzM5IHNxdWFyZXJvb3QgMTguMEUtMSAtPiAxLjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDAgc3F1YXJlcm9vdCAxOC4wMEUtMiAtPiAwLjQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzQxIHNxdWFyZXJvb3QgMThFLTMgLT4gMC4xMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM0MiBzcXVhcmVyb290IDE4RSsxIC0+IDEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzQzIHNxdWFyZXJvb3QgMThFKzIgLT4gNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDQgc3F1YXJlcm9vdCAxOEUrMyAtPiAxLjNFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDUgc3F1YXJlcm9vdCAwLjE5IC0+IDAuNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDYgc3F1YXJlcm9vdCAwLjAxOSAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzQ3IHNxdWFyZXJvb3QgMTkuMEUtMSAtPiAxLjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNDggc3F1YXJlcm9vdCAxOS4wMEUtMiAtPiAwLjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzQ5IHNxdWFyZXJvb3QgMTlFLTMgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM1MCBzcXVhcmVyb290IDE5RSsxIC0+IDE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzUxIHNxdWFyZXJvb3QgMTlFKzIgLT4gNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTIgc3F1YXJlcm9vdCAxOUUrMyAtPiAxLjRFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTMgc3F1YXJlcm9vdCAwLjIwIC0+IDAuNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTQgc3F1YXJlcm9vdCAwLjAyMCAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzU1IHNxdWFyZXJvb3QgMjAuMEUtMSAtPiAxLjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNTYgc3F1YXJlcm9vdCAyMC4wMEUtMiAtPiAwLjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzU3IHNxdWFyZXJvb3QgMjBFLTMgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM1OCBzcXVhcmVyb290IDIwRSsxIC0+IDE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzU5IHNxdWFyZXJvb3QgMjBFKzIgLT4gNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjAgc3F1YXJlcm9vdCAyMEUrMyAtPiAxLjRFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjEgc3F1YXJlcm9vdCAwLjIxIC0+IDAuNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjIgc3F1YXJlcm9vdCAwLjAyMSAtPiAwLjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzYzIHNxdWFyZXJvb3QgMjEuMEUtMSAtPiAxLjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjQgc3F1YXJlcm9vdCAyMS4wMEUtMiAtPiAwLjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzY1IHNxdWFyZXJvb3QgMjFFLTMgLT4gMC4xNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM2NiBzcXVhcmVyb290IDIxRSsxIC0+IDE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzY3IHNxdWFyZXJvb3QgMjFFKzIgLT4gNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjggc3F1YXJlcm9vdCAyMUUrMyAtPiAxLjRFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNjkgc3F1YXJlcm9vdCAwLjIyIC0+IDAuNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzAgc3F1YXJlcm9vdCAwLjAyMiAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzcxIHNxdWFyZXJvb3QgMjIuMEUtMSAtPiAxLjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzIgc3F1YXJlcm9vdCAyMi4wMEUtMiAtPiAwLjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzczIHNxdWFyZXJvb3QgMjJFLTMgLT4gMC4xNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM3NCBzcXVhcmVyb290IDIyRSsxIC0+IDE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzc1IHNxdWFyZXJvb3QgMjJFKzIgLT4gNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzYgc3F1YXJlcm9vdCAyMkUrMyAtPiAxLjVFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzcgc3F1YXJlcm9vdCAwLjIzIC0+IDAuNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDIzNzggc3F1YXJlcm9vdCAwLjAyMyAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzc5IHNxdWFyZXJvb3QgMjMuMEUtMSAtPiAxLjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODAgc3F1YXJlcm9vdCAyMy4wMEUtMiAtPiAwLjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzgxIHNxdWFyZXJvb3QgMjNFLTMgLT4gMC4xNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM4MiBzcXVhcmVyb290IDIzRSsxIC0+IDE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzgzIHNxdWFyZXJvb3QgMjNFKzIgLT4gNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODQgc3F1YXJlcm9vdCAyM0UrMyAtPiAxLjVFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODUgc3F1YXJlcm9vdCAwLjI0IC0+IDAuNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODYgc3F1YXJlcm9vdCAwLjAyNCAtPiAwLjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzg3IHNxdWFyZXJvb3QgMjQuMEUtMSAtPiAxLjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzODggc3F1YXJlcm9vdCAyNC4wMEUtMiAtPiAwLjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzg5IHNxdWFyZXJvb3QgMjRFLTMgLT4gMC4xNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM5MCBzcXVhcmVyb290IDI0RSsxIC0+IDE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzkxIHNxdWFyZXJvb3QgMjRFKzIgLT4gNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzOTIgc3F1YXJlcm9vdCAyNEUrMyAtPiAxLjVFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzOTMgc3F1YXJlcm9vdCAwLjI1IC0+IDAuNQorc3F0eDIzOTQgc3F1YXJlcm9vdCAwLjAyNSAtPiAwLjE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyMzk1IHNxdWFyZXJvb3QgMjUuMEUtMSAtPiAxLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzOTYgc3F1YXJlcm9vdCAyNS4wMEUtMiAtPiAwLjUwCitzcXR4MjM5NyBzcXVhcmVyb290IDI1RS0zIC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDIzOTggc3F1YXJlcm9vdCAyNUUrMSAtPiAxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjM5OSBzcXVhcmVyb290IDI1RSsyIC0+IDVFKzEKK3NxdHgyNDAwIHNxdWFyZXJvb3QgMjVFKzMgLT4gMS42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDAxIHNxdWFyZXJvb3QgMC4yNiAtPiAwLjUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDAyIHNxdWFyZXJvb3QgMC4wMjYgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQwMyBzcXVhcmVyb290IDI2LjBFLTEgLT4gMS42ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDA0IHNxdWFyZXJvb3QgMjYuMDBFLTIgLT4gMC41MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQwNSBzcXVhcmVyb290IDI2RS0zIC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MDYgc3F1YXJlcm9vdCAyNkUrMSAtPiAxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQwNyBzcXVhcmVyb290IDI2RSsyIC0+IDUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDA4IHNxdWFyZXJvb3QgMjZFKzMgLT4gMS42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDA5IHNxdWFyZXJvb3QgMC4yNyAtPiAwLjUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDEwIHNxdWFyZXJvb3QgMC4wMjcgLT4gMC4xNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQxMSBzcXVhcmVyb290IDI3LjBFLTEgLT4gMS42ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDEyIHNxdWFyZXJvb3QgMjcuMDBFLTIgLT4gMC41MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQxMyBzcXVhcmVyb290IDI3RS0zIC0+IDAuMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MTQgc3F1YXJlcm9vdCAyN0UrMSAtPiAxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQxNSBzcXVhcmVyb290IDI3RSsyIC0+IDUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDE2IHNxdWFyZXJvb3QgMjdFKzMgLT4gMS42RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDE3IHNxdWFyZXJvb3QgMC4yOCAtPiAwLjUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDE4IHNxdWFyZXJvb3QgMC4wMjggLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQxOSBzcXVhcmVyb290IDI4LjBFLTEgLT4gMS43ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDIwIHNxdWFyZXJvb3QgMjguMDBFLTIgLT4gMC41MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQyMSBzcXVhcmVyb290IDI4RS0zIC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MjIgc3F1YXJlcm9vdCAyOEUrMSAtPiAxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQyMyBzcXVhcmVyb290IDI4RSsyIC0+IDUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDI0IHNxdWFyZXJvb3QgMjhFKzMgLT4gMS43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDI1IHNxdWFyZXJvb3QgMC4yOSAtPiAwLjU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDI2IHNxdWFyZXJvb3QgMC4wMjkgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQyNyBzcXVhcmVyb290IDI5LjBFLTEgLT4gMS43ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDI4IHNxdWFyZXJvb3QgMjkuMDBFLTIgLT4gMC41NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQyOSBzcXVhcmVyb290IDI5RS0zIC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0MzAgc3F1YXJlcm9vdCAyOUUrMSAtPiAxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQzMSBzcXVhcmVyb290IDI5RSsyIC0+IDU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDMyIHNxdWFyZXJvb3QgMjlFKzMgLT4gMS43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDMzIHNxdWFyZXJvb3QgMC4zMCAtPiAwLjU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDM0IHNxdWFyZXJvb3QgMC4wMzAgLT4gMC4xNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQzNSBzcXVhcmVyb290IDMwLjBFLTEgLT4gMS43ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDM2IHNxdWFyZXJvb3QgMzAuMDBFLTIgLT4gMC41NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQzNyBzcXVhcmVyb290IDMwRS0zIC0+IDAuMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0Mzggc3F1YXJlcm9vdCAzMEUrMSAtPiAxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQzOSBzcXVhcmVyb290IDMwRSsyIC0+IDU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQwIHNxdWFyZXJvb3QgMzBFKzMgLT4gMS43RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQxIHNxdWFyZXJvb3QgMC4zMSAtPiAwLjU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQyIHNxdWFyZXJvb3QgMC4wMzEgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ0MyBzcXVhcmVyb290IDMxLjBFLTEgLT4gMS44ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQ0IHNxdWFyZXJvb3QgMzEuMDBFLTIgLT4gMC41NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ0NSBzcXVhcmVyb290IDMxRS0zIC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NDYgc3F1YXJlcm9vdCAzMUUrMSAtPiAxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ0NyBzcXVhcmVyb290IDMxRSsyIC0+IDU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQ4IHNxdWFyZXJvb3QgMzFFKzMgLT4gMS44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDQ5IHNxdWFyZXJvb3QgMC4zMiAtPiAwLjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDUwIHNxdWFyZXJvb3QgMC4wMzIgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ1MSBzcXVhcmVyb290IDMyLjBFLTEgLT4gMS44ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDUyIHNxdWFyZXJvb3QgMzIuMDBFLTIgLT4gMC41NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ1MyBzcXVhcmVyb290IDMyRS0zIC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NTQgc3F1YXJlcm9vdCAzMkUrMSAtPiAxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ1NSBzcXVhcmVyb290IDMyRSsyIC0+IDU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDU2IHNxdWFyZXJvb3QgMzJFKzMgLT4gMS44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDU3IHNxdWFyZXJvb3QgMC4zMyAtPiAwLjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDU4IHNxdWFyZXJvb3QgMC4wMzMgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ1OSBzcXVhcmVyb290IDMzLjBFLTEgLT4gMS44ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDYwIHNxdWFyZXJvb3QgMzMuMDBFLTIgLT4gMC41NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ2MSBzcXVhcmVyb290IDMzRS0zIC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NjIgc3F1YXJlcm9vdCAzM0UrMSAtPiAxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ2MyBzcXVhcmVyb290IDMzRSsyIC0+IDU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDY0IHNxdWFyZXJvb3QgMzNFKzMgLT4gMS44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDY1IHNxdWFyZXJvb3QgMC4zNCAtPiAwLjU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDY2IHNxdWFyZXJvb3QgMC4wMzQgLT4gMC4xOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ2NyBzcXVhcmVyb290IDM0LjBFLTEgLT4gMS44ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDY4IHNxdWFyZXJvb3QgMzQuMDBFLTIgLT4gMC41OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ2OSBzcXVhcmVyb290IDM0RS0zIC0+IDAuMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI0NzAgc3F1YXJlcm9vdCAzNEUrMSAtPiAxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ3MSBzcXVhcmVyb290IDM0RSsyIC0+IDU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDcyIHNxdWFyZXJvb3QgMzRFKzMgLT4gMS44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDczIHNxdWFyZXJvb3QgMC4zNSAtPiAwLjU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDc0IHNxdWFyZXJvb3QgMC4wMzUgLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ3NSBzcXVhcmVyb290IDM1LjBFLTEgLT4gMS45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDc2IHNxdWFyZXJvb3QgMzUuMDBFLTIgLT4gMC41OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ3NyBzcXVhcmVyb290IDM1RS0zIC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0Nzggc3F1YXJlcm9vdCAzNUUrMSAtPiAxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ3OSBzcXVhcmVyb290IDM1RSsyIC0+IDU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDgwIHNxdWFyZXJvb3QgMzVFKzMgLT4gMS45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDgxIHNxdWFyZXJvb3QgMC4zNiAtPiAwLjYKK3NxdHgyNDgyIHNxdWFyZXJvb3QgMC4wMzYgLT4gMC4xOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ4MyBzcXVhcmVyb290IDM2LjBFLTEgLT4gMS45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDg0IHNxdWFyZXJvb3QgMzYuMDBFLTIgLT4gMC42MAorc3F0eDI0ODUgc3F1YXJlcm9vdCAzNkUtMyAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDg2IHNxdWFyZXJvb3QgMzZFKzEgLT4gMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0ODcgc3F1YXJlcm9vdCAzNkUrMiAtPiA2RSsxCitzcXR4MjQ4OCBzcXVhcmVyb290IDM2RSszIC0+IDEuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ4OSBzcXVhcmVyb290IDAuMzcgLT4gMC42MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5MCBzcXVhcmVyb290IDAuMDM3IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0OTEgc3F1YXJlcm9vdCAzNy4wRS0xIC0+IDEuOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5MiBzcXVhcmVyb290IDM3LjAwRS0yIC0+IDAuNjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0OTMgc3F1YXJlcm9vdCAzN0UtMyAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNDk0IHNxdWFyZXJvb3QgMzdFKzEgLT4gMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0OTUgc3F1YXJlcm9vdCAzN0UrMiAtPiA2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5NiBzcXVhcmVyb290IDM3RSszIC0+IDEuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5NyBzcXVhcmVyb290IDAuMzggLT4gMC42MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjQ5OCBzcXVhcmVyb290IDAuMDM4IC0+IDAuMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI0OTkgc3F1YXJlcm9vdCAzOC4wRS0xIC0+IDEuOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwMCBzcXVhcmVyb290IDM4LjAwRS0yIC0+IDAuNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MDEgc3F1YXJlcm9vdCAzOEUtMyAtPiAwLjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTAyIHNxdWFyZXJvb3QgMzhFKzEgLT4gMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MDMgc3F1YXJlcm9vdCAzOEUrMiAtPiA2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwNCBzcXVhcmVyb290IDM4RSszIC0+IDEuOUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwNSBzcXVhcmVyb290IDAuMzkgLT4gMC42MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwNiBzcXVhcmVyb290IDAuMDM5IC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MDcgc3F1YXJlcm9vdCAzOS4wRS0xIC0+IDIuMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUwOCBzcXVhcmVyb290IDM5LjAwRS0yIC0+IDAuNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MDkgc3F1YXJlcm9vdCAzOUUtMyAtPiAwLjIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTEwIHNxdWFyZXJvb3QgMzlFKzEgLT4gMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MTEgc3F1YXJlcm9vdCAzOUUrMiAtPiA2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUxMiBzcXVhcmVyb290IDM5RSszIC0+IDIuMEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUxMyBzcXVhcmVyb290IDAuNDAgLT4gMC42MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUxNCBzcXVhcmVyb290IDAuMDQwIC0+IDAuMjAKK3NxdHgyNTE1IHNxdWFyZXJvb3QgNDAuMEUtMSAtPiAyLjAKK3NxdHgyNTE2IHNxdWFyZXJvb3QgNDAuMDBFLTIgLT4gMC42MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUxNyBzcXVhcmVyb290IDQwRS0zIC0+IDAuMjAKK3NxdHgyNTE4IHNxdWFyZXJvb3QgNDBFKzEgLT4gMjAKK3NxdHgyNTE5IHNxdWFyZXJvb3QgNDBFKzIgLT4gNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MjAgc3F1YXJlcm9vdCA0MEUrMyAtPiAyLjBFKzIKK3NxdHgyNTIxIHNxdWFyZXJvb3QgMC40MSAtPiAwLjY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTIyIHNxdWFyZXJvb3QgMC4wNDEgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUyMyBzcXVhcmVyb290IDQxLjBFLTEgLT4gMi4wICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTI0IHNxdWFyZXJvb3QgNDEuMDBFLTIgLT4gMC42NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUyNSBzcXVhcmVyb290IDQxRS0zIC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MjYgc3F1YXJlcm9vdCA0MUUrMSAtPiAyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUyNyBzcXVhcmVyb290IDQxRSsyIC0+IDY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTI4IHNxdWFyZXJvb3QgNDFFKzMgLT4gMi4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTI5IHNxdWFyZXJvb3QgMC40MiAtPiAwLjY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTMwIHNxdWFyZXJvb3QgMC4wNDIgLT4gMC4yMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUzMSBzcXVhcmVyb290IDQyLjBFLTEgLT4gMi4wICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTMyIHNxdWFyZXJvb3QgNDIuMDBFLTIgLT4gMC42NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUzMyBzcXVhcmVyb290IDQyRS0zIC0+IDAuMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1MzQgc3F1YXJlcm9vdCA0MkUrMSAtPiAyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUzNSBzcXVhcmVyb290IDQyRSsyIC0+IDY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTM2IHNxdWFyZXJvb3QgNDJFKzMgLT4gMi4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTM3IHNxdWFyZXJvb3QgMC40MyAtPiAwLjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTM4IHNxdWFyZXJvb3QgMC4wNDMgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjUzOSBzcXVhcmVyb290IDQzLjBFLTEgLT4gMi4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQwIHNxdWFyZXJvb3QgNDMuMDBFLTIgLT4gMC42NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU0MSBzcXVhcmVyb290IDQzRS0zIC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NDIgc3F1YXJlcm9vdCA0M0UrMSAtPiAyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU0MyBzcXVhcmVyb290IDQzRSsyIC0+IDY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQ0IHNxdWFyZXJvb3QgNDNFKzMgLT4gMi4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQ1IHNxdWFyZXJvb3QgMC40NCAtPiAwLjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQ2IHNxdWFyZXJvb3QgMC4wNDQgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU0NyBzcXVhcmVyb290IDQ0LjBFLTEgLT4gMi4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTQ4IHNxdWFyZXJvb3QgNDQuMDBFLTIgLT4gMC42NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU0OSBzcXVhcmVyb290IDQ0RS0zIC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NTAgc3F1YXJlcm9vdCA0NEUrMSAtPiAyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU1MSBzcXVhcmVyb290IDQ0RSsyIC0+IDY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTUyIHNxdWFyZXJvb3QgNDRFKzMgLT4gMi4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTUzIHNxdWFyZXJvb3QgMC40NSAtPiAwLjY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTU0IHNxdWFyZXJvb3QgMC4wNDUgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU1NSBzcXVhcmVyb290IDQ1LjBFLTEgLT4gMi4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTU2IHNxdWFyZXJvb3QgNDUuMDBFLTIgLT4gMC42NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU1NyBzcXVhcmVyb290IDQ1RS0zIC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NTggc3F1YXJlcm9vdCA0NUUrMSAtPiAyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU1OSBzcXVhcmVyb290IDQ1RSsyIC0+IDY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTYwIHNxdWFyZXJvb3QgNDVFKzMgLT4gMi4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTYxIHNxdWFyZXJvb3QgMC40NiAtPiAwLjY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTYyIHNxdWFyZXJvb3QgMC4wNDYgLT4gMC4yMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU2MyBzcXVhcmVyb290IDQ2LjBFLTEgLT4gMi4xICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTY0IHNxdWFyZXJvb3QgNDYuMDBFLTIgLT4gMC42OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU2NSBzcXVhcmVyb290IDQ2RS0zIC0+IDAuMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NjYgc3F1YXJlcm9vdCA0NkUrMSAtPiAyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU2NyBzcXVhcmVyb290IDQ2RSsyIC0+IDY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTY4IHNxdWFyZXJvb3QgNDZFKzMgLT4gMi4xRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTY5IHNxdWFyZXJvb3QgMC40NyAtPiAwLjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTcwIHNxdWFyZXJvb3QgMC4wNDcgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU3MSBzcXVhcmVyb290IDQ3LjBFLTEgLT4gMi4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTcyIHNxdWFyZXJvb3QgNDcuMDBFLTIgLT4gMC42OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU3MyBzcXVhcmVyb290IDQ3RS0zIC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1NzQgc3F1YXJlcm9vdCA0N0UrMSAtPiAyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU3NSBzcXVhcmVyb290IDQ3RSsyIC0+IDY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTc2IHNxdWFyZXJvb3QgNDdFKzMgLT4gMi4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTc3IHNxdWFyZXJvb3QgMC40OCAtPiAwLjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTc4IHNxdWFyZXJvb3QgMC4wNDggLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU3OSBzcXVhcmVyb290IDQ4LjBFLTEgLT4gMi4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTgwIHNxdWFyZXJvb3QgNDguMDBFLTIgLT4gMC42OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU4MSBzcXVhcmVyb290IDQ4RS0zIC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1ODIgc3F1YXJlcm9vdCA0OEUrMSAtPiAyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU4MyBzcXVhcmVyb290IDQ4RSsyIC0+IDY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTg0IHNxdWFyZXJvb3QgNDhFKzMgLT4gMi4yRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTg1IHNxdWFyZXJvb3QgMC40OSAtPiAwLjcKK3NxdHgyNTg2IHNxdWFyZXJvb3QgMC4wNDkgLT4gMC4yMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU4NyBzcXVhcmVyb290IDQ5LjBFLTEgLT4gMi4yICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTg4IHNxdWFyZXJvb3QgNDkuMDBFLTIgLT4gMC43MAorc3F0eDI1ODkgc3F1YXJlcm9vdCA0OUUtMyAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTkwIHNxdWFyZXJvb3QgNDlFKzEgLT4gMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1OTEgc3F1YXJlcm9vdCA0OUUrMiAtPiA3RSsxCitzcXR4MjU5MiBzcXVhcmVyb290IDQ5RSszIC0+IDIuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU5MyBzcXVhcmVyb290IDAuNTAgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU5NCBzcXVhcmVyb290IDAuMDUwIC0+IDAuMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1OTUgc3F1YXJlcm9vdCA1MC4wRS0xIC0+IDIuMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjU5NiBzcXVhcmVyb290IDUwLjAwRS0yIC0+IDAuNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1OTcgc3F1YXJlcm9vdCA1MEUtMyAtPiAwLjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNTk4IHNxdWFyZXJvb3QgNTBFKzEgLT4gMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI1OTkgc3F1YXJlcm9vdCA1MEUrMiAtPiA3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwMCBzcXVhcmVyb290IDUwRSszIC0+IDIuMkUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwMSBzcXVhcmVyb290IDAuNTEgLT4gMC43MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwMiBzcXVhcmVyb290IDAuMDUxIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MDMgc3F1YXJlcm9vdCA1MS4wRS0xIC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwNCBzcXVhcmVyb290IDUxLjAwRS0yIC0+IDAuNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MDUgc3F1YXJlcm9vdCA1MUUtMyAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjA2IHNxdWFyZXJvb3QgNTFFKzEgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MDcgc3F1YXJlcm9vdCA1MUUrMiAtPiA3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwOCBzcXVhcmVyb290IDUxRSszIC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYwOSBzcXVhcmVyb290IDAuNTIgLT4gMC43MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxMCBzcXVhcmVyb290IDAuMDUyIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MTEgc3F1YXJlcm9vdCA1Mi4wRS0xIC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxMiBzcXVhcmVyb290IDUyLjAwRS0yIC0+IDAuNzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MTMgc3F1YXJlcm9vdCA1MkUtMyAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjE0IHNxdWFyZXJvb3QgNTJFKzEgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MTUgc3F1YXJlcm9vdCA1MkUrMiAtPiA3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxNiBzcXVhcmVyb290IDUyRSszIC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxNyBzcXVhcmVyb290IDAuNTMgLT4gMC43MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYxOCBzcXVhcmVyb290IDAuMDUzIC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MTkgc3F1YXJlcm9vdCA1My4wRS0xIC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyMCBzcXVhcmVyb290IDUzLjAwRS0yIC0+IDAuNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MjEgc3F1YXJlcm9vdCA1M0UtMyAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjIyIHNxdWFyZXJvb3QgNTNFKzEgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MjMgc3F1YXJlcm9vdCA1M0UrMiAtPiA3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyNCBzcXVhcmVyb290IDUzRSszIC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyNSBzcXVhcmVyb290IDAuNTQgLT4gMC43MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyNiBzcXVhcmVyb290IDAuMDU0IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Mjcgc3F1YXJlcm9vdCA1NC4wRS0xIC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYyOCBzcXVhcmVyb290IDU0LjAwRS0yIC0+IDAuNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Mjkgc3F1YXJlcm9vdCA1NEUtMyAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjMwIHNxdWFyZXJvb3QgNTRFKzEgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MzEgc3F1YXJlcm9vdCA1NEUrMiAtPiA3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzMiBzcXVhcmVyb290IDU0RSszIC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzMyBzcXVhcmVyb290IDAuNTUgLT4gMC43NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzNCBzcXVhcmVyb290IDAuMDU1IC0+IDAuMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2MzUgc3F1YXJlcm9vdCA1NS4wRS0xIC0+IDIuMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjYzNiBzcXVhcmVyb290IDU1LjAwRS0yIC0+IDAuNzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Mzcgc3F1YXJlcm9vdCA1NUUtMyAtPiAwLjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjM4IHNxdWFyZXJvb3QgNTVFKzEgLT4gMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Mzkgc3F1YXJlcm9vdCA1NUUrMiAtPiA3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0MCBzcXVhcmVyb290IDU1RSszIC0+IDIuM0UrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0MSBzcXVhcmVyb290IDAuNTYgLT4gMC43NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0MiBzcXVhcmVyb290IDAuMDU2IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NDMgc3F1YXJlcm9vdCA1Ni4wRS0xIC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0NCBzcXVhcmVyb290IDU2LjAwRS0yIC0+IDAuNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NDUgc3F1YXJlcm9vdCA1NkUtMyAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjQ2IHNxdWFyZXJvb3QgNTZFKzEgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NDcgc3F1YXJlcm9vdCA1NkUrMiAtPiA3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0OCBzcXVhcmVyb290IDU2RSszIC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY0OSBzcXVhcmVyb290IDAuNTcgLT4gMC43NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1MCBzcXVhcmVyb290IDAuMDU3IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NTEgc3F1YXJlcm9vdCA1Ny4wRS0xIC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1MiBzcXVhcmVyb290IDU3LjAwRS0yIC0+IDAuNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NTMgc3F1YXJlcm9vdCA1N0UtMyAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjU0IHNxdWFyZXJvb3QgNTdFKzEgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NTUgc3F1YXJlcm9vdCA1N0UrMiAtPiA3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1NiBzcXVhcmVyb290IDU3RSszIC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1NyBzcXVhcmVyb290IDAuNTggLT4gMC43NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY1OCBzcXVhcmVyb290IDAuMDU4IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NTkgc3F1YXJlcm9vdCA1OC4wRS0xIC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2MCBzcXVhcmVyb290IDU4LjAwRS0yIC0+IDAuNzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NjEgc3F1YXJlcm9vdCA1OEUtMyAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjYyIHNxdWFyZXJvb3QgNThFKzEgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NjMgc3F1YXJlcm9vdCA1OEUrMiAtPiA3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2NCBzcXVhcmVyb290IDU4RSszIC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2NSBzcXVhcmVyb290IDAuNTkgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2NiBzcXVhcmVyb290IDAuMDU5IC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Njcgc3F1YXJlcm9vdCA1OS4wRS0xIC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY2OCBzcXVhcmVyb290IDU5LjAwRS0yIC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Njkgc3F1YXJlcm9vdCA1OUUtMyAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjcwIHNxdWFyZXJvb3QgNTlFKzEgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NzEgc3F1YXJlcm9vdCA1OUUrMiAtPiA3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3MiBzcXVhcmVyb290IDU5RSszIC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3MyBzcXVhcmVyb290IDAuNjAgLT4gMC43NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3NCBzcXVhcmVyb290IDAuMDYwIC0+IDAuMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2NzUgc3F1YXJlcm9vdCA2MC4wRS0xIC0+IDIuNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY3NiBzcXVhcmVyb290IDYwLjAwRS0yIC0+IDAuNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Nzcgc3F1YXJlcm9vdCA2MEUtMyAtPiAwLjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjc4IHNxdWFyZXJvb3QgNjBFKzEgLT4gMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2Nzkgc3F1YXJlcm9vdCA2MEUrMiAtPiA3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4MCBzcXVhcmVyb290IDYwRSszIC0+IDIuNEUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4MSBzcXVhcmVyb290IDAuNjEgLT4gMC43OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4MiBzcXVhcmVyb290IDAuMDYxIC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2ODMgc3F1YXJlcm9vdCA2MS4wRS0xIC0+IDIuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4NCBzcXVhcmVyb290IDYxLjAwRS0yIC0+IDAuNzggIEluZXhhY3QgUm91bmRlZAorc3F0eDI2ODUgc3F1YXJlcm9vdCA2MUUtMyAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjg2IHNxdWFyZXJvb3QgNjFFKzEgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2ODcgc3F1YXJlcm9vdCA2MUUrMiAtPiA3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4OCBzcXVhcmVyb290IDYxRSszIC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY4OSBzcXVhcmVyb290IDAuNjIgLT4gMC43OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5MCBzcXVhcmVyb290IDAuMDYyIC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2OTEgc3F1YXJlcm9vdCA2Mi4wRS0xIC0+IDIuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5MiBzcXVhcmVyb290IDYyLjAwRS0yIC0+IDAuNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2OTMgc3F1YXJlcm9vdCA2MkUtMyAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNjk0IHNxdWFyZXJvb3QgNjJFKzEgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2OTUgc3F1YXJlcm9vdCA2MkUrMiAtPiA3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5NiBzcXVhcmVyb290IDYyRSszIC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5NyBzcXVhcmVyb290IDAuNjMgLT4gMC43OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjY5OCBzcXVhcmVyb290IDAuMDYzIC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI2OTkgc3F1YXJlcm9vdCA2My4wRS0xIC0+IDIuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcwMCBzcXVhcmVyb290IDYzLjAwRS0yIC0+IDAuNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MDEgc3F1YXJlcm9vdCA2M0UtMyAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzAyIHNxdWFyZXJvb3QgNjNFKzEgLT4gMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MDMgc3F1YXJlcm9vdCA2M0UrMiAtPiA3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcwNCBzcXVhcmVyb290IDYzRSszIC0+IDIuNUUrMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcwNSBzcXVhcmVyb290IDAuNjQgLT4gMC44CitzcXR4MjcwNiBzcXVhcmVyb290IDAuMDY0IC0+IDAuMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MDcgc3F1YXJlcm9vdCA2NC4wRS0xIC0+IDIuNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcwOCBzcXVhcmVyb290IDY0LjAwRS0yIC0+IDAuODAKK3NxdHgyNzA5IHNxdWFyZXJvb3QgNjRFLTMgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcxMCBzcXVhcmVyb290IDY0RSsxIC0+IDI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzExIHNxdWFyZXJvb3QgNjRFKzIgLT4gOEUrMQorc3F0eDI3MTIgc3F1YXJlcm9vdCA2NEUrMyAtPiAyLjVFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MTMgc3F1YXJlcm9vdCAwLjY1IC0+IDAuODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MTQgc3F1YXJlcm9vdCAwLjA2NSAtPiAwLjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzE1IHNxdWFyZXJvb3QgNjUuMEUtMSAtPiAyLjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MTYgc3F1YXJlcm9vdCA2NS4wMEUtMiAtPiAwLjgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzE3IHNxdWFyZXJvb3QgNjVFLTMgLT4gMC4yNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcxOCBzcXVhcmVyb290IDY1RSsxIC0+IDI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzE5IHNxdWFyZXJvb3QgNjVFKzIgLT4gODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MjAgc3F1YXJlcm9vdCA2NUUrMyAtPiAyLjVFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MjEgc3F1YXJlcm9vdCAwLjY2IC0+IDAuODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MjIgc3F1YXJlcm9vdCAwLjA2NiAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzIzIHNxdWFyZXJvb3QgNjYuMEUtMSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MjQgc3F1YXJlcm9vdCA2Ni4wMEUtMiAtPiAwLjgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzI1IHNxdWFyZXJvb3QgNjZFLTMgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjcyNiBzcXVhcmVyb290IDY2RSsxIC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzI3IHNxdWFyZXJvb3QgNjZFKzIgLT4gODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Mjggc3F1YXJlcm9vdCA2NkUrMyAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Mjkgc3F1YXJlcm9vdCAwLjY3IC0+IDAuODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MzAgc3F1YXJlcm9vdCAwLjA2NyAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzMxIHNxdWFyZXJvb3QgNjcuMEUtMSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MzIgc3F1YXJlcm9vdCA2Ny4wMEUtMiAtPiAwLjgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzMzIHNxdWFyZXJvb3QgNjdFLTMgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjczNCBzcXVhcmVyb290IDY3RSsxIC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzM1IHNxdWFyZXJvb3QgNjdFKzIgLT4gODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3MzYgc3F1YXJlcm9vdCA2N0UrMyAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Mzcgc3F1YXJlcm9vdCAwLjY4IC0+IDAuODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Mzggc3F1YXJlcm9vdCAwLjA2OCAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzM5IHNxdWFyZXJvb3QgNjguMEUtMSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDAgc3F1YXJlcm9vdCA2OC4wMEUtMiAtPiAwLjgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzQxIHNxdWFyZXJvb3QgNjhFLTMgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc0MiBzcXVhcmVyb290IDY4RSsxIC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzQzIHNxdWFyZXJvb3QgNjhFKzIgLT4gODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDQgc3F1YXJlcm9vdCA2OEUrMyAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDUgc3F1YXJlcm9vdCAwLjY5IC0+IDAuODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDYgc3F1YXJlcm9vdCAwLjA2OSAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzQ3IHNxdWFyZXJvb3QgNjkuMEUtMSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NDggc3F1YXJlcm9vdCA2OS4wMEUtMiAtPiAwLjgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzQ5IHNxdWFyZXJvb3QgNjlFLTMgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc1MCBzcXVhcmVyb290IDY5RSsxIC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzUxIHNxdWFyZXJvb3QgNjlFKzIgLT4gODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTIgc3F1YXJlcm9vdCA2OUUrMyAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTMgc3F1YXJlcm9vdCAwLjcwIC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTQgc3F1YXJlcm9vdCAwLjA3MCAtPiAwLjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzU1IHNxdWFyZXJvb3QgNzAuMEUtMSAtPiAyLjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NTYgc3F1YXJlcm9vdCA3MC4wMEUtMiAtPiAwLjg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzU3IHNxdWFyZXJvb3QgNzBFLTMgLT4gMC4yNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc1OCBzcXVhcmVyb290IDcwRSsxIC0+IDI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzU5IHNxdWFyZXJvb3QgNzBFKzIgLT4gODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NjAgc3F1YXJlcm9vdCA3MEUrMyAtPiAyLjZFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NjEgc3F1YXJlcm9vdCAwLjcxIC0+IDAuODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NjIgc3F1YXJlcm9vdCAwLjA3MSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzYzIHNxdWFyZXJvb3QgNzEuMEUtMSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NjQgc3F1YXJlcm9vdCA3MS4wMEUtMiAtPiAwLjg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzY1IHNxdWFyZXJvb3QgNzFFLTMgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc2NiBzcXVhcmVyb290IDcxRSsxIC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzY3IHNxdWFyZXJvb3QgNzFFKzIgLT4gODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Njggc3F1YXJlcm9vdCA3MUUrMyAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Njkgc3F1YXJlcm9vdCAwLjcyIC0+IDAuODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NzAgc3F1YXJlcm9vdCAwLjA3MiAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzcxIHNxdWFyZXJvb3QgNzIuMEUtMSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NzIgc3F1YXJlcm9vdCA3Mi4wMEUtMiAtPiAwLjg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzczIHNxdWFyZXJvb3QgNzJFLTMgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc3NCBzcXVhcmVyb290IDcyRSsxIC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzc1IHNxdWFyZXJvb3QgNzJFKzIgLT4gODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3NzYgc3F1YXJlcm9vdCA3MkUrMyAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Nzcgc3F1YXJlcm9vdCAwLjczIC0+IDAuODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3Nzggc3F1YXJlcm9vdCAwLjA3MyAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzc5IHNxdWFyZXJvb3QgNzMuMEUtMSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODAgc3F1YXJlcm9vdCA3My4wMEUtMiAtPiAwLjg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzgxIHNxdWFyZXJvb3QgNzNFLTMgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc4MiBzcXVhcmVyb290IDczRSsxIC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzgzIHNxdWFyZXJvb3QgNzNFKzIgLT4gODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODQgc3F1YXJlcm9vdCA3M0UrMyAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODUgc3F1YXJlcm9vdCAwLjc0IC0+IDAuODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODYgc3F1YXJlcm9vdCAwLjA3NCAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzg3IHNxdWFyZXJvb3QgNzQuMEUtMSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3ODggc3F1YXJlcm9vdCA3NC4wMEUtMiAtPiAwLjg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzg5IHNxdWFyZXJvb3QgNzRFLTMgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc5MCBzcXVhcmVyb290IDc0RSsxIC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzkxIHNxdWFyZXJvb3QgNzRFKzIgLT4gODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTIgc3F1YXJlcm9vdCA3NEUrMyAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTMgc3F1YXJlcm9vdCAwLjc1IC0+IDAuODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTQgc3F1YXJlcm9vdCAwLjA3NSAtPiAwLjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzk1IHNxdWFyZXJvb3QgNzUuMEUtMSAtPiAyLjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI3OTYgc3F1YXJlcm9vdCA3NS4wMEUtMiAtPiAwLjg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzk3IHNxdWFyZXJvb3QgNzVFLTMgLT4gMC4yNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjc5OCBzcXVhcmVyb290IDc1RSsxIC0+IDI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyNzk5IHNxdWFyZXJvb3QgNzVFKzIgLT4gODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDAgc3F1YXJlcm9vdCA3NUUrMyAtPiAyLjdFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDEgc3F1YXJlcm9vdCAwLjc2IC0+IDAuODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDIgc3F1YXJlcm9vdCAwLjA3NiAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODAzIHNxdWFyZXJvb3QgNzYuMEUtMSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDQgc3F1YXJlcm9vdCA3Ni4wMEUtMiAtPiAwLjg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODA1IHNxdWFyZXJvb3QgNzZFLTMgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgwNiBzcXVhcmVyb290IDc2RSsxIC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODA3IHNxdWFyZXJvb3QgNzZFKzIgLT4gODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDggc3F1YXJlcm9vdCA3NkUrMyAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MDkgc3F1YXJlcm9vdCAwLjc3IC0+IDAuODggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTAgc3F1YXJlcm9vdCAwLjA3NyAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODExIHNxdWFyZXJvb3QgNzcuMEUtMSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTIgc3F1YXJlcm9vdCA3Ny4wMEUtMiAtPiAwLjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODEzIHNxdWFyZXJvb3QgNzdFLTMgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgxNCBzcXVhcmVyb290IDc3RSsxIC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODE1IHNxdWFyZXJvb3QgNzdFKzIgLT4gODggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTYgc3F1YXJlcm9vdCA3N0UrMyAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTcgc3F1YXJlcm9vdCAwLjc4IC0+IDAuODggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MTggc3F1YXJlcm9vdCAwLjA3OCAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODE5IHNxdWFyZXJvb3QgNzguMEUtMSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MjAgc3F1YXJlcm9vdCA3OC4wMEUtMiAtPiAwLjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODIxIHNxdWFyZXJvb3QgNzhFLTMgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgyMiBzcXVhcmVyb290IDc4RSsxIC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODIzIHNxdWFyZXJvb3QgNzhFKzIgLT4gODggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MjQgc3F1YXJlcm9vdCA3OEUrMyAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MjUgc3F1YXJlcm9vdCAwLjc5IC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MjYgc3F1YXJlcm9vdCAwLjA3OSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODI3IHNxdWFyZXJvb3QgNzkuMEUtMSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4Mjggc3F1YXJlcm9vdCA3OS4wMEUtMiAtPiAwLjg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODI5IHNxdWFyZXJvb3QgNzlFLTMgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgzMCBzcXVhcmVyb290IDc5RSsxIC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODMxIHNxdWFyZXJvb3QgNzlFKzIgLT4gODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MzIgc3F1YXJlcm9vdCA3OUUrMyAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MzMgc3F1YXJlcm9vdCAwLjgwIC0+IDAuODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MzQgc3F1YXJlcm9vdCAwLjA4MCAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODM1IHNxdWFyZXJvb3QgODAuMEUtMSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4MzYgc3F1YXJlcm9vdCA4MC4wMEUtMiAtPiAwLjg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODM3IHNxdWFyZXJvb3QgODBFLTMgLT4gMC4yOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjgzOCBzcXVhcmVyb290IDgwRSsxIC0+IDI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODM5IHNxdWFyZXJvb3QgODBFKzIgLT4gODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NDAgc3F1YXJlcm9vdCA4MEUrMyAtPiAyLjhFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NDEgc3F1YXJlcm9vdCAwLjgxIC0+IDAuOQorc3F0eDI4NDIgc3F1YXJlcm9vdCAwLjA4MSAtPiAwLjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODQzIHNxdWFyZXJvb3QgODEuMEUtMSAtPiAyLjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NDQgc3F1YXJlcm9vdCA4MS4wMEUtMiAtPiAwLjkwCitzcXR4Mjg0NSBzcXVhcmVyb290IDgxRS0zIC0+IDAuMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NDYgc3F1YXJlcm9vdCA4MUUrMSAtPiAyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg0NyBzcXVhcmVyb290IDgxRSsyIC0+IDlFKzEKK3NxdHgyODQ4IHNxdWFyZXJvb3QgODFFKzMgLT4gMi44RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODQ5IHNxdWFyZXJvb3QgMC44MiAtPiAwLjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODUwIHNxdWFyZXJvb3QgMC4wODIgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg1MSBzcXVhcmVyb290IDgyLjBFLTEgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODUyIHNxdWFyZXJvb3QgODIuMDBFLTIgLT4gMC45MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg1MyBzcXVhcmVyb290IDgyRS0zIC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NTQgc3F1YXJlcm9vdCA4MkUrMSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg1NSBzcXVhcmVyb290IDgyRSsyIC0+IDkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODU2IHNxdWFyZXJvb3QgODJFKzMgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODU3IHNxdWFyZXJvb3QgMC44MyAtPiAwLjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODU4IHNxdWFyZXJvb3QgMC4wODMgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg1OSBzcXVhcmVyb290IDgzLjBFLTEgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODYwIHNxdWFyZXJvb3QgODMuMDBFLTIgLT4gMC45MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg2MSBzcXVhcmVyb290IDgzRS0zIC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NjIgc3F1YXJlcm9vdCA4M0UrMSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg2MyBzcXVhcmVyb290IDgzRSsyIC0+IDkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODY0IHNxdWFyZXJvb3QgODNFKzMgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODY1IHNxdWFyZXJvb3QgMC44NCAtPiAwLjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODY2IHNxdWFyZXJvb3QgMC4wODQgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg2NyBzcXVhcmVyb290IDg0LjBFLTEgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODY4IHNxdWFyZXJvb3QgODQuMDBFLTIgLT4gMC45MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg2OSBzcXVhcmVyb290IDg0RS0zIC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4NzAgc3F1YXJlcm9vdCA4NEUrMSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg3MSBzcXVhcmVyb290IDg0RSsyIC0+IDkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODcyIHNxdWFyZXJvb3QgODRFKzMgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODczIHNxdWFyZXJvb3QgMC44NSAtPiAwLjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODc0IHNxdWFyZXJvb3QgMC4wODUgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg3NSBzcXVhcmVyb290IDg1LjBFLTEgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODc2IHNxdWFyZXJvb3QgODUuMDBFLTIgLT4gMC45MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg3NyBzcXVhcmVyb290IDg1RS0zIC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4Nzggc3F1YXJlcm9vdCA4NUUrMSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg3OSBzcXVhcmVyb290IDg1RSsyIC0+IDkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODgwIHNxdWFyZXJvb3QgODVFKzMgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODgxIHNxdWFyZXJvb3QgMC44NiAtPiAwLjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODgyIHNxdWFyZXJvb3QgMC4wODYgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg4MyBzcXVhcmVyb290IDg2LjBFLTEgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODg0IHNxdWFyZXJvb3QgODYuMDBFLTIgLT4gMC45MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg4NSBzcXVhcmVyb290IDg2RS0zIC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4ODYgc3F1YXJlcm9vdCA4NkUrMSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg4NyBzcXVhcmVyb290IDg2RSsyIC0+IDkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODg4IHNxdWFyZXJvb3QgODZFKzMgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODg5IHNxdWFyZXJvb3QgMC44NyAtPiAwLjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODkwIHNxdWFyZXJvb3QgMC4wODcgLT4gMC4yOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg5MSBzcXVhcmVyb290IDg3LjBFLTEgLT4gMi45ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODkyIHNxdWFyZXJvb3QgODcuMDBFLTIgLT4gMC45MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg5MyBzcXVhcmVyb290IDg3RS0zIC0+IDAuMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI4OTQgc3F1YXJlcm9vdCA4N0UrMSAtPiAyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg5NSBzcXVhcmVyb290IDg3RSsyIC0+IDkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODk2IHNxdWFyZXJvb3QgODdFKzMgLT4gMi45RSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODk3IHNxdWFyZXJvb3QgMC44OCAtPiAwLjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyODk4IHNxdWFyZXJvb3QgMC4wODggLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjg5OSBzcXVhcmVyb290IDg4LjBFLTEgLT4gMy4wICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTAwIHNxdWFyZXJvb3QgODguMDBFLTIgLT4gMC45NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkwMSBzcXVhcmVyb290IDg4RS0zIC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MDIgc3F1YXJlcm9vdCA4OEUrMSAtPiAzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkwMyBzcXVhcmVyb290IDg4RSsyIC0+IDk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTA0IHNxdWFyZXJvb3QgODhFKzMgLT4gMy4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTA1IHNxdWFyZXJvb3QgMC44OSAtPiAwLjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTA2IHNxdWFyZXJvb3QgMC4wODkgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkwNyBzcXVhcmVyb290IDg5LjBFLTEgLT4gMy4wICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTA4IHNxdWFyZXJvb3QgODkuMDBFLTIgLT4gMC45NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkwOSBzcXVhcmVyb290IDg5RS0zIC0+IDAuMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MTAgc3F1YXJlcm9vdCA4OUUrMSAtPiAzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkxMSBzcXVhcmVyb290IDg5RSsyIC0+IDk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTEyIHNxdWFyZXJvb3QgODlFKzMgLT4gMy4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTEzIHNxdWFyZXJvb3QgMC45MCAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTE0IHNxdWFyZXJvb3QgMC4wOTAgLT4gMC4zMAorc3F0eDI5MTUgc3F1YXJlcm9vdCA5MC4wRS0xIC0+IDMuMAorc3F0eDI5MTYgc3F1YXJlcm9vdCA5MC4wMEUtMiAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTE3IHNxdWFyZXJvb3QgOTBFLTMgLT4gMC4zMAorc3F0eDI5MTggc3F1YXJlcm9vdCA5MEUrMSAtPiAzMAorc3F0eDI5MTkgc3F1YXJlcm9vdCA5MEUrMiAtPiA5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkyMCBzcXVhcmVyb290IDkwRSszIC0+IDMuMEUrMgorc3F0eDI5MjEgc3F1YXJlcm9vdCAwLjkxIC0+IDAuOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MjIgc3F1YXJlcm9vdCAwLjA5MSAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTIzIHNxdWFyZXJvb3QgOTEuMEUtMSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MjQgc3F1YXJlcm9vdCA5MS4wMEUtMiAtPiAwLjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTI1IHNxdWFyZXJvb3QgOTFFLTMgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkyNiBzcXVhcmVyb290IDkxRSsxIC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTI3IHNxdWFyZXJvb3QgOTFFKzIgLT4gOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Mjggc3F1YXJlcm9vdCA5MUUrMyAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Mjkgc3F1YXJlcm9vdCAwLjkyIC0+IDAuOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MzAgc3F1YXJlcm9vdCAwLjA5MiAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTMxIHNxdWFyZXJvb3QgOTIuMEUtMSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MzIgc3F1YXJlcm9vdCA5Mi4wMEUtMiAtPiAwLjk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTMzIHNxdWFyZXJvb3QgOTJFLTMgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MjkzNCBzcXVhcmVyb290IDkyRSsxIC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTM1IHNxdWFyZXJvb3QgOTJFKzIgLT4gOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5MzYgc3F1YXJlcm9vdCA5MkUrMyAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Mzcgc3F1YXJlcm9vdCAwLjkzIC0+IDAuOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Mzggc3F1YXJlcm9vdCAwLjA5MyAtPiAwLjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTM5IHNxdWFyZXJvb3QgOTMuMEUtMSAtPiAzLjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDAgc3F1YXJlcm9vdCA5My4wMEUtMiAtPiAwLjk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTQxIHNxdWFyZXJvb3QgOTNFLTMgLT4gMC4zMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk0MiBzcXVhcmVyb290IDkzRSsxIC0+IDMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTQzIHNxdWFyZXJvb3QgOTNFKzIgLT4gOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDQgc3F1YXJlcm9vdCA5M0UrMyAtPiAzLjBFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDUgc3F1YXJlcm9vdCAwLjk0IC0+IDAuOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDYgc3F1YXJlcm9vdCAwLjA5NCAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTQ3IHNxdWFyZXJvb3QgOTQuMEUtMSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NDggc3F1YXJlcm9vdCA5NC4wMEUtMiAtPiAwLjk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTQ5IHNxdWFyZXJvb3QgOTRFLTMgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk1MCBzcXVhcmVyb290IDk0RSsxIC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTUxIHNxdWFyZXJvb3QgOTRFKzIgLT4gOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTIgc3F1YXJlcm9vdCA5NEUrMyAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTMgc3F1YXJlcm9vdCAwLjk1IC0+IDAuOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTQgc3F1YXJlcm9vdCAwLjA5NSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTU1IHNxdWFyZXJvb3QgOTUuMEUtMSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NTYgc3F1YXJlcm9vdCA5NS4wMEUtMiAtPiAwLjk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTU3IHNxdWFyZXJvb3QgOTVFLTMgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk1OCBzcXVhcmVyb290IDk1RSsxIC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTU5IHNxdWFyZXJvb3QgOTVFKzIgLT4gOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NjAgc3F1YXJlcm9vdCA5NUUrMyAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NjEgc3F1YXJlcm9vdCAwLjk2IC0+IDAuOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NjIgc3F1YXJlcm9vdCAwLjA5NiAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTYzIHNxdWFyZXJvb3QgOTYuMEUtMSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NjQgc3F1YXJlcm9vdCA5Ni4wMEUtMiAtPiAwLjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTY1IHNxdWFyZXJvb3QgOTZFLTMgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk2NiBzcXVhcmVyb290IDk2RSsxIC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTY3IHNxdWFyZXJvb3QgOTZFKzIgLT4gOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Njggc3F1YXJlcm9vdCA5NkUrMyAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Njkgc3F1YXJlcm9vdCAwLjk3IC0+IDAuOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NzAgc3F1YXJlcm9vdCAwLjA5NyAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTcxIHNxdWFyZXJvb3QgOTcuMEUtMSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NzIgc3F1YXJlcm9vdCA5Ny4wMEUtMiAtPiAwLjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTczIHNxdWFyZXJvb3QgOTdFLTMgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk3NCBzcXVhcmVyb290IDk3RSsxIC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTc1IHNxdWFyZXJvb3QgOTdFKzIgLT4gOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDI5NzYgc3F1YXJlcm9vdCA5N0UrMyAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Nzcgc3F1YXJlcm9vdCAwLjk4IC0+IDAuOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5Nzggc3F1YXJlcm9vdCAwLjA5OCAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTc5IHNxdWFyZXJvb3QgOTguMEUtMSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODAgc3F1YXJlcm9vdCA5OC4wMEUtMiAtPiAwLjk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTgxIHNxdWFyZXJvb3QgOThFLTMgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk4MiBzcXVhcmVyb290IDk4RSsxIC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTgzIHNxdWFyZXJvb3QgOThFKzIgLT4gOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODQgc3F1YXJlcm9vdCA5OEUrMyAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODUgc3F1YXJlcm9vdCAwLjk5IC0+IDAuOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODYgc3F1YXJlcm9vdCAwLjA5OSAtPiAwLjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTg3IHNxdWFyZXJvb3QgOTkuMEUtMSAtPiAzLjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5ODggc3F1YXJlcm9vdCA5OS4wMEUtMiAtPiAwLjk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTg5IHNxdWFyZXJvb3QgOTlFLTMgLT4gMC4zMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mjk5MCBzcXVhcmVyb290IDk5RSsxIC0+IDMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgyOTkxIHNxdWFyZXJvb3QgOTlFKzIgLT4gOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDI5OTIgc3F1YXJlcm9vdCA5OUUrMyAtPiAzLjFFKzIgIEluZXhhY3QgUm91bmRlZAorCistLSBQcmVjaXNpb24gMyBzcXVhcmVyb290IHRlc3RzIFtleGhhdXN0aXZlLCBmIGFuZCBmLzEwXQorcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorbWF4RXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogICAzCitzcXR4MzAwMSBzcXVhcmVyb290IDAuMSAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAwMiBzcXVhcmVyb290IDAuMDEgLT4gMC4xCitzcXR4MzAwMyBzcXVhcmVyb290IDAuMiAtPiAwLjQ0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAwNCBzcXVhcmVyb290IDAuMDIgLT4gMC4xNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMDUgc3F1YXJlcm9vdCAwLjMgLT4gMC41NDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMDYgc3F1YXJlcm9vdCAwLjAzIC0+IDAuMTczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDA3IHNxdWFyZXJvb3QgMC40IC0+IDAuNjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDA4IHNxdWFyZXJvb3QgMC4wNCAtPiAwLjIKK3NxdHgzMDA5IHNxdWFyZXJvb3QgMC41IC0+IDAuNzA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDEwIHNxdWFyZXJvb3QgMC4wNSAtPiAwLjIyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAxMSBzcXVhcmVyb290IDAuNiAtPiAwLjc3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAxMiBzcXVhcmVyb290IDAuMDYgLT4gMC4yNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMTMgc3F1YXJlcm9vdCAwLjcgLT4gMC44MzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMTQgc3F1YXJlcm9vdCAwLjA3IC0+IDAuMjY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDE1IHNxdWFyZXJvb3QgMC44IC0+IDAuODk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDE2IHNxdWFyZXJvb3QgMC4wOCAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAxNyBzcXVhcmVyb290IDAuOSAtPiAwLjk0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAxOCBzcXVhcmVyb290IDAuMDkgLT4gMC4zCitzcXR4MzAxOSBzcXVhcmVyb290IDAuMTEgLT4gMC4zMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMjAgc3F1YXJlcm9vdCAwLjAxMSAtPiAwLjEwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyMSBzcXVhcmVyb290IDAuMTIgLT4gMC4zNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMjIgc3F1YXJlcm9vdCAwLjAxMiAtPiAwLjExMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyMyBzcXVhcmVyb290IDAuMTMgLT4gMC4zNjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMjQgc3F1YXJlcm9vdCAwLjAxMyAtPiAwLjExNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyNSBzcXVhcmVyb290IDAuMTQgLT4gMC4zNzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMjYgc3F1YXJlcm9vdCAwLjAxNCAtPiAwLjExOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyNyBzcXVhcmVyb290IDAuMTUgLT4gMC4zODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwMjggc3F1YXJlcm9vdCAwLjAxNSAtPiAwLjEyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAyOSBzcXVhcmVyb290IDAuMTYgLT4gMC40CitzcXR4MzAzMCBzcXVhcmVyb290IDAuMDE2IC0+IDAuMTI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDMxIHNxdWFyZXJvb3QgMC4xNyAtPiAwLjQxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAzMiBzcXVhcmVyb290IDAuMDE3IC0+IDAuMTMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDMzIHNxdWFyZXJvb3QgMC4xOCAtPiAwLjQyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAzNCBzcXVhcmVyb290IDAuMDE4IC0+IDAuMTM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDM1IHNxdWFyZXJvb3QgMC4xOSAtPiAwLjQzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAzNiBzcXVhcmVyb290IDAuMDE5IC0+IDAuMTM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDM3IHNxdWFyZXJvb3QgMC4yMSAtPiAwLjQ1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzAzOCBzcXVhcmVyb290IDAuMDIxIC0+IDAuMTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDM5IHNxdWFyZXJvb3QgMC4yMiAtPiAwLjQ2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA0MCBzcXVhcmVyb290IDAuMDIyIC0+IDAuMTQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDQxIHNxdWFyZXJvb3QgMC4yMyAtPiAwLjQ4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA0MiBzcXVhcmVyb290IDAuMDIzIC0+IDAuMTUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDQzIHNxdWFyZXJvb3QgMC4yNCAtPiAwLjQ5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA0NCBzcXVhcmVyb290IDAuMDI0IC0+IDAuMTU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDQ1IHNxdWFyZXJvb3QgMC4yNSAtPiAwLjUKK3NxdHgzMDQ2IHNxdWFyZXJvb3QgMC4wMjUgLT4gMC4xNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNDcgc3F1YXJlcm9vdCAwLjI2IC0+IDAuNTEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDQ4IHNxdWFyZXJvb3QgMC4wMjYgLT4gMC4xNjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNDkgc3F1YXJlcm9vdCAwLjI3IC0+IDAuNTIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDUwIHNxdWFyZXJvb3QgMC4wMjcgLT4gMC4xNjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTEgc3F1YXJlcm9vdCAwLjI4IC0+IDAuNTI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDUyIHNxdWFyZXJvb3QgMC4wMjggLT4gMC4xNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTMgc3F1YXJlcm9vdCAwLjI5IC0+IDAuNTM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDU0IHNxdWFyZXJvb3QgMC4wMjkgLT4gMC4xNzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTUgc3F1YXJlcm9vdCAwLjMxIC0+IDAuNTU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDU2IHNxdWFyZXJvb3QgMC4wMzEgLT4gMC4xNzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTcgc3F1YXJlcm9vdCAwLjMyIC0+IDAuNTY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDU4IHNxdWFyZXJvb3QgMC4wMzIgLT4gMC4xNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNTkgc3F1YXJlcm9vdCAwLjMzIC0+IDAuNTc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDYwIHNxdWFyZXJvb3QgMC4wMzMgLT4gMC4xODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNjEgc3F1YXJlcm9vdCAwLjM0IC0+IDAuNTgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDYyIHNxdWFyZXJvb3QgMC4wMzQgLT4gMC4xODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNjMgc3F1YXJlcm9vdCAwLjM1IC0+IDAuNTkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDY0IHNxdWFyZXJvb3QgMC4wMzUgLT4gMC4xODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNjUgc3F1YXJlcm9vdCAwLjM2IC0+IDAuNgorc3F0eDMwNjYgc3F1YXJlcm9vdCAwLjAzNiAtPiAwLjE5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA2NyBzcXVhcmVyb290IDAuMzcgLT4gMC42MDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNjggc3F1YXJlcm9vdCAwLjAzNyAtPiAwLjE5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA2OSBzcXVhcmVyb290IDAuMzggLT4gMC42MTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNzAgc3F1YXJlcm9vdCAwLjAzOCAtPiAwLjE5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3MSBzcXVhcmVyb290IDAuMzkgLT4gMC42MjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNzIgc3F1YXJlcm9vdCAwLjAzOSAtPiAwLjE5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3MyBzcXVhcmVyb290IDAuNDEgLT4gMC42NDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNzQgc3F1YXJlcm9vdCAwLjA0MSAtPiAwLjIwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3NSBzcXVhcmVyb290IDAuNDIgLT4gMC42NDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNzYgc3F1YXJlcm9vdCAwLjA0MiAtPiAwLjIwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3NyBzcXVhcmVyb290IDAuNDMgLT4gMC42NTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwNzggc3F1YXJlcm9vdCAwLjA0MyAtPiAwLjIwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA3OSBzcXVhcmVyb290IDAuNDQgLT4gMC42NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwODAgc3F1YXJlcm9vdCAwLjA0NCAtPiAwLjIxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4MSBzcXVhcmVyb290IDAuNDUgLT4gMC42NzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwODIgc3F1YXJlcm9vdCAwLjA0NSAtPiAwLjIxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4MyBzcXVhcmVyb290IDAuNDYgLT4gMC42NzggIEluZXhhY3QgUm91bmRlZAorc3F0eDMwODQgc3F1YXJlcm9vdCAwLjA0NiAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4NSBzcXVhcmVyb290IDAuNDcgLT4gMC42ODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwODYgc3F1YXJlcm9vdCAwLjA0NyAtPiAwLjIxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4NyBzcXVhcmVyb290IDAuNDggLT4gMC42OTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMwODggc3F1YXJlcm9vdCAwLjA0OCAtPiAwLjIxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA4OSBzcXVhcmVyb290IDAuNDkgLT4gMC43CitzcXR4MzA5MCBzcXVhcmVyb290IDAuMDQ5IC0+IDAuMjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDkxIHNxdWFyZXJvb3QgMC41MSAtPiAwLjcxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA5MiBzcXVhcmVyb290IDAuMDUxIC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDkzIHNxdWFyZXJvb3QgMC41MiAtPiAwLjcyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA5NCBzcXVhcmVyb290IDAuMDUyIC0+IDAuMjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDk1IHNxdWFyZXJvb3QgMC41MyAtPiAwLjcyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA5NiBzcXVhcmVyb290IDAuMDUzIC0+IDAuMjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDk3IHNxdWFyZXJvb3QgMC41NCAtPiAwLjczNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzA5OCBzcXVhcmVyb290IDAuMDU0IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMDk5IHNxdWFyZXJvb3QgMC41NSAtPiAwLjc0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEwMCBzcXVhcmVyb290IDAuMDU1IC0+IDAuMjM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTAxIHNxdWFyZXJvb3QgMC41NiAtPiAwLjc0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEwMiBzcXVhcmVyb290IDAuMDU2IC0+IDAuMjM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTAzIHNxdWFyZXJvb3QgMC41NyAtPiAwLjc1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEwNCBzcXVhcmVyb290IDAuMDU3IC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTA1IHNxdWFyZXJvb3QgMC41OCAtPiAwLjc2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEwNiBzcXVhcmVyb290IDAuMDU4IC0+IDAuMjQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTA3IHNxdWFyZXJvb3QgMC41OSAtPiAwLjc2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzEwOCBzcXVhcmVyb290IDAuMDU5IC0+IDAuMjQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTA5IHNxdWFyZXJvb3QgMC42MSAtPiAwLjc4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzExMCBzcXVhcmVyb290IDAuMDYxIC0+IDAuMjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTExIHNxdWFyZXJvb3QgMC42MiAtPiAwLjc4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzExMiBzcXVhcmVyb290IDAuMDYyIC0+IDAuMjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTEzIHNxdWFyZXJvb3QgMC42MyAtPiAwLjc5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzExNCBzcXVhcmVyb290IDAuMDYzIC0+IDAuMjUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTE1IHNxdWFyZXJvb3QgMC42NCAtPiAwLjgKK3NxdHgzMTE2IHNxdWFyZXJvb3QgMC4wNjQgLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMTcgc3F1YXJlcm9vdCAwLjY1IC0+IDAuODA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTE4IHNxdWFyZXJvb3QgMC4wNjUgLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMTkgc3F1YXJlcm9vdCAwLjY2IC0+IDAuODEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTIwIHNxdWFyZXJvb3QgMC4wNjYgLT4gMC4yNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjEgc3F1YXJlcm9vdCAwLjY3IC0+IDAuODE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTIyIHNxdWFyZXJvb3QgMC4wNjcgLT4gMC4yNTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjMgc3F1YXJlcm9vdCAwLjY4IC0+IDAuODI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTI0IHNxdWFyZXJvb3QgMC4wNjggLT4gMC4yNjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjUgc3F1YXJlcm9vdCAwLjY5IC0+IDAuODMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTI2IHNxdWFyZXJvb3QgMC4wNjkgLT4gMC4yNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjcgc3F1YXJlcm9vdCAwLjcxIC0+IDAuODQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTI4IHNxdWFyZXJvb3QgMC4wNzEgLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMjkgc3F1YXJlcm9vdCAwLjcyIC0+IDAuODQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTMwIHNxdWFyZXJvb3QgMC4wNzIgLT4gMC4yNjggIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzEgc3F1YXJlcm9vdCAwLjczIC0+IDAuODU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTMyIHNxdWFyZXJvb3QgMC4wNzMgLT4gMC4yNzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzMgc3F1YXJlcm9vdCAwLjc0IC0+IDAuODYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTM0IHNxdWFyZXJvb3QgMC4wNzQgLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzUgc3F1YXJlcm9vdCAwLjc1IC0+IDAuODY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTM2IHNxdWFyZXJvb3QgMC4wNzUgLT4gMC4yNzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzcgc3F1YXJlcm9vdCAwLjc2IC0+IDAuODcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTM4IHNxdWFyZXJvb3QgMC4wNzYgLT4gMC4yNzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxMzkgc3F1YXJlcm9vdCAwLjc3IC0+IDAuODc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTQwIHNxdWFyZXJvb3QgMC4wNzcgLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNDEgc3F1YXJlcm9vdCAwLjc4IC0+IDAuODgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTQyIHNxdWFyZXJvb3QgMC4wNzggLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNDMgc3F1YXJlcm9vdCAwLjc5IC0+IDAuODg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTQ0IHNxdWFyZXJvb3QgMC4wNzkgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNDUgc3F1YXJlcm9vdCAwLjgxIC0+IDAuOQorc3F0eDMxNDYgc3F1YXJlcm9vdCAwLjA4MSAtPiAwLjI4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE0NyBzcXVhcmVyb290IDAuODIgLT4gMC45MDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNDggc3F1YXJlcm9vdCAwLjA4MiAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE0OSBzcXVhcmVyb290IDAuODMgLT4gMC45MTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNTAgc3F1YXJlcm9vdCAwLjA4MyAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1MSBzcXVhcmVyb290IDAuODQgLT4gMC45MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNTIgc3F1YXJlcm9vdCAwLjA4NCAtPiAwLjI5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1MyBzcXVhcmVyb290IDAuODUgLT4gMC45MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNTQgc3F1YXJlcm9vdCAwLjA4NSAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1NSBzcXVhcmVyb290IDAuODYgLT4gMC45MjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNTYgc3F1YXJlcm9vdCAwLjA4NiAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1NyBzcXVhcmVyb290IDAuODcgLT4gMC45MzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNTggc3F1YXJlcm9vdCAwLjA4NyAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE1OSBzcXVhcmVyb290IDAuODggLT4gMC45MzggIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNjAgc3F1YXJlcm9vdCAwLjA4OCAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2MSBzcXVhcmVyb290IDAuODkgLT4gMC45NDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNjIgc3F1YXJlcm9vdCAwLjA4OSAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2MyBzcXVhcmVyb290IDAuOTEgLT4gMC45NTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNjQgc3F1YXJlcm9vdCAwLjA5MSAtPiAwLjMwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2NSBzcXVhcmVyb290IDAuOTIgLT4gMC45NTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNjYgc3F1YXJlcm9vdCAwLjA5MiAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2NyBzcXVhcmVyb290IDAuOTMgLT4gMC45NjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNjggc3F1YXJlcm9vdCAwLjA5MyAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE2OSBzcXVhcmVyb290IDAuOTQgLT4gMC45NzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNzAgc3F1YXJlcm9vdCAwLjA5NCAtPiAwLjMwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3MSBzcXVhcmVyb290IDAuOTUgLT4gMC45NzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNzIgc3F1YXJlcm9vdCAwLjA5NSAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3MyBzcXVhcmVyb290IDAuOTYgLT4gMC45ODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNzQgc3F1YXJlcm9vdCAwLjA5NiAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3NSBzcXVhcmVyb290IDAuOTcgLT4gMC45ODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNzYgc3F1YXJlcm9vdCAwLjA5NyAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3NyBzcXVhcmVyb290IDAuOTggLT4gMC45OTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxNzggc3F1YXJlcm9vdCAwLjA5OCAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE3OSBzcXVhcmVyb290IDAuOTkgLT4gMC45OTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxODAgc3F1YXJlcm9vdCAwLjA5OSAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE4MSBzcXVhcmVyb290IDAuMTAxIC0+IDAuMzE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTgyIHNxdWFyZXJvb3QgMC4wMTAxIC0+IDAuMTAwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTgzIHNxdWFyZXJvb3QgMC4xMDIgLT4gMC4zMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxODQgc3F1YXJlcm9vdCAwLjAxMDIgLT4gMC4xMDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxODUgc3F1YXJlcm9vdCAwLjEwMyAtPiAwLjMyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE4NiBzcXVhcmVyb290IDAuMDEwMyAtPiAwLjEwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE4NyBzcXVhcmVyb290IDAuMTA0IC0+IDAuMzIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTg4IHNxdWFyZXJvb3QgMC4wMTA0IC0+IDAuMTAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTg5IHNxdWFyZXJvb3QgMC4xMDUgLT4gMC4zMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxOTAgc3F1YXJlcm9vdCAwLjAxMDUgLT4gMC4xMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxOTEgc3F1YXJlcm9vdCAwLjEwNiAtPiAwLjMyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5MiBzcXVhcmVyb290IDAuMDEwNiAtPiAwLjEwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5MyBzcXVhcmVyb290IDAuMTA3IC0+IDAuMzI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTk0IHNxdWFyZXJvb3QgMC4wMTA3IC0+IDAuMTAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMTk1IHNxdWFyZXJvb3QgMC4xMDggLT4gMC4zMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxOTYgc3F1YXJlcm9vdCAwLjAxMDggLT4gMC4xMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMxOTcgc3F1YXJlcm9vdCAwLjEwOSAtPiAwLjMzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5OCBzcXVhcmVyb290IDAuMDEwOSAtPiAwLjEwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzE5OSBzcXVhcmVyb290IDAuMTExIC0+IDAuMzMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjAwIHNxdWFyZXJvb3QgMC4wMTExIC0+IDAuMTA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjAxIHNxdWFyZXJvb3QgMC4xMTIgLT4gMC4zMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDIgc3F1YXJlcm9vdCAwLjAxMTIgLT4gMC4xMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDMgc3F1YXJlcm9vdCAwLjExMyAtPiAwLjMzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIwNCBzcXVhcmVyb290IDAuMDExMyAtPiAwLjEwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIwNSBzcXVhcmVyb290IDAuMTE0IC0+IDAuMzM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjA2IHNxdWFyZXJvb3QgMC4wMTE0IC0+IDAuMTA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjA3IHNxdWFyZXJvb3QgMC4xMTUgLT4gMC4zMzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDggc3F1YXJlcm9vdCAwLjAxMTUgLT4gMC4xMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMDkgc3F1YXJlcm9vdCAwLjExNiAtPiAwLjM0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIxMCBzcXVhcmVyb290IDAuMDExNiAtPiAwLjEwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIxMSBzcXVhcmVyb290IDAuMTE3IC0+IDAuMzQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjEyIHNxdWFyZXJvb3QgMC4wMTE3IC0+IDAuMTA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjEzIHNxdWFyZXJvb3QgMC4xMTggLT4gMC4zNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMTQgc3F1YXJlcm9vdCAwLjAxMTggLT4gMC4xMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMTUgc3F1YXJlcm9vdCAwLjExOSAtPiAwLjM0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIxNiBzcXVhcmVyb290IDAuMDExOSAtPiAwLjEwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIxNyBzcXVhcmVyb290IDAuMTIxIC0+IDAuMzQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjE4IHNxdWFyZXJvb3QgMC4wMTIxIC0+IDAuMTEKK3NxdHgzMjE5IHNxdWFyZXJvb3QgMC4xMjIgLT4gMC4zNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMjAgc3F1YXJlcm9vdCAwLjAxMjIgLT4gMC4xMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMjEgc3F1YXJlcm9vdCAwLjEyMyAtPiAwLjM1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyMiBzcXVhcmVyb290IDAuMDEyMyAtPiAwLjExMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyMyBzcXVhcmVyb290IDAuMTI0IC0+IDAuMzUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjI0IHNxdWFyZXJvb3QgMC4wMTI0IC0+IDAuMTExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjI1IHNxdWFyZXJvb3QgMC4xMjUgLT4gMC4zNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMjYgc3F1YXJlcm9vdCAwLjAxMjUgLT4gMC4xMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMjcgc3F1YXJlcm9vdCAwLjEyNiAtPiAwLjM1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyOCBzcXVhcmVyb290IDAuMDEyNiAtPiAwLjExMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIyOSBzcXVhcmVyb290IDAuMTI3IC0+IDAuMzU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjMwIHNxdWFyZXJvb3QgMC4wMTI3IC0+IDAuMTEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjMxIHNxdWFyZXJvb3QgMC4xMjggLT4gMC4zNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzIgc3F1YXJlcm9vdCAwLjAxMjggLT4gMC4xMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzMgc3F1YXJlcm9vdCAwLjEyOSAtPiAwLjM1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIzNCBzcXVhcmVyb290IDAuMDEyOSAtPiAwLjExNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzIzNSBzcXVhcmVyb290IDAuMTMxIC0+IDAuMzYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjM2IHNxdWFyZXJvb3QgMC4wMTMxIC0+IDAuMTE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjM3IHNxdWFyZXJvb3QgMC4xMzIgLT4gMC4zNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzggc3F1YXJlcm9vdCAwLjAxMzIgLT4gMC4xMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyMzkgc3F1YXJlcm9vdCAwLjEzMyAtPiAwLjM2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI0MCBzcXVhcmVyb290IDAuMDEzMyAtPiAwLjExNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI0MSBzcXVhcmVyb290IDAuMTM0IC0+IDAuMzY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQyIHNxdWFyZXJvb3QgMC4wMTM0IC0+IDAuMTE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQzIHNxdWFyZXJvb3QgMC4xMzUgLT4gMC4zNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNDQgc3F1YXJlcm9vdCAwLjAxMzUgLT4gMC4xMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNDUgc3F1YXJlcm9vdCAwLjEzNiAtPiAwLjM2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI0NiBzcXVhcmVyb290IDAuMDEzNiAtPiAwLjExNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI0NyBzcXVhcmVyb290IDAuMTM3IC0+IDAuMzcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQ4IHNxdWFyZXJvb3QgMC4wMTM3IC0+IDAuMTE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjQ5IHNxdWFyZXJvb3QgMC4xMzggLT4gMC4zNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNTAgc3F1YXJlcm9vdCAwLjAxMzggLT4gMC4xMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNTEgc3F1YXJlcm9vdCAwLjEzOSAtPiAwLjM3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1MiBzcXVhcmVyb290IDAuMDEzOSAtPiAwLjExOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1MyBzcXVhcmVyb290IDAuMTQxIC0+IDAuMzc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjU0IHNxdWFyZXJvb3QgMC4wMTQxIC0+IDAuMTE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjU1IHNxdWFyZXJvb3QgMC4xNDIgLT4gMC4zNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNTYgc3F1YXJlcm9vdCAwLjAxNDIgLT4gMC4xMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNTcgc3F1YXJlcm9vdCAwLjE0MyAtPiAwLjM3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1OCBzcXVhcmVyb290IDAuMDE0MyAtPiAwLjEyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI1OSBzcXVhcmVyb290IDAuMTQ0IC0+IDAuMzc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjYwIHNxdWFyZXJvb3QgMC4wMTQ0IC0+IDAuMTIKK3NxdHgzMjYxIHNxdWFyZXJvb3QgMC4xNDUgLT4gMC4zODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNjIgc3F1YXJlcm9vdCAwLjAxNDUgLT4gMC4xMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNjMgc3F1YXJlcm9vdCAwLjE0NiAtPiAwLjM4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI2NCBzcXVhcmVyb290IDAuMDE0NiAtPiAwLjEyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI2NSBzcXVhcmVyb290IDAuMTQ3IC0+IDAuMzgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjY2IHNxdWFyZXJvb3QgMC4wMTQ3IC0+IDAuMTIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjY3IHNxdWFyZXJvb3QgMC4xNDggLT4gMC4zODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNjggc3F1YXJlcm9vdCAwLjAxNDggLT4gMC4xMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNjkgc3F1YXJlcm9vdCAwLjE0OSAtPiAwLjM4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI3MCBzcXVhcmVyb290IDAuMDE0OSAtPiAwLjEyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI3MSBzcXVhcmVyb290IDAuMTUxIC0+IDAuMzg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjcyIHNxdWFyZXJvb3QgMC4wMTUxIC0+IDAuMTIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjczIHNxdWFyZXJvb3QgMC4xNTIgLT4gMC4zOTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNzQgc3F1YXJlcm9vdCAwLjAxNTIgLT4gMC4xMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyNzUgc3F1YXJlcm9vdCAwLjE1MyAtPiAwLjM5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI3NiBzcXVhcmVyb290IDAuMDE1MyAtPiAwLjEyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI3NyBzcXVhcmVyb290IDAuMTU0IC0+IDAuMzkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjc4IHNxdWFyZXJvb3QgMC4wMTU0IC0+IDAuMTI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjc5IHNxdWFyZXJvb3QgMC4xNTUgLT4gMC4zOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyODAgc3F1YXJlcm9vdCAwLjAxNTUgLT4gMC4xMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyODEgc3F1YXJlcm9vdCAwLjE1NiAtPiAwLjM5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4MiBzcXVhcmVyb290IDAuMDE1NiAtPiAwLjEyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4MyBzcXVhcmVyb290IDAuMTU3IC0+IDAuMzk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjg0IHNxdWFyZXJvb3QgMC4wMTU3IC0+IDAuMTI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjg1IHNxdWFyZXJvb3QgMC4xNTggLT4gMC4zOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyODYgc3F1YXJlcm9vdCAwLjAxNTggLT4gMC4xMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyODcgc3F1YXJlcm9vdCAwLjE1OSAtPiAwLjM5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4OCBzcXVhcmVyb290IDAuMDE1OSAtPiAwLjEyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI4OSBzcXVhcmVyb290IDAuMTYxIC0+IDAuNDAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjkwIHNxdWFyZXJvb3QgMC4wMTYxIC0+IDAuMTI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjkxIHNxdWFyZXJvb3QgMC4xNjIgLT4gMC40MDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTIgc3F1YXJlcm9vdCAwLjAxNjIgLT4gMC4xMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTMgc3F1YXJlcm9vdCAwLjE2MyAtPiAwLjQwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI5NCBzcXVhcmVyb290IDAuMDE2MyAtPiAwLjEyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzI5NSBzcXVhcmVyb290IDAuMTY0IC0+IDAuNDA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjk2IHNxdWFyZXJvb3QgMC4wMTY0IC0+IDAuMTI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMjk3IHNxdWFyZXJvb3QgMC4xNjUgLT4gMC40MDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTggc3F1YXJlcm9vdCAwLjAxNjUgLT4gMC4xMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDMyOTkgc3F1YXJlcm9vdCAwLjE2NiAtPiAwLjQwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMwMCBzcXVhcmVyb290IDAuMDE2NiAtPiAwLjEyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMwMSBzcXVhcmVyb290IDAuMTY3IC0+IDAuNDA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzAyIHNxdWFyZXJvb3QgMC4wMTY3IC0+IDAuMTI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzAzIHNxdWFyZXJvb3QgMC4xNjggLT4gMC40MTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMDQgc3F1YXJlcm9vdCAwLjAxNjggLT4gMC4xMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMDUgc3F1YXJlcm9vdCAwLjE2OSAtPiAwLjQxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMwNiBzcXVhcmVyb290IDAuMDE2OSAtPiAwLjEzCitzcXR4MzMwNyBzcXVhcmVyb290IDAuMTcxIC0+IDAuNDE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzA4IHNxdWFyZXJvb3QgMC4wMTcxIC0+IDAuMTMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzA5IHNxdWFyZXJvb3QgMC4xNzIgLT4gMC40MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMTAgc3F1YXJlcm9vdCAwLjAxNzIgLT4gMC4xMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMTEgc3F1YXJlcm9vdCAwLjE3MyAtPiAwLjQxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxMiBzcXVhcmVyb290IDAuMDE3MyAtPiAwLjEzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxMyBzcXVhcmVyb290IDAuMTc0IC0+IDAuNDE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzE0IHNxdWFyZXJvb3QgMC4wMTc0IC0+IDAuMTMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzE1IHNxdWFyZXJvb3QgMC4xNzUgLT4gMC40MTggIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMTYgc3F1YXJlcm9vdCAwLjAxNzUgLT4gMC4xMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMTcgc3F1YXJlcm9vdCAwLjE3NiAtPiAwLjQyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxOCBzcXVhcmVyb290IDAuMDE3NiAtPiAwLjEzMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMxOSBzcXVhcmVyb290IDAuMTc3IC0+IDAuNDIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzIwIHNxdWFyZXJvb3QgMC4wMTc3IC0+IDAuMTMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzIxIHNxdWFyZXJvb3QgMC4xNzggLT4gMC40MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjIgc3F1YXJlcm9vdCAwLjAxNzggLT4gMC4xMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjMgc3F1YXJlcm9vdCAwLjE3OSAtPiAwLjQyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMyNCBzcXVhcmVyb290IDAuMDE3OSAtPiAwLjEzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMyNSBzcXVhcmVyb290IDAuMTgxIC0+IDAuNDI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzI2IHNxdWFyZXJvb3QgMC4wMTgxIC0+IDAuMTM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzI3IHNxdWFyZXJvb3QgMC4xODIgLT4gMC40MjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjggc3F1YXJlcm9vdCAwLjAxODIgLT4gMC4xMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMjkgc3F1YXJlcm9vdCAwLjE4MyAtPiAwLjQyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMzMCBzcXVhcmVyb290IDAuMDE4MyAtPiAwLjEzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMzMSBzcXVhcmVyb290IDAuMTg0IC0+IDAuNDI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzMyIHNxdWFyZXJvb3QgMC4wMTg0IC0+IDAuMTM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzMzIHNxdWFyZXJvb3QgMC4xODUgLT4gMC40MzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMzQgc3F1YXJlcm9vdCAwLjAxODUgLT4gMC4xMzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzMzUgc3F1YXJlcm9vdCAwLjE4NiAtPiAwLjQzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMzNiBzcXVhcmVyb290IDAuMDE4NiAtPiAwLjEzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzMzNyBzcXVhcmVyb290IDAuMTg3IC0+IDAuNDMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzM4IHNxdWFyZXJvb3QgMC4wMTg3IC0+IDAuMTM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzM5IHNxdWFyZXJvb3QgMC4xODggLT4gMC40MzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNDAgc3F1YXJlcm9vdCAwLjAxODggLT4gMC4xMzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNDEgc3F1YXJlcm9vdCAwLjE4OSAtPiAwLjQzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0MiBzcXVhcmVyb290IDAuMDE4OSAtPiAwLjEzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0MyBzcXVhcmVyb290IDAuMTkxIC0+IDAuNDM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzQ0IHNxdWFyZXJvb3QgMC4wMTkxIC0+IDAuMTM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzQ1IHNxdWFyZXJvb3QgMC4xOTIgLT4gMC40MzggIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNDYgc3F1YXJlcm9vdCAwLjAxOTIgLT4gMC4xMzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNDcgc3F1YXJlcm9vdCAwLjE5MyAtPiAwLjQzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0OCBzcXVhcmVyb290IDAuMDE5MyAtPiAwLjEzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM0OSBzcXVhcmVyb290IDAuMTk0IC0+IDAuNDQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzUwIHNxdWFyZXJvb3QgMC4wMTk0IC0+IDAuMTM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzUxIHNxdWFyZXJvb3QgMC4xOTUgLT4gMC40NDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTIgc3F1YXJlcm9vdCAwLjAxOTUgLT4gMC4xNDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTMgc3F1YXJlcm9vdCAwLjE5NiAtPiAwLjQ0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM1NCBzcXVhcmVyb290IDAuMDE5NiAtPiAwLjE0CitzcXR4MzM1NSBzcXVhcmVyb290IDAuMTk3IC0+IDAuNDQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzU2IHNxdWFyZXJvb3QgMC4wMTk3IC0+IDAuMTQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzU3IHNxdWFyZXJvb3QgMC4xOTggLT4gMC40NDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTggc3F1YXJlcm9vdCAwLjAxOTggLT4gMC4xNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNTkgc3F1YXJlcm9vdCAwLjE5OSAtPiAwLjQ0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM2MCBzcXVhcmVyb290IDAuMDE5OSAtPiAwLjE0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM2MSBzcXVhcmVyb290IDAuMjAxIC0+IDAuNDQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzYyIHNxdWFyZXJvb3QgMC4wMjAxIC0+IDAuMTQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzYzIHNxdWFyZXJvb3QgMC4yMDIgLT4gMC40NDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNjQgc3F1YXJlcm9vdCAwLjAyMDIgLT4gMC4xNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNjUgc3F1YXJlcm9vdCAwLjIwMyAtPiAwLjQ1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM2NiBzcXVhcmVyb290IDAuMDIwMyAtPiAwLjE0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM2NyBzcXVhcmVyb290IDAuMjA0IC0+IDAuNDUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzY4IHNxdWFyZXJvb3QgMC4wMjA0IC0+IDAuMTQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzY5IHNxdWFyZXJvb3QgMC4yMDUgLT4gMC40NTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNzAgc3F1YXJlcm9vdCAwLjAyMDUgLT4gMC4xNDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNzEgc3F1YXJlcm9vdCAwLjIwNiAtPiAwLjQ1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3MiBzcXVhcmVyb290IDAuMDIwNiAtPiAwLjE0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3MyBzcXVhcmVyb290IDAuMjA3IC0+IDAuNDU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzc0IHNxdWFyZXJvb3QgMC4wMjA3IC0+IDAuMTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzc1IHNxdWFyZXJvb3QgMC4yMDggLT4gMC40NTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNzYgc3F1YXJlcm9vdCAwLjAyMDggLT4gMC4xNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzNzcgc3F1YXJlcm9vdCAwLjIwOSAtPiAwLjQ1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3OCBzcXVhcmVyb290IDAuMDIwOSAtPiAwLjE0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM3OSBzcXVhcmVyb290IDAuMjExIC0+IDAuNDU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzgwIHNxdWFyZXJvb3QgMC4wMjExIC0+IDAuMTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzgxIHNxdWFyZXJvb3QgMC4yMTIgLT4gMC40NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODIgc3F1YXJlcm9vdCAwLjAyMTIgLT4gMC4xNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODMgc3F1YXJlcm9vdCAwLjIxMyAtPiAwLjQ2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM4NCBzcXVhcmVyb290IDAuMDIxMyAtPiAwLjE0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM4NSBzcXVhcmVyb290IDAuMjE0IC0+IDAuNDYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzg2IHNxdWFyZXJvb3QgMC4wMjE0IC0+IDAuMTQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzg3IHNxdWFyZXJvb3QgMC4yMTUgLT4gMC40NjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODggc3F1YXJlcm9vdCAwLjAyMTUgLT4gMC4xNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzODkgc3F1YXJlcm9vdCAwLjIxNiAtPiAwLjQ2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM5MCBzcXVhcmVyb290IDAuMDIxNiAtPiAwLjE0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM5MSBzcXVhcmVyb290IDAuMjE3IC0+IDAuNDY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzkyIHNxdWFyZXJvb3QgMC4wMjE3IC0+IDAuMTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzkzIHNxdWFyZXJvb3QgMC4yMTggLT4gMC40NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDMzOTQgc3F1YXJlcm9vdCAwLjAyMTggLT4gMC4xNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDMzOTUgc3F1YXJlcm9vdCAwLjIxOSAtPiAwLjQ2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM5NiBzcXVhcmVyb290IDAuMDIxOSAtPiAwLjE0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzM5NyBzcXVhcmVyb290IDAuMjIxIC0+IDAuNDcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzk4IHNxdWFyZXJvb3QgMC4wMjIxIC0+IDAuMTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzMzk5IHNxdWFyZXJvb3QgMC4yMjIgLT4gMC40NzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MDAgc3F1YXJlcm9vdCAwLjAyMjIgLT4gMC4xNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MDEgc3F1YXJlcm9vdCAwLjIyMyAtPiAwLjQ3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQwMiBzcXVhcmVyb290IDAuMDIyMyAtPiAwLjE0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQwMyBzcXVhcmVyb290IDAuMjI0IC0+IDAuNDczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDA0IHNxdWFyZXJvb3QgMC4wMjI0IC0+IDAuMTUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDA1IHNxdWFyZXJvb3QgMC4yMjUgLT4gMC40NzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MDYgc3F1YXJlcm9vdCAwLjAyMjUgLT4gMC4xNQorc3F0eDM0MDcgc3F1YXJlcm9vdCAwLjIyNiAtPiAwLjQ3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQwOCBzcXVhcmVyb290IDAuMDIyNiAtPiAwLjE1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQwOSBzcXVhcmVyb290IDAuMjI3IC0+IDAuNDc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDEwIHNxdWFyZXJvb3QgMC4wMjI3IC0+IDAuMTUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDExIHNxdWFyZXJvb3QgMC4yMjggLT4gMC40NzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTIgc3F1YXJlcm9vdCAwLjAyMjggLT4gMC4xNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTMgc3F1YXJlcm9vdCAwLjIyOSAtPiAwLjQ3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQxNCBzcXVhcmVyb290IDAuMDIyOSAtPiAwLjE1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQxNSBzcXVhcmVyb290IDAuMjMxIC0+IDAuNDgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDE2IHNxdWFyZXJvb3QgMC4wMjMxIC0+IDAuMTUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDE3IHNxdWFyZXJvb3QgMC4yMzIgLT4gMC40ODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTggc3F1YXJlcm9vdCAwLjAyMzIgLT4gMC4xNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MTkgc3F1YXJlcm9vdCAwLjIzMyAtPiAwLjQ4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQyMCBzcXVhcmVyb290IDAuMDIzMyAtPiAwLjE1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQyMSBzcXVhcmVyb290IDAuMjM0IC0+IDAuNDg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDIyIHNxdWFyZXJvb3QgMC4wMjM0IC0+IDAuMTUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDIzIHNxdWFyZXJvb3QgMC4yMzUgLT4gMC40ODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MjQgc3F1YXJlcm9vdCAwLjAyMzUgLT4gMC4xNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MjUgc3F1YXJlcm9vdCAwLjIzNiAtPiAwLjQ4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQyNiBzcXVhcmVyb290IDAuMDIzNiAtPiAwLjE1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQyNyBzcXVhcmVyb290IDAuMjM3IC0+IDAuNDg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDI4IHNxdWFyZXJvb3QgMC4wMjM3IC0+IDAuMTU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDI5IHNxdWFyZXJvb3QgMC4yMzggLT4gMC40ODggIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MzAgc3F1YXJlcm9vdCAwLjAyMzggLT4gMC4xNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MzEgc3F1YXJlcm9vdCAwLjIzOSAtPiAwLjQ4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzMiBzcXVhcmVyb290IDAuMDIzOSAtPiAwLjE1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzMyBzcXVhcmVyb290IDAuMjQxIC0+IDAuNDkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDM0IHNxdWFyZXJvb3QgMC4wMjQxIC0+IDAuMTU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDM1IHNxdWFyZXJvb3QgMC4yNDIgLT4gMC40OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0MzYgc3F1YXJlcm9vdCAwLjAyNDIgLT4gMC4xNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0Mzcgc3F1YXJlcm9vdCAwLjI0MyAtPiAwLjQ5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzOCBzcXVhcmVyb290IDAuMDI0MyAtPiAwLjE1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQzOSBzcXVhcmVyb290IDAuMjQ0IC0+IDAuNDk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDQwIHNxdWFyZXJvb3QgMC4wMjQ0IC0+IDAuMTU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDQxIHNxdWFyZXJvb3QgMC4yNDUgLT4gMC40OTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDIgc3F1YXJlcm9vdCAwLjAyNDUgLT4gMC4xNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDMgc3F1YXJlcm9vdCAwLjI0NiAtPiAwLjQ5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ0NCBzcXVhcmVyb290IDAuMDI0NiAtPiAwLjE1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ0NSBzcXVhcmVyb290IDAuMjQ3IC0+IDAuNDk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDQ2IHNxdWFyZXJvb3QgMC4wMjQ3IC0+IDAuMTU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDQ3IHNxdWFyZXJvb3QgMC4yNDggLT4gMC40OTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDggc3F1YXJlcm9vdCAwLjAyNDggLT4gMC4xNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NDkgc3F1YXJlcm9vdCAwLjI0OSAtPiAwLjQ5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ1MCBzcXVhcmVyb290IDAuMDI0OSAtPiAwLjE1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ1MSBzcXVhcmVyb290IDAuMjUxIC0+IDAuNTAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDUyIHNxdWFyZXJvb3QgMC4wMjUxIC0+IDAuMTU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDUzIHNxdWFyZXJvb3QgMC4yNTIgLT4gMC41MDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NTQgc3F1YXJlcm9vdCAwLjAyNTIgLT4gMC4xNTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NTUgc3F1YXJlcm9vdCAwLjI1MyAtPiAwLjUwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ1NiBzcXVhcmVyb290IDAuMDI1MyAtPiAwLjE1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ1NyBzcXVhcmVyb290IDAuMjU0IC0+IDAuNTA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDU4IHNxdWFyZXJvb3QgMC4wMjU0IC0+IDAuMTU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDU5IHNxdWFyZXJvb3QgMC4yNTUgLT4gMC41MDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NjAgc3F1YXJlcm9vdCAwLjAyNTUgLT4gMC4xNjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NjEgc3F1YXJlcm9vdCAwLjI1NiAtPiAwLjUwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ2MiBzcXVhcmVyb290IDAuMDI1NiAtPiAwLjE2CitzcXR4MzQ2MyBzcXVhcmVyb290IDAuMjU3IC0+IDAuNTA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDY0IHNxdWFyZXJvb3QgMC4wMjU3IC0+IDAuMTYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDY1IHNxdWFyZXJvb3QgMC4yNTggLT4gMC41MDggIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NjYgc3F1YXJlcm9vdCAwLjAyNTggLT4gMC4xNjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0Njcgc3F1YXJlcm9vdCAwLjI1OSAtPiAwLjUwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ2OCBzcXVhcmVyb290IDAuMDI1OSAtPiAwLjE2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ2OSBzcXVhcmVyb290IDAuMjYxIC0+IDAuNTExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDcwIHNxdWFyZXJvb3QgMC4wMjYxIC0+IDAuMTYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDcxIHNxdWFyZXJvb3QgMC4yNjIgLT4gMC41MTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NzIgc3F1YXJlcm9vdCAwLjAyNjIgLT4gMC4xNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0NzMgc3F1YXJlcm9vdCAwLjI2MyAtPiAwLjUxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ3NCBzcXVhcmVyb290IDAuMDI2MyAtPiAwLjE2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ3NSBzcXVhcmVyb290IDAuMjY0IC0+IDAuNTE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDc2IHNxdWFyZXJvb3QgMC4wMjY0IC0+IDAuMTYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDc3IHNxdWFyZXJvb3QgMC4yNjUgLT4gMC41MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0Nzggc3F1YXJlcm9vdCAwLjAyNjUgLT4gMC4xNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0Nzkgc3F1YXJlcm9vdCAwLjI2NiAtPiAwLjUxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ4MCBzcXVhcmVyb290IDAuMDI2NiAtPiAwLjE2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ4MSBzcXVhcmVyb290IDAuMjY3IC0+IDAuNTE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDgyIHNxdWFyZXJvb3QgMC4wMjY3IC0+IDAuMTYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDgzIHNxdWFyZXJvb3QgMC4yNjggLT4gMC41MTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM0ODQgc3F1YXJlcm9vdCAwLjAyNjggLT4gMC4xNjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0ODUgc3F1YXJlcm9vdCAwLjI2OSAtPiAwLjUxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ4NiBzcXVhcmVyb290IDAuMDI2OSAtPiAwLjE2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ4NyBzcXVhcmVyb290IDAuMjcxIC0+IDAuNTIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDg4IHNxdWFyZXJvb3QgMC4wMjcxIC0+IDAuMTY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDg5IHNxdWFyZXJvb3QgMC4yNzIgLT4gMC41MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0OTAgc3F1YXJlcm9vdCAwLjAyNzIgLT4gMC4xNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0OTEgc3F1YXJlcm9vdCAwLjI3MyAtPiAwLjUyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5MiBzcXVhcmVyb290IDAuMDI3MyAtPiAwLjE2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5MyBzcXVhcmVyb290IDAuMjc0IC0+IDAuNTIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDk0IHNxdWFyZXJvb3QgMC4wMjc0IC0+IDAuMTY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNDk1IHNxdWFyZXJvb3QgMC4yNzUgLT4gMC41MjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0OTYgc3F1YXJlcm9vdCAwLjAyNzUgLT4gMC4xNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM0OTcgc3F1YXJlcm9vdCAwLjI3NiAtPiAwLjUyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5OCBzcXVhcmVyb290IDAuMDI3NiAtPiAwLjE2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzQ5OSBzcXVhcmVyb290IDAuMjc3IC0+IDAuNTI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTAwIHNxdWFyZXJvb3QgMC4wMjc3IC0+IDAuMTY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTAxIHNxdWFyZXJvb3QgMC4yNzggLT4gMC41MjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDIgc3F1YXJlcm9vdCAwLjAyNzggLT4gMC4xNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDMgc3F1YXJlcm9vdCAwLjI3OSAtPiAwLjUyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUwNCBzcXVhcmVyb290IDAuMDI3OSAtPiAwLjE2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUwNSBzcXVhcmVyb290IDAuMjgxIC0+IDAuNTMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTA2IHNxdWFyZXJvb3QgMC4wMjgxIC0+IDAuMTY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTA3IHNxdWFyZXJvb3QgMC4yODIgLT4gMC41MzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDggc3F1YXJlcm9vdCAwLjAyODIgLT4gMC4xNjggIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MDkgc3F1YXJlcm9vdCAwLjI4MyAtPiAwLjUzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUxMCBzcXVhcmVyb290IDAuMDI4MyAtPiAwLjE2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUxMSBzcXVhcmVyb290IDAuMjg0IC0+IDAuNTMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTEyIHNxdWFyZXJvb3QgMC4wMjg0IC0+IDAuMTY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTEzIHNxdWFyZXJvb3QgMC4yODUgLT4gMC41MzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MTQgc3F1YXJlcm9vdCAwLjAyODUgLT4gMC4xNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MTUgc3F1YXJlcm9vdCAwLjI4NiAtPiAwLjUzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUxNiBzcXVhcmVyb290IDAuMDI4NiAtPiAwLjE2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUxNyBzcXVhcmVyb290IDAuMjg3IC0+IDAuNTM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTE4IHNxdWFyZXJvb3QgMC4wMjg3IC0+IDAuMTY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTE5IHNxdWFyZXJvb3QgMC4yODggLT4gMC41MzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MjAgc3F1YXJlcm9vdCAwLjAyODggLT4gMC4xNzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MjEgc3F1YXJlcm9vdCAwLjI4OSAtPiAwLjUzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUyMiBzcXVhcmVyb290IDAuMDI4OSAtPiAwLjE3CitzcXR4MzUyMyBzcXVhcmVyb290IDAuMjkxIC0+IDAuNTM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTI0IHNxdWFyZXJvb3QgMC4wMjkxIC0+IDAuMTcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTI1IHNxdWFyZXJvb3QgMC4yOTIgLT4gMC41NDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MjYgc3F1YXJlcm9vdCAwLjAyOTIgLT4gMC4xNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Mjcgc3F1YXJlcm9vdCAwLjI5MyAtPiAwLjU0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUyOCBzcXVhcmVyb290IDAuMDI5MyAtPiAwLjE3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUyOSBzcXVhcmVyb290IDAuMjk0IC0+IDAuNTQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTMwIHNxdWFyZXJvb3QgMC4wMjk0IC0+IDAuMTcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTMxIHNxdWFyZXJvb3QgMC4yOTUgLT4gMC41NDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MzIgc3F1YXJlcm9vdCAwLjAyOTUgLT4gMC4xNzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1MzMgc3F1YXJlcm9vdCAwLjI5NiAtPiAwLjU0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUzNCBzcXVhcmVyb290IDAuMDI5NiAtPiAwLjE3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzUzNSBzcXVhcmVyb290IDAuMjk3IC0+IDAuNTQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTM2IHNxdWFyZXJvb3QgMC4wMjk3IC0+IDAuMTcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTM3IHNxdWFyZXJvb3QgMC4yOTggLT4gMC41NDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Mzggc3F1YXJlcm9vdCAwLjAyOTggLT4gMC4xNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Mzkgc3F1YXJlcm9vdCAwLjI5OSAtPiAwLjU0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU0MCBzcXVhcmVyb290IDAuMDI5OSAtPiAwLjE3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU0MSBzcXVhcmVyb290IDAuMzAxIC0+IDAuNTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQyIHNxdWFyZXJvb3QgMC4wMzAxIC0+IDAuMTczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQzIHNxdWFyZXJvb3QgMC4zMDIgLT4gMC41NTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NDQgc3F1YXJlcm9vdCAwLjAzMDIgLT4gMC4xNzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NDUgc3F1YXJlcm9vdCAwLjMwMyAtPiAwLjU1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU0NiBzcXVhcmVyb290IDAuMDMwMyAtPiAwLjE3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU0NyBzcXVhcmVyb290IDAuMzA0IC0+IDAuNTUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQ4IHNxdWFyZXJvb3QgMC4wMzA0IC0+IDAuMTc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTQ5IHNxdWFyZXJvb3QgMC4zMDUgLT4gMC41NTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NTAgc3F1YXJlcm9vdCAwLjAzMDUgLT4gMC4xNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NTEgc3F1YXJlcm9vdCAwLjMwNiAtPiAwLjU1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1MiBzcXVhcmVyb290IDAuMDMwNiAtPiAwLjE3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1MyBzcXVhcmVyb290IDAuMzA3IC0+IDAuNTU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTU0IHNxdWFyZXJvb3QgMC4wMzA3IC0+IDAuMTc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTU1IHNxdWFyZXJvb3QgMC4zMDggLT4gMC41NTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NTYgc3F1YXJlcm9vdCAwLjAzMDggLT4gMC4xNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NTcgc3F1YXJlcm9vdCAwLjMwOSAtPiAwLjU1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1OCBzcXVhcmVyb290IDAuMDMwOSAtPiAwLjE3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU1OSBzcXVhcmVyb290IDAuMzExIC0+IDAuNTU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTYwIHNxdWFyZXJvb3QgMC4wMzExIC0+IDAuMTc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTYxIHNxdWFyZXJvb3QgMC4zMTIgLT4gMC41NTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NjIgc3F1YXJlcm9vdCAwLjAzMTIgLT4gMC4xNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NjMgc3F1YXJlcm9vdCAwLjMxMyAtPiAwLjU1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU2NCBzcXVhcmVyb290IDAuMDMxMyAtPiAwLjE3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU2NSBzcXVhcmVyb290IDAuMzE0IC0+IDAuNTYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTY2IHNxdWFyZXJvb3QgMC4wMzE0IC0+IDAuMTc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTY3IHNxdWFyZXJvb3QgMC4zMTUgLT4gMC41NjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Njggc3F1YXJlcm9vdCAwLjAzMTUgLT4gMC4xNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1Njkgc3F1YXJlcm9vdCAwLjMxNiAtPiAwLjU2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU3MCBzcXVhcmVyb290IDAuMDMxNiAtPiAwLjE3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU3MSBzcXVhcmVyb290IDAuMzE3IC0+IDAuNTYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTcyIHNxdWFyZXJvb3QgMC4wMzE3IC0+IDAuMTc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTczIHNxdWFyZXJvb3QgMC4zMTggLT4gMC41NjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NzQgc3F1YXJlcm9vdCAwLjAzMTggLT4gMC4xNzggIEluZXhhY3QgUm91bmRlZAorc3F0eDM1NzUgc3F1YXJlcm9vdCAwLjMxOSAtPiAwLjU2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU3NiBzcXVhcmVyb290IDAuMDMxOSAtPiAwLjE3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU3NyBzcXVhcmVyb290IDAuMzIxIC0+IDAuNTY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTc4IHNxdWFyZXJvb3QgMC4wMzIxIC0+IDAuMTc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTc5IHNxdWFyZXJvb3QgMC4zMjIgLT4gMC41NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1ODAgc3F1YXJlcm9vdCAwLjAzMjIgLT4gMC4xNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1ODEgc3F1YXJlcm9vdCAwLjMyMyAtPiAwLjU2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4MiBzcXVhcmVyb290IDAuMDMyMyAtPiAwLjE4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4MyBzcXVhcmVyb290IDAuMzI0IC0+IDAuNTY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTg0IHNxdWFyZXJvb3QgMC4wMzI0IC0+IDAuMTgKK3NxdHgzNTg1IHNxdWFyZXJvb3QgMC4zMjUgLT4gMC41NzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1ODYgc3F1YXJlcm9vdCAwLjAzMjUgLT4gMC4xODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1ODcgc3F1YXJlcm9vdCAwLjMyNiAtPiAwLjU3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4OCBzcXVhcmVyb290IDAuMDMyNiAtPiAwLjE4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU4OSBzcXVhcmVyb290IDAuMzI3IC0+IDAuNTcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTkwIHNxdWFyZXJvb3QgMC4wMzI3IC0+IDAuMTgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTkxIHNxdWFyZXJvb3QgMC4zMjggLT4gMC41NzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTIgc3F1YXJlcm9vdCAwLjAzMjggLT4gMC4xODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTMgc3F1YXJlcm9vdCAwLjMyOSAtPiAwLjU3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU5NCBzcXVhcmVyb290IDAuMDMyOSAtPiAwLjE4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzU5NSBzcXVhcmVyb290IDAuMzMxIC0+IDAuNTc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTk2IHNxdWFyZXJvb3QgMC4wMzMxIC0+IDAuMTgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNTk3IHNxdWFyZXJvb3QgMC4zMzIgLT4gMC41NzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTggc3F1YXJlcm9vdCAwLjAzMzIgLT4gMC4xODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM1OTkgc3F1YXJlcm9vdCAwLjMzMyAtPiAwLjU3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYwMCBzcXVhcmVyb290IDAuMDMzMyAtPiAwLjE4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYwMSBzcXVhcmVyb290IDAuMzM0IC0+IDAuNTc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjAyIHNxdWFyZXJvb3QgMC4wMzM0IC0+IDAuMTgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjAzIHNxdWFyZXJvb3QgMC4zMzUgLT4gMC41NzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MDQgc3F1YXJlcm9vdCAwLjAzMzUgLT4gMC4xODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MDUgc3F1YXJlcm9vdCAwLjMzNiAtPiAwLjU4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYwNiBzcXVhcmVyb290IDAuMDMzNiAtPiAwLjE4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYwNyBzcXVhcmVyb290IDAuMzM3IC0+IDAuNTgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjA4IHNxdWFyZXJvb3QgMC4wMzM3IC0+IDAuMTg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjA5IHNxdWFyZXJvb3QgMC4zMzggLT4gMC41ODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MTAgc3F1YXJlcm9vdCAwLjAzMzggLT4gMC4xODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MTEgc3F1YXJlcm9vdCAwLjMzOSAtPiAwLjU4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxMiBzcXVhcmVyb290IDAuMDMzOSAtPiAwLjE4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxMyBzcXVhcmVyb290IDAuMzQxIC0+IDAuNTg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjE0IHNxdWFyZXJvb3QgMC4wMzQxIC0+IDAuMTg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjE1IHNxdWFyZXJvb3QgMC4zNDIgLT4gMC41ODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MTYgc3F1YXJlcm9vdCAwLjAzNDIgLT4gMC4xODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MTcgc3F1YXJlcm9vdCAwLjM0MyAtPiAwLjU4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxOCBzcXVhcmVyb290IDAuMDM0MyAtPiAwLjE4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYxOSBzcXVhcmVyb290IDAuMzQ0IC0+IDAuNTg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjIwIHNxdWFyZXJvb3QgMC4wMzQ0IC0+IDAuMTg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjIxIHNxdWFyZXJvb3QgMC4zNDUgLT4gMC41ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MjIgc3F1YXJlcm9vdCAwLjAzNDUgLT4gMC4xODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MjMgc3F1YXJlcm9vdCAwLjM0NiAtPiAwLjU4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYyNCBzcXVhcmVyb290IDAuMDM0NiAtPiAwLjE4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYyNSBzcXVhcmVyb290IDAuMzQ3IC0+IDAuNTg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjI2IHNxdWFyZXJvb3QgMC4wMzQ3IC0+IDAuMTg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjI3IHNxdWFyZXJvb3QgMC4zNDggLT4gMC41OTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Mjggc3F1YXJlcm9vdCAwLjAzNDggLT4gMC4xODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Mjkgc3F1YXJlcm9vdCAwLjM0OSAtPiAwLjU5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYzMCBzcXVhcmVyb290IDAuMDM0OSAtPiAwLjE4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYzMSBzcXVhcmVyb290IDAuMzUxIC0+IDAuNTkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjMyIHNxdWFyZXJvb3QgMC4wMzUxIC0+IDAuMTg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjMzIHNxdWFyZXJvb3QgMC4zNTIgLT4gMC41OTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MzQgc3F1YXJlcm9vdCAwLjAzNTIgLT4gMC4xODggIEluZXhhY3QgUm91bmRlZAorc3F0eDM2MzUgc3F1YXJlcm9vdCAwLjM1MyAtPiAwLjU5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYzNiBzcXVhcmVyb290IDAuMDM1MyAtPiAwLjE4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzYzNyBzcXVhcmVyb290IDAuMzU0IC0+IDAuNTk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjM4IHNxdWFyZXJvb3QgMC4wMzU0IC0+IDAuMTg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjM5IHNxdWFyZXJvb3QgMC4zNTUgLT4gMC41OTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NDAgc3F1YXJlcm9vdCAwLjAzNTUgLT4gMC4xODggIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NDEgc3F1YXJlcm9vdCAwLjM1NiAtPiAwLjU5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0MiBzcXVhcmVyb290IDAuMDM1NiAtPiAwLjE4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0MyBzcXVhcmVyb290IDAuMzU3IC0+IDAuNTk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjQ0IHNxdWFyZXJvb3QgMC4wMzU3IC0+IDAuMTg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjQ1IHNxdWFyZXJvb3QgMC4zNTggLT4gMC41OTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NDYgc3F1YXJlcm9vdCAwLjAzNTggLT4gMC4xODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NDcgc3F1YXJlcm9vdCAwLjM1OSAtPiAwLjU5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0OCBzcXVhcmVyb290IDAuMDM1OSAtPiAwLjE4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY0OSBzcXVhcmVyb290IDAuMzYxIC0+IDAuNjAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjUwIHNxdWFyZXJvb3QgMC4wMzYxIC0+IDAuMTkKK3NxdHgzNjUxIHNxdWFyZXJvb3QgMC4zNjIgLT4gMC42MDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NTIgc3F1YXJlcm9vdCAwLjAzNjIgLT4gMC4xOTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NTMgc3F1YXJlcm9vdCAwLjM2MyAtPiAwLjYwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY1NCBzcXVhcmVyb290IDAuMDM2MyAtPiAwLjE5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY1NSBzcXVhcmVyb290IDAuMzY0IC0+IDAuNjAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjU2IHNxdWFyZXJvb3QgMC4wMzY0IC0+IDAuMTkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjU3IHNxdWFyZXJvb3QgMC4zNjUgLT4gMC42MDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NTggc3F1YXJlcm9vdCAwLjAzNjUgLT4gMC4xOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NTkgc3F1YXJlcm9vdCAwLjM2NiAtPiAwLjYwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY2MCBzcXVhcmVyb290IDAuMDM2NiAtPiAwLjE5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY2MSBzcXVhcmVyb290IDAuMzY3IC0+IDAuNjA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjYyIHNxdWFyZXJvb3QgMC4wMzY3IC0+IDAuMTkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjYzIHNxdWFyZXJvb3QgMC4zNjggLT4gMC42MDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NjQgc3F1YXJlcm9vdCAwLjAzNjggLT4gMC4xOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NjUgc3F1YXJlcm9vdCAwLjM2OSAtPiAwLjYwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY2NiBzcXVhcmVyb290IDAuMDM2OSAtPiAwLjE5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY2NyBzcXVhcmVyb290IDAuMzcxIC0+IDAuNjA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjY4IHNxdWFyZXJvb3QgMC4wMzcxIC0+IDAuMTkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjY5IHNxdWFyZXJvb3QgMC4zNzIgLT4gMC42MTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NzAgc3F1YXJlcm9vdCAwLjAzNzIgLT4gMC4xOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NzEgc3F1YXJlcm9vdCAwLjM3MyAtPiAwLjYxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3MiBzcXVhcmVyb290IDAuMDM3MyAtPiAwLjE5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3MyBzcXVhcmVyb290IDAuMzc0IC0+IDAuNjEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjc0IHNxdWFyZXJvb3QgMC4wMzc0IC0+IDAuMTkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjc1IHNxdWFyZXJvb3QgMC4zNzUgLT4gMC42MTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2NzYgc3F1YXJlcm9vdCAwLjAzNzUgLT4gMC4xOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2Nzcgc3F1YXJlcm9vdCAwLjM3NiAtPiAwLjYxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3OCBzcXVhcmVyb290IDAuMDM3NiAtPiAwLjE5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY3OSBzcXVhcmVyb290IDAuMzc3IC0+IDAuNjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjgwIHNxdWFyZXJvb3QgMC4wMzc3IC0+IDAuMTk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjgxIHNxdWFyZXJvb3QgMC4zNzggLT4gMC42MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODIgc3F1YXJlcm9vdCAwLjAzNzggLT4gMC4xOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODMgc3F1YXJlcm9vdCAwLjM3OSAtPiAwLjYxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY4NCBzcXVhcmVyb290IDAuMDM3OSAtPiAwLjE5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY4NSBzcXVhcmVyb290IDAuMzgxIC0+IDAuNjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjg2IHNxdWFyZXJvb3QgMC4wMzgxIC0+IDAuMTk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjg3IHNxdWFyZXJvb3QgMC4zODIgLT4gMC42MTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODggc3F1YXJlcm9vdCAwLjAzODIgLT4gMC4xOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2ODkgc3F1YXJlcm9vdCAwLjM4MyAtPiAwLjYxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY5MCBzcXVhcmVyb290IDAuMDM4MyAtPiAwLjE5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY5MSBzcXVhcmVyb290IDAuMzg0IC0+IDAuNjIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjkyIHNxdWFyZXJvb3QgMC4wMzg0IC0+IDAuMTk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjkzIHNxdWFyZXJvb3QgMC4zODUgLT4gMC42MjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2OTQgc3F1YXJlcm9vdCAwLjAzODUgLT4gMC4xOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM2OTUgc3F1YXJlcm9vdCAwLjM4NiAtPiAwLjYyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY5NiBzcXVhcmVyb290IDAuMDM4NiAtPiAwLjE5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzY5NyBzcXVhcmVyb290IDAuMzg3IC0+IDAuNjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjk4IHNxdWFyZXJvb3QgMC4wMzg3IC0+IDAuMTk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNjk5IHNxdWFyZXJvb3QgMC4zODggLT4gMC42MjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MDAgc3F1YXJlcm9vdCAwLjAzODggLT4gMC4xOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MDEgc3F1YXJlcm9vdCAwLjM4OSAtPiAwLjYyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwMiBzcXVhcmVyb290IDAuMDM4OSAtPiAwLjE5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwMyBzcXVhcmVyb290IDAuMzkxIC0+IDAuNjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzA0IHNxdWFyZXJvb3QgMC4wMzkxIC0+IDAuMTk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzA1IHNxdWFyZXJvb3QgMC4zOTIgLT4gMC42MjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MDYgc3F1YXJlcm9vdCAwLjAzOTIgLT4gMC4xOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MDcgc3F1YXJlcm9vdCAwLjM5MyAtPiAwLjYyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwOCBzcXVhcmVyb290IDAuMDM5MyAtPiAwLjE5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcwOSBzcXVhcmVyb290IDAuMzk0IC0+IDAuNjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzEwIHNxdWFyZXJvb3QgMC4wMzk0IC0+IDAuMTk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzExIHNxdWFyZXJvb3QgMC4zOTUgLT4gMC42MjggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTIgc3F1YXJlcm9vdCAwLjAzOTUgLT4gMC4xOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTMgc3F1YXJlcm9vdCAwLjM5NiAtPiAwLjYyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcxNCBzcXVhcmVyb290IDAuMDM5NiAtPiAwLjE5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcxNSBzcXVhcmVyb290IDAuMzk3IC0+IDAuNjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzE2IHNxdWFyZXJvb3QgMC4wMzk3IC0+IDAuMTk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzE3IHNxdWFyZXJvb3QgMC4zOTggLT4gMC42MzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTggc3F1YXJlcm9vdCAwLjAzOTggLT4gMC4xOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MTkgc3F1YXJlcm9vdCAwLjM5OSAtPiAwLjYzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcyMCBzcXVhcmVyb290IDAuMDM5OSAtPiAwLjIwMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcyMSBzcXVhcmVyb290IDAuNDAxIC0+IDAuNjMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzIyIHNxdWFyZXJvb3QgMC4wNDAxIC0+IDAuMjAwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzIzIHNxdWFyZXJvb3QgMC40MDIgLT4gMC42MzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MjQgc3F1YXJlcm9vdCAwLjA0MDIgLT4gMC4yMDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MjUgc3F1YXJlcm9vdCAwLjQwMyAtPiAwLjYzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcyNiBzcXVhcmVyb290IDAuMDQwMyAtPiAwLjIwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzcyNyBzcXVhcmVyb290IDAuNDA0IC0+IDAuNjM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzI4IHNxdWFyZXJvb3QgMC4wNDA0IC0+IDAuMjAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzI5IHNxdWFyZXJvb3QgMC40MDUgLT4gMC42MzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MzAgc3F1YXJlcm9vdCAwLjA0MDUgLT4gMC4yMDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MzEgc3F1YXJlcm9vdCAwLjQwNiAtPiAwLjYzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczMiBzcXVhcmVyb290IDAuMDQwNiAtPiAwLjIwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczMyBzcXVhcmVyb290IDAuNDA3IC0+IDAuNjM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzM0IHNxdWFyZXJvb3QgMC4wNDA3IC0+IDAuMjAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzM1IHNxdWFyZXJvb3QgMC40MDggLT4gMC42MzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3MzYgc3F1YXJlcm9vdCAwLjA0MDggLT4gMC4yMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3Mzcgc3F1YXJlcm9vdCAwLjQwOSAtPiAwLjY0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczOCBzcXVhcmVyb290IDAuMDQwOSAtPiAwLjIwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzczOSBzcXVhcmVyb290IDAuNDExIC0+IDAuNjQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzQwIHNxdWFyZXJvb3QgMC4wNDExIC0+IDAuMjAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzQxIHNxdWFyZXJvb3QgMC40MTIgLT4gMC42NDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDIgc3F1YXJlcm9vdCAwLjA0MTIgLT4gMC4yMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDMgc3F1YXJlcm9vdCAwLjQxMyAtPiAwLjY0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc0NCBzcXVhcmVyb290IDAuMDQxMyAtPiAwLjIwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc0NSBzcXVhcmVyb290IDAuNDE0IC0+IDAuNjQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzQ2IHNxdWFyZXJvb3QgMC4wNDE0IC0+IDAuMjAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzQ3IHNxdWFyZXJvb3QgMC40MTUgLT4gMC42NDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDggc3F1YXJlcm9vdCAwLjA0MTUgLT4gMC4yMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NDkgc3F1YXJlcm9vdCAwLjQxNiAtPiAwLjY0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc1MCBzcXVhcmVyb290IDAuMDQxNiAtPiAwLjIwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc1MSBzcXVhcmVyb290IDAuNDE3IC0+IDAuNjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzUyIHNxdWFyZXJvb3QgMC4wNDE3IC0+IDAuMjA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzUzIHNxdWFyZXJvb3QgMC40MTggLT4gMC42NDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NTQgc3F1YXJlcm9vdCAwLjA0MTggLT4gMC4yMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NTUgc3F1YXJlcm9vdCAwLjQxOSAtPiAwLjY0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc1NiBzcXVhcmVyb290IDAuMDQxOSAtPiAwLjIwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc1NyBzcXVhcmVyb290IDAuNDIxIC0+IDAuNjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzU4IHNxdWFyZXJvb3QgMC4wNDIxIC0+IDAuMjA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzU5IHNxdWFyZXJvb3QgMC40MjIgLT4gMC42NTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NjAgc3F1YXJlcm9vdCAwLjA0MjIgLT4gMC4yMDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NjEgc3F1YXJlcm9vdCAwLjQyMyAtPiAwLjY1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2MiBzcXVhcmVyb290IDAuMDQyMyAtPiAwLjIwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2MyBzcXVhcmVyb290IDAuNDI0IC0+IDAuNjUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzY0IHNxdWFyZXJvb3QgMC4wNDI0IC0+IDAuMjA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzY1IHNxdWFyZXJvb3QgMC40MjUgLT4gMC42NTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NjYgc3F1YXJlcm9vdCAwLjA0MjUgLT4gMC4yMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3Njcgc3F1YXJlcm9vdCAwLjQyNiAtPiAwLjY1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2OCBzcXVhcmVyb290IDAuMDQyNiAtPiAwLjIwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc2OSBzcXVhcmVyb290IDAuNDI3IC0+IDAuNjUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzcwIHNxdWFyZXJvb3QgMC4wNDI3IC0+IDAuMjA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzcxIHNxdWFyZXJvb3QgMC40MjggLT4gMC42NTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NzIgc3F1YXJlcm9vdCAwLjA0MjggLT4gMC4yMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3NzMgc3F1YXJlcm9vdCAwLjQyOSAtPiAwLjY1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc3NCBzcXVhcmVyb290IDAuMDQyOSAtPiAwLjIwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc3NSBzcXVhcmVyb290IDAuNDMxIC0+IDAuNjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzc2IHNxdWFyZXJvb3QgMC4wNDMxIC0+IDAuMjA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzc3IHNxdWFyZXJvb3QgMC40MzIgLT4gMC42NTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3Nzggc3F1YXJlcm9vdCAwLjA0MzIgLT4gMC4yMDggIEluZXhhY3QgUm91bmRlZAorc3F0eDM3Nzkgc3F1YXJlcm9vdCAwLjQzMyAtPiAwLjY1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc4MCBzcXVhcmVyb290IDAuMDQzMyAtPiAwLjIwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc4MSBzcXVhcmVyb290IDAuNDM0IC0+IDAuNjU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzgyIHNxdWFyZXJvb3QgMC4wNDM0IC0+IDAuMjA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzgzIHNxdWFyZXJvb3QgMC40MzUgLT4gMC42NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3ODQgc3F1YXJlcm9vdCAwLjA0MzUgLT4gMC4yMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3ODUgc3F1YXJlcm9vdCAwLjQzNiAtPiAwLjY2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc4NiBzcXVhcmVyb290IDAuMDQzNiAtPiAwLjIwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc4NyBzcXVhcmVyb290IDAuNDM3IC0+IDAuNjYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzg4IHNxdWFyZXJvb3QgMC4wNDM3IC0+IDAuMjA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzg5IHNxdWFyZXJvb3QgMC40MzggLT4gMC42NjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3OTAgc3F1YXJlcm9vdCAwLjA0MzggLT4gMC4yMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3OTEgc3F1YXJlcm9vdCAwLjQzOSAtPiAwLjY2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5MiBzcXVhcmVyb290IDAuMDQzOSAtPiAwLjIxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5MyBzcXVhcmVyb290IDAuNDQxIC0+IDAuNjY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzNzk0IHNxdWFyZXJvb3QgMC4wNDQxIC0+IDAuMjEKK3NxdHgzNzk1IHNxdWFyZXJvb3QgMC40NDIgLT4gMC42NjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3OTYgc3F1YXJlcm9vdCAwLjA0NDIgLT4gMC4yMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM3OTcgc3F1YXJlcm9vdCAwLjQ0MyAtPiAwLjY2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5OCBzcXVhcmVyb290IDAuMDQ0MyAtPiAwLjIxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzc5OSBzcXVhcmVyb290IDAuNDQ0IC0+IDAuNjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODAwIHNxdWFyZXJvb3QgMC4wNDQ0IC0+IDAuMjExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODAxIHNxdWFyZXJvb3QgMC40NDUgLT4gMC42NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDIgc3F1YXJlcm9vdCAwLjA0NDUgLT4gMC4yMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDMgc3F1YXJlcm9vdCAwLjQ0NiAtPiAwLjY2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgwNCBzcXVhcmVyb290IDAuMDQ0NiAtPiAwLjIxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgwNSBzcXVhcmVyb290IDAuNDQ3IC0+IDAuNjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODA2IHNxdWFyZXJvb3QgMC4wNDQ3IC0+IDAuMjExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODA3IHNxdWFyZXJvb3QgMC40NDggLT4gMC42NjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDggc3F1YXJlcm9vdCAwLjA0NDggLT4gMC4yMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MDkgc3F1YXJlcm9vdCAwLjQ0OSAtPiAwLjY3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgxMCBzcXVhcmVyb290IDAuMDQ0OSAtPiAwLjIxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgxMSBzcXVhcmVyb290IDAuNDUxIC0+IDAuNjcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODEyIHNxdWFyZXJvb3QgMC4wNDUxIC0+IDAuMjEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODEzIHNxdWFyZXJvb3QgMC40NTIgLT4gMC42NzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MTQgc3F1YXJlcm9vdCAwLjA0NTIgLT4gMC4yMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MTUgc3F1YXJlcm9vdCAwLjQ1MyAtPiAwLjY3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgxNiBzcXVhcmVyb290IDAuMDQ1MyAtPiAwLjIxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgxNyBzcXVhcmVyb290IDAuNDU0IC0+IDAuNjc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODE4IHNxdWFyZXJvb3QgMC4wNDU0IC0+IDAuMjEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODE5IHNxdWFyZXJvb3QgMC40NTUgLT4gMC42NzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MjAgc3F1YXJlcm9vdCAwLjA0NTUgLT4gMC4yMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MjEgc3F1YXJlcm9vdCAwLjQ1NiAtPiAwLjY3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyMiBzcXVhcmVyb290IDAuMDQ1NiAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyMyBzcXVhcmVyb290IDAuNDU3IC0+IDAuNjc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODI0IHNxdWFyZXJvb3QgMC4wNDU3IC0+IDAuMjE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODI1IHNxdWFyZXJvb3QgMC40NTggLT4gMC42NzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MjYgc3F1YXJlcm9vdCAwLjA0NTggLT4gMC4yMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Mjcgc3F1YXJlcm9vdCAwLjQ1OSAtPiAwLjY3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyOCBzcXVhcmVyb290IDAuMDQ1OSAtPiAwLjIxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgyOSBzcXVhcmVyb290IDAuNDYxIC0+IDAuNjc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODMwIHNxdWFyZXJvb3QgMC4wNDYxIC0+IDAuMjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODMxIHNxdWFyZXJvb3QgMC40NjIgLT4gMC42ODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MzIgc3F1YXJlcm9vdCAwLjA0NjIgLT4gMC4yMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4MzMgc3F1YXJlcm9vdCAwLjQ2MyAtPiAwLjY4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgzNCBzcXVhcmVyb290IDAuMDQ2MyAtPiAwLjIxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzgzNSBzcXVhcmVyb290IDAuNDY0IC0+IDAuNjgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODM2IHNxdWFyZXJvb3QgMC4wNDY0IC0+IDAuMjE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODM3IHNxdWFyZXJvb3QgMC40NjUgLT4gMC42ODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Mzggc3F1YXJlcm9vdCAwLjA0NjUgLT4gMC4yMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Mzkgc3F1YXJlcm9vdCAwLjQ2NiAtPiAwLjY4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg0MCBzcXVhcmVyb290IDAuMDQ2NiAtPiAwLjIxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg0MSBzcXVhcmVyb290IDAuNDY3IC0+IDAuNjgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQyIHNxdWFyZXJvb3QgMC4wNDY3IC0+IDAuMjE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQzIHNxdWFyZXJvb3QgMC40NjggLT4gMC42ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NDQgc3F1YXJlcm9vdCAwLjA0NjggLT4gMC4yMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NDUgc3F1YXJlcm9vdCAwLjQ2OSAtPiAwLjY4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg0NiBzcXVhcmVyb290IDAuMDQ2OSAtPiAwLjIxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg0NyBzcXVhcmVyb290IDAuNDcxIC0+IDAuNjg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQ4IHNxdWFyZXJvb3QgMC4wNDcxIC0+IDAuMjE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODQ5IHNxdWFyZXJvb3QgMC40NzIgLT4gMC42ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NTAgc3F1YXJlcm9vdCAwLjA0NzIgLT4gMC4yMTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NTEgc3F1YXJlcm9vdCAwLjQ3MyAtPiAwLjY4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1MiBzcXVhcmVyb290IDAuMDQ3MyAtPiAwLjIxNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1MyBzcXVhcmVyb290IDAuNDc0IC0+IDAuNjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODU0IHNxdWFyZXJvb3QgMC4wNDc0IC0+IDAuMjE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODU1IHNxdWFyZXJvb3QgMC40NzUgLT4gMC42ODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NTYgc3F1YXJlcm9vdCAwLjA0NzUgLT4gMC4yMTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NTcgc3F1YXJlcm9vdCAwLjQ3NiAtPiAwLjY5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1OCBzcXVhcmVyb290IDAuMDQ3NiAtPiAwLjIxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg1OSBzcXVhcmVyb290IDAuNDc3IC0+IDAuNjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODYwIHNxdWFyZXJvb3QgMC4wNDc3IC0+IDAuMjE4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODYxIHNxdWFyZXJvb3QgMC40NzggLT4gMC42OTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NjIgc3F1YXJlcm9vdCAwLjA0NzggLT4gMC4yMTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NjMgc3F1YXJlcm9vdCAwLjQ3OSAtPiAwLjY5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg2NCBzcXVhcmVyb290IDAuMDQ3OSAtPiAwLjIxOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg2NSBzcXVhcmVyb290IDAuNDgxIC0+IDAuNjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODY2IHNxdWFyZXJvb3QgMC4wNDgxIC0+IDAuMjE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODY3IHNxdWFyZXJvb3QgMC40ODIgLT4gMC42OTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Njggc3F1YXJlcm9vdCAwLjA0ODIgLT4gMC4yMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4Njkgc3F1YXJlcm9vdCAwLjQ4MyAtPiAwLjY5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg3MCBzcXVhcmVyb290IDAuMDQ4MyAtPiAwLjIyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg3MSBzcXVhcmVyb290IDAuNDg0IC0+IDAuNjk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODcyIHNxdWFyZXJvb3QgMC4wNDg0IC0+IDAuMjIKK3NxdHgzODczIHNxdWFyZXJvb3QgMC40ODUgLT4gMC42OTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NzQgc3F1YXJlcm9vdCAwLjA0ODUgLT4gMC4yMjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4NzUgc3F1YXJlcm9vdCAwLjQ4NiAtPiAwLjY5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg3NiBzcXVhcmVyb290IDAuMDQ4NiAtPiAwLjIyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg3NyBzcXVhcmVyb290IDAuNDg3IC0+IDAuNjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODc4IHNxdWFyZXJvb3QgMC4wNDg3IC0+IDAuMjIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODc5IHNxdWFyZXJvb3QgMC40ODggLT4gMC42OTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4ODAgc3F1YXJlcm9vdCAwLjA0ODggLT4gMC4yMjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4ODEgc3F1YXJlcm9vdCAwLjQ4OSAtPiAwLjY5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4MiBzcXVhcmVyb290IDAuMDQ4OSAtPiAwLjIyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4MyBzcXVhcmVyb290IDAuNDkxIC0+IDAuNzAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODg0IHNxdWFyZXJvb3QgMC4wNDkxIC0+IDAuMjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODg1IHNxdWFyZXJvb3QgMC40OTIgLT4gMC43MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4ODYgc3F1YXJlcm9vdCAwLjA0OTIgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4ODcgc3F1YXJlcm9vdCAwLjQ5MyAtPiAwLjcwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4OCBzcXVhcmVyb290IDAuMDQ5MyAtPiAwLjIyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg4OSBzcXVhcmVyb290IDAuNDk0IC0+IDAuNzAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODkwIHNxdWFyZXJvb3QgMC4wNDk0IC0+IDAuMjIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODkxIHNxdWFyZXJvb3QgMC40OTUgLT4gMC43MDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTIgc3F1YXJlcm9vdCAwLjA0OTUgLT4gMC4yMjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTMgc3F1YXJlcm9vdCAwLjQ5NiAtPiAwLjcwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg5NCBzcXVhcmVyb290IDAuMDQ5NiAtPiAwLjIyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzg5NSBzcXVhcmVyb290IDAuNDk3IC0+IDAuNzA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODk2IHNxdWFyZXJvb3QgMC4wNDk3IC0+IDAuMjIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzODk3IHNxdWFyZXJvb3QgMC40OTggLT4gMC43MDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTggc3F1YXJlcm9vdCAwLjA0OTggLT4gMC4yMjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM4OTkgc3F1YXJlcm9vdCAwLjQ5OSAtPiAwLjcwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkwMCBzcXVhcmVyb290IDAuMDQ5OSAtPiAwLjIyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkwMSBzcXVhcmVyb290IDAuNTAxIC0+IDAuNzA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTAyIHNxdWFyZXJvb3QgMC4wNTAxIC0+IDAuMjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTAzIHNxdWFyZXJvb3QgMC41MDIgLT4gMC43MDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MDQgc3F1YXJlcm9vdCAwLjA1MDIgLT4gMC4yMjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MDUgc3F1YXJlcm9vdCAwLjUwMyAtPiAwLjcwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkwNiBzcXVhcmVyb290IDAuMDUwMyAtPiAwLjIyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkwNyBzcXVhcmVyb290IDAuNTA0IC0+IDAuNzEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTA4IHNxdWFyZXJvb3QgMC4wNTA0IC0+IDAuMjI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTA5IHNxdWFyZXJvb3QgMC41MDUgLT4gMC43MTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MTAgc3F1YXJlcm9vdCAwLjA1MDUgLT4gMC4yMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MTEgc3F1YXJlcm9vdCAwLjUwNiAtPiAwLjcxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxMiBzcXVhcmVyb290IDAuMDUwNiAtPiAwLjIyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxMyBzcXVhcmVyb290IDAuNTA3IC0+IDAuNzEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTE0IHNxdWFyZXJvb3QgMC4wNTA3IC0+IDAuMjI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTE1IHNxdWFyZXJvb3QgMC41MDggLT4gMC43MTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MTYgc3F1YXJlcm9vdCAwLjA1MDggLT4gMC4yMjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MTcgc3F1YXJlcm9vdCAwLjUwOSAtPiAwLjcxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxOCBzcXVhcmVyb290IDAuMDUwOSAtPiAwLjIyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkxOSBzcXVhcmVyb290IDAuNTExIC0+IDAuNzE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTIwIHNxdWFyZXJvb3QgMC4wNTExIC0+IDAuMjI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTIxIHNxdWFyZXJvb3QgMC41MTIgLT4gMC43MTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MjIgc3F1YXJlcm9vdCAwLjA1MTIgLT4gMC4yMjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MjMgc3F1YXJlcm9vdCAwLjUxMyAtPiAwLjcxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkyNCBzcXVhcmVyb290IDAuMDUxMyAtPiAwLjIyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkyNSBzcXVhcmVyb290IDAuNTE0IC0+IDAuNzE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTI2IHNxdWFyZXJvb3QgMC4wNTE0IC0+IDAuMjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTI3IHNxdWFyZXJvb3QgMC41MTUgLT4gMC43MTggIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Mjggc3F1YXJlcm9vdCAwLjA1MTUgLT4gMC4yMjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Mjkgc3F1YXJlcm9vdCAwLjUxNiAtPiAwLjcxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkzMCBzcXVhcmVyb290IDAuMDUxNiAtPiAwLjIyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkzMSBzcXVhcmVyb290IDAuNTE3IC0+IDAuNzE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTMyIHNxdWFyZXJvb3QgMC4wNTE3IC0+IDAuMjI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTMzIHNxdWFyZXJvb3QgMC41MTggLT4gMC43MjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MzQgc3F1YXJlcm9vdCAwLjA1MTggLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDM5MzUgc3F1YXJlcm9vdCAwLjUxOSAtPiAwLjcyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkzNiBzcXVhcmVyb290IDAuMDUxOSAtPiAwLjIyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4MzkzNyBzcXVhcmVyb290IDAuNTIxIC0+IDAuNzIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTM4IHNxdWFyZXJvb3QgMC4wNTIxIC0+IDAuMjI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTM5IHNxdWFyZXJvb3QgMC41MjIgLT4gMC43MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NDAgc3F1YXJlcm9vdCAwLjA1MjIgLT4gMC4yMjggIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NDEgc3F1YXJlcm9vdCAwLjUyMyAtPiAwLjcyMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0MiBzcXVhcmVyb290IDAuMDUyMyAtPiAwLjIyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0MyBzcXVhcmVyb290IDAuNTI0IC0+IDAuNzI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTQ0IHNxdWFyZXJvb3QgMC4wNTI0IC0+IDAuMjI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTQ1IHNxdWFyZXJvb3QgMC41MjUgLT4gMC43MjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NDYgc3F1YXJlcm9vdCAwLjA1MjUgLT4gMC4yMjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NDcgc3F1YXJlcm9vdCAwLjUyNiAtPiAwLjcyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0OCBzcXVhcmVyb290IDAuMDUyNiAtPiAwLjIyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk0OSBzcXVhcmVyb290IDAuNTI3IC0+IDAuNzI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTUwIHNxdWFyZXJvb3QgMC4wNTI3IC0+IDAuMjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTUxIHNxdWFyZXJvb3QgMC41MjggLT4gMC43MjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTIgc3F1YXJlcm9vdCAwLjA1MjggLT4gMC4yMzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTMgc3F1YXJlcm9vdCAwLjUyOSAtPiAwLjcyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk1NCBzcXVhcmVyb290IDAuMDUyOSAtPiAwLjIzCitzcXR4Mzk1NSBzcXVhcmVyb290IDAuNTMxIC0+IDAuNzI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTU2IHNxdWFyZXJvb3QgMC4wNTMxIC0+IDAuMjMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTU3IHNxdWFyZXJvb3QgMC41MzIgLT4gMC43MjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTggc3F1YXJlcm9vdCAwLjA1MzIgLT4gMC4yMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NTkgc3F1YXJlcm9vdCAwLjUzMyAtPiAwLjczMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk2MCBzcXVhcmVyb290IDAuMDUzMyAtPiAwLjIzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk2MSBzcXVhcmVyb290IDAuNTM0IC0+IDAuNzMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTYyIHNxdWFyZXJvb3QgMC4wNTM0IC0+IDAuMjMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTYzIHNxdWFyZXJvb3QgMC41MzUgLT4gMC43MzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NjQgc3F1YXJlcm9vdCAwLjA1MzUgLT4gMC4yMzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NjUgc3F1YXJlcm9vdCAwLjUzNiAtPiAwLjczMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk2NiBzcXVhcmVyb290IDAuMDUzNiAtPiAwLjIzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk2NyBzcXVhcmVyb290IDAuNTM3IC0+IDAuNzMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTY4IHNxdWFyZXJvb3QgMC4wNTM3IC0+IDAuMjMyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTY5IHNxdWFyZXJvb3QgMC41MzggLT4gMC43MzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NzAgc3F1YXJlcm9vdCAwLjA1MzggLT4gMC4yMzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NzEgc3F1YXJlcm9vdCAwLjUzOSAtPiAwLjczNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3MiBzcXVhcmVyb290IDAuMDUzOSAtPiAwLjIzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3MyBzcXVhcmVyb290IDAuNTQxIC0+IDAuNzM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTc0IHNxdWFyZXJvb3QgMC4wNTQxIC0+IDAuMjMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTc1IHNxdWFyZXJvb3QgMC41NDIgLT4gMC43MzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5NzYgc3F1YXJlcm9vdCAwLjA1NDIgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5Nzcgc3F1YXJlcm9vdCAwLjU0MyAtPiAwLjczNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3OCBzcXVhcmVyb290IDAuMDU0MyAtPiAwLjIzMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk3OSBzcXVhcmVyb290IDAuNTQ0IC0+IDAuNzM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTgwIHNxdWFyZXJvb3QgMC4wNTQ0IC0+IDAuMjMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTgxIHNxdWFyZXJvb3QgMC41NDUgLT4gMC43MzggIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODIgc3F1YXJlcm9vdCAwLjA1NDUgLT4gMC4yMzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODMgc3F1YXJlcm9vdCAwLjU0NiAtPiAwLjczOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk4NCBzcXVhcmVyb290IDAuMDU0NiAtPiAwLjIzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk4NSBzcXVhcmVyb290IDAuNTQ3IC0+IDAuNzQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTg2IHNxdWFyZXJvb3QgMC4wNTQ3IC0+IDAuMjM0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTg3IHNxdWFyZXJvb3QgMC41NDggLT4gMC43NDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODggc3F1YXJlcm9vdCAwLjA1NDggLT4gMC4yMzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5ODkgc3F1YXJlcm9vdCAwLjU0OSAtPiAwLjc0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk5MCBzcXVhcmVyb290IDAuMDU0OSAtPiAwLjIzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk5MSBzcXVhcmVyb290IDAuNTUxIC0+IDAuNzQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTkyIHNxdWFyZXJvb3QgMC4wNTUxIC0+IDAuMjM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTkzIHNxdWFyZXJvb3QgMC41NTIgLT4gMC43NDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5OTQgc3F1YXJlcm9vdCAwLjA1NTIgLT4gMC4yMzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDM5OTUgc3F1YXJlcm9vdCAwLjU1MyAtPiAwLjc0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk5NiBzcXVhcmVyb290IDAuMDU1MyAtPiAwLjIzNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4Mzk5NyBzcXVhcmVyb290IDAuNTU0IC0+IDAuNzQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTk4IHNxdWFyZXJvb3QgMC4wNTU0IC0+IDAuMjM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHgzOTk5IHNxdWFyZXJvb3QgMC41NTUgLT4gMC43NDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMDAgc3F1YXJlcm9vdCAwLjA1NTUgLT4gMC4yMzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMDEgc3F1YXJlcm9vdCAwLjU1NiAtPiAwLjc0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwMiBzcXVhcmVyb290IDAuMDU1NiAtPiAwLjIzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwMyBzcXVhcmVyb290IDAuNTU3IC0+IDAuNzQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDA0IHNxdWFyZXJvb3QgMC4wNTU3IC0+IDAuMjM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDA1IHNxdWFyZXJvb3QgMC41NTggLT4gMC43NDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMDYgc3F1YXJlcm9vdCAwLjA1NTggLT4gMC4yMzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMDcgc3F1YXJlcm9vdCAwLjU1OSAtPiAwLjc0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwOCBzcXVhcmVyb290IDAuMDU1OSAtPiAwLjIzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAwOSBzcXVhcmVyb290IDAuNTYxIC0+IDAuNzQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDEwIHNxdWFyZXJvb3QgMC4wNTYxIC0+IDAuMjM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDExIHNxdWFyZXJvb3QgMC41NjIgLT4gMC43NTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTIgc3F1YXJlcm9vdCAwLjA1NjIgLT4gMC4yMzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTMgc3F1YXJlcm9vdCAwLjU2MyAtPiAwLjc1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAxNCBzcXVhcmVyb290IDAuMDU2MyAtPiAwLjIzNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAxNSBzcXVhcmVyb290IDAuNTY0IC0+IDAuNzUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDE2IHNxdWFyZXJvb3QgMC4wNTY0IC0+IDAuMjM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDE3IHNxdWFyZXJvb3QgMC41NjUgLT4gMC43NTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTggc3F1YXJlcm9vdCAwLjA1NjUgLT4gMC4yMzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMTkgc3F1YXJlcm9vdCAwLjU2NiAtPiAwLjc1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAyMCBzcXVhcmVyb290IDAuMDU2NiAtPiAwLjIzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAyMSBzcXVhcmVyb290IDAuNTY3IC0+IDAuNzUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDIyIHNxdWFyZXJvb3QgMC4wNTY3IC0+IDAuMjM4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDIzIHNxdWFyZXJvb3QgMC41NjggLT4gMC43NTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMjQgc3F1YXJlcm9vdCAwLjA1NjggLT4gMC4yMzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMjUgc3F1YXJlcm9vdCAwLjU2OSAtPiAwLjc1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAyNiBzcXVhcmVyb290IDAuMDU2OSAtPiAwLjIzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAyNyBzcXVhcmVyb290IDAuNTcxIC0+IDAuNzU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDI4IHNxdWFyZXJvb3QgMC4wNTcxIC0+IDAuMjM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDI5IHNxdWFyZXJvb3QgMC41NzIgLT4gMC43NTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMzAgc3F1YXJlcm9vdCAwLjA1NzIgLT4gMC4yMzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMzEgc3F1YXJlcm9vdCAwLjU3MyAtPiAwLjc1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAzMiBzcXVhcmVyb290IDAuMDU3MyAtPiAwLjIzOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAzMyBzcXVhcmVyb290IDAuNTc0IC0+IDAuNzU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDM0IHNxdWFyZXJvb3QgMC4wNTc0IC0+IDAuMjQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDM1IHNxdWFyZXJvb3QgMC41NzUgLT4gMC43NTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMzYgc3F1YXJlcm9vdCAwLjA1NzUgLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwMzcgc3F1YXJlcm9vdCAwLjU3NiAtPiAwLjc1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDAzOCBzcXVhcmVyb290IDAuMDU3NiAtPiAwLjI0CitzcXR4NDAzOSBzcXVhcmVyb290IDAuNTc3IC0+IDAuNzYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDQwIHNxdWFyZXJvb3QgMC4wNTc3IC0+IDAuMjQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDQxIHNxdWFyZXJvb3QgMC41NzggLT4gMC43NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDIgc3F1YXJlcm9vdCAwLjA1NzggLT4gMC4yNDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDMgc3F1YXJlcm9vdCAwLjU3OSAtPiAwLjc2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA0NCBzcXVhcmVyb290IDAuMDU3OSAtPiAwLjI0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA0NSBzcXVhcmVyb290IDAuNTgxIC0+IDAuNzYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDQ2IHNxdWFyZXJvb3QgMC4wNTgxIC0+IDAuMjQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDQ3IHNxdWFyZXJvb3QgMC41ODIgLT4gMC43NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDggc3F1YXJlcm9vdCAwLjA1ODIgLT4gMC4yNDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNDkgc3F1YXJlcm9vdCAwLjU4MyAtPiAwLjc2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA1MCBzcXVhcmVyb290IDAuMDU4MyAtPiAwLjI0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA1MSBzcXVhcmVyb290IDAuNTg0IC0+IDAuNzY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDUyIHNxdWFyZXJvb3QgMC4wNTg0IC0+IDAuMjQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDUzIHNxdWFyZXJvb3QgMC41ODUgLT4gMC43NjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNTQgc3F1YXJlcm9vdCAwLjA1ODUgLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNTUgc3F1YXJlcm9vdCAwLjU4NiAtPiAwLjc2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA1NiBzcXVhcmVyb290IDAuMDU4NiAtPiAwLjI0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA1NyBzcXVhcmVyb290IDAuNTg3IC0+IDAuNzY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDU4IHNxdWFyZXJvb3QgMC4wNTg3IC0+IDAuMjQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDU5IHNxdWFyZXJvb3QgMC41ODggLT4gMC43NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNjAgc3F1YXJlcm9vdCAwLjA1ODggLT4gMC4yNDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNjEgc3F1YXJlcm9vdCAwLjU4OSAtPiAwLjc2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2MiBzcXVhcmVyb290IDAuMDU4OSAtPiAwLjI0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2MyBzcXVhcmVyb290IDAuNTkxIC0+IDAuNzY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDY0IHNxdWFyZXJvb3QgMC4wNTkxIC0+IDAuMjQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDY1IHNxdWFyZXJvb3QgMC41OTIgLT4gMC43NjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNjYgc3F1YXJlcm9vdCAwLjA1OTIgLT4gMC4yNDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNjcgc3F1YXJlcm9vdCAwLjU5MyAtPiAwLjc3MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2OCBzcXVhcmVyb290IDAuMDU5MyAtPiAwLjI0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA2OSBzcXVhcmVyb290IDAuNTk0IC0+IDAuNzcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDcwIHNxdWFyZXJvb3QgMC4wNTk0IC0+IDAuMjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDcxIHNxdWFyZXJvb3QgMC41OTUgLT4gMC43NzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzIgc3F1YXJlcm9vdCAwLjA1OTUgLT4gMC4yNDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzMgc3F1YXJlcm9vdCAwLjU5NiAtPiAwLjc3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA3NCBzcXVhcmVyb290IDAuMDU5NiAtPiAwLjI0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA3NSBzcXVhcmVyb290IDAuNTk3IC0+IDAuNzczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDc2IHNxdWFyZXJvb3QgMC4wNTk3IC0+IDAuMjQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDc3IHNxdWFyZXJvb3QgMC41OTggLT4gMC43NzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzggc3F1YXJlcm9vdCAwLjA1OTggLT4gMC4yNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwNzkgc3F1YXJlcm9vdCAwLjU5OSAtPiAwLjc3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA4MCBzcXVhcmVyb290IDAuMDU5OSAtPiAwLjI0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA4MSBzcXVhcmVyb290IDAuNjAxIC0+IDAuNzc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDgyIHNxdWFyZXJvb3QgMC4wNjAxIC0+IDAuMjQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDgzIHNxdWFyZXJvb3QgMC42MDIgLT4gMC43NzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwODQgc3F1YXJlcm9vdCAwLjA2MDIgLT4gMC4yNDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwODUgc3F1YXJlcm9vdCAwLjYwMyAtPiAwLjc3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA4NiBzcXVhcmVyb290IDAuMDYwMyAtPiAwLjI0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA4NyBzcXVhcmVyb290IDAuNjA0IC0+IDAuNzc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDg4IHNxdWFyZXJvb3QgMC4wNjA0IC0+IDAuMjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDg5IHNxdWFyZXJvb3QgMC42MDUgLT4gMC43NzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQwOTAgc3F1YXJlcm9vdCAwLjA2MDUgLT4gMC4yNDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwOTEgc3F1YXJlcm9vdCAwLjYwNiAtPiAwLjc3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5MiBzcXVhcmVyb290IDAuMDYwNiAtPiAwLjI0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5MyBzcXVhcmVyb290IDAuNjA3IC0+IDAuNzc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDk0IHNxdWFyZXJvb3QgMC4wNjA3IC0+IDAuMjQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MDk1IHNxdWFyZXJvb3QgMC42MDggLT4gMC43ODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwOTYgc3F1YXJlcm9vdCAwLjA2MDggLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQwOTcgc3F1YXJlcm9vdCAwLjYwOSAtPiAwLjc4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5OCBzcXVhcmVyb290IDAuMDYwOSAtPiAwLjI0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDA5OSBzcXVhcmVyb290IDAuNjExIC0+IDAuNzgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTAwIHNxdWFyZXJvb3QgMC4wNjExIC0+IDAuMjQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTAxIHNxdWFyZXJvb3QgMC42MTIgLT4gMC43ODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDIgc3F1YXJlcm9vdCAwLjA2MTIgLT4gMC4yNDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDMgc3F1YXJlcm9vdCAwLjYxMyAtPiAwLjc4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEwNCBzcXVhcmVyb290IDAuMDYxMyAtPiAwLjI0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEwNSBzcXVhcmVyb290IDAuNjE0IC0+IDAuNzg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTA2IHNxdWFyZXJvb3QgMC4wNjE0IC0+IDAuMjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTA3IHNxdWFyZXJvb3QgMC42MTUgLT4gMC43ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDggc3F1YXJlcm9vdCAwLjA2MTUgLT4gMC4yNDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMDkgc3F1YXJlcm9vdCAwLjYxNiAtPiAwLjc4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDExMCBzcXVhcmVyb290IDAuMDYxNiAtPiAwLjI0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDExMSBzcXVhcmVyb290IDAuNjE3IC0+IDAuNzg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTEyIHNxdWFyZXJvb3QgMC4wNjE3IC0+IDAuMjQ4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTEzIHNxdWFyZXJvb3QgMC42MTggLT4gMC43ODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMTQgc3F1YXJlcm9vdCAwLjA2MTggLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMTUgc3F1YXJlcm9vdCAwLjYxOSAtPiAwLjc4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDExNiBzcXVhcmVyb290IDAuMDYxOSAtPiAwLjI0OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDExNyBzcXVhcmVyb290IDAuNjIxIC0+IDAuNzg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTE4IHNxdWFyZXJvb3QgMC4wNjIxIC0+IDAuMjQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTE5IHNxdWFyZXJvb3QgMC42MjIgLT4gMC43ODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMjAgc3F1YXJlcm9vdCAwLjA2MjIgLT4gMC4yNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMjEgc3F1YXJlcm9vdCAwLjYyMyAtPiAwLjc4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEyMiBzcXVhcmVyb290IDAuMDYyMyAtPiAwLjI1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEyMyBzcXVhcmVyb290IDAuNjI0IC0+IDAuNzkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTI0IHNxdWFyZXJvb3QgMC4wNjI0IC0+IDAuMjUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTI1IHNxdWFyZXJvb3QgMC42MjUgLT4gMC43OTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMjYgc3F1YXJlcm9vdCAwLjA2MjUgLT4gMC4yNQorc3F0eDQxMjcgc3F1YXJlcm9vdCAwLjYyNiAtPiAwLjc5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEyOCBzcXVhcmVyb290IDAuMDYyNiAtPiAwLjI1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEyOSBzcXVhcmVyb290IDAuNjI3IC0+IDAuNzkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTMwIHNxdWFyZXJvb3QgMC4wNjI3IC0+IDAuMjUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTMxIHNxdWFyZXJvb3QgMC42MjggLT4gMC43OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzIgc3F1YXJlcm9vdCAwLjA2MjggLT4gMC4yNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzMgc3F1YXJlcm9vdCAwLjYyOSAtPiAwLjc5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEzNCBzcXVhcmVyb290IDAuMDYyOSAtPiAwLjI1MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDEzNSBzcXVhcmVyb290IDAuNjMxIC0+IDAuNzk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTM2IHNxdWFyZXJvb3QgMC4wNjMxIC0+IDAuMjUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTM3IHNxdWFyZXJvb3QgMC42MzIgLT4gMC43OTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzggc3F1YXJlcm9vdCAwLjA2MzIgLT4gMC4yNTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxMzkgc3F1YXJlcm9vdCAwLjYzMyAtPiAwLjc5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE0MCBzcXVhcmVyb290IDAuMDYzMyAtPiAwLjI1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE0MSBzcXVhcmVyb290IDAuNjM0IC0+IDAuNzk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQyIHNxdWFyZXJvb3QgMC4wNjM0IC0+IDAuMjUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQzIHNxdWFyZXJvb3QgMC42MzUgLT4gMC43OTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNDQgc3F1YXJlcm9vdCAwLjA2MzUgLT4gMC4yNTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNDUgc3F1YXJlcm9vdCAwLjYzNiAtPiAwLjc5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE0NiBzcXVhcmVyb290IDAuMDYzNiAtPiAwLjI1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE0NyBzcXVhcmVyb290IDAuNjM3IC0+IDAuNzk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQ4IHNxdWFyZXJvb3QgMC4wNjM3IC0+IDAuMjUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTQ5IHNxdWFyZXJvb3QgMC42MzggLT4gMC43OTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNTAgc3F1YXJlcm9vdCAwLjA2MzggLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNTEgc3F1YXJlcm9vdCAwLjYzOSAtPiAwLjc5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1MiBzcXVhcmVyb290IDAuMDYzOSAtPiAwLjI1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1MyBzcXVhcmVyb290IDAuNjQxIC0+IDAuODAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTU0IHNxdWFyZXJvb3QgMC4wNjQxIC0+IDAuMjUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTU1IHNxdWFyZXJvb3QgMC42NDIgLT4gMC44MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNTYgc3F1YXJlcm9vdCAwLjA2NDIgLT4gMC4yNTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNTcgc3F1YXJlcm9vdCAwLjY0MyAtPiAwLjgwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1OCBzcXVhcmVyb290IDAuMDY0MyAtPiAwLjI1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE1OSBzcXVhcmVyb290IDAuNjQ0IC0+IDAuODAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTYwIHNxdWFyZXJvb3QgMC4wNjQ0IC0+IDAuMjU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTYxIHNxdWFyZXJvb3QgMC42NDUgLT4gMC44MDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjIgc3F1YXJlcm9vdCAwLjA2NDUgLT4gMC4yNTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjMgc3F1YXJlcm9vdCAwLjY0NiAtPiAwLjgwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE2NCBzcXVhcmVyb290IDAuMDY0NiAtPiAwLjI1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE2NSBzcXVhcmVyb290IDAuNjQ3IC0+IDAuODA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTY2IHNxdWFyZXJvb3QgMC4wNjQ3IC0+IDAuMjU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTY3IHNxdWFyZXJvb3QgMC42NDggLT4gMC44MDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjggc3F1YXJlcm9vdCAwLjA2NDggLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNjkgc3F1YXJlcm9vdCAwLjY0OSAtPiAwLjgwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE3MCBzcXVhcmVyb290IDAuMDY0OSAtPiAwLjI1NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE3MSBzcXVhcmVyb290IDAuNjUxIC0+IDAuODA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTcyIHNxdWFyZXJvb3QgMC4wNjUxIC0+IDAuMjU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTczIHNxdWFyZXJvb3QgMC42NTIgLT4gMC44MDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNzQgc3F1YXJlcm9vdCAwLjA2NTIgLT4gMC4yNTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxNzUgc3F1YXJlcm9vdCAwLjY1MyAtPiAwLjgwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE3NiBzcXVhcmVyb290IDAuMDY1MyAtPiAwLjI1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE3NyBzcXVhcmVyb290IDAuNjU0IC0+IDAuODA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTc4IHNxdWFyZXJvb3QgMC4wNjU0IC0+IDAuMjU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTc5IHNxdWFyZXJvb3QgMC42NTUgLT4gMC44MDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxODAgc3F1YXJlcm9vdCAwLjA2NTUgLT4gMC4yNTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxODEgc3F1YXJlcm9vdCAwLjY1NiAtPiAwLjgxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4MiBzcXVhcmVyb290IDAuMDY1NiAtPiAwLjI1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4MyBzcXVhcmVyb290IDAuNjU3IC0+IDAuODExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTg0IHNxdWFyZXJvb3QgMC4wNjU3IC0+IDAuMjU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTg1IHNxdWFyZXJvb3QgMC42NTggLT4gMC44MTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxODYgc3F1YXJlcm9vdCAwLjA2NTggLT4gMC4yNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxODcgc3F1YXJlcm9vdCAwLjY1OSAtPiAwLjgxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4OCBzcXVhcmVyb290IDAuMDY1OSAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE4OSBzcXVhcmVyb290IDAuNjYxIC0+IDAuODEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTkwIHNxdWFyZXJvb3QgMC4wNjYxIC0+IDAuMjU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTkxIHNxdWFyZXJvb3QgMC42NjIgLT4gMC44MTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTIgc3F1YXJlcm9vdCAwLjA2NjIgLT4gMC4yNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTMgc3F1YXJlcm9vdCAwLjY2MyAtPiAwLjgxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE5NCBzcXVhcmVyb290IDAuMDY2MyAtPiAwLjI1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDE5NSBzcXVhcmVyb290IDAuNjY0IC0+IDAuODE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTk2IHNxdWFyZXJvb3QgMC4wNjY0IC0+IDAuMjU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MTk3IHNxdWFyZXJvb3QgMC42NjUgLT4gMC44MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTggc3F1YXJlcm9vdCAwLjA2NjUgLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQxOTkgc3F1YXJlcm9vdCAwLjY2NiAtPiAwLjgxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIwMCBzcXVhcmVyb290IDAuMDY2NiAtPiAwLjI1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIwMSBzcXVhcmVyb290IDAuNjY3IC0+IDAuODE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjAyIHNxdWFyZXJvb3QgMC4wNjY3IC0+IDAuMjU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjAzIHNxdWFyZXJvb3QgMC42NjggLT4gMC44MTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMDQgc3F1YXJlcm9vdCAwLjA2NjggLT4gMC4yNTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMDUgc3F1YXJlcm9vdCAwLjY2OSAtPiAwLjgxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIwNiBzcXVhcmVyb290IDAuMDY2OSAtPiAwLjI1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIwNyBzcXVhcmVyb290IDAuNjcxIC0+IDAuODE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjA4IHNxdWFyZXJvb3QgMC4wNjcxIC0+IDAuMjU5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjA5IHNxdWFyZXJvb3QgMC42NzIgLT4gMC44MjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMTAgc3F1YXJlcm9vdCAwLjA2NzIgLT4gMC4yNTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMTEgc3F1YXJlcm9vdCAwLjY3MyAtPiAwLjgyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIxMiBzcXVhcmVyb290IDAuMDY3MyAtPiAwLjI1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIxMyBzcXVhcmVyb290IDAuNjc0IC0+IDAuODIxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjE0IHNxdWFyZXJvb3QgMC4wNjc0IC0+IDAuMjYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjE1IHNxdWFyZXJvb3QgMC42NzUgLT4gMC44MjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMTYgc3F1YXJlcm9vdCAwLjA2NzUgLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMTcgc3F1YXJlcm9vdCAwLjY3NiAtPiAwLjgyMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIxOCBzcXVhcmVyb290IDAuMDY3NiAtPiAwLjI2CitzcXR4NDIxOSBzcXVhcmVyb290IDAuNjc3IC0+IDAuODIzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjIwIHNxdWFyZXJvb3QgMC4wNjc3IC0+IDAuMjYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjIxIHNxdWFyZXJvb3QgMC42NzggLT4gMC44MjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjIgc3F1YXJlcm9vdCAwLjA2NzggLT4gMC4yNjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjMgc3F1YXJlcm9vdCAwLjY3OSAtPiAwLjgyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIyNCBzcXVhcmVyb290IDAuMDY3OSAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIyNSBzcXVhcmVyb290IDAuNjgxIC0+IDAuODI1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjI2IHNxdWFyZXJvb3QgMC4wNjgxIC0+IDAuMjYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjI3IHNxdWFyZXJvb3QgMC42ODIgLT4gMC44MjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjggc3F1YXJlcm9vdCAwLjA2ODIgLT4gMC4yNjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMjkgc3F1YXJlcm9vdCAwLjY4MyAtPiAwLjgyNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIzMCBzcXVhcmVyb290IDAuMDY4MyAtPiAwLjI2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIzMSBzcXVhcmVyb290IDAuNjg0IC0+IDAuODI3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjMyIHNxdWFyZXJvb3QgMC4wNjg0IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjMzIHNxdWFyZXJvb3QgMC42ODUgLT4gMC44MjggIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMzQgc3F1YXJlcm9vdCAwLjA2ODUgLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyMzUgc3F1YXJlcm9vdCAwLjY4NiAtPiAwLjgyOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIzNiBzcXVhcmVyb290IDAuMDY4NiAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDIzNyBzcXVhcmVyb290IDAuNjg3IC0+IDAuODI5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjM4IHNxdWFyZXJvb3QgMC4wNjg3IC0+IDAuMjYyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjM5IHNxdWFyZXJvb3QgMC42ODggLT4gMC44MjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNDAgc3F1YXJlcm9vdCAwLjA2ODggLT4gMC4yNjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNDEgc3F1YXJlcm9vdCAwLjY4OSAtPiAwLjgzMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0MiBzcXVhcmVyb290IDAuMDY4OSAtPiAwLjI2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0MyBzcXVhcmVyb290IDAuNjkxIC0+IDAuODMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjQ0IHNxdWFyZXJvb3QgMC4wNjkxIC0+IDAuMjYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjQ1IHNxdWFyZXJvb3QgMC42OTIgLT4gMC44MzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNDYgc3F1YXJlcm9vdCAwLjA2OTIgLT4gMC4yNjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNDcgc3F1YXJlcm9vdCAwLjY5MyAtPiAwLjgzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0OCBzcXVhcmVyb290IDAuMDY5MyAtPiAwLjI2MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI0OSBzcXVhcmVyb290IDAuNjk0IC0+IDAuODMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjUwIHNxdWFyZXJvb3QgMC4wNjk0IC0+IDAuMjYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjUxIHNxdWFyZXJvb3QgMC42OTUgLT4gMC44MzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTIgc3F1YXJlcm9vdCAwLjA2OTUgLT4gMC4yNjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTMgc3F1YXJlcm9vdCAwLjY5NiAtPiAwLjgzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI1NCBzcXVhcmVyb290IDAuMDY5NiAtPiAwLjI2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI1NSBzcXVhcmVyb290IDAuNjk3IC0+IDAuODM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjU2IHNxdWFyZXJvb3QgMC4wNjk3IC0+IDAuMjY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjU3IHNxdWFyZXJvb3QgMC42OTggLT4gMC44MzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTggc3F1YXJlcm9vdCAwLjA2OTggLT4gMC4yNjQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNTkgc3F1YXJlcm9vdCAwLjY5OSAtPiAwLjgzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI2MCBzcXVhcmVyb290IDAuMDY5OSAtPiAwLjI2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI2MSBzcXVhcmVyb290IDAuNzAxIC0+IDAuODM3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjYyIHNxdWFyZXJvb3QgMC4wNzAxIC0+IDAuMjY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjYzIHNxdWFyZXJvb3QgMC43MDIgLT4gMC44MzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNjQgc3F1YXJlcm9vdCAwLjA3MDIgLT4gMC4yNjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNjUgc3F1YXJlcm9vdCAwLjcwMyAtPiAwLjgzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI2NiBzcXVhcmVyb290IDAuMDcwMyAtPiAwLjI2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI2NyBzcXVhcmVyb290IDAuNzA0IC0+IDAuODM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjY4IHNxdWFyZXJvb3QgMC4wNzA0IC0+IDAuMjY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjY5IHNxdWFyZXJvb3QgMC43MDUgLT4gMC44NDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNzAgc3F1YXJlcm9vdCAwLjA3MDUgLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNzEgc3F1YXJlcm9vdCAwLjcwNiAtPiAwLjg0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3MiBzcXVhcmVyb290IDAuMDcwNiAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3MyBzcXVhcmVyb290IDAuNzA3IC0+IDAuODQxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjc0IHNxdWFyZXJvb3QgMC4wNzA3IC0+IDAuMjY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjc1IHNxdWFyZXJvb3QgMC43MDggLT4gMC44NDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNzYgc3F1YXJlcm9vdCAwLjA3MDggLT4gMC4yNjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyNzcgc3F1YXJlcm9vdCAwLjcwOSAtPiAwLjg0MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3OCBzcXVhcmVyb290IDAuMDcwOSAtPiAwLjI2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI3OSBzcXVhcmVyb290IDAuNzExIC0+IDAuODQzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjgwIHNxdWFyZXJvb3QgMC4wNzExIC0+IDAuMjY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjgxIHNxdWFyZXJvb3QgMC43MTIgLT4gMC44NDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODIgc3F1YXJlcm9vdCAwLjA3MTIgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODMgc3F1YXJlcm9vdCAwLjcxMyAtPiAwLjg0NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI4NCBzcXVhcmVyb290IDAuMDcxMyAtPiAwLjI2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI4NSBzcXVhcmVyb290IDAuNzE0IC0+IDAuODQ1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjg2IHNxdWFyZXJvb3QgMC4wNzE0IC0+IDAuMjY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjg3IHNxdWFyZXJvb3QgMC43MTUgLT4gMC44NDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODggc3F1YXJlcm9vdCAwLjA3MTUgLT4gMC4yNjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyODkgc3F1YXJlcm9vdCAwLjcxNiAtPiAwLjg0NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI5MCBzcXVhcmVyb290IDAuMDcxNiAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI5MSBzcXVhcmVyb290IDAuNzE3IC0+IDAuODQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjkyIHNxdWFyZXJvb3QgMC4wNzE3IC0+IDAuMjY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MjkzIHNxdWFyZXJvb3QgMC43MTggLT4gMC44NDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQyOTQgc3F1YXJlcm9vdCAwLjA3MTggLT4gMC4yNjggIEluZXhhY3QgUm91bmRlZAorc3F0eDQyOTUgc3F1YXJlcm9vdCAwLjcxOSAtPiAwLjg0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI5NiBzcXVhcmVyb290IDAuMDcxOSAtPiAwLjI2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDI5NyBzcXVhcmVyb290IDAuNzIxIC0+IDAuODQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjk4IHNxdWFyZXJvb3QgMC4wNzIxIC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mjk5IHNxdWFyZXJvb3QgMC43MjIgLT4gMC44NTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMDAgc3F1YXJlcm9vdCAwLjA3MjIgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMDEgc3F1YXJlcm9vdCAwLjcyMyAtPiAwLjg1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwMiBzcXVhcmVyb290IDAuMDcyMyAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwMyBzcXVhcmVyb290IDAuNzI0IC0+IDAuODUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzA0IHNxdWFyZXJvb3QgMC4wNzI0IC0+IDAuMjY5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzA1IHNxdWFyZXJvb3QgMC43MjUgLT4gMC44NTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMDYgc3F1YXJlcm9vdCAwLjA3MjUgLT4gMC4yNjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMDcgc3F1YXJlcm9vdCAwLjcyNiAtPiAwLjg1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwOCBzcXVhcmVyb290IDAuMDcyNiAtPiAwLjI2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMwOSBzcXVhcmVyb290IDAuNzI3IC0+IDAuODUzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzEwIHNxdWFyZXJvb3QgMC4wNzI3IC0+IDAuMjcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzExIHNxdWFyZXJvb3QgMC43MjggLT4gMC44NTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTIgc3F1YXJlcm9vdCAwLjA3MjggLT4gMC4yNzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTMgc3F1YXJlcm9vdCAwLjcyOSAtPiAwLjg1NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMxNCBzcXVhcmVyb290IDAuMDcyOSAtPiAwLjI3CitzcXR4NDMxNSBzcXVhcmVyb290IDAuNzMxIC0+IDAuODU1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzE2IHNxdWFyZXJvb3QgMC4wNzMxIC0+IDAuMjcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzE3IHNxdWFyZXJvb3QgMC43MzIgLT4gMC44NTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTggc3F1YXJlcm9vdCAwLjA3MzIgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMTkgc3F1YXJlcm9vdCAwLjczMyAtPiAwLjg1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMyMCBzcXVhcmVyb290IDAuMDczMyAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMyMSBzcXVhcmVyb290IDAuNzM0IC0+IDAuODU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzIyIHNxdWFyZXJvb3QgMC4wNzM0IC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzIzIHNxdWFyZXJvb3QgMC43MzUgLT4gMC44NTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMjQgc3F1YXJlcm9vdCAwLjA3MzUgLT4gMC4yNzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMjUgc3F1YXJlcm9vdCAwLjczNiAtPiAwLjg1OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMyNiBzcXVhcmVyb290IDAuMDczNiAtPiAwLjI3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMyNyBzcXVhcmVyb290IDAuNzM3IC0+IDAuODU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzI4IHNxdWFyZXJvb3QgMC4wNzM3IC0+IDAuMjcxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzI5IHNxdWFyZXJvb3QgMC43MzggLT4gMC44NTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMzAgc3F1YXJlcm9vdCAwLjA3MzggLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMzEgc3F1YXJlcm9vdCAwLjczOSAtPiAwLjg2MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzMiBzcXVhcmVyb290IDAuMDczOSAtPiAwLjI3MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzMyBzcXVhcmVyb290IDAuNzQxIC0+IDAuODYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzM0IHNxdWFyZXJvb3QgMC4wNzQxIC0+IDAuMjcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzM1IHNxdWFyZXJvb3QgMC43NDIgLT4gMC44NjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMzYgc3F1YXJlcm9vdCAwLjA3NDIgLT4gMC4yNzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzMzcgc3F1YXJlcm9vdCAwLjc0MyAtPiAwLjg2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzOCBzcXVhcmVyb290IDAuMDc0MyAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDMzOSBzcXVhcmVyb290IDAuNzQ0IC0+IDAuODYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzQwIHNxdWFyZXJvb3QgMC4wNzQ0IC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzQxIHNxdWFyZXJvb3QgMC43NDUgLT4gMC44NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDIgc3F1YXJlcm9vdCAwLjA3NDUgLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDMgc3F1YXJlcm9vdCAwLjc0NiAtPiAwLjg2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM0NCBzcXVhcmVyb290IDAuMDc0NiAtPiAwLjI3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM0NSBzcXVhcmVyb290IDAuNzQ3IC0+IDAuODY0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzQ2IHNxdWFyZXJvb3QgMC4wNzQ3IC0+IDAuMjczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzQ3IHNxdWFyZXJvb3QgMC43NDggLT4gMC44NjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDggc3F1YXJlcm9vdCAwLjA3NDggLT4gMC4yNzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNDkgc3F1YXJlcm9vdCAwLjc0OSAtPiAwLjg2NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM1MCBzcXVhcmVyb290IDAuMDc0OSAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM1MSBzcXVhcmVyb290IDAuNzUxIC0+IDAuODY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzUyIHNxdWFyZXJvb3QgMC4wNzUxIC0+IDAuMjc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzUzIHNxdWFyZXJvb3QgMC43NTIgLT4gMC44NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNTQgc3F1YXJlcm9vdCAwLjA3NTIgLT4gMC4yNzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNTUgc3F1YXJlcm9vdCAwLjc1MyAtPiAwLjg2OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM1NiBzcXVhcmVyb290IDAuMDc1MyAtPiAwLjI3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM1NyBzcXVhcmVyb290IDAuNzU0IC0+IDAuODY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzU4IHNxdWFyZXJvb3QgMC4wNzU0IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzU5IHNxdWFyZXJvb3QgMC43NTUgLT4gMC44NjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNjAgc3F1YXJlcm9vdCAwLjA3NTUgLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNjEgc3F1YXJlcm9vdCAwLjc1NiAtPiAwLjg2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2MiBzcXVhcmVyb290IDAuMDc1NiAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2MyBzcXVhcmVyb290IDAuNzU3IC0+IDAuODcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzY0IHNxdWFyZXJvb3QgMC4wNzU3IC0+IDAuMjc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzY1IHNxdWFyZXJvb3QgMC43NTggLT4gMC44NzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNjYgc3F1YXJlcm9vdCAwLjA3NTggLT4gMC4yNzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNjcgc3F1YXJlcm9vdCAwLjc1OSAtPiAwLjg3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2OCBzcXVhcmVyb290IDAuMDc1OSAtPiAwLjI3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM2OSBzcXVhcmVyb290IDAuNzYxIC0+IDAuODcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzcwIHNxdWFyZXJvb3QgMC4wNzYxIC0+IDAuMjc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzcxIHNxdWFyZXJvb3QgMC43NjIgLT4gMC44NzMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzIgc3F1YXJlcm9vdCAwLjA3NjIgLT4gMC4yNzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzMgc3F1YXJlcm9vdCAwLjc2MyAtPiAwLjg3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM3NCBzcXVhcmVyb290IDAuMDc2MyAtPiAwLjI3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM3NSBzcXVhcmVyb290IDAuNzY0IC0+IDAuODc0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzc2IHNxdWFyZXJvb3QgMC4wNzY0IC0+IDAuMjc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzc3IHNxdWFyZXJvb3QgMC43NjUgLT4gMC44NzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzggc3F1YXJlcm9vdCAwLjA3NjUgLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzNzkgc3F1YXJlcm9vdCAwLjc2NiAtPiAwLjg3NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM4MCBzcXVhcmVyb290IDAuMDc2NiAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM4MSBzcXVhcmVyb290IDAuNzY3IC0+IDAuODc2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzgyIHNxdWFyZXJvb3QgMC4wNzY3IC0+IDAuMjc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0MzgzIHNxdWFyZXJvb3QgMC43NjggLT4gMC44NzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzODQgc3F1YXJlcm9vdCAwLjA3NjggLT4gMC4yNzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzODUgc3F1YXJlcm9vdCAwLjc2OSAtPiAwLjg3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM4NiBzcXVhcmVyb290IDAuMDc2OSAtPiAwLjI3NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM4NyBzcXVhcmVyb290IDAuNzcxIC0+IDAuODc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzg4IHNxdWFyZXJvb3QgMC4wNzcxIC0+IDAuMjc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzg5IHNxdWFyZXJvb3QgMC43NzIgLT4gMC44NzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzOTAgc3F1YXJlcm9vdCAwLjA3NzIgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQzOTEgc3F1YXJlcm9vdCAwLjc3MyAtPiAwLjg3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5MiBzcXVhcmVyb290IDAuMDc3MyAtPiAwLjI3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5MyBzcXVhcmVyb290IDAuNzc0IC0+IDAuODgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzk0IHNxdWFyZXJvb3QgMC4wNzc0IC0+IDAuMjc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Mzk1IHNxdWFyZXJvb3QgMC43NzUgLT4gMC44ODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQzOTYgc3F1YXJlcm9vdCAwLjA3NzUgLT4gMC4yNzggIEluZXhhY3QgUm91bmRlZAorc3F0eDQzOTcgc3F1YXJlcm9vdCAwLjc3NiAtPiAwLjg4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5OCBzcXVhcmVyb290IDAuMDc3NiAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDM5OSBzcXVhcmVyb290IDAuNzc3IC0+IDAuODgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDAwIHNxdWFyZXJvb3QgMC4wNzc3IC0+IDAuMjc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDAxIHNxdWFyZXJvb3QgMC43NzggLT4gMC44ODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDIgc3F1YXJlcm9vdCAwLjA3NzggLT4gMC4yNzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDMgc3F1YXJlcm9vdCAwLjc3OSAtPiAwLjg4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQwNCBzcXVhcmVyb290IDAuMDc3OSAtPiAwLjI3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQwNSBzcXVhcmVyb290IDAuNzgxIC0+IDAuODg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDA2IHNxdWFyZXJvb3QgMC4wNzgxIC0+IDAuMjc5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDA3IHNxdWFyZXJvb3QgMC43ODIgLT4gMC44ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDggc3F1YXJlcm9vdCAwLjA3ODIgLT4gMC4yODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MDkgc3F1YXJlcm9vdCAwLjc4MyAtPiAwLjg4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQxMCBzcXVhcmVyb290IDAuMDc4MyAtPiAwLjI4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQxMSBzcXVhcmVyb290IDAuNzg0IC0+IDAuODg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDEyIHNxdWFyZXJvb3QgMC4wNzg0IC0+IDAuMjgKK3NxdHg0NDEzIHNxdWFyZXJvb3QgMC43ODUgLT4gMC44ODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MTQgc3F1YXJlcm9vdCAwLjA3ODUgLT4gMC4yODAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MTUgc3F1YXJlcm9vdCAwLjc4NiAtPiAwLjg4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQxNiBzcXVhcmVyb290IDAuMDc4NiAtPiAwLjI4MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQxNyBzcXVhcmVyb290IDAuNzg3IC0+IDAuODg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDE4IHNxdWFyZXJvb3QgMC4wNzg3IC0+IDAuMjgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDE5IHNxdWFyZXJvb3QgMC43ODggLT4gMC44ODggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MjAgc3F1YXJlcm9vdCAwLjA3ODggLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MjEgc3F1YXJlcm9vdCAwLjc4OSAtPiAwLjg4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyMiBzcXVhcmVyb290IDAuMDc4OSAtPiAwLjI4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyMyBzcXVhcmVyb290IDAuNzkxIC0+IDAuODg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDI0IHNxdWFyZXJvb3QgMC4wNzkxIC0+IDAuMjgxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDI1IHNxdWFyZXJvb3QgMC43OTIgLT4gMC44OTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MjYgc3F1YXJlcm9vdCAwLjA3OTIgLT4gMC4yODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Mjcgc3F1YXJlcm9vdCAwLjc5MyAtPiAwLjg5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyOCBzcXVhcmVyb290IDAuMDc5MyAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQyOSBzcXVhcmVyb290IDAuNzk0IC0+IDAuODkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDMwIHNxdWFyZXJvb3QgMC4wNzk0IC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDMxIHNxdWFyZXJvb3QgMC43OTUgLT4gMC44OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MzIgc3F1YXJlcm9vdCAwLjA3OTUgLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0MzMgc3F1YXJlcm9vdCAwLjc5NiAtPiAwLjg5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQzNCBzcXVhcmVyb290IDAuMDc5NiAtPiAwLjI4MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQzNSBzcXVhcmVyb290IDAuNzk3IC0+IDAuODkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDM2IHNxdWFyZXJvb3QgMC4wNzk3IC0+IDAuMjgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDM3IHNxdWFyZXJvb3QgMC43OTggLT4gMC44OTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Mzggc3F1YXJlcm9vdCAwLjA3OTggLT4gMC4yODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Mzkgc3F1YXJlcm9vdCAwLjc5OSAtPiAwLjg5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ0MCBzcXVhcmVyb290IDAuMDc5OSAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ0MSBzcXVhcmVyb290IDAuODAxIC0+IDAuODk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQyIHNxdWFyZXJvb3QgMC4wODAxIC0+IDAuMjgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQzIHNxdWFyZXJvb3QgMC44MDIgLT4gMC44OTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NDQgc3F1YXJlcm9vdCAwLjA4MDIgLT4gMC4yODMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NDUgc3F1YXJlcm9vdCAwLjgwMyAtPiAwLjg5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ0NiBzcXVhcmVyb290IDAuMDgwMyAtPiAwLjI4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ0NyBzcXVhcmVyb290IDAuODA0IC0+IDAuODk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQ4IHNxdWFyZXJvb3QgMC4wODA0IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDQ5IHNxdWFyZXJvb3QgMC44MDUgLT4gMC44OTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NTAgc3F1YXJlcm9vdCAwLjA4MDUgLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NTEgc3F1YXJlcm9vdCAwLjgwNiAtPiAwLjg5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1MiBzcXVhcmVyb290IDAuMDgwNiAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1MyBzcXVhcmVyb290IDAuODA3IC0+IDAuODk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDU0IHNxdWFyZXJvb3QgMC4wODA3IC0+IDAuMjg0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDU1IHNxdWFyZXJvb3QgMC44MDggLT4gMC44OTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NTYgc3F1YXJlcm9vdCAwLjA4MDggLT4gMC4yODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NTcgc3F1YXJlcm9vdCAwLjgwOSAtPiAwLjg5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1OCBzcXVhcmVyb290IDAuMDgwOSAtPiAwLjI4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ1OSBzcXVhcmVyb290IDAuODExIC0+IDAuOTAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDYwIHNxdWFyZXJvb3QgMC4wODExIC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDYxIHNxdWFyZXJvb3QgMC44MTIgLT4gMC45MDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NjIgc3F1YXJlcm9vdCAwLjA4MTIgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NjMgc3F1YXJlcm9vdCAwLjgxMyAtPiAwLjkwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ2NCBzcXVhcmVyb290IDAuMDgxMyAtPiAwLjI4NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ2NSBzcXVhcmVyb290IDAuODE0IC0+IDAuOTAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDY2IHNxdWFyZXJvb3QgMC4wODE0IC0+IDAuMjg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDY3IHNxdWFyZXJvb3QgMC44MTUgLT4gMC45MDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Njggc3F1YXJlcm9vdCAwLjA4MTUgLT4gMC4yODUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0Njkgc3F1YXJlcm9vdCAwLjgxNiAtPiAwLjkwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ3MCBzcXVhcmVyb290IDAuMDgxNiAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ3MSBzcXVhcmVyb290IDAuODE3IC0+IDAuOTA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDcyIHNxdWFyZXJvb3QgMC4wODE3IC0+IDAuMjg2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDczIHNxdWFyZXJvb3QgMC44MTggLT4gMC45MDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NzQgc3F1YXJlcm9vdCAwLjA4MTggLT4gMC4yODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0NzUgc3F1YXJlcm9vdCAwLjgxOSAtPiAwLjkwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ3NiBzcXVhcmVyb290IDAuMDgxOSAtPiAwLjI4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ3NyBzcXVhcmVyb290IDAuODIxIC0+IDAuOTA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDc4IHNxdWFyZXJvb3QgMC4wODIxIC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDc5IHNxdWFyZXJvb3QgMC44MjIgLT4gMC45MDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0ODAgc3F1YXJlcm9vdCAwLjA4MjIgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0ODEgc3F1YXJlcm9vdCAwLjgyMyAtPiAwLjkwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4MiBzcXVhcmVyb290IDAuMDgyMyAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4MyBzcXVhcmVyb290IDAuODI0IC0+IDAuOTA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDg0IHNxdWFyZXJvb3QgMC4wODI0IC0+IDAuMjg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDg1IHNxdWFyZXJvb3QgMC44MjUgLT4gMC45MDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0ODYgc3F1YXJlcm9vdCAwLjA4MjUgLT4gMC4yODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0ODcgc3F1YXJlcm9vdCAwLjgyNiAtPiAwLjkwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4OCBzcXVhcmVyb290IDAuMDgyNiAtPiAwLjI4NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ4OSBzcXVhcmVyb290IDAuODI3IC0+IDAuOTA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDkwIHNxdWFyZXJvb3QgMC4wODI3IC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDkxIHNxdWFyZXJvb3QgMC44MjggLT4gMC45MTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTIgc3F1YXJlcm9vdCAwLjA4MjggLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTMgc3F1YXJlcm9vdCAwLjgyOSAtPiAwLjkxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ5NCBzcXVhcmVyb290IDAuMDgyOSAtPiAwLjI4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDQ5NSBzcXVhcmVyb290IDAuODMxIC0+IDAuOTEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDk2IHNxdWFyZXJvb3QgMC4wODMxIC0+IDAuMjg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NDk3IHNxdWFyZXJvb3QgMC44MzIgLT4gMC45MTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTggc3F1YXJlcm9vdCAwLjA4MzIgLT4gMC4yODggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ0OTkgc3F1YXJlcm9vdCAwLjgzMyAtPiAwLjkxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUwMCBzcXVhcmVyb290IDAuMDgzMyAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUwMSBzcXVhcmVyb290IDAuODM0IC0+IDAuOTEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTAyIHNxdWFyZXJvb3QgMC4wODM0IC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTAzIHNxdWFyZXJvb3QgMC44MzUgLT4gMC45MTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MDQgc3F1YXJlcm9vdCAwLjA4MzUgLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MDUgc3F1YXJlcm9vdCAwLjgzNiAtPiAwLjkxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUwNiBzcXVhcmVyb290IDAuMDgzNiAtPiAwLjI4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUwNyBzcXVhcmVyb290IDAuODM3IC0+IDAuOTE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTA4IHNxdWFyZXJvb3QgMC4wODM3IC0+IDAuMjg5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTA5IHNxdWFyZXJvb3QgMC44MzggLT4gMC45MTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MTAgc3F1YXJlcm9vdCAwLjA4MzggLT4gMC4yODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MTEgc3F1YXJlcm9vdCAwLjgzOSAtPiAwLjkxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxMiBzcXVhcmVyb290IDAuMDgzOSAtPiAwLjI5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxMyBzcXVhcmVyb290IDAuODQxIC0+IDAuOTE3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTE0IHNxdWFyZXJvb3QgMC4wODQxIC0+IDAuMjkKK3NxdHg0NTE1IHNxdWFyZXJvb3QgMC44NDIgLT4gMC45MTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MTYgc3F1YXJlcm9vdCAwLjA4NDIgLT4gMC4yOTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MTcgc3F1YXJlcm9vdCAwLjg0MyAtPiAwLjkxOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxOCBzcXVhcmVyb290IDAuMDg0MyAtPiAwLjI5MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUxOSBzcXVhcmVyb290IDAuODQ0IC0+IDAuOTE5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTIwIHNxdWFyZXJvb3QgMC4wODQ0IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTIxIHNxdWFyZXJvb3QgMC44NDUgLT4gMC45MTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MjIgc3F1YXJlcm9vdCAwLjA4NDUgLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MjMgc3F1YXJlcm9vdCAwLjg0NiAtPiAwLjkyMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUyNCBzcXVhcmVyb290IDAuMDg0NiAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUyNSBzcXVhcmVyb290IDAuODQ3IC0+IDAuOTIwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTI2IHNxdWFyZXJvb3QgMC4wODQ3IC0+IDAuMjkxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTI3IHNxdWFyZXJvb3QgMC44NDggLT4gMC45MjEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Mjggc3F1YXJlcm9vdCAwLjA4NDggLT4gMC4yOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Mjkgc3F1YXJlcm9vdCAwLjg0OSAtPiAwLjkyMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUzMCBzcXVhcmVyb290IDAuMDg0OSAtPiAwLjI5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUzMSBzcXVhcmVyb290IDAuODUxIC0+IDAuOTIyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTMyIHNxdWFyZXJvb3QgMC4wODUxIC0+IDAuMjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTMzIHNxdWFyZXJvb3QgMC44NTIgLT4gMC45MjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MzQgc3F1YXJlcm9vdCAwLjA4NTIgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1MzUgc3F1YXJlcm9vdCAwLjg1MyAtPiAwLjkyNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUzNiBzcXVhcmVyb290IDAuMDg1MyAtPiAwLjI5MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDUzNyBzcXVhcmVyb290IDAuODU0IC0+IDAuOTI0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTM4IHNxdWFyZXJvb3QgMC4wODU0IC0+IDAuMjkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTM5IHNxdWFyZXJvb3QgMC44NTUgLT4gMC45MjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NDAgc3F1YXJlcm9vdCAwLjA4NTUgLT4gMC4yOTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NDEgc3F1YXJlcm9vdCAwLjg1NiAtPiAwLjkyNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0MiBzcXVhcmVyb290IDAuMDg1NiAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0MyBzcXVhcmVyb290IDAuODU3IC0+IDAuOTI2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTQ0IHNxdWFyZXJvb3QgMC4wODU3IC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTQ1IHNxdWFyZXJvb3QgMC44NTggLT4gMC45MjYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NDYgc3F1YXJlcm9vdCAwLjA4NTggLT4gMC4yOTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NDcgc3F1YXJlcm9vdCAwLjg1OSAtPiAwLjkyNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0OCBzcXVhcmVyb290IDAuMDg1OSAtPiAwLjI5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU0OSBzcXVhcmVyb290IDAuODYxIC0+IDAuOTI4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTUwIHNxdWFyZXJvb3QgMC4wODYxIC0+IDAuMjkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTUxIHNxdWFyZXJvb3QgMC44NjIgLT4gMC45MjggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTIgc3F1YXJlcm9vdCAwLjA4NjIgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTMgc3F1YXJlcm9vdCAwLjg2MyAtPiAwLjkyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU1NCBzcXVhcmVyb290IDAuMDg2MyAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU1NSBzcXVhcmVyb290IDAuODY0IC0+IDAuOTMwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTU2IHNxdWFyZXJvb3QgMC4wODY0IC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTU3IHNxdWFyZXJvb3QgMC44NjUgLT4gMC45MzAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTggc3F1YXJlcm9vdCAwLjA4NjUgLT4gMC4yOTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NTkgc3F1YXJlcm9vdCAwLjg2NiAtPiAwLjkzMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU2MCBzcXVhcmVyb290IDAuMDg2NiAtPiAwLjI5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU2MSBzcXVhcmVyb290IDAuODY3IC0+IDAuOTMxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTYyIHNxdWFyZXJvb3QgMC4wODY3IC0+IDAuMjk0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTYzIHNxdWFyZXJvb3QgMC44NjggLT4gMC45MzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NjQgc3F1YXJlcm9vdCAwLjA4NjggLT4gMC4yOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NjUgc3F1YXJlcm9vdCAwLjg2OSAtPiAwLjkzMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU2NiBzcXVhcmVyb290IDAuMDg2OSAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU2NyBzcXVhcmVyb290IDAuODcxIC0+IDAuOTMzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTY4IHNxdWFyZXJvb3QgMC4wODcxIC0+IDAuMjk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTY5IHNxdWFyZXJvb3QgMC44NzIgLT4gMC45MzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NzAgc3F1YXJlcm9vdCAwLjA4NzIgLT4gMC4yOTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NzEgc3F1YXJlcm9vdCAwLjg3MyAtPiAwLjkzNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3MiBzcXVhcmVyb290IDAuMDg3MyAtPiAwLjI5NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3MyBzcXVhcmVyb290IDAuODc0IC0+IDAuOTM1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTc0IHNxdWFyZXJvb3QgMC4wODc0IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTc1IHNxdWFyZXJvb3QgMC44NzUgLT4gMC45MzUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1NzYgc3F1YXJlcm9vdCAwLjA4NzUgLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1Nzcgc3F1YXJlcm9vdCAwLjg3NiAtPiAwLjkzNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3OCBzcXVhcmVyb290IDAuMDg3NiAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU3OSBzcXVhcmVyb290IDAuODc3IC0+IDAuOTM2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTgwIHNxdWFyZXJvb3QgMC4wODc3IC0+IDAuMjk2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTgxIHNxdWFyZXJvb3QgMC44NzggLT4gMC45MzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODIgc3F1YXJlcm9vdCAwLjA4NzggLT4gMC4yOTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODMgc3F1YXJlcm9vdCAwLjg3OSAtPiAwLjkzOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU4NCBzcXVhcmVyb290IDAuMDg3OSAtPiAwLjI5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU4NSBzcXVhcmVyb290IDAuODgxIC0+IDAuOTM5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTg2IHNxdWFyZXJvb3QgMC4wODgxIC0+IDAuMjk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTg3IHNxdWFyZXJvb3QgMC44ODIgLT4gMC45MzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODggc3F1YXJlcm9vdCAwLjA4ODIgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1ODkgc3F1YXJlcm9vdCAwLjg4MyAtPiAwLjk0MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU5MCBzcXVhcmVyb290IDAuMDg4MyAtPiAwLjI5NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU5MSBzcXVhcmVyb290IDAuODg0IC0+IDAuOTQwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTkyIHNxdWFyZXJvb3QgMC4wODg0IC0+IDAuMjk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTkzIHNxdWFyZXJvb3QgMC44ODUgLT4gMC45NDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1OTQgc3F1YXJlcm9vdCAwLjA4ODUgLT4gMC4yOTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ1OTUgc3F1YXJlcm9vdCAwLjg4NiAtPiAwLjk0MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU5NiBzcXVhcmVyb290IDAuMDg4NiAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDU5NyBzcXVhcmVyb290IDAuODg3IC0+IDAuOTQyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTk4IHNxdWFyZXJvb3QgMC4wODg3IC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NTk5IHNxdWFyZXJvb3QgMC44ODggLT4gMC45NDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MDAgc3F1YXJlcm9vdCAwLjA4ODggLT4gMC4yOTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MDEgc3F1YXJlcm9vdCAwLjg4OSAtPiAwLjk0MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwMiBzcXVhcmVyb290IDAuMDg4OSAtPiAwLjI5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwMyBzcXVhcmVyb290IDAuODkxIC0+IDAuOTQ0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjA0IHNxdWFyZXJvb3QgMC4wODkxIC0+IDAuMjk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjA1IHNxdWFyZXJvb3QgMC44OTIgLT4gMC45NDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MDYgc3F1YXJlcm9vdCAwLjA4OTIgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MDcgc3F1YXJlcm9vdCAwLjg5MyAtPiAwLjk0NSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwOCBzcXVhcmVyb290IDAuMDg5MyAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYwOSBzcXVhcmVyb290IDAuODk0IC0+IDAuOTQ2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjEwIHNxdWFyZXJvb3QgMC4wODk0IC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjExIHNxdWFyZXJvb3QgMC44OTUgLT4gMC45NDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTIgc3F1YXJlcm9vdCAwLjA4OTUgLT4gMC4yOTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTMgc3F1YXJlcm9vdCAwLjg5NiAtPiAwLjk0NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYxNCBzcXVhcmVyb290IDAuMDg5NiAtPiAwLjI5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYxNSBzcXVhcmVyb290IDAuODk3IC0+IDAuOTQ3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjE2IHNxdWFyZXJvb3QgMC4wODk3IC0+IDAuMjk5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjE3IHNxdWFyZXJvb3QgMC44OTggLT4gMC45NDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTggc3F1YXJlcm9vdCAwLjA4OTggLT4gMC4zMDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MTkgc3F1YXJlcm9vdCAwLjg5OSAtPiAwLjk0OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYyMCBzcXVhcmVyb290IDAuMDg5OSAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYyMSBzcXVhcmVyb290IDAuOTAxIC0+IDAuOTQ5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjIyIHNxdWFyZXJvb3QgMC4wOTAxIC0+IDAuMzAwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjIzIHNxdWFyZXJvb3QgMC45MDIgLT4gMC45NTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MjQgc3F1YXJlcm9vdCAwLjA5MDIgLT4gMC4zMDAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MjUgc3F1YXJlcm9vdCAwLjkwMyAtPiAwLjk1MCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYyNiBzcXVhcmVyb290IDAuMDkwMyAtPiAwLjMwMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYyNyBzcXVhcmVyb290IDAuOTA0IC0+IDAuOTUxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjI4IHNxdWFyZXJvb3QgMC4wOTA0IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjI5IHNxdWFyZXJvb3QgMC45MDUgLT4gMC45NTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MzAgc3F1YXJlcm9vdCAwLjA5MDUgLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MzEgc3F1YXJlcm9vdCAwLjkwNiAtPiAwLjk1MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzMiBzcXVhcmVyb290IDAuMDkwNiAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzMyBzcXVhcmVyb290IDAuOTA3IC0+IDAuOTUyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjM0IHNxdWFyZXJvb3QgMC4wOTA3IC0+IDAuMzAxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjM1IHNxdWFyZXJvb3QgMC45MDggLT4gMC45NTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2MzYgc3F1YXJlcm9vdCAwLjA5MDggLT4gMC4zMDEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2Mzcgc3F1YXJlcm9vdCAwLjkwOSAtPiAwLjk1MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzOCBzcXVhcmVyb290IDAuMDkwOSAtPiAwLjMwMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDYzOSBzcXVhcmVyb290IDAuOTExIC0+IDAuOTU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjQwIHNxdWFyZXJvb3QgMC4wOTExIC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjQxIHNxdWFyZXJvb3QgMC45MTIgLT4gMC45NTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDIgc3F1YXJlcm9vdCAwLjA5MTIgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDMgc3F1YXJlcm9vdCAwLjkxMyAtPiAwLjk1NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY0NCBzcXVhcmVyb290IDAuMDkxMyAtPiAwLjMwMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY0NSBzcXVhcmVyb290IDAuOTE0IC0+IDAuOTU2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjQ2IHNxdWFyZXJvb3QgMC4wOTE0IC0+IDAuMzAyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjQ3IHNxdWFyZXJvb3QgMC45MTUgLT4gMC45NTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDggc3F1YXJlcm9vdCAwLjA5MTUgLT4gMC4zMDIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NDkgc3F1YXJlcm9vdCAwLjkxNiAtPiAwLjk1NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY1MCBzcXVhcmVyb290IDAuMDkxNiAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY1MSBzcXVhcmVyb290IDAuOTE3IC0+IDAuOTU4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjUyIHNxdWFyZXJvb3QgMC4wOTE3IC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjUzIHNxdWFyZXJvb3QgMC45MTggLT4gMC45NTggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NTQgc3F1YXJlcm9vdCAwLjA5MTggLT4gMC4zMDMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NTUgc3F1YXJlcm9vdCAwLjkxOSAtPiAwLjk1OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY1NiBzcXVhcmVyb290IDAuMDkxOSAtPiAwLjMwMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY1NyBzcXVhcmVyb290IDAuOTIxIC0+IDAuOTYwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjU4IHNxdWFyZXJvb3QgMC4wOTIxIC0+IDAuMzAzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjU5IHNxdWFyZXJvb3QgMC45MjIgLT4gMC45NjAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NjAgc3F1YXJlcm9vdCAwLjA5MjIgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NjEgc3F1YXJlcm9vdCAwLjkyMyAtPiAwLjk2MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2MiBzcXVhcmVyb290IDAuMDkyMyAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2MyBzcXVhcmVyb290IDAuOTI0IC0+IDAuOTYxICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjY0IHNxdWFyZXJvb3QgMC4wOTI0IC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjY1IHNxdWFyZXJvb3QgMC45MjUgLT4gMC45NjIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NjYgc3F1YXJlcm9vdCAwLjA5MjUgLT4gMC4zMDQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2Njcgc3F1YXJlcm9vdCAwLjkyNiAtPiAwLjk2MiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2OCBzcXVhcmVyb290IDAuMDkyNiAtPiAwLjMwNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY2OSBzcXVhcmVyb290IDAuOTI3IC0+IDAuOTYzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjcwIHNxdWFyZXJvb3QgMC4wOTI3IC0+IDAuMzA0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjcxIHNxdWFyZXJvb3QgMC45MjggLT4gMC45NjMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NzIgc3F1YXJlcm9vdCAwLjA5MjggLT4gMC4zMDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2NzMgc3F1YXJlcm9vdCAwLjkyOSAtPiAwLjk2NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY3NCBzcXVhcmVyb290IDAuMDkyOSAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY3NSBzcXVhcmVyb290IDAuOTMxIC0+IDAuOTY1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njc2IHNxdWFyZXJvb3QgMC4wOTMxIC0+IDAuMzA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njc3IHNxdWFyZXJvb3QgMC45MzIgLT4gMC45NjUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2Nzggc3F1YXJlcm9vdCAwLjA5MzIgLT4gMC4zMDUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2Nzkgc3F1YXJlcm9vdCAwLjkzMyAtPiAwLjk2NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY4MCBzcXVhcmVyb290IDAuMDkzMyAtPiAwLjMwNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY4MSBzcXVhcmVyb290IDAuOTM0IC0+IDAuOTY2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjgyIHNxdWFyZXJvb3QgMC4wOTM0IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NjgzIHNxdWFyZXJvb3QgMC45MzUgLT4gMC45NjcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2ODQgc3F1YXJlcm9vdCAwLjA5MzUgLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2ODUgc3F1YXJlcm9vdCAwLjkzNiAtPiAwLjk2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY4NiBzcXVhcmVyb290IDAuMDkzNiAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY4NyBzcXVhcmVyb290IDAuOTM3IC0+IDAuOTY4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njg4IHNxdWFyZXJvb3QgMC4wOTM3IC0+IDAuMzA2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njg5IHNxdWFyZXJvb3QgMC45MzggLT4gMC45NjkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2OTAgc3F1YXJlcm9vdCAwLjA5MzggLT4gMC4zMDYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2OTEgc3F1YXJlcm9vdCAwLjkzOSAtPiAwLjk2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5MiBzcXVhcmVyb290IDAuMDkzOSAtPiAwLjMwNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5MyBzcXVhcmVyb290IDAuOTQxIC0+IDAuOTcwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njk0IHNxdWFyZXJvb3QgMC4wOTQxIC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Njk1IHNxdWFyZXJvb3QgMC45NDIgLT4gMC45NzEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2OTYgc3F1YXJlcm9vdCAwLjA5NDIgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ2OTcgc3F1YXJlcm9vdCAwLjk0MyAtPiAwLjk3MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5OCBzcXVhcmVyb290IDAuMDk0MyAtPiAwLjMwNyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDY5OSBzcXVhcmVyb290IDAuOTQ0IC0+IDAuOTcyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzAwIHNxdWFyZXJvb3QgMC4wOTQ0IC0+IDAuMzA3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzAxIHNxdWFyZXJvb3QgMC45NDUgLT4gMC45NzIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDIgc3F1YXJlcm9vdCAwLjA5NDUgLT4gMC4zMDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDMgc3F1YXJlcm9vdCAwLjk0NiAtPiAwLjk3MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcwNCBzcXVhcmVyb290IDAuMDk0NiAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcwNSBzcXVhcmVyb290IDAuOTQ3IC0+IDAuOTczICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzA2IHNxdWFyZXJvb3QgMC4wOTQ3IC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzA3IHNxdWFyZXJvb3QgMC45NDggLT4gMC45NzQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDggc3F1YXJlcm9vdCAwLjA5NDggLT4gMC4zMDggIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MDkgc3F1YXJlcm9vdCAwLjk0OSAtPiAwLjk3NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcxMCBzcXVhcmVyb290IDAuMDk0OSAtPiAwLjMwOCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcxMSBzcXVhcmVyb290IDAuOTUxIC0+IDAuOTc1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzEyIHNxdWFyZXJvb3QgMC4wOTUxIC0+IDAuMzA4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzEzIHNxdWFyZXJvb3QgMC45NTIgLT4gMC45NzYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MTQgc3F1YXJlcm9vdCAwLjA5NTIgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MTUgc3F1YXJlcm9vdCAwLjk1MyAtPiAwLjk3NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcxNiBzcXVhcmVyb290IDAuMDk1MyAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcxNyBzcXVhcmVyb290IDAuOTU0IC0+IDAuOTc3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzE4IHNxdWFyZXJvb3QgMC4wOTU0IC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzE5IHNxdWFyZXJvb3QgMC45NTUgLT4gMC45NzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MjAgc3F1YXJlcm9vdCAwLjA5NTUgLT4gMC4zMDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MjEgc3F1YXJlcm9vdCAwLjk1NiAtPiAwLjk3OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyMiBzcXVhcmVyb290IDAuMDk1NiAtPiAwLjMwOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyMyBzcXVhcmVyb290IDAuOTU3IC0+IDAuOTc4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzI0IHNxdWFyZXJvb3QgMC4wOTU3IC0+IDAuMzA5ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzI1IHNxdWFyZXJvb3QgMC45NTggLT4gMC45NzkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MjYgc3F1YXJlcm9vdCAwLjA5NTggLT4gMC4zMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Mjcgc3F1YXJlcm9vdCAwLjk1OSAtPiAwLjk3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyOCBzcXVhcmVyb290IDAuMDk1OSAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDcyOSBzcXVhcmVyb290IDAuOTYxIC0+IDAuOTgwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzMwIHNxdWFyZXJvb3QgMC4wOTYxIC0+IDAuMzEKK3NxdHg0NzMxIHNxdWFyZXJvb3QgMC45NjIgLT4gMC45ODEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MzIgc3F1YXJlcm9vdCAwLjA5NjIgLT4gMC4zMTAgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3MzMgc3F1YXJlcm9vdCAwLjk2MyAtPiAwLjk4MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDczNCBzcXVhcmVyb290IDAuMDk2MyAtPiAwLjMxMCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDczNSBzcXVhcmVyb290IDAuOTY0IC0+IDAuOTgyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzM2IHNxdWFyZXJvb3QgMC4wOTY0IC0+IDAuMzEwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzM3IHNxdWFyZXJvb3QgMC45NjUgLT4gMC45ODIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Mzggc3F1YXJlcm9vdCAwLjA5NjUgLT4gMC4zMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Mzkgc3F1YXJlcm9vdCAwLjk2NiAtPiAwLjk4MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc0MCBzcXVhcmVyb290IDAuMDk2NiAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc0MSBzcXVhcmVyb290IDAuOTY3IC0+IDAuOTgzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQyIHNxdWFyZXJvb3QgMC4wOTY3IC0+IDAuMzExICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQzIHNxdWFyZXJvb3QgMC45NjggLT4gMC45ODQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NDQgc3F1YXJlcm9vdCAwLjA5NjggLT4gMC4zMTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NDUgc3F1YXJlcm9vdCAwLjk2OSAtPiAwLjk4NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc0NiBzcXVhcmVyb290IDAuMDk2OSAtPiAwLjMxMSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc0NyBzcXVhcmVyb290IDAuOTcxIC0+IDAuOTg1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQ4IHNxdWFyZXJvb3QgMC4wOTcxIC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzQ5IHNxdWFyZXJvb3QgMC45NzIgLT4gMC45ODYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NTAgc3F1YXJlcm9vdCAwLjA5NzIgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NTEgc3F1YXJlcm9vdCAwLjk3MyAtPiAwLjk4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1MiBzcXVhcmVyb290IDAuMDk3MyAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1MyBzcXVhcmVyb290IDAuOTc0IC0+IDAuOTg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzU0IHNxdWFyZXJvb3QgMC4wOTc0IC0+IDAuMzEyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzU1IHNxdWFyZXJvb3QgMC45NzUgLT4gMC45ODcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NTYgc3F1YXJlcm9vdCAwLjA5NzUgLT4gMC4zMTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NTcgc3F1YXJlcm9vdCAwLjk3NiAtPiAwLjk4OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1OCBzcXVhcmVyb290IDAuMDk3NiAtPiAwLjMxMiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc1OSBzcXVhcmVyb290IDAuOTc3IC0+IDAuOTg4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzYwIHNxdWFyZXJvb3QgMC4wOTc3IC0+IDAuMzEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzYxIHNxdWFyZXJvb3QgMC45NzggLT4gMC45ODkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NjIgc3F1YXJlcm9vdCAwLjA5NzggLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NjMgc3F1YXJlcm9vdCAwLjk3OSAtPiAwLjk4OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc2NCBzcXVhcmVyb290IDAuMDk3OSAtPiAwLjMxMyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc2NSBzcXVhcmVyb290IDAuOTgxIC0+IDAuOTkwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzY2IHNxdWFyZXJvb3QgMC4wOTgxIC0+IDAuMzEzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzY3IHNxdWFyZXJvb3QgMC45ODIgLT4gMC45OTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Njggc3F1YXJlcm9vdCAwLjA5ODIgLT4gMC4zMTMgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3Njkgc3F1YXJlcm9vdCAwLjk4MyAtPiAwLjk5MSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc3MCBzcXVhcmVyb290IDAuMDk4MyAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc3MSBzcXVhcmVyb290IDAuOTg0IC0+IDAuOTkyICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzcyIHNxdWFyZXJvb3QgMC4wOTg0IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzczIHNxdWFyZXJvb3QgMC45ODUgLT4gMC45OTIgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NzQgc3F1YXJlcm9vdCAwLjA5ODUgLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3NzUgc3F1YXJlcm9vdCAwLjk4NiAtPiAwLjk5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc3NiBzcXVhcmVyb290IDAuMDk4NiAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc3NyBzcXVhcmVyb290IDAuOTg3IC0+IDAuOTkzICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzc4IHNxdWFyZXJvb3QgMC4wOTg3IC0+IDAuMzE0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzc5IHNxdWFyZXJvb3QgMC45ODggLT4gMC45OTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3ODAgc3F1YXJlcm9vdCAwLjA5ODggLT4gMC4zMTQgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3ODEgc3F1YXJlcm9vdCAwLjk4OSAtPiAwLjk5NCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4MiBzcXVhcmVyb290IDAuMDk4OSAtPiAwLjMxNCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4MyBzcXVhcmVyb290IDAuOTkxIC0+IDAuOTk1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzg0IHNxdWFyZXJvb3QgMC4wOTkxIC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzg1IHNxdWFyZXJvb3QgMC45OTIgLT4gMC45OTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3ODYgc3F1YXJlcm9vdCAwLjA5OTIgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3ODcgc3F1YXJlcm9vdCAwLjk5MyAtPiAwLjk5NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4OCBzcXVhcmVyb290IDAuMDk5MyAtPiAwLjMxNSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc4OSBzcXVhcmVyb290IDAuOTk0IC0+IDAuOTk3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzkwIHNxdWFyZXJvb3QgMC4wOTk0IC0+IDAuMzE1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0NzkxIHNxdWFyZXJvb3QgMC45OTUgLT4gMC45OTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTIgc3F1YXJlcm9vdCAwLjA5OTUgLT4gMC4zMTUgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTMgc3F1YXJlcm9vdCAwLjk5NiAtPiAwLjk5OCAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc5NCBzcXVhcmVyb290IDAuMDk5NiAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDc5NSBzcXVhcmVyb290IDAuOTk3IC0+IDAuOTk4ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzk2IHNxdWFyZXJvb3QgMC4wOTk3IC0+IDAuMzE2ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg0Nzk3IHNxdWFyZXJvb3QgMC45OTggLT4gMC45OTkgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTggc3F1YXJlcm9vdCAwLjA5OTggLT4gMC4zMTYgIEluZXhhY3QgUm91bmRlZAorc3F0eDQ3OTkgc3F1YXJlcm9vdCAwLjk5OSAtPiAwLjk5OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NDgwMCBzcXVhcmVyb290IDAuMDk5OSAtPiAwLjMxNiAgSW5leGFjdCBSb3VuZGVkCisKKy0tIEEgZ3JvdXAgb2YgcHJlY2lzaW9uIDQgdGVzdHMgd2hlcmUgSHVsbCAmIEFicmhhbSBhZGp1c3RtZW50cyBhcmUKKy0tIG5lZWRlZCBpbiBzb21lIGNhc2VzIChib3RoIHVwIGFuZCBkb3duKSBbc2VlIEh1bGwxOTg1Yl0KK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KK21heEV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitwcmVjaXNpb246ICAgNAorc3F0eDUwMDEgc3F1YXJlcm9vdCAwLjAxMTggIC0+IDAuMTA4NiAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAwMiBzcXVhcmVyb290IDAuMTE5ICAgLT4gMC4zNDUwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDAzIHNxdWFyZXJvb3QgMC4wMTE5ICAtPiAwLjEwOTEgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMDQgc3F1YXJlcm9vdCAwLjEyMSAgIC0+IDAuMzQ3OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAwNSBzcXVhcmVyb290IDAuMDEyMSAgLT4gMC4xMQorc3F0eDUwMDYgc3F1YXJlcm9vdCAwLjEyMiAgIC0+IDAuMzQ5MyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAwNyBzcXVhcmVyb290IDAuMDEyMiAgLT4gMC4xMTA1ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDA4IHNxdWFyZXJvb3QgMC4xMjMgICAtPiAwLjM1MDcgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMDkgc3F1YXJlcm9vdCAwLjQ5NCAgIC0+IDAuNzAyOSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAxMCBzcXVhcmVyb290IDAuMDY2OSAgLT4gMC4yNTg3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDExIHNxdWFyZXJvb3QgMC45NTU4ICAtPiAwLjk3NzcgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMTIgc3F1YXJlcm9vdCAwLjkzNDggIC0+IDAuOTY2OSAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAxMyBzcXVhcmVyb290IDAuOTM0NSAgLT4gMC45NjY3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDE0IHNxdWFyZXJvb3QgMC4wOTM0NSAtPiAwLjMwNTcgIEluZXhhY3QgUm91bmRlZAorc3F0eDUwMTUgc3F1YXJlcm9vdCAwLjkzNDYgIC0+IDAuOTY2NyAgSW5leGFjdCBSb3VuZGVkCitzcXR4NTAxNiBzcXVhcmVyb290IDAuMDkzNDYgLT4gMC4zMDU3ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg1MDE3IHNxdWFyZXJvb3QgMC45MzQ3ICAtPiAwLjk2NjggIEluZXhhY3QgUm91bmRlZAorCistLSBleGFtcGxlcyBmcm9tIGRlY0FyaXRoCitwcmVjaXNpb246IDkKK3NxdHg3MDAgc3F1YXJlcm9vdCAgMCAgICAgICAtPiAnMCcKK3NxdHg3MDEgc3F1YXJlcm9vdCAgLTAgICAgICAtPiAnLTAnCitzcXR4NzAyIHNxdWFyZXJvb3QgIDAuMzkgICAgLT4gMC42MjQ0OTk4MDAgICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzAzIHNxdWFyZXJvb3QgIDEwMCAgICAgLT4gJzEwJworc3F0eDcwNCBzcXVhcmVyb290ICAxLjAwICAgIC0+ICcxLjAnCitzcXR4NzA1IHNxdWFyZXJvb3QgIDcgICAgICAgLT4gJzIuNjQ1NzUxMzEnICAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzA2IHNxdWFyZXJvb3QgIDEwICAgICAgLT4gMy4xNjIyNzc2NiAgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgb25lLW9mZnMKK3ByZWNpc2lvbjogOQorc3F0eDcxMSBzcXVhcmVyb290ICAwLjEgICAgIC0+IDAuMzE2MjI3NzY2ICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxMiBzcXVhcmVyb290ICAwLjIgICAgIC0+IDAuNDQ3MjEzNTk1ICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxMyBzcXVhcmVyb290ICAwLjMgICAgIC0+IDAuNTQ3NzIyNTU4ICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxNCBzcXVhcmVyb290ICAwLjQgICAgIC0+IDAuNjMyNDU1NTMyICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxNSBzcXVhcmVyb290ICAwLjUgICAgIC0+IDAuNzA3MTA2NzgxICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxNiBzcXVhcmVyb290ICAwLjYgICAgIC0+IDAuNzc0NTk2NjY5ICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxNyBzcXVhcmVyb290ICAwLjcgICAgIC0+IDAuODM2NjYwMDI3ICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxOCBzcXVhcmVyb290ICAwLjggICAgIC0+IDAuODk0NDI3MTkxICAgIEluZXhhY3QgUm91bmRlZAorc3F0eDcxOSBzcXVhcmVyb290ICAwLjkgICAgIC0+IDAuOTQ4NjgzMjk4ICAgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxMCAgICAgICAgICAgICAgIC0tIG5vdGUgbm8gbm9ybWFsaXphdG9pbiBoZXJlCitzcXR4NzIwIHNxdWFyZXJvb3QgKzAuMSAgICAgLT4gMC4zMTYyMjc3NjYwICAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDExCitzcXR4NzIxIHNxdWFyZXJvb3QgKzAuMSAgICAgLT4gMC4zMTYyMjc3NjYwMiAgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDEyCitzcXR4NzIyIHNxdWFyZXJvb3QgKzAuMSAgICAgLT4gMC4zMTYyMjc3NjYwMTcgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDkKK3NxdHg3MjMgc3F1YXJlcm9vdCAgMC4zOSAgICAtPiAwLjYyNDQ5OTgwMCAgICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTUKK3NxdHg3MjQgc3F1YXJlcm9vdCAgMC4zOSAgICAtPiAwLjYyNDQ5OTc5OTgzOTg0MCBJbmV4YWN0IFJvdW5kZWQKKworLS0gZGlzY3Vzc2lvbiBjYXNlcworcHJlY2lzaW9uOiA3CitzcXR4NzMxIHNxdWFyZXJvb3QgICAgIDkgICAtPiAgIDMKK3NxdHg3MzIgc3F1YXJlcm9vdCAgIDEwMCAgIC0+ICAxMAorc3F0eDczMyBzcXVhcmVyb290ICAgMTIzICAgLT4gIDExLjA5MDU0ICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3MzQgc3F1YXJlcm9vdCAgIDE0NCAgIC0+ICAxMgorc3F0eDczNSBzcXVhcmVyb290ICAgMTU2ICAgLT4gIDEyLjQ5MDAwICBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3MzYgc3F1YXJlcm9vdCAxMDAwMCAgIC0+IDEwMAorCistLSB2YWx1ZXMgY2xvc2UgdG8gb3ZlcmZsb3cgKGlmIHRoZXJlIHdlcmUgaW5wdXQgcm91bmRpbmcpCittYXhleHBvbmVudDogOTkKK21pbmV4cG9uZW50OiAtOTkKK3ByZWNpc2lvbjogNQorc3F0eDc2MCBzcXVhcmVyb290ICA5Ljk5OTdFKzk5ICAgLT4gOS45OTk4RSs0OSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3NjEgc3F1YXJlcm9vdCAgOS45OTk4RSs5OSAgIC0+IDkuOTk5OUUrNDkgSW5leGFjdCBSb3VuZGVkCitzcXR4NzYyIHNxdWFyZXJvb3QgIDkuOTk5OUUrOTkgICAtPiA5Ljk5OTlFKzQ5IEluZXhhY3QgUm91bmRlZAorc3F0eDc2MyBzcXVhcmVyb290ICA5Ljk5OTkxRSs5OSAgLT4gMS4wMDAwRSs1MCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg3NjQgc3F1YXJlcm9vdCAgOS45OTk5NEUrOTkgIC0+IDEuMDAwMEUrNTAgSW5leGFjdCBSb3VuZGVkCitzcXR4NzY1IHNxdWFyZXJvb3QgIDkuOTk5OTVFKzk5ICAtPiAxLjAwMDBFKzUwIEluZXhhY3QgUm91bmRlZAorc3F0eDc2NiBzcXVhcmVyb290ICA5Ljk5OTk5RSs5OSAgLT4gMS4wMDAwRSs1MCBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogOQorc3F0eDc3MCBzcXVhcmVyb290ICA5Ljk5OTdFKzk5ICAgLT4gOS45OTk4NTAwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDc3MSBzcXVhcmVyb290ICA5Ljk5OThFKzk5ICAgLT4gOS45OTk5MDAwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDc3MiBzcXVhcmVyb290ICA5Ljk5OTlFKzk5ICAgLT4gOS45OTk5NTAwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDc3MyBzcXVhcmVyb290ICA5Ljk5OTkxRSs5OSAgLT4gOS45OTk5NTUwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDc3NCBzcXVhcmVyb290ICA5Ljk5OTk0RSs5OSAgLT4gOS45OTk5NzAwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDc3NSBzcXVhcmVyb290ICA5Ljk5OTk1RSs5OSAgLT4gOS45OTk5NzUwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorc3F0eDc3NiBzcXVhcmVyb290ICA5Ljk5OTk5RSs5OSAgLT4gOS45OTk5OTUwMEUrNDkgIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAyMAorc3F0eDc4MCBzcXVhcmVyb290ICA5Ljk5OTdFKzk5ICAgLT4gJzkuOTk5ODQ5OTk4ODc0OTgzMTI0N0UrNDknIEluZXhhY3QgUm91bmRlZAorc3F0eDc4MSBzcXVhcmVyb290ICA5Ljk5OThFKzk5ICAgLT4gJzkuOTk5ODk5OTk5NDk5OTk0OTk5OUUrNDknIEluZXhhY3QgUm91bmRlZAorc3F0eDc4MiBzcXVhcmVyb290ICA5Ljk5OTlFKzk5ICAgLT4gJzkuOTk5OTQ5OTk5ODc0OTk5Mzc1MEUrNDknIEluZXhhY3QgUm91bmRlZAorc3F0eDc4MyBzcXVhcmVyb290ICA5Ljk5OTkxRSs5OSAgLT4gJzkuOTk5OTU0OTk5ODk4NzQ5NTQ0NEUrNDknIEluZXhhY3QgUm91bmRlZAorc3F0eDc4NCBzcXVhcmVyb290ICA5Ljk5OTk0RSs5OSAgLT4gJzkuOTk5OTY5OTk5OTU0OTk5ODY1MEUrNDknIEluZXhhY3QgUm91bmRlZAorc3F0eDc4NSBzcXVhcmVyb290ICA5Ljk5OTk1RSs5OSAgLT4gJzkuOTk5OTc0OTk5OTY4NzQ5OTIxOUUrNDknIEluZXhhY3QgUm91bmRlZAorc3F0eDc4NiBzcXVhcmVyb290ICA5Ljk5OTk5RSs5OSAgLT4gJzkuOTk5OTk0OTk5OTk4NzQ5OTk5NEUrNDknIEluZXhhY3QgUm91bmRlZAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3dzIFt0aGVzZSBjYW4gb25seSByZXN1bHQgd2hlbiBlTWF4IGlzIDwgZGlnaXRzKzFdCistLSBFdGlueSA9IC0oRW1heCArIChwcmVjaXNpb24tMSkpCistLSBzdGFydCB3aXRoIHN1Ym5vcm1hbCBvcGVyYW5kcyBhbmQgbm9ybWFsIHJlc3VsdHMKK21heGV4cG9uZW50OiA5CittaW5leHBvbmVudDogLTkKK3ByZWNpc2lvbjogOSAgICAgICAgICAgICAgICAtLSBFdGlueT0tMTcKK3NxdHg4MDAgc3F1YXJlcm9vdCAgMUUtMTcgICAtPiAzLjE2MjI3NzY2RS05IEluZXhhY3QgUm91bmRlZAorc3F0eDgwMSBzcXVhcmVyb290IDEwRS0xNyAgIC0+IDEuMEUtOAorcHJlY2lzaW9uOiAxMCAgICAgICAgICAgICAgIC0tIEV0aW55PS0xOAorc3F0eDgwMiBzcXVhcmVyb290IDEwRS0xOCAgIC0+IDMuMTYyMjc3NjYwRS05IEluZXhhY3QgUm91bmRlZAorc3F0eDgwMyBzcXVhcmVyb290ICAxRS0xOCAgIC0+IDFFLTkKKworcHJlY2lzaW9uOiAxMSAgICAgICAgICAgICAgIC0tIEV0aW55PS0xOQorc3F0eDgwNCBzcXVhcmVyb290ICAxRS0xOSAgIC0+IDMuMTYyMjc3NjYwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgwNSBzcXVhcmVyb290IDEwRS0xOSAgIC0+IDEuMEUtOSAgICAgICAgICAgIC0tIGV4YWN0CitwcmVjaXNpb246IDEyICAgICAgICAgICAgICAgLS0gRXRpbnk9LTIwCitzcXR4ODA2IHNxdWFyZXJvb3QgMTBFLTIwICAgLT4gMy4xNjIyNzc2NjAyRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgwNyBzcXVhcmVyb290ICAxRS0yMCAgIC0+IDFFLTEwIFN1Ym5vcm1hbCAgIC0tIGV4YWN0IFN1Ym5vcm1hbCBjYXNlCisKK3ByZWNpc2lvbjogMTMgICAgICAgICAgICAgICAtLSBFdGlueT0tMjEKK3NxdHg4MDggc3F1YXJlcm9vdCAgMUUtMjEgICAtPiAzLjE2MjI3NzY2MDJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODA5IHNxdWFyZXJvb3QgMTBFLTIxICAgLT4gMS4wRS0xMCBTdWJub3JtYWwgLS0gZXhhY3QgU3Vibm9ybWFsIGNhc2UKK3ByZWNpc2lvbjogMTQgICAgICAgICAgICAgICAtLSBFdGlueT0tMjIKK3NxdHg4MTAgc3F1YXJlcm9vdCAgMUUtMjEgICAtPiAzLjE2MjI3NzY2MDE3RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgxMSBzcXVhcmVyb290IDEwRS0yMiAgIC0+IDMuMTYyMjc3NjYwMTdFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODEyIHNxdWFyZXJvb3QgIDFFLTIyICAgLT4gMUUtMTEgU3Vibm9ybWFsICAgLS0gZXhhY3QgU3Vibm9ybWFsIGNhc2UKKworLS0gTm90IGVub3VnaCBkaWdpdHM/CitwcmVjaXNpb246ICAgMTYKK21heEV4cG9uZW50OiAzODQKK21pbkV4cG9uZW50OiAtMzgzCityb3VuZGluZzogICAgaGFsZl9ldmVuCitzcXR4ODE1IHNxdWFyZXJvb3QgMS4wMDAwMDAwMDAxMDAwMDAwRS03OCAgLT4gMS4wMDAwMDAwMDAwNTAwMDBFLTM5IEluZXhhY3QgUm91bmRlZAorLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgMjM0NTY3ODkwMTIzNDU2CisKKy0tIHNwZWNpYWwgdmFsdWVzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorc3F0eDgyMCBzcXVhcmVyb290ICAgSW5mICAgIC0+IEluZmluaXR5CitzcXR4ODIxIHNxdWFyZXJvb3QgIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCitzcXR4ODIyIHNxdWFyZXJvb3QgICBOYU4gICAgLT4gTmFOCitzcXR4ODIzIHNxdWFyZXJvb3QgIHNOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBwcm9wYWdhdGluZyBOYU5zCitzcXR4ODI0IHNxdWFyZXJvb3QgIHNOYU4xMjMgLT4gIE5hTjEyMyBJbnZhbGlkX29wZXJhdGlvbgorc3F0eDgyNSBzcXVhcmVyb290IC1zTmFOMzIxIC0+IC1OYU4zMjEgSW52YWxpZF9vcGVyYXRpb24KK3NxdHg4MjYgc3F1YXJlcm9vdCAgIE5hTjQ1NiAtPiAgTmFONDU2CitzcXR4ODI3IHNxdWFyZXJvb3QgIC1OYU42NTQgLT4gLU5hTjY1NAorc3F0eDgyOCBzcXVhcmVyb290ICAgTmFOMSAgIC0+ICBOYU4xCisKKy0tIHBheWxvYWQgZGVjYXBpdGF0ZQorcHJlY2lzaW9uOiA1CitzcXR4ODQwIHNxdWFyZXJvb3QgLXNOYU4xMjM0NTY3ODkwIC0+IC1OYU42Nzg5MCAgSW52YWxpZF9vcGVyYXRpb24KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLQorLS0gU3BlY2lhbCB0aGFua3MgdG8gTWFyayBEaWNraW5zb24gZm9yIHRlc3RzIGluIHRoZSByYW5nZSA4MDAwLTg5OTkuCistLQorLS0gRXh0cmEgdGVzdHMgZm9yIHRoZSBzcXVhcmUgcm9vdCBmdW5jdGlvbiwgZGVhbGluZyB3aXRoIGEgdmFyaWV0eSBvZgorLS0gY29ybmVyIGNhc2VzLiAgSW4gcGFydGljdWxhciwgdGhlc2UgdGVzdHMgY29uY2VudHJhdGUgb24KKy0tICAgKDEpIGNhc2VzIHdoZXJlIHRoZSBpbnB1dCBwcmVjaXNpb24gZXhjZWVkcyB0aGUgY29udGV4dCBwcmVjaXNpb24sIGFuZAorLS0gICAoMikgY2FzZXMgd2hlcmUgdGhlIGlucHV0IGV4cG9uZW50IGlzIG91dHNpZGUgdGhlIGN1cnJlbnQgY29udGV4dCwKKy0tICAgICAgIGFuZCBpbiBwYXJ0aWN1bGFyIHdoZW4gdGhlIHJlc3VsdCBpcyBzdWJub3JtYWwKKy0tCistLSBtYXhleHBvbmVudCBhbmQgbWluZXhwb25lbnQgYXJlIHNldCB0byA5IGFuZCAtOSBmb3IgbW9zdCBvZiB0aGVzZQorLS0gY2FzZXM7IG9ubHkgdGhlIHByZWNpc2lvbiBjaGFuZ2VzLiAgVGhlIHJvdW5kaW5nIGFsc28gZG9lcyBub3QKKy0tIGNoYW5nZSwgYmVjYXVzZSBpdCBpcyBpZ25vcmVkIGZvciB0aGlzIG9wZXJhdGlvbi4KK21heGV4cG9uZW50OiA5CittaW5leHBvbmVudDogLTkKKworLS0gZXhhY3QgcmVzdWx0cywgaW5wdXQgcHJlY2lzaW9uID4gY29udGV4dCBwcmVjaXNpb24KK3ByZWNpc2lvbjogMQorc3F0eDgwMDAgc3F1YXJlcm9vdCAwIC0+IDAKK3NxdHg4MDAxIHNxdWFyZXJvb3QgMSAtPiAxCitzcXR4ODAwMiBzcXVhcmVyb290IDQgLT4gMgorc3F0eDgwMDMgc3F1YXJlcm9vdCA5IC0+IDMKK3NxdHg4MDA0IHNxdWFyZXJvb3QgMTYgLT4gNAorc3F0eDgwMDUgc3F1YXJlcm9vdCAyNSAtPiA1CitzcXR4ODAwNiBzcXVhcmVyb290IDM2IC0+IDYKK3NxdHg4MDA3IHNxdWFyZXJvb3QgNDkgLT4gNworc3F0eDgwMDggc3F1YXJlcm9vdCA2NCAtPiA4CitzcXR4ODAwOSBzcXVhcmVyb290IDgxIC0+IDkKK3NxdHg4MDEwIHNxdWFyZXJvb3QgMTAwIC0+IDFFKzEgUm91bmRlZAorc3F0eDgwMTEgc3F1YXJlcm9vdCAxMjEgLT4gMUUrMSBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAyCitzcXR4ODAxMiBzcXVhcmVyb290IDAgLT4gMAorc3F0eDgwMTMgc3F1YXJlcm9vdCAxIC0+IDEKK3NxdHg4MDE0IHNxdWFyZXJvb3QgNCAtPiAyCitzcXR4ODAxNSBzcXVhcmVyb290IDkgLT4gMworc3F0eDgwMTYgc3F1YXJlcm9vdCAxNiAtPiA0CitzcXR4ODAxNyBzcXVhcmVyb290IDI1IC0+IDUKK3NxdHg4MDE4IHNxdWFyZXJvb3QgMzYgLT4gNgorc3F0eDgwMTkgc3F1YXJlcm9vdCA0OSAtPiA3CitzcXR4ODAyMCBzcXVhcmVyb290IDY0IC0+IDgKK3NxdHg4MDIxIHNxdWFyZXJvb3QgODEgLT4gOQorc3F0eDgwMjIgc3F1YXJlcm9vdCAxMDAgLT4gMTAKK3NxdHg4MDIzIHNxdWFyZXJvb3QgMTIxIC0+IDExCitzcXR4ODAyNCBzcXVhcmVyb290IDE0NCAtPiAxMgorc3F0eDgwMjUgc3F1YXJlcm9vdCAxNjkgLT4gMTMKK3NxdHg4MDI2IHNxdWFyZXJvb3QgMTk2IC0+IDE0CitzcXR4ODAyNyBzcXVhcmVyb290IDIyNSAtPiAxNQorc3F0eDgwMjggc3F1YXJlcm9vdCAyNTYgLT4gMTYKK3NxdHg4MDI5IHNxdWFyZXJvb3QgMjg5IC0+IDE3CitzcXR4ODAzMCBzcXVhcmVyb290IDMyNCAtPiAxOAorc3F0eDgwMzEgc3F1YXJlcm9vdCAzNjEgLT4gMTkKK3NxdHg4MDMyIHNxdWFyZXJvb3QgNDAwIC0+IDIwCitzcXR4ODAzMyBzcXVhcmVyb290IDQ0MSAtPiAyMQorc3F0eDgwMzQgc3F1YXJlcm9vdCA0ODQgLT4gMjIKK3NxdHg4MDM1IHNxdWFyZXJvb3QgNTI5IC0+IDIzCitzcXR4ODAzNiBzcXVhcmVyb290IDU3NiAtPiAyNAorc3F0eDgwMzcgc3F1YXJlcm9vdCA2MjUgLT4gMjUKK3NxdHg4MDM4IHNxdWFyZXJvb3QgNjc2IC0+IDI2CitzcXR4ODAzOSBzcXVhcmVyb290IDcyOSAtPiAyNworc3F0eDgwNDAgc3F1YXJlcm9vdCA3ODQgLT4gMjgKK3NxdHg4MDQxIHNxdWFyZXJvb3QgODQxIC0+IDI5CitzcXR4ODA0MiBzcXVhcmVyb290IDkwMCAtPiAzMAorc3F0eDgwNDMgc3F1YXJlcm9vdCA5NjEgLT4gMzEKK3NxdHg4MDQ0IHNxdWFyZXJvb3QgMTAyNCAtPiAzMgorc3F0eDgwNDUgc3F1YXJlcm9vdCAxMDg5IC0+IDMzCitzcXR4ODA0NiBzcXVhcmVyb290IDExNTYgLT4gMzQKK3NxdHg4MDQ3IHNxdWFyZXJvb3QgMTIyNSAtPiAzNQorc3F0eDgwNDggc3F1YXJlcm9vdCAxMjk2IC0+IDM2CitzcXR4ODA0OSBzcXVhcmVyb290IDEzNjkgLT4gMzcKK3NxdHg4MDUwIHNxdWFyZXJvb3QgMTQ0NCAtPiAzOAorc3F0eDgwNTEgc3F1YXJlcm9vdCAxNTIxIC0+IDM5CitzcXR4ODA1MiBzcXVhcmVyb290IDE2MDAgLT4gNDAKK3NxdHg4MDUzIHNxdWFyZXJvb3QgMTY4MSAtPiA0MQorc3F0eDgwNTQgc3F1YXJlcm9vdCAxNzY0IC0+IDQyCitzcXR4ODA1NSBzcXVhcmVyb290IDE4NDkgLT4gNDMKK3NxdHg4MDU2IHNxdWFyZXJvb3QgMTkzNiAtPiA0NAorc3F0eDgwNTcgc3F1YXJlcm9vdCAyMDI1IC0+IDQ1CitzcXR4ODA1OCBzcXVhcmVyb290IDIxMTYgLT4gNDYKK3NxdHg4MDU5IHNxdWFyZXJvb3QgMjIwOSAtPiA0Nworc3F0eDgwNjAgc3F1YXJlcm9vdCAyMzA0IC0+IDQ4CitzcXR4ODA2MSBzcXVhcmVyb290IDI0MDEgLT4gNDkKK3NxdHg4MDYyIHNxdWFyZXJvb3QgMjUwMCAtPiA1MAorc3F0eDgwNjMgc3F1YXJlcm9vdCAyNjAxIC0+IDUxCitzcXR4ODA2NCBzcXVhcmVyb290IDI3MDQgLT4gNTIKK3NxdHg4MDY1IHNxdWFyZXJvb3QgMjgwOSAtPiA1Mworc3F0eDgwNjYgc3F1YXJlcm9vdCAyOTE2IC0+IDU0CitzcXR4ODA2NyBzcXVhcmVyb290IDMwMjUgLT4gNTUKK3NxdHg4MDY4IHNxdWFyZXJvb3QgMzEzNiAtPiA1Ngorc3F0eDgwNjkgc3F1YXJlcm9vdCAzMjQ5IC0+IDU3CitzcXR4ODA3MCBzcXVhcmVyb290IDMzNjQgLT4gNTgKK3NxdHg4MDcxIHNxdWFyZXJvb3QgMzQ4MSAtPiA1OQorc3F0eDgwNzIgc3F1YXJlcm9vdCAzNjAwIC0+IDYwCitzcXR4ODA3MyBzcXVhcmVyb290IDM3MjEgLT4gNjEKK3NxdHg4MDc0IHNxdWFyZXJvb3QgMzg0NCAtPiA2Mgorc3F0eDgwNzUgc3F1YXJlcm9vdCAzOTY5IC0+IDYzCitzcXR4ODA3NiBzcXVhcmVyb290IDQwOTYgLT4gNjQKK3NxdHg4MDc3IHNxdWFyZXJvb3QgNDIyNSAtPiA2NQorc3F0eDgwNzggc3F1YXJlcm9vdCA0MzU2IC0+IDY2CitzcXR4ODA3OSBzcXVhcmVyb290IDQ0ODkgLT4gNjcKK3NxdHg4MDgwIHNxdWFyZXJvb3QgNDYyNCAtPiA2OAorc3F0eDgwODEgc3F1YXJlcm9vdCA0NzYxIC0+IDY5CitzcXR4ODA4MiBzcXVhcmVyb290IDQ5MDAgLT4gNzAKK3NxdHg4MDgzIHNxdWFyZXJvb3QgNTA0MSAtPiA3MQorc3F0eDgwODQgc3F1YXJlcm9vdCA1MTg0IC0+IDcyCitzcXR4ODA4NSBzcXVhcmVyb290IDUzMjkgLT4gNzMKK3NxdHg4MDg2IHNxdWFyZXJvb3QgNTQ3NiAtPiA3NAorc3F0eDgwODcgc3F1YXJlcm9vdCA1NjI1IC0+IDc1CitzcXR4ODA4OCBzcXVhcmVyb290IDU3NzYgLT4gNzYKK3NxdHg4MDg5IHNxdWFyZXJvb3QgNTkyOSAtPiA3Nworc3F0eDgwOTAgc3F1YXJlcm9vdCA2MDg0IC0+IDc4CitzcXR4ODA5MSBzcXVhcmVyb290IDYyNDEgLT4gNzkKK3NxdHg4MDkyIHNxdWFyZXJvb3QgNjQwMCAtPiA4MAorc3F0eDgwOTMgc3F1YXJlcm9vdCA2NTYxIC0+IDgxCitzcXR4ODA5NCBzcXVhcmVyb290IDY3MjQgLT4gODIKK3NxdHg4MDk1IHNxdWFyZXJvb3QgNjg4OSAtPiA4Mworc3F0eDgwOTYgc3F1YXJlcm9vdCA3MDU2IC0+IDg0CitzcXR4ODA5NyBzcXVhcmVyb290IDcyMjUgLT4gODUKK3NxdHg4MDk4IHNxdWFyZXJvb3QgNzM5NiAtPiA4Ngorc3F0eDgwOTkgc3F1YXJlcm9vdCA3NTY5IC0+IDg3CitzcXR4ODEwMCBzcXVhcmVyb290IDc3NDQgLT4gODgKK3NxdHg4MTAxIHNxdWFyZXJvb3QgNzkyMSAtPiA4OQorc3F0eDgxMDIgc3F1YXJlcm9vdCA4MTAwIC0+IDkwCitzcXR4ODEwMyBzcXVhcmVyb290IDgyODEgLT4gOTEKK3NxdHg4MTA0IHNxdWFyZXJvb3QgODQ2NCAtPiA5Mgorc3F0eDgxMDUgc3F1YXJlcm9vdCA4NjQ5IC0+IDkzCitzcXR4ODEwNiBzcXVhcmVyb290IDg4MzYgLT4gOTQKK3NxdHg4MTA3IHNxdWFyZXJvb3QgOTAyNSAtPiA5NQorc3F0eDgxMDggc3F1YXJlcm9vdCA5MjE2IC0+IDk2CitzcXR4ODEwOSBzcXVhcmVyb290IDk0MDkgLT4gOTcKK3NxdHg4MTEwIHNxdWFyZXJvb3QgOTYwNCAtPiA5OAorc3F0eDgxMTEgc3F1YXJlcm9vdCA5ODAxIC0+IDk5CitzcXR4ODExMiBzcXVhcmVyb290IDEwMDAwIC0+IDEuMEUrMiBSb3VuZGVkCitzcXR4ODExMyBzcXVhcmVyb290IDEwMjAxIC0+IDEuMEUrMiBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAzCitzcXR4ODExNCBzcXVhcmVyb290IDg0MSAtPiAyOQorc3F0eDgxMTUgc3F1YXJlcm9vdCAxNjAwIC0+IDQwCitzcXR4ODExNiBzcXVhcmVyb290IDIyMDkgLT4gNDcKK3NxdHg4MTE3IHNxdWFyZXJvb3QgOTYwNCAtPiA5OAorc3F0eDgxMTggc3F1YXJlcm9vdCAyMTMxNiAtPiAxNDYKK3NxdHg4MTE5IHNxdWFyZXJvb3QgNTI0NDEgLT4gMjI5CitzcXR4ODEyMCBzcXVhcmVyb290IDY4NjQ0IC0+IDI2Mgorc3F0eDgxMjEgc3F1YXJlcm9vdCA2OTY5NiAtPiAyNjQKK3NxdHg4MTIyIHNxdWFyZXJvb3QgNzAyMjUgLT4gMjY1CitzcXR4ODEyMyBzcXVhcmVyb290IDc2NzI5IC0+IDI3Nworc3F0eDgxMjQgc3F1YXJlcm9vdCAxMzAzMjEgLT4gMzYxCitzcXR4ODEyNSBzcXVhcmVyb290IDE3MTM5NiAtPiA0MTQKK3NxdHg4MTI2IHNxdWFyZXJvb3QgMjcwNDAwIC0+IDUyMAorc3F0eDgxMjcgc3F1YXJlcm9vdCAyNzk4NDEgLT4gNTI5CitzcXR4ODEyOCBzcXVhcmVyb290IDQwNzA0NCAtPiA2MzgKK3NxdHg4MTI5IHNxdWFyZXJvb3QgNDA4MzIxIC0+IDYzOQorc3F0eDgxMzAgc3F1YXJlcm9vdCA0ODAyNDkgLT4gNjkzCitzcXR4ODEzMSBzcXVhcmVyb290IDUxNjk2MSAtPiA3MTkKK3NxdHg4MTMyIHNxdWFyZXJvb3QgNjkyMjI0IC0+IDgzMgorc3F0eDgxMzMgc3F1YXJlcm9vdCA4Mjk5MjEgLT4gOTExCisKKy0tIHNlbGVjdGlvbiBvZiByYW5kb20gZXhhY3QgcmVzdWx0cworcHJlY2lzaW9uOiA2CitzcXR4ODEzNCBzcXVhcmVyb290IDIuMjVFLTEyIC0+IDAuMDAwMDAxNQorc3F0eDgxMzUgc3F1YXJlcm9vdCA4LjQxRS0xNCAtPiAyLjlFLTcKK3NxdHg4MTM2IHNxdWFyZXJvb3QgNi4yNDFFLTE1IC0+IDcuOUUtOAorc3F0eDgxMzcgc3F1YXJlcm9vdCA1LjA0MUUrMTMgLT4gNy4xRSs2CitzcXR4ODEzOCBzcXVhcmVyb290IDQ3NjEgLT4gNjkKK3NxdHg4MTM5IHNxdWFyZXJvb3QgMS4zNjlFKzE3IC0+IDMuN0UrOAorc3F0eDgxNDAgc3F1YXJlcm9vdCAwLjAwMDAyMTE2IC0+IDAuMDA0Ngorc3F0eDgxNDEgc3F1YXJlcm9vdCA3LjI5RSs0IC0+IDIuN0UrMgorc3F0eDgxNDIgc3F1YXJlcm9vdCA0LjYyNEUtMTMgLT4gNi44RS03CitzcXR4ODE0MyBzcXVhcmVyb290IDMuOTY5RSs1IC0+IDYuM0UrMgorc3F0eDgxNDQgc3F1YXJlcm9vdCAzLjczMzIxRS0xMSAtPiAwLjAwMDAwNjExCitzcXR4ODE0NSBzcXVhcmVyb290IDUuNjEwMDFFKzE3IC0+IDcuNDlFKzgKK3NxdHg4MTQ2IHNxdWFyZXJvb3QgMi4zMDQwMEUtMTEgLT4gMC4wMDAwMDQ4MAorc3F0eDgxNDcgc3F1YXJlcm9vdCA0LjMwMzM2RSsxNyAtPiA2LjU2RSs4CitzcXR4ODE0OCBzcXVhcmVyb290IDAuMDU3MTIxIC0+IDAuMjM5CitzcXR4ODE0OSBzcXVhcmVyb290IDcuMjI1RSsxNyAtPiA4LjVFKzgKK3NxdHg4MTUwIHNxdWFyZXJvb3QgMy4xNDcyMUUrMTMgLT4gNS42MUUrNgorc3F0eDgxNTEgc3F1YXJlcm9vdCA0LjYxMDQxRSsxNyAtPiA2Ljc5RSs4CitzcXR4ODE1MiBzcXVhcmVyb290IDEuMzk4NzZFLTE1IC0+IDMuNzRFLTgKK3NxdHg4MTUzIHNxdWFyZXJvb3QgNi4xOTM2OUUtOSAtPiAwLjAwMDA3ODcKK3NxdHg4MTU0IHNxdWFyZXJvb3QgMS42MjA1MjlFLTEwIC0+IDAuMDAwMDEyNzMKK3NxdHg4MTU1IHNxdWFyZXJvb3QgMTE3Ny4xNzYxIC0+IDM0LjMxCitzcXR4ODE1NiBzcXVhcmVyb290IDY3MDQzMzQ0IC0+IDgxODgKK3NxdHg4MTU3IHNxdWFyZXJvb3QgNC44NEUrNiAtPiAyLjJFKzMKK3NxdHg4MTU4IHNxdWFyZXJvb3QgMS4yMzkwNEUrMTEgLT4gMy41MkUrNQorc3F0eDgxNTkgc3F1YXJlcm9vdCAzMjYwNDEwMCAtPiA1NzEwCitzcXR4ODE2MCBzcXVhcmVyb290IDIuOTc1NzAyNUUtMTEgLT4gMC4wMDAwMDU0NTUKK3NxdHg4MTYxIHNxdWFyZXJvb3QgNi4zNzYwMjI1RS05IC0+IDAuMDAwMDc5ODUKK3NxdHg4MTYyIHNxdWFyZXJvb3QgNC41MTk4NzI5RS0xMSAtPiAwLjAwMDAwNjcyMworc3F0eDgxNjMgc3F1YXJlcm9vdCAxLjQ3NDU2MDBFLTExIC0+IDAuMDAwMDAzODQwCitzcXR4ODE2NCBzcXVhcmVyb290IDE4OTY0MjgzLjA0IC0+IDQzNTQuOAorc3F0eDgxNjUgc3F1YXJlcm9vdCAzLjMwODg5NTUyOUUrMTMgLT4gNS43NTIzRSs2CitzcXR4ODE2NiBzcXVhcmVyb290IDAuMDAyODU5MDQwOSAtPiAwLjA1MzQ3CitzcXR4ODE2NyBzcXVhcmVyb290IDM1NzIuMjEzODI0IC0+IDU5Ljc2OAorc3F0eDgxNjggc3F1YXJlcm9vdCA0LjI3NDAyMTM3NkUrMTUgLT4gNi41Mzc2RSs3CitzcXR4ODE2OSBzcXVhcmVyb290IDQ0NTU0NzYuNjQgLT4gMjExMC44CitzcXR4ODE3MCBzcXVhcmVyb290IDM4LjQ0IC0+IDYuMgorc3F0eDgxNzEgc3F1YXJlcm9vdCA2OC41NTg0MDAgLT4gOC4yODAKK3NxdHg4MTcyIHNxdWFyZXJvb3QgNzE1NDAyMDA5IC0+IDI2NzQ3CitzcXR4ODE3MyBzcXVhcmVyb290IDkzLjM3MzU2OSAtPiA5LjY2Mworc3F0eDgxNzQgc3F1YXJlcm9vdCAyLjYyMTQ0MDAwMDAwRSsxNSAtPiA1LjEyMDAwRSs3CitzcXR4ODE3NSBzcXVhcmVyb290IDcuNDgyMjUwMDAwMDBFKzE1IC0+IDguNjUwMDBFKzcKK3NxdHg4MTc2IHNxdWFyZXJvb3QgMy4zODcyNDAwMDAwMEUtOSAtPiAwLjAwMDA1ODIwMDAKK3NxdHg4MTc3IHNxdWFyZXJvb3QgNS42NDAwMTAwMDAwMEUtMTMgLT4gNy41MTAwMEUtNworc3F0eDgxNzggc3F1YXJlcm9vdCA1LjA2OTQ0MDAwMDAwRS0xNSAtPiA3LjEyMDAwRS04CitzcXR4ODE3OSBzcXVhcmVyb290IDQuOTU2MTYwMDAwMDBFKzE3IC0+IDcuMDQwMDBFKzgKK3NxdHg4MTgwIHNxdWFyZXJvb3QgMC4wMDAwMjQyMDY0MDAwMDAwIC0+IDAuMDA0OTIwMDAKK3NxdHg4MTgxIHNxdWFyZXJvb3QgMS40ODk5NjAwMDAwMEUtMTUgLT4gMy44NjAwMEUtOAorc3F0eDgxODIgc3F1YXJlcm9vdCA5LjM3MDI0MDAwMDAwRSsxNyAtPiA5LjY4MDAwRSs4CitzcXR4ODE4MyBzcXVhcmVyb290IDcxMjg5MDAuMDAwMCAtPiAyNjcwLjAwCitzcXR4ODE4NCBzcXVhcmVyb290IDguMjMxMTYxMDAwMEUtMTAgLT4gMC4wMDAwMjg2OTAwCitzcXR4ODE4NSBzcXVhcmVyb290IDQ4Mjc0NzA0MDAwMCAtPiA2OTQ4MDAKK3NxdHg4MTg2IHNxdWFyZXJvb3QgNC4xNDQ3ODQ0MDAwMEUrMTcgLT4gNi40MzgwMEUrOAorc3F0eDgxODcgc3F1YXJlcm9vdCA1LjEwNTEwMjUwMDAwRS03IC0+IDAuMDAwNzE0NTAwCitzcXR4ODE4OCBzcXVhcmVyb290IDM1NTA5Ni44MTAwMDAgLT4gNTk1LjkwMAorc3F0eDgxODkgc3F1YXJlcm9vdCAxNDI4ODQwMC4wMDAwIC0+IDM3ODAuMDAKK3NxdHg4MTkwIHNxdWFyZXJvb3QgMy4zNjE2ODA0MDAwMEUtMTUgLT4gNS43OTgwMEUtOAorc3F0eDgxOTEgc3F1YXJlcm9vdCAxLjcwODk5NTYwMDAwRS0xMyAtPiA0LjEzNDAwRS03CitzcXR4ODE5MiBzcXVhcmVyb290IDAuMDAwMDM3ODM0ODAxMDAwMCAtPiAwLjAwNjE1MTAwCitzcXR4ODE5MyBzcXVhcmVyb290IDIuMDA5NzI4OTAwMDBFLTEzIC0+IDQuNDgzMDBFLTcKK3NxdHg4MTk0IHNxdWFyZXJvb3QgNC4wNzIyMjY1OTYwMEUtMTMgLT4gNi4zODE0MEUtNworc3F0eDgxOTUgc3F1YXJlcm9vdCAxMzE0ODYwMTIxMDAgLT4gMzYyNjEwCitzcXR4ODE5NiBzcXVhcmVyb290IDgxODE5MjYxMTYwMCAtPiA5MDQ1NDAKK3NxdHg4MTk3IHNxdWFyZXJvb3QgOS44NTU4MzIzNjAwRSsxNiAtPiAzLjEzOTQwRSs4CitzcXR4ODE5OCBzcXVhcmVyb290IDU2NDEuMDYxNDQ5MDAgLT4gNzUuMTA3MAorc3F0eDgxOTkgc3F1YXJlcm9vdCA0LjU4Nzg5NDc1NjAwRSsxNyAtPiA2Ljc3MzQwRSs4CitzcXR4ODIwMCBzcXVhcmVyb290IDMuMjEzODY5NDgxMDBFLTkgLT4gMC4wMDAwNTY2OTEwCitzcXR4ODIwMSBzcXVhcmVyb290IDMuOTQ0MTk2MDAwMEUtOCAtPiAwLjAwMDE5ODYwMAorc3F0eDgyMDIgc3F1YXJlcm9vdCAyNDI3MjMuNzI4OTAwIC0+IDQ5Mi42NzAKK3NxdHg4MjAzIHNxdWFyZXJvb3QgMTg3NC44OTAwMDAwMCAtPiA0My4zMDAwCitzcXR4ODIwNCBzcXVhcmVyb290IDIuNTY3MjI1OTU2ODRFKzE1IC0+IDUuMDY2NzhFKzcKK3NxdHg4MjA1IHNxdWFyZXJvb3QgMy45NjQzNzcxNDY4OUUtMTcgLT4gNi4yOTYzM0UtOQorc3F0eDgyMDYgc3F1YXJlcm9vdCAzLjgwMTA2Nzc0Nzg0RS0xNyAtPiA2LjE2NTI4RS05CitzcXR4ODIwNyBzcXVhcmVyb290IDEuNDI0MDM1ODg0OTZFLTEzIC0+IDMuNzczNjRFLTcKK3NxdHg4MjA4IHNxdWFyZXJvb3QgNDYwNC44NDM4ODEwMCAtPiA2Ny44NTkwCitzcXR4ODIwOSBzcXVhcmVyb290IDIxNTcxMDA4NjkuMTYgLT4gNDY0NDQuNgorc3F0eDgyMTAgc3F1YXJlcm9vdCAzNTUyODg1NzAuODEgLT4gMTg4NDkuMQorc3F0eDgyMTEgc3F1YXJlcm9vdCA0LjY5Nzc1OTAxNjA0RS0xMSAtPiAwLjAwMDAwNjg1NDAyCitzcXR4ODIxMiBzcXVhcmVyb290IDguMjIxMTU3NzA0MzZFKzE3IC0+IDkuMDY3MDZFKzgKK3NxdHg4MjEzIHNxdWFyZXJvb3QgNy4xNjQ0Mzc0NDkwMEUrMTUgLT4gOC40NjQzMEUrNworc3F0eDgyMTQgc3F1YXJlcm9vdCA5LjQ4OTk1NDk4ODk2RSsxNSAtPiA5Ljc0MTY0RSs3CitzcXR4ODIxNSBzcXVhcmVyb290IDAuMDAwMDQxOTA5MTgwMTEyOSAtPiAwLjAwNjQ3MzczCitzcXR4ODIxNiBzcXVhcmVyb290IDU4NjI2Mjc5OTYuODQgLT4gNzY1NjcuOAorc3F0eDgyMTcgc3F1YXJlcm9vdCA5MzY5NTM3LjM0MDkgLT4gMzA2MC45Nworc3F0eDgyMTggc3F1YXJlcm9vdCA3Ljc0NzkyNTI5NzI5RSsxNyAtPiA4LjgwMjIzRSs4CitzcXR4ODIxOSBzcXVhcmVyb290IDEuMDg2MjY5MzEzOTZFKzE3IC0+IDMuMjk1ODZFKzgKK3NxdHg4MjIwIHNxdWFyZXJvb3QgOC44OTU4NDczOTY4NEUtNyAtPiAwLjAwMDk0MzE3OAorc3F0eDgyMjEgc3F1YXJlcm9vdCA0LjAyNjYwNDA4OTZFLTE4IC0+IDIuMDA2NjRFLTkKK3NxdHg4MjIyIHNxdWFyZXJvb3QgOS4yNzY2OTQ4MDMzNkUtNyAtPiAwLjAwMDk2MzE1Ngorc3F0eDgyMjMgc3F1YXJlcm9vdCAwLjAwMjI1NDk3NzE3OTU2IC0+IDAuMDQ3NDg2NgorCistLSB0ZXN0IHVzZSBvZiByb3VuZC1oYWxmLWV2ZW4gZm9yIHRpZXMKK3ByZWNpc2lvbjogMQorc3F0eDgyMjQgc3F1YXJlcm9vdCAyMjUgLT4gMkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjI1IHNxdWFyZXJvb3QgNjI1IC0+IDJFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIyNiBzcXVhcmVyb290IDEyMjUgLT4gNEUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjI3IHNxdWFyZXJvb3QgMjAyNSAtPiA0RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMjggc3F1YXJlcm9vdCAzMDI1IC0+IDZFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIyOSBzcXVhcmVyb290IDQyMjUgLT4gNkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjMwIHNxdWFyZXJvb3QgNTYyNSAtPiA4RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMzEgc3F1YXJlcm9vdCA3MjI1IC0+IDhFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIzMiBzcXVhcmVyb290IDkwMjUgLT4gMUUrMiBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAyCitzcXR4ODIzMyBzcXVhcmVyb290IDExMDI1IC0+IDEuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjM0IHNxdWFyZXJvb3QgMTMyMjUgLT4gMS4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMzUgc3F1YXJlcm9vdCAxNTYyNSAtPiAxLjJFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIzNiBzcXVhcmVyb290IDE4MjI1IC0+IDEuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjM3IHNxdWFyZXJvb3QgMjEwMjUgLT4gMS40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyMzggc3F1YXJlcm9vdCAyNDAyNSAtPiAxLjZFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODIzOSBzcXVhcmVyb290IDI3MjI1IC0+IDEuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjQwIHNxdWFyZXJvb3QgMzA2MjUgLT4gMS44RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNDEgc3F1YXJlcm9vdCAzNDIyNSAtPiAxLjhFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI0MiBzcXVhcmVyb290IDM4MDI1IC0+IDIuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjQzIHNxdWFyZXJvb3QgNDIwMjUgLT4gMi4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNDQgc3F1YXJlcm9vdCA0NjIyNSAtPiAyLjJFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI0NSBzcXVhcmVyb290IDUwNjI1IC0+IDIuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjQ2IHNxdWFyZXJvb3QgNTUyMjUgLT4gMi40RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNDcgc3F1YXJlcm9vdCA2MDAyNSAtPiAyLjRFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI0OCBzcXVhcmVyb290IDY1MDI1IC0+IDIuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjQ5IHNxdWFyZXJvb3QgNzAyMjUgLT4gMi42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTAgc3F1YXJlcm9vdCA3NTYyNSAtPiAyLjhFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI1MSBzcXVhcmVyb290IDgxMjI1IC0+IDIuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjUyIHNxdWFyZXJvb3QgODcwMjUgLT4gMy4wRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDgyNTMgc3F1YXJlcm9vdCA5MzAyNSAtPiAzLjBFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODI1NCBzcXVhcmVyb290IDk5MjI1IC0+IDMuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjU1IHNxdWFyZXJvb3QgMTA1NjI1IC0+IDMuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjU2IHNxdWFyZXJvb3QgMTEyMjI1IC0+IDMuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjU3IHNxdWFyZXJvb3QgMTE5MDI1IC0+IDMuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjU4IHNxdWFyZXJvb3QgMTI2MDI1IC0+IDMuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjU5IHNxdWFyZXJvb3QgMTMzMjI1IC0+IDMuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjYwIHNxdWFyZXJvb3QgMTQwNjI1IC0+IDMuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjYxIHNxdWFyZXJvb3QgMTQ4MjI1IC0+IDMuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjYyIHNxdWFyZXJvb3QgMTU2MDI1IC0+IDQuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjYzIHNxdWFyZXJvb3QgMTY0MDI1IC0+IDQuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjY0IHNxdWFyZXJvb3QgMTcyMjI1IC0+IDQuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjY1IHNxdWFyZXJvb3QgMTgwNjI1IC0+IDQuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjY2IHNxdWFyZXJvb3QgMTg5MjI1IC0+IDQuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjY3IHNxdWFyZXJvb3QgMTk4MDI1IC0+IDQuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjY4IHNxdWFyZXJvb3QgMjA3MDI1IC0+IDQuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjY5IHNxdWFyZXJvb3QgMjE2MjI1IC0+IDQuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjcwIHNxdWFyZXJvb3QgMjI1NjI1IC0+IDQuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjcxIHNxdWFyZXJvb3QgMjM1MjI1IC0+IDQuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjcyIHNxdWFyZXJvb3QgMjQ1MDI1IC0+IDUuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjczIHNxdWFyZXJvb3QgMjU1MDI1IC0+IDUuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjc0IHNxdWFyZXJvb3QgMjY1MjI1IC0+IDUuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjc1IHNxdWFyZXJvb3QgMjc1NjI1IC0+IDUuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjc2IHNxdWFyZXJvb3QgMjg2MjI1IC0+IDUuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjc3IHNxdWFyZXJvb3QgMjk3MDI1IC0+IDUuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjc4IHNxdWFyZXJvb3QgMzA4MDI1IC0+IDUuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjc5IHNxdWFyZXJvb3QgMzE5MjI1IC0+IDUuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjgwIHNxdWFyZXJvb3QgMzMwNjI1IC0+IDUuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjgxIHNxdWFyZXJvb3QgMzQyMjI1IC0+IDUuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjgyIHNxdWFyZXJvb3QgMzU0MDI1IC0+IDYuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjgzIHNxdWFyZXJvb3QgMzY2MDI1IC0+IDYuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjg0IHNxdWFyZXJvb3QgMzc4MjI1IC0+IDYuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjg1IHNxdWFyZXJvb3QgMzkwNjI1IC0+IDYuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjg2IHNxdWFyZXJvb3QgNDAzMjI1IC0+IDYuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjg3IHNxdWFyZXJvb3QgNDE2MDI1IC0+IDYuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjg4IHNxdWFyZXJvb3QgNDI5MDI1IC0+IDYuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjg5IHNxdWFyZXJvb3QgNDQyMjI1IC0+IDYuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjkwIHNxdWFyZXJvb3QgNDU1NjI1IC0+IDYuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjkxIHNxdWFyZXJvb3QgNDY5MjI1IC0+IDYuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjkyIHNxdWFyZXJvb3QgNDgzMDI1IC0+IDcuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MjkzIHNxdWFyZXJvb3QgNDk3MDI1IC0+IDcuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjk0IHNxdWFyZXJvb3QgNTExMjI1IC0+IDcuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjk1IHNxdWFyZXJvb3QgNTI1NjI1IC0+IDcuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjk2IHNxdWFyZXJvb3QgNTQwMjI1IC0+IDcuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjk3IHNxdWFyZXJvb3QgNTU1MDI1IC0+IDcuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjk4IHNxdWFyZXJvb3QgNTcwMDI1IC0+IDcuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mjk5IHNxdWFyZXJvb3QgNTg1MjI1IC0+IDcuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzAwIHNxdWFyZXJvb3QgNjAwNjI1IC0+IDcuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzAxIHNxdWFyZXJvb3QgNjE2MjI1IC0+IDcuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzAyIHNxdWFyZXJvb3QgNjMyMDI1IC0+IDguMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzAzIHNxdWFyZXJvb3QgNjQ4MDI1IC0+IDguMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzA0IHNxdWFyZXJvb3QgNjY0MjI1IC0+IDguMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzA1IHNxdWFyZXJvb3QgNjgwNjI1IC0+IDguMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzA2IHNxdWFyZXJvb3QgNjk3MjI1IC0+IDguNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzA3IHNxdWFyZXJvb3QgNzE0MDI1IC0+IDguNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzA4IHNxdWFyZXJvb3QgNzMxMDI1IC0+IDguNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzA5IHNxdWFyZXJvb3QgNzQ4MjI1IC0+IDguNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzEwIHNxdWFyZXJvb3QgNzY1NjI1IC0+IDguOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzExIHNxdWFyZXJvb3QgNzgzMjI1IC0+IDguOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzEyIHNxdWFyZXJvb3QgODAxMDI1IC0+IDkuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzEzIHNxdWFyZXJvb3QgODE5MDI1IC0+IDkuMEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzE0IHNxdWFyZXJvb3QgODM3MjI1IC0+IDkuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzE1IHNxdWFyZXJvb3QgODU1NjI1IC0+IDkuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzE2IHNxdWFyZXJvb3QgODc0MjI1IC0+IDkuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzE3IHNxdWFyZXJvb3QgODkzMDI1IC0+IDkuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzE4IHNxdWFyZXJvb3QgOTEyMDI1IC0+IDkuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzE5IHNxdWFyZXJvb3QgOTMxMjI1IC0+IDkuNkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzIwIHNxdWFyZXJvb3QgOTUwNjI1IC0+IDkuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzIxIHNxdWFyZXJvb3QgOTcwMjI1IC0+IDkuOEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzIyIHNxdWFyZXJvb3QgOTkwMDI1IC0+IDEuMEUrMyBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiA2CitzcXR4ODMyMyBzcXVhcmVyb290IDg4OTc1NzM0OTYzMDI1IC0+IDkuNDMyNzBFKzYgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMyNCBzcXVhcmVyb290IDcxMDg1NTU1MDAwNjI1IC0+IDguNDMxMjJFKzYgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMyNSBzcXVhcmVyb290IDM5OTk0MzA0LjA1MTAyNSAtPiA2MzI0LjEwIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMjYgc3F1YXJlcm9vdCAwLjAwMDAwNzMyNzE3MjI2NTYyNSAtPiAwLjAwMjcwNjg4IEluZXhhY3QgUm91bmRlZAorc3F0eDgzMjcgc3F1YXJlcm9vdCAxLjAyNTg2MDA0MzkwMjVFLTEzIC0+IDMuMjAyOTBFLTcgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMyOCBzcXVhcmVyb290IDAuMDAzNDU4MDU3NDI3NTYyNSAtPiAwLjA1ODgwNTIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMyOSBzcXVhcmVyb290IDcuNjg0MjMxNzcwMDYyNUUtNyAtPiAwLjAwMDg3NjU5OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzMwIHNxdWFyZXJvb3QgMTI2MzgzNDQ5NS4yMDI1IC0+IDM1NTUwLjQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMzMSBzcXVhcmVyb290IDQzMzk3MDY2NjQ2MC4yNSAtPiA2NTg3NjQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMzMiBzcXVhcmVyb290IDQuNTg3OTI4NjIzMDYyNUUtNyAtPiAwLjAwMDY3NzM0MiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzMzIHNxdWFyZXJvb3QgMC4wMDI5MzA1NjAzMzA2MjI1IC0+IDAuMDU0MTM0NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzM0IHNxdWFyZXJvb3QgNzAyMTgyODIuNzMzMjI1IC0+IDgzNzkuNjQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMzNSBzcXVhcmVyb290IDExOTQyNTE5LjA4MjAyNSAtPiAzNDU1LjgwIEluZXhhY3QgUm91bmRlZAorc3F0eDgzMzYgc3F1YXJlcm9vdCAwLjAwMjEyMzA2Njg5MDU2MjUgLT4gMC4wNDYwNzY4IEluZXhhY3QgUm91bmRlZAorc3F0eDgzMzcgc3F1YXJlcm9vdCAwLjkwMDgxODMzNDExMDI1IC0+IDAuOTQ5MTE0IEluZXhhY3QgUm91bmRlZAorc3F0eDgzMzggc3F1YXJlcm9vdCA1LjUxMDQxMjA5MzYyMjVFLTE3IC0+IDcuNDIzMjJFLTkgSW5leGFjdCBSb3VuZGVkCitzcXR4ODMzOSBzcXVhcmVyb290IDAuMTA1MzA0NDY4NTQyMjUgLT4gMC4zMjQ1MDYgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM0MCBzcXVhcmVyb290IDguNzA2MDY5ODY2MDI1RS0xNCAtPiAyLjk1MDYwRS03IEluZXhhY3QgUm91bmRlZAorc3F0eDgzNDEgc3F1YXJlcm9vdCAyMzgzOC41ODgwMDYyNSAtPiAxNTQuMzk4IEluZXhhY3QgUm91bmRlZAorc3F0eDgzNDIgc3F1YXJlcm9vdCAwLjAwMTM0MjY5MTEyNzU2MjUgLT4gMC4wMzY2NDI4IEluZXhhY3QgUm91bmRlZAorCistLSB0ZXN0IHVzZSBvZiByb3VuZC1oYWxmLWV2ZW4gaW4gdW5kZXJmbG93IHNpdHVhdGlvbnMKKworLS0gcHJlY2lzaW9ucyAyOyBhbGwgY2FzZXMgd2hlcmUgcmVzdWx0IGlzIGJvdGggc3Vibm9ybWFsIGFuZCBhIHRpZQorcHJlY2lzaW9uOiAyCitzcXR4ODM0MyBzcXVhcmVyb290IDIuNUUtMjEgLT4gMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc3F0eDgzNDQgc3F1YXJlcm9vdCAyLjI1RS0yMCAtPiAyRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNDUgc3F1YXJlcm9vdCA2LjI1RS0yMCAtPiAyRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNDYgc3F1YXJlcm9vdCAxLjIyNUUtMTkgLT4gNEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzQ3IHNxdWFyZXJvb3QgMi4wMjVFLTE5IC0+IDRFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM0OCBzcXVhcmVyb290IDMuMDI1RS0xOSAtPiA2RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNDkgc3F1YXJlcm9vdCA0LjIyNUUtMTkgLT4gNkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzUwIHNxdWFyZXJvb3QgNS42MjVFLTE5IC0+IDhFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM1MSBzcXVhcmVyb290IDcuMjI1RS0xOSAtPiA4RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNTIgc3F1YXJlcm9vdCA5LjAyNUUtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIHByZWNpc2lvbiAzLCBpbnB1dCBwcmVjaXNpb24gPD0gNQorcHJlY2lzaW9uOiAzCitzcXR4ODM1MyBzcXVhcmVyb290IDIuNUUtMjMgLT4gMEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc3F0eDgzNTQgc3F1YXJlcm9vdCAyLjI1RS0yMiAtPiAyRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNTUgc3F1YXJlcm9vdCA2LjI1RS0yMiAtPiAyRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNTYgc3F1YXJlcm9vdCAxLjIyNUUtMjEgLT4gNEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzU3IHNxdWFyZXJvb3QgMi4wMjVFLTIxIC0+IDRFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM1OCBzcXVhcmVyb290IDMuMDI1RS0yMSAtPiA2RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNTkgc3F1YXJlcm9vdCA0LjIyNUUtMjEgLT4gNkUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzYwIHNxdWFyZXJvb3QgNS42MjVFLTIxIC0+IDhFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM2MSBzcXVhcmVyb290IDcuMjI1RS0yMSAtPiA4RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNjIgc3F1YXJlcm9vdCA5LjAyNUUtMjEgLT4gMS4wRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNjMgc3F1YXJlcm9vdCAxLjEwMjVFLTIwIC0+IDEuMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzY0IHNxdWFyZXJvb3QgMS4zMjI1RS0yMCAtPiAxLjJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM2NSBzcXVhcmVyb290IDEuNTYyNUUtMjAgLT4gMS4yRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNjYgc3F1YXJlcm9vdCAxLjgyMjVFLTIwIC0+IDEuNEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzY3IHNxdWFyZXJvb3QgMi4xMDI1RS0yMCAtPiAxLjRFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM2OCBzcXVhcmVyb290IDIuNDAyNUUtMjAgLT4gMS42RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNjkgc3F1YXJlcm9vdCAyLjcyMjVFLTIwIC0+IDEuNkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzcwIHNxdWFyZXJvb3QgMy4wNjI1RS0yMCAtPiAxLjhFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM3MSBzcXVhcmVyb290IDMuNDIyNUUtMjAgLT4gMS44RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNzIgc3F1YXJlcm9vdCAzLjgwMjVFLTIwIC0+IDIuMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzczIHNxdWFyZXJvb3QgNC4yMDI1RS0yMCAtPiAyLjBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM3NCBzcXVhcmVyb290IDQuNjIyNUUtMjAgLT4gMi4yRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNzUgc3F1YXJlcm9vdCA1LjA2MjVFLTIwIC0+IDIuMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzc2IHNxdWFyZXJvb3QgNS41MjI1RS0yMCAtPiAyLjRFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM3NyBzcXVhcmVyb290IDYuMDAyNUUtMjAgLT4gMi40RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzNzggc3F1YXJlcm9vdCA2LjUwMjVFLTIwIC0+IDIuNkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzc5IHNxdWFyZXJvb3QgNy4wMjI1RS0yMCAtPiAyLjZFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM4MCBzcXVhcmVyb290IDcuNTYyNUUtMjAgLT4gMi44RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzODEgc3F1YXJlcm9vdCA4LjEyMjVFLTIwIC0+IDIuOEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzgyIHNxdWFyZXJvb3QgOC43MDI1RS0yMCAtPiAzLjBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM4MyBzcXVhcmVyb290IDkuMzAyNUUtMjAgLT4gMy4wRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzODQgc3F1YXJlcm9vdCA5LjkyMjVFLTIwIC0+IDMuMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS1wcmVjaXNpb24gNCwgaW5wdXQgcHJlY2lzaW9uIDw9IDQKK3ByZWNpc2lvbjogNAorc3F0eDgzODUgc3F1YXJlcm9vdCAyLjVFLTI1IC0+IDBFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3NxdHg4Mzg2IHNxdWFyZXJvb3QgMi4yNUUtMjQgLT4gMkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzg3IHNxdWFyZXJvb3QgNi4yNUUtMjQgLT4gMkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzg4IHNxdWFyZXJvb3QgMS4yMjVFLTIzIC0+IDRFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM4OSBzcXVhcmVyb290IDIuMDI1RS0yMyAtPiA0RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzOTAgc3F1YXJlcm9vdCAzLjAyNUUtMjMgLT4gNkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4MzkxIHNxdWFyZXJvb3QgNC4yMjVFLTIzIC0+IDZFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM5MiBzcXVhcmVyb290IDUuNjI1RS0yMyAtPiA4RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzOTMgc3F1YXJlcm9vdCA3LjIyNUUtMjMgLT4gOEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4Mzk0IHNxdWFyZXJvb3QgOS4wMjVFLTIzIC0+IDEuMEUtMTEgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworLS1wcmVjaXNpb24gNSwgaW5wdXQgcHJlY2lzaW9uIDw9IDUKK3ByZWNpc2lvbjogNQorc3F0eDgzOTUgc3F1YXJlcm9vdCAyLjVFLTI3IC0+IDBFLTEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkICBDbGFtcGVkCitzcXR4ODM5NiBzcXVhcmVyb290IDIuMjVFLTI2IC0+IDJFLTEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM5NyBzcXVhcmVyb290IDYuMjVFLTI2IC0+IDJFLTEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODM5OCBzcXVhcmVyb290IDEuMjI1RS0yNSAtPiA0RS0xMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDgzOTkgc3F1YXJlcm9vdCAyLjAyNUUtMjUgLT4gNEUtMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDAwIHNxdWFyZXJvb3QgMy4wMjVFLTI1IC0+IDZFLTEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQwMSBzcXVhcmVyb290IDQuMjI1RS0yNSAtPiA2RS0xMyBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MDIgc3F1YXJlcm9vdCA1LjYyNUUtMjUgLT4gOEUtMTMgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDAzIHNxdWFyZXJvb3QgNy4yMjVFLTI1IC0+IDhFLTEzIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQwNCBzcXVhcmVyb290IDkuMDI1RS0yNSAtPiAxLjBFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQwNSBzcXVhcmVyb290IDEuMTAyNUUtMjQgLT4gMS4wRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MDYgc3F1YXJlcm9vdCAxLjMyMjVFLTI0IC0+IDEuMkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDA3IHNxdWFyZXJvb3QgMS41NjI1RS0yNCAtPiAxLjJFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQwOCBzcXVhcmVyb290IDEuODIyNUUtMjQgLT4gMS40RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MDkgc3F1YXJlcm9vdCAyLjEwMjVFLTI0IC0+IDEuNEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDEwIHNxdWFyZXJvb3QgMi40MDI1RS0yNCAtPiAxLjZFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQxMSBzcXVhcmVyb290IDIuNzIyNUUtMjQgLT4gMS42RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MTIgc3F1YXJlcm9vdCAzLjA2MjVFLTI0IC0+IDEuOEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDEzIHNxdWFyZXJvb3QgMy40MjI1RS0yNCAtPiAxLjhFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQxNCBzcXVhcmVyb290IDMuODAyNUUtMjQgLT4gMi4wRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MTUgc3F1YXJlcm9vdCA0LjIwMjVFLTI0IC0+IDIuMEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDE2IHNxdWFyZXJvb3QgNC42MjI1RS0yNCAtPiAyLjJFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQxNyBzcXVhcmVyb290IDUuMDYyNUUtMjQgLT4gMi4yRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MTggc3F1YXJlcm9vdCA1LjUyMjVFLTI0IC0+IDIuNEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDE5IHNxdWFyZXJvb3QgNi4wMDI1RS0yNCAtPiAyLjRFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQyMCBzcXVhcmVyb290IDYuNTAyNUUtMjQgLT4gMi42RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MjEgc3F1YXJlcm9vdCA3LjAyMjVFLTI0IC0+IDIuNkUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDIyIHNxdWFyZXJvb3QgNy41NjI1RS0yNCAtPiAyLjhFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQyMyBzcXVhcmVyb290IDguMTIyNUUtMjQgLT4gMi44RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MjQgc3F1YXJlcm9vdCA4LjcwMjVFLTI0IC0+IDMuMEUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDI1IHNxdWFyZXJvb3QgOS4zMDI1RS0yNCAtPiAzLjBFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQyNiBzcXVhcmVyb290IDkuOTIyNUUtMjQgLT4gMy4yRS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorCistLSBhIHJhbmRvbSBzZWxlY3Rpb24gb2YgdmFsdWVzIHRoYXQgUHl0aG9uMi41LjEgcm91bmRzIGluY29ycmVjdGx5CitwcmVjaXNpb246IDEKK3NxdHg4NDI3IHNxdWFyZXJvb3QgMjI3IC0+IDJFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQyOCBzcXVhcmVyb290IDYyNSAtPiAyRSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0Mjkgc3F1YXJlcm9vdCAxMjE1IC0+IDNFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQzMCBzcXVhcmVyb290IDIwMDggLT4gNEUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDMxIHNxdWFyZXJvb3QgMjAyMCAtPiA0RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MzIgc3F1YXJlcm9vdCAyMDI2IC0+IDVFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQzMyBzcXVhcmVyb290IDIwMjcgLT4gNUUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDM0IHNxdWFyZXJvb3QgMjA2NSAtPiA1RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0MzUgc3F1YXJlcm9vdCAyMDc1IC0+IDVFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQzNiBzcXVhcmVyb290IDIwODggLT4gNUUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDM3IHNxdWFyZXJvb3QgMzA0OSAtPiA2RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0Mzggc3F1YXJlcm9vdCAzMDU3IC0+IDZFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQzOSBzcXVhcmVyb290IDMwNjEgLT4gNkUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDQwIHNxdWFyZXJvb3QgMzA5MiAtPiA2RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NDEgc3F1YXJlcm9vdCA0MjIyIC0+IDZFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ0MiBzcXVhcmVyb290IDU2NzYgLT4gOEUrMSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDQzIHNxdWFyZXJvb3QgNTY4NiAtPiA4RSsxIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NDQgc3F1YXJlcm9vdCA3MjE1IC0+IDhFKzEgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ0NSBzcXVhcmVyb290IDkwODYgLT4gMUUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDQ2IHNxdWFyZXJvb3QgOTA5NSAtPiAxRSsyIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDIKK3NxdHg4NDQ3IHNxdWFyZXJvb3QgMTI2NiAtPiAzNiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDQ4IHNxdWFyZXJvb3QgMjU1MiAtPiA1MSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDQ5IHNxdWFyZXJvb3QgNTU1NCAtPiA3NSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDUwIHNxdWFyZXJvb3QgNzgzMiAtPiA4OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDUxIHNxdWFyZXJvb3QgMTMyMDEgLT4gMS4xRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NTIgc3F1YXJlcm9vdCAxNTY5NSAtPiAxLjNFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ1MyBzcXVhcmVyb290IDE4MjcyIC0+IDEuNEUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDU0IHNxdWFyZXJvb3QgMjEwMjYgLT4gMS41RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NTUgc3F1YXJlcm9vdCAyNDA2OSAtPiAxLjZFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ1NiBzcXVhcmVyb290IDM0Mjc3IC0+IDEuOUUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDU3IHNxdWFyZXJvb3QgNDYyMzMgLT4gMi4yRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NTggc3F1YXJlcm9vdCA0NjI1MSAtPiAyLjJFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ1OSBzcXVhcmVyb290IDQ2Mjc2IC0+IDIuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDYwIHNxdWFyZXJvb3QgNzAyMTQgLT4gMi42RSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NjEgc3F1YXJlcm9vdCA4MTI0OSAtPiAyLjlFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ2MiBzcXVhcmVyb290IDgxMjY2IC0+IDIuOUUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDYzIHNxdWFyZXJvb3QgOTMwNjUgLT4gMy4xRSsyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NjQgc3F1YXJlcm9vdCA5MzA4MyAtPiAzLjFFKzIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ2NSBzcXVhcmVyb290IDk5MjMwIC0+IDMuMkUrMiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDY2IHNxdWFyZXJvb3QgOTkyNzEgLT4gMy4yRSsyIEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDMKK3NxdHg4NDY3IHNxdWFyZXJvb3QgMTEzNDkgLT4gMTA3IEluZXhhY3QgUm91bmRlZAorc3F0eDg0Njggc3F1YXJlcm9vdCAyNjczOCAtPiAxNjQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ2OSBzcXVhcmVyb290IDMxNTA4IC0+IDE3OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDcwIHNxdWFyZXJvb3QgNDQ3MzQgLT4gMjEyIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NzEgc3F1YXJlcm9vdCA0NDczOCAtPiAyMTIgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ3MiBzcXVhcmVyb290IDUxMzA3IC0+IDIyNyBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDczIHNxdWFyZXJvb3QgNjIyNTkgLT4gMjUwIEluZXhhY3QgUm91bmRlZAorc3F0eDg0NzQgc3F1YXJlcm9vdCA3NTkwMSAtPiAyNzYgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ3NSBzcXVhcmVyb290IDc2NDU3IC0+IDI3NyBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDc2IHNxdWFyZXJvb3QgMTgwMjg3IC0+IDQyNSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDc3IHNxdWFyZXJvb3QgMjAyMDUzIC0+IDQ1MCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDc4IHNxdWFyZXJvb3QgMjM1NzQ3IC0+IDQ4NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDc5IHNxdWFyZXJvb3QgMjU2NTM3IC0+IDUwNiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDgwIHNxdWFyZXJvb3QgMjk5NzcyIC0+IDU0OCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDgxIHNxdWFyZXJvb3QgNDE1MzM3IC0+IDY0NCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDgyIHNxdWFyZXJvb3QgNjE3MDY3IC0+IDc4NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDgzIHNxdWFyZXJvb3QgNjI4MDIyIC0+IDc5MiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDg0IHNxdWFyZXJvb3QgNjQ1NjI5IC0+IDgwNCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDg1IHNxdWFyZXJvb3QgNzg1ODM2IC0+IDg4NiBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NDg2IHNxdWFyZXJvb3QgOTkzMDY2IC0+IDk5NyBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiA2CitzcXR4ODQ4NyBzcXVhcmVyb290IDE0OTE3NzgxIC0+IDM4NjIuMzUgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ4OCBzcXVhcmVyb290IDE3MjM3MjM4IC0+IDQxNTEuNzggSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ4OSBzcXVhcmVyb290IDE4MDU0NDYzIC0+IDQyNDkuMDUgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5MCBzcXVhcmVyb290IDE5OTkwNjk0IC0+IDQ0NzEuMTAgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5MSBzcXVhcmVyb290IDI5MDYxODU1IC0+IDUzOTAuOTAgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5MiBzcXVhcmVyb290IDQ5MTY2MjU3IC0+IDcwMTEuODcgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5MyBzcXVhcmVyb290IDUzMDgyMDg2IC0+IDcyODUuNzUgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5NCBzcXVhcmVyb290IDU2Nzg3OTA5IC0+IDc1MzUuNzggSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5NSBzcXVhcmVyb290IDgxMTQwMDE5IC0+IDkwMDcuNzggSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5NiBzcXVhcmVyb290IDg3OTc3NTU0IC0+IDkzNzkuNjQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5NyBzcXVhcmVyb290IDkzNjI0NjgzIC0+IDk2NzUuOTggSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5OCBzcXVhcmVyb290IDk4NzMyNzQ3IC0+IDk5MzYuNDQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODQ5OSBzcXVhcmVyb290IDk5MjIyODEzIC0+IDk5NjEuMDYgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUwMCBzcXVhcmVyb290IDE0Mzg4MzYyNiAtPiAxMTk5NS4yIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MDEgc3F1YXJlcm9vdCAxODA0MzMzMDEgLT4gMTM0MzIuNSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTAyIHNxdWFyZXJvb3QgMjI3MDM0MDIwIC0+IDE1MDY3LjYgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUwMyBzcXVhcmVyb290IDI4MzI1Mzk5MiAtPiAxNjgzMC4yIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MDQgc3F1YXJlcm9vdCA2MTcwNDc5NTQgLT4gMjQ4NDAuNCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTA1IHNxdWFyZXJvb3QgNzM2ODcwMDk0IC0+IDI3MTQ1LjQgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUwNiBzcXVhcmVyb290IDg5NzMyMjkxNSAtPiAyOTk1NS4zIEluZXhhY3QgUm91bmRlZAorCistLSByZXN1bHRzIGNsb3NlIHRvIG1pbmltdW0gbm9ybWFsCitwcmVjaXNpb246IDEKK3NxdHg4NTA3IHNxdWFyZXJvb3QgMUUtMjAgLT4gMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitzcXR4ODUwOCBzcXVhcmVyb290IDFFLTE5IC0+IDBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc3F0eDg1MDkgc3F1YXJlcm9vdCAxRS0xOCAtPiAxRS05CisKK3ByZWNpc2lvbjogMgorc3F0eDg1MTAgc3F1YXJlcm9vdCA4LjFFLTE5IC0+IDlFLTEwIFN1Ym5vcm1hbAorc3F0eDg1MTEgc3F1YXJlcm9vdCA4LjEwRS0xOSAtPiA5RS0xMCBTdWJub3JtYWwgUm91bmRlZAorc3F0eDg1MTIgc3F1YXJlcm9vdCA5LjBFLTE5IC0+IDlFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUxMyBzcXVhcmVyb290IDkuMDJFLTE5IC0+IDlFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUxNCBzcXVhcmVyb290IDkuMDNFLTE5IC0+IDEuMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MTUgc3F1YXJlcm9vdCA5LjFFLTE5IC0+IDEuMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MTYgc3F1YXJlcm9vdCA5LjlFLTE5IC0+IDEuMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MTcgc3F1YXJlcm9vdCA5LjkxRS0xOSAtPiAxLjBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTE4IHNxdWFyZXJvb3QgOS45MkUtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUxOSBzcXVhcmVyb290IDkuOTVFLTE5IC0+IDEuMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1MjAgc3F1YXJlcm9vdCA5Ljk4RS0xOSAtPiAxLjBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTIxIHNxdWFyZXJvb3QgOS45OUUtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUyMiBzcXVhcmVyb290IDFFLTE4IC0+IDFFLTkKK3NxdHg4NTIzIHNxdWFyZXJvb3QgMS4wRS0xOCAtPiAxLjBFLTkKK3NxdHg4NTI0IHNxdWFyZXJvb3QgMS4wMEUtMTggLT4gMS4wRS05CitzcXR4ODUyNSBzcXVhcmVyb290IDEuMDAwRS0xOCAtPiAxLjBFLTkgUm91bmRlZAorc3F0eDg1MjYgc3F1YXJlcm9vdCAxLjAwMDBFLTE4IC0+IDEuMEUtOSBSb3VuZGVkCitzcXR4ODUyNyBzcXVhcmVyb290IDEuMDFFLTE4IC0+IDEuMEUtOSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTI4IHNxdWFyZXJvb3QgMS4wMkUtMTggLT4gMS4wRS05IEluZXhhY3QgUm91bmRlZAorc3F0eDg1Mjkgc3F1YXJlcm9vdCAxLjFFLTE4IC0+IDEuMEUtOSBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAzCitzcXR4ODUzMCBzcXVhcmVyb290IDguMUUtMTkgLT4gOUUtMTAgU3Vibm9ybWFsCitzcXR4ODUzMSBzcXVhcmVyb290IDguMTBFLTE5IC0+IDkuMEUtMTAgU3Vibm9ybWFsCitzcXR4ODUzMiBzcXVhcmVyb290IDguMTAwRS0xOSAtPiA5LjBFLTEwIFN1Ym5vcm1hbAorc3F0eDg1MzMgc3F1YXJlcm9vdCA4LjEwMDBFLTE5IC0+IDkuMEUtMTAgU3Vibm9ybWFsIFJvdW5kZWQKK3NxdHg4NTM0IHNxdWFyZXJvb3QgOS45RS0xOSAtPiA5LjlFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODUzNSBzcXVhcmVyb290IDkuOTFFLTE5IC0+IDEuMDBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTM2IHNxdWFyZXJvb3QgOS45OUUtMTkgLT4gMS4wMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1Mzcgc3F1YXJlcm9vdCA5Ljk5OEUtMTkgLT4gMS4wMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1Mzggc3F1YXJlcm9vdCAxRS0xOCAtPiAxRS05CitzcXR4ODUzOSBzcXVhcmVyb290IDEuMEUtMTggLT4gMS4wRS05CitzcXR4ODU0MCBzcXVhcmVyb290IDEuMDBFLTE4IC0+IDEuMEUtOQorc3F0eDg1NDEgc3F1YXJlcm9vdCAxLjAwMEUtMTggLT4gMS4wMEUtOQorc3F0eDg1NDIgc3F1YXJlcm9vdCAxLjAwMDBFLTE4IC0+IDEuMDBFLTkKK3NxdHg4NTQzIHNxdWFyZXJvb3QgMS4wMDAwMEUtMTggLT4gMS4wMEUtOSBSb3VuZGVkCitzcXR4ODU0NCBzcXVhcmVyb290IDEuMDAwMDAwRS0xOCAtPiAxLjAwRS05IFJvdW5kZWQKK3NxdHg4NTQ1IHNxdWFyZXJvb3QgMS4wMUUtMTggLT4gMS4wMEUtOSBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTQ2IHNxdWFyZXJvb3QgMS4wMkUtMTggLT4gMS4wMUUtOSBJbmV4YWN0IFJvdW5kZWQKKworLS0gcmVzdWx0IGV4YWN0bHkgcmVwcmVzZW50YWJsZSB3aXRoIHByZWNpc2lvbiBwLCBidXQgbm90IG5lY2Vzc2FyaWx5CistLSBleGFjdGx5IHJlcHJlc2VudGFibGUgYXMgYSBzdWJub3JtYWw7ICBjaGVjayB0aGUgY29ycmVjdCBmbGFncyBhcmUgcmFpc2VkCitwcmVjaXNpb246IDIKK3NxdHg4NTQ3IHNxdWFyZXJvb3QgMS4yMUUtMjAgLT4gMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTQ4IHNxdWFyZXJvb3QgMS40NEUtMjAgLT4gMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTQ5IHNxdWFyZXJvb3QgOS42MUUtMjAgLT4gM0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTUwIHNxdWFyZXJvb3QgOC44MzZFLTE5IC0+IDlFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU1MSBzcXVhcmVyb290IDkuMjE2RS0xOSAtPiAxLjBFLTkgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAzCitzcXR4ODU1MiBzcXVhcmVyb290IDEuMjFFLTIyIC0+IDFFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU1MyBzcXVhcmVyb290IDEuMjFFLTIwIC0+IDEuMUUtMTAgU3Vibm9ybWFsCitzcXR4ODU1NCBzcXVhcmVyb290IDEuOTZFLTIyIC0+IDFFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU1NSBzcXVhcmVyb290IDEuOTZFLTIwIC0+IDEuNEUtMTAgU3Vibm9ybWFsCitzcXR4ODU1NiBzcXVhcmVyb290IDIuNTZFLTIyIC0+IDJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU1NyBzcXVhcmVyb290IDQuMDBFLTIyIC0+IDJFLTExIFN1Ym5vcm1hbCBSb3VuZGVkCitzcXR4ODU1OCBzcXVhcmVyb290IDcuODRFLTIyIC0+IDNFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU1OSBzcXVhcmVyb290IDkuODAxRS0yMSAtPiAxLjBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU2MCBzcXVhcmVyb290IDkuODAxRS0xOSAtPiA5LjlFLTEwIFN1Ym5vcm1hbAorc3F0eDg1NjEgc3F1YXJlcm9vdCAxLjAyMDFFLTIwIC0+IDEuMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTYyIHNxdWFyZXJvb3QgMS4xMDI1RS0yMCAtPiAxLjBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU2MyBzcXVhcmVyb290IDEuMTIzNkUtMjAgLT4gMS4xRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NjQgc3F1YXJlcm9vdCAxLjI5OTZFLTIwIC0+IDEuMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTY1IHNxdWFyZXJvb3QgMS4zMjI1RS0yMCAtPiAxLjJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIEEgc2VsZWN0aW9uIG9mIHN1Ym5vcm1hbCByZXN1bHRzIHByb25lIHRvIGRvdWJsZSByb3VuZGluZyBlcnJvcnMKK3ByZWNpc2lvbjogMgorc3F0eDg1NjYgc3F1YXJlcm9vdCAyLjNFLTIxIC0+IDBFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkIENsYW1wZWQKK3NxdHg4NTY3IHNxdWFyZXJvb3QgMi40RS0yMSAtPiAwRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZCBDbGFtcGVkCitzcXR4ODU2OCBzcXVhcmVyb290IDIuNUUtMjEgLT4gMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQgQ2xhbXBlZAorc3F0eDg1Njkgc3F1YXJlcm9vdCAyLjZFLTIxIC0+IDFFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU3MCBzcXVhcmVyb290IDIuN0UtMjEgLT4gMUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTcxIHNxdWFyZXJvb3QgMi44RS0yMSAtPiAxRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NzIgc3F1YXJlcm9vdCAyLjJFLTIwIC0+IDFFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU3MyBzcXVhcmVyb290IDIuM0UtMjAgLT4gMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTc0IHNxdWFyZXJvb3QgMi40RS0yMCAtPiAyRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1NzUgc3F1YXJlcm9vdCA2LjJFLTIwIC0+IDJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU3NiBzcXVhcmVyb290IDYuM0UtMjAgLT4gM0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTc3IHNxdWFyZXJvb3QgNi40RS0yMCAtPiAzRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1Nzggc3F1YXJlcm9vdCA2LjVFLTIwIC0+IDNFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU3OSBzcXVhcmVyb290IDEuMkUtMTkgLT4gM0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTgwIHNxdWFyZXJvb3QgMi4wRS0xOSAtPiA0RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1ODEgc3F1YXJlcm9vdCA0LjJFLTE5IC0+IDZFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU4MiBzcXVhcmVyb290IDUuNkUtMTkgLT4gN0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTgzIHNxdWFyZXJvb3QgNS43RS0xOSAtPiA4RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1ODQgc3F1YXJlcm9vdCA5LjBFLTE5IC0+IDlFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU4NSBzcXVhcmVyb290IDkuMUUtMTkgLT4gMS4wRS05IFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK3NxdHg4NTg2IHNxdWFyZXJvb3QgMi42RS0yMyAtPiAxRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1ODcgc3F1YXJlcm9vdCAyLjIyRS0yMiAtPiAxRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1ODggc3F1YXJlcm9vdCA2LjA3RS0yMiAtPiAyRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1ODkgc3F1YXJlcm9vdCA2LjI1RS0yMiAtPiAyRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTAgc3F1YXJlcm9vdCA2LjQ1RS0yMiAtPiAzRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTEgc3F1YXJlcm9vdCA2LjUwRS0yMiAtPiAzRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTIgc3F1YXJlcm9vdCAxLjIyRS0yMSAtPiAzRS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTMgc3F1YXJlcm9vdCAxLjI0RS0yMSAtPiA0RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTQgc3F1YXJlcm9vdCA0LjE4RS0yMSAtPiA2RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTUgc3F1YXJlcm9vdCA3LjE5RS0yMSAtPiA4RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTYgc3F1YXJlcm9vdCA4Ljk0RS0yMSAtPiA5RS0xMSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg1OTcgc3F1YXJlcm9vdCAxLjgxRS0yMCAtPiAxLjNFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODU5OCBzcXVhcmVyb290IDQuNjRFLTIwIC0+IDIuMkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NTk5IHNxdWFyZXJvb3QgNS4wNkUtMjAgLT4gMi4yRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MDAgc3F1YXJlcm9vdCA1LjA4RS0yMCAtPiAyLjNFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYwMSBzcXVhcmVyb290IDcuMDBFLTIwIC0+IDIuNkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjAyIHNxdWFyZXJvb3QgMS44MUUtMTkgLT4gNC4zRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MDMgc3F1YXJlcm9vdCA2LjY0RS0xOSAtPiA4LjFFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYwNCBzcXVhcmVyb290IDcuNDhFLTE5IC0+IDguNkUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjA1IHNxdWFyZXJvb3QgOS45MUUtMTkgLT4gMS4wMEUtOSBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA0CitzcXR4ODYwNiBzcXVhcmVyb290IDYuMjRFLTI0IC0+IDJFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYwNyBzcXVhcmVyb290IDcuMTYyRS0yMyAtPiA4RS0xMiBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MDggc3F1YXJlcm9vdCA3LjI0M0UtMjMgLT4gOUUtMTIgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjA5IHNxdWFyZXJvb3QgOC45NjFFLTIzIC0+IDlFLTEyIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxMCBzcXVhcmVyb290IDkuMDI5RS0yMyAtPiAxLjBFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxMSBzcXVhcmVyb290IDQuNjI0RS0yMiAtPiAyLjJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxMiBzcXVhcmVyb290IDUuOTgwRS0yMiAtPiAyLjRFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxMyBzcXVhcmVyb290IDYuNTA3RS0yMiAtPiAyLjZFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxNCBzcXVhcmVyb290IDEuNDgzRS0yMSAtPiAzLjlFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxNSBzcXVhcmVyb290IDMuOTAzRS0yMSAtPiA2LjJFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxNiBzcXVhcmVyb290IDguNzMzRS0yMSAtPiA5LjNFLTExIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYxNyBzcXVhcmVyb290IDEuNzgxRS0yMCAtPiAxLjMzRS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MTggc3F1YXJlcm9vdCA2LjQyNkUtMjAgLT4gMi41M0UtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjE5IHNxdWFyZXJvb3QgNy4xMDJFLTIwIC0+IDIuNjZFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYyMCBzcXVhcmVyb290IDcuNTM1RS0yMCAtPiAyLjc0RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MjEgc3F1YXJlcm9vdCA5Ljg5MkUtMjAgLT4gMy4xNUUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjIyIHNxdWFyZXJvb3QgMS42MTJFLTE5IC0+IDQuMDFFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODYyMyBzcXVhcmVyb290IDEuNzI2RS0xOSAtPiA0LjE1RS0xMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg2MjQgc3F1YXJlcm9vdCAxLjg1M0UtMTkgLT4gNC4zMEUtMTAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NjI1IHNxdWFyZXJvb3QgNC4yNDVFLTE5IC0+IDYuNTJFLTEwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCisKKy0tIGNsYW1waW5nIGFuZCBvdmVyZmxvdyBmb3IgbGFyZ2UgZXhwb25lbnRzCitwcmVjaXNpb246IDEKK3NxdHg4NjI2IHNxdWFyZXJvb3QgMUUrMTggLT4gMUUrOQorc3F0eDg2Mjcgc3F1YXJlcm9vdCAxRSsxOSAtPiAzRSs5IEluZXhhY3QgUm91bmRlZAorLS0gaW4gdGhpcyBuZXh0IG9uZSwgaW50ZXJtZWRpYXRlIHJlc3VsdCBpcyA5NDg2ODMyOTgwLjUwNTEzNzk5Ni4uLgorLS0gc28gcm91bmRzIGRvd24gdG8gOSAobm90IHVwIHRvIDEwIHdoaWNoIHdvdWxkIGNhdXNlIEluZmluaXR5IG92ZXJmbG93KQorc3F0eDg2Mjggc3F1YXJlcm9vdCA5RSsxOSAtPiA5RSs5IEluZXhhY3QgUm91bmRlZAorc3F0eDg2Mjkgc3F1YXJlcm9vdCA5LjFFKzE5IC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc3F0eDg2MzAgc3F1YXJlcm9vdCAxRSsyMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKKworcHJlY2lzaW9uOiAyCitzcXR4ODYzMSBzcXVhcmVyb290IDFFKzE4IC0+IDFFKzkKK3NxdHg4NjMyIHNxdWFyZXJvb3QgMS4wRSsxOCAtPiAxLjBFKzkKK3NxdHg4NjMzIHNxdWFyZXJvb3QgMS4wMEUrMTggLT4gMS4wRSs5CitzcXR4ODYzNCBzcXVhcmVyb290IDEuMDAwRSsxOCAtPiAxLjBFKzkgUm91bmRlZAorc3F0eDg2MzUgc3F1YXJlcm9vdCAxRSsyMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW1wOiAxCitzcXR4ODYzNiBzcXVhcmVyb290IDFFKzE4IC0+IDEuMEUrOSBDbGFtcGVkCitzcXR4ODYzNyBzcXVhcmVyb290IDEuMEUrMTggLT4gMS4wRSs5CitzcXR4ODYzOCBzcXVhcmVyb290IDFFKzIwIC0+IEluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorY2xhbXA6IDAKKworcHJlY2lzaW9uOiA2CitzcXR4ODYzOSBzcXVhcmVyb290IDFFKzE4IC0+IDFFKzkKK3NxdHg4NjQwIHNxdWFyZXJvb3QgMS4wMDAwMDAwMDAwRSsxOCAtPiAxLjAwMDAwRSs5CitzcXR4ODY0MSBzcXVhcmVyb290IDEuMDAwMDAwMDAwMDBFKzE4IC0+IDEuMDAwMDBFKzkgUm91bmRlZAorc3F0eDg2NDIgc3F1YXJlcm9vdCAxRSsyMCAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK2NsYW1wOiAxCitzcXR4ODY0MyBzcXVhcmVyb290IDFFKzggLT4gMUUrNAorc3F0eDg2NDQgc3F1YXJlcm9vdCAxRSsxMCAtPiAxLjBFKzUgQ2xhbXBlZAorc3F0eDg2NDUgc3F1YXJlcm9vdCAxLjBFKzEwIC0+IDEuMEUrNQorc3F0eDg2NDYgc3F1YXJlcm9vdCAxRSsxMiAtPiAxLjAwRSs2IENsYW1wZWQKK3NxdHg4NjQ3IHNxdWFyZXJvb3QgMS4wRSsxMiAtPiAxLjAwRSs2IENsYW1wZWQKK3NxdHg4NjQ4IHNxdWFyZXJvb3QgMS4wMEUrMTIgLT4gMS4wMEUrNiBDbGFtcGVkCitzcXR4ODY0OSBzcXVhcmVyb290IDEuMDAwRSsxMiAtPiAxLjAwRSs2CitzcXR4ODY1MCBzcXVhcmVyb290IDFFKzE4IC0+IDEuMDAwMDBFKzkgQ2xhbXBlZAorc3F0eDg2NTEgc3F1YXJlcm9vdCAxLjAwMDAwMDAwRSsxOCAtPiAxLjAwMDAwRSs5IENsYW1wZWQKK3NxdHg4NjUyIHNxdWFyZXJvb3QgMS4wMDAwMDAwMDBFKzE4IC0+IDEuMDAwMDBFKzkKK3NxdHg4NjUzIHNxdWFyZXJvb3QgMUUrMjAgLT4gSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitjbGFtcDogMAorCistLSBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY2F1c2VzIGEgVHlwZUVycm9yIGluIFB5dGhvbiAyLjUuMQorcHJlY2lzaW9uOiAzCittYXhleHBvbmVudDogOQorbWluZXhwb25lbnQ6IC05CitzcXR4ODY1NCBzcXVhcmVyb290IDEwMDAwMDAwMDAwIC0+IDEuMDBFKzUgUm91bmRlZAorCistLSBBZGRpdGlvbmFsIHRyaWNreSBjYXNlcyBvZiB1bmRlcmZsb3duIHN1Ym5vcm1hbHMKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3ByZWNpc2lvbjogNQorbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3NxdHg4NzAwIHNxdWFyZXJvb3QgMi44MDczRS0yMDAwIC0+IDEuNjc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcwMSBzcXVhcmVyb290IDIuODg4M0UtMjAwMCAtPiAxLjY5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MDIgc3F1YXJlcm9vdCAzLjE1MjRFLTIwMDAgLT4gMS43NzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzAzIHNxdWFyZXJvb3QgMy4yMzgyRS0yMDAwIC0+IDEuNzk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcwNCBzcXVhcmVyb290IDMuNTE3NUUtMjAwMCAtPiAxLjg3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MDUgc3F1YXJlcm9vdCAzLjYwODFFLTIwMDAgLT4gMS44OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzA2IHNxdWFyZXJvb3QgMy45MDI2RS0yMDAwIC0+IDEuOTc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcwNyBzcXVhcmVyb290IDMuOTk4MEUtMjAwMCAtPiAxLjk5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MDggc3F1YXJlcm9vdCA0LjMwNzdFLTIwMDAgLT4gMi4wNzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzA5IHNxdWFyZXJvb3QgNC40MDc5RS0yMDAwIC0+IDIuMDk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcxMCBzcXVhcmVyb290IDQuNzMyOEUtMjAwMCAtPiAyLjE3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MTEgc3F1YXJlcm9vdCA0LjgzNzhFLTIwMDAgLT4gMi4xOTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzEyIHNxdWFyZXJvb3QgNS4xNzc5RS0yMDAwIC0+IDIuMjc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcxMyBzcXVhcmVyb290IDUuMjg3N0UtMjAwMCAtPiAyLjI5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MTQgc3F1YXJlcm9vdCA1LjY0MzBFLTIwMDAgLT4gMi4zNzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzE1IHNxdWFyZXJvb3QgNS43NTc2RS0yMDAwIC0+IDIuMzk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcxNiBzcXVhcmVyb290IDYuMTI4MUUtMjAwMCAtPiAyLjQ3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MTcgc3F1YXJlcm9vdCA2LjI0NzVFLTIwMDAgLT4gMi40OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzE4IHNxdWFyZXJvb3QgNi42MzMyRS0yMDAwIC0+IDIuNTc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcxOSBzcXVhcmVyb290IDYuNzU3NEUtMjAwMCAtPiAyLjU5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MjAgc3F1YXJlcm9vdCA3LjE1ODNFLTIwMDAgLT4gMi42NzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzIxIHNxdWFyZXJvb3QgNy4yODczRS0yMDAwIC0+IDIuNjk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcyMiBzcXVhcmVyb290IDcuNzAzNEUtMjAwMCAtPiAyLjc3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MjMgc3F1YXJlcm9vdCA3LjgzNzJFLTIwMDAgLT4gMi43OTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzI0IHNxdWFyZXJvb3QgOC4yNjg1RS0yMDAwIC0+IDIuODc1RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcyNSBzcXVhcmVyb290IDguNDA3MUUtMjAwMCAtPiAyLjg5OUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3MjYgc3F1YXJlcm9vdCA4Ljg1MzZFLTIwMDAgLT4gMi45NzVFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKK3NxdHg4NzI3IHNxdWFyZXJvb3QgOC45OTcwRS0yMDAwIC0+IDIuOTk5RS0xMDAwIFVuZGVyZmxvdyBTdWJub3JtYWwgSW5leGFjdCBSb3VuZGVkCitzcXR4ODcyOCBzcXVhcmVyb290IDkuNDU4N0UtMjAwMCAtPiAzLjA3NUUtMTAwMCBVbmRlcmZsb3cgU3Vibm9ybWFsIEluZXhhY3QgUm91bmRlZAorc3F0eDg3Mjkgc3F1YXJlcm9vdCA5LjYwNjlFLTIwMDAgLT4gMy4wOTlFLTEwMDAgVW5kZXJmbG93IFN1Ym5vcm1hbCBJbmV4YWN0IFJvdW5kZWQKKy0tIChFbmQgb2YgTWFyayBEaWNraW5zb24ncyB0ZXN0Y2FzZXMuKQorCisKKy0tIFNvbWUgYWRkaXRpb25hbCBlZGdlIGNhc2VzCittYXhleHBvbmVudDogOQorbWluZXhwb25lbnQ6IC05CitwcmVjaXNpb246IDIKK3NxdHg5MDAwIHNxdWFyZXJvb3QgOTk4MC4wMSAtPiAxLjBFKzIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDMKK3NxdHg5MDAxIHNxdWFyZXJvb3QgOTk4MC4wMSAtPiA5OS45CitwcmVjaXNpb246IDQKK3NxdHg5MDAyIHNxdWFyZXJvb3QgOTk4MC4wMSAtPiA5OS45CisKKy0tIEV4YWN0IGZyb20gb3Zlci1wcmVjaXNlCitwcmVjaXNpb246IDQKK3NxdHg5MDAzIHNxdWFyZXJvb3QgMTEwMjUgICAtPiAxMDUKK3ByZWNpc2lvbjogMworc3F0eDkwMDQgc3F1YXJlcm9vdCAxMTAyNSAgIC0+IDEwNQorcHJlY2lzaW9uOiAyCitzcXR4OTAwNSBzcXVhcmVyb290IDExMDI1ICAgLT4gMS4wRSsyICBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMQorc3F0eDkwMDYgc3F1YXJlcm9vdCAxMTAyNSAgIC0+IDFFKzIgICAgSW5leGFjdCBSb3VuZGVkCisKKy0tIGFuIGludGVyZXN0aW5nIGNhc2UKK3ByZWNpc2lvbjogICA3CitzcXR4OTAwNyBzcXVhcmVyb290IDE2MDAwMDBlMSAtPiA0MDAwCisKKy0tIE91dC1vZi1ib3VuZHMgemVyb3MKK3ByZWNpc2lvbjogNAorc3F0eDkwMTAgc3F1YXJlcm9vdCAwRS05ICAtPiAwLjAwMDAwCitzcXR4OTAxMSBzcXVhcmVyb290IDBFLTEwIC0+IDAuMDAwMDAKK3NxdHg5MDEyIHNxdWFyZXJvb3QgMEUtMTEgLT4gMC4wMDAwMDAKK3NxdHg5MDEzIHNxdWFyZXJvb3QgMEUtMTIgLT4gMC4wMDAwMDAKK3NxdHg5MDE0IHNxdWFyZXJvb3QgMEUtMTMgLT4gMEUtNworc3F0eDkwMTUgc3F1YXJlcm9vdCAwRS0xNCAtPiAwRS03CitzcXR4OTAyMCBzcXVhcmVyb290IDBFLTE3IC0+IDBFLTkKK3NxdHg5MDIxIHNxdWFyZXJvb3QgMEUtMjAgLT4gMEUtMTAKK3NxdHg5MDIyIHNxdWFyZXJvb3QgMEUtMjIgLT4gMEUtMTEKK3NxdHg5MDIzIHNxdWFyZXJvb3QgMEUtMjQgLT4gMEUtMTIKK3NxdHg5MDI0IHNxdWFyZXJvb3QgMEUtMjUgLT4gMEUtMTIgQ2xhbXBlZAorc3F0eDkwMjUgc3F1YXJlcm9vdCAwRS0yNiAtPiAwRS0xMiBDbGFtcGVkCitzcXR4OTAyNiBzcXVhcmVyb290IDBFLTI3IC0+IDBFLTEyIENsYW1wZWQKK3NxdHg5MDI3IHNxdWFyZXJvb3QgMEUtMjggLT4gMEUtMTIgQ2xhbXBlZAorCitzcXR4OTAzMCBzcXVhcmVyb290IDBFKzggIC0+IDBFKzQKK3NxdHg5MDMxIHNxdWFyZXJvb3QgMEUrMTAgLT4gMEUrNQorc3F0eDkwMzIgc3F1YXJlcm9vdCAwRSsxMiAtPiAwRSs2CitzcXR4OTAzMyBzcXVhcmVyb290IDBFKzE0IC0+IDBFKzcKK3NxdHg5MDM0IHNxdWFyZXJvb3QgMEUrMTUgLT4gMEUrNworc3F0eDkwMzUgc3F1YXJlcm9vdCAwRSsxNiAtPiAwRSs4CitzcXR4OTAzNiBzcXVhcmVyb290IDBFKzE4IC0+IDBFKzkKK3NxdHg5MDM3IHNxdWFyZXJvb3QgMEUrMTkgLT4gMEUrOQorc3F0eDkwMzggc3F1YXJlcm9vdCAwRSsyMCAtPiAwRSs5IENsYW1wZWQKK3NxdHg5MDM5IHNxdWFyZXJvb3QgMEUrMjEgLT4gMEUrOSBDbGFtcGVkCitzcXR4OTA0MCBzcXVhcmVyb290IDBFKzIyIC0+IDBFKzkgQ2xhbXBlZAorCistLSBpZiBkaWdpdHMgPiBlbWF4IG1heGltdW0gcmVhbCBleHBvbmVudCBpcyBuZWdhdGl2ZQorbWF4ZXhwb25lbnQ6IDkKK21pbmV4cG9uZW50OiAtOQorcHJlY2lzaW9uOiAxNQorY2xhbXA6IDEKK3NxdHg5MDQ1IHNxdWFyZXJvb3QgIDEgLT4gMS4wMDAwMCAgQ2xhbXBlZAorCistLSBvdGhlcgorbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogMTYKK3NxdHg5MDQ2IHNxdWFyZXJvb3QgIDEwICAgIC0+IDMuMTYyMjc3NjYwMTY4Mzc5ICAgICAgICAgIGluZXhhY3Qgcm91bmRlZAorc3F0eDkwNDcgc3F1YXJlcm9vdCAgMTBFLTEgLT4gMS4wCitzcXR4OTA0OCBzcXVhcmVyb290ICAxMEUtMiAtPiAwLjMxNjIyNzc2NjAxNjgzNzkgICAgICAgICBpbmV4YWN0IHJvdW5kZWQKK3NxdHg5MDQ5IHNxdWFyZXJvb3QgIDEwRS0zIC0+IDAuMTAKKworCistLSBIaWdoLXByZWNpc2lvbiBleGFjdCBhbmQgaW5leGFjdAorbWF4ZXhwb25lbnQ6IDk5OQorbWluZXhwb25lbnQ6IC05OTkKK3ByZWNpc2lvbjogNDAwCitzcXR4OTA1MCBzcXVhcmVyb290IDIgLT4gMS40MTQyMTM1NjIzNzMwOTUwNDg4MDE2ODg3MjQyMDk2OTgwNzg1Njk2NzE4NzUzNzY5NDgwNzMxNzY2Nzk3Mzc5OTA3MzI0Nzg0NjIxMDcwMzg4NTAzODc1MzQzMjc2NDE1NzI3MzUwMTM4NDYyMzA5MTIyOTcwMjQ5MjQ4MzYwNTU4NTA3MzcyMTI2NDQxMjE0OTcwOTk5MzU4MzE0MTMyMjI2NjU5Mjc1MDU1OTI3NTU3OTk5NTA1MDExNTI3ODIwNjA1NzE0NzAxMDk1NTk5NzE2MDU5NzAyNzQ1MzQ1OTY4NjIwMTQ3Mjg1MTc0MTg2NDA4ODkxOTg2MDk1NTIzMjkyMzA0ODQzMDg3MTQzMjE0NTA4Mzk3NjI2MDM2Mjc5OTUyNTE0MDc5ODk2ODcyNTMzOTY1NDYzMzE4MDg4Mjk2NDA2MjA2MTUyNTgzNTIzOTUwNTQ3NDU3NTAyODc3NTk5NjE3Mjk4MzU1NzUyMjAzMzc1MzE4NTcwMTEzNTQzNzQ2MDM0MDg0OTg4NDcgSW5leGFjdCBSb3VuZGVkCitzcXR4OTA1MSBzcXVhcmVyb290IDEwODkgLT4gMzMKK3NxdHg5MDUyIHNxdWFyZXJvb3QgMTAuODkgLT4gMy4zCisKKy0tIE51bGwgdGVzdAorc3F0eDk5MDAgc3F1YXJlcm9vdCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc3VidHJhY3QuZGVjVGVzdCBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvc3VidHJhY3QuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODk1MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS9zdWJ0cmFjdC5kZWNUZXN0CkBAIC0wLDAgKzEsODczIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHN1YnRyYWN0LmRlY1Rlc3QgLS0gZGVjaW1hbCBzdWJ0cmFjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDM4NAorbWluZXhwb25lbnQ6IC0zODMKKworLS0gW2ZpcnN0IGdyb3VwIGFyZSAncXVpY2sgY29uZmlkZW5jZSBjaGVjayddCitzdWJ4MDAxIHN1YnRyYWN0ICAwICAgMCAgLT4gJzAnCitzdWJ4MDAyIHN1YnRyYWN0ICAxICAgMSAgLT4gJzAnCitzdWJ4MDAzIHN1YnRyYWN0ICAxICAgMiAgLT4gJy0xJworc3VieDAwNCBzdWJ0cmFjdCAgMiAgIDEgIC0+ICcxJworc3VieDAwNSBzdWJ0cmFjdCAgMiAgIDIgIC0+ICcwJworc3VieDAwNiBzdWJ0cmFjdCAgMyAgIDIgIC0+ICcxJworc3VieDAwNyBzdWJ0cmFjdCAgMiAgIDMgIC0+ICctMScKKworc3VieDAxMSBzdWJ0cmFjdCAtMCAgIDAgIC0+ICctMCcKK3N1YngwMTIgc3VidHJhY3QgLTEgICAxICAtPiAnLTInCitzdWJ4MDEzIHN1YnRyYWN0IC0xICAgMiAgLT4gJy0zJworc3VieDAxNCBzdWJ0cmFjdCAtMiAgIDEgIC0+ICctMycKK3N1YngwMTUgc3VidHJhY3QgLTIgICAyICAtPiAnLTQnCitzdWJ4MDE2IHN1YnRyYWN0IC0zICAgMiAgLT4gJy01Jworc3VieDAxNyBzdWJ0cmFjdCAtMiAgIDMgIC0+ICctNScKKworc3VieDAyMSBzdWJ0cmFjdCAgMCAgLTAgIC0+ICcwJworc3VieDAyMiBzdWJ0cmFjdCAgMSAgLTEgIC0+ICcyJworc3VieDAyMyBzdWJ0cmFjdCAgMSAgLTIgIC0+ICczJworc3VieDAyNCBzdWJ0cmFjdCAgMiAgLTEgIC0+ICczJworc3VieDAyNSBzdWJ0cmFjdCAgMiAgLTIgIC0+ICc0Jworc3VieDAyNiBzdWJ0cmFjdCAgMyAgLTIgIC0+ICc1Jworc3VieDAyNyBzdWJ0cmFjdCAgMiAgLTMgIC0+ICc1JworCitzdWJ4MDMwIHN1YnRyYWN0ICAxMSAgMSAgLT4gMTAKK3N1YngwMzEgc3VidHJhY3QgIDEwICAxICAtPiAgOQorc3VieDAzMiBzdWJ0cmFjdCAgOSAgIDEgIC0+ICA4CitzdWJ4MDMzIHN1YnRyYWN0ICAxICAgMSAgLT4gIDAKK3N1YngwMzQgc3VidHJhY3QgIDAgICAxICAtPiAtMQorc3VieDAzNSBzdWJ0cmFjdCAtMSAgIDEgIC0+IC0yCitzdWJ4MDM2IHN1YnRyYWN0IC05ICAgMSAgLT4gLTEwCitzdWJ4MDM3IHN1YnRyYWN0IC0xMCAgMSAgLT4gLTExCitzdWJ4MDM4IHN1YnRyYWN0IC0xMSAgMSAgLT4gLTEyCisKK3N1YngwNDAgc3VidHJhY3QgJzUuNzUnICczLjMnICAtPiAnMi40NScKK3N1YngwNDEgc3VidHJhY3QgJzUnICAgICctMycgICAtPiAnOCcKK3N1YngwNDIgc3VidHJhY3QgJy01JyAgICctMycgICAtPiAnLTInCitzdWJ4MDQzIHN1YnRyYWN0ICctNycgICAnMi41JyAgLT4gJy05LjUnCitzdWJ4MDQ0IHN1YnRyYWN0ICcwLjcnICAnMC4zJyAgLT4gJzAuNCcKK3N1YngwNDUgc3VidHJhY3QgJzEuMycgICcwLjMnICAtPiAnMS4wJworc3VieDA0NiBzdWJ0cmFjdCAnMS4yNScgJzEuMjUnIC0+ICcwLjAwJworCitzdWJ4MDUwIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgICAnMS4wMDAwMDAwMCcgLT4gJzAuMjM0NTY3ODknCitzdWJ4MDUxIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgICAnMS4wMDAwMDA4OScgLT4gJzAuMjM0NTY3MDAnCitzdWJ4MDUyIHN1YnRyYWN0ICcwLjU1NTU1NTU1NTknICAgICcwLjAwMDAwMDAwMDEnIC0+ICcwLjU1NTU1NTU1NicgSW5leGFjdCBSb3VuZGVkCitzdWJ4MDUzIHN1YnRyYWN0ICcwLjU1NTU1NTU1NTknICAgICcwLjAwMDAwMDAwMDUnIC0+ICcwLjU1NTU1NTU1NScgSW5leGFjdCBSb3VuZGVkCitzdWJ4MDU0IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQnICAgICcwLjExMTExMTExMTEnIC0+ICcwLjMzMzMzMzMzMycgSW5leGFjdCBSb3VuZGVkCitzdWJ4MDU1IHN1YnRyYWN0ICcxLjAwMDAwMDAwMDAnICAgICcwLjAwMDAwMDAxJyAtPiAnMC45OTk5OTk5OTAnIFJvdW5kZWQKK3N1YngwNTYgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDk5OScgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4MDU3IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDUwMDAnICAgICcwJyAtPiAnMC40NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorCitzdWJ4MDYwIHN1YnRyYWN0ICc3MCcgICAgJzEwMDAwZSs5JyAtPiAnLTEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNjEgc3VidHJhY3QgJzcwMCcgICAgJzEwMDAwZSs5JyAtPiAnLTEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNjIgc3VidHJhY3QgJzcwMDAnICAgICcxMDAwMGUrOScgLT4gJy05Ljk5OTk5OTk5RSsxMicgSW5leGFjdCBSb3VuZGVkCitzdWJ4MDYzIHN1YnRyYWN0ICc3MDAwMCcgICAgJzEwMDAwZSs5JyAtPiAnLTkuOTk5OTk5OTNFKzEyJyBSb3VuZGVkCitzdWJ4MDY0IHN1YnRyYWN0ICc3MDAwMDAnICAgICcxMDAwMGUrOScgLT4gJy05Ljk5OTk5OTMwRSsxMicgUm91bmRlZAorICAtLSBzeW1tZXRyeToKK3N1YngwNjUgc3VidHJhY3QgJzEwMDAwZSs5JyAgICAnNzAnIC0+ICcxLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitzdWJ4MDY2IHN1YnRyYWN0ICcxMDAwMGUrOScgICAgJzcwMCcgLT4gJzEuMDAwMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNjcgc3VidHJhY3QgJzEwMDAwZSs5JyAgICAnNzAwMCcgLT4gJzkuOTk5OTk5OTlFKzEyJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngwNjggc3VidHJhY3QgJzEwMDAwZSs5JyAgICAnNzAwMDAnIC0+ICc5Ljk5OTk5OTkzRSsxMicgUm91bmRlZAorc3VieDA2OSBzdWJ0cmFjdCAnMTAwMDBlKzknICAgICc3MDAwMDAnIC0+ICc5Ljk5OTk5OTMwRSsxMicgUm91bmRlZAorCisgIC0tIGNoYW5nZSBwcmVjaXNpb24KK3N1YngwODAgc3VidHJhY3QgJzEwMDAwZSs5JyAgICAnNzAwMDAnIC0+ICc5Ljk5OTk5OTkzRSsxMicgUm91bmRlZAorcHJlY2lzaW9uOiA2CitzdWJ4MDgxIHN1YnRyYWN0ICcxMDAwMGUrOScgICAgJzcwMDAwJyAtPiAnMS4wMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA5CisKKyAgLS0gc29tZSBvZiB0aGUgbmV4dCBncm91cCBhcmUgcmVhbGx5IGNvbnN0cnVjdG9yIHRlc3RzCitzdWJ4MDkwIHN1YnRyYWN0ICcwMC4wJyAgICAnMC4wJyAgLT4gJzAuMCcKK3N1YngwOTEgc3VidHJhY3QgJzAwLjAnICAgICcwLjAwJyAtPiAnMC4wMCcKK3N1YngwOTIgc3VidHJhY3QgJzAuMDAnICAgICcwMC4wJyAtPiAnMC4wMCcKK3N1YngwOTMgc3VidHJhY3QgJzAwLjAnICAgICcwLjAwJyAtPiAnMC4wMCcKK3N1YngwOTQgc3VidHJhY3QgJzAuMDAnICAgICcwMC4wJyAtPiAnMC4wMCcKK3N1YngwOTUgc3VidHJhY3QgJzMnICAgICcuMycgICAtPiAnMi43Jworc3VieDA5NiBzdWJ0cmFjdCAnMy4nICAgJy4zJyAgIC0+ICcyLjcnCitzdWJ4MDk3IHN1YnRyYWN0ICczLjAnICAnLjMnICAgLT4gJzIuNycKK3N1YngwOTggc3VidHJhY3QgJzMuMDAnICcuMycgICAtPiAnMi43MCcKK3N1YngwOTkgc3VidHJhY3QgJzMnICAgICczJyAgICAtPiAnMCcKK3N1YngxMDAgc3VidHJhY3QgJzMnICAgICcrMycgICAtPiAnMCcKK3N1YngxMDEgc3VidHJhY3QgJzMnICAgICctMycgICAtPiAnNicKK3N1YngxMDIgc3VidHJhY3QgJzMnICAgICcwLjMnICAtPiAnMi43Jworc3VieDEwMyBzdWJ0cmFjdCAnMy4nICAgJzAuMycgIC0+ICcyLjcnCitzdWJ4MTA0IHN1YnRyYWN0ICczLjAnICAnMC4zJyAgLT4gJzIuNycKK3N1YngxMDUgc3VidHJhY3QgJzMuMDAnICcwLjMnICAtPiAnMi43MCcKK3N1YngxMDYgc3VidHJhY3QgJzMnICAgICczLjAnICAtPiAnMC4wJworc3VieDEwNyBzdWJ0cmFjdCAnMycgICAgJyszLjAnIC0+ICcwLjAnCitzdWJ4MTA4IHN1YnRyYWN0ICczJyAgICAnLTMuMCcgLT4gJzYuMCcKKworLS0gdGhlIGFib3ZlIGFsbCBmcm9tIGFkZDsgbWFzc2FnZWQgYW5kIGV4dGVuZGVkLiAgTm93IHNvbWUgbmV3IG9uZXMuLi4KKy0tIFtwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGZvciBjb21wYXJpc29uc10KKy0tIE5COiAteEUtOCBiZWxvdyB3ZXJlIG5vbi1leHBvbmVudHMgcHJlLUFOU0kgWDMtMjc0LCBhbmQgLTFFLTcgb3IgMEUtNworLS0gd2l0aCBpbnB1dCByb3VuZGluZy4KK3N1YngxMjAgc3VidHJhY3QgICcxMC4yMzQ1Njc4NCcgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy01RS04Jworc3VieDEyMSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg1JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTRFLTgnCitzdWJ4MTIyIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODYnICAgICcxMC4yMzQ1Njc4OScgIC0+ICctM0UtOCcKK3N1YngxMjMgc3VidHJhY3QgICcxMC4yMzQ1Njc4NycgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJy0yRS04Jworc3VieDEyNCBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg4JyAgICAnMTAuMjM0NTY3ODknICAtPiAnLTFFLTgnCitzdWJ4MTI1IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODknICAgICcxMC4yMzQ1Njc4OScgIC0+ICcwRS04Jworc3VieDEyNiBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkwJyAgICAnMTAuMjM0NTY3ODknICAtPiAnMUUtOCcKK3N1YngxMjcgc3VidHJhY3QgICcxMC4yMzQ1Njc5MScgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzJFLTgnCitzdWJ4MTI4IHN1YnRyYWN0ICAnMTAuMjM0NTY3OTInICAgICcxMC4yMzQ1Njc4OScgIC0+ICczRS04Jworc3VieDEyOSBzdWJ0cmFjdCAgJzEwLjIzNDU2NzkzJyAgICAnMTAuMjM0NTY3ODknICAtPiAnNEUtOCcKK3N1YngxMzAgc3VidHJhY3QgICcxMC4yMzQ1Njc5NCcgICAgJzEwLjIzNDU2Nzg5JyAgLT4gJzVFLTgnCitzdWJ4MTMxIHN1YnRyYWN0ICAnMTAuMjM0NTY3ODEnICAgICcxMC4yMzQ1Njc4NicgIC0+ICctNUUtOCcKK3N1YngxMzIgc3VidHJhY3QgICcxMC4yMzQ1Njc4MicgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy00RS04Jworc3VieDEzMyBzdWJ0cmFjdCAgJzEwLjIzNDU2NzgzJyAgICAnMTAuMjM0NTY3ODYnICAtPiAnLTNFLTgnCitzdWJ4MTM0IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODQnICAgICcxMC4yMzQ1Njc4NicgIC0+ICctMkUtOCcKK3N1YngxMzUgc3VidHJhY3QgICcxMC4yMzQ1Njc4NScgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJy0xRS04Jworc3VieDEzNiBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg2JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnMEUtOCcKK3N1YngxMzcgc3VidHJhY3QgICcxMC4yMzQ1Njc4NycgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzFFLTgnCitzdWJ4MTM4IHN1YnRyYWN0ICAnMTAuMjM0NTY3ODgnICAgICcxMC4yMzQ1Njc4NicgIC0+ICcyRS04Jworc3VieDEzOSBzdWJ0cmFjdCAgJzEwLjIzNDU2Nzg5JyAgICAnMTAuMjM0NTY3ODYnICAtPiAnM0UtOCcKK3N1YngxNDAgc3VidHJhY3QgICcxMC4yMzQ1Njc5MCcgICAgJzEwLjIzNDU2Nzg2JyAgLT4gJzRFLTgnCitzdWJ4MTQxIHN1YnRyYWN0ICAnMTAuMjM0NTY3OTEnICAgICcxMC4yMzQ1Njc4NicgIC0+ICc1RS04Jworc3VieDE0MiBzdWJ0cmFjdCAgJzEnICAgICAgICAgICAgICAnMC45OTk5OTk5OTknICAtPiAnMUUtOScKK3N1YngxNDMgc3VidHJhY3QgICcwLjk5OTk5OTk5OScgICAgJzEnICAgICAgICAgICAgLT4gJy0xRS05Jworc3VieDE0NCBzdWJ0cmFjdCAgJy0xMC4yMzQ1Njc4MCcgICAnLTEwLjIzNDU2Nzg2JyAtPiAnNkUtOCcKK3N1YngxNDUgc3VidHJhY3QgICctMTAuMjM0NTY3OTAnICAgJy0xMC4yMzQ1Njc4NicgLT4gJy00RS04Jworc3VieDE0NiBzdWJ0cmFjdCAgJy0xMC4yMzQ1Njc5MScgICAnLTEwLjIzNDU2Nzg2JyAtPiAnLTVFLTgnCisKK3ByZWNpc2lvbjogMworc3VieDE1MCBzdWJ0cmFjdCAnMTIzNDU2Nzg5MDAwMDAnICc5OTk5OTk5OTk5OTk5JyAgLT4gMi4zNUUrMTIgSW5leGFjdCBSb3VuZGVkCitzdWJ4MTUxIHN1YnRyYWN0ICc5OTk5OTk5OTk5OTk5JyAgJzEyMzQ1Njc4OTAwMDAwJyAtPiAtMi4zNUUrMTIgSW5leGFjdCBSb3VuZGVkCitwcmVjaXNpb246IDYKK3N1YngxNTIgc3VidHJhY3QgJzEyMzQ1Njc4OTAwMDAwJyAnOTk5OTk5OTk5OTk5OScgIC0+IDIuMzQ1NjhFKzEyIEluZXhhY3QgUm91bmRlZAorc3VieDE1MyBzdWJ0cmFjdCAnOTk5OTk5OTk5OTk5OScgICcxMjM0NTY3ODkwMDAwMCcgLT4gLTIuMzQ1NjhFKzEyIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiA5CitzdWJ4MTU0IHN1YnRyYWN0ICcxMjM0NTY3ODkwMDAwMCcgJzk5OTk5OTk5OTk5OTknICAtPiAyLjM0NTY3ODkwRSsxMiBJbmV4YWN0IFJvdW5kZWQKK3N1YngxNTUgc3VidHJhY3QgJzk5OTk5OTk5OTk5OTknICAnMTIzNDU2Nzg5MDAwMDAnIC0+IC0yLjM0NTY3ODkwRSsxMiBJbmV4YWN0IFJvdW5kZWQKK3ByZWNpc2lvbjogMTIKK3N1YngxNTYgc3VidHJhY3QgJzEyMzQ1Njc4OTAwMDAwJyAnOTk5OTk5OTk5OTk5OScgIC0+IDIuMzQ1Njc4OTAwMDBFKzEyIEluZXhhY3QgUm91bmRlZAorc3VieDE1NyBzdWJ0cmFjdCAnOTk5OTk5OTk5OTk5OScgICcxMjM0NTY3ODkwMDAwMCcgLT4gLTIuMzQ1Njc4OTAwMDBFKzEyIEluZXhhY3QgUm91bmRlZAorcHJlY2lzaW9uOiAxNQorc3VieDE1OCBzdWJ0cmFjdCAnMTIzNDU2Nzg5MDAwMDAnICc5OTk5OTk5OTk5OTk5JyAgLT4gMjM0NTY3ODkwMDAwMQorc3VieDE1OSBzdWJ0cmFjdCAnOTk5OTk5OTk5OTk5OScgICcxMjM0NTY3ODkwMDAwMCcgLT4gLTIzNDU2Nzg5MDAwMDEKK3ByZWNpc2lvbjogOQorCistLSBhZGRpdGlvbmFsIHNjYWxlZCBhcml0aG1ldGljIHRlc3RzIFswLjk3IHByb2JsZW1dCitzdWJ4MTYwIHN1YnRyYWN0ICcwJyAgICAgJy4xJyAgICAgIC0+ICctMC4xJworc3VieDE2MSBzdWJ0cmFjdCAnMDAnICAgICcuOTc5ODMnICAtPiAnLTAuOTc5ODMnCitzdWJ4MTYyIHN1YnRyYWN0ICcwJyAgICAgJy45JyAgICAgIC0+ICctMC45Jworc3VieDE2MyBzdWJ0cmFjdCAnMCcgICAgICcwLjEwMicgICAtPiAnLTAuMTAyJworc3VieDE2NCBzdWJ0cmFjdCAnMCcgICAgICcuNCcgICAgICAtPiAnLTAuNCcKK3N1YngxNjUgc3VidHJhY3QgJzAnICAgICAnLjMwNycgICAgLT4gJy0wLjMwNycKK3N1YngxNjYgc3VidHJhY3QgJzAnICAgICAnLjQzODIyJyAgLT4gJy0wLjQzODIyJworc3VieDE2NyBzdWJ0cmFjdCAnMCcgICAgICcuOTExJyAgICAtPiAnLTAuOTExJworc3VieDE2OCBzdWJ0cmFjdCAnLjAnICAgICcuMDInICAgICAtPiAnLTAuMDInCitzdWJ4MTY5IHN1YnRyYWN0ICcwMCcgICAgJy4zOTInICAgIC0+ICctMC4zOTInCitzdWJ4MTcwIHN1YnRyYWN0ICcwJyAgICAgJy4yNicgICAgIC0+ICctMC4yNicKK3N1YngxNzEgc3VidHJhY3QgJzAnICAgICAnMC41MScgICAgLT4gJy0wLjUxJworc3VieDE3MiBzdWJ0cmFjdCAnMCcgICAgICcuMjIzNCcgICAtPiAnLTAuMjIzNCcKK3N1YngxNzMgc3VidHJhY3QgJzAnICAgICAnLjInICAgICAgLT4gJy0wLjInCitzdWJ4MTc0IHN1YnRyYWN0ICcuMCcgICAgJy4wMDA4JyAgIC0+ICctMC4wMDA4JworLS0gMC4gb24gbGVmdAorc3VieDE4MCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMScgICAgICAtPiAnMC4xJworc3VieDE4MSBzdWJ0cmFjdCAnMC4wMCcgICAgJy0uOTc5ODMnICAtPiAnMC45Nzk4MycKK3N1YngxODIgc3VidHJhY3QgJzAuMCcgICAgICctLjknICAgICAgLT4gJzAuOScKK3N1YngxODMgc3VidHJhY3QgJzAuMCcgICAgICctMC4xMDInICAgLT4gJzAuMTAyJworc3VieDE4NCBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uNCcgICAgICAtPiAnMC40Jworc3VieDE4NSBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uMzA3JyAgICAtPiAnMC4zMDcnCitzdWJ4MTg2IHN1YnRyYWN0ICcwLjAnICAgICAnLS40MzgyMicgIC0+ICcwLjQzODIyJworc3VieDE4NyBzdWJ0cmFjdCAnMC4wJyAgICAgJy0uOTExJyAgICAtPiAnMC45MTEnCitzdWJ4MTg4IHN1YnRyYWN0ICcwLjAnICAgICAnLS4wMicgICAgIC0+ICcwLjAyJworc3VieDE4OSBzdWJ0cmFjdCAnMC4wMCcgICAgJy0uMzkyJyAgICAtPiAnMC4zOTInCitzdWJ4MTkwIHN1YnRyYWN0ICcwLjAnICAgICAnLS4yNicgICAgIC0+ICcwLjI2Jworc3VieDE5MSBzdWJ0cmFjdCAnMC4wJyAgICAgJy0wLjUxJyAgICAtPiAnMC41MScKK3N1YngxOTIgc3VidHJhY3QgJzAuMCcgICAgICctLjIyMzQnICAgLT4gJzAuMjIzNCcKK3N1YngxOTMgc3VidHJhY3QgJzAuMCcgICAgICctLjInICAgICAgLT4gJzAuMicKK3N1YngxOTQgc3VidHJhY3QgJzAuMCcgICAgICctLjAwMDgnICAgLT4gJzAuMDAwOCcKKy0tIG5lZ2F0aXZlcyBvZiBzYW1lCitzdWJ4MjAwIHN1YnRyYWN0ICcwJyAgICAgJy0uMScgICAgICAtPiAnMC4xJworc3VieDIwMSBzdWJ0cmFjdCAnMDAnICAgICctLjk3OTgzJyAgLT4gJzAuOTc5ODMnCitzdWJ4MjAyIHN1YnRyYWN0ICcwJyAgICAgJy0uOScgICAgICAtPiAnMC45Jworc3VieDIwMyBzdWJ0cmFjdCAnMCcgICAgICctMC4xMDInICAgLT4gJzAuMTAyJworc3VieDIwNCBzdWJ0cmFjdCAnMCcgICAgICctLjQnICAgICAgLT4gJzAuNCcKK3N1YngyMDUgc3VidHJhY3QgJzAnICAgICAnLS4zMDcnICAgIC0+ICcwLjMwNycKK3N1YngyMDYgc3VidHJhY3QgJzAnICAgICAnLS40MzgyMicgIC0+ICcwLjQzODIyJworc3VieDIwNyBzdWJ0cmFjdCAnMCcgICAgICctLjkxMScgICAgLT4gJzAuOTExJworc3VieDIwOCBzdWJ0cmFjdCAnLjAnICAgICctLjAyJyAgICAgLT4gJzAuMDInCitzdWJ4MjA5IHN1YnRyYWN0ICcwMCcgICAgJy0uMzkyJyAgICAtPiAnMC4zOTInCitzdWJ4MjEwIHN1YnRyYWN0ICcwJyAgICAgJy0uMjYnICAgICAtPiAnMC4yNicKK3N1YngyMTEgc3VidHJhY3QgJzAnICAgICAnLTAuNTEnICAgIC0+ICcwLjUxJworc3VieDIxMiBzdWJ0cmFjdCAnMCcgICAgICctLjIyMzQnICAgLT4gJzAuMjIzNCcKK3N1YngyMTMgc3VidHJhY3QgJzAnICAgICAnLS4yJyAgICAgIC0+ICcwLjInCitzdWJ4MjE0IHN1YnRyYWN0ICcuMCcgICAgJy0uMDAwOCcgICAtPiAnMC4wMDA4JworCistLSBtb3JlIGZpeGVkLCBMSFMgc3dhcHMgW3JlYWxseSB0aGUgc2FtZSBhcyB0ZXN0Y2FzZXMgdW5kZXIgYWRkXQorc3VieDIyMCBzdWJ0cmFjdCAnLTU2MjY3RS0xMicgMCAgLT4gJy01LjYyNjdFLTgnCitzdWJ4MjIxIHN1YnRyYWN0ICctNTYyNjdFLTExJyAwICAtPiAnLTUuNjI2N0UtNycKK3N1YngyMjIgc3VidHJhY3QgJy01NjI2N0UtMTAnIDAgIC0+ICctMC4wMDAwMDU2MjY3Jworc3VieDIyMyBzdWJ0cmFjdCAnLTU2MjY3RS05JyAgMCAgLT4gJy0wLjAwMDA1NjI2NycKK3N1YngyMjQgc3VidHJhY3QgJy01NjI2N0UtOCcgIDAgIC0+ICctMC4wMDA1NjI2NycKK3N1YngyMjUgc3VidHJhY3QgJy01NjI2N0UtNycgIDAgIC0+ICctMC4wMDU2MjY3Jworc3VieDIyNiBzdWJ0cmFjdCAnLTU2MjY3RS02JyAgMCAgLT4gJy0wLjA1NjI2NycKK3N1YngyMjcgc3VidHJhY3QgJy01NjI2N0UtNScgIDAgIC0+ICctMC41NjI2NycKK3N1YngyMjggc3VidHJhY3QgJy01NjI2N0UtMicgIDAgIC0+ICctNTYyLjY3Jworc3VieDIyOSBzdWJ0cmFjdCAnLTU2MjY3RS0xJyAgMCAgLT4gJy01NjI2LjcnCitzdWJ4MjMwIHN1YnRyYWN0ICctNTYyNjdFLTAnICAwICAtPiAnLTU2MjY3JworLS0gc3ltbWV0cnkgLi4uCitzdWJ4MjQwIHN1YnRyYWN0IDAgJy01NjI2N0UtMTInICAtPiAnNS42MjY3RS04Jworc3VieDI0MSBzdWJ0cmFjdCAwICctNTYyNjdFLTExJyAgLT4gJzUuNjI2N0UtNycKK3N1YngyNDIgc3VidHJhY3QgMCAnLTU2MjY3RS0xMCcgIC0+ICcwLjAwMDAwNTYyNjcnCitzdWJ4MjQzIHN1YnRyYWN0IDAgJy01NjI2N0UtOScgICAtPiAnMC4wMDAwNTYyNjcnCitzdWJ4MjQ0IHN1YnRyYWN0IDAgJy01NjI2N0UtOCcgICAtPiAnMC4wMDA1NjI2NycKK3N1YngyNDUgc3VidHJhY3QgMCAnLTU2MjY3RS03JyAgIC0+ICcwLjAwNTYyNjcnCitzdWJ4MjQ2IHN1YnRyYWN0IDAgJy01NjI2N0UtNicgICAtPiAnMC4wNTYyNjcnCitzdWJ4MjQ3IHN1YnRyYWN0IDAgJy01NjI2N0UtNScgICAtPiAnMC41NjI2NycKK3N1YngyNDggc3VidHJhY3QgMCAnLTU2MjY3RS0yJyAgIC0+ICc1NjIuNjcnCitzdWJ4MjQ5IHN1YnRyYWN0IDAgJy01NjI2N0UtMScgICAtPiAnNTYyNi43Jworc3VieDI1MCBzdWJ0cmFjdCAwICctNTYyNjdFLTAnICAgLT4gJzU2MjY3JworCistLSBub3cgc29tZSBtb3JlIGZyb20gdGhlICduZXcnIGFkZAorcHJlY2lzaW9uOiA5CitzdWJ4MzAxIHN1YnRyYWN0ICcxLjIzNDU2Nzg5JyAgJzEuMDAwMDAwMDAnIC0+ICcwLjIzNDU2Nzg5Jworc3VieDMwMiBzdWJ0cmFjdCAnMS4yMzQ1Njc4OScgICcxLjAwMDAwMDExJyAtPiAnMC4yMzQ1Njc3OCcKKworc3VieDMxMSBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0JyAgJzAuNTU1NTU1NTU1NScgLT4gJy0wLjExMTExMTExMScgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzEyIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDAnICAnMC41NTU1NTU1NTU1JyAtPiAnLTAuMTExMTExMTEyJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMTMgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NCcgICcwLjU1NTU1NTU1NTAnIC0+ICctMC4xMTExMTExMTEnIEluZXhhY3QgUm91bmRlZAorc3VieDMxNCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0OScgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzE1IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ5OScgICAnMCcgLT4gJzAuNDQ0NDQ0NDQ0JyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMTYgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDk5OScgICcwJyAtPiAnMC40NDQ0NDQ0NDQnIEluZXhhY3QgUm91bmRlZAorc3VieDMxNyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ1MDAwJyAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzE4IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDUwMDEnICAnMCcgLT4gJzAuNDQ0NDQ0NDQ1JyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzMTkgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NTAxJyAgICcwJyAtPiAnMC40NDQ0NDQ0NDUnIEluZXhhY3QgUm91bmRlZAorc3VieDMyMCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ1MScgICAgJzAnIC0+ICcwLjQ0NDQ0NDQ0NScgSW5leGFjdCBSb3VuZGVkCisKKy0tIHNvbWUgY2FycnlpbmcgZWZmZWN0cworc3VieDMyMSBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMCcgLT4gJzAuOTk5OCcKK3N1YngzMjIgc3VidHJhY3QgJzAuOTk5OCcgICcwLjAwMDEnIC0+ICcwLjk5OTcnCitzdWJ4MzIzIHN1YnRyYWN0ICcwLjk5OTgnICAnMC4wMDAyJyAtPiAnMC45OTk2Jworc3VieDMyNCBzdWJ0cmFjdCAnMC45OTk4JyAgJzAuMDAwMycgLT4gJzAuOTk5NScKK3N1YngzMjUgc3VidHJhY3QgJzAuOTk5OCcgICctMC4wMDAwJyAtPiAnMC45OTk4Jworc3VieDMyNiBzdWJ0cmFjdCAnMC45OTk4JyAgJy0wLjAwMDEnIC0+ICcwLjk5OTknCitzdWJ4MzI3IHN1YnRyYWN0ICcwLjk5OTgnICAnLTAuMDAwMicgLT4gJzEuMDAwMCcKK3N1YngzMjggc3VidHJhY3QgJzAuOTk5OCcgICctMC4wMDAzJyAtPiAnMS4wMDAxJworCitzdWJ4MzMwIHN1YnRyYWN0ICc3MCcgICcxMDAwMGUrOScgLT4gJy0xLjAwMDAwMDAwRSsxMycgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzMxIHN1YnRyYWN0ICc3MDAnICAnMTAwMDBlKzknIC0+ICctMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDMzMiBzdWJ0cmFjdCAnNzAwMCcgICcxMDAwMGUrOScgLT4gJy05Ljk5OTk5OTk5RSsxMicgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzMzIHN1YnRyYWN0ICc3MDAwMCcgICcxMDAwMGUrOScgLT4gJy05Ljk5OTk5OTkzRSsxMicgUm91bmRlZAorc3VieDMzNCBzdWJ0cmFjdCAnNzAwMDAwJyAgJzEwMDAwZSs5JyAtPiAnLTkuOTk5OTk5MzBFKzEyJyBSb3VuZGVkCitzdWJ4MzM1IHN1YnRyYWN0ICc3MDAwMDAwJyAgJzEwMDAwZSs5JyAtPiAnLTkuOTk5OTkzMDBFKzEyJyBSb3VuZGVkCistLSBzeW1tZXRyeToKK3N1YngzNDAgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwJyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDM0MSBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwJyAtPiAnMS4wMDAwMDAwMEUrMTMnIEluZXhhY3QgUm91bmRlZAorc3VieDM0MiBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMCcgLT4gJzkuOTk5OTk5OTlFKzEyJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzNDMgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwJyAtPiAnOS45OTk5OTk5M0UrMTInIFJvdW5kZWQKK3N1YngzNDQgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwMCcgLT4gJzkuOTk5OTk5MzBFKzEyJyBSb3VuZGVkCitzdWJ4MzQ1IHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwMDAwJyAtPiAnOS45OTk5OTMwMEUrMTInIFJvdW5kZWQKKworLS0gc2FtZSwgaGlnaGVyIHByZWNpc2lvbgorcHJlY2lzaW9uOiAxNQorc3VieDM0NiBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNycgICAtPiAnOTk5OTk5OTk5OTk5MycKK3N1YngzNDcgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwJyAgIC0+ICc5OTk5OTk5OTk5OTMwJworc3VieDM0OCBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwJyAgIC0+ICc5OTk5OTk5OTk5MzAwJworc3VieDM0OSBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMCcgICAtPiAnOTk5OTk5OTk5MzAwMCcKK3N1YngzNTAgc3VidHJhY3QgJzEwMDAwZSs5JyAgJzcwMDAwJyAgIC0+ICc5OTk5OTk5OTMwMDAwJworc3VieDM1MSBzdWJ0cmFjdCAnMTAwMDBlKzknICAnNzAwMDAwJyAgIC0+ICc5OTk5OTk5MzAwMDAwJworc3VieDM1MiBzdWJ0cmFjdCAnNycgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTk5OTk5MycKK3N1YngzNTMgc3VidHJhY3QgJzcwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5OTMwJworc3VieDM1NCBzdWJ0cmFjdCAnNzAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTk5MzAwJworc3VieDM1NSBzdWJ0cmFjdCAnNzAwMCcgJzEwMDAwZSs5JyAgIC0+ICctOTk5OTk5OTk5MzAwMCcKK3N1YngzNTYgc3VidHJhY3QgJzcwMDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5OTMwMDAwJworc3VieDM1NyBzdWJ0cmFjdCAnNzAwMDAwJyAnMTAwMDBlKzknICAgLT4gJy05OTk5OTk5MzAwMDAwJworCistLSB6ZXJvIHByZXNlcnZhdGlvbgorcHJlY2lzaW9uOiA2CitzdWJ4MzYwIHN1YnRyYWN0ICcxMDAwMGUrOScgICc3MDAwMCcgLT4gJzEuMDAwMDBFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1YngzNjEgc3VidHJhY3QgMSAnMC4wMDAxJyAtPiAnMC45OTk5Jworc3VieDM2MiBzdWJ0cmFjdCAxICcwLjAwMDAxJyAtPiAnMC45OTk5OScKK3N1YngzNjMgc3VidHJhY3QgMSAnMC4wMDAwMDEnIC0+ICcwLjk5OTk5OScKK3N1YngzNjQgc3VidHJhY3QgMSAnMC4wMDAwMDAxJyAtPiAnMS4wMDAwMCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4MzY1IHN1YnRyYWN0IDEgJzAuMDAwMDAwMDEnIC0+ICcxLjAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc29tZSBmdW5ueSB6ZXJvcyBbaW4gY2FzZSBvZiBiYWQgc2lnbnVtXQorc3VieDM3MCBzdWJ0cmFjdCAxICAwICAtPiAxCitzdWJ4MzcxIHN1YnRyYWN0IDEgMC4gIC0+IDEKK3N1YngzNzIgc3VidHJhY3QgMSAgLjAgLT4gMS4wCitzdWJ4MzczIHN1YnRyYWN0IDEgMC4wIC0+IDEuMAorc3VieDM3NCBzdWJ0cmFjdCAgMCAgMSAtPiAtMQorc3VieDM3NSBzdWJ0cmFjdCAwLiAgMSAtPiAtMQorc3VieDM3NiBzdWJ0cmFjdCAgLjAgMSAtPiAtMS4wCitzdWJ4Mzc3IHN1YnRyYWN0IDAuMCAxIC0+IC0xLjAKKworcHJlY2lzaW9uOiA5CisKKy0tIGxlYWRpbmcgMCBkaWdpdCBiZWZvcmUgcm91bmQKK3N1Yng5MTAgc3VidHJhY3QgLTEwMzUxOTM2MiAtNTE4OTc5NTUuMyAtPiAtNTE2MjE0MDYuNworc3VieDkxMSBzdWJ0cmFjdCAxNTk1NzkuNDQ0IDg5ODI3LjUyMjkgLT4gNjk3NTEuOTIxMQorCitzdWJ4OTIwIHN1YnRyYWN0IDMzMy4xMjM0NTYgMzMuMTIzNDU2NiAtPiAyOTkuOTk5OTk5IEluZXhhY3QgUm91bmRlZAorc3VieDkyMSBzdWJ0cmFjdCAzMzMuMTIzNDU2IDMzLjEyMzQ1NjUgLT4gMzAwLjAwMDAwMCBJbmV4YWN0IFJvdW5kZWQKK3N1Yng5MjIgc3VidHJhY3QgMTMzLjEyMzQ1NiAzMy4xMjM0NTY1IC0+ICA5OS45OTk5OTk1CitzdWJ4OTIzIHN1YnRyYWN0IDEzMy4xMjM0NTYgMzMuMTIzNDU2NCAtPiAgOTkuOTk5OTk5Ngorc3VieDkyNCBzdWJ0cmFjdCAxMzMuMTIzNDU2IDMzLjEyMzQ1NDAgLT4gMTAwLjAwMDAwMiBSb3VuZGVkCitzdWJ4OTI1IHN1YnRyYWN0IDEzMy4xMjM0NTYgNDMuMTIzNDU2MCAtPiAgOTAuMDAwMDAwMAorc3VieDkyNiBzdWJ0cmFjdCAxMzMuMTIzNDU2IDQzLjEyMzQ1NjEgLT4gIDg5Ljk5OTk5OTkKK3N1Yng5Mjcgc3VidHJhY3QgMTMzLjEyMzQ1NiA0My4xMjM0NTY2IC0+ICA4OS45OTk5OTk0CitzdWJ4OTI4IHN1YnRyYWN0IDEwMS4xMjM0NTYgOTEuMTIzNDU2NiAtPiAgIDkuOTk5OTk5NAorc3VieDkyOSBzdWJ0cmFjdCAxMDEuMTIzNDU2IDk5LjEyMzQ1NjYgLT4gICAxLjk5OTk5OTQKKworLS0gbW9yZSBvZiB0aGUgc2FtZTsgcHJvYmUgZm9yIGNsdXN0ZXIgYm91bmRhcnkgcHJvYmxlbXMKK3ByZWNpc2lvbjogMQorc3VieDkzMCBzdWJ0cmFjdCAgMTEgMiAgICAgICAgICAgLT4gOQorcHJlY2lzaW9uOiAyCitzdWJ4OTMyIHN1YnRyYWN0IDEwMSAyICAgICAgICAgICAtPiA5OQorcHJlY2lzaW9uOiAzCitzdWJ4OTM0IHN1YnRyYWN0IDEwMSAyLjEgICAgICAgICAtPiA5OC45CitzdWJ4OTM1IHN1YnRyYWN0IDEwMSA5Mi4wMSAgICAgICAtPiAgOC45OQorcHJlY2lzaW9uOiA0CitzdWJ4OTM2IHN1YnRyYWN0IDEwMSAyLjAxICAgICAgICAtPiA5OC45OQorc3VieDkzNyBzdWJ0cmFjdCAxMDEgOTIuMDEgICAgICAgLT4gIDguOTkKK3N1Yng5Mzggc3VidHJhY3QgMTAxIDkyLjAwNiAgICAgIC0+ICA4Ljk5NAorcHJlY2lzaW9uOiA1CitzdWJ4OTM5IHN1YnRyYWN0IDEwMSAyLjAwMSAgICAgICAtPiA5OC45OTkKK3N1Yng5NDAgc3VidHJhY3QgMTAxIDkyLjAwMSAgICAgIC0+ICA4Ljk5OQorc3VieDk0MSBzdWJ0cmFjdCAxMDEgOTIuMDAwNiAgICAgLT4gIDguOTk5NAorcHJlY2lzaW9uOiA2CitzdWJ4OTQyIHN1YnRyYWN0IDEwMSAyLjAwMDEgICAgICAtPiA5OC45OTk5CitzdWJ4OTQzIHN1YnRyYWN0IDEwMSA5Mi4wMDAxICAgICAtPiAgOC45OTk5CitzdWJ4OTQ0IHN1YnRyYWN0IDEwMSA5Mi4wMDAwNiAgICAtPiAgOC45OTk5NAorcHJlY2lzaW9uOiA3CitzdWJ4OTQ1IHN1YnRyYWN0IDEwMSAyLjAwMDAxICAgICAtPiA5OC45OTk5OQorc3VieDk0NiBzdWJ0cmFjdCAxMDEgOTIuMDAwMDEgICAgLT4gIDguOTk5OTkKK3N1Yng5NDcgc3VidHJhY3QgMTAxIDkyLjAwMDAwNiAgIC0+ICA4Ljk5OTk5NAorcHJlY2lzaW9uOiA4CitzdWJ4OTQ4IHN1YnRyYWN0IDEwMSAyLjAwMDAwMSAgICAtPiA5OC45OTk5OTkKK3N1Yng5NDkgc3VidHJhY3QgMTAxIDkyLjAwMDAwMSAgIC0+ICA4Ljk5OTk5OQorc3VieDk1MCBzdWJ0cmFjdCAxMDEgOTIuMDAwMDAwNiAgLT4gIDguOTk5OTk5NAorcHJlY2lzaW9uOiA5CitzdWJ4OTUxIHN1YnRyYWN0IDEwMSAyLjAwMDAwMDEgICAtPiA5OC45OTk5OTk5CitzdWJ4OTUyIHN1YnRyYWN0IDEwMSA5Mi4wMDAwMDAxICAtPiAgOC45OTk5OTk5CitzdWJ4OTUzIHN1YnRyYWN0IDEwMSA5Mi4wMDAwMDAwNiAtPiAgOC45OTk5OTk5NAorCitwcmVjaXNpb246IDkKKworLS0gbW9yZSBMSFMgc3dhcHMgW3dlcmUgZml4ZWRdCitzdWJ4MzkwIHN1YnRyYWN0ICctNTYyNjdFLTEwJyAgIDAgLT4gICctMC4wMDAwMDU2MjY3Jworc3VieDM5MSBzdWJ0cmFjdCAnLTU2MjY3RS02JyAgICAwIC0+ICAnLTAuMDU2MjY3Jworc3VieDM5MiBzdWJ0cmFjdCAnLTU2MjY3RS01JyAgICAwIC0+ICAnLTAuNTYyNjcnCitzdWJ4MzkzIHN1YnRyYWN0ICctNTYyNjdFLTQnICAgIDAgLT4gICctNS42MjY3Jworc3VieDM5NCBzdWJ0cmFjdCAnLTU2MjY3RS0zJyAgICAwIC0+ICAnLTU2LjI2NycKK3N1YngzOTUgc3VidHJhY3QgJy01NjI2N0UtMicgICAgMCAtPiAgJy01NjIuNjcnCitzdWJ4Mzk2IHN1YnRyYWN0ICctNTYyNjdFLTEnICAgIDAgLT4gICctNTYyNi43Jworc3VieDM5NyBzdWJ0cmFjdCAnLTU2MjY3RS0wJyAgICAwIC0+ICAnLTU2MjY3Jworc3VieDM5OCBzdWJ0cmFjdCAnLTVFLTEwJyAgICAgICAwIC0+ICAnLTVFLTEwJworc3VieDM5OSBzdWJ0cmFjdCAnLTVFLTcnICAgICAgICAwIC0+ICAnLTVFLTcnCitzdWJ4NDAwIHN1YnRyYWN0ICctNUUtNicgICAgICAgIDAgLT4gICctMC4wMDAwMDUnCitzdWJ4NDAxIHN1YnRyYWN0ICctNUUtNScgICAgICAgIDAgLT4gICctMC4wMDAwNScKK3N1Yng0MDIgc3VidHJhY3QgJy01RS00JyAgICAgICAgMCAtPiAgJy0wLjAwMDUnCitzdWJ4NDAzIHN1YnRyYWN0ICctNUUtMScgICAgICAgIDAgLT4gICctMC41Jworc3VieDQwNCBzdWJ0cmFjdCAnLTVFMCcgICAgICAgICAwIC0+ICAnLTUnCitzdWJ4NDA1IHN1YnRyYWN0ICctNUUxJyAgICAgICAgIDAgLT4gICctNTAnCitzdWJ4NDA2IHN1YnRyYWN0ICctNUU1JyAgICAgICAgIDAgLT4gICctNTAwMDAwJworc3VieDQwNyBzdWJ0cmFjdCAnLTVFOCcgICAgICAgICAwIC0+ICAnLTUwMDAwMDAwMCcKK3N1Yng0MDggc3VidHJhY3QgJy01RTknICAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSs5JyAgIFJvdW5kZWQKK3N1Yng0MDkgc3VidHJhY3QgJy01RTEwJyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSsxMCcgIFJvdW5kZWQKK3N1Yng0MTAgc3VidHJhY3QgJy01RTExJyAgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSsxMScgIFJvdW5kZWQKK3N1Yng0MTEgc3VidHJhY3QgJy01RTEwMCcgICAgICAgMCAtPiAgJy01LjAwMDAwMDAwRSsxMDAnIFJvdW5kZWQKKworLS0gbW9yZSBSSFMgc3dhcHMgW3dlcmUgZml4ZWRdCitzdWJ4NDIwIHN1YnRyYWN0IDAgICctNTYyNjdFLTEwJyAtPiAgJzAuMDAwMDA1NjI2NycKK3N1Yng0MjEgc3VidHJhY3QgMCAgJy01NjI2N0UtNicgIC0+ICAnMC4wNTYyNjcnCitzdWJ4NDIyIHN1YnRyYWN0IDAgICctNTYyNjdFLTUnICAtPiAgJzAuNTYyNjcnCitzdWJ4NDIzIHN1YnRyYWN0IDAgICctNTYyNjdFLTQnICAtPiAgJzUuNjI2NycKK3N1Yng0MjQgc3VidHJhY3QgMCAgJy01NjI2N0UtMycgIC0+ICAnNTYuMjY3Jworc3VieDQyNSBzdWJ0cmFjdCAwICAnLTU2MjY3RS0yJyAgLT4gICc1NjIuNjcnCitzdWJ4NDI2IHN1YnRyYWN0IDAgICctNTYyNjdFLTEnICAtPiAgJzU2MjYuNycKK3N1Yng0Mjcgc3VidHJhY3QgMCAgJy01NjI2N0UtMCcgIC0+ICAnNTYyNjcnCitzdWJ4NDI4IHN1YnRyYWN0IDAgICctNUUtMTAnICAgICAtPiAgJzVFLTEwJworc3VieDQyOSBzdWJ0cmFjdCAwICAnLTVFLTcnICAgICAgLT4gICc1RS03Jworc3VieDQzMCBzdWJ0cmFjdCAwICAnLTVFLTYnICAgICAgLT4gICcwLjAwMDAwNScKK3N1Yng0MzEgc3VidHJhY3QgMCAgJy01RS01JyAgICAgIC0+ICAnMC4wMDAwNScKK3N1Yng0MzIgc3VidHJhY3QgMCAgJy01RS00JyAgICAgIC0+ICAnMC4wMDA1Jworc3VieDQzMyBzdWJ0cmFjdCAwICAnLTVFLTEnICAgICAgLT4gICcwLjUnCitzdWJ4NDM0IHN1YnRyYWN0IDAgICctNUUwJyAgICAgICAtPiAgJzUnCitzdWJ4NDM1IHN1YnRyYWN0IDAgICctNUUxJyAgICAgICAtPiAgJzUwJworc3VieDQzNiBzdWJ0cmFjdCAwICAnLTVFNScgICAgICAgLT4gICc1MDAwMDAnCitzdWJ4NDM3IHN1YnRyYWN0IDAgICctNUU4JyAgICAgICAtPiAgJzUwMDAwMDAwMCcKK3N1Yng0Mzggc3VidHJhY3QgMCAgJy01RTknICAgICAgIC0+ICAnNS4wMDAwMDAwMEUrOScgICAgUm91bmRlZAorc3VieDQzOSBzdWJ0cmFjdCAwICAnLTVFMTAnICAgICAgLT4gICc1LjAwMDAwMDAwRSsxMCcgICBSb3VuZGVkCitzdWJ4NDQwIHN1YnRyYWN0IDAgICctNUUxMScgICAgICAtPiAgJzUuMDAwMDAwMDBFKzExJyAgIFJvdW5kZWQKK3N1Yng0NDEgc3VidHJhY3QgMCAgJy01RTEwMCcgICAgIC0+ICAnNS4wMDAwMDAwMEUrMTAwJyAgUm91bmRlZAorCisKKy0tIHRyeSBib3JkZXJsaW5lIHByZWNpc2lvbiwgd2l0aCBjYXJyaWVzLCBldGMuCitwcmVjaXNpb246IDE1CitzdWJ4NDYxIHN1YnRyYWN0ICcxRSsxMicgJzEnICAgICAgIC0+ICc5OTk5OTk5OTk5OTknCitzdWJ4NDYyIHN1YnRyYWN0ICcxRSsxMicgJy0xLjExJyAgIC0+ICcxMDAwMDAwMDAwMDAxLjExJworc3VieDQ2MyBzdWJ0cmFjdCAnMS4xMScgICctMUUrMTInICAtPiAnMTAwMDAwMDAwMDAwMS4xMScKK3N1Yng0NjQgc3VidHJhY3QgJy0xJyAgICAnLTFFKzEyJyAgLT4gJzk5OTk5OTk5OTk5OScKK3N1Yng0NjUgc3VidHJhY3QgJzdFKzEyJyAnMScgICAgICAgLT4gJzY5OTk5OTk5OTk5OTknCitzdWJ4NDY2IHN1YnRyYWN0ICc3RSsxMicgJy0xLjExJyAgIC0+ICc3MDAwMDAwMDAwMDAxLjExJworc3VieDQ2NyBzdWJ0cmFjdCAnMS4xMScgICctN0UrMTInICAtPiAnNzAwMDAwMDAwMDAwMS4xMScKK3N1Yng0Njggc3VidHJhY3QgJy0xJyAgICAnLTdFKzEyJyAgLT4gJzY5OTk5OTk5OTk5OTknCisKKy0tICAgICAgICAgICAgICAgICAxMjM0NTY3ODkwMTIzNDUgICAgICAgMTIzNDU2Nzg5MDEyMzQ1ICAgICAgMSAyMzQ1Njc4OTAxMjM0NQorc3VieDQ3MCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTYzJyAtPiAnMS4wMDAwMDAwMDAwMDAwMScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NDcxIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NjInIC0+ICcxLjAwMDAwMDAwMDAwMDAxJyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng0NzIgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU2MScgLT4gJzEuMDAwMDAwMDAwMDAwMDEnIEluZXhhY3QgUm91bmRlZAorc3VieDQ3MyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTYwJyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NDc0IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTknIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng0NzUgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1OCcgLT4gJzEuMDAwMDAwMDAwMDAwMDAnIEluZXhhY3QgUm91bmRlZAorc3VieDQ3NiBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTU3JyAtPiAnMS4wMDAwMDAwMDAwMDAwMCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NDc3IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTYnIC0+ICcxLjAwMDAwMDAwMDAwMDAwJyBSb3VuZGVkCitzdWJ4NDc4IHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTUnIC0+ICcwLjk5OTk5OTk5OTk5OTk5OScKK3N1Yng0Nzkgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1NCcgLT4gJzAuOTk5OTk5OTk5OTk5OTk4Jworc3VieDQ4MCBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTUzJyAtPiAnMC45OTk5OTk5OTk5OTk5OTcnCitzdWJ4NDgxIHN1YnRyYWN0ICcwLjQ0NDQ0NDQ0NDQ0NDQ0NCcgICctMC41NTU1NTU1NTU1NTU1NTInIC0+ICcwLjk5OTk5OTk5OTk5OTk5NicKK3N1Yng0ODIgc3VidHJhY3QgJzAuNDQ0NDQ0NDQ0NDQ0NDQ0JyAgJy0wLjU1NTU1NTU1NTU1NTU1MScgLT4gJzAuOTk5OTk5OTk5OTk5OTk1Jworc3VieDQ4MyBzdWJ0cmFjdCAnMC40NDQ0NDQ0NDQ0NDQ0NDQnICAnLTAuNTU1NTU1NTU1NTU1NTUwJyAtPiAnMC45OTk5OTk5OTk5OTk5OTQnCisKKy0tIGFuZCBzb21lIG1vcmUsIGluY2x1ZGluZyByZXNpZHVlIGVmZmVjdHMgYW5kIGRpZmZlcmVudCByb3VuZGluZ3MKK3ByZWNpc2lvbjogOQorcm91bmRpbmc6IGhhbGZfdXAKK3N1Yng1MDAgc3VidHJhY3QgJzEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg5Jworc3VieDUwMSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwMiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwMyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwNCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwNSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwNiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwNyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwOCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUwOSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUxMCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUxMSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUxMiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUxMyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUxNCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUxNSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUxNiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnCitzdWJ4NTE3IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTE4IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTE5IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3N1Yng1MjAgc3VidHJhY3QgJzEyMzQ1Njc4OScgMCAgICAgICAgICAgICAtPiAnMTIzNDU2Nzg5Jworc3VieDUyMSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjAwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUyMiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjAwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUyMyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjEgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUyNCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQgICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUyNSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQ5ICAgICAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUyNiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OSAgICAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUyNyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDUyOCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUyOSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUzMCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUwMDAwMSAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUzMSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjUxICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUzMiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjYgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUzMyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjkgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUzNCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjk5OTk5ICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUzNSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwLjk5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDUzNiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAxICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnCitzdWJ4NTM3IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEuMDAwMDAwMDEgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTM4IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEuMDAwMDEgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTM5IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCistLSBjcml0aWNhbCBmZXcgd2l0aCBldmVuIGJvdHRvbSBkaWdpdC4uLgorc3VieDU0MCBzdWJ0cmFjdCAnMTIzNDU2Nzg4JyAwLjQ5OTk5OTk5OSAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDU0MSBzdWJ0cmFjdCAnMTIzNDU2Nzg4JyAwLjUgICAgICAgICAgIC0+ICcxMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDU0MiBzdWJ0cmFjdCAnMTIzNDU2Nzg4JyAwLjUwMDAwMDAwMSAgIC0+ICcxMjM0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogZG93bgorc3VieDU1MCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAwICAgICAgICAgICAgIC0+ICcxMjM0NTY3ODknCitzdWJ4NTUxIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMDAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTUyIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMDAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTUzIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuMSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTU0IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNCAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTU1IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDkgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTU2IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDk5OTk5ICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTU3IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNDk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTU4IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTU5IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTAwMDAwMDAxICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTYwIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTAwMDAxICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTYxIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNTEgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTYyIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuNiAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTYzIHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOSAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTY0IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOTk5OTkgICAgICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTY1IHN1YnRyYWN0ICcxMjM0NTY3ODknIDAuOTk5OTk5OTk5ICAgLT4gJzEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NTY2IHN1YnRyYWN0ICcxMjM0NTY3ODknIDEgICAgICAgICAgICAgLT4gJzEyMzQ1Njc4OCcKK3N1Yng1Njcgc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4wMDAwMDAwMSAgICAtPiAnMTIzNDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1Njggc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4wMDAwMSAgICAgICAtPiAnMTIzNDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng1Njkgc3VidHJhY3QgJzEyMzQ1Njc4OScgMS4xICAgICAgICAgICAtPiAnMTIzNDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKKworLS0gc3ltbWV0cnkuLi4KK3JvdW5kaW5nOiBoYWxmX3VwCitzdWJ4NjAwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknCitzdWJ4NjAxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYwMiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MDMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjA0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYwNSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MDYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjA3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYwOCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MDkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjEwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYxMSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MTIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjEzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYxNCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MTUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjE2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnCitzdWJ4NjE3IHN1YnRyYWN0IDEuMDAwMDAwMDAxICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYxOCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MTkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBoYWxmX2V2ZW4KK3N1Yng2MjAgc3VidHJhY3QgMCAgICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScKK3N1Yng2MjEgc3VidHJhY3QgMC4wMDAwMDAwMDEgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjIyIHN1YnRyYWN0IDAuMDAwMDAxICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYyMyBzdWJ0cmFjdCAwLjEgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MjQgc3VidHJhY3QgMC40ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjI1IHN1YnRyYWN0IDAuNDkgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknIEluZXhhY3QgUm91bmRlZAorc3VieDYyNiBzdWJ0cmFjdCAwLjQ5OTk5OSAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg5JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2Mjcgc3VidHJhY3QgMC40OTk5OTk5OTkgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OScgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjI4IHN1YnRyYWN0IDAuNSAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYyOSBzdWJ0cmFjdCAwLjUwMDAwMDAwMSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MzAgc3VidHJhY3QgMC41MDAwMDEgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjMxIHN1YnRyYWN0IDAuNTEgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYzMiBzdWJ0cmFjdCAwLjYgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MzMgc3VidHJhY3QgMC45ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjM0IHN1YnRyYWN0IDAuOTk5OTkgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYzNSBzdWJ0cmFjdCAwLjk5OTk5OTk5OSAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2MzYgc3VidHJhY3QgMSAgICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcKK3N1Yng2Mzcgc3VidHJhY3QgMS4wMDAwMDAwMSAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjM4IHN1YnRyYWN0IDEuMDAwMDEgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDYzOSBzdWJ0cmFjdCAxLjEgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKKy0tIGNyaXRpY2FsIGZldyB3aXRoIGV2ZW4gYm90dG9tIGRpZ2l0Li4uCitzdWJ4NjQwIHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzQ1Njc4OCcgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY0MSBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjM0NTY3ODgnIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NDIgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzNDU2Nzg4JyAtPiAnLTEyMzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiBkb3duCitzdWJ4NjUwIHN1YnRyYWN0IDAgICAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODknCitzdWJ4NjUxIHN1YnRyYWN0IDAuMDAwMDAwMDAxICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY1MiBzdWJ0cmFjdCAwLjAwMDAwMSAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NTMgc3VidHJhY3QgMC4xICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjU0IHN1YnRyYWN0IDAuNCAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY1NSBzdWJ0cmFjdCAwLjQ5ICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NTYgc3VidHJhY3QgMC40OTk5OTkgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjU3IHN1YnRyYWN0IDAuNDk5OTk5OTk5ICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY1OCBzdWJ0cmFjdCAwLjUgICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NTkgc3VidHJhY3QgMC41MDAwMDAwMDEgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjYwIHN1YnRyYWN0IDAuNTAwMDAxICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY2MSBzdWJ0cmFjdCAwLjUxICAgICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NjIgc3VidHJhY3QgMC42ICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjYzIHN1YnRyYWN0IDAuOSAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnIEluZXhhY3QgUm91bmRlZAorc3VieDY2NCBzdWJ0cmFjdCAwLjk5OTk5ICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg4JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2NjUgc3VidHJhY3QgMC45OTk5OTk5OTkgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4OCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NjY2IHN1YnRyYWN0IDEgICAgICAgICAgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODgnCitzdWJ4NjY3IHN1YnRyYWN0IDEuMDAwMDAwMDEgICAgJzEyMzQ1Njc4OScgLT4gJy0xMjM0NTY3ODcnIEluZXhhY3QgUm91bmRlZAorc3VieDY2OCBzdWJ0cmFjdCAxLjAwMDAxICAgICAgICcxMjM0NTY3ODknIC0+ICctMTIzNDU2Nzg3JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng2Njkgc3VidHJhY3QgMS4xICAgICAgICAgICAnMTIzNDU2Nzg5JyAtPiAnLTEyMzQ1Njc4NycgSW5leGFjdCBSb3VuZGVkCisKKworLS0gbG90cyBvZiBsZWFkaW5nIHplcm9zIGluIGludGVybWVkaWF0ZSByZXN1bHQsIGFuZCBzaG93aW5nIGVmZmVjdHMgb2YKKy0tIGlucHV0IHJvdW5kaW5nIHdvdWxkIGhhdmUgYWZmZWN0ZWQgdGhlIGZvbGxvd2luZworcHJlY2lzaW9uOiA5Cityb3VuZGluZzogaGFsZl91cAorc3VieDY3MCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg4LjEnIC0+IDAuOQorc3VieDY3MSBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg4LjknIC0+IDAuMQorc3VieDY3MiBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg5LjEnIC0+IC0wLjEKK3N1Yng2NzMgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OS41JyAtPiAtMC41CitzdWJ4Njc0IHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODkuOScgLT4gLTAuOQorCityb3VuZGluZzogaGFsZl9ldmVuCitzdWJ4NjgwIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODguMScgLT4gMC45CitzdWJ4NjgxIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODguOScgLT4gMC4xCitzdWJ4NjgyIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODkuMScgLT4gLTAuMQorc3VieDY4MyBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg5LjUnIC0+IC0wLjUKK3N1Yng2ODQgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OS45JyAtPiAtMC45CisKK3N1Yng2ODUgc3VidHJhY3QgJzEyMzQ1Njc4OCcgJzEyMzQ1Njc4Ny4xJyAtPiAwLjkKK3N1Yng2ODYgc3VidHJhY3QgJzEyMzQ1Njc4OCcgJzEyMzQ1Njc4Ny45JyAtPiAwLjEKK3N1Yng2ODcgc3VidHJhY3QgJzEyMzQ1Njc4OCcgJzEyMzQ1Njc4OC4xJyAtPiAtMC4xCitzdWJ4Njg4IHN1YnRyYWN0ICcxMjM0NTY3ODgnICcxMjM0NTY3ODguNScgLT4gLTAuNQorc3VieDY4OSBzdWJ0cmFjdCAnMTIzNDU2Nzg4JyAnMTIzNDU2Nzg4LjknIC0+IC0wLjkKKworcm91bmRpbmc6IGRvd24KK3N1Yng2OTAgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OC4xJyAtPiAwLjkKK3N1Yng2OTEgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OC45JyAtPiAwLjEKK3N1Yng2OTIgc3VidHJhY3QgJzEyMzQ1Njc4OScgJzEyMzQ1Njc4OS4xJyAtPiAtMC4xCitzdWJ4NjkzIHN1YnRyYWN0ICcxMjM0NTY3ODknICcxMjM0NTY3ODkuNScgLT4gLTAuNQorc3VieDY5NCBzdWJ0cmFjdCAnMTIzNDU2Nzg5JyAnMTIzNDU2Nzg5LjknIC0+IC0wLjkKKworLS0gaW5wdXQgcHJlcGFyYXRpb24gdGVzdHMKK3JvdW5kaW5nOiBoYWxmX3VwCitwcmVjaXNpb246IDMKKworc3VieDcwMCBzdWJ0cmFjdCAnMTIzNDU2Nzg5MDAwMDAnICAtOTk5OTk5OTk5OTk5OSAtPiAgJzIuMjNFKzEzJyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MDEgc3VidHJhY3QgICc5OTk5OTk5OTk5OTk5JyAtMTIzNDU2Nzg5MDAwMDAgLT4gICcyLjIzRSsxMycgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzAyIHN1YnRyYWN0ICcxMkUrMycgICctMzQ1NicgLT4gICcxLjU1RSs0JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MDMgc3VidHJhY3QgJzEyRSszJyAgJy0zNDQ2JyAtPiAgJzEuNTRFKzQnIEluZXhhY3QgUm91bmRlZAorc3VieDcwNCBzdWJ0cmFjdCAnMTJFKzMnICAnLTM0NTQnIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzA1IHN1YnRyYWN0ICcxMkUrMycgICctMzQ0NCcgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKKworc3VieDcwNiBzdWJ0cmFjdCAnMzQ1NicgICctMTJFKzMnIC0+ICAnMS41NUUrNCcgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzA3IHN1YnRyYWN0ICczNDQ2JyAgJy0xMkUrMycgLT4gICcxLjU0RSs0JyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MDggc3VidHJhY3QgJzM0NTQnICAnLTEyRSszJyAtPiAgJzEuNTVFKzQnIEluZXhhY3QgUm91bmRlZAorc3VieDcwOSBzdWJ0cmFjdCAnMzQ0NCcgICctMTJFKzMnIC0+ICAnMS41NEUrNCcgSW5leGFjdCBSb3VuZGVkCisKKy0tIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cgdGVzdHMgW3N1Ym5vcm1hbHMgbm93IHBvc3NpYmxlXQorbWF4ZXhwb25lbnQ6IDk5OTk5OTk5OQorbWluZXhwb25lbnQ6IC05OTk5OTk5OTkKK3ByZWNpc2lvbjogOQorcm91bmRpbmc6IGRvd24KK3N1Yng3MTAgc3VidHJhY3QgMUUrOTk5OTk5OTk5ICAgIC05RSs5OTk5OTk5OTkgICAtPiA5Ljk5OTk5OTk5RSs5OTk5OTk5OTkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzExIHN1YnRyYWN0IDlFKzk5OTk5OTk5OSAgICAtMUUrOTk5OTk5OTk5ICAgLT4gOS45OTk5OTk5OUUrOTk5OTk5OTk5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorcm91bmRpbmc6IGhhbGZfdXAKK3N1Yng3MTIgc3VidHJhY3QgMUUrOTk5OTk5OTk5ICAgIC05RSs5OTk5OTk5OTkgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MTMgc3VidHJhY3QgOUUrOTk5OTk5OTk5ICAgIC0xRSs5OTk5OTk5OTkgICAtPiBJbmZpbml0eSBPdmVyZmxvdyBJbmV4YWN0IFJvdW5kZWQKK3N1Yng3MTQgc3VidHJhY3QgLTEuMUUtOTk5OTk5OTk5IC0xRS05OTk5OTk5OTkgICAtPiAtMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK3N1Yng3MTUgc3VidHJhY3QgMUUtOTk5OTk5OTk5ICAgICsxLjFlLTk5OTk5OTk5OSAtPiAtMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKK3N1Yng3MTYgc3VidHJhY3QgLTFFKzk5OTk5OTk5OSAgICs5RSs5OTk5OTk5OTkgICAtPiAtSW5maW5pdHkgT3ZlcmZsb3cgSW5leGFjdCBSb3VuZGVkCitzdWJ4NzE3IHN1YnRyYWN0IC05RSs5OTk5OTk5OTkgICArMUUrOTk5OTk5OTk5ICAgLT4gLUluZmluaXR5IE92ZXJmbG93IEluZXhhY3QgUm91bmRlZAorc3VieDcxOCBzdWJ0cmFjdCArMS4xRS05OTk5OTk5OTkgKzFFLTk5OTk5OTk5OSAgIC0+IDFFLTEwMDAwMDAwMDAgU3Vibm9ybWFsCitzdWJ4NzE5IHN1YnRyYWN0IC0xRS05OTk5OTk5OTkgICAtMS4xZS05OTk5OTk5OTkgLT4gMUUtMTAwMDAwMDAwMCBTdWJub3JtYWwKKworcHJlY2lzaW9uOiAzCitzdWJ4NzIwIHN1YnRyYWN0IDEgIDkuOTk5RSs5OTk5OTk5OTkgICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitzdWJ4NzIxIHN1YnRyYWN0IDEgLTkuOTk5RSs5OTk5OTk5OTkgICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitzdWJ4NzIyIHN1YnRyYWN0ICAgIDkuOTk5RSs5OTk5OTk5OTkgMSAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitzdWJ4NzIzIHN1YnRyYWN0ICAgLTkuOTk5RSs5OTk5OTk5OTkgMSAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitzdWJ4NzI0IHN1YnRyYWN0IDEgIDkuOTk5RSs5OTk5OTk5OTkgICAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitzdWJ4NzI1IHN1YnRyYWN0IDEgLTkuOTk5RSs5OTk5OTk5OTkgICAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitzdWJ4NzI2IHN1YnRyYWN0ICAgIDkuOTk5RSs5OTk5OTk5OTkgMSAtPiAgSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCitzdWJ4NzI3IHN1YnRyYWN0ICAgLTkuOTk5RSs5OTk5OTk5OTkgMSAtPiAtSW5maW5pdHkgSW5leGFjdCBPdmVyZmxvdyBSb3VuZGVkCisKKy0tIFttb3JlIGJlbG93XQorCistLSBsb25nIG9wZXJhbmQgY2hlY2tzCittYXhleHBvbmVudDogOTk5CittaW5leHBvbmVudDogLTk5OQorcHJlY2lzaW9uOiA5CitzdWI3MzEgc3VidHJhY3QgMTIzNDU2NzgwMDAgMCAtPiAgMS4yMzQ1Njc4MEUrMTAgUm91bmRlZAorc3ViNzMyIHN1YnRyYWN0IDAgMTIzNDU2NzgwMDAgLT4gLTEuMjM0NTY3ODBFKzEwIFJvdW5kZWQKK3N1YjczMyBzdWJ0cmFjdCAxMjM0NTY3ODAwICAwIC0+ICAxLjIzNDU2NzgwRSs5IFJvdW5kZWQKK3N1YjczNCBzdWJ0cmFjdCAwIDEyMzQ1Njc4MDAgIC0+IC0xLjIzNDU2NzgwRSs5IFJvdW5kZWQKK3N1YjczNSBzdWJ0cmFjdCAxMjM0NTY3ODkwICAwIC0+ICAxLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK3N1YjczNiBzdWJ0cmFjdCAwIDEyMzQ1Njc4OTAgIC0+IC0xLjIzNDU2Nzg5RSs5IFJvdW5kZWQKK3N1YjczNyBzdWJ0cmFjdCAxMjM0NTY3ODkxICAwIC0+ICAxLjIzNDU2Nzg5RSs5IEluZXhhY3QgUm91bmRlZAorc3ViNzM4IHN1YnRyYWN0IDAgMTIzNDU2Nzg5MSAgLT4gLTEuMjM0NTY3ODlFKzkgSW5leGFjdCBSb3VuZGVkCitzdWI3Mzkgc3VidHJhY3QgMTIzNDU2Nzg5MDEgMCAtPiAgMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCitzdWI3NDAgc3VidHJhY3QgMCAxMjM0NTY3ODkwMSAtPiAtMS4yMzQ1Njc4OUUrMTAgSW5leGFjdCBSb3VuZGVkCitzdWI3NDEgc3VidHJhY3QgMTIzNDU2Nzg5NiAgMCAtPiAgMS4yMzQ1Njc5MEUrOSBJbmV4YWN0IFJvdW5kZWQKK3N1Yjc0MiBzdWJ0cmFjdCAwIDEyMzQ1Njc4OTYgIC0+IC0xLjIzNDU2NzkwRSs5IEluZXhhY3QgUm91bmRlZAorCitwcmVjaXNpb246IDE1CitzdWI3NTEgc3VidHJhY3QgMTIzNDU2NzgwMDAgMCAtPiAgMTIzNDU2NzgwMDAKK3N1Yjc1MiBzdWJ0cmFjdCAwIDEyMzQ1Njc4MDAwIC0+IC0xMjM0NTY3ODAwMAorc3ViNzUzIHN1YnRyYWN0IDEyMzQ1Njc4MDAgIDAgLT4gIDEyMzQ1Njc4MDAKK3N1Yjc1NCBzdWJ0cmFjdCAwIDEyMzQ1Njc4MDAgIC0+IC0xMjM0NTY3ODAwCitzdWI3NTUgc3VidHJhY3QgMTIzNDU2Nzg5MCAgMCAtPiAgMTIzNDU2Nzg5MAorc3ViNzU2IHN1YnRyYWN0IDAgMTIzNDU2Nzg5MCAgLT4gLTEyMzQ1Njc4OTAKK3N1Yjc1NyBzdWJ0cmFjdCAxMjM0NTY3ODkxICAwIC0+ICAxMjM0NTY3ODkxCitzdWI3NTggc3VidHJhY3QgMCAxMjM0NTY3ODkxICAtPiAtMTIzNDU2Nzg5MQorc3ViNzU5IHN1YnRyYWN0IDEyMzQ1Njc4OTAxIDAgLT4gIDEyMzQ1Njc4OTAxCitzdWI3NjAgc3VidHJhY3QgMCAxMjM0NTY3ODkwMSAtPiAtMTIzNDU2Nzg5MDEKK3N1Yjc2MSBzdWJ0cmFjdCAxMjM0NTY3ODk2ICAwIC0+ICAxMjM0NTY3ODk2CitzdWI3NjIgc3VidHJhY3QgMCAxMjM0NTY3ODk2ICAtPiAtMTIzNDU2Nzg5NgorCistLSBTcGVjaWFscworc3VieDc4MCBzdWJ0cmFjdCAtSW5mICAgSW5mICAgLT4gLUluZmluaXR5CitzdWJ4NzgxIHN1YnRyYWN0IC1JbmYgICAxMDAwICAtPiAtSW5maW5pdHkKK3N1Yng3ODIgc3VidHJhY3QgLUluZiAgIDEgICAgIC0+IC1JbmZpbml0eQorc3VieDc4MyBzdWJ0cmFjdCAtSW5mICAtMCAgICAgLT4gLUluZmluaXR5CitzdWJ4Nzg0IHN1YnRyYWN0IC1JbmYgIC0xICAgICAtPiAtSW5maW5pdHkKK3N1Yng3ODUgc3VidHJhY3QgLUluZiAgLTEwMDAgIC0+IC1JbmZpbml0eQorc3VieDc4NyBzdWJ0cmFjdCAtMTAwMCAgSW5mICAgLT4gLUluZmluaXR5CitzdWJ4Nzg4IHN1YnRyYWN0IC1JbmYgICBJbmYgICAtPiAtSW5maW5pdHkKK3N1Yng3ODkgc3VidHJhY3QgLTEgICAgIEluZiAgIC0+IC1JbmZpbml0eQorc3VieDc5MCBzdWJ0cmFjdCAgMCAgICAgSW5mICAgLT4gLUluZmluaXR5CitzdWJ4NzkxIHN1YnRyYWN0ICAxICAgICBJbmYgICAtPiAtSW5maW5pdHkKK3N1Yng3OTIgc3VidHJhY3QgIDEwMDAgIEluZiAgIC0+IC1JbmZpbml0eQorCitzdWJ4ODAwIHN1YnRyYWN0ICBJbmYgICBJbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDgwMSBzdWJ0cmFjdCAgSW5mICAgMTAwMCAgLT4gIEluZmluaXR5CitzdWJ4ODAyIHN1YnRyYWN0ICBJbmYgICAxICAgICAtPiAgSW5maW5pdHkKK3N1Yng4MDMgc3VidHJhY3QgIEluZiAgIDAgICAgIC0+ICBJbmZpbml0eQorc3VieDgwNCBzdWJ0cmFjdCAgSW5mICAtMCAgICAgLT4gIEluZmluaXR5CitzdWJ4ODA1IHN1YnRyYWN0ICBJbmYgIC0xICAgICAtPiAgSW5maW5pdHkKK3N1Yng4MDYgc3VidHJhY3QgIEluZiAgLTEwMDAgIC0+ICBJbmZpbml0eQorc3VieDgwNyBzdWJ0cmFjdCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CitzdWJ4ODA4IHN1YnRyYWN0IC0xMDAwIC1JbmYgICAtPiAgSW5maW5pdHkKK3N1Yng4MDkgc3VidHJhY3QgLUluZiAgLUluZiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODEwIHN1YnRyYWN0IC0xICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK3N1Yng4MTEgc3VidHJhY3QgLTAgICAgLUluZiAgIC0+ICBJbmZpbml0eQorc3VieDgxMiBzdWJ0cmFjdCAgMCAgICAtSW5mICAgLT4gIEluZmluaXR5CitzdWJ4ODEzIHN1YnRyYWN0ICAxICAgIC1JbmYgICAtPiAgSW5maW5pdHkKK3N1Yng4MTQgc3VidHJhY3QgIDEwMDAgLUluZiAgIC0+ICBJbmZpbml0eQorc3VieDgxNSBzdWJ0cmFjdCAgSW5mICAtSW5mICAgLT4gIEluZmluaXR5CisKK3N1Yng4MjEgc3VidHJhY3QgIE5hTiAgIEluZiAgIC0+ICBOYU4KK3N1Yng4MjIgc3VidHJhY3QgLU5hTiAgIDEwMDAgIC0+IC1OYU4KK3N1Yng4MjMgc3VidHJhY3QgIE5hTiAgIDEgICAgIC0+ICBOYU4KK3N1Yng4MjQgc3VidHJhY3QgIE5hTiAgIDAgICAgIC0+ICBOYU4KK3N1Yng4MjUgc3VidHJhY3QgIE5hTiAgLTAgICAgIC0+ICBOYU4KK3N1Yng4MjYgc3VidHJhY3QgIE5hTiAgLTEgICAgIC0+ICBOYU4KK3N1Yng4Mjcgc3VidHJhY3QgIE5hTiAgLTEwMDAgIC0+ICBOYU4KK3N1Yng4Mjggc3VidHJhY3QgIE5hTiAgLUluZiAgIC0+ICBOYU4KK3N1Yng4Mjkgc3VidHJhY3QgLU5hTiAgIE5hTiAgIC0+IC1OYU4KK3N1Yng4MzAgc3VidHJhY3QgLUluZiAgIE5hTiAgIC0+ICBOYU4KK3N1Yng4MzEgc3VidHJhY3QgLTEwMDAgIE5hTiAgIC0+ICBOYU4KK3N1Yng4MzIgc3VidHJhY3QgLTEgICAgIE5hTiAgIC0+ICBOYU4KK3N1Yng4MzMgc3VidHJhY3QgLTAgICAgIE5hTiAgIC0+ICBOYU4KK3N1Yng4MzQgc3VidHJhY3QgIDAgICAgIE5hTiAgIC0+ICBOYU4KK3N1Yng4MzUgc3VidHJhY3QgIDEgICAgIE5hTiAgIC0+ICBOYU4KK3N1Yng4MzYgc3VidHJhY3QgIDEwMDAgLU5hTiAgIC0+IC1OYU4KK3N1Yng4Mzcgc3VidHJhY3QgIEluZiAgIE5hTiAgIC0+ICBOYU4KKworc3VieDg0MSBzdWJ0cmFjdCAgc05hTiAgSW5mICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NDIgc3VidHJhY3QgLXNOYU4gIDEwMDAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODQzIHN1YnRyYWN0ICBzTmFOICAxICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg0NCBzdWJ0cmFjdCAgc05hTiAgMCAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NDUgc3VidHJhY3QgIHNOYU4gLTAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODQ2IHN1YnRyYWN0ICBzTmFOIC0xICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg0NyBzdWJ0cmFjdCAgc05hTiAtMTAwMCAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NDggc3VidHJhY3QgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODQ5IHN1YnRyYWN0ICBzTmFOIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg1MCBzdWJ0cmFjdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NTEgc3VidHJhY3QgLUluZiAtc05hTiAgIC0+IC1OYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODUyIHN1YnRyYWN0IC0xMDAwIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg1MyBzdWJ0cmFjdCAtMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NTQgc3VidHJhY3QgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODU1IHN1YnRyYWN0ICAwICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg1NiBzdWJ0cmFjdCAgMSAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NTcgc3VidHJhY3QgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODU4IHN1YnRyYWN0ICBJbmYgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg1OSBzdWJ0cmFjdCAgTmFOICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KKworLS0gcHJvcGFnYXRpbmcgTmFOcworc3VieDg2MSBzdWJ0cmFjdCAgTmFOMDEgICAtSW5mICAgICAtPiAgTmFOMQorc3VieDg2MiBzdWJ0cmFjdCAtTmFOMDIgICAtMTAwMCAgICAtPiAtTmFOMgorc3VieDg2MyBzdWJ0cmFjdCAgTmFOMDMgICAgMTAwMCAgICAtPiAgTmFOMworc3VieDg2NCBzdWJ0cmFjdCAgTmFOMDQgICAgSW5mICAgICAtPiAgTmFONAorc3VieDg2NSBzdWJ0cmFjdCAgTmFOMDUgICAgTmFONjEgICAtPiAgTmFONQorc3VieDg2NiBzdWJ0cmFjdCAtSW5mICAgICAtTmFONzEgICAtPiAtTmFONzEKK3N1Yng4Njcgc3VidHJhY3QgLTEwMDAgICAgIE5hTjgxICAgLT4gIE5hTjgxCitzdWJ4ODY4IHN1YnRyYWN0ICAxMDAwICAgICBOYU45MSAgIC0+ICBOYU45MQorc3VieDg2OSBzdWJ0cmFjdCAgSW5mICAgICAgTmFOMTAxICAtPiAgTmFOMTAxCitzdWJ4ODcxIHN1YnRyYWN0ICBzTmFOMDExICAtSW5mICAgIC0+ICBOYU4xMSAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NzIgc3VidHJhY3QgIHNOYU4wMTIgIC0xMDAwICAgLT4gIE5hTjEyICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg3MyBzdWJ0cmFjdCAtc05hTjAxMyAgIDEwMDAgICAtPiAtTmFOMTMgIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODc0IHN1YnRyYWN0ICBzTmFOMDE0ICAgTmFOMTcxIC0+ICBOYU4xNCAgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4NzUgc3VidHJhY3QgIHNOYU4wMTUgIHNOYU4xODEgLT4gIE5hTjE1ICBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg3NiBzdWJ0cmFjdCAgTmFOMDE2ICAgc05hTjE5MSAtPiAgTmFOMTkxIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODc3IHN1YnRyYWN0IC1JbmYgICAgICBzTmFOMjAxIC0+ICBOYU4yMDEgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4Nzggc3VidHJhY3QgLTEwMDAgICAgIHNOYU4yMTEgLT4gIE5hTjIxMSBJbnZhbGlkX29wZXJhdGlvbgorc3VieDg3OSBzdWJ0cmFjdCAgMTAwMCAgICAtc05hTjIyMSAtPiAtTmFOMjIxIEludmFsaWRfb3BlcmF0aW9uCitzdWJ4ODgwIHN1YnRyYWN0ICBJbmYgICAgICBzTmFOMjMxIC0+ICBOYU4yMzEgSW52YWxpZF9vcGVyYXRpb24KK3N1Yng4ODEgc3VidHJhY3QgIE5hTjAyNSAgIHNOYU4yNDEgLT4gIE5hTjI0MSBJbnZhbGlkX29wZXJhdGlvbgorCistLSBlZGdlIGNhc2Ugc3BpbGxzCitzdWJ4OTAxIHN1YnRyYWN0ICAyLkUtMyAgMS4wMDIgIC0+IC0xLjAwMAorc3VieDkwMiBzdWJ0cmFjdCAgMi4wRS0zICAxLjAwMiAgLT4gLTEuMDAwMAorc3VieDkwMyBzdWJ0cmFjdCAgMi4wMEUtMyAgMS4wMDIwICAtPiAtMS4wMDAwMAorc3VieDkwNCBzdWJ0cmFjdCAgMi4wMDBFLTMgIDEuMDAyMDAgIC0+IC0xLjAwMDAwMAorc3VieDkwNSBzdWJ0cmFjdCAgMi4wMDAwRS0zICAxLjAwMjAwMCAgLT4gLTEuMDAwMDAwMAorc3VieDkwNiBzdWJ0cmFjdCAgMi4wMDAwMEUtMyAgMS4wMDIwMDAwICAtPiAtMS4wMDAwMDAwMAorc3VieDkwNyBzdWJ0cmFjdCAgMi4wMDAwMDBFLTMgIDEuMDAyMDAwMDAgIC0+IC0xLjAwMDAwMDAwMAorc3VieDkwOCBzdWJ0cmFjdCAgMi4wMDAwMDAwRS0zICAxLjAwMjAwMDAwMCAgLT4gLTEuMDAwMDAwMDAwMAorCistLSBzdWJub3JtYWxzIGFuZCB1bmRlcmZsb3dzCitwcmVjaXNpb246IDMKK21heGV4cG9uZW50OiA5OTkKK21pbmV4cG9uZW50OiAtOTk5CitzdWJ4MTAxMCBzdWJ0cmFjdCAgMCAgMS4wMEUtOTk5ICAgICAgIC0+ICAtMS4wMEUtOTk5CitzdWJ4MTAxMSBzdWJ0cmFjdCAgMCAgMC4xRS05OTkgICAgICAgIC0+ICAtMUUtMTAwMCAgIFN1Ym5vcm1hbAorc3VieDEwMTIgc3VidHJhY3QgIDAgIDAuMTBFLTk5OSAgICAgICAtPiAgLTEuMEUtMTAwMCBTdWJub3JtYWwKK3N1YngxMDEzIHN1YnRyYWN0ICAwICAwLjEwMEUtOTk5ICAgICAgLT4gIC0xLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK3N1YngxMDE0IHN1YnRyYWN0ICAwICAwLjAxRS05OTkgICAgICAgLT4gIC0xRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorc3VieDEwMTUgc3VidHJhY3QgIDAgIDAuOTk5RS05OTkgICAgICAtPiAgLTEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwMTYgc3VidHJhY3QgIDAgIDAuMDk5RS05OTkgICAgICAtPiAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwMTcgc3VidHJhY3QgIDAgIDAuMDA5RS05OTkgICAgICAtPiAgLTFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwMTggc3VidHJhY3QgIDAgIDAuMDAxRS05OTkgICAgICAtPiAgLTBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitzdWJ4MTAxOSBzdWJ0cmFjdCAgMCAgMC4wMDA5RS05OTkgICAgIC0+ICAtMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3N1YngxMDIwIHN1YnRyYWN0ICAwICAwLjAwMDFFLTk5OSAgICAgLT4gIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCitzdWJ4MTAzMCBzdWJ0cmFjdCAgMCAtMS4wMEUtOTk5ICAgICAgIC0+ICAgMS4wMEUtOTk5CitzdWJ4MTAzMSBzdWJ0cmFjdCAgMCAtMC4xRS05OTkgICAgICAgIC0+ICAgMUUtMTAwMCAgIFN1Ym5vcm1hbAorc3VieDEwMzIgc3VidHJhY3QgIDAgLTAuMTBFLTk5OSAgICAgICAtPiAgIDEuMEUtMTAwMCBTdWJub3JtYWwKK3N1YngxMDMzIHN1YnRyYWN0ICAwIC0wLjEwMEUtOTk5ICAgICAgLT4gICAxLjBFLTEwMDAgU3Vibm9ybWFsIFJvdW5kZWQKK3N1YngxMDM0IHN1YnRyYWN0ICAwIC0wLjAxRS05OTkgICAgICAgLT4gICAxRS0xMDAxICAgU3Vibm9ybWFsCistLSBuZXh0IGlzIHJvdW5kZWQgdG8gRW1pbgorc3VieDEwMzUgc3VidHJhY3QgIDAgLTAuOTk5RS05OTkgICAgICAtPiAgIDEuMDBFLTk5OSBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwMzYgc3VidHJhY3QgIDAgLTAuMDk5RS05OTkgICAgICAtPiAgIDEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwMzcgc3VidHJhY3QgIDAgLTAuMDA5RS05OTkgICAgICAtPiAgIDFFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwMzggc3VidHJhY3QgIDAgLTAuMDAxRS05OTkgICAgICAtPiAgIDBFLTEwMDEgICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitzdWJ4MTAzOSBzdWJ0cmFjdCAgMCAtMC4wMDA5RS05OTkgICAgIC0+ICAgMEUtMTAwMSAgIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3N1YngxMDQwIHN1YnRyYWN0ICAwIC0wLjAwMDFFLTk5OSAgICAgLT4gICAwRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorCistLSBzb21lIG5vbi16ZXJvIHN1Ym5vcm1hbCBzdWJ0cmFjdHMKKy0tIHN1YngxMDU2IGlzIGEgdHJpY2t5IGNhc2UKK3JvdW5kaW5nOiBoYWxmX3VwCitzdWJ4MTA1MCBzdWJ0cmFjdCAgMS4wMEUtOTk5ICAgMC4xRS05OTkgIC0+ICAgOS4wRS0xMDAwICBTdWJub3JtYWwKK3N1YngxMDUxIHN1YnRyYWN0ICAwLjFFLTk5OSAgICAwLjFFLTk5OSAgLT4gICAwRS0xMDAwCitzdWJ4MTA1MiBzdWJ0cmFjdCAgMC4xMEUtOTk5ICAgMC4xRS05OTkgIC0+ICAgMEUtMTAwMQorc3VieDEwNTMgc3VidHJhY3QgIDAuMTAwRS05OTkgIDAuMUUtOTk5ICAtPiAgIDBFLTEwMDEgICAgQ2xhbXBlZAorc3VieDEwNTQgc3VidHJhY3QgIDAuMDFFLTk5OSAgIDAuMUUtOTk5ICAtPiAgIC05RS0xMDAxICAgU3Vibm9ybWFsCitzdWJ4MTA1NSBzdWJ0cmFjdCAgMC45OTlFLTk5OSAgMC4xRS05OTkgIC0+ICAgOS4wRS0xMDAwICBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwNTYgc3VidHJhY3QgIDAuMDk5RS05OTkgIDAuMUUtOTk5ICAtPiAgIC0wRS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorc3VieDEwNTcgc3VidHJhY3QgIDAuMDA5RS05OTkgIDAuMUUtOTk5ICAtPiAgIC05RS0xMDAxICAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKK3N1YngxMDU4IHN1YnRyYWN0ICAwLjAwMUUtOTk5ICAwLjFFLTk5OSAgLT4gICAtMS4wRS0xMDAwIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93CitzdWJ4MTA1OSBzdWJ0cmFjdCAgMC4wMDA5RS05OTkgMC4xRS05OTkgIC0+ICAgLTEuMEUtMTAwMCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDEwNjAgc3VidHJhY3QgIDAuMDAwMUUtOTk5IDAuMUUtOTk5ICAtPiAgIC0xLjBFLTEwMDAgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cKKworCistLSBjaGVjayBmb3IgZG91YmxlLXJvdW5kZWQgc3Vibm9ybWFscworcHJlY2lzaW9uOiAgIDUKK21heGV4cG9uZW50OiA3OQorbWluZXhwb25lbnQ6IC03OQorc3VieDExMDEgc3VidHJhY3QgIDAgMS41MjQ0NEUtODAgLT4gLTEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDExMDIgc3VidHJhY3QgIDAgMS41MjQ0NUUtODAgLT4gLTEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDExMDMgc3VidHJhY3QgIDAgMS41MjQ0NkUtODAgLT4gLTEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDExMDQgc3VidHJhY3QgIDEuNTI0NDRFLTgwIDAgLT4gIDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDExMDUgc3VidHJhY3QgIDEuNTI0NDVFLTgwIDAgLT4gIDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworc3VieDExMDYgc3VidHJhY3QgIDEuNTI0NDZFLTgwIDAgLT4gIDEuNTI0RS04MCBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdworCitzdWJ4MTExMSBzdWJ0cmFjdCAgMS4yMzQ1Njc4RS04MCAgMS4yMzQ1NjcxRS04MCAtPiAgMEUtODMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorc3VieDExMTIgc3VidHJhY3QgIDEuMjM0NTY3OEUtODAgIDEuMjM0NTYxOEUtODAgLT4gIDBFLTgzIEluZXhhY3QgUm91bmRlZCBTdWJub3JtYWwgVW5kZXJmbG93IENsYW1wZWQKK3N1YngxMTEzIHN1YnRyYWN0ICAxLjIzNDU2NzhFLTgwICAxLjIzNDUxNzhFLTgwIC0+ICAwRS04MyBJbmV4YWN0IFJvdW5kZWQgU3Vibm9ybWFsIFVuZGVyZmxvdyBDbGFtcGVkCitzdWJ4MTExNCBzdWJ0cmFjdCAgMS4yMzQ1Njc4RS04MCAgMS4yMzQxNjc4RS04MCAtPiAgMEUtODMgSW5leGFjdCBSb3VuZGVkIFN1Ym5vcm1hbCBVbmRlcmZsb3cgQ2xhbXBlZAorc3VieDExMTUgc3VidHJhY3QgIDEuMjM0NTY3OEUtODAgIDEuMjMxNTY3OEUtODAgLT4gIDNFLTgzICAgICAgICAgUm91bmRlZCBTdWJub3JtYWwKK3N1YngxMTE2IHN1YnRyYWN0ICAxLjIzNDU2NzhFLTgwICAxLjIxNDU2NzhFLTgwIC0+ICAyLjBFLTgyICAgICAgIFJvdW5kZWQgU3Vibm9ybWFsCitzdWJ4MTExNyBzdWJ0cmFjdCAgMS4yMzQ1Njc4RS04MCAgMS4xMzQ1Njc4RS04MCAtPiAgMS4wMEUtODEgICAgICBSb3VuZGVkIFN1Ym5vcm1hbAorc3VieDExMTggc3VidHJhY3QgIDEuMjM0NTY3OEUtODAgIDAuMjM0NTY3OEUtODAgLT4gIDEuMDAwRS04MCAgICAgUm91bmRlZCBTdWJub3JtYWwKKworcHJlY2lzaW9uOiAgIDM0Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDYxNDQKK21pbkV4cG9uZW50OiAtNjE0MworLS0gRXhhbXBsZXMgZnJvbSBTUUwgcHJvcG9zYWwgKEtyaXNobmEgS3Vsa2FybmkpCitzdWJ4MTEyNSAgc3VidHJhY3QgMTMwRS0yICAxMjBFLTIgLT4gMC4xMAorc3VieDExMjYgIHN1YnRyYWN0IDEzMEUtMiAgMTJFLTEgIC0+IDAuMTAKK3N1YngxMTI3ICBzdWJ0cmFjdCAxMzBFLTIgIDFFMCAgICAtPiAwLjMwCitzdWJ4MTEyOCAgc3VidHJhY3QgMUUyICAgICAxRTQgICAgLT4gLTkuOUUrMworCistLSBOdWxsIHRlc3RzCitzdWJ4OTk5MCBzdWJ0cmFjdCAxMCAgIyAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3N1Yng5OTkxIHN1YnRyYWN0ICAjIDEwIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS90ZXN0YWxsLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3Rlc3RhbGwuZGVjVGVzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2NlNzMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS90ZXN0YWxsLmRlY1Rlc3QKQEAgLTAsMCArMSw4NyBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSB0ZXN0YWxsLmRlY1Rlc3QgLS0gcnVuIGFsbCBnZW5lcmFsIGRlY2ltYWwgYXJpdGhtZXRpYyB0ZXN0Y2FzZXMgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAxOTgxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIGNvcmUgdGVzdHMgKHVzaW5nIEV4dGVuZGVkOiAxKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorZGVjdGVzdDogYmFzZQorCitkZWN0ZXN0OiBhYnMKK2RlY3Rlc3Q6IGFkZAorZGVjdGVzdDogYW5kCitkZWN0ZXN0OiBjbGFtcAorZGVjdGVzdDogY2xhc3MKK2RlY3Rlc3Q6IGNvbXBhcmUKK2RlY3Rlc3Q6IGNvbXBhcmVzaWcKK2RlY3Rlc3Q6IGNvbXBhcmV0b3RhbAorZGVjdGVzdDogY29tcGFyZXRvdG1hZworZGVjdGVzdDogY29weQorZGVjdGVzdDogY29weWFicworZGVjdGVzdDogY29weW5lZ2F0ZQorZGVjdGVzdDogY29weXNpZ24KK2RlY3Rlc3Q6IGRpdmlkZQorZGVjdGVzdDogZGl2aWRlaW50CitkZWN0ZXN0OiBleHAKK2RlY3Rlc3Q6IGZtYQorZGVjdGVzdDogaW5leGFjdAorZGVjdGVzdDogaW52ZXJ0CitkZWN0ZXN0OiBsbgorZGVjdGVzdDogbG9nYgorZGVjdGVzdDogbG9nMTAKK2RlY3Rlc3Q6IG1heAorZGVjdGVzdDogbWF4bWFnCitkZWN0ZXN0OiBtaW4KK2RlY3Rlc3Q6IG1pbm1hZworZGVjdGVzdDogbWludXMKK2RlY3Rlc3Q6IG11bHRpcGx5CitkZWN0ZXN0OiBuZXh0bWludXMKK2RlY3Rlc3Q6IG5leHRwbHVzCitkZWN0ZXN0OiBuZXh0dG93YXJkCitkZWN0ZXN0OiBvcgorZGVjdGVzdDogcGx1cworZGVjdGVzdDogcG93ZXIKK2RlY3Rlc3Q6IHBvd2Vyc3FydAorZGVjdGVzdDogcXVhbnRpemUKK2RlY3Rlc3Q6IHJhbmRvbXMKK2RlY3Rlc3Q6IHJlZHVjZSAgICAgICAgICAgICAgIC0tIFt3YXMgY2FsbGVkIG5vcm1hbGl6ZV0KK2RlY3Rlc3Q6IHJlbWFpbmRlcgorZGVjdGVzdDogcmVtYWluZGVybmVhcgorZGVjdGVzdDogcmVzY2FsZSAgICAgICAgICAgICAgLS0gW29ic29sZXRlXQorZGVjdGVzdDogcm90YXRlCitkZWN0ZXN0OiByb3VuZGluZworZGVjdGVzdDogc2FtZXF1YW50dW0KK2RlY3Rlc3Q6IHNjYWxlYgorZGVjdGVzdDogc2hpZnQKK2RlY3Rlc3Q6IHNxdWFyZXJvb3QKK2RlY3Rlc3Q6IHN1YnRyYWN0CitkZWN0ZXN0OiB0b2ludGVncmFsCitkZWN0ZXN0OiB0b2ludGVncmFseAorZGVjdGVzdDogdHJpbQorZGVjdGVzdDogeG9yCisKKy0tIFRoZSBuZXh0IGFyZSBmb3IgdGhlIFN0cmF3bWFuIDRkIGNvbmNyZXRlIHJlcHJlc2VudGF0aW9ucyBhbmQKKy0tIHRlc3RzIGF0IHRob3NlIHNpemVzIFtpbmNsdWRpbmcgZHNFbmNvZGUsIGRkRW5jb2RlLCBhbmQgZHFFbmNvZGUsCistLSB3aGljaCByZXBsYWNlIGRlY2ltYWwzMiwgZGVjaW1hbDY0LCBhbmQgZGVjaW1hbDEyOF0KK2RlY3Rlc3Q6IGRlY1NpbmdsZQorZGVjdGVzdDogZGVjRG91YmxlCitkZWN0ZXN0OiBkZWNRdWFkCisKKy0tIEdlbmVyYWwgMzEtPjMzLWRpZ2l0IGJvdW5kYXJ5IHRlc3RzCitkZWN0ZXN0OiByYW5kb21ib3VuZDMyCisKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvdG9pbnRlZ3JhbC5kZWNUZXN0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RlY2ltYWx0ZXN0ZGF0YS90b2ludGVncmFsLmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzZmI5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvdG9pbnRlZ3JhbC5kZWNUZXN0CkBAIC0wLDAgKzEsMjQxIEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHRvaW50ZWdyYWwuZGVjVGVzdCAtLSByb3VuZCBkZWNpbWFsIHRvIGludGVncmFsIHZhbHVlICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDIwMDEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworLS0gVGhpcyBzZXQgb2YgdGVzdHMgdGVzdHMgdGhlIGV4dGVuZGVkIHNwZWNpZmljYXRpb24gJ3JvdW5kLXRvLWludGVncmFsCistLSB2YWx1ZScgb3BlcmF0aW9uIChmcm9tIElFRUUgODU0LCBsYXRlciBtb2RpZmllZCBpbiA3NTRyKS4KKy0tIEFsbCBub24temVybyByZXN1bHRzIGFyZSBkZWZpbmVkIGFzIGJlaW5nIHRob3NlIGZyb20gZWl0aGVyIGNvcHkgb3IKKy0tIHF1YW50aXplLCBzbyB0aG9zZSBhcmUgYXNzdW1lZCB0byBoYXZlIGJlZW4gdGVzdGVkLgorLS0gTm90ZSB0aGF0IDc1NHIgcmVxdWlyZXMgdGhhdCBJbmV4YWN0IG5vdCBiZSBzZXQsIGFuZCB3ZSBzaW1pbGFybHkKKy0tIGFzc3VtZSBSb3VuZGVkIGlzIG5vdCBzZXQuCisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKK2ludHgwMDEgdG9pbnRlZ3JhbCAgICAgIDAgICAgIC0+ICAwCitpbnR4MDAyIHRvaW50ZWdyYWwgICAgICAwLjAgICAtPiAgMAoraW50eDAwMyB0b2ludGVncmFsICAgICAgMC4xICAgLT4gIDAKK2ludHgwMDQgdG9pbnRlZ3JhbCAgICAgIDAuMiAgIC0+ICAwCitpbnR4MDA1IHRvaW50ZWdyYWwgICAgICAwLjMgICAtPiAgMAoraW50eDAwNiB0b2ludGVncmFsICAgICAgMC40ICAgLT4gIDAKK2ludHgwMDcgdG9pbnRlZ3JhbCAgICAgIDAuNSAgIC0+ICAxCitpbnR4MDA4IHRvaW50ZWdyYWwgICAgICAwLjYgICAtPiAgMQoraW50eDAwOSB0b2ludGVncmFsICAgICAgMC43ICAgLT4gIDEKK2ludHgwMTAgdG9pbnRlZ3JhbCAgICAgIDAuOCAgIC0+ICAxCitpbnR4MDExIHRvaW50ZWdyYWwgICAgICAwLjkgICAtPiAgMQoraW50eDAxMiB0b2ludGVncmFsICAgICAgMSAgICAgLT4gIDEKK2ludHgwMTMgdG9pbnRlZ3JhbCAgICAgIDEuMCAgIC0+ICAxCitpbnR4MDE0IHRvaW50ZWdyYWwgICAgICAxLjEgICAtPiAgMQoraW50eDAxNSB0b2ludGVncmFsICAgICAgMS4yICAgLT4gIDEKK2ludHgwMTYgdG9pbnRlZ3JhbCAgICAgIDEuMyAgIC0+ICAxCitpbnR4MDE3IHRvaW50ZWdyYWwgICAgICAxLjQgICAtPiAgMQoraW50eDAxOCB0b2ludGVncmFsICAgICAgMS41ICAgLT4gIDIKK2ludHgwMTkgdG9pbnRlZ3JhbCAgICAgIDEuNiAgIC0+ICAyCitpbnR4MDIwIHRvaW50ZWdyYWwgICAgICAxLjcgICAtPiAgMgoraW50eDAyMSB0b2ludGVncmFsICAgICAgMS44ICAgLT4gIDIKK2ludHgwMjIgdG9pbnRlZ3JhbCAgICAgIDEuOSAgIC0+ICAyCistLSBuZWdhdGl2ZXMKK2ludHgwMzEgdG9pbnRlZ3JhbCAgICAgLTAgICAgIC0+IC0wCitpbnR4MDMyIHRvaW50ZWdyYWwgICAgIC0wLjAgICAtPiAtMAoraW50eDAzMyB0b2ludGVncmFsICAgICAtMC4xICAgLT4gLTAKK2ludHgwMzQgdG9pbnRlZ3JhbCAgICAgLTAuMiAgIC0+IC0wCitpbnR4MDM1IHRvaW50ZWdyYWwgICAgIC0wLjMgICAtPiAtMAoraW50eDAzNiB0b2ludGVncmFsICAgICAtMC40ICAgLT4gLTAKK2ludHgwMzcgdG9pbnRlZ3JhbCAgICAgLTAuNSAgIC0+IC0xCitpbnR4MDM4IHRvaW50ZWdyYWwgICAgIC0wLjYgICAtPiAtMQoraW50eDAzOSB0b2ludGVncmFsICAgICAtMC43ICAgLT4gLTEKK2ludHgwNDAgdG9pbnRlZ3JhbCAgICAgLTAuOCAgIC0+IC0xCitpbnR4MDQxIHRvaW50ZWdyYWwgICAgIC0wLjkgICAtPiAtMQoraW50eDA0MiB0b2ludGVncmFsICAgICAtMSAgICAgLT4gLTEKK2ludHgwNDMgdG9pbnRlZ3JhbCAgICAgLTEuMCAgIC0+IC0xCitpbnR4MDQ0IHRvaW50ZWdyYWwgICAgIC0xLjEgICAtPiAtMQoraW50eDA0NSB0b2ludGVncmFsICAgICAtMS4yICAgLT4gLTEKK2ludHgwNDYgdG9pbnRlZ3JhbCAgICAgLTEuMyAgIC0+IC0xCitpbnR4MDQ3IHRvaW50ZWdyYWwgICAgIC0xLjQgICAtPiAtMQoraW50eDA0OCB0b2ludGVncmFsICAgICAtMS41ICAgLT4gLTIKK2ludHgwNDkgdG9pbnRlZ3JhbCAgICAgLTEuNiAgIC0+IC0yCitpbnR4MDUwIHRvaW50ZWdyYWwgICAgIC0xLjcgICAtPiAtMgoraW50eDA1MSB0b2ludGVncmFsICAgICAtMS44ICAgLT4gLTIKK2ludHgwNTIgdG9pbnRlZ3JhbCAgICAgLTEuOSAgIC0+IC0yCistLSBuZXh0IHR3byB3b3VsZCBiZSBOYU4gdXNpbmcgcXVhbnRpemUoeCwgMCkKK2ludHgwNTMgdG9pbnRlZ3JhbCAgICAxMEUrMzAgIC0+IDEuMEUrMzEKK2ludHgwNTQgdG9pbnRlZ3JhbCAgIC0xMEUrMzAgIC0+IC0xLjBFKzMxCisKKy0tIG51bWJlcnMgYXJvdW5kIHByZWNpc2lvbgorcHJlY2lzaW9uOiA5CitpbnR4MDYwIHRvaW50ZWdyYWwgJzU2MjY3RS0xMCcgICAtPiAnMCcKK2ludHgwNjEgdG9pbnRlZ3JhbCAnNTYyNjdFLTUnICAgIC0+ICcxJworaW50eDA2MiB0b2ludGVncmFsICc1NjI2N0UtMicgICAgLT4gJzU2MycKK2ludHgwNjMgdG9pbnRlZ3JhbCAnNTYyNjdFLTEnICAgIC0+ICc1NjI3JworaW50eDA2NSB0b2ludGVncmFsICc1NjI2N0UtMCcgICAgLT4gJzU2MjY3JworaW50eDA2NiB0b2ludGVncmFsICc1NjI2N0UrMCcgICAgLT4gJzU2MjY3JworaW50eDA2NyB0b2ludGVncmFsICc1NjI2N0UrMScgICAgLT4gJzUuNjI2N0UrNScKK2ludHgwNjggdG9pbnRlZ3JhbCAnNTYyNjdFKzInICAgIC0+ICc1LjYyNjdFKzYnCitpbnR4MDY5IHRvaW50ZWdyYWwgJzU2MjY3RSszJyAgICAtPiAnNS42MjY3RSs3JworaW50eDA3MCB0b2ludGVncmFsICc1NjI2N0UrNCcgICAgLT4gJzUuNjI2N0UrOCcKK2ludHgwNzEgdG9pbnRlZ3JhbCAnNTYyNjdFKzUnICAgIC0+ICc1LjYyNjdFKzknCitpbnR4MDcyIHRvaW50ZWdyYWwgJzU2MjY3RSs2JyAgICAtPiAnNS42MjY3RSsxMCcKK2ludHgwNzMgdG9pbnRlZ3JhbCAnMS4yM0UrOTYnICAgIC0+ICcxLjIzRSs5NicKK2ludHgwNzQgdG9pbnRlZ3JhbCAnMS4yM0UrMzg0JyAgIC0+ICcxLjIzRSszODQnCitpbnR4MDc1IHRvaW50ZWdyYWwgJzEuMjNFKzk5OScgICAtPiAnMS4yM0UrOTk5JworCitpbnR4MDgwIHRvaW50ZWdyYWwgJy01NjI2N0UtMTAnICAtPiAnLTAnCitpbnR4MDgxIHRvaW50ZWdyYWwgJy01NjI2N0UtNScgICAtPiAnLTEnCitpbnR4MDgyIHRvaW50ZWdyYWwgJy01NjI2N0UtMicgICAtPiAnLTU2MycKK2ludHgwODMgdG9pbnRlZ3JhbCAnLTU2MjY3RS0xJyAgIC0+ICctNTYyNycKK2ludHgwODUgdG9pbnRlZ3JhbCAnLTU2MjY3RS0wJyAgIC0+ICctNTYyNjcnCitpbnR4MDg2IHRvaW50ZWdyYWwgJy01NjI2N0UrMCcgICAtPiAnLTU2MjY3JworaW50eDA4NyB0b2ludGVncmFsICctNTYyNjdFKzEnICAgLT4gJy01LjYyNjdFKzUnCitpbnR4MDg4IHRvaW50ZWdyYWwgJy01NjI2N0UrMicgICAtPiAnLTUuNjI2N0UrNicKK2ludHgwODkgdG9pbnRlZ3JhbCAnLTU2MjY3RSszJyAgIC0+ICctNS42MjY3RSs3JworaW50eDA5MCB0b2ludGVncmFsICctNTYyNjdFKzQnICAgLT4gJy01LjYyNjdFKzgnCitpbnR4MDkxIHRvaW50ZWdyYWwgJy01NjI2N0UrNScgICAtPiAnLTUuNjI2N0UrOScKK2ludHgwOTIgdG9pbnRlZ3JhbCAnLTU2MjY3RSs2JyAgIC0+ICctNS42MjY3RSsxMCcKK2ludHgwOTMgdG9pbnRlZ3JhbCAnLTEuMjNFKzk2JyAgIC0+ICctMS4yM0UrOTYnCitpbnR4MDk0IHRvaW50ZWdyYWwgJy0xLjIzRSszODQnICAtPiAnLTEuMjNFKzM4NCcKK2ludHgwOTUgdG9pbnRlZ3JhbCAnLTEuMjNFKzk5OScgIC0+ICctMS4yM0UrOTk5JworCistLSBzdWJub3JtYWwgaW5wdXRzCitpbnR4MTAwIHRvaW50ZWdyYWwgICAgICAgIDFFLTk5OSAtPiAwCitpbnR4MTAxIHRvaW50ZWdyYWwgICAgICAwLjFFLTk5OSAtPiAwCitpbnR4MTAyIHRvaW50ZWdyYWwgICAgIDAuMDFFLTk5OSAtPiAwCitpbnR4MTAzIHRvaW50ZWdyYWwgICAgICAgIDBFLTk5OSAtPiAwCisKKy0tIHNwZWNpYWxzIGFuZCB6ZXJvcworaW50eDEyMCB0b2ludGVncmFsICdJbmYnICAgICAgIC0+ICBJbmZpbml0eQoraW50eDEyMSB0b2ludGVncmFsICctSW5mJyAgICAgIC0+IC1JbmZpbml0eQoraW50eDEyMiB0b2ludGVncmFsICAgTmFOICAgICAgIC0+ICBOYU4KK2ludHgxMjMgdG9pbnRlZ3JhbCAgc05hTiAgICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoraW50eDEyNCB0b2ludGVncmFsICAgICAwICAgICAgIC0+ICAwCitpbnR4MTI1IHRvaW50ZWdyYWwgICAgLTAgICAgICAgLT4gLTAKK2ludHgxMjYgdG9pbnRlZ3JhbCAgICAgMC4wMDAgICAtPiAgMAoraW50eDEyNyB0b2ludGVncmFsICAgICAwLjAwICAgIC0+ICAwCitpbnR4MTI4IHRvaW50ZWdyYWwgICAgIDAuMCAgICAgLT4gIDAKK2ludHgxMjkgdG9pbnRlZ3JhbCAgICAgMCAgICAgICAtPiAgMAoraW50eDEzMCB0b2ludGVncmFsICAgICAwRS0zICAgIC0+ICAwCitpbnR4MTMxIHRvaW50ZWdyYWwgICAgIDBFLTIgICAgLT4gIDAKK2ludHgxMzIgdG9pbnRlZ3JhbCAgICAgMEUtMSAgICAtPiAgMAoraW50eDEzMyB0b2ludGVncmFsICAgICAwRS0wICAgIC0+ICAwCitpbnR4MTM0IHRvaW50ZWdyYWwgICAgIDBFKzEgICAgLT4gIDBFKzEKK2ludHgxMzUgdG9pbnRlZ3JhbCAgICAgMEUrMiAgICAtPiAgMEUrMgoraW50eDEzNiB0b2ludGVncmFsICAgICAwRSszICAgIC0+ICAwRSszCitpbnR4MTM3IHRvaW50ZWdyYWwgICAgIDBFKzQgICAgLT4gIDBFKzQKK2ludHgxMzggdG9pbnRlZ3JhbCAgICAgMEUrNSAgICAtPiAgMEUrNQoraW50eDEzOSB0b2ludGVncmFsICAgIC0wLjAwMCAgIC0+IC0wCitpbnR4MTQwIHRvaW50ZWdyYWwgICAgLTAuMDAgICAgLT4gLTAKK2ludHgxNDEgdG9pbnRlZ3JhbCAgICAtMC4wICAgICAtPiAtMAoraW50eDE0MiB0b2ludGVncmFsICAgIC0wICAgICAgIC0+IC0wCitpbnR4MTQzIHRvaW50ZWdyYWwgICAgLTBFLTMgICAgLT4gLTAKK2ludHgxNDQgdG9pbnRlZ3JhbCAgICAtMEUtMiAgICAtPiAtMAoraW50eDE0NSB0b2ludGVncmFsICAgIC0wRS0xICAgIC0+IC0wCitpbnR4MTQ2IHRvaW50ZWdyYWwgICAgLTBFLTAgICAgLT4gLTAKK2ludHgxNDcgdG9pbnRlZ3JhbCAgICAtMEUrMSAgICAtPiAtMEUrMQoraW50eDE0OCB0b2ludGVncmFsICAgIC0wRSsyICAgIC0+IC0wRSsyCitpbnR4MTQ5IHRvaW50ZWdyYWwgICAgLTBFKzMgICAgLT4gLTBFKzMKK2ludHgxNTAgdG9pbnRlZ3JhbCAgICAtMEUrNCAgICAtPiAtMEUrNAoraW50eDE1MSB0b2ludGVncmFsICAgIC0wRSs1ICAgIC0+IC0wRSs1CistLSBwcm9wYWdhdGluZyBOYU5zCitpbnR4MTUyIHRvaW50ZWdyYWwgICBOYU44MDggICAgLT4gIE5hTjgwOAoraW50eDE1MyB0b2ludGVncmFsICBzTmFOMDgwICAgIC0+ICBOYU44MCAgSW52YWxpZF9vcGVyYXRpb24KK2ludHgxNTQgdG9pbnRlZ3JhbCAgLU5hTjgwOCAgICAtPiAtTmFOODA4CitpbnR4MTU1IHRvaW50ZWdyYWwgLXNOYU4wODAgICAgLT4gLU5hTjgwICBJbnZhbGlkX29wZXJhdGlvbgoraW50eDE1NiB0b2ludGVncmFsICAtTmFOICAgICAgIC0+IC1OYU4KK2ludHgxNTcgdG9pbnRlZ3JhbCAtc05hTiAgICAgICAtPiAtTmFOICAgIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIGV4YW1wbGVzCityb3VuZGluZzogICAgaGFsZl91cAorcHJlY2lzaW9uOiAgIDkKK2ludHgyMDAgdG9pbnRlZ3JhbCAgICAgMi4xICAgIC0+IDIKK2ludHgyMDEgdG9pbnRlZ3JhbCAgIDEwMCAgICAgIC0+IDEwMAoraW50eDIwMiB0b2ludGVncmFsICAgMTAwLjAgICAgLT4gMTAwCitpbnR4MjAzIHRvaW50ZWdyYWwgICAxMDEuNSAgICAtPiAxMDIKK2ludHgyMDQgdG9pbnRlZ3JhbCAgLTEwMS41ICAgIC0+IC0xMDIKK2ludHgyMDUgdG9pbnRlZ3JhbCAgIDEwRSs1ICAgIC0+IDEuMEUrNgoraW50eDIwNiB0b2ludGVncmFsICA3Ljg5RSs3NyAgLT4gNy44OUUrNzcKK2ludHgyMDcgdG9pbnRlZ3JhbCAgIC1JbmYgICAgIC0+IC1JbmZpbml0eQorCisKKy0tIGFsbCByb3VuZGluZyBtb2Rlcworcm91bmRpbmc6ICAgIGhhbGZfZXZlbgorCitpbnR4MjEwIHRvaW50ZWdyYWwgICAgIDU1LjUgICAtPiAgNTYKK2ludHgyMTEgdG9pbnRlZ3JhbCAgICAgNTYuNSAgIC0+ICA1NgoraW50eDIxMiB0b2ludGVncmFsICAgICA1Ny41ICAgLT4gIDU4CitpbnR4MjEzIHRvaW50ZWdyYWwgICAgLTU1LjUgICAtPiAtNTYKK2ludHgyMTQgdG9pbnRlZ3JhbCAgICAtNTYuNSAgIC0+IC01NgoraW50eDIxNSB0b2ludGVncmFsICAgIC01Ny41ICAgLT4gLTU4CisKK3JvdW5kaW5nOiAgICBoYWxmX3VwCisKK2ludHgyMjAgdG9pbnRlZ3JhbCAgICAgNTUuNSAgIC0+ICA1NgoraW50eDIyMSB0b2ludGVncmFsICAgICA1Ni41ICAgLT4gIDU3CitpbnR4MjIyIHRvaW50ZWdyYWwgICAgIDU3LjUgICAtPiAgNTgKK2ludHgyMjMgdG9pbnRlZ3JhbCAgICAtNTUuNSAgIC0+IC01NgoraW50eDIyNCB0b2ludGVncmFsICAgIC01Ni41ICAgLT4gLTU3CitpbnR4MjI1IHRvaW50ZWdyYWwgICAgLTU3LjUgICAtPiAtNTgKKworcm91bmRpbmc6ICAgIGhhbGZfZG93bgorCitpbnR4MjMwIHRvaW50ZWdyYWwgICAgIDU1LjUgICAtPiAgNTUKK2ludHgyMzEgdG9pbnRlZ3JhbCAgICAgNTYuNSAgIC0+ICA1NgoraW50eDIzMiB0b2ludGVncmFsICAgICA1Ny41ICAgLT4gIDU3CitpbnR4MjMzIHRvaW50ZWdyYWwgICAgLTU1LjUgICAtPiAtNTUKK2ludHgyMzQgdG9pbnRlZ3JhbCAgICAtNTYuNSAgIC0+IC01NgoraW50eDIzNSB0b2ludGVncmFsICAgIC01Ny41ICAgLT4gLTU3CisKK3JvdW5kaW5nOiAgICB1cAorCitpbnR4MjQwIHRvaW50ZWdyYWwgICAgIDU1LjMgICAtPiAgNTYKK2ludHgyNDEgdG9pbnRlZ3JhbCAgICAgNTYuMyAgIC0+ICA1NworaW50eDI0MiB0b2ludGVncmFsICAgICA1Ny4zICAgLT4gIDU4CitpbnR4MjQzIHRvaW50ZWdyYWwgICAgLTU1LjMgICAtPiAtNTYKK2ludHgyNDQgdG9pbnRlZ3JhbCAgICAtNTYuMyAgIC0+IC01NworaW50eDI0NSB0b2ludGVncmFsICAgIC01Ny4zICAgLT4gLTU4CisKK3JvdW5kaW5nOiAgICBkb3duCisKK2ludHgyNTAgdG9pbnRlZ3JhbCAgICAgNTUuNyAgIC0+ICA1NQoraW50eDI1MSB0b2ludGVncmFsICAgICA1Ni43ICAgLT4gIDU2CitpbnR4MjUyIHRvaW50ZWdyYWwgICAgIDU3LjcgICAtPiAgNTcKK2ludHgyNTMgdG9pbnRlZ3JhbCAgICAtNTUuNyAgIC0+IC01NQoraW50eDI1NCB0b2ludGVncmFsICAgIC01Ni43ICAgLT4gLTU2CitpbnR4MjU1IHRvaW50ZWdyYWwgICAgLTU3LjcgICAtPiAtNTcKKworcm91bmRpbmc6ICAgIGNlaWxpbmcKKworaW50eDI2MCB0b2ludGVncmFsICAgICA1NS4zICAgLT4gIDU2CitpbnR4MjYxIHRvaW50ZWdyYWwgICAgIDU2LjMgICAtPiAgNTcKK2ludHgyNjIgdG9pbnRlZ3JhbCAgICAgNTcuMyAgIC0+ICA1OAoraW50eDI2MyB0b2ludGVncmFsICAgIC01NS4zICAgLT4gLTU1CitpbnR4MjY0IHRvaW50ZWdyYWwgICAgLTU2LjMgICAtPiAtNTYKK2ludHgyNjUgdG9pbnRlZ3JhbCAgICAtNTcuMyAgIC0+IC01NworCityb3VuZGluZzogICAgZmxvb3IKKworaW50eDI3MCB0b2ludGVncmFsICAgICA1NS43ICAgLT4gIDU1CitpbnR4MjcxIHRvaW50ZWdyYWwgICAgIDU2LjcgICAtPiAgNTYKK2ludHgyNzIgdG9pbnRlZ3JhbCAgICAgNTcuNyAgIC0+ICA1NworaW50eDI3MyB0b2ludGVncmFsICAgIC01NS43ICAgLT4gLTU2CitpbnR4Mjc0IHRvaW50ZWdyYWwgICAgLTU2LjcgICAtPiAtNTcKK2ludHgyNzUgdG9pbnRlZ3JhbCAgICAtNTcuNyAgIC0+IC01OAorCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3RvaW50ZWdyYWx4LmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3RvaW50ZWdyYWx4LmRlY1Rlc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MGUzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEvdG9pbnRlZ3JhbHguZGVjVGVzdApAQCAtMCwwICsxLDI1NSBAQAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSB0b2ludGVncmFseC5kZWNUZXN0IC0tIHJvdW5kIGRlY2ltYWwgdG8gaW50ZWdyYWwgdmFsdWUsIGV4YWN0ICAgICAgLS0KKy0tIENvcHlyaWdodCAoYykgSUJNIENvcnBvcmF0aW9uLCAyMDAxLCAyMDA4LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBQbGVhc2Ugc2VlIHRoZSBkb2N1bWVudCAiR2VuZXJhbCBEZWNpbWFsIEFyaXRobWV0aWMgVGVzdGNhc2VzIiAgICAgLS0KKy0tIGF0IGh0dHA6Ly93d3cyLmh1cnNsZXkuaWJtLmNvbS9kZWNpbWFsIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgICAgICAtLQorLS0gdGhlc2UgdGVzdGNhc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFRoZXNlIHRlc3RjYXNlcyBhcmUgZXhwZXJpbWVudGFsICgnYmV0YScgdmVyc2lvbnMpLCBhbmQgdGhleSAgICAgICAtLQorLS0gbWF5IGNvbnRhaW4gZXJyb3JzLiAgVGhleSBhcmUgb2ZmZXJlZCBvbiBhbiBhcy1pcyBiYXNpcy4gIEluICAgICAgIC0tCistLSBwYXJ0aWN1bGFyLCBhY2hpZXZpbmcgdGhlIHNhbWUgcmVzdWx0cyBhcyB0aGUgdGVzdHMgaGVyZSBpcyBub3QgICAgLS0KKy0tIGEgZ3VhcmFudGVlIHRoYXQgYW4gaW1wbGVtZW50YXRpb24gY29tcGxpZXMgd2l0aCBhbnkgU3RhbmRhcmQgICAgICAtLQorLS0gb3Igc3BlY2lmaWNhdGlvbi4gIFRoZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICAgICAgICAgICAgICAgICAgIC0tCistLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tIFBsZWFzZSBzZW5kIGNvbW1lbnRzLCBzdWdnZXN0aW9ucywgYW5kIGNvcnJlY3Rpb25zIHRvIHRoZSBhdXRob3I6ICAtLQorLS0gICBNaWtlIENvd2xpc2hhdywgSUJNIEZlbGxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLSAgIElCTSBVSywgUE8gQm94IDMxLCBCaXJtaW5naGFtIFJvYWQsIFdhcndpY2sgQ1YzNCA1SkwsIFVLICAgICAgICAgLS0KKy0tICAgbWZjQHVrLmlibS5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2ZXJzaW9uOiAyLjU5CisKKy0tIFRoaXMgc2V0IG9mIHRlc3RzIHRlc3RzIHRoZSBleHRlbmRlZCBzcGVjaWZpY2F0aW9uICdyb3VuZC10by1pbnRlZ3JhbAorLS0gdmFsdWUnIG9wZXJhdGlvbiAoZnJvbSBJRUVFIDg1NCwgbGF0ZXIgbW9kaWZpZWQgaW4gNzU0cikuCistLSBBbGwgbm9uLXplcm8gcmVzdWx0cyBhcmUgZGVmaW5lZCBhcyBiZWluZyB0aG9zZSBmcm9tIGVpdGhlciBjb3B5IG9yCistLSBxdWFudGl6ZSwgc28gdGhvc2UgYXJlIGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHRlc3RlZC4KKworLS0gVGhpcyB0ZXN0cyB0b0ludGVncmFFeGFjdCwgd2hpY2ggbWF5IHNldCBJbmV4YWN0CisKK2V4dGVuZGVkOiAgICAxCitwcmVjaXNpb246ICAgOQorcm91bmRpbmc6ICAgIGhhbGZfdXAKK21heEV4cG9uZW50OiA5OTkKK21pbkV4cG9uZW50OiAtOTk5CisKK2ludHh4MDAxIHRvaW50ZWdyYWx4ICAgICAgMCAgICAgLT4gIDAKK2ludHh4MDAyIHRvaW50ZWdyYWx4ICAgICAgMC4wICAgLT4gIDAKK2ludHh4MDAzIHRvaW50ZWdyYWx4ICAgICAgMC4xICAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAwNCB0b2ludGVncmFseCAgICAgIDAuMiAgIC0+ICAwIEluZXhhY3QgUm91bmRlZAoraW50eHgwMDUgdG9pbnRlZ3JhbHggICAgICAwLjMgICAtPiAgMCBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDA2IHRvaW50ZWdyYWx4ICAgICAgMC40ICAgLT4gIDAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAwNyB0b2ludGVncmFseCAgICAgIDAuNSAgIC0+ICAxIEluZXhhY3QgUm91bmRlZAoraW50eHgwMDggdG9pbnRlZ3JhbHggICAgICAwLjYgICAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDA5IHRvaW50ZWdyYWx4ICAgICAgMC43ICAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAxMCB0b2ludGVncmFseCAgICAgIDAuOCAgIC0+ICAxIEluZXhhY3QgUm91bmRlZAoraW50eHgwMTEgdG9pbnRlZ3JhbHggICAgICAwLjkgICAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDEyIHRvaW50ZWdyYWx4ICAgICAgMSAgICAgLT4gIDEKK2ludHh4MDEzIHRvaW50ZWdyYWx4ICAgICAgMS4wICAgLT4gIDEgUm91bmRlZAoraW50eHgwMTQgdG9pbnRlZ3JhbHggICAgICAxLjEgICAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDE1IHRvaW50ZWdyYWx4ICAgICAgMS4yICAgLT4gIDEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAxNiB0b2ludGVncmFseCAgICAgIDEuMyAgIC0+ICAxIEluZXhhY3QgUm91bmRlZAoraW50eHgwMTcgdG9pbnRlZ3JhbHggICAgICAxLjQgICAtPiAgMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDE4IHRvaW50ZWdyYWx4ICAgICAgMS41ICAgLT4gIDIgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAxOSB0b2ludGVncmFseCAgICAgIDEuNiAgIC0+ICAyIEluZXhhY3QgUm91bmRlZAoraW50eHgwMjAgdG9pbnRlZ3JhbHggICAgICAxLjcgICAtPiAgMiBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDIxIHRvaW50ZWdyYWx4ICAgICAgMS44ICAgLT4gIDIgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAyMiB0b2ludGVncmFseCAgICAgIDEuOSAgIC0+ICAyIEluZXhhY3QgUm91bmRlZAorLS0gbmVnYXRpdmVzCitpbnR4eDAzMSB0b2ludGVncmFseCAgICAgLTAgICAgIC0+IC0wCitpbnR4eDAzMiB0b2ludGVncmFseCAgICAgLTAuMCAgIC0+IC0wCitpbnR4eDAzMyB0b2ludGVncmFseCAgICAgLTAuMSAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAoraW50eHgwMzQgdG9pbnRlZ3JhbHggICAgIC0wLjIgICAtPiAtMCBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDM1IHRvaW50ZWdyYWx4ICAgICAtMC4zICAgLT4gLTAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAzNiB0b2ludGVncmFseCAgICAgLTAuNCAgIC0+IC0wIEluZXhhY3QgUm91bmRlZAoraW50eHgwMzcgdG9pbnRlZ3JhbHggICAgIC0wLjUgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDM4IHRvaW50ZWdyYWx4ICAgICAtMC42ICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDAzOSB0b2ludGVncmFseCAgICAgLTAuNyAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAoraW50eHgwNDAgdG9pbnRlZ3JhbHggICAgIC0wLjggICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDQxIHRvaW50ZWdyYWx4ICAgICAtMC45ICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA0MiB0b2ludGVncmFseCAgICAgLTEgICAgIC0+IC0xCitpbnR4eDA0MyB0b2ludGVncmFseCAgICAgLTEuMCAgIC0+IC0xIFJvdW5kZWQKK2ludHh4MDQ0IHRvaW50ZWdyYWx4ICAgICAtMS4xICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA0NSB0b2ludGVncmFseCAgICAgLTEuMiAgIC0+IC0xIEluZXhhY3QgUm91bmRlZAoraW50eHgwNDYgdG9pbnRlZ3JhbHggICAgIC0xLjMgICAtPiAtMSBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDQ3IHRvaW50ZWdyYWx4ICAgICAtMS40ICAgLT4gLTEgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA0OCB0b2ludGVncmFseCAgICAgLTEuNSAgIC0+IC0yIEluZXhhY3QgUm91bmRlZAoraW50eHgwNDkgdG9pbnRlZ3JhbHggICAgIC0xLjYgICAtPiAtMiBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDUwIHRvaW50ZWdyYWx4ICAgICAtMS43ICAgLT4gLTIgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA1MSB0b2ludGVncmFseCAgICAgLTEuOCAgIC0+IC0yIEluZXhhY3QgUm91bmRlZAoraW50eHgwNTIgdG9pbnRlZ3JhbHggICAgIC0xLjkgICAtPiAtMiBJbmV4YWN0IFJvdW5kZWQKKy0tIG5leHQgdHdvIHdvdWxkIGJlIE5hTiB1c2luZyBxdWFudGl6ZSh4LCAwKQoraW50eHgwNTMgdG9pbnRlZ3JhbHggICAgMTBFKzMwICAtPiAxLjBFKzMxCitpbnR4eDA1NCB0b2ludGVncmFseCAgIC0xMEUrMzAgIC0+IC0xLjBFKzMxCisKKy0tIG51bWJlcnMgYXJvdW5kIHByZWNpc2lvbgorcHJlY2lzaW9uOiA5CitpbnR4eDA2MCB0b2ludGVncmFseCAnNTYyNjdFLTEwJyAgIC0+ICcwJyAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgwNjEgdG9pbnRlZ3JhbHggJzU2MjY3RS01JyAgICAtPiAnMScgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDYyIHRvaW50ZWdyYWx4ICc1NjI2N0UtMicgICAgLT4gJzU2MycgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA2MyB0b2ludGVncmFseCAnNTYyNjdFLTEnICAgIC0+ICc1NjI3JyAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgwNjUgdG9pbnRlZ3JhbHggJzU2MjY3RS0wJyAgICAtPiAnNTYyNjcnCitpbnR4eDA2NiB0b2ludGVncmFseCAnNTYyNjdFKzAnICAgIC0+ICc1NjI2NycKK2ludHh4MDY3IHRvaW50ZWdyYWx4ICc1NjI2N0UrMScgICAgLT4gJzUuNjI2N0UrNScKK2ludHh4MDY4IHRvaW50ZWdyYWx4ICc1NjI2N0UrMicgICAgLT4gJzUuNjI2N0UrNicKK2ludHh4MDY5IHRvaW50ZWdyYWx4ICc1NjI2N0UrMycgICAgLT4gJzUuNjI2N0UrNycKK2ludHh4MDcwIHRvaW50ZWdyYWx4ICc1NjI2N0UrNCcgICAgLT4gJzUuNjI2N0UrOCcKK2ludHh4MDcxIHRvaW50ZWdyYWx4ICc1NjI2N0UrNScgICAgLT4gJzUuNjI2N0UrOScKK2ludHh4MDcyIHRvaW50ZWdyYWx4ICc1NjI2N0UrNicgICAgLT4gJzUuNjI2N0UrMTAnCitpbnR4eDA3MyB0b2ludGVncmFseCAnMS4yM0UrOTYnICAgIC0+ICcxLjIzRSs5NicKK2ludHh4MDc0IHRvaW50ZWdyYWx4ICcxLjIzRSszODQnICAgLT4gJzEuMjNFKzM4NCcKK2ludHh4MDc1IHRvaW50ZWdyYWx4ICcxLjIzRSs5OTknICAgLT4gJzEuMjNFKzk5OScKKworaW50eHgwODAgdG9pbnRlZ3JhbHggJy01NjI2N0UtMTAnICAtPiAnLTAnICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDgxIHRvaW50ZWdyYWx4ICctNTYyNjdFLTUnICAgLT4gJy0xJyAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDA4MiB0b2ludGVncmFseCAnLTU2MjY3RS0yJyAgIC0+ICctNTYzJyAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgwODMgdG9pbnRlZ3JhbHggJy01NjI2N0UtMScgICAtPiAnLTU2MjcnICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MDg1IHRvaW50ZWdyYWx4ICctNTYyNjdFLTAnICAgLT4gJy01NjI2NycKK2ludHh4MDg2IHRvaW50ZWdyYWx4ICctNTYyNjdFKzAnICAgLT4gJy01NjI2NycKK2ludHh4MDg3IHRvaW50ZWdyYWx4ICctNTYyNjdFKzEnICAgLT4gJy01LjYyNjdFKzUnCitpbnR4eDA4OCB0b2ludGVncmFseCAnLTU2MjY3RSsyJyAgIC0+ICctNS42MjY3RSs2JworaW50eHgwODkgdG9pbnRlZ3JhbHggJy01NjI2N0UrMycgICAtPiAnLTUuNjI2N0UrNycKK2ludHh4MDkwIHRvaW50ZWdyYWx4ICctNTYyNjdFKzQnICAgLT4gJy01LjYyNjdFKzgnCitpbnR4eDA5MSB0b2ludGVncmFseCAnLTU2MjY3RSs1JyAgIC0+ICctNS42MjY3RSs5JworaW50eHgwOTIgdG9pbnRlZ3JhbHggJy01NjI2N0UrNicgICAtPiAnLTUuNjI2N0UrMTAnCitpbnR4eDA5MyB0b2ludGVncmFseCAnLTEuMjNFKzk2JyAgIC0+ICctMS4yM0UrOTYnCitpbnR4eDA5NCB0b2ludGVncmFseCAnLTEuMjNFKzM4NCcgIC0+ICctMS4yM0UrMzg0JworaW50eHgwOTUgdG9pbnRlZ3JhbHggJy0xLjIzRSs5OTknICAtPiAnLTEuMjNFKzk5OScKKworLS0gc3Vibm9ybWFsIGlucHV0cworaW50eHgxMDAgdG9pbnRlZ3JhbHggICAgICAgIDFFLTk5OSAtPiAwICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MTAxIHRvaW50ZWdyYWx4ICAgICAgMC4xRS05OTkgLT4gMCAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDEwMiB0b2ludGVncmFseCAgICAgMC4wMUUtOTk5IC0+IDAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgxMDMgdG9pbnRlZ3JhbHggICAgICAgIDBFLTk5OSAtPiAwCisKKy0tIHNwZWNpYWxzIGFuZCB6ZXJvcworaW50eHgxMjAgdG9pbnRlZ3JhbHggJ0luZicgICAgICAgLT4gIEluZmluaXR5CitpbnR4eDEyMSB0b2ludGVncmFseCAnLUluZicgICAgICAtPiAtSW5maW5pdHkKK2ludHh4MTIyIHRvaW50ZWdyYWx4ICAgTmFOICAgICAgIC0+ICBOYU4KK2ludHh4MTIzIHRvaW50ZWdyYWx4ICBzTmFOICAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCitpbnR4eDEyNCB0b2ludGVncmFseCAgICAgMCAgICAgICAtPiAgMAoraW50eHgxMjUgdG9pbnRlZ3JhbHggICAgLTAgICAgICAgLT4gLTAKK2ludHh4MTI2IHRvaW50ZWdyYWx4ICAgICAwLjAwMCAgIC0+ICAwCitpbnR4eDEyNyB0b2ludGVncmFseCAgICAgMC4wMCAgICAtPiAgMAoraW50eHgxMjggdG9pbnRlZ3JhbHggICAgIDAuMCAgICAgLT4gIDAKK2ludHh4MTI5IHRvaW50ZWdyYWx4ICAgICAwICAgICAgIC0+ICAwCitpbnR4eDEzMCB0b2ludGVncmFseCAgICAgMEUtMyAgICAtPiAgMAoraW50eHgxMzEgdG9pbnRlZ3JhbHggICAgIDBFLTIgICAgLT4gIDAKK2ludHh4MTMyIHRvaW50ZWdyYWx4ICAgICAwRS0xICAgIC0+ICAwCitpbnR4eDEzMyB0b2ludGVncmFseCAgICAgMEUtMCAgICAtPiAgMAoraW50eHgxMzQgdG9pbnRlZ3JhbHggICAgIDBFKzEgICAgLT4gIDBFKzEKK2ludHh4MTM1IHRvaW50ZWdyYWx4ICAgICAwRSsyICAgIC0+ICAwRSsyCitpbnR4eDEzNiB0b2ludGVncmFseCAgICAgMEUrMyAgICAtPiAgMEUrMworaW50eHgxMzcgdG9pbnRlZ3JhbHggICAgIDBFKzQgICAgLT4gIDBFKzQKK2ludHh4MTM4IHRvaW50ZWdyYWx4ICAgICAwRSs1ICAgIC0+ICAwRSs1CitpbnR4eDEzOSB0b2ludGVncmFseCAgICAtMC4wMDAgICAtPiAtMAoraW50eHgxNDAgdG9pbnRlZ3JhbHggICAgLTAuMDAgICAgLT4gLTAKK2ludHh4MTQxIHRvaW50ZWdyYWx4ICAgIC0wLjAgICAgIC0+IC0wCitpbnR4eDE0MiB0b2ludGVncmFseCAgICAtMCAgICAgICAtPiAtMAoraW50eHgxNDMgdG9pbnRlZ3JhbHggICAgLTBFLTMgICAgLT4gLTAKK2ludHh4MTQ0IHRvaW50ZWdyYWx4ICAgIC0wRS0yICAgIC0+IC0wCitpbnR4eDE0NSB0b2ludGVncmFseCAgICAtMEUtMSAgICAtPiAtMAoraW50eHgxNDYgdG9pbnRlZ3JhbHggICAgLTBFLTAgICAgLT4gLTAKK2ludHh4MTQ3IHRvaW50ZWdyYWx4ICAgIC0wRSsxICAgIC0+IC0wRSsxCitpbnR4eDE0OCB0b2ludGVncmFseCAgICAtMEUrMiAgICAtPiAtMEUrMgoraW50eHgxNDkgdG9pbnRlZ3JhbHggICAgLTBFKzMgICAgLT4gLTBFKzMKK2ludHh4MTUwIHRvaW50ZWdyYWx4ICAgIC0wRSs0ICAgIC0+IC0wRSs0CitpbnR4eDE1MSB0b2ludGVncmFseCAgICAtMEUrNSAgICAtPiAtMEUrNQorLS0gcHJvcGFnYXRpbmcgTmFOcworaW50eHgxNTIgdG9pbnRlZ3JhbHggICBOYU44MDggICAgLT4gIE5hTjgwOAoraW50eHgxNTMgdG9pbnRlZ3JhbHggIHNOYU4wODAgICAgLT4gIE5hTjgwICBJbnZhbGlkX29wZXJhdGlvbgoraW50eHgxNTQgdG9pbnRlZ3JhbHggIC1OYU44MDggICAgLT4gLU5hTjgwOAoraW50eHgxNTUgdG9pbnRlZ3JhbHggLXNOYU4wODAgICAgLT4gLU5hTjgwICBJbnZhbGlkX29wZXJhdGlvbgoraW50eHgxNTYgdG9pbnRlZ3JhbHggIC1OYU4gICAgICAgLT4gLU5hTgoraW50eHgxNTcgdG9pbnRlZ3JhbHggLXNOYU4gICAgICAgLT4gLU5hTiAgICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBleGFtcGxlcworcm91bmRpbmc6ICAgIGhhbGZfdXAKK3ByZWNpc2lvbjogICA5CitpbnR4eDIwMCB0b2ludGVncmFseCAgICAgMi4xICAgIC0+IDIgICAgICAgICAgICAgICAgICAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMDEgdG9pbnRlZ3JhbHggICAxMDAgICAgICAtPiAxMDAKK2ludHh4MjAyIHRvaW50ZWdyYWx4ICAgMTAwLjAgICAgLT4gMTAwICAgICAgICAgICAgICAgICAgUm91bmRlZAoraW50eHgyMDMgdG9pbnRlZ3JhbHggICAxMDEuNSAgICAtPiAxMDIgICAgICAgICAgICAgICAgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjA0IHRvaW50ZWdyYWx4ICAtMTAxLjUgICAgLT4gLTEwMiAgICAgICAgICAgICAgICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIwNSB0b2ludGVncmFseCAgIDEwRSs1ICAgIC0+IDEuMEUrNgoraW50eHgyMDYgdG9pbnRlZ3JhbHggIDcuODlFKzc3ICAtPiA3Ljg5RSs3NworaW50eHgyMDcgdG9pbnRlZ3JhbHggICAtSW5mICAgICAtPiAtSW5maW5pdHkKKworCistLSBhbGwgcm91bmRpbmcgbW9kZXMKK3JvdW5kaW5nOiAgICBoYWxmX2V2ZW4KKworaW50eHgyMTAgdG9pbnRlZ3JhbHggICAgIDU1LjUgICAtPiAgNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjExIHRvaW50ZWdyYWx4ICAgICA1Ni41ICAgLT4gIDU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIxMiB0b2ludGVncmFseCAgICAgNTcuNSAgIC0+ICA1OCAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMTMgdG9pbnRlZ3JhbHggICAgLTU1LjUgICAtPiAtNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjE0IHRvaW50ZWdyYWx4ICAgIC01Ni41ICAgLT4gLTU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIxNSB0b2ludGVncmFseCAgICAtNTcuNSAgIC0+IC01OCAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgaGFsZl91cAorCitpbnR4eDIyMCB0b2ludGVncmFseCAgICAgNTUuNSAgIC0+ICA1NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMjEgdG9pbnRlZ3JhbHggICAgIDU2LjUgICAtPiAgNTcgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjIyIHRvaW50ZWdyYWx4ICAgICA1Ny41ICAgLT4gIDU4ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIyMyB0b2ludGVncmFseCAgICAtNTUuNSAgIC0+IC01NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMjQgdG9pbnRlZ3JhbHggICAgLTU2LjUgICAtPiAtNTcgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjI1IHRvaW50ZWdyYWx4ICAgIC01Ny41ICAgLT4gLTU4ICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBoYWxmX2Rvd24KKworaW50eHgyMzAgdG9pbnRlZ3JhbHggICAgIDU1LjUgICAtPiAgNTUgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjMxIHRvaW50ZWdyYWx4ICAgICA1Ni41ICAgLT4gIDU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIzMiB0b2ludGVncmFseCAgICAgNTcuNSAgIC0+ICA1NyAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyMzMgdG9pbnRlZ3JhbHggICAgLTU1LjUgICAtPiAtNTUgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjM0IHRvaW50ZWdyYWx4ICAgIC01Ni41ICAgLT4gLTU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDIzNSB0b2ludGVncmFseCAgICAtNTcuNSAgIC0+IC01NyAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgdXAKKworaW50eHgyNDAgdG9pbnRlZ3JhbHggICAgIDU1LjMgICAtPiAgNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjQxIHRvaW50ZWdyYWx4ICAgICA1Ni4zICAgLT4gIDU3ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI0MiB0b2ludGVncmFseCAgICAgNTcuMyAgIC0+ICA1OCAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNDMgdG9pbnRlZ3JhbHggICAgLTU1LjMgICAtPiAtNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjQ0IHRvaW50ZWdyYWx4ICAgIC01Ni4zICAgLT4gLTU3ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI0NSB0b2ludGVncmFseCAgICAtNTcuMyAgIC0+IC01OCAgIEluZXhhY3QgUm91bmRlZAorCityb3VuZGluZzogICAgZG93bgorCitpbnR4eDI1MCB0b2ludGVncmFseCAgICAgNTUuNyAgIC0+ICA1NSAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNTEgdG9pbnRlZ3JhbHggICAgIDU2LjcgICAtPiAgNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjUyIHRvaW50ZWdyYWx4ICAgICA1Ny43ICAgLT4gIDU3ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI1MyB0b2ludGVncmFseCAgICAtNTUuNyAgIC0+IC01NSAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNTQgdG9pbnRlZ3JhbHggICAgLTU2LjcgICAtPiAtNTYgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjU1IHRvaW50ZWdyYWx4ICAgIC01Ny43ICAgLT4gLTU3ICAgSW5leGFjdCBSb3VuZGVkCisKK3JvdW5kaW5nOiAgICBjZWlsaW5nCisKK2ludHh4MjYwIHRvaW50ZWdyYWx4ICAgICA1NS4zICAgLT4gIDU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI2MSB0b2ludGVncmFseCAgICAgNTYuMyAgIC0+ICA1NyAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNjIgdG9pbnRlZ3JhbHggICAgIDU3LjMgICAtPiAgNTggICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjYzIHRvaW50ZWdyYWx4ICAgIC01NS4zICAgLT4gLTU1ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI2NCB0b2ludGVncmFseCAgICAtNTYuMyAgIC0+IC01NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNjUgdG9pbnRlZ3JhbHggICAgLTU3LjMgICAtPiAtNTcgICBJbmV4YWN0IFJvdW5kZWQKKworcm91bmRpbmc6ICAgIGZsb29yCisKK2ludHh4MjcwIHRvaW50ZWdyYWx4ICAgICA1NS43ICAgLT4gIDU1ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI3MSB0b2ludGVncmFseCAgICAgNTYuNyAgIC0+ICA1NiAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNzIgdG9pbnRlZ3JhbHggICAgIDU3LjcgICAtPiAgNTcgICBJbmV4YWN0IFJvdW5kZWQKK2ludHh4MjczIHRvaW50ZWdyYWx4ICAgIC01NS43ICAgLT4gLTU2ICAgSW5leGFjdCBSb3VuZGVkCitpbnR4eDI3NCB0b2ludGVncmFseCAgICAtNTYuNyAgIC0+IC01NyAgIEluZXhhY3QgUm91bmRlZAoraW50eHgyNzUgdG9pbnRlZ3JhbHggICAgLTU3LjcgICAtPiAtNTggICBJbmV4YWN0IFJvdW5kZWQKKworLS0gSW50IGFuZCB1SW50MzIgZWRnZSB2YWx1ZXMgZm9yIHRlc3RpbmcgY29udmVyc2lvbnMKK3ByZWNpc2lvbjogMTYKK2ludHh4MzAwIHRvaW50ZWdyYWx4IC0yMTQ3NDgzNjQ2ICAtPiAtMjE0NzQ4MzY0NgoraW50eHgzMDEgdG9pbnRlZ3JhbHggLTIxNDc0ODM2NDcgIC0+IC0yMTQ3NDgzNjQ3CitpbnR4eDMwMiB0b2ludGVncmFseCAtMjE0NzQ4MzY0OCAgLT4gLTIxNDc0ODM2NDgKK2ludHh4MzAzIHRvaW50ZWdyYWx4IC0yMTQ3NDgzNjQ5ICAtPiAtMjE0NzQ4MzY0OQoraW50eHgzMDQgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDYgIC0+ICAyMTQ3NDgzNjQ2CitpbnR4eDMwNSB0b2ludGVncmFseCAgMjE0NzQ4MzY0NyAgLT4gIDIxNDc0ODM2NDcKK2ludHh4MzA2IHRvaW50ZWdyYWx4ICAyMTQ3NDgzNjQ4ICAtPiAgMjE0NzQ4MzY0OAoraW50eHgzMDcgdG9pbnRlZ3JhbHggIDIxNDc0ODM2NDkgIC0+ICAyMTQ3NDgzNjQ5CitpbnR4eDMwOCB0b2ludGVncmFseCAgNDI5NDk2NzI5NCAgLT4gIDQyOTQ5NjcyOTQKK2ludHh4MzA5IHRvaW50ZWdyYWx4ICA0Mjk0OTY3Mjk1ICAtPiAgNDI5NDk2NzI5NQoraW50eHgzMTAgdG9pbnRlZ3JhbHggIDQyOTQ5NjcyOTYgIC0+ICA0Mjk0OTY3Mjk2CitpbnR4eDMxMSB0b2ludGVncmFseCAgNDI5NDk2NzI5NyAgLT4gIDQyOTQ5NjcyOTcKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kZWNpbWFsdGVzdGRhdGEveG9yLmRlY1Rlc3QgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3hvci5kZWNUZXN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMjk3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZGVjaW1hbHRlc3RkYXRhL3hvci5kZWNUZXN0CkBAIC0wLDAgKzEsMzM1IEBACistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIHhvci5kZWNUZXN0IC0tIGRpZ2l0d2lzZSBsb2dpY2FsIFhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24sIDE5ODEsIDIwMDguICBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIFBsZWFzZSBzZWUgdGhlIGRvY3VtZW50ICJHZW5lcmFsIERlY2ltYWwgQXJpdGhtZXRpYyBUZXN0Y2FzZXMiICAgICAtLQorLS0gYXQgaHR0cDovL3d3dzIuaHVyc2xleS5pYm0uY29tL2RlY2ltYWwgZm9yIHRoZSBkZXNjcmlwdGlvbiBvZiAgICAgIC0tCistLSB0aGVzZSB0ZXN0Y2FzZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gVGhlc2UgdGVzdGNhc2VzIGFyZSBleHBlcmltZW50YWwgKCdiZXRhJyB2ZXJzaW9ucyksIGFuZCB0aGV5ICAgICAgIC0tCistLSBtYXkgY29udGFpbiBlcnJvcnMuICBUaGV5IGFyZSBvZmZlcmVkIG9uIGFuIGFzLWlzIGJhc2lzLiAgSW4gICAgICAgLS0KKy0tIHBhcnRpY3VsYXIsIGFjaGlldmluZyB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSB0ZXN0cyBoZXJlIGlzIG5vdCAgICAtLQorLS0gYSBndWFyYW50ZWUgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjb21wbGllcyB3aXRoIGFueSBTdGFuZGFyZCAgICAgIC0tCistLSBvciBzcGVjaWZpY2F0aW9uLiAgVGhlIHRlc3RzIGFyZSBub3QgZXhoYXVzdGl2ZS4gICAgICAgICAgICAgICAgICAgLS0KKy0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLQorLS0gUGxlYXNlIHNlbmQgY29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgY29ycmVjdGlvbnMgdG8gdGhlIGF1dGhvcjogIC0tCistLSAgIE1pa2UgQ293bGlzaGF3LCBJQk0gRmVsbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0KKy0tICAgSUJNIFVLLCBQTyBCb3ggMzEsIEJpcm1pbmdoYW0gUm9hZCwgV2Fyd2ljayBDVjM0IDVKTCwgVUsgICAgICAgICAtLQorLS0gICBtZmNAdWsuaWJtLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZlcnNpb246IDIuNTkKKworZXh0ZW5kZWQ6ICAgIDEKK3ByZWNpc2lvbjogICA5Cityb3VuZGluZzogICAgaGFsZl91cAorbWF4RXhwb25lbnQ6IDk5OQorbWluRXhwb25lbnQ6IC05OTkKKworLS0gU2FuaXR5IGNoZWNrICh0cnV0aCB0YWJsZSkKK3hvcngwMDEgeG9yICAgICAgICAgICAgIDAgICAgMCAtPiAgICAwCit4b3J4MDAyIHhvciAgICAgICAgICAgICAwICAgIDEgLT4gICAgMQoreG9yeDAwMyB4b3IgICAgICAgICAgICAgMSAgICAwIC0+ICAgIDEKK3hvcngwMDQgeG9yICAgICAgICAgICAgIDEgICAgMSAtPiAgICAwCit4b3J4MDA1IHhvciAgICAgICAgICAxMTAwIDEwMTAgLT4gIDExMAoreG9yeDAwNiB4b3IgICAgICAgICAgMTExMSAgIDEwIC0+IDExMDEKKy0tIGFuZCBhdCBtc2QgYW5kIG1zZC0xCit4b3J4MDEwIHhvciAwMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCit4b3J4MDExIHhvciAwMDAwMDAwMDAgMTAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwCit4b3J4MDEyIHhvciAxMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgMTAwMDAwMDAwCit4b3J4MDEzIHhvciAxMDAwMDAwMDAgMTAwMDAwMDAwIC0+ICAgICAgICAgICAwCit4b3J4MDE0IHhvciAwMDAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgICAgICAgICAwCit4b3J4MDE1IHhvciAwMDAwMDAwMDAgMDEwMDAwMDAwIC0+ICAgIDEwMDAwMDAwCit4b3J4MDE2IHhvciAwMTAwMDAwMDAgMDAwMDAwMDAwIC0+ICAgIDEwMDAwMDAwCit4b3J4MDE3IHhvciAwMTAwMDAwMDAgMDEwMDAwMDAwIC0+ICAgICAgICAgICAwCisKKy0tIFZhcmlvdXMgbGVuZ3RocworLS0gICAgICAgIDEyMzQ1Njc4OSAgICAgMTIzNDU2Nzg5ICAgICAgMTIzNDU2Nzg5Cit4b3J4MDIxIHhvciAxMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gIDAKK3hvcngwMjIgeG9yIDExMTExMTExMTExMSAgMTExMTExMTExICAtPiAgMAoreG9yeDAyMyB4b3IgIDExMTExMTExICAgICAgMTExMTExMTEgIC0+ICAwCit4b3J4MDI1IHhvciAgIDExMTExMTEgICAgICAgMTExMTExMSAgLT4gIDAKK3hvcngwMjYgeG9yICAgIDExMTExMSAgICAgICAgMTExMTExICAtPiAgMAoreG9yeDAyNyB4b3IgICAgIDExMTExICAgICAgICAgMTExMTEgIC0+ICAwCit4b3J4MDI4IHhvciAgICAgIDExMTEgICAgICAgICAgMTExMSAgLT4gIDAKK3hvcngwMjkgeG9yICAgICAgIDExMSAgICAgICAgICAgMTExICAtPiAgMAoreG9yeDAzMSB4b3IgICAgICAgIDExICAgICAgICAgICAgMTEgIC0+ICAwCit4b3J4MDMyIHhvciAgICAgICAgIDEgICAgICAgICAgICAgMSAgLT4gIDAKK3hvcngwMzMgeG9yIDExMTExMTExMTExMSAxMTExMTExMTExICAtPiAgMAoreG9yeDAzNCB4b3IgMTExMTExMTExMTEgMTExMTExMTExMTEgIC0+ICAwCit4b3J4MDM1IHhvciAxMTExMTExMTExIDExMTExMTExMTExMSAgLT4gIDAKK3hvcngwMzYgeG9yIDExMTExMTExMSAxMTExMTExMTExMTExICAtPiAgMAorCit4b3J4MDQwIHhvciAxMTExMTExMTEgIDExMTExMTExMTExMSAgLT4gIDAKK3hvcngwNDEgeG9yICAxMTExMTExMSAgMTExMTExMTExMTExICAtPiAgMTAwMDAwMDAwCit4b3J4MDQyIHhvciAgMTExMTExMTEgICAgIDExMTExMTExMSAgLT4gIDEwMDAwMDAwMAoreG9yeDA0MyB4b3IgICAxMTExMTExICAgICAxMDAwMDAwMTAgIC0+ICAxMDExMTExMDEKK3hvcngwNDQgeG9yICAgIDExMTExMSAgICAgMTAwMDAwMTAwICAtPiAgMTAwMTExMDExCit4b3J4MDQ1IHhvciAgICAgMTExMTEgICAgIDEwMDAwMTAwMCAgLT4gIDEwMDAxMDExMQoreG9yeDA0NiB4b3IgICAgICAxMTExICAgICAxMDAwMTAwMDAgIC0+ICAxMDAwMTExMTEKK3hvcngwNDcgeG9yICAgICAgIDExMSAgICAgMTAwMTAwMDAwICAtPiAgMTAwMTAwMTExCit4b3J4MDQ4IHhvciAgICAgICAgMTEgICAgIDEwMTAwMDAwMCAgLT4gIDEwMTAwMDAxMQoreG9yeDA0OSB4b3IgICAgICAgICAxICAgICAxMTAwMDAwMDAgIC0+ICAxMTAwMDAwMDEKKworeG9yeDA1MCB4b3IgMTExMTExMTExMSAgMSAgLT4gIDExMTExMTExMAoreG9yeDA1MSB4b3IgIDExMTExMTExMSAgMSAgLT4gIDExMTExMTExMAoreG9yeDA1MiB4b3IgICAxMTExMTExMSAgMSAgLT4gIDExMTExMTEwCit4b3J4MDUzIHhvciAgICAxMTExMTExICAxICAtPiAgMTExMTExMAoreG9yeDA1NCB4b3IgICAgIDExMTExMSAgMSAgLT4gIDExMTExMAoreG9yeDA1NSB4b3IgICAgICAxMTExMSAgMSAgLT4gIDExMTEwCit4b3J4MDU2IHhvciAgICAgICAxMTExICAxICAtPiAgMTExMAoreG9yeDA1NyB4b3IgICAgICAgIDExMSAgMSAgLT4gIDExMAoreG9yeDA1OCB4b3IgICAgICAgICAxMSAgMSAgLT4gIDEwCit4b3J4MDU5IHhvciAgICAgICAgICAxICAxICAtPiAgMAorCit4b3J4MDYwIHhvciAxMTExMTExMTExICAwICAtPiAgMTExMTExMTExCit4b3J4MDYxIHhvciAgMTExMTExMTExICAwICAtPiAgMTExMTExMTExCit4b3J4MDYyIHhvciAgIDExMTExMTExICAwICAtPiAgMTExMTExMTEKK3hvcngwNjMgeG9yICAgIDExMTExMTEgIDAgIC0+ICAxMTExMTExCit4b3J4MDY0IHhvciAgICAgMTExMTExICAwICAtPiAgMTExMTExCit4b3J4MDY1IHhvciAgICAgIDExMTExICAwICAtPiAgMTExMTEKK3hvcngwNjYgeG9yICAgICAgIDExMTEgIDAgIC0+ICAxMTExCit4b3J4MDY3IHhvciAgICAgICAgMTExICAwICAtPiAgMTExCit4b3J4MDY4IHhvciAgICAgICAgIDExICAwICAtPiAgMTEKK3hvcngwNjkgeG9yICAgICAgICAgIDEgIDAgIC0+ICAxCisKK3hvcngwNzAgeG9yIDEgIDExMTExMTExMTEgIC0+ICAxMTExMTExMTAKK3hvcngwNzEgeG9yIDEgICAxMTExMTExMTEgIC0+ICAxMTExMTExMTAKK3hvcngwNzIgeG9yIDEgICAgMTExMTExMTEgIC0+ICAxMTExMTExMAoreG9yeDA3MyB4b3IgMSAgICAgMTExMTExMSAgLT4gIDExMTExMTAKK3hvcngwNzQgeG9yIDEgICAgICAxMTExMTEgIC0+ICAxMTExMTAKK3hvcngwNzUgeG9yIDEgICAgICAgMTExMTEgIC0+ICAxMTExMAoreG9yeDA3NiB4b3IgMSAgICAgICAgMTExMSAgLT4gIDExMTAKK3hvcngwNzcgeG9yIDEgICAgICAgICAxMTEgIC0+ICAxMTAKK3hvcngwNzggeG9yIDEgICAgICAgICAgMTEgIC0+ICAxMAoreG9yeDA3OSB4b3IgMSAgICAgICAgICAgMSAgLT4gIDAKKworeG9yeDA4MCB4b3IgMCAgMTExMTExMTExMSAgLT4gIDExMTExMTExMQoreG9yeDA4MSB4b3IgMCAgIDExMTExMTExMSAgLT4gIDExMTExMTExMQoreG9yeDA4MiB4b3IgMCAgICAxMTExMTExMSAgLT4gIDExMTExMTExCit4b3J4MDgzIHhvciAwICAgICAxMTExMTExICAtPiAgMTExMTExMQoreG9yeDA4NCB4b3IgMCAgICAgIDExMTExMSAgLT4gIDExMTExMQoreG9yeDA4NSB4b3IgMCAgICAgICAxMTExMSAgLT4gIDExMTExCit4b3J4MDg2IHhvciAwICAgICAgICAxMTExICAtPiAgMTExMQoreG9yeDA4NyB4b3IgMCAgICAgICAgIDExMSAgLT4gIDExMQoreG9yeDA4OCB4b3IgMCAgICAgICAgICAxMSAgLT4gIDExCit4b3J4MDg5IHhvciAwICAgICAgICAgICAxICAtPiAgMQorCit4b3J4MDkwIHhvciAwMTExMTExMTEgIDExMTEwMTExMSAgLT4gIDEwMDAxMDAwMAoreG9yeDA5MSB4b3IgMTAxMTExMTExICAxMTExMDExMTEgIC0+ICAgMTAwMTAwMDAKK3hvcngwOTIgeG9yIDExMDExMTExMSAgMTExMTAxMTExICAtPiAgICAxMDEwMDAwCit4b3J4MDkzIHhvciAxMTEwMTExMTEgIDExMTEwMTExMSAgLT4gICAgIDExMDAwMAoreG9yeDA5NCB4b3IgMTExMTAxMTExICAxMTExMDExMTEgIC0+ICAgICAgICAgIDAKK3hvcngwOTUgeG9yIDExMTExMDExMSAgMTExMTAxMTExICAtPiAgICAgIDExMDAwCit4b3J4MDk2IHhvciAxMTExMTEwMTEgIDExMTEwMTExMSAgLT4gICAgICAxMDEwMAoreG9yeDA5NyB4b3IgMTExMTExMTAxICAxMTExMDExMTEgIC0+ICAgICAgMTAwMTAKK3hvcngwOTggeG9yIDExMTExMTExMCAgMTExMTAxMTExICAtPiAgICAgIDEwMDAxCisKK3hvcngxMDAgeG9yIDExMTEwMTExMSAgMDExMTExMTExICAtPiAgMTAwMDEwMDAwCit4b3J4MTAxIHhvciAxMTExMDExMTEgIDEwMTExMTExMSAgLT4gICAxMDAxMDAwMAoreG9yeDEwMiB4b3IgMTExMTAxMTExICAxMTAxMTExMTEgIC0+ICAgIDEwMTAwMDAKK3hvcngxMDMgeG9yIDExMTEwMTExMSAgMTExMDExMTExICAtPiAgICAgMTEwMDAwCit4b3J4MTA0IHhvciAxMTExMDExMTEgIDExMTEwMTExMSAgLT4gICAgICAgICAgMAoreG9yeDEwNSB4b3IgMTExMTAxMTExICAxMTExMTAxMTEgIC0+ICAgICAgMTEwMDAKK3hvcngxMDYgeG9yIDExMTEwMTExMSAgMTExMTExMDExICAtPiAgICAgIDEwMTAwCit4b3J4MTA3IHhvciAxMTExMDExMTEgIDExMTExMTEwMSAgLT4gICAgICAxMDAxMAoreG9yeDEwOCB4b3IgMTExMTAxMTExICAxMTExMTExMTAgIC0+ICAgICAgMTAwMDEKKworLS0gbm9uLTAvMSBzaG91bGQgbm90IGJlIGFjY2VwdGVkLCBub3Igc2hvdWxkIHNpZ25zCit4b3J4MjIwIHhvciAxMTExMTExMTIgIDExMTExMTExMSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIyMSB4b3IgMzMzMzMzMzMzICAzMzMzMzMzMzMgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMjIgeG9yIDU1NTU1NTU1NSAgNTU1NTU1NTU1ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjIzIHhvciA3Nzc3Nzc3NzcgIDc3Nzc3Nzc3NyAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIyNCB4b3IgOTk5OTk5OTk5ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMjUgeG9yIDIyMjIyMjIyMiAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjI2IHhvciA0NDQ0NDQ0NDQgIDk5OTk5OTk5OSAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIyNyB4b3IgNjY2NjY2NjY2ICA5OTk5OTk5OTkgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMjggeG9yIDg4ODg4ODg4OCAgOTk5OTk5OTk5ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjI5IHhvciA5OTk5OTk5OTkgIDIyMjIyMjIyMiAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDIzMCB4b3IgOTk5OTk5OTk5ICA0NDQ0NDQ0NDQgIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyMzEgeG9yIDk5OTk5OTk5OSAgNjY2NjY2NjY2ICAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjMyIHhvciA5OTk5OTk5OTkgIDg4ODg4ODg4OCAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gYSBmZXcgcmFuZG9tcworeG9yeDI0MCB4b3IgIDU2NzQ2ODY4OSAtOTM0OTgxOTQyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyNDEgeG9yICA1NjczNjc2ODkgIDkzNDk4MTk0MiAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjQyIHhvciAtNjMxOTE3NzcyIC03MDYwMTQ2MzQgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI0MyB4b3IgLTc1NjI1MzI1NyAgMTM4NTc5MjM0IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyNDQgeG9yICA4MzU1OTAxNDkgIDU2NzQzNTQwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSB0ZXN0IE1TRAoreG9yeDI1MCB4b3IgIDIwMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1MSB4b3IgIDcwMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1MiB4b3IgIDgwMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1MyB4b3IgIDkwMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1NCB4b3IgIDIwMDAwMDAwMCAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1NSB4b3IgIDcwMDAwMDAwMCAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1NiB4b3IgIDgwMDAwMDAwMCAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1NyB4b3IgIDkwMDAwMDAwMCAwMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1OCB4b3IgIDEwMDAwMDAwMCAyMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI1OSB4b3IgIDEwMDAwMDAwMCA3MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI2MCB4b3IgIDEwMDAwMDAwMCA4MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI2MSB4b3IgIDEwMDAwMDAwMCA5MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI2MiB4b3IgIDAwMDAwMDAwMCAyMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI2MyB4b3IgIDAwMDAwMDAwMCA3MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI2NCB4b3IgIDAwMDAwMDAwMCA4MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI2NSB4b3IgIDAwMDAwMDAwMCA5MDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBNU0QtMQoreG9yeDI3MCB4b3IgIDAyMDAwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI3MSB4b3IgIDA3MDEwMDAwMCAxMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI3MiB4b3IgIDA4MDAxMDAwMCAxMDAwMDAwMDEgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI3MyB4b3IgIDA5MDAwMTAwMCAxMDAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI3NCB4b3IgIDEwMDAwMDEwMCAwMjAwMTAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI3NSB4b3IgIDEwMDAwMDAwMCAwNzAwMDEwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI3NiB4b3IgIDEwMDAwMDAxMCAwODAwMTAxMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI3NyB4b3IgIDEwMDAwMDAwMCAwOTAwMDAwMTAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgorLS0gdGVzdCBMU0QKK3hvcngyODAgeG9yICAwMDEwMDAwMDIgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODEgeG9yICAwMDAwMDAwMDcgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODIgeG9yICAwMDAwMDAwMDggMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODMgeG9yICAwMDAwMDAwMDkgMTAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODQgeG9yICAxMDAwMDAwMDAgMDAwMTAwMDAyIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODUgeG9yICAxMDAxMDAwMDAgMDAxMDAwMDA3IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODYgeG9yICAxMDAwMTAwMDAgMDEwMDAwMDA4IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyODcgeG9yICAxMDAwMDEwMDAgMTAwMDAwMDA5IC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KKy0tIHRlc3QgTWlkZGllCit4b3J4Mjg4IHhvciAgMDAxMDIwMDAwIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjg5IHhvciAgMDAwMDcwMDAxIDEwMDAwMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjkwIHhvciAgMDAwMDgwMDAwIDEwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjkxIHhvciAgMDAwMDkwMDAwIDEwMDAwMTAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjkyIHhvciAgMTAwMDAwMDEwIDAwMDAyMDEwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MjkzIHhvciAgMTAwMTAwMDAwIDAwMDA3MDAxMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjk0IHhvciAgMTAwMDEwMTAwIDAwMDA4MDAwMSAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjk1IHhvciAgMTAwMDAxMDAwIDAwMDA5MDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCistLSBzaWducworeG9yeDI5NiB4b3IgLTEwMDAwMTAwMCAtMDAwMDAwMDAwIC0+ICBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngyOTcgeG9yIC0xMDAwMDEwMDAgIDAwMDAxMDAwMCAtPiAgTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mjk4IHhvciAgMTAwMDAxMDAwIC0wMDAwMDAwMDAgLT4gIE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDI5OSB4b3IgIDEwMDAwMTAwMCAgMDAwMDExMDAwIC0+ICAxMDAwMTAwMDAKKworLS0gTm1heCwgTm1pbiwgTnRpbnkKK3hvcngzMzEgeG9yICAyICAgOS45OTk5OTk5OUUrOTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzMzIgeG9yICAzICAgMUUtOTk5ICAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzMzMgeG9yICA0ICAgMS4wMDAwMDAwMEUtOTk5ICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzMzQgeG9yICA1ICAgMUUtMTAwNyAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzMzUgeG9yICA2ICAgLTFFLTEwMDcgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzMzYgeG9yICA3ICAgLTEuMDAwMDAwMDBFLTk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzMzcgeG9yICA4ICAgLTFFLTk5OSAgICAgICAgICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzMzggeG9yICA5ICAgLTkuOTk5OTk5OTlFKzk5OSAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDEgeG9yICA5Ljk5OTk5OTk5RSs5OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDIgeG9yICAxRS05OTkgICAgICAgICAgICAgICAwMSAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDMgeG9yICAxLjAwMDAwMDAwRS05OTkgICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDQgeG9yICAxRS0xMDA3ICAgICAgICAgICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDUgeG9yICAtMUUtMTAwNyAgICAgICAgICAgIC0xMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDYgeG9yICAtMS4wMDAwMDAwMEUtOTk5ICAgICAxOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDcgeG9yICAtMUUtOTk5ICAgICAgICAgICAgICAxMCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcngzNDggeG9yICAtOS45OTk5OTk5OUUrOTk5ICAgIC0xOCAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworLS0gQSBmZXcgb3RoZXIgbm9uLWludGVnZXJzCit4b3J4MzYxIHhvciAgMS4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzYyIHhvciAgMUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzYzIHhvciAgMC4wICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzY0IHhvciAgMEUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzY1IHhvciAgOS45ICAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzY2IHhvciAgOUUrMSAgICAgICAgICAgICAgICAgMSAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzcxIHhvciAgMCAxLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzcyIHhvciAgMCAxRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4MzczIHhvciAgMCAwLjAgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mzc0IHhvciAgMCAwRSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mzc1IHhvciAgMCA5LjkgICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4Mzc2IHhvciAgMCA5RSsxICAgICAgICAgICAgICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKKy0tIEFsbCBTcGVjaWFscyBhcmUgaW4gZXJyb3IKK3hvcng3ODAgeG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODEgeG9yIC1JbmYgIC0xMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODIgeG9yIC1JbmYgIC0xICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODMgeG9yIC1JbmYgIC0wICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODQgeG9yIC1JbmYgICAwICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODUgeG9yIC1JbmYgICAxICAgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODYgeG9yIC1JbmYgICAxMDAwICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODcgeG9yIC0xMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODggeG9yIC1JbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3ODkgeG9yIC0xICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3OTAgeG9yIC0wICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3OTEgeG9yICAwICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3OTIgeG9yICAxICAgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3OTMgeG9yICAxMDAwIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KK3hvcng3OTQgeG9yICBJbmYgIC1JbmYgICAtPiBOYU4gSW52YWxpZF9vcGVyYXRpb24KKworeG9yeDgwMCB4b3IgIEluZiAgLUluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwMSB4b3IgIEluZiAgLTEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwMiB4b3IgIEluZiAgLTEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwMyB4b3IgIEluZiAgLTAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwNCB4b3IgIEluZiAgIDAgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwNSB4b3IgIEluZiAgIDEgICAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwNiB4b3IgIEluZiAgIDEwMDAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwNyB4b3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwOCB4b3IgLTEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgwOSB4b3IgLUluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgxMCB4b3IgLTEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgxMSB4b3IgLTAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgxMiB4b3IgIDAgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgxMyB4b3IgIDEgICAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgxNCB4b3IgIDEwMDAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDgxNSB4b3IgIEluZiAgIEluZiAgIC0+IE5hTiBJbnZhbGlkX29wZXJhdGlvbgorCit4b3J4ODIxIHhvciAgTmFOIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODIyIHhvciAgTmFOIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODIzIHhvciAgTmFOIC0xICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODI0IHhvciAgTmFOIC0wICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODI1IHhvciAgTmFOICAwICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODI2IHhvciAgTmFOICAxICAgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODI3IHhvciAgTmFOICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODI4IHhvciAgTmFOICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODI5IHhvciAgTmFOICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODMwIHhvciAtSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODMxIHhvciAtMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODMyIHhvciAtMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODMzIHhvciAtMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODM0IHhvciAgMCAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODM1IHhvciAgMSAgICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODM2IHhvciAgMTAwMCBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODM3IHhvciAgSW5mICBOYU4gICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCisKK3hvcng4NDEgeG9yICBzTmFOIC1JbmYgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg0MiB4b3IgIHNOYU4gLTEwMDAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODQzIHhvciAgc05hTiAtMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NDQgeG9yICBzTmFOIC0wICAgICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg0NSB4b3IgIHNOYU4gIDAgICAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODQ2IHhvciAgc05hTiAgMSAgICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NDcgeG9yICBzTmFOICAxMDAwICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg0OCB4b3IgIHNOYU4gIE5hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODQ5IHhvciAgc05hTiBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NTAgeG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg1MSB4b3IgLUluZiAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODUyIHhvciAtMTAwMCBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NTMgeG9yIC0xICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg1NCB4b3IgLTAgICAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODU1IHhvciAgMCAgICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NTYgeG9yICAxICAgIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgoreG9yeDg1NyB4b3IgIDEwMDAgc05hTiAgIC0+ICBOYU4gIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODU4IHhvciAgSW5mICBzTmFOICAgLT4gIE5hTiAgSW52YWxpZF9vcGVyYXRpb24KK3hvcng4NTkgeG9yICBOYU4gIHNOYU4gICAtPiAgTmFOICBJbnZhbGlkX29wZXJhdGlvbgorCistLSBwcm9wYWdhdGluZyBOYU5zCit4b3J4ODYxIHhvciAgTmFOMSAgIC1JbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODYyIHhvciArTmFOMiAgIC0xMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODYzIHhvciAgTmFOMyAgICAxMDAwICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODY0IHhvciAgTmFONCAgICBJbmYgICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODY1IHhvciAgTmFONSAgICtOYU42ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODY2IHhvciAtSW5mICAgICBOYU43ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODY3IHhvciAtMTAwMCAgICBOYU44ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODY4IHhvciAgMTAwMCAgICBOYU45ICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODY5IHhvciAgSW5mICAgICtOYU4xMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODcxIHhvciAgc05hTjExICAtSW5mICAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODcyIHhvciAgc05hTjEyICAtMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODczIHhvciAgc05hTjEzICAgMTAwMCAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODc0IHhvciAgc05hTjE0ICAgTmFOMTcgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODc1IHhvciAgc05hTjE1ICBzTmFOMTggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODc2IHhvciAgTmFOMTYgICBzTmFOMTkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODc3IHhvciAtSW5mICAgICtzTmFOMjAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODc4IHhvciAtMTAwMCAgICBzTmFOMjEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODc5IHhvciAgMTAwMCAgICBzTmFOMjIgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODgwIHhvciAgSW5mICAgICBzTmFOMjMgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODgxIHhvciArTmFOMjUgICtzTmFOMjQgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODgyIHhvciAtTmFOMjYgICAgTmFOMjggLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODgzIHhvciAtc05hTjI3ICBzTmFOMjkgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODg0IHhvciAgMTAwMCAgICAtTmFOMzAgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCit4b3J4ODg1IHhvciAgMTAwMCAgIC1zTmFOMzEgLT4gTmFOIEludmFsaWRfb3BlcmF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZG9jdGVzdF9hbGlhc2VzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvY3Rlc3RfYWxpYXNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjMzZjgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvY3Rlc3RfYWxpYXNlcy5weQpAQCAtMCwwICsxLDEzIEBACisjIFVzZWQgYnkgdGVzdF9kb2N0ZXN0LnB5LgorCitjbGFzcyBUd29OYW1lczoKKyAgICAnJydmKCkgYW5kIGcoKSBhcmUgdHdvIG5hbWVzIGZvciB0aGUgc2FtZSBtZXRob2QnJycKKworICAgIGRlZiBmKHNlbGYpOgorICAgICAgICAnJycKKyAgICAgICAgPj4+IHByaW50IFR3b05hbWVzKCkuZigpCisgICAgICAgIGYKKyAgICAgICAgJycnCisgICAgICAgIHJldHVybiAnZicKKworICAgIGcgPSBmICMgZGVmaW5lIGFuIGFsaWFzIGZvciBmCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZG9jdGVzdF9hbGlhc2VzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9kb2N0ZXN0X2FsaWFzZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTNlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZG9jdGVzdF9hbGlhc2VzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZG9jdGVzdF9hbGlhc2VzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9kb2N0ZXN0X2FsaWFzZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZTNlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZG9jdGVzdF9hbGlhc2VzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZG91YmxlX2NvbnN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMzM2ExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weQpAQCAtMCwwICsxLDMwIEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0RmFpbGVkCisKKyMgQSB0ZXN0IGZvciBTRiBidWcgNDIyMTc3OiAgbWFuaWZlc3QgZmxvYXQgY29uc3RhbnRzIHZhcmllZCB3YXkgdG9vIG11Y2ggaW4KKyMgcHJlY2lzaW9uIGRlcGVuZGluZyBvbiB3aGV0aGVyIFB5dGhvbiB3YXMgbG9hZGluZyBhIG1vZHVsZSBmb3IgdGhlIGZpcnN0CisjIHRpbWUsIG9yIHJlbG9hZGluZyBpdCBmcm9tIGEgcHJlY29tcGlsZWQgLnB5Yy4gIFRoZSAiZXhwZWN0ZWQiIGZhaWx1cmUKKyMgbW9kZSBpcyB0aGF0IHdoZW4gdGVzdF9pbXBvcnQgaW1wb3J0cyB0aGlzIGFmdGVyIGFsbCAucHljIGZpbGVzIGhhdmUgYmVlbgorIyBlcmFzZWQsIGl0IHBhc3NlcywgYnV0IHdoZW4gdGVzdF9pbXBvcnQgaW1wb3J0cyB0aGlzIGZyb20KKyMgZG91YmxlX2NvbnN0LnB5YywgaXQgZmFpbHMuICBUaGlzIGluZGljYXRlcyBhIHdvZWZ1bCBsb3NzIG9mIHByZWNpc2lvbiBpbgorIyB0aGUgbWFyc2hhbCBmb3JtYXQgZm9yIGRvdWJsZXMuICBJdCdzIGFsc28gcG9zc2libGUgdGhhdCByZXByKCkgZG9lc24ndAorIyBwcm9kdWNlIGVub3VnaCBkaWdpdHMgdG8gZ2V0IHJlYXNvbmFibGUgcHJlY2lzaW9uIGZvciB0aGlzIGJveC4KKworUEkgICAgPSAzLjE0MTU5MjY1MzU4OTc5MzI0CitUV09QSSA9IDYuMjgzMTg1MzA3MTc5NTg2NDgKKworUElfc3RyICAgID0gIjMuMTQxNTkyNjUzNTg5NzkzMjQiCitUV09QSV9zdHIgPSAiNi4yODMxODUzMDcxNzk1ODY0OCIKKworIyBWZXJpZnkgdGhhdCB0aGUgZG91YmxlIHggaXMgd2l0aGluIGEgZmV3IGJpdHMgb2YgZXZhbCh4X3N0cikuCitkZWYgY2hlY2tfb2soeCwgeF9zdHIpOgorICAgIGFzc2VydCB4ID4gMC4wCisgICAgeDIgPSBldmFsKHhfc3RyKQorICAgIGFzc2VydCB4MiA+IDAuMAorICAgIGRpZmYgPSBhYnMoeCAtIHgyKQorICAgICMgSWYgZGlmZiBpcyBubyBsYXJnZXIgdGhhbiAzIFVMUCAod3J0IHgyKSwgdGhlbiBkaWZmLzggaXMgbm8gbGFyZ2VyCisgICAgIyB0aGFuIDAuMzc1IFVMUCwgc28gYWRkaW5nIGRpZmYvOCB0byB4MiBzaG91bGQgaGF2ZSBubyBlZmZlY3QuCisgICAgaWYgeDIgKyAoZGlmZiAvIDguKSAhPSB4MjoKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiTWFuaWZlc3QgY29uc3QgJXMgbG9zdCB0b28gbXVjaCBwcmVjaXNpb24gIiAlIHhfc3RyKQorCitjaGVja19vayhQSSwgUElfc3RyKQorY2hlY2tfb2soVFdPUEksIFRXT1BJX3N0cikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kb3VibGVfY29uc3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3YjNmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kb3VibGVfY29uc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9kb3VibGVfY29uc3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2RvdWJsZV9jb25zdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY3ZGIyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9kb3VibGVfY29uc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9lbXB0eS52YnMgYi9saWIvcHl0aG9uMi43L3Rlc3QvZW1wdHkudmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNWYwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZW1wdHkudmJzCkBAIC0wLDAgKzEgQEAKKydFbXB0eSBWQlMgZmlsZSwgZG9lcyBub3RoaW5nLiAgSGVscGVyIGZvciBMaWJcdGVzdFx0ZXN0X3N0YXJ0ZmlsZS5weS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZXhjZXB0aW9uX2hpZXJhcmNoeS50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvZXhjZXB0aW9uX2hpZXJhcmNoeS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiNmRkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9leGNlcHRpb25faGllcmFyY2h5LnR4dApAQCAtMCwwICsxLDUwIEBACitCYXNlRXhjZXB0aW9uCisgKy0tIFN5c3RlbUV4aXQKKyArLS0gS2V5Ym9hcmRJbnRlcnJ1cHQKKyArLS0gR2VuZXJhdG9yRXhpdAorICstLSBFeGNlcHRpb24KKyAgICAgICstLSBTdG9wSXRlcmF0aW9uCisgICAgICArLS0gU3RhbmRhcmRFcnJvcgorICAgICAgfCAgICArLS0gQnVmZmVyRXJyb3IKKyAgICAgIHwgICAgKy0tIEFyaXRobWV0aWNFcnJvcgorICAgICAgfCAgICB8ICAgICstLSBGbG9hdGluZ1BvaW50RXJyb3IKKyAgICAgIHwgICAgfCAgICArLS0gT3ZlcmZsb3dFcnJvcgorICAgICAgfCAgICB8ICAgICstLSBaZXJvRGl2aXNpb25FcnJvcgorICAgICAgfCAgICArLS0gQXNzZXJ0aW9uRXJyb3IKKyAgICAgIHwgICAgKy0tIEF0dHJpYnV0ZUVycm9yCisgICAgICB8ICAgICstLSBFbnZpcm9ubWVudEVycm9yCisgICAgICB8ICAgIHwgICAgKy0tIElPRXJyb3IKKyAgICAgIHwgICAgfCAgICArLS0gT1NFcnJvcgorICAgICAgfCAgICB8ICAgICAgICAgKy0tIFdpbmRvd3NFcnJvciAoV2luZG93cykKKyAgICAgIHwgICAgfCAgICAgICAgICstLSBWTVNFcnJvciAoVk1TKQorICAgICAgfCAgICArLS0gRU9GRXJyb3IKKyAgICAgIHwgICAgKy0tIEltcG9ydEVycm9yCisgICAgICB8ICAgICstLSBMb29rdXBFcnJvcgorICAgICAgfCAgICB8ICAgICstLSBJbmRleEVycm9yCisgICAgICB8ICAgIHwgICAgKy0tIEtleUVycm9yCisgICAgICB8ICAgICstLSBNZW1vcnlFcnJvcgorICAgICAgfCAgICArLS0gTmFtZUVycm9yCisgICAgICB8ICAgIHwgICAgKy0tIFVuYm91bmRMb2NhbEVycm9yCisgICAgICB8ICAgICstLSBSZWZlcmVuY2VFcnJvcgorICAgICAgfCAgICArLS0gUnVudGltZUVycm9yCisgICAgICB8ICAgIHwgICAgKy0tIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgIHwgICAgKy0tIFN5bnRheEVycm9yCisgICAgICB8ICAgIHwgICAgKy0tIEluZGVudGF0aW9uRXJyb3IKKyAgICAgIHwgICAgfCAgICAgICAgICstLSBUYWJFcnJvcgorICAgICAgfCAgICArLS0gU3lzdGVtRXJyb3IKKyAgICAgIHwgICAgKy0tIFR5cGVFcnJvcgorICAgICAgfCAgICArLS0gVmFsdWVFcnJvcgorICAgICAgfCAgICAgICAgICstLSBVbmljb2RlRXJyb3IKKyAgICAgIHwgICAgICAgICAgICAgICstLSBVbmljb2RlRGVjb2RlRXJyb3IKKyAgICAgIHwgICAgICAgICAgICAgICstLSBVbmljb2RlRW5jb2RlRXJyb3IKKyAgICAgIHwgICAgICAgICAgICAgICstLSBVbmljb2RlVHJhbnNsYXRlRXJyb3IKKyAgICAgICstLSBXYXJuaW5nCisgICAgICAgICAgICstLSBEZXByZWNhdGlvbldhcm5pbmcKKyAgICAgICAgICAgKy0tIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcKKyAgICAgICAgICAgKy0tIFJ1bnRpbWVXYXJuaW5nCisgICAgICAgICAgICstLSBTeW50YXhXYXJuaW5nCisgICAgICAgICAgICstLSBVc2VyV2FybmluZworICAgICAgICAgICArLS0gRnV0dXJlV2FybmluZworCSAgICstLSBJbXBvcnRXYXJuaW5nCisJICAgKy0tIFVuaWNvZGVXYXJuaW5nCisJICAgKy0tIEJ5dGVzV2FybmluZwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2Zsb2F0aW5nX3BvaW50cy50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvZmxvYXRpbmdfcG9pbnRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzkwNzNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Zsb2F0aW5nX3BvaW50cy50eHQKQEAgLTAsMCArMSwxMDI4IEBACisjIFRoZXNlIG51bWJlcnMgYXJlIHVzZWQgdG8gdGVzdCBmbG9hdGluZyBwb2ludCBiaW5hcnktdG8tZGVjaW1hbCBjb252ZXJzaW9uLgorIyBUaGV5IGFyZSBiYXNlZCBvbiB0aGUgVENMIHRlc3Qgc3VpdGUgKHRlc3RzL2V4cHIudGVzdCksIHdoaWNoIGlzIGJhc2VkIG9uCisjIHRlc3QgZGF0YSBmcm9tOgorIyBCcmlnaXR0ZSBWZXJkb25rLCBBbm5pZSBDdXl0LCBEZW5uaXMgVmVyc2NoYWVyZW4sIEEgcHJlY2lzaW9uIGFuZCByYW5nZQorIyBpbmRlcGVuZGVudCB0b29sIGZvciB0ZXN0aW5nIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMgSUk6IENvbnZlcnNpb25zLAorIyBBQ00gVHJhbnNhY3Rpb25zIG9uIE1hdGhlbWF0aWNhbCBTb2Z0d2FyZSAyNzoyIChNYXJjaCAyMDAxKSwgcHAuIDExOS0xNDAuCisKKzBFMAorLTBFMAorMUUwCisxNUUtMQorMTI1RS0yCisxMTI1RS0zCisxMDYyNUUtNAorMTAzMTI1RS01CisxMDE1NjI1RS02CisxMDA3ODEyNUUtNworMTAwMzkwNjI1RS04CisxMDAxOTUzMTI1RS05CisxMDAwOTc2NTYyNUUtMTAKKzEwMDA0ODgyODEyNUUtMTEKKzEwMDAyNDQxNDA2MjVFLTEyCisxMDAwMTIyMDcwMzEyNUUtMTMKKzEwMDAwNjEwMzUxNTYyNUUtMTQKKzEwMDAwMzA1MTc1NzgxMjVFLTE1CisxMDAwMDE1MjU4Nzg5MDYyNUUtMTYKKys4RTE1MworLTFFMTUzCisrOUUzMDYKKy0yRTE1MworKzdFLTMwNAorLTNFLTQ5CisrN0UtMzAzCistNkUtNDkKKys5RTQzCistOUU0NAorKzhFMzAzCistMUUzMDMKKys3RS0yODcKKy0yRS0yMDQKKysyRS0yMDUKKy05RS00NworKzM0RTE5NQorLTY4RTE5NQorKzg1RTE5NAorLTY3RTk3CisrOTNFLTIzNAorLTE5RS04NworKzM4RS04NworLTM4RS04OAorLTY5RTIyMAorKzE4RTQzCistMzZFNDMKKys2MUUtOTkKKy00M0UtOTIKKys4NkUtOTIKKy01MUUtNzQKKysyODNFODUKKy01NjZFODUKKys1ODlFMTg3CistODM5RTE0MworLTc0NEUtMjM0CisrOTMwRS0yMzUKKy0xODZFLTIzNAorKzYwNEUxNzUKKy0zMDJFMTc1CisrNzU1RTE3NAorLTE1MUUxNzUKKys2NjJFLTIxMworLTQwOEUtNzQKKys1MTBFLTc1CisrNjc4MkU1NQorLTIzMDlFOTIKKys3OTYzRTM0CistMzM5MUU1NQorKzc5MDNFLTk2CistNzYxMUUtMjI2CisrNDkwN0UtMTk2CistNTU0N0UtMzExCisrNTMxMUUyNDEKKy01MzExRTI0MworKzUzMTFFMjQyCisrOTI2OUUtNDUKKy04NTU5RS0yODkKKys4Njk5RS0yNzYKKy04MDg1RS02NAorKzc0ODE5RTIwMQorLTgyMDgxRTQxCisrNTE4ODFFMzcKKy01NTA2MUUxNTcKKys3NzQwMkUtMjE1CistMzM4OTFFLTkyCisrMzg3MDFFLTIxNQorLTgyMTM5RS03NgorKzc1ODU5RTI1CisrODk1MDlFMTQwCistNTc1MzNFMjg3CisrNDYwNzNFLTMyCistOTIxNDZFLTMyCisrODM3NzFFLTc0CistMzQ3OTZFLTI3NgorKzU4NDE2OUUyMjkKKysxNjQxNjJFNDEKKy0zMjgzMjRFNDEKKysyMDk5MDFFLTExCistNDE5ODAyRS0xMQorKzk0MDE4OUUtMTEyCistODkyNzcxRS0yMTMKKys3NTc4MDNFMTIwCistMjUyNjAxRTEyMAorKzI1MjYwMUUxMjEKKy01MDUyMDJFMTIwCisrOTcwODExRS0yNjQKKy02NTQ4MzlFLTYwCisrMjg5NzY3RS0xNzgKKy01Nzk1MzRFLTE3OAorLTg4MjM2OTFFMTMwCisrOTM0NjcwNEUyMjkKKy0xMTY4MzM4RTIyOQorLTYwNjMzNjlFLTEzNgorKzM4NjU0MjFFLTIyNQorLTU3ODM4OTNFLTEyNworKzI1NzIyMzFFMjIzCistNTE0NDQ2MkUyMjMKKysxODE3NjIzRTEwOQorKzY0MzE1NDNFLTk3CistNTQ0NDA5N0UtMjEKKys4MDc2OTk5RS0xMjEKKy05OTk3NjQ5RS0yNzAKKys1MDYwOTI2M0UxNTcKKys3MDU4OTUyOEUxMzAKKy04ODIzNjkxMEUxMjkKKys4NzU3NTQzN0UtMzEwCistMjMxMzU1NzJFLTEyNworKzg1OTAwODgxRTE3NworLTg0ODYzMTcxRTExMworKzY4NzYxNTg2RTIzMgorLTUwNDY0MDY5RTI4NgorKzI3ODY5MTQ3RS0yNDgKKy01NTczODI5NEUtMjQ4CisrNzAxNzYzNTNFLTUzCistODA1NTUwODZFLTMyCistNDkxMDgwNjU0RTEyMQorKzUyNjI1MDkxOEUyODcKKy0yNDU1NDAzMjdFMTIxCistMTc1MTUwODc0RS0zMTAKKyszNTAzMDE3NDhFLTMxMAorLTQzNzg3NzE4NUUtMzExCisrNDU4MTE3MTY2RTUyCistOTE2MjM0MzMyRTUyCisrMjI5MDU4NTgzRTUyCistNTI1Nzg5OTM1RTk4CisrMjgyOTI2ODk3RS0yMjcKKy01NjU4NTM3OTRFLTIyNworKzY2NzI4NDExM0UtMjQwCistOTcxMjEyNjExRS0xMjYKKys5OTgxMzk2MzE3RS0xODIKKy01MDM1MjMxOTY1RS0xNTYKKys4MzM2OTYwNDgzRS0xNTMKKy04MDU2MzcxMTQ0RS0xNTUKKys2NDE4NDg4ODI3RTc5CistMzk4MTAwNjk4M0UyNTIKKys3OTYyMDEzOTY2RTI1MgorLTQ3MTM4OTg1NTFFMjYxCisrODcxNTM4MDYzM0UtNTgKKy05MDc4NTU1ODM5RS0xMDkKKys5NzEyMTI2MTEwRS0xMjcKKys0MjMzMzg0MjQ1MUUyMDEKKy04NDY2NzY4NDkwMkUyMDEKKysyMzc5MjEyMDcwOUUtMzE1CistNzg1NjQwMjE1MTlFLTIyNworKzcxODEyMDU0ODgzRS0xODgKKy0zMDMxMTE2MzYzMUUtMTE2CisrNzE4MDM5MTQ2NTdFMjkyCisrMzYzMTQyMjMzNTZFLTEwOQorKzE4MTU3MTExNjc4RS0xMDkKKy00NTM5Mjc3OTE5NUUtMTEwCisrNzc4MzgwMzYyMjkzRTIxOAorLTY4NTc2MzAxNTY2OUUyODAKKys5NTI5MTg2NjgxNTFFNzAKKy01NDgzNTc0NDM1MDVFMzIKKyszODQ4NjUwMDQ5MDdFLTI4NQorLTc2OTczMDAwOTgxNEUtMjg1CisrNjk3MDE1NDE4NDE3RS05MworLTkxNTY1NDA0OTMwMUUtMjgKKysxNzg1NDg2NTYzMzlFMTY5CistNzQyNTIyODkxNTE3RTI1OQorKzc0MjUyMjg5MTUxN0UyNTgKKy0zNTcwOTczMTI2NzhFMTY5CistMzExMzUyMTQ0OTE3MkUyMTgKKyszODkxOTAxODExNDY1RTIxNworLTE1NTY3NjA3MjQ1ODZFMjE4CisrOTk5Nzg3ODUwNzU2M0UtMTk1CistNzI0NzU2MzAyOTE1NEUtMzE5CisrMzYyMzc4MTUxNDU3N0UtMzE5CistMzA5MjQ0NjI5ODMyM0UtMjAwCisrNjM2Mzg1NzkyMDU5MUUxNDUKKy04MjMzNTU5MzYwODQ5RTk0CisrMjY4OTg0NTk1NDU0N0U0OQorLTUzNzk2OTE5MDkwOTRFNDkKKys1NTYwMzIyNTAxOTI2RS0zMDEKKy03ODEyODc4NDg5MjYxRS0xNzkKKys4NDM5Mzk4NTMzMDUzRS0yNTYKKy0yNzgwMTYxMjUwOTYzRS0zMDEKKy04NzYwNTY5OTE2MTY2NUUxNTUKKy0xNzUyMTEzOTgzMjMzM0UxNTYKKy04ODIxODEwMTM2MzUxM0UtMTcwCisrMzg2MzkyNDQzMTE2MjdFLTExNQorKzM1NTkzOTU5ODA3MzA2RTI2MQorLTUzMzkwOTM5NzEwOTU5RTI2MAorKzcxMTg3OTE5NjE0NjEyRTI2MQorLTg4OTg0ODk5NTE4MjY1RTI2MAorKzc3MDAzNjY1NjE4ODk1RS03MworLTE1NDAwNzMzMTIzNzc5RS03MgorKzYxNjAyOTMyNDk1MTE2RS03MgorLTMwODAxNDY2MjQ3NTU4RS03MgorKzgzNDczNTQ5NDkxNzA2M0UtMzAwCistNTg5Nzk1MTQ5MjA2NDM0RS0xNTEKKys0NzU2MDMyMTMyMjY4NTlFLTQyCistMjk0ODk3NTc0NjAzMjE3RS0xNTEKKys4NTA4MTMwMDgwMDE5MTNFOTMKKy0yMDM0NDkxNzIwNDMzMzlFMTg1CisrNDA2ODk4MzQ0MDg2Njc4RTE4NQorLTgxMzc5NjY4ODE3MzM1NkUxODUKKys2MDQ1MzM4NTE0NjA5MzkzRTI0NAorLTUxNDU5NjM3Nzg5NTQ5MDZFMTQyCisrMjU3Mjk4MTg4OTQ3NzQ1M0UxNDIKKy02OTY1OTQ5NDY5NDg3MTQ2RTc0CisrNjE4MjQxMDQ5NDI0MTYyN0UtMTE5CistODUxMDMwOTQ5ODE4Njk4NUUtMjc3CisrNjY0NzcwNDYzNzI3MzMzMUUtMjEyCistMjIxNTkwMTU0NTc1Nzc3N0UtMjEyCisrMzc3MTQ3NjE4NTM3NjM4M0UyNzYKKy0zNzI5OTAxODQ4MDQzODQ2RTIxMgorKzM3NzE0NzYxODUzNzYzODNFMjc3CistOTk3NzgzMDQ2NTY0OTE2NkUxMTkKKys4NDM5OTI4NDk2MzQ5MzE5RS0xNDIKKy04MjA0MjMwMDgyMDcwODgyRS01OQorKzg4NTM2ODY0MzQ4NDM5OTdFLTI0NAorLTU1NTMyNzQyNzIyODg1NTlFLTEwNAorKzM2MTQ5MDIzNjExMDk2MTYyRTE0NAorLTM2MTQ5MDIzNjExMDk2MTYyRTE0NworKzE4MDc0NTExODA1NTQ4MDgxRTE0NgorLTE4MDc0NTExODA1NTQ4MDgxRTE0NworKzk3MzM4Nzc0MTM4OTU0NDIxRS0yOTAKKy04ODEzMzgwOTgwNDk1MDk2MUUtMzA4CisrOTQwODAwNTU5MDI2ODIzOTdFLTI0MworLTI0NjkxMDAyNzMyNjU0ODgxRS0xMTUKKys1MjMwNjQ5MDUyNzUxNDYxNEU0OQorLTI2MTUzMjQ1MjYzNzU3MzA3RTQ5CisrNTUxODg2OTIyNTQxOTM2MDRFMTY1CistNjg5ODU4NjUzMTc3NDIwMDVFMTY0CisrMjcxNzYyNTgwMDUzMTkxNjdFLTI2MQorLTczMTY5MjMwMTA3MjU2MTE2RS0yNDgKKys5MTQ2MTUzNzYzNDA3MDE0NUUtMjQ5CistNTQzNTI1MTYwMTA2MzgzMzRFLTI2MQorKzU4NjE0NDI4OTYzODUzNTg3OEUyODAKKy02MDExMTcwMDY3ODUyOTU0MzFFMjQ1CisrMjkzMDcyMTQ0ODE5MjY3OTM5RTI4MAorLTk1MzE4NDcxMzIzODUxNjY1MkUyNzIKKys5MDIwNDIzNTgyOTAzNjY1MzlFLTI4MQorLTU1NzAzNTczMDE4OTg1NDY2M0UtMjk0CisrOTAyMDQyMzU4MjkwMzY2NTM5RS0yODAKKy0zNTQ5NDQxMDA1MDc1NTQzOTNFLTIzOAorKzI3MjEwNDA0MTUxMjI0MjQ3OUUxOTkKKy04MTYzMTIxMjQ1MzY3Mjc0MzdFMTk5CisrNTQ0MjA4MDgzMDI0NDg0OTU4RTE5OQorLTc5MjY0NDkyNzg1MjM3ODE1OUU3OAorLTY3OTQwNjQ1MDEzMjk3OTE3NUUtMjYzCisrNTQzNTI1MTYwMTA2MzgzMzQwRS0yNjIKKys3NDAwMjUzNjk1NjgyOTIwMTk2RTIxNQorLTE4NTAwNjM0MjM5MjA3MzAwNDlFMjE1CisrMzcwMDEyNjg0Nzg0MTQ2MDA5OEUyMTUKKy05MjUwMzE3MTE5NjAzNjUwMjQ1RTIxNAorKzgzOTYwOTQzMDA1Njk3Nzk2ODFFLTI1MgorLTM1MDc2NjUwODUwMDMyOTYyODFFLTc1CisrNzAxNTMzMDE3MDAwNjU5MjU2MkUtNzUKKy03MDE1MzMwMTcwMDA2NTkyNTYyRS03NAorKzcxODU2MjA0MzQ5NTE5MTkzNTFFMjA1CistMTM2MDUyMDIwNzU2MTIxMjM5NUUxOTgKKysyMTc4OTk5MTg1MzQ1MTUxNzMxRS0xODQKKy04NjkxMDg5NDg2MjAxNTY3MTAyRS0yMTgKKys0MzQ1NTQ0NzQzMTAwNzgzNTUxRS0yMTgKKy00MzU3OTk4MzcwNjkwMzAzNDYyRS0xODQKKys1OTgyNTI2NzM0OTEwNjg5MjQ2MUUxNzcKKy02MjI1OTExMDY4NDQyMzk1Nzc5MUU0NworKzU4MzgwMTY4NDc3MDM4NTY1NTk5RTI2NQorLTYyMjU5MTEwNjg0NDIzOTU3NzkxRTQ4CistMzM1ODQzNzcyMDIyNzkxMTg3MjRFLTI1MgorLTU3NDg0OTYzNDc5NjE1MzU0ODA4RTIwNQorKzcxODU2MjA0MzQ5NTE5MTkzNTEwRTIwNAorLTE0MzcxMjQwODY5OTAzODM4NzAyRTIwNQorKzM2OTkyMDg0NzYwMTc3NjI0MTc3RS0zMTgKKy03Mzk4NDE2OTUyMDM1NTI0ODM1NEUtMzE4CisrOTkyNTc3NjMyMjc3MTM4OTAyNDRFLTExNQorLTg3MzM2MzYyNDI1MTgyNTQ3Njk3RS0yODAKKys3RTI4OQorLTNFMTUzCisrNkUxNTMKKy01RTI0MworKzdFLTE2MQorLTdFLTE3MgorKzhFLTYzCistN0UtMTEzCisrOEUxMjYKKy00RTEyNgorKzVFMTI1CistMUUxMjYKKys4RS0xNjMKKy0xRS0xNjMKKysyRS0xNjMKKy00RS0xNjMKKys1MUUxOTUKKy0zN0U0NgorKzc0RTQ2CistNTZFMjg5CisrNjlFLTE0NQorLTcwRS0xNjIKKys1NkUtMTYxCistMjFFLTMwMworKzM0RS0yNzYKKy02OEUtMjc2CisrODVFLTI3NworLTg3RS0yNzQKKys4MjlFMTAyCistNjIzRTEwMAorKzcyM0UtMTYyCistNDU3RS0xMDIKKys5MTRFLTEwMgorLTMyM0UtMTM1CisrMTUxRTE3NgorLTMwMkUxNzYKKys5MjFFOTAKKy02MDRFMTc2CisrODIzRS0yMDYKKy00NjNFLTExNAorKzM0OEUtMjc0CisrOTk2OEUxMDAKKy02MjMwRTk5CisrMTI0NkUxMDAKKys2Njc2RS0yOTYKKy04MzQ1RS0yOTcKKysxNjY5RS0yOTYKKy0zMzM4RS0yOTYKKyszMjU3RTU4CistNjUxNEU1OAorKzI0MTZFMTc2CisrODA4NUUtNjMKKy0zMjM0RS02MgorKzE2MTdFLTYyCistNjQ2OEUtNjIKKys1MzQxOEUxMTEKKy02MDUxM0UxNjAKKysyNjcwOUUxMTEKKy05OTQ0N0UxNjYKKysxMjU0OUU0OAorLTI1MDk4RTQ4CisrNTAxOTZFNDgKKy02Mjc0NUU0NworKzgzNzcxRS03MworLTk3NDUxRS0xNjcKKys4NjYzN0UtMjAzCistNzU1NjlFLTI1NAorKzQ3MzgwNkU4MworLTk0NzYxMkU4MworKzI5MjM2OUU3NgorLTU4NDczOEU3NgorKzkzMzU4N0UtMTQwCistNzIwOTE5RS0xNAorKzUzNTAwMUUtMTQ5CistODkwNTIxRS0yMzUKKys1NDgwNTdFODEKKy03MDYxODFFODgKKys4MjA5OTdFMTA2CistMzIwNjgxRTYzCisrOTI4NjA5RS0yNjEKKy0zMDIyNzZFLTI1NAorKzE1MTEzOEUtMjU0CisrNDY5MTc3M0U0NQorLTkzODM1NDZFNDUKKyszMDU5OTQ5RS0yNDMKKy02MTE5ODk4RS0yNDMKKys1MzU2NjI2RS0yMTMKKy00ODc3Mzc4RS0xOTkKKys3NzE2NjkzRTIyMworLTU0NTI4NjlFMTA5CisrNDU5MDgzMUUxNTYKKy05MTgxNjYyRTE1NgorLTM3MTQ0MzZFLTI2MQorKzQ2NDMwNDVFLTI2MgorLTc0Mjg4NzJFLTI2MQorKzUyOTQyMTQ2RTEzMAorLTI3OTY2MDYxRTE0NQorKzI2NDcxMDczRTEzMAorLTU1OTMyMTIyRTE0NQorKzk1NDEyNTQ4RS05OQorLTQ3NzA2Mjc0RS05OQorKzIzODUzMTM3RS05OQorLTc4NDkzNjU0RS0zMDEKKys2NTM0NjQxN0UyOQorLTUxMDgzMDk5RTE2NworKzg5Mzk2MzMzRTI2NAorLTg0ODYzMTcxRTExNAorKzU5NTQwODM2RS0yNTEKKy03NDQyNjA0NUUtMjUyCisrMTQ4ODUyMDlFLTI1MQorLTI5NzcwNDE4RS0yNTEKKys5ODIxNjEzMDhFMTIyCistMjQ1NTQwMzI3RTEyMgorKzQ5MTA4MDY1NEUxMjIKKys1MjU0NTI2MjJFLTMxMAorLTc3MTgzNzExM0UtMTM0CisrODIwODU4MDgxRS0xNTAKKy0yNjI3MjYzMTFFLTMxMAorKzkyMzA5MTQ4N0UyMDkKKy02NTM3Nzc3NjdFMjczCisrODQyMTE2MjM2RS01MworLTc0MTExMTE2OUUtMjAyCisrODM5NTA3MjQ3RS0yODQKKy05NTE0ODcyNjlFLTI2NAorLTk4MjE2MTMwODBFMTIxCisrNjY3Nzg1NjAxMUUtMzEKKy0zNTczNzk2ODI2RS0yNjYKKys3MTQ3NTkzNjUyRS0yNjYKKy05OTgxMzk2MzE3RS0xODEKKyszMjY4ODg4ODM1RTI3MgorLTI2MTUxMTEwNjhFMjczCisrMTMwNzU1NTUzNEUyNzMKKysyOTkwNjcxMTU0RS0xOTAKKy0xNDk1MzM1NTc3RS0xOTAKKys1OTgxMzQyMzA4RS0xOTAKKy03NDc2Njc3ODg1RS0xOTEKKys4MjI1OTY4NDE5NEUtMjAyCistOTMyMjcyNjc3MjdFLTQ5CisrNDExMjk4NDIwOTdFLTIwMgorLTQ3NTg0MjQxNDE4RS0zMTQKKy03OTM2MDI5MzQwNkU5MgorKzU3MzMyMjU5MzQ5RTIyNQorLTU3MjAyMzI2MTYyRTExMQorKzg2ODYwNTk3MDUzRS0yMDYKKy01MzgyNzAxMDY0M0UtMjAwCisrNTM1ODcxMDc0MjNFLTYxCisrNjM1MDA3NjM2NzY1RTIwMAorKzUwODAwNjEwOTQxMkUyMDEKKy0yNTQwMDMwNTQ3MDZFMjAxCisrNTYxMDI5NzE4NzE1RS03MgorLTg5NzY0NzU0OTk0NEUtNzEKKysxMTIyMDU5NDM3NDNFLTcxCistODczOTQ3MDg2MDgxRS0yMzYKKys4MDkxODQ3MDkxNzdFMTE2CistNTczMTEyOTE3NDIyRTgxCisrMjg2NTU2NDU4NzExRTgxCisrOTUyODA1ODIxNDkxRS0yNTkKKy0xMzIxODk5OTI4NzNFLTQ0CistMTczNjk2MDM4NDkzRS0xNDQKKysxODMxMTMyNzU3NTk5RS0xMDcKKy05MTU1NjYzNzg3OTk1RS0xMDgKKys3MzI0NTMxMDMwMzk2RS0xMDcKKy05Mjc3MzM4ODk0OTY5RS0yMDAKKys4MTg4MjkyNDIzOTczRTI4NworLTU2NzI1NTc0Mzc5MzhFNTkKKysyODM2Mjc4NzE4OTY5RTU5CistOTk5NTE1MzE1MzQ5NEU1NAorKzkyMjQ3ODY0MjIwNjlFLTI5MQorLTMxNDIyMTMxNjQ5ODdFLTI5NAorKzYyODQ0MjYzMjk5NzRFLTI5NAorLTgzNDA0ODM3NTI4ODlFLTMwMQorKzY3MDM5MzcxNDg2NDY2RTg5CistNjIxNTA3ODY2MTUyMzlFMTk3CisrMzM1MTk2ODU3NDMyMzNFODkKKy01MjU2MzQxOTQ5Njk5OUUxNTYKKyszMjU5OTQ2MDQ2Njk5MUUtNjUKKy00MTAxMDk4ODc5ODAwN0UtMTMzCisrNjUxOTg5MjA5MzM5ODJFLTY1CistODIwMjE5Nzc1OTYwMTRFLTEzMworKzgwNTI3OTc2NjQzODA5RTYxCistNzQ3MTI2MTE1MDUyMDlFMTU4CisrNTMzOTA5Mzk3MTA5NTlFMjYxCistNjkyNzczMDI2NTkxNTVFMjI1CisrNDYyMDIxOTkzNzEzMzdFLTcyCistMjM0Mzg2MzU0Njc3ODNFLTE3OQorKzQxOTIxNTYwNjE1MzQ5RS02NworLTkyNDA0Mzk4NzQyNjc0RS03MgorKzczODU0NTYwNjY0NzE5N0UxMjQKKy05NzI3MDgxODExODI5NDlFMTE3CistODM3OTkyMTQzNTgwODI1RTg3CisrNjA5NjEwOTI3MTQ5MDUxRS0yNTUKKy00NzU2MDMyMTMyMjY4NTlFLTQxCisrNTYzMDAyODAwNjcxMDIzRS0xNzcKKy05NTEyMDY0MjY0NTM3MThFLTQxCisrODA1NDE2NDMyNjU2NTE5RTIwMgorLTUzMDY1ODY3NDY5NDMzN0UxNTkKKys5NDY1NzQxNzM4NjM5MThFMjA4CistMzE4MzI5OTUzMzE4NTUzRTExMworLTQ2MjAyMTk5MzcxMzM3MEUtNzMKKyszNjk2MTc1OTQ5NzA2OTZFLTcyCisrMzY2NjE1NjIxMjAxNDk5NEUyMzMKKy0xODMzMDc4MTA2MDA3NDk3RTIzMworKzgzMDE3OTA1MDg2MjQyMzJFMTc0CistMTAzNzcyMzgxMzU3ODAyOUUxNzQKKys3Mjk3NjYyODgwNTgxMTM5RS0yODYKKy01MTA2MTg1Njk4OTEyMTkxRS0yNzYKKys3NDg3MjUyNzIwOTg2ODI2RS0xNjUKKy0zNzQzNjI2MzYwNDkzNDEzRS0xNjUKKyszNzczMDU3NDMwMTAwMjU3RTIzMAorLTc1NDYxMTQ4NjAyMDA1MTRFMjMwCisrNDMyMTIyMjg5MjQ2MzgyMkU1OAorLTc3OTM1NjAyMTcxMzk2NTNFNTEKKysyNjUyNTk5Mzk0MTAxMDY4MUUxMTIKKy01MzA1MTk4Nzg4MjAyMTM2MkUxMTIKKys3Mjg0NDg3MTQxNDI0NzkwN0U3NworLTg4ODM5MzU5NTk2NzYzMjYxRTEwNQorKzE4NzE4MTMxODAyNDY3MDY1RS0xNjYKKy0xNDk3NDUwNTQ0MTk3MzY1MkUtMTY1CisrNzM0MjkzOTYwMDQ2NDAyMzlFMTA2CistNTg0ODM5MjEwNzgzOTgyODNFNTcKKys0MTM5MTUxOTE5MDY0NTIwM0UxNjUKKy04Mjc4MzAzODM4MTI5MDQwNkUxNjUKKys1ODc2NzA0Mzc3NjcwMjY3N0UtMTYzCistOTA1MDYyMzE4MzEyMzE5OTlFLTEyOQorKzY0NDA5MjQwNzY5ODYxNjg5RS0xNTkKKy03NzMwNTQyNzQzMjI3Nzc3MUUtMTkwCisrNDc2NTkyMzU2NjE5MjU4MzI2RTI3MworLTk1MzE4NDcxMzIzODUxNjY1MkUyNzMKKys4OTk4MTA4OTIxNzI2NDYxNjNFMjgzCistOTI5MTY3MDc2ODkyMDE4MzMzRTE4NworKzY0Nzc2MTI3ODk2NzUzNDIzOUUtMzEyCistNjQ0MjkwNDc5ODIwNTQyOTQyRS0xODAKKys5MjYxNDUzNDQ2MTA3MDAwMTlFLTIyNQorLTk1ODUwNzkzMTg5NjUxMTk2NEUtMjQ2CisrMjcyMTA0MDQxNTEyMjQyNDc5RTIwMAorLTc5MjY0NDkyNzg1MjM3ODE1OUU3OQorKzU0NDIwODA4MzAyNDQ4NDk1OEUyMDAKKy05Mjk5NjMyMTg2MTYxMjYzNjVFMjkwCisrMzA1NTc0MzM5MTY2ODEwMTAyRS0yMTkKKy0xNTI3ODcxNjk1ODM0MDUwNTFFLTIxOQorKzYxMTE0ODY3ODMzMzYyMDIwNEUtMjE5CistNzYzOTM1ODQ3OTE3MDI1MjU1RS0yMjAKKys3NDM5NTUwMjIwOTIwNzk4NjEyRTE1OAorLTM3MTk3NzUxMTA0NjAzOTkzMDZFMTU4CisrOTI5OTQzNzc3NjE1MDk5ODI2NUUxNTcKKy03MTIwMTkwNTE3NjEyOTU5NzAzRTEyMAorKzM1MDc2NjUwODUwMDMyOTYyODFFLTczCistNzAxNTMzMDE3MDAwNjU5MjU2MkUtNzMKKy02Njg0NDI4NzYyMjc4MjU1OTU2RS0yOTQKKy0xMDg4NDE2MTY2MDQ4OTY5OTE2RTIwMAorLTg3MDczMjkzMjgzOTE3NTkzMjhFMjAwCisrNDQzOTAyMTc4MTYwODU1ODAwMkUtNjUKKy04ODc4MDQzNTYzMjE3MTE2MDA0RS02NQorKzIyMTk1MTA4OTA4MDQyNzkwMDFFLTY1CisrMzMwNTEyMjM5NTE5MDQ5NTU4MDJFNTUKKy01Njk2MTUyNDE0MDkwMzY3NzYyNEUxMjAKKys3MTIwMTkwNTE3NjEyOTU5NzAzMEUxMTkKKysxNDAzMDY2MDM0MDAxMzE4NTEyNEUtNzMKKy0xNzUzODMyNTQyNTAxNjQ4MTQwNUUtNzQKKys2NzUzNjIyODYwOTE0MTU2OTEwOUUtMTMzCistMzU2MjA0OTc4NDk0NTAyMTg4MDdFLTMwNgorKzY2NTUwMzc2Nzk3NTgyNTIxNzUxRS0xMjYKKy03MTI0MDk5NTY5ODkwMDQzNzYxNEUtMzA2CisrM0UyNAorLTZFMjQKKys2RTI2CistN0UyNQorKzFFLTE0CistMkUtMTQKKys0RS0xNAorLThFLTE0CisrNUUyNgorLThFMjcKKysxRTI3CistNEUyNworKzlFLTEzCistN0UtMjAKKys1NkUyNQorLTcwRTI0CisrNTFFMjYKKys3MUUtMTcKKy0zMUUtNQorKzYyRS01CistOTRFLTgKKys2N0UyNworLTgxRTI0CisrNTRFMjMKKy01NEUyNQorKzYzRS0yMgorLTYzRS0yMworKzQzRS00CistODZFLTQKKys5NDJFMjYKKy00NzFFMjUKKys4MDNFMjQKKy00NzFFMjYKKy00MDlFLTIxCisrODE4RS0yMQorLTg2N0UtOAorKzUzOEUyNworLTg1N0UyNAorKzI2OUUyNworLTQwM0UyNgorKzk1OUUtNworLTk1OUUtNgorKzM3M0UtMjcKKy03NDZFLTI3CisrNDA2OUUyNAorLTQwNjlFMjMKKy04MTM4RTI0CisrODI5NEUtMTUKKy00MTQ3RS0xNAorKzQxNDdFLTE1CistODI5NEUtMTQKKys1MzhFMjcKKy0yNjkwRTI2CisrMjY5RTI3CistMjE1MkUyNworKzE3MjFFLTE3CistNzk3OUUtMjcKKys2ODg0RS0xNworLTg2MDVFLTE4CisrODI4NTRFMjcKKy01NTY4NEUyNAorKzI3ODQyRTI0CistNDg5NTlFMjUKKys4MTkyMUUtMTcKKy03NjIwN0UtOAorKzQxNDdFLTE1CistNDE0NzBFLTE2CisrODkzMDlFMjQKKys3NTg1OUUyNgorLTc1ODU5RTI1CisrMTQyNTdFLTIzCistMjg1MTRFLTIzCisrNTcwMjhFLTIzCistNzEyODVFLTI0CisrMzQ0ODYzRTI3CistOTUxNzM1RTI3CisrMjAwNjc3RTIzCistNDAxMzU0RTI0CisrODM5NjA0RS0xMQorLTIwOTkwMUUtMTEKKys0MTk4MDJFLTExCistNTM3NzM0RS0yNAorKzkxMDMwOEUyNgorLTIyNzU3N0UyNgorKzQ1NTE1NEUyNgorLTUzMTAxM0UyNQorKzk2MzAxOUUtMjEKKy01MTk4MjdFLTEzCisrNjIzNDAyRS0yNworLTMxMTcwMUUtMjcKKys5NjEzNjUxRTI2CistOTE5MTMxNkUyMworKzQ1OTU2NThFMjMKKy0yMjk3ODI5RTIzCistMTY3OTIwOEUtMTEKKyszMzc5MjIzRTI3CistNjc1ODQ0NkUyNworKzU0NDQwOTdFLTIxCistODM5OTk2OUUtMjcKKys4MzY2NDg3RS0xNgorLTgzNjY0ODdFLTE1CisrNjUwNjA2NzFFMjUKKys2NTIxMjM4OUUyMworKzU1NTQ0OTU3RS0xMworLTUxMDQwOTA1RS0yMAorKzk5NTg1NzY3RS0yMgorLTk5NTg1NzY3RS0yMworKzQwOTc4MzkzRTI2CistNjc0ODgxNTlFMjQKKys2OTAwNTMzOUUyMworLTgxOTU2Nzg2RTI2CistODcxMDU1NTJFLTIxCisrMTA4ODgxOTRFLTIxCistMjE3NzYzODhFLTIxCisrNjM1ODA2NjY3RTI3CistNjcwMDI2NjE0RTI1CisrMzM1MDEzMzA3RTI2CistMzM1MDEzMzA3RTI1CisrMzcxNzkwNjE3RS0yNAorLTM3MTc5MDYxN0UtMjUKKys3NDM1ODEyMzRFLTI0CistNzQzNTgxMjM0RS0yNQorKzIwMjQ2NDQ3N0UyNAorLTQwNDkyODk1NEUyNAorKzk5Nzg1Mzc1OEUyNworLTk5Nzg1Mzc1OEUyNgorKzQwNTQ5ODQxOEUtMTcKKy01ODI1NzkwODRFLTE0CisrNjA4MjQ3NjI3RS0xOAorLTI5MTI4OTU0MkUtMTQKKy05NTM3MTAwMDA1RTI2CisrNjM1ODA2NjY3MEUyNworLTEyNzE2MTMzMzRFMjcKKys1MjI5NjQ2OTk5RS0xNgorKzUyMjk2NDY5OTlFLTE3CisrNDQyOTk0MzYxNEUyNAorLTg4NTk4ODcyMjhFMjQKKysyMjE0OTcxODA3RTI0CistNDE3Njg4NzA5M0UyNgorKzQwMDM0OTUyNTdFLTIwCistNDM2MTkwMTYzN0UtMjMKKys4NzIzODAzMjc0RS0yMworLTgwMDY5OTA1MTRFLTIwCisrNzI4MzUxMTAwOThFMjcKKy0zNjQxNzU1NTA0OUUyNworKzg0Mjc5NjMwMTA0RTI1CistODQyNzk2MzAxMDRFMjQKKysyMTIwNjE3NjQzN0UtMjcKKy02NjQ2MTU2NjkxN0UtMjIKKys2NDgwODM1NTUzOUUtMTYKKy04NDkzMjY3OTY3M0UtMTkKKys2NTIwNTQzMDA5NEUyNgorLTY4Mzg0NDYzNDI5RTI1CisrMzI2MDI3MTUwNDdFMjYKKy02MjY2MjIwMzQyNkUyNworKzU4Nzg0NDQ0Njc4RS0xOAorLTUwOTgwMjAzMzczRS0yMQorKzI5MzkyMjIyMzM5RS0xOAorLTc1NTI5OTQwMzIzRS0yNworLTkzNzQ5NTkwNjI5OUUyNgorKzg0MjY0MjQ4NTc5OUUtMjAKKy0zODc4MjQxNTA2OTlFLTIzCisrOTI0OTQ4ODE0NzI2RS0yNworLTc3NTY0ODMwMTM5OEUtMjMKKys1NDcwNzU3MDc0MzJFMjUKKys2ODM4NDQ2MzQyOTBFMjQKKy0xMzY3Njg5MjY4NThFMjUKKys1MDk4MDIwMzM3MzBFLTIyCisrMTAxOTYwNDA2NzQ2RS0yMQorLTgxNTY4MzI1Mzk2OEUtMjEKKys3MzQ0MTI0MTIzNTI0RTI0CistOTE4MDE1NTE1NDQwNUUyMworKzY0Nzk0NjMzMjczMjNFMjcKKy0xODM2MDMxMDMwODgxRTI0CisrNDMzNzI2OTI5MzAzOUUtMTkKKy00NTk5MTYzNTU0MzczRS0yMworKzkxOTgzMjcxMDg3NDZFLTIzCisrNDgxMjgwMzkzODM0N0UyNworLTg0MTIwMzA4OTAwMTFFMjMKKys5NjI1NjA3ODc2Njk0RTI3CistNDczOTk2ODgyODI0OUUyNAorKzk2OTcxODM4OTE2NzNFLTIzCistNzM2ODEwODUxNzU0M0UtMjAKKys1MTQ2MTM1ODE2MTQyMkUyNQorLTc3MTkyMDM3MjQyMTMzRTI2CisrNzcxOTIwMzcyNDIxMzNFMjUKKy01MTQ2MTM1ODE2MTQyMkUyNworKzQzOTk5NjYxNTYxNTQxRS0yMQorLTg3OTk5MzIzMTIzMDgyRS0yMQorKzQ4Mzc0ODg2ODI2MTM3RS0yNgorLTU3Njg0MjQ2NTY3MTExRS0yMworKzg3MTkyODA1OTU3Njg2RTIzCistNzUxMDg3MTMwMDU5MTNFMjQKKys2NDIzMzExMDU4NzQ4N0UyNworLTc3NTc3NDcxMTMzMzg0RS0yMworKzQ4NDg1OTE5NDU4MzY1RS0yNAorLTU2OTA4NTk4MjY1NzEzRS0yNgorKzU4OTcyMjI5NDYyMDEzM0UyMworKzY1MjgzNTgwNDQ0OTI4OUUtMjIKKy02NTY0MTUzNjM5MzYyMDJFLTIzCisrNTc5MzM2NzQ5NTg1NzQ1RS0yNQorLTM4MTI5Mjc2NDk4MDgzOUUtMjYKKys5NjUyNjU4NTk2NDk2OThFMjMKKy04NDg5MjUyMzU0MzQ4ODJFMjcKKys1MzYxNzc2MTIyMjI0OTFFMjMKKy00MjQ0NjI2MTc3MTc0NDFFMjcKKysyNzYwMDkyNzk4ODg5ODlFLTI3CistNjA4OTI3MTU4MDQzNjkxRS0yNgorKzU1MjAxODU1OTc3Nzk3OEUtMjcKKy00MjU2NzgzNzc2Njc3NThFLTIyCisrODAxMzcwMjcyNjkyNzExOUUyNgorKzg4NjI2Mjc5NjIzNjIwMDFFMjcKKy01MDY4MDA3OTA3NzU3MTYyRTI2CistNzM3OTcxNDc5OTgyODQwNkUtMjMKKys0MTE0NTM4MDY0MDE2MTA3RS0yNworLTM2ODk4NTczOTk5MTQyMDNFLTIzCisrNTU3NTk1NDg1MTgxNTQ3OEUyMworKzMzOTU3MDA5NDE3Mzk1MjhFMjcKKys0MTE1NTM1Nzc3NTgxOTYxRS0yMworLTgyMzEwNzE1NTUxNjM5MjJFLTIzCisrNjU1MDI0NjY5NjE5MDg3MUUtMjYKKy02ODA4MzA0NjQwMzk4NjcwMUUyNworKzQzNTY2Mzg4NTk1NzgzNjQzRTI3CistODcxMzI3NzcxOTE1NjcyODZFMjcKKys1OTY0NDg4MTA1OTM0MjE0MUUyNQorLTgzODUyNzcwNzE4NTc2NjY3RTIzCisrOTk0ODI5Njc0MTgyMDY5NjFFLTI1CistOTk0ODI5Njc0MTgyMDY5NjFFLTI2CisrODc0NDY2Njk5Njk5OTQ2MTRFLTI3CistNDM3MjMzMzQ5ODQ5OTczMDdFLTI3CisrNUUyNAorLThFMjUKKysxRTI1CistNEUyNQorKzJFLTUKKy01RS02CisrNEUtNQorLTNFLTIwCisrM0UyNworLTlFMjYKKys3RTI1CistNkUyNworKzJFLTIxCistNUUtMjIKKy00RS0yMQorKzg3RTI1CistOTdFMjQKKys4MkUtMjQKKy00MUUtMjQKKys3NkUtMjMKKys4M0UyNQorLTUwRTI3CisrMjVFMjcKKy05OUUyNworKzk3RS0xMAorLTU3RS0yMAorKzk5N0UyMworKzc3NkUyNAorLTM4OEUyNAorKzUyMUUtMTAKKy01MDZFLTI2CisrNzM5RS0xMAorLTg2N0UtNworLTQxNUUyNAorKzMzMkUyNQorLTY2NEUyNQorKzI5MUUtMTMKKy05ODJFLTgKKys1ODJFLTEzCistNDkxRS04CisrNDU3NEUyNgorLTg2MDlFMjYKKysyMjg3RTI2CistNDgxOEUyNAorKzY1MjlFLTgKKy04MTUxRS0yMQorKzE1NTdFLTEyCistMjU3M0UtMTgKKys0OTI5RS0xNgorLTMwNTNFLTIyCisrOTg1OEUtMTYKKy03NzY3RS0xMQorKzU0MzM5RTI2CistNjI0MDlFMjUKKyszMjgxOUUyNworLTg5ODQ5RTI3CisrNjM4NzZFLTIwCistMTU5NjlFLTIwCisrMzE5MzhFLTIwCistNzk4NDVFLTIxCisrODkzMDZFMjcKKy0yNTQ4N0UyNAorKzc5ODg5RTI0CistOTczNzlFMjYKKys4MTAwMkUtOAorLTQzMTQ5RS0yNQorKzQwNTAxRS04CistNjAzMThFLTEwCistNjQ4Mjk5RTI3CisrNzgwNjQ5RTI0CisrNzIwOTE5RS0xNAorLTYyOTcwM0UtMTEKKys1NTc5MTNFMjQKKy04NDc4OTlFMjMKKys1NjU0NDVFMjcKKy03MzY1MzFFMjQKKys2ODAwMTNFLTE5CistNTI5OTgxRS0xMAorKzM4MjkyM0UtMjMKKy02MzM2MTRFLTE4CisrMjE2NTQ3OUUyNworLTg2NjE5MTZFMjcKKys0MzMwOTU4RTI3CistOTM5MTk5M0UyMgorLTU3NjczNTJFLTE0CisrNzIwOTE5MEUtMTUKKy0xNDQxODM4RS0xNAorKzg0Nzg5OTBFMjIKKysxNDczMDYyRTI0CisrODM2NjQ4N0UtMTQKKy04Mzk5OTY5RS0yNQorKzkzNjY3MzdFLTEyCistOTQwNjE0MUUtMTMKKys2NTk3MDk3OUUyNAorLTY1MDYwNjcxRTI2CisrNTQ5MjMwMDJFMjcKKy02Mzg0NjkyN0UyNQorKzk5NTg1NzY3RS0yMQorKzY3NDg4MTU5RTI1CistNjkwMDUzMzlFMjQKKys4MTk1Njc4NkUyNworLTQwOTc4MzkzRTI3CisrNzc1MDU3NTRFLTEyCistMzg3NTI4NzdFLTEyCisrODI3NzI5ODFFLTE1CistOTU1OTM1MTdFLTI1CisrMjAwMDM2OTg5RTI1CistNzcyNjg2NDU1RTI3CisrODU5MTM5OTA3RTIzCistNDAwMDczOTc4RTI1CisrNTY5MDE0MzI3RS0xNAorLTc5NDI2Mzg2MkUtMTUKKyszOTcxMzE5MzFFLTE1CistMzgwMzk4OTU3RS0xNgorKzU2NzM2Njc3M0UyNworLTMzNzQ0MDc5NUUyNAorKzEzNDk3NjMxOEUyNQorLTI2OTk1MjYzNkUyNQorKzkzMjA4MDU5N0UtMjAKKy0zMzEwOTE5MjRFLTE1CistNDEzODY0OTA1RS0xNgorKzg1MzkyNDYyNDdFMjYKKy01ODU5MTM5NzkxRTI2CisrNjEwNTAxMDE0OUUyNAorLTMwOTA3NDU4MjBFMjcKKyszNDcwODc3NzczRS0yMAorLTYxMzYzMDkwODlFLTI3CisrODkxNzc1ODcxM0UtMTkKKy02OTQxNzU1NTQ2RS0yMAorKzkxOTQ5MDA1MzVFMjUKKy0xODM4OTgwMTA3RTI2CisrNzM1NTkyMDQyOEUyNgorLTM2Nzc5NjAyMTRFMjYKKys4NDczNjM0MzQzRS0xNworLTg4NzA3NjYyNzRFLTE2CisrNDQzNTM4MzEzN0UtMTYKKy05NTk4OTkwMTI5RS0xNQorKzcxNTYzNDk2NzY0RTI2CistODk0NTQzNzA5NTVFMjUKKysxNzg5MDg3NDE5MUUyNgorLTM1NzgxNzQ4MzgyRTI2CisrNTc5NzM0NDc4NDJFLTE5CistMjg5ODY3MjM5MjFFLTE5CisrNzY4MjI3MTEzMTNFLTE5CistOTc2OTk0NjY4NzRFLTIwCisrNjc3NDg2NTY3NjJFMjcKKy0xOTM5NDg0MDk5MUUyNAorKzM4Nzg5NjgxOTgyRTI0CistMzM4NzQzMjgzODFFMjcKKys1NDMyMzc2Mzg4NkUtMjcKKy01ODk4NzE5Mzg4N0UtMjAKKysyNzE2MTg4MTk0M0UtMjcKKy05MzA0MjY0ODAzM0UtMTkKKys1MjA4MzEwNTkwNTVFMjcKKy03NjgxMjQyNjQzOTRFMjUKKyszODQwNjIxMzIxOTdFMjUKKys3NjUzMzc3NDk4ODlFLTI1CisrNzk0MzY4OTEyNzcxRTI1CistOTk0MTYyMDkwMTQ2RTIzCisrNzgxNjUyNzc5NDMxRTI2CisrOTEwMDc3MTkwMDQ2RS0yNgorLTQ1NTAzODU5NTAyM0UtMjYKKys0NzE4OTc1NTEwOTZFLTIwCistOTA2Njk4NDA5OTExRS0yMQorKzg4NTQxMjgwMDM5MzVFMjUKKy04MTQ2MTIyNzE2Mjk5RTI3CisrNzA4MzMwMjQwMzE0OEUyNgorLTM1NDE2NTEyMDE1NzRFMjYKKys4Mzk0OTIwNjQ5MjkxRS0yNQorLTc2NTc5NzU3NTY3NTNFLTIyCisrNTQ3MzgzNDAwMjIyOEUtMjAKKy02ODQyMjkyNTAyNzg1RS0yMQorLTIxMDk1Njg4ODQ1OTdFMjUKKys4NDM4Mjc1NTM4Mzg4RTI1CistNDIxOTEzNzc2OTE5NEUyNQorKzMyMDAxNDE3ODk4NDFFLTI1CistODY1NTY4OTMyMjYwN0UtMjIKKys2NDAwMjgzNTc5NjgyRS0yNQorLTg4Mzc3MTk2MzQ0OTNFLTIxCisrMTk0MjgyMTcwNzUyOTdFMjQKKy0zODg1NjQzNDE1MDU5NEUyNAorKzc3NzEyODY4MzAxMTg4RTI0CistNzcxOTIwMzcyNDIxMzNFMjcKKys3NjU3OTc1NzU2NzUzMEUtMjMKKysxNTMxNTk1MTUxMzUwNkUtMjIKKy0zODI4OTg3ODc4Mzc2NUUtMjMKKys0OTM3ODAzMzkyNTIwMkUyNQorLTUwOTQwNTI3MTAyMzY3RTI0CisrOTg3NTYwNjc4NTA0MDRFMjUKKy05OTU4OTM5NzU0NDg5MkUyNgorLTU2OTA4NTk4MjY1NzEzRS0yNQorKzk3NDcwNjk1Njk5NjU3RS0yMgorLTM1ODUxOTAxMjQ3MzQzRS0yNQorKzE1NDM4NDA3NDQ4NDI2NkUyNworLTMwODc2ODE0ODk2ODUzMkUyNworKzkxMDk5MDM4OTAwNTk4NUUyMworKzI3MTc0MjQyNDE2OTIwMUUtMjcKKy01NDM0ODQ4NDgzMzg0MDJFLTI3CisrMTYyMTkyMDgzMzU3NTYzRS0yNgorLTg2OTI1NDU1Mjc3MDA4MUUtMjMKKys2NjQ4MzEwMDc2MjYwNDZFMjQKKy0zMzI0MTU1MDM4MTMwMjNFMjQKKys5NDM3MDE4MjkwNDE0MjdFMjQKKy0xMDE4ODEwNTQyMDQ3MzRFMjQKKys4MjgwMjc4Mzk2NjY5NjdFLTI3CistMjgwMjc2MTM1NjA4Nzc3RS0yNworKzIxMjgzOTE4ODgzMzg3OUUtMjEKKy0xMTM4MTcxOTY1MzE0MjZFLTI1CisrOTcxMTU1MzE5Nzc5Njg4M0UyNworLTI3Mzk4NDkzODY1MjQyNjlFMjYKKys1NDc5Njk4NzczMDQ4NTM4RTI2CisrNjEyNDU2ODMxODUyMzExM0UtMjUKKy0xMTM5Nzc3OTg4MTcxMDcxRS0yNAorKzYzMjI2MTIzMDMxMjgwMTlFLTI3CistMjk1NTg2NDU2NDg0NDYxN0UtMjUKKy05OTk0MDI5MTQ0OTk4OTYxRTI1CistMjk3MTIzODMyNDAyMjA4N0UyNworLTE2NTYwNTU2NzkzMzM5MzRFLTI3CistMTQ0NTQ4ODcwOTE1MDIzNEUtMjYKKys1NTgyNDcxNzQ5OTg4NTE3MkUyNworLTY5NzgwODk2ODc0ODU2NDY1RTI2CisrODQxNjE1Mzg4Njc1NDUxOTlFMjUKKy0yNzkxMjM1ODc0OTk0MjU4NkUyNworKzI0NzExMTEyNDYyOTI2MzMxRS0yNQorLTEyNjQ1MjI0NjA2MjU2MDM4RS0yNworLTEyMjQ5MTM2NjM3MDQ2MjI2RS0yNQorKzc0ODc0NDQ4Mjg3NDY1NzU3RTI3CistMzU2NDI4MzY4MzI3NTMzMDNFMjQKKy03MTI4NTY3MzY2NTUwNjYwNkUyNAorKzQzNzIzMzM0OTg0OTk3MzA3RS0yNgorKzEwMTgyNDE5ODQ5NTM3OTYzRS0yNAorLTkzNTAxNzAzNTcyNjYxOTgyRS0yNgorCisjIEEgdmFsdWUgdGhhdCBjYXVzZWQgYSBjcmFzaCBpbiBkZWJ1ZyBidWlsZHMgZm9yIFB5dGhvbiA+PSAyLjcsIDMuMQorIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTc2MzIKKzIxODMxNjcwMTIzMTIxMTIzMTIzMTIuMjM1MzgwMjAzNzQ0MjA0NDYxOTJlLTM3MAorCisjIEFub3RoZXIgdmFsdWUgZGVzaWduZWQgdG8gdGVzdCBhIGNvcm5lciBjYXNlIG9mIFB5dGhvbidzIHN0cnRvZCBjb2RlLgorMC45OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OWUrMjMKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9mb3JrX3dhaXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvZm9ya193YWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NDZjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZm9ya193YWl0LnB5CkBAIC0wLDAgKzEsNzkgQEAKKyIiIlRoaXMgdGVzdCBjYXNlIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGNoZWNraW5nIGZvcmtpbmcgYW5kIHdhaXQgYmVoYXZpb3IuCisKK1RvIHRlc3QgZGlmZmVyZW50IHdhaXQgYmVoYXZpb3IsIG92ZXJyaWRlIHRoZSB3YWl0X2ltcGwgbWV0aG9kLgorCitXZSB3YW50IGZvcmsxKCkgc2VtYW50aWNzIC0tIG9ubHkgdGhlIGZvcmtpbmcgdGhyZWFkIHN1cnZpdmVzIGluIHRoZQorY2hpbGQgYWZ0ZXIgYSBmb3JrKCkuCisKK09uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzIHdpdGhvdXQgcG9zaXggdGhyZWFkcykgd2UgZmluZCB0aGF0IGFsbAorYWN0aXZlIHRocmVhZHMgc3Vydml2ZSBpbiB0aGUgY2hpbGQgYWZ0ZXIgYSBmb3JrKCk7IHRoaXMgaXMgYW4gZXJyb3IuCisKK1doaWxlIEJlT1MgZG9lc24ndCBvZmZpY2lhbGx5IHN1cHBvcnQgZm9yayBhbmQgbmF0aXZlIHRocmVhZGluZyBpbgordGhlIHNhbWUgYXBwbGljYXRpb24sIHRoZSBwcmVzZW50IGV4YW1wbGUgc2hvdWxkIHdvcmsganVzdCBmaW5lLiAgREMKKyIiIgorCitpbXBvcnQgb3MsIHN5cywgdGltZSwgdW5pdHRlc3QKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCBhcyB0ZXN0X3N1cHBvcnQKK3RocmVhZCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWQnKQorCitMT05HU0xFRVAgPSAyCitTSE9SVFNMRUVQID0gMC41CitOVU1fVEhSRUFEUyA9IDQKKworY2xhc3MgRm9ya1dhaXQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmFsaXZlID0ge30KKyAgICAgICAgc2VsZi5zdG9wID0gMAorCisgICAgZGVmIGYoc2VsZiwgaWQpOgorICAgICAgICB3aGlsZSBub3Qgc2VsZi5zdG9wOgorICAgICAgICAgICAgc2VsZi5hbGl2ZVtpZF0gPSBvcy5nZXRwaWQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoU0hPUlRTTEVFUCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICMgd2FpdHBpZCgpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZworICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMiAqIFNIT1JUU0xFRVApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGlkLCBjcGlkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCisKKyAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1fVEhSRUFEUyk6CisgICAgICAgICAgICB0aHJlYWQuc3RhcnRfbmV3KHNlbGYuZiwgKGksKSkKKworICAgICAgICB0aW1lLnNsZWVwKExPTkdTTEVFUCkKKworICAgICAgICBhID0gc2VsZi5hbGl2ZS5rZXlzKCkKKyAgICAgICAgYS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCByYW5nZShOVU1fVEhSRUFEUykpCisKKyAgICAgICAgcHJlZm9ya19saXZlcyA9IHNlbGYuYWxpdmUuY29weSgpCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluIFsndW5peHdhcmU3J106CisgICAgICAgICAgICBjcGlkID0gb3MuZm9yazEoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3BpZCA9IG9zLmZvcmsoKQorCisgICAgICAgIGlmIGNwaWQgPT0gMDoKKyAgICAgICAgICAgICMgQ2hpbGQKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoTE9OR1NMRUVQKQorICAgICAgICAgICAgbiA9IDAKKyAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5hbGl2ZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFsaXZlW2tleV0gIT0gcHJlZm9ya19saXZlc1trZXldOgorICAgICAgICAgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgICAgIG9zLl9leGl0KG4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBhcmVudAorICAgICAgICAgICAgc2VsZi53YWl0X2ltcGwoY3BpZCkKKyAgICAgICAgICAgICMgVGVsbCB0aHJlYWRzIHRvIGRpZQorICAgICAgICAgICAgc2VsZi5zdG9wID0gMQorICAgICAgICAgICAgdGltZS5zbGVlcCgyKlNIT1JUU0xFRVApICMgV2FpdCBmb3IgdGhyZWFkcyB0byBkaWUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9mb3JrX3dhaXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcmtfd2FpdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5ODhiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9mb3JrX3dhaXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9mb3JrX3dhaXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcmtfd2FpdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI5ODhiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9mb3JrX3dhaXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9mb3JtYXRmbG9hdF90ZXN0Y2FzZXMudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L2Zvcm1hdGZsb2F0X3Rlc3RjYXNlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlZjA0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9mb3JtYXRmbG9hdF90ZXN0Y2FzZXMudHh0CkBAIC0wLDAgKzEsMzgwIEBACistLSAnZicgY29kZSBmb3JtYXR0aW5nLCB3aXRoIGV4cGxpY2l0IHByZWNpc2lvbiAoPj0gMCkuICBPdXRwdXQgYWx3YXlzCistLSBoYXMgdGhlIGdpdmVuIG51bWJlciBvZiBwbGFjZXMgYWZ0ZXIgdGhlIHBvaW50OyAgemVyb3MgYXJlIGFkZGVkIGlmCistLSBuZWNlc3NhcnkgdG8gbWFrZSB0aGlzIHRydWUuCisKKy0tIHplcm9zCislLjBmIDAgLT4gMAorJS4xZiAwIC0+IDAuMAorJS4yZiAwIC0+IDAuMDAKKyUuM2YgMCAtPiAwLjAwMAorJS41MGYgMCAtPiAwLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCisKKy0tIHByZWNpc2lvbiAwOyAgcmVzdWx0IHNob3VsZCBuZXZlciBpbmNsdWRlIGEgLgorJS4wZiAxLjUgLT4gMgorJS4wZiAyLjUgLT4gMgorJS4wZiAzLjUgLT4gNAorJS4wZiAwLjAgLT4gMAorJS4wZiAwLjEgLT4gMAorJS4wZiAwLjAwMSAtPiAwCislLjBmIDEwLjAgLT4gMTAKKyUuMGYgMTAuMSAtPiAxMAorJS4wZiAxMC4wMSAtPiAxMAorJS4wZiAxMjMuNDU2IC0+IDEyMworJS4wZiAxMjM0LjU2IC0+IDEyMzUKKyUuMGYgMWU0OSAtPiA5OTk5OTk5OTk5OTk5OTk5NDY0OTAyNzY5NDc1NDgxNzkzMTk2ODcyNDE0Nzg5NjMyCislLjBmIDkuOTk5OTk5OTk5OTk5OTk4N2UrNDkgLT4gOTk5OTk5OTk5OTk5OTk5ODY4NjA1ODI0MDY5NTI1NzY0ODkxNzI5Nzk2NTQwNjYxNzYKKyUuMGYgMWU1MCAtPiAxMDAwMDAwMDAwMDAwMDAwMDc2Mjk3Njk4NDEwOTE4ODcwMDMyOTQ5NjQ5NzA5NDY1NjAKKworLS0gcHJlY2lzaW9uIDEKKyUuMWYgMC4wMDAxIC0+IDAuMAorJS4xZiAwLjAwMSAtPiAwLjAKKyUuMWYgMC4wMSAtPiAwLjAKKyUuMWYgMC4wNCAtPiAwLjAKKyUuMWYgMC4wNiAtPiAwLjEKKyUuMWYgMC4yNSAtPiAwLjIKKyUuMWYgMC43NSAtPiAwLjgKKyUuMWYgMS40IC0+IDEuNAorJS4xZiAxLjUgLT4gMS41CislLjFmIDEwLjAgLT4gMTAuMAorJS4xZiAxMDAwLjAzIC0+IDEwMDAuMAorJS4xZiAxMjM0LjU2NzggLT4gMTIzNC42CislLjFmIDEyMzQuNzQ5OSAtPiAxMjM0LjcKKyUuMWYgMTIzNC43NSAtPiAxMjM0LjgKKworLS0gcHJlY2lzaW9uIDIKKyUuMmYgMC4wMDAxIC0+IDAuMDAKKyUuMmYgMC4wMDEgLT4gMC4wMAorJS4yZiAwLjAwNDk5OSAtPiAwLjAwCislLjJmIDAuMDA1MDAxIC0+IDAuMDEKKyUuMmYgMC4wMSAtPiAwLjAxCislLjJmIDAuMTI1IC0+IDAuMTIKKyUuMmYgMC4zNzUgLT4gMC4zOAorJS4yZiAxMjM0NTAwIC0+IDEyMzQ1MDAuMDAKKyUuMmYgMTIzNDU2MCAtPiAxMjM0NTYwLjAwCislLjJmIDEyMzQ1NjcgLT4gMTIzNDU2Ny4wMAorJS4yZiAxMjM0NTY3LjggLT4gMTIzNDU2Ny44MAorJS4yZiAxMjM0NTY3Ljg5IC0+IDEyMzQ1NjcuODkKKyUuMmYgMTIzNDU2Ny44OTEgLT4gMTIzNDU2Ny44OQorJS4yZiAxMjM0NTY3Ljg5MTIgLT4gMTIzNDU2Ny44OQorCistLSBhbHRlcm5hdGUgZm9ybSBhbHdheXMgaW5jbHVkZXMgYSBkZWNpbWFsIHBvaW50LiAgVGhpcyBvbmx5CistLSBtYWtlcyBhIGRpZmZlcmVuY2Ugd2hlbiB0aGUgcHJlY2lzaW9uIGlzIDAuCislIy4wZiAwIC0+IDAuCislIy4xZiAwIC0+IDAuMAorJSMuMGYgMS41IC0+IDIuCislIy4wZiAyLjUgLT4gMi4KKyUjLjBmIDEwLjEgLT4gMTAuCislIy4wZiAxMjM0LjU2IC0+IDEyMzUuCislIy4xZiAxLjQgLT4gMS40CislIy4yZiAwLjM3NSAtPiAwLjM4CisKKy0tIGlmIHByZWNpc2lvbiBpcyBvbWl0dGVkIGl0IGRlZmF1bHRzIHRvIDYKKyVmIDAgLT4gMC4wMDAwMDAKKyVmIDEyMzAwMDAgLT4gMTIzMDAwMC4wMDAwMDAKKyVmIDEyMzQ1NjcgLT4gMTIzNDU2Ny4wMDAwMDAKKyVmIDEyMy40NTY3IC0+IDEyMy40NTY3MDAKKyVmIDEuMjM0NTY3ODkgLT4gMS4yMzQ1NjgKKyVmIDAuMDAwMTIgLT4gMC4wMDAxMjAKKyVmIDAuMDAwMTIzIC0+IDAuMDAwMTIzCislZiAwLjAwMDEyMzQ1IC0+IDAuMDAwMTIzCislZiAwLjAwMDAwMSAtPiAwLjAwMDAwMQorJWYgMC4wMDAwMDA1MDAxIC0+IDAuMDAwMDAxCislZiAwLjAwMDAwMDQ5OTkgLT4gMC4wMDAwMDAKKworLS0gbmFucyBhbmQgaW5maW5pdGllcworJWYgbmFuIC0+IG5hbgorJWYgaW5mIC0+IGluZgorJWYgLWluZmluaXR5IC0+IC1pbmYKKyVGIG5hbiAtPiBOQU4KKyVGIGluZmluaXR5IC0+IElORgorJUYgLWluZiAtPiAtSU5GCisKKy0tICdlJyBjb2RlIGZvcm1hdHRpbmcgd2l0aCBleHBsaWNpdCBwcmVjaXNpb24gKD49IDApLiBPdXRwdXQgc2hvdWxkCistLSBhbHdheXMgaGF2ZSBleGFjdGx5IHRoZSBudW1iZXIgb2YgcGxhY2VzIGFmdGVyIHRoZSBwb2ludCB0aGF0IHdlcmUKKy0tIHJlcXVlc3RlZC4KKworLS0gemVyb3MKKyUuMGUgMCAtPiAwZSswMAorJS4xZSAwIC0+IDAuMGUrMDAKKyUuMmUgMCAtPiAwLjAwZSswMAorJS4xMGUgMCAtPiAwLjAwMDAwMDAwMDBlKzAwCislLjUwZSAwIC0+IDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBlKzAwCisKKy0tIHByZWNpc2lvbiAwLiAgbm8gZGVjaW1hbCBwb2ludCBpbiB0aGUgb3V0cHV0CislLjBlIDAuMDEgLT4gMWUtMDIKKyUuMGUgMC4xIC0+IDFlLTAxCislLjBlIDEgLT4gMWUrMDAKKyUuMGUgMTAgLT4gMWUrMDEKKyUuMGUgMTAwIC0+IDFlKzAyCislLjBlIDAuMDEyIC0+IDFlLTAyCislLjBlIDAuMTIgLT4gMWUtMDEKKyUuMGUgMS4yIC0+IDFlKzAwCislLjBlIDEyIC0+IDFlKzAxCislLjBlIDEyMCAtPiAxZSswMgorJS4wZSAxMjMuNDU2IC0+IDFlKzAyCislLjBlIDAuMDAwMTIzNDU2IC0+IDFlLTA0CislLjBlIDEyMzQ1NjAwMCAtPiAxZSswOAorJS4wZSAwLjUgLT4gNWUtMDEKKyUuMGUgMS40IC0+IDFlKzAwCislLjBlIDEuNSAtPiAyZSswMAorJS4wZSAxLjYgLT4gMmUrMDAKKyUuMGUgMi40OTk5OTk5IC0+IDJlKzAwCislLjBlIDIuNSAtPiAyZSswMAorJS4wZSAyLjUwMDAwMDEgLT4gM2UrMDAKKyUuMGUgMy40OTk5OTk5OTk5OTkgLT4gM2UrMDAKKyUuMGUgMy41IC0+IDRlKzAwCislLjBlIDQuNSAtPiA0ZSswMAorJS4wZSA1LjUgLT4gNmUrMDAKKyUuMGUgNi41IC0+IDZlKzAwCislLjBlIDcuNSAtPiA4ZSswMAorJS4wZSA4LjUgLT4gOGUrMDAKKyUuMGUgOS40OTk5IC0+IDllKzAwCislLjBlIDkuNSAtPiAxZSswMQorJS4wZSAxMC41IC0+IDFlKzAxCislLjBlIDE0Ljk5OSAtPiAxZSswMQorJS4wZSAxNSAtPiAyZSswMQorCistLSBwcmVjaXNpb24gMQorJS4xZSAwLjAwMDEgLT4gMS4wZS0wNAorJS4xZSAwLjAwMSAtPiAxLjBlLTAzCislLjFlIDAuMDEgLT4gMS4wZS0wMgorJS4xZSAwLjEgLT4gMS4wZS0wMQorJS4xZSAxIC0+IDEuMGUrMDAKKyUuMWUgMTAgLT4gMS4wZSswMQorJS4xZSAxMDAgLT4gMS4wZSswMgorJS4xZSAxMjAgLT4gMS4yZSswMgorJS4xZSAxMjMgLT4gMS4yZSswMgorJS4xZSAxMjMuNCAtPiAxLjJlKzAyCisKKy0tIHByZWNpc2lvbiAyCislLjJlIDAuMDAwMTMgLT4gMS4zMGUtMDQKKyUuMmUgMC4wMDAxMzUgLT4gMS4zNWUtMDQKKyUuMmUgMC4wMDAxMzU3IC0+IDEuMzZlLTA0CislLjJlIDAuMDAwMSAtPiAxLjAwZS0wNAorJS4yZSAwLjAwMSAtPiAxLjAwZS0wMworJS4yZSAwLjAxIC0+IDEuMDBlLTAyCislLjJlIDAuMSAtPiAxLjAwZS0wMQorJS4yZSAxIC0+IDEuMDBlKzAwCislLjJlIDEwIC0+IDEuMDBlKzAxCislLjJlIDEwMCAtPiAxLjAwZSswMgorJS4yZSAxMDAwIC0+IDEuMDBlKzAzCislLjJlIDE1MDAgLT4gMS41MGUrMDMKKyUuMmUgMTU5MCAtPiAxLjU5ZSswMworJS4yZSAxNTk4IC0+IDEuNjBlKzAzCislLjJlIDE1OTguNyAtPiAxLjYwZSswMworJS4yZSAxNTk4Ljc2IC0+IDEuNjBlKzAzCislLjJlIDk5OTkgLT4gMS4wMGUrMDQKKworLS0gb21pdHRlZCBwcmVjaXNpb24gZGVmYXVsdHMgdG8gNgorJWUgMCAtPiAwLjAwMDAwMGUrMDAKKyVlIDE2NSAtPiAxLjY1MDAwMGUrMDIKKyVlIDEyMzQ1NjcgLT4gMS4yMzQ1NjdlKzA2CislZSAxMjM0NTY3OCAtPiAxLjIzNDU2OGUrMDcKKyVlIDEuMSAtPiAxLjEwMDAwMGUrMDAKKworLS0gYWx0ZXJuYXRlIGZvcm0gYWx3YXlzIGNvbnRhaW5zIGEgZGVjaW1hbCBwb2ludC4gIFRoaXMgb25seSBtYWtlcworLS0gYSBkaWZmZXJlbmNlIHdoZW4gcHJlY2lzaW9uIGlzIDAuCisKKyUjLjBlIDAuMDEgLT4gMS5lLTAyCislIy4wZSAwLjEgLT4gMS5lLTAxCislIy4wZSAxIC0+IDEuZSswMAorJSMuMGUgMTAgLT4gMS5lKzAxCislIy4wZSAxMDAgLT4gMS5lKzAyCislIy4wZSAwLjAxMiAtPiAxLmUtMDIKKyUjLjBlIDAuMTIgLT4gMS5lLTAxCislIy4wZSAxLjIgLT4gMS5lKzAwCislIy4wZSAxMiAtPiAxLmUrMDEKKyUjLjBlIDEyMCAtPiAxLmUrMDIKKyUjLjBlIDEyMy40NTYgLT4gMS5lKzAyCislIy4wZSAwLjAwMDEyMzQ1NiAtPiAxLmUtMDQKKyUjLjBlIDEyMzQ1NjAwMCAtPiAxLmUrMDgKKyUjLjBlIDAuNSAtPiA1LmUtMDEKKyUjLjBlIDEuNCAtPiAxLmUrMDAKKyUjLjBlIDEuNSAtPiAyLmUrMDAKKyUjLjBlIDEuNiAtPiAyLmUrMDAKKyUjLjBlIDIuNDk5OTk5OSAtPiAyLmUrMDAKKyUjLjBlIDIuNSAtPiAyLmUrMDAKKyUjLjBlIDIuNTAwMDAwMSAtPiAzLmUrMDAKKyUjLjBlIDMuNDk5OTk5OTk5OTk5IC0+IDMuZSswMAorJSMuMGUgMy41IC0+IDQuZSswMAorJSMuMGUgNC41IC0+IDQuZSswMAorJSMuMGUgNS41IC0+IDYuZSswMAorJSMuMGUgNi41IC0+IDYuZSswMAorJSMuMGUgNy41IC0+IDguZSswMAorJSMuMGUgOC41IC0+IDguZSswMAorJSMuMGUgOS40OTk5IC0+IDkuZSswMAorJSMuMGUgOS41IC0+IDEuZSswMQorJSMuMGUgMTAuNSAtPiAxLmUrMDEKKyUjLjBlIDE0Ljk5OSAtPiAxLmUrMDEKKyUjLjBlIDE1IC0+IDIuZSswMQorJSMuMWUgMTIzLjQgLT4gMS4yZSswMgorJSMuMmUgMC4wMDAxMzU3IC0+IDEuMzZlLTA0CisKKy0tIG5hbnMgYW5kIGluZmluaXRpZXMKKyVlIG5hbiAtPiBuYW4KKyVlIGluZiAtPiBpbmYKKyVlIC1pbmZpbml0eSAtPiAtaW5mCislRSBuYW4gLT4gTkFOCislRSBpbmZpbml0eSAtPiBJTkYKKyVFIC1pbmYgLT4gLUlORgorCistLSAnZycgY29kZSBmb3JtYXR0aW5nLgorCistLSB6ZXJvcworJS4wZyAwIC0+IDAKKyUuMWcgMCAtPiAwCislLjJnIDAgLT4gMAorJS4zZyAwIC0+IDAKKyUuNGcgMCAtPiAwCislLjEwZyAwIC0+IDAKKyUuNTBnIDAgLT4gMAorJS4xMDBnIDAgLT4gMAorCistLSBwcmVjaXNpb24gMCBkb2Vzbid0IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgZm9yIHRoZSAnZycgY29kZSAod2hhdCBkb2VzCistLSBpdCBtZWFuIHRvIGhhdmUgbm8gc2lnbmlmaWNhbnQgZGlnaXRzPyk7IGluIHByYWN0aWNlLCBpdCdzIGludGVycHJldGVkCistLSBhcyBpZGVudGljYWwgdG8gcHJlY2lzaW9uIDEKKyUuMGcgMTAwMCAtPiAxZSswMworJS4wZyAxMDAgLT4gMWUrMDIKKyUuMGcgMTAgLT4gMWUrMDEKKyUuMGcgMSAtPiAxCislLjBnIDAuMSAtPiAwLjEKKyUuMGcgMC4wMSAtPiAwLjAxCislLjBnIDFlLTMgLT4gMC4wMDEKKyUuMGcgMWUtNCAtPiAwLjAwMDEKKyUuMGcgMWUtNSAtPiAxZS0wNQorJS4wZyAxZS02IC0+IDFlLTA2CislLjBnIDEyIC0+IDFlKzAxCislLjBnIDEyMCAtPiAxZSswMgorJS4wZyAxLjIgLT4gMQorJS4wZyAwLjEyIC0+IDAuMQorJS4wZyAwLjAxMiAtPiAwLjAxCislLjBnIDAuMDAxMiAtPiAwLjAwMQorJS4wZyAwLjAwMDEyIC0+IDAuMDAwMQorJS4wZyAwLjAwMDAxMiAtPiAxZS0wNQorJS4wZyAwLjAwMDAwMTIgLT4gMWUtMDYKKworLS0gcHJlY2lzaW9uIDEgaWRlbnRpY2FsIHRvIHByZWNpc2lvbiAwCislLjFnIDEwMDAgLT4gMWUrMDMKKyUuMWcgMTAwIC0+IDFlKzAyCislLjFnIDEwIC0+IDFlKzAxCislLjFnIDEgLT4gMQorJS4xZyAwLjEgLT4gMC4xCislLjFnIDAuMDEgLT4gMC4wMQorJS4xZyAxZS0zIC0+IDAuMDAxCislLjFnIDFlLTQgLT4gMC4wMDAxCislLjFnIDFlLTUgLT4gMWUtMDUKKyUuMWcgMWUtNiAtPiAxZS0wNgorJS4xZyAxMiAtPiAxZSswMQorJS4xZyAxMjAgLT4gMWUrMDIKKyUuMWcgMS4yIC0+IDEKKyUuMWcgMC4xMiAtPiAwLjEKKyUuMWcgMC4wMTIgLT4gMC4wMQorJS4xZyAwLjAwMTIgLT4gMC4wMDEKKyUuMWcgMC4wMDAxMiAtPiAwLjAwMDEKKyUuMWcgMC4wMDAwMTIgLT4gMWUtMDUKKyUuMWcgMC4wMDAwMDEyIC0+IDFlLTA2CisKKy0tIHByZWNpc2lvbiAyCislLjJnIDEwMDAgLT4gMWUrMDMKKyUuMmcgMTAwIC0+IDFlKzAyCislLjJnIDEwIC0+IDEwCislLjJnIDEgLT4gMQorJS4yZyAwLjEgLT4gMC4xCislLjJnIDAuMDEgLT4gMC4wMQorJS4yZyAwLjAwMSAtPiAwLjAwMQorJS4yZyAxZS00IC0+IDAuMDAwMQorJS4yZyAxZS01IC0+IDFlLTA1CislLjJnIDFlLTYgLT4gMWUtMDYKKyUuMmcgMTIzNCAtPiAxLjJlKzAzCislLjJnIDEyMyAtPiAxLjJlKzAyCislLjJnIDEyLjMgLT4gMTIKKyUuMmcgMS4yMyAtPiAxLjIKKyUuMmcgMC4xMjMgLT4gMC4xMgorJS4yZyAwLjAxMjMgLT4gMC4wMTIKKyUuMmcgMC4wMDEyMyAtPiAwLjAwMTIKKyUuMmcgMC4wMDAxMjMgLT4gMC4wMDAxMgorJS4yZyAwLjAwMDAxMjMgLT4gMS4yZS0wNQorCistLSBhbHRlcm5hdGUgZyBmb3JtYXR0aW5nOiAgYWx3YXlzIGluY2x1ZGUgZGVjaW1hbCBwb2ludCBhbmQKKy0tIGV4YWN0bHkgPHByZWNpc2lvbj4gc2lnbmlmaWNhbnQgZGlnaXRzLgorJSMuMGcgMCAtPiAwLgorJSMuMWcgMCAtPiAwLgorJSMuMmcgMCAtPiAwLjAKKyUjLjNnIDAgLT4gMC4wMAorJSMuNGcgMCAtPiAwLjAwMAorCislIy4wZyAwLjIgLT4gMC4yCislIy4xZyAwLjIgLT4gMC4yCislIy4yZyAwLjIgLT4gMC4yMAorJSMuM2cgMC4yIC0+IDAuMjAwCislIy40ZyAwLjIgLT4gMC4yMDAwCislIy4xMGcgMC4yIC0+IDAuMjAwMDAwMDAwMAorCislIy4wZyAyIC0+IDIuCislIy4xZyAyIC0+IDIuCislIy4yZyAyIC0+IDIuMAorJSMuM2cgMiAtPiAyLjAwCislIy40ZyAyIC0+IDIuMDAwCisKKyUjLjBnIDIwIC0+IDIuZSswMQorJSMuMWcgMjAgLT4gMi5lKzAxCislIy4yZyAyMCAtPiAyMC4KKyUjLjNnIDIwIC0+IDIwLjAKKyUjLjRnIDIwIC0+IDIwLjAwCisKKyUjLjBnIDIzNC41NiAtPiAyLmUrMDIKKyUjLjFnIDIzNC41NiAtPiAyLmUrMDIKKyUjLjJnIDIzNC41NiAtPiAyLjNlKzAyCislIy4zZyAyMzQuNTYgLT4gMjM1LgorJSMuNGcgMjM0LjU2IC0+IDIzNC42CislIy41ZyAyMzQuNTYgLT4gMjM0LjU2CislIy42ZyAyMzQuNTYgLT4gMjM0LjU2MAorCistLSBuYW5zIGFuZCBpbmZpbml0aWVzCislZyBuYW4gLT4gbmFuCislZyBpbmYgLT4gaW5mCislZyAtaW5maW5pdHkgLT4gLWluZgorJUcgbmFuIC0+IE5BTgorJUcgaW5maW5pdHkgLT4gSU5GCislRyAtaW5mIC0+IC1JTkYKKworLS0gZm9yIHJlcHIgZm9ybWF0dGluZyBzZWUgdGhlIHNlcGFyYXRlIHRlc3Rfc2hvcnRfcmVwciB0ZXN0IGluCistLSB0ZXN0X2Zsb2F0LnB5LiAgTm90IGFsbCBwbGF0Zm9ybXMgdXNlIHNob3J0IHJlcHIgZm9yIGZsb2F0cy4KKworLS0gc3RyIGZvcm1hdHRpbmcuICBSZXN1bHQgYWx3YXlzIGluY2x1ZGVzIGRlY2ltYWwgcG9pbnQgYW5kIGF0CistLSBsZWFzdCBvbmUgZGlnaXQgYWZ0ZXIgdGhlIHBvaW50LCBvciBhbiBleHBvbmVudC4KKyVzIDAgLT4gMC4wCislcyAxIC0+IDEuMAorCislcyAwLjAxIC0+IDAuMDEKKyVzIDAuMDIgLT4gMC4wMgorJXMgMC4wMyAtPiAwLjAzCislcyAwLjA0IC0+IDAuMDQKKyVzIDAuMDUgLT4gMC4wNQorCistLSBzdHIgdHJ1bmNhdGVzIHRvIDEyIHNpZ25pZmljYW50IGRpZ2l0cworJXMgMS4yMzQxMjM0MTIzNDEgLT4gMS4yMzQxMjM0MTIzNAorJXMgMS4yMzQxMjM0MTIzNCAtPiAxLjIzNDEyMzQxMjM0CislcyAxLjIzNDEyMzQxMjMgLT4gMS4yMzQxMjM0MTIzCisKKy0tIHZhbHVlcyA+PSAxZTExIGdldCBhbiBleHBvbmVudAorJXMgMTAgLT4gMTAuMAorJXMgMTAwIC0+IDEwMC4wCislcyAxZTEwIC0+IDEwMDAwMDAwMDAwLjAKKyVzIDkuOTk5ZTEwIC0+IDk5OTkwMDAwMDAwLjAKKyVzIDk5OTk5OTk5OTk5IC0+IDk5OTk5OTk5OTk5LjAKKyVzIDk5OTk5OTk5OTk5LjkgLT4gOTk5OTk5OTk5OTkuOQorJXMgOTk5OTk5OTk5OTkuOTkgLT4gMWUrMTEKKyVzIDFlMTEgLT4gMWUrMTEKKyVzIDFlMTIgLT4gMWUrMTIKKworLS0gYXMgZG8gdmFsdWVzIDwgMWUtNAorJXMgMWUtMyAtPiAwLjAwMQorJXMgMS4wMDFlLTQgLT4gMC4wMDAxMDAxCislcyAxLjAwMDAwMDAwMDAwMWUtNCAtPiAwLjAwMDEKKyVzIDEuMDAwMDAwMDAwMDFlLTQgLT4gMC4wMDAxMDAwMDAwMDAwMDEKKyVzIDEuMDAwMDAwMDAwMWUtNCAtPiAwLjAwMDEwMDAwMDAwMDAxCislcyAxZS00IC0+IDAuMDAwMQorJXMgMC45OTk5OTk5OTk5OTllLTQgLT4gOS45OTk5OTk5OTk5OWUtMDUKKyVzIDAuOTk5ZS00IC0+IDkuOTllLTA1CislcyAxZS01IC0+IDFlLTA1CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZ2RiX3NhbXBsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MzJiMjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvZ2RiX3NhbXBsZS5weQpAQCAtMCwwICsxLDEyIEBACisjIFNhbXBsZSBzY3JpcHQgZm9yIHVzZSBieSB0ZXN0X2dkYi5weQorCitkZWYgZm9vKGEsIGIsIGMpOgorICAgIGJhcihhLCBiLCBjKQorCitkZWYgYmFyKGEsIGIsIGMpOgorICAgIGJheihhLCBiLCBjKQorCitkZWYgYmF6KCphcmdzKToKKyAgICBwcmludCg0MikKKworZm9vKDEsIDIsIDMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZ2RiX3NhbXBsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvZ2RiX3NhbXBsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5ZGE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZ2RiX3NhbXBsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvZ2RiX3NhbXBsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5ZGE0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9nZGJfc2FtcGxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvZ3JleXJnYi51dWUgYi9saWIvcHl0aG9uMi43L3Rlc3QvZ3JleXJnYi51dWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYmViYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9ncmV5cmdiLnV1ZQpAQCAtMCwwICsxLDE1NDcgQEAKK2JlZ2luIDY0NCBncmV5dGVzdC5yZ2IKK00gPUghIDAgIiAwICEgICAhICAgICIwICAgKSggICAgIDtGXEA7RiVNOTAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgISAgIiAgICAgICNfICAgICAgICAgICAgICAgICQgJS0KK01cICAgICAgICAwXTwkICUlWiEgITI+UCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgIEggICAgKyFAICAjIEwgICBUMSAgIC4lQCAgI1FIICAhID4KK00gICAxKFAgICRCRCAgISxPICAgNC0gICAlM0ggICE4XyAgIDcxMCAgJiRIICAhRTAgICA6NTAgICZVRCAKK00gIVE/ICAgPTkwICAnRkggICFdUCAgIEA9QCAgKDdEICAiKV4gICBDQSAgICkoRCAgIjYvICAgRkUgICAKK00pWUggICJCPiAgIElJICAgKkpIICAiTlAgICBMTTAgICs7RCAgIlpfICAgT1EgICAsLEAgICMnLCAgIFIKK01UICAgLF00ICAjMzkgICBVV1AgIC1ONCAgIz9KICAgWFwgICAuPzAgICNLWCAgIFtfICAgLzAoICAjWCcKK00gICBfIkAgIDAhICAgJCQ1ICAhIiZQICAwUiQgICQwRyAgISUrMCAgMUMoICAkPFggICEoL0AgIDI0KCAKK00gJEkoICAhKzNAICAzJSggICRVOCAgIS43QCAgM1YwICAlIUogICExPCAgIDRHNCAgJS1aICAhNEAgICAKK001ODggICU6LCAgITdEMCAgNik4ICAlRjsgICE6SCAgIDZaMCAgJVJIICAhPUswICA3SyggICVeWCAgIUAKK01PQCAgODwwICAmKyogICFDUzAgIDktKCAgJjc3ICAhRlcgICA5XiggICZDSCAgIUlbQCAgOk8wICAmT1oKK00gICFMX1AgIDtALCAgJlwpICAhUCNAICA8MSggICcoOCAgIVMnQCAgPSIsICAnNEkgICFWK1AgID1TLCAKK00gJ0BZICAhWS9QICA+RDAgICdNKiAgIVw0ICAgPzU4ICAnWTogICFfOCAgIEAmMCAgKCVJICAiIjtQICAKK01AVzQgICgxWyAgIiU/UCAgQUg0ICAoPiogICIoRCAgIEI5OCAgKEo8ICAiK0hAICBDKkAgIChWTiAgIi4KK01MQCAgQ1s4ICApIlogICIxT1AgIERMMCAgKS8qICAiNFQgICBFPTggICk7PCAgIjdYQCAgRi5AICApR00KK00gICI6XEAgIEZfQCAgKVNcICAiPiBAICBHUEAgICogLiAgIkEkUCAgSEE8ICAqLDwgICJEKDAgIEkyOCAKK00gKjhLICAiRywgICBKIzggICpEWyAgIkowMCAgSlQ8ICAqUS0gICJNNFAgIEtFRCAgKl0+ICAiUDkgICAKK01MNkggICspUCAgIlM9ICAgTSdIICArNiAgICJWQUAgIE1YTCAgK0IvICAiWURQICBOSTwgICtOPSAgIlwKK01IUCAgTzpEICArWk4gICJfTSAgIFArSCAgLCcgICAjIlFAICBQXFAgICwzMSAgIyVVUCAgUU1UICAsP0MKK00gICMoWiAgIFI+VCAgLEtTICAjK11QICBTL1AgICxYIiAgIy8iICAgVCBUICAtJDIgICMyJiAgIFRRWCAKK00gLTBEICAjNSpAICBVQlwgIC08VSAgIzguQCAgVjNYICAtSSMgICM7MiAgIFckVCAgLVUzICAjPjYwICAKK01XVVwgIC4hRSAgI0E6UCAgWEcgICAuLVQgICNEPjAgIFk3VCAgLjojICAjR0IwICBaKFwgIC5GNCAgI0oKK01GMCAgWllcICAuUkQgICNNSiAgIFtKWCAgLl5UICAjUE4wICBcO1wgIC8rJSAgI1NSQCAgXS0gICAvNzYKK00gICNWVlAgIF1eICAgL0NGICAjWVpQICBeTyAgIC9PVSAgI1xeUCAgX0AkICAvXCcgICQgIyAgISAxKCAKK00gMCg2ICAkIyZQICEhIiQgIDA0RyAgJCYrICAhIVMoICAwQFggICQpLyAgISJEKCAgME0nICAkLDMgICEKK00jNSQgIDBZNiAgICEhQCAgIDA0ICAgJCYgICAhITAgICAwMCAgICQkICAgISEwICAgMDggICAkJiAgICEKK00hMCAgIDA4ICAgJCUgICAhIUAgICAwNCAgICQmICAgISEwICAgMDAgICAkJiAgICEhQCAgIDA0ICAgJCYKK00gICAhIUAgICAwLCAgICQlICAgISFAICAgMDQgICAkJiAgICEhMCAgIDA4ICAgJCQgICAhIUAgICAwOCAKK00gICQmICAgISEwICAgMDAgICAkJiAgICEhMCAgIDAwICAgJCQgICAhISAgICAwNCAgICQkICAgISFAICAKK00gMDggICAkJSAgICEhQCAgIDAwICAgJCQgICAhISAgICAwOCAgICQlICAgISBQICAgMDggICAkJSAgICEKK00hQCAgIDA4ICAgJCYgICAhIUAgICAwNCAgICQmICAgISFAICAgMDAgICAkJiAgICEhQCAgIDAwICAgJCYKK00gICAhIUAgICAwOCAgICQmICAgISFAICAgMDQgICAkJSAgICEhQCAgIDA4ICAgJCYgICAhITAgICAwNCAKK00gICQlICAgISEwICAgMDAgICAkJCAgICEhMCAgIDA0ICAgJCYgICAhIUAgICAwOCAgICQmICAgISBQICAKK00gMDQgICAkJSAgICEhMCAgIDA4ICAgJCYgICAhIUAgICAwOCAgICQmICAgISEwICAgMDAgICAkJiAgICEKK00hMCAgIDAwICAgJCYgICAhIUAgICAwNCAgICQmICAgISFAICAgMDAgICAkJiAgICEhQCAgIDA0ICAgJCYKK00gICAhIUAgICAwOCAgICQkICAgISFAICAgMDAgICAkJSAgICEhQCAgIDA4ICAgJCYgICAhISAgICAwOCAKK00gICQlICAgISFAICAgMDggICAkJiAgICEhQCAgIDA4ICAgJCYgICAhISAgICAwMCAgICQkICAgISEwICAKK00gMDQgICAkJiAgICEhQCAgIDA4ICAgJCYgICAhIUAgICAwOCAgICQlICAgISEwICAgMDggICAkJCAgICEKK00hQCAgIDA4ICAgJCYgICAhITAgICAwMCAgICQlICAgISEwICAgMDQgICAkJSAgICEhMCAgIDA4ICAgJCUKK00gICAhIUAgICAwOCAgICQmICAgISFAICAgMDggICAkJSAgICEhQCAgIDA4ICAgJCYgICAhISAgICAwOCAKK00gICQmICAgISFAICAgMDQgICAkJCAgICEhICAgIDAwICAgJCYgICAhIUAgICAwOCAgICQlICAgISFAICAKK00gMDggICAkJiAgICEhQCAgIDA4ICAgJCUgICAhIUAgICAwOCAgICQmICAgISEwICAgMDQgICAkJiAgICEKK00hICAgIDA0ICAgJCYgICAhIUAgICAwNCAgICQlICAgISFAICAgMDggICAkJiAgICEhQCAgIDA0ICAgJCYKK00gICAhITAgICAwMCAgICQlICAgISEwICAgMDQgICAkJiAgICEhQCAgIDA4ICAgJCYgICAhIUAgICAwNCAKK00gICQkICAgISEwICAgMDAgICAkJiAgICEhQCAgIDA4ICAgJCUgICAhITAgICAwOCAgICQlICAgISEgICAKK00gMDggICAkJiAgICEhMCAgIDA4ICAgJCYgICAhITAgICAwOCAgICQmICAgISEwICAgMDQgICAkJiAgICEKK00hMCAgIDA0ICAgJCUgICAhIUAgICAwOCAgICQmICAgISEwICAgMDggICAkJCAgICEhMCAgIDA4ICAgJCYKK00gICAhITAgICAwOCAgICQmICAgISEgICAgMDggICAkJSAgICEhMCAgIDA0ICAgJCUgICAhIU9aKkBFQTYKK00qMzE1NiQ1OjZUVUY8REU4L1I0TSxDIF4xNjoiPTdVUDJTXUk8Rk07NiYtQjEzRU86JF0kKzU5PDxHPSUKK00xJUlSPzdJUTpGJUM2RUlIMjQ1PzlVQS88R1ReNjVJQjpHKU49SElNNkNdKTYmXUI6IyAuLUdWJjxGKUEKK005KClALEI0TSUzRVo4RkFCOEYhIjI0VUM4Vk04KzIgPSZTRVVAV0lNQkRTXiRARDUrNkVKNlVITSkzKF4KK00xNilSPEZFOjhGPUo8Rk0vNiVRQjhGLTs2RTkpNkU5QjpHLUs2Vi1JOFVBKS9GJUo5RilCO0c1VT83SUgKK00vU1E/OFctUzo0RUA/Jy1KOEYgRSYkUig4NDReOjZdQjolMEkkRUBJI0EoTTI1OT86Jy1aO1RBSDgkMSQKK00vRilPNiVBJTZWJF8zWCIqOCI8VjpWSVQ/J1VAKzNcWUBEUTYgNDQhOkAiKD5ISUksIzkkNiVEIy4/WSQKK009VzVIOCVEXyoxQEArMyEwPEY5SzhFQF84Vz1COlYtQjVCVEUxNiVIN0Q0TSwmXVcyJFE6NlcpXDs1TVIKK006VUk6OCMhJTpXPUcxNi1aKjVBNjY2UVo7RlohOEYtOCczIUI4RUg7I0E1LTtFSS84VVFGPVNYTS8jKFYKK002QylIQEZNSzxGUTs4VilLOlRFNS5RNEA4SEoqPTg1Ui8hQC4oRkFOOEYgWyRCT1U2JTUkOkdVWjhUVUMKK006Vk1DN0YpSjtWTUAzViFKNjVFLTEkQUo4U104NyZBLS9DWTs4JiFIOEYpWj43KVU6RUElOjVNS0A0XFkKK004SC1WPlZFOC1DUTtAVyBWKzRRTzMjPTY0IVUpMSMgNSYjTSQ4JyFDPEchODMjWSQ6JUEtO0VBOCszOSsKK002JUlaQydJKy9GRUo7R1YiPiREVi5URUAgM0QhMSAjXjw4KVAtRUFBOEZJPysxTEU8KClGOFYtPzIyRE0KK00uUlUtOkYpQjMjOE0zVyFCO1cpOC4zREcmU0VANiVASSc2KVs6Ri1AMzZJUjZUXVI6RUlJL0I9ODxHSUsKK002JF1HL1U5JDZHKVI7NylSNCcpSCxCVTg8RThNKlNFNTomISc2RkVCPlVAVjwmITovUU0pPEcpWkBXKToKK005RU1CPEU5QTEhKDUxJ0oqPTc1XV9HMFIjQUEpOkZJVzoiIDsyNkFCPDc1TjhENSQ4RylKOEVdMD5HKUAKK00xNz1bOEZJSDIzWUA5VDUlOEZFLS4zUS03VilLNUI9QkAnKVo6RkU7OyRVRkBUTFY6SC1OPzctODI1SVcKK00+VyEpMjRdSzIyNFY1RDE2OjYkQCYjKFwxNkUtNlNETTdWSTo9V0laOkZNQC1BTEUrMzlGPydJODM2TToKK005R1YiQEZJJS9YKSU6UCRWIDVAIFwnKU0+Ri07NlYpVj1SVC4pNi4oOEYtUDxGJFYtRiBeNkZJPzM2WFsKK00mUlU7NkgiIjozWFYvIiBSMjM5NjEjOTs8V0FJNyVdRzhVRSU8JFUlOiNYSTE2KVI9VkEpMVU5LCtVQUcKK006RU08OlYtUjlFQFkxOCFKNURFSDpHIUM4JEUxO1dJQjI1QSkpVllALUMpOD1WTUozNzQjOE9ZKTIyVDUKK00kQlVCPEZJSj02VUAsQiBWMzYpXD1SNC4mUzlCPjcpSzlEVSUzJk1KOEZBJTlHSSwrNl1XOkcpSzZDXTkKK006JFU1OkcpSDgkMFkyNU08MjI0RTgmTVI5RU07PCctWj1URTk+SClOPyc5QDdFRUo8RlkwPkgqIDpENTsKK00yM0UpOiZcUClSRTg2JUlAOFE0MiwmQSU8J0lVPkdJSjciVEAlMjUtOkVSLTMzOUE6RklaPygpWjZVQUAKK008UCU4IDZEIFInKTE6Rik4OFVJTT9FUDspNTlTMSRVVz83IFYuNkEtMyRRNjI3KUgtQyhWMSdKIjxFXTUKK001M1k0NTIgXzglQSk2Ji05NkZdUjZERF86JERZOFZFPjZGKU0+Rl0pLCRQTShALSlaNUEpNicpUjlGRS0KK001RyojNkRVQjpGSSQ2RThNMydVWjI0VU43RUktLUJVOz9WKUs2RylSOlYpKTYjXFIrMzlANkZBQzlGOUoKK003IzhWL1YpVT1SVEAmITU2PEZVSjpFXTguNUlBOEZdKDInNFYmU0UsOkdNTTokRSU4JThWMzctSjo2ISkKK002JklIL0IgNSswLSRRVFUtO1dJXzgiVFs3SCldO0ZNQjZVWTo6RlE7PzhGKjxFSUM4MzhQOjVEQioxTSkKK004JDU2OlIoSTEjRFY4VllSQVgtXT1VXFYsQ1lKPkRQWSgjOUw8RlVdPTc9QDM2XVsgN0ghPCAiQkA2WUIKK000NEFANjYtUj1TXFQuNVxNLjZdXUAmKTo8Jl06MTREXj43KUAuUlU/PkAtUl9HIUYzJiFOKCI1KThFSSUKK00vUzklOkghQjMjWSk2JEU7PkdJTDxHSVo8RTRWOCRFJDI0RF8vQzhZOCVNQjpFIUI4SClaN0VFSj0zWFkKK002MUxJPUdJJTE1WVs+RyRfJlM5WjhWTUI9NzVSOERdLzhWRTYzJik7OFZdRjxGOTkxNEU4NkZJVzdVNFsKK00sRi1SPEY5UTpGLS82Il0lO1YpQjpVMEAoIzk7PkcpUTg6ME0yNERHMTZNPDhWQUI4V01SOVMoOC5VQSQKK00tRUEkODcxTC9CNEksJzYiOCYtSDE2OCQ6WU1OQCg5XTlGLUEvUjU/NyI0SygiVFk1NFVKMjZRSSsyVToKK002RVgjPkhVXTpVSSkyNiojODMoOChFUVogVjolOkYhLTpXKCE+QCVXIC9ZW0FHPUA2I0UtNkYpUzolQTUKK00xNkVPPEdBWUBHTiJCRyEpLSEpQjlGKTArNUlTN0UhTT5WXSw2Ny01KCJVKTglQEslMzlAPkctUjgjXTgKK00zNk4iO0QxLzxIKVo6VUEtMjVJKSsyVFY2IyBWL1RVSjhGTUg6SClKNkVNQzgkRTUsI1FSOlRVOS9VSVoKK01ARlRAMictRj1GSUI4RlVTOERVQzxYLVU6VyFSNjQ2Sz5HSUI0NFVHOiVFSkBHKUI2RklKOlZaID5WWUsKK006I0xWN0VFSj1WLSQkQjVKPkc1Tj1UREAmUlU/OkAtOk40NSg+V01LKzFBKTxGSTg6Vi0pODRMOyYiRF8KK00+JlU6OUZEVjM3LVM7JkU7PTdBXT1HKUs2VUEtNyM5JC9TMDsvViFCMTZJSCs0NTs2QC1DRUZNSz02TToKK00yNTlCN0NcTS1GIUwvVFFLOFVJQjpGSCE4QCUkIC9ZR0BHVVM2IyEkOCYhOjYjRSQrNiFLOlZJUj5HPUQKK00/Nz1NM1I1ODIzRFIrNUVCOiRVQj5HISkzN0lPL1MoUi5UTEUmIlVBOkcpVzMzWU0zNkoiOlM4VjQ2WVUKK00+Rl0sMSVRNixCNFI3RDBSLUMhNjElIUAzNklSOlZFQjhVTUEyNTlKNjRVQi9TOUs+RkxFKTVJSzpWKFkKK00vRilSPEVNOjQnVio7NkFKNkRHXjxHTUo6VilaPERRJD03IUY6JSE7OEY5Vj83VVU8RjxeMjMxQzxGKSQKK00lMkVCPTcpMD5IIFsmU1E4MyVJSDgjOEc6R0lAJlBYTThGSUs+Vz1JOCNcOCUxNE08NUksOFchKS9GRVoKK008Rl1GNFVSIj4nSUw7Ryk6NkRFLDY1WEUrNTUtPVZJRj5GSTs6JiElL1NcVi9WIF4pM1ksOFZNQjhFQFIKK00rM0VLO1ZBSEBHKVogNzwhNjAjXjpXNVY/JFRfMjRVQS9TOFYuUUxWMzU5OjcmSVI2NjlCMzZBRjYkRFsKK00oIjRWL1YhODhHPU82RFVSPEZBJDEzUFwqUFg7MjZdQjpERFY6JUlDP0VIUDI2VTs0V1VaNkQxNjkkVFwKK00rNUE6MjYgXi9WOUg6JUU7OEZNQzE0VUo6Ri1COiQxODZVQTo6RylBMDMxJTM2KTYrMjRPNkZNUjhEMUIKK01BNiklMyVJP19FUU06RlVLO0c9RzY3JVk8RkxZNUVRPDhGOVo9N1FaNjQoTTZXKTo4IzhNMyYpSCo1IiMKK006IlRZMTM4VzhGSF8qNkFaNkI0OCk0VTo6RzVaOlY9OSpRQC4oJU1QOiVBSzgzXS08N0laOUYhLT03NVMKK002V0ojOFVNQTYmIUkvIkRWNTchPDInKUs8Jk1DNiNdJC9ERUM2REReKzYtUjpWRS0qMlRFMTchQzZYKUIKK009QCYiIDZEIEJGKUI5R0xWLUVBSjolSCMyP1hfMjU5ODYlOTo8RylPOjQxQDxWLTg1MkRLLSM5KTYlRUMKK006Rj1SOlZJSzglNF4tQyAuI0JVSDpGKSUzVylKPEdcXiYiNT84NFFSPEVZKS1DWTY2M1BeMyYhUjoiPUAKK00+RylaNjRRQjpFWF81Rl1KOlY9PjI0RUI8RzVaPUdJUjhGITg2NTBJJlI0WTxGXUc7WClIL0M5OD1WKScKK003VSE6PEY5UDpGOVI+RktTNSRRQjpWKTw5RU4iQEchOjI2XU8zJkE+MjU5KTZDWSw+R0lJN1VFJS1DRUMKK00yM1lCPkY8Wy5UMTk2NUk2MzYpSjokREUmIEQ7MlVBLDZFRF4vUlUlOlVNUj5HOVU6RFFOQkc9QzZUUUgKK006VTRbKzVBTjxVSTo4VylOO0c9QzM0VUg6Vk1KNUI0WTpWLUs2VDEpLlJVPzZEUSc6UCVdIDZMIF9FXSUKK004KCBWKzNFSjs0UUEyNEU+OCYtSjomITY8KCFaPVRdODpXSUo4IzhbLEJVKTlVXSwzJilbPDYpRzo1QE0KK00uU0RAJiEoXztWVSkzNylXQEgpNCghQEUyNU1GOkYpOS1DTFA2JDRZMTVNVjxCKFA6RylPLUJFLz5HSUoKK002JDFCOiVNQzglOTw9N1VdPlcpUzpGLUkzNkE1LlFAOzZGSVVASClKL0JVPj8/WVI2NTheKzZJOjcmWTsKK00zVyVXOiQxQz02WUw2M11SPEZdQjknKUcuNUlCOyZdSDMkMUNARllTPlZBNjRUTUM5VUk/OUYoUDI2JS0KK004VUk6OCZJUj5GVFwqUUBJNURVLTI1TSUvREU4MyU5Sj5HSUYvQVU6REgpUDg0RTo4RExeNjZFRj82WFkKK004JylLNCdNUjYjOTo6WCFdOFM4UDhWTUY4NFEoOiYhPzNUNiI2RVAhOkAlUCAvWUgvVFVbLSI0PTRTWFAKK006IzhWNkZJSjhFTSkrVU4nOkcpUjM0ViI6RilANyNQQCs2QVc4REU6PVdJOzgmITgtRDBfLlMoSSs2IUoKK002JTE6OkgpXT1VNFQqUzk4OlZJQzwkRFAyNiUpKVNdLTxHSF8pNUlPN1IoMi9XSV88RThAKzQxOjhFSUIKK002RzVdPzdJSjclSVE9RFUsLjNMRyYjTTk8SC1cOEJURThGVk45RklCMiM5OjY1RUo2NEU6PEVQWTMnKVAKK008RkheNkYpQDZGKUoyMU1BMyUlSzpGQFktVlVLOUdJVztWIT82UC1LU1YhJSZTTT8vVDVCOEZJUj84RVoKK004VSBAKzZBOCsyVUAyNEUlMjYhODZGTUsxIlRFNUkqKkBGQTgyM1xNLUchUDZHSVosIyEwOkQ1OjcmOEUKK00rM0VaQkcpOS41IUI2NU0tLUZFUjwkRFA4RlwhOiAlTyAvWSkyNUVJNiUwWy5RTDs2IygpMyZJSjpWJFYKK00mVFVfOkZVWzhGKUszM11KOlQwOCU0QVo8JUU6PEdNSjtWLSktRFFEL0JUUi1EQTozNV04M1ZJSjhGISUKK00uUlRZNjZNQjxGKE0vVjlALUM5Oj5HTUIsJEU6L0FAMio2QiI6VDRFIjJVLTY0MS04VzYmPzZZQi4yRTsKK007RUk4L0JEOCNBQEAxJ0laNUIoWzxHK146NylKNjNdPjdWKUIzJVFDOlRcXjI3KVo8RkBWLjVNOzcmSUoKK002QTU/NkNdRzhGLUAuNiFINjZZVTtGQUMzNFU8PEZAXiZSVSgvQ1kvOFZZUjxIRU04RURFJlU5TSgiVU0KK00xMzhfLUNZKTZFQUYqMiE1OEdKJURHSSktQiA4KTcpVzpWSU44JE04OkYtTzpGQFsqMjU5PTdJUjYlOUIKK004RU0lKzRRTzs2OFlARkFRIDc8ITIwI1M2JDVAMSZJVzgmJSUrM10pLSVdSzpWQSUxIyFIOlYtWj5GSUsKK006VV0pOiZMWyYhQF48RkxfLURRUj5XKU82QzhSO1YlJS5TWTY2RTkkNkYpSjtWITo2RTkpMjM4XzxHNVcKK00uMzlANjNcXzonNVI+RiUwNjM4SywjOSg6JzxNLlFASTgmQTsvVDEsOzdJSjMyNDItRj0tMzVETSowLCkKK01fQUxeNjRERTMoKVI4RylIOCVNQjglSTs4RylaPEQwRTI3IVI9Ryk+M1VJOzlXTUw6VDEtOVRRSjhVSUoKK004VyFIMzZKIjpGKVc6NEUvPVZdOjJVNFsoQ104MzZFUj04MVU8RU0kLSRFSSgiVUg2RERbKlBZLThFOSkKK00kQiEtOFYpTkBISUcqMFguJTUiIj82STk6JiEtOkY5VT5GTUAyNTVANjVFWjpGQUM8KElALUM5KTdWKUoKK004RllUIDdIITwgI142I1kpMTY9TzMlRVA4M10pLUYpWj1WQFAxJEUpLUMhUUBGSUs6Vi1LQCc9KSgiNTYKK004RUhfKzI9Q0JGSUo2RDBfMzYpLzEjOS06Jl0lOCZFSjxGQTs6JylSOFNcTThHOVo2I0U/LjJVJThHKUQKK00+SCoiOENMUjI1QUA6RklILEBEQDYmSUo6NFBZMzcpUjlVNEArNiFAOVVJODUyRC4jQiBSLCNQTTMnNUoKK01fRDxZMiQ1QDwmSTozNVlVPTcpLSszXUs8RzVKOlZdVjlVUVI7VU04MTYhQjxGTTk2NFFANkVJTkJHKTkKK008R0ktOCdJWjglQVEyIShFNUMhKTpGRVVBSClKNjRNJDgjTFw6NklCOCMoLiZVRUIxMzhfODU4Vi1FQU4KK004RFBfLlFUXz04KVc2Ri02LVYpVTtGWUY7VV0tOFZRLzU2SU82Ri1CLUQxNSsyPUA+SClaQEAlVSA3ICAKK01fRThZNjU1NjokRFA4Rz1JOVM5NjxHKUMyNUFDNjI0QDMnNVI6JilKO0dJTTwkMEUuM1hZL1Q0TS43KT4KK004VEReMjQ1LTEjRFYvVUVCOUVBOzwnPUIzNVoiQkdJSy9ERTo6Rk0kOCM4Oy1EVUI5VlVYQTZNJDBDXSkKK004Jj06O1FMKSI0NTUzNl1PNiQ1SzxHKVcyUzlGNydJTDgkRTQwMiBLLEFMSSozXU86XkkpKzI0VjM2TUoKK004JUlQPzchRjhVMTY4RylSOEVJSj1XJTs8JylKMTRFQzlHKVI5VEUkMTRVOjlIKVc2Ri1CMSYpWjxFRTgKK008RiBFKzNMXzI0VTA6V1VdNyVFPzZGQUQyNiE7OEZdNCozOU8+Rik4L0M4XzQiVF88RjxbKzNNNDI2SVUKK008Ri1AMTRFOj03NVogVyozMSVBUDoyKFk4VEU5OlVJJTEhTDIsJilQQkAlTSA3OCBfRiBeOCVYRy41MEUKK00sJFFGPkU5OjpWTTozNkVMOUJUOy1HIVI3JUlGPkc5SzpWWSsxIjRALUVBKTM2PTY6NFU2OiYhLzZGISkKK002JFUkOiRFLzhWSUArM0VLPUg2Ijg0RS06Rl0nLVRESSZTOSkxVy1SPzcpOTgkRF4xJEU4OVMwNSNCVSkKK00zNk1XO1VJRzY2OiI4UyFALjY5WjpENFA4NDBNLyMoVi5TOTk8S0VAL1IgVjNWKUIyJEFSQic1RjhGKUAKK002RilKNlVBPztWSTw8Rk1KNkRFSz1XKUI4JERfL0RFOjhGTU84RkEtMSVJUjo0NTY6VylINjREJDYsLTsKK006VllCNjZJTzs3SUM4NUUtOkddPzNWWio+Rl04KEFNKTYkRVU8RERFLUYhJzhGTS85VERQOjZNRjxHSV0KK00/NjlBNlcpWyk0JSknM0VNOlVYXywhQDgrNUVaIDZYIT0wI144RV1LOiI0RTclNEcrNDFCO1VRVzxWTTAKK006Nk1LNiIgTThWUFkzM108PCYtOzglSTguMTRNMTMhQzYiTUA4RilSQCUhQjtWLUw4M1klOCZFOjE2IF4KK00rMzhZO0gpQjMlRUs9ViA9MlVARSozXFk2Ry1VPTVJQjZEMSkvVTlANTQwQC1EVTk4RylSOUcpKSwmSUAKK00nNEBWNUdJWjgiVSU4NDEpNkVJODM1RUZfRURcLENdJTYmTUA4RylWO0cpTjpXKUsyMzlAOFYhODgmJTsKK002RV1DPEddUTo1QFYtQ1k7OlYtQztHSUoyNDU4OkZNOzpHKVI6JDEkOiZNSzhVQF82NiVAOEchQzlGWVIKK004NUE5OFZNOjZWOUs4VU1IKzFAQjIzOUY+RykvOiZJLDElSSQ2RUBNNiZJSjkmVVVCRVFDOUcqIjE0QTgKK00qMik4OkYpOjgkREkqOCheOlAlRiA2SCBfRUlIPCYgTSgjXU4yM1xeMSZJUj5GTVI2RF05OkYwSSk1SToKK00rNUElMSVFPy9TISgyNERSLlM4Oy4zWDsvRiktPEddKTM2XVI9ViRNKTVBXztTRTo7NiRWKTRdVzokMTgKK006VylAKTQxOSxCRF4yNF1LOUY5NjhGPSkzNUEpNkVBOS9VRUA2JFEvOkY5UzgjISw4IjUpL1Q1MDtHKTgKK00xNiVNL0YpSzhVXFkzP1lQNiM4Xy5UNUA5RylVPTYtSzhVWUY8JTAyNichQTE1RUE2NUFAOicpXT84RUEKK00uUkRNMTZNSjhXKVo6VDU4NkUhUDglSVA8RkBfLjZKJkE3KSkvVVlJM1RBUjxHSV8+RylQOCchQzIzWUAKK004RFUvPVVESyozOFs2Vy4kPVdJWjokMTg3I1lHOEVdQjpGKTM+SDk6L1YpWj01OFAvQkQ4Mjc1QjcmOUAKK00vVE4iL0Q0ITxAJUIgLFBWNiVAOy9DXF84JUk4MjNZODpHSVI8NihfLjVNSS9DOTk2IlU4OUVBLTYkREkKK00nMzkpNiREVis0MFspMlRfMSZdVjJTOTo+SEk+JiFAUDxIJSsuNU1SOFVBQz5HXEc4NylGOiM4WyBTXisKK00sI107NlU4TzEmIVE6JTgjMj9ZLTM2IVA4VkE5NkZdTTs2TSw1RihfMjYgUic0XVc3U1ktPEQxPjtHJTsKK00rM0VTPDRMVi1DWUE6V1FOPEZBTDwmRUs9VVg4LjddUC9URUE6JiFKOzZJWz04SVc1IUxLKzNFODw3SiMKK004RDUvMTNdOjokRS04VkU5LjYiI0JGTF8rNUVLOCRVQjcmVVw/N0ojPiZJOS4zWUE4VFUtOkYhKSoyNF8KK00zJVojPkdKQ0BHKSc1RERQOEZVQjY1WUs3JjlVPFU5JTpXVUoxNTBFI0M5UjhCKF4xJUlOQFYkIS0gJEAKK00gL1hSNiY5OzE1QTgyNTk6NiREWTYmSVo9NVhWLCRFNjY2PUs4M00pNURVLTZWITQrMlUpNkVBNjckRFYKK00tRTReNic9SzYzWFA6SEkpI0BENTE3SVAxI0U6Olc9Wj03XFA1Rz1ROkU4TSk1NUgyNEVIMzM4VjMkMUIKK00+RkUpM1QxJS41QiQ+Ryk7OkgqIjlHKUo2NU1DNlZcWyZTWUI1REUpNkNFUTxWUUExJE9ePVgpTi8hTFYKK004JloiPUZZTDlHSiA9SCFDJiFNODozOFA2SCFPNkZBOjtWOV1AVyBcKzJUOyk2LiJCJUknNlYlJTgmTSkKK00sJDVJODNdOz5HWVc3QlUpOEZBQTZUUT88RklKQkhJTzZEVUY+Rz0tNkctSDNTRDUrNUxfOEYtOzpXKUIKK004JERWNkZJSjZFQU49NUk5OiYpKTZYKVI6RkEvJTEpOjMyRFYuM105QEdJUiA4ICE1MCNeMlRdSzwlQUcKK002M1hfNiYpPzIzXS08Ry1LL0M4XzI0MTs7Rkk4OiZBKS9FSUs7VE04OiRQWTglXFAqMihWLjcqIDZUXTUKK00qM11VOCI8OCgiVSw9VkRfL1VNWj5XKVo4I0VKQkc1OSggREAsIzk2OEREPS9GXVI9NkEtOlcpTjNTOS0KK00+R1lIK1RRWkBGSTo9VyksOUZVSTdDXUAzNFVOMjM4WT5HSUY2VF1JX0ctXT5WJDglMz1SPkctQzM0XV0KK01BRzldPCNQSS41XTApMl1aQCYtQzhGQUA8RzlWOiVYViYhQF8+SCk6L1UhVDZXPVs4IlRQODVMVjE2TU4KK00+R0BfL1RFSTZEVSkuNik4Mzc6JjtWLSQ0JylVOFZNUjpUMUwyNDFVNjNZJC9DRUM9V0lSNiZBSjhWOVMKK00+R0lCMzVBLS42Lic5RVE5OCM4QC40VSQyVDUpMygpQzlAJiYgNyggX0ZFJTpXSTs6RixeLjYtQjdVXTgKK00zNklVPDYhKTI2IUA2Rk1LOictTzU0RUE4Ri0pOCcpQCs2IUctQyhHJEFNOkBGQSUvU105O1ZNODQlISkKK002RVE/L0M5NDpGWU4+VyktMSdVVjNSIDgjQUBUOCZdKSwjRSw8RkBZMjVJUjhTOFY2JEE6ODJVJD5HVU4KK000NklSNyYpTTZUXTo8JURZOUVcTSZWTUs4VkUlNl49Ujo3SUoqUVRNOkZZSzIyPFA9WEldPzdNSTdDOSUKK002IlRHOkZNQDwlISQ2N0FDNUNFOTtDMEAvVk1SLjM4WTomQiJCRlRJLUY5Oi9SNS82VylYMjM4Vjg0RFkKK00uUVRWLUMhQ0AmVUwxJFVGOkYtWz5WLUE8JllXPzcoXisyRE02JylaPEZJTzxGLUIgVyo2OlYhKS1CRFkKK00+RilCNkVBJC5URUIuM105PCQwXjMgKiMgL1lSLjRVWjtWSUcuMk07OCVdQjxGSUo9NzVPNUU5TzpFTTsKK002RFFGO1RROjhWLUA3VUlOOENFPzlUNTUrMTQ7MTdFTy1CVSs4Jz1LMjVBQDZWLTs2NERfMjYtRDpYJUoKK004RDVSQEdBRy5RQEAxJz1SOCZFTTNWOTomUUxQPEYoPSs1XSUtRF0pMTZeIj02QTE6RylSNlRMVi9VXUYKK001RFE4LUNFLTgkUTgrMyNHNlYtVz1CVFQxNU1KOlQwOCo2TiI9N1VbOUZAVi9GRSkyNkUtMSc1SS9EPUsKK007QzA7L0ddRi9UVUo6I1xWKzNZKD5IPVIvVE1JOEQ0QCs0NUNBJyE1LUQ0XzJVNFItQyE6PEdWIzlGLUEKK003VDExPkdVRjcmLVJAR0lQMlM4XCxERUs6U0RNOlhBTzMwLTtFRF05ODU0Vis0VVo3REUpMSNRJDVDWE0KK00vR1E/KTI0ITxAJiMgL1lLMjRVWjpHISwvQ1lAODUhOj9WOUo6VylPMzYpVzpWRUg5VUhfNjYlOjY2KUoKK006Vl1QOFVBQjY1QS03VVkkMycpVzIzOFYuNk1IMjRFOjglXTw4Rl1CMSRVLTdHSUI6RVFGPTgpWjZRTDIKK00rNl0kMSZKKD5GOT8qMFg7NjYgOys2QSU3VkBeJlQyIkInKUIyJlYqNkVRKTBEMUI6RUkpLlNZLzglSSwKK00rMjdeMTYtSjpDPF85Ri1DOlRMQCs2TVo9RyFXOyVASStWXVA2RkRWKEYpWjtGXTs2IjRLOig1Vzg2IVAKK006Rj01KlM4XzpHKTwxNFVPOkVMUiZRQFk/KDFXL1MgXzYmIF8rMkReNjY5WixDRUI8NEUlPUdVVTgmQVoKK00/KClQMSNROTI2JVI7JUReOVdVWjslSS0yM1xfOjY4XCZSKUI7Q001OCYlSTZERFwyNk1AQEI0LiA0UCEKK009MCMqMyNFOj5EVVc4I1koNkchQjM3JU09VklKOENFJTxHTVE8Vz1LL0NdNjYkVTs6VSVJNlVNPjpUXTYKK00zJi1PO1ZBRjxGKTUxIzk7OjVFSDhEVF8xNUlaPVREVilUVVc8RkkwMzYoIzxPWT8uU108KTJVQz83VU4KK003VTUhLUY5Qi1DOUgsJSFSL0EoRTooKUYzI1k6QkZIXjEmQTA4Vl07LUM4XzgmTVM6NEUpNjVZTj5VSUAKK006Vk1ROCM4RSs0XUs+Vi0oOkVEOCU0UiI8VURFJlU5VjxIKV81MShFOlc1UzZUVUw8Rk1CODNZTztVWS8KK002NTU7PiYkUiYhNFs4R0IqOjNdLzo2LSktI1E4NjYtSy1CRlMvRjk6MSZJWjtGKUs8R0laOFNcWTglSUkKK00+JiEvO0cpVT1HVVI4JUEkLUctWDIyREsyNFRQOjZJSj5HKFk2Ni1TOjJULiAzOCE8ICNeKTFVQD5GRVIKK005RUktNiZdVzI2KVJCSCVaPCQ0VjZHKUI6Ry1LMzRNODEjWSQ5U0RfMTNdLTskVTYxJEU7PVdNSDcmKUAKK002M1k6OjVJXztUME0tRDFKPkZFJCgjRUpAR01GNkYtLDZHJVc6Ri1JKTM5Qj5HKUozJilKNCcpWzgmIVYKK00uNUlINiMwSzI3KUIyNDFCQEdJLzI2QTY4Jyk4KTI1JDxIQVo4RUFJX0ZFMTNWKTo6RkVDPVcgXikzOTgKK00zNylRMyYpJScxQFY8RkkpKjM5OjZVJVJCRjg4JiNFQjo2KUM6VklDMzZEVjcmSS04VjhZLUVZSSxBNEUKK002JSFaPzcpQzsnSUo8QlReOjZdQjomJSQuNl1EMzRdTzhEMUA4RVFGNjNQTTVDXTo9ViVCPEc5TjxHNVIKK00+Rz0pJlZdVzgjWUA4MzhFNUYtOz5IKSkvVilbPVgpPiggJDsgM1wgVVFANS1FSiA8Ri0kK1YxTzZCPToKK008R1IiQEctTTM1QUIzNEFKPVQ1KTYkVUA4JikpMSNcVjE2QUk6JUBQKzVFUj1GITo2RUBWMTY9OUFXSTgKK00rM11AOEY5VzgzOSk4JzVdPEVNQzIzXTk8RjFCPVM4VjhHSVI2QC1DX0YpSj03SVE6MlUpMjRVQTI1TUYKK00zNDU2Olg2IjlFXTkrUzlBNTJMRSxGWiU9U1xfMzZZUTIyXSU6RUk7PldJTzNWJUExNi1XN0ZAVigiIF8KK008Nk02LSRFSS1DITk+Rz0lKCFMVjNVSVI8RVk6M1ZdODVGQTg3Ry05N0VJTy9RQFY6JUlPNCVRVztHPUsKK009M1hWMzZdLC1VSS0uNk1KMyQxSDwiVS0zM0UtPCo5OCszXFIsJilGPEc1VjhWRUM2RVFaNSEpOT81TSUKK002VyU5MjZNSDInKVMyMiBZQEhVWjdAJFIgMiAgX0JESyxDWV1CJl0kJzM9QC8iIF44RzYiQCYtOjcnKUsKK001Q0xZPCYtODZFQUs8NUBXNjYgWy1GKVI+Rz0pKzNFOTxGTSQxMzhFL1YhJT5HVUgyNilaPVZNSz1WKSUKK00yNk1SPEYpQjhURFY4Rk05OUZdLTpXNTwxJiExOFdNUDNXSiI7M1xWLUNFOjZHPUsxIlUpOFZFWj03KUIKK00sIiBWLjNZNS9XKV08REU4Nl9ZPD03PTguNiBQL0cpTTs2SVo6U0U6PVYtLS9SREkvRi06NSJUWTlEMEkKK00xNklKPSMwQCkyVFY6V007MSZNUjxEUUI8JiVLPDchQjxGPE0vVz1SOFM4VDpXLUw8RylANiVNSTIyNS8KK00vVEVDOEQ0RTE2IFY1REReLjctUTEiVFYvRiVLPyZZUjomUVA6Nk1XN0FAWT9XIF8yNyVJMyZJTTE2SToKK00tQShHOEgqIkJHPCEyMCRSIC9ZOTdENS86KCldO1U5KS9SREk4JUlKPygpSjYlSVI6RikkLCVJQzgmRUsKK006VylAL1VBSC9CIFY7V0laO1VBODM2XVA2Izg4JTI0XywnIVI4RDU8PzcpOjZHSiA2RDVDOEZFUjpHKUgKK00xJTlKOUYpSDhFSU46NFEpK1RVWzxGKV1ER0hfLlJUXjM2KVI6I1g7KzREUjZYKVI8RUBAKVIgTTdERVMKK00/NjkwPEdPMThFUUs7VFU4KTJVJTE1IU1AJlxZMzcpTDZVRF8rMzkkL1NcTS9GTTgvVEVQOEZNPixCIEsKK00tRkoiOjRFSz5HNTk4Jy1MOFZNSTM1IUgzVUVTQCZNJCs0VVI6VklSO1cpWj5WKSU2VERZMjZBTyEjOksKK001RFVCMlc+IjtDUDstRiFOQEc5TjsmOVpAJzogOFFAOzYmRFYsJUogO1VJSDM1STk7QzA7KVY6Ij8wJUgKK00gNUQgX0ghQjY1WTg4VllbPkYpKSghQUo8NjlOPkYpSzwlUUo6RkU1LjRVKTZGSUo8Rl05MjVJJCoxTSwKK008RzVSOCVBKTwnSVcxIUA4JlIgOzslXSkvVUoiPCMwXzxIKVI2RilDNkRBPDxHSUA1RilLNlRVSDYkNS0KK00vQ1BCLUZdMDdHVixARTheKzQxOztXKU8xMlRSLlI0Vj5GVUs6IkQ1JiIgWzYmQVIxJCVVQk9aIDZTXToKK004RyElLUNQVDI2KUY8RUFMO0ZNQTgmJSs4NEUpNSIgPTE2KSksJylfOlZFNSpSVSk4V0laPidNWzwkRS0KK008Vk1JNDRVOSwjITg7VzlbPEZBNS1UXUExJilEPkg2IzxFSUM4MzhQOjVEQiozOSkzNDFIOjctXT5WJDgKK00lMz1SPkctQzM0XV1BRzldPCNQSS41XTApMl1aQCYtQzZWKUE/OCE+LUQ2Ij1XNCE7ICVLIC9aIjMzRUAKK00xNUEsPCdNSzUiIDI4V0lLOlc9QjpGRSw2JylaOiNYTSkyNF44RylXOkYlLy9EMFsyNUlKPEZIXiwmKiIKK00+RkBfLjI0QCgmQUcxI106PkcoXi42LU48RiFCOlYgVi9VRUs6JFU5PkY9JThFSF4rMUxAJTM5LSsyPUoKK01AR1EtLUJUWy42TUs8Ryk2MjRESSk3SVI5Rk01JTE0QCxERUA2QzlBQFgjXkRHPFAsI11LNjM5JS9VSU8KK00zJUVCPkZZMDpHJTs4R0lCOFYwVCczOU8zMzlPQCZZQzo0RSQvVSFDPEc2IjxFQSkzNk1bOlVAXzUzIEUKK002JllWPEZJSzZFQUExMj04NCZaIEFHVUY4ViRfKTVdPCkxTE09VkEtNlVNUjo3SUoqUVRNOkZZSzIyPFAKK009WEldPzdNSTdDOSU2IlRHOkZNQDwmPTA6V0ldQCZFL0BFSUIgNyghPkAjXkBUREc2MzkpLjZFUDhFNEAKK00pNUlaPkYpSjpGKTgrMzlCOSdZOy0iRDgoJDVDPEZdOzJSVSk6NkFAOjdJWjEiPTpASClaOiRERSs0NUgKK002NTBWMjZBSzM1RUI8RylIOjY5SjYkRSQxNFRZN1cpWi41RTs4IyguI0FAVDIyVDszN0oiNjJUWy5RTFkKK00zNiogOkVFQCsxTVI8Rk1POjM4NSYiVSk2JERCOEhBTl9HMiM4U0xFOCNcVjU2IUk8RjhfMSc9SzElUUkKK00rMyFXPyVNOC1CTSs9VUBZPFdJPjZFSUg8NEUlOjcpTj83LSU2M0UoPzctUDgzWEAmVEVaQFcpOzdUNTsKK00+JiBZNiYpOz03QV09RylLNlVBLTcjODspNUlSOUVIUDZWLVc9QlRUMTVNSjpUMDgqNk4iPTdVWzlGQFYKK00vRkUpMjZFLTEnNig6Nz1LPEcpSS8oKDspUCVGIDgsIFBHTSkpNERcKzFNLTgjRFYoIjU4PEgpTzpGKTYKK00uMzhWL0M9UjhVMSQsIiBNMSYtSDVCVDgtRl1QODYtVEBFQEkxJyopQEdNUiszIUY8JUktNTRFKTg0XUAKK002QC1SX0ZFOzpHKUI3U1hWKzRdTkBGKVI6Ri0+LEFAUjg2QTUqNDVLPyZMUC4zPEkpMj0tPkZNTTtTXEAKK00xNyFSOlcpPCoyIFQ1NiRWJENFSj5HViY8RUBSOCNcXDdWLVM8VkUpOCdRUzpGKUApMUEsQiYlJSghTFkKK01BViBQOkcpQTZENTtANFxZOlcpU0FYLUI3Uz0pPCY5UDgyRC4jQlVCPkdJQzgkNUNARk0vOFtNUjlFLTwKK01AR0FaOyZZUjZFSSk1NEU4OEZdSSk0NUM6RkhXL1Y5QzhWTSsoIlVLPkc5UD1WUTgqMl1PPCVJSS1CKUIKK01CR0lLOCZFSzgjOC4jQCRQIDYoIF9DOVpAJiE5KzI8Vjg0MEkoIkU4PEdJWjxEXF8uNUFGN0RdVThFXTgKK00xIyhSLCU5QjhDXEArNkFPNjU5Sj5GSFkrNFVaPzdJWi9SVTo+Rk06OEVAXzI0MS0vVilLPEZBSDhXKUQKK002VjBfLyRFRj8kPUs9NjlSMjFMUjpIKU8vQzlCOSghRjgkMF81MiklPEVRRkBGLFsrNEVGPEZNSC1CNT4KK00/Ni05KlNZQ0JPWi1CR01MMzYpODE2RTs6WCUvLjYqIz1HTUk2IzhcNlgtUC1BQDgtSClLL1YlSDZEUT8KK004Vk04L1ZNSjlISi88RkRfOCYlKDw2JEklMUBNMzZJSzpWQFkzN01QNiRVSjlGIS09NzVTNldKIzhVTUEKK002Vk1TNkYtSTI1RT47R006OCZNSzw2IFYpMlUvOldNQzImSTkmITUsQEctOSkxTTY9NzlHLEI0QCkzWiIKK009VTQiJTAjXjI2SVtAJllSOiQ1QDEjTFIrNTlCPEcqIDZVXUg4NlFXOjY9JTpHPTg2JEUkM1YpSjolWF8KK004JkU5NkZJWj02QSQvVilVOkY5QTE1RVY9Rk1DOFYlLTEjOE0zVilOMTVNUkAmKUIzVTkpNiZNSjEkVS0KK003JkhWJTI1LDkmKFYpNi4iQEdVXTs2STUlMzlSOVUhWjxFSF81RiFKO1U4MiU1Sic6JyE5MjYqI19INiYKK00/OCVBNlZFOzskVUZAVExWOkgtTj83LTgyNUlXPlchKSpSRSk6Vk07ODRVQDE2KUo6RERUOFZBLz5IVVYKK006I0UsMSMhSThUMEAoI11JPFRVKDxWOSU4Vz0pLCRROzxHSVY9NkksO0hJVzhVTUI6VylANkYpSTo1JS8KK004RUlKOjYtVzwjWEUtRUEtPEclLDhEND0mIzlSOkRESS1FSTw2Vl0pLjI8OCs4KU87MCQuIDJEIF9ERTkKK005Jz0wOUghQjYkMFIsRDEpMzZdSzpEMTA7Vik5O1cpQCs2QVI4VThfMSVFOjY1OTgvVDRfMTYhSzxHPUIKK00xNF1PPFchOjY0RS08Rz1CN0ZJTzokVFYpNEVPODNEUDonTVI3JV1INiZNWz5HKVAzNilKNTI0TTYlXSQKK00mUU05PkdWJT8mSUsvUUBJPCdJRjxXPUIzVkE/NyY8WSYgREc8RklOOjYhLTlIJVogV1dcPEYlOzZXIVMKK00+Rz0pNjdKIjtHUVY4JVk5OkcpTjQlQFwyNik6NkVAWTYmJUI5RyErJzRVSC42OjFARiBNKzU1KTg2TUYKK00tQiBWOFc8Vik1SU82VU1QNiMgXjVGSVo+RjheJzVKMkBHIUE1RyFJMjQ1JTM2WVEyMl0lOkVJOz5XSU8KK00zViVBMTYtVzdGQFYoIiBfPDZNNi0kRUkzUzlLLCQxOikzOVdAUCRNIDI8IEw0RS02RkUkMidJUjpURE0KK00rNEU+MSYtVzM0RS02Rik5NlcpUCs1RVc6VVxWKzRFPy9TWSk2JUBSKEVdQzpXSTstREQjPExNSDIzWFYKK006VylHNkYpUjxGIE0mIz1IMjRAOy9GSUIvVilKNjcqJT83OiE6VilCOjRFODlXISkmIUBWOjY5XUBGSS8KK00mUFg7OCgpVT1XKU82RUkvOEVATS5SRDsxNi1CNlVAXzQ3LCM/OyFaOkRdLDtXSV84IlRbN0gpXTtGTUIKK002VVk6OkZROzglSS82JEUtOCNYXjZXKUw5RTQ1KzVQWTZILio8IjQ7MlcgIz1cRUMvIz1DPkVEVC9EVTsKK006Nl1BMjM5NjZGTUsxIlRFNUkqKkBGQSk3Ji0pL0RFOzcnNVc2I0VALCNZUjs2VUo+RkxZNkc9QzMzXEkKK00qM1lDNkUwTS42OUExJl0lLUNMOyZUUiIgNkAhL0AjXjokVUM8JEUlOlc2JzlSNEk1JUElNkcxJDImQTsKK003RiElN0dVKTM3XVI6RUUkNURVKS5TWSk4I1xFODZRWj5GKFYvVVFbPEZJOCsxTUM8RylLPEdJVTwkME0KK00vVVBbNSM4TTIzRE0zNik7OShKJDUnNVI4Rk1LNkY9VztUREUoIlU4NjY5VT5FREkjQFheQEdVWjxFISwKK00uMyFIOCMoXzVDWFY2RURNLUVBQEVEVT49N1YjPTVNJDg3MUwvQjRJLCc2IjgmLUkxNjgkOllFUTxGTFkKK00vVUFOL0JUXzZGTSg1MzBUL1M5JTlHIVcpMU0rIFcrKjo2JTYuNi4jQDchPy9EVVU+Rkk7KjRFOjYmOEkKK00oJUVKPzg2Mj5GRUc5RiklNkdNQjcmTU8zNUBFKzQ1JTQmViA7U0UtPEZROzYzXE0tRDBfL1JUXjpXPTgKK005Jj04LlIgOys2QCE9UCU8ICtFOiwjRUgvQ0VHPkgtVzI0RUA3VDUtOiVFOTomQUM4JEUvPEZJLDpWTUMKK004VkFHN1RUXi9FOUAvUyFJPCcpSjYkRF4xNylVPEVARSYlQCM6Tz1aPkc6IzxFXT8yNEU6OzVcXisyVSUKK002RD1CPzhFOjQmSVI8RkksNjcpSzYjOEktREU5OjY5SjozUDgmIjVCPEcpSzZFQE0pNUE/MSNdRjdDOSQKK00rMFhAMTVATSwlTUs/OClbOFRFQTJRTDgqM11YOzVJRjsyVSk8Vy1MOjZNTjsjOFYyNyE4L1M5JTZENTgKK005RkUkLUQ1QjhUVEUmU11TN0AtO1ImIFYtRjokPlc9QTZXNVs4VUhNMzYpNjIxKDgzNylGPTkqKjxGTU4KK00+ViUlQkghOy9VSUI8JDRWLyMxKThGOVI2JlFOOlYlQDg0TUEyNEU0KCFVJT4mKUI3VUEpLUJESS4wJUgKK00gNUggVyU4Vis0RE0rNEVSQFdJMDg2JUI4JUVAOCYtUjhGQUArMlU7P1cpSDgkXTg4VklINkRFKTYmXS0KK00rNDVCPEZBLTI0RS04VklINSJULjI1OUI6VylaPlgqIjpWISkyNUlKPkU4Vi9URSUzNUlSPkYgXjVGSVQKK008RFU4OkZNOiBUR143JF07NkVRSDYjOFIvQ1lCOkYhKTI0MF42JTheLUU5NjYlNFQjQUxNNiQkRSszIUsKK01CSSlbODYgXyYhNDUrNyU6MyY5VzIzWUk+RylPPEVRQy5SVFY4VkVOODYtOi9TRTo6RURfOjdJVy1CNEkKK00vVSRZKVM5QzwkREAsJylCOUZdQztHSVs9U1lCO1U4SSUyISQ8RUU6PkdVUjpGWiU9U14gREc8UC1ERUAKK01INUBWMTNdOjtUUTk4R0lONCZJUTZWKVo4Ri1ELSFUVj1WXTozNEUlMSNcViswJF8gNUAgX0I9JzQkMTYKK00zNFU6OkdVWjpDRTg4Rkk6LjZJVTtFQEkoIlVHQkc5TDozWEUvRl1CNUZBSzxGSUA2JU1NPEZNOzVFQUEKK009Vk1AL1M4XzgmIVc+RzVSPEZFQDM2ITo2JUlKPEZJTzgkXS02Vk1SPEVBLTUzXUA8RllTNlREXzgnKU8KK002MlRJLjVJVTxGRTs4VlFLNiNcVi9UVTs8JURLKTZFQTY2QSstIk0rOj9ZSS8hQC4vWCotQEcpRzYyTDgKK00jQiE7PCZBODpWJF8zNyVaPkgpWzZUMFItRUFKO1chUjwmJSQ4Vyk4M1cqJkAjXFYyNyVBLUFAOzgmUSQKK00oIylJOCNdOjM0MTE7SCxZOEcpQyxCIFkzN0lGODZFTjlUPVJCRyk1O0cyIzhTXFk2JERcNTYhSTpWJF8KK00zNk1LMyVRSSszIUg8JiE4LUJNKTpWRF4tQyhNL0ZKIjtTOCIvUCNeNiVBKS1EMS0zNkVSPTdJSy1DWTgKK000NUBeOkdJRjMzMFwtVDVaPkZZQyxBTEA4VU0lOEZJSjtGUUM7VlVOOyVFKTtXKUo7RUkpL1NZKTZHKiIKK01ARzVLPFZNQDZGIUI4JkFNOFcpUjZUNUM+V0lSNjNFPjU2IVM8Ryk7KTI1QD1HKUMxIiBFMjZNWj1VIUMKK00/NzVJMSJEOy1GQVA6M1xFMTYhODpWIFYrNDVSX0ghNSNAWF89N1VVPDZBRi9STDgqNEVGO1VEWTE1QF4KK002RjlSPUhJUDdDXFYyNilKPEctWj1VQUo6VUlIOFc2IzNVRT8+VzEkKjJVOzojXEAsRUlXNlVNPi1DISgKK005RUE6OkZRLy1EMSk8Vy1CNkZQXiZUMV06RUFaPzg5UjYjXTgyU1E/ODZFSTYzXTg6Ni1COEYgRSs0VUsKK004NExALURVSzojXEUqMkRNMygpQzMwJS8gNiQgX0YtQzEjOFYvVE1IPEY5SEAlNE0vQzkkOiY5VThCPEUKK004NkU4Nkc1WjojOEApU004O0chSjNVSUI6V0lOOkZEXi1HKVI2NDxfNiNMRSozOTo+R1VVOkZZSzhFSUAKK004VklLOkYpMT5HMDsyNylSOkc1JTE1SVA8VzlXOCMwQDZGWTszVUBFJlNdQTZVTEcxJ0lWPEZEXyYiRUEKK006JVlHMSNcXys4LUwyMjRQOl9ZWy8gWC41RzVbO0ZRSDw2OSQqMk04OFYtUCkxVSQyNEVCOiUhTjsmJSkKK00vVUU6OEdBTj5IPVA7JlEvOiZRVz9FTUEuNU1XOjRNQTwnPTkqMzklPEcpQzo1WTUyNiFQO1VJLTM1SUoKK002RklKMTM5Ly9TTSk4Vj07PEcpSzMkXTY6JllSO1VBNS1CIDsvVUE6OEZBNi9DWSkyNU1KPCZNOzZWIFIKK00pM00pOFZCIjlEXCE1QCVJICs9QzhFSF4rMihbPCVZQzZXOUMsIzhAJlVBWjpTRDUpNkVNOkRdL0AmWTgKK00uUyhNLCZeIj5GKS0yNEFaPlYhOykyITk6VUEpL0NcViBSIigrNVFSO0ZJSjtGSCM4T1lGPkZVSzhXKVcKK00rNE06M1UlVjwmJUAzVklGPEYtPi9WJUsxNF1JMSNdQjxHKUYtQ00wPEcuIDsjKEU4JUk4OiZFSTYjXiMKK006VEQ7L0dBWjIxQDgxJklaOlVBJThHQTouU104OFYlSzdFNSs4JiEoO1VAXzM2JFwqNkVGN0VJRkBXVU4KK004Vz1KOEVFS0BGLUYsQzk2OjZGITxHKUkyNUErOEghTDhWKUk4VyZbOlZZUzIyPTY+Rkk2NlQwRS1GIUkKK006NV1COEcpUjtVRS02VylGOUZdLDgjUDgjQkUpNiYpTzZWISkvU1ktPEc5UjhEXUs2QiBWMzZRUjpGQCEKK006UCVSIC9ZSzMmKU0kQShWNURBQTZWOVcvQlRJJiJVTjoyNC4pNkFONyZNSz5HKUIyMlRNMSVFXUBHKT8KK002JTlKPlZNNi5UMTk6JUktNiVFKS1DUFwsQ1lCO1VFPD5GSUs6ViEtOkRROT5XPVozNiFBMzQ1OjtXKVcKK004NkU6NkYpQjsmTUg2JUVQODRdQj5HNiA8RkUlOEVZTjpGOF82Ri1JOlZZUzwmIiI6VDA4MjgvXkJHJTgKK00xNEU/PlZRJCZTIVM8JUUrLCVNVzpWRVE4JFVGMjRVSC9TOSQpMlU5NjVAXzZXKUs6JiVKPkcgUC43LVcKK008JExNLjVBOzlXKUMzVU1JL1YpWjxFSF4zJVlSMzUiIjlSNTU9VyElNjVAXDI1QUk8RikwOEZJUjtVQS0KK006RylSOkchNjpGVF8nMiEpNlZZWjxGXUkyNDE4PVcpUjpVSUM6JE01MSVNQ0BENTAgN0ghPTAiVDlUMUoKK01AUUwyMSRVJDhGTTw6Vi04NSMwTTglXE0oIzlMPEYpTz1HSU04RERLKEU4XzhGKUM2NV1VPUc1SjVDWSkKK00vRkVHMzAxQF9GQUk9NV0vODM4Uj1WKS8zJUElNiM4XjtHKVI5RklXOkRUViwmKiJARy05MTVBPjxHKToKK00yNFVSOyVFQzxGLVI7NzVSPVYtLzZGOUs8JU0+OlZNSjdGOV82VDBJKVYqKEBYKiAzVEFSPCMoMic1RUoKK004VVkkL0YpQj1WXTYyNUk4LjRFQDgzKEArNUU4L1NdODgjOSU5VUlSPCNQRTFYLVI8JExWNichQzg8QUEKK00yNSFGL1VJQjVDREkqNF07MzVNWj1TOEc4JixQMlVdOTZDOS88Rj0lL1Q9QjtWQTo6VylaPEZNSjtXKUAKK00vUlUkNiclWjtVWUszNEVCNlZZSzpFSUI0JilXOEYlKSZRVCE6ICVGICwhQjMmWjEpMUE1NlVJSDxGLTEKK004Rik6NiRNJC9TOFkzVylVPEcpSjs2SSkrMkw4MjYhOC4zOFA2RyldQFZBJSwiVE04Vz1JNjVNQDpHKiEKK00+Vk0vNiMoTSBXKzM4NFUtNiNYXzomLUI7Nk1VPkYoUiUyXVdCJ0kvLjVJLDtWTUExM1lJOFVBSD5GTToKK00yJklaQFclJTY2TU08RF0vNkZdQzNVJUo2IzkkKjI9LTxISio7JSVKOlJURykzOFAyNUkkKTI0TTtHKUMKK004NiwjNj41SD1TKEAtJiFIOCRFOC9RQEUyVUVQOlVARS1HLVM+VyBfNUcpXDo0VTozNDRfOjYgXikxNEkKK00yNUBeMSZJWjxEMSkuMzk4OiVJOC9URUo4VEUkLjQxRzpGLUc6Rk1SPEZNSzxGKTYvRUFAOkcpRzM1SUAKK00zNiUpNkcpRzNWRSk0NzldPEYkSSZQJTkgNkggQiVIUDZISTgsJUFDISZPXjg1QTAzNUFIKjFMSTEmIUoKK007SClVPEYtUDEhTFIpM1lNNiMwSSozWTk5R0k/L0QwSSgjWUM+RSE5NlVJTkBHNUIzNUBfMjdJWkBXIS0KK004NU0lL1YhOC42KUY+WEFDKTBEMjZILVc4I0ReLlYpOjg0VS8zVDReNkdNTDhWLUg+SElMLCRBWj03KSUKK00vVEVDOEYtQzo2JE0xIzhJLURVVUJHSS80Jy04N0VZNV0iRE01I0w4JlJVOTxGTVpANiRfLjYpMC5SRFYKK00yNklSOFYhJCszUTU6Jz1SN0I0VzpXKV08RiVDNlY5WzhFTF8rMyFPOzRESSYiNSQyMlQ7L0ZaIj9VMD0KK00vJEVCNyYkXC1DXTo2RiFIPDY5TkBHISkxNz4gPERdJTM1QUI6Vz1XOkVIUCtWITs2QzhZNkVIWTw0XS0KK004R0lVPEYkViA2JCE8QCNeOiNdOztHKUEzNilSOkUhQzxHKTsyNF0/LjEoMik0RUM8SEoiPkZNSDdDTFYKK004NiFIMjMwVC8lQTk4Vk0pKzM5OyghKFY6JUk4NkVNTj5XKTszNUBWNiZZVUImKFQ4VyE4MjRcXikzIF8KK01AKSVQKjBYODI3KUY6ViReL1ZBOThWUUEyVDBWLVY9QTgmTVo9OC1DLUQ1W0BHPUAvU0UpODcpWjZGRFYKK00vU1hNX0M5LThHOiI2VFVMPCVNQTo1USk4M1xSKzM5KTZGLVpARyE4MjZVLSszTSQxNUlLPFcpOS9VQTgKK004VyFTOFM5NTdHSiI6VU1RNlQxUkInSUEvUzlJOjREUioyVF84MkxAKTYqJT82QE0tRU1KPERMVy8kTTkKK00xJDFLPFYpPj5XPUE2JyojPTYkXi9FQTo7Rz1SOkYgSSRDXS82I1hfMjQwRzhWRTg2JSFGPkgpVzMwJToKK00gNywgX0ZNOzhWSVo6VTlCPkZNOjhXKVY+JiEtMyU0OCNAWEkyN0oyQSc1UjpFQSkyOEIjPERUUiszWUkKK007VilINSJEMjYiRC4kQlUpNUVdSDxXSVI6JilCLUNFJTlILUAsJilSOlZRSDIzKCkmVkopPkREVCs1QUsKK003RylTL0RFUDhGLUs4M105N0NZOTE1QUI9VVFaPDQ1ODxHTVo8VDBNMSVFUj83NUY4VkElMTldQDpWKT4KK00xMVUsOkcpUDEhTEU4R0lCNDVBOC9BVTg4NDRfLCYtMC4yVSkgViJLNlYpUjxGWUs7JkU1LyJVLT03VVMKK004VlFTOFVNQjo2UVY9NlVDNkNYVjYmQUAzNV1KNkVMWTI3UiI7MC1STCdNJCs1NUA3Q1xeOFdJUDZXKVIKK004Vi1LPlcpQi9VQUEzNklQPEUhOCxBQEUyNi1IOVU5JC5VTUY6Ri0kNCcpVThQJUsgNyggX0YtMDZFWVwKK009VD1CPkZNODhHKVU+Rl0tOCVAOyIwWDgtRk4qQkZVPjMzOFYxKEolQEZdNCsyVSw7VFBXNUUgPTI0MFAKK00lMUBbMSYhUDhXKVI7Vk1LNiJUOy9XQVAuNilVOScpUjMjKCkmJUYiPVVNPjYkNSksJiFPLjVBQTo2RUIKK002IyE6OiNdQTI0VTk3JFVSPiVNOThWUVo6RDBJLUM5Qz83JTszViBWL1ohWjtGQUM2MjRNMjVaKDtDTFIKK002VzVSOlYtTy1CVSk2JDU0L0VAVighTSU2UC04UERRLTZWLUM6Ni05MjYhUTpXSVI3RylLNlRFLzg2PVIKK009NjlBOCNdKT1YLUo5RyFSNiM4RS9XTiI7RzVSOkYhPik0KUA2JERfMyc1TjZGLUAxJk1DPEZJTzggLUMKK01GJ0lTPkZBQDIzMEk2JUlSO1YhLTomRUM6RlEkMzY5SjhQKVsgL1lGMzNNLT1HVSQzNUksLSYhSjs3LVUKK000JklQLEE0LiczUU9ASFVaMTJUSSs0RVo+KClVPEVZKTNWTSkpMzk2MSU5STgyIDgsQ1ElOjRVOzxGKUIKK003RiBAJiI1LThVQU46RF1GQEVMViYiIUA+Rz0kLjchSS1BKFY4IzkvMTVBSTM0MDsvVVhHL1QxLDlUMSkKK007JylDMjI8XzxGTFArNDBWL1c9UjZFTUYrNEdePVUxVz5GOE0oIjU6PldNSDI1SVI6Nz4gPVYhJTNVSSkKK004RkFGKzBYOC9UVSUvRFUpLUNdODglSTo2JEVAPkYpSzxHKU44REUlMjQxKThWKS04Vi04OEgqMTxGUiEKK00/JiRJKCJVSj5HPVo2U1hQOCJESy9TWF8tQ0VKPFRRODokXUA4NkVJOEYpSC40ViI+RklCOEU4XjEkRFkKK006Nl0kMTYpSzZFUUY4ViU/QEQxMSA3SCE/MCNePTcpODE2SVo6JEUpKzFAXjU0VVtAJSEsPEQ0UCUyIFIKK00zJ0lWPkYkUighTFY6VzlWOkY5Uj5IKiA6RDU7MjNFKTomXFApUkU4NiVJQDhWVUo2JU07MSZZRikyNUIKK01CRyhfOkg1WjwjOE02N0lbOCI0UDwmVDstRkFAODM5LzxGKT4qM1lRNTJETTI3ITs2NF1COkZEXCxEUUIKK00yMzkkMlM5KThWLUI8JEReXSZFKDxIKVg3QyBFOFZVSzojRS06NEE5PzgpUjtFRS8zVkFLOFMwLigkRS0KK00yNEU4NjVJQjYjOEUvRUlANlYgXiwmOiM7RyVJMjQ1JC1FTUYuNF1JODVJQkBHKTQ7RllCKzFMQjM2SUoKK00/Jl1GNlRcUipUMSs1MzkpOFcpJS9GOVc4NUE7PEZNQi9RQEU7VylINiRROC9EMSkoRiFLIFVCKTcmKSgKK00sQ0VCPDRFJSA3OCE/MCNeO0dJWjolTUY7UyBWMTNEVjEjRVJCR0k6OkU5NSszUUE4VylKO0YgVioyRFwKK00zVyFOOyYpRD84Rio8RUlDODM4UDo1REIqMU0pOCQ1NjpWVUI3VVhWLjdNQiZRNFc9Nl0nOiZBVT80RE0KK00zNVFWQDJUMis1QEkmVTlDOUI9OT4mSVAvUyFTOzI0VjY0MFA4RyVGO0dJSjZURSc6JiU4MlRFLzI0NSQKK008Rl0vX0YhSDpWWVM2U0xeOFcpSzhTUFk4NiU6OldKIz4mQTE8Jz1SOVU0NSk0VTouNEU7NlYpVj1SVEAKK00tRUFANkVAXiZUMUszNyogOjYlQDE1QVA2NFVCOFVMXzlILUs4VilQN0MoUj0kUSQ4R01aQCYtNS1ENUEKK004NUFBOjchNS1FSUs4VUElOFctTy1BQEU4Nl1KOCVJOTM1XSkpNkVTPDYpODlHJS8tQkReOUgpOjEgJUoKK00gN0ggX0YxRjtGVVI2VUBFJTJUXC9TWFk8KDooOlVJOjlDWSQ7R0lKOjcpQS9SVF84NDVJNyZJSzQmWiAKK01BR1VGOFYkXyk1XTwpMkxAKzNFNTM2SVI6VVkpJlJVQy1ARC4nNklaOFchJDY4QSsvJU06PCgpQS4yIEUKK00vIUBFNiY4NS9HLSc3VUUpPEcoTS9WRFslMk1QO0c2KjtGLVA6VlFPOiRVJzY0RFYsJk1XNk9ZLTpGUUMKK002NVhQLUQ9RjxHISksJUlDOjYtS0BIMU4zNilLPEZNRjEkRVA6QyhWNiYtOjs3WTwqMykpNiRVKTlCVEUKK00vU1lDPFctTDhEVUg4VUE4OkY5QCs2SiY8Vi0lOkYpKS5WSSw2JkYiPkgtPjhGVF4tRDU5NlZFSzgkXUMKK006RilJL1RFQzxWRSUxJi1QOiZdUjolSUc2RTVCPEdJSjEmOiI4ViUkLjZeIjkkVCEzUCVPIC9ZWjhFUTsKK006VkU2L0E0QCk1NFYvJkFdPzZJJTJVQUAxNUYoNlVFVzozXE02JyEtOFRRQkAmKTs9N0FdPUcpSzZVQS0KK003IzkkL1MwOy9WIUI8Rl1AMlFMXzokMEcnMU1CQkdVWzg1QiIvUzlBPCdKKj5GIE0rNDRAJTJUViIyNUAKK00vQyBZOCZZWjZXIUs1MzBfNlRdRkBWTS8+SEFbO0cpOTI1RTQpMTUtPEYvXjg2TUM6Vi1LNjRMVjE2KVoKK002UjRfOlZNSThXLio/Nk06MyVNUDhUUTY8Rk04MSRRQDY2LVI9U1xfMTU4Xy9GXU0sQjRfNjYtRjxVUUMKK006I0UkNiYpTjoiVSw8Rz1KKzRFNjVERTo3VkFLPEdKKDA0VVo7QlRNLUQ1STo0VTg6Nk1TPERFNDZVWVMKK006VTkoPCRVUD1XKUs6RjlDLjNdTj5VUUI9NVE6MzNFS0BGSSwgNDAhOlAjXkBXKSc2RyVDOEYkUiUxQFYKK00vQ1lGPzc1SysyVFY8JkEtPVVNST1WJF8tRFFCNkVAUCxHPVI5RS08QEdBWjsmWVI2RUkpMyVFPikyVTUKK00zNiFXNlRQXjgoIiA6UjQpLUdJXT1HKUJAVURQLjZJWj84SUsvRUVBLSJESyUwWDs4JUBWKzYhVz1VSVIKK006JiFAODZNOzZGWUksJi4qQUdJSjgjWSUvQUAuKzVdMF9FIUo5R0FSPDc9UzglNTk6VVxNL1YtPDtXIUYKK00/OClVPEVJKThGTF8xJlFLNiVBLS40VTo4Ry1IM1RFKTZGQiNBVkRNL1Q1OjlHSUI4RjxNKEM4Xz1XKSsKK00xNilOPEVAVjEkMSkxNi1POkRFPj5VRU0+RlU7MSM4XzolQE0rM0U8QEgtLDE2JSU4VkU4NUVFKTgmSVIKK009NylPOEFMMi43SVc7RylCM1NdKThYKUIxMCRFIDQ0IF9HSVsxNTlDMTVJUjtTXFkpMlUkOFc1SDxCRDUKK00mVUFLO1cpKDlWUSUvRi1JNkNFKS1ENUo6RjlAMzc1VTxVTVpAVi07ODVBQDozUEktRTUkOEVMXjg2UU4KK00/JzxcKCJVOj5HSUY4Rz1RMzUxTD5XKiI+Vi1GOjVZKTQkJEAsRUFAMSM5LTlHKUIzNUU5NiRVWjxFSToKK004Mj06Pzg9WjlGLTgyM1w1IjFAXzJaRFYtVUlaNyYtWztGXUA4JUktNjYlQzZWLUw6V1VSPkc5UDZWKUoKK003RV1aOlRdODMzRSQ4JiE6NiAsX1UmLVJCR1VSOjVMXzM2LVo+RVE4NTMoOylWTVI3Q0UkOEZNQzJTWTQKK00vUjxWNCZRNTM2KFk8SElGNlVEVjo4ITUmUUBJLUY6KDokXToxNUVAMTRQWTVFOTs5R0laPEYgOyUxTTsKK007RjlNOkVNKTpXIUovQCQ7IDI8IF9IIio6Ri05NkZFUjlFQUArMlUlOldNUjxDXEkmIykoPkc1QjxGLFkKK001NjohPVM4VjgnPVAzJU1SPkc5VTpEUU5CRz1DNlRRSDpVNFsrNUFBMzREQi9WXVI5Rz0vLURNLTs4LVIKK005RlVXMzNFSTxGTUM5Rz1POEYtOTZWOEU1NU0pMjYhTzwnPUgtQ1xWKzI9SzxGUVQ8JDFLPzhJWzhVTUkKK004NERJIjBYTTE/WEAmVTlKL1VKITxGQUI4JU0pNkYlQzw1TUE5RylSPUc1UjxGXUQyNl4iPEZBLTIzXSkKK00zNiRfLUM4Wys2SUZAR0lDOkYtNTZVWU5CNkE4NlY4SSZUNUI8NEUpMiZBOzgjREUrM1A7LUZFSTpFQEIKK002SC1MMzM4RThILU8vIiBSNTM5S0ImXUEyNV1INkRVJTI1OSg2RzVaPVRFJCxBTSk8Ji1SOUNdLT5IKiIKK006VVghMSAlNCAvWV1CR1VMNCY9UjxFWTkuMzkkLUNFUDtGTUg6NExNLCZOIThWOUApVEUpMicoTSc1SVoKK002I0U2OkdJWjlDWD02SSoiPCYlKTZGKSsvRUVJNkcpUjEiNUI+VylSMzM4XysyXUo8RVFAPEZRQDolSUMKK002I0U6OjVAXy9FSUkqNEU0KCIpSD5HKVs8Ri1INTFAODI2KSw4VVE6PFgqJT82TUg6RyFCN0MgOCgiR14KK00oIiEpOFJUUD1WKTozNEU5MTVJUTxFWUM4JUlLOERBXT5WSV89UzlLPzc1WjlDOFY2JklINkRFKTYjOUoKK007NzVbO1RcVjYmJVA7Jyk6L1RFSTo0TF42Rk1AOCVNQS9WQTQqMlVALEI1TTY2OVEyNi4jOlVEVi8lTVoKK008VjhcMjVAVi9XSU42ViVIPCZdSDYlOUA2JFVKPzchNDg2REcrVkE7N0ctOzNXKidARyEsIDZAITpAI14KK006WClcOkYlOjpHSVI6IjxWPSQwOy1GLTo8VllIL1I1Oj5WTUs5UjRWNSNdNiZRQFA3VChNNiVJSzpUME0KK00pNToyQkgpSDYkRF8rMzlQPCNFSEJGQDUvRkk8O1VAXjUyIEAxJUBZNicpWj5XKUI7JilAN1YtOi1CVSkKK004M10pLUBYNSwkNSw0JjFVPTc8SSNCKF41I1xHKVVJWj03NUY6Vk1OPkZNPi5SIEVfQ1BWNlckXCk1QS0KK006JEUkLyI1K0BXXS8uNFVCPCYgRzxHLUM8Ry0lOyc1UjtWQFYrM0VKOzRRPjI0RUY4VVEwOkY8XikzWS8KK007JlFDMjM4VjM3OVczNFVKNkchQDhVNUI1QzhNMzQwUjokTSU+VyVMQFcpOjI0RF42RzVaPEclQDEjXUYKK005RF1BOFctUzsmRTY4ViBZNCZJSDdFQTg1MzlAMzQ1UjxGKUY9OCoiOFApLSAvWSU6V0lVOlVNODkoKU8KK00pMlVROjNMRTI0NUs6Rk1ALEU5UjhFTUsyNEVBM1REXjEjWFktQVUpNkVBRioyITk6R1YlREdJKS1CIDgKK00pNylXNiVOKj1SRF84NFFLOzVBQS8jUTg2IzhQNydKKj5HSVc6VylXO1YpKy8iVSUyNUE1LjMoVioyKF4KK00xJUlOQFYkVCgiNTgyMUw4MTc9TjpFWS86JjlVO1ZFNC5TO14yM1lBPkZAWy1ERVc4I0xAJTJVTz5VREAKK00rNiFTOiNdSDpWKUo6ViVKN1UhRzVDMEUnNSxeL0REXi1GIUg1QzEtMjMgXDElSVM8Rik2NTNZJTpYLUsKK001RiElOlZNLz02STUuUjUlLCNdWjJTXVI+RyldPFYtQS5RTEU6SCldQEYtRjtWTTo3RiVDPFc1SzhUMUIKK008JFElNlVFPi9SVF8tUlRZOlchNS5UXUZAR1IjIDVMIS4wI14rNUFOPkZVSzhEXU08I1xNOEghUC9DWSkKK003VUk5NjM5LTxWXTw4RFFDPSRRJDhGTTkrM1BNMzYpNjIxKDgzNylGPTkqKjlSRC4jQTUwQEcpQj04IUEKK004VUxPM1ZJSzhTRTg7JiBcJlMhU0BWWVY+RlFSPkdJUjo0NEUrNDFAPDchQS9SVEktQ0RfNjdJUkAlNFIKK002Jjk7MSVFWjxGSTktRUFPOSY5TzdFXStfRUBZMzdFUjIyNSQ+VkBSJTFATTg2XFwjQUxeOlcpVz5XKUoKK004RVlBOkREUDpVQTg1I0xbKTJVJC5TOS06VV0lNjNcRywkRS87Jy1ALVRFKTJWLiNARklDODZZWzZXKUsKK002RDBAMjMoVj02KTs6NiFKPkdVUTo0NEspNFVSPkcpQzsnLUM2VilJOyc5VTs2LEcxJyk/NkYlNjMzOEUKK00tUzhLKzRdWj01SFk4SCkwPkAlSCAzOCBNMUxfPCZZRj03SUI0JiBNJTMhSkAlXSk1JDUlNUNYXjE2KVIKK008RUBQMzcpLDYmRVo5U0xWL0YpTzVCRDUoJDFSNjVJWj83PFQgUFpZLUcpUTxHSUs4Ry1DL0NFOkAmQE0KK00zJz1CMSFANTE3LVI2NF07PEc1VUBHQTQpMyhfODYtTzglQSQxJE0lMjRRQzlIOVIyVF1LPCZJQiBXKlIKK004MzhQOkZBLzpXLUs4NUBWMSZNSTExTE04NUE1LyMxKTtWPEkjQTRSMzYpWkI3KUo4RUU+OERMUDgkMUoKK009ViFBMSM4Iy9dNTg4Vj0pMlUwVi0jOSU2JSEpJlI0TS9UUVFARlU8OyZZXTxIITo4NjBWODNYXzQmTUcKK009VVEsPkZZSzo2JSQ4JkVKO0YtPjxGTTsyNF1BOVcpVTlGJSk4JiktMzZNQDZUTFY3RVkkKzNFSkBWSEUKK002REVCIDYsISswI14oIyE+OiRVTkBGSUI2IiAuKjRFTjkkVUgxMzheKVRFODElUVI4QzkpOEVJSDpXKUYKK004NERZOEcpQyxCIFkzN0lGODZFTjxWOFAjQFhNOlZVVUBHKTk6Rkk4LUYlXTpUMSRAJl0pJzE0RTMnSUwKK002NUU7OlY5Vj1URDsoIj1ANkZRQDYkRFYxJUVQMSNZLEBYLUkxNk1aPEZNSzlHPUk1MzlDOFRNQz5XSVIKK01fRlFANiZNUDlDMEkpMj04OjRFQz5GREAiMUBJL1QxRj83STszNFVAM1VBOjI0NUc7VFE5PCVYXzIzXToKK006NiE2NjREXzdERTg4JV0kKzMoSS1DOSQ7Rkk6PFcpRj04IS84Nik2L0VBNjEkRUA8NkE2MjRFJDglSUoKK00zNTlCNkNcTTYmQUo6JFUlO1dJSj1WRTg6JV0pMjYpOjZFRSk6JyE4LEI1OD5HPFI2KCk7OlAlLyAzOCAKK01fQ10rOCZZOzNXVVI0NiBcJTJVNjlGSTs7RiBbKCE0VzdTXSk7JyBfMSQ1QztWSTs0Ji1ANiVJSjskXFYKK00xJEVTPFYpOjsnSUo5QkwyKzYpWjs3RVo6VklPL1IpQD5FUT4sJylKNUMpIS8iPUo8Rl1INkVNMTlWKE0KK00oIiBJL0RRUT1WRSktQlRePyVcRSk3KiM8Q0UtPkc1UjpGViI8JVhQNiVBKzpXKU0/P1opPEVFQj5XTUYKK002IUA4KzRdQTwnWVAtQkRNLUVBQDglIU86VUElNkNFLzsoLVI2RDVCOiZNSDY0RSw2RU0pMzVIVis1SUsKK008JilCNiMhJDYlWTU2Jik5OCgiIDZWSVIxNl1KNjRFOTVGIS0xJilaOjRFLzEkVSQ8SCFKNjVAVigjWTgKK004Rl02LjZFUjhXKVo4RUU6MjNFKS9TPTg5RkFSNiI0OC8nLV04M1oiMyggITZQJFYgL1hZLjVFTj5WSVoKK008RilDNkM4Vy9ENVI/NzlLNiJMTTYmKTYyNklQMjM8Ry1FIUw2JDU4OEchTzZEVS02Rkk6OkZJJS1EXVoKK00+Rkk1KTMoWTpHXUI4R0lGO1QwSS9WSUI1Q11LPkYkTTElOFY4Jy1aOzYpLTonKTgqMl04O0NMUDgoKVoKK004JERcLjcpQykwWSw9Nk0pMzdJWjxGOU1ARy1LL1I0TTgnLUs2V0teREc9LzhXSiI9NlkhJiMoTTJXSVIKK00zNEUtNiYhQDhGTUAtR0lKMzYkTS1GLVo4VFU4OEYpTT5HLVo8JiE4L0RVRi1BQFY6V0lSOFVcXi42IVgKK008JzFALUJVVUBHLUs8JilSPVYpOjIzRTY8JERUOkcpUjpFQE0pVkopQEYpNjU0JFYvQ0VDPCRVKDpVTUYKK00+Rkk2OiZAWys0REUxNiVSPkZARSNBVUI7R0xJQEMhUiA2LCEvUCNeKjFMXjtXUiJAR0lGOlVNQTY0RSUKK004RzYmPTRcRy9GTVM6VyFSPEYtKy8hTFY6NFRWMlchSztHLSkpVTlaOkU5OzEiNFY8R1U6NSJUVjYmSiAKK004RU1OM1VNQjdERUs8RUUvPEdJSzdCPFAtRF1aQEZZQDE2SVo6IkRFMTkhNiZSVVJARFBZODZBWzoyNC4KK00tRyEsLjVJWj5XKUM3JllMPEYkQCUzRUM6VF1KX0hKIjYlOUpAWC1VPCRNPzdERUg6VUE4OCZNSzomRUYKK006RUFSPTZNSi5SKSU5VTk7OEZNSjpWTU4/OClXOjNcXzhFWDstRiFLPTc9TDgzXS86RFUlKTMoSTM3NVsKK007VilSQEdJTjxFWE0sJkFILUQ1OTs4PTYmUTReQEhJWjhGJT84IzhCL0VJQy0lSUA6JylKNjZJRjIzKUkKK00vIlUpPEdVUC0hQDsvRUlOL1goXzpQJUsgNTggX0I0SzY2TV0+V1VNOiYhJDZFQUM4RkVSQUdVLSgiVTsKK009NllaQEgpUzpGIFIpNlRZJTJVQTM1IiI5UjU1PVchJTY1QFwyNyFbO1VYUikzRUJARyFKOUYpMDdGTSkKK002RzVDOEdJTjhXPFYvIyhZQCdJQy1DOTo5Rz01KTNeIjtCIDsyOClQMjNdQkJIJT4oIUxfKTFVQD5HPVIKK006Vl1VPUc1Ri0iTE0zVkUlMS9ZWkJGRFAxN1FbPUcpSTMmKVIyNiUvNlVJTjxHKUk2VklSPFdNTjhVNDsKK00rNUUvPEdJQzhVUTs6V04jPzchODYmSUYrMlU4MzYpWDo2KS02Rk1AKTFMVjYlSTw6Ri02OkdJUjxHSUoKK004RV1COlQwSSk0PiI1QiAuJlVFWjs2SUg0Nz1BL0QxKTolQTYzJSFCOFZFSjNVQTg6ViRFLCYtVTxGRTUKK00vJFVQPlVGIjg3KCE6QCUkIC5YQC9WQTtARzVdOUVROzMjWFYzVkU5OUdVWjZCKDUuNik/O0guJkBGTS0KK00xIylIMSFMTS9ENTk+RzxWKVYhQywkTT82NUlTPTZJOjEyVEUrVjldPEZVSzNWKUI4JUlLPCc9UzcmTVUKK00xJVkkLEcqIjoiNDsrMylKOjVFKTsnLUYpMkVLOzREQC44Ki0+RVhJJlE0NS1ALTpfRilLPkc1WjxETSQKK00yNE1BNjVBUUBHIFYvRi1GPTYpQClUNVAvVEUkMzNdQjpXKUg6Ji1SPldVUzhTXDgmIlRQOEcpJTM0VS8KK004VylaPlc9SjpHPT4sQ1ErLjQ1UDpVTUA6NylQNjNdLz4nLVI6RiktN1ZdSjpGTTA5J11aPEVAVi1EUU4KK004RChJKCJVQDNVRU0xJi1QNlVAXzY3PUkyMzkpNiYhQCwiPUE6OF1JLSJFLzhWLUs6JUUkOFc5SzwnSCEKK008QCUpICowSS9WTS87R0oiPEYtKS9UUF4sJi1COkZZTjNVIEAuU1hWM1dKIkFGTSUsI11aO1NcIy1MVFcKK006R0lSMSREWS1FQUg2Ri1SPEc9TjYzXE0rNi1OO0YpQzZWQTo4VyFKOkc1SzNVSUgvRkVYNkZdWjVBQC4KK00mI1FDOlZRQDZWSVc2IzlAOkM4MilWKiZDOChcKCFUSSxDWSQvU1xUOlAtWl9FQFA4NUUpMjZFUjs3SUMKK006NkUoOUctOS1FRUk4NFUkLUJVLzhGWSU2Vl1aPUc1VTxDODgjQUBWOFctNi9UMTo6Vl1CMzZJVzxHISQKK00vVV1JLUM5PDpGKUg6VilLPVZBMThXNiQ+RihfNUZJQjY1XSwxVyYiPkdJTzo1TUY6VkE+LyJVJC40MTUKK00oQ11QOEVAVjNXUVo8JUE5OEVJQC9TKTg6Vy01KjJUWTs4RUwzMzg7KzY5UD1XMCE8QCVAIC9YTSlWKUMKK002Rk1VPygtSy9FQTYnM0UsPFgpTjZWJSk1RERJLUY9VUJHKSksQzlVPkZdKSsxTDIvRloiP1UwPS8kVUIKK003RylLOUdJWjxGUSstRilOPERRJC1GRUAxJkFOQEdJMDY0RE0pVkYoO0c2IjozMDgmVE1LO0cpLTE0UVIKK006JTlPPVZYVCZSPUZBODVJNTVdPjE0XT4xNDEkNlZZWkAmKEUzJUklMjcjXjxFJUo4RklYMTQ1UjpWKUsKK009Vl1IMzM4RTI2XUEuMyFIPEZNSjhGKTUoITQ7MjZNWjpVRF8xNk4hNjJEWTcnKUgvU105PVVEVi1FWSUKK00zNERNMSZRUjgyTTo/OClLKjNdSjolOSkyNDUkOkdJXEBHSUs6RklSPSRMVi1ERUA1IUxFNiVEXjY2LVwKK009Nk1CNjZdQDZGJUA6NylbOjQwQCZWIVAvUTQuIjJVO0BENScgNyghOEAjXis0MU88RUUsNlZWKjxENSkKK004IzhWLjZGIj5HPVM8JklANiU1OzlHVVs4M1heNCdJXDwlMEkmIjVCQTdVSCszOSw2Ni1MPVZRTzw3NVoKK004RUFIOUYtQC9SISU6I0UlNkgqIjEjWFwmIEUkPkdJXUBXSUEpMUBeOFcpUC9DISQ8Rz06M1YpXUAlWFYKK00xNz1VOyZOIDhFRT43Q00pOiZdRjpXSVIyViElKzNZV19IJU44RSU6PVYtODZHSVo8R11SPEYgTSYjPUgKK00yNEA7L0ZJSTokVSU6NixAKTZBWj82TF8tQyk6QEZdJC1EXU84JEUpKVVdTC8iVFsyNTRNJiFUWTpXIEUKK00tRjlfPEJURzM2XUEyNEUkKERBUTs4KVk7RklKPVdNUDUiVF87VlRfLURVQC1DXUM9NzVCMTRBQzIkVUkKK002RylCOFVJPi0iIS07VTQyI0FATTM4KF4pUCUsIDQwIF9CRF42Nk1POEcpUj5HKUg1RFU+NyMhJEA3VU4KK008RzVSMzVNVzwmKVI9Nkk6MSNdOjkmMVg4MyhFMzZVMzlWRSk4JVFLNyZNUzxHKU47RUkwOkVJKTg1WEUKK00tRkFAMTVBW0BGQFYmUiBLLCYpSz5IKVo4UyhAKTMhQDpWOFYtRkFSOUNFJD5HViA6NF06OEcpWkBEVFkKK004JERFJlQ1UjxGOU45Rk1QMTFMRTEvWVtBRz1ANkZNSDI0MiBAV0omPkc1UDEiVF83I000LUJVLTomTUEKK00yVUlDLjJVQkBHVUssQUxFNigpWjolQTs9Vy1CNTIgVjgkRFIrNiVVNTNQTS1VTVE3Qzk4OkYtKSxDRF4KK00yM1heMjM4WTdVRUo7Rl1IOEcpXUAmPFstRiFHL1M5PztVMFA6RzVSNkMgXjYkMSw3U0VIMzYlJThGRSsKK008N01AKjJEUjI1QiI2JiAhOjAlPiAvWTwvUzhQLjNdUkBHKUs2VERZOFZdKSs1RVo5RVlGOiM4WT04KUMKK00zNl1INlZFQTYkNF9AJyhWLUchQylUQU8yNk1SOFVRQzdGWVI6VUkpNjYtSTJWKU8wQkReNUM5JD5IMVIKK00xIU04NjI8WTM2OiI/NylDN0QkQC9FTUArMikkMjNcRS1GTU48RkxcJlI9RkBYLSkpVUUpKjBYRTlXKVIKK008JiFLPiY4Wy5VR0g5WCldPFYtOjgiNDs4J11LPEdJWkBXKT84JERfNkZVPzM2LU84ViVQNjFUOzI3KVYKK006M1A1JTNdVz5GSTgxNilQNkZFRi1FTTYvIiBZO1VNJTI1QUE8NkBeLUMhOjomITQrMzklLlNFODYmIUIKK005RklAN0VFTT5IKUI4NEU2NUJUTTYnOUcvRyYiPkYoIy9IRSk4ViBWNUYtPzpUPCM4SEVBNiRdQDM1SUIKK003VkwhPiAmICAvWVc2VERSJEFNQD5GUUM4IzhFNlcpUDI0NiA6JFUwOCIgOzZIKUszVTksMzchXzwkVS8KK00/VzxeLUZBQjI1QUAxNi1LOEVJOzZWWVo8RkkpL0RRSTgmRVs6I0xHL0JUTTwoSiIyMiktNjI0TTI2JVIKK009Ny1SOlYkXzI2JUYtQlRfL1JENSs2KVo+VlxNI0BYUDhHTSkpNEU8LEE0QDYmRVI9Vi1DOlZFKTNWR1YKK006VzVWPychPzUyIC4rNilIOFctWj5IKVI4VERfM1ZJWjdWTUgzNiVLODJEQDYnKVI6VURSJlM5Sj5GVUEKK002JiU7MTVFUzY1TUg1M0xcMzQwUCszWUM8Jk0/L1M5PjhIIU8sQkRWL1RFNjY1SUI8RyVINkVFQjknRUIKK00zJDEpMSMoTTE2PSw2JyoiQEZNNisyNFY4Rkk6NkYpOjxGLTo2QC1CQVZBRjckXUk6VighOUAlVSAvWVsKK008RkUkIjE0VjZGKTw2Q1BNMjZNUjxGKiI8JFE6OCJMMis2LVc6JiBWLjVOIz5TRFY6SCFLMzYhKDgmMSwKK004Jyk8OkZNQzdGOVo8VkkkKCNFQS42KVo8Ri0pLUIgODMoXio8JUUrODREXzM2LUg3JylaPEY9OzY2KUsKK002JE05NiM4SSo0NVI/NzxfKCIgTTEmTT4rMyE+MSJETzE1TTs+RylDOERFJTZGT004RilGPldBSzdCIDUKK00oJUVPOEcpUjo2IS04JU04NkZJUjpHKTovREUxOCQxKTpWWUs8NF0kKjM5Sz5HJUI4VllBL1VBRjo1WUsKK002RE04OCREVigiIF81Ri1SNlYhSDM2SUoyMyhWMjRVNjI0RS05VyVRPEZBQjZFSVI5U0RWMjNQVi9URFYKK00zNklaPzcpSi9SIFY1QC06RCYpQjpGSS02RiksMyddVzokNTg4VkghOEAlRiAvWVI8Rk0+KCFAUi9ENToKK002Q1hNNiYtQjpXKiM+RiU6OiVESSYjRU83JUBbL1RVSzxCVDstRilSOkYgXjVGIFk2SClKPFZRRjpUMUMKK007JiReJlNdOCk0UUQ7NylJMjIgLis3RVU9RyRZMTctUDhGKUczNilOPEZZUDsmLUM2RiU7OichPiwjOUIKK007RylIMlVBOTomUUgyMlRSLlNRKTZVTSw5RzVPNiQ0XjYnIlw3VDVAQCgpVjlVQFQsRUVSOlc1SzsmQUAKK002RUEtM1ZBTThWLTotQlRNLUMpNkAmKT49VDBNKCI1QDxGWUk2RiVBNiVNQzhXKVo4IzhZOjYkXyBSIjcKK00sJUlAMSY9SzgiVDgmI007O0cpTDg1QSkyNDVCPCREIy9aPSU2NkE7NiVBQTg1UVo8JF0kOlc1OzMmLTgKK002IlRJL0VJQzdUMSQ4JFBWKVVJPjwmRTY0JlQhPEAlQiAqXVE4RUlCLlFAWzYjISQyMlRFN0ZFLzMnTiIKK00+Rkk6OlcpKSgiVU82QzheNiYhMDMjTFIpMl0tNkRVQThWRTozIDFSX0VRSzM2LUs4JTRSLUVYTTglTUIKK006RlEpJiBYQjZEVTs1MVRfPkdRRjZGVUA4JVFCPCdBWzhVXSk4NiVCPlcpPC9URS04Vj1IPEYtUjxGSUIKK001MiA1KzZBSTolQF88RkkrNjNcUDtWQF8zN01dPzdJUjdENSsyNDFCOlVZOjpWOFYpMkUpPEYpSzolMFsKK00qMTRAMTdJRjlIQUAqUUBANkdJWzwlTSUyNDU6PDxVKDpHSU8rMUxeNiRMTSoyTEc2NDBQNkcpQS1RQDgKK00rNiVdPUZZUDo1WSktRDVSPCRMVi9ERFYtQ1hfNkdBWDhWTUs3QlRZO0dNUDhVRSkvIzEkODY9OCszRUIKK00yNDBWKzFVLT9WKS05QCYiIDY4IElIJUg0JiUkLURFOC4zTFImIiEpNkNERzwoSVw4RUFSPkZEVi42QToKK00rMzlDPVY4XiwkRFsgUjc0KzYlSjwnTUkzNilOPlcpTDZGSVo6ViBfL1VFKTgmLUs6VkkpJiBEUjdCVE0KK00oIERfPEZVNi42KUM4RVBZOjc9WjpVRTU6NyFQOkVRWjokMFsyVUlDPkY5Pj5GSU48I0QuKTYpTzolRF8KK006ViBQMjJUMiBUR142NkVLPUcpWz1WKUEvUUxWMzYhPzY3PFwoIUBCOEYpUj5GQT4qMFhAMjZRQzpHSU8KK00tQiBWOjdOIj5GQToyM1xZNlYtQT1XLTUtI0U4NjM4VjUzOSssQSklOlYtJSwhVEUxNk1SOEVBQDhGKVIKK008NlVXOFM4VjUyVDUoIjRQOkdVWj02WVcvQU0sQkhJWzwlSTg2NUlOPEYgXi9GIS04NyErKCI1QjojOFkKK00gN0whPUAjKUBHKUIvVUE7OiZNSTYyVDgtI0U7NUIpQEI4SU82RyooPUYhOjZVRFIrNkYjPkYgXy1ERFQKK00nMFg7MjRROj5INTovVVojPkcpQjpXSVU6VFElNTQxODM2IVI+RkE+LENdSCkwLClfQilCP1YgWTdWKUgKK006JEU4OUcpPywkRUk4Ji1PNCZdTy9TMSs2Rl4jOiVNUjpXKUsuUUBAMSYtSTNVWUM2IyBWKCFARSZSKF4KK004VlFIM1c2KT5VRSQoITRNO0ZFOzhFUEcjQFk2MzY9SjQmTTUmIiE4OCVJLTxGLE0pNTVSPEc1Wj5XIUEKK004NEUlOkchW0ImXUA2JiE/LUJVPDZFQDgjQjVAOEZFQTEjMEcxKF1KMzRVQDlGSVI7VkFOPFVFPjYzRCMKK00mKihJMSYpQjcmTVM1ITRHOSZVVj5XKUs7Vk1OPUZJQjZENSQzOCFLNSMpJDdSKE0gNighOzAjKTpWLVIKK003U10tPkdRUzhFQSQ2IyEkOyIoUDs4KVo4Ji1dOUQ1Sz5FQE0oJEYiPEcpUDYzWFIjQERAMEI9KTtINioKK006VyldPkY5QjsnSUY+R0lALCI9OzRRVS0+RiFSO0ghSCggLDVfQiBWOlghQzgkNSU7RyElOCclOCxERUMKK002JFFXQidJSzEiIE0vVi1bOCNFOjpXSU8vIkReNiQ1ODkmLVA2RiE4NSMoVCoyRDIsJi0sL0RWIj9WRTUKK00oIFhFPCg1UDZWIT4uUUBNNjYtLSwlQT4mUUBcNjYpQD1UTEUoI01DOFYpUj5WTT48RkRQOEYpUkBHSVIKK005RUlNLEM5Rjg1RSQxI1EkNkcpSzo1NEUrOU0tLCNZQjhWVVI5Rik4OlZNUDskREclMFhUOCRUWS41SUIKK001MzAjKzk5JT1XOU46Nk0+PEZZXzxEMTQuVk1XNlYlUjpUMFYgNEQhNlAjXjMzWSc4U1hZPEcpQzwmKUAKK006JFU1OiNdJDZWKTo2V04iOFNFQD5FSFYtREVSO0ZZSjo1MEsiMTRHKzE1KTZWOiA9ODVdPDY5Rj5XKTkKK006OClXL0IhNjIiNSk6REFDNldJUCxDIFwuUkxFMzdNQjYzXF45RlxeNichSDElRUA4VkFGQFgpOi9DREUKK00uVUFGNiJUTTE3KVM1MiBZO1Q0XzpGWVozNi1QM1NYX19DXFsqUlUpLlMoXDtGVVA2Mjw4KzY6Iz1VSTsKK002JiEhJTNZOTI1RUE6JTRcMSRVSjhGIFk2I1BULjQ1OjxHLUIzN0ogNiRdOjZFUTs7VVxfNiJURzZGTUgKK004JUE+N0RRUzhXLTQmUUBNMjM5LTpGWU44Rjk1OFZBUjxWRFYoIShUOyVMXjZGLTk4Vi01KlFAOzVHKUwKK000JilMOlZVXTxEUUM2JFVKNkVRWj1IKUkxMCRQIDVMIF9FWE0mVUFCNlchLSwmIUo4RUksOycpLTMnSS0KK00pUzlLPTYtJDonKUI2JUU8PEdJSjhFSUYvIUBHLCIgLiozOF4zNU4oPkYpPDpXKVI7VllSOlYhODNVTUgKK004RklCPCZJSjcmVF8vVUBSKCRWIDpEVTozNk1JLlNdQD01QFYsJFVQMicpWy1CKFYpMlUpOCREVCs1NUwKK01ANl0kMjcpOSs0RUxCRDUlOzVIVjE/WS0zJVkkL1RFJC42XSg6JiEkMSNZSkBYKUw4RilSOyNRKzYkMS0KK002VUlPOkZFOjomQFYmVEU+KzIgVjYnKVA2U0VGQFZNQDcmQSUvVUFINjVBIixDXUM9VEBZM1cgTThGLU8KK001MUAyKjVITS1GKVk7VVlLM1RVOTo3LVs2IzBHLSYlOy42SiE7Jy1SOUNQQCUzOVI8VUk8PEc1Wz82KFsKK002NDRbNlVNQzlHNiI9NywhOCAlOSAvWTguUSkkPkY5Qi9DXSQ4JiEsMTYtUjMiRVo4MyhXMjYtLzJXIUsKK004RklLOkZdWjs2SS86JEQ4JiIgOCUyIFYxIUxNPldJOTZHIS85R1FVNjNdQj5VQS08VUk6OkcqJD5FSUoKK001M1k6LyFMUDxGSUo5VFE6OFNYRS43PVAvQlUkOFYuIEBVNEkrMyhCLjZcXighTFk6WCFCOEdBWjlSVEUKK00yODU/LjYpKSo0R142VD1COUU1OTY0XVA2JFBeMSZBODM2WVo9Vk1KPFc9SDM1TSk1NiElOFdJWjlGOUkKK00tQkUpNiQwUi5VQVc4ViVIPEdNTjxGSUo2JFU6OEZRQzgjWF82Nkk4LURFOTI0XUM2RDRUKCJVOi1CNSUKK01AR0lCOEU1JC40XU5AVyErMjNFODIzOUJDOC4jQEctQTNSNFY6VylHOEZZWzpYLUcxNkRfL1YpSzlFWTwKK01ARSVSIDcoITMwI14vUUwuKzcpUjZEMUA2NjlAMlM5JDxGXSk+RkklMjRFOS1DITw6Ri1SOlVJSj5HSUsKK004VlU5LyMpJDEjMFQyNVAyKCZJVzImKV02RilaPEZAXjA2OF4xJ11IL1RVOTs4KiI7VVEpNTQwSyo2IToKK005Rl1AOjZBNCwjKTo4RTU4ODYhPkBIRVIvQjRcKjI1QzEwWC4lNEUtKzQxWj5GPE0lMj1KOlVJTzgyNFYKK01fRiFANjVJLTI0VSs6Rz1AMjNFQz1URFIvVk1SOUVZTj1UQS02M1lBMjYlTkBHITo2M11BPzRFKzdDXUgKK009VilAOUcqIz5HOiA8ViFAN1RRRjxHIT82NiVKODVBKzYlRTk2VERWLSI0XzgjODsrNkldPEYpJTYjTFAKK002R0laOlRcUDIzTEUxOFIsQUdVUzhVSFQsRUE8OUYpPDolOVU5U11CLjNFNj1WSUw6OCklNkAlSiA1TCAKK01aRUBJJiI1QjcmKS02Ni1ROychLS1FSiJAV1VLMjNcVjIzREkuNilDPFctSzpHSiM4VilQOFVFQDpGXUkKK003Vkk2I0I1PzxETSc8Ri1DOkZVUz1VTTgmUlVXPkYpOjdWKUxDJ0k6NiVBKTEkRUM8Jl1LOEchUDglNTkKK005RDFAOkcpOzMnSjJCRlxcMSQwUDZDMCMjT1g1JTBYVj5HSUIxIzEkOiVFODhXJSkvRF1JNUVJTzYkNSkKK00xVllSNiNdOj5GXEklMlU5NiNEXz1FOF42IlRWM1ZRSj5HSU0vUkVCP1RUXzozWSQ8RiktNlZaIzxGLVoKK01AJj0tMSJFLDxXSUs4JiU7OjYtQDZVQUA2JERcKzJVKTZDOEUqNFFKQFZNJS9DOEAsJk1WO0ZEXzEiREAKK00rOCotQTgtUzhVSTg2NF4zNkZJRjM1SUY6RklDOUNYPSk2TUs8Vz0tMyApSyAqRUI3QyhSNiM9OTEzRTgKK002ViFSPFNcRzhISV07RU0vMSNdJC5TPUE7RlFSOzY5Wj5GKSU2REUlPEAuIkdWTVI7MUxfMyYpSS41QFkKK00zViFCPTgtUzdARDgxNllXOFYtSDNXSVMxNFAjNi9ZQDY3KVI3VUVSPEYpOzo2QFY3V0oiOjRVWkRJKVoKK002NDU5MjcgViwjREAjQEQuLUgqIjpERSs8OC05NiYtSjtWXSg4M0RZPichJTE2QTk6VkVIOkZVWjUiPEAKK00rNUkzL0YpLTE1NE0lMlUsNkcpUztTOEk4RkRNLCclOCs0RF4tJV1GPEVNKTQ2VVc4U1xFLjZRWj5GTUAKK004JV1PPCYhODhVRFYtQyhWOCYqUi9EMSQtQylKOFVAUixCTEkzNjlOPEchKSRBKEk7ODVVPzdZQDM2TVEKK00yJFU+OFVJODpHNUZARzU8KzFMUDQ3SVMzM0QhOlAlUiAoMVU8RkEkIFVLXjU0NSQmUlU6PEYkQi43SVwKK007Rz1QOFU0TSkyIF47VUlAOUY6IzlGQTgrMTRFNjdJWj83KUQ8QjRNL1VBQjIzTEUpM00kNlgpTjdTREkKK00tRz1OPEVFKTY1MEUlNFVLOEYlSzhWTUM6VUVSNkREXjg1RFIzNzYlPEVZTkJIOVU4JUE4Mjc9OjZHQTUKK00oITQuKjchWjhUNSk8SDlILCMpQDlHSUs5UkRFMyVcR14yIVcxI0VHQjhJXT5XIUYtQzk7OlQ1SDhFSUAKK00tQkxUKzNZNjhGIFwyNiFAKTI1QjlCVEcxJF1GPkghUjgkVUI8RyE5LyRNQjs3TVI6RU1BOEYpQzYmTUEKK00sQUBALUZBSzglTUgyUyheNlY8Ui0jUFYvVUEpMTZNTjAxVDszVk0xPlhJQzE2OiI+Rk1DOFMgUDxHSUQKK008RjlJODUwVjdWXToyNUAhOFAlViArKVo+Vz1IOUZJOTg1QE0kQiBWMjYtJCwmKU08R0lOPCYgVCUzKSkKK002JFUpNjcpVTM1QTglMFg1LCVBPjlFSF83VjheLUAtOl9EREklMjRNMjdJUjYkTF82JylaOkYgXjEzWDgKK00jQlU/NCUhSjlHQVI8Nz1POiVYVi1DUEktRU1VO0YtRD84KVI6Vk1JMTZNTTxHKVE2NCRQKzYhRjZURTsKK009V1VXMjM5OzhHNUs7JUE2MzVATSglUFYmU0VaQTdRXT5HPTg4NlFKL1YpTzQmLSUyNUxWMjREVy9TOFYKK00zVkU1LUVBLSsyNSk6NllWQjgpUDMsTS04VkEpL0RVSTpHPVI4VF1XOjRdQzo3SUwxMUA1KzYhQjonKVAKK008JTheMyZJLzU2OFwrM1xXKzNFTD1VNFszVFU5PkhJUDM1UVZBN1VaOyNQRTsoKVU9Ny1POERFKTpHISkKK00vRFQhNyAlUiAvWTk9VklGPkZJOzomIE0oIkRALUYgXikzWSw8V1VOPEYgUiUzWUAvREU4MjZNSjI0NTQKK00lMFhAKzQ1OThGKTYxNzVTMjVBSThVRSktQzkkNic9VzZURSk2RllVOkYtODIzXDUiMUBfMlM4VzZHSTwKK004V01GOlc9Pi1EMFwpNFFKMVVJSjs2KT48RylIMzZNVT1WLVA8JUE+N1YhLTZTWS8+R1VSPCVBOzsnS14KK008RjlSPEZFOjUzKTU1MUxFNkc1VDtGOVo7Jk1SOkQwVz1XKUM4Vk04NiYhOC1CVFYrMlUtOjVFQS1CVTUKK004NklCNCdKJT5VOF42NUEpNTYlQjY2SV84VFVQOlYpQjpYKiMyMUAuKzVNQzZWJUtBN1ldQFY5LTI0UFYKK00pMzxWKjI1Lz5XQTouMl1CQFdZVTZFSUo8KDldOzZFKTlXNU07N1VaNjMpST5GSFZAQzk/IDYoITlQI14KK00xNyE8MicpSzwmTUM1Q1kpLURFQzZERF4rNi1bOzchLSoyISk5I1hfN0VJTDNURSk4I1xSNCVROzg2KUoKK009VFVSQkYpJzwmWUM6JTkpNiRRTz1WKTgyNF1SPUZNOzo2JSkqMEQuKzQ0QCZVOUovVUohOjYpUjYjITsKK006IzkkNkQxJDY1TF4tJk1KOCYtWzw2KTo7JyEsNkYtQDglTFs2JzVbOCcpQzE1SiFfRykxMyZVWzpVQDsKK00tRTRbLURFSDpGTUM8Vk1EPTZcXic1XVI4VklTNkVJUjpUREUqMyg7LUVAXzNTKFY2WCVfOlVJRkBYIS0KK00tREU4L1RVQDgzOFI6RU0kPCZdQjZWLVo+RUBFJzNRQDglSTk2V04mQVhJVzhWITsyUzk+N0QwTS42WiMKK006QjQ7LEdJUjpWLUg2VVFdPzVRQjYnPUY6VlldPkRQSzhXRUcrOChHNjAlSiA1XCBfRFVOPFVJOjhXKU4KK007Rz1JMzU5SDpWTUo1QjRZOlYtSzZUMFY1Rl08MjYlSTxGSUA2R0lQMyRFTzcmLTo4NyheNDgpUjImSUwKK004Vk1GOEchOjY3SU82RUE7PUdJSzomSVA4RVhQJiIgSSgiISk4UlRQPVVBNjhVQE0yNklQOFZBSDglRTgKK00vQyE7OFRdQz82ISUzNilLOERFKS9VSUozJUlNPjYtQjgjRTk+X1lLLjJFJTxHXUYsQzheMTREVi41TTkKK004Vz1COEcpSjgjOFYxJFE6OEYtSz03KU81MyhJKCNRRjEzOEUtQ11IQCgpQjZHSiI1QVRQNyYhKS41RTUKK00vVUE1KzcpUjZEVTE7NjFPODNQXjdUXS0vQ0UtPThWKjxFTTk2RUUpOichOCxCNTg+RzxSJiJFQjMjRSsKK002RiE7PEgtWjZUNTgtVilTO0c1SjM2KUQ4MzoiKzRUITZAJSQgL1hWOUdVTi42IVI6VSFbPEVAVjZGTiAKK00/NixWLCYtSzlGJSwvVEVCO1ZNQjxGTU08RUlSPzYoUDNUVTg4Jk1LLUI9RjxGIUI4VVlSPkYpVzYjIUIKK006JUU6NkZZVTlGTUs7R0lLN0NMQCkzUFY2VyRcKTVBKTYmJUMyNEVLQkdJSz5HXU46VERFMiYtOjhHNUkKK00vU0UsOkZJNi9SRSQ8RU04OEcpTzhVQFk2SCNeOlNMRSs1RVs8RU1CN0YhQC5SPFstQ0VKOlVJSC9WKVAKK00xIlUpMjQ1Oz1XNUM9V1FAL0MoRzZWISQpMyhNKzVRWjhUVS88RTg7KCU5SzojIFY2JE1AODU5WjxUNS8KK002RkEkNjctWDg1TTg6JUBUKzVJWkFHSUkvUz04OUZBUjYiNDgvJy1dODRFNTQ0MEUrM10pM1UhWkBFSTUKK00tQjReNyQ9Rj5HQVI1RUEkQEJVRiA1QCEnMCNeKzVJWj5DIFA0JkklNkVRRikyVFk+SElSNjNFMDhFRTsKK00zNExfMSYpUDcmPTEzVylCM1ZZUjIzXF4vVUVSO1VNKTM1UUo4JEUoOkcpTkAmJFYyNU0tNUVJTjpFWS8KK006JjlVO1ZFNC5TOSkvRiVaOiNMVjZWLTo4JiE4OkhBUzMmKiJAR0lJLlMhODlXKVU6NERWLCYhSDolNE0KK00rViE7MTVNSzo2KTs4VylaX0cpQC8jUS85VylKO0ZFSTxGOSQtQjRFMzZRQzI0RVA5U1hWOUVBJDNWTVMKK004RllXMyYlSywjRUE2I10hKCI0XjgmXUkzNUUpKCE0Xj1XPSQrMyBWNiYtSDxGRF8yNiU4MjVJTT83KVIKK004NyFDNTM9LzpXVVI6NERFMTYlUj5GQEUjQVVCO0dNWj5WLSkvIzkpLjZFSTsnSFkrMyhSMjVJKTE2OiIKK01ARz1ILUgoPTYgJUEgMjQgRkVBSzpGWUAyVUFKOFZdSjojTEkpNUVVPkcpODVGKUI2VDUtIFYjXjhGKUsKK00zVUFKPEYpSjtEVTYyMjRQOidJTzxGTTk6RkktL1QxJDcnTVo6Nk1CMjNFKTxGSTktRUFPOSY5TzdFXSsKK002I0UtPjcpKSk0VUI3VF0pMzcqKDwjIFk8V0oiQFZEVi42OiI9Nz0pKzMpODM0VUA2I1hZMzQ1SjpFOSQKK002RklfOzc1Sjg0VTg2RU1CPCYtRj1XPUsxIiA4KjRdPzElQV88RDBNOCREUFhUTFk4RylSOFJEXj1UREcKK00zNUBfNTMoVDEjWTo8JilINUJMLis3IiA6MzhFLSNFQjwmKT8vU104MjRdQztGVVE8RkVDOFRdKzY2LU4KK004RVFJLyJVKTxHVVAtIUA7L0VJTj84SVg4I10rL1IpOzxWSUspMFhNKzQ1MDdTRUJASDVdPENcQC9QJUoKK00gNiQgXFgpXTpFRUg4JFVKOUc1WjpWISk1NiE5NjdJSjomLVA4IzhNOEcpVTlGKVI6JEU5O0cpSzpGKUEKK00tQTQ1MScpTj03STo4Rz4gPCREXC9XKVU9NylEMjNcXzxHKUEtQyFKOiRdSzxWTUE2IzkkOlZFJSZWKUgKK004JUBfLjVRWjxGISs4JilaQFZMXykzXVU8R0VIL0JVOC9SVF82VEQjKz09QkAiVEc3ViEtM1ghUjZUVUsKK009ViRZOiZdSjxHSVc2VDBAJzJVNjZGTV89RkU4OjQ0VjUzKFY9V105KVFNQDs0MTg2VDVGMSRFSDM1IUwKK007VllCMSJMVDMnIVAxIjRULyUhVztGSSQvVERfMTVJSzpHKVs+RiwjNlpZSThGTTgzNk1BKTMhQz03KUkKK001M1EtPCdOJUM3QUMxNDU+LyVNSjIiVC4jQ1hcL1NETSwmKiJBNyVSOFU0XyAzRCE6UCNePTgpVzZGLTYKK00tVilVO0ZZRjtVXS04VlEvNTZJTzZGLUItQU0kOkZVSzY2OVE1RV1QOlZBLzpHIFsjQFhFMjQ1Rz1UUSkKK005SDooOiU4WTonSVI+RyhWL1VZRj1WRTUtRi1DMlYtWz5HKUw4JUFLPCY4VDEkVS0yNiFAMyZNOTxHUUcKK00zNk1LOSZFOi9UUUY9NzVKNiVNODJVRUg4NDBFJENFSi9SIFkxIUxHX0ZdUi4zIT9AVyBfL1VNQj03SVoKK006RiRUJiIgVjM2TiA8Rk1DOlREVi8iREU6SElPLlFAUDgmRV06M0VKO1ZFUDYkXTo2SClLMTM8VjEmQVcKK004MkRNMTRFUz5HSUk4VEUkLCJdNjVFUVZCRylDOlZNUjtGSTgzNkVJLSJFLzhWLUs6JUUkOFc6LURIIU8KK00zM0UtNiYtMC4zRD0jQ1lAPTM4KSUzRVtBNllCMzgpKS5QJD0gM1wgQlZJVTxGLUAxNEU6PTc1WiBXK14KK00xJUFQOjIoWThURTk6VUhbNiVFSj9WKUo8RTknNlZJUDE0NUs5UkQ9LlNMRS9VXEctRklaPkZEXiZUNUsKK002VylNL0M4Xzs4KVA3QyE4NiRNSzxGVV1CNyk5OEdNWzlERFkrMjUpO1VJUDhGVig+Ri1LNkNdUj5GRFYKK00vVFVSQFZdQTglTUE4Vl1ALyIgTSxGKSQuM1BLKzVNVysxQFA8RzU+LCRFOjxHSVpcRylSNTIgQCZSVTYKK006VllNPFchOS9TUDsmVD4lPkVIVCkyVSk7RyBWMSZVTzgjRSk1Ql1SOlVEVCZSVSQ4Rl01KTJURzhHKVUKK00/N0lANjM4QCszKFY6WFYjOEY5TjxGWVo4ViVLPFU0SSszRU07JFRWJlJVRkFJKi1AVkhfLUVJUzg0RUEKK00wMFg7LjZJPCghTF88SC1VOVM4RS5QJTQgNEQgV0YpSzNWPSksJkVLOUcpWj83VUY4NU1SPlI1ITIxVFkKK007Nk1IM1QxLz5HSVk+RklGNUZJWzozITs8RERNLjREUigkRFImViVPNkNYUigkMUAxNUlCMzQwTTs4KVMKK006U1xFKzYhUzpVTVpERz0vOFdKIj01SF4oIFhFN1U5LTgmKCQ8T1lBLjVNUjpERFIoREFaOlYpSzhEQToKK008Rz07M1NcWTgmIF8zVVhWN1ghTjEjOUM8RyBNMTVFVTxGKTo7RlkkLyMoSzE2ITE4VylPLjJVPixDUUIKK00/OClQL0NEQCk0VVcyMyE/OENYOy42RF82ViBfLSI8SS1DOSU5QzA4KTRFPzpHSV02Vi04LlJURSxGKVUKK01AVVE5Plc1TjxUNTs8R01JMSIgOzgnIF8lMFo+IjJVTD8nIV1ARixWMTdBUjM0QUYoIjRJLEcxPiZTITkKK007NzVXMjFMViA2ICExUCNeMSVJJDZFQE0zNklKOSZBVUJFUUM5RyoiMTRBOCoyKTg6RkE4LjRVWj8nNV0KK01ARyk7NlgqKDdVRUM4RiE2OFZYRS9DUDsuNkk5LyMoVjlGKSkvREVCMjNdPDtGUVI4MiA1LjYtSzNWSioKK01ARUE2OkguIzgyVEclMlVNL0MhKS4yPF47V0lQMjVBOjpGJF8qMzlGOEZNSzo0VTs8R0lKOkZBQzhVSEIKK00sJDBQX0RVWj5GIFk2Nk1QLSNdQj02TUE2JF1DOCU5QS0jOS0yNFVINiJUODo1XUk6VklSQFQwUiZRQF4KK006RUE2OiYoWyZTOVA2JUE+LUJUXDElNF4uNiUkKTQxJDgmSVI7RUlQNlM4SSZTOUA3JlksMiZZTjpXIE0KK00uNilDNkVYVCgkVU81MSgpI0IhLDZUXTQ+RyhZKzZNXTZUVVIxIzhNLUZBUjYyTTg2RjlaPEgpLzogJUoKK00gNFAgX0QxODciXVc4RV1COlYpMz5IOTovVilaPTU4UC9CRDgyNzU6L0NFJT5HTSg0J01SOEVJVUBHKUMKK00zViVCNiZJUi1EQSQuU1k5OkYwSS1HPVI2VEReNiNEXzpXKVM8RjhUKlJVLzo0NSQ+SElJLCQ1XD5VQDsKK00qMUBFOSNYXjYjUDgmViFaPkchSDZGKUkyVjlAN0VJQThGRUo8R01aPEcpUUAmTSkmIUA7Jl9YWTxGKFkKK00sI0U/PCVBKTo3XVI6Vk1JOEQ1LTxFWEkuNUE4OiRERSgnKVo8RkEsNChBVzEiRDsyNkE/OkgtSjIzUUAKK008RklRODNcXC5UXUkyM10tMSFMTTU2QVI8RUhZOlRcTSYhNE0zNDE6MTVFTDhWLVAyM10tODQ1Qjo0TVEKK00+ViBAJTIhNTo1STguNilSNSM5Qz82USU6ViRZKjVBNjxHKSk2JUU7PFgyIj1XSCE+QCVIIC8pJzVERDsKK008RzVCNjVZSzcmOVU8VTklOldVSjE1MEUjQzlSPVNERSwmTV8yMyFCOEYtUj03SVI6RFUtMTRFQzhTOToKK006JkVJM1YpVzYjIUo6VUElMjNYVi9WKVI9NzVQMlQxKTJWJTk2JyYiPCM4XjhWOSkqMiA4KjU4Vjo2SSkKK00oIlVHPTdJTjhWRUE4IzlAOkYhLDIzRSk2NlQjPk9ZTTxINiI4Uyg9I0FAXzpWKSQvQ0RZN1YpOzlHSUsKK002NyYoPVVJOzpHIT4yVEUpODREQCNGRiRARykpLVZOKjojTE0yNiFAOUdJSjMlTVA+RlohPFREWy9UNUkKK00yUyErL1JMTTYmRVdAJFUrODRMVCgiTSQyU0RWLjYhTjpGLVI6NF0+ODRFOjwmOVo/NkBcLSVCIz5WLUMKK003RSVSOVNFMTxHPTs0NFRZKVNaKy40UUg2JilIMyVaIz5HSCFAQCVSIC9ZQjgkREU2RklKNkVBSzxGKTkKK006JikpNlgpUjpGQSQmUU06PkVcUiZTRUIvQlU4OCZJTT5HNUY9NykpMTZFUDZTOSQ8RlVXNUM9SzhWLVIKK006REReL1M5OTVENUY8R0laNiMhQTY0RSk6NylNPkYtSTo0QF85RkxWLUVAVjgmISkrNDVSPkgpRzI2LUoKK004U1kkO1RUTTI1WE0rNDVOPTZZOTtHQio8VUBLKCIjXjVHPUI6Jik7NjVBLTZWPUs4RFFGQEgpVTxHKUYKK005Rik/NiYtNSYgWS1ASElVN0JVKUBGXFksQzkpN1c9UjgkUUo8VllGOjcpQS1DUE02JUBFLEJUVjdGOFYKK002R0lQPEZJOS9DXT46NkU+LUNdQzhEMFk9Nz0pNiVJKTYlSUZAR1VONlM5L0JHTTE7Jk0xNlYpPjI1TVIKK006VUBfMyRNOTdFOF8uNk4iNlNdQkBGLTsgNkwhPEAjXjxHKUg2RkFKOFY5UjxHNUY2JUEtLjYuJzlFUTAKK006IyhALjYpMTciNFIvQjQ1MSZJQjQ3SVo4RlFKMyRFUDwmSSQsRilOPVVcXjMzXUI8R0lCNiVBJTo2LSkKK002VllaQCYoRTMlSSUyNyFSNDZJQjpHQSUqNiogOiNYXzI0VSkvRTFIPEZVUjVDUUI8RylCMzVJJCZSVTgKK00xIzhQNkclQjMmIU5CN01JMjM4TV9DXUg4Vi1IMzU5Oi1EQUs8RiU5N0ZZXT02WiU+VjlCNlVNOS8hQC4KK00tR0ldOkZFODNYKVIxMzhFLjU5SjpVXTY6Rk1DO1VBOTokRSQtRUFALlJEUi5URT8rMzlIO1VNTjpWITkKK004Vk1SOjVFKTgkXDsmVilSMiREVyszRSU2RlVQOlUgXzE3VVsyJi1SOlYhPDomRUg8RyEtOCM4WTs3KUgKK00oQjVDQkc1OS9IKSQvQCRQIDYsIFZXKVo6RilLPEYtQjtHKVI6ViEpKzE0WT5GKUg4RikpLlNdLTNWRSkKK00vQ1BJKCM5TzokNVJASClVOiRFKTpWSUo6MzkkPEg5UjpWQFAyNVlKOlYtODJVTUI6Jl1GOldJUjJWISUKK00rM1lXQDZZQjQ1SVc4UzFBPkghSjM0VCMyOE04PkdJUjhTOEk2JklSOFAtOFM0ME0rMzhWMSYtQzpFSToKK004VzVSOiYhODI1WTo4JilLMjMgXi5SVSQ6RkU4NjYpWjpVUV0+Ri1ANiREXysyIDUoRk1aO1ZNKSo3KiAKK006RVxfL0RVOjZFQUA4Vi1JPEU5LDwmRTg4NlFAIFNfIjI0VTgvJEU5NiVFSDxGWVc6RilKOlchQTMyVD0KK00mVFVSMTNMSypTPTg4Ri1DNlNcXzM2WVw2JDVPNkRFQzomKUc7RyU5NyFMOzI2JSgjQSklQEdVUi9CVEUKK00gMjQhNUAjXjpWTSktRk4oO1RVODZVQSs2NkU+LUI1Nj5FWFYvU1BbLlM4VjtHPUM3Rlk1LURVQDpHKTwKK00zJUFTNiJUVzY1TUo4IUxNOkZZQjpFISkvVF1LOlYgXy9WISU8RylGO0Y5SzwkNDspNDFbQUc9QDZGTUgKK005Rk1QN1NcSSs0NUI6RV0pLjRFOjxXKUg4JUEpMjRVQz5WTTozNklLNCZFOjhWKTo2NUE6OFYtOF9GKTAKK004KClLMSUhODhTTEAtQyhZOEchSzY1SUY4NTUrMjNcVi9UMEsmIU0/PDNdKTIlQTA+Rk1DOUYtODomLUEKK004JUBfKzVJUjpXIUo6NURfOCVNOjZFTUM+RkVBMzRROzlGSVI7RlElNDZdSDIzTSQ4Vi1TOjU0TTA0RSkKK00xJkVMOjNcVjM2LVAyMj0tL1MhOjpWSUs4VFU6OjYkVjE2TTgrNiFdPkdJUDJYKFYvICRLIDNcIF9HKUwKK002M1lHPzdJTDZERSUtQ11LOjM4OChGKU4uVUVAODYlNSkzWUgxNDFDO1Y9KzM2SVo4VFU6PkZERSs1OUEKK006NUBAKTZOI0JHPTgqMlU5PVcpQDI0RUgpNj1SPEchQDpXQUYuU005OVgpXTxWLTo4I0UkOlZETSNBQFYKK005RylDMzJVJTY0RUI7N0lJMjNdKThXNVo4RilKOkRRSThFSS82RiUpMzVJQzsvWUIyM11KPEY5Tz4nKTkKK00sQlRcLUMhUj82TUo5Ri1CNlNcWy9UXUMxIFguLUYtKS9UTTgzNjlLOlcpSzhWLVI6Ni04LEFATTNWLVIKK006Vi0vMjZNTjhVWUM5RllOOlVAVis0UUI6RiFJL1NZSDo1QFYvWCIiPldNSS1DRUkyMj0lOlZFKS9UXiMKK009ViU5OjVEXzM2LUc6VDRHMzZRWzhWOUo2VUVMPkdWIjwkMiIvJUQhMjAlQSAvWVg4JF1OPEc1Vj83KUAKK002JDBWPFdBKSoyTSkzMyFJOkY5Wz0jUSQvUlRfOVZZUzpVSVJAVkxZLjY5XS9UMT46Vk1BLCJFP0BIViAKK001MUBANjcpQzo1RTs6MiE4OjcpVzhWLUs6NEUvOjZNVT1HUVA3VTUrL0VJSC9TRSQyNUlDOUYoSSszODsKK00vRk1dPFVMXy9WKV0+RUksPEZZQzxHSUkxNDVQODNFKTM3S0tAJixZNkY5Pjs3VVo6RDxfNTIoOzZHOVIKK008Ry1bPkVMXjJVTUA6RURHI0IhKTIzXTs6NiU6OUZZVTxGTUI5RylTO0RESyYiNSs7Ji05MlVFXD5GLS8KK002VilKO0dJTy9SNF42JikvMTQ0Xzg2RSUtRDFaQVZdWj1FRF49VyBUL1ZFOzE1RFk9Nyk4NkZNQzo1ICMKK004KShbJiJVKD84IVM9R0lHOFVJUj5GLF8uNiAhNkAlSSAvWVc4NilSPUZZUj03KVo9VEQ7O1c9QC9GIUEKK00tQjU2OFVNWj9XJUMvUUxFMjZNUjlFTVJBRyBWLUVNUjpVTUo8RylIMSQxS0BYWiM4Mk0lN1YpQjo2LUsKK006Uz0lNlVNWjxGLUIyNDU6OlYpQjlHTVg6VVlJNiYhUzpXLUs4JF1MPFYpOTEiIC4tRy1WPEYoWS9GQV4KK01ARERQOFdJUzhWKVQuUjVIPVRVLzI2R15BJyxfMTYtPjZWVVo2VU0pMyM9JDhWWU49NzVdQkZdJTI2LUsKK004VUlOLyFMUiszUTk2VkFAOjctRj5IKUs3Jj1SPlZEWSYhKFw7JkE4NlYlW0BGLFY1JiUtOEdNWzgjKSkKK002NUUkLyQ0XzI1OEklMl1aPyVNRjwmLTg+R01BNjZNLzE2TTkzVFBZL0YhOjdVNS0xNEVDKlFARTNXVU0KK007OClOOCYhOTlFRFxAQlU2IDNcITZAI144RjlSPTc5Qzo2LTo3J0k0JEVFXTZUNTs8NUUpOlZBKDxHVV0KK01CNURLJTJFJTpWSUI9OC1PMSVJOjQnIUA2RyFSOiNcWTpIOiY8RDRXOjZFLzInKU88R0kpNlVNLDlHNU8KK002JDReNichPzM2KVpARzlHOFYtSzpGOVI8Ri0pNCYtJD5XIEIjQlVLPEZZSi9CVSw+SCktKzQxWj1VWToKK005UzhAMTYtJzY1QUtfRylWOjQ1LDlGTTo4MyksNiRMXzZGUUo7RzVWPTgpWjhVRTs4Vi04PkZcTSoxQEUKK00vU0UtMzchUjZGTVU9Nk1GOlghUiswWC4rNUk6MTZNSz03STovRUVBMlRVXT81SUk8RyFJLyM5OTo2QSQKK00mIFgyMzctJTI1RSU4JzlOPFZNSDZVRVJAVyBZLUMhODZVREUrM1BeOFVZISpSRUI6RilIPTY5Py40VVAKK002KChNL1AkUiAzICBfRiVLPyZZUjomUVA6Nk1XN0FAWT9XIF8yNyVJMyZJTTE2SVs8KSlaNSFMSyszRTgKK008N0ojOEQ1LzEzXTo6JEUtOFZFOS42IiNCRixWKVVFSzgkVUI3JlVcOiZFSDYjXVI6RE05L1MhTzlURTgKK00+R0ldPkRRKDpWXUI3JklTOFM4UClXTVUvIUBNOydJVTlEVFsuNj1aMSM5KThGTUM6Vl08NTQ1ODM1TUcKK00+T1lOOlchOjI0UVc7JiUrNiYtPiozRT46Vi1OPTcpXUBGXUEvRUk7OCcqIzYzTEUqMkRNL0RFSjpWLUMKK005RylLPFcpWjxSRC4lMUBWLlJVOzQlIUszNDVDOjYlOT83NSU6RllSOiM4UjYnSik1MUA1JlRVUzIzIFYKK00pNTlbPEYtQzwmTUs7N1YkNjM4XzY1SF8oIjRUMTVNMDtWOFQuNkFLN0ZZUTZSVFk8VyYiMSJUIS1AJF4KK00gLFFAO0gpVjtGUUY+SCFWQCYsOCZVQUktQyE6QCZdOjokVTo9VSYmQkdAXCsyVDspNi4iQiVJJzZWJSUKK004Jk0pLCQ1STgzXTs+R1lXN0JVKThGQUE2VFE/PEYpTzolRF86ViBQMjJUMiBUR0I2NkVLPUcpQzZVWUsKK006JFUwPEcgWS1TOVI7RkRNKTVBWkBXLUEzU0U6PkRQXjU0UTo7JylGNjYkWTg1SSg6V0lOPEZNLS9TRUEKK004VyFKO1ZJLCxCNFk7Vk1OPEZZXUJHKUAtRDUvMzcpVTdFRSkxMkxLL1RNQDZHKVEzVUlSQFdNUTwjUCMKK00oLEhPLVJVOCwiKSQyNFU6OFclUj83OTs6VklKOCJURS43Nio8I1BULERVVzozMDgmI1lSO0YhQjtWSVIKK006RlYmPSRNODo2JFYtIzBLKzREWTMnLTUtRFFCPDctTDg0MSs9WClOLyAkOyAzOCBfQz1SPkctQzM0XV0KK01BRzldPCNQSS41XTApMl1aQCYtQzZWKUg2J0laPUZBPi1BQDgvV0oiNkNdMD0lTVc+ViBNLCYlOy1ENUsKK007R0lYL1NdKTo1SS0yM0VCMSYtSTNVWUM2IyBWKzI0SSkyNF44VlFIM1c1WjpVJUI6JUFJOENZQTtWWUYKK006RERFL1ZOKkBGLUIzJVlaOkVBKTI1WUo7Ryk+MTIpPjgkUUo8T1lGOzc9OzI0MFYuNlFAOlZJLTUyIDsKK00zJilCPFZZXEFXKTYvU10pMTYpVTZWRUM2M1BcNjVZKS43KVc2M11LQEg5VTclOTgvUkxSNTU5LSoxKEkKK00tRUU5MTVJTj83TUs8RylDNkIgLiZUQVo9VkVBODRVUjslNEAoI11COlZBQzhGOVc8VylVQCVNOj5XPF4KK00vRUUlLUNYXzI2WVg4NEUwPkdJRjZUXUk8V1YiPlYkISYgJDUgLExNOkZZSzIyPFA9WEldPzdNSTdDOSUKK002IlRHOkZNQDwmPTAxJUVYOFU4WTY2WFQoI11LPENEVi42QUhASElNKjM5RjZDXEUzVU1SPiREVi1GJSkKK00uM0w9LUVBJTYmMUM8JUlAMzQwJC1PWEUuNi0sL0ZVVT5EVSU2VF1BMzNFQDxHSUo6RiRfLjRFVUBGOTkKK004V04jPERUTy5WJVQ+SC1bNiJUXzYkVVI7RUk5PEZJKDIyVFI4NilCM1RVUCkwWEIrMzFKPkc1XT5FSTsKK004NUBWODZNQDpWLSUyMzklODNcOzMmSUgtRFFSPic1OzQmTUYvIlUvPTRcTSYhQFc5RTUlMSUhVT1GTVIKK008RilALEIgSzNWXlE6VylSOzVNPDpUVSQvJEU6NjYpSDZVUUs5Vl1LPERVJTxIJTg2JlFQNkRFQTo2SV0KK008M1ktPEcpRjo0NTs8RkVaOkAkSyAxVCBWRDU7OkZNJCYiRUtARzVdPlY5SC1DWUkyNEVJMzQxVUImRF4KK00xVk1OLSFMXj9WOF8zNklIL1M4TS9EQVpBVyhfMlZFQjEyIE0xNi4kPCU0VjEzXTU3QlRWLCU5TjxEVUMKK007VDE2NlRdJTMmTUIzJylbMzU5SzNVQFIrMC1SX0YlLTM1QF4vVkFDOEZVSzxHPUI2J04qO0RERSZTIUIKK00/ODoqOlYlODE0MU4+RjxfNkdJOS4yVF81JU1CNiNFWjEyTDUlMU0kOzVROz5GKT49ViBWOEYhQzpWKSkKK001I1xbNjVEQChERUkyMzk7PEcpOjM2TVAyMzklQCREPSgiRSs7NF01MjRRQjxHSU48RVkxOCVZQDpHIUIKK005RylaOFYlQy41NUAyVUBeMSotNjZFRUMzJilSOlNETThHLS84R04jOiQ1RkBHKU48Q1ksOFVdJDgiVFAKK002Vi1XPUAkTSAzMCBfRjlDOFZNKygiVUs+RzlQPVZROCoyXU88JUlJLUIpQkJHSU47VU04KTJNSEE3PUEKK004JyFKOVU0Sy1DXUo8RVElMzZdSjZTKDsmI0VcQSc8XywjPS84MzhJKzQxOjlDRUM5VilKOlYsVi1FUUIKK00yNk1SOlVJQjM1QF8yN0laQFchLTg1TSUvViE4LjYpRj5HSUgyNyoqPTVJJCkxTFk5JzYmPkVJQTg0NUIKK01BT1laMzQxSjo1NFYyVTEtOCZEWzxHQUYuUiBZMjVNJClWKUI0Ny1PLUYpUDo2KTo6NkUvMlYtTC1CITgKK006RkUpM1YpVDM0NT47RFxfNkgpNiUxNE04JThQMjYlOzglUUY7J00tLjUhRjlGUVI6RVE6OkZNSTgjOS0KK009Ni0tL1NFJS9ERUAvVFVOOiREWy5UQFA0J1YjPFQ1Oj03KVY+ViRfNlYgXzMiVEUxNi4iOkZIIS1QJF8KK00gL1lLOlclQC1CNE0zVk1bOFRBSjYxQDUzKClTNjI0OzVHNVY8SClfNTEoRTpXNVM2VFVMPEZNQjgzWU8KK007VVkvNjU1Oz4mJFImITRbOEdCKjozXS87JkUlLSNRNjgmLUk2RilHOkcpSzNVQTw4RU1LNkVBODZUVTgKK00tRUFOPThBQi0mLVA2JEUvL0I0UDEnSiA6VEU6QEc1NTIzWTg2JSVGO1Y9JTM3PTYqV1dePycpTzZENUEKK004NFU6MyctUjI0UUs8Vi0kNkYtLTYlXTo4RlFKOkI9OjtHSSkuNk1TOFVZUz0kNDszKClSMyQ1OjpERSsKK008JllANjVJXTghKC4mI1xbKCI1LDomLUA4JVlaOlRcWzE2LVI+RzVDN1VJQzZUTF8uNzVbOlVJKzZFRSsKK00zNF0sOjYtSTlCVEAoJDVKPUdNUzhVSSg+R1VXMzYtUjxWRSkyNUU+QEZZWyA1SCE4ICNeOjYtVzwjWEUKK00tRUEtPEclLDhEND0mIzlSOkRESS1FSTw2VSVVQzZYOCYjRUI6NilDOlZJQzM2RFY3JkktOFY4WS1FWUkKK00sQTRFNiUhWj83KUM7J0lKPEJUXjo2XUI+Ri0tOFZNSzhVWUI6RylJOFNEXzZWQUI4QzhZMTY6IzgjIUIKK008Rk1MOiREUiIxTUpCNykpLjc1Si9TIUE4RUVAPlcpQzNUXUoyMU08X0c1VD5WKUE6JixfNjRBTj1VQEcKK00zNjlANiYtOywjIUM6RylaPVU4UjE2KVcyMlUtOlZZQzsmTFwjQzlVOkNFJTYlXFAuNylDNjZRSjxWLFQKK00lMjUpMjU0VDI2KUExJUFMOzZZWjhERS06SDoiOyVNOzhUVFArMilCQEcpRjYlSUM6NU1BNjYhQTsmKE0KK00oIiEpMzVNRj5XMTgzJzoiQCYtUkInSUI2JkVJNDgpLzhAJTogNkggX0VJOz5XSU8zViVBMTYtVzdGQFYKK00oIiBfPDZNNi0kRUkzUzhHNjdVWDEyIDstRF06PEcpPjZEXU82JTlINiVZUzY1WTo7U1w4LUZBOjtVITwKK009VllXOlc0Xi1EVU8zJllCMTQxQjxGSUI3VSFaPkYgXi9XPU86Vk04KzFMXz4nIFk4RzVEPEcpLCxARDgKK002OClXNlNFQzhDWFY2RyE6MzdJUjM0NUs+RyEpMS5JPD03QSwzNSFQN1VJOzpXNTotRDVANiVJSjhTOFYKK00zVk1VPzc9KS1DXTs8RUUpMjVJSjlGSS0mUyEpPFZAWTYmLUM1M11DMTMhOjxILVM8M1BWNiNNKzg2KUIKK002IjRCMyZNWkBHKUkuNEFdPzZdLzYmTTosQlRWOFdVWjokMFk4RyVMOFY5TDpHKUIrMlRUISNeMjtHSTsKK004WClWPUYtTkE3PF8vVFVOPDRETyA0NCE6QCNeLCNZUjs2VUo+RkxZNkc9QzMzXEkqM1lDNkUwTS42OUEKK00xIkRZOkY5VC0iIEUrMzlLPlVNJDpXKVIzJilQODZNUTwmKVI5UlRfPVcpQy1DMUs8VlFSPEYhODZWRSkKK006VjktMTRRSzpGKUgxNjlaMyJUTTtWKUI3RiBAJiI1LThVQU46RF1GQEVMViYiIUA+Rz0kL1VJLywkVUkKK007JkE6OiRQRyc1SiI8Vk0pX0VFUjtFQFYtRi1KOFZBUkBHIF83RUkkMzZNTy9CVS89VylOPlVATS1FTVIKK000JUVDOFYpQzg0MDgrNU1aPVVFOjZWLVE4VixfKCI9MD84LVw4VTk6LjNdUzpVSTksIFg7NydJXUAmLF8KK00uNEFCPkVJOTgmJSkrM0UxOkcpTClRTSQ+SCVKOlZRSj02QF8xJTk4LCJURTE2KTs5V01TOUVZUj83KSkKK002JU08PTgpVzYgJFkgNiAgX0I0TTE0NTA7OCFPLjRVUjslTTkvUlRWMSNcXyszWUs9VUBfMjchQjpVWFIKK00oIkxWOkgpSTI2TVo9NUVAPFZRQzpWRS00JkEvNjcuIDpUME0zNylLOkcpTzxHSVs4RklKN1VAWTZGJUIKK007VEEoPTM4LiZTRUo2JU07MSZZRikyNUJCRyhfOkg1WjwjOE02N0lbOCQ1OzgjOFYxJilXPEVYTSUxQFkKK006VUlDNl5RUjtGTUI1M10tOlZJQjxHSVoyNi1DMSRdQjMyNEUyNy1SOldNUC5SISk6NDE4OFYxSzhGJUkKK00vIkUtPFdNUDpWJUI6Vy1TNjNQSSs2TiI+VkExOERMWThWJSUzUzwuI0M5UEJIOUo2VVhQNTdJSzomLVAKK004M0xQMjQxMDZBTC4nNiojPkZJPDpHNTwyNiVJOjQwIy9ZJFkuNyFSPkVNKDxXVUY0JylbOEVRSztQJS0KK00gNUAgX0Q0Vi8jMSk4RjlSNiZRTjpWJUA4NE1BMjRFNCghVSU+JikpLCcpXzpWRTUqUlUpOFdJWj4nTVsKK008JEUtPFZNSTQ0VTksIyE4O1c5WzxGQTUtVF1BMSYpRD5INiM8RjlROkYtLzYiXSU7VilCOlUwUCgiIUIKK003VVhWLjdNQiZRNFc9Nl0nOiZBVT80RE0zNVFWQDNFOzpWLTUrMz1SQFYsXzEkMTk2ViFDOk9ZVTpGKTsKK004Rk0xOUZJOjdHKV08Ry1DMzZRQScxQDgtRyU8NCdJVjQkRU89VUEtODZJPDY3KVM4UlUkOUZZSj5YIVIKK004VjlbPEVBJDE1QU4+VU0vOiYpOjhVSTgzUzBAKVJcWT1IRVA8JkRfMyZNOzpWTVtANkRfMjRFKy9BQC4KK00mU11OPEcpLzhXOUAyNiFLOEYlQThWRFInNDVGPVRVLTxHKSQwNzYqQCVOIi9VSCE4QCVQIC9ZOS1ENF8KK002Rl0sNjYpWjtFIUo8NU1CPkYpQzkjMD0tRz1PMzM5T0AmWUM6NEUkL1UhQzxHNiI8RUEpMzZNWzpVQF8KK001MyBFNiZZVjxGSUs2RUFBMTI9ODQmWiBBR1VOQCdNTjpWQFstRVk5Okc9Qzg0MDI6VVkpJlJVQy1ARC4KK00nNklaOFchJDY4QSsvJU06PCgpOTMmWiI9VUBSMydFUjwmRSkvQ0VBPCY7XjwkPUI8NU08OFZdOzEjXT4KK009ODlaOlNdRjYgWDUqU11KNkQxSzpVUSg+SClSOCZdUC4zKUs8RkkkLCVBQjZHOiM+Vi06PkdJSzg1QTgKK003RihZMSYtSjpGJTY6VkReKjQxOC1EUUs4Vk1POjZJQTg2UTE8SClaOiRVQjo1QFQtIykpOiVJOjZVJU4KK008JiU6NiQxLTZWTiE5QyhJOFcoWTE3SUgtRiYjQCkpV0BDIFAgM1whOlAjXi9TOTU4JkVSOUNdJD1WTSQKK003JkRNLCc9XDZVQFYqVE4jPVVAWTxXST42RUlIPDRFJTo3KU4/Ny0lNjNFKD83LVA4M1hAJlRFWkBXKTsKK003VDU7PiYgWTYmKTs9N0FdOUc5XT83NVI5U1kpLSYtUjhGJSQlNl1AMlFMXzokMEcnMU1CQkdVWzg1QiIKK00vUzlBPCdKIzIyPFI+SElOODQ1PDxHNVc2Q0xFMScpOl9GLE8zKCFTOFYpSzZEMFIsJjlcO0ZJQjhVREsKK00qNEVQOlZFOTgkRUs2VzlVPkZNWj5URFk4VU0pLUJVKTYkVVM/N1VSOkZJQjcmRT4/JlE5LjQ1LTY3KTYKK00uNikwMjJVOTpWOS0zJDVDOFVYVjomTTYxNTkpK1Q1SzpGTTs2NTUpM1ZNUC4zXF8yJk1MNlVEXysyKFAKK008R01BLUNFKSozIVIyMilCQiZZVEBYKUMuUCRFIDYgIF9DXFw3Vi1TPFZFKTgnUVM6RilAKTFBLEImJSUKK00oIUxZPkg9QCwmSVI4NUklNlglLy42TVI8WD4jOEVcVzI3IUY8JiRJI0BYTThHSVo4ViElOFgpSzNWLVIKK005RS08QEVRQjlHSVU/J0k5MEJVOzxFSUg4IzlXNlRQXjgoIiA6UjQpLUdJXT1HKUJAVURQLjZJWjpTODsKK00pNVlaOkYoVjI3TVo8RFUrMTYhSjE/WTguM0VaPzcpQjMzRSk1MlUtPTZJQzZVRS0rMlUlNlYtTzhURE0KK004Vk1WPkdJSjtHTTo2NylDLUJEUCxEMF84VyldQEc5UzpVQUA0NylSNiM5JDU0NVI6JDUtL0NETTM3KVMKK004VDUkNlRUUC1FUVA7JUhfLjM5JTxGXU42VU05MjVBMD0zWEUtQzlDOlVJODlCRC4kQ0VSPUclKS8iIE0KK006MzgyLjZJWj84OiI8RUAhLEAlQCAvWTgxNkU7OlglLy42KiM9R01JNiM4XDZYLVAtQUA4LUdOLTsjXUEKK006JUksN1YtSzYjXUs6RjoqQ1cpSS9WIUEyJyVBKjE0OCs0VUo6Vk1ILjRVWzwlQS06RjlAMzc1SzhFUUYKK002WCoiPCVJKTtWXSwzNkE+OEVMXjg2UU4/JzxcKCJVOj5HSUY4Rz1RMzUxTDxWQE0mIiEpNjYtKSZSVUkKK009Rk0tNiYtUjpEV147M0Q9NCZVUjwkREArNUBNLUZJTjxVTUA4I0U+ODVJLTcmQT4rNUFSO0ZWIjkmOVoKK004I0VGPENYTSxCVE0uU0UxPlg5UjxHSUI4VkVCOFRESTY3JS85VylMOlREXy9TRUI8Rk0tNUYgWSgjWSQKK004VVlCMTI0XzE2OVU+Rik7NjM5KTZWTUEtVE1BPFc9SzcmRFsmITRFNlguMTslODgrNiU5KlNZQ0JIVioKK01AR01MIDRUIThAI146NU1MMzY6IzJTOUpAVlldPFVBKTZHPVs8JERLKjNdWj82TTs4NFVAMTYpSjpERFQKK004VkEvPkhVVjojRSwxIyFJOFQwQCgjXUk8VFUoPFY5JThXPSksJFE7PEdJVj02WUs2RFVSPEZdQjknKUcKK00uNUE6OERVKShDXU88RjlXM1M5KzM2ViM8RjlNPVRUWTo3KUgvIkQ4LENdLS9RTEU2Ni07ODRVSzxGSS0KK01fRjk4LSU5MTlXLUk1NE0tKzI1QjtHSUw4RUhZOlYtPzI0MUA4MjRZOEcpVUBFWTA7RixNMTYpKTJTOFQKK00oIkQ7KVYpXTxGKVU8Vk1SOlQ0Vik2QiI0JFVCQFcpQTg2LTw2RylSNkYtUjdDXT82Jk1DNlNcQCszXTsKK01BSDlSMyYtKTE2XVI4U10vOlYpSztGTUs4M1A4JlQ1WkRIKUEpMlVIPCVFKThILiVBSCldQDAlQSA1TCAKK01fRU07PCctWj1URTk+SClOPyc5QDdFRUo8RlkwNiNRJThWTS02RUhZNiYlQjlHISsnNFVILjY6MUBGIE0KK00rNTUpODZNRi1CIFY4VzxWKTVJTzZVTVA2IyBeNUZJWj5HKUY6RiktOEYpQDZGKUoyMU0pODRRUjxEMEUKK004R01SPERUVi9SVE86Ryk8OCcpTDgmQTo4VjlGMSJVKTg1XFwrNEUpMTVBKDpWOT44X1VCNkVFSzgmLUYKK008VylUOiM4QDNWUVs9Nk0tLjZJRDNTOE0uNiRfLSMhOT84KU46VyFDMlRFOzM2JSsxIlRJKCIhLTgmTUgKK006RlFTPkZMTSUyNUM+RkkpMTctUjhWLUo6RUVIOUZNSzxGSUA4RUlLPFZRKS5SVD0uODoiQEVNOy4yVUcKK007JURfM1VMWS40VUI6Vk0+JiEoTTcmWVo7I10pOkZZSTgkVUY+QC1dIDcoITgwIk8zVFFPPkddQCszTT4KK01AR1VOOlYpOzdFSUo7JU1ANkRdODZERSw4I1heNlcpTDlFNDUrNVBZNkguKjwiNDsyVyAjPV9ZQy8jPUMKK00+RURUL0RVOzo2XUEyMzk2NkZNSzEiVFk2SCoqQEZBODIzXE0tRyFQLjZCKjohNF46RVFPNiNZNSgiISQKK002I0U4PEdJWzxGKUw6NklJLUNFLTNTXFsuMyBWL0QxTDpVUVc9Rkk7NCRBSDhGLUw/NlkrKCJVQD5HSUoKK00zNF1SPEZAXCgiRTg2VURSLjcqIj5HKVA5RiEtN1VJSzo0RE0sQ0RfOjYrKzhHKUk2RylVOiJURTE2LUYKK00+ViUpMzYtLTYnIU02VUkkOkdNUDNUVUI6VU1CPEYhNTYzME0/NjlKPEcgWyZTWUo6VUFCNlMoUi1DRUIKK006NDRAJiI1KTYnKUoxNFVDOEVNOC9VJVMgV1QhPkAlSiApITsxJiVUOyNYRSozIVVARiFDOjQ1RiEmTjoKK008NylLNyNEXzYmWF4rM106OlRBNS0jMF8tRDVGPCc8RSZUTCM8T1lJODU4WThYLiE8JVxeMzc1WjpFTEkKK00yNUk4OUJEQDY2SV1BOSlaMjM4QCYiNVI9VUE7Qkc8SS9WJSw6VlU4ODNQXDYlQFYsJVFaQkdJWjxGLUsKK006Ri1DNlVEVi9ERFstQlReOEZNOUAoOiM9JUBeNiVJOjxIKU44VDA7MjgiIjskNTs7RllIMTJESTI1WVIKK00yU11QPUcpTjsmTToyJFEkOEZNQC9TOSk2Rk4kOFUhQjsgLUJSJi00L0ZBQjdHSVc2I1xbKzRVVzlHLUsKK00zVj1WQCYhLzlHKUs2RylSMzYhQTdYKTgsRUlCMjIgTTpYKVA5RjxeKzM4PTI1NEUuNDBfNjRdUDhDOFAKK002RURNLUVBQDM1WVU/MCYjIDc0IEwnTUMyNiUrJlFASS9XQU02RjlNKzRFUzxWUUk6VllMNkM4VjI3ITgKK00vUzklNkQ1ODlGRSQtRDVCOFU4QCZTXVM3QC07X0YgVi1GOiQ+Vz1BNlc1WzhVSE0zNik2MjEoODM3KUYKK009OSoqOVJELiNBNTBARylCPTghQThVTE8zVklLOFNFODsmIFwmUyFTQFZZVj5GSUs6Vi1KOlYtOC9VQTgKK001M101OiRUTzxINiY+RiU5MTNFJDsnSVU4REQyKzY6IjpDXUI8RllALlMoVC9UQTwzMyFDOUZJOjQmXSUKK00tREUrODRdOjYjXTs4JiFBNUxVOTpFTSkzNUFCOFZBOjg1SU09VERAJTNFTy42KVI5RkVGPEYtSTsmTUsKK006RylTMzNdJTwoSUstUzhJKCE0QDM3KiI8RklGM1UwWzEkTFcvVE1BOFVFQjgzXEcxIlQuKCQ1OCszITsKK006UCVdIDgoIFNZKVs4NiBfJiE0NSs3JTozJjlXMjNZST5HKU88RVFDMzNMTS1GLUk7RiVDNkNcWTZGSTkKK00vVlYgQVJEOCkzXTEuMjxWOFchKSgjIVI4RjlPOFZZWj5XPF44Rl02KjE0QDEnKTk2R0ldPVMwIyNPWFYKK008RyVSPkZNQjxWLF4uNUogOiJVLD1WKSQmITUlPFcpOTZVRUs6VSUkOlUhKS9DWTU4VUkwO0VMTTpIQVwKK003RU1KNiFMQjdWIUo4RUBLKCQxWTtFTT4+Rk1JMjMoWy5UMTo2RUE+NkZJOiwlQFYqMzklO1VdJDJURS0KK00zNEUsMzRdUTJSVFY4NFVLOFYtUC9VJVArMFguKzYgVi40UUI6NkUtMTZNSDE2Vk47NklaOlNFOj1WLS0KK00vUkRJL0YtOjUiVFk8RlFSPTgtWDNURTgyM0U7OjVBQTg0RSk3QkwuJlJVODAyNE0sICVLIDhIIF9IViIKK008Rj05KlFALiglTVA6JUFLODNdLTw3SVpAR007NkQwUi1FQUo7VyFSPCYlJDhXKTgzVyoqRCM4VDI3JUEKK00tQUA7OCZRJCgjKUk4I106MzQxMTtILFk4RylDLEIgWTM3SUY4NkVOPFY4UCNAWE06VlVVQEcpOTpGSTgKK00tRiVdOlQxJEAmXSknMTRFMydJSzZEVUI6VFRZO1RQUClTKSk6VkEoOkZMVjM/WiM9NFUpNlZMVi1FXUIKK002VEFDOzM4Vjo2OUs7R0lCNyZZKy9DOSU4VjlTO1UiID5GLU45QkRWMTcpODI1TVE6JEReMjNYRzdUME0KK00rNEUlOEZRQzZFQVA8NDBAJzMxPjglTTs4RUlJLUJVNjgjOSU0JlYgO1NFLTxGUTs2M1xNLUQwXy9SVF4KK004RVlOPTkiIjtHIUk2I0UvNiRFOzgjRSk9VUBLKlRNSTozUiImIFghL1AmIiAvWV09NyVIOUNcSyYiRSkKK005Rl05LjQ1OC9FSUY8RzoqPCYhPi9TOSk4RklSPFdJVzYmSUs2RkFDPTgtLzY1XVs9JDBJKzVNSC9SIFIKK002Rz07NlVYViwkQUY2JUlKOyRcVjEkRVM8Vik6OydJSjlCTDIrNilaOzdFWjpWSU8vUilAPkVRPiwnKUoKK001QykhLyI9QjpWIS04Jl06MTZJOisyIFYzVz1bOiYhOilTI148RyEkMjVBQzZFSVI8RkxXNldMVilVNFkKK000JSFKOlVNSzhEVFYxNUk8PEghOjlHVUc7RkBfLUQ1WjZDOFc7SCFQMjVFJCxFQSQtVUUpMSVFWj1UNSUKK004Ryk6MSNMXzYlTTo4Vy06MyNdJDYmOE0tJEVCOUZJOzhWWUs4NiFBMlYlKTI1MEAnNUEvOkciJkEmTVYKK01BJlEpNjVAXzE0VF8yN0lILUJVJTxIITVAQFguIDNcIT0wI14+VllMOiclRjEiREs2Ji1DPCI0PTEkRSkKK004RkEwO0ZRSjg0RF82NUlCPiZZWkFXIUw7JF1IOyc9XjZWJFk2Vz1JMlYlUD1VREktRDVSPEYtSTdFNSkKK004JyFPNkRVLTZGSTo6RkklLURdWj5GSTUpMyhZOkddQjhHSUY7VDBJL1ZJQjVDXUs+RiRNMSU4XjZGRUMKK00zNUFaOCRVQzMyVEkvVEFRQEc9RjgzOTVfRylOL1QxQDZVQTA4RjlSOiYuIzdCVSkyVUxfLjclUjpVSTkKK002JFUtLjRWIjtFSUY7RVlDNiQwRztGIFYsRUFXOlYpQjZWIUgzI1lJODNYVDhGSTozVFFKMzQ1KS9UVSUKK00zNiFTPERRNi9ERTs1Q106O1VFOjhHKUs0JklRNlYpWjhGLUQtIVRZKVRFPj5ILS00WEoiOEYtQDIzTF8KK00yNkYjOyRERSwmTVsvKCguI0AlNiA3NCBfR0lLNiQ1Qj4lSFsvVUFDODZNPjU0TUA4JEFPNiNdLTwmJFwKK00qNkVGN0VJRkBXVU44Vz1KOEVFS0BGLUYsQzk2OjZGITxHKUkyNUErOEghTDhWKUk4VyVLO0ctKSlVOVoKK006RTk7MSI0VjxHVTo1IlRWNiZKIDhFTU4zVU1CN0RFSzxFRS88R0lLN0I8UC1EXUg4VEUpPkcpUjpDODsKK00mUzhWOEhJWjdGRUE4X1lfPVRdQDZGJTgzNUk+OkcpREE3NTo2VkVPMSIpJDw3LToxNUUtODM5JD5IKUIKK000JFVANlRVTjdFSS0tQlU7P1YpOzY0NSU2RURQMlZRPi1DRSQ4NkEtMzVBKzYkRTgtQyEpOkdJUjpETF8KK002JUFAOjcpQTM1SVI6VDE8OjJUUD1XUTs2IzhLNTIgQDVHSVoxNFVdPkcpUjs2RE01NDVLQFZNKSZTWVgKK00+REYiJiFAITEgJUogL1lbOyQwOywnLVA2NExQNlc9Szo3JUAzNjkpMzZAXy1GJSQpMlU5NjVAXzZXKUsKK006JiVKPkcgUC43LVc8JExNLjVBOzlXKUMzVU1JL1YpWjxFSF4zJVlSMzUiIjlSNTU9VyElNjVAXDI3IVsKK007VVhSKTNFQkBHIUo5RikwN0ZNKTZHNUM4R0lOOFc8Vi8jOSk8Rk0tNUcpWj83ST4qUiBNLlVJVkBGOUsKK007RVteOERAUDhUVUM4JU0vNkYpSjxGWVo7RilTPFZRKTE2OVs2REUkMTZJLzo2SVo7RixZMjZBJTdHTVoKK008M1w7LUdJQzglQFspMyFIMjMhUj5GRSsrM1k4NiNZJDUzOFA8Q1hSLUYlQjsoITgxI10pOFctUzo0TUAKK00+Jy1KOEVETSk0Uig4NDRAKjQwSSYjRVI8RjlSPkZNLTdHLVAmUlRQOFgpSzEhQSlAWElRQEVBJSA0RCEKK003UCNePEcgUiRBVTk6Ri1BMSNFQjhHPU81REU6NiNFKTgmJT4sQUBNOCVAXi9VQUAtRDVHNkcpUC8iNScKK01AVylQMlM5ODwmLUE4NEUwOUNdOjhFOFkqMkUvNlRVOz5HPFYpViFDLCRNPzY1SVM9Nkk6MTJURStWOV0KK008RlVLM1YpQjglSUs8Jz1TNyZNVTElWSQxNk1SMSQxRj03NiY4U1xfLlVFSzxHVVI7R1VJX0QwVi1EXTUKK00xNFU6OFYpQjomIUs8RkkoPEZZSjgkVTo7RklQNUNFKTZXKVI+RylBLjRFTzYzXTo+SClNKCRBUzlENUIKK008JDRZNiVAWz5YSVo6VVk1MSRMTSkyVDImVilALUFNJDIzXVc4VUUpL1VNS0A1QF44SC1WPlZFOC1DUUEKK009VkRcKCJFNCxCNE0zVklGQDgtUC4zWVI+Qkw4JlVNXzZUMEkpViooQFgqIkAgJS8gNEAgREZJSysyPEUKK00tQyElOCREOyZRVVU9Ni1BOFAtOV9GQVc6IkRALSYtTzgkMTgvIUBFMlVFUDpVQEUtRy1TPlcgXzVHKVwKK006NFU6MzQ0Xzo2IF4pMTRJMjVAXjEmSVo8RDEpLjM5ODolSUM8RylXO0VEXysyVUM7RllCOFVNSDZGLVAKK006RklVOlRdOjojWUk+JUlPPkNYTThGSTE9NFBWNiM4XzgmWVo/NllYPEQ1Kzo2WUEsJDUvMjVdTT5GTUoKK008RklBOlcpSjhOTUA2Il0kPTg9OCs0XVVAR1VaNkNZLTxGKF8tRk1aOlI0RTZGXTs2Vk04LjRFJTY3Vi0KK00+RilXPCYpSTEiRDIoI1E5O1UwOy1GRTs6VlFDNiNFLTlILSstRkojO0dVUzY0RTg8Jy1LMjMoVDg1NFcKK00vJFU5NkdKJDxTOEA0JzUkJiBYWTpFQFYxIkRHNCcqMkRAJUwgNSQgQkUhUzYlWT41MkRNNiNMIyNPWUoKK008RllaQDYkXy42KTA4I0xJKzQxSj1WLUAxIlRcNTZBVzxFWEUtVk1SPzcpQThVTUY+Vik7L1JUUDwnNTUKK00mIFg7MSRETSZTWU5AR100JzNRLThFWVI6VjlaPkcpTDJTOUI7RyksMSM5STgkMUg7SClaNCVFKSsyPUkKK01CJllVQEREMjZHKT4zIjxFMjNMUjE0VUY+VlVOPENETThHPTgqMlRWJlNZSz83S1MxNy1LOEVRTjxGQUMKK001QkRNMVdJUis0UU0/N0lSMzQ1Oz5GLSsvVi1VODQkVC9EVTs6Nl1BMjNERzNXNio9RVFWPEYtUzo1NEsKK00sRTlCO1YlJDYnSVI6NU0tKzFNUz5HPSk2NyldO0dRVjglWTk6RllLNkVAXDxHPT4xNi1CNjZZWzwkREkKK00uNkEpKVBYVjo2JE0xI1A1JlQxXURAJVsgNFwgX0RVTDwlTUE6NVEpODNcQCcxNUM4Ri1aQEchODI2VS0KK00vUlRcMSJVKDpXLVI2M104NiVZUz5WLFY1NVlaQEZNOzw1TSQ8SEFaODNcTTxIJTgkQFg1L0YkSygiNUIKK01BN1VIKzM5LDY2LUw9VlFPPDc1WjhFQUg5Ri1AL1IhJTojRSU2SCoiMSNYXCYgRSQ+R0ldQFM4RTZXSVIKK002IjRAMSVBNi9DTTo9NVE5P19ZKyo0NVArNUUkKCBYVjxXOVIvVkFQOEVJSztGLTk2RVk+MzZJQis2PVcKK00+RzVCMSRVSDpEVSQ4Nl1SNkU5UDdTWS09N0lKNlM4Ui9WSV0/Nk1NPEYpWzxGOFwtREU5OjNcVjZGKVIKK00+RyEpKlIhWj9WIFAvVVlVPTZZSzhFTT42RklMNlYhOi42QU4yNilaOlY5Wj5GQSkvVUUpKjBYRTZGRFYKK00tQ1g1JiI2IjY3VCFAQCU7IC9ZQz5HPUEzVi1POFZFJSszKDgvU1kwPEghUzpWRVI6VDBFL1Y4Xy42IVIKK009RyE5NkRVLThXKUk4NyRfNydKIDQ3KU4vVEFaQSchLTE3NiI4MVQuJiJVKTJTOFYzNlUzOVZFKTglUUsKK003Jk1TPEcpTjtFSTA6RUkpODVYRS1GQUAxNUFbQEZAViZSIEssJilLPkgoVi1GTiI+RixbJTM5OTwlSSkKK004NylDMScrPjhTOF46IylbPCIoLis2TVI7RiFIOlVNQzpWVUkyI1lDPkcpQC9CNUI9N1VSMzMpJTwmTF4KK00tRilaPlYhKT5XPUE2VzVbOFVIWTlERSw7SClVOkYpKDpWWTs2NUU7OCVAViszRFAzJk1SOFVZNT0mUF4KK00pMlUpOkcpSjhWQSU5QDFLR0clUiZUNUgsI0VaPTVRTj83KUIyNF0pKTBYODI2JE0oQUw7LjQ1ODtAJiMKK00gNywgX0cpWkBHQUg4Vy1TPyZBODEiREAvRFUtOzdJUj5HSVI2Iz0pPFYkVjYnKVY+RyFAMjU1JTMkVS0KK008RUBZNyghVzxHPSkpNSFcPCNEXz04LVgxIzEkLUNdQC9TWUg4Uj0oO1RFSzxGLTw4VVlOPEZNOjI1RUMKK006NE1CO1QoSS9FOFYxJ0okPEQwOzYlREcuNFVGQEU0UDhYKV06REQyJlNZWztWJUM8Rl0tNl9ZOy9ERUgKK005R01VLyFATTsnSVU6RlFLOFZBUjlGKSkpVFFdPlcgVis2KVZAR002LlQxQjtUMFYzJylSOiVBQjlGXUMKK007R0lbPVIpODYiVTk9NzIhOlVJSzhDKTo4VklLNiRFPDYkTTg4JFE5PCdBQTJRTDgqM11DOiYpRjsyVSkKK008Vy1MOjZNQC1DKUYrMVU5OkVJQj1HLUk2JUU0KjFASzg3KUExIiA7L1ZGIjxGTCE9QCVXIC9ZUj1HSVsKK008RjlSPUgtUjxHMFsmIzkpMzVNSzxHSiM8RiErNiYtOS1DTUI8R1VbODVFOS1CVE0sJik7L1NFQj1VRUkKK001IiEkPEctLC9WSiI+RiU5PiY5OTokRSU6JikpNiYhJThWTUI2RU07O0dJUjpERF4zJkVAOjdNSC5SPF4KK00rMlVQQkgpKShEVTkpMlUpODcpQi9GLV0+RllIKjE0VDhGOUs7RzVVOiVPXjglOTg6Ny1SO0ZETSk1QVoKK00/NVEtOlY6ID82SToyMzktOlcpUjI1MUI6V1YiO1ZBSzhWTS0yNDFLOEVJKTgjXTozNDExO0gsWzI2JFYKK00yVl1KPEYpODsmKFAxNilGPEYtLTg0VTo6NURHKVVFWzgjXDglMTRWODYhLTlHPSkvRkVaPEcpTzZDOFsKK008JURfNichSDo3IUs6VU1JODNQUi9WQVc6Vi07JlJVQ0BHKVMgNlAhOFAjXjY3KUo8Vyk7Olc9WzlGVigKK002MiBbLURVLDM2TU49RllMODVNOzNTXFcxNkoqPkRdLThFNFIrNTVRM1M8SS42XUA4NEw7KVZNWzwkRU8KK01ARlE2LSYtUTpXKUg2JUkoOCYxLDgnKTw6Rk1DN0Y5WjxWSSQoI0VBLjYpWjxGLSktQiA4MyheKjwlRSsKK004NERfMzYtSDZDXS08RklSPCRERy5WOSc2Nl1aPUc1TF9GLUE5RkVLO0Y5SjIyNSk6Vzk6LUQxMD04KVIKK002VFU5OCYtRzxFTUk4RiFCPyZFTUInSVI2Ri1TOjYlKS1HPTs2VVhWLCRBRjo2QUk7JklSOyZNLTMmKVAKK002NDRZMScpVzhGLSUuNUBeJiBYPTEmPTkqUUAuKCVBTzolQUs4M10tOkc5VjxGLE0qNk1DM1UlVT1HTVwKK009VylLPVYhJTYmITk4RkE8OzJUOzI4KUo+QCVPIDRAIEY0TUIzNFFSOERBRzxHIVs+Rk01LyFMQCgjXUEKK00yI0UlPEYsIzYvWF8sQVRZOlghOCwjXU44Mz1DPkRdJC9URUM+V1U5KCFNOj5HPS08SEVTOCM4WThWTUIKK007Vik6MTU5QC41SiI6Ry1MOUZNJDhWUUEvQUxfNiI1LDkmVVI6NERAI0JVWT03OVEuNDVTPCYpQjlUNUcKK00zVUVCOzcpOTI2IVI3Q1EpNiNFJz5HKUs8RlFDPEZJRjg0MSU2Rk1DL0MgXjhHJVU4RUU7M1U5LThGU0QKK004Ri06PCdNSzZWWVA9M0UsQEYlOC41QVI8Ri1JN0U1LTZVSSU7R0lWO0cpQi9SVSlAJyk4LlFMWT83KUwKK002REU5KzIgRyUxTUg5Q1xLJiJFKThGTUAyNDU4L0VJRjxHKVAqUU02NiI0Oy41XVI/KCFLO0csXywmLVIKK002VExeLCVAXisyVF46QCVXIDVAIFI2XUoyNDVLPCRVLzpWTU46NiFCOUNQUCZTXVczMlRQOCRMVjE2TUkKK00vUjRFMTZdSTJTIUY+JkVMPUZFODE1TUc+Rl0lLlQxSTxGTS08SElbOEVAXy9VQE8zNUktODYtSTZEUCQKK008T1k8OlRVQzpWITUsQzk+KzYhOzhGSUwyMUAuKEVJLTZVND0vV0lcOUVJQDYmIFkrNUlaPEVNQT1XSUMKK002VVkkKEJFJzhVSUo4VFU4NUU5QzgkVTo4Rk07LjQxSDxHKUo8Jik5MSNZOTpWLTozJllVPEZNJTZHNU4KK004JzUlLUQ1OzhIIUw4VilBOFZFKy9VSV0+Ri1JNkNMRTI3PVU7VlhWKzZdSzslTTA7NDJTKVQwUCZWQVEKK005RDBJKlRFQThWISkvRDUpMjYpQzhGLSQuVUFDJiBEOCs0VU4/V0lOOFRFKzlWST48JUBcMSRNNS8iNSUKK00gNyghOEAjITxWTSw4Nz1MODYlWDw0NSUzNF1DMlVNNTM3SUEtREU5KzIgVkBYJU01MzBWNiVFOTYnKVgKK009VllLPCVIXzZVTU05UlRNNUchUjMyPVg+Rz06MyZBQTMzOCMrP1lBOkchWzo0VUI7R01SOyVJSj5GTUAKK00vU105MjYhQzpWTUoyMUApLEVYTSsyICkvVylNNkRVOjYlQE0mVDVSOURVQzxIKTwyJkBeKCJUWTI0NS8KK00zIlUlOEZZRjYjOE0tRilDMjM4XzMmLVo9Nz1DKzFMVjomKEUzNz06OCc8WTEmIiNCNlhWKzYlQzhHSVIKK002Q1ksNlZJLS9WLiRARk0vMTM4VjZGOUs9VypcLjM5UDxGXUk2N0lVMlVZPi5UNUI+JUhbL1VBQDhWLT4KK002JE1AOCRBSTZUVTkxNUVQLlFUPSgjKSw8SEFcM1RFVz5HKVI+RkU1L1NZSTojWTggNUAhNCAjQzwkNFAKK004WCFCNkdOKkBVRF4yNUFBMTVBQTMmTUk2JUEkJTBYO0A4SiI9ViRfLUJEVjg4QiI9NylGOlRcXjgzXS0KK008JERNL1ZJTy1BTVBAV0EtLjZFUjYjOEAmUkUpMyVJWkE1SF83SC1aPEYpSz5HNUszJDU1MSVBLTgnKVoKK006JVhSL1ZARSBQR14oRilfOCQ1ODM1QFIqNDFKMiVBOjhIKU82RUheLUNdKTI0VS8yMkRSM1ZNTzgkMFIKK00tJFUtMTNQOyZTXVo9N0lSMSFAQDZWIEAxNylANkZAWTE2IVY+VihFKzZBOTZGKTYuMkRJM1VMWTYnIiMKK01BOCk7MjYhODgmIT48VkBeLjZNSzZVSVA8R0lcPEchPyZTIVM8JUUrLjVNSzpWRVE4JFVGMjRVSC9WTSkKK01GRDVLN0JESylSVFA2WC1aNUVFUztHKU5AV01AL1I9SjxURSUgNDQhODAjQzw0MDsuNylJMzcqLUJGXTYKK003JEU6OjVFLDYmIUw8NU01KVBYQD5IOipAVz05KjBYNS44KixBJ1VLOCRNOTYzOSk7JkE5ODclTzJSNU8KK00+Ry05NiYtRjgjOEAmIiEiKVRFTkE4SUs8R1VaOUYpTD5GOVo+RiBQKVVNMyc0VVo4JylOQCZAQCBRN14KK00oIzlLQCYtQDI1RSktREU/MSRNLDY4LVA7Jk0pNTYlQzhURF86NVBcMSYtWjxGISkvUzhSKTJELiNCKTAKK00+SClaOCQkWzQmIFY4Jz1DNkYgVilVSVU8RUQ7KjU5KTo2IF4pMTRJMjVATTM3PTs5KEEsL0ctWjomJTEKK006RkU4NkZaIjgjRTo7Rk1TOUVcWSRBVTk6Ri1BMSNdLzgnKU81REU6NiNFKTgnKUxGRiVKPDMoSSozOFwKK002V0lSMyZFUjwmQUI9SElaNiM5Qz1WIF8gMlQhN0AjXjw1QDsoJilQLjReJkNHKSwxNE06PVZFKzE0XUkKK006VTktLyFAODZHKVU/OCVGKCBEKShGTixBOC1SOCVFQThGITs4VFUtOygqIjhUNUg4RilJPFZNQzYjMDgKK00lMjxNJTRFOzlIIVVBN1VROUY5WzxFRUlARzxeKCU5KCk0RUoyJi07PkcgUiwjUFsqUjUtPlYpODYkRUAKK00yNDEtMTVFJTE4Qio7Ri0oMjVNUlgnKUAuNSFJMzQ1SDxHKUI4RUReKCFANSUxVFIxJUlaQiVEVjgmTS0KK002Jk4iPkZJOTgjOSw7Rk1JL1VZSDM3IVU1MUAuJlQxKS9FRUosIz1PL0IpQ0JHUVU4Ji1LMTNNJD5HKFYKK00yNy1LOlVIXysyTEUtQyElOCQwRSkzOUo9Ni1BOFAtOUc2QUo8RyFTPzZFISkyVFk4V01SOCYlOTQ0NSUKK002R1YjOkVBQjxHISsgMlQhM1AjXjxWVDsmJDVIODVFUkJHSTgvJEUkOlgpQywkXVE4VFUpL1MwUi41QT4KK005Ry1AJiBEKSk3Iio/J1VaMjQ1QzlGSUo6MzhNN0gqJjpUNSkvVE1GPkZNOjYjUDgpUyBAI0JEVi9EVTsKK01CJ0lCNyZNUjxGXU48Rk1ANiRdOzomKUo4RyFKOkVRTS9TXTgsQiEtQCZJLS9TITg1QzhNL1YgWSlXKioKK00+Ryk4LjNdTF0mVVI7REU7NjQ1OjpGTVs8RkUpLSNEUCgjMTUwRDVSQVQwQjYnSSU2RkFOPEdJTTpGQUMKK004REFPMTVBVDgnKiE2ISguJTNZQS9WKUY1M0U+MSE0WT5IIiI8Ni04KzE0OzM2XF44OCoiPFYgWypUMTkKK001MkRNNiNMQCgiVTo8RllaQDYkXy42KTs4VilSPzc1PixCID0yJyoiPkctRiBTOikxJylbOlYtQjhWUSUKK00gM1AhM1AjXjpWST4wM105N1YuID82WUk4NU04NCZJSS1EVUk2RFUkMlVFOTI1RTo4RylOLUMwQCk2KiMKK01ARylXNiNZLzM0NTo8IlQ7NjdVXTtUVFIpMzlKQFc9KSxERDgmIiA4JTIgVjEhTE0+V0k5NkchLzlHUVUKK002M11CPlVBLTxVSTo6RyokPkVJSjUzWTovIUxQPEZJSi5SNSQ2IlQ7LUZBQS9FSVI3J0lIL0M5LV9EXUoKK008Rk1JNkNcWTM1UVtBN0lCNUVFJCZSNSkuNE1aQiNEOzI2TS02RFEtMyZJOzxHOiQ6Q11CL1JVLDxHNiIKK004MVQuJiJVKS1GVVc6VUkpNiM4XzhWVV0/OC1LKjE0OC1EMTU4R1FdPlZdJCs1RUE6JVEpODNcSSgiRSkKK002Vi1aQEchODI2VVAzM0VOQVZVQi9TUEArNDFOQUgtVzgmJF4tRUVCMTVJTzhYKUAtQCUpIDZEIF9EVUIKK009VyUpMTNZQj5HNUs8Rz1DOlYpTzolRUA2U1hNLyVFLTZDIFY4JiVGPCNdKzEiNSQ8RylGPSZFSTYjXEcKK00vRVg7JiNFSjxHIT41NDBWOFhCIDgzXTkvIykkMSMwVDI1UDIoJklXMiYpXTZGKVo8RkBeMDY4XjEnXUgKK00vVFU5OzgqIjtVUSk2JDRAKjYhOjlDWEkyNUBAJEJFKDsnIT48REFRPEQ1KTYtMF8zJUVKPVYoXy1DRS0KK005RzVVOVchTzojMDstQlUpPUg5QSozWTs1Ri07ODVNQjMnPV1BR007NkVAWy42SVVAV0EkLSQwVi9RTSwKK00+RzVPMSU5JTYnIUg0JVIqQkY5JSxCNEU2Jj1NOUc9VjYjOTs2ViwjOipFKS0jKEkvQ1kwPEghUzpWRVIKK007ViBfN0ddOjZGITg2NTReMzZaJDxWPVc4JE1BNlRdPjxGSS0mUCReIDVIIF9DRSU8R107L0IpKThFIToKK008R0lXPEY5UzhVSUg4IlQ7KzVFQDgzWE0uNkVLOyRNODdDOSk6ViRZNydJVThFRFYvRUBcLUNdLTZFWTkKK004JiBQMiZZUjhHPUM2NiFKO1ZFPzpFOC4pNV1SMlQ9UjhWLUo7Ny1XNlVAOys3PVo4RUlCOUZKLD5FSTgKK003REU1MjYtUDtTOFw3RiRUJiI0QjImSS06VSFHPEVdQjhPWUE2I1k5PFZEXi1ERUczVEFCN0ZdQjo0REsKK00pMiBWOkc1Ujg0RUA4Ji07NlVBLC43KiJARyk7OFYtRjYmRTs6NV02ODU0XCpSRE0zJ0laNkVATTEnKVIKK00sIyFSPycpSzgiNEA2JklPNCcqIzxVQVM6NkVMPEctSDYkMEkoI1ktMzZVWjxHSVo4Ri1DOyZdJS41OTYKK004VkU7NiRRWzxWLiBANU05OFVJSz5HKiI2MiAhKzAkXiAvWSQtVFFSODQwQClURFkuNUlSOkZVVj5XKT4KK006VkE1LEJUXzZGSUEsQjUtPFZNQTg2RUA6J0FAKCMiKT5GKSk2JiFAOjclSTI0TTsyVi1ILCRFUjYzKVIKK008RVlKOjYtWzgjOSgoQiksPEcpOjI1TVAuNDU7NkZNOjM2LUk4RylLPEZJJS40NUI5VzU7OEg6IjpTXE0KK00tRiE7MjM4Wy8kXTo2Rk0kMjYpQzpGK146RykvMTYpQy9SNFY4VFxWLUQ1PzZGLS0xIkQ1LEYpSjcmQSQKK002RylKOEQxODIzIUo9N0lbNCUhQzomTUs6Rkk/O1ctPi9VWU0uUVVAPzc8XyZTOUI5QzhWPCY5QjYnIFYKK00oI0U/OVM5LTxHWVo+VylGOlctWzxHKVQuUUBWMjRVOzpXKVpAVilLOyctSTUzOE02JyFXPFYlLTxHLTYKK008SDVLNlYhLDpWUUdARkU1IDM4IS5QI147ViksOFZdQDdDWFYyVUE5NlRVSz03UVs6VkVKPCZFPjI2KTwKK004UzhJLUYhOjhGQVE5RloiPDNMTUA4LVIzVDUsOCZJWj1UVS07VU1KOjRdOj5GOE0zJk1DOEcpUj02TUEKK003QzBULURdTzpFSSw9VFBNMzYpQjZFJUI8VFUlMiZJUjgjXTs2VFVCMSNFTUJIIS0tUlUvNiREXjI1TVAKK004VjogOiNcWThYKThfRUlGOlZNSjhFJEUtRilJMjJUVjYmJUg2JUBUJEJVODZFOSwtQyFNPFZcVi1FQUAKK006RilSPzY5OjokUTs4RjlOOiVNUjojISU8Rjg4KzZKKC9RNEkyNUU5OFglUzokQTkvQkRSMjVAUDE2KUYKK007Ry1SNyZNVz5WOU1CJURALlM5LTMkVUs7RzlQOlcpUjhWJFsoQ0VCPTgtUjYlQVs6Nl1SOkc9SjpXITsKK004KClCOEAlOSA1SCBfRzVaOiVRUjdGQT4sJU4hPlYkUDZGWVo/NikvMzZOIj1VTUo8RExXLyU1Pi40MUsKK008Vik+Plc9QTE3KiM9NiReL0VBOjtHPS0zNik7OVVNKTI2OVE3RDUoOEVJQjxGTUI4JSU/NiREWTcnKVIKK002Rkk4KTMhQjomLUk4VlE5MTMhLTcoKU48RFxWNiRVJDpXNiI6IzxbNjVNKS9DRSk8Jj0nPkctKSc1TioKK004T1kkMVY5Wjs2TUMrM11CPDcpOC1FNSg2Rk1LNUIgUjlGTUg2IlRJNldNVzIyVSU6VkEkOEdJTjsmKUAKK00zNUktOFZdJDQmXFYtRl1NJlEpJD00RFI1NiFINUYtUj5IKVI2JERNL1RVOC1ENTszJSE5PEYtLzlXKVAKK00+V0lLNTNQOygiIF84NEBZOFVNVz5GKUE1MkRNLUYqJUBWRUI+RzVWOlVJQzlHLVA2VlIiOiQwITgwJUMKK00gL1lCOUZZUjxFSTgyMUxZQFg5SzYmJUo7RllCMjNZOj1XSVI8R00kKzU1QDdDXF44V0lQNlcpUjhWLUsKK00+VylCL1VBQTM2SVAzNiE7OCZFOzgmJT46Vi1BMTYhKS40XVI4VTheNiYhJSs0NUo9NylHNlNcUjEmTUYKK004RjlOOEU4Xi1ENV0/NzlIMTRdQzpXQVI/N0EpLUZBUDM0RSkxJkVPLjZJWi1RTSlARU9eNkRdLTpEUTkKK00+UyBfOldRWjpTIT4vQj06OzcoTS1GRU07VkEpLyRVWkAmRFwvJiVDMjRBSzhVWSQ6NiUpKlYtRy9ENU8KK00yNEVLOUFMOC9XNTszNkVQO1RBJS40PVpBN0lPL1RFNi9TKFk2RU1JMzZNTDM0XUs6VllJOCYpRi8jIDsKK00vVz0tKzNcVjhXKS0xNUUlKjFAUDtIKUw6V0lOPkcpOzYkUUg6NiVLQEcgViAzWCEzMCJPNkYtIThXUS0KK00tQkQ4LCcqIDlGTUs9NylCOVYlKTY1RTw8RklAN0I1IjglQSkvVFFVO0VJQzgkMUs4VylKO1YgIzhfWVoKK008ViFDOFZBQzhXKVs7RkUtOEZFQTIyVEU8Rk0tKVNdVTYiVE0zJllaOEVJLTNTXTk2RDUkOyYpOS9TOFYKK002RllGOEVNLDhGWU5AR1YiOlRVQjxGKTo4JUVCOiNdLz5VXEc4JyknOkYpJTYjOF47Q0xQNygqIjsjIUgKK00xIUBFMzghKSwmSVI4RVFAMzNdQjxHITgvVDFIOFUhQjpWQFYyNkU+LjVFOzI0Ry46JUlHPEZNJC1FSUsKK006NlFDOkcpQjlCVEI2RlFdPkYhQjYiVEktRUlGPkYtUTpWJUE+JyUlMTRVLzhUTTs1NFVaODM4TSk0RTsKK00vUzxfMlM4LiYkNUIxNU1SOUdJUjomKTs2NiVBOFcpSCAzWCEtICNeLCNYOCpXPUMvIiA4JlUhWzhWKUIKK009N0lLO1ZNLS9TXTg2U1hQOCJESy9TWF8tQ0VKPFRRODokXUA4NkVJOEYpSC40ViI+RUUoOFZdUjxHSVYKK007N0E6NDVFLzY0MFxAR0lAKTI9RzgiVDstR0oiL1NFKTYlQTo6JThZMzRRQTYkMSkxJUEvMVREUjNUUUIKK00+RjFOPEVFQzcmTUMzJk4jNyI9KTxHKTs8JkEpX0YpPDM1QF4vVkBbKTQxVj82LTY9VUQyJiQxWjxFRUIKK007Vi0lNjU4Xi40UUE4IyA9MSYtSjhHKVctQ0VDPiZBKS1ETUA2RUlSPkZRUjg0VTgzJj05MzcpUjxWMFYKK002JFUwPTc1WjtTUFIrNDVOPFZBVzhGKVtCSC05L0RFODg0NTg4NFFLOjVAVigiVTkyM10lMTNMOCYkTToKK00rMyEoMTUhSzpVWTsyJiFOOlgpUjxQJVcgM1wgX0NcQCUyVUs9VUEkJzBYRzpXKUk2Rj1XPTc1WjZDWSkKK006Rl1GNlRcUipUMSs1MzkpOFcpJS9GOVc4NUE7PEZNQi9RQEU7VyhfKTRVSzpXUiQ8ViFaPEVJKTE0RSkKK00xJllaO1NETTEzODglMkU8PzRETTI1RT84VjlDOFVEUDo3STozNFVCOjVNQC9TXFYzJy0wNyVRLTEzIS0KK00uMj1CQkYoOy1EUS06VlktNU9ZLTFWJTsxM11AL0MpOz02VF47V0lKKjEoRTQnSiA4Ri1JL1NFLTglRTkKK004Rk0kLlNdOjpWKUI8Q1xWMidNUjIxTSQ8JUUlPEdJRjxGSS82JEU1NiNFMD5HSVI6Nik6NjY5Wj5GSTgKK00xIlxWOFcpQDomLTE8SFYqO1U5PDI1SUk2NFE4OCZRUTIyIEAvViE6OCY4XyZRTTk6NERbMjREXjZWLToKK002VDUnOVVSIjw2PCE+QCVcIC9ZSS8iTFY4Nk05NUMoOCk0XUs6ViU6OEZZXkAlSSkyVllbPkghQzUzOSUKK004NiU4ODZFUDUzOTo6Vi04MTYtUztTODgpNiVPLyE0SS9TRUZASC1dPEctRjYlQS0zVUFKPkdJSzg1QDsKK00jQj08Olc1SC9FWUI7VylLN0Y5NiZUMVU9NjkvNCVNJS40RS0sJDFKOjRcWTIyVDUqMUA1Ljc1Vy1DXF4KK00pVD0wMSU7XjM0VUM8JUEpM1NFODhHKTsnNk1dO0VASSgiVUdCRzlMOjM4RS1GQTo6JylaO1Y9ODZWVVcKK008RixfNjYlVzxFWEUtRi1DOCdKIjpWOUg6NiEtOCZFLzInKVo6V0lSMjVNUz5XNVI2JEUpLUVNSTYlTUMKK00zNUYmQ0cpLDE0TTo9VkUrMTRdSTpWTFsoIjUlNiYpXTYyTEU6NyErNiNcVi42RUgxNFElMSRROEBGRTsKK00gNiwhQEAiXT5GQFIrNFU6NlRdNS0jMF46Nl1CNkRVOTxHTTksQlVCQEdKIzdGKU0vQzklNjVNSTpWIS8KK004VklCOjNdKThXLUkxNDFDPCVYUiZSNEUuNUlGPlAtQyBVT142NiFLPzdVWjxWKEkmIkU6OkZJOjEkNSwKK007SC1aOkVNLTEkXVI/NllSODNEUC1DWTYvRTk6OkZBODY1NDsnMVRAKzRRSDI0XUE2JUEpLUQxLTM2KVIKK006VlFILUNZODQ1RE06R0lGMzNdJC9UNVI8Rk1IKTFARTYkVUI6RjlSPEYtTzs3KVI2M11XPEZJTjhVNFwKK00vREVCPkhaKj02TVM8JU0pOicxLDomVUNPNylbNlJFQ0BXSVI2M0U+NTYhSDZVTUA2NUFSQkdJOC8kRSQKK006WClDLCRdUThXSUkxIkQ7LUZFVzozXEUxNiElOjVEXC1GQUs1RDU2MjJdJTpVSCExICVKIC9ZSjtUNSQKK004JUlCNiYkXCpSNFY6JkU7ODRdQzpERDskQ0VSPkhBITM3SU4rMlRWMTZFSTM1QUk6Vy1SMjUxOzdHLUsKK001REFQPDYhIS0jXSkzVilROyVZQzg1TTs4JUVSQSgxVTxGKFYrNTFQPkctQjZFSF40KDYqOkQ1OzpGOU4KK009RlojPEYtKSsyVSs4NlFLPEchOzImRE0oI00pOFZBRjNVOUk4Vi0kLUM7Xi9UTUg8RjlIQCU0TS9DOSQKK006JjlVNkYpSzpWLTs4JUBfOCI0OCczTVE8RkEvNkYpSz5GWUo6U1hNPEcpOTFTXTguUUxFKzYqKkFHVUoKK008R0lCKzQxUjpWTUo4RSVaPSFNKTxHKUo9NDUlNkZdSzpWRUAvUiE6O0VNLzYiNDsvViU7NlI9JD5HOVIKK006M1w4KjYlSDdGPSQvU1xNODVNJC1FUVA7JUhfLjM5JUBHKiAgM0QhL1AjXjo2TTk2VkFMPDZFTzYyVEUKK00oJDU/OCYtOTZGXFYjQERFMjVZWzY2VVo7NU0kLUNdSDYiVE0uNVIiQFRRJTg0NUM6NUE2Njc9UjZFMTkKK002NU1SPkdJUDhWLTszVUEvPkhSJD02WUMyMzlAPTdNWjYmLUw6NDVKPzYoWTMmSUw5Rk1UOjYiKj5ETE0KK00tRDFOPkc5UjgkVUg1MkRWMzZRUjpGQUs8Ri1CNkNYTV9CKFs8JVlDNlc5QywjOEAmVUFaOlZBSTxHIUsKK002VkVBMjZZOS8jKE07WClaOERVKTInSVs4JUxFKCVFSzYkRFIvQyguJiFATTZXNVU6RklTO1VdQThGOVoKK007Nk1DPEc8TTJVSS80NzlQODYhLzpGSUs4VVhfODZNJTNWRSQvVilSPEY4Vi5VIVI8WCFMLEI1QDZFQUgKK006NkU4L1NFQDtDWSQ4VVlCMTI0XzE4KUZAQCU5IDREIF9GITk2Ri0vPEhFUj1XKUAtIjUrMTYlTDdUXVAKK002UkRQLyU1LThDRVJCRjk7NjM5SUAlNDsmIkRWOUhBSDNVSSU2NiElMyNFOjtWTTs2RiVDOlVZWzxXKVMKK006JU04MjZJXUEnSUY4NExWMycpWjs0XTo5SCFCOEZNQC9DWTw7Rk1CPFY5R0E4IUkvQzg7Mjc9VT02TTkKK002VUErNTQxOzhUNTA+RzVLMyYpTSRPWDItRTkoODVNRj1TWE0qMUBNO0ZFVj5XUVc8Rk1XOCQ1UjhERE0KK00rNUVdQEcpPzYlOUo+Vk02LlQxOTolSS05RiUrKjMwXCxDWUI7VUU8PkZJSzpWIS06RFE5Plc9WjM2IUEKK00zNDU6O1cpVzg2RTo2RilCOyZNSDYlRVA4NF1CPkc2IDxGRSU4RVlOOkY4XzZGLUk6VllTPCYgOy9YIT8KK002Jk1DNlNcQCszXiI2WCghOEAlOyAvWFwnM0VINiYuJz5GWVo9Nk04OFQ1LTokVUA6RihWNTRNSTpFQEIKK002SC1MMzM4RThILU8vIiBSNTM5S0ImXUEyNV1INkRVJS9UVUo7VEVDOlYgVDhXKVNAJl07NiVBQjxHNVoKK006VURfMSMhJDhEPUk2ND1bPEYtOjdVMF4sJU1CMiZJVT84OiA+RiEpKjMhOztGTUo4RU07OCYtQjg0RDsKK00nNkFGOVQxSkBRTk4kRDEtMSYpSzcmTUM2JTBUKzYhPzdXKVxAJk1OPFNcUDs2KSkqUihfOEYpOzY1XVUKK009RzVKNUNZKS9GRUcuMC1DU1ZFSjw3NT8zViRWLEc9QjNUUTgxNUBWL0ZZUjxGOUo9VkktLUMhQkBIKVMKK002NDU4N0cpUjZERS08RlE5OFcpQzxGVVU8Rz1DM1VJRjpXITs3Rk1LOkVZRiozRUs4RUlLPFZRKS5SVD0KK00uNyAhOFAlNiAuVFwoIzk5NjVNVz5XKVI9V0lLOkYtUDozXSU2RUBQL1QxOTlHJSk4WC1LNjM4XDZXSVMKK005Q1EpNiM4Xz5GWTs4NkFQO1ZBOC4zXTw8RkFKO1YgRywkNUM+Rk1ANkVBOjZFUV1AVkRZNTNcPSsxTUIKK004Q0U+OFVBOjYkUTYtQ1ktK1RVTj84SiY/Jz04LSI0XzQnKUMgVU8oN0c5XTxGJEkmVUVKOERRTkQyNDgKK001NU06OicpQzQ2KUI2RUErMSNcTTM2WV8+RllDMjRNSjIyVEsmJVE4LjM4UDZHKV1AVkElLCJUTThXPUkKK002NU06OkdKIT5WTS82IyhNIFcrIzg0VS02I1hfOiYtQjs2TVU+RihSJTJdV0InSS8uNUksO1ZNQTEzWUkKK004VUFIPkZNOjImSVpAVyUlNjZNTTxEXS82Rl1DM1UlSThWSUI6VU1CPEYhNTYzME04ICVKIDYgIF9ETFAKK003RyFCMyVRUjolTUI+Ryk6MyctWjhUTSk2JUU4MjRNJT5XJUxAVyk6MjREXjZHNVo8RyVAMSNdRjlEXUEKK004Vy1TOyZFODJWJVg5VVlDPCU0VCs0VVAzVU1ANkVJJSxGTio9UzhWKzFASypUNU84JDBeMjVJOzYkRFkKK00vVERNLjYhSj84OiM8RU01KjI0TTZFSS02VU0vOEdJVTxGJFY4Nyk6LCVKKjYoLFA2JiwkOl9FQTYlIS0KK002JkBJJlIgUjMnKig/JF0pPVchJCZTKEU7NUBWKjJEXjY2OVo3U1kkKjIgXjhXSTA2NU06O0gpVThEVTgKK00vVEVaPkgtUDM2JTsxM11ANiNFQjlHTig4UjQpJEVKIz1WIFkvQ01CNkYlLTNUXSUvRUlbOyYtQzonSioKK007IyEoPkc1UjEzXSk4VilDOFdKIzxWOVI6VUlSPERVQDg1XUkgNUghNDAjIi9SRS0+Rz0sMychQC9TRU8KK008RERWNkdJTjYkNSU4Jl0rMlNdUj5HKV08Vi1BLlFMRTpIKV1ARi1GO1ZNOjdGJUM8VzVLOFYkWSwmXVcKK002REFKOiREVjI2RTshJiJFMjJUXz04SVEyMzg4LlYlJTsnLTktQ0U2NCYhOTI0RTguU0VBNlYuIkBHLToKK004JExSLlAtKV9FTUM2JUEwOUdJVzM1SVM6I107O0cpQTM2KVI6RSFDPEcpOzI0XT8uMShHKzMhO0BXSTYKK002Ny1IN0NMVjg2QSktIzBcNiVFQzpURE0tRUxAJEM5SDZFQTo2VllbPEVNLTYjOTg7RzYoOEMxQzwlQSkKK00zU1hFLCNeIEQ3IEkjQUEpPEY5SzgzWF86JUVDOyYlKzEjOFc5ViVAOldJVUBWLFYxN04iPVYgXy45KSkKK004NylaPzdVTjsmTUs6RylTMzNdJTwnPCE7MCUtIC9ZJCZSNUI+RikxOFZETSc1QUExM1xQOFUgTS1DXUEKK009VjlCNlZFQDpHSV08NkUlKlI1LT03VVM4VlFTOFVNQjo2UVY9NlVDN1JUOzZIKUgxNV0sLjNdJTo2IUMKK006NiFSO1YgWTZIKiQ6VEBJL1chJDM3KVAuMyhPLjVBQDZGJUkyM1lCOFZNWz02OUI2ViVIOVU5KTE1TUIKK006Ri0kNCcpVThWTVI6VU1DOkdLXjpVOUI+Rk06OFcpVj4mIS0zNDBAKjM4XDZXSVIzJkVSOkVBKTVHKU8KK00zMyhNL0ZFTzhGQTQqMSk4KjBYMis0RTY3VkFTPkcpSDhGKFYuNDVGQFYgUDhHKUs7JkEpLEBEOzpIRVoKK00yMzBNNiZNPjxHLF4yNyFCOFZNQS9VRT4vRUUlNiYpVzcnSVExNUFSPldJUzEiVSQ2NyldPTY5QzokNScKK009Vyk6N0Q0PUBEUUogNyghPCAjXjtDTFI2VzVSOlYtTy1CVSk2JDU0L0VAVis0MTg4VllSPEY9VzckUVoKK007Rk1JODQxQDw2TVo8RVlSOlVNKTNWJUc8RzVGODYgXzI3PiM6RjlQMjJUWzE2JTs2Vk1PO0ZNTzo1IVIKK01AVlU4L1NFOi1DWUs8RERWKzM5LDgkRS8+VVklMTRVUz1HKUI4JEUtPEZdQDM2KUM4VklMMSRVRjpGLVsKK00+Vi0wNkVZXF9HPSc4R0lLNiYpUj03SU82RiE0KjJETS42LVs8RiFBNjRUVi9EVVc+Rk00KzJVLDtUUFcKK001RSA9MjQwUCUxQFsxJiFQOFcpUjtWTUs2IlQ7L1dBUC42KVU5JylSMyMoKSYlRiI9VU0+NiQ1KSwmIU8KK00uNUFBOjZFQjYjITo6I11BMjRVOTckVVI+JU05OFZRWjpEMEktQzlDPzclOzNWIFYvV0lOOiYtOSk4KE0KK00yMCU+IDhAIF9HTUgyNUlSOjc+ID1WISUzVUkpOEZBRisyIFYxNUlCOUZZSzwjWFA4RUlCOEVEVjZXSUIKK006VylSO0YpKTE0RSQyNi1CMzYtQzYmKiJENylMQDZAXzEkNUE5Q0UlPVRBKDpXSUM4R1lNMyREUC1CNF4KK003JylDNiM4TS41OEcuN0lOMTM4STQ1ST46RiBWKzZFTzEkRUA4Vik8OUYtQTdUMTE+R1VGMzNNLT1PWV0KK00xJFU6MyMxQDpGVVM9NSFCOFNMUighVSg8SClaPFY4TSoyVSk8R0lVPEVZKTNWTSkpMzk2MSU5STgyIDgKK00sQ1ElOjRVOzxGKUI3RiBAJiI1LThVQU46RF1GQEVMViYiIUA+Rz0kLjchSS1BKFY4IzkvMTVBSTM0MDsKK00vVVhHL1QxLDlUMSk7JylDMjI8XzxGTFArNDBWL1c9UjZFTUYrNEVXNSc9WjlCViIoIjQhNkAlWyAuTUsKK006I0UtOjRBOT84KVI7RUUvM1ZBSzhTMC4jQjReMzRVPDpHKTk1NU04NjVJQTI0UUMvQyFGQFZZUTo0RSUKK00xIzk7OUNFLzo2JTo4SClSNSZZQjpWRTkzVVBFKCZNKTE1SVI2NU1bPFVRQDUzOFwxNFFCOFYtKS1DOEUKK00jQj1COkRFQjdDOD0tRU0+KzFNQDpQLTpfRilCMzMoWThHJSkxNzldPTcpODE2SVo6JEUpKzFAXjU0VVsKK01AJSEsPEQ0Xy8iIE0xJlomQFc8UighTFY6VzlKOUcpWkBIIUoxNU0pLjRFSDtTIEcqNUE4NkYhQzs2STgKK002VU0kO0Y4RSk2Kio8Q11KQTdJUC1CVTk+R01AKTMhUDsxTFY6JiE5L1VBUjhFWEkvRyU1KjJVKTwlTTkKK00zVilKOjNQUjMmKSktSSkkMlM5KThWLUI8JEReOjRBUkBHQT4sIjQhOFAlTSAvWUs4U1BZODYlOjpXSiMKK00+JkExPCc9UjlVNTAoIUBWMjRdOThGKS04VkE5MjMhOTolOUAtQU0kOlRVUkAmRUE4JDU4PCVFLThGLTsKK00vVjojOlYtOzpXLVA4M1hFKzYtSDtWTU42RUlaQkcpSzslQUA6NilCNjZJSjMmOSUoIik5ODM5Vz5WJFkKK00vRiE4L1RFSTxXJUI2RilLM1M4SS9GOToxJklaO0dJWjolT145RlxQLUQ0WS1EMFk8SElaNkZJNjglQTkKK001M1ktO0gxUy1CREkvJF1OOyYpRD84Rio8RUlDODM4UDo1REIqMU0pOCQ1NjpWVUI3VVhWLjdNQiZRNFcKK009Nl0nOiZBVT80RE0zNVFWQDJUMis1QEkmVTlCODNZOTpWSVAvUyFTOzI0VjY0MFA4RyVGO0dJSjZURScKK006JiU4MlRFLzI0NSQ8Rl0vOCZBSztHLTtAQ0xeIDYsITxAI148RyEpLCVJQzo2LUtASDFOMzYpSzxGTUYKK008RDBJLURVLzMnIU82JUFGOlVYXDgmIFQxNjhNKTNcXjhXLVM7JiktOiYtODYmSUY4IlVKQUctQzZHKVoKK007JiUrLyNRLzwnKiA+Ri06O0hFWjdGLTo6JylGOFRdPDpDIUA4VUBWLjVAXjdHSVI2REU6L0NFOjhHKVoKK006RDFGQEYtQTEjRU85JFUvO1YxRjtGVVJfRU04KTE0TS8jXF4uNyImQiZNOjZGOF4xJllaOkZFUjgzXE0KK00vViUlNyZJSzQmWiBBR1VGOFYkXyk1XTwpMkxAKzNFNTM2SVI6VVkpJlJVQy1ARC4nNklaOFchJDY4QSsKK00vJU06PCgpQS4yIEUvIUBFNidJWjIzMSk8NiRWJiFNQDskMFslMk1QO0c2KjtGLVA6VlFPOiRVJzY0RFYKK00sJk1XNkRVSjsmLTk3SChQLUAlJyA2OCBfRilaNlI0XzpWTUk4Vy4qPzZNOjMlTVA4Vkk2NSNEXzY0VToKK009VyBZNkcpQTo3VVAtQzlPOzMoRS9VRUM5Ry08OFZAWTElQUI7RkBNMycpVzpFIVI+Ri0vNiYlNTI3KUoKK009NzVONlVaJkBWKTA4RjlKOUcpSzhXISkyNSE7L1FNJTg0RUM8VUhQMlJUXzojRF87R008OEc1PDZEVFkKK006VkksMSZNWjhFUTs6X1lJNUNYNSgiNTUtQ1FIPzdVSjE0TTg4JDU5QiVNOT1WRF8rNUFQMzRRQkAmKTsKK009N0FdPUcpSzZVQS03IzkkL1MwOy9WIUI8Rl1AMlFMXzokMEcnMU1CQkdVWzg1QiIvUzlBPCdKKj5GIE0KK00rNDRAJTJVVUBUXTk3V01UMSJETTZWQF81MzBfNlRdRkBWTS8+SEFbO0cpOTI1RTQpMTUtPEYtQTpWLUsKK004Vk4iNjRMIS1AJSUgL1k5OlVcTS9WLTw7VyFGPzgpVTxFSSk4Rk1ANjZBQDE1RTk2Rk1QKVRRTi9WKiIKK01ARilDQFg9SSszXSU2RjlaOEYpRysyKFYvVz1SMlQ1QjtHKUM6RylLNiRFJTYmJVI8VlVKOzZJOz1HVU0KK002VUlOPEYpUjxGRUw9VlFBNiNMMiszWSs4Njk4LCMoNSwmJDskQ0VaPVZZUjhEXF8yNi1CMTI1JUBXKScKK002RydeOFYpQSxBNDgtQ1heOUdVVTpSVE0tRyFIMzcpQi9TOUs+QzksOEVIUCxHPVI5RS08QEdBWjsmWVIKK002RUkpMyVFPikyVTUzNiFXNlRQXjgoIiA6UjQpLUdJXT1HKUJAVURQLjZJWj84SUsvRUVBLSJESz1XWTsKK004M0U7PVZFKzg3IVc2NiFAODZNOzZGWUksJi4qQUdJSjgjWSUvQUAuKzVdMDQmSUY+JylRQEc9UyA2ICEKK001MCNeOCVJLTY2JUM2Vi1MOldVUj5HOVA2VilKNkYlTDo0NTUvVF1COlNdLzckMTo8R0lVOzhJXTxGRTsKK00vVFVDPkdJPDYlNFImUj1LPEVYWTEmKUs4RFFCOlZUWygiVS8zNjlbPTZNSzlGWVU7Rk0vPEdVWjtGWUsKK005RklJPiZBKy1SRDsyNl1AL1MgWypTOSQmUTQ7NlZZRjs2STsyNk1QOkNYOylXSVsxNTlDX0Q1OjxGXF8KK00uMjRNMSYtVTonKEklMU04OlVNWjhUTF84VzVDOjVIWS1ENUo6RjlAMzc1VTxVTVpAVi07ODVBQDozUEkKK00tRTUkOEVMXjg2UU4/JzxcKCJVOj5HSUY4Rz1RMzUxTD5XKiI+Vi1GOjVZKTQmTiI4VjhSLUU5STo4JVIKK008RkU5NiRVWjxFSTo4Mj06Pzg9WjlGLTgyM1w1IjFAXzJTOFc2R0k8OFgpWztAJU8gNiAgVTYhOzI1SUEKK004VyU7ODY5UjxHOVU8RylPOSZFOzpGXS0yNDElN1ZJQjglRT44RkoiPEY6Ij5GLUo4VTU7N0ZaKTolQTsKK005QkQ7MTYpUTI0RSg6JTBHLjVNSS8iTEspMVRWO1c1UjhWTVA6Rk1DMjYpVT82PCM6SCVOIFcrXjpWQFwKK00kRUVbOEVATSlTRUg4JDBSJlRFUDhXKUYvVFVaQEZNPjElMiBCRklDNjVJSTxGOTg4IlRNMTZNWzxHKF8KK00qMUBSMiZBSjM0MUE7VylKQDc8VjgnPVAzJU1SPkc5VTpEUU5CRz1DNlRRSDpVNFsrNUFBMzREQi9WXVIKK005Rz0vLURNLTs4LVI5RlVXMzNFSTxGTUM5Rz1POEYtOTZTRVM9VyErKzNFOEklTUc8Ri0vLUJURzpXKUwKK009JyEkOldWKj5WLTs6NiUpKjBELis0NEAmVTlKL1VKITxAJUggNiggX0RFOTE1SVE8RVlDOCVJSzhFIVoKK00+VklfPVchTDxGSTktQlRNL1chOTMzRUA4JDVLOkZVVT5WXS8tRUFBPCZRUjZDXSk6NkUrL0VJSzgmITsKK004NTBNKzRVODJVRTArMkRCLVUlQjMlIUM8RylDMzVJSztGKTk0NUlGO0cpWj5GQFclNFVSNkUhQzg0VTEKK004Rk1JKVJdSDZVWVM2VF1SQVchLDomSV1CR1VMNC9ZRzxHKT42M0RWMSM4WTwmWUs6JkUrKzMhUDpUVSUKK004JylSMzVJQC9VSVo2I0U2OkdJWjlDWD02SSoiPCYlKTZGKSsvRUVJNkcpUjEiNUI+VylSMzM4XysyXUoKK008RVFAPEZRQDolSUM2I0U6OjVAXy9FSEUxWC1SPCRMVjYnIUM4NiUpNTFAODI2KSw4VVE6PFgqJT82TUgKK006RyFCN0MgOCgiREAoJEVDKzMiIj1WKCE2QCUtIC9ZJC8iNStAV10vLjRVQjpWIFA6VylCPEdBUjxIVioKK007VTk8MjVJSTY0UE02JiE4NlYtPDQmSUcvQjReM1ZRTDhURFYtRFVWPVRVLTpFSVA4Ji1GNiNdOC40MUAKK004NUUpMjVcUDI0UE8uNi1SPEYpQjomSToxI0UlNkcpQjxGQF8tRk1aNlVIXzlHUVM4RFU6OEU0VjgkVSUKK008RylCOUc2IjhUVS06WClcOkYnXjZGSVo8RkBHLUcxJCZTOUM2Ry1OOiNcRTZHKUo4ViBeL0RFLTIzOF4KK002NChNNiVJSzpUME0pNToyQkgpSDYkRF8rMzlQPCNFSEJGQDUvRkk8O1VAXjUyIEAxJUBZNicpWj5XKUIKK007JilAN1YtOi1CVSkpMzlTPFdNUC9VOVI/JkUtNkc8SSNCKF41I1xHKVVJWj03NUY6Vk1OPkZNPi5SIEUKK00vIzk7PDNQRUBFQS0gNkAhMjAjXi5SIDUrNl1bNjIgTTgnLUgyVkFLNyY5SzpVUiZDRyksMTRNOj1WRSsKK00vVE1DOFZBSTVDMS0yMyBcMSVJUzxGKTY1M1klOlgtSzVGISU6Vk0vOFZFOzgzOEcvVF0vMVYtUjIzOSkKK00pUlUpNlcpUjpGTUo5VUBfLjRFUDZXSUMyVDFDO0VBOjZXKVU+RylAM1VBKSs1OSQuNkFOOlZNRj8oLTsKK00uNDVLPkc1S19FTTg5KClPKTJVUTozTEUyNDVLOkZNQCxFOU45RilKMjRFQTVERF8vQ0RWJzRFOjYmOEkKK00oJUVKPzg2Mj5ERFYoIUBFPEc9ODZYSVcqM11BMyZNTTYmJFwvJUE4LUMhPD5ISVo+Rz1LPEc9TzhETFwKK00rMjRXOlcpXTxGJUM2VjlbOEVOIzgzMEApNUEpJlFBJT1WWUo3RF1IOUc1Tzo1MFstREReODdJSC5YKFYKK00yMCVXIDYgIE8zKDUmIlVBO1NQLiZTWUs8Rz1bPEZJQjhFTTs8SElaNiNRKTEmTiI4UzhfNlZNQzpVXSUKK002M1xHLCRFLzsnLUAtVEUpMlYuI0BGSUM4NllbNlUgIzo/WUExIz0lL1RRRj83IFkxIzhNL1JdQj5VIS8KK006Rk1ROURFJTsmQUozNFFAOiZBKTM3KiI/N0lNOERVOC4yVTUvRDVAOVVJSjhFIVo6IzhNNiZZWjs2TUIKK00zVlVQL1JVQkAnIF4vREU/NkVFOS1EVVM7VVFCMyYtVDMkMUI2MlRcKzRVQjVERDImJFVSOUc2MkJGPEkKK00jQFg1NCgpUjhHNiA4Ni07K1RdSjpWLyAuNUFMOCNQOywnLiM7RzlaOycpWj5HKUkxMjRWNTVZWkBGTTsKK008NU0kPEhBWj5HKiA1Myk4OUVNJDY3SVI6RURWNiZdRDlGXT43VE04LjRVWTxEREUxICVbIDZAIF9FNFwKK00tJEVPOVJELiUzKS04R0opPEZJQjY1SFY2Rlk7M1VARSZTXUE2UyhWMTZVSTlGPSkyVTBWLSM5JTYlISkKK00mUjRNL1RRUUBGVTw7JlldPEZNQjhWUU88Ni1JMSRRLT5YKToxIzhNLyI0WTlUMFAxJi1LO1RUWThXIUsKK002JFE6OCVARTE3KUA9OClGNDVBOC9CPSQsI1lAOiQ1JDZERUI4UlQ7L1chTjlKXVU+RikwOCJUNSwmSiAKK003VEU0MTQ1Ni9DWSU4RylSNiMhLTxEUTg6NjxbLUNZQjtVOEklMiEkPEVFOj5HVVctICwuTjM5Ujw3KVoKK006VilTOFNYWTZIIUgrNFFXOEQwOCU0NVM8RUUvNlcpVT04KVg1IjVBPDNdPD5IITE8RlhfMidKJDhWOiYKK008RE0vOlchSjhALVJERiRWLCZJSDNWTVM6ViU4LUQxSzo0NDsrMCVBIDVAIF9FQUkyNi1aOjIgKSNCIF8KK00uNildPkVNLTM2ISQ4Nk0lM1ZFJC9WKVI8Q1xSKzVFSzsmKTY2NERfN0RFODglXSQrMyhJLUM5JDtGSToKK008VylGPTdVQDEmLU85RllXNiNcUDpYKVo6I1xNNTVZJDZVNFYtRFU7OkQwVjZHSV09NkkpKTIgRTU2KE8KK002N0lCNUVBPDVCVFYtRDU6PCVFKTYlTUszUzhALCVZSDM/WU5ARklCNiIgLio0RU45JFVIMTM4XilURTgKK00xJVFSOEM5KThFSUg6VjlBMjNFQjxGLFIoI0UtPkY5QTo2WVM5QyAuI0JVSzs3NiI8RUVKOkVAVjg3VUsKK00xJDIgO1REPSUyNSw+RlE5NjVNSzlHOVcyMU0tPEVAWTcoIVc8Rz0pKTUhXC9EUiNAVkUlOldJUjpWTUYKK009VkU1LUYtQzJWLVs+RylMOCVBSzwmOiItIkQhKTAkRyAvWE0zViVQP0cgUiUwWEU2NiFANCZdSzYkNToKK007Jk1INiVFUDg0XUI+RzVINjRFJDdVTSkzNUhWKzVJSzwmKUI2IyEkNiVZNTYmKTk4KCIgNlZJXTpDWSwKK002RVlLOyYlOjE0VVI+RyFBMTYpTzZEVUM2M10tOEZNJS1ENTo+R1VLMSIgOCglQToyVyFSMVRFODE2IE0KK00qUlRWMyVNQjJTWSxAJUxWL1RNQDtFT14zV1VSNDYgXCUyVTY5Rkk7O0YgWyghNFc3U10pOycgXzEkNUMKK007VkkwOFYhODZGSUwzUzkkMjctUzhFSUw+RklGKlEoTThHSU0+N0lLOkZcXyhGIVo3JVhQPEZJNixEJFwKK00pVklSO1ZBOjZVJUc4QlRALCYpOy9TRUI9VUVJNSIhJDxCNEU8SC1SLjRVWj03KUo7OClQN0MhODYkTUsKK008RlVdQjcpOThHTVtARjk4IEFAIFojKE0yVyIiPkREUigjOUk+VzxQMydJSjM2JVI8RUkpMzcpTDZWLVIKK004V0lTPkchQDYjWS05Qzg4LUZNWjxGLT8vQ0VAPichVDgjOE09OClTOlZJQjZFRTo4Vk06NkchKS9WLUYKK004Ri1DPEdNQC1GLUo2RkVWPkZEXy4zRS08RkRWJiIgUi9TIShAJy04IFRHXjgzOEItQj0pMzYlOCozIVIKK004U1xZLjVFTj5WSVo8RilDNkM4Vy9ENVI/NzlLNiJMTTYmKTYyNklQMjM8Vi9FQUcxNUFCPCZdOjM0VToKK006RUlKOkQ0VjNXSVo6RTRFLENFSj9WKUI+RjlPMSJEXzpGKTYvVk1aODJVJDVDOUA8V0lNOERVSDxFQEkKK00rVTVRM1M8SS42XUg4NEQ7KzYsSSNEUVU6VEUtPkdJUkU2OU1ARy1LL1I0TTgnLUs2V0oyPVRdQz5IKVUKK007QCUhIDFAIF9FXT4yNCU8QCNEVixDWVJAVyk5NkcpVTpWSU86ViUlL0ZFQzYmLVM6Vk1OPzgpVzozXF8KK004RVg7KTZFSz03PUw4M10vOkRVJSkzKEkzNzVbO1RVJTZGLTs6J0lCNkZZQzU0RSU4Vjk6OkcpQi9UVUkKK004VyoqQUgpSzo0RF82ViBfLEQxPjgjWE04WCVSOjVJLTgmRTw4JDElNiVJOC9TXUs6VThJJlNZTz8vWiIKK01AR0lGOlVNQTY0RSU4RzYmPTRcRy9GTVM6VyFSPEYtKy9TOF8yM10rPCZNTjxUREc1R0lKNUVNJCkzOVIKK00/NUk0KzM5ODpIIUI2VlkvNlYpPjI2TVI2NF1SPkZNPilTIFYzV0oiO0YhJTpHSUgqMjVDPkRdJC9URUMKK009VyE1L1NFLyoxQFY8JFBZNkdJWzxGLTw7RlFSODIgNS42LUszVkoqQEVBNjpILiJAVzQhPCAlKyAvWSwKK004RyhNLVcgRzMmWVI+Ryk+OlcpUz5WWUM4RUlBMzRdLzE0NTo8JlE7OldOIz83ITg2JklGKCFNSS41SVgKK006NiktNkZNQCkxTFY2JUk8OkZBKSszWUA2Vk1aPEZJUjxGLSkxNyVTMVRVQjhVRS0zVTk7PzdRVT1IKU8KK001RDU4OUQ1OzpWSUAvU0VQOzcpQjVDXVA6R0lLNUYhTDg1RUE8RkkkKTJNOTpXV14+V1VNOiYhJDZFQUMKK004RkVSQUdVLSgiVTs9NllaQEgpUzpFQFsvVTRNKzYlLTQoKUcpNTVXPCQ1OTYjUSk8J01PN0MoRS42KiIKK008JklGOEUhPjpURTo9Ni1CPkZZQz1TOFwsQ0YgPkYsVi1FSUY9VTRFL1gpTighTSlARyE4MjVJUjwlQEAKK00mU1xFJzYhWj1XKUs7VzVWPTY4VCpSVS86NDUkPkhJSSwkNVxAR01WIDcoITowI14pVDVQNSM9Sy9UXTwKK008SElbOEZJWkBYLVo6VkE5NlYlOTJUMFsvRilBM1YtUj5HTVc6RklXN0MoSzYyNSU8Jk07OCZFUjwlRF8KK00zV0FTPVZJSDUzOE0xJkVMO0ZJQjpHKUIuM1lMPkQwRy9WLS02JiVANjY5Uj0mWVo5RUBeLUQ1QTZGOU4KK005VEReN1VFSztVTSU4JSFVOkRRJTlGOUs8J0lSMjIgXzolTiJaJzVdOUVROzMjWFYzVkU5OUdVWjZCKDUKK00uNik/O0guJkBGTS0vU1E4JlJUXjE1RVo9UzhHOCYsUDJVXTk2Ry1VOkVJJSsyNE85R1VSOzZNLzhGKUAKK002Rk1QPVctPDpXNSQ3RDBSPEgpSCkxTE0sRklJNjRFTDxWOEUqNk1NMjIhJD04LVo3QkQ7JTE0ViBVSjUKK004Rk1aPTdJUjJUMSkyViU5NicmIjwjOF44VjlVIDYoITggI14tRUVJMjJVSjhGITk9ODYiOEUhRj1HVVwKK01AWCBWJlFAQC5WLUw1RDUkNkZNTzhEVUo9VylQMSNdPzozOFY3JklCOiZNQjpXPUg0Ni1VQSdJSzZVQFQKK00rNilaPkZdJTZGOTAuNiVTPFREOys0MFAzNk1SOkUlQjs3NVU3RiE4LlNdQDZEVUI4RDEtOjZNRjhFSUAKK004VF1LN0VBOjhGLVA9VzFSOCJEXzpUXU5HR0oiPEYtKS9UUF4sJi1COkZZTjNVIEAuU1hWM1dKIkFGTSUKK00sI11aL1AsVlMzPUo+RykkMjNEVjYmQTo4VylSPVZZOS9SVE04VllOOEYtOzolSUM8JklKPTZNLzZGQF4KK006N0E6O1dJNiYgWDgvJi1LOyYhOzpHPTgtRiFKLUEoRzhIOi1AQ1BAJzJEUi9EMF8vUzFLIFdKLzYjIUEKK002NEUpOjcpTT5GLUk6NEFGIDcsITYwI144Rk1XL0IhUDY0VFk6V1VaPEYgXjhWTTs6OCE7KjFAQDI2TVoKK006VURfMTZOITYyRFk3JylIL1NdOT1VRFYtRVklMzRETTEmUVI4Mk06QSgpTjhFSF8pVEFVPzc9OTxFRF4KK00qVlIjPzZAXjU1MEUzJylbPUYhOzZWSVU4RSFJNiVFQjhEXSwzNEU4OlcpRjpUVTY4RUlMOCVBOjMmLTsKK00xND1SOEJURzhGLTpfRk1VPygtSy9FQTYnM0UsPFgpTjZWJSk1RERJLUY9VUJHKSksQzlVO1RETSZRKF4KK007SClfNSFUXDM2KT48Rk1GPkdJUjskTFY4RllSMyQwVjo2ISQ6JloiPkUhOTIyVEc6OEFOPTgpSS0hQDsKK00yVk1OPERVJTMnKUg1Rl1XO0MwOylWOiVBNkU1N1VZJTNVWSUxJDE7O0dKIDhCNSw2RDUpPCcpMTpGKUoKK00+KCklMTAlUiA2TCBfR0lSP1REMjE3ISkrNFFSPkclUC1GRU8vQyE4PCYsQCk2QVo/NkxfLUMpOkBGXSQKK00tRF1POCRFKSlVXUwvIlRbMjU0TSYhVFk6VyBFKzZKIj1GTUM4IzklPEgpXTpISUMrMlVAPkgpTzMmJSkKK00mVyFaQFgtUjpWITk4RkEoNlYtSzxWKSk2JEUpNkZVWjxHKTo6NUksMyRVRjNUNTo3U1hHMyQwTTEmXVIKK002P1ksNlZWKjxENSk4IzhWLjZGIj5HPVM8JklANiU1OzlHVVs4M1heNCdRUDUiRDgpNiolPzZATS1EUTkKK004VlFXOyZdUT03SUI2JkFGOFYgXygkNUguNDU6QEgpJC9DUDgiNDFaPkdWIz5GJEUmI1lDPEcgXiwkMVIKK009VUkvOEdWIDdDOSU9VzVMOlghQjY1WT4uVEVIO1Y5Sz5HKSs4JDRNL0c+ITtGKTE2Rz4iOFVAITZAJVoKK00gL1ojPkg5UCwjRU86I10lOFdJRjhDXUg9ViRcLUVJQy4yVUJAR1VLLEFMRTYoKVo6JUE7PVctQjUyIFYKK004JERSKzYlVTUzUE0tVU1RN0M5ODpWTUY4VyFJOEZVXEBXLVI4IkRAL1cpWjpDOFYrMFk6PEZFVT5HKUoKK002NilSNlRVOzlHNUYuMzhWLCU5Uj03UVI0NyFCMjNYSTYlQSQ4VUk6OCZFPiozWTk6Vl9eOEcpUj5HKUgKK001RFU+NyMhJEA3VU48RzVSMzVNVzwmKVI9Nkk6MSNdRDknQUEsQjUtOzUtRzo0RUA3Jk08OlctUjxGWU4KK002RSFKNkRFQTdCNFY6JiElNidOIjojODsoIkxQOEZNWkBHSUMsQiBFLCYhSzlDOFY6JylGLjQxWj84IUkKK00zVUlCPEdKIjMzRUAyMjQ7MTcpUjlGWUY6VyElJlI1JD5YOVc4JUlLQEZBKSA0MCFAICNeP1ZNTkBWITsKK008RkktNiZJWjhEUTg6Vz1DOjZFUDYxVDsyNylWOjNQNSUzXVc+Rkk4MTYpUDZGRUYtRU02LyIgWTtVTSUKK00yNUFBPDZAXi1DITo6JUUvO1c9Rj5HSVI2Q1w4I0JFOjpGSTUmUTQ1MjYpLzhGSU07ND0sPEdJMDg3KVAKK007Q0RNKjFMWTxHKVo6VD1COFYpQDYkXUM2Ri1KN1ZNWEAlUF8tQyBZX0NdUkBHKUs2VERZOFZdKSs1RVoKK005RVlGOiM4WT04KUMzNl1INlZFQTEzXiA8QzhWPCYsRzImXSk6VylDNyYtPjtHKUs2REU5OFZFKzhGXSIKK00qM1k2LUQxWkEnKSQmVUE5KVNFLTlIKV08Ri0+MDIgXjZWIE0oRDEpL1I0VjpWWVI6U1A7KVY6I0BUREcKK002NERJI0I1RzxHKVA4Jk1YOUNMWzY2PiI/Ny1DNkgpQCkwJDsgNiAgWzYpSTdHSUk4SClSNUZJWj5GTSQKK004Vy1LMyYtVzpWJEkoJUFSPEZNOSxBTFY6R0lNODVBQTZUNTk8VUU7OiU0Wy8kVSQsIlReOFchSzdTXFYKK003RkE+LUQ9SzcnSVw8RixbI0BYOzYmSUo7M1BAMDYtSTMmKUI8Rz04MSYpOjElTiA9Nyk4LUNQTS9XLV0KK00+RylDNkVEIzhPWUg5RVEvOjZNQjlHNVc2VERSJEFNQD5GUUM4IzhFNlcpUDI0NiA6JFUwOCIgOzZIKUsKK00zVTksMzchVzYlSUs9U1hWOiYpKTYmISU4Vk1CNkVNOztHSVI6REReMyZFQDo3TUguUjxeKzJVUEJIKSkKK00oRFU5KTJVKTg3KVU8VylLODNdKTg2OFYrM1xfKjE0TThHSVs7UlQuI0MhQj5UREUyNVBSJTIhODo3KjAKK009Vi1DOlZFKTNWRUs9NzlcPCVdNSggJC4gMlQgX0VFTzdHKUI4V1VTMzVRUjxXKSk2Ryk/KVQxQzQ2ISQKK00yNk1OOlclLzEiRFY6V0lROEYtTjgzXTg5RkU+OlVJKzYmISktQiBAL1U5QzxFTUA6RiklKzRFSThHKVYKK009Vz1JLlJEVjgmLTo6VERWMjdNUjM0VTk+VzU8OjYsVitWLVZARzVDL1U1KTZHNVw5Rk1KMzVNQzI0UV8KK009VkElNiYtSjhGOVs8RkUkIj9YNS1FSUI3JUhcKzRFSzxHKUJARyEsNkYgSyRCVUM9VkFALUNZOzglQS0KK004Rl1LMzYhKDgmMSw4Jyk8OkZNQzdGOVo8VkkkKCNFQS42KVo8Ri0pLUIgODMoXio8JUUrODREXzM2LUgKK003JylaPEY9OzY2KUs2JE05NiM4SSo0NVI/NzxfKCIgTTEmTT4rMyE+MSJETzE1TTs+RylDOERFJTZGTUIKK004RjlbPiZOIjdCICElMCRAICstOTxGTVM7JU1IPVYgVio0NUs6JFFDN1FMOyxCVFYsRTogOEVZVzEiVEAKK00pNiFSO0ZFOjg2JTg2Vi1DPEdJQC1DRUk4M1wjKC9YUDZGIF87V0lLMSMxKTo2SVI9NylSQCcpOTgnPUYKK00xJUEpL1RFTz5ERF4zNylKNkZNSjEjTFk4SC1NOERdKTM2SUw9NVE/MSQxQDMjOEc2RVlQOjU5MDs3KUIKK008RylLN0IgOCxDWSU2RUheKzVBQzhGTVJAV0lBNkZBOSoxQFk7VVE4L1NdODZERF4xNilSOkYgXjVGIFkKK002SClKPFZRRjpUMUM7JiReJlNfKjYiNSw5JlVSOjREQCNCVVk9NzlRLjQ1UzwmKUI5VFVCO0cpTjwmUUMKK004VUlBNlZBUDdDIFY4RllSOiRNODY2QUw6JERNLENMXDI1TTszJjlVO1VBJS9FQVA3VDVAQCgpVjlVQCEKK00tICRSIC9ZKzI0MUo8JUk5PEcgSSYiNS08RU1MPCRESSkyRDUoJDVaOkZKIDgiTDgoJUlaPlchOzE0RSUKK002RyUoOkdJTysxTF42JExNKjJMRzY0MEI4SElSNiQxODglRUo6Vk1CQFdVQzxILVIyJEUlL1Q1Wj5URSQKK006JjlDOkVRQzE0REI2J0lGNjVFJTMmSUY6Vk04KzNFQjI0MFYrMVUtP1YpLTlIKUY8Nik6OENOSSYjTTgKK00sJDEpKzI1Pjo0XSw+WClaOkVJSzxEREArNl06LUNZODglQF8tQjRPMzVJLTg2LUk2RFAkPE0tPDpUVUMKK006ViE1LEM5Pis2ITs4RklMMjFALihFSS02VTQ9L1dJXDlFSU04JiE8OEchWD5WLT8yNiVBOEdNUjcjXSkKK00zNi1HOicpQzxHKUo4RTRAJTJVSDo2QTgvVylKMlVEXywmXUgvVFVbPzdVWjxAJT4gNDQgX0YkXyZTOTgKK004RUE5PVNMLiNCKUI4Rz4gOjVZNSowWEAyNkVDOkc5SS1CIFY6N04iPkZBOjIzXFk2Vi1BPVctNS0jRTgKK002MzhWNTM5KyxBKSQ/Vyk7OictSzZFSTs4U1lTPkYtRj5HNUM2RTkpKzdGKjpVSUI3Jk1LNkVNKS5RTTgKK009NyktMTNdODtGRUY8ViBeL0YhLTg3ISsoIjVCOiM4WT5XOiE6JSFBMSogVjI1QFkuUyg4KCRFOi4yPVAKK01CR1FCNicpWjozOFk6JUhNLUYtUDgzWSkuUCxFVSJVQTpHIVs6NFVCO0dNUjslSUo+Rk1AL1NdOTI2IUMKK006Vk1KMjFAKSxFWE0rMiApL1cpTTVDRUI4Vik8LjZFVz5GTTk1NkVQPCZJPD5GQSQuVE06OFdJRjdHSUoKK007RyBZI0I1QjtWQTkvVk1ALCRETSRALSlBRUVJOlc5Uj5QJVcgNiggX0VFJCghNE07RkU7OEVQRyNAWTYKK00zNj1KNCZNVzUxQEA2JiE6NkcpQysyNTU8RylVPkdNUDg2JSkxNklQPlhBTzglQUA3UzhNNyVJOCYgWEUKK004JEU4OldJWzpVSTg2JEVDOVZNTjlEXUc2Ri0pJTVFXEBHKTw4VilKOEYhKS9DMSk7RzktKVRFQjpWPUYKK00+RklCNkQ1JDM4IUs1IykkN1IoTThGViI8RihfNiwtOzomTUk2MlQ4LSNFOzVCKUBCOElPNkcqKD1GIToKK002VURSKzYlWjxERF4yMzA9I0FNKTMlSVpBNUhfN0gtWjxGKUs+RzVLMyQ1NTElQS04JylaOiVYUi9WQEUKK00gUEZaKEYpXzgjRT84RkFIMjVBRjxFXFAyNkVAOFZdMDtWXF8tJE06O1gtSDZXKUs8RkxbJiIhJDhWRS8KK003Ri04LCM4QCYiNDsoQ1lDOyZBLz0wJikgN0wgX0ZFNSggWEU8KDVQNlYhPi5RQE02Ni0tLCVBUDdBTDgKK00vJUVCOCc9KykyIFs4Vi1CPEdNSzdHKUksJilCPEgpWjxGOTo7MyhWOUYlOTEkMFwxIUxQOEZaIDxFSTYKK00yNFU7NkYpVTpGTSQxJihQIjMpLDknJTw4RVFSPEZNOClTOUM6Vlk2KTM5JDglITlAJllfPEQxNC5WTVcKK002ViVSOlQwVjI1TUs4Vyk/L1wtLT5HUVM4RUEkNiMhJDsiKFA7OClaOCYtXTlENUs+RUBNKCRFWjxGTTkKK00vQyguIjIhIilURU5BOElLPEdVWjlGKUw+RjlaPkYgUClVTTMnNFVaOCcpTkAmQEAgUTZaKCM5S0AmLUAKK00xNDVOPCQ1QDw1QFIyNi04Myc+KD5GTSQoIlRfOFdNQC41SUs+RlxcKjNZODE1QUQ4VyE6OCVBNCxDMEkKK00qMShQOFRQXjMwJiIgN1wgX0chOSlRQE05SC1XNkVNODgkJDUvRUUpNjYlQTolNFwxJFVKOEYgWTYjUFQKK00uNDU6PEctQjM3SiA2JF06NkVROztVXF82IlRHNkZNSDglQT43Q1BfOFcpWjxFQTgzVF04NlZBOTFXPUoKK002RiU1LSRNSzxGWUIuNDVSQkdVOSsyKUI6Rk1PN0RFKTYkUUI8RlVdPERRQzYkVUo2RVFaPUZFJSwlTS0KK00vRD1DL09YWTxHKUM8JilAOiRVNTojXSQ2Vik6NldOIjhTRUA+RUhWLURFUjtGSUk1IkwpJTI8TSU0RTsKK005SCFVQTdVUTlGOVs8RUVJQEc8XiglOSgpNEVKMiYtOz5HIFIsI1BbKlI1LT5WKTkvU1lGO1NZODwmQSQKK002NiFDOiY6I0BFSF4uMjRbNiYpOC1CVSU8Ry01KCNFTzEzXUo7R0ktOFchLy9DXF8uUkxNMjNOIixDUCEKK007QCVNIC9ZSDgkMSQvRkojQEZRQjhHKUwvJE04MSRVOzg1SU86RkU6OiZAViZURT4rMiBWNicpUDZTRUYKK01AVk1ANyZBJS9VQUg2NUEiLENdQz1UQFkzVyE+MTYtSztHISk2JUEpNiVBQDMzIT48RlFSPCQxOzxYKiMKK006IVQ7NkhWKjpDODgpVFUoOjYpOzY0MS07VjlbPzYoWzY0NFs2VU1DOUc1VTxWITk3QlQ7NiYrXjZXIS0KK00sJiFKOEVJLDsnKS0zJ0ktKVM5Sz02LSQ6JylCNiVFPDxHSUI2RjhcJiI8UCggWEktQ1ktNlhBWjhFUUsKK008RylPO0cpSzglQS82VkFCOkYpUDpGSTw7M1xfNiMoQDM4IUozNUktOlZEWy9WIVU2IzhQMzchKDxHTFYKK00oQzhFKzRFOjIzOE01NlIhO1QxKTxFRE0yNlIqMTQ1TTZDOSUzNFE+MSNdKUBEMFkgNlwhMiAjXjMjWSQKK006JUEtO0dJVzpWSVM9VkEtNlRFNTgkVSU4V0laOUY5SS1CRSk2JDBSLlVBVzhWJUg8R01OPEZJSjYkVToKK004RlFDOCNYXzY2STgrMyFQODNdOzxGTUszVUk4M1VBLTYmIF4yJUkoPEdJNjYmOV1BJVwyI0M5XURISTkKK00pMkRfMTRVJDY1SFAvVDRXOlgtRzE2RF8vVilLOUVZPDQ3KVIzNUBbJEQxWl9GOUIvQ10kOCYhLDE2LVIKK00zIkVaODMoVzI2LS8yVyFLOEZJSzpGXVo6RF1IMjFAOCghQDUoIzkkJlJVWz5FRTo8JF1GPyc1OS9WKVsKK002JFVTNkVJSjxIMVo2Rkk1L0VIXCZTIVI6RklHMyVJQy9CNFk9VyBeKzQxQzhYIiM1MkRNLEIoWTYjXEUKK00mU0VLQCYpQj4nSUcrMjUpQTVcWThEREkyNU0nOEY5NTY4KTkzUCVQIDVAIF9GISkuNi1XMjMoXzpXKUYKK003RllXMiRVOS9GJSkyNiVOQEchOjYzXUE/NEUrN0NdSD1WKUA5RyojPkc6IDxWIUA3VFFGPEchPzY2JUoKK005RDBfOFYhJTg3QVE6VkU7ODRFOTVFRUM6NURfKVVBQjVDRTtASClYMDFAUjpYOio9VUBfNjYpQCszXUEKK00yM0xCKEU5VTlTXUIuM0U2PVZJTDo0NTo6RUxfJlBYTTxPWVI2RDFANjY5QDJTOSQ8Rl0pPkZJJTI0RTkKK00tQyE8OkYtUjpVSUo+Rk1DOzVEXCxEMSQtIzEpNyEoQDpHPSg4R1U6OEdJUjojWSE5Q1kkP1ZAXzM1RU0KK01ASClPNyRFODEyIEk4JUlGO1YhSTolMFAsRUlCNTVBQTglWiJCNyheKTNQSS1FQSQlMFg1MjRUTTEnSVoKK005UlQ1KVZJSzZGXUEpMzlAOCVFOjM0RiIzNEwhOkAlVyAvWVI2I106PkZcSSUyVTk2I0RfPUU4XjYiVFYKK00tRF1MOkdJWjszXEk4R10tL1ZEXjEnKUIzNU1OQFcpQz5IIUczNDBJMyctWjpWIUE2VkVDOiYtPi9VQU8KK006Ri1DNjVAXjI0NTgzNyFQNlVFSDY1QEUuNlVdQScgVjJWLU5AR0lSM1RRQjYiPTg8SCFPMjNdRjpGSUMKK005Q1g9KTZNSzxXPS0zJk1LNiJEOCk2K143JiktNjYtUTsnIS0tRUoiQFdVSzIzXFYyM0RJLjYpQzxXLUsKK006R0lGOEchQzY2IUo7VkU/OkU4Lik1XVIyVD1SOFYtSjs3LVc2VUA7Kzc9WjhFST84RlIsPkVJODdERTUKK00yNi1QO1ZNQjwnIUA1NUVGMSYhSjxFTSw+SSoqO1NQXzEjXSkuUUAuI0E0NSNDOVo+RikkLSQxSDY1QUMKK008NEReM1ZFNjZGXThARDUpIDQ8ITtAI146VkVIOkZVWjUiPEArNUkzL0YpLTE1NE0lMShNMyVJUjxWXFYKK00qNilJKzMhUTYiVSkvQzE/OUcpOzI1JU09VixfKTNFTD5HSUs4JiE/O1chPzg0NTo7RklANiREXzM1RF8KK00yJEVAPlY9UDtWOUcxM0VIOzdJUjE0NS04RylVPkcpOjslQEkxNloqQEc1SzpHNUZARzU8KzFMUDQ3SVMKK00zM0VLPEYpPixDKThIUz05MTNFODZWIVI8U1xHOEhJXTtFTS8xI10kLlM9QTtGUVI7NllSOERVODI0NVIKK00gWCs6OlcpTSZTXSw4RkRZNiNFLzgmKVVAVy0+IjFBJTtHPUM4VkEvPkctJTMlQSk1RiE5PEcpPzY3KVIKK004RU1JOiM5Pz5IKUkzN0oyREdJOzE1QTg4I1xULjIgLiIwWFZASClKMjRNUUBVRTg4VklPO1RBQS4zRVgKK008JDUlIDZAITYwI10uNj4pQkdVWzwmOFYtRU1LMTZBQjZGIFYqUkxUKzNZNjhGIFwyNiFAKTI1QjlCVEcKK00xJF1GPkghUjgkVUI8RyE5LyRNQjs3TVI6RU1BOEYpSTY0VTo6Vz1MOCVZKThWRUEvQzklNiVJSjhEUTgKK006NFVJOEVFQjlGISk2JFU7PlgpOjpGQSk1RyopPic1TjxHSUQ8RjlJODUwVjdWXToyNUFDPUc1UjokMCMKK002T1k1MTQwOys1SVI4MihZPkdRTj1XIUM1MlRFKCNZTzZGIUY6VylIMjJUNSglRiI+R1VSOScoRSszXTgKK004RERbKTI0WzElTiI7RVxZKjJVJDVGIUI6VilXPEQxKS9UTUM6JU1APEVFOjxFSSkvRiU5LERVVUE3KT4KK007SEomPTYhOzYlQVA2RUlYNTIgNSNCRVA+Ri0lMjcqJjojIFI4JjlaOlY8SSk0UT8pUiAhPVAlJCAvWDsKK00uN0olPydVWj1VQUE7JkhfOEZdMDhUNSk2JUxWMjREVy9TOFYzVkU1LUVBLSsyNSk6NllWQjgpUDMkVUMKK006JEReMzZFSj1XKUMzVz1LMTYtQC4zITo+RyFTPDYlSTxHKTsvVUEsLjRVJS1DOUA4JklLMjNFPDglRUAKK00vQ0VTPFNdQjhDIFk8SDVcPEYpTEBHNVU8Vl1CMjRFSjwkRF4zNVFSPkdNVzomOkw6RUVBNiJUMigjOSkKK004VDBQOEZVUj5GWVA4IzA1LERFODM0RTk7Ryk6NiE0KSIyPTo2Njk6L1VdRi9DOCM2TSRZNkcpSjYiPTkKK004NkFLOFZNLTI0MUs4RUkpOCNcXy1ERUs6I1hfPCZJQjtWQT4tQzhcKjM5Oz02WUM5J1YiPEZNSzo0NUsKK007NylSPDVFISwiVUA5RU0pNlc9XT1URFY2VilVOlZRODVEVTgrMiAhNyAkViAvWDspNUlVPSZZRj5GUUsKK008RkkkLVc9UjhWLUs7VUE4OCVAViszOE0rNFVJNjYkVis1NUE6RikwPkg1WzVDWTk2JEU1ODYpOTpHXUMKK00zOCVXMzYlQy1BQEc1RFVSPEUlVz83OTs2Nk1QMzNFKTIzRFAxJUlLNkNFQjolSUM3U11ANkM5UDYiNEUKK00zNzVVOzZBRz02VU0/N0k5LEZFWjpDOFY3VilHNjc9SjlHS146RU1IOCJUQCoyIFY4I1hFL0RRUz82WVIKK004Iyg1L0YgXjI1QSk6VkklNSE0LiUyIF42Nj1CNUQ1VTxURTg6JiktMzc1UzZTIFkzNkooPkcpOjhXLUkKK004NERWPVVNOC1DRUs3UVRFOEZZSjlGTVc3QzkkLyI1LDpEPTo6RlVCN0cpUjokVUs9Nz1DPCchODdFXUAKK00zNUxeM1dJXTxHITg2VlFaPEY5UjxGRTpARTRSIEU0IF9DTFYyNkFKOlYtUzpWMVU7U1g9N1cpQzpHLVsKK002RUlSOlRERSozKDstRUBfM1MoVjZYJV86VUlGQFghLS1ERTgvVFVAODM4UjpFTFJAN0ksN1ZdNSoxTE0KK00uNVFCMzcqJT01STs6VllIKzRFSDozXF8rNDU5MTYpUjpWLUo4JVxeJzZBQC1DOF42NiknOFc9RjpWWVUKK008RSBLOFdFRysyPTk6RV0lOlYpOjxPWUs6VkFCNiNZKS1ERUM2REReKzYtWzs3IS0qMiEpOSNYXzdFSUMKK003JTlAL1MpMDdGIUM4RklXMzZNWjhFRUs6Ri1DO0c1UjglOSw4RklOPTNFLEBGJTguNUFSPEchOSs2KUAKK00qMzlKOkYlSThHKTgsJU1ILUQxOjEkMTk2U1hUOlZJQDhXTVE4RUlMPCRROjhWIUA2U004PTdNQDxGLSUKK002SCVSNDRRTT5WTiI2IUwhLUAlNSAvWSUyMzhZNlVFQz1WKUI8RklALUM5JDMlSUI8Ri1LPTcpTzUzKEkKK00oI1FGMTM4RS1DXUhAKClCNkdKIjVBVFA3JiEpLjVFNS9VQTUrN0laMSRVVzwlWEArNjFCNURFRkBHNToKK002Ry1SNkJUXzpXKVU5QjRSNiVdSjtHKUs5RylIL0FNQzhUNS0zNDBZKTMhOC1WKU46RllINkYpRDgzOE0KK00zNUkkMzYtTDZVT144RklKOFZNQDI0RTg6Rk1KNUI0WTpWLUs2VDBWNUZdPDI2JUM6Rik6OlchLDI2XTwKK004VUlBPERFOz1WXTo4Rk1CNkZNSzpGVVI4RiktNycpTjgnNSUtRDU7OEghTjxVQTgyM1EpNkRUUDYlOUMKK002IlUpOkchQzomQUA2NUBeLCVNQzNWLV04JDUtOEZNQjI0RF82RkksNkZVWThWKUAuNUVbOlNESTE3KV8KK01ARjhSIDM4IS9AI146NylGMSM4RSk0VUw4VEUpPCY8Xi9WJTgxJFUvOlctQjtHPSw4NkxQLjYlOC9UJEAKK00pM1lAO1ZFLTY0REkoJiFKOlZJQjQ3SVQ4VkFSOjNdKT5IITktRDEpL1I0TThHViU6U0UsOjM4OzdHSVIKK006VFRNMSNZOjhFSVFASClSNCNYTTxIKio+RjlJN1MwQCxDKSk2RF0tOUgqIj1WQFYnNTlALEJVOjxHKFAKK01fRDU6OFVJQjhGIF4tRDVaQkcpOS41IUI2NU0tMlNdJDhHITw4VU08OERdTjxERF8vQ105PEZdOzYlTUIKK006RiEpKzJFODYkMSQ/OClDMTQ1QD1HTUIpMlVINjVJQjE2OVo7ViErMzYhOS1FTUM2RiFANiZKKDxUUUIKK01ASClaOjNMUDYmPVI9NkUpLUMhQDomQTUrMl1ANlQ1OzpWRUI2Vi1SPkcpQC8jUS85WClSOkAlTiA2RCAKK01fRjlXPVZNJCghQEkzVV0kNiddUDUzWTgyMyEpMlNFQjxHKUMqM11PMjI9LTYjXTUsQzEkL0VJUDhGQTYKK00sQiE4OUdJTTpWLVI9VilQOEVcVis2SiI6REUpNjJULiRFOU4/N0ksL1NcRSZVQiI9NFUpKTM4TTI0VF4KK002NloiPlREOyZVSU1CR1VSPEc9SS9SVE0xNSE/LjYqIkE3VVIvUkRfOFYlOzpWSU44KTUrNiZJQztWSUIKK00vUyhFNjc1WjxFQTY4Rik7MTRUIzgrJUI4Rk0vNicpQjpGWS01RERFLCZBWjtXKUs2NklKMzIgQDcmJS0KK002VzYlOCM4RzZHNVI2MUxJNURFSTgkRUI7Rk1IIFYuVDpURS04RV0vMjRVUkInIFAuNy1aQEgtSS1DRUYKK01ARzVXMjJUUjYkVS04JUBeLjRVJTpGSTYxJUlKP1ZVVTpGJS02JUk7OEAlUCA2LCBfRklSPkc9OzEiID0KK00rNTk6OlddVjo1TUExMyklN0MoVj1XXTkqMjU4OURFODZUNUYxJEVIMzUhTDtWWUAxIlU4MzZJLDY3TVcKK00+RSFXO0ZJJC1GLiA5RkE4NjNQUCk2LV1BOEVKMlM4QCgjOVI6QyEtNTNMWzglTTkyVDUxPkVANSUzRUsKK00+Rjk6MyYpWzpTWFwvU0RNLCYqIkE3JVI4VTRfL0Y+Ij82STk6LlVAMzZJRj03SUs4JEU1OCVFOT5GSUgKK004VyFALUJVQjxHNUY4RylIMjZZUjpWSUI4Mzg1JTQxUjtHNVo2RilXQCI0QDhWUUY2NzYqNjYgVjMmWUsKK006M10+OiRVUD03IVs2VilIMSYpSjpWRUI6JiE4L1NFPD5HKUAyViFCPkgtSy9SNF89NylZOiNYTTYjXE0KK00vVU0pIFJWMDhIIE0pVV1AMzReIDxFTS06Vz1BLjAlSCA2XCBfRilVPkdJSjgzMDgoIzktOlghUjo2LUwKK00yMjRNL1MoUDpISU8uUiBQNkZFXTozRUo7VkVQNiRdOjZIKUsyM1E2MTVAVi9GWVI6VUlLPkdJSThXKVsKK006JiBeLjZBTTJYIipBJ1FSOFU5NDU0TUo4U1xeNkRdJDgmKVI6VURPNjU4UiwiPUo9NVEkKzMhUDhDWUAKK009MzgpJTNFW0E2WUIzNERbJzNdVUBHPTo4X1k2LVYpVTtGWUY7VV0tOFZRLzU2SU82Ri1CLUFNJDpGVUsKK002NjlRNUchSzokXUo8I0wuI0I1KTE2PVczJEVGQUJUXDhWTU8xJkomOzZJSDhWKSg7VDU4PSYhUkA2XVUKK006JUlHKzNFOjpXISQzNFUpOCYhLDpVRVI/Jj0tOlZNRDo1SF8zJjlVPTZJODZVQSs2NkFBMSI0Mi42SF8KK00oI0UkJlI9TzxDRFA3WC4iPCNcIS9QJTsgL1k6PEdJWjxHKTUoIiA7KzU5SzVDXSs4VUkpL0MhOzxGSVAKK00zNUhUKTJVKTtHIFYxJlVPOCNFKTVEMVI6VURUMzRVOC9DXUg4RUhZN1ZNVT83SVw9VkFAL1M5OjpWJUYKK00/NllGOkVJSzpHKVo/Nl0sN0U5QDI0US8/OC1XN0U5OC1VQSk4R0lXNkNdNThTIDsuNkk8KCFMXzxILVUKK005UzhFLlUxKTpHNVI4ViImMTRFOj03NVogVytXMSVBUDoyKFk4VEU5OlVIWzYlRUo/VilKPEU5OzpHISUKK00xNk1HKjFUWy5SNF83UjxWOkdIVjUmTUM2Mz0sNlVNUj1IMUovVihfKzRRUj04KU86VklLPEUwTS9GQVgKK00yM0RNKTRFSDZHIUI7OEFaOFZNOi9XKVo6MzhfMzcqIztWJUA2ViVDO1YgXCgiVFI4RDBZLyJMTTZXPE0KK00mIyFSPTVYISwgJSkgL1k5PTcpQjZGWU4xI1BSKlQ1ODM0VUA6Vk1KNUJUXzpWLUs4VkBeLjIgRTM3PSkKK00sJV1CL0JUXjgkRTo4I1xUMzYlOzEzXUA2I0RSMjVJRj84KiVAJiksOichSThGQFkyNDEkMyQxTzpFUU4KK009NykoOicpTzolQSQ6N0FVOEVJQTIkNVtASDlaNlRdOzwjTEUqMylUN0FMUDY2VVU9VEQ7LUYhJzhGTS8KK005VEc4LCZFSzlHKVo/N1VGODVNUj5SNSEyMVRZOzZNSDNUMS8+R0lZPkZJNjpHTUksJU1SMjJUWTIzKEAKK00yMyg7ODZdOjVGSUozNEUlKVRRVz84OVs2VUk4LlNFSj04LVo5RUlLPkY8Vis1XVg2Q1hAJTJVPzVEVUAKK004QDFSSSYkWTZXKUoyMyhCMidJSzhGTUIyJUlSPVVNLy9TRUA4I10vN0M5P0AmWSQtRi1SPCAkTSA0NCAKK01fRilVOlYlODNWLUA1RiRULURVKS9EXUtAJ1VDLUMhQzpWLUM8RFRSJlFAXjpFQTY6JihbJlNdSDglQT4KK00tQlRUOFchODI0XF4pNDEkOiYtVT03PVs6VUlLPkZJQjhDREIrNEUlLUZBPzZVSTo6VFU7OkRdSjpUUUoKK00/NzVMOEYtOi41WVQ/NzVMOFVNQzYjOE0tRkFSNjJNODZGOVo8RF1IOkRRJDZEMTo2L1hNMzZJSjkmQVUKK01CRVFDOUcqIjE0QTgqMik4OkZBOC40VVo/JzVdQEVNO0BIQT82Ni1COCU5QztCNF4vIUxZOkchQjZWSTsKK002ViBWLjcqIkBHKTs4Vi1GNiZFOzo1RTYvVi1aPVVEXzgnPUErMjw1LEY4XywkRFkpU1lPPkchKTYlSUoKK004M1xJLUY5QjpWTUkzNU1SPkZJSjomLUM2QihQMSMhLT5HSUAuNUYiOlcgIS0gJF8gL1lJP1cpSzpWRUIKK00xNFVSN0JEWTgyVE0uN0oqPEVEWTQmKTo4V0lXMSJEOzI2QT86SC1KMjNRQDxGSVE4M1xcLjVJSzpWUUgKK00yMyhSNTZFUj1VSTs8RyFLOzdJSzY1SSkmUU08OVVBSTZGQUgxJSFKOEYpJTM1SFk3KElSO0cpUzhDXSUKK00xVF1SPEZFPjQkVFkqNUE2PEcpKTYlRTs8WDFXPkdJSDElQTwrVz9eOEVdQjpWKTM+SDk6L1YpWj01OFAKK00vQkQ4Mjc1Oi9DRSU+R00oNCdNQjZHNiI8Ri0vODYpODpHKFYyJDBbL0VGITxFIUI6JiFJNiMhSj03SVsKK000JSFDOiZNSzpGSSQyNEU4OVghODI0MUI2IUxJJiI1RC9DWTgvIUA7OCdJWjwmQTo4RkUrOUYhPjZGJUAKK006JkFSPldJUjxHJiA6VEQ4JiFMOy43KUIuMyBZQEVdUCA1QCEyMCMjOUdJSzY3Jig9VUk7OkchPjJWQFsKK00qMjU5PTdJUjYlOUI4RU1LQkZAWys0RUA4JjlaOkRROzwnSU5ANy0pL1NdKTglQFAyM1xNLUVBST1YIS0KK00xJUVCOjUhUjtQLSlfQlRFKzRVSztVSS04ViEtOkchQzY1RSkoRD4iOzZZVTlGSSQvRTk6OEc1XTxGQS0KK00uMjxeLjRRSDYmKUgzJVojPkdKIjxEPTYyMU1SPTYpOTdGTTw5RzVTNUQ1Sz82SSU1IjQuLUcpVy4yNFAKK006V10pLCYpQzxHNVo8RkktMzQ1KThWLFY2RkFJOjReIz80UTo6Vi1CPCYhSjhHKV05RUlIMyVNQjlGWSQKK00tSjk4OCQxSDNVRTk2RERJKCFASTVDOUk6RERAKzY9VT5GWUM6NiVALUYhSjgkUSkvREU5OkAtWkQ2VVIKK01BOClDLEFULiYjXUs4RDBeLjNFPyA2KCE2UCNeOVZNQjMmOiJARzVSPEY5RjhGTUAyNTVANjVFWjpGQUMKK006ViE4PkZcWSxDOSk3Vz1SOCRRSjxWWUY6NylBLUNQWTM1OE0sQlRWNjY4VjQoKVAzMyBQOCQ1KDokVS0KK002I0xJKTM5STxFSTo4ViE4NkZJQjZGRUkqMj1DPkdVVjhFWTgqNTlLNlY5XT82WUIzJE05N0U4Xy42TiIKK002U11COFVNSzxGKUAyMjU6X0ZJSjZFQU49NUk5OiYpKTZYKVI6RkEvJTEpOj5FXFImU0VCL0JVODpGVVoKK009NjlVPERFJTo3ITstRDFSOzc9NkBHUFkyNUk/MVctSzokMUI+RllMOEYhLTZEVUMvUjRZODRdOzomTUgKK00xM11GOlM4VjYjOUA4VERNMTcpWkBGPSk4VklDL0QxTzMyVSk3IzhQMTZZVTtFRU4+KElTNyJEOCglOVcKK004RkFCNlgpOTYgJS0gNUwgX0ZNUjg1RT47R1VVO0g1WzlFWUY7VV0tOFZFLzVGSU84Ji1ANlgpUjEzOEUKK00uNTlKOlVdLTpGTUM7VUE5OiRFJC1FQTgtQiA7JlU5PykyVUs8RyE1KzQ1OTM2TUg2JiElKTE0RTg3IToKK002Jk05NjRdSjhVQUo8VERCLjZOJUBWXTk2IzheNCZFOztILUI2MzhZOzcpSChCNUNCRzU5L0QwXiwmSVoKK00+Ryk4Oi9ZSjhWOVM+V0k7MzVBLS42Lic5RVEvOzJUNS42KTE3IjRSL0I0NTEmKTE+R0lCOyZJLDI3IVAKK006RDBSOEZZVzdXViUuMjRCL0NFQjg2LSkyJk1DN0QxSTg0REs4ViE1MjYlOzZWLT46MzhJOEghSC9DXSkKK001NDReNSZBUjs3KTYvJilSPkZAWThDXDsrNUEkLUMhOjw2KSw4JlopQCZVMC1CRF86Ji1DOiRWIjVFSCEKK00tQCUoIChVJDpGRTg2NilaOlVRXT5GKUogVyteMSVNSzhTOFk4VFU6OEJFUkAmST8uUyEpNkVJLTonIUsKK007Vk04MychSTYmJUw4I0xAJTIgVjUzUSQ2NFU7PVY5KTY1TUM6VUFGMjFALiU0RTk4NyVYNkNFUjxFSUMKK00+R1VBJlFNLD03NUo2M0RbKjI9LDZEPVI4Q0Q7JlRFQTIgWDIxOCldPENYTSkyNS09OElVOkZdUjhWKVUKK00/OD1TOCRETSUzRVo4RkFCXCYpQDBERS0zVkUpL0NQSSgjOUgxNyoiQEc1SDI0RUs6RklJLUQxUkFHKU0KK01CRFAyIjE0TTo2STs2QlRFLENZJThHKVI6NUlPOlVJSjpXKUs2VihWLSYlWkAmSUM4JEBNKzVBWj5HKUMKK00tQkU4O0g2IzZGIS0vIlRNLUM5JDhWLUo2RUlDPkdRVzolUSk3RUlAOEZNKSwjWCEuUCRNIC9YOy9GPU8KK002RU1GO1YpTTtGKUI/N1VGODYhSztTOF8yMkRZNkMhOzxHKVc7QzhQMlM4VjhGSUI8RyBeLCVdVTQ2TU4KK004RDA4KTNQTS1GWUAxIjRZOlZBLTg1TSQxNDVKL1I0Syo0MFAuNk4gMVI+ITpEUUI7OClJKlI1LTxGSUIKK00zMzhJMSQwTS9EVUk2VERJKCM8Vi9BTDgxNzlNPUNYOykzUSQzN1VaNjZLXj5XOU48RilNQFcpSDIzOF8KK002QylIQEZNSzxGUTs4Vz1QOiQwVjUjWUoyNUVcQkc1QDE0RUE4VjlJLEIpQj83NVVBNyhcJiBYQjomWUIKK004I0wyKlVBNTEmSV0+Ri1KPEVJSzsnTVo4VFU1MjZFVz5XKVI8I1g7JiRFWj9WWT8pMUBFMVgqIjpGQSUKK00yMlRNLUNdQT1WOUI2VkVAOkdJXTxFQFk2RiRfOFcpOUBCVEUgNTQhLEAjXighTFk8Rz07OEdJUjxGVUkKK006NzYiOEYtRjxHSSkyJUBNKzQ0RS9EUUY+SC1AKzQxKy8lIVAzJilIKjE0Tzo1SUI6Vk0kKCQxTi5RTVAKK007VDBNL0ZFQzMlXTgyMzheOEVBNS1DOUYrMTReOEFULjtWMTs2NSVOMzM5KTxHNVo6RUBcKCYlSzYjOUAKK009VkVAN0RNJC1ERFcuVUlNOEYoTSNCNE0rMVVCPjQxO19HVUY3R0lGNjYpRjpWRTg2JDQ7MjcpUj5ILVIKK002RFVOPkc1PC41STk0JERPOVghOi41QUk4NyFLNiJUTTZHKUo9NzVdPSMoLiYkRUo6Rz1IKCFNKTomKVEKK009NllCOkZJJTgmSiJARiheNiVFSzxGTUs+SCk4JiE0UjdHPUIxMyAuJTJVUT03SVAzNiBfKzNdODo3NV0KK008Rj1XNyRRWjtHKT8tQyEpJzNFTzM4KE0tQCUtIDQwIFRSVDgmVFVKNkZFWjpGKUo7JilIMjM4VjI2RUMKK004RylPMjNFJS1DTEk4KCojPCM8VjI1NTY6VkFCOiIgQC5VRTk2RilILEFAUjhVNEU6Rl0pL0RVSzokXTgKK004JEU4MjQwWTdTKDs2REQ7LENcTSo1STAgVyteOlNEQi9XTVw9NkksLSIhST5GSF8yN0laO1YpQTI0TUkKK00uNEVKPkZZQCoxVFQvIyhJN1YoTTdWUTo4R0laOUZZPjhWITgxNllALUMpOD1WTUozNFVLOzc1SzM2IUoKK003VUBNMjcpPys0VVA4VjlYMjMoXzhWLUs6RklSOzVcUigjOS04R1FXKTBYOy1GKVk8Rk1GOiZcVi1FRVUKK01ARikpMjVBQDhUVTk6VylCSkQ0VC1EUUI6NFBUJiNRQDxHKVo8RilALUFMVjI1SUI5R0lLPCNYUDhFSTwKK006ViBfLlI0XjhERE0sICU7IDY4IF9FNE0tRVk4MTYpWjokVUI8RklXMzI0QC1GITA2RyooO1VBKS9TXEUKK00yN0oiOkNcVi40MUM8J0lSOiRdKTdFSTk6JylJLyIgQDI0MSk9VyEtL1RVSjpVRSk2JDEtNlRQVjIzWE0KK00uNkBbLjRFOTglQSQ8R1IhPkU0Uis2TVU9NyktKEE1LTtGQF4rVk4iPERRKSlURVcsIzklPkg5SzIzKSUKK006NVkpOCNERTteJUo2NUlaQFUhLTglTS07RVk6MzM4TTZXXUI6VFE4OlYpQzpGOUs6VklDNTM5LDYjWSUKK008Rkk8PlVAXzE2RTozNilKOUY5SjVDOFYvVilSO1M4QCYhNTY8RlVKOkdKJjZDXUI+RzU2LCNYUio0RUoKK003VEUlNiYlQTY0RS06JlhbJlRFQiBXKjw5RVFHLlIgNSkzRSUxJVFKPEVFNTZVQSw3Jk1JNiJVPDolQTQKK00tQCUlIDZcIF9FXSk2VllJODZBUjZENUo+RylfPiNQNS0mJT4tQylKQEYpKSs0RUk2JlojPkchQS9DTUAKK000Ni1DMzYpSz1WSTY2RyFXOiQwTSsyIF5AR0lQOFYtUzpVTSkyU1xeOEZJVzhFQFktRUE4KzQ1SjhFRSsKK007SC1dPzRQVjU2SVE+R0lCLCNFNjQlRFYlM1laQEZITSgiVUExIzg1LEdJSy40RFAsJDFIOiM4Oy4/WToKK002JDE6PkYsWTI2QSU3R01aPDNcOy1HSUM7RUktMyRVQDpVUVI8RilCLjIgUikxQE05RFBUOEZJQC1VSTwKK00tRUlDOUcpRjY0NSk2JUlKO1VBJC5TKUM8RylGPDY5VTxVOSU6V1VKMTUwTSgjOVI9VEReMjYpQDYzXFYKK002Rk0+L1NdJDZGLUI3VFVIOUQwQCgjOSkzVUVCOERVQzolRSw2RklSNiMhOzMzRiIyM1ghKzAlNiAvWTkKK002JDUtOEdJWz1TWD0yN0lGPkghJCUxTSQ8I0wyLjddVy1BKEc4RilMQFdJUjwlQUE/NiU2L1JFLzpXTigKK007NEU7PEZNQjg0MEkrNylaQEcpRj84KUgvU1xWL1YhOjxGSUg6JU07NUFURTZFSSU4JklRPTdVQiwlOUwKK00+RzlWPERFQjokVFcyMzhZOUg2IzglNSU2NklILEJFLTdTISQ5Q1hNNkZZQCxCRzYvVUEpNkcpQS40RU8KK002M106PkgpTSgkQVM5RzlLMjM4Qi43IUY+SC1KOzNYUixBNC4kRDFGMTRRUjtUNSk7Q1xNL0cpWjxGLT8KK00yMzkrOEYpNik1SUo6RUk4O0c1OjY2QUIyNU4iPEZJSDNSIEU1RzVPOjU4IzI6PF82Nk1IMSNZKTomIF8KK00qMUxWOlZNOC9SRFY1RUEnPCZdODYmOUs7VkE+OlZAVjM0RFkuU1whNTAlLyAvWUA6VURUMSZdWj5ERFsKK00tRFFLOyZNOSxDKUM+RTRAKTYpVy9SISQyJFVDPkdJQjhFQF86RylBNTJMRTE2OiI+Vz0/NyZNQzwmRF8KK00rNilaQEdJRj1ISVcyMzBNL1YpQjpWKUo6RilROiIoNSxCVF46RikkOFctQy9UMS08RllaPFYtVT02SF4KK00yMlReOlg6KTxGKTU2JilTOCNQXjglSUg+RkE2NkctSzZCV0gtRiFCMSVNOi9EVVI4Q1xWOldJSykyNToKK007VylSO1VYTSs0RSc7N0FOP1YgUDEkJDgjQlVINURFTTxGQSk4RyE0L1Y5PDs4IUs4I10pPkdJUjYmQUoKK004VjlTPUc1RjM1QS0uNi4nOUVRMDdTOEUvRjFGOlYpPDJVOFkzN0VSMjJVJD5WJFYmUUBNOCZAIzI5NFkKK00vVUUtNkc9UC41SVI+Vz1IN0chQDVFSTUpU1whPTAlOyAvWS86RlE+MjYlPDxFIUkyMkU7PCNcXy9EXVoKK00+RURbLERdUjs0NUg4JDUvPEdJLDFWIFk2Rik/OkYgQCkzRVc/N0lKMVVFQjlGTSkqNFVNPzdJUj5HVVsKK006MzBUMTYpRztWSUI7Rl1VPkVcWy8iNSU8RUUkOjYlLzYmITs6Vjk8OFZZVUBHSTgrMShJOidWJUBGKSkKK00xNlFLNlUwWTMzXUI9NikwOidJSzoyNyspNUFLLjNdLTE1TVo4VExfOFc1QTAzMF4zNVE5O1VRJS9VOTkKK009VllCOzcgUDI2OEkmIlUsOiVFOjpWLS02NklQMyYpMDcnSVU2Q0U2PThJVTpGXVI4VilOPEdJSzgkRE0KK00lM0VaIFYqUjZERFsvVkEvOlctSzhVQFYxJk1JMTFMTTg1QTUvIzEpO1YgWzVGQUAxNUU5NkZNUClUUU4KK00/OClKN0ZNSzhGISspMjwhQDAlSSAvWTYxJk1MOFZNSTolTUM4I1k5PCJUOys0NVc8RUk2L1M5OTpVTUgKK006JUU4OkdJRjE0UF4yM10kPCglPCkyPUI8RVFCOCNFMDwmRF8pNEVIPEc5TjxHSVo8RUBWMjYpSjpWWUYKK005RyoqQygpQzojXTpARk02OFRMXzNXPU46RiBWMjZJXUE4NVAqMFhAMyZJVUQnPSQpNklCMSZFODgiXFkKK00yIyBHMzc9PDgzR14mUzk2LjQ1JDM2QUozNDFBO1cpOjVHIT8vRiksOEYpODE0QUtAVyFCOUcpLDM2XSsKK00tREFTOUQ1QjwkNFk3VUVINkZJTzs2VVo6IyEpOlZMWSs2Tig7VFU4NlVBKzY2RT4tQjU2PEVZJTI0MFsKK00uVi0rOFdJVjxGTUA2Jk1QOUMwSSkyPTg6NEVDPkZEQDg2UUkxNTRfM1YpSy9UXTw8SElbOEZJVzsmLSQKK01AQUw7IDZMITpAI145I0UtPDVJQkE3PU86Ryk6OEc8WyYiNSk7Vkk6NjVZJDE0VUAyJUEpMSYpTTtWIF8KK00vIyhAKTYhVT1VOSI1RUklMzZAWS42KTovIUBSMlZFTzpWSU49N0FCLUM5ODgmLU48RVFKPzg2IjxFSUgKK000VzVWPCNYQigiXUo8RkkkKzU1UjwnSiM/VVhALlZFOi9XSi8zIUxFMjM5LDhHKUo5JURFJTI1LTYkMTgKK01fRTBZKzI1NixENVA6U1hWOEdJWzgkRVs9ViVSO1YpMDZURF86R1FVOlYpUjtGKUs7JVhFNkZdOzZWTTgKK00uNTlAOlZNUjxHJUI6Ryk5KzcpTDYzWUc/N0lMNkRFJS1DXUs6Mzg4KEYpRi9VNUA4JiU4MlZNUjs3TiMKK008RUVCPldNRjYhQDgrNF1BPCdZUCxFTUo7VFUpMSQ1PzpGKUA2NzYlQEYpMDpGKUI4OChSKTAlOCA2QCAKK01fRk0pLjZNRzgoJU44RklSOlUhSzYjKE04VklDMzRVTztVTUE6VUktL1NFOjhWKUAvUzhSJEMpNjNXKVIKK006Rk05L1YlSzYzRSktQ0xSLUQ1QzhWSUY5RzVXOiM4VjNURTs7WCktL1cpUjlHKF83JjlCPEgoXiYhQE0KK002Vkk4KzIpOD9WWUo7N0lXLUM5QDoiXS1ARzxcKjRFKSwjXUxCOC1YNjRcXzElTTg0L1lLNlM5JDYjTSQKK004Rl0kLURRUjxGQTg4RjlPOkgpVjgmISUvRk1aPSZVOzpHKVo+R01XLSNZLTZWRU84NEUpMzZNVztGVVIKK002Rk1SP1NdWDgkXU48RzVWPzcpQDYkMFY8V0EpKjJNKTMzIUM6RklQLUYhUzpVTVpERz0vOFdKIj02WSEKK00mIyhNMlciIj5ERUw8Rkk5LUJUTS9XITkzM0VLPzdJUjgkRSQ5Vz4iOiU0ISswJS0gK0lBNiMhNjxHSiIKK008RklLO0cpQzdUUTUxNilANkYhLTw2VS0zN01aOjQoVjglWT83VUk+LEFASTIzWTo6VylaO1REWTMmRUAKK002M1xSKTRNOiBWK146RllSPkYoXi9VQFYtRFVbOkRVSjtVIVM4RilSOkZKIzwkRTUxI1k4MTJURTE3KV0KK006RUU6OlRVKS41RSQpVUVaNkMhLTpGIFAxJ0oiPkZJSzwmJFk2RylKNiI9OTg2QUs4Vk0tMjQxSzhFSSkKK004I106NlgpUj04QUsxNUlSPEZROC1DKUJAR1VaPCVcXjM3NVo6RUxbLCZGKDxGOU8xJF1CPEZBVzg2KVIKK01QVzlOPEc1Uj5HPSkmVl1XOCNZQDgzOEU1RilCOlJUXjhWTS86SEoiNiU5SkBYLVU8JE0/N0RFIThGXSwKK006N0lQOFNcSSxCNSU8JERNMycpWjw3IFwpNFFaPkdAISggJEUgL1k2LjJUXjpHNVY8Rz1PNkZRUDZEVTgKK00xNkVGMTRFOztWSF4vVzlVO1U0VjZGSTAyI0U4LEMoSyszOTg0JilVPkchJC9GKUM6NFxSJlNdQDpHKUsKK004Rk1OP1cpQTZFTF8tQzlKPkYpTjpDXUpARklaPEZJVTxFIUs2IyBbL0M4STI2WiJBNi06OkVJOjI0UUAKK001NiVSNkIoVjY2KT8tRUFaPTYxRjxHISQzNzdePlVMRy40VU1CJ0lSNkYtUzo2JSktRz07NlNFSzNWOiUKK008RF1APkZZWjgiIDIpVU1SOEdNVzg1TVU+Vi06JlFNO0BHVVI8RUU6O1Y5SjhGOVI9NzlDOjYtOjcnSTQKK00kRUVdNlQ1Ozw1RSk6Vi06OEM4VDNWRSUxJ0oqOjMhJT8nTVY8RkUsOEcoXzElSF42RSVDO1YgVjEkMFkKK007VkBfMTYtWjlGKTUrMlVDQEgpWiAzOCEsQCNeOjM4TTI2LUs3RS1NOEMhLThUVF4yNDVJOFQ1JTdGUUgKK002JFYjO0VJOCZTRUs4VERWL0JETSsxQE04I1klOldJUjolST84NSUlMjJEVjYmSU49Nkk+N0ZNUj5WXUIKK006JERQMyYpPDhGMTs6VzVKPEZZSjxGRS06Vi0pKzJUSSRCNS09KDlVOlYpKDI1OSQzJEUoOkZcVjI1QTkKK004RDEkPEZZPjNVUU46Vi1VX0dVWjgkXFk2VllQPTNFLEBGJTguNUFSPEYsUDM0MUo8RFRQMTc9TT82TFwKK00qUkRZN1NFQjlGXUM7R0lbPVBEMiwmSVo9N0lGOEZJQjhGJUs/JllSOiZRUDo2TVc3QUBZP1cgXzI3JUkKK00zJklNMzYpJDI0TUE2NUFRQEcgVi9GLUY9NilAKVQ1UDUjXFwvJURQKlYhSC1DXUk2VylKMzVBSj5GKSwKK002I1xNMzgpWj5AKF4gLS1GNSI1KTomISwzNVFAKzMhLCxCNFsyNi04L1VBQjpVXTg2R0ldOEVASSs2IVAKK002NUlGLjMoQCUyRUItQ1k/OiclTzhGTUkyMyBbKjMhLTZFTUs/Vl06MyYpUjpGKUI1M1xWLlRVJDhHKVIKK005RklaO1AtS19GKUI3RVxSLlIgKSIyVUY8RzYiPkM5JTtVSSQrMj0vOEQ1SzxGKUs4RDFLOUYhLSwkMUIKK002Rz1aOyc2IDY2TSU2RzVOOCc1JS1ENTs4SCFMMjNdJDpWTSQoIilAOydJVTxGQUA2JERWNiNdOjM0MTEKK007SCxQKCJVNjxHNVU7N0ogOkVBQDtIKVY7RlFGPkghVkAmLDgmVUFJLUMhOkAmXTo6JFU6LCYlOTI6SSkKK006NylNPkYtSTo0QUY8VURWNjZFKSsyRFw6M1hFNiVITSs0VUJARyk2OkdJWjpUMFkyNF1CPEcoISxAJE0KK00gL1heL0FVJTtWTUM6Ji1JN0Q1RisyRFItRFRNKzZdXzokVSw4R0olPlZBODVFSUo2NUVSOCQwVCpUTUAKK00tQ1kvODchUDhHKV86IzhFLCMhSTZTRTo+RzVKNUVJQjlHKSw2JERNKVM4WTgmSTo4RUlSPEVRMTpGWUsKK003RVxWLUNMLiIxTEctVEEzQCQ0UDY2XUEvQlReLjNNUz5GOUM6RUlQOkZJLCkzOFYsJiteNlNFREM3XVcKK00uNDFAQFhFTi1CVUE4VilaPEVJKSlTWTA7NExWN1VFLzxIKUo7VUhfLUZBQDZVWFYsJEFGOiYhQDZGSUIKK00zJjIhQkdJLS1XKVo8Vi0tM1dWJj1HVVAvIkRZN1UgRStXSiA4Vi07OEI1LDZENSk8JykxOkYpSj4kNSUKK008Rk1COlc8XighTFY4RThfMzVAUiszIUM/Ny0tOSdWIzxERFszNylPQEYpOyAyRCEmUCNeL1MoOC1HPVUKK004VkE7PEZAXzoiVE01M0xNJEFNOkJGXSkuNUlLPzgpUTlHMUs8Rkk+PEZNSTIzOU0zUzklNlZNSjtVSTEKK01AJz04KzNESThWOFY2N0laPEZdQjM2TiIzJUBZKzNcXy9FRUI2JU0tNyZJKSwkMU07RilCMjREXigjIFsKK00oIUw7LCcpSTJUMUI2RU04MTMoRTgnSVY6ViksOFgqIjpFOSkqMiE5X0RERzEnVio6I0UlOCc5WzhCNE0KK006JUU6OEU5LTIxTDUvSCVSOlcpNShFRVc0JUVBLUM5SDxGLUk3RTUvNkVJSzxHIUMuMjUsPkg5WzEyVUoKK007Rk0pKVMhV0JHVV0+VkU+LUQ1OCsyPUo6ViFQOVUhKzgkNE0vRz4hO0YpMTZHPUM2JUlaPkcpXzIxKC4KK00mVUlJO0chPy5RTEI4NllKLlQ1VT83KSkuNUFSQEgpSjNQJTUgNDAgX0Y8ViYhTTk8RFUpMzclUjdWKFsKK00pVUE0KTBENSwnSVo6JEReMTcpWjxGOVI7JlVOO0ZJLzhWIF88JTBFKzRFSjxGSTYxNjlCM1M5JC1WJT8KK00uNUVSOUZZUjgjRUM+RkVHKjI1KTlFTTs6RFU6OlZJSzVDOEc4RylSOkVJQzgkRUo9ViBfMSVdVT5XIUMKK004VEEtPERQSSwkNTk7R11CKzM5V0BGVV82IiA1OClFRjM1TVVBNiBWKVVJVTxFRDsqNTkpOjYgXjYzMC4KK00jQilCIFZLRDIxKE03VDEsOiQwOzhIIUw4Vik7OCVMUDE2TiA6IjQ4MjcpWj5GKSU2VklLMSFASTpYKVUKK00/N01GOiM4Xjo0RSk6NFUkPThBSTpXISUmUjUkPlg5VzglSUs6JEUkQCgtWkFHIFAjQTUkNldKMDtSVDsKK00sREVXO1M4UDglWUI4JEReOCghSi9QJTsgNzwgX0ghKSoyNSk4RERfLjRdWkAmOUExNEU/NTIgOCglOVQKK00+Rk0kKTRRTDhFUTA4Vi1GPkZBJDNVRS06JUBJJTFMXz5HKUYxJFRZMTM4Vi5URTgsJUFCL1VJSjdTOToKK008RUVMKTBYRTElRUI6Q1ktQEdVVzhEKEk2JilSPERRLDIjIT4/N0lGOkcpRjpWSU09VDBZOkVIQCo0MSUKK00zJzVDL1JFQUFWVVo4IjRAOF9ZTDlFRVVCRUVALURRTjpWRF83RkEtPCc1NTJRTCkjQiEpMzRQXzdUMTkKK003QzhQNkZUTThHSVI2Q1ksNkVIRSUzOUo5UUw4OCdJOjZHKUY4Vi1LMlIgTTpXSVY8Jz1MNiJETztXIToKK006MzhCOEhJWjpXQUYuU005OVgpXTxWLTo4IjQ7OCddSztILUAoIiBWLEZWMj5DXEk1JDE6PVNYTTYjOFAKK002NUBWLCcqIjwjWCErUCVKIC9ZXzxHMUQ6Jik4LUI0STpZIVI4ViEpNkZBNi5RQDsvVlVNN1NQWThEUF4KK00rNEU4MicpSS9TOTk4JkE4LyJEQC1GQVI7JkFIMjVdJCkyRE0xIlRWMjM4WTgmIUI7Vk0pOCQwQCpUTS0KK004RTg7KzdKKj5GSSwrM0xWOEghQzJTIFYtRF4mPkYtVTo1OSU2V0k7MzZJUDQgWE02JklKNyVJKTZHSVUKK006VUBNLyYvXjpWXSQ6SDlNOkZBQzhEQU8xNUFUOCcqITYmOE0mIUEkPCZdPzgmTUs+R0k6LlQ1SDVFSUIKK001Q0RJKjRdOy4xTE02RkBJKEZOIC1CPVo6Vk1ROCM4RSs0XUs+Vi0oOkVEOCU0UiI8VURFJlU5VT1GLUsKK006NEUvOjZNVT1HTVA3VTRAI0JVQjo1WVo6M1BcLUM5S0BHKTouUzhfLjZFLS1FQSQmU1k/MjFMX0BGJT4KK00gMTQhLjAjXjZFSVc+R11SOiM4Oy0lQVU6VUlXN1RNSDZUREkkQlU6OEVdRjI1XTgtQlU4ODYpUjtTODsKK00vVkFQL1M5PjdEMFk2Rk1SPVYhQTYjUEkoQzhHKlNQTS1FQTE6V0lSPCZFQCxCRSQ4JFBQI0FNS0MmVUoKK004RUE1LUYiIjpUVS03QjQ9PkZVUT5GVTYtRFVaNlQxRjpWQEAmJEVaPERcUDZGKU08RyFBLUUxS19GLTkKK00tVFE7NlcpVkEmSF84Q1xNMycpVUBGJig7U1hFL1ZFSDZGQUs6RzVaPEVdLDomJUg4I1hFJTJFKTYmIE0KK00vRklCLlI1UkBTOC46VkVDPVcgXikzOTgzNylRMyYpJScxQFY8RkkpKjM5OjclTUM4REUlNkZNQjhGOVMKK008JkE+KCE0QDY2XT48RiksOCMhPjwnTVc4Rj05OCZBSzdTRSQ0UzkpOiZAUis4KFY4MChNIC9YTS1GRU4KK01AR1VPMDI1JDYkUS0tRyk6L0ZBTzY2OSQvVU1POkYtQjhWIFwrNUFDPlgtUTUiTFY4JyRfLjYpXzokNTkKK000NjlVPjZNOzgkTT42I1xUKlFMVjYkUUM+RzVXOEVEXy8jPUgxIlRQKCVCKjs2KS04Vj0tOEcpQi9VSToKK00uUkVSPSZVWjwlQSUyJ11CL1ZJSjtTODstR0laNiJVODZWKTA2ViU6NUZLXjpEVSkxMj0sPVdWJj5VTToKK002I0xZOkc2Iz4nNVw4VUU0L0Q1ODY2SUA6Vj1SOEYpSjtXIVU1MUAuJlQxKThDXFk3UyBAJlVJWjIxTUAKK002RU1bPkZdLzg2JSU4Vz0+OiM4QCgjXVE6VTktMjRBWj5WITspMiE5OlVBKS9ENFsjQUA4LSMpOTxGTVMKK007JU1ILUYhTz5HSUs6JFVBPTcpUj0lQE0sJTlSQEYkX0BCTSsgNEQhKzAjXixCRSk6RzYiPkU0TTdGQSQKK00zM1lCM1M5OjwkXUI7VFUtPEghSzlGXUo1QzhZMzdKJTxGQTk1JkFQMjRFQz8nLTgvU0UoOUdJUjhGLToKK006Jk06OSNQOys0RSkzJylXOzYpJCtUMFk6Q1hFLEFMXjwnLUIxNiVMPCdJVTMzITs2RExAMydJVT83VVAKK00zJEVLO1YtSDZWQFwpNEVVPTZBLTdWKUgxM0UoPCYpO0hWSTs2ViBWLjcqIkBHKTs4Vi1GNiZFOzo1XScKK008Rk1GPVRUQjYkUUIuNUUtNUQ1OiBXKzpANUAyI0E0XjgmXT8yNERFJTFNODtVSFY6QyBePEZVTTpHSUsKK00uNUlXOFRUXyoyRF44VUk0N1VBNjpHTUs1Q00kNjZBOjM2OUEyUkRULyVZJTJURSQ6RyE6NjU1NjhXVVoKK006RUk5L1NdVz04SiUyMkRWNkdJTzdDTTYgNUAhLlAjXjEhTFQyNi1SPEVATTY2KTo3Vi1ILUI1KTgkUS8KK004RUBZOEgpWjpHIVA3JUxWLCcqIjw0VUI2RilSNjNZJD1YJUo2I0xNOCchQzolSToyJi08PCUwTSszWSkKK00yNjlKOkVJPy9FRSQ2JThAJTFNKS9WLUArNDVCPEdBXTpUVT84ViBbLEVFUjtHUic4JFU5NlZNUDMkUEkKK00pNiojOlY5QjhGSUozMyE5QDcpMFZGKUg4JkU4LCZJVT5HTTA0Ji1IOlZNSjpFXFA4Rz1CPCQwVjI1STYKK00rM10pKzI1KTpWLVI+RiQ9I0FATTI3KVI6ViRfLSVBSzpVQEUxIjRNMTQ1MDs4IU8uNFVSOyVNOS9SVFYKK00xI1xfNjVdVT1HNUo1Q1kpL0ZFRy4wLUNIVkVKPDc9QjgzXDstRUFCNiREVi43KVo4RDRfKTFNOz8oOioKK006JDEkMTZFQzgkRTYgNVwhNjAjODo2ITg6VFVLPCREPTE2QTk2Ni1XNkIgXzgkNTg3VF0rNkdVWjlUVUsKK004VjkkL1VRVTpDRSUuNUlLODNcXDM3IVA6JVxfMzVNKTg2OSU3ViEsNkRUXy1FQUYzVkVCOyUhOzZGSiAKK00+Rj04LEJVODI0VT8tQ10kOVAtUl9GLUQ8Rkk6MjNFQThWWiI8RTUkMTYtUzZDPEkpNEVdOkYtQjhHKVoKK00yMVU6QFdVLDZGTUM4RyFAOkYpUj82OTo6JFE7OEY5TjojWSw5JklSN1VFPzZGISUxI0w4I0NZSjgmSUsKK005RCRUMSM4Xz5INiI8RUUpO1dJSjUyIDsxMzhcLSRFQjlHKTg7JllLODYhQTJWJSkyNTBQNkcpXUBWQSUKK00sIlRNOFc9STY6NTs2RklaQDhFWzY0MEAlMlVOOjREXiwmKUo6NVhZKCMhJDpHNiI7RUUtMjVNQjhVOT8KK00gNFQhOlAiT0AmXTk4Q11AOjVIVjE2QTk4U11COiRFKTo2ITg2VUFJN0cpVTZTRSw4ViksMjQ1SjxGISQKK00vVTk7NURFSTo2LCM4T1lIO1YhLTZWIEkyNl1AMjNZJCZTRUk0Ji1CPTRdQzE1JipDKClXMjM5KTZWLUIKK00yNVk5MTZKIj5GKTk8R0kvMjJUXzhERTtARylKOiRcNShEVU8rNEVGMzRFJC42Xik4IlUsQEdQWTI1ST8KK00xVy1LOiQxQj5GWUw4RiEtNkRVQztUMS02VU0tNCchQjZGLS01QzhAKCQ1SDolOFQsQyg7KlUxLDpHQV0KK00+RUcuMycqIjxGLF8sRURWMTNdOjtUUTk4R0lONCZJUTZWKVo4Ri1EKjNZOTlHST8vRDBJKCNZQz5FITkKK002VUlOQEgpXzo1NEAjQjVBPCRFJDI1QSQ4JlFJLlJVNjomOV0+VikpLjNFODokVTggNUQhPUAjXkJHPS8KK004UjRWNUVdJTgmSSw6VUBWNiREWTgmITgvVF1SPkdWIjojXF84VklAMjNdOzpGITY6JiE4L1NdSz5HKUsKK00zVFVSQEdJSjpWTF82Rk1LOiREXCozXTs4JylSOkUhQjI0RVU/N1YqO0RdKTM1SUIzJiUpJlUiKkJGOSgKK002R0lXLjJUVjMzRUNBVjk8M1ZUTSUzWT82JUFCLjIgOCUzRVA+Rl1GPzg0WV9CNEIvQ0VCODYtKTImTUMKK003RDFJODRESzhWPUI6Rk1DKzJVQjhEXUM4VUBXMjRVOjtXKUg3RTU2MSM5KSszWUo7Ryk6NCZZWj03SUsKK002M1xWNTYhSTxGOF8xJz1LMSVRSSszIVc/JU04LyVBOThWTSkrMzk7KCEoVjolSTg2RU1OPlZZTTwlREcKK0EmIzlCPCRNKTY2IF8sJUlbPCJUVjZGKVJAR0lQNSMhKTZIKUA2ICU5IDc0IAorIAorZW5kCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvaHR0cHNfc3ZuX3B5dGhvbl9vcmdfcm9vdC5wZW0gYi9saWIvcHl0aG9uMi43L3Rlc3QvaHR0cHNfc3ZuX3B5dGhvbl9vcmdfcm9vdC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdkZmM4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9odHRwc19zdm5fcHl0aG9uX29yZ19yb290LnBlbQpAQCAtMCwwICsxLDQxIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUhQVENDQlNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRUUZBREI1TVJBd0RnWURWUVFLRXdkU2IyOTAKK0lFTkJNUjR3SEFZRFZRUUxFeFZvZEhSd09pOHZkM2QzTG1OaFkyVnlkQzV2Y21jeElqQWdCZ05WQkFNVEdVTkIKK0lFTmxjblFnVTJsbmJtbHVaeUJCZFhSb2IzSnBkSGt4SVRBZkJna3Foa2lHOXcwQkNRRVdFbk4xY0hCdmNuUkEKK1kyRmpaWEowTG05eVp6QWVGdzB3TXpBek16QXhNakk1TkRsYUZ3MHpNekF6TWpreE1qSTVORGxhTUhreEVEQU8KK0JnTlZCQW9UQjFKdmIzUWdRMEV4SGpBY0JnTlZCQXNURldoMGRIQTZMeTkzZDNjdVkyRmpaWEowTG05eVp6RWkKK01DQUdBMVVFQXhNWlEwRWdRMlZ5ZENCVGFXZHVhVzVuSUVGMWRHaHZjbWwwZVRFaE1COEdDU3FHU0liM0RRRUoKK0FSWVNjM1Z3Y0c5eWRFQmpZV05sY25RdWIzSm5NSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUMKK0NnS0NBZ0VBemlMQTRrWjk3RFlvQjFDVzhxQXpRSXhMOFR0bVB6SGxhd0kyMjlaODl2R0lqMDUzTmdWQmxma0oKKzhCTFBSb1p6WUxkdWZ1akFXR1N1emJDdFJSY01ZL3BuQ3VqVzByOCs1NWpFOEV6NjRBTzdOVjFzSWQ2ZUlObTYKK3pXWXlOM0w2OXdqMXg4MVl5WTduRGw3cVB2NGNvUlFLRld5R2hGdGtaaXA2cVV0VGVmV0lvbnZ1THdwaEs0MnkKK2ZrMVdwUlBzNnRxU25xeEVRUjVZWUdVRlp2akFSTDNMbFBkQ2ZndjNaV2lZVVFYdzh3V1JCQjBiRjRMc3lGZTcKK3cydDZpUEd3Y3N3bFd5Q1I3QllDRW84eTZSY1lTTkRIQlM0Q01FSzRKWndGYXorcU9xZnJVMGozNk5LMkI1amMKK0c4WTBmMy9KSElKNkJWZ3JDRnZ6T0tLckYxMW15WmpYbmhDTG90TGRkSnIzY1F4eVlOL05iNWd6blpZMGRqNGsKK2VwS3dEcFVlYithZ1JUaEhxdGRCN1VxM0V2YlhHNE9LRHk3WUNiWloxNm9FLzlLVGZXZ3UzWXRMcTFpNkw0M3EKK2xhZWd3MVNKcGZ2YmkxRWluYkxEdmhHK0xKR0dpNVo0clNEVGlpOGFQOGJRVVdXSEliRVpBV1YvUlJ5SDlYelEKK1FVeFBLWmdoL1RNZmRRd0VVZm9aZDl2VUZCenVnY01kOVppM2FRYVJJdDBBVU15Qk1hd1NCM3M0Mm1oYjVpdlUKK2ZzbGZyZWpyY2t6ekFlVkxJTCthcGxmS2tRQUJpNkYxSVRlMVl3MW5Qa1pQY0NCbnpzWFdXZHNDNFBEU3k4MjYKK1lyZVFRZWpkSU9RcHZHUXBRc2dpM0hpYS8wUHNtQnNKVVV0YVdzSng4Y1RMYzZubG9Rc0NBd0VBQWFPQ0FjNHcKK2dnSEtNQjBHQTFVZERnUVdCQlFXdFRJYjFNZno0T2FPODczU3NEcnVzamtZMFRDQm93WURWUjBqQklHYk1JR1kKK2dCUVd0VEliMU1mejRPYU84NzNTc0RydXNqa1kwYUY5cEhzd2VURVFNQTRHQTFVRUNoTUhVbTl2ZENCRFFURWUKK01Cd0dBMVVFQ3hNVmFIUjBjRG92TDNkM2R5NWpZV05sY25RdWIzSm5NU0l3SUFZRFZRUURFeGxEUVNCRFpYSjAKK0lGTnBaMjVwYm1jZ1FYVjBhRzl5YVhSNU1TRXdId1lKS29aSWh2Y05BUWtCRmhKemRYQndiM0owUUdOaFkyVnkKK2RDNXZjbWVDQVFBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBeUJnTlZIUjhFS3pBcE1DZWdKYUFqaGlGb2RIUncKK2N6b3ZMM2QzZHk1allXTmxjblF1YjNKbkwzSmxkbTlyWlM1amNtd3dNQVlKWUlaSUFZYjRRZ0VFQkNNV0lXaDAKK2RIQnpPaTh2ZDNkM0xtTmhZMlZ5ZEM1dmNtY3ZjbVYyYjJ0bExtTnliREEwQmdsZ2hrZ0JodmhDQVFnRUp4WWwKK2FIUjBjRG92TDNkM2R5NWpZV05sY25RdWIzSm5MMmx1WkdWNExuQm9jRDlwWkQweE1EQldCZ2xnaGtnQmh2aEMKK0FRMEVTUlpIVkc4Z1oyVjBJSGx2ZFhJZ2IzZHVJR05sY25ScFptbGpZWFJsSUdadmNpQkdVa1ZGSUdobFlXUWcKK2IzWmxjaUIwYnlCb2RIUndPaTh2ZDNkM0xtTmhZMlZ5ZEM1dmNtY3dEUVlKS29aSWh2Y05BUUVFQlFBRGdnSUIKK0FDakg3cHlDQXJwY2dCTEtOUW9kZ1crSmFwbk04bWdQZjZmaGpWaVZQcjN5QnNPUVdxeTFZUGFaUXdHamlIQ2MKK25XS2RwSWV2WjFnTk1EWTc1cTFJMDh0MEFvWnhQdUlyQTJqeE5HSkFSanRUNmlqMHJQdG1sVk9LVFYzOU85bGcKKzE4cDVhVHV4WlpLbXhvR0NYSnpONjAwQmlxWGZFVldxRmNvZk44Q0NtSEJoMjJwOGxxT09MbFErVHlHcGtPL2MKK2dyL2M2RVd0VFpCekNEeVVaYkFFbVhaLzRyekNhaFdxbHdRM0pOZ2VsRTV0RGxHKzFzU1B5cFp0OTBQZjZEQmwKK0p6dDd1ME5EWThSRDk3THNhTXpoR1k0aSs1amhlMW8rQVRjN2l3aXdvdk9WVGhyTG04MmFzZHV5Y1BBdFN0dlkKK3NPTnZSVWd6RXYvK1BESXFWUGZFOTRyd2lDUENSLzVrZW5IQTBSNm1ZN0FIZnFRdjB3R1AzSjhydHNZSXFRK1QKK1NDWDhFdjJmUXR6enhENzJWN0RYM1duUkJuYzBDa3ZTeXFEL0hNYU15UmEreE13eU4yaHpYd2o3VWZkSlV6WUYKK0NwVUNUUEo1R2hEMjJEcDFuUE1kOGFJTmNHZUdHN01XOVMvbHBPdDVodms5QzhKekM2V1pyRy84WjdqbEx3dW0KK0dDU05lOUZJTlNrWVFLeVRZT0dXaGxDMGVsbllqeUVMbjgrQ2tjWTd2MnZjQjVHNWwxWWpxclpzbE1aSUJqemsKK3prNnE1UFl2Q2R4VGJ5NzhkT3M2WTVuQ3BxeUp2S2V5UktBTmloRGpiUElreS9xYm4zQkhMdDRVaTlTeUlBbVcKK29tVHhKQnpjb1RXY0ZiTFV2RlV1ZlFiMW5BNVY5RnJXazlwMnJTVnpUTVZECistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvaWVlZTc1NC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvaWVlZTc1NC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliYjBjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pZWVlNzU0LnR4dApAQCAtMCwwICsxLDE4NSBAQAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1B5dGhvbiBJRUVFIDc1NCBmbG9hdGluZyBwb2ludCBzdXBwb3J0Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis+Pj4gZnJvbSBzeXMgaW1wb3J0IGZsb2F0X2luZm8gYXMgRkkKKz4+PiBmcm9tIG1hdGggaW1wb3J0ICoKKz4+PiBQSSA9IHBpCis+Pj4gRSA9IGUKKworWW91IG11c3QgbmV2ZXIgY29tcGFyZSB0d28gZmxvYXRzIHdpdGggPT0gYmVjYXVzZSB5b3UgYXJlIG5vdCBnb2luZyB0byBnZXQKK3doYXQgeW91IGV4cGVjdC4gV2UgdHJlYXQgdHdvIGZsb2F0cyBhcyBlcXVhbCBpZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZW0KK2lzIHNtYWxsIHRoYW4gZXBzaWxvbi4KKz4+PiBFUFMgPSAxRS0xNQorPj4+IGRlZiBlcXVhbCh4LCB5KToKKy4uLiAgICAgIiIiQWxtb3N0IGVxdWFsIGhlbHBlciBmb3IgZmxvYXRzIiIiCisuLi4gICAgIHJldHVybiBhYnMoeCAtIHkpIDwgRVBTCisKKworTmFOcyBhbmQgSU5GcworPT09PT09PT09PT09PQorCitJbiBQeXRob24gMi42IGFuZCBuZXdlciBOYU5zIChub3QgYSBudW1iZXIpIGFuZCBpbmZpbml0eSBjYW4gYmUgY29uc3RydWN0ZWQKK2Zyb20gdGhlIHN0cmluZ3MgJ2luZicgYW5kICduYW4nLgorCis+Pj4gSU5GID0gZmxvYXQoJ2luZicpCis+Pj4gTklORiA9IGZsb2F0KCctaW5mJykKKz4+PiBOQU4gPSBmbG9hdCgnbmFuJykKKworPj4+IElORgoraW5mCis+Pj4gTklORgorLWluZgorPj4+IE5BTgorbmFuCisKK1RoZSBtYXRoIG1vZHVsZSdzIGBgaXNuYW5gYCBhbmQgYGBpc2luZmBgIGZ1bmN0aW9ucyBjYW4gYmUgdXNlZCB0byBkZXRlY3QgSU5GCithbmQgTkFOOgorPj4+IGlzaW5mKElORiksIGlzaW5mKE5JTkYpLCBpc25hbihOQU4pCisoVHJ1ZSwgVHJ1ZSwgVHJ1ZSkKKz4+PiBJTkYgPT0gLU5JTkYKK1RydWUKKworSW5maW5pdHkKKy0tLS0tLS0tCisKK0FtYmlndW91cyBvcGVyYXRpb25zIGxpa2UgYGAwICogaW5mYGAgb3IgYGBpbmYgLSBpbmZgYCByZXN1bHQgaW4gTmFOLgorPj4+IElORiAqIDAKK25hbgorPj4+IElORiAtIElORgorbmFuCis+Pj4gSU5GIC8gSU5GCituYW4KKworSG93ZXZlciB1bmFtYmlnb3VzIG9wZXJhdGlvbnMgd2l0aCBpbmYgcmV0dXJuIGluZjoKKz4+PiBJTkYgKiBJTkYKK2luZgorPj4+IDEuNSAqIElORgoraW5mCis+Pj4gMC41ICogSU5GCitpbmYKKz4+PiBJTkYgLyAxMDAwCitpbmYKKworTm90IGEgTnVtYmVyCistLS0tLS0tLS0tLS0KKworTmFOcyBhcmUgbmV2ZXIgZXF1YWwgdG8gYW5vdGhlciBudW1iZXIsIGV2ZW4gaXRzZWxmCis+Pj4gTkFOID09IE5BTgorRmFsc2UKKz4+PiBOQU4gPCAwCitGYWxzZQorPj4+IE5BTiA+PSAwCitGYWxzZQorCitBbGwgb3BlcmF0aW9ucyBpbnZvbHZpbmcgYSBOYU4gcmV0dXJuIGEgTmFOIGV4Y2VwdCBmb3IgbmFuKiowIGFuZCAxKipuYW4uCis+Pj4gMSArIE5BTgorbmFuCis+Pj4gMSAqIE5BTgorbmFuCis+Pj4gMCAqIE5BTgorbmFuCis+Pj4gMSAqKiBOQU4KKzEuMAorPj4+IE5BTiAqKiAwCisxLjAKKz4+PiAwICoqIE5BTgorbmFuCis+Pj4gKDEuMCArIEZJLmVwc2lsb24pICogTkFOCituYW4KKworTWlzYyBGdW5jdGlvbnMKKz09PT09PT09PT09PT09CisKK1RoZSBwb3dlciBvZiAxIHJhaXNlZCB0byB4IGlzIGFsd2F5cyAxLjAsIGV2ZW4gZm9yIHNwZWNpYWwgdmFsdWVzIGxpa2UgMCwKK2luZmluaXR5IGFuZCBOYU4uCisKKz4+PiBwb3coMSwgMCkKKzEuMAorPj4+IHBvdygxLCBJTkYpCisxLjAKKz4+PiBwb3coMSwgLUlORikKKzEuMAorPj4+IHBvdygxLCBOQU4pCisxLjAKKworVGhlIHBvd2VyIG9mIDAgcmFpc2VkIHRvIHggaXMgZGVmaW5lZCBhcyAwLCBpZiB4IGlzIHBvc2l0aXZlLiBOZWdhdGl2ZQordmFsdWVzIGFyZSBhIGRvbWFpbiBlcnJvciBvciB6ZXJvIGRpdmlzaW9uIGVycm9yIGFuZCBOYU4gcmVzdWx0IGluIGEKK3NpbGVudCBOYU4uCisKKz4+PiBwb3coMCwgMCkKKzEuMAorPj4+IHBvdygwLCBJTkYpCiswLjAKKz4+PiBwb3coMCwgLUlORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiAwICoqIC0xCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisuLi4KK1plcm9EaXZpc2lvbkVycm9yOiAwLjAgY2Fubm90IGJlIHJhaXNlZCB0byBhIG5lZ2F0aXZlIHBvd2VyCis+Pj4gcG93KDAsIE5BTikKK25hbgorCisKK1RyaWdvbm9tZXRyaWMgRnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09PT09PQorCis+Pj4gc2luKElORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiBzaW4oTklORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiBzaW4oTkFOKQorbmFuCis+Pj4gY29zKElORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiBjb3MoTklORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiBjb3MoTkFOKQorbmFuCis+Pj4gdGFuKElORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiB0YW4oTklORikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKy4uLgorVmFsdWVFcnJvcjogbWF0aCBkb21haW4gZXJyb3IKKz4+PiB0YW4oTkFOKQorbmFuCisKK05laXRoZXIgcGkgbm9yIHRhbiBhcmUgZXhhY3QsIGJ1dCB5b3UgY2FuIGFzc3VtZSB0aGF0IHRhbihwaS8yKSBpcyBhIGxhcmdlIHZhbHVlCithbmQgdGFuKHBpKSBpcyBhIHZlcnkgc21hbGwgdmFsdWU6Cis+Pj4gdGFuKFBJLzIpID4gMUUxMAorVHJ1ZQorPj4+IC10YW4oLVBJLzIpID4gMUUxMAorVHJ1ZQorPj4+IHRhbihQSSkgPCAxRS0xNQorVHJ1ZQorCis+Pj4gYXNpbihOQU4pLCBhY29zKE5BTiksIGF0YW4oTkFOKQorKG5hbiwgbmFuLCBuYW4pCis+Pj4gYXNpbihJTkYpLCBhc2luKE5JTkYpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisuLi4KK1ZhbHVlRXJyb3I6IG1hdGggZG9tYWluIGVycm9yCis+Pj4gYWNvcyhJTkYpLCBhY29zKE5JTkYpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisuLi4KK1ZhbHVlRXJyb3I6IG1hdGggZG9tYWluIGVycm9yCis+Pj4gZXF1YWwoYXRhbihJTkYpLCBQSS8yKSwgZXF1YWwoYXRhbihOSU5GKSwgLVBJLzIpCisoVHJ1ZSwgVHJ1ZSkKKworCitIeWJlcmJvbGljIEZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT0KKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC9pbmZpbml0ZV9yZWxvYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxY2NhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbmZpbml0ZV9yZWxvYWQucHkKQEAgLTAsMCArMSw4IEBACisjIEZvciB0ZXN0aW5nIGh0dHA6Ly9weXRob24ub3JnL3NmLzc0MjM0Miwgd2hpY2ggcmVwb3J0cyB0aGF0IFB5dGhvbgorIyAgc2VnZmF1bHRzIChpbmZpbml0ZSByZWN1cnNpb24gaW4gQykgaW4gdGhlIHByZXNlbmNlIG9mIGluZmluaXRlCisjICByZWxvYWQoKWluZy4gVGhpcyBtb2R1bGUgaXMgaW1wb3J0ZWQgYnkgdGVzdF9pbXBvcnQucHk6dGVzdF9pbmZpbml0ZV9yZWxvYWQKKyMgIHRvIG1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIGFueSBtb3JlLgorCitpbXBvcnQgaW1wCitpbXBvcnQgaW5maW5pdGVfcmVsb2FkCitpbXAucmVsb2FkKGluZmluaXRlX3JlbG9hZCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbmZpbml0ZV9yZWxvYWQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmYThkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbmZpbml0ZV9yZWxvYWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbmZpbml0ZV9yZWxvYWQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luZmluaXRlX3JlbG9hZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFmYThkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9pbmZpbml0ZV9yZWxvYWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmRlMmUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2luc3BlY3RfZm9kZGVyLnB5CkBAIC0wLDAgKzEsNTYgQEAKKyMgbGluZSAxCisnQSBtb2R1bGUgZG9jc3RyaW5nLicKKworaW1wb3J0IHN5cywgaW5zcGVjdAorIyBsaW5lIDUKKworIyBsaW5lIDcKK2RlZiBzcGFtKGEsIGIsIGMsIGQ9MywgKGUsIChmLCkpPSg0LCAoNSwpKSwgKmcsICoqaCk6CisgICAgZWdncyhiICsgZCwgYyArIGYpCisKKyMgbGluZSAxMQorZGVmIGVnZ3MoeCwgeSk6CisgICAgIkEgZG9jc3RyaW5nLiIKKyAgICBnbG9iYWwgZnIsIHN0CisgICAgZnIgPSBpbnNwZWN0LmN1cnJlbnRmcmFtZSgpCisgICAgc3QgPSBpbnNwZWN0LnN0YWNrKCkKKyAgICBwID0geAorICAgIHEgPSB5IC8vIDAKKworIyBsaW5lIDIwCitjbGFzcyBTdHVwaWRHaXQ6CisgICAgIiIiQSBsb25nZXIsCisKKyAgICBpbmRlbnRlZAorCisgICAgZG9jc3RyaW5nLiIiIgorIyBsaW5lIDI3CisKKyAgICBkZWYgYWJ1c2Uoc2VsZiwgYSwgYiwgYyk6CisgICAgICAgICIiIkFub3RoZXIKKworXHRkb2NzdHJpbmcKKworICAgICAgICBjb250YWluaW5nCisKK1x0dGFicworXHQKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXJndWUoYSwgYiwgYykKKyMgbGluZSA0MAorICAgIGRlZiBhcmd1ZShzZWxmLCBhLCBiLCBjKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3BhbShhLCBiLCBjKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmV4ID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHNlbGYudHIgPSBpbnNwZWN0LnRyYWNlKCkKKworIyBsaW5lIDQ4CitjbGFzcyBNYWxvZG9yb3VzUGVydmVydChTdHVwaWRHaXQpOgorICAgIHBhc3MKKworY2xhc3MgUGFycm90RHJvcHBpbmdzOgorICAgIHBhc3MKKworY2xhc3MgRmVzdGVyaW5nR29iKE1hbG9kb3JvdXNQZXJ2ZXJ0LCBQYXJyb3REcm9wcGluZ3MpOgorICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTZhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxOTZhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkOTc4Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIyLnB5CkBAIC0wLDAgKzEsOTkgQEAKKyMgbGluZSAxCitkZWYgd3JhcChmb289Tm9uZSk6CisgICAgZGVmIHdyYXBwZXIoZnVuYyk6CisgICAgICAgIHJldHVybiBmdW5jCisgICAgcmV0dXJuIHdyYXBwZXIKKworIyBsaW5lIDcKK2RlZiByZXBsYWNlKGZ1bmMpOgorICAgIGRlZiBpbnN0ZWFkZnVuYygpOgorICAgICAgICBwcmludCAnaGVsbG8nCisgICAgcmV0dXJuIGluc3RlYWRmdW5jCisKKyMgbGluZSAxMworQHdyYXAoKQorQHdyYXAod3JhcCkKK2RlZiB3cmFwcGVkKCk6CisgICAgcGFzcworCisjIGxpbmUgMTkKK0ByZXBsYWNlCitkZWYgZ29uZSgpOgorICAgIHBhc3MKKworIyBsaW5lIDI0CitvbGwgPSBsYW1iZGEgbTogbQorCisjIGxpbmUgMjcKK3RsbCA9IGxhbWJkYSBnOiBnIGFuZCBcCitnIGFuZCBcCitnCisKKyMgbGluZSAzMgordGxsaSA9IGxhbWJkYSBkOiBkIGFuZCBcCisgICAgZAorCisjIGxpbmUgMzYKK2RlZiBvbmVsaW5lZnVuYygpOiBwYXNzCisKKyMgbGluZSAzOQorZGVmIG1hbnlhcmdzKGFyZzEsIGFyZzIsCithcmczLCBhcmc0KTogcGFzcworCisjIGxpbmUgNDMKK2RlZiB0d29saW5lZnVuYyhtKTogcmV0dXJuIG0gYW5kIFwKK20KKworIyBsaW5lIDQ3CithID0gW05vbmUsCisgICAgIGxhbWJkYSB4OiB4LAorICAgICBOb25lXQorCisjIGxpbmUgNTIKK2RlZiBzZXRmdW5jKGZ1bmMpOgorICAgIGdsb2JhbHMoKVsiYW5vbnltb3VzIl0gPSBmdW5jCitzZXRmdW5jKGxhbWJkYSB4LCB5OiB4KnkpCisKKyMgbGluZSA1NworZGVmIHdpdGhfY29tbWVudCgpOiAgIyBoZWxsbworICAgIHdvcmxkCisKKyMgbGluZSA2MQorbXVsdGlsaW5lX3NpZyA9IFsKKyAgICBsYW1iZGEgKHgsCisgICAgICAgICAgICB5KTogeCt5LAorICAgIE5vbmUsCisgICAgXQorCisjIGxpbmUgNjgKK2RlZiBmdW5jNjkoKToKKyAgICBjbGFzcyBjbHM3MDoKKyAgICAgICAgZGVmIGZ1bmM3MSgpOgorICAgICAgICAgICAgcGFzcworICAgIHJldHVybiBjbHM3MAorZXh0cmE3NCA9IDc0CisKKyMgbGluZSA3NgorZGVmIGZ1bmM3NygpOiBwYXNzCisoZXh0cmE3OCwgc3R1ZmY3OCkgPSAneHknCitleHRyYTc5ID0gJ3N0b3AnCisKKyMgbGluZSA4MQorY2xhc3MgY2xzODI6CisgICAgZGVmIGZ1bmM4MygpOiBwYXNzCisoZXh0cmE4NCwgc3R1ZmY4NCkgPSAneHknCitleHRyYTg1ID0gJ3N0b3AnCisKKyMgbGluZSA4NworZGVmIGZ1bmM4OCgpOgorICAgICMgY29tbWVudAorICAgIHJldHVybiA5MAorCisjIGxpbmUgOTIKK2RlZiBmKCk6CisgICAgY2xhc3MgWDoKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgICJkb2MiCisgICAgICAgICAgICByZXR1cm4gNDIKKyAgICByZXR1cm4gWAorbWV0aG9kX2luX2R5bmFtaWNfY2xhc3MgPSBmKCkuZy5pbV9mdW5jCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGU2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9pbnNwZWN0X2ZvZGRlcjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOGU2ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvaW5zcGVjdF9mb2RkZXIyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qva2V5Y2VydC5wZW0gYi9saWIvcHl0aG9uMi43L3Rlc3Qva2V5Y2VydC5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzMThhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9rZXljZXJ0LnBlbQpAQCAtMCwwICsxLDMxIEBACistLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KK01JSUNkd0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQW1Fd2dnSmRBZ0VBQW9HQkFOdGIwK1lyS3V4ZXZHcG0KK0xyamFVaFpTZ3o2ekZBbXVHRm1LbVViZGptZnY5elNtbWRzUUlrc0srK2pLMEJlOUxlWnkyMGo2YWhPZnVWYTAKK3VmRW1Qb1A3Rnk0aFhlZ0taUjljQ1djSWUvQTZIMnhXRjFJSUpMUlRMYVU4b2wvSTdUK3VtNUhENUF3QXdOUFAKK1VTTlUwRWVnbXZwK3h4V3UzTlgybTFWZW90ODVBZ01CQUFFQ2dZQTNaZFo2NzNYMG9leEZscTdBQW1ydXRrSHQKK0NMN0x2d3JwT2lhQmpoeVR4VGVTTld6dnRRQmtJVThET0kwYklhekE0VXJlQUZmZnd0dkV1UG1vbkRiM0YrSXEKK1NNQXU0MlhjR3lWWkVsK2dIbFRQVTlYUlg3blRPWFZ0K01sUlJSeEw2dDlHa0dmVUFYSTNYeEpEWFczYzB2QksKK1VMOXhxRDhjT1JYT2ZFMDZyUUpCQVA4bUVYMUVSa1I2NFB0c29lNDI4MXZqVGxOZkliczdOTVBrVW5ybjlOL1kKK0JMaGpOSWZRM0hGWkc4QlRNTGZYN2tDUzlENTkzRFc1dFY0WjlCUC9jNmNDUVFEY0Z6Q2NWQXJOaDJKU3l3T1EKK1pmVGZSYkpnL1o1THQ5RmtuZ3YxbWVlR05QZ0lNTE44U2c2NzlwQU9PV216ZE1PM1Y3MDZyTlB6U1ZNTUU3RTUKK29QSWZBa0VBOHBEZGRhclA1dEN2VFRnVXBtVEZiYWttMEtvVFptMitGekhjbkE0alJoK1hOVGpUT3Y5OFk2SWsKK2VPNWQxWm5LWHNlV3ZrWm5jUWd4ZmRuTXFxcGo1d0pBY05xL1JWbmUxRGJZbHdXY2hUMlNpNjVNWW1tSjh0K0YKKzBtY3NVTHFqT25FTXdmNWUrcHRxNUx6d2J5ckhaWXE1Rk5rN29jdWZQdi9aUXJjU1NDK2NGd0pCQUt2T0pCeVMKK3g1NnF5R2VaTE9RbFdTMkpTM0tKbzU5WHVMRkdxY2JnTjlPbTl4RmE0MVliNE45TnZwbEZpdnN2WmR3M20xUS8KK1NQSVhRdVQ4Uk1QRFZOUT0KKy0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJQ1ZEQ0NBYjJnQXdJQkFnSUpBTmZIT0JrWnI4Sk9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1GOHhDekFKQmdOVgorQkFZVEFsaFpNUmN3RlFZRFZRUUhFdzVEWVhOMGJHVWdRVzUwYUhKaGVERWpNQ0VHQTFVRUNoTWFVSGwwYUc5dQorSUZOdlpuUjNZWEpsSUVadmRXNWtZWFJwYjI0eEVqQVFCZ05WQkFNVENXeHZZMkZzYUc5emREQWVGdzB4TURFdworTURneU16QXhOVFphRncweU1ERXdNRFV5TXpBeE5UWmFNRjh4Q3pBSkJnTlZCQVlUQWxoWk1SY3dGUVlEVlFRSAorRXc1RFlYTjBiR1VnUVc1MGFISmhlREVqTUNFR0ExVUVDaE1hVUhsMGFHOXVJRk52Wm5SM1lYSmxJRVp2ZFc1aworWVhScGIyNHhFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkRENCbnpBTkJna3Foa2lHOXcwQkFRRUZBQU9CalFBdworZ1lrQ2dZRUEyMXZUNWlzcTdGNjhhbVl1dU5wU0ZsS0RQck1VQ2E0WVdZcVpSdDJPWisvM05LYVoyeEFpU3dyNworNk1yUUY3MHQ1bkxiU1BwcUU1KzVWclM1OFNZK2cvc1hMaUZkNkFwbEgxd0pad2g3OERvZmJGWVhVZ2drdEZNdAorcFR5aVg4anRQNjZia2NQa0RBREEwODlSSTFUUVI2Q2ErbjdIRmE3YzFmYWJWVjZpM3prQ0F3RUFBYU1ZTUJZdworRkFZRFZSMFJCQTB3QzRJSmJHOWpZV3hvYjNOME1BMEdDU3FHU0liM0RRRUJCUVVBQTRHQkFIUGN0UUJFUTR3ZAorQko2K0pjcElyYW9wTG44QkdoYmpOV2o0MG1tUnFXQi9OQVdGNk01bmU3S3BHQXU3dExlRzRoYjF6TGFsZEs4RworbHh5MkdQU1JGNkxGUzQ4ZHBFajJIYk12Mm52djZ4eGFsRE1KOStEaWNXZ0FLVFE2YmNYMmozR1VrQ1IwZy9UMQorQ1JsTkJBQWx2aEt6TzdDbHBmOWwwWUtCRWZyYUpCeVgKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9saXN0X3Rlc3RzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhkNmQ2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9saXN0X3Rlc3RzLnB5CkBAIC0wLDAgKzEsNTM0IEBACisiIiIKK1Rlc3RzIGNvbW1vbiB0byBsaXN0IGFuZCBVc2VyTGlzdC5Vc2VyTGlzdAorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgc2VxX3Rlc3RzCisKK2NsYXNzIENvbW1vblRlc3Qoc2VxX3Rlc3RzLkNvbW1vblRlc3QpOgorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBJdGVyYWJsZSBhcmcgaXMgb3B0aW9uYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChbXSksIHNlbGYudHlwZTJ0ZXN0KCkpCisKKyAgICAgICAgIyBJbml0IGNsZWFycyBwcmV2aW91cyB2YWx1ZXMKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAyLCAzXSkKKyAgICAgICAgYS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoW10pKQorCisgICAgICAgICMgSW5pdCBvdmVyd3JpdGVzIHByZXZpb3VzIHZhbHVlcworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzEsIDIsIDNdKQorICAgICAgICBhLl9faW5pdF9fKFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbNCwgNSwgNl0pKQorCisgICAgICAgICMgTXV0YWJsZXMgYWx3YXlzIHJldHVybiBhIG5ldyBvYmplY3QKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYSksIGlkKGIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBsMCA9IFtdCisgICAgICAgIGwyID0gWzAsIDEsIDJdCisgICAgICAgIGEwID0gc2VsZi50eXBlMnRlc3QobDApCisgICAgICAgIGEyID0gc2VsZi50eXBlMnRlc3QobDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYTApLCBzdHIobDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYTApLCByZXByKGwwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEyKSwgcmVwcihsMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEyKSwgIlswLCAxLCAyXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhMiksICJbMCwgMSwgMl0iKQorCisgICAgICAgIGEyLmFwcGVuZChhMikKKyAgICAgICAgYTIuYXBwZW5kKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEyKSwgIlswLCAxLCAyLCBbLi4uXSwgM10iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYTIpLCAiWzAsIDEsIDIsIFsuLi5dLCAzXSIpCisKKyAgICAgICAgbDAgPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCkgKyAxMDApOgorICAgICAgICAgICAgbDAgPSBbbDBdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcmVwciwgbDApCisKKyAgICBkZWYgdGVzdF9wcmludChzZWxmKToKKyAgICAgICAgZCA9IHNlbGYudHlwZTJ0ZXN0KHhyYW5nZSgyMDApKQorICAgICAgICBkLmFwcGVuZChkKQorICAgICAgICBkLmV4dGVuZCh4cmFuZ2UoMjAwLDQwMCkpCisgICAgICAgIGQuYXBwZW5kKGQpCisgICAgICAgIGQuYXBwZW5kKDQwMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGZvOgorICAgICAgICAgICAgICAgIHByaW50ID4+IGZvLCBkLAorICAgICAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGZvOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZCgpLCByZXByKGQpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9zZXRfc3Vic2NyaXB0KHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoMjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLl9fc2V0aXRlbV9fLCBzbGljZSgwLCAxMCwgMCksIFsxLDIsM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXywgc2xpY2UoMCwgMTApLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLl9fc2V0aXRlbV9fLCBzbGljZSgwLCAxMCwgMiksIFsxLDJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19nZXRpdGVtX18sICd4JywgMSkKKyAgICAgICAgYVtzbGljZSgyLDEwLDMpXSA9IFsxLDIsM10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMCwgMSwgMSwgMywgNCwgMiwgNiwgNywgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDE3LCAxOCwgMTldKSkKKworICAgIGRlZiB0ZXN0X3JldmVyc2VkKHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoMjApKQorICAgICAgICByID0gcmV2ZXJzZWQoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHIpLCBzZWxmLnR5cGUydGVzdChyYW5nZSgxOSwgLTEsIC0xKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHIubmV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkKHNlbGYudHlwZTJ0ZXN0KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnR5cGUydGVzdCgpKQorICAgICAgICAjIEJ1ZyAzNjg5OiBtYWtlIHN1cmUgbGlzdC1yZXZlcnNlZC1pdGVyYXRvciBkb2Vzbid0IGhhdmUgX19sZW5fXworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxlbiwgcmV2ZXJzZWQoWzEsMiwzXSkpCisKKyAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBhWzBdID0gMAorICAgICAgICBhWzFdID0gMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsIDEwMF0pKQorICAgICAgICBhWy0xXSA9IDIwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFswLCAyMDBdKSkKKyAgICAgICAgYVstMl0gPSAxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMTAwLCAyMDBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX3NldGl0ZW1fXywgLTMsIDIwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX3NldGl0ZW1fXywgMiwgMjAwKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX3NldGl0ZW1fXywgMCwgMjAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fc2V0aXRlbV9fLCAtMSwgMjAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18pCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLDEsMiwzLDRdKQorICAgICAgICBhWzBMXSA9IDEKKyAgICAgICAgYVsxTF0gPSAyCisgICAgICAgIGFbMkxdID0gMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFsxLDIsMywzLDRdKSkKKyAgICAgICAgYVswXSA9IDUKKyAgICAgICAgYVsxXSA9IDYKKyAgICAgICAgYVsyXSA9IDcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbNSw2LDcsMyw0XSkpCisgICAgICAgIGFbLTJMXSA9IDg4CisgICAgICAgIGFbLTFMXSA9IDk5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzUsNiw3LDg4LDk5XSkpCisgICAgICAgIGFbLTJdID0gOAorICAgICAgICBhWy0xXSA9IDkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbNSw2LDcsOCw5XSkpCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBkZWwgYVsxXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFswXSkKKyAgICAgICAgZGVsIGFbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbXSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBkZWwgYVstMl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMV0pCisgICAgICAgIGRlbCBhWy0xXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFtdKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19kZWxpdGVtX18sIC0zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fZGVsaXRlbV9fLCAyKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2RlbGl0ZW1fXywgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19kZWxpdGVtX18pCisKKyAgICBkZWYgdGVzdF9zZXRzbGljZShzZWxmKToKKyAgICAgICAgbCA9IFswLCAxXQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QobCkKKworICAgICAgICBmb3IgaSBpbiByYW5nZSgtMywgNCk6CisgICAgICAgICAgICBhWzppXSA9IGxbOmldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGwpCisgICAgICAgICAgICBhMiA9IGFbOl0KKyAgICAgICAgICAgIGEyWzppXSA9IGFbOmldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEyLCBhKQorICAgICAgICAgICAgYVtpOl0gPSBsW2k6XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBsKQorICAgICAgICAgICAgYTIgPSBhWzpdCisgICAgICAgICAgICBhMltpOl0gPSBhW2k6XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMiwgYSkKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKC0zLCA0KToKKyAgICAgICAgICAgICAgICBhW2k6al0gPSBsW2k6al0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGwpCisgICAgICAgICAgICAgICAgYTIgPSBhWzpdCisgICAgICAgICAgICAgICAgYTJbaTpqXSA9IGFbaTpqXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTIsIGEpCisKKyAgICAgICAgYWEyID0gYTJbOl0KKyAgICAgICAgYWEyWzowXSA9IFstMiwgLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWEyLCBbLTIsIC0xLCAwLCAxXSkKKyAgICAgICAgYWEyWzA6XSA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWEyLCBbXSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzEsIDIsIDMsIDQsIDVdKQorICAgICAgICBhWzotMV0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzEsIDIsIDMsIDQsIDUsIDVdKSkKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAyLCAzLCA0LCA1XSkKKyAgICAgICAgYVsxOl0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzEsIDEsIDIsIDMsIDQsIDVdKSkKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAyLCAzLCA0LCA1XSkKKyAgICAgICAgYVsxOi0xXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMSwgMSwgMiwgMywgNCwgNSwgNV0pKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbXSkKKyAgICAgICAgYVs6XSA9IHR1cGxlKHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChyYW5nZSgxMCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldHNsaWNlX18sIDAsIDEsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXywgc2xpY2UoMCwgMSwgNSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0c2xpY2VfXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0aXRlbV9fKQorCisgICAgZGVmIHRlc3RfZGVsc2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWzE6Ml0KKyAgICAgICAgZGVsIGFbMDoxXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFtdKSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBkZWwgYVsxTDoyTF0KKyAgICAgICAgZGVsIGFbMEw6MUxdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoW10pKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWy0yOi0xXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFsxXSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgZGVsIGFbLTJMOi0xTF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMV0pKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWzE6XQorICAgICAgICBkZWwgYVs6MV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbXSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgZGVsIGFbMUw6XQorICAgICAgICBkZWwgYVs6MUxdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoW10pKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWy0xOl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbMF0pKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIGRlbCBhWy0xTDpdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzBdKSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBkZWwgYVs6XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFtdKSkKKworICAgIGRlZiB0ZXN0X2FwcGVuZChzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFtdKQorICAgICAgICBhLmFwcGVuZCgwKQorICAgICAgICBhLmFwcGVuZCgxKQorICAgICAgICBhLmFwcGVuZCgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyXSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmFwcGVuZCkKKworICAgIGRlZiB0ZXN0X2V4dGVuZChzZWxmKToKKyAgICAgICAgYTEgPSBzZWxmLnR5cGUydGVzdChbMF0pCisgICAgICAgIGEyID0gc2VsZi50eXBlMnRlc3QoKDAsIDEpKQorICAgICAgICBhID0gYTFbOl0KKyAgICAgICAgYS5leHRlbmQoYTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYTEgKyBhMikKKworICAgICAgICBhLmV4dGVuZChzZWxmLnR5cGUydGVzdChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYTEgKyBhMikKKworICAgICAgICBhLmV4dGVuZChhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFswLCAwLCAxLCAwLCAwLCAxXSkpCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KCJzcGFtIikKKyAgICAgICAgYS5leHRlbmQoImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGxpc3QoInNwYW1lZ2dzIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmV4dGVuZCwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuZXh0ZW5kKQorCisgICAgZGVmIHRlc3RfaW5zZXJ0KHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKQorICAgICAgICBhLmluc2VydCgwLCAtMikKKyAgICAgICAgYS5pbnNlcnQoMSwgLTEpCisgICAgICAgIGEuaW5zZXJ0KDIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWy0yLCAtMSwgMCwgMCwgMSwgMl0pCisKKyAgICAgICAgYiA9IGFbOl0KKyAgICAgICAgYi5pbnNlcnQoLTIsICJmb28iKQorICAgICAgICBiLmluc2VydCgtMjAwLCAibGVmdCIpCisgICAgICAgIGIuaW5zZXJ0KDIwMCwgInJpZ2h0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBzZWxmLnR5cGUydGVzdChbImxlZnQiLC0yLC0xLDAsMCwiZm9vIiwxLDIsInJpZ2h0Il0pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5pbnNlcnQpCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbLTEsIDAsIDFdKQorICAgICAgICBhLnBvcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWy0xLCAwXSkKKyAgICAgICAgYS5wb3AoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEucG9wLCA1KQorICAgICAgICBhLnBvcCgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLnBvcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLnBvcCwgNDIsIDQyKQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDEwLCAyMCwgMzAsIDQwXSkKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAwLCAxXSkKKyAgICAgICAgYS5yZW1vdmUoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMCwgMF0pCisgICAgICAgIGEucmVtb3ZlKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgWzBdKQorICAgICAgICBhLnJlbW92ZSgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFtdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEucmVtb3ZlLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5yZW1vdmUpCisKKyAgICAgICAgY2xhc3MgQmFkRXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkQ21wOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgb3RoZXIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkRXhjKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCYWRFeGMsIGEucmVtb3ZlLCBCYWRDbXAoKSkKKworICAgICAgICBjbGFzcyBCYWRDbXAyOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgQmFkRXhjKCkKKworICAgICAgICBkID0gc2VsZi50eXBlMnRlc3QoJ2FiY2RlZmdoY2lqJykKKyAgICAgICAgZC5yZW1vdmUoJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHNlbGYudHlwZTJ0ZXN0KCdhYmRlZmdoY2lqJykpCisgICAgICAgIGQucmVtb3ZlKCdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBzZWxmLnR5cGUydGVzdCgnYWJkZWZnaGlqJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGQucmVtb3ZlLCAnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgc2VsZi50eXBlMnRlc3QoJ2FiZGVmZ2hpaicpKQorCisgICAgICAgICMgSGFuZGxlIGNvbXBhcmlzb24gZXJyb3JzCisgICAgICAgIGQgPSBzZWxmLnR5cGUydGVzdChbJ2EnLCAnYicsIEJhZENtcDIoKSwgJ2MnXSkKKyAgICAgICAgZSA9IHNlbGYudHlwZTJ0ZXN0KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJhZEV4YywgZC5yZW1vdmUsICdjJykKKyAgICAgICAgZm9yIHgsIHkgaW4gemlwKGQsIGUpOgorICAgICAgICAgICAgIyB2ZXJpZnkgdGhhdCBvcmlnaW5hbCBvcmRlciBhbmQgdmFsdWVzIGFyZSByZXRhaW5lZC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoeCwgeSkKKworICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYpOgorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKSozCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5jb3VudCgwKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmNvdW50KDEpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuY291bnQoMyksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmNvdW50KQorCisgICAgICAgIGNsYXNzIEJhZEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEJhZENtcDoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIG90aGVyID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZEV4YygpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQmFkRXhjLCBhLmNvdW50LCBCYWRDbXAoKSkKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdS5pbmRleCwgMikKKworICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWy0yLCAtMSwgMCwgMCwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5jb3VudCgwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDApLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCwgMiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgtMiwgLTEwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDAsIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMCwgMywgNCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUuaW5kZXgsIDIsIDAsIC0xMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUuaW5kZXgpCisKKyAgICAgICAgY2xhc3MgQmFkRXhjKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkQ21wOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgb3RoZXIgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQmFkRXhjKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCYWRFeGMsIGEuaW5kZXgsIEJhZENtcCgpKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbLTIsIC0xLCAwLCAwLCAxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDApLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgMiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAtNCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgtMiwgLTEwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgLTMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgMywgNCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAtMywgLTIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgLTQqc3lzLm1heGludCwgNCpzeXMubWF4aW50KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5pbmRleCwgMCwgNCpzeXMubWF4aW50LC00KnN5cy5tYXhpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuaW5kZXgsIDIsIDAsIC0xMCkKKyAgICAgICAgYS5yZW1vdmUoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5pbmRleCwgMiwgMCwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBzZWxmLnR5cGUydGVzdChbLTIsIC0xLCAwLCAxLCAyXSkpCisKKyAgICAgICAgIyBUZXN0IG1vZGlmeWluZyB0aGUgbGlzdCBkdXJpbmcgaW5kZXgncyBpdGVyYXRpb24KKyAgICAgICAgY2xhc3MgRXZpbENtcDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2aWN0aW0pOgorICAgICAgICAgICAgICAgIHNlbGYudmljdGltID0gdmljdGltCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi52aWN0aW1bOl0KKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KCkKKyAgICAgICAgYVs6XSA9IFtFdmlsQ21wKGEpIGZvciBfIGluIHhyYW5nZSgxMDApXQorICAgICAgICAjIFRoaXMgdXNlZCB0byBzZWcgZmF1bHQgYmVmb3JlIHBhdGNoICMxMDA1Nzc4CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuaW5kZXgsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWy0yLCAtMSwgMCwgMSwgMl0pCisgICAgICAgIHUyID0gdVs6XQorICAgICAgICB1LnJldmVyc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIFsyLCAxLCAwLCAtMSwgLTJdKQorICAgICAgICB1LnJldmVyc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHUyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdS5yZXZlcnNlLCA0MikKKworICAgIGRlZiB0ZXN0X3NvcnQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAgICAgKCJ0aGUgY21wIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3Rfc29ydCgpCisKKyAgICBkZWYgX3Rlc3Rfc29ydChzZWxmKToKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAwXSkKKyAgICAgICAgdS5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBbMCwgMV0pCisKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFsyLDEsMCwtMSwtMl0pCisgICAgICAgIHUuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgc2VsZi50eXBlMnRlc3QoWy0yLC0xLDAsMSwyXSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1LnNvcnQsIDQyLCA0MikKKworICAgICAgICBkZWYgcmV2Y21wKGEsIGIpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChiLCBhKQorICAgICAgICB1LnNvcnQocmV2Y21wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHNlbGYudHlwZTJ0ZXN0KFsyLDEsMCwtMSwtMl0pKQorCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBkdW1wcyBjb3JlIGluIHVucGF0Y2hlZCBQeXRob24gMS41OgorICAgICAgICBkZWYgbXlDb21wYXJpc29uKHgseSk6CisgICAgICAgICAgICByZXR1cm4gY21wKHglMywgeSU3KQorICAgICAgICB6ID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoMTIpKQorICAgICAgICB6LnNvcnQobXlDb21wYXJpc29uKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5zb3J0LCAyKQorCisgICAgICAgIGRlZiBzZWxmbW9kaWZ5aW5nQ29tcGFyaXNvbih4LHkpOgorICAgICAgICAgICAgei5hcHBlbmQoMSkKKyAgICAgICAgICAgIHJldHVybiBjbXAoeCwgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgei5zb3J0LCBzZWxmbW9kaWZ5aW5nQ29tcGFyaXNvbikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHouc29ydCwgbGFtYmRhIHgsIHk6ICdzJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHouc29ydCwgNDIsIDQyLCA0MiwgNDIpCisKKyAgICBkZWYgdGVzdF9zbGljZShzZWxmKToKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KCJzcGFtIikKKyAgICAgICAgdVs6Ml0gPSAiaCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBsaXN0KCJoYW0iKSkKKworICAgIGRlZiB0ZXN0X2lhZGQoc2VsZik6CisgICAgICAgIHN1cGVyKENvbW1vblRlc3QsIHNlbGYpLnRlc3RfaWFkZCgpCisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIHUyID0gdQorICAgICAgICB1ICs9IFsyLCAzXQorICAgICAgICBzZWxmLmFzc2VydElzKHUsIHUyKQorCisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdCgic3BhbSIpCisgICAgICAgIHUgKz0gImVnZ3MiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgc2VsZi50eXBlMnRlc3QoInNwYW1lZ2dzIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1Ll9faWFkZF9fLCBOb25lKQorCisgICAgZGVmIHRlc3RfaW11bChzZWxmKToKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgdSAqPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgc2VsZi50eXBlMnRlc3QoWzAsIDEsIDAsIDEsIDAsIDFdKSkKKyAgICAgICAgdSAqPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgc2VsZi50eXBlMnRlc3QoW10pKQorICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoW10pCisgICAgICAgIG9sZGlkID0gaWQocykKKyAgICAgICAgcyAqPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKHMpLCBvbGRpZCkKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkc2xpY2luZyhzZWxmKToKKyAgICAgICAgIyAgc3Vic2NyaXB0CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMCwxLDIsMyw0XSkKKworICAgICAgICAjICBkZWxldGlvbgorICAgICAgICBkZWwgYVs6OjJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzEsM10pKQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoNSkpCisgICAgICAgIGRlbCBhWzE6OjJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsMiw0XSkpCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChyYW5nZSg1KSkKKyAgICAgICAgZGVsIGFbMTo6LTJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsMiwzLDRdKSkKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDEwKSkKKyAgICAgICAgZGVsIGFbOjoxMDAwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XSkpCisgICAgICAgICMgIGFzc2lnbm1lbnQKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDEwKSkKKyAgICAgICAgYVs6OjJdID0gWy0xXSo1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWy0xLCAxLCAtMSwgMywgLTEsIDUsIC0xLCA3LCAtMSwgOV0pKQorICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QocmFuZ2UoMTApKQorICAgICAgICBhWzo6LTRdID0gWzEwXSozCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgc2VsZi50eXBlMnRlc3QoWzAsIDEwLCAyLCAzLCA0LCAxMCwgNiwgNywgOCAsMTBdKSkKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDQpKQorICAgICAgICBhWzo6LTFdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFszLCAyLCAxLCAwXSkpCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChyYW5nZSgxMCkpCisgICAgICAgIGIgPSBhWzpdCisgICAgICAgIGMgPSBhWzpdCisgICAgICAgIGFbMjozXSA9IHNlbGYudHlwZTJ0ZXN0KFsidHdvIiwgImVsZW1lbnRzIl0pCisgICAgICAgIGJbc2xpY2UoMiwzKV0gPSBzZWxmLnR5cGUydGVzdChbInR3byIsICJlbGVtZW50cyJdKQorICAgICAgICBjWzI6MzpdID0gc2VsZi50eXBlMnRlc3QoWyJ0d28iLCAiZWxlbWVudHMiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGMpCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChyYW5nZSgxMCkpCisgICAgICAgIGFbOjoyXSA9IHR1cGxlKHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAxLCAzLCAyLCA1LCAzLCA3LCA0LCA5XSkpCisgICAgICAgICMgdGVzdCBpc3N1ZTc3ODgKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KHJhbmdlKDEwKSkKKyAgICAgICAgZGVsIGFbOTo6MTw8MzMzXQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3JfZXhjZXB0aW9uX2hhbmRsaW5nKHNlbGYpOgorICAgICAgICAjIEJ1ZyAjMTI0MjY1NworICAgICAgICBjbGFzcyBGKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIGxpc3QsIEYoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9saXN0X3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9saXN0X3Rlc3RzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg3YTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9saXN0X3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9saXN0X3Rlc3RzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzg3YTgyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L2xpc3RfdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L2xvY2tfdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2ZjliZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5CkBAIC0wLDAgKzEsNTQ2IEBACisiIiIKK1ZhcmlvdXMgdGVzdHMgZm9yIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgorIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitmcm9tIHRocmVhZCBpbXBvcnQgc3RhcnRfbmV3X3RocmVhZCwgZ2V0X2lkZW50CitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorCisKK2RlZiBfd2FpdCgpOgorICAgICMgQSBjcnVkZSB3YWl0L3lpZWxkIGZ1bmN0aW9uIG5vdCByZWx5aW5nIG9uIHN5bmNocm9uaXphdGlvbiBwcmltaXRpdmVzLgorICAgIHRpbWUuc2xlZXAoMC4wMSkKKworY2xhc3MgQnVuY2gob2JqZWN0KToKKyAgICAiIiIKKyAgICBBIGJ1bmNoIG9mIHRocmVhZHMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYsIG4sIHdhaXRfYmVmb3JlX2V4aXQ9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgQ29uc3RydWN0IGEgYnVuY2ggb2YgYG5gIHRocmVhZHMgcnVubmluZyB0aGUgc2FtZSBmdW5jdGlvbiBgZmAuCisgICAgICAgIElmIGB3YWl0X2JlZm9yZV9leGl0YCBpcyBUcnVlLCB0aGUgdGhyZWFkcyB3b24ndCB0ZXJtaW5hdGUgdW50aWwKKyAgICAgICAgZG9fZmluaXNoKCkgaXMgY2FsbGVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5mID0gZgorICAgICAgICBzZWxmLm4gPSBuCisgICAgICAgIHNlbGYuc3RhcnRlZCA9IFtdCisgICAgICAgIHNlbGYuZmluaXNoZWQgPSBbXQorICAgICAgICBzZWxmLl9jYW5fZXhpdCA9IG5vdCB3YWl0X2JlZm9yZV9leGl0CisgICAgICAgIGRlZiB0YXNrKCk6CisgICAgICAgICAgICB0aWQgPSBnZXRfaWRlbnQoKQorICAgICAgICAgICAgc2VsZi5zdGFydGVkLmFwcGVuZCh0aWQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoZWQuYXBwZW5kKHRpZCkKKyAgICAgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5fY2FuX2V4aXQ6CisgICAgICAgICAgICAgICAgICAgIF93YWl0KCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICBzdGFydF9uZXdfdGhyZWFkKHRhc2ssICgpKQorCisgICAgZGVmIHdhaXRfZm9yX3N0YXJ0ZWQoc2VsZik6CisgICAgICAgIHdoaWxlIGxlbihzZWxmLnN0YXJ0ZWQpIDwgc2VsZi5uOgorICAgICAgICAgICAgX3dhaXQoKQorCisgICAgZGVmIHdhaXRfZm9yX2ZpbmlzaGVkKHNlbGYpOgorICAgICAgICB3aGlsZSBsZW4oc2VsZi5maW5pc2hlZCkgPCBzZWxmLm46CisgICAgICAgICAgICBfd2FpdCgpCisKKyAgICBkZWYgZG9fZmluaXNoKHNlbGYpOgorICAgICAgICBzZWxmLl9jYW5fZXhpdCA9IFRydWUKKworCitjbGFzcyBCYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fdGhyZWFkcyA9IHN1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKyAgICAgICAgc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworCitjbGFzcyBCYXNlTG9ja1Rlc3RzKEJhc2VUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdHMgZm9yIGJvdGggcmVjdXJzaXZlIGFuZCBub24tcmVjdXJzaXZlIGxvY2tzLgorICAgICIiIgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgZGVsIGxvY2sKKworICAgIGRlZiB0ZXN0X2FjcXVpcmVfZGVzdHJveShzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBkZWwgbG9jaworCisgICAgZGVmIHRlc3RfYWNxdWlyZV9yZWxlYXNlKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIGRlbCBsb2NrCisKKyAgICBkZWYgdGVzdF90cnlfYWNxdWlyZShzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9jay5hY3F1aXJlKEZhbHNlKSkKKyAgICAgICAgbG9jay5yZWxlYXNlKCkKKworICAgIGRlZiB0ZXN0X3RyeV9hY3F1aXJlX2NvbnRlbmRlZChzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsb2NrLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICBCdW5jaChmLCAxKS53YWl0X2Zvcl9maW5pc2hlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0WzBdKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHRlc3RfYWNxdWlyZV9jb250ZW5kZWQoc2VsZik6CisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgTiA9IDUKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQorCisgICAgICAgIGIgPSBCdW5jaChmLCBOKQorICAgICAgICBiLndhaXRfZm9yX3N0YXJ0ZWQoKQorICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIuZmluaXNoZWQpLCAwKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBiLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYi5maW5pc2hlZCksIE4pCisKKyAgICBkZWYgdGVzdF93aXRoKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgbG9jay5yZWxlYXNlKCkKKyAgICAgICAgZGVmIF93aXRoKGVycj1Ob25lKToKKyAgICAgICAgICAgIHdpdGggbG9jazoKKyAgICAgICAgICAgICAgICBpZiBlcnIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGVycgorICAgICAgICBfd2l0aCgpCisgICAgICAgICMgQ2hlY2sgdGhlIGxvY2sgaXMgdW5hY3F1aXJlZAorICAgICAgICBCdW5jaChmLCAxKS53YWl0X2Zvcl9maW5pc2hlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX3dpdGgsIFR5cGVFcnJvcikKKyAgICAgICAgIyBDaGVjayB0aGUgbG9jayBpcyB1bmFjcXVpcmVkCisgICAgICAgIEJ1bmNoKGYsIDEpLndhaXRfZm9yX2ZpbmlzaGVkKCkKKworICAgIGRlZiB0ZXN0X3RocmVhZF9sZWFrKHNlbGYpOgorICAgICAgICAjIFRoZSBsb2NrIHNob3VsZG4ndCBsZWFrIGEgVGhyZWFkIGluc3RhbmNlIHdoZW4gdXNlZCBmcm9tIGEgZm9yZWlnbgorICAgICAgICAjIChub24tdGhyZWFkaW5nKSB0aHJlYWQuCisgICAgICAgIGxvY2sgPSBzZWxmLmxvY2t0eXBlKCkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBuID0gbGVuKHRocmVhZGluZy5lbnVtZXJhdGUoKSkKKyAgICAgICAgIyBXZSBydW4gbWFueSB0aHJlYWRzIGluIHRoZSBob3BlIHRoYXQgZXhpc3RpbmcgdGhyZWFkcyBpZHMgd29uJ3QKKyAgICAgICAgIyBiZSByZWN5Y2xlZC4KKyAgICAgICAgQnVuY2goZiwgMTUpLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCBsZW4odGhyZWFkaW5nLmVudW1lcmF0ZSgpKSkKKworCitjbGFzcyBMb2NrVGVzdHMoQmFzZUxvY2tUZXN0cyk6CisgICAgIiIiCisgICAgVGVzdHMgZm9yIG5vbi1yZWN1cnNpdmUsIHdlYWsgbG9ja3MKKyAgICAod2hpY2ggY2FuIGJlIGFjcXVpcmVkIGFuZCByZWxlYXNlZCBmcm9tIGRpZmZlcmVudCB0aHJlYWRzKS4KKyAgICAiIiIKKyAgICBkZWYgdGVzdF9yZWFjcXVpcmUoc2VsZik6CisgICAgICAgICMgTG9jayBuZWVkcyB0byBiZSByZWxlYXNlZCBiZWZvcmUgcmUtYWNxdWlyaW5nLgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHBoYXNlID0gW10KKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBwaGFzZS5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgICAgICBwaGFzZS5hcHBlbmQoTm9uZSkKKyAgICAgICAgc3RhcnRfbmV3X3RocmVhZChmLCAoKSkKKyAgICAgICAgd2hpbGUgbGVuKHBoYXNlKSA9PSAwOgorICAgICAgICAgICAgX3dhaXQoKQorICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBoYXNlKSwgMSkKKyAgICAgICAgbG9jay5yZWxlYXNlKCkKKyAgICAgICAgd2hpbGUgbGVuKHBoYXNlKSA9PSAxOgorICAgICAgICAgICAgX3dhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwaGFzZSksIDIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbnRfdGhyZWFkKHNlbGYpOgorICAgICAgICAjIExvY2sgY2FuIGJlIHJlbGVhc2VkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkLgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBiID0gQnVuY2goZiwgMSkKKyAgICAgICAgYi53YWl0X2Zvcl9maW5pc2hlZCgpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisKKworY2xhc3MgUkxvY2tUZXN0cyhCYXNlTG9ja1Rlc3RzKToKKyAgICAiIiIKKyAgICBUZXN0cyBmb3IgcmVjdXJzaXZlIGxvY2tzLgorICAgICIiIgorICAgIGRlZiB0ZXN0X3JlYWNxdWlyZShzZWxmKToKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorCisgICAgZGVmIHRlc3RfcmVsZWFzZV91bmFjcXVpcmVkKHNlbGYpOgorICAgICAgICAjIENhbm5vdCByZWxlYXNlIGFuIHVuYWNxdWlyZWQgbG9jaworICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgbG9jay5yZWxlYXNlKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBsb2NrLmFjcXVpcmUoKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGxvY2sucmVsZWFzZSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVudF90aHJlYWQoc2VsZik6CisgICAgICAgICMgQ2Fubm90IHJlbGVhc2UgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQKKyAgICAgICAgbG9jayA9IHNlbGYubG9ja3R5cGUoKQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgYiA9IEJ1bmNoKGYsIDEsIFRydWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgbG9jay5yZWxlYXNlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgYi5kb19maW5pc2goKQorCisgICAgZGVmIHRlc3RfX2lzX293bmVkKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5sb2NrdHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9jay5faXNfb3duZWQoKSkKKyAgICAgICAgbG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvY2suX2lzX293bmVkKCkpCisgICAgICAgIGxvY2suYWNxdWlyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NrLl9pc19vd25lZCgpKQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsb2NrLl9pc19vd25lZCgpKQorICAgICAgICBCdW5jaChmLCAxKS53YWl0X2Zvcl9maW5pc2hlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0WzBdKQorICAgICAgICBsb2NrLnJlbGVhc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9jay5faXNfb3duZWQoKSkKKyAgICAgICAgbG9jay5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2NrLl9pc19vd25lZCgpKQorCisKK2NsYXNzIEV2ZW50VGVzdHMoQmFzZVRlc3RDYXNlKToKKyAgICAiIiIKKyAgICBUZXN0cyBmb3IgRXZlbnQgb2JqZWN0cy4KKyAgICAiIiIKKworICAgIGRlZiB0ZXN0X2lzX3NldChzZWxmKToKKyAgICAgICAgZXZ0ID0gc2VsZi5ldmVudHR5cGUoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGV2dC5pc19zZXQoKSkKKyAgICAgICAgZXZ0LnNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldnQuaXNfc2V0KCkpCisgICAgICAgIGV2dC5zZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZ0LmlzX3NldCgpKQorICAgICAgICBldnQuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGV2dC5pc19zZXQoKSkKKyAgICAgICAgZXZ0LmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShldnQuaXNfc2V0KCkpCisKKyAgICBkZWYgX2NoZWNrX25vdGlmeShzZWxmLCBldnQpOgorICAgICAgICAjIEFsbCB0aHJlYWRzIGdldCBub3RpZmllZAorICAgICAgICBOID0gNQorICAgICAgICByZXN1bHRzMSA9IFtdCisgICAgICAgIHJlc3VsdHMyID0gW10KKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHJlc3VsdHMxLmFwcGVuZChldnQud2FpdCgpKQorICAgICAgICAgICAgcmVzdWx0czIuYXBwZW5kKGV2dC53YWl0KCkpCisgICAgICAgIGIgPSBCdW5jaChmLCBOKQorICAgICAgICBiLndhaXRfZm9yX3N0YXJ0ZWQoKQorICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdHMxKSwgMCkKKyAgICAgICAgZXZ0LnNldCgpCisgICAgICAgIGIud2FpdF9mb3JfZmluaXNoZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMxLCBbVHJ1ZV0gKiBOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMyLCBbVHJ1ZV0gKiBOKQorCisgICAgZGVmIHRlc3Rfbm90aWZ5KHNlbGYpOgorICAgICAgICBldnQgPSBzZWxmLmV2ZW50dHlwZSgpCisgICAgICAgIHNlbGYuX2NoZWNrX25vdGlmeShldnQpCisgICAgICAgICMgQW5vdGhlciB0aW1lLCBhZnRlciBhbiBleHBsaWNpdCBjbGVhcigpCisgICAgICAgIGV2dC5zZXQoKQorICAgICAgICBldnQuY2xlYXIoKQorICAgICAgICBzZWxmLl9jaGVja19ub3RpZnkoZXZ0KQorCisgICAgZGVmIHRlc3RfdGltZW91dChzZWxmKToKKyAgICAgICAgZXZ0ID0gc2VsZi5ldmVudHR5cGUoKQorICAgICAgICByZXN1bHRzMSA9IFtdCisgICAgICAgIHJlc3VsdHMyID0gW10KKyAgICAgICAgTiA9IDUKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHJlc3VsdHMxLmFwcGVuZChldnQud2FpdCgwLjApKQorICAgICAgICAgICAgdDEgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgciA9IGV2dC53YWl0KDAuMikKKyAgICAgICAgICAgIHQyID0gdGltZS50aW1lKCkKKyAgICAgICAgICAgIHJlc3VsdHMyLmFwcGVuZCgociwgdDIgLSB0MSkpCisgICAgICAgIEJ1bmNoKGYsIE4pLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzMSwgW0ZhbHNlXSAqIE4pCisgICAgICAgIGZvciByLCBkdCBpbiByZXN1bHRzMjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdCA+PSAwLjIsIGR0KQorICAgICAgICAjIFRoZSBldmVudCBpcyBzZXQKKyAgICAgICAgcmVzdWx0czEgPSBbXQorICAgICAgICByZXN1bHRzMiA9IFtdCisgICAgICAgIGV2dC5zZXQoKQorICAgICAgICBCdW5jaChmLCBOKS53YWl0X2Zvcl9maW5pc2hlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czEsIFtUcnVlXSAqIE4pCisgICAgICAgIGZvciByLCBkdCBpbiByZXN1bHRzMjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyKQorCisKK2NsYXNzIENvbmRpdGlvblRlc3RzKEJhc2VUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdHMgZm9yIGNvbmRpdGlvbiB2YXJpYWJsZXMuCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF9hY3F1aXJlKHNlbGYpOgorICAgICAgICBjb25kID0gc2VsZi5jb25kdHlwZSgpCisgICAgICAgICMgQmUgZGVmYXVsdCB3ZSBoYXZlIGFuIFJMb2NrOiB0aGUgY29uZGl0aW9uIGNhbiBiZSBhY3F1aXJlZCBtdWx0aXBsZQorICAgICAgICAjIHRpbWVzLgorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBjb25kLnJlbGVhc2UoKQorICAgICAgICBjb25kLnJlbGVhc2UoKQorICAgICAgICBsb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBjb25kID0gc2VsZi5jb25kdHlwZShsb2NrKQorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvY2suYWNxdWlyZShGYWxzZSkpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NrLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNvbmQuYWNxdWlyZShGYWxzZSkpCisgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgIHdpdGggY29uZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9jay5hY3F1aXJlKEZhbHNlKSkKKworICAgIGRlZiB0ZXN0X3VuYWNxdWlyZWRfd2FpdChzZWxmKToKKyAgICAgICAgY29uZCA9IHNlbGYuY29uZHR5cGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNvbmQud2FpdCkKKworICAgIGRlZiB0ZXN0X3VuYWNxdWlyZWRfbm90aWZ5KHNlbGYpOgorICAgICAgICBjb25kID0gc2VsZi5jb25kdHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY29uZC5ub3RpZnkpCisKKyAgICBkZWYgX2NoZWNrX25vdGlmeShzZWxmLCBjb25kKToKKyAgICAgICAgTiA9IDUKKyAgICAgICAgcmVzdWx0czEgPSBbXQorICAgICAgICByZXN1bHRzMiA9IFtdCisgICAgICAgIHBoYXNlX251bSA9IDAKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgICAgICBjb25kLndhaXQoKQorICAgICAgICAgICAgY29uZC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJlc3VsdHMxLmFwcGVuZChwaGFzZV9udW0pCisgICAgICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICAgICAgY29uZC53YWl0KCkKKyAgICAgICAgICAgIGNvbmQucmVsZWFzZSgpCisgICAgICAgICAgICByZXN1bHRzMi5hcHBlbmQocGhhc2VfbnVtKQorICAgICAgICBiID0gQnVuY2goZiwgTikKKyAgICAgICAgYi53YWl0X2Zvcl9zdGFydGVkKCkKKyAgICAgICAgX3dhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMxLCBbXSkKKyAgICAgICAgIyBOb3RpZnkgMyB0aHJlYWRzIGF0IGZpcnN0CisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIGNvbmQubm90aWZ5KDMpCisgICAgICAgIF93YWl0KCkKKyAgICAgICAgcGhhc2VfbnVtID0gMQorICAgICAgICBjb25kLnJlbGVhc2UoKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0czEpIDwgMzoKKyAgICAgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzMSwgWzFdICogMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzMiwgW10pCisgICAgICAgICMgTm90aWZ5IDUgdGhyZWFkczogdGhleSBtaWdodCBiZSBpbiB0aGVpciBmaXJzdCBvciBzZWNvbmQgd2FpdAorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBjb25kLm5vdGlmeSg1KQorICAgICAgICBfd2FpdCgpCisgICAgICAgIHBoYXNlX251bSA9IDIKKyAgICAgICAgY29uZC5yZWxlYXNlKCkKKyAgICAgICAgd2hpbGUgbGVuKHJlc3VsdHMxKSArIGxlbihyZXN1bHRzMikgPCA4OgorICAgICAgICAgICAgX3dhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMxLCBbMV0gKiAzICsgWzJdICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzMiwgWzJdICogMykKKyAgICAgICAgIyBOb3RpZnkgYWxsIHRocmVhZHM6IHRoZXkgYXJlIGFsbCBpbiB0aGVpciBzZWNvbmQgd2FpdAorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBjb25kLm5vdGlmeV9hbGwoKQorICAgICAgICBfd2FpdCgpCisgICAgICAgIHBoYXNlX251bSA9IDMKKyAgICAgICAgY29uZC5yZWxlYXNlKCkKKyAgICAgICAgd2hpbGUgbGVuKHJlc3VsdHMyKSA8IDU6CisgICAgICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czEsIFsxXSAqIDMgKyBbMl0gKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHMyLCBbMl0gKiAzICsgWzNdICogMikKKyAgICAgICAgYi53YWl0X2Zvcl9maW5pc2hlZCgpCisKKyAgICBkZWYgdGVzdF9ub3RpZnkoc2VsZik6CisgICAgICAgIGNvbmQgPSBzZWxmLmNvbmR0eXBlKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfbm90aWZ5KGNvbmQpCisgICAgICAgICMgQSBzZWNvbmQgdGltZSwgdG8gY2hlY2sgaW50ZXJuYWwgc3RhdGUgaXMgc3RpbGwgb2suCisgICAgICAgIHNlbGYuX2NoZWNrX25vdGlmeShjb25kKQorCisgICAgZGVmIHRlc3RfdGltZW91dChzZWxmKToKKyAgICAgICAgY29uZCA9IHNlbGYuY29uZHR5cGUoKQorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgTiA9IDUKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgICAgICB0MSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBjb25kLndhaXQoMC4yKQorICAgICAgICAgICAgdDIgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgY29uZC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHQyIC0gdDEpCisgICAgICAgIEJ1bmNoKGYsIE4pLndhaXRfZm9yX2ZpbmlzaGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0cyksIDUpCisgICAgICAgIGZvciBkdCBpbiByZXN1bHRzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR0ID49IDAuMiwgZHQpCisKKworY2xhc3MgQmFzZVNlbWFwaG9yZVRlc3RzKEJhc2VUZXN0Q2FzZSk6CisgICAgIiIiCisgICAgQ29tbW9uIHRlc3RzIGZvciB7Ym91bmRlZCwgdW5ib3VuZGVkfSBzZW1hcGhvcmUgb2JqZWN0cy4KKyAgICAiIiIKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnNlbXR5cGUsIHZhbHVlID0gLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuc2VtdHlwZSwgdmFsdWUgPSAtc3lzLm1heGludCkKKworICAgIGRlZiB0ZXN0X2FjcXVpcmUoc2VsZik6CisgICAgICAgIHNlbSA9IHNlbGYuc2VtdHlwZSgxKQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKDIpCisgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgc2VtLmFjcXVpcmUoKQorICAgICAgICBzZW0ucmVsZWFzZSgpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKworICAgIGRlZiB0ZXN0X2FjcXVpcmVfZGVzdHJveShzZWxmKToKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKCkKKyAgICAgICAgc2VtLmFjcXVpcmUoKQorICAgICAgICBkZWwgc2VtCisKKyAgICBkZWYgdGVzdF9hY3F1aXJlX2NvbnRlbmRlZChzZWxmKToKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKDcpCisgICAgICAgIHNlbS5hY3F1aXJlKCkKKyAgICAgICAgTiA9IDEwCisgICAgICAgIHJlc3VsdHMxID0gW10KKyAgICAgICAgcmVzdWx0czIgPSBbXQorICAgICAgICBwaGFzZV9udW0gPSAwCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgICAgICByZXN1bHRzMS5hcHBlbmQocGhhc2VfbnVtKQorICAgICAgICAgICAgc2VtLmFjcXVpcmUoKQorICAgICAgICAgICAgcmVzdWx0czIuYXBwZW5kKHBoYXNlX251bSkKKyAgICAgICAgYiA9IEJ1bmNoKGYsIDEwKQorICAgICAgICBiLndhaXRfZm9yX3N0YXJ0ZWQoKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0czEpICsgbGVuKHJlc3VsdHMyKSA8IDY6CisgICAgICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0czEgKyByZXN1bHRzMiwgWzBdICogNikKKyAgICAgICAgcGhhc2VfbnVtID0gMQorICAgICAgICBmb3IgaSBpbiByYW5nZSg3KToKKyAgICAgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgd2hpbGUgbGVuKHJlc3VsdHMxKSArIGxlbihyZXN1bHRzMikgPCAxMzoKKyAgICAgICAgICAgIF93YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQocmVzdWx0czEgKyByZXN1bHRzMiksIFswXSAqIDYgKyBbMV0gKiA3KQorICAgICAgICBwaGFzZV9udW0gPSAyCisgICAgICAgIGZvciBpIGluIHJhbmdlKDYpOgorICAgICAgICAgICAgc2VtLnJlbGVhc2UoKQorICAgICAgICB3aGlsZSBsZW4ocmVzdWx0czEpICsgbGVuKHJlc3VsdHMyKSA8IDE5OgorICAgICAgICAgICAgX3dhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChyZXN1bHRzMSArIHJlc3VsdHMyKSwgWzBdICogNiArIFsxXSAqIDcgKyBbMl0gKiA2KQorICAgICAgICAjIFRoZSBzZW1hcGhvcmUgaXMgc3RpbGwgbG9ja2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICAjIEZpbmFsIHJlbGVhc2UsIHRvIGxldCB0aGUgbGFzdCB0aHJlYWQgZmluaXNoCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgYi53YWl0X2Zvcl9maW5pc2hlZCgpCisKKyAgICBkZWYgdGVzdF90cnlfYWNxdWlyZShzZWxmKToKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZW0uYWNxdWlyZShGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICBzZW0ucmVsZWFzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZW0uYWNxdWlyZShGYWxzZSkpCisKKyAgICBkZWYgdGVzdF90cnlfYWNxdWlyZV9jb250ZW5kZWQoc2VsZik6CisgICAgICAgIHNlbSA9IHNlbGYuc2VtdHlwZSg0KQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIHJlc3VsdHMgPSBbXQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICBCdW5jaChmLCA1KS53YWl0X2Zvcl9maW5pc2hlZCgpCisgICAgICAgICMgVGhlcmUgY2FuIGJlIGEgdGhyZWFkIHN3aXRjaCBiZXR3ZWVuIGFjcXVpcmluZyB0aGUgc2VtYXBob3JlIGFuZAorICAgICAgICAjIGFwcGVuZGluZyB0aGUgcmVzdWx0LCB0aGVyZWZvcmUgcmVzdWx0cyB3aWxsIG5vdCBuZWNlc3NhcmlseSBiZQorICAgICAgICAjIG9yZGVyZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHJlc3VsdHMpLCBbRmFsc2VdICogNyArIFtUcnVlXSAqICAzICkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfdmFsdWUoc2VsZik6CisgICAgICAgICMgVGhlIGRlZmF1bHQgaW5pdGlhbCB2YWx1ZSBpcyAxLgorICAgICAgICBzZW0gPSBzZWxmLnNlbXR5cGUoKQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgICAgICBzZW0ucmVsZWFzZSgpCisgICAgICAgIGIgPSBCdW5jaChmLCAxKQorICAgICAgICBiLndhaXRfZm9yX3N0YXJ0ZWQoKQorICAgICAgICBfd2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYi5maW5pc2hlZCkKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorICAgICAgICBiLndhaXRfZm9yX2ZpbmlzaGVkKCkKKworICAgIGRlZiB0ZXN0X3dpdGgoc2VsZik6CisgICAgICAgIHNlbSA9IHNlbGYuc2VtdHlwZSgyKQorICAgICAgICBkZWYgX3dpdGgoZXJyPU5vbmUpOgorICAgICAgICAgICAgd2l0aCBzZW06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbS5hY3F1aXJlKEZhbHNlKSkKKyAgICAgICAgICAgICAgICBzZW0ucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgd2l0aCBzZW06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICAgICAgICAgICAgICBpZiBlcnI6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBlcnIKKyAgICAgICAgX3dpdGgoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VtLmFjcXVpcmUoRmFsc2UpKQorICAgICAgICBzZW0ucmVsZWFzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX3dpdGgsIFR5cGVFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbS5hY3F1aXJlKEZhbHNlKSkKKyAgICAgICAgc2VtLnJlbGVhc2UoKQorCitjbGFzcyBTZW1hcGhvcmVUZXN0cyhCYXNlU2VtYXBob3JlVGVzdHMpOgorICAgICIiIgorICAgIFRlc3RzIGZvciB1bmJvdW5kZWQgc2VtYXBob3Jlcy4KKyAgICAiIiIKKworICAgIGRlZiB0ZXN0X3JlbGVhc2VfdW5hY3F1aXJlZChzZWxmKToKKyAgICAgICAgIyBVbmJvdW5kZWQgcmVsZWFzZXMgYXJlIGFsbG93ZWQgYW5kIGluY3JlbWVudCB0aGUgc2VtYXBob3JlJ3MgdmFsdWUKKyAgICAgICAgc2VtID0gc2VsZi5zZW10eXBlKDEpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgc2VtLmFjcXVpcmUoKQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKworCitjbGFzcyBCb3VuZGVkU2VtYXBob3JlVGVzdHMoQmFzZVNlbWFwaG9yZVRlc3RzKToKKyAgICAiIiIKKyAgICBUZXN0cyBmb3IgYm91bmRlZCBzZW1hcGhvcmVzLgorICAgICIiIgorCisgICAgZGVmIHRlc3RfcmVsZWFzZV91bmFjcXVpcmVkKHNlbGYpOgorICAgICAgICAjIENhbm5vdCBnbyBwYXN0IHRoZSBpbml0aWFsIHZhbHVlCisgICAgICAgIHNlbSA9IHNlbGYuc2VtdHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbS5yZWxlYXNlKQorICAgICAgICBzZW0uYWNxdWlyZSgpCisgICAgICAgIHNlbS5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VtLnJlbGVhc2UpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbG9ja190ZXN0cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvbG9ja190ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxZTk4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbG9ja190ZXN0cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvbG9ja190ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxZTk4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9sb2NrX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0Mzc1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weQpAQCAtMCwwICsxLDY4NiBAQAorIyB0ZXN0cyBjb21tb24gdG8gZGljdCBhbmQgVXNlckRpY3QKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFVzZXJEaWN0CitpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoaXMgYmFzZSBjbGFzcyBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGF0IGFuIG9iamVjdCBjb25mb3JtcyB0byB0aGUKKyAgICAjIG1hcHBpbmcgcHJvdG9jb2wKKworICAgICMgRnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWZ1bCB0byBvdmVycmlkZSB0byBhZGFwdCB0byBkaWN0aW9uYXJ5CisgICAgIyBzZW1hbnRpY3MKKyAgICB0eXBlMnRlc3QgPSBOb25lICMgd2hpY2ggY2xhc3MgaXMgYmVpbmcgdGVzdGVkIChvdmVyd3JpdGUgaW4gc3ViY2xhc3NlcykKKworICAgIGRlZiBfcmVmZXJlbmNlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIHZhbHVlcyB3aGljaCBhcmUgaW52YXJpYW50IGJ5IHN0b3JhZ2UKKyAgICAgICAgaW4gdGhlIG9iamVjdCB1bmRlciB0ZXN0LiIiIgorICAgICAgICByZXR1cm4gezE6MiwgImtleTEiOiJ2YWx1ZTEiLCAia2V5MiI6KDEsMiwzKX0KKyAgICBkZWYgX2VtcHR5X21hcHBpbmcoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBlbXB0eSBtYXBwaW5nIG9iamVjdCIiIgorICAgICAgICByZXR1cm4gc2VsZi50eXBlMnRlc3QoKQorICAgIGRlZiBfZnVsbF9tYXBwaW5nKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiJSZXR1cm4gYSBtYXBwaW5nIG9iamVjdCB3aXRoIHRoZSB2YWx1ZSBjb250YWluZWQgaW4gZGF0YQorICAgICAgICBkaWN0aW9uYXJ5IiIiCisgICAgICAgIHggPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgeFtrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIHgKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQorICAgICAgICBzZWxmLnJlZmVyZW5jZSA9IHNlbGYuX3JlZmVyZW5jZSgpLmNvcHkoKQorCisgICAgICAgICMgQSAoa2V5LCB2YWx1ZSkgcGFpciBub3QgaW4gdGhlIG1hcHBpbmcKKyAgICAgICAga2V5LCB2YWx1ZSA9IHNlbGYucmVmZXJlbmNlLnBvcGl0ZW0oKQorICAgICAgICBzZWxmLm90aGVyID0ge2tleTp2YWx1ZX0KKworICAgICAgICAjIEEgKGtleSwgdmFsdWUpIHBhaXIgaW4gdGhlIG1hcHBpbmcKKyAgICAgICAga2V5LCB2YWx1ZSA9IHNlbGYucmVmZXJlbmNlLnBvcGl0ZW0oKQorICAgICAgICBzZWxmLmlubWFwcGluZyA9IHtrZXk6dmFsdWV9CisgICAgICAgIHNlbGYucmVmZXJlbmNlW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciByZWFkIG9ubHkgb3BlcmF0aW9ucyBvbiBtYXBwaW5nCisgICAgICAgIHAgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgcDEgPSBkaWN0KHApICN3b3JrYXJvdW5kIGZvciBzaW5nbGV0b24gb2JqZWN0cworICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHNlbGYucmVmZXJlbmNlKQorICAgICAgICBpZiBkIGlzIHA6CisgICAgICAgICAgICBwID0gcDEKKyAgICAgICAgI0luZGV4aW5nCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYucmVmZXJlbmNlLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRba2V5XSwgdmFsdWUpCisgICAgICAgIGtub3dua2V5ID0gc2VsZi5vdGhlci5rZXlzKClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTpkW2tub3dua2V5XSkKKyAgICAgICAgI2xlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIGxlbihzZWxmLnJlZmVyZW5jZSkpCisgICAgICAgICNpbgorICAgICAgICBmb3IgayBpbiBzZWxmLnJlZmVyZW5jZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgZCkKKyAgICAgICAgZm9yIGsgaW4gc2VsZi5vdGhlcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaywgZCkKKyAgICAgICAgI2hhc19rZXkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncyhxdWlldD1UcnVlKToKKyAgICAgICAgICAgIGZvciBrIGluIHNlbGYucmVmZXJlbmNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmhhc19rZXkoaykpCisgICAgICAgICAgICBmb3IgayBpbiBzZWxmLm90aGVyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZC5oYXNfa2V5KGspKQorICAgICAgICAjY21wCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAscCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGQsZCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAsZCksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkLHApLCAxKQorICAgICAgICAjX19ub25fX3plcm9fXworICAgICAgICBpZiBwOiBzZWxmLmZhaWwoIkVtcHR5IG1hcHBpbmcgbXVzdCBjb21wYXJlIHRvIEZhbHNlIikKKyAgICAgICAgaWYgbm90IGQ6IHNlbGYuZmFpbCgiRnVsbCBtYXBwaW5nIG11c3QgY29tcGFyZSB0byBUcnVlIikKKyAgICAgICAgIyBrZXlzKCksIGl0ZW1zKCksIGl0ZXJrZXlzKCkgLi4uCisgICAgICAgIGRlZiBjaGVja19pdGVyYW5kbGlzdChpdGVyLCBsc3QsIHJlZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihpdGVyLCAnbmV4dCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoaXRlciwgJ19faXRlcl9fJykpCisgICAgICAgICAgICB4ID0gbGlzdChpdGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldCh4KT09c2V0KGxzdCk9PXNldChyZWYpKQorICAgICAgICBjaGVja19pdGVyYW5kbGlzdChkLml0ZXJrZXlzKCksIGQua2V5cygpLCBzZWxmLnJlZmVyZW5jZS5rZXlzKCkpCisgICAgICAgIGNoZWNrX2l0ZXJhbmRsaXN0KGl0ZXIoZCksIGQua2V5cygpLCBzZWxmLnJlZmVyZW5jZS5rZXlzKCkpCisgICAgICAgIGNoZWNrX2l0ZXJhbmRsaXN0KGQuaXRlcnZhbHVlcygpLCBkLnZhbHVlcygpLCBzZWxmLnJlZmVyZW5jZS52YWx1ZXMoKSkKKyAgICAgICAgY2hlY2tfaXRlcmFuZGxpc3QoZC5pdGVyaXRlbXMoKSwgZC5pdGVtcygpLCBzZWxmLnJlZmVyZW5jZS5pdGVtcygpKQorICAgICAgICAjZ2V0CisgICAgICAgIGtleSwgdmFsdWUgPSBkLml0ZXJpdGVtcygpLm5leHQoKQorICAgICAgICBrbm93bmtleSwga25vd252YWx1ZSA9IHNlbGYub3RoZXIuaXRlcml0ZW1zKCkubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoa2V5LCBrbm93bnZhbHVlKSwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoa25vd25rZXksIGtub3dudmFsdWUpLCBrbm93bnZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGtub3dua2V5LCBkKQorCisgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3Igd3JpdGUgb3BlcmF0aW9ucyBvbiBtYXBwaW5nCisgICAgICAgIHAgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgI0luZGV4aW5nCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYucmVmZXJlbmNlLml0ZW1zKCk6CisgICAgICAgICAgICBwW2tleV0gPSB2YWx1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwW2tleV0sIHZhbHVlKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYucmVmZXJlbmNlLmtleXMoKToKKyAgICAgICAgICAgIGRlbCBwW2tleV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6cFtrZXldKQorICAgICAgICBwID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgICN1cGRhdGUKKyAgICAgICAgcC51cGRhdGUoc2VsZi5yZWZlcmVuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwKSwgc2VsZi5yZWZlcmVuY2UpCisgICAgICAgIGl0ZW1zID0gcC5pdGVtcygpCisgICAgICAgIHAgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgcC51cGRhdGUoaXRlbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwKSwgc2VsZi5yZWZlcmVuY2UpCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoc2VsZi5yZWZlcmVuY2UpCisgICAgICAgICNzZXRkZWZhdWx0CisgICAgICAgIGtleSwgdmFsdWUgPSBkLml0ZXJpdGVtcygpLm5leHQoKQorICAgICAgICBrbm93bmtleSwga25vd252YWx1ZSA9IHNlbGYub3RoZXIuaXRlcml0ZW1zKCkubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5zZXRkZWZhdWx0KGtleSwga25vd252YWx1ZSksIHZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRba2V5XSwgdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5zZXRkZWZhdWx0KGtub3dua2V5LCBrbm93bnZhbHVlKSwga25vd252YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW2tub3dua2V5XSwga25vd252YWx1ZSkKKyAgICAgICAgI3BvcAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGtub3dua2V5KSwga25vd252YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrbm93bmtleSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9wLCBrbm93bmtleSkKKyAgICAgICAgZGVmYXVsdCA9IDkwOQorICAgICAgICBkW2tub3dua2V5XSA9IGtub3dudmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSwgZGVmYXVsdCksIGtub3dudmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oa25vd25rZXksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wb3Aoa25vd25rZXksIGRlZmF1bHQpLCBkZWZhdWx0KQorICAgICAgICAjcG9waXRlbQorICAgICAgICBrZXksIHZhbHVlID0gZC5wb3BpdGVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrZXksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIHNlbGYucmVmZXJlbmNlW2tleV0pCisgICAgICAgIHA9c2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwLnBvcGl0ZW0pCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9lbXB0eV9tYXBwaW5nKCksIHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5fZW1wdHlfbWFwcGluZygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5yZWZlcmVuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShib29sKHNlbGYuX2VtcHR5X21hcHBpbmcoKSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShib29sKHNlbGYucmVmZXJlbmNlKSBpcyBUcnVlKQorCisgICAgZGVmIHRlc3Rfa2V5cyhzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQua2V5cygpLCBbXSkKKyAgICAgICAgZCA9IHNlbGYucmVmZXJlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi5pbm1hcHBpbmcua2V5cygpWzBdLCBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihzZWxmLm90aGVyLmtleXMoKVswXSwgZC5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5rZXlzLCBOb25lKQorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52YWx1ZXMoKSwgW10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLnZhbHVlcywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2l0ZW1zKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBbXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuaXRlbXMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5yZWZlcmVuY2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW3NlbGYuaW5tYXBwaW5nLmtleXMoKVswXV0sIHNlbGYuaW5tYXBwaW5nLnZhbHVlcygpWzBdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5fX2dldGl0ZW1fXykKKworICAgIGRlZiB0ZXN0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgIyBtYXBwaW5nIGFyZ3VtZW50CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZC51cGRhdGUoc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLml0ZW1zKCksIHNlbGYub3RoZXIuaXRlbXMoKSkKKworICAgICAgICAjIE5vIGFyZ3VtZW50CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKKworICAgICAgICAjIGl0ZW0gc2VxdWVuY2UKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBkLnVwZGF0ZShzZWxmLm90aGVyLml0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBzZWxmLm90aGVyLml0ZW1zKCkpCisKKyAgICAgICAgIyBJdGVyYXRvcgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGQudXBkYXRlKHNlbGYub3RoZXIuaXRlcml0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBzZWxmLm90aGVyLml0ZW1zKCkpCisKKyAgICAgICAgIyBGSVhNRTogRG9lc24ndCB3b3JrIHdpdGggVXNlckRpY3QKKyAgICAgICAgIyBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGQudXBkYXRlLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGQudXBkYXRlLCA0MikKKworICAgICAgICBvdXRlcnNlbGYgPSBzZWxmCisgICAgICAgIGNsYXNzIFNpbXBsZVVzZXJEaWN0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZCA9IG91dGVyc2VsZi5yZWZlcmVuY2UKKyAgICAgICAgICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmQua2V5cygpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZFtpXQorICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgZC51cGRhdGUoU2ltcGxlVXNlckRpY3QoKSkKKyAgICAgICAgaTEgPSBkLml0ZW1zKCkKKyAgICAgICAgaTIgPSBzZWxmLnJlZmVyZW5jZS5pdGVtcygpCisKKyAgICAgICAgZGVmIHNhZmVfc29ydF9rZXkoa3YpOgorICAgICAgICAgICAgaywgdiA9IGt2CisgICAgICAgICAgICByZXR1cm4gaWQodHlwZShrKSksIGlkKHR5cGUodikpLCBrLCB2CisgICAgICAgIGkxLnNvcnQoa2V5PXNhZmVfc29ydF9rZXkpCisgICAgICAgIGkyLnNvcnQoa2V5PXNhZmVfc29ydF9rZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaTEsIGkyKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBjbGFzcyBGYWlsaW5nVXNlckRpY3Q6CisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnVwZGF0ZSwgRmFpbGluZ1VzZXJEaWN0KCkpCisKKyAgICAgICAgZC5jbGVhcigpCisKKyAgICAgICAgY2xhc3MgRmFpbGluZ1VzZXJEaWN0OgorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgY2xhc3MgQm9nb25JdGVyOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgPSAxCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2EnCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGMKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9nb25JdGVyKCkKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBrZXkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnVwZGF0ZSwgRmFpbGluZ1VzZXJEaWN0KCkpCisKKyAgICAgICAgY2xhc3MgRmFpbGluZ1VzZXJEaWN0OgorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgY2xhc3MgQm9nb25JdGVyOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgPSBvcmQoJ2EnKQorICAgICAgICAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaSA8PSBvcmQoJ3onKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBydG4gPSBjaHIoc2VsZi5pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ0bgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBCb2dvbkl0ZXIoKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgZC51cGRhdGUsIEZhaWxpbmdVc2VyRGljdCgpKQorCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgY2xhc3MgYmFkc2VxKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnVwZGF0ZSwgYmFkc2VxKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZC51cGRhdGUsIFsoMSwgMiwgMyldKQorCisgICAgIyBubyB0ZXN0X2Zyb21rZXlzIG9yIHRlc3RfY29weSBhcyBib3RoIG9zLmVudmlyb24gYW5kIHNlbHZlcyBkb24ndCBzdXBwb3J0IGl0CisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdLCAzKSwgMykKKyAgICAgICAgZCA9IHNlbGYucmVmZXJlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmdldChzZWxmLm90aGVyLmtleXMoKVswXSkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLm90aGVyLmtleXMoKVswXSwgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoc2VsZi5pbm1hcHBpbmcua2V5cygpWzBdKSwgc2VsZi5pbm1hcHBpbmcudmFsdWVzKClbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoc2VsZi5pbm1hcHBpbmcua2V5cygpWzBdLCAzKSwgc2VsZi5pbm1hcHBpbmcudmFsdWVzKClbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5nZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5nZXQsIE5vbmUsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9zZXRkZWZhdWx0KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5zZXRkZWZhdWx0KQorCisgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3BpdGVtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQucG9waXRlbSwgNDIpCisKKyAgICBkZWYgdGVzdF9wb3Aoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgaywgdiA9IHNlbGYuaW5tYXBwaW5nLml0ZW1zKClbMF0KKyAgICAgICAgZFtrXSA9IHYKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9wLCBzZWxmLm90aGVyLmtleXMoKVswXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGspLCB2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3AsIGspCisKKworY2xhc3MgVGVzdE1hcHBpbmdQcm90b2NvbChCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wpOgorICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZW1wdHlfbWFwcGluZygpIGlzIG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoeD0xLCB5PTIpLCB7IngiOiAxLCAieSI6IDJ9KQorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfYm9vbChzZWxmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2Z1bGxfbWFwcGluZyh7IngiOiAieSJ9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5fZW1wdHlfbWFwcGluZygpKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5fZnVsbF9tYXBwaW5nKHsieCI6ICJ5In0pKSBpcyBUcnVlKQorCisgICAgZGVmIHRlc3Rfa2V5cyhzZWxmKToKKyAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3Rfa2V5cyhzZWxmKQorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5rZXlzKCksIFtdKQorICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCisgICAgICAgIGsgPSBkLmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgaykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYicsIGspCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2MnLCBrKQorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF92YWx1ZXMoc2VsZikKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7MToyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnZhbHVlcygpLCBbMl0pCisKKyAgICBkZWYgdGVzdF9pdGVtcyhzZWxmKToKKyAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfaXRlbXMoc2VsZikKKworICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsxOjJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXRlbXMoKSwgWygxLCAyKV0pCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZC5oYXNfa2V5KCdhJykpCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgayA9IGQua2V5cygpCisgICAgICAgIGsuc29ydChrZXk9bGFtYmRhIGs6IChpZCh0eXBlKGspKSwgaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgWydhJywgJ2InXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuaGFzX2tleSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2EnLCBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICgnYScgaW4gZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgbm90IGluIGQpCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYScsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2InLCBkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdjJywgZCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuX19jb250YWluc19fKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9sZW4oc2VsZikKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMikKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2dldGl0ZW0oc2VsZikKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydiJ10sIDIpCisgICAgICAgIGRbJ2MnXSA9IDMKKyAgICAgICAgZFsnYSddID0gNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2MnXSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydhJ10sIDQpCisgICAgICAgIGRlbCBkWydiJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7J2EnOiA0LCAnYyc6IDN9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5fX2dldGl0ZW1fXykKKworICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsxOjEsIDI6MiwgMzozfSkKKyAgICAgICAgZC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwge30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmNsZWFyLCBOb25lKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF91cGRhdGUoc2VsZikKKyAgICAgICAgIyBtYXBwaW5nIGFyZ3VtZW50CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZC51cGRhdGUoezE6MTAwfSkKKyAgICAgICAgZC51cGRhdGUoezI6MjB9KQorICAgICAgICBkLnVwZGF0ZSh7MToxLCAyOjIsIDM6M30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgezE6MSwgMjoyLCAzOjN9KQorCisgICAgICAgICMgbm8gYXJndW1lbnQKKyAgICAgICAgZC51cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsxOjEsIDI6MiwgMzozfSkKKworICAgICAgICAjIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgZC51cGRhdGUoeD0xMDApCisgICAgICAgIGQudXBkYXRlKHk9MjApCisgICAgICAgIGQudXBkYXRlKHg9MSwgeT0yLCB6PTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeyJ4IjoxLCAieSI6MiwgInoiOjN9KQorCisgICAgICAgICMgaXRlbSBzZXF1ZW5jZQorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGQudXBkYXRlKFsoIngiLCAxMDApLCAoInkiLCAyMCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsieCI6MTAwLCAieSI6MjB9KQorCisgICAgICAgICMgQm90aCBpdGVtIHNlcXVlbmNlIGFuZCBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGQudXBkYXRlKFsoIngiLCAxMDApLCAoInkiLCAyMCldLCB4PTEsIHk9MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7IngiOjEsICJ5IjoyfSkKKworICAgICAgICAjIGl0ZXJhdG9yCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoezE6MywgMjo0fSkKKyAgICAgICAgZC51cGRhdGUoc2VsZi5fZnVsbF9tYXBwaW5nKHsxOjIsIDM6NCwgNTo2fSkuaXRlcml0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgezE6MiwgMjo0LCAzOjQsIDU6Nn0pCisKKyAgICAgICAgY2xhc3MgU2ltcGxlVXNlckRpY3Q6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5kID0gezE6MSwgMjoyLCAzOjN9CisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kLmtleXMoKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRbaV0KKyAgICAgICAgZC5jbGVhcigpCisgICAgICAgIGQudXBkYXRlKFNpbXBsZVVzZXJEaWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgezE6MSwgMjoyLCAzOjN9KQorCisgICAgZGVmIHRlc3RfZnJvbWtleXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdChkLmZyb21rZXlzKCdhYmMnKSBpcyBkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKCdhYmMnKSwgeydhJzpOb25lLCAnYic6Tm9uZSwgJ2MnOk5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoKDQsNSksMCksIHs0OjAsIDU6MH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cyhbXSksIHt9KQorICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgeWllbGQgMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoZygpKSwgezE6Tm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30uZnJvbWtleXMsIDMpCisgICAgICAgIGNsYXNzIGRpY3RsaWtlKHNlbGYudHlwZTJ0ZXN0KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3RsaWtlLmZyb21rZXlzKCdhJyksIHsnYSc6Tm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLCB7J2EnOk5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdGxpa2UuZnJvbWtleXMoJ2EnKS5fX2NsYXNzX18gaXMgZGljdGxpa2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0bGlrZSgpLmZyb21rZXlzKCdhJykuX19jbGFzc19fIGlzIGRpY3RsaWtlKQorICAgICAgICAjIEZJWE1FOiB0aGUgZm9sbG93aW5nIHdvbid0IHdvcmsgd2l0aCBVc2VyRGljdCwgYmVjYXVzZSBpdCdzIGFuIG9sZCBzdHlsZSBjbGFzcworICAgICAgICAjIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGRpY3RsaWtlLmZyb21rZXlzKCdhJykpIGlzIGRpY3RsaWtlKQorICAgICAgICBjbGFzcyBteWRpY3Qoc2VsZi50eXBlMnRlc3QpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVXNlckRpY3QuVXNlckRpY3QoKQorICAgICAgICB1ZCA9IG15ZGljdC5mcm9ta2V5cygnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVkLCB7J2EnOk5vbmUsICdiJzpOb25lfSkKKyAgICAgICAgIyBGSVhNRTogdGhlIGZvbGxvd2luZyB3b24ndCB3b3JrIHdpdGggVXNlckRpY3QsIGJlY2F1c2UgaXQncyBhbiBvbGQgc3R5bGUgY2xhc3MKKyAgICAgICAgIyBzZWxmLmFzc2VydElzSW5zdGFuY2UodWQsIFVzZXJEaWN0LlVzZXJEaWN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpY3QuZnJvbWtleXMpCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBiYWRkaWN0MShzZWxmLnR5cGUydGVzdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGJhZGRpY3QxLmZyb21rZXlzLCBbMV0pCisKKyAgICAgICAgY2xhc3MgQmFkU2VxKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBzZWxmLnR5cGUydGVzdC5mcm9ta2V5cywgQmFkU2VxKCkpCisKKyAgICAgICAgY2xhc3MgYmFkZGljdDIoc2VsZi50eXBlMnRlc3QpOgorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBiYWRkaWN0Mi5mcm9ta2V5cywgWzFdKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7MToxLCAyOjIsIDM6M30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3B5KCksIHsxOjEsIDI6MiwgMzozfSkKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuY29weSgpLCBkKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZC5jb3B5KCksIGQuX19jbGFzc19fKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuY29weSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfZ2V0KHNlbGYpCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KCdjJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQorICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYScgOiAxLCAnYicgOiAyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KCdjJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2EnLCAzKSwgMSkKKworICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3NldGRlZmF1bHQoc2VsZikKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zZXRkZWZhdWx0KCdrZXkwJykgaXMgTm9uZSkKKyAgICAgICAgZC5zZXRkZWZhdWx0KCdrZXkwJywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNldGRlZmF1bHQoJ2tleTAnKSBpcyBOb25lKQorICAgICAgICBkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydrZXknXVswXSwgMykKKyAgICAgICAgZC5zZXRkZWZhdWx0KCdrZXknLCBbXSkuYXBwZW5kKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRbJ2tleSddKSwgMikKKworICAgIGRlZiB0ZXN0X3BvcGl0ZW0oc2VsZik6CisgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3BvcGl0ZW0oc2VsZikKKyAgICAgICAgZm9yIGNvcHltb2RlIGluIC0xLCArMToKKyAgICAgICAgICAgICMgLTE6IGIgaGFzIHNhbWUgc3RydWN0dXJlIGFzIGEKKyAgICAgICAgICAgICMgKzE6IGIgaXMgYS5jb3B5KCkKKyAgICAgICAgICAgIGZvciBsb2cyc2l6ZSBpbiByYW5nZSgxMik6CisgICAgICAgICAgICAgICAgc2l6ZSA9IDIqKmxvZzJzaXplCisgICAgICAgICAgICAgICAgYSA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICAgICAgICAgIGIgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKKyAgICAgICAgICAgICAgICAgICAgYVtyZXByKGkpXSA9IGkKKyAgICAgICAgICAgICAgICAgICAgaWYgY29weW1vZGUgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgYltyZXByKGkpXSA9IGkKKyAgICAgICAgICAgICAgICBpZiBjb3B5bW9kZSA+IDA6CisgICAgICAgICAgICAgICAgICAgIGIgPSBhLmNvcHkoKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgICAgICBrYSwgdmEgPSB0YSA9IGEucG9waXRlbSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmEsIGludChrYSkpCisgICAgICAgICAgICAgICAgICAgIGtiLCB2YiA9IHRiID0gYi5wb3BpdGVtKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YiwgaW50KGtiKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdChjb3B5bW9kZSA8IDAgYW5kIHRhICE9IHRiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBiKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9wb3Aoc2VsZikKKworICAgICAgICAjIFRlc3RzIGZvciBwb3Agd2l0aCBzcGVjaWZpZWQga2V5CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgaywgdiA9ICdhYmMnLCAnZGVmJworCisgICAgICAgICMgdmVyaWZ5IGxvbmdzL2ludHMgZ2V0IHNhbWUgdmFsdWUgd2hlbiBrZXkgPiAzMiBiaXRzIChmb3IgNjQtYml0IGFyY2hzKQorICAgICAgICAjIHNlZSBTRiBidWcgIzY4OTY1OQorICAgICAgICB4ID0gNDUwMzU5OTYyNzM3MDQ5NkwKKyAgICAgICAgeSA9IDQ1MDM1OTk2MjczNzA0OTYKKyAgICAgICAgaCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7eDogJ2FueXRoaW5nJywgeTogJ3NvbWV0aGluZyBlbHNlJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFt4XSwgaFt5XSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGssIHYpLCB2KQorICAgICAgICBkW2tdID0gdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucG9wKGssIDEpLCB2KQorCisKK2NsYXNzIFRlc3RIYXNoTWFwcGluZ1Byb3RvY29sKFRlc3RNYXBwaW5nUHJvdG9jb2wpOgorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2dldGl0ZW0oc2VsZikKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBCYWRFcShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMjQKKworICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIGRbQmFkRXEoKV0gPSA0MgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5fX2dldGl0ZW1fXywgMjMpCisKKyAgICAgICAgY2xhc3MgQmFkSGFzaChvYmplY3QpOgorICAgICAgICAgICAgZmFpbCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgeCA9IEJhZEhhc2goKQorICAgICAgICBkW3hdID0gNDIKKyAgICAgICAgeC5mYWlsID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQuX19nZXRpdGVtX18sIHgpCisKKyAgICBkZWYgdGVzdF9mcm9ta2V5cyhzZWxmKToKKyAgICAgICAgVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2Zyb21rZXlzKHNlbGYpCisgICAgICAgIGNsYXNzIG15ZGljdChzZWxmLnR5cGUydGVzdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICAgICAgICAgIHJldHVybiBVc2VyRGljdC5Vc2VyRGljdCgpCisgICAgICAgIHVkID0gbXlkaWN0LmZyb21rZXlzKCdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodWQsIHsnYSc6Tm9uZSwgJ2InOk5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodWQsIFVzZXJEaWN0LlVzZXJEaWN0KQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfcG9wKHNlbGYpCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBjbGFzcyBCYWRIYXNoKG9iamVjdCk6CisgICAgICAgICAgICBmYWlsID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWw6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICB4ID0gQmFkSGFzaCgpCisgICAgICAgIGRbeF0gPSA0MgorICAgICAgICB4LmZhaWwgPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgZC5wb3AsIHgpCisKKyAgICBkZWYgdGVzdF9tdXRhdGluZ2l0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBkWzFdID0gMQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiBkOgorICAgICAgICAgICAgICAgIGRbaSsxXSA9IDEKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2hhbmdpbmcgZGljdCBzaXplIGR1cmluZyBpdGVyYXRpb24gZG9lc24ndCByYWlzZSBFcnJvciIpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkKSwgJ3t9JykKKyAgICAgICAgZFsxXSA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQpLCAnezE6IDJ9JykKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBkWzFdID0gZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZCksICd7MTogey4uLn19JykKKworICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcworCisgICAgICAgIGNsYXNzIEJhZFJlcHIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorCisgICAgICAgIGQgPSBzZWxmLl9mdWxsX21hcHBpbmcoezE6IEJhZFJlcHIoKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgcmVwciwgZCkKKworICAgIGRlZiB0ZXN0X2xlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IChzZWxmLl9lbXB0eV9tYXBwaW5nKCkgPCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IChzZWxmLl9mdWxsX21hcHBpbmcoezE6IDJ9KSA8IHNlbGYuX2Z1bGxfbWFwcGluZyh7MUw6IDJMfSkpKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkQ21wKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGQxID0gc2VsZi5fZnVsbF9tYXBwaW5nKHtCYWRDbXAoKTogMX0pCisgICAgICAgIGQyID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsxOiAxfSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZDEgPCBkMgorICAgICAgICBleGNlcHQgRXhjOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCI8IGRpZG4ndCByYWlzZSBFeGMiKQorCisgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKKyAgICAgICAgVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3NldGRlZmF1bHQoc2VsZikKKworICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcworCisgICAgICAgIGNsYXNzIEJhZEhhc2gob2JqZWN0KToKKyAgICAgICAgICAgIGZhaWwgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmFpbDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCisgICAgICAgIHggPSBCYWRIYXNoKCkKKyAgICAgICAgZFt4XSA9IDQyCisgICAgICAgIHguZmFpbCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnNldGRlZmF1bHQsIHgsIFtdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L21hcHBpbmdfdGVzdHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L21hcHBpbmdfdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzU0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L21hcHBpbmdfdGVzdHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L21hcHBpbmdfdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzU0NjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbWFwcGluZ190ZXN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L21hdGhfdGVzdGNhc2VzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC9tYXRoX3Rlc3RjYXNlcy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxYTQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9tYXRoX3Rlc3RjYXNlcy50eHQKQEAgLTAsMCArMSw0NDcgQEAKKy0tIFRlc3RjYXNlcyBmb3IgZnVuY3Rpb25zIGluIG1hdGguCistLQorLS0gRWFjaCBsaW5lIHRha2VzIHRoZSBmb3JtOgorLS0KKy0tIDx0ZXN0aWQ+IDxmdW5jdGlvbj4gPGlucHV0X3ZhbHVlPiAtPiA8b3V0cHV0X3ZhbHVlPiA8ZmxhZ3M+CistLQorLS0gd2hlcmU6CistLQorLS0gICA8dGVzdGlkPiBpcyBhIHNob3J0IG5hbWUgaWRlbnRpZnlpbmcgdGhlIHRlc3QsCistLQorLS0gICA8ZnVuY3Rpb24+IGlzIHRoZSBmdW5jdGlvbiB0byBiZSB0ZXN0ZWQgKGV4cCwgY29zLCBhc2luaCwgLi4uKSwKKy0tCistLSAgIDxpbnB1dF92YWx1ZT4gaXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgZmxvYXRpbmctcG9pbnQgdmFsdWUKKy0tCistLSAgIDxvdXRwdXRfdmFsdWU+IGlzIHRoZSBleHBlY3RlZCAoaWRlYWwpIG91dHB1dCB2YWx1ZSwgYWdhaW4KKy0tICAgICByZXByZXNlbnRlZCBhcyBhIHN0cmluZy4KKy0tCistLSAgIDxmbGFncz4gaXMgYSBsaXN0IG9mIHRoZSBmbG9hdGluZy1wb2ludCBmbGFncyByZXF1aXJlZCBieSBDOTkKKy0tCistLSBUaGUgcG9zc2libGUgZmxhZ3MgYXJlOgorLS0KKy0tICAgZGl2aWRlLWJ5LXplcm8gOiByYWlzZWQgd2hlbiBhIGZpbml0ZSBpbnB1dCBnaXZlcyBhCistLSAgICAgbWF0aGVtYXRpY2FsbHkgaW5maW5pdGUgcmVzdWx0LgorLS0KKy0tICAgb3ZlcmZsb3cgOiByYWlzZWQgd2hlbiBhIGZpbml0ZSBpbnB1dCBnaXZlcyBhIGZpbml0ZSByZXN1bHQgdGhhdAorLS0gICAgIGlzIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIHVzdWFsIHJhbmdlIG9mIGFuIElFRUUgNzU0IGRvdWJsZS4KKy0tCistLSAgIGludmFsaWQgOiByYWlzZWQgZm9yIGludmFsaWQgaW5wdXRzIChlLmcuLCBzcXJ0KC0xKSkKKy0tCistLSAgIGlnbm9yZS1zaWduIDogaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ24gb2YgdGhlIHJlc3VsdCBpcworLS0gICAgIHVuc3BlY2lmaWVkOyBlLmcuLCBpZiB0aGUgcmVzdWx0IGlzIGdpdmVuIGFzIGluZiwKKy0tICAgICB0aGVuIGJvdGggLWluZiBhbmQgaW5mIHNob3VsZCBiZSBhY2NlcHRlZCBhcyBjb3JyZWN0LgorLS0KKy0tIEZsYWdzIG1heSBhcHBlYXIgaW4gYW55IG9yZGVyLgorLS0KKy0tIExpbmVzIGJlZ2lubmluZyB3aXRoICctLScgKGxpa2UgdGhpcyBvbmUpIHN0YXJ0IGEgY29tbWVudCwgYW5kIGFyZQorLS0gaWdub3JlZC4gIEJsYW5rIGxpbmVzLCBvciBsaW5lcyBjb250YWluaW5nIG9ubHkgd2hpdGVzcGFjZSwgYXJlIGFsc28KKy0tIGlnbm9yZWQuCisKKy0tIE1hbnkgb2YgdGhlIHZhbHVlcyBiZWxvdyB3ZXJlIGNvbXB1dGVkIHdpdGggdGhlIGhlbHAgb2YKKy0tIHZlcnNpb24gMi40IG9mIHRoZSBNUEZSIGxpYnJhcnkgZm9yIG11bHRpcGxlLXByZWNpc2lvbgorLS0gZmxvYXRpbmctcG9pbnQgY29tcHV0YXRpb25zIHdpdGggY29ycmVjdCByb3VuZGluZy4gIEFsbCBvdXRwdXQKKy0tIHZhbHVlcyBpbiB0aGlzIGZpbGUgYXJlIChtb2R1bG8geWV0LXRvLWJlLWRpc2NvdmVyZWQgYnVncykKKy0tIGNvcnJlY3RseSByb3VuZGVkLCBwcm92aWRlZCB0aGF0IGVhY2ggaW5wdXQgYW5kIG91dHB1dCBkZWNpbWFsCistLSBmbG9hdGluZy1wb2ludCB2YWx1ZSBiZWxvdyBpcyBpbnRlcnByZXRlZCBhcyBhIHJlcHJlc2VudGF0aW9uIG9mCistLSB0aGUgY29ycmVzcG9uZGluZyBuZWFyZXN0IElFRUUgNzU0IGRvdWJsZS1wcmVjaXNpb24gdmFsdWUuICBTZWUgdGhlCistLSBNUEZSIGhvbWVwYWdlIGF0IGh0dHA6Ly93d3cubXBmci5vcmcgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCistLSBNUEZSIHByb2plY3QuCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZXJmOiBlcnJvciBmdW5jdGlvbiAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlcmYwMDAwIGVyZiAwLjAgLT4gMC4wCitlcmYwMDAxIGVyZiAtMC4wIC0+IC0wLjAKK2VyZjAwMDIgZXJmIGluZiAtPiAxLjAKK2VyZjAwMDMgZXJmIC1pbmYgLT4gLTEuMAorZXJmMDAwNCBlcmYgbmFuIC0+IG5hbgorCistLSB0aW55IHZhbHVlcworZXJmMDAxMCBlcmYgMWUtMzA4IC0+IDEuMTI4Mzc5MTY3MDk1NTEyNWUtMzA4CitlcmYwMDExIGVyZiA1ZS0zMjQgLT4gNC45NDA2NTY0NTg0MTI0NjU0ZS0zMjQKK2VyZjAwMTIgZXJmIDFlLTEwIC0+IDEuMTI4Mzc5MTY3MDk1NTEyNmUtMTAKKworLS0gc21hbGwgaW50ZWdlcnMKK2VyZjAwMjAgZXJmIDEgLT4gMC44NDI3MDA3OTI5NDk3MTQ4OQorZXJmMDAyMSBlcmYgMiAtPiAwLjk5NTMyMjI2NTAxODk1MjcxCitlcmYwMDIyIGVyZiAzIC0+IDAuOTk5OTc3OTA5NTAzMDAxMzYKK2VyZjAwMjMgZXJmIDQgLT4gMC45OTk5OTk5ODQ1ODI3NDIwOQorZXJmMDAyNCBlcmYgNSAtPiAwLjk5OTk5OTk5OTk5ODQ2MjU2CitlcmYwMDI1IGVyZiA2IC0+IDEuMAorCitlcmYwMDMwIGVyZiAtMSAtPiAtMC44NDI3MDA3OTI5NDk3MTQ4OQorZXJmMDAzMSBlcmYgLTIgLT4gLTAuOTk1MzIyMjY1MDE4OTUyNzEKK2VyZjAwMzIgZXJmIC0zIC0+IC0wLjk5OTk3NzkwOTUwMzAwMTM2CitlcmYwMDMzIGVyZiAtNCAtPiAtMC45OTk5OTk5ODQ1ODI3NDIwOQorZXJmMDAzNCBlcmYgLTUgLT4gLTAuOTk5OTk5OTk5OTk4NDYyNTYKK2VyZjAwMzUgZXJmIC02IC0+IC0xLjAKKworLS0gaHVnZSB2YWx1ZXMgc2hvdWxkIGFsbCBnbyB0byArLy0xLCBkZXBlbmRpbmcgb24gc2lnbgorZXJmMDA0MCBlcmYgLTQwIC0+IC0xLjAKK2VyZjAwNDEgZXJmIDFlMTYgLT4gMS4wCitlcmYwMDQyIGVyZiAtMWUxNTAgLT4gLTEuMAorZXJmMDA0MyBlcmYgMS43ZTMwOCAtPiAxLjAKKworLS0gSXNzdWUgODk4NjogaW5wdXRzIHggd2l0aCBleHAoLXgqeCkgbmVhciB0aGUgdW5kZXJmbG93IHRocmVzaG9sZAorLS0gaW5jb3JyZWN0bHkgc2lnbmFsbGVkIG92ZXJmbG93IG9uIHNvbWUgcGxhdGZvcm1zLgorZXJmMDEwMCBlcmYgMjYuMiAtPiAxLjAKK2VyZjAxMDEgZXJmIDI2LjQgLT4gMS4wCitlcmYwMTAyIGVyZiAyNi42IC0+IDEuMAorZXJmMDEwMyBlcmYgMjYuOCAtPiAxLjAKK2VyZjAxMDQgZXJmIDI3LjAgLT4gMS4wCitlcmYwMTA1IGVyZiAyNy4yIC0+IDEuMAorZXJmMDEwNiBlcmYgMjcuNCAtPiAxLjAKK2VyZjAxMDcgZXJmIDI3LjYgLT4gMS4wCisKK2VyZjAxMTAgZXJmIC0yNi4yIC0+IC0xLjAKK2VyZjAxMTEgZXJmIC0yNi40IC0+IC0xLjAKK2VyZjAxMTIgZXJmIC0yNi42IC0+IC0xLjAKK2VyZjAxMTMgZXJmIC0yNi44IC0+IC0xLjAKK2VyZjAxMTQgZXJmIC0yNy4wIC0+IC0xLjAKK2VyZjAxMTUgZXJmIC0yNy4yIC0+IC0xLjAKK2VyZjAxMTYgZXJmIC0yNy40IC0+IC0xLjAKK2VyZjAxMTcgZXJmIC0yNy42IC0+IC0xLjAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLS0gZXJmYzogY29tcGxlbWVudGFyeSBlcnJvciBmdW5jdGlvbiAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitlcmZjMDAwMCBlcmZjIDAuMCAtPiAxLjAKK2VyZmMwMDAxIGVyZmMgLTAuMCAtPiAxLjAKK2VyZmMwMDAyIGVyZmMgaW5mIC0+IDAuMAorZXJmYzAwMDMgZXJmYyAtaW5mIC0+IDIuMAorZXJmYzAwMDQgZXJmYyBuYW4gLT4gbmFuCisKKy0tIHRpbnkgdmFsdWVzCitlcmZjMDAxMCBlcmZjIDFlLTMwOCAtPiAxLjAKK2VyZmMwMDExIGVyZmMgNWUtMzI0IC0+IDEuMAorZXJmYzAwMTIgZXJmYyAxZS0xMCAtPiAwLjk5OTk5OTk5OTg4NzE2MjA0CisKKy0tIHNtYWxsIGludGVnZXJzCitlcmZjMDAyMCBlcmZjIDEgLT4gMC4xNTcyOTkyMDcwNTAyODUxMworZXJmYzAwMjEgZXJmYyAyIC0+IDAuMDA0Njc3NzM0OTgxMDQ3MjY2MgorZXJmYzAwMjIgZXJmYyAzIC0+IDIuMjA5MDQ5Njk5ODU4NTQ0MWUtMDUKK2VyZmMwMDIzIGVyZmMgNCAtPiAxLjU0MTcyNTc5MDAyODAwMmUtMDgKK2VyZmMwMDI0IGVyZmMgNSAtPiAxLjUzNzQ1OTc5NDQyODAzNDllLTEyCitlcmZjMDAyNSBlcmZjIDYgLT4gMi4xNTE5NzM2NzEyNDk4OTEzZS0xNworCitlcmZjMDAzMCBlcmZjIC0xIC0+IDEuODQyNzAwNzkyOTQ5NzE0OAorZXJmYzAwMzEgZXJmYyAtMiAtPiAxLjk5NTMyMjI2NTAxODk1MjgKK2VyZmMwMDMyIGVyZmMgLTMgLT4gMS45OTk5Nzc5MDk1MDMwMDE1CitlcmZjMDAzMyBlcmZjIC00IC0+IDEuOTk5OTk5OTg0NTgyNzQyMQorZXJmYzAwMzQgZXJmYyAtNSAtPiAxLjk5OTk5OTk5OTk5ODQ2MjYKK2VyZmMwMDM1IGVyZmMgLTYgLT4gMi4wCisKKy0tIGFzIHggLT4gaW5maW5pdHksIGVyZmMoeCkgYmVoYXZlcyBsaWtlIGV4cCgteCp4KS94L3NxcnQocGkpCitlcmZjMDA0MCBlcmZjIDIwIC0+IDUuMzk1ODY1NjExNjA3OTAxMmUtMTc2CitlcmZjMDA0MSBlcmZjIDI1IC0+IDguMzAwMTcyNTcxMTk2NTIyOGUtMjc0CitlcmZjMDA0MiBlcmZjIDI3IC0+IDUuMjM3MDQ2NDM5MzUyNjI5MmUtMzE5CitlcmZjMDA0MyBlcmZjIDI4IC0+IDAuMAorCistLSBodWdlIHZhbHVlcworZXJmYzAwNTAgZXJmYyAtNDAgLT4gMi4wCitlcmZjMDA1MSBlcmZjIDFlMTYgLT4gMC4wCitlcmZjMDA1MiBlcmZjIC0xZTE1MCAtPiAyLjAKK2VyZmMwMDUzIGVyZmMgMS43ZTMwOCAtPiAwLjAKKworLS0gSXNzdWUgODk4NjogaW5wdXRzIHggd2l0aCBleHAoLXgqeCkgbmVhciB0aGUgdW5kZXJmbG93IHRocmVzaG9sZAorLS0gaW5jb3JyZWN0bHkgc2lnbmFsbGVkIG92ZXJmbG93IG9uIHNvbWUgcGxhdGZvcm1zLgorZXJmYzAxMDAgZXJmYyAyNi4yIC0+IDEuNjQzMjUwNzkyNDM4OTQ2MWUtMzAwCitlcmZjMDEwMSBlcmZjIDI2LjQgLT4gNC40MDE3NzY4NTg4MDM1NDI2ZS0zMDUKK2VyZmMwMTAyIGVyZmMgMjYuNiAtPiAxLjA4ODUxMjU4ODU0NDIyNjllLTMwOQorZXJmYzAxMDMgZXJmYyAyNi44IC0+IDIuNDg0OTYyMTU3MTk2NjYyOWUtMzE0CitlcmZjMDEwNCBlcmZjIDI3LjAgLT4gNS4yMzcwNDY0MzkzNTI2MjkyZS0zMTkKK2VyZmMwMTA1IGVyZmMgMjcuMiAtPiA5Ljg4MTMxMjkxNjgyNDkzMDllLTMyNAorZXJmYzAxMDYgZXJmYyAyNy40IC0+IDAuMAorZXJmYzAxMDcgZXJmYyAyNy42IC0+IDAuMAorCitlcmZjMDExMCBlcmZjIC0yNi4yIC0+IDIuMAorZXJmYzAxMTEgZXJmYyAtMjYuNCAtPiAyLjAKK2VyZmMwMTEyIGVyZmMgLTI2LjYgLT4gMi4wCitlcmZjMDExMyBlcmZjIC0yNi44IC0+IDIuMAorZXJmYzAxMTQgZXJmYyAtMjcuMCAtPiAyLjAKK2VyZmMwMTE1IGVyZmMgLTI3LjIgLT4gMi4wCitlcmZjMDExNiBlcmZjIC0yNy40IC0+IDIuMAorZXJmYzAxMTcgZXJmYyAtMjcuNiAtPiAyLjAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBsZ2FtbWE6IGxvZyBvZiBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZ2FtbWEgZnVuY3Rpb24gLS0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCistLSBzcGVjaWFsIHZhbHVlcworbGdhbTAwMDAgbGdhbW1hIDAuMCAtPiBpbmYgICAgICBkaXZpZGUtYnktemVybworbGdhbTAwMDEgbGdhbW1hIC0wLjAgLT4gaW5mICAgICBkaXZpZGUtYnktemVybworbGdhbTAwMDIgbGdhbW1hIGluZiAtPiBpbmYKK2xnYW0wMDAzIGxnYW1tYSAtaW5mIC0+IGluZgorbGdhbTAwMDQgbGdhbW1hIG5hbiAtPiBuYW4KKworLS0gbmVnYXRpdmUgaW50ZWdlcnMKK2xnYW0wMDEwIGxnYW1tYSAtMSAtPiBpbmYgICAgICAgZGl2aWRlLWJ5LXplcm8KK2xnYW0wMDExIGxnYW1tYSAtMiAtPiBpbmYgICAgICAgZGl2aWRlLWJ5LXplcm8KK2xnYW0wMDEyIGxnYW1tYSAtMWUxNiAtPiBpbmYgICAgZGl2aWRlLWJ5LXplcm8KK2xnYW0wMDEzIGxnYW1tYSAtMWUzMDAgLT4gaW5mICAgZGl2aWRlLWJ5LXplcm8KK2xnYW0wMDE0IGxnYW1tYSAtMS43OWUzMDggLT4gaW5mIGRpdmlkZS1ieS16ZXJvCisKKy0tIHNtYWxsIHBvc2l0aXZlIGludGVnZXJzIGdpdmUgZmFjdG9yaWFscworbGdhbTAwMjAgbGdhbW1hIDEgLT4gMC4wCitsZ2FtMDAyMSBsZ2FtbWEgMiAtPiAwLjAKK2xnYW0wMDIyIGxnYW1tYSAzIC0+IDAuNjkzMTQ3MTgwNTU5OTQ1MjkKK2xnYW0wMDIzIGxnYW1tYSA0IC0+IDEuNzkxNzU5NDY5MjI4MDU1CitsZ2FtMDAyNCBsZ2FtbWEgNSAtPiAzLjE3ODA1MzgzMDM0Nzk0NTgKK2xnYW0wMDI1IGxnYW1tYSA2IC0+IDQuNzg3NDkxNzQyNzgyMDQ1OAorCistLSBoYWxmIGludGVnZXJzCitsZ2FtMDAzMCBsZ2FtbWEgMC41IC0+IDAuNTcyMzY0OTQyOTI0NzAwMDgKK2xnYW0wMDMxIGxnYW1tYSAxLjUgLT4gLTAuMTIwNzgyMjM3NjM1MjQ1MjIKK2xnYW0wMDMyIGxnYW1tYSAyLjUgLT4gMC4yODQ2ODI4NzA0NzI5MTkxOAorbGdhbTAwMzMgbGdhbW1hIDMuNSAtPiAxLjIwMDk3MzYwMjM0NzA3NDMKK2xnYW0wMDM0IGxnYW1tYSAtMC41IC0+IDEuMjY1NTEyMTIzNDg0NjQ1NAorbGdhbTAwMzUgbGdhbW1hIC0xLjUgLT4gMC44NjAwNDcwMTUzNzY0ODA5OAorbGdhbTAwMzYgbGdhbW1hIC0yLjUgLT4gLTAuMDU2MjQzNzE2NDk3Njc0MDU0CitsZ2FtMDAzNyBsZ2FtbWEgLTMuNSAtPiAtMS4zMDkwMDY2ODQ5OTMwNDIKKworLS0gdmFsdWVzIG5lYXIgMAorbGdhbTAwNDAgbGdhbW1hIDAuMSAtPiAyLjI1MjcxMjY1MTczNDIwNgorbGdhbTAwNDEgbGdhbW1hIDAuMDEgLT4gNC41OTk0Nzk4NzgwNDIwMjE5CitsZ2FtMDA0MiBsZ2FtbWEgMWUtOCAtPiAxOC40MjA2ODA3MzgxODAyMDkKK2xnYW0wMDQzIGxnYW1tYSAxZS0xNiAtPiAzNi44NDEzNjE0ODc5MDQ3MzQKK2xnYW0wMDQ0IGxnYW1tYSAxZS0zMCAtPiA2OS4wNzc1NTI3ODk4MjEzNjgKK2xnYW0wMDQ1IGxnYW1tYSAxZS0xNjAgLT4gMzY4LjQxMzYxNDg3OTA0NzMyCitsZ2FtMDA0NiBsZ2FtbWEgMWUtMzA4IC0+IDcwOS4xOTYyMDg2NDIxNjYwOAorbGdhbTAwNDcgbGdhbW1hIDUuNmUtMzA5IC0+IDcwOS43NzYwMjcxMzc0MTg5NgorbGdhbTAwNDggbGdhbW1hIDUuNWUtMzA5IC0+IDcwOS43OTQwNDU2NDI5MjE2NworbGdhbTAwNDkgbGdhbW1hIDFlLTMwOSAtPiA3MTEuNDk4NzkzNzM1MTYwMTIKK2xnYW0wMDUwIGxnYW1tYSAxZS0zMjMgLT4gNzQzLjc0NjkyNDc0MDgyMTMzCitsZ2FtMDA1MSBsZ2FtbWEgNWUtMzI0IC0+IDc0NC40NDAwNzE5MjEzODEyMgorbGdhbTAwNjAgbGdhbW1hIC0wLjEgLT4gMi4zNjg5NjEzMzI3Mjg3ODg2CitsZ2FtMDA2MSBsZ2FtbWEgLTAuMDEgLT4gNC42MTEwMjQ5OTI3NTI4MDEzCitsZ2FtMDA2MiBsZ2FtbWEgLTFlLTggLT4gMTguNDIwNjgwNzQ5NzI0NTIyCitsZ2FtMDA2MyBsZ2FtbWEgLTFlLTE2IC0+IDM2Ljg0MTM2MTQ4NzkwNDczNAorbGdhbTAwNjQgbGdhbW1hIC0xZS0zMCAtPiA2OS4wNzc1NTI3ODk4MjEzNjgKK2xnYW0wMDY1IGxnYW1tYSAtMWUtMTYwIC0+IDM2OC40MTM2MTQ4NzkwNDczMgorbGdhbTAwNjYgbGdhbW1hIC0xZS0zMDggLT4gNzA5LjE5NjIwODY0MjE2NjA4CitsZ2FtMDA2NyBsZ2FtbWEgLTUuNmUtMzA5IC0+IDcwOS43NzYwMjcxMzc0MTg5NgorbGdhbTAwNjggbGdhbW1hIC01LjVlLTMwOSAtPiA3MDkuNzk0MDQ1NjQyOTIxNjcKK2xnYW0wMDY5IGxnYW1tYSAtMWUtMzA5IC0+IDcxMS40OTg3OTM3MzUxNjAxMgorbGdhbTAwNzAgbGdhbW1hIC0xZS0zMjMgLT4gNzQzLjc0NjkyNDc0MDgyMTMzCitsZ2FtMDA3MSBsZ2FtbWEgLTVlLTMyNCAtPiA3NDQuNDQwMDcxOTIxMzgxMjIKKworLS0gdmFsdWVzIG5lYXIgbmVnYXRpdmUgaW50ZWdlcnMKK2xnYW0wMDgwIGxnYW1tYSAtMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAzNi43MzY4MDA1Njk2NzcxMDEKK2xnYW0wMDgxIGxnYW1tYSAtMS4wMDAwMDAwMDAwMDAwMDAyIC0+IDM2LjA0MzY1MzM4OTExNzE1NAorbGdhbTAwODIgbGdhbW1hIC0xLjk5OTk5OTk5OTk5OTk5OTggLT4gMzUuMzUwNTA2MjA4NTU3MjEzCitsZ2FtMDA4MyBsZ2FtbWEgLTIuMDAwMDAwMDAwMDAwMDAwNCAtPiAzNC42NTczNTkwMjc5OTcyNjYKK2xnYW0wMDg0IGxnYW1tYSAtMTAwLjAwMDAwMDAwMDAwMDAxIC0+IC0zMzEuODU0NjA1MjQ5ODA2MDcKK2xnYW0wMDg1IGxnYW1tYSAtOTkuOTk5OTk5OTk5OTk5OTg2IC0+IC0zMzEuODU0NjA1MjQ5ODA1OTYKKworLS0gbGFyZ2UgaW5wdXRzCitsZ2FtMDEwMCBsZ2FtbWEgMTcwIC0+IDcwMS40MzcyNjM4MDg3MzcwNAorbGdhbTAxMDEgbGdhbW1hIDE3MSAtPiA3MDYuNTczMDYyMjQ1Nzg3MzYKK2xnYW0wMTAyIGxnYW1tYSAxNzEuNjI0IC0+IDcwOS43ODA3NzQ0MzY2OTg5NQorbGdhbTAxMDMgbGdhbW1hIDE3MS42MjUgLT4gNzA5Ljc4NTkxNjgyOTQ4MzY1CitsZ2FtMDEwNCBsZ2FtbWEgMTcyIC0+IDcxMS43MTQ3MjU4MDIyODk5OQorbGdhbTAxMDUgbGdhbW1hIDIwMDAgLT4gMTMxOTguOTIzNDQ4MDU0MjY1CitsZ2FtMDEwNiBsZ2FtbWEgMi41NTk5ODMzMjc4NTE2M2UzMDUgLT4gMS43OTc2OTMxMzQ4NjIzMDk5ZSszMDgKK2xnYW0wMTA3IGxnYW1tYSAyLjU1OTk4MzMyNzg1MTY0ZTMwNSAtPiBpbmYgb3ZlcmZsb3cKK2xnYW0wMTA4IGxnYW1tYSAxLjdlMzA4IC0+IGluZiBvdmVyZmxvdworCistLSBpbnB1dHMgZm9yIHdoaWNoIGdhbW1hKHgpIGlzIHRpbnkKK2xnYW0wMTIwIGxnYW1tYSAtMTAwLjUgLT4gLTM2NC45MDA5NjgzMDk0MjczNgorbGdhbTAxMjEgbGdhbW1hIC0xNjAuNSAtPiAtNjU2Ljg4MDA1MjYxMTI2NDMyCitsZ2FtMDEyMiBsZ2FtbWEgLTE3MC41IC0+IC03MDcuOTk4NDMzMTQ1MDc4ODIKK2xnYW0wMTIzIGxnYW1tYSAtMTcxLjUgLT4gLTcxMy4xNDMwMTY0MTE2ODQ4MQorbGdhbTAxMjQgbGdhbW1hIC0xNzYuNSAtPiAtNzM4Ljk1MjQ3NTkwODQ2NDg2CitsZ2FtMDEyNSBsZ2FtbWEgLTE3Ny41IC0+IC03NDQuMTMxNDQ2NTE3MzgwMzcKK2xnYW0wMTI2IGxnYW1tYSAtMTc4LjUgLT4gLTc0OS4zMTYwMzUxMTg2MDAxCisKK2xnYW0wMTMwIGxnYW1tYSAtMTAwMC41IC0+IC01OTE0LjQzNzcwMTExNjg1MTcKK2xnYW0wMTMxIGxnYW1tYSAtMzAwMDAuNSAtPiAtMjc5Mjc4LjY2Mjk5NTkxNDQKK2xnYW0wMTMyIGxnYW1tYSAtNDUwMzU5OTYyNzM3MDQ5NS41IC0+IC0xLjU3ODIyNTg0MzQ0OTI4ODNlKzE3CisKKy0tIHJlc3VsdHMgY2xvc2UgdG8gMDogIHBvc2l0aXZlIGFyZ3VtZW50IC4uLgorbGdhbTAxNTAgbGdhbW1hIDAuOTk5OTk5OTk5OTk5OTk5ODkgLT4gNi40MDgzODEyMTM0ODAwMDc1ZS0xNworbGdhbTAxNTEgbGdhbW1hIDEuMDAwMDAwMDAwMDAwMDAwMiAtPiAtMS4yODE2NzYyNDI2OTYwMDA4ZS0xNgorbGdhbTAxNTIgbGdhbW1hIDEuOTk5OTk5OTk5OTk5OTk5OCAtPiAtOS4zODc2OTgwNjU1NDMxMTcwZS0xNworbGdhbTAxNTMgbGdhbW1hIDIuMDAwMDAwMDAwMDAwMDAwNCAtPiAxLjg3NzUzOTYxMzEwODYyNDRlLTE2CisKKy0tIC4uLiBhbmQgbmVnYXRpdmUgYXJndW1lbnQKK2xnYW0wMTYwIGxnYW1tYSAtMi43NDc2ODI2NDY3IC0+IC01LjI0Nzc0MDgxNDc2ODkxMzZlLTExCitsZ2FtMDE2MSBsZ2FtbWEgLTIuNDU3MDI0NzM4IC0+IDMuMzQ2NDYzNzU0MTkxMjkzMmUtMTAKKworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0tIGdhbW1hOiBHYW1tYSBmdW5jdGlvbiAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy0tIHNwZWNpYWwgdmFsdWVzCitnYW0wMDAwIGdhbW1hIDAuMCAtPiBpbmYgICAgICAgIGRpdmlkZS1ieS16ZXJvCitnYW0wMDAxIGdhbW1hIC0wLjAgLT4gLWluZiAgICAgIGRpdmlkZS1ieS16ZXJvCitnYW0wMDAyIGdhbW1hIGluZiAtPiBpbmYKK2dhbTAwMDMgZ2FtbWEgLWluZiAtPiBuYW4gICAgICAgaW52YWxpZAorZ2FtMDAwNCBnYW1tYSBuYW4gLT4gbmFuCisKKy0tIG5lZ2F0aXZlIGludGVnZXJzIGlucHV0cyBhcmUgaW52YWxpZAorZ2FtMDAxMCBnYW1tYSAtMSAtPiBuYW4gICAgICAgICBpbnZhbGlkCitnYW0wMDExIGdhbW1hIC0yIC0+IG5hbiAgICAgICAgIGludmFsaWQKK2dhbTAwMTIgZ2FtbWEgLTFlMTYgLT4gbmFuICAgICAgaW52YWxpZAorZ2FtMDAxMyBnYW1tYSAtMWUzMDAgLT4gbmFuICAgICBpbnZhbGlkCisKKy0tIHNtYWxsIHBvc2l0aXZlIGludGVnZXJzIGdpdmUgZmFjdG9yaWFscworZ2FtMDAyMCBnYW1tYSAxIC0+IDEKK2dhbTAwMjEgZ2FtbWEgMiAtPiAxCitnYW0wMDIyIGdhbW1hIDMgLT4gMgorZ2FtMDAyMyBnYW1tYSA0IC0+IDYKK2dhbTAwMjQgZ2FtbWEgNSAtPiAyNAorZ2FtMDAyNSBnYW1tYSA2IC0+IDEyMAorCistLSBoYWxmIGludGVnZXJzCitnYW0wMDMwIGdhbW1hIDAuNSAtPiAxLjc3MjQ1Mzg1MDkwNTUxNjEKK2dhbTAwMzEgZ2FtbWEgMS41IC0+IDAuODg2MjI2OTI1NDUyNzU4MDUKK2dhbTAwMzIgZ2FtbWEgMi41IC0+IDEuMzI5MzQwMzg4MTc5MTM3MAorZ2FtMDAzMyBnYW1tYSAzLjUgLT4gMy4zMjMzNTA5NzA0NDc4NDI2CitnYW0wMDM0IGdhbW1hIC0wLjUgLT4gLTMuNTQ0OTA3NzAxODExMDMyMgorZ2FtMDAzNSBnYW1tYSAtMS41IC0+IDIuMzYzMjcxODAxMjA3MzU0OAorZ2FtMDAzNiBnYW1tYSAtMi41IC0+IC0wLjk0NTMwODcyMDQ4Mjk0MTkwCitnYW0wMDM3IGdhbW1hIC0zLjUgLT4gMC4yNzAwODgyMDU4NTIyNjkxMQorCistLSB2YWx1ZXMgbmVhciAwCitnYW0wMDQwIGdhbW1hIDAuMSAtPiA5LjUxMzUwNzY5ODY2ODczMDYKK2dhbTAwNDEgZ2FtbWEgMC4wMSAtPiA5OS40MzI1ODUxMTkxNTA2MDIKK2dhbTAwNDIgZ2FtbWEgMWUtOCAtPiA5OTk5OTk5OS40MjI3ODQzNDMKK2dhbTAwNDMgZ2FtbWEgMWUtMTYgLT4gMTAwMDAwMDAwMDAwMDAwMDAKK2dhbTAwNDQgZ2FtbWEgMWUtMzAgLT4gOS45OTk5OTk5OTk5OTk5OTg4ZSsyOQorZ2FtMDA0NSBnYW1tYSAxZS0xNjAgLT4gMS4wMDAwMDAwMDAwMDAwMDAwZSsxNjAKK2dhbTAwNDYgZ2FtbWEgMWUtMzA4IC0+IDEuMDAwMDAwMDAwMDAwMDAwMGUrMzA4CitnYW0wMDQ3IGdhbW1hIDUuNmUtMzA5IC0+IDEuNzg1NzE0Mjg1NzE0Mjg0OGUrMzA4CitnYW0wMDQ4IGdhbW1hIDUuNWUtMzA5IC0+IGluZiAgIG92ZXJmbG93CitnYW0wMDQ5IGdhbW1hIDFlLTMwOSAtPiBpbmYgICAgIG92ZXJmbG93CitnYW0wMDUwIGdhbW1hIDFlLTMyMyAtPiBpbmYgICAgIG92ZXJmbG93CitnYW0wMDUxIGdhbW1hIDVlLTMyNCAtPiBpbmYgICAgIG92ZXJmbG93CitnYW0wMDYwIGdhbW1hIC0wLjEgLT4gLTEwLjY4NjI4NzAyMTE5MzE5MworZ2FtMDA2MSBnYW1tYSAtMC4wMSAtPiAtMTAwLjU4NzE5Nzk2NDQxMDc4CitnYW0wMDYyIGdhbW1hIC0xZS04IC0+IC0xMDAwMDAwMDAuNTc3MjE1NjcKK2dhbTAwNjMgZ2FtbWEgLTFlLTE2IC0+IC0xMDAwMDAwMDAwMDAwMDAwMAorZ2FtMDA2NCBnYW1tYSAtMWUtMzAgLT4gLTkuOTk5OTk5OTk5OTk5OTk4OGUrMjkKK2dhbTAwNjUgZ2FtbWEgLTFlLTE2MCAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwZSsxNjAKK2dhbTAwNjYgZ2FtbWEgLTFlLTMwOCAtPiAtMS4wMDAwMDAwMDAwMDAwMDAwZSszMDgKK2dhbTAwNjcgZ2FtbWEgLTUuNmUtMzA5IC0+IC0xLjc4NTcxNDI4NTcxNDI4NDhlKzMwOAorZ2FtMDA2OCBnYW1tYSAtNS41ZS0zMDkgLT4gLWluZiBvdmVyZmxvdworZ2FtMDA2OSBnYW1tYSAtMWUtMzA5IC0+IC1pbmYgICBvdmVyZmxvdworZ2FtMDA3MCBnYW1tYSAtMWUtMzIzIC0+IC1pbmYgICBvdmVyZmxvdworZ2FtMDA3MSBnYW1tYSAtNWUtMzI0IC0+IC1pbmYgICBvdmVyZmxvdworCistLSB2YWx1ZXMgbmVhciBuZWdhdGl2ZSBpbnRlZ2VycworZ2FtMDA4MCBnYW1tYSAtMC45OTk5OTk5OTk5OTk5OTk4OSAtPiAtOTAwNzE5OTI1NDc0MDk5Mi4wCitnYW0wMDgxIGdhbW1hIC0xLjAwMDAwMDAwMDAwMDAwMDIgLT4gNDUwMzU5OTYyNzM3MDQ5NS41CitnYW0wMDgyIGdhbW1hIC0xLjk5OTk5OTk5OTk5OTk5OTggLT4gMjI1MTc5OTgxMzY4NTI0OC41CitnYW0wMDgzIGdhbW1hIC0yLjAwMDAwMDAwMDAwMDAwMDQgLT4gLTExMjU4OTk5MDY4NDI2MjMuNQorZ2FtMDA4NCBnYW1tYSAtMTAwLjAwMDAwMDAwMDAwMDAxIC0+IC03LjU0MDA4MzMzNDg4MzEwOTBlLTE0NQorZ2FtMDA4NSBnYW1tYSAtOTkuOTk5OTk5OTk5OTk5OTg2IC0+IDcuNTQwMDgzMzM0ODg0MDk2MmUtMTQ1CisKKy0tIGxhcmdlIGlucHV0cworZ2FtMDEwMCBnYW1tYSAxNzAgLT4gNC4yNjkwNjgwMDkwMDQ3MDUxZSszMDQKK2dhbTAxMDEgZ2FtbWEgMTcxIC0+IDcuMjU3NDE1NjE1MzA3OTk5MGUrMzA2CitnYW0wMTAyIGdhbW1hIDE3MS42MjQgLT4gMS43OTQyMTE3NTk5MjQ4MTA0ZSszMDgKK2dhbTAxMDMgZ2FtbWEgMTcxLjYyNSAtPiBpbmYgICAgb3ZlcmZsb3cKK2dhbTAxMDQgZ2FtbWEgMTcyIC0+IGluZiAgICAgICAgb3ZlcmZsb3cKK2dhbTAxMDUgZ2FtbWEgMjAwMCAtPiBpbmYgICAgICAgb3ZlcmZsb3cKK2dhbTAxMDYgZ2FtbWEgMS43ZTMwOCAtPiBpbmYgICAgb3ZlcmZsb3cKKworLS0gaW5wdXRzIGZvciB3aGljaCBnYW1tYSh4KSBpcyB0aW55CitnYW0wMTIwIGdhbW1hIC0xMDAuNSAtPiAtMy4zNTM2OTA4MTk4MDc2Nzg3ZS0xNTkKK2dhbTAxMjEgZ2FtbWEgLTE2MC41IC0+IC01LjI1NTU0NjQ0NzAwNzgyOTNlLTI4NgorZ2FtMDEyMiBnYW1tYSAtMTcwLjUgLT4gLTMuMzEyNzM5NTIxNTM4NjA3NGUtMzA4CitnYW0wMTIzIGdhbW1hIC0xNzEuNSAtPiAxLjkzMTYyNjU0MzE3MTE5MDJlLTMxMAorZ2FtMDEyNCBnYW1tYSAtMTc2LjUgLT4gLTEuMTk1NjM4ODYyOTM1ODE2NmUtMzIxCitnYW0wMTI1IGdhbW1hIC0xNzcuNSAtPiA0Ljk0MDY1NjQ1ODQxMjQ2NTRlLTMyNAorZ2FtMDEyNiBnYW1tYSAtMTc4LjUgLT4gLTAuMAorZ2FtMDEyNyBnYW1tYSAtMTc5LjUgLT4gMC4wCitnYW0wMTI4IGdhbW1hIC0yMDEuMDAwMSAtPiAwLjAKK2dhbTAxMjkgZ2FtbWEgLTIwMi45OTk5IC0+IC0wLjAKK2dhbTAxMzAgZ2FtbWEgLTEwMDAuNSAtPiAtMC4wCitnYW0wMTMxIGdhbW1hIC0xMDAwMDAwMDAwLjMgLT4gLTAuMAorZ2FtMDEzMiBnYW1tYSAtNDUwMzU5OTYyNzM3MDQ5NS41IC0+IDAuMAorCistLSBpbnB1dHMgdGhhdCBjYXVzZSBwcm9ibGVtcyBmb3IgdGhlIHN0YW5kYXJkIHJlZmxlY3Rpb24gZm9ybXVsYSwKKy0tIHRoYW5rcyB0byBsb3NzIG9mIGFjY3VyYWN5IGluIDEteAorZ2FtMDE0MCBnYW1tYSAtNjMuMzQ5MDc4NzI5MDIyOTg1IC0+IDQuMTc3Nzk3MTY3Nzc2MTg4MGUtODgKK2dhbTAxNDEgZ2FtbWEgLTEyNy40NTExNzYzMjk0MzI5NSAtPiAxLjE4MzExMTA4OTYyMzY4MTBlLTIxNAorCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistLSBleHBtMTogZXhwKHgpIC0gMSwgd2l0aG91dCBwcmVjaXNpb24gbG9zcyBmb3Igc21hbGwgeCAtLQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLS0gc3BlY2lhbCB2YWx1ZXMKK2V4cG0xMDAwMCBleHBtMSAwLjAgLT4gMC4wCitleHBtMTAwMDEgZXhwbTEgLTAuMCAtPiAtMC4wCitleHBtMTAwMDIgZXhwbTEgaW5mIC0+IGluZgorZXhwbTEwMDAzIGV4cG0xIC1pbmYgLT4gLTEuMAorZXhwbTEwMDA0IGV4cG0xIG5hbiAtPiBuYW4KKworLS0gZXhwbTEoeCkgfiB4IGZvciB0aW55IHgKK2V4cG0xMDAxMCBleHBtMSA1ZS0zMjQgLT4gNWUtMzI0CitleHBtMTAwMTEgZXhwbTEgMWUtMzIwIC0+IDFlLTMyMAorZXhwbTEwMDEyIGV4cG0xIDFlLTMwMCAtPiAxZS0zMDAKK2V4cG0xMDAxMyBleHBtMSAxZS0xNTAgLT4gMWUtMTUwCitleHBtMTAwMTQgZXhwbTEgMWUtMjAgLT4gMWUtMjAKKworZXhwbTEwMDIwIGV4cG0xIC01ZS0zMjQgLT4gLTVlLTMyNAorZXhwbTEwMDIxIGV4cG0xIC0xZS0zMjAgLT4gLTFlLTMyMAorZXhwbTEwMDIyIGV4cG0xIC0xZS0zMDAgLT4gLTFlLTMwMAorZXhwbTEwMDIzIGV4cG0xIC0xZS0xNTAgLT4gLTFlLTE1MAorZXhwbTEwMDI0IGV4cG0xIC0xZS0yMCAtPiAtMWUtMjAKKworLS0gbW9kZXJhdGUgc2l6ZWQgdmFsdWVzLCB3aGVyZSBkaXJlY3QgZXZhbHVhdGlvbiBydW5zIGludG8gdHJvdWJsZQorZXhwbTEwMTAwIGV4cG0xIDFlLTEwIC0+IDEuMDAwMDAwMDAwMDUwMDAwMGUtMTAKK2V4cG0xMDEwMSBleHBtMSAtOS45OTk5OTk5OTk5OTk5OTk1ZS0wOCAtPiAtOS45OTk5OTk1MDAwMDAwMTYzZS04CitleHBtMTAxMDIgZXhwbTEgMy4wMDAwMDAwMDAwMDAwMDAxZS0wNSAtPiAzLjAwMDA0NTAwMDQ1MDAwMzRlLTUKK2V4cG0xMDEwMyBleHBtMSAtMC4wMDcwMDAwMDAwMDAwMDAwMDAxIC0+IC0wLjAwNjk3NTU1NzA2Njc2NDg5NTEKK2V4cG0xMDEwNCBleHBtMSAtMC4wNzE0OTkyMDg3NDAwOTQ2MzMgLT4gLTAuMDY5MDAyOTg1NzQ0ODIwMjUwCitleHBtMTAxMDUgZXhwbTEgLTAuMDYzMjk2MDA0MTgwMTE2Nzk5IC0+IC0wLjA2MTMzNDQxNjM3MzYzMzAwOQorZXhwbTEwMTA2IGV4cG0xIDAuMDIzOTA5NTQwMzU1OTc3NTYgLT4gMC4wMjQxOTc2NjUxNDM4MTk5NDIKK2V4cG0xMDEwNyBleHBtMSAwLjA4NTYzNzM1MjY0OTA0NDkwMSAtPiAwLjA4OTQxMTE4NDU4MDM1Nzc2NworZXhwbTEwMTA4IGV4cG0xIDAuNTk2NjE3NDk0NzQxMTAwNiAtPiAwLjgxNTk2NTg4NTk2NTAxNDg1CitleHBtMTAxMDkgZXhwbTEgMC4zMDI0NzIwNjIxMjA3NTEzOSAtPiAwLjM1MzE5OTg3MDM1ODQ4Njc3CitleHBtMTAxMTAgZXhwbTEgMC43NDU3NDcyNzM3NTg4OTUxNiAtPiAxLjEwODAxNjExMTY3Mzc0NTkKK2V4cG0xMDExMSBleHBtMSAwLjk3NzY3NTEyOTI2NTU1NzExIC0+IDEuNjU4MjY4OTIwNzM3MjE4NQorZXhwbTEwMTEyIGV4cG0xIDAuODQ1MDE1NDU2Njc4NzcxMiAtPiAxLjMyODAxMzc5NzY1MzU4OTcKK2V4cG0xMDExMyBleHBtMSAtMC4xMzk3OTI2MDMyMzEyNTI2NCAtPiAtMC4xMzA0NjE0NDM4MTM5NjA2MAorZXhwbTEwMTE0IGV4cG0xIC0wLjUyODk5MzIyMDM5NjQzMjcxIC0+IC0wLjQxMDgwMjEzNjQzNjk1OTIzCitleHBtMTAxMTUgZXhwbTEgLTAuNzQwODMyNjE0Nzg5MDA2MzEgLT4gLTAuNTIzMjgzMTcxMjQ3OTcwOTcKK2V4cG0xMDExNiBleHBtMSAtMC45Mzg0Nzc2Njk4NDU0NjA1NSAtPiAtMC42MDg3NzcwNDcyNDA4NTk0NgorZXhwbTEwMTE3IGV4cG0xIDEwLjAgLT4gMjIwMjUuNDY1Nzk0ODA2NzE4CitleHBtMTAxMTggZXhwbTEgMjcuMCAtPiA1MzIwNDgyNDA2MDAuNzk4NjUKK2V4cG0xMDExOSBleHBtMSAxMjMgLT4gMi42MTk1MTczMTg3NDkwNjI2ZSs1MworZXhwbTEwMTIwIGV4cG0xIC0xMi4wIC0+IC0wLjk5OTk5Mzg1NTc4NzY0NjY2CitleHBtMTAxMjEgZXhwbTEgLTM1LjEwMDAwMDAwMDAwMDAwMSAtPiAtMC45OTk5OTk5OTk5OTk5OTk0NAorCistLSBleHRyZW1lIG5lZ2F0aXZlIHZhbHVlcworZXhwbTEwMjAxIGV4cG0xIC0zNy4wIC0+IC0wLjk5OTk5OTk5OTk5OTk5OTg5CitleHBtMTAyMDAgZXhwbTEgLTM4LjAgLT4gLTEuMAorZXhwbTEwMjEwIGV4cG0xIC03MTAuMCAtPiAtMS4wCistLSB0aGUgZm9ybXVsYSBleHBtMSh4KSA9IDIgKiBzaW5oKHgvMikgKiBleHAoeC8yKSBkb2Vzbid0IHdvcmsgc28KKy0tIHdlbGwgd2hlbiBleHAoeC8yKSBpcyBzdWJub3JtYWwgb3IgdW5kZXJmbG93cyB0byB6ZXJvOyBjaGVjayB3ZSdyZQorLS0gbm90IHVzaW5nIGl0IQorZXhwbTEwMjExIGV4cG0xIC0xNDIwLjAgLT4gLTEuMAorZXhwbTEwMjEyIGV4cG0xIC0xNDUwLjAgLT4gLTEuMAorZXhwbTEwMjEzIGV4cG0xIC0xNTAwLjAgLT4gLTEuMAorZXhwbTEwMjE0IGV4cG0xIC0xZTUwIC0+IC0xLjAKK2V4cG0xMDIxNSBleHBtMSAtMS43OWUzMDggLT4gLTEuMAorCistLSBleHRyZW1lIHBvc2l0aXZlIHZhbHVlcworZXhwbTEwMzAwIGV4cG0xIDMwMCAtPiAxLjk0MjQyNjM5NTI0MTI1NThlKzEzMAorZXhwbTEwMzAxIGV4cG0xIDcwMCAtPiAxLjAxNDIzMjA1NDczNTAwNDVlKzMwNAorLS0gdGhlIG5leHQgdGVzdCAoZXhwbTEwMzAyKSBpcyBkaXNhYmxlZCBiZWNhdXNlIGl0IGNhdXNlcyBmYWlsdXJlIG9uCistLSBPUyBYIDEwLjQvSW50ZWw6IGFwcGFyZW50bHkgYWxsIHZhbHVlcyBvdmVyIDcwOS43OCBwcm9kdWNlIGFuCistLSBvdmVyZmxvdyBvbiB0aGF0IHBsYXRmb3JtLiAgU2VlIGlzc3VlICM3NTc1LgorLS0gZXhwbTEwMzAyIGV4cG0xIDcwOS43ODI3MTI4OTMyODM5MyAtPiAxLjc5NzY5MzEzNDY4MjQyNDBlKzMwOAorZXhwbTEwMzAzIGV4cG0xIDcwOS43ODI3MTI4OTM0ODQwMiAtPiBpbmYgb3ZlcmZsb3cKK2V4cG0xMDMwNCBleHBtMSAxMDAwIC0+IGluZiBvdmVyZmxvdworZXhwbTEwMzA1IGV4cG0xIDFlNTAgLT4gaW5mIG92ZXJmbG93CitleHBtMTAzMDYgZXhwbTEgMS43OWUzMDggLT4gaW5mIG92ZXJmbG93CisKKy0tIHdlYWtlciB2ZXJzaW9uIG9mIGV4cG0xMDMwMgorZXhwbTEwMzA3IGV4cG0xIDcwOS41IC0+IDEuMzU0OTg2MzE5MzE0NjMyOGUrMzA4CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L21wX2ZvcmtfYm9tYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmNlYTI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L21wX2ZvcmtfYm9tYi5weQpAQCAtMCwwICsxLDE2IEBACitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCisKK2RlZiBmb28oY29ubik6CisgICAgY29ubi5zZW5kKCIxMjMiKQorCisjIEJlY2F1c2UgImlmIF9fbmFtZV9fID09ICdfX21haW5fXyciIGlzIG1pc3NpbmcgdGhpcyB3aWxsIG5vdCB3b3JrCisjIGNvcnJlY3RseSBvbiBXaW5kb3dzLiAgSG93ZXZlciwgd2Ugc2hvdWxkIGdldCBhIFJ1bnRpbWVFcnJvciByYXRoZXIKKyMgdGhhbiB0aGUgV2luZG93cyBlcXVpdmFsZW50IG9mIGEgZm9yayBib21iLgorCityLCB3ID0gbXVsdGlwcm9jZXNzaW5nLlBpcGUoRmFsc2UpCitwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PWZvbywgYXJncz0odywpKQorcC5zdGFydCgpCit3LmNsb3NlKCkKK3ByaW50KHIucmVjdigpKQorci5jbG9zZSgpCitwLmpvaW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L21wX2ZvcmtfYm9tYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ1MTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L21wX2ZvcmtfYm9tYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L21wX2ZvcmtfYm9tYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvbXBfZm9ya19ib21iLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ1MTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L21wX2ZvcmtfYm9tYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L25va2lhLnBlbSBiL2xpYi9weXRob24yLjcvdGVzdC9ub2tpYS5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQwNDRkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9ub2tpYS5wZW0KQEAgLTAsMCArMSwzMSBAQAorIyBDZXJ0aWZpY2F0ZSBmb3IgcHJvamVjdHMuZGV2ZWxvcGVyLm5va2lhLmNvbTo0NDMgKHNlZSBpc3N1ZSAxMzAzNCkKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRkxEQ0NCQlNnQXdJQkFnSVFMdWJxZGtDZ2RjN2xBRjlOZkhsVW1qQU5CZ2txaGtpRzl3MEJBUVVGQURDQgordkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGekFWQmdOVkJBb1REbFpsY21sVGFXZHVMQ0JKYm1NdU1SOHdIUVlEVlFRTAorRXhaV1pYSnBVMmxuYmlCVWNuVnpkQ0JPWlhSM2IzSnJNVHN3T1FZRFZRUUxFekpVWlhKdGN5QnZaaUIxYzJVZworWVhRZ2FIUjBjSE02THk5M2QzY3VkbVZ5YVhOcFoyNHVZMjl0TDNKd1lTQW9ZeWt4TURFMk1EUUdBMVVFQXhNdAorVm1WeWFWTnBaMjRnUTJ4aGMzTWdNeUJKYm5SbGNtNWhkR2x2Ym1Gc0lGTmxjblpsY2lCRFFTQXRJRWN6TUI0WAorRFRFeE1Ea3lNVEF3TURBd01Gb1hEVEV5TURreU1ESXpOVGsxT1Zvd2NURUxNQWtHQTFVRUJoTUNSa2t4RGpBTQorQmdOVkJBZ1RCVVZ6Y0c5dk1RNHdEQVlEVlFRSEZBVkZjM0J2YnpFT01Bd0dBMVVFQ2hRRlRtOXJhV0V4Q3pBSgorQmdOVkJBc1VBa0pKTVNVd0l3WURWUVFERkJ4d2NtOXFaV04wY3k1a1pYWmxiRzl3WlhJdWJtOXJhV0V1WTI5dAorTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDcjkydzFicEhZU1l4VUV4OE4vOElkZGRhMgorbFlpK2FYTnRRZlYvbDJGdzlZa3YzSXB3NG5MZUdUajE4RkZsQVpnTWRQUmxncnpGL05OWEd3LzlsMy9xS2RvdworQ3lwa1FmOGxMYXhiOVplMUUvS0tta1JKYTQ4UVRPcXZvNkdxS3VUSTZIQ2VHbEcxUnhEYjhZU0tjUVdMaXl0bgoreWozV3A0TWdSUU8yNjZ4bU1RSURBUUFCbzRJQjlqQ0NBZkl3UVFZRFZSMFJCRG93T0lJY2NISnZhbVZqZEhNdQorWkdWMlpXeHZjR1Z5TG01dmEybGhMbU52YllJWWNISnZhbVZqZEhNdVptOXlkVzB1Ym05cmFXRXVZMjl0TUFrRworQTFVZEV3UUNNQUF3Q3dZRFZSMFBCQVFEQWdXZ01FRUdBMVVkSHdRNk1EZ3dOcUEwb0RLR01HaDBkSEE2THk5VAorVmxKSmJuUnNMVWN6TFdOeWJDNTJaWEpwYzJsbmJpNWpiMjB2VTFaU1NXNTBiRWN6TG1OeWJEQkVCZ05WSFNBRQorUFRBN01Ea0dDMkNHU0FHRytFVUJCeGNETUNvd0tBWUlLd1lCQlFVSEFnRVdIR2gwZEhCek9pOHZkM2QzTG5abAorY21semFXZHVMbU52YlM5eWNHRXdLQVlEVlIwbEJDRXdId1lKWUlaSUFZYjRRZ1FCQmdnckJnRUZCUWNEQVFZSQorS3dZQkJRVUhBd0l3Y2dZSUt3WUJCUVVIQVFFRVpqQmtNQ1FHQ0NzR0FRVUZCekFCaGhob2RIUndPaTh2YjJOegorY0M1MlpYSnBjMmxuYmk1amIyMHdQQVlJS3dZQkJRVUhNQUtHTUdoMGRIQTZMeTlUVmxKSmJuUnNMVWN6TFdGcAorWVM1MlpYSnBjMmxuYmk1amIyMHZVMVpTU1c1MGJFY3pMbU5sY2pCdUJnZ3JCZ0VGQlFjQkRBUmlNR0NoWHFCYworTUZvd1dEQldGZ2xwYldGblpTOW5hV1l3SVRBZk1BY0dCU3NPQXdJYUJCUkxhN2tvbGdZTXU5QlNPSnNwckVzSAoraXlFRkdEQW1GaVJvZEhSd09pOHZiRzluYnk1MlpYSnBjMmxuYmk1amIyMHZkbk5zYjJkdk1TNW5hV1l3RFFZSgorS29aSWh2Y05BUUVGQlFBRGdnRUJBQ1F1UHlJSnFYd1V5RlJXdzl4NXlEWGdNVzR6WUZvcFFZT3cvSXRSWTUyMgorTzVCc3lTVGg1NkJXUzZtUUIwN1hWZnhtWVVHQXZSUURBNVFIcG1ZOGpJbE53U21OM3M4UktvK2ZBdGlOUmxjTAoreC9tV1NmdU1zM0QvUzZldjNENitkcEVNWnRqcmhPZGN0c2FyTUtwOG4vaFBid2hBYmc1aFZqcGtXNW44dnoyeQorMEt4dnZrQTFBeHBMd3BWdjdPbEsxN3R0eklIdzhicDlIVGxIQlU1czhiS3o0YTU2NVYvYTVISTBDU0V2LysweQora280L2doVG5aYzFDa21VbmdLS2VGTVNhaC9tVC94QWg4WG5FMmwxQWF6RmE4VUt1WWtpMWUrQXJIYUdaYzRpeAorVVlPdGlScGh3ZnVZUWhSWjdxWDlxMk1Na0NNSTY1WE5LL1NhRnJBYmJHMD0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9udWxsY2VydC5wZW0gYi9saWIvcHl0aG9uMi43L3Rlc3QvbnVsbGNlcnQucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvbnVsbGNlcnQucGVtCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YWZjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weQpAQCAtMCwwICsxLDIyIEBACisjCisjIFRoaXMgZmlsZSBpcyBmb3IgZXZlcnlib2R5IHRvIGFkZCB0ZXN0cyBmb3IgYnVncyB0aGF0IGFyZW4ndAorIyBmaXhlZCB5ZXQuIFBsZWFzZSBhZGQgYSB0ZXN0IGNhc2UgYW5kIGFwcHJvcHJpYXRlIGJ1ZyBkZXNjcmlwdGlvbi4KKyMKKyMgV2hlbiB5b3UgZml4IG9uZSBvZiB0aGUgYnVncywgcGxlYXNlIG1vdmUgdGhlIHRlc3QgdG8gdGhlIGNvcnJlY3QKKyMgdGVzdF8gbW9kdWxlLgorIworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMKKyMgTm8gdGVzdCBjYXNlcyBmb3Igb3V0c3RhbmRpbmcgYnVncyBhdCB0aGUgbW9tZW50LgorIworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgpCisgICAgcGFzcworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MzY0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvb3V0c3RhbmRpbmdfYnVncy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MzY0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9vdXRzdGFuZGluZ19idWdzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3BpY2tsZXRlc3Rlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGNhZmNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3BpY2tsZXRlc3Rlci5weQpAQCAtMCwwICsxLDEzMTkgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHBpY2tsZQoraW1wb3J0IGNQaWNrbGUKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IGNTdHJpbmdJTworaW1wb3J0IHBpY2tsZXRvb2xzCitpbXBvcnQgY29weV9yZWcKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZCwgdmVyYm9zZSwgaGF2ZV91bmljb2RlLCBURVNURk4KK3RyeToKKyAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBfMkcsIF8xTSwgcHJlY2lzaW9uYmlnbWVtdGVzdAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgICMgdGhpcyBpbXBvcnQgbWlnaHQgZmFpbCB3aGVuIHJ1biBvbiBvbGRlciBQeXRob24gdmVyc2lvbnMgYnkgdGVzdF94cGlja2xlCisgICAgXzJHID0gXzFNID0gMAorICAgIGRlZiBwcmVjaXNpb25iaWdtZW10ZXN0KCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBsYW1iZGEgc2VsZjogTm9uZQorCisjIFRlc3RzIHRoYXQgdHJ5IGEgbnVtYmVyIG9mIHBpY2tsZSBwcm90b2NvbHMgc2hvdWxkIGhhdmUgYQorIyAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyMga2luZCBvZiBvdXRlciBsb29wLgorYXNzZXJ0IHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MID09IGNQaWNrbGUuSElHSEVTVF9QUk9UT0NPTCA9PSAyCitwcm90b2NvbHMgPSByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpCisKKyMgQ29weSBvZiB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fd2l0aF9sb2NhbGUuIFRoaXMgaXMgbmVlZGVkIHRvIHN1cHBvcnQgUHl0aG9uCisjIDIuNCwgd2hpY2ggZGlkbid0IGluY2x1ZGUgaXQuIFRoaXMgaXMgYWxsIHRvIHN1cHBvcnQgdGVzdF94cGlja2xlLCB3aGljaAorIyBib3VuY2VzIHBpY2tsZWQgb2JqZWN0cyB0aHJvdWdoIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucyB0byB0ZXN0IGJhY2t3YXJkcworIyBjb21wYXRpYmlsaXR5LgorZGVmIHJ1bl93aXRoX2xvY2FsZShjYXRzdHIsICpsb2NhbGVzKToKKyAgICBkZWYgZGVjb3JhdG9yKGZ1bmMpOgorICAgICAgICBkZWYgaW5uZXIoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gZ2V0YXR0cihsb2NhbGUsIGNhdHN0cikKKyAgICAgICAgICAgICAgICBvcmlnX2xvY2FsZSA9IGxvY2FsZS5zZXRsb2NhbGUoY2F0ZWdvcnkpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBpZiB0aGUgdGVzdCBhdXRob3IgZ2l2ZXMgdXMgYW4gaW52YWxpZCBjYXRlZ29yeSBzdHJpbmcKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgY2Fubm90IHJldHJpZXZlIG9yaWdpbmFsIGxvY2FsZSwgc28gZG8gbm90aGluZworICAgICAgICAgICAgICAgIGxvY2FsZSA9IG9yaWdfbG9jYWxlID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmb3IgbG9jIGluIGxvY2FsZXM6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUoY2F0ZWdvcnksIGxvYykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgIyBub3cgcnVuIHRoZSBmdW5jdGlvbiwgcmVzZXR0aW5nIHRoZSBsb2NhbGUgb24gZXhjZXB0aW9ucworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3ZHMpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIGxvY2FsZSBhbmQgb3JpZ19sb2NhbGU6CisgICAgICAgICAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUoY2F0ZWdvcnksIG9yaWdfbG9jYWxlKQorICAgICAgICBpbm5lci5mdW5jX25hbWUgPSBmdW5jLmZ1bmNfbmFtZQorICAgICAgICBpbm5lci5fX2RvY19fID0gZnVuYy5fX2RvY19fCisgICAgICAgIHJldHVybiBpbm5lcgorICAgIHJldHVybiBkZWNvcmF0b3IKKworCisjIFJldHVybiBUcnVlIGlmIG9wY29kZSBjb2RlIGFwcGVhcnMgaW4gdGhlIHBpY2tsZSwgZWxzZSBGYWxzZS4KK2RlZiBvcGNvZGVfaW5fcGlja2xlKGNvZGUsIHBpY2tsZSk6CisgICAgZm9yIG9wLCBkdW1teSwgZHVtbXkgaW4gcGlja2xldG9vbHMuZ2Vub3BzKHBpY2tsZSk6CisgICAgICAgIGlmIG9wLmNvZGUgPT0gY29kZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKyMgUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgb3Bjb2RlIGNvZGUgYXBwZWFycyBpbiBwaWNrbGUuCitkZWYgY291bnRfb3Bjb2RlKGNvZGUsIHBpY2tsZSk6CisgICAgbiA9IDAKKyAgICBmb3Igb3AsIGR1bW15LCBkdW1teSBpbiBwaWNrbGV0b29scy5nZW5vcHMocGlja2xlKToKKyAgICAgICAgaWYgb3AuY29kZSA9PSBjb2RlOgorICAgICAgICAgICAgbiArPSAxCisgICAgcmV0dXJuIG4KKworIyBXZSBjYW4ndCB2ZXJ5IHdlbGwgdGVzdCB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IHdpdGhvdXQgcHV0dGluZyBrbm93biBzdHVmZgorIyBpbiBpdCwgYnV0IHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byByZXN0b3JlIGl0cyBvcmlnaW5hbCBzdGF0ZS4gIENvZGUKKyMgc2hvdWxkIGRvIHRoaXM6CisjCisjICAgICBlID0gRXh0ZW5zaW9uU2F2ZXIoZXh0ZW5zaW9uX2NvZGUpCisjICAgICB0cnk6CisjICAgICAgICAgZmlkZGxlIHcvIHRoZSBleHRlbnNpb24gcmVnaXN0cnkncyBzdHVmZiBmb3IgZXh0ZW5zaW9uX2NvZGUKKyMgICAgIGZpbmFsbHk6CisjICAgICAgICAgZS5yZXN0b3JlKCkKKworY2xhc3MgRXh0ZW5zaW9uU2F2ZXI6CisgICAgIyBSZW1lbWJlciBjdXJyZW50IHJlZ2lzdHJhdGlvbiBmb3IgY29kZSAoaWYgYW55KSwgYW5kIHJlbW92ZSBpdCAoaWYKKyAgICAjIHRoZXJlIGlzIG9uZSkuCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUpOgorICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCisgICAgICAgIGlmIGNvZGUgaW4gY29weV9yZWcuX2ludmVydGVkX3JlZ2lzdHJ5OgorICAgICAgICAgICAgc2VsZi5wYWlyID0gY29weV9yZWcuX2ludmVydGVkX3JlZ2lzdHJ5W2NvZGVdCisgICAgICAgICAgICBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uKHNlbGYucGFpclswXSwgc2VsZi5wYWlyWzFdLCBjb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wYWlyID0gTm9uZQorCisgICAgIyBSZXN0b3JlIHByZXZpb3VzIHJlZ2lzdHJhdGlvbiBmb3IgY29kZS4KKyAgICBkZWYgcmVzdG9yZShzZWxmKToKKyAgICAgICAgY29kZSA9IHNlbGYuY29kZQorICAgICAgICBjdXJwYWlyID0gY29weV9yZWcuX2ludmVydGVkX3JlZ2lzdHJ5LmdldChjb2RlKQorICAgICAgICBpZiBjdXJwYWlyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29weV9yZWcucmVtb3ZlX2V4dGVuc2lvbihjdXJwYWlyWzBdLCBjdXJwYWlyWzFdLCBjb2RlKQorICAgICAgICBwYWlyID0gc2VsZi5wYWlyCisgICAgICAgIGlmIHBhaXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uKHBhaXJbMF0sIHBhaXJbMV0sIGNvZGUpCisKK2NsYXNzIEM6CisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gY21wKHNlbGYuX19kaWN0X18sIG90aGVyLl9fZGljdF9fKQorCitpbXBvcnQgX19tYWluX18KK19fbWFpbl9fLkMgPSBDCitDLl9fbW9kdWxlX18gPSAiX19tYWluX18iCisKK2NsYXNzIG15aW50KGludCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICBzZWxmLnN0ciA9IHN0cih4KQorCitjbGFzcyBpbml0YXJnKEMpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGEsIGIpOgorICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgIHNlbGYuYiA9IGIKKworICAgIGRlZiBfX2dldGluaXRhcmdzX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmEsIHNlbGYuYgorCitjbGFzcyBtZXRhY2xhc3ModHlwZSk6CisgICAgcGFzcworCitjbGFzcyB1c2VfbWV0YWNsYXNzKG9iamVjdCk6CisgICAgX19tZXRhY2xhc3NfXyA9IG1ldGFjbGFzcworCitjbGFzcyBwaWNrbGluZ19tZXRhY2xhc3ModHlwZSk6CisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiAodHlwZShzZWxmKSA9PSB0eXBlKG90aGVyKSBhbmQKKyAgICAgICAgICAgICAgICBzZWxmLnJlZHVjZV9hcmdzID09IG90aGVyLnJlZHVjZV9hcmdzKQorCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHJldHVybiAoY3JlYXRlX2R5bmFtaWNfY2xhc3MsIHNlbGYucmVkdWNlX2FyZ3MpCisKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworZGVmIGNyZWF0ZV9keW5hbWljX2NsYXNzKG5hbWUsIGJhc2VzKToKKyAgICByZXN1bHQgPSBwaWNrbGluZ19tZXRhY2xhc3MobmFtZSwgYmFzZXMsIGRpY3QoKSkKKyAgICByZXN1bHQucmVkdWNlX2FyZ3MgPSAobmFtZSwgYmFzZXMpCisgICAgcmV0dXJuIHJlc3VsdAorCisjIERBVEEwIC4uIERBVEEyIGFyZSB0aGUgcGlja2xlcyB3ZSBleHBlY3QgdW5kZXIgdGhlIHZhcmlvdXMgcHJvdG9jb2xzLCBmb3IKKyMgdGhlIG9iamVjdCByZXR1cm5lZCBieSBjcmVhdGVfZGF0YSgpLgorCisjIGJyZWFrIGludG8gbXVsdGlwbGUgc3RyaW5ncyB0byBhdm9pZCBjb25mdXNpbmcgZm9udC1sb2NrLW1vZGUKK0RBVEEwID0gIiIiKGxwMQorSTAKK2FMMUwKK2FGMgorYWNfX2J1aWx0aW5fXworY29tcGxleAorcDIKKyIiIiArIFwKKyIiIihGMworRjAKK3RScDMKK2FJMQorYUktMQorYUkyNTUKK2FJLTI1NQorYUktMjU2CithSTY1NTM1CithSS02NTUzNQorYUktNjU1MzYKK2FJMjE0NzQ4MzY0NworYUktMjE0NzQ4MzY0NworYUktMjE0NzQ4MzY0OAorYSIiIiArIFwKKyIiIihTJ2FiYycKK3A0CitnNAorIiIiICsgXAorIiIiKGlfX21haW5fXworQworcDUKKyIiIiArIFwKKyIiIihkcDYKK1MnZm9vJworcDcKK0kxCitzUydiYXInCitwOAorSTIKK3NiZzUKK3RwOQorYWc5CithSTUKK2EuCisiIiIKKworIyBEaXNhc3NlbWJseSBvZiBEQVRBMC4KK0RBVEEwX0RJUyA9ICIiIlwKKyAgICAwOiAoICAgIE1BUksKKyAgICAxOiBsICAgICAgICBMSVNUICAgICAgIChNQVJLIGF0IDApCisgICAgMjogcCAgICBQVVQgICAgICAgIDEKKyAgICA1OiBJICAgIElOVCAgICAgICAgMAorICAgIDg6IGEgICAgQVBQRU5ECisgICAgOTogTCAgICBMT05HICAgICAgIDFMCisgICAxMzogYSAgICBBUFBFTkQKKyAgIDE0OiBGICAgIEZMT0FUICAgICAgMi4wCisgICAxNzogYSAgICBBUFBFTkQKKyAgIDE4OiBjICAgIEdMT0JBTCAgICAgJ19fYnVpbHRpbl9fIGNvbXBsZXgnCisgICAzOTogcCAgICBQVVQgICAgICAgIDIKKyAgIDQyOiAoICAgIE1BUksKKyAgIDQzOiBGICAgICAgICBGTE9BVCAgICAgIDMuMAorICAgNDY6IEYgICAgICAgIEZMT0FUICAgICAgMC4wCisgICA0OTogdCAgICAgICAgVFVQTEUgICAgICAoTUFSSyBhdCA0MikKKyAgIDUwOiBSICAgIFJFRFVDRQorICAgNTE6IHAgICAgUFVUICAgICAgICAzCisgICA1NDogYSAgICBBUFBFTkQKKyAgIDU1OiBJICAgIElOVCAgICAgICAgMQorICAgNTg6IGEgICAgQVBQRU5ECisgICA1OTogSSAgICBJTlQgICAgICAgIC0xCisgICA2MzogYSAgICBBUFBFTkQKKyAgIDY0OiBJICAgIElOVCAgICAgICAgMjU1CisgICA2OTogYSAgICBBUFBFTkQKKyAgIDcwOiBJICAgIElOVCAgICAgICAgLTI1NQorICAgNzY6IGEgICAgQVBQRU5ECisgICA3NzogSSAgICBJTlQgICAgICAgIC0yNTYKKyAgIDgzOiBhICAgIEFQUEVORAorICAgODQ6IEkgICAgSU5UICAgICAgICA2NTUzNQorICAgOTE6IGEgICAgQVBQRU5ECisgICA5MjogSSAgICBJTlQgICAgICAgIC02NTUzNQorICAxMDA6IGEgICAgQVBQRU5ECisgIDEwMTogSSAgICBJTlQgICAgICAgIC02NTUzNgorICAxMDk6IGEgICAgQVBQRU5ECisgIDExMDogSSAgICBJTlQgICAgICAgIDIxNDc0ODM2NDcKKyAgMTIyOiBhICAgIEFQUEVORAorICAxMjM6IEkgICAgSU5UICAgICAgICAtMjE0NzQ4MzY0NworICAxMzY6IGEgICAgQVBQRU5ECisgIDEzNzogSSAgICBJTlQgICAgICAgIC0yMTQ3NDgzNjQ4CisgIDE1MDogYSAgICBBUFBFTkQKKyAgMTUxOiAoICAgIE1BUksKKyAgMTUyOiBTICAgICAgICBTVFJJTkcgICAgICdhYmMnCisgIDE1OTogcCAgICAgICAgUFVUICAgICAgICA0CisgIDE2MjogZyAgICAgICAgR0VUICAgICAgICA0CisgIDE2NTogKCAgICAgICAgTUFSSworICAxNjY6IGkgICAgICAgICAgICBJTlNUICAgICAgICdfX21haW5fXyBDJyAoTUFSSyBhdCAxNjUpCisgIDE3ODogcCAgICAgICAgUFVUICAgICAgICA1CisgIDE4MTogKCAgICAgICAgTUFSSworICAxODI6IGQgICAgICAgICAgICBESUNUICAgICAgIChNQVJLIGF0IDE4MSkKKyAgMTgzOiBwICAgICAgICBQVVQgICAgICAgIDYKKyAgMTg2OiBTICAgICAgICBTVFJJTkcgICAgICdmb28nCisgIDE5MzogcCAgICAgICAgUFVUICAgICAgICA3CisgIDE5NjogSSAgICAgICAgSU5UICAgICAgICAxCisgIDE5OTogcyAgICAgICAgU0VUSVRFTQorICAyMDA6IFMgICAgICAgIFNUUklORyAgICAgJ2JhcicKKyAgMjA3OiBwICAgICAgICBQVVQgICAgICAgIDgKKyAgMjEwOiBJICAgICAgICBJTlQgICAgICAgIDIKKyAgMjEzOiBzICAgICAgICBTRVRJVEVNCisgIDIxNDogYiAgICAgICAgQlVJTEQKKyAgMjE1OiBnICAgICAgICBHRVQgICAgICAgIDUKKyAgMjE4OiB0ICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDE1MSkKKyAgMjE5OiBwICAgIFBVVCAgICAgICAgOQorICAyMjI6IGEgICAgQVBQRU5ECisgIDIyMzogZyAgICBHRVQgICAgICAgIDkKKyAgMjI2OiBhICAgIEFQUEVORAorICAyMjc6IEkgICAgSU5UICAgICAgICA1CisgIDIzMDogYSAgICBBUFBFTkQKKyAgMjMxOiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDAKKyIiIgorCitEQVRBMSA9ICgnXXFceDAxKEtceDAwTDFMXG5HQFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICAnY19fYnVpbHRpbl9fXG5jb21wbGV4XG5xXHgwMihHQFx4MDhceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICAgICAgICdceDAwR1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwdFJxXHgwM0tceDAxSlx4ZmZceGZmJworICAgICAgICAgJ1x4ZmZceGZmS1x4ZmZKXHgwMVx4ZmZceGZmXHhmZkpceDAwXHhmZlx4ZmZceGZmTVx4ZmZceGZmJworICAgICAgICAgJ0pceDAxXHgwMFx4ZmZceGZmSlx4MDBceDAwXHhmZlx4ZmZKXHhmZlx4ZmZceGZmXHg3ZkpceDAxXHgwMCcKKyAgICAgICAgICdceDAwXHg4MEpceDAwXHgwMFx4MDBceDgwKFVceDAzYWJjcVx4MDRoXHgwNChjX19tYWluX19cbicKKyAgICAgICAgICdDXG5xXHgwNW9xXHgwNn1xXHgwNyhVXHgwM2Zvb3FceDA4S1x4MDFVXHgwM2JhcnFcdEtceDAydWJoJworICAgICAgICAgJ1x4MDZ0cVxuaFxuS1x4MDVlLicKKyAgICAgICAgKQorCisjIERpc2Fzc2VtYmx5IG9mIERBVEExLgorREFUQTFfRElTID0gIiIiXAorICAgIDA6IF0gICAgRU1QVFlfTElTVAorICAgIDE6IHEgICAgQklOUFVUICAgICAxCisgICAgMzogKCAgICBNQVJLCisgICAgNDogSyAgICAgICAgQklOSU5UMSAgICAwCisgICAgNjogTCAgICAgICAgTE9ORyAgICAgICAxTAorICAgMTA6IEcgICAgICAgIEJJTkZMT0FUICAgMi4wCisgICAxOTogYyAgICAgICAgR0xPQkFMICAgICAnX19idWlsdGluX18gY29tcGxleCcKKyAgIDQwOiBxICAgICAgICBCSU5QVVQgICAgIDIKKyAgIDQyOiAoICAgICAgICBNQVJLCisgICA0MzogRyAgICAgICAgICAgIEJJTkZMT0FUICAgMy4wCisgICA1MjogRyAgICAgICAgICAgIEJJTkZMT0FUICAgMC4wCisgICA2MTogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgNDIpCisgICA2MjogUiAgICAgICAgUkVEVUNFCisgICA2MzogcSAgICAgICAgQklOUFVUICAgICAzCisgICA2NTogSyAgICAgICAgQklOSU5UMSAgICAxCisgICA2NzogSiAgICAgICAgQklOSU5UICAgICAtMQorICAgNzI6IEsgICAgICAgIEJJTklOVDEgICAgMjU1CisgICA3NDogSiAgICAgICAgQklOSU5UICAgICAtMjU1CisgICA3OTogSiAgICAgICAgQklOSU5UICAgICAtMjU2CisgICA4NDogTSAgICAgICAgQklOSU5UMiAgICA2NTUzNQorICAgODc6IEogICAgICAgIEJJTklOVCAgICAgLTY1NTM1CisgICA5MjogSiAgICAgICAgQklOSU5UICAgICAtNjU1MzYKKyAgIDk3OiBKICAgICAgICBCSU5JTlQgICAgIDIxNDc0ODM2NDcKKyAgMTAyOiBKICAgICAgICBCSU5JTlQgICAgIC0yMTQ3NDgzNjQ3CisgIDEwNzogSiAgICAgICAgQklOSU5UICAgICAtMjE0NzQ4MzY0OAorICAxMTI6ICggICAgICAgIE1BUksKKyAgMTEzOiBVICAgICAgICAgICAgU0hPUlRfQklOU1RSSU5HICdhYmMnCisgIDExODogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNAorICAxMjA6IGggICAgICAgICAgICBCSU5HRVQgICAgIDQKKyAgMTIyOiAoICAgICAgICAgICAgTUFSSworICAxMjM6IGMgICAgICAgICAgICAgICAgR0xPQkFMICAgICAnX19tYWluX18gQycKKyAgMTM1OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgNQorICAxMzc6IG8gICAgICAgICAgICAgICAgT0JKICAgICAgICAoTUFSSyBhdCAxMjIpCisgIDEzODogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNgorICAxNDA6IH0gICAgICAgICAgICBFTVBUWV9ESUNUCisgIDE0MTogcSAgICAgICAgICAgIEJJTlBVVCAgICAgNworICAxNDM6ICggICAgICAgICAgICBNQVJLCisgIDE0NDogVSAgICAgICAgICAgICAgICBTSE9SVF9CSU5TVFJJTkcgJ2ZvbycKKyAgMTQ5OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgOAorICAxNTE6IEsgICAgICAgICAgICAgICAgQklOSU5UMSAgICAxCisgIDE1MzogVSAgICAgICAgICAgICAgICBTSE9SVF9CSU5TVFJJTkcgJ2JhcicKKyAgMTU4OiBxICAgICAgICAgICAgICAgIEJJTlBVVCAgICAgOQorICAxNjA6IEsgICAgICAgICAgICAgICAgQklOSU5UMSAgICAyCisgIDE2MjogdSAgICAgICAgICAgICAgICBTRVRJVEVNUyAgIChNQVJLIGF0IDE0MykKKyAgMTYzOiBiICAgICAgICAgICAgQlVJTEQKKyAgMTY0OiBoICAgICAgICAgICAgQklOR0VUICAgICA2CisgIDE2NjogdCAgICAgICAgICAgIFRVUExFICAgICAgKE1BUksgYXQgMTEyKQorICAxNjc6IHEgICAgICAgIEJJTlBVVCAgICAgMTAKKyAgMTY5OiBoICAgICAgICBCSU5HRVQgICAgIDEwCisgIDE3MTogSyAgICAgICAgQklOSU5UMSAgICA1CisgIDE3MzogZSAgICAgICAgQVBQRU5EUyAgICAoTUFSSyBhdCAzKQorICAxNzQ6IC4gICAgU1RPUAoraGlnaGVzdCBwcm90b2NvbCBhbW9uZyBvcGNvZGVzID0gMQorIiIiCisKK0RBVEEyID0gKCdceDgwXHgwMl1xXHgwMShLXHgwMFx4OGFceDAxXHgwMUdAXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICAgICAgICdjX19idWlsdGluX19cbmNvbXBsZXhcbnFceDAyR0BceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwR1x4MDAnCisgICAgICAgICAnXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ODZScVx4MDNLXHgwMUpceGZmXHhmZlx4ZmZceGZmSycKKyAgICAgICAgICdceGZmSlx4MDFceGZmXHhmZlx4ZmZKXHgwMFx4ZmZceGZmXHhmZk1ceGZmXHhmZkpceDAxXHgwMFx4ZmZceGZmJworICAgICAgICAgJ0pceDAwXHgwMFx4ZmZceGZmSlx4ZmZceGZmXHhmZlx4N2ZKXHgwMVx4MDBceDAwXHg4MEpceDAwXHgwMFx4MDAnCisgICAgICAgICAnXHg4MChVXHgwM2FiY3FceDA0aFx4MDQoY19fbWFpbl9fXG5DXG5xXHgwNW9xXHgwNn1xXHgwNyhVXHgwM2ZvbycKKyAgICAgICAgICdxXHgwOEtceDAxVVx4MDNiYXJxXHRLXHgwMnViaFx4MDZ0cVxuaFxuS1x4MDVlLicpCisKKyMgRGlzYXNzZW1ibHkgb2YgREFUQTIuCitEQVRBMl9ESVMgPSAiIiJcCisgICAgMDogXHg4MCBQUk9UTyAgICAgIDIKKyAgICAyOiBdICAgIEVNUFRZX0xJU1QKKyAgICAzOiBxICAgIEJJTlBVVCAgICAgMQorICAgIDU6ICggICAgTUFSSworICAgIDY6IEsgICAgICAgIEJJTklOVDEgICAgMAorICAgIDg6IFx4OGEgICAgIExPTkcxICAgICAgMUwKKyAgIDExOiBHICAgICAgICBCSU5GTE9BVCAgIDIuMAorICAgMjA6IGMgICAgICAgIEdMT0JBTCAgICAgJ19fYnVpbHRpbl9fIGNvbXBsZXgnCisgICA0MTogcSAgICAgICAgQklOUFVUICAgICAyCisgICA0MzogRyAgICAgICAgQklORkxPQVQgICAzLjAKKyAgIDUyOiBHICAgICAgICBCSU5GTE9BVCAgIDAuMAorICAgNjE6IFx4ODYgICAgIFRVUExFMgorICAgNjI6IFIgICAgICAgIFJFRFVDRQorICAgNjM6IHEgICAgICAgIEJJTlBVVCAgICAgMworICAgNjU6IEsgICAgICAgIEJJTklOVDEgICAgMQorICAgNjc6IEogICAgICAgIEJJTklOVCAgICAgLTEKKyAgIDcyOiBLICAgICAgICBCSU5JTlQxICAgIDI1NQorICAgNzQ6IEogICAgICAgIEJJTklOVCAgICAgLTI1NQorICAgNzk6IEogICAgICAgIEJJTklOVCAgICAgLTI1NgorICAgODQ6IE0gICAgICAgIEJJTklOVDIgICAgNjU1MzUKKyAgIDg3OiBKICAgICAgICBCSU5JTlQgICAgIC02NTUzNQorICAgOTI6IEogICAgICAgIEJJTklOVCAgICAgLTY1NTM2CisgICA5NzogSiAgICAgICAgQklOSU5UICAgICAyMTQ3NDgzNjQ3CisgIDEwMjogSiAgICAgICAgQklOSU5UICAgICAtMjE0NzQ4MzY0NworICAxMDc6IEogICAgICAgIEJJTklOVCAgICAgLTIxNDc0ODM2NDgKKyAgMTEyOiAoICAgICAgICBNQVJLCisgIDExMzogVSAgICAgICAgICAgIFNIT1JUX0JJTlNUUklORyAnYWJjJworICAxMTg6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDQKKyAgMTIwOiBoICAgICAgICAgICAgQklOR0VUICAgICA0CisgIDEyMjogKCAgICAgICAgICAgIE1BUksKKyAgMTIzOiBjICAgICAgICAgICAgICAgIEdMT0JBTCAgICAgJ19fbWFpbl9fIEMnCisgIDEzNTogcSAgICAgICAgICAgICAgICBCSU5QVVQgICAgIDUKKyAgMTM3OiBvICAgICAgICAgICAgICAgIE9CSiAgICAgICAgKE1BUksgYXQgMTIyKQorICAxMzg6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDYKKyAgMTQwOiB9ICAgICAgICAgICAgRU1QVFlfRElDVAorICAxNDE6IHEgICAgICAgICAgICBCSU5QVVQgICAgIDcKKyAgMTQzOiAoICAgICAgICAgICAgTUFSSworICAxNDQ6IFUgICAgICAgICAgICAgICAgU0hPUlRfQklOU1RSSU5HICdmb28nCisgIDE0OTogcSAgICAgICAgICAgICAgICBCSU5QVVQgICAgIDgKKyAgMTUxOiBLICAgICAgICAgICAgICAgIEJJTklOVDEgICAgMQorICAxNTM6IFUgICAgICAgICAgICAgICAgU0hPUlRfQklOU1RSSU5HICdiYXInCisgIDE1ODogcSAgICAgICAgICAgICAgICBCSU5QVVQgICAgIDkKKyAgMTYwOiBLICAgICAgICAgICAgICAgIEJJTklOVDEgICAgMgorICAxNjI6IHUgICAgICAgICAgICAgICAgU0VUSVRFTVMgICAoTUFSSyBhdCAxNDMpCisgIDE2MzogYiAgICAgICAgICAgIEJVSUxECisgIDE2NDogaCAgICAgICAgICAgIEJJTkdFVCAgICAgNgorICAxNjY6IHQgICAgICAgICAgICBUVVBMRSAgICAgIChNQVJLIGF0IDExMikKKyAgMTY3OiBxICAgICAgICBCSU5QVVQgICAgIDEwCisgIDE2OTogaCAgICAgICAgQklOR0VUICAgICAxMAorICAxNzE6IEsgICAgICAgIEJJTklOVDEgICAgNQorICAxNzM6IGUgICAgICAgIEFQUEVORFMgICAgKE1BUksgYXQgNSkKKyAgMTc0OiAuICAgIFNUT1AKK2hpZ2hlc3QgcHJvdG9jb2wgYW1vbmcgb3Bjb2RlcyA9IDIKKyIiIgorCitkZWYgY3JlYXRlX2RhdGEoKToKKyAgICBjID0gQygpCisgICAgYy5mb28gPSAxCisgICAgYy5iYXIgPSAyCisgICAgeCA9IFswLCAxTCwgMi4wLCAzLjArMGpdCisgICAgIyBBcHBlbmQgc29tZSBpbnRlZ2VyIHRlc3QgY2FzZXMgYXQgY1BpY2tsZS5jJ3MgaW50ZXJuYWwgc2l6ZQorICAgICMgY3V0b2Zmcy4KKyAgICB1aW50MW1heCA9IDB4ZmYKKyAgICB1aW50Mm1heCA9IDB4ZmZmZgorICAgIGludDRtYXggPSAweDdmZmZmZmZmCisgICAgeC5leHRlbmQoWzEsIC0xLAorICAgICAgICAgICAgICB1aW50MW1heCwgLXVpbnQxbWF4LCAtdWludDFtYXgtMSwKKyAgICAgICAgICAgICAgdWludDJtYXgsIC11aW50Mm1heCwgLXVpbnQybWF4LTEsCisgICAgICAgICAgICAgICBpbnQ0bWF4LCAgLWludDRtYXgsICAtaW50NG1heC0xXSkKKyAgICB5ID0gKCdhYmMnLCAnYWJjJywgYywgYykKKyAgICB4LmFwcGVuZCh5KQorICAgIHguYXBwZW5kKHkpCisgICAgeC5hcHBlbmQoNSkKKyAgICByZXR1cm4geAorCitjbGFzcyBBYnN0cmFjdFBpY2tsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFN1YmNsYXNzIG11c3QgZGVmaW5lIHNlbGYuZHVtcHMsIHNlbGYubG9hZHMsIHNlbGYuZXJyb3IuCisKKyAgICBfdGVzdGRhdGEgPSBjcmVhdGVfZGF0YSgpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X21pc2Moc2VsZik6CisgICAgICAgICMgdGVzdCB2YXJpb3VzIGRhdGF0eXBlcyBub3QgdGVzdGVkIGJ5IHRlc3RkYXRhCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICB4ID0gbXlpbnQoNCkKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKworICAgICAgICAgICAgeCA9ICgxLCAoKSkKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKworICAgICAgICAgICAgeCA9IGluaXRhcmcoMSwgeCkKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKworICAgICAgICAjIFhYWCB0ZXN0IF9fcmVkdWNlX18gcHJvdG9jb2w/CisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXBfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gc2VsZi5fdGVzdGRhdGEKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGV4cGVjdGVkLCBwcm90bykKKyAgICAgICAgICAgIGdvdCA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgIGRlZiB0ZXN0X2xvYWRfZnJvbV9jYW5uZWRfc3RyaW5nKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IHNlbGYuX3Rlc3RkYXRhCisgICAgICAgIGZvciBjYW5uZWQgaW4gREFUQTAsIERBVEExLCBEQVRBMjoKKyAgICAgICAgICAgIGdvdCA9IHNlbGYubG9hZHMoY2FubmVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgIyBUaGVyZSBhcmUgZ3JhdHVpdG91cyBkaWZmZXJlbmNlcyBiZXR3ZWVuIHBpY2tsZXMgcHJvZHVjZWQgYnkKKyAgICAjIHBpY2tsZSBhbmQgY1BpY2tsZSwgbGFyZ2VseSBiZWNhdXNlIGNQaWNrbGUgc3RhcnRzIFBVVCBpbmRpY2VzIGF0CisgICAgIyAxIGFuZCBwaWNrbGUgc3RhcnRzIHRoZW0gYXQgMC4gIFNlZSBYWFggY29tbWVudCBpbiBjUGlja2xlJ3MgcHV0MigpIC0tCisgICAgIyB0aGVyZSdzIGEgY29tbWVudCB3aXRoIGFuIGV4Y2xhbWF0aW9uIHBvaW50IHRoZXJlIHdob3NlIG1lYW5pbmcKKyAgICAjIGlzIGEgbXlzdGVyeS4gIGNQaWNrbGUgYWxzbyBzdXBwcmVzc2VzIFBVVCBmb3Igb2JqZWN0cyB3aXRoIGEgcmVmY291bnQKKyAgICAjIG9mIDEuCisgICAgZGVmIGRvbnRfdGVzdF9kaXNhc3NlbWJseShzZWxmKToKKyAgICAgICAgZnJvbSBwaWNrbGV0b29scyBpbXBvcnQgZGlzCisKKyAgICAgICAgZm9yIHByb3RvLCBleHBlY3RlZCBpbiAoMCwgREFUQTBfRElTKSwgKDEsIERBVEExX0RJUyk6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyhzZWxmLl90ZXN0ZGF0YSwgcHJvdG8pCisgICAgICAgICAgICBmaWxlbGlrZSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBkaXMocywgb3V0PWZpbGVsaWtlKQorICAgICAgICAgICAgZ290ID0gZmlsZWxpa2UuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2xpc3Qoc2VsZik6CisgICAgICAgIGwgPSBbXQorICAgICAgICBsLmFwcGVuZChsKQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMobCwgcHJvdG8pCisgICAgICAgICAgICB4ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyB4WzBdKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX3R1cGxlKHNlbGYpOgorICAgICAgICB0ID0gKFtdLCkKKyAgICAgICAgdFswXS5hcHBlbmQodCkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHQsIHByb3RvKQorICAgICAgICAgICAgeCA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHgpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeFswXSksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyB4WzBdWzBdKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2RpY3Qoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBkWzFdID0gZAorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoZCwgcHJvdG8pCisgICAgICAgICAgICB4ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmtleXMoKSwgWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMV0gaXMgeCkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9pbnN0KHNlbGYpOgorICAgICAgICBpID0gQygpCisgICAgICAgIGkuYXR0ciA9IGkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGksIHByb3RvKQorICAgICAgICAgICAgeCA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKHgpLCBkaXIoaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHguYXR0ciwgeCkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9tdWx0aShzZWxmKToKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGQgPSB7MTpsfQorICAgICAgICBpID0gQygpCisgICAgICAgIGkuYXR0ciA9IGQKKyAgICAgICAgbC5hcHBlbmQoaSkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGwsIHByb3RvKQorICAgICAgICAgICAgeCA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHgpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoeFswXSksIGRpcihpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFswXS5hdHRyLmtleXMoKSwgWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMF0uYXR0clsxXSBpcyB4KQorCisgICAgZGVmIHRlc3RfZ2FyeXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZXJyb3IsIHNlbGYubG9hZHMsICdnYXJ5cCcpCisKKyAgICBkZWYgdGVzdF9pbnNlY3VyZV9zdHJpbmdzKHNlbGYpOgorICAgICAgICBpbnNlY3VyZSA9IFsiYWJjIiwgIjIgKyAyIiwgIyBub3QgcXVvdGVkCisgICAgICAgICAgICAgICAgICAgICMiJ2FiYycgKyAnZGVmJyIsICMgbm90IGEgc2luZ2xlIHF1b3RlZCBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgIidhYmMiLCAjIHF1b3RlIGlzIG5vdCBjbG9zZWQKKyAgICAgICAgICAgICAgICAgICAgIidhYmNcIiIsICMgb3BlbiBxdW90ZSBhbmQgY2xvc2UgcXVvdGUgZG9uJ3QgbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgIidhYmMnICAgPyIsICMganVuayBhZnRlciBjbG9zZSBxdW90ZQorICAgICAgICAgICAgICAgICAgICAiJ1xcJyIsICMgdHJhaWxpbmcgYmFja3NsYXNoCisgICAgICAgICAgICAgICAgICAgICInIiwgICAgIyBpc3N1ZSAjMTc3MTAKKyAgICAgICAgICAgICAgICAgICAgIicgIiwgICAjIGlzc3VlICMxNzcxMAorICAgICAgICAgICAgICAgICAgICAjIHNvbWUgdGVzdHMgb2YgdGhlIHF1b3RpbmcgcnVsZXMKKyAgICAgICAgICAgICAgICAgICAgIyInYWJjXCJcJyciLAorICAgICAgICAgICAgICAgICAgICAjIidcXFxcYVwnXCdcJ1xcXCdcXFxcXCcnIiwKKyAgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmb3IgcyBpbiBpbnNlY3VyZToKKyAgICAgICAgICAgIGJ1ZiA9ICJTIiArIHMgKyAiXDAxMnAwXDAxMi4iCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmxvYWRzLCBidWYpCisKKyAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgICAgICBlbmRjYXNlcyA9IFt1JycsIHUnPFxcdT4nLCB1JzxcXFx1MTIzND4nLCB1Jzxcbj4nLAorICAgICAgICAgICAgICAgICAgICAgICAgdSc8XFw+JywgdSc8XFxcVTAwMDEyMzQ1PiddCisgICAgICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgICAgIGZvciB1IGluIGVuZGNhc2VzOgorICAgICAgICAgICAgICAgICAgICBwID0gc2VsZi5kdW1wcyh1LCBwcm90bykKKyAgICAgICAgICAgICAgICAgICAgdTIgPSBzZWxmLmxvYWRzKHApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIHUpCisKKyAgICAgICAgZGVmIHRlc3RfdW5pY29kZV9oaWdoX3BsYW5lKHNlbGYpOgorICAgICAgICAgICAgdCA9IHUnXFUwMDAxMjM0NScKKyAgICAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICAgICAgcCA9IHNlbGYuZHVtcHModCwgcHJvdG8pCisgICAgICAgICAgICAgICAgdDIgPSBzZWxmLmxvYWRzKHApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MiwgdCkKKworICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIG4gPSBzeXMubWF4aW50CisgICAgICAgICAgICB3aGlsZSBuOgorICAgICAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOgorICAgICAgICAgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyhleHBlY3RlZCwgcHJvdG8pCisgICAgICAgICAgICAgICAgICAgIG4yID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBuMikKKyAgICAgICAgICAgICAgICBuID0gbiA+PiAxCisKKyAgICBkZWYgdGVzdF9tYXhpbnQ2NChzZWxmKToKKyAgICAgICAgbWF4aW50NjQgPSAoMUwgPDwgNjMpIC0gMQorICAgICAgICBkYXRhID0gJ0knICsgc3RyKG1heGludDY0KSArICdcbi4nCisgICAgICAgIGdvdCA9IHNlbGYubG9hZHMoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIG1heGludDY0KQorCisgICAgICAgICMgVHJ5IHRvbyB3aXRoIGEgYm9ndXMgbGl0ZXJhbC4KKyAgICAgICAgZGF0YSA9ICdJJyArIHN0cihtYXhpbnQ2NCkgKyAnSlVOS1xuLicKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5sb2FkcywgZGF0YSkKKworICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6CisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICAjIDI1NiBieXRlcyBpcyB3aGVyZSBMT05HNCBiZWdpbnMuCisgICAgICAgICAgICBmb3IgbmJpdHMgaW4gMSwgOCwgOCoyNTQsIDgqMjU1LCA4KjI1NiwgOCoyNTc6CisgICAgICAgICAgICAgICAgbmJhc2UgPSAxTCA8PCBuYml0cworICAgICAgICAgICAgICAgIGZvciBucG9zIGluIG5iYXNlLTEsIG5iYXNlLCBuYmFzZSsxOgorICAgICAgICAgICAgICAgICAgICBmb3IgbiBpbiBucG9zLCAtbnBvczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpY2tsZSA9IHNlbGYuZHVtcHMobiwgcHJvdG8pCisgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSBzZWxmLmxvYWRzKHBpY2tsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgZ290KQorICAgICAgICAjIFRyeSBhIG1vbnN0ZXIuICBUaGlzIGlzIHF1YWRyYXRpYy10aW1lIGluIHByb3RvcyAwICYgMSwgc28gZG9uJ3QKKyAgICAgICAgIyBib3RoZXIgd2l0aCB0aG9zZS4KKyAgICAgICAgbmJhc2UgPSBsb25nKCJkZWFkYmVlZmZlZWRmYWNlIiwgMTYpCisgICAgICAgIG5iYXNlICs9IG5iYXNlIDw8IDEwMDAwMDAKKyAgICAgICAgZm9yIG4gaW4gbmJhc2UsIC1uYmFzZToKKyAgICAgICAgICAgIHAgPSBzZWxmLmR1bXBzKG4sIDIpCisgICAgICAgICAgICBnb3QgPSBzZWxmLmxvYWRzKHApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4sIGdvdCkKKworICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgorICAgICAgICB0ZXN0X3ZhbHVlcyA9IFswLjAsIDQuOTRlLTMyNCwgMWUtMzEwLCA3ZS0zMDgsIDYuNjI2ZS0zNCwgMC4xLCAwLjUsCisgICAgICAgICAgICAgICAgICAgICAgIDMuMTQsIDI2My40NDU4MjA2MjM3NDA1MywgNi4wMjJlMjMsIDFlMzBdCisgICAgICAgIHRlc3RfdmFsdWVzID0gdGVzdF92YWx1ZXMgKyBbLXggZm9yIHggaW4gdGVzdF92YWx1ZXNdCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdGVzdF92YWx1ZXM6CisgICAgICAgICAgICAgICAgcGlja2xlID0gc2VsZi5kdW1wcyh2YWx1ZSwgcHJvdG8pCisgICAgICAgICAgICAgICAgZ290ID0gc2VsZi5sb2FkcyhwaWNrbGUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgZ290KQorCisgICAgQHJ1bl93aXRoX2xvY2FsZSgnTENfQUxMJywgJ2RlX0RFJywgJ2ZyX0ZSJykKKyAgICBkZWYgdGVzdF9mbG9hdF9mb3JtYXQoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgZmxvYXRzIGFyZSBmb3JtYXR0ZWQgbG9jYWxlIGluZGVwZW5kZW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kdW1wcygxLjIpWzA6M10sICdGMS4nKQorCisgICAgZGVmIHRlc3RfcmVkdWNlKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9nZXRpbml0YXJncyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbWV0YWNsYXNzKHNlbGYpOgorICAgICAgICBhID0gdXNlX21ldGFjbGFzcygpCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyhhLCBwcm90bykKKyAgICAgICAgICAgIGIgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19jbGFzc19fLCBiLl9fY2xhc3NfXykKKworICAgIGRlZiB0ZXN0X2R5bmFtaWNfY2xhc3Moc2VsZik6CisgICAgICAgIGEgPSBjcmVhdGVfZHluYW1pY19jbGFzcygibXlfZHluYW1pY19jbGFzcyIsIChvYmplY3QsKSkKKyAgICAgICAgY29weV9yZWcucGlja2xlKHBpY2tsaW5nX21ldGFjbGFzcywgcGlja2xpbmdfbWV0YWNsYXNzLl9fcmVkdWNlX18pCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyhhLCBwcm90bykKKyAgICAgICAgICAgIGIgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3RzZXEoc2VsZik6CisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIGltcG9ydCBvcworCisgICAgICAgIHQgPSB0aW1lLmxvY2FsdGltZSgpCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh0LCBwcm90bykKKyAgICAgICAgICAgIHUgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHUpCisgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAic3RhdCIpOgorICAgICAgICAgICAgICAgIHQgPSBvcy5zdGF0KG9zLmN1cmRpcikKKyAgICAgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh0LCBwcm90bykKKyAgICAgICAgICAgICAgICB1ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdSkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJzdGF0dmZzIik6CisgICAgICAgICAgICAgICAgdCA9IG9zLnN0YXR2ZnMob3MuY3VyZGlyKQorICAgICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHQsIHByb3RvKQorICAgICAgICAgICAgICAgIHUgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCB1KQorCisgICAgIyBUZXN0cyBmb3IgcHJvdG9jb2wgMgorCisgICAgZGVmIHRlc3RfcHJvdG8oc2VsZik6CisgICAgICAgIGJ1aWxkX25vbmUgPSBwaWNrbGUuTk9ORSArIHBpY2tsZS5TVE9QCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBleHBlY3RlZCA9IGJ1aWxkX25vbmUKKyAgICAgICAgICAgIGlmIHByb3RvID49IDI6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBwaWNrbGUuUFJPVE8gKyBjaHIocHJvdG8pICsgZXhwZWN0ZWQKKyAgICAgICAgICAgIHAgPSBzZWxmLmR1bXBzKE5vbmUsIHByb3RvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBleHBlY3RlZCkKKworICAgICAgICBvb2IgPSBwcm90b2NvbHNbLTFdICsgMSAgICAgIyBhIGZ1dHVyZSBwcm90b2NvbAorICAgICAgICBiYWRwaWNrbGUgPSBwaWNrbGUuUFJPVE8gKyBjaHIob29iKSArIGJ1aWxkX25vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5sb2FkcyhiYWRwaWNrbGUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBkZXRhaWw6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKGRldGFpbCkuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIHBpY2tsZSBwcm90b2NvbCIpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBiYWQgcHJvdG9jb2wgbnVtYmVyIHRvIHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfbG9uZzEoc2VsZik6CisgICAgICAgIHggPSAxMjM0NTY3ODkxMDExMTIxMzE0MTUxNjE3ODkyMEwKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bjb2RlX2luX3BpY2tsZShwaWNrbGUuTE9ORzEsIHMpLCBwcm90byA+PSAyKQorCisgICAgZGVmIHRlc3RfbG9uZzQoc2VsZik6CisgICAgICAgIHggPSAxMjM0NTY3ODkxMDExMTIxMzE0MTUxNjE3ODkyMEwgPDwgKDI1Nio4KQorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKHBpY2tsZS5MT05HNCwgcyksIHByb3RvID49IDIpCisKKyAgICBkZWYgdGVzdF9zaG9ydF90dXBsZXMoc2VsZik6CisgICAgICAgICMgTWFwIChwcm90bywgbGVuKHR1cGxlKSkgdG8gZXhwZWN0ZWQgb3Bjb2RlLgorICAgICAgICBleHBlY3RlZF9vcGNvZGUgPSB7KDAsIDApOiBwaWNrbGUuVFVQTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgMSk6IHBpY2tsZS5UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgwLCAyKTogcGlja2xlLlRVUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDMpOiBwaWNrbGUuVFVQTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgNCk6IHBpY2tsZS5UVVBMRSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIDApOiBwaWNrbGUuRU1QVFlfVFVQTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgMSk6IHBpY2tsZS5UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAyKTogcGlja2xlLlRVUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIDMpOiBwaWNrbGUuVFVQTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgNCk6IHBpY2tsZS5UVVBMRSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIDApOiBwaWNrbGUuRU1QVFlfVFVQTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMSk6IHBpY2tsZS5UVVBMRTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMik6IHBpY2tsZS5UVVBMRTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgMyk6IHBpY2tsZS5UVVBMRTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgNCk6IHBpY2tsZS5UVVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICBhID0gKCkKKyAgICAgICAgYiA9ICgxLCkKKyAgICAgICAgYyA9ICgxLCAyKQorICAgICAgICBkID0gKDEsIDIsIDMpCisgICAgICAgIGUgPSAoMSwgMiwgMywgNCkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIGZvciB4IGluIGEsIGIsIGMsIGQsIGU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHksIChwcm90bywgeCwgcywgeSkpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZF9vcGNvZGVbcHJvdG8sIGxlbih4KV0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUoZXhwZWN0ZWQsIHMpLCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc2luZ2xldG9ucyhzZWxmKToKKyAgICAgICAgIyBNYXAgKHByb3RvLCBzaW5nbGV0b24pIHRvIGV4cGVjdGVkIG9wY29kZS4KKyAgICAgICAgZXhwZWN0ZWRfb3Bjb2RlID0geygwLCBOb25lKTogcGlja2xlLk5PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgTm9uZSk6IHBpY2tsZS5OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIE5vbmUpOiBwaWNrbGUuTk9ORSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIFRydWUpOiBwaWNrbGUuSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsIFRydWUpOiBwaWNrbGUuSU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIFRydWUpOiBwaWNrbGUuTkVXVFJVRSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIEZhbHNlKTogcGlja2xlLklOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCBGYWxzZSk6IHBpY2tsZS5JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgRmFsc2UpOiBwaWNrbGUuTkVXRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIGZvciB4IGluIE5vbmUsIEZhbHNlLCBUcnVlOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeSwgKHByb3RvLCB4LCBzLCB5KSkKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkX29wY29kZVtwcm90bywgeF0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUoZXhwZWN0ZWQsIHMpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfbmV3b2JqX3R1cGxlKHNlbGYpOgorICAgICAgICB4ID0gTXlUdXBsZShbMSwgMiwgM10pCisgICAgICAgIHguZm9vID0gNDIKKyAgICAgICAgeC5iYXIgPSAiaGVsbG8iCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKHgpLCB0dXBsZSh5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeS5fX2RpY3RfXykKKworICAgIGRlZiB0ZXN0X25ld29ial9saXN0KHNlbGYpOgorICAgICAgICB4ID0gTXlMaXN0KFsxLCAyLCAzXSkKKyAgICAgICAgeC5mb28gPSA0MgorICAgICAgICB4LmJhciA9ICJoZWxsbyIKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4KSwgbGlzdCh5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeS5fX2RpY3RfXykKKworICAgIGRlZiB0ZXN0X25ld29ial9nZW5lcmljKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgZm9yIEMgaW4gbXljbGFzc2VzOgorICAgICAgICAgICAgICAgIEIgPSBDLl9fYmFzZV9fCisgICAgICAgICAgICAgICAgeCA9IEMoQy5zYW1wbGUpCisgICAgICAgICAgICAgICAgeC5mb28gPSA0MgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgZGV0YWlsID0gKHByb3RvLCBDLCBCLCB4LCB5LCB0eXBlKHkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQih4KSwgQih5KSwgZGV0YWlsKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeS5fX2RpY3RfXywgZGV0YWlsKQorCisgICAgIyBSZWdpc3RlciBhIHR5cGUgd2l0aCBjb3B5X3JlZywgd2l0aCBleHRlbnNpb24gY29kZSBleHRjb2RlLiAgUGlja2xlCisgICAgIyBhbiBvYmplY3Qgb2YgdGhhdCB0eXBlLiAgQ2hlY2sgdGhhdCB0aGUgcmVzdWx0aW5nIHBpY2tsZSB1c2VzIG9wY29kZQorICAgICMgKEVYVFsxMjRdKSB1bmRlciBwcm90byAyLCBhbmQgbm90IGluIHByb3RvIDEuCisKKyAgICBkZWYgcHJvZHVjZV9nbG9iYWxfZXh0KHNlbGYsIGV4dGNvZGUsIG9wY29kZSk6CisgICAgICAgIGUgPSBFeHRlbnNpb25TYXZlcihleHRjb2RlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uKF9fbmFtZV9fLCAiTXlMaXN0IiwgZXh0Y29kZSkKKyAgICAgICAgICAgIHggPSBNeUxpc3QoWzEsIDIsIDNdKQorICAgICAgICAgICAgeC5mb28gPSA0MgorICAgICAgICAgICAgeC5iYXIgPSAiaGVsbG8iCisKKyAgICAgICAgICAgICMgRHVtcCB1c2luZyBwcm90b2NvbCAxIGZvciBjb21wYXJpc29uLgorICAgICAgICAgICAgczEgPSBzZWxmLmR1bXBzKHgsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKF9fbmFtZV9fLCBzMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIk15TGlzdCIsIHMxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKG9wY29kZSwgczEpLCBGYWxzZSkKKworICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMoczEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCksIGxpc3QoeSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19kaWN0X18sIHkuX19kaWN0X18pCisKKyAgICAgICAgICAgICMgRHVtcCB1c2luZyBwcm90b2NvbCAyIGZvciB0ZXN0LgorICAgICAgICAgICAgczIgPSBzZWxmLmR1bXBzKHgsIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKF9fbmFtZV9fLCBzMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIk15TGlzdCIsIHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKG9wY29kZSwgczIpLCBUcnVlKQorCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4KSwgbGlzdCh5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeS5fX2RpY3RfXykKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZS5yZXN0b3JlKCkKKworICAgIGRlZiB0ZXN0X2dsb2JhbF9leHQxKHNlbGYpOgorICAgICAgICBzZWxmLnByb2R1Y2VfZ2xvYmFsX2V4dCgweDAwMDAwMDAxLCBwaWNrbGUuRVhUMSkgICMgc21hbGxlc3QgRVhUMSBjb2RlCisgICAgICAgIHNlbGYucHJvZHVjZV9nbG9iYWxfZXh0KDB4MDAwMDAwZmYsIHBpY2tsZS5FWFQxKSAgIyBsYXJnZXN0IEVYVDEgY29kZQorCisgICAgZGVmIHRlc3RfZ2xvYmFsX2V4dDIoc2VsZik6CisgICAgICAgIHNlbGYucHJvZHVjZV9nbG9iYWxfZXh0KDB4MDAwMDAxMDAsIHBpY2tsZS5FWFQyKSAgIyBzbWFsbGVzdCBFWFQyIGNvZGUKKyAgICAgICAgc2VsZi5wcm9kdWNlX2dsb2JhbF9leHQoMHgwMDAwZmZmZiwgcGlja2xlLkVYVDIpICAjIGxhcmdlc3QgRVhUMiBjb2RlCisgICAgICAgIHNlbGYucHJvZHVjZV9nbG9iYWxfZXh0KDB4MDAwMGFiY2QsIHBpY2tsZS5FWFQyKSAgIyBjaGVjayBlbmRpYW5uZXNzCisKKyAgICBkZWYgdGVzdF9nbG9iYWxfZXh0NChzZWxmKToKKyAgICAgICAgc2VsZi5wcm9kdWNlX2dsb2JhbF9leHQoMHgwMDAxMDAwMCwgcGlja2xlLkVYVDQpICAjIHNtYWxsZXN0IEVYVDQgY29kZQorICAgICAgICBzZWxmLnByb2R1Y2VfZ2xvYmFsX2V4dCgweDdmZmZmZmZmLCBwaWNrbGUuRVhUNCkgICMgbGFyZ2VzdCBFWFQ0IGNvZGUKKyAgICAgICAgc2VsZi5wcm9kdWNlX2dsb2JhbF9leHQoMHgxMmFiY2RlZiwgcGlja2xlLkVYVDQpICAjIGNoZWNrIGVuZGlhbm5lc3MKKworICAgIGRlZiB0ZXN0X2xpc3RfY2h1bmtpbmcoc2VsZik6CisgICAgICAgIG4gPSAxMCAgIyB0b28gc21hbGwgdG8gY2h1bmsKKyAgICAgICAgeCA9IHJhbmdlKG4pCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgICAgICBudW1fYXBwZW5kcyA9IGNvdW50X29wY29kZShwaWNrbGUuQVBQRU5EUywgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtX2FwcGVuZHMsIHByb3RvID4gMCkKKworICAgICAgICBuID0gMjUwMCAgIyBleHBlY3QgYXQgbGVhc3QgdHdvIGNodW5rcyB3aGVuIHByb3RvID4gMAorICAgICAgICB4ID0gcmFuZ2UobikKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgICAgIG51bV9hcHBlbmRzID0gY291bnRfb3Bjb2RlKHBpY2tsZS5BUFBFTkRTLCBzKQorICAgICAgICAgICAgaWYgcHJvdG8gPT0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bV9hcHBlbmRzLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnVtX2FwcGVuZHMgPj0gMikKKworICAgIGRlZiB0ZXN0X2RpY3RfY2h1bmtpbmcoc2VsZik6CisgICAgICAgIG4gPSAxMCAgIyB0b28gc21hbGwgdG8gY2h1bmsKKyAgICAgICAgeCA9IGRpY3QuZnJvbWtleXMocmFuZ2UobikpCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgICAgICBudW1fc2V0aXRlbXMgPSBjb3VudF9vcGNvZGUocGlja2xlLlNFVElURU1TLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fc2V0aXRlbXMsIHByb3RvID4gMCkKKworICAgICAgICBuID0gMjUwMCAgIyBleHBlY3QgYXQgbGVhc3QgdHdvIGNodW5rcyB3aGVuIHByb3RvID4gMAorICAgICAgICB4ID0gZGljdC5mcm9ta2V5cyhyYW5nZShuKSkKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgICAgIG51bV9zZXRpdGVtcyA9IGNvdW50X29wY29kZShwaWNrbGUuU0VUSVRFTVMsIHMpCisgICAgICAgICAgICBpZiBwcm90byA9PSAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtX3NldGl0ZW1zLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnVtX3NldGl0ZW1zID49IDIpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfbmV3b2JqKHNlbGYpOgorICAgICAgICB4ID0gb2JqZWN0Ll9fbmV3X18oU2ltcGxlTmV3T2JqKSAgIyBhdm9pZCBfX2luaXRfXworICAgICAgICB4LmFiYyA9IDY2NgorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUocGlja2xlLk5FV09CSiwgcyksIHByb3RvID49IDIpCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKSAgICMgd2lsbCByYWlzZSBUeXBlRXJyb3IgaWYgX19pbml0X18gY2FsbGVkCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYWJjLCA2NjYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19kaWN0X18sIHkuX19kaWN0X18pCisKKyAgICBkZWYgdGVzdF9uZXdvYmpfbGlzdF9zbG90cyhzZWxmKToKKyAgICAgICAgeCA9IFNsb3RMaXN0KFsxLCAyLCAzXSkKKyAgICAgICAgeC5mb28gPSA0MgorICAgICAgICB4LmJhciA9ICJoZWxsbyIKKyAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgMikKKyAgICAgICAgeSA9IHNlbGYubG9hZHMocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHgpLCBsaXN0KHkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19kaWN0X18sIHkuX19kaWN0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIHkuZm9vKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYmFyLCB5LmJhcikKKworICAgIGRlZiB0ZXN0X3JlZHVjZV9vdmVycmlkZXNfZGVmYXVsdF9yZWR1Y2VfZXgoc2VsZik6CisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICB4ID0gUkVYX29uZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3JlZHVjZV9jYWxsZWQsIDApCisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fcmVkdWNlX2NhbGxlZCwgMSkKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX3JlZHVjZV9jYWxsZWQsIDApCisKKyAgICBkZWYgdGVzdF9yZWR1Y2VfZXhfY2FsbGVkKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgeCA9IFJFWF90d28oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9wcm90bywgTm9uZSkKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9wcm90bywgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9wcm90bywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JlZHVjZV9leF9vdmVycmlkZXNfcmVkdWNlKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG8gaW4gcHJvdG9jb2xzOgorICAgICAgICAgICAgeCA9IFJFWF90aHJlZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3Byb3RvLCBOb25lKQorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3Byb3RvLCBwcm90bykKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX3Byb3RvLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmVkdWNlX2V4X2NhbGxzX2Jhc2Uoc2VsZik6CisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICB4ID0gUkVYX2ZvdXIoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9wcm90bywgTm9uZSkKKyAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKHgsIHByb3RvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9wcm90bywgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9wcm90bywgcHJvdG8pCisKKyAgICBkZWYgdGVzdF9yZWR1Y2VfY2FsbHNfYmFzZShzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHggPSBSRVhfZml2ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX3JlZHVjZV9jYWxsZWQsIDApCisgICAgICAgICAgICBzID0gc2VsZi5kdW1wcyh4LCBwcm90bykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fcmVkdWNlX2NhbGxlZCwgMSkKKyAgICAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX3JlZHVjZV9jYWxsZWQsIDEpCisKKyAgICBkZWYgdGVzdF9yZWR1Y2VfYmFkX2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICAjIElzc3VlNDE3NjogY3Jhc2ggd2hlbiA0dGggYW5kIDV0aCBpdGVtcyBvZiBfX3JlZHVjZV9fKCkKKyAgICAgICAgIyBhcmUgbm90IGl0ZXJhdG9ycworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIDR0aCBpdGVtIGlzIG5vdCBhbiBpdGVyYXRvcgorICAgICAgICAgICAgICAgIHJldHVybiBsaXN0LCAoKSwgTm9uZSwgW10sIE5vbmUKKyAgICAgICAgY2xhc3MgRChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICAgICAgICAgIyA1dGggaXRlbSBpcyBub3QgYW4gaXRlcmF0b3IKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdCwgKCksIE5vbmUsIE5vbmUsIFtdCisKKyAgICAgICAgIyBQcm90b2NvbCAwIGlzIGxlc3Mgc3RyaWN0IGFuZCBhbHNvIGFjY2VwdCBpdGVyYWJsZXMuCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5kdW1wcyhDKCksIHByb3RvKQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgcGlja2xlLlBpY2tsZUVycm9yLCBjUGlja2xlLlBpY2tsZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5kdW1wcyhEKCksIHByb3RvKQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgcGlja2xlLlBpY2tsZUVycm9yLCBjUGlja2xlLlBpY2tsZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9tYW55X3B1dHNfYW5kX2dldHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBjb3JyZWN0bHkgZGVhbCB3aXRoIGxvdHMgb2YKKyAgICAgICAgIyBwdXRzL2dldHMuCisgICAgICAgIGtleXMgPSAoImFhYSIgKyBzdHIoaSkgZm9yIGkgaW4geHJhbmdlKDEwMCkpCisgICAgICAgIGxhcmdlX2RpY3QgPSBkaWN0KChrLCBbNCwgNSwgNl0pIGZvciBrIGluIGtleXMpCisgICAgICAgIG9iaiA9IFtkaWN0KGxhcmdlX2RpY3QpLCBkaWN0KGxhcmdlX2RpY3QpLCBkaWN0KGxhcmdlX2RpY3QpXQorCisgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICBkdW1wZWQgPSBzZWxmLmR1bXBzKG9iaiwgcHJvdG8pCisgICAgICAgICAgICBsb2FkZWQgPSBzZWxmLmxvYWRzKGR1bXBlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVkLCBvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgcHJvdG9jb2wgJWQ6ICVyICE9ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChwcm90bywgb2JqLCBsb2FkZWQpKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlX25hbWVfaW50ZXJuaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhdHRyaWJ1dGUgbmFtZXMgb2YgcGlja2xlZCBvYmplY3RzIGFyZSBpbnRlcm5lZCB3aGVuCisgICAgICAgICMgdW5waWNrbGluZy4KKyAgICAgICAgZm9yIHByb3RvIGluIHByb3RvY29sczoKKyAgICAgICAgICAgIHggPSBDKCkKKyAgICAgICAgICAgIHguZm9vID0gNDIKKyAgICAgICAgICAgIHguYmFyID0gImhlbGxvIgorICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCisgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzKQorICAgICAgICAgICAgeF9rZXlzID0gc29ydGVkKHguX19kaWN0X18pCisgICAgICAgICAgICB5X2tleXMgPSBzb3J0ZWQoeS5fX2RpY3RfXykKKyAgICAgICAgICAgIGZvciB4X2tleSwgeV9rZXkgaW4gemlwKHhfa2V5cywgeV9rZXlzKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHhfa2V5LCB5X2tleSkKKworCisjIFRlc3QgY2xhc3NlcyBmb3IgcmVkdWNlX2V4CisKK2NsYXNzIFJFWF9vbmUob2JqZWN0KToKKyAgICBfcmVkdWNlX2NhbGxlZCA9IDAKKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fcmVkdWNlX2NhbGxlZCA9IDEKKyAgICAgICAgcmV0dXJuIFJFWF9vbmUsICgpCisgICAgIyBObyBfX3JlZHVjZV9leF9fIGhlcmUsIGJ1dCBpbmhlcml0aW5nIGl0IGZyb20gb2JqZWN0CisKK2NsYXNzIFJFWF90d28ob2JqZWN0KToKKyAgICBfcHJvdG8gPSBOb25lCisgICAgZGVmIF9fcmVkdWNlX2V4X18oc2VsZiwgcHJvdG8pOgorICAgICAgICBzZWxmLl9wcm90byA9IHByb3RvCisgICAgICAgIHJldHVybiBSRVhfdHdvLCAoKQorICAgICMgTm8gX19yZWR1Y2VfXyBoZXJlLCBidXQgaW5oZXJpdGluZyBpdCBmcm9tIG9iamVjdAorCitjbGFzcyBSRVhfdGhyZWUob2JqZWN0KToKKyAgICBfcHJvdG8gPSBOb25lCisgICAgZGVmIF9fcmVkdWNlX2V4X18oc2VsZiwgcHJvdG8pOgorICAgICAgICBzZWxmLl9wcm90byA9IHByb3RvCisgICAgICAgIHJldHVybiBSRVhfdHdvLCAoKQorICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiVGhpcyBfX3JlZHVjZV9fIHNob3VsZG4ndCBiZSBjYWxsZWQiCisKK2NsYXNzIFJFWF9mb3VyKG9iamVjdCk6CisgICAgX3Byb3RvID0gTm9uZQorICAgIGRlZiBfX3JlZHVjZV9leF9fKHNlbGYsIHByb3RvKToKKyAgICAgICAgc2VsZi5fcHJvdG8gPSBwcm90bworICAgICAgICByZXR1cm4gb2JqZWN0Ll9fcmVkdWNlX2V4X18oc2VsZiwgcHJvdG8pCisgICAgIyBDYWxsaW5nIGJhc2UgY2xhc3MgbWV0aG9kIHNob3VsZCBzdWNjZWVkCisKK2NsYXNzIFJFWF9maXZlKG9iamVjdCk6CisgICAgX3JlZHVjZV9jYWxsZWQgPSAwCisgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgIHNlbGYuX3JlZHVjZV9jYWxsZWQgPSAxCisgICAgICAgIHJldHVybiBvYmplY3QuX19yZWR1Y2VfXyhzZWxmKQorICAgICMgVGhpcyBvbmUgdXNlZCB0byBmYWlsIHdpdGggaW5maW5pdGUgcmVjdXJzaW9uCisKKyMgVGVzdCBjbGFzc2VzIGZvciBuZXdvYmoKKworY2xhc3MgTXlJbnQoaW50KToKKyAgICBzYW1wbGUgPSAxCisKK2NsYXNzIE15TG9uZyhsb25nKToKKyAgICBzYW1wbGUgPSAxTAorCitjbGFzcyBNeUZsb2F0KGZsb2F0KToKKyAgICBzYW1wbGUgPSAxLjAKKworY2xhc3MgTXlDb21wbGV4KGNvbXBsZXgpOgorICAgIHNhbXBsZSA9IDEuMCArIDAuMGoKKworY2xhc3MgTXlTdHIoc3RyKToKKyAgICBzYW1wbGUgPSAiaGVsbG8iCisKK2NsYXNzIE15VW5pY29kZSh1bmljb2RlKToKKyAgICBzYW1wbGUgPSB1ImhlbGxvIFx1MTIzNCIKKworY2xhc3MgTXlUdXBsZSh0dXBsZSk6CisgICAgc2FtcGxlID0gKDEsIDIsIDMpCisKK2NsYXNzIE15TGlzdChsaXN0KToKKyAgICBzYW1wbGUgPSBbMSwgMiwgM10KKworY2xhc3MgTXlEaWN0KGRpY3QpOgorICAgIHNhbXBsZSA9IHsiYSI6IDEsICJiIjogMn0KKworbXljbGFzc2VzID0gW015SW50LCBNeUxvbmcsIE15RmxvYXQsCisgICAgICAgICAgICAgTXlDb21wbGV4LAorICAgICAgICAgICAgIE15U3RyLCBNeVVuaWNvZGUsCisgICAgICAgICAgICAgTXlUdXBsZSwgTXlMaXN0LCBNeURpY3RdCisKKworY2xhc3MgU2xvdExpc3QoTXlMaXN0KToKKyAgICBfX3Nsb3RzX18gPSBbImZvbyJdCisKK2NsYXNzIFNpbXBsZU5ld09iaihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhLCBiLCBjKToKKyAgICAgICAgIyByYWlzZSBhbiBlcnJvciwgdG8gbWFrZSBzdXJlIHRoaXMgaXNuJ3QgY2FsbGVkCisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiU2ltcGxlTmV3T2JqLl9faW5pdF9fKCkgZGlkbid0IGV4cGVjdCB0byBnZXQgY2FsbGVkIikKKworY2xhc3MgQWJzdHJhY3RQaWNrbGVNb2R1bGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kdW1wX2Nsb3NlZF9maWxlKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5tb2R1bGUuZHVtcCwgMTIzLCBmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2xvYWRfY2xvc2VkX2ZpbGUoc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLm1vZHVsZS5kdW1wLCAxMjMsIGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfbG9hZF9mcm9tX2FuZF9kdW1wX3RvX2ZpbGUoc2VsZik6CisgICAgICAgIHN0cmVhbSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGRhdGEgPSBbMTIzLCB7fSwgMTI0XQorICAgICAgICBzZWxmLm1vZHVsZS5kdW1wKGRhdGEsIHN0cmVhbSkKKyAgICAgICAgc3RyZWFtLnNlZWsoMCkKKyAgICAgICAgdW5waWNrbGVkID0gc2VsZi5tb2R1bGUubG9hZChzdHJlYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5waWNrbGVkLCBkYXRhKQorCisgICAgZGVmIHRlc3RfaGlnaGVzdF9wcm90b2NvbChzZWxmKToKKyAgICAgICAgIyBPZiBjb3Vyc2UgdGhpcyBuZWVkcyB0byBiZSBjaGFuZ2VkIHdoZW4gSElHSEVTVF9QUk9UT0NPTCBjaGFuZ2VzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubW9kdWxlLkhJR0hFU1RfUFJPVE9DT0wsIDIpCisKKyAgICBkZWYgdGVzdF9jYWxsYXBpKHNlbGYpOgorICAgICAgICBmID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgIyBXaXRoIGFuZCB3aXRob3V0IGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIHNlbGYubW9kdWxlLmR1bXAoMTIzLCBmLCAtMSkKKyAgICAgICAgc2VsZi5tb2R1bGUuZHVtcCgxMjMsIGZpbGU9ZiwgcHJvdG9jb2w9LTEpCisgICAgICAgIHNlbGYubW9kdWxlLmR1bXBzKDEyMywgLTEpCisgICAgICAgIHNlbGYubW9kdWxlLmR1bXBzKDEyMywgcHJvdG9jb2w9LTEpCisgICAgICAgIHNlbGYubW9kdWxlLlBpY2tsZXIoZiwgLTEpCisgICAgICAgIHNlbGYubW9kdWxlLlBpY2tsZXIoZiwgcHJvdG9jb2w9LTEpCisKKyAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX2lucHV0KHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oIlgnJy4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgc2VsZi5tb2R1bGUubG9hZCwgcykKKworICAgIGRlZiB0ZXN0X3Jlc3RyaWN0ZWQoc2VsZik6CisgICAgICAgICMgaXNzdWU3MTI4OiBjUGlja2xlIGZhaWxlZCBpbiByZXN0cmljdGVkIG1vZGUKKyAgICAgICAgYnVpbHRpbnMgPSB7c2VsZi5tb2R1bGUuX19uYW1lX186IHNlbGYubW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAnX19pbXBvcnRfXyc6IF9faW1wb3J0X199CisgICAgICAgIGQgPSB7fQorICAgICAgICB0ZXN0c3RyID0gImRlZiBmKCk6IHswfS5kdW1wcygwKSIuZm9ybWF0KHNlbGYubW9kdWxlLl9fbmFtZV9fKQorICAgICAgICBleGVjIHRlc3RzdHIgaW4geydfX2J1aWx0aW5zX18nOiBidWlsdGluc30sIGQKKyAgICAgICAgZFsnZiddKCkKKworICAgIGRlZiB0ZXN0X2JhZF9pbnB1dChzZWxmKToKKyAgICAgICAgIyBUZXN0IGlzc3VlNDI5OAorICAgICAgICBzID0gJ1x4NThcMFwwXDBceDU0JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgc2VsZi5tb2R1bGUubG9hZHMsIHMpCisgICAgICAgICMgVGVzdCBpc3N1ZTc0NTUKKyAgICAgICAgcyA9ICcwJworICAgICAgICAjIFhYWCBXaHkgZG9lc24ndCBwaWNrbGUgcmFpc2UgVW5waWNrbGluZ0Vycm9yPworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoSW5kZXhFcnJvciwgY1BpY2tsZS5VbnBpY2tsaW5nRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5sb2FkcywgcykKKworY2xhc3MgQWJzdHJhY3RQZXJzaXN0ZW50UGlja2xlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgVGhpcyBjbGFzcyBkZWZpbmVzIHBlcnNpc3RlbnRfaWQoKSBhbmQgcGVyc2lzdGVudF9sb2FkKCkKKyAgICAjIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBwaWNrbGVyLiAgQWxsIGV2ZW4gaW50ZWdlcnMKKyAgICAjIGFyZSBwaWNrbGVkIHVzaW5nIHBlcnNpc3RlbnQgaWRzLgorCisgICAgZGVmIHBlcnNpc3RlbnRfaWQoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvYmplY3QsIGludCkgYW5kIG9iamVjdCAlIDIgPT0gMDoKKyAgICAgICAgICAgIHNlbGYuaWRfY291bnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuIHN0cihvYmplY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHBlcnNpc3RlbnRfbG9hZChzZWxmLCBvaWQpOgorICAgICAgICBzZWxmLmxvYWRfY291bnQgKz0gMQorICAgICAgICBvYmplY3QgPSBpbnQob2lkKQorICAgICAgICBhc3NlcnQgb2JqZWN0ICUgMiA9PSAwCisgICAgICAgIHJldHVybiBvYmplY3QKKworICAgIGRlZiB0ZXN0X3BlcnNpc3RlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmlkX2NvdW50ID0gMAorICAgICAgICBzZWxmLmxvYWRfY291bnQgPSAwCisgICAgICAgIEwgPSByYW5nZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMoTCkpLCBMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaWRfY291bnQsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkX2NvdW50LCA1KQorCisgICAgZGVmIHRlc3RfYmluX3BlcnNpc3RlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmlkX2NvdW50ID0gMAorICAgICAgICBzZWxmLmxvYWRfY291bnQgPSAwCisgICAgICAgIEwgPSByYW5nZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmxvYWRzKHNlbGYuZHVtcHMoTCwgMSkpLCBMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaWRfY291bnQsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5sb2FkX2NvdW50LCA1KQorCitjbGFzcyBBYnN0cmFjdFBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBwaWNrbGVyX2NsYXNzID0gTm9uZQorICAgIHVucGlja2xlcl9jbGFzcyA9IE5vbmUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYucGlja2xlcl9jbGFzcworICAgICAgICBhc3NlcnQgc2VsZi51bnBpY2tsZXJfY2xhc3MKKworICAgIGRlZiB0ZXN0X2NsZWFyX3BpY2tsZXJfbWVtbyhzZWxmKToKKyAgICAgICAgIyBUbyB0ZXN0IHdoZXRoZXIgY2xlYXJfbWVtbygpIGhhcyBhbnkgZWZmZWN0LCB3ZSBwaWNrbGUgYW4gb2JqZWN0LAorICAgICAgICAjIHRoZW4gcGlja2xlIGl0IGFnYWluIHdpdGhvdXQgY2xlYXJpbmcgdGhlIG1lbW87IHRoZSB0d28gc2VyaWFsaXplZAorICAgICAgICAjIGZvcm1zIHNob3VsZCBiZSBkaWZmZXJlbnQuIElmIHdlIGNsZWFyX21lbW8oKSBhbmQgdGhlbiBwaWNrbGUgdGhlCisgICAgICAgICMgb2JqZWN0IGFnYWluLCB0aGUgdGhpcmQgc2VyaWFsaXplZCBmb3JtIHNob3VsZCBiZSBpZGVudGljYWwgdG8gdGhlCisgICAgICAgICMgZmlyc3Qgb25lIHdlIG9idGFpbmVkLgorICAgICAgICBkYXRhID0gWyJhYmNkZWZnIiwgImFiY2RlZmciLCA0NF0KKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHBpY2tsZXIgPSBzZWxmLnBpY2tsZXJfY2xhc3MoZikKKworICAgICAgICBwaWNrbGVyLmR1bXAoZGF0YSkKKyAgICAgICAgZmlyc3RfcGlja2xlZCA9IGYuZ2V0dmFsdWUoKQorCisgICAgICAgICMgUmVzZXQgU3RyaW5nSU8gb2JqZWN0LgorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgZi50cnVuY2F0ZSgpCisKKyAgICAgICAgcGlja2xlci5kdW1wKGRhdGEpCisgICAgICAgIHNlY29uZF9waWNrbGVkID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgIyBSZXNldCB0aGUgUGlja2xlciBhbmQgU3RyaW5nSU8gb2JqZWN0cy4KKyAgICAgICAgcGlja2xlci5jbGVhcl9tZW1vKCkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIGYudHJ1bmNhdGUoKQorCisgICAgICAgIHBpY2tsZXIuZHVtcChkYXRhKQorICAgICAgICB0aGlyZF9waWNrbGVkID0gZi5nZXR2YWx1ZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9waWNrbGVkLCBzZWNvbmRfcGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9waWNrbGVkLCB0aGlyZF9waWNrbGVkKQorCisgICAgZGVmIHRlc3RfcHJpbWluZ19waWNrbGVyX21lbW8oc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgd2UgY2FuIHNldCB0aGUgUGlja2xlcidzIG1lbW8gYXR0cmlidXRlLgorICAgICAgICBkYXRhID0gWyJhYmNkZWZnIiwgImFiY2RlZmciLCA0NF0KKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHBpY2tsZXIgPSBzZWxmLnBpY2tsZXJfY2xhc3MoZikKKworICAgICAgICBwaWNrbGVyLmR1bXAoZGF0YSkKKyAgICAgICAgZmlyc3RfcGlja2xlZCA9IGYuZ2V0dmFsdWUoKQorCisgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBwcmltZWQgPSBzZWxmLnBpY2tsZXJfY2xhc3MoZikKKyAgICAgICAgcHJpbWVkLm1lbW8gPSBwaWNrbGVyLm1lbW8KKworICAgICAgICBwcmltZWQuZHVtcChkYXRhKQorICAgICAgICBwcmltZWRfcGlja2xlZCA9IGYuZ2V0dmFsdWUoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmlyc3RfcGlja2xlZCwgcHJpbWVkX3BpY2tsZWQpCisKKyAgICBkZWYgdGVzdF9wcmltaW5nX3VucGlja2xlcl9tZW1vKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IHdlIGNhbiBzZXQgdGhlIFVucGlja2xlcidzIG1lbW8gYXR0cmlidXRlLgorICAgICAgICBkYXRhID0gWyJhYmNkZWZnIiwgImFiY2RlZmciLCA0NF0KKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHBpY2tsZXIgPSBzZWxmLnBpY2tsZXJfY2xhc3MoZikKKworICAgICAgICBwaWNrbGVyLmR1bXAoZGF0YSkKKyAgICAgICAgZmlyc3RfcGlja2xlZCA9IGYuZ2V0dmFsdWUoKQorCisgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBwcmltZWQgPSBzZWxmLnBpY2tsZXJfY2xhc3MoZikKKyAgICAgICAgcHJpbWVkLm1lbW8gPSBwaWNrbGVyLm1lbW8KKworICAgICAgICBwcmltZWQuZHVtcChkYXRhKQorICAgICAgICBwcmltZWRfcGlja2xlZCA9IGYuZ2V0dmFsdWUoKQorCisgICAgICAgIHVucGlja2xlciA9IHNlbGYudW5waWNrbGVyX2NsYXNzKGNTdHJpbmdJTy5TdHJpbmdJTyhmaXJzdF9waWNrbGVkKSkKKyAgICAgICAgdW5waWNrbGVkX2RhdGExID0gdW5waWNrbGVyLmxvYWQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5waWNrbGVkX2RhdGExLCBkYXRhKQorCisgICAgICAgIHByaW1lZCA9IHNlbGYudW5waWNrbGVyX2NsYXNzKGNTdHJpbmdJTy5TdHJpbmdJTyhwcmltZWRfcGlja2xlZCkpCisgICAgICAgIHByaW1lZC5tZW1vID0gdW5waWNrbGVyLm1lbW8KKyAgICAgICAgdW5waWNrbGVkX2RhdGEyID0gcHJpbWVkLmxvYWQoKQorCisgICAgICAgIHByaW1lZC5tZW1vLmNsZWFyKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVucGlja2xlZF9kYXRhMiwgZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVucGlja2xlZF9kYXRhMiBpcyB1bnBpY2tsZWRfZGF0YTEpCisKKyAgICBkZWYgdGVzdF9yZXVzaW5nX3VucGlja2xlcl9vYmplY3RzKHNlbGYpOgorICAgICAgICBkYXRhMSA9IFsiYWJjZGVmZyIsICJhYmNkZWZnIiwgNDRdCisgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBwaWNrbGVyID0gc2VsZi5waWNrbGVyX2NsYXNzKGYpCisgICAgICAgIHBpY2tsZXIuZHVtcChkYXRhMSkKKyAgICAgICAgcGlja2xlZDEgPSBmLmdldHZhbHVlKCkKKworICAgICAgICBkYXRhMiA9IFsiYWJjZGVmZyIsIDQ0LCA0NF0KKyAgICAgICAgZiA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHBpY2tsZXIgPSBzZWxmLnBpY2tsZXJfY2xhc3MoZikKKyAgICAgICAgcGlja2xlci5kdW1wKGRhdGEyKQorICAgICAgICBwaWNrbGVkMiA9IGYuZ2V0dmFsdWUoKQorCisgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBmLndyaXRlKHBpY2tsZWQxKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgdW5waWNrbGVyID0gc2VsZi51bnBpY2tsZXJfY2xhc3MoZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZXIubG9hZCgpLCBkYXRhMSkKKworICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgZi50cnVuY2F0ZSgpCisgICAgICAgIGYud3JpdGUocGlja2xlZDIpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVucGlja2xlci5sb2FkKCksIGRhdGEyKQorCitjbGFzcyBCaWdtZW1QaWNrbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIE1lbW9yeSByZXF1aXJlbWVudHM6IDEgYnl0ZSBwZXIgY2hhcmFjdGVyIGZvciBpbnB1dCBzdHJpbmdzLCAxIGJ5dGUKKyAgICAjIGZvciBwaWNrbGVkIGRhdGEsIDEgYnl0ZSBmb3IgdW5waWNrbGVkIHN0cmluZ3MsIDEgYnl0ZSBmb3IgaW50ZXJuYWwKKyAgICAjIGJ1ZmZlciBhbmQgMSBieXRlIG9mIGZyZWUgc3BhY2UgZm9yIHJlc2l6aW5nIG9mIGludGVybmFsIGJ1ZmZlci4KKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHICsgMTAwKl8xTSwgbWVtdXNlPTUpCisgICAgZGVmIHRlc3RfaHVnZV9zdHJsaXN0KHNlbGYsIHNpemUpOgorICAgICAgICBjaHVua3NpemUgPSAyKioyMAorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgd2hpbGUgc2l6ZSA+IGNodW5rc2l6ZToKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKCd4JyAqIGNodW5rc2l6ZSkKKyAgICAgICAgICAgIHNpemUgLT0gY2h1bmtzaXplCisgICAgICAgICAgICBjaHVua3NpemUgKz0gMQorICAgICAgICBkYXRhLmFwcGVuZCgneScgKiBzaXplKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBwcm90byBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwaWNrbGVkID0gc2VsZi5kdW1wcyhkYXRhLCBwcm90bykKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gc2VsZi5sb2FkcyhwaWNrbGVkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgZGF0YSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICByZXMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZWQgPSBOb25lCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkYXRhID0gTm9uZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3BpY2tsZXRlc3Rlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2RiNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3BpY2tsZXRlc3Rlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3BpY2tsZXRlc3Rlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcGlja2xldGVzdGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDRjMzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3BpY2tsZXRlc3Rlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Byb2ZpbGVlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Byb2ZpbGVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZDJjODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHJvZmlsZWUucHkKQEAgLTAsMCArMSwxMTUgQEAKKyIiIgorSW5wdXQgZm9yIHRlc3RfcHJvZmlsZS5weSBhbmQgdGVzdF9jcHJvZmlsZS5weS4KKworSU1QT1JUQU5UOiBUaGlzIHN0dWZmIGlzIHRvdWNoeS4gSWYgeW91IG1vZGlmeSBhbnl0aGluZyBhYm92ZSB0aGUKK3Rlc3QgY2xhc3MgeW91J2xsIGhhdmUgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhdHMgYnkgcnVubmluZyB0aGUgdHdvCit0ZXN0IGZpbGVzLgorCisqQUxMKiBOVU1CRVJTIGluIHRoZSBleHBlY3RlZCBvdXRwdXQgYXJlIHJlbGV2YW50LiAgSWYgeW91IGNoYW5nZQordGhlIGZvcm1hdHRpbmcgb2YgcHN0YXRzLCBwbGVhc2UgZG9uJ3QganVzdCByZWdlbmVyYXRlIHRoZSBleHBlY3RlZAorb3V0cHV0IHdpdGhvdXQgY2hlY2tpbmcgdmVyeSBjYXJlZnVsbHkgdGhhdCBub3QgYSBzaW5nbGUgbnVtYmVyIGhhcworY2hhbmdlZC4KKyIiIgorCitpbXBvcnQgc3lzCisKKyMgSW4gb3JkZXIgdG8gaGF2ZSByZXByb2R1Y2libGUgdGltZSwgd2Ugc2ltdWxhdGUgYSB0aW1lciBpbiB0aGUgZ2xvYmFsCisjIHZhcmlhYmxlICdUSUNLUycsIHdoaWNoIHJlcHJlc2VudHMgc2ltdWxhdGVkIHRpbWUgaW4gbWlsbGlzZWNvbmRzLgorIyAoV2UgY2FuJ3QgdXNlIGEgaGVscGVyIGZ1bmN0aW9uIGluY3JlbWVudCB0aGUgdGltZXIgc2luY2UgaXQgd291bGQgYmUKKyMgaW5jbHVkZWQgaW4gdGhlIHByb2ZpbGUgYW5kIHdvdWxkIGFwcGVhciB0byBjb25zdW1lIGFsbCB0aGUgdGltZS4pCitUSUNLUyA9IDQyMDAwCisKK2RlZiB0aW1lcigpOgorICAgIHJldHVybiBUSUNLUworCitkZWYgdGVzdGZ1bmMoKToKKyAgICAjIDEgY2FsbAorICAgICMgMTAwMCB0aWNrcyB0b3RhbDogMjcwIHRpY2tzIGxvY2FsLCA3MzAgdGlja3MgaW4gc3ViZnVuY3Rpb25zCisgICAgZ2xvYmFsIFRJQ0tTCisgICAgVElDS1MgKz0gOTkKKyAgICBoZWxwZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMwMAorICAgIGhlbHBlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMzAwCisgICAgVElDS1MgKz0gMTcxCisgICAgZmFjdG9yaWFsKDE0KSAgICAgICAgICAgICAgICAgICAgICAgIyAxMzAKKworZGVmIGZhY3RvcmlhbChuKToKKyAgICAjIDIzIGNhbGxzIHRvdGFsCisgICAgIyAxNzAgdGlja3MgdG90YWwsIDE1MCB0aWNrcyBsb2NhbAorICAgICMgMyBwcmltaXRpdmUgY2FsbHMsIDEzMCwgMjAgYW5kIDIwIHRpY2tzIHRvdGFsCisgICAgIyBpbmNsdWRpbmcgMTE2LCAxNywgMTcgdGlja3MgbG9jYWwKKyAgICBnbG9iYWwgVElDS1MKKyAgICBpZiBuID4gMDoKKyAgICAgICAgVElDS1MgKz0gbgorICAgICAgICByZXR1cm4gbXVsKG4sIGZhY3RvcmlhbChuLTEpKQorICAgIGVsc2U6CisgICAgICAgIFRJQ0tTICs9IDExCisgICAgICAgIHJldHVybiAxCisKK2RlZiBtdWwoYSwgYik6CisgICAgIyAyMCBjYWxscworICAgICMgMSB0aWNrLCBsb2NhbAorICAgIGdsb2JhbCBUSUNLUworICAgIFRJQ0tTICs9IDEKKyAgICByZXR1cm4gYSAqIGIKKworZGVmIGhlbHBlcigpOgorICAgICMgMiBjYWxscworICAgICMgMzAwIHRpY2tzIHRvdGFsOiAyMCB0aWNrcyBsb2NhbCwgMjYwIHRpY2tzIGluIHN1YmZ1bmN0aW9ucworICAgIGdsb2JhbCBUSUNLUworICAgIFRJQ0tTICs9IDEKKyAgICBoZWxwZXIxKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDMwCisgICAgVElDS1MgKz0gMgorICAgIGhlbHBlcjEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgMzAKKyAgICBUSUNLUyArPSA2CisgICAgaGVscGVyMigpICAgICAgICAgICAgICAgICAgICAgICAgICAgIyA1MAorICAgIFRJQ0tTICs9IDMKKyAgICBoZWxwZXIyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDUwCisgICAgVElDS1MgKz0gMgorICAgIGhlbHBlcjIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgNTAKKyAgICBUSUNLUyArPSA1CisgICAgaGVscGVyMl9pbmRpcmVjdCgpICAgICAgICAgICAgICAgICAgIyA3MAorICAgIFRJQ0tTICs9IDEKKworZGVmIGhlbHBlcjEoKToKKyAgICAjIDQgY2FsbHMKKyAgICAjIDMwIHRpY2tzIHRvdGFsOiAyOSB0aWNrcyBsb2NhbCwgMSB0aWNrIGluIHN1YmZ1bmN0aW9ucworICAgIGdsb2JhbCBUSUNLUworICAgIFRJQ0tTICs9IDEwCisgICAgaGFzYXR0cihDKCksICJmb28iKSAgICAgICAgICAgICAgICAgIyAxCisgICAgVElDS1MgKz0gMTkKKyAgICBsc3QgPSBbXQorICAgIGxzdC5hcHBlbmQoNDIpICAgICAgICAgICAgICAgICAgICAgICMgMAorICAgIHN5cy5leGNfaW5mbygpICAgICAgICAgICAgICAgICAgICAgICMgMAorCitkZWYgaGVscGVyMl9pbmRpcmVjdCgpOgorICAgIGhlbHBlcjIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgNTAKKyAgICBmYWN0b3JpYWwoMykgICAgICAgICAgICAgICAgICAgICAgICAjIDIwCisKK2RlZiBoZWxwZXIyKCk6CisgICAgIyA4IGNhbGxzCisgICAgIyA1MCB0aWNrcyBsb2NhbDogMzkgdGlja3MgbG9jYWwsIDExIHRpY2tzIGluIHN1YmZ1bmN0aW9ucworICAgIGdsb2JhbCBUSUNLUworICAgIFRJQ0tTICs9IDExCisgICAgaGFzYXR0cihDKCksICJiYXIiKSAgICAgICAgICAgICAgICAgIyAxCisgICAgVElDS1MgKz0gMTMKKyAgICBzdWJoZWxwZXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAjIDEwCisgICAgVElDS1MgKz0gMTUKKworZGVmIHN1YmhlbHBlcigpOgorICAgICMgOCBjYWxscworICAgICMgMTAgdGlja3MgdG90YWw6IDggdGlja3MgbG9jYWwsIDIgdGlja3MgaW4gc3ViZnVuY3Rpb25zCisgICAgZ2xvYmFsIFRJQ0tTCisgICAgVElDS1MgKz0gMgorICAgIGZvciBpIGluIHJhbmdlKDIpOiAgICAgICAgICAgICAgICAgICMgMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBDKCkuZm9vICAgICAgICAgICAgICAgICAgICAgIyAxIHggMgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBUSUNLUyArPSAzICAgICAgICAgICAgICAgICAgIyAzIHggMgorCitjbGFzcyBDOgorICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgIyAyOCBjYWxscworICAgICAgICAjIDEgdGljaywgbG9jYWwKKyAgICAgICAgZ2xvYmFsIFRJQ0tTCisgICAgICAgIFRJQ0tTICs9IDEKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9wcm9maWxlZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHJvZmlsZWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWMwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHJvZmlsZWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9wcm9maWxlZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcHJvZmlsZWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZWMwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHJvZmlsZWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWNsYnJfaW5wdXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHljbGJyX2lucHV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2NkNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHljbGJyX2lucHV0LnB5CkBAIC0wLDAgKzEsMzMgQEAKKyIiIlRlc3QgY2FzZXMgZm9yIHRlc3RfcHljbGJyLnB5IiIiCisKK2RlZiBmKCk6IHBhc3MKKworY2xhc3MgT3RoZXIob2JqZWN0KToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZm9vKGMpOiBwYXNzCisKKyAgICBkZWYgb20oc2VsZik6IHBhc3MKKworY2xhc3MgQiAob2JqZWN0KToKKyAgICBkZWYgYm0oc2VsZik6IHBhc3MKKworY2xhc3MgQyAoQik6CisgICAgZm9vID0gT3RoZXIoKS5mb28KKyAgICBvbSA9IE90aGVyLm9tCisKKyAgICBkID0gMTAKKworICAgICMgWFhYOiBUaGlzIGNhdXNlcyB0ZXN0X3B5Y2xici5weSB0byBmYWlsLCBidXQgb25seSBiZWNhdXNlIHRoZQorICAgICMgICAgICBpbnRyb3NwZWN0aW9uLWJhc2VkIGlzX21ldGhvZCgpIGNvZGUgaW4gdGhlIHRlc3QgY2FuJ3QKKyAgICAjICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGlzIGFuZCBhIGdlbnVpbmUgbWV0aG9kIGZ1bmN0aW9uIGxpa2UgbSgpLgorICAgICMgICAgICBUaGUgcHljbGJyLnB5IG1vZHVsZSBnZXRzIHRoaXMgcmlnaHQgYXMgaXQgcGFyc2VzIHRoZSB0ZXh0LgorICAgICMKKyAgICAjZiA9IGYKKworICAgIGRlZiBtKHNlbGYpOiBwYXNzCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHNtKHNlbGYpOiBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgY20oc2VsZik6IHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWNsYnJfaW5wdXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5Y2xicl9pbnB1dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5OTgzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weWNsYnJfaW5wdXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWNsYnJfaW5wdXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5Y2xicl9pbnB1dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5OTgzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weWNsYnJfaW5wdXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2NfbW9kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNTMzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2NfbW9kLnB5CkBAIC0wLDAgKzEsMjcgQEAKKyIiIlRoaXMgaXMgYSB0ZXN0IG1vZHVsZSBmb3IgdGVzdF9weWRvYyIiIgorCitfX2F1dGhvcl9fID0gIkJlbmphbWluIFBldGVyc29uIgorX19jcmVkaXRzX18gPSAiTm9ib2R5IgorX192ZXJzaW9uX18gPSAiMS4yLjMuNCIKKworCitjbGFzcyBBOgorICAgICIiIkhlbGxvIGFuZCBnb29kYnllIiIiCisgICAgZGVmIF9faW5pdF9fKCk6CisgICAgICAgICIiIldvdywgSSBoYXZlIG5vIGZ1bmN0aW9uISIiIgorICAgICAgICBwYXNzCisKK2NsYXNzIEIob2JqZWN0KToKKyAgICBOT19NRUFOSU5HID0gImVnZ3MiCisgICAgcGFzcworCitkZWYgZG9jX2Z1bmMoKToKKyAgICAiIiIKKyAgICBUaGlzIGZ1bmN0aW9uIHNvbHZlcyBhbGwgb2YgdGhlIHdvcmxkJ3MgcHJvYmxlbXM6CisgICAgaHVuZ2VyCisgICAgbGFjayBvZiBQeXRob24KKyAgICB3YXIKKyAgICAiIiIKKworZGVmIG5vZG9jX2Z1bmMoKToKKyAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2NfbW9kLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDY5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2NfbW9kLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2NfbW9kLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY19tb2QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDY5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2NfbW9kLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMWNiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weWRvY2ZvZGRlci5weQpAQCAtMCwwICsxLDIxNiBAQAorIiIiU29tZXRoaW5nIGp1c3QgdG8gbG9vayBhdCB2aWEgcHlkb2MuIiIiCisKK2ltcG9ydCB0eXBlcworCitjbGFzcyBBX2NsYXNzaWM6CisgICAgIkEgY2xhc3NpYyBjbGFzcy4iCisgICAgZGVmIEFfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQS4iCisgICAgZGVmIEFCX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEIuIgorICAgIGRlZiBBQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBIGFuZCBDLiIKKyAgICBkZWYgQURfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgRC4iCisgICAgZGVmIEFCQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBDLiIKKyAgICBkZWYgQUJEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEQuIgorICAgIGRlZiBBQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQyBhbmQgRC4iCisgICAgZGVmIEFCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiwgQyBhbmQgRC4iCisKKworY2xhc3MgQl9jbGFzc2ljKEFfY2xhc3NpYyk6CisgICAgIkEgY2xhc3NpYyBjbGFzcywgZGVyaXZlZCBmcm9tIEFfY2xhc3NpYy4iCisgICAgZGVmIEFCX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEIuIgorICAgIGRlZiBBQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgQy4iCisgICAgZGVmIEFCRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBELiIKKyAgICBkZWYgQUJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCLCBDIGFuZCBELiIKKyAgICBkZWYgQl9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCLiIKKyAgICBkZWYgQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiBhbmQgQy4iCisgICAgZGVmIEJEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIgYW5kIEQuIgorICAgIGRlZiBCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiwgQyBhbmQgRC4iCisKK2NsYXNzIENfY2xhc3NpYyhBX2NsYXNzaWMpOgorICAgICJBIGNsYXNzaWMgY2xhc3MsIGRlcml2ZWQgZnJvbSBBX2NsYXNzaWMuIgorICAgIGRlZiBBQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBIGFuZCBDLiIKKyAgICBkZWYgQUJDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEMuIgorICAgIGRlZiBBQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQyBhbmQgRC4iCisgICAgZGVmIEFCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiwgQyBhbmQgRC4iCisgICAgZGVmIEJDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIgYW5kIEMuIgorICAgIGRlZiBCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiwgQyBhbmQgRC4iCisgICAgZGVmIENfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQy4iCisgICAgZGVmIENEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEMgYW5kIEQuIgorCitjbGFzcyBEX2NsYXNzaWMoQl9jbGFzc2ljLCBDX2NsYXNzaWMpOgorICAgICJBIGNsYXNzaWMgY2xhc3MsIGRlcml2ZWQgZnJvbSBCX2NsYXNzaWMgYW5kIENfY2xhc3NpYy4iCisgICAgZGVmIEFEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEQuIgorICAgIGRlZiBBQkRfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgRC4iCisgICAgZGVmIEFDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBDIGFuZCBELiIKKyAgICBkZWYgQUJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCLCBDIGFuZCBELiIKKyAgICBkZWYgQkRfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiBhbmQgRC4iCisgICAgZGVmIEJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCLCBDIGFuZCBELiIKKyAgICBkZWYgQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQyBhbmQgRC4iCisgICAgZGVmIERfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gRC4iCisKKworY2xhc3MgQV9uZXcob2JqZWN0KToKKyAgICAiQSBuZXctc3R5bGUgY2xhc3MuIgorCisgICAgZGVmIEFfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQS4iCisgICAgZGVmIEFCX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEIuIgorICAgIGRlZiBBQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBIGFuZCBDLiIKKyAgICBkZWYgQURfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgRC4iCisgICAgZGVmIEFCQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBDLiIKKyAgICBkZWYgQUJEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEQuIgorICAgIGRlZiBBQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQyBhbmQgRC4iCisgICAgZGVmIEFCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiwgQyBhbmQgRC4iCisKKyAgICBkZWYgQV9jbGFzc21ldGhvZChjbHMsIHgpOgorICAgICAgICAiQSBjbGFzcyBtZXRob2QgZGVmaW5lZCBpbiBBLiIKKyAgICBBX2NsYXNzbWV0aG9kID0gY2xhc3NtZXRob2QoQV9jbGFzc21ldGhvZCkKKworICAgIGRlZiBBX3N0YXRpY21ldGhvZCgpOgorICAgICAgICAiQSBzdGF0aWMgbWV0aG9kIGRlZmluZWQgaW4gQS4iCisgICAgQV9zdGF0aWNtZXRob2QgPSBzdGF0aWNtZXRob2QoQV9zdGF0aWNtZXRob2QpCisKKyAgICBkZWYgX2dldHgoc2VsZik6CisgICAgICAgICJBIHByb3BlcnR5IGdldHRlciBmdW5jdGlvbi4iCisgICAgZGVmIF9zZXR4KHNlbGYsIHZhbHVlKToKKyAgICAgICAgIkEgcHJvcGVydHkgc2V0dGVyIGZ1bmN0aW9uLiIKKyAgICBkZWYgX2RlbHgoc2VsZik6CisgICAgICAgICJBIHByb3BlcnR5IGRlbGV0ZXIgZnVuY3Rpb24uIgorICAgIEFfcHJvcGVydHkgPSBwcm9wZXJ0eShmZGVsPV9kZWx4LCBmZ2V0PV9nZXR4LCBmc2V0PV9zZXR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb2M9IkEgc2FtcGxlIHByb3BlcnR5IGRlZmluZWQgaW4gQS4iKQorCisgICAgQV9pbnRfYWxpYXMgPSBpbnQKKworY2xhc3MgQl9uZXcoQV9uZXcpOgorICAgICJBIG5ldy1zdHlsZSBjbGFzcywgZGVyaXZlZCBmcm9tIEFfbmV3LiIKKworICAgIGRlZiBBQl9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBIGFuZCBCLiIKKyAgICBkZWYgQUJDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIgYW5kIEMuIgorICAgIGRlZiBBQkRfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgRC4iCisgICAgZGVmIEFCQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiwgQyBhbmQgRC4iCisgICAgZGVmIEJfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQi4iCisgICAgZGVmIEJDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIgYW5kIEMuIgorICAgIGRlZiBCRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCIGFuZCBELiIKKyAgICBkZWYgQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIsIEMgYW5kIEQuIgorCitjbGFzcyBDX25ldyhBX25ldyk6CisgICAgIkEgbmV3LXN0eWxlIGNsYXNzLCBkZXJpdmVkIGZyb20gQV9uZXcuIgorCisgICAgZGVmIEFDX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEgYW5kIEMuIgorICAgIGRlZiBBQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSwgQiBhbmQgQy4iCisgICAgZGVmIEFDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBDIGFuZCBELiIKKyAgICBkZWYgQUJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCLCBDIGFuZCBELiIKKyAgICBkZWYgQkNfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQiBhbmQgQy4iCisgICAgZGVmIEJDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCLCBDIGFuZCBELiIKKyAgICBkZWYgQ19tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBDLiIKKyAgICBkZWYgQ0RfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQyBhbmQgRC4iCisKK2NsYXNzIERfbmV3KEJfbmV3LCBDX25ldyk6CisgICAgIiIiQSBuZXctc3R5bGUgY2xhc3MsIGRlcml2ZWQgZnJvbSBCX25ldyBhbmQgQ19uZXcuCisgICAgIiIiCisKKyAgICBkZWYgQURfbWV0aG9kKHNlbGYpOgorICAgICAgICAiTWV0aG9kIGRlZmluZWQgaW4gQSBhbmQgRC4iCisgICAgZGVmIEFCRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBBLCBCIGFuZCBELiIKKyAgICBkZWYgQUNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEMgYW5kIEQuIgorICAgIGRlZiBBQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEEsIEIsIEMgYW5kIEQuIgorICAgIGRlZiBCRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBCIGFuZCBELiIKKyAgICBkZWYgQkNEX21ldGhvZChzZWxmKToKKyAgICAgICAgIk1ldGhvZCBkZWZpbmVkIGluIEIsIEMgYW5kIEQuIgorICAgIGRlZiBDRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBDIGFuZCBELiIKKyAgICBkZWYgRF9tZXRob2Qoc2VsZik6CisgICAgICAgICJNZXRob2QgZGVmaW5lZCBpbiBELiIKKworY2xhc3MgRnVua3lQcm9wZXJ0aWVzKG9iamVjdCk6CisgICAgIiIiRnJvbSBTRiBidWcgNDcyMzQ3LCBieSBSb2VsYW5kIFJlbmdlbGluay4KKworICAgIFByb3BlcnR5IGdldHRlcnMgZXRjIG1heSBub3QgYmUgdmFuaWxsYSBmdW5jdGlvbnMgb3IgbWV0aG9kcywKKyAgICBhbmQgdGhpcyB1c2VkIHRvIG1ha2UgR1VJIHB5ZG9jIGJsb3cgdXAuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGVzYyA9IHsneCc6MH0KKworICAgIGNsYXNzIGdldF9kZXNjOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgYXR0cik6CisgICAgICAgICAgICBzZWxmLmF0dHIgPSBhdHRyCisgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBpbnN0KToKKyAgICAgICAgICAgIHByaW50ICdHZXQgY2FsbGVkJywgc2VsZiwgaW5zdAorICAgICAgICAgICAgcmV0dXJuIGluc3QuZGVzY1tzZWxmLmF0dHJdCisgICAgY2xhc3Mgc2V0X2Rlc2M6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgICAgIHNlbGYuYXR0ciA9IGF0dHIKKyAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGluc3QsIHZhbCk6CisgICAgICAgICAgICBwcmludCAnU2V0IGNhbGxlZCcsIHNlbGYsIGluc3QsIHZhbAorICAgICAgICAgICAgaW5zdC5kZXNjW3NlbGYuYXR0cl0gPSB2YWwKKyAgICBjbGFzcyBkZWxfZGVzYzoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHIpOgorICAgICAgICAgICAgc2VsZi5hdHRyID0gYXR0cgorICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgaW5zdCk6CisgICAgICAgICAgICBwcmludCAnRGVsIGNhbGxlZCcsIHNlbGYsIGluc3QKKyAgICAgICAgICAgIGRlbCBpbnN0LmRlc2Nbc2VsZi5hdHRyXQorCisgICAgeCA9IHByb3BlcnR5KGdldF9kZXNjKCd4JyksIHNldF9kZXNjKCd4JyksIGRlbF9kZXNjKCd4JyksICdwcm9wIHgnKQorCisKK3N1Ym1vZHVsZSA9IHR5cGVzLk1vZHVsZVR5cGUoX19uYW1lX18gKyAnLnN1Ym1vZHVsZScsCisgICAgIiIiQSBzdWJtb2R1bGUsIHdoaWNoIHNob3VsZCBhcHBlYXIgaW4gaXRzIHBhcmVudCdzIHN1bW1hcnkiIiIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jZm9kZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjYzMDdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jZm9kZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlkb2Nmb2RkZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jZm9kZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjYzMDdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3B5ZG9jZm9kZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlzdG9uZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5ODkyZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlzdG9uZS5weQpAQCAtMCwwICsxLDI3MCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiIKKyJQWVNUT05FIiBCZW5jaG1hcmsgUHJvZ3JhbQorCitWZXJzaW9uOiAgICAgICAgUHl0aG9uLzEuMSAoY29ycmVzcG9uZHMgdG8gQy8xLjEgcGx1cyAyIFB5c3RvbmUgZml4ZXMpCisKK0F1dGhvcjogICAgICAgICBSZWluaG9sZCBQLiBXZWlja2VyLCAgQ0FDTSBWb2wgMjcsIE5vIDEwLCAxMC84NCBwZy4gMTAxMy4KKworICAgICAgICAgICAgICAgIFRyYW5zbGF0ZWQgZnJvbSBBREEgdG8gQyBieSBSaWNrIFJpY2hhcmRzb24uCisgICAgICAgICAgICAgICAgRXZlcnkgbWV0aG9kIHRvIHByZXNlcnZlIEFEQS1saWtlbmVzcyBoYXMgYmVlbiB1c2VkLAorICAgICAgICAgICAgICAgIGF0IHRoZSBleHBlbnNlIG9mIEMtbmVzcy4KKworICAgICAgICAgICAgICAgIFRyYW5zbGF0ZWQgZnJvbSBDIHRvIFB5dGhvbiBieSBHdWlkbyB2YW4gUm9zc3VtLgorCitWZXJzaW9uIEhpc3Rvcnk6CisKKyAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMSBjb3JyZWN0cyB0d28gYnVncyBpbiB2ZXJzaW9uIDEuMDoKKworICAgICAgICAgICAgICAgIEZpcnN0LCBpdCBsZWFrZWQgbWVtb3J5OiBpbiBQcm9jMSgpLCBOZXh0UmVjb3JkIGVuZHMKKyAgICAgICAgICAgICAgICB1cCBoYXZpbmcgYSBwb2ludGVyIHRvIGl0c2VsZi4gIEkgaGF2ZSBjb3JyZWN0ZWQgdGhpcworICAgICAgICAgICAgICAgIGJ5IHphcHBpbmcgTmV4dFJlY29yZC5QdHJDb21wIGF0IHRoZSBlbmQgb2YgUHJvYzEoKS4KKworICAgICAgICAgICAgICAgIFNlY29uZCwgUHJvYzMoKSB1c2VkIHRoZSBvcGVyYXRvciAhPSB0byBjb21wYXJlIGEKKyAgICAgICAgICAgICAgICByZWNvcmQgdG8gTm9uZS4gIFRoaXMgaXMgcmF0aGVyIGluZWZmaWNpZW50IGFuZCBub3QKKyAgICAgICAgICAgICAgICB0cnVlIHRvIHRoZSBpbnRlbnRpb24gb2YgdGhlIG9yaWdpbmFsIGJlbmNobWFyayAod2hlcmUKKyAgICAgICAgICAgICAgICBhIHBvaW50ZXIgY29tcGFyaXNvbiB0byBOb25lIGlzIGludGVuZGVkOyB0aGUgIT0KKyAgICAgICAgICAgICAgICBvcGVyYXRvciBhdHRlbXB0cyB0byBmaW5kIGEgbWV0aG9kIF9fY21wX18gdG8gZG8gdmFsdWUKKyAgICAgICAgICAgICAgICBjb21wYXJpc29uIG9mIHRoZSByZWNvcmQpLiAgVmVyc2lvbiAxLjEgcnVucyA1LTEwCisgICAgICAgICAgICAgICAgcGVyY2VudCBmYXN0ZXIgdGhhbiB2ZXJzaW9uIDEuMCwgc28gYmVuY2htYXJrIGZpZ3VyZXMKKyAgICAgICAgICAgICAgICBvZiBkaWZmZXJlbnQgdmVyc2lvbnMgY2FuJ3QgYmUgY29tcGFyZWQgZGlyZWN0bHkuCisKKyIiIgorCitMT09QUyA9IDUwMDAwCisKK2Zyb20gdGltZSBpbXBvcnQgY2xvY2sKKworX192ZXJzaW9uX18gPSAiMS4xIgorCitbSWRlbnQxLCBJZGVudDIsIElkZW50MywgSWRlbnQ0LCBJZGVudDVdID0gcmFuZ2UoMSwgNikKKworY2xhc3MgUmVjb3JkOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIFB0ckNvbXAgPSBOb25lLCBEaXNjciA9IDAsIEVudW1Db21wID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50Q29tcCA9IDAsIFN0cmluZ0NvbXAgPSAwKToKKyAgICAgICAgc2VsZi5QdHJDb21wID0gUHRyQ29tcAorICAgICAgICBzZWxmLkRpc2NyID0gRGlzY3IKKyAgICAgICAgc2VsZi5FbnVtQ29tcCA9IEVudW1Db21wCisgICAgICAgIHNlbGYuSW50Q29tcCA9IEludENvbXAKKyAgICAgICAgc2VsZi5TdHJpbmdDb21wID0gU3RyaW5nQ29tcAorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIHJldHVybiBSZWNvcmQoc2VsZi5QdHJDb21wLCBzZWxmLkRpc2NyLCBzZWxmLkVudW1Db21wLAorICAgICAgICAgICAgICAgICAgICAgIHNlbGYuSW50Q29tcCwgc2VsZi5TdHJpbmdDb21wKQorCitUUlVFID0gMQorRkFMU0UgPSAwCisKK2RlZiBtYWluKGxvb3BzPUxPT1BTKToKKyAgICBiZW5jaHRpbWUsIHN0b25lcyA9IHB5c3RvbmVzKGxvb3BzKQorICAgIHByaW50ICJQeXN0b25lKCVzKSB0aW1lIGZvciAlZCBwYXNzZXMgPSAlZyIgJSBcCisgICAgICAgICAgKF9fdmVyc2lvbl9fLCBsb29wcywgYmVuY2h0aW1lKQorICAgIHByaW50ICJUaGlzIG1hY2hpbmUgYmVuY2htYXJrcyBhdCAlZyBweXN0b25lcy9zZWNvbmQiICUgc3RvbmVzCisKKworZGVmIHB5c3RvbmVzKGxvb3BzPUxPT1BTKToKKyAgICByZXR1cm4gUHJvYzAobG9vcHMpCisKK0ludEdsb2IgPSAwCitCb29sR2xvYiA9IEZBTFNFCitDaGFyMUdsb2IgPSAnXDAnCitDaGFyMkdsb2IgPSAnXDAnCitBcnJheTFHbG9iID0gWzBdKjUxCitBcnJheTJHbG9iID0gbWFwKGxhbWJkYSB4OiB4WzpdLCBbQXJyYXkxR2xvYl0qNTEpCitQdHJHbGIgPSBOb25lCitQdHJHbGJOZXh0ID0gTm9uZQorCitkZWYgUHJvYzAobG9vcHM9TE9PUFMpOgorICAgIGdsb2JhbCBJbnRHbG9iCisgICAgZ2xvYmFsIEJvb2xHbG9iCisgICAgZ2xvYmFsIENoYXIxR2xvYgorICAgIGdsb2JhbCBDaGFyMkdsb2IKKyAgICBnbG9iYWwgQXJyYXkxR2xvYgorICAgIGdsb2JhbCBBcnJheTJHbG9iCisgICAgZ2xvYmFsIFB0ckdsYgorICAgIGdsb2JhbCBQdHJHbGJOZXh0CisKKyAgICBzdGFydHRpbWUgPSBjbG9jaygpCisgICAgZm9yIGkgaW4gcmFuZ2UobG9vcHMpOgorICAgICAgICBwYXNzCisgICAgbnVsbHRpbWUgPSBjbG9jaygpIC0gc3RhcnR0aW1lCisKKyAgICBQdHJHbGJOZXh0ID0gUmVjb3JkKCkKKyAgICBQdHJHbGIgPSBSZWNvcmQoKQorICAgIFB0ckdsYi5QdHJDb21wID0gUHRyR2xiTmV4dAorICAgIFB0ckdsYi5EaXNjciA9IElkZW50MQorICAgIFB0ckdsYi5FbnVtQ29tcCA9IElkZW50MworICAgIFB0ckdsYi5JbnRDb21wID0gNDAKKyAgICBQdHJHbGIuU3RyaW5nQ29tcCA9ICJESFJZU1RPTkUgUFJPR1JBTSwgU09NRSBTVFJJTkciCisgICAgU3RyaW5nMUxvYyA9ICJESFJZU1RPTkUgUFJPR1JBTSwgMSdTVCBTVFJJTkciCisgICAgQXJyYXkyR2xvYls4XVs3XSA9IDEwCisKKyAgICBzdGFydHRpbWUgPSBjbG9jaygpCisKKyAgICBmb3IgaSBpbiByYW5nZShsb29wcyk6CisgICAgICAgIFByb2M1KCkKKyAgICAgICAgUHJvYzQoKQorICAgICAgICBJbnRMb2MxID0gMgorICAgICAgICBJbnRMb2MyID0gMworICAgICAgICBTdHJpbmcyTG9jID0gIkRIUllTVE9ORSBQUk9HUkFNLCAyJ05EIFNUUklORyIKKyAgICAgICAgRW51bUxvYyA9IElkZW50MgorICAgICAgICBCb29sR2xvYiA9IG5vdCBGdW5jMihTdHJpbmcxTG9jLCBTdHJpbmcyTG9jKQorICAgICAgICB3aGlsZSBJbnRMb2MxIDwgSW50TG9jMjoKKyAgICAgICAgICAgIEludExvYzMgPSA1ICogSW50TG9jMSAtIEludExvYzIKKyAgICAgICAgICAgIEludExvYzMgPSBQcm9jNyhJbnRMb2MxLCBJbnRMb2MyKQorICAgICAgICAgICAgSW50TG9jMSA9IEludExvYzEgKyAxCisgICAgICAgIFByb2M4KEFycmF5MUdsb2IsIEFycmF5Mkdsb2IsIEludExvYzEsIEludExvYzMpCisgICAgICAgIFB0ckdsYiA9IFByb2MxKFB0ckdsYikKKyAgICAgICAgQ2hhckluZGV4ID0gJ0EnCisgICAgICAgIHdoaWxlIENoYXJJbmRleCA8PSBDaGFyMkdsb2I6CisgICAgICAgICAgICBpZiBFbnVtTG9jID09IEZ1bmMxKENoYXJJbmRleCwgJ0MnKToKKyAgICAgICAgICAgICAgICBFbnVtTG9jID0gUHJvYzYoSWRlbnQxKQorICAgICAgICAgICAgQ2hhckluZGV4ID0gY2hyKG9yZChDaGFySW5kZXgpKzEpCisgICAgICAgIEludExvYzMgPSBJbnRMb2MyICogSW50TG9jMQorICAgICAgICBJbnRMb2MyID0gSW50TG9jMyAvIEludExvYzEKKyAgICAgICAgSW50TG9jMiA9IDcgKiAoSW50TG9jMyAtIEludExvYzIpIC0gSW50TG9jMQorICAgICAgICBJbnRMb2MxID0gUHJvYzIoSW50TG9jMSkKKworICAgIGJlbmNodGltZSA9IGNsb2NrKCkgLSBzdGFydHRpbWUgLSBudWxsdGltZQorICAgIGlmIGJlbmNodGltZSA9PSAwLjA6CisgICAgICAgIGxvb3BzUGVyQmVuY2h0aW1lID0gMC4wCisgICAgZWxzZToKKyAgICAgICAgbG9vcHNQZXJCZW5jaHRpbWUgPSAobG9vcHMgLyBiZW5jaHRpbWUpCisgICAgcmV0dXJuIGJlbmNodGltZSwgbG9vcHNQZXJCZW5jaHRpbWUKKworZGVmIFByb2MxKFB0clBhckluKToKKyAgICBQdHJQYXJJbi5QdHJDb21wID0gTmV4dFJlY29yZCA9IFB0ckdsYi5jb3B5KCkKKyAgICBQdHJQYXJJbi5JbnRDb21wID0gNQorICAgIE5leHRSZWNvcmQuSW50Q29tcCA9IFB0clBhckluLkludENvbXAKKyAgICBOZXh0UmVjb3JkLlB0ckNvbXAgPSBQdHJQYXJJbi5QdHJDb21wCisgICAgTmV4dFJlY29yZC5QdHJDb21wID0gUHJvYzMoTmV4dFJlY29yZC5QdHJDb21wKQorICAgIGlmIE5leHRSZWNvcmQuRGlzY3IgPT0gSWRlbnQxOgorICAgICAgICBOZXh0UmVjb3JkLkludENvbXAgPSA2CisgICAgICAgIE5leHRSZWNvcmQuRW51bUNvbXAgPSBQcm9jNihQdHJQYXJJbi5FbnVtQ29tcCkKKyAgICAgICAgTmV4dFJlY29yZC5QdHJDb21wID0gUHRyR2xiLlB0ckNvbXAKKyAgICAgICAgTmV4dFJlY29yZC5JbnRDb21wID0gUHJvYzcoTmV4dFJlY29yZC5JbnRDb21wLCAxMCkKKyAgICBlbHNlOgorICAgICAgICBQdHJQYXJJbiA9IE5leHRSZWNvcmQuY29weSgpCisgICAgTmV4dFJlY29yZC5QdHJDb21wID0gTm9uZQorICAgIHJldHVybiBQdHJQYXJJbgorCitkZWYgUHJvYzIoSW50UGFySU8pOgorICAgIEludExvYyA9IEludFBhcklPICsgMTAKKyAgICB3aGlsZSAxOgorICAgICAgICBpZiBDaGFyMUdsb2IgPT0gJ0EnOgorICAgICAgICAgICAgSW50TG9jID0gSW50TG9jIC0gMQorICAgICAgICAgICAgSW50UGFySU8gPSBJbnRMb2MgLSBJbnRHbG9iCisgICAgICAgICAgICBFbnVtTG9jID0gSWRlbnQxCisgICAgICAgIGlmIEVudW1Mb2MgPT0gSWRlbnQxOgorICAgICAgICAgICAgYnJlYWsKKyAgICByZXR1cm4gSW50UGFySU8KKworZGVmIFByb2MzKFB0clBhck91dCk6CisgICAgZ2xvYmFsIEludEdsb2IKKworICAgIGlmIFB0ckdsYiBpcyBub3QgTm9uZToKKyAgICAgICAgUHRyUGFyT3V0ID0gUHRyR2xiLlB0ckNvbXAKKyAgICBlbHNlOgorICAgICAgICBJbnRHbG9iID0gMTAwCisgICAgUHRyR2xiLkludENvbXAgPSBQcm9jNygxMCwgSW50R2xvYikKKyAgICByZXR1cm4gUHRyUGFyT3V0CisKK2RlZiBQcm9jNCgpOgorICAgIGdsb2JhbCBDaGFyMkdsb2IKKworICAgIEJvb2xMb2MgPSBDaGFyMUdsb2IgPT0gJ0EnCisgICAgQm9vbExvYyA9IEJvb2xMb2Mgb3IgQm9vbEdsb2IKKyAgICBDaGFyMkdsb2IgPSAnQicKKworZGVmIFByb2M1KCk6CisgICAgZ2xvYmFsIENoYXIxR2xvYgorICAgIGdsb2JhbCBCb29sR2xvYgorCisgICAgQ2hhcjFHbG9iID0gJ0EnCisgICAgQm9vbEdsb2IgPSBGQUxTRQorCitkZWYgUHJvYzYoRW51bVBhckluKToKKyAgICBFbnVtUGFyT3V0ID0gRW51bVBhckluCisgICAgaWYgbm90IEZ1bmMzKEVudW1QYXJJbik6CisgICAgICAgIEVudW1QYXJPdXQgPSBJZGVudDQKKyAgICBpZiBFbnVtUGFySW4gPT0gSWRlbnQxOgorICAgICAgICBFbnVtUGFyT3V0ID0gSWRlbnQxCisgICAgZWxpZiBFbnVtUGFySW4gPT0gSWRlbnQyOgorICAgICAgICBpZiBJbnRHbG9iID4gMTAwOgorICAgICAgICAgICAgRW51bVBhck91dCA9IElkZW50MQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRW51bVBhck91dCA9IElkZW50NAorICAgIGVsaWYgRW51bVBhckluID09IElkZW50MzoKKyAgICAgICAgRW51bVBhck91dCA9IElkZW50MgorICAgIGVsaWYgRW51bVBhckluID09IElkZW50NDoKKyAgICAgICAgcGFzcworICAgIGVsaWYgRW51bVBhckluID09IElkZW50NToKKyAgICAgICAgRW51bVBhck91dCA9IElkZW50MworICAgIHJldHVybiBFbnVtUGFyT3V0CisKK2RlZiBQcm9jNyhJbnRQYXJJMSwgSW50UGFySTIpOgorICAgIEludExvYyA9IEludFBhckkxICsgMgorICAgIEludFBhck91dCA9IEludFBhckkyICsgSW50TG9jCisgICAgcmV0dXJuIEludFBhck91dAorCitkZWYgUHJvYzgoQXJyYXkxUGFyLCBBcnJheTJQYXIsIEludFBhckkxLCBJbnRQYXJJMik6CisgICAgZ2xvYmFsIEludEdsb2IKKworICAgIEludExvYyA9IEludFBhckkxICsgNQorICAgIEFycmF5MVBhcltJbnRMb2NdID0gSW50UGFySTIKKyAgICBBcnJheTFQYXJbSW50TG9jKzFdID0gQXJyYXkxUGFyW0ludExvY10KKyAgICBBcnJheTFQYXJbSW50TG9jKzMwXSA9IEludExvYworICAgIGZvciBJbnRJbmRleCBpbiByYW5nZShJbnRMb2MsIEludExvYysyKToKKyAgICAgICAgQXJyYXkyUGFyW0ludExvY11bSW50SW5kZXhdID0gSW50TG9jCisgICAgQXJyYXkyUGFyW0ludExvY11bSW50TG9jLTFdID0gQXJyYXkyUGFyW0ludExvY11bSW50TG9jLTFdICsgMQorICAgIEFycmF5MlBhcltJbnRMb2MrMjBdW0ludExvY10gPSBBcnJheTFQYXJbSW50TG9jXQorICAgIEludEdsb2IgPSA1CisKK2RlZiBGdW5jMShDaGFyUGFyMSwgQ2hhclBhcjIpOgorICAgIENoYXJMb2MxID0gQ2hhclBhcjEKKyAgICBDaGFyTG9jMiA9IENoYXJMb2MxCisgICAgaWYgQ2hhckxvYzIgIT0gQ2hhclBhcjI6CisgICAgICAgIHJldHVybiBJZGVudDEKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gSWRlbnQyCisKK2RlZiBGdW5jMihTdHJQYXJJMSwgU3RyUGFySTIpOgorICAgIEludExvYyA9IDEKKyAgICB3aGlsZSBJbnRMb2MgPD0gMToKKyAgICAgICAgaWYgRnVuYzEoU3RyUGFySTFbSW50TG9jXSwgU3RyUGFySTJbSW50TG9jKzFdKSA9PSBJZGVudDE6CisgICAgICAgICAgICBDaGFyTG9jID0gJ0EnCisgICAgICAgICAgICBJbnRMb2MgPSBJbnRMb2MgKyAxCisgICAgaWYgQ2hhckxvYyA+PSAnVycgYW5kIENoYXJMb2MgPD0gJ1onOgorICAgICAgICBJbnRMb2MgPSA3CisgICAgaWYgQ2hhckxvYyA9PSAnWCc6CisgICAgICAgIHJldHVybiBUUlVFCisgICAgZWxzZToKKyAgICAgICAgaWYgU3RyUGFySTEgPiBTdHJQYXJJMjoKKyAgICAgICAgICAgIEludExvYyA9IEludExvYyArIDcKKyAgICAgICAgICAgIHJldHVybiBUUlVFCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRkFMU0UKKworZGVmIEZ1bmMzKEVudW1QYXJJbik6CisgICAgRW51bUxvYyA9IEVudW1QYXJJbgorICAgIGlmIEVudW1Mb2MgPT0gSWRlbnQzOiByZXR1cm4gVFJVRQorICAgIHJldHVybiBGQUxTRQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBzeXMKKyAgICBkZWYgZXJyb3IobXNnKToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBtc2csCisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgInVzYWdlOiAlcyBbbnVtYmVyX29mX2xvb3BzXSIgJSBzeXMuYXJndlswXQorICAgICAgICBzeXMuZXhpdCgxMDApCisgICAgbmFyZ3MgPSBsZW4oc3lzLmFyZ3YpIC0gMQorICAgIGlmIG5hcmdzID4gMToKKyAgICAgICAgZXJyb3IoIiVkIGFyZ3VtZW50cyBhcmUgdG9vIG1hbnk7IiAlIG5hcmdzKQorICAgIGVsaWYgbmFyZ3MgPT0gMToKKyAgICAgICAgdHJ5OiBsb29wcyA9IGludChzeXMuYXJndlsxXSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBlcnJvcigiSW52YWxpZCBhcmd1bWVudCAlcjsiICUgc3lzLmFyZ3ZbMV0pCisgICAgZWxzZToKKyAgICAgICAgbG9vcHMgPSBMT09QUworICAgIG1haW4obG9vcHMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlzdG9uZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlzdG9uZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3MTIwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcHlzdG9uZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcHlzdG9uZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3MTIwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9weXN0b25lLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmFuZHYyXzMyLnBjayBiL2xpYi9weXRob24yLjcvdGVzdC9yYW5kdjJfMzIucGNrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4N2FiMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmFuZHYyXzMyLnBjawpAQCAtMCwwICsxLDYzMyBAQAorY3JhbmRvbQorUmFuZG9tCitwMAorKHRScDEKKyhJMgorKEktMjE0NzQ4MzY0OAorSS04NDU5NzQ5ODUKK0ktMTI5NDA5MDA4NgorSTExOTM2NTkyMzkKK0ktMTg0OTQ4MTczNgorSS05NDY1Nzk3MzIKK0ktMzQ0MDY3NzAKK0kxNzQ5MDQ5NDcxCitJMTk5Nzc3NDY4MgorSTE0MzIwMjY0NTcKK0kxMjg4MTI3MDczCitJLTk0MzE3NTY1NQorSS0xNzE4MDczOTY0CitJMzM5OTkzNTQ4CitJLTEwNDUyNjA1NzUKK0k1ODI1MDUwMzcKK0ktMTU1NTEwODI1MAorSS0xMTE0NzY1NjIwCitJMTU3ODY0ODc1MAorSS0zNTAzODQ0MTIKK0ktMjA4NDU4NDgKK0ktMjg4MjU1MzE0CitJNzM4NzkwOTUzCitJMTkwMTI0OTY0MQorSTE5OTkzMjQ2NzIKK0ktMjc3MzYxMDY4CitJLTE1MTU4ODU4MzkKK0kyMDYxNzYxNTk2CitJLTgwOTA2ODA4OQorSTEyODc5ODExMzYKK0kyNTgxMjk0OTIKK0ktNjMwMzc0NQorSS03NjUxNDgzMzcKK0kxMDkwMzQ0OTExCitJMTY1MzQzNDcwMworSS0xMjQyOTIzNjI4CitJMTYzOTE3MTMxMworSS0xODcwMDQyNjYwCitJLTE2NTUwMTQwNTAKK0kzNDU2MDkwNDgKK0kyMDkzNDEwMTM4CitJMTk2MzI2MzM3NAorSS0yMTIyMDk4MzQyCitJMTMzNjg1OTk2MQorSS04MTA5NDI3MjkKK0k5NDU4NTc3NTMKK0kyMTAzMDQ5OTQyCitJNjIzOTIyNjg0CitJMTQxODM0OTU0OQorSTY5MDg3NzM0MgorSTc1NDk3MzEwNworSS0xNjA1MTExODQ3CitJMTYwNzEzNzgxMworSS0xNzA0OTE3MTMxCitJMTMxNzUzNjQyOAorSTE3MTQ4ODI4NzIKK0ktMTY2NTM4NTEyMAorSTE4MjM2OTQzOTcKK0ktMTc5MDgzNjg2NgorSS0xNjk2NzI0ODEyCitJLTYwMzk3OTg0NworSS00OTg1OTkzOTQKK0ktMzQxMjY1MjkxCitJOTI3Mzg4ODA0CitJMTc3ODU2MjEzNQorSTE3MTY4OTU3ODEKK0kxMDIzMTk4MTIyCitJMTcyNjE0NTk2NworSTk0MTk1NTUyNQorSTEyNDAxNDg5NTAKK0ktMTkyOTYzNDU0NQorSS0xMjg4MTQ3MDgzCitJLTUxOTMxODMzNQorSTc1NDU1OTc3NworSS03MDc1NzE5NTgKK0kzNzQ2MDQwMjIKK0k0MjA0MjQwNjEKK0ktMTA5NTQ0MzQ4NgorSTE2MjE5MzQ5NDQKK0ktMTIyMDUwMjUyMgorSS0xNDAwNDk2MDgKK0ktOTE4OTE3MTIyCitJMzA0MzQxMDI0CitJLTE2Mzc0NDYwNTcKK0ktMzUzOTM0NDg1CitJMTk3MzQzNjIzNQorSTQzMzM4MDI0MQorSS02ODY3NTk0NjUKK0ktMjExMTU2MzE1NAorSS01NzM0MjIwMzIKK0k4MDQzMDQ1NDEKK0kxNTEzMDYzNDgzCitJMTQxNzM4MTY4OQorSS04MDQ3Nzg3MjkKK0kyMTE3NTY0MDgKK0k1NDQ1MzczMjIKK0k4OTA4ODE2NDEKK0kxNTAzNzgzNzQKK0kxNzY1NzM5MzkyCitJMTAxMTYwNDExNgorSTU4NDg4OTA5NQorSTE0MDA1MjA1NTQKK0k0MTM3NDc4MDgKK0ktMTc0MTk5MjU4NworSS0xODgyNDIxNTc0CitJLTEzNzMwMDE5MDMKK0ktMTg4NTM0ODUzOAorSTkwMzgxOTQ4MAorSTEwODMyMjAwMzgKK0ktMTMxODEwNTQyNAorSTE3NDA0MjE0MDQKK0kxNjkzMDg5NjI1CitJNzc1OTY1NTU3CitJMTMxOTYwODAzNworSS0yMTI3NDc1Nzg1CitJLTM2NzU2Mjg5NQorSS0xNDE2MjczNDUxCitJMTY5MzAwMDMyNworSS0xMjE3NDM4NDIxCitJODM0NDA1NTIyCitJLTEyODI4NzI3NQorSTg2NDA1NzU0OAorSS05NzM5MTczNTYKK0k3MzA0MTExCitJMTcxMjI1MzE4MgorSTEzNTM4OTc3NDEKK0k2NzI5ODIyODgKK0kxNzc4NTc1NTU5CitJLTQwMzA1ODM3NworSS0zODU0MDM3OAorSS0xMzkzNzEzNDk2CitJMTMxOTMxNzEKK0kxMTI3MTk2MjAwCitJMjA1MTc2NDcyCitJLTIxMDQ3OTA1MDYKK0kyOTk5ODU0MTYKK0kxNDAzNTQxNjg1CitJLTEwMTgyNzA2NjcKK0ktMTk4MDY3NzQ5MAorSS0xMTgyNjI1Nzk3CitJMTYzNzAxNTE4MQorSS0xNzk1MzU3NDE0CitJMTUxNDQxMzQwNQorSS05MjQ1MTYyMzcKK0ktMTg0MTg3MzY1MAorSS0xMDE0NTkxMjY5CitJMTU3NjYxNjA2NQorSS0xMzE5MTAzMTM1CitJLTEyMDg0Nzg0MAorSTIwNjIyNTk3NzgKK0ktOTI4NTA3MAorSTExNjA4OTAzMDAKK0ktNTc1MTM3MzEzCitJLTE1MDkxMDgyNzUKK0k0NjcwMTkyNgorSS0yODc1NjA5MTQKK0ktMjU2ODI0OTYwCitJNTc3NTU4MjUwCitJOTAwNTk4MzEwCitJOTQ0NjA3ODY3CitJMjEyMTE1NDkyMAorSS0xMTcwNTA1MTkyCitJLTEzNDcxNzA1NzUKK0k3NzI0Nzc3OAorSS0xODk5MDE1NzY1CitJMTIzNDEwMzMyNworSTEwMjcwNTM2NTgKK0kxOTM0NjMyMzIyCitJLTc5MjAzMTIzNAorSTExNDczMjI1MzYKK0kxMjkwNjU1MTE3CitJMTAwMjA1OTcxNQorSTEzMjU4OTg1MzgKK0k4OTYwMjk3OTMKK0ktNzkwOTQwNjk0CitJLTk4MDQ3MDcyMQorSS0xOTIyNjQ4MjU1CitJLTk1MTY3MjgxNAorSTI5MTU0Mzk0MworSTExNTg3NDAyMTgKK0ktMTk1OTAyMzczNgorSS0xOTc3MTg1MjM2CitJMTUyNzkwMDA3NgorSTUxNDEwNDE5NQorSS04MTQxNTQxMTMKK0ktNTkzMTU3ODgzCitJLTEwMjM3MDQ2NjAKK0kxMjg1Njg4Mzc3CitJLTIxMTc1MjUzODYKK0k3Njg5NTQzNjAKK0ktMzg2NzY4NDYKK0ktNzk5ODQ4NjU5CitJLTEzMDU1MTcyNTkKK0ktMTkzODIxMzY0MQorSS00NjIxNDY3NTgKK0ktMTY2MzMwMjg5MgorSTE4OTk1OTEwNjkKK0ktMjI5MzUzODgKK0ktMjc1ODU2OTc2CitJLTQ0MzczNjg5MworSS03Mzk0NDExNTYKK0k5Mzg2MjA2OAorSS04MzgxMDU2NjkKK0kxNzM1NjI5ODQ1CitJLTgxNzQ4NDIwNgorSTI4MDgxNDU1NQorSTE3NTM1NDcxNzkKK0kxODExMTIzNDc5CitJMTk3NDU0MzYzMgorSS00ODQ0NzQ2NQorSS02NDI2OTQzNDUKK0ktNTMxMTQ5NjEzCitJNTE4Njk4OTUzCitJLTIyMTY0MjYyNworSS02ODY1MTkxODcKK0k3NzY2NDQzMDMKK0kyNTc3NzQ0MDAKK0ktMTQ5OTEzNDg1NworSS0xMDU1MjczNDU1CitJLTIzNzAyMzk0MworSTE5ODE3NTIzMzAKK0ktOTE3NjcxNjYyCitJLTM3MjkwNTk4MworSTE1ODgwNTg0MjAKK0kxMTcxOTM2NjYwCitJLTE3MzA5NzcxMjEKK0kxMzYwMDI4OTg5CitJMTc2OTQ2OTI4NworSTE5MTA3MDk1NDIKK0ktODUyNjkyOTU5CitJMTM5Njk0NDY2NworSS0xNzIzOTk5MTU1CitJLTMxMDk3NTQzNQorSS0xOTY1NDUzOTU0CitJLTE2MzY4NTg1NzAKK0kyMDA1NjUwNzk0CitJNjgwMjkzNzE1CitJMTM1NTYyOTM4NgorSTg0NDUxNDY4NAorSS0xOTA5MTUyODA3CitJLTgwODY0NjA3NAorSTE5MzY1MTAwMTgKK0kxMTM0NDEzODEwCitJLTE0MzQxMTA0NworSS0xNDc4NDM2MzA0CitJMTM5NDk2OTI0NAorSS0xMTcwMTEwNjYwCitJMTk2MzExMjA4NgorSS0xNTE4MzUxMDQ5CitJLTE1MDYyODc0NDMKK0ktNDU1MDIzMDkwCitJLTg1NTM2NjAyOAorSS0xNzQ2Nzg1NTY4CitJOTMzOTkwODgyCitJLTcwMzYyNTE0MQorSS0yODUwMzY4NzIKK0kxODgyNzc5MDUKK0kxNDcxNTc4NjIwCitJLTk4MTM4MjgzNQorSS01ODY5NzQyMjAKK0k5NDU2MTk3NTgKK0kxNjA4Nzc4NDQ0CitJLTE3MDg1NDgwNjYKK0ktMTg5NzYyOTMyMAorSS00MjYxNzgxMAorSS04MzY4NDA3OTAKK0k1MzkxNTQ0ODcKK0ktMjM1NzA2OTYyCitJMzMyMDc0NDE4CitJLTU3NTcwMDU4OQorSTE1MzQ2MDgwMDMKK0k2MzIxMTY1NjAKK0ktMTgxOTc2MDY1MworSTY0MjA1Mjk1OAorSS03MjIzOTE3NzEKK0ktMTEwNDcxOTQ3NQorSS0xMTk2ODQ3MDg0CitJNTgyNDEzOTczCitJMTU2MzM5NDg3NgorSTY0MjAwNzk0NAorSTEwODk4OTQ1NgorSTM2MTYyNTAxNAorSTY3NzMwODYyNQorSS0xODA2NTI5NDk2CitJLTk1OTA1MDcwOAorSS0xODU4MjUxMDcwCitJLTIxNjA2OTgzMgorSTcwMTYyNDU3OQorSTUwMTIzODAzMworSTEyMjg3MDMwCitJMTg5NTEwNzEwNworSTIwODkwOTg2MzgKK0ktODc0ODA2MjMwCitJMTIzNjI3OTIwMworSTU2MzcxODg5MAorSS01NDQzNTI0ODkKK0ktMTg3OTcwNzQ5OAorSTE3Njc1ODMzOTMKK0ktMTc3NjYwNDY1NgorSS02OTMyOTQzMDEKK0ktODg4ODI4MzEKK0kxNjkzMDMzNTcKK0kxMjk5MTk2MTUyCitJLTExMjI3OTEwODkKK0ktMzc5MTU3MTcyCitJMTkzNDY3MTg1MQorSTE1NzU3MzY5NjEKK0ktMTk1NzMxNzQKK0ktMTQwMTUxMTAwOQorSTkzMDUxNjcKK0ktMTExNTE3NDQ2NworSTE2NzA3MzU1MzcKK0kxMjI2NDM2NTAxCitJLTIwMDQ1MjQ1MzUKK0kxNzY3NDYzODc4CitJLTE3MjI4NTUwNzkKK0ktNTU5NDEzOTI2CitJMTUyOTgxMDg1MQorSTEyMDEyNzIwODcKK0ktMTI5NzEzMDk3MQorSS0xMTg4MTQ5OTgyCitJMTM5NjU1NzE4OAorSS0zNzAzNTgzNDIKK0ktMTAwNjYxOTcwMgorSTE2MDA5NDI0NjMKK0k5MDYwODcxMzAKK0ktNzY5OTE5MDkKK0kyMDY5NTgwMTc5CitJLTE2NzQxOTUxODEKK0ktMjA5ODQwNDcyOQorSS05NDA5NzI0NTkKK0ktNTczMzk5MTg3CitJLTE5MzAzODYyNzcKK0ktNzIxMzExMTk5CitJLTY0NzgzNDc0NAorSTE0NTIxODE2NzEKK0k2ODg2ODE5MTYKK0kxODEyNzkzNzMxCitJMTcwNDM4MDYyMAorSS0xMzg5NjE1MTc5CitJODY2Mjg3ODM3CitJLTE0MzUyNjUwMDcKK0kzODg0MDA3ODIKK0ktMTQ3OTg2NjAwCitJLTE2MTM1OTg4NTEKK0ktMTA0MDM0NzQwOAorSTc4MjA2MzMyMworSS0yMzkyODIwMzEKK0ktNTc1OTY2NzIyCitJLTE4NjUyMDgxNzQKK0ktNDgxMzY1MTQ2CitJNTc5NTcyODAzCitJLTEyMzk0ODE0OTQKK0kzMzUzNjEyODAKK0ktNDI5NzIyOTQ3CitJMTg4MTc3Mjc4OQorSTE5MDgxMDM4MDgKK0kxNjUzNjkwMDEzCitJLTE2Njg1ODgzNDQKK0kxOTMzNzg3OTUzCitJLTIwMzM0ODA2MDkKK0kyMjE2Mjc5NworSS0xNTE2NTI3MDQwCitJLTQ2MTIzMjQ4MgorSS0xNjIwMTM3MgorSS0yMDQzMDkyMDMwCitJMTE0OTkwMzM3CitJLTE1MjQwOTAwODQKK0kxNDU2Mzc0MDIwCitJNDU4NjA2NDQwCitJLTE5MjgwODMyMTgKK0kyMjc3NzMxMjUKK0ktMTEyOTAyODE1OQorSTE2Nzg2ODkKK0kxNTc1ODk2OTA3CitJLTE3OTI5MzUyMjAKK0ktMTUxMzg3NTc1CitJNjQwODQwODgKK0ktOTU3MzcyMTUKK0kxMzM3MzM1Njg4CitJLTE5NjM0NjYzNDUKK0kxMjQzMzE1MTMwCitJLTE3OTg1MTg0MTEKK0ktNTQ2MDEzMjEyCitJLTYwNzA2NTM5NgorSTEyMTk4MjQxNjAKK0kxNzE1MjE4NDY5CitJLTEzNjgxNjM3ODMKK0kxNzAxNTUyOTEzCitJLTM4MTExNDg4OAorSTEwNjg4MjE3MTcKK0kyNjYwNjI5NzEKK0ktMjA2NjUxMzE3MgorSTE3Njc0MDcyMjkKK0ktNzgwOTM2NDE0CitJLTcwNTQxMzQ0MworSS0xMjU2MjY4ODQ3CitJMTY0Njg3NDE0OQorSTExMDc2OTAzNTMKK0k4MzkxMzMwNzIKK0k2NzAwMTc0OQorSTg2MDc2MzUwMworSTg4NDg4MDYxMworSTkxOTc3MDg0CitJNzU1MzcxOTMzCitJNDIwNzQ1MTUzCitJLTU3ODQ4MDY5MAorSS0xNTIwMTkzNTUxCitJMTAxMTM2OTMzMQorSS05OTc1NDU3NQorSS03MzMxNDEwNjQKK0ktNTAwNTk4NTg4CitJMTA4MTEyNDI3MQorSS0xMzQxMjY2NTc1CitJOTIxMDAyNjEyCitJLTg0ODg1MjQ4NworSS0xOTA0NDY3MzQxCitJLTEyOTQyNTY5NzMKK0ktOTQwNzQ3MTQKK0ktMTc3ODc1ODQ5OAorSS0xNDAxMTg4NTQ3CitJMjEwMTgzMDU3OAorSTIwNTg4NjQ4NzcKK0ktMjcyODc1OTkxCitJLTEzNzU4NTQ3NzkKK0ktMTMzMjkzNzg3MAorSTYxOTQyNTUyNQorSS0xMDM0NTI5NjM5CitJLTM2NDU0MzkzCitJLTIwMzA0OTk5ODUKK0ktMTYzNzEyNzUwMAorSS0xNDA4MTEwMjg3CitJLTIxMDg2MjU3NDkKK0ktOTYxMDA3NDM2CitJMTQ3NTY1NDk1MQorSS03OTE5NDYyNTEKK0kxNjY3NzkyMTE1CitJMTgxODk3ODgzMAorSTE4OTc5ODA1MTQKK0kxOTU5NTQ2NDc3CitJLTc0NDc4OTExCitJLTUwODY0MzM0NworSTQ2MTU5NDM5OQorSTUzODgwMjcxNQorSS0yMDk0OTcwMDcxCitJLTIwNzY2NjAyNTMKK0kxMDkxMzU4OTQ0CitJMTk0NDAyOTI0NgorSS0zNDM5NTc0MzYKK0ktMTkxNTg0NTAyMgorSTEyMzc2MjAxODgKK0kxMTQ0MTI1MTc0CitJMTUyMjE5MDUyMAorSS02NzAyNTI5NTIKK0ktMTk0NjkyMjYKK0k2NzU2MjY1MTAKK0k3NTg3NTAwOTYKK0k5MDk3MjQzNTQKK0ktMTg0NjI1OTY1MgorSTU0NDY2OTM0MworSTQ0NTE4MjQ5NQorSS04MjE1MTk5MzAKK0ktMTEyNDI3OTY4NQorSS0xNjY4OTk1MTIyCitJMTY1MzI4NDc5MworSS02Nzg1NTUxNTEKK0ktNjg3NTEzMjA3CitJMTU1ODI1OTQ0NQorSS0xOTc4ODY2ODM5CitJMTU1ODgzNTYwMQorSTE3MzIxMzg0NzIKK0ktMTkwNDc5MzM2MworSTYyMDAyMDI5NgorSTE1NjI1OTc4NzQKK0kxOTQyNjE3MjI3CitJLTU0OTYzMjU1MgorSTcyMTYwMzc5NQorSTQxNzk3ODQ1NgorSS0xMzU1MjgxNTIyCitJLTUzODA2NTIwOAorSS0xMDc5NTIzMTk2CitJMTg3Mzc1Njk5CitJNDQ5MDY0OTcyCitJMTAxODA4Mzk0NworSTE2MzIzODg4ODIKK0ktNDkzMjY5ODY2CitJOTI3NjkwNDEKK0kxNDc3MTQ2NzUwCitJMTc4MjcwODQwNAorSTQ0NDg3MzM3NgorSTEwODU4NTExMDQKK0ktNjgyMzI3MgorSS0xMzAyMjUxODUzCitJMTYwMjA1MDY4OAorSS0xMDQyMTg3ODI0CitJMjg3MTYxNzQ1CitJLTE5NzIwOTQ0NzkKK0kxMDMyNzE0OTEKK0kyMTMxNjE5NzczCitJLTIwNjQxMTU4NzAKK0k3NjY4MTU0OTgKK0k5OTA4NjE0NTgKK0ktMTY2NDQwNzM3OAorSTEwODM3NDY3NTYKK0ktMTAxODMzMTkwNAorSS02NzczMTU2ODcKK0ktOTUxNjcwNjQ3CitJLTk1MjM1Njg3NAorSTQ1MTQ2MDYwOQorSS04MTg2MTU1NjQKK0k4NTE0Mzk1MDgKK0k2NTYzNjI2MzQKK0ktMTM1MTI0MDQ4NQorSTgyMzM3ODA3OAorSTE5ODU1OTczODUKK0k1OTc3NTc3NDAKK0ktMTUxMjMwMzA1NworSTE1OTA4NzI3OTgKK0kxMTA4NDI0MjEzCitJODE4ODUwODk4CitJLTEzNjg1OTQzMDYKK0ktMjAxMTA3NzYxCitJMTc5MzM3MDM3OAorSTEyNDc1OTc2MTEKK0ktMTU5NDMyNjI2NAorSS02MDE2NTM4OTAKK0k0Mjc2NDI3NTkKK0kyNDgzMjIxMTMKK0ktMjkyNTQ1MzM4CitJMTcwODk4NTg3MAorSTE5MTcwNDI3NzEKK0k0MjkzNTQ1MDMKK0ktNDc4NDcwMzI5CitJNzkzOTYwMDE0CitJMzY5OTM5MTMzCitJMTcyODE4OTE1NworSS01MTg5NjM2MjYKK0ktMjc4NTIzOTc0CitJLTE4NzcyODk2OTYKK0ktMjA4ODYxNzY1OAorSS0xMzY3OTQwMDQ5CitJLTYyMjk1OTI1CitJMTk3OTc1MTE5CitJLTI1MjkwMDc3NworSTgwMzQzMDUzOQorSTQ4NTc1OTQ0MQorSS01MjgyODM0ODAKK0ktMTI4NzQ0Mzk2MworSS00Nzg2MTc0NDQKK0ktODYxOTA2OTQ2CitJLTY0OTA5NTU1NQorSS04OTMxODQzMzcKK0kyMDUwNTcxMzIyCitJODAzNDMzMTMzCitJMTYyOTU3NDU3MQorSTE2NDk3MjA0MTcKK0ktMjA1MDIyNTIwOQorSTEyMDg1OTg5NzcKK0k3MjAzMTQzNDQKK0ktNjE1MTY2MjUxCitJLTgzNTA3NzEyNworSS0xNDA1MzcyNDI5CitJOTk1Njk4MDY0CitJMTQ4MTIzMjQwCitJLTk0MzAxNjY3NgorSS01OTQ2MDk2MjIKK0ktMTM4MTU5NjcxMQorSTEwMTcxOTUzMDEKK0ktMTI2ODg5MzAxMworSS0xODE1OTg1MTc5CitJLTEzOTM1NzAzNTEKK0ktODcwMDI3MzY0CitJLTQ3NjA2NDQ3MgorSTE4NTU4MjY0NQorSTU2OTg2MzMyNgorSTEwOTg1ODQyNjcKK0ktMTU5OTE0NzAwNgorSS00ODUwNTQzOTEKK0ktODUyMDk4MzY1CitJMTQ3NzMyMDEzNQorSTIyMjMxNjc2MgorSS0xNTE1NTgzMDY0CitJLTkzNTA1MTM2NworSTM5MzM4MzA2MworSTgxOTYxNzIyNgorSTcyMjkyMTgzNworSS0xMjQxODA2NDk5CitJLTEzNTg1NjYzODUKK0kxNjY2ODEzNTkxCitJMTMzMzg3NTExNAorSS0xNjYzNjg4MzE3CitJLTQ3MjU0NjIzCitJLTg4NTgwMDcyNgorSTMwNzM4ODk5MQorSS0xMjE5NDU5NDk2CitJMTM3NDg3MDMwMAorSTIxMzIwNDc4NzcKK0ktMTM4NTYyNDE5OAorSS0yNDUxMzkyMDYKK0kxMDE1MTM5MjE0CitJLTkyNjE5ODU1OQorSTE5Njk3OTg4NjgKK0ktMTk1MDQ4MDYxOQorSS01NTkxOTM0MzIKK0ktMTI1NjQ0NjUxOAorSS0xOTgzNDc2OTgxCitJNzkwMTc5NjU1CitJMTAwNDI4OTY1OQorSTE1NDE4Mjc2MTcKK0kxNTU1ODA1NTc1CitJNTAxMTI3MzMzCitJLTExMjM0NDY3OTcKK0ktNDUzMjMwOTE1CitJMjAzNTEwNDg4MworSTEyOTYxMjIzOTgKK0ktMTg0MzY5ODYwNAorSS03MTU0NjQ1ODgKK0kzMzcxNDM5NzEKK0ktMTk3MjExOTE5MgorSTYwNjc3NzkwOQorSTcyNjk3NzMwMgorSS0xMTQ5NTAxODcyCitJLTE5NjM3MzM1MjIKK0ktMTc5NzUwNDY0NAorSTYyNAordHAyCitOdHAzCitiLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9yYW5kdjJfNjQucGNrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JhbmR2Ml82NC5wY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwZGQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9yYW5kdjJfNjQucGNrCkBAIC0wLDAgKzEsNjMzIEBACitjcmFuZG9tCitSYW5kb20KK3AwCisodFJwMQorKEkyCisoSTIxNDc0ODM2NDgKK0kxODEyMTE1NjgyCitJMjc0MTc1NTQ5NworSTEwMjgwNTU3MzAKK0k4MDkxNjYwMzYKK0kyNzczNjI4NjUwCitJNjIzMjE5NTAKK0k1MzUyOTAwNDMKK0kzNDk4Nzc4MDAKK0k5NzYxNjcwMzkKK0kyNDkwNjk2OTQwCitJMzYzMTMyNjk1NQorSTIxMDc5OTExMTQKK0kyOTQxMjA1NzkzCitJMzE5OTYxMTYwNQorSTE4NzE5NzE1NTYKK0kxNDU2MTA4NTQwCitJMjk4NDU5MTA0NAorSTE0MDgzNjgwMQorSTQyMDMyMjczMTAKK0kzNjUyNzIyOTgwCitJNDAzMTk3MTIzNAorSTU1NTc2OTc2MAorSTY5NzMwMTI5NgorSTIzNDc2Mzg4ODAKK0kzMzAyMzM1ODU4CitJMzIwMjU1MTYyCitJMjU1MzU4NjYwOAorSTE1NzAyMjQzNjEKK0kyODM4NzgwOTEyCitJMjMxNTgzNDkxOAorSTIzNTEzNDgxNTgKK0kzNTQ1NDMzMDE1CitJMjI5MjAxODU3OQorSTExNzc1NjkzMzEKK0k3NTg0OTc1NTkKK0kyOTEzMzExMTc1CitJMTAxNDk0ODg4MAorSTE3OTM2MTkyNDMKK0kzOTgyNDUxMDUzCitJMzg1MDk4ODM0MgorSTIzOTM5ODQzMjQKK0kxNTgzMTAwMDkzCitJMzE0NDc0MjU0MworSTM2NTUwNDc0OTMKK0kzNTA3NTMyMzg1CitJMzA5NDUxNTQ0MgorSTM1MDA0MjQzNAorSTI0NTUyOTQ4NDQKK0kxMDM4NzM5MzEyCitJMzEzODA5MTUyCitJMTg5NDMzMDcyCitJMTY1MzE2NTQ1MgorSTQxODY2NTA1OTMKK0kxOTI4MTQ1NQorSTI1ODk2ODA2MTkKK0k0MTQ1OTMxNTkwCitJNDI4MzI2NjExOAorSTYzNjI4MzE3MgorSTk0MzYxODMzNworSTMxNzAxODQ2MzMKK0kyMzA4NzY2MjMxCitJNjM0NjE1MTU5CitJNTM4MTUyNjQ3CitJMjA3OTU3Njg5MQorSTEwMjk0NDI2MTYKK0kzNDEwNjg5NDEyCitJMTM3MDI5Mjc2MQorSTEwNzE3MTg5NzgKK0kyMTM5NDk2MzIyCitJMTg3NjY5OTU0MworSTM0ODU4NjYxODcKK0kzMTU3NDkwMTMwCitJMTYzMzEwNTM4NgorSTE0NTMyNTMxNjAKK0kzODQxMzIyMDgwCitJMzc4OTYwODkyNAorSTQxMTA3NzA3OTIKK0k5NTA4MzY3MworSTkzMTM1NDYyNworSTIwNjUzODk1OTEKK0kzNDQ4MzM5ODI3CitJMzM0ODIwNDU3NworSTMyNjM1Mjg1NjAKK0kyNDExMzI0NTkwCitJNDAwMzA1NTAyNgorSTE4Njk2NzAwOTMKK0kyNzM3MjMxODQzCitJNDE1MDcwMTE1NQorSTI2ODk2Njc2MjEKK0kyOTkzMjYzMjI0CitJMzIzOTg5MDE0MAorSTExOTE0MzA0ODMKK0kxMjE0Mzk5Nzc5CitJMzYyMzQyODUzMworSTE4MTcwNTg4NjYKK0kzMDUyMjc0NDUxCitJMzI2MDMwMDgyCitJMTUwNTEyOTMxMgorSTIzMDY4MTIyNjIKK0kxMzQ5MTUwMzYzCitJMTA5OTEyNzg5NQorSTI1NDM0NjU1NzQKK0kyMzk2MzgwMTkzCitJNTAzOTI2NDY2CitJMTYwNzEwOTczMAorSTM0NTE3MTY4MTcKK0k1ODAzNzExNAorSTQyOTAwODExMTkKK0k5NDc1MTc1OTcKK0kzMDgzNDQwMTg2CitJNTIwNTIyNjMwCitJMjk0ODk2MjQ5NgorSTQxODQzMTk1NzQKK0kyOTU3NjM2MzM1CitJNjY4Mzc0MjAxCitJMjMyNTQ0NjQ3MworSTQ3Mjc4NTMxNAorSTM3OTE5MzIzNjYKK0k1NzMwMTcxODkKK0kyMTg1NzI1Mzc5CitJMTI2MjI1MTQ5MgorSTM1MjUwODkzNzkKK0kyOTUxMjYyNjUzCitJMTMwNTM0NzMwNQorSTk0MDk1ODEyMgorSTMzNDM3NTQ1NjYKK0kzNTkzNzE3NDQKK0kzODc0MDQ0OTczCitJMzk2ODk3MjMyCitJMTQ3MTg4MjQ4CitJNzE2NjgzNzAzCitJNDAxMzg4MDMxNQorSTExMzMzNTk1ODYKK0kxNzk0NjEyMjQ5CitJMzQ4MDgxNTE5MgorSTM5ODg3ODc4MDQKK0kxNzI5MzU1ODA5CitJNTczNDA4NTQyCitJMTQxOTMxMDkzNAorSTE3NzAwMzA0NDcKK0kzNTUyODQ1NTY3CitJMTY5Mzk3NjUwMgorSTEyNzExODk4OTMKK0kyMjk4MjM2NzM4CitJMjA0OTIxOTAyNworSTM0NjQxOTgwNzAKK0kxMjMzNTc0MDgyCitJMTAwNzQ1MTc4MQorSTE4MzgyNTM3NTAKK0k2ODcwOTY1OTMKK0kxMTMxMzc1NjAzCitJMTIyMzAxMzg5NQorSTE0OTA0Nzg0MzUKK0kzMzkyNjU0MzkKK0k0MjMyNzkyNjU5CitJNDkxNTM4NTM2CitJMjgxNjI1Njc2OQorSTEwNDQwOTc1MjIKK0kyNTY2MjI3MDQ5CitJNzQ4NzYyNzkzCitJMTUxMTgzMDQ5NAorSTM1OTMyNTk4MjIKK0k0MTIxMjc5MjEzCitJMzczNTU0MTMwOQorSTM2MDk3OTQ3OTcKK0kxOTM5OTQyMzMxCitJMzc3NTcwNDM0CitJMTQzNzk1NzU1NAorSTE4MzEyODU2OTYKK0k1NTA2MjgxMQorSTIwNDY3ODMxMTAKK0kxMzAzOTAyMjgzCitJMTgzODM0OTg3NworSTQyMDk5MzU1NgorSTEyNTYzOTI1NjAKK0kyNzk1MjE2NTA2CitJMjc4MzY4NzkyNAorSTMzMjIzMDMxNjkKK0k1MTI3OTQ3NDkKK0kzMDg0MDU4MjYKK0k1MTcxNjQ0MjkKK0kzMzIwNDM2MDIyCitJMTMyODQwMzYzMgorSTIyNjkxODQ3NDYKK0kzNzI5NTIyODEwCitJMzMwNDMxNDQ1MAorSTIyMzg3NTYxMjQKK0kxNjkwNTgxMzYxCitJMzgxMzI3NzUzMgorSTQxMTk3MDY4NzkKK0kyNjU5NDQ3ODc1CitJMzg4ODE4OTc4CitJMjA2NDU4MDgxNAorSTE1ODYyMjc2NzYKK0kyNjI3NTIyNjg1CitJMjAxNzc5MjI2OQorSTU0NzkyODEwOQorSTg1OTEwNzQ1MAorSTEwNjIyMzg5MjkKK0k4NTg4ODYyMzcKK0kzNzk1NzgzMTQ2CitJNDE3MzkxNDc1NgorSTM4MzU5MTU5NjUKK0kzMzI5NTA0ODIxCitJMzQ5NDU3OTkwNAorSTgzODg2MzIwNQorSTMzOTk3MzQ3MjQKK0k0MjQ3Mzg3NDgxCitJMzYxODQxNDgzNAorSTI5ODQ0MzM3OTgKK0kyMTY1MjA1NTYxCitJNDI2MDY4NTY4NAorSTMwNDU5MDQyNDQKK0kzNDUwMDkzODM2CitJMzU5NzMwNzU5NQorSTMyMTU4NTExNjYKK0kzMTYyODAxMzI4CitJMjU1ODI4Mzc5OQorSTk1MDA2ODEwNQorSTE4Mjk2NjQxMTcKK0kzMTA4NTQyOTg3CitJMjM3ODg2MDUyNworSTc5MDAyMzQ2MAorSTI4MDA4Nzc1MAorSTExNzE0NzgwMTgKK0kyMzMzNjUzNzI4CitJMzk3NjkzMjE0MAorSTg5Njc0NjE1MgorSTE4MDI0OTQxOTUKK0kxMjMyODczNzk0CitJMjc0OTQ0MDgzNgorSTIwMzIwMzcyOTYKK0kyMDEyMDkxNjgyCitJMTI5NjEzMTAzNAorSTM4OTIxMzMzODUKK0k5MDgxNjEzMzQKK0kyMjk2NzkxNzk1CitJNTQ4MTY5Nzk0CitJNjk2MjY1CitJODkzMTU2ODI4CitJNDI2OTA0NzA5CitJMzU2NTM3NDUzNQorSTI2NTU5MDY4MjUKK0kyNzkyMTc4NTE1CitJMjQwNjgxNDYzMgorSTQwMzg4NDc1NzkKK0kzMTIzOTM0NjQyCitJMjE5NzUwMzAwNAorSTM1MzUwMzI1OTcKK0kyMjY2MjE2Njg5CitJMjExNzYxMzQ2MgorSTE3ODc0NDg1MTgKK0kxODc1MDg5NDE2CitJMjAzNzE2NTM4NAorSTExNDA2NzYzMjEKK0kzNjA2Mjk2NDY0CitJMzIyOTEzODIzMQorSTI0NTgyNjcxMzIKK0kxODc0NjUxMTcxCitJMzMzMTkwMDg2NworSTEwMDA1NTc2NTQKK0kxNDMyODYxNzAxCitJNDczNjM2MzIzCitJMjY5MTc4MzkyNworSTE4NzE0Mzc0NDcKK0kxMzI4MDE2NDAxCitJNDExODY5MDA2MgorSTQ0OTQ2NzYwMgorSTY4MTc4OTAzNQorSTg2NDg4OTQ0MgorSTEyMDA4ODg5MjgKK0k3NTc2OTQ0NQorSTQwMDg2OTAwMzcKK0kyNDY0NTc3NjY3CitJNDE2Nzc5NTgyMworSTMwNzAwOTc2NDgKK0kyNTc5MTc0ODgyCitJMTIxNjg4NjU2OAorSTM4MTAxMTYzNDMKK0kyMjQ5NTA3NDg1CitJMzI2NjkwMzQ4MAorSTM2NzEyMzM0ODAKK0kxMDAxOTE2NTgKK0kzMDg3MTIxMzM0CitJMzY1MDYzMDg3CitJMzgyMTI3NTE3NgorSTIxNjUwNTI4NDgKK0kxMjgyNDY1MjQ1CitJMzYwMTU3MDYzNworSTMxMzI0MTMyMzYKK0kyNzgwNTcwNDU5CitJMzIyMjE0MjkxNworSTMxMjk3OTQ2OTIKK0kyNjExNTkwODExCitJOTQ3MDMxNjc3CitJMjk5MTkwODkzOAorSTc1MDk5Nzk0OQorSTM2MzI1NzUxMzEKK0kxNjMyMDE0NDYxCitJMjg0NjQ4NDc1NQorSTIzNDcyNjE3NzkKK0kyOTAzOTU5NDQ4CitJMTM5NzMxNjY4NgorSTE5MDQ1NzgzOTIKK0k3NzQ2NDk1NzgKK0kzMTY0NTk4NTU4CitJMjQyOTU4NzYwOQorSTczODI0NDUxNgorSTE1NjMzMDQ5NzUKK0kxMzk5MzE3NDE0CitJMTAyMTMxNjI5NworSTMxODc5MzMyMzQKK0kyMTI2NzgwNzU3CitJNDAxMTkwNzg0NworSTQwOTUxNjkyMTkKK0kzMzU4MDEwMDU0CitJMjcyOTk3ODI0NworSTM3MzY4MTE2NDYKK0kzMDA5NjU2NDEwCitJMjg5MzA0MzYzNworSTQwMjc0NDczODUKK0kxMjM5NjEwMTEwCitJMTQ4ODgwNjkwMAorSTI2NzQ4NjY4NDQKK0k0NDI4NzYzNzQKK0kyODUzNjg3MjYwCitJMjc4NTkyMTAwNQorSTMxNTEzNzg1MjgKK0kxMTgwNTY3CitJMjgwMzE0Njk2NAorSTk4MjIyMTc1OQorSTIxOTI5MTk0MTcKK0kzMDg3MDI2MTgxCitJMjQ4MDgzODAwMgorSTczODQ1MjkyMQorSTY4Nzk4NjE4NQorSTMwNDkzNzE2NzYKK0kzNjM2NDkyOTU0CitJMzQ2ODMxMTI5OQorSTIzNzk2MjExMDIKK0k3ODg5ODg2MzMKK0kxNjQzMjEwNjAxCitJMjk4Mzk5ODE2OAorSTI0OTI3MzA4MDEKK0kyNTg2MDQ4NzA1CitJNjA0MDczMDI5CitJNDEyMTA4MjgxNQorSTE0OTY0NzY5MjgKK0kyOTcyMzU3MTEwCitJMjY2MzExNjk2OAorSTI2NDI2Mjg1OTIKK0kyMTE2MDUyMDM5CitJNDg3MTg2Mjc5CitJMjU3NzY4MDMyOAorSTM5NzQ3NjY2MTQKK0k3MzA3NzY2MzYKK0kzODQyNTI4ODU1CitJMTkyOTA5MzY5NQorSTQ0NjI2NjIyCitJMzk4OTkwODgzMworSTE2OTU0MjYyMjIKK0kzNjc1NDc5MzgyCitJMzA1MTc4NDk2NAorSTE1MTQ4NzY2MTMKK0kxMjU0MDM2NTk1CitJMjQyMDQ1MDY0OQorSTMwMzQzNzczNjEKK0kyMzMyOTkwNTkwCitJMTUzNTE3NTEyNgorSTE4NTgzNDM4NAorSTExMDczNzI5MDAKK0kxNzA3Mjc4MTg1CitJMTI4NjI4NTI5NQorSTMzMzI1NzQyMjUKK0kyNzg1NjcyNDM3CitJODgzMTcwNjQ1CitJMjAwNTY2NjQ3MworSTM0MDMxMzEzMjcKK0k0MTIyMDIxMzUyCitJMTQ2NDAzMjg1OAorSTM3MDI1NzYxMTIKK0kyNjA1NTQ1OTgKK0kxODM3NzMxNjUwCitJMjU5NDQzNTM0NQorSTc1NzcxMDQ5CitJMjAxMjQ4NDI4OQorSTMwNTg2NDk3NzUKK0kyOTk3OTcwMworSTM4NjEzMzUzMzUKK0kyNTA2NDk1MTUyCitJMzc4NjQ0ODcwNAorSTQ0Mjk0Nzc5MAorSTI1ODI3MjQ3NzQKK0k0MjkxMzM2MjQzCitJMjU2ODE4OTg0MworSTE5MjMwNzI2OTAKK0kxMTIxNTg5NjExCitJODM3Njk2MzAyCitJMzI4NDYzMTcyMAorSTM4NjUwMjEzMjQKK0kzNTc2NDUzMTY1CitJMjU1OTUzMTYyOQorSTE0NTkyMzE3NjIKK0kzNTA2NTUwMDM2CitJMzc1NDQyMDE1OQorSTI2MjIwMDA3NTcKK0kxMjQyMjg1OTYKK0kxMDg0MzI4NjA1CitJMTY5MjgzMDc1MworSTU0NzI3MzU1OAorSTY3NDI4MjYyMQorSTY1NTI1OTEwMworSTMxODg2Mjk2MTAKK0k0OTA1MDIxNzQKK0kyMDgxMDAxMjkzCitJMzE5MTMzMDcwNAorSTQxMDk5NDM1OTMKK0kxODU5OTQ4NTA0CitJMzE2MzgwNjQ2MAorSTUwODgzMzE2OAorSTEyNTYzNzEwMzMKK0kyNzA5MjUzNzkwCitJMjA2ODk1NjU3MgorSTMwOTI4NDI4MTQKK0kzOTEzOTI2NTI5CitJMjAzOTYzODc1OQorSTk4MTk4MjUyOQorSTUzNjA5NDE5MAorSTM2ODg1NTI5NQorSTUxOTkzOTc1CitJMTU5NzQ4MDczMgorSTQwNTgxNzU1MjIKK0kyMTU1ODk2NzAyCitJMzE5NjI1MTk5MQorSTEwODE5MTM4OTMKK0kzOTUyMzUzNzg4CitJMzU0NTU0ODEwOAorSTIzNzA2Njk2NDcKK0kyMjA2NTcyMzA4CitJMjU3NjM5Mjk5MQorSTE3MzIzMDMzNzQKK0kxMTUzMTM2MjkwCitJNTM3NjQxOTU1CitJMTczODY5MTc0NworSTMyMzI4NTQxODYKK0kyNTM5NjMyMjA2CitJMjgyOTc2MDI3OAorSTMwNTgxODc4NTMKK0kxMjAyNDI1NzkyCitJMzc2MjM2MTk3MAorSTI4NjM5NDkzNDIKK0kyNjQwNjM1ODY3CitJMzc2NjM4NzQ0CitJMTg1NzY3OTc1NworSTMzMDc5ODA4NworSTE0NTc0MDA1MDUKK0kxMTM1NjEwMDQ2CitJNjA2NDAwNzE1CitJMTg1OTUzNjAyNgorSTUwOTgxMTMzNQorSTUyOTc3MjMwOAorSTI1NzkyNzMyNDQKK0kxODkwMzgyMDA0CitJMzk1OTkwODg3NgorSTI2MTIzMzU5NzEKK0kyODM0MDUyMjI3CitJMTQzNDQ3NTk4NgorSTM2ODQyMDI3MTcKK0k0MDE1MDExMzQ1CitJNTgyNTY3ODUyCitJMzY4OTk2OTU3MQorSTM5MzQ3NTM0NjAKK0kzMDM0OTYwNjkxCitJMjA4NTczMjkyCitJNDAwNDExMzc0MgorSTM5OTI5MDQ4NDIKK0kyNTg3MTUzNzE5CitJMzUyOTE3OTA3OQorSTE1NjU0MjQ5ODcKK0k3NzkxMzA2NzgKK0kxMDQ4NTgyOTM1CitJMzIxMzU5MTYyMgorSTM2MDc3OTM0MzQKK0kzOTUxMjU0OTM3CitJMjA0NzgxMTkwMQorSTc1MDg4NTAKK0kyNDg1NDQ2MDUKK0k0MjEwMDkwMzI0CitJMjMzMTQ5MDg4NAorSTcwMDU3MjEzCitJNzc2NDc0OTQ1CitJMTM0NTUyODg4OQorSTMyOTA0MDM2MTIKK0kxNjY0OTU1MjY5CitJMTUzMzE0MzExNgorSTU0NTAwMzQyNAorSTQxNDE1NjQ0NzgKK0kxMjU3MzI2MTM5CitJODY4ODQzNjAxCitJMjMzNzYwMzAyOQorSTE5MTgxMzE0NDkKK0kxODQzNDM5NTIzCitJMTEyNTUxOTAzNQorSTY3MzM0MDExOAorSTQyMTQwODg1MgorSTE1MjA0NTQ5MDYKK0kxODA0NzIyNjMwCitJMzYyMTI1NDE5NgorSTIzMjk5NjgwMDAKK0kzOTQ2NDY3MgorSTQzMDU4MzEzNAorSTI5NDAyNjUxMgorSTUzOTc4NTI1CitJMjg5MjI3NjEwNQorSTE0MTg4NjM3NjQKK0kzNDE5MDU0NDUxCitJMTM5MTU5NTc5NworSTM1NDQ5ODE3OTgKK0k0MTkxNzgwODU4CitJODI1NjcyMzU3CitJMjk3MjAwMDg0NAorSTE1NzEzMDUwNjkKK0k0MjMxOTgyODQ1CitJMzYxMTkxNjQxOQorSTMwNDUxNjMxNjgKK0kyOTgyMzQ5NzMzCitJMjc4NTcyMTQxCitJNDIxNTMzODA3OAorSTgzOTg2MDUwNAorSTE4MTkxNTE3NzkKK0kxNDEyMzQ3NDc5CitJMTM4Njc3MDM1MworSTM5MTQ1ODk0OTEKK0kzNzgzMTA0OTc3CitJNDEyNDI5NjczMworSTgzMDU0NjI1OAorSTg5ODI1NjI0CitJNDExMDYwMTMyOAorSTI1NDU0ODM0MjkKK0kzMDA2MDA1MjcKK0k1MTY2NDExNTgKK0kzNjkzMDIxMDM0CitJMjg1MjkxMjg1NAorSTMyNDAwMzk4NjgKK0k0MTY3NDA3OTU5CitJMTQ3OTU1Nzk0NgorSTM2MjExODg4MDQKK0kxMzkxNTkwOTQ0CitJMzU3ODQ0MTEyOAorSTEyMjcwNTU1NTYKK0k0MDY4OTgzOTYKK0kzMDY0MDU0OTgzCitJMjU4MzUzMzgKK0k0MDI2NjQxNjUKK0k0MDk3NjgyNzc5CitJMjEwNjcyODAxMgorSTIwMzYxMzYyMgorSTMwNDU0Njc2ODYKK0kxMzgxNzI2NDM4CitJMzc5ODY3MDExMAorSTEzNDIzMTQ5NjEKK0kzNTUyNDk3MzYxCitJNTM1OTEzNjE5CitJMjYyNTc4NzU4MworSTE2MDY1NzQzMDcKK0kxMTAxMjY5NjMwCitJMTk1MDUxMzc1MgorSTExMjEzNTU4NjIKK0kzNTg2ODE2OTAzCitJNDM4NTI5OTg0CitJMjQ3MzE4MjEyMQorSTEyMjk5OTcyMDMKK0k0MDU0NDU5NDAKK0kxNjk1NTM1MzE1CitJNDI3MDE0MzM2CitJMzkxNjc2ODQzMAorSTM5MjI5ODM1OQorSTE4ODQ2NDI4NjgKK0kxMjQ0NzMwODIxCitJNzQxMDU4MDgwCitJNTY3NDc5OTU3CitJMzUyNzYyMTE2OAorSTMxOTE5NzEwMTEKK0kzMjY3MDY5MTA0CitJNDEwODY2ODE0NgorSTE1MjA3OTU1ODcKK0kxNjY1ODEwMDYKK0k0NzM3OTQ0NzcKK0kxNTYyMTI2NTUwCitJOTI5ODQzMDEwCitJODg5NTMzMjk0CitJMTI2NjU1NjYwOAorSTg3NDUxODY1MAorSTM1MjAxNjIwOTIKK0kzMDEzNzY1MDQ5CitJNDIyMDIzMTQxNAorSTU0NzI0NjQ0OQorSTM5OTgwOTM3NjkKK0kzNzM3MTkzNzQ2CitJMzg3Mjk0NDIwNworSTc5MzY1MTg3NgorSTI2MDYzODQzMTgKK0k4NzU5OTEwMTIKK0kxMzk0ODM2MzM0CitJNDEwMjAxMTY0NAorSTg1NDM4MDQyNgorSTI2MTg2NjY3NjcKK0kyNTY4MzAyMDAwCitJMTk5NTUxMjEzMgorSTIyOTQ5MTA5MworSTI2NzM1MDAyODYKK0kzMzY0NTUwNzM5CitJMzgzNjkyMzQxNgorSTI0MzY1Njk4NworSTM5NDQzODg5ODMKK0k0MDY0OTQ5Njc3CitJMTQxNjk1NjM3OAorSTE3MDMyNDQ0ODcKK0kzOTkwNzk4ODI5CitJMjAyMzQyNTc4MQorSTM5MjY3MDIyMTQKK0kxMjI5MDE1NTAxCitJMzE3NDI0NzgyNAorSTYyNAordHAyCitOdHAzCitiLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9yYW5kdjMucGNrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JhbmR2My5wY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlmYzM4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9yYW5kdjMucGNrCkBAIC0wLDAgKzEsNjMzIEBACitjcmFuZG9tCitSYW5kb20KK3AwCisodFJwMQorKEkzCisoTDIxNDc0ODM2NDhMCitMOTk0MDgxODMxTAorTDI4MDYyODcyNjVMCitMMjIyODk5OTgzMEwKK0wzMzk2NDk4MDY5TAorTDI5NTY4MDU0NTdMCitMMzI3MzkyNzc2MUwKK0w5MjA3MjY1MDdMCitMMTg2MjYyNDQ5MkwKK0wyOTIxMjkyNDg1TAorTDE3Nzk1MjY4NDNMCitMMjQ2OTEwNTUwM0wKK0wyNTE2OTYyOTNMCitMMTI1NDM5MDcxN0wKK0w3NzkxOTcwODBMCitMMzE2NTM1NjgzMEwKK0wyMDA3MzY1MjE4TAorTDE4NzAwMjg4MTJMCitMMjg5NjUxOTM2M0wKK0wxODU1NTc4NDM4TAorTDk3OTUxODQxNkwKK0wzNDgxNzEwMjQ2TAorTDMxOTE4NjE1MDdMCitMMzk5MzAwNjU5M0wKK0wyOTY3OTcxNDc5TAorTDMzNTMzNDI3NTNMCitMMzU3Njc4MjU3MkwKK0wzMzk2ODU1NThMCitMMjM2NzY3NTczMkwKK0wxMTYyMDg1NTVMCitMMTIyMDA1NDQzN0wKK0w0ODY1OTcwNTZMCitMMTkxMjExNTE0MUwKK0wxMDM3MDQ0NzkyTAorTDQwOTY5MDQ3MjNMCitMMzQwOTE0NjE3NUwKK0wzNzAxNjUxMjI3TAorTDMxNTgyNDYxMEwKK0w0MTM4NjA0NTgzTAorTDEzODU3NjQ4OTJMCitMMTkxODc4OTAwTAorTDIzMjA1ODIyMTlMCitMMzQyMDY3NzQ5NEwKK0wyNzc2NTAzMTY5TAorTDExNDgyNDc0MDNMCitMODI5NTU1MDY5TAorTDkwMjA2NDAxMkwKK0wyOTM0NjQyNzQxTAorTDI0NzcxMDg1NzdMCitMMjU4MzkyODIxN0wKK0wxNjU4NjEyNTc5TAorTDI4NjU0NDc5MTNMCitMMTI5MTQ3MzQ2TAorTDM2OTExNzE4ODdMCitMMTU2OTMyODExMEwKK0wxMzcyODYwMTQzTAorTDEwNTQxMzkxODNMCitMMTYxNzcwNzA4MEwKK0w2OTAyMDU5MkwKK0wzODEwMjcxNjAzTAorTDE4NTM5NTM0MTZMCitMMzQ5OTgwMzA3M0wKK0wxMDI3NTQ1MDI3TAorTDMyMjkwNDM2MDVMCitMMjUwODQ4NzIwTAorTDMzMjQ5MzI2MjZMCitMMzUzNzAwMjk2MkwKK0wyNDk0MzIzMzQ1TAorTDMyMzgxMDM5NjJMCitMNDE0NzU0MTU3OUwKK0wzNjM2MzQ4MTg2TAorTDMwMjU0NTUwODNMCitMMjY3ODc3MTk3N0wKK0w1ODQ3MDAyNTZMCitMMzQ2MTgyNjkwOUwKK0w4NTQ1MTE0MjBMCitMOTQzNDYzNTUyTAorTDM2MDkyMzkwMjVMCitMMzk3NzU3Nzk4OUwKK0wyNTMwNzAwOTBMCitMNzc3Mzk0NTQ0TAorTDIxNDQwODY1NjdMCitMMTA5Mjk0Nzk5MkwKK0w4NTQzMjcyODRMCitMMjIyMjc1MDA4MkwKK0wzNjAxODM1MTBMCitMMTMxMjQ2NjQ4M0wKK0wzMjI3NTMxMDkxTAorTDIyMzUwMjI1MDBMCitMMzAxMzA2MDUzMEwKK0wyNTQxMDkxMjk4TAorTDM0ODAxMjYzNDJMCitMMTgzOTc2Mjc3NUwKK0wyNjMyNjA4MTkwTAorTDExMDg4ODk0MDNMCitMMzA0NTA1MDkyM0wKK0w3MzE1MTMxMjZMCitMMzUwNTQzNjc4OEwKK0wzMDYyNzYyMDE3TAorTDE2NjczOTI2ODBMCitMMTM1NDEyNjUwMEwKK0wxMTQzNTczOTMwTAorTDI4MTY2NDU3MDJMCitMMjEwMDM1Njg3M0wKK0wyODE3Njc5MTA2TAorTDEyMTA3NDYwMTBMCitMMjQwOTkxNTI0OEwKK0wyOTEwMTE5OTY0TAorTDIzMDkwMDE0MjBMCitMMjIwMzUxODI0TAorTDM2NjczNTI4NzFMCitMMzk5MzE0ODU5MEwKK0wyODg2MTYwMjMyTAorTDQyMzkzOTM3MDFMCitMMTE4OTI3MDU4MUwKK0wzMDY3OTg1NTQxTAorTDE0NzM3NDU3M0wKK0wyMzU1MTY0ODY5TAorTDM2OTYwMTM1NTBMCitMNDIyNzAzNzg0NkwKK0wxOTA1MTEyNzQzTAorTDMzMTI4NDM2ODlMCitMMjkzMDY3ODI2NkwKK0wxODI4Nzk1MzU1TAorTDc2OTMzNTk0TAorTDM5ODcxMDA3OTZMCitMMTI4ODM2MTQzNUwKK0wzNDY0NTI5MTUxTAorTDk2NTQ5ODA3OUwKK0wxNDQ0NjIzMDkzTAorTDEzNzI4OTM0MTVMCitMMTUzNjIzNTU5N0wKK0wxMzQxOTk0ODUwTAorTDk2MzU5NDc1OEwKK0wyMTE1Mjk1NzU0TAorTDk4MjA5ODY4NUwKK0wxMDUzNDMzOTA0TAorTDIwNzg0Njk4NDRMCitMMzA1OTc2NTc5MkwKK0wxNzUzNjA2MTgxTAorTDIxMzAxNzEyNTRMCitMNTY3NTg4MTk0TAorTDUyOTYyOTQyNkwKK0wzNjIxNTIzNTM0TAorTDMwMjc1NzY1NjRMCitMMTE3NjQzODA4M0wKK0w0MDk2Mjg3ODU4TAorTDExNjg1NzQ2ODNMCitMMTQyNTA1ODk2MkwKK0wxNDI5NjMxNjU1TAorTDI5MDIxMDY3NTlMCitMNzYxOTAwNjQxTAorTDEzMjkxODM5NTZMCitMMTk0NzA1MDkzMkwKK0w0NDc0OTAyODlMCitMMzI4MjUxNjI3NkwKK0wyMDAwMzczODlMCitMOTIxODY4MTk3TAorTDMzMzE0MDM5OTlMCitMNDA4ODc2MDI0OUwKK0wyMTg4MzI2MzE4TAorTDI4ODQwMTk2MUwKK0wxMzYwODAyNjc1TAorTDMxNDMwMjgwOEwKK0wzMzE0NjM5MjEwTAorTDM3NDk4MjEyMDNMCitMMjI4NjA4MTU3MEwKK0wyNzY4OTM5MDYyTAorTDMyMDA1NDEwMTZMCitMMjEzMzQ5NTQ4MkwKK0wzODUwMjk4ODBMCitMNDIxNzIzMjIwMkwKK0wzMTcxNjE3MjMxTAorTDE2NjA4NDY2NTNMCitMMjQ1OTk4NzYyMUwKK0wyNjkxNzc2MTI0TAorTDQyMjUwMzA0MDhMCitMMzU5NTM5Njc3M0wKK0wxMTAzNjgwNjYxTAorTDUzOTA2NDA1N0wKK0wxNDkyODQxMTAxTAorTDE2NjE5NTM5NEwKK0w3NTc5NzM2NThMCitMNTMzODkzMDU0TAorTDI3ODQ4Nzk1OTRMCitMMTAyMTgyMTg4M0wKK0wyMzUwNTQ4MTYyTAorTDE3Njg1MjExNkwKK0wzNTAzMTY2MDI1TAorTDE0ODA3OTkxNEwKK0wxNjMzNDY2MjM2TAorTDI3NzMwOTAxNjVMCitMMTE2Mjg0NjcwMUwKK0wzNTc1NzM3Nzk1TAorTDE2MjQxNzgyMzlMCitMMjQ1NDg5NDcxMEwKK0wzMDE0NjkxOTM4TAorTDUyNjM1NTY3OUwKK0wxODcwODI0MDgxTAorTDMzNjI0MjU4NTdMCitMMzkwNzU2NjY2NUwKK0wzNDYyNTYzMTg0TAorTDIyMjkxMTIwMDRMCitMNDIwMzczNTc0OEwKK0wxNTU3NDQyNDgxTAorTDkyNDEzMzk5OUwKK0wxOTA2NjM0MjE0TAorTDg4MDQ1OTcyN0wKK0w0MDY1ODk1ODcwTAorTDE0MTQyNjI1NEwKK0wxMjU4NDUwMTU5TAorTDMyNDMxMTUwMjdMCitMMTU3NDk1ODg0MEwKK0wzMTM5MzkyOTRMCitMMzA1NTY2NDI2MEwKK0wzNDU5NzE0MjU1TAorTDUzMTc3ODc5MEwKK0w1MDk1MDU1MDZMCitMMTYyMDIyNzQ5MUwKK0wyNjc1NTU0OTQyTAorTDI1MTY1MDk1NjBMCitMMzc5NzI5OTg4N0wKK0wyMzcxMzU4OTBMCitMMzIwMzE0MjIxM0wKK0wxMDg3NzQ1MzEwTAorTDE4OTcxNTE4NTRMCitMMzkzNjU5MDA0MUwKK0wxMzI3NjUxNjdMCitMMjM4NTkwODA2M0wKK0wxMzYwNjAwMjg5TAorTDM1NzQ1Njc3NjlMCitMMjc1Mjc4ODExNEwKK0wyNjQ0MjI4OTY2TAorTDIzNzc3MDUxODNMCitMNjAxMjc3OTA5TAorTDQwNDY0ODA0OThMCitMMzI0NDAxNDA4TAorTDMyNzk5MzE3NjBMCitMMjIyNzA1OTM3N0wKK0wxNTM4ODI3NDkzTAorTDQyMjA1MzIwNjRMCitMNDc4MDQ0NTY0TAorTDI5MTcxMTc3NjFMCitMNjM1NDkyODMyTAorTDIzMTk3NjMyNjFMCitMNzk1OTQ0MjA2TAorTDE4MjA0NzMyMzRMCitMMTY3MzE1MTQwOUwKK0wxNDA0MDk1NDAyTAorTDE2NjEwNjc1MDVMCitMMzIxNzEwNjkzOEwKK0wyNDA2MzEwNjgzTAorTDE5MzEzMDkyNDhMCitMMjQ1ODYyMjg2OEwKK0wzMzIzNjcwNTI0TAorTDMyNjY4NTI3NTVMCitMMjQwMDgzOTQzTAorTDMxNjgzODczOTdMCitMNjA3NzIyMTk4TAorTDEyNTY4Mzc2OTBMCitMMzYwODEyNDkxM0wKK0w0MjQ0OTY5MzU3TAorTDEyODk5NTkyOTNMCitMNTE5NzUwMzI4TAorTDMyMjk0ODI0NjNMCitMMTEwNTE5Njk4OEwKK0wxODMyNjg0NDc5TAorTDM3NjEwMzcyMjRMCitMMjM2MzYzMTgyMkwKK0wzMjk3OTU3NzExTAorTDU3Mjc2NjM1NUwKK0wxMTk1ODIyMTM3TAorTDIyMzkyMDc5ODFMCitMMjAzNDI0MTIwM0wKK0wxNjM1NDA1MTRMCitMMjg4MTYwMjU1TAorTDcxNjQwMzY4MEwKK0w0MDE5NDM5MTQzTAorTDE1MzYyODE5MzVMCitMMjM0NTEwMDQ1OEwKK0wyNzg2MDU5MTc4TAorTDI4MjIyMzIxMDlMCitMOTg3MDI1Mzk1TAorTDMwNjExNjY1NTlMCitMNDkwNDIyNTEzTAorTDI1NTEwMzAxMTVMCitMMjYzODcwNzYyMEwKK0wxMzQ0NzI4NTAyTAorTDcxNDEwODkxMUwKK0wyODMxNzE5NzAwTAorTDIxODg2MTUzNjlMCitMMzczNTA5MDYxTAorTDEzNTEwNzc1MDRMCitMMzEzNjIxNzA1NkwKK0w3ODM1MjEwOTVMCitMMjU1NDk0OTQ2OEwKK0wyNjYyNDk5NTUwTAorTDEyMDM4MjY5NTFMCitMMTM3OTYzMjM4OEwKK0wxOTE4ODU4OTg1TAorTDYwNzQ2NTk3NkwKK0wxOTgwNDUwMjM3TAorTDM1NDAwNzkyMTFMCitMMzM5NzgxMzQxMEwKK0wyOTEzMzA5MjY2TAorTDIyODk1NzI2MjFMCitMNDEzMzkzNTMyN0wKK0w0MTY2MjI3NjYzTAorTDMzNzE4MDE3MDRMCitMMzA2NTQ3NDkwOUwKK0wzNTgwNTYyMzQzTAorTDM4MzIxNzIzNzhMCitMMjU1NjEzMDcxOUwKK0wzMTA0NzM3MDVMCitMMzczNDAxNDM0NkwKK0wyNDkwNDEzODEwTAorTDM0NzIzMzA1NkwKK0w1MjY2NjgwMzdMCitMMTE1ODM5MzY1NkwKK0w1NDQzMjk3MDNMCitMMjE1MDA4NTQxOUwKK0wzOTE0MDM4MTQ2TAorTDEwNjAyMzc1ODZMCitMNDE1OTM5NDgzN0wKK0wxMTMyMDUxMjFMCitMMzA5OTY2Nzc1TAorTDQwOTg3ODQ0NjVMCitMMzYzNTIyMjk2MEwKK0wyNDE3NTE2NTY5TAorTDIwODk1NzkyMzNMCitMMTcyNTgwNzU0MUwKK0wyNzI4MTIyNTI2TAorTDIzNjU4MzY1MjNMCitMMjUwNDA3ODUyMkwKK0wxNDQzOTQ2ODY5TAorTDIzODQxNzE0MTFMCitMOTk3MDQ2NTM0TAorTDMyNDkxMzE2NTdMCitMMTY5OTg3NTk4NkwKK0wzNjE4MDk3MTQ2TAorTDE3MTYwMzgyMjRMCitMMjYyOTgxODYwN0wKK0wyOTI5MjE3ODc2TAorTDEzNjcyNTAzMTRMCitMMTcyNjQzNDk1MUwKK0wxMzg4NDk2MzI1TAorTDIxMDc2MDIxODFMCitMMjgyMjM2Njg0MkwKK0wzMDUyOTc5MTkwTAorTDM3OTY3OTg2MzNMCitMMTU0MzgxMzM4MUwKK0w5NTkwMDAxMjFMCitMMTM2Mzg0NTk5OUwKK0wyOTUyNTI4MTUwTAorTDg3NDE4NDkzMkwKK0wxODg4Mzg3MTk0TAorTDIzMjg2OTUyOTVMCitMMzQ0Mjk1OTg1NUwKK0w4NDE4MDU5NDdMCitMMTA4NzczOTI3NUwKK0wzMjMwMDA1NDM0TAorTDMwNDUzOTkyNjVMCitMMTE2MTgxNzMxOEwKK0wyODk4NjczMTM5TAorTDg2MDAxMTA5NEwKK0w5NDA1Mzk3ODJMCitMMTI5NzgxODA4MEwKK0w0MjQzOTQxNjIzTAorTDE1Nzc2MTMwMzNMCitMNDIwNDEzMTg4N0wKK0wzODE5MDU3MjI1TAorTDE5Njk0Mzk1NThMCitMMzI5Nzk2MzkzMkwKK0wyNDE4NzQwNjlMCitMMzUxNzAzMzQ1M0wKK0wyMjk1MzQ1NjY0TAorTDEwOTg5MTE0MjJMCitMODg2OTU1MDA4TAorTDE0NzczOTc2MjFMCitMNDI3OTM0NzMzMkwKK0wzNjE2NTU4NzkxTAorTDIzODQ0MTE5NTdMCitMNzQyNTM3NzMxTAorTDc2NDIyMTU0MEwKK0wyODcxNjk4OTAwTAorTDM1MzA2MzYzOTNMCitMNjkxMjU2NjQ0TAorTDc1ODczMDk2NkwKK0wxNzE3NzczMDkwTAorTDI3NTE4NTYzNzdMCitMMzE4ODQ4NDAwMEwKK0wzNzY3NDY5NjcwTAorTDE2MjM4NjMwNTNMCitMMzUzMzIzNjc5M0wKK0w0MDk5Mjg0MTc2TAorTDcyMzkyMTEwN0wKK0wzMTA1OTQwMzZMCitMMjIzOTc4NzQ1TAorTDIyNjY1NjU3NzZMCitMMjAxODQzMzAzTAorTDI5Njk5Njg1NDZMCitMMzM1MTE3MDg4OEwKK0wzNDY1MTEzNjI0TAorTDI3MTIyNDY3MTJMCitMMTUyMTM4MzA1N0wKK0wyMzg0NDYxNzk4TAorTDIxNjM1NzU1MUwKK0wyMTY3MzAxOTc1TAorTDMxNDQ2NTMxOTRMCitMMjc4MTIyMDE1NUwKK0wzNjIwNzQ3NjY2TAorTDk1OTcxMjY1TAorTDQyNTU0MDAyNDNMCitMNTk5OTk3NTdMCitMNDE3NDI3MzQ3MkwKK0wzOTc0NTExNTI0TAorTDEwMDcxMjM5NTBMCitMMzExMjQ3NzYyOEwKK0w4MDY0NjE1MTJMCitMMzE0ODA3NDAwOEwKK0w1MjgzNTI4ODJMCitMMjU0NTk3OTU4OEwKK0wyNTYyMjgxOTY5TAorTDMwMTAyNDk0NzdMCitMMTg4NjMzMTYxMUwKK0wzMjEwNjU2NDMzTAorTDEwMzQwOTk5NzZMCitMMjkwNjg5MzU3OUwKK0wxMTk3MDQ4Nzc5TAorTDE4NzAwMDQ0MDFMCitMMzg5ODMwMDQ5MEwKK0wyNjg2ODU2NDAyTAorTDM5NzU3MjM0NzhMCitMNjEzMDQzNTMyTAorTDI1NjU2NzQzNTNMCitMMzc2MDA0NTMxMEwKK0wzNDY4OTg0Mzc2TAorTDQxMjYyNThMCitMMzAzODU1NDI0TAorTDM5ODg5NjM1NTJMCitMMjc2MjU2Nzk2TAorTDU0NDA3MTgwN0wKK0wxMDIzODcyMDYyTAorTDE3NDc0NjE1MTlMCitMMTk3NTU3MTI2MEwKK0w0MDMzNzY2OTU4TAorTDI5NDY1NTU1NTdMCitMMTQ5Mjk1Nzc5NkwKK0w5NTgyNzE2ODVMCitMNDY0ODA1MTVMCitMOTA3NzYwNjM1TAorTDEzMDY2MjYzNTdMCitMODE5NjUyMzc4TAorTDExNzIzMDAyNzlMCitMMTExNjg1MTMxOUwKK0w0OTU2MDEwNzVMCitMMTE1NzcxNTMzMEwKK0w1MzQyMjAxMDhMCitMMzc3MzIwMDI4TAorTDE2NzIyODYxMDZMCitMMjA2NjIxOTI4NEwKK0wxODQyMzg2MzU1TAorTDI1NDYwNTk0NjRMCitMMTgzOTQ1NzMzNkwKK0wzNDc2MTk0NDQ2TAorTDMwNTA1NTAwMjhMCitMNTk0NzA1NTgyTAorTDE5MDU4MTM1MzVMCitMMTgxMzAzMzQxMkwKK0wyNzAwODU4MTU3TAorTDE2OTA2Nzk3MkwKK0w0MjUyODg5MDQ1TAorTDE5MjE5NDQ1NTVMCitMNDk3NjcxNDc0TAorTDIxMDE0MzkzNUwKK0wyNjg4Mzk4NDg5TAorTDMyNTE1ODM3NUwKK0wzNDUwODQ2NDQ3TAorTDg5MTc2MDU5N0wKK0w3MTI4MDI1MzZMCitMMTEzMjU1NzQzNkwKK0wxNDE3MDQ0MDc1TAorTDE2Mzk4ODk2NjBMCitMMTc0NjM3OTk3MEwKK0wxNDc4NzQxNjQ3TAorTDI4MTc1NjM0ODZMCitMMjU3MzYxMjUzMkwKK0w0MjY2NDQ0NDU3TAorTDI5MTE2MDE2MTVMCitMODA0NzQ1NDExTAorTDIyMDcyNTQ2NTJMCitMMTE4OTE0MDY0NkwKK0wzODI5NzI1MTExTAorTDM2MzczNjczNDhMCitMMTk0NDczMTc0N0wKK0wyMTkzNDQwMzQzTAorTDE0MzAxOTU0MTNMCitMMTE3MzUxNTIyOUwKK0wxNTgyNjE4MjE3TAorTDIwNzA3NjcwMzdMCitMMjQ3OTA4OTM2TAorTDE0NjA2NzU0MzlMCitMNTU2MDAxNTk2TAorTDMyNzYyOTMzNUwKK0wxMDM2MTMzODc2TAorTDQyMjgxMjk2MDVMCitMOTk5MTc0MDQ4TAorTDM2MzU4MDQwMzlMCitMMTQxNjU1MDQ4MUwKK0wxMjcwNTQwMjY5TAorTDQyODA3NDM4MTVMCitMMzk2MDc2NTlMCitMMTU1MjU0MDYyM0wKK0wyNzYyMjk0MDYyTAorTDUwNDEzNzI4OUwKK0w0MTE3MDQ0MjM5TAorTDE0MTcxMzAyMjVMCitMMTM0Mjk3MDA1NkwKK0wxNzU1NzE2NDQ5TAorTDExNjk0NDczMjJMCitMMjczMTQwMTM1NkwKK0wyMzE5OTc2NzQ1TAorTDI4NjkyMjE0NzlMCitMMjM5NzI2NTVMCitMMjI1MTQ5NTM4OUwKK0wxNDI5ODYwODc4TAorTDM3MjgxMzU5OTJMCitMNDI0MTQzMjk3M0wKK0wzNjk4Mjc1MDc2TAorTDIxNjQxNjQzMkwKK0w0MDQwMDQ2OTYwTAorTDI0NjA3NzE3NkwKK0w4OTQ2NzU2ODVMCitMMzkzMjI4MjI1OUwKK0wzMDk3MjA1MTAwTAorTDIxMjg4MTg2NTBMCitMMTMxOTAxMDY1NkwKK0wxNjAxOTc0MDA5TAorTDI1NTI5NjA5NTdMCitMMzU1NDAxNjA1NUwKK0w0MjA5Mzk1NjQxTAorTDIwMTMzNDAxMDJMCitMMzM3MDQ0NzgwMUwKK0wyMzA3MjcyMDAyTAorTDE3OTUwOTEzNTRMCitMMjAyMTA5NDAxTAorTDk4ODM0NTA3MEwKK0wyNTE0ODcwNzU4TAorTDExMzI3MjY4NTBMCitMNTgyNzQ2MjI0TAorTDMxMTIzMDU0MjFMCitMMTg0MzAyMDY4M0wKK0wzNjAwMTg5MjIzTAorTDExMDEzNDkxNjVMCitMNDIxMTkwNTg1NUwKK0wyODY2Njc3NTgxTAorTDI4ODE2MjExMzBMCitMNDE2NTMyNDEwOUwKK0w0MjM4NzczMTkxTAorTDM2MzU2NDk1NTBMCitMMjY3MDQ4MTA0NEwKK0wyOTk2MjQ4MjE5TAorTDE2NzY5OTI0ODBMCitMMzQ3MzA2NzA1MEwKK0w0MjA1NzkzNjk5TAorTDQwMTk0OTA4OTdMCitMMTU3OTk5MDQ4MUwKK0wxODk5NjE3OTkwTAorTDExMzYzNDc3MTNMCitMMTgwMjg0MjI2OEwKK0wzNTkxNzUyOTYwTAorTDExOTczMDg3MzlMCitMNDMzNjI5Nzg2TAorTDQwMzIxNDI3OTBMCitMMzE0ODA0MTk3OUwKK0wzMzEyMTM4ODQ1TAorTDM4OTY4NjA0NDlMCitMMzI5ODE4MjU2N0wKK0w5MDc2MDUxNzBMCitMMTY1ODY2NDA2N0wKK0wyNjgyOTgwMzEzTAorTDI1MjM1MjMxNzNMCitMMTIwODcyMjEwM0wKK0wzODA4NTMwMzYzTAorTDEwNzkwMDM5NDZMCitMNDI4MjQwMjg2NEwKK0wyMDQxMDEwMDczTAorTDI2Njc1NTUwNzFMCitMNjg4MDE4MTgwTAorTDE0MDUxMjEwMTJMCitMNDE2Nzk5NDA3NkwKK0wzNTA0Njk1MzM2TAorTDE5MjM5NDQ3NDlMCitMMTE0MzU5ODc5MEwKK0wzOTM2MjY4ODk4TAorTDM2MDYyNDM4NDZMCitMMTAxNzQyMDA4MEwKK0w0MDI2MjExMTY5TAorTDU5NjUyOTc2M0wKK0wxODQ0MjU5NjI0TAorTDI4NDAyMTYyODJMCitMMjY3MzgwNzc1OUwKK0wzNDA3MjAyNTc1TAorTDI3Mzc5NzEwODNMCitMNDA3NTQyMzA2OEwKK0wzNjg0MDU3NDMyTAorTDMxNDY2MjcyNDFMCitMNTk5NjUwNTEzTAorTDY5NzczMTE0TAorTDEyNTcwMzU5MTlMCitMODA3NDg1MjkxTAorTDIzNzYyMzA2ODdMCitMMzAzNjU5MzE0N0wKK0wyNjQyNDExNjU4TAorTDEwNjA4MDA0NEwKK0wyMTk5NjIyNzI5TAorTDI5MTgzNDUxMUwKK0wyNjk3NjExMzYxTAorTDExNjg5NzMzTAorTDYyNTEyMzk1MkwKK0wzMjI2MDIzMDYyTAorTDMyMjk2NjMyNjVMCitMNzUzMDU5NDQ0TAorTDI4NDM2MTAxODlMCitMNjI0TAordHAyCitOdHAzCitiLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9yZV90ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC9yZV90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNWIxMjI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5CkBAIC0wLDAgKzEsNjc0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIG1vZGU6IHB5dGhvbiAtKi0KKworIyBSZSB0ZXN0IHN1aXRlIGFuZCBiZW5jaG1hcmsgc3VpdGUgdjEuNQorCisjIFRoZSAzIHBvc3NpYmxlIG91dGNvbWVzIGZvciBlYWNoIHBhdHRlcm4KK1tTVUNDRUVELCBGQUlMLCBTWU5UQVhfRVJST1JdID0gcmFuZ2UoMykKKworIyBCZW5jaG1hcmsgc3VpdGUgKG5lZWRzIGV4cGFuc2lvbikKKyMKKyMgVGhlIGJlbmNobWFyayBzdWl0ZSBkb2VzIG5vdCB0ZXN0IGNvcnJlY3RuZXNzLCBqdXN0IHNwZWVkLiAgVGhlCisjIGZpcnN0IGVsZW1lbnQgb2YgZWFjaCB0dXBsZSBpcyB0aGUgcmVnZXggcGF0dGVybjsgdGhlIHNlY29uZCBpcyBhCisjIHN0cmluZyB0byBtYXRjaCBpdCBhZ2FpbnN0LiAgVGhlIGJlbmNobWFya2luZyBjb2RlIHdpbGwgZW1iZWQgdGhlCisjIHNlY29uZCBzdHJpbmcgaW5zaWRlIHNldmVyYWwgc2l6ZXMgb2YgcGFkZGluZywgdG8gdGVzdCBob3cgcmVnZXgKKyMgbWF0Y2hpbmcgcGVyZm9ybXMgb24gbGFyZ2Ugc3RyaW5ncy4KKworYmVuY2htYXJrcyA9IFsKKworICAgICMgdGVzdCBjb21tb24gcHJlZml4CisgICAgKCdQeXRob258UGVybCcsICdQZXJsJyksICAgICMgQWx0ZXJuYXRpb24KKyAgICAoJyhQeXRob258UGVybCknLCAnUGVybCcpLCAgIyBHcm91cGVkIGFsdGVybmF0aW9uCisKKyAgICAoJ1B5dGhvbnxQZXJsfFRjbCcsICdQZXJsJyksICAgICAgICAjIEFsdGVybmF0aW9uCisgICAgKCcoUHl0aG9ufFBlcmx8VGNsKScsICdQZXJsJyksICAgICAgIyBHcm91cGVkIGFsdGVybmF0aW9uCisKKyAgICAoJyhQeXRob24pXFwxJywgJ1B5dGhvblB5dGhvbicpLCAgICAjIEJhY2tyZWZlcmVuY2UKKyAgICAoJyhbMGEtel1bYS16MC05XSosKSsnLCAnYTUsYjcsYzksJyksICMgRGlzYWJsZSB0aGUgZmFzdG1hcCBvcHRpbWl6YXRpb24KKyAgICAoJyhbYS16XVthLXowLTldKiwpKycsICdhNSxiNyxjOSwnKSwgIyBBIGZldyBzZXRzCisKKyAgICAoJ1B5dGhvbicsICdQeXRob24nKSwgICAgICAgICAgICAgICAjIFNpbXBsZSB0ZXh0IGxpdGVyYWwKKyAgICAoJy4qUHl0aG9uJywgJ1B5dGhvbicpLCAgICAgICAgICAgICAjIEJhZCB0ZXh0IGxpdGVyYWwKKyAgICAoJy4qUHl0aG9uLionLCAnUHl0aG9uJyksICAgICAgICAgICAjIFdvcnNlIHRleHQgbGl0ZXJhbAorICAgICgnLiooUHl0aG9uKScsICdQeXRob24nKSwgICAgICAgICAgICMgQmFkIHRleHQgbGl0ZXJhbCB3aXRoIGdyb3VwaW5nCisKK10KKworIyBUZXN0IHN1aXRlIChmb3IgdmVyaWZ5aW5nIGNvcnJlY3RuZXNzKQorIworIyBUaGUgdGVzdCBzdWl0ZSBpcyBhIGxpc3Qgb2YgNS0gb3IgMy10dXBsZXMuICBUaGUgNSBwYXJ0cyBvZiBhCisjIGNvbXBsZXRlIHR1cGxlIGFyZToKKyMgZWxlbWVudCAwOiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBwYXR0ZXJuCisjICAgICAgICAgMTogdGhlIHN0cmluZyB0byBtYXRjaCBhZ2FpbnN0IHRoZSBwYXR0ZXJuCisjICAgICAgICAgMjogdGhlIGV4cGVjdGVkIHJlc3VsdCAoU1VDQ0VFRCwgRkFJTCwgU1lOVEFYX0VSUk9SKQorIyAgICAgICAgIDM6IGEgc3RyaW5nIHRoYXQgd2lsbCBiZSBldmFsKCknZWQgdG8gcHJvZHVjZSBhIHRlc3Qgc3RyaW5nLgorIyAgICAgICAgICAgIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IFB5dGhvbiBleHByZXNzaW9uOyB0aGUgYXZhaWxhYmxlCisjICAgICAgICAgICAgdmFyaWFibGVzIGFyZSAiZm91bmQiICh0aGUgd2hvbGUgbWF0Y2gpLCBhbmQgImcxIiwgImcyIiwgLi4uCisjICAgICAgICAgICAgdXAgdG8gImc5OSIgY29udGFpbiB0aGUgY29udGVudHMgb2YgZWFjaCBncm91cCwgb3IgdGhlCisjICAgICAgICAgICAgc3RyaW5nICdOb25lJyBpZiB0aGUgZ3JvdXAgd2Fzbid0IGdpdmVuIGEgdmFsdWUsIG9yIHRoZQorIyAgICAgICAgICAgIHN0cmluZyAnRXJyb3InIGlmIHRoZSBncm91cCBpbmRleCB3YXMgb3V0IG9mIHJhbmdlOworIyAgICAgICAgICAgIGFsc28gImdyb3VwcyIsIHRoZSByZXR1cm4gdmFsdWUgb2YgbS5ncm91cCgpIChhIHR1cGxlKS4KKyMgICAgICAgICA0OiBUaGUgZXhwZWN0ZWQgcmVzdWx0IG9mIGV2YWx1YXRpbmcgdGhlIGV4cHJlc3Npb24uCisjICAgICAgICAgICAgSWYgdGhlIHR3byBkb24ndCBtYXRjaCwgYW4gZXJyb3IgaXMgcmVwb3J0ZWQuCisjCisjIElmIHRoZSByZWdleCBpc24ndCBleHBlY3RlZCB0byB3b3JrLCB0aGUgbGF0dGVyIHR3byBlbGVtZW50cyBjYW4gYmUgb21pdHRlZC4KKwordGVzdHMgPSBbCisgICAgIyBUZXN0ID9QPCBhbmQgP1A9IGV4dGVuc2lvbnMKKyAgICAoJyg/UDxmb29fMTIzJywgJycsIFNZTlRBWF9FUlJPUiksICAgICAgIyBVbnRlcm1pbmF0ZWQgZ3JvdXAgaWRlbnRpZmllcgorICAgICgnKD9QPDE+YSknLCAnJywgU1lOVEFYX0VSUk9SKSwgICAgICAgICAjIEJlZ2lucyB3aXRoIGEgZGlnaXQKKyAgICAoJyg/UDwhPmEpJywgJycsIFNZTlRBWF9FUlJPUiksICAgICAgICAgIyBCZWdpbnMgd2l0aCBhbiBpbGxlZ2FsIGNoYXIKKyAgICAoJyg/UDxmb28hPmEpJywgJycsIFNZTlRBWF9FUlJPUiksICAgICAgIyBCZWdpbnMgd2l0aCBhbiBpbGxlZ2FsIGNoYXIKKworICAgICMgU2FtZSB0ZXN0cywgZm9yIHRoZSA/UD0gZm9ybQorICAgICgnKD9QPGZvb18xMjM+YSkoP1A9Zm9vXzEyMycsICdhYScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP1A8Zm9vXzEyMz5hKSg/UD0xKScsICdhYScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP1A8Zm9vXzEyMz5hKSg/UD0hKScsICdhYScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP1A8Zm9vXzEyMz5hKSg/UD1mb29fMTI0JywgJ2FhJywgU1lOVEFYX0VSUk9SKSwgICMgQmFja3JlZiB0byB1bmRlZmluZWQgZ3JvdXAKKworICAgICgnKD9QPGZvb18xMjM+YSknLCAnYScsIFNVQ0NFRUQsICdnMScsICdhJyksCisgICAgKCcoP1A8Zm9vXzEyMz5hKSg/UD1mb29fMTIzKScsICdhYScsIFNVQ0NFRUQsICdnMScsICdhJyksCisKKyAgICAjIFRlc3Qgb2N0YWwgZXNjYXBlcworICAgICgnXFwxJywgJ2EnLCBTWU5UQVhfRVJST1IpLCAgICAjIEJhY2tyZWZlcmVuY2UKKyAgICAoJ1tcXDFdJywgJ1wxJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ1wxJyksICAjIENoYXJhY3RlcgorICAgICgnXFwwOScsIGNocigwKSArICc5JywgU1VDQ0VFRCwgJ2ZvdW5kJywgY2hyKDApICsgJzknKSwKKyAgICAoJ1xcMTQxJywgJ2EnLCBTVUNDRUVELCAnZm91bmQnLCAnYScpLAorICAgICgnKGEpKGIpKGMpKGQpKGUpKGYpKGcpKGgpKGkpKGopKGspKGwpXFwxMTknLCAnYWJjZGVmZ2hpamtsazknLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxMScsICdhYmNkZWZnaGlqa2xrOS1rJyksCisKKyAgICAjIFRlc3QgXDAgaXMgaGFuZGxlZCBldmVyeXdoZXJlCisgICAgKHInXDAnLCAnXDAnLCBTVUNDRUVELCAnZm91bmQnLCAnXDAnKSwKKyAgICAocidbXDBhXScsICdcMCcsIFNVQ0NFRUQsICdmb3VuZCcsICdcMCcpLAorICAgIChyJ1thXDBdJywgJ1wwJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ1wwJyksCisgICAgKHInW15hXDBdJywgJ1wwJywgRkFJTCksCisKKyAgICAjIFRlc3QgdmFyaW91cyBsZXR0ZXIgZXNjYXBlcworICAgIChyJ1xhW1xiXVxmXG5cclx0XHYnLCAnXGFcYlxmXG5cclx0XHYnLCBTVUNDRUVELCAnZm91bmQnLCAnXGFcYlxmXG5cclx0XHYnKSwKKyAgICAocidbXGFdW1xiXVtcZl1bXG5dW1xyXVtcdF1bXHZdJywgJ1xhXGJcZlxuXHJcdFx2JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ1xhXGJcZlxuXHJcdFx2JyksCisgICAgIyBOT1RFOiBub3QgYW4gZXJyb3IgdW5kZXIgUENSRS9QUkU6CisgICAgIyAocidcdScsICcnLCBTWU5UQVhfRVJST1IpLCAgICAjIEEgUGVybCBlc2NhcGUKKyAgICAocidcY1xlXGdcaFxpXGpca1xtXG9ccFxxXHlceicsICdjZWdoaWprbW9wcXl6JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2NlZ2hpamttb3BxeXonKSwKKyAgICAocidceGZmJywgJ1wzNzcnLCBTVUNDRUVELCAnZm91bmQnLCBjaHIoMjU1KSksCisgICAgIyBuZXcgXHggc2VtYW50aWNzCisgICAgKHInXHgwMGZmZmZmZmZmZmZmZmZmJywgJ1wzNzcnLCBGQUlMLCAnZm91bmQnLCBjaHIoMjU1KSksCisgICAgKHInXHgwMGYnLCAnXDAxNycsIEZBSUwsICdmb3VuZCcsIGNocigxNSkpLAorICAgIChyJ1x4MDBmZScsICdcMzc2JywgRkFJTCwgJ2ZvdW5kJywgY2hyKDI1NCkpLAorICAgICMgKHInXHgwMGZmZmZmZmZmZmZmZmZmJywgJ1wzNzcnLCBTVUNDRUVELCAnZm91bmQnLCBjaHIoMjU1KSksCisgICAgIyAocidceDAwZicsICdcMDE3JywgU1VDQ0VFRCwgJ2ZvdW5kJywgY2hyKDE1KSksCisgICAgIyAocidceDAwZmUnLCAnXDM3NicsIFNVQ0NFRUQsICdmb3VuZCcsIGNocigyNTQpKSwKKworICAgIChyIl5cdys9KFxcW1wwMDAtXDI3N118W15cblxcXSkqIiwgIlNSQz1ldmFsLmMgZy5jIGJsYWggYmxhaCBibGFoIFxcXFxcblx0YXBlcy5jIiwKKyAgICAgU1VDQ0VFRCwgJ2ZvdW5kJywgIlNSQz1ldmFsLmMgZy5jIGJsYWggYmxhaCBibGFoIFxcXFwiKSwKKworICAgICMgVGVzdCB0aGF0IC4gb25seSBtYXRjaGVzIFxuIGluIERPVEFMTCBtb2RlCisgICAgKCdhLmInLCAnYWNiJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FjYicpLAorICAgICgnYS5iJywgJ2FcbmInLCBGQUlMKSwKKyAgICAoJ2EuKmInLCAnYWNjXG5jY2InLCBGQUlMKSwKKyAgICAoJ2EuezQsNX1iJywgJ2FjY1xuY2NiJywgRkFJTCksCisgICAgKCdhLmInLCAnYVxyYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhXHJiJyksCisgICAgKCdhLmIoP3MpJywgJ2FcbmInLCBTVUNDRUVELCAnZm91bmQnLCAnYVxuYicpLAorICAgICgnYS4qKD9zKWInLCAnYWNjXG5jY2InLCBTVUNDRUVELCAnZm91bmQnLCAnYWNjXG5jY2InKSwKKyAgICAoJyg/cylhLns0LDV9YicsICdhY2NcbmNjYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhY2NcbmNjYicpLAorICAgICgnKD9zKWEuYicsICdhXG5iJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FcbmInKSwKKworICAgICgnKScsICcnLCBTWU5UQVhfRVJST1IpLCAgICAgICAgICAgIyBVbm1hdGNoZWQgcmlnaHQgYnJhY2tldAorICAgICgnJywgJycsIFNVQ0NFRUQsICdmb3VuZCcsICcnKSwgICAgIyBFbXB0eSBwYXR0ZXJuCisgICAgKCdhYmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWJjJywgJ3hiYycsIEZBSUwpLAorICAgICgnYWJjJywgJ2F4YycsIEZBSUwpLAorICAgICgnYWJjJywgJ2FieCcsIEZBSUwpLAorICAgICgnYWJjJywgJ3hhYmN5JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWJjJywgJ2FiYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWIqYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYipiYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYipiYycsICdhYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmMnKSwKKyAgICAoJ2FiKmJjJywgJ2FiYmJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJiYmMnKSwKKyAgICAoJ2FiK2JjJywgJ2FiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYycpLAorICAgICgnYWIrYmMnLCAnYWJjJywgRkFJTCksCisgICAgKCdhYitiYycsICdhYnEnLCBGQUlMKSwKKyAgICAoJ2FiK2JjJywgJ2FiYmJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJiYmMnKSwKKyAgICAoJ2FiP2JjJywgJ2FiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYycpLAorICAgICgnYWI/YmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWI/YmMnLCAnYWJiYmJjJywgRkFJTCksCisgICAgKCdhYj9jJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ15hYmMkJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ15hYmMkJywgJ2FiY2MnLCBGQUlMKSwKKyAgICAoJ15hYmMnLCAnYWJjYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ15hYmMkJywgJ2FhYmMnLCBGQUlMKSwKKyAgICAoJ2FiYyQnLCAnYWFiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ14nLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIicsICctJyksCisgICAgKCckJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSInLCAnLScpLAorICAgICgnYS5jJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2EuYycsICdheGMnLCBTVUNDRUVELCAnZm91bmQnLCAnYXhjJyksCisgICAgKCdhLipjJywgJ2F4eXpjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2F4eXpjJyksCisgICAgKCdhLipjJywgJ2F4eXpkJywgRkFJTCksCisgICAgKCdhW2JjXWQnLCAnYWJjJywgRkFJTCksCisgICAgKCdhW2JjXWQnLCAnYWJkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiZCcpLAorICAgICgnYVtiLWRdZScsICdhYmQnLCBGQUlMKSwKKyAgICAoJ2FbYi1kXWUnLCAnYWNlJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FjZScpLAorICAgICgnYVtiLWRdJywgJ2FhYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYycpLAorICAgICgnYVstYl0nLCAnYS0nLCBTVUNDRUVELCAnZm91bmQnLCAnYS0nKSwKKyAgICAoJ2FbXFwtYl0nLCAnYS0nLCBTVUNDRUVELCAnZm91bmQnLCAnYS0nKSwKKyAgICAjIE5PVEU6IG5vdCBhbiBlcnJvciB1bmRlciBQQ1JFL1BSRToKKyAgICAjICgnYVtiLV0nLCAnYS0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYVtdYicsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJ2FbJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYVxcJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYWJjKScsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyhhYmMnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdhXScsICdhXScsIFNVQ0NFRUQsICdmb3VuZCcsICdhXScpLAorICAgICgnYVtdXWInLCAnYV1iJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FdYicpLAorICAgICgnYVtcXV1iJywgJ2FdYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhXWInKSwKKyAgICAoJ2FbXmJjXWQnLCAnYWVkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FlZCcpLAorICAgICgnYVteYmNdZCcsICdhYmQnLCBGQUlMKSwKKyAgICAoJ2FbXi1iXWMnLCAnYWRjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FkYycpLAorICAgICgnYVteLWJdYycsICdhLWMnLCBGQUlMKSwKKyAgICAoJ2FbXl1iXWMnLCAnYV1jJywgRkFJTCksCisgICAgKCdhW15dYl1jJywgJ2FkYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhZGMnKSwKKyAgICAoJ1xcYmFcXGInLCAnYS0nLCBTVUNDRUVELCAnIi0iJywgJy0nKSwKKyAgICAoJ1xcYmFcXGInLCAnLWEnLCBTVUNDRUVELCAnIi0iJywgJy0nKSwKKyAgICAoJ1xcYmFcXGInLCAnLWEtJywgU1VDQ0VFRCwgJyItIicsICctJyksCisgICAgKCdcXGJ5XFxiJywgJ3h5JywgRkFJTCksCisgICAgKCdcXGJ5XFxiJywgJ3l6JywgRkFJTCksCisgICAgKCdcXGJ5XFxiJywgJ3h5eicsIEZBSUwpLAorICAgICgneFxcYicsICd4eXonLCBGQUlMKSwKKyAgICAoJ3hcXEInLCAneHl6JywgU1VDQ0VFRCwgJyItIicsICctJyksCisgICAgKCdcXEJ6JywgJ3h5eicsIFNVQ0NFRUQsICciLSInLCAnLScpLAorICAgICgnelxcQicsICd4eXonLCBGQUlMKSwKKyAgICAoJ1xcQngnLCAneHl6JywgRkFJTCksCisgICAgKCdcXEJhXFxCJywgJ2EtJywgRkFJTCwgJyItIicsICctJyksCisgICAgKCdcXEJhXFxCJywgJy1hJywgRkFJTCwgJyItIicsICctJyksCisgICAgKCdcXEJhXFxCJywgJy1hLScsIEZBSUwsICciLSInLCAnLScpLAorICAgICgnXFxCeVxcQicsICd4eScsIEZBSUwpLAorICAgICgnXFxCeVxcQicsICd5eicsIEZBSUwpLAorICAgICgnXFxCeVxcYicsICd4eScsIFNVQ0NFRUQsICciLSInLCAnLScpLAorICAgICgnXFxieVxcQicsICd5eicsIFNVQ0NFRUQsICciLSInLCAnLScpLAorICAgICgnXFxCeVxcQicsICd4eXonLCBTVUNDRUVELCAnIi0iJywgJy0nKSwKKyAgICAoJ2FifGNkJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnYWJ8Y2QnLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnKCllZicsICdkZWYnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2VmLScpLAorICAgICgnJGInLCAnYicsIEZBSUwpLAorICAgICgnYVxcKGInLCAnYShiJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhKGItRXJyb3InKSwKKyAgICAoJ2FcXCgqYicsICdhYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnYVxcKCpiJywgJ2EoKGInLCBTVUNDRUVELCAnZm91bmQnLCAnYSgoYicpLAorICAgICgnYVxcXFxiJywgJ2FcXGInLCBTVUNDRUVELCAnZm91bmQnLCAnYVxcYicpLAorICAgICgnKChhKSknLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYS1hLWEnKSwKKyAgICAoJyhhKWIoYyknLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWJjLWEtYycpLAorICAgICgnYStiK2MnLCAnYWFiYmFiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJyhhK3xiKSonLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiLWInKSwKKyAgICAoJyhhK3xiKSsnLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiLWInKSwKKyAgICAoJyhhK3xiKT8nLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2EtYScpLAorICAgICgnKSgnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdbXmFiXSonLCAnY2RlJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2NkZScpLAorICAgICgnYWJjJywgJycsIEZBSUwpLAorICAgICgnYSonLCAnJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJycpLAorICAgICgnYXxifGN8ZHxlJywgJ2UnLCBTVUNDRUVELCAnZm91bmQnLCAnZScpLAorICAgICgnKGF8YnxjfGR8ZSlmJywgJ2VmJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdlZi1lJyksCisgICAgKCdhYmNkKmVmZycsICdhYmNkZWZnJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiY2RlZmcnKSwKKyAgICAoJ2FiKicsICd4YWJ5YWJiYnonLCBTVUNDRUVELCAnZm91bmQnLCAnYWInKSwKKyAgICAoJ2FiKicsICd4YXlhYmJieicsIFNVQ0NFRUQsICdmb3VuZCcsICdhJyksCisgICAgKCcoYWJ8Y2QpZScsICdhYmNkZScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnY2RlLWNkJyksCisgICAgKCdbYWJoZ2VmZGNdaWonLCAnaGlqJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2hpaicpLAorICAgICgnXihhYnxjZCllJywgJ2FiY2RlJywgRkFJTCwgJ3hnMXknLCAneHknKSwKKyAgICAoJyhhYmN8KWVmJywgJ2FiY2RlZicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnZWYtJyksCisgICAgKCcoYXxiKWMqZCcsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdiY2QtYicpLAorICAgICgnKGFifGFiKiliYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiYy1hJyksCisgICAgKCdhKFtiY10qKWMqJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjLWJjJyksCisgICAgKCdhKFtiY10qKShjKmQpJywgJ2FiY2QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmNkLWJjLWQnKSwKKyAgICAoJ2EoW2JjXSspKGMqZCknLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiY2QtYmMtZCcpLAorICAgICgnYShbYmNdKikoYytkKScsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWJjZC1iLWNkJyksCisgICAgKCdhW2JjZF0qZGNkY2RlJywgJ2FkY2RjZGUnLCBTVUNDRUVELCAnZm91bmQnLCAnYWRjZGNkZScpLAorICAgICgnYVtiY2RdK2RjZGNkZScsICdhZGNkY2RlJywgRkFJTCksCisgICAgKCcoYWJ8YSliKmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmMtYWInKSwKKyAgICAoJygoYSkoYiljKShkKScsICdhYmNkJywgU1VDQ0VFRCwgJ2cxKyItIitnMisiLSIrZzMrIi0iK2c0JywgJ2FiYy1hLWItZCcpLAorICAgICgnW2EtekEtWl9dW2EtekEtWjAtOV9dKicsICdhbHBoYScsIFNVQ0NFRUQsICdmb3VuZCcsICdhbHBoYScpLAorICAgICgnXmEoYmMrfGJbZWhdKWd8LmgkJywgJ2FiaCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYmgtTm9uZScpLAorICAgICgnKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdlZmZneicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2VmZmd6LWVmZmd6LU5vbmUnKSwKKyAgICAoJyhiYytkJHxlZipnLnxoP2koanxrKSknLCAnaWonLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdpai1pai1qJyksCisgICAgKCcoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ2VmZmcnLCBGQUlMKSwKKyAgICAoJyhiYytkJHxlZipnLnxoP2koanxrKSknLCAnYmNkZCcsIEZBSUwpLAorICAgICgnKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdyZWZmZ3onLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdlZmZnei1lZmZnei1Ob25lJyksCisgICAgKCcoKCgoKCgoKChhKSkpKSkpKSkpJywgJ2EnLCBTVUNDRUVELCAnZm91bmQnLCAnYScpLAorICAgICgnbXVsdGlwbGUgd29yZHMgb2YgdGV4dCcsICd1aC11aCcsIEZBSUwpLAorICAgICgnbXVsdGlwbGUgd29yZHMnLCAnbXVsdGlwbGUgd29yZHMsIHllYWgnLCBTVUNDRUVELCAnZm91bmQnLCAnbXVsdGlwbGUgd29yZHMnKSwKKyAgICAoJyguKiljKC4qKScsICdhYmNkZScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiY2RlLWFiLWRlJyksCisgICAgKCdcXCgoLiopLCAoLiopXFwpJywgJyhhLCBiKScsIFNVQ0NFRUQsICdnMisiLSIrZzEnLCAnYi1hJyksCisgICAgKCdba10nLCAnYWInLCBGQUlMKSwKKyAgICAoJ2FbLV0/YycsICdhYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYycpLAorICAgICgnKGFiYylcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2cxJywgJ2FiYycpLAorICAgICgnKFthLWNdKilcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2cxJywgJ2FiYycpLAorICAgICgnXiguKyk/QicsICdBQicsIFNVQ0NFRUQsICdnMScsICdBJyksCisgICAgKCcoYSspLlxcMSQnLCAnYWFhYWEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FhYWFhLWFhJyksCisgICAgKCdeKGErKS5cXDEkJywgJ2FhYWEnLCBGQUlMKSwKKyAgICAoJyhhYmMpXFwxJywgJ2FiY2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjYWJjLWFiYycpLAorICAgICgnKFthLWNdKylcXDEnLCAnYWJjYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmNhYmMtYWJjJyksCisgICAgKCcoYSlcXDEnLCAnYWEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FhLWEnKSwKKyAgICAoJyhhKylcXDEnLCAnYWEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FhLWEnKSwKKyAgICAoJyhhKykrXFwxJywgJ2FhJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYS1hJyksCisgICAgKCcoYSkuK1xcMScsICdhYmEnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiYS1hJyksCisgICAgKCcoYSliYSpcXDEnLCAnYWJhJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmEtYScpLAorICAgICgnKGFhfGEpYVxcMSQnLCAnYWFhJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYWEtYScpLAorICAgICgnKGF8YWEpYVxcMSQnLCAnYWFhJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYWEtYScpLAorICAgICgnKGErKWFcXDEkJywgJ2FhYScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWFhLWEnKSwKKyAgICAoJyhbYWJjXSopXFwxJywgJ2FiY2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjYWJjLWFiYycpLAorICAgICgnKGEpKGIpY3xhYicsICdhYicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiLU5vbmUtTm9uZScpLAorICAgICgnKGEpK3gnLCAnYWFheCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWFheC1hJyksCisgICAgKCcoW2FjXSkreCcsICdhYWN4JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYWN4LWMnKSwKKyAgICAoJyhbXi9dKi8pKnN1YjEvJywgJ2Q6bXNncy90ZGlyL3N1YjEvdHJpYWwvYXdheS5jcHAnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2Q6bXNncy90ZGlyL3N1YjEvLXRkaXIvJyksCisgICAgKCcoW14uXSopXFwuKFteOl0qKTpbVCBdKyguKiknLCAndHJhY2sxLnRpdGxlOlRCbGFoIGJsYWggYmxhaCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyKyItIitnMycsICd0cmFjazEudGl0bGU6VEJsYWggYmxhaCBibGFoLXRyYWNrMS10aXRsZS1CbGFoIGJsYWggYmxhaCcpLAorICAgICgnKFteTl0qTikrJywgJ2FiTk54eXpOJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYk5OeHl6Ti14eXpOJyksCisgICAgKCcoW15OXSpOKSsnLCAnYWJOTnh5eicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJOTi1OJyksCisgICAgKCcoW2FiY10qKXgnLCAnYWJjeCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjeC1hYmMnKSwKKyAgICAoJyhbYWJjXSopeCcsICdhYmMnLCBGQUlMKSwKKyAgICAoJyhbeHl6XSopeCcsICdhYmN4JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICd4LScpLAorICAgICgnKGEpK2J8YWFjJywgJ2FhYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWFjLU5vbmUnKSwKKworICAgICMgVGVzdCBzeW1ib2xpYyBncm91cHMKKworICAgICgnKD9QPGkgZD5hYWEpYScsICdhYWFhJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/UDxpZD5hYWEpYScsICdhYWFhJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitpZCcsICdhYWFhLWFhYScpLAorICAgICgnKD9QPGlkPmFhKSg/UD1pZCknLCAnYWFhYScsIFNVQ0NFRUQsICdmb3VuZCsiLSIraWQnLCAnYWFhYS1hYScpLAorICAgICgnKD9QPGlkPmFhKSg/UD14ZCknLCAnYWFhYScsIFNZTlRBWF9FUlJPUiksCisKKyAgICAjIFRlc3Qgb2N0YWwgZXNjYXBlcy9tZW1vcnkgcmVmZXJlbmNlcworCisgICAgKCdcXDEnLCAnYScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdcXDA5JywgY2hyKDApICsgJzknLCBTVUNDRUVELCAnZm91bmQnLCBjaHIoMCkgKyAnOScpLAorICAgICgnXFwxNDEnLCAnYScsIFNVQ0NFRUQsICdmb3VuZCcsICdhJyksCisgICAgKCcoYSkoYikoYykoZCkoZSkoZikoZykoaCkoaSkoaikoaykobClcXDExOScsICdhYmNkZWZnaGlqa2xrOScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzExJywgJ2FiY2RlZmdoaWprbGs5LWsnKSwKKworICAgICMgQWxsIHRlc3RzIGZyb20gUGVybAorCisgICAgKCdhYmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWJjJywgJ3hiYycsIEZBSUwpLAorICAgICgnYWJjJywgJ2F4YycsIEZBSUwpLAorICAgICgnYWJjJywgJ2FieCcsIEZBSUwpLAorICAgICgnYWJjJywgJ3hhYmN5JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWJjJywgJ2FiYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWIqYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYipiYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYipiYycsICdhYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmMnKSwKKyAgICAoJ2FiKmJjJywgJ2FiYmJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJiYmMnKSwKKyAgICAoJ2FiezAsfWJjJywgJ2FiYmJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJiYmMnKSwKKyAgICAoJ2FiK2JjJywgJ2FiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYycpLAorICAgICgnYWIrYmMnLCAnYWJjJywgRkFJTCksCisgICAgKCdhYitiYycsICdhYnEnLCBGQUlMKSwKKyAgICAoJ2FiezEsfWJjJywgJ2FicScsIEZBSUwpLAorICAgICgnYWIrYmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmJiYycpLAorICAgICgnYWJ7MSx9YmMnLCAnYWJiYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmJiYycpLAorICAgICgnYWJ7MSwzfWJjJywgJ2FiYmJiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmJiYmMnKSwKKyAgICAoJ2FiezMsNH1iYycsICdhYmJiYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJiYmJjJyksCisgICAgKCdhYns0LDV9YmMnLCAnYWJiYmJjJywgRkFJTCksCisgICAgKCdhYj9iYycsICdhYmJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYmMnKSwKKyAgICAoJ2FiP2JjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2FiezAsMX1iYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhYj9iYycsICdhYmJiYmMnLCBGQUlMKSwKKyAgICAoJ2FiP2MnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYWJ7MCwxfWMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXmFiYyQnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXmFiYyQnLCAnYWJjYycsIEZBSUwpLAorICAgICgnXmFiYycsICdhYmNjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXmFiYyQnLCAnYWFiYycsIEZBSUwpLAorICAgICgnYWJjJCcsICdhYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnXicsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnJyksCisgICAgKCckJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICcnKSwKKyAgICAoJ2EuYycsICdhYmMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdhLmMnLCAnYXhjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2F4YycpLAorICAgICgnYS4qYycsICdheHl6YycsIFNVQ0NFRUQsICdmb3VuZCcsICdheHl6YycpLAorICAgICgnYS4qYycsICdheHl6ZCcsIEZBSUwpLAorICAgICgnYVtiY11kJywgJ2FiYycsIEZBSUwpLAorICAgICgnYVtiY11kJywgJ2FiZCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmQnKSwKKyAgICAoJ2FbYi1kXWUnLCAnYWJkJywgRkFJTCksCisgICAgKCdhW2ItZF1lJywgJ2FjZScsIFNVQ0NFRUQsICdmb3VuZCcsICdhY2UnKSwKKyAgICAoJ2FbYi1kXScsICdhYWMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWMnKSwKKyAgICAoJ2FbLWJdJywgJ2EtJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EtJyksCisgICAgKCdhW2ItXScsICdhLScsIFNVQ0NFRUQsICdmb3VuZCcsICdhLScpLAorICAgICgnYVtiLWFdJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYVtdYicsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJ2FbJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYV0nLCAnYV0nLCBTVUNDRUVELCAnZm91bmQnLCAnYV0nKSwKKyAgICAoJ2FbXV1iJywgJ2FdYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhXWInKSwKKyAgICAoJ2FbXmJjXWQnLCAnYWVkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FlZCcpLAorICAgICgnYVteYmNdZCcsICdhYmQnLCBGQUlMKSwKKyAgICAoJ2FbXi1iXWMnLCAnYWRjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FkYycpLAorICAgICgnYVteLWJdYycsICdhLWMnLCBGQUlMKSwKKyAgICAoJ2FbXl1iXWMnLCAnYV1jJywgRkFJTCksCisgICAgKCdhW15dYl1jJywgJ2FkYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhZGMnKSwKKyAgICAoJ2FifGNkJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnYWJ8Y2QnLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnKCllZicsICdkZWYnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2VmLScpLAorICAgICgnKmEnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoKiliJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnJGInLCAnYicsIEZBSUwpLAorICAgICgnYVxcJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnYVxcKGInLCAnYShiJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhKGItRXJyb3InKSwKKyAgICAoJ2FcXCgqYicsICdhYicsIFNVQ0NFRUQsICdmb3VuZCcsICdhYicpLAorICAgICgnYVxcKCpiJywgJ2EoKGInLCBTVUNDRUVELCAnZm91bmQnLCAnYSgoYicpLAorICAgICgnYVxcXFxiJywgJ2FcXGInLCBTVUNDRUVELCAnZm91bmQnLCAnYVxcYicpLAorICAgICgnYWJjKScsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyhhYmMnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoKGEpKScsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhLWEtYScpLAorICAgICgnKGEpYihjKScsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmMtYS1jJyksCisgICAgKCdhK2IrYycsICdhYWJiYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorICAgICgnYXsxLH1iezEsfWMnLCAnYWFiYmFiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJ2EqKicsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJ2EuKz9jJywgJ2FiY2FiYycsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKyAgICAoJyhhK3xiKSonLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiLWInKSwKKyAgICAoJyhhK3xiKXswLH0nLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiLWInKSwKKyAgICAoJyhhK3xiKSsnLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiLWInKSwKKyAgICAoJyhhK3xiKXsxLH0nLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiLWInKSwKKyAgICAoJyhhK3xiKT8nLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2EtYScpLAorICAgICgnKGErfGIpezAsMX0nLCAnYWInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2EtYScpLAorICAgICgnKSgnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCdbXmFiXSonLCAnY2RlJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2NkZScpLAorICAgICgnYWJjJywgJycsIEZBSUwpLAorICAgICgnYSonLCAnJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJycpLAorICAgICgnKFthYmNdKSpkJywgJ2FiYmJjZCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJiYmNkLWMnKSwKKyAgICAoJyhbYWJjXSkqYmNkJywgJ2FiY2QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiY2QtYScpLAorICAgICgnYXxifGN8ZHxlJywgJ2UnLCBTVUNDRUVELCAnZm91bmQnLCAnZScpLAorICAgICgnKGF8YnxjfGR8ZSlmJywgJ2VmJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdlZi1lJyksCisgICAgKCdhYmNkKmVmZycsICdhYmNkZWZnJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiY2RlZmcnKSwKKyAgICAoJ2FiKicsICd4YWJ5YWJiYnonLCBTVUNDRUVELCAnZm91bmQnLCAnYWInKSwKKyAgICAoJ2FiKicsICd4YXlhYmJieicsIFNVQ0NFRUQsICdmb3VuZCcsICdhJyksCisgICAgKCcoYWJ8Y2QpZScsICdhYmNkZScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnY2RlLWNkJyksCisgICAgKCdbYWJoZ2VmZGNdaWonLCAnaGlqJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2hpaicpLAorICAgICgnXihhYnxjZCllJywgJ2FiY2RlJywgRkFJTCksCisgICAgKCcoYWJjfCllZicsICdhYmNkZWYnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2VmLScpLAorICAgICgnKGF8YiljKmQnLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYmNkLWInKSwKKyAgICAoJyhhYnxhYiopYmMnLCAnYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdhYmMtYScpLAorICAgICgnYShbYmNdKiljKicsICdhYmMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2FiYy1iYycpLAorICAgICgnYShbYmNdKikoYypkKScsICdhYmNkJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnYWJjZC1iYy1kJyksCisgICAgKCdhKFtiY10rKShjKmQpJywgJ2FiY2QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmNkLWJjLWQnKSwKKyAgICAoJ2EoW2JjXSopKGMrZCknLCAnYWJjZCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ2FiY2QtYi1jZCcpLAorICAgICgnYVtiY2RdKmRjZGNkZScsICdhZGNkY2RlJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FkY2RjZGUnKSwKKyAgICAoJ2FbYmNkXStkY2RjZGUnLCAnYWRjZGNkZScsIEZBSUwpLAorICAgICgnKGFifGEpYipjJywgJ2FiYycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnYWJjLWFiJyksCisgICAgKCcoKGEpKGIpYykoZCknLCAnYWJjZCcsIFNVQ0NFRUQsICdnMSsiLSIrZzIrIi0iK2czKyItIitnNCcsICdhYmMtYS1iLWQnKSwKKyAgICAoJ1thLXpBLVpfXVthLXpBLVowLTlfXSonLCAnYWxwaGEnLCBTVUNDRUVELCAnZm91bmQnLCAnYWxwaGEnKSwKKyAgICAoJ15hKGJjK3xiW2VoXSlnfC5oJCcsICdhYmgnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ2JoLU5vbmUnKSwKKyAgICAoJyhiYytkJHxlZipnLnxoP2koanxrKSknLCAnZWZmZ3onLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdlZmZnei1lZmZnei1Ob25lJyksCisgICAgKCcoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ2lqJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnaWotaWotaicpLAorICAgICgnKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdlZmZnJywgRkFJTCksCisgICAgKCcoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ2JjZGQnLCBGQUlMKSwKKyAgICAoJyhiYytkJHxlZipnLnxoP2koanxrKSknLCAncmVmZmd6JywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnZWZmZ3otZWZmZ3otTm9uZScpLAorICAgICgnKCgoKCgoKCgoKGEpKSkpKSkpKSkpJywgJ2EnLCBTVUNDRUVELCAnZzEwJywgJ2EnKSwKKyAgICAoJygoKCgoKCgoKChhKSkpKSkpKSkpKVxcMTAnLCAnYWEnLCBTVUNDRUVELCAnZm91bmQnLCAnYWEnKSwKKyMgUHl0aG9uIGRvZXMgbm90IGhhdmUgdGhlIHNhbWUgcnVsZXMgZm9yIFxcNDEgc28gdGhpcyBpcyBhIHN5bnRheCBlcnJvcgorIyAgICAoJygoKCgoKCgoKChhKSkpKSkpKSkpKVxcNDEnLCAnYWEnLCBGQUlMKSwKKyMgICAgKCcoKCgoKCgoKCgoYSkpKSkpKSkpKSlcXDQxJywgJ2EhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EhJyksCisgICAgKCcoKCgoKCgoKCgoYSkpKSkpKSkpKSlcXDQxJywgJycsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpKCgoKCgoKCgoKGEpKSkpKSkpKSkpXFw0MScsICcnLCBTWU5UQVhfRVJST1IpLAorICAgICgnKCgoKCgoKCgoYSkpKSkpKSkpKScsICdhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EnKSwKKyAgICAoJ211bHRpcGxlIHdvcmRzIG9mIHRleHQnLCAndWgtdWgnLCBGQUlMKSwKKyAgICAoJ211bHRpcGxlIHdvcmRzJywgJ211bHRpcGxlIHdvcmRzLCB5ZWFoJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ211bHRpcGxlIHdvcmRzJyksCisgICAgKCcoLiopYyguKiknLCAnYWJjZGUnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdhYmNkZS1hYi1kZScpLAorICAgICgnXFwoKC4qKSwgKC4qKVxcKScsICcoYSwgYiknLCBTVUNDRUVELCAnZzIrIi0iK2cxJywgJ2ItYScpLAorICAgICgnW2tdJywgJ2FiJywgRkFJTCksCisgICAgKCdhWy1dP2MnLCAnYWMnLCBTVUNDRUVELCAnZm91bmQnLCAnYWMnKSwKKyAgICAoJyhhYmMpXFwxJywgJ2FiY2FiYycsIFNVQ0NFRUQsICdnMScsICdhYmMnKSwKKyAgICAoJyhbYS1jXSopXFwxJywgJ2FiY2FiYycsIFNVQ0NFRUQsICdnMScsICdhYmMnKSwKKyAgICAoJyg/aSlhYmMnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWFiYycsICdYQkMnLCBGQUlMKSwKKyAgICAoJyg/aSlhYmMnLCAnQVhDJywgRkFJTCksCisgICAgKCcoP2kpYWJjJywgJ0FCWCcsIEZBSUwpLAorICAgICgnKD9pKWFiYycsICdYQUJDWScsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhYmMnLCAnQUJBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYWIqYycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYWIqYmMnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWFiKmJjJywgJ0FCQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJCQycpLAorICAgICgnKD9pKWFiKj9iYycsICdBQkJCQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJCQkJDJyksCisgICAgKCcoP2kpYWJ7MCx9P2JjJywgJ0FCQkJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJCQkMnKSwKKyAgICAoJyg/aSlhYis/YmMnLCAnQUJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJDJyksCisgICAgKCcoP2kpYWIrYmMnLCAnQUJDJywgRkFJTCksCisgICAgKCcoP2kpYWIrYmMnLCAnQUJRJywgRkFJTCksCisgICAgKCcoP2kpYWJ7MSx9YmMnLCAnQUJRJywgRkFJTCksCisgICAgKCcoP2kpYWIrYmMnLCAnQUJCQkJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQkJCQycpLAorICAgICgnKD9pKWFiezEsfT9iYycsICdBQkJCQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJCQkJDJyksCisgICAgKCcoP2kpYWJ7MSwzfT9iYycsICdBQkJCQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJCQkJDJyksCisgICAgKCcoP2kpYWJ7Myw0fT9iYycsICdBQkJCQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJCQkJDJyksCisgICAgKCcoP2kpYWJ7NCw1fT9iYycsICdBQkJCQkMnLCBGQUlMKSwKKyAgICAoJyg/aSlhYj8/YmMnLCAnQUJCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkJDJyksCisgICAgKCcoP2kpYWI/P2JjJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhYnswLDF9P2JjJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhYj8/YmMnLCAnQUJCQkJDJywgRkFJTCksCisgICAgKCcoP2kpYWI/P2MnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWFiezAsMX0/YycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpXmFiYyQnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKV5hYmMkJywgJ0FCQ0MnLCBGQUlMKSwKKyAgICAoJyg/aSleYWJjJywgJ0FCQ0MnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpXmFiYyQnLCAnQUFCQycsIEZBSUwpLAorICAgICgnKD9pKWFiYyQnLCAnQUFCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSleJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICcnKSwKKyAgICAoJyg/aSkkJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICcnKSwKKyAgICAoJyg/aSlhLmMnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWEuYycsICdBWEMnLCBTVUNDRUVELCAnZm91bmQnLCAnQVhDJyksCisgICAgKCcoP2kpYS4qP2MnLCAnQVhZWkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQVhZWkMnKSwKKyAgICAoJyg/aSlhLipjJywgJ0FYWVpEJywgRkFJTCksCisgICAgKCcoP2kpYVtiY11kJywgJ0FCQycsIEZBSUwpLAorICAgICgnKD9pKWFbYmNdZCcsICdBQkQnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJEJyksCisgICAgKCcoP2kpYVtiLWRdZScsICdBQkQnLCBGQUlMKSwKKyAgICAoJyg/aSlhW2ItZF1lJywgJ0FDRScsIFNVQ0NFRUQsICdmb3VuZCcsICdBQ0UnKSwKKyAgICAoJyg/aSlhW2ItZF0nLCAnQUFDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FDJyksCisgICAgKCcoP2kpYVstYl0nLCAnQS0nLCBTVUNDRUVELCAnZm91bmQnLCAnQS0nKSwKKyAgICAoJyg/aSlhW2ItXScsICdBLScsIFNVQ0NFRUQsICdmb3VuZCcsICdBLScpLAorICAgICgnKD9pKWFbYi1hXScsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/aSlhW11iJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKWFbJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKWFdJywgJ0FdJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FdJyksCisgICAgKCcoP2kpYVtdXWInLCAnQV1CJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FdQicpLAorICAgICgnKD9pKWFbXmJjXWQnLCAnQUVEJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FFRCcpLAorICAgICgnKD9pKWFbXmJjXWQnLCAnQUJEJywgRkFJTCksCisgICAgKCcoP2kpYVteLWJdYycsICdBREMnLCBTVUNDRUVELCAnZm91bmQnLCAnQURDJyksCisgICAgKCcoP2kpYVteLWJdYycsICdBLUMnLCBGQUlMKSwKKyAgICAoJyg/aSlhW15dYl1jJywgJ0FdQycsIEZBSUwpLAorICAgICgnKD9pKWFbXl1iXWMnLCAnQURDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FEQycpLAorICAgICgnKD9pKWFifGNkJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQicpLAorICAgICgnKD9pKWFifGNkJywgJ0FCQ0QnLCBTVUNDRUVELCAnZm91bmQnLCAnQUInKSwKKyAgICAoJyg/aSkoKWVmJywgJ0RFRicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnRUYtJyksCisgICAgKCcoP2kpKmEnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpKCopYicsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/aSkkYicsICdCJywgRkFJTCksCisgICAgKCcoP2kpYVxcJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKWFcXChiJywgJ0EoQicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQShCLUVycm9yJyksCisgICAgKCcoP2kpYVxcKCpiJywgJ0FCJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCJyksCisgICAgKCcoP2kpYVxcKCpiJywgJ0EoKEInLCBTVUNDRUVELCAnZm91bmQnLCAnQSgoQicpLAorICAgICgnKD9pKWFcXFxcYicsICdBXFxCJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FcXEInKSwKKyAgICAoJyg/aSlhYmMpJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKShhYmMnLCAnLScsIFNZTlRBWF9FUlJPUiksCisgICAgKCcoP2kpKChhKSknLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnQS1BLUEnKSwKKyAgICAoJyg/aSkoYSliKGMpJywgJ0FCQycsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ0FCQy1BLUMnKSwKKyAgICAoJyg/aSlhK2IrYycsICdBQUJCQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0FCQycpLAorICAgICgnKD9pKWF7MSx9YnsxLH1jJywgJ0FBQkJBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYSoqJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgICgnKD9pKWEuKz9jJywgJ0FCQ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSlhLio/YycsICdBQkNBQkMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUJDJyksCisgICAgKCcoP2kpYS57MCw1fT9jJywgJ0FCQ0FCQycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkMnKSwKKyAgICAoJyg/aSkoYSt8YikqJywgJ0FCJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBQi1CJyksCisgICAgKCcoP2kpKGErfGIpezAsfScsICdBQicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQUItQicpLAorICAgICgnKD9pKShhK3xiKSsnLCAnQUInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0FCLUInKSwKKyAgICAoJyg/aSkoYSt8Yil7MSx9JywgJ0FCJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBQi1CJyksCisgICAgKCcoP2kpKGErfGIpPycsICdBQicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQS1BJyksCisgICAgKCcoP2kpKGErfGIpezAsMX0nLCAnQUInLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0EtQScpLAorICAgICgnKD9pKShhK3xiKXswLDF9PycsICdBQicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnLU5vbmUnKSwKKyAgICAoJyg/aSkpKCcsICctJywgU1lOVEFYX0VSUk9SKSwKKyAgICAoJyg/aSlbXmFiXSonLCAnQ0RFJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ0NERScpLAorICAgICgnKD9pKWFiYycsICcnLCBGQUlMKSwKKyAgICAoJyg/aSlhKicsICcnLCBTVUNDRUVELCAnZm91bmQnLCAnJyksCisgICAgKCcoP2kpKFthYmNdKSpkJywgJ0FCQkJDRCcsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzEnLCAnQUJCQkNELUMnKSwKKyAgICAoJyg/aSkoW2FiY10pKmJjZCcsICdBQkNEJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBQkNELUEnKSwKKyAgICAoJyg/aSlhfGJ8Y3xkfGUnLCAnRScsIFNVQ0NFRUQsICdmb3VuZCcsICdFJyksCisgICAgKCcoP2kpKGF8YnxjfGR8ZSlmJywgJ0VGJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdFRi1FJyksCisgICAgKCcoP2kpYWJjZCplZmcnLCAnQUJDREVGRycsIFNVQ0NFRUQsICdmb3VuZCcsICdBQkNERUZHJyksCisgICAgKCcoP2kpYWIqJywgJ1hBQllBQkJCWicsIFNVQ0NFRUQsICdmb3VuZCcsICdBQicpLAorICAgICgnKD9pKWFiKicsICdYQVlBQkJCWicsIFNVQ0NFRUQsICdmb3VuZCcsICdBJyksCisgICAgKCcoP2kpKGFifGNkKWUnLCAnQUJDREUnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0NERS1DRCcpLAorICAgICgnKD9pKVthYmhnZWZkY11paicsICdISUonLCBTVUNDRUVELCAnZm91bmQnLCAnSElKJyksCisgICAgKCcoP2kpXihhYnxjZCllJywgJ0FCQ0RFJywgRkFJTCksCisgICAgKCcoP2kpKGFiY3wpZWYnLCAnQUJDREVGJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdFRi0nKSwKKyAgICAoJyg/aSkoYXxiKWMqZCcsICdBQkNEJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdCQ0QtQicpLAorICAgICgnKD9pKShhYnxhYiopYmMnLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBQkMtQScpLAorICAgICgnKD9pKWEoW2JjXSopYyonLCAnQUJDJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdBQkMtQkMnKSwKKyAgICAoJyg/aSlhKFtiY10qKShjKmQpJywgJ0FCQ0QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdBQkNELUJDLUQnKSwKKyAgICAoJyg/aSlhKFtiY10rKShjKmQpJywgJ0FCQ0QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdBQkNELUJDLUQnKSwKKyAgICAoJyg/aSlhKFtiY10qKShjK2QpJywgJ0FCQ0QnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxKyItIitnMicsICdBQkNELUItQ0QnKSwKKyAgICAoJyg/aSlhW2JjZF0qZGNkY2RlJywgJ0FEQ0RDREUnLCBTVUNDRUVELCAnZm91bmQnLCAnQURDRENERScpLAorICAgICgnKD9pKWFbYmNkXStkY2RjZGUnLCAnQURDRENERScsIEZBSUwpLAorICAgICgnKD9pKShhYnxhKWIqYycsICdBQkMnLCBTVUNDRUVELCAnZm91bmQrIi0iK2cxJywgJ0FCQy1BQicpLAorICAgICgnKD9pKSgoYSkoYiljKShkKScsICdBQkNEJywgU1VDQ0VFRCwgJ2cxKyItIitnMisiLSIrZzMrIi0iK2c0JywgJ0FCQy1BLUItRCcpLAorICAgICgnKD9pKVthLXpBLVpfXVthLXpBLVowLTlfXSonLCAnQUxQSEEnLCBTVUNDRUVELCAnZm91bmQnLCAnQUxQSEEnKSwKKyAgICAoJyg/aSleYShiYyt8YltlaF0pZ3wuaCQnLCAnQUJIJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMScsICdCSC1Ob25lJyksCisgICAgKCcoP2kpKGJjK2QkfGVmKmcufGg/aShqfGspKScsICdFRkZHWicsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ0VGRkdaLUVGRkdaLU5vbmUnKSwKKyAgICAoJyg/aSkoYmMrZCR8ZWYqZy58aD9pKGp8aykpJywgJ0lKJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnSUotSUotSicpLAorICAgICgnKD9pKShiYytkJHxlZipnLnxoP2koanxrKSknLCAnRUZGRycsIEZBSUwpLAorICAgICgnKD9pKShiYytkJHxlZipnLnxoP2koanxrKSknLCAnQkNERCcsIEZBSUwpLAorICAgICgnKD9pKShiYytkJHxlZipnLnxoP2koanxrKSknLCAnUkVGRkdaJywgU1VDQ0VFRCwgJ2ZvdW5kKyItIitnMSsiLSIrZzInLCAnRUZGR1otRUZGR1otTm9uZScpLAorICAgICgnKD9pKSgoKCgoKCgoKChhKSkpKSkpKSkpKScsICdBJywgU1VDQ0VFRCwgJ2cxMCcsICdBJyksCisgICAgKCcoP2kpKCgoKCgoKCgoKGEpKSkpKSkpKSkpXFwxMCcsICdBQScsIFNVQ0NFRUQsICdmb3VuZCcsICdBQScpLAorICAgICMoJyg/aSkoKCgoKCgoKCgoYSkpKSkpKSkpKSlcXDQxJywgJ0FBJywgRkFJTCksCisgICAgIygnKD9pKSgoKCgoKCgoKChhKSkpKSkpKSkpKVxcNDEnLCAnQSEnLCBTVUNDRUVELCAnZm91bmQnLCAnQSEnKSwKKyAgICAoJyg/aSkoKCgoKCgoKChhKSkpKSkpKSkpJywgJ0EnLCBTVUNDRUVELCAnZm91bmQnLCAnQScpLAorICAgICgnKD9pKSg/Oig/Oig/Oig/Oig/Oig/Oig/Oig/Oig/OihhKSkpKSkpKSkpKScsICdBJywgU1VDQ0VFRCwgJ2cxJywgJ0EnKSwKKyAgICAoJyg/aSkoPzooPzooPzooPzooPzooPzooPzooPzooPzooYXxifGMpKSkpKSkpKSkpJywgJ0MnLCBTVUNDRUVELCAnZzEnLCAnQycpLAorICAgICgnKD9pKW11bHRpcGxlIHdvcmRzIG9mIHRleHQnLCAnVUgtVUgnLCBGQUlMKSwKKyAgICAoJyg/aSltdWx0aXBsZSB3b3JkcycsICdNVUxUSVBMRSBXT1JEUywgWUVBSCcsIFNVQ0NFRUQsICdmb3VuZCcsICdNVUxUSVBMRSBXT1JEUycpLAorICAgICgnKD9pKSguKiljKC4qKScsICdBQkNERScsIFNVQ0NFRUQsICdmb3VuZCsiLSIrZzErIi0iK2cyJywgJ0FCQ0RFLUFCLURFJyksCisgICAgKCcoP2kpXFwoKC4qKSwgKC4qKVxcKScsICcoQSwgQiknLCBTVUNDRUVELCAnZzIrIi0iK2cxJywgJ0ItQScpLAorICAgICgnKD9pKVtrXScsICdBQicsIEZBSUwpLAorIyAgICAoJyg/aSlhYmNkJywgJ0FCQ0QnLCBTVUNDRUVELCAnZm91bmQrIi0iK1xcZm91bmQrIi0iK1xcXFxmb3VuZCcsICdBQkNELSQmLVxcQUJDRCcpLAorIyAgICAoJyg/aSlhKGJjKWQnLCAnQUJDRCcsIFNVQ0NFRUQsICdnMSsiLSIrXFxnMSsiLSIrXFxcXGcxJywgJ0JDLSQxLVxcQkMnKSwKKyAgICAoJyg/aSlhWy1dP2MnLCAnQUMnLCBTVUNDRUVELCAnZm91bmQnLCAnQUMnKSwKKyAgICAoJyg/aSkoYWJjKVxcMScsICdBQkNBQkMnLCBTVUNDRUVELCAnZzEnLCAnQUJDJyksCisgICAgKCcoP2kpKFthLWNdKilcXDEnLCAnQUJDQUJDJywgU1VDQ0VFRCwgJ2cxJywgJ0FCQycpLAorICAgICgnYSg/IWIpLicsICdhYmFkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FkJyksCisgICAgKCdhKD89ZCkuJywgJ2FiYWQnLCBTVUNDRUVELCAnZm91bmQnLCAnYWQnKSwKKyAgICAoJ2EoPz1jfGQpLicsICdhYmFkJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FkJyksCisgICAgKCdhKD86YnxjfGQpKC4pJywgJ2FjZScsIFNVQ0NFRUQsICdnMScsICdlJyksCisgICAgKCdhKD86YnxjfGQpKiguKScsICdhY2UnLCBTVUNDRUVELCAnZzEnLCAnZScpLAorICAgICgnYSg/OmJ8Y3xkKSs/KC4pJywgJ2FjZScsIFNVQ0NFRUQsICdnMScsICdlJyksCisgICAgKCdhKD86YnwoY3xlKXsxLDJ9P3xkKSs/KC4pJywgJ2FjZScsIFNVQ0NFRUQsICdnMSArIGcyJywgJ2NlJyksCisgICAgKCdeKC4rKT9CJywgJ0FCJywgU1VDQ0VFRCwgJ2cxJywgJ0EnKSwKKworICAgICMgbG9va2JlaGluZDogc3BsaXQgYnkgOiBidXQgbm90IGlmIGl0IGlzIGVzY2FwZWQgYnkgLS4KKyAgICAoJyg/PCEtKTooLio/KSg/PCEtKTonLCAnYTpiYy06ZGU6ZicsIFNVQ0NFRUQsICdnMScsICdiYy06ZGUnICksCisgICAgIyBlc2NhcGluZyB3aXRoIFwgYXMgd2Uga25vdyBpdAorICAgICgnKD88IVxcXCk6KC4qPykoPzwhXFxcKTonLCAnYTpiY1xcOmRlOmYnLCBTVUNDRUVELCAnZzEnLCAnYmNcXDpkZScgKSwKKyAgICAjIHRlcm1pbmF0aW5nIHdpdGggJyBhbmQgZXNjYXBpbmcgd2l0aCA/IGFzIGluIGVkaWZhY3QKKyAgICAoIig/PCFcXD8pJyguKj8pKD88IVxcPyknIiwgImEnYmM/J2RlJ2YiLCBTVUNDRUVELCAnZzEnLCAiYmM/J2RlIiApLAorCisgICAgIyBDb21tZW50cyB1c2luZyB0aGUgKD8jLi4uKSBzeW50YXgKKworICAgICgndyg/IyBjb21tZW50JywgJ3cnLCBTWU5UQVhfRVJST1IpLAorICAgICgndyg/IyBjb21tZW50IDEpeHkoPyMgY29tbWVudCAyKXonLCAnd3h5eicsIFNVQ0NFRUQsICdmb3VuZCcsICd3eHl6JyksCisKKyAgICAjIENoZWNrIG9kZCBwbGFjZW1lbnQgb2YgZW1iZWRkZWQgcGF0dGVybiBtb2RpZmllcnMKKworICAgICMgbm90IGFuIGVycm9yIHVuZGVyIFBDUkUvUFJFOgorICAgICgndyg/aSknLCAnVycsIFNVQ0NFRUQsICdmb3VuZCcsICdXJyksCisgICAgIyAoJ3coP2kpJywgJ1cnLCBTWU5UQVhfRVJST1IpLAorCisgICAgIyBDb21tZW50cyB1c2luZyB0aGUgeCBlbWJlZGRlZCBwYXR0ZXJuIG1vZGlmaWVyCisKKyAgICAoIiIiKD94KXcjIGNvbW1lbnQgMQorICAgICAgICB4IHkKKyAgICAgICAgIyBjb21tZW50IDIKKyAgICAgICAgeiIiIiwgJ3d4eXonLCBTVUNDRUVELCAnZm91bmQnLCAnd3h5eicpLAorCisgICAgIyB1c2luZyB0aGUgbSBlbWJlZGRlZCBwYXR0ZXJuIG1vZGlmaWVyCisKKyAgICAoJ15hYmMnLCAiIiJqa2wKK2FiYworeHl6IiIiLCBGQUlMKSwKKyAgICAoJyg/bSleYWJjJywgIiIiamtsCithYmMKK3h5eiIiIiwgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FiYycpLAorCisgICAgKCcoP20pYWJjJCcsICIiImprbAoreHl6YWJjCisxMjMiIiIsIFNVQ0NFRUQsICdmb3VuZCcsICdhYmMnKSwKKworICAgICMgdXNpbmcgdGhlIHMgZW1iZWRkZWQgcGF0dGVybiBtb2RpZmllcgorCisgICAgKCdhLmInLCAnYVxuYicsIEZBSUwpLAorICAgICgnKD9zKWEuYicsICdhXG5iJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2FcbmInKSwKKworICAgICMgdGVzdCBcdywgZXRjLiBib3RoIGluc2lkZSBhbmQgb3V0c2lkZSBjaGFyYWN0ZXIgY2xhc3NlcworCisgICAgKCdcXHcrJywgJy0tYWJfY2QwMTIzLS0nLCBTVUNDRUVELCAnZm91bmQnLCAnYWJfY2QwMTIzJyksCisgICAgKCdbXFx3XSsnLCAnLS1hYl9jZDAxMjMtLScsIFNVQ0NFRUQsICdmb3VuZCcsICdhYl9jZDAxMjMnKSwKKyAgICAoJ1xcRCsnLCAnMTIzNGFiYzU2NzgnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdbXFxEXSsnLCAnMTIzNGFiYzU2NzgnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJjJyksCisgICAgKCdbXFxkYS1mQS1GXSsnLCAnMTIzYWJjJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJzEyM2FiYycpLAorICAgICMgbm90IGFuIGVycm9yIHVuZGVyIFBDUkUvUFJFOgorICAgICMgKCdbXFxkLXhdJywgJy0nLCBTWU5UQVhfRVJST1IpLAorICAgIChyJyhbXHNdKikoW1xTXSopKFtcc10qKScsICcgdGVzdGluZyExOTcyJywgU1VDQ0VFRCwgJ2czK2cyK2cxJywgJ3Rlc3RpbmchMTk3MiAnKSwKKyAgICAocicoXHMqKShcUyopKFxzKiknLCAnIHRlc3RpbmchMTk3MicsIFNVQ0NFRUQsICdnMytnMitnMScsICd0ZXN0aW5nITE5NzIgJyksCisKKyAgICAocidceGZmJywgJ1wzNzcnLCBTVUNDRUVELCAnZm91bmQnLCBjaHIoMjU1KSksCisgICAgIyBuZXcgXHggc2VtYW50aWNzCisgICAgKHInXHgwMGZmJywgJ1wzNzcnLCBGQUlMKSwKKyAgICAjIChyJ1x4MDBmZicsICdcMzc3JywgU1VDQ0VFRCwgJ2ZvdW5kJywgY2hyKDI1NSkpLAorICAgIChyJ1x0XG5cdlxyXGZcYVxnJywgJ1x0XG5cdlxyXGZcYWcnLCBTVUNDRUVELCAnZm91bmQnLCAnXHRcblx2XHJcZlxhZycpLAorICAgICgnXHRcblx2XHJcZlxhXGcnLCAnXHRcblx2XHJcZlxhZycsIFNVQ0NFRUQsICdmb3VuZCcsICdcdFxuXHZcclxmXGFnJyksCisgICAgKHInXHRcblx2XHJcZlxhJywgJ1x0XG5cdlxyXGZcYScsIFNVQ0NFRUQsICdmb3VuZCcsIGNocig5KStjaHIoMTApK2NocigxMSkrY2hyKDEzKStjaHIoMTIpK2Nocig3KSksCisgICAgKHInW1x0XVtcbl1bXHZdW1xyXVtcZl1bXGJdJywgJ1x0XG5cdlxyXGZcYicsIFNVQ0NFRUQsICdmb3VuZCcsICdcdFxuXHZcclxmXGInKSwKKworICAgICMKKyAgICAjIHBvc3QtMS41LjIgYWRkaXRpb25zCisKKyAgICAjIHhtbGxpYiBwcm9ibGVtCisgICAgKHInKChbYS16XSspOik/KFthLXpdKykkJywgJ3NtaWwnLCBTVUNDRUVELCAnZzErIi0iK2cyKyItIitnMycsICdOb25lLU5vbmUtc21pbCcpLAorICAgICMgYnVnIDExMDg2NjogcmVmZXJlbmNlIHRvIHVuZGVmaW5lZCBncm91cAorICAgIChyJygoLilcMSspJywgJycsIFNZTlRBWF9FUlJPUiksCisgICAgIyBidWcgMTExODY5OiBzZWFyY2ggKFBSRS9QQ1JFIGZhaWxzIG9uIHRoaXMgb25lLCBTUkUgZG9lc24ndCkKKyAgICAocicuKmQnLCAnYWJjXG5hYmQnLCBTVUNDRUVELCAnZm91bmQnLCAnYWJkJyksCisgICAgIyBidWcgMTEyNDY4OiB2YXJpb3VzIGV4cGVjdGVkIHN5bnRheCBlcnJvcnMKKyAgICAocicoJywgJycsIFNZTlRBWF9FUlJPUiksCisgICAgKHInW1w0MV0nLCAnIScsIFNVQ0NFRUQsICdmb3VuZCcsICchJyksCisgICAgIyBidWcgMTE0MDMzOiBub3RoaW5nIHRvIHJlcGVhdAorICAgIChyJyh4Pyk/JywgJ3gnLCBTVUNDRUVELCAnZm91bmQnLCAneCcpLAorICAgICMgYnVnIDExNTA0MDogcmVzY2FuIGlmIGZsYWdzIGFyZSBtb2RpZmllZCBpbnNpZGUgcGF0dGVybgorICAgIChyJyAoP3gpZm9vICcsICdmb28nLCBTVUNDRUVELCAnZm91bmQnLCAnZm9vJyksCisgICAgIyBidWcgMTE1NjE4OiBuZWdhdGl2ZSBsb29rYWhlYWQKKyAgICAocicoPzwhYWJjKShkLmYpJywgJ2FiY2RlZmRvZicsIFNVQ0NFRUQsICdmb3VuZCcsICdkb2YnKSwKKyAgICAjIGJ1ZyAxMTYyNTE6IGNoYXJhY3RlciBjbGFzcyBidWcKKyAgICAocidbXHctXSsnLCAnbGFzZXJfYmVhbScsIFNVQ0NFRUQsICdmb3VuZCcsICdsYXNlcl9iZWFtJyksCisgICAgIyBidWcgMTIzNzY5KzEyNzI1OTogbm9uLWdyZWVkeSBiYWNrdHJhY2tpbmcgYnVnCisgICAgKHInLio/XFMgKjonLCAneHg6JywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ3h4OicpLAorICAgIChyJ2FbIF0qP1wgKFxkKykuKicsICdhICAgMTAnLCBTVUNDRUVELCAnZm91bmQnLCAnYSAgIDEwJyksCisgICAgKHInYVsgXSo/XCAoXGQrKS4qJywgJ2EgICAgMTAnLCBTVUNDRUVELCAnZm91bmQnLCAnYSAgICAxMCcpLAorICAgICMgYnVnIDEyNzI1OTogXFogc2hvdWxkbid0IGRlcGVuZCBvbiBtdWx0aWxpbmUgbW9kZQorICAgIChyJyg/bXMpLio/eFxzKlxaKC4qKScsJ3h4XG54XG4nLCBTVUNDRUVELCAnZzEnLCAnJyksCisgICAgIyBidWcgMTI4ODk5OiB1cHBlcmNhc2UgbGl0ZXJhbHMgdW5kZXIgdGhlIGlnbm9yZWNhc2UgZmxhZworICAgIChyJyg/aSlNKycsICdNTU0nLCBTVUNDRUVELCAnZm91bmQnLCAnTU1NJyksCisgICAgKHInKD9pKW0rJywgJ01NTScsIFNVQ0NFRUQsICdmb3VuZCcsICdNTU0nKSwKKyAgICAocicoP2kpW01dKycsICdNTU0nLCBTVUNDRUVELCAnZm91bmQnLCAnTU1NJyksCisgICAgKHInKD9pKVttXSsnLCAnTU1NJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ01NTScpLAorICAgICMgYnVnIDEzMDc0ODogXiogc2hvdWxkIGJlIGFuIGVycm9yIChub3RoaW5nIHRvIHJlcGVhdCkKKyAgICAocideKicsICcnLCBTWU5UQVhfRVJST1IpLAorICAgICMgYnVnIDEzMzI4MzogbWluaW1pemluZyByZXBlYXQgcHJvYmxlbQorICAgIChyJyIoPzpcXCJ8W14iXSkqPyInLCByJyJcIiInLCBTVUNDRUVELCAnZm91bmQnLCByJyJcIiInKSwKKyAgICAjIGJ1ZyA0Nzc3Mjg6IG1pbmltaXppbmcgcmVwZWF0IHByb2JsZW0KKyAgICAocideLio/JCcsICdvbmVcbnR3b1xudGhyZWVcbicsIEZBSUwpLAorICAgICMgYnVnIDQ4Mzc4OTogbWluaW1pemluZyByZXBlYXQgcHJvYmxlbQorICAgIChyJ2FbXj5dKj9iJywgJ2E+YicsIEZBSUwpLAorICAgICMgYnVnIDQ5MDU3MzogbWluaW1pemluZyByZXBlYXQgcHJvYmxlbQorICAgIChyJ15hKj8kJywgJ2ZvbycsIEZBSUwpLAorICAgICMgYnVnIDQ3MDU4MjogbmVzdGVkIGdyb3VwcyBwcm9ibGVtCisgICAgKHInXigoYSljKT8oYWIpJCcsICdhYicsIFNVQ0NFRUQsICdnMSsiLSIrZzIrIi0iK2czJywgJ05vbmUtTm9uZS1hYicpLAorICAgICMgYW5vdGhlciBtaW5pbWl6aW5nIHJlcGVhdCBwcm9ibGVtIChjYXB0dXJpbmcgZ3JvdXBzIGluIGFzc2VydGlvbnMpCisgICAgKCdeKFthYl0qPykoPz0oYik/KWMnLCAnYWJjJywgU1VDQ0VFRCwgJ2cxKyItIitnMicsICdhYi1Ob25lJyksCisgICAgKCdeKFthYl0qPykoPyEoYikpYycsICdhYmMnLCBTVUNDRUVELCAnZzErIi0iK2cyJywgJ2FiLU5vbmUnKSwKKyAgICAoJ14oW2FiXSo/KSg/PCEoYSkpYycsICdhYmMnLCBTVUNDRUVELCAnZzErIi0iK2cyJywgJ2FiLU5vbmUnKSwKK10KKwordHJ5OgorICAgIHUgPSBldmFsKCJ1J1xOe0xBVElOIENBUElUQUwgTEVUVEVSIEEgV0lUSCBESUFFUkVTSVN9JyIpCitleGNlcHQgU3ludGF4RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICB0ZXN0cy5leHRlbmQoWworICAgICMgYnVnIDQxMDI3MTogXGIgYnJva2VuIHVuZGVyIGxvY2FsZXMKKyAgICAocidcYi5cYicsICdhJywgU1VDQ0VFRCwgJ2ZvdW5kJywgJ2EnKSwKKyAgICAocicoP3UpXGIuXGInLCB1LCBTVUNDRUVELCAnZm91bmQnLCB1KSwKKyAgICAocicoP3UpXHcnLCB1LCBTVUNDRUVELCAnZm91bmQnLCB1KSwKKyAgICBdKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9yZV90ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhODJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9yZV90ZXN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlX3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9yZV90ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhODJmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9yZV90ZXN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlZ3J0ZXN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlZ3J0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmM2NkNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHkKQEAgLTAsMCArMSwxNTYxIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIgorVXNhZ2U6CisKK3B5dGhvbiAtbSB0ZXN0LnJlZ3J0ZXN0IFtvcHRpb25zXSBbdGVzdF9uYW1lMSBbdGVzdF9uYW1lMiAuLi5dXQorcHl0aG9uIHBhdGgvdG8vTGliL3Rlc3QvcmVncnRlc3QucHkgW29wdGlvbnNdIFt0ZXN0X25hbWUxIFt0ZXN0X25hbWUyIC4uLl1dCisKKworSWYgbm8gYXJndW1lbnRzIG9yIG9wdGlvbnMgYXJlIHByb3ZpZGVkLCBmaW5kcyBhbGwgZmlsZXMgbWF0Y2hpbmcKK3RoZSBwYXR0ZXJuICJ0ZXN0XyoiIGluIHRoZSBMaWIvdGVzdCBzdWJkaXJlY3RvcnkgYW5kIHJ1bnMKK3RoZW0gaW4gYWxwaGFiZXRpY2FsIG9yZGVyIChidXQgc2VlIC1NIGFuZCAtdSwgYmVsb3csIGZvciBleGNlcHRpb25zKS4KKworRm9yIG1vcmUgcmlnb3JvdXMgdGVzdGluZywgaXQgaXMgdXNlZnVsIHRvIHVzZSB0aGUgZm9sbG93aW5nCitjb21tYW5kIGxpbmU6CisKK3B5dGhvbiAtRSAtdHQgLVdkIC0zIC1tIHRlc3QucmVncnRlc3QgW29wdGlvbnNdIFt0ZXN0X25hbWUxIC4uLl0KKworCitPcHRpb25zOgorCistaC8tLWhlbHAgICAgICAgLS0gcHJpbnQgdGhpcyB0ZXh0IGFuZCBleGl0CisKK1ZlcmJvc2l0eQorCistdi8tLXZlcmJvc2UgICAgLS0gcnVuIHRlc3RzIGluIHZlcmJvc2UgbW9kZSB3aXRoIG91dHB1dCB0byBzdGRvdXQKKy13Ly0tdmVyYm9zZTIgICAtLSByZS1ydW4gZmFpbGVkIHRlc3RzIGluIHZlcmJvc2UgbW9kZQorLVcvLS12ZXJib3NlMyAgIC0tIHJlLXJ1biBmYWlsZWQgdGVzdHMgaW4gdmVyYm9zZSBtb2RlIGltbWVkaWF0ZWx5CistcS8tLXF1aWV0ICAgICAgLS0gbm8gb3V0cHV0IHVubGVzcyBvbmUgb3IgbW9yZSB0ZXN0cyBmYWlsCistUy8tLXNsb3cgICAgICAgLS0gcHJpbnQgdGhlIHNsb3dlc3QgMTAgdGVzdHMKKyAgIC0taGVhZGVyICAgICAtLSBwcmludCBoZWFkZXIgd2l0aCBpbnRlcnByZXRlciBpbmZvCisKK1NlbGVjdGluZyB0ZXN0cworCistci8tLXJhbmRvbWl6ZSAgLS0gcmFuZG9taXplIHRlc3QgZXhlY3V0aW9uIG9yZGVyIChzZWUgYmVsb3cpCisgICAtLXJhbmRzZWVkICAgLS0gcGFzcyBhIHJhbmRvbSBzZWVkIHRvIHJlcHJvZHVjZSBhIHByZXZpb3VzIHJhbmRvbSBydW4KKy1mLy0tZnJvbWZpbGUgICAtLSByZWFkIG5hbWVzIG9mIHRlc3RzIHRvIHJ1biBmcm9tIGEgZmlsZSAoc2VlIGJlbG93KQorLXgvLS1leGNsdWRlICAgIC0tIGFyZ3VtZW50cyBhcmUgdGVzdHMgdG8gKmV4Y2x1ZGUqCistcy8tLXNpbmdsZSAgICAgLS0gc2luZ2xlIHN0ZXAgdGhyb3VnaCBhIHNldCBvZiB0ZXN0cyAoc2VlIGJlbG93KQorLXUvLS11c2UgUkVTMSxSRVMyLC4uLgorICAgICAgICAgICAgICAgIC0tIHNwZWNpZnkgd2hpY2ggc3BlY2lhbCByZXNvdXJjZSBpbnRlbnNpdmUgdGVzdHMgdG8gcnVuCistTS8tLW1lbWxpbWl0IExJTUlUCisgICAgICAgICAgICAgICAgLS0gcnVuIHZlcnkgbGFyZ2UgbWVtb3J5LWNvbnN1bWluZyB0ZXN0cworCitTcGVjaWFsIHJ1bnMKKworLWwvLS1maW5kbGVha3MgIC0tIGlmIEdDIGlzIGF2YWlsYWJsZSBkZXRlY3QgdGVzdHMgdGhhdCBsZWFrIG1lbW9yeQorLUwvLS1ydW5sZWFrcyAgIC0tIHJ1biB0aGUgbGVha3MoMSkgY29tbWFuZCBqdXN0IGJlZm9yZSBleGl0CistUi8tLWh1bnRybGVha3MgUlVOQ09VTlRTCisgICAgICAgICAgICAgICAgLS0gc2VhcmNoIGZvciByZWZlcmVuY2UgbGVha3MgKG5lZWRzIGRlYnVnIGJ1aWxkLCB2LiBzbG93KQorLWovLS1tdWx0aXByb2Nlc3MgUFJPQ0VTU0VTCisgICAgICAgICAgICAgICAgLS0gcnVuIFBST0NFU1NFUyBwcm9jZXNzZXMgYXQgb25jZQorLVQvLS1jb3ZlcmFnZSAgIC0tIHR1cm4gb24gY29kZSBjb3ZlcmFnZSB0cmFjaW5nIHVzaW5nIHRoZSB0cmFjZSBtb2R1bGUKKy1ELy0tY292ZXJkaXIgRElSRUNUT1JZCisgICAgICAgICAgICAgICAgLS0gRGlyZWN0b3J5IHdoZXJlIGNvdmVyYWdlIGZpbGVzIGFyZSBwdXQKKy1OLy0tbm9jb3ZlcmRpciAtLSBQdXQgY292ZXJhZ2UgZmlsZXMgYWxvbmdzaWRlIG1vZHVsZXMKKy10Ly0tdGhyZXNob2xkIFRIUkVTSE9MRAorICAgICAgICAgICAgICAgIC0tIGNhbGwgZ2Muc2V0X3RocmVzaG9sZChUSFJFU0hPTEQpCistRi8tLWZvcmV2ZXIgICAgLS0gcnVuIHRoZSBzcGVjaWZpZWQgdGVzdHMgaW4gYSBsb29wLCB1bnRpbCBhbiBlcnJvciBoYXBwZW5zCisKKworQWRkaXRpb25hbCBPcHRpb24gRGV0YWlsczoKKworLXIgcmFuZG9taXplcyB0ZXN0IGV4ZWN1dGlvbiBvcmRlci4gWW91IGNhbiB1c2UgLS1yYW5kc2VlZD1pbnQgdG8gcHJvdmlkZSBhCitpbnQgc2VlZCB2YWx1ZSBmb3IgdGhlIHJhbmRvbWl6ZXI7IHRoaXMgaXMgdXNlZnVsIGZvciByZXByb2R1Y2luZyB0cm91Ymxlc29tZQordGVzdCBvcmRlcnMuCisKKy1zIE9uIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHJlZ3J0ZXN0IHVzaW5nIC1zLCB0aGUgZmlyc3QgdGVzdCBmaWxlIGZvdW5kCitvciB0aGUgZmlyc3QgdGVzdCBmaWxlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgcnVuLCBhbmQgdGhlIG5hbWUgb2YKK3RoZSBuZXh0IHRlc3QgaXMgcmVjb3JkZWQgaW4gYSBmaWxlIG5hbWVkIHB5bmV4dHRlc3QuICBJZiBydW4gZnJvbSB0aGUKK1B5dGhvbiBidWlsZCBkaXJlY3RvcnksIHB5bmV4dHRlc3QgaXMgbG9jYXRlZCBpbiB0aGUgJ2J1aWxkJyBzdWJkaXJlY3RvcnksCitvdGhlcndpc2UgaXQgaXMgbG9jYXRlZCBpbiB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkuICBPbiBzdWJzZXF1ZW50IHJ1bnMsCit0aGUgdGVzdCBpbiBweW5leHR0ZXN0IGlzIHJ1biwgYW5kIHRoZSBuZXh0IHRlc3QgaXMgd3JpdHRlbiB0byBweW5leHR0ZXN0LgorV2hlbiB0aGUgbGFzdCB0ZXN0IGhhcyBiZWVuIHJ1biwgcHluZXh0dGVzdCBpcyBkZWxldGVkLiAgSW4gdGhpcyB3YXkgaXQKK2lzIHBvc3NpYmxlIHRvIHNpbmdsZSBzdGVwIHRocm91Z2ggdGhlIHRlc3QgZmlsZXMuICBUaGlzIGlzIHVzZWZ1bCB3aGVuCitkb2luZyBtZW1vcnkgYW5hbHlzaXMgb24gdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgd2hpY2ggcHJvY2VzcyB0ZW5kcyB0bworY29uc3VtZSB0b28gbWFueSByZXNvdXJjZXMgdG8gcnVuIHRoZSBmdWxsIHJlZ3Jlc3Npb24gdGVzdCBub24tc3RvcC4KKworLWYgcmVhZHMgdGhlIG5hbWVzIG9mIHRlc3RzIGZyb20gdGhlIGZpbGUgZ2l2ZW4gYXMgZidzIGFyZ3VtZW50LCBvbmUKK29yIG1vcmUgdGVzdCBuYW1lcyBwZXIgbGluZS4gIFdoaXRlc3BhY2UgaXMgaWdub3JlZC4gIEJsYW5rIGxpbmVzIGFuZAorbGluZXMgYmVnaW5uaW5nIHdpdGggJyMnIGFyZSBpZ25vcmVkLiAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCBmb3IKK3doaXR0bGluZyBkb3duIGZhaWx1cmVzIGludm9sdmluZyBpbnRlcmFjdGlvbnMgYW1vbmcgdGVzdHMuCisKKy1MIGNhdXNlcyB0aGUgbGVha3MoMSkgY29tbWFuZCB0byBiZSBydW4ganVzdCBiZWZvcmUgZXhpdCBpZiBpdCBleGlzdHMuCitsZWFrcygxKSBpcyBhdmFpbGFibGUgb24gTWFjIE9TIFggYW5kIHByZXN1bWFibHkgb24gc29tZSBvdGhlcgorRnJlZUJTRC1kZXJpdmVkIHN5c3RlbXMuCisKKy1SIHJ1bnMgZWFjaCB0ZXN0IHNldmVyYWwgdGltZXMgYW5kIGV4YW1pbmVzIHN5cy5nZXR0b3RhbHJlZmNvdW50KCkgdG8KK3NlZSBpZiB0aGUgdGVzdCBhcHBlYXJzIHRvIGJlIGxlYWtpbmcgcmVmZXJlbmNlcy4gIFRoZSBhcmd1bWVudCBzaG91bGQKK2JlIG9mIHRoZSBmb3JtIHN0YWI6cnVuOmZuYW1lIHdoZXJlICdzdGFiJyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZQordGVzdCBpcyBydW4gdG8gbGV0IGdldHRvdGFscmVmY291bnQgc2V0dGxlIGRvd24sICdydW4nIGlzIHRoZSBudW1iZXIKK29mIHRpbWVzIGZ1cnRoZXIgaXQgaXMgcnVuIGFuZCAnZm5hbWUnIGlzIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRoZQorcmVwb3J0cyBhcmUgd3JpdHRlbiB0by4gIFRoZXNlIHBhcmFtZXRlcnMgYWxsIGhhdmUgZGVmYXVsdHMgKDUsIDQgYW5kCisicmVmbG9nLnR4dCIgcmVzcGVjdGl2ZWx5KSwgYW5kIHRoZSBtaW5pbWFsIGludm9jYXRpb24gaXMgJy1SIDonLgorCistTSBydW5zIHRlc3RzIHRoYXQgcmVxdWlyZSBhbiBleG9yYml0YW50IGFtb3VudCBvZiBtZW1vcnkuIFRoZXNlIHRlc3RzCit0eXBpY2FsbHkgdHJ5IHRvIGFzY2VydGFpbiBjb250YWluZXJzIGtlZXAgd29ya2luZyB3aGVuIGNvbnRhaW5pbmcgbW9yZSB0aGFuCisyIGJpbGxpb24gb2JqZWN0cywgd2hpY2ggb25seSB3b3JrcyBvbiA2NC1iaXQgc3lzdGVtcy4gVGhlcmUgYXJlIGFsc28gc29tZQordGVzdHMgdGhhdCB0cnkgdG8gZXhoYXVzdCB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcHJvY2Vzcywgd2hpY2ggb25seSBtYWtlcworc2Vuc2Ugb24gMzItYml0IHN5c3RlbXMgd2l0aCBhdCBsZWFzdCAyR2Igb2YgbWVtb3J5LiBUaGUgcGFzc2VkLWluIG1lbWxpbWl0LAord2hpY2ggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgJzIuNUdiJywgZGV0ZXJtaW5lcyBob3dtdWNoIG1lbW9yeSB0aGUKK3Rlc3RzIHdpbGwgbGltaXQgdGhlbXNlbHZlcyB0byAoYnV0IHRoZXkgbWF5IGdvIHNsaWdodGx5IG92ZXIuKSBUaGUgbnVtYmVyCitzaG91bGRuJ3QgYmUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgbWFjaGluZSBoYXMgKGluY2x1ZGluZyBzd2FwIG1lbW9yeSkuIFlvdQorc2hvdWxkIGFsc28ga2VlcCBpbiBtaW5kIHRoYXQgc3dhcCBtZW1vcnkgaXMgZ2VuZXJhbGx5IG11Y2gsIG11Y2ggc2xvd2VyCit0aGFuIFJBTSwgYW5kIHNldHRpbmcgbWVtbGltaXQgdG8gYWxsIGF2YWlsYWJsZSBSQU0gb3IgaGlnaGVyIHdpbGwgaGVhdmlseQordGF4IHRoZSBtYWNoaW5lLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgaXMgbm8gdXNlIHJ1bm5pbmcgdGhlc2UgdGVzdHMgd2l0aCBhCitsaW1pdCBvZiBsZXNzIHRoYW4gMi41R2IsIGFuZCBtYW55IHJlcXVpcmUgbW9yZSB0aGFuIDIwR2IuIFRlc3RzIHRoYXQgZXhwZWN0Cit0byB1c2UgbW9yZSB0aGFuIG1lbWxpbWl0IG1lbW9yeSB3aWxsIGJlIHNraXBwZWQuIFRoZSBiaWctbWVtb3J5IHRlc3RzCitnZW5lcmFsbHkgcnVuIHZlcnksIHZlcnkgbG9uZy4KKworLXUgaXMgdXNlZCB0byBzcGVjaWZ5IHdoaWNoIHNwZWNpYWwgcmVzb3VyY2UgaW50ZW5zaXZlIHRlc3RzIHRvIHJ1biwKK3N1Y2ggYXMgdGhvc2UgcmVxdWlyaW5nIGxhcmdlIGZpbGUgc3VwcG9ydCBvciBuZXR3b3JrIGNvbm5lY3Rpdml0eS4KK1RoZSBhcmd1bWVudCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHdvcmRzIGluZGljYXRpbmcgdGhlCityZXNvdXJjZXMgdG8gdGVzdC4gIEN1cnJlbnRseSBvbmx5IHRoZSBmb2xsb3dpbmcgYXJlIGRlZmluZWQ6CisKKyAgICBhbGwgLSAgICAgICBFbmFibGUgYWxsIHNwZWNpYWwgcmVzb3VyY2VzLgorCisgICAgYXVkaW8gLSAgICAgVGVzdHMgdGhhdCB1c2UgdGhlIGF1ZGlvIGRldmljZS4gIChUaGVyZSBhcmUga25vd24KKyAgICAgICAgICAgICAgICBjYXNlcyBvZiBicm9rZW4gYXVkaW8gZHJpdmVycyB0aGF0IGNhbiBjcmFzaCBQeXRob24gb3IKKyAgICAgICAgICAgICAgICBldmVuIHRoZSBMaW51eCBrZXJuZWwuKQorCisgICAgY3Vyc2VzIC0gICAgVGVzdHMgdGhhdCB1c2UgY3Vyc2VzIGFuZCB3aWxsIG1vZGlmeSB0aGUgdGVybWluYWwncworICAgICAgICAgICAgICAgIHN0YXRlIGFuZCBvdXRwdXQgbW9kZXMuCisKKyAgICBsYXJnZWZpbGUgLSBJdCBpcyBva2F5IHRvIHJ1biBzb21lIHRlc3QgdGhhdCBtYXkgY3JlYXRlIGh1Z2UKKyAgICAgICAgICAgICAgICBmaWxlcy4gIFRoZXNlIHRlc3RzIGNhbiB0YWtlIGEgbG9uZyB0aW1lIGFuZCBtYXkKKyAgICAgICAgICAgICAgICBjb25zdW1lID4yR0Igb2YgZGlzayBzcGFjZSB0ZW1wb3JhcmlseS4KKworICAgIG5ldHdvcmsgLSAgIEl0IGlzIG9rYXkgdG8gcnVuIHRlc3RzIHRoYXQgdXNlIGV4dGVybmFsIG5ldHdvcmsKKyAgICAgICAgICAgICAgICByZXNvdXJjZSwgZS5nLiB0ZXN0aW5nIFNTTCBzdXBwb3J0IGZvciBzb2NrZXRzLgorCisgICAgYnNkZGIgLSAgICAgSXQgaXMgb2theSB0byBydW4gdGhlIGJzZGRiIHRlc3RzdWl0ZSwgd2hpY2ggdGFrZXMKKyAgICAgICAgICAgICAgICBhIGxvbmcgdGltZSB0byBjb21wbGV0ZS4KKworICAgIGRlY2ltYWwgLSAgIFRlc3QgdGhlIGRlY2ltYWwgbW9kdWxlIGFnYWluc3QgYSBsYXJnZSBzdWl0ZSB0aGF0CisgICAgICAgICAgICAgICAgdmVyaWZpZXMgY29tcGxpYW5jZSB3aXRoIHN0YW5kYXJkcy4KKworICAgIGNwdSAtICAgICAgIFVzZWQgZm9yIGNlcnRhaW4gQ1BVLWhlYXZ5IHRlc3RzLgorCisgICAgc3VicHJvY2VzcyAgUnVuIGFsbCB0ZXN0cyBmb3IgdGhlIHN1YnByb2Nlc3MgbW9kdWxlLgorCisgICAgdXJsZmV0Y2ggLSAgSXQgaXMgb2theSB0byBkb3dubG9hZCBmaWxlcyByZXF1aXJlZCBvbiB0ZXN0aW5nLgorCisgICAgZ3VpIC0gICAgICAgUnVuIHRlc3RzIHRoYXQgcmVxdWlyZSBhIHJ1bm5pbmcgR1VJLgorCisgICAgeHBpY2tsZSAtICAgVGVzdCBwaWNrbGUgYW5kIGNQaWNrbGUgYWdhaW5zdCBQeXRob24gMi40LCAyLjUgYW5kIDIuNiB0bworICAgICAgICAgICAgICAgIHRlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFRoZXNlIHRlc3RzIHRha2UgYSBsb25nIHRpbWUKKyAgICAgICAgICAgICAgICB0byBydW4uCisKK1RvIGVuYWJsZSBhbGwgcmVzb3VyY2VzIGV4Y2VwdCBvbmUsIHVzZSAnLXVhbGwsLTxyZXNvdXJjZT4nLiAgRm9yCitleGFtcGxlLCB0byBydW4gYWxsIHRoZSB0ZXN0cyBleGNlcHQgZm9yIHRoZSBic2RkYiB0ZXN0cywgZ2l2ZSB0aGUKK29wdGlvbiAnLXVhbGwsLWJzZGRiJy4KKyIiIgorCitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBnZXRvcHQKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCByYW5kb20KK2ltcG9ydCByZQoraW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBpbXAKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHN5c2NvbmZpZworCisKKyMgU29tZSB0aW1lcyBfX3BhdGhfXyBhbmQgX19maWxlX18gYXJlIG5vdCBhYnNvbHV0ZSAoZS5nLiB3aGlsZSBydW5uaW5nIGZyb20KKyMgTGliLykgYW5kLCBpZiB3ZSBjaGFuZ2UgdGhlIENXRCB0byBydW4gdGhlIHRlc3RzIGluIGEgdGVtcG9yYXJ5IGRpciwgc29tZQorIyBpbXBvcnRzIG1pZ2h0IGZhaWwuICBUaGlzIGFmZmVjdHMgb25seSB0aGUgbW9kdWxlcyBpbXBvcnRlZCBiZWZvcmUgb3MuY2hkaXIoKS4KKyMgVGhlc2UgbW9kdWxlcyBhcmUgc2VhcmNoZWQgZmlyc3QgaW4gc3lzLnBhdGhbMF0gKHNvICcnIC0tIHRoZSBDV0QpIGFuZCBpZgorIyB0aGV5IGFyZSBmb3VuZCBpbiB0aGUgQ1dEIHRoZWlyIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyB3aWxsIGJlIHJlbGF0aXZlICh0aGlzCisjIGhhcHBlbnMgYmVmb3JlIHRoZSBjaGRpcikuICBBbGwgdGhlIG1vZHVsZXMgaW1wb3J0ZWQgYWZ0ZXIgdGhlIGNoZGlyLCBhcmUKKyMgbm90IGZvdW5kIGluIHRoZSBDV0QsIGFuZCBzaW5jZSB0aGUgb3RoZXIgcGF0aHMgaW4gc3lzLnBhdGhbMTpdIGFyZSBhYnNvbHV0ZQorIyAoc2l0ZS5weSBhYnNvbHV0aXplIHRoZW0pLCB0aGUgX19maWxlX18gYW5kIF9fcGF0aF9fIHdpbGwgYmUgYWJzb2x1dGUgdG9vLgorIyBUaGVyZWZvcmUgaXQgaXMgbmVjZXNzYXJ5IHRvIGFic29sdXRpemUgbWFudWFsbHkgdGhlIF9fZmlsZV9fIGFuZCBfX3BhdGhfXyBvZgorIyB0aGUgcGFja2FnZXMgdG8gcHJldmVudCBsYXRlciBpbXBvcnRzIHRvIGZhaWwgd2hlbiB0aGUgQ1dEIGlzIGRpZmZlcmVudC4KK2ZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMuaXRlcnZhbHVlcygpOgorICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKKyAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gW29zLnBhdGguYWJzcGF0aChwYXRoKSBmb3IgcGF0aCBpbiBtb2R1bGUuX19wYXRoX19dCisgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgorICAgICAgICBtb2R1bGUuX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgobW9kdWxlLl9fZmlsZV9fKQorCisKKyMgTWFjT1NYIChhLmsuYS4gRGFyd2luKSBoYXMgYSBkZWZhdWx0IHN0YWNrIHNpemUgdGhhdCBpcyB0b28gc21hbGwKKyMgZm9yIGRlZXBseSByZWN1cnNpdmUgcmVndWxhciBleHByZXNzaW9ucy4gIFdlIHNlZSB0aGlzIGFzIGNyYXNoZXMgaW4KKyMgdGhlIFB5dGhvbiB0ZXN0IHN1aXRlIHdoZW4gcnVubmluZyB0ZXN0X3JlLnB5IGFuZCB0ZXN0X3NyZS5weS4gIFRoZQorIyBmaXggaXMgdG8gc2V0IHRoZSBzdGFjayBsaW1pdCB0byAyMDQ4LgorIyBUaGlzIGFwcHJvYWNoIG1heSBhbHNvIGJlIHVzZWZ1bCBmb3Igb3RoZXIgVW5peHkgcGxhdGZvcm1zIHRoYXQKKyMgc3VmZmVyIGZyb20gc21hbGwgZGVmYXVsdCBzdGFjayBsaW1pdHMuCitpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgcmVzb3VyY2UKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBzb2Z0LCBoYXJkID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSykKKyAgICAgICAgbmV3c29mdCA9IG1pbihoYXJkLCBtYXgoc29mdCwgMTAyNCoyMDQ4KSkKKyAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9TVEFDSywgKG5ld3NvZnQsIGhhcmQpKQorCisjIFRlc3QgcmVzdWx0IGNvbnN0YW50cy4KK1BBU1NFRCA9IDEKK0ZBSUxFRCA9IDAKK0VOVl9DSEFOR0VEID0gLTEKK1NLSVBQRUQgPSAtMgorUkVTT1VSQ0VfREVOSUVEID0gLTMKK0lOVEVSUlVQVEVEID0gLTQKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworUkVTT1VSQ0VfTkFNRVMgPSAoJ2F1ZGlvJywgJ2N1cnNlcycsICdsYXJnZWZpbGUnLCAnbmV0d29yaycsICdic2RkYicsCisgICAgICAgICAgICAgICAgICAnZGVjaW1hbCcsICdjcHUnLCAnc3VicHJvY2VzcycsICd1cmxmZXRjaCcsICdndWknLAorICAgICAgICAgICAgICAgICAgJ3hwaWNrbGUnKQorCitURU1QRElSID0gb3MucGF0aC5hYnNwYXRoKHRlbXBmaWxlLmdldHRlbXBkaXIoKSkKKworCitkZWYgdXNhZ2UoY29kZSwgbXNnPScnKToKKyAgICBwcmludCBfX2RvY19fCisgICAgaWYgbXNnOiBwcmludCBtc2cKKyAgICBzeXMuZXhpdChjb2RlKQorCisKK2RlZiBtYWluKHRlc3RzPU5vbmUsIHRlc3RkaXI9Tm9uZSwgdmVyYm9zZT0wLCBxdWlldD1GYWxzZSwKKyAgICAgICAgIGV4Y2x1ZGU9RmFsc2UsIHNpbmdsZT1GYWxzZSwgcmFuZG9taXplPUZhbHNlLCBmcm9tZmlsZT1Ob25lLAorICAgICAgICAgZmluZGxlYWtzPUZhbHNlLCB1c2VfcmVzb3VyY2VzPU5vbmUsIHRyYWNlPUZhbHNlLCBjb3ZlcmRpcj0nY292ZXJhZ2UnLAorICAgICAgICAgcnVubGVha3M9RmFsc2UsIGh1bnRybGVha3M9RmFsc2UsIHZlcmJvc2UyPUZhbHNlLCBwcmludF9zbG93PUZhbHNlLAorICAgICAgICAgcmFuZG9tX3NlZWQ9Tm9uZSwgdXNlX21wPU5vbmUsIHZlcmJvc2UzPUZhbHNlLCBmb3JldmVyPUZhbHNlLAorICAgICAgICAgaGVhZGVyPUZhbHNlKToKKyAgICAiIiJFeGVjdXRlIGEgdGVzdCBzdWl0ZS4KKworICAgIFRoaXMgYWxzbyBwYXJzZXMgY29tbWFuZC1saW5lIG9wdGlvbnMgYW5kIG1vZGlmaWVzIGl0cyBiZWhhdmlvcgorICAgIGFjY29yZGluZ2x5LgorCisgICAgdGVzdHMgLS0gYSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0ZXN0IG5hbWVzIChvcHRpb25hbCkKKyAgICB0ZXN0ZGlyIC0tIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdG8gbG9vayBmb3IgdGVzdHMgKG9wdGlvbmFsKQorCisgICAgVXNlcnMgb3RoZXIgdGhhbiB0aGUgUHl0aG9uIHRlc3Qgc3VpdGUgd2lsbCBjZXJ0YWlubHkgd2FudCB0bworICAgIHNwZWNpZnkgdGVzdGRpcjsgaWYgaXQncyBvbWl0dGVkLCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCisgICAgUHl0aG9uIHRlc3Qgc3VpdGUgaXMgc2VhcmNoZWQgZm9yLgorCisgICAgSWYgdGhlIHRlc3RzIGFyZ3VtZW50IGlzIG9taXR0ZWQsIHRoZSB0ZXN0cyBsaXN0ZWQgb24gdGhlCisgICAgY29tbWFuZC1saW5lIHdpbGwgYmUgdXNlZC4gIElmIHRoYXQncyBlbXB0eSwgdG9vLCB0aGVuIGFsbCAqLnB5CisgICAgZmlsZXMgYmVnaW5uaW5nIHdpdGggdGVzdF8gd2lsbCBiZSB1c2VkLgorCisgICAgVGhlIG90aGVyIGRlZmF1bHQgYXJndW1lbnRzICh2ZXJib3NlLCBxdWlldCwgZXhjbHVkZSwKKyAgICBzaW5nbGUsIHJhbmRvbWl6ZSwgZmluZGxlYWtzLCB1c2VfcmVzb3VyY2VzLCB0cmFjZSwgY292ZXJkaXIsCisgICAgcHJpbnRfc2xvdywgYW5kIHJhbmRvbV9zZWVkKSBhbGxvdyBwcm9ncmFtbWVycyBjYWxsaW5nIG1haW4oKQorICAgIGRpcmVjdGx5IHRvIHNldCB0aGUgdmFsdWVzIHRoYXQgd291bGQgbm9ybWFsbHkgYmUgc2V0IGJ5IGZsYWdzCisgICAgb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAiIiIKKworICAgIHRlc3Rfc3VwcG9ydC5yZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN5cy5zdGRvdXQpCisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdodnF4c1NyZjpsdTp0OlREOk5MUjpGd1dNOmo6JywKKyAgICAgICAgICAgIFsnaGVscCcsICd2ZXJib3NlJywgJ3ZlcmJvc2UyJywgJ3ZlcmJvc2UzJywgJ3F1aWV0JywKKyAgICAgICAgICAgICAnZXhjbHVkZScsICdzaW5nbGUnLCAnc2xvdycsICdyYW5kb21pemUnLCAnZnJvbWZpbGU9JywgJ2ZpbmRsZWFrcycsCisgICAgICAgICAgICAgJ3VzZT0nLCAndGhyZXNob2xkPScsICd0cmFjZScsICdjb3ZlcmRpcj0nLCAnbm9jb3ZlcmRpcicsCisgICAgICAgICAgICAgJ3J1bmxlYWtzJywgJ2h1bnRybGVha3M9JywgJ21lbWxpbWl0PScsICdyYW5kc2VlZD0nLAorICAgICAgICAgICAgICdtdWx0aXByb2Nlc3M9JywgJ3NsYXZlYXJncz0nLCAnZm9yZXZlcicsICdoZWFkZXInXSkKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHVzYWdlKDIsIG1zZykKKworICAgICMgRGVmYXVsdHMKKyAgICBpZiByYW5kb21fc2VlZCBpcyBOb25lOgorICAgICAgICByYW5kb21fc2VlZCA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMDAwMDApCisgICAgaWYgdXNlX3Jlc291cmNlcyBpcyBOb25lOgorICAgICAgICB1c2VfcmVzb3VyY2VzID0gW10KKyAgICBmb3IgbywgYSBpbiBvcHRzOgorICAgICAgICBpZiBvIGluICgnLWgnLCAnLS1oZWxwJyk6CisgICAgICAgICAgICB1c2FnZSgwKQorICAgICAgICBlbGlmIG8gaW4gKCctdicsICctLXZlcmJvc2UnKToKKyAgICAgICAgICAgIHZlcmJvc2UgKz0gMQorICAgICAgICBlbGlmIG8gaW4gKCctdycsICctLXZlcmJvc2UyJyk6CisgICAgICAgICAgICB2ZXJib3NlMiA9IFRydWUKKyAgICAgICAgZWxpZiBvIGluICgnLVcnLCAnLS12ZXJib3NlMycpOgorICAgICAgICAgICAgdmVyYm9zZTMgPSBUcnVlCisgICAgICAgIGVsaWYgbyBpbiAoJy1xJywgJy0tcXVpZXQnKToKKyAgICAgICAgICAgIHF1aWV0ID0gVHJ1ZTsKKyAgICAgICAgICAgIHZlcmJvc2UgPSAwCisgICAgICAgIGVsaWYgbyBpbiAoJy14JywgJy0tZXhjbHVkZScpOgorICAgICAgICAgICAgZXhjbHVkZSA9IFRydWUKKyAgICAgICAgZWxpZiBvIGluICgnLXMnLCAnLS1zaW5nbGUnKToKKyAgICAgICAgICAgIHNpbmdsZSA9IFRydWUKKyAgICAgICAgZWxpZiBvIGluICgnLVMnLCAnLS1zbG93Jyk6CisgICAgICAgICAgICBwcmludF9zbG93ID0gVHJ1ZQorICAgICAgICBlbGlmIG8gaW4gKCctcicsICctLXJhbmRvbWl6ZScpOgorICAgICAgICAgICAgcmFuZG9taXplID0gVHJ1ZQorICAgICAgICBlbGlmIG8gPT0gJy0tcmFuZHNlZWQnOgorICAgICAgICAgICAgcmFuZG9tX3NlZWQgPSBpbnQoYSkKKyAgICAgICAgZWxpZiBvIGluICgnLWYnLCAnLS1mcm9tZmlsZScpOgorICAgICAgICAgICAgZnJvbWZpbGUgPSBhCisgICAgICAgIGVsaWYgbyBpbiAoJy1sJywgJy0tZmluZGxlYWtzJyk6CisgICAgICAgICAgICBmaW5kbGVha3MgPSBUcnVlCisgICAgICAgIGVsaWYgbyBpbiAoJy1MJywgJy0tcnVubGVha3MnKToKKyAgICAgICAgICAgIHJ1bmxlYWtzID0gVHJ1ZQorICAgICAgICBlbGlmIG8gaW4gKCctdCcsICctLXRocmVzaG9sZCcpOgorICAgICAgICAgICAgaW1wb3J0IGdjCisgICAgICAgICAgICBnYy5zZXRfdGhyZXNob2xkKGludChhKSkKKyAgICAgICAgZWxpZiBvIGluICgnLVQnLCAnLS1jb3ZlcmFnZScpOgorICAgICAgICAgICAgdHJhY2UgPSBUcnVlCisgICAgICAgIGVsaWYgbyBpbiAoJy1EJywgJy0tY292ZXJkaXInKToKKyAgICAgICAgICAgIGNvdmVyZGlyID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBhKQorICAgICAgICBlbGlmIG8gaW4gKCctTicsICctLW5vY292ZXJkaXInKToKKyAgICAgICAgICAgIGNvdmVyZGlyID0gTm9uZQorICAgICAgICBlbGlmIG8gaW4gKCctUicsICctLWh1bnRybGVha3MnKToKKyAgICAgICAgICAgIGh1bnRybGVha3MgPSBhLnNwbGl0KCc6JykKKyAgICAgICAgICAgIGlmIGxlbihodW50cmxlYWtzKSBub3QgaW4gKDIsIDMpOgorICAgICAgICAgICAgICAgIHByaW50IGEsIGh1bnRybGVha3MKKyAgICAgICAgICAgICAgICB1c2FnZSgyLCAnLVIgdGFrZXMgMiBvciAzIGNvbG9uLXNlcGFyYXRlZCBhcmd1bWVudHMnKQorICAgICAgICAgICAgaWYgbm90IGh1bnRybGVha3NbMF06CisgICAgICAgICAgICAgICAgaHVudHJsZWFrc1swXSA9IDUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaHVudHJsZWFrc1swXSA9IGludChodW50cmxlYWtzWzBdKQorICAgICAgICAgICAgaWYgbm90IGh1bnRybGVha3NbMV06CisgICAgICAgICAgICAgICAgaHVudHJsZWFrc1sxXSA9IDQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaHVudHJsZWFrc1sxXSA9IGludChodW50cmxlYWtzWzFdKQorICAgICAgICAgICAgaWYgbGVuKGh1bnRybGVha3MpID09IDIgb3Igbm90IGh1bnRybGVha3NbMl06CisgICAgICAgICAgICAgICAgaHVudHJsZWFrc1syOl0gPSBbInJlZmxvZy50eHQiXQorICAgICAgICBlbGlmIG8gaW4gKCctTScsICctLW1lbWxpbWl0Jyk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuc2V0X21lbWxpbWl0KGEpCisgICAgICAgIGVsaWYgbyBpbiAoJy11JywgJy0tdXNlJyk6CisgICAgICAgICAgICB1ID0gW3gubG93ZXIoKSBmb3IgeCBpbiBhLnNwbGl0KCcsJyldCisgICAgICAgICAgICBmb3IgciBpbiB1OgorICAgICAgICAgICAgICAgIGlmIHIgPT0gJ2FsbCc6CisgICAgICAgICAgICAgICAgICAgIHVzZV9yZXNvdXJjZXNbOl0gPSBSRVNPVVJDRV9OQU1FUworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlbW92ZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgaWYgclswXSA9PSAnLSc6CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgciA9IHJbMTpdCisgICAgICAgICAgICAgICAgaWYgciBub3QgaW4gUkVTT1VSQ0VfTkFNRVM6CisgICAgICAgICAgICAgICAgICAgIHVzYWdlKDEsICdJbnZhbGlkIC11Ly0tdXNlIG9wdGlvbjogJyArIGEpCisgICAgICAgICAgICAgICAgaWYgcmVtb3ZlOgorICAgICAgICAgICAgICAgICAgICBpZiByIGluIHVzZV9yZXNvdXJjZXM6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VfcmVzb3VyY2VzLnJlbW92ZShyKQorICAgICAgICAgICAgICAgIGVsaWYgciBub3QgaW4gdXNlX3Jlc291cmNlczoKKyAgICAgICAgICAgICAgICAgICAgdXNlX3Jlc291cmNlcy5hcHBlbmQocikKKyAgICAgICAgZWxpZiBvIGluICgnLUYnLCAnLS1mb3JldmVyJyk6CisgICAgICAgICAgICBmb3JldmVyID0gVHJ1ZQorICAgICAgICBlbGlmIG8gaW4gKCctaicsICctLW11bHRpcHJvY2VzcycpOgorICAgICAgICAgICAgdXNlX21wID0gaW50KGEpCisgICAgICAgIGVsaWYgbyA9PSAnLS1oZWFkZXInOgorICAgICAgICAgICAgaGVhZGVyID0gVHJ1ZQorICAgICAgICBlbGlmIG8gPT0gJy0tc2xhdmVhcmdzJzoKKyAgICAgICAgICAgIGFyZ3MsIGt3YXJncyA9IGpzb24ubG9hZHMoYSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBydW50ZXN0KCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IElOVEVSUlVQVEVELCBlLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICAgICAgcHJpbnQgICAjIEZvcmNlIGEgbmV3bGluZSAoanVzdCBpbiBjYXNlKQorICAgICAgICAgICAgcHJpbnQganNvbi5kdW1wcyhyZXN1bHQpCisgICAgICAgICAgICBzeXMuZXhpdCgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoIk5vIGhhbmRsZXIgZm9yIG9wdGlvbiB7fS4gIFBsZWFzZSAiCisgICAgICAgICAgICAgICAgInJlcG9ydCB0aGlzIGFzIGEgYnVnIGF0IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcuIikuZm9ybWF0KG8pCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgIGlmIHNpbmdsZSBhbmQgZnJvbWZpbGU6CisgICAgICAgIHVzYWdlKDIsICItcyBhbmQgLWYgZG9uJ3QgZ28gdG9nZXRoZXIhIikKKyAgICBpZiB1c2VfbXAgYW5kIHRyYWNlOgorICAgICAgICB1c2FnZSgyLCAiLVQgYW5kIC1qIGRvbid0IGdvIHRvZ2V0aGVyISIpCisgICAgaWYgdXNlX21wIGFuZCBmaW5kbGVha3M6CisgICAgICAgIHVzYWdlKDIsICItbCBhbmQgLWogZG9uJ3QgZ28gdG9nZXRoZXIhIikKKworICAgIGdvb2QgPSBbXQorICAgIGJhZCA9IFtdCisgICAgc2tpcHBlZCA9IFtdCisgICAgcmVzb3VyY2VfZGVuaWVkcyA9IFtdCisgICAgZW52aXJvbm1lbnRfY2hhbmdlZCA9IFtdCisgICAgaW50ZXJydXB0ZWQgPSBGYWxzZQorCisgICAgaWYgZmluZGxlYWtzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcHJpbnQgJ05vIEdDIGF2YWlsYWJsZSwgZGlzYWJsaW5nIGZpbmRsZWFrcy4nCisgICAgICAgICAgICBmaW5kbGVha3MgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gcmVwb3J0IGdhcmJhZ2UgdGhhdCBpcyBub3QKKyAgICAgICAgICAgICMgZnJlZWFibGUgYnkgcmVmZXJlbmNlIGNvdW50aW5nIGFsb25lLiAgQnkgZGVmYXVsdCBvbmx5CisgICAgICAgICAgICAjIGdhcmJhZ2UgdGhhdCBpcyBub3QgY29sbGVjdGFibGUgYnkgdGhlIEdDIGlzIHJlcG9ydGVkLgorICAgICAgICAgICAgI2djLnNldF9kZWJ1ZyhnYy5ERUJVR19TQVZFQUxMKQorICAgICAgICAgICAgZm91bmRfZ2FyYmFnZSA9IFtdCisKKyAgICBpZiBzaW5nbGU6CisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwgJ3B5bmV4dHRlc3QnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IG9wZW4oZmlsZW5hbWUsICdyJykKKyAgICAgICAgICAgIG5leHRfdGVzdCA9IGZwLnJlYWQoKS5zdHJpcCgpCisgICAgICAgICAgICB0ZXN0cyA9IFtuZXh0X3Rlc3RdCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgaWYgZnJvbWZpbGU6CisgICAgICAgIHRlc3RzID0gW10KKyAgICAgICAgZnAgPSBvcGVuKG9zLnBhdGguam9pbih0ZXN0X3N1cHBvcnQuU0FWRURDV0QsIGZyb21maWxlKSkKKyAgICAgICAgZm9yIGxpbmUgaW4gZnA6CisgICAgICAgICAgICBndXRzID0gbGluZS5zcGxpdCgpICMgYXNzdW1pbmcgbm8gdGVzdCBoYXMgd2hpdGVzcGFjZSBpbiBpdHMgbmFtZQorICAgICAgICAgICAgaWYgZ3V0cyBhbmQgbm90IGd1dHNbMF0uc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgIHRlc3RzLmV4dGVuZChndXRzKQorICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAjIFN0cmlwIC5weSBleHRlbnNpb25zLgorICAgIHJlbW92ZXB5KGFyZ3MpCisgICAgcmVtb3ZlcHkodGVzdHMpCisKKyAgICBzdGR0ZXN0cyA9IFNURFRFU1RTWzpdCisgICAgbm90dGVzdHMgPSBOT1RURVNUUy5jb3B5KCkKKyAgICBpZiBleGNsdWRlOgorICAgICAgICBmb3IgYXJnIGluIGFyZ3M6CisgICAgICAgICAgICBpZiBhcmcgaW4gc3RkdGVzdHM6CisgICAgICAgICAgICAgICAgc3RkdGVzdHMucmVtb3ZlKGFyZykKKyAgICAgICAgICAgIG5vdHRlc3RzLmFkZChhcmcpCisgICAgICAgIGFyZ3MgPSBbXQorCisgICAgIyBGb3IgYSBwYXJ0aWFsIHJ1biwgd2UgZG8gbm90IG5lZWQgdG8gY2x1dHRlciB0aGUgb3V0cHV0LgorICAgIGlmIHZlcmJvc2Ugb3IgaGVhZGVyIG9yIG5vdCAocXVpZXQgb3Igc2luZ2xlIG9yIHRlc3RzIG9yIGFyZ3MpOgorICAgICAgICAjIFByaW50IGJhc2ljIHBsYXRmb3JtIGluZm9ybWF0aW9uCisgICAgICAgIHByaW50ICI9PSIsIHBsYXRmb3JtLnB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLCBcCisgICAgICAgICAgICAgICAgICAgICIgIi5qb2luKHN5cy52ZXJzaW9uLnNwbGl0KCkpCisgICAgICAgIHByaW50ICI9PSAgIiwgcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZD1UcnVlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICIlcy1lbmRpYW4iICUgc3lzLmJ5dGVvcmRlcgorICAgICAgICBwcmludCAiPT0gICIsIG9zLmdldGN3ZCgpCisgICAgICAgIHByaW50ICJUZXN0aW5nIHdpdGggZmxhZ3M6Iiwgc3lzLmZsYWdzCisKKyAgICBhbGx0ZXN0cyA9IGZpbmR0ZXN0cyh0ZXN0ZGlyLCBzdGR0ZXN0cywgbm90dGVzdHMpCisgICAgc2VsZWN0ZWQgPSB0ZXN0cyBvciBhcmdzIG9yIGFsbHRlc3RzCisgICAgaWYgc2luZ2xlOgorICAgICAgICBzZWxlY3RlZCA9IHNlbGVjdGVkWzoxXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0X3NpbmdsZV90ZXN0ID0gYWxsdGVzdHNbYWxsdGVzdHMuaW5kZXgoc2VsZWN0ZWRbMF0pKzFdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgbmV4dF9zaW5nbGVfdGVzdCA9IE5vbmUKKyAgICBpZiByYW5kb21pemU6CisgICAgICAgIHJhbmRvbS5zZWVkKHJhbmRvbV9zZWVkKQorICAgICAgICBwcmludCAiVXNpbmcgcmFuZG9tIHNlZWQiLCByYW5kb21fc2VlZAorICAgICAgICByYW5kb20uc2h1ZmZsZShzZWxlY3RlZCkKKyAgICBpZiB0cmFjZToKKyAgICAgICAgaW1wb3J0IHRyYWNlCisgICAgICAgIHRyYWNlciA9IHRyYWNlLlRyYWNlKGlnbm9yZWRpcnM9W3N5cy5wcmVmaXgsIHN5cy5leGVjX3ByZWZpeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlPUZhbHNlLCBjb3VudD1UcnVlKQorCisgICAgdGVzdF90aW1lcyA9IFtdCisgICAgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSB1c2VfcmVzb3VyY2VzCisgICAgc2F2ZV9tb2R1bGVzID0gc3lzLm1vZHVsZXMua2V5cygpCisKKyAgICBkZWYgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KToKKyAgICAgICAgb2ssIHRlc3RfdGltZSA9IHJlc3VsdAorICAgICAgICB0ZXN0X3RpbWVzLmFwcGVuZCgodGVzdF90aW1lLCB0ZXN0KSkKKyAgICAgICAgaWYgb2sgPT0gUEFTU0VEOgorICAgICAgICAgICAgZ29vZC5hcHBlbmQodGVzdCkKKyAgICAgICAgZWxpZiBvayA9PSBGQUlMRUQ6CisgICAgICAgICAgICBiYWQuYXBwZW5kKHRlc3QpCisgICAgICAgIGVsaWYgb2sgPT0gRU5WX0NIQU5HRUQ6CisgICAgICAgICAgICBiYWQuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICBlbnZpcm9ubWVudF9jaGFuZ2VkLmFwcGVuZCh0ZXN0KQorICAgICAgICBlbGlmIG9rID09IFNLSVBQRUQ6CisgICAgICAgICAgICBza2lwcGVkLmFwcGVuZCh0ZXN0KQorICAgICAgICBlbGlmIG9rID09IFJFU09VUkNFX0RFTklFRDoKKyAgICAgICAgICAgIHNraXBwZWQuYXBwZW5kKHRlc3QpCisgICAgICAgICAgICByZXNvdXJjZV9kZW5pZWRzLmFwcGVuZCh0ZXN0KQorCisgICAgaWYgZm9yZXZlcjoKKyAgICAgICAgZGVmIHRlc3RfZm9yZXZlcih0ZXN0cz1saXN0KHNlbGVjdGVkKSk6CisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB0ZXN0CisgICAgICAgICAgICAgICAgICAgIGlmIGJhZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICB0ZXN0cyA9IHRlc3RfZm9yZXZlcigpCisgICAgZWxzZToKKyAgICAgICAgdGVzdHMgPSBpdGVyKHNlbGVjdGVkKQorCisgICAgaWYgdXNlX21wOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHByaW50ICJNdWx0aXByb2Nlc3Mgb3B0aW9uIHJlcXVpcmVzIHRocmVhZCBzdXBwb3J0IgorICAgICAgICAgICAgc3lzLmV4aXQoMikKKyAgICAgICAgZnJvbSBRdWV1ZSBpbXBvcnQgUXVldWUKKyAgICAgICAgZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRQorICAgICAgICBkZWJ1Z19vdXRwdXRfcGF0ID0gcmUuY29tcGlsZShyIlxbXGQrIHJlZnNcXSQiKQorICAgICAgICBvdXRwdXQgPSBRdWV1ZSgpCisgICAgICAgIGRlZiB0ZXN0c19hbmRfYXJncygpOgorICAgICAgICAgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICAgICAgYXJnc190dXBsZSA9ICgKKyAgICAgICAgICAgICAgICAgICAgKHRlc3QsIHZlcmJvc2UsIHF1aWV0KSwKKyAgICAgICAgICAgICAgICAgICAgZGljdChodW50cmxlYWtzPWh1bnRybGVha3MsIHVzZV9yZXNvdXJjZXM9dXNlX3Jlc291cmNlcykKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgeWllbGQgKHRlc3QsIGFyZ3NfdHVwbGUpCisgICAgICAgIHBlbmRpbmcgPSB0ZXN0c19hbmRfYXJncygpCisgICAgICAgIG9wdF9hcmdzID0gdGVzdF9zdXBwb3J0LmFyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCisgICAgICAgIGJhc2VfY21kID0gW3N5cy5leGVjdXRhYmxlXSArIG9wdF9hcmdzICsgWyctbScsICd0ZXN0LnJlZ3J0ZXN0J10KKyAgICAgICAgZGVmIHdvcmsoKToKKyAgICAgICAgICAgICMgQSB3b3JrZXIgdGhyZWFkLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3QsIGFyZ3NfdHVwbGUgPSBuZXh0KHBlbmRpbmcpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1dCgoTm9uZSwgTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgIyAtRSBpcyBuZWVkZWQgYnkgc29tZSB0ZXN0cywgZS5nLiB0ZXN0X2ltcG9ydAorICAgICAgICAgICAgICAgICAgICBwb3BlbiA9IFBvcGVuKGJhc2VfY21kICsgWyctLXNsYXZlYXJncycsIGpzb24uZHVtcHMoYXJnc190dXBsZSldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9UElQRSwgc3RkZXJyPVBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9KG9zLm5hbWUgIT0gJ250JykpCisgICAgICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcG9wZW4uY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgICAgICAgICAjIFN0cmlwIGxhc3QgcmVmY291bnQgb3V0cHV0IGxpbmUgaWYgaXQgZXhpc3RzLCBzaW5jZSBpdAorICAgICAgICAgICAgICAgICAgICAjIGNvbWVzIGZyb20gdGhlIHNodXRkb3duIG9mIHRoZSBpbnRlcnByZXRlciBpbiB0aGUgc3ViY29tbWFuZC4KKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyID0gZGVidWdfb3V0cHV0X3BhdC5zdWIoIiIsIHN0ZGVycikKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0LCBfLCByZXN1bHQgPSBzdGRvdXQuc3RyaXAoKS5ycGFydGl0aW9uKCJcbiIpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KChOb25lLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBqc29uLmxvYWRzKHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0ID0gdGVzdCsnXG4nK3N0ZG91dAorICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHV0KCh0ZXN0LCBzdGRvdXQucnN0cmlwKCksIHN0ZGVyci5yc3RyaXAoKSwgcmVzdWx0KSkKKyAgICAgICAgICAgIGV4Y2VwdCBCYXNlRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIG91dHB1dC5wdXQoKE5vbmUsIE5vbmUsIE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHdvcmtlcnMgPSBbVGhyZWFkKHRhcmdldD13b3JrKSBmb3IgaSBpbiByYW5nZSh1c2VfbXApXQorICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6CisgICAgICAgICAgICB3b3JrZXIuc3RhcnQoKQorICAgICAgICBmaW5pc2hlZCA9IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgZmluaXNoZWQgPCB1c2VfbXA6CisgICAgICAgICAgICAgICAgdGVzdCwgc3Rkb3V0LCBzdGRlcnIsIHJlc3VsdCA9IG91dHB1dC5nZXQoKQorICAgICAgICAgICAgICAgIGlmIHRlc3QgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoZWQgKz0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHN0ZG91dDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3Rkb3V0CisgICAgICAgICAgICAgICAgaWYgc3RkZXJyOgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIHN0ZGVycgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdFswXSA9PSBJTlRFUlJVUFRFRDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHJlc3VsdFsxXSA9PSAnS2V5Ym9hcmRJbnRlcnJ1cHQnCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0ICAgIyBXaGF0IGVsc2U/CisgICAgICAgICAgICAgICAgYWNjdW11bGF0ZV9yZXN1bHQodGVzdCwgcmVzdWx0KQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IFRydWUKKyAgICAgICAgICAgIHBlbmRpbmcuY2xvc2UoKQorICAgICAgICBmb3Igd29ya2VyIGluIHdvcmtlcnM6CisgICAgICAgICAgICB3b3JrZXIuam9pbigpCisgICAgZWxzZToKKyAgICAgICAgZm9yIHRlc3QgaW4gdGVzdHM6CisgICAgICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICAgICAgcHJpbnQgdGVzdAorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgaWYgdHJhY2U6CisgICAgICAgICAgICAgICAgIyBJZiB3ZSdyZSB0cmFjaW5nIGNvZGUgY292ZXJhZ2UsIHRoZW4gd2UgZG9uJ3QgZXhpdCB3aXRoIHN0YXR1cworICAgICAgICAgICAgICAgICMgaWYgb24gYSBmYWxzZSByZXR1cm4gdmFsdWUgZnJvbSBtYWluLgorICAgICAgICAgICAgICAgIHRyYWNlci5ydW5jdHgoJ3J1bnRlc3QodGVzdCwgdmVyYm9zZSwgcXVpZXQpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHM9Z2xvYmFscygpLCBsb2NhbHM9dmFycygpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJ1bnRlc3QodGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3MpCisgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVfcmVzdWx0KHRlc3QsIHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdmVyYm9zZTMgYW5kIHJlc3VsdFswXSA9PSBGQUlMRUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiUmUtcnVubmluZyB0ZXN0ICVyIGluIHZlcmJvc2UgbW9kZSIgJSB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICBydW50ZXN0KHRlc3QsIFRydWUsIHF1aWV0LCBodW50cmxlYWtzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgaWYgZmluZGxlYWtzOgorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIGlmIGdjLmdhcmJhZ2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJXYXJuaW5nOiB0ZXN0IGNyZWF0ZWQiLCBsZW4oZ2MuZ2FyYmFnZSksCisgICAgICAgICAgICAgICAgICAgIHByaW50ICJ1bmNvbGxlY3RhYmxlIG9iamVjdChzKS4iCisgICAgICAgICAgICAgICAgICAgICMgbW92ZSB0aGUgdW5jb2xsZWN0YWJsZSBvYmplY3RzIHNvbWV3aGVyZSBzbyB3ZSBkb24ndCBzZWUKKyAgICAgICAgICAgICAgICAgICAgIyB0aGVtIGFnYWluCisgICAgICAgICAgICAgICAgICAgIGZvdW5kX2dhcmJhZ2UuZXh0ZW5kKGdjLmdhcmJhZ2UpCisgICAgICAgICAgICAgICAgICAgIGRlbCBnYy5nYXJiYWdlWzpdCisgICAgICAgICAgICAjIFVubG9hZCB0aGUgbmV3bHkgaW1wb3J0ZWQgbW9kdWxlcyAoYmVzdCBlZmZvcnQgZmluYWxpemF0aW9uKQorICAgICAgICAgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzYXZlX21vZHVsZXMgYW5kIG1vZHVsZS5zdGFydHN3aXRoKCJ0ZXN0LiIpOgorICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5sb2FkKG1vZHVsZSkKKworICAgIGlmIGludGVycnVwdGVkOgorICAgICAgICAjIHByaW50IGEgbmV3bGluZSBhZnRlciBeQworICAgICAgICBwcmludAorICAgICAgICBwcmludCAiVGVzdCBzdWl0ZSBpbnRlcnJ1cHRlZCBieSBzaWduYWwgU0lHSU5ULiIKKyAgICAgICAgb21pdHRlZCA9IHNldChzZWxlY3RlZCkgLSBzZXQoZ29vZCkgLSBzZXQoYmFkKSAtIHNldChza2lwcGVkKQorICAgICAgICBwcmludCBjb3VudChsZW4ob21pdHRlZCksICJ0ZXN0IiksICJvbWl0dGVkOiIKKyAgICAgICAgcHJpbnRsaXN0KG9taXR0ZWQpCisgICAgaWYgZ29vZCBhbmQgbm90IHF1aWV0OgorICAgICAgICBpZiBub3QgYmFkIGFuZCBub3Qgc2tpcHBlZCBhbmQgbm90IGludGVycnVwdGVkIGFuZCBsZW4oZ29vZCkgPiAxOgorICAgICAgICAgICAgcHJpbnQgIkFsbCIsCisgICAgICAgIHByaW50IGNvdW50KGxlbihnb29kKSwgInRlc3QiKSwgIk9LLiIKKyAgICBpZiBwcmludF9zbG93OgorICAgICAgICB0ZXN0X3RpbWVzLnNvcnQocmV2ZXJzZT1UcnVlKQorICAgICAgICBwcmludCAiMTAgc2xvd2VzdCB0ZXN0czoiCisgICAgICAgIGZvciB0aW1lLCB0ZXN0IGluIHRlc3RfdGltZXNbOjEwXToKKyAgICAgICAgICAgIHByaW50ICIlczogJS4xZnMiICUgKHRlc3QsIHRpbWUpCisgICAgaWYgYmFkOgorICAgICAgICBiYWQgPSBzZXQoYmFkKSAtIHNldChlbnZpcm9ubWVudF9jaGFuZ2VkKQorICAgICAgICBpZiBiYWQ6CisgICAgICAgICAgICBwcmludCBjb3VudChsZW4oYmFkKSwgInRlc3QiKSwgImZhaWxlZDoiCisgICAgICAgICAgICBwcmludGxpc3QoYmFkKQorICAgICAgICBpZiBlbnZpcm9ubWVudF9jaGFuZ2VkOgorICAgICAgICAgICAgcHJpbnQgInt9IGFsdGVyZWQgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudDoiLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBjb3VudChsZW4oZW52aXJvbm1lbnRfY2hhbmdlZCksICJ0ZXN0IikpCisgICAgICAgICAgICBwcmludGxpc3QoZW52aXJvbm1lbnRfY2hhbmdlZCkKKyAgICBpZiBza2lwcGVkIGFuZCBub3QgcXVpZXQ6CisgICAgICAgIHByaW50IGNvdW50KGxlbihza2lwcGVkKSwgInRlc3QiKSwgInNraXBwZWQ6IgorICAgICAgICBwcmludGxpc3Qoc2tpcHBlZCkKKworICAgICAgICBlID0gX0V4cGVjdGVkU2tpcHMoKQorICAgICAgICBwbGF0ID0gc3lzLnBsYXRmb3JtCisgICAgICAgIGlmIGUuaXN2YWxpZCgpOgorICAgICAgICAgICAgc3VycHJpc2UgPSBzZXQoc2tpcHBlZCkgLSBlLmdldGV4cGVjdGVkKCkgLSBzZXQocmVzb3VyY2VfZGVuaWVkcykKKyAgICAgICAgICAgIGlmIHN1cnByaXNlOgorICAgICAgICAgICAgICAgIHByaW50IGNvdW50KGxlbihzdXJwcmlzZSksICJza2lwIiksIFwKKyAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBvbiIsIHBsYXQgKyAiOiIKKyAgICAgICAgICAgICAgICBwcmludGxpc3Qoc3VycHJpc2UpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJUaG9zZSBza2lwcyBhcmUgYWxsIGV4cGVjdGVkIG9uIiwgcGxhdCArICIuIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgIkFzayBzb21lb25lIHRvIHRlYWNoIHJlZ3J0ZXN0LnB5IGFib3V0IHdoaWNoIHRlc3RzIGFyZSIKKyAgICAgICAgICAgIHByaW50ICJleHBlY3RlZCB0byBnZXQgc2tpcHBlZCBvbiIsIHBsYXQgKyAiLiIKKworICAgIGlmIHZlcmJvc2UyIGFuZCBiYWQ6CisgICAgICAgIHByaW50ICJSZS1ydW5uaW5nIGZhaWxlZCB0ZXN0cyBpbiB2ZXJib3NlIG1vZGUiCisgICAgICAgIGZvciB0ZXN0IGluIGJhZDoKKyAgICAgICAgICAgIHByaW50ICJSZS1ydW5uaW5nIHRlc3QgJXIgaW4gdmVyYm9zZSBtb2RlIiAlIHRlc3QKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC52ZXJib3NlID0gVHJ1ZQorICAgICAgICAgICAgICAgIG9rID0gcnVudGVzdCh0ZXN0LCBUcnVlLCBxdWlldCwgaHVudHJsZWFrcykKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAjIHByaW50IGEgbmV3bGluZSBzZXBhcmF0ZSBmcm9tIHRoZSBeQworICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgaWYgc2luZ2xlOgorICAgICAgICBpZiBuZXh0X3NpbmdsZV90ZXN0OgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKG5leHRfc2luZ2xlX3Rlc3QgKyAnXG4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCisgICAgaWYgdHJhY2U6CisgICAgICAgIHIgPSB0cmFjZXIucmVzdWx0cygpCisgICAgICAgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1UcnVlLCBjb3ZlcmRpcj1jb3ZlcmRpcikKKworICAgIGlmIHJ1bmxlYWtzOgorICAgICAgICBvcy5zeXN0ZW0oImxlYWtzICVkIiAlIG9zLmdldHBpZCgpKQorCisgICAgc3lzLmV4aXQobGVuKGJhZCkgPiAwIG9yIGludGVycnVwdGVkKQorCisKK1NURFRFU1RTID0gWworICAgICd0ZXN0X2dyYW1tYXInLAorICAgICd0ZXN0X29wY29kZXMnLAorICAgICd0ZXN0X2RpY3QnLAorICAgICd0ZXN0X2J1aWx0aW4nLAorICAgICd0ZXN0X2V4Y2VwdGlvbnMnLAorICAgICd0ZXN0X3R5cGVzJywKKyAgICAndGVzdF91bml0dGVzdCcsCisgICAgJ3Rlc3RfZG9jdGVzdCcsCisgICAgJ3Rlc3RfZG9jdGVzdDInLAorXQorCitOT1RURVNUUyA9IHsKKyAgICAndGVzdF9zdXBwb3J0JywKKyAgICAndGVzdF9mdXR1cmUxJywKKyAgICAndGVzdF9mdXR1cmUyJywKK30KKworZGVmIGZpbmR0ZXN0cyh0ZXN0ZGlyPU5vbmUsIHN0ZHRlc3RzPVNURFRFU1RTLCBub3R0ZXN0cz1OT1RURVNUUyk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgYXBwbGljYWJsZSB0ZXN0IG1vZHVsZXMuIiIiCisgICAgdGVzdGRpciA9IGZpbmR0ZXN0ZGlyKHRlc3RkaXIpCisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHRlc3RkaXIpCisgICAgdGVzdHMgPSBbXQorICAgIG90aGVycyA9IHNldChzdGR0ZXN0cykgfCBub3R0ZXN0cworICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBtb2RuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KG5hbWUpCisgICAgICAgIGlmIG1vZG5hbWVbOjVdID09ICJ0ZXN0XyIgYW5kIGV4dCA9PSAiLnB5IiBhbmQgbW9kbmFtZSBub3QgaW4gb3RoZXJzOgorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKG1vZG5hbWUpCisgICAgcmV0dXJuIHN0ZHRlc3RzICsgc29ydGVkKHRlc3RzKQorCitkZWYgcnVudGVzdCh0ZXN0LCB2ZXJib3NlLCBxdWlldCwKKyAgICAgICAgICAgIGh1bnRybGVha3M9RmFsc2UsIHVzZV9yZXNvdXJjZXM9Tm9uZSk6CisgICAgIiIiUnVuIGEgc2luZ2xlIHRlc3QuCisKKyAgICB0ZXN0IC0tIHRoZSBuYW1lIG9mIHRoZSB0ZXN0CisgICAgdmVyYm9zZSAtLSBpZiB0cnVlLCBwcmludCBtb3JlIG1lc3NhZ2VzCisgICAgcXVpZXQgLS0gaWYgdHJ1ZSwgZG9uJ3QgcHJpbnQgJ3NraXBwZWQnIG1lc3NhZ2VzIChwcm9iYWJseSByZWR1bmRhbnQpCisgICAgdGVzdF90aW1lcyAtLSBhIGxpc3Qgb2YgKHRpbWUsIHRlc3RfbmFtZSkgcGFpcnMKKyAgICBodW50cmxlYWtzIC0tIHJ1biBtdWx0aXBsZSB0aW1lcyB0byB0ZXN0IGZvciBsZWFrczsgcmVxdWlyZXMgYSBkZWJ1ZworICAgICAgICAgICAgICAgICAgYnVpbGQ7IGEgdHJpcGxlIGNvcnJlc3BvbmRpbmcgdG8gLVIncyB0aHJlZSBhcmd1bWVudHMKKyAgICBSZXR1cm5zIG9uZSBvZiB0aGUgdGVzdCByZXN1bHQgY29uc3RhbnRzOgorICAgICAgICBJTlRFUlJVUFRFRCAgICAgIEtleWJvYXJkSW50ZXJydXB0IHdoZW4gcnVuIHVuZGVyIC1qCisgICAgICAgIFJFU09VUkNFX0RFTklFRCAgdGVzdCBza2lwcGVkIGJlY2F1c2UgcmVzb3VyY2UgZGVuaWVkCisgICAgICAgIFNLSVBQRUQgICAgICAgICAgdGVzdCBza2lwcGVkIGZvciBzb21lIG90aGVyIHJlYXNvbgorICAgICAgICBFTlZfQ0hBTkdFRCAgICAgIHRlc3QgZmFpbGVkIGJlY2F1c2UgaXQgY2hhbmdlZCB0aGUgZXhlY3V0aW9uIGVudmlyb25tZW50CisgICAgICAgIEZBSUxFRCAgICAgICAgICAgdGVzdCBmYWlsZWQKKyAgICAgICAgUEFTU0VEICAgICAgICAgICB0ZXN0IHBhc3NlZAorICAgICIiIgorCisgICAgdGVzdF9zdXBwb3J0LnZlcmJvc2UgPSB2ZXJib3NlICAjIFRlbGwgdGVzdHMgdG8gYmUgbW9kZXJhdGVseSBxdWlldAorICAgIGlmIHVzZV9yZXNvdXJjZXMgaXMgbm90IE5vbmU6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gdXNlX3Jlc291cmNlcworICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHJ1bnRlc3RfaW5uZXIodGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3MpCisgICAgZmluYWxseToKKyAgICAgICAgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0LCB2ZXJib3NlKQorCisKKyMgVW5pdCB0ZXN0cyBhcmUgc3VwcG9zZWQgdG8gbGVhdmUgdGhlIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCB1bmNoYW5nZWQKKyMgb25jZSB0aGV5IGNvbXBsZXRlLiAgQnV0IHNvbWV0aW1lcyB0ZXN0cyBoYXZlIGJ1Z3MsIGVzcGVjaWFsbHkgd2hlbgorIyB0ZXN0cyBmYWlsLCBhbmQgdGhlIGNoYW5nZXMgdG8gZW52aXJvbm1lbnQgZ28gb24gdG8gbWVzcyB1cCBvdGhlcgorIyB0ZXN0cy4gIFRoaXMgY2FuIGNhdXNlIGlzc3VlcyB3aXRoIGJ1aWxkYm90IHN0YWJpbGl0eSwgc2luY2UgdGVzdHMKKyMgYXJlIHJ1biBpbiByYW5kb20gb3JkZXIgYW5kIHNvIHByb2JsZW1zIG1heSBhcHBlYXIgdG8gY29tZSBhbmQgZ28uCisjIFRoZXJlIGFyZSBhIGZldyB0aGluZ3Mgd2UgY2FuIHNhdmUgYW5kIHJlc3RvcmUgdG8gbWl0aWdhdGUgdGhpcywgYW5kCisjIHRoZSBmb2xsb3dpbmcgY29udGV4dCBtYW5hZ2VyIGhhbmRsZXMgdGhpcyB0YXNrLgorCitjbGFzcyBzYXZlZF90ZXN0X2Vudmlyb25tZW50OgorICAgICIiIlNhdmUgYml0cyBvZiB0aGUgdGVzdCBlbnZpcm9ubWVudCBhbmQgcmVzdG9yZSB0aGVtIGF0IGJsb2NrIGV4aXQuCisKKyAgICAgICAgd2l0aCBzYXZlZF90ZXN0X2Vudmlyb25tZW50KHRlc3RuYW1lLCB2ZXJib3NlLCBxdWlldCk6CisgICAgICAgICAgICAjc3R1ZmYKKworICAgIFVubGVzcyBxdWlldCBpcyBUcnVlLCBhIHdhcm5pbmcgaXMgcHJpbnRlZCB0byBzdGRlcnIgaWYgYW55IG9mCisgICAgdGhlIHNhdmVkIGl0ZW1zIHdhcyBjaGFuZ2VkIGJ5IHRoZSB0ZXN0LiAgVGhlIGF0dHJpYnV0ZSAnY2hhbmdlZCcKKyAgICBpcyBpbml0aWFsbHkgRmFsc2UsIGJ1dCBpcyBzZXQgdG8gVHJ1ZSBpZiBhIGNoYW5nZSBpcyBkZXRlY3RlZC4KKworICAgIElmIHZlcmJvc2UgaXMgbW9yZSB0aGFuIDEsIHRoZSBiZWZvcmUgYW5kIGFmdGVyIHN0YXRlIG9mIGNoYW5nZWQKKyAgICBpdGVtcyBpcyBhbHNvIHByaW50ZWQuCisgICAgIiIiCisKKyAgICBjaGFuZ2VkID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0bmFtZSwgdmVyYm9zZT0wLCBxdWlldD1GYWxzZSk6CisgICAgICAgIHNlbGYudGVzdG5hbWUgPSB0ZXN0bmFtZQorICAgICAgICBzZWxmLnZlcmJvc2UgPSB2ZXJib3NlCisgICAgICAgIHNlbGYucXVpZXQgPSBxdWlldAorCisgICAgIyBUbyBhZGQgdGhpbmdzIHRvIHNhdmUgYW5kIHJlc3RvcmUsIGFkZCBhIG5hbWUgWFhYIHRvIHRoZSByZXNvdXJjZXMgbGlzdAorICAgICMgYW5kIGFkZCBjb3JyZXNwb25kaW5nIGdldF9YWFgvcmVzdG9yZV9YWFggZnVuY3Rpb25zLiAgZ2V0X1hYWCBzaG91bGQKKyAgICAjIHJldHVybiB0aGUgdmFsdWUgdG8gYmUgc2F2ZWQgYW5kIGNvbXBhcmVkIGFnYWluc3QgYSBzZWNvbmQgY2FsbCB0byB0aGUKKyAgICAjIGdldCBmdW5jdGlvbiB3aGVuIHRlc3QgZXhlY3V0aW9uIGNvbXBsZXRlcy4gIHJlc3RvcmVfWFhYIHNob3VsZCBhY2NlcHQKKyAgICAjIHRoZSBzYXZlZCB2YWx1ZSBhbmQgcmVzdG9yZSB0aGUgcmVzb3VyY2UgdXNpbmcgaXQuICBJdCB3aWxsIGJlIGNhbGxlZCBpZgorICAgICMgYW5kIG9ubHkgaWYgYSBjaGFuZ2UgaW4gdGhlIHZhbHVlIGlzIGRldGVjdGVkLgorICAgICMKKyAgICAjIE5vdGU6IFhYWCB3aWxsIGhhdmUgYW55ICcuJyByZXBsYWNlZCB3aXRoICdfJyBjaGFyYWN0ZXJzIHdoZW4gZGV0ZXJtaW5pbmcKKyAgICAjIHRoZSBjb3JyZXNwb25kaW5nIG1ldGhvZCBuYW1lcy4KKworICAgIHJlc291cmNlcyA9ICgnc3lzLmFyZ3YnLCAnY3dkJywgJ3N5cy5zdGRpbicsICdzeXMuc3Rkb3V0JywgJ3N5cy5zdGRlcnInLAorICAgICAgICAgICAgICAgICAnb3MuZW52aXJvbicsICdzeXMucGF0aCcsICdhc3luY29yZS5zb2NrZXRfbWFwJywKKyAgICAgICAgICAgICAgICAgJ3Rlc3Rfc3VwcG9ydC5URVNURk4nLAorICAgICAgICAgICAgICAgICkKKworICAgIGRlZiBnZXRfc3lzX2FyZ3Yoc2VsZik6CisgICAgICAgIHJldHVybiBpZChzeXMuYXJndiksIHN5cy5hcmd2LCBzeXMuYXJndls6XQorICAgIGRlZiByZXN0b3JlX3N5c19hcmd2KHNlbGYsIHNhdmVkX2FyZ3YpOgorICAgICAgICBzeXMuYXJndiA9IHNhdmVkX2FyZ3ZbMV0KKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlZF9hcmd2WzJdCisKKyAgICBkZWYgZ2V0X2N3ZChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLmdldGN3ZCgpCisgICAgZGVmIHJlc3RvcmVfY3dkKHNlbGYsIHNhdmVkX2N3ZCk6CisgICAgICAgIG9zLmNoZGlyKHNhdmVkX2N3ZCkKKworICAgIGRlZiBnZXRfc3lzX3N0ZG91dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRvdXQKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3Rkb3V0KHNlbGYsIHNhdmVkX3N0ZG91dCk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlZF9zdGRvdXQKKworICAgIGRlZiBnZXRfc3lzX3N0ZGVycihzZWxmKToKKyAgICAgICAgcmV0dXJuIHN5cy5zdGRlcnIKKyAgICBkZWYgcmVzdG9yZV9zeXNfc3RkZXJyKHNlbGYsIHNhdmVkX3N0ZGVycik6CisgICAgICAgIHN5cy5zdGRlcnIgPSBzYXZlZF9zdGRlcnIKKworICAgIGRlZiBnZXRfc3lzX3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc3lzLnN0ZGluCisgICAgZGVmIHJlc3RvcmVfc3lzX3N0ZGluKHNlbGYsIHNhdmVkX3N0ZGluKToKKyAgICAgICAgc3lzLnN0ZGluID0gc2F2ZWRfc3RkaW4KKworICAgIGRlZiBnZXRfb3NfZW52aXJvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIGlkKG9zLmVudmlyb24pLCBvcy5lbnZpcm9uLCBkaWN0KG9zLmVudmlyb24pCisgICAgZGVmIHJlc3RvcmVfb3NfZW52aXJvbihzZWxmLCBzYXZlZF9lbnZpcm9uKToKKyAgICAgICAgb3MuZW52aXJvbiA9IHNhdmVkX2Vudmlyb25bMV0KKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNhdmVkX2Vudmlyb25bMl0pCisKKyAgICBkZWYgZ2V0X3N5c19wYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gaWQoc3lzLnBhdGgpLCBzeXMucGF0aCwgc3lzLnBhdGhbOl0KKyAgICBkZWYgcmVzdG9yZV9zeXNfcGF0aChzZWxmLCBzYXZlZF9wYXRoKToKKyAgICAgICAgc3lzLnBhdGggPSBzYXZlZF9wYXRoWzFdCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2F2ZWRfcGF0aFsyXQorCisgICAgZGVmIGdldF9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYpOgorICAgICAgICBhc3luY29yZSA9IHN5cy5tb2R1bGVzLmdldCgnYXN5bmNvcmUnKQorICAgICAgICAjIFhYWCBNYWtpbmcgYSBjb3B5IGtlZXBzIG9iamVjdHMgYWxpdmUgdW50aWwgX19leGl0X18gZ2V0cyBjYWxsZWQuCisgICAgICAgIHJldHVybiBhc3luY29yZSBhbmQgYXN5bmNvcmUuc29ja2V0X21hcC5jb3B5KCkgb3Ige30KKyAgICBkZWYgcmVzdG9yZV9hc3luY29yZV9zb2NrZXRfbWFwKHNlbGYsIHNhdmVkX21hcCk6CisgICAgICAgIGFzeW5jb3JlID0gc3lzLm1vZHVsZXMuZ2V0KCdhc3luY29yZScpCisgICAgICAgIGlmIGFzeW5jb3JlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKGlnbm9yZV9hbGw9VHJ1ZSkKKyAgICAgICAgICAgIGFzeW5jb3JlLnNvY2tldF9tYXAudXBkYXRlKHNhdmVkX21hcCkKKworICAgIGRlZiBnZXRfdGVzdF9zdXBwb3J0X1RFU1RGTihzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICByZXN1bHQgPSAnZicKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pOgorICAgICAgICAgICAgcmVzdWx0ID0gJ2QnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIHJldHVybiByZXN1bHQKKyAgICBkZWYgcmVzdG9yZV90ZXN0X3N1cHBvcnRfVEVTVEZOKHNlbGYsIHNhdmVkX3ZhbHVlKToKKyAgICAgICAgaWYgc2F2ZWRfdmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pOgorICAgICAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pOgorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiByZXNvdXJjZV9pbmZvKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLnJlc291cmNlczoKKyAgICAgICAgICAgIG1ldGhvZF9zdWZmaXggPSBuYW1lLnJlcGxhY2UoJy4nLCAnXycpCisgICAgICAgICAgICBnZXRfbmFtZSA9ICdnZXRfJyArIG1ldGhvZF9zdWZmaXgKKyAgICAgICAgICAgIHJlc3RvcmVfbmFtZSA9ICdyZXN0b3JlXycgKyBtZXRob2Rfc3VmZml4CisgICAgICAgICAgICB5aWVsZCBuYW1lLCBnZXRhdHRyKHNlbGYsIGdldF9uYW1lKSwgZ2V0YXR0cihzZWxmLCByZXN0b3JlX25hbWUpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLnNhdmVkX3ZhbHVlcyA9IGRpY3QoKG5hbWUsIGdldCgpKSBmb3IgbmFtZSwgZ2V0LCByZXN0b3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzZWxmLnJlc291cmNlX2luZm8oKSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbCwgZXhjX3RiKToKKyAgICAgICAgc2F2ZWRfdmFsdWVzID0gc2VsZi5zYXZlZF92YWx1ZXMKKyAgICAgICAgZGVsIHNlbGYuc2F2ZWRfdmFsdWVzCisgICAgICAgIGZvciBuYW1lLCBnZXQsIHJlc3RvcmUgaW4gc2VsZi5yZXNvdXJjZV9pbmZvKCk6CisgICAgICAgICAgICBjdXJyZW50ID0gZ2V0KCkKKyAgICAgICAgICAgIG9yaWdpbmFsID0gc2F2ZWRfdmFsdWVzLnBvcChuYW1lKQorICAgICAgICAgICAgIyBDaGVjayBmb3IgY2hhbmdlcyB0byB0aGUgcmVzb3VyY2UncyB2YWx1ZQorICAgICAgICAgICAgaWYgY3VycmVudCAhPSBvcmlnaW5hbDoKKyAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmVzdG9yZShvcmlnaW5hbCkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5xdWlldDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICJXYXJuaW5nIC0tIHt9IHdhcyBtb2RpZmllZCBieSB7fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHNlbGYudGVzdG5hbWUpKQorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2UgPiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBCZWZvcmU6IHt9XG4gIEFmdGVyOiAge30gIi5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLCBjdXJyZW50KSkKKyAgICAgICAgICAgICMgWFhYIChuY29naGxhbik6IGZvciBtb3N0IHJlc291cmNlcyAoZS5nLiBzeXMucGF0aCkgaWRlbnRpdHkKKyAgICAgICAgICAgICMgbWF0dGVycyBhdCBsZWFzdCBhcyBtdWNoIGFzIHZhbHVlLiBGb3Igb3RoZXJzIChlLmcuIGN3ZCksCisgICAgICAgICAgICAjIGlkZW50aXR5IGlzIGlycmVsZXZhbnQuIFNob3VsZCB3ZSBhZGQgYSBtZWNoYW5pc20gdG8gY2hlY2sKKyAgICAgICAgICAgICMgZm9yIHN1YnN0aXR1dGlvbiBpbiB0aGUgY2FzZXMgd2hlcmUgaXQgbWF0dGVycz8KKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworZGVmIHJ1bnRlc3RfaW5uZXIodGVzdCwgdmVyYm9zZSwgcXVpZXQsIGh1bnRybGVha3M9RmFsc2UpOgorICAgIHRlc3Rfc3VwcG9ydC51bmxvYWQodGVzdCkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBjYXB0dXJlX3N0ZG91dCA9IE5vbmUKKyAgICBlbHNlOgorICAgICAgICBjYXB0dXJlX3N0ZG91dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKworICAgIHRlc3RfdGltZSA9IDAuMAorICAgIHJlZmxlYWsgPSBGYWxzZSAgIyBUcnVlIGlmIHRoZSB0ZXN0IGxlYWtlZCByZWZlcmVuY2VzLgorICAgIHRyeToKKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGNhcHR1cmVfc3Rkb3V0OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBjYXB0dXJlX3N0ZG91dAorICAgICAgICAgICAgaWYgdGVzdC5zdGFydHN3aXRoKCd0ZXN0LicpOgorICAgICAgICAgICAgICAgIGFic3Rlc3QgPSB0ZXN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgQWx3YXlzIGltcG9ydCBpdCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UKKyAgICAgICAgICAgICAgICBhYnN0ZXN0ID0gJ3Rlc3QuJyArIHRlc3QKKyAgICAgICAgICAgIHdpdGggc2F2ZWRfdGVzdF9lbnZpcm9ubWVudCh0ZXN0LCB2ZXJib3NlLCBxdWlldCkgYXMgZW52aXJvbm1lbnQ6CisgICAgICAgICAgICAgICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICAgICAgdGhlX3BhY2thZ2UgPSBfX2ltcG9ydF9fKGFic3Rlc3QsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFtdKQorICAgICAgICAgICAgICAgIHRoZV9tb2R1bGUgPSBnZXRhdHRyKHRoZV9wYWNrYWdlLCB0ZXN0KQorICAgICAgICAgICAgICAgICMgT2xkIHRlc3RzIHJ1biB0byBjb21wbGV0aW9uIHNpbXBseSBhcyBhIHNpZGUtZWZmZWN0IG9mCisgICAgICAgICAgICAgICAgIyBiZWluZyBpbXBvcnRlZC4gIEZvciB0ZXN0cyBiYXNlZCBvbiB1bml0dGVzdCBvciBkb2N0ZXN0LAorICAgICAgICAgICAgICAgICMgZXhwbGljaXRseSBpbnZva2UgdGhlaXIgdGVzdF9tYWluKCkgZnVuY3Rpb24gKGlmIGl0IGV4aXN0cykuCisgICAgICAgICAgICAgICAgaW5kaXJlY3RfdGVzdCA9IGdldGF0dHIodGhlX21vZHVsZSwgInRlc3RfbWFpbiIsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgaW5kaXJlY3RfdGVzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RfdGVzdCgpCisgICAgICAgICAgICAgICAgaWYgaHVudHJsZWFrczoKKyAgICAgICAgICAgICAgICAgICAgcmVmbGVhayA9IGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaHVudHJsZWFrcykKKyAgICAgICAgICAgICAgICB0ZXN0X3RpbWUgPSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorICAgIGV4Y2VwdCB0ZXN0X3N1cHBvcnQuUmVzb3VyY2VEZW5pZWQsIG1zZzoKKyAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgcHJpbnQgdGVzdCwgInNraXBwZWQgLS0iLCBtc2cKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICByZXR1cm4gUkVTT1VSQ0VfREVOSUVELCB0ZXN0X3RpbWUKKyAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QsIG1zZzoKKyAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgcHJpbnQgdGVzdCwgInNraXBwZWQgLS0iLCBtc2cKKyAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICByZXR1cm4gU0tJUFBFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICByYWlzZQorICAgIGV4Y2VwdCB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgbXNnOgorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJ0ZXN0IiwgdGVzdCwgImZhaWxlZCAtLSIsIG1zZworICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZXhjZXB0OgorICAgICAgICB0eXBlLCB2YWx1ZSA9IHN5cy5leGNfaW5mbygpWzoyXQorICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJ0ZXN0IiwgdGVzdCwgImNyYXNoZWQgLS0iLCBzdHIodHlwZSkgKyAiOiIsIHZhbHVlCisgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPXN5cy5zdGRlcnIpCisgICAgICAgICAgICBzeXMuc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgcmV0dXJuIEZBSUxFRCwgdGVzdF90aW1lCisgICAgZWxzZToKKyAgICAgICAgaWYgcmVmbGVhazoKKyAgICAgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorICAgICAgICBpZiBlbnZpcm9ubWVudC5jaGFuZ2VkOgorICAgICAgICAgICAgcmV0dXJuIEVOVl9DSEFOR0VELCB0ZXN0X3RpbWUKKyAgICAgICAgIyBFeGNlcHQgaW4gdmVyYm9zZSBtb2RlLCB0ZXN0cyBzaG91bGQgbm90IHByaW50IGFueXRoaW5nCisgICAgICAgIGlmIHZlcmJvc2Ugb3IgaHVudHJsZWFrczoKKyAgICAgICAgICAgIHJldHVybiBQQVNTRUQsIHRlc3RfdGltZQorICAgICAgICBvdXRwdXQgPSBjYXB0dXJlX3N0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgIGlmIG5vdCBvdXRwdXQ6CisgICAgICAgICAgICByZXR1cm4gUEFTU0VELCB0ZXN0X3RpbWUKKyAgICAgICAgcHJpbnQgInRlc3QiLCB0ZXN0LCAicHJvZHVjZWQgdW5leHBlY3RlZCBvdXRwdXQ6IgorICAgICAgICBwcmludCAiKiIgKiA3MAorICAgICAgICBwcmludCBvdXRwdXQKKyAgICAgICAgcHJpbnQgIioiICogNzAKKyAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHJldHVybiBGQUlMRUQsIHRlc3RfdGltZQorCitkZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6CisgICAgaW1wb3J0IHN0YXQKKyAgICBpbXBvcnQgZ2MKKworICAgICMgRmlyc3Qga2lsbCBhbnkgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byBvcGVuIGZpbGVzIGV0Yy4KKyAgICBnYy5jb2xsZWN0KCkKKworICAgICMgVHJ5IHRvIGNsZWFuIHVwIGp1bmsgY29tbW9ubHkgbGVmdCBiZWhpbmQuICBXaGlsZSB0ZXN0cyBzaG91bGRuJ3QgbGVhdmUKKyAgICAjIGFueSBmaWxlcyBvciBkaXJlY3RvcmllcyBiZWhpbmQsIHdoZW4gYSB0ZXN0IGZhaWxzIHRoYXQgY2FuIGJlIHRlZGlvdXMKKyAgICAjIGZvciBpdCB0byBhcnJhbmdlLiAgVGhlIGNvbnNlcXVlbmNlcyBjYW4gYmUgZXNwZWNpYWxseSBuYXN0eSBvbiBXaW5kb3dzLAorICAgICMgc2luY2UgaWYgYSB0ZXN0IGxlYXZlcyBhIGZpbGUgb3BlbiwgaXQgY2Fubm90IGJlIGRlbGV0ZWQgYnkgbmFtZSAod2hpbGUKKyAgICAjIHRoZXJlJ3Mgbm90aGluZyB3ZSBjYW4gZG8gYWJvdXQgdGhhdCBoZXJlIGVpdGhlciwgd2UgY2FuIGRpc3BsYXkgdGhlCisgICAgIyBuYW1lIG9mIHRoZSBvZmZlbmRpbmcgdGVzdCwgd2hpY2ggaXMgYSByZWFsIGhlbHApLgorICAgIGZvciBuYW1lIGluICh0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAiZGJfaG9tZSIsCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG5hbWUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZGlyZWN0b3J5Iiwgc2h1dGlsLnJtdHJlZQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKG5hbWUpOgorICAgICAgICAgICAga2luZCwgbnVrZXIgPSAiZmlsZSIsIG9zLnVubGluaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IoIm9zLnBhdGggc2F5cyAlciBleGlzdHMgYnV0IGlzIG5laXRoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSBub3IgZmlsZSIgJSBuYW1lKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiJXIgbGVmdCBiZWhpbmQgJXMgJXIiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGlmIHdlIGhhdmUgY2htb2QsIGZpeCBwb3NzaWJsZSBwZXJtaXNzaW9ucyBwcm9ibGVtcworICAgICAgICAgICAgIyB0aGF0IG1pZ2h0IHByZXZlbnQgY2xlYW51cAorICAgICAgICAgICAgaWYgKGhhc2F0dHIob3MsICdjaG1vZCcpKToKKyAgICAgICAgICAgICAgICBvcy5jaG1vZChuYW1lLCBzdGF0LlNfSVJXWFUgfCBzdGF0LlNfSVJXWEcgfCBzdGF0LlNfSVJXWE8pCisgICAgICAgICAgICBudWtlcihuYW1lKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBtc2c6CisgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAoIiVyIGxlZnQgYmVoaW5kICVzICVyIGFuZCBpdCBjb3VsZG4ndCBiZSAiCisgICAgICAgICAgICAgICAgInJlbW92ZWQ6ICVzIiAlICh0ZXN0bmFtZSwga2luZCwgbmFtZSwgbXNnKSkKKworZGVmIGRhc2hfUih0aGVfbW9kdWxlLCB0ZXN0LCBpbmRpcmVjdF90ZXN0LCBodW50cmxlYWtzKToKKyAgICAiIiJSdW4gYSB0ZXN0IG11bHRpcGxlIHRpbWVzLCBsb29raW5nIGZvciByZWZlcmVuY2UgbGVha3MuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBGYWxzZSBpZiB0aGUgdGVzdCBkaWRuJ3QgbGVhayByZWZlcmVuY2VzOyBUcnVlIGlmIHdlIGRldGVjdGVkIHJlZmxlYWtzLgorICAgICIiIgorICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCisgICAgaW1wb3J0IGNvcHlfcmVnLCBfYWJjb2xsLCBfcHlpbworCisgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAnZ2V0dG90YWxyZWZjb3VudCcpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRyYWNraW5nIHJlZmVyZW5jZSBsZWFrcyByZXF1aXJlcyBhIGRlYnVnIGJ1aWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvZiBQeXRob24iKQorCisgICAgIyBTYXZlIGN1cnJlbnQgdmFsdWVzIGZvciBkYXNoX1JfY2xlYW51cCgpIHRvIHJlc3RvcmUuCisgICAgZnMgPSB3YXJuaW5ncy5maWx0ZXJzWzpdCisgICAgcHMgPSBjb3B5X3JlZy5kaXNwYXRjaF90YWJsZS5jb3B5KCkKKyAgICBwaWMgPSBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZS5jb3B5KCkKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB6aXBpbXBvcnQKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHpkYyA9IE5vbmUgIyBSdW4gdW5tb2RpZmllZCBvbiBwbGF0Zm9ybXMgd2l0aG91dCB6aXBpbXBvcnQgc3VwcG9ydAorICAgIGVsc2U6CisgICAgICAgIHpkYyA9IHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jb3B5KCkKKyAgICBhYmNzID0ge30KKyAgICBtb2R1bGVzID0gX2FiY29sbCwgX3B5aW8KKyAgICBmb3IgYWJjIGluIFtnZXRhdHRyKG1vZCwgYSkgZm9yIG1vZCBpbiBtb2R1bGVzIGZvciBhIGluIG1vZC5fX2FsbF9fXToKKyAgICAgICAgIyBYWFggaXNpbnN0YW5jZShhYmMsIEFCQ01ldGEpIGxlYWRzIHRvIGluZmluaXRlIHJlY3Vyc2lvbgorICAgICAgICBpZiBub3QgaGFzYXR0cihhYmMsICdfYWJjX3JlZ2lzdHJ5Jyk6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3Igb2JqIGluIGFiYy5fX3N1YmNsYXNzZXNfXygpICsgW2FiY106CisgICAgICAgICAgICBhYmNzW29ial0gPSBvYmouX2FiY19yZWdpc3RyeS5jb3B5KCkKKworICAgIGlmIGluZGlyZWN0X3Rlc3Q6CisgICAgICAgIGRlZiBydW5fdGhlX3Rlc3QoKToKKyAgICAgICAgICAgIGluZGlyZWN0X3Rlc3QoKQorICAgIGVsc2U6CisgICAgICAgIGRlZiBydW5fdGhlX3Rlc3QoKToKKyAgICAgICAgICAgIGltcC5yZWxvYWQodGhlX21vZHVsZSkKKworICAgIGRlbHRhcyA9IFtdCisgICAgbndhcm11cCwgbnRyYWNrZWQsIGZuYW1lID0gaHVudHJsZWFrcworICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHRlc3Rfc3VwcG9ydC5TQVZFRENXRCwgZm5hbWUpCisgICAgcmVwY291bnQgPSBud2FybXVwICsgbnRyYWNrZWQKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiYmVnaW5uaW5nIiwgcmVwY291bnQsICJyZXBldGl0aW9ucyIKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAoIjEyMzQ1Njc4OTAiKihyZXBjb3VudC8vMTAgKyAxKSlbOnJlcGNvdW50XQorICAgIGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljLCB6ZGMsIGFiY3MpCisgICAgZm9yIGkgaW4gcmFuZ2UocmVwY291bnQpOgorICAgICAgICByY19iZWZvcmUgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHJ1bl90aGVfdGVzdCgpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJy4nKQorICAgICAgICBkYXNoX1JfY2xlYW51cChmcywgcHMsIHBpYywgemRjLCBhYmNzKQorICAgICAgICByY19hZnRlciA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgaWYgaSA+PSBud2FybXVwOgorICAgICAgICAgICAgZGVsdGFzLmFwcGVuZChyY19hZnRlciAtIHJjX2JlZm9yZSkKKyAgICBwcmludCA+PiBzeXMuc3RkZXJyCisgICAgaWYgYW55KGRlbHRhcyk6CisgICAgICAgIG1zZyA9ICclcyBsZWFrZWQgJXMgcmVmZXJlbmNlcywgc3VtPSVzJyAlICh0ZXN0LCBkZWx0YXMsIHN1bShkZWx0YXMpKQorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBtc2cKKyAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAiYSIpIGFzIHJlZnJlcDoKKyAgICAgICAgICAgIHByaW50ID4+IHJlZnJlcCwgbXNnCisgICAgICAgICAgICByZWZyZXAuZmx1c2goKQorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCitkZWYgZGFzaF9SX2NsZWFudXAoZnMsIHBzLCBwaWMsIHpkYywgYWJjcyk6CisgICAgaW1wb3J0IGdjLCBjb3B5X3JlZworICAgIGltcG9ydCBfc3RycHRpbWUsIGxpbmVjYWNoZQorICAgIGRpcmNhY2hlID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2RpcmNhY2hlJywgZGVwcmVjYXRlZD1UcnVlKQorICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliLCB1cmxsaWIyLCBtaW1ldHlwZXMsIGRvY3Rlc3QKKyAgICBpbXBvcnQgc3RydWN0LCBmaWxlY21wCisgICAgZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IF9wYXRoX2NyZWF0ZWQKKworICAgICMgQ2xlYXIgdGhlIHdhcm5pbmdzIHJlZ2lzdHJ5LCBzbyB0aGV5IGNhbiBiZSBkaXNwbGF5ZWQgYWdhaW4KKyAgICBmb3IgbW9kIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgorICAgICAgICBpZiBoYXNhdHRyKG1vZCwgJ19fd2FybmluZ3JlZ2lzdHJ5X18nKToKKyAgICAgICAgICAgIGRlbCBtb2QuX193YXJuaW5ncmVnaXN0cnlfXworCisgICAgIyBSZXN0b3JlIHNvbWUgb3JpZ2luYWwgdmFsdWVzLgorICAgIHdhcm5pbmdzLmZpbHRlcnNbOl0gPSBmcworICAgIGNvcHlfcmVnLmRpc3BhdGNoX3RhYmxlLmNsZWFyKCkKKyAgICBjb3B5X3JlZy5kaXNwYXRjaF90YWJsZS51cGRhdGUocHMpCisgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQorICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnVwZGF0ZShwaWMpCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzICMgUnVuIHVubW9kaWZpZWQgb24gcGxhdGZvcm1zIHdpdGhvdXQgemlwaW1wb3J0IHN1cHBvcnQKKyAgICBlbHNlOgorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUudXBkYXRlKHpkYykKKworICAgICMgY2xlYXIgdHlwZSBjYWNoZQorICAgIHN5cy5fY2xlYXJfdHlwZV9jYWNoZSgpCisKKyAgICAjIENsZWFyIEFCQyByZWdpc3RyaWVzLCByZXN0b3JpbmcgcHJldmlvdXNseSBzYXZlZCBBQkMgcmVnaXN0cmllcy4KKyAgICBmb3IgYWJjLCByZWdpc3RyeSBpbiBhYmNzLml0ZW1zKCk6CisgICAgICAgIGFiYy5fYWJjX3JlZ2lzdHJ5ID0gcmVnaXN0cnkuY29weSgpCisgICAgICAgIGFiYy5fYWJjX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgYWJjLl9hYmNfbmVnYXRpdmVfY2FjaGUuY2xlYXIoKQorCisgICAgIyBDbGVhciBhc3NvcnRlZCBtb2R1bGUgY2FjaGVzLgorICAgIF9wYXRoX2NyZWF0ZWQuY2xlYXIoKQorICAgIHJlLnB1cmdlKCkKKyAgICBfc3RycHRpbWUuX3JlZ2V4X2NhY2hlLmNsZWFyKCkKKyAgICB1cmxwYXJzZS5jbGVhcl9jYWNoZSgpCisgICAgdXJsbGliLnVybGNsZWFudXAoKQorICAgIHVybGxpYjIuaW5zdGFsbF9vcGVuZXIoTm9uZSkKKyAgICBkaXJjYWNoZS5yZXNldCgpCisgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgIG1pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKKyAgICBmaWxlY21wLl9jYWNoZS5jbGVhcigpCisgICAgc3RydWN0Ll9jbGVhcmNhY2hlKCkKKyAgICBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICMgRG9uJ3Qgd29ycnkgYWJvdXQgcmVzZXR0aW5nIHRoZSBjYWNoZSBpZiBjdHlwZXMgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgY3R5cGVzLl9yZXNldF9jYWNoZSgpCisKKyAgICAjIENvbGxlY3QgY3ljbGljIHRyYXNoLgorICAgIGdjLmNvbGxlY3QoKQorCitkZWYgZmluZHRlc3RkaXIocGF0aD1Ob25lKToKKyAgICByZXR1cm4gcGF0aCBvciBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpcgorCitkZWYgcmVtb3ZlcHkobmFtZXMpOgorICAgIGlmIG5vdCBuYW1lczoKKyAgICAgICAgcmV0dXJuCisgICAgZm9yIGlkeCwgbmFtZSBpbiBlbnVtZXJhdGUobmFtZXMpOgorICAgICAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChuYW1lKQorICAgICAgICBpZiBleHQgPT0gJy5weSc6CisgICAgICAgICAgICBuYW1lc1tpZHhdID0gYmFzZW5hbWUKKworZGVmIGNvdW50KG4sIHdvcmQpOgorICAgIGlmIG4gPT0gMToKKyAgICAgICAgcmV0dXJuICIlZCAlcyIgJSAobiwgd29yZCkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gIiVkICVzcyIgJSAobiwgd29yZCkKKworZGVmIHByaW50bGlzdCh4LCB3aWR0aD03MCwgaW5kZW50PTQpOgorICAgICIiIlByaW50IHRoZSBlbGVtZW50cyBvZiBpdGVyYWJsZSB4IHRvIHN0ZG91dC4KKworICAgIE9wdGlvbmFsIGFyZyB3aWR0aCAoZGVmYXVsdCA3MCkgaXMgdGhlIG1heGltdW0gbGluZSBsZW5ndGguCisgICAgT3B0aW9uYWwgYXJnIGluZGVudCAoZGVmYXVsdCA0KSBpcyB0aGUgbnVtYmVyIG9mIGJsYW5rcyB3aXRoIHdoaWNoIHRvCisgICAgYmVnaW4gZWFjaCBsaW5lLgorICAgICIiIgorCisgICAgZnJvbSB0ZXh0d3JhcCBpbXBvcnQgZmlsbAorICAgIGJsYW5rcyA9ICcgJyAqIGluZGVudAorICAgICMgUHJpbnQgdGhlIHNvcnRlZCBsaXN0OiAneCcgbWF5IGJlIGEgJy0tcmFuZG9tJyBsaXN0IG9yIGEgc2V0KCkKKyAgICBwcmludCBmaWxsKCcgJy5qb2luKHN0cihlbHQpIGZvciBlbHQgaW4gc29ydGVkKHgpKSwgd2lkdGgsCisgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD1ibGFua3MsIHN1YnNlcXVlbnRfaW5kZW50PWJsYW5rcykKKworIyBNYXAgc3lzLnBsYXRmb3JtIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJhc2VuYW1lcyBvZiB0ZXN0cworIyBleHBlY3RlZCB0byBiZSBza2lwcGVkIG9uIHRoYXQgcGxhdGZvcm0uCisjCisjIFNwZWNpYWwgY2FzZXM6CisjICAgICB0ZXN0X3BlcDI3NworIyAgICAgICAgIFRoZSBfRXhwZWN0ZWRTa2lwcyBjb25zdHJ1Y3RvciBhZGRzIHRoaXMgdG8gdGhlIHNldCBvZiBleHBlY3RlZAorIyAgICAgICAgIHNraXBzIGlmIG5vdCBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzLgorIyAgICAgdGVzdF90aW1lb3V0CisjICAgICAgICAgQ29udHJvbGxlZCBieSB0ZXN0X3RpbWVvdXQuc2tpcF9leHBlY3RlZC4gIFJlcXVpcmVzIHRoZSBuZXR3b3JrCisjICAgICAgICAgcmVzb3VyY2UgYW5kIGEgc29ja2V0IG1vZHVsZS4KKyMKKyMgVGVzdHMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gYmUgc2tpcHBlZCBldmVyeXdoZXJlIGV4Y2VwdCBvbiBvbmUgcGxhdGZvcm0KKyMgYXJlIGFsc28gaGFuZGxlZCBzZXBhcmF0ZWx5LgorCitfZXhwZWN0YXRpb25zID0geworICAgICd3aW4zMic6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X19sb2NhbGUKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2NvbW1hbmRzCisgICAgICAgIHRlc3RfY3J5cHQKKyAgICAgICAgdGVzdF9jdXJzZXMKKyAgICAgICAgdGVzdF9kYm0KKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2ZjbnRsCisgICAgICAgIHRlc3RfZm9yazEKKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2dkYm0KKyAgICAgICAgdGVzdF9ncnAKKyAgICAgICAgdGVzdF9pb2N0bAorICAgICAgICB0ZXN0X2xhcmdlZmlsZQorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X21obGliCisgICAgICAgIHRlc3Rfb3BlbnB0eQorICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3RfcGlwZXMKKyAgICAgICAgdGVzdF9wb2xsCisgICAgICAgIHRlc3RfcG9zaXgKKyAgICAgICAgdGVzdF9wdHkKKyAgICAgICAgdGVzdF9wd2QKKyAgICAgICAgdGVzdF9yZXNvdXJjZQorICAgICAgICB0ZXN0X3NpZ25hbAorICAgICAgICB0ZXN0X3RocmVhZHNpZ25hbHMKKyAgICAgICAgdGVzdF90aW1pbmcKKyAgICAgICAgdGVzdF93YWl0MworICAgICAgICB0ZXN0X3dhaXQ0CisgICAgICAgICIiIiwKKyAgICAnbGludXgyJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9jdXJzZXMKKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2xhcmdlZmlsZQorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgICIiIiwKKyAgICAndW5peHdhcmU3JzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYnNkZGIKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9sYXJnZWZpbGUKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9taW5pZG9tCisgICAgICAgIHRlc3Rfb3BlbnB0eQorICAgICAgICB0ZXN0X3B5ZXhwYXQKKyAgICAgICAgdGVzdF9zYXgKKyAgICAgICAgdGVzdF9zdW5kcnkKKyAgICAgICAgIiIiLAorICAgICdvcGVudW5peDgnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2xhcmdlZmlsZQorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X21pbmlkb20KKyAgICAgICAgdGVzdF9vcGVucHR5CisgICAgICAgIHRlc3RfcHlleHBhdAorICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3N1bmRyeQorICAgICAgICAiIiIsCisgICAgJ3Njb19zdjMnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9hc3luY2hhdAorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2ZvcmsxCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9nZXR0ZXh0CisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbWluaWRvbQorICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF9weWV4cGF0CisgICAgICAgIHRlc3RfcXVldWUKKyAgICAgICAgdGVzdF9zYXgKKyAgICAgICAgdGVzdF9zdW5kcnkKKyAgICAgICAgdGVzdF90aHJlYWQKKyAgICAgICAgdGVzdF90aHJlYWRlZF9pbXBvcnQKKyAgICAgICAgdGVzdF90aHJlYWRlZHRlbXBmaWxlCisgICAgICAgIHRlc3RfdGhyZWFkaW5nCisgICAgICAgICIiIiwKKyAgICAncmlzY29zJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYXN5bmNoYXQKKyAgICAgICAgdGVzdF9hdGV4aXQKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfYnNkZGIzCisgICAgICAgIHRlc3RfY29tbWFuZHMKKyAgICAgICAgdGVzdF9jcnlwdAorICAgICAgICB0ZXN0X2RibQorICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZmNudGwKKyAgICAgICAgdGVzdF9mb3JrMQorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2dycAorICAgICAgICB0ZXN0X2xhcmdlZmlsZQorICAgICAgICB0ZXN0X2xvY2FsZQorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X21tYXAKKyAgICAgICAgdGVzdF9vcGVucHR5CisgICAgICAgIHRlc3RfcG9sbAorICAgICAgICB0ZXN0X3BvcGVuMgorICAgICAgICB0ZXN0X3B0eQorICAgICAgICB0ZXN0X3B3ZAorICAgICAgICB0ZXN0X3N0cm9wCisgICAgICAgIHRlc3Rfc3VuZHJ5CisgICAgICAgIHRlc3RfdGhyZWFkCisgICAgICAgIHRlc3RfdGhyZWFkZWRfaW1wb3J0CisgICAgICAgIHRlc3RfdGhyZWFkZWR0ZW1wZmlsZQorICAgICAgICB0ZXN0X3RocmVhZGluZworICAgICAgICB0ZXN0X3RpbWluZworICAgICAgICAiIiIsCisgICAgJ2Rhcndpbic6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X19sb2NhbGUKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMworICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RiCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2xhcmdlZmlsZQorICAgICAgICB0ZXN0X2xvY2FsZQorICAgICAgICB0ZXN0X2txdWV1ZQorICAgICAgICB0ZXN0X21pbmlkb20KKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3BvbGwKKyAgICAgICAgIiIiLAorICAgICdzdW5vczUnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfY3Vyc2VzCisgICAgICAgIHRlc3RfZGJtCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfZ3ppcAorICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF96aXBmaWxlCisgICAgICAgIHRlc3RfemxpYgorICAgICAgICAiIiIsCisgICAgJ2hwLXV4MTEnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYgorICAgICAgICB0ZXN0X2JzZGRiMTg1CisgICAgICAgIHRlc3RfY3Vyc2VzCisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2dkYm0KKyAgICAgICAgdGVzdF9nemlwCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbWluaWRvbQorICAgICAgICB0ZXN0X29wZW5wdHkKKyAgICAgICAgdGVzdF9weWV4cGF0CisgICAgICAgIHRlc3Rfc2F4CisgICAgICAgIHRlc3RfemlwZmlsZQorICAgICAgICB0ZXN0X3psaWIKKyAgICAgICAgIiIiLAorICAgICdhdGhlb3MnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9ic2RkYjE4NQorICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbWhsaWIKKyAgICAgICAgdGVzdF9tbWFwCisgICAgICAgIHRlc3RfcG9sbAorICAgICAgICB0ZXN0X3BvcGVuMgorICAgICAgICB0ZXN0X3Jlc291cmNlCisgICAgICAgICIiIiwKKyAgICAnY3lnd2luJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9jdXJzZXMKKyAgICAgICAgdGVzdF9kYm0KKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2lvY3RsCisgICAgICAgIHRlc3Rfa3F1ZXVlCisgICAgICAgIHRlc3RfbGFyZ2VmaWxlCisgICAgICAgIHRlc3RfbG9jYWxlCisgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9zb2NrZXRzZXJ2ZXIKKyAgICAgICAgIiIiLAorICAgICdvczJlbXgnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9hdWRpb29wCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9jb21tYW5kcworICAgICAgICB0ZXN0X2N1cnNlcworICAgICAgICB0ZXN0X2RsCisgICAgICAgIHRlc3RfZXBvbGwKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9sYXJnZWZpbGUKKyAgICAgICAgdGVzdF9taGxpYgorICAgICAgICB0ZXN0X21tYXAKKyAgICAgICAgdGVzdF9vcGVucHR5CisgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9wdHkKKyAgICAgICAgdGVzdF9yZXNvdXJjZQorICAgICAgICB0ZXN0X3NpZ25hbAorICAgICAgICAiIiIsCisgICAgJ2ZyZWVic2Q0JzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYnNkZGIKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9lcG9sbAorICAgICAgICB0ZXN0X2dkYm0KKyAgICAgICAgdGVzdF9sb2NhbGUKKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3BlcDI3NworICAgICAgICB0ZXN0X3B0eQorICAgICAgICB0ZXN0X3NvY2tldHNlcnZlcgorICAgICAgICB0ZXN0X3RjbAorICAgICAgICB0ZXN0X3RrCisgICAgICAgIHRlc3RfdHRrX2d1aW9ubHkKKyAgICAgICAgdGVzdF90dGtfdGV4dG9ubHkKKyAgICAgICAgdGVzdF90aW1lb3V0CisgICAgICAgIHRlc3RfdXJsbGlibmV0CisgICAgICAgIHRlc3RfbXVsdGlwcm9jZXNzaW5nCisgICAgICAgICIiIiwKKyAgICAnYWl4NSc6CisgICAgICAgICIiIgorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9iejIKKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2d6aXAKKyAgICAgICAgdGVzdF9rcXVldWUKKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3RjbAorICAgICAgICB0ZXN0X3RrCisgICAgICAgIHRlc3RfdHRrX2d1aW9ubHkKKyAgICAgICAgdGVzdF90dGtfdGV4dG9ubHkKKyAgICAgICAgdGVzdF96aXBpbXBvcnQKKyAgICAgICAgdGVzdF96bGliCisgICAgICAgICIiIiwKKyAgICAnb3BlbmJzZDMnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9hc2NpaV9mb3JtYXRkCisgICAgICAgIHRlc3RfYnNkZGIKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9jdHlwZXMKKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2xvY2FsZQorICAgICAgICB0ZXN0X25vcm1hbGl6YXRpb24KKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3BlcDI3NworICAgICAgICB0ZXN0X3RjbAorICAgICAgICB0ZXN0X3RrCisgICAgICAgIHRlc3RfdHRrX2d1aW9ubHkKKyAgICAgICAgdGVzdF90dGtfdGV4dG9ubHkKKyAgICAgICAgdGVzdF9tdWx0aXByb2Nlc3NpbmcKKyAgICAgICAgIiIiLAorICAgICduZXRic2QzJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYXNjaWlfZm9ybWF0ZAorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9jdHlwZXMKKyAgICAgICAgdGVzdF9jdXJzZXMKKyAgICAgICAgdGVzdF9kbAorICAgICAgICB0ZXN0X2Vwb2xsCisgICAgICAgIHRlc3RfZ2RibQorICAgICAgICB0ZXN0X2xvY2FsZQorICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3RfcGVwMjc3CisgICAgICAgIHRlc3RfdGNsCisgICAgICAgIHRlc3RfdGsKKyAgICAgICAgdGVzdF90dGtfZ3Vpb25seQorICAgICAgICB0ZXN0X3R0a190ZXh0b25seQorICAgICAgICB0ZXN0X211bHRpcHJvY2Vzc2luZworICAgICAgICAiIiIsCit9CitfZXhwZWN0YXRpb25zWydmcmVlYnNkNSddID0gX2V4cGVjdGF0aW9uc1snZnJlZWJzZDQnXQorX2V4cGVjdGF0aW9uc1snZnJlZWJzZDYnXSA9IF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q0J10KK19leHBlY3RhdGlvbnNbJ2ZyZWVic2Q3J10gPSBfZXhwZWN0YXRpb25zWydmcmVlYnNkNCddCitfZXhwZWN0YXRpb25zWydmcmVlYnNkOCddID0gX2V4cGVjdGF0aW9uc1snZnJlZWJzZDQnXQorCitjbGFzcyBfRXhwZWN0ZWRTa2lwczoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIGltcG9ydCBvcy5wYXRoCisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF90aW1lb3V0CisKKyAgICAgICAgc2VsZi52YWxpZCA9IEZhbHNlCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiBfZXhwZWN0YXRpb25zOgorICAgICAgICAgICAgcyA9IF9leHBlY3RhdGlvbnNbc3lzLnBsYXRmb3JtXQorICAgICAgICAgICAgc2VsZi5leHBlY3RlZCA9IHNldChzLnNwbGl0KCkpCisKKyAgICAgICAgICAgICMgZXhwZWN0ZWQgdG8gYmUgc2tpcHBlZCBvbiBldmVyeSBwbGF0Zm9ybSwgZXZlbiBMaW51eAorICAgICAgICAgICAgc2VsZi5leHBlY3RlZC5hZGQoJ3Rlc3RfbGludXhhdWRpb2RldicpCisKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzOgorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKCd0ZXN0X3BlcDI3NycpCisKKyAgICAgICAgICAgIGlmIHRlc3RfdGltZW91dC5za2lwX2V4cGVjdGVkOgorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKCd0ZXN0X3RpbWVvdXQnKQorCisgICAgICAgICAgICBpZiBzeXMubWF4aW50ID09IDkyMjMzNzIwMzY4NTQ3NzU4MDdMOgorICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKCd0ZXN0X2ltYWdlb3AnKQorCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gImRhcndpbiI6CisgICAgICAgICAgICAgICAgTUFDX09OTFkgPSBbInRlc3RfbWFjb3MiLCAidGVzdF9tYWNvc3Rvb2xzIiwgInRlc3RfYWVwYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9wbGlzdGxpYiIsICJ0ZXN0X3NjcmlwdHBhY2thZ2VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9hcHBsZXNpbmdsZSJdCisgICAgICAgICAgICAgICAgZm9yIHNraXAgaW4gTUFDX09OTFk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKHNraXApCisgICAgICAgICAgICBlbGlmIGxlbih1J1wwJy5lbmNvZGUoJ3VuaWNvZGUtaW50ZXJuYWwnKSkgPT0gNDoKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdGVkLmFkZCgidGVzdF9tYWNvc3Rvb2xzIikKKworCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gIndpbjMyIjoKKyAgICAgICAgICAgICAgICAjIHRlc3Rfc3FsaXRlIGlzIG9ubHkgcmVsaWFibGUgb24gV2luZG93cyB3aGVyZSB0aGUgbGlicmFyeQorICAgICAgICAgICAgICAgICMgaXMgZGlzdHJpYnV0ZWQgd2l0aCBQeXRob24KKyAgICAgICAgICAgICAgICBXSU5fT05MWSA9IFsidGVzdF91bmljb2RlX2ZpbGUiLCAidGVzdF93aW5yZWciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3dpbnNvdW5kIiwgInRlc3Rfc3RhcnRmaWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF9zcWxpdGUiLCAidGVzdF9tc2lsaWIiXQorICAgICAgICAgICAgICAgIGZvciBza2lwIGluIFdJTl9PTkxZOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdGVkLmFkZChza2lwKQorCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ2lyaXgnOgorICAgICAgICAgICAgICAgIElSSVhfT05MWSA9IFsidGVzdF9pbWFnZW9wIiwgInRlc3RfYWwiLCAidGVzdF9jZCIsICJ0ZXN0X2NsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfZ2wiLCAidGVzdF9pbWdmaWxlIl0KKyAgICAgICAgICAgICAgICBmb3Igc2tpcCBpbiBJUklYX09OTFk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZXhwZWN0ZWQuYWRkKHNraXApCisKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAnc3Vub3M1JzoKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdGVkLmFkZCgndGVzdF9zdW5hdWRpb2RldicpCisgICAgICAgICAgICAgICAgc2VsZi5leHBlY3RlZC5hZGQoJ3Rlc3RfbmlzJykKKworICAgICAgICAgICAgaWYgbm90IHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgICAgICAgICBzZWxmLmV4cGVjdGVkLmFkZCgndGVzdF9weTNrd2FybicpCisKKyAgICAgICAgICAgIHNlbGYudmFsaWQgPSBUcnVlCisKKyAgICBkZWYgaXN2YWxpZChzZWxmKToKKyAgICAgICAgIlJldHVybiB0cnVlIGlmZiBfRXhwZWN0ZWRTa2lwcyBrbm93cyBhYm91dCB0aGUgY3VycmVudCBwbGF0Zm9ybS4iCisgICAgICAgIHJldHVybiBzZWxmLnZhbGlkCisKKyAgICBkZWYgZ2V0ZXhwZWN0ZWQoc2VsZik6CisgICAgICAgICIiIlJldHVybiBzZXQgb2YgdGVzdCBuYW1lcyB3ZSBleHBlY3QgdG8gc2tpcCBvbiBjdXJyZW50IHBsYXRmb3JtLgorCisgICAgICAgIHNlbGYuaXN2YWxpZCgpIG11c3QgYmUgdHJ1ZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgYXNzZXJ0IHNlbGYuaXN2YWxpZCgpCisgICAgICAgIHJldHVybiBzZWxmLmV4cGVjdGVkCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgIyBmaW5kdGVzdGRpcigpIGdldHMgdGhlIGRpcm5hbWUgb3V0IG9mIF9fZmlsZV9fLCBzbyB3ZSBoYXZlIHRvIG1ha2UgaXQKKyAgICAjIGFic29sdXRlIGJlZm9yZSBjaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkuCisgICAgIyBGb3IgZXhhbXBsZSBfX2ZpbGVfXyBtYXkgYmUgcmVsYXRpdmUgd2hlbiBydW5uaW5nIHRyYWNlIG9yIHByb2ZpbGUuCisgICAgIyBTZWUgaXNzdWUgIzkzMjMuCisgICAgX19maWxlX18gPSBvcy5wYXRoLmFic3BhdGgoX19maWxlX18pCisKKyAgICAjIHNhbml0eSBjaGVjaworICAgIGFzc2VydCBfX2ZpbGVfXyA9PSBvcy5wYXRoLmFic3BhdGgoc3lzLmFyZ3ZbMF0pCisKKyAgICAjIFdoZW4gdGVzdHMgYXJlIHJ1biBmcm9tIHRoZSBQeXRob24gYnVpbGQgZGlyZWN0b3J5LCBpdCBpcyBiZXN0IHByYWN0aWNlCisgICAgIyB0byBrZWVwIHRoZSB0ZXN0IGZpbGVzIGluIGEgc3ViZm9sZGVyLiAgSXQgZWFzZXMgdGhlIGNsZWFudXAgb2YgbGVmdG92ZXIKKyAgICAjIGZpbGVzIHVzaW5nIGNvbW1hbmQgIm1ha2UgZGlzdGNsZWFuIi4KKyAgICBpZiBzeXNjb25maWcuaXNfcHl0aG9uX2J1aWxkKCk6CisgICAgICAgIFRFTVBESVIgPSBvcy5wYXRoLmFic3BhdGgoJ2J1aWxkJykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKFRFTVBESVIpOgorICAgICAgICAgICAgb3MubWtkaXIoVEVNUERJUikKKworICAgICMgRGVmaW5lIGEgd3JpdGFibGUgdGVtcCBkaXIgdGhhdCB3aWxsIGJlIHVzZWQgYXMgY3dkIHdoaWxlIHJ1bm5pbmcKKyAgICAjIHRoZSB0ZXN0cy4gVGhlIG5hbWUgb2YgdGhlIGRpciBpbmNsdWRlcyB0aGUgcGlkIHRvIGFsbG93IHBhcmFsbGVsCisgICAgIyB0ZXN0aW5nIChzZWUgdGhlIC1qIG9wdGlvbikuCisgICAgVEVTVENXRCA9ICd0ZXN0X3B5dGhvbl97fScuZm9ybWF0KG9zLmdldHBpZCgpKQorCisgICAgVEVTVENXRCA9IG9zLnBhdGguam9pbihURU1QRElSLCBURVNUQ1dEKQorCisgICAgIyBSdW4gdGhlIHRlc3RzIGluIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgdGVtcG9yYXJ5IGNoYW5nZXMgdGhlIENXRCB0byBhCisgICAgIyB0ZW1wb3JhcnkgYW5kIHdyaXRhYmxlIGRpcmVjdG9yeS4gSWYgaXQncyBub3QgcG9zc2libGUgdG8gY3JlYXRlIG9yCisgICAgIyBjaGFuZ2UgdGhlIENXRCwgdGhlIG9yaWdpbmFsIENXRCB3aWxsIGJlIHVzZWQuIFRoZSBvcmlnaW5hbCBDV0QgaXMKKyAgICAjIGF2YWlsYWJsZSBmcm9tIHRlc3Rfc3VwcG9ydC5TQVZFRENXRC4KKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC50ZW1wX2N3ZChURVNUQ1dELCBxdWlldD1UcnVlKToKKyAgICAgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlZ3J0ZXN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDEyMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlZ3J0ZXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVncnRlc3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlZ3J0ZXN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGJlZmExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlZ3J0ZXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlbGltcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGFhNDk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlbGltcG9ydC5weQpAQCAtMCwwICsxIEBACitmcm9tIC50ZXN0X2ltcG9ydCBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlbGltcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzMxZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlbGltcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlbGltcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVsaW1wb3J0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzMxZjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlbGltcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlcGVyZi5weSBiL2xpYi9weXRob24yLjcvdGVzdC9yZXBlcmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhhYzQwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9yZXBlcmYucHkKQEAgLTAsMCArMSwyMyBAQAoraW1wb3J0IHJlCitpbXBvcnQgdGltZQorCitkZWYgbWFpbigpOgorICAgIHMgPSAiXDEzaGVsbG9cMTQgXDEzd29ybGRcMTQgIiAqIDEwMDAKKyAgICBwID0gcmUuY29tcGlsZShyIihbXDEzXDE0XSkiKQorICAgIHRpbWVmdW5jKDEwLCBwLnN1YiwgIiIsIHMpCisgICAgdGltZWZ1bmMoMTAsIHAuc3BsaXQsIHMpCisgICAgdGltZWZ1bmMoMTAsIHAuZmluZGFsbCwgcykKKworZGVmIHRpbWVmdW5jKG4sIGZ1bmMsICphcmdzLCAqKmt3KToKKyAgICB0MCA9IHRpbWUuY2xvY2soKQorICAgIHRyeToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICByZXN1bHQgPSBmdW5jKCphcmdzLCAqKmt3KQorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgZmluYWxseToKKyAgICAgICAgdDEgPSB0aW1lLmNsb2NrKCkKKyAgICAgICAgaWYgbiA+IDE6CisgICAgICAgICAgICBwcmludCBuLCAidGltZXMiLAorICAgICAgICBwcmludCBmdW5jLl9fbmFtZV9fLCAiJS4zZiIgJSAodDEtdDApLCAiQ1BVIHNlY29uZHMiCisKK21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlcGVyZi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVwZXJmLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUxN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlcGVyZi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3JlcGVyZi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvcmVwZXJmLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmUxN2I3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3JlcGVyZi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YWRlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3QucHkKQEAgLTAsMCArMSw3NiBAQAorIiIiVGhpcyBpcyBhIHNhbXBsZSBtb2R1bGUgdGhhdCBkb2Vzbid0IHJlYWxseSB0ZXN0IGFueXRoaW5nIGFsbCB0aGF0CisgICBpbnRlcmVzdGluZy4KKworSXQgc2ltcGx5IGhhcyBhIGZldyB0ZXN0cywgc29tZSBvZiB3aGljaCBzdWNjZWVkIGFuZCBzb21lIG9mIHdoaWNoIGZhaWwuCisKK0l0J3MgaW1wb3J0YW50IHRoYXQgdGhlIG51bWJlcnMgcmVtYWluIGNvbnN0YW50IGFzIGFub3RoZXIgdGVzdCBpcwordGVzdGluZyB0aGUgcnVubmluZyBvZiB0aGVzZSB0ZXN0cy4KKworCis+Pj4gMisyCis0CisiIiIKKworCitkZWYgZm9vKCk6CisgICAgIiIiCisKKyAgICA+Pj4gMisyCisgICAgNQorCisgICAgPj4+IDIrMgorICAgIDQKKyAgICAiIiIKKworZGVmIGJhcigpOgorICAgICIiIgorCisgICAgPj4+IDIrMgorICAgIDQKKyAgICAiIiIKKworZGVmIHRlc3Rfc2lsbHlfc2V0dXAoKToKKyAgICAiIiIKKworICAgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICA+Pj4gdGVzdC50ZXN0X2RvY3Rlc3Quc2lsbHlTZXR1cAorICAgIFRydWUKKyAgICAiIiIKKworZGVmIHdfYmxhbmsoKToKKyAgICAiIiIKKyAgICA+Pj4gaWYgMToKKyAgICAuLi4gICAgcHJpbnQgJ2EnCisgICAgLi4uICAgIHByaW50CisgICAgLi4uICAgIHByaW50ICdiJworICAgIGEKKyAgICA8QkxBTktMSU5FPgorICAgIGIKKyAgICAiIiIKKworeCA9IDEKK2RlZiB4X2lzX29uZSgpOgorICAgICIiIgorICAgID4+PiB4CisgICAgMQorICAgICIiIgorCitkZWYgeV9pc19vbmUoKToKKyAgICAiIiIKKyAgICA+Pj4geQorICAgIDEKKyAgICAiIiIKKworX190ZXN0X18gPSB7J2dvb2QnOiAiIiIKKyAgICAgICAgICAgICAgICAgICAgPj4+IDQyCisgICAgICAgICAgICAgICAgICAgIDQyCisgICAgICAgICAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgICdiYWQnOiAgIiIiCisgICAgICAgICAgICAgICAgICAgID4+PiA0MgorICAgICAgICAgICAgICAgICAgICA2NjYKKyAgICAgICAgICAgICAgICAgICAgIiIiLAorICAgICAgICAgICB9CisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICByZXR1cm4gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNjlkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNjlkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDIwMWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MucHkKQEAgLTAsMCArMSwxMiBAQAorIyBUaGlzIGlzIGEgc2FtcGxlIG1vZHVsZSB1c2VkIGZvciB0ZXN0aW5nIGRvY3Rlc3QuCisjCisjIFRoaXMgbW9kdWxlIGlzIGZvciB0ZXN0aW5nIGhvdyBkb2N0ZXN0IGhhbmRsZXMgYSBtb2R1bGUgd2l0aCBubworIyBkb2NzdHJpbmdzLgorCisKK2NsYXNzIEZvbyhvYmplY3QpOgorCisgICAgIyBBIGNsYXNzIHdpdGggbm8gZG9jc3RyaW5nLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjYmE4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjYmE4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhYTU3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weQpAQCAtMCwwICsxLDE1IEBACisiIiJUaGlzIGlzIGEgc2FtcGxlIG1vZHVsZSB1c2VkIGZvciB0ZXN0aW5nIGRvY3Rlc3QuCisKK1RoaXMgbW9kdWxlIGlzIGZvciB0ZXN0aW5nIGhvdyBkb2N0ZXN0IGhhbmRsZXMgYSBtb2R1bGUgd2l0aCBkb2NzdHJpbmdzCitidXQgbm8gZG9jdGVzdCBleGFtcGxlcy4KKworIiIiCisKKworY2xhc3MgRm9vKG9iamVjdCk6CisgICAgIiIiQSBkb2NzdHJpbmcgd2l0aCBubyBkb2N0ZXN0IGV4YW1wbGVzLgorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWUyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zYW1wbGVfZG9jdGVzdF9ub19kb2N0ZXN0cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNWUyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jdGVzdHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3NjcmlwdF9oZWxwZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3YzcwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5CkBAIC0wLDAgKzEsMTcwIEBACisjIENvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGJ5IHZhcmlvdXMgc2NyaXB0IGV4ZWN1dGlvbiB0ZXN0cworIyAgZS5nLiB0ZXN0X2NtZF9saW5lLCB0ZXN0X2NtZF9saW5lX3NjcmlwdCBhbmQgdGVzdF9ydW5weQorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IG9zLnBhdGgKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBweV9jb21waWxlCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IHNodXRpbAordHJ5OgorICAgIGltcG9ydCB6aXBmaWxlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBJZiBQeXRob24gaXMgYnVpbGQgd2l0aG91dCBVbmljb2RlIHN1cHBvcnQsIGltcG9ydGluZyBfaW8gd2lsbAorICAgICMgZmFpbCwgd2hpY2gsIGluIHR1cm4sIG1lYW5zIHRoYXQgemlwZmlsZSBjYW5ub3QgYmUgaW1wb3J0ZWQKKyAgICAjIE1vc3Qgb2YgdGhpcyBtb2R1bGUgY2FuIHRoZW4gc3RpbGwgYmUgdXNlZC4KKyAgICBwYXNzCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHN0cmlwX3B5dGhvbl9zdGRlcnIKKworIyBFeGVjdXRpbmcgdGhlIGludGVycHJldGVyIGluIGEgc3VicHJvY2VzcworZGVmIF9hc3NlcnRfcHl0aG9uKGV4cGVjdGVkX3N1Y2Nlc3MsICphcmdzLCAqKmVudl92YXJzKToKKyAgICBjbWRfbGluZSA9IFtzeXMuZXhlY3V0YWJsZV0KKyAgICBpZiBub3QgZW52X3ZhcnM6CisgICAgICAgIGNtZF9saW5lLmFwcGVuZCgnLUUnKQorICAgIGNtZF9saW5lLmV4dGVuZChhcmdzKQorICAgICMgTmVlZCB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgZW52aXJvbm1lbnQsIGZvciBpbi1wbGFjZSB0ZXN0aW5nIG9mCisgICAgIyBzaGFyZWQgbGlicmFyeSBidWlsZHMuCisgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICBlbnYudXBkYXRlKGVudl92YXJzKQorICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZF9saW5lLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52KQorICAgIHRyeToKKyAgICAgICAgb3V0LCBlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBzdWJwcm9jZXNzLl9jbGVhbnVwKCkKKyAgICAgICAgcC5zdGRvdXQuY2xvc2UoKQorICAgICAgICBwLnN0ZGVyci5jbG9zZSgpCisgICAgcmMgPSBwLnJldHVybmNvZGUKKyAgICBlcnIgPSAgc3RyaXBfcHl0aG9uX3N0ZGVycihlcnIpCisgICAgaWYgKHJjIGFuZCBleHBlY3RlZF9zdWNjZXNzKSBvciAobm90IHJjIGFuZCBub3QgZXhwZWN0ZWRfc3VjY2Vzcyk6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgIlByb2Nlc3MgcmV0dXJuIGNvZGUgaXMgJWQsICIKKyAgICAgICAgICAgICJzdGRlcnIgZm9sbG93czpcbiVzIiAlIChyYywgZXJyLmRlY29kZSgnYXNjaWknLCAnaWdub3JlJykpKQorICAgIHJldHVybiByYywgb3V0LCBlcnIKKworZGVmIGFzc2VydF9weXRob25fb2soKmFyZ3MsICoqZW52X3ZhcnMpOgorICAgICIiIgorICAgIEFzc2VydCB0aGF0IHJ1bm5pbmcgdGhlIGludGVycHJldGVyIHdpdGggYGFyZ3NgIGFuZCBvcHRpb25hbCBlbnZpcm9ubWVudAorICAgIHZhcmlhYmxlcyBgZW52X3ZhcnNgIGlzIG9rIGFuZCByZXR1cm4gYSAocmV0dXJuIGNvZGUsIHN0ZG91dCwgc3RkZXJyKSB0dXBsZS4KKyAgICAiIiIKKyAgICByZXR1cm4gX2Fzc2VydF9weXRob24oVHJ1ZSwgKmFyZ3MsICoqZW52X3ZhcnMpCisKK2RlZiBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoKmFyZ3MsICoqZW52X3ZhcnMpOgorICAgICIiIgorICAgIEFzc2VydCB0aGF0IHJ1bm5pbmcgdGhlIGludGVycHJldGVyIHdpdGggYGFyZ3NgIGFuZCBvcHRpb25hbCBlbnZpcm9ubWVudAorICAgIHZhcmlhYmxlcyBgZW52X3ZhcnNgIGZhaWxzIGFuZCByZXR1cm4gYSAocmV0dXJuIGNvZGUsIHN0ZG91dCwgc3RkZXJyKSB0dXBsZS4KKyAgICAiIiIKKyAgICByZXR1cm4gX2Fzc2VydF9weXRob24oRmFsc2UsICphcmdzLCAqKmVudl92YXJzKQorCitkZWYgcHl0aG9uX2V4aXRfY29kZSgqYXJncyk6CisgICAgY21kX2xpbmUgPSBbc3lzLmV4ZWN1dGFibGUsICctRSddCisgICAgY21kX2xpbmUuZXh0ZW5kKGFyZ3MpCisgICAgd2l0aCBvcGVuKG9zLmRldm51bGwsICd3JykgYXMgZGV2bnVsbDoKKyAgICAgICAgcmV0dXJuIHN1YnByb2Nlc3MuY2FsbChjbWRfbGluZSwgc3Rkb3V0PWRldm51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKworZGVmIHNwYXduX3B5dGhvbigqYXJncywgKiprd2FyZ3MpOgorICAgIGNtZF9saW5lID0gW3N5cy5leGVjdXRhYmxlLCAnLUUnXQorICAgIGNtZF9saW5lLmV4dGVuZChhcmdzKQorICAgIHJldHVybiBzdWJwcm9jZXNzLlBvcGVuKGNtZF9saW5lLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqa3dhcmdzKQorCitkZWYga2lsbF9weXRob24ocCk6CisgICAgcC5zdGRpbi5jbG9zZSgpCisgICAgZGF0YSA9IHAuc3Rkb3V0LnJlYWQoKQorICAgIHAuc3Rkb3V0LmNsb3NlKCkKKyAgICAjIHRyeSB0byBjbGVhbnVwIHRoZSBjaGlsZCBzbyB3ZSBkb24ndCBhcHBlYXIgdG8gbGVhayB3aGVuIHJ1bm5pbmcKKyAgICAjIHdpdGggcmVncnRlc3QgLVIuCisgICAgcC53YWl0KCkKKyAgICBzdWJwcm9jZXNzLl9jbGVhbnVwKCkKKyAgICByZXR1cm4gZGF0YQorCitkZWYgcnVuX3B5dGhvbigqYXJncywgKiprd2FyZ3MpOgorICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgcCA9IHNwYXduX3B5dGhvbigqYXJncywgKiprd2FyZ3MpCisgICAgZWxzZToKKyAgICAgICAgcCA9IHNwYXduX3B5dGhvbignLU8nLCAqYXJncywgKiprd2FyZ3MpCisgICAgc3Rkb3V0X2RhdGEgPSBraWxsX3B5dGhvbihwKQorICAgIHJldHVybiBwLndhaXQoKSwgc3Rkb3V0X2RhdGEKKworIyBTY3JpcHQgY3JlYXRpb24gdXRpbGl0aWVzCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIHRlbXBfZGlyKCk6CisgICAgZGlybmFtZSA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgIGRpcm5hbWUgPSBvcy5wYXRoLnJlYWxwYXRoKGRpcm5hbWUpCisgICAgdHJ5OgorICAgICAgICB5aWVsZCBkaXJuYW1lCisgICAgZmluYWxseToKKyAgICAgICAgc2h1dGlsLnJtdHJlZShkaXJuYW1lKQorCitkZWYgbWFrZV9zY3JpcHQoc2NyaXB0X2Rpciwgc2NyaXB0X2Jhc2VuYW1lLCBzb3VyY2UpOgorICAgIHNjcmlwdF9maWxlbmFtZSA9IHNjcmlwdF9iYXNlbmFtZStvcy5leHRzZXArJ3B5JworICAgIHNjcmlwdF9uYW1lID0gb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsIHNjcmlwdF9maWxlbmFtZSkKKyAgICBzY3JpcHRfZmlsZSA9IG9wZW4oc2NyaXB0X25hbWUsICd3JykKKyAgICBzY3JpcHRfZmlsZS53cml0ZShzb3VyY2UpCisgICAgc2NyaXB0X2ZpbGUuY2xvc2UoKQorICAgIHJldHVybiBzY3JpcHRfbmFtZQorCitkZWYgY29tcGlsZV9zY3JpcHQoc2NyaXB0X25hbWUpOgorICAgIHB5X2NvbXBpbGUuY29tcGlsZShzY3JpcHRfbmFtZSwgZG9yYWlzZT1UcnVlKQorICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgY29tcGlsZWRfbmFtZSA9IHNjcmlwdF9uYW1lICsgJ2MnCisgICAgZWxzZToKKyAgICAgICAgY29tcGlsZWRfbmFtZSA9IHNjcmlwdF9uYW1lICsgJ28nCisgICAgcmV0dXJuIGNvbXBpbGVkX25hbWUKKworZGVmIG1ha2VfemlwX3NjcmlwdCh6aXBfZGlyLCB6aXBfYmFzZW5hbWUsIHNjcmlwdF9uYW1lLCBuYW1lX2luX3ppcD1Ob25lKToKKyAgICB6aXBfZmlsZW5hbWUgPSB6aXBfYmFzZW5hbWUrb3MuZXh0c2VwKyd6aXAnCisgICAgemlwX25hbWUgPSBvcy5wYXRoLmpvaW4oemlwX2RpciwgemlwX2ZpbGVuYW1lKQorICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKHppcF9uYW1lLCAndycpCisgICAgaWYgbmFtZV9pbl96aXAgaXMgTm9uZToKKyAgICAgICAgbmFtZV9pbl96aXAgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9uYW1lKQorICAgIHppcF9maWxlLndyaXRlKHNjcmlwdF9uYW1lLCBuYW1lX2luX3ppcCkKKyAgICB6aXBfZmlsZS5jbG9zZSgpCisgICAgI2lmIHRlc3QudGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgIyAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBfbmFtZSwgJ3InKQorICAgICMgICAgcHJpbnQgJ0NvbnRlbnRzIG9mICVyOicgJSB6aXBfbmFtZQorICAgICMgICAgemlwX2ZpbGUucHJpbnRkaXIoKQorICAgICMgICAgemlwX2ZpbGUuY2xvc2UoKQorICAgIHJldHVybiB6aXBfbmFtZSwgb3MucGF0aC5qb2luKHppcF9uYW1lLCBuYW1lX2luX3ppcCkKKworZGVmIG1ha2VfcGtnKHBrZ19kaXIpOgorICAgIG9zLm1rZGlyKHBrZ19kaXIpCisgICAgbWFrZV9zY3JpcHQocGtnX2RpciwgJ19faW5pdF9fJywgJycpCisKK2RlZiBtYWtlX3ppcF9wa2coemlwX2RpciwgemlwX2Jhc2VuYW1lLCBwa2dfbmFtZSwgc2NyaXB0X2Jhc2VuYW1lLAorICAgICAgICAgICAgICAgICBzb3VyY2UsIGRlcHRoPTEsIGNvbXBpbGVkPUZhbHNlKToKKyAgICB1bmxpbmsgPSBbXQorICAgIGluaXRfbmFtZSA9IG1ha2Vfc2NyaXB0KHppcF9kaXIsICdfX2luaXRfXycsICcnKQorICAgIHVubGluay5hcHBlbmQoaW5pdF9uYW1lKQorICAgIGluaXRfYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGluaXRfbmFtZSkKKyAgICBzY3JpcHRfbmFtZSA9IG1ha2Vfc2NyaXB0KHppcF9kaXIsIHNjcmlwdF9iYXNlbmFtZSwgc291cmNlKQorICAgIHVubGluay5hcHBlbmQoc2NyaXB0X25hbWUpCisgICAgaWYgY29tcGlsZWQ6CisgICAgICAgIGluaXRfbmFtZSA9IGNvbXBpbGVfc2NyaXB0KGluaXRfbmFtZSkKKyAgICAgICAgc2NyaXB0X25hbWUgPSBjb21waWxlX3NjcmlwdChzY3JpcHRfbmFtZSkKKyAgICAgICAgdW5saW5rLmV4dGVuZCgoaW5pdF9uYW1lLCBzY3JpcHRfbmFtZSkpCisgICAgcGtnX25hbWVzID0gW29zLnNlcC5qb2luKFtwa2dfbmFtZV0qaSkgZm9yIGkgaW4gcmFuZ2UoMSwgZGVwdGgrMSldCisgICAgc2NyaXB0X25hbWVfaW5femlwID0gb3MucGF0aC5qb2luKHBrZ19uYW1lc1stMV0sIG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X25hbWUpKQorICAgIHppcF9maWxlbmFtZSA9IHppcF9iYXNlbmFtZStvcy5leHRzZXArJ3ppcCcKKyAgICB6aXBfbmFtZSA9IG9zLnBhdGguam9pbih6aXBfZGlyLCB6aXBfZmlsZW5hbWUpCisgICAgemlwX2ZpbGUgPSB6aXBmaWxlLlppcEZpbGUoemlwX25hbWUsICd3JykKKyAgICBmb3IgbmFtZSBpbiBwa2dfbmFtZXM6CisgICAgICAgIGluaXRfbmFtZV9pbl96aXAgPSBvcy5wYXRoLmpvaW4obmFtZSwgaW5pdF9iYXNlbmFtZSkKKyAgICAgICAgemlwX2ZpbGUud3JpdGUoaW5pdF9uYW1lLCBpbml0X25hbWVfaW5femlwKQorICAgIHppcF9maWxlLndyaXRlKHNjcmlwdF9uYW1lLCBzY3JpcHRfbmFtZV9pbl96aXApCisgICAgemlwX2ZpbGUuY2xvc2UoKQorICAgIGZvciBuYW1lIGluIHVubGluazoKKyAgICAgICAgb3MudW5saW5rKG5hbWUpCisgICAgI2lmIHRlc3QudGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgIyAgICB6aXBfZmlsZSA9IHppcGZpbGUuWmlwRmlsZSh6aXBfbmFtZSwgJ3InKQorICAgICMgICAgcHJpbnQgJ0NvbnRlbnRzIG9mICVyOicgJSB6aXBfbmFtZQorICAgICMgICAgemlwX2ZpbGUucHJpbnRkaXIoKQorICAgICMgICAgemlwX2ZpbGUuY2xvc2UoKQorICAgIHJldHVybiB6aXBfbmFtZSwgb3MucGF0aC5qb2luKHppcF9uYW1lLCBzY3JpcHRfbmFtZV9pbl96aXApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2NyaXB0X2hlbHBlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2NyaXB0X2hlbHBlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyYmMyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2NyaXB0X2hlbHBlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2NyaXB0X2hlbHBlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E1MjM0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zY3JpcHRfaGVscGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2VxX3Rlc3RzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3NlcV90ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWU0ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NlcV90ZXN0cy5weQpAQCAtMCwwICsxLDM5MiBAQAorIiIiCitUZXN0cyBjb21tb24gdG8gdHVwbGUsIGxpc3QgYW5kIFVzZXJMaXN0LlVzZXJMaXN0CisiIiIKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisKKyMgVmFyaW91cyBpdGVyYWJsZXMKKyMgVGhpcyBpcyB1c2VkIGZvciBjaGVja2luZyB0aGUgY29uc3RydWN0b3IgKGhlcmUgYW5kIGluIHRlc3RfZGVxdWUucHkpCitkZWYgaXRlcmZ1bmMoc2Vxbik6CisgICAgJ1JlZ3VsYXIgZ2VuZXJhdG9yJworICAgIGZvciBpIGluIHNlcW46CisgICAgICAgIHlpZWxkIGkKKworY2xhc3MgU2VxdWVuY2U6CisgICAgJ1NlcXVlbmNlIHVzaW5nIF9fZ2V0aXRlbV9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VxbltpXQorCitjbGFzcyBJdGVyRnVuYzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgaXRlcmF0b3IgcHJvdG9jb2wnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaSA+PSBsZW4oc2VsZi5zZXFuKTogcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICB2ID0gc2VsZi5zZXFuW3NlbGYuaV0KKyAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgcmV0dXJuIHYKKworY2xhc3MgSXRlckdlbjoKKyAgICAnU2VxdWVuY2UgdXNpbmcgaXRlcmF0b3IgcHJvdG9jb2wgZGVmaW5lZCB3aXRoIGEgZ2VuZXJhdG9yJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgdmFsIGluIHNlbGYuc2VxbjoKKyAgICAgICAgICAgIHlpZWxkIHZhbAorCitjbGFzcyBJdGVyTmV4dE9ubHk6CisgICAgJ01pc3NpbmcgX19nZXRpdGVtX18gYW5kIF9faXRlcl9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaSA+PSBsZW4oc2VsZi5zZXFuKTogcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICB2ID0gc2VsZi5zZXFuW3NlbGYuaV0KKyAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgcmV0dXJuIHYKKworY2xhc3MgSXRlck5vTmV4dDoKKyAgICAnSXRlcmF0b3IgbWlzc2luZyBuZXh0KCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK2NsYXNzIEl0ZXJHZW5FeGM6CisgICAgJ1Rlc3QgcHJvcGFnYXRpb24gb2YgZXhjZXB0aW9ucycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgMyAvLyAwCisKK2NsYXNzIEl0ZXJGdW5jU3RvcDoKKyAgICAnVGVzdCBpbW1lZGlhdGUgc3RvcCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHBhc3MKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworZnJvbSBpdGVydG9vbHMgaW1wb3J0IGNoYWluLCBpbWFwCitkZWYgaXRlcm11bHRpKHNlcW4pOgorICAgICdUZXN0IG11bHRpcGxlIHRpZXJzIG9mIGl0ZXJhdG9ycycKKyAgICByZXR1cm4gY2hhaW4oaW1hcChsYW1iZGEgeDp4LCBpdGVyZnVuYyhJdGVyR2VuKFNlcXVlbmNlKHNlcW4pKSkpKQorCitjbGFzcyBDb21tb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZSB0eXBlIHRvIGJlIHRlc3RlZAorICAgIHR5cGUydGVzdCA9IE5vbmUKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9ycyhzZWxmKToKKyAgICAgICAgbDAgPSBbXQorICAgICAgICBsMSA9IFswXQorICAgICAgICBsMiA9IFswLCAxXQorCisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdCgpCisgICAgICAgIHUwID0gc2VsZi50eXBlMnRlc3QobDApCisgICAgICAgIHUxID0gc2VsZi50eXBlMnRlc3QobDEpCisgICAgICAgIHUyID0gc2VsZi50eXBlMnRlc3QobDIpCisKKyAgICAgICAgdXUgPSBzZWxmLnR5cGUydGVzdCh1KQorICAgICAgICB1dTAgPSBzZWxmLnR5cGUydGVzdCh1MCkKKyAgICAgICAgdXUxID0gc2VsZi50eXBlMnRlc3QodTEpCisgICAgICAgIHV1MiA9IHNlbGYudHlwZTJ0ZXN0KHUyKQorCisgICAgICAgIHYgPSBzZWxmLnR5cGUydGVzdCh0dXBsZSh1KSkKKyAgICAgICAgY2xhc3MgT3RoZXJTZXE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaW5pdHNlcSk6CisgICAgICAgICAgICAgICAgc2VsZi5fX2RhdGEgPSBpbml0c2VxCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYuX19kYXRhKQorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGF0YVtpXQorICAgICAgICBzID0gT3RoZXJTZXEodTApCisgICAgICAgIHYwID0gc2VsZi50eXBlMnRlc3QocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odjApLCBsZW4ocykpCisKKyAgICAgICAgcyA9ICJ0aGlzIGlzIGFsc28gYSBzZXF1ZW5jZSIKKyAgICAgICAgdnYgPSBzZWxmLnR5cGUydGVzdChzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2diksIGxlbihzKSkKKworICAgICAgICAjIENyZWF0ZSBmcm9tIHZhcmlvdXMgaXRlcmF0YWJsZXMKKyAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChTZXF1ZW5jZSwgSXRlckZ1bmMsIEl0ZXJHZW4sCisgICAgICAgICAgICAgICAgICAgICAgaXRlcm11bHRpLCBpdGVyZnVuYyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChnKHMpKSwgc2VsZi50eXBlMnRlc3QocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KEl0ZXJGdW5jU3RvcChzKSksIHNlbGYudHlwZTJ0ZXN0KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGMgZm9yIGMgaW4gIjEyMyIpLCBzZWxmLnR5cGUydGVzdCgiMTIzIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBJdGVyTmV4dE9ubHkocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBJdGVyTm9OZXh0KHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBJdGVyR2VuRXhjKHMpKQorCisgICAgZGVmIHRlc3RfdHJ1dGgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50eXBlMnRlc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudHlwZTJ0ZXN0KFs0Ml0pKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyLCAzLCA0XSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbih1KSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbaV0sIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbbG9uZyhpKV0sIGkpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgtbGVuKHUpLCAtMSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbaV0sIGxlbih1KStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1W2xvbmcoaSldLCBsZW4odSkraSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdS5fX2dldGl0ZW1fXywgLWxlbih1KS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ll9fZ2V0aXRlbV9fLCBsZW4odSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUuX19nZXRpdGVtX18sIHNsaWNlKDAsMTAsMCkpCisKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdS5fX2dldGl0ZW1fXywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdS5fX2dldGl0ZW1fXywgLTEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1Ll9fZ2V0aXRlbV9fKQorCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMTAsIDExXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzBdLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzFdLCAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0yXSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMV0sIDExKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fZ2V0aXRlbV9fLCAtMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2dldGl0ZW1fXywgMykKKworICAgIGRlZiB0ZXN0X2dldHNsaWNlKHNlbGYpOgorICAgICAgICBsID0gWzAsIDEsIDIsIDMsIDRdCisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChsKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVswOjBdLCBzZWxmLnR5cGUydGVzdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbMToyXSwgc2VsZi50eXBlMnRlc3QoWzFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Wy0yOi0xXSwgc2VsZi50eXBlMnRlc3QoWzNdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Wy0xMDAwOjEwMDBdLCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbMTAwMDotMTAwMF0sIHNlbGYudHlwZTJ0ZXN0KFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzpdLCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbMTpOb25lXSwgc2VsZi50eXBlMnRlc3QoWzEsIDIsIDMsIDRdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1W05vbmU6M10sIHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyXSkpCisKKyAgICAgICAgIyBFeHRlbmRlZCBzbGljZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Wzo6XSwgdSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Wzo6Ml0sIHNlbGYudHlwZTJ0ZXN0KFswLCAyLCA0XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVsxOjoyXSwgc2VsZi50eXBlMnRlc3QoWzEsIDNdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Wzo6LTFdLCBzZWxmLnR5cGUydGVzdChbNCwgMywgMiwgMSwgMF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbOjotMl0sIHNlbGYudHlwZTJ0ZXN0KFs0LCAyLCAwXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVszOjotMl0sIHNlbGYudHlwZTJ0ZXN0KFszLCAxXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVszOjM6LTJdLCBzZWxmLnR5cGUydGVzdChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVszOjI6LTJdLCBzZWxmLnR5cGUydGVzdChbM10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbMzoxOi0yXSwgc2VsZi50eXBlMnRlc3QoWzNdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzM6MDotMl0sIHNlbGYudHlwZTJ0ZXN0KFszLCAxXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVs6Oi0xMDBdLCBzZWxmLnR5cGUydGVzdChbNF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbMTAwOi0xMDA6XSwgc2VsZi50eXBlMnRlc3QoW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbLTEwMDoxMDA6XSwgdSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzEwMDotMTAwOi0xXSwgdVs6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Wy0xMDA6MTAwOi0xXSwgc2VsZi50eXBlMnRlc3QoW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbLTEwMEw6MTAwTDoyTF0sIHNlbGYudHlwZTJ0ZXN0KFswLCAyLCA0XSkpCisKKyAgICAgICAgIyBUZXN0IGV4dHJlbWUgY2FzZXMgd2l0aCBsb25nIGludHMKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLDEsMiwzLDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbIC1wb3coMiwxMjhMKTogMyBdLCBzZWxmLnR5cGUydGVzdChbMCwxLDJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWyAzOiBwb3coMiwxNDVMKSBdLCBzZWxmLnR5cGUydGVzdChbMyw0XSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1Ll9fZ2V0c2xpY2VfXykKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKQorICAgICAgICBmb3IgaSBpbiB1OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpLCB1KQorICAgICAgICBmb3IgaSBpbiBtaW4odSktMSwgbWF4KHUpKzE6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGksIHUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1Ll9fY29udGFpbnNfXykKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zX2Zha2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEFsbEVxOgorICAgICAgICAgICAgIyBTZXF1ZW5jZXMgbXVzdCB1c2UgcmljaCBjb21wYXJpc29uIGFnYWluc3QgZWFjaCBpdGVtCisgICAgICAgICAgICAjICh1bmxlc3MgImlzIiBpcyB0cnVlLCBvciBhbiBlYXJsaWVyIGl0ZW0gYW5zd2VyZWQpCisgICAgICAgICAgICAjIFNvIGluc3RhbmNlcyBvZiBBbGxFcSBtdXN0IGJlIGZvdW5kIGluIGFsbCBub24tZW1wdHkgc2VxdWVuY2VzLgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIENhbid0IG1lZXQgaGFzaCBpbnZhcmlhbnQgcmVxdWlyZW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oQWxsRXEoKSwgc2VsZi50eXBlMnRlc3QoW10pKQorICAgICAgICBzZWxmLmFzc2VydEluKEFsbEVxKCksIHNlbGYudHlwZTJ0ZXN0KFsxXSkpCisKKyAgICBkZWYgdGVzdF9jb250YWluc19vcmRlcihzZWxmKToKKyAgICAgICAgIyBTZXF1ZW5jZXMgbXVzdCB0ZXN0IGluLW9yZGVyLiAgSWYgYSByaWNoIGNvbXBhcmlzb24gaGFzIHNpZGUKKyAgICAgICAgIyBlZmZlY3RzLCB0aGVzZSB3aWxsIGJlIHZpc2libGUgdG8gdGVzdHMgYWdhaW5zdCBsYXRlciBtZW1iZXJzLgorICAgICAgICAjIEluIHRoaXMgdGVzdCwgdGhlICJzaWRlIGVmZmVjdCIgaXMgYSBzaG9ydC1jaXJjdWl0aW5nIHJhaXNlLgorICAgICAgICBjbGFzcyBEb05vdFRlc3RFcShFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBTdG9wQ29tcGFyZXM6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBEb05vdFRlc3RFcQorCisgICAgICAgIGNoZWNrZmlyc3QgPSBzZWxmLnR5cGUydGVzdChbMSwgU3RvcENvbXBhcmVzKCldKQorICAgICAgICBzZWxmLmFzc2VydEluKDEsIGNoZWNrZmlyc3QpCisgICAgICAgIGNoZWNrbGFzdCA9IHNlbGYudHlwZTJ0ZXN0KFtTdG9wQ29tcGFyZXMoKSwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERvTm90VGVzdEVxLCBjaGVja2xhc3QuX19jb250YWluc19fLCAxKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnR5cGUydGVzdCgpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi50eXBlMnRlc3QoW10pKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi50eXBlMnRlc3QoWzBdKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyXSkpLCAzKQorCisgICAgZGVmIHRlc3RfbWlubWF4KHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbih1KSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgodSksIDIpCisKKyAgICBkZWYgdGVzdF9hZGRtdWwoc2VsZik6CisgICAgICAgIHUxID0gc2VsZi50eXBlMnRlc3QoWzBdKQorICAgICAgICB1MiA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MSwgdTEgKyBzZWxmLnR5cGUydGVzdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUxLCBzZWxmLnR5cGUydGVzdCgpICsgdTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTEgKyBzZWxmLnR5cGUydGVzdChbMV0pLCB1MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChbLTFdKSArIHUxLCBzZWxmLnR5cGUydGVzdChbLTEsIDBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCgpLCB1MiowKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KCksIDAqdTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoKSwgdTIqMEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoKSwgMEwqdTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIHUyKjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIDEqdTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIHUyKjFMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyLCAxTCp1MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mit1MiwgdTIqMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mit1MiwgMip1MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mit1MiwgdTIqMkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIrdTIsIDJMKnUyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyK3UyK3UyLCB1MiozKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyK3UyK3UyLCAzKnUyKQorCisgICAgICAgIGNsYXNzIHN1YmNsYXNzKHNlbGYudHlwZTJ0ZXN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdTMgPSBzdWJjbGFzcyhbMCwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTMsIHUzKjEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QodTMsIHUzKjEpCisKKyAgICBkZWYgdGVzdF9pYWRkKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICB1ICs9IHNlbGYudHlwZTJ0ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbMCwgMV0pKQorICAgICAgICB1ICs9IHNlbGYudHlwZTJ0ZXN0KFsyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbMCwgMSwgMiwgM10pKQorICAgICAgICB1ICs9IHNlbGYudHlwZTJ0ZXN0KFs0LCA1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzZWxmLnR5cGUydGVzdChbMCwgMSwgMiwgMywgNCwgNV0pKQorCisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdCgic3BhbSIpCisgICAgICAgIHUgKz0gc2VsZi50eXBlMnRlc3QoImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHNlbGYudHlwZTJ0ZXN0KCJzcGFtZWdncyIpKQorCisgICAgZGVmIHRlc3RfaW11bChzZWxmKToKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgdSAqPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgc2VsZi50eXBlMnRlc3QoWzAsIDEsIDAsIDEsIDAsIDFdKSkKKworICAgIGRlZiB0ZXN0X2dldGl0ZW1vdmVyd3JpdGVpdGVyKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IF9fZ2V0aXRlbV9fIG92ZXJyaWRlcyBhcmUgbm90IHJlY29nbml6ZWQgYnkgX19pdGVyX18KKyAgICAgICAgY2xhc3MgVChzZWxmLnR5cGUydGVzdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKGtleSkgKyAnISEhJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIoVCgoMSwyKSkpLm5leHQoKSwgMSkKKworICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAgICAgZm9yIG0gaW4geHJhbmdlKDQpOgorICAgICAgICAgICAgcyA9IHR1cGxlKHJhbmdlKG0pKQorICAgICAgICAgICAgZm9yIG4gaW4geHJhbmdlKC0zLCA1KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KHMqbiksIHNlbGYudHlwZTJ0ZXN0KHMpKm4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KHMpKigtNCksIHNlbGYudHlwZTJ0ZXN0KFtdKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQocyksIGlkKHMqMSkpCisKKyAgICBkZWYgdGVzdF9iaWdyZXBlYXQoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgc3lzLm1heGludCA8PSAyMTQ3NDgzNjQ3OgorICAgICAgICAgICAgeCA9IHNlbGYudHlwZTJ0ZXN0KFswXSkKKyAgICAgICAgICAgIHggKj0gMioqMTYKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE1lbW9yeUVycm9yLCB4Ll9fbXVsX18sIDIqKjE2KQorICAgICAgICAgICAgaWYgaGFzYXR0cih4LCAnX19pbXVsX18nKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhNZW1vcnlFcnJvciwgeC5fX2ltdWxfXywgMioqMTYpCisKKyAgICBkZWYgdGVzdF9zdWJzY3JpcHQoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChbMTAsIDExXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZ2V0aXRlbV9fKDBMKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2dldGl0ZW1fXygxTCksIDExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19nZXRpdGVtX18oLTJMKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2dldGl0ZW1fXygtMUwpLCAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2dldGl0ZW1fXywgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19nZXRpdGVtX18sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2dldGl0ZW1fXyhzbGljZSgwLDEpKSwgc2VsZi50eXBlMnRlc3QoWzEwXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2dldGl0ZW1fXyhzbGljZSgxLDIpKSwgc2VsZi50eXBlMnRlc3QoWzExXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2dldGl0ZW1fXyhzbGljZSgwLDIpKSwgc2VsZi50eXBlMnRlc3QoWzEwLCAxMV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19nZXRpdGVtX18oc2xpY2UoMCwzKSksIHNlbGYudHlwZTJ0ZXN0KFsxMCwgMTFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZ2V0aXRlbV9fKHNsaWNlKDMsNSkpLCBzZWxmLnR5cGUydGVzdChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuX19nZXRpdGVtX18sIHNsaWNlKDAsIDEwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fZ2V0aXRlbV9fLCAneCcpCisKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmKToKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyXSkqMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuY291bnQoMCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5jb3VudCgxKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmNvdW50KDMpLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5jb3VudCkKKworICAgICAgICBjbGFzcyBCYWRFeGMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBCYWRDbXA6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBvdGhlciA9PSAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBCYWRFeGMoKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJhZEV4YywgYS5jb3VudCwgQmFkQ21wKCkpCisKKyAgICBkZWYgdGVzdF9pbmRleChzZWxmKToKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUuaW5kZXgsIDIpCisKKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KFstMiwgLTEsIDAsIDAsIDEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuY291bnQoMCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDAsIDIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuaW5kZXgoLTIsIC0xMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5pbmRleCgwLCAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmluZGV4KDAsIDMsIDQpLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1LmluZGV4LCAyLCAwLCAtMTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1LmluZGV4KQorCisgICAgICAgIGNsYXNzIEJhZEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEJhZENtcDoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIG90aGVyID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEJhZEV4YygpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgYSA9IHNlbGYudHlwZTJ0ZXN0KFswLCAxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQmFkRXhjLCBhLmluZGV4LCBCYWRDbXAoKSkKKworICAgICAgICBhID0gc2VsZi50eXBlMnRlc3QoWy0yLCAtMSwgMCwgMCwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIDIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgLTQpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoLTIsIC0xMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCgwLCAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIC0zKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIDMsIDQpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaW5kZXgoMCwgLTMsIC0yKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmluZGV4KDAsIC00KnN5cy5tYXhpbnQsIDQqc3lzLm1heGludCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuaW5kZXgsIDAsIDQqc3lzLm1heGludCwtNCpzeXMubWF4aW50KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLmluZGV4LCAyLCAwLCAtMTApCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2VxX3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zZXFfdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDllYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2VxX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2VxX3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zZXFfdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhMDllYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc2VxX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc2dtbF9pbnB1dC5odG1sIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NnbWxfaW5wdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQyZTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NnbWxfaW5wdXQuaHRtbApAQCAtMCwwICsxLDIxMiBAQAorPGh0bWw+CisgPGhlYWQ+CisgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvZm9ybWF0ZS5jc3MiPgorICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0IiBzcmM9ImpzL2Zsb3R0ZW4uanMiPjwvc2NyaXB0PgorIDwvaGVhZD4KKyA8Ym9keT4KKyAgICA8c2NyaXB0IGxhbmd1YWdlPUphdmFTY3JpcHQ+IGlmIChwYXJlbnQuZnJhbWVzLmxlbmd0aCA9PSAwKSB7IHRvcC5sb2NhdGlvbi5ocmVmID0gImh0dHA6Ly9lcy5vZ2FtZS5vcmcvIjsgfSA8L3NjcmlwdD4gPHNjcmlwdCBsYW5ndWFnZT0iSmF2YVNjcmlwdCI+CitmdW5jdGlvbiBoYWhhKHoxKSB7CisgIGV2YWwoImxvY2F0aW9uPSciK3oxLm9wdGlvbnNbejEuc2VsZWN0ZWRJbmRleF0udmFsdWUrIiciKTsKK30KKzwvc2NyaXB0PgorPGNlbnRlcj4KKzx0YWJsZT4KKyA8dHI+CisgIDx0ZD48L3RkPgorICA8dGQ+CisgICA8Y2VudGVyPgorICAgPHRhYmxlPgorICAgIDx0cj4KKyAgICAgPHRkPjxpbWcgc3JjPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvcGxhbmV0ZW4vc21hbGwvc19kc2NoanVuZ2VscGxhbmV0MDQuanBnIiB3aWR0aD0iNTAiIGhlaWdodD0iNTAiPjwvdGQ+CisgICAgIDx0ZD4KKyAgICAgIDx0YWJsZSBib3JkZXI9IjEiPgorICAgICAgIDxzZWxlY3Qgc2l6ZT0iMSIgb25jaGFuZ2U9ImhhaGEodGhpcykiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzM4NzUzNDEmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgc2VsZWN0ZWQ+QWxpZW4gc2V4IGZyaWVuZCAgICBbMjoyNTA6Nl08L29wdGlvbj4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Ii9nYW1lL2Zsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyZjcD0zMzkwNTEwMCZtb2RlPUZsb3R0ZSZnaWQ9Jm1lc3NhZ2V6aWVsPSZyZT0wIiA+MTk4OSAgICBbMjoyNDg6MTRdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzQ1NzA4MDgmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgPjE5OTAgICAgWzI6MjQ4OjZdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzQ1NzA4NTgmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgPjE5OTEgICAgWzI6MjU0OjZdPC9vcHRpb24+IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIvZ2FtZS9mbG90dGVuMS5waHA/c2Vzc2lvbj04OTEyYWU5MTJmZWMmY3A9MzQ1NzI5MjkmbW9kZT1GbG90dGUmZ2lkPSZtZXNzYWdlemllbD0mcmU9MCIgPkNvbG9uaWEgICAgWzI6MjUzOjEyXTwvb3B0aW9uPiAKKyAgICAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgPC90YWJsZT4KKyAgICAgPC90ZD4KKyAgICA8L3RyPgorICA8L3RhYmxlPgorICA8L2NlbnRlcj4KKyAgPC90ZD4KKyAgPHRkPgorICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CisgICAgPHRyPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiIHdpZHRoPSI4NSI+CisgICAgICA8aW1nIGJvcmRlcj0iMCIgc3JjPSJodHRwOi8vb2dhbWUxODIuZGUvZXBpY2JsdWUvaW1hZ2VzL21ldGFsbC5naWYiIHdpZHRoPSI0MiIgaGVpZ2h0PSIyMiI+CisgICAgIDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPgorICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL2ltYWdlcy9rcmlzdGFsbC5naWYiIHdpZHRoPSI0MiIgaGVpZ2h0PSIyMiI+CisgICAgIDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPgorICAgICAgPGltZyBib3JkZXI9IjAiIHNyYz0iaHR0cDovL29nYW1lMTgyLmRlL2VwaWNibHVlL2ltYWdlcy9kZXV0ZXJpdW0uZ2lmIiB3aWR0aD0iNDIiIGhlaWdodD0iMjIiPgorICAgICA8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4KKyAgICAgIDxpbWcgYm9yZGVyPSIwIiBzcmM9Imh0dHA6Ly9vZ2FtZTE4Mi5kZS9lcGljYmx1ZS9pbWFnZXMvZW5lcmdpZS5naWYiIHdpZHRoPSI0MiIgaGVpZ2h0PSIyMiI+CisgICAgIDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48L3RkPgorICAgIDwvdHI+CisgICAgPHRyPgorICAgICA8dGQgYWxpZ249ImNlbnRlciI+PGk+PGI+Jm5ic3A7Jm5ic3A7PC9iPjwvaT48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij48aT48Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+TWV0YWw8L2ZvbnQ+PC9iPjwvaT48L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij48aT48Yj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+Q3Jpc3RhbDwvZm9udD48L2I+PC9pPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxpPjxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5EZXV0ZXJpbzwvZm9udD48L2I+PC9pPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxpPjxiPjxmb250IGNvbG9yPSIjZmZmZmZmIj5FbmVyZ+1hPC9mb250PjwvYj48L2k+PC90ZD4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjxpPjxiPiZuYnNwOyZuYnNwOzwvYj48L2k+PC90ZD4KKyAgICA8L3RyPgorICAgIDx0cj4KKyAgICAgPHRkIGFsaWduPSJjZW50ZXIiPjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjE2MC42MzY8L3RkPgorICAgICA8dGQgYWxpZ249ImNlbnRlciIgd2lkdGg9Ijg1Ij4zLjQwNjwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjM5LjIzMDwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIiB3aWR0aD0iODUiPjxmb250IGNvbG9yPSNmZjAwMDA+LTgwPC9mb250Pi8zLjk2NTwvdGQ+CisgICAgIDx0ZCBhbGlnbj0iY2VudGVyIj48L3RkPgorICAgIDwvdHI+CisgICA8L3RhYmxlPgorICA8L3RyPgorIDwvdGFibGU+CisgIDwvY2VudGVyPgorPGJyIC8+CisgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFTY3JpcHQiPgorICA8IS0tCisgICAgIGZ1bmN0aW9uIGxpbmtfdG9fZ2FtZXBheSgpIHsKKyAgICBzZWxmLmxvY2F0aW9uID0gImh0dHBzOi8vd3d3LmdhbWVwYXkuZGUvP2xhbmc9ZXMmc2VydmVySUQ9OCZ1c2VySUQ9MTI5MzYwJmdhbWVJRD1vZ2FtZSZndWk9djImY2hrc3VtPWE5NzUxYWZhOWUzN2U2YjFiODI2MzU2YmNjYTQ1Njc1IjsKKyAgfQorLy8tLT4KKyAgPC9zY3JpcHQ+Cis8Y2VudGVyPgorICA8dGFibGUgd2lkdGg9IjUxOSIgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjEiPgorICAgPHRyIGhlaWdodD0iMjAiPgorICA8dGQgY29sc3Bhbj0iOCIgY2xhc3M9ImMiPkZsb3RhcyAobWF4LiA5KTwvdGQ+CisgICA8L3RyPgorICAgICA8dHIgaGVpZ2h0PSIyMCI+CisgICAgPHRoPk51bS48L3RoPgorICAgIDx0aD5NaXNp8248L3RoPgorICAgIDx0aD5DYW50aWRhZDwvdGg+CisgICAgPHRoPkNvbWllbnpvPC90aD4KKyAgICA8dGg+U2FsaWRhPC90aD4KKyAgICA8dGg+T2JqZXRpdm88L3RoPgorICAgIDx0aD5MbGVnYWRhPC90aD4KKyAgICA8dGg+T3JkZW48L3RoPiAgIAorICAgPC90cj4KKyAgICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD4xPC90aD4KKyAgICA8dGg+ICAKKyAgICAgIDxhIHRpdGxlPSIiPkVzcGlvbmFqZTwvYT4KKyAgICAgIDxhIHRpdGxlPSJGbG90YSBlbiBlbCBwbGFuZXRhIj4oRik8L2E+CisgICAgPC90aD4KKyAgICA8dGg+IDxhIHRpdGxlPSJTb25kYSBkZSBlc3Bpb25hamU6IDMgCisiPjM8L2E+PC90aD4KKyAgICA8dGg+WzI6MjUwOjZdPC90aD4KKyAgICA8dGg+V2VkIEF1ZyA5IDE4OjAwOjAyPC90aD4KKyAgICA8dGg+WzI6MjQyOjVdPC90aD4KKyAgICA8dGg+V2VkIEF1ZyA5IDE4OjAxOjAyPC90aD4KKyAgICA8dGg+CisgICAgICAgICA8Zm9ybSBhY3Rpb249ImZsb3R0ZW4xLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyIgbWV0aG9kPSJQT1NUIj4KKwk8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcmRlcl9yZXR1cm4iIHZhbHVlPSIyNTA1NDQ5MCIgLz4KKyAgICAgICAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkVudmlhciBkZSByZWdyZXNvIiAvPgorICAgICA8L2Zvcm0+CisgICAgICAgICAgICA8L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+MjwvdGg+CisgICAgPHRoPiAgCisgICAgICA8YSB0aXRsZT0iIj5Fc3Bpb25hamU8L2E+CisgICAgICA8YSB0aXRsZT0iVm9sdmVyIGFsIHBsYW5ldGEiPihWKTwvYT4KKyAgICA8L3RoPgorICAgIDx0aD4gPGEgdGl0bGU9IlNvbmRhIGRlIGVzcGlvbmFqZTogMyAKKyI+MzwvYT48L3RoPgorICAgIDx0aD5bMjoyNTA6Nl08L3RoPgorICAgIDx0aD5XZWQgQXVnIDkgMTc6NTk6NTU8L3RoPgorICAgIDx0aD5bMjoyNDI6MV08L3RoPgorICAgIDx0aD5XZWQgQXVnIDkgMTg6MDE6NTU8L3RoPgorICAgIDx0aD4KKyAgICAgICAgICAgIDwvdGg+CisgICA8L3RyPgorICA8L3RhYmxlPgorCisKKyAgCis8Zm9ybSBhY3Rpb249ImZsb3R0ZW4yLnBocD9zZXNzaW9uPTg5MTJhZTkxMmZlYyIgbWV0aG9kPSJQT1NUIj4KKyAgPHRhYmxlIHdpZHRoPSI1MTkiIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIxIj4KKyAgICAgICA8dHIgaGVpZ2h0PSIyMCI+CisgIDx0ZCBjb2xzcGFuPSI0IiBjbGFzcz0iYyI+TnVldmEgbWlzafNuOiBlbGVnaXIgbmF2ZXM8L3RkPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgPHRoPk5hdmVzPC90aD4KKyAgPHRoPkRpc3BvbmlibGVzPC90aD4KKzwhLS0gICAgPHRoPkdlc2NoLjwvdGg+IC0tPgorICAgIDx0aD4tPC90aD4KKyAgICA8dGg+LTwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD48YSB0aXRsZT0iVmVsb2NpZGFkOiA4NTAwIj5OYXZlIHBlcXVl8WEgZGUgY2FyZ2E8L2E+PC90aD4gCisgICAgPHRoPjEwPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibWF4c2hpcDIwMiIgdmFsdWU9IjEwIi8+PC90aD4KKzwhLS0gICAgPHRoPjg1MDAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjAyIiB2YWx1ZT0iMTAiLz4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlZWQyMDIiIHZhbHVlPSI4NTAwIiAvPjwvdGg+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNhcGFjaXR5MjAyIiB2YWx1ZT0iNTAwMCIgLz48L3RoPgorICAgICA8dGg+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwKCdzaGlwMjAyJyk7IiA+beF4PC9hPiA8L3RoPgorICAgICA8dGg+PGlucHV0IG5hbWU9InNoaXAyMDIiIHNpemU9IjEwIiB2YWx1ZT0iMCIgYWx0PSJOYXZlIHBlcXVl8WEgZGUgY2FyZ2EgMTAiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogMTI3NTAiPk5hdmUgZ3JhbmRlIGRlIGNhcmdhPC9hPjwvdGg+IAorICAgIDx0aD4xOTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1heHNoaXAyMDMiIHZhbHVlPSIxOSIvPjwvdGg+Cis8IS0tICAgIDx0aD4xMjc1MCAtLT4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29uc3VtcHRpb24yMDMiIHZhbHVlPSI1MCIvPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVlZDIwMyIgdmFsdWU9IjEyNzUwIiAvPjwvdGg+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNhcGFjaXR5MjAzIiB2YWx1ZT0iMjUwMDAiIC8+PC90aD4KKyAgICAgPHRoPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcCgnc2hpcDIwMycpOyIgPm3heDwvYT4gPC90aD4KKyAgICAgPHRoPjxpbnB1dCBuYW1lPSJzaGlwMjAzIiBzaXplPSIxMCIgdmFsdWU9IjAiIGFsdD0iTmF2ZSBncmFuZGUgZGUgY2FyZ2EgMTkiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogMjcwMDAiPkNydWNlcm88L2E+PC90aD4gCisgICAgPHRoPjY8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJtYXhzaGlwMjA2IiB2YWx1ZT0iNiIvPjwvdGg+Cis8IS0tICAgIDx0aD4yNzAwMCAtLT4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY29uc3VtcHRpb24yMDYiIHZhbHVlPSIzMDAiLz4KKyAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ic3BlZWQyMDYiIHZhbHVlPSIyNzAwMCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIwNiIgdmFsdWU9IjgwMCIgLz48L3RoPgorICAgICA8dGg+PGEgaHJlZj0iamF2YXNjcmlwdDptYXhTaGlwKCdzaGlwMjA2Jyk7IiA+beF4PC9hPiA8L3RoPgorICAgICA8dGg+PGlucHV0IG5hbWU9InNoaXAyMDYiIHNpemU9IjEwIiB2YWx1ZT0iMCIgYWx0PSJDcnVjZXJvIDYiLz48L3RoPgorICAgPC90cj4KKyAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGg+PGEgdGl0bGU9IlZlbG9jaWRhZDogMzQwMCI+UmVjaWNsYWRvcjwvYT48L3RoPiAKKyAgICA8dGg+MTxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Im1heHNoaXAyMDkiIHZhbHVlPSIxIi8+PC90aD4KKzwhLS0gICAgPHRoPjM0MDAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjA5IiB2YWx1ZT0iMzAwIi8+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InNwZWVkMjA5IiB2YWx1ZT0iMzQwMCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIwOSIgdmFsdWU9IjIwMDAwIiAvPjwvdGg+CisgICAgIDx0aD48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXAoJ3NoaXAyMDknKTsiID5t4Xg8L2E+IDwvdGg+CisgICAgIDx0aD48aW5wdXQgbmFtZT0ic2hpcDIwOSIgc2l6ZT0iMTAiIHZhbHVlPSIwIiBhbHQ9IlJlY2ljbGFkb3IgMSIvPjwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICAgIDx0aD48YSB0aXRsZT0iVmVsb2NpZGFkOiAxNzAwMDAwMDAiPlNvbmRhIGRlIGVzcGlvbmFqZTwvYT48L3RoPiAKKyAgICA8dGg+MTM5PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ibWF4c2hpcDIxMCIgdmFsdWU9IjEzOSIvPjwvdGg+Cis8IS0tICAgIDx0aD4xNzAwMDAwMDAgLS0+CisgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNvbnN1bXB0aW9uMjEwIiB2YWx1ZT0iMSIvPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzcGVlZDIxMCIgdmFsdWU9IjE3MDAwMDAwMCIgLz48L3RoPgorICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjYXBhY2l0eTIxMCIgdmFsdWU9IjUiIC8+PC90aD4KKyAgICAgPHRoPjxhIGhyZWY9ImphdmFzY3JpcHQ6bWF4U2hpcCgnc2hpcDIxMCcpOyIgPm3heDwvYT4gPC90aD4KKyAgICAgPHRoPjxpbnB1dCBuYW1lPSJzaGlwMjEwIiBzaXplPSIxMCIgdmFsdWU9IjAiIGFsdD0iU29uZGEgZGUgZXNwaW9uYWplIDEzOSIvPjwvdGg+CisgICA8L3RyPgorICAgPHRyIGhlaWdodD0iMjAiPgorICA8dGggY29sc3Bhbj0iMiI+PGEgaHJlZj0iamF2YXNjcmlwdDpub1NoaXBzKCk7IiA+TmluZ3VuYSBuYXZlPC9hPjwvdGg+CisgIDx0aCBjb2xzcGFuPSIyIj48YSBocmVmPSJqYXZhc2NyaXB0Om1heFNoaXBzKCk7IiA+VG9kYXMgbGFzIG5hdmVzPC9hPjwvdGg+CisgICA8L3RyPgorICAgIDx0ciBoZWlnaHQ9IjIwIj4KKyAgICA8dGggY29sc3Bhbj0iNCI+PGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IkNvbnRpbnVhciIgLz48L3RoPgorICAgPC90cj4KKzx0cj48dGggY29sc3Bhbj00PgorPGlmcmFtZSBpZD0nYTQ0ZmI1MjInIG5hbWU9J2E0NGZiNTIyJyBzcmM9J2h0dHA6Ly9hZHMuZ2FtZWZvcmdlYWRzLmRlL2FkZnJhbWUucGhwP249YTQ0ZmI1MjImYW1wO3doYXQ9em9uZTo1NzgnIGZyYW1lc3BhY2luZz0nMCcgZnJhbWVib3JkZXI9J25vJyBzY3JvbGxpbmc9J25vJyB3aWR0aD0nNDY4JyBoZWlnaHQ9JzYwJz48L2lmcmFtZT4KKzxicj48Y2VudGVyPjwvY2VudGVyPjwvYnI+Cis8L3RoPjwvdHI+Cis8L2Zvcm0+Cis8L3RhYmxlPgorIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zaGEyNTYucGVtIGIvbGliL3B5dGhvbjIuNy90ZXN0L3NoYTI1Ni5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ3NTU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zaGEyNTYucGVtCkBAIC0wLDAgKzEsMTI4IEBACisjIENlcnRpZmljYXRlIGNoYWluIGZvciBodHRwczovL3NoYTI1Ni50YnMtaW50ZXJuZXQuY29tCisgMCBzOi9DPUZSL3Bvc3RhbENvZGU9MTQwMDAvU1Q9Q2FsdmFkb3MvTD1DQUVOL3N0cmVldD0yMiBydWUgZGUgQnJldGFnbmUvTz1UQlMgSU5URVJORVQvT1U9MDAwMiA0NDA0NDM4MTAvT1U9Q2VydGlmaWNhdHMgVEJTIFg1MDkvQ049ZWNvbS50YnMteDUwOS5jb20KKyAgIGk6L0M9RlIvU1Q9Q2FsdmFkb3MvTD1DYWVuL089VEJTIElOVEVSTkVUL09VPVRlcm1zIGFuZCBDb25kaXRpb25zOiBodHRwOi8vd3d3LnRicy1pbnRlcm5ldC5jb20vQ0EvcmVwb3NpdG9yeS9PVT1UQlMgSU5URVJORVQgQ0EvQ049VEJTIFg1MDkgQ0EgYnVzaW5lc3MKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJR1RqQ0NCVGFnQXdJQkFnSVFPaDNkOWRORFBxMWNTZEptRWlNcHFEQU5CZ2txaGtpRzl3MEJBUVVGQURDQgoreVRFTE1Ba0dBMVVFQmhNQ1JsSXhFVEFQQmdOVkJBZ1RDRU5oYkhaaFpHOXpNUTB3Q3dZRFZRUUhFd1JEWVdWdQorTVJVd0V3WURWUVFLRXd4VVFsTWdTVTVVUlZKT1JWUXhTREJHQmdOVkJBc1RQMVJsY20xeklHRnVaQ0JEYjI1aworYVhScGIyNXpPaUJvZEhSd09pOHZkM2QzTG5SaWN5MXBiblJsY201bGRDNWpiMjB2UTBFdmNtVndiM05wZEc5eQorZVRFWU1CWUdBMVVFQ3hNUFZFSlRJRWxPVkVWU1RrVlVJRU5CTVIwd0d3WURWUVFERXhSVVFsTWdXRFV3T1NCRAorUVNCaWRYTnBibVZ6Y3pBZUZ3MHhNVEF4TWpVd01EQXdNREJhRncweE16QXlNRFV5TXpVNU5UbGFNSUhITVFzdworQ1FZRFZRUUdFd0pHVWpFT01Bd0dBMVVFRVJNRk1UUXdNREF4RVRBUEJnTlZCQWdUQ0VOaGJIWmhaRzl6TVEwdworQ3dZRFZRUUhFd1JEUVVWT01Sc3dHUVlEVlFRSkV4SXlNaUJ5ZFdVZ1pHVWdRbkpsZEdGbmJtVXhGVEFUQmdOVgorQkFvVERGUkNVeUJKVGxSRlVrNUZWREVYTUJVR0ExVUVDeE1PTURBd01pQTBOREEwTkRNNE1UQXhIVEFiQmdOVgorQkFzVEZFTmxjblJwWm1sallYUnpJRlJDVXlCWU5UQTVNUm93R0FZRFZRUURFeEZsWTI5dExuUmljeTE0TlRBNQorTG1OdmJUQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUtScmxIVW5KKysxbHBjZworanRZY283Y2RtUmUrRUVmVG13UGZDZGZWM0cxUWZzVFN2WTZGZk1wbS84M3BxSGZUKzRBTndyMTh3RDlackFFTgorRzE2bWY5VmRDR0sxMitUUDdEbXFlWnlHSXFsRkZvYWhRbm1iOEVhcnZFNDMvMVVlUTJDVjlYbXp3WnZwcWVsaQorTGZYc0ZvbmF3clkzSDZabk13UzY0U3Q2MVorOWdkeXVaL1Jic29aQmJUNUtVakRFRzg0NFFSVTRPVDFJR2VFSQorZVk1Tk01Uk5JaDZaTmhWdHFlZUN4TVM3YWZPTmtIUXJPY283M1JkU1RSY2svSGo5Nk9mbDNNSE5IcnlyK0FNSworREdGazFrTENaR3BQZFh0a3hYdmFEZVFvaVlEbGlsMjZDV2MrWUs2eHlEUE1kc1d2b0cxNFpMeUNwek1YQTcvNworNFlBUVJIMENBd0VBQWFPQ0FqQXdnZ0lzTUI4R0ExVWRJd1FZTUJhQUZCb0pCTXo1Q1krN0hxRE8xS1FVZjB2VgorSTFqTk1CMEdBMVVkRGdRV0JCUWdPVThIc1d6Ym1ENFdaUDVXdGR3N2pjYTJXREFPQmdOVkhROEJBZjhFQkFNQworQmFBd0RBWURWUjBUQVFIL0JBSXdBREFkQmdOVkhTVUVGakFVQmdnckJnRUZCUWNEQVFZSUt3WUJCUVVIQXdJdworVEFZRFZSMGdCRVV3UXpCQkJnc3JCZ0VFQVlEbE53SUJBVEF5TURBR0NDc0dBUVVGQndJQkZpUm9kSFJ3Y3pvdgorTDNkM2R5NTBZbk10YVc1MFpYSnVaWFF1WTI5dEwwTkJMME5RVXpFd2R3WURWUjBmQkhBd2JqQTNvRFdnTTRZeAorYUhSMGNEb3ZMMk55YkM1MFluTXRhVzUwWlhKdVpYUXVZMjl0TDFSQ1UxZzFNRGxEUVdKMWMybHVaWE56TG1OeQorYkRBem9ER2dMNFl0YUhSMGNEb3ZMMk55YkM1MFluTXRlRFV3T1M1amIyMHZWRUpUV0RVd09VTkJZblZ6YVc1bAorYzNNdVkzSnNNSUd3QmdnckJnRUZCUWNCQVFTQm96Q0JvREE5QmdnckJnRUZCUWN3QW9ZeGFIUjBjRG92TDJOeQorZEM1MFluTXRhVzUwWlhKdVpYUXVZMjl0TDFSQ1UxZzFNRGxEUVdKMWMybHVaWE56TG1OeWREQTVCZ2dyQmdFRgorQlFjd0FvWXRhSFIwY0RvdkwyTnlkQzUwWW5NdGVEVXdPUzVqYjIwdlZFSlRXRFV3T1VOQlluVnphVzVsYzNNdQorWTNKME1DUUdDQ3NHQVFVRkJ6QUJoaGhvZEhSd09pOHZiMk56Y0M1MFluTXRlRFV3T1M1amIyMHdNd1lEVlIwUgorQkN3d0tvSVJaV052YlM1MFluTXRlRFV3T1M1amIyMkNGWGQzZHk1bFkyOXRMblJpY3kxNE5UQTVMbU52YlRBTgorQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBclQ0TkhmYlk4N2JHQXc4bFBWNERtSGxtdUR1VnAveTdsdE8zWW5zZQorM1J6OFJ4VzJBenVPME95MkYwQ3U0eVdLdE15RXlNWHlIcVd0YWU3RWxSYmRUdTV3NUd3VkJMSkhDbEN6QzhTOQorU3BnTU1RVHgzUmduOHZqa0h1VTlWWlFsdWxaeWlQSzd5dW5qYzdjMzEwUzlGUlo3WHhPd2Y4Tm54NFduQitObworV3JmQXB6aGhRbDMxdytSeXJOeFplNThoQ2ZEREhtZXZSdndMalE3ODVab1FYSkRqMmozcUFENGFJMnlCOGxCNQorb2FFMWpsQ0p6QzdLbXovWTlqemZtdi96QXMxTFFUbTlrdGV2djRCVFVGYUdqdjlqeG5RMXhuUzg2Mlppb3VMVworelpZSWxZUGY0RjZKalhHaUlRZ1FSZ2xJTFVmcTNmdEpkOS9vazlXOVpGOGg4dz09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisgMSBzOi9DPUZSL1NUPUNhbHZhZG9zL0w9Q2Flbi9PPVRCUyBJTlRFUk5FVC9PVT1UZXJtcyBhbmQgQ29uZGl0aW9uczogaHR0cDovL3d3dy50YnMtaW50ZXJuZXQuY29tL0NBL3JlcG9zaXRvcnkvT1U9VEJTIElOVEVSTkVUIENBL0NOPVRCUyBYNTA5IENBIGJ1c2luZXNzCisgICBpOi9DPVNFL089QWRkVHJ1c3QgQUIvT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsvQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGUHpDQ0JDZWdBd0lCQWdJUURsQnovKytpUlNtTERlVlJIVC9oQURBTkJna3Foa2lHOXcwQkFRVUZBREJ2CitNUXN3Q1FZRFZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhKakFrQmdOVkJBc1RIVUZrCitaRlJ5ZFhOMElFVjRkR1Z5Ym1Gc0lGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRFZRUURFeGxCWkdSVWNuVnpkQ0JGCitlSFJsY201aGJDQkRRU0JTYjI5ME1CNFhEVEExTVRJd01UQXdNREF3TUZvWERURTVNRGN3T1RFNE1Ua3lNbG93CitnY2t4Q3pBSkJnTlZCQVlUQWtaU01SRXdEd1lEVlFRSUV3aERZV3gyWVdSdmN6RU5NQXNHQTFVRUJ4TUVRMkZsCitiakVWTUJNR0ExVUVDaE1NVkVKVElFbE9WRVZTVGtWVU1VZ3dSZ1lEVlFRTEV6OVVaWEp0Y3lCaGJtUWdRMjl1CitaR2wwYVc5dWN6b2dhSFIwY0RvdkwzZDNkeTUwWW5NdGFXNTBaWEp1WlhRdVkyOXRMME5CTDNKbGNHOXphWFJ2Citjbmt4R0RBV0JnTlZCQXNURDFSQ1V5QkpUbFJGVWs1RlZDQkRRVEVkTUJzR0ExVUVBeE1VVkVKVElGZzFNRGtnCitRMEVnWW5WemFXNWxjM013Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRREIxUEFVCitxdWRDY3ozdG15R2NmK3U2RWtacW9uS0tIclY0Z1pZYnZWa0lSb2ptbWxoZmkvand2cEh2bzhicVN0LzlSajVTCitqaENEVzBwY2JJK0lQUHREMUp5K0NITlNmbk1xVkR5NkNLUTNwNW1hVHpDTUc2WlQrWGpudmNORDV2K0Z0YWlCCit4azFpQ1g2dXZ0MGplVXRkWnZZYnl5dHNTREU2YzNZNS8vd1J4T0Y4dE0xSnhpYndPM3B5RVIyNmpiYk4yZ1F6CittL0VrZEdqTGRKNHN2UGsyM1dEQXZRNkcwL3oyTGNBYUpCK1hMZnFSd2ZRcEhRdmZLYTF1VGk4UGl2QzhxdGlwCitybU5RTU1QTWp4U0syYXpYOGNLampUREppVUthQ2I0VkhsSkRXS0VzQ0ZScGdKQW9BdVg4ZjdZZnMxTTRlc0dvCitzV2IzUEdzcEszTzIydUlsQWdNQkFBR2pnZ0Y2TUlJQmRqQWRCZ05WSFE0RUZnUVVHZ2tFelBrSmo3c2VvTTdVCitwQlIvUzlValdNMHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CSUdBMVVkRXdFQi93UUlNQVlCQWY4Q0FRQXdHQVlECitWUjBnQkJFd0R6QU5CZ3NyQmdFRUFZRGxOd0lCQVRCN0JnTlZIUjhFZERCeU1EaWdOcUEwaGpKb2RIUndPaTh2CitZM0pzTG1OdmJXOWtiMk5oTG1OdmJTOUJaR1JVY25WemRFVjRkR1Z5Ym1Gc1EwRlNiMjkwTG1OeWJEQTJvRFNnCitNb1l3YUhSMGNEb3ZMMk55YkM1amIyMXZaRzh1Ym1WMEwwRmtaRlJ5ZFhOMFJYaDBaWEp1WVd4RFFWSnZiM1F1CitZM0pzTUlHR0JnZ3JCZ0VGQlFjQkFRUjZNSGd3T3dZSUt3WUJCUVVITUFLR0wyaDBkSEE2THk5amNuUXVZMjl0CitiMlJ2WTJFdVkyOXRMMEZrWkZSeWRYTjBWVlJPVTJWeWRtVnlRMEV1WTNKME1Ea0dDQ3NHQVFVRkJ6QUNoaTFvCitkSFJ3T2k4dlkzSjBMbU52Ylc5a2J5NXVaWFF2UVdSa1ZISjFjM1JWVkU1VFpYSjJaWEpEUVM1amNuUXdFUVlKCitZSVpJQVliNFFnRUJCQVFEQWdJRU1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQkFRQTdtcXJNZ2svTXJFNlFuYk5BCitoNG5SQ24ydGk0Ymc0dzJDM2xCNmJTdlJQbll3dU53OUpiOHZ1S2tORnpSRHhOSlhxVkRaZGZGVzVDVlFKdXlkCituZkF4ODMrd2src3B6dkZhRTFLaEZZZk45RzlwUWZYVWZ2RFJvSWNKZ1BFS1VYTDF3UmlPRytJalUzVlZJOHBnCitJZ3FIa3I3eWxsbjVpNXpDaUZBUHVJSm1ZVVNGZy9neEg1eGtDTmNqSnFxckhySGF0SnI2UXJya2U5M2pvdXB3CitvVTFuamZBY1p0WXA2ZmJpSzZ1MmIxcEpxd2tWQkU4UnNmTG5QaFJqK1NGYnB2anY4T2Q3by9pZUpoRklZUU5VCitrMmpYMnU4cVpuQWlOdzkzTFpXOWxwWWp0dXZNWHE4UVFwcEVOTmphNWI1M3E3VXdJK2xVN1pHalo3cXV1RVNwCitKNi81CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCisgMiBzOi9DPVNFL089QWRkVHJ1c3QgQUIvT1U9QWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsvQ049QWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9vdAorICAgaTovQz1VUy9TVD1VVC9MPVNhbHQgTGFrZSBDaXR5L089VGhlIFVTRVJUUlVTVCBOZXR3b3JrL09VPWh0dHA6Ly93d3cudXNlcnRydXN0LmNvbS9DTj1VVE4tVVNFUkZpcnN0LUhhcmR3YXJlCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVUekNDQXplZ0F3SUJBZ0lRSE01RVlwVVplcDFqVXZueUk2bTJtREFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKK2x6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWcKK1EybDBlVEVlTUJ3R0ExVUVDaE1WVkdobElGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG8KK2RIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4SHpBZEJnTlZCQU1URmxWVVRpMVZVMFZTUm1seWMzUXQKK1NHRnlaSGRoY21Vd0hoY05NRFV3TmpBM01EZ3dPVEV3V2hjTk1Ua3dOekE1TVRneE9USXlXakJ2TVFzd0NRWUQKK1ZRUUdFd0pUUlRFVU1CSUdBMVVFQ2hNTFFXUmtWSEoxYzNRZ1FVSXhKakFrQmdOVkJBc1RIVUZrWkZSeWRYTjAKK0lFVjRkR1Z5Ym1Gc0lGUlVVQ0JPWlhSM2IzSnJNU0l3SUFZRFZRUURFeGxCWkdSVWNuVnpkQ0JGZUhSbGNtNWgKK2JDQkRRU0JTYjI5ME1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBdC9jYU0rYnkKK0FBUXRPZUJPVyswZnZHd1B6Ylg2STdiTzNwc1JNNWVrS1V4OWs1KzlTcnlUN1FNYTQ0L1A1VzFRV3RhWEtaUmEKK2dMQkpldHN1bGYyNHlyODNPQzBlUHBGQnJYQld4L0JQUCtneW5uVEt5SkJVNmNaZkQzaWRta0E4RHF4aHFsNFUKK2o1NkhvV3BRM05lYVRxOEZzNlp4bEp4eHMxQmdDc2NUblRnSGhnS282YWhwSmhpUXEweXdUeU9yT2srRTJOL08KK24rRnBiN3ZYUXRkclJPVEhyZTV0UVY5eVduRUlON041WmFSWm9KUTM5d0F2RGNLU2N0clFPSExiRktoRnhGMHEKK2ZiZTAxc1R1ck0wVFJMZkpLOTFEQUNYNllibHBhbGdqRWJlbk00OVdkVm4xelNuWFJyY0tLMlcyMDBKdkZiSzQKK2UvdnY2VjFUMVRSYUp3SURBUUFCbzRHOU1JRzZNQjhHQTFVZEl3UVlNQmFBRktGeVh5WWJLSmhEbFYwSE45V0YKK2xwMUwwc05GTUIwR0ExVWREZ1FXQkJTdHZaaDZOTFFtOS9yRUpsVHZBNzNnSk10VUdqQU9CZ05WSFE4QkFmOEUKK0JBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFSQmdsZ2hrZ0JodmhDQVFFRUJBTUNBUUl3UkFZRFZSMGYKK0JEMHdPekE1b0RlZ05ZWXphSFIwY0RvdkwyTnliQzUxYzJWeWRISjFjM1F1WTI5dEwxVlVUaTFWVTBWU1JtbHkKK2MzUXRTR0Z5WkhkaGNtVXVZM0pzTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCeVFoQU5PczRrQ2xyd0Y4QlcKK29udlVPR0NTalJLNTJ6WVpnRFhZTmpEdG1yNXJKNk55UEZETm4rSnhrTHBqWWV0SUZNVGJTUmU2NzlCdDhtN2EKK2dJQW9RWUZRdHhNdXlMbkplZ0IyYUViUWlJeGgvdEMyMVVjRkY3a3RkbkRvVGxBNnczcEx1dnVuYUk4NE9mM28KKzJZQnJoemtUYkNmYVlrNUpSbFRwdWRXOURrVWtIQnN5eDNua25QS25wbGtJR2FLMGpnbjhFMG4rU0ZhYllhSGsKK0k5THJvWVQvK0p0TGVmaDlsZ0JkQWdWdjBVUGJ6b0dmdURzcmsvWmgrVXJnYkxGcEhvVm5FbGh6YmtoNjRaMFgKK09HYUp1blFjNjhjQ1p1NUhUbi9hSzdmQkdNY1ZmbFJDWExWRVFwVTlQSUFkR0E4WW52ZzY4NHQ4R01hS3NSbDEKK2pJR1oKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KKyAzIHM6L0M9VVMvU1Q9VVQvTD1TYWx0IExha2UgQ2l0eS9PPVRoZSBVU0VSVFJVU1QgTmV0d29yay9PVT1odHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20vQ049VVROLVVTRVJGaXJzdC1IYXJkd2FyZQorICAgaTovQz1VUy9TVD1VVC9MPVNhbHQgTGFrZSBDaXR5L089VGhlIFVTRVJUUlVTVCBOZXR3b3JrL09VPWh0dHA6Ly93d3cudXNlcnRydXN0LmNvbS9DTj1VVE4tVVNFUkZpcnN0LUhhcmR3YXJlCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUVkRENDQTF5Z0F3SUJBZ0lRUkw0TWkxQUFKTFFSMHpZcS9tVUsvVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0IKK2x6RUxNQWtHQTFVRUJoTUNWVk14Q3pBSkJnTlZCQWdUQWxWVU1SY3dGUVlEVlFRSEV3NVRZV3gwSUV4aGEyVWcKK1EybDBlVEVlTUJ3R0ExVUVDaE1WVkdobElGVlRSVkpVVWxWVFZDQk9aWFIzYjNKck1TRXdId1lEVlFRTEV4aG8KK2RIUndPaTh2ZDNkM0xuVnpaWEowY25WemRDNWpiMjB4SHpBZEJnTlZCQU1URmxWVVRpMVZVMFZTUm1seWMzUXQKK1NHRnlaSGRoY21Vd0hoY05PVGt3TnpBNU1UZ3hNRFF5V2hjTk1Ua3dOekE1TVRneE9USXlXakNCbHpFTE1Ba0cKK0ExVUVCaE1DVlZNeEN6QUpCZ05WQkFnVEFsVlVNUmN3RlFZRFZRUUhFdzVUWVd4MElFeGhhMlVnUTJsMGVURWUKK01Cd0dBMVVFQ2hNVlZHaGxJRlZUUlZKVVVsVlRWQ0JPWlhSM2IzSnJNU0V3SHdZRFZRUUxFeGhvZEhSd09pOHYKK2QzZDNMblZ6WlhKMGNuVnpkQzVqYjIweEh6QWRCZ05WQkFNVEZsVlVUaTFWVTBWU1JtbHljM1F0U0dGeVpIZGgKK2NtVXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDeDk4TTRQN1NvZjg4NWdsRm4KKzBHMmYwdjlZOCtlZksrd05pVlNadVRpWkZ2ZmdJWGxJd3J0aGRCS1dIVHhxY3RVOEVHYzZPZTByRTgxbTY1VUoKK002UnNsN0hveHV6QmRYbWNSbDZOcTlCcS9ia3FWUmNRVkxNWjhKcjI4YkZkdHFkdCsrQnhGMnVpaVBzQTMvNGEKK01YY01tZ0Y2c1RMakt3RUhPRzdEcFY0anZFV2JlMURCeVRDUDIrVXJldE5iK3pOQUhxRFZtQmU4aTRmRGlkTmQKK29JNnlxcXIyam1tSUJzWDZpU0h6Q0oxcExna3pteWtOUmcrTXpFazBzR2xSdmZrR3pXaXRaa3k4UHF4aHZRcUkKK0RzamZQZTU4QkV5ZENsNXJrZGJ1eCswb2phdE5oNGx6MEc2azBCNFdpeFRoZGtRRGYyT3M1TTFKbk1XUzlLc3kKK29VaGJBZ01CQUFHamdia3dnYll3Q3dZRFZSMFBCQVFEQWdIR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWUQKK1ZSME9CQllFRktGeVh5WWJLSmhEbFYwSE45V0ZscDFMMHNORk1FUUdBMVVkSHdROU1Ec3dPYUEzb0RXR00yaDAKK2RIQTZMeTlqY213dWRYTmxjblJ5ZFhOMExtTnZiUzlWVkU0dFZWTkZVa1pwY25OMExVaGhjbVIzWVhKbExtTnkKK2JEQXhCZ05WSFNVRUtqQW9CZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd1VHQ0NzR0FRVUZCd01HQmdnckJnRUYKK0JRY0RCekFOQmdrcWhraUc5dzBCQVFVRkFBT0NBUUVBUnhrUDNuVEdtWmV2L0swb1huV082eTFuN2s1N0s5Y00KKy8vYmV5MVdpQ3VGTVZHV1RZR3VmRXB5dFhvTXM2MXF1d09RdDlBQmpIYmpBYlBMUFNidE5rMjhHcGdvaXNrbGkKK0NFNy95TWdVc29nV1hlY0I1QktWNVVVMHM0dHB2YyswaFk5MVVaNTlPamc2RkVnU3h2dW5PeHFORFlKQUIrZ0UKK0NKQ2hpY3NaVU4vS0hBRzhIUVFaZXhCMmx6dnVrSkRLeEE0ZkZtNTE3elA0MDI5YkhwYmo0SFIzZEh1S29tNHQKKzNYYldPVENDOEt1Y1V2SXF4NjlKWG43SGFPV0NnY2hxSi9rbmlDclZXRkNWSC9BN0hGZTdmUlE1WWl1YXlaU1MKK0txTWlEUCtKSm4xZkl5dEgxeFVkcVdxZVVRMHFVWjZCK2RRN1huQVNmeEF5bkI2N25maG1xQT09CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc29ydHBlcmYucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc29ydHBlcmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4M2VlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weQpAQCAtMCwwICsxLDE2OSBAQAorIiIiU29ydCBwZXJmb3JtYW5jZSB0ZXN0LgorCitTZWUgbWFpbigpIGZvciBjb21tYW5kIGxpbmUgc3ludGF4LgorU2VlIHRhYnVsYXRlKCkgZm9yIG91dHB1dCBmb3JtYXQuCisKKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IG1hcnNoYWwKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IG9zCisKK3RkID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisKK2RlZiByYW5kZmxvYXRzKG4pOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbiByYW5kb20gZmxvYXRzIGluIFswLCAxKS4iIiIKKyAgICAjIEdlbmVyYXRpbmcgZmxvYXRzIGlzIGV4cGVuc2l2ZSwgc28gdGhpcyB3cml0ZXMgdGhlbSBvdXQgdG8gYSBmaWxlIGluCisgICAgIyBhIHRlbXAgZGlyZWN0b3J5LiAgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMsIGl0IGp1c3QgcmVhZHMgdGhlbQorICAgICMgYmFjayBpbiBhbmQgc2h1ZmZsZXMgdGhlbSBhIGJpdC4KKyAgICBmbiA9IG9zLnBhdGguam9pbih0ZCwgInJyJTA2ZCIgJSBuKQorICAgIHRyeToKKyAgICAgICAgZnAgPSBvcGVuKGZuLCAicmIiKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICByID0gcmFuZG9tLnJhbmRvbQorICAgICAgICByZXN1bHQgPSBbcigpIGZvciBpIGluIHhyYW5nZShuKV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihmbiwgIndiIikKKyAgICAgICAgICAgICAgICBtYXJzaGFsLmR1bXAocmVzdWx0LCBmcCkKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICAgICAgZnAgPSBOb25lCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIGZwOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHByaW50ICJjYW4ndCB3cml0ZSIsIGZuLCAiOiIsIG1zZworICAgIGVsc2U6CisgICAgICAgIHJlc3VsdCA9IG1hcnNoYWwubG9hZChmcCkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIFNodWZmbGUgaXQgYSBiaXQuLi4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgaSA9IHJhbmRvbS5yYW5kcmFuZ2UobikKKyAgICAgICAgICAgIHRlbXAgPSByZXN1bHRbOmldCisgICAgICAgICAgICBkZWwgcmVzdWx0WzppXQorICAgICAgICAgICAgdGVtcC5yZXZlcnNlKCkKKyAgICAgICAgICAgIHJlc3VsdC5leHRlbmQodGVtcCkKKyAgICAgICAgICAgIGRlbCB0ZW1wCisgICAgYXNzZXJ0IGxlbihyZXN1bHQpID09IG4KKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBmbHVzaCgpOgorICAgIHN5cy5zdGRvdXQuZmx1c2goKQorCitkZWYgZG9pdChMKToKKyAgICB0MCA9IHRpbWUuY2xvY2soKQorICAgIEwuc29ydCgpCisgICAgdDEgPSB0aW1lLmNsb2NrKCkKKyAgICBwcmludCAiJTYuMmYiICUgKHQxLXQwKSwKKyAgICBmbHVzaCgpCisKK2RlZiB0YWJ1bGF0ZShyKToKKyAgICAiIiJUYWJ1bGF0ZSBzb3J0IHNwZWVkIGZvciBsaXN0cyBvZiB2YXJpb3VzIHNpemVzLgorCisgICAgVGhlIHNpemVzIGFyZSAyKippIGZvciBpIGluIHIgKHRoZSBhcmd1bWVudCwgYSBsaXN0KS4KKworICAgIFRoZSBvdXRwdXQgZGlzcGxheXMgaSwgMioqaSwgYW5kIHRoZSB0aW1lIHRvIHNvcnQgYXJyYXlzIG9mIDIqKmkKKyAgICBmbG9hdGluZyBwb2ludCBudW1iZXJzIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorCisgICAgKnNvcnQ6IHJhbmRvbSBkYXRhCisgICAgXHNvcnQ6IGRlc2NlbmRpbmcgZGF0YQorICAgIC9zb3J0OiBhc2NlbmRpbmcgZGF0YQorICAgIDNzb3J0OiBhc2NlbmRpbmcsIHRoZW4gMyByYW5kb20gZXhjaGFuZ2VzCisgICAgK3NvcnQ6IGFzY2VuZGluZywgdGhlbiAxMCByYW5kb20gYXQgdGhlIGVuZAorICAgICVzb3J0OiBhc2NlbmRpbmcsIHRoZW4gcmFuZG9tbHkgcmVwbGFjZSAxJSBvZiB0aGUgZWxlbWVudHMgdy8gcmFuZG9tIHZhbHVlcworICAgIH5zb3J0OiBtYW55IGR1cGxpY2F0ZXMKKyAgICA9c29ydDogYWxsIGVxdWFsCisgICAgIXNvcnQ6IHdvcnN0IGNhc2Ugc2NlbmFyaW8KKworICAgICIiIgorICAgIGNhc2VzID0gdHVwbGUoW2NoICsgInNvcnQiIGZvciBjaCBpbiByIipcLzMrJX49ISJdKQorICAgIGZtdCA9ICgiJTJzICU3cyIgKyAiICU2cyIqbGVuKGNhc2VzKSkKKyAgICBwcmludCBmbXQgJSAoKCJpIiwgIjIqKmkiKSArIGNhc2VzKQorICAgIGZvciBpIGluIHI6CisgICAgICAgIG4gPSAxIDw8IGkKKyAgICAgICAgTCA9IHJhbmRmbG9hdHMobikKKyAgICAgICAgcHJpbnQgIiUyZCAlN2QiICUgKGksIG4pLAorICAgICAgICBmbHVzaCgpCisgICAgICAgIGRvaXQoTCkgIyAqc29ydAorICAgICAgICBMLnJldmVyc2UoKQorICAgICAgICBkb2l0KEwpICMgXHNvcnQKKyAgICAgICAgZG9pdChMKSAjIC9zb3J0CisKKyAgICAgICAgIyBEbyAzIHJhbmRvbSBleGNoYW5nZXMuCisgICAgICAgIGZvciBkdW1teSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIGkxID0gcmFuZG9tLnJhbmRyYW5nZShuKQorICAgICAgICAgICAgaTIgPSByYW5kb20ucmFuZHJhbmdlKG4pCisgICAgICAgICAgICBMW2kxXSwgTFtpMl0gPSBMW2kyXSwgTFtpMV0KKyAgICAgICAgZG9pdChMKSAjIDNzb3J0CisKKyAgICAgICAgIyBSZXBsYWNlIHRoZSBsYXN0IDEwIHdpdGggcmFuZG9tIGZsb2F0cy4KKyAgICAgICAgaWYgbiA+PSAxMDoKKyAgICAgICAgICAgIExbLTEwOl0gPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBkdW1teSBpbiByYW5nZSgxMCldCisgICAgICAgIGRvaXQoTCkgIyArc29ydAorCisgICAgICAgICMgUmVwbGFjZSAxJSBvZiB0aGUgZWxlbWVudHMgYXQgcmFuZG9tLgorICAgICAgICBmb3IgZHVtbXkgaW4geHJhbmdlKG4gLy8gMTAwKToKKyAgICAgICAgICAgIExbcmFuZG9tLnJhbmRyYW5nZShuKV0gPSByYW5kb20ucmFuZG9tKCkKKyAgICAgICAgZG9pdChMKSAjICVzb3J0CisKKyAgICAgICAgIyBBcnJhbmdlIGZvciBsb3RzIG9mIGR1cGxpY2F0ZXMuCisgICAgICAgIGlmIG4gPiA0OgorICAgICAgICAgICAgZGVsIExbNDpdCisgICAgICAgICAgICBMID0gTCAqIChuIC8vIDQpCisgICAgICAgICAgICAjIEZvcmNlIHRoZSBlbGVtZW50cyB0byBiZSBkaXN0aW5jdCBvYmplY3RzLCBlbHNlIHRpbWluZ3MgY2FuIGJlCisgICAgICAgICAgICAjIGFydGlmaWNpYWxseSBsb3cuCisgICAgICAgICAgICBMID0gbWFwKGxhbWJkYSB4OiAtLXgsIEwpCisgICAgICAgIGRvaXQoTCkgIyB+c29ydAorICAgICAgICBkZWwgTAorCisgICAgICAgICMgQWxsIGVxdWFsLiAgQWdhaW4sIGZvcmNlIHRoZSBlbGVtZW50cyB0byBiZSBkaXN0aW5jdCBvYmplY3RzLgorICAgICAgICBMID0gbWFwKGFicywgWy0wLjVdICogbikKKyAgICAgICAgZG9pdChMKSAjID1zb3J0CisgICAgICAgIGRlbCBMCisKKyAgICAgICAgIyBUaGlzIG9uZSBsb29rcyBsaWtlIFszLCAyLCAxLCAwLCAwLCAxLCAyLCAzXS4gIEl0IHdhcyBhIGJhZCBjYXNlCisgICAgICAgICMgZm9yIGFuIG9sZGVyIGltcGxlbWVudGF0aW9uIG9mIHF1aWNrc29ydCwgd2hpY2ggdXNlZCB0aGUgbWVkaWFuCisgICAgICAgICMgb2YgdGhlIGZpcnN0LCBsYXN0IGFuZCBtaWRkbGUgZWxlbWVudHMgYXMgdGhlIHBpdm90LgorICAgICAgICBoYWxmID0gbiAvLyAyCisgICAgICAgIEwgPSByYW5nZShoYWxmIC0gMSwgLTEsIC0xKQorICAgICAgICBMLmV4dGVuZChyYW5nZShoYWxmKSkKKyAgICAgICAgIyBGb3JjZSB0byBmbG9hdCwgc28gdGhhdCB0aGUgdGltaW5ncyBhcmUgY29tcGFyYWJsZS4gIFRoaXMgaXMKKyAgICAgICAgIyBzaWduaWZpY2FudGx5IGZhc3RlciBpZiB3ZSBsZWF2ZSB0aGFtIGFzIGludHMuCisgICAgICAgIEwgPSBtYXAoZmxvYXQsIEwpCisgICAgICAgIGRvaXQoTCkgIyAhc29ydAorICAgICAgICBwcmludAorCitkZWYgbWFpbigpOgorICAgICIiIk1haW4gcHJvZ3JhbSB3aGVuIGludm9rZWQgYXMgYSBzY3JpcHQuCisKKyAgICBPbmUgYXJndW1lbnQ6IHRhYnVsYXRlIGEgc2luZ2xlIHJvdy4KKyAgICBUd28gYXJndW1lbnRzOiB0YWJ1bGF0ZSBhIHJhbmdlIChpbmNsdXNpdmUpLgorICAgIEV4dHJhIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBzZWVkIHRoZSByYW5kb20gZ2VuZXJhdG9yLgorCisgICAgIiIiCisgICAgIyBkZWZhdWx0IHJhbmdlIChpbmNsdXNpdmUpCisgICAgazEgPSAxNQorICAgIGsyID0gMjAKKyAgICBpZiBzeXMuYXJndlsxOl06CisgICAgICAgICMgb25lIGFyZ3VtZW50OiBzaW5nbGUgcG9pbnQKKyAgICAgICAgazEgPSBrMiA9IGludChzeXMuYXJndlsxXSkKKyAgICAgICAgaWYgc3lzLmFyZ3ZbMjpdOgorICAgICAgICAgICAgIyB0d28gYXJndW1lbnRzOiBzcGVjaWZ5IHJhbmdlCisgICAgICAgICAgICBrMiA9IGludChzeXMuYXJndlsyXSkKKyAgICAgICAgICAgIGlmIHN5cy5hcmd2WzM6XToKKyAgICAgICAgICAgICAgICAjIGRlcml2ZSByYW5kb20gc2VlZCBmcm9tIHJlbWFpbmluZyBhcmd1bWVudHMKKyAgICAgICAgICAgICAgICB4ID0gMQorICAgICAgICAgICAgICAgIGZvciBhIGluIHN5cy5hcmd2WzM6XToKKyAgICAgICAgICAgICAgICAgICAgeCA9IDY5MDY5ICogeCArIGhhc2goYSkKKyAgICAgICAgICAgICAgICByYW5kb20uc2VlZCh4KQorICAgIHIgPSByYW5nZShrMSwgazIrMSkgICAgICAgICAgICAgICAgICMgaW5jbHVkZSB0aGUgZW5kIHBvaW50CisgICAgdGFidWxhdGUocikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc29ydHBlcmYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Y2Y1NzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc29ydHBlcmYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zb3J0cGVyZi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvc29ydHBlcmYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODQ1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc29ydHBlcmYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWI2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CkBAIC0wLDAgKzEsMTM1NSBAQAorIiIiCitDb21tb24gdGVzdHMgc2hhcmVkIGJ5IHRlc3Rfc3RyLCB0ZXN0X3VuaWNvZGUsIHRlc3RfdXNlcnN0cmluZyBhbmQgdGVzdF9zdHJpbmcuCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0LCBzdHJpbmcsIHN5cywgc3RydWN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKK2ltcG9ydCBfdGVzdGNhcGkKKworY2xhc3MgU2VxdWVuY2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcT0nd3h5eicpOiBzZWxmLnNlcSA9IHNlcQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gbGVuKHNlbGYuc2VxKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKTogcmV0dXJuIHNlbGYuc2VxW2ldCisKK2NsYXNzIEJhZFNlcTEoU2VxdWVuY2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5zZXEgPSBbNywgJ2hlbGxvJywgMTIzTF0KKworY2xhc3MgQmFkU2VxMihTZXF1ZW5jZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBzZWxmLnNlcSA9IFsnYScsICdiJywgJ2MnXQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOiByZXR1cm4gOAorCitjbGFzcyBDb21tb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoaXMgdGVzdGNhc2UgY29udGFpbnMgdGVzdCB0aGF0IGNhbiBiZSB1c2VkIGluIGFsbAorICAgICMgc3RyaW5nbGlrZSBjbGFzc2VzLiBDdXJyZW50bHkgdGhpcyBpcyBzdHIsIHVuaWNvZGUKKyAgICAjIFVzZXJTdHJpbmcgYW5kIHRoZSBzdHJpbmcgbW9kdWxlLgorCisgICAgIyBUaGUgdHlwZSB0byBiZSB0ZXN0ZWQKKyAgICAjIENoYW5nZSBpbiBzdWJjbGFzc2VzIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIGZpeHRlc3R0eXBlKCkKKyAgICB0eXBlMnRlc3QgPSBOb25lCisKKyAgICAjIEFsbCB0ZXN0cyBwYXNzIHRoZWlyIGFyZ3VtZW50cyB0byB0aGUgdGVzdGluZyBtZXRob2RzCisgICAgIyBhcyBzdHIgb2JqZWN0cy4gZml4dGVzdHR5cGUoKSBjYW4gYmUgdXNlZCB0byBwcm9wYWdhdGUKKyAgICAjIHRoZXNlIGFyZ3VtZW50cyB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZQorICAgIGRlZiBmaXh0eXBlKHNlbGYsIG9iaik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBzdHIpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLnR5cGUydGVzdChvYmopCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvYmosIGxpc3QpOgorICAgICAgICAgICAgcmV0dXJuIFtzZWxmLmZpeHR5cGUoeCkgZm9yIHggaW4gb2JqXQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCB0dXBsZSk6CisgICAgICAgICAgICByZXR1cm4gdHVwbGUoW3NlbGYuZml4dHlwZSh4KSBmb3IgeCBpbiBvYmpdKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob2JqLCBkaWN0KToKKyAgICAgICAgICAgIHJldHVybiBkaWN0KFsKKyAgICAgICAgICAgICAgIChzZWxmLmZpeHR5cGUoa2V5KSwgc2VsZi5maXh0eXBlKHZhbHVlKSkKKyAgICAgICAgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gb2JqLml0ZXJpdGVtcygpCisgICAgICAgICAgICBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIG9iagorCisgICAgIyBjaGVjayB0aGF0IG9iamVjdC5tZXRob2QoKmFyZ3MpIHJldHVybnMgcmVzdWx0CisgICAgZGVmIGNoZWNrZXF1YWwoc2VsZiwgcmVzdWx0LCBvYmplY3QsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5maXh0eXBlKHJlc3VsdCkKKyAgICAgICAgb2JqZWN0ID0gc2VsZi5maXh0eXBlKG9iamVjdCkKKyAgICAgICAgYXJncyA9IHNlbGYuZml4dHlwZShhcmdzKQorICAgICAgICByZWFscmVzdWx0ID0gZ2V0YXR0cihvYmplY3QsIG1ldGhvZG5hbWUpKCphcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcmVzdWx0LAorICAgICAgICAgICAgcmVhbHJlc3VsdAorICAgICAgICApCisgICAgICAgICMgaWYgdGhlIG9yaWdpbmFsIGlzIHJldHVybmVkIG1ha2Ugc3VyZSB0aGF0CisgICAgICAgICMgdGhpcyBkb2Vzbid0IGhhcHBlbiB3aXRoIHN1YmNsYXNzZXMKKyAgICAgICAgaWYgb2JqZWN0ID09IHJlYWxyZXN1bHQ6CisgICAgICAgICAgICBjbGFzcyBzdWJ0eXBlKHNlbGYuX19jbGFzc19fLnR5cGUydGVzdCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgb2JqZWN0ID0gc3VidHlwZShvYmplY3QpCisgICAgICAgICAgICByZWFscmVzdWx0ID0gZ2V0YXR0cihvYmplY3QsIG1ldGhvZG5hbWUpKCphcmdzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iamVjdCBpcyBub3QgcmVhbHJlc3VsdCkKKworICAgICMgY2hlY2sgdGhhdCBvYmplY3QubWV0aG9kKCphcmdzKSByYWlzZXMgZXhjCisgICAgZGVmIGNoZWNrcmFpc2VzKHNlbGYsIGV4Yywgb2JqZWN0LCBtZXRob2RuYW1lLCAqYXJncyk6CisgICAgICAgIG9iamVjdCA9IHNlbGYuZml4dHlwZShvYmplY3QpCisgICAgICAgIGFyZ3MgPSBzZWxmLmZpeHR5cGUoYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBleGMsCisgICAgICAgICAgICBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSksCisgICAgICAgICAgICAqYXJncworICAgICAgICApCisKKyAgICAjIGNhbGwgb2JqZWN0Lm1ldGhvZCgqYXJncykgd2l0aG91dCBhbnkgY2hlY2tzCisgICAgZGVmIGNoZWNrY2FsbChzZWxmLCBvYmplY3QsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgb2JqZWN0ID0gc2VsZi5maXh0eXBlKG9iamVjdCkKKyAgICAgICAgYXJncyA9IHNlbGYuZml4dHlwZShhcmdzKQorICAgICAgICBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkoKmFyZ3MpCisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAxMDU0MTM5OiAgKz0gb3B0aW1pemF0aW9uIHdhcyBub3QgaW52YWxpZGF0aW5nIGNhY2hlZCBoYXNoIHZhbHVlCisgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdCgnRE5TU0VDJykKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KCcnKQorICAgICAgICBmb3IgYyBpbiBhOgorICAgICAgICAgICAgYiArPSBjCisgICAgICAgICAgICBoYXNoKGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChhKSwgaGFzaChiKSkKKworICAgIGRlZiB0ZXN0X2NhcGl0YWxpemUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnIGhlbGxvICcsICcgaGVsbG8gJywgJ2NhcGl0YWxpemUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0hlbGxvICcsICdIZWxsbyAnLCdjYXBpdGFsaXplJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdIZWxsbyAnLCAnaGVsbG8gJywnY2FwaXRhbGl6ZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnQWFhYScsICdhYWFhJywgJ2NhcGl0YWxpemUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0FhYWEnLCAnQWFBYScsICdjYXBpdGFsaXplJykKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2NhcGl0YWxpemUnLCA0MikKKworICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgJ2FhYScsICdjb3VudCcsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYWEnLCAnY291bnQnLCAnYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCAnYWFhJywgJ2NvdW50JywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJ2FhYScsICdjb3VudCcsICdiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYWEnLCAnY291bnQnLCAnYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWFhJywgJ2NvdW50JywgJ2InKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJ2FhYScsICdjb3VudCcsICdiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDIsICdhYWEnLCAnY291bnQnLCAnYScsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWFhJywgJ2NvdW50JywgJ2EnLCAxMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEsICdhYWEnLCAnY291bnQnLCAnYScsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgJ2FhYScsICdjb3VudCcsICdhJywgLTEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMSwgJ2FhYScsICdjb3VudCcsICdhJywgMCwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYWEnLCAnY291bnQnLCAnYScsIDAsIDEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgJ2FhYScsICdjb3VudCcsICdhJywgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWFhJywgJ2NvdW50JywgJ2EnLCAwLCAtMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCAnYWFhJywgJ2NvdW50JywgJycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxLCAnYWFhJywgJ2NvdW50JywgJycsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWFhJywgJ2NvdW50JywgJycsIDEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgJ2FhYScsICdjb3VudCcsICcnLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDQsICdhYWEnLCAnY291bnQnLCAnJywgLTEwKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxLCAnJywgJ2NvdW50JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnJywgJ2NvdW50JywgJycsIDEsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnJywgJ2NvdW50JywgJycsIHN5cy5tYXhpbnQsIDApCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICcnLCAnY291bnQnLCAneHgnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJycsICdjb3VudCcsICd4eCcsIDEsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnJywgJ2NvdW50JywgJ3h4Jywgc3lzLm1heGludCwgMCkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2NvdW50JykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdjb3VudCcsIDQyKQorCisgICAgICAgICMgRm9yIGEgdmFyaWV0eSBvZiBjb21iaW5hdGlvbnMsCisgICAgICAgICMgICAgdmVyaWZ5IHRoYXQgc3RyLmNvdW50KCkgbWF0Y2hlcyBhbiBlcXVpdmFsZW50IGZ1bmN0aW9uCisgICAgICAgICMgICAgcmVwbGFjaW5nIGFsbCBvY2N1cnJlbmNlcyBhbmQgdGhlbiBkaWZmZXJlbmNpbmcgdGhlIHN0cmluZyBsZW5ndGhzCisgICAgICAgIGNoYXJzZXQgPSBbJycsICdhJywgJ2InXQorICAgICAgICBkaWdpdHMgPSA3CisgICAgICAgIGJhc2UgPSBsZW4oY2hhcnNldCkKKyAgICAgICAgdGVzdHN0cmluZ3MgPSBzZXQoKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoYmFzZSAqKiBkaWdpdHMpOgorICAgICAgICAgICAgZW50cnkgPSBbXQorICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKGRpZ2l0cyk6CisgICAgICAgICAgICAgICAgaSwgbSA9IGRpdm1vZChpLCBiYXNlKQorICAgICAgICAgICAgICAgIGVudHJ5LmFwcGVuZChjaGFyc2V0W21dKQorICAgICAgICAgICAgdGVzdHN0cmluZ3MuYWRkKCcnLmpvaW4oZW50cnkpKQorICAgICAgICB0ZXN0c3RyaW5ncyA9IGxpc3QodGVzdHN0cmluZ3MpCisgICAgICAgIGZvciBpIGluIHRlc3RzdHJpbmdzOgorICAgICAgICAgICAgaSA9IHNlbGYuZml4dHlwZShpKQorICAgICAgICAgICAgbiA9IGxlbihpKQorICAgICAgICAgICAgZm9yIGogaW4gdGVzdHN0cmluZ3M6CisgICAgICAgICAgICAgICAgcjEgPSBpLmNvdW50KGopCisgICAgICAgICAgICAgICAgaWYgajoKKyAgICAgICAgICAgICAgICAgICAgcjIsIHJlbSA9IGRpdm1vZChuIC0gbGVuKGkucmVwbGFjZShqLCAnJykpLCBsZW4oaikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcjIsIHJlbSA9IGxlbihpKSsxLCAwCisgICAgICAgICAgICAgICAgaWYgcmVtIG9yIHIxICE9IHIyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlbSwgMCwgJyVzICE9IDAgZm9yICVzJyAlIChyZW0sIGkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLCByMiwgJyVzICE9ICVzIGZvciAlcycgJSAocjEsIHIyLCBpKSkKKworICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWJjZGVmZ2hpYWJjJywgJ2ZpbmQnLCAnYWJjJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDksICdhYmNkZWZnaGlhYmMnLCAnZmluZCcsICdhYmMnLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICdhYmNkZWZnaGlhYmMnLCAnZmluZCcsICdkZWYnLCA0KQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnYWJjJywgJ2ZpbmQnLCAnJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYmMnLCAnZmluZCcsICcnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICdhYmMnLCAnZmluZCcsICcnLCA0KQorCisgICAgICAgICMgdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gcGFzcyBOb25lIGFzIGRlZmF1bHRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCggMiwgJ3JyYXJycnJycnJycmEnLCAnZmluZCcsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAncnJhcnJycnJycnJyYScsICdmaW5kJywgJ2EnLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICdycmFycnJycnJycnJhJywgJ2ZpbmQnLCAnYScsIDQsIDYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAnZmluZCcsICdhJywgNCwgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCAyLCAncnJhcnJycnJycnJyYScsICdmaW5kJywgJ2EnLCBOb25lLCA2KQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZmluZCcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZmluZCcsIDQyKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAnJywgJ2ZpbmQnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKC0xLCAnJywgJ2ZpbmQnLCAnJywgMSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKC0xLCAnJywgJ2ZpbmQnLCAnJywgc3lzLm1heGludCwgMCkKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICcnLCAnZmluZCcsICd4eCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJycsICdmaW5kJywgJ3h4JywgMSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKC0xLCAnJywgJ2ZpbmQnLCAneHgnLCBzeXMubWF4aW50LCAwKQorCisgICAgICAgICMgaXNzdWUgNzQ1OAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICdhYicsICdmaW5kJywgJ3h4eCcsIHN5cy5tYXhzaXplICsgMSwgMCkKKworICAgICAgICAjIEZvciBhIHZhcmlldHkgb2YgY29tYmluYXRpb25zLAorICAgICAgICAjICAgIHZlcmlmeSB0aGF0IHN0ci5maW5kKCkgbWF0Y2hlcyBfX2NvbnRhaW5zX18KKyAgICAgICAgIyAgICBhbmQgdGhhdCB0aGUgZm91bmQgc3Vic3RyaW5nIGlzIHJlYWxseSBhdCB0aGF0IGxvY2F0aW9uCisgICAgICAgIGNoYXJzZXQgPSBbJycsICdhJywgJ2InLCAnYyddCisgICAgICAgIGRpZ2l0cyA9IDUKKyAgICAgICAgYmFzZSA9IGxlbihjaGFyc2V0KQorICAgICAgICB0ZXN0c3RyaW5ncyA9IHNldCgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShiYXNlICoqIGRpZ2l0cyk6CisgICAgICAgICAgICBlbnRyeSA9IFtdCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoZGlnaXRzKToKKyAgICAgICAgICAgICAgICBpLCBtID0gZGl2bW9kKGksIGJhc2UpCisgICAgICAgICAgICAgICAgZW50cnkuYXBwZW5kKGNoYXJzZXRbbV0pCisgICAgICAgICAgICB0ZXN0c3RyaW5ncy5hZGQoJycuam9pbihlbnRyeSkpCisgICAgICAgIHRlc3RzdHJpbmdzID0gbGlzdCh0ZXN0c3RyaW5ncykKKyAgICAgICAgZm9yIGkgaW4gdGVzdHN0cmluZ3M6CisgICAgICAgICAgICBpID0gc2VsZi5maXh0eXBlKGkpCisgICAgICAgICAgICBmb3IgaiBpbiB0ZXN0c3RyaW5nczoKKyAgICAgICAgICAgICAgICBsb2MgPSBpLmZpbmQoaikKKyAgICAgICAgICAgICAgICByMSA9IChsb2MgIT0gLTEpCisgICAgICAgICAgICAgICAgcjIgPSBqIGluIGkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLCByMikKKyAgICAgICAgICAgICAgICBpZiBsb2MgIT0gLTE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaVtsb2M6bG9jK2xlbihqKV0sIGopCisKKyAgICBkZWYgdGVzdF9yZmluZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDksICAnYWJjZGVmZ2hpYWJjJywgJ3JmaW5kJywgJ2FiYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ2FiY2RlZmdoaWFiYycsICdyZmluZCcsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJ2FiY2RlZmdoaWFiYycsICdyZmluZCcsICdhYmNkJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKC0xLCAnYWJjZGVmZ2hpYWJjJywgJ3JmaW5kJywgJ2FiY3onKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCAnYWJjJywgJ3JmaW5kJywgJycsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCAnYWJjJywgJ3JmaW5kJywgJycsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJ2FiYycsICdyZmluZCcsICcnLCA0KQorCisgICAgICAgICMgdG8gY2hlY2sgdGhlIGFiaWxpdHkgdG8gcGFzcyBOb25lIGFzIGRlZmF1bHRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAncmZpbmQnLCAnYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAncmZpbmQnLCAnYScsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgtMSwgJ3JyYXJycnJycnJycmEnLCAncmZpbmQnLCAnYScsIDQsIDYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ3JyYXJycnJycnJycmEnLCAncmZpbmQnLCAnYScsIDQsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCggMiwgJ3JyYXJycnJycnJycmEnLCAncmZpbmQnLCAnYScsIE5vbmUsIDYpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyZmluZCcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmZpbmQnLCA0MikKKworICAgICAgICAjIEZvciBhIHZhcmlldHkgb2YgY29tYmluYXRpb25zLAorICAgICAgICAjICAgIHZlcmlmeSB0aGF0IHN0ci5yZmluZCgpIG1hdGNoZXMgX19jb250YWluc19fCisgICAgICAgICMgICAgYW5kIHRoYXQgdGhlIGZvdW5kIHN1YnN0cmluZyBpcyByZWFsbHkgYXQgdGhhdCBsb2NhdGlvbgorICAgICAgICBjaGFyc2V0ID0gWycnLCAnYScsICdiJywgJ2MnXQorICAgICAgICBkaWdpdHMgPSA1CisgICAgICAgIGJhc2UgPSBsZW4oY2hhcnNldCkKKyAgICAgICAgdGVzdHN0cmluZ3MgPSBzZXQoKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoYmFzZSAqKiBkaWdpdHMpOgorICAgICAgICAgICAgZW50cnkgPSBbXQorICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKGRpZ2l0cyk6CisgICAgICAgICAgICAgICAgaSwgbSA9IGRpdm1vZChpLCBiYXNlKQorICAgICAgICAgICAgICAgIGVudHJ5LmFwcGVuZChjaGFyc2V0W21dKQorICAgICAgICAgICAgdGVzdHN0cmluZ3MuYWRkKCcnLmpvaW4oZW50cnkpKQorICAgICAgICB0ZXN0c3RyaW5ncyA9IGxpc3QodGVzdHN0cmluZ3MpCisgICAgICAgIGZvciBpIGluIHRlc3RzdHJpbmdzOgorICAgICAgICAgICAgaSA9IHNlbGYuZml4dHlwZShpKQorICAgICAgICAgICAgZm9yIGogaW4gdGVzdHN0cmluZ3M6CisgICAgICAgICAgICAgICAgbG9jID0gaS5yZmluZChqKQorICAgICAgICAgICAgICAgIHIxID0gKGxvYyAhPSAtMSkKKyAgICAgICAgICAgICAgICByMiA9IGogaW4gaQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyKQorICAgICAgICAgICAgICAgIGlmIGxvYyAhPSAtMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpW2xvYzpsb2MrbGVuKGopXSwgc2VsZi5maXh0eXBlKGopKQorCisgICAgICAgICMgaXNzdWUgNzQ1OAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoLTEsICdhYicsICdyZmluZCcsICd4eHgnLCBzeXMubWF4c2l6ZSArIDEsIDApCisKKyAgICBkZWYgdGVzdF9pbmRleChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYmNkZWZnaGlhYmMnLCAnaW5kZXgnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICdhYmNkZWZnaGlhYmMnLCAnaW5kZXgnLCAnZGVmJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsICdhYmNkZWZnaGlhYmMnLCAnaW5kZXgnLCAnYWJjJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDksICdhYmNkZWZnaGlhYmMnLCAnaW5kZXgnLCAnYWJjJywgMSkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdhYmNkZWZnaGlhYmMnLCAnaW5kZXgnLCAnaGliJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnYWJjZGVmZ2hpYWInLCAnaW5kZXgnLCAnYWJjJywgMSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnYWJjZGVmZ2hpJywgJ2luZGV4JywgJ2doaScsIDgpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2FiY2RlZmdoaScsICdpbmRleCcsICdnaGknLCAtMSkKKworICAgICAgICAjIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIHBhc3MgTm9uZSBhcyBkZWZhdWx0cworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoIDIsICdycmFycnJycnJycnJhJywgJ2luZGV4JywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMTIsICdycmFycnJycnJycnJhJywgJ2luZGV4JywgJ2EnLCA0KQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdycmFycnJycnJycnJhJywgJ2luZGV4JywgJ2EnLCA0LCA2KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMTIsICdycmFycnJycnJycnJhJywgJ2luZGV4JywgJ2EnLCA0LCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoIDIsICdycmFycnJycnJycnJhJywgJ2luZGV4JywgJ2EnLCBOb25lLCA2KQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnaW5kZXgnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2luZGV4JywgNDIpCisKKyAgICBkZWYgdGVzdF9yaW5kZXgoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgxMiwgJ2FiY2RlZmdoaWFiYycsICdyaW5kZXgnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsICAnYWJjZGVmZ2hpYWJjJywgJ3JpbmRleCcsICdkZWYnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoOSwgICdhYmNkZWZnaGlhYmMnLCAncmluZGV4JywgJ2FiYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCAgJ2FiY2RlZmdoaWFiYycsICdyaW5kZXgnLCAnYWJjJywgMCwgLTEpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnYWJjZGVmZ2hpYWJjJywgJ3JpbmRleCcsICdoaWInKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsICdkZWZnaGlhYmMnLCAncmluZGV4JywgJ2RlZicsIDEpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2RlZmdoaWFiYycsICdyaW5kZXgnLCAnYWJjJywgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2FiY2RlZmdoaScsICdyaW5kZXgnLCAnZ2hpJywgMCwgOCkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnYWJjZGVmZ2hpJywgJ3JpbmRleCcsICdnaGknLCAwLCAtMSkKKworICAgICAgICAjIHRvIGNoZWNrIHRoZSBhYmlsaXR5IHRvIHBhc3MgTm9uZSBhcyBkZWZhdWx0cworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMTIsICdycmFycnJycnJycnJhJywgJ3JpbmRleCcsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEyLCAncnJhcnJycnJycnJyYScsICdyaW5kZXgnLCAnYScsIDQpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ3JyYXJycnJycnJycmEnLCAncmluZGV4JywgJ2EnLCA0LCA2KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMTIsICdycmFycnJycnJycnJhJywgJ3JpbmRleCcsICdhJywgNCwgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCAyLCAncnJhcnJycnJycnJyYScsICdyaW5kZXgnLCAnYScsIE5vbmUsIDYpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdyaW5kZXgnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3JpbmRleCcsIDQyKQorCisgICAgZGVmIHRlc3RfbG93ZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8nLCAnSGVMTG8nLCAnbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvJywgJ2hlbGxvJywgJ2xvd2VyJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdsb3dlcicsIDQyKQorCisgICAgZGVmIHRlc3RfdXBwZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnSEVMTE8nLCAnSGVMTG8nLCAndXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0hFTExPJywgJ0hFTExPJywgJ3VwcGVyJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICd1cHBlcicsIDQyKQorCisgICAgZGVmIHRlc3RfZXhwYW5kdGFicyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmNccmFiICAgICAgZGVmXG5nICAgICAgIGhpJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCAnZXhwYW5kdGFicycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsICdhYmNccmFiXHRkZWZcbmdcdGhpJywgJ2V4cGFuZHRhYnMnLCA4KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY1xyYWIgIGRlZlxuZyAgIGhpJywgJ2FiY1xyYWJcdGRlZlxuZ1x0aGknLCAnZXhwYW5kdGFicycsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjXHJcbmFiICBkZWZcbmcgICBoaScsICdhYmNcclxuYWJcdGRlZlxuZ1x0aGknLCAnZXhwYW5kdGFicycsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjXHJhYiAgICAgIGRlZlxuZyAgICAgICBoaScsICdhYmNccmFiXHRkZWZcbmdcdGhpJywgJ2V4cGFuZHRhYnMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY1xyYWIgICAgICBkZWZcbmcgICAgICAgaGknLCAnYWJjXHJhYlx0ZGVmXG5nXHRoaScsICdleHBhbmR0YWJzJywgOCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmNcclxuYWJcclxuZGVmXG5nXHJcbmhpJywgJ2FiY1xyXG5hYlxyXG5kZWZcbmdcclxuaGknLCAnZXhwYW5kdGFicycsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnICBhXG4gYicsICcgXHRhXG5cdGInLCAnZXhwYW5kdGFicycsIDEpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdleHBhbmR0YWJzJywgNDIsIDQyKQorICAgICAgICAjIFRoaXMgdGVzdCBpcyBvbmx5IHZhbGlkIHdoZW4gc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHZvaWQqKSA9PSA0LgorICAgICAgICBpZiBzeXMubWF4aW50IDwgKDEgPDwgMzIpIGFuZCBzdHJ1Y3QuY2FsY3NpemUoJ1AnKSA9PSA0OgorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHRhXG5cdGInLCAnZXhwYW5kdGFicycsIHN5cy5tYXhpbnQpCisKKyAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsndGhpcycsICdpcycsICd0aGUnLCAnc3BsaXQnLCAnZnVuY3Rpb24nXSwKKyAgICAgICAgICAgICd0aGlzIGlzIHRoZSBzcGxpdCBmdW5jdGlvbicsICdzcGxpdCcpCisKKyAgICAgICAgIyBieSB3aGl0ZXNwYWNlCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQgJywgJ3NwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiIGMgZCddLCAnYSBiIGMgZCcsICdzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjIGQnXSwgJ2EgYiBjIGQnLCAnc3BsaXQnLCBOb25lLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCcsICdzcGxpdCcsIE5vbmUsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAnc3BsaXQnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLm1heGludC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhIGIgYyBkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSBiIGMgZCddLCAnICBhIGIgYyBkJywgJ3NwbGl0JywgTm9uZSwgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MgIGQnXSwgJ2EgIGIgIGMgIGQnLCAnc3BsaXQnLCBOb25lLCAyKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbXSwgJyAgICAgICAgICcsICdzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSwgJyAgYSAgICAnLCAnc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InXSwgJyAgYSAgICBiICAgJywgJ3NwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiICAgJ10sICcgIGEgICAgYiAgICcsICdzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYiAgIGMgICAnXSwgJyAgYSAgICBiICAgYyAgICcsICdzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjICAgJ10sICcgIGEgICAgYiAgIGMgICAnLCAnc3BsaXQnLCBOb25lLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InXSwgJ1xuXHRhIFx0XHIgYiBcdiAnLCAnc3BsaXQnKQorICAgICAgICBhYWEgPSAnIGEgJyoyMAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsIGFhYSwgJ3NwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddICsgW2FhYVs0Ol1dLCBhYWEsICdzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoxOSArIFsnYSAnXSwgYWFhLCAnc3BsaXQnLCBOb25lLCAxOSkKKworICAgICAgICAjIGJ5IGEgY2hhcgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhfGJ8Y3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2J8Y3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnY3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLAorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLm1heGludC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhfGJ8Y3xkJ10sICdhfGJ8Y3xkJywgJ3NwbGl0JywgJ3wnLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJycsICdifHxjfHxkJ10sICdhfHxifHxjfHxkJywgJ3NwbGl0JywgJ3wnLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydlbmRjYXNlICcsICcnXSwgJ2VuZGNhc2UgfCcsICdzcGxpdCcsICd8JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBzdGFydGNhc2UnXSwgJ3wgc3RhcnRjYXNlJywgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnYm90aGNhc2UnLCAnJ10sICd8Ym90aGNhc2V8JywgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJycsICdiXHgwMGNceDAwZCddLCAnYVx4MDBceDAwYlx4MDBjXHgwMGQnLCAnc3BsaXQnLCAnXHgwMCcsIDIpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjIwLCAoJ2F8JyoyMClbOi0xXSwgJ3NwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMTUgK1snYXxhfGF8YXxhJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnYXwnKjIwKVs6LTFdLCAnc3BsaXQnLCAnfCcsIDE1KQorCisgICAgICAgICMgYnkgc3RyaW5nCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2IvL2MvL2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYy8vZCddLCAnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3NwbGl0JywgJy8vJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdzcGxpdCcsICcvLycsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMubWF4aW50LTEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhLy9iLy9jLy9kJ10sICdhLy9iLy9jLy9kJywgJ3NwbGl0JywgJy8vJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICcnLCAnYi8vLy9jLy8vL2QnXSwgJ2EvLy8vYi8vLy9jLy8vL2QnLCAnc3BsaXQnLCAnLy8nLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydlbmRjYXNlICcsICcnXSwgJ2VuZGNhc2UgdGVzdCcsICdzcGxpdCcsICd0ZXN0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBiZWdpbmNhc2UnXSwgJ3Rlc3QgYmVnaW5jYXNlJywgJ3NwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIGJvdGhjYXNlICcsICcnXSwgJ3Rlc3QgYm90aGNhc2UgdGVzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnc3BsaXQnLCAndGVzdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYmMnXSwgJ2FiYmJjJywgJ3NwbGl0JywgJ2JiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyddLCAnYWFhJywgJ3NwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhYSddLCAnYWFhJywgJ3NwbGl0JywgJ2FhYScsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FiJywgJ2FiJ10sICdhYmJhYWInLCAnc3BsaXQnLCAnYmEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYWFhJ10sICdhYWFhJywgJ3NwbGl0JywgJ2FhYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyddLCAnJywgJ3NwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhJ10sICdhYScsICdzcGxpdCcsICdhYWEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydBJywgJ2JvYmInXSwgJ0FiYm9iYmJvYmInLCAnc3BsaXQnLCAnYmJvYmInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydBJywgJ0InLCAnJ10sICdBYmJvYmJCYmJvYmInLCAnc3BsaXQnLCAnYmJvYmInKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgKCdhQkxBSCcqMjApWzotNF0sICdzcGxpdCcsICdCTEFIJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjIwLCAoJ2FCTEFIJyoyMClbOi00XSwgJ3NwbGl0JywgJ0JMQUgnLCAxOSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSddKjE4ICsgWydhQkxBSGEnXSwgKCdhQkxBSCcqMjApWzotNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAnc3BsaXQnLCAnQkxBSCcsIDE4KQorCisgICAgICAgICMgbWl4ZWQgdXNlIG9mIHN0ciBhbmQgdW5pY29kZQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoW3UnYScsIHUnYicsIHUnYyBkJ10sICdhIGIgYyBkJywgJ3NwbGl0JywgdScgJywgMikKKworICAgICAgICAjIGFyZ3VtZW50IHR5cGUKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdzcGxpdCcsIDQyLCA0MiwgNDIpCisKKyAgICAgICAgIyBudWxsIGNhc2UKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnaGVsbG8nLCAnc3BsaXQnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnaGVsbG8nLCAnc3BsaXQnLCAnJywgMCkKKworICAgIGRlZiB0ZXN0X3JzcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsndGhpcycsICdpcycsICd0aGUnLCAncnNwbGl0JywgJ2Z1bmN0aW9uJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgdGhlIHJzcGxpdCBmdW5jdGlvbicsICdyc3BsaXQnKQorCisgICAgICAgICMgYnkgd2hpdGVzcGFjZQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkICcsICdyc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhIGIgYycsICdkJ10sICdhIGIgYyBkJywgJ3JzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYSBiIGMgZCcsICdyc3BsaXQnLCBOb25lLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhIGIgYyBkJywgJ3JzcGxpdCcsIE5vbmUsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5tYXhpbnQtMjApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgYiBjIGQnXSwgJ2EgYiBjIGQnLCAncnNwbGl0JywgTm9uZSwgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYSBiIGMgZCddLCAnYSBiIGMgZCAgJywgJ3JzcGxpdCcsIE5vbmUsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EgIGInLCAnYycsICdkJ10sICdhICBiICBjICBkJywgJ3JzcGxpdCcsIE5vbmUsIDIpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFtdLCAnICAgICAgICAgJywgJ3JzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSwgJyAgYSAgICAnLCAncnNwbGl0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJ10sICcgIGEgICAgYiAgICcsICdyc3BsaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycgIGEnLCAnYiddLCAnICBhICAgIGIgICAnLCAncnNwbGl0JywgTm9uZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnICBhICAgIGInLCdjJ10sICcgIGEgICAgYiAgIGMgICAnLCAncnNwbGl0JywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyAgYScsICdiJywgJ2MnXSwgJyAgYSAgICBiICAgYyAgICcsICdyc3BsaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJ10sICdcblx0YSBcdFxyIGIgXHYgJywgJ3JzcGxpdCcsIE5vbmUsIDg4KQorICAgICAgICBhYWEgPSAnIGEgJyoyMAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsIGFhYSwgJ3JzcGxpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbYWFhWzotNF1dICsgWydhJ10sIGFhYSwgJ3JzcGxpdCcsIE5vbmUsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyBhICBhJ10gKyBbJ2EnXSoxOCwgYWFhLCAncnNwbGl0JywgTm9uZSwgMTgpCisKKworICAgICAgICAjIGJ5IGEgY2hhcgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3JzcGxpdCcsICd8JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYXxifGMnLCAnZCddLCAnYXxifGN8ZCcsICdyc3BsaXQnLCAnfCcsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhfGJ8Y3xkJywgJ3JzcGxpdCcsICd8JywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYXxifGN8ZCcsICdyc3BsaXQnLCAnfCcsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnLAorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLm1heGludC0xMDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YnxjfGQnXSwgJ2F8YnxjfGQnLCAncnNwbGl0JywgJ3wnLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhfHxifHxjJywgJycsICdkJ10sICdhfHxifHxjfHxkJywgJ3JzcGxpdCcsICd8JywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBiZWdpbmNhc2UnXSwgJ3wgYmVnaW5jYXNlJywgJ3JzcGxpdCcsICd8JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnZW5kY2FzZSAnLCAnJ10sICdlbmRjYXNlIHwnLCAncnNwbGl0JywgJ3wnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnYm90aGNhc2UnLCAnJ10sICd8Ym90aGNhc2V8JywgJ3JzcGxpdCcsICd8JykKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhXHgwMFx4MDBiJywgJ2MnLCAnZCddLCAnYVx4MDBceDAwYlx4MDBjXHgwMGQnLCAncnNwbGl0JywgJ1x4MDAnLCAyKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnXSoyMCwgKCdhfCcqMjApWzotMV0sICdyc3BsaXQnLCAnfCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2F8YXxhfGF8YSddK1snYSddKjE1LAorICAgICAgICAgICAgICAgICAgICAgICAgKCdhfCcqMjApWzotMV0sICdyc3BsaXQnLCAnfCcsIDE1KQorCisgICAgICAgICMgYnkgc3RyaW5nCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYS8vYi8vYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3JzcGxpdCcsICcvLycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EvL2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3JzcGxpdCcsICcvLycsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EnLCAnYicsICdjJywgJ2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYScsICdiJywgJ2MnLCAnZCddLCAnYS8vYi8vYy8vZCcsICdyc3BsaXQnLCAnLy8nLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJywgJ2InLCAnYycsICdkJ10sICdhLy9iLy9jLy9kJywgJ3JzcGxpdCcsICcvLycsCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMubWF4aW50LTUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2EvL2IvL2MvL2QnXSwgJ2EvL2IvL2MvL2QnLCAncnNwbGl0JywgJy8vJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYS8vLy9iLy8vL2MnLCAnJywgJ2QnXSwgJ2EvLy8vYi8vLy9jLy8vL2QnLCAncnNwbGl0JywgJy8vJywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnJywgJyBiZWdpbmNhc2UnXSwgJ3Rlc3QgYmVnaW5jYXNlJywgJ3JzcGxpdCcsICd0ZXN0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnZW5kY2FzZSAnLCAnJ10sICdlbmRjYXNlIHRlc3QnLCAncnNwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnIGJvdGhjYXNlICcsICcnXSwgJ3Rlc3QgYm90aGNhc2UgdGVzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAncnNwbGl0JywgJ3Rlc3QnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYicsICdjJ10sICdhYmJiYycsICdyc3BsaXQnLCAnYmInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnJ10sICdhYWEnLCAncnNwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhYSddLCAnYWFhJywgJ3JzcGxpdCcsICdhYWEnLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYicsICdhYiddLCAnYWJiYWFiJywgJ3JzcGxpdCcsICdiYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2FhYWEnXSwgJ2FhYWEnLCAncnNwbGl0JywgJ2FhYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJyddLCAnJywgJ3JzcGxpdCcsICdhYWEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYSddLCAnYWEnLCAncnNwbGl0JywgJ2FhYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJ2Jib2InLCAnQSddLCAnYmJvYmJib2JiQScsICdyc3BsaXQnLCAnYmJvYmInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWycnLCAnQicsICdBJ10sICdiYm9iYkJiYm9iYkEnLCAncnNwbGl0JywgJ2Jib2JiJykKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsICgnYUJMQUgnKjIwKVs6LTRdLCAncnNwbGl0JywgJ0JMQUgnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhJ10qMjAsICgnYUJMQUgnKjIwKVs6LTRdLCAncnNwbGl0JywgJ0JMQUgnLCAxOSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYUJMQUhhJ10gKyBbJ2EnXSoxOCwgKCdhQkxBSCcqMjApWzotNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAncnNwbGl0JywgJ0JMQUgnLCAxOCkKKworICAgICAgICAjIG1peGVkIHVzZSBvZiBzdHIgYW5kIHVuaWNvZGUKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFt1J2EgYicsIHUnYycsIHUnZCddLCAnYSBiIGMgZCcsICdyc3BsaXQnLCB1JyAnLCAyKQorCisgICAgICAgICMgYXJndW1lbnQgdHlwZQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3JzcGxpdCcsIDQyLCA0MiwgNDIpCisKKyAgICAgICAgIyBudWxsIGNhc2UKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnaGVsbG8nLCAncnNwbGl0JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ2hlbGxvJywgJ3JzcGxpdCcsICcnLCAwKQorCisgICAgZGVmIHRlc3Rfc3RyaXAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8nLCAnICAgaGVsbG8gICAnLCAnc3RyaXAnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvICAgJywgJyAgIGhlbGxvICAgJywgJ2xzdHJpcCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnICAgaGVsbG8nLCAnICAgaGVsbG8gICAnLCAncnN0cmlwJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbycsICdoZWxsbycsICdzdHJpcCcpCisKKyAgICAgICAgIyBzdHJpcC9sc3RyaXAvcnN0cmlwIHdpdGggTm9uZSBhcmcKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoZWxsbycsICcgICBoZWxsbyAgICcsICdzdHJpcCcsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8gICAnLCAnICAgaGVsbG8gICAnLCAnbHN0cmlwJywgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcgICBoZWxsbycsICcgICBoZWxsbyAgICcsICdyc3RyaXAnLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvJywgJ2hlbGxvJywgJ3N0cmlwJywgTm9uZSkKKworICAgICAgICAjIHN0cmlwL2xzdHJpcC9yc3RyaXAgd2l0aCBzdHIgYXJnCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8nLCAneHl6enloZWxsb3h5enp5JywgJ3N0cmlwJywgJ3h5eicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG94eXp6eScsICd4eXp6eWhlbGxveHl6enknLCAnbHN0cmlwJywgJ3h5eicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneHl6enloZWxsbycsICd4eXp6eWhlbGxveHl6enknLCAncnN0cmlwJywgJ3h5eicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8nLCAnaGVsbG8nLCAnc3RyaXAnLCAneHl6JykKKworICAgICAgICAjIHN0cmlwL2xzdHJpcC9yc3RyaXAgd2l0aCB1bmljb2RlIGFyZworICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2hlbGxvJywgJ2FzY2lpJyksICd4eXp6eWhlbGxveHl6enknLAorICAgICAgICAgICAgICAgICAnc3RyaXAnLCB1bmljb2RlKCd4eXonLCAnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCdoZWxsb3h5enp5JywgJ2FzY2lpJyksICd4eXp6eWhlbGxveHl6enknLAorICAgICAgICAgICAgICAgICAnbHN0cmlwJywgdW5pY29kZSgneHl6JywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgneHl6enloZWxsbycsICdhc2NpaScpLCAneHl6enloZWxsb3h5enp5JywKKyAgICAgICAgICAgICAgICAgJ3JzdHJpcCcsIHVuaWNvZGUoJ3h5eicsICdhc2NpaScpKQorICAgICAgICAgICAgIyBYWFgKKyAgICAgICAgICAgICNzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgnaGVsbG8nLCAnYXNjaWknKSwgJ2hlbGxvJywKKyAgICAgICAgICAgICMgICAgICdzdHJpcCcsIHVuaWNvZGUoJ3h5eicsICdhc2NpaScpKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnc3RyaXAnLCA0MiwgNDIpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnbHN0cmlwJywgNDIsIDQyKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3JzdHJpcCcsIDQyLCA0MikKKworICAgIGRlZiB0ZXN0X2xqdXN0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYyAgICAgICAnLCAnYWJjJywgJ2xqdXN0JywgMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjICAgJywgJ2FiYycsICdsanVzdCcsIDYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2FiYycsICdsanVzdCcsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2FiYycsICdsanVzdCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjKioqKioqKicsICdhYmMnLCAnbGp1c3QnLCAxMCwgJyonKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdsanVzdCcpCisKKyAgICBkZWYgdGVzdF9yanVzdChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcgICAgICAgYWJjJywgJ2FiYycsICdyanVzdCcsIDEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyAgIGFiYycsICdhYmMnLCAncmp1c3QnLCA2KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAncmp1c3QnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAncmp1c3QnLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyoqKioqKiphYmMnLCAnYWJjJywgJ3JqdXN0JywgMTAsICcqJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAncmp1c3QnKQorCisgICAgZGVmIHRlc3RfY2VudGVyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyAgIGFiYyAgICAnLCAnYWJjJywgJ2NlbnRlcicsIDEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyBhYmMgICcsICdhYmMnLCAnY2VudGVyJywgNikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ2NlbnRlcicsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2FiYycsICdjZW50ZXInLCAyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyoqKmFiYyoqKionLCAnYWJjJywgJ2NlbnRlcicsIDEwLCAnKicpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ2NlbnRlcicpCisKKyAgICBkZWYgdGVzdF9zd2FwY2FzZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdoRWxsTyBDb01QdVRFclMnLCAnSGVMTG8gY09tcFV0ZVJzJywgJ3N3YXBjYXNlJykKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3N3YXBjYXNlJywgNDIpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICBFUSA9IHNlbGYuY2hlY2tlcXVhbAorCisgICAgICAgICMgT3BlcmF0aW9ucyBvbiB0aGUgZW1wdHkgc3RyaW5nCisgICAgICAgIEVRKCIiLCAiIiwgInJlcGxhY2UiLCAiIiwgIiIpCisgICAgICAgIEVRKCJBIiwgIiIsICJyZXBsYWNlIiwgIiIsICJBIikKKyAgICAgICAgRVEoIiIsICIiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCIiLCAiIiwgInJlcGxhY2UiLCAiQSIsICJBIikKKyAgICAgICAgRVEoIiIsICIiLCAicmVwbGFjZSIsICIiLCAiIiwgMTAwKQorICAgICAgICBFUSgiIiwgIiIsICJyZXBsYWNlIiwgIiIsICIiLCBzeXMubWF4aW50KQorCisgICAgICAgICMgaW50ZXJsZWF2ZSAoZnJvbT09IiIsICd0bycgZ2V0cyBpbnNlcnRlZCBldmVyeXdoZXJlKQorICAgICAgICBFUSgiQSIsICJBIiwgInJlcGxhY2UiLCAiIiwgIiIpCisgICAgICAgIEVRKCIqQSoiLCAiQSIsICJyZXBsYWNlIiwgIiIsICIqIikKKyAgICAgICAgRVEoIioxQSoxIiwgIkEiLCAicmVwbGFjZSIsICIiLCAiKjEiKQorICAgICAgICBFUSgiKi0jQSotIyIsICJBIiwgInJlcGxhY2UiLCAiIiwgIiotIyIpCisgICAgICAgIEVRKCIqLUEqLUEqLSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIpCisgICAgICAgIEVRKCIqLUEqLUEqLSIsICJBQSIsICJyZXBsYWNlIiwgIiIsICIqLSIsIC0xKQorICAgICAgICBFUSgiKi1BKi1BKi0iLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiKi1BKi1BKi0iLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iLCA0KQorICAgICAgICBFUSgiKi1BKi1BKi0iLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iLCAzKQorICAgICAgICBFUSgiKi1BKi1BIiwgIkFBIiwgInJlcGxhY2UiLCAiIiwgIiotIiwgMikKKyAgICAgICAgRVEoIiotQUEiLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iLCAxKQorICAgICAgICBFUSgiQUEiLCAiQUEiLCAicmVwbGFjZSIsICIiLCAiKi0iLCAwKQorCisgICAgICAgICMgc2luZ2xlIGNoYXJhY3RlciBkZWxldGlvbiAoZnJvbT09IkEiLCB0bz09IiIpCisgICAgICAgIEVRKCIiLCAiQSIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIiIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCIiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAtMSkKKyAgICAgICAgRVEoIiIsICJBQUEiLCAicmVwbGFjZSIsICJBIiwgIiIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCIiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiLCA0KQorICAgICAgICBFUSgiIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMykKKyAgICAgICAgRVEoIkEiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAyKQorICAgICAgICBFUSgiQUEiLCAiQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAxKQorICAgICAgICBFUSgiQUFBIiwgIkFBQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgMCkKKyAgICAgICAgRVEoIiIsICJBQUFBQUFBQUFBIiwgInJlcGxhY2UiLCAiQSIsICIiKQorICAgICAgICBFUSgiQkNEIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCJCQ0QiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgLTEpCisgICAgICAgIEVRKCJCQ0QiLCAiQUJBQ0FEQSIsICJyZXBsYWNlIiwgIkEiLCAiIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoIkJDRCIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCA1KQorICAgICAgICBFUSgiQkNEIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDQpCisgICAgICAgIEVRKCJCQ0RBIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDMpCisgICAgICAgIEVRKCJCQ0FEQSIsICJBQkFDQURBIiwgInJlcGxhY2UiLCAiQSIsICIiLCAyKQorICAgICAgICBFUSgiQkFDQURBIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDEpCisgICAgICAgIEVRKCJBQkFDQURBIiwgIkFCQUNBREEiLCAicmVwbGFjZSIsICJBIiwgIiIsIDApCisgICAgICAgIEVRKCJCQ0QiLCAiQUJDQUQiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCJCQ0QiLCAiQUJDQURBQSIsICJyZXBsYWNlIiwgIkEiLCAiIikKKyAgICAgICAgRVEoIkJDRCIsICJCQ0QiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCIqKioqKioqKioqKioqIiwgIioqKioqKioqKioqKioiLCAicmVwbGFjZSIsICJBIiwgIiIpCisgICAgICAgIEVRKCJeQV4iLCAiXiIrIkEiKjEwMDArIl4iLCAicmVwbGFjZSIsICJBIiwgIiIsIDk5OSkKKworICAgICAgICAjIHN1YnN0cmluZyBkZWxldGlvbiAoZnJvbT09InRoZSIsIHRvPT0iIikKKyAgICAgICAgRVEoIiIsICJ0aGUiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoImF0ZXIiLCAidGhlYXRlciIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgiIiwgInRoZXRoZSIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgiIiwgInRoZXRoZXRoZXRoZSIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgiYWFhYSIsICJ0aGVhdGhlYXRoZWF0aGVhIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCJ0aGF0IiwgInRoYXQiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKyAgICAgICAgRVEoInRoYWV0IiwgInRoYWV0IiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisgICAgICAgIEVRKCJoZXJlIGFuZCByZSIsICJoZXJlIGFuZCB0aGVyZSIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgiaGVyZSBhbmQgcmUgYW5kIHJlIiwgImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInRoZSIsICIiLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiaGVyZSBhbmQgcmUgYW5kIHJlIiwgImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInRoZSIsICIiLCAtMSkKKyAgICAgICAgRVEoImhlcmUgYW5kIHJlIGFuZCByZSIsICJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLAorICAgICAgICAgICAicmVwbGFjZSIsICJ0aGUiLCAiIiwgMykKKyAgICAgICAgRVEoImhlcmUgYW5kIHJlIGFuZCByZSIsICJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLAorICAgICAgICAgICAicmVwbGFjZSIsICJ0aGUiLCAiIiwgMikKKyAgICAgICAgRVEoImhlcmUgYW5kIHJlIGFuZCB0aGVyZSIsICJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLAorICAgICAgICAgICAicmVwbGFjZSIsICJ0aGUiLCAiIiwgMSkKKyAgICAgICAgRVEoImhlcmUgYW5kIHRoZXJlIGFuZCB0aGVyZSIsICJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLAorICAgICAgICAgICAicmVwbGFjZSIsICJ0aGUiLCAiIiwgMCkKKyAgICAgICAgRVEoImhlcmUgYW5kIHJlIGFuZCByZSIsICJoZXJlIGFuZCB0aGVyZSBhbmQgdGhlcmUiLCAicmVwbGFjZSIsICJ0aGUiLCAiIikKKworICAgICAgICBFUSgiYWJjIiwgImFiYyIsICJyZXBsYWNlIiwgInRoZSIsICIiKQorICAgICAgICBFUSgiYWJjZGVmZyIsICJhYmNkZWZnIiwgInJlcGxhY2UiLCAidGhlIiwgIiIpCisKKyAgICAgICAgIyBzdWJzdHJpbmcgZGVsZXRpb24gKGZyb209PSJib2IiLCB0bz09IiIpCisgICAgICAgIEVRKCJib2IiLCAiYmJvYm9iIiwgInJlcGxhY2UiLCAiYm9iIiwgIiIpCisgICAgICAgIEVRKCJib2JYYm9iIiwgImJib2JvYlhiYm9ib2IiLCAicmVwbGFjZSIsICJib2IiLCAiIikKKyAgICAgICAgRVEoImFhYWFhYWEiLCAiYWFhYWFhYWJvYiIsICJyZXBsYWNlIiwgImJvYiIsICIiKQorICAgICAgICBFUSgiYWFhYWFhYSIsICJhYWFhYWFhIiwgInJlcGxhY2UiLCAiYm9iIiwgIiIpCisKKyAgICAgICAgIyBzaW5nbGUgY2hhcmFjdGVyIHJlcGxhY2UgaW4gcGxhY2UgKGxlbihmcm9tKT09bGVuKHRvKT09MSkKKyAgICAgICAgRVEoIldobyBnb2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIm8iKQorICAgICAgICBFUSgiV2hPIGdPZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAiTyIpCisgICAgICAgIEVRKCJXaE8gZ09lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJPIiwgc3lzLm1heGludCkKKyAgICAgICAgRVEoIldoTyBnT2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIk8iLCAtMSkKKyAgICAgICAgRVEoIldoTyBnT2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIk8iLCAzKQorICAgICAgICBFUSgiV2hPIGdPZXMgdGhlcmU/IiwgIldobyBnb2VzIHRoZXJlPyIsICJyZXBsYWNlIiwgIm8iLCAiTyIsIDIpCisgICAgICAgIEVRKCJXaE8gZ29lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAibyIsICJPIiwgMSkKKyAgICAgICAgRVEoIldobyBnb2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJvIiwgIk8iLCAwKQorCisgICAgICAgIEVRKCJXaG8gZ29lcyB0aGVyZT8iLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAiYSIsICJxIikKKyAgICAgICAgRVEoIndobyBnb2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICJXIiwgInciKQorICAgICAgICBFUSgid3dobyBnb2VzIHRoZXJlP3d3IiwgIldXaG8gZ29lcyB0aGVyZT9XVyIsICJyZXBsYWNlIiwgIlciLCAidyIpCisgICAgICAgIEVRKCJXaG8gZ29lcyB0aGVyZSEiLCAiV2hvIGdvZXMgdGhlcmU/IiwgInJlcGxhY2UiLCAiPyIsICIhIikKKyAgICAgICAgRVEoIldobyBnb2VzIHRoZXJlISEiLCAiV2hvIGdvZXMgdGhlcmU/PyIsICJyZXBsYWNlIiwgIj8iLCAiISIpCisKKyAgICAgICAgRVEoIldobyBnb2VzIHRoZXJlPyIsICJXaG8gZ29lcyB0aGVyZT8iLCAicmVwbGFjZSIsICIuIiwgIiEiKQorCisgICAgICAgICMgc3Vic3RyaW5nIHJlcGxhY2UgaW4gcGxhY2UgKGxlbihmcm9tKT09bGVuKHRvKSA+IDEpCisgICAgICAgIEVRKCJUaCoqICoqIGEgdCoqc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIpCisgICAgICAgIEVRKCJUaCoqICoqIGEgdCoqc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIsIHN5cy5tYXhpbnQpCisgICAgICAgIEVRKCJUaCoqICoqIGEgdCoqc3VlIiwgIlRoaXMgaXMgYSB0aXNzdWUiLCAicmVwbGFjZSIsICJpcyIsICIqKiIsIC0xKQorICAgICAgICBFUSgiVGgqKiAqKiBhIHQqKnN1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiLCA0KQorICAgICAgICBFUSgiVGgqKiAqKiBhIHQqKnN1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiLCAzKQorICAgICAgICBFUSgiVGgqKiAqKiBhIHRpc3N1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiLCAyKQorICAgICAgICBFUSgiVGgqKiBpcyBhIHRpc3N1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiLCAxKQorICAgICAgICBFUSgiVGhpcyBpcyBhIHRpc3N1ZSIsICJUaGlzIGlzIGEgdGlzc3VlIiwgInJlcGxhY2UiLCAiaXMiLCAiKioiLCAwKQorICAgICAgICBFUSgiY29ib2IiLCAiYm9ib2IiLCAicmVwbGFjZSIsICJib2IiLCAiY29iIikKKyAgICAgICAgRVEoImNvYm9iWGNvYm9jb2IiLCAiYm9ib2JYYm9ib2JvYiIsICJyZXBsYWNlIiwgImJvYiIsICJjb2IiKQorICAgICAgICBFUSgiYm9ib2IiLCAiYm9ib2IiLCAicmVwbGFjZSIsICJib3QiLCAiYm90IikKKworICAgICAgICAjIHJlcGxhY2Ugc2luZ2xlIGNoYXJhY3RlciAobGVuKGZyb20pPT0xLCBsZW4odG8pPjEpCisgICAgICAgIEVRKCJSZXlLS2phdmlLSyIsICJSZXlramF2aWsiLCAicmVwbGFjZSIsICJrIiwgIktLIikKKyAgICAgICAgRVEoIlJleUtLamF2aUtLIiwgIlJleWtqYXZpayIsICJyZXBsYWNlIiwgImsiLCAiS0siLCAtMSkKKyAgICAgICAgRVEoIlJleUtLamF2aUtLIiwgIlJleWtqYXZpayIsICJyZXBsYWNlIiwgImsiLCAiS0siLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiUmV5S0tqYXZpS0siLCAiUmV5a2phdmlrIiwgInJlcGxhY2UiLCAiayIsICJLSyIsIDIpCisgICAgICAgIEVRKCJSZXlLS2phdmlrIiwgIlJleWtqYXZpayIsICJyZXBsYWNlIiwgImsiLCAiS0siLCAxKQorICAgICAgICBFUSgiUmV5a2phdmlrIiwgIlJleWtqYXZpayIsICJyZXBsYWNlIiwgImsiLCAiS0siLCAwKQorICAgICAgICBFUSgiQS0tLS1CLS0tLUMtLS0tIiwgIkEuQi5DLiIsICJyZXBsYWNlIiwgIi4iLCAiLS0tLSIpCisKKyAgICAgICAgRVEoIlJleWtqYXZpayIsICJSZXlramF2aWsiLCAicmVwbGFjZSIsICJxIiwgIktLIikKKworICAgICAgICAjIHJlcGxhY2Ugc3Vic3RyaW5nIChsZW4oZnJvbSk+MSwgbGVuKHRvKSE9bGVuKGZyb20pKQorICAgICAgICBFUSgiaGFtLCBoYW0sIGVnZ3MgYW5kIGhhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iKQorICAgICAgICBFUSgiaGFtLCBoYW0sIGVnZ3MgYW5kIGhhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iLCBzeXMubWF4aW50KQorICAgICAgICBFUSgiaGFtLCBoYW0sIGVnZ3MgYW5kIGhhbSIsICJzcGFtLCBzcGFtLCBlZ2dzIGFuZCBzcGFtIiwKKyAgICAgICAgICAgInJlcGxhY2UiLCAic3BhbSIsICJoYW0iLCAtMSkKKyAgICAgICAgRVEoImhhbSwgaGFtLCBlZ2dzIGFuZCBoYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIiwgNCkKKyAgICAgICAgRVEoImhhbSwgaGFtLCBlZ2dzIGFuZCBoYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIiwgMykKKyAgICAgICAgRVEoImhhbSwgaGFtLCBlZ2dzIGFuZCBzcGFtIiwgInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLAorICAgICAgICAgICAicmVwbGFjZSIsICJzcGFtIiwgImhhbSIsIDIpCisgICAgICAgIEVRKCJoYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIiwgMSkKKyAgICAgICAgRVEoInNwYW0sIHNwYW0sIGVnZ3MgYW5kIHNwYW0iLCAic3BhbSwgc3BhbSwgZWdncyBhbmQgc3BhbSIsCisgICAgICAgICAgICJyZXBsYWNlIiwgInNwYW0iLCAiaGFtIiwgMCkKKworICAgICAgICBFUSgiYm9ib2IiLCAiYm9ib2JvYiIsICJyZXBsYWNlIiwgImJvYm9iIiwgImJvYiIpCisgICAgICAgIEVRKCJib2JvYlhib2JvYiIsICJib2JvYm9iWGJvYm9ib2IiLCAicmVwbGFjZSIsICJib2JvYiIsICJib2IiKQorICAgICAgICBFUSgiQk9CT0JPQiIsICJCT0JPQk9CIiwgInJlcGxhY2UiLCAiYm9iIiwgImJvYmJ5IikKKworICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBiYSA9IGJ1ZmZlcignYScpCisgICAgICAgICAgICBiYiA9IGJ1ZmZlcignYicpCisgICAgICAgIEVRKCJiYmMiLCAiYWJjIiwgInJlcGxhY2UiLCBiYSwgYmIpCisgICAgICAgIEVRKCJhYWMiLCAiYWJjIiwgInJlcGxhY2UiLCBiYiwgYmEpCisKKyAgICAgICAgIworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZUB0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICdAJywgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmV0d290aHJlZScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmVAdHdvQHRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnQCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnb25lQHR3b0B0aHJlZUAnLCAnb25lIXR3byF0aHJlZSEnLCAncmVwbGFjZScsICchJywgJ0AnLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZUB0d29AdGhyZWVAJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICdAJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmUhdHdvIXRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJyEnLCAnQCcsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnb25lQHR3b0B0aHJlZUAnLCAnb25lIXR3byF0aHJlZSEnLCAncmVwbGFjZScsICchJywgJ0AnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZSF0d28hdGhyZWUhJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAneCcsICdAJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdvbmUhdHdvIXRocmVlIScsICdvbmUhdHdvIXRocmVlIScsICdyZXBsYWNlJywgJ3gnLCAnQCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnLWEtYi1jLScsICdhYmMnLCAncmVwbGFjZScsICcnLCAnLScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnLWEtYi1jJywgJ2FiYycsICdyZXBsYWNlJywgJycsICctJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ3JlcGxhY2UnLCAnJywgJy0nLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJycsICcnLCAncmVwbGFjZScsICcnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ3JlcGxhY2UnLCAnYWInLCAnLS0nLCAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAncmVwbGFjZScsICd4eScsICctLScpCisgICAgICAgICMgTmV4dCB0aHJlZSBmb3IgU0YgYnVnIDQyMjA4ODogW09TRjEgYWxwaGFdIHN0cmluZy5yZXBsYWNlKCk7IGRpZWQgd2l0aAorICAgICAgICAjIE1lbW9yeUVycm9yIGR1ZSB0byBlbXB0eSByZXN1bHQgKHBsYXRmb3JtIG1hbGxvYyBpc3N1ZSB3aGVuIHJlcXVlc3RpbmcKKyAgICAgICAgIyAwIGJ5dGVzKS4KKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcnLCAnMTIzJywgJ3JlcGxhY2UnLCAnMTIzJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnJywgJzEyMzEyMycsICdyZXBsYWNlJywgJzEyMycsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3gnLCAnMTIzeDEyMycsICdyZXBsYWNlJywgJzEyMycsICcnKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmVwbGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAncmVwbGFjZScsIDQyKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3JlcGxhY2UnLCA0MiwgJ2gnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3JlcGxhY2UnLCAnaCcsIDQyKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZV9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgIyBDaGVjayBmb3Igb3ZlcmZsb3cgY2hlY2tpbmcgb24gMzIgYml0IG1hY2hpbmVzCisgICAgICAgIGlmIHN5cy5tYXhpbnQgIT0gMjE0NzQ4MzY0NyBvciBzdHJ1Y3QuY2FsY3NpemUoIlAiKSA+IDQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgQTJfMTYgPSAiQSIgKiAoMioqMTYpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoT3ZlcmZsb3dFcnJvciwgQTJfMTYsICJyZXBsYWNlIiwgIiIsIEEyXzE2KQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsIEEyXzE2LCAicmVwbGFjZSIsICJBIiwgQTJfMTYpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoT3ZlcmZsb3dFcnJvciwgQTJfMTYsICJyZXBsYWNlIiwgIkFBIiwgQTJfMTYrQTJfMTYpCisKKyAgICBkZWYgdGVzdF96ZmlsbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcxMjMnLCAnMTIzJywgJ3pmaWxsJywgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcxMjMnLCAnMTIzJywgJ3pmaWxsJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcwMTIzJywgJzEyMycsICd6ZmlsbCcsIDQpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnKzEyMycsICcrMTIzJywgJ3pmaWxsJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcrMTIzJywgJysxMjMnLCAnemZpbGwnLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJyswMTIzJywgJysxMjMnLCAnemZpbGwnLCA1KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJy0xMjMnLCAnLTEyMycsICd6ZmlsbCcsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnLTEyMycsICctMTIzJywgJ3pmaWxsJywgNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCctMDEyMycsICctMTIzJywgJ3pmaWxsJywgNSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcwMDAnLCAnJywgJ3pmaWxsJywgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCczNCcsICczNCcsICd6ZmlsbCcsIDEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnMDAzNCcsICczNCcsICd6ZmlsbCcsIDQpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICcxMjMnLCAnemZpbGwnKQorCisjIFhYWCBhbGlhcyBmb3IgcHkzayBmb3J3YXJkIGNvbXBhdGliaWxpdHkKK0Jhc2VUZXN0ID0gQ29tbW9uVGVzdAorCitjbGFzcyBNaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdDoKKyAgICAjIGFkZGl0aW9uYWwgdGVzdHMgdGhhdCBvbmx5IHdvcmsgZm9yCisgICAgIyBzdHJpbmdsaWtlIG9iamVjdHMsIGkuZS4gc3RyLCB1bmljb2RlLCBVc2VyU3RyaW5nCisgICAgIyAoYnV0IG5vdCB0aGUgc3RyaW5nIG1vZHVsZSkKKworICAgIGRlZiB0ZXN0X2lzbG93ZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJycsICdpc2xvd2VyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhJywgJ2lzbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdBJywgJ2lzbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdcbicsICdpc2xvd2VyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhYmMnLCAnaXNsb3dlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2FCYycsICdpc2xvd2VyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhYmNcbicsICdpc2xvd2VyJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnaXNsb3dlcicsIDQyKQorCisgICAgZGVmIHRlc3RfaXN1cHBlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnJywgJ2lzdXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhJywgJ2lzdXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0EnLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ1xuJywgJ2lzdXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0FCQycsICdpc3VwcGVyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnQWJDJywgJ2lzdXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0FCQ1xuJywgJ2lzdXBwZXInKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdpc3VwcGVyJywgNDIpCisKKyAgICBkZWYgdGVzdF9pc3RpdGxlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcnLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2EnLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQScsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnXG4nLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQSBUaXRsZWNhc2VkIExpbmUnLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQVxuVGl0bGVjYXNlZCBMaW5lJywgJ2lzdGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0EgVGl0bGVjYXNlZCwgTGluZScsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnTm90IGEgY2FwaXRhbGl6ZWQgU3RyaW5nJywgJ2lzdGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdOb3RcdGEgVGl0bGVjYXNlIFN0cmluZycsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnTm90LS1hIFRpdGxlY2FzZSBTdHJpbmcnLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ05PVCcsICdpc3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnaXN0aXRsZScsIDQyKQorCisgICAgZGVmIHRlc3RfaXNzcGFjZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnJywgJ2lzc3BhY2UnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhJywgJ2lzc3BhY2UnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJyAnLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnXHQnLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnXHInLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnXG4nLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnIFx0XHJcbicsICdpc3NwYWNlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnIFx0XHJcbmEnLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ2lzc3BhY2UnLCA0MikKKworICAgIGRlZiB0ZXN0X2lzYWxwaGEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJycsICdpc2FscGhhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhJywgJ2lzYWxwaGEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0EnLCAnaXNhbHBoYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ1xuJywgJ2lzYWxwaGEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2FiYycsICdpc2FscGhhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnYUJjMTIzJywgJ2lzYWxwaGEnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhYmNcbicsICdpc2FscGhhJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnaXNhbHBoYScsIDQyKQorCisgICAgZGVmIHRlc3RfaXNhbG51bShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnJywgJ2lzYWxudW0nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNhbG51bScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnQScsICdpc2FsbnVtJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnXG4nLCAnaXNhbG51bScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnMTIzYWJjNDU2JywgJ2lzYWxudW0nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2ExYjNjJywgJ2lzYWxudW0nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhQmMwMDAgJywgJ2lzYWxudW0nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhYmNcbicsICdpc2FsbnVtJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnaXNhbG51bScsIDQyKQorCisgICAgZGVmIHRlc3RfaXNkaWdpdChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnJywgJ2lzZGlnaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhJywgJ2lzZGlnaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJzAnLCAnaXNkaWdpdCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnMDEyMzQ1Njc4OScsICdpc2RpZ2l0JykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnMDEyMzQ1Njc4OWEnLCAnaXNkaWdpdCcpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnaXNkaWdpdCcsIDQyKQorCisgICAgZGVmIHRlc3RfdGl0bGUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnIEhlbGxvICcsICcgaGVsbG8gJywgJ3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdIZWxsbyAnLCAnaGVsbG8gJywgJ3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdIZWxsbyAnLCAnSGVsbG8gJywgJ3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdGb3JtYXQgVGhpcyBBcyBUaXRsZSBTdHJpbmcnLCAiZk9yTWFUIHRoSXMgYVMgdGl0TGUgU3RyaW5nIiwgJ3RpdGxlJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdGb3JtYXQsVGhpcy1BcypUaXRsZTtTdHJpbmcnLCAiZk9yTWFULHRoSXMtYVMqdGl0TGU7U3RyaW5nIiwgJ3RpdGxlJywgKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ0dldGludCcsICJnZXRJbnQiLCAndGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3RpdGxlJywgNDIpCisKKyAgICBkZWYgdGVzdF9zcGxpdGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYmMnLCAnZGVmJywgJycsICdnaGknXSwgImFiY1xuZGVmXG5ccmdoaSIsICdzcGxpdGxpbmVzJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWJjJywgJ2RlZicsICcnLCAnZ2hpJ10sICJhYmNcbmRlZlxuXHJcbmdoaSIsICdzcGxpdGxpbmVzJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWJjJywgJ2RlZicsICdnaGknXSwgImFiY1xuZGVmXHJcbmdoaSIsICdzcGxpdGxpbmVzJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnYWJjJywgJ2RlZicsICdnaGknXSwgImFiY1xuZGVmXHJcbmdoaVxuIiwgJ3NwbGl0bGluZXMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoWydhYmMnLCAnZGVmJywgJ2doaScsICcnXSwgImFiY1xuZGVmXHJcbmdoaVxuXHIiLCAnc3BsaXRsaW5lcycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChbJycsICdhYmMnLCAnZGVmJywgJ2doaScsICcnXSwgIlxuYWJjXG5kZWZcclxuZ2hpXG5cciIsICdzcGxpdGxpbmVzJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFsnXG4nLCAnYWJjXG4nLCAnZGVmXHJcbicsICdnaGlcbicsICdcciddLCAiXG5hYmNcbmRlZlxyXG5naGlcblxyIiwgJ3NwbGl0bGluZXMnLCAxKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ3NwbGl0bGluZXMnLCA0MiwgNDIpCisKKyAgICBkZWYgdGVzdF9zdGFydHN3aXRoKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnaGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnZWxsbycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdlbGxvJywgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ28nLCA0KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ28nLCA1KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnJywgNSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdsbycsIDYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdzdGFydHN3aXRoJywgJ2xvd28nLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnc3RhcnRzd2l0aCcsICdsb3dvJywgMywgNykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG93b3JsZCcsICdzdGFydHN3aXRoJywgJ2xvd28nLCAzLCA2KQorCisgICAgICAgICMgdGVzdCBuZWdhdGl2ZSBpbmRpY2VzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdoZScsIDAsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnaGUnLCAtNTMsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ2hlbGxvJywgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnaGVsbG8gd29ybGQnLCAtMSwgLTEwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ2VsbG8nLCAtNSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgJ2VsbG8nLCAtNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdvJywgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICdvJywgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICcnLCAtMywgLTMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAnbG8nLCAtOSkKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCA0MikKKworICAgICAgICAjIHRlc3QgdHVwbGUgYXJndW1lbnRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGUnLCAnaGEnKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnbG8nLCAnbGxvJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGVsbG94JywgJ2hlbGxvJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlbGxvd28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmxkJywgJ2xvd28nKSwgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG93b3JsZCcsICdzdGFydHN3aXRoJywgKCdoZWxsb3dvJywgJ2VsbG8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcpLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2xvJywgJ2hlJyksIDAsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdoZScsICdoZWwnKSwgMCwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdoZScsICdoZWwnKSwgMCwgMikKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoNDIsKSkKKworICAgIGRlZiB0ZXN0X2VuZHN3aXRoKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJ2xvJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAnaGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICd3b3JsJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ3dvcmwnLCAzLCA5KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnd29ybGQnLCAzLCAxMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ2xvd28nLCAxLCA3KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnbG93bycsIDIsIDcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICdsb3dvJywgMywgNykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICdsb3dvJywgNCwgNykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICdsb3dvJywgMywgOCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnYWInLCAnZW5kc3dpdGgnLCAnYWInLCAwLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhYicsICdlbmRzd2l0aCcsICdhYicsIDAsIDApCisKKyAgICAgICAgIyB0ZXN0IG5lZ2F0aXZlIGluZGljZXMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICdsbycsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdlbmRzd2l0aCcsICdoZScsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJycsIC0zLCAtMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAnaGVsbG8gd29ybGQnLCAtMTAsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ3dvcmwnLCAtNikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ3dvcmwnLCAtNSwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICd3b3JsJywgLTUsIDkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICd3b3JsZCcsIC03LCAxMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ2xvd28nLCAtOTksIC0zKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnbG93bycsIC04LCAtMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ2xvd28nLCAtNywgLTMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAnbG93bycsIDMsIC00KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgJ2xvd28nLCAtOCwgLTIpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdlbmRzd2l0aCcpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCA0MikKKworICAgICAgICAjIHRlc3QgdHVwbGUgYXJndW1lbnRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoYScpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdsbycsICdsbG8nKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGVsbG94JywgJ2hlbGxvJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG93b3JsZCcsICdlbmRzd2l0aCcsICgnaGVsbG93bycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdybGQnLCAnbG93bycpLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgKCdoZWxsb3dvJywgJ2VsbG8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcpLCAzLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGVsbCcsICdlbGwnKSwgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoZWwnKSwgMCwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdlbmRzd2l0aCcsICgnaGUnLCAnaGVsbCcpLCAwLCA0KQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoNDIsKSkKKworICAgIGRlZiB0ZXN0X19fY29udGFpbnNfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICcnLCAnX19jb250YWluc19fJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnYWJjJywgJ19fY29udGFpbnNfXycsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhYmMnLCAnX19jb250YWluc19fJywgJ1wwJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdcMGFiYycsICdfX2NvbnRhaW5zX18nLCAnXDAnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2FiY1wwJywgJ19fY29udGFpbnNfXycsICdcMCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnXDBhYmMnLCAnX19jb250YWluc19fJywgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2FzZGYnLCAnX19jb250YWluc19fJywgJ2FzZGYnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdhc2QnLCAnX19jb250YWluc19fJywgJ2FzZGYnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICcnLCAnX19jb250YWluc19fJywgJ2FzZGYnKQorCisgICAgZGVmIHRlc3Rfc3Vic2NyaXB0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdhJywgJ2FiYycsICdfX2dldGl0ZW1fXycsIDApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2MnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2EnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgMEwpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2FiYycsICdhYmMnLCAnX19nZXRpdGVtX18nLCBzbGljZSgwLCAzKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnYWJjJywgJ2FiYycsICdfX2dldGl0ZW1fXycsIHNsaWNlKDAsIDEwMDApKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdhJywgJ2FiYycsICdfX2dldGl0ZW1fXycsIHNsaWNlKDAsIDEpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwodScnLCAnYWJjJywgJ19fZ2V0aXRlbV9fJywgc2xpY2UoMCwgMCkpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnX19nZXRpdGVtX18nLCAnZGVmJykKKworICAgIGRlZiB0ZXN0X3NsaWNlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMCwgMTAwMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ19fZ2V0c2xpY2VfXycsIDAsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWInLCAnYWJjJywgJ19fZ2V0c2xpY2VfXycsIDAsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYmMnLCAnYWJjJywgJ19fZ2V0c2xpY2VfXycsIDEsIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYicsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMSwgMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcnLCAnYWJjJywgJ19fZ2V0c2xpY2VfXycsIDIsIDIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnJywgJ2FiYycsICdfX2dldHNsaWNlX18nLCAxMDAwLCAxMDAwKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJycsICdhYmMnLCAnX19nZXRzbGljZV9fJywgMjAwMCwgMTAwMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcnLCAnYWJjJywgJ19fZ2V0c2xpY2VfXycsIDIsIDEpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnX19nZXRzbGljZV9fJywgJ2RlZicpCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGV4dGVuZGVkIHNsaWNpbmcgYnkgY29tcGFyaW5nIHdpdGggbGlzdCBzbGljaW5nLgorICAgICAgICBzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzCisgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgNDEsIC0xLCAtMiwgLTM3KQorICAgICAgICBmb3Igc3RhcnQgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIGZvciBzdG9wIGluIGluZGljZXM6CisgICAgICAgICAgICAgICAgIyBTa2lwIHN0ZXAgMCAoaW52YWxpZCkKKyAgICAgICAgICAgICAgICBmb3Igc3RlcCBpbiBpbmRpY2VzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgTCA9IGxpc3Qocylbc3RhcnQ6c3RvcDpzdGVwXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSIiLmpvaW4oTCksIHMsICdfX2dldGl0ZW1fXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZShzdGFydCwgc3RvcCwgc3RlcCkpCisKKyAgICBkZWYgdGVzdF9tdWwoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnJywgJ2FiYycsICdfX211bF9fJywgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnJywgJ2FiYycsICdfX211bF9fJywgMCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYmMnLCAnYWJjJywgJ19fbXVsX18nLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY2FiY2FiYycsICdhYmMnLCAnX19tdWxfXycsIDMpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ19fbXVsX18nKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdfX211bF9fJywgJycpCisgICAgICAgICMgWFhYOiBvbiBhIDY0LWJpdCBzeXN0ZW0sIHRoaXMgZG9lc24ndCByYWlzZSBhbiBvdmVyZmxvdyBlcnJvciwKKyAgICAgICAgIyBidXQgZWl0aGVyIHJhaXNlcyBhIE1lbW9yeUVycm9yLCBvciBzdWNjZWVkcyAoaWYgeW91IGhhdmUgNTRUaUIpCisgICAgICAgICNzZWxmLmNoZWNrcmFpc2VzKE92ZXJmbG93RXJyb3IsIDEwMDAwKidhYmMnLCAnX19tdWxfXycsIDIwMDAwMDAwMDApCisKKyAgICBkZWYgdGVzdF9qb2luKHNlbGYpOgorICAgICAgICAjIGpvaW4gbm93IHdvcmtzIHdpdGggYW55IHNlcXVlbmNlIHR5cGUKKyAgICAgICAgIyBtb3ZlZCBoZXJlLCBiZWNhdXNlIHRoZSBhcmd1bWVudCBvcmRlciBpcworICAgICAgICAjIGRpZmZlcmVudCBpbiBzdHJpbmcuam9pbiAoc2VlIHRoZSB0ZXN0IGluCisgICAgICAgICMgdGVzdC50ZXN0X3N0cmluZy5TdHJpbmdUZXN0LnRlc3Rfam9pbikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhIGIgYyBkJywgJyAnLCAnam9pbicsIFsnYScsICdiJywgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY2QnLCAnJywgJ2pvaW4nLCAoJ2EnLCAnYicsICdjJywgJ2QnKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdiZCcsICcnLCAnam9pbicsICgnJywgJ2InLCAnJywgJ2QnKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYycsICcnLCAnam9pbicsICgnYScsICcnLCAnYycsICcnKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd3IHggeSB6JywgJyAnLCAnam9pbicsIFNlcXVlbmNlKCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2EnLCAnam9pbicsICgnYWJjJywpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3onLCAnYScsICdqb2luJywgVXNlckxpc3QoWyd6J10pKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2EuYi5jJyksIHVuaWNvZGUoJy4nKSwgJ2pvaW4nLCBbJ2EnLCAnYicsICdjJ10pCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgnYS5iLmMnKSwgJy4nLCAnam9pbicsIFt1bmljb2RlKCdhJyksICdiJywgJ2MnXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCdhLmIuYycpLCAnLicsICdqb2luJywgWydhJywgdW5pY29kZSgnYicpLCAnYyddKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2EuYi5jJyksICcuJywgJ2pvaW4nLCBbJ2EnLCAnYicsIHVuaWNvZGUoJ2MnKV0pCisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJy4nLCAnam9pbicsIFsnYScsIHVuaWNvZGUoJ2InKSwgM10pCisgICAgICAgIGZvciBpIGluIFs1LCAyNSwgMTI1XToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoKCgnYScgKiBpKSArICctJykgKiBpKVs6LTFdLCAnLScsICdqb2luJywKKyAgICAgICAgICAgICAgICAgWydhJyAqIGldICogaSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoKCgnYScgKiBpKSArICctJykgKiBpKVs6LTFdLCAnLScsICdqb2luJywKKyAgICAgICAgICAgICAgICAgKCdhJyAqIGksKSAqIGkpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICcgJywgJ2pvaW4nLCBCYWRTZXExKCkpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYSBiIGMnLCAnICcsICdqb2luJywgQmFkU2VxMigpKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnICcsICdqb2luJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICcgJywgJ2pvaW4nLCA3KQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJyAnLCAnam9pbicsIFNlcXVlbmNlKFs3LCAnaGVsbG8nLCAxMjNMXSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAgICAgeWllbGQgNCArICIiCisgICAgICAgICAgICBzZWxmLmZpeHR5cGUoJyAnKS5qb2luKGYoKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZToKKyAgICAgICAgICAgIGlmICcrJyBub3QgaW4gc3RyKGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnam9pbigpIGF0ZSBleGNlcHRpb24gbWVzc2FnZScpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2V4Y2VwdGlvbiBub3QgcmFpc2VkJykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnK2hlbGxvKycsICcrJXMrJywgJ19fbW9kX18nLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJysxMCsnLCAnKyVkKycsICdfX21vZF9fJywgMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYScsICIlYyIsICdfX21vZF9fJywgImEiKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2EnLCAiJWMiLCAnX19tb2RfXycsICJhIikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCciJywgIiVjIiwgJ19fbW9kX18nLCAzNCkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCckJywgIiVjIiwgJ19fbW9kX18nLCAzNikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcxMCcsICIlZCIsICdfX21vZF9fJywgMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnXHg3ZicsICIlYyIsICdfX21vZF9fJywgMHg3ZikKKworICAgICAgICBmb3Igb3JkaW5hbCBpbiAoLTEwMCwgMHgyMDAwMDApOgorICAgICAgICAgICAgIyB1bmljb2RlIHJhaXNlcyBWYWx1ZUVycm9yLCBzdHIgcmFpc2VzIE92ZXJmbG93RXJyb3IKKyAgICAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpLCAnJWMnLCAnX19tb2RfXycsIG9yZGluYWwpCisKKyAgICAgICAgbG9uZ3ZhbHVlID0gc3lzLm1heGludCArIDEwTAorICAgICAgICBzbG9uZ3ZhbHVlID0gc3RyKGxvbmd2YWx1ZSkKKyAgICAgICAgaWYgc2xvbmd2YWx1ZVstMV0gaW4gKCJMIiwibCIpOiBzbG9uZ3ZhbHVlID0gc2xvbmd2YWx1ZVs6LTFdCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnIDQyJywgJyUzbGQnLCAnX19tb2RfXycsIDQyKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzQyJywgJyVkJywgJ19fbW9kX18nLCA0MkwpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnNDInLCAnJWQnLCAnX19tb2RfXycsIDQyLjApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChzbG9uZ3ZhbHVlLCAnJWQnLCAnX19tb2RfXycsIGxvbmd2YWx1ZSkKKyAgICAgICAgc2VsZi5jaGVja2NhbGwoJyVkJywgJ19fbW9kX18nLCBmbG9hdChsb25ndmFsdWUpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJzAwNDIuMDAnLCAnJTA3LjJmJywgJ19fbW9kX18nLCA0MikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCcwMDQyLjAwJywgJyUwNy4yRicsICdfX21vZF9fJywgNDIpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnX19tb2RfXycpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnJShmb28pcycsICdfX21vZF9fJywgNDIpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnJXMlcycsICdfX21vZF9fJywgKDQyLCkpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnJWMnLCAnX19tb2RfXycsIChOb25lLCkpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJyUoZm9vJywgJ19fbW9kX18nLCB7fSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICclKGZvbylzICUoYmFyKXMnLCAnX19tb2RfXycsICgnZm9vJywgNDIpKQorICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJyVkJywgJ19fbW9kX18nLCAiNDIiKSAjIG5vdCBudW1lcmljCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnJWQnLCAnX19tb2RfXycsICg0MiswaikpICMgbm8gaW50L2xvbmcgY29udmVyc2lvbiBwcm92aWRlZAorCisgICAgICAgICMgYXJndW1lbnQgbmFtZXMgd2l0aCBwcm9wZXJseSBuZXN0ZWQgYnJhY2tldHMgYXJlIHN1cHBvcnRlZAorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2JhcicsICclKChmb28pKXMnLCAnX19tb2RfXycsIHsnKGZvbyknOiAnYmFyJ30pCisKKyAgICAgICAgIyAxMDAgaXMgYSBtYWdpYyBudW1iZXIgaW4gUHlVbmljb2RlX0Zvcm1hdCwgdGhpcyBmb3JjZXMgYSByZXNpemUKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEwMyonYScrJ3gnLCAnJXN4JywgJ19fbW9kX18nLCAxMDMqJ2EnKQorCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnJSpzJywgJ19fbW9kX18nLCAoJ2ZvbycsICdiYXInKSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICclMTAuKmYnLCAnX19tb2RfXycsICgnZm9vJywgNDIuKSkKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAnJTEwJywgJ19fbW9kX18nLCAoNDIsKSkKKworICAgICAgICB3aWR0aCA9IGludChfdGVzdGNhcGkuUFlfU1NJWkVfVF9NQVggKyAxKQorICAgICAgICBpZiB3aWR0aCA8PSBzeXMubWF4aW50OgorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCAnJSpzJywgJ19fbW9kX18nLCAod2lkdGgsICcnKSkKKyAgICAgICAgcHJlYyA9IGludChfdGVzdGNhcGkuSU5UX01BWCArIDEpCisgICAgICAgIGlmIHByZWMgPD0gc3lzLm1heGludDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoT3ZlcmZsb3dFcnJvciwgJyUuKmYnLCAnX19tb2RfXycsIChwcmVjLCAxLiAvIDcpKQorICAgICAgICAjIElzc3VlIDE1OTg5CisgICAgICAgIHdpZHRoID0gaW50KDEgPDwgKF90ZXN0Y2FwaS5QWV9TU0laRV9UX01BWC5iaXRfbGVuZ3RoKCkgKyAxKSkKKyAgICAgICAgaWYgd2lkdGggPD0gc3lzLm1heGludDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoT3ZlcmZsb3dFcnJvciwgJyUqcycsICdfX21vZF9fJywgKHdpZHRoLCAnJykpCisgICAgICAgIHByZWMgPSBpbnQoX3Rlc3RjYXBpLlVJTlRfTUFYICsgMSkKKyAgICAgICAgaWYgcHJlYyA8PSBzeXMubWF4aW50OgorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhPdmVyZmxvd0Vycm9yLCAnJS4qZicsICdfX21vZF9fJywgKHByZWMsIDEuIC8gNykpCisKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOiBwYXNzCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCAnYWJjJywgJ19fbW9kX18nLCBYKCkpCisgICAgICAgIGNsYXNzIFgoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ21lbG9uIGFwcGxlJywgJyUobWVsb24pcyAlKGFwcGxlKXMnLCAnX19tb2RfXycsIFgoKSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0Zm9ybWF0dGluZyhzZWxmKToKKyAgICAgICAgIyBmbG9hdCBmb3JtYXR0aW5nCisgICAgICAgIGZvciBwcmVjIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgZm9ybWF0ID0gJyUlLiVpZicgJSBwcmVjCisgICAgICAgICAgICB2YWx1ZSA9IDAuMDEKKyAgICAgICAgICAgIGZvciB4IGluIHhyYW5nZSg2MCk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDMuMTQxNTkyNjUzNTkgLyAzLjAgKiAxMC4wCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja2NhbGwoZm9ybWF0LCAiX19tb2RfXyIsIHZhbHVlKQorCisgICAgZGVmIHRlc3RfaW5wbGFjZV9yZXdyaXRlcyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHN0cmluZ3MgZG9uJ3QgY29weSBhbmQgbW9kaWZ5IGNhY2hlZCBzaW5nbGUtY2hhcmFjdGVyIHN0cmluZ3MKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhJywgJ0EnLCAnbG93ZXInKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ0EnLCAnaXN1cHBlcicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnQScsICdhJywgJ3VwcGVyJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdhJywgJ2lzbG93ZXInKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYScsICdBJywgJ3JlcGxhY2UnLCAnQScsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdBJywgJ2lzdXBwZXInKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnQScsICdhJywgJ2NhcGl0YWxpemUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBJywgJ2EnLCAnc3dhcGNhc2UnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBJywgJ2EnLCAndGl0bGUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2EnLCAnaXNsb3dlcicpCisKKyAgICBkZWYgdGVzdF9wYXJ0aXRpb24oc2VsZik6CisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgndGhpcyBpcyB0aGUgcGFyJywgJ3RpJywgJ3Rpb24gbWV0aG9kJyksCisgICAgICAgICAgICAndGhpcyBpcyB0aGUgcGFydGl0aW9uIG1ldGhvZCcsICdwYXJ0aXRpb24nLCAndGknKQorCisgICAgICAgICMgZnJvbSByYXltb25kJ3Mgb3JpZ2luYWwgc3BlY2lmaWNhdGlvbgorICAgICAgICBTID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnaHR0cCcsICc6Ly8nLCAnd3d3LnB5dGhvbi5vcmcnKSwgUywgJ3BhcnRpdGlvbicsICc6Ly8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi5vcmcnLCAnJywgJycpLCBTLCAncGFydGl0aW9uJywgJz8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCcnLCAnaHR0cDovLycsICd3d3cucHl0aG9uLm9yZycpLCBTLCAncGFydGl0aW9uJywgJ2h0dHA6Ly8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCdodHRwOi8vd3d3LnB5dGhvbi4nLCAnb3JnJywgJycpLCBTLCAncGFydGl0aW9uJywgJ29yZycpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCBTLCAncGFydGl0aW9uJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCBTLCAncGFydGl0aW9uJywgTm9uZSkKKworICAgICAgICAjIG1peGVkIHVzZSBvZiBzdHIgYW5kIHVuaWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYS9iL2MnLnBhcnRpdGlvbih1Jy8nKSwgKCdhJywgJy8nLCAnYi9jJykpCisKKyAgICBkZWYgdGVzdF9ycGFydGl0aW9uKHNlbGYpOgorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJ3RoaXMgaXMgdGhlIHJwYXJ0aScsICd0aScsICdvbiBtZXRob2QnKSwKKyAgICAgICAgICAgICd0aGlzIGlzIHRoZSBycGFydGl0aW9uIG1ldGhvZCcsICdycGFydGl0aW9uJywgJ3RpJykKKworICAgICAgICAjIGZyb20gcmF5bW9uZCdzIG9yaWdpbmFsIHNwZWNpZmljYXRpb24KKyAgICAgICAgUyA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcnCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJ2h0dHAnLCAnOi8vJywgJ3d3dy5weXRob24ub3JnJyksIFMsICdycGFydGl0aW9uJywgJzovLycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgoJycsICcnLCAnaHR0cDovL3d3dy5weXRob24ub3JnJyksIFMsICdycGFydGl0aW9uJywgJz8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoKCcnLCAnaHR0cDovLycsICd3d3cucHl0aG9uLm9yZycpLCBTLCAncnBhcnRpdGlvbicsICdodHRwOi8vJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCgnaHR0cDovL3d3dy5weXRob24uJywgJ29yZycsICcnKSwgUywgJ3JwYXJ0aXRpb24nLCAnb3JnJykKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFZhbHVlRXJyb3IsIFMsICdycGFydGl0aW9uJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVHlwZUVycm9yLCBTLCAncnBhcnRpdGlvbicsIE5vbmUpCisKKyAgICAgICAgIyBtaXhlZCB1c2Ugb2Ygc3RyIGFuZCB1bmljb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2EvYi9jJy5ycGFydGl0aW9uKHUnLycpLCAoJ2EvYicsICcvJywgJ2MnKSkKKworICAgIGRlZiB0ZXN0X25vbmVfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDExODI4CisgICAgICAgIHMgPSAnaGVsbG8nCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgyLCBzLCAnZmluZCcsICdsJywgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsIHMsICdmaW5kJywgJ2wnLCAtMiwgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDIsIHMsICdmaW5kJywgJ2wnLCBOb25lLCAtMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsIHMsICdmaW5kJywgJ2gnLCBOb25lLCBOb25lKQorCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCBzLCAncmZpbmQnLCAnbCcsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCBzLCAncmZpbmQnLCAnbCcsIC0yLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgcywgJ3JmaW5kJywgJ2wnLCBOb25lLCAtMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDAsIHMsICdyZmluZCcsICdoJywgTm9uZSwgTm9uZSkKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgcywgJ2luZGV4JywgJ2wnLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMywgcywgJ2luZGV4JywgJ2wnLCAtMiwgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDIsIHMsICdpbmRleCcsICdsJywgTm9uZSwgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCBzLCAnaW5kZXgnLCAnaCcsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDMsIHMsICdyaW5kZXgnLCAnbCcsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgzLCBzLCAncmluZGV4JywgJ2wnLCAtMiwgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDIsIHMsICdyaW5kZXgnLCAnbCcsIE5vbmUsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgcywgJ3JpbmRleCcsICdoJywgTm9uZSwgTm9uZSkKKworICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMiwgcywgJ2NvdW50JywgJ2wnLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMSwgcywgJ2NvdW50JywgJ2wnLCAtMiwgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKDEsIHMsICdjb3VudCcsICdsJywgTm9uZSwgLTIpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgwLCBzLCAnY291bnQnLCAneCcsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsIHMsICdlbmRzd2l0aCcsICdvJywgTm9uZSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsIHMsICdlbmRzd2l0aCcsICdsbycsIC0yLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgcywgJ2VuZHN3aXRoJywgJ2wnLCBOb25lLCAtMikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCBzLCAnZW5kc3dpdGgnLCAneCcsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsIHMsICdzdGFydHN3aXRoJywgJ2gnLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgcywgJ3N0YXJ0c3dpdGgnLCAnbCcsIC0yLCBOb25lKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgcywgJ3N0YXJ0c3dpdGgnLCAnaCcsIE5vbmUsIC0yKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsIHMsICdzdGFydHN3aXRoJywgJ3gnLCBOb25lLCBOb25lKQorCisgICAgZGVmIHRlc3RfZmluZF9ldGNfcmFpc2VfY29ycmVjdF9lcnJvcl9tZXNzYWdlcyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZSAxMTgyOAorICAgICAgICBzID0gJ2hlbGxvJworICAgICAgICB4ID0gJ3gnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYmZpbmRcYicsIHMuZmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xicmZpbmRcYicsIHMucmZpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYmluZGV4XGInLCBzLmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXGJyaW5kZXhcYicsIHMucmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXmNvdW50XCgnLCBzLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXnN0YXJ0c3dpdGhcKCcsIHMuc3RhcnRzd2l0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ15lbmRzd2l0aFwoJywgcy5lbmRzd2l0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKworY2xhc3MgTWl4aW5TdHJTdHJpbmdVc2VyU3RyaW5nVGVzdDoKKyAgICAjIEFkZGl0aW9uYWwgdGVzdHMgZm9yIDhiaXQgc3RyaW5ncywgaS5lLiBzdHIsIFVzZXJTdHJpbmcgYW5kCisgICAgIyB0aGUgc3RyaW5nIG1vZHVsZQorCisgICAgZGVmIHRlc3RfbWFrZXRyYW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAnJy5qb2luKG1hcChjaHIsIHhyYW5nZSgyNTYpKSkucmVwbGFjZSgnYWJjJywgJ3h5eicpLAorICAgICAgICAgICBzdHJpbmcubWFrZXRyYW5zKCdhYmMnLCAneHl6JykKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcubWFrZXRyYW5zLCAnYWJjJywgJ3h5encnKQorCisgICAgZGVmIHRlc3RfdHJhbnNsYXRlKHNlbGYpOgorICAgICAgICB0YWJsZSA9IHN0cmluZy5tYWtldHJhbnMoJ2FiYycsICd4eXonKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3h5enh5eicsICd4eXphYmNkZWYnLCAndHJhbnNsYXRlJywgdGFibGUsICdkZWYnKQorCisgICAgICAgIHRhYmxlID0gc3RyaW5nLm1ha2V0cmFucygnYScsICdBJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdBYmMnLCAnYWJjJywgJ3RyYW5zbGF0ZScsIHRhYmxlKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3h5eicsICd4eXonLCAndHJhbnNsYXRlJywgdGFibGUpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneXonLCAneHl6JywgJ3RyYW5zbGF0ZScsIHRhYmxlLCAneCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgneXgnLCAnenl6engnLCAndHJhbnNsYXRlJywgTm9uZSwgJ3onKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3p5enp4JywgJ3p5enp4JywgJ3RyYW5zbGF0ZScsIE5vbmUsICcnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3p5enp4JywgJ3p5enp4JywgJ3RyYW5zbGF0ZScsIE5vbmUpCisgICAgICAgIHNlbGYuY2hlY2tyYWlzZXMoVmFsdWVFcnJvciwgJ3h5eicsICd0cmFuc2xhdGUnLCAndG9vIHNob3J0JywgJ3N0cmlwJykKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhWYWx1ZUVycm9yLCAneHl6JywgJ3RyYW5zbGF0ZScsICd0b28gc2hvcnQnKQorCisKK2NsYXNzIE1peGluU3RyVXNlclN0cmluZ1Rlc3Q6CisgICAgIyBBZGRpdGlvbmFsIHRlc3RzIHRoYXQgb25seSB3b3JrIHdpdGgKKyAgICAjIDhiaXQgY29tcGF0aWJsZSBvYmplY3QsIGkuZS4gc3RyIGFuZCBVc2VyU3RyaW5nCisKKyAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICBkZWYgdGVzdF9lbmNvZGluZ19kZWNvZGluZyhzZWxmKToKKyAgICAgICAgICAgIGNvZGVjcyA9IFsoJ3JvdDEzJywgJ3VyeXliIGpiZXlxJyksCisgICAgICAgICAgICAgICAgICAgICAgKCdiYXNlNjQnLCAnYUdWc2JHOGdkMjl5YkdRPVxuJyksCisgICAgICAgICAgICAgICAgICAgICAgKCdoZXgnLCAnNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NCcpLAorICAgICAgICAgICAgICAgICAgICAgICgndXUnLCAnYmVnaW4gNjY2IDxkYXRhPlxuKzomNUw7JlxcQD1WXVI7JjAgXG4gXG5lbmRcbicpXQorICAgICAgICAgICAgZm9yIGVuY29kaW5nLCBkYXRhIGluIGNvZGVjczoKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwoZGF0YSwgJ2hlbGxvIHdvcmxkJywgJ2VuY29kZScsIGVuY29kaW5nKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnaGVsbG8gd29ybGQnLCBkYXRhLCAnZGVjb2RlJywgZW5jb2RpbmcpCisgICAgICAgICAgICAjIHpsaWIgaXMgb3B0aW9uYWwsIHNvIHdlIG1ha2UgdGhlIHRlc3Qgb3B0aW9uYWwgdG9vLi4uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHpsaWIKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRhdGEgPSAneFx4OWNceGNiSFx4Y2RceGM5XHhjOVcoXHhjZi9ceGNhSVx4MDFceDAwXHgxYVx4MGJceDA0XScKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwoZGF0YSwgJ2hlbGxvIHdvcmxkJywgJ2VuY29kZScsICd6bGliJykKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2hlbGxvIHdvcmxkJywgZGF0YSwgJ2RlY29kZScsICd6bGliJykKKworICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICd4eXonLCAnZGVjb2RlJywgNDIpCisgICAgICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ3h5eicsICdlbmNvZGUnLCA0MikKKworCitjbGFzcyBNaXhpblN0clVuaWNvZGVUZXN0OgorICAgICMgQWRkaXRpb25hbCB0ZXN0cyB0aGF0IG9ubHkgd29yayB3aXRoIHN0ciBhbmQgdW5pY29kZS4KKworICAgIGRlZiB0ZXN0X2J1ZzEwMDEwMTEoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGpvaW4gcmV0dXJucyBhIE5FVyBvYmplY3QgZm9yIHNpbmdsZSBpdGVtIHNlcXVlbmNlcworICAgICAgICAjIGludm9sdmluZyBhIHN1YmNsYXNzLgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgorICAgICAgICAjIENoZWNrIHRoZSBvcHRpbWlzYXRpb24gc3RpbGwgb2NjdXJzIGZvciBzdGFuZGFyZCBvYmplY3RzLgorICAgICAgICB0ID0gc2VsZi50eXBlMnRlc3QKKyAgICAgICAgY2xhc3Mgc3ViY2xhc3ModCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHMxID0gc3ViY2xhc3MoImFiY2QiKQorICAgICAgICBzMiA9IHQoKS5qb2luKFtzMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBub3QgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHMyKSBpcyB0KQorCisgICAgICAgIHMxID0gdCgiYWJjZCIpCisgICAgICAgIHMyID0gdCgpLmpvaW4oW3MxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMxIGlzIHMyKQorCisgICAgICAgICMgU2hvdWxkIGFsc28gdGVzdCBtaXhlZC10eXBlIGpvaW4uCisgICAgICAgIGlmIHQgaXMgdW5pY29kZToKKyAgICAgICAgICAgIHMxID0gc3ViY2xhc3MoImFiY2QiKQorICAgICAgICAgICAgczIgPSAiIi5qb2luKFtzMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgaXMgbm90IHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoczIpIGlzIHQpCisKKyAgICAgICAgICAgIHMxID0gdCgiYWJjZCIpCisgICAgICAgICAgICBzMiA9ICIiLmpvaW4oW3MxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBzMikKKworICAgICAgICBlbGlmIHQgaXMgc3RyOgorICAgICAgICAgICAgczEgPSBzdWJjbGFzcygiYWJjZCIpCisgICAgICAgICAgICBzMiA9IHUiIi5qb2luKFtzMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgaXMgbm90IHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoczIpIGlzIHVuaWNvZGUpICMgcHJvbW90ZXMhCisKKyAgICAgICAgICAgIHMxID0gdCgiYWJjZCIpCisgICAgICAgICAgICBzMiA9IHUiIi5qb2luKFtzMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgaXMgbm90IHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoczIpIGlzIHVuaWNvZGUpICMgcHJvbW90ZXMhCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCB0eXBlIGZvciBNaXhpblN0clVuaWNvZGVUZXN0ICVyIiAlIHQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWY5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zdHJpbmdfdGVzdHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYWY5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3N1YnByb2Nlc3NkYXRhL3NpZ2NoaWxkX2lnbm9yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjMyMGZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N1YnByb2Nlc3NkYXRhL3NpZ2NoaWxkX2lnbm9yZS5weQpAQCAtMCwwICsxLDE1IEBACitpbXBvcnQgc2lnbmFsLCBzdWJwcm9jZXNzLCBzeXMsIHRpbWUKKyMgT24gTGludXggdGhpcyBjYXVzZXMgb3Mud2FpdHBpZCB0byBmYWlsIHdpdGggT1NFcnJvciBhcyB0aGUgT1MgaGFzIGFscmVhZHkKKyMgcmVhcGVkIG91ciBjaGlsZCBwcm9jZXNzLiAgVGhlIHdhaXQoKSBwYXNzaW5nIHRoZSBPU0Vycm9yIG9uIHRvIHRoZSBjYWxsZXIKKyMgYW5kIGNhdXNpbmcgdXMgdG8gZXhpdCB3aXRoIGFuIGVycm9yIGlzIHdoYXQgd2UgYXJlIHRlc3RpbmcgYWdhaW5zdC4KK3NpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0NITEQsIHNpZ25hbC5TSUdfSUdOKQorc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICctYycsICdwcmludCgiYWxiYXRyb3NzIiknXSkud2FpdCgpCisjIEFsc28gZW5zdXJlIHBvbGwoKSBoYW5kbGVzIGFuIGVycm5vLkVDSElMRCBhcHByb3ByaWF0ZWx5LgorcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAnLWMnLCAncHJpbnQoImFsYmF0cm9zcyIpJ10pCitudW1fcG9sbHMgPSAwCit3aGlsZSBwLnBvbGwoKSBpcyBOb25lOgorICAgICMgV2FpdGluZyBmb3IgdGhlIHByb2Nlc3MgdG8gZmluaXNoLgorICAgIHRpbWUuc2xlZXAoMC4wMSkgICMgQXZvaWQgYmVpbmcgYSBDUFUgYnVzeSBsb29wLgorICAgIG51bV9wb2xscyArPSAxCisgICAgaWYgbnVtX3BvbGxzID4gMzAwMDoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdwb2xsIHNob3VsZCBoYXZlIHJldHVybmVkIDAgd2l0aGluIDMwIHNlY29uZHMnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3N1YnByb2Nlc3NkYXRhL3NpZ2NoaWxkX2lnbm9yZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWI3M2FhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N1YnByb2Nlc3NkYXRhL3NpZ2NoaWxkX2lnbm9yZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3N1YnByb2Nlc3NkYXRhL3NpZ2NoaWxkX2lnbm9yZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3VicHJvY2Vzc2RhdGEvc2lnY2hpbGRfaWdub3JlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWI3M2FhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3N1YnByb2Nlc3NkYXRhL3NpZ2NoaWxkX2lnbm9yZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3N5bWxpbmtfc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxZDBmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHkKQEAgLTAsMCArMSwxMDAgQEAKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcGxhdGZvcm0KKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOCisKK2RlZiBjYW5fc3ltbGluaygpOgorICAgICMgY2FjaGUgdGhlIHJlc3VsdCBpbiBjYW5fc3ltbGluay5wcmV2X3ZhbAorICAgIHByZXZfdmFsID0gZ2V0YXR0cihjYW5fc3ltbGluaywgJ3ByZXZfdmFsJywgTm9uZSkKKyAgICBpZiBwcmV2X3ZhbCBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIHByZXZfdmFsCisgICAgc3ltbGlua19wYXRoID0gVEVTVEZOICsgImNhbl9zeW1saW5rIgorICAgIHRyeToKKyAgICAgICAgc3ltbGluayhURVNURk4sIHN5bWxpbmtfcGF0aCkKKyAgICAgICAgY2FuID0gVHJ1ZQorICAgIGV4Y2VwdCAoT1NFcnJvciwgTm90SW1wbGVtZW50ZWRFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBjYW4gPSBGYWxzZQorICAgIGVsc2U6CisgICAgICAgIG9zLnJlbW92ZShzeW1saW5rX3BhdGgpCisgICAgY2FuX3N5bWxpbmsucHJldl92YWwgPSBjYW4KKyAgICByZXR1cm4gY2FuCisKK2RlZiBza2lwX3VubGVzc19zeW1saW5rKHRlc3QpOgorICAgICIiIlNraXAgZGVjb3JhdG9yIGZvciB0ZXN0cyB0aGF0IHJlcXVpcmUgZnVuY3Rpb25hbCBzeW1saW5rIiIiCisgICAgb2sgPSBjYW5fc3ltbGluaygpCisgICAgbXNnID0gIlJlcXVpcmVzIGZ1bmN0aW9uYWwgc3ltbGluayBpbXBsZW1lbnRhdGlvbiIKKyAgICByZXR1cm4gdGVzdCBpZiBvayBlbHNlIHVuaXR0ZXN0LnNraXAobXNnKSh0ZXN0KQorCitkZWYgX3N5bWxpbmtfd2luMzIodGFyZ2V0LCBsaW5rLCB0YXJnZXRfaXNfZGlyZWN0b3J5PUZhbHNlKToKKyAgICAiIiIKKyAgICBDdHlwZXMgc3ltbGluayBpbXBsZW1lbnRhdGlvbiBzaW5jZSBQeXRob24gZG9lc24ndCBzdXBwb3J0CisgICAgc3ltbGlua3MgaW4gd2luZG93cyB5ZXQuIEJvcnJvd2VkIGZyb20gamFyYWNvLndpbmRvd3MgcHJvamVjdC4KKyAgICAiIiIKKyAgICBpbXBvcnQgY3R5cGVzLndpbnR5cGVzCisgICAgQ3JlYXRlU3ltYm9saWNMaW5rID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5DcmVhdGVTeW1ib2xpY0xpbmtXCisgICAgQ3JlYXRlU3ltYm9saWNMaW5rLmFyZ3R5cGVzID0gKAorICAgICAgICBjdHlwZXMud2ludHlwZXMuTFBXU1RSLAorICAgICAgICBjdHlwZXMud2ludHlwZXMuTFBXU1RSLAorICAgICAgICBjdHlwZXMud2ludHlwZXMuRFdPUkQsCisgICAgICAgICkKKyAgICBDcmVhdGVTeW1ib2xpY0xpbmsucmVzdHlwZSA9IGN0eXBlcy53aW50eXBlcy5CT09MRUFOCisKKyAgICBkZWYgZm9ybWF0X3N5c3RlbV9tZXNzYWdlKGVycm5vKToKKyAgICAgICAgIiIiCisgICAgICAgIENhbGwgRm9ybWF0TWVzc2FnZSB3aXRoIGEgc3lzdGVtIGVycm9yIG51bWJlciB0byByZXRyaWV2ZQorICAgICAgICB0aGUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgZmlyc3Qgc29tZSBmbGFncyB1c2VkIGJ5IEZvcm1hdE1lc3NhZ2VXCisgICAgICAgIEFMTE9DQVRFX0JVRkZFUiA9IDB4MTAwCisgICAgICAgIEFSR1VNRU5UX0FSUkFZID0gMHgyMDAwCisgICAgICAgIEZST01fSE1PRFVMRSA9IDB4ODAwCisgICAgICAgIEZST01fU1RSSU5HID0gMHg0MDAKKyAgICAgICAgRlJPTV9TWVNURU0gPSAweDEwMDAKKyAgICAgICAgSUdOT1JFX0lOU0VSVFMgPSAweDIwMAorCisgICAgICAgICMgTGV0IEZvcm1hdE1lc3NhZ2VXIGFsbG9jYXRlIHRoZSBidWZmZXIgKHdlJ2xsIGZyZWUgaXQgYmVsb3cpCisgICAgICAgICMgQWxzbywgbGV0IGl0IGtub3cgd2Ugd2FudCBhIHN5c3RlbSBlcnJvciBtZXNzYWdlLgorICAgICAgICBmbGFncyA9IEFMTE9DQVRFX0JVRkZFUiB8IEZST01fU1lTVEVNCisgICAgICAgIHNvdXJjZSA9IE5vbmUKKyAgICAgICAgbWVzc2FnZV9pZCA9IGVycm5vCisgICAgICAgIGxhbmd1YWdlX2lkID0gMAorICAgICAgICByZXN1bHRfYnVmZmVyID0gY3R5cGVzLndpbnR5cGVzLkxQV1NUUigpCisgICAgICAgIGJ1ZmZlcl9zaXplID0gMAorICAgICAgICBhcmd1bWVudHMgPSBOb25lCisgICAgICAgIGJ5dGVzID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5Gb3JtYXRNZXNzYWdlVygKKyAgICAgICAgICAgIGZsYWdzLAorICAgICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgbWVzc2FnZV9pZCwKKyAgICAgICAgICAgIGxhbmd1YWdlX2lkLAorICAgICAgICAgICAgY3R5cGVzLmJ5cmVmKHJlc3VsdF9idWZmZXIpLAorICAgICAgICAgICAgYnVmZmVyX3NpemUsCisgICAgICAgICAgICBhcmd1bWVudHMsCisgICAgICAgICAgICApCisgICAgICAgICMgbm90ZSB0aGUgZm9sbG93aW5nIHdpbGwgY2F1c2UgYW4gaW5maW5pdGUgbG9vcCBpZiBHZXRMYXN0RXJyb3IKKyAgICAgICAgIyAgcmVwZWF0ZWRseSByZXR1cm5zIGFuIGVycm9yIHRoYXQgY2Fubm90IGJlIGZvcm1hdHRlZCwgYWx0aG91Z2gKKyAgICAgICAgIyAgdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgaGFuZGxlX25vbnplcm9fc3VjY2VzcyhieXRlcykKKyAgICAgICAgbWVzc2FnZSA9IHJlc3VsdF9idWZmZXIudmFsdWUKKyAgICAgICAgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5Mb2NhbEZyZWUocmVzdWx0X2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UKKworICAgIGRlZiBoYW5kbGVfbm9uemVyb19zdWNjZXNzKHJlc3VsdCk6CisgICAgICAgIGlmIHJlc3VsdCA9PSAwOgorICAgICAgICAgICAgdmFsdWUgPSBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldExhc3RFcnJvcigpCisgICAgICAgICAgICBzdHJlcnJvciA9IGZvcm1hdF9zeXN0ZW1fbWVzc2FnZSh2YWx1ZSkKKyAgICAgICAgICAgIHJhaXNlIFdpbmRvd3NFcnJvcih2YWx1ZSwgc3RyZXJyb3IpCisKKyAgICB0YXJnZXRfaXNfZGlyZWN0b3J5ID0gdGFyZ2V0X2lzX2RpcmVjdG9yeSBvciBvcy5wYXRoLmlzZGlyKHRhcmdldCkKKyAgICBoYW5kbGVfbm9uemVyb19zdWNjZXNzKENyZWF0ZVN5bWJvbGljTGluayhsaW5rLCB0YXJnZXQsIHRhcmdldF9pc19kaXJlY3RvcnkpKQorCitzeW1saW5rID0gb3Muc3ltbGluayBpZiBoYXNhdHRyKG9zLCAnc3ltbGluaycpIGVsc2UgKAorICAgIF9zeW1saW5rX3dpbjMyIGlmIHBsYXRmb3JtLnN5c3RlbSgpID09ICdXaW5kb3dzJyBlbHNlIE5vbmUKKykKKworZGVmIHJlbW92ZV9zeW1saW5rKG5hbWUpOgorICAgICMgT24gV2luZG93cywgdG8gcmVtb3ZlIGEgZGlyZWN0b3J5IHN5bWxpbmssIG9uZSBtdXN0IHVzZSBybWRpcgorICAgIHRyeToKKyAgICAgICAgb3Mucm1kaXIobmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgb3MucmVtb3ZlKG5hbWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3ltbGlua19zdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWVmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3ltbGlua19zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvc3ltbGlua19zdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC9zeW1saW5rX3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3OWVmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvc3ltbGlua19zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9NaW1lV3JpdGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjY2MzZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weQpAQCAtMCwwICsxLDI5MiBAQAorIiIiVGVzdCBwcm9ncmFtIGZvciBNaW1lV3JpdGVyIG1vZHVsZS4KKworVGhlIHRlc3QgcHJvZ3JhbSB3YXMgdG9vIGJpZyB0byBjb21mb3J0YWJseSBmaXQgaW4gdGhlIE1pbWVXcml0ZXIKK2NsYXNzLCBzbyBpdCdzIGhlcmUgaW4gaXRzIG93biBmaWxlLgorCitUaGlzIHNob3VsZCBnZW5lcmF0ZSBCYXJyeSdzIGV4YW1wbGUsIG1vZHVsbyBzb21lIHF1b3RlcyBhbmQgbmV3bGluZXMuCisKKyIiIgorCitpbXBvcnQgdW5pdHRlc3QsIFN0cmluZ0lPCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKKworaW1wb3J0X21vZHVsZSgiTWltZVdyaXRlciIsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2Zyb20gTWltZVdyaXRlciBpbXBvcnQgTWltZVdyaXRlcgorCitTRUxMRVIgPSAnJydcCitJTlRFUkZBQ0UgU2VsbGVyLTE7CisKK1RZUEUgU2VsbGVyID0gT0JKRUNUCisgICAgRE9DVU1FTlRBVElPTiAiQSBzaW1wbGUgU2VsbGVyIGludGVyZmFjZSB0byB0ZXN0IElMVSIKKyAgICBNRVRIT0RTCisgICAgICAgICAgICBwcmljZSgpOklOVEVHRVIsCisgICAgRU5EOworJycnCisKK0JVWUVSID0gJycnXAorY2xhc3MgQnV5ZXI6CisgICAgZGVmIF9fc2V0dXBfXyhzZWxmLCBtYXhwcmljZSk6CisgICAgICAgIHNlbGYuX21heHByaWNlID0gbWF4cHJpY2UKKworICAgIGRlZiBfX21haW5fXyhzZWxmLCBrb3MpOgorICAgICAgICAiIiJFbnRyeSBwb2ludCB1cG9uIGFycml2YWwgYXQgYSBuZXcgS09TLiIiIgorICAgICAgICBicm9rZXIgPSBrb3MuYnJva2VyKCkKKyAgICAgICAgIyBCNCA9PSBCYXJyeSdzIEJpZyBCYXNzIEJ1c2luZXNzIDotKQorICAgICAgICBzZWxsZXIgPSBicm9rZXIubG9va3VwKCdTZWxsZXJfMS5TZWxsZXInLCAnQjQnKQorICAgICAgICBpZiBzZWxsZXI6CisgICAgICAgICAgICBwcmljZSA9IHNlbGxlci5wcmljZSgpCisgICAgICAgICAgICBwcmludCAnU2VsbGVyIHdhbnRzICQnLCBwcmljZSwgJy4uLiAnCisgICAgICAgICAgICBpZiBwcmljZSA+IHNlbGYuX21heHByaWNlOgorICAgICAgICAgICAgICAgIHByaW50ICd0b28gbXVjaCEnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJJJ2xsIHRha2UgaXQhIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgJ25vIHNlbGxlciBmb3VuZCBoZXJlJworJycnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRG9uJ3QgYXNrIHdoeSB0aGlzIGNvbW1lbnQgaXMgaGVyZQorCitTVEFURSA9ICcnJ1wKKyMgaW5zdGFudGlhdGUgYSBidXllciBpbnN0YW5jZSBhbmQgcHV0IGl0IGluIGEgbWFnaWMgcGxhY2UgZm9yIHRoZSBLT1MKKyMgdG8gZmluZC4KK19fa3BfXyA9IEJ1eWVyKCkKK19fa3BfXy5fX3NldHVwX18oNTAwKQorJycnCisKK1NJTVBMRV9NRVRBREFUQSA9IFsKKyAgICAgICAgKCJJbnRlcnByZXRlciIsICJweXRob24iKSwKKyAgICAgICAgKCJJbnRlcnByZXRlci1WZXJzaW9uIiwgIjEuMyIpLAorICAgICAgICAoIk93bmVyLU5hbWUiLCAiQmFycnkgV2Fyc2F3IiksCisgICAgICAgICgiT3duZXItUmVuZGV6dm91cyIsICJid2Fyc2F3QGNucmkucmVzdG9uLnZhLnVzIiksCisgICAgICAgICgiSG9tZS1LU1MiLCAia3NzLmNucmkucmVzdG9uLnZhLnVzIiksCisgICAgICAgICgiSWRlbnRpZmllciIsICJoZGw6Ly9jbnJpLmtzcy9teV9maXJzdF9rbm93Ym90IiksCisgICAgICAgICgiTGF1bmNoLURhdGUiLCAiTW9uIEZlYiAxMiAxNjozOTowMyBFU1QgMTk5NiIpLAorICAgICAgICBdCisKK0NPTVBMRVhfTUVUQURBVEEgPSBbCisgICAgICAgICgiTWV0YWRhdGEtVHlwZSIsICJjb21wbGV4IiksCisgICAgICAgICgiTWV0YWRhdGEtS2V5IiwgImNvbm5lY3Rpb24iKSwKKyAgICAgICAgKCJBY2Nlc3MiLCAicmVhZC1vbmx5IiksCisgICAgICAgICgiQ29ubmVjdGlvbi1EZXNjcmlwdGlvbiIsICJCYXJyeSdzIEJpZyBCYXNzIEJ1c2luZXNzIiksCisgICAgICAgICgiQ29ubmVjdGlvbi1JZCIsICJCNCIpLAorICAgICAgICAoIkNvbm5lY3Rpb24tRGlyZWN0aW9uIiwgImNsaWVudCIpLAorICAgICAgICBdCisKK0VYVEVSTkFMX01FVEFEQVRBID0gWworICAgICAgICAoIk1ldGFkYXRhLVR5cGUiLCAiY29tcGxleCIpLAorICAgICAgICAoIk1ldGFkYXRhLUtleSIsICJnZW5lcmljLWludGVyZmFjZSIpLAorICAgICAgICAoIkFjY2VzcyIsICJyZWFkLW9ubHkiKSwKKyAgICAgICAgKCJDb25uZWN0aW9uLURlc2NyaXB0aW9uIiwgIkdlbmVyaWMgSW50ZXJmYWNlIGZvciBBbGwgS25vd2JvdHMiKSwKKyAgICAgICAgKCJDb25uZWN0aW9uLUlkIiwgImdlbmVyaWMta3AiKSwKKyAgICAgICAgKCJDb25uZWN0aW9uLURpcmVjdGlvbiIsICJjbGllbnQiKSwKKyAgICAgICAgXQorCisKK09VVFBVVCA9ICcnJ1wKK0Zyb206IGJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMKK0RhdGU6IE1vbiBGZWIgMTIgMTc6MjE6NDggRVNUIDE5OTYKK1RvOiBrc3Mtc3VibWl0QGNucmkucmVzdG9uLnZhLnVzCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQva25vd2JvdDsKKyAgICBib3VuZGFyeT0iODAxc3BhbTk5OSI7CisgICAgdmVyc2lvbj0iMC4xIgorCitUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LgorCistLTgwMXNwYW05OTkKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2tub3dib3QtbWV0YWRhdGE7CisgICAgYm91bmRhcnk9IjgwMnNwYW05OTkiCisKKworLS04MDJzcGFtOTk5CitDb250ZW50LVR5cGU6IG1lc3NhZ2UvcmZjODIyCitLUC1NZXRhZGF0YS1UeXBlOiBzaW1wbGUKK0tQLUFjY2VzczogcmVhZC1vbmx5CisKK0tQTUQtSW50ZXJwcmV0ZXI6IHB5dGhvbgorS1BNRC1JbnRlcnByZXRlci1WZXJzaW9uOiAxLjMKK0tQTUQtT3duZXItTmFtZTogQmFycnkgV2Fyc2F3CitLUE1ELU93bmVyLVJlbmRlenZvdXM6IGJ3YXJzYXdAY25yaS5yZXN0b24udmEudXMKK0tQTUQtSG9tZS1LU1M6IGtzcy5jbnJpLnJlc3Rvbi52YS51cworS1BNRC1JZGVudGlmaWVyOiBoZGw6Ly9jbnJpLmtzcy9teV9maXJzdF9rbm93Ym90CitLUE1ELUxhdW5jaC1EYXRlOiBNb24gRmViIDEyIDE2OjM5OjAzIEVTVCAxOTk2CisKKy0tODAyc3BhbTk5OQorQ29udGVudC1UeXBlOiB0ZXh0L2lzbAorS1AtTWV0YWRhdGEtVHlwZTogY29tcGxleAorS1AtTWV0YWRhdGEtS2V5OiBjb25uZWN0aW9uCitLUC1BY2Nlc3M6IHJlYWQtb25seQorS1AtQ29ubmVjdGlvbi1EZXNjcmlwdGlvbjogQmFycnkncyBCaWcgQmFzcyBCdXNpbmVzcworS1AtQ29ubmVjdGlvbi1JZDogQjQKK0tQLUNvbm5lY3Rpb24tRGlyZWN0aW9uOiBjbGllbnQKKworSU5URVJGQUNFIFNlbGxlci0xOworCitUWVBFIFNlbGxlciA9IE9CSkVDVAorICAgIERPQ1VNRU5UQVRJT04gIkEgc2ltcGxlIFNlbGxlciBpbnRlcmZhY2UgdG8gdGVzdCBJTFUiCisgICAgTUVUSE9EUworICAgICAgICAgICAgcHJpY2UoKTpJTlRFR0VSLAorICAgIEVORDsKKworLS04MDJzcGFtOTk5CitDb250ZW50LVR5cGU6IG1lc3NhZ2UvZXh0ZXJuYWwtYm9keTsKKyAgICBhY2Nlc3MtdHlwZT0iVVJMIjsKKyAgICBVUkw9ImhkbDovL2Nucmkua3NzL2dlbmVyaWMta25vd2JvdCIKKworQ29udGVudC1UeXBlOiB0ZXh0L2lzbAorS1AtTWV0YWRhdGEtVHlwZTogY29tcGxleAorS1AtTWV0YWRhdGEtS2V5OiBnZW5lcmljLWludGVyZmFjZQorS1AtQWNjZXNzOiByZWFkLW9ubHkKK0tQLUNvbm5lY3Rpb24tRGVzY3JpcHRpb246IEdlbmVyaWMgSW50ZXJmYWNlIGZvciBBbGwgS25vd2JvdHMKK0tQLUNvbm5lY3Rpb24tSWQ6IGdlbmVyaWMta3AKK0tQLUNvbm5lY3Rpb24tRGlyZWN0aW9uOiBjbGllbnQKKworCistLTgwMnNwYW05OTktLQorCistLTgwMXNwYW05OTkKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2tub3dib3QtY29kZTsKKyAgICBib3VuZGFyeT0iODAzc3BhbTk5OSIKKworCistLTgwM3NwYW05OTkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorS1AtTW9kdWxlLU5hbWU6IEJ1eWVyS1AKKworY2xhc3MgQnV5ZXI6CisgICAgZGVmIF9fc2V0dXBfXyhzZWxmLCBtYXhwcmljZSk6CisgICAgICAgIHNlbGYuX21heHByaWNlID0gbWF4cHJpY2UKKworICAgIGRlZiBfX21haW5fXyhzZWxmLCBrb3MpOgorICAgICAgICAiIiJFbnRyeSBwb2ludCB1cG9uIGFycml2YWwgYXQgYSBuZXcgS09TLiIiIgorICAgICAgICBicm9rZXIgPSBrb3MuYnJva2VyKCkKKyAgICAgICAgIyBCNCA9PSBCYXJyeSdzIEJpZyBCYXNzIEJ1c2luZXNzIDotKQorICAgICAgICBzZWxsZXIgPSBicm9rZXIubG9va3VwKCdTZWxsZXJfMS5TZWxsZXInLCAnQjQnKQorICAgICAgICBpZiBzZWxsZXI6CisgICAgICAgICAgICBwcmljZSA9IHNlbGxlci5wcmljZSgpCisgICAgICAgICAgICBwcmludCAnU2VsbGVyIHdhbnRzICQnLCBwcmljZSwgJy4uLiAnCisgICAgICAgICAgICBpZiBwcmljZSA+IHNlbGYuX21heHByaWNlOgorICAgICAgICAgICAgICAgIHByaW50ICd0b28gbXVjaCEnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50ICJJJ2xsIHRha2UgaXQhIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgJ25vIHNlbGxlciBmb3VuZCBoZXJlJworCistLTgwM3NwYW05OTktLQorCistLTgwMXNwYW05OTkKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2tub3dib3Qtc3RhdGU7CisgICAgYm91bmRhcnk9IjgwNHNwYW05OTkiCitLUC1NYWluLU1vZHVsZTogbWFpbgorCisKKy0tODA0c3BhbTk5OQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitLUC1Nb2R1bGUtTmFtZTogbWFpbgorCisjIGluc3RhbnRpYXRlIGEgYnV5ZXIgaW5zdGFuY2UgYW5kIHB1dCBpdCBpbiBhIG1hZ2ljIHBsYWNlIGZvciB0aGUgS09TCisjIHRvIGZpbmQuCitfX2twX18gPSBCdXllcigpCitfX2twX18uX19zZXR1cF9fKDUwMCkKKworLS04MDRzcGFtOTk5LS0KKworLS04MDFzcGFtOTk5LS0KKycnJworCitjbGFzcyBNaW1ld3JpdGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgYnVmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorCisgICAgICAgICMgVG9wbGV2ZWwgaGVhZGVycworCisgICAgICAgIHRvcGxldmVsID0gTWltZVdyaXRlcihidWYpCisgICAgICAgIHRvcGxldmVsLmFkZGhlYWRlcigiRnJvbSIsICJid2Fyc2F3QGNucmkucmVzdG9uLnZhLnVzIikKKyAgICAgICAgdG9wbGV2ZWwuYWRkaGVhZGVyKCJEYXRlIiwgIk1vbiBGZWIgMTIgMTc6MjE6NDggRVNUIDE5OTYiKQorICAgICAgICB0b3BsZXZlbC5hZGRoZWFkZXIoIlRvIiwgImtzcy1zdWJtaXRAY25yaS5yZXN0b24udmEudXMiKQorICAgICAgICB0b3BsZXZlbC5hZGRoZWFkZXIoIk1JTUUtVmVyc2lvbiIsICIxLjAiKQorCisgICAgICAgICMgVG9wbGV2ZWwgYm9keSBwYXJ0cworCisgICAgICAgIGYgPSB0b3BsZXZlbC5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3QiLCAiODAxc3BhbTk5OSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWygidmVyc2lvbiIsICIwLjEiKV0sIHByZWZpeD0wKQorICAgICAgICBmLndyaXRlKCJUaGlzIGlzIGEgbXVsdGktcGFydCBtZXNzYWdlIGluIE1JTUUgZm9ybWF0LlxuIikKKworICAgICAgICAjIEZpcnN0IHRvcGxldmVsIGJvZHkgcGFydDogbWV0YWRhdGEKKworICAgICAgICBtZCA9IHRvcGxldmVsLm5leHRwYXJ0KCkKKyAgICAgICAgbWQuc3RhcnRtdWx0aXBhcnRib2R5KCJrbm93Ym90LW1ldGFkYXRhIiwgIjgwMnNwYW05OTkiKQorCisgICAgICAgICMgTWV0YWRhdGEgcGFydCAxCisKKyAgICAgICAgbWQxID0gbWQubmV4dHBhcnQoKQorICAgICAgICBtZDEuYWRkaGVhZGVyKCJLUC1NZXRhZGF0YS1UeXBlIiwgInNpbXBsZSIpCisgICAgICAgIG1kMS5hZGRoZWFkZXIoIktQLUFjY2VzcyIsICJyZWFkLW9ubHkiKQorICAgICAgICBtID0gTWltZVdyaXRlcihtZDEuc3RhcnRib2R5KCJtZXNzYWdlL3JmYzgyMiIpKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBTSU1QTEVfTUVUQURBVEE6CisgICAgICAgICAgICBtLmFkZGhlYWRlcigiS1BNRC0iICsga2V5LCB2YWx1ZSkKKyAgICAgICAgbS5mbHVzaGhlYWRlcnMoKQorICAgICAgICBkZWwgbWQxCisKKyAgICAgICAgIyBNZXRhZGF0YSBwYXJ0IDIKKworICAgICAgICBtZDIgPSBtZC5uZXh0cGFydCgpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIENPTVBMRVhfTUVUQURBVEE6CisgICAgICAgICAgICBtZDIuYWRkaGVhZGVyKCJLUC0iICsga2V5LCB2YWx1ZSkKKyAgICAgICAgZiA9IG1kMi5zdGFydGJvZHkoInRleHQvaXNsIikKKyAgICAgICAgZi53cml0ZShTRUxMRVIpCisgICAgICAgIGRlbCBtZDIKKworICAgICAgICAjIE1ldGFkYXRhIHBhcnQgMworCisgICAgICAgIG1kMyA9IG1kLm5leHRwYXJ0KCkKKyAgICAgICAgZiA9IG1kMy5zdGFydGJvZHkoIm1lc3NhZ2UvZXh0ZXJuYWwtYm9keSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoImFjY2Vzcy10eXBlIiwgIlVSTCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJVUkwiLCAiaGRsOi8vY25yaS5rc3MvZ2VuZXJpYy1rbm93Ym90IildKQorICAgICAgICBtID0gTWltZVdyaXRlcihmKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBFWFRFUk5BTF9NRVRBREFUQToKKyAgICAgICAgICAgIG1kMy5hZGRoZWFkZXIoIktQLSIgKyBrZXksIHZhbHVlKQorICAgICAgICBtZDMuc3RhcnRib2R5KCJ0ZXh0L2lzbCIpCisgICAgICAgICMgUGhhbnRvbSBib2R5IGRvZXNuJ3QgbmVlZCB0byBiZSB3cml0dGVuCisKKyAgICAgICAgbWQubGFzdHBhcnQoKQorCisgICAgICAgICMgU2Vjb25kIHRvcGxldmVsIGJvZHkgcGFydDogY29kZQorCisgICAgICAgIGNvZGUgPSB0b3BsZXZlbC5uZXh0cGFydCgpCisgICAgICAgIGNvZGUuc3RhcnRtdWx0aXBhcnRib2R5KCJrbm93Ym90LWNvZGUiLCAiODAzc3BhbTk5OSIpCisKKyAgICAgICAgIyBDb2RlOiBidXllciBwcm9ncmFtIHNvdXJjZQorCisgICAgICAgIGJ1eWVyID0gY29kZS5uZXh0cGFydCgpCisgICAgICAgIGJ1eWVyLmFkZGhlYWRlcigiS1AtTW9kdWxlLU5hbWUiLCAiQnV5ZXJLUCIpCisgICAgICAgIGYgPSBidXllci5zdGFydGJvZHkoInRleHQvcGxhaW4iKQorICAgICAgICBmLndyaXRlKEJVWUVSKQorCisgICAgICAgIGNvZGUubGFzdHBhcnQoKQorCisgICAgICAgICMgVGhpcmQgdG9wbGV2ZWwgYm9keSBwYXJ0OiBzdGF0ZQorCisgICAgICAgIHN0YXRlID0gdG9wbGV2ZWwubmV4dHBhcnQoKQorICAgICAgICBzdGF0ZS5hZGRoZWFkZXIoIktQLU1haW4tTW9kdWxlIiwgIm1haW4iKQorICAgICAgICBzdGF0ZS5zdGFydG11bHRpcGFydGJvZHkoImtub3dib3Qtc3RhdGUiLCAiODA0c3BhbTk5OSIpCisKKyAgICAgICAgIyBTdGF0ZTogYSBidW5jaCBvZiBhc3NpZ25tZW50cworCisgICAgICAgIHN0ID0gc3RhdGUubmV4dHBhcnQoKQorICAgICAgICBzdC5hZGRoZWFkZXIoIktQLU1vZHVsZS1OYW1lIiwgIm1haW4iKQorICAgICAgICBmID0gc3Quc3RhcnRib2R5KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgZi53cml0ZShTVEFURSkKKworICAgICAgICBzdGF0ZS5sYXN0cGFydCgpCisKKyAgICAgICAgIyBFbmQgdG9wbGV2ZWwgYm9keSBwYXJ0cworCisgICAgICAgIHRvcGxldmVsLmxhc3RwYXJ0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5nZXR2YWx1ZSgpLCBPVVRQVVQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTWltZXdyaXRlclRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X01pbWVXcml0ZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiN2U3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X01pbWVXcml0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X01pbWVXcml0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfTWltZVdyaXRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJiN2U3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X01pbWVXcml0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1NpbXBsZUhUVFBTZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9TaW1wbGVIVFRQU2VydmVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWM4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9TaW1wbGVIVFRQU2VydmVyLnB5CkBAIC0wLDAgKzEsNDEgQEAKKyIiIgorVGhlc2UgdGVzdHMgb25seSBjaGVjayB1cmwgcGFyc2luZyBmb3Igbm93LgorV2UgZG9uJ3Qgd2FudCB0byByZXF1aXJlIHRoZSAnbmV0d29yaycgcmVzb3VyY2UuCisiIiIKKworaW1wb3J0IG9zLCB1bml0dGVzdAorZnJvbSBTaW1wbGVIVFRQU2VydmVyIGltcG9ydCBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgU29ja2V0bGVzc1JlcXVlc3RIYW5kbGVyIChTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiIFRlc3QgdXJsIHBhcnNpbmcgIiIiCisgICAgZGVmIHNldFVwIChzZWxmKToKKyAgICAgICAgc2VsZi50cmFuc2xhdGVkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgc2VsZi50cmFuc2xhdGVkID0gb3MucGF0aC5qb2luKHNlbGYudHJhbnNsYXRlZCwgJ2ZpbGVuYW1lJykKKyAgICAgICAgc2VsZi5oYW5kbGVyID0gU29ja2V0bGVzc1JlcXVlc3RIYW5kbGVyICgpCisKKyAgICBkZWYgdGVzdF9xdWVyeUFyZ3VtZW50cyAoc2VsZik6CisgICAgICAgIHBhdGggPSBzZWxmLmhhbmRsZXIudHJhbnNsYXRlX3BhdGggKCcvZmlsZW5hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsIChwYXRoLCBzZWxmLnRyYW5zbGF0ZWQpCisgICAgICAgIHBhdGggPSBzZWxmLmhhbmRsZXIudHJhbnNsYXRlX3BhdGggKCcvZmlsZW5hbWU/Zm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwgKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCAoJy9maWxlbmFtZT9hPWImc3BhbT1lZ2dzI3pvdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwgKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKworICAgIGRlZiB0ZXN0X3N0YXJ0V2l0aERvdWJsZVNsYXNoIChzZWxmKToKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCAoJy8vZmlsZW5hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsIChwYXRoLCBzZWxmLnRyYW5zbGF0ZWQpCisgICAgICAgIHBhdGggPSBzZWxmLmhhbmRsZXIudHJhbnNsYXRlX3BhdGggKCcvL2ZpbGVuYW1lP2Zvbz1iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsIChwYXRoLCBzZWxmLnRyYW5zbGF0ZWQpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1NpbXBsZUhUVFBTZXJ2ZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU2ltcGxlSFRUUFNlcnZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MDBiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1NpbXBsZUhUVFBTZXJ2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1NpbXBsZUhUVFBTZXJ2ZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU2ltcGxlSFRUUFNlcnZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3MDBiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1NpbXBsZUhUVFBTZXJ2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1N0cmluZ0lPLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJmMzA3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CkBAIC0wLDAgKzEsMjI0IEBACisjIFRlc3RzIFN0cmluZ0lPIGFuZCBjU3RyaW5nSU8KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBjU3RyaW5nSU8KK2ltcG9ydCB0eXBlcworaW1wb3J0IGFycmF5CitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIFRlc3RHZW5lcmljU3RyaW5nSU8odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgdXNlIGEgY2xhc3MgdmFyaWFibGUgTU9EVUxFIHRvIGRlZmluZSB3aGljaCBtb2R1bGUgaXMgYmVpbmcgdGVzdGVkCisKKyAgICAjIExpbmUgb2YgZGF0YSB0byB0ZXN0IGFzIHN0cmluZworICAgIF9saW5lID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVohJworCisgICAgIyBDb25zdHJ1Y3RvciB0byB1c2UgZm9yIHRoZSB0ZXN0IGRhdGEgKC5fbGluZSBpcyBwYXNzZWQgdG8gdGhpcworICAgICMgY29uc3RydWN0b3IpCisgICAgY29uc3RydWN0b3IgPSBzdHIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fbGluZXMgPSBzZWxmLmNvbnN0cnVjdG9yKChzZWxmLl9saW5lICsgJ1xuJykgKiA1KQorICAgICAgICBzZWxmLl9mcCA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKHNlbGYuX2xpbmVzKQorCisgICAgZGVmIHRlc3RfcmVhZHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuX2ZwLnNlZWspCisgICAgICAgIGVxKHNlbGYuX2ZwLnJlYWQoMTApLCBzZWxmLl9saW5lWzoxMF0pCisgICAgICAgIGVxKHNlbGYuX2ZwLnJlYWQoMCksICcnKQorICAgICAgICBlcShzZWxmLl9mcC5yZWFkbGluZSgwKSwgJycpCisgICAgICAgIGVxKHNlbGYuX2ZwLnJlYWRsaW5lKCksIHNlbGYuX2xpbmVbMTA6XSArICdcbicpCisgICAgICAgIGVxKGxlbihzZWxmLl9mcC5yZWFkbGluZXMoNjApKSwgMikKKyAgICAgICAgc2VsZi5fZnAuc2VlaygwKQorICAgICAgICBlcShzZWxmLl9mcC5yZWFkbGluZSgtMSksIHNlbGYuX2xpbmUgKyAnXG4nKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYuc2VlaykKKyAgICAgICAgZi53cml0ZShzZWxmLl9saW5lWzo2XSkKKyAgICAgICAgZi5zZWVrKDMpCisgICAgICAgIGYud3JpdGUoc2VsZi5fbGluZVsyMDoyNl0pCisgICAgICAgIGYud3JpdGUoc2VsZi5fbGluZVs1Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXR2YWx1ZSgpLCAnYWJjdXZ3eHl6IScpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBmLndyaXRlbGluZXMoW3NlbGYuX2xpbmVbMF0sIHNlbGYuX2xpbmVbMV0sIHNlbGYuX2xpbmVbMl1dKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldHZhbHVlKCksICdhYmMnKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lc19lcnJvcihzZWxmKToKKyAgICAgICAgZGVmIGVycm9yR2VuKCk6CisgICAgICAgICAgICB5aWVsZCAnYScKKyAgICAgICAgICAgIHJhaXNlIEtleWJvYXJkSW50ZXJydXB0KCkKKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIGYud3JpdGVsaW5lcywgZXJyb3JHZW4oKSkKKworICAgIGRlZiB0ZXN0X3RydW5jYXRlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKCkKKyAgICAgICAgZi53cml0ZShzZWxmLl9saW5lcykKKyAgICAgICAgZi5zZWVrKDEwKQorICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgZXEoZi5nZXR2YWx1ZSgpLCAnYWJjZGVmZ2hpaicpCisgICAgICAgIGYudHJ1bmNhdGUoNSkKKyAgICAgICAgZXEoZi5nZXR2YWx1ZSgpLCAnYWJjZGUnKQorICAgICAgICBmLndyaXRlKCd4eXonKQorICAgICAgICBlcShmLmdldHZhbHVlKCksICdhYmNkZXh5eicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGYudHJ1bmNhdGUsIC0xKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi53cml0ZSwgJ2Zyb2JuaXR6JykKKworICAgIGRlZiB0ZXN0X2Nsb3NlZF9mbGFnKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2xvc2VkLCBGYWxzZSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5jbG9zZWQsIFRydWUpCisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmNsb3NlZCwgRmFsc2UpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2xvc2VkLCBUcnVlKQorCisgICAgZGVmIHRlc3RfaXNhdHR5KHNlbGYpOgorICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYuaXNhdHR5LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuaXNhdHR5KCksIEZhbHNlKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5pc2F0dHkpCisKKyAgICBkZWYgdGVzdF9pdGVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQorICAgICAgICBlcShpdGVyKHNlbGYuX2ZwKSwgc2VsZi5fZnApCisgICAgICAgICMgRG9lcyB0aGlzIG9iamVjdCBzdXBwb3J0IHRoZSBpdGVyYXRpb24gcHJvdG9jb2w/CisgICAgICAgIHVubGVzcyhoYXNhdHRyKHNlbGYuX2ZwLCAnX19pdGVyX18nKSkKKyAgICAgICAgdW5sZXNzKGhhc2F0dHIoc2VsZi5fZnAsICduZXh0JykpCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBsaW5lIGluIHNlbGYuX2ZwOgorICAgICAgICAgICAgZXEobGluZSwgc2VsZi5fbGluZSArICdcbicpCisgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgZXEoaSwgNSkKKyAgICAgICAgc2VsZi5fZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLl9mcC5uZXh0KQorCisgICAgZGVmIHRlc3RfZ2V0dmFsdWUoc2VsZik6CisgICAgICAgIHNlbGYuX2ZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5fZnAuZ2V0dmFsdWUpCisKKyAgICBAdGVzdF9zdXBwb3J0LmJpZ21lbXRlc3QodGVzdF9zdXBwb3J0Ll8yRyArIDIqKjI2LCBtZW11c2U9Mi4wMDEpCisgICAgZGVmIHRlc3RfcmVhZHNfZnJvbV9sYXJnZV9zdHJlYW0oc2VsZiwgc2l6ZSk6CisgICAgICAgIGxpbmVzaXplID0gMioqMjYgIyA2NCBNaUIKKyAgICAgICAgbGluZXMgPSBbJ3gnICogKGxpbmVzaXplIC0gMSkgKyAnXG4nXSAqIChzaXplIC8vIGxpbmVzaXplKSArIFwKKyAgICAgICAgICAgICAgICBbJ3knICogKHNpemUgJSBsaW5lc2l6ZSldCisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygnJy5qb2luKGxpbmVzKSkKKyAgICAgICAgZm9yIGksIGV4cGVjdGVkIGluIGVudW1lcmF0ZShsaW5lcyk6CisgICAgICAgICAgICBsaW5lID0gZi5yZWFkKGxlbihleHBlY3RlZCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lKSwgbGVuKGV4cGVjdGVkKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICcnKQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgZm9yIGksIGV4cGVjdGVkIGluIGVudW1lcmF0ZShsaW5lcyk6CisgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lKSwgbGVuKGV4cGVjdGVkKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgpLCAnJykKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZXMoKSwgbGluZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZXMoKSwgW10pCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmVzKHNpemUpLCBsaW5lcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lcygpLCBbXSkKKworICAgICMgSW4gd29yc3QgY2FzZSBjU3RyaW5nSU8gcmVxdWlyZXMgMiArIDEgKyAxLzIgKyAxLzIqKjIgKyAuLi4gPSA0CisgICAgIyBieXRlcyBwZXIgaW5wdXQgY2hhcmFjdGVyLgorICAgIEB0ZXN0X3N1cHBvcnQuYmlnbWVtdGVzdCh0ZXN0X3N1cHBvcnQuXzJHLCBtZW11c2U9NCkKKyAgICBkZWYgdGVzdF93cml0ZXNfdG9fbGFyZ2Vfc3RyZWFtKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJ3gnICogMioqMjYgIyA2NCBNaUIKKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKCkKKyAgICAgICAgbiA9IHNpemUKKyAgICAgICAgd2hpbGUgbiA+IGxlbihzKToKKyAgICAgICAgICAgIGYud3JpdGUocykKKyAgICAgICAgICAgIG4gLT0gbGVuKHMpCisgICAgICAgIHMgPSBOb25lCisgICAgICAgIGYud3JpdGUoJ3gnICogbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZi5nZXR2YWx1ZSgpKSwgc2l6ZSkKKworCitjbGFzcyBUZXN0U3RyaW5nSU8oVGVzdEdlbmVyaWNTdHJpbmdJTyk6CisgICAgTU9EVUxFID0gU3RyaW5nSU8KKworICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisKKyAgICAgICAgaWYgbm90IHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6IHJldHVybgorCisgICAgICAgICMgVGhlIFN0cmluZ0lPIG1vZHVsZSBhbHNvIHN1cHBvcnRzIGNvbmNhdGVuYXRpbmcgVW5pY29kZQorICAgICAgICAjIHNuaXBwZXRzIHRvIGxhcmdlciBVbmljb2RlIHN0cmluZ3MuIFRoaXMgaXMgdGVzdGVkIGJ5IHRoaXMKKyAgICAgICAgIyBtZXRob2QuIE5vdGUgdGhhdCBjU3RyaW5nSU8gZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGV4dGVuc2lvbi4KKworICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8oKQorICAgICAgICBmLndyaXRlKHNlbGYuX2xpbmVbOjZdKQorICAgICAgICBmLnNlZWsoMykKKyAgICAgICAgZi53cml0ZSh1bmljb2RlKHNlbGYuX2xpbmVbMjA6MjZdKSkKKyAgICAgICAgZi53cml0ZSh1bmljb2RlKHNlbGYuX2xpbmVbNTJdKSkKKyAgICAgICAgcyA9IGYuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHVuaWNvZGUoJ2FiY3V2d3h5eiEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlcy5Vbmljb2RlVHlwZSkKKworY2xhc3MgVGVzdGNTdHJpbmdJTyhUZXN0R2VuZXJpY1N0cmluZ0lPKToKKyAgICBNT0RVTEUgPSBjU3RyaW5nSU8KKworICAgIGRlZiB0ZXN0X2FycmF5X3N1cHBvcnQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE3MzAxMTQ6IGNTdHJpbmdJTyBzaG91bGQgYWNjZXB0IGFycmF5IG9iamVjdHMKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCdCJywgWzAsMSwyXSkKKyAgICAgICAgZiA9IHNlbGYuTU9EVUxFLlN0cmluZ0lPKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXR2YWx1ZSgpLCAnXHgwMFx4MDFceDAyJykKKworICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisKKyAgICAgICAgaWYgbm90IHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6IHJldHVybgorCisgICAgICAgICMgVGhlIGNTdHJpbmdJTyBtb2R1bGUgY29udmVydHMgVW5pY29kZSBzdHJpbmdzIHRvIGNoYXJhY3RlcgorICAgICAgICAjIHN0cmluZ3Mgd2hlbiB3cml0aW5nIHRoZW0gdG8gY1N0cmluZ0lPIG9iamVjdHMuCisgICAgICAgICMgQ2hlY2sgdGhhdCB0aGlzIHdvcmtzLgorCisgICAgICAgIGYgPSBzZWxmLk1PRFVMRS5TdHJpbmdJTygpCisgICAgICAgIGYud3JpdGUodSdhYmNkZScpCisgICAgICAgIHMgPSBmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAnYWJjZGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHN0cikKKworICAgICAgICBmID0gc2VsZi5NT0RVTEUuU3RyaW5nSU8odSdhYmNkZScpCisgICAgICAgIHMgPSBmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAnYWJjZGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHN0cikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHNlbGYuTU9EVUxFLlN0cmluZ0lPLCB1J1x4ZjQnKQorCisKK2ltcG9ydCBzeXMKK2lmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgIyBKeXRob24gZG9lc24ndCBoYXZlIGEgYnVmZmVyIG9iamVjdCwgc28gd2UganVzdCBkbyBhIHVzZWxlc3MKKyAgICAjIGZha2Ugb2YgdGhlIGJ1ZmZlciB0ZXN0cy4KKyAgICBidWZmZXIgPSBzdHIKKworY2xhc3MgVGVzdEJ1ZmZlclN0cmluZ0lPKFRlc3RTdHJpbmdJTyk6CisgICAgY29uc3RydWN0b3IgPSBidWZmZXIKKworY2xhc3MgVGVzdEJ1ZmZlcmNTdHJpbmdJTyhUZXN0Y1N0cmluZ0lPKToKKyAgICBjb25zdHJ1Y3RvciA9IGJ1ZmZlcgorCitjbGFzcyBUZXN0TWVtb3J5dmlld2NTdHJpbmdJTyhUZXN0Y1N0cmluZ0lPKToKKyAgICBjb25zdHJ1Y3RvciA9IG1lbW9yeXZpZXcKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0U3RyaW5nSU8sIFRlc3RjU3RyaW5nSU8pCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImJ1ZmZlci4uIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEJ1ZmZlclN0cmluZ0lPLCBUZXN0QnVmZmVyY1N0cmluZ0lPKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdE1lbW9yeXZpZXdjU3RyaW5nSU8pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1N0cmluZ0lPLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1N0cmluZ0lPLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ0MmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1N0cmluZ0lPLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X1N0cmluZ0lPLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ0MmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfU3RyaW5nSU8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fYWxsX18ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNWRiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5CkBAIC0wLDAgKzEsMTIzIEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKKyMgU2V0dXAgYnNkZGIgd2FybmluZ3MKK3RyeToKKyAgICBic2RkYiA9IHN1cHBvcnQuaW1wb3J0X21vZHVsZSgnYnNkZGInLCBkZXByZWNhdGVkPVRydWUpCitleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3Q6CisgICAgcGFzcworCisKK2NsYXNzIE5vQWxsKFJ1bnRpbWVFcnJvcik6CisgICAgcGFzcworCitjbGFzcyBGYWlsZWRJbXBvcnQoUnVudGltZUVycm9yKToKKyAgICBwYXNzCisKKworY2xhc3MgQWxsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tfYWxsKHNlbGYsIG1vZG5hbWUpOgorICAgICAgICBuYW1lcyA9IHt9CisgICAgICAgIHdpdGggc3VwcG9ydC5jaGVja193YXJuaW5ncygoIi4qIChtb2R1bGV8cGFja2FnZSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZyksIHF1aWV0PVRydWUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV4ZWMgImltcG9ydCAlcyIgJSBtb2RuYW1lIGluIG5hbWVzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBTaWxlbnQgZmFpbCBoZXJlIHNlZW1zIHRoZSBiZXN0IHJvdXRlIHNpbmNlIHNvbWUgbW9kdWxlcworICAgICAgICAgICAgICAgICMgbWF5IG5vdCBiZSBhdmFpbGFibGUgb3Igbm90IGluaXRpYWxpemUgcHJvcGVybHkgaW4gYWxsCisgICAgICAgICAgICAgICAgIyBlbnZpcm9ubWVudHMuCisgICAgICAgICAgICAgICAgcmFpc2UgRmFpbGVkSW1wb3J0KG1vZG5hbWUpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHN5cy5tb2R1bGVzW21vZG5hbWVdLCAiX19hbGxfXyIpOgorICAgICAgICAgICAgcmFpc2UgTm9BbGwobW9kbmFtZSkKKyAgICAgICAgbmFtZXMgPSB7fQorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjICJmcm9tICVzIGltcG9ydCAqIiAlIG1vZG5hbWUgaW4gbmFtZXMKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgIyBJbmNsdWRlIHRoZSBtb2R1bGUgbmFtZSBpbiB0aGUgZXhjZXB0aW9uIHN0cmluZworICAgICAgICAgICAgc2VsZi5mYWlsKCJfX2FsbF9fIGZhaWx1cmUgaW4ge306IHt9OiB7fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsIGUuX19jbGFzc19fLl9fbmFtZV9fLCBlKSkKKyAgICAgICAgaWYgIl9fYnVpbHRpbnNfXyIgaW4gbmFtZXM6CisgICAgICAgICAgICBkZWwgbmFtZXNbIl9fYnVpbHRpbnNfXyJdCisgICAgICAgIGtleXMgPSBzZXQobmFtZXMpCisgICAgICAgIGFsbCA9IHNldChzeXMubW9kdWxlc1ttb2RuYW1lXS5fX2FsbF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIGFsbCkKKworICAgIGRlZiB3YWxrX21vZHVsZXMoc2VsZiwgYmFzZWRpciwgbW9kcGF0aCk6CisgICAgICAgIGZvciBmbiBpbiBzb3J0ZWQob3MubGlzdGRpcihiYXNlZGlyKSk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2VkaXIsIGZuKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgICAgICBwa2dfaW5pdCA9IG9zLnBhdGguam9pbihwYXRoLCAnX19pbml0X18ucHknKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBrZ19pbml0KToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgcGtnX2luaXQsIG1vZHBhdGggKyBmbgorICAgICAgICAgICAgICAgICAgICBmb3IgcCwgbSBpbiBzZWxmLndhbGtfbW9kdWxlcyhwYXRoLCBtb2RwYXRoICsgZm4gKyAiLiIpOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgcCwgbQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgZm4uZW5kc3dpdGgoJy5weScpIG9yIGZuID09ICdfX2luaXRfXy5weSc6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHlpZWxkIHBhdGgsIG1vZHBhdGggKyBmbls6LTNdCisKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgICMgQmxhY2tsaXN0ZWQgbW9kdWxlcyBhbmQgcGFja2FnZXMKKyAgICAgICAgYmxhY2tsaXN0ID0gc2V0KFsKKyAgICAgICAgICAgICMgV2lsbCByYWlzZSBhIFN5bnRheEVycm9yIHdoZW4gY29tcGlsaW5nIHRoZSBleGVjIHN0YXRlbWVudAorICAgICAgICAgICAgJ19fZnV0dXJlX18nLAorICAgICAgICBdKQorCisgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgIyBJbiBjYXNlIF9zb2NrZXQgZmFpbHMgdG8gYnVpbGQsIG1ha2UgdGhpcyB0ZXN0IGZhaWwgbW9yZSBncmFjZWZ1bGx5CisgICAgICAgICAgICAjIHRoYW4gYW4gQXR0cmlidXRlRXJyb3Igc29tZXdoZXJlIGRlZXAgaW4gQ0dJSFRUUFNlcnZlci4KKyAgICAgICAgICAgIGltcG9ydCBfc29ja2V0CisKKyAgICAgICAgIyBybGNvbXBsZXRlciBuZWVkcyBzcGVjaWFsIGNvbnNpZGVyYXRpb247IGl0IGltcG9ydCByZWFkbGluZSB3aGljaAorICAgICAgICAjIGluaXRpYWxpemVzIEdOVSByZWFkbGluZSB3aGljaCBjYWxscyBzZXRsb2NhbGUoTENfQ1RZUEUsICIiKS4uLiA6LSgKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHJsY29tcGxldGVyCisgICAgICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCAnQycpCisKKyAgICAgICAgaWdub3JlZCA9IFtdCisgICAgICAgIGZhaWxlZF9pbXBvcnRzID0gW10KKyAgICAgICAgbGliX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKQorICAgICAgICBmb3IgcGF0aCwgbW9kbmFtZSBpbiBzZWxmLndhbGtfbW9kdWxlcyhsaWJfZGlyLCAiIik6CisgICAgICAgICAgICBtID0gbW9kbmFtZQorICAgICAgICAgICAgYmxhY2tsaXN0ZWQgPSBGYWxzZQorICAgICAgICAgICAgd2hpbGUgbToKKyAgICAgICAgICAgICAgICBpZiBtIGluIGJsYWNrbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgYmxhY2tsaXN0ZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgbSA9IG0ucnBhcnRpdGlvbignLicpWzBdCisgICAgICAgICAgICBpZiBibGFja2xpc3RlZDoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50KG1vZG5hbWUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBUaGlzIGhldXJpc3RpYyBzcGVlZHMgdXAgdGhlIHByb2Nlc3MgYnkgcmVtb3ZpbmcsIGRlIGZhY3RvLAorICAgICAgICAgICAgICAgICMgbW9zdCB0ZXN0IG1vZHVsZXMgKGFuZCBhdm9pZGluZyB0aGUgYXV0by1leGVjdXRpbmcgb25lcykuCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHBhdGgsICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIGlmICJfX2FsbF9fIiBub3QgaW4gZi5yZWFkKCk6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBOb0FsbChtb2RuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2FsbChtb2RuYW1lKQorICAgICAgICAgICAgZXhjZXB0IE5vQWxsOgorICAgICAgICAgICAgICAgIGlnbm9yZWQuYXBwZW5kKG1vZG5hbWUpCisgICAgICAgICAgICBleGNlcHQgRmFpbGVkSW1wb3J0OgorICAgICAgICAgICAgICAgIGZhaWxlZF9pbXBvcnRzLmFwcGVuZChtb2RuYW1lKQorCisgICAgICAgIGlmIHN1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCdGb2xsb3dpbmcgbW9kdWxlcyBoYXZlIG5vIF9fYWxsX18gYW5kIGhhdmUgYmVlbiBpZ25vcmVkOicsCisgICAgICAgICAgICAgICAgICBpZ25vcmVkKQorICAgICAgICAgICAgcHJpbnQoJ0ZvbGxvd2luZyBtb2R1bGVzIGZhaWxlZCB0byBiZSBpbXBvcnRlZDonLCBmYWlsZWRfaW1wb3J0cykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoQWxsVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19hbGxfXy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE2M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19hbGxfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19hbGxfXy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2FsbF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE2M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19hbGxfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ4ZjhlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkKQEAgLTAsMCArMSw2NiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IF9fZnV0dXJlX18KKworR09PRF9TRVJJQUxTID0gKCJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIsICJmaW5hbCIpCisKK2ZlYXR1cmVzID0gX19mdXR1cmVfXy5hbGxfZmVhdHVyZV9uYW1lcworCitjbGFzcyBGdXR1cmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25hbWVzKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IGFsbF9mZWF0dXJlX25hbWVzIGFwcGVhcnMgY29ycmVjdC4KKyAgICAgICAgZ2l2ZW5fZmVhdHVyZV9uYW1lcyA9IGZlYXR1cmVzWzpdCisgICAgICAgIGZvciBuYW1lIGluIGRpcihfX2Z1dHVyZV9fKToKKyAgICAgICAgICAgIG9iaiA9IGdldGF0dHIoX19mdXR1cmVfXywgbmFtZSwgTm9uZSkKKyAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvYmosIF9fZnV0dXJlX18uX0ZlYXR1cmUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgbmFtZSBpbiBnaXZlbl9mZWF0dXJlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAiJXIgc2hvdWxkIGhhdmUgYmVlbiBpbiBhbGxfZmVhdHVyZV9uYW1lcyIgJSBuYW1lCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGdpdmVuX2ZlYXR1cmVfbmFtZXMucmVtb3ZlKG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdpdmVuX2ZlYXR1cmVfbmFtZXMpLCAwLAorICAgICAgICAgICAgICAgImFsbF9mZWF0dXJlX25hbWVzIGhhcyB0b28gbXVjaDogJXIiICUgZ2l2ZW5fZmVhdHVyZV9uYW1lcykKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGZvciBmZWF0dXJlIGluIGZlYXR1cmVzOgorICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKF9fZnV0dXJlX18sIGZlYXR1cmUpCisKKyAgICAgICAgICAgIG9wdGlvbmFsID0gdmFsdWUuZ2V0T3B0aW9uYWxSZWxlYXNlKCkKKyAgICAgICAgICAgIG1hbmRhdG9yeSA9IHZhbHVlLmdldE1hbmRhdG9yeVJlbGVhc2UoKQorCisgICAgICAgICAgICBhID0gc2VsZi5hc3NlcnRUcnVlCisgICAgICAgICAgICBlID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAgICAgZGVmIGNoZWNrKHQsIG5hbWUpOgorICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZSh0LCB0dXBsZSksICIlcyBpc24ndCB0dXBsZSIgJSBuYW1lKQorICAgICAgICAgICAgICAgIGUobGVuKHQpLCA1LCAiJXMgaXNuJ3QgNS10dXBsZSIgJSBuYW1lKQorICAgICAgICAgICAgICAgIChtYWpvciwgbWlub3IsIG1pY3JvLCBsZXZlbCwgc2VyaWFsKSA9IHQKKyAgICAgICAgICAgICAgICBhKGlzaW5zdGFuY2UobWFqb3IsIGludCksICIlcyBtYWpvciBpc24ndCBpbnQiICAlIG5hbWUpCisgICAgICAgICAgICAgICAgYShpc2luc3RhbmNlKG1pbm9yLCBpbnQpLCAiJXMgbWlub3IgaXNuJ3QgaW50IiAlIG5hbWUpCisgICAgICAgICAgICAgICAgYShpc2luc3RhbmNlKG1pY3JvLCBpbnQpLCAiJXMgbWljcm8gaXNuJ3QgaW50IiAlIG5hbWUpCisgICAgICAgICAgICAgICAgYShpc2luc3RhbmNlKGxldmVsLCBiYXNlc3RyaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgIiVzIGxldmVsIGlzbid0IHN0cmluZyIgJSBuYW1lKQorICAgICAgICAgICAgICAgIGEobGV2ZWwgaW4gR09PRF9TRVJJQUxTLAorICAgICAgICAgICAgICAgICAgICAgICAiJXMgbGV2ZWwgc3RyaW5nIGhhcyB1bmtub3duIHZhbHVlIiAlIG5hbWUpCisgICAgICAgICAgICAgICAgYShpc2luc3RhbmNlKHNlcmlhbCwgaW50KSwgIiVzIHNlcmlhbCBpc24ndCBpbnQiICUgbmFtZSkKKworICAgICAgICAgICAgY2hlY2sob3B0aW9uYWwsICJvcHRpb25hbCIpCisgICAgICAgICAgICBpZiBtYW5kYXRvcnkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY2hlY2sobWFuZGF0b3J5LCAibWFuZGF0b3J5IikKKyAgICAgICAgICAgICAgICBhKG9wdGlvbmFsIDwgbWFuZGF0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uYWwgbm90IGxlc3MgdGhhbiBtYW5kYXRvcnksIGFuZCBtYW5kYXRvcnkgbm90IE5vbmUiKQorCisgICAgICAgICAgICBhKGhhc2F0dHIodmFsdWUsICJjb21waWxlcl9mbGFnIiksCisgICAgICAgICAgICAgICAgICAgImZlYXR1cmUgaXMgbWlzc2luZyBhIC5jb21waWxlcl9mbGFnIGF0dHIiKQorICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGNvbXBpbGUgYWNjZXB0cyB0aGUgZmxhZy4KKyAgICAgICAgICAgIGNvbXBpbGUoIiIsICI8dGVzdD4iLCAiZXhlYyIsIHZhbHVlLmNvbXBpbGVyX2ZsYWcpCisgICAgICAgICAgICBhKGlzaW5zdGFuY2UoZ2V0YXR0cih2YWx1ZSwgImNvbXBpbGVyX2ZsYWciKSwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAiLmNvbXBpbGVyX2ZsYWcgaXNuJ3QgaW50IikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChGdXR1cmVUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTQ3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19fZnV0dXJlX18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYTQ3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fbG9jYWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmNiOTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weQpAQCAtMCwwICsxLDEzNyBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0Citmcm9tIF9sb2NhbGUgaW1wb3J0IChzZXRsb2NhbGUsIExDX05VTUVSSUMsIGxvY2FsZWNvbnYsIEVycm9yKQordHJ5OgorICAgIGZyb20gX2xvY2FsZSBpbXBvcnQgKFJBRElYQ0hBUiwgVEhPVVNFUCwgbmxfbGFuZ2luZm8pCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgbmxfbGFuZ2luZm8gPSBOb25lCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworZnJvbSBwbGF0Zm9ybSBpbXBvcnQgdW5hbWUKKworaWYgdW5hbWUoKVswXSA9PSAiRGFyd2luIjoKKyAgICBtYWosIG1pbiwgbWljID0gW2ludChwYXJ0KSBmb3IgcGFydCBpbiB1bmFtZSgpWzJdLnNwbGl0KCIuIildCisgICAgaWYgKG1haiwgbWluLCBtaWMpIDwgKDgsIDAsIDApOgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgibG9jYWxlIHN1cHBvcnQgYnJva2VuIGZvciBPUyBYIDwgMTAuNCIpCisKK2NhbmRpZGF0ZV9sb2NhbGVzID0gWydlc19VWScsICdmcl9GUicsICdmaV9GSScsICdlc19DTycsICdwdF9QVCcsICdpdF9JVCcsCisgICAgJ2V0X0VFJywgJ2VzX1BZJywgJ25vX05PJywgJ25sX05MJywgJ2x2X0xWJywgJ2VsX0dSJywgJ2JlX0JZJywgJ2ZyX0JFJywKKyAgICAncm9fUk8nLCAncnVfVUEnLCAncnVfUlUnLCAnZXNfVkUnLCAnY2FfRVMnLCAnc2VfTk8nLCAnZXNfRUMnLCAnaWRfSUQnLAorICAgICdrYV9HRScsICdlc19DTCcsICdodV9IVScsICd3YV9CRScsICdsdF9MVCcsICdzbF9TSScsICdocl9IUicsICdlc19BUicsCisgICAgJ2VzX0VTJywgJ29jX0ZSJywgJ2dsX0VTJywgJ2JnX0JHJywgJ2lzX0lTJywgJ21rX01LJywgJ2RlX0FUJywgJ3B0X0JSJywKKyAgICAnZGFfREsnLCAnbm5fTk8nLCAnY3NfQ1onLCAnZGVfTFUnLCAnZXNfQk8nLCAnc3FfQUwnLCAnc2tfU0snLCAnZnJfQ0gnLAorICAgICdkZV9ERScsICdzcl9ZVScsICdicl9GUicsICdubF9CRScsICdzdl9GSScsICdwbF9QTCcsICdmcl9DQScsICdmb19GTycsCisgICAgJ2JzX0JBJywgJ2ZyX0xVJywgJ2tsX0dMJywgJ2ZhX0lSJywgJ2RlX0JFJywgJ3N2X1NFJywgJ2l0X0NIJywgJ3VrX1VBJywKKyAgICAnZXVfRVMnLCAndmlfVk4nLCAnYWZfWkEnLCAnbmJfTk8nLCAnZW5fREsnLCAndGdfVEonLCAnZW5fVVMnLAorICAgICdlc19FUy5JU084ODU5LTEnLCAnZnJfRlIuSVNPODg1OS0xNScsICdydV9SVS5LT0k4LVInLCAna29fS1IuZXVjS1InXQorCisjIFdvcmthcm91bmQgZm9yIE1TVkM2KGRlYnVnKSBjcmFzaCBidWcKK2lmICJNU0Mgdi4xMjAwIiBpbiBzeXMudmVyc2lvbjoKKyAgICBkZWYgYWNjZXB0KGxvYyk6CisgICAgICAgIGEgPSBsb2Muc3BsaXQoIi4iKQorICAgICAgICByZXR1cm4gbm90KGxlbihhKSA9PSAyIGFuZCBsZW4oYVstMV0pID49IDkpCisgICAgY2FuZGlkYXRlX2xvY2FsZXMgPSBbbG9jIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXMgaWYgYWNjZXB0KGxvYyldCisKKyMgTGlzdCBrbm93biBsb2NhbGUgdmFsdWVzIHRvIHRlc3QgYWdhaW5zdCB3aGVuIGF2YWlsYWJsZS4KKyMgRGljdCBmb3JtYXR0ZWQgYXMgYGA8bG9jYWxlPiA6ICg8ZGVjaW1hbF9wb2ludD4sIDx0aG91c2FuZHNfc2VwPilgYC4gIElmIGEKKyMgdmFsdWUgaXMgbm90IGtub3duLCB1c2UgJycgLgora25vd25fbnVtZXJpY3MgPSB7J2ZyX0ZSJyA6ICgnLCcsICcnKSwgJ2VuX1VTJzooJy4nLCAnLCcpfQorCitjbGFzcyBfTG9jYWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9sZGxvY2FsZSA9IHNldGxvY2FsZShMQ19OVU1FUklDKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQywgc2VsZi5vbGRsb2NhbGUpCisKKyAgICAjIFdhbnQgdG8ga25vdyB3aGF0IHZhbHVlIHdhcyBjYWxjdWxhdGVkLCB3aGF0IGl0IHdhcyBjb21wYXJlZCBhZ2FpbnN0LAorICAgICMgd2hhdCBmdW5jdGlvbiB3YXMgdXNlZCBmb3IgdGhlIGNhbGN1bGF0aW9uLCB3aGF0IHR5cGUgb2YgZGF0YSB3YXMgdXNlZCwKKyAgICAjIHRoZSBsb2NhbGUgdGhhdCB3YXMgc3VwcG9zZWRseSBzZXQsIGFuZCB0aGUgYWN0dWFsIGxvY2FsZSB0aGF0IGlzIHNldC4KKyAgICBsY19udW1lcmljX2Vycl9tc2cgPSAiJXMgIT0gJXMgKCVzIGZvciAlczsgc2V0IHRvICVzLCB1c2luZyAlcykiCisKKyAgICBkZWYgbnVtZXJpY190ZXN0ZXIoc2VsZiwgY2FsY190eXBlLCBjYWxjX3ZhbHVlLCBkYXRhX3R5cGUsIHVzZWRfbG9jYWxlKToKKyAgICAgICAgIiIiQ29tcGFyZSBjYWxjdWxhdGlvbiBhZ2FpbnN0IGtub3duIHZhbHVlLCBpZiBhdmFpbGFibGUiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2V0X2xvY2FsZSA9IHNldGxvY2FsZShMQ19OVU1FUklDKQorICAgICAgICBleGNlcHQgRXJyb3I6CisgICAgICAgICAgICBzZXRfbG9jYWxlID0gIjxub3QgYWJsZSB0byBkZXRlcm1pbmU+IgorICAgICAgICBrbm93bl92YWx1ZSA9IGtub3duX251bWVyaWNzLmdldCh1c2VkX2xvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnJywgJycpKVtkYXRhX3R5cGUgPT0gJ3Rob3VzYW5kc19zZXAnXQorICAgICAgICBpZiBrbm93bl92YWx1ZSBhbmQgY2FsY192YWx1ZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsY192YWx1ZSwga25vd25fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGNfbnVtZXJpY19lcnJfbXNnICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY192YWx1ZSwga25vd25fdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjX3R5cGUsIGRhdGFfdHlwZSwgc2V0X2xvY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfbG9jYWxlKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG5sX2xhbmdpbmZvLCAibmxfbGFuZ2luZm8gaXMgbm90IGF2YWlsYWJsZSIpCisgICAgZGVmIHRlc3RfbGNfbnVtZXJpY19ubF9sYW5naW5mbyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG5sX2xhbmdpbmZvIGFnYWluc3Qga25vd24gdmFsdWVzCisgICAgICAgIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIGxvYykKKyAgICAgICAgICAgIGV4Y2VwdCBFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGxpLCBsYyBpbiAoKFJBRElYQ0hBUiwgImRlY2ltYWxfcG9pbnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVEhPVVNFUCwgInRob3VzYW5kc19zZXAiKSk6CisgICAgICAgICAgICAgICAgc2VsZi5udW1lcmljX3Rlc3RlcignbmxfbGFuZ2luZm8nLCBubF9sYW5naW5mbyhsaSksIGxjLCBsb2MpCisKKyAgICBkZWYgdGVzdF9sY19udW1lcmljX2xvY2FsZWNvbnYoc2VsZik6CisgICAgICAgICMgVGVzdCBsb2NhbGVjb252IGFnYWluc3Qga25vd24gdmFsdWVzCisgICAgICAgIGZvciBsb2MgaW4gY2FuZGlkYXRlX2xvY2FsZXM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsIGxvYykKKyAgICAgICAgICAgIGV4Y2VwdCBFcnJvcjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIGxjIGluICgiZGVjaW1hbF9wb2ludCIsICJ0aG91c2FuZHNfc2VwIik6CisgICAgICAgICAgICAgICAgc2VsZi5udW1lcmljX3Rlc3RlcignbG9jYWxlY29udicsIGxvY2FsZWNvbnYoKVtsY10sIGxjLCBsb2MpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhubF9sYW5naW5mbywgIm5sX2xhbmdpbmZvIGlzIG5vdCBhdmFpbGFibGUiKQorICAgIGRlZiB0ZXN0X2xjX251bWVyaWNfYmFzaWMoc2VsZik6CisgICAgICAgICMgVGVzdCBubF9sYW5naW5mbyBhZ2FpbnN0IGxvY2FsZWNvbnYKKyAgICAgICAgZm9yIGxvYyBpbiBjYW5kaWRhdGVfbG9jYWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZXRsb2NhbGUoTENfTlVNRVJJQywgbG9jKQorICAgICAgICAgICAgZXhjZXB0IEVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgbGksIGxjIGluICgoUkFESVhDSEFSLCAiZGVjaW1hbF9wb2ludCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUSE9VU0VQLCAidGhvdXNhbmRzX3NlcCIpKToKKyAgICAgICAgICAgICAgICBubF9yYWRpeGNoYXIgPSBubF9sYW5naW5mbyhsaSkKKyAgICAgICAgICAgICAgICBsaV9yYWRpeGNoYXIgPSBsb2NhbGVjb252KClbbGNdCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZXRfbG9jYWxlID0gc2V0bG9jYWxlKExDX05VTUVSSUMpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZXRfbG9jYWxlID0gIjxub3QgYWJsZSB0byBkZXRlcm1pbmU+IgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmxfcmFkaXhjaGFyLCBsaV9yYWRpeGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAobmxfbGFuZ2luZm8pICE9ICVzIChsb2NhbGVjb252KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc2V0IHRvICVzLCB1c2luZyAlcykiICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmxfcmFkaXhjaGFyLCBsaV9yYWRpeGNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2MsIHNldF9sb2NhbGUpKQorCisgICAgZGVmIHRlc3RfZmxvYXRfcGFyc2luZyhzZWxmKToKKyAgICAgICAgIyBCdWcgIzEzOTE4NzI6IFRlc3Qgd2hldGhlciBmbG9hdCBwYXJzaW5nIGlzIG9rYXkgb24gRXVyb3BlYW4KKyAgICAgICAgIyBsb2NhbGVzLgorICAgICAgICBmb3IgbG9jIGluIGNhbmRpZGF0ZV9sb2NhbGVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCBsb2MpCisgICAgICAgICAgICBleGNlcHQgRXJyb3I6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBJZ25vcmUgYnVnZ3kgbG9jYWxlIGRhdGFiYXNlcy4gKE1hYyBPUyAxMC40IGFuZCBzb21lIG90aGVyIEJTRHMpCisgICAgICAgICAgICBpZiBsb2MgPT0gJ2V1X0VTJyBhbmQgbG9jYWxlY29udigpWydkZWNpbWFsX3BvaW50J10gPT0gIicgIjoKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChldmFsKCczLjE0JykgKiAxMDApLCAzMTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBldmFsKCczLjE0JykgZmFpbGVkIGZvciAlcyIgJSBsb2MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgnMy4xNCcpICogMTAwKSwgMzE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgZmxvYXQoJzMuMTQnKSBmYWlsZWQgZm9yICVzIiAlIGxvYykKKyAgICAgICAgICAgIGlmIGxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddICE9ICcuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVjb252KClbJ2RlY2ltYWxfcG9pbnQnXS5qb2luKFsnMScsICcyMyddKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChfTG9jYWxlVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19sb2NhbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxMDVhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19sb2NhbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19sb2NhbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX2xvY2FsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxMDVhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19sb2NhbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjZjZWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfX29zeF9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMjc5IEBACisiIiIKK1Rlc3Qgc3VpdGUgZm9yIF9vc3hfc3VwcG9ydDogc2hhcmVkIE9TIFggc3VwcG9ydCBmdW5jdGlvbnMuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisKK2ltcG9ydCBfb3N4X3N1cHBvcnQKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImRhcndpbiIpLCAicmVxdWlyZXMgT1MgWCIpCitjbGFzcyBUZXN0X09TWFN1cHBvcnQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisgICAgICAgIHNlbGYucHJvZ19uYW1lID0gJ2JvZ3VzX3Byb2dyYW1feHh4eCcKKyAgICAgICAgc2VsZi50ZW1wX3BhdGhfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLmdldGN3ZCgpKQorICAgICAgICBzZWxmLmVudiA9IHRlc3QudGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc2VsZi5lbnYuX19leGl0X18pCisgICAgICAgIGZvciBjdiBpbiAoJ0NGTEFHUycsICdMREZMQUdTJywgJ0NQUEZMQUdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQkFTRUNGTEFHUycsICdCTERTSEFSRUQnLCAnTERTSEFSRUQnLCAnQ0MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDWFgnLCAnUFlfQ0ZMQUdTJywgJ1BZX0xERkxBR1MnLCAnUFlfQ1BQRkxBR1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQWV9DT1JFX0NGTEFHUycpOgorICAgICAgICAgICAgaWYgY3YgaW4gc2VsZi5lbnY6CisgICAgICAgICAgICAgICAgc2VsZi5lbnYudW5zZXQoY3YpCisKKyAgICBkZWYgYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKHNlbGYsIGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKToKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIGFsbCBtb2RpZmllZCBjb25maWcgdmFycworICAgICAgICAjIGFyZSBhbHNvIHNhdmVkIHdpdGggbW9kaWZpZWQga2V5cy4KKyAgICAgICAgZXhwZWN0ZWRfdmFycy51cGRhdGUoKCdfT1NYX1NVUFBPUlRfSU5JVElBTF8nKyBrLAorICAgICAgICAgICAgICAgIGNvbmZpZ192YXJzW2tdKSBmb3IgayBpbiBjb25maWdfdmFycworICAgICAgICAgICAgICAgICAgICBpZiBjb25maWdfdmFyc1trXSAhPSBleHBlY3RlZF92YXJzW2tdKQorCisgICAgZGVmIHRlc3RfX2ZpbmRfZXhlY3V0YWJsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lbnZbJ1BBVEgnXToKKyAgICAgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgJzonCisgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgb3MucGF0aC5hYnNwYXRoKHNlbGYudGVtcF9wYXRoX2RpcikKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYucHJvZ19uYW1lKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShfb3N4X3N1cHBvcnQuX2ZpbmRfZXhlY3V0YWJsZShzZWxmLnByb2dfbmFtZSkpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmssIHNlbGYucHJvZ19uYW1lKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5wcm9nX25hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoIiMhL2Jpbi9zaFxuL2Jpbi9lY2hvIE9LXG4iKQorICAgICAgICBvcy5jaG1vZChzZWxmLnByb2dfbmFtZSwgc3RhdC5TX0lSV1hVKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucHJvZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fZmluZF9leGVjdXRhYmxlKHNlbGYucHJvZ19uYW1lKSkKKworICAgIGRlZiB0ZXN0X19yZWFkX291dHB1dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5lbnZbJ1BBVEgnXToKKyAgICAgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgJzonCisgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBzZWxmLmVudlsnUEFUSCddICsgb3MucGF0aC5hYnNwYXRoKHNlbGYudGVtcF9wYXRoX2RpcikKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYucHJvZ19uYW1lKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdC50ZXN0X3N1cHBvcnQudW5saW5rLCBzZWxmLnByb2dfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYucHJvZ19uYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCIjIS9iaW4vc2hcbi9iaW4vZWNobyBFeHBlY3RlZE91dHB1dFxuIikKKyAgICAgICAgb3MuY2htb2Qoc2VsZi5wcm9nX25hbWUsIHN0YXQuU19JUldYVSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnRXhwZWN0ZWRPdXRwdXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVhZF9vdXRwdXQoc2VsZi5wcm9nX25hbWUpKQorCisgICAgZGVmIHRlc3RfX2ZpbmRfYnVpbGRfdG9vbChzZWxmKToKKyAgICAgICAgb3V0ID0gX29zeF9zdXBwb3J0Ll9maW5kX2J1aWxkX3Rvb2woJ2NjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKG91dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NjIG5vdCBmb3VuZCAtIGNoZWNrIHhjb2RlLXNlbGVjdCcpCisKKyAgICBkZWYgdGVzdF9fZ2V0X3N5c3RlbV92ZXJzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUocGxhdGZvcm0ubWFjX3ZlcigpWzBdLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX2dldF9zeXN0ZW1fdmVyc2lvbigpKSkKKworICAgIGRlZiB0ZXN0X19yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nIC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgY3YgPSAnQ0MnCisgICAgICAgIG5ld3ZhbHVlID0gJ2NsYW5nIC1wdGhyZWFkcycKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9zYXZlX21vZGlmaWVkX3ZhbHVlKGNvbmZpZ192YXJzLCBjdiwgbmV3dmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXhwZWN0ZWRfdmFycywgY29uZmlnX3ZhcnMpCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhjb25maWdfdmFycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLCBjb25maWdfdmFycykKKworICAgIGRlZiB0ZXN0X19zYXZlX21vZGlmaWVkX3ZhbHVlKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nIC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpCisgICAgICAgIGN2ID0gJ0NDJworICAgICAgICBuZXd2YWx1ZSA9ICdjbGFuZyAtcHRocmVhZHMnCisgICAgICAgIF9vc3hfc3VwcG9ydC5fc2F2ZV9tb2RpZmllZF92YWx1ZShjb25maWdfdmFycywgY3YsIG5ld3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcnMsIGNvbmZpZ192YXJzKQorCisgICAgZGVmIHRlc3RfX3NhdmVfbW9kaWZpZWRfdmFsdWVfdW5jaGFuZ2VkKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2djYy10ZXN0IC1wdGhyZWFkcycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IGNvbmZpZ192YXJzLmNvcHkoKQorICAgICAgICBjdiA9ICdDQycKKyAgICAgICAgbmV3dmFsdWUgPSAnZ2NjLXRlc3QgLXB0aHJlYWRzJworICAgICAgICBfb3N4X3N1cHBvcnQuX3NhdmVfbW9kaWZpZWRfdmFsdWUoY29uZmlnX3ZhcnMsIGN2LCBuZXd2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF92YXJzLCBjb25maWdfdmFycykKKworICAgIGRlZiB0ZXN0X19zdXBwb3J0c191bml2ZXJzYWxfYnVpbGRzKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGxhdGZvcm0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGF0Zm9ybS5tYWNfdmVyKClbMF0uc3BsaXQoJy4nKSA+PSBbJzEwJywgJzQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX3N1cHBvcnRzX3VuaXZlcnNhbF9idWlsZHMoKSkKKworICAgIGRlZiB0ZXN0X19maW5kX2FwcHJvcHJpYXRlX2NvbXBpbGVyKHNlbGYpOgorICAgICAgICBjb21waWxlcnMgPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAoJ2djYy10ZXN0JywgJ2k2ODYtYXBwbGUtZGFyd2luMTEtbGx2bS1nY2MtNC4yJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ2NsYW5nJywgJ2NsYW5nIHZlcnNpb24gMy4xJyksCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgY29uZmlnX3ZhcnMgPSB7CisgICAgICAgICdDQyc6ICdnY2MtdGVzdCAtcHRocmVhZHMnLAorICAgICAgICAnQ1hYJzogJ2NjKystdGVzdCcsCisgICAgICAgICdDRkxBR1MnOiAnLWZuby1zdHJpY3QtYWxpYXNpbmcgIC1nIC1PMyAtYXJjaCBwcGMgLWFyY2ggaTM4NiAgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnLWFyY2ggcHBjIC1hcmNoIGkzODYgICAtZycsCisgICAgICAgICdDUFBGTEFHUyc6ICctSS4gLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy10ZXN0IC1idW5kbGUgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLXRlc3QgLWJ1bmRsZSAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgLWcnLAorICAgICAgICB9CisgICAgICAgIGV4cGVjdGVkX3ZhcnMgPSB7CisgICAgICAgICdDQyc6ICdjbGFuZyAtcHRocmVhZHMnLAorICAgICAgICAnQ1hYJzogJ2NsYW5nKysnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdjbGFuZyAtYnVuZGxlIC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2NsYW5nIC1idW5kbGUgLWFyY2ggcHBjIC1hcmNoIGkzODYgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFkZF9leHBlY3RlZF9zYXZlZF9pbml0aWFsX3ZhbHVlcyhjb25maWdfdmFycywgZXhwZWN0ZWRfdmFycykKKworICAgICAgICBzdWZmaXggPSAoJzonICsgc2VsZi5lbnZbJ1BBVEgnXSkgaWYgc2VsZi5lbnZbJ1BBVEgnXSBlbHNlICcnCisgICAgICAgIHNlbGYuZW52WydQQVRIJ10gPSBvcy5wYXRoLmFic3BhdGgoc2VsZi50ZW1wX3BhdGhfZGlyKSArIHN1ZmZpeAorICAgICAgICBmb3IgY19uYW1lLCBjX291dHB1dCBpbiBjb21waWxlcnM6CisgICAgICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmsoY19uYW1lKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3QudGVzdF9zdXBwb3J0LnVubGluaywgY19uYW1lKQorICAgICAgICAgICAgd2l0aCBvcGVuKGNfbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIiMhL2Jpbi9zaFxuL2Jpbi9lY2hvICIgKyBjX291dHB1dCkKKyAgICAgICAgICAgIG9zLmNobW9kKGNfbmFtZSwgc3RhdC5TX0lSV1hVKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29zeF9zdXBwb3J0Ll9maW5kX2FwcHJvcHJpYXRlX2NvbXBpbGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX3ZhcnMpKQorCisgICAgZGVmIHRlc3RfX3JlbW92ZV91bml2ZXJzYWxfZmxhZ3Moc2VsZik6CisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2IC1nJywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgLWFyY2ggcHBjIC1hcmNoIGkzODYgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgICAgJywKKyAgICAgICAgJ0xERkxBR1MnOiAnICAgIC1nJywKKyAgICAgICAgJ0NQUEZMQUdTJzogJy1JLiAgJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgICAgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAgICAgLWcnLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX3JlbW92ZV91bml2ZXJzYWxfZmxhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfdmFycykpCisKKyAgICBkZWYgdGVzdF9fcmVtb3ZlX3Vuc3VwcG9ydGVkX2FyY2hzKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nJywKKyAgICAgICAgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAgLWcgLU8zIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICAnLAorICAgICAgICAnTERGTEFHUyc6ICctYXJjaCBwcGMgLWFyY2ggaTM4NiAgIC1nJywKKyAgICAgICAgJ0NQUEZMQUdTJzogJy1JLiAtaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkaycsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAtZycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nJywKKyAgICAgICAgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAgLWcgLU8zICAtYXJjaCBpMzg2ICAnLAorICAgICAgICAnTERGTEFHUyc6ICcgLWFyY2ggaTM4NiAgIC1nJywKKyAgICAgICAgJ0NQUEZMQUdTJzogJy1JLiAtaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkaycsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgICAtYXJjaCBpMzg2ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAtZycsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hZGRfZXhwZWN0ZWRfc2F2ZWRfaW5pdGlhbF92YWx1ZXMoY29uZmlnX3ZhcnMsIGV4cGVjdGVkX3ZhcnMpCisKKyAgICAgICAgc3VmZml4ID0gKCc6JyArIHNlbGYuZW52WydQQVRIJ10pIGlmIHNlbGYuZW52WydQQVRIJ10gZWxzZSAnJworICAgICAgICBzZWxmLmVudlsnUEFUSCddID0gb3MucGF0aC5hYnNwYXRoKHNlbGYudGVtcF9wYXRoX2RpcikgKyBzdWZmaXgKKyAgICAgICAgY19uYW1lID0gJ2NsYW5nJworICAgICAgICB0ZXN0LnRlc3Rfc3VwcG9ydC51bmxpbmsoY19uYW1lKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdC50ZXN0X3N1cHBvcnQudW5saW5rLCBjX25hbWUpCisgICAgICAgICMgZXhpdCBzdGF0dXMgMjU1IG1lYW5zIG5vIFBQQyBzdXBwb3J0IGluIHRoaXMgY29tcGlsZXIgY2hhaW4KKyAgICAgICAgd2l0aCBvcGVuKGNfbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiIyEvYmluL3NoXG5leGl0IDI1NSIpCisgICAgICAgIG9zLmNobW9kKGNfbmFtZSwgc3RhdC5TX0lSV1hVKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfdW5zdXBwb3J0ZWRfYXJjaHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfdmFycykpCisKKyAgICBkZWYgdGVzdF9fb3ZlcnJpZGVfYWxsX2FyY2hzKHNlbGYpOgorICAgICAgICBzZWxmLmVudlsnQVJDSEZMQUdTJ10gPSAnLWFyY2ggeDg2XzY0JworICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nJywKKyAgICAgICAgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAgLWcgLU8zIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICAnLAorICAgICAgICAnTERGTEFHUyc6ICctYXJjaCBwcGMgLWFyY2ggaTM4NiAgIC1nJywKKyAgICAgICAgJ0NQUEZMQUdTJzogJy1JLiAtaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkaycsCisgICAgICAgICdCTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtZycsCisgICAgICAgICdMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgLWFyY2ggcHBjIC1hcmNoIGkzODYgJworICAgICAgICAgICAgICAgICAgICAgICAgJy1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrIC1nJywKKyAgICAgICAgfQorICAgICAgICBleHBlY3RlZF92YXJzID0geworICAgICAgICAnQ0MnOiAnY2xhbmcnLAorICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgICAgIC1hcmNoIHg4Nl82NCcsCisgICAgICAgICdMREZMQUdTJzogJyAgICAtZyAtYXJjaCB4ODZfNjQnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrJywKKyAgICAgICAgJ0JMRFNIQVJFRCc6ICdnY2MtNC4wIC1idW5kbGUgICAgLWcgLWFyY2ggeDg2XzY0JywKKyAgICAgICAgJ0xEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgIC1pc3lzcm9vdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAnL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAtZyAtYXJjaCB4ODZfNjQnLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYWRkX2V4cGVjdGVkX3NhdmVkX2luaXRpYWxfdmFsdWVzKGNvbmZpZ192YXJzLCBleHBlY3RlZF92YXJzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3N4X3N1cHBvcnQuX292ZXJyaWRlX2FsbF9hcmNocygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ192YXJzKSkKKworICAgIGRlZiB0ZXN0X19jaGVja19mb3JfdW5hdmFpbGFibGVfc2RrKHNlbGYpOgorICAgICAgICBjb25maWdfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nJywKKyAgICAgICAgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAgLWcgLU8zIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC4xLnNkaycsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuIC1pc3lzcm9vdCAvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuMS5zZGsnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnLWlzeXNyb290IC9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC4xLnNkayAtZycsCisgICAgICAgIH0KKyAgICAgICAgZXhwZWN0ZWRfdmFycyA9IHsKKyAgICAgICAgJ0NDJzogJ2NsYW5nJywKKyAgICAgICAgJ0NGTEFHUyc6ICctZm5vLXN0cmljdC1hbGlhc2luZyAgLWcgLU8zIC1hcmNoIHBwYyAtYXJjaCBpMzg2ICAnCisgICAgICAgICAgICAgICAgICAgICAgICAnICcsCisgICAgICAgICdMREZMQUdTJzogJy1hcmNoIHBwYyAtYXJjaCBpMzg2ICAgLWcnLAorICAgICAgICAnQ1BQRkxBR1MnOiAnLUkuICAnLAorICAgICAgICAnQkxEU0hBUkVEJzogJ2djYy00LjAgLWJ1bmRsZSAgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWcnLAorICAgICAgICAnTERTSEFSRUQnOiAnZ2NjLTQuMCAtYnVuZGxlICAtYXJjaCBwcGMgLWFyY2ggaTM4NiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnIC1nJywKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFkZF9leHBlY3RlZF9zYXZlZF9pbml0aWFsX3ZhbHVlcyhjb25maWdfdmFycywgZXhwZWN0ZWRfdmFycykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29zeF9zdXBwb3J0Ll9jaGVja19mb3JfdW5hdmFpbGFibGVfc2RrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX3ZhcnMpKQorCisgICAgZGVmIHRlc3RfZ2V0X3BsYXRmb3JtX29zeChzZWxmKToKKyAgICAgICAgIyBOb3RlLCBnZXRfcGxhdGZvcm1fb3N4IGlzIGN1cnJlbnRseSB0ZXN0ZWQgbW9yZSBleHRlbnNpdmVseQorICAgICAgICAjIGluZGlyZWN0bHkgYnkgdGVzdF9zeXNjb25maWcgYW5kIHRlc3RfZGlzdHV0aWxzCisgICAgICAgIGNvbmZpZ192YXJzID0geworICAgICAgICAnQ0ZMQUdTJzogJy1mbm8tc3RyaWN0LWFsaWFzaW5nICAtZyAtTzMgLWFyY2ggcHBjIC1hcmNoIGkzODYgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICctaXN5c3Jvb3QgL0RldmVsb3Blci9TREtzL01hY09TWDEwLjEuc2RrJywKKyAgICAgICAgJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCc6ICcxMC42JywKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSBfb3N4X3N1cHBvcnQuZ2V0X3BsYXRmb3JtX29zeChjb25maWdfdmFycywgJyAnLCAnICcsICcgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ21hY29zeCcsICcxMC42JywgJ2ZhdCcpLCByZXN1bHQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0X09TWFN1cHBvcnQpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjEyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X19vc3hfc3VwcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjEyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9fb3N4X3N1cHBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FiYy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FiYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThjM2ExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5CkBAIC0wLDAgKzEsMjMzIEBACisjIENvcHlyaWdodCAyMDA3IEdvb2dsZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisKKyIiIlVuaXQgdGVzdHMgZm9yIGFiYy5weS4iIiIKKworaW1wb3J0IHVuaXR0ZXN0LCB3ZWFrcmVmCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgYWJjCitmcm9tIGluc3BlY3QgaW1wb3J0IGlzYWJzdHJhY3QKKworCitjbGFzcyBUZXN0QUJDKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Fic3RyYWN0bWV0aG9kX2Jhc2ljcyhzZWxmKToKKyAgICAgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgICAgICBkZWYgZm9vKHNlbGYpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb28uX19pc2Fic3RyYWN0bWV0aG9kX18pCisgICAgICAgIGRlZiBiYXIoc2VsZik6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGJhciwgIl9faXNhYnN0cmFjdG1ldGhvZF9fIikpCisKKyAgICBkZWYgdGVzdF9hYnN0cmFjdHByb3BlcnR5X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgQGFiYy5hYnN0cmFjdHByb3BlcnR5CisgICAgICAgIGRlZiBmb28oc2VsZik6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvby5fX2lzYWJzdHJhY3RtZXRob2RfXykKKyAgICAgICAgZGVmIGJhcihzZWxmKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYmFyLCAiX19pc2Fic3RyYWN0bWV0aG9kX18iKSkKKworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgICAgICBAYWJjLmFic3RyYWN0cHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6IHJldHVybiAzCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6IHJldHVybiBzdXBlcihELCBzZWxmKS5mb28KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEKCkuZm9vLCAzKQorCisgICAgZGVmIHRlc3RfYWJzdHJhY3RtZXRob2RfaW50ZWdyYXRpb24oc2VsZik6CisgICAgICAgIGZvciBhYnN0cmFjdHRoaW5nIGluIFthYmMuYWJzdHJhY3RtZXRob2QsIGFiYy5hYnN0cmFjdHByb3BlcnR5XToKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgICAgICAgICAgQGFic3RyYWN0dGhpbmcKKyAgICAgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiBwYXNzICAjIGFic3RyYWN0CisgICAgICAgICAgICAgICAgZGVmIGJhcihzZWxmKTogcGFzcyAgIyBjb25jcmV0ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fYWJzdHJhY3RtZXRob2RzX18sIHNldChbImZvbyJdKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgQykgICMgYmVjYXVzZSBmb28gaXMgYWJzdHJhY3QKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2Fic3RyYWN0KEMpKQorICAgICAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgICAgICBkZWYgYmFyKHNlbGYpOiBwYXNzICAjIGNvbmNyZXRlIG92ZXJyaWRlIG9mIGNvbmNyZXRlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuX19hYnN0cmFjdG1ldGhvZHNfXywgc2V0KFsiZm9vIl0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBEKSAgIyBiZWNhdXNlIGZvbyBpcyBzdGlsbCBhYnN0cmFjdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzdHJhY3QoRCkpCisgICAgICAgICAgICBjbGFzcyBFKEQpOgorICAgICAgICAgICAgICAgIGRlZiBmb28oc2VsZik6IHBhc3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRS5fX2Fic3RyYWN0bWV0aG9kc19fLCBzZXQoKSkKKyAgICAgICAgICAgIEUoKSAgIyBub3cgZm9vIGlzIGNvbmNyZXRlLCB0b28KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNhYnN0cmFjdChFKSkKKyAgICAgICAgICAgIGNsYXNzIEYoRSk6CisgICAgICAgICAgICAgICAgQGFic3RyYWN0dGhpbmcKKyAgICAgICAgICAgICAgICBkZWYgYmFyKHNlbGYpOiBwYXNzICAjIGFic3RyYWN0IG92ZXJyaWRlIG9mIGNvbmNyZXRlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYuX19hYnN0cmFjdG1ldGhvZHNfXywgc2V0KFsiYmFyIl0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGKSAgIyBiZWNhdXNlIGJhciBpcyBhYnN0cmFjdCBub3cKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2Fic3RyYWN0KEYpKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3Nfb2xkc3R5bGVfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgY2xhc3MgT2xkc3R5bGVDbGFzczoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKE9sZHN0eWxlQ2xhc3MsIEEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQSwgT2xkc3R5bGVDbGFzcykpCisKKyAgICBkZWYgdGVzdF9pc2luc3RhbmNlX2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIGNsYXNzIE9sZHN0eWxlQ2xhc3M6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShPbGRzdHlsZUNsYXNzLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoT2xkc3R5bGVDbGFzcywgdHlwZShPbGRzdHlsZUNsYXNzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShBLCBPbGRzdHlsZUNsYXNzKSkKKyAgICAgICAgIyBUaGlzIHJhaXNlcyBhIHJlY3Vyc2lvbiBkZXB0aCBlcnJvciwgYnV0IGlzIGxvdy1wcmlvcml0eToKKyAgICAgICAgIyBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShBLCBhYmMuQUJDTWV0YSkpCisKKyAgICBkZWYgdGVzdF9yZWdpc3RyYXRpb25fYmFzaWNzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYiA9IEIoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQiwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhCLCAoQSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKGIsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShiLCAoQSwpKQorICAgICAgICBBLnJlZ2lzdGVyKEIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEIsIEEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhCLCAoQSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGIsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShiLCAoQSwpKQorICAgICAgICBjbGFzcyBDKEIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMsIEEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCAoQSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGMsIEEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjLCAoQSwpKQorCisgICAgZGVmIHRlc3RfaXNpbnN0YW5jZV9pbnZhbGlkYXRpb24oc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBiID0gQigpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShiLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKGIsIChBLCkpKQorICAgICAgICBBLnJlZ2lzdGVyKEIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGIsIEEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiLCAoQSwpKSkKKworICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbl9idWlsdGlucyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICBBLnJlZ2lzdGVyKGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKDQyLCBBKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoNDIsIChBLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGludCwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGludCwgKEEsKSkpCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIEIucmVnaXN0ZXIoYmFzZXN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKCIiLCBBKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoIiIsIChBLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHN0ciwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHN0ciwgKEEsKSkpCisKKyAgICBkZWYgdGVzdF9yZWdpc3RyYXRpb25fZWRnZV9jYXNlcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICBBLnJlZ2lzdGVyKEEpICAjIHNob3VsZCBwYXNzIHNpbGVudGx5CisgICAgICAgIGNsYXNzIEExKEEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIEExLnJlZ2lzdGVyLCBBKSAgIyBjeWNsZXMgbm90IGFsbG93ZWQKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBBMS5yZWdpc3RlcihCKSAgIyBvaworICAgICAgICBBMS5yZWdpc3RlcihCKSAgIyBzaG91bGQgcGFzcyBzaWxlbnRseQorICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBBLnJlZ2lzdGVyKEMpICAjIHNob3VsZCBwYXNzIHNpbGVudGx5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgQy5yZWdpc3RlciwgQSkgICMgY3ljbGVzIG5vdCBhbGxvd2VkCisgICAgICAgIEMucmVnaXN0ZXIoQikgICMgb2sKKworICAgIGRlZiB0ZXN0X3JlZ2lzdGVyX25vbl9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgIkNhbiBvbmx5IHJlZ2lzdGVyIGNsYXNzZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBLnJlZ2lzdGVyLCA0KQorCisgICAgZGVmIHRlc3RfcmVnaXN0cmF0aW9uX3RyYW5zaXRpdmVuZXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEEsIEEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhBLCAoQSwpKSkKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQSwgQikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhBLCAoQiwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEIsIEEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQiwgKEEsKSkpCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKKyAgICAgICAgQS5yZWdpc3RlcihCKQorICAgICAgICBjbGFzcyBCMShCKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQjEsIEEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhCMSwgKEEsKSkpCisgICAgICAgIGNsYXNzIEMxKEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBCMS5yZWdpc3RlcihDMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQywgKEIsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBCMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCAoQjEsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMxLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDMSwgQikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMxLCAoQiwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIEIxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIChCMSwpKSkKKyAgICAgICAgQzEucmVnaXN0ZXIoaW50KQorICAgICAgICBjbGFzcyBNeUludChpbnQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhNeUludCwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE15SW50LCAoQSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKDQyLCBBKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoNDIsIChBLCkpCisKKyAgICBkZWYgdGVzdF9hbGxfbmV3X21ldGhvZHNfYXJlX2NhbGxlZChzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBjb3VudGVyID0gMAorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzKToKKyAgICAgICAgICAgICAgICBCLmNvdW50ZXIgKz0gMQorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihCLCBjbHMpLl9fbmV3X18oY2xzKQorICAgICAgICBjbGFzcyBDKEEsIEIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEIuY291bnRlciwgMCkKKyAgICAgICAgQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQi5jb3VudGVyLCAxKQorCisgICAgZGVmIHRlc3RfY2FjaGVfbGVhayhzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgIzI1MjEuCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBhYmMuQUJDTWV0YQorICAgICAgICAgICAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICAgICAgICAgICAgZGVmIGYoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgZGVmIGYoc2VsZik6CisgICAgICAgICAgICAgICAgQS5mKHNlbGYpCisgICAgICAgIHIgPSB3ZWFrcmVmLnJlZihDKQorICAgICAgICAjIFRyaWdnZXIgY2FjaGUuCisgICAgICAgIEMoKS5mKCkKKyAgICAgICAgZGVsIEMKKyAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIoKSwgTm9uZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEFCQykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FiYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NDQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FiYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJjLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FiYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NDQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FiYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Fic3RyYWN0X251bWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1ZjhjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Fic3RyYWN0X251bWJlcnMucHkKQEAgLTAsMCArMSw1MiBAQAorIiIiVW5pdCB0ZXN0cyBmb3IgbnVtYmVycy5weS4iIiIKKworaW1wb3J0IG1hdGgKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBudW1iZXJzIGltcG9ydCBDb21wbGV4LCBSZWFsLCBSYXRpb25hbCwgSW50ZWdyYWwKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFRlc3ROdW1iZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9pbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGludCwgSW50ZWdyYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhpbnQsIENvbXBsZXgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgaW50KDcpLnJlYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgaW50KDcpLmltYWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgaW50KDcpLmNvbmp1Z2F0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcsIGludCg3KS5udW1lcmF0b3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgaW50KDcpLmRlbm9taW5hdG9yKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MobG9uZywgSW50ZWdyYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhsb25nLCBDb21wbGV4KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcsIGxvbmcoNykucmVhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsb25nKDcpLmltYWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgbG9uZyg3KS5jb25qdWdhdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBsb25nKDcpLm51bWVyYXRvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsb25nKDcpLmRlbm9taW5hdG9yKQorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhmbG9hdCwgUmF0aW9uYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhmbG9hdCwgUmVhbCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LjMsIGZsb2F0KDcuMykucmVhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBmbG9hdCg3LjMpLmltYWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNy4zLCBmbG9hdCg3LjMpLmNvbmp1Z2F0ZSgpKQorCisgICAgZGVmIHRlc3RfY29tcGxleChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGNvbXBsZXgsIFJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhjb21wbGV4LCBDb21wbGV4KSkKKworICAgICAgICBjMSwgYzIgPSBjb21wbGV4KDMsIDIpLCBjb21wbGV4KDQsMSkKKyAgICAgICAgIyBYWFg6IFRoaXMgaXMgbm90IGlkZWFsLCBidXQgc2VlIHRoZSBjb21tZW50IGluIG1hdGhfdHJ1bmMoKS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIG1hdGgudHJ1bmMsIGMxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZsb2F0LCBjMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQsIGMxKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0TnVtYmVycykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODg5ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODg5ZGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWVwYWNrLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWVwYWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWEyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHkKQEAgLTAsMCArMSw5MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDMgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2FldHlwZXMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnYWV0eXBlcycpCithZXBhY2sgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnYWVwYWNrJykKKworY2xhc3MgVGVzdEFlcGFjayh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgT0JKRUNUUyA9IFsKKyAgICAgICAgYWV0eXBlcy5FbnVtKCdlbnVtJyksCisgICAgICAgIGFldHlwZXMuVHlwZSgndHlwZScpLAorICAgICAgICBhZXR5cGVzLktleXdvcmQoJ2t3cmQnKSwKKyAgICAgICAgYWV0eXBlcy5SYW5nZSgxLCAxMCksCisgICAgICAgIGFldHlwZXMuQ29tcGFyaXNvbigxLCAnPCAgICcsIDEwKSwKKyAgICAgICAgYWV0eXBlcy5Mb2dpY2FsKCdub3QgJywgMSksCisgICAgICAgIGFldHlwZXMuSW50bFRleHQoMCwgMCwgJ2ludGVybmF0aW9uYWwgdGV4dCcpLAorICAgICAgICBhZXR5cGVzLkludGxXcml0aW5nQ29kZSgwLDApLAorICAgICAgICBhZXR5cGVzLlFEUG9pbnQoNTAsMTAwKSwKKyAgICAgICAgYWV0eXBlcy5RRFJlY3RhbmdsZSg1MCwxMDAsMTUwLDIwMCksCisgICAgICAgIGFldHlwZXMuUkdCQ29sb3IoMHg3MDAwLCAweDYwMDAsIDB4NTAwMCksCisgICAgICAgIGFldHlwZXMuVW5rbm93bigneHh4eCcsICd1bmtub3duIHR5cGUgZGF0YScpLAorICAgICAgICBhZXR5cGVzLkNoYXJhY3RlcigxKSwKKyAgICAgICAgYWV0eXBlcy5DaGFyYWN0ZXIoMiwgYWV0eXBlcy5MaW5lKDIpKSwKKyAgICBdCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXBfc3RyaW5nKHNlbGYpOgorICAgICAgICBvID0gJ2Egc3RyaW5nJworICAgICAgICBwYWNrZWQgPSBhZXBhY2sucGFjayhvKQorICAgICAgICB1bnBhY2tlZCA9IGFlcGFjay51bnBhY2socGFja2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8sIHVucGFja2VkKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwX2ludChzZWxmKToKKyAgICAgICAgbyA9IDEyCisgICAgICAgIHBhY2tlZCA9IGFlcGFjay5wYWNrKG8pCisgICAgICAgIHVucGFja2VkID0gYWVwYWNrLnVucGFjayhwYWNrZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobywgdW5wYWNrZWQpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXBfZmxvYXQoc2VsZik6CisgICAgICAgIG8gPSAxMi4xCisgICAgICAgIHBhY2tlZCA9IGFlcGFjay5wYWNrKG8pCisgICAgICAgIHVucGFja2VkID0gYWVwYWNrLnVucGFjayhwYWNrZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobywgdW5wYWNrZWQpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXBfTm9uZShzZWxmKToKKyAgICAgICAgbyA9IE5vbmUKKyAgICAgICAgcGFja2VkID0gYWVwYWNrLnBhY2sobykKKyAgICAgICAgdW5wYWNrZWQgPSBhZXBhY2sudW5wYWNrKHBhY2tlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLCB1bnBhY2tlZCkKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9hZW9iamVjdHMoc2VsZik6CisgICAgICAgIGZvciBvIGluIHNlbGYuT0JKRUNUUzoKKyAgICAgICAgICAgIHBhY2tlZCA9IGFlcGFjay5wYWNrKG8pCisgICAgICAgICAgICB1bnBhY2tlZCA9IGFlcGFjay51bnBhY2socGFja2VkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKG8pLCByZXByKHVucGFja2VkKSkKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9GU1NwZWMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBDYXJib24uRmlsZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBub3QgaGFzYXR0cihDYXJib24uRmlsZSwgIkZTU3BlYyIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG8gPSBDYXJib24uRmlsZS5GU1NwZWMob3MuY3VyZGlyKQorICAgICAgICBwYWNrZWQgPSBhZXBhY2sucGFjayhvKQorICAgICAgICB1bnBhY2tlZCA9IGFlcGFjay51bnBhY2socGFja2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uYXNfcGF0aG5hbWUoKSwgdW5wYWNrZWQuYXNfcGF0aG5hbWUoKSkKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9BbGlhcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IENhcmJvbi5GaWxlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgaGFzYXR0cihDYXJib24uRmlsZSwgIkZTU3BlYyIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG8gPSBDYXJib24uRmlsZS5GU1NwZWMob3MuY3VyZGlyKS5OZXdBbGlhc01pbmltYWwoKQorICAgICAgICBwYWNrZWQgPSBhZXBhY2sucGFjayhvKQorICAgICAgICB1bnBhY2tlZCA9IGFlcGFjay51bnBhY2socGFja2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uRlNSZXNvbHZlQWxpYXMoTm9uZSlbMF0uYXNfcGF0aG5hbWUoKSwKKyAgICAgICAgICAgIHVucGFja2VkLkZTUmVzb2x2ZUFsaWFzKE5vbmUpWzBdLmFzX3BhdGhuYW1lKCkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEFlcGFjaykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWVwYWNrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjkzYTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWVwYWNrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hZXBhY2sucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWVwYWNrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjkzYTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWVwYWNrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9haWZjLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWlmYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmIzZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWlmYy5weQpAQCAtMCwwICsxLDE2MCBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIHJ1bl91bml0dGVzdCwgVEVTVEZOCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IGlvCisKK2ltcG9ydCBhaWZjCisKKworY2xhc3MgQUlGQ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmYgPSBzZWxmLmZvdXQgPSBOb25lCisgICAgICAgIHNlbGYuc25kZmlsZXBhdGggPSBmaW5kZmlsZSgnU2luZS0xMDAwSHotMzAwbXMuYWlmJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5mb3V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuZm91dC5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgKGFpZmMuRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc2tpcHVua25vd24oc2VsZik6CisgICAgICAgICNJc3N1ZSAyMjQ1CisgICAgICAgICNUaGlzIGZpbGUgY29udGFpbnMgY2h1bmsgdHlwZXMgYWlmYyBkb2Vzbid0IHJlY29nbml6ZS4KKyAgICAgICAgc2VsZi5mID0gYWlmYy5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCisKKyAgICBkZWYgdGVzdF9wYXJhbXMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLmYgPSBhaWZjLm9wZW4oc2VsZi5zbmRmaWxlcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldG5jaGFubmVscygpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0c2FtcHdpZHRoKCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRmcmFtZXJhdGUoKSwgNDgwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5nZXRuZnJhbWVzKCksIDE0NDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0Y29tcHR5cGUoKSwgJ05PTkUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0Y29tcG5hbWUoKSwgJ25vdCBjb21wcmVzc2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldHBhcmFtcygpLCAoMiwgMiwgNDgwMDAsIDE0NDAwLCAnTk9ORScsICdub3QgY29tcHJlc3NlZCcpKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZiA9IGFpZmMub3BlbihzZWxmLnNuZGZpbGVwYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGZyYW1lcygyKSwgJ1x4MDBceDAwXHgwMFx4MDBceDBiXHhkNFx4MGJceGQ0JykKKyAgICAgICAgZi5yZXdpbmQoKQorICAgICAgICBwb3MwID0gZi50ZWxsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3MwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGZyYW1lcygyKSwgJ1x4MDBceDAwXHgwMFx4MDBceDBiXHhkNFx4MGJceGQ0JykKKyAgICAgICAgcG9zMiA9IGYudGVsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zMiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRmcmFtZXMoMiksICdceDE3dFx4MTd0Ilx4YWQiXHhhZCcpCisgICAgICAgIGYuc2V0cG9zKHBvczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDIpLCAnXHgxN3RceDE3dCJceGFkIlx4YWQnKQorICAgICAgICBmLnNldHBvcyhwb3MwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGZyYW1lcygyKSwgJ1x4MDBceDAwXHgwMFx4MDBceDBiXHhkNFx4MGJceGQ0JykKKworICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5mID0gYWlmYy5vcGVuKHNlbGYuc25kZmlsZXBhdGgpCisgICAgICAgIGZvdXQgPSBzZWxmLmZvdXQgPSBhaWZjLm9wZW4oVEVTVEZOLCAnd2InKQorICAgICAgICBmb3V0LmFpZmMoKQorICAgICAgICBmb3V0LnNldHBhcmFtcyhmLmdldHBhcmFtcygpKQorICAgICAgICBmb3IgZnJhbWUgaW4gcmFuZ2UoZi5nZXRuZnJhbWVzKCkpOgorICAgICAgICAgICAgZm91dC53cml0ZWZyYW1lcyhmLnJlYWRmcmFtZXMoMSkpCisgICAgICAgIGZvdXQuY2xvc2UoKQorICAgICAgICBmb3V0ID0gc2VsZi5mb3V0ID0gYWlmYy5vcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgZi5yZXdpbmQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0cGFyYW1zKCksIGZvdXQuZ2V0cGFyYW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDUpLCBmb3V0LnJlYWRmcmFtZXMoNSkpCisKKyAgICBkZWYgdGVzdF9jb21wcmVzcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuZiA9IGFpZmMub3BlbihzZWxmLnNuZGZpbGVwYXRoKQorICAgICAgICBmb3V0ID0gc2VsZi5mb3V0ID0gYWlmYy5vcGVuKFRFU1RGTiwgJ3diJykKKyAgICAgICAgZm91dC5haWZjKCkKKyAgICAgICAgZm91dC5zZXRuY2hhbm5lbHMoZi5nZXRuY2hhbm5lbHMoKSkKKyAgICAgICAgZm91dC5zZXRzYW1wd2lkdGgoZi5nZXRzYW1wd2lkdGgoKSkKKyAgICAgICAgZm91dC5zZXRmcmFtZXJhdGUoZi5nZXRmcmFtZXJhdGUoKSkKKyAgICAgICAgZm91dC5zZXRjb21wdHlwZSgnVUxBVycsICdmb28nKQorICAgICAgICBmb3IgZnJhbWUgaW4gcmFuZ2UoZi5nZXRuZnJhbWVzKCkpOgorICAgICAgICAgICAgZm91dC53cml0ZWZyYW1lcyhmLnJlYWRmcmFtZXMoMSkpCisgICAgICAgIGZvdXQuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydExlc3MoCisgICAgICAgICAgICBvcy5zdGF0KFRFU1RGTikuc3Rfc2l6ZSwKKyAgICAgICAgICAgIG9zLnN0YXQoc2VsZi5zbmRmaWxlcGF0aCkuc3Rfc2l6ZSowLjc1LAorICAgICAgICAgICAgKQorICAgICAgICBmb3V0ID0gc2VsZi5mb3V0ID0gYWlmYy5vcGVuKFRFU1RGTiwgJ3JiJykKKyAgICAgICAgZi5yZXdpbmQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0cGFyYW1zKClbMDozXSwgZm91dC5nZXRwYXJhbXMoKVswOjNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQuZ2V0Y29tcHR5cGUoKSwgJ1VMQVcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvdXQuZ2V0Y29tcG5hbWUoKSwgJ2ZvbycpCisgICAgICAgICMgWFhYOiB0aGlzIHRlc3QgZmFpbHMsIG5vdCBzdXJlIGlmIGl0IHNob3VsZCBzdWNjZWVkIG9yIG5vdAorICAgICAgICAjIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkZnJhbWVzKDUpLCBmb3V0LnJlYWRmcmFtZXMoNSkpCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgY2xhc3MgV3JhcGZpbGUob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUgPSBvcGVuKGZpbGUsICdyYicpCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBUcnVlCisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6IHJldHVybiBnZXRhdHRyKHNlbGYuZmlsZSwgYXR0cikKKyAgICAgICAgdGVzdGZpbGUgPSBXcmFwZmlsZShzZWxmLnNuZGZpbGVwYXRoKQorICAgICAgICBmID0gc2VsZi5mID0gYWlmYy5vcGVuKHRlc3RmaWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RmaWxlLmNsb3NlZCwgRmFsc2UpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RmaWxlLmNsb3NlZCwgVHJ1ZSkKKyAgICAgICAgdGVzdGZpbGUgPSBvcGVuKFRFU1RGTiwgJ3diJykKKyAgICAgICAgZm91dCA9IGFpZmMub3Blbih0ZXN0ZmlsZSwgJ3diJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0ZXN0ZmlsZS5jbG9zZWQpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoYWlmYy5FcnJvcik6CisgICAgICAgICAgICBmb3V0LmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RmaWxlLmNsb3NlZCkKKyAgICAgICAgZm91dC5jbG9zZSgpICMgZG8gbm90aGluZworCisKK2NsYXNzIEFJRkNMb3dMZXZlbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcmVhZF93cml0dGVuKHNlbGYpOgorICAgICAgICBkZWYgcmVhZF93cml0dGVuKHNlbGYsIHdoYXQpOgorICAgICAgICAgICAgZiA9IGlvLkJ5dGVzSU8oKQorICAgICAgICAgICAgZ2V0YXR0cihhaWZjLCAnX3dyaXRlXycgKyB3aGF0KShmLCB4KQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihhaWZjLCAnX3JlYWRfJyArIHdoYXQpKGYpCisgICAgICAgIGZvciB4IGluICgtMSwgMCwgMC4xLCAxKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF93cml0dGVuKHgsICdmbG9hdCcpLCB4KQorICAgICAgICBmb3IgeCBpbiAoZmxvYXQoJ05hTicpLCBmbG9hdCgnSW5mJykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3dyaXR0ZW4oeCwgJ2Zsb2F0JyksIGFpZmMuX0hVR0VfVkFMKQorICAgICAgICBmb3IgeCBpbiAoYicnLCBiJ2ZvbycsIGInYScgKiAyNTUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3dyaXR0ZW4oeCwgJ3N0cmluZycpLCB4KQorICAgICAgICBmb3IgeCBpbiAoLTB4N0ZGRkZGRkYsIC0xLCAwLCAxLCAweDdGRkZGRkZGKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF93cml0dGVuKHgsICdsb25nJyksIHgpCisgICAgICAgIGZvciB4IGluICgwLCAxLCAweEZGRkZGRkZGKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF93cml0dGVuKHgsICd1bG9uZycpLCB4KQorICAgICAgICBmb3IgeCBpbiAoLTB4N0ZGRiwgLTEsIDAsIDEsIDB4N0ZGRik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfd3JpdHRlbih4LCAnc2hvcnQnKSwgeCkKKyAgICAgICAgZm9yIHggaW4gKDAsIDEsIDB4RkZGRik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfd3JpdHRlbih4LCAndXNob3J0JyksIHgpCisKKyAgICBkZWYgdGVzdF9yZWFkX3JhaXNlcyhzZWxmKToKKyAgICAgICAgZiA9IGlvLkJ5dGVzSU8oYidceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGFpZmMuX3JlYWRfdWxvbmcsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBhaWZjLl9yZWFkX2xvbmcsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBhaWZjLl9yZWFkX3VzaG9ydCwgZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGFpZmMuX3JlYWRfc2hvcnQsIGYpCisKKyAgICBkZWYgdGVzdF93cml0ZV9sb25nX3N0cmluZ19yYWlzZXMoc2VsZik6CisgICAgICAgIGYgPSBpby5CeXRlc0lPKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGFpZmMuX3dyaXRlX3N0cmluZyhmLCBiJ3RvbyBsb25nJyAqIDI1NSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEFJRkNUZXN0KQorICAgIHJ1bl91bml0dGVzdChBSUZDTG93TGV2ZWxUZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9haWZjLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FpZmMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOTdkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9haWZjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9haWZjLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FpZmMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOTdkMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9haWZjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY4ODU3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbC5weQpAQCAtMCwwICsxLDI1IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJXaGltcHkgdGVzdCBzY3JpcHQgZm9yIHRoZSBhbCBtb2R1bGUKKyAgIFJvZ2VyIEUuIE1hc3NlCisiIiIKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIGltcG9ydF9tb2R1bGUKK2FsID0gaW1wb3J0X21vZHVsZSgnYWwnLCBkZXByZWNhdGVkPVRydWUpCisKK2FsYXR0cnMgPSBbJ19fZG9jX18nLCAnX19uYW1lX18nLCAnZ2V0ZGVmYXVsdCcsICdnZXRtaW5tYXgnLCAnZ2V0bmFtZScsICdnZXRwYXJhbXMnLAorICAgICAgICAgICAnbmV3Y29uZmlnJywgJ29wZW5wb3J0JywgJ3F1ZXJ5cGFyYW1zJywgJ3NldHBhcmFtcyddCisKKyMgVGhpcyBpcyBhIHZlcnkgdW5vYnRydXNpdmUgdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgYWwgbW9kdWxlIGFuZCBhbGwgaXRzCisjIGF0dHJpYnV0ZXMuICBNb3JlIGNvbXByZWhlbnNpdmUgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGluIERlbW8vYWwKKworZGVmIHRlc3RfbWFpbigpOgorICAgICMgdG91Y2ggYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGFsIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnVG91Y2hpbmcgYWwgbW9kdWxlIGF0dHJpYnV0ZXMuLi4nCisgICAgZm9yIGF0dHIgaW4gYWxhdHRyczoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd0b3VjaGluZzogJywgYXR0cgorICAgICAgICBnZXRhdHRyKGFsLCBhdHRyKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM4MjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDM4MjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDFkZDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYW55ZGJtLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgYW55ZGJtIG1vZHVsZQorICAgYmFzZWQgb24gdGVzdGR1bWJkYm0ucHkKKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGdsb2IKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK19mbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKworIyBTaWxlbmNlIFB5M2sgd2FybmluZworYW55ZGJtID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2FueWRibScsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworZGVmIF9kZWxldGVfZmlsZXMoKToKKyAgICAjIHdlIGRvbid0IGtub3cgdGhlIHByZWNpc2UgbmFtZSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSB1c2VzCisgICAgIyBzbyB3ZSB1c2UgZ2xvYiB0byBsb2NhdGUgYWxsIG5hbWVzCisgICAgZm9yIGYgaW4gZ2xvYi5nbG9iKF9mbmFtZSArICIqIik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhmKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgQW55REJNVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIF9kaWN0ID0geycwJzogJycsCisgICAgICAgICAgICAgJ2EnOiAnUHl0aG9uOicsCisgICAgICAgICAgICAgJ2InOiAnUHJvZ3JhbW1pbmcnLAorICAgICAgICAgICAgICdjJzogJ3RoZScsCisgICAgICAgICAgICAgJ2QnOiAnd2F5JywKKyAgICAgICAgICAgICAnZic6ICdHdWlkbycsCisgICAgICAgICAgICAgJ2cnOiAnaW50ZW5kZWQnCisgICAgICAgICAgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MpCisKKyAgICBkZWYgdGVzdF9hbnlkYm1fY3JlYXRpb24oc2VsZik6CisgICAgICAgIGYgPSBhbnlkYm0ub3BlbihfZm5hbWUsICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmtleXMoKSwgW10pCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZGljdDoKKyAgICAgICAgICAgIGZba2V5XSA9IHNlbGYuX2RpY3Rba2V5XQorICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfYW55ZGJtX21vZGlmaWNhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5pbml0X2RiKCkKKyAgICAgICAgZiA9IGFueWRibS5vcGVuKF9mbmFtZSwgJ2MnKQorICAgICAgICBzZWxmLl9kaWN0WydnJ10gPSBmWydnJ10gPSAiaW5kZW50ZWQiCisgICAgICAgIHNlbGYucmVhZF9oZWxwZXIoZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9hbnlkYm1fcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5pbml0X2RiKCkKKyAgICAgICAgZiA9IGFueWRibS5vcGVuKF9mbmFtZSwgJ3InKQorICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfYW55ZGJtX2tleXMoc2VsZik6CisgICAgICAgIHNlbGYuaW5pdF9kYigpCisgICAgICAgIGYgPSBhbnlkYm0ub3BlbihfZm5hbWUsICdyJykKKyAgICAgICAga2V5cyA9IHNlbGYua2V5c19oZWxwZXIoZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgcmVhZF9oZWxwZXIoc2VsZiwgZik6CisgICAgICAgIGtleXMgPSBzZWxmLmtleXNfaGVscGVyKGYpCisgICAgICAgIGZvciBrZXkgaW4gc2VsZi5fZGljdDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGljdFtrZXldLCBmW2tleV0pCisKKyAgICBkZWYgaW5pdF9kYihzZWxmKToKKyAgICAgICAgZiA9IGFueWRibS5vcGVuKF9mbmFtZSwgJ24nKQorICAgICAgICBmb3IgayBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgZltrXSA9IHNlbGYuX2RpY3Rba10KKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYga2V5c19oZWxwZXIoc2VsZiwgZik6CisgICAgICAgIGtleXMgPSBmLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBka2V5cyA9IHNlbGYuX2RpY3Qua2V5cygpCisgICAgICAgIGRrZXlzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIGRrZXlzKQorICAgICAgICByZXR1cm4ga2V5cworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgX2RlbGV0ZV9maWxlcygpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQW55REJNVGVzdENhc2UpCisgICAgZmluYWxseToKKyAgICAgICAgX2RlbGV0ZV9maWxlcygpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbnlkYm0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGMzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbnlkYm0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FueWRibS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbnlkYm0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZGMzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hbnlkYm0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJlZmZlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5CkBAIC0wLDAgKzEsNzEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHN0cnVjdAorCitNYWNPUyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdNYWNPUycpCisjIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGV4aXN0IGlmIE1hY09TIGRvZXMuCitpbXBvcnQgYXBwbGVzaW5nbGUKKworQVNfTUFHSUM9MHgwMDA1MTYwMAorQVNfVkVSU0lPTj0weDAwMDIwMDAwCitkYXRhZm9ya2RhdGEgPSAnaGVsbG9cclwwd29ybGRcbicKK3Jlc291cmNlZm9ya2RhdGEgPSAnZ29vZGJ5ZVxuY3J1ZWxcMHdvcmxkXHInCisKK2FwcGxlc2luZ2xlZGF0YSA9IHN0cnVjdC5wYWNrKCI+bGwxNnNoIiwgQVNfTUFHSUMsIEFTX1ZFUlNJT04sICJmb28iLCAyKSArIFwKKyAgICBzdHJ1Y3QucGFjaygiPmxsbGxsbCIsIDEsIDUwLCBsZW4oZGF0YWZvcmtkYXRhKSwKKyAgICAgICAgMiwgNTArbGVuKGRhdGFmb3JrZGF0YSksIGxlbihyZXNvdXJjZWZvcmtkYXRhKSkgKyBcCisgICAgZGF0YWZvcmtkYXRhICsgXAorICAgIHJlc291cmNlZm9ya2RhdGEKK1RFU1RGTjIgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgJzInCisKK2NsYXNzIFRlc3RBcHBsZXNpbmdsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndycpCisgICAgICAgIGZwLndyaXRlKGFwcGxlc2luZ2xlZGF0YSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOMikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNvbXBhcmVEYXRhKHNlbGYsIGlzcmYsIGRhdGEpOgorICAgICAgICBpZiBpc3JmOgorICAgICAgICAgICAgZnAgPSBNYWNPUy5vcGVucmYoVEVTVEZOMiwgJypyYicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmcCA9IG9wZW4oVEVTVEZOMiwgJ3JiJykKKyAgICAgICAgZmlsZWRhdGEgPSBmcC5yZWFkKDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZmlsZWRhdGEpCisKKyAgICBkZWYgdGVzdF9hcHBsZXNpbmdsZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTjIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYXBwbGVzaW5nbGUuZGVjb2RlKHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCisgICAgICAgIHNlbGYuY29tcGFyZURhdGEoRmFsc2UsIGRhdGFmb3JrZGF0YSkKKyAgICAgICAgc2VsZi5jb21wYXJlRGF0YShUcnVlLCByZXNvdXJjZWZvcmtkYXRhKQorCisgICAgZGVmIHRlc3RfYXBwbGVzaW5nbGVfcmVzb25seShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTjIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYXBwbGVzaW5nbGUuZGVjb2RlKHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIsIHJlc29ubHk9VHJ1ZSkKKyAgICAgICAgc2VsZi5jb21wYXJlRGF0YShGYWxzZSwgcmVzb3VyY2Vmb3JrZGF0YSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEFwcGxlc2luZ2xlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY3OTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY3OTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBmZGY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5CkBAIC0wLDAgKzEsNDc2MyBAQAorIyBBdXRob3I6IFN0ZXZlbiBKLiBCZXRoYXJkIDxzdGV2ZW4uYmV0aGFyZEBnbWFpbC5jb20+LgorCitpbXBvcnQgY29kZWNzCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3RhdAoraW1wb3J0IHN5cworaW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGFyZ3BhcnNlCisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2NsYXNzIFN0ZElPQnVmZmVyKFN0cmluZ0lPKToKKyAgICBwYXNzCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRFcXVhbChzZWxmLCBvYmoxLCBvYmoyKToKKyAgICAgICAgaWYgb2JqMSAhPSBvYmoyOgorICAgICAgICAgICAgcHJpbnQoJycpCisgICAgICAgICAgICBwcmludChyZXByKG9iajEpKQorICAgICAgICAgICAgcHJpbnQocmVwcihvYmoyKSkKKyAgICAgICAgICAgIHByaW50KG9iajEpCisgICAgICAgICAgICBwcmludChvYmoyKQorICAgICAgICBzdXBlcihUZXN0Q2FzZSwgc2VsZikuYXNzZXJ0RXF1YWwob2JqMSwgb2JqMikKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBUaGUgdGVzdHMgYXNzdW1lIHRoYXQgbGluZSB3cmFwcGluZyBvY2N1cnMgYXQgODAgY29sdW1ucywgYnV0IHRoaXMKKyAgICAgICAgIyBiZWhhdmlvdXIgY2FuIGJlIG92ZXJyaWRkZW4gYnkgc2V0dGluZyB0aGUgQ09MVU1OUyBlbnZpcm9ubWVudAorICAgICAgICAjIHZhcmlhYmxlLiAgVG8gZW5zdXJlIHRoYXQgdGhpcyBhc3N1bXB0aW9uIGlzIHRydWUsIHVuc2V0IENPTFVNTlMuCisgICAgICAgIGVudiA9IHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkKKyAgICAgICAgZW52LnVuc2V0KCJDT0xVTU5TIikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGVudi5fX2V4aXRfXykKKworCitjbGFzcyBUZW1wRGlyTWl4aW4ob2JqZWN0KToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZW1wX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLm9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcihzZWxmLnRlbXBfZGlyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBvcy5jaGRpcihzZWxmLm9sZF9kaXIpCisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi50ZW1wX2RpciwgVHJ1ZSkKKworICAgIGRlZiBjcmVhdGVfcmVhZG9ubHlfZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnRlbXBfZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVfcGF0aCwgJ3cnKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZShmaWxlbmFtZSkKKyAgICAgICAgb3MuY2htb2QoZmlsZV9wYXRoLCBzdGF0LlNfSVJFQUQpCisKK2NsYXNzIFNpZyhvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICAgICAgc2VsZi5rd2FyZ3MgPSBrd2FyZ3MKKworCitjbGFzcyBOUyhvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUoa3dhcmdzKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBzb3J0ZWRfaXRlbXMgPSBzb3J0ZWQoc2VsZi5fX2RpY3RfXy5pdGVtcygpKQorICAgICAgICBrd2FyZ19zdHIgPSAnLCAnLmpvaW4oWyclcz0lcicgJSB0dXAgZm9yIHR1cCBpbiBzb3J0ZWRfaXRlbXNdKQorICAgICAgICByZXR1cm4gJyVzKCVzKScgJSAodHlwZShzZWxmKS5fX25hbWVfXywga3dhcmdfc3RyKQorCisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHZhcnMoc2VsZikgPT0gdmFycyhvdGhlcikKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCisKK2NsYXNzIEFyZ3VtZW50UGFyc2VyRXJyb3IoRXhjZXB0aW9uKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBzdGRvdXQ9Tm9uZSwgc3RkZXJyPU5vbmUsIGVycm9yX2NvZGU9Tm9uZSk6CisgICAgICAgIEV4Y2VwdGlvbi5fX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBzdGRvdXQsIHN0ZGVycikKKyAgICAgICAgc2VsZi5tZXNzYWdlID0gbWVzc2FnZQorICAgICAgICBzZWxmLnN0ZG91dCA9IHN0ZG91dAorICAgICAgICBzZWxmLnN0ZGVyciA9IHN0ZGVycgorICAgICAgICBzZWxmLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlCisKKworZGVmIHN0ZGVycl90b19wYXJzZXJfZXJyb3IocGFyc2VfYXJncywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAjIGlmIHRoaXMgaXMgYmVpbmcgY2FsbGVkIHJlY3Vyc2l2ZWx5IGFuZCBzdGRlcnIgb3Igc3Rkb3V0IGlzIGFscmVhZHkgYmVpbmcKKyAgICAjIHJlZGlyZWN0ZWQsIHNpbXBseSBjYWxsIHRoZSBmdW5jdGlvbiBhbmQgbGV0IHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24KKyAgICAjIGNhdGNoIHRoZSBleGNlcHRpb24KKyAgICBpZiBpc2luc3RhbmNlKHN5cy5zdGRlcnIsIFN0ZElPQnVmZmVyKSBvciBpc2luc3RhbmNlKHN5cy5zdGRvdXQsIFN0ZElPQnVmZmVyKToKKyAgICAgICAgcmV0dXJuIHBhcnNlX2FyZ3MoKmFyZ3MsICoqa3dhcmdzKQorCisgICAgIyBpZiB0aGlzIGlzIG5vdCBiZWluZyBjYWxsZWQgcmVjdXJzaXZlbHksIHJlZGlyZWN0IHN0ZGVyciBhbmQKKyAgICAjIHVzZSBpdCBhcyB0aGUgQXJndW1lbnRQYXJzZXJFcnJvciBtZXNzYWdlCisgICAgb2xkX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICBvbGRfc3RkZXJyID0gc3lzLnN0ZGVycgorICAgIHN5cy5zdGRvdXQgPSBTdGRJT0J1ZmZlcigpCisgICAgc3lzLnN0ZGVyciA9IFN0ZElPQnVmZmVyKCkKKyAgICB0cnk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IHBhcnNlX2FyZ3MoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgZm9yIGtleSBpbiBsaXN0KHZhcnMocmVzdWx0KSk6CisgICAgICAgICAgICAgICAgaWYgZ2V0YXR0cihyZXN1bHQsIGtleSkgaXMgc3lzLnN0ZG91dDoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihyZXN1bHQsIGtleSwgb2xkX3N0ZG91dCkKKyAgICAgICAgICAgICAgICBpZiBnZXRhdHRyKHJlc3VsdCwga2V5KSBpcyBzeXMuc3RkZXJyOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHJlc3VsdCwga2V5LCBvbGRfc3RkZXJyKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgIGNvZGUgPSBzeXMuZXhjX2luZm8oKVsxXS5jb2RlCisgICAgICAgICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgICAgIHN0ZGVyciA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRQYXJzZXJFcnJvcigiU3lzdGVtRXhpdCIsIHN0ZG91dCwgc3RkZXJyLCBjb2RlKQorICAgIGZpbmFsbHk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBvbGRfc3Rkb3V0CisgICAgICAgIHN5cy5zdGRlcnIgPSBvbGRfc3RkZXJyCisKKworY2xhc3MgRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoYXJncGFyc2UuQXJndW1lbnRQYXJzZXIpOgorCisgICAgZGVmIHBhcnNlX2FyZ3Moc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgcGFyc2VfYXJncyA9IHN1cGVyKEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyLCBzZWxmKS5wYXJzZV9hcmdzCisgICAgICAgIHJldHVybiBzdGRlcnJfdG9fcGFyc2VyX2Vycm9yKHBhcnNlX2FyZ3MsICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBleGl0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGV4aXQgPSBzdXBlcihFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlciwgc2VsZikuZXhpdAorICAgICAgICByZXR1cm4gc3RkZXJyX3RvX3BhcnNlcl9lcnJvcihleGl0LCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgZXJyb3IgPSBzdXBlcihFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlciwgc2VsZikuZXJyb3IKKyAgICAgICAgcmV0dXJuIHN0ZGVycl90b19wYXJzZXJfZXJyb3IoZXJyb3IsICphcmdzLCAqKmt3YXJncykKKworCitjbGFzcyBQYXJzZXJUZXN0ZXJNZXRhY2xhc3ModHlwZSk6CisgICAgIiIiQWRkcyBwYXJzZXIgdGVzdHMgdXNpbmcgdGhlIGNsYXNzIGF0dHJpYnV0ZXMuCisKKyAgICBDbGFzc2VzIG9mIHRoaXMgdHlwZSBzaG91bGQgc3BlY2lmeSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzIC0tIGEgbGlzdCBvZiBTaWcgb2JqZWN0cyB3aGljaCBzcGVjaWZ5CisgICAgICAgIHRoZSBzaWduYXR1cmVzIG9mIEFyZ3VtZW50IG9iamVjdHMgdG8gYmUgY3JlYXRlZAorICAgIGZhaWx1cmVzIC0tIGEgbGlzdCBvZiBhcmdzIGxpc3RzIHRoYXQgc2hvdWxkIGNhdXNlIHRoZSBwYXJzZXIKKyAgICAgICAgdG8gZmFpbAorICAgIHN1Y2Nlc3NlcyAtLSBhIGxpc3Qgb2YgKGluaXRpYWxfYXJncywgb3B0aW9ucywgcmVtYWluaW5nX2FyZ3MpIHR1cGxlcworICAgICAgICB3aGVyZSBpbml0aWFsX2FyZ3Mgc3BlY2lmaWVzIHRoZSBzdHJpbmcgYXJncyB0byBiZSBwYXJzZWQsCisgICAgICAgIG9wdGlvbnMgaXMgYSBkaWN0IHRoYXQgc2hvdWxkIG1hdGNoIHRoZSB2YXJzKCkgb2YgdGhlIG9wdGlvbnMKKyAgICAgICAgcGFyc2VkIG91dCBvZiBpbml0aWFsX2FyZ3MsIGFuZCByZW1haW5pbmdfYXJncyBzaG91bGQgYmUgYW55CisgICAgICAgIHJlbWFpbmluZyB1bnBhcnNlZCBhcmd1bWVudHMKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBib2R5ZGljdCk6CisgICAgICAgIGlmIG5hbWUgPT0gJ1BhcnNlclRlc3RDYXNlJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgZGVmYXVsdCBwYXJzZXIgc2lnbmF0dXJlIGlzIGVtcHR5CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKGNscywgJ3BhcnNlcl9zaWduYXR1cmUnKToKKyAgICAgICAgICAgIGNscy5wYXJzZXJfc2lnbmF0dXJlID0gU2lnKCkKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoY2xzLCAncGFyc2VyX2NsYXNzJyk6CisgICAgICAgICAgICBjbHMucGFyc2VyX2NsYXNzID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIKKworICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAjIGZ1bmN0aW9ucyBmb3IgYWRkaW5nIG9wdGlvbmFsIGFyZ3VtZW50cworICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBkZWYgbm9fZ3JvdXBzKHBhcnNlciwgYXJndW1lbnRfc2lnbmF0dXJlcyk6CisgICAgICAgICAgICAiIiJBZGQgYWxsIGFyZ3VtZW50cyBkaXJlY3RseSB0byB0aGUgcGFyc2VyIiIiCisgICAgICAgICAgICBmb3Igc2lnIGluIGFyZ3VtZW50X3NpZ25hdHVyZXM6CisgICAgICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgqc2lnLmFyZ3MsICoqc2lnLmt3YXJncykKKworICAgICAgICBkZWYgb25lX2dyb3VwKHBhcnNlciwgYXJndW1lbnRfc2lnbmF0dXJlcyk6CisgICAgICAgICAgICAiIiJBZGQgYWxsIGFyZ3VtZW50cyB1bmRlciBhIHNpbmdsZSBncm91cCBpbiB0aGUgcGFyc2VyIiIiCisgICAgICAgICAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ2ZvbycpCisgICAgICAgICAgICBmb3Igc2lnIGluIGFyZ3VtZW50X3NpZ25hdHVyZXM6CisgICAgICAgICAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCpzaWcuYXJncywgKipzaWcua3dhcmdzKQorCisgICAgICAgIGRlZiBtYW55X2dyb3VwcyhwYXJzZXIsIGFyZ3VtZW50X3NpZ25hdHVyZXMpOgorICAgICAgICAgICAgIiIiQWRkIGVhY2ggYXJndW1lbnQgaW4gaXRzIG93biBncm91cCB0byB0aGUgcGFyc2VyIiIiCisgICAgICAgICAgICBmb3IgaSwgc2lnIGluIGVudW1lcmF0ZShhcmd1bWVudF9zaWduYXR1cmVzKToKKyAgICAgICAgICAgICAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ2ZvbzolaScgJSBpKQorICAgICAgICAgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgqc2lnLmFyZ3MsICoqc2lnLmt3YXJncykKKworICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICMgZnVuY3Rpb25zIGZvciBwYXJzaW5nIGFyZ3MKKyAgICAgICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBkZWYgbGlzdGFyZ3MocGFyc2VyLCBhcmdzKToKKyAgICAgICAgICAgICIiIlBhcnNlIHRoZSBhcmdzIGJ5IHBhc3NpbmcgaW4gYSBsaXN0IiIiCisgICAgICAgICAgICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoYXJncykKKworICAgICAgICBkZWYgc3lzYXJncyhwYXJzZXIsIGFyZ3MpOgorICAgICAgICAgICAgIiIiUGFyc2UgdGhlIGFyZ3MgYnkgZGVmYXVsdGluZyB0byBzeXMuYXJndiIiIgorICAgICAgICAgICAgb2xkX3N5c19hcmd2ID0gc3lzLmFyZ3YKKyAgICAgICAgICAgIHN5cy5hcmd2ID0gW29sZF9zeXNfYXJndlswXV0gKyBhcmdzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLmFyZ3YgPSBvbGRfc3lzX2FyZ3YKKworICAgICAgICAjIGNsYXNzIHRoYXQgaG9sZHMgdGhlIGNvbWJpbmF0aW9uIG9mIG9uZSBvcHRpb25hbCBhcmd1bWVudAorICAgICAgICAjIGFkZGl0aW9uIG1ldGhvZCBhbmQgb25lIGFyZyBwYXJzaW5nIG1ldGhvZAorICAgICAgICBjbGFzcyBBZGRUZXN0cyhvYmplY3QpOgorCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdGVyX2NscywgYWRkX2FyZ3VtZW50cywgcGFyc2VfYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2FyZ3VtZW50cyA9IGFkZF9hcmd1bWVudHMKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZV9hcmdzID0gcGFyc2VfYXJncworCisgICAgICAgICAgICAgICAgYWRkX2FyZ3VtZW50c19uYW1lID0gc2VsZi5fYWRkX2FyZ3VtZW50cy5fX25hbWVfXworICAgICAgICAgICAgICAgIHBhcnNlX2FyZ3NfbmFtZSA9IHNlbGYuX3BhcnNlX2FyZ3MuX19uYW1lX18KKyAgICAgICAgICAgICAgICBmb3IgdGVzdF9mdW5jIGluIFtzZWxmLnRlc3RfZmFpbHVyZXMsIHNlbGYudGVzdF9zdWNjZXNzZXNdOgorICAgICAgICAgICAgICAgICAgICBmdW5jX25hbWUgPSB0ZXN0X2Z1bmMuX19uYW1lX18KKyAgICAgICAgICAgICAgICAgICAgbmFtZXMgPSBmdW5jX25hbWUsIGFkZF9hcmd1bWVudHNfbmFtZSwgcGFyc2VfYXJnc19uYW1lCisgICAgICAgICAgICAgICAgICAgIHRlc3RfbmFtZSA9ICdfJy5qb2luKG5hbWVzKQorCisgICAgICAgICAgICAgICAgICAgIGRlZiB3cmFwcGVyKHNlbGYsIHRlc3RfZnVuYz10ZXN0X2Z1bmMpOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9mdW5jKHNlbGYpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZXIuX19uYW1lX18gPSB0ZXN0X25hbWUKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih0ZXN0ZXJfY2xzLCB0ZXN0X25hbWUsIHdyYXBwZXIpCisKKyAgICAgICAgICAgIGRlZiBfZ2V0X3BhcnNlcihzZWxmLCB0ZXN0ZXIpOgorICAgICAgICAgICAgICAgIGFyZ3MgPSB0ZXN0ZXIucGFyc2VyX3NpZ25hdHVyZS5hcmdzCisgICAgICAgICAgICAgICAga3dhcmdzID0gdGVzdGVyLnBhcnNlcl9zaWduYXR1cmUua3dhcmdzCisgICAgICAgICAgICAgICAgcGFyc2VyID0gdGVzdGVyLnBhcnNlcl9jbGFzcygqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgc2VsZi5fYWRkX2FyZ3VtZW50cyhwYXJzZXIsIHRlc3Rlci5hcmd1bWVudF9zaWduYXR1cmVzKQorICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZXIKKworICAgICAgICAgICAgZGVmIHRlc3RfZmFpbHVyZXMoc2VsZiwgdGVzdGVyKToKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBzZWxmLl9nZXRfcGFyc2VyKHRlc3RlcikKKyAgICAgICAgICAgICAgICBmb3IgYXJnc19zdHIgaW4gdGVzdGVyLmZhaWx1cmVzOgorICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJnc19zdHIuc3BsaXQoKQorICAgICAgICAgICAgICAgICAgICByYWlzZXMgPSB0ZXN0ZXIuYXNzZXJ0UmFpc2VzCisgICAgICAgICAgICAgICAgICAgIHJhaXNlcyhBcmd1bWVudFBhcnNlckVycm9yLCBwYXJzZXIucGFyc2VfYXJncywgYXJncykKKworICAgICAgICAgICAgZGVmIHRlc3Rfc3VjY2Vzc2VzKHNlbGYsIHRlc3Rlcik6CisgICAgICAgICAgICAgICAgcGFyc2VyID0gc2VsZi5fZ2V0X3BhcnNlcih0ZXN0ZXIpCisgICAgICAgICAgICAgICAgZm9yIGFyZ3MsIGV4cGVjdGVkX25zIGluIHRlc3Rlci5zdWNjZXNzZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXJncywgc3RyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmdzLnNwbGl0KCkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0X25zID0gc2VsZi5fcGFyc2VfYXJncyhwYXJzZXIsIGFyZ3MpCisgICAgICAgICAgICAgICAgICAgIHRlc3Rlci5hc3NlcnRFcXVhbChleHBlY3RlZF9ucywgcmVzdWx0X25zKQorCisgICAgICAgICMgYWRkIHRlc3RzIGZvciBlYWNoIGNvbWJpbmF0aW9uIG9mIGFuIG9wdGlvbmFscyBhZGRpbmcgbWV0aG9kCisgICAgICAgICMgYW5kIGFuIGFyZyBwYXJzaW5nIG1ldGhvZAorICAgICAgICBmb3IgYWRkX2FyZ3VtZW50cyBpbiBbbm9fZ3JvdXBzLCBvbmVfZ3JvdXAsIG1hbnlfZ3JvdXBzXToKKyAgICAgICAgICAgIGZvciBwYXJzZV9hcmdzIGluIFtsaXN0YXJncywgc3lzYXJnc106CisgICAgICAgICAgICAgICAgQWRkVGVzdHMoY2xzLCBhZGRfYXJndW1lbnRzLCBwYXJzZV9hcmdzKQorCitiYXNlcyA9IFRlc3RDYXNlLAorUGFyc2VyVGVzdENhc2UgPSBQYXJzZXJUZXN0ZXJNZXRhY2xhc3MoJ1BhcnNlclRlc3RDYXNlJywgYmFzZXMsIHt9KQorCisjID09PT09PT09PT09PT09PQorIyBPcHRpb25hbHMgdGVzdHMKKyMgPT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RPcHRpb25hbHNTaW5nbGVEYXNoKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGFuIE9wdGlvbmFsIHdpdGggYSBzaW5nbGUtZGFzaCBvcHRpb24gc3RyaW5nIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLXgnKV0KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnYScsICctLWZvbycsICcteCAtLWZvbycsICcteCAteSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSkpLAorICAgICAgICAoJy14IGEnLCBOUyh4PSdhJykpLAorICAgICAgICAoJy14YScsIE5TKHg9J2EnKSksCisgICAgICAgICgnLXggLTEnLCBOUyh4PSctMScpKSwKKyAgICAgICAgKCcteC0xJywgTlMoeD0nLTEnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNTaW5nbGVEYXNoQ29tYmluZWQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYW4gT3B0aW9uYWwgd2l0aCBhIHNpbmdsZS1kYXNoIG9wdGlvbiBzdHJpbmciIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICAgICAgU2lnKCcteXl5JywgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PTQyKSwKKyAgICAgICAgU2lnKCcteicpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnYScsICctLWZvbycsICcteGEnLCAnLXggLS1mb28nLCAnLXggLXonLCAnLXogLXgnLAorICAgICAgICAgICAgICAgICcteXgnLCAnLXl6IGEnLCAnLXl5eXgnLCAnLXl5eXphJywgJy14eXphJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1GYWxzZSwgeXl5PU5vbmUsIHo9Tm9uZSkpLAorICAgICAgICAoJy14JywgTlMoeD1UcnVlLCB5eXk9Tm9uZSwgej1Ob25lKSksCisgICAgICAgICgnLXphJywgTlMoeD1GYWxzZSwgeXl5PU5vbmUsIHo9J2EnKSksCisgICAgICAgICgnLXogYScsIE5TKHg9RmFsc2UsIHl5eT1Ob25lLCB6PSdhJykpLAorICAgICAgICAoJy14emEnLCBOUyh4PVRydWUsIHl5eT1Ob25lLCB6PSdhJykpLAorICAgICAgICAoJy14eiBhJywgTlMoeD1UcnVlLCB5eXk9Tm9uZSwgej0nYScpKSwKKyAgICAgICAgKCcteCAtemEnLCBOUyh4PVRydWUsIHl5eT1Ob25lLCB6PSdhJykpLAorICAgICAgICAoJy14IC16IGEnLCBOUyh4PVRydWUsIHl5eT1Ob25lLCB6PSdhJykpLAorICAgICAgICAoJy15JywgTlMoeD1GYWxzZSwgeXl5PTQyLCB6PU5vbmUpKSwKKyAgICAgICAgKCcteXl5JywgTlMoeD1GYWxzZSwgeXl5PTQyLCB6PU5vbmUpKSwKKyAgICAgICAgKCcteCAteXl5IC16YScsIE5TKHg9VHJ1ZSwgeXl5PTQyLCB6PSdhJykpLAorICAgICAgICAoJy14IC15eXkgLXogYScsIE5TKHg9VHJ1ZSwgeXl5PTQyLCB6PSdhJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzU2luZ2xlRGFzaExvbmcoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYW4gT3B0aW9uYWwgd2l0aCBhIG11bHRpLWNoYXJhY3RlciBzaW5nbGUtZGFzaCBvcHRpb24gc3RyaW5nIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLWZvbycpXQorICAgIGZhaWx1cmVzID0gWyctZm9vJywgJ2EnLCAnLS1mb28nLCAnLWZvbyAtLWZvbycsICctZm9vIC15JywgJy1mb29hJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZm9vPU5vbmUpKSwKKyAgICAgICAgKCctZm9vIGEnLCBOUyhmb289J2EnKSksCisgICAgICAgICgnLWZvbyAtMScsIE5TKGZvbz0nLTEnKSksCisgICAgICAgICgnLWZvIGEnLCBOUyhmb289J2EnKSksCisgICAgICAgICgnLWYgYScsIE5TKGZvbz0nYScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc1NpbmdsZURhc2hTdWJzZXRBbWJpZ3VvdXMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgT3B0aW9uYWxzIHdoZXJlIG9wdGlvbiBzdHJpbmdzIGFyZSBzdWJzZXRzIG9mIGVhY2ggb3RoZXIiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctZicpLCBTaWcoJy1mb29iYXInKSwgU2lnKCctZm9vcmFiJyldCisgICAgZmFpbHVyZXMgPSBbJy1mJywgJy1mb28nLCAnLWZvJywgJy1mb28gYicsICctZm9vYicsICctZm9vYmEnLCAnLWZvb3JhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZj1Ob25lLCBmb29iYXI9Tm9uZSwgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZiBhJywgTlMoZj0nYScsIGZvb2Jhcj1Ob25lLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mYScsIE5TKGY9J2EnLCBmb29iYXI9Tm9uZSwgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZm9hJywgTlMoZj0nb2EnLCBmb29iYXI9Tm9uZSwgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZm9vYScsIE5TKGY9J29vYScsIGZvb2Jhcj1Ob25lLCBmb29yYWI9Tm9uZSkpLAorICAgICAgICAoJy1mb29iYXIgYScsIE5TKGY9Tm9uZSwgZm9vYmFyPSdhJywgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZm9vcmFiIGEnLCBOUyhmPU5vbmUsIGZvb2Jhcj1Ob25lLCBmb29yYWI9J2EnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNTaW5nbGVEYXNoQW1iaWd1b3VzKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IE9wdGlvbmFscyB0aGF0IHBhcnRpYWxseSBtYXRjaCBidXQgYXJlIG5vdCBzdWJzZXRzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLWZvb2JhcicpLCBTaWcoJy1mb29yYWInKV0KKyAgICBmYWlsdXJlcyA9IFsnLWYnLCAnLWYgYScsICctZmEnLCAnLWZvYScsICctZm9vJywgJy1mbycsICctZm9vIGInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmb29iYXI9Tm9uZSwgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZm9vYiBhJywgTlMoZm9vYmFyPSdhJywgZm9vcmFiPU5vbmUpKSwKKyAgICAgICAgKCctZm9vciBhJywgTlMoZm9vYmFyPU5vbmUsIGZvb3JhYj0nYScpKSwKKyAgICAgICAgKCctZm9vYmEgYScsIE5TKGZvb2Jhcj0nYScsIGZvb3JhYj1Ob25lKSksCisgICAgICAgICgnLWZvb3JhIGEnLCBOUyhmb29iYXI9Tm9uZSwgZm9vcmFiPSdhJykpLAorICAgICAgICAoJy1mb29iYXIgYScsIE5TKGZvb2Jhcj0nYScsIGZvb3JhYj1Ob25lKSksCisgICAgICAgICgnLWZvb3JhYiBhJywgTlMoZm9vYmFyPU5vbmUsIGZvb3JhYj0nYScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc051bWVyaWMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYW4gT3B0aW9uYWwgd2l0aCBhIHNob3J0IG9wdCBzdHJpbmciIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctMScsIGRlc3Q9J29uZScpXQorICAgIGZhaWx1cmVzID0gWyctMScsICdhJywgJy0xIC0tZm9vJywgJy0xIC15JywgJy0xIC0xJywgJy0xIC0yJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMob25lPU5vbmUpKSwKKyAgICAgICAgKCctMSBhJywgTlMob25lPSdhJykpLAorICAgICAgICAoJy0xYScsIE5TKG9uZT0nYScpKSwKKyAgICAgICAgKCctMS0yJywgTlMob25lPSctMicpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0RvdWJsZURhc2goUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYW4gT3B0aW9uYWwgd2l0aCBhIGRvdWJsZS1kYXNoIG9wdGlvbiBzdHJpbmciIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctLWZvbycpXQorICAgIGZhaWx1cmVzID0gWyctLWZvbycsICctZicsICctZiBhJywgJ2EnLCAnLS1mb28gLXgnLCAnLS1mb28gLS1iYXInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmb289Tm9uZSkpLAorICAgICAgICAoJy0tZm9vIGEnLCBOUyhmb289J2EnKSksCisgICAgICAgICgnLS1mb289YScsIE5TKGZvbz0nYScpKSwKKyAgICAgICAgKCctLWZvbyAtMi41JywgTlMoZm9vPSctMi41JykpLAorICAgICAgICAoJy0tZm9vPS0yLjUnLCBOUyhmb289Jy0yLjUnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNEb3VibGVEYXNoUGFydGlhbE1hdGNoKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBwYXJ0aWFsIG1hdGNoaW5nIHdpdGggYSBkb3VibGUtZGFzaCBvcHRpb24gc3RyaW5nIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy0tYmFkZ2VyJywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgICAgIFNpZygnLS1iYXQnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy0tYmFyJywgJy0tYicsICctLWJhJywgJy0tYj0yJywgJy0tYmE9NCcsICctLWJhZGdlIDUnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhiYWRnZXI9RmFsc2UsIGJhdD1Ob25lKSksCisgICAgICAgICgnLS1iYXQgWCcsIE5TKGJhZGdlcj1GYWxzZSwgYmF0PSdYJykpLAorICAgICAgICAoJy0tYmFkJywgTlMoYmFkZ2VyPVRydWUsIGJhdD1Ob25lKSksCisgICAgICAgICgnLS1iYWRnJywgTlMoYmFkZ2VyPVRydWUsIGJhdD1Ob25lKSksCisgICAgICAgICgnLS1iYWRnZScsIE5TKGJhZGdlcj1UcnVlLCBiYXQ9Tm9uZSkpLAorICAgICAgICAoJy0tYmFkZ2VyJywgTlMoYmFkZ2VyPVRydWUsIGJhdD1Ob25lKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNEb3VibGVEYXNoUHJlZml4TWF0Y2goUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHdoZW4gb25lIGRvdWJsZS1kYXNoIG9wdGlvbiBzdHJpbmcgaXMgYSBwcmVmaXggb2YgYW5vdGhlciIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWJhZGdlcicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgICAgICBTaWcoJy0tYmEnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy0tYmFyJywgJy0tYicsICctLWJhJywgJy0tYj0yJywgJy0tYmFkZ2UgNSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGJhZGdlcj1GYWxzZSwgYmE9Tm9uZSkpLAorICAgICAgICAoJy0tYmEgWCcsIE5TKGJhZGdlcj1GYWxzZSwgYmE9J1gnKSksCisgICAgICAgICgnLS1iYT1YJywgTlMoYmFkZ2VyPUZhbHNlLCBiYT0nWCcpKSwKKyAgICAgICAgKCctLWJhZCcsIE5TKGJhZGdlcj1UcnVlLCBiYT1Ob25lKSksCisgICAgICAgICgnLS1iYWRnJywgTlMoYmFkZ2VyPVRydWUsIGJhPU5vbmUpKSwKKyAgICAgICAgKCctLWJhZGdlJywgTlMoYmFkZ2VyPVRydWUsIGJhPU5vbmUpKSwKKyAgICAgICAgKCctLWJhZGdlcicsIE5TKGJhZGdlcj1UcnVlLCBiYT1Ob25lKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNTaW5nbGVEb3VibGVEYXNoKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGFuIE9wdGlvbmFsIHdpdGggc2luZ2xlLSBhbmQgZG91YmxlLWRhc2ggb3B0aW9uIHN0cmluZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLWYnLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICAgICAgU2lnKCctLWJhcicpLAorICAgICAgICBTaWcoJy1iYXonLCBhY3Rpb249J3N0b3JlX2NvbnN0JywgY29uc3Q9NDIpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLS1iYXInLCAnLWZiYXInLCAnLWZiYXonLCAnLWJhemYnLCAnLWIgQicsICdCJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZj1GYWxzZSwgYmFyPU5vbmUsIGJhej1Ob25lKSksCisgICAgICAgICgnLWYnLCBOUyhmPVRydWUsIGJhcj1Ob25lLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJy0tYmEgQicsIE5TKGY9RmFsc2UsIGJhcj0nQicsIGJhej1Ob25lKSksCisgICAgICAgICgnLWYgLS1iYXIgQicsIE5TKGY9VHJ1ZSwgYmFyPSdCJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCctZiAtYicsIE5TKGY9VHJ1ZSwgYmFyPU5vbmUsIGJhej00MikpLAorICAgICAgICAoJy1iYSAtZicsIE5TKGY9VHJ1ZSwgYmFyPU5vbmUsIGJhej00MikpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzQWx0ZXJuYXRlUHJlZml4Q2hhcnMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYW4gT3B0aW9uYWwgd2l0aCBvcHRpb24gc3RyaW5ncyB3aXRoIGN1c3RvbSBwcmVmaXhlcyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcmVmaXhfY2hhcnM9Jys6LycsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnK2YnLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICAgICAgU2lnKCc6OmJhcicpLAorICAgICAgICBTaWcoJy9iYXonLCBhY3Rpb249J3N0b3JlX2NvbnN0JywgY29uc3Q9NDIpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLS1iYXInLCAnLWZiYXInLCAnLWIgQicsICdCJywgJy1mJywgJy0tYmFyIEInLCAnLWJheicsICctaCcsICctLWhlbHAnLCAnK2gnLCAnOjpoZWxwJywgJy9oZWxwJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoZj1GYWxzZSwgYmFyPU5vbmUsIGJhej1Ob25lKSksCisgICAgICAgICgnK2YnLCBOUyhmPVRydWUsIGJhcj1Ob25lLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJzo6YmEgQicsIE5TKGY9RmFsc2UsIGJhcj0nQicsIGJhej1Ob25lKSksCisgICAgICAgICgnK2YgOjpiYXIgQicsIE5TKGY9VHJ1ZSwgYmFyPSdCJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCcrZiAvYicsIE5TKGY9VHJ1ZSwgYmFyPU5vbmUsIGJhej00MikpLAorICAgICAgICAoJy9iYSArZicsIE5TKGY9VHJ1ZSwgYmFyPU5vbmUsIGJhej00MikpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzQWx0ZXJuYXRlUHJlZml4Q2hhcnNBZGRlZEhlbHAoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIldoZW4gYGAtYGAgbm90IGluIHByZWZpeF9jaGFycywgZGVmYXVsdCBvcGVyYXRvcnMgY3JlYXRlZCBmb3IgaGVscAorICAgICAgIHNob3VsZCB1c2UgdGhlIHByZWZpeF9jaGFycyBpbiB1c2UgcmF0aGVyIHRoYW4gLSBvciAtLQorICAgICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU5NDQ0IiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByZWZpeF9jaGFycz0nKzovJywgYWRkX2hlbHA9VHJ1ZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJytmJywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgICAgIFNpZygnOjpiYXInKSwKKyAgICAgICAgU2lnKCcvYmF6JywgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PTQyKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy0tYmFyJywgJy1mYmFyJywgJy1iIEInLCAnQicsICctZicsICctLWJhciBCJywgJy1iYXonXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmPUZhbHNlLCBiYXI9Tm9uZSwgYmF6PU5vbmUpKSwKKyAgICAgICAgKCcrZicsIE5TKGY9VHJ1ZSwgYmFyPU5vbmUsIGJhej1Ob25lKSksCisgICAgICAgICgnOjpiYSBCJywgTlMoZj1GYWxzZSwgYmFyPSdCJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCcrZiA6OmJhciBCJywgTlMoZj1UcnVlLCBiYXI9J0InLCBiYXo9Tm9uZSkpLAorICAgICAgICAoJytmIC9iJywgTlMoZj1UcnVlLCBiYXI9Tm9uZSwgYmF6PTQyKSksCisgICAgICAgICgnL2JhICtmJywgTlMoZj1UcnVlLCBiYXI9Tm9uZSwgYmF6PTQyKSkKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FsdGVybmF0ZVByZWZpeENoYXJzTXVsdGlwbGVTaG9ydEFyZ3MoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlZlcmlmeSB0aGF0IE9wdGlvbmFscyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZWlyIGRlZmluZWQgcHJlZml4ZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJlZml4X2NoYXJzPScrLScsIGFkZF9oZWxwPUZhbHNlKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICAgICAgU2lnKCcreScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgICAgICBTaWcoJyt6JywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWyctdycsCisgICAgICAgICAgICAgICAgJy14eXonLAorICAgICAgICAgICAgICAgICcreCcsCisgICAgICAgICAgICAgICAgJy15JywKKyAgICAgICAgICAgICAgICAnK3h5eicsCisgICAgXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PUZhbHNlLCB5PUZhbHNlLCB6PUZhbHNlKSksCisgICAgICAgICgnLXgnLCBOUyh4PVRydWUsIHk9RmFsc2UsIHo9RmFsc2UpKSwKKyAgICAgICAgKCcreSAteCcsIE5TKHg9VHJ1ZSwgeT1UcnVlLCB6PUZhbHNlKSksCisgICAgICAgICgnK3l6IC14JywgTlMoeD1UcnVlLCB5PVRydWUsIHo9VHJ1ZSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzU2hvcnRMb25nKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgY29tYmluYXRpb24gb2Ygc2luZ2xlLSBhbmQgZG91YmxlLWRhc2ggb3B0aW9uIHN0cmluZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXYnLCAnLS12ZXJib3NlJywgJy1uJywgJy0tbm9pc3knLCBhY3Rpb249J3N0b3JlX3RydWUnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy0teCAtLXZlcmJvc2UnLCAnLU4nLCAnYScsICctdiB4J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlModmVyYm9zZT1GYWxzZSkpLAorICAgICAgICAoJy12JywgTlModmVyYm9zZT1UcnVlKSksCisgICAgICAgICgnLS12ZXJib3NlJywgTlModmVyYm9zZT1UcnVlKSksCisgICAgICAgICgnLW4nLCBOUyh2ZXJib3NlPVRydWUpKSwKKyAgICAgICAgKCctLW5vaXN5JywgTlModmVyYm9zZT1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNEZXN0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB2YXJpb3VzIG1lYW5zIG9mIHNldHRpbmcgZGVzdGluYXRpb24iIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctLWZvby1iYXInKSwgU2lnKCctLWJheicsIGRlc3Q9J3phYmJheicpXQorICAgIGZhaWx1cmVzID0gWydhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLS1mb28tYmFyIGYnLCBOUyhmb29fYmFyPSdmJywgemFiYmF6PU5vbmUpKSwKKyAgICAgICAgKCctLWJheiBnJywgTlMoZm9vX2Jhcj1Ob25lLCB6YWJiYXo9J2cnKSksCisgICAgICAgICgnLS1mb28tYmFyIGggLS1iYXogaScsIE5TKGZvb19iYXI9J2gnLCB6YWJiYXo9J2knKSksCisgICAgICAgICgnLS1iYXogaiAtLWZvby1iYXIgaycsIE5TKGZvb19iYXI9J2snLCB6YWJiYXo9J2onKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNEZWZhdWx0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBzcGVjaWZ5aW5nIGEgZGVmYXVsdCBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCcteCcpLCBTaWcoJy15JywgZGVmYXVsdD00MildCisgICAgZmFpbHVyZXMgPSBbJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUsIHk9NDIpKSwKKyAgICAgICAgKCcteHgnLCBOUyh4PSd4JywgeT00MikpLAorICAgICAgICAoJy15eScsIE5TKHg9Tm9uZSwgeT0neScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc05hcmdzRGVmYXVsdChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgbm90IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBhcmdzIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy14JyldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLXgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUpKSwKKyAgICAgICAgKCcteCBhJywgTlMoeD0nYScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc05hcmdzMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgc3BlY2lmeWluZyB0aGUgMSBhcmcgZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLXgnLCBuYXJncz0xKV0KKyAgICBmYWlsdXJlcyA9IFsnYScsICcteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSkpLAorICAgICAgICAoJy14IGEnLCBOUyh4PVsnYSddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNOYXJnczMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHNwZWNpZnlpbmcgdGhlIDMgYXJncyBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCcteCcsIG5hcmdzPTMpXQorICAgIGZhaWx1cmVzID0gWydhJywgJy14JywgJy14IGEnLCAnLXggYSBiJywgJ2EgLXgnLCAnYSAteCBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lKSksCisgICAgICAgICgnLXggYSBiIGMnLCBOUyh4PVsnYScsICdiJywgJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzTmFyZ3NPcHRpb25hbChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgc3BlY2lmeWluZyBhbiBPcHRpb25hbCBhcmcgZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy13JywgbmFyZ3M9Jz8nKSwKKyAgICAgICAgU2lnKCcteCcsIG5hcmdzPSc/JywgY29uc3Q9NDIpLAorICAgICAgICBTaWcoJy15JywgbmFyZ3M9Jz8nLCBkZWZhdWx0PSdzcGFtJyksCisgICAgICAgIFNpZygnLXonLCBuYXJncz0nPycsIHR5cGU9aW50LCBjb25zdD0nNDInLCBkZWZhdWx0PSc4NCcpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnMiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHc9Tm9uZSwgeD1Ob25lLCB5PSdzcGFtJywgej04NCkpLAorICAgICAgICAoJy13JywgTlModz1Ob25lLCB4PU5vbmUsIHk9J3NwYW0nLCB6PTg0KSksCisgICAgICAgICgnLXcgMicsIE5TKHc9JzInLCB4PU5vbmUsIHk9J3NwYW0nLCB6PTg0KSksCisgICAgICAgICgnLXgnLCBOUyh3PU5vbmUsIHg9NDIsIHk9J3NwYW0nLCB6PTg0KSksCisgICAgICAgICgnLXggMicsIE5TKHc9Tm9uZSwgeD0nMicsIHk9J3NwYW0nLCB6PTg0KSksCisgICAgICAgICgnLXknLCBOUyh3PU5vbmUsIHg9Tm9uZSwgeT1Ob25lLCB6PTg0KSksCisgICAgICAgICgnLXkgMicsIE5TKHc9Tm9uZSwgeD1Ob25lLCB5PScyJywgej04NCkpLAorICAgICAgICAoJy16JywgTlModz1Ob25lLCB4PU5vbmUsIHk9J3NwYW0nLCB6PTQyKSksCisgICAgICAgICgnLXogMicsIE5TKHc9Tm9uZSwgeD1Ob25lLCB5PSdzcGFtJywgej0yKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNOYXJnc1plcm9Pck1vcmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHNwZWNpZnlpbmcgYW4gYXJncyBmb3IgYW4gT3B0aW9uYWwgdGhhdCBhY2NlcHRzIHplcm8gb3IgbW9yZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIG5hcmdzPScqJyksCisgICAgICAgIFNpZygnLXknLCBuYXJncz0nKicsIGRlZmF1bHQ9J3NwYW0nKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUsIHk9J3NwYW0nKSksCisgICAgICAgICgnLXgnLCBOUyh4PVtdLCB5PSdzcGFtJykpLAorICAgICAgICAoJy14IGEnLCBOUyh4PVsnYSddLCB5PSdzcGFtJykpLAorICAgICAgICAoJy14IGEgYicsIE5TKHg9WydhJywgJ2InXSwgeT0nc3BhbScpKSwKKyAgICAgICAgKCcteScsIE5TKHg9Tm9uZSwgeT1bXSkpLAorICAgICAgICAoJy15IGEnLCBOUyh4PU5vbmUsIHk9WydhJ10pKSwKKyAgICAgICAgKCcteSBhIGInLCBOUyh4PU5vbmUsIHk9WydhJywgJ2InXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzTmFyZ3NPbmVPck1vcmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHNwZWNpZnlpbmcgYW4gYXJncyBmb3IgYW4gT3B0aW9uYWwgdGhhdCBhY2NlcHRzIG9uZSBvciBtb3JlIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgbmFyZ3M9JysnKSwKKyAgICAgICAgU2lnKCcteScsIG5hcmdzPScrJywgZGVmYXVsdD0nc3BhbScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnYScsICcteCcsICcteScsICdhIC14JywgJ2EgLXkgYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSwgeT0nc3BhbScpKSwKKyAgICAgICAgKCcteCBhJywgTlMoeD1bJ2EnXSwgeT0nc3BhbScpKSwKKyAgICAgICAgKCcteCBhIGInLCBOUyh4PVsnYScsICdiJ10sIHk9J3NwYW0nKSksCisgICAgICAgICgnLXkgYScsIE5TKHg9Tm9uZSwgeT1bJ2EnXSkpLAorICAgICAgICAoJy15IGEgYicsIE5TKHg9Tm9uZSwgeT1bJ2EnLCAnYiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNDaG9pY2VzKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBzcGVjaWZ5aW5nIHRoZSBjaG9pY2VzIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctZicsIGNob2ljZXM9J2FiYycpLAorICAgICAgICBTaWcoJy1nJywgdHlwZT1pbnQsIGNob2ljZXM9cmFuZ2UoNSkpXQorICAgIGZhaWx1cmVzID0gWydhJywgJy1mIGQnLCAnLWZhZCcsICctZ2EnLCAnLWcgNiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGY9Tm9uZSwgZz1Ob25lKSksCisgICAgICAgICgnLWYgYScsIE5TKGY9J2EnLCBnPU5vbmUpKSwKKyAgICAgICAgKCctZiBjJywgTlMoZj0nYycsIGc9Tm9uZSkpLAorICAgICAgICAoJy1nIDAnLCBOUyhmPU5vbmUsIGc9MCkpLAorICAgICAgICAoJy1nIDAzJywgTlMoZj1Ob25lLCBnPTMpKSwKKyAgICAgICAgKCctZmIgLWc0JywgTlMoZj0nYicsIGc9NCkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzUmVxdWlyZWQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoZSBhbiBvcHRpb25hbCBhY3Rpb24gdGhhdCBpcyByZXF1aXJlZCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIHR5cGU9aW50LCByZXF1aXJlZD1UcnVlKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLXggMScsIE5TKHg9MSkpLAorICAgICAgICAoJy14NDInLCBOUyh4PTQyKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBY3Rpb25TdG9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhlIHN0b3JlIGFjdGlvbiBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCcteCcsIGFjdGlvbj0nc3RvcmUnKV0KKyAgICBmYWlsdXJlcyA9IFsnYScsICdhIC14J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lKSksCisgICAgICAgICgnLXhmb28nLCBOUyh4PSdmb28nKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBY3Rpb25TdG9yZUNvbnN0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGUgc3RvcmVfY29uc3QgYWN0aW9uIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy15JywgYWN0aW9uPSdzdG9yZV9jb25zdCcsIGNvbnN0PW9iamVjdCldCisgICAgZmFpbHVyZXMgPSBbJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh5PU5vbmUpKSwKKyAgICAgICAgKCcteScsIE5TKHk9b2JqZWN0KSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBY3Rpb25TdG9yZUZhbHNlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGUgc3RvcmVfZmFsc2UgYWN0aW9uIGZvciBhbiBPcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy16JywgYWN0aW9uPSdzdG9yZV9mYWxzZScpXQorICAgIGZhaWx1cmVzID0gWydhJywgJy16YScsICcteiBhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoej1UcnVlKSksCisgICAgICAgICgnLXonLCBOUyh6PUZhbHNlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBY3Rpb25TdG9yZVRydWUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoZSBzdG9yZV90cnVlIGFjdGlvbiBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctLWFwcGxlJywgYWN0aW9uPSdzdG9yZV90cnVlJyldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLS1hcHBsZT1iJywgJy0tYXBwbGUgYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGFwcGxlPUZhbHNlKSksCisgICAgICAgICgnLS1hcHBsZScsIE5TKGFwcGxlPVRydWUpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvbkFwcGVuZChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhlIGFwcGVuZCBhY3Rpb24gZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLS1iYXonLCBhY3Rpb249J2FwcGVuZCcpXQorICAgIGZhaWx1cmVzID0gWydhJywgJy0tYmF6JywgJ2EgLS1iYXonLCAnLS1iYXogYSBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoYmF6PU5vbmUpKSwKKyAgICAgICAgKCctLWJheiBhJywgTlMoYmF6PVsnYSddKSksCisgICAgICAgICgnLS1iYXogYSAtLWJheiBiJywgTlMoYmF6PVsnYScsICdiJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE9wdGlvbmFsc0FjdGlvbkFwcGVuZFdpdGhEZWZhdWx0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGUgYXBwZW5kIGFjdGlvbiBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctLWJheicsIGFjdGlvbj0nYXBwZW5kJywgZGVmYXVsdD1bJ1gnXSldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLS1iYXonLCAnYSAtLWJheicsICctLWJheiBhIGInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhiYXo9WydYJ10pKSwKKyAgICAgICAgKCctLWJheiBhJywgTlMoYmF6PVsnWCcsICdhJ10pKSwKKyAgICAgICAgKCctLWJheiBhIC0tYmF6IGInLCBOUyhiYXo9WydYJywgJ2EnLCAnYiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBY3Rpb25BcHBlbmRDb25zdChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhlIGFwcGVuZF9jb25zdCBhY3Rpb24gZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy1iJywgYWN0aW9uPSdhcHBlbmRfY29uc3QnLCBjb25zdD1FeGNlcHRpb24pLAorICAgICAgICBTaWcoJy1jJywgYWN0aW9uPSdhcHBlbmQnLCBkZXN0PSdiJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWydhJywgJy1jJywgJ2EgLWMnLCAnLWJ4JywgJy1iIHgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhiPU5vbmUpKSwKKyAgICAgICAgKCctYicsIE5TKGI9W0V4Y2VwdGlvbl0pKSwKKyAgICAgICAgKCctYiAtY3ggLWIgLWN5eicsIE5TKGI9W0V4Y2VwdGlvbiwgJ3gnLCBFeGNlcHRpb24sICd5eiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25hbHNBY3Rpb25BcHBlbmRDb25zdFdpdGhEZWZhdWx0KFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB0aGUgYXBwZW5kX2NvbnN0IGFjdGlvbiBmb3IgYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLWInLCBhY3Rpb249J2FwcGVuZF9jb25zdCcsIGNvbnN0PUV4Y2VwdGlvbiwgZGVmYXVsdD1bJ1gnXSksCisgICAgICAgIFNpZygnLWMnLCBhY3Rpb249J2FwcGVuZCcsIGRlc3Q9J2InKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLWMnLCAnYSAtYycsICctYngnLCAnLWIgeCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGI9WydYJ10pKSwKKyAgICAgICAgKCctYicsIE5TKGI9WydYJywgRXhjZXB0aW9uXSkpLAorICAgICAgICAoJy1iIC1jeCAtYiAtY3l6JywgTlMoYj1bJ1gnLCBFeGNlcHRpb24sICd4JywgRXhjZXB0aW9uLCAneXonXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzQWN0aW9uQ291bnQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoZSBjb3VudCBhY3Rpb24gZm9yIGFuIE9wdGlvbmFsIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnLXgnLCBhY3Rpb249J2NvdW50JyldCisgICAgZmFpbHVyZXMgPSBbJ2EnLCAnLXggYScsICcteCBiJywgJy14IGEgLXggYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSkpLAorICAgICAgICAoJy14JywgTlMoeD0xKSksCisgICAgXQorCisKKyMgPT09PT09PT09PT09PT09PQorIyBQb3NpdGlvbmFsIHRlc3RzCisjID09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NOb25lKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB0aGF0IGRvZXNuJ3Qgc3BlY2lmeSBuYXJncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLXgnLCAnYSBiJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYScsIE5TKGZvbz0nYScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3MxKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB0aGF0IHNwZWNpZmllcyBhbiBuYXJncyBvZiAxIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9MSldCisgICAgZmFpbHVyZXMgPSBbJycsICcteCcsICdhIGInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPVsnYSddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzMihQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgdGhhdCBzcGVjaWZpZXMgYW4gbmFyZ3Mgb2YgMiIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPTIpXQorICAgIGZhaWx1cmVzID0gWycnLCAnYScsICcteCcsICdhIGIgYyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYicsIE5TKGZvbz1bJ2EnLCAnYiddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzWmVyb09yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgdGhhdCBzcGVjaWZpZXMgdW5saW1pdGVkIG5hcmdzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9JyonKV0KKyAgICBmYWlsdXJlcyA9IFsnLXgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmb289W10pKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPVsnYSddKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPVsnYScsICdiJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NaZXJvT3JNb3JlRGVmYXVsdChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgdGhhdCBzcGVjaWZpZXMgdW5saW1pdGVkIG5hcmdzIGFuZCBhIGRlZmF1bHQiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nKicsIGRlZmF1bHQ9J2JhcicpXQorICAgIGZhaWx1cmVzID0gWycteCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz0nYmFyJykpLAorICAgICAgICAoJ2EnLCBOUyhmb289WydhJ10pKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJywgJ2InXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09uZU9yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgdGhhdCBzcGVjaWZpZXMgb25lIG9yIG1vcmUgbmFyZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nKycpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLXgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPVsnYSddKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPVsnYScsICdiJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NPcHRpb25hbChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgYW4gT3B0aW9uYWwgUG9zaXRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPSc/JyldCisgICAgZmFpbHVyZXMgPSBbJy14JywgJ2EgYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz1Ob25lKSksCisgICAgICAgICgnYScsIE5TKGZvbz0nYScpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NPcHRpb25hbERlZmF1bHQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGFuIE9wdGlvbmFsIFBvc2l0aW9uYWwgd2l0aCBhIGRlZmF1bHQgdmFsdWUiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nPycsIGRlZmF1bHQ9NDIpXQorICAgIGZhaWx1cmVzID0gWycteCcsICdhIGInXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmb289NDIpKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsQ29udmVydGVkRGVmYXVsdChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgYW4gT3B0aW9uYWwgUG9zaXRpb25hbCB3aXRoIGEgZGVmYXVsdCB2YWx1ZQorICAgIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgorICAgICIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCdmb28nLCBuYXJncz0nPycsIHR5cGU9aW50LCBkZWZhdWx0PSc0MicpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnYSBiJywgJzEgMiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz00MikpLAorICAgICAgICAoJzEnLCBOUyhmb289MSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc05vbmVOb25lKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHR3byBQb3NpdGlvbmFscyB0aGF0IGRvbid0IHNwZWNpZnkgbmFyZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nKSwgU2lnKCdiYXInKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy14JywgJ2EnLCAnYSBiIGMnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIGInLCBOUyhmb289J2EnLCBiYXI9J2InKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzTm9uZTEoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggbm8gbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggMSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycpLCBTaWcoJ2JhcicsIG5hcmdzPTEpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYScsICdhIGIgYyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnczJOb25lKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgUG9zaXRpb25hbCB3aXRoIDIgbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggbm9uZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPTIpLCBTaWcoJ2JhcicpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYScsICdhIGInLCAnYSBiIGMgZCddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPVsnYScsICdiJ10sIGJhcj0nYycpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NOb25lWmVyb09yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBubyBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCB1bmxpbWl0ZWQiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nKSwgU2lnKCdiYXInLCBuYXJncz0nKicpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJywgYmFyPVtdKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289J2EnLCBiYXI9WydiJywgJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc05vbmVPbmVPck1vcmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggbm8gbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggb25lIG9yIG1vcmUiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nKSwgU2lnKCdiYXInLCBuYXJncz0nKycpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSkpLAorICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPSdhJywgYmFyPVsnYicsICdjJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NOb25lT3B0aW9uYWwoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggbm8gbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggYW4gT3B0aW9uYWwiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nKSwgU2lnKCdiYXInLCBuYXJncz0nPycpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYSBiIGMnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJywgYmFyPU5vbmUpKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289J2EnLCBiYXI9J2InKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzWmVyb09yTW9yZU5vbmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggdW5saW1pdGVkIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIG5vbmUiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nKicpLCBTaWcoJ2JhcicpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPVtdLCBiYXI9J2EnKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPVsnYSddLCBiYXI9J2InKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289WydhJywgJ2InXSwgYmFyPSdjJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09uZU9yTW9yZU5vbmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggb25lIG9yIG1vcmUgbmFyZ3MgZm9sbG93ZWQgYnkgb25lIHdpdGggbm9uZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPScrJyksIFNpZygnYmFyJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiJywgTlMoZm9vPVsnYSddLCBiYXI9J2InKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289WydhJywgJ2InXSwgYmFyPSdjJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsTm9uZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBhbiBPcHRpb25hbCBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCBub25lIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9Jz8nLCBkZWZhdWx0PTQyKSwgU2lnKCdiYXInKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EgYiBjJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYScsIE5TKGZvbz00MiwgYmFyPSdhJykpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj0nYicpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3MyWmVyb09yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCAyIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIHVubGltaXRlZCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPTIpLCBTaWcoJ2JhcicsIG5hcmdzPScqJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiJywgTlMoZm9vPVsnYScsICdiJ10sIGJhcj1bXSkpLAorICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPVsnYScsICdiJ10sIGJhcj1bJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnczJPbmVPck1vcmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggMiBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCBvbmUgb3IgbW9yZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPTIpLCBTaWcoJ2JhcicsIG5hcmdzPScrJyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJywgJ2EgYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPVsnYScsICdiJ10sIGJhcj1bJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnczJPcHRpb25hbChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCAyIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSBvcHRpb25hbCIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPTIpLCBTaWcoJ2JhcicsIG5hcmdzPSc/JyldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJywgJ2EgYiBjIGQnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJywgJ2InXSwgYmFyPU5vbmUpKSwKKyAgICAgICAgKCdhIGIgYycsIE5TKGZvbz1bJ2EnLCAnYiddLCBiYXI9J2MnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzWmVyb09yTW9yZTEoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBQb3NpdGlvbmFsIHdpdGggdW5saW1pdGVkIG5hcmdzIGZvbGxvd2VkIGJ5IG9uZSB3aXRoIDEiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdmb28nLCBuYXJncz0nKicpLCBTaWcoJ2JhcicsIG5hcmdzPTEpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCBdCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EnLCBOUyhmb289W10sIGJhcj1bJ2EnXSkpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz1bJ2EnXSwgYmFyPVsnYiddKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289WydhJywgJ2InXSwgYmFyPVsnYyddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzT25lT3JNb3JlMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBvbmUgb3IgbW9yZSBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCAxIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9JysnKSwgU2lnKCdiYXInLCBuYXJncz0xKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhIGInLCBOUyhmb289WydhJ10sIGJhcj1bJ2InXSkpLAorICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPVsnYScsICdiJ10sIGJhcj1bJ2MnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsMShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIFBvc2l0aW9uYWwgd2l0aCBhbiBPcHRpb25hbCBuYXJncyBmb2xsb3dlZCBieSBvbmUgd2l0aCAxIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9Jz8nKSwgU2lnKCdiYXInLCBuYXJncz0xKV0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EgYiBjJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYScsIE5TKGZvbz1Ob25lLCBiYXI9WydhJ10pKSwKKyAgICAgICAgKCdhIGInLCBOUyhmb289J2EnLCBiYXI9WydiJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NOb25lWmVyb09yTW9yZTEoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhyZWUgUG9zaXRpb25hbHM6IG5vIG5hcmdzLCB1bmxpbWl0ZWQgbmFyZ3MgYW5kIDEgbmFyZ3MiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnZm9vJyksCisgICAgICAgIFNpZygnYmFyJywgbmFyZ3M9JyonKSwKKyAgICAgICAgU2lnKCdiYXonLCBuYXJncz0xKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVtdLCBiYXo9WydiJ10pKSwKKyAgICAgICAgKCdhIGIgYycsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSwgYmF6PVsnYyddKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc05hcmdzTm9uZU9uZU9yTW9yZTEoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhyZWUgUG9zaXRpb25hbHM6IG5vIG5hcmdzLCBvbmUgb3IgbW9yZSBuYXJncyBhbmQgMSBuYXJncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCdmb28nKSwKKyAgICAgICAgU2lnKCdiYXInLCBuYXJncz0nKycpLAorICAgICAgICBTaWcoJ2JheicsIG5hcmdzPTEpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnJywgJy0tZm9vJywgJ2EnLCAnYiddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPSdhJywgYmFyPVsnYiddLCBiYXo9WydjJ10pKSwKKyAgICAgICAgKCdhIGIgYyBkJywgTlMoZm9vPSdhJywgYmFyPVsnYicsICdjJ10sIGJhej1bJ2QnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc05vbmVPcHRpb25hbDEoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhyZWUgUG9zaXRpb25hbHM6IG5vIG5hcmdzLCBvcHRpb25hbCBuYXJnIGFuZCAxIG5hcmdzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2ZvbycpLAorICAgICAgICBTaWcoJ2JhcicsIG5hcmdzPSc/JywgZGVmYXVsdD0wLjYyNSksCisgICAgICAgIFNpZygnYmF6JywgbmFyZ3M9MSksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nLCAnYSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj0wLjYyNSwgYmF6PVsnYiddKSksCisgICAgICAgICgnYSBiIGMnLCBOUyhmb289J2EnLCBiYXI9J2InLCBiYXo9WydjJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NPcHRpb25hbE9wdGlvbmFsKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHR3byBvcHRpb25hbCBuYXJncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCdmb28nLCBuYXJncz0nPycpLAorICAgICAgICBTaWcoJ2JhcicsIG5hcmdzPSc/JywgZGVmYXVsdD00MiksCisgICAgXQorICAgIGZhaWx1cmVzID0gWyctLWZvbycsICdhIGIgYyddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKGZvbz1Ob25lLCBiYXI9NDIpKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJywgYmFyPTQyKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPSdiJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNOYXJnc09wdGlvbmFsWmVyb09yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbiBPcHRpb25hbCBuYXJnIGZvbGxvd2VkIGJ5IHVubGltaXRlZCBuYXJncyIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ2ZvbycsIG5hcmdzPSc/JyksIFNpZygnYmFyJywgbmFyZ3M9JyonKV0KKyAgICBmYWlsdXJlcyA9IFsnLS1mb28nXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmb289Tm9uZSwgYmFyPVtdKSksCisgICAgICAgICgnYScsIE5TKGZvbz0nYScsIGJhcj1bXSkpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSkpLAorICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPSdhJywgYmFyPVsnYicsICdjJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzTmFyZ3NPcHRpb25hbE9uZU9yTW9yZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhbiBPcHRpb25hbCBuYXJnIGZvbGxvd2VkIGJ5IG9uZSBvciBtb3JlIG5hcmdzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnZm9vJywgbmFyZ3M9Jz8nKSwgU2lnKCdiYXInLCBuYXJncz0nKycpXQorICAgIGZhaWx1cmVzID0gWycnLCAnLS1mb28nXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdhJywgTlMoZm9vPU5vbmUsIGJhcj1bJ2EnXSkpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSkpLAorICAgICAgICAoJ2EgYiBjJywgTlMoZm9vPSdhJywgYmFyPVsnYicsICdjJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFBvc2l0aW9uYWxzQ2hvaWNlc1N0cmluZyhQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIHNldCBvZiBzaW5nbGUtY2hhcmFjdGVyIGNob2ljZXMiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCdzcGFtJywgY2hvaWNlcz1zZXQoJ2FiY2RlZmcnKSldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdoJywgJzQyJywgJ2VmJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYScsIE5TKHNwYW09J2EnKSksCisgICAgICAgICgnZycsIE5TKHNwYW09J2cnKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQb3NpdGlvbmFsc0Nob2ljZXNJbnQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBzZXQgb2YgaW50ZWdlciBjaG9pY2VzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW1NpZygnc3BhbScsIHR5cGU9aW50LCBjaG9pY2VzPXJhbmdlKDIwKSldCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdoJywgJzQyJywgJ2VmJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnNCcsIE5TKHNwYW09NCkpLAorICAgICAgICAoJzE1JywgTlMoc3BhbT0xNSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0UG9zaXRpb25hbHNBY3Rpb25BcHBlbmQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlICdhcHBlbmQnIGFjdGlvbiIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCdzcGFtJywgYWN0aW9uPSdhcHBlbmQnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgYWN0aW9uPSdhcHBlbmQnLCBuYXJncz0yKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJycsICctLWZvbycsICdhJywgJ2EgYicsICdhIGIgYyBkJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSBiIGMnLCBOUyhzcGFtPVsnYScsIFsnYicsICdjJ11dKSksCisgICAgXQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ29tYmluZWQgb3B0aW9uYWxzIGFuZCBwb3NpdGlvbmFscyB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RPcHRpb25hbHNOdW1lcmljQW5kUG9zaXRpb25hbHMoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIG5lZ2F0aXZlIG51bWJlciBhcmdzIHdoZW4gbnVtZXJpYyBvcHRpb25zIGFyZSBwcmVzZW50IiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ3gnLCBuYXJncz0nPycpLAorICAgICAgICBTaWcoJy00JywgZGVzdD0neScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLTInLCAnLTMxNSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSwgeT1GYWxzZSkpLAorICAgICAgICAoJ2EnLCBOUyh4PSdhJywgeT1GYWxzZSkpLAorICAgICAgICAoJy00JywgTlMoeD1Ob25lLCB5PVRydWUpKSwKKyAgICAgICAgKCctNCBhJywgTlMoeD0nYScsIHk9VHJ1ZSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0T3B0aW9uYWxzQWxtb3N0TnVtZXJpY0FuZFBvc2l0aW9uYWxzKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBuZWdhdGl2ZSBudW1iZXIgYXJncyB3aGVuIGFsbW9zdCBudW1lcmljIG9wdGlvbnMgYXJlIHByZXNlbnQiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygneCcsIG5hcmdzPSc/JyksCisgICAgICAgIFNpZygnLWs0JywgZGVzdD0neScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLWszJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lLCB5PUZhbHNlKSksCisgICAgICAgICgnLTInLCBOUyh4PSctMicsIHk9RmFsc2UpKSwKKyAgICAgICAgKCdhJywgTlMoeD0nYScsIHk9RmFsc2UpKSwKKyAgICAgICAgKCctazQnLCBOUyh4PU5vbmUsIHk9VHJ1ZSkpLAorICAgICAgICAoJy1rNCBhJywgTlMoeD0nYScsIHk9VHJ1ZSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0RW1wdHlBbmRTcGFjZUNvbnRhaW5pbmdBcmd1bWVudHMoUGFyc2VyVGVzdENhc2UpOgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCd4JywgbmFyZ3M9Jz8nKSwKKyAgICAgICAgU2lnKCcteScsICctLXl5eScsIGRlc3Q9J3knKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy15J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgIChbJyddLCBOUyh4PScnLCB5PU5vbmUpKSwKKyAgICAgICAgKFsnYSBiYWRnZXInXSwgTlMoeD0nYSBiYWRnZXInLCB5PU5vbmUpKSwKKyAgICAgICAgKFsnLWEgYmFkZ2VyJ10sIE5TKHg9Jy1hIGJhZGdlcicsIHk9Tm9uZSkpLAorICAgICAgICAoWycteScsICcnXSwgTlMoeD1Ob25lLCB5PScnKSksCisgICAgICAgIChbJy15JywgJ2EgYmFkZ2VyJ10sIE5TKHg9Tm9uZSwgeT0nYSBiYWRnZXInKSksCisgICAgICAgIChbJy15JywgJy1hIGJhZGdlciddLCBOUyh4PU5vbmUsIHk9Jy1hIGJhZGdlcicpKSwKKyAgICAgICAgKFsnLS15eXk9YSBiYWRnZXInXSwgTlMoeD1Ob25lLCB5PSdhIGJhZGdlcicpKSwKKyAgICAgICAgKFsnLS15eXk9LWEgYmFkZ2VyJ10sIE5TKHg9Tm9uZSwgeT0nLWEgYmFkZ2VyJykpLAorICAgIF0KKworCitjbGFzcyBUZXN0UHJlZml4Q2hhcmFjdGVyT25seUFyZ3VtZW50cyhQYXJzZXJUZXN0Q2FzZSk6CisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByZWZpeF9jaGFycz0nLSsnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLScsIGRlc3Q9J3gnLCBuYXJncz0nPycsIGNvbnN0PSdiYWRnZXInKSwKKyAgICAgICAgU2lnKCcrJywgZGVzdD0neScsIHR5cGU9aW50LCBkZWZhdWx0PTQyKSwKKyAgICAgICAgU2lnKCctKy0nLCBkZXN0PSd6JywgYWN0aW9uPSdzdG9yZV90cnVlJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteScsICcrIC0nXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUsIHk9NDIsIHo9RmFsc2UpKSwKKyAgICAgICAgKCctJywgTlMoeD0nYmFkZ2VyJywgeT00Miwgej1GYWxzZSkpLAorICAgICAgICAoJy0gWCcsIE5TKHg9J1gnLCB5PTQyLCB6PUZhbHNlKSksCisgICAgICAgICgnKyAtMycsIE5TKHg9Tm9uZSwgeT0tMywgej1GYWxzZSkpLAorICAgICAgICAoJy0rLScsIE5TKHg9Tm9uZSwgeT00Miwgej1UcnVlKSksCisgICAgICAgICgnLSA9PT0nLCBOUyh4PSc9PT0nLCB5PTQyLCB6PUZhbHNlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3ROYXJnc1plcm9Pck1vcmUoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHNwZWNpZnlpbmcgYW4gYXJncyBmb3IgYW4gT3B0aW9uYWwgdGhhdCBhY2NlcHRzIHplcm8gb3IgbW9yZSIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJy14JywgbmFyZ3M9JyonKSwgU2lnKCd5JywgbmFyZ3M9JyonKV0KKyAgICBmYWlsdXJlcyA9IFtdCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJycsIE5TKHg9Tm9uZSwgeT1bXSkpLAorICAgICAgICAoJy14JywgTlMoeD1bXSwgeT1bXSkpLAorICAgICAgICAoJy14IGEnLCBOUyh4PVsnYSddLCB5PVtdKSksCisgICAgICAgICgnLXggYSAtLSBiJywgTlMoeD1bJ2EnXSwgeT1bJ2InXSkpLAorICAgICAgICAoJ2EnLCBOUyh4PU5vbmUsIHk9WydhJ10pKSwKKyAgICAgICAgKCdhIC14JywgTlMoeD1bXSwgeT1bJ2EnXSkpLAorICAgICAgICAoJ2EgLXggYicsIE5TKHg9WydiJ10sIHk9WydhJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdE5hcmdzUmVtYWluZGVyKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBzcGVjaWZ5aW5nIGEgcG9zaXRpb25hbCB3aXRoIG5hcmdzPVJFTUFJTkRFUiIiIgorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFtTaWcoJ3gnKSwgU2lnKCd5JywgbmFyZ3M9Jy4uLicpLCBTaWcoJy16JyldCisgICAgZmFpbHVyZXMgPSBbJycsICcteicsICcteiBaJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnWCcsIE5TKHg9J1gnLCB5PVtdLCB6PU5vbmUpKSwKKyAgICAgICAgKCcteiBaIFgnLCBOUyh4PSdYJywgeT1bXSwgej0nWicpKSwKKyAgICAgICAgKCdYIEEgQiAteiBaJywgTlMoeD0nWCcsIHk9WydBJywgJ0InLCAnLXonLCAnWiddLCB6PU5vbmUpKSwKKyAgICAgICAgKCdYIFkgLS1mb28nLCBOUyh4PSdYJywgeT1bJ1knLCAnLS1mb28nXSwgej1Ob25lKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RPcHRpb25MaWtlKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBvcHRpb25zIHRoYXQgbWF5IG9yIG1heSBub3QgYmUgYXJndW1lbnRzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1mbG9hdCksCisgICAgICAgIFNpZygnLTMnLCB0eXBlPWZsb2F0LCBkZXN0PSd5JyksCisgICAgICAgIFNpZygneicsIG5hcmdzPScqJyksCisgICAgXQorICAgIGZhaWx1cmVzID0gWycteCcsICcteTIuNScsICcteGEnLCAnLXggLWEnLAorICAgICAgICAgICAgICAgICcteCAtMycsICcteCAtMy41JywgJy0zIC0zLjUnLAorICAgICAgICAgICAgICAgICcteCAtMi41JywgJy14IC0yLjUgYScsICctMyAtLjUnLAorICAgICAgICAgICAgICAgICdhIHggLTEnLCAnLXggLTEgYScsICctMyAtMSBhJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnJywgTlMoeD1Ob25lLCB5PU5vbmUsIHo9W10pKSwKKyAgICAgICAgKCcteCAyLjUnLCBOUyh4PTIuNSwgeT1Ob25lLCB6PVtdKSksCisgICAgICAgICgnLXggMi41IGEnLCBOUyh4PTIuNSwgeT1Ob25lLCB6PVsnYSddKSksCisgICAgICAgICgnLTMuNScsIE5TKHg9Tm9uZSwgeT0wLjUsIHo9W10pKSwKKyAgICAgICAgKCctMy0uNScsIE5TKHg9Tm9uZSwgeT0tMC41LCB6PVtdKSksCisgICAgICAgICgnLTMgLjUnLCBOUyh4PU5vbmUsIHk9MC41LCB6PVtdKSksCisgICAgICAgICgnYSAtMy41JywgTlMoeD1Ob25lLCB5PTAuNSwgej1bJ2EnXSkpLAorICAgICAgICAoJ2EnLCBOUyh4PU5vbmUsIHk9Tm9uZSwgej1bJ2EnXSkpLAorICAgICAgICAoJ2EgLXggMScsIE5TKHg9MS4wLCB5PU5vbmUsIHo9WydhJ10pKSwKKyAgICAgICAgKCcteCAxIGEnLCBOUyh4PTEuMCwgeT1Ob25lLCB6PVsnYSddKSksCisgICAgICAgICgnLTMgMSBhJywgTlMoeD1Ob25lLCB5PTEuMCwgej1bJ2EnXSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0RGVmYXVsdFN1cHByZXNzKFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGFjdGlvbnMgd2l0aCBzdXBwcmVzc2VkIGRlZmF1bHRzIiIiCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2ZvbycsIG5hcmdzPSc/JywgZGVmYXVsdD1hcmdwYXJzZS5TVVBQUkVTUyksCisgICAgICAgIFNpZygnYmFyJywgbmFyZ3M9JyonLCBkZWZhdWx0PWFyZ3BhcnNlLlNVUFBSRVNTKSwKKyAgICAgICAgU2lnKCctLWJheicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9YXJncGFyc2UuU1VQUFJFU1MpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUygpKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJykpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSkpLAorICAgICAgICAoJy0tYmF6JywgTlMoYmF6PVRydWUpKSwKKyAgICAgICAgKCdhIC0tYmF6JywgTlMoZm9vPSdhJywgYmF6PVRydWUpKSwKKyAgICAgICAgKCctLWJheiBhIGInLCBOUyhmb289J2EnLCBiYXI9WydiJ10sIGJhej1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQYXJzZXJEZWZhdWx0U3VwcHJlc3MoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYWN0aW9ucyB3aXRoIGEgcGFyc2VyLWxldmVsIGRlZmF1bHQgb2YgU1VQUFJFU1MiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcoYXJndW1lbnRfZGVmYXVsdD1hcmdwYXJzZS5TVVBQUkVTUykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2ZvbycsIG5hcmdzPSc/JyksCisgICAgICAgIFNpZygnYmFyJywgbmFyZ3M9JyonKSwKKyAgICAgICAgU2lnKCctLWJheicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUygpKSwKKyAgICAgICAgKCdhJywgTlMoZm9vPSdhJykpLAorICAgICAgICAoJ2EgYicsIE5TKGZvbz0nYScsIGJhcj1bJ2InXSkpLAorICAgICAgICAoJy0tYmF6JywgTlMoYmF6PVRydWUpKSwKKyAgICAgICAgKCdhIC0tYmF6JywgTlMoZm9vPSdhJywgYmF6PVRydWUpKSwKKyAgICAgICAgKCctLWJheiBhIGInLCBOUyhmb289J2EnLCBiYXI9WydiJ10sIGJhej1UcnVlKSksCisgICAgXQorCisKK2NsYXNzIFRlc3RQYXJzZXJEZWZhdWx0NDIoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYWN0aW9ucyB3aXRoIGEgcGFyc2VyLWxldmVsIGRlZmF1bHQgb2YgNDIiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcoYXJndW1lbnRfZGVmYXVsdD00MiwgdmVyc2lvbj0nMS4wJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2ZvbycsIG5hcmdzPSc/JyksCisgICAgICAgIFNpZygnYmFyJywgbmFyZ3M9JyonKSwKKyAgICAgICAgU2lnKCctLWJheicsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCcnLCBOUyhmb289NDIsIGJhcj00MiwgYmF6PTQyKSksCisgICAgICAgICgnYScsIE5TKGZvbz0nYScsIGJhcj00MiwgYmF6PTQyKSksCisgICAgICAgICgnYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddLCBiYXo9NDIpKSwKKyAgICAgICAgKCctLWJheicsIE5TKGZvbz00MiwgYmFyPTQyLCBiYXo9VHJ1ZSkpLAorICAgICAgICAoJ2EgLS1iYXonLCBOUyhmb289J2EnLCBiYXI9NDIsIGJhej1UcnVlKSksCisgICAgICAgICgnLS1iYXogYSBiJywgTlMoZm9vPSdhJywgYmFyPVsnYiddLCBiYXo9VHJ1ZSkpLAorICAgIF0KKworCitjbGFzcyBUZXN0QXJndW1lbnRzRnJvbUZpbGUoVGVtcERpck1peGluLCBQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCByZWFkaW5nIGFyZ3VtZW50cyBmcm9tIGEgZmlsZSIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0QXJndW1lbnRzRnJvbUZpbGUsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgZmlsZV90ZXh0cyA9IFsKKyAgICAgICAgICAgICgnaGVsbG8nLCAnaGVsbG8gd29ybGQhXG4nKSwKKyAgICAgICAgICAgICgncmVjdXJzaXZlJywgJy1hXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdBXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICdAaGVsbG8nKSwKKyAgICAgICAgICAgICgnaW52YWxpZCcsICdAbm8tc3VjaC1wYXRoXG4nKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgcGF0aCwgdGV4dCBpbiBmaWxlX3RleHRzOgorICAgICAgICAgICAgZmlsZSA9IG9wZW4ocGF0aCwgJ3cnKQorICAgICAgICAgICAgZmlsZS53cml0ZSh0ZXh0KQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKGZyb21maWxlX3ByZWZpeF9jaGFycz0nQCcpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctYScpLAorICAgICAgICBTaWcoJ3gnKSwKKyAgICAgICAgU2lnKCd5JywgbmFyZ3M9JysnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJycsICctYicsICdYJywgJ0BpbnZhbGlkJywgJ0BtaXNzaW5nJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnWCBZJywgTlMoYT1Ob25lLCB4PSdYJywgeT1bJ1knXSkpLAorICAgICAgICAoJ1ggLWEgQSBZIFonLCBOUyhhPSdBJywgeD0nWCcsIHk9WydZJywgJ1onXSkpLAorICAgICAgICAoJ0BoZWxsbyBYJywgTlMoYT1Ob25lLCB4PSdoZWxsbyB3b3JsZCEnLCB5PVsnWCddKSksCisgICAgICAgICgnWCBAaGVsbG8nLCBOUyhhPU5vbmUsIHg9J1gnLCB5PVsnaGVsbG8gd29ybGQhJ10pKSwKKyAgICAgICAgKCctYSBCIEByZWN1cnNpdmUgWSBaJywgTlMoYT0nQScsIHg9J2hlbGxvIHdvcmxkIScsIHk9WydZJywgJ1onXSkpLAorICAgICAgICAoJ1ggQHJlY3Vyc2l2ZSBaIC1hIEInLCBOUyhhPSdCJywgeD0nWCcsIHk9WydoZWxsbyB3b3JsZCEnLCAnWiddKSksCisgICAgICAgIChbIi1hIiwgIiIsICJYIiwgIlkiXSwgTlMoYT0nJywgeD0nWCcsIHk9WydZJ10pKSwKKyAgICBdCisKKworY2xhc3MgVGVzdEFyZ3VtZW50c0Zyb21GaWxlQ29udmVydGVyKFRlbXBEaXJNaXhpbiwgUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgcmVhZGluZyBhcmd1bWVudHMgZnJvbSBhIGZpbGUiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdEFyZ3VtZW50c0Zyb21GaWxlQ29udmVydGVyLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIGZpbGVfdGV4dHMgPSBbCisgICAgICAgICAgICAoJ2hlbGxvJywgJ2hlbGxvIHdvcmxkIVxuJyksCisgICAgICAgIF0KKyAgICAgICAgZm9yIHBhdGgsIHRleHQgaW4gZmlsZV90ZXh0czoKKyAgICAgICAgICAgIGZpbGUgPSBvcGVuKHBhdGgsICd3JykKKyAgICAgICAgICAgIGZpbGUud3JpdGUodGV4dCkKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorCisgICAgY2xhc3MgRnJvbUZpbGVDb252ZXJ0ZXJBcmd1bWVudFBhcnNlcihFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcik6CisKKyAgICAgICAgZGVmIGNvbnZlcnRfYXJnX2xpbmVfdG9fYXJncyhzZWxmLCBhcmdfbGluZSk6CisgICAgICAgICAgICBmb3IgYXJnIGluIGFyZ19saW5lLnNwbGl0KCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGFyZy5zdHJpcCgpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHlpZWxkIGFyZworICAgIHBhcnNlcl9jbGFzcyA9IEZyb21GaWxlQ29udmVydGVyQXJndW1lbnRQYXJzZXIKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKGZyb21maWxlX3ByZWZpeF9jaGFycz0nQCcpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCd5JywgbmFyZ3M9JysnKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdAaGVsbG8gWCcsIE5TKHk9WydoZWxsbycsICd3b3JsZCEnLCAnWCddKSksCisgICAgXQorCisKKyMgPT09PT09PT09PT09PT09PT09PT09CisjIFR5cGUgY29udmVyc2lvbiB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEZpbGVUeXBlUmVwcihUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yKHNlbGYpOgorICAgICAgICB0eXBlID0gYXJncGFyc2UuRmlsZVR5cGUoJ3InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJGaWxlVHlwZSgncicpIiwgcmVwcih0eXBlKSkKKworICAgIGRlZiB0ZXN0X3diXzEoc2VsZik6CisgICAgICAgIHR5cGUgPSBhcmdwYXJzZS5GaWxlVHlwZSgnd2InLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJGaWxlVHlwZSgnd2InLCAxKSIsIHJlcHIodHlwZSkpCisKKworY2xhc3MgUkZpbGUob2JqZWN0KToKKyAgICBzZWVuID0ge30KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorCisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgb3RoZXIgaW4gc2VsZi5zZWVuOgorICAgICAgICAgICAgdGV4dCA9IHNlbGYuc2VlbltvdGhlcl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRleHQgPSBzZWxmLnNlZW5bb3RoZXJdID0gb3RoZXIucmVhZCgpCisgICAgICAgICAgICBvdGhlci5jbG9zZSgpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHRleHQsIHN0cik6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSA9PSBvdGhlci5uYW1lID09IHRleHQKKworCitjbGFzcyBUZXN0RmlsZVR5cGVSKFRlbXBEaXJNaXhpbiwgUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIEZpbGVUeXBlIG9wdGlvbi9hcmd1bWVudCB0eXBlIGZvciByZWFkaW5nIGZpbGVzIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKFRlc3RGaWxlVHlwZVIsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgZm9yIGZpbGVfbmFtZSBpbiBbJ2ZvbycsICdiYXInXToKKyAgICAgICAgICAgIGZpbGUgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLnRlbXBfZGlyLCBmaWxlX25hbWUpLCAndycpCisgICAgICAgICAgICBmaWxlLndyaXRlKGZpbGVfbmFtZSkKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLmNyZWF0ZV9yZWFkb25seV9maWxlKCdyZWFkb25seScpCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgpKSwKKyAgICAgICAgU2lnKCdzcGFtJywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy14JywgJy14IGJhcicsICdub24tZXhpc3RlbnQtZmlsZS50eHQnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdmb28nLCBOUyh4PU5vbmUsIHNwYW09UkZpbGUoJ2ZvbycpKSksCisgICAgICAgICgnLXggZm9vIGJhcicsIE5TKHg9UkZpbGUoJ2ZvbycpLCBzcGFtPVJGaWxlKCdiYXInKSkpLAorICAgICAgICAoJ2JhciAteCBmb28nLCBOUyh4PVJGaWxlKCdmb28nKSwgc3BhbT1SRmlsZSgnYmFyJykpKSwKKyAgICAgICAgKCcteCAtIC0nLCBOUyh4PXN5cy5zdGRpbiwgc3BhbT1zeXMuc3RkaW4pKSwKKyAgICAgICAgKCdyZWFkb25seScsIE5TKHg9Tm9uZSwgc3BhbT1SRmlsZSgncmVhZG9ubHknKSkpLAorICAgIF0KKworY2xhc3MgVGVzdEZpbGVUeXBlRGVmYXVsdHMoVGVtcERpck1peGluLCBQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IGEgZmlsZSBpcyBub3QgY3JlYXRlZCB1bmxlc3MgdGhlIGRlZmF1bHQgaXMgbmVlZGVkIiIiCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0RmlsZVR5cGVEZWZhdWx0cywgc2VsZikuc2V0VXAoKQorICAgICAgICBmaWxlID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi50ZW1wX2RpciwgJ2dvb2QnKSwgJ3cnKQorICAgICAgICBmaWxlLndyaXRlKCdnb29kJykKKyAgICAgICAgZmlsZS5jbG9zZSgpCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy1jJywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLCBkZWZhdWx0PSduby1maWxlLnR4dCcpLAorICAgIF0KKyAgICAjIHNob3VsZCBwcm92b2tlIG5vIHN1Y2ggZmlsZSBlcnJvcgorICAgIGZhaWx1cmVzID0gWycnXQorICAgICMgc2hvdWxkIG5vdCBwcm92b2tlIGVycm9yIGJlY2F1c2UgZGVmYXVsdCBmaWxlIGlzIGNyZWF0ZWQKKyAgICBzdWNjZXNzZXMgPSBbKCctYyBnb29kJywgTlMoYz1SRmlsZSgnZ29vZCcpKSldCisKKworY2xhc3MgVGVzdEZpbGVUeXBlUkIoVGVtcERpck1peGluLCBQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGUgRmlsZVR5cGUgb3B0aW9uL2FyZ3VtZW50IHR5cGUgZm9yIHJlYWRpbmcgZmlsZXMiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdEZpbGVUeXBlUkIsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgZm9yIGZpbGVfbmFtZSBpbiBbJ2ZvbycsICdiYXInXToKKyAgICAgICAgICAgIGZpbGUgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLnRlbXBfZGlyLCBmaWxlX25hbWUpLCAndycpCisgICAgICAgICAgICBmaWxlLndyaXRlKGZpbGVfbmFtZSkKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3JiJykpLAorICAgICAgICBTaWcoJ3NwYW0nLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyYicpKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbJy14JywgJy14IGJhciddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2ZvbycsIE5TKHg9Tm9uZSwgc3BhbT1SRmlsZSgnZm9vJykpKSwKKyAgICAgICAgKCcteCBmb28gYmFyJywgTlMoeD1SRmlsZSgnZm9vJyksIHNwYW09UkZpbGUoJ2JhcicpKSksCisgICAgICAgICgnYmFyIC14IGZvbycsIE5TKHg9UkZpbGUoJ2ZvbycpLCBzcGFtPVJGaWxlKCdiYXInKSkpLAorICAgICAgICAoJy14IC0gLScsIE5TKHg9c3lzLnN0ZGluLCBzcGFtPXN5cy5zdGRpbikpLAorICAgIF0KKworCitjbGFzcyBXRmlsZShvYmplY3QpOgorICAgIHNlZW4gPSBzZXQoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBvdGhlciBub3QgaW4gc2VsZi5zZWVuOgorICAgICAgICAgICAgdGV4dCA9ICdDaGVjayB0aGF0IGZpbGUgaXMgd3JpdGFibGUuJworICAgICAgICAgICAgaWYgJ2InIGluIG90aGVyLm1vZGU6CisgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuZW5jb2RlKCdhc2NpaScpCisgICAgICAgICAgICBvdGhlci53cml0ZSh0ZXh0KQorICAgICAgICAgICAgb3RoZXIuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5zZWVuLmFkZChvdGhlcikKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZSA9PSBvdGhlci5uYW1lCisKKworQHVuaXR0ZXN0LnNraXBJZihoYXNhdHRyKG9zLCAnZ2V0ZXVpZCcpIGFuZCBvcy5nZXRldWlkKCkgPT0gMCwKKyAgICAgICAgICAgICAgICAgIm5vbi1yb290IHVzZXIgcmVxdWlyZWQiKQorY2xhc3MgVGVzdEZpbGVUeXBlVyhUZW1wRGlyTWl4aW4sIFBhcnNlclRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBGaWxlVHlwZSBvcHRpb24vYXJndW1lbnQgdHlwZSBmb3Igd3JpdGluZyBmaWxlcyIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0RmlsZVR5cGVXLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYuY3JlYXRlX3JlYWRvbmx5X2ZpbGUoJ3JlYWRvbmx5JykKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3JykpLAorICAgICAgICBTaWcoJ3NwYW0nLCB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3JykpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnLXggYmFyJ10KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnLXggYmFyJywgJ3JlYWRvbmx5J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnZm9vJywgTlMoeD1Ob25lLCBzcGFtPVdGaWxlKCdmb28nKSkpLAorICAgICAgICAoJy14IGZvbyBiYXInLCBOUyh4PVdGaWxlKCdmb28nKSwgc3BhbT1XRmlsZSgnYmFyJykpKSwKKyAgICAgICAgKCdiYXIgLXggZm9vJywgTlMoeD1XRmlsZSgnZm9vJyksIHNwYW09V0ZpbGUoJ2JhcicpKSksCisgICAgICAgICgnLXggLSAtJywgTlMoeD1zeXMuc3Rkb3V0LCBzcGFtPXN5cy5zdGRvdXQpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdEZpbGVUeXBlV0IoVGVtcERpck1peGluLCBQYXJzZXJUZXN0Q2FzZSk6CisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgnd2InKSksCisgICAgICAgIFNpZygnc3BhbScsIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3diJykpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFsnLXgnLCAnLXggYmFyJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnZm9vJywgTlMoeD1Ob25lLCBzcGFtPVdGaWxlKCdmb28nKSkpLAorICAgICAgICAoJy14IGZvbyBiYXInLCBOUyh4PVdGaWxlKCdmb28nKSwgc3BhbT1XRmlsZSgnYmFyJykpKSwKKyAgICAgICAgKCdiYXIgLXggZm9vJywgTlMoeD1XRmlsZSgnZm9vJyksIHNwYW09V0ZpbGUoJ2JhcicpKSksCisgICAgICAgICgnLXggLSAtJywgTlMoeD1zeXMuc3Rkb3V0LCBzcGFtPXN5cy5zdGRvdXQpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFR5cGVDYWxsYWJsZShQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzb21lIGNhbGxhYmxlcyBhcyBvcHRpb24vYXJndW1lbnQgdHlwZXMiIiIKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1lZ2dzJywgdHlwZT1jb21wbGV4KSwKKyAgICAgICAgU2lnKCdzcGFtJywgdHlwZT1mbG9hdCksCisgICAgXQorICAgIGZhaWx1cmVzID0gWydhJywgJzQyaicsICctLWVnZ3MgYScsICctLWVnZ3MgMmknXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctLWVnZ3M9NDIgNDInLCBOUyhlZ2dzPTQyLCBzcGFtPTQyLjApKSwKKyAgICAgICAgKCctLWVnZ3MgMmogLS0gLTEuNScsIE5TKGVnZ3M9MmosIHNwYW09LTEuNSkpLAorICAgICAgICAoJzEwMjQuNjc1JywgTlMoZWdncz1Ob25lLCBzcGFtPTEwMjQuNjc1KSksCisgICAgXQorCisKK2NsYXNzIFRlc3RUeXBlVXNlckRlZmluZWQoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSB1c2VyLWRlZmluZWQgb3B0aW9uL2FyZ3VtZW50IHR5cGUiIiIKKworICAgIGNsYXNzIE15VHlwZShUZXN0Q2FzZSk6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCisgICAgICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuICh0eXBlKHNlbGYpLCBzZWxmLnZhbHVlKSA9PSAodHlwZShvdGhlciksIG90aGVyLnZhbHVlKQorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIHR5cGU9TXlUeXBlKSwKKyAgICAgICAgU2lnKCdzcGFtJywgdHlwZT1NeVR5cGUpLAorICAgIF0KKyAgICBmYWlsdXJlcyA9IFtdCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJ2EgLXggYicsIE5TKHg9TXlUeXBlKCdiJyksIHNwYW09TXlUeXBlKCdhJykpKSwKKyAgICAgICAgKCcteGYgZycsIE5TKHg9TXlUeXBlKCdmJyksIHNwYW09TXlUeXBlKCdnJykpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFR5cGVDbGFzc2ljQ2xhc3MoUGFyc2VyVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBjbGFzc2ljIGNsYXNzIHR5cGUiIiIKKworICAgIGNsYXNzIEM6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCisgICAgICAgIF9faGFzaF9fID0gTm9uZQorCisgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuICh0eXBlKHNlbGYpLCBzZWxmLnZhbHVlKSA9PSAodHlwZShvdGhlciksIG90aGVyLnZhbHVlKQorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIHR5cGU9QyksCisgICAgICAgIFNpZygnc3BhbScsIHR5cGU9QyksCisgICAgXQorICAgIGZhaWx1cmVzID0gW10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnYSAteCBiJywgTlMoeD1DKCdiJyksIHNwYW09QygnYScpKSksCisgICAgICAgICgnLXhmIGcnLCBOUyh4PUMoJ2YnKSwgc3BhbT1DKCdnJykpKSwKKyAgICBdCisKKworY2xhc3MgVGVzdFR5cGVSZWdpc3RyYXRpb24oVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSB1c2VyLWRlZmluZWQgdHlwZSBieSByZWdpc3RlcmluZyBpdCIiIgorCisgICAgZGVmIHRlc3Qoc2VsZik6CisKKyAgICAgICAgZGVmIGdldF9teV90eXBlKHN0cmluZyk6CisgICAgICAgICAgICByZXR1cm4gJ215X3R5cGV7JXN9JyAlIHN0cmluZworCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnJlZ2lzdGVyKCd0eXBlJywgJ215X3R5cGUnLCBnZXRfbXlfdHlwZSkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXgnLCB0eXBlPSdteV90eXBlJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgneScsIHR5cGU9J215X3R5cGUnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoJzEnLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKHg9Tm9uZSwgeT0nbXlfdHlwZXsxfScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKCcteCAxIDQyJy5zcGxpdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOUyh4PSdteV90eXBlezF9JywgeT0nbXlfdHlwZXs0Mn0nKSkKKworCisjID09PT09PT09PT09PQorIyBBY3Rpb24gdGVzdHMKKyMgPT09PT09PT09PT09CisKK2NsYXNzIFRlc3RBY3Rpb25Vc2VyRGVmaW5lZChQYXJzZXJUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIHVzZXItZGVmaW5lZCBvcHRpb24vYXJndW1lbnQgYWN0aW9uIiIiCisKKyAgICBjbGFzcyBPcHRpb25hbEFjdGlvbihhcmdwYXJzZS5BY3Rpb24pOgorCisgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBwYXJzZXIsIG5hbWVzcGFjZSwgdmFsdWUsIG9wdGlvbl9zdHJpbmc9Tm9uZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBjaGVjayBkZXN0aW5hdGlvbiBhbmQgb3B0aW9uIHN0cmluZworICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLmRlc3QgPT0gJ3NwYW0nLCAnZGVzdDogJXMnICUgc2VsZi5kZXN0CisgICAgICAgICAgICAgICAgYXNzZXJ0IG9wdGlvbl9zdHJpbmcgPT0gJy1zJywgJ2ZsYWc6ICVzJyAlIG9wdGlvbl9zdHJpbmcKKyAgICAgICAgICAgICAgICAjIHdoZW4gb3B0aW9uIGlzIGJlZm9yZSBhcmd1bWVudCwgYmFkZ2VyPTIsIGFuZCB3aGVuCisgICAgICAgICAgICAgICAgIyBvcHRpb24gaXMgYWZ0ZXIgYXJndW1lbnQsIGJhZGdlcj08d2hhdGV2ZXIgd2FzIHNldD4KKyAgICAgICAgICAgICAgICBleHBlY3RlZF9ucyA9IE5TKHNwYW09MC4yNSkKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpbiBbMC4xMjUsIDAuNjI1XToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfbnMuYmFkZ2VyID0gMgorICAgICAgICAgICAgICAgIGVsaWYgdmFsdWUgaW4gWzIuMF06CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX25zLmJhZGdlciA9IDg0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ3ZhbHVlOiAlcycgJSB2YWx1ZSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgZXhwZWN0ZWRfbnMgPT0gbmFtZXNwYWNlLCAoJ2V4cGVjdGVkICVzLCBnb3QgJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdGVkX25zLCBuYW1lc3BhY2UpKQorICAgICAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgorICAgICAgICAgICAgICAgIGUgPSBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgICAgIHJhaXNlIEFyZ3VtZW50UGFyc2VyRXJyb3IoJ29wdF9hY3Rpb24gZmFpbGVkOiAlcycgJSBlKQorICAgICAgICAgICAgc2V0YXR0cihuYW1lc3BhY2UsICdzcGFtJywgdmFsdWUpCisKKyAgICBjbGFzcyBQb3NpdGlvbmFsQWN0aW9uKGFyZ3BhcnNlLkFjdGlvbik6CisKKyAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHBhcnNlciwgbmFtZXNwYWNlLCB2YWx1ZSwgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhc3NlcnQgb3B0aW9uX3N0cmluZyBpcyBOb25lLCAoJ29wdGlvbl9zdHJpbmc6ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmcpCisgICAgICAgICAgICAgICAgIyBjaGVjayBkZXN0aW5hdGlvbgorICAgICAgICAgICAgICAgIGFzc2VydCBzZWxmLmRlc3QgPT0gJ2JhZGdlcicsICdkZXN0OiAlcycgJSBzZWxmLmRlc3QKKyAgICAgICAgICAgICAgICAjIHdoZW4gYXJndW1lbnQgaXMgYmVmb3JlIG9wdGlvbiwgc3BhbT0wLjI1LCBhbmQgd2hlbgorICAgICAgICAgICAgICAgICMgb3B0aW9uIGlzIGFmdGVyIGFyZ3VtZW50LCBzcGFtPTx3aGF0ZXZlciB3YXMgc2V0PgorICAgICAgICAgICAgICAgIGV4cGVjdGVkX25zID0gTlMoYmFkZ2VyPTIpCisgICAgICAgICAgICAgICAgaWYgdmFsdWUgaW4gWzQyLCA4NF06CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX25zLnNwYW0gPSAwLjI1CisgICAgICAgICAgICAgICAgZWxpZiB2YWx1ZSBpbiBbMV06CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX25zLnNwYW0gPSAwLjYyNQorICAgICAgICAgICAgICAgIGVsaWYgdmFsdWUgaW4gWzJdOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9ucy5zcGFtID0gMC4xMjUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigndmFsdWU6ICVzJyAlIHZhbHVlKQorICAgICAgICAgICAgICAgIGFzc2VydCBleHBlY3RlZF9ucyA9PSBuYW1lc3BhY2UsICgnZXhwZWN0ZWQgJXMsIGdvdCAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfbnMsIG5hbWVzcGFjZSkpCisgICAgICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3I6CisgICAgICAgICAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICAgICAgcmFpc2UgQXJndW1lbnRQYXJzZXJFcnJvcignYXJnX2FjdGlvbiBmYWlsZWQ6ICVzJyAlIGUpCisgICAgICAgICAgICBzZXRhdHRyKG5hbWVzcGFjZSwgJ2JhZGdlcicsIHZhbHVlKQorCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctcycsIGRlc3Q9J3NwYW0nLCBhY3Rpb249T3B0aW9uYWxBY3Rpb24sCisgICAgICAgICAgICB0eXBlPWZsb2F0LCBkZWZhdWx0PTAuMjUpLAorICAgICAgICBTaWcoJ2JhZGdlcicsIGFjdGlvbj1Qb3NpdGlvbmFsQWN0aW9uLAorICAgICAgICAgICAgdHlwZT1pbnQsIG5hcmdzPSc/JywgZGVmYXVsdD0yKSwKKyAgICBdCisgICAgZmFpbHVyZXMgPSBbXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctczAuMTI1JywgTlMoc3BhbT0wLjEyNSwgYmFkZ2VyPTIpKSwKKyAgICAgICAgKCc0MicsIE5TKHNwYW09MC4yNSwgYmFkZ2VyPTQyKSksCisgICAgICAgICgnLXMgMC42MjUgMScsIE5TKHNwYW09MC42MjUsIGJhZGdlcj0xKSksCisgICAgICAgICgnODQgLXMyJywgTlMoc3BhbT0yLjAsIGJhZGdlcj04NCkpLAorICAgIF0KKworCitjbGFzcyBUZXN0QWN0aW9uUmVnaXN0cmF0aW9uKFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGEgdXNlci1kZWZpbmVkIGFjdGlvbiBzdXBwbGllZCBieSByZWdpc3RlcmluZyBpdCIiIgorCisgICAgY2xhc3MgTXlBY3Rpb24oYXJncGFyc2UuQWN0aW9uKToKKworICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgcGFyc2VyLCBuYW1lc3BhY2UsIHZhbHVlcywgb3B0aW9uX3N0cmluZz1Ob25lKToKKyAgICAgICAgICAgIHNldGF0dHIobmFtZXNwYWNlLCBzZWxmLmRlc3QsICdmb29bJXNdJyAlIHZhbHVlcykKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnJlZ2lzdGVyKCdhY3Rpb24nLCAnbXlfYWN0aW9uJywgc2VsZi5NeUFjdGlvbikKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYmFkZ2VyJywgYWN0aW9uPSdteV9hY3Rpb24nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoWycxJ10pLCBOUyhiYWRnZXI9J2Zvb1sxXScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKFsnNDInXSksIE5TKGJhZGdlcj0nZm9vWzQyXScpKQorCisKKyMgPT09PT09PT09PT09PT09PQorIyBTdWJwYXJzZXJzIHRlc3RzCisjID09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEFkZFN1YnBhcnNlcnMoVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGFkZF9zdWJwYXJzZXJzIG1ldGhvZCIiIgorCisgICAgZGVmIGFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3Ioc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRQYXJzZXJFcnJvciwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIF9nZXRfcGFyc2VyKHNlbGYsIHN1YnBhcnNlcl9oZWxwPUZhbHNlLCBwcmVmaXhfY2hhcnM9Tm9uZSk6CisgICAgICAgICMgY3JlYXRlIGEgcGFyc2VyIHdpdGggYSBzdWJwYXJzZXJzIGFyZ3VtZW50CisgICAgICAgIGlmIHByZWZpeF9jaGFyczoKKyAgICAgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKAorICAgICAgICAgICAgICAgIHByb2c9J1BST0cnLCBkZXNjcmlwdGlvbj0nbWFpbiBkZXNjcmlwdGlvbicsIHByZWZpeF9jaGFycz1wcmVmaXhfY2hhcnMpCisgICAgICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAgICAgICAgIHByZWZpeF9jaGFyc1swXSAqIDIgKyAnZm9vJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nZm9vIGhlbHAnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoCisgICAgICAgICAgICAgICAgcHJvZz0nUFJPRycsIGRlc2NyaXB0aW9uPSdtYWluIGRlc2NyaXB0aW9uJykKKyAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAgICAgICAgICAgJy0tZm9vJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nZm9vIGhlbHAnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgICAgICAgJ2JhcicsIHR5cGU9ZmxvYXQsIGhlbHA9J2JhciBoZWxwJykKKworICAgICAgICAjIGNoZWNrIHRoYXQgb25seSBvbmUgc3VicGFyc2VycyBhcmd1bWVudCBjYW4gYmUgYWRkZWQKKyAgICAgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycyhoZWxwPSdjb21tYW5kIGhlbHAnKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IocGFyc2VyLmFkZF9zdWJwYXJzZXJzKQorCisgICAgICAgICMgYWRkIGZpcnN0IHN1Yi1wYXJzZXIKKyAgICAgICAgcGFyc2VyMV9rd2FyZ3MgPSBkaWN0KGRlc2NyaXB0aW9uPScxIGRlc2NyaXB0aW9uJykKKyAgICAgICAgaWYgc3VicGFyc2VyX2hlbHA6CisgICAgICAgICAgICBwYXJzZXIxX2t3YXJnc1snaGVscCddID0gJzEgaGVscCcKKyAgICAgICAgcGFyc2VyMSA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignMScsICoqcGFyc2VyMV9rd2FyZ3MpCisgICAgICAgIHBhcnNlcjEuYWRkX2FyZ3VtZW50KCctdycsIHR5cGU9aW50LCBoZWxwPSd3IGhlbHAnKQorICAgICAgICBwYXJzZXIxLmFkZF9hcmd1bWVudCgneCcsIGNob2ljZXM9J2FiYycsIGhlbHA9J3ggaGVscCcpCisKKyAgICAgICAgIyBhZGQgc2Vjb25kIHN1Yi1wYXJzZXIKKyAgICAgICAgcGFyc2VyMl9rd2FyZ3MgPSBkaWN0KGRlc2NyaXB0aW9uPScyIGRlc2NyaXB0aW9uJykKKyAgICAgICAgaWYgc3VicGFyc2VyX2hlbHA6CisgICAgICAgICAgICBwYXJzZXIyX2t3YXJnc1snaGVscCddID0gJzIgaGVscCcKKyAgICAgICAgcGFyc2VyMiA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignMicsICoqcGFyc2VyMl9rd2FyZ3MpCisgICAgICAgIHBhcnNlcjIuYWRkX2FyZ3VtZW50KCcteScsIGNob2ljZXM9JzEyMycsIGhlbHA9J3kgaGVscCcpCisgICAgICAgIHBhcnNlcjIuYWRkX2FyZ3VtZW50KCd6JywgdHlwZT1jb21wbGV4LCBuYXJncz0nKicsIGhlbHA9J3ogaGVscCcpCisKKyAgICAgICAgIyBhZGQgdGhpcmQgc3ViLXBhcnNlcgorICAgICAgICBwYXJzZXIzX2t3YXJncyA9IGRpY3QoZGVzY3JpcHRpb249JzMgZGVzY3JpcHRpb24nKQorICAgICAgICBpZiBzdWJwYXJzZXJfaGVscDoKKyAgICAgICAgICAgIHBhcnNlcjNfa3dhcmdzWydoZWxwJ10gPSAnMyBoZWxwJworICAgICAgICBwYXJzZXIzID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCczJywgKipwYXJzZXIzX2t3YXJncykKKyAgICAgICAgcGFyc2VyMy5hZGRfYXJndW1lbnQoJ3QnLCB0eXBlPWludCwgaGVscD0ndCBoZWxwJykKKyAgICAgICAgcGFyc2VyMy5hZGRfYXJndW1lbnQoJ3UnLCBuYXJncz0nLi4uJywgaGVscD0ndSBoZWxwJykKKworICAgICAgICAjIHJldHVybiB0aGUgbWFpbiBwYXJzZXIKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0QWRkU3VicGFyc2Vycywgc2VsZikuc2V0VXAoKQorICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIoKQorICAgICAgICBzZWxmLmNvbW1hbmRfaGVscF9wYXJzZXIgPSBzZWxmLl9nZXRfcGFyc2VyKHN1YnBhcnNlcl9oZWxwPVRydWUpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9hcmdzX2ZhaWx1cmVzKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHNvbWUgZmFpbHVyZSBjYXNlczoKKyAgICAgICAgZm9yIGFyZ3Nfc3RyIGluIFsnJywgJ2EnLCAnYSBhJywgJzAuNSBhJywgJzAuNSAxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnMC41IDEgLXknLCAnMC41IDIgLXcnXToKKyAgICAgICAgICAgIGFyZ3MgPSBhcmdzX3N0ci5zcGxpdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3Ioc2VsZi5wYXJzZXIucGFyc2VfYXJncywgYXJncykKKworICAgIGRlZiB0ZXN0X3BhcnNlX2FyZ3Moc2VsZik6CisgICAgICAgICMgY2hlY2sgc29tZSBub24tZmFpbHVyZSBjYXNlczoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoJzAuNSAxIGIgLXcgNycuc3BsaXQoKSksCisgICAgICAgICAgICBOUyhmb289RmFsc2UsIGJhcj0wLjUsIHc9NywgeD0nYicpLAorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKCcwLjI1IC0tZm9vIDIgLXkgMiAzaiAtLSAtMWonLnNwbGl0KCkpLAorICAgICAgICAgICAgTlMoZm9vPVRydWUsIGJhcj0wLjI1LCB5PScyJywgej1bM2osIC0xal0pLAorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKCctLWZvbyAwLjEyNSAxIGMnLnNwbGl0KCkpLAorICAgICAgICAgICAgTlMoZm9vPVRydWUsIGJhcj0wLjEyNSwgdz1Ob25lLCB4PSdjJyksCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoJy0xLjUgMyAxMSAtLSBhIC0tZm9vIDcgLS0gYicuc3BsaXQoKSksCisgICAgICAgICAgICBOUyhmb289RmFsc2UsIGJhcj0tMS41LCB0PTExLCB1PVsnYScsICctLWZvbycsICc3JywgJy0tJywgJ2InXSksCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3BhcnNlX2tub3duX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9rbm93bl9hcmdzKCcwLjUgMSBiIC13IDcnLnNwbGl0KCkpLAorICAgICAgICAgICAgKE5TKGZvbz1GYWxzZSwgYmFyPTAuNSwgdz03LCB4PSdiJyksIFtdKSwKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2Vfa25vd25fYXJncygnMC41IC1wIDEgYiAtdyA3Jy5zcGxpdCgpKSwKKyAgICAgICAgICAgIChOUyhmb289RmFsc2UsIGJhcj0wLjUsIHc9NywgeD0nYicpLCBbJy1wJ10pLAorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9rbm93bl9hcmdzKCcwLjUgMSBiIC13IDcgLXAnLnNwbGl0KCkpLAorICAgICAgICAgICAgKE5TKGZvbz1GYWxzZSwgYmFyPTAuNSwgdz03LCB4PSdiJyksIFsnLXAnXSksCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoJzAuNSAxIGIgLXEgLXJzIC13IDcnLnNwbGl0KCkpLAorICAgICAgICAgICAgKE5TKGZvbz1GYWxzZSwgYmFyPTAuNSwgdz03LCB4PSdiJyksIFsnLXEnLCAnLXJzJ10pLAorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9rbm93bl9hcmdzKCcwLjUgLVcgMSBiIC1YIFkgLXcgNyBaJy5zcGxpdCgpKSwKKyAgICAgICAgICAgIChOUyhmb289RmFsc2UsIGJhcj0wLjUsIHc9NywgeD0nYicpLCBbJy1XJywgJy1YJywgJ1knLCAnWiddKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZGVzdChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnMoZGVzdD0nYmFyJykKKyAgICAgICAgcGFyc2VyMSA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignMScpCisgICAgICAgIHBhcnNlcjEuYWRkX2FyZ3VtZW50KCdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKGZvbz1GYWxzZSwgYmFyPScxJywgYmF6PScyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoJzEgMicuc3BsaXQoKSkpCisKKyAgICBkZWYgdGVzdF9oZWxwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmZvcm1hdF91c2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDIsM30gLi4uXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDIsM30gLi4uCisKKyAgICAgICAgICAgIG1haW4gZGVzY3JpcHRpb24KKworICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIGJhciAgICAgICAgIGJhciBoZWxwCisgICAgICAgICAgICAgIHsxLDIsM30gICAgIGNvbW1hbmQgaGVscAorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLS1mb28gICAgICAgZm9vIGhlbHAKKyAgICAgICAgICAgICcnJykpCisKKyAgICBkZWYgdGVzdF9oZWxwX2V4dHJhX3ByZWZpeF9jaGFycyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgLSBpcyBzdGlsbCB1c2VkIGZvciBoZWxwIGlmIGl0IGlzIGEgbm9uLWZpcnN0IHByZWZpeCBjaGFyCisgICAgICAgIHBhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIocHJlZml4X2NoYXJzPScrOi0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfdXNhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndXNhZ2U6IFBST0cgWy1oXSBbKytmb29dIGJhciB7MSwyLDN9IC4uLlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZm9ybWF0X2hlbHAoKSwgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWysrZm9vXSBiYXIgezEsMiwzfSAuLi4KKworICAgICAgICAgICAgbWFpbiBkZXNjcmlwdGlvbgorCisgICAgICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgYmFyICAgICAgICAgYmFyIGhlbHAKKyAgICAgICAgICAgICAgezEsMiwzfSAgICAgY29tbWFuZCBoZWxwCisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICArK2ZvbyAgICAgICBmb28gaGVscAorICAgICAgICAgICAgJycnKSkKKworCisgICAgZGVmIHRlc3RfaGVscF9hbHRlcm5hdGVfcHJlZml4X2NoYXJzKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBzZWxmLl9nZXRfcGFyc2VyKHByZWZpeF9jaGFycz0nKzovJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZm9ybWF0X3VzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzYWdlOiBQUk9HIFsraF0gWysrZm9vXSBiYXIgezEsMiwzfSAuLi5cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZTogUFJPRyBbK2hdIFsrK2Zvb10gYmFyIHsxLDIsM30gLi4uCisKKyAgICAgICAgICAgIG1haW4gZGVzY3JpcHRpb24KKworICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIGJhciAgICAgICAgIGJhciBoZWxwCisgICAgICAgICAgICAgIHsxLDIsM30gICAgIGNvbW1hbmQgaGVscAorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgICtoLCArK2hlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgKytmb28gICAgICAgZm9vIGhlbHAKKyAgICAgICAgICAgICcnJykpCisKKyAgICBkZWYgdGVzdF9wYXJzZXJfY29tbWFuZF9oZWxwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tbWFuZF9oZWxwX3BhcnNlci5mb3JtYXRfdXNhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndXNhZ2U6IFBST0cgWy1oXSBbLS1mb29dIGJhciB7MSwyLDN9IC4uLlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbW1hbmRfaGVscF9wYXJzZXIuZm9ybWF0X2hlbHAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb29dIGJhciB7MSwyLDN9IC4uLgorCisgICAgICAgICAgICBtYWluIGRlc2NyaXB0aW9uCisKKyAgICAgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICBiYXIgICAgICAgICBiYXIgaGVscAorICAgICAgICAgICAgICB7MSwyLDN9ICAgICBjb21tYW5kIGhlbHAKKyAgICAgICAgICAgICAgICAxICAgICAgICAgMSBoZWxwCisgICAgICAgICAgICAgICAgMiAgICAgICAgIDIgaGVscAorICAgICAgICAgICAgICAgIDMgICAgICAgICAzIGhlbHAKKworICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgICAgIC0tZm9vICAgICAgIGZvbyBoZWxwCisgICAgICAgICAgICAnJycpKQorCisgICAgZGVmIHRlc3Rfc3VicGFyc2VyX3RpdGxlX2hlbHAoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0nbWFpbiBkZXNjcmlwdGlvbicpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nZm9vIGhlbHAnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYXInLCBoZWxwPSdiYXIgaGVscCcpCisgICAgICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnModGl0bGU9J3N1YmNvbW1hbmRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0nY29tbWFuZCBoZWxwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdhZGRpdGlvbmFsIHRleHQnKQorICAgICAgICBwYXJzZXIxID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCcxJykKKyAgICAgICAgcGFyc2VyMiA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmZvcm1hdF91c2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd1c2FnZTogUFJPRyBbLWhdIFstLWZvb10gYmFyIHsxLDJ9IC4uLlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZm9ybWF0X2hlbHAoKSwgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vXSBiYXIgezEsMn0gLi4uCisKKyAgICAgICAgICAgIG1haW4gZGVzY3JpcHRpb24KKworICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIGJhciAgICAgICAgIGJhciBoZWxwCisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICAtLWZvbyAgICAgICBmb28gaGVscAorCisgICAgICAgICAgICBzdWJjb21tYW5kczoKKyAgICAgICAgICAgICAgY29tbWFuZCBoZWxwCisKKyAgICAgICAgICAgICAgezEsMn0gICAgICAgYWRkaXRpb25hbCB0ZXh0CisgICAgICAgICAgICAnJycpKQorCisgICAgZGVmIF90ZXN0X3N1YnBhcnNlcl9oZWxwKHNlbGYsIGFyZ3Nfc3RyLCBleHBlY3RlZF9oZWxwKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5wYXJzZXIucGFyc2VfYXJncyhhcmdzX3N0ci5zcGxpdCgpKQorICAgICAgICBleGNlcHQgQXJndW1lbnRQYXJzZXJFcnJvcjoKKyAgICAgICAgICAgIGVyciA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgICAgICBpZiBlcnIuc3Rkb3V0ICE9IGV4cGVjdGVkX2hlbHA6CisgICAgICAgICAgICAgICAgcHJpbnQocmVwcihleHBlY3RlZF9oZWxwKSkKKyAgICAgICAgICAgICAgICBwcmludChyZXByKGVyci5zdGRvdXQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuc3Rkb3V0LCBleHBlY3RlZF9oZWxwKQorCisgICAgZGVmIHRlc3Rfc3VicGFyc2VyMV9oZWxwKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3N1YnBhcnNlcl9oZWxwKCc1LjAgMSAtaCcsIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZTogUFJPRyBiYXIgMSBbLWhdIFstdyBXXSB7YSxiLGN9CisKKyAgICAgICAgICAgIDEgZGVzY3JpcHRpb24KKworICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIHthLGIsY30gICAgIHggaGVscAorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLXcgVyAgICAgICAgdyBoZWxwCisgICAgICAgICAgICAnJycpKQorCisgICAgZGVmIHRlc3Rfc3VicGFyc2VyMl9oZWxwKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3N1YnBhcnNlcl9oZWxwKCc1LjAgMiAtaCcsIHRleHR3cmFwLmRlZGVudCgnJydcCisgICAgICAgICAgICB1c2FnZTogUFJPRyBiYXIgMiBbLWhdIFsteSB7MSwyLDN9XSBbeiBbeiAuLi5dXQorCisgICAgICAgICAgICAyIGRlc2NyaXB0aW9uCisKKyAgICAgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICB6ICAgICAgICAgICB6IGhlbHAKKworICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgICAgIC15IHsxLDIsM30gIHkgaGVscAorICAgICAgICAgICAgJycnKSkKKworIyA9PT09PT09PT09PT0KKyMgR3JvdXBzIHRlc3RzCisjID09PT09PT09PT09PQorCitjbGFzcyBUZXN0UG9zaXRpb25hbHNHcm91cHMoVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHRoYXQgb3JkZXIgb2YgZ3JvdXAgcG9zaXRpb25hbHMgbWF0Y2hlcyBjb25zdHJ1Y3Rpb24gb3JkZXIiIiIKKworICAgIGRlZiB0ZXN0X25vbmdyb3VwX2ZpcnN0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ2ZvbycpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnZycpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnYmFyJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYmF6JykKKyAgICAgICAgZXhwZWN0ZWQgPSBOUyhmb289JzEnLCBiYXI9JzInLCBiYXo9JzMnKQorICAgICAgICByZXN1bHQgPSBwYXJzZXIucGFyc2VfYXJncygnMSAyIDMnLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X2dyb3VwX2ZpcnN0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgneHh4JykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCdmb28nKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYXInKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYXonKQorICAgICAgICBleHBlY3RlZCA9IE5TKGZvbz0nMScsIGJhcj0nMicsIGJhej0nMycpCisgICAgICAgIHJlc3VsdCA9IHBhcnNlci5wYXJzZV9hcmdzKCcxIDIgMycuc3BsaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfaW50ZXJsZWF2ZWRfZ3JvdXBzKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgneHh4JykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnZm9vJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCdiYXInKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdiYXonKQorICAgICAgICBncm91cCA9IHBhcnNlci5hZGRfYXJndW1lbnRfZ3JvdXAoJ3l5eScpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnZnJlbGwnKQorICAgICAgICBleHBlY3RlZCA9IE5TKGZvbz0nMScsIGJhcj0nMicsIGJhej0nMycsIGZyZWxsPSc0JykKKyAgICAgICAgcmVzdWx0ID0gcGFyc2VyLnBhcnNlX2FyZ3MoJzEgMiAzIDQnLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCkKKworIyA9PT09PT09PT09PT09PT09PT09CisjIFBhcmVudCBwYXJzZXIgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0UGFyZW50UGFyc2VycyhUZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdGhhdCBwYXJzZXJzIGNhbiBiZSBjcmVhdGVkIHdpdGggcGFyZW50IHBhcnNlcnMiIiIKKworICAgIGRlZiBhc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50UGFyc2VyRXJyb3IsICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoVGVzdFBhcmVudFBhcnNlcnMsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi53eHl6X3BhcmVudCA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBzZWxmLnd4eXpfcGFyZW50LmFkZF9hcmd1bWVudCgnLS13JykKKyAgICAgICAgeF9ncm91cCA9IHNlbGYud3h5el9wYXJlbnQuYWRkX2FyZ3VtZW50X2dyb3VwKCd4JykKKyAgICAgICAgeF9ncm91cC5hZGRfYXJndW1lbnQoJy15JykKKyAgICAgICAgc2VsZi53eHl6X3BhcmVudC5hZGRfYXJndW1lbnQoJ3onKQorCisgICAgICAgIHNlbGYuYWJjZF9wYXJlbnQgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSkKKyAgICAgICAgc2VsZi5hYmNkX3BhcmVudC5hZGRfYXJndW1lbnQoJ2EnKQorICAgICAgICBzZWxmLmFiY2RfcGFyZW50LmFkZF9hcmd1bWVudCgnLWInKQorICAgICAgICBjX2dyb3VwID0gc2VsZi5hYmNkX3BhcmVudC5hZGRfYXJndW1lbnRfZ3JvdXAoJ2MnKQorICAgICAgICBjX2dyb3VwLmFkZF9hcmd1bWVudCgnLS1kJykKKworICAgICAgICBzZWxmLndfcGFyZW50ID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoYWRkX2hlbHA9RmFsc2UpCisgICAgICAgIHNlbGYud19wYXJlbnQuYWRkX2FyZ3VtZW50KCctLXcnKQorCisgICAgICAgIHNlbGYuel9wYXJlbnQgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSkKKyAgICAgICAgc2VsZi56X3BhcmVudC5hZGRfYXJndW1lbnQoJ3onKQorCisgICAgICAgICMgcGFyZW50cyB3aXRoIG11dHVhbGx5IGV4Y2x1c2l2ZSBncm91cHMKKyAgICAgICAgc2VsZi5hYl9tdXRleF9wYXJlbnQgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSkKKyAgICAgICAgZ3JvdXAgPSBzZWxmLmFiX211dGV4X3BhcmVudC5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctYScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWInLCBhY3Rpb249J3N0b3JlX3RydWUnKQorCisgICAgICAgIHNlbGYubWFpbl9wcm9ncmFtID0gb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkKKworICAgIGRlZiB0ZXN0X3NpbmdsZV9wYXJlbnQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHBhcmVudHM9W3NlbGYud3h5el9wYXJlbnRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKCcteSAxIDIgLS13IDMnLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKHc9JzMnLCB5PScxJywgej0nMicpKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX3BhcmVudF9tdXRleChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9tdXRleF9hYihzZWxmLmFiX211dGV4X3BhcmVudC5wYXJzZV9hcmdzKQorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwYXJlbnRzPVtzZWxmLmFiX211dGV4X3BhcmVudF0pCisgICAgICAgIHNlbGYuX3Rlc3RfbXV0ZXhfYWIocGFyc2VyLnBhcnNlX2FyZ3MpCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfZ3JhbnBhcmVudF9tdXRleChzZWxmKToKKyAgICAgICAgcGFyZW50cyA9IFtzZWxmLmFiX211dGV4X3BhcmVudF0KKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoYWRkX2hlbHA9RmFsc2UsIHBhcmVudHM9cGFyZW50cykKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocGFyZW50cz1bcGFyc2VyXSkKKyAgICAgICAgc2VsZi5fdGVzdF9tdXRleF9hYihwYXJzZXIucGFyc2VfYXJncykKKworICAgIGRlZiBfdGVzdF9tdXRleF9hYihzZWxmLCBwYXJzZV9hcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZV9hcmdzKFtdKSwgTlMoYT1GYWxzZSwgYj1GYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfYXJncyhbJy1hJ10pLCBOUyhhPVRydWUsIGI9RmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2FyZ3MoWyctYiddKSwgTlMoYT1GYWxzZSwgYj1UcnVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlX2FyZ3MsIFsnLWEnLCAnLWInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlX2FyZ3MsIFsnLWInLCAnLWEnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlX2FyZ3MsIFsnLWMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlX2FyZ3MsIFsnLWEnLCAnLWMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlX2FyZ3MsIFsnLWInLCAnLWMnXSkKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3BhcmVudHMoc2VsZik6CisgICAgICAgIHBhcmVudHMgPSBbc2VsZi5hYmNkX3BhcmVudCwgc2VsZi53eHl6X3BhcmVudF0KKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocGFyZW50cz1wYXJlbnRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKCctLWQgMSAtLXcgMiAzIDQnLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKGE9JzMnLCBiPU5vbmUsIGQ9JzEnLCB3PScyJywgeT1Ob25lLCB6PSc0JykpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9wYXJlbnRzX211dGV4KHNlbGYpOgorICAgICAgICBwYXJlbnRzID0gW3NlbGYuYWJfbXV0ZXhfcGFyZW50LCBzZWxmLnd4eXpfcGFyZW50XQorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwYXJlbnRzPXBhcmVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnBhcnNlX2FyZ3MoJy1hIC0tdyAyIDMnLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKGE9VHJ1ZSwgYj1GYWxzZSwgdz0nMicsIHk9Tm9uZSwgej0nMycpKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IoCisgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncywgJy1hIC0tdyAyIDMgLWInLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcigKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzLCAnLWEgLWIgLS13IDIgMycuc3BsaXQoKSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0aW5nX3BhcmVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgYXJncGFyc2UuQXJndW1lbnRFcnJvciwKKyAgICAgICAgICAgIGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyLAorICAgICAgICAgICAgcGFyZW50cz1bc2VsZi53X3BhcmVudCwgc2VsZi53eHl6X3BhcmVudF0pCisKKyAgICBkZWYgdGVzdF9jb25mbGljdGluZ19wYXJlbnRzX211dGV4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIGFyZ3BhcnNlLkFyZ3VtZW50RXJyb3IsCisgICAgICAgICAgICBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlciwKKyAgICAgICAgICAgIHBhcmVudHM9W3NlbGYuYWJjZF9wYXJlbnQsIHNlbGYuYWJfbXV0ZXhfcGFyZW50XSkKKworICAgIGRlZiB0ZXN0X3NhbWVfYXJndW1lbnRfbmFtZV9wYXJlbnRzKHNlbGYpOgorICAgICAgICBwYXJlbnRzID0gW3NlbGYud3h5el9wYXJlbnQsIHNlbGYuel9wYXJlbnRdCisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHBhcmVudHM9cGFyZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIucGFyc2VfYXJncygnMSAyJy5zcGxpdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOUyh3PU5vbmUsIHk9Tm9uZSwgej0nMicpKQorCisgICAgZGVmIHRlc3Rfc3VicGFyc2VyX3BhcmVudHMoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgc3VicGFyc2VycyA9IHBhcnNlci5hZGRfc3VicGFyc2VycygpCisgICAgICAgIGFiY2RlX3BhcnNlciA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignYmFyJywgcGFyZW50cz1bc2VsZi5hYmNkX3BhcmVudF0pCisgICAgICAgIGFiY2RlX3BhcnNlci5hZGRfYXJndW1lbnQoJ2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKCdiYXIgLWIgMSAtLWQgMiAzIDQnLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKGE9JzMnLCBiPScxJywgZD0nMicsIGU9JzQnKSkKKworICAgIGRlZiB0ZXN0X3N1YnBhcnNlcl9wYXJlbnRzX211dGV4KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnMoKQorICAgICAgICBwYXJlbnRzID0gW3NlbGYuYWJfbXV0ZXhfcGFyZW50XQorICAgICAgICBhYmNfcGFyc2VyID0gc3VicGFyc2Vycy5hZGRfcGFyc2VyKCdmb28nLCBwYXJlbnRzPXBhcmVudHMpCisgICAgICAgIGNfZ3JvdXAgPSBhYmNfcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnY19ncm91cCcpCisgICAgICAgIGNfZ3JvdXAuYWRkX2FyZ3VtZW50KCdjJykKKyAgICAgICAgcGFyZW50cyA9IFtzZWxmLnd4eXpfcGFyZW50LCBzZWxmLmFiX211dGV4X3BhcmVudF0KKyAgICAgICAgd3h5emFiZV9wYXJzZXIgPSBzdWJwYXJzZXJzLmFkZF9wYXJzZXIoJ2JhcicsIHBhcmVudHM9cGFyZW50cykKKyAgICAgICAgd3h5emFiZV9wYXJzZXIuYWRkX2FyZ3VtZW50KCdlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIucGFyc2VfYXJncygnZm9vIC1hIDQnLnNwbGl0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIE5TKGE9VHJ1ZSwgYj1GYWxzZSwgYz0nNCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5wYXJzZV9hcmdzKCdiYXIgLWIgIC0tdyAyIDMgNCcuc3BsaXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlMoYT1GYWxzZSwgYj1UcnVlLCB3PScyJywgeT1Ob25lLCB6PSczJywgZT0nNCcpKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IoCisgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncywgJ2ZvbyAtYSAtYiA0Jy5zcGxpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3IoCisgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncywgJ2JhciAtYiAtYSA0Jy5zcGxpdCgpKQorCisgICAgZGVmIHRlc3RfcGFyZW50X2hlbHAoc2VsZik6CisgICAgICAgIHBhcmVudHMgPSBbc2VsZi5hYmNkX3BhcmVudCwgc2VsZi53eHl6X3BhcmVudF0KKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocGFyZW50cz1wYXJlbnRzKQorICAgICAgICBwYXJzZXJfaGVscCA9IHBhcnNlci5mb3JtYXRfaGVscCgpCisgICAgICAgIHByb2duYW1lID0gc2VsZi5tYWluX3Byb2dyYW0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXJfaGVscCwgdGV4dHdyYXAuZGVkZW50KCcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiB7fXt9Wy1oXSBbLWIgQl0gWy0tZCBEXSBbLS13IFddIFsteSBZXSBhIHoKKworICAgICAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIGEKKyAgICAgICAgICAgICAgegorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLWIgQgorICAgICAgICAgICAgICAtLXcgVworCisgICAgICAgICAgICBjOgorICAgICAgICAgICAgICAtLWQgRAorCisgICAgICAgICAgICB4OgorICAgICAgICAgICAgICAteSBZCisgICAgICAgICcnJy5mb3JtYXQocHJvZ25hbWUsICcgJyBpZiBwcm9nbmFtZSBlbHNlICcnICkpKQorCisgICAgZGVmIHRlc3RfZ3JvdXBzX3BhcmVudHMoc2VsZik6CisgICAgICAgIHBhcmVudCA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKGFkZF9oZWxwPUZhbHNlKQorICAgICAgICBnID0gcGFyZW50LmFkZF9hcmd1bWVudF9ncm91cCh0aXRsZT0nZycsIGRlc2NyaXB0aW9uPSdnZCcpCisgICAgICAgIGcuYWRkX2FyZ3VtZW50KCctdycpCisgICAgICAgIGcuYWRkX2FyZ3VtZW50KCcteCcpCisgICAgICAgIG0gPSBwYXJlbnQuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgICAgIG0uYWRkX2FyZ3VtZW50KCcteScpCisgICAgICAgIG0uYWRkX2FyZ3VtZW50KCcteicpCisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHBhcmVudHM9W3BhcmVudF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRQYXJzZXJFcnJvciwgcGFyc2VyLnBhcnNlX2FyZ3MsCisgICAgICAgICAgICBbJy15JywgJ1knLCAnLXonLCAnWiddKQorCisgICAgICAgIHBhcnNlcl9oZWxwID0gcGFyc2VyLmZvcm1hdF9oZWxwKCkKKyAgICAgICAgcHJvZ25hbWUgPSBzZWxmLm1haW5fcHJvZ3JhbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlcl9oZWxwLCB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgdXNhZ2U6IHt9e31bLWhdIFstdyBXXSBbLXggWF0gWy15IFkgfCAteiBaXQorCisgICAgICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLXkgWQorICAgICAgICAgICAgICAteiBaCisKKyAgICAgICAgICAgIGc6CisgICAgICAgICAgICAgIGdkCisKKyAgICAgICAgICAgICAgLXcgVworICAgICAgICAgICAgICAteCBYCisgICAgICAgICcnJy5mb3JtYXQocHJvZ25hbWUsICcgJyBpZiBwcm9nbmFtZSBlbHNlICcnICkpKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBNdXR1YWxseSBleGNsdXNpdmUgZ3JvdXAgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUdyb3VwRXJyb3JzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfYWRkX2FyZ3VtZW50X2dyb3VwKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIHJhaXNlcyhUeXBlRXJyb3IsIHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwLCB0aXRsZT0nZm9vJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfYWRkX2FyZ3VtZW50KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICAgICAgICBhZGRfYXJndW1lbnQgPSBncm91cC5hZGRfYXJndW1lbnQKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgcmFpc2VzKFZhbHVlRXJyb3IsIGFkZF9hcmd1bWVudCwgJy0tZm9vJywgcmVxdWlyZWQ9VHJ1ZSkKKyAgICAgICAgcmFpc2VzKFZhbHVlRXJyb3IsIGFkZF9hcmd1bWVudCwgJ2JhcicpCisgICAgICAgIHJhaXNlcyhWYWx1ZUVycm9yLCBhZGRfYXJndW1lbnQsICdiYXInLCBuYXJncz0nKycpCisgICAgICAgIHJhaXNlcyhWYWx1ZUVycm9yLCBhZGRfYXJndW1lbnQsICdiYXInLCBuYXJncz0xKQorICAgICAgICByYWlzZXMoVmFsdWVFcnJvciwgYWRkX2FyZ3VtZW50LCAnYmFyJywgbmFyZ3M9YXJncGFyc2UuUEFSU0VSKQorCisgICAgZGVmIHRlc3RfaGVscChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIGdyb3VwMSA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKCkKKyAgICAgICAgZ3JvdXAxLmFkZF9hcmd1bWVudCgnLS1mb28nLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgICAgICBncm91cDEuYWRkX2FyZ3VtZW50KCctLWJhcicsIGFjdGlvbj0nc3RvcmVfZmFsc2UnKQorICAgICAgICBncm91cDIgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAgICAgIGdyb3VwMi5hZGRfYXJndW1lbnQoJy0tc291cCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIGdyb3VwMi5hZGRfYXJndW1lbnQoJy0tbnV0cycsIGFjdGlvbj0nc3RvcmVfZmFsc2UnKQorICAgICAgICBleHBlY3RlZCA9ICcnJ1wKKyAgICAgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vIHwgLS1iYXJdIFstLXNvdXAgfCAtLW51dHNdCisKKyAgICAgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgICAgICAtLWZvbworICAgICAgICAgICAgICAtLWJhcgorICAgICAgICAgICAgICAtLXNvdXAKKyAgICAgICAgICAgICAgLS1udXRzCisgICAgICAgICAgICAgICcnJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfaGVscCgpLCB0ZXh0d3JhcC5kZWRlbnQoZXhwZWN0ZWQpKQorCitjbGFzcyBNRU1peGluKG9iamVjdCk6CisKKyAgICBkZWYgdGVzdF9mYWlsdXJlc193aGVuX25vdF9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgcGFyc2VfYXJncyA9IHNlbGYuZ2V0X3BhcnNlcihyZXF1aXJlZD1GYWxzZSkucGFyc2VfYXJncworICAgICAgICBlcnJvciA9IEFyZ3VtZW50UGFyc2VyRXJyb3IKKyAgICAgICAgZm9yIGFyZ3Nfc3RyaW5nIGluIHNlbGYuZmFpbHVyZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvciwgcGFyc2VfYXJncywgYXJnc19zdHJpbmcuc3BsaXQoKSkKKworICAgIGRlZiB0ZXN0X2ZhaWx1cmVzX3doZW5fcmVxdWlyZWQoc2VsZik6CisgICAgICAgIHBhcnNlX2FyZ3MgPSBzZWxmLmdldF9wYXJzZXIocmVxdWlyZWQ9VHJ1ZSkucGFyc2VfYXJncworICAgICAgICBlcnJvciA9IEFyZ3VtZW50UGFyc2VyRXJyb3IKKyAgICAgICAgZm9yIGFyZ3Nfc3RyaW5nIGluIHNlbGYuZmFpbHVyZXMgKyBbJyddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3IsIHBhcnNlX2FyZ3MsIGFyZ3Nfc3RyaW5nLnNwbGl0KCkpCisKKyAgICBkZWYgdGVzdF9zdWNjZXNzZXNfd2hlbl9ub3RfcmVxdWlyZWQoc2VsZik6CisgICAgICAgIHBhcnNlX2FyZ3MgPSBzZWxmLmdldF9wYXJzZXIocmVxdWlyZWQ9RmFsc2UpLnBhcnNlX2FyZ3MKKyAgICAgICAgc3VjY2Vzc2VzID0gc2VsZi5zdWNjZXNzZXMgKyBzZWxmLnN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZAorICAgICAgICBmb3IgYXJnc19zdHJpbmcsIGV4cGVjdGVkX25zIGluIHN1Y2Nlc3NlczoKKyAgICAgICAgICAgIGFjdHVhbF9ucyA9IHBhcnNlX2FyZ3MoYXJnc19zdHJpbmcuc3BsaXQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsX25zLCBleHBlY3RlZF9ucykKKworICAgIGRlZiB0ZXN0X3N1Y2Nlc3Nlc193aGVuX3JlcXVpcmVkKHNlbGYpOgorICAgICAgICBwYXJzZV9hcmdzID0gc2VsZi5nZXRfcGFyc2VyKHJlcXVpcmVkPVRydWUpLnBhcnNlX2FyZ3MKKyAgICAgICAgZm9yIGFyZ3Nfc3RyaW5nLCBleHBlY3RlZF9ucyBpbiBzZWxmLnN1Y2Nlc3NlczoKKyAgICAgICAgICAgIGFjdHVhbF9ucyA9IHBhcnNlX2FyZ3MoYXJnc19zdHJpbmcuc3BsaXQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsX25zLCBleHBlY3RlZF9ucykKKworICAgIGRlZiB0ZXN0X3VzYWdlX3doZW5fbm90X3JlcXVpcmVkKHNlbGYpOgorICAgICAgICBmb3JtYXRfdXNhZ2UgPSBzZWxmLmdldF9wYXJzZXIocmVxdWlyZWQ9RmFsc2UpLmZvcm1hdF91c2FnZQorICAgICAgICBleHBlY3RlZF91c2FnZSA9IHNlbGYudXNhZ2Vfd2hlbl9ub3RfcmVxdWlyZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXRfdXNhZ2UoKSwgdGV4dHdyYXAuZGVkZW50KGV4cGVjdGVkX3VzYWdlKSkKKworICAgIGRlZiB0ZXN0X3VzYWdlX3doZW5fcmVxdWlyZWQoc2VsZik6CisgICAgICAgIGZvcm1hdF91c2FnZSA9IHNlbGYuZ2V0X3BhcnNlcihyZXF1aXJlZD1UcnVlKS5mb3JtYXRfdXNhZ2UKKyAgICAgICAgZXhwZWN0ZWRfdXNhZ2UgPSBzZWxmLnVzYWdlX3doZW5fcmVxdWlyZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXRfdXNhZ2UoKSwgdGV4dHdyYXAuZGVkZW50KGV4cGVjdGVkX3VzYWdlKSkKKworICAgIGRlZiB0ZXN0X2hlbHBfd2hlbl9ub3RfcmVxdWlyZWQoc2VsZik6CisgICAgICAgIGZvcm1hdF9oZWxwID0gc2VsZi5nZXRfcGFyc2VyKHJlcXVpcmVkPUZhbHNlKS5mb3JtYXRfaGVscAorICAgICAgICBoZWxwID0gc2VsZi51c2FnZV93aGVuX25vdF9yZXF1aXJlZCArIHNlbGYuaGVscAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudChoZWxwKSkKKworICAgIGRlZiB0ZXN0X2hlbHBfd2hlbl9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgZm9ybWF0X2hlbHAgPSBzZWxmLmdldF9wYXJzZXIocmVxdWlyZWQ9VHJ1ZSkuZm9ybWF0X2hlbHAKKyAgICAgICAgaGVscCA9IHNlbGYudXNhZ2Vfd2hlbl9yZXF1aXJlZCArIHNlbGYuaGVscAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdF9oZWxwKCksIHRleHR3cmFwLmRlZGVudChoZWxwKSkKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVTaW1wbGUoTUVNaXhpbiwgVGVzdENhc2UpOgorCisgICAgZGVmIGdldF9wYXJzZXIoc2VsZiwgcmVxdWlyZWQ9Tm9uZSk6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICBncm91cCA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKHJlcXVpcmVkPXJlcXVpcmVkKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tYmFyJywgaGVscD0nYmFyIGhlbHAnKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tYmF6JywgbmFyZ3M9Jz8nLCBjb25zdD0nWicsIGhlbHA9J2JheiBoZWxwJykKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZmFpbHVyZXMgPSBbJy0tYmFyIFggLS1iYXogWScsICctLWJhciBYIC0tYmF6J10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLS1iYXIgWCcsIE5TKGJhcj0nWCcsIGJhej1Ob25lKSksCisgICAgICAgICgnLS1iYXIgWCAtLWJhciBaJywgTlMoYmFyPSdaJywgYmF6PU5vbmUpKSwKKyAgICAgICAgKCctLWJheiBZJywgTlMoYmFyPU5vbmUsIGJhej0nWScpKSwKKyAgICAgICAgKCctLWJheicsIE5TKGJhcj1Ob25lLCBiYXo9J1onKSksCisgICAgXQorICAgIHN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZCA9IFsKKyAgICAgICAgKCcnLCBOUyhiYXI9Tm9uZSwgYmF6PU5vbmUpKSwKKyAgICBdCisKKyAgICB1c2FnZV93aGVuX25vdF9yZXF1aXJlZCA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1iYXIgQkFSIHwgLS1iYXogW0JBWl1dCisgICAgICAgICcnJworICAgIHVzYWdlX3doZW5fcmVxdWlyZWQgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gKC0tYmFyIEJBUiB8IC0tYmF6IFtCQVpdKQorICAgICAgICAnJycKKyAgICBoZWxwID0gJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tYmFyIEJBUiAgICBiYXIgaGVscAorICAgICAgICAgIC0tYmF6IFtCQVpdICBiYXogaGVscAorICAgICAgICAnJycKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVMb25nKE1FTWl4aW4sIFRlc3RDYXNlKToKKworICAgIGRlZiBnZXRfcGFyc2VyKHNlbGYsIHJlcXVpcmVkPU5vbmUpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwcm9nPSdQUk9HJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hYmNkZScsIGhlbHA9J2FiY2RlIGhlbHAnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZnaGlqJywgaGVscD0nZmdoaWogaGVscCcpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLS1rbG1ubycsIGhlbHA9J2tsbW5vIGhlbHAnKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tcHFyc3QnLCBoZWxwPSdwcXJzdCBoZWxwJykKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZmFpbHVyZXMgPSBbJy0ta2xtbm8gWCAtLXBxcnN0IFknXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCctLWtsbW5vIFgnLCBOUyhhYmNkZT1Ob25lLCBmZ2hpaj1Ob25lLCBrbG1ubz0nWCcsIHBxcnN0PU5vbmUpKSwKKyAgICAgICAgKCctLWFiY2RlIFkgLS1rbG1ubyBYJywKKyAgICAgICAgICAgIE5TKGFiY2RlPSdZJywgZmdoaWo9Tm9uZSwga2xtbm89J1gnLCBwcXJzdD1Ob25lKSksCisgICAgICAgICgnLS1wcXJzdCBYJywgTlMoYWJjZGU9Tm9uZSwgZmdoaWo9Tm9uZSwga2xtbm89Tm9uZSwgcHFyc3Q9J1gnKSksCisgICAgICAgICgnLS1wcXJzdCBYIC0tZmdoaWogWScsCisgICAgICAgICAgICBOUyhhYmNkZT1Ob25lLCBmZ2hpaj0nWScsIGtsbW5vPU5vbmUsIHBxcnN0PSdYJykpLAorICAgIF0KKyAgICBzdWNjZXNzZXNfd2hlbl9ub3RfcmVxdWlyZWQgPSBbCisgICAgICAgICgnJywgTlMoYWJjZGU9Tm9uZSwgZmdoaWo9Tm9uZSwga2xtbm89Tm9uZSwgcHFyc3Q9Tm9uZSkpLAorICAgIF0KKworICAgIHVzYWdlX3doZW5fbm90X3JlcXVpcmVkID0gJycnXAorICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tYWJjZGUgQUJDREVdIFstLWZnaGlqIEZHSElKXQorICAgICAgICAgICAgICAgIFstLWtsbW5vIEtMTU5PIHwgLS1wcXJzdCBQUVJTVF0KKyAgICAnJycKKyAgICB1c2FnZV93aGVuX3JlcXVpcmVkID0gJycnXAorICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tYWJjZGUgQUJDREVdIFstLWZnaGlqIEZHSElKXQorICAgICAgICAgICAgICAgICgtLWtsbW5vIEtMTU5PIHwgLS1wcXJzdCBQUVJTVCkKKyAgICAnJycKKyAgICBoZWxwID0gJycnXAorCisgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgLS1hYmNkZSBBQkNERSAgYWJjZGUgaGVscAorICAgICAgLS1mZ2hpaiBGR0hJSiAgZmdoaWogaGVscAorICAgICAgLS1rbG1ubyBLTE1OTyAga2xtbm8gaGVscAorICAgICAgLS1wcXJzdCBQUVJTVCAgcHFyc3QgaGVscAorICAgICcnJworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUZpcnN0U3VwcHJlc3NlZChNRU1peGluLCBUZXN0Q2FzZSk6CisKKyAgICBkZWYgZ2V0X3BhcnNlcihzZWxmLCByZXF1aXJlZCk6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICBncm91cCA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKHJlcXVpcmVkPXJlcXVpcmVkKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy14JywgaGVscD1hcmdwYXJzZS5TVVBQUkVTUykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCcteScsIGFjdGlvbj0nc3RvcmVfZmFsc2UnLCBoZWxwPSd5IGhlbHAnKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBmYWlsdXJlcyA9IFsnLXggWCAteSddCisgICAgc3VjY2Vzc2VzID0gWworICAgICAgICAoJy14IFgnLCBOUyh4PSdYJywgeT1UcnVlKSksCisgICAgICAgICgnLXggWCAteCBZJywgTlMoeD0nWScsIHk9VHJ1ZSkpLAorICAgICAgICAoJy15JywgTlMoeD1Ob25lLCB5PUZhbHNlKSksCisgICAgXQorICAgIHN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZCA9IFsKKyAgICAgICAgKCcnLCBOUyh4PU5vbmUsIHk9VHJ1ZSkpLAorICAgIF0KKworICAgIHVzYWdlX3doZW5fbm90X3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteV0KKyAgICAgICAgJycnCisgICAgdXNhZ2Vfd2hlbl9yZXF1aXJlZCA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSAteQorICAgICAgICAnJycKKyAgICBoZWxwID0gJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXkgICAgICAgICAgeSBoZWxwCisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZU1hbnlTdXBwcmVzc2VkKE1FTWl4aW4sIFRlc3RDYXNlKToKKworICAgIGRlZiBnZXRfcGFyc2VyKHNlbGYsIHJlcXVpcmVkKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIGFkZCA9IGdyb3VwLmFkZF9hcmd1bWVudAorICAgICAgICBhZGQoJy0tc3BhbScsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9YXJncGFyc2UuU1VQUFJFU1MpCisgICAgICAgIGFkZCgnLS1iYWRnZXInLCBhY3Rpb249J3N0b3JlX2ZhbHNlJywgaGVscD1hcmdwYXJzZS5TVVBQUkVTUykKKyAgICAgICAgYWRkKCctLWJsYWRkZXInLCBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBmYWlsdXJlcyA9IFsKKyAgICAgICAgJy0tc3BhbSAtLWJhZGdlcicsCisgICAgICAgICctLWJhZGdlciAtLWJsYWRkZXIgQicsCisgICAgICAgICctLWJsYWRkZXIgQiAtLXNwYW0nLAorICAgIF0KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLS1zcGFtJywgTlMoc3BhbT1UcnVlLCBiYWRnZXI9VHJ1ZSwgYmxhZGRlcj1Ob25lKSksCisgICAgICAgICgnLS1iYWRnZXInLCBOUyhzcGFtPUZhbHNlLCBiYWRnZXI9RmFsc2UsIGJsYWRkZXI9Tm9uZSkpLAorICAgICAgICAoJy0tYmxhZGRlciBCJywgTlMoc3BhbT1GYWxzZSwgYmFkZ2VyPVRydWUsIGJsYWRkZXI9J0InKSksCisgICAgICAgICgnLS1zcGFtIC0tc3BhbScsIE5TKHNwYW09VHJ1ZSwgYmFkZ2VyPVRydWUsIGJsYWRkZXI9Tm9uZSkpLAorICAgIF0KKyAgICBzdWNjZXNzZXNfd2hlbl9ub3RfcmVxdWlyZWQgPSBbCisgICAgICAgICgnJywgTlMoc3BhbT1GYWxzZSwgYmFkZ2VyPVRydWUsIGJsYWRkZXI9Tm9uZSkpLAorICAgIF0KKworICAgIHVzYWdlX3doZW5fcmVxdWlyZWQgPSB1c2FnZV93aGVuX25vdF9yZXF1aXJlZCA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXQorICAgICAgICAnJycKKyAgICBoZWxwID0gJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZU9wdGlvbmFsQW5kUG9zaXRpb25hbChNRU1peGluLCBUZXN0Q2FzZSk6CisKKyAgICBkZWYgZ2V0X3BhcnNlcihzZWxmLCByZXF1aXJlZCk6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICBncm91cCA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKHJlcXVpcmVkPXJlcXVpcmVkKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy0tZm9vJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nRk9PJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctLXNwYW0nLCBoZWxwPSdTUEFNJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCdiYWRnZXInLCBuYXJncz0nKicsIGRlZmF1bHQ9J1gnLCBoZWxwPSdCQURHRVInKQorICAgICAgICByZXR1cm4gcGFyc2VyCisKKyAgICBmYWlsdXJlcyA9IFsKKyAgICAgICAgJy0tZm9vIC0tc3BhbSBTJywKKyAgICAgICAgJy0tc3BhbSBTIFgnLAorICAgICAgICAnWCAtLWZvbycsCisgICAgICAgICdYIFkgWiAtLXNwYW0gUycsCisgICAgICAgICctLWZvbyBYIFknLAorICAgIF0KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLS1mb28nLCBOUyhmb289VHJ1ZSwgc3BhbT1Ob25lLCBiYWRnZXI9J1gnKSksCisgICAgICAgICgnLS1zcGFtIFMnLCBOUyhmb289RmFsc2UsIHNwYW09J1MnLCBiYWRnZXI9J1gnKSksCisgICAgICAgICgnWCcsIE5TKGZvbz1GYWxzZSwgc3BhbT1Ob25lLCBiYWRnZXI9WydYJ10pKSwKKyAgICAgICAgKCdYIFkgWicsIE5TKGZvbz1GYWxzZSwgc3BhbT1Ob25lLCBiYWRnZXI9WydYJywgJ1knLCAnWiddKSksCisgICAgXQorICAgIHN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZCA9IFsKKyAgICAgICAgKCcnLCBOUyhmb289RmFsc2UsIHNwYW09Tm9uZSwgYmFkZ2VyPSdYJykpLAorICAgIF0KKworICAgIHVzYWdlX3doZW5fbm90X3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvbyB8IC0tc3BhbSBTUEFNIHwgYmFkZ2VyIFtiYWRnZXIgLi4uXV0KKyAgICAgICAgJycnCisgICAgdXNhZ2Vfd2hlbl9yZXF1aXJlZCA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSAoLS1mb28gfCAtLXNwYW0gU1BBTSB8IGJhZGdlciBbYmFkZ2VyIC4uLl0pCisgICAgICAgICcnJworICAgIGhlbHAgPSAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYmFkZ2VyICAgICAgIEJBREdFUgorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vICAgICAgICBGT08KKyAgICAgICAgICAtLXNwYW0gU1BBTSAgU1BBTQorICAgICAgICAnJycKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVPcHRpb25hbHNNaXhlZChNRU1peGluLCBUZXN0Q2FzZSk6CisKKyAgICBkZWYgZ2V0X3BhcnNlcihzZWxmLCByZXF1aXJlZCk6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J3ggaGVscCcpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWEnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdhIGhlbHAnKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy1iJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nYiBoZWxwJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXknLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSd5IGhlbHAnKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy1jJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nYyBoZWxwJykKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZmFpbHVyZXMgPSBbJy1hIC1iJywgJy1iIC1jJywgJy1hIC1jJywgJy1hIC1iIC1jJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLWEnLCBOUyhhPVRydWUsIGI9RmFsc2UsIGM9RmFsc2UsIHg9RmFsc2UsIHk9RmFsc2UpKSwKKyAgICAgICAgKCctYicsIE5TKGE9RmFsc2UsIGI9VHJ1ZSwgYz1GYWxzZSwgeD1GYWxzZSwgeT1GYWxzZSkpLAorICAgICAgICAoJy1jJywgTlMoYT1GYWxzZSwgYj1GYWxzZSwgYz1UcnVlLCB4PUZhbHNlLCB5PUZhbHNlKSksCisgICAgICAgICgnLWEgLXgnLCBOUyhhPVRydWUsIGI9RmFsc2UsIGM9RmFsc2UsIHg9VHJ1ZSwgeT1GYWxzZSkpLAorICAgICAgICAoJy15IC1iJywgTlMoYT1GYWxzZSwgYj1UcnVlLCBjPUZhbHNlLCB4PUZhbHNlLCB5PVRydWUpKSwKKyAgICAgICAgKCcteCAteSAtYycsIE5TKGE9RmFsc2UsIGI9RmFsc2UsIGM9VHJ1ZSwgeD1UcnVlLCB5PVRydWUpKSwKKyAgICBdCisgICAgc3VjY2Vzc2VzX3doZW5fbm90X3JlcXVpcmVkID0gWworICAgICAgICAoJycsIE5TKGE9RmFsc2UsIGI9RmFsc2UsIGM9RmFsc2UsIHg9RmFsc2UsIHk9RmFsc2UpKSwKKyAgICAgICAgKCcteCcsIE5TKGE9RmFsc2UsIGI9RmFsc2UsIGM9RmFsc2UsIHg9VHJ1ZSwgeT1GYWxzZSkpLAorICAgICAgICAoJy15JywgTlMoYT1GYWxzZSwgYj1GYWxzZSwgYz1GYWxzZSwgeD1GYWxzZSwgeT1UcnVlKSksCisgICAgXQorCisgICAgdXNhZ2Vfd2hlbl9yZXF1aXJlZCA9IHVzYWdlX3doZW5fbm90X3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteF0gWy1hXSBbLWJdIFsteV0gWy1jXQorICAgICAgICAnJycKKyAgICBoZWxwID0gJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXggICAgICAgICAgeCBoZWxwCisgICAgICAgICAgLWEgICAgICAgICAgYSBoZWxwCisgICAgICAgICAgLWIgICAgICAgICAgYiBoZWxwCisgICAgICAgICAgLXkgICAgICAgICAgeSBoZWxwCisgICAgICAgICAgLWMgICAgICAgICAgYyBoZWxwCisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUluR3JvdXAoTUVNaXhpbiwgVGVzdENhc2UpOgorCisgICAgZGVmIGdldF9wYXJzZXIoc2VsZiwgcmVxdWlyZWQ9Tm9uZSk6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICB0aXRsZWRfZ3JvdXAgPSBwYXJzZXIuYWRkX2FyZ3VtZW50X2dyb3VwKAorICAgICAgICAgICAgdGl0bGU9J1RpdGxlZCBncm91cCcsIGRlc2NyaXB0aW9uPSdHcm91cCBkZXNjcmlwdGlvbicpCisgICAgICAgIG11dGV4X2dyb3VwID0gXAorICAgICAgICAgICAgdGl0bGVkX2dyb3VwLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIG11dGV4X2dyb3VwLmFkZF9hcmd1bWVudCgnLS1iYXInLCBoZWxwPSdiYXIgaGVscCcpCisgICAgICAgIG11dGV4X2dyb3VwLmFkZF9hcmd1bWVudCgnLS1iYXonLCBoZWxwPSdiYXogaGVscCcpCisgICAgICAgIHJldHVybiBwYXJzZXIKKworICAgIGZhaWx1cmVzID0gWyctLWJhciBYIC0tYmF6IFknLCAnLS1iYXogWCAtLWJhciBZJ10KKyAgICBzdWNjZXNzZXMgPSBbCisgICAgICAgICgnLS1iYXIgWCcsIE5TKGJhcj0nWCcsIGJhej1Ob25lKSksCisgICAgICAgICgnLS1iYXogWScsIE5TKGJhcj1Ob25lLCBiYXo9J1knKSksCisgICAgXQorICAgIHN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZCA9IFsKKyAgICAgICAgKCcnLCBOUyhiYXI9Tm9uZSwgYmF6PU5vbmUpKSwKKyAgICBdCisKKyAgICB1c2FnZV93aGVuX25vdF9yZXF1aXJlZCA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1iYXIgQkFSIHwgLS1iYXogQkFaXQorICAgICAgICAnJycKKyAgICB1c2FnZV93aGVuX3JlcXVpcmVkID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdICgtLWJhciBCQVIgfCAtLWJheiBCQVopCisgICAgICAgICcnJworICAgIGhlbHAgPSAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKworICAgICAgICBUaXRsZWQgZ3JvdXA6CisgICAgICAgICAgR3JvdXAgZGVzY3JpcHRpb24KKworICAgICAgICAgIC0tYmFyIEJBUiAgIGJhciBoZWxwCisgICAgICAgICAgLS1iYXogQkFaICAgYmF6IGhlbHAKKyAgICAgICAgJycnCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlT3B0aW9uYWxzQW5kUG9zaXRpb25hbHNNaXhlZChNRU1peGluLCBUZXN0Q2FzZSk6CisKKyAgICBkZWYgZ2V0X3BhcnNlcihzZWxmLCByZXF1aXJlZCk6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCd4JywgaGVscD0neCBoZWxwJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXknLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSd5IGhlbHAnKQorICAgICAgICBncm91cCA9IHBhcnNlci5hZGRfbXV0dWFsbHlfZXhjbHVzaXZlX2dyb3VwKHJlcXVpcmVkPXJlcXVpcmVkKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJ2EnLCBuYXJncz0nPycsIGhlbHA9J2EgaGVscCcpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLWInLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdiIGhlbHAnKQorICAgICAgICBncm91cC5hZGRfYXJndW1lbnQoJy1jJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nYyBoZWxwJykKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZmFpbHVyZXMgPSBbJ1ggQSAtYicsICctYiAtYycsICctYyBYIEEnXQorICAgIHN1Y2Nlc3NlcyA9IFsKKyAgICAgICAgKCdYIEEnLCBOUyhhPSdBJywgYj1GYWxzZSwgYz1GYWxzZSwgeD0nWCcsIHk9RmFsc2UpKSwKKyAgICAgICAgKCdYIC1iJywgTlMoYT1Ob25lLCBiPVRydWUsIGM9RmFsc2UsIHg9J1gnLCB5PUZhbHNlKSksCisgICAgICAgICgnWCAtYycsIE5TKGE9Tm9uZSwgYj1GYWxzZSwgYz1UcnVlLCB4PSdYJywgeT1GYWxzZSkpLAorICAgICAgICAoJ1ggQSAteScsIE5TKGE9J0EnLCBiPUZhbHNlLCBjPUZhbHNlLCB4PSdYJywgeT1UcnVlKSksCisgICAgICAgICgnWCAteSAtYicsIE5TKGE9Tm9uZSwgYj1UcnVlLCBjPUZhbHNlLCB4PSdYJywgeT1UcnVlKSksCisgICAgXQorICAgIHN1Y2Nlc3Nlc193aGVuX25vdF9yZXF1aXJlZCA9IFsKKyAgICAgICAgKCdYJywgTlMoYT1Ob25lLCBiPUZhbHNlLCBjPUZhbHNlLCB4PSdYJywgeT1GYWxzZSkpLAorICAgICAgICAoJ1ggLXknLCBOUyhhPU5vbmUsIGI9RmFsc2UsIGM9RmFsc2UsIHg9J1gnLCB5PVRydWUpKSwKKyAgICBdCisKKyAgICB1c2FnZV93aGVuX3JlcXVpcmVkID0gdXNhZ2Vfd2hlbl9ub3RfcmVxdWlyZWQgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy15XSBbLWJdIFstY10geCBbYV0KKyAgICAgICAgJycnCisgICAgaGVscCA9ICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICB4ICAgICAgICAgICB4IGhlbHAKKyAgICAgICAgICBhICAgICAgICAgICBhIGhlbHAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC15ICAgICAgICAgIHkgaGVscAorICAgICAgICAgIC1iICAgICAgICAgIGIgaGVscAorICAgICAgICAgIC1jICAgICAgICAgIGMgaGVscAorICAgICAgICAnJycKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIE11dHVhbGx5IGV4Y2x1c2l2ZSBncm91cCBpbiBwYXJlbnQgcGFyc2VyIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgTUVQQmFzZShvYmplY3QpOgorCisgICAgZGVmIGdldF9wYXJzZXIoc2VsZiwgcmVxdWlyZWQ9Tm9uZSk6CisgICAgICAgIHBhcmVudCA9IHN1cGVyKE1FUEJhc2UsIHNlbGYpLmdldF9wYXJzZXIocmVxdWlyZWQ9cmVxdWlyZWQpCisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKAorICAgICAgICAgICAgcHJvZz1wYXJlbnQucHJvZywgYWRkX2hlbHA9RmFsc2UsIHBhcmVudHM9W3BhcmVudF0pCisgICAgICAgIHJldHVybiBwYXJzZXIKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVHcm91cEVycm9yc1BhcmVudCgKKyAgICBNRVBCYXNlLCBUZXN0TXV0dWFsbHlFeGNsdXNpdmVHcm91cEVycm9ycyk6CisgICAgcGFzcworCisKK2NsYXNzIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZVNpbXBsZVBhcmVudCgKKyAgICBNRVBCYXNlLCBUZXN0TXV0dWFsbHlFeGNsdXNpdmVTaW1wbGUpOgorICAgIHBhc3MKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVMb25nUGFyZW50KAorICAgIE1FUEJhc2UsIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZUxvbmcpOgorICAgIHBhc3MKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVGaXJzdFN1cHByZXNzZWRQYXJlbnQoCisgICAgTUVQQmFzZSwgVGVzdE11dHVhbGx5RXhjbHVzaXZlRmlyc3RTdXBwcmVzc2VkKToKKyAgICBwYXNzCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlTWFueVN1cHByZXNzZWRQYXJlbnQoCisgICAgTUVQQmFzZSwgVGVzdE11dHVhbGx5RXhjbHVzaXZlTWFueVN1cHByZXNzZWQpOgorICAgIHBhc3MKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVPcHRpb25hbEFuZFBvc2l0aW9uYWxQYXJlbnQoCisgICAgTUVQQmFzZSwgVGVzdE11dHVhbGx5RXhjbHVzaXZlT3B0aW9uYWxBbmRQb3NpdGlvbmFsKToKKyAgICBwYXNzCisKKworY2xhc3MgVGVzdE11dHVhbGx5RXhjbHVzaXZlT3B0aW9uYWxzTWl4ZWRQYXJlbnQoCisgICAgTUVQQmFzZSwgVGVzdE11dHVhbGx5RXhjbHVzaXZlT3B0aW9uYWxzTWl4ZWQpOgorICAgIHBhc3MKKworCitjbGFzcyBUZXN0TXV0dWFsbHlFeGNsdXNpdmVPcHRpb25hbHNBbmRQb3NpdGlvbmFsc01peGVkUGFyZW50KAorICAgIE1FUEJhc2UsIFRlc3RNdXR1YWxseUV4Y2x1c2l2ZU9wdGlvbmFsc0FuZFBvc2l0aW9uYWxzTWl4ZWQpOgorICAgIHBhc3MKKworIyA9PT09PT09PT09PT09PT09PQorIyBTZXQgZGVmYXVsdCB0ZXN0cworIyA9PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0U2V0RGVmYXVsdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2V0X2RlZmF1bHRzX25vX2FyZ3Moc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh4PSdmb28nKQorICAgICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHk9J2JhcicsIHo9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PSdmb28nLCB5PSdiYXInLCB6PTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PSdmb28nLCB5PSdiYXInLCB6PTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdLCBOUygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PSdiYXonLCB5PSdiYXInLCB6PTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdLCBOUyh4PSdiYXonKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0nYmF6JywgeT0nYmFyJywgej0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSwgTlMoeD0nYmF6Jywgej0yKSkpCisKKyAgICBkZWYgdGVzdF9zZXRfZGVmYXVsdHNfd2l0aF9hcmdzKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRfZGVmYXVsdHMoeD0nZm9vJywgeT0nYmFyJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXgnLCBkZWZhdWx0PSd4Zm9veCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0neGZvb3gnLCB5PSdiYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0neGZvb3gnLCB5PSdiYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSwgTlMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0nYmF6JywgeT0nYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10sIE5TKHg9J2JheicpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh4PScxJywgeT0nYmFyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoJy14IDEnLnNwbGl0KCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHg9JzEnLCB5PSdiYXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncygnLXggMScuc3BsaXQoKSwgTlMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlMoeD0nMScsIHk9J2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKCcteCAxJy5zcGxpdCgpLCBOUyh4PSdiYXonKSkpCisKKyAgICBkZWYgdGVzdF9zZXRfZGVmYXVsdHNfc3VicGFyc2VycyhzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHg9J2ZvbycpCisgICAgICAgIHN1YnBhcnNlcnMgPSBwYXJzZXIuYWRkX3N1YnBhcnNlcnMoKQorICAgICAgICBwYXJzZXJfYSA9IHN1YnBhcnNlcnMuYWRkX3BhcnNlcignYScpCisgICAgICAgIHBhcnNlcl9hLnNldF9kZWZhdWx0cyh5PSdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHg9J2ZvbycsIHk9J2JhcicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKCdhJy5zcGxpdCgpKSkKKworICAgIGRlZiB0ZXN0X3NldF9kZWZhdWx0c19wYXJlbnRzKHNlbGYpOgorICAgICAgICBwYXJlbnQgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSkKKyAgICAgICAgcGFyZW50LnNldF9kZWZhdWx0cyh4PSdmb28nKQorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihwYXJlbnRzPVtwYXJlbnRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHg9J2ZvbycpLCBwYXJzZXIucGFyc2VfYXJncyhbXSkpCisKKyAgICBkZWYgdGVzdF9zZXRfZGVmYXVsdHNfc2FtZV9hc19hZGRfYXJndW1lbnQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh3PSdXJywgeD0nWCcsIHk9J1knLCB6PSdaJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXcnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsIGRlZmF1bHQ9J1hYJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgneScsIG5hcmdzPSc/JykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgneicsIG5hcmdzPSc/JywgZGVmYXVsdD0nWlonKQorCisgICAgICAgICMgZGVmYXVsdHMgc2V0IHByZXZpb3VzbHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh3PSdXJywgeD0nWFgnLCB5PSdZJywgej0nWlonKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSkpCisKKyAgICAgICAgIyByZXNldCBkZWZhdWx0cworICAgICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKHc9J1dXJywgeD0nWCcsIHk9J1lZJywgej0nWicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlModz0nV1cnLCB4PSdYJywgeT0nWVknLCB6PSdaJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10pKQorCisgICAgZGVmIHRlc3Rfc2V0X2RlZmF1bHRzX3NhbWVfYXNfYWRkX2FyZ3VtZW50X2dyb3VwKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRfZGVmYXVsdHModz0nVycsIHg9J1gnLCB5PSdZJywgej0nWicpCisgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgnZm9vJykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCctdycpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgnLXgnLCBkZWZhdWx0PSdYWCcpCisgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgneScsIG5hcmdzPSc/JykKKyAgICAgICAgZ3JvdXAuYWRkX2FyZ3VtZW50KCd6JywgbmFyZ3M9Jz8nLCBkZWZhdWx0PSdaWicpCisKKworICAgICAgICAjIGRlZmF1bHRzIHNldCBwcmV2aW91c2x5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlModz0nVycsIHg9J1hYJywgeT0nWScsIHo9J1paJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoW10pKQorCisgICAgICAgICMgcmVzZXQgZGVmYXVsdHMKKyAgICAgICAgcGFyc2VyLnNldF9kZWZhdWx0cyh3PSdXVycsIHg9J1gnLCB5PSdZWScsIHo9J1onKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKHc9J1dXJywgeD0nWCcsIHk9J1lZJywgej0nWicpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci5wYXJzZV9hcmdzKFtdKSkKKworIyA9PT09PT09PT09PT09PT09PQorIyBHZXQgZGVmYXVsdCB0ZXN0cworIyA9PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0R2V0RGVmYXVsdChUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9nZXRfZGVmYXVsdChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHBhcnNlci5nZXRfZGVmYXVsdCgiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcGFyc2VyLmdldF9kZWZhdWx0KCJiYXIiKSkKKworICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItLWZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcGFyc2VyLmdldF9kZWZhdWx0KCJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBwYXJzZXIuZ2V0X2RlZmF1bHQoImJhciIpKQorCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tYmFyIiwgdHlwZT1pbnQsIGRlZmF1bHQ9NDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcGFyc2VyLmdldF9kZWZhdWx0KCJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgcGFyc2VyLmdldF9kZWZhdWx0KCJiYXIiKSkKKworICAgICAgICBwYXJzZXIuc2V0X2RlZmF1bHRzKGZvbz0iYmFkZ2VyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYmFkZ2VyIiwgcGFyc2VyLmdldF9kZWZhdWx0KCJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgcGFyc2VyLmdldF9kZWZhdWx0KCJiYXIiKSkKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBOYW1lc3BhY2UgJ2NvbnRhaW5zJyB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0TmFtZXNwYWNlQ29udGFpbnNTaW1wbGUoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJyBpbiBucywgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgbm90IGluIG5zLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd4JyBpbiBucywgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9ub25fZW1wdHkoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKHg9MSwgeT0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd4JyBpbiBucywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgneCcgbm90IGluIG5zLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgneScgaW4gbnMsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycgaW4gbnMsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd4eCcgaW4gbnMsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd6JyBpbiBucywgRmFsc2UpCisKKyMgPT09PT09PT09PT09PT09PT09PT09CisjIEhlbHAgZm9ybWF0dGluZyB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEhlbHBGb3JtYXR0aW5nTWV0YWNsYXNzKHR5cGUpOgorCisgICAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGJvZHlkaWN0KToKKyAgICAgICAgaWYgbmFtZSA9PSAnSGVscFRlc3RDYXNlJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGNsYXNzIEFkZFRlc3RzKG9iamVjdCk6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X2NsYXNzLCBmdW5jX3N1ZmZpeCwgc3RkX25hbWUpOgorICAgICAgICAgICAgICAgIHNlbGYuZnVuY19zdWZmaXggPSBmdW5jX3N1ZmZpeAorICAgICAgICAgICAgICAgIHNlbGYuc3RkX25hbWUgPSBzdGRfbmFtZQorCisgICAgICAgICAgICAgICAgZm9yIHRlc3RfZnVuYyBpbiBbc2VsZi50ZXN0X2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3RfcHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZXN0X3ByaW50X2ZpbGVdOgorICAgICAgICAgICAgICAgICAgICB0ZXN0X25hbWUgPSAnJXNfJXMnICUgKHRlc3RfZnVuYy5fX25hbWVfXywgZnVuY19zdWZmaXgpCisKKyAgICAgICAgICAgICAgICAgICAgZGVmIHRlc3Rfd3JhcHBlcihzZWxmLCB0ZXN0X2Z1bmM9dGVzdF9mdW5jKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfZnVuYyhzZWxmKQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3dyYXBwZXIuX19uYW1lX18gPSB0ZXN0X25hbWUKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cih0ZXN0X2NsYXNzLCB0ZXN0X25hbWUsIHRlc3Rfd3JhcHBlcikKKworICAgICAgICAgICAgZGVmIF9nZXRfcGFyc2VyKHNlbGYsIHRlc3Rlcik6CisgICAgICAgICAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoCisgICAgICAgICAgICAgICAgICAgICp0ZXN0ZXIucGFyc2VyX3NpZ25hdHVyZS5hcmdzLAorICAgICAgICAgICAgICAgICAgICAqKnRlc3Rlci5wYXJzZXJfc2lnbmF0dXJlLmt3YXJncykKKyAgICAgICAgICAgICAgICBmb3IgYXJndW1lbnRfc2lnIGluIGdldGF0dHIodGVzdGVyLCAnYXJndW1lbnRfc2lnbmF0dXJlcycsIFtdKToKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgqYXJndW1lbnRfc2lnLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiphcmd1bWVudF9zaWcua3dhcmdzKQorICAgICAgICAgICAgICAgIGdyb3VwX3NpZ3MgPSBnZXRhdHRyKHRlc3RlciwgJ2FyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMnLCBbXSkKKyAgICAgICAgICAgICAgICBmb3IgZ3JvdXBfc2lnLCBhcmd1bWVudF9zaWdzIGluIGdyb3VwX3NpZ3M6CisgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gcGFyc2VyLmFkZF9hcmd1bWVudF9ncm91cCgqZ3JvdXBfc2lnLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKmdyb3VwX3NpZy5rd2FyZ3MpCisgICAgICAgICAgICAgICAgICAgIGZvciBhcmd1bWVudF9zaWcgaW4gYXJndW1lbnRfc2lnczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLmFkZF9hcmd1bWVudCgqYXJndW1lbnRfc2lnLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiphcmd1bWVudF9zaWcua3dhcmdzKQorICAgICAgICAgICAgICAgIHN1YnBhcnNlcnNfc2lncyA9IGdldGF0dHIodGVzdGVyLCAnc3VicGFyc2Vyc19zaWduYXR1cmVzJywgW10pCisgICAgICAgICAgICAgICAgaWYgc3VicGFyc2Vyc19zaWdzOgorICAgICAgICAgICAgICAgICAgICBzdWJwYXJzZXJzID0gcGFyc2VyLmFkZF9zdWJwYXJzZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIHN1YnBhcnNlcl9zaWcgaW4gc3VicGFyc2Vyc19zaWdzOgorICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFyc2Vycy5hZGRfcGFyc2VyKCpzdWJwYXJzZXJfc2lnLmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqc3VicGFyc2VyX3NpZy5rd2FyZ3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgICAgICAgICBkZWYgX3Rlc3Qoc2VsZiwgdGVzdGVyLCBwYXJzZXJfdGV4dCk6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdGV4dCA9IGdldGF0dHIodGVzdGVyLCBzZWxmLmZ1bmNfc3VmZml4KQorICAgICAgICAgICAgICAgIGV4cGVjdGVkX3RleHQgPSB0ZXh0d3JhcC5kZWRlbnQoZXhwZWN0ZWRfdGV4dCkKKyAgICAgICAgICAgICAgICBpZiBleHBlY3RlZF90ZXh0ICE9IHBhcnNlcl90ZXh0OgorICAgICAgICAgICAgICAgICAgICBwcmludChyZXByKGV4cGVjdGVkX3RleHQpKQorICAgICAgICAgICAgICAgICAgICBwcmludChyZXByKHBhcnNlcl90ZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNoYXIxLCBjaGFyMiBpbiB6aXAoZXhwZWN0ZWRfdGV4dCwgcGFyc2VyX3RleHQpOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgY2hhcjEgIT0gY2hhcjI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQoJ2ZpcnN0IGRpZmY6ICVyICVyJyAlIChjaGFyMSwgY2hhcjIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgdGVzdGVyLmFzc2VydEVxdWFsKGV4cGVjdGVkX3RleHQsIHBhcnNlcl90ZXh0KQorCisgICAgICAgICAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZiwgdGVzdGVyKToKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBzZWxmLl9nZXRfcGFyc2VyKHRlc3RlcikKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBnZXRhdHRyKHBhcnNlciwgJ2Zvcm1hdF8lcycgJSBzZWxmLmZ1bmNfc3VmZml4KQorICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3QodGVzdGVyLCBmb3JtYXQoKSkKKworICAgICAgICAgICAgZGVmIHRlc3RfcHJpbnQoc2VsZiwgdGVzdGVyKToKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBzZWxmLl9nZXRfcGFyc2VyKHRlc3RlcikKKyAgICAgICAgICAgICAgICBwcmludF8gPSBnZXRhdHRyKHBhcnNlciwgJ3ByaW50XyVzJyAlIHNlbGYuZnVuY19zdWZmaXgpCisgICAgICAgICAgICAgICAgb2xkX3N0cmVhbSA9IGdldGF0dHIoc3lzLCBzZWxmLnN0ZF9uYW1lKQorICAgICAgICAgICAgICAgIHNldGF0dHIoc3lzLCBzZWxmLnN0ZF9uYW1lLCBTdGRJT0J1ZmZlcigpKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRfKCkKKyAgICAgICAgICAgICAgICAgICAgcGFyc2VyX3RleHQgPSBnZXRhdHRyKHN5cywgc2VsZi5zdGRfbmFtZSkuZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc3lzLCBzZWxmLnN0ZF9uYW1lLCBvbGRfc3RyZWFtKQorICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3QodGVzdGVyLCBwYXJzZXJfdGV4dCkKKworICAgICAgICAgICAgZGVmIHRlc3RfcHJpbnRfZmlsZShzZWxmLCB0ZXN0ZXIpOgorICAgICAgICAgICAgICAgIHBhcnNlciA9IHNlbGYuX2dldF9wYXJzZXIodGVzdGVyKQorICAgICAgICAgICAgICAgIHByaW50XyA9IGdldGF0dHIocGFyc2VyLCAncHJpbnRfJXMnICUgc2VsZi5mdW5jX3N1ZmZpeCkKKyAgICAgICAgICAgICAgICBzZmlsZSA9IFN0ZElPQnVmZmVyKCkKKyAgICAgICAgICAgICAgICBwcmludF8oc2ZpbGUpCisgICAgICAgICAgICAgICAgcGFyc2VyX3RleHQgPSBzZmlsZS5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgc2VsZi5fdGVzdCh0ZXN0ZXIsIHBhcnNlcl90ZXh0KQorCisgICAgICAgICMgYWRkIHRlc3RzIGZvciB7Zm9ybWF0LHByaW50fV97dXNhZ2UsaGVscCx2ZXJzaW9ufQorICAgICAgICBmb3IgZnVuY19zdWZmaXgsIHN0ZF9uYW1lIGluIFsoJ3VzYWdlJywgJ3N0ZG91dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2hlbHAnLCAnc3Rkb3V0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndmVyc2lvbicsICdzdGRlcnInKV06CisgICAgICAgICAgICBBZGRUZXN0cyhjbHMsIGZ1bmNfc3VmZml4LCBzdGRfbmFtZSkKKworYmFzZXMgPSBUZXN0Q2FzZSwKK0hlbHBUZXN0Q2FzZSA9IFRlc3RIZWxwRm9ybWF0dGluZ01ldGFjbGFzcygnSGVscFRlc3RDYXNlJywgYmFzZXMsIHt9KQorCisKK2NsYXNzIFRlc3RIZWxwQmlnZ2VyT3B0aW9uYWxzKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiTWFrZSBzdXJlIHRoYXQgYXJndW1lbnQgaGVscCBhbGlnbnMgd2hlbiBvcHRpb25zIGFyZSBsb25nZXIiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGRlc2NyaXB0aW9uPSdERVNDUklQVElPTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9J0VQSUxPRycsIHZlcnNpb249JzAuMScpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J1ggSEVMUCcpLAorICAgICAgICBTaWcoJy0teScsIGhlbHA9J1kgSEVMUCcpLAorICAgICAgICBTaWcoJ2ZvbycsIGhlbHA9J0ZPTyBIRUxQJyksCisgICAgICAgIFNpZygnYmFyJywgaGVscD0nQkFSIEhFTFAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy12XSBbLXhdIFstLXkgWV0gZm9vIGJhcgorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgREVTQ1JJUFRJT04KKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBmb28gICAgICAgICAgICBGT08gSEVMUAorICAgICAgICAgIGJhciAgICAgICAgICAgIEJBUiBIRUxQCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdiwgLS12ZXJzaW9uICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAgICAgICAgIC14ICAgICAgICAgICAgIFggSEVMUAorICAgICAgICAgIC0teSBZICAgICAgICAgIFkgSEVMUAorCisgICAgICAgIEVQSUxPRworICAgICcnJworICAgIHZlcnNpb24gPSAnJydcCisgICAgICAgIDAuMQorICAgICAgICAnJycKKworCitjbGFzcyBUZXN0SGVscEJpZ2dlck9wdGlvbmFsR3JvdXBzKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiTWFrZSBzdXJlIHRoYXQgYXJndW1lbnQgaGVscCBhbGlnbnMgd2hlbiBvcHRpb25zIGFyZSBsb25nZXIiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGRlc2NyaXB0aW9uPSdERVNDUklQVElPTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGlsb2c9J0VQSUxPRycsIHZlcnNpb249JzAuMScpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J1ggSEVMUCcpLAorICAgICAgICBTaWcoJy0teScsIGhlbHA9J1kgSEVMUCcpLAorICAgICAgICBTaWcoJ2ZvbycsIGhlbHA9J0ZPTyBIRUxQJyksCisgICAgICAgIFNpZygnYmFyJywgaGVscD0nQkFSIEhFTFAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgKFNpZygnR1JPVVAgVElUTEUnLCBkZXNjcmlwdGlvbj0nR1JPVVAgREVTQ1JJUFRJT04nKSwgWworICAgICAgICAgICAgU2lnKCdiYXonLCBoZWxwPSdCQVogSEVMUCcpLAorICAgICAgICAgICAgU2lnKCcteicsIG5hcmdzPScrJywgaGVscD0nWiBIRUxQJyldKSwKKyAgICBdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy12XSBbLXhdIFstLXkgWV0gWy16IFogW1ogLi4uXV0gZm9vIGJhciBiYXoKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIERFU0NSSVBUSU9OCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgZm9vICAgICAgICAgICAgRk9PIEhFTFAKKyAgICAgICAgICBiYXIgICAgICAgICAgICBCQVIgSEVMUAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXYsIC0tdmVyc2lvbiAgc2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgICAgICAgICAteCAgICAgICAgICAgICBYIEhFTFAKKyAgICAgICAgICAtLXkgWSAgICAgICAgICBZIEhFTFAKKworICAgICAgICBHUk9VUCBUSVRMRToKKyAgICAgICAgICBHUk9VUCBERVNDUklQVElPTgorCisgICAgICAgICAgYmF6ICAgICAgICAgICAgQkFaIEhFTFAKKyAgICAgICAgICAteiBaIFtaIC4uLl0gICBaIEhFTFAKKworICAgICAgICBFUElMT0cKKyAgICAnJycKKyAgICB2ZXJzaW9uID0gJycnXAorICAgICAgICAwLjEKKyAgICAgICAgJycnCisKKworY2xhc3MgVGVzdEhlbHBCaWdnZXJQb3NpdGlvbmFscyhIZWxwVGVzdENhc2UpOgorICAgICIiIk1ha2Ugc3VyZSB0aGF0IGhlbHAgYWxpZ25zIHdoZW4gYXJndW1lbnRzIGFyZSBsb25nZXIiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcodXNhZ2U9J1VTQUdFJywgZGVzY3JpcHRpb249J0RFU0NSSVBUSU9OJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nWCBIRUxQJyksCisgICAgICAgIFNpZygnLS15JywgaGVscD0nWSBIRUxQJyksCisgICAgICAgIFNpZygnZWtpZWtpZWtpZmVrYW5nJywgaGVscD0nRUtJIEhFTFAnKSwKKyAgICAgICAgU2lnKCdiYXInLCBoZWxwPSdCQVIgSEVMUCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFVTQUdFCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBERVNDUklQVElPTgorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIGVraWVraWVraWZla2FuZyAgRUtJIEhFTFAKKyAgICAgICAgICBiYXIgICAgICAgICAgICAgIEJBUiBIRUxQCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC14ICAgICAgICAgICAgICAgWCBIRUxQCisgICAgICAgICAgLS15IFkgICAgICAgICAgICBZIEhFTFAKKyAgICAgICAgJycnCisKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFJlZm9ybWF0dGluZyhIZWxwVGVzdENhc2UpOgorICAgICIiIk1ha2Ugc3VyZSB0aGF0IHRleHQgYWZ0ZXIgc2hvcnQgbmFtZXMgc3RhcnRzIG9uIHRoZSBmaXJzdCBsaW5lIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKAorICAgICAgICBwcm9nPSdQUk9HJywKKyAgICAgICAgZGVzY3JpcHRpb249JyAgIG9kZGx5ICAgIGZvcm1hdHRlZFxuJworICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb25cbicKKyAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAndGhhdCBpcyBzbyBsb25nIHRoYXQgaXQgc2hvdWxkIGdvIG9udG8gbXVsdGlwbGUgJworICAgICAgICAgICAgICAgICAgICAnbGluZXMgd2hlbiB3cmFwcGVkJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgbWV0YXZhcj0nWFgnLCBoZWxwPSdvZGRseVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgZm9ybWF0dGVkIC14IGhlbHAnKSwKKyAgICAgICAgU2lnKCd5JywgbWV0YXZhcj0neXl5JywgaGVscD0nbm9ybWFsIHkgaGVscCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gWworICAgICAgICAoU2lnKCd0aXRsZScsIGRlc2NyaXB0aW9uPSdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIG9kZGx5IGZvcm1hdHRlZCBncm91cFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGVzY3JpcHRpb24nKSwKKyAgICAgICAgIFtTaWcoJy1hJywgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgICAgICAgICAgaGVscD0nIG9kZGx5IFxuJworICAgICAgICAgICAgICAgICAgICdmb3JtYXR0ZWQgICAgLWEgIGhlbHAgIFxuJworICAgICAgICAgICAgICAgICAgICcgICAgYWdhaW4sIHNvIGxvbmcgdGhhdCBpdCBzaG91bGQgYmUgd3JhcHBlZCBvdmVyICcKKyAgICAgICAgICAgICAgICAgICAnbXVsdGlwbGUgbGluZXMnKV0pLAorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXggWFhdIFstYV0geXl5CisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBvZGRseSBmb3JtYXR0ZWQgZGVzY3JpcHRpb24gdGhhdCBpcyBzbyBsb25nIHRoYXQgaXQgc2hvdWxkIGdvIG9udG8gXAorbXVsdGlwbGUKKyAgICAgICAgbGluZXMgd2hlbiB3cmFwcGVkCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgeXl5ICAgICAgICAgbm9ybWFsIHkgaGVscAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXggWFggICAgICAgb2RkbHkgZm9ybWF0dGVkIC14IGhlbHAKKworICAgICAgICB0aXRsZToKKyAgICAgICAgICBvZGRseSBmb3JtYXR0ZWQgZ3JvdXAgZGVzY3JpcHRpb24KKworICAgICAgICAgIC1hICAgICAgICAgIG9kZGx5IGZvcm1hdHRlZCAtYSBoZWxwIGFnYWluLCBzbyBsb25nIHRoYXQgaXQgc2hvdWxkIFwKK2JlIHdyYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICBvdmVyIG11bHRpcGxlIGxpbmVzCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwV3JhcHBpbmdTaG9ydE5hbWVzKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiTWFrZSBzdXJlIHRoYXQgdGV4dCBhZnRlciBzaG9ydCBuYW1lcyBzdGFydHMgb24gdGhlIGZpcnN0IGxpbmUiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIGRlc2NyaXB0aW9uPSAnRFxuRCcgKiAzMCkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgbWV0YXZhcj0nWFgnLCBoZWxwPSdYSEggSFgnICogMjApLAorICAgICAgICBTaWcoJ3knLCBtZXRhdmFyPSd5eXknLCBoZWxwPSdZSCBZSCcgKiAyMCksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ0FMUEhBUycpLCBbCisgICAgICAgICAgICBTaWcoJy1hJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nQUhISCBISEEnICogMTApXSksCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteCBYWF0gWy1hXSB5eXkKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIEQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgXAorREQgREQgREQKKyAgICAgICAgREQgREQgREQgREQgRAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHl5eSAgICAgICAgIFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggXAorWUhZSCBZSFlICisgICAgICAgICAgICAgICAgICAgICAgWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXggWFggICAgICAgWEhIIEhYWEhIIEhYWEhIIEhYWEhIIEhYWEhIIEhYWEhIIEhYWEhIIEhYWEhIIEhYWEhIIFwKK0hYWEhIIEhYWEhICisgICAgICAgICAgICAgICAgICAgICAgSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFhYSEggSFgKKworICAgICAgICBBTFBIQVM6CisgICAgICAgICAgLWEgICAgICAgICAgQUhISCBISEFBSEhIIEhIQUFISEggSEhBQUhISCBISEFBSEhIIEhIQUFISEggSEhBQUhISCBcCitISEFBSEhICisgICAgICAgICAgICAgICAgICAgICAgSEhBQUhISCBISEFBSEhIIEhIQQorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFdyYXBwaW5nTG9uZ05hbWVzKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiTWFrZSBzdXJlIHRoYXQgdGV4dCBhZnRlciBsb25nIG5hbWVzIHN0YXJ0cyBvbiB0aGUgbmV4dCBsaW5lIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHVzYWdlPSdVU0FHRScsIGRlc2NyaXB0aW9uPSAnRCBEJyAqIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbj0nViBWJyozMCkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgbWV0YXZhcj0nWCcgKiAyNSwgaGVscD0nWEggWEgnICogMjApLAorICAgICAgICBTaWcoJ3knLCBtZXRhdmFyPSd5JyAqIDI1LCBoZWxwPSdZSCBZSCcgKiAyMCksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ0FMUEhBUycpLCBbCisgICAgICAgICAgICBTaWcoJy1hJywgbWV0YXZhcj0nQScgKiAyNSwgaGVscD0nQUggQUgnICogMjApLAorICAgICAgICAgICAgU2lnKCd6JywgbWV0YXZhcj0neicgKiAyNSwgaGVscD0nWkggWkgnICogMjApXSksCisgICAgXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogVVNBR0UKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIEQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgREQgXAorREQgREQgREQKKyAgICAgICAgREQgREQgREQgREQgRAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFwKK1lIWUggWUhZSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSFlIIFlIWUggWUhZSCBZSAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC12LCAtLXZlcnNpb24gICAgICAgICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAgICAgICAgIC14IFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWEggWEhYSCBYSFhIIFhIWEggWEhYSCBYSFhIIFhIWEggWEhYSCBYSFhIIFwKK1hIWEggWEhYSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSFhIIFhIWEggWEhYSCBYSFhIIFhIWEggWEhYSCBYSFhIIFhIWEggWEhYSCBYSAorCisgICAgICAgIEFMUEhBUzoKKyAgICAgICAgICAtYSBBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFIIEFIQUggQUhBSCBBSEFIIEFIQUggQUhBSCBBSEFIIEFIQUggQUhBSCBcCitBSEFIIEFIQUgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUhBSCBBSEFIIEFIQUggQUhBSCBBSEFIIEFIQUggQUhBSCBBSEFIIEFIQUggQUgKKyAgICAgICAgICB6enp6enp6enp6enp6enp6enp6enp6enp6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpIIFpIWkggWkhaSCBaSFpIIFpIWkggWkhaSCBaSFpIIFpIWkggWkhaSCBcCitaSFpIIFpIWkgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWkhaSCBaSFpIIFpIWkggWkhaSCBaSFpIIFpIWkggWkhaSCBaSFpIIFpIWkggWkgKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnJ1wKKyAgICAgICAgViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBWViBcCitWViBWViBWVgorICAgICAgICBWViBWViBWViBWViBWCisgICAgICAgICcnJworCisKK2NsYXNzIFRlc3RIZWxwVXNhZ2UoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGJhc2ljIHVzYWdlIG1lc3NhZ2VzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXcnLCBuYXJncz0nKycsIGhlbHA9J3cnKSwKKyAgICAgICAgU2lnKCcteCcsIG5hcmdzPScqJywgaGVscD0neCcpLAorICAgICAgICBTaWcoJ2EnLCBoZWxwPSdhJyksCisgICAgICAgIFNpZygnYicsIGhlbHA9J2InLCBuYXJncz0yKSwKKyAgICAgICAgU2lnKCdjJywgaGVscD0nYycsIG5hcmdzPSc/JyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ2dyb3VwJyksIFsKKyAgICAgICAgICAgIFNpZygnLXknLCBuYXJncz0nPycsIGhlbHA9J3knKSwKKyAgICAgICAgICAgIFNpZygnLXonLCBuYXJncz0zLCBoZWxwPSd6JyksCisgICAgICAgICAgICBTaWcoJ2QnLCBoZWxwPSdkJywgbmFyZ3M9JyonKSwKKyAgICAgICAgICAgIFNpZygnZScsIGhlbHA9J2UnLCBuYXJncz0nKycpLAorICAgICAgICBdKQorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXcgVyBbVyAuLi5dXSBbLXggW1ggW1ggLi4uXV1dIFsteSBbWV1dIFsteiBaIFogWl0KKyAgICAgICAgICAgICAgICAgICAgYSBiIGIgW2NdIFtkIFtkIC4uLl1dIGUgW2UgLi4uXQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYSAgICAgICAgICAgICAgIGEKKyAgICAgICAgICBiICAgICAgICAgICAgICAgYgorICAgICAgICAgIGMgICAgICAgICAgICAgICBjCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXcgVyBbVyAuLi5dICAgIHcKKyAgICAgICAgICAteCBbWCBbWCAuLi5dXSAgeAorCisgICAgICAgIGdyb3VwOgorICAgICAgICAgIC15IFtZXSAgICAgICAgICB5CisgICAgICAgICAgLXogWiBaIFogICAgICAgIHoKKyAgICAgICAgICBkICAgICAgICAgICAgICAgZAorICAgICAgICAgIGUgICAgICAgICAgICAgICBlCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwT25seVVzZXJHcm91cHMoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGJhc2ljIHVzYWdlIG1lc3NhZ2VzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCBhZGRfaGVscD1GYWxzZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW10KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gWworICAgICAgICAoU2lnKCd4eHh4JyksIFsKKyAgICAgICAgICAgIFNpZygnLXgnLCBoZWxwPSd4JyksCisgICAgICAgICAgICBTaWcoJ2EnLCBoZWxwPSdhJyksCisgICAgICAgIF0pLAorICAgICAgICAoU2lnKCd5eXl5JyksIFsKKyAgICAgICAgICAgIFNpZygnYicsIGhlbHA9J2InKSwKKyAgICAgICAgICAgIFNpZygnLXknLCBoZWxwPSd5JyksCisgICAgICAgIF0pLAorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy14IFhdIFsteSBZXSBhIGIKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHh4eHg6CisgICAgICAgICAgLXggWCAgeAorICAgICAgICAgIGEgICAgIGEKKworICAgICAgICB5eXl5OgorICAgICAgICAgIGIgICAgIGIKKyAgICAgICAgICAteSBZICB5CisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVXNhZ2VMb25nUHJvZyhIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdXNhZ2UgbWVzc2FnZXMgd2hlcmUgdGhlIHByb2cgaXMgbG9uZyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQJyAqIDYwKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXcnLCBtZXRhdmFyPSdXJyksCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYJyksCisgICAgICAgIFNpZygnYScpLAorICAgICAgICBTaWcoJ2InKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAKKyAgICAgICAgICAgICAgIFstaF0gWy13IFddIFsteCBYXSBhIGIKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIGEKKyAgICAgICAgICBiCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdyBXCisgICAgICAgICAgLXggWAorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFVzYWdlTG9uZ1Byb2dPcHRpb25zV3JhcChIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdXNhZ2UgbWVzc2FnZXMgd2hlcmUgdGhlIHByb2cgaXMgbG9uZyBhbmQgdGhlIG9wdGlvbmFscyB3cmFwIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1AnICogNjApCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctdycsIG1ldGF2YXI9J1cnICogMjUpLAorICAgICAgICBTaWcoJy14JywgbWV0YXZhcj0nWCcgKiAyNSksCisgICAgICAgIFNpZygnLXknLCBtZXRhdmFyPSdZJyAqIDI1KSwKKyAgICAgICAgU2lnKCcteicsIG1ldGF2YXI9J1onICogMjUpLAorICAgICAgICBTaWcoJ2EnKSwKKyAgICAgICAgU2lnKCdiJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQCisgICAgICAgICAgICAgICBbLWhdIFstdyBXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXXSBcCitbLXggWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF0KKyAgICAgICAgICAgICAgIFsteSBZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZXSBbLXogWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl0KKyAgICAgICAgICAgICAgIGEgYgorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYQorICAgICAgICAgIGIKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdyBXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXCisgICAgICAgICAgLXggWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAorICAgICAgICAgIC15IFlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVkKKyAgICAgICAgICAteiBaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVXNhZ2VMb25nUHJvZ1Bvc2l0aW9uYWxzV3JhcChIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdXNhZ2UgbWVzc2FnZXMgd2hlcmUgdGhlIHByb2cgaXMgbG9uZyBhbmQgdGhlIHBvc2l0aW9uYWxzIHdyYXAiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUCcgKiA2MCwgYWRkX2hlbHA9RmFsc2UpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCdhJyAqIDI1KSwKKyAgICAgICAgU2lnKCdiJyAqIDI1KSwKKyAgICAgICAgU2lnKCdjJyAqIDI1KSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFAKKyAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgorICAgICAgICAgICAgICAgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYworICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQorICAgICAgICAgIGJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIKKyAgICAgICAgICBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVXNhZ2VPcHRpb25hbHNXcmFwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGUgb3B0aW9uYWxzIHdyYXAiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctdycsIG1ldGF2YXI9J1cnICogMjUpLAorICAgICAgICBTaWcoJy14JywgbWV0YXZhcj0nWCcgKiAyNSksCisgICAgICAgIFNpZygnLXknLCBtZXRhdmFyPSdZJyAqIDI1KSwKKyAgICAgICAgU2lnKCcteicsIG1ldGF2YXI9J1onICogMjUpLAorICAgICAgICBTaWcoJ2EnKSwKKyAgICAgICAgU2lnKCdiJyksCisgICAgICAgIFNpZygnYycpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXcgV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV10gXAorWy14IFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhdCisgICAgICAgICAgICAgICAgICAgIFsteSBZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZXSBcCitbLXogWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWl0KKyAgICAgICAgICAgICAgICAgICAgYSBiIGMKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIGEKKyAgICAgICAgICBiCisgICAgICAgICAgYworCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC13IFdXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1cKKyAgICAgICAgICAteCBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCisgICAgICAgICAgLXkgWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWQorICAgICAgICAgIC16IFpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWloKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBVc2FnZVBvc2l0aW9uYWxzV3JhcChIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdXNhZ2UgbWVzc2FnZXMgd2hlcmUgdGhlIHBvc2l0aW9uYWxzIHdyYXAiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCcteCcpLAorICAgICAgICBTaWcoJy15JyksCisgICAgICAgIFNpZygnLXonKSwKKyAgICAgICAgU2lnKCdhJyAqIDI1KSwKKyAgICAgICAgU2lnKCdiJyAqIDI1KSwKKyAgICAgICAgU2lnKCdjJyAqIDI1KSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy14IFhdIFsteSBZXSBbLXogWl0KKyAgICAgICAgICAgICAgICAgICAgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiCisgICAgICAgICAgICAgICAgICAgIGNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEKKyAgICAgICAgICBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiCisgICAgICAgICAgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYworCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC14IFgKKyAgICAgICAgICAteSBZCisgICAgICAgICAgLXogWgorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFVzYWdlT3B0aW9uYWxzUG9zaXRpb25hbHNXcmFwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGUgb3B0aW9uYWxzIGFuZCBwb3NpdGlvbmFscyB3cmFwIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLXgnLCBtZXRhdmFyPSdYJyAqIDI1KSwKKyAgICAgICAgU2lnKCcteScsIG1ldGF2YXI9J1knICogMjUpLAorICAgICAgICBTaWcoJy16JywgbWV0YXZhcj0nWicgKiAyNSksCisgICAgICAgIFNpZygnYScgKiAyNSksCisgICAgICAgIFNpZygnYicgKiAyNSksCisgICAgICAgIFNpZygnYycgKiAyNSksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFsteCBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXSBcCitbLXkgWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWV0KKyAgICAgICAgICAgICAgICAgICAgWy16IFpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpdCisgICAgICAgICAgICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEgYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgorICAgICAgICAgICAgICAgICAgICBjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhCisgICAgICAgICAgYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYgorICAgICAgICAgIGNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAteCBYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCisgICAgICAgICAgLXkgWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWQorICAgICAgICAgIC16IFpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWloKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBVc2FnZU9wdGlvbmFsc09ubHlXcmFwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGVyZSBhcmUgb25seSBvcHRpb25hbHMgYW5kIHRoZXkgd3JhcCIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgbWV0YXZhcj0nWCcgKiAyNSksCisgICAgICAgIFNpZygnLXknLCBtZXRhdmFyPSdZJyAqIDI1KSwKKyAgICAgICAgU2lnKCcteicsIG1ldGF2YXI9J1onICogMjUpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXggWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWF0gXAorWy15IFlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVldCisgICAgICAgICAgICAgICAgICAgIFsteiBaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaXQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXggWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWAorICAgICAgICAgIC15IFlZWVlZWVlZWVlZWVlZWVlZWVlZWVlZWVkKKyAgICAgICAgICAteiBaWlpaWlpaWlpaWlpaWlpaWlpaWlpaWlpaCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVXNhZ2VQb3NpdGlvbmFsc09ubHlXcmFwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB1c2FnZSBtZXNzYWdlcyB3aGVyZSB0aGVyZSBhcmUgb25seSBwb3NpdGlvbmFscyBhbmQgdGhleSB3cmFwIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCBhZGRfaGVscD1GYWxzZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ2EnICogMjUpLAorICAgICAgICBTaWcoJ2InICogMjUpLAorICAgICAgICBTaWcoJ2MnICogMjUpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiCisgICAgICAgICAgICAgICAgICAgIGNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2MKKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEKKyAgICAgICAgICBiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiCisgICAgICAgICAgY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjYworICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFZhcmlhYmxlRXhwYW5zaW9uKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IHZhcmlhYmxlcyBhcmUgZXhwYW5kZWQgcHJvcGVybHkgaW4gaGVscCBtZXNzYWdlcyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy14JywgdHlwZT1pbnQsCisgICAgICAgICAgICBoZWxwPSd4ICUocHJvZylzICUoZGVmYXVsdClzICUodHlwZSlzICUlJyksCisgICAgICAgIFNpZygnLXknLCBhY3Rpb249J3N0b3JlX2NvbnN0JywgZGVmYXVsdD00MiwgY29uc3Q9J1hYWCcsCisgICAgICAgICAgICBoZWxwPSd5ICUocHJvZylzICUoZGVmYXVsdClzICUoY29uc3QpcycpLAorICAgICAgICBTaWcoJy0tZm9vJywgY2hvaWNlcz0nYWJjJywKKyAgICAgICAgICAgIGhlbHA9J2ZvbyAlKHByb2cpcyAlKGRlZmF1bHQpcyAlKGNob2ljZXMpcycpLAorICAgICAgICBTaWcoJy0tYmFyJywgZGVmYXVsdD0nYmF6JywgY2hvaWNlcz1bMSwgMl0sIG1ldGF2YXI9J0JCQicsCisgICAgICAgICAgICBoZWxwPSdiYXIgJShwcm9nKXMgJShkZWZhdWx0KXMgJShkZXN0KXMnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD0nc3BhbSAlKHByb2cpcyAlKGRlZmF1bHQpcycpLAorICAgICAgICBTaWcoJ2JhZGdlcicsIGRlZmF1bHQ9MC41LCBoZWxwPSdiYWRnZXIgJShwcm9nKXMgJShkZWZhdWx0KXMnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgKFNpZygnZ3JvdXAnKSwgWworICAgICAgICAgICAgU2lnKCctYScsIGhlbHA9J2EgJShwcm9nKXMgJShkZWZhdWx0KXMnKSwKKyAgICAgICAgICAgIFNpZygnLWInLCBkZWZhdWx0PS0xLCBoZWxwPSdiICUocHJvZylzICUoZGVmYXVsdClzJyksCisgICAgICAgIF0pCisgICAgXQorICAgIHVzYWdlID0gKCcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXggWF0gWy15XSBbLS1mb28ge2EsYixjfV0gWy0tYmFyIEJCQl0gWy1hIEFdIFstYiBCXQorICAgICAgICAgICAgICAgICAgICBzcGFtIGJhZGdlcgorICAgICAgICAnJycpCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHNwYW0gICAgICAgICAgIHNwYW0gUFJPRyBOb25lCisgICAgICAgICAgYmFkZ2VyICAgICAgICAgYmFkZ2VyIFBST0cgMC41CisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAteCBYICAgICAgICAgICB4IFBST0cgTm9uZSBpbnQgJQorICAgICAgICAgIC15ICAgICAgICAgICAgIHkgUFJPRyA0MiBYWFgKKyAgICAgICAgICAtLWZvbyB7YSxiLGN9ICBmb28gUFJPRyBOb25lIGEsIGIsIGMKKyAgICAgICAgICAtLWJhciBCQkIgICAgICBiYXIgUFJPRyBiYXogYmFyCisKKyAgICAgICAgZ3JvdXA6CisgICAgICAgICAgLWEgQSAgICAgICAgICAgYSBQUk9HIE5vbmUKKyAgICAgICAgICAtYiBCICAgICAgICAgICBiIFBST0cgLTEKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBWYXJpYWJsZUV4cGFuc2lvblVzYWdlU3VwcGxpZWQoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdmFyaWFibGVzIGFyZSBleHBhbmRlZCBwcm9wZXJseSB3aGVuIHVzYWdlPSBpcyBwcmVzZW50IiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCB1c2FnZT0nJShwcm9nKXMgRk9PJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW10KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICgnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIEZPTworICAgICAgICAnJycpCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVmFyaWFibGVFeHBhbnNpb25Ob0FyZ3VtZW50cyhIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCB2YXJpYWJsZXMgYXJlIGV4cGFuZGVkIHByb3Blcmx5IHdpdGggbm8gYXJndW1lbnRzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCBhZGRfaGVscD1GYWxzZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gW10KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICgnJydcCisgICAgICAgIHVzYWdlOiBQUk9HCisgICAgICAgICcnJykKKyAgICBoZWxwID0gdXNhZ2UKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFN1cHByZXNzVXNhZ2UoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgaXRlbXMgY2FuIGJlIHN1cHByZXNzZWQgaW4gdXNhZ2UgbWVzc2FnZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIHVzYWdlPWFyZ3BhcnNlLlNVUFBSRVNTKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPSdmb28gaGVscCcpLAorICAgICAgICBTaWcoJ3NwYW0nLCBoZWxwPSdzcGFtIGhlbHAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgaGVscCA9ICcnJ1wKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbSAgICAgICAgc3BhbSBoZWxwCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtLWZvbyBGT08gICBmb28gaGVscAorICAgICAgICAnJycKKyAgICB1c2FnZSA9ICcnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBTdXBwcmVzc09wdGlvbmFsKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IG9wdGlvbmFsIGFyZ3VtZW50cyBjYW4gYmUgc3VwcHJlc3NlZCBpbiBoZWxwIG1lc3NhZ2VzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCBhZGRfaGVscD1GYWxzZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy0tZm9vJywgaGVscD1hcmdwYXJzZS5TVVBQUkVTUyksCisgICAgICAgIFNpZygnc3BhbScsIGhlbHA9J3NwYW0gaGVscCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgc3BhbQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbSAgc3BhbSBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwU3VwcHJlc3NPcHRpb25hbEdyb3VwKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IG9wdGlvbmFsIGdyb3VwcyBjYW4gYmUgc3VwcHJlc3NlZCBpbiBoZWxwIG1lc3NhZ2VzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPSdmb28gaGVscCcpLAorICAgICAgICBTaWcoJ3NwYW0nLCBoZWxwPSdzcGFtIGhlbHAnKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgKFNpZygnZ3JvdXAnKSwgW1NpZygnLS1iYXInLCBoZWxwPWFyZ3BhcnNlLlNVUFBSRVNTKV0pLAorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb28gRk9PXSBzcGFtCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBzcGFtICAgICAgICBzcGFtIGhlbHAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwU3VwcHJlc3NQb3NpdGlvbmFsKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IHBvc2l0aW9uYWwgYXJndW1lbnRzIGNhbiBiZSBzdXBwcmVzc2VkIGluIGhlbHAgbWVzc2FnZXMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctLWZvbycsIGhlbHA9J2ZvbyBoZWxwJyksCisgICAgICAgIFNpZygnc3BhbScsIGhlbHA9YXJncGFyc2UuU1VQUFJFU1MpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb28gRk9PXQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtLWZvbyBGT08gICBmb28gaGVscAorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFJlcXVpcmVkT3B0aW9uYWwoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgcmVxdWlyZWQgb3B0aW9ucyBkb24ndCBsb29rIG9wdGlvbmFsIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdmb28gaGVscCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSAtLWZvbyBGT08KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLS1mb28gRk9PICAgZm9vIGhlbHAKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKKworY2xhc3MgVGVzdEhlbHBBbHRlcm5hdGVQcmVmaXhDaGFycyhIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhhdCBvcHRpb25zIGRpc3BsYXkgd2l0aCBkaWZmZXJlbnQgcHJlZml4IGNoYXJhY3RlcnMiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsIHByZWZpeF9jaGFycz0nXjsnLCBhZGRfaGVscD1GYWxzZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJ15eZm9vJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nZm9vIGhlbHAnKSwKKyAgICAgICAgU2lnKCc7YicsICc7O2JhcicsIGhlbHA9J2JhciBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbXl5mb29dIFs7YiBCQVJdCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgXl5mb28gICAgICAgICAgICAgIGZvbyBoZWxwCisgICAgICAgICAgO2IgQkFSLCA7O2JhciBCQVIgIGJhciBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwTm9IZWxwT3B0aW9uYWwoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIC0taGVscCBhcmd1bWVudCBjYW4gYmUgc3VwcHJlc3NlZCBoZWxwIG1lc3NhZ2VzIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCBhZGRfaGVscD1GYWxzZSkKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy0tZm9vJywgaGVscD0nZm9vIGhlbHAnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD0nc3BhbSBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLS1mb28gRk9PXSBzcGFtCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICBzcGFtICAgICAgIHNwYW0gaGVscAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtLWZvbyBGT08gIGZvbyBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwVmVyc2lvbk9wdGlvbmFsKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IHRoZSAtLXZlcnNpb24gYXJndW1lbnQgY2FuIGJlIHN1cHByZXNzZWQgaGVscCBtZXNzYWdlcyIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZyhwcm9nPSdQUk9HJywgdmVyc2lvbj0nMS4wJykKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy0tZm9vJywgaGVscD0nZm9vIGhlbHAnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD0nc3BhbSBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstdl0gWy0tZm9vIEZPT10gc3BhbQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbSAgICAgICAgICAgc3BhbSBoZWxwCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtdiwgLS12ZXJzaW9uICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vIEZPTyAgICAgIGZvbyBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJydcCisgICAgICAgIDEuMAorICAgICAgICAnJycKKworCitjbGFzcyBUZXN0SGVscE5vbmUoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgbm8gZXJyb3JzIG9jY3VyIGlmIG5vIGhlbHAgaXMgc3BlY2lmaWVkIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nKSwKKyAgICAgICAgU2lnKCdzcGFtJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbXQorICAgIHVzYWdlID0gJycnXAorICAgICAgICB1c2FnZTogUFJPRyBbLWhdIFstLWZvbyBGT09dIHNwYW0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHNwYW0KKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vIEZPTworICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFR1cGxlTWV0YXZhcihIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3Qgc3BlY2lmeWluZyBtZXRhdmFyIGFzIGEgdHVwbGUiIiIKKworICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycpCisgICAgYXJndW1lbnRfc2lnbmF0dXJlcyA9IFsKKyAgICAgICAgU2lnKCctdycsIGhlbHA9J3cnLCBuYXJncz0nKycsIG1ldGF2YXI9KCdXMScsICdXMicpKSwKKyAgICAgICAgU2lnKCcteCcsIGhlbHA9J3gnLCBuYXJncz0nKicsIG1ldGF2YXI9KCdYMScsICdYMicpKSwKKyAgICAgICAgU2lnKCcteScsIGhlbHA9J3knLCBuYXJncz0zLCBtZXRhdmFyPSgnWTEnLCAnWTInLCAnWTMnKSksCisgICAgICAgIFNpZygnLXonLCBoZWxwPSd6JywgbmFyZ3M9Jz8nLCBtZXRhdmFyPSgnWjEnLCApKSwKKyAgICBdCisgICAgYXJndW1lbnRfZ3JvdXBfc2lnbmF0dXJlcyA9IFtdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy13IFcxIFtXMiAuLi5dXSBbLXggW1gxIFtYMiAuLi5dXV0gWy15IFkxIFkyIFkzXSBcCitbLXogW1oxXV0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXcgVzEgW1cyIC4uLl0gICAgdworICAgICAgICAgIC14IFtYMSBbWDIgLi4uXV0gIHgKKyAgICAgICAgICAteSBZMSBZMiBZMyAgICAgICB5CisgICAgICAgICAgLXogW1oxXSAgICAgICAgICAgegorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscFJhd1RleHQoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBSYXdUZXh0SGVscEZvcm1hdHRlciIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZygKKyAgICAgICAgcHJvZz0nUFJPRycsIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdUZXh0SGVscEZvcm1hdHRlciwKKyAgICAgICAgZGVzY3JpcHRpb249J0tlZXAgdGhlIGZvcm1hdHRpbmdcbicKKyAgICAgICAgICAgICAgICAgICAgJyAgICBleGFjdGx5IGFzIGl0IGlzIHdyaXR0ZW5cbicKKyAgICAgICAgICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgICAgICAgICAnaGVyZVxuJykKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPScgICAgZm9vIGhlbHAgc2hvdWxkIGFsc29cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGVhciBhcyBnaXZlbiBoZXJlJyksCisgICAgICAgIFNpZygnc3BhbScsIGhlbHA9J3NwYW0gaGVscCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gWworICAgICAgICAoU2lnKCd0aXRsZScsIGRlc2NyaXB0aW9uPScgICAgVGhpcyB0ZXh0XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgc2hvdWxkIGJlIGluZGVudGVkXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBleGFjdGx5IGxpa2UgaXQgaXMgaGVyZVxuJyksCisgICAgICAgICBbU2lnKCctLWJhcicsIGhlbHA9J2JhciBoZWxwJyldKSwKKyAgICBdCisgICAgdXNhZ2UgPSAnJydcCisgICAgICAgIHVzYWdlOiBQUk9HIFstaF0gWy0tZm9vIEZPT10gWy0tYmFyIEJBUl0gc3BhbQorICAgICAgICAnJycKKyAgICBoZWxwID0gdXNhZ2UgKyAnJydcCisKKyAgICAgICAgS2VlcCB0aGUgZm9ybWF0dGluZworICAgICAgICAgICAgZXhhY3RseSBhcyBpdCBpcyB3cml0dGVuCisKKyAgICAgICAgaGVyZQorCisgICAgICAgIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIHNwYW0gICAgICAgIHNwYW0gaGVscAorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLS1mb28gRk9PICAgICAgIGZvbyBoZWxwIHNob3VsZCBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgYXBwZWFyIGFzIGdpdmVuIGhlcmUKKworICAgICAgICB0aXRsZToKKyAgICAgICAgICAgICAgVGhpcyB0ZXh0CisgICAgICAgICAgICBzaG91bGQgYmUgaW5kZW50ZWQKKyAgICAgICAgICAgICAgZXhhY3RseSBsaWtlIGl0IGlzIGhlcmUKKworICAgICAgICAgIC0tYmFyIEJBUiAgIGJhciBoZWxwCisgICAgICAgICcnJworICAgIHZlcnNpb24gPSAnJworCisKK2NsYXNzIFRlc3RIZWxwUmF3RGVzY3JpcHRpb24oSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBSYXdUZXh0SGVscEZvcm1hdHRlciIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZygKKyAgICAgICAgcHJvZz0nUFJPRycsIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5SYXdEZXNjcmlwdGlvbkhlbHBGb3JtYXR0ZXIsCisgICAgICAgIGRlc2NyaXB0aW9uPSdLZWVwIHRoZSBmb3JtYXR0aW5nXG4nCisgICAgICAgICAgICAgICAgICAgICcgICAgZXhhY3RseSBhcyBpdCBpcyB3cml0dGVuXG4nCisgICAgICAgICAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICAgICAgICAgJ2hlcmVcbicpCisKKyAgICBhcmd1bWVudF9zaWduYXR1cmVzID0gWworICAgICAgICBTaWcoJy0tZm9vJywgaGVscD0nICBmb28gaGVscCBzaG91bGQgbm90XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgcmV0YWluIHRoaXMgb2RkIGZvcm1hdHRpbmcnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD0nc3BhbSBoZWxwJyksCisgICAgXQorICAgIGFyZ3VtZW50X2dyb3VwX3NpZ25hdHVyZXMgPSBbCisgICAgICAgIChTaWcoJ3RpdGxlJywgZGVzY3JpcHRpb249JyAgICBUaGlzIHRleHRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICBzaG91bGQgYmUgaW5kZW50ZWRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGV4YWN0bHkgbGlrZSBpdCBpcyBoZXJlXG4nKSwKKyAgICAgICAgIFtTaWcoJy0tYmFyJywgaGVscD0nYmFyIGhlbHAnKV0pLAorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb28gRk9PXSBbLS1iYXIgQkFSXSBzcGFtCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBLZWVwIHRoZSBmb3JtYXR0aW5nCisgICAgICAgICAgICBleGFjdGx5IGFzIGl0IGlzIHdyaXR0ZW4KKworICAgICAgICBoZXJlCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbSAgICAgICAgc3BhbSBoZWxwCisKKyAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAtLWZvbyBGT08gICBmb28gaGVscCBzaG91bGQgbm90IHJldGFpbiB0aGlzIG9kZCBmb3JtYXR0aW5nCisKKyAgICAgICAgdGl0bGU6CisgICAgICAgICAgICAgIFRoaXMgdGV4dAorICAgICAgICAgICAgc2hvdWxkIGJlIGluZGVudGVkCisgICAgICAgICAgICAgIGV4YWN0bHkgbGlrZSBpdCBpcyBoZXJlCisKKyAgICAgICAgICAtLWJhciBCQVIgICBiYXIgaGVscAorICAgICAgICAnJycKKyAgICB2ZXJzaW9uID0gJycKKworCitjbGFzcyBUZXN0SGVscEFyZ3VtZW50RGVmYXVsdHMoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBBcmd1bWVudERlZmF1bHRzSGVscEZvcm1hdHRlciIiIgorCisgICAgcGFyc2VyX3NpZ25hdHVyZSA9IFNpZygKKyAgICAgICAgcHJvZz0nUFJPRycsIGZvcm1hdHRlcl9jbGFzcz1hcmdwYXJzZS5Bcmd1bWVudERlZmF1bHRzSGVscEZvcm1hdHRlciwKKyAgICAgICAgZGVzY3JpcHRpb249J2Rlc2NyaXB0aW9uJykKKworICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbCisgICAgICAgIFNpZygnLS1mb28nLCBoZWxwPSdmb28gaGVscCAtIG9oIGFuZCBieSB0aGUgd2F5LCAlKGRlZmF1bHQpcycpLAorICAgICAgICBTaWcoJy0tYmFyJywgYWN0aW9uPSdzdG9yZV90cnVlJywgaGVscD0nYmFyIGhlbHAnKSwKKyAgICAgICAgU2lnKCdzcGFtJywgaGVscD0nc3BhbSBoZWxwJyksCisgICAgICAgIFNpZygnYmFkZ2VyJywgbmFyZ3M9Jz8nLCBkZWZhdWx0PSd3b29kZW4nLCBoZWxwPSdiYWRnZXIgaGVscCcpLAorICAgIF0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gWworICAgICAgICAoU2lnKCd0aXRsZScsIGRlc2NyaXB0aW9uPSdkZXNjcmlwdGlvbicpLAorICAgICAgICAgW1NpZygnLS1iYXonLCB0eXBlPWludCwgZGVmYXVsdD00MiwgaGVscD0nYmF6IGhlbHAnKV0pLAorICAgIF0KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLS1mb28gRk9PXSBbLS1iYXJdIFstLWJheiBCQVpdIHNwYW0gW2JhZGdlcl0KKyAgICAgICAgJycnCisgICAgaGVscCA9IHVzYWdlICsgJycnXAorCisgICAgICAgIGRlc2NyaXB0aW9uCisKKyAgICAgICAgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgc3BhbSAgICAgICAgc3BhbSBoZWxwCisgICAgICAgICAgYmFkZ2VyICAgICAgYmFkZ2VyIGhlbHAgKGRlZmF1bHQ6IHdvb2RlbikKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC0tZm9vIEZPTyAgIGZvbyBoZWxwIC0gb2ggYW5kIGJ5IHRoZSB3YXksIE5vbmUKKyAgICAgICAgICAtLWJhciAgICAgICBiYXIgaGVscCAoZGVmYXVsdDogRmFsc2UpCisKKyAgICAgICAgdGl0bGU6CisgICAgICAgICAgZGVzY3JpcHRpb24KKworICAgICAgICAgIC0tYmF6IEJBWiAgIGJheiBoZWxwIChkZWZhdWx0OiA0MikKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKK2NsYXNzIFRlc3RIZWxwVmVyc2lvbkFjdGlvbihIZWxwVGVzdENhc2UpOgorICAgICIiIlRlc3QgdGhlIGRlZmF1bHQgaGVscCBmb3IgdGhlIHZlcnNpb24gYWN0aW9uIiIiCisKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLCBkZXNjcmlwdGlvbj0nZGVzY3JpcHRpb24nKQorICAgIGFyZ3VtZW50X3NpZ25hdHVyZXMgPSBbU2lnKCctVicsICctLXZlcnNpb24nLCBhY3Rpb249J3ZlcnNpb24nLCB2ZXJzaW9uPSczLjYnKV0KKyAgICBhcmd1bWVudF9ncm91cF9zaWduYXR1cmVzID0gW10KKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLVZdCisgICAgICAgICcnJworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBkZXNjcmlwdGlvbgorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLVYsIC0tdmVyc2lvbiAgc2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgICAgICAgJycnCisgICAgdmVyc2lvbiA9ICcnCisKK2NsYXNzIFRlc3RIZWxwU3VicGFyc2Vyc09yZGVyaW5nKEhlbHBUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBvcmRlcmluZyBvZiBzdWJjb21tYW5kcyBpbiBoZWxwIG1hdGNoZXMgdGhlIGNvZGUiIiIKKyAgICBwYXJzZXJfc2lnbmF0dXJlID0gU2lnKHByb2c9J1BST0cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb249J2Rpc3BsYXkgc29tZSBzdWJjb21tYW5kcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPScwLjEnKQorCisgICAgc3VicGFyc2Vyc19zaWduYXR1cmVzID0gW1NpZyhuYW1lPW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluICgnYScsICdiJywgJ2MnLCAnZCcsICdlJyldCisKKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXZdIHthLGIsYyxkLGV9IC4uLgorICAgICAgICAnJycKKworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBkaXNwbGF5IHNvbWUgc3ViY29tbWFuZHMKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICB7YSxiLGMsZCxlfQorCisgICAgICAgIG9wdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgLXYsIC0tdmVyc2lvbiAgc2hvdyBwcm9ncmFtJ3MgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQKKyAgICAgICAgJycnCisKKyAgICB2ZXJzaW9uID0gJycnXAorICAgICAgICAwLjEKKyAgICAgICAgJycnCisKK2NsYXNzIFRlc3RIZWxwU3VicGFyc2Vyc1dpdGhIZWxwT3JkZXJpbmcoSGVscFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IG9yZGVyaW5nIG9mIHN1YmNvbW1hbmRzIGluIGhlbHAgbWF0Y2hlcyB0aGUgY29kZSIiIgorICAgIHBhcnNlcl9zaWduYXR1cmUgPSBTaWcocHJvZz0nUFJPRycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0nZGlzcGxheSBzb21lIHN1YmNvbW1hbmRzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249JzAuMScpCisKKyAgICBzdWJjb21tYW5kX2RhdGEgPSAoKCdhJywgJ2Egc3ViY29tbWFuZCBoZWxwJyksCisgICAgICAgICAgICAgICAgICAgICAgICgnYicsICdiIHN1YmNvbW1hbmQgaGVscCcpLAorICAgICAgICAgICAgICAgICAgICAgICAoJ2MnLCAnYyBzdWJjb21tYW5kIGhlbHAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKCdkJywgJ2Qgc3ViY29tbWFuZCBoZWxwJyksCisgICAgICAgICAgICAgICAgICAgICAgICgnZScsICdlIHN1YmNvbW1hbmQgaGVscCcpLAorICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBzdWJwYXJzZXJzX3NpZ25hdHVyZXMgPSBbU2lnKG5hbWU9bmFtZSwgaGVscD1oZWxwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgaGVscCBpbiBzdWJjb21tYW5kX2RhdGFdCisKKyAgICB1c2FnZSA9ICcnJ1wKKyAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXZdIHthLGIsYyxkLGV9IC4uLgorICAgICAgICAnJycKKworICAgIGhlbHAgPSB1c2FnZSArICcnJ1wKKworICAgICAgICBkaXNwbGF5IHNvbWUgc3ViY29tbWFuZHMKKworICAgICAgICBwb3NpdGlvbmFsIGFyZ3VtZW50czoKKyAgICAgICAgICB7YSxiLGMsZCxlfQorICAgICAgICAgICAgYSAgICAgICAgICAgIGEgc3ViY29tbWFuZCBoZWxwCisgICAgICAgICAgICBiICAgICAgICAgICAgYiBzdWJjb21tYW5kIGhlbHAKKyAgICAgICAgICAgIGMgICAgICAgICAgICBjIHN1YmNvbW1hbmQgaGVscAorICAgICAgICAgICAgZCAgICAgICAgICAgIGQgc3ViY29tbWFuZCBoZWxwCisgICAgICAgICAgICBlICAgICAgICAgICAgZSBzdWJjb21tYW5kIGhlbHAKKworICAgICAgICBvcHRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAgICAgICAgIC12LCAtLXZlcnNpb24gIHNob3cgcHJvZ3JhbSdzIHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgICAgICAgICcnJworCisgICAgdmVyc2lvbiA9ICcnJ1wKKyAgICAgICAgMC4xCisgICAgICAgICcnJworCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBPcHRpb25hbC9Qb3NpdGlvbmFsIGNvbnN0cnVjdG9yIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEludmFsaWRBcmd1bWVudENvbnN0cnVjdG9ycyhUZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIGJ1bmNoIG9mIGludmFsaWQgQXJndW1lbnQgY29uc3RydWN0b3JzIiIiCisKKyAgICBkZWYgYXNzZXJ0VHlwZUVycm9yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwYXJzZXIuYWRkX2FyZ3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgYXNzZXJ0VmFsdWVFcnJvcihzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBhcnNlci5hZGRfYXJndW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfa2V5d29yZF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCcteCcsIGJhcj1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignLXknLCBjYWxsYmFjaz0nZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoJy15JywgY2FsbGJhY2tfYXJncz0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoJy15JywgY2FsbGJhY2tfa3dhcmdzPXt9KQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19kZXN0aW5hdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoKQorICAgICAgICBmb3IgYWN0aW9uIGluIFsnYXBwZW5kJywgJ3N0b3JlJ106CisgICAgICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcihhY3Rpb249YWN0aW9uKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9vcHRpb25fc3RyaW5ncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCctLScpCisgICAgICAgIHNlbGYuYXNzZXJ0VmFsdWVFcnJvcignLS0tJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCctLWZvbycsIHR5cGU9J2ludCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VmFsdWVFcnJvcignLS1mb28nLCB0eXBlPShpbnQsIGZsb2F0KSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFZhbHVlRXJyb3IoJy14JywgYWN0aW9uPSdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFZhbHVlRXJyb3IoJ2ZvbycsIGFjdGlvbj0nYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCctLWZvbycsIGFjdGlvbj0oJ3N0b3JlJywgJ2FwcGVuZCcpKQorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZm9vIiwgYWN0aW9uPSJzdG9yZS10cnVlIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgIGV4cGVjdGVkID0gJ3Vua25vd24gYWN0aW9uJworICAgICAgICAgICAgbXNnID0gJ2V4cGVjdGVkICVyLCBmb3VuZCAlcicgJSAoZXhwZWN0ZWQsIGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWQgaW4gc3RyKGUpLCBtc2cpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9kZXN0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoZGVzdD0nZm9vJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYmFyJywgZGVzdD0nYmF6JykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgICAgIGV4cGVjdGVkID0gJ2Rlc3Qgc3VwcGxpZWQgdHdpY2UgZm9yIHBvc2l0aW9uYWwgYXJndW1lbnQnCisgICAgICAgICAgICBtc2cgPSAnZXhwZWN0ZWQgJXIsIGZvdW5kICVyJyAlIChleHBlY3RlZCwgZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZCBpbiBzdHIoZSksIG1zZykKKworICAgIGRlZiB0ZXN0X25vX2FyZ3VtZW50X2FjdGlvbnMoc2VsZik6CisgICAgICAgIGZvciBhY3Rpb24gaW4gWydzdG9yZV9jb25zdCcsICdzdG9yZV90cnVlJywgJ3N0b3JlX2ZhbHNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGVuZF9jb25zdCcsICdjb3VudCddOgorICAgICAgICAgICAgZm9yIGF0dHJzIGluIFtkaWN0KHR5cGU9aW50KSwgZGljdChuYXJncz0nKycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0KGNob2ljZXM9J2FiJyldOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCcteCcsIGFjdGlvbj1hY3Rpb24sICoqYXR0cnMpCisKKyAgICBkZWYgdGVzdF9ub19hcmd1bWVudF9ub19jb25zdF9hY3Rpb25zKHNlbGYpOgorICAgICAgICAjIG9wdGlvbnMgd2l0aCB6ZXJvIGFyZ3VtZW50cworICAgICAgICBmb3IgYWN0aW9uIGluIFsnc3RvcmVfdHJ1ZScsICdzdG9yZV9mYWxzZScsICdjb3VudCddOgorCisgICAgICAgICAgICAjIGNvbnN0IGlzIGFsd2F5cyBkaXNhbGxvd2VkCisgICAgICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignLXgnLCBjb25zdD0nZm9vJywgYWN0aW9uPWFjdGlvbikKKworICAgICAgICAgICAgIyBuYXJncyBpcyBhbHdheXMgZGlzYWxsb3dlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoJy14JywgbmFyZ3M9JyonLCBhY3Rpb249YWN0aW9uKQorCisgICAgZGVmIHRlc3RfbW9yZV90aGFuX29uZV9hcmd1bWVudF9hY3Rpb25zKHNlbGYpOgorICAgICAgICBmb3IgYWN0aW9uIGluIFsnc3RvcmUnLCAnYXBwZW5kJ106CisKKyAgICAgICAgICAgICMgbmFyZ3M9MCBpcyBkaXNhbGxvd2VkCisgICAgICAgICAgICBzZWxmLmFzc2VydFZhbHVlRXJyb3IoJy14JywgbmFyZ3M9MCwgYWN0aW9uPWFjdGlvbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VmFsdWVFcnJvcignc3BhbScsIG5hcmdzPTAsIGFjdGlvbj1hY3Rpb24pCisKKyAgICAgICAgICAgICMgY29uc3QgaXMgZGlzYWxsb3dlZCB3aXRoIG5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgICAgICAgICAgIGZvciBuYXJncyBpbiBbMSwgJyonLCAnKyddOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VmFsdWVFcnJvcignLXgnLCBjb25zdD0nZm9vJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFyZ3M9bmFyZ3MsIGFjdGlvbj1hY3Rpb24pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRWYWx1ZUVycm9yKCdzcGFtJywgY29uc3Q9J2ZvbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hcmdzPW5hcmdzLCBhY3Rpb249YWN0aW9uKQorCisgICAgZGVmIHRlc3RfcmVxdWlyZWRfY29uc3RfYWN0aW9ucyhzZWxmKToKKyAgICAgICAgZm9yIGFjdGlvbiBpbiBbJ3N0b3JlX2NvbnN0JywgJ2FwcGVuZF9jb25zdCddOgorCisgICAgICAgICAgICAjIG5hcmdzIGlzIGFsd2F5cyBkaXNhbGxvd2VkCisgICAgICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignLXgnLCBuYXJncz0nKycsIGFjdGlvbj1hY3Rpb24pCisKKyAgICBkZWYgdGVzdF9wYXJzZXJzX2FjdGlvbl9taXNzaW5nX3BhcmFtcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlRXJyb3IoJ2NvbW1hbmQnLCBhY3Rpb249J3BhcnNlcnMnKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignY29tbWFuZCcsIGFjdGlvbj0ncGFyc2VycycsIHByb2c9J1BST0cnKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcignY29tbWFuZCcsIGFjdGlvbj0ncGFyc2VycycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlcl9jbGFzcz1hcmdwYXJzZS5Bcmd1bWVudFBhcnNlcikKKworICAgIGRlZiB0ZXN0X3JlcXVpcmVkX3Bvc2l0aW9uYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKCdmb28nLCByZXF1aXJlZD1UcnVlKQorCisgICAgZGVmIHRlc3RfdXNlcl9kZWZpbmVkX2FjdGlvbihzZWxmKToKKworICAgICAgICBjbGFzcyBTdWNjZXNzKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQWN0aW9uKG9iamVjdCk6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSk6CisgICAgICAgICAgICAgICAgaWYgZGVzdCA9PSAnc3BhbSc6CisgICAgICAgICAgICAgICAgICAgIGlmIGNvbnN0IGlzIFN1Y2Nlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkZWZhdWx0IGlzIFN1Y2Nlc3M6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3VjY2VzcygpCisKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN1Y2Nlc3MsIHBhcnNlci5hZGRfYXJndW1lbnQsICctLXNwYW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249QWN0aW9uLCBkZWZhdWx0PVN1Y2Nlc3MsIGNvbnN0PVN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN1Y2Nlc3MsIHBhcnNlci5hZGRfYXJndW1lbnQsICdzcGFtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPUFjdGlvbiwgZGVmYXVsdD1TdWNjZXNzLCBjb25zdD1TdWNjZXNzKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEFjdGlvbnMgcmV0dXJuZWQgYnkgYWRkX2FyZ3VtZW50CisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RBY3Rpb25zUmV0dXJuZWQoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGVzdChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBhY3Rpb24gPSBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLmRlc3QsICdmb28nKQorICAgICAgICBhY3Rpb24gPSBwYXJzZXIuYWRkX2FyZ3VtZW50KCctYicsICctLWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLmRlc3QsICdiYXInKQorICAgICAgICBhY3Rpb24gPSBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsICcteScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLmRlc3QsICd4JykKKworICAgIGRlZiB0ZXN0X21pc2Moc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgYWN0aW9uID0gcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCBuYXJncz0nPycsIGNvbnN0PTQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ODQsIHR5cGU9aW50LCBjaG9pY2VzPVsxLCAyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdGT08nLCBtZXRhdmFyPSdCQVInLCBkZXN0PSdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbi5uYXJncywgJz8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbi5jb25zdCwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLmRlZmF1bHQsIDg0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbi50eXBlLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLmNob2ljZXMsIFsxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb24uaGVscCwgJ0ZPTycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0aW9uLm1ldGF2YXIsICdCQVInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbi5kZXN0LCAnYmF6JykKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEFyZ3VtZW50IGNvbmZsaWN0IGhhbmRsaW5nIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RDb25mbGljdEhhbmRsaW5nKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2JhZF90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RfaGFuZGxlcj0nZm9vJykKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X2Vycm9yKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy14JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXJncGFyc2UuQXJndW1lbnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCwgJy14JykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXJncGFyc2UuQXJndW1lbnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCwgJy0tc3BhbScpCisKKyAgICBkZWYgdGVzdF9yZXNvbHZlX2Vycm9yKHNlbGYpOgorICAgICAgICBnZXRfcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIKKyAgICAgICAgcGFyc2VyID0gZ2V0X3BhcnNlcihwcm9nPSdQUk9HJywgY29uZmxpY3RfaGFuZGxlcj0ncmVzb2x2ZScpCisKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXgnLCBoZWxwPSdPTEQgWCcpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy14JywgaGVscD0nTkVXIFgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfaGVscCgpLCB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXggWF0KKworICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgICAgICAgICAgICAgIC14IFggICAgICAgIE5FVyBYCisgICAgICAgICAgICAnJycpKQorCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc3BhbScsIG1ldGF2YXI9J09MRF9TUEFNJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zcGFtJywgbWV0YXZhcj0nTkVXX1NQQU0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5mb3JtYXRfaGVscCgpLCB0ZXh0d3JhcC5kZWRlbnQoJycnXAorICAgICAgICAgICAgdXNhZ2U6IFBST0cgWy1oXSBbLXggWF0gWy0tc3BhbSBORVdfU1BBTV0KKworICAgICAgICAgICAgb3B0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAgICAgICAtaCwgLS1oZWxwICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgICAgICAgICAgICAgLXggWCAgICAgICAgICAgICBORVcgWAorICAgICAgICAgICAgICAtLXNwYW0gTkVXX1NQQU0KKyAgICAgICAgICAgICcnJykpCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBIZWxwIGFuZCBWZXJzaW9uIG9wdGlvbiB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0T3B0aW9uYWxzSGVscFZlcnNpb25BY3Rpb25zKFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBoZWxwIGFuZCB2ZXJzaW9uIGFjdGlvbnMiIiIKKworICAgIGRlZiBfZ2V0X2Vycm9yKHNlbGYsIGZ1bmMsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBleGNlcHQgQXJndW1lbnRQYXJzZXJFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRQYXJzZXJFcnJvciwgZnVuYywgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIGFzc2VydFByaW50SGVscEV4aXQoc2VsZiwgcGFyc2VyLCBhcmdzX3N0cik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJzZXIuZm9ybWF0X2hlbHAoKSwKKyAgICAgICAgICAgIHNlbGYuX2dldF9lcnJvcihwYXJzZXIucGFyc2VfYXJncywgYXJnc19zdHIuc3BsaXQoKSkuc3Rkb3V0KQorCisgICAgZGVmIGFzc2VydFByaW50VmVyc2lvbkV4aXQoc2VsZiwgcGFyc2VyLCBhcmdzX3N0cik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJzZXIuZm9ybWF0X3ZlcnNpb24oKSwKKyAgICAgICAgICAgIHNlbGYuX2dldF9lcnJvcihwYXJzZXIucGFyc2VfYXJncywgYXJnc19zdHIuc3BsaXQoKSkuc3RkZXJyKQorCisgICAgZGVmIGFzc2VydEFyZ3VtZW50UGFyc2VyRXJyb3Ioc2VsZiwgcGFyc2VyLCAqYXJncyk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50UGFyc2VyRXJyb3IsIHBhcnNlci5wYXJzZV9hcmdzLCBhcmdzKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIodmVyc2lvbj0nMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludEhlbHBFeGl0KHBhcnNlciwgJy1oJykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludEhlbHBFeGl0KHBhcnNlciwgJy0taGVscCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRWZXJzaW9uRXhpdChwYXJzZXIsICctdicpCisgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRWZXJzaW9uRXhpdChwYXJzZXIsICctLXZlcnNpb24nKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9mb3JtYXQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BQUCcsIHZlcnNpb249JyUocHJvZylzIDMuNScpCisgICAgICAgIG1zZyA9IHNlbGYuX2dldF9lcnJvcihwYXJzZXIucGFyc2VfYXJncywgWyctdiddKS5zdGRlcnIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnUFBQIDMuNVxuJywgbXNnKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9ub19oZWxwKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSwgdmVyc2lvbj0nMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy1oJykKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy0taGVscCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRWZXJzaW9uRXhpdChwYXJzZXIsICctdicpCisgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRWZXJzaW9uRXhpdChwYXJzZXIsICctLXZlcnNpb24nKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9hY3Rpb24oc2VsZik6CisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1hYWCcpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy1WJywgYWN0aW9uPSd2ZXJzaW9uJywgdmVyc2lvbj0nJShwcm9nKXMgMy43JykKKyAgICAgICAgbXNnID0gc2VsZi5fZ2V0X2Vycm9yKHBhcnNlci5wYXJzZV9hcmdzLCBbJy1WJ10pLnN0ZGVycgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdYWFggMy43XG4nLCBtc2cpCisKKyAgICBkZWYgdGVzdF9ub19oZWxwKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcihhZGRfaGVscD1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy1oJykKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy0taGVscCcpCisgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcihwYXJzZXIsICctdicpCisgICAgICAgIHNlbGYuYXNzZXJ0QXJndW1lbnRQYXJzZXJFcnJvcihwYXJzZXIsICctLXZlcnNpb24nKQorCisgICAgZGVmIHRlc3RfYWx0ZXJuYXRlX2hlbHBfdmVyc2lvbihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gRXJyb3JSYWlzaW5nQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsIGFjdGlvbj0naGVscCcpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy15JywgYWN0aW9uPSd2ZXJzaW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludEhlbHBFeGl0KHBhcnNlciwgJy14JykKKyAgICAgICAgc2VsZi5hc3NlcnRQcmludFZlcnNpb25FeGl0KHBhcnNlciwgJy15JykKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy12JykKKyAgICAgICAgc2VsZi5hc3NlcnRBcmd1bWVudFBhcnNlckVycm9yKHBhcnNlciwgJy0tdmVyc2lvbicpCisKKyAgICBkZWYgdGVzdF9oZWxwX3ZlcnNpb25fZXh0cmFfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBFcnJvclJhaXNpbmdBcmd1bWVudFBhcnNlcih2ZXJzaW9uPScxLjAnKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCcteCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3knKQorCisgICAgICAgICMgdHJ5IGFsbCBjb21iaW5hdGlvbnMgb2YgdmFsaWQgcHJlZml4ZXMgYW5kIHN1ZmZpeGVzCisgICAgICAgIHZhbGlkX3ByZWZpeGVzID0gWycnLCAnLXgnLCAnZm9vJywgJy14IGJhcicsICdiYXogLXgnXQorICAgICAgICB2YWxpZF9zdWZmaXhlcyA9IHZhbGlkX3ByZWZpeGVzICsgWyctLWJhZC1vcHRpb24nLCAnZm9vIGJhciBiYXonXQorICAgICAgICBmb3IgcHJlZml4IGluIHZhbGlkX3ByZWZpeGVzOgorICAgICAgICAgICAgZm9yIHN1ZmZpeCBpbiB2YWxpZF9zdWZmaXhlczoKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSAnJXMgJSVzICVzJyAlIChwcmVmaXgsIHN1ZmZpeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRIZWxwRXhpdChwYXJzZXIsIGZvcm1hdCAlICctaCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFByaW50SGVscEV4aXQocGFyc2VyLCBmb3JtYXQgJSAnLS1oZWxwJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UHJpbnRWZXJzaW9uRXhpdChwYXJzZXIsIGZvcm1hdCAlICctdicpCisgICAgICAgICAgICBzZWxmLmFzc2VydFByaW50VmVyc2lvbkV4aXQocGFyc2VyLCBmb3JtYXQgJSAnLS12ZXJzaW9uJykKKworCisjID09PT09PT09PT09PT09PT09PT09PT0KKyMgc3RyKCkgYW5kIHJlcHIoKSB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RTdHJpbmdzKFRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHN0cigpICBhbmQgcmVwcigpIG9uIE9wdGlvbmFscyBhbmQgUG9zaXRpb25hbHMiIiIKKworICAgIGRlZiBhc3NlcnRTdHJpbmdFcXVhbChzZWxmLCBvYmosIHJlc3VsdF9zdHJpbmcpOgorICAgICAgICBmb3IgZnVuYyBpbiBbc3RyLCByZXByXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhvYmopLCByZXN1bHRfc3RyaW5nKQorCisgICAgZGVmIHRlc3Rfb3B0aW9uYWwoc2VsZik6CisgICAgICAgIG9wdGlvbiA9IGFyZ3BhcnNlLkFjdGlvbigKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzPVsnLS1mb28nLCAnLWEnLCAnLWInXSwKKyAgICAgICAgICAgIGRlc3Q9J2InLAorICAgICAgICAgICAgdHlwZT0naW50JywKKyAgICAgICAgICAgIG5hcmdzPScrJywKKyAgICAgICAgICAgIGRlZmF1bHQ9NDIsCisgICAgICAgICAgICBjaG9pY2VzPVsxLCAyLCAzXSwKKyAgICAgICAgICAgIGhlbHA9J0hFTFAnLAorICAgICAgICAgICAgbWV0YXZhcj0nTUVUQVZBUicpCisgICAgICAgIHN0cmluZyA9ICgKKyAgICAgICAgICAgICJBY3Rpb24ob3B0aW9uX3N0cmluZ3M9WyctLWZvbycsICctYScsICctYiddLCBkZXN0PSdiJywgIgorICAgICAgICAgICAgIm5hcmdzPScrJywgY29uc3Q9Tm9uZSwgZGVmYXVsdD00MiwgdHlwZT0naW50JywgIgorICAgICAgICAgICAgImNob2ljZXM9WzEsIDIsIDNdLCBoZWxwPSdIRUxQJywgbWV0YXZhcj0nTUVUQVZBUicpIikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChvcHRpb24sIHN0cmluZykKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50KHNlbGYpOgorICAgICAgICBhcmd1bWVudCA9IGFyZ3BhcnNlLkFjdGlvbigKKyAgICAgICAgICAgIG9wdGlvbl9zdHJpbmdzPVtdLAorICAgICAgICAgICAgZGVzdD0neCcsCisgICAgICAgICAgICB0eXBlPWZsb2F0LAorICAgICAgICAgICAgbmFyZ3M9Jz8nLAorICAgICAgICAgICAgZGVmYXVsdD0yLjUsCisgICAgICAgICAgICBjaG9pY2VzPVswLjUsIDEuNSwgMi41XSwKKyAgICAgICAgICAgIGhlbHA9J0ggSEggSCcsCisgICAgICAgICAgICBtZXRhdmFyPSdNViBNViBNVicpCisgICAgICAgIHN0cmluZyA9ICgKKyAgICAgICAgICAgICJBY3Rpb24ob3B0aW9uX3N0cmluZ3M9W10sIGRlc3Q9J3gnLCBuYXJncz0nPycsICIKKyAgICAgICAgICAgICJjb25zdD1Ob25lLCBkZWZhdWx0PTIuNSwgdHlwZT0lciwgY2hvaWNlcz1bMC41LCAxLjUsIDIuNV0sICIKKyAgICAgICAgICAgICJoZWxwPSdIIEhIIEgnLCBtZXRhdmFyPSdNViBNViBNVicpIiAlIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKGFyZ3VtZW50LCBzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKGZvbz00MiwgYmFyPSdzcGFtJykKKyAgICAgICAgc3RyaW5nID0gIk5hbWVzcGFjZShiYXI9J3NwYW0nLCBmb289NDIpIgorICAgICAgICBzZWxmLmFzc2VydFN0cmluZ0VxdWFsKG5zLCBzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9wYXJzZXIoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnKQorICAgICAgICBzdHJpbmcgPSAoCisgICAgICAgICAgICAiQXJndW1lbnRQYXJzZXIocHJvZz0nUFJPRycsIHVzYWdlPU5vbmUsIGRlc2NyaXB0aW9uPU5vbmUsICIKKyAgICAgICAgICAgICJ2ZXJzaW9uPU5vbmUsIGZvcm1hdHRlcl9jbGFzcz0lciwgY29uZmxpY3RfaGFuZGxlcj0nZXJyb3InLCAiCisgICAgICAgICAgICAiYWRkX2hlbHA9VHJ1ZSkiICUgYXJncGFyc2UuSGVscEZvcm1hdHRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRTdHJpbmdFcXVhbChwYXJzZXIsIHN0cmluZykKKworIyA9PT09PT09PT09PT09PT0KKyMgTmFtZXNwYWNlIHRlc3RzCisjID09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0TmFtZXNwYWNlKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBucyA9IGFyZ3BhcnNlLk5hbWVzcGFjZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCBucywgJ3gnKQorCisgICAgICAgIG5zID0gYXJncGFyc2UuTmFtZXNwYWNlKGE9NDIsIGI9J3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmEsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zLmIsICdzcGFtJykKKworICAgIGRlZiB0ZXN0X2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBuczEgPSBhcmdwYXJzZS5OYW1lc3BhY2UoYT0xLCBiPTIpCisgICAgICAgIG5zMiA9IGFyZ3BhcnNlLk5hbWVzcGFjZShiPTIsIGE9MSkKKyAgICAgICAgbnMzID0gYXJncGFyc2UuTmFtZXNwYWNlKGE9MSkKKyAgICAgICAgbnM0ID0gYXJncGFyc2UuTmFtZXNwYWNlKGI9MikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5zMSwgbnMyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5zMSwgbnMzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5zMSwgbnM0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5zMiwgbnMzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5zMiwgbnM0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobnMxICE9IG5zMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5zMSAhPSBuczQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuczIgIT0gbnMzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobnMyICE9IG5zNCkKKworCisjID09PT09PT09PT09PT09PT09PT0KKyMgRmlsZSBlbmNvZGluZyB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RFbmNvZGluZyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgX3Rlc3RfbW9kdWxlX2VuY29kaW5nKHNlbGYsIHBhdGgpOgorICAgICAgICBwYXRoLCBfID0gb3MucGF0aC5zcGxpdGV4dChwYXRoKQorICAgICAgICBwYXRoICs9ICIucHkiCisgICAgICAgIHdpdGggY29kZWNzLm9wZW4ocGF0aCwgJ3InLCAndXRmOCcpIGFzIGY6CisgICAgICAgICAgICBmLnJlYWQoKQorCisgICAgZGVmIHRlc3RfYXJncGFyc2VfbW9kdWxlX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X21vZHVsZV9lbmNvZGluZyhhcmdwYXJzZS5fX2ZpbGVfXykKKworICAgIGRlZiB0ZXN0X3Rlc3RfYXJncGFyc2VfbW9kdWxlX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X21vZHVsZV9lbmNvZGluZyhfX2ZpbGVfXykKKworIyA9PT09PT09PT09PT09PT09PT09CisjIEFyZ3VtZW50RXJyb3IgdGVzdHMKKyMgPT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0QXJndW1lbnRFcnJvcihUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hcmd1bWVudF9lcnJvcihzZWxmKToKKyAgICAgICAgbXNnID0gIm15IGVycm9yIGhlcmUiCisgICAgICAgIGVycm9yID0gYXJncGFyc2UuQXJndW1lbnRFcnJvcihOb25lLCBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGVycm9yKSwgbXNnKQorCisjID09PT09PT09PT09PT09PT09PT09PT09CisjIEFyZ3VtZW50VHlwZUVycm9yIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RBcmd1bWVudFR5cGVFcnJvcihUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hcmd1bWVudF90eXBlX2Vycm9yKHNlbGYpOgorCisgICAgICAgIGRlZiBzcGFtKHN0cmluZyk6CisgICAgICAgICAgICByYWlzZSBhcmdwYXJzZS5Bcmd1bWVudFR5cGVFcnJvcignc3BhbSEnKQorCisgICAgICAgIHBhcnNlciA9IEVycm9yUmFpc2luZ0FyZ3VtZW50UGFyc2VyKHByb2c9J1BST0cnLCBhZGRfaGVscD1GYWxzZSkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgneCcsIHR5cGU9c3BhbSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoWydYWFgnXSkKKyAgICAgICAgZXhjZXB0IEFyZ3VtZW50UGFyc2VyRXJyb3I6CisgICAgICAgICAgICBleHBlY3RlZCA9ICd1c2FnZTogUFJPRyB4XG5QUk9HOiBlcnJvcjogYXJndW1lbnQgeDogc3BhbSFcbicKKyAgICAgICAgICAgIG1zZyA9IHN5cy5leGNfaW5mbygpWzFdLnN0ZGVycgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgbXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ2hlY2sgdGhhdCB0aGUgdHlwZSBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbmNlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0VHlwZUZ1bmN0aW9uQ2FsbE9ubHlPbmNlKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3R5cGVfZnVuY3Rpb25fY2FsbF9vbmx5X29uY2Uoc2VsZik6CisgICAgICAgIGRlZiBzcGFtKHN0cmluZ190b19jb252ZXJ0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX3RvX2NvbnZlcnQsICdzcGFtIScpCisgICAgICAgICAgICByZXR1cm4gJ2Zvb19jb252ZXJ0ZWQnCisKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycsIHR5cGU9c3BhbSwgZGVmYXVsdD0nYmFyJykKKyAgICAgICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCctLWZvbyBzcGFtIScuc3BsaXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyhmb289J2Zvb19jb252ZXJ0ZWQnKSwgYXJncykKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ2hlY2sgc2VtYW50aWNzIHJlZ2FyZGluZyB0aGUgZGVmYXVsdCBhcmd1bWVudCBhbmQgdHlwZSBjb252ZXJzaW9uCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0VHlwZUZ1bmN0aW9uQ2FsbGVkT25EZWZhdWx0KFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3R5cGVfZnVuY3Rpb25fY2FsbF93aXRoX25vbl9zdHJpbmdfZGVmYXVsdChzZWxmKToKKyAgICAgICAgZGVmIHNwYW0oaW50X3RvX2NvbnZlcnQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRfdG9fY29udmVydCwgMCkKKyAgICAgICAgICAgIHJldHVybiAnZm9vX2NvbnZlcnRlZCcKKworICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tZm9vJywgdHlwZT1zcGFtLCBkZWZhdWx0PTApCisgICAgICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhbXSkKKyAgICAgICAgIyBmb28gc2hvdWxkICpub3QqIGJlIGNvbnZlcnRlZCBiZWNhdXNlIGl0cyBkZWZhdWx0IGlzIG5vdCBhIHN0cmluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyhmb289MCksIGFyZ3MpCisKKyAgICBkZWYgdGVzdF90eXBlX2Z1bmN0aW9uX2NhbGxfd2l0aF9zdHJpbmdfZGVmYXVsdChzZWxmKToKKyAgICAgICAgZGVmIHNwYW0oaW50X3RvX2NvbnZlcnQpOgorICAgICAgICAgICAgcmV0dXJuICdmb29fY29udmVydGVkJworCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1mb28nLCB0eXBlPXNwYW0sIGRlZmF1bHQ9JzAnKQorICAgICAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoW10pCisgICAgICAgICMgZm9vIGlzIGNvbnZlcnRlZCBiZWNhdXNlIGl0cyBkZWZhdWx0IGlzIGEgc3RyaW5nLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKGZvbz0nZm9vX2NvbnZlcnRlZCcpLCBhcmdzKQorCisgICAgZGVmIHRlc3Rfbm9fZG91YmxlX3R5cGVfY29udmVyc2lvbl9vZl9kZWZhdWx0KHNlbGYpOgorICAgICAgICBkZWYgZXh0ZW5kKHN0cl90b19jb252ZXJ0KToKKyAgICAgICAgICAgIHJldHVybiBzdHJfdG9fY29udmVydCArICcqJworCisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS10ZXN0JywgdHlwZT1leHRlbmQsIGRlZmF1bHQ9JyonKQorICAgICAgICBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoW10pCisgICAgICAgICMgVGhlIHRlc3QgYXJndW1lbnQgd2lsbCBiZSB0d28gc3RhcnMsIG9uZSBjb21pbmcgZnJvbSB0aGUgZGVmYXVsdAorICAgICAgICAjIHZhbHVlIGFuZCBvbmUgY29taW5nIGZyb20gdGhlIHR5cGUgY29udmVyc2lvbiBiZWluZyBjYWxsZWQgZXhhY3RseQorICAgICAgICAjIG9uY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTlModGVzdD0nKionKSwgYXJncykKKworICAgIGRlZiB0ZXN0X2lzc3VlXzE1OTA2KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNTkwNjogV2hlbiBhY3Rpb249J2FwcGVuZCcsIHR5cGU9c3RyLCBkZWZhdWx0PVtdIGFyZQorICAgICAgICAjIHByb3ZpZGluZywgdGhlIGRlc3QgdmFsdWUgd2FzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gIltdIiB3aGVuIGl0CisgICAgICAgICMgc2hvdWxkIGhhdmUgYmVlbiBhbiBlbXB0eSBsaXN0LgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tdGVzdCcsIGRlc3Q9J3Rlc3QnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdLCBhY3Rpb249J2FwcGVuZCcpCisgICAgICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLnRlc3QsIFtdKQorCisjID09PT09PT09PT09PT09PT09PT09PT0KKyMgcGFyc2Vfa25vd25fYXJncyB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RQYXJzZUtub3duQXJncyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHNfdHVwbGUoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnBhcnNlX2FyZ3MoKCkpCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHNfbGlzdChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbXSkKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50c190dXBsZV9wb3NpdGlvbmFsKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3gnKQorICAgICAgICBwYXJzZXIucGFyc2VfYXJncygoJ3gnLCkpCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHNfbGlzdF9wb3NpdGlvbmFsKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3gnKQorICAgICAgICBwYXJzZXIucGFyc2VfYXJncyhbJ3gnXSkKKworICAgIGRlZiB0ZXN0X29wdGlvbmFscyhzZWxmKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWZvbycpCisgICAgICAgIGFyZ3MsIGV4dHJhcyA9IHBhcnNlci5wYXJzZV9rbm93bl9hcmdzKCctLWZvbyBGIC0tYmFyIC0tYmF6Jy5zcGxpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5TKGZvbz0nRicpLCBhcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsnLS1iYXInLCAnLS1iYXonXSwgZXh0cmFzKQorCisgICAgZGVmIHRlc3RfbWl4ZWQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCBuYXJncz0nPycsIGNvbnN0PTEsIHR5cGU9aW50KQorICAgICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNwYW0nLCBhY3Rpb249J3N0b3JlX2ZhbHNlJykKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnYmFkZ2VyJykKKworICAgICAgICBhcmd2ID0gWyJCIiwgIkMiLCAiLS1mb28iLCAiLXYiLCAiMyIsICI0Il0KKyAgICAgICAgYXJncywgZXh0cmFzID0gcGFyc2VyLnBhcnNlX2tub3duX2FyZ3MoYXJndikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOUyh2PTMsIHNwYW09VHJ1ZSwgYmFkZ2VyPSJCIiksIGFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyJDIiwgIi0tZm9vIiwgIjQiXSwgZXh0cmFzKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09CisjIGFkZF9hcmd1bWVudCBtZXRhdmFyIHRlc3RzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RBZGRBcmd1bWVudE1ldGF2YXIoVGVzdENhc2UpOgorCisgICAgRVhQRUNURURfTUVTU0FHRSA9ICJsZW5ndGggb2YgbWV0YXZhciB0dXBsZSBkb2VzIG5vdCBtYXRjaCBuYXJncyIKKworICAgIGRlZiBkb190ZXN0X25vX2V4Y2VwdGlvbihzZWxmLCBuYXJncywgbWV0YXZhcik6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb28iLCBuYXJncz1uYXJncywgbWV0YXZhcj1tZXRhdmFyKQorCisgICAgZGVmIGRvX3Rlc3RfZXhjZXB0aW9uKHNlbGYsIG5hcmdzLCBtZXRhdmFyKToKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLS1mb28iLCBuYXJncz1uYXJncywgbWV0YXZhcj1tZXRhdmFyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5hcmdzWzBdLCBzZWxmLkVYUEVDVEVEX01FU1NBR0UpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPU5vbmUKKworICAgIGRlZiB0ZXN0X25hcmdzX05vbmVfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Tm9uZSwgbWV0YXZhcj0iMSIpCisKKyAgICBkZWYgdGVzdF9uYXJnc19Ob25lX21ldGF2YXJfbGVuZ3RoMChzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz1Ob25lLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc19Ob25lX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz1Ob25lLCBtZXRhdmFyPSgiMSIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfTm9uZV9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9Tm9uZSwgbWV0YXZhcj0oIjEiLCAiMiIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfTm9uZV9tZXRhdmFyX2xlbmd0aDMoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9Tm9uZSwgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPT8KKworICAgIGRlZiB0ZXN0X25hcmdzX29wdGlvbmFsX21ldGF2YXJfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPSI/IiwgbWV0YXZhcj0iMSIpCisKKyAgICBkZWYgdGVzdF9uYXJnc19vcHRpb25hbF9tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9Ij8iLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc19vcHRpb25hbF9tZXRhdmFyX2xlbmd0aDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Ij8iLCBtZXRhdmFyPSgiMSIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3Nfb3B0aW9uYWxfbWV0YXZhcl9sZW5ndGgyKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSI/IiwgbWV0YXZhcj0oIjEiLCAiMiIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3Nfb3B0aW9uYWxfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSI/IiwgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPSoKKworICAgIGRlZiB0ZXN0X25hcmdzX3plcm9vcm1vcmVfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9IioiLCBtZXRhdmFyPSIxIikKKworICAgIGRlZiB0ZXN0X25hcmdzX3plcm9vcm1vcmVfbWV0YXZhcl9sZW5ndGgwKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSIqIiwgbWV0YXZhcj10dXBsZSgpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfemVyb29ybW9yZV9tZXRhdmFyX2xlbmd0aDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9IioiLCBtZXRhdmFyPSgiMSIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfemVyb29ybW9yZV9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9IioiLCBtZXRhdmFyPSgiMSIsICIyIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc196ZXJvb3Jtb3JlX21ldGF2YXJfbGVuZ3RoMyhzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz0iKiIsIG1ldGF2YXI9KCIxIiwgIjIiLCAiMyIpKQorCisgICAgIyBVbml0IHRlc3RzIGZvciBkaWZmZXJlbnQgdmFsdWVzIG9mIG1ldGF2YXIgd2hlbiBuYXJncz0rCisKKyAgICBkZWYgdGVzdF9uYXJnc19vbmVvcm1vcmVfbWV0YXZhcl9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9IisiLCBtZXRhdmFyPSIxIikKKworICAgIGRlZiB0ZXN0X25hcmdzX29uZW9ybW9yZV9tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9IisiLCBtZXRhdmFyPXR1cGxlKCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc19vbmVvcm1vcmVfbWV0YXZhcl9sZW5ndGgxKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPSIrIiwgbWV0YXZhcj0oIjEiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX29uZW9ybW9yZV9tZXRhdmFyX2xlbmd0aDIoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9IisiLCBtZXRhdmFyPSgiMSIsICIyIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19vbmVvcm1vcmVfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSIrIiwgbWV0YXZhcj0oIjEiLCAiMiIsICIzIikpCisKKyAgICAjIFVuaXQgdGVzdHMgZm9yIGRpZmZlcmVudCB2YWx1ZXMgb2YgbWV0YXZhciB3aGVuIG5hcmdzPS4uLgorCisgICAgZGVmIHRlc3RfbmFyZ3NfcmVtYWluZGVyX21ldGF2YXJfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPSIuLi4iLCBtZXRhdmFyPSIxIikKKworICAgIGRlZiB0ZXN0X25hcmdzX3JlbWFpbmRlcl9tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Ii4uLiIsIG1ldGF2YXI9dHVwbGUoKSkKKworICAgIGRlZiB0ZXN0X25hcmdzX3JlbWFpbmRlcl9tZXRhdmFyX2xlbmd0aDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9Ii4uLiIsIG1ldGF2YXI9KCIxIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19yZW1haW5kZXJfbWV0YXZhcl9sZW5ndGgyKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPSIuLi4iLCBtZXRhdmFyPSgiMSIsICIyIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19yZW1haW5kZXJfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPSIuLi4iLCBtZXRhdmFyPSgiMSIsICIyIiwgIjMiKSkKKworICAgICMgVW5pdCB0ZXN0cyBmb3IgZGlmZmVyZW50IHZhbHVlcyBvZiBtZXRhdmFyIHdoZW4gbmFyZ3M9QS4uLgorCisgICAgZGVmIHRlc3RfbmFyZ3NfcGFyc2VyX21ldGF2YXJfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPSJBLi4uIiwgbWV0YXZhcj0iMSIpCisKKyAgICBkZWYgdGVzdF9uYXJnc19wYXJzZXJfbWV0YXZhcl9sZW5ndGgwKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSJBLi4uIiwgbWV0YXZhcj10dXBsZSgpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfcGFyc2VyX21ldGF2YXJfbGVuZ3RoMShzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X25vX2V4Y2VwdGlvbihuYXJncz0iQS4uLiIsIG1ldGF2YXI9KCIxIikpCisKKyAgICBkZWYgdGVzdF9uYXJnc19wYXJzZXJfbWV0YXZhcl9sZW5ndGgyKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPSJBLi4uIiwgbWV0YXZhcj0oIjEiLCAiMiIpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfcGFyc2VyX21ldGF2YXJfbGVuZ3RoMyhzZWxmKToKKyAgICAgICAgc2VsZi5kb190ZXN0X2V4Y2VwdGlvbihuYXJncz0iQS4uLiIsIG1ldGF2YXI9KCIxIiwgIjIiLCAiMyIpKQorCisgICAgIyBVbml0IHRlc3RzIGZvciBkaWZmZXJlbnQgdmFsdWVzIG9mIG1ldGF2YXIgd2hlbiBuYXJncz0xCisKKyAgICBkZWYgdGVzdF9uYXJnc18xX21ldGF2YXJfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPTEsIG1ldGF2YXI9IjEiKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMV9tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9MSwgbWV0YXZhcj10dXBsZSgpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMV9tZXRhdmFyX2xlbmd0aDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MSwgbWV0YXZhcj0oIjEiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzXzFfbWV0YXZhcl9sZW5ndGgyKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPTEsIG1ldGF2YXI9KCIxIiwgIjIiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzXzFfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPTEsIG1ldGF2YXI9KCIxIiwgIjIiLCAiMyIpKQorCisgICAgIyBVbml0IHRlc3RzIGZvciBkaWZmZXJlbnQgdmFsdWVzIG9mIG1ldGF2YXIgd2hlbiBuYXJncz0yCisKKyAgICBkZWYgdGVzdF9uYXJnc18yX21ldGF2YXJfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPTIsIG1ldGF2YXI9IjEiKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMl9tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9MiwgbWV0YXZhcj10dXBsZSgpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfMl9tZXRhdmFyX2xlbmd0aDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MiwgbWV0YXZhcj0oIjEiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzXzJfbWV0YXZhcl9sZW5ndGgyKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPTIsIG1ldGF2YXI9KCIxIiwgIjIiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzXzJfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPTIsIG1ldGF2YXI9KCIxIiwgIjIiLCAiMyIpKQorCisgICAgIyBVbml0IHRlc3RzIGZvciBkaWZmZXJlbnQgdmFsdWVzIG9mIG1ldGF2YXIgd2hlbiBuYXJncz0zCisKKyAgICBkZWYgdGVzdF9uYXJnc18zX21ldGF2YXJfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPTMsIG1ldGF2YXI9IjEiKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfM19tZXRhdmFyX2xlbmd0aDAoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9leGNlcHRpb24obmFyZ3M9MywgbWV0YXZhcj10dXBsZSgpKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfM19tZXRhdmFyX2xlbmd0aDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fdGVzdF9ub19leGNlcHRpb24obmFyZ3M9MywgbWV0YXZhcj0oIjEiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzXzNfbWV0YXZhcl9sZW5ndGgyKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3RfZXhjZXB0aW9uKG5hcmdzPTMsIG1ldGF2YXI9KCIxIiwgIjIiKSkKKworICAgIGRlZiB0ZXN0X25hcmdzXzNfbWV0YXZhcl9sZW5ndGgzKHNlbGYpOgorICAgICAgICBzZWxmLmRvX3Rlc3Rfbm9fZXhjZXB0aW9uKG5hcmdzPTMsIG1ldGF2YXI9KCIxIiwgIjIiLCAiMyIpKQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgZnJvbSBhcmdwYXJzZSBpbXBvcnQgKiB0ZXN0cworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RJbXBvcnRTdGFyKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBhcmdwYXJzZS5fX2FsbF9fOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYXJncGFyc2UsIG5hbWUpKQorCisgICAgZGVmIHRlc3RfYWxsX2V4cG9ydHNfZXZlcnl0aGluZ19idXRfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgaXRlbXMgPSBbCisgICAgICAgICAgICBuYW1lCisgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gdmFycyhhcmdwYXJzZSkuaXRlbXMoKQorICAgICAgICAgICAgaWYgbm90IG5hbWUuc3RhcnRzd2l0aCgiXyIpCisgICAgICAgICAgICBpZiBub3QgaW5zcGVjdC5pc21vZHVsZSh2YWx1ZSkKKyAgICAgICAgXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChpdGVtcyksIHNvcnRlZChhcmdwYXJzZS5fX2FsbF9fKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgICMgc2lsZW5jZSB3YXJuaW5ncyBhYm91dCB2ZXJzaW9uIGFyZ3VtZW50IC0gdGhlc2UgYXJlIGV4cGVjdGVkCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoCisgICAgICAgICAgICAoJ1RoZSAidmVyc2lvbiIgYXJndW1lbnQgdG8gQXJndW1lbnRQYXJzZXIgaXMgZGVwcmVjYXRlZC4nLAorICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoJ1RoZSAoZm9ybWF0fHByaW50KV92ZXJzaW9uIG1ldGhvZCBpcyBkZXByZWNhdGVkJywKKyAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKyAgICAjIFJlbW92ZSBnbG9iYWwgcmVmZXJlbmNlcyB0byBhdm9pZCBsb29raW5nIGxpa2Ugd2UgaGF2ZSByZWZsZWFrcy4KKyAgICBSRmlsZS5zZWVuID0ge30KKyAgICBXRmlsZS5zZWVuID0gc2V0KCkKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTA5YTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FyZ3BhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTE1YmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJncGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FycmF5LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzRkY2NiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FycmF5LnB5CkBAIC0wLDAgKzEsMTExMSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCB0aGUgYXJyYXltb2R1bGUuCisgICBSb2dlciBFLiBNYXNzZQorIiIiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQoraW1wb3J0IGFycmF5LCBjU3RyaW5nSU8KK2Zyb20gY1BpY2tsZSBpbXBvcnQgbG9hZHMsIGR1bXBzLCBISUdIRVNUX1BST1RPQ09MCisKK2NsYXNzIEFycmF5U3ViY2xhc3MoYXJyYXkuYXJyYXkpOgorICAgIHBhc3MKKworY2xhc3MgQXJyYXlTdWJjbGFzc1dpdGhLd2FyZ3MoYXJyYXkuYXJyYXkpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlY29kZSwgbmV3YXJnPU5vbmUpOgorICAgICAgICBhcnJheS5hcnJheS5fX2luaXRfXyhzZWxmLCB0eXBlY29kZSkKKwordGVzdHMgPSBbXSAjIGxpc3QgdG8gYWNjdW11bGF0ZSBhbGwgdGVzdHMKK3R5cGVjb2RlcyA9ICJjdWJCaEhpSWxMZmQiCisKK2NsYXNzIEJhZENvbnN0cnVjdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcnJheS5hcnJheSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcnJheS5hcnJheSwgc3BhbT00MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcnJheS5hcnJheSwgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYXJyYXkuYXJyYXksICd4JykKKwordGVzdHMuYXBwZW5kKEJhZENvbnN0cnVjdG9yVGVzdCkKKworY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgUmVxdWlyZWQgY2xhc3MgYXR0cmlidXRlcyAocHJvdmlkZWQgYnkgc3ViY2xhc3NlcworICAgICMgdHlwZWNvZGU6IHRoZSB0eXBlY29kZSB0byB0ZXN0CisgICAgIyBleGFtcGxlOiBhbiBpbml0aWFsaXplciB1c2FibGUgaW4gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGlzIHR5cGUKKyAgICAjIHNtYWxsZXJleGFtcGxlOiB0aGUgc2FtZSBsZW5ndGggYXMgZXhhbXBsZSwgYnV0IHNtYWxsZXIKKyAgICAjIGJpZ2dlcmV4YW1wbGU6IHRoZSBzYW1lIGxlbmd0aCBhcyBleGFtcGxlLCBidXQgYmlnZ2VyCisgICAgIyBvdXRzaWRlOiBBbiBlbnRyeSB0aGF0IGlzIG5vdCBpbiBleGFtcGxlCisgICAgIyBtaW5pdGVtc2l6ZTogdGhlIG1pbmltdW0gZ3VhcmFudGVlZCBpdGVtc2l6ZQorCisgICAgZGVmIGFzc2VydEVudHJ5RXF1YWwoc2VsZiwgZW50cnkxLCBlbnRyeTIpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJ5MSwgZW50cnkyKQorCisgICAgZGVmIGJhZHR5cGVjb2RlKHNlbGYpOgorICAgICAgICAjIFJldHVybiBhIHR5cGVjb2RlIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gb3VyIG93bgorICAgICAgICByZXR1cm4gdHlwZWNvZGVzWyh0eXBlY29kZXMuaW5kZXgoc2VsZi50eXBlY29kZSkrMSkgJSBsZW4odHlwZWNvZGVzKV0KKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnR5cGVjb2RlLCBzZWxmLnR5cGVjb2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5pdGVtc2l6ZT49c2VsZi5taW5pdGVtc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcnJheS5hcnJheSwgc2VsZi50eXBlY29kZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIGEuYXBwZW5kKHNlbGYuZXhhbXBsZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIDEpCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIGxlbihzZWxmLmV4YW1wbGUpKQorCisgICAgZGVmIHRlc3RfYnVmZmVyX2luZm8oc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5idWZmZXJfaW5mbywgNDIpCisgICAgICAgIGJpID0gYS5idWZmZXJfaW5mbygpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShiaSwgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJpKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGJpWzBdLCAoaW50LCBsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGJpWzFdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmlbMV0sIGxlbihhKSkKKworICAgIGRlZiB0ZXN0X2J5dGVzd2FwKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuYnl0ZXN3YXAsIDQyKQorICAgICAgICBpZiBhLml0ZW1zaXplIGluICgxLCAyLCA0LCA4KToKKyAgICAgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgICAgICBiLmJ5dGVzd2FwKCkKKyAgICAgICAgICAgIGlmIGEuaXRlbXNpemU9PTE6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGEsIGIpCisgICAgICAgICAgICBiLmJ5dGVzd2FwKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGIgPSBjb3B5LmNvcHkoYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5KHNlbGYpOgorICAgICAgICBpbXBvcnQgY29weQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBiID0gY29weS5kZWVwY29weShhKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGEpLCBpZChiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBmb3IgcHJvdG9jb2wgaW4gcmFuZ2UoSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgICAgIGIgPSBsb2FkcyhkdW1wcyhhLCBwcm90b2NvbCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGEpLCBpZChiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgICAgICAgICAgYSA9IEFycmF5U3ViY2xhc3Moc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICAgICAgYS54ID0gMTAKKyAgICAgICAgICAgIGIgPSBsb2FkcyhkdW1wcyhhLCBwcm90b2NvbCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGEpLCBpZChiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS54LCBiLngpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYSksIHR5cGUoYikpCisKKyAgICBkZWYgdGVzdF9waWNrbGVfZm9yX2VtcHR5X2FycmF5KHNlbGYpOgorICAgICAgICBmb3IgcHJvdG9jb2wgaW4gcmFuZ2UoSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICAgICBiID0gbG9hZHMoZHVtcHMoYSwgcHJvdG9jb2wpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisKKyAgICAgICAgICAgIGEgPSBBcnJheVN1YmNsYXNzKHNlbGYudHlwZWNvZGUpCisgICAgICAgICAgICBhLnggPSAxMAorICAgICAgICAgICAgYiA9IGxvYWRzKGR1bXBzKGEsIHByb3RvY29sKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYSksIGlkKGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIGIueCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgdHlwZShiKSkKKworICAgIGRlZiB0ZXN0X2luc2VydChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYS5pbnNlcnQoMCwgc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSwgMStsZW4oc2VsZi5leGFtcGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzBdLCBhWzFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuaW5zZXJ0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuaW5zZXJ0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuaW5zZXJ0LCAwLCBOb25lKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGEuaW5zZXJ0KC0xLCBzZWxmLmV4YW1wbGVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoCisgICAgICAgICAgICAgICAgc2VsZi50eXBlY29kZSwKKyAgICAgICAgICAgICAgICBzZWxmLmV4YW1wbGVbOi0xXSArIHNlbGYuZXhhbXBsZVs6MV0gKyBzZWxmLmV4YW1wbGVbLTE6XQorICAgICAgICAgICAgKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYS5pbnNlcnQoLTEwMDAsIHNlbGYuZXhhbXBsZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOjFdICsgc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYS5pbnNlcnQoMTAwMCwgc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSArIHNlbGYuZXhhbXBsZVs6MV0pCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3RvZnJvbWZpbGUoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLnRvZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLnRvZmlsZSwgY1N0cmluZ0lPLlN0cmluZ0lPKCkpCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYS50b2ZpbGUoZikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAncmInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLmZyb21maWxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgICAgIGIuZnJvbWZpbGUsCisgICAgICAgICAgICAgICAgY1N0cmluZ0lPLlN0cmluZ0lPKCksIGxlbihzZWxmLmV4YW1wbGUpCisgICAgICAgICAgICApCisgICAgICAgICAgICBiLmZyb21maWxlKGYsIGxlbihzZWxmLmV4YW1wbGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLCBiKQorICAgICAgICAgICAgYi5mcm9tZmlsZShmLCBsZW4oc2VsZi5leGFtcGxlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBiLmZyb21maWxlLCBmLCAxKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZWQ6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9mcm9tZmlsZV9pb2Vycm9yKHNlbGYpOgorICAgICAgICAjIElzc3VlICM1Mzk1OiBDaGVjayBpZiBmcm9tZmlsZSByYWlzZXMgYSBwcm9wZXIgSU9FcnJvcgorICAgICAgICAjIGluc3RlYWQgb2YgRU9GRXJyb3IuCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBhLmZyb21maWxlLCBmLCBsZW4oc2VsZi5leGFtcGxlKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZmlsZXdyaXRlKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgMipzZWxmLmV4YW1wbGUpCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3YicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoYSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAncmInKQorICAgICAgICAgICAgYi5mcm9tZmlsZShmLCBsZW4oc2VsZi5leGFtcGxlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYSwgYikKKyAgICAgICAgICAgIGIuZnJvbWZpbGUoZiwgbGVuKHNlbGYuZXhhbXBsZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X3RvZnJvbWxpc3Qoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS50b2xpc3QsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGIuZnJvbWxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYi5mcm9tbGlzdCwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYi5mcm9tbGlzdCwgW05vbmVdKQorICAgICAgICBiLmZyb21saXN0KGEudG9saXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgIGRlZiB0ZXN0X3RvZnJvbXN0cmluZyhzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLnRvc3RyaW5nLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiLmZyb21zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYi5mcm9tc3RyaW5nLCA0MikKKyAgICAgICAgYi5mcm9tc3RyaW5nKGEudG9zdHJpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICBpZiBhLml0ZW1zaXplPjE6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiLmZyb21zdHJpbmcsICJ4IikKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBldmFsKHJlcHIoYSksIHsiYXJyYXkiOiBhcnJheS5hcnJheX0pKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYSksICJhcnJheSgnJXMnKSIgJSBzZWxmLnR5cGVjb2RlKQorCisgICAgZGVmIHRlc3Rfc3RyKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgMipzZWxmLmV4YW1wbGUpCisgICAgICAgIHN0cihhKQorCisgICAgZGVmIHRlc3RfY21wKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gNDIpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gNDIpIGlzIFRydWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID09IGEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAhPSBhKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDwgYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PSBhKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPiBhKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID49IGEpIGlzIFRydWUpCisKKyAgICAgICAgYWwgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLnNtYWxsZXJleGFtcGxlKQorICAgICAgICBhYiA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuYmlnZ2VyZXhhbXBsZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gMiphKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICE9IDIqYSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDwgMiphKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPD0gMiphKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPiAyKmEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPj0gMiphKSBpcyBGYWxzZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gYWwpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gYWwpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IGFsKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw9IGFsKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4gYWwpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSBhbCkgaXMgVHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gYWIpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gYWIpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IGFiKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPD0gYWIpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+IGFiKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID49IGFiKSBpcyBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkgXAorICAgICAgICAgICAgKyBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlICsgc2VsZi5leGFtcGxlWzo6LTFdKQorICAgICAgICApCisKKyAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYuYmFkdHlwZWNvZGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fYWRkX18sIGIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fYWRkX18sICJiYWQiKQorCisgICAgZGVmIHRlc3RfaWFkZChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6Oi0xXSkKKyAgICAgICAgYiA9IGEKKyAgICAgICAgYSArPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOjotMV0rMipzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYSArPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlICsgc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYiA9IGFycmF5LmFycmF5KHNlbGYuYmFkdHlwZWNvZGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fYWRkX18sIGIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9faWFkZF9fLCAiYmFkIikKKworICAgIGRlZiB0ZXN0X211bChzZWxmKToKKyAgICAgICAgYSA9IDUqYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDUqc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkqNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSo1KQorICAgICAgICApCisKKyAgICAgICAgYSA9IDAqYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICkKKworICAgICAgICBhID0gKC0xKSphcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX211bF9fLCAiYmFkIikKKworICAgIGRlZiB0ZXN0X2ltdWwoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGIgPSBhCisKKyAgICAgICAgYSAqPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgNSpzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhICo9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKKworICAgICAgICBhICo9IDEwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKKworICAgICAgICBhICo9IC0xCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkpCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYSAqPSAtMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX2ltdWxfXywgImJhZCIpCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVswXSwgc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVswTF0sIHNlbGYuZXhhbXBsZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGFbLTFdLCBzZWxmLmV4YW1wbGVbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVstMUxdLCBzZWxmLmV4YW1wbGVbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVtsZW4oc2VsZi5leGFtcGxlKS0xXSwgc2VsZi5leGFtcGxlWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGFbLWxlbihzZWxmLmV4YW1wbGUpXSwgc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19nZXRpdGVtX18pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19nZXRpdGVtX18sIGxlbihzZWxmLmV4YW1wbGUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLl9fZ2V0aXRlbV9fLCAtbGVuKHNlbGYuZXhhbXBsZSktMSkKKworICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbMF0gPSBhWy0xXQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVswXSwgYVstMV0pCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVswTF0gPSBhWy0xXQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVswXSwgYVstMV0pCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVstMV0gPSBhWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWzBdLCBhWy0xXSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWy0xTF0gPSBhWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhWzBdLCBhWy0xXSkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhW2xlbihzZWxmLmV4YW1wbGUpLTFdID0gYVswXQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYVswXSwgYVstMV0pCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVstbGVuKHNlbGYuZXhhbXBsZSldID0gYVstMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGFbMF0sIGFbLTFdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX3NldGl0ZW1fXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0aXRlbV9fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18sIDAsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgSW5kZXhFcnJvciwKKyAgICAgICAgICAgIGEuX19zZXRpdGVtX18sCisgICAgICAgICAgICBsZW4oc2VsZi5leGFtcGxlKSwgc2VsZi5leGFtcGxlWzBdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBJbmRleEVycm9yLAorICAgICAgICAgICAgYS5fX3NldGl0ZW1fXywKKyAgICAgICAgICAgIC1sZW4oc2VsZi5leGFtcGxlKS0xLCBzZWxmLmV4YW1wbGVbMF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZGVsaXRlbShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgZGVsIGFbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbMTpdKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgZGVsIGFbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzotMV0pCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBkZWwgYVtsZW4oc2VsZi5leGFtcGxlKS0xXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6LTFdKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgZGVsIGFbLWxlbihzZWxmLmV4YW1wbGUpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVsxOl0pCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19kZWxpdGVtX18pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5fX2RlbGl0ZW1fXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYS5fX2RlbGl0ZW1fXywgbGVuKHNlbGYuZXhhbXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEuX19kZWxpdGVtX18sIC1sZW4oc2VsZi5leGFtcGxlKS0xKQorCisgICAgZGVmIHRlc3RfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6XSwgYSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYVsxOl0sCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbMTpdKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGFbOjFdLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzoxXSkKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhWzotMV0sCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOi0xXSkKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhWy0xOl0sCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbLTE6XSkKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhWy0xOi0xXSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYVsyOjFdLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhWzEwMDA6XSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDAwOl0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6MTAwMF0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhWzotMTAwMF0sCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwMDoxMDAwXSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGFbMjAwMDoxMDAwXSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2dldHNsaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXh0ZW5kZWQgc2xpY2luZyBieSBjb21wYXJpbmcgd2l0aCBsaXN0IHNsaWNpbmcKKyAgICAgICAgIyAoQXNzdW1lcyBsaXN0IGNvbnZlcnNpb24gd29ya3MgY29ycmVjdGx5LCB0b28pCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgMTksIDEwMCwgLTEsIC0yLCAtMzEsIC0xMDApCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIEV2ZXJ5dGhpbmcgZXhjZXB0IHRoZSBpbml0aWFsIDAgKGludmFsaWQgc3RlcCkKKyAgICAgICAgICAgICAgICBmb3Igc3RlcCBpbiBpbmRpY2VzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFbc3RhcnQ6c3RvcDpzdGVwXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChhKVtzdGFydDpzdG9wOnN0ZXBdKQorCisgICAgZGVmIHRlc3Rfc2V0c2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGFbOjFdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSArIHNlbGYuZXhhbXBsZVsxOl0pCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzotMV0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlICsgc2VsZi5leGFtcGxlWy0xOl0pCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWy0xOl0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzotMV0gKyBzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWzE6XSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbOjFdICsgc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVsxOi0xXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheSgKKyAgICAgICAgICAgICAgICBzZWxmLnR5cGVjb2RlLAorICAgICAgICAgICAgICAgIHNlbGYuZXhhbXBsZVs6MV0gKyBzZWxmLmV4YW1wbGUgKyBzZWxmLmV4YW1wbGVbLTE6XQorICAgICAgICAgICAgKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVsxMDAwOl0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgMipzZWxmLmV4YW1wbGUpCisgICAgICAgICkKKworICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBhWy0xMDAwOl0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVs6MTAwMF0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVs6LTEwMDBdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVsxOjBdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6MV0gKyBzZWxmLmV4YW1wbGUgKyBzZWxmLmV4YW1wbGVbMTpdKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYVsyMDAwOjEwMDBdID0gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQorICAgICAgICApCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0c2xpY2VfXywgMCwgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0aXRlbV9fLCBzbGljZSgwLCAwKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLl9fc2V0aXRlbV9fLCBzbGljZSgwLCAxKSwgTm9uZSkKKworICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi5iYWR0eXBlY29kZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRzbGljZV9fLCAwLCAwLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18sIHNsaWNlKDAsIDApLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18sIHNsaWNlKDAsIDEpLCBiKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfc2V0X2RlbF9zbGljZShzZWxmKToKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCAxOSwgMTAwLCAtMSwgLTIsIC0zMSwgLTEwMCkKKyAgICAgICAgZm9yIHN0YXJ0IGluIGluZGljZXM6CisgICAgICAgICAgICBmb3Igc3RvcCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgICAgICMgRXZlcnl0aGluZyBleGNlcHQgdGhlIGluaXRpYWwgMCAoaW52YWxpZCBzdGVwKQorICAgICAgICAgICAgICAgIGZvciBzdGVwIGluIGluZGljZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICAgICAgICAgICAgICBMID0gbGlzdChhKQorICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgc2xpY2Ugb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAjIGJ1dCB3aXRoIChob3BlZnVsbHkpIGRpZmZlcmVudCBkYXRhLgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gTFtzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIGRhdGEucmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgICAgIExbc3RhcnQ6c3RvcDpzdGVwXSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYVtzdGFydDpzdG9wOnN0ZXBdID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBMKSkKKworICAgICAgICAgICAgICAgICAgICBkZWwgTFtzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIGRlbCBhW3N0YXJ0OnN0b3A6c3RlcF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBMKSkKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICBleGFtcGxlID0gMipzZWxmLmV4YW1wbGUKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIGV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5pbmRleCkKKyAgICAgICAgZm9yIHggaW4gZXhhbXBsZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5pbmRleCh4KSwgZXhhbXBsZS5pbmRleCh4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5pbmRleCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5pbmRleCwgc2VsZi5vdXRzaWRlKQorCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIGV4YW1wbGUgPSAyKnNlbGYuZXhhbXBsZQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmNvdW50KQorICAgICAgICBmb3IgeCBpbiBleGFtcGxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmNvdW50KHgpLCBleGFtcGxlLmNvdW50KHgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuY291bnQoc2VsZi5vdXRzaWRlKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmNvdW50KE5vbmUpLCAwKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICBmb3IgeCBpbiBzZWxmLmV4YW1wbGU6CisgICAgICAgICAgICBleGFtcGxlID0gMipzZWxmLmV4YW1wbGUKKyAgICAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBleGFtcGxlKQorICAgICAgICAgICAgcG9zID0gZXhhbXBsZS5pbmRleCh4KQorICAgICAgICAgICAgZXhhbXBsZTIgPSBleGFtcGxlWzpwb3NdICsgZXhhbXBsZVtwb3MrMTpdCisgICAgICAgICAgICBhLnJlbW92ZSh4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBleGFtcGxlMikpCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5yZW1vdmUsIHNlbGYub3V0c2lkZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLnJlbW92ZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGEucG9wKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCAyKnNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLnBvcCwgNDIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEucG9wLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLnBvcCwgbGVuKGEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhLnBvcCwgLWxlbihhKS0xKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhLnBvcCgwKSwgc2VsZi5leGFtcGxlWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVsxOl0rc2VsZi5leGFtcGxlKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhLnBvcCgxKSwgc2VsZi5leGFtcGxlWzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVsxOjJdK3NlbGYuZXhhbXBsZVszOl0rc2VsZi5leGFtcGxlKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RW50cnlFcXVhbChhLnBvcCgwKSwgc2VsZi5leGFtcGxlWzFdKQorICAgICAgICBzZWxmLmFzc2VydEVudHJ5RXF1YWwoYS5wb3AoKSwgc2VsZi5leGFtcGxlWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGEsCisgICAgICAgICAgICBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGVbMzpdK3NlbGYuZXhhbXBsZVs6LTFdKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEucmV2ZXJzZSwgNDIpCisgICAgICAgIGEucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9leHRlbmQoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5leHRlbmQpCisgICAgICAgIGEuZXh0ZW5kKGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6Oi0xXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlK3NlbGYuZXhhbXBsZVs6Oi0xXSkKKyAgICAgICAgKQorCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGEuZXh0ZW5kKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBhLAorICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlK3NlbGYuZXhhbXBsZSkKKyAgICAgICAgKQorCisgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLmJhZHR5cGVjb2RlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYS5leHRlbmQsIGIpCisKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgYS5leHRlbmQoc2VsZi5leGFtcGxlWzo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgYSwKKyAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZStzZWxmLmV4YW1wbGVbOjotMV0pCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX3dpdGhfaXRlcmFibGVfYXJndW1lbnQoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBpdGVyKHNlbGYuZXhhbXBsZSkpCisgICAgICAgIGIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgICAgICAjIG5vbi1pdGVyYWJsZSBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFycmF5LmFycmF5LCBzZWxmLnR5cGVjb2RlLCAxMCkKKworICAgICAgICAjIHBhc3MgdGhyb3VnaCBlcnJvcnMgcmFpc2VkIGluIF9faXRlcl9fCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgYXJyYXkuYXJyYXksIHNlbGYudHlwZWNvZGUsIEEoKSkKKworICAgICAgICAjIHBhc3MgdGhyb3VnaCBlcnJvcnMgcmFpc2VkIGluIG5leHQoKQorICAgICAgICBkZWYgQigpOgorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yCisgICAgICAgICAgICB5aWVsZCBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgYXJyYXkuYXJyYXksIHNlbGYudHlwZWNvZGUsIEIoKSkKKworICAgIGRlZiB0ZXN0X2NvdmVyaXRlcnRyYXZlcnNlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICBsID0gW2l0ZXIoYSldCisgICAgICAgIGwuYXBwZW5kKGwpCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBiID0gYnVmZmVyKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgYS50b3N0cmluZygpWzBdKQorCisgICAgZGVmIHRlc3Rfd2Vha3JlZihzZWxmKToKKyAgICAgICAgcyA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgcCA9IHByb3h5KHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC50b3N0cmluZygpLCBzLnRvc3RyaW5nKCkpCisgICAgICAgIHMgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBsZW4sIHApCisKKyAgICBkZWYgdGVzdF9idWdfNzgyMzY5KHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0cmVmY291bnQiKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICBiID0gYXJyYXkuYXJyYXkoJ0InLCByYW5nZSg2NCkpCisgICAgICAgICAgICByYyA9IHN5cy5nZXRyZWZjb3VudCgxMCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICBiID0gYXJyYXkuYXJyYXkoJ0InLCByYW5nZSg2NCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCBzeXMuZ2V0cmVmY291bnQoMTApKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3Nfd2l0aF9rd2FyZ3Moc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxNDg2NjYzIC0tIHRoaXMgdXNlZCB0byBlcnJvbmVvdXNseSByYWlzZSBhIFR5cGVFcnJvcgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgJycsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIEFycmF5U3ViY2xhc3NXaXRoS3dhcmdzKCdiJywgbmV3YXJnPTEpCisKKworY2xhc3MgU3RyaW5nVGVzdChCYXNlVGVzdCk6CisKKyAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgorICAgICAgICBzdXBlcihTdHJpbmdUZXN0LCBzZWxmKS50ZXN0X3NldGl0ZW0oKQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuX19zZXRpdGVtX18sIDAsIHNlbGYuZXhhbXBsZVs6Ml0pCisKK2NsYXNzIENoYXJhY3RlclRlc3QoU3RyaW5nVGVzdCk6CisgICAgdHlwZWNvZGUgPSAnYycKKyAgICBleGFtcGxlID0gJ1x4MDFhekFaXHgwMFx4ZmUnCisgICAgc21hbGxlcmV4YW1wbGUgPSAnXHgwMWF6QVlceDAwXHhmZScKKyAgICBiaWdnZXJleGFtcGxlID0gJ1x4MDFhekFaXHgwMFx4ZmYnCisgICAgb3V0c2lkZSA9ICdceDMzJworICAgIG1pbml0ZW1zaXplID0gMQorCisgICAgZGVmIHRlc3Rfc3ViYmNsYXNzaW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBFZGl0YWJsZVN0cmluZyhhcnJheS5hcnJheSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIHMsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LmFycmF5Ll9fbmV3X18oY2xzLCAnYycsIHMpCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzLCBjb2xvcj0nYmx1ZScpOgorICAgICAgICAgICAgICAgIHNlbGYuY29sb3IgPSBjb2xvcgorCisgICAgICAgICAgICBkZWYgc3RyaXAoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZls6XSA9IGFycmF5LmFycmF5KCdjJywgc2VsZi50b3N0cmluZygpLnN0cmlwKCkpCisKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0VkaXRhYmxlU3RyaW5nKCVyKScgJSBzZWxmLnRvc3RyaW5nKCkKKworICAgICAgICBzID0gRWRpdGFibGVTdHJpbmcoIlx0dGVzdFxyXG4iKQorICAgICAgICBzLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRvc3RyaW5nKCksICJ0ZXN0IikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY29sb3IsICJibHVlIikKKyAgICAgICAgcy5jb2xvciA9ICJyZWQiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb2xvciwgInJlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5fX2RpY3RfXy5rZXlzKCksIFsiY29sb3IiXSkKKworICAgIGRlZiB0ZXN0X25vdW5pY29kZShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5mcm9tdW5pY29kZSwgdW5pY29kZSgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEudG91bmljb2RlKQorCit0ZXN0cy5hcHBlbmQoQ2hhcmFjdGVyVGVzdCkKKworaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICBjbGFzcyBVbmljb2RlVGVzdChTdHJpbmdUZXN0KToKKyAgICAgICAgdHlwZWNvZGUgPSAndScKKyAgICAgICAgZXhhbXBsZSA9IHVuaWNvZGUocidceDAxXHUyNjNhXHgwMFx1ZmVmZicsICd1bmljb2RlLWVzY2FwZScpCisgICAgICAgIHNtYWxsZXJleGFtcGxlID0gdW5pY29kZShyJ1x4MDFcdTI2M2FceDAwXHVmZWZlJywgJ3VuaWNvZGUtZXNjYXBlJykKKyAgICAgICAgYmlnZ2VyZXhhbXBsZSA9IHVuaWNvZGUocidceDAxXHUyNjNhXHgwMVx1ZmVmZicsICd1bmljb2RlLWVzY2FwZScpCisgICAgICAgIG91dHNpZGUgPSB1bmljb2RlKCdceDMzJykKKyAgICAgICAgbWluaXRlbXNpemUgPSAyCisKKyAgICAgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXJyYXkuYXJyYXksICdiJywgdW5pY29kZSgnZm9vJywgJ2FzY2lpJykpCisKKyAgICAgICAgICAgIGEgPSBhcnJheS5hcnJheSgndScsIHVuaWNvZGUocidceGEwXHhjMlx1MTIzNCcsICd1bmljb2RlLWVzY2FwZScpKQorICAgICAgICAgICAgYS5mcm9tdW5pY29kZSh1bmljb2RlKCcgJywgJ2FzY2lpJykpCisgICAgICAgICAgICBhLmZyb211bmljb2RlKHVuaWNvZGUoJycsICdhc2NpaScpKQorICAgICAgICAgICAgYS5mcm9tdW5pY29kZSh1bmljb2RlKCcnLCAnYXNjaWknKSkKKyAgICAgICAgICAgIGEuZnJvbXVuaWNvZGUodW5pY29kZShyJ1x4MTFhYmNceGZmXHUxMjM0JywgJ3VuaWNvZGUtZXNjYXBlJykpCisgICAgICAgICAgICBzID0gYS50b3VuaWNvZGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBzLAorICAgICAgICAgICAgICAgIHVuaWNvZGUocidceGEwXHhjMlx1MTIzNCBceDExYWJjXHhmZlx1MTIzNCcsICd1bmljb2RlLWVzY2FwZScpCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgIHMgPSB1bmljb2RlKHInXHgwMD0iXCdhXFxiXHg4MFx4ZmZcdTAwMDBcdTAwMDFcdTEyMzQnLCAndW5pY29kZS1lc2NhcGUnKQorICAgICAgICAgICAgYSA9IGFycmF5LmFycmF5KCd1JywgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgcmVwcihhKSwKKyAgICAgICAgICAgICAgICByIiIiYXJyYXkoJ3UnLCB1J1x4MDA9IlwnYVxcYlx4ODBceGZmXHgwMFx4MDFcdTEyMzQnKSIiIgorICAgICAgICAgICAgKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGEuZnJvbXVuaWNvZGUpCisKKyAgICB0ZXN0cy5hcHBlbmQoVW5pY29kZVRlc3QpCisKK2NsYXNzIE51bWJlclRlc3QoQmFzZVRlc3QpOgorCisgICAgZGVmIHRlc3RfZXh0c2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6XSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6Ml0sIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFswLDIsNF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTo6Ml0sIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFsxLDNdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6LTFdLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbNCwzLDIsMSwwXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6Oi0yXSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzQsMiwwXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszOjotMl0sIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFszLDFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDA6MTAwOl0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDA6LTEwMDotMV0sIGFbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwTDoxMDBMOjJMXSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzAsMiw0XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDAwOjIwMDA6Ml0sIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDAwOi0yMDAwOi0yXSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgW10pKQorCisgICAgZGVmIHRlc3RfZGVsc2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSg1KSkKKyAgICAgICAgZGVsIGFbOjoyXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFsxLDNdKSkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHJhbmdlKDUpKQorICAgICAgICBkZWwgYVsxOjoyXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFswLDIsNF0pKQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgcmFuZ2UoNSkpCisgICAgICAgIGRlbCBhWzE6Oi0yXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFswLDIsMyw0XSkpCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSgxMCkpCisgICAgICAgIGRlbCBhWzo6MTAwMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbMSwyLDMsNCw1LDYsNyw4LDldKSkKKyAgICAgICAgIyB0ZXN0IGlzc3VlNzc4OAorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgcmFuZ2UoMTApKQorICAgICAgICBkZWwgYVs5OjoxPDwzMzNdCisKKyAgICBkZWYgdGVzdF9hc3NpZ25tZW50KHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgcmFuZ2UoMTApKQorICAgICAgICBhWzo6Ml0gPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbNDJdKjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzQyLCAxLCA0MiwgMywgNDIsIDUsIDQyLCA3LCA0MiwgOV0pKQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgcmFuZ2UoMTApKQorICAgICAgICBhWzo6LTRdID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzEwXSozKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIFswLCAxMCwgMiwgMywgNCwgMTAsIDYsIDcsIDggLDEwXSkpCisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSg0KSkKKyAgICAgICAgYVs6Oi0xXSA9IGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBbMywgMiwgMSwgMF0pKQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgcmFuZ2UoMTApKQorICAgICAgICBiID0gYVs6XQorICAgICAgICBjID0gYVs6XQorICAgICAgICBpbnMgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSgyKSkKKyAgICAgICAgYVsyOjNdID0gaW5zCisgICAgICAgIGJbc2xpY2UoMiwzKV0gPSBpbnMKKyAgICAgICAgY1syOjM6XSA9IGlucworCisgICAgZGVmIHRlc3RfaXRlcmF0aW9uY29udGFpbnMoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCByYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhKSwgcmFuZ2UoMTApKQorICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgWzIwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xXSBpbiBhLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0gbm90IGluIGEsIFRydWUpCisKKyAgICBkZWYgY2hlY2tfb3ZlcmZsb3coc2VsZiwgbG93ZXIsIHVwcGVyKToKKyAgICAgICAgIyBtZXRob2QgdG8gYmUgdXNlZCBieSBzdWJjbGFzc2VzCisKKyAgICAgICAgIyBzaG91bGQgbm90IG92ZXJmbG93IGFzc2lnbmluZyBsb3dlciBsaW1pdAorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgW2xvd2VyXSkKKyAgICAgICAgYVswXSA9IGxvd2VyCisgICAgICAgICMgc2hvdWxkIG92ZXJmbG93IGFzc2lnbmluZyBsZXNzIHRoYW4gbG93ZXIgbGltaXQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgYXJyYXkuYXJyYXksIHNlbGYudHlwZWNvZGUsIFtsb3dlci0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgYS5fX3NldGl0ZW1fXywgMCwgbG93ZXItMSkKKyAgICAgICAgIyBzaG91bGQgbm90IG92ZXJmbG93IGFzc2lnbmluZyB1cHBlciBsaW1pdAorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgW3VwcGVyXSkKKyAgICAgICAgYVswXSA9IHVwcGVyCisgICAgICAgICMgc2hvdWxkIG92ZXJmbG93IGFzc2lnbmluZyBtb3JlIHRoYW4gdXBwZXIgbGltaXQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgYXJyYXkuYXJyYXksIHNlbGYudHlwZWNvZGUsIFt1cHBlcisxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgYS5fX3NldGl0ZW1fXywgMCwgdXBwZXIrMSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICB0eXBlY29kZSA9IHNlbGYudHlwZWNvZGUKKyAgICAgICAgY2xhc3MgRXhhZ2dlcmF0aW5nQXJyYXkoYXJyYXkuYXJyYXkpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydvZmZzZXQnXQorCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIHR5cGVjb2RlLCBkYXRhLCBvZmZzZXQpOgorICAgICAgICAgICAgICAgIHJldHVybiBhcnJheS5hcnJheS5fX25ld19fKGNscywgdHlwZWNvZGUsIGRhdGEpCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlY29kZSwgZGF0YSwgb2Zmc2V0KToKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCA9IG9mZnNldAorCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5LmFycmF5Ll9fZ2V0aXRlbV9fKHNlbGYsIGkpICsgc2VsZi5vZmZzZXQKKworICAgICAgICBhID0gRXhhZ2dlcmF0aW5nQXJyYXkoc2VsZi50eXBlY29kZSwgWzMsIDYsIDcsIDExXSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFbnRyeUVxdWFsKGFbMF0sIDcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIGEsICJjb2xvciIsICJibHVlIikKKworY2xhc3MgU2lnbmVkTnVtYmVyVGVzdChOdW1iZXJUZXN0KToKKyAgICBleGFtcGxlID0gWy0xLCAwLCAxLCA0MiwgMHg3Zl0KKyAgICBzbWFsbGVyZXhhbXBsZSA9IFstMSwgMCwgMSwgNDIsIDB4N2VdCisgICAgYmlnZ2VyZXhhbXBsZSA9IFstMSwgMCwgMSwgNDMsIDB4N2ZdCisgICAgb3V0c2lkZSA9IDIzCisKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUpCisgICAgICAgIGxvd2VyID0gLTEgKiBsb25nKHBvdygyLCBhLml0ZW1zaXplICogOCAtIDEpKQorICAgICAgICB1cHBlciA9IGxvbmcocG93KDIsIGEuaXRlbXNpemUgKiA4IC0gMSkpIC0gMUwKKyAgICAgICAgc2VsZi5jaGVja19vdmVyZmxvdyhsb3dlciwgdXBwZXIpCisKK2NsYXNzIFVuc2lnbmVkTnVtYmVyVGVzdChOdW1iZXJUZXN0KToKKyAgICBleGFtcGxlID0gWzAsIDEsIDE3LCAyMywgNDIsIDB4ZmZdCisgICAgc21hbGxlcmV4YW1wbGUgPSBbMCwgMSwgMTcsIDIzLCA0MiwgMHhmZV0KKyAgICBiaWdnZXJleGFtcGxlID0gWzAsIDEsIDE3LCAyMywgNDMsIDB4ZmZdCisgICAgb3V0c2lkZSA9IDB4YWEKKworICAgIGRlZiB0ZXN0X292ZXJmbG93KHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKKyAgICAgICAgbG93ZXIgPSAwCisgICAgICAgIHVwcGVyID0gbG9uZyhwb3coMiwgYS5pdGVtc2l6ZSAqIDgpKSAtIDFMCisgICAgICAgIHNlbGYuY2hlY2tfb3ZlcmZsb3cobG93ZXIsIHVwcGVyKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaXplb2Zfd2l0aF9idWZmZXIoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpCisgICAgICAgIGJhc2VzaXplID0gdGVzdF9zdXBwb3J0LmNhbGN2b2Jqc2l6ZSgnNFAnKQorICAgICAgICBidWZmZXJfc2l6ZSA9IGEuYnVmZmVyX2luZm8oKVsxXSAqIGEuaXRlbXNpemUKKyAgICAgICAgdGVzdF9zdXBwb3J0LmNoZWNrX3NpemVvZihzZWxmLCBhLCBiYXNlc2l6ZSArIGJ1ZmZlcl9zaXplKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9zaXplb2Zfd2l0aG91dF9idWZmZXIoc2VsZik6CisgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKQorICAgICAgICBiYXNlc2l6ZSA9IHRlc3Rfc3VwcG9ydC5jYWxjdm9ianNpemUoJzRQJykKKyAgICAgICAgdGVzdF9zdXBwb3J0LmNoZWNrX3NpemVvZihzZWxmLCBhLCBiYXNlc2l6ZSkKKworCitjbGFzcyBCeXRlVGVzdChTaWduZWROdW1iZXJUZXN0KToKKyAgICB0eXBlY29kZSA9ICdiJworICAgIG1pbml0ZW1zaXplID0gMQordGVzdHMuYXBwZW5kKEJ5dGVUZXN0KQorCitjbGFzcyBVbnNpZ25lZEJ5dGVUZXN0KFVuc2lnbmVkTnVtYmVyVGVzdCk6CisgICAgdHlwZWNvZGUgPSAnQicKKyAgICBtaW5pdGVtc2l6ZSA9IDEKK3Rlc3RzLmFwcGVuZChVbnNpZ25lZEJ5dGVUZXN0KQorCitjbGFzcyBTaG9ydFRlc3QoU2lnbmVkTnVtYmVyVGVzdCk6CisgICAgdHlwZWNvZGUgPSAnaCcKKyAgICBtaW5pdGVtc2l6ZSA9IDIKK3Rlc3RzLmFwcGVuZChTaG9ydFRlc3QpCisKK2NsYXNzIFVuc2lnbmVkU2hvcnRUZXN0KFVuc2lnbmVkTnVtYmVyVGVzdCk6CisgICAgdHlwZWNvZGUgPSAnSCcKKyAgICBtaW5pdGVtc2l6ZSA9IDIKK3Rlc3RzLmFwcGVuZChVbnNpZ25lZFNob3J0VGVzdCkKKworY2xhc3MgSW50VGVzdChTaWduZWROdW1iZXJUZXN0KToKKyAgICB0eXBlY29kZSA9ICdpJworICAgIG1pbml0ZW1zaXplID0gMgordGVzdHMuYXBwZW5kKEludFRlc3QpCisKK2NsYXNzIFVuc2lnbmVkSW50VGVzdChVbnNpZ25lZE51bWJlclRlc3QpOgorICAgIHR5cGVjb2RlID0gJ0knCisgICAgbWluaXRlbXNpemUgPSAyCit0ZXN0cy5hcHBlbmQoVW5zaWduZWRJbnRUZXN0KQorCitjbGFzcyBMb25nVGVzdChTaWduZWROdW1iZXJUZXN0KToKKyAgICB0eXBlY29kZSA9ICdsJworICAgIG1pbml0ZW1zaXplID0gNAordGVzdHMuYXBwZW5kKExvbmdUZXN0KQorCitjbGFzcyBVbnNpZ25lZExvbmdUZXN0KFVuc2lnbmVkTnVtYmVyVGVzdCk6CisgICAgdHlwZWNvZGUgPSAnTCcKKyAgICBtaW5pdGVtc2l6ZSA9IDQKK3Rlc3RzLmFwcGVuZChVbnNpZ25lZExvbmdUZXN0KQorCitjbGFzcyBGUFRlc3QoTnVtYmVyVGVzdCk6CisgICAgZXhhbXBsZSA9IFstNDIuMCwgMCwgNDIsIDFlNSwgLTFlMTBdCisgICAgc21hbGxlcmV4YW1wbGUgPSBbLTQyLjAsIDAsIDQyLCAxZTUsIC0yZTEwXQorICAgIGJpZ2dlcmV4YW1wbGUgPSBbLTQyLjAsIDAsIDQyLCAxZTUsIDFlMTBdCisgICAgb3V0c2lkZSA9IDIzCisKKyAgICBkZWYgYXNzZXJ0RW50cnlFcXVhbChzZWxmLCBlbnRyeTEsIGVudHJ5Mik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZW50cnkxLCBlbnRyeTIpCisKKyAgICBkZWYgdGVzdF9ieXRlc3dhcChzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmJ5dGVzd2FwLCA0MikKKyAgICAgICAgaWYgYS5pdGVtc2l6ZSBpbiAoMSwgMiwgNCwgOCk6CisgICAgICAgICAgICBiID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlKQorICAgICAgICAgICAgYi5ieXRlc3dhcCgpCisgICAgICAgICAgICBpZiBhLml0ZW1zaXplPT0xOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBPbiBhbHBoYXMgdHJlYXRpbmcgdGhlIGJ5dGUgc3dhcHBlZCBiaXQgcGF0dGVycyBhcworICAgICAgICAgICAgICAgICMgZmxvYXRzL2RvdWJsZXMgcmVzdWx0cyBpbiBmbG9hdGluZyBwb2ludCBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgIyA9PiBjb21wYXJlIHRoZSA4Yml0IHN0cmluZyB2YWx1ZXMgaW5zdGVhZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYS50b3N0cmluZygpLCBiLnRvc3RyaW5nKCkpCisgICAgICAgICAgICBiLmJ5dGVzd2FwKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworY2xhc3MgRmxvYXRUZXN0KEZQVGVzdCk6CisgICAgdHlwZWNvZGUgPSAnZicKKyAgICBtaW5pdGVtc2l6ZSA9IDQKK3Rlc3RzLmFwcGVuZChGbG9hdFRlc3QpCisKK2NsYXNzIERvdWJsZVRlc3QoRlBUZXN0KToKKyAgICB0eXBlY29kZSA9ICdkJworICAgIG1pbml0ZW1zaXplID0gOAorCisgICAgZGVmIHRlc3RfYWxsb2Nfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIGZyb20gc3lzIGltcG9ydCBtYXhzaXplCisgICAgICAgIGEgPSBhcnJheS5hcnJheSgnZCcsIFstMV0qNjU1MzYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGEgKj0gbWF4c2l6ZS8vNjU1MzYgKyAxCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQXJyYXkgb2Ygc2l6ZSA+IG1heHNpemUgY3JlYXRlZCAtIE1lbW9yeUVycm9yIGV4cGVjdGVkIikKKyAgICAgICAgYiA9IGFycmF5LmFycmF5KCdkJywgWyAyLjcxODI4MTgzLCAzLjE0MTU5MjY1LCAtMV0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGIgKiAobWF4c2l6ZS8vMyArIDEpCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQXJyYXkgb2Ygc2l6ZSA+IG1heHNpemUgY3JlYXRlZCAtIE1lbW9yeUVycm9yIGV4cGVjdGVkIikKKwordGVzdHMuYXBwZW5kKERvdWJsZVRlc3QpCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBpbXBvcnQgc3lzCisKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FycmF5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FycmF5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM1MjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FycmF5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FycmF5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDM1MjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXJyYXkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzY2lpX2Zvcm1hdGQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc2NpaV9mb3JtYXRkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTYxNmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc2NpaV9mb3JtYXRkLnB5CkBAIC0wLDAgKzEsNTggQEAKKyMgUHlPU19hc2NpaV9mb3JtYXRkIGlzIGRlcHJlY2F0ZWQgYW5kIG5vdCBjYWxsZWQgZnJvbSBhbnl3aGVyZSBpbgorIyAgUHl0aG9uIGl0c2VsZi4gU28gdGhpcyBtb2R1bGUgaXMgdGhlIG9ubHkgcGxhY2UgaXQgZ2V0cyB0ZXN0ZWQuCisjIFRlc3QgdGhhdCBpdCB3b3JrcywgYW5kIHRlc3QgdGhhdCBpdCdzIGRlcHJlY2F0ZWQuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2hlY2tfd2FybmluZ3MsIHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorCisjIFNraXAgdGVzdHMgaWYgX2N0eXBlcyBtb2R1bGUgZG9lcyBub3QgZXhpc3QKK2ltcG9ydF9tb2R1bGUoJ19jdHlwZXMnKQorCitmcm9tIGN0eXBlcyBpbXBvcnQgcHl0aG9uYXBpLCBjcmVhdGVfc3RyaW5nX2J1ZmZlciwgc2l6ZW9mLCBieXJlZiwgY19kb3VibGUKK1B5T1NfYXNjaWlfZm9ybWF0ZCA9IHB5dGhvbmFwaS5QeU9TX2FzY2lpX2Zvcm1hdGQKKworCitjbGFzcyBGb3JtYXREZXByZWNhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9kZXByZWNhdGlvbihzZWxmKToKKyAgICAgICAgYnVmID0gY3JlYXRlX3N0cmluZ19idWZmZXIoJyAnICogMTAwKQorCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCdQeU9TX2FzY2lpX2Zvcm1hdGQgaXMgZGVwcmVjYXRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgUHlPU19hc2NpaV9mb3JtYXRkKGJ5cmVmKGJ1ZiksIHNpemVvZihidWYpLCAnJSsuMTBmJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX2RvdWJsZSgxMC4wKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAnKzEwLjAwMDAwMDAwMDAnKQorCisKK2NsYXNzIEZvcm1hdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIGVuc3VyZSB0aGF0LCBmb3IgdGhlIHJlc3RyaWN0ZWQgc2V0IG9mIGZvcm1hdCBjb2RlcywKKyAgICAjICUtZm9ybWF0dGluZyByZXR1cm5zIHRoZSBzYW1lIHZhbHVlcyBvcyBQeU9TX2FzY2lpX2Zvcm1hdGQKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIGJ1ZiA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCcgJyAqIDEwMCkKKworICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICAgICgnJWYnLCAxMDAuMCksCisgICAgICAgICAgICAoJyVnJywgMTAwLjApLAorICAgICAgICAgICAgKCclI2cnLCAxMDAuMCksCisgICAgICAgICAgICAoJyUjLjJnJywgMTAwLjApLAorICAgICAgICAgICAgKCclIy4yZycsIDEyMy40NTY3KSwKKyAgICAgICAgICAgICgnJSMuMmcnLCAxLjIzNDU2N2UyMDApLAorICAgICAgICAgICAgKCclZScsIDEuMjM0NTY3ZTIwMCksCisgICAgICAgICAgICAoJyVlJywgMS4yMzQpLAorICAgICAgICAgICAgKCclK2UnLCAxLjIzNCksCisgICAgICAgICAgICAoJyUtZScsIDEuMjM0KSwKKyAgICAgICAgICAgIF0KKworICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnUHlPU19hc2NpaV9mb3JtYXRkIGlzIGRlcHJlY2F0ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIGZvciBmb3JtYXQsIHZhbCBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICBQeU9TX2FzY2lpX2Zvcm1hdGQoYnlyZWYoYnVmKSwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19kb3VibGUodmFsKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgZm9ybWF0ICUgdmFsKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoRm9ybWF0RGVwcmVjYXRpb25UZXN0cywgRm9ybWF0VGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzY2lpX2Zvcm1hdGQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXNjaWlfZm9ybWF0ZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwMDQwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzY2lpX2Zvcm1hdGQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzY2lpX2Zvcm1hdGQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXNjaWlfZm9ybWF0ZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwMDQwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzY2lpX2Zvcm1hdGQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjgwMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN0LnB5CkBAIC0wLDAgKzEsNTgwIEBACitpbXBvcnQgc3lzLCBpdGVydG9vbHMsIHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IGFzdAorCitkZWYgdG9fdHVwbGUodCk6CisgICAgaWYgdCBpcyBOb25lIG9yIGlzaW5zdGFuY2UodCwgKGJhc2VzdHJpbmcsIGludCwgbG9uZywgY29tcGxleCkpOgorICAgICAgICByZXR1cm4gdAorICAgIGVsaWYgaXNpbnN0YW5jZSh0LCBsaXN0KToKKyAgICAgICAgcmV0dXJuIFt0b190dXBsZShlKSBmb3IgZSBpbiB0XQorICAgIHJlc3VsdCA9IFt0Ll9fY2xhc3NfXy5fX25hbWVfX10KKyAgICBpZiBoYXNhdHRyKHQsICdsaW5lbm8nKSBhbmQgaGFzYXR0cih0LCAnY29sX29mZnNldCcpOgorICAgICAgICByZXN1bHQuYXBwZW5kKCh0LmxpbmVubywgdC5jb2xfb2Zmc2V0KSkKKyAgICBpZiB0Ll9maWVsZHMgaXMgTm9uZToKKyAgICAgICAgcmV0dXJuIHR1cGxlKHJlc3VsdCkKKyAgICBmb3IgZiBpbiB0Ll9maWVsZHM6CisgICAgICAgIHJlc3VsdC5hcHBlbmQodG9fdHVwbGUoZ2V0YXR0cih0LCBmKSkpCisgICAgcmV0dXJuIHR1cGxlKHJlc3VsdCkKKworCisjIFRoZXNlIHRlc3RzIGFyZSBjb21waWxlZCB0aHJvdWdoICJleGVjIgorIyBUaGVyZSBzaG91bGQgYmUgYXRsZWFzdCBvbmUgdGVzdCBwZXIgc3RhdGVtZW50CitleGVjX3Rlc3RzID0gWworICAgICMgTm9uZQorICAgICJOb25lIiwKKyAgICAjIEZ1bmN0aW9uRGVmCisgICAgImRlZiBmKCk6IHBhc3MiLAorICAgICMgRnVuY3Rpb25EZWYgd2l0aCBhcmcKKyAgICAiZGVmIGYoYSk6IHBhc3MiLAorICAgICMgRnVuY3Rpb25EZWYgd2l0aCBhcmcgYW5kIGRlZmF1bHQgdmFsdWUKKyAgICAiZGVmIGYoYT0wKTogcGFzcyIsCisgICAgIyBGdW5jdGlvbkRlZiB3aXRoIHZhcmFyZ3MKKyAgICAiZGVmIGYoKmFyZ3MpOiBwYXNzIiwKKyAgICAjIEZ1bmN0aW9uRGVmIHdpdGgga3dhcmdzCisgICAgImRlZiBmKCoqa3dhcmdzKTogcGFzcyIsCisgICAgIyBGdW5jdGlvbkRlZiB3aXRoIGFsbCBraW5kIG9mIGFyZ3MKKyAgICAiZGVmIGYoYSwgYj0xLCBjPU5vbmUsIGQ9W10sIGU9e30sICphcmdzLCAqKmt3YXJncyk6IHBhc3MiLAorICAgICMgQ2xhc3NEZWYKKyAgICAiY2xhc3MgQzpwYXNzIiwKKyAgICAjIENsYXNzRGVmLCBuZXcgc3R5bGUgY2xhc3MKKyAgICAiY2xhc3MgQyhvYmplY3QpOiBwYXNzIiwKKyAgICAjIFJldHVybgorICAgICJkZWYgZigpOnJldHVybiAxIiwKKyAgICAjIERlbGV0ZQorICAgICJkZWwgdiIsCisgICAgIyBBc3NpZ24KKyAgICAidiA9IDEiLAorICAgICMgQXVnQXNzaWduCisgICAgInYgKz0gMSIsCisgICAgIyBQcmludAorICAgICJwcmludCA+PmYsIDEsICIsCisgICAgIyBGb3IKKyAgICAiZm9yIHYgaW4gdjpwYXNzIiwKKyAgICAjIFdoaWxlCisgICAgIndoaWxlIHY6cGFzcyIsCisgICAgIyBJZgorICAgICJpZiB2OnBhc3MiLAorICAgICMgUmFpc2UKKyAgICAicmFpc2UgRXhjZXB0aW9uLCAnc3RyaW5nJyIsCisgICAgIyBUcnlFeGNlcHQKKyAgICAidHJ5OlxuICBwYXNzXG5leGNlcHQgRXhjZXB0aW9uOlxuICBwYXNzIiwKKyAgICAjIFRyeUZpbmFsbHkKKyAgICAidHJ5OlxuICBwYXNzXG5maW5hbGx5OlxuICBwYXNzIiwKKyAgICAjIEFzc2VydAorICAgICJhc3NlcnQgdiIsCisgICAgIyBJbXBvcnQKKyAgICAiaW1wb3J0IHN5cyIsCisgICAgIyBJbXBvcnRGcm9tCisgICAgImZyb20gc3lzIGltcG9ydCB2IiwKKyAgICAjIEV4ZWMKKyAgICAiZXhlYyAndiciLAorICAgICMgR2xvYmFsCisgICAgImdsb2JhbCB2IiwKKyAgICAjIEV4cHIKKyAgICAiMSIsCisgICAgIyBQYXNzLAorICAgICJwYXNzIiwKKyAgICAjIEJyZWFrCisgICAgImJyZWFrIiwKKyAgICAjIENvbnRpbnVlCisgICAgImNvbnRpbnVlIiwKKyAgICAjIGZvciBzdGF0ZW1lbnRzIHdpdGggbmFrZWQgdHVwbGVzIChzZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTY3MDQpCisgICAgImZvciBhLGIgaW4gYzogcGFzcyIsCisgICAgIlsoYSxiKSBmb3IgYSxiIGluIGNdIiwKKyAgICAiKChhLGIpIGZvciBhLGIgaW4gYykiLAorICAgICIoKGEsYikgZm9yIChhLGIpIGluIGMpIiwKKyAgICAjIE11bHRpbGluZSBnZW5lcmF0b3IgZXhwcmVzc2lvbiAodGVzdCBmb3IgLmxpbmVubyAmIC5jb2xfb2Zmc2V0KQorICAgICIiIigKKyAgICAoCisgICAgQWEKKyAgICAsCisgICAgICAgQmIKKyAgICApCisgICAgZm9yCisgICAgQWEKKyAgICAsCisgICAgQmIgaW4gQ2MKKyAgICApIiIiLAorICAgICMgZGljdGNvbXAKKyAgICAie2EgOiBiIGZvciB3IGluIHggZm9yIG0gaW4gcCBpZiBnfSIsCisgICAgIyBkaWN0Y29tcCB3aXRoIG5ha2VkIHR1cGxlCisgICAgInthIDogYiBmb3Igdix3IGluIHh9IiwKKyAgICAjIHNldGNvbXAKKyAgICAie3IgZm9yIGwgaW4geCBpZiBnfSIsCisgICAgIyBzZXRjb21wIHdpdGggbmFrZWQgdHVwbGUKKyAgICAie3IgZm9yIGwsbSBpbiB4fSIsCitdCisKKyMgVGhlc2UgYXJlIGNvbXBpbGVkIHRocm91Z2ggInNpbmdsZSIKKyMgYmVjYXVzZSBvZiBvdmVybGFwIHdpdGggImV2YWwiLCBpdCBqdXN0IHRlc3RzIHdoYXQKKyMgY2FuJ3QgYmUgdGVzdGVkIHdpdGggImV2YWwiCitzaW5nbGVfdGVzdHMgPSBbCisgICAgIjErMiIKK10KKworIyBUaGVzZSBhcmUgY29tcGlsZWQgdGhyb3VnaCAiZXZhbCIKKyMgSXQgc2hvdWxkIHRlc3QgYWxsIGV4cHJlc3Npb25zCitldmFsX3Rlc3RzID0gWworICAjIE5vbmUKKyAgIk5vbmUiLAorICAjIEJvb2xPcAorICAiYSBhbmQgYiIsCisgICMgQmluT3AKKyAgImEgKyBiIiwKKyAgIyBVbmFyeU9wCisgICJub3QgdiIsCisgICMgTGFtYmRhCisgICJsYW1iZGE6Tm9uZSIsCisgICMgRGljdAorICAieyAxOjIgfSIsCisgICMgRW1wdHkgZGljdAorICAie30iLAorICAjIFNldAorICAie05vbmUsfSIsCisgICMgTXVsdGlsaW5lIGRpY3QgKHRlc3QgZm9yIC5saW5lbm8gJiAuY29sX29mZnNldCkKKyAgIiIieworICAgICAgMQorICAgICAgICA6CisgICAgICAgICAgMgorICAgICB9IiIiLAorICAjIExpc3RDb21wCisgICJbYSBmb3IgYiBpbiBjIGlmIGRdIiwKKyAgIyBHZW5lcmF0b3JFeHAKKyAgIihhIGZvciBiIGluIGMgaWYgZCkiLAorICAjIFlpZWxkIC0geWllbGQgZXhwcmVzc2lvbnMgY2FuJ3Qgd29yayBvdXRzaWRlIGEgZnVuY3Rpb24KKyAgIworICAjIENvbXBhcmUKKyAgIjEgPCAyIDwgMyIsCisgICMgQ2FsbAorICAiZigxLDIsYz0zLCpkLCoqZSkiLAorICAjIFJlcHIKKyAgImB2YCIsCisgICMgTnVtCisgICIxMEwiLAorICAjIFN0cgorICAiJ3N0cmluZyciLAorICAjIEF0dHJpYnV0ZQorICAiYS5iIiwKKyAgIyBTdWJzY3JpcHQKKyAgImFbYjpjXSIsCisgICMgTmFtZQorICAidiIsCisgICMgTGlzdAorICAiWzEsMiwzXSIsCisgICMgRW1wdHkgbGlzdAorICAiW10iLAorICAjIFR1cGxlCisgICIxLDIsMyIsCisgICMgVHVwbGUKKyAgIigxLDIsMykiLAorICAjIEVtcHR5IHR1cGxlCisgICIoKSIsCisgICMgQ29tYmluYXRpb24KKyAgImEuYi5jLmQoYS5iWzE6Ml0pIiwKKworXQorCisjIFRPRE86IGV4cHJfY29udGV4dCwgc2xpY2UsIGJvb2xvcCwgb3BlcmF0b3IsIHVuYXJ5b3AsIGNtcG9wLCBjb21wcmVoZW5zaW9uCisjIGV4Y2VwdGhhbmRsZXIsIGFyZ3VtZW50cywga2V5d29yZHMsIGFsaWFzCisKK2NsYXNzIEFTVF9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2Fzc2VydFRydWVvcmRlcihzZWxmLCBhc3Rfbm9kZSwgcGFyZW50X3Bvcyk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGFzdF9ub2RlLCBhc3QuQVNUKSBvciBhc3Rfbm9kZS5fZmllbGRzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgaXNpbnN0YW5jZShhc3Rfbm9kZSwgKGFzdC5leHByLCBhc3Quc3RtdCwgYXN0LmV4Y2VwdGhhbmRsZXIpKToKKyAgICAgICAgICAgIG5vZGVfcG9zID0gKGFzdF9ub2RlLmxpbmVubywgYXN0X25vZGUuY29sX29mZnNldCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlX3BvcyA+PSBwYXJlbnRfcG9zKQorICAgICAgICAgICAgcGFyZW50X3BvcyA9IChhc3Rfbm9kZS5saW5lbm8sIGFzdF9ub2RlLmNvbF9vZmZzZXQpCisgICAgICAgIGZvciBuYW1lIGluIGFzdF9ub2RlLl9maWVsZHM6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoYXN0X25vZGUsIG5hbWUpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKKyAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydFRydWVvcmRlcihjaGlsZCwgcGFyZW50X3BvcykKKyAgICAgICAgICAgIGVsaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKHZhbHVlLCBwYXJlbnRfcG9zKQorCisgICAgZGVmIHRlc3RfQVNUX29iamVjdHMoc2VsZik6CisgICAgICAgIHggPSBhc3QuQVNUKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9maWVsZHMsICgpKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgeC52YXJhcmcKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIHguZm9vYmFyID0gMjEKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGFzdC5BU1QobGluZW5vPTIpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgIyAiX2FzdC5BU1QgY29uc3RydWN0b3IgdGFrZXMgMCBwb3NpdGlvbmFsIGFyZ3VtZW50cyIKKyAgICAgICAgICAgIGFzdC5BU1QoMikKKworICAgIGRlZiB0ZXN0X3NuaXBwZXRzKHNlbGYpOgorICAgICAgICBmb3IgaW5wdXQsIG91dHB1dCwga2luZCBpbiAoKGV4ZWNfdGVzdHMsIGV4ZWNfcmVzdWx0cywgImV4ZWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaW5nbGVfdGVzdHMsIHNpbmdsZV9yZXN1bHRzLCAic2luZ2xlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgZXZhbF9yZXN1bHRzLCAiZXZhbCIpKToKKyAgICAgICAgICAgIGZvciBpLCBvIGluIGl0ZXJ0b29scy5pemlwKGlucHV0LCBvdXRwdXQpOgorICAgICAgICAgICAgICAgIGFzdF90cmVlID0gY29tcGlsZShpLCAiPyIsIGtpbmQsIGFzdC5QeUNGX09OTFlfQVNUKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9fdHVwbGUoYXN0X3RyZWUpLCBvKQorICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydFRydWVvcmRlcihhc3RfdHJlZSwgKDAsIDApKQorCisgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CisgICAgICAgIHNsYyA9IGFzdC5wYXJzZSgieFs6Ol0iKS5ib2R5WzBdLnZhbHVlLnNsaWNlCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNsYy51cHBlcikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoc2xjLmxvd2VyKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2xjLnN0ZXAsIGFzdC5OYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsYy5zdGVwLmlkLCAiTm9uZSIpCisKKyAgICBkZWYgdGVzdF9mcm9tX2ltcG9ydChzZWxmKToKKyAgICAgICAgaW0gPSBhc3QucGFyc2UoImZyb20gLiBpbXBvcnQgeSIpLmJvZHlbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoaW0ubW9kdWxlKQorCisgICAgZGVmIHRlc3Rfbm9uX2ludGVybmVkX2Z1dHVyZV9mcm9tX2FzdChzZWxmKToKKyAgICAgICAgbW9kID0gYXN0LnBhcnNlKCJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1vZC5ib2R5WzBdLCBhc3QuSW1wb3J0RnJvbSkKKyAgICAgICAgbW9kLmJvZHlbMF0ubW9kdWxlID0gIiBfX2Z1dHVyZV9fICIuc3RyaXAoKQorICAgICAgICBjb21waWxlKG1vZCwgIjx0ZXN0PiIsICJleGVjIikKKworICAgIGRlZiB0ZXN0X2Jhc2VfY2xhc3NlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYXN0LkZvciwgYXN0LnN0bXQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhhc3QuTmFtZSwgYXN0LmV4cHIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhhc3Quc3RtdCwgYXN0LkFTVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGFzdC5leHByLCBhc3QuQVNUKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYXN0LmNvbXByZWhlbnNpb24sIGFzdC5BU1QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhhc3QuR3QsIGFzdC5BU1QpKQorCisgICAgZGVmIHRlc3RfZmllbGRfYXR0cl9leGlzdGVuY2Uoc2VsZik6CisgICAgICAgIGZvciBuYW1lLCBpdGVtIGluIGFzdC5fX2RpY3RfXy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgdHlwZSkgYW5kIG5hbWUgIT0gJ0FTVCcgYW5kIG5hbWVbMF0uaXN1cHBlcigpOgorICAgICAgICAgICAgICAgIHggPSBpdGVtKCkKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHgsIGFzdC5BU1QpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeC5fZmllbGRzKSwgdHVwbGUpCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIHggPSBhc3QuYXJndW1lbnRzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9maWVsZHMsICgnYXJncycsICd2YXJhcmcnLCAna3dhcmcnLCAnZGVmYXVsdHMnKSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIHgudmFyYXJnCisKKyAgICAgICAgeCA9IGFzdC5hcmd1bWVudHMoMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhcmFyZywgMikKKworICAgIGRlZiB0ZXN0X2ZpZWxkX2F0dHJfd3JpdGFibGUoc2VsZik6CisgICAgICAgIHggPSBhc3QuTnVtKCkKKyAgICAgICAgIyBXZSBjYW4gYXNzaWduIHRvIF9maWVsZHMKKyAgICAgICAgeC5fZmllbGRzID0gNjY2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fZmllbGRzLCA2NjYpCisKKyAgICBkZWYgdGVzdF9jbGFzc2F0dHJzKHNlbGYpOgorICAgICAgICB4ID0gYXN0Lk51bSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fZmllbGRzLCAoJ24nLCkpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICB4Lm4KKworICAgICAgICB4ID0gYXN0Lk51bSg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm4sIDQyKQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgeC5saW5lbm8KKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIHguZm9vYmFyCisKKyAgICAgICAgeCA9IGFzdC5OdW0obGluZW5vPTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5saW5lbm8sIDIpCisKKyAgICAgICAgeCA9IGFzdC5OdW0oNDIsIGxpbmVubz0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubGluZW5vLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX2ZpZWxkcywgKCduJywpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubiwgNDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhc3QuTnVtLCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFzdC5OdW0sIDEsIDIsIGxpbmVubz0wKQorCisgICAgZGVmIHRlc3RfbW9kdWxlKHNlbGYpOgorICAgICAgICBib2R5ID0gW2FzdC5OdW0oNDIpXQorICAgICAgICB4ID0gYXN0Lk1vZHVsZShib2R5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYm9keSwgYm9keSkKKworICAgIGRlZiB0ZXN0X25vZGVjbGFzc2VzKHNlbGYpOgorICAgICAgICAjIFplcm8gYXJndW1lbnRzIGNvbnN0cnVjdG9yIGV4cGxpY2l0ZWx5IGFsbG93ZWQKKyAgICAgICAgeCA9IGFzdC5CaW5PcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fZmllbGRzLCAoJ2xlZnQnLCAnb3AnLCAncmlnaHQnKSkKKworICAgICAgICAjIFJhbmRvbSBhdHRyaWJ1dGUgYWxsb3dlZCB0b28KKyAgICAgICAgeC5mb29iYXJiYXogPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb29iYXJiYXosIDUpCisKKyAgICAgICAgbjEgPSBhc3QuTnVtKDEpCisgICAgICAgIG4zID0gYXN0Lk51bSgzKQorICAgICAgICBhZGRvcCA9IGFzdC5BZGQoKQorICAgICAgICB4ID0gYXN0LkJpbk9wKG4xLCBhZGRvcCwgbjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5sZWZ0LCBuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm9wLCBhZGRvcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnJpZ2h0LCBuMykKKworICAgICAgICB4ID0gYXN0LkJpbk9wKDEsIDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5sZWZ0LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgub3AsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5yaWdodCwgMykKKworICAgICAgICB4ID0gYXN0LkJpbk9wKDEsIDIsIDMsIGxpbmVubz0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubGVmdCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm9wLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgucmlnaHQsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5saW5lbm8sIDApCisKKyAgICAgICAgIyBub2RlIHJhaXNlcyBleGNlcHRpb24gd2hlbiBub3QgZ2l2ZW4gZW5vdWdoIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFzdC5CaW5PcCwgMSwgMikKKyAgICAgICAgIyBub2RlIHJhaXNlcyBleGNlcHRpb24gd2hlbiBnaXZlbiB0b28gbWFueSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhc3QuQmluT3AsIDEsIDIsIDMsIDQpCisgICAgICAgICMgbm9kZSByYWlzZXMgZXhjZXB0aW9uIHdoZW4gbm90IGdpdmVuIGVub3VnaCBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhc3QuQmluT3AsIDEsIDIsIGxpbmVubz0wKQorICAgICAgICAjIG5vZGUgcmFpc2VzIGV4Y2VwdGlvbiB3aGVuIGdpdmVuIHRvbyBtYW55IGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFzdC5CaW5PcCwgMSwgMiwgMywgNCwgbGluZW5vPTApCisKKyAgICAgICAgIyBjYW4gc2V0IGF0dHJpYnV0ZXMgdGhyb3VnaCBrd2FyZ3MgdG9vCisgICAgICAgIHggPSBhc3QuQmluT3AobGVmdD0xLCBvcD0yLCByaWdodD0zLCBsaW5lbm89MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxlZnQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5vcCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnJpZ2h0LCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgubGluZW5vLCAwKQorCisgICAgICAgICMgUmFuZG9tIGt3YXJncyBhbHNvIGFsbG93ZWQKKyAgICAgICAgeCA9IGFzdC5CaW5PcCgxLCAyLCAzLCBmb29iYXJiYXo9NDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb29iYXJiYXosIDQyKQorCisgICAgZGVmIHRlc3Rfbm9fZmllbGRzKHNlbGYpOgorICAgICAgICAjIHRoaXMgdXNlZCB0byBmYWlsIGJlY2F1c2UgU3ViLl9maWVsZHMgd2FzIE5vbmUKKyAgICAgICAgeCA9IGFzdC5TdWIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX2ZpZWxkcywgKCkpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBtb2RzID0gW3BpY2tsZV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICAgICAgICAgIG1vZHMuYXBwZW5kKGNQaWNrbGUpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcHJvdG9jb2xzID0gWzAsIDEsIDJdCisgICAgICAgIGZvciBtb2QgaW4gbW9kczoKKyAgICAgICAgICAgIGZvciBwcm90b2NvbCBpbiBwcm90b2NvbHM6CisgICAgICAgICAgICAgICAgZm9yIGFzdCBpbiAoY29tcGlsZShpLCAiPyIsICJleGVjIiwgMHg0MDApIGZvciBpIGluIGV4ZWNfdGVzdHMpOgorICAgICAgICAgICAgICAgICAgICBhc3QyID0gbW9kLmxvYWRzKG1vZC5kdW1wcyhhc3QsIHByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0b190dXBsZShhc3QyKSwgdG9fdHVwbGUoYXN0KSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfaWRlbnRpdGlmZXIoc2VsZik6CisgICAgICAgIG0gPSBhc3QuTW9kdWxlKFthc3QuRXhwcihhc3QuTmFtZSh1IngiLCBhc3QuTG9hZCgpKSldKQorICAgICAgICBhc3QuZml4X21pc3NpbmdfbG9jYXRpb25zKG0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIGNvbXBpbGUobSwgIjx0ZXN0PiIsICJleGVjIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiaWRlbnRpZmllciBtdXN0IGJlIG9mIHR5cGUgc3RyIiwgc3RyKGNtLmV4Y2VwdGlvbikpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3N0cmluZyhzZWxmKToKKyAgICAgICAgbSA9IGFzdC5Nb2R1bGUoW2FzdC5FeHByKGFzdC5TdHIoNDMpKV0pCisgICAgICAgIGFzdC5maXhfbWlzc2luZ19sb2NhdGlvbnMobSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgY29tcGlsZShtLCAiPHRlc3Q+IiwgImV4ZWMiKQorICAgICAgICBzZWxmLmFzc2VydEluKCJzdHJpbmcgbXVzdCBiZSBvZiB0eXBlIHN0ciBvciB1bmkiLCBzdHIoY20uZXhjZXB0aW9uKSkKKworCitjbGFzcyBBU1RIZWxwZXJzX1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcGFyc2Uoc2VsZik6CisgICAgICAgIGEgPSBhc3QucGFyc2UoJ2ZvbygxICsgMSknKQorICAgICAgICBiID0gY29tcGlsZSgnZm9vKDEgKyAxKScsICc8dW5rbm93bj4nLCAnZXhlYycsIGFzdC5QeUNGX09OTFlfQVNUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5kdW1wKGEpLCBhc3QuZHVtcChiKSkKKworICAgIGRlZiB0ZXN0X2R1bXAoc2VsZik6CisgICAgICAgIG5vZGUgPSBhc3QucGFyc2UoJ3NwYW0oZWdncywgImFuZCBjaGVlc2UiKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmR1bXAobm9kZSksCisgICAgICAgICAgICAiTW9kdWxlKGJvZHk9W0V4cHIodmFsdWU9Q2FsbChmdW5jPU5hbWUoaWQ9J3NwYW0nLCBjdHg9TG9hZCgpKSwgIgorICAgICAgICAgICAgImFyZ3M9W05hbWUoaWQ9J2VnZ3MnLCBjdHg9TG9hZCgpKSwgU3RyKHM9J2FuZCBjaGVlc2UnKV0sICIKKyAgICAgICAgICAgICJrZXl3b3Jkcz1bXSwgc3RhcmFyZ3M9Tm9uZSwga3dhcmdzPU5vbmUpKV0pIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmR1bXAobm9kZSwgYW5ub3RhdGVfZmllbGRzPUZhbHNlKSwKKyAgICAgICAgICAgICJNb2R1bGUoW0V4cHIoQ2FsbChOYW1lKCdzcGFtJywgTG9hZCgpKSwgW05hbWUoJ2VnZ3MnLCBMb2FkKCkpLCAiCisgICAgICAgICAgICAiU3RyKCdhbmQgY2hlZXNlJyldLCBbXSwgTm9uZSwgTm9uZSkpXSkiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZHVtcChub2RlLCBpbmNsdWRlX2F0dHJpYnV0ZXM9VHJ1ZSksCisgICAgICAgICAgICAiTW9kdWxlKGJvZHk9W0V4cHIodmFsdWU9Q2FsbChmdW5jPU5hbWUoaWQ9J3NwYW0nLCBjdHg9TG9hZCgpLCAiCisgICAgICAgICAgICAibGluZW5vPTEsIGNvbF9vZmZzZXQ9MCksIGFyZ3M9W05hbWUoaWQ9J2VnZ3MnLCBjdHg9TG9hZCgpLCAiCisgICAgICAgICAgICAibGluZW5vPTEsIGNvbF9vZmZzZXQ9NSksIFN0cihzPSdhbmQgY2hlZXNlJywgbGluZW5vPTEsICIKKyAgICAgICAgICAgICJjb2xfb2Zmc2V0PTExKV0sIGtleXdvcmRzPVtdLCBzdGFyYXJncz1Ob25lLCBrd2FyZ3M9Tm9uZSwgIgorICAgICAgICAgICAgImxpbmVubz0xLCBjb2xfb2Zmc2V0PTApLCBsaW5lbm89MSwgY29sX29mZnNldD0wKV0pIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9jb3B5X2xvY2F0aW9uKHNlbGYpOgorICAgICAgICBzcmMgPSBhc3QucGFyc2UoJzEgKyAxJywgbW9kZT0nZXZhbCcpCisgICAgICAgIHNyYy5ib2R5LnJpZ2h0ID0gYXN0LmNvcHlfbG9jYXRpb24oYXN0Lk51bSgyKSwgc3JjLmJvZHkucmlnaHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmR1bXAoc3JjLCBpbmNsdWRlX2F0dHJpYnV0ZXM9VHJ1ZSksCisgICAgICAgICAgICAnRXhwcmVzc2lvbihib2R5PUJpbk9wKGxlZnQ9TnVtKG49MSwgbGluZW5vPTEsIGNvbF9vZmZzZXQ9MCksICcKKyAgICAgICAgICAgICdvcD1BZGQoKSwgcmlnaHQ9TnVtKG49MiwgbGluZW5vPTEsIGNvbF9vZmZzZXQ9NCksIGxpbmVubz0xLCAnCisgICAgICAgICAgICAnY29sX29mZnNldD0wKSknCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2ZpeF9taXNzaW5nX2xvY2F0aW9ucyhzZWxmKToKKyAgICAgICAgc3JjID0gYXN0LnBhcnNlKCd3cml0ZSgic3BhbSIpJykKKyAgICAgICAgc3JjLmJvZHkuYXBwZW5kKGFzdC5FeHByKGFzdC5DYWxsKGFzdC5OYW1lKCdzcGFtJywgYXN0LkxvYWQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXN0LlN0cignZWdncycpXSwgW10sIE5vbmUsIE5vbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmMsIGFzdC5maXhfbWlzc2luZ19sb2NhdGlvbnMoc3JjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZHVtcChzcmMsIGluY2x1ZGVfYXR0cmlidXRlcz1UcnVlKSwKKyAgICAgICAgICAgICJNb2R1bGUoYm9keT1bRXhwcih2YWx1ZT1DYWxsKGZ1bmM9TmFtZShpZD0nd3JpdGUnLCBjdHg9TG9hZCgpLCAiCisgICAgICAgICAgICAibGluZW5vPTEsIGNvbF9vZmZzZXQ9MCksIGFyZ3M9W1N0cihzPSdzcGFtJywgbGluZW5vPTEsICIKKyAgICAgICAgICAgICJjb2xfb2Zmc2V0PTYpXSwga2V5d29yZHM9W10sIHN0YXJhcmdzPU5vbmUsIGt3YXJncz1Ob25lLCAiCisgICAgICAgICAgICAibGluZW5vPTEsIGNvbF9vZmZzZXQ9MCksIGxpbmVubz0xLCBjb2xfb2Zmc2V0PTApLCAiCisgICAgICAgICAgICAiRXhwcih2YWx1ZT1DYWxsKGZ1bmM9TmFtZShpZD0nc3BhbScsIGN0eD1Mb2FkKCksIGxpbmVubz0xLCAiCisgICAgICAgICAgICAiY29sX29mZnNldD0wKSwgYXJncz1bU3RyKHM9J2VnZ3MnLCBsaW5lbm89MSwgY29sX29mZnNldD0wKV0sICIKKyAgICAgICAgICAgICJrZXl3b3Jkcz1bXSwgc3RhcmFyZ3M9Tm9uZSwga3dhcmdzPU5vbmUsIGxpbmVubz0xLCAiCisgICAgICAgICAgICAiY29sX29mZnNldD0wKSwgbGluZW5vPTEsIGNvbF9vZmZzZXQ9MCldKSIKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfaW5jcmVtZW50X2xpbmVubyhzZWxmKToKKyAgICAgICAgc3JjID0gYXN0LnBhcnNlKCcxICsgMScsIG1vZGU9J2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5pbmNyZW1lbnRfbGluZW5vKHNyYywgbj0zKSwgc3JjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5kdW1wKHNyYywgaW5jbHVkZV9hdHRyaWJ1dGVzPVRydWUpLAorICAgICAgICAgICAgJ0V4cHJlc3Npb24oYm9keT1CaW5PcChsZWZ0PU51bShuPTEsIGxpbmVubz00LCBjb2xfb2Zmc2V0PTApLCAnCisgICAgICAgICAgICAnb3A9QWRkKCksIHJpZ2h0PU51bShuPTEsIGxpbmVubz00LCBjb2xfb2Zmc2V0PTQpLCBsaW5lbm89NCwgJworICAgICAgICAgICAgJ2NvbF9vZmZzZXQ9MCkpJworICAgICAgICApCisgICAgICAgICMgaXNzdWUxMDg2OTogZG8gbm90IGluY3JlbWVudCBsaW5lbm8gb2Ygcm9vdCB0d2ljZQorICAgICAgICBzcmMgPSBhc3QucGFyc2UoJzEgKyAxJywgbW9kZT0nZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmluY3JlbWVudF9saW5lbm8oc3JjLmJvZHksIG49MyksIHNyYy5ib2R5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5kdW1wKHNyYywgaW5jbHVkZV9hdHRyaWJ1dGVzPVRydWUpLAorICAgICAgICAgICAgJ0V4cHJlc3Npb24oYm9keT1CaW5PcChsZWZ0PU51bShuPTEsIGxpbmVubz00LCBjb2xfb2Zmc2V0PTApLCAnCisgICAgICAgICAgICAnb3A9QWRkKCksIHJpZ2h0PU51bShuPTEsIGxpbmVubz00LCBjb2xfb2Zmc2V0PTQpLCBsaW5lbm89NCwgJworICAgICAgICAgICAgJ2NvbF9vZmZzZXQ9MCkpJworICAgICAgICApCisKKyAgICBkZWYgdGVzdF9pdGVyX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgbm9kZSA9IGFzdC5wYXJzZSgnZm9vKCknLCBtb2RlPSdldmFsJykKKyAgICAgICAgZCA9IGRpY3QoYXN0Lml0ZXJfZmllbGRzKG5vZGUuYm9keSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wb3AoJ2Z1bmMnKS5pZCwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeydrZXl3b3Jkcyc6IFtdLCAna3dhcmdzJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZ3MnOiBbXSwgJ3N0YXJhcmdzJzogTm9uZX0pCisKKyAgICBkZWYgdGVzdF9pdGVyX2NoaWxkX25vZGVzKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0LnBhcnNlKCJzcGFtKDIzLCA0MiwgZWdncz0nbGVlaycpIiwgbW9kZT0nZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoYXN0Lml0ZXJfY2hpbGRfbm9kZXMobm9kZS5ib2R5KSkpLCA0KQorICAgICAgICBpdGVyYXRvciA9IGFzdC5pdGVyX2NoaWxkX25vZGVzKG5vZGUuYm9keSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0ZXJhdG9yKS5pZCwgJ3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXRlcmF0b3IpLm4sIDIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXRlcmF0b3IpLm4sIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5kdW1wKG5leHQoaXRlcmF0b3IpKSwKKyAgICAgICAgICAgICJrZXl3b3JkKGFyZz0nZWdncycsIHZhbHVlPVN0cihzPSdsZWVrJykpIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9nZXRfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBub2RlID0gYXN0LnBhcnNlKCdkZWYgZm9vKCk6XG4gICIiImxpbmUgb25lXG4gIGxpbmUgdHdvIiIiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QuZ2V0X2RvY3N0cmluZyhub2RlLmJvZHlbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICdsaW5lIG9uZVxubGluZSB0d28nKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9ldmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzdC5saXRlcmFsX2V2YWwoJ1sxLCAyLCAzXScpLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgneyJmb28iOiA0Mn0nKSwgeyJmb28iOiA0Mn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgnKFRydWUsIEZhbHNlLCBOb25lKScpLCAoVHJ1ZSwgRmFsc2UsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhc3QubGl0ZXJhbF9ldmFsLCAnZm9vKCknKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9ldmFsX2lzc3VlNDkwNyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCcyaicpLCAyaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3QubGl0ZXJhbF9ldmFsKCcxMCArIDJqJyksIDEwICsgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXN0LmxpdGVyYWxfZXZhbCgnMS41IC0gMmonKSwgMS41IC0gMmopCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGFzdC5saXRlcmFsX2V2YWwsICcyICsgKDMgKyA0aiknKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4V2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEFTVF9UZXN0cywgQVNUSGVscGVyc19UZXN0KQorCitkZWYgbWFpbigpOgorICAgIGlmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6CisgICAgICAgIHJldHVybgorICAgIGlmIHN5cy5hcmd2WzE6XSA9PSBbJy1nJ106CisgICAgICAgIGZvciBzdGF0ZW1lbnRzLCBraW5kIGluICgoZXhlY190ZXN0cywgImV4ZWMiKSwgKHNpbmdsZV90ZXN0cywgInNpbmdsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV2YWxfdGVzdHMsICJldmFsIikpOgorICAgICAgICAgICAgcHJpbnQga2luZCsiX3Jlc3VsdHMgPSBbIgorICAgICAgICAgICAgZm9yIHMgaW4gc3RhdGVtZW50czoKKyAgICAgICAgICAgICAgICBwcmludCByZXByKHRvX3R1cGxlKGNvbXBpbGUocywgIj8iLCBraW5kLCAweDQwMCkpKSsiLCIKKyAgICAgICAgICAgIHByaW50ICJdIgorICAgICAgICBwcmludCAibWFpbigpIgorICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisgICAgdGVzdF9tYWluKCkKKworIyMjIyBFVkVSWVRISU5HIEJFTE9XIElTIEdFTkVSQVRFRCAjIyMjIworZXhlY19yZXN1bHRzID0gWworKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICdOb25lJywgKCdMb2FkJywpKSldKSwKKygnTW9kdWxlJywgWygnRnVuY3Rpb25EZWYnLCAoMSwgMCksICdmJywgKCdhcmd1bWVudHMnLCBbXSwgTm9uZSwgTm9uZSwgW10pLCBbKCdQYXNzJywgKDEsIDkpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdGdW5jdGlvbkRlZicsICgxLCAwKSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFsoJ05hbWUnLCAoMSwgNiksICdhJywgKCdQYXJhbScsKSldLCBOb25lLCBOb25lLCBbXSksIFsoJ1Bhc3MnLCAoMSwgMTApKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdGdW5jdGlvbkRlZicsICgxLCAwKSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFsoJ05hbWUnLCAoMSwgNiksICdhJywgKCdQYXJhbScsKSldLCBOb25lLCBOb25lLCBbKCdOdW0nLCAoMSwgOCksIDApXSksIFsoJ1Bhc3MnLCAoMSwgMTIpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdGdW5jdGlvbkRlZicsICgxLCAwKSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFtdLCAnYXJncycsIE5vbmUsIFtdKSwgWygnUGFzcycsICgxLCAxNCkpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ0Z1bmN0aW9uRGVmJywgKDEsIDApLCAnZicsICgnYXJndW1lbnRzJywgW10sIE5vbmUsICdrd2FyZ3MnLCBbXSksIFsoJ1Bhc3MnLCAoMSwgMTcpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdGdW5jdGlvbkRlZicsICgxLCAwKSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFsoJ05hbWUnLCAoMSwgNiksICdhJywgKCdQYXJhbScsKSksICgnTmFtZScsICgxLCA5KSwgJ2InLCAoJ1BhcmFtJywpKSwgKCdOYW1lJywgKDEsIDE0KSwgJ2MnLCAoJ1BhcmFtJywpKSwgKCdOYW1lJywgKDEsIDIyKSwgJ2QnLCAoJ1BhcmFtJywpKSwgKCdOYW1lJywgKDEsIDI4KSwgJ2UnLCAoJ1BhcmFtJywpKV0sICdhcmdzJywgJ2t3YXJncycsIFsoJ051bScsICgxLCAxMSksIDEpLCAoJ05hbWUnLCAoMSwgMTYpLCAnTm9uZScsICgnTG9hZCcsKSksICgnTGlzdCcsICgxLCAyNCksIFtdLCAoJ0xvYWQnLCkpLCAoJ0RpY3QnLCAoMSwgMzApLCBbXSwgW10pXSksIFsoJ1Bhc3MnLCAoMSwgNTIpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdDbGFzc0RlZicsICgxLCAwKSwgJ0MnLCBbXSwgWygnUGFzcycsICgxLCA4KSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnQ2xhc3NEZWYnLCAoMSwgMCksICdDJywgWygnTmFtZScsICgxLCA4KSwgJ29iamVjdCcsICgnTG9hZCcsKSldLCBbKCdQYXNzJywgKDEsIDE3KSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnRnVuY3Rpb25EZWYnLCAoMSwgMCksICdmJywgKCdhcmd1bWVudHMnLCBbXSwgTm9uZSwgTm9uZSwgW10pLCBbKCdSZXR1cm4nLCAoMSwgOCksICgnTnVtJywgKDEsIDE1KSwgMSkpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ0RlbGV0ZScsICgxLCAwKSwgWygnTmFtZScsICgxLCA0KSwgJ3YnLCAoJ0RlbCcsKSldKV0pLAorKCdNb2R1bGUnLCBbKCdBc3NpZ24nLCAoMSwgMCksIFsoJ05hbWUnLCAoMSwgMCksICd2JywgKCdTdG9yZScsKSldLCAoJ051bScsICgxLCA0KSwgMSkpXSksCisoJ01vZHVsZScsIFsoJ0F1Z0Fzc2lnbicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDApLCAndicsICgnU3RvcmUnLCkpLCAoJ0FkZCcsKSwgKCdOdW0nLCAoMSwgNSksIDEpKV0pLAorKCdNb2R1bGUnLCBbKCdQcmludCcsICgxLCAwKSwgKCdOYW1lJywgKDEsIDgpLCAnZicsICgnTG9hZCcsKSksIFsoJ051bScsICgxLCAxMSksIDEpXSwgRmFsc2UpXSksCisoJ01vZHVsZScsIFsoJ0ZvcicsICgxLCAwKSwgKCdOYW1lJywgKDEsIDQpLCAndicsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgOSksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCAxMSkpXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ1doaWxlJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNiksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCA4KSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnSWYnLCAoMSwgMCksICgnTmFtZScsICgxLCAzKSwgJ3YnLCAoJ0xvYWQnLCkpLCBbKCdQYXNzJywgKDEsIDUpKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdSYWlzZScsICgxLCAwKSwgKCdOYW1lJywgKDEsIDYpLCAnRXhjZXB0aW9uJywgKCdMb2FkJywpKSwgKCdTdHInLCAoMSwgMTcpLCAnc3RyaW5nJyksIE5vbmUpXSksCisoJ01vZHVsZScsIFsoJ1RyeUV4Y2VwdCcsICgxLCAwKSwgWygnUGFzcycsICgyLCAyKSldLCBbKCdFeGNlcHRIYW5kbGVyJywgKDMsIDApLCAoJ05hbWUnLCAoMywgNyksICdFeGNlcHRpb24nLCAoJ0xvYWQnLCkpLCBOb25lLCBbKCdQYXNzJywgKDQsIDIpKV0pXSwgW10pXSksCisoJ01vZHVsZScsIFsoJ1RyeUZpbmFsbHknLCAoMSwgMCksIFsoJ1Bhc3MnLCAoMiwgMikpXSwgWygnUGFzcycsICg0LCAyKSldKV0pLAorKCdNb2R1bGUnLCBbKCdBc3NlcnQnLCAoMSwgMCksICgnTmFtZScsICgxLCA3KSwgJ3YnLCAoJ0xvYWQnLCkpLCBOb25lKV0pLAorKCdNb2R1bGUnLCBbKCdJbXBvcnQnLCAoMSwgMCksIFsoJ2FsaWFzJywgJ3N5cycsIE5vbmUpXSldKSwKKygnTW9kdWxlJywgWygnSW1wb3J0RnJvbScsICgxLCAwKSwgJ3N5cycsIFsoJ2FsaWFzJywgJ3YnLCBOb25lKV0sIDApXSksCisoJ01vZHVsZScsIFsoJ0V4ZWMnLCAoMSwgMCksICgnU3RyJywgKDEsIDUpLCAndicpLCBOb25lLCBOb25lKV0pLAorKCdNb2R1bGUnLCBbKCdHbG9iYWwnLCAoMSwgMCksIFsndiddKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ051bScsICgxLCAwKSwgMSkpXSksCisoJ01vZHVsZScsIFsoJ1Bhc3MnLCAoMSwgMCkpXSksCisoJ01vZHVsZScsIFsoJ0JyZWFrJywgKDEsIDApKV0pLAorKCdNb2R1bGUnLCBbKCdDb250aW51ZScsICgxLCAwKSldKSwKKygnTW9kdWxlJywgWygnRm9yJywgKDEsIDApLCAoJ1R1cGxlJywgKDEsIDQpLCBbKCdOYW1lJywgKDEsIDQpLCAnYScsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgNiksICdiJywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDExKSwgJ2MnLCAoJ0xvYWQnLCkpLCBbKCdQYXNzJywgKDEsIDE0KSldLCBbXSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdMaXN0Q29tcCcsICgxLCAxKSwgKCdUdXBsZScsICgxLCAyKSwgWygnTmFtZScsICgxLCAyKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNCksICdiJywgKCdMb2FkJywpKV0sICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ1R1cGxlJywgKDEsIDExKSwgWygnTmFtZScsICgxLCAxMSksICdhJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxMyksICdiJywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE4KSwgJ2MnLCAoJ0xvYWQnLCkpLCBbXSldKSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdHZW5lcmF0b3JFeHAnLCAoMSwgMSksICgnVHVwbGUnLCAoMSwgMiksIFsoJ05hbWUnLCAoMSwgMiksICdhJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDEsIDQpLCAnYicsICgnTG9hZCcsKSldLCAoJ0xvYWQnLCkpLCBbKCdjb21wcmVoZW5zaW9uJywgKCdUdXBsZScsICgxLCAxMSksIFsoJ05hbWUnLCAoMSwgMTEpLCAnYScsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTMpLCAnYicsICgnU3RvcmUnLCkpXSwgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxOCksICdjJywgKCdMb2FkJywpKSwgW10pXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnR2VuZXJhdG9yRXhwJywgKDEsIDEpLCAoJ1R1cGxlJywgKDEsIDIpLCBbKCdOYW1lJywgKDEsIDIpLCAnYScsICgnTG9hZCcsKSksICgnTmFtZScsICgxLCA0KSwgJ2InLCAoJ0xvYWQnLCkpXSwgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoMSwgMTIpLCBbKCdOYW1lJywgKDEsIDEyKSwgJ2EnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE0KSwgJ2InLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMjApLCAnYycsICgnTG9hZCcsKSksIFtdKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0dlbmVyYXRvckV4cCcsICgyLCA0KSwgKCdUdXBsZScsICgzLCA0KSwgWygnTmFtZScsICgzLCA0KSwgJ0FhJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDUsIDcpLCAnQmInLCAoJ0xvYWQnLCkpXSwgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoOCwgNCksIFsoJ05hbWUnLCAoOCwgNCksICdBYScsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMTAsIDQpLCAnQmInLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMTAsIDEwKSwgJ0NjJywgKCdMb2FkJywpKSwgW10pXSkpXSksCisoJ01vZHVsZScsIFsoJ0V4cHInLCAoMSwgMCksICgnRGljdENvbXAnLCAoMSwgMSksICgnTmFtZScsICgxLCAxKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNSksICdiJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgxLCAxMSksICd3JywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxNiksICd4JywgKCdMb2FkJywpKSwgW10pLCAoJ2NvbXByZWhlbnNpb24nLCAoJ05hbWUnLCAoMSwgMjIpLCAnbScsICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMjcpLCAncCcsICgnTG9hZCcsKSksIFsoJ05hbWUnLCAoMSwgMzIpLCAnZycsICgnTG9hZCcsKSldKV0pKV0pLAorKCdNb2R1bGUnLCBbKCdFeHByJywgKDEsIDApLCAoJ0RpY3RDb21wJywgKDEsIDEpLCAoJ05hbWUnLCAoMSwgMSksICdhJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDEsIDUpLCAnYicsICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ1R1cGxlJywgKDEsIDExKSwgWygnTmFtZScsICgxLCAxMSksICd2JywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxMyksICd3JywgKCdTdG9yZScsKSldLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDE4KSwgJ3gnLCAoJ0xvYWQnLCkpLCBbXSldKSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdTZXRDb21wJywgKDEsIDEpLCAoJ05hbWUnLCAoMSwgMSksICdyJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgxLCA3KSwgJ2wnLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEyKSwgJ3gnLCAoJ0xvYWQnLCkpLCBbKCdOYW1lJywgKDEsIDE3KSwgJ2cnLCAoJ0xvYWQnLCkpXSldKSldKSwKKygnTW9kdWxlJywgWygnRXhwcicsICgxLCAwKSwgKCdTZXRDb21wJywgKDEsIDEpLCAoJ05hbWUnLCAoMSwgMSksICdyJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnVHVwbGUnLCAoMSwgNyksIFsoJ05hbWUnLCAoMSwgNyksICdsJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCA5KSwgJ20nLCAoJ1N0b3JlJywpKV0sICgnU3RvcmUnLCkpLCAoJ05hbWUnLCAoMSwgMTQpLCAneCcsICgnTG9hZCcsKSksIFtdKV0pKV0pLAorXQorc2luZ2xlX3Jlc3VsdHMgPSBbCisoJ0ludGVyYWN0aXZlJywgWygnRXhwcicsICgxLCAwKSwgKCdCaW5PcCcsICgxLCAwKSwgKCdOdW0nLCAoMSwgMCksIDEpLCAoJ0FkZCcsKSwgKCdOdW0nLCAoMSwgMiksIDIpKSldKSwKK10KK2V2YWxfcmVzdWx0cyA9IFsKKygnRXhwcmVzc2lvbicsICgnTmFtZScsICgxLCAwKSwgJ05vbmUnLCAoJ0xvYWQnLCkpKSwKKygnRXhwcmVzc2lvbicsICgnQm9vbE9wJywgKDEsIDApLCAoJ0FuZCcsKSwgWygnTmFtZScsICgxLCAwKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNiksICdiJywgKCdMb2FkJywpKV0pKSwKKygnRXhwcmVzc2lvbicsICgnQmluT3AnLCAoMSwgMCksICgnTmFtZScsICgxLCAwKSwgJ2EnLCAoJ0xvYWQnLCkpLCAoJ0FkZCcsKSwgKCdOYW1lJywgKDEsIDQpLCAnYicsICgnTG9hZCcsKSkpKSwKKygnRXhwcmVzc2lvbicsICgnVW5hcnlPcCcsICgxLCAwKSwgKCdOb3QnLCksICgnTmFtZScsICgxLCA0KSwgJ3YnLCAoJ0xvYWQnLCkpKSksCisoJ0V4cHJlc3Npb24nLCAoJ0xhbWJkYScsICgxLCAwKSwgKCdhcmd1bWVudHMnLCBbXSwgTm9uZSwgTm9uZSwgW10pLCAoJ05hbWUnLCAoMSwgNyksICdOb25lJywgKCdMb2FkJywpKSkpLAorKCdFeHByZXNzaW9uJywgKCdEaWN0JywgKDEsIDApLCBbKCdOdW0nLCAoMSwgMiksIDEpXSwgWygnTnVtJywgKDEsIDQpLCAyKV0pKSwKKygnRXhwcmVzc2lvbicsICgnRGljdCcsICgxLCAwKSwgW10sIFtdKSksCisoJ0V4cHJlc3Npb24nLCAoJ1NldCcsICgxLCAwKSwgWygnTmFtZScsICgxLCAxKSwgJ05vbmUnLCAoJ0xvYWQnLCkpXSkpLAorKCdFeHByZXNzaW9uJywgKCdEaWN0JywgKDEsIDApLCBbKCdOdW0nLCAoMiwgNiksIDEpXSwgWygnTnVtJywgKDQsIDEwKSwgMildKSksCisoJ0V4cHJlc3Npb24nLCAoJ0xpc3RDb21wJywgKDEsIDEpLCAoJ05hbWUnLCAoMSwgMSksICdhJywgKCdMb2FkJywpKSwgWygnY29tcHJlaGVuc2lvbicsICgnTmFtZScsICgxLCA3KSwgJ2InLCAoJ1N0b3JlJywpKSwgKCdOYW1lJywgKDEsIDEyKSwgJ2MnLCAoJ0xvYWQnLCkpLCBbKCdOYW1lJywgKDEsIDE3KSwgJ2QnLCAoJ0xvYWQnLCkpXSldKSksCisoJ0V4cHJlc3Npb24nLCAoJ0dlbmVyYXRvckV4cCcsICgxLCAxKSwgKCdOYW1lJywgKDEsIDEpLCAnYScsICgnTG9hZCcsKSksIFsoJ2NvbXByZWhlbnNpb24nLCAoJ05hbWUnLCAoMSwgNyksICdiJywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCAxMiksICdjJywgKCdMb2FkJywpKSwgWygnTmFtZScsICgxLCAxNyksICdkJywgKCdMb2FkJywpKV0pXSkpLAorKCdFeHByZXNzaW9uJywgKCdDb21wYXJlJywgKDEsIDApLCAoJ051bScsICgxLCAwKSwgMSksIFsoJ0x0JywpLCAoJ0x0JywpXSwgWygnTnVtJywgKDEsIDQpLCAyKSwgKCdOdW0nLCAoMSwgOCksIDMpXSkpLAorKCdFeHByZXNzaW9uJywgKCdDYWxsJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICdmJywgKCdMb2FkJywpKSwgWygnTnVtJywgKDEsIDIpLCAxKSwgKCdOdW0nLCAoMSwgNCksIDIpXSwgWygna2V5d29yZCcsICdjJywgKCdOdW0nLCAoMSwgOCksIDMpKV0sICgnTmFtZScsICgxLCAxMSksICdkJywgKCdMb2FkJywpKSwgKCdOYW1lJywgKDEsIDE1KSwgJ2UnLCAoJ0xvYWQnLCkpKSksCisoJ0V4cHJlc3Npb24nLCAoJ1JlcHInLCAoMSwgMCksICgnTmFtZScsICgxLCAxKSwgJ3YnLCAoJ0xvYWQnLCkpKSksCisoJ0V4cHJlc3Npb24nLCAoJ051bScsICgxLCAwKSwgMTBMKSksCisoJ0V4cHJlc3Npb24nLCAoJ1N0cicsICgxLCAwKSwgJ3N0cmluZycpKSwKKygnRXhwcmVzc2lvbicsICgnQXR0cmlidXRlJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICdhJywgKCdMb2FkJywpKSwgJ2InLCAoJ0xvYWQnLCkpKSwKKygnRXhwcmVzc2lvbicsICgnU3Vic2NyaXB0JywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICdhJywgKCdMb2FkJywpKSwgKCdTbGljZScsICgnTmFtZScsICgxLCAyKSwgJ2InLCAoJ0xvYWQnLCkpLCAoJ05hbWUnLCAoMSwgNCksICdjJywgKCdMb2FkJywpKSwgTm9uZSksICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdOYW1lJywgKDEsIDApLCAndicsICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdMaXN0JywgKDEsIDApLCBbKCdOdW0nLCAoMSwgMSksIDEpLCAoJ051bScsICgxLCAzKSwgMiksICgnTnVtJywgKDEsIDUpLCAzKV0sICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdMaXN0JywgKDEsIDApLCBbXSwgKCdMb2FkJywpKSksCisoJ0V4cHJlc3Npb24nLCAoJ1R1cGxlJywgKDEsIDApLCBbKCdOdW0nLCAoMSwgMCksIDEpLCAoJ051bScsICgxLCAyKSwgMiksICgnTnVtJywgKDEsIDQpLCAzKV0sICgnTG9hZCcsKSkpLAorKCdFeHByZXNzaW9uJywgKCdUdXBsZScsICgxLCAxKSwgWygnTnVtJywgKDEsIDEpLCAxKSwgKCdOdW0nLCAoMSwgMyksIDIpLCAoJ051bScsICgxLCA1KSwgMyldLCAoJ0xvYWQnLCkpKSwKKygnRXhwcmVzc2lvbicsICgnVHVwbGUnLCAoMSwgMCksIFtdLCAoJ0xvYWQnLCkpKSwKKygnRXhwcmVzc2lvbicsICgnQ2FsbCcsICgxLCAwKSwgKCdBdHRyaWJ1dGUnLCAoMSwgMCksICgnQXR0cmlidXRlJywgKDEsIDApLCAoJ0F0dHJpYnV0ZScsICgxLCAwKSwgKCdOYW1lJywgKDEsIDApLCAnYScsICgnTG9hZCcsKSksICdiJywgKCdMb2FkJywpKSwgJ2MnLCAoJ0xvYWQnLCkpLCAnZCcsICgnTG9hZCcsKSksIFsoJ1N1YnNjcmlwdCcsICgxLCA4KSwgKCdBdHRyaWJ1dGUnLCAoMSwgOCksICgnTmFtZScsICgxLCA4KSwgJ2EnLCAoJ0xvYWQnLCkpLCAnYicsICgnTG9hZCcsKSksICgnU2xpY2UnLCAoJ051bScsICgxLCAxMiksIDEpLCAoJ051bScsICgxLCAxNCksIDIpLCBOb25lKSwgKCdMb2FkJywpKV0sIFtdLCBOb25lLCBOb25lKSksCitdCittYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGQ1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGQ1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9hc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jaGF0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgxZWMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CkBAIC0wLDAgKzEsMjczIEBACisjIHRlc3QgYXN5bmNoYXQKKworaW1wb3J0IGFzeW5jb3JlLCBhc3luY2hhdCwgc29ja2V0LCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKworSE9TVCA9IHRlc3Rfc3VwcG9ydC5IT1NUCitTRVJWRVJfUVVJVCA9ICdRVUlUXG4nCisKK2lmIHRocmVhZGluZzoKKyAgICBjbGFzcyBlY2hvX3NlcnZlcih0aHJlYWRpbmcuVGhyZWFkKToKKyAgICAgICAgIyBwYXJhbWV0ZXIgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGFzc2VkIGJhY2sgdG8gdGhlCisgICAgICAgICMgY2xpZW50IGVhY2ggc2VuZAorICAgICAgICBjaHVua19zaXplID0gMQorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBldmVudCk6CisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICBzZWxmLmV2ZW50ID0gZXZlbnQKKyAgICAgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrKQorICAgICAgICAgICAgIyBUaGlzIHdpbGwgYmUgc2V0IGlmIHRoZSBjbGllbnQgd2FudHMgdXMgdG8gd2FpdCBiZWZvcmUgZWNob2luZyBkYXRhCisgICAgICAgICAgICAjIGJhY2suCisgICAgICAgICAgICBzZWxmLnN0YXJ0X3Jlc2VuZF9ldmVudCA9IE5vbmUKKworICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zb2NrLmxpc3RlbigxKQorICAgICAgICAgICAgc2VsZi5ldmVudC5zZXQoKQorICAgICAgICAgICAgY29ubiwgY2xpZW50ID0gc2VsZi5zb2NrLmFjY2VwdCgpCisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiCisgICAgICAgICAgICAjIGNvbGxlY3QgZGF0YSB1bnRpbCBxdWl0IG1lc3NhZ2UgaXMgc2VlbgorICAgICAgICAgICAgd2hpbGUgU0VSVkVSX1FVSVQgbm90IGluIHNlbGYuYnVmZmVyOgorICAgICAgICAgICAgICAgIGRhdGEgPSBjb25uLnJlY3YoMSkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IHNlbGYuYnVmZmVyICsgZGF0YQorCisgICAgICAgICAgICAjIHJlbW92ZSB0aGUgU0VSVkVSX1FVSVQgbWVzc2FnZQorICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBzZWxmLmJ1ZmZlci5yZXBsYWNlKFNFUlZFUl9RVUlULCAnJykKKworICAgICAgICAgICAgaWYgc2VsZi5zdGFydF9yZXNlbmRfZXZlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5zdGFydF9yZXNlbmRfZXZlbnQud2FpdCgpCisKKyAgICAgICAgICAgICMgcmUtc2VuZCBlbnRpcmUgc2V0IG9mIGNvbGxlY3RlZCBkYXRhCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyB0aGlzIG1heSBmYWlsIG9uIHNvbWUgdGVzdHMsIHN1Y2ggYXMgdGVzdF9jbG9zZV93aGVuX2RvbmUsIHNpbmNlCisgICAgICAgICAgICAgICAgIyB0aGUgY2xpZW50IGNsb3NlcyB0aGUgY2hhbm5lbCB3aGVuIGl0J3MgZG9uZSBzZW5kaW5nCisgICAgICAgICAgICAgICAgd2hpbGUgc2VsZi5idWZmZXI6CisgICAgICAgICAgICAgICAgICAgIG4gPSBjb25uLnNlbmQoc2VsZi5idWZmZXJbOnNlbGYuY2h1bmtfc2l6ZV0pCisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gc2VsZi5idWZmZXJbbjpdCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisKKyAgICBjbGFzcyBlY2hvX2NsaWVudChhc3luY2hhdC5hc3luY19jaGF0KToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdGVybWluYXRvciwgc2VydmVyX3BvcnQpOgorICAgICAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgc2VsZi5jb250ZW50cyA9IFtdCisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHNlbGYuY29ubmVjdCgoSE9TVCwgc2VydmVyX3BvcnQpKQorICAgICAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcih0ZXJtaW5hdG9yKQorICAgICAgICAgICAgc2VsZi5idWZmZXIgPSAnJworCisgICAgICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAjIHNlbGVjdC5wb2xsIHJldHVybnMgYSBzZWxlY3QuUE9MTEhVUCBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0cworICAgICAgICAgICAgIyBvbiBkYXJ3aW4sIHNvIGp1c3QgaWdub3JlIGl0CisgICAgICAgICAgICBkZWYgaGFuZGxlX2V4cHQoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBjb2xsZWN0X2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlciArPSBkYXRhCisKKyAgICAgICAgZGVmIGZvdW5kX3Rlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgICAgICBzZWxmLmNvbnRlbnRzLmFwcGVuZChzZWxmLmJ1ZmZlcikKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyID0gIiIKKworCisgICAgZGVmIHN0YXJ0X2VjaG9fc2VydmVyKCk6CisgICAgICAgIGV2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgcyA9IGVjaG9fc2VydmVyKGV2ZW50KQorICAgICAgICBzLnN0YXJ0KCkKKyAgICAgICAgZXZlbnQud2FpdCgpCisgICAgICAgIGV2ZW50LmNsZWFyKCkKKyAgICAgICAgdGltZS5zbGVlcCgwLjAxKSAjIEdpdmUgc2VydmVyIHRpbWUgdG8gc3RhcnQgYWNjZXB0aW5nLgorICAgICAgICByZXR1cm4gcywgZXZlbnQKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgVGVzdEFzeW5jaGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB1c2Vwb2xsID0gRmFsc2UKKworICAgIGRlZiBzZXRVcCAoc2VsZik6CisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKworICAgIGRlZiB0ZWFyRG93biAoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKworICAgIGRlZiBsaW5lX3Rlcm1pbmF0b3JfY2hlY2soc2VsZiwgdGVybSwgc2VydmVyX2NodW5rKToKKyAgICAgICAgZXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzID0gZWNob19zZXJ2ZXIoZXZlbnQpCisgICAgICAgIHMuY2h1bmtfc2l6ZSA9IHNlcnZlcl9jaHVuaworICAgICAgICBzLnN0YXJ0KCkKKyAgICAgICAgZXZlbnQud2FpdCgpCisgICAgICAgIGV2ZW50LmNsZWFyKCkKKyAgICAgICAgdGltZS5zbGVlcCgwLjAxKSAjIEdpdmUgc2VydmVyIHRpbWUgdG8gc3RhcnQgYWNjZXB0aW5nLgorICAgICAgICBjID0gZWNob19jbGllbnQodGVybSwgcy5wb3J0KQorICAgICAgICBjLnB1c2goImhlbGxvICIpCisgICAgICAgIGMucHVzaCgid29ybGQlcyIgJSB0ZXJtKQorICAgICAgICBjLnB1c2goIkknbSBub3QgZGVhZCB5ZXQhJXMiICUgdGVybSkKKyAgICAgICAgYy5wdXNoKFNFUlZFUl9RVUlUKQorICAgICAgICBhc3luY29yZS5sb29wKHVzZV9wb2xsPXNlbGYudXNlcG9sbCwgY291bnQ9MzAwLCB0aW1lb3V0PS4wMSkKKyAgICAgICAgcy5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29udGVudHMsIFsiaGVsbG8gd29ybGQiLCAiSSdtIG5vdCBkZWFkIHlldCEiXSkKKworICAgICMgdGhlIGxpbmUgdGVybWluYXRvciB0ZXN0cyBiZWxvdyBjaGVjayByZWNlaXZpbmcgdmFyaW91c2x5LXNpemVkCisgICAgIyBjaHVua3MgYmFjayBmcm9tIHRoZSBzZXJ2ZXIgaW4gb3JkZXIgdG8gZXhlcmNpc2UgYWxsIGJyYW5jaGVzIG9mCisgICAgIyBhc3luY19jaGF0LmhhbmRsZV9yZWFkCisKKyAgICBkZWYgdGVzdF9saW5lX3Rlcm1pbmF0b3IxKHNlbGYpOgorICAgICAgICAjIHRlc3Qgb25lLWNoYXJhY3RlciB0ZXJtaW5hdG9yCisgICAgICAgIGZvciBsIGluICgxLDIsMyk6CisgICAgICAgICAgICBzZWxmLmxpbmVfdGVybWluYXRvcl9jaGVjaygnXG4nLCBsKQorCisgICAgZGVmIHRlc3RfbGluZV90ZXJtaW5hdG9yMihzZWxmKToKKyAgICAgICAgIyB0ZXN0IHR3by1jaGFyYWN0ZXIgdGVybWluYXRvcgorICAgICAgICBmb3IgbCBpbiAoMSwyLDMpOgorICAgICAgICAgICAgc2VsZi5saW5lX3Rlcm1pbmF0b3JfY2hlY2soJ1xyXG4nLCBsKQorCisgICAgZGVmIHRlc3RfbGluZV90ZXJtaW5hdG9yMyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRocmVlLWNoYXJhY3RlciB0ZXJtaW5hdG9yCisgICAgICAgIGZvciBsIGluICgxLDIsMyk6CisgICAgICAgICAgICBzZWxmLmxpbmVfdGVybWluYXRvcl9jaGVjaygncXFxJywgbCkKKworICAgIGRlZiBudW1lcmljX3Rlcm1pbmF0b3JfY2hlY2soc2VsZiwgdGVybWxlbik6CisgICAgICAgICMgVHJ5IHJlYWRpbmcgYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgcywgZXZlbnQgPSBzdGFydF9lY2hvX3NlcnZlcigpCisgICAgICAgIGMgPSBlY2hvX2NsaWVudCh0ZXJtbGVuLCBzLnBvcnQpCisgICAgICAgIGRhdGEgPSAiaGVsbG8gd29ybGQsIEknbSBub3QgZGVhZCB5ZXQhXG4iCisgICAgICAgIGMucHVzaChkYXRhKQorICAgICAgICBjLnB1c2goU0VSVkVSX1FVSVQpCisgICAgICAgIGFzeW5jb3JlLmxvb3AodXNlX3BvbGw9c2VsZi51c2Vwb2xsLCBjb3VudD0zMDAsIHRpbWVvdXQ9LjAxKQorICAgICAgICBzLmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb250ZW50cywgW2RhdGFbOnRlcm1sZW5dXSkKKworICAgIGRlZiB0ZXN0X251bWVyaWNfdGVybWluYXRvcjEoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBpbnRzICYgbG9uZ3MgYm90aCB3b3JrIChzaW5jZSB0eXBlIGlzCisgICAgICAgICMgZXhwbGljaXRseSBjaGVja2VkIGluIGFzeW5jX2NoYXQuaGFuZGxlX3JlYWQpCisgICAgICAgIHNlbGYubnVtZXJpY190ZXJtaW5hdG9yX2NoZWNrKDEpCisgICAgICAgIHNlbGYubnVtZXJpY190ZXJtaW5hdG9yX2NoZWNrKDFMKQorCisgICAgZGVmIHRlc3RfbnVtZXJpY190ZXJtaW5hdG9yMihzZWxmKToKKyAgICAgICAgc2VsZi5udW1lcmljX3Rlcm1pbmF0b3JfY2hlY2soNkwpCisKKyAgICBkZWYgdGVzdF9ub25lX3Rlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgICMgVHJ5IHJlYWRpbmcgYSBmaXhlZCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgcywgZXZlbnQgPSBzdGFydF9lY2hvX3NlcnZlcigpCisgICAgICAgIGMgPSBlY2hvX2NsaWVudChOb25lLCBzLnBvcnQpCisgICAgICAgIGRhdGEgPSAiaGVsbG8gd29ybGQsIEknbSBub3QgZGVhZCB5ZXQhXG4iCisgICAgICAgIGMucHVzaChkYXRhKQorICAgICAgICBjLnB1c2goU0VSVkVSX1FVSVQpCisgICAgICAgIGFzeW5jb3JlLmxvb3AodXNlX3BvbGw9c2VsZi51c2Vwb2xsLCBjb3VudD0zMDAsIHRpbWVvdXQ9LjAxKQorICAgICAgICBzLmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb250ZW50cywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5idWZmZXIsIGRhdGEpCisKKyAgICBkZWYgdGVzdF9zaW1wbGVfcHJvZHVjZXIoc2VsZik6CisgICAgICAgIHMsIGV2ZW50ID0gc3RhcnRfZWNob19zZXJ2ZXIoKQorICAgICAgICBjID0gZWNob19jbGllbnQoJ1xuJywgcy5wb3J0KQorICAgICAgICBkYXRhID0gImhlbGxvIHdvcmxkXG5JJ20gbm90IGRlYWQgeWV0IVxuIgorICAgICAgICBwID0gYXN5bmNoYXQuc2ltcGxlX3Byb2R1Y2VyKGRhdGErU0VSVkVSX1FVSVQsIGJ1ZmZlcl9zaXplPTgpCisgICAgICAgIGMucHVzaF93aXRoX3Byb2R1Y2VyKHApCisgICAgICAgIGFzeW5jb3JlLmxvb3AodXNlX3BvbGw9c2VsZi51c2Vwb2xsLCBjb3VudD0zMDAsIHRpbWVvdXQ9LjAxKQorICAgICAgICBzLmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb250ZW50cywgWyJoZWxsbyB3b3JsZCIsICJJJ20gbm90IGRlYWQgeWV0ISJdKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX3Byb2R1Y2VyKHNlbGYpOgorICAgICAgICBzLCBldmVudCA9IHN0YXJ0X2VjaG9fc2VydmVyKCkKKyAgICAgICAgYyA9IGVjaG9fY2xpZW50KCdcbicsIHMucG9ydCkKKyAgICAgICAgZGF0YSA9ICJoZWxsbyB3b3JsZFxuSSdtIG5vdCBkZWFkIHlldCFcbiIKKyAgICAgICAgYy5wdXNoX3dpdGhfcHJvZHVjZXIoZGF0YStTRVJWRVJfUVVJVCkKKyAgICAgICAgYXN5bmNvcmUubG9vcCh1c2VfcG9sbD1zZWxmLnVzZXBvbGwsIGNvdW50PTMwMCwgdGltZW91dD0uMDEpCisgICAgICAgIHMuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbnRlbnRzLCBbImhlbGxvIHdvcmxkIiwgIkknbSBub3QgZGVhZCB5ZXQhIl0pCisKKyAgICBkZWYgdGVzdF9lbXB0eV9saW5lKHNlbGYpOgorICAgICAgICAjIGNoZWNrcyB0aGF0IGVtcHR5IGxpbmVzIGFyZSBoYW5kbGVkIGNvcnJlY3RseQorICAgICAgICBzLCBldmVudCA9IHN0YXJ0X2VjaG9fc2VydmVyKCkKKyAgICAgICAgYyA9IGVjaG9fY2xpZW50KCdcbicsIHMucG9ydCkKKyAgICAgICAgYy5wdXNoKCJoZWxsbyB3b3JsZFxuXG5JJ20gbm90IGRlYWQgeWV0IVxuIikKKyAgICAgICAgYy5wdXNoKFNFUlZFUl9RVUlUKQorICAgICAgICBhc3luY29yZS5sb29wKHVzZV9wb2xsPXNlbGYudXNlcG9sbCwgY291bnQ9MzAwLCB0aW1lb3V0PS4wMSkKKyAgICAgICAgcy5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29udGVudHMsIFsiaGVsbG8gd29ybGQiLCAiIiwgIkknbSBub3QgZGVhZCB5ZXQhIl0pCisKKyAgICBkZWYgdGVzdF9jbG9zZV93aGVuX2RvbmUoc2VsZik6CisgICAgICAgIHMsIGV2ZW50ID0gc3RhcnRfZWNob19zZXJ2ZXIoKQorICAgICAgICBzLnN0YXJ0X3Jlc2VuZF9ldmVudCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIGMgPSBlY2hvX2NsaWVudCgnXG4nLCBzLnBvcnQpCisgICAgICAgIGMucHVzaCgiaGVsbG8gd29ybGRcbkknbSBub3QgZGVhZCB5ZXQhXG4iKQorICAgICAgICBjLnB1c2goU0VSVkVSX1FVSVQpCisgICAgICAgIGMuY2xvc2Vfd2hlbl9kb25lKCkKKyAgICAgICAgYXN5bmNvcmUubG9vcCh1c2VfcG9sbD1zZWxmLnVzZXBvbGwsIGNvdW50PTMwMCwgdGltZW91dD0uMDEpCisKKyAgICAgICAgIyBPbmx5IGFsbG93IHRoZSBzZXJ2ZXIgdG8gc3RhcnQgZWNob2luZyBkYXRhIGJhY2sgdG8gdGhlIGNsaWVudCBhZnRlcgorICAgICAgICAjIHRoZSBjbGllbnQgaGFzIGNsb3NlZCBpdHMgY29ubmVjdGlvbi4gIFRoaXMgcHJldmVudHMgYSByYWNlIGNvbmRpdGlvbgorICAgICAgICAjIHdoZXJlIHRoZSBzZXJ2ZXIgZWNob2VzIGFsbCBvZiBpdHMgZGF0YSBiZWZvcmUgd2UgY2FuIGNoZWNrIHRoYXQgaXQKKyAgICAgICAgIyBnb3QgYW55IGRvd24gYmVsb3cuCisgICAgICAgIHMuc3RhcnRfcmVzZW5kX2V2ZW50LnNldCgpCisgICAgICAgIHMuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbnRlbnRzLCBbXSkKKyAgICAgICAgIyB0aGUgc2VydmVyIG1pZ2h0IGhhdmUgYmVlbiBhYmxlIHRvIHNlbmQgYSBieXRlIG9yIHR3byBiYWNrLCBidXQgdGhpcworICAgICAgICAjIGF0IGxlYXN0IGNoZWNrcyB0aGF0IGl0IHJlY2VpdmVkIHNvbWV0aGluZyBhbmQgZGlkbid0IGp1c3QgZmFpbAorICAgICAgICAjICh3aGljaCBjb3VsZCBzdGlsbCByZXN1bHQgaW4gdGhlIGNsaWVudCBub3QgaGF2aW5nIHJlY2VpdmVkIGFueXRoaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHMuYnVmZmVyKSA+IDApCisKKworY2xhc3MgVGVzdEFzeW5jaGF0X1dpdGhQb2xsKFRlc3RBc3luY2hhdCk6CisgICAgdXNlcG9sbCA9IFRydWUKKworY2xhc3MgVGVzdEhlbHBlckZ1bmN0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZmluZF9wcmVmaXhfYXRfZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzeW5jaGF0LmZpbmRfcHJlZml4X2F0X2VuZCgicXdlcnR5XHIiLCAiXHJcbiIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzeW5jaGF0LmZpbmRfcHJlZml4X2F0X2VuZCgicXdlcnR5ZGtqZiIsICJcclxuIiksIDApCisKK2NsYXNzIFRlc3RGaWZvKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgZiA9IGFzeW5jaGF0LmZpZm8oKQorICAgICAgICBmLnB1c2goNykKKyAgICAgICAgZi5wdXNoKCdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5maXJzdCgpLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgxLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5maXJzdCgpLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc19lbXB0eSgpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc19lbXB0eSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucG9wKCksICgwLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2dpdmVuX2xpc3Qoc2VsZik6CisgICAgICAgIGYgPSBhc3luY2hhdC5maWZvKFsneCcsIDE3LCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsICd4JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDEsIDE3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnBvcCgpLCAoMSwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wb3AoKSwgKDAsIE5vbmUpKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RBc3luY2hhdCwgVGVzdEFzeW5jaGF0X1dpdGhQb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEhlbHBlckZ1bmN0aW9ucywgVGVzdEZpZm8pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jaGF0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jaGF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2FjYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jaGF0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jaGF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2FjYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNoYXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jb3JlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM0NDcwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jb3JlLnB5CkBAIC0wLDAgKzEsNzQ1IEBACitpbXBvcnQgYXN5bmNvcmUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNlbGVjdAoraW1wb3J0IG9zCitpbXBvcnQgc29ja2V0CitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHdhcm5pbmdzCitpbXBvcnQgZXJybm8KK2ltcG9ydCBzdHJ1Y3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0LCB1bmxpbmsKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCitIT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKKworY2xhc3MgZHVtbXlzb2NrZXQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlZCA9IEZhbHNlCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDQyCisKK2NsYXNzIGR1bW15Y2hhbm5lbDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc29ja2V0ID0gZHVtbXlzb2NrZXQoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnNvY2tldC5jbG9zZSgpCisKK2NsYXNzIGV4aXRpbmdkdW1teToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBoYW5kbGVfcmVhZF9ldmVudChzZWxmKToKKyAgICAgICAgcmFpc2UgYXN5bmNvcmUuRXhpdE5vdygpCisKKyAgICBoYW5kbGVfd3JpdGVfZXZlbnQgPSBoYW5kbGVfcmVhZF9ldmVudAorICAgIGhhbmRsZV9jbG9zZSA9IGhhbmRsZV9yZWFkX2V2ZW50CisgICAgaGFuZGxlX2V4cHRfZXZlbnQgPSBoYW5kbGVfcmVhZF9ldmVudAorCitjbGFzcyBjcmFzaGluZ2R1bW15OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVkID0gRmFsc2UKKworICAgIGRlZiBoYW5kbGVfcmVhZF9ldmVudChzZWxmKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCkKKworICAgIGhhbmRsZV93cml0ZV9ldmVudCA9IGhhbmRsZV9yZWFkX2V2ZW50CisgICAgaGFuZGxlX2Nsb3NlID0gaGFuZGxlX3JlYWRfZXZlbnQKKyAgICBoYW5kbGVfZXhwdF9ldmVudCA9IGhhbmRsZV9yZWFkX2V2ZW50CisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmVycm9yX2hhbmRsZWQgPSBUcnVlCisKKyMgdXNlZCB3aGVuIHRlc3Rpbmcgc2VuZGVyczsganVzdCBjb2xsZWN0cyB3aGF0IGl0IGdldHMgdW50aWwgbmV3bGluZSBpcyBzZW50CitkZWYgY2FwdHVyZV9zZXJ2ZXIoZXZ0LCBidWYsIHNlcnYpOgorICAgIHRyeToKKyAgICAgICAgc2Vydi5saXN0ZW4oNSkKKyAgICAgICAgY29ubiwgYWRkciA9IHNlcnYuYWNjZXB0KCkKKyAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBuID0gMjAwCisgICAgICAgIHdoaWxlIG4gPiAwOgorICAgICAgICAgICAgciwgdywgZSA9IHNlbGVjdC5zZWxlY3QoW2Nvbm5dLCBbXSwgW10pCisgICAgICAgICAgICBpZiByOgorICAgICAgICAgICAgICAgIGRhdGEgPSBjb25uLnJlY3YoMTApCisgICAgICAgICAgICAgICAgIyBrZWVwIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciB0aGUgbmV3bGluZSB0ZXJtaW5hdG9yCisgICAgICAgICAgICAgICAgYnVmLndyaXRlKGRhdGEucmVwbGFjZSgnXG4nLCAnJykpCisgICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiBkYXRhOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgbiAtPSAxCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCisKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgZmluYWxseToKKyAgICAgICAgc2Vydi5jbG9zZSgpCisgICAgICAgIGV2dC5zZXQoKQorCisKK2NsYXNzIEhlbHBlckZ1bmN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JlYWR3cml0ZWV4YyhzZWxmKToKKyAgICAgICAgIyBDaGVjayBleGNlcHRpb24gaGFuZGxpbmcgYmVoYXZpb3Igb2YgcmVhZCwgd3JpdGUgYW5kIF9leGNlcHRpb24KKworICAgICAgICAjIGNoZWNrIHRoYXQgRXhpdE5vdyBleGNlcHRpb25zIGluIHRoZSBvYmplY3QgaGFuZGxlciBtZXRob2QKKyAgICAgICAgIyBidWJibGVzIGFsbCB0aGUgd2F5IHVwIHRocm91Z2ggYXN5bmNvcmUgcmVhZC93cml0ZS9fZXhjZXB0aW9uIGNhbGxzCisgICAgICAgIHRyMSA9IGV4aXRpbmdkdW1teSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGFzeW5jb3JlLkV4aXROb3csIGFzeW5jb3JlLnJlYWQsIHRyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXN5bmNvcmUuRXhpdE5vdywgYXN5bmNvcmUud3JpdGUsIHRyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXN5bmNvcmUuRXhpdE5vdywgYXN5bmNvcmUuX2V4Y2VwdGlvbiwgdHIxKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBhbiBleGNlcHRpb24gb3RoZXIgdGhhbiBFeGl0Tm93IGluIHRoZSBvYmplY3QgaGFuZGxlcgorICAgICAgICAjIG1ldGhvZCBjYXVzZXMgdGhlIGhhbmRsZV9lcnJvciBtZXRob2QgdG8gZ2V0IGNhbGxlZAorICAgICAgICB0cjIgPSBjcmFzaGluZ2R1bW15KCkKKyAgICAgICAgYXN5bmNvcmUucmVhZCh0cjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHIyLmVycm9yX2hhbmRsZWQsIFRydWUpCisKKyAgICAgICAgdHIyID0gY3Jhc2hpbmdkdW1teSgpCisgICAgICAgIGFzeW5jb3JlLndyaXRlKHRyMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cjIuZXJyb3JfaGFuZGxlZCwgVHJ1ZSkKKworICAgICAgICB0cjIgPSBjcmFzaGluZ2R1bW15KCkKKyAgICAgICAgYXN5bmNvcmUuX2V4Y2VwdGlvbih0cjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHIyLmVycm9yX2hhbmRsZWQsIFRydWUpCisKKyAgICAjIGFzeW5jb3JlLnJlYWR3cml0ZSB1c2VzIGNvbnN0YW50cyBpbiB0aGUgc2VsZWN0IG1vZHVsZSB0aGF0CisgICAgIyBhcmUgbm90IHByZXNlbnQgaW4gV2luZG93cyBzeXN0ZW1zIChzZWUgdGhpcyB0aHJlYWQ6CisgICAgIyBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tbGlzdC8yMDAxLU9jdG9iZXIvMTA5OTczLmh0bWwpCisgICAgIyBUaGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIHByZXNlbnQgYXMgbG9uZyBhcyBwb2xsIGlzIGF2YWlsYWJsZQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzZWxlY3QsICdwb2xsJyksICdzZWxlY3QucG9sbCByZXF1aXJlZCcpCisgICAgZGVmIHRlc3RfcmVhZHdyaXRlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgY29ycmVjdCBtZXRob2RzIGFyZSBjYWxsZWQgYnkgcmVhZHdyaXRlKCkKKworICAgICAgICBhdHRyaWJ1dGVzID0gKCdyZWFkJywgJ2V4cHQnLCAnd3JpdGUnLCAnY2xvc2VkJywgJ2Vycm9yX2hhbmRsZWQnKQorCisgICAgICAgIGV4cGVjdGVkID0gKAorICAgICAgICAgICAgKHNlbGVjdC5QT0xMSU4sICdyZWFkJyksCisgICAgICAgICAgICAoc2VsZWN0LlBPTExQUkksICdleHB0JyksCisgICAgICAgICAgICAoc2VsZWN0LlBPTExPVVQsICd3cml0ZScpLAorICAgICAgICAgICAgKHNlbGVjdC5QT0xMRVJSLCAnY2xvc2VkJyksCisgICAgICAgICAgICAoc2VsZWN0LlBPTExIVVAsICdjbG9zZWQnKSwKKyAgICAgICAgICAgIChzZWxlY3QuUE9MTE5WQUwsICdjbG9zZWQnKSwKKyAgICAgICAgICAgICkKKworICAgICAgICBjbGFzcyB0ZXN0b2JqOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYucmVhZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi53cml0ZSA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuZXhwdCA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5lcnJvcl9oYW5kbGVkID0gRmFsc2UKKworICAgICAgICAgICAgZGVmIGhhbmRsZV9yZWFkX2V2ZW50KHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYucmVhZCA9IFRydWUKKworICAgICAgICAgICAgZGVmIGhhbmRsZV93cml0ZV9ldmVudChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlID0gVHJ1ZQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX2Nsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX2V4cHRfZXZlbnQoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5leHB0ID0gVHJ1ZQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfaGFuZGxlZCA9IFRydWUKKworICAgICAgICBmb3IgZmxhZywgZXhwZWN0ZWRhdHRyIGluIGV4cGVjdGVkOgorICAgICAgICAgICAgdG9iaiA9IHRlc3RvYmooKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHRvYmosIGV4cGVjdGVkYXR0ciksIEZhbHNlKQorICAgICAgICAgICAgYXN5bmNvcmUucmVhZHdyaXRlKHRvYmosIGZsYWcpCisKKyAgICAgICAgICAgICMgT25seSB0aGUgYXR0cmlidXRlIG1vZGlmaWVkIGJ5IHRoZSByb3V0aW5lIHdlIGV4cGVjdCB0byBiZQorICAgICAgICAgICAgIyBjYWxsZWQgc2hvdWxkIGJlIFRydWUuCisgICAgICAgICAgICBmb3IgYXR0ciBpbiBhdHRyaWJ1dGVzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cih0b2JqLCBhdHRyKSwgYXR0cj09ZXhwZWN0ZWRhdHRyKQorCisgICAgICAgICAgICAjIGNoZWNrIHRoYXQgRXhpdE5vdyBleGNlcHRpb25zIGluIHRoZSBvYmplY3QgaGFuZGxlciBtZXRob2QKKyAgICAgICAgICAgICMgYnViYmxlcyBhbGwgdGhlIHdheSB1cCB0aHJvdWdoIGFzeW5jb3JlIHJlYWR3cml0ZSBjYWxsCisgICAgICAgICAgICB0cjEgPSBleGl0aW5nZHVtbXkoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXN5bmNvcmUuRXhpdE5vdywgYXN5bmNvcmUucmVhZHdyaXRlLCB0cjEsIGZsYWcpCisKKyAgICAgICAgICAgICMgY2hlY2sgdGhhdCBhbiBleGNlcHRpb24gb3RoZXIgdGhhbiBFeGl0Tm93IGluIHRoZSBvYmplY3QgaGFuZGxlcgorICAgICAgICAgICAgIyBtZXRob2QgY2F1c2VzIHRoZSBoYW5kbGVfZXJyb3IgbWV0aG9kIHRvIGdldCBjYWxsZWQKKyAgICAgICAgICAgIHRyMiA9IGNyYXNoaW5nZHVtbXkoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cjIuZXJyb3JfaGFuZGxlZCwgRmFsc2UpCisgICAgICAgICAgICBhc3luY29yZS5yZWFkd3JpdGUodHIyLCBmbGFnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cjIuZXJyb3JfaGFuZGxlZCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlYWxsKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlYWxsX2NoZWNrKEZhbHNlKQorCisgICAgZGVmIHRlc3RfY2xvc2VhbGxfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZWFsbF9jaGVjayhUcnVlKQorCisgICAgZGVmIGNsb3NlYWxsX2NoZWNrKHNlbGYsIHVzZWRlZmF1bHQpOgorICAgICAgICAjIENoZWNrIHRoYXQgY2xvc2VfYWxsKCkgY2xvc2VzIGV2ZXJ5dGhpbmcgaW4gYSBnaXZlbiBtYXAKKworICAgICAgICBsID0gW10KKyAgICAgICAgdGVzdG1hcCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIGMgPSBkdW1teWNoYW5uZWwoKQorICAgICAgICAgICAgbC5hcHBlbmQoYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zb2NrZXQuY2xvc2VkLCBGYWxzZSkKKyAgICAgICAgICAgIHRlc3RtYXBbaV0gPSBjCisKKyAgICAgICAgaWYgdXNlZGVmYXVsdDoKKyAgICAgICAgICAgIHNvY2tldG1hcCA9IGFzeW5jb3JlLnNvY2tldF9tYXAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhc3luY29yZS5zb2NrZXRfbWFwID0gdGVzdG1hcAorICAgICAgICAgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbCgpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRlc3RtYXAsIGFzeW5jb3JlLnNvY2tldF9tYXAgPSBhc3luY29yZS5zb2NrZXRfbWFwLCBzb2NrZXRtYXAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbCh0ZXN0bWFwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RtYXApLCAwKQorCisgICAgICAgIGZvciBjIGluIGw6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc29ja2V0LmNsb3NlZCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2NvbXBhY3RfdHJhY2ViYWNrKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkkgZG9uJ3QgbGlrZSBzcGFtISIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJlYWxfdCwgcmVhbF92LCByZWFsX3RiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHIgPSBhc3luY29yZS5jb21wYWN0X3RyYWNlYmFjaygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgKGYsIGZ1bmN0aW9uLCBsaW5lKSwgdCwgdiwgaW5mbyA9IHIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLnNwbGl0KGYpWy0xXSwgJ3Rlc3RfYXN5bmNvcmUucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmN0aW9uLCAndGVzdF9jb21wYWN0X3RyYWNlYmFjaycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgcmVhbF90KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIHJlYWxfdikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvLCAnWyVzfCVzfCVzXScgJSAoZiwgZnVuY3Rpb24sIGxpbmUpKQorCisKK2NsYXNzIERpc3BhdGNoZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbCgpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgZCA9IGFzeW5jb3JlLmRpc3BhdGNoZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucmVhZGFibGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLndyaXRhYmxlKCksIFRydWUpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBkID0gYXN5bmNvcmUuZGlzcGF0Y2hlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkKSwgJzxhc3luY29yZS5kaXNwYXRjaGVyIGF0ICUjeD4nICUgaWQoZCkpCisKKyAgICBkZWYgdGVzdF9sb2coc2VsZik6CisgICAgICAgIGQgPSBhc3luY29yZS5kaXNwYXRjaGVyKCkKKworICAgICAgICAjIGNhcHR1cmUgb3V0cHV0IG9mIGRpc3BhdGNoZXIubG9nKCkgKHRvIHN0ZGVycikKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIHN0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgbDEgPSAiTG92ZWx5IHNwYW0hIFdvbmRlcmZ1bCBzcGFtISIKKyAgICAgICAgbDIgPSAiSSBkb24ndCBsaWtlIHNwYW0hIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gZnAKKyAgICAgICAgICAgIGQubG9nKGwxKQorICAgICAgICAgICAgZC5sb2cobDIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gc3RkZXJyCisKKyAgICAgICAgbGluZXMgPSBmcC5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbJ2xvZzogJXMnICUgbDEsICdsb2c6ICVzJyAlIGwyXSkKKworICAgIGRlZiB0ZXN0X2xvZ19pbmZvKHNlbGYpOgorICAgICAgICBkID0gYXN5bmNvcmUuZGlzcGF0Y2hlcigpCisKKyAgICAgICAgIyBjYXB0dXJlIG91dHB1dCBvZiBkaXNwYXRjaGVyLmxvZ19pbmZvKCkgKHRvIHN0ZG91dCB2aWEgcHJpbnQpCisgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGwxID0gIkhhdmUgeW91IGdvdCBhbnl0aGluZyB3aXRob3V0IHNwYW0/IgorICAgICAgICBsMiA9ICJXaHkgY2FuJ3Qgc2hlIGhhdmUgZWdnIGJhY29uIHNwYW0gYW5kIHNhdXNhZ2U/IgorICAgICAgICBsMyA9ICJUSEFUJ1MgZ290IHNwYW0gaW4gaXQhIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gZnAKKyAgICAgICAgICAgIGQubG9nX2luZm8obDEsICdFR0dTJykKKyAgICAgICAgICAgIGQubG9nX2luZm8obDIpCisgICAgICAgICAgICBkLmxvZ19pbmZvKGwzLCAnU1BBTScpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisKKyAgICAgICAgbGluZXMgPSBmcC5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKQorICAgICAgICBleHBlY3RlZCA9IFsnRUdHUzogJXMnICUgbDEsICdpbmZvOiAlcycgJSBsMiwgJ1NQQU06ICVzJyAlIGwzXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfdW5oYW5kbGVkKHNlbGYpOgorICAgICAgICBkID0gYXN5bmNvcmUuZGlzcGF0Y2hlcigpCisgICAgICAgIGQuaWdub3JlX2xvZ190eXBlcyA9ICgpCisKKyAgICAgICAgIyBjYXB0dXJlIG91dHB1dCBvZiBkaXNwYXRjaGVyLmxvZ19pbmZvKCkgKHRvIHN0ZG91dCB2aWEgcHJpbnQpCisgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBmcAorICAgICAgICAgICAgZC5oYW5kbGVfZXhwdCgpCisgICAgICAgICAgICBkLmhhbmRsZV9yZWFkKCkKKyAgICAgICAgICAgIGQuaGFuZGxlX3dyaXRlKCkKKyAgICAgICAgICAgIGQuaGFuZGxlX2Nvbm5lY3QoKQorICAgICAgICAgICAgZC5oYW5kbGVfYWNjZXB0KCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzdGRvdXQKKworICAgICAgICBsaW5lcyA9IGZwLmdldHZhbHVlKCkuc3BsaXRsaW5lcygpCisgICAgICAgIGV4cGVjdGVkID0gWyd3YXJuaW5nOiB1bmhhbmRsZWQgaW5jb21pbmcgcHJpb3JpdHkgZXZlbnQnLAorICAgICAgICAgICAgICAgICAgICAnd2FybmluZzogdW5oYW5kbGVkIHJlYWQgZXZlbnQnLAorICAgICAgICAgICAgICAgICAgICAnd2FybmluZzogdW5oYW5kbGVkIHdyaXRlIGV2ZW50JywKKyAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmc6IHVuaGFuZGxlZCBjb25uZWN0IGV2ZW50JywKKyAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmc6IHVuaGFuZGxlZCBhY2NlcHQgZXZlbnQnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2lzc3VlXzg1OTQoc2VsZik6CisgICAgICAgICMgWFhYIC0gdGhpcyB0ZXN0IGlzIHN1cHBvc2VkIHRvIGJlIHJlbW92ZWQgaW4gbmV4dCBtYWpvciBQeXRob24KKyAgICAgICAgIyB2ZXJzaW9uCisgICAgICAgIGQgPSBhc3luY29yZS5kaXNwYXRjaGVyKHNvY2tldC5zb2NrZXQoKSkKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGVycm9yIG1lc3NhZ2Ugbm8gbG9uZ2VyIHJlZmVycyB0byB0aGUgc29ja2V0CisgICAgICAgICMgb2JqZWN0IGJ1dCB0aGUgZGlzcGF0Y2hlciBpbnN0YW5jZSBpbnN0ZWFkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKEF0dHJpYnV0ZUVycm9yLCAnZGlzcGF0Y2hlciBpbnN0YW5jZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIsIGQsICdmb28nKQorICAgICAgICAjIGNoZWFwIGluaGVyaXRhbmNlIHdpdGggdGhlIHVuZGVybHlpbmcgc29ja2V0IGlzIHN1cHBvc2VkCisgICAgICAgICMgdG8gc3RpbGwgd29yayBidXQgYSBEZXByZWNhdGlvbldhcm5pbmcgaXMgZXhwZWN0ZWQKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgIGZhbWlseSA9IGQuZmFtaWx5CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZhbWlseSwgc29ja2V0LkFGX0lORVQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHdbMF0uY2F0ZWdvcnksIERlcHJlY2F0aW9uV2FybmluZykpCisKKyAgICBkZWYgdGVzdF9zdHJlcnJvcihzZWxmKToKKyAgICAgICAgIyByZWZlcnMgdG8gYnVnICM4NTczCisgICAgICAgIGVyciA9IGFzeW5jb3JlLl9zdHJlcnJvcihlcnJuby5FUEVSTSkKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3N0cmVycm9yJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgb3Muc3RyZXJyb3IoZXJybm8uRVBFUk0pKQorICAgICAgICBlcnIgPSBhc3luY29yZS5fc3RyZXJyb3IoLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnIgIT0gIiIpCisKKworY2xhc3MgZGlzcGF0Y2hlcndpdGhzZW5kX25vcmVhZChhc3luY29yZS5kaXNwYXRjaGVyX3dpdGhfc2VuZCk6CisgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBEaXNwYXRjaGVyV2l0aFNlbmRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgdXNlcG9sbCA9IEZhbHNlCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgYXN5bmNvcmUuY2xvc2VfYWxsKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgQHRlc3Rfc3VwcG9ydC5yZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF9zZW5kKHNlbGYpOgorICAgICAgICBldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzb2NrLnNldHRpbWVvdXQoMykKKyAgICAgICAgcG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc29jaykKKworICAgICAgICBjYXAgPSBTdHJpbmdJTygpCisgICAgICAgIGFyZ3MgPSAoZXZ0LCBjYXAsIHNvY2spCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1jYXB0dXJlX3NlcnZlciwgYXJncz1hcmdzKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyB3YWl0IGEgbGl0dGxlIGxvbmdlciBmb3IgdGhlIHNlcnZlciB0byBpbml0aWFsaXplIChpdCBzb21ldGltZXMKKyAgICAgICAgICAgICMgcmVmdXNlcyBjb25uZWN0aW9ucyBvbiBzbG93IG1hY2hpbmVzIHdpdGhvdXQgdGhpcyB3YWl0KQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjIpCisKKyAgICAgICAgICAgIGRhdGEgPSAiU3VwcG9zZSB0aGVyZSBpc24ndCBhIDE2LXRvbiB3ZWlnaHQ/IgorICAgICAgICAgICAgZCA9IGRpc3BhdGNoZXJ3aXRoc2VuZF9ub3JlYWQoKQorICAgICAgICAgICAgZC5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBkLmNvbm5lY3QoKEhPU1QsIHBvcnQpKQorCisgICAgICAgICAgICAjIGdpdmUgdGltZSBmb3Igc29ja2V0IHRvIGNvbm5lY3QKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgICAgICAgICBkLnNlbmQoZGF0YSkKKyAgICAgICAgICAgIGQuc2VuZChkYXRhKQorICAgICAgICAgICAgZC5zZW5kKCdcbicpCisKKyAgICAgICAgICAgIG4gPSAxMDAwCisgICAgICAgICAgICB3aGlsZSBkLm91dF9idWZmZXIgYW5kIG4gPiAwOgorICAgICAgICAgICAgICAgIGFzeW5jb3JlLnBvbGwoKQorICAgICAgICAgICAgICAgIG4gLT0gMQorCisgICAgICAgICAgICBldnQud2FpdCgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FwLmdldHZhbHVlKCksIGRhdGEqMikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHQuam9pbigpCisKKworY2xhc3MgRGlzcGF0Y2hlcldpdGhTZW5kVGVzdHNfVXNlUG9sbChEaXNwYXRjaGVyV2l0aFNlbmRUZXN0cyk6CisgICAgdXNlcG9sbCA9IFRydWUKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihhc3luY29yZSwgJ2ZpbGVfd3JhcHBlcicpLAorICAgICAgICAgICAgICAgICAgICAgJ2FzeW5jb3JlLmZpbGVfd3JhcHBlciByZXF1aXJlZCcpCitjbGFzcyBGaWxlV3JhcHBlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kID0gIkl0J3Mgbm90IGRlYWQsIGl0J3Mgc2xlZXBpbmchIgorICAgICAgICB3aXRoIGZpbGUoVEVTVEZOLCAndycpIGFzIGg6CisgICAgICAgICAgICBoLndyaXRlKHNlbGYuZCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X3JlY3Yoc2VsZik6CisgICAgICAgIGZkID0gb3Mub3BlbihURVNURk4sIG9zLk9fUkRPTkxZKQorICAgICAgICB3ID0gYXN5bmNvcmUuZmlsZV93cmFwcGVyKGZkKQorICAgICAgICBvcy5jbG9zZShmZCkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHcuZmQsIGZkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHcuZmlsZW5vKCksIGZkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcucmVjdigxMyksICJJdCdzIG5vdCBkZWFkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3LnJlYWQoNiksICIsIGl0J3MiKQorICAgICAgICB3LmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgdy5yZWFkLCAxKQorCisKKyAgICBkZWYgdGVzdF9zZW5kKHNlbGYpOgorICAgICAgICBkMSA9ICJDb21lIGFnYWluPyIKKyAgICAgICAgZDIgPSAiSSB3YW50IHRvIGJ1eSBzb21lIGNoZWVzZS4iCisgICAgICAgIGZkID0gb3Mub3BlbihURVNURk4sIG9zLk9fV1JPTkxZIHwgb3MuT19BUFBFTkQpCisgICAgICAgIHcgPSBhc3luY29yZS5maWxlX3dyYXBwZXIoZmQpCisgICAgICAgIG9zLmNsb3NlKGZkKQorCisgICAgICAgIHcud3JpdGUoZDEpCisgICAgICAgIHcuc2VuZChkMikKKyAgICAgICAgdy5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZShURVNURk4pLnJlYWQoKSwgc2VsZi5kICsgZDEgKyBkMikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIoYXN5bmNvcmUsICdmaWxlX2Rpc3BhdGNoZXInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYXN5bmNvcmUuZmlsZV9kaXNwYXRjaGVyIHJlcXVpcmVkJykKKyAgICBkZWYgdGVzdF9kaXNwYXRjaGVyKHNlbGYpOgorICAgICAgICBmZCA9IG9zLm9wZW4oVEVTVEZOLCBvcy5PX1JET05MWSkKKyAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIGNsYXNzIEZpbGVEaXNwYXRjaGVyKGFzeW5jb3JlLmZpbGVfZGlzcGF0Y2hlcik6CisgICAgICAgICAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgICAgICAgICAgZGF0YS5hcHBlbmQoc2VsZi5yZWN2KDI5KSkKKyAgICAgICAgcyA9IEZpbGVEaXNwYXRjaGVyKGZkKQorICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgYXN5bmNvcmUubG9vcCh0aW1lb3V0PTAuMDEsIHVzZV9wb2xsPVRydWUsIGNvdW50PTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiIiLmpvaW4oZGF0YSksIHNlbGYuZCkKKworCitjbGFzcyBCYXNlVGVzdEhhbmRsZXIoYXN5bmNvcmUuZGlzcGF0Y2hlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc29jaz1Ob25lKToKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmLCBzb2NrKQorICAgICAgICBzZWxmLmZsYWcgPSBGYWxzZQorCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiaGFuZGxlX2FjY2VwdCBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIikKKworICAgIGRlZiBoYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJoYW5kbGVfY29ubmVjdCBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIikKKworICAgIGRlZiBoYW5kbGVfZXhwdChzZWxmKToKKyAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCJoYW5kbGVfZXhwdCBub3Qgc3VwcG9zZWQgdG8gYmUgY2FsbGVkIikKKworICAgIGRlZiBoYW5kbGVfY2xvc2Uoc2VsZik6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiaGFuZGxlX2Nsb3NlIG5vdCBzdXBwb3NlZCB0byBiZSBjYWxsZWQiKQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgcmFpc2UKKworCitjbGFzcyBUQ1BTZXJ2ZXIoYXN5bmNvcmUuZGlzcGF0Y2hlcik6CisgICAgIiIiQSBzZXJ2ZXIgd2hpY2ggbGlzdGVucyBvbiBhbiBhZGRyZXNzIGFuZCBkaXNwYXRjaGVzIHRoZQorICAgIGNvbm5lY3Rpb24gdG8gYSBoYW5kbGVyLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhhbmRsZXI9QmFzZVRlc3RIYW5kbGVyLCBob3N0PUhPU1QsIHBvcnQ9MCk6CisgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc2V0X3JldXNlX2FkZHIoKQorICAgICAgICBzZWxmLmJpbmQoKGhvc3QsIHBvcnQpKQorICAgICAgICBzZWxmLmxpc3Rlbig1KQorICAgICAgICBzZWxmLmhhbmRsZXIgPSBoYW5kbGVyCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgYWRkcmVzcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKClbOjJdCisKKyAgICBkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKKyAgICAgICAgcGFpciA9IHNlbGYuYWNjZXB0KCkKKyAgICAgICAgaWYgcGFpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlcihwYWlyWzBdKQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgcmFpc2UKKworCitjbGFzcyBCYXNlQ2xpZW50KEJhc2VUZXN0SGFuZGxlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcyk6CisgICAgICAgIEJhc2VUZXN0SGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5jb25uZWN0KGFkZHJlc3MpCisKKyAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBCYXNlVGVzdEFQSSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbCgpCisKKyAgICBkZWYgbG9vcF93YWl0aW5nX2Zvcl9mbGFnKHNlbGYsIGluc3RhbmNlLCB0aW1lb3V0PTUpOgorICAgICAgICB0aW1lb3V0ID0gZmxvYXQodGltZW91dCkgLyAxMDAKKyAgICAgICAgY291bnQgPSAxMDAKKyAgICAgICAgd2hpbGUgYXN5bmNvcmUuc29ja2V0X21hcCBhbmQgY291bnQgPiAwOgorICAgICAgICAgICAgYXN5bmNvcmUubG9vcCh0aW1lb3V0PTAuMDEsIGNvdW50PTEsIHVzZV9wb2xsPXNlbGYudXNlX3BvbGwpCisgICAgICAgICAgICBpZiBpbnN0YW5jZS5mbGFnOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgY291bnQgLT0gMQorICAgICAgICAgICAgdGltZS5zbGVlcCh0aW1lb3V0KQorICAgICAgICBzZWxmLmZhaWwoImZsYWcgbm90IHNldCIpCisKKyAgICBkZWYgdGVzdF9oYW5kbGVfY29ubmVjdChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgaGFuZGxlX2Nvbm5lY3QgaXMgY2FsbGVkIG9uIGNvbm5lY3QoKQorCisgICAgICAgIGNsYXNzIFRlc3RDbGllbnQoQmFzZUNsaWVudCk6CisgICAgICAgICAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnID0gVHJ1ZQorCisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcigpCisgICAgICAgIGNsaWVudCA9IFRlc3RDbGllbnQoc2VydmVyLmFkZHJlc3MpCisgICAgICAgIHNlbGYubG9vcF93YWl0aW5nX2Zvcl9mbGFnKGNsaWVudCkKKworICAgIGRlZiB0ZXN0X2hhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIGhhbmRsZV9hY2NlcHQoKSBpcyBjYWxsZWQgd2hlbiBhIGNsaWVudCBjb25uZWN0cworCisgICAgICAgIGNsYXNzIFRlc3RMaXN0ZW5lcihCYXNlVGVzdEhhbmRsZXIpOgorCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgQmFzZVRlc3RIYW5kbGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICAgICAgc2VsZi5iaW5kKChIT1NULCAwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbig1KQorICAgICAgICAgICAgICAgIHNlbGYuYWRkcmVzcyA9IHNlbGYuc29ja2V0LmdldHNvY2tuYW1lKClbOjJdCisKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZyA9IFRydWUKKworICAgICAgICBzZXJ2ZXIgPSBUZXN0TGlzdGVuZXIoKQorICAgICAgICBjbGllbnQgPSBCYXNlQ2xpZW50KHNlcnZlci5hZGRyZXNzKQorICAgICAgICBzZWxmLmxvb3Bfd2FpdGluZ19mb3JfZmxhZyhzZXJ2ZXIpCisKKyAgICBkZWYgdGVzdF9oYW5kbGVfcmVhZChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgaGFuZGxlX3JlYWQgaXMgY2FsbGVkIG9uIGRhdGEgcmVjZWl2ZWQKKworICAgICAgICBjbGFzcyBUZXN0Q2xpZW50KEJhc2VDbGllbnQpOgorICAgICAgICAgICAgZGVmIGhhbmRsZV9yZWFkKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZyA9IFRydWUKKworICAgICAgICBjbGFzcyBUZXN0SGFuZGxlcihCYXNlVGVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4pOgorICAgICAgICAgICAgICAgIEJhc2VUZXN0SGFuZGxlci5fX2luaXRfXyhzZWxmLCBjb25uKQorICAgICAgICAgICAgICAgIHNlbGYuc2VuZCgneCcgKiAxMDI0KQorCisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcihUZXN0SGFuZGxlcikKKyAgICAgICAgY2xpZW50ID0gVGVzdENsaWVudChzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgc2VsZi5sb29wX3dhaXRpbmdfZm9yX2ZsYWcoY2xpZW50KQorCisgICAgZGVmIHRlc3RfaGFuZGxlX3dyaXRlKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBoYW5kbGVfd3JpdGUgaXMgY2FsbGVkCisKKyAgICAgICAgY2xhc3MgVGVzdENsaWVudChCYXNlQ2xpZW50KToKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfd3JpdGUoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnID0gVHJ1ZQorCisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcigpCisgICAgICAgIGNsaWVudCA9IFRlc3RDbGllbnQoc2VydmVyLmFkZHJlc3MpCisgICAgICAgIHNlbGYubG9vcF93YWl0aW5nX2Zvcl9mbGFnKGNsaWVudCkKKworICAgIGRlZiB0ZXN0X2hhbmRsZV9jbG9zZShzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgaGFuZGxlX2Nsb3NlIGlzIGNhbGxlZCB3aGVuIHRoZSBvdGhlciBlbmQgY2xvc2VzCisgICAgICAgICMgdGhlIGNvbm5lY3Rpb24KKworICAgICAgICBjbGFzcyBUZXN0Q2xpZW50KEJhc2VDbGllbnQpOgorCisgICAgICAgICAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgICAgICAgICAgIyBpbiBvcmRlciB0byBtYWtlIGhhbmRsZV9jbG9zZSBiZSBjYWxsZWQgd2UgYXJlIHN1cHBvc2VkCisgICAgICAgICAgICAgICAgIyB0byBtYWtlIGF0IGxlYXN0IG9uZSByZWN2KCkgY2FsbAorICAgICAgICAgICAgICAgIHNlbGYucmVjdigxMDI0KQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX2Nsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZyA9IFRydWUKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgICAgICBjbGFzcyBUZXN0SGFuZGxlcihCYXNlVGVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4pOgorICAgICAgICAgICAgICAgIEJhc2VUZXN0SGFuZGxlci5fX2luaXRfXyhzZWxmLCBjb25uKQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcihUZXN0SGFuZGxlcikKKyAgICAgICAgY2xpZW50ID0gVGVzdENsaWVudChzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgc2VsZi5sb29wX3dhaXRpbmdfZm9yX2ZsYWcoY2xpZW50KQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgic3Vub3MiKSwKKyAgICAgICAgICAgICAgICAgICAgICJPT0Igc3VwcG9ydCBpcyBicm9rZW4gb24gU29sYXJpcyIpCisgICAgZGVmIHRlc3RfaGFuZGxlX2V4cHQoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGhhbmRsZV9leHB0IGlzIGNhbGxlZCBvbiBPT0IgZGF0YSByZWNlaXZlZC4KKyAgICAgICAgIyBOb3RlOiB0aGlzIG1pZ2h0IGZhaWwgb24gc29tZSBwbGF0Zm9ybXMgYXMgT09CIGRhdGEgaXMKKyAgICAgICAgIyB0ZW51b3VzbHkgc3VwcG9ydGVkIGFuZCByYXJlbHkgdXNlZC4KKworICAgICAgICBjbGFzcyBUZXN0Q2xpZW50KEJhc2VDbGllbnQpOgorICAgICAgICAgICAgZGVmIGhhbmRsZV9leHB0KHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZyA9IFRydWUKKworICAgICAgICBjbGFzcyBUZXN0SGFuZGxlcihCYXNlVGVzdEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4pOgorICAgICAgICAgICAgICAgIEJhc2VUZXN0SGFuZGxlci5fX2luaXRfXyhzZWxmLCBjb25uKQorICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0LnNlbmQoY2hyKDI0NCksIHNvY2tldC5NU0dfT09CKQorCisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcihUZXN0SGFuZGxlcikKKyAgICAgICAgY2xpZW50ID0gVGVzdENsaWVudChzZXJ2ZXIuYWRkcmVzcykKKyAgICAgICAgc2VsZi5sb29wX3dhaXRpbmdfZm9yX2ZsYWcoY2xpZW50KQorCisgICAgZGVmIHRlc3RfaGFuZGxlX2Vycm9yKHNlbGYpOgorCisgICAgICAgIGNsYXNzIFRlc3RDbGllbnQoQmFzZUNsaWVudCk6CisgICAgICAgICAgICBkZWYgaGFuZGxlX3dyaXRlKHNlbGYpOgorICAgICAgICAgICAgICAgIDEuMCAvIDAKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mbGFnID0gVHJ1ZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oImV4Y2VwdGlvbiBub3QgcmFpc2VkIikKKworICAgICAgICBzZXJ2ZXIgPSBUQ1BTZXJ2ZXIoKQorICAgICAgICBjbGllbnQgPSBUZXN0Q2xpZW50KHNlcnZlci5hZGRyZXNzKQorICAgICAgICBzZWxmLmxvb3Bfd2FpdGluZ19mb3JfZmxhZyhjbGllbnQpCisKKyAgICBkZWYgdGVzdF9jb25uZWN0aW9uX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHNlcnZlciA9IFRDUFNlcnZlcigpCisgICAgICAgIGNsaWVudCA9IEJhc2VDbGllbnQoc2VydmVyLmFkZHJlc3MpCisKKyAgICAgICAgIyB3ZSBzdGFydCBkaXNjb25uZWN0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXJ2ZXIuY29ubmVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VydmVyLmFjY2VwdGluZykKKyAgICAgICAgIyB0aGlzIGNhbid0IGJlIHRha2VuIGZvciBncmFudGVkIGFjcm9zcyBhbGwgcGxhdGZvcm1zCisgICAgICAgICNzZWxmLmFzc2VydEZhbHNlKGNsaWVudC5jb25uZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2xpZW50LmFjY2VwdGluZykKKworICAgICAgICAjIGV4ZWN1dGUgc29tZSBsb29wcyBzbyB0aGF0IGNsaWVudCBjb25uZWN0cyB0byBzZXJ2ZXIKKyAgICAgICAgYXN5bmNvcmUubG9vcCh0aW1lb3V0PTAuMDEsIHVzZV9wb2xsPXNlbGYudXNlX3BvbGwsIGNvdW50PTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXJ2ZXIuY29ubmVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VydmVyLmFjY2VwdGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsaWVudC5jb25uZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2xpZW50LmFjY2VwdGluZykKKworICAgICAgICAjIGRpc2Nvbm5lY3QgdGhlIGNsaWVudAorICAgICAgICBjbGllbnQuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlcnZlci5jb25uZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXJ2ZXIuYWNjZXB0aW5nKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNsaWVudC5jb25uZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2xpZW50LmFjY2VwdGluZykKKworICAgICAgICAjIHN0b3Agc2VydmluZworICAgICAgICBzZXJ2ZXIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlcnZlci5jb25uZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VydmVyLmFjY2VwdGluZykKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9zb2NrZXQoc2VsZik6CisgICAgICAgIHMgPSBhc3luY29yZS5kaXNwYXRjaGVyKCkKKyAgICAgICAgcy5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zb2NrZXQuZmFtaWx5LCBzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnNvY2tldC50eXBlLCBzb2NrZXQuU09DS19TVFJFQU0pCisKKyAgICBkZWYgdGVzdF9iaW5kKHNlbGYpOgorICAgICAgICBzMSA9IGFzeW5jb3JlLmRpc3BhdGNoZXIoKQorICAgICAgICBzMS5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHMxLmJpbmQoKEhPU1QsIDApKQorICAgICAgICBzMS5saXN0ZW4oNSkKKyAgICAgICAgcG9ydCA9IHMxLnNvY2tldC5nZXRzb2NrbmFtZSgpWzFdCisKKyAgICAgICAgczIgPSBhc3luY29yZS5kaXNwYXRjaGVyKCkKKyAgICAgICAgczIuY3JlYXRlX3NvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICAjIEVBRERSSU5VU0UgaW5kaWNhdGVzIHRoZSBzb2NrZXQgd2FzIGNvcnJlY3RseSBib3VuZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHMyLmJpbmQsIChIT1NULCBwb3J0KSkKKworICAgIGRlZiB0ZXN0X3NldF9yZXVzZV9hZGRyKHNlbGYpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2suc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX1JFVVNFQUREUiwgMSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHVuaXR0ZXN0LnNraXAoIlNPX1JFVVNFQUREUiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBpZiBTT19SRVVTRUFERFIgc3VjY2VlZGVkIGZvciBzb2NrIHdlIGV4cGVjdCBhc3luY29yZQorICAgICAgICAgICAgIyB0byBkbyB0aGUgc2FtZQorICAgICAgICAgICAgcyA9IGFzeW5jb3JlLmRpc3BhdGNoZXIoc29ja2V0LnNvY2tldCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLnNvY2tldC5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5TT19SRVVTRUFERFIpKQorICAgICAgICAgICAgcy5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBzLnNldF9yZXVzZV9hZGRyKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnNvY2tldC5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldC5TT19SRVVTRUFERFIpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29jay5jbG9zZSgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorICAgIEB0ZXN0X3N1cHBvcnQucmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3RfcXVpY2tfY29ubmVjdChzZWxmKToKKyAgICAgICAgIyBzZWU6IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxMDM0MAorICAgICAgICBzZXJ2ZXIgPSBUQ1BTZXJ2ZXIoKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9bGFtYmRhOiBhc3luY29yZS5sb29wKHRpbWVvdXQ9MC4xLCBjb3VudD01MDApKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHQuam9pbikKKworICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoMjApOgorICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgICAgIHMuc2V0dGltZW91dCguMikKKyAgICAgICAgICAgIHMuc2V0c29ja29wdChzb2NrZXQuU09MX1NPQ0tFVCwgc29ja2V0LlNPX0xJTkdFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QucGFjaygnaWknLCAxLCAwKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3Qoc2VydmVyLmFkZHJlc3MpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKworY2xhc3MgVGVzdEFQSV9Vc2VTZWxlY3QoQmFzZVRlc3RBUEkpOgorICAgIHVzZV9wb2xsID0gRmFsc2UKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzZWxlY3QsICdwb2xsJyksICdzZWxlY3QucG9sbCByZXF1aXJlZCcpCitjbGFzcyBUZXN0QVBJX1VzZVBvbGwoQmFzZVRlc3RBUEkpOgorICAgIHVzZV9wb2xsID0gVHJ1ZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0cyA9IFtIZWxwZXJGdW5jdGlvblRlc3RzLCBEaXNwYXRjaGVyVGVzdHMsIERpc3BhdGNoZXJXaXRoU2VuZFRlc3RzLAorICAgICAgICAgICAgIERpc3BhdGNoZXJXaXRoU2VuZFRlc3RzX1VzZVBvbGwsIFRlc3RBUElfVXNlU2VsZWN0LAorICAgICAgICAgICAgIFRlc3RBUElfVXNlUG9sbCwgRmlsZVdyYXBwZXJUZXN0XQorICAgIHJ1bl91bml0dGVzdCgqdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jb3JlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jb3JlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZjMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jb3JlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2FzeW5jb3JlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZjMTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXN5bmNvcmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F0ZXhpdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F0ZXhpdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjg1Yjc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5CkBAIC0wLDAgKzEsODIgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgYXRleGl0Citmcm9tIGltcCBpbXBvcnQgcmVsb2FkCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzZWxmLnNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLnNhdmVfc3RkZXJyID0gc3lzLnN0ZGVycgorICAgICAgICBzeXMuc3Rkb3V0ID0gc3lzLnN0ZGVyciA9IHNlbGYuc3Vic3RfaW8gPSBzCisgICAgICAgIHNlbGYuc2F2ZV9oYW5kbGVycyA9IGF0ZXhpdC5fZXhpdGhhbmRsZXJzCisgICAgICAgIGF0ZXhpdC5fZXhpdGhhbmRsZXJzID0gW10KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuc2F2ZV9zdGRvdXQKKyAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuc2F2ZV9zdGRlcnIKKyAgICAgICAgYXRleGl0Ll9leGl0aGFuZGxlcnMgPSBzZWxmLnNhdmVfaGFuZGxlcnMKKworICAgIGRlZiB0ZXN0X2FyZ3Moc2VsZik6CisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLmgxKQorICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5oNCkKKyAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuaDQsIDQsIGt3PSJhYmMiKQorICAgICAgICBhdGV4aXQuX3J1bl9leGl0ZnVuY3MoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3Vic3RfaW8uZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaDQgKDQsKSB7J2t3JzogJ2FiYyd9XG5oNCAoKSB7fVxuaDFcbiIpCisKKyAgICBkZWYgdGVzdF9iYWRhcmdzKHNlbGYpOgorICAgICAgICBhdGV4aXQucmVnaXN0ZXIobGFtYmRhOiAxLCAwLCAwLCAoeCBmb3IgeCBpbiAoMSwyKSksIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXRleGl0Ll9ydW5fZXhpdGZ1bmNzKQorCisgICAgZGVmIHRlc3Rfb3JkZXIoc2VsZik6CisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLmgxKQorICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5oMikKKyAgICAgICAgYXRleGl0LnJlZ2lzdGVyKHNlbGYuaDMpCisgICAgICAgIGF0ZXhpdC5fcnVuX2V4aXRmdW5jcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdWJzdF9pby5nZXR2YWx1ZSgpLCAiaDNcbmgyXG5oMVxuIikKKworICAgIGRlZiB0ZXN0X3N5c19vdmVycmlkZShzZWxmKToKKyAgICAgICAgIyBiZSBzdXJlIGEgcHJlc2V0IHN5cy5leGl0ZnVuYyBpcyBoYW5kbGVkIHByb3Blcmx5CisgICAgICAgIGV4ZnVuYyA9IHN5cy5leGl0ZnVuYworICAgICAgICBzeXMuZXhpdGZ1bmMgPSBzZWxmLmgxCisgICAgICAgIHJlbG9hZChhdGV4aXQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLmgyKQorICAgICAgICAgICAgYXRleGl0Ll9ydW5fZXhpdGZ1bmNzKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5leGl0ZnVuYyA9IGV4ZnVuYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3Vic3RfaW8uZ2V0dmFsdWUoKSwgImgyXG5oMVxuIikKKworICAgIGRlZiB0ZXN0X3JhaXNlKHNlbGYpOgorICAgICAgICBhdGV4aXQucmVnaXN0ZXIoc2VsZi5yYWlzZTEpCisgICAgICAgIGF0ZXhpdC5yZWdpc3RlcihzZWxmLnJhaXNlMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhdGV4aXQuX3J1bl9leGl0ZnVuY3MpCisKKyAgICAjIyMgaGVscGVycworICAgIGRlZiBoMShzZWxmKToKKyAgICAgICAgcHJpbnQgImgxIgorCisgICAgZGVmIGgyKHNlbGYpOgorICAgICAgICBwcmludCAiaDIiCisKKyAgICBkZWYgaDMoc2VsZik6CisgICAgICAgIHByaW50ICJoMyIKKworICAgIGRlZiBoNChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBwcmludCAiaDQiLCBhcmdzLCBrd2FyZ3MKKworICAgIGRlZiByYWlzZTEoc2VsZik6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorCisgICAgZGVmIHJhaXNlMihzZWxmKToKKyAgICAgICAgcmFpc2UgU3lzdGVtRXJyb3IKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F0ZXhpdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliMTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F0ZXhpdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXRleGl0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F0ZXhpdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDliMTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F0ZXhpdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1ZGlvb3AucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVhNTE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1ZGlvb3AucHkKQEAgLTAsMCArMSwzOTMgQEAKK2ltcG9ydCBhdWRpb29wCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzdHJ1Y3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisKK2Zvcm1hdHMgPSB7CisgICAgMTogJ2InLAorICAgIDI6ICdoJywKKyAgICA0OiAnaScsCit9CisKK2RlZiBwYWNrKHdpZHRoLCBkYXRhKToKKyAgICByZXR1cm4gc3RydWN0LnBhY2soJz0lZCVzJyAlIChsZW4oZGF0YSksIGZvcm1hdHNbd2lkdGhdKSwgKmRhdGEpCisKK3BhY2tzID0geworICAgIDE6IGxhbWJkYSAqZGF0YTogcGFjaygxLCBkYXRhKSwKKyAgICAyOiBsYW1iZGEgKmRhdGE6IHBhY2soMiwgZGF0YSksCisgICAgNDogbGFtYmRhICpkYXRhOiBwYWNrKDQsIGRhdGEpLAorfQorbWF4dmFsdWVzID0ge3c6ICgxIDw8ICg4ICogdyAtIDEpKSAtIDEgZm9yIHcgaW4gKDEsIDIsIDQpfQorbWludmFsdWVzID0ge3c6IC0xIDw8ICg4ICogdyAtIDEpIGZvciB3IGluICgxLCAyLCA0KX0KKworZGF0YXMgPSB7CisgICAgMTogYidceDAwXHgxMlx4NDVceGJiXHg3Zlx4ODBceGZmJywKKyAgICAyOiBwYWNrc1syXSgwLCAweDEyMzQsIDB4NDU2NywgLTB4NDU2NywgMHg3ZmZmLCAtMHg4MDAwLCAtMSksCisgICAgNDogcGFja3NbNF0oMCwgMHgxMjM0NTY3OCwgMHg0NTY3ODlhYiwgLTB4NDU2Nzg5YWIsCisgICAgICAgICAgICAgICAgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsIC0xKSwKK30KKworSU5WQUxJRF9EQVRBID0gWworICAgIChiJ2FiYycsIDApLAorICAgIChiJ2FiYycsIDIpLAorICAgIChiJ2FiYycsIDQpLAorXQorCisKK2NsYXNzIFRlc3RBdWRpb29wKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X21heChzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tYXgoYicnLCB3KSwgMCkKKyAgICAgICAgICAgIHAgPSBwYWNrc1t3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChwKDUpLCB3KSwgNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tYXgocCg1LCAtOCwgLTEpLCB3KSwgOCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tYXgocChtYXh2YWx1ZXNbd10pLCB3KSwgbWF4dmFsdWVzW3ddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChwKG1pbnZhbHVlc1t3XSksIHcpLCAtbWludmFsdWVzW3ddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heChkYXRhc1t3XSwgdyksIC1taW52YWx1ZXNbd10pCisKKyAgICBkZWYgdGVzdF9taW5tYXgoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWlubWF4KGInJywgdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDdmZmZmZmZmLCAtMHg4MDAwMDAwMCkpCisgICAgICAgICAgICBwID0gcGFja3Nbd10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgocCg1KSwgdyksICg1LCA1KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgocCg1LCAtOCwgLTEpLCB3KSwgKC04LCA1KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgocChtYXh2YWx1ZXNbd10pLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heHZhbHVlc1t3XSwgbWF4dmFsdWVzW3ddKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgocChtaW52YWx1ZXNbd10pLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbnZhbHVlc1t3XSwgbWludmFsdWVzW3ddKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5taW5tYXgoZGF0YXNbd10sIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWludmFsdWVzW3ddLCBtYXh2YWx1ZXNbd10pKQorCisgICAgZGVmIHRlc3RfbWF4cHAoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubWF4cHAoYicnLCB3KSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tYXhwcChwYWNrc1t3XSgqcmFuZ2UoMTAwKSksIHcpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heHBwKHBhY2tzW3ddKDksIDEwLCA1LCA1LCAwLCAxKSwgdyksIDEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm1heHBwKGRhdGFzW3ddLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4dmFsdWVzW3ddIC0gbWludmFsdWVzW3ddKQorCisgICAgZGVmIHRlc3RfYXZnKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2ZyhiJycsIHcpLCAwKQorICAgICAgICAgICAgcCA9IHBhY2tzW3ddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHAoNSksIHcpLCA1KQorICAgICAgICAgICAgc2VsZiAuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmcocCg1LCA4KSwgdyksIDYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHAoNSwgLTgpLCB3KSwgLTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZnKHAobWF4dmFsdWVzW3ddLCBtYXh2YWx1ZXNbd10pLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4dmFsdWVzW3ddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2ZyhwKG1pbnZhbHVlc1t3XSwgbWludmFsdWVzW3ddKSwgdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbnZhbHVlc1t3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2ZyhwYWNrc1s0XSgweDUwMDAwMDAwLCAweDcwMDAwMDAwKSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAwMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2ZyhwYWNrc1s0XSgtMHg1MDAwMDAwMCwgLTB4NzAwMDAwMDApLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMHg2MDAwMDAwMCkKKworICAgIGRlZiB0ZXN0X2F2Z3BwKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2Z3BwKGInJywgdyksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAocGFja3Nbd10oKnJhbmdlKDEwMCkpLCB3KSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hdmdwcChwYWNrc1t3XSg5LCAxMCwgNSwgNSwgMCwgMSksIHcpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2Z3BwKGRhdGFzWzFdLCAxKSwgMTk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYXZncHAoZGF0YXNbMl0sIDIpLCA1MDUzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmF2Z3BwKGRhdGFzWzRdLCA0KSwgMzMxMTg5NzAwMikKKworICAgIGRlZiB0ZXN0X3JtcyhzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5ybXMoYicnLCB3KSwgMCkKKyAgICAgICAgICAgIHAgPSBwYWNrc1t3XQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJtcyhwKCpyYW5nZSgxMDApKSwgdyksIDU3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChhdWRpb29wLnJtcyhwKG1heHZhbHVlc1t3XSkgKiA1LCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4dmFsdWVzW3ddLCBkZWx0YT0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChhdWRpb29wLnJtcyhwKG1pbnZhbHVlc1t3XSkgKiA1LCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLW1pbnZhbHVlc1t3XSwgZGVsdGE9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJtcyhkYXRhc1sxXSwgMSksIDc3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3Aucm1zKGRhdGFzWzJdLCAyKSwgMjAwMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5ybXMoZGF0YXNbNF0sIDQpLCAxMzEwODU0MTUyKQorCisgICAgZGVmIHRlc3RfY3Jvc3Moc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuY3Jvc3MoYicnLCB3KSwgLTEpCisgICAgICAgICAgICBwID0gcGFja3Nbd10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhwKDAsIDEsIDIpLCB3KSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhwKDEsIDIsIC0zLCAtNCksIHcpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmNyb3NzKHAoLTEsIC0yLCAzLCA0KSwgdyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuY3Jvc3MocCgwLCBtaW52YWx1ZXNbd10pLCB3KSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5jcm9zcyhwKG1pbnZhbHVlc1t3XSwgbWF4dmFsdWVzW3ddKSwgdyksIDEpCisKKyAgICBkZWYgdGVzdF9hZGQoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRkKGInJywgYicnLCB3KSwgYicnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkZChkYXRhc1t3XSwgYidcMCcgKiBsZW4oZGF0YXNbd10pLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YXNbd10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZGQoZGF0YXNbMV0sIGRhdGFzWzFdLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4MDBceDI0XHg3Zlx4ODBceDdmXHg4MFx4ZmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRkKGRhdGFzWzJdLCBkYXRhc1syXSwgMiksCisgICAgICAgICAgICAgICAgcGFja3NbMl0oMCwgMHgyNDY4LCAweDdmZmYsIC0weDgwMDAsIDB4N2ZmZiwgLTB4ODAwMCwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRkKGRhdGFzWzRdLCBkYXRhc1s0XSwgNCksCisgICAgICAgICAgICAgICAgcGFja3NbNF0oMCwgMHgyNDY4YWNmMCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCAtMikpCisKKyAgICBkZWYgdGVzdF9iaWFzKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZm9yIGJpYXMgaW4gMCwgMSwgLTEsIDEyNywgLTEyOCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoYicnLCB3LCBiaWFzKSwgYicnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1sxXSwgMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceDAxXHgxM1x4NDZceGJjXHg4MFx4ODFceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMV0sIDEsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZmZceDExXHg0NFx4YmFceDdlXHg3Zlx4ZmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1sxXSwgMSwgMHg3ZmZmZmZmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGZmXHgxMVx4NDRceGJhXHg3ZVx4N2ZceGZlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMV0sIDEsIC0weDgwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc1sxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMl0sIDIsIDEpLAorICAgICAgICAgICAgICAgIHBhY2tzWzJdKDEsIDB4MTIzNSwgMHg0NTY4LCAtMHg0NTY2LCAtMHg4MDAwLCAtMHg3ZmZmLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbMl0sIDIsIC0xKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgtMSwgMHgxMjMzLCAweDQ1NjYsIC0weDQ1NjgsIDB4N2ZmZSwgMHg3ZmZmLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzJdLCAyLCAweDdmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgtMSwgMHgxMjMzLCAweDQ1NjYsIC0weDQ1NjgsIDB4N2ZmZSwgMHg3ZmZmLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzJdLCAyLCAtMHg4MDAwMDAwMCksCisgICAgICAgICAgICAgICAgZGF0YXNbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzRdLCA0LCAxKSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgxLCAweDEyMzQ1Njc5LCAweDQ1Njc4OWFjLCAtMHg0NTY3ODlhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAtMHg4MDAwMDAwMCwgLTB4N2ZmZmZmZmYsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYmlhcyhkYXRhc1s0XSwgNCwgLTEpLAorICAgICAgICAgICAgICAgIHBhY2tzWzRdKC0xLCAweDEyMzQ1Njc3LCAweDQ1Njc4OWFhLCAtMHg0NTY3ODlhYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAweDdmZmZmZmZlLCAweDdmZmZmZmZmLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5iaWFzKGRhdGFzWzRdLCA0LCAweDdmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgweDdmZmZmZmZmLCAtMHg2ZGNiYTk4OSwgLTB4M2E5ODc2NTYsIDB4M2E5ODc2NTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgLTIsIC0xLCAweDdmZmZmZmZlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmJpYXMoZGF0YXNbNF0sIDQsIC0weDgwMDAwMDAwKSwKKyAgICAgICAgICAgICAgICBwYWNrc1s0XSgtMHg4MDAwMDAwMCwgLTB4NmRjYmE5ODgsIC0weDNhOTg3NjU1LCAweDNhOTg3NjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAwLCAweDdmZmZmZmZmKSkKKworICAgIGRlZiB0ZXN0X2xpbjJsaW4oc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmxpbihkYXRhc1t3XSwgdywgdyksIGRhdGFzW3ddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzFdLCAxLCAyKSwKKyAgICAgICAgICAgIHBhY2tzWzJdKDAsIDB4MTIwMCwgMHg0NTAwLCAtMHg0NTAwLCAweDdmMDAsIC0weDgwMDAsIC0weDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzFdLCAxLCA0KSwKKyAgICAgICAgICAgIHBhY2tzWzRdKDAsIDB4MTIwMDAwMDAsIDB4NDUwMDAwMDAsIC0weDQ1MDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgMHg3ZjAwMDAwMCwgLTB4ODAwMDAwMDAsIC0weDEwMDAwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmxpbihkYXRhc1syXSwgMiwgMSksCisgICAgICAgICAgICBiJ1x4MDBceDEyXHg0NVx4YmFceDdmXHg4MFx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmxpbihkYXRhc1syXSwgMiwgNCksCisgICAgICAgICAgICBwYWNrc1s0XSgwLCAweDEyMzQwMDAwLCAweDQ1NjcwMDAwLCAtMHg0NTY3MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZjAwMDAsIC0weDgwMDAwMDAwLCAtMHgxMDAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzRdLCA0LCAxKSwKKyAgICAgICAgICAgIGInXHgwMFx4MTJceDQ1XHhiYVx4N2ZceDgwXHhmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ybGluKGRhdGFzWzRdLCA0LCAyKSwKKyAgICAgICAgICAgIHBhY2tzWzJdKDAsIDB4MTIzNCwgMHg0NTY3LCAtMHg0NTY4LCAweDdmZmYsIC0weDgwMDAsIC0xKSkKKworICAgIGRlZiB0ZXN0X2FkcGNtMmxpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFkcGNtMmxpbihiJ1x4MDdceDdmXHg3ZicsIDEsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChiJ1x4MDBceDAwXHgwMFx4ZmZceDAwXHhmZicsICgtMTc5LCA0MCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuYWRwY20ybGluKGInXHgwN1x4N2ZceDdmJywgMiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKHBhY2tzWzJdKDAsIDB4YiwgMHgyOSwgLTB4MTYsIDB4NzIsIC0weGIzKSwgKC0xNzksIDQwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZHBjbTJsaW4oYidceDA3XHg3Zlx4N2YnLCA0LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAocGFja3NbNF0oMCwgMHhiMDAwMCwgMHgyOTAwMDAsIC0weDE2MDAwMCwgMHg3MjAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0weGIzMDAwMCksICgtMTc5LCA0MCkpKQorCisgICAgICAgICMgVmVyeSBjdXJzb3J5IHRlc3QKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5hZHBjbTJsaW4oYidcMCcgKiA1LCB3LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGInXDAnICogdyAqIDEwLCAoMCwgMCkpKQorCisgICAgZGVmIHRlc3RfbGluMmFkcGNtKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFkcGNtKGRhdGFzWzFdLCAxLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYidceDA3XHg3Zlx4N2YnLCAoLTIyMSwgMzkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJhZHBjbShkYXRhc1syXSwgMiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKGInXHgwN1x4N2ZceDdmJywgKDMxLCAzOSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFkcGNtKGRhdGFzWzRdLCA0LCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoYidceDA3XHg3Zlx4N2YnLCAoMzEsIDM5KSkpCisKKyAgICAgICAgIyBWZXJ5IGN1cnNvcnkgdGVzdAorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJhZHBjbShiJ1wwJyAqIHcgKiAxMCwgdywgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiJ1wwJyAqIDUsICgwLCAwKSkpCisKKyAgICBkZWYgdGVzdF9saW4yYWxhdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJhbGF3KGRhdGFzWzFdLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZDVceDg3XHhhNFx4MjRceGFhXHgyYVx4NWEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMmFsYXcoZGF0YXNbMl0sIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHhkNVx4ODdceGE0XHgyNFx4YWFceDJhXHg1NScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4yYWxhdyhkYXRhc1s0XSwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGQ1XHg4N1x4YTRceDI0XHhhYVx4MmFceDU1JykKKworICAgIGRlZiB0ZXN0X2FsYXcybGluKHNlbGYpOgorICAgICAgICBlbmNvZGVkID0gYidceDAwXHgwM1x4MjRceDJhXHg1MVx4NTRceDU1XHg1OFx4NmJceDcxXHg3ZidcCisgICAgICAgICAgICAgICAgICBiJ1x4ODBceDgzXHhhNFx4YWFceGQxXHhkNFx4ZDVceGQ4XHhlYlx4ZjFceGZmJworICAgICAgICBzcmMgPSBbLTY4OCwgLTcyMCwgLTIyNDAsIC00MDMyLCAtOSwgLTMsIC0xLCAtMjcsIC0yNDQsIC04MiwgLTEwNiwKKyAgICAgICAgICAgICAgIDY4OCwgNzIwLCAyMjQwLCA0MDMyLCA5LCAzLCAxLCAyNywgMjQ0LCA4MiwgMTA2XQorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmFsYXcybGluKGVuY29kZWQsIHcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrc1t3XSgqKHggPDwgKHcgKiA4KSA+PiAxMyBmb3IgeCBpbiBzcmMpKSkKKworICAgICAgICBlbmNvZGVkID0gJycuam9pbihjaHIoeCkgZm9yIHggaW4geHJhbmdlKDI1NikpCisgICAgICAgIGZvciB3IGluIDIsIDQ6CisgICAgICAgICAgICBkZWNvZGVkID0gYXVkaW9vcC5hbGF3MmxpbihlbmNvZGVkLCB3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJhbGF3KGRlY29kZWQsIHcpLCBlbmNvZGVkKQorCisgICAgZGVmIHRlc3RfbGluMnVsYXcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5saW4ydWxhdyhkYXRhc1sxXSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYidceGZmXHhhZFx4OGVceDBlXHg4MFx4MDBceDY3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJ1bGF3KGRhdGFzWzJdLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4ZmZceGFkXHg4ZVx4MGVceDgwXHgwMFx4N2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubGluMnVsYXcoZGF0YXNbNF0sIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInXHhmZlx4YWRceDhlXHgwZVx4ODBceDAwXHg3ZScpCisKKyAgICBkZWYgdGVzdF91bGF3MmxpbihzZWxmKToKKyAgICAgICAgZW5jb2RlZCA9IGInXHgwMFx4MGVceDI4XHgzZlx4NTdceDZhXHg3Nlx4N2NceDdlXHg3ZidcCisgICAgICAgICAgICAgICAgICBiJ1x4ODBceDhlXHhhOFx4YmZceGQ3XHhlYVx4ZjZceGZjXHhmZVx4ZmYnCisgICAgICAgIHNyYyA9IFstODAzMSwgLTQ0NDcsIC0xNDcxLCAtNDk1LCAtMTYzLCAtNTMsIC0xOCwgLTYsIC0yLCAwLAorICAgICAgICAgICAgICAgODAzMSwgNDQ0NywgMTQ3MSwgNDk1LCAxNjMsIDUzLCAxOCwgNiwgMiwgMF0KKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC51bGF3MmxpbihlbmNvZGVkLCB3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja3Nbd10oKih4IDw8ICh3ICogOCkgPj4gMTQgZm9yIHggaW4gc3JjKSkpCisKKyAgICAgICAgIyBDdXJyZW50IHUtbGF3IGltcGxlbWVudGF0aW9uIGhhcyB0d28gY29kZXMgZm8gMDogMHg3ZiBhbmQgMHhmZi4KKyAgICAgICAgZW5jb2RlZCA9ICcnLmpvaW4oY2hyKHgpIGZvciB4IGluIHJhbmdlKDEyNykgKyByYW5nZSgxMjgsIDI1NikpCisgICAgICAgIGZvciB3IGluIDIsIDQ6CisgICAgICAgICAgICBkZWNvZGVkID0gYXVkaW9vcC51bGF3MmxpbihlbmNvZGVkLCB3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmxpbjJ1bGF3KGRlY29kZWQsIHcpLCBlbmNvZGVkKQorCisgICAgZGVmIHRlc3RfbXVsKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm11bChiJycsIHcsIDIpLCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGRhdGFzW3ddLCB3LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYidcMCcgKiBsZW4oZGF0YXNbd10pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLm11bChkYXRhc1t3XSwgdywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzW3ddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGRhdGFzWzFdLCAxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJ1x4MDBceDI0XHg3Zlx4ODBceDdmXHg4MFx4ZmUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AubXVsKGRhdGFzWzJdLCAyLCAyKSwKKyAgICAgICAgICAgICAgICBwYWNrc1syXSgwLCAweDI0NjgsIDB4N2ZmZiwgLTB4ODAwMCwgMHg3ZmZmLCAtMHg4MDAwLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5tdWwoZGF0YXNbNF0sIDQsIDIpLAorICAgICAgICAgICAgICAgIHBhY2tzWzRdKDAsIDB4MjQ2OGFjZjAsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwLCAtMikpCisKKyAgICBkZWYgdGVzdF9yYXRlY3Yoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AucmF0ZWN2KGInJywgdywgMSwgODAwMCwgODAwMCwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiJycsICgtMSwgKCgwLCAwKSwpKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AucmF0ZWN2KGInJywgdywgNSwgODAwMCwgODAwMCwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiJycsICgtMSwgKCgwLCAwKSwpICogNSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnJhdGVjdihiJycsIHcsIDEsIDgwMDAsIDE2MDAwLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGInJywgKC0yLCAoKDAsIDApLCkpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5yYXRlY3YoZGF0YXNbd10sIHcsIDEsIDgwMDAsIDgwMDAsIE5vbmUpWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhc1t3XSkKKyAgICAgICAgc3RhdGUgPSBOb25lCisgICAgICAgIGQxLCBzdGF0ZSA9IGF1ZGlvb3AucmF0ZWN2KGInXHgwMFx4MDFceDAyJywgMSwgMSwgODAwMCwgMTYwMDAsIHN0YXRlKQorICAgICAgICBkMiwgc3RhdGUgPSBhdWRpb29wLnJhdGVjdihiJ1x4MDBceDAxXHgwMicsIDEsIDEsIDgwMDAsIDE2MDAwLCBzdGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSArIGQyLCBiJ1wwMDBcMDAwXDAwMVwwMDFcMDAyXDAwMVwwMDBcMDAwXDAwMVwwMDFcMDAyJykKKworICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZDAsIHN0YXRlMCA9IGF1ZGlvb3AucmF0ZWN2KGRhdGFzW3ddLCB3LCAxLCA4MDAwLCAxNjAwMCwgTm9uZSkKKyAgICAgICAgICAgIGQsIHN0YXRlID0gYicnLCBOb25lCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YXNbd10pLCB3KToKKyAgICAgICAgICAgICAgICBkMSwgc3RhdGUgPSBhdWRpb29wLnJhdGVjdihkYXRhc1t3XVtpOmkgKyB3XSwgdywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAwLCAxNjAwMCwgc3RhdGUpCisgICAgICAgICAgICAgICAgZCArPSBkMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIHN0YXRlMCkKKworICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZik6CisgICAgICAgIGZvciB3IGluIDEsIDIsIDQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AucmV2ZXJzZShiJycsIHcpLCBiJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AucmV2ZXJzZShwYWNrc1t3XSgwLCAxLCAyKSwgdyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tzW3ddKDIsIDEsIDApKQorCisgICAgZGVmIHRlc3RfdG9tb25vKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZGF0YTEgPSBkYXRhc1t3XQorICAgICAgICAgICAgZGF0YTIgPSBieXRlYXJyYXkoMiAqIGxlbihkYXRhMSkpCisgICAgICAgICAgICBmb3IgayBpbiByYW5nZSh3KToKKyAgICAgICAgICAgICAgICBkYXRhMltrOjoyKnddID0gZGF0YTFbazo6d10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC50b21vbm8oc3RyKGRhdGEyKSwgdywgMSwgMCksIGRhdGExKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvbW9ubyhzdHIoZGF0YTIpLCB3LCAwLCAxKSwgYidcMCcgKiBsZW4oZGF0YTEpKQorICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2Uodyk6CisgICAgICAgICAgICAgICAgZGF0YTJbayt3OjoyKnddID0gZGF0YTFbazo6d10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC50b21vbm8oc3RyKGRhdGEyKSwgdywgMC41LCAwLjUpLCBkYXRhMSkKKworICAgIGRlZiB0ZXN0X3Rvc3RlcmVvKHNlbGYpOgorICAgICAgICBmb3IgdyBpbiAxLCAyLCA0OgorICAgICAgICAgICAgZGF0YTEgPSBkYXRhc1t3XQorICAgICAgICAgICAgZGF0YTIgPSBieXRlYXJyYXkoMiAqIGxlbihkYXRhMSkpCisgICAgICAgICAgICBmb3IgayBpbiByYW5nZSh3KToKKyAgICAgICAgICAgICAgICBkYXRhMltrOjoyKnddID0gZGF0YTFbazo6d10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC50b3N0ZXJlbyhkYXRhMSwgdywgMSwgMCksIGRhdGEyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLnRvc3RlcmVvKGRhdGExLCB3LCAwLCAwKSwgYidcMCcgKiBsZW4oZGF0YTIpKQorICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2Uodyk6CisgICAgICAgICAgICAgICAgZGF0YTJbayt3OjoyKnddID0gZGF0YTFbazo6d10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC50b3N0ZXJlbyhkYXRhMSwgdywgMSwgMSksIGRhdGEyKQorCisgICAgZGVmIHRlc3RfZmluZGZhY3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmZpbmRmYWN0b3IoZGF0YXNbMl0sIGRhdGFzWzJdKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZhY3RvcihiJ1wwJyAqIGxlbihkYXRhc1syXSksIGRhdGFzWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLjApCisKKyAgICBkZWYgdGVzdF9maW5kZml0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZmluZGZpdChkYXRhc1syXSwgZGF0YXNbMl0pLCAoMCwgMS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmZpbmRmaXQoZGF0YXNbMl0sIHBhY2tzWzJdKDEsIDIsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgODAzOC44KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmZpbmRmaXQoZGF0YXNbMl1bOi0yXSAqIDUgKyBkYXRhc1syXSwgZGF0YXNbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICgzMCwgMS4wKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRtYXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5maW5kbWF4KGRhdGFzWzJdLCAxKSwgNSkKKworICAgIGRlZiB0ZXN0X2dldHNhbXBsZShzZWxmKToKKyAgICAgICAgZm9yIHcgaW4gMSwgMiwgNDoKKyAgICAgICAgICAgIGRhdGEgPSBwYWNrc1t3XSgwLCAxLCAtMSwgbWF4dmFsdWVzW3ddLCBtaW52YWx1ZXNbd10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1ZGlvb3AuZ2V0c2FtcGxlKGRhdGEsIHcsIDApLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmdldHNhbXBsZShkYXRhLCB3LCAxKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXVkaW9vcC5nZXRzYW1wbGUoZGF0YSwgdywgMiksIC0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmdldHNhbXBsZShkYXRhLCB3LCAzKSwgbWF4dmFsdWVzW3ddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdWRpb29wLmdldHNhbXBsZShkYXRhLCB3LCA0KSwgbWludmFsdWVzW3ddKQorCisgICAgZGVmIHRlc3RfbmVnYXRpdmVsZW4oc2VsZik6CisgICAgICAgICMgZnJvbSBpc3N1ZSAzMzA2LCBwcmV2aW91c2x5IGl0IHNlZ2ZhdWx0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwKKyAgICAgICAgICAgIGF1ZGlvb3AuZmluZG1heCwgJycuam9pbiggY2hyKHgpIGZvciB4IGluIHhyYW5nZSgyNTYpKSwgLTIzOTIzOTIpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTc2NzMoc2VsZik6CisgICAgICAgIHN0YXRlID0gTm9uZQorICAgICAgICBmb3IgZGF0YSwgc2l6ZSBpbiBJTlZBTElEX0RBVEE6CisgICAgICAgICAgICBzaXplMiA9IHNpemUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuZ2V0c2FtcGxlLCBkYXRhLCBzaXplLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5tYXgsIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLm1pbm1heCwgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuYXZnLCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5ybXMsIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLmF2Z3BwLCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5tYXhwcCwgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuY3Jvc3MsIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLm11bCwgZGF0YSwgc2l6ZSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC50b21vbm8sIGRhdGEsIHNpemUsIDAuNSwgMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC50b3N0ZXJlbywgZGF0YSwgc2l6ZSwgMC41LCAwLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLmFkZCwgZGF0YSwgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuYmlhcywgZGF0YSwgc2l6ZSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AucmV2ZXJzZSwgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AubGluMmxpbiwgZGF0YSwgc2l6ZSwgc2l6ZTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLnJhdGVjdiwgZGF0YSwgc2l6ZSwgMSwgMSwgMSwgc3RhdGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLmxpbjJ1bGF3LCBkYXRhLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC5saW4yYWxhdywgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AubGluMmFkcGNtLCBkYXRhLCBzaXplLCBzdGF0ZSkKKworICAgIGRlZiB0ZXN0X3dyb25nc2l6ZShzZWxmKToKKyAgICAgICAgZGF0YSA9IGInYWJjZGVmZ2gnCisgICAgICAgIHN0YXRlID0gTm9uZQorICAgICAgICBmb3Igc2l6ZSBpbiAoLTEsIDAsIDMsIDUsIDEwMjQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYXVkaW9vcC5lcnJvciwgYXVkaW9vcC51bGF3MmxpbiwgZGF0YSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGF1ZGlvb3AuZXJyb3IsIGF1ZGlvb3AuYWxhdzJsaW4sIGRhdGEsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhhdWRpb29wLmVycm9yLCBhdWRpb29wLmFkcGNtMmxpbiwgZGF0YSwgc2l6ZSwgc3RhdGUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEF1ZGlvb3ApCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1ZGlvb3AucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1MDE0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1ZGlvb3AucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1ZGlvb3AucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVkaW9vcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1MDE0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1ZGlvb3AucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTllOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5CkBAIC0wLDAgKzEsMzMxIEBACisjIEF1Z21lbnRlZCBhc3NpZ25tZW50IHRlc3QuCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfcHkza193YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgQXVnQXNzaWduVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RCYXNpYyhzZWxmKToKKyAgICAgICAgeCA9IDIKKyAgICAgICAgeCArPSAxCisgICAgICAgIHggKj0gMgorICAgICAgICB4ICoqPSAyCisgICAgICAgIHggLT0gOAorICAgICAgICB4IC8vPSA1CisgICAgICAgIHggJT0gMworICAgICAgICB4ICY9IDIKKyAgICAgICAgeCB8PSA1CisgICAgICAgIHggXj0gMQorICAgICAgICB4IC89IDIKKyAgICAgICAgaWYgMS8yID09IDA6CisgICAgICAgICAgICAjIGNsYXNzaWMgZGl2aXNpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgMykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbmV3LXN0eWxlIGRpdmlzaW9uICh3aXRoIC1RbmV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCAzLjApCisKKyAgICBkZWYgdGVzdF93aXRoX3VucGFja2luZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsICJ4LCBiICs9IDMiLCAiPHRlc3Q+IiwgImV4ZWMiKQorCisgICAgZGVmIHRlc3RJbkxpc3Qoc2VsZik6CisgICAgICAgIHggPSBbMl0KKyAgICAgICAgeFswXSArPSAxCisgICAgICAgIHhbMF0gKj0gMgorICAgICAgICB4WzBdICoqPSAyCisgICAgICAgIHhbMF0gLT0gOAorICAgICAgICB4WzBdIC8vPSA1CisgICAgICAgIHhbMF0gJT0gMworICAgICAgICB4WzBdICY9IDIKKyAgICAgICAgeFswXSB8PSA1CisgICAgICAgIHhbMF0gXj0gMQorICAgICAgICB4WzBdIC89IDIKKyAgICAgICAgaWYgMS8yID09IDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbMF0sIDMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbMF0sIDMuMCkKKworICAgIGRlZiB0ZXN0SW5EaWN0KHNlbGYpOgorICAgICAgICB4ID0gezA6IDJ9CisgICAgICAgIHhbMF0gKz0gMQorICAgICAgICB4WzBdICo9IDIKKyAgICAgICAgeFswXSAqKj0gMgorICAgICAgICB4WzBdIC09IDgKKyAgICAgICAgeFswXSAvLz0gNQorICAgICAgICB4WzBdICU9IDMKKyAgICAgICAgeFswXSAmPSAyCisgICAgICAgIHhbMF0gfD0gNQorICAgICAgICB4WzBdIF49IDEKKyAgICAgICAgeFswXSAvPSAyCisgICAgICAgIGlmIDEvMiA9PSAwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLCAzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLCAzLjApCisKKyAgICBkZWYgdGVzdFNlcXVlbmNlcyhzZWxmKToKKyAgICAgICAgeCA9IFsxLDJdCisgICAgICAgIHggKz0gWzMsNF0KKyAgICAgICAgeCAqPSAyCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbMSwgMiwgMywgNCwgMSwgMiwgMywgNF0pCisKKyAgICAgICAgeCA9IFsxLCAyLCAzXQorICAgICAgICB5ID0geAorICAgICAgICB4WzE6Ml0gKj0gMgorICAgICAgICB5WzE6Ml0gKz0gWzFdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbMSwgMiwgMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHkpCisKKyAgICBkZWYgdGVzdEN1c3RvbU1ldGhvZHMxKHNlbGYpOgorCisgICAgICAgIGNsYXNzIGF1Z190ZXN0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbCA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19yYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWwgKyB2YWwKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGF1Z190ZXN0KHNlbGYudmFsICsgdmFsKQorCisgICAgICAgIGNsYXNzIGF1Z190ZXN0MihhdWdfdGVzdCk6CisgICAgICAgICAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbCA9IHNlbGYudmFsICsgdmFsCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBhdWdfdGVzdDMoYXVnX3Rlc3QpOgorICAgICAgICAgICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGF1Z190ZXN0MyhzZWxmLnZhbCArIHZhbCkKKworICAgICAgICB4ID0gYXVnX3Rlc3QoMSkKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeCArPSAxMAorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBhdWdfdGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWwsIDExKQorCisgICAgICAgIHggPSBhdWdfdGVzdDIoMikKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeCArPSAxMAorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWwsIDEyKQorCisgICAgICAgIHggPSBhdWdfdGVzdDMoMykKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeCArPSAxMAorCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBhdWdfdGVzdDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudmFsLCAxMykKKworCisgICAgZGVmIHRlc3RDdXN0b21NZXRob2RzMih0ZXN0X3NlbGYpOgorICAgICAgICBvdXRwdXQgPSBbXQorCisgICAgICAgIGNsYXNzIHRlc3RhbGw6CisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fYWRkX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmFkZF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lhZGRfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX3N1Yl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19zdWJfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnN1Yl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yc3ViX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lzdWJfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXN1Yl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fbXVsX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX211bF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19ybXVsX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3JtdWxfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faW11bF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pbXVsX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19kaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2Zsb29yZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9faWZsb29yZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lmbG9vcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yZmxvb3JkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX3RydWVkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fdHJ1ZWRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX2l0cnVlZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2l0cnVlZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19tb2RfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fbW9kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3Jtb2RfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcm1vZF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pbW9kX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2ltb2RfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX3Bvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19wb3dfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnBvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ycG93X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lwb3dfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXBvd19fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fb3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fb3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcm9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pb3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faW9yX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19hbmRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fYW5kX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3JhbmRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmFuZF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pYW5kX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lhbmRfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX3hvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX194b3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnhvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yeG9yX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2l4b3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXhvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIF9fcnNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3JzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19ycnNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jyc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faXJzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pcnNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19sc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fbHNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX3Jsc2hpZnRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fcmxzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pbHNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lsc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgeCA9IHRlc3RhbGwoKQorICAgICAgICB4ICsgMQorICAgICAgICAxICsgeAorICAgICAgICB4ICs9IDEKKworICAgICAgICB4IC0gMQorICAgICAgICAxIC0geAorICAgICAgICB4IC09IDEKKworICAgICAgICB4ICogMQorICAgICAgICAxICogeAorICAgICAgICB4ICo9IDEKKworICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgIHggLyAxCisgICAgICAgICAgICAxIC8geAorICAgICAgICAgICAgeCAvPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRydWUgZGl2aXNpb24gaXMgaW4gZWZmZWN0LCBzbyAiLyIgZG9lc24ndCBtYXAgdG8gX19kaXZfXyBldGM7CisgICAgICAgICAgICAjIGJ1dCB0aGUgY2FubmVkIGV4cGVjdGVkLW91dHB1dCBmaWxlIHJlcXVpcmVzIHRoYXQgdGhvc2UgZ2V0IGNhbGxlZC4KKyAgICAgICAgICAgIHguX19kaXZfXygxKQorICAgICAgICAgICAgeC5fX3JkaXZfXygxKQorICAgICAgICAgICAgeC5fX2lkaXZfXygxKQorCisgICAgICAgIHggLy8gMQorICAgICAgICAxIC8vIHgKKyAgICAgICAgeCAvLz0gMQorCisgICAgICAgIHggJSAxCisgICAgICAgIDEgJSB4CisgICAgICAgIHggJT0gMQorCisgICAgICAgIHggKiogMQorICAgICAgICAxICoqIHgKKyAgICAgICAgeCAqKj0gMQorCisgICAgICAgIHggfCAxCisgICAgICAgIDEgfCB4CisgICAgICAgIHggfD0gMQorCisgICAgICAgIHggJiAxCisgICAgICAgIDEgJiB4CisgICAgICAgIHggJj0gMQorCisgICAgICAgIHggXiAxCisgICAgICAgIDEgXiB4CisgICAgICAgIHggXj0gMQorCisgICAgICAgIHggPj4gMQorICAgICAgICAxID4+IHgKKyAgICAgICAgeCA+Pj0gMQorCisgICAgICAgIHggPDwgMQorICAgICAgICAxIDw8IHgKKyAgICAgICAgeCA8PD0gMQorCisgICAgICAgIHRlc3Rfc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQsICcnJ1wKK19fYWRkX18gY2FsbGVkCitfX3JhZGRfXyBjYWxsZWQKK19faWFkZF9fIGNhbGxlZAorX19zdWJfXyBjYWxsZWQKK19fcnN1Yl9fIGNhbGxlZAorX19pc3ViX18gY2FsbGVkCitfX211bF9fIGNhbGxlZAorX19ybXVsX18gY2FsbGVkCitfX2ltdWxfXyBjYWxsZWQKK19fZGl2X18gY2FsbGVkCitfX3JkaXZfXyBjYWxsZWQKK19faWRpdl9fIGNhbGxlZAorX19mbG9vcmRpdl9fIGNhbGxlZAorX19yZmxvb3JkaXZfXyBjYWxsZWQKK19faWZsb29yZGl2X18gY2FsbGVkCitfX21vZF9fIGNhbGxlZAorX19ybW9kX18gY2FsbGVkCitfX2ltb2RfXyBjYWxsZWQKK19fcG93X18gY2FsbGVkCitfX3Jwb3dfXyBjYWxsZWQKK19faXBvd19fIGNhbGxlZAorX19vcl9fIGNhbGxlZAorX19yb3JfXyBjYWxsZWQKK19faW9yX18gY2FsbGVkCitfX2FuZF9fIGNhbGxlZAorX19yYW5kX18gY2FsbGVkCitfX2lhbmRfXyBjYWxsZWQKK19feG9yX18gY2FsbGVkCitfX3J4b3JfXyBjYWxsZWQKK19faXhvcl9fIGNhbGxlZAorX19yc2hpZnRfXyBjYWxsZWQKK19fcnJzaGlmdF9fIGNhbGxlZAorX19pcnNoaWZ0X18gY2FsbGVkCitfX2xzaGlmdF9fIGNhbGxlZAorX19ybHNoaWZ0X18gY2FsbGVkCitfX2lsc2hpZnRfXyBjYWxsZWQKKycnJy5zcGxpdGxpbmVzKCkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKCJjbGFzc2ljIGludCBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBydW5fdW5pdHRlc3QoQXVnQXNzaWduVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYTJlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYTJlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmFzZTY0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmFzZTY0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMmNlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXNlNjQucHkKQEAgLTAsMCArMSwyMTYgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBiYXNlNjQKKworCisMCitjbGFzcyBMZWdhY3lCYXNlNjRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZW5jb2Rlc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0LmVuY29kZXN0cmluZygid3d3LnB5dGhvbi5vcmciKSwgImQzZDNMbkI1ZEdodmJpNXZjbWM9XG4iKQorICAgICAgICBlcShiYXNlNjQuZW5jb2Rlc3RyaW5nKCJhIiksICJZUT09XG4iKQorICAgICAgICBlcShiYXNlNjQuZW5jb2Rlc3RyaW5nKCJhYiIpLCAiWVdJPVxuIikKKyAgICAgICAgZXEoYmFzZTY0LmVuY29kZXN0cmluZygiYWJjIiksICJZV0pqXG4iKQorICAgICAgICBlcShiYXNlNjQuZW5jb2Rlc3RyaW5nKCIiKSwgIiIpCisgICAgICAgIGVxKGJhc2U2NC5lbmNvZGVzdHJpbmcoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDEyMzQ1Njc4OSFAIzBeJiooKTs6PD4sLiBbXXt9IiksCisgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcEJRa05FIgorICAgICAgICAgICAiUlVaSFNFbEtTMHhOVGs5UVVWSlRWRlZXVjFoWldqQXhNak0wXG5OVCIKKyAgICAgICAgICAgIlkzT0RraFFDTXdYaVlxS0NrN09qdytMQzRnVzExN2ZRPT1cbiIpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5lbmNvZGVzdHJpbmcoYnl0ZWFycmF5KCdhYmMnKSksICdZV0pqXG4nKQorCisgICAgZGVmIHRlc3RfZGVjb2Rlc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0LmRlY29kZXN0cmluZygiZDNkM0xuQjVkR2h2Ymk1dmNtYz1cbiIpLCAid3d3LnB5dGhvbi5vcmciKQorICAgICAgICBlcShiYXNlNjQuZGVjb2Rlc3RyaW5nKCJZUT09XG4iKSwgImEiKQorICAgICAgICBlcShiYXNlNjQuZGVjb2Rlc3RyaW5nKCJZV0k9XG4iKSwgImFiIikKKyAgICAgICAgZXEoYmFzZTY0LmRlY29kZXN0cmluZygiWVdKalxuIiksICJhYmMiKQorICAgICAgICBlcShiYXNlNjQuZGVjb2Rlc3RyaW5nKCJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcEJRa05FIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2pBeE1qTTBcbk5UIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZM09Ea2hRQ013WGlZcUtDazdPancrTEM0Z1cxMTdmUT09XG4iKSwKKyAgICAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IgorICAgICAgICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiCisgICAgICAgICAgICIwMTIzNDU2Nzg5IUAjMF4mKigpOzo8PiwuIFtde30iKQorICAgICAgICBlcShiYXNlNjQuZGVjb2Rlc3RyaW5nKCcnKSwgJycpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5kZWNvZGVzdHJpbmcoYnl0ZWFycmF5KCJZV0pqXG4iKSksICJhYmMiKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGluZnAgPSBTdHJpbmdJTygnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCisgICAgICAgICAgICAgICAgICAgICAgICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVonCisgICAgICAgICAgICAgICAgICAgICAgICAnMDEyMzQ1Njc4OSFAIzBeJiooKTs6PD4sLiBbXXt9JykKKyAgICAgICAgb3V0ZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGJhc2U2NC5lbmNvZGUoaW5mcCwgb3V0ZnApCisgICAgICAgIGVxKG91dGZwLmdldHZhbHVlKCksCisgICAgICAgICAgICdZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcEJRa05FJworICAgICAgICAgICAnUlVaSFNFbEtTMHhOVGs5UVVWSlRWRlZXVjFoWldqQXhNak0wXG5OVCcKKyAgICAgICAgICAgJ1kzT0RraFFDTXdYaVlxS0NrN09qdytMQzRnVzExN2ZRPT1cbicpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBpbmZwID0gU3RyaW5nSU8oJ2QzZDNMbkI1ZEdodmJpNXZjbWM9JykKKyAgICAgICAgb3V0ZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGJhc2U2NC5kZWNvZGUoaW5mcCwgb3V0ZnApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0ZnAuZ2V0dmFsdWUoKSwgJ3d3dy5weXRob24ub3JnJykKKworCisMCitjbGFzcyBCYXNlWFlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYjY0ZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUZXN0IGRlZmF1bHQgYWxwaGFiZXQKKyAgICAgICAgZXEoYmFzZTY0LmI2NGVuY29kZSgid3d3LnB5dGhvbi5vcmciKSwgImQzZDNMbkI1ZEdodmJpNXZjbWM9IikKKyAgICAgICAgZXEoYmFzZTY0LmI2NGVuY29kZSgnXHgwMCcpLCAnQUE9PScpCisgICAgICAgIGVxKGJhc2U2NC5iNjRlbmNvZGUoImEiKSwgIllRPT0iKQorICAgICAgICBlcShiYXNlNjQuYjY0ZW5jb2RlKCJhYiIpLCAiWVdJPSIpCisgICAgICAgIGVxKGJhc2U2NC5iNjRlbmNvZGUoImFiYyIpLCAiWVdKaiIpCisgICAgICAgIGVxKGJhc2U2NC5iNjRlbmNvZGUoIiIpLCAiIikKKyAgICAgICAgZXEoYmFzZTY0LmI2NGVuY29kZSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5IUAjMF4mKigpOzo8PiwuIFtde30iKSwKKyAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwQlFrTkUiCisgICAgICAgICAgICJSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2pBeE1qTTBOVCIKKyAgICAgICAgICAgIlkzT0RraFFDTXdYaVlxS0NrN09qdytMQzRnVzExN2ZRPT0iKQorICAgICAgICAjIFRlc3Qgd2l0aCBhcmJpdHJhcnkgYWx0ZXJuYXRpdmUgY2hhcmFjdGVycworICAgICAgICBlcShiYXNlNjQuYjY0ZW5jb2RlKCdceGQzVlx4YmVvXHhmN1x4MWQnLCBhbHRjaGFycz0nKiQnKSwgJzAxYSpiJGNkJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LmI2NGVuY29kZShieXRlYXJyYXkoJ2FiY2QnKSksICdZV0pqWkE9PScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmFzZTY0LmI2NGVuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4ZDNWXHhiZW9ceGY3XHgxZCcsIGFsdGNoYXJzPWJ5dGVhcnJheSgnKiQnKSkKKyAgICAgICAgIyBUZXN0IHN0YW5kYXJkIGFscGhhYmV0CisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoInd3dy5weXRob24ub3JnIiksICJkM2QzTG5CNWRHaHZiaTV2Y21jPSIpCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoImEiKSwgIllRPT0iKQorICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZW5jb2RlKCJhYiIpLCAiWVdJPSIpCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoImFiYyIpLCAiWVdKaiIpCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRlbmNvZGUoIiIpLCAiIikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGVuY29kZSgiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5IUAjMF4mKigpOzo8PiwuIFtde30iKSwKKyAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhwQlFrTkUiCisgICAgICAgICAgICJSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2pBeE1qTTBOVCIKKyAgICAgICAgICAgIlkzT0RraFFDTXdYaVlxS0NrN09qdytMQzRnVzExN2ZRPT0iKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZW5jb2RlKGJ5dGVhcnJheSgnYWJjZCcpKSwgJ1lXSmpaQT09JykKKyAgICAgICAgIyBUZXN0IHdpdGggJ1VSTCBzYWZlJyBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXJzCisgICAgICAgIGVxKGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZSgnXHhkM1ZceGJlb1x4ZjdceDFkJyksICcwMWEtYl9jZCcpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC51cmxzYWZlX2I2NGVuY29kZShieXRlYXJyYXkoJ1x4ZDNWXHhiZW9ceGY3XHgxZCcpKSwgJzAxYS1iX2NkJykKKworICAgIGRlZiB0ZXN0X2I2NGRlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NC5iNjRkZWNvZGUoImQzZDNMbkI1ZEdodmJpNXZjbWM9IiksICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIGVxKGJhc2U2NC5iNjRkZWNvZGUoJ0FBPT0nKSwgJ1x4MDAnKQorICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKCJZUT09IiksICJhIikKKyAgICAgICAgZXEoYmFzZTY0LmI2NGRlY29kZSgiWVdJPSIpLCAiYWIiKQorICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKCJZV0pqIiksICJhYmMiKQorICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKCJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcEJRa05FIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2pBeE1qTTBcbk5UIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJZM09Ea2hRQ013WGlZcUtDazdPancrTEM0Z1cxMTdmUT09IiksCisgICAgICAgICAgICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKyAgICAgICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIgorICAgICAgICAgICAiMDEyMzQ1Njc4OSFAIzBeJiooKTs6PD4sLiBbXXt9IikKKyAgICAgICAgZXEoYmFzZTY0LmI2NGRlY29kZSgnJyksICcnKQorICAgICAgICAjIFRlc3Qgd2l0aCBhcmJpdHJhcnkgYWx0ZXJuYXRpdmUgY2hhcmFjdGVycworICAgICAgICBlcShiYXNlNjQuYjY0ZGVjb2RlKCcwMWEqYiRjZCcsIGFsdGNoYXJzPScqJCcpLCAnXHhkM1ZceGJlb1x4ZjdceDFkJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LmI2NGRlY29kZShieXRlYXJyYXkoIllXSmoiKSksICJhYmMiKQorICAgICAgICAjIFRlc3Qgc3RhbmRhcmQgYWxwaGFiZXQKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGRlY29kZSgiZDNkM0xuQjVkR2h2Ymk1dmNtYz0iKSwgInd3dy5weXRob24ub3JnIikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGRlY29kZSgiWVE9PSIpLCAiYSIpCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRkZWNvZGUoIllXST0iKSwgImFiIikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGRlY29kZSgiWVdKaiIpLCAiYWJjIikKKyAgICAgICAgZXEoYmFzZTY0LnN0YW5kYXJkX2I2NGRlY29kZSgiIiksICIiKQorICAgICAgICBlcShiYXNlNjQuc3RhbmRhcmRfYjY0ZGVjb2RlKCJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNGVYcEJRa05FIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSVVpIU0VsS1MweE5UazlRVVZKVFZGVldWMWhaV2pBeE1qTTBOVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWTNPRGtoUUNNd1hpWXFLQ2s3T2p3K0xDNGdXMTE3ZlE9PSIpLAorICAgICAgICAgICAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCisgICAgICAgICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWiIKKyAgICAgICAgICAgIjAxMjM0NTY3ODkhQCMwXiYqKCk7Ojw+LC4gW117fSIpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5zdGFuZGFyZF9iNjRkZWNvZGUoYnl0ZWFycmF5KCJZV0pqIikpLCAiYWJjIikKKyAgICAgICAgIyBUZXN0IHdpdGggJ1VSTCBzYWZlJyBhbHRlcm5hdGl2ZSBjaGFyYWN0ZXJzCisgICAgICAgIGVxKGJhc2U2NC51cmxzYWZlX2I2NGRlY29kZSgnMDFhLWJfY2QnKSwgJ1x4ZDNWXHhiZW9ceGY3XHgxZCcpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC51cmxzYWZlX2I2NGRlY29kZShieXRlYXJyYXkoJzAxYS1iX2NkJykpLCAnXHhkM1ZceGJlb1x4ZjdceDFkJykKKworICAgIGRlZiB0ZXN0X2I2NGRlY29kZV9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYXNlNjQuYjY0ZGVjb2RlLCAnYWJjJykKKworICAgIGRlZiB0ZXN0X2IzMmVuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoJycpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmVuY29kZSgnXHgwMCcpLCAnQUE9PT09PT0nKQorICAgICAgICBlcShiYXNlNjQuYjMyZW5jb2RlKCdhJyksICdNRT09PT09PScpCisgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoJ2FiJyksICdNRlJBPT09PScpCisgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoJ2FiYycpLCAnTUZSR0c9PT0nKQorICAgICAgICBlcShiYXNlNjQuYjMyZW5jb2RlKCdhYmNkJyksICdNRlJHR1pBPScpCisgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoJ2FiY2RlJyksICdNRlJHR1pERicpCisgICAgICAgICMgTm9uLWJ5dGVzCisgICAgICAgIGVxKGJhc2U2NC5iMzJlbmNvZGUoYnl0ZWFycmF5KCdhYmNkJykpLCAnTUZSR0daQT0nKQorCisgICAgZGVmIHRlc3RfYjMyZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnJyksICcnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdBQT09PT09PScpLCAnXHgwMCcpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ01FPT09PT09JyksICdhJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSQT09PT0nKSwgJ2FiJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSR0c9PT0nKSwgJ2FiYycpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ01GUkdHWkE9JyksICdhYmNkJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSR0daREYnKSwgJ2FiY2RlJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYXNlNjQuYjMyZGVjb2RlLCBieXRlYXJyYXkoJ01GUkdHPT09JykpCisKKyAgICBkZWYgdGVzdF9iMzJkZWNvZGVfY2FzZWZvbGQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCcnLCBUcnVlKSwgJycpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ01FPT09PT09JywgVHJ1ZSksICdhJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSQT09PT0nLCBUcnVlKSwgJ2FiJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSR0c9PT0nLCBUcnVlKSwgJ2FiYycpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ01GUkdHWkE9JywgVHJ1ZSksICdhYmNkJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUZSR0daREYnLCBUcnVlKSwgJ2FiY2RlJykKKyAgICAgICAgIyBMb3dlciBjYXNlcworICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdtZT09PT09PScsIFRydWUpLCAnYScpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ21mcmE9PT09JywgVHJ1ZSksICdhYicpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ21mcmdnPT09JywgVHJ1ZSksICdhYmMnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdtZnJnZ3phPScsIFRydWUpLCAnYWJjZCcpCisgICAgICAgIGVxKGJhc2U2NC5iMzJkZWNvZGUoJ21mcmdnemRmJywgVHJ1ZSksICdhYmNkZScpCisgICAgICAgICMgRXhwZWN0ZWQgZXhjZXB0aW9ucworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJhc2U2NC5iMzJkZWNvZGUsICdtZT09PT09PScpCisgICAgICAgICMgTWFwcGluZyB6ZXJvIGFuZCBvbmUKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTUxPMjM0NTYnKSwgJ2JceGRkXHhhZFx4ZjNceGJlJykKKyAgICAgICAgZXEoYmFzZTY0LmIzMmRlY29kZSgnTTEwMjM0NTYnLCBtYXAwMT0nTCcpLCAnYlx4ZGRceGFkXHhmM1x4YmUnKQorICAgICAgICBlcShiYXNlNjQuYjMyZGVjb2RlKCdNMTAyMzQ1NicsIG1hcDAxPSdJJyksICdiXHgxZFx4YWRceGYzXHhiZScpCisKKyAgICBkZWYgdGVzdF9iMzJkZWNvZGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmFzZTY0LmIzMmRlY29kZSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmFzZTY0LmIzMmRlY29kZSwgJ0FCQ0RFRj09JykKKworICAgIGRlZiB0ZXN0X2IxNmVuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NC5iMTZlbmNvZGUoJ1x4MDFceDAyXHhhYlx4Y2RceGVmJyksICcwMTAyQUJDREVGJykKKyAgICAgICAgZXEoYmFzZTY0LmIxNmVuY29kZSgnXHgwMCcpLCAnMDAnKQorICAgICAgICAjIE5vbi1ieXRlcworICAgICAgICBlcShiYXNlNjQuYjE2ZW5jb2RlKGJ5dGVhcnJheSgnXHgwMVx4MDJceGFiXHhjZFx4ZWYnKSksICcwMTAyQUJDREVGJykKKworICAgIGRlZiB0ZXN0X2IxNmRlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKGJhc2U2NC5iMTZkZWNvZGUoJzAxMDJBQkNERUYnKSwgJ1x4MDFceDAyXHhhYlx4Y2RceGVmJykKKyAgICAgICAgZXEoYmFzZTY0LmIxNmRlY29kZSgnMDAnKSwgJ1x4MDAnKQorICAgICAgICAjIExvd2VyIGNhc2UgaXMgbm90IGFsbG93ZWQgd2l0aG91dCBhIGZsYWcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiYXNlNjQuYjE2ZGVjb2RlLCAnMDEwMmFiY2RlZicpCisgICAgICAgICMgQ2FzZSBmb2xkCisgICAgICAgIGVxKGJhc2U2NC5iMTZkZWNvZGUoJzAxMDJhYmNkZWYnLCBUcnVlKSwgJ1x4MDFceDAyXHhhYlx4Y2RceGVmJykKKyAgICAgICAgIyBOb24tYnl0ZXMKKyAgICAgICAgZXEoYmFzZTY0LmIxNmRlY29kZShieXRlYXJyYXkoIjAxMDJBQkNERUYiKSksICdceDAxXHgwMlx4YWJceGNkXHhlZicpCisKKworDAorZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc2U2NC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXNlNjQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDFhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXNlNjQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc2U2NC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXNlNjQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDFhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXNlNjQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXN0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjBlYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXN0aW9uLnB5CkBAIC0wLDAgKzEsMyBAQAorIyNpbXBvcnQgQmFzdGlvbgorIyMKKyMjQmFzdGlvbi5fdGVzdCgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXN0aW9uLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTk4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXN0aW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXN0aW9uLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jhc3Rpb24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTk4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iYXN0aW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxOWE1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weQpAQCAtMCwwICsxLDQ2IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgYmlnYWRkcnNwYWNldGVzdCwgTUFYX1B5X3NzaXplX3QKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBzeXMKKworCitjbGFzcyBTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBiaWdhZGRyc3BhY2V0ZXN0CisgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgorICAgICAgICBzMSA9ICd4JyAqIE1BWF9QeV9zc2l6ZV90CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9wZXJhdG9yLmFkZCwgczEsICc/JykKKworICAgIEBiaWdhZGRyc3BhY2V0ZXN0CisgICAgZGVmIHRlc3Rfb3B0aW1pemVkX2NvbmNhdChzZWxmKToKKyAgICAgICAgeCA9ICd4JyAqIE1BWF9QeV9zc2l6ZV90CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggPSB4ICsgJz8nICAgICAjIHRoaXMgc3RhdGVtZW50IHVzZXMgYSBmYXN0IHBhdGggaW4gY2V2YWwuYworICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE92ZXJmbG93RXJyb3IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ICs9ICc/JyAgICAgICAgIyB0aGlzIHN0YXRlbWVudCB1c2VzIGEgZmFzdCBwYXRoIGluIGNldmFsLmMKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPdmVyZmxvd0Vycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIE1BWF9QeV9zc2l6ZV90KQorCisgICAgIyMjIHRoZSBmb2xsb3dpbmcgdGVzdCBpcyBwZW5kaW5nIGEgcGF0Y2gKKyAgICAjICAgKGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwNi1KdWx5LzA2Nzc3NC5odG1sKQorICAgICNAYmlnYWRkcnNwYWNldGVzdAorICAgICNkZWYgdGVzdF9yZXBlYXQoc2VsZik6CisgICAgIyAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcGVyYXRvci5tdWwsICd4JywgTUFYX1B5X3NzaXplX3QgKyAxKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN0clRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5zZXRfbWVtbGltaXQoc3lzLmFyZ3ZbMV0pCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2U3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxM2U3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdhZGRyc3BhY2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDFjMzczCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0wLDAgKzEsMTA3MyBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IGJpZ21lbXRlc3QsIF8xRywgXzJHLCBfNEcsIHByZWNpc2lvbmJpZ21lbXRlc3QKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzeXMKKworIyBCaWdtZW0gdGVzdGluZyBob3VzZXJ1bGVzOgorIworIyAgLSBUcnkgbm90IHRvIGFsbG9jYXRlIHRvbyBtYW55IGxhcmdlIG9iamVjdHMuIEl0J3Mgb2theSB0byByZWx5IG9uCisjICAgIHJlZmNvdW50aW5nIHNlbWFudGljcywgYnV0IGRvbid0IGZvcmdldCB0aGF0ICdzID0gY3JlYXRlX2xhcmdlc3RyaW5nKCknCisjICAgIGRvZXNuJ3QgcmVsZWFzZSB0aGUgb2xkICdzJyAoaWYgaXQgZXhpc3RzKSB1bnRpbCB3ZWxsIGFmdGVyIGl0cyBuZXcKKyMgICAgdmFsdWUgaGFzIGJlZW4gY3JlYXRlZC4gVXNlICdkZWwgcycgYmVmb3JlIHRoZSBjcmVhdGVfbGFyZ2VzdHJpbmcgY2FsbC4KKyMKKyMgIC0gRG8gKm5vdCogY29tcGFyZSBsYXJnZSBvYmplY3RzIHVzaW5nIGFzc2VydEVxdWFsIG9yIHNpbWlsYXIuIEl0J3MgYQorIyAgICBsZW5ndHkgb3BlcmF0aW9uIGFuZCB0aGUgZXJyb3JtZXNzYWdlIHdpbGwgYmUgdXR0ZXJseSB1c2VsZXNzIGR1ZSB0bworIyAgICBpdHMgc2l6ZS4gVG8gbWFrZSBzdXJlIHdoZXRoZXIgYSByZXN1bHQgaGFzIHRoZSByaWdodCBjb250ZW50cywgYmV0dGVyCisjICAgIHRvIHVzZSB0aGUgc3RyaXAgb3IgY291bnQgbWV0aG9kcywgb3IgY29tcGFyZSBtZWFuaW5nZnVsIHNsaWNlcy4KKyMKKyMgIC0gRG9uJ3QgZm9yZ2V0IHRvIHRlc3QgZm9yIGxhcmdlIGluZGljZXMsIG9mZnNldHMgYW5kIHJlc3VsdHMgYW5kIHN1Y2gsCisjICAgIGluIGFkZGl0aW9uIHRvIGxhcmdlIHNpemVzLgorIworIyAgLSBXaGVuIHJlcGVhdGluZyBhbiBvYmplY3QgKHNheSwgYSBzdWJzdHJpbmcsIG9yIGEgc21hbGwgbGlzdCkgdG8gY3JlYXRlCisjICAgIGEgbGFyZ2Ugb2JqZWN0LCBtYWtlIHRoZSBzdWJvYmplY3Qgb2YgYSBsZW5ndGggdGhhdCBpcyBub3QgYSBwb3dlciBvZgorIyAgICAyLiBUaGF0IHdheSwgaW50LXdyYXBwaW5nIHByb2JsZW1zIGFyZSBtb3JlIGVhc2lseSBkZXRlY3RlZC4KKyMKKyMgIC0gV2hpbGUgdGhlIGJpZ21lbXRlc3QgZGVjb3JhdG9yIHNwZWFrcyBvZiAnbWluc2l6ZScsIGFsbCB0ZXN0cyB3aWxsCisjICAgIGFjdHVhbGx5IGJlIGNhbGxlZCB3aXRoIGEgbXVjaCBzbWFsbGVyIG51bWJlciB0b28sIGluIHRoZSBub3JtYWwKKyMgICAgdGVzdCBydW4gKDVLYiBjdXJyZW50bHkuKSBUaGlzIGlzIHNvIHRoZSB0ZXN0cyB0aGVtc2VsdmVzIGdldCBmcmVxdWVudAorIyAgICB0ZXN0aW5nLiBDb25zZXF1ZW50bHksIGFsd2F5cyBtYWtlIGFsbCBsYXJnZSBhbGxvY2F0aW9ucyBiYXNlZCBvbiB0aGUKKyMgICAgcGFzc2VkLWluICdzaXplJywgYW5kIGRvbid0IHJlbHkgb24gdGhlIHNpemUgYmVpbmcgdmVyeSBsYXJnZS4gQWxzbywKKyMgICAgbWVtdXNlLXBlci1zaXplIHNob3VsZCByZW1haW4gc2FuZSAobGVzcyB0aGFuIGEgZmV3IHRob3VzYW5kKTsgaWYgeW91cgorIyAgICB0ZXN0IHVzZXMgbW9yZSwgYWRqdXN0ICdzaXplJyB1cHdhcmQsIGluc3RlYWQuCisKK2NsYXNzIFN0clRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9jYXBpdGFsaXplKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gJy0nICogc2l6ZSArIFNVQlNUUgorICAgICAgICBjYXBzID0gcy5jYXBpdGFsaXplKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXBzWy1sZW4oU1VCU1RSKTpdLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlNUUi5jYXBpdGFsaXplKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2Fwcy5sc3RyaXAoJy0nKSwgU1VCU1RSKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfY2VudGVyKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gU1VCU1RSLmNlbnRlcihzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgbHBhZHNpemUgPSBycGFkc2l6ZSA9IChsZW4ocykgLSBsZW4oU1VCU1RSKSkgLy8gMgorICAgICAgICBpZiBsZW4ocykgJSAyOgorICAgICAgICAgICAgbHBhZHNpemUgKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbbHBhZHNpemU6LXJwYWRzaXplXSwgU1VCU1RSKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RyaXAoKSwgU1VCU1RSLnN0cmlwKCkpCisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV8yRyAtIDEsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2NlbnRlcl91bmljb2RlKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSB1JyBhYmMgZGVmIGdoaScKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcyA9IFNVQlNUUi5jZW50ZXIoc2l6ZSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICAgICAgbHBhZHNpemUgPSBycGFkc2l6ZSA9IChsZW4ocykgLSBsZW4oU1VCU1RSKSkgLy8gMgorICAgICAgICAgICAgaWYgbGVuKHMpICUgMjoKKyAgICAgICAgICAgICAgICBscGFkc2l6ZSArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbbHBhZHNpemU6LXJwYWRzaXplXSwgU1VCU1RSKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQorICAgICAgICAgICAgZGVsIHMKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9ICcuJyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcuJyksIHNpemUpCisgICAgICAgIHMgKz0gJy4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnLicpLCBzaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcgJyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnaScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJ2onKSwgMCkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTMpCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJy4nICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzLmRlY29kZSgndXRmLTgnKSksIHNpemUpCisKKyAgICBkZWYgYmFzaWNfZW5jb2RlX3Rlc3Qoc2VsZiwgc2l6ZSwgZW5jLCBjPXUnLicsIGV4cGVjdGVkc2l6ZT1Ob25lKToKKyAgICAgICAgaWYgZXhwZWN0ZWRzaXplIGlzIE5vbmU6CisgICAgICAgICAgICBleHBlY3RlZHNpemUgPSBzaXplCisKKyAgICAgICAgcyA9IGMgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMuZW5jb2RlKGVuYykpLCBleHBlY3RlZHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0zKQorICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ3V0Zi04JykKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDYgKyAyLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9lbmNvZGVfcmF3X3VuaWNvZGVfZXNjYXBlKHNlbGYsIHNpemUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAncmF3X3VuaWNvZGVfZXNjYXBlJykKKyAgICAgICAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgICAgICAgICAgcGFzcyAjIGFjY2VwdGFibGUgb24gMzItYml0CisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyAvLyA1ICsgNzAsIG1lbXVzZT0zKQorICAgIGRlZiB0ZXN0X2VuY29kZV91dGY3KHNlbGYsIHNpemUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAndXRmNycpCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgLy8gNCArIDUsIG1lbXVzZT02KQorICAgIGRlZiB0ZXN0X2VuY29kZV91dGYzMihzZWxmLCBzaXplKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfZW5jb2RlX3Rlc3Qoc2l6ZSwgJ3V0ZjMyJywgZXhwZWN0ZWRzaXplPTQqc2l6ZSs0KQorICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CisgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHLTEsIG1lbXVzZT00KQorICAgIGRlZiB0ZXN0X2RlY29kZWFzY2lpKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY19lbmNvZGVfdGVzdChzaXplLCAnYXNjaWknLCBjPSdBJykKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC8vIDUsIG1lbXVzZT02KzIpCisgICAgZGVmIHRlc3RfdW5pY29kZV9yZXByX29mbHcoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuc2tpcFRlc3QoInRlc3QgY3Jhc2hlcyAtIHNlZSBpc3N1ZSAjMTQ5MDQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gdSJcdUFBQUEiKnNpemUKKyAgICAgICAgICAgIHIgPSByZXByKHMpCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gZXZhbChyKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9lbmRzd2l0aChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9ICctJyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoU1VCU1RSKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgocykpCisgICAgICAgIHMyID0gJy4uLicgKyBzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMi5lbmRzd2l0aChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmVuZHN3aXRoKCdhJyArIFNVQlNUUikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoU1VCU1RSLmVuZHN3aXRoKHMpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfZXhwYW5kdGFicyhzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICctJyAqIHNpemUKKyAgICAgICAgdGFic2l6ZSA9IDgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmV4cGFuZHRhYnMoKSwgcykKKyAgICAgICAgZGVsIHMKKyAgICAgICAgc2xlbiwgcmVtYWluZGVyID0gZGl2bW9kKHNpemUsIHRhYnNpemUpCisgICAgICAgIHMgPSAnICAgICAgIFx0JyAqIHNsZW4KKyAgICAgICAgcyA9IHMuZXhwYW5kdGFicyh0YWJzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAtIHJlbWFpbmRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocy5zdHJpcCgnICcpKSwgMCkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzdWJsZW4gPSBsZW4oU1VCU1RSKQorICAgICAgICBzID0gJycuam9pbihbU1VCU1RSLCAnLScgKiBzaXplLCBTVUJTVFJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZmluZCgnICcpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZmluZChTVUJTVFIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZmluZCgnICcsIHN1YmxlbiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKFNVQlNUUiwgbGVuKFNVQlNUUikpLCBzdWJsZW4gKyBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZmluZCgnaScpLCBTVUJTVFIuZmluZCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZmluZCgnaScsIHN1YmxlbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5maW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKCdpJywgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5maW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5maW5kKCdqJyksIC0xKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzdWJsZW4gPSBsZW4oU1VCU1RSKQorICAgICAgICBzID0gJycuam9pbihbU1VCU1RSLCAnLScgKiBzaXplLCBTVUJTVFJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuaW5kZXgoJyAnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmluZGV4KFNVQlNUUiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbmRleCgnICcsIHN1YmxlbiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbmRleChTVUJTVFIsIHN1YmxlbiksIHN1YmxlbiArIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbmRleCgnaScpLCBTVUJTVFIuaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmluZGV4KCdpJywgc3VibGVuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdWJsZW4gKyBzaXplICsgU1VCU1RSLmluZGV4KCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbmRleCgnaScsIHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmxlbiArIHNpemUgKyBTVUJTVFIuaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcy5pbmRleCwgJ2onKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzYWxudW0oc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcxMjM0NTYnCisgICAgICAgIHMgPSAnYScgKiBzaXplICsgU1VCU1RSCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzYWxudW0oKSkKKyAgICAgICAgcyArPSAnLicKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzYWxudW0oKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9pc2FscGhhKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnenp6enp6eicKKyAgICAgICAgcyA9ICdhJyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXNhbHBoYSgpKQorICAgICAgICBzICs9ICcuJworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNhbHBoYSgpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzZGlnaXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcxMjM0NTYnCisgICAgICAgIHMgPSAnOScgKiBzaXplICsgU1VCU1RSCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzZGlnaXQoKSkKKyAgICAgICAgcyArPSAneicKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzZGlnaXQoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9pc2xvd2VyKHNlbGYsIHNpemUpOgorICAgICAgICBjaGFycyA9ICcnLmpvaW4oWyBjaHIoYykgZm9yIGMgaW4gcmFuZ2UoMjU1KSBpZiBub3QgY2hyKGMpLmlzdXBwZXIoKSBdKQorICAgICAgICByZXBlYXRzID0gc2l6ZSAvLyBsZW4oY2hhcnMpICsgMgorICAgICAgICBzID0gY2hhcnMgKiByZXBlYXRzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzbG93ZXIoKSkKKyAgICAgICAgcyArPSAnQScKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzbG93ZXIoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9pc3NwYWNlKHNlbGYsIHNpemUpOgorICAgICAgICB3aGl0ZXNwYWNlID0gJyBcZlxuXHJcdFx2JworICAgICAgICByZXBlYXRzID0gc2l6ZSAvLyBsZW4od2hpdGVzcGFjZSkgKyAyCisgICAgICAgIHMgPSB3aGl0ZXNwYWNlICogcmVwZWF0cworICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3NwYWNlKCkpCisgICAgICAgIHMgKz0gJ2onCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc3NwYWNlKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfaXN0aXRsZShzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKKyAgICAgICAgcyA9ICcnLmpvaW4oWydBJywgJ2EnICogc2l6ZSwgU1VCU1RSXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXN0aXRsZSgpKQorICAgICAgICBzICs9ICdBJworICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3RpdGxlKCkpCisgICAgICAgIHMgKz0gJ2FBJworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXN0aXRsZSgpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2lzdXBwZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIGNoYXJzID0gJycuam9pbihbIGNocihjKSBmb3IgYyBpbiByYW5nZSgyNTUpIGlmIG5vdCBjaHIoYykuaXNsb3dlcigpIF0pCisgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbihjaGFycykgKyAyCisgICAgICAgIHMgPSBjaGFycyAqIHJlcGVhdHMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXN1cHBlcigpKQorICAgICAgICBzICs9ICdhJworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXN1cHBlcigpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2pvaW4oc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnQScgKiBzaXplCisgICAgICAgIHggPSBzLmpvaW4oWydhYWFhYScsICdiYmJiYiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguY291bnQoJ2EnKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmNvdW50KCdiJyksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LnN0YXJ0c3dpdGgoJ2FhYWFhQScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5lbmRzd2l0aCgnQWJiYmJiJykpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9sanVzdChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9IFNVQlNUUi5sanVzdChzaXplKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKFNVQlNUUiArICcgICcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfbG93ZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnQScgKiBzaXplCisgICAgICAgIHMgPSBzLmxvd2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnYScpLCBzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfbHN0cmlwKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSBTVUJTVFIucmp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sc3RyaXAoKSwgU1VCU1RSLmxzdHJpcCgpKQorICAgICAgICBkZWwgcworICAgICAgICBzID0gU1VCU1RSLmxqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzdHJpcHBlZCA9IHMubHN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmlwcGVkIGlzIHMpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYsIHNpemUpOgorICAgICAgICByZXBsYWNlbWVudCA9ICdhJworICAgICAgICBzID0gJyAnICogc2l6ZQorICAgICAgICBzID0gcy5yZXBsYWNlKCcgJywgcmVwbGFjZW1lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQocmVwbGFjZW1lbnQpLCBzaXplKQorICAgICAgICBzID0gcy5yZXBsYWNlKHJlcGxhY2VtZW50LCAnICcsIHNpemUgLSA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KHJlcGxhY2VtZW50KSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWy0xMDpdLCAnICAgICAgYWFhYScpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3RfcmZpbmQoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSAnJy5qb2luKFtTVUJTVFIsICctJyAqIHNpemUsIFNVQlNUUl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZmluZCgnICcpLCBzdWJsZW4gKyBzaXplICsgU1VCU1RSLnJmaW5kKCcgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZmluZChTVUJTVFIpLCBzdWJsZW4gKyBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmZpbmQoJyAnLCAwLCBzaXplKSwgU1VCU1RSLnJmaW5kKCcgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZmluZChTVUJTVFIsIDAsIHN1YmxlbiArIHNpemUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmZpbmQoJ2knKSwgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5yZmluZCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmZpbmQoJ2knLCAwLCBzdWJsZW4pLCBTVUJTVFIucmZpbmQoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJmaW5kKCdpJywgMCwgc3VibGVuICsgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RSLnJmaW5kKCdpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZmluZCgnaicpLCAtMSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9yaW5kZXgoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSAnJy5qb2luKFtTVUJTVFIsICctJyAqIHNpemUsIFNVQlNUUl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yaW5kZXgoJyAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5yaW5kZXgoJyAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJpbmRleChTVUJTVFIpLCBzdWJsZW4gKyBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmluZGV4KCcgJywgMCwgc3VibGVuICsgc2l6ZSAtIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlNUUi5yaW5kZXgoJyAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJpbmRleChTVUJTVFIsIDAsIHN1YmxlbiArIHNpemUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmluZGV4KCdpJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VibGVuICsgc2l6ZSArIFNVQlNUUi5yaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJpbmRleCgnaScsIDAsIHN1YmxlbiksIFNVQlNUUi5yaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJpbmRleCgnaScsIDAsIHN1YmxlbiArIHNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNVQlNUUi5yaW5kZXgoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcy5yaW5kZXgsICdqJykKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X3JqdXN0KHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJworICAgICAgICBzID0gU1VCU1RSLmxqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoU1VCU1RSICsgJyAgJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RyaXAoKSwgU1VCU1RSLnN0cmlwKCkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9yc3RyaXAoc2VsZiwgc2l6ZSk6CisgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCisgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yc3RyaXAoKSwgU1VCU1RSLnJzdHJpcCgpKQorICAgICAgICBkZWwgcworICAgICAgICBzID0gU1VCU1RSLnJqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzdHJpcHBlZCA9IHMucnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmlwcGVkIGlzIHMpCisKKyAgICAjIFRoZSB0ZXN0IHRha2VzIGFib3V0IHNpemUgYnl0ZXMgdG8gYnVpbGQgYSBzdHJpbmcsIGFuZCB0aGVuIGFib3V0CisgICAgIyBzcXJ0KHNpemUpIHN1YnN0cmluZ3Mgb2Ygc3FydChzaXplKSBpbiBzaXplIGFuZCBhIGxpc3QgdG8KKyAgICAjIGhvbGQgc3FydChzaXplKSBpdGVtcy4gSXQncyBjbG9zZSBidXQganVzdCBvdmVyIDJ4IHNpemUuCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yLjEpCisgICAgZGVmIHRlc3Rfc3BsaXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgICMgQ3J1ZGVseSBjYWxjdWxhdGUgYW4gZXN0aW1hdGUgc28gdGhhdCB0aGUgcmVzdWx0IG9mIHMuc3BsaXQgd29uJ3QKKyAgICAgICAgIyB0YWtlIHVwIGFuIGlub3JkaW5hdGUgYW1vdW50IG9mIG1lbW9yeQorICAgICAgICBjaHVua3NpemUgPSBpbnQoc2l6ZSAqKiAwLjUgKyAyKQorICAgICAgICBTVUJTVFIgPSAnYScgKyAnICcgKiBjaHVua3NpemUKKyAgICAgICAgcyA9IFNVQlNUUiAqIGNodW5rc2l6ZQorICAgICAgICBsID0gcy5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBjaHVua3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGwpLCBzZXQoWydhJ10pKQorICAgICAgICBkZWwgbAorICAgICAgICBsID0gcy5zcGxpdCgnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBjaHVua3NpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChsKSwgc2V0KFsnJywgJyAnICogY2h1bmtzaXplXSkpCisKKyAgICAjIEFsbG9jYXRlcyBhIHN0cmluZyBvZiB0d2ljZSBzaXplIChhbmQgYnJpZWZseSB0d28pIGFuZCBhIGxpc3Qgb2YKKyAgICAjIHNpemUuICBCZWNhdXNlIG9mIGludGVybmFsIGFmZmFpcnMsIHRoZSBzLnNwbGl0KCkgY2FsbCBwcm9kdWNlcyBhCisgICAgIyBsaXN0IG9mIHNpemUgdGltZXMgdGhlIHNhbWUgb25lLWNoYXJhY3RlciBzdHJpbmcsIHNvIHdlIG9ubHkKKyAgICAjIHN1ZmZlciBmb3IgdGhlIGxpc3Qgc2l6ZS4gKE90aGVyd2lzZSwgaXQnZCBjb3N0IGFub3RoZXIgNDggdGltZXMKKyAgICAjIHNpemUgaW4gYnl0ZXMhKSBOZXZlcnRoZWxlc3MsIGEgbGlzdCBvZiBzaXplIHRha2VzCisgICAgIyA4KnNpemUgYnl0ZXMuCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyA1LCBtZW11c2U9MTApCisgICAgZGVmIHRlc3Rfc3BsaXRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnIGEnICogc2l6ZSArICcgJworICAgICAgICBsID0gcy5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChsKSwgc2V0KFsnYSddKSkKKyAgICAgICAgZGVsIGwKKyAgICAgICAgbCA9IHMuc3BsaXQoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGwpLCBzZXQoWycgJ10pKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yLjEpCisgICAgZGVmIHRlc3Rfc3BsaXRsaW5lcyhzZWxmLCBzaXplKToKKyAgICAgICAgIyBDcnVkZWx5IGNhbGN1bGF0ZSBhbiBlc3RpbWF0ZSBzbyB0aGF0IHRoZSByZXN1bHQgb2Ygcy5zcGxpdCB3b24ndAorICAgICAgICAjIHRha2UgdXAgYW4gaW5vcmRpbmF0ZSBhbW91bnQgb2YgbWVtb3J5CisgICAgICAgIGNodW5rc2l6ZSA9IGludChzaXplICoqIDAuNSArIDIpIC8vIDIKKyAgICAgICAgU1VCU1RSID0gJyAnICogY2h1bmtzaXplICsgJ1xuJyArICcgJyAqIGNodW5rc2l6ZSArICdcclxuJworICAgICAgICBzID0gU1VCU1RSICogY2h1bmtzaXplCisgICAgICAgIGwgPSBzLnNwbGl0bGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgY2h1bmtzaXplICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQobCksIHNldChbJyAnICogY2h1bmtzaXplXSkpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCisgICAgZGVmIHRlc3Rfc3RhcnRzd2l0aChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyBhYmMgZGVmIGdoaScKKyAgICAgICAgcyA9ICctJyAqIHNpemUgKyBTVUJTVFIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgnLScgKiBzaXplKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLnN0YXJ0c3dpdGgoU1VCU1RSKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9zdHJpcChzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJyAgIGFiYyBkZWYgZ2hpICAgJworICAgICAgICBzID0gU1VCU1RSLnJqdXN0KHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RyaXAoKSwgU1VCU1RSLnN0cmlwKCkpCisgICAgICAgIGRlbCBzCisgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdHJpcCgpLCBTVUJTVFIuc3RyaXAoKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9zd2FwY2FzZShzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gImFCY0RlRkcxMi4nXHhhOVx4MDAiCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIHN1YmxlbiArIDIKKyAgICAgICAgcyA9IFNVQlNUUiAqIHJlcGVhdHMKKyAgICAgICAgcyA9IHMuc3dhcGNhc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc3VibGVuICogcmVwZWF0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzpzdWJsZW4gKiAzXSwgU1VCU1RSLnN3YXBjYXNlKCkgKiAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbLXN1YmxlbiAqIDM6XSwgU1VCU1RSLnN3YXBjYXNlKCkgKiAzKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3RpdGxlKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnU3BhYUhBYWFBYWhhbScKKyAgICAgICAgcyA9IFNVQlNUUiAqIChzaXplIC8vIGxlbihTVUJTVFIpICsgMikKKyAgICAgICAgcyA9IHMudGl0bGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKChTVUJTVFIgKiAzKS50aXRsZSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoU1VCU1RSLmxvd2VyKCkgKiAzKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHRyYW5zID0gc3RyaW5nLm1ha2V0cmFucygnLmFaJywgJy0hJCcpCisgICAgICAgIFNVQlNUUiA9ICdhWnouei5BYXouJworICAgICAgICBzdWJsZW4gPSBsZW4oU1VCU1RSKQorICAgICAgICByZXBlYXRzID0gc2l6ZSAvLyBzdWJsZW4gKyAyCisgICAgICAgIHMgPSBTVUJTVFIgKiByZXBlYXRzCisgICAgICAgIHMgPSBzLnRyYW5zbGF0ZSh0cmFucykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHJlcGVhdHMgKiBzdWJsZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1s6c3VibGVuXSwgU1VCU1RSLnRyYW5zbGF0ZSh0cmFucykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stc3VibGVuOl0sIFNVQlNUUi50cmFuc2xhdGUodHJhbnMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJy4nKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCchJyksIHJlcGVhdHMgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJ3onKSwgcmVwZWF0cyAqIDMpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDUsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X3VwcGVyKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gJ2EnICogc2l6ZQorICAgICAgICBzID0gcy51cHBlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJ0EnKSwgc2l6ZSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMjAsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X3pmaWxsKHNlbGYsIHNpemUpOgorICAgICAgICBTVUJTVFIgPSAnLTU2ODMyNDcyMzU5ODIzNCcKKyAgICAgICAgcyA9IFNVQlNUUi56ZmlsbChzaXplKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aCgnMCcgKyBTVUJTVFJbMTpdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgnLTAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnMCcpLCBzaXplIC0gbGVuKFNVQlNUUikpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnLScgKiBzaXplCisgICAgICAgIHNmID0gJyVzJyAlIChzLCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gc2YpCisgICAgICAgIGRlbCBzZgorICAgICAgICBzZiA9ICcuLiVzLi4nICUgKHMsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZiksIGxlbihzKSArIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZi5zdGFydHN3aXRoKCcuLi0nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNmLmVuZHN3aXRoKCctLi4nKSkKKyAgICAgICAgZGVsIHMsIHNmCisKKyAgICAgICAgc2l6ZSAvLz0gMgorICAgICAgICBlZGdlID0gJy0nICogc2l6ZQorICAgICAgICBzID0gJycuam9pbihbZWRnZSwgJyVzJywgZWRnZV0pCisgICAgICAgIGRlbCBlZGdlCisgICAgICAgIHMgPSBzICUgJy4uLicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKiAyICsgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcuJyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnLScpLCBzaXplICogMikKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT01KQorICAgIGRlZiB0ZXN0X3JlcHJfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnLScgKiBzaXplCisgICAgICAgIHMgPSByZXByKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzBdLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stMV0sICInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCctJyksIHNpemUpCisgICAgICAgIGRlbCBzCisgICAgICAgICMgcmVwcigpIHdpbGwgY3JlYXRlIGEgc3RyaW5nIGZvdXIgdGltZXMgYXMgbGFyZ2UgYXMgdGhpcyAnYmluYXJ5CisgICAgICAgICMgc3RyaW5nJywgYnV0IHdlIGRvbid0IHdhbnQgdG8gYWxsb2NhdGUgbXVjaCBtb3JlIHRoYW4gdHdpY2UKKyAgICAgICAgIyBzaXplIGluIHRvdGFsLiAgKFdlIGRvIGV4dHJhIHRlc3RpbmcgaW4gdGVzdF9yZXByX2xhcmdlKCkpCisgICAgICAgIHMgPSAnXHgwMCcgKiBzaXplCisgICAgICAgIHMgPSByZXByKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplICogNCArIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1swXSwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbLTFdLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnXFwnKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcwJyksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTUpCisgICAgZGVmIHRlc3RfcmVwcl9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICdceDAwJyAqIHNpemUKKyAgICAgICAgcyA9IHJlcHIocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKiA0ICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzBdLCAiJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stMV0sICInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCdcXCcpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJzAnKSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPTIqKjMyIC8vIDUsIG1lbXVzZT02KzIpCisgICAgZGVmIHRlc3RfdW5pY29kZV9yZXByKHNlbGYsIHNpemUpOgorICAgICAgICBzID0gdSJcdUFBQUEiICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHJlcHIocykpID4gc2l6ZSkKKworICAgICMgVGhpcyB0ZXN0IGlzIG1lYW5pbmdmdWwgZXZlbiB3aXRoIHNpemUgPCAyRywgYXMgbG9uZyBhcyB0aGUKKyAgICAjIGRvdWJsZWQgc3RyaW5nIGlzID4gMkcgKGJ1dCBpdCB0ZXN0cyBtb3JlIGlmIGJvdGggYXJlID4gMkcgOikKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8xRyArIDIsIG1lbXVzZT0zKQorICAgIGRlZiB0ZXN0X2NvbmNhdChzZWxmLCBzaXplKToKKyAgICAgICAgcyA9ICcuJyAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUpCisgICAgICAgIHMgPSBzICsgcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgc2l6ZSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jb3VudCgnLicpLCBzaXplICogMikKKworICAgICMgVGhpcyB0ZXN0IGlzIG1lYW5pbmdmdWwgZXZlbiB3aXRoIHNpemUgPCAyRywgYXMgbG9uZyBhcyB0aGUKKyAgICAjIHJlcGVhdGVkIHN0cmluZyBpcyA+IDJHIChidXQgaXQgdGVzdHMgbW9yZSBpZiBib3RoIGFyZSA+IDJHIDopCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMUcgKyAyLCBtZW11c2U9MykKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMgPSAnLicgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBzaXplKQorICAgICAgICBzID0gcyAqIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY291bnQoJy4nKSwgc2l6ZSAqIDIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIwLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9zbGljZV9hbmRfZ2V0aXRlbShzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJzAxMjM0NTY3ODknCisgICAgICAgIHN1YmxlbiA9IGxlbihTVUJTVFIpCisgICAgICAgIHMgPSBTVUJTVFIgKiAoc2l6ZSAvLyBzdWJsZW4pCisgICAgICAgIHN0ZXBzaXplID0gbGVuKHMpIC8vIDEwMAorICAgICAgICBzdGVwc2l6ZSA9IHN0ZXBzaXplIC0gKHN0ZXBzaXplICUgc3VibGVuKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4ocykgLSBzdGVwc2l6ZSwgc3RlcHNpemUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzW2ldLCBTVUJTVFJbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbaTppICsgc3VibGVuXSwgU1VCU1RSKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzW2k6aSArIHN1YmxlbjoyXSwgU1VCU1RSWzo6Ml0pCisgICAgICAgICAgICBpZiBpID4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbaSArIHN1YmxlbiAtIDE6aSAtIDE6LTNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VCU1RSW3N1Ymxlbjo6LTNdKQorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkbyBzb21lIHNsaWNpbmcgYW5kIGluZGV4aW5nIG5lYXIgdGhlIGVuZCBvZiB0aGUKKyAgICAgICAgIyBzdHJpbmcsIHRvby4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzW2xlbihzKSAtIDFdLCBTVUJTVFJbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbLTFdLCBTVUJTVFJbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbbGVuKHMpIC0gMTBdLCBTVUJTVFJbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stc3VibGVuXSwgU1VCU1RSWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbbGVuKHMpOl0sICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbbGVuKHMpIC0gMTpdLCBTVUJTVFJbLTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbLTE6XSwgU1VCU1RSWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzW2xlbihzKSAtIHN1YmxlbjpdLCBTVUJTVFIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1stc3VibGVuOl0sIFNVQlNUUikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc1s6XSksIGxlbihzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc1s6bGVuKHMpIC0gNV0pLCBsZW4ocykgLSA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzWzU6LTVdKSwgbGVuKHMpIC0gMTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgcywgbGVuKHMpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5nZXRpdGVtLCBzLCBsZW4ocykgKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5nZXRpdGVtLCBzLCBsZW4ocykgKyAxPDwzMSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmLCBzaXplKToKKyAgICAgICAgU1VCU1RSID0gJzAxMjM0NTY3ODknCisgICAgICAgIGVkZ2UgPSAnLScgKiAoc2l6ZSAvLyAyKQorICAgICAgICBzID0gJycuam9pbihbZWRnZSwgU1VCU1RSLCBlZGdlXSkKKyAgICAgICAgZGVsIGVkZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRJbihTVUJTVFIsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oU1VCU1RSICogMiwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignLScsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2EnLCBzKQorICAgICAgICBzICs9ICdhJworICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgcykKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHMxID0gJy0nICogc2l6ZQorICAgICAgICBzMiA9ICctJyAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMxID09IHMyKQorICAgICAgICBkZWwgczIKKyAgICAgICAgczIgPSBzMSArICdhJworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMxID09IHMyKQorICAgICAgICBkZWwgczIKKyAgICAgICAgczIgPSAnLicgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoczEgPT0gczIpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYsIHNpemUpOgorICAgICAgICAjIE5vdCBzdXJlIGlmIHdlIGNhbiBkbyBhbnkgbWVhbmluZ2Z1bCB0ZXN0cyBoZXJlLi4uICBFdmVuIGlmIHdlCisgICAgICAgICMgc3RhcnQgcmVseWluZyBvbiB0aGUgZXhhY3QgYWxnb3JpdGhtIHVzZWQsIHRoZSByZXN1bHQgd2lsbCBiZQorICAgICAgICAjIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YgdGhlIEMgJ2xvbmcgaW50Jy4gIEV2ZW4gdGhpcworICAgICAgICAjIHRlc3QgaXMgZG9kZ3kgKHRoZXJlJ3Mgbm8gKmd1YXJhbnRlZSogdGhhdCB0aGUgdHdvIHRoaW5ncyBzaG91bGQKKyAgICAgICAgIyBoYXZlIGEgZGlmZmVyZW50IGhhc2gsIGV2ZW4gaWYgdGhleSwgaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiwgYWxtb3N0IGFsd2F5cyBkby4pCisgICAgICAgIHMgPSAnXHgwMCcgKiBzaXplCisgICAgICAgIGgxID0gaGFzaChzKQorICAgICAgICBkZWwgcworICAgICAgICBzID0gJ1x4MDAnICogKHNpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGgxID09IGhhc2gocykpCisKK2NsYXNzIFR1cGxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIFR1cGxlcyBoYXZlIGEgc21hbGwsIGZpeGVkLXNpemVkIGhlYWQgYW5kIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvCisgICAgIyBkYXRhLiAgU2luY2Ugd2UncmUgdGVzdGluZyA2NC1iaXQgYWRkcmVzc2luZywgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZQorICAgICMgcG9pbnRlcnMgYXJlIDggYnl0ZXMsIGFuZCB0aGF0IHRodXMgdGhhdCB0aGUgdHVwbGVzIHRha2UgdXAgOCBieXRlcworICAgICMgcGVyIHNpemUuCisKKyAgICAjIEFzIGEgc2lkZS1lZmZlY3Qgb2YgdGVzdGluZyBsb25nIHR1cGxlcywgdGhlc2UgdGVzdHMgaGFwcGVuIHRvIHRlc3QKKyAgICAjIGhhdmluZyBtb3JlIHRoYW4gMjw8MzEgcmVmZXJlbmNlcyB0byBhbnkgZ2l2ZW4gb2JqZWN0LiBIZW5jZSB0aGUKKyAgICAjIHVzZSBvZiBkaWZmZXJlbnQgdHlwZXMgb2Ygb2JqZWN0cyBhcyBjb250ZW50cyBpbiBkaWZmZXJlbnQgdGVzdHMuCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0xNikKKyAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYsIHNpemUpOgorICAgICAgICB0MSA9ICh1JycsKSAqIHNpemUKKyAgICAgICAgdDIgPSAodScnLCkgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA9PSB0MikKKyAgICAgICAgZGVsIHQyCisgICAgICAgIHQyID0gKHUnJywpICogKHNpemUgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID09IHQyKQorICAgICAgICBkZWwgdDIKKyAgICAgICAgdDIgPSAoMSwpICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQxID09IHQyKQorCisgICAgIyBUZXN0IGNvbmNhdGVuYXRpbmcgaW50byBhIHNpbmdsZSB0dXBsZSBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoLAorICAgICMgYW5kIGNvbmNhdGVuYXRpbmcgYSB0dXBsZSBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoIHNlcGFyYXRlbHksIHNvCisgICAgIyB0aGUgc21hbGxlciB0ZXN0IHN0aWxsIGdldHMgcnVuIGV2ZW4gaWYgdGhlcmUgaXNuJ3QgbWVtb3J5IGZvciB0aGUKKyAgICAjIGxhcmdlciB0ZXN0IChidXQgd2Ugc3RpbGwgbGV0IHRoZSB0ZXN0ZXIga25vdyB0aGUgbGFyZ2VyIHRlc3QgaXMKKyAgICAjIHNraXBwZWQsIGluIHZlcmJvc2UgbW9kZS4pCisgICAgZGVmIGJhc2ljX2NvbmNhdF90ZXN0KHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKCgpLCkgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCBzaXplKQorICAgICAgICB0ID0gdCArIHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMiArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9jb25jYXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2NvbmNhdF90ZXN0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9jb25jYXRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX2NvbmNhdF90ZXN0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgMTAsIG1lbXVzZT04ICogNSkKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmLCBzaXplKToKKyAgICAgICAgdCA9ICgxLCAyLCAzLCA0LCA1KSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIHNpemUgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEluKDUsIHQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oKDEsIDIsIDMsIDQsIDUpLCB0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDAsIHQpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9OCkKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYsIHNpemUpOgorICAgICAgICB0MSA9ICgwLCkgKiBzaXplCisgICAgICAgIGgxID0gaGFzaCh0MSkKKyAgICAgICAgZGVsIHQxCisgICAgICAgIHQyID0gKDAsKSAqIChzaXplICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoMSA9PSBoYXNoKHQyKSkKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQorICAgIGRlZiB0ZXN0X2luZGV4X2FuZF9zbGljZShzZWxmLCBzaXplKToKKyAgICAgICAgdCA9IChOb25lLCkgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbLTFdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbNV0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFtzaXplIC0gMV0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHQsIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFs6NV0sIChOb25lLCkgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbLTU6XSwgKE5vbmUsKSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFsyMDoyNV0sIChOb25lLCkgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbLTI1Oi0yMF0sIChOb25lLCkgKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbc2l6ZSAtIDU6XSwgKE5vbmUsKSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFtzaXplIC0gNTpzaXplXSwgKE5vbmUsKSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFtzaXplIC0gNjpzaXplIC0gMl0sIChOb25lLCkgKiA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRbc2l6ZTpzaXplXSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFtzaXplOnNpemUrNV0sICgpKQorCisgICAgIyBMaWtlIHRlc3RfY29uY2F0LCBzcGxpdCBpbiB0d28uCisgICAgZGVmIGJhc2ljX3Rlc3RfcmVwZWF0KHNlbGYsIHNpemUpOgorICAgICAgICB0ID0gKCcnLCkgKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCBzaXplKQorICAgICAgICB0ID0gdCAqIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMiArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9yZXBlYXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfcmVwZWF0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9yZXBlYXRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfcmVwZWF0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8xRyAtIDEsIG1lbXVzZT0xMikKKyAgICBkZWYgdGVzdF9yZXBlYXRfbGFyZ2VfMihzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXBlYXQoc2l6ZSkKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHIC0gMSwgbWVtdXNlPTkpCisgICAgZGVmIHRlc3RfZnJvbV8yR19nZW5lcmF0b3Ioc2VsZiwgc2l6ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQgPSB0dXBsZSh4cmFuZ2Uoc2l6ZSkpCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlIG9uIDMyLWJpdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICBmb3IgaXRlbSBpbiB0OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgY291bnQpCisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgc2l6ZSkKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHIC0gMjUsIG1lbXVzZT05KQorICAgIGRlZiB0ZXN0X2Zyb21fYWxtb3N0XzJHX2dlbmVyYXRvcihzZWxmLCBzaXplKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdCA9IHR1cGxlKHhyYW5nZShzaXplKSkKKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gdDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0sIGNvdW50KQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIHNpemUpCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyBhY2NlcHRhYmxlLCBleHBlY3RlZCBvbiAzMi1iaXQKKworICAgICMgTGlrZSB0ZXN0X2NvbmNhdCwgc3BsaXQgaW4gdHdvLgorICAgIGRlZiBiYXNpY190ZXN0X3JlcHIoc2VsZiwgc2l6ZSk6CisgICAgICAgIHQgPSAoMCwpICogc2l6ZQorICAgICAgICBzID0gcmVwcih0KQorICAgICAgICAjIFRoZSByZXByIG9mIGEgdHVwbGUgb2YgMCdzIGlzIGV4YWN0bHkgdGhyZWUgdGltZXMgdGhlIHR1cGxlIGxlbmd0aC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKiAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbOjVdLCAnKDAsIDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbLTU6XSwgJzAsIDApJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcwJyksIHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAzICsgMiwgbWVtdXNlPTggKyAzKQorICAgIGRlZiB0ZXN0X3JlcHJfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfcmVwcihzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9OCArIDMpCisgICAgZGVmIHRlc3RfcmVwcl9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXByKHNpemUpCisKK2NsYXNzIExpc3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgTGlrZSB0dXBsZXMsIGxpc3RzIGhhdmUgYSBzbWFsbCwgZml4ZWQtc2l6ZWQgaGVhZCBhbmQgYW4gYXJyYXkgb2YKKyAgICAjIHBvaW50ZXJzIHRvIGRhdGEsIHNvIDggYnl0ZXMgcGVyIHNpemUuIEFsc28gbGlrZSB0dXBsZXMsIHdlIG1ha2UgdGhlCisgICAgIyBsaXN0cyBob2xkIHJlZmVyZW5jZXMgdG8gdmFyaW91cyBvYmplY3RzIHRvIHRlc3QgdGhlaXIgcmVmY291bnQKKyAgICAjIGxpbWl0cy4KKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMiwgbWVtdXNlPTE2KQorICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwxID0gW3UnJ10gKiBzaXplCisgICAgICAgIGwyID0gW3UnJ10gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsMSA9PSBsMikKKyAgICAgICAgZGVsIGwyCisgICAgICAgIGwyID0gW3UnJ10gKiAoc2l6ZSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobDEgPT0gbDIpCisgICAgICAgIGRlbCBsMgorICAgICAgICBsMiA9IFsyXSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMSA9PSBsMikKKworICAgICMgVGVzdCBjb25jYXRlbmF0aW5nIGludG8gYSBzaW5nbGUgbGlzdCBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoLAorICAgICMgYW5kIGNvbmNhdGVuYXRpbmcgYSBsaXN0IG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGggc2VwYXJhdGVseSwgc28KKyAgICAjIHRoZSBzbWFsbGVyIHRlc3Qgc3RpbGwgZ2V0cyBydW4gZXZlbiBpZiB0aGVyZSBpc24ndCBtZW1vcnkgZm9yIHRoZQorICAgICMgbGFyZ2VyIHRlc3QgKGJ1dCB3ZSBzdGlsbCBsZXQgdGhlIHRlc3RlciBrbm93IHRoZSBsYXJnZXIgdGVzdCBpcworICAgICMgc2tpcHBlZCwgaW4gdmVyYm9zZSBtb2RlLikKKyAgICBkZWYgYmFzaWNfdGVzdF9jb25jYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbW11dICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgbCA9IGwgKyBsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplICogMikKKworICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MjQpCisgICAgZGVmIHRlc3RfY29uY2F0X3NtYWxsKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2NvbmNhdChzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9MjQpCisgICAgZGVmIHRlc3RfY29uY2F0X2xhcmdlKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2NvbmNhdChzaXplKQorCisgICAgZGVmIGJhc2ljX3Rlc3RfaW5wbGFjZV9jb25jYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbc3lzLnN0ZG91dF0gKiBzaXplCisgICAgICAgIGwgKz0gbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsWzBdIGlzIGxbLTFdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFtzaXplIC0gMV0gaXMgbFtzaXplICsgMV0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTI0KQorICAgIGRlZiB0ZXN0X2lucGxhY2VfY29uY2F0X3NtYWxsKHNlbGYsIHNpemUpOgorICAgICAgICByZXR1cm4gc2VsZi5iYXNpY190ZXN0X2lucGxhY2VfY29uY2F0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9pbnBsYWNlX2NvbmNhdF9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9pbnBsYWNlX2NvbmNhdChzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gNSArIDEwLCBtZW11c2U9OCAqIDUpCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMSwgMiwgMywgNCwgNV0gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbig1LCBsKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKFsxLCAyLCAzLCA0LCA1XSwgbCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigwLCBsKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTgpCisgICAgZGVmIHRlc3RfaGFzaChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFswXSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBsKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTgpCisgICAgZGVmIHRlc3RfaW5kZXhfYW5kX3NsaWNlKHNlbGYsIHNpemUpOgorICAgICAgICBsID0gW05vbmVdICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy0xXSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzVdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbc2l6ZSAtIDFdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5nZXRpdGVtLCBsLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbOjVdLCBbTm9uZV0gKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTU6XSwgW05vbmVdICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzIwOjI1XSwgW05vbmVdICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy0yNTotMjBdLCBbTm9uZV0gKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbc2l6ZSAtIDU6XSwgW05vbmVdICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsW3NpemUgLSA1OnNpemVdLCBbTm9uZV0gKiA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbc2l6ZSAtIDY6c2l6ZSAtIDJdLCBbTm9uZV0gKiA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbc2l6ZTpzaXplXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFtzaXplOnNpemUrNV0sIFtdKQorCisgICAgICAgIGxbc2l6ZSAtIDJdID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy0zOl0sIFtOb25lLCA1LCBOb25lXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLmNvdW50KDUpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBsLCBzaXplLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKworICAgICAgICBsW3NpemUgLSA3Ol0gPSBbMSwgMiwgMywgNCwgNV0KKyAgICAgICAgc2l6ZSAtPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTc6XSwgW05vbmUsIE5vbmUsIDEsIDIsIDMsIDQsIDVdKQorCisgICAgICAgIGxbOjddID0gWzEsIDIsIDMsIDQsIDVdCisgICAgICAgIHNpemUgLT0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzo3XSwgWzEsIDIsIDMsIDQsIDUsIE5vbmUsIE5vbmVdKQorCisgICAgICAgIGRlbCBsW3NpemUgLSAxXQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMV0sIDQpCisKKyAgICAgICAgZGVsIGxbLTI6XQorICAgICAgICBzaXplIC09IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMV0sIDIpCisKKyAgICAgICAgZGVsIGxbMF0KKyAgICAgICAgc2l6ZSAtPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbMF0sIDIpCisKKyAgICAgICAgZGVsIGxbOjJdCisgICAgICAgIHNpemUgLT0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzBdLCA0KQorCisgICAgIyBMaWtlIHRlc3RfY29uY2F0LCBzcGxpdCBpbiB0d28uCisgICAgZGVmIGJhc2ljX3Rlc3RfcmVwZWF0KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gW10gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobCkKKyAgICAgICAgbCA9IFsnJ10gKiBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBsID0gbCAqIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUgKiAyKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMiArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9yZXBlYXRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfcmVwZWF0KHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0yNCkKKyAgICBkZWYgdGVzdF9yZXBlYXRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfcmVwZWF0KHNpemUpCisKKyAgICBkZWYgYmFzaWNfdGVzdF9pbnBsYWNlX3JlcGVhdChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFsnJ10KKyAgICAgICAgbCAqPSBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFswXSBpcyBsWy0xXSkKKyAgICAgICAgZGVsIGwKKworICAgICAgICBsID0gWycnXSAqIHNpemUKKyAgICAgICAgbCAqPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbc2l6ZSAtIDFdIGlzIGxbLTFdKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMiArIDIsIG1lbXVzZT0xNikKKyAgICBkZWYgdGVzdF9pbnBsYWNlX3JlcGVhdF9zbWFsbChzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9pbnBsYWNlX3JlcGVhdChzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9MTYpCisgICAgZGVmIHRlc3RfaW5wbGFjZV9yZXBlYXRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfaW5wbGFjZV9yZXBlYXQoc2l6ZSkKKworICAgIGRlZiBiYXNpY190ZXN0X3JlcHIoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMF0gKiBzaXplCisgICAgICAgIHMgPSByZXByKGwpCisgICAgICAgICMgVGhlIHJlcHIgb2YgYSBsaXN0IG9mIDAncyBpcyBleGFjdGx5IHRocmVlIHRpbWVzIHRoZSBsaXN0IGxlbmd0aC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIHNpemUgKiAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbOjVdLCAnWzAsIDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbLTU6XSwgJzAsIDBdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KCcwJyksIHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAzICsgMiwgbWVtdXNlPTggKyAzKQorICAgIGRlZiB0ZXN0X3JlcHJfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfcmVwcihzaXplKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAyLCBtZW11c2U9OCArIDMpCisgICAgZGVmIHRlc3RfcmVwcl9sYXJnZShzZWxmLCBzaXplKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYmFzaWNfdGVzdF9yZXByKHNpemUpCisKKyAgICAjIGxpc3Qgb3ZlcmFsbG9jYXRlcyB+MS84dGggb2YgdGhlIHRvdGFsIHNpemUgKG9uIGZpcnN0IGV4cGFuc2lvbikgc28KKyAgICAjIHRoZSBzaW5nbGUgbGlzdC5hcHBlbmQgY2FsbCBwdXRzIG1lbXVzZSBhdCA5IGJ5dGVzIHBlciBzaXplLgorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9OSkKKyAgICBkZWYgdGVzdF9hcHBlbmQoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbb2JqZWN0KCldICogc2l6ZQorICAgICAgICBsLmFwcGVuZChvYmplY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbLTNdIGlzIGxbLTJdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxbLTJdIGlzIGxbLTFdKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gNSArIDIsIG1lbXVzZT04ICogNSkKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFsxLCAyLCAzLCA0LCA1XSAqIHNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLmNvdW50KDEpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwuY291bnQoIjEiKSwgMCkKKworICAgIGRlZiBiYXNpY190ZXN0X2V4dGVuZChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFtmaWxlXSAqIHNpemUKKyAgICAgICAgbC5leHRlbmQobCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUgKiAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFswXSBpcyBsWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbc2l6ZSAtIDFdIGlzIGxbc2l6ZSArIDFdKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gMiArIDIsIG1lbXVzZT0xNikKKyAgICBkZWYgdGVzdF9leHRlbmRfc21hbGwoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfZXh0ZW5kKHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDIsIG1lbXVzZT0xNikKKyAgICBkZWYgdGVzdF9leHRlbmRfbGFyZ2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2ljX3Rlc3RfZXh0ZW5kKHNpemUpCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgMiwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzFMLCAyTCwgM0wsIDRMLCA1TF0gKiBzaXplCisgICAgICAgIHNpemUgKj0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwuaW5kZXgoMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5pbmRleCg1LCBzaXplIC0gNSksIHNpemUgLSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwuaW5kZXgoNSwgc2l6ZSAtIDUsIHNpemUpLCBzaXplIC0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbC5pbmRleCwgMSwgc2l6ZSAtIDQsIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGwuaW5kZXgsIDZMKQorCisgICAgIyBUaGlzIHRlc3RzIHN1ZmZlcnMgZnJvbSBvdmVyYWxsb2NhdGlvbiwganVzdCBsaWtlIHRlc3RfYXBwZW5kLgorICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT05KQorICAgIGRlZiB0ZXN0X2luc2VydChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFsxLjBdICogc2l6ZQorICAgICAgICBsLmluc2VydChzaXplIC0gMSwgIkEiKQorICAgICAgICBzaXplICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMzpdLCBbMS4wLCAiQSIsIDEuMF0pCisKKyAgICAgICAgbC5pbnNlcnQoc2l6ZSArIDEsICJCIikKKyAgICAgICAgc2l6ZSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTM6XSwgWyJBIiwgMS4wLCAiQiJdKQorCisgICAgICAgIGwuaW5zZXJ0KDEsICJDIikKKyAgICAgICAgc2l6ZSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbOjNdLCBbMS4wLCAiQyIsIDEuMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFtzaXplIC0gMzpdLCBbIkEiLCAxLjAsICJCIl0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgNCwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X3BvcChzZWxmLCBzaXplKToKKyAgICAgICAgbCA9IFt1ImEiLCB1ImIiLCB1ImMiLCB1ImQiLCB1ImUiXSAqIHNpemUKKyAgICAgICAgc2l6ZSAqPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorCisgICAgICAgIGl0ZW0gPSBsLnBvcCgpCisgICAgICAgIHNpemUgLT0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtLCB1ImUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTI6XSwgW3UiYyIsIHUiZCJdKQorCisgICAgICAgIGl0ZW0gPSBsLnBvcCgwKQorICAgICAgICBzaXplIC09IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgdSJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzoyXSwgW3UiYiIsIHUiYyJdKQorCisgICAgICAgIGl0ZW0gPSBsLnBvcChzaXplIC0gMikKKyAgICAgICAgc2l6ZSAtPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0sIHUiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFstMjpdLCBbdSJiIiwgdSJkIl0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9OCkKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMTBdICogc2l6ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSkKKworICAgICAgICBsLnJlbW92ZSgxMCkKKyAgICAgICAgc2l6ZSAtPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorCisgICAgICAgICMgQmVjYXVzZSBvZiB0aGUgZWFybGllciBsLnJlbW92ZSgpLCB0aGlzIGFwcGVuZCBkb2Vzbid0IHRyaWdnZXIKKyAgICAgICAgIyBhIHJlc2l6ZS4KKyAgICAgICAgbC5hcHBlbmQoNSkKKyAgICAgICAgc2l6ZSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTI6XSwgWzEwLCA1XSkKKyAgICAgICAgbC5yZW1vdmUoNSkKKyAgICAgICAgc2l6ZSAtPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTI6XSwgWzEwLCAxMF0pCisKKyAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyA1ICsgMiwgbWVtdXNlPTggKiA1KQorICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIGwgPSBbMSwgMiwgMywgNCwgNV0gKiBzaXplCisgICAgICAgIGwucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGwpLCBzaXplICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWy01Ol0sIFs1LCA0LCAzLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzo1XSwgWzUsIDQsIDMsIDIsIDFdKQorCisgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgLy8gNSArIDIsIG1lbXVzZT04ICogNSkKKyAgICBkZWYgdGVzdF9zb3J0KHNlbGYsIHNpemUpOgorICAgICAgICBsID0gWzEsIDIsIDMsIDQsIDVdICogc2l6ZQorICAgICAgICBsLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgc2l6ZSAqIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5jb3VudCgxKSwgc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsWzoxMF0sIFsxXSAqIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxbLTEwOl0sIFs1XSAqIDEwKQorCitjbGFzcyBCdWZmZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHLCBtZW11c2U9NCkKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZiwgc2l6ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICBiID0gYnVmZmVyKCJBQUFBIikqc2l6ZQorICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CisgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgZm9yIGMgaW4gYjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsICdBJykKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50LCBzaXplKjQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN0clRlc3QsIFR1cGxlVGVzdCwgTGlzdFRlc3QsIEJ1ZmZlclRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5zZXRfbWVtbGltaXQoc3lzLmFyZ3ZbMV0pCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdtZW0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGZhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdtZW0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpZ21lbS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdtZW0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGZhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaWdtZW0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmFzY2lpLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyNWYxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CkBAIC0wLDAgKzEsMjM2IEBACisiIiJUZXN0IHRoZSBiaW5hc2NpaSBDIG1vZHVsZS4iIiIKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGJpbmFzY2lpCitpbXBvcnQgYXJyYXkKKworIyBOb3RlOiAiKl9oZXgiIGZ1bmN0aW9ucyBhcmUgYWxpYXNlcyBmb3IgIih1biloZXhsaWZ5IgorYjJhX2Z1bmN0aW9ucyA9IFsnYjJhX2Jhc2U2NCcsICdiMmFfaGV4JywgJ2IyYV9ocXgnLCAnYjJhX3FwJywgJ2IyYV91dScsCisgICAgICAgICAgICAgICAgICdoZXhsaWZ5JywgJ3JsZWNvZGVfaHF4J10KK2EyYl9mdW5jdGlvbnMgPSBbJ2EyYl9iYXNlNjQnLCAnYTJiX2hleCcsICdhMmJfaHF4JywgJ2EyYl9xcCcsICdhMmJfdXUnLAorICAgICAgICAgICAgICAgICAndW5oZXhsaWZ5JywgJ3JsZWRlY29kZV9ocXgnXQorYWxsX2Z1bmN0aW9ucyA9IGEyYl9mdW5jdGlvbnMgKyBiMmFfZnVuY3Rpb25zICsgWydjcmMzMicsICdjcmNfaHF4J10KKworCitjbGFzcyBCaW5BU0NJSVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdHlwZTJ0ZXN0ID0gc3RyCisgICAgIyBDcmVhdGUgYmluYXJ5IHRlc3QgZGF0YQorICAgIHJhd2RhdGEgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy5cclxuIgorICAgICMgQmUgc2xvdyBzbyB3ZSBkb24ndCBkZXBlbmQgb24gb3RoZXIgbW9kdWxlcworICAgIHJhd2RhdGEgKz0gIiIuam9pbihtYXAoY2hyLCB4cmFuZ2UoMjU2KSkpCisgICAgcmF3ZGF0YSArPSAiXHJcbkhlbGxvIHdvcmxkLlxuIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLnR5cGUydGVzdChzZWxmLnJhd2RhdGEpCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICAjIENoZWNrIG1vZHVsZSBleGNlcHRpb25zCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGJpbmFzY2lpLkVycm9yLCBFeGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhiaW5hc2NpaS5JbmNvbXBsZXRlLCBFeGNlcHRpb24pKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICAjIENoZWNrIHByZXNlbmNlIG9mIGFsbCBmdW5jdGlvbnMKKyAgICAgICAgZm9yIG5hbWUgaW4gYWxsX2Z1bmN0aW9uczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGdldGF0dHIoYmluYXNjaWksIG5hbWUpLCAnX19jYWxsX18nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5lZF92YWx1ZShzZWxmKToKKyAgICAgICAgIyBMaW1pdCB0byB0aGUgbWluaW11bSBvZiBhbGwgbGltaXRzIChiMmFfdXUpCisgICAgICAgIE1BWF9BTEwgPSA0NQorICAgICAgICByYXcgPSBzZWxmLnJhd2RhdGFbOk1BWF9BTExdCisgICAgICAgIGZvciBmYSwgZmIgaW4gemlwKGEyYl9mdW5jdGlvbnMsIGIyYV9mdW5jdGlvbnMpOgorICAgICAgICAgICAgYTJiID0gZ2V0YXR0cihiaW5hc2NpaSwgZmEpCisgICAgICAgICAgICBiMmEgPSBnZXRhdHRyKGJpbmFzY2lpLCBmYikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhID0gYjJhKHNlbGYudHlwZTJ0ZXN0KHJhdykpCisgICAgICAgICAgICAgICAgcmVzID0gYTJiKHNlbGYudHlwZTJ0ZXN0KGEpKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgie30ve30gY29udmVyc2lvbiByYWlzZXMgeyFyfSIuZm9ybWF0KGZiLCBmYSwgZXJyKSkKKyAgICAgICAgICAgIGlmIGZiID09ICdiMmFfaHF4JzoKKyAgICAgICAgICAgICAgICAjIGIyYV9ocXggcmV0dXJucyBhIHR1cGxlCisgICAgICAgICAgICAgICAgcmVzLCBfID0gcmVzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgcmF3LCAie30ve30gY29udmVyc2lvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieyFyfSAhPSB7IXJ9Ii5mb3JtYXQoZmIsIGZhLCByZXMsIHJhdykpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmVzLCBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYSwgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzKG1heChvcmQoYykgZm9yIGMgaW4gYSksIDEyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGJpbmFzY2lpLmNyY19ocXgocmF3LCAwKSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYmluYXNjaWkuY3JjMzIocmF3KSwgaW50KQorCisgICAgZGVmIHRlc3RfYmFzZTY0dmFsaWQoc2VsZik6CisgICAgICAgICMgVGVzdCBiYXNlNjQgd2l0aCB2YWxpZCBkYXRhCisgICAgICAgIE1BWF9CQVNFNjQgPSA1NworICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzZWxmLnJhd2RhdGEpLCBNQVhfQkFTRTY0KToKKyAgICAgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChzZWxmLnJhd2RhdGFbaTppK01BWF9CQVNFNjRdKQorICAgICAgICAgICAgYSA9IGJpbmFzY2lpLmIyYV9iYXNlNjQoYikKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChhKQorICAgICAgICByZXMgPSAiIgorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChsaW5lKQorICAgICAgICAgICAgYiA9IGJpbmFzY2lpLmEyYl9iYXNlNjQoYSkKKyAgICAgICAgICAgIHJlcyA9IHJlcyArIGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYucmF3ZGF0YSkKKworICAgIGRlZiB0ZXN0X2Jhc2U2NGludmFsaWQoc2VsZik6CisgICAgICAgICMgVGVzdCBiYXNlNjQgd2l0aCByYW5kb20gaW52YWxpZCBjaGFyYWN0ZXJzIHNwcmlua2xlZCB0aHJvdWdob3V0CisgICAgICAgICMgKFRoaXMgcmVxdWlyZXMgYSBuZXcgdmVyc2lvbiBvZiBiaW5hc2NpaS4pCisgICAgICAgIE1BWF9CQVNFNjQgPSA1NworICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzZWxmLmRhdGEpLCBNQVhfQkFTRTY0KToKKyAgICAgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChzZWxmLnJhd2RhdGFbaTppK01BWF9CQVNFNjRdKQorICAgICAgICAgICAgYSA9IGJpbmFzY2lpLmIyYV9iYXNlNjQoYikKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChhKQorCisgICAgICAgIGZpbGxlcnMgPSAiIgorICAgICAgICB2YWxpZCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OSsvIgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjU2KToKKyAgICAgICAgICAgIGMgPSBjaHIoaSkKKyAgICAgICAgICAgIGlmIGMgbm90IGluIHZhbGlkOgorICAgICAgICAgICAgICAgIGZpbGxlcnMgKz0gYworICAgICAgICBkZWYgYWRkbm9pc2UobGluZSk6CisgICAgICAgICAgICBub2lzZSA9IGZpbGxlcnMKKyAgICAgICAgICAgIHJhdGlvID0gbGVuKGxpbmUpIC8vIGxlbihub2lzZSkKKyAgICAgICAgICAgIHJlcyA9ICIiCisgICAgICAgICAgICB3aGlsZSBsaW5lIGFuZCBub2lzZToKKyAgICAgICAgICAgICAgICBpZiBsZW4obGluZSkgLy8gbGVuKG5vaXNlKSA+IHJhdGlvOgorICAgICAgICAgICAgICAgICAgICBjLCBsaW5lID0gbGluZVswXSwgbGluZVsxOl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjLCBub2lzZSA9IG5vaXNlWzBdLCBub2lzZVsxOl0KKyAgICAgICAgICAgICAgICByZXMgKz0gYworICAgICAgICAgICAgcmV0dXJuIHJlcyArIG5vaXNlICsgbGluZQorICAgICAgICByZXMgPSAiIgorICAgICAgICBmb3IgbGluZSBpbiBtYXAoYWRkbm9pc2UsIGxpbmVzKToKKyAgICAgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChsaW5lKQorICAgICAgICAgICAgYiA9IGJpbmFzY2lpLmEyYl9iYXNlNjQoYSkKKyAgICAgICAgICAgIHJlcyArPSBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzZWxmLnJhd2RhdGEpCisKKyAgICAgICAgIyBUZXN0IGJhc2U2NCB3aXRoIGp1c3QgaW52YWxpZCBjaGFyYWN0ZXJzLCB3aGljaCBzaG91bGQgcmV0dXJuCisgICAgICAgICMgZW1wdHkgc3RyaW5ncy4gVEJEOiBzaG91bGRuJ3QgaXQgcmFpc2UgYW4gZXhjZXB0aW9uIGluc3RlYWQgPworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmEyYl9iYXNlNjQoc2VsZi50eXBlMnRlc3QoZmlsbGVycykpLCAnJykKKworICAgIGRlZiB0ZXN0X3V1KHNlbGYpOgorICAgICAgICBNQVhfVVUgPSA0NQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihzZWxmLmRhdGEpLCBNQVhfVVUpOgorICAgICAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KHNlbGYucmF3ZGF0YVtpOmkrTUFYX1VVXSkKKyAgICAgICAgICAgIGEgPSBiaW5hc2NpaS5iMmFfdXUoYikKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChhKQorICAgICAgICByZXMgPSAiIgorICAgICAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgICAgIGEgPSBzZWxmLnR5cGUydGVzdChsaW5lKQorICAgICAgICAgICAgYiA9IGJpbmFzY2lpLmEyYl91dShhKQorICAgICAgICAgICAgcmVzICs9IGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIHNlbGYucmF3ZGF0YSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmEyYl91dSgiXHg3ZiIpLCAiXHgwMCIqMzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3V1KCJceDgwIiksICJceDAwIiozMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5hMmJfdXUoIlx4ZmYiKSwgIlx4MDAiKjMxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiaW5hc2NpaS5FcnJvciwgYmluYXNjaWkuYTJiX3V1LCAiXHhmZlx4MDAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhiaW5hc2NpaS5FcnJvciwgYmluYXNjaWkuYTJiX3V1LCAiISEhISIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoYmluYXNjaWkuRXJyb3IsIGJpbmFzY2lpLmIyYV91dSwgNDYqIiEiKQorCisgICAgICAgICMgSXNzdWUgIzc3MDEgKGNyYXNoIG9uIGEgcHlkZWJ1ZyBidWlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfdXUoJ3gnKSwgJyE+ICAgXG4nKQorCisgICAgZGVmIHRlc3RfY3JjMzIoc2VsZik6CisgICAgICAgIGNyYyA9IGJpbmFzY2lpLmNyYzMyKHNlbGYudHlwZTJ0ZXN0KCJUZXN0IHRoZSBDUkMtMzIgb2YiKSkKKyAgICAgICAgY3JjID0gYmluYXNjaWkuY3JjMzIoc2VsZi50eXBlMnRlc3QoIiB0aGlzIHN0cmluZy4iKSwgY3JjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNyYywgMTU3MTIyMDMzMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpbmFzY2lpLmNyYzMyKQorCisgICAgZGVmIHRlc3RfaHF4KHNlbGYpOgorICAgICAgICAjIFBlcmZvcm0gYmluaGV4NCBzdHlsZSBSTEUtY29tcHJlc3Npb24KKyAgICAgICAgIyBUaGVuIGNhbGN1bGF0ZSB0aGUgaGV4YmluNCBiaW5hcnktdG8tQVNDSUkgdHJhbnNsYXRpb24KKyAgICAgICAgcmxlID0gYmluYXNjaWkucmxlY29kZV9ocXgoc2VsZi5kYXRhKQorICAgICAgICBhID0gYmluYXNjaWkuYjJhX2hxeChzZWxmLnR5cGUydGVzdChybGUpKQorICAgICAgICBiLCBfID0gYmluYXNjaWkuYTJiX2hxeChzZWxmLnR5cGUydGVzdChhKSkKKyAgICAgICAgcmVzID0gYmluYXNjaWkucmxlZGVjb2RlX2hxeChiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzZWxmLnJhd2RhdGEpCisKKyAgICBkZWYgdGVzdF9oZXgoc2VsZik6CisgICAgICAgICMgdGVzdCBoZXhsaWZpY2F0aW9uCisgICAgICAgIHMgPSAne3NcMDA1XDAwMFwwMDBcMDAwd29ybGRpXDAwMlwwMDBcMDAwXDAwMHNcMDA1XDAwMFwwMDBcMDAwaGVsbG9pXDAwMVwwMDBcMDAwXDAwMDAnCisgICAgICAgIHQgPSBiaW5hc2NpaS5iMmFfaGV4KHNlbGYudHlwZTJ0ZXN0KHMpKQorICAgICAgICB1ID0gYmluYXNjaWkuYTJiX2hleChzZWxmLnR5cGUydGVzdCh0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCB1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpbmFzY2lpLmEyYl9oZXgsIHRbOi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiaW5hc2NpaS5hMmJfaGV4LCB0WzotMV0gKyAncScpCisKKyAgICAgICAgIyBWZXJpZnkgdGhlIHRyZWF0bWVudCBvZiBVbmljb2RlIHN0cmluZ3MKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuaGV4bGlmeSh1bmljb2RlKCdhJywgJ2FzY2lpJykpLCAnNjEnKQorCisgICAgZGVmIHRlc3RfcXAoc2VsZik6CisgICAgICAgICMgQSB0ZXN0IGZvciBTRiBidWcgNTM0MzQ3IChzZWdmYXVsdHMgd2l0aG91dCB0aGUgcHJvcGVyIGZpeCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYmluYXNjaWkuYTJiX3FwKCIiLCAqKnsxOjF9KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJiaW5hc2NpaS5hMmJfcXAoKip7MToxfSkgZGlkbid0IHJhaXNlIFR5cGVFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYTJiX3FwKCI9ICIpLCAiPSAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmEyYl9xcCgiPT0iKSwgIj0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmEyYl9xcCgiPUFYIiksICI9QVgiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJpbmFzY2lpLmIyYV9xcCwgZm9vPSJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmEyYl9xcCgiPTAwXHJcbj0wMCIpLCAiXHgwMFxyXG5ceDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGJpbmFzY2lpLmIyYV9xcCgiXHhmZlxyXG5ceGZmXG5ceGZmIiksCisgICAgICAgICAgICAiPUZGXHJcbj1GRlxyXG49RkYiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGJpbmFzY2lpLmIyYV9xcCgiMCIqNzUrIlx4ZmZcclxuXHhmZlxyXG5ceGZmIiksCisgICAgICAgICAgICAiMCIqNzUrIj1cclxuPUZGXHJcbj1GRlxyXG49RkYiCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9xcCgnXDBcbicpLCAnPTAwXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmIyYV9xcCgnXDBcbicsIHF1b3RldGFicz1UcnVlKSwgJz0wMFxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfcXAoJ2Zvb1x0YmFyXHRcbicpLCAnZm9vXHRiYXI9MDlcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX3FwKCdmb29cdGJhclx0XG4nLCBxdW90ZXRhYnM9VHJ1ZSksICdmb289MDliYXI9MDlcbicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfcXAoJy4nKSwgJz0yRScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX3FwKCcuXG4nKSwgJz0yRVxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfcXAoJ2EuXG4nKSwgJ2EuXG4nKQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIEEgdGVzdCBmb3IgU0YgYnVnICMxMDIyOTUzLiAgTWFrZSBzdXJlIFN5c3RlbUVycm9yIGlzIG5vdCByYWlzZWQuCisgICAgICAgIGVtcHR5ID0gc2VsZi50eXBlMnRlc3QoJycpCisgICAgICAgIGZvciBmdW5jIGluIGFsbF9mdW5jdGlvbnM6CisgICAgICAgICAgICBpZiBmdW5jID09ICdjcmNfaHF4JzoKKyAgICAgICAgICAgICAgICAjIGNyY19ocXggbmVlZHMgMiBhcmd1bWVudHMKKyAgICAgICAgICAgICAgICBiaW5hc2NpaS5jcmNfaHF4KGVtcHR5LCAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmID0gZ2V0YXR0cihiaW5hc2NpaSwgZnVuYykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmKGVtcHR5KQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgie30oeyFyfSkgcmFpc2VzIHshcn0iLmZvcm1hdChmdW5jLCBlbXB0eSwgZXJyKSkKKworCitjbGFzcyBBcnJheUJpbkFTQ0lJVGVzdChCaW5BU0NJSVRlc3QpOgorICAgIGRlZiB0eXBlMnRlc3Qoc2VsZiwgcyk6CisgICAgICAgIHJldHVybiBhcnJheS5hcnJheSgnYycsIHMpCisKKworY2xhc3MgQnl0ZWFycmF5QmluQVNDSUlUZXN0KEJpbkFTQ0lJVGVzdCk6CisgICAgdHlwZTJ0ZXN0ID0gYnl0ZWFycmF5CisKKworY2xhc3MgTWVtb3J5dmlld0JpbkFTQ0lJVGVzdChCaW5BU0NJSVRlc3QpOgorICAgIHR5cGUydGVzdCA9IG1lbW9yeXZpZXcKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCaW5BU0NJSVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUJpbkFTQ0lJVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVhcnJheUJpbkFTQ0lJVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeXZpZXdCaW5BU0NJSVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmFzY2lpLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmFzY2lpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2MzNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmFzY2lpLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmFzY2lpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2MzNWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluYXNjaWkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmhleC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmhleC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZjg5NzAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5CkBAIC0wLDAgKzEsNDkgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgYmluaGV4IEMgbW9kdWxlCisKKyAgIFVzZXMgdGhlIG1lY2hhbmlzbSBvZiB0aGUgcHl0aG9uIGJpbmhleCBtb2R1bGUKKyAgIEJhc2VkIG9uIGFuIG9yaWdpbmFsIHRlc3QgYnkgUm9nZXIgRS4gTWFzc2UuCisiIiIKK2ltcG9ydCBiaW5oZXgKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIEJpbkhleFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5mbmFtZTEgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiCisgICAgICAgIHNlbGYuZm5hbWUyID0gdGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6IG9zLnVubGluayhzZWxmLmZuYW1lMSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKKworICAgICAgICB0cnk6IG9zLnVubGluayhzZWxmLmZuYW1lMikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKKworICAgIERBVEEgPSAnSmFjayBpcyBteSBoZXJvJworCisgICAgZGVmIHRlc3RfYmluaGV4KHNlbGYpOgorICAgICAgICBmID0gb3BlbihzZWxmLmZuYW1lMSwgJ3cnKQorICAgICAgICBmLndyaXRlKHNlbGYuREFUQSkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgYmluaGV4LmJpbmhleChzZWxmLmZuYW1lMSwgc2VsZi5mbmFtZTIpCisKKyAgICAgICAgYmluaGV4LmhleGJpbihzZWxmLmZuYW1lMiwgc2VsZi5mbmFtZTEpCisKKyAgICAgICAgZiA9IG9wZW4oc2VsZi5mbmFtZTEsICdyJykKKyAgICAgICAgZmluaXNoID0gZi5yZWFkbGluZSgpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5EQVRBLCBmaW5pc2gpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQmluSGV4VGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmhleC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNWM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmhleC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmluaGV4LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmhleC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJmNWM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JpbmhleC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlub3AucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5vcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWVmNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlub3AucHkKQEAgLTAsMCArMSwzMzEgQEAKKyIiIlRlc3RzIGZvciBiaW5hcnkgb3BlcmF0b3JzIG9uIHN1YnR5cGVzIG9mIGJ1aWx0LWluIHR5cGVzLiIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2RlZiBnY2QoYSwgYik6CisgICAgIiIiR3JlYXRlc3QgY29tbW9uIGRpdmlzb3IgdXNpbmcgRXVjbGlkJ3MgYWxnb3JpdGhtLiIiIgorICAgIHdoaWxlIGE6CisgICAgICAgIGEsIGIgPSBiJWEsIGEKKyAgICByZXR1cm4gYgorCitkZWYgaXNpbnQoeCk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiBpbnQgb3IgbG9uZy4iIiIKKyAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCBpbnQpIG9yIGlzaW5zdGFuY2UoeCwgbG9uZykKKworZGVmIGlzbnVtKHgpOgorICAgICIiIlRlc3Qgd2hldGhlciBhbiBvYmplY3QgaXMgYW4gaW5zdGFuY2Ugb2YgYSBidWlsdC1pbiBudW1lcmljIHR5cGUuIiIiCisgICAgZm9yIFQgaW4gaW50LCBsb25nLCBmbG9hdCwgY29tcGxleDoKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh4LCBUKToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgcmV0dXJuIDAKKworZGVmIGlzUmF0KHgpOgorICAgICIiIlRlc3Qgd2hldGVyIGFuIG9iamVjdCBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgUmF0IGNsYXNzLiIiIgorICAgIHJldHVybiBpc2luc3RhbmNlKHgsIFJhdCkKKworY2xhc3MgUmF0KG9iamVjdCk6CisKKyAgICAiIiJSYXRpb25hbCBudW1iZXIgaW1wbGVtZW50ZWQgYXMgYSBub3JtYWxpemVkIHBhaXIgb2YgbG9uZ3MuIiIiCisKKyAgICBfX3Nsb3RzX18gPSBbJ19SYXRfX251bScsICdfUmF0X19kZW4nXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bT0wTCwgZGVuPTFMKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3I6IFJhdChbbnVtWywgZGVuXV0pLgorCisgICAgICAgIFRoZSBhcmd1bWVudHMgbXVzdCBiZSBpbnRzIG9yIGxvbmdzLCBhbmQgZGVmYXVsdCB0byAoMCwgMSkuIiIiCisgICAgICAgIGlmIG5vdCBpc2ludChudW0pOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiUmF0IG51bWVyYXRvciBtdXN0IGJlIGludCBvciBsb25nICglcikiICUgbnVtCisgICAgICAgIGlmIG5vdCBpc2ludChkZW4pOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiUmF0IGRlbm9taW5hdG9yIG11c3QgYmUgaW50IG9yIGxvbmcgKCVyKSIgJSBkZW4KKyAgICAgICAgIyBCdXQgdGhlIHplcm8gaXMgYWx3YXlzIG9uCisgICAgICAgIGlmIGRlbiA9PSAwOgorICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IsICJ6ZXJvIGRlbm9taW5hdG9yIgorICAgICAgICBnID0gZ2NkKGRlbiwgbnVtKQorICAgICAgICBzZWxmLl9fbnVtID0gbG9uZyhudW0vL2cpCisgICAgICAgIHNlbGYuX19kZW4gPSBsb25nKGRlbi8vZykKKworICAgIGRlZiBfZ2V0X251bShzZWxmKToKKyAgICAgICAgIiIiQWNjZXNzb3IgZnVuY3Rpb24gZm9yIHJlYWQtb25seSAnbnVtJyBhdHRyaWJ1dGUgb2YgUmF0LiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX251bQorICAgIG51bSA9IHByb3BlcnR5KF9nZXRfbnVtLCBOb25lKQorCisgICAgZGVmIF9nZXRfZGVuKHNlbGYpOgorICAgICAgICAiIiJBY2Nlc3NvciBmdW5jdGlvbiBmb3IgcmVhZC1vbmx5ICdkZW4nIGF0dHJpYnV0ZSBvZiBSYXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fZGVuCisgICAgZGVuID0gcHJvcGVydHkoX2dldF9kZW4sIE5vbmUpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICIiIkNvbnZlcnQgYSBSYXQgdG8gYW4gc3RyaW5nIHJlc2VtYmxpbmcgYSBSYXQgY29uc3RydWN0b3IgY2FsbC4iIiIKKyAgICAgICAgcmV0dXJuICJSYXQoJWQsICVkKSIgJSAoc2VsZi5fX251bSwgc2VsZi5fX2RlbikKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJDb252ZXJ0IGEgUmF0IHRvIGEgc3RyaW5nIHJlc2VtYmxpbmcgYSBkZWNpbWFsIG51bWVyaWMgdmFsdWUuIiIiCisgICAgICAgIHJldHVybiBzdHIoZmxvYXQoc2VsZikpCisKKyAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAiIiJDb252ZXJ0IGEgUmF0IHRvIGEgZmxvYXQuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9fbnVtKjEuMC9zZWxmLl9fZGVuCisKKyAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgIiIiQ29udmVydCBhIFJhdCB0byBhbiBpbnQ7IHNlbGYuZGVuIG11c3QgYmUgMS4iIiIKKyAgICAgICAgaWYgc2VsZi5fX2RlbiA9PSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQoc2VsZi5fX251bSkKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IsICgiJXMgdG9vIGxhcmdlIHRvIGNvbnZlcnQgdG8gaW50IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoc2VsZikpCisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJjYW4ndCBjb252ZXJ0ICVzIHRvIGludCIgJSByZXByKHNlbGYpCisKKyAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICIiIkNvbnZlcnQgYSBSYXQgdG8gYW4gbG9uZzsgc2VsZi5kZW4gbXVzdCBiZSAxLiIiIgorICAgICAgICBpZiBzZWxmLl9fZGVuID09IDE6CisgICAgICAgICAgICByZXR1cm4gbG9uZyhzZWxmLl9fbnVtKQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiY2FuJ3QgY29udmVydCAlcyB0byBsb25nIiAlIHJlcHIoc2VsZikKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQWRkIHR3byBSYXRzLCBvciBhIFJhdCBhbmQgYSBudW1iZXIuIiIiCisgICAgICAgIGlmIGlzaW50KG90aGVyKToKKyAgICAgICAgICAgIG90aGVyID0gUmF0KG90aGVyKQorICAgICAgICBpZiBpc1JhdChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gUmF0KHNlbGYuX19udW0qb3RoZXIuX19kZW4gKyBvdGhlci5fX251bSpzZWxmLl9fZGVuLAorICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZGVuKm90aGVyLl9fZGVuKQorICAgICAgICBpZiBpc251bShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoc2VsZikgKyBvdGhlcgorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIF9fcmFkZF9fID0gX19hZGRfXworCisgICAgZGVmIF9fc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJTdWJ0cmFjdCB0d28gUmF0cywgb3IgYSBSYXQgYW5kIGEgbnVtYmVyLiIiIgorICAgICAgICBpZiBpc2ludChvdGhlcik6CisgICAgICAgICAgICBvdGhlciA9IFJhdChvdGhlcikKKyAgICAgICAgaWYgaXNSYXQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIFJhdChzZWxmLl9fbnVtKm90aGVyLl9fZGVuIC0gb3RoZXIuX19udW0qc2VsZi5fX2RlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fX2RlbipvdGhlci5fX2RlbikKKyAgICAgICAgaWYgaXNudW0ob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYpIC0gb3RoZXIKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBkZWYgX19yc3ViX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJTdWJ0cmFjdCB0d28gUmF0cywgb3IgYSBSYXQgYW5kIGEgbnVtYmVyIChyZXZlcnNlZCBhcmdzKS4iIiIKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgb3RoZXIgPSBSYXQob3RoZXIpCisgICAgICAgIGlmIGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBSYXQob3RoZXIuX19udW0qc2VsZi5fX2RlbiAtIHNlbGYuX19udW0qb3RoZXIuX19kZW4sCisgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19kZW4qb3RoZXIuX19kZW4pCisgICAgICAgIGlmIGlzbnVtKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBvdGhlciAtIGZsb2F0KHNlbGYpCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJNdWx0aXBseSB0d28gUmF0cywgb3IgYSBSYXQgYW5kIGEgbnVtYmVyLiIiIgorICAgICAgICBpZiBpc1JhdChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gUmF0KHNlbGYuX19udW0qb3RoZXIuX19udW0sIHNlbGYuX19kZW4qb3RoZXIuX19kZW4pCisgICAgICAgIGlmIGlzaW50KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBSYXQoc2VsZi5fX251bSpvdGhlciwgc2VsZi5fX2RlbikKKyAgICAgICAgaWYgaXNudW0ob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KHNlbGYpKm90aGVyCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgX19ybXVsX18gPSBfX211bF9fCisKKyAgICBkZWYgX190cnVlZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJEaXZpZGUgdHdvIFJhdHMsIG9yIGEgUmF0IGFuZCBhIG51bWJlci4iIiIKKyAgICAgICAgaWYgaXNSYXQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIFJhdChzZWxmLl9fbnVtKm90aGVyLl9fZGVuLCBzZWxmLl9fZGVuKm90aGVyLl9fbnVtKQorICAgICAgICBpZiBpc2ludChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gUmF0KHNlbGYuX19udW0sIHNlbGYuX19kZW4qb3RoZXIpCisgICAgICAgIGlmIGlzbnVtKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBmbG9hdChzZWxmKSAvIG90aGVyCisgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgX19kaXZfXyA9IF9fdHJ1ZWRpdl9fCisKKyAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiRGl2aWRlIHR3byBSYXRzLCBvciBhIFJhdCBhbmQgYSBudW1iZXIgKHJldmVyc2VkIGFyZ3MpLiIiIgorICAgICAgICBpZiBpc1JhdChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gUmF0KG90aGVyLl9fbnVtKnNlbGYuX19kZW4sIG90aGVyLl9fZGVuKnNlbGYuX19udW0pCisgICAgICAgIGlmIGlzaW50KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBSYXQob3RoZXIqc2VsZi5fX2Rlbiwgc2VsZi5fX251bSkKKyAgICAgICAgaWYgaXNudW0ob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIG90aGVyIC8gZmxvYXQoc2VsZikKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBfX3JkaXZfXyA9IF9fcnRydWVkaXZfXworCisgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkRpdmlkZSB0d28gUmF0cywgcmV0dXJuaW5nIHRoZSBmbG9vcmVkIHJlc3VsdC4iIiIKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgb3RoZXIgPSBSYXQob3RoZXIpCisgICAgICAgIGVsaWYgbm90IGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICB4ID0gc2VsZi9vdGhlcgorICAgICAgICByZXR1cm4geC5fX251bSAvLyB4Ll9fZGVuCisKKyAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkRpdmlkZSB0d28gUmF0cywgcmV0dXJuaW5nIHRoZSBmbG9vcmVkIHJlc3VsdCAocmV2ZXJzZWQgYXJncykuIiIiCisgICAgICAgIHggPSBvdGhlci9zZWxmCisgICAgICAgIHJldHVybiB4Ll9fbnVtIC8vIHguX19kZW4KKworICAgIGRlZiBfX2Rpdm1vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiRGl2aWRlIHR3byBSYXRzLCByZXR1cm5pbmcgcXVvdGllbnQgYW5kIHJlbWFpbmRlci4iIiIKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgb3RoZXIgPSBSYXQob3RoZXIpCisgICAgICAgIGVsaWYgbm90IGlzUmF0KG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICB4ID0gc2VsZi8vb3RoZXIKKyAgICAgICAgcmV0dXJuICh4LCBzZWxmIC0gb3RoZXIgKiB4KQorCisgICAgZGVmIF9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiRGl2aWRlIHR3byBSYXRzLCByZXR1cm5pbmcgcXVvdGllbnQgYW5kIHJlbWFpbmRlciAocmV2ZXJzZWQgYXJncykuIiIiCisgICAgICAgIGlmIGlzaW50KG90aGVyKToKKyAgICAgICAgICAgIG90aGVyID0gUmF0KG90aGVyKQorICAgICAgICBlbGlmIG5vdCBpc1JhdChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIGRpdm1vZChvdGhlciwgc2VsZikKKworICAgIGRlZiBfX21vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiVGFrZSBvbmUgUmF0IG1vZHVsbyBhbm90aGVyLiIiIgorICAgICAgICByZXR1cm4gZGl2bW9kKHNlbGYsIG90aGVyKVsxXQorCisgICAgZGVmIF9fcm1vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiVGFrZSBvbmUgUmF0IG1vZHVsbyBhbm90aGVyIChyZXZlcnNlZCBhcmdzKS4iIiIKKyAgICAgICAgcmV0dXJuIGRpdm1vZChvdGhlciwgc2VsZilbMV0KKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJlIHR3byBSYXRzIGZvciBlcXVhbGl0eS4iIiIKKyAgICAgICAgaWYgaXNpbnQob3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZW4gPT0gMSBhbmQgc2VsZi5fX251bSA9PSBvdGhlcgorICAgICAgICBpZiBpc1JhdChvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX251bSA9PSBvdGhlci5fX251bSBhbmQgc2VsZi5fX2RlbiA9PSBvdGhlci5fX2RlbgorICAgICAgICBpZiBpc251bShvdGhlcik6CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoc2VsZikgPT0gb3RoZXIKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQ29tcGFyZSB0d28gUmF0cyBmb3IgaW5lcXVhbGl0eS4iIiIKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgX19oYXNoX18gPSBOb25lCisKK2NsYXNzIFJhdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJVbml0IHRlc3RzIGZvciBSYXQgY2xhc3MgYW5kIGl0cyBzdXBwb3J0IHV0aWxpdGllcy4iIiIKKworICAgIGRlZiB0ZXN0X2djZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnY2QoMTAsIDEyKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnY2QoMTAsIDE1KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnY2QoMTAsIDExKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnY2QoMTAwLCAxNSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2NkKC0xMCwgMiksIC0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjZCgxMCwgLTIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjZCgtMTAsIC0yKSwgLTIpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDIwKToKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDEsIDIwKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2NkKGksIGopID4gMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2NkKC1pLCBqKSA8IDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjZChpLCAtaikgPiAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnY2QoLWksIC1qKSA8IDApCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgYSA9IFJhdCgxMCwgMTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5udW0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZW4sIDMpCisgICAgICAgIGEgPSBSYXQoMTBMLCAxNUwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5udW0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZW4sIDMpCisgICAgICAgIGEgPSBSYXQoMTAsIC0xNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm51bSwgLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZW4sIDMpCisgICAgICAgIGEgPSBSYXQoLTEwLCAxNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm51bSwgLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZW4sIDMpCisgICAgICAgIGEgPSBSYXQoLTEwLCAtMTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5udW0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZW4sIDMpCisgICAgICAgIGEgPSBSYXQoNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm51bSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmRlbiwgMSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYSA9IFJhdCgxLCAwKQorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlJhdCgxLCAwKSBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQorICAgICAgICBmb3IgYmFkIGluICIwIiwgMC4wLCAwaiwgKCksIFtdLCB7fSwgTm9uZSwgUmF0LCB1bml0dGVzdDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBhID0gUmF0KGJhZCkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJhdCglcikgZGlkbid0IHJhaXNlIFR5cGVFcnJvciIgJSBiYWQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYSA9IFJhdCgxLCBiYWQpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJSYXQoMSwgJXIpIGRpZG4ndCByYWlzZSBUeXBlRXJyb3IiICUgYmFkKQorCisgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgyLCAzKSArIFJhdCgxLCAzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoMiwgMykgKyAxLCBSYXQoNSwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSArIFJhdCgyLCAzKSwgUmF0KDUsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEuMCArIFJhdCgxLCAyKSwgMS41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxLCAyKSArIDEuMCwgMS41KQorCisgICAgZGVmIHRlc3Rfc3ViKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCg3LCAyKSAtIFJhdCg3LCA1KSwgUmF0KDIxLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDcsIDUpIC0gMSwgUmF0KDIsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgLSBSYXQoMywgNSksIFJhdCgyLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoMywgMikgLSAxLjAsIDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLjAgLSBSYXQoMSwgMiksIDAuNSkKKworICAgIGRlZiB0ZXN0X211bChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoMiwgMykgKiBSYXQoNSwgNyksIFJhdCgxMCwgMjEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCwgMykgKiAzLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzICogUmF0KDEwLCAzKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUmF0KDEwLCA1KSAqIDAuNSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAuNSAqIFJhdCgxMCwgNSksIDEuMCkKKworICAgIGRlZiB0ZXN0X2RpdihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoMTAsIDMpIC8gUmF0KDUsIDcpLCBSYXQoMTQsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCwgMykgLyAzLCBSYXQoMTAsIDkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIgLyBSYXQoNSksIFJhdCgyLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLjAgKiBSYXQoMSwgMiksIDEuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoMSwgMikgKiAzLjAsIDEuNSkKKworICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCkgLy8gUmF0KDQpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCwgMykgLy8gUmF0KDQsIDMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCkgLy8gNCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCAvLyBSYXQoNCksIDIpCisKKyAgICBkZWYgdGVzdF9lcShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSYXQoMTApLCBSYXQoMjAsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCBSYXQoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCksIDEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAuMCwgUmF0KDEwKSkKKworICAgIGRlZiB0ZXN0X2Z1dHVyZV9kaXYoc2VsZik6CisgICAgICAgIGV4ZWMgZnV0dXJlX3Rlc3QKKworICAgICMgWFhYIFJhbiBvdXQgb2Ygc3RlYW07IFRPIERPOiBkaXZtb2QsIGRpdiwgZnV0dXJlIGRpdmlzaW9uCisKK2Z1dHVyZV90ZXN0ID0gIiIiCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCitzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCwgMykgLyBSYXQoNSwgNyksIFJhdCgxNCwgMykpCitzZWxmLmFzc2VydEVxdWFsKFJhdCgxMCwgMykgLyAzLCBSYXQoMTAsIDkpKQorc2VsZi5hc3NlcnRFcXVhbCgyIC8gUmF0KDUpLCBSYXQoMiwgNSkpCitzZWxmLmFzc2VydEVxdWFsKDMuMCAqIFJhdCgxLCAyKSwgMS41KQorc2VsZi5hc3NlcnRFcXVhbChSYXQoMSwgMikgKiAzLjAsIDEuNSkKK3NlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnMS8yJyksIDAuNSkKKyIiIgorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChSYXRUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5vcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5vcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhMzNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpbm9wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5vcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaW5vcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBhMzNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpbm9wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaXNlY3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iaXNlY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzMzMwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpc2VjdC5weQpAQCAtMCwwICsxLDM2OCBAQAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKKworIyBXZSBkbyBhIGJpdCBvZiB0cmlja2VyeSBoZXJlIHRvIGJlIGFibGUgdG8gdGVzdCBib3RoIHRoZSBDIGltcGxlbWVudGF0aW9uCisjIGFuZCB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2R1bGUuCisKKyMgTWFrZSBpdCBpbXBvc3NpYmxlIHRvIGltcG9ydCB0aGUgQyBpbXBsZW1lbnRhdGlvbiBhbnltb3JlLgorc3lzLm1vZHVsZXNbJ19iaXNlY3QnXSA9IDAKKyMgV2UgbXVzdCBhbHNvIGhhbmRsZSB0aGUgY2FzZSB0aGF0IGJpc2VjdCB3YXMgaW1wb3J0ZWQgYmVmb3JlLgoraWYgJ2Jpc2VjdCcgaW4gc3lzLm1vZHVsZXM6CisgICAgZGVsIHN5cy5tb2R1bGVzWydiaXNlY3QnXQorCisjIE5vdyB3ZSBjYW4gaW1wb3J0IHRoZSBtb2R1bGUgYW5kIGdldCB0aGUgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24uCitpbXBvcnQgYmlzZWN0IGFzIHB5X2Jpc2VjdAorCisjIFJlc3RvcmUgZXZlcnl0aGluZyB0byBub3JtYWwuCitkZWwgc3lzLm1vZHVsZXNbJ19iaXNlY3QnXQorZGVsIHN5cy5tb2R1bGVzWydiaXNlY3QnXQorCisjIFRoaXMgaXMgbm93IHRoZSBtb2R1bGUgd2l0aCB0aGUgQyBpbXBsZW1lbnRhdGlvbi4KK2ltcG9ydCBiaXNlY3QgYXMgY19iaXNlY3QKKworCitjbGFzcyBSYW5nZShvYmplY3QpOgorICAgICIiIkEgdHJpdmlhbCB4cmFuZ2UoKS1saWtlIG9iamVjdCB3aXRob3V0IGFueSBpbnRlZ2VyIHdpZHRoIGxpbWl0YXRpb25zLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgc3RvcCk6CisgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAorICAgICAgICBzZWxmLnN0b3AgPSBzdG9wCisgICAgICAgIHNlbGYubGFzdF9pbnNlcnQgPSBOb25lCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RvcCAtIHNlbGYuc3RhcnQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpZHgpOgorICAgICAgICBuID0gc2VsZi5zdG9wIC0gc2VsZi5zdGFydAorICAgICAgICBpZiBpZHggPCAwOgorICAgICAgICAgICAgaWR4ICs9IG4KKyAgICAgICAgaWYgaWR4ID49IG46CisgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yKGlkeCkKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RhcnQgKyBpZHgKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaWR4LCBpdGVtKToKKyAgICAgICAgc2VsZi5sYXN0X2luc2VydCA9IGlkeCwgaXRlbQorCisKK2NsYXNzIFRlc3RCaXNlY3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG1vZHVsZSA9IE5vbmUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wcmVjb21wdXRlZENhc2VzID0gWworICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgW10sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxXSwgMSwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMV0sIDIsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxXSwgMSwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMV0sIDIsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxLCAxXSwgMSwgMyksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMSwgMV0sIDIsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDEsIDFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxLCAxLCAxXSwgMSwgNCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMSwgMSwgMV0sIDIsIDQpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDJdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyXSwgMSwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMl0sIDEuNSwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMl0sIDIsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDJdLCAzLCAyKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxLCAyLCAyXSwgMCwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMSwgMiwgMl0sIDEsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDIsIDJdLCAxLjUsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDEsIDIsIDJdLCAyLCA0KSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAxLCAyLCAyXSwgMywgNCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgM10sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDNdLCAxLCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAzXSwgMS41LCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAzXSwgMiwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgM10sIDIuNSwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgM10sIDMsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDNdLCA0LCAzKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMCwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDEsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAxLjUsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAyLCAzKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMi41LCAzKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMywgNiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDMuNSwgNiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDQsIDEwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgNSwgMTApLAorCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFtdLCAxLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzFdLCAxLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzFdLCAyLCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDFdLCAxLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDFdLCAyLCAyKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDFdLCAxLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDFdLCAyLCAzKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDEsIDFdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDEsIDFdLCAxLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDEsIDEsIDFdLCAyLCA0KSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDJdLCAwLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDJdLCAxLCAwKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDJdLCAxLjUsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMl0sIDIsIDEpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMl0sIDMsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMiwgMl0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMiwgMl0sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMSwgMiwgMl0sIDEuNSwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAxLCAyLCAyXSwgMiwgMiksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAxLCAyLCAyXSwgMywgNCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAzXSwgMCwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAzXSwgMSwgMCksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAzXSwgMS41LCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDNdLCAyLCAxKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDNdLCAyLjUsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgM10sIDMsIDIpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgM10sIDQsIDMpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDAsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDEsIDApLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDEuNSwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMiwgMSksCisgICAgICAgICAgICAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIFsxLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA0XSwgMi41LCAzKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAzLCAzKSwKKyAgICAgICAgICAgIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgWzEsIDIsIDIsIDMsIDMsIDMsIDQsIDQsIDQsIDRdLCAzLjUsIDYpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDQsIDYpLAorICAgICAgICAgICAgKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBbMSwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNF0sIDUsIDEwKQorICAgICAgICBdCisKKyAgICBkZWYgdGVzdF9wcmVjb21wdXRlZChzZWxmKToKKyAgICAgICAgZm9yIGZ1bmMsIGRhdGEsIGVsZW0sIGV4cGVjdGVkIGluIHNlbGYucHJlY29tcHV0ZWRDYXNlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhkYXRhLCBlbGVtKSwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoVXNlckxpc3QoZGF0YSksIGVsZW0pLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2xvKHNlbGYpOgorICAgICAgICAjIElzc3VlIDMzMDEKKyAgICAgICAgbW9kID0gc2VsZi5tb2R1bGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW9kLmJpc2VjdF9sZWZ0LCBbMSwgMiwgM10sIDUsIC0xLCAzKSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbW9kLmJpc2VjdF9yaWdodCwgWzEsIDIsIDNdLCA1LCAtMSwgMyksCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1vZC5pbnNvcnRfbGVmdCwgWzEsIDIsIDNdLCA1LCAtMSwgMyksCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1vZC5pbnNvcnRfcmlnaHQsIFsxLCAyLCAzXSwgNSwgLTEsIDMpLAorCisgICAgZGVmIHRlc3RfbGFyZ2VfcmFuZ2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTM0OTYKKyAgICAgICAgbW9kID0gc2VsZi5tb2R1bGUKKyAgICAgICAgbiA9IHN5cy5tYXhzaXplCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSB4cmFuZ2Uobi0xKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImNhbid0IGNyZWF0ZSBhIHhyYW5nZSgpIG9iamVjdCBvZiBzaXplIGBzeXMubWF4c2l6ZWAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfbGVmdChkYXRhLCBuLTMpLCBuLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9yaWdodChkYXRhLCBuLTMpLCBuLTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9sZWZ0KGRhdGEsIG4tMywgbi0xMCwgbiksIG4tMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X3JpZ2h0KGRhdGEsIG4tMywgbi0xMCwgbiksIG4tMikKKworICAgIGRlZiB0ZXN0X2xhcmdlX3B5cmFuZ2Uoc2VsZik6CisgICAgICAgICMgU2FtZSBhcyBhYm92ZSwgYnV0IHdpdGhvdXQgQy1pbXBvc2VkIGxpbWl0cyBvbiByYW5nZSgpIHBhcmFtZXRlcnMKKyAgICAgICAgbW9kID0gc2VsZi5tb2R1bGUKKyAgICAgICAgbiA9IHN5cy5tYXhzaXplCisgICAgICAgIGRhdGEgPSBSYW5nZSgwLCBuLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmJpc2VjdF9sZWZ0KGRhdGEsIG4tMyksIG4tMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X3JpZ2h0KGRhdGEsIG4tMyksIG4tMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuYmlzZWN0X2xlZnQoZGF0YSwgbi0zLCBuLTEwLCBuKSwgbi0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iaXNlY3RfcmlnaHQoZGF0YSwgbi0zLCBuLTEwLCBuKSwgbi0yKQorICAgICAgICB4ID0gbiAtIDEwMAorICAgICAgICBtb2QuaW5zb3J0X2xlZnQoZGF0YSwgeCwgeCAtIDUwLCB4ICsgNTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YS5sYXN0X2luc2VydCwgKHgsIHgpKQorICAgICAgICB4ID0gbiAtIDIwMAorICAgICAgICBtb2QuaW5zb3J0X3JpZ2h0KGRhdGEsIHgsIHggLSA1MCwgeCArIDUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEubGFzdF9pbnNlcnQsICh4ICsgMSwgeCkpCisKKyAgICBkZWYgdGVzdF9yYW5kb20oc2VsZiwgbj0yNSk6CisgICAgICAgIGZyb20gcmFuZG9tIGltcG9ydCByYW5kcmFuZ2UKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKG4pOgorICAgICAgICAgICAgZGF0YSA9IFtyYW5kcmFuZ2UoMCwgbiwgMikgZm9yIGogaW4geHJhbmdlKGkpXQorICAgICAgICAgICAgZGF0YS5zb3J0KCkKKyAgICAgICAgICAgIGVsZW0gPSByYW5kcmFuZ2UoLTEsIG4rMSkKKyAgICAgICAgICAgIGlwID0gc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQoZGF0YSwgZWxlbSkKKyAgICAgICAgICAgIGlmIGlwIDwgbGVuKGRhdGEpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIDw9IGRhdGFbaXBdKQorICAgICAgICAgICAgaWYgaXAgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhW2lwLTFdIDwgZWxlbSkKKyAgICAgICAgICAgIGlwID0gc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0KGRhdGEsIGVsZW0pCisgICAgICAgICAgICBpZiBpcCA8IGxlbihkYXRhKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSA8IGRhdGFbaXBdKQorICAgICAgICAgICAgaWYgaXAgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhW2lwLTFdIDw9IGVsZW0pCisKKyAgICBkZWYgdGVzdF9vcHRpb25hbFNsaWNpbmcoc2VsZik6CisgICAgICAgIGZvciBmdW5jLCBkYXRhLCBlbGVtLCBleHBlY3RlZCBpbiBzZWxmLnByZWNvbXB1dGVkQ2FzZXM6CisgICAgICAgICAgICBmb3IgbG8gaW4geHJhbmdlKDQpOgorICAgICAgICAgICAgICAgIGxvID0gbWluKGxlbihkYXRhKSwgbG8pCisgICAgICAgICAgICAgICAgZm9yIGhpIGluIHhyYW5nZSgzLDgpOgorICAgICAgICAgICAgICAgICAgICBoaSA9IG1pbihsZW4oZGF0YSksIGhpKQorICAgICAgICAgICAgICAgICAgICBpcCA9IGZ1bmMoZGF0YSwgZWxlbSwgbG8sIGhpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG8gPD0gaXAgPD0gaGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmMgaXMgc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQgYW5kIGlwIDwgaGk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSA8PSBkYXRhW2lwXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVuYyBpcyBzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCBhbmQgaXAgPiBsbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhW2lwLTFdIDwgZWxlbSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVuYyBpcyBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQgYW5kIGlwIDwgaGk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSA8IGRhdGFbaXBdKQorICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCBhbmQgaXAgPiBsbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhW2lwLTFdIDw9IGVsZW0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXAsIG1heChsbywgbWluKGhpLCBleHBlY3RlZCkpKQorCisgICAgZGVmIHRlc3RfYmFja2NvbXBhdGliaWxpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tb2R1bGUuYmlzZWN0LCBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQpCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3Moc2VsZik6CisgICAgICAgIGRhdGEgPSBbMTAsIDIwLCAzMCwgNDAsIDUwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0KGE9ZGF0YSwgeD0yNSwgbG89MSwgaGk9MyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0KGE9ZGF0YSwgeD0yNSwgbG89MSwgaGk9MyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tb2R1bGUuYmlzZWN0KGE9ZGF0YSwgeD0yNSwgbG89MSwgaGk9MyksIDIpCisgICAgICAgIHNlbGYubW9kdWxlLmluc29ydF9sZWZ0KGE9ZGF0YSwgeD0yNSwgbG89MSwgaGk9MykKKyAgICAgICAgc2VsZi5tb2R1bGUuaW5zb3J0X3JpZ2h0KGE9ZGF0YSwgeD0yNSwgbG89MSwgaGk9MykKKyAgICAgICAgc2VsZi5tb2R1bGUuaW5zb3J0KGE9ZGF0YSwgeD0yNSwgbG89MSwgaGk9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBbMTAsIDIwLCAyNSwgMjUsIDI1LCAzMCwgNDAsIDUwXSkKKworY2xhc3MgVGVzdEJpc2VjdFB5dGhvbihUZXN0QmlzZWN0KToKKyAgICBtb2R1bGUgPSBweV9iaXNlY3QKKworY2xhc3MgVGVzdEJpc2VjdEMoVGVzdEJpc2VjdCk6CisgICAgbW9kdWxlID0gY19iaXNlY3QKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0SW5zb3J0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBtb2R1bGUgPSBOb25lCisKKyAgICBkZWYgdGVzdF92c0J1aWx0aW5Tb3J0KHNlbGYsIG49NTAwKToKKyAgICAgICAgZnJvbSByYW5kb20gaW1wb3J0IGNob2ljZQorICAgICAgICBmb3IgaW5zb3J0ZWQgaW4gKGxpc3QoKSwgVXNlckxpc3QoKSk6CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uobik6CisgICAgICAgICAgICAgICAgZGlnaXQgPSBjaG9pY2UoIjAxMjM0NTY3ODkiKQorICAgICAgICAgICAgICAgIGlmIGRpZ2l0IGluICIwMjQ2OCI6CisgICAgICAgICAgICAgICAgICAgIGYgPSBzZWxmLm1vZHVsZS5pbnNvcnRfbGVmdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGYgPSBzZWxmLm1vZHVsZS5pbnNvcnRfcmlnaHQKKyAgICAgICAgICAgICAgICBmKGluc29ydGVkLCBkaWdpdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGluc29ydGVkKSwgaW5zb3J0ZWQpCisKKyAgICBkZWYgdGVzdF9iYWNrY29tcGF0aWJpbGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5pbnNvcnQsIHNlbGYubW9kdWxlLmluc29ydF9yaWdodCkKKworICAgIGRlZiB0ZXN0X2xpc3REZXJpdmVkKHNlbGYpOgorICAgICAgICBjbGFzcyBMaXN0KGxpc3QpOgorICAgICAgICAgICAgZGF0YSA9IFtdCisgICAgICAgICAgICBkZWYgaW5zZXJ0KHNlbGYsIGluZGV4LCBpdGVtKToKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGEuaW5zZXJ0KGluZGV4LCBpdGVtKQorCisgICAgICAgIGxzdCA9IExpc3QoKQorICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnRfbGVmdChsc3QsIDEwKQorICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnRfcmlnaHQobHN0LCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAxMF0sIGxzdC5kYXRhKQorCitjbGFzcyBUZXN0SW5zb3J0UHl0aG9uKFRlc3RJbnNvcnQpOgorICAgIG1vZHVsZSA9IHB5X2Jpc2VjdAorCitjbGFzcyBUZXN0SW5zb3J0QyhUZXN0SW5zb3J0KToKKyAgICBtb2R1bGUgPSBjX2Jpc2VjdAorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworY2xhc3MgTGVuT25seToKKyAgICAiRHVtbXkgc2VxdWVuY2UgY2xhc3MgZGVmaW5pbmcgX19sZW5fXyBidXQgbm90IF9fZ2V0aXRlbV9fLiIKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDEwCisKK2NsYXNzIEdldE9ubHk6CisgICAgIkR1bW15IHNlcXVlbmNlIGNsYXNzIGRlZmluaW5nIF9fZ2V0aXRlbV9fIGJ1dCBub3QgX19sZW5fXy4iCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5keCk6CisgICAgICAgIHJldHVybiAxMAorCitjbGFzcyBDbXBFcnI6CisgICAgIkR1bW15IGVsZW1lbnQgdGhhdCBhbHdheXMgcmFpc2VzIGFuIGVycm9yIGR1cmluZyBjb21wYXJpc29uIgorICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKKworY2xhc3MgVGVzdEVycm9ySGFuZGxpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIG1vZHVsZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X25vbl9zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsCisgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnRfbGVmdCwgc2VsZi5tb2R1bGUuaW5zb3J0X3JpZ2h0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgMTAsIDEwKQorCisgICAgZGVmIHRlc3RfbGVuX29ubHkoc2VsZik6CisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LAorICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaW5zb3J0X2xlZnQsIHNlbGYubW9kdWxlLmluc29ydF9yaWdodCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZiwgTGVuT25seSgpLCAxMCkKKworICAgIGRlZiB0ZXN0X2dldF9vbmx5KHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQsIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCwKKyAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLmluc29ydF9sZWZ0LCBzZWxmLm1vZHVsZS5pbnNvcnRfcmlnaHQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGYsIEdldE9ubHkoKSwgMTApCisKKyAgICBkZWYgdGVzdF9jbXBfZXJyKHNlbGYpOgorICAgICAgICBzZXEgPSBbQ21wRXJyKCksIENtcEVycigpLCBDbXBFcnIoKV0KKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0LCBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQsCisgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5pbnNvcnRfbGVmdCwgc2VsZi5tb2R1bGUuaW5zb3J0X3JpZ2h0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmLCBzZXEsIDEwKQorCisgICAgZGVmIHRlc3RfYXJnX3BhcnNpbmcoc2VsZik6CisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5iaXNlY3RfbGVmdCwgc2VsZi5tb2R1bGUuYmlzZWN0X3JpZ2h0LAorICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaW5zb3J0X2xlZnQsIHNlbGYubW9kdWxlLmluc29ydF9yaWdodCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIDEwKQorCitjbGFzcyBUZXN0RXJyb3JIYW5kbGluZ1B5dGhvbihUZXN0RXJyb3JIYW5kbGluZyk6CisgICAgbW9kdWxlID0gcHlfYmlzZWN0CisKK2NsYXNzIFRlc3RFcnJvckhhbmRsaW5nQyhUZXN0RXJyb3JIYW5kbGluZyk6CisgICAgbW9kdWxlID0gY19iaXNlY3QKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitsaWJyZWZ0ZXN0ID0gIiIiCitFeGFtcGxlIGZyb20gdGhlIExpYnJhcnkgUmVmZXJlbmNlOiAgRG9jL2xpYnJhcnkvYmlzZWN0LnJzdAorCitUaGUgYmlzZWN0KCkgZnVuY3Rpb24gaXMgZ2VuZXJhbGx5IHVzZWZ1bCBmb3IgY2F0ZWdvcml6aW5nIG51bWVyaWMgZGF0YS4KK1RoaXMgZXhhbXBsZSB1c2VzIGJpc2VjdCgpIHRvIGxvb2sgdXAgYSBsZXR0ZXIgZ3JhZGUgZm9yIGFuIGV4YW0gdG90YWwKKyhzYXkpIGJhc2VkIG9uIGEgc2V0IG9mIG9yZGVyZWQgbnVtZXJpYyBicmVha3BvaW50czogODUgYW5kIHVwIGlzIGFuIGBBJywKKzc1Li44NCBpcyBhIGBCJywgZXRjLgorCisgICAgPj4+IGdyYWRlcyA9ICJGRURDQkEiCisgICAgPj4+IGJyZWFrcG9pbnRzID0gWzMwLCA0NCwgNjYsIDc1LCA4NV0KKyAgICA+Pj4gZnJvbSBiaXNlY3QgaW1wb3J0IGJpc2VjdAorICAgID4+PiBkZWYgZ3JhZGUodG90YWwpOgorICAgIC4uLiAgICAgICAgICAgcmV0dXJuIGdyYWRlc1tiaXNlY3QoYnJlYWtwb2ludHMsIHRvdGFsKV0KKyAgICAuLi4KKyAgICA+Pj4gZ3JhZGUoNjYpCisgICAgJ0MnCisgICAgPj4+IG1hcChncmFkZSwgWzMzLCA5OSwgNzcsIDQ0LCAxMiwgODhdKQorICAgIFsnRScsICdBJywgJ0InLCAnRCcsICdGJywgJ0EnXQorCisiIiIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitfX3Rlc3RfXyA9IHsnbGlicmVmdGVzdCcgOiBsaWJyZWZ0ZXN0fQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2Jpc2VjdAorCisgICAgdGVzdF9jbGFzc2VzID0gW1Rlc3RCaXNlY3RQeXRob24sIFRlc3RCaXNlY3RDLAorICAgICAgICAgICAgICAgICAgICBUZXN0SW5zb3J0UHl0aG9uLCBUZXN0SW5zb3J0QywKKyAgICAgICAgICAgICAgICAgICAgVGVzdEVycm9ySGFuZGxpbmdQeXRob24sIFRlc3RFcnJvckhhbmRsaW5nQ10KKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9iaXNlY3QsIHZlcmJvc2UpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlzZWN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpc2VjdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1NTI5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpc2VjdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYmlzZWN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpc2VjdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E1NTI5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jpc2VjdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYm9vbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jvb2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjZDFhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Jvb2wucHkKQEAgLTAsMCArMSwzNzAgQEAKKyMgVGVzdCBwcm9wZXJ0aWVzIG9mIGJvb2wgcHJvbWlzZWQgYnkgUEVQIDI4NQorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBvcworCitjbGFzcyBCb29sVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQyhib29sKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImJvb2wgc2hvdWxkIG5vdCBiZSBzdWJjbGFzc2FibGUiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50Ll9fbmV3X18sIGJvb2wsIDApCisKKyAgICBkZWYgdGVzdF9wcmludChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgICAgICBwcmludCA+PiBmbywgRmFsc2UsIFRydWUKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkKCksICdGYWxzZSBUcnVlXG4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoRmFsc2UpLCAnRmFsc2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoVHJ1ZSksICdUcnVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcHIoRmFsc2UpKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXByKFRydWUpKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRmFsc2UpLCAnRmFsc2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihUcnVlKSwgJ1RydWUnKQorCisgICAgZGVmIHRlc3RfaW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChGYWxzZSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoaW50KEZhbHNlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KFRydWUpLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGludChUcnVlKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KEZhbHNlKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGZsb2F0KEZhbHNlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoVHJ1ZSksIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChmbG9hdChUcnVlKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhGYWxzZSksIDBMKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGxvbmcoRmFsc2UpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKFRydWUpLCAxTCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChsb25nKFRydWUpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfbWF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgrRmFsc2UsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoK0ZhbHNlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtRmFsc2UsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoLUZhbHNlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoRmFsc2UpLCAwKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGFicyhGYWxzZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCtUcnVlLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KCtUcnVlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC1UcnVlLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoVHJ1ZSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoYWJzKFRydWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKH5GYWxzZSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoflRydWUsIC0yKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UrMiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlKzIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMitGYWxzZSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyK1RydWUsIDMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZStGYWxzZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZStGYWxzZSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UrVHJ1ZSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZStUcnVlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUrRmFsc2UsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoVHJ1ZStGYWxzZSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlK1RydWUsIDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLVRydWUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoVHJ1ZS1UcnVlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS1GYWxzZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChGYWxzZS1GYWxzZSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZS1GYWxzZSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChUcnVlLUZhbHNlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLVRydWUsIC0xKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSoxLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlKjEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoRmFsc2UqMSwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLy8xLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KFRydWUvLzEsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UvLzEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoRmFsc2UvLzEsIEZhbHNlKQorCisgICAgICAgIGZvciBiIGluIEZhbHNlLCBUcnVlOgorICAgICAgICAgICAgZm9yIGkgaW4gMCwgMSwgMjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIqKmksIGludChiKSoqaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KGIqKmksIGJvb2woaW50KGIpKippKSkKKworICAgICAgICBmb3IgYSBpbiBGYWxzZSwgVHJ1ZToKKyAgICAgICAgICAgIGZvciBiIGluIEZhbHNlLCBUcnVlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoYSZiLCBib29sKGludChhKSZpbnQoYikpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoYXxiLCBib29sKGludChhKXxpbnQoYikpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoYV5iLCBib29sKGludChhKV5pbnQoYikpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSZpbnQoYiksIGludChhKSZpbnQoYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdChhJmludChiKSwgYm9vbChpbnQoYSkmaW50KGIpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF8aW50KGIpLCBpbnQoYSl8aW50KGIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoYXxpbnQoYiksIGJvb2woaW50KGEpfGludChiKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhXmludChiKSwgaW50KGEpXmludChiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KGFeaW50KGIpLCBib29sKGludChhKV5pbnQoYikpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGEpJmIsIGludChhKSZpbnQoYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vdChpbnQoYSkmYiwgYm9vbChpbnQoYSkmaW50KGIpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChhKXxiLCBpbnQoYSl8aW50KGIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QoaW50KGEpfGIsIGJvb2woaW50KGEpfGludChiKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoYSleYiwgaW50KGEpXmludChiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KGludChhKV5iLCBib29sKGludChhKV5pbnQoYikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMT09MSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxPT0wLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygwPDEsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMTwwLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygwPD0wLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDE8PTAsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKDE+MCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxPjEsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKDE+PTEsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMD49MSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMCE9MSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygwIT0wLCBGYWxzZSkKKworICAgICAgICB4ID0gWzFdCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeCBpcyB4LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHggaXMgbm90IHgsIEZhbHNlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMSBpbiB4LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDAgaW4geCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMSBub3QgaW4geCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMCBub3QgaW4geCwgVHJ1ZSkKKworICAgICAgICB4ID0gezE6IDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeCBpcyB4LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHggaXMgbm90IHgsIEZhbHNlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMSBpbiB4LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKDAgaW4geCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMSBub3QgaW4geCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoMCBub3QgaW4geCwgVHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydElzKG5vdCBUcnVlLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhub3QgRmFsc2UsIFRydWUpCisKKyAgICBkZWYgdGVzdF9jb252ZXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJvb2wsIDQyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhib29sKDEwKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhib29sKDEpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woLTEpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woMCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woImhlbGxvIiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbCgiIiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiVkIiAlIEZhbHNlLCAiMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIiVkIiAlIFRydWUsICIxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiJXgiICUgRmFsc2UsICIwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiJXgiICUgVHJ1ZSwgIjEiKQorCisgICAgZGVmIHRlc3RfaGFzYXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhoYXNhdHRyKFtdLCAiYXBwZW5kIiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaGFzYXR0cihbXSwgIndvYmJsZSIpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2NhbGxhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKGNhbGxhYmxlKGxlbiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY2FsbGFibGUoMSksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfaXNpbnN0YW5jZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhpc2luc3RhbmNlKFRydWUsIGJvb2wpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoRmFsc2UsIGJvb2wpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoVHJ1ZSwgaW50KSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhpc2luc3RhbmNlKEZhbHNlLCBpbnQpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoMSwgYm9vbCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGlzaW5zdGFuY2UoMCwgYm9vbCksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfaXNzdWJjbGFzcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhpc3N1YmNsYXNzKGJvb2wsIGludCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoaXNzdWJjbGFzcyhpbnQsIGJvb2wpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2hhc2tleShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxIGluIHt9LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygxIGluIHsxOjF9LCBUcnVlKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHt9Lmhhc19rZXkoMSksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh7MToxfS5oYXNfa2V5KDEpLCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLmVuZHN3aXRoKCJ6IiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoInh5eiIuZW5kc3dpdGgoIngiKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoInh5ejAxMjMiLmlzYWxudW0oKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygiQCMkJSIuaXNhbG51bSgpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygieHl6Ii5pc2FscGhhKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoIkAjJCUiLmlzYWxwaGEoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoIjAxMjMiLmlzZGlnaXQoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygieHl6Ii5pc2RpZ2l0KCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLmlzbG93ZXIoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygiWFlaIi5pc2xvd2VyKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKCIgIi5pc3NwYWNlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoIlhZWiIuaXNzcGFjZSgpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygiWCIuaXN0aXRsZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJ4Ii5pc3RpdGxlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJYWVoiLmlzdXBwZXIoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygieHl6Ii5pc3VwcGVyKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKCJ4eXoiLnN0YXJ0c3dpdGgoIngiKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcygieHl6Ii5zdGFydHN3aXRoKCJ6IiksIEZhbHNlKQorCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLmVuZHN3aXRoKHVuaWNvZGUoInoiLCAnYXNjaWknKSksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLmVuZHN3aXRoKHVuaWNvZGUoIngiLCAnYXNjaWknKSksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJ4eXowMTIzIiwgJ2FzY2lpJykuaXNhbG51bSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJAIyQlIiwgJ2FzY2lpJykuaXNhbG51bSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuaXNhbHBoYSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJAIyQlIiwgJ2FzY2lpJykuaXNhbHBoYSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgiMDEyMyIsICdhc2NpaScpLmlzZGVjaW1hbCgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJ4eXoiLCAnYXNjaWknKS5pc2RlY2ltYWwoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIjAxMjMiLCAnYXNjaWknKS5pc2RpZ2l0KCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLmlzZGlnaXQoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLmlzbG93ZXIoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgiWFlaIiwgJ2FzY2lpJykuaXNsb3dlcigpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgiMDEyMyIsICdhc2NpaScpLmlzbnVtZXJpYygpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJ4eXoiLCAnYXNjaWknKS5pc251bWVyaWMoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIiAiLCAnYXNjaWknKS5pc3NwYWNlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIlhZWiIsICdhc2NpaScpLmlzc3BhY2UoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIlgiLCAnYXNjaWknKS5pc3RpdGxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoIngiLCAnYXNjaWknKS5pc3RpdGxlKCksIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh1bmljb2RlKCJYWVoiLCAnYXNjaWknKS5pc3VwcGVyKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLmlzdXBwZXIoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHVuaWNvZGUoInh5eiIsICdhc2NpaScpLnN0YXJ0c3dpdGgodW5pY29kZSgieCIsICdhc2NpaScpKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModW5pY29kZSgieHl6IiwgJ2FzY2lpJykuc3RhcnRzd2l0aCh1bmljb2RlKCJ6IiwgJ2FzY2lpJykpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2Jvb2xlYW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSAmIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShUcnVlICYgMSwgYm9vbCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhUcnVlICYgVHJ1ZSwgVHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUgfCAxLCAxKQorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoVHJ1ZSB8IDEsIGJvb2wpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoVHJ1ZSB8IFRydWUsIFRydWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlIF4gMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKFRydWUgXiAxLCBib29sKQorICAgICAgICBzZWxmLmFzc2VydElzKFRydWUgXiBUcnVlLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2ZpbGVjbG9zZWQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZi5jbG9zZWQsIEZhbHNlKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGYuY2xvc2VkLCBUcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKKyAgICAgICAgIyB0eXBlcyBhcmUgYWx3YXlzIHRydWUuCisgICAgICAgIGZvciB0IGluIFtib29sLCBjb21wbGV4LCBkaWN0LCBmaWxlLCBmbG9hdCwgaW50LCBsaXN0LCBsb25nLCBvYmplY3QsCisgICAgICAgICAgICAgICAgICBzZXQsIHN0ciwgdHVwbGUsIHR5cGVdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhib29sKHQpLCBUcnVlKQorCisgICAgZGVmIHRlc3Rfb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBvcGVyYXRvcgorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLnRydXRoKDApLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci50cnV0aCgxKSwgVHJ1ZSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc0NhbGxhYmxlKDApLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNDYWxsYWJsZShsZW4pLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzTnVtYmVyVHlwZShOb25lKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDApLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLm5vdF8oMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLm5vdF8oMCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoMCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKFtdKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5jb250YWlucyhbXSwgMSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmNvbnRhaW5zKFsxXSwgMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSgxKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSh7fSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3BlcmF0b3IubHQoMCwgMCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmx0KDAsIDEpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzXyhUcnVlLCBUcnVlKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc18oVHJ1ZSwgRmFsc2UpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcGVyYXRvci5pc19ub3QoVHJ1ZSwgVHJ1ZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKG9wZXJhdG9yLmlzX25vdChUcnVlLCBGYWxzZSksIFRydWUpCisKKyAgICBkZWYgdGVzdF9tYXJzaGFsKHNlbGYpOgorICAgICAgICBpbXBvcnQgbWFyc2hhbAorICAgICAgICBzZWxmLmFzc2VydElzKG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhUcnVlKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKEZhbHNlKSksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhUcnVlKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhGYWxzZSkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKFRydWUsIFRydWUpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKEZhbHNlLCBUcnVlKSksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfY3BpY2tsZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjUGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMoVHJ1ZSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyhGYWxzZSkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjUGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMoVHJ1ZSwgVHJ1ZSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyhGYWxzZSwgVHJ1ZSkpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X21peGVkcGlja2xlKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlLCBjUGlja2xlCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMoVHJ1ZSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKEZhbHNlKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKFRydWUsIFRydWUpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyhGYWxzZSwgVHJ1ZSkpLCBGYWxzZSkKKworICAgICAgICBzZWxmLmFzc2VydElzKGNQaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKFRydWUpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjUGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhGYWxzZSkpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjUGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhUcnVlLCBUcnVlKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY1BpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoRmFsc2UsIFRydWUpKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9waWNrbGV2YWx1ZXMoc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUsIGNQaWNrbGUKKworICAgICAgICAjIFRlc3QgZm9yIHNwZWNpZmljIGJhY2t3YXJkcy1jb21wYXRpYmxlIHBpY2tsZSB2YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaWNrbGUuZHVtcHMoVHJ1ZSksICJJMDFcbi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpY2tsZS5kdW1wcyhGYWxzZSksICJJMDBcbi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNQaWNrbGUuZHVtcHMoVHJ1ZSksICJJMDFcbi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNQaWNrbGUuZHVtcHMoRmFsc2UpLCAiSTAwXG4uIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaWNrbGUuZHVtcHMoVHJ1ZSwgVHJ1ZSksICJJMDFcbi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpY2tsZS5kdW1wcyhGYWxzZSwgVHJ1ZSksICJJMDBcbi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNQaWNrbGUuZHVtcHMoVHJ1ZSwgVHJ1ZSksICJJMDFcbi4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNQaWNrbGUuZHVtcHMoRmFsc2UsIFRydWUpLCAiSTAwXG4uIikKKworICAgIGRlZiB0ZXN0X2NvbnZlcnRfdG9fYm9vbChzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBUeXBlRXJyb3Igb2NjdXJzIHdoZW4gYmFkIHRoaW5ncyBhcmUgcmV0dXJuZWQKKyAgICAgICAgIyBmcm9tIF9fbm9uemVyb19fKCkuICBUaGlzIGlzbid0IHJlYWxseSBhIGJvb2wgdGVzdCwgYnV0CisgICAgICAgICMgaXQncyByZWxhdGVkLgorICAgICAgICBjaGVjayA9IGxhbWJkYSBvOiBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJvb2wsIG8pCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGNoZWNrKEZvbygpKQorCisgICAgICAgIGNsYXNzIEJhcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiWWVzIgorICAgICAgICBjaGVjayhCYXIoKSkKKworICAgICAgICBjbGFzcyBCYXooaW50KToKKyAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBjaGVjayhCYXooKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCb29sVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYm9vbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ib29sLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA5NmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYm9vbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYm9vbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ib29sLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODA5NmNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYm9vbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMWVlMGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIucHkKQEAgLTAsMCArMSwzNTcgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgYnNkZGIgQyBtb2R1bGUgYnkgUm9nZXIgRS4gTWFzc2UKKyAgIEFkYXB0ZWQgdG8gdW5pdHRlc3QgZm9ybWF0IGFuZCBleHBhbmRlZCBzY29wZSBieSBSYXltb25kIEhldHRpbmdlcgorIiIiCitpbXBvcnQgb3MsIHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFNraXAgdGVzdCBpZiBfYnNkZGIgd2Fzbid0IGJ1aWx0LgordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ19ic2RkYicpCisKK2JzZGRiID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2JzZGRiJywgZGVwcmVjYXRlZD1UcnVlKQorIyBKdXN0IHNvIHdlIGtub3cgaXQncyBpbXBvcnRlZDoKK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdkYmhhc2gnLCBkZXByZWNhdGVkPVRydWUpCisKKworY2xhc3MgVGVzdEJTRERCKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBvcGVuZmxhZyA9ICdjJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmYgPSBzZWxmLm9wZW5tZXRob2RbMF0oc2VsZi5mbmFtZSwgc2VsZi5vcGVuZmxhZywgY2FjaGVzaXplPTMyNzY4KQorICAgICAgICBzZWxmLmQgPSBkaWN0KHE9J0d1aWRvJywgdz0ndmFuJywgZT0nUm9zc3VtJywgcj0naW52ZW50ZWQnLCB0PSdQeXRob24nLCB5PScnKQorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmQuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmZba10gPSB2CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZi5zeW5jKCkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5mbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZuYW1lKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICBmb3IgaywgdiBpbiBzZWxmLmQuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZltrXSwgdikKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5mKSwgbGVuKHNlbGYuZCkpCisKKyAgICBkZWYgdGVzdF9jaGFuZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuZlsnciddID0gJ2Rpc2NvdmVyZWQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mWydyJ10sICdkaXNjb3ZlcmVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigncicsIHNlbGYuZi5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2Rpc2NvdmVyZWQnLCBzZWxmLmYudmFsdWVzKCkpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9hbmRfcmVvcGVuKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAjIGlmIHdlJ3JlIHVzaW5nIGFuIGluLW1lbW9yeSBvbmx5IGRiLCB3ZSBjYW4ndCByZW9wZW4gaXQKKyAgICAgICAgICAgICMgc28gZmluaXNoIGhlcmUuCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gc2VsZi5vcGVubWV0aG9kWzBdKHNlbGYuZm5hbWUsICd3JykKKyAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5kLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZba10sIHYpCisKKyAgICBkZWYgYXNzZXJ0U2V0RXF1YWxzKHNlbGYsIHNlcW4xLCBzZXFuMik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlcW4xKSwgc2V0KHNlcW4yKSkKKworICAgIGRlZiB0ZXN0X21hcHBpbmdfaXRlcmF0aW9uX21ldGhvZHMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgZCA9IHNlbGYuZAorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFscyhkLCBmKQorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFscyhkLmtleXMoKSwgZi5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGQudmFsdWVzKCksIGYudmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGQuaXRlbXMoKSwgZi5pdGVtcygpKQorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFscyhkLml0ZXJrZXlzKCksIGYuaXRlcmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbHMoZC5pdGVydmFsdWVzKCksIGYuaXRlcnZhbHVlcygpKQorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFscyhkLml0ZXJpdGVtcygpLCBmLml0ZXJpdGVtcygpKQorCisgICAgZGVmIHRlc3RfaXRlcl93aGlsZV9tb2RpZnlpbmdfdmFsdWVzKHNlbGYpOgorICAgICAgICBkaSA9IGl0ZXIoc2VsZi5kKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGtleSA9IGRpLm5leHQoKQorICAgICAgICAgICAgICAgIHNlbGYuZFtrZXldID0gJ21vZGlmaWVkICcra2V5CisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICMgaXQgc2hvdWxkIGJlaGF2ZSB0aGUgc2FtZSBhcyBhIGRpY3QuICBtb2RpZnlpbmcgdmFsdWVzCisgICAgICAgICMgb2YgZXhpc3Rpbmcga2V5cyBzaG91bGQgbm90IGJyZWFrIGl0ZXJhdGlvbi4gIChhZGRpbmcKKyAgICAgICAgIyBvciByZW1vdmluZyBrZXlzIHNob3VsZCkKKyAgICAgICAgbG9vcHNfbGVmdCA9IGxlbihzZWxmLmYpCisgICAgICAgIGZpID0gaXRlcihzZWxmLmYpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAga2V5ID0gZmkubmV4dCgpCisgICAgICAgICAgICAgICAgc2VsZi5mW2tleV0gPSAnbW9kaWZpZWQgJytrZXkKKyAgICAgICAgICAgICAgICBsb29wc19sZWZ0IC09IDEKKyAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9vcHNfbGVmdCwgMCkKKworICAgICAgICBzZWxmLnRlc3RfbWFwcGluZ19pdGVyYXRpb25fbWV0aG9kcygpCisKKyAgICBkZWYgdGVzdF9pdGVyX2Fib3J0X29uX2NoYW5nZWRfc2l6ZShzZWxmKToKKyAgICAgICAgZGVmIERpY3RJdGVyQWJvcnQoKToKKyAgICAgICAgICAgIGRpID0gaXRlcihzZWxmLmQpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGkubmV4dCgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZFsnbmV3a2V5J10gPSAnU1BBTScKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBEaWN0SXRlckFib3J0KQorCisgICAgICAgIGRlZiBEYkl0ZXJBYm9ydCgpOgorICAgICAgICAgICAgZmkgPSBpdGVyKHNlbGYuZikKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmaS5uZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mWyduZXdrZXknXSA9ICdTUEFNJworICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIERiSXRlckFib3J0KQorCisgICAgZGVmIHRlc3RfaXRlcml0ZW1zX2Fib3J0X29uX2NoYW5nZWRfc2l6ZShzZWxmKToKKyAgICAgICAgZGVmIERpY3RJdGVyaXRlbXNBYm9ydCgpOgorICAgICAgICAgICAgZGkgPSBzZWxmLmQuaXRlcml0ZW1zKCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkaS5uZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kWyduZXdrZXknXSA9ICdTUEFNJworICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIERpY3RJdGVyaXRlbXNBYm9ydCkKKworICAgICAgICBkZWYgRGJJdGVyaXRlbXNBYm9ydCgpOgorICAgICAgICAgICAgZmkgPSBzZWxmLmYuaXRlcml0ZW1zKCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBrZXksIHZhbHVlID0gZmkubmV4dCgpCisgICAgICAgICAgICAgICAgICAgIGRlbCBzZWxmLmZba2V5XQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIERiSXRlcml0ZW1zQWJvcnQpCisKKyAgICBkZWYgdGVzdF9pdGVyaXRlbXNfd2hpbGVfbW9kaWZ5aW5nX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZGkgPSBzZWxmLmQuaXRlcml0ZW1zKCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBrLCB2ID0gZGkubmV4dCgpCisgICAgICAgICAgICAgICAgc2VsZi5kW2tdID0gJ21vZGlmaWVkICcrdgorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAjIGl0IHNob3VsZCBiZWhhdmUgdGhlIHNhbWUgYXMgYSBkaWN0LiAgbW9kaWZ5aW5nIHZhbHVlcworICAgICAgICAjIG9mIGV4aXN0aW5nIGtleXMgc2hvdWxkIG5vdCBicmVhayBpdGVyYXRpb24uICAoYWRkaW5nCisgICAgICAgICMgb3IgcmVtb3Zpbmcga2V5cyBzaG91bGQpCisgICAgICAgIGxvb3BzX2xlZnQgPSBsZW4oc2VsZi5mKQorICAgICAgICBmaSA9IHNlbGYuZi5pdGVyaXRlbXMoKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGssIHYgPSBmaS5uZXh0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmZba10gPSAnbW9kaWZpZWQgJyt2CisgICAgICAgICAgICAgICAgbG9vcHNfbGVmdCAtPSAxCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvb3BzX2xlZnQsIDApCisKKyAgICAgICAgc2VsZi50ZXN0X21hcHBpbmdfaXRlcmF0aW9uX21ldGhvZHMoKQorCisgICAgZGVmIHRlc3RfZmlyc3RfbmV4dF9sb29waW5nKHNlbGYpOgorICAgICAgICBpdGVtcyA9IFtzZWxmLmYuZmlyc3QoKV0KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEsIGxlbihzZWxmLmYpKToKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChzZWxmLmYubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFscyhpdGVtcywgc2VsZi5kLml0ZW1zKCkpCisKKyAgICBkZWYgdGVzdF9wcmV2aW91c19sYXN0X2xvb3Bpbmcoc2VsZik6CisgICAgICAgIGl0ZW1zID0gW3NlbGYuZi5sYXN0KCldCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxLCBsZW4oc2VsZi5mKSk6CisgICAgICAgICAgICBpdGVtcy5hcHBlbmQoc2VsZi5mLnByZXZpb3VzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWxzKGl0ZW1zLCBzZWxmLmQuaXRlbXMoKSkKKworICAgIGRlZiB0ZXN0X2ZpcnN0X3doaWxlX2RlbGV0aW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAxNzI1ODU2CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5kKSA+PSAyLCAidGVzdCByZXF1aXJlcyA+PTIgaXRlbXMiKQorICAgICAgICBmb3IgXyBpbiBzZWxmLmQ6CisgICAgICAgICAgICBrZXkgPSBzZWxmLmYuZmlyc3QoKVswXQorICAgICAgICAgICAgZGVsIHNlbGYuZltrZXldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHNlbGYuZi5pdGVtcygpLCAiZXhwZWN0ZWQgZW1wdHkgZGIgYWZ0ZXIgdGVzdCIpCisKKyAgICBkZWYgdGVzdF9sYXN0X3doaWxlX2RlbGV0aW5nKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAxNzI1ODU2J3MgZXZpbCB0d2luCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5kKSA+PSAyLCAidGVzdCByZXF1aXJlcyA+PTIgaXRlbXMiKQorICAgICAgICBmb3IgXyBpbiBzZWxmLmQ6CisgICAgICAgICAgICBrZXkgPSBzZWxmLmYubGFzdCgpWzBdCisgICAgICAgICAgICBkZWwgc2VsZi5mW2tleV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgc2VsZi5mLml0ZW1zKCksICJleHBlY3RlZCBlbXB0eSBkYiBhZnRlciB0ZXN0IikKKworICAgIGRlZiB0ZXN0X3NldF9sb2NhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuc2V0X2xvY2F0aW9uKCdlJyksICgnZScsIHNlbGYuZFsnZSddKSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICBmb3IgayBpbiBzZWxmLmQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGssIHNlbGYuZikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignbm90IGhlcmUnLCBzZWxmLmYpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICBmb3IgayBpbiBzZWxmLmQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5mLmhhc19rZXkoaykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5mLmhhc19rZXkoJ25vdCBoZXJlJykpCisKKyAgICBkZWYgdGVzdF9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi5mLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5mKSwgMCkKKworICAgIGRlZiB0ZXN0X19ub19kZWFkbG9ja19maXJzdChzZWxmLCBkZWJ1Zz0wKToKKyAgICAgICAgIyBkbyB0aGlzIHNvIHRoYXQgdGVzdGVycyBjYW4gc2VlIHdoYXQgZnVuY3Rpb24gd2UncmUgaW4gaW4KKyAgICAgICAgIyB2ZXJib3NlIG1vZGUgd2hlbiB3ZSBkZWFkbG9jay4KKyAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisKKyAgICAgICAgIyBpbiBweWJzZGRiJ3MgX0RCV2l0aEN1cnNvciB0aGlzIGNhdXNlcyBhbiBpbnRlcm5hbCBEQkN1cnNvcgorICAgICAgICAjIG9iamVjdCBpcyBjcmVhdGVkLiAgT3RoZXIgdGVzdF8gbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGNvdWxkCisgICAgICAgICMgaW5hZHZlcnRlbnRseSBjYXVzZSB0aGUgZGVhZGxvY2sgYnV0IGFuIGV4cGxpY2l0IHRlc3QgaXMgbmVlZGVkLgorICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkEiCisgICAgICAgIGssdiA9IHNlbGYuZi5maXJzdCgpCisgICAgICAgIGlmIGRlYnVnOiBwcmludCAiQiIsIGsKKyAgICAgICAgc2VsZi5mW2tdID0gImRlYWRsb2NrLiAgZG8gbm90IHBhc3MgZ28uICBkbyBub3QgY29sbGVjdCAkMjAwLiIKKyAgICAgICAgaWYgZGVidWc6IHByaW50ICJDIgorICAgICAgICAjIGlmIHRoZSBic2RkYiBpbXBsZW1lbnRhdGlvbiBsZWF2ZXMgdGhlIERCQ3Vyc29yIG9wZW4gZHVyaW5nCisgICAgICAgICMgdGhlIGRhdGFiYXNlIHdyaXRlIGFuZCBsb2NraW5nK3RocmVhZGluZyBzdXBwb3J0IGlzIGVuYWJsZWQKKyAgICAgICAgIyB0aGUgY3Vyc29yJ3MgcmVhZCBsb2NrIHdpbGwgZGVhZGxvY2sgdGhlIHdyaXRlIGxvY2sgcmVxdWVzdC4uCisKKyAgICAgICAgIyB0ZXN0IHRoZSBpdGVyYXRvciBpbnRlcmZhY2UKKyAgICAgICAgaWYgVHJ1ZToKKyAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiRCIKKyAgICAgICAgICAgIGkgPSBzZWxmLmYuaXRlcml0ZW1zKCkKKyAgICAgICAgICAgIGssdiA9IGkubmV4dCgpCisgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkUiCisgICAgICAgICAgICBzZWxmLmZba10gPSAicGxlYXNlIGRvbid0IGRlYWRsb2NrIgorICAgICAgICAgICAgaWYgZGVidWc6IHByaW50ICJGIgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGssdiA9IGkubmV4dCgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkYyIgorCisgICAgICAgICAgICBpID0gaXRlcihzZWxmLmYpCisgICAgICAgICAgICBpZiBkZWJ1ZzogcHJpbnQgIkciCisgICAgICAgICAgICB3aGlsZSBpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVidWc6IHByaW50ICJIIgorICAgICAgICAgICAgICAgICAgICBrID0gaS5uZXh0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVidWc6IHByaW50ICJJIgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZba10gPSAiZGVhZGxvY2tzLXItdXMiCisgICAgICAgICAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiSiIKKyAgICAgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgaSA9IE5vbmUKKyAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiSyIKKworICAgICAgICAjIHRlc3QgdGhlIGxlZ2FjeSBjdXJzb3IgaW50ZXJmYWNlIG1peGVkIHdpdGggd3JpdGVzCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi5mLmZpcnN0KClbMF0sIHNlbGYuZCkKKyAgICAgICAgayA9IHNlbGYuZi5uZXh0KClbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRJbihrLCBzZWxmLmQpCisgICAgICAgIHNlbGYuZltrXSA9ICJiZSBnb25lIHdpdGggeWUgZGVhZGxvY2tzIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5mW2tdLCAiYmUgZ29uZSB3aXRoIHllIGRlYWRsb2NrcyIpCisKKyAgICBkZWYgdGVzdF9mb3JfY3Vyc29yX21lbWxlYWsoc2VsZik6CisgICAgICAgICMgZG8gdGhlIGJzZGRiLl9EQldpdGhDdXJzb3IgaXRlcmF0b3IgaW50ZXJuYWxzIGxlYWsgY3Vyc29ycz8KKyAgICAgICAgbmMxID0gbGVuKHNlbGYuZi5fY3Vyc29yX3JlZnMpCisgICAgICAgICMgY3JlYXRlIGl0ZXJhdG9yCisgICAgICAgIGkgPSBzZWxmLmYuaXRlcml0ZW1zKCkKKyAgICAgICAgbmMyID0gbGVuKHNlbGYuZi5fY3Vyc29yX3JlZnMpCisgICAgICAgICMgdXNlIHRoZSBpdGVyYXRvciAoc2hvdWxkIHJ1biB0byB0aGUgZmlyc3QgeWllbGQsIGNyZWF0aW5nIHRoZSBjdXJzb3IpCisgICAgICAgIGssIHYgPSBpLm5leHQoKQorICAgICAgICBuYzMgPSBsZW4oc2VsZi5mLl9jdXJzb3JfcmVmcykKKyAgICAgICAgIyBkZXN0cm95IHRoZSBpdGVyYXRvcjsgdGhpcyBzaG91bGQgY2F1c2UgdGhlIHdlYWtyZWYgY2FsbGJhY2sKKyAgICAgICAgIyB0byByZW1vdmUgdGhlIGN1cnNvciBvYmplY3QgZnJvbSBzZWxmLmYuX2N1cnNvcl9yZWZzCisgICAgICAgIGRlbCBpCisgICAgICAgIG5jNCA9IGxlbihzZWxmLmYuX2N1cnNvcl9yZWZzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmMxLCBuYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmMxLCBuYzQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYzMgPT0gbmMxKzEpCisKKyAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYpOgorICAgICAgICBrLCB2ID0gc2VsZi5mLnBvcGl0ZW0oKQorICAgICAgICBzZWxmLmFzc2VydEluKGssIHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih2LCBzZWxmLmQudmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaywgc2VsZi5mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmQpLTEsIGxlbihzZWxmLmYpKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBrID0gJ3cnCisgICAgICAgIHYgPSBzZWxmLmYucG9wKGspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgc2VsZi5kW2tdKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGssIHNlbGYuZikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbih2LCBzZWxmLmYudmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuZCktMSwgbGVuKHNlbGYuZikpCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmdldCgnTm90SGVyZScpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5nZXQoJ05vdEhlcmUnLCAnRGVmYXVsdCcpLCAnRGVmYXVsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmdldCgncScsICdEZWZhdWx0JyksIHNlbGYuZFsncSddKQorCisgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuc2V0ZGVmYXVsdCgnbmV3JywgJ2RvZycpLCAnZG9nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuc2V0ZGVmYXVsdCgncicsICdjYXQnKSwgc2VsZi5kWydyJ10pCisKKyAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CisgICAgICAgIG5ldyA9IGRpY3QoeT0nbGlmZScsIHU9J29mJywgaT0nYnJpYW4nKQorICAgICAgICBzZWxmLmYudXBkYXRlKG5ldykKKyAgICAgICAgc2VsZi5kLnVwZGF0ZShuZXcpCisgICAgICAgIGZvciBrLCB2IGluIHNlbGYuZC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mW2tdLCB2KQorCisgICAgZGVmIHRlc3Rfa2V5b3JkZXJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3Blbm1ldGhvZFswXSBpcyBub3QgYnNkZGIuYnRvcGVuOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGtleXMgPSBzZWxmLmQua2V5cygpCisgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmZpcnN0KClbMF0sIGtleXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLm5leHQoKVswXSwga2V5c1sxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYubGFzdCgpWzBdLCBrZXlzWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYucHJldmlvdXMoKVswXSwga2V5c1stMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLmYpLCBrZXlzKQorCitjbGFzcyBUZXN0QlRyZWUoVGVzdEJTRERCKToKKyAgICBmbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICBvcGVubWV0aG9kID0gW2JzZGRiLmJ0b3Blbl0KKworY2xhc3MgVGVzdEJUcmVlX0luTWVtb3J5KFRlc3RCU0REQik6CisgICAgZm5hbWUgPSBOb25lCisgICAgb3Blbm1ldGhvZCA9IFtic2RkYi5idG9wZW5dCisKK2NsYXNzIFRlc3RCVHJlZV9Jbk1lbW9yeV9UcnVuY2F0ZShUZXN0QlNEREIpOgorICAgIGZuYW1lID0gTm9uZQorICAgIG9wZW5mbGFnID0gJ24nCisgICAgb3Blbm1ldGhvZCA9IFtic2RkYi5idG9wZW5dCisKK2NsYXNzIFRlc3RIYXNoVGFibGUoVGVzdEJTRERCKToKKyAgICBmbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICBvcGVubWV0aG9kID0gW2JzZGRiLmhhc2hvcGVuXQorCitjbGFzcyBUZXN0SGFzaFRhYmxlX0luTWVtb3J5KFRlc3RCU0REQik6CisgICAgZm5hbWUgPSBOb25lCisgICAgb3Blbm1ldGhvZCA9IFtic2RkYi5oYXNob3Blbl0KKworIyMgICAgICAgICAjIChic2RkYi5ybm9wZW4sJ1JlY29yZCBOdW1iZXJzJyksICdwdXQnIGZvciBSRUNOTyBmb3IgYnNkZGIgMS44NQorIyMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlYXJzIGJyb2tlbi4uLiBhdCBsZWFzdCBvbgorIyMgICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2xhcmlzIEludGVsIC0gcm1hc3NlIDEvOTcKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFRlc3RCVHJlZSwKKyAgICAgICAgVGVzdEhhc2hUYWJsZSwKKyAgICAgICAgVGVzdEJUcmVlX0luTWVtb3J5LAorICAgICAgICBUZXN0SGFzaFRhYmxlX0luTWVtb3J5LAorICAgICAgICBUZXN0QlRyZWVfSW5NZW1vcnlfVHJ1bmNhdGUsCisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5Y2ZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5Y2ZhZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjE4NS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMTg1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4MTAyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjE4NS5weQpAQCAtMCwwICsxLDQzIEBACisiIiJUZXN0cyBmb3IgdGhlIGJzZGRiMTg1IG1vZHVsZS4KKworVGhlIGZpbGUgMTg1dGVzdC5kYiBmb3VuZCBpbiBMaWIvdGVzdC8gaXMgZm9yIHRlc3RpbmcgcHVycG9zZXMgd2l0aCB0aGlzCit0ZXN0aW5nIHN1aXRlLgorCisiIiIKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgZmluZGZpbGUsIGltcG9ydF9tb2R1bGUKK2ltcG9ydCB1bml0dGVzdAorYnNkZGIxODUgPSBpbXBvcnRfbW9kdWxlKCdic2RkYjE4NScsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2ltcG9ydCBhbnlkYm0KK2ltcG9ydCB3aGljaGRiCitpbXBvcnQgb3MKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHNodXRpbAorCitjbGFzcyBCc2RkYjE4NVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X29wZW5fZXhpc3RpbmdfaGFzaChzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgd2UgY2FuIG9wZW4gYSBmaWxlIGtub3duIHRvIGJlIGEgaGFzaCB2MiBmaWxlCisgICAgICAgIGRiID0gYnNkZGIxODUuaGFzaG9wZW4oZmluZGZpbGUoIjE4NXRlc3QuZGIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYlsiMSJdLCAiMSIpCisgICAgICAgIGRiLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3doaWNoZGIoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgd2hpY2hkYiBjb3JyZWN0bHkgc25pZmZzIHRoZSBrbm93biBoYXNoIHYyIGZpbGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3aGljaGRiLndoaWNoZGIoZmluZGZpbGUoIjE4NXRlc3QuZGIiKSksICJic2RkYjE4NSIpCisKKyAgICBkZWYgdGVzdF9hbnlkYm1fY3JlYXRlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IGFueWRibS5vcGVuIGRvZXMgKm5vdCogY3JlYXRlIGEgYnNkZGIxODUgZmlsZQorICAgICAgICB0bXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGJmaWxlID0gb3MucGF0aC5qb2luKHRtcGRpciwgImZvby5kYiIpCisgICAgICAgICAgICBhbnlkYm0ub3BlbihkYmZpbGUsICJjIikuY2xvc2UoKQorICAgICAgICAgICAgZnR5cGUgPSB3aGljaGRiLndoaWNoZGIoZGJmaWxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmdHlwZSwgImJzZGRiMTg1IikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodG1wZGlyKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEJzZGRiMTg1VGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMTg1LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMTg1LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDUzMDVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIxODUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMTg1LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMTg1LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDUzMDVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIxODUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2JzZGRiMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTkxNDViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIzLnB5CkBAIC0wLDAgKzEsODEgQEAKKyMgVGVzdCBkcml2ZXIgZm9yIGJzZGRiIHBhY2thZ2UuCisiIiIKK1J1biBhbGwgdGVzdCBjYXNlcy4KKyIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzLCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKKworIyBTa2lwIHRlc3QgaWYgX2JzZGRiIG1vZHVsZSB3YXMgbm90IGJ1aWx0LgoraW1wb3J0X21vZHVsZSgnX2JzZGRiJykKKyMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKK2ltcG9ydF9tb2R1bGUoJ2JzZGRiJywgZGVwcmVjYXRlZD1UcnVlKQorCisjIFdoZW4gcnVubmluZyBhcyBhIHNjcmlwdCBpbnN0ZWFkIG9mIHdpdGhpbiB0aGUgcmVncnRlc3QgZnJhbWV3b3JrLCBza2lwIHRoZQorIyByZXF1aXJlcyB0ZXN0LCBzaW5jZSBpdCdzIG9idmlvdXMgd2Ugd2FudCB0byBydW4gdGhlbS4KK2lmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6CisgICAgcmVxdWlyZXMoJ2JzZGRiJykKKwordmVyYm9zZSA9IEZhbHNlCitpZiAndmVyYm9zZScgaW4gc3lzLmFyZ3Y6CisgICAgdmVyYm9zZSA9IFRydWUKKyAgICBzeXMuYXJndi5yZW1vdmUoJ3ZlcmJvc2UnKQorCitpZiAnc2lsZW50JyBpbiBzeXMuYXJndjogICMgdGFrZSBjYXJlIG9mIG9sZCBmbGFnLCBqdXN0IGluIGNhc2UKKyAgICB2ZXJib3NlID0gRmFsc2UKKyAgICBzeXMuYXJndi5yZW1vdmUoJ3NpbGVudCcpCisKKworY2xhc3MgVGltaW5nQ2hlY2sodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGhpcyBjbGFzcyBpcyBub3QgYSByZWFsIHRlc3QuICBJdHMgcHVycG9zZSBpcyB0byBwcmludCBhIG1lc3NhZ2UKKyAgICBwZXJpb2RpY2FsbHkgd2hlbiB0aGUgdGVzdCBydW5zIHNsb3dseS4gIFRoaXMgd2lsbCBwcmV2ZW50IHRoZSBidWlsZGJvdHMKKyAgICBmcm9tIHRpbWluZyBvdXQgb24gc2xvdyBtYWNoaW5lcy4iIiIKKworICAgICMgSG93IG11Y2ggdGltZSBpbiBzZWNvbmRzIGJlZm9yZSBwcmludGluZyBhICdTdGlsbCB3b3JraW5nJyBtZXNzYWdlLgorICAgICMgU2luY2UgdGhpcyBpcyBydW4gYXQgbW9zdCBvbmNlIGJldHdlZW4gZWFjaCB0ZXN0IG1vZHVsZSwgdXNlIGEgc21hbGxlcgorICAgICMgaW50ZXJ2YWwgdGhhbiBvdGhlciB0ZXN0cy4KKyAgICBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwgPSA0ICogNjAKKworICAgICMgbmV4dF90aW1lIGlzIHVzZWQgYXMgYSBnbG9iYWwgdmFyaWFibGUgdGhhdCBzdXJ2aXZlcyBlYWNoIGluc3RhbmNlLgorICAgICMgVGhpcyBpcyBuZWNlc3Nhcnkgc2luY2UgYSBuZXcgaW5zdGFuY2Ugd2lsbCBiZSBjcmVhdGVkIGZvciBlYWNoIHRlc3QuCisgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKworICAgIGRlZiB0ZXN0Q2hlY2tFbGFwc2VkVGltZShzZWxmKToKKyAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhlc2UgdGVzdHMgY2FuIGJlIHJlYWxseSBzbG93LgorICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBpZiBzZWxmLm5leHRfdGltZSA8PSBub3c6CisgICAgICAgICAgICBUaW1pbmdDaGVjay5uZXh0X3RpbWUgPSBub3cgKyBzZWxmLl9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18ud3JpdGUoJyAgdGVzdF9ic2RkYjMgc3RpbGwgd29ya2luZywgYmUgcGF0aWVudC4uLlxuJykKKyAgICAgICAgICAgIHN5cy5fX3N0ZG91dF9fLmZsdXNoKCkKKworCisjIEZvciBpbnZvY2F0aW9uIHRocm91Z2ggcmVncnRlc3QKK2RlZiB0ZXN0X21haW4oKToKKyAgICBmcm9tIGJzZGRiIGltcG9ydCBkYgorICAgIGZyb20gYnNkZGIudGVzdCBpbXBvcnQgdGVzdF9hbGwKKyAgICB0ZXN0X2FsbC5zZXRfdGVzdF9wYXRoX3ByZWZpeChvcy5wYXRoLmpvaW4odGVtcGZpbGUuZ2V0dGVtcGRpcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3otdGVzdF9ic2RkYjMtJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmdldHBpZCgpKSkKKyAgICAjIFBsZWFzZSBsZWF2ZSB0aGlzIHByaW50IGluLCBoYXZpbmcgdGhpcyBzaG93IHVwIGluIHRoZSBidWlsZGJvdHMKKyAgICAjIG1ha2VzIGRpYWdub3NpbmcgcHJvYmxlbXMgYSBsb3QgZWFzaWVyLgorICAgIHByaW50ID4+c3lzLnN0ZGVyciwgZGIuREJfVkVSU0lPTl9TVFJJTkcKKyAgICBwcmludCA+PnN5cy5zdGRlcnIsICdUZXN0IHBhdGggcHJlZml4OiAnLCB0ZXN0X2FsbC5nZXRfdGVzdF9wYXRoX3ByZWZpeCgpCisgICAgdHJ5OgorICAgICAgICBydW5fdW5pdHRlc3QodGVzdF9hbGwuc3VpdGUobW9kdWxlX3ByZWZpeD0nYnNkZGIudGVzdC4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltaW5nX2NoZWNrPVRpbWluZ0NoZWNrKSkKKyAgICBmaW5hbGx5OgorICAgICAgICAjIFRoZSBvbmx5IHJlYXNvbiB0byByZW1vdmUgZGJfaG9tZSBpcyBpbiBjYXNlIGlmIHRoZXJlIGlzIGFuIG9sZAorICAgICAgICAjIG9uZSBseWluZyBhcm91bmQuICBUaGlzIG1pZ2h0IGJlIGJ5IGEgZGlmZmVyZW50IHVzZXIsIHNvIGp1c3QKKyAgICAgICAgIyBpZ25vcmUgZXJyb3JzLiAgV2Ugc2hvdWxkIGFsd2F5cyBtYWtlIGEgdW5pcXVlIG5hbWUgbm93LgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2FsbC5yZW1vdmVfdGVzdF9wYXRoX2RpcmVjdG9yeSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNkNzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ic2RkYjMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzNkNzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnNkZGIzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZmZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZmZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4ZTYzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmZlci5weQpAQCAtMCwwICsxLDM5IEBACisiIiJVbml0IHRlc3RzIGZvciBidWZmZXIgb2JqZWN0cy4KKworRm9yIG5vdywgdGVzdHMganVzdCBuZXcgb3IgY2hhbmdlZCBmdW5jdGlvbmFsaXR5LgorCisiIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBCdWZmZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGV4dGVuZGVkIHNsaWNpbmcgYnkgY29tcGFyaW5nIHdpdGggbGlzdCBzbGljaW5nLgorICAgICAgICBzID0gIiIuam9pbihjaHIoYykgZm9yIGMgaW4gbGlzdChyYW5nZSgyNTUsIC0xLCAtMSkpKQorICAgICAgICBiID0gYnVmZmVyKHMpCisgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgMTksIDMwMCwgLTEsIC0yLCAtMzEsIC0zMDApCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFNraXAgc3RlcCAwIChpbnZhbGlkKQorICAgICAgICAgICAgICAgIGZvciBzdGVwIGluIGluZGljZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbc3RhcnQ6c3RvcDpzdGVwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3N0YXJ0OnN0b3A6c3RlcF0pCisKKyAgICBkZWYgdGVzdF9uZXdidWZmZXJfaW50ZXJmYWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgYnVmZmVyIG9iamVjdCBoYXMgdGhlIG5ldyBidWZmZXIgaW50ZXJmYWNlCisgICAgICAgICMgYXMgdXNlZCBieSB0aGUgbWVtb3J5dmlldyBvYmplY3QKKyAgICAgICAgcyA9ICIiLmpvaW4oY2hyKGMpIGZvciBjIGluIGxpc3QocmFuZ2UoMjU1LCAtMSwgLTEpKSkKKyAgICAgICAgYiA9IGJ1ZmZlcihzKQorICAgICAgICBtID0gbWVtb3J5dmlldyhiKSAjIFNob3VsZCBub3QgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS50b2J5dGVzKCksIHMpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKCJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCdWZmZXJUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmZmVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0MzllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmZmVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI0MzllNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmaW8ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZpby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDhiMWUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVmaW8ucHkKQEAgLTAsMCArMSw3OSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisKK2ltcG9ydCBpbyAjIEMgaW1wbGVtZW50YXRpb24uCitpbXBvcnQgX3B5aW8gYXMgcHlpbyAjIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KKworIyBTaW1wbGUgdGVzdCB0byBlbnN1cmUgdGhhdCBvcHRpbWl6YXRpb25zIGluIHRoZSBJTyBsaWJyYXJ5IGRlbGl2ZXIgdGhlCisjIGV4cGVjdGVkIHJlc3VsdHMuICBGb3IgYmVzdCB0ZXN0aW5nLCBydW4gdGhpcyB1bmRlciBhIGRlYnVnLWJ1aWxkIFB5dGhvbiB0b28KKyMgKHRvIGV4ZXJjaXNlIGFzc2VydHMgaW4gdGhlIEMgY29kZSkuCisKK2xlbmd0aHMgPSBsaXN0KHJhbmdlKDEsIDI1NykpICsgWzUxMiwgMTAwMCwgMTAyNCwgMjA0OCwgNDA5NiwgODE5MiwgMTAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjM4NCwgMzI3NjgsIDY1NTM2LCAxMDAwMDAwXQorCitjbGFzcyBCdWZmZXJTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRyeV9vbmUoc2VsZiwgcyk6CisgICAgICAgICMgV3JpdGUgcyArICJcbiIgKyBzIHRvIGZpbGUsIHRoZW4gb3BlbiBpdCBhbmQgZW5zdXJlIHRoYXQgc3VjY2Vzc2l2ZQorICAgICAgICAjIC5yZWFkbGluZSgpcyBkZWxpdmVyIHdoYXQgd2Ugd3JvdGUuCisKKyAgICAgICAgIyBFbnN1cmUgd2UgY2FuIG9wZW4gVEVTVEZOIGZvciB3cml0aW5nLgorICAgICAgICBzdXBwb3J0LnVubGluayhzdXBwb3J0LlRFU1RGTikKKworICAgICAgICAjIFNpbmNlIEMgZG9lc24ndCBndWFyYW50ZWUgd2UgY2FuIHdyaXRlL3JlYWQgYXJiaXRyYXJ5IGJ5dGVzIGluIHRleHQKKyAgICAgICAgIyBmaWxlcywgdXNlIGJpbmFyeSBtb2RlLgorICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHdyaXRlIG9uY2Ugd2l0aCBcbiBhbmQgb25jZSB3aXRob3V0CisgICAgICAgICAgICBmLndyaXRlKHMpCisgICAgICAgICAgICBmLndyaXRlKGIiXG4iKQorICAgICAgICAgICAgZi53cml0ZShzKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gb3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIGxpbmUgPSBmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgcyArIGIiXG4iKQorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBzKQorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBsaW5lKSAjIE11c3QgYmUgYXQgRU9GCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIGRyaXZlX29uZShzZWxmLCBwYXR0ZXJuKToKKyAgICAgICAgZm9yIGxlbmd0aCBpbiBsZW5ndGhzOgorICAgICAgICAgICAgIyBSZXBlYXQgc3RyaW5nICdwYXR0ZXJuJyBhcyBvZnRlbiBhcyBuZWVkZWQgdG8gcmVhY2ggdG90YWwgbGVuZ3RoCisgICAgICAgICAgICAjICdsZW5ndGgnLiAgVGhlbiBjYWxsIHRyeV9vbmUgd2l0aCB0aGF0IHN0cmluZywgYSBzdHJpbmcgb25lIGxhcmdlcgorICAgICAgICAgICAgIyB0aGFuIHRoYXQsIGFuZCBhIHN0cmluZyBvbmUgc21hbGxlciB0aGFuIHRoYXQuICBUcnkgdGhpcyB3aXRoIGFsbAorICAgICAgICAgICAgIyBzbWFsbCBzaXplcyBhbmQgdmFyaW91cyBwb3dlcnMgb2YgMiwgc28gd2UgZXhlcmNpc2UgYWxsIGxpa2VseQorICAgICAgICAgICAgIyBzdGRpbyBidWZmZXIgc2l6ZXMsIGFuZCAib2ZmIGJ5IG9uZSIgZXJyb3JzIG9uIGJvdGggc2lkZXMuCisgICAgICAgICAgICBxLCByID0gZGl2bW9kKGxlbmd0aCwgbGVuKHBhdHRlcm4pKQorICAgICAgICAgICAgdGVzdHN0cmluZyA9IHBhdHRlcm4gKiBxICsgcGF0dGVybls6cl0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRlc3RzdHJpbmcpLCBsZW5ndGgpCisgICAgICAgICAgICBzZWxmLnRyeV9vbmUodGVzdHN0cmluZykKKyAgICAgICAgICAgIHNlbGYudHJ5X29uZSh0ZXN0c3RyaW5nICsgYiJ4IikKKyAgICAgICAgICAgIHNlbGYudHJ5X29uZSh0ZXN0c3RyaW5nWzotMV0pCisKKyAgICBkZWYgdGVzdF9wcmltZXBhdChzZWxmKToKKyAgICAgICAgIyBBIHBhdHRlcm4gd2l0aCBwcmltZSBsZW5ndGgsIHRvIGF2b2lkIHNpbXBsZSByZWxhdGlvbnNoaXBzIHdpdGgKKyAgICAgICAgIyBzdGRpbyBidWZmZXIgc2l6ZXMuCisgICAgICAgIHNlbGYuZHJpdmVfb25lKGIiMTIzNDU2Nzg5MFwwMFwwMVwwMlwwM1wwNFwwNVwwNiIpCisKKyAgICBkZWYgdGVzdF9udWxscGF0KHNlbGYpOgorICAgICAgICBzZWxmLmRyaXZlX29uZShieXRlcygxMDAwKSkKKworCitjbGFzcyBDQnVmZmVyU2l6ZVRlc3QoQnVmZmVyU2l6ZVRlc3QpOgorICAgIG9wZW4gPSBpby5vcGVuCisKK2NsYXNzIFB5QnVmZmVyU2l6ZVRlc3QoQnVmZmVyU2l6ZVRlc3QpOgorICAgIG9wZW4gPSBzdGF0aWNtZXRob2QocHlpby5vcGVuKQorCitjbGFzcyBCdWlsdGluQnVmZmVyU2l6ZVRlc3QoQnVmZmVyU2l6ZVRlc3QpOgorICAgIG9wZW4gPSBvcGVuCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KENCdWZmZXJTaXplVGVzdCwgUHlCdWZmZXJTaXplVGVzdCwgQnVpbHRpbkJ1ZmZlclNpemVUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZpby5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZpby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmlvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZpby5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWZpby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlMjRiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1ZmlvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9idWlsdGluLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmRlNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtMCwwICsxLDE3MTIgQEAKKyMgUHl0aG9uIHRlc3Qgc2V0IC0tIGJ1aWx0LWluIGZ1bmN0aW9ucworCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmNtcCwgaGF2ZV91bmljb2RlLCBURVNURk4sIHVubGluaywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3VuaXR0ZXN0LCBjaGVja19weTNrX3dhcm5pbmdzCitpbXBvcnQgd2FybmluZ3MKK2Zyb20gb3BlcmF0b3IgaW1wb3J0IG5lZworCitpbXBvcnQgc3lzLCBjU3RyaW5nSU8sIHJhbmRvbSwgVXNlckRpY3QKKworIyBjb3VudCB0aGUgbnVtYmVyIG9mIHRlc3QgcnVucy4KKyMgdXNlZCB0byBza2lwIHJ1bm5pbmcgdGVzdF9leGVjZmlsZSgpIG11bHRpcGxlIHRpbWVzCisjIGFuZCB0byBjcmVhdGUgdW5pcXVlIHN0cmluZ3MgdG8gaW50ZXJuIGluIHRlc3RfaW50ZXJuKCkKK251bXJ1bnMgPSAwCisKK2NsYXNzIFNxdWFyZXM6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4KToKKyAgICAgICAgc2VsZi5tYXggPSBtYXgKKyAgICAgICAgc2VsZi5zb2ZhciA9IFtdCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNvZmFyKQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICBpZiBub3QgMCA8PSBpIDwgc2VsZi5tYXg6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgbiA9IGxlbihzZWxmLnNvZmFyKQorICAgICAgICB3aGlsZSBuIDw9IGk6CisgICAgICAgICAgICBzZWxmLnNvZmFyLmFwcGVuZChuKm4pCisgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgcmV0dXJuIHNlbGYuc29mYXJbaV0KKworY2xhc3MgU3RyU3F1YXJlczoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXgpOgorICAgICAgICBzZWxmLm1heCA9IG1heAorICAgICAgICBzZWxmLnNvZmFyID0gW10KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuc29mYXIpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIGlmIG5vdCAwIDw9IGkgPCBzZWxmLm1heDoKKyAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgbiA9IGxlbihzZWxmLnNvZmFyKQorICAgICAgICB3aGlsZSBuIDw9IGk6CisgICAgICAgICAgICBzZWxmLnNvZmFyLmFwcGVuZChzdHIobipuKSkKKyAgICAgICAgICAgIG4gKz0gMQorICAgICAgICByZXR1cm4gc2VsZi5zb2ZhcltpXQorCitjbGFzcyBCaXRCdWNrZXQ6CisgICAgZGVmIHdyaXRlKHNlbGYsIGxpbmUpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgVGVzdEZhaWxpbmdCb29sOgorICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKK2NsYXNzIFRlc3RGYWlsaW5nSXRlcjoKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCitjbGFzcyBCdWlsdGluVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9pbXBvcnQoc2VsZik6CisgICAgICAgIF9faW1wb3J0X18oJ3N5cycpCisgICAgICAgIF9faW1wb3J0X18oJ3RpbWUnKQorICAgICAgICBfX2ltcG9ydF9fKCdzdHJpbmcnKQorICAgICAgICBfX2ltcG9ydF9fKG5hbWU9J3N5cycpCisgICAgICAgIF9faW1wb3J0X18obmFtZT0ndGltZScsIGxldmVsPTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBfX2ltcG9ydF9fLCAnc3BhbXNwYW0nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIF9faW1wb3J0X18sIDEsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIF9faW1wb3J0X18sICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIF9faW1wb3J0X18sICdzeXMnLCBuYW1lPSdzeXMnKQorCisgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgorICAgICAgICAjIGludAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMTIzNCksIDEyMzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKC0xMjM0KSwgMTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicygtc3lzLm1heGludC0xKSA+IDApCisgICAgICAgICMgZmxvYXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMC4wKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicygzLjE0KSwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoLTMuMTQpLCAzLjE0KQorICAgICAgICAjIGxvbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMEwpLCAwTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoMTIzNEwpLCAxMjM0TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoLTEyMzRMKSwgMTIzNEwpCisgICAgICAgICMgc3RyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYWJzLCAnYScpCisgICAgICAgICMgYm9vbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhUcnVlKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoRmFsc2UpLCAwKQorICAgICAgICAjIG90aGVyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYWJzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFicywgTm9uZSkKKyAgICAgICAgY2xhc3MgQWJzQ2xhc3Mob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Fic19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAtNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhBYnNDbGFzcygpKSwgLTUpCisKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsKFsyLCA0LCA2XSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsKFsyLCBOb25lLCA2XSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGFsbCwgWzIsIFRlc3RGYWlsaW5nQm9vbCgpLCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBhbGwsIFRlc3RGYWlsaW5nSXRlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFsbCwgMTApICAgICAgICAgICAgICAgIyBOb24taXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhbGwpICAgICAgICAgICAgICAgICAgICMgTm8gYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGFsbCwgWzIsIDQsIDZdLCBbXSkgICAgIyBUb28gbWFueSBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsKFtdKSwgVHJ1ZSkgICAgICAgICAgICAgICAgICAgICAjIEVtcHR5IGl0ZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsKFswLCBUZXN0RmFpbGluZ0Jvb2woKV0pLCBGYWxzZSkjIFNob3J0LWNpcmN1aXQKKyAgICAgICAgUyA9IFs1MCwgNjBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsKHggPiA0MiBmb3IgeCBpbiBTKSwgVHJ1ZSkKKyAgICAgICAgUyA9IFs1MCwgNDAsIDYwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsbCh4ID4gNDIgZm9yIHggaW4gUyksIEZhbHNlKQorCisgICAgZGVmIHRlc3RfYW55KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFueShbTm9uZSwgTm9uZSwgTm9uZV0pLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnkoW05vbmUsIDQsIE5vbmVdKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBhbnksIFtOb25lLCBUZXN0RmFpbGluZ0Jvb2woKSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgYW55LCBUZXN0RmFpbGluZ0l0ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhbnksIDEwKSAgICAgICAgICAgICAgICMgTm9uLWl0ZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYW55KSAgICAgICAgICAgICAgICAgICAjIE5vIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhbnksIFsyLCA0LCA2XSwgW10pICAgICMgVG9vIG1hbnkgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFueShbXSksIEZhbHNlKSAgICAgICAgICAgICAgICAgICAgIyBFbXB0eSBpdGVyYXRvcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFueShbMSwgVGVzdEZhaWxpbmdCb29sKCldKSwgVHJ1ZSkgIyBTaG9ydC1jaXJjdWl0CisgICAgICAgIFMgPSBbNDAsIDYwLCAzMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnkoeCA+IDQyIGZvciB4IGluIFMpLCBUcnVlKQorICAgICAgICBTID0gWzEwLCAyMCwgMzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW55KHggPiA0MiBmb3IgeCBpbiBTKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9uZWcoc2VsZik6CisgICAgICAgIHggPSAtc3lzLm1heGludC0xCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXgsIHN5cy5tYXhpbnQrMSkKKworICAgIGRlZiB0ZXN0X2FwcGx5KHNlbGYpOgorICAgICAgICBkZWYgZjAoKmFyZ3MpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCAoKSkKKyAgICAgICAgZGVmIGYxKGExKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTEsIDEpCisgICAgICAgIGRlZiBmMihhMSwgYTIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTIsIDIpCisgICAgICAgIGRlZiBmMyhhMSwgYTIsIGEzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTEsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEyLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMywgMykKKyAgICAgICAgYXBwbHkoZjAsICgpKQorICAgICAgICBhcHBseShmMSwgKDEsKSkKKyAgICAgICAgYXBwbHkoZjIsICgxLCAyKSkKKyAgICAgICAgYXBwbHkoZjMsICgxLCAyLCAzKSkKKworICAgICAgICAjIEEgUHlDRnVuY3Rpb24gdGhhdCB0YWtlcyBvbmx5IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBzaG91bGQgYWxsb3cgYW4KKyAgICAgICAgIyBlbXB0eSBrZXl3b3JkIGRpY3Rpb25hcnkgdG8gcGFzcyB3aXRob3V0IGEgY29tcGxhaW50LCBidXQgcmFpc2UgYQorICAgICAgICAjIFR5cGVFcnJvciBpZiB0aGUgZGljdGlvbmFyeSBpcyBub24tZW1wdHkuCisgICAgICAgIGFwcGx5KGlkLCAoMSwpLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcHBseSwgaWQsICgxLCksIHsiZm9vIjogMX0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXBwbHkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXBwbHksIGlkLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcHBseSwgaWQsICg0MiwpLCA0MikKKworICAgIGRlZiB0ZXN0X2NhbGxhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUobGVuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjYWxsYWJsZSgiYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUoY2FsbGFibGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUobGFtYmRhIHgsIHk6IHggKyB5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjYWxsYWJsZShfX2J1aWx0aW5zX18pKQorICAgICAgICBkZWYgZigpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShmKSkKKworICAgICAgICBjbGFzcyBDbGFzc2ljOgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZik6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKENsYXNzaWMpKQorICAgICAgICBjID0gQ2xhc3NpYygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShjLm1ldGgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNhbGxhYmxlKGMpKQorCisgICAgICAgIGNsYXNzIE5ld1N0eWxlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUoTmV3U3R5bGUpKQorICAgICAgICBuID0gTmV3U3R5bGUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUobi5tZXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjYWxsYWJsZShuKSkKKworICAgICAgICAjIENsYXNzaWMgYW5kIG5ldy1zdHlsZSBjbGFzc2VzIGV2YWx1YXRlIF9fY2FsbF9fKCkgZGlmZmVyZW50bHkKKyAgICAgICAgYy5fX2NhbGxfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGMpKQorICAgICAgICBkZWwgYy5fX2NhbGxfXworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNhbGxhYmxlKGMpKQorICAgICAgICBuLl9fY2FsbF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNhbGxhYmxlKG4pKQorICAgICAgICBkZWwgbi5fX2NhbGxfXworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNhbGxhYmxlKG4pKQorCisgICAgICAgIGNsYXNzIE4yKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6IHBhc3MKKyAgICAgICAgbjIgPSBOMigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShuMikpCisgICAgICAgIGNsYXNzIE4zKE4yKTogcGFzcworICAgICAgICBuMyA9IE4zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKG4zKSkKKworICAgIGRlZiB0ZXN0X2NocihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaHIoMzIpLCAnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hyKDY1KSwgJ0EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNocig5NyksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaHIoMHhmZiksICdceGZmJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2hyLCAyNTYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2hyKQorCisgICAgZGVmIHRlc3RfY21wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCgtMSwgMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCgxLCAtMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKDEsIDEpLCAwKQorICAgICAgICAjIHZlcmlmeSB0aGF0IGNpcmN1bGFyIG9iamVjdHMgYXJlIG5vdCBoYW5kbGVkCisgICAgICAgIGEgPSBbXTsgYS5hcHBlbmQoYSkKKyAgICAgICAgYiA9IFtdOyBiLmFwcGVuZChiKQorICAgICAgICBmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAorICAgICAgICBjID0gVXNlckxpc3QoKTsgYy5hcHBlbmQoYykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCBiLCBjKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgYywgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIGEsIGMpCisgICAgICAgIyBva2F5LCBub3cgYnJlYWsgdGhlIGN5Y2xlcworICAgICAgICBhLnBvcCgpOyBiLnBvcCgpOyBjLnBvcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wKQorCisgICAgZGVmIHRlc3RfY29lcmNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoY29lcmNlKDEsIDEuMSksICgxLjAsIDEuMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZXJjZSgxLCAxTCksICgxTCwgMUwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoY29lcmNlKDFMLCAxLjEpLCAoMS4wLCAxLjEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2VyY2UpCisgICAgICAgIGNsYXNzIEJhZE51bWJlcjoKKyAgICAgICAgICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvZXJjZSwgNDIsIEJhZE51bWJlcigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBjb2VyY2UsIDAuNSwgaW50KCIxMjM0NSIgKiAxMDAwKSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGUoc2VsZik6CisgICAgICAgIGNvbXBpbGUoJ3ByaW50IDFcbicsICcnLCAnZXhlYycpCisgICAgICAgIGJvbSA9ICdceGVmXHhiYlx4YmYnCisgICAgICAgIGNvbXBpbGUoYm9tICsgJ3ByaW50IDFcbicsICcnLCAnZXhlYycpCisgICAgICAgIGNvbXBpbGUoc291cmNlPSdwYXNzJywgZmlsZW5hbWU9Jz8nLCBtb2RlPSdleGVjJykKKyAgICAgICAgY29tcGlsZShkb250X2luaGVyaXQ9MCwgZmlsZW5hbWU9J3RtcCcsIHNvdXJjZT0nMCcsIG1vZGU9J2V2YWwnKQorICAgICAgICBjb21waWxlKCdwYXNzJywgJz8nLCBkb250X2luaGVyaXQ9MSwgbW9kZT0nZXhlYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGlsZSwgJ3ByaW50IDQyXG4nLCAnPHN0cmluZz4nLCAnYmFkbW9kZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBpbGUsICdwcmludCA0MlxuJywgJzxzdHJpbmc+JywgJ3NpbmdsZScsIDB4ZmYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGlsZSwgY2hyKDApLCAnZicsICdleGVjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21waWxlLCAncGFzcycsICc/JywgJ2V4ZWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlPSdldmFsJywgc291cmNlPScwJywgZmlsZW5hbWU9J3RtcCcpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIGNvbXBpbGUodW5pY29kZSgncHJpbnQgdSJceGMzXHhhNSJcbicsICd1dGY4JyksICcnLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBpbGUsIHVuaWNocigwKSwgJ2YnLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21waWxlLCB1bmljb2RlKCdhID0gMScpLCAnZicsICdiYWQnKQorCisKKyAgICBkZWYgdGVzdF9kZWxhdHRyKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHN5cy5zcGFtID0gMQorICAgICAgICBkZWxhdHRyKHN5cywgJ3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGF0dHIpCisKKyAgICBkZWYgdGVzdF9kaXIoc2VsZik6CisgICAgICAgICMgZGlyKHdyb25nIG51bWJlciBvZiBhcmd1bWVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGlyLCA0MiwgNDIpCisKKyAgICAgICAgIyBkaXIoKSAtIGxvY2FsIHNjb3BlCisgICAgICAgIGxvY2FsX3ZhciA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbG9jYWxfdmFyJywgZGlyKCkpCisKKyAgICAgICAgIyBkaXIobW9kdWxlKQorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2V4aXQnLCBkaXIoc3lzKSkKKworICAgICAgICAjIGRpcihtb2R1bGVfd2l0aF9pbnZhbGlkX19kaWN0X18pCisgICAgICAgIGltcG9ydCB0eXBlcworICAgICAgICBjbGFzcyBGb28odHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICBfX2RpY3RfXyA9IDgKKyAgICAgICAgZiA9IEZvbygiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkaXIsIGYpCisKKyAgICAgICAgIyBkaXIodHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigic3RyaXAiLCBkaXIoc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiX19tcm9fXyIsIGRpcihzdHIpKQorCisgICAgICAgICMgZGlyKG9iaikKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi54ID0gNworICAgICAgICAgICAgICAgIHNlbGYueSA9IDgKKyAgICAgICAgICAgICAgICBzZWxmLnogPSA5CisgICAgICAgIGYgPSBGb28oKQorICAgICAgICBzZWxmLmFzc2VydEluKCJ5IiwgZGlyKGYpKQorCisgICAgICAgICMgZGlyKG9ial9ub19fZGljdF9fKQorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCisgICAgICAgIGYgPSBGb28oKQorICAgICAgICBzZWxmLmFzc2VydEluKCJfX3JlcHJfXyIsIGRpcihmKSkKKworICAgICAgICAjIGRpcihvYmpfbm9fX2NsYXNzX193aXRoX19kaWN0X18pCisgICAgICAgICMgKGFuIHVnbHkgdHJpY2sgdG8gY2F1c2UgZ2V0YXR0cihmLCAiX19jbGFzc19fIikgdG8gZmFpbCkKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fY2xhc3NfXyIsICJfX2RpY3RfXyJdCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5iYXIgPSAid293IgorICAgICAgICBmID0gRm9vKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiX19yZXByX18iLCBkaXIoZikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImJhciIsIGRpcihmKSkKKworICAgICAgICAjIGRpcihvYmpfdXNpbmcgX19kaXJfXykKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19kaXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gWyJrYW4iLCAiZ2EiLCAicm9vIl0KKyAgICAgICAgZiA9IEZvbygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaXIoZikgPT0gWyJnYSIsICJrYW4iLCAicm9vIl0pCisKKyAgICAgICAgIyBkaXIob2JqX19kaXJfX25vdF9saXN0KQorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Rpcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA3CisgICAgICAgIGYgPSBGb28oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpciwgZikKKworICAgIGRlZiB0ZXN0X2Rpdm1vZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoMTIsIDcpLCAoMSwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC0xMiwgNyksICgtMiwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKDEyLCAtNyksICgtMiwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZCgtMTIsIC03KSwgKDEsIC01KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZCgxMkwsIDdMKSwgKDFMLCA1TCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC0xMkwsIDdMKSwgKC0yTCwgMkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZCgxMkwsIC03TCksICgtMkwsIC0yTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC0xMkwsIC03TCksICgxTCwgLTVMKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZCgxMiwgN0wpLCAoMSwgNUwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZCgtMTIsIDdMKSwgKC0yLCAyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKDEyTCwgLTcpLCAoLTJMLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC0xMkwsIC03KSwgKDFMLCAtNSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZtb2QoLXN5cy5tYXhpbnQtMSwgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChzeXMubWF4aW50KzEsIDApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChkaXZtb2QoMy4yNSwgMS4wKSwgKDMuMCwgMC4yNSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoZGl2bW9kKC0zLjI1LCAxLjApLCAoLTQuMCwgMC43NSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoZGl2bW9kKDMuMjUsIC0xLjApLCAoLTQuMCwgLTAuNzUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmY21wKGRpdm1vZCgtMy4yNSwgLTEuMCksICgzLjAsIC0wLjI1KSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkaXZtb2QpCisKKyAgICBkZWYgdGVzdF9ldmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJzErMScpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJyAxKzFcbicpLCAyKQorICAgICAgICBnbG9iYWxzID0geydhJzogMSwgJ2InOiAyfQorICAgICAgICBsb2NhbHMgPSB7J2InOiAyMDAsICdjJzogMzAwfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ2EnLCBnbG9iYWxzKSAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYScsIGdsb2JhbHMsIGxvY2FscyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYicsIGdsb2JhbHMsIGxvY2FscyksIDIwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdjJywgZ2xvYmFscywgbG9jYWxzKSwgMzAwKQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwodW5pY29kZSgnMSsxJykpLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHVuaWNvZGUoJyAxKzFcbicpKSwgMikKKyAgICAgICAgZ2xvYmFscyA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgbG9jYWxzID0geydiJzogMjAwLCAnYyc6IDMwMH0KKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHVuaWNvZGUoJ2EnKSwgZ2xvYmFscyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwodW5pY29kZSgnYScpLCBnbG9iYWxzLCBsb2NhbHMpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHVuaWNvZGUoJ2InKSwgZ2xvYmFscywgbG9jYWxzKSwgMjAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHVuaWNvZGUoJ2MnKSwgZ2xvYmFscywgbG9jYWxzKSwgMzAwKQorICAgICAgICAgICAgYm9tID0gJ1x4ZWZceGJiXHhiZicKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChib20gKyAnYScsIGdsb2JhbHMsIGxvY2FscyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwodW5pY29kZSgndSJceGMzXHhhNSInLCAndXRmOCcpLCBnbG9iYWxzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSgnXHhjM1x4YTUnLCAndXRmOCcpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwgKCkpCisKKyAgICBkZWYgdGVzdF9nZW5lcmFsX2V2YWwoc2VsZik6CisgICAgICAgICMgVGVzdHMgdGhhdCBnZW5lcmFsIG1hcHBpbmdzIGNhbiBiZSB1c2VkIGZvciB0aGUgbG9jYWxzIGFyZ3VtZW50CisKKyAgICAgICAgY2xhc3MgTToKKyAgICAgICAgICAgICJUZXN0IG1hcHBpbmcgaW50ZXJmYWNlIHZlcnN1cyBwb3NzaWJsZSBjYWxscyBmcm9tIGV2YWwoKS4iCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2EnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTIKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QoJ3h5eicpCisKKyAgICAgICAgbSA9IE0oKQorICAgICAgICBnID0gZ2xvYmFscygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYScsIGcsIG0pLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yLCBldmFsLCAnYicsIGcsIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnZGlyKCknLCBnLCBtKSwgbGlzdCgneHl6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnZ2xvYmFscygpJywgZywgbSksIGcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnbG9jYWxzKCknLCBnLCBtKSwgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAnYScsIG0pCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICAiTm9uLW1hcHBpbmciCisgICAgICAgICAgICBwYXNzCisgICAgICAgIG0gPSBBKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAnYScsIGcsIG0pCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBkaWN0IHN1YmNsYXNzZXMgd29yayBhcyB3ZWxsCisgICAgICAgIGNsYXNzIEQoZGljdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2EnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTIKKyAgICAgICAgICAgICAgICByZXR1cm4gZGljdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCisgICAgICAgICAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdCgneHl6JykKKworICAgICAgICBkID0gRCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnYScsIGcsIGQpLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yLCBldmFsLCAnYicsIGcsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnZGlyKCknLCBnLCBkKSwgbGlzdCgneHl6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnZ2xvYmFscygpJywgZywgZCksIGcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnbG9jYWxzKCknLCBnLCBkKSwgZCkKKworICAgICAgICAjIFZlcmlmeSBsb2NhbHMgc3RvcmVzICh1c2VkIGJ5IGxpc3QgY29tcHMpCisgICAgICAgIGV2YWwoJ1tsb2NhbHMoKSBmb3IgaSBpbiAoMiwzKV0nLCBnLCBkKQorICAgICAgICBldmFsKCdbbG9jYWxzKCkgZm9yIGkgaW4gKDIsMyldJywgZywgVXNlckRpY3QuVXNlckRpY3QoKSkKKworICAgICAgICBjbGFzcyBTcHJlYWRTaGVldDoKKyAgICAgICAgICAgICJTYW1wbGUgYXBwbGljYXRpb24gc2hvd2luZyBuZXN0ZWQsIGNhbGN1bGF0ZWQgbG9va3Vwcy4iCisgICAgICAgICAgICBfY2VsbHMgPSB7fQorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgZm9ybXVsYSk6CisgICAgICAgICAgICAgICAgc2VsZi5fY2VsbHNba2V5XSA9IGZvcm11bGEKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBldmFsKHNlbGYuX2NlbGxzW2tleV0sIGdsb2JhbHMoKSwgc2VsZikKKworICAgICAgICBzcyA9IFNwcmVhZFNoZWV0KCkKKyAgICAgICAgc3NbJ2ExJ10gPSAnNScKKyAgICAgICAgc3NbJ2EyJ10gPSAnYTEqNicKKyAgICAgICAgc3NbJ2EzJ10gPSAnYTIqNycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzc1snYTMnXSwgMjEwKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgZGlyKCkgY2F0Y2hlcyBhIG5vbi1saXN0IHJldHVybmVkIGJ5IGV2YWwKKyAgICAgICAgIyBTRiBidWcgIzEwMDQ2NjkKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihpdGVtKQorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdhJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdkaXIoKScsIGdsb2JhbHMoKSwgQygpKQorCisgICAgIyBEb25lIG91dHNpZGUgb2YgdGhlIG1ldGhvZCB0ZXN0X3ogdG8gZ2V0IHRoZSBjb3JyZWN0IHNjb3BlCisgICAgeiA9IDAKKyAgICBmID0gb3BlbihURVNURk4sICd3JykKKyAgICBmLndyaXRlKCd6ID0geisxXG4nKQorICAgIGYud3JpdGUoJ3ogPSB6KjJcbicpCisgICAgZi5jbG9zZSgpCisgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCgiZXhlY2ZpbGUuLiBub3Qgc3VwcG9ydGVkIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgZXhlY2ZpbGUoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZXhlY2ZpbGUoc2VsZik6CisgICAgICAgIGdsb2JhbCBudW1ydW5zCisgICAgICAgIGlmIG51bXJ1bnM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbnVtcnVucyArPSAxCisKKyAgICAgICAgZ2xvYmFscyA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgbG9jYWxzID0geydiJzogMjAwLCAnYyc6IDMwMH0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX19jbGFzc19fLnosIDIpCisgICAgICAgIGdsb2JhbHNbJ3onXSA9IDAKKyAgICAgICAgZXhlY2ZpbGUoVEVTVEZOLCBnbG9iYWxzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2JhbHNbJ3onXSwgMikKKyAgICAgICAgbG9jYWxzWyd6J10gPSAwCisgICAgICAgIGV4ZWNmaWxlKFRFU1RGTiwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2Fsc1sneiddLCAyKQorCisgICAgICAgIGNsYXNzIE06CisgICAgICAgICAgICAiVGVzdCBtYXBwaW5nIGludGVyZmFjZSB2ZXJzdXMgcG9zc2libGUgY2FsbHMgZnJvbSBleGVjZmlsZSgpLiIKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnogPSAxMAorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09ICd6JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuegorICAgICAgICAgICAgICAgIHJhaXNlIEtleUVycm9yCisgICAgICAgICAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09ICd6JzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi56ID0gdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKKworICAgICAgICBsb2NhbHMgPSBNKCkKKyAgICAgICAgbG9jYWxzWyd6J10gPSAwCisgICAgICAgIGV4ZWNmaWxlKFRFU1RGTiwgZ2xvYmFscywgbG9jYWxzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2Fsc1sneiddLCAyKQorCisgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXhlY2ZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXhlY2ZpbGUsIFRFU1RGTiwge30sICgpKQorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZXhlY2ZpbGUsIG9zLmN1cmRpcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZXhlY2ZpbGUsICJJX2RvbnRfZXhpc3QiKQorCisgICAgZGVmIHRlc3RfZmlsdGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihsYW1iZGEgYzogJ2EnIDw9IGMgPD0gJ3onLCAnSGVsbG8gV29ybGQnKSwgJ2VsbG9vcmxkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIoTm9uZSwgWzEsICdoZWxsbycsIFtdLCBbM10sICcnLCBOb25lLCA5LCAwXSksIFsxLCAnaGVsbG8nLCBbM10sIDldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihsYW1iZGEgeDogeCA+IDAsIFsxLCAtMywgOSwgMCwgMl0pLCBbMSwgOSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKE5vbmUsIFNxdWFyZXMoMTApKSwgWzEsIDQsIDksIDE2LCAyNSwgMzYsIDQ5LCA2NCwgODFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihsYW1iZGEgeDogeCUyLCBTcXVhcmVzKDEwKSksIFsxLCA5LCAyNSwgNDksIDgxXSkKKyAgICAgICAgZGVmIGlkZW50aXR5KGl0ZW0pOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgZmlsdGVyKGlkZW50aXR5LCBTcXVhcmVzKDUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZpbHRlcikKKyAgICAgICAgY2xhc3MgQmFkU2VxKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIGlmIGluZGV4PDQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmlsdGVyLCBsYW1iZGEgeDogeCwgQmFkU2VxKCkpCisgICAgICAgIGRlZiBiYWRmdW5jKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyLCBiYWRmdW5jLCByYW5nZSg1KSkKKworICAgICAgICAjIHRlc3QgYmx0aW5tb2R1bGUuYzo6ZmlsdGVydHVwbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCAoMSwgMikpLCAoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiB4Pj0zLCAoMSwgMiwgMywgNCkpLCAoMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyLCA0MiwgKDEsIDIpKQorCisgICAgICAgICMgdGVzdCBibHRpbm1vZHVsZS5jOjpmaWx0ZXJzdHJpbmcoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCAiMTIiKSwgIjEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIobGFtYmRhIHg6IHg+PSIzIiwgIjEyMzQiKSwgIjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmaWx0ZXIsIDQyLCAiMTIiKQorICAgICAgICBjbGFzcyBiYWRzdHIoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmaWx0ZXIsIGxhbWJkYSB4OiB4ID49IjMiLCBiYWRzdHIoIjEyMzQiKSkKKworICAgICAgICBjbGFzcyBiYWRzdHIyKHN0cik6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZpbHRlciwgbGFtYmRhIHg6IHggPj00MiwgYmFkc3RyMigiMTIzNCIpKQorCisgICAgICAgIGNsYXNzIHdlaXJkc3RyKHN0cik6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiB3ZWlyZHN0cigyKnN0ci5fX2dldGl0ZW1fXyhzZWxmLCBpbmRleCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiB4Pj0iMzMiLCB3ZWlyZHN0cigiMTIzNCIpKSwgIjMzNDQiKQorCisgICAgICAgIGNsYXNzIHNoaWZ0c3RyKHN0cik6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiBjaHIob3JkKHN0ci5fX2dldGl0ZW1fXyhzZWxmLCBpbmRleCkpKzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiB4Pj0iMyIsIHNoaWZ0c3RyKCIxMjM0IikpLCAiMzQ1IikKKworICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICAjIHRlc3QgYmx0aW5tb2R1bGUuYzo6ZmlsdGVydW5pY29kZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCB1bmljb2RlKCIxMiIpKSwgdW5pY29kZSgiMTIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKGxhbWJkYSB4OiB4Pj0iMyIsIHVuaWNvZGUoIjEyMzQiKSksIHVuaWNvZGUoIjM0IikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZpbHRlciwgNDIsIHVuaWNvZGUoIjEyIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmaWx0ZXIsIGxhbWJkYSB4OiB4ID49IjMiLCBiYWRzdHIodW5pY29kZSgiMTIzNCIpKSkKKworICAgICAgICAgICAgY2xhc3MgYmFkdW5pY29kZSh1bmljb2RlKToKKyAgICAgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyLCBsYW1iZGEgeDogeCA+PTQyLCBiYWR1bmljb2RlKCIxMjM0IikpCisKKyAgICAgICAgICAgIGNsYXNzIHdlaXJkdW5pY29kZSh1bmljb2RlKToKKyAgICAgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2VpcmR1bmljb2RlKDIqdW5pY29kZS5fX2dldGl0ZW1fXyhzZWxmLCBpbmRleCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIGZpbHRlcihsYW1iZGEgeDogeD49dW5pY29kZSgiMzMiKSwgd2VpcmR1bmljb2RlKCIxMjM0IikpLCB1bmljb2RlKCIzMzQ0IikpCisKKyAgICAgICAgICAgIGNsYXNzIHNoaWZ0dW5pY29kZSh1bmljb2RlKToKKyAgICAgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5pY2hyKG9yZCh1bmljb2RlLl9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KSkrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgZmlsdGVyKGxhbWJkYSB4OiB4Pj11bmljb2RlKCIzIiksIHNoaWZ0dW5pY29kZSgiMTIzNCIpKSwKKyAgICAgICAgICAgICAgICB1bmljb2RlKCIzNDUiKQorICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZmlsdGVyX3N1YmNsYXNzZXMoc2VsZik6CisgICAgICAgICMgdGVzdCB0aGF0IGZpbHRlcigpIG5ldmVyIHJldHVybnMgdHVwbGUsIHN0ciBvciB1bmljb2RlIHN1YmNsYXNzZXMKKyAgICAgICAgIyBhbmQgdGhhdCB0aGUgcmVzdWx0IGFsd2F5cyBnb2VzIHRocm91Z2ggX19nZXRpdGVtX18KKyAgICAgICAgZnVuY3MgPSAoTm9uZSwgYm9vbCwgbGFtYmRhIHg6IFRydWUpCisgICAgICAgIGNsYXNzIHR1cGxlMih0dXBsZSk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiAyKnR1cGxlLl9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KQorICAgICAgICBjbGFzcyBzdHIyKHN0cik6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiAyKnN0ci5fX2dldGl0ZW1fXyhzZWxmLCBpbmRleCkKKyAgICAgICAgaW5wdXRzID0geworICAgICAgICAgICAgdHVwbGUyOiB7KCk6ICgpLCAoMSwgMiwgMyk6ICgyLCA0LCA2KX0sCisgICAgICAgICAgICBzdHIyOiAgIHsiIjogIiIsICIxMjMiOiAiMTEyMjMzIn0KKyAgICAgICAgfQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBjbGFzcyB1bmljb2RlMih1bmljb2RlKToKKyAgICAgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMip1bmljb2RlLl9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KQorICAgICAgICAgICAgaW5wdXRzW3VuaWNvZGUyXSA9IHsKKyAgICAgICAgICAgICAgICB1bmljb2RlKCk6IHVuaWNvZGUoKSwKKyAgICAgICAgICAgICAgICB1bmljb2RlKCIxMjMiKTogdW5pY29kZSgiMTEyMjMzIikKKyAgICAgICAgICAgIH0KKworICAgICAgICBmb3IgKGNscywgaW5wcykgaW4gaW5wdXRzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgZm9yIChpbnAsIGV4cCkgaW4gaW5wcy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgb3V0cHV0IGdvZXMgdGhyb3VnaCBfX2dldGl0ZW1fXworICAgICAgICAgICAgICAgICMgZXZlbiBpZiBmdW5jIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZnVuY3NbMF0sIGNscyhpbnApKSwKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGZ1bmNzWzFdLCBjbHMoaW5wKSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgZm9yIGZ1bmMgaW4gZnVuY3M6CisgICAgICAgICAgICAgICAgICAgIG91dHAgPSBmaWx0ZXIoZnVuYywgY2xzKGlucCkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cCwgZXhwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzaW5zdGFuY2Uob3V0cCwgY2xzKSkKKworICAgIGRlZiB0ZXN0X2dldGF0dHIoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdldGF0dHIoc3lzLCAnc3Rkb3V0JykgaXMgc3lzLnN0ZG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyLCBzeXMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXR0ciwgc3lzLCAxLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyKQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGdldGF0dHIsIHN5cywgdW5pY2hyKHN5cy5tYXh1bmljb2RlKSkKKworICAgIGRlZiB0ZXN0X2hhc2F0dHIoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc3lzLCAnc3Rkb3V0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzYXR0ciwgc3lzLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2F0dHIpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgaGFzYXR0ciwgc3lzLCB1bmljaHIoc3lzLm1heHVuaWNvZGUpKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBoYXNhdHRyIGFsbG93cyBTeXN0ZW1FeGl0IGFuZCBLZXlib2FyZEludGVycnVwdHMgYnkKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCB3aGF0KToKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlib2FyZEludGVycnVwdCwgaGFzYXR0ciwgQSgpLCAiYiIpCisgICAgICAgIGNsYXNzIEI6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgd2hhdCk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3lzdGVtRXhpdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0LCBoYXNhdHRyLCBCKCksICJiIikKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgIGhhc2goTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKDEpLCBoYXNoKDFMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKDEpLCBoYXNoKDEuMCkpCisgICAgICAgIGhhc2goJ3NwYW0nKQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goJ3NwYW0nKSwgaGFzaCh1bmljb2RlKCdzcGFtJykpKQorICAgICAgICBoYXNoKCgwLDEsMiwzKSkKKyAgICAgICAgZGVmIGYoKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIHt9KQorICAgICAgICAjIEJ1ZyAxNTM2MDIxOiBBbGxvdyBoYXNoIHRvIHJldHVybiBsb25nIG9iamVjdHMKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMioqMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShoYXNoKFgoKSkpLCBpbnQpCisgICAgICAgIGNsYXNzIFkob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMioqMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShoYXNoKFkoKSkpLCBpbnQpCisgICAgICAgIGNsYXNzIFoobG9uZyk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKFooNDIpKSwgaGFzaCg0MkwpKQorCisgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgxNiksICcweDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoMTZMKSwgJzB4MTBMJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoLTE2KSwgJy0weDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoLTE2TCksICctMHgxMEwnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhleCwge30pCisKKyAgICBkZWYgdGVzdF9pZChzZWxmKToKKyAgICAgICAgaWQoTm9uZSkKKyAgICAgICAgaWQoMSkKKyAgICAgICAgaWQoMUwpCisgICAgICAgIGlkKDEuMCkKKyAgICAgICAgaWQoJ3NwYW0nKQorICAgICAgICBpZCgoMCwxLDIsMykpCisgICAgICAgIGlkKFswLDEsMiwzXSkKKyAgICAgICAgaWQoeydzcGFtJzogMSwgJ2VnZ3MnOiAyLCAnaGFtJzogM30pCisKKyAgICAjIFRlc3QgaW5wdXQoKSBsYXRlciwgdG9nZXRoZXIgd2l0aCByYXdfaW5wdXQKKworICAgICMgdGVzdF9pbnQoKTogc2VlIHRlc3RfaW50LnB5IGZvciBpbnQoKSB0ZXN0cy4KKworICAgIGRlZiB0ZXN0X2ludGVybihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnRlcm4pCisgICAgICAgICMgVGhpcyBmYWlscyBpZiB0aGUgdGVzdCBpcyBydW4gdHdpY2Ugd2l0aCBhIGNvbnN0YW50IHN0cmluZywKKyAgICAgICAgIyB0aGVyZWZvcmUgYXBwZW5kIHRoZSBydW4gY291bnRlcgorICAgICAgICBzID0gIm5ldmVyIGludGVybmVkIGJlZm9yZSAiICsgc3RyKG51bXJ1bnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnRlcm4ocykgaXMgcykKKyAgICAgICAgczIgPSBzLnN3YXBjYXNlKCkuc3dhcGNhc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50ZXJuKHMyKSBpcyBzKQorCisgICAgICAgICMgU3ViY2xhc3NlcyBvZiBzdHJpbmcgY2FuJ3QgYmUgaW50ZXJuZWQsIGJlY2F1c2UgdGhleQorICAgICAgICAjIHByb3ZpZGUgdG9vIG11Y2ggb3Bwb3J0dW5pdHkgZm9yIGluc2FuZSB0aGluZ3MgdG8gaGFwcGVuLgorICAgICAgICAjIFdlIGRvbid0IHdhbnQgdGhlbSBpbiB0aGUgaW50ZXJuZWQgZGljdCBhbmQgaWYgdGhleSBhcmVuJ3QKKyAgICAgICAgIyBhY3R1YWxseSBpbnRlcm5lZCwgd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgdGhlIGFwcGVhcmFuY2UKKyAgICAgICAgIyB0aGF0IHRoZXkgYXJlIGJ5IGFsbG93aW5nIGludGVybigpIHRvIHN1Y2NlZWQuCisgICAgICAgIGNsYXNzIFMoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMTIzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnRlcm4sIFMoImFiYyIpKQorCisgICAgICAgICMgSXQncyBzdGlsbCBzYWZlIHRvIHBhc3MgdGhlc2Ugc3RyaW5ncyB0byByb3V0aW5lcyB0aGF0CisgICAgICAgICMgY2FsbCBpbnRlcm4gaW50ZXJuYWxseSwgZS5nLiBQeU9iamVjdF9TZXRBdHRyKCkuCisgICAgICAgIHMgPSBTKCJhYmMiKQorICAgICAgICBzZXRhdHRyKHMsIHMsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihzLCBzKSwgcykKKworICAgIGRlZiB0ZXN0X2l0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpdGVyLCA0MiwgNDIpCisgICAgICAgIGxpc3RzID0gWygiMSIsICIyIiksIFsiMSIsICIyIl0sICIxMiJdCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIGxpc3RzLmFwcGVuZCh1bmljb2RlKCIxMiIpKQorICAgICAgICBmb3IgbCBpbiBsaXN0czoKKyAgICAgICAgICAgIGkgPSBpdGVyKGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkubmV4dCgpLCAnMScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkubmV4dCgpLCAnMicpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBpLm5leHQpCisKKyAgICBkZWYgdGVzdF9pc2luc3RhbmNlKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBFOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjID0gQygpCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgZSA9IEUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjLCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZCwgQykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShlLCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc2luc3RhbmNlKGMsIEQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzaW5zdGFuY2UoJ2ZvbycsIEUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzaW5zdGFuY2UsIEUsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzaW5zdGFuY2UpCisKKyAgICBkZWYgdGVzdF9pc3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBFOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjID0gQygpCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgZSA9IEUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhELCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNzdWJjbGFzcyhDLCBEKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzLCAnZm9vJywgRSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzLCBFLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbignMTIzJyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKCgpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oKDEsIDIsIDMsIDQpKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oWzEsIDIsIDMsIDRdKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oe30pLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih7J2EnOjEsICdiJzogMn0pLCAyKQorICAgICAgICBjbGFzcyBCYWRTZXE6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxlbiwgQmFkU2VxKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCAyKQorICAgICAgICBjbGFzcyBDbGFzc2ljU3R5bGU6IHBhc3MKKyAgICAgICAgY2xhc3MgTmV3U3R5bGUob2JqZWN0KTogcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgbGVuLCBDbGFzc2ljU3R5bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsZW4sIE5ld1N0eWxlKCkpCisKKyAgICBkZWYgdGVzdF9tYXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAoTm9uZSwgJ2hlbGxvIHdvcmxkJyksCisgICAgICAgICAgICBbJ2gnLCdlJywnbCcsJ2wnLCdvJywnICcsJ3cnLCdvJywncicsJ2wnLCdkJ10KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbWFwKE5vbmUsICdhYmNkJywgJ2VmZycpLAorICAgICAgICAgICAgWygnYScsICdlJyksICgnYicsICdmJyksICgnYycsICdnJyksICgnZCcsIE5vbmUpXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAoTm9uZSwgcmFuZ2UoMTApKSwKKyAgICAgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAobGFtYmRhIHg6IHgqeCwgcmFuZ2UoMSw0KSksCisgICAgICAgICAgICBbMSwgNCwgOV0KKyAgICAgICAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIG1hdGggaW1wb3J0IHNxcnQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZGVmIHNxcnQoeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHBvdyh4LCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAobGFtYmRhIHg6IG1hcChzcXJ0LHgpLCBbWzE2LCA0XSwgWzgxLCA5XV0pLAorICAgICAgICAgICAgW1s0LjAsIDIuMF0sIFs5LjAsIDMuMF1dCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChsYW1iZGEgeCwgeTogeCt5LCBbMSwzLDJdLCBbOSwxLDRdKSwKKyAgICAgICAgICAgIFsxMCwgNCwgNl0KKyAgICAgICAgKQorCisgICAgICAgIGRlZiBwbHVzKCp2KToKKyAgICAgICAgICAgIGFjY3UgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiB2OiBhY2N1ID0gYWNjdSArIGkKKyAgICAgICAgICAgIHJldHVybiBhY2N1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAocGx1cywgWzEsIDMsIDddKSwKKyAgICAgICAgICAgIFsxLCAzLCA3XQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAocGx1cywgWzEsIDMsIDddLCBbNCwgOSwgMl0pLAorICAgICAgICAgICAgWzErNCwgMys5LCA3KzJdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChwbHVzLCBbMSwgMywgN10sIFs0LCA5LCAyXSwgWzEsIDEsIDBdKSwKKyAgICAgICAgICAgIFsxKzQrMSwgMys5KzEsIDcrMiswXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAoTm9uZSwgU3F1YXJlcygxMCkpLAorICAgICAgICAgICAgWzAsIDEsIDQsIDksIDE2LCAyNSwgMzYsIDQ5LCA2NCwgODFdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1hcChpbnQsIFNxdWFyZXMoMTApKSwKKyAgICAgICAgICAgIFswLCAxLCA0LCA5LCAxNiwgMjUsIDM2LCA0OSwgNjQsIDgxXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBtYXAoTm9uZSwgU3F1YXJlcygzKSwgU3F1YXJlcygyKSksCisgICAgICAgICAgICBbKDAsMCksICgxLDEpLCAoNCxOb25lKV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbWFwKG1heCwgU3F1YXJlcygzKSwgU3F1YXJlcygyKSksCisgICAgICAgICAgICBbMCwgMSwgNF0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXAsIGxhbWJkYSB4OiB4LCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAoTm9uZSwgWzQyXSksIFs0Ml0pCisgICAgICAgIGNsYXNzIEJhZFNlcToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXAsIGxhbWJkYSB4OiB4LCBCYWRTZXEoKSkKKyAgICAgICAgZGVmIGJhZGZ1bmMoeCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBtYXAsIGJhZGZ1bmMsIHJhbmdlKDUpKQorCisgICAgZGVmIHRlc3RfbWF4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heCgnMTIzMTIzJyksICczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoMSwgMiwgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KCgxLCAyLCAzLCAxLCAyLCAzKSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KFsxLCAyLCAzLCAxLCAyLCAzXSksIDMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoMSwgMkwsIDMuMCksIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoMUwsIDIuMCwgMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KDEuMCwgMiwgM0wpLCAzTCkKKworICAgICAgICBmb3Igc3RtdCBpbiAoCisgICAgICAgICAgICAibWF4KGtleT1pbnQpIiwgICAgICAgICAgICAgICAgICMgbm8gYXJncworICAgICAgICAgICAgIm1heCgxLCBrZXk9aW50KSIsICAgICAgICAgICAgICAjIHNpbmdsZSBhcmcgbm90IGl0ZXJhYmxlCisgICAgICAgICAgICAibWF4KDEsIDIsIGtleXN0b25lPWludCkiLCAgICAgICMgd3Jvbmcga2V5d29yZAorICAgICAgICAgICAgIm1heCgxLCAyLCBrZXk9aW50LCBhYmM9aW50KSIsICAjIHR3byBtYW55IGtleXdvcmRzCisgICAgICAgICAgICAibWF4KDEsIDIsIGtleT0xKSIsICAgICAgICAgICAgICMga2V5ZnVuYyBpcyBub3QgY2FsbGFibGUKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhlYyhzdG10KSBpbiBnbG9iYWxzKCkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoc3RtdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heCgoMSwpLCBrZXk9bmVnKSwgMSkgICAgICMgb25lIGVsZW0gaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoKDEsMiksIGtleT1uZWcpLCAxKSAgICAjIHR3byBlbGVtIGl0ZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KDEsIDIsIGtleT1uZWcpLCAxKSAgICAgIyB0d28gZWxlbXMKKworICAgICAgICBkYXRhID0gW3JhbmRvbS5yYW5kcmFuZ2UoMjAwKSBmb3IgaSBpbiByYW5nZSgxMDApXQorICAgICAgICBrZXlzID0gZGljdCgoZWxlbSwgcmFuZG9tLnJhbmRyYW5nZSg1MCkpIGZvciBlbGVtIGluIGRhdGEpCisgICAgICAgIGYgPSBrZXlzLl9fZ2V0aXRlbV9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KGRhdGEsIGtleT1mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0ZWQocmV2ZXJzZWQoZGF0YSksIGtleT1mKVstMV0pCisKKyAgICBkZWYgdGVzdF9taW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKCcxMjMxMjMnKSwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbigxLCAyLCAzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oKDEsIDIsIDMsIDEsIDIsIDMpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oWzEsIDIsIDMsIDEsIDIsIDNdKSwgMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbigxLCAyTCwgMy4wKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oMUwsIDIuMCwgMyksIDFMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbigxLjAsIDIsIDNMKSwgMS4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWluKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1pbiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1pbiwgKCkpCisgICAgICAgIGNsYXNzIEJhZFNlcToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtaW4sIEJhZFNlcSgpKQorICAgICAgICBjbGFzcyBCYWROdW1iZXI6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtaW4sICg0MiwgQmFkTnVtYmVyKCkpKQorCisgICAgICAgIGZvciBzdG10IGluICgKKyAgICAgICAgICAgICJtaW4oa2V5PWludCkiLCAgICAgICAgICAgICAgICAgIyBubyBhcmdzCisgICAgICAgICAgICAibWluKDEsIGtleT1pbnQpIiwgICAgICAgICAgICAgICMgc2luZ2xlIGFyZyBub3QgaXRlcmFibGUKKyAgICAgICAgICAgICJtaW4oMSwgMiwga2V5c3RvbmU9aW50KSIsICAgICAgIyB3cm9uZyBrZXl3b3JkCisgICAgICAgICAgICAibWluKDEsIDIsIGtleT1pbnQsIGFiYz1pbnQpIiwgICMgdHdvIG1hbnkga2V5d29yZHMKKyAgICAgICAgICAgICJtaW4oMSwgMiwga2V5PTEpIiwgICAgICAgICAgICAgIyBrZXlmdW5jIGlzIG5vdCBjYWxsYWJsZQorICAgICAgICAgICAgKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBleGVjKHN0bXQpIGluIGdsb2JhbHMoKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbChzdG10KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWluKCgxLCksIGtleT1uZWcpLCAxKSAgICAgIyBvbmUgZWxlbSBpdGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbigoMSwyKSwga2V5PW5lZyksIDIpICAgICMgdHdvIGVsZW0gaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oMSwgMiwga2V5PW5lZyksIDIpICAgICAjIHR3byBlbGVtcworCisgICAgICAgIGRhdGEgPSBbcmFuZG9tLnJhbmRyYW5nZSgyMDApIGZvciBpIGluIHJhbmdlKDEwMCldCisgICAgICAgIGtleXMgPSBkaWN0KChlbGVtLCByYW5kb20ucmFuZHJhbmdlKDUwKSkgZm9yIGVsZW0gaW4gZGF0YSkKKyAgICAgICAgZiA9IGtleXMuX19nZXRpdGVtX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oZGF0YSwga2V5PWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChkYXRhLCBrZXk9ZilbMF0pCisKKyAgICBkZWYgdGVzdF9uZXh0KHNlbGYpOgorICAgICAgICBpdCA9IGl0ZXIocmFuZ2UoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIG5leHQsIGl0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBuZXh0LCBpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0LCA0MiksIDQyKQorCisgICAgICAgIGNsYXNzIEl0ZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgICAgIGl0ID0gaXRlcihJdGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdCwgNDIpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbmV4dCwgaXQpCisKKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaXQgPSBnZW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXQpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBuZXh0LCBpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0LCA0MiksIDQyKQorCisgICAgZGVmIHRlc3Rfb2N0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgxMDApLCAnMDE0NCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2N0KDEwMEwpLCAnMDE0NEwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgtMTAwKSwgJy0wMTQ0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvY3QoLTEwMEwpLCAnLTAxNDRMJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvY3QsICgpKQorCisgICAgZGVmIHdyaXRlX3Rlc3RmaWxlKHNlbGYpOgorICAgICAgICAjIE5CIHRoZSBmaXJzdCA0IGxpbmVzIGFyZSBhbHNvIHVzZWQgdG8gdGVzdCBpbnB1dCBhbmQgcmF3X2lucHV0LCBiZWxvdworICAgICAgICBmcCA9IG9wZW4oVEVTVEZOLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwLndyaXRlKCcxKzFcbicpCisgICAgICAgICAgICBmcC53cml0ZSgnMSsxXG4nKQorICAgICAgICAgICAgZnAud3JpdGUoJ1RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cnKQorICAgICAgICAgICAgZnAud3JpdGUoJy5cbicpCisgICAgICAgICAgICBmcC53cml0ZSgnRGVhciBKb2huXG4nKQorICAgICAgICAgICAgZnAud3JpdGUoJ1hYWCcqMTAwKQorICAgICAgICAgICAgZnAud3JpdGUoJ1lZWScqMTAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZV90ZXN0ZmlsZSgpCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICdyJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSg0KSwgJzErMVxuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoNCksICcxKzFcbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKCksICdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLlxuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoNCksICdEZWFyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoMTAwKSwgJyBKb2huXG4nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkKDMwMCksICdYWFgnKjEwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZCgxMDAwKSwgJ1lZWScqMTAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIHRlc3Rfb3JkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZCgnICcpLCAzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmQoJ0EnKSwgNjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkKCdhJyksIDk3KQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZCh1bmljaHIoc3lzLm1heHVuaWNvZGUpKSwgc3lzLm1heHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3JkLCA0MikKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcmQsIHVuaWNvZGUoIjEyIikpCisKKyAgICBkZWYgdGVzdF9wb3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDAsMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDAsMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDEsMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDEsMSksIDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMiwwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMiwxMCksIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDIsMjApLCAxMDI0KjEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDIsMzApLCAxMDI0KjEwMjQqMTAyNCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMiwwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coLTIsMSksIC0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMiwyKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coLTIsMyksIC04KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDBMLDApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygwTCwxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coMUwsMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDFMLDEpLCAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDJMLDApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygyTCwxMCksIDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDJMLDIwKSwgMTAyNCoxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygyTCwzMCksIDEwMjQqMTAyNCoxMDI0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KC0yTCwwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coLTJMLDEpLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coLTJMLDIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMkwsMyksIC04KQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDAuLDApLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMC4sMSksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygxLiwwKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDEuLDEpLCAxLikKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygyLiwwKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDIuLDEwKSwgMTAyNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDIuLDIwKSwgMTAyNC4qMTAyNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KDIuLDMwKSwgMTAyNC4qMTAyNC4qMTAyNC4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coLTIuLDApLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coLTIuLDEpLCAtMi4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KC0yLiwyKSwgNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocG93KC0yLiwzKSwgLTguKQorCisgICAgICAgIGZvciB4IGluIDIsIDJMLCAyLjA6CisgICAgICAgICAgICBmb3IgeSBpbiAxMCwgMTBMLCAxMC4wOgorICAgICAgICAgICAgICAgIGZvciB6IGluIDEwMDAsIDEwMDBMLCAxMDAwLjA6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoeCwgZmxvYXQpIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZSh5LCBmbG9hdCkgb3IgXAorICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKHosIGZsb2F0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG93LCB4LCB5LCB6KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coeCwgeSwgeiksIDI0LjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3csIC0xLCAtMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93LCAxLCAyLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvdywgLTFMLCAtMkwsIDNMKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3csIDFMLCAyTCwgMEwpCisgICAgICAgICMgV2lsbCByZXR1cm4gY29tcGxleCBpbiAzLjA6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvdywgLTM0Mi40MywgMC4yMzQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3cpCisKKyAgICBkZWYgdGVzdF9yYW5nZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSgzKSwgWzAsIDEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKDEsIDUpLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoMCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKC0zKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoMSwgMTAsIDMpLCBbMSwgNCwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoNSwgLTUsIC0zKSwgWzUsIDIsIC0xLCAtNF0pCisKKyAgICAgICAgIyBOb3cgdGVzdCByYW5nZSgpIHdpdGggbG9uZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSgtMioqMTAwKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoMCwgLTIqKjEwMCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKDAsIDIqKjEwMCwgLTEpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZSgwLCAyKioxMDAsIC0xKSwgW10pCisKKyAgICAgICAgYSA9IGxvbmcoMTAgKiBzeXMubWF4aW50KQorICAgICAgICBiID0gbG9uZygxMDAgKiBzeXMubWF4aW50KQorICAgICAgICBjID0gbG9uZyg1MCAqIHN5cy5tYXhpbnQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZShhLCBhKzIpLCBbYSwgYSsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZShhKzIsIGEsIC0xTCksIFthKzIsIGErMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoYSs0LCBhLCAtMiksIFthKzQsIGErMl0pCisKKyAgICAgICAgc2VxID0gcmFuZ2UoYSwgYiwgYykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihhLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYiwgc2VxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXEpLCAyKQorCisgICAgICAgIHNlcSA9IHJhbmdlKGIsIGEsIC1jKQorICAgICAgICBzZWxmLmFzc2VydEluKGIsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihhLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCisKKyAgICAgICAgc2VxID0gcmFuZ2UoLWEsIC1iLCAtYykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigtYSwgc2VxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKC1iLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcmFuZ2UsIDEsIDIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJhbmdlLCBhLCBhICsgMSwgbG9uZygwKSkKKworICAgICAgICBjbGFzcyBiYWR6ZXJvKGludCk6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBJbnZhbGlkIGNtcCBtYWtlcyB0aGlzIHVuaGFzaGFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCByYW5nZSwgYSwgYSArIDEsIGJhZHplcm8oMSkpCisKKyAgICAgICAgIyBSZWplY3QgZmxvYXRzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAxLiwgMS4sIDEuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAxZTEwMCwgMWUxMDEsIDFlMTAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAsICJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgNDIsICJzcGFtIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByYW5nZSwgLXN5cy5tYXhpbnQsIHN5cy5tYXhpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJhbmdlLCAwLCAyKnN5cy5tYXhpbnQpCisKKyAgICAgICAgYmlnbnVtID0gMipzeXMubWF4aW50CisgICAgICAgIHNtYWxsbnVtID0gNDIKKyAgICAgICAgIyBPbGQtc3R5bGUgdXNlci1kZWZpbmVkIGNsYXNzIHdpdGggX19pbnRfXyBtZXRob2QKKyAgICAgICAgY2xhc3MgSTA6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbik6CisgICAgICAgICAgICAgICAgc2VsZi5uID0gaW50KG4pCisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoSTAoYmlnbnVtKSwgSTAoYmlnbnVtICsgMSkpLCBbYmlnbnVtXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZShJMChzbWFsbG51bSksIEkwKHNtYWxsbnVtICsgMSkpLCBbc21hbGxudW1dKQorCisgICAgICAgICMgTmV3LXN0eWxlIHVzZXItZGVmaW5lZCBjbGFzcyB3aXRoIF9faW50X18gbWV0aG9kCisgICAgICAgIGNsYXNzIEkxKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbik6CisgICAgICAgICAgICAgICAgc2VsZi5uID0gaW50KG4pCisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoSTEoYmlnbnVtKSwgSTEoYmlnbnVtICsgMSkpLCBbYmlnbnVtXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYW5nZShJMShzbWFsbG51bSksIEkxKHNtYWxsbnVtICsgMSkpLCBbc21hbGxudW1dKQorCisgICAgICAgICMgTmV3LXN0eWxlIHVzZXItZGVmaW5lZCBjbGFzcyB3aXRoIGZhaWxpbmcgX19pbnRfXyBtZXRob2QKKyAgICAgICAgY2xhc3MgSVgob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHJhbmdlLCBJWCgpKQorCisgICAgICAgICMgTmV3LXN0eWxlIHVzZXItZGVmaW5lZCBjbGFzcyB3aXRoIGludmFsaWQgX19pbnRfXyBtZXRob2QKKyAgICAgICAgY2xhc3MgSU4ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAibm90IGEgbnVtYmVyIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCBJTigpKQorCisgICAgICAgICMgRXhlcmNpc2UgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgYmFkIGFyZ3VtZW50cywgdG8gY2hlY2sKKyAgICAgICAgIyByZWZjb3VudGluZyBsb2dpYworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLjAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAuMCwgMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAsIDAsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMCwgMC4wLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLCAwLjAsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMC4wLCAwLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJhbmdlLCAwLjAsIDAsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSwgMC4wLCAwLjAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmFuZ2UsIDAuMCwgMC4wLCAxLjApCisKKworCisgICAgZGVmIHRlc3RfaW5wdXRfYW5kX3Jhd19pbnB1dChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZV90ZXN0ZmlsZSgpCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICdyJykKKyAgICAgICAgc2F2ZXN0ZGluID0gc3lzLnN0ZGluCisgICAgICAgIHNhdmVzdGRvdXQgPSBzeXMuc3Rkb3V0ICMgRWF0cyB0aGUgZWNobworICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3RkaW4gPSBmcAorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IEJpdEJ1Y2tldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlucHV0KCksIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlucHV0KCd0ZXN0aW5nXG4nKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3X2lucHV0KCksICdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nLicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd19pbnB1dCgndGVzdGluZ1xuJyksICdEZWFyIEpvaG4nKQorCisgICAgICAgICAgICAjIFNGIDE1MzUxNjU6IGRvbid0IHNlZ2ZhdWx0IG9uIGNsb3NlZCBzdGRpbgorICAgICAgICAgICAgIyBzeXMuc3Rkb3V0IG11c3QgYmUgYSByZWd1bGFyIGZpbGUgZm9yIHRyaWdnZXJpbmcKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3RkaW4uY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW5wdXQpCisKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBCaXRCdWNrZXQoKQorICAgICAgICAgICAgc3lzLnN0ZGluID0gY1N0cmluZ0lPLlN0cmluZ0lPKCJOVUxMXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnB1dCwgNDIsIDQyKQorICAgICAgICAgICAgc3lzLnN0ZGluID0gY1N0cmluZ0lPLlN0cmluZ0lPKCIgICAgJ3doaXRlc3BhY2UnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5wdXQoKSwgJ3doaXRlc3BhY2UnKQorICAgICAgICAgICAgc3lzLnN0ZGluID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBpbnB1dCkKKworICAgICAgICAgICAgIyBTRiA4NzYxNzg6IG1ha2Ugc3VyZSBpbnB1dCgpIHJlc3BlY3QgZnV0dXJlIG9wdGlvbnMuCisgICAgICAgICAgICBzeXMuc3RkaW4gPSBjU3RyaW5nSU8uU3RyaW5nSU8oJzEvMicpCisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIGV4ZWMgY29tcGlsZSgncHJpbnQgaW5wdXQoKScsICd0ZXN0X2J1aWx0aW5fdG1wJywgJ2V4ZWMnKQorICAgICAgICAgICAgc3lzLnN0ZGluLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIGV4ZWMgY29tcGlsZSgnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbjtwcmludCBpbnB1dCgpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9idWlsdGluX3RtcCcsICdleGVjJykKKyAgICAgICAgICAgIHN5cy5zdGRpbi5zZWVrKDAsIDApCisgICAgICAgICAgICBleGVjIGNvbXBpbGUoJ3ByaW50IGlucHV0KCknLCAndGVzdF9idWlsdGluX3RtcCcsICdleGVjJykKKyAgICAgICAgICAgICMgVGhlIHJlc3VsdCB3ZSBleHBlY3QgZGVwZW5kcyBvbiB3aGV0aGVyIG5ldyBkaXZpc2lvbiBzZW1hbnRpY3MKKyAgICAgICAgICAgICMgYXJlIGFscmVhZHkgaW4gZWZmZWN0LgorICAgICAgICAgICAgaWYgMS8yID09IDA6CisgICAgICAgICAgICAgICAgIyBUaGlzIHRlc3Qgd2FzIGNvbXBpbGVkIHdpdGggb2xkIHNlbWFudGljcy4KKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFsnMCcsICcwLjUnLCAnMCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVGhpcyB0ZXN0IHdhcyBjb21waWxlZCB3aXRoIG5ldyBzZW1hbnRpY3MgKGUuZy4sIC1RbmV3CisgICAgICAgICAgICAgICAgIyB3YXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFsnMC41JywgJzAuNScsICcwLjUnXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuc3Rkb3V0LmdldHZhbHVlKCkuc3BsaXRsaW5lcygpLCBleHBlY3RlZCkKKworICAgICAgICAgICAgZGVsIHN5cy5zdGRvdXQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgaW5wdXQsICdwcm9tcHQnKQorICAgICAgICAgICAgZGVsIHN5cy5zdGRpbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBpbnB1dCwgJ3Byb21wdCcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3RkaW4gPSBzYXZlc3RkaW4KKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlc3Rkb3V0CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfcmVkdWNlKHNlbGYpOgorICAgICAgICBhZGQgPSBsYW1iZGEgeCwgeTogeCt5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgWydhJywgJ2InLCAnYyddLCAnJyksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcmVkdWNlKGFkZCwgW1snYScsICdjJ10sIFtdLCBbJ2QnLCAndyddXSwgW10pLAorICAgICAgICAgICAgWydhJywnYycsJ2QnLCd3J10KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShsYW1iZGEgeCwgeTogeCp5LCByYW5nZSgyLDgpLCAxKSwgNTA0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJlZHVjZShsYW1iZGEgeCwgeTogeCp5LCByYW5nZSgyLDIxKSwgMUwpLAorICAgICAgICAgICAgMjQzMjkwMjAwODE3NjY0MDAwMEwKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNxdWFyZXMoMTApKSwgMjg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNxdWFyZXMoMTApLCAwKSwgMjg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNxdWFyZXMoMCksIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgNDIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgNDIsIDQyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIE5vbmUsIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgYWRkLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoNDIsICIxIiksICIxIikgIyBmdW5jIGlzIG5ldmVyIGNhbGxlZCB3aXRoIG9uZSBpdGVtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKDQyLCAiIiwgIjEiKSwgIjEiKSAjIGZ1bmMgaXMgbmV2ZXIgY2FsbGVkIHdpdGggb25lIGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIDQyLCAoNDIsIDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIGFkZCwgW10pICMgYXJnIDIgbXVzdCBub3QgYmUgZW1wdHkgc2VxdWVuY2Ugd2l0aCBubyBpbml0aWFsIHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCBhZGQsICIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgYWRkLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBbXSwgTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgW10sIDQyKSwgNDIpCisKKyAgICAgICAgY2xhc3MgQmFkU2VxOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlZHVjZSwgNDIsIEJhZFNlcSgpKQorCisgICAgZGVmIHRlc3RfcmVsb2FkKHNlbGYpOgorICAgICAgICBpbXBvcnQgbWFyc2hhbAorICAgICAgICByZWxvYWQobWFyc2hhbCkKKyAgICAgICAgaW1wb3J0IHN0cmluZworICAgICAgICByZWxvYWQoc3RyaW5nKQorICAgICAgICAjIyBpbXBvcnQgc3lzCisgICAgICAgICMjIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCByZWxvYWQsIHN5cykKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcignJyksICdcJ1wnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKDApLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigwTCksICcwTCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigoKSksICcoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihbXSksICdbXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih7fSksICd7fScpCisgICAgICAgIGEgPSBbXQorICAgICAgICBhLmFwcGVuZChhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYSksICdbWy4uLl1dJykKKyAgICAgICAgYSA9IHt9CisgICAgICAgIGFbMF0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgJ3swOiB7Li4ufX0nKQorCisgICAgZGVmIHRlc3Rfcm91bmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMC4wKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm91bmQoMC4wKSksIGZsb2F0KSAgIyBXaWxsIGJlIGludCBpbiAzLjAuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMS4wKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEwLjApLCAxMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEwMDAwMDAwMDAuMCksIDEwMDAwMDAwMDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxZTIwKSwgMWUyMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0xLjApLCAtMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0xMC4wKSwgLTEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTEwMDAwMDAwMDAuMCksIC0xMDAwMDAwMDAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTFlMjApLCAtMWUyMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDAuMSksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxLjEpLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMTAuMSksIDEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMTAwMDAwMDAwMC4xKSwgMTAwMDAwMDAwMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTEuMSksIC0xLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTEwLjEpLCAtMTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMTAwMDAwMDAwMC4xKSwgLTEwMDAwMDAwMDAuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDAuOSksIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg5LjkpLCAxMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDk5OTk5OTk5OS45KSwgMTAwMDAwMDAwMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTAuOSksIC0xLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTkuOSksIC0xMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC05OTk5OTk5OTkuOSksIC0xMDAwMDAwMDAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtOC4wLCAtMSksIC0xMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm91bmQoLTguMCwgLTEpKSwgZmxvYXQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvdW5kKC04LjAsIDApKSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyb3VuZCgtOC4wLCAxKSksIGZsb2F0KQorCisgICAgICAgICMgQ2hlY2sgaGFsZiByb3VuZGluZyBiZWhhdmlvdXIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNS41KSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg2LjUpLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC01LjUpLCAtNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtNi41KSwgLTcpCisKKyAgICAgICAgIyBDaGVjayBiZWhhdmlvciBvbiBpbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoOCksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTgpLCAtOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvdW5kKDApKSwgZmxvYXQpICAjIFdpbGwgYmUgaW50IGluIDMuMC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvdW5kKC04LCAtMSkpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJvdW5kKC04LCAwKSksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocm91bmQoLTgsIDEpKSwgZmxvYXQpCisKKyAgICAgICAgIyB0ZXN0IG5ldyBrd2FyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZChudW1iZXI9LTguMCwgbmRpZ2l0cz0tMSksIC0xMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQpCisKKyAgICAgICAgIyB0ZXN0IGdlbmVyaWMgcm91bmRpbmcgZGVsZWdhdGlvbiBmb3IgcmVhbHMKKyAgICAgICAgY2xhc3MgVGVzdFJvdW5kKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyMy4wCisKKyAgICAgICAgY2xhc3MgVGVzdE5vUm91bmQob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKFRlc3RSb3VuZCgpKSwgMjMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByb3VuZCwgMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByb3VuZCwgVGVzdE5vUm91bmQoKSkKKworICAgICAgICB0ID0gVGVzdE5vUm91bmQoKQorICAgICAgICB0Ll9fZmxvYXRfXyA9IGxhbWJkYSAqYXJnczogYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kLCB0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kLCB0LCAwKQorCisgICAgIyBTb21lIHZlcnNpb25zIG9mIGdsaWJjIGZvciBhbHBoYSBoYXZlIGEgYnVnIHRoYXQgYWZmZWN0cworICAgICMgZmxvYXQgLT4gaW50ZWdlciByb3VuZGluZyAoZmxvb3IsIGNlaWwsIHJpbnQsIHJvdW5kKSBmb3IKKyAgICAjIHZhbHVlcyBpbiB0aGUgcmFuZ2UgWzIqKjUyLCAyKio1MykuICBTZWU6CisgICAgIworICAgICMgICBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD01MzUwCisgICAgIworICAgICMgV2Ugc2tpcCB0aGlzIHRlc3Qgb24gTGludXgvYWxwaGEgaWYgaXQgd291bGQgZmFpbC4KKyAgICBsaW51eF9hbHBoYSA9IChwbGF0Zm9ybS5zeXN0ZW0oKS5zdGFydHN3aXRoKCdMaW51eCcpIGFuZAorICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtLm1hY2hpbmUoKS5zdGFydHN3aXRoKCdhbHBoYScpKQorICAgIHN5c3RlbV9yb3VuZF9idWcgPSByb3VuZCg1ZTE1KzEpICE9IDVlMTUrMQorICAgIEB1bml0dGVzdC5za2lwSWYobGludXhfYWxwaGEgYW5kIHN5c3RlbV9yb3VuZF9idWcsCisgICAgICAgICAgICAgICAgICAgICAidGVzdCB3aWxsIGZhaWw7ICBmYWlsdXJlIGlzIHByb2JhYmx5IGR1ZSB0byBhICIKKyAgICAgICAgICAgICAgICAgICAgICJidWdneSBzeXN0ZW0gcm91bmQgZnVuY3Rpb24iKQorICAgIGRlZiB0ZXN0X3JvdW5kX2xhcmdlKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxODY5OiBpbnRlZ3JhbCBmbG9hdHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1ZTE1LTEpLCA1ZTE1LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNWUxNSksIDVlMTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNWUxNSsxKSwgNWUxNSsxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDVlMTUrMiksIDVlMTUrMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1ZTE1KzMpLCA1ZTE1KzMpCisKKyAgICBkZWYgdGVzdF9zZXRhdHRyKHNlbGYpOgorICAgICAgICBzZXRhdHRyKHN5cywgJ3NwYW0nLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5zcGFtLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHN5cywgMSwgJ3NwYW0nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIpCisKKyAgICBkZWYgdGVzdF9zdW0oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKFtdKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0ocmFuZ2UoMiw4KSksIDI3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShpdGVyKHJhbmdlKDIsOCkpKSwgMjcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKFNxdWFyZXMoMTApKSwgMjg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShpdGVyKFNxdWFyZXMoMTApKSksIDI4NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oW1sxXSwgWzJdLCBbM11dLCBbXSksIFsxLCAyLCAzXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN1bSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdW0sIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN1bSwgWydhJywgJ2InLCAnYyddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN1bSwgWydhJywgJ2InLCAnYyddLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdW0sIFtbMV0sIFsyXSwgWzNdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdW0sIFt7MjozfV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VtLCBbezI6M31dKjIsIHsyOjN9KQorCisgICAgICAgIGNsYXNzIEJhZFNlcToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdW0sIEJhZFNlcSgpKQorCisgICAgICAgIGVtcHR5ID0gW10KKyAgICAgICAgc3VtKChbeF0gZm9yIHggaW4gcmFuZ2UoMTApKSwgZW1wdHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW1wdHksIFtdKQorCisgICAgZGVmIHRlc3RfdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKCcnKSwgIHR5cGUoJzEyMycpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHR5cGUoJycpLCB0eXBlKCgpKSkKKworICAgIGRlZiB0ZXN0X3VuaWNocihzZWxmKToKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljaHIoMzIpLCB1bmljb2RlKCcgJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNocig2NSksIHVuaWNvZGUoJ0EnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY2hyKDk3KSwgdW5pY29kZSgnYScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICB1bmljaHIoc3lzLm1heHVuaWNvZGUpLAorICAgICAgICAgICAgICAgIHVuaWNvZGUoJ1xcVSUwOHgnICUgKHN5cy5tYXh1bmljb2RlKSwgJ3VuaWNvZGUtZXNjYXBlJykKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVuaWNociwgc3lzLm1heHVuaWNvZGUrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdW5pY2hyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpLCB1bmljaHIsIDIqKjMyKQorCisgICAgIyBXZSBkb24ndCB3YW50IHNlbGYgaW4gdmFycygpLCBzbyB0aGVzZSBhcmUgc3RhdGljIG1ldGhvZHMKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZ2V0X3ZhcnNfZjAoKToKKyAgICAgICAgcmV0dXJuIHZhcnMoKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBnZXRfdmFyc19mMigpOgorICAgICAgICBCdWlsdGluVGVzdC5nZXRfdmFyc19mMCgpCisgICAgICAgIGEgPSAxCisgICAgICAgIGIgPSAyCisgICAgICAgIHJldHVybiB2YXJzKCkKKworICAgIGNsYXNzIENfZ2V0X3ZhcnMob2JqZWN0KToKKyAgICAgICAgZGVmIGdldERpY3Qoc2VsZik6CisgICAgICAgICAgICByZXR1cm4geydhJzoyfQorICAgICAgICBfX2RpY3RfXyA9IHByb3BlcnR5KGZnZXQ9Z2V0RGljdCkKKworICAgIGRlZiB0ZXN0X3ZhcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHZhcnMoKSksIHNldChkaXIoKSkpCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQodmFycyhzeXMpKSwgc2V0KGRpcihzeXMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF92YXJzX2YwKCksIHt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X3ZhcnNfZjIoKSwgeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB2YXJzLCA0MiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdmFycywgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFycyhzZWxmLkNfZ2V0X3ZhcnMoKSksIHsnYSc6Mn0pCisKKyAgICBkZWYgdGVzdF96aXAoc2VsZik6CisgICAgICAgIGEgPSAoMSwgMiwgMykKKyAgICAgICAgYiA9ICg0LCA1LCA2KQorICAgICAgICB0ID0gWygxLCA0KSwgKDIsIDUpLCAoMywgNildCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKGEsIGIpLCB0KQorICAgICAgICBiID0gWzQsIDUsIDZdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKGEsIGIpLCB0KQorICAgICAgICBiID0gKDQsIDUsIDYsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKGEsIGIpLCB0KQorICAgICAgICBjbGFzcyBJOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIGkgPCAwIG9yIGkgPiAyOiByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgcmV0dXJuIGkgKyA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKGEsIEkoKSksIHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgqW10pLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6aXAsIE5vbmUpCisgICAgICAgIGNsYXNzIEc6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgemlwLCBhLCBHKCkpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgemlwIGRvZXNuJ3QgdHJ5IHRvIGFsbG9jYXRlIGEgYmlsbGlvbiBlbGVtZW50cyBmb3IgdGhlCisgICAgICAgICMgcmVzdWx0IGxpc3Qgd2hlbiBvbmUgb2YgaXRzIGFyZ3VtZW50cyBkb2Vzbid0IHNheSBob3cgbG9uZyBpdCBpcy4KKyAgICAgICAgIyBBIE1lbW9yeUVycm9yIGlzIHRoZSBtb3N0IGxpa2VseSBmYWlsdXJlIG1vZGUuCisgICAgICAgIGNsYXNzIFNlcXVlbmNlV2l0aG91dEFMZW5ndGg6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgaSA9PSA1OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHppcChTZXF1ZW5jZVdpdGhvdXRBTGVuZ3RoKCksIHhyYW5nZSgyKiozMCkpLAorICAgICAgICAgICAgbGlzdChlbnVtZXJhdGUocmFuZ2UoNSkpKQorICAgICAgICApCisKKyAgICAgICAgY2xhc3MgQmFkU2VxOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIGkgPT0gNToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHppcCwgQmFkU2VxKCksIEJhZFNlcSgpKQorCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIGJhc2ljIG1hY2hpbmVyeSBvZiB0aGUgZm9ybWF0KCkgYnVpbHRpbi4gIERvbid0IHRlc3QKKyAgICAgICAgIyAgdGhlIHNwZWNpZmljcyBvZiB0aGUgdmFyaW91cyBmb3JtYXR0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDMsICcnKSwgJzMnKQorCisgICAgICAgICMgUmV0dXJucyBzb21lIGNsYXNzZXMgdG8gdXNlIGZvciB2YXJpb3VzIHRlc3RzLiAgVGhlcmUncworICAgICAgICAjICBhbiBvbGQtc3R5bGUgdmVyc2lvbiwgYW5kIGEgbmV3LXN0eWxlIHZlcnNpb24KKyAgICAgICAgZGVmIGNsYXNzZXNfbmV3KCk6CisgICAgICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYueCkgKyBmb3JtYXRfc3BlYworICAgICAgICAgICAgY2xhc3MgRGVyaXZlZEZyb21BKEEpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgY2xhc3MgU2ltcGxlKG9iamVjdCk6IHBhc3MKKyAgICAgICAgICAgIGNsYXNzIERlcml2ZWRGcm9tU2ltcGxlKFNpbXBsZSk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYueCkgKyBmb3JtYXRfc3BlYworICAgICAgICAgICAgY2xhc3MgRGVyaXZlZEZyb21TaW1wbGUyKERlcml2ZWRGcm9tU2ltcGxlKTogcGFzcworICAgICAgICAgICAgcmV0dXJuIEEsIERlcml2ZWRGcm9tQSwgRGVyaXZlZEZyb21TaW1wbGUsIERlcml2ZWRGcm9tU2ltcGxlMgorCisgICAgICAgICMgSW4gMy4wLCBjbGFzc2VzX2NsYXNzaWMgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgY2xhc3Nlc19uZXcKKyAgICAgICAgZGVmIGNsYXNzZXNfY2xhc3NpYygpOgorICAgICAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZi54KSArIGZvcm1hdF9zcGVjCisgICAgICAgICAgICBjbGFzcyBEZXJpdmVkRnJvbUEoQSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBjbGFzcyBTaW1wbGU6IHBhc3MKKyAgICAgICAgICAgIGNsYXNzIERlcml2ZWRGcm9tU2ltcGxlKFNpbXBsZSk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKHNlbGYueCkgKyBmb3JtYXRfc3BlYworICAgICAgICAgICAgY2xhc3MgRGVyaXZlZEZyb21TaW1wbGUyKERlcml2ZWRGcm9tU2ltcGxlKTogcGFzcworICAgICAgICAgICAgcmV0dXJuIEEsIERlcml2ZWRGcm9tQSwgRGVyaXZlZEZyb21TaW1wbGUsIERlcml2ZWRGcm9tU2ltcGxlMgorCisgICAgICAgIGRlZiBjbGFzc190ZXN0KEEsIERlcml2ZWRGcm9tQSwgRGVyaXZlZEZyb21TaW1wbGUsIERlcml2ZWRGcm9tU2ltcGxlMik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdChBKDMpLCAnc3BlYycpLCAnM3NwZWMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoRGVyaXZlZEZyb21BKDQpLCAnc3BlYycpLCAnNHNwZWMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoRGVyaXZlZEZyb21TaW1wbGUoNSksICdhYmMnKSwgJzVhYmMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoRGVyaXZlZEZyb21TaW1wbGUyKDEwKSwgJ2FiY2RlZicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTBhYmNkZWYnKQorCisgICAgICAgIGNsYXNzX3Rlc3QoKmNsYXNzZXNfbmV3KCkpCisgICAgICAgIGNsYXNzX3Rlc3QoKmNsYXNzZXNfY2xhc3NpYygpKQorCisgICAgICAgIGRlZiBlbXB0eV9mb3JtYXRfc3BlYyh2YWx1ZSk6CisgICAgICAgICAgICAjIHRlc3QgdGhhdDoKKyAgICAgICAgICAgICMgIGZvcm1hdCh4LCAnJykgPT0gc3RyKHgpCisgICAgICAgICAgICAjICBmb3JtYXQoeCkgPT0gc3RyKHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh2YWx1ZSwgIiIpLCBzdHIodmFsdWUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQodmFsdWUpLCBzdHIodmFsdWUpKQorCisgICAgICAgICMgZm9yIGJ1aWx0aW4gdHlwZXMsIGZvcm1hdCh4LCAiIikgPT0gc3RyKHgpCisgICAgICAgIGVtcHR5X2Zvcm1hdF9zcGVjKDE3KioxMykKKyAgICAgICAgZW1wdHlfZm9ybWF0X3NwZWMoMS4wKQorICAgICAgICBlbXB0eV9mb3JtYXRfc3BlYygzLjE0MTVlMTA0KQorICAgICAgICBlbXB0eV9mb3JtYXRfc3BlYygtMy4xNDE1ZTEwNCkKKyAgICAgICAgZW1wdHlfZm9ybWF0X3NwZWMoMy4xNDE1ZS0xMDQpCisgICAgICAgIGVtcHR5X2Zvcm1hdF9zcGVjKC0zLjE0MTVlLTEwNCkKKyAgICAgICAgZW1wdHlfZm9ybWF0X3NwZWMob2JqZWN0KQorICAgICAgICBlbXB0eV9mb3JtYXRfc3BlYyhOb25lKQorCisgICAgICAgICMgVHlwZUVycm9yIGJlY2F1c2Ugc2VsZi5fX2Zvcm1hdF9fIHJldHVybnMgdGhlIHdyb25nIHR5cGUKKyAgICAgICAgY2xhc3MgQmFkRm9ybWF0UmVzdWx0OgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAxLjAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmb3JtYXQsIEJhZEZvcm1hdFJlc3VsdCgpLCAiIikKKworICAgICAgICAjIFR5cGVFcnJvciBiZWNhdXNlIGZvcm1hdF9zcGVjIGlzIG5vdCB1bmljb2RlIG9yIHN0cgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZvcm1hdCwgb2JqZWN0KCksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZm9ybWF0LCBvYmplY3QoKSwgb2JqZWN0KCkpCisKKyAgICAgICAgIyB0ZXN0cyBmb3Igb2JqZWN0Ll9fZm9ybWF0X18gcmVhbGx5IGJlbG9uZyBlbHNld2hlcmUsIGJ1dAorICAgICAgICAjICB0aGVyZSdzIG5vIGdvb2QgcGxhY2UgdG8gcHV0IHRoZW0KKyAgICAgICAgeCA9IG9iamVjdCgpLl9fZm9ybWF0X18oJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LnN0YXJ0c3dpdGgoJzxvYmplY3Qgb2JqZWN0IGF0JykpCisKKyAgICAgICAgIyBmaXJzdCBhcmd1bWVudCB0byBvYmplY3QuX19mb3JtYXRfXyBtdXN0IGJlIHN0cmluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9iamVjdCgpLl9fZm9ybWF0X18sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb2JqZWN0KCkuX19mb3JtYXRfXywgb2JqZWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb2JqZWN0KCkuX19mb3JtYXRfXywgTm9uZSkKKworICAgICAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICMgSXNzdWUgIzc5OTQ6IG9iamVjdC5fX2Zvcm1hdF9fIHdpdGggYSBub24tZW1wdHkgZm9ybWF0IHN0cmluZyBpcworICAgICAgICAjICBwZW5kaW5nIGRlcHJlY2F0ZWQKKyAgICAgICAgZGVmIHRlc3RfZGVwcmVjYXRlZF9mb3JtYXRfc3RyaW5nKG9iaiwgZm10X3N0ciwgc2hvdWxkX3JhaXNlX3dhcm5pbmcpOgorICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoImFsd2F5cyIsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgZm9ybWF0KG9iaiwgZm10X3N0cikKKyAgICAgICAgICAgIGlmIHNob3VsZF9yYWlzZV93YXJuaW5nOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh3WzBdLm1lc3NhZ2UsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignb2JqZWN0Ll9fZm9ybWF0X18gd2l0aCBhIG5vbi1lbXB0eSBmb3JtYXQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cmluZycsIHN0cih3WzBdLm1lc3NhZ2UpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKworICAgICAgICBmbXRfc3RycyA9IFsnJywgJ3MnLCB1JycsIHUncyddCisKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZtdF9zdHIpOgorICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXQoJycsIGZtdF9zdHIpCisKKyAgICAgICAgZm9yIGZtdF9zdHIgaW4gZm10X3N0cnM6CisgICAgICAgICAgICB0ZXN0X2RlcHJlY2F0ZWRfZm9ybWF0X3N0cmluZyhBKCksIGZtdF9zdHIsIEZhbHNlKQorCisgICAgICAgIGNsYXNzIEI6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciBjbHMgaW4gW29iamVjdCwgQiwgQ106CisgICAgICAgICAgICBmb3IgZm10X3N0ciBpbiBmbXRfc3RyczoKKyAgICAgICAgICAgICAgICB0ZXN0X2RlcHJlY2F0ZWRfZm9ybWF0X3N0cmluZyhjbHMoKSwgZm10X3N0ciwgbGVuKGZtdF9zdHIpICE9IDApCisgICAgICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gdGFrZSBhIHN1YmNsYXNzIG9mIHN0ciBhcyBhIGZvcm1hdCBzcGVjCisgICAgICAgIGNsYXNzIERlcml2ZWRGcm9tU3RyKHN0cik6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMCwgRGVyaXZlZEZyb21TdHIoJzEwJykpLCAnICAgICAgICAgMCcpCisKKyAgICBkZWYgdGVzdF9iaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKDApLCAnMGIwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oMSksICcwYjEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbigtMSksICctMGIxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oMioqNjUpLCAnMGIxJyArICcwJyAqIDY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbigyKio2NS0xKSwgJzBiJyArICcxJyAqIDY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbigtKDIqKjY1KSksICctMGIxJyArICcwJyAqIDY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbigtKDIqKjY1LTEpKSwgJy0wYicgKyAnMScgKiA2NSkKKworICAgIGRlZiB0ZXN0X2J5dGVhcnJheV90cmFuc2xhdGUoc2VsZik6CisgICAgICAgIHggPSBieXRlYXJyYXkoImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHgudHJhbnNsYXRlLCAiMSIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeC50cmFuc2xhdGUsICIxIioyNTYsIDEpCisKK2NsYXNzIFRlc3RTb3J0ZWQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGRhdGEgPSByYW5nZSgxMDApCisgICAgICAgIGNvcHkgPSBkYXRhWzpdCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGNvcHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc29ydGVkKGNvcHkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhdGEsIGNvcHkpCisKKyAgICAgICAgZGF0YS5yZXZlcnNlKCkKKyAgICAgICAgcmFuZG9tLnNodWZmbGUoY29weSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzb3J0ZWQoY29weSwgY21wPWxhbWJkYSB4LCB5OiBjbXAoeSx4KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YSwgY29weSkKKyAgICAgICAgcmFuZG9tLnNodWZmbGUoY29weSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzb3J0ZWQoY29weSwga2V5PWxhbWJkYSB4OiAteCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGF0YSwgY29weSkKKyAgICAgICAgcmFuZG9tLnNodWZmbGUoY29weSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzb3J0ZWQoY29weSwgcmV2ZXJzZT0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhLCBjb3B5KQorCisgICAgZGVmIHRlc3RfaW5wdXR0eXBlcyhzZWxmKToKKyAgICAgICAgcyA9ICdhYnJhY2FkYWJyYScKKyAgICAgICAgdHlwZXMgPSBbbGlzdCwgdHVwbGVdCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHR5cGVzLmluc2VydCgwLCB1bmljb2RlKQorICAgICAgICBmb3IgVCBpbiB0eXBlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHMpLCBzb3J0ZWQoVChzKSkpCisKKyAgICAgICAgcyA9ICcnLmpvaW4oZGljdC5mcm9ta2V5cyhzKS5rZXlzKCkpICAjIHVuaXF1ZSBsZXR0ZXJzIG9ubHkKKyAgICAgICAgdHlwZXMgPSBbc2V0LCBmcm96ZW5zZXQsIGxpc3QsIHR1cGxlLCBkaWN0LmZyb21rZXlzXQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICB0eXBlcy5pbnNlcnQoMCwgdW5pY29kZSkKKyAgICAgICAgZm9yIFQgaW4gdHlwZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChzKSwgc29ydGVkKFQocykpKQorCisgICAgZGVmIHRlc3RfYmFkZGVjb3JhdG9yKHNlbGYpOgorICAgICAgICBkYXRhID0gJ1RoZSBxdWljayBCcm93biBmb3ggSnVtcGVkIG92ZXIgVGhlIGxhenkgRG9nJy5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc29ydGVkLCBkYXRhLCBOb25lLCBsYW1iZGEgeCx5OiAwKQorCitkZWYgX3J1bl91bml0dGVzdCgqYXJncyk6CisgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCIuKyBub3Qgc3VwcG9ydGVkIGluIDMueCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoIi4rIGlzIHJlbmFtZWQgdG8gaW1wLnJlbG9hZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoImNsYXNzaWMgaW50IGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHJ1bl91bml0dGVzdCgqYXJncykKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3RfY2xhc3NlcyA9IChCdWlsdGluVGVzdCwgVGVzdFNvcnRlZCkKKworICAgIF9ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgX3J1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1aWx0aW4ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlNDVjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1aWx0aW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1aWx0aW4ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnVpbHRpbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNlNDVjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J1aWx0aW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J5dGVzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4YjkzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J5dGVzLnB5CkBAIC0wLDAgKzEsMTE0MCBAQAorIiIiVW5pdCB0ZXN0cyBmb3IgdGhlIGJ5dGVzIGFuZCBieXRlYXJyYXkgdHlwZXMuCisKK1hYWCBUaGlzIGlzIGEgbWVzcy4gIENvbW1vbiB0ZXN0cyBzaG91bGQgYmUgbW92ZWQgdG8gYnVmZmVyX3Rlc3RzLnB5LAord2hpY2ggaXRzZWxmIG91Z2h0IHRvIGJlIHVuaWZpZWQgd2l0aCBzdHJpbmdfdGVzdHMucHkgKGFuZCB0aGUgbGF0dGVyCitzaG91bGQgYmUgbW9kZXJuaXplZCkuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBjb3B5CitpbXBvcnQgZnVuY3Rvb2xzCitpbXBvcnQgcGlja2xlCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CitpbXBvcnQgdGVzdC5zdHJpbmdfdGVzdHMKK2ltcG9ydCB0ZXN0LmJ1ZmZlcl90ZXN0cworCisKK2lmIHN5cy5mbGFncy5ieXRlc193YXJuaW5nOgorICAgIGRlZiBjaGVja19ieXRlc193YXJuaW5ncyhmdW5jKToKKyAgICAgICAgQGZ1bmN0b29scy53cmFwcyhmdW5jKQorICAgICAgICBkZWYgd3JhcHBlcigqYXJncywgKiprdyk6CisgICAgICAgICAgICB3aXRoIHRlc3QudGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgQnl0ZXNXYXJuaW5nKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgICAgIHJldHVybiB3cmFwcGVyCitlbHNlOgorICAgICMgbm8tb3AKKyAgICBkZWYgY2hlY2tfYnl0ZXNfd2FybmluZ3MoZnVuYyk6CisgICAgICAgIHJldHVybiBmdW5jCisKKworY2xhc3MgSW5kZXhhYmxlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT0wKToKKyAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKworCitjbGFzcyBCYXNlQnl0ZXNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGIpLCBzZWxmLnR5cGUydGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLl9fY2xhc3NfXywgc2VsZi50eXBlMnRlc3QpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYlswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiWzFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IGJbc3lzLm1heGludF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYltzeXMubWF4aW50KzFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IGJbMTAqKjEwMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYlstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYlstMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYlstc3lzLm1heGludF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYlstc3lzLm1heGludC0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiWy1zeXMubWF4aW50LTJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IGJbLTEwKioxMDBdKQorCisgICAgZGVmIHRlc3RfZnJvbV9saXN0KHNlbGYpOgorICAgICAgICBpbnRzID0gbGlzdChyYW5nZSgyNTYpKQorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoaSBmb3IgaSBpbiBpbnRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgMjU2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIGludHMpCisKKyAgICBkZWYgdGVzdF9mcm9tX2luZGV4KHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoW0luZGV4YWJsZSgpLCBJbmRleGFibGUoMSksIEluZGV4YWJsZSgyNTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4YWJsZSgyNTUpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbMCwgMSwgMjU0LCAyNTVdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgW0luZGV4YWJsZSgtMSldKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgW0luZGV4YWJsZSgyNTYpXSkKKworICAgIGRlZiB0ZXN0X2Zyb21fc3NpemUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoMCksIGInJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCgxKSwgYidceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdCg1KSwgYidceDAwXHgwMFx4MDBceDAwXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCAtMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KCcwJywgJ2FzY2lpJyksIGInMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYicwJyksIGInMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBzeXMubWF4c2l6ZSArIDEpCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcl90eXBlX2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgMC4wKQorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIGFsbG93ZWQgaW4gMi54CisgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbIjAiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgWzAuMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFtOb25lXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgW0MoKV0pCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcl92YWx1ZV9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbLTFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgWy1zeXMubWF4aW50XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFstc3lzLm1heGludC0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFstc3lzLm1heGludC0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFstMTAqKjEwMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbMjU2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50eXBlMnRlc3QsIFsyNTddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgW3N5cy5tYXhpbnRdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdCwgW3N5cy5tYXhpbnQrMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LCBbMTAqKjEwMF0pCisKKyAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYpOgorICAgICAgICBiMSA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAyLCAzXSkKKyAgICAgICAgYjIgPSBzZWxmLnR5cGUydGVzdChbMSwgMiwgM10pCisgICAgICAgIGIzID0gc2VsZi50eXBlMnRlc3QoWzEsIDNdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYjEsIGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjIgIT0gYjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMSA8PSBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIxIDw9IGIzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjEgPCAgYjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMSA+PSBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIzID49IGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjMgPiAgYjIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMSAhPSBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMiA9PSBiMykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMSA+ICBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMSA+ICBiMykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMSA+PSBiMykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMSA8ICBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMyA8ICBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiMyA8PSBiMikKKworICAgIEBjaGVja19ieXRlc193YXJuaW5ncworICAgIGRlZiB0ZXN0X2NvbXBhcmVfdG9fc3RyKHNlbGYpOgorICAgICAgICAjIEJ5dGUgY29tcGFyaXNvbnMgd2l0aCB1bmljb2RlIHNob3VsZCBhbHdheXMgZmFpbCEKKyAgICAgICAgIyBUZXN0IHRoaXMgZm9yIGFsbCBleHBlY3RlZCBieXRlIG9yZGVycyBhbmQgVW5pY29kZSBjaGFyYWN0ZXIgc2l6ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiIlwwYVwwYlwwYyIpID09IHUiYWJjIiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiJcMFwwXDBhXDBcMFwwYlwwXDBcMGMiKSA9PSB1ImFiYyIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGIiYVwwYlwwY1wwIikgPT0gdSJhYmMiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiImFcMFwwXDBiXDBcMFwwY1wwXDBcMCIpID09IHUiYWJjIiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoKSA9PSB1bmljb2RlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KCkgIT0gdW5pY29kZSgpLCBUcnVlKQorCisgICAgZGVmIHRlc3RfcmV2ZXJzZWQoc2VsZik6CisgICAgICAgIGlucHV0ID0gbGlzdChtYXAob3JkLCAiSGVsbG8iKSkKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGlucHV0KQorICAgICAgICBvdXRwdXQgPSBsaXN0KHJldmVyc2VkKGIpKQorICAgICAgICBpbnB1dC5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQsIGlucHV0KQorCisgICAgZGVmIHRlc3RfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgIGRlZiBieShzKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnR5cGUydGVzdChtYXAob3JkLCBzKSkKKyAgICAgICAgYiA9IGJ5KCJIZWxsbywgd29ybGQiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6NV0sIGJ5KCJIZWxsbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMTo1XSwgYnkoImVsbG8iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzU6N10sIGJ5KCIsICIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbNzpdLCBieSgid29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzc6MTJdLCBieSgid29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzc6MTAwXSwgYnkoIndvcmxkIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzotN10sIGJ5KCJIZWxsbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbLTExOi03XSwgYnkoImVsbG8iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWy03Oi01XSwgYnkoIiwgIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlstNTpdLCBieSgid29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWy01OjEyXSwgYnkoIndvcmxkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlstNToxMDBdLCBieSgid29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWy0xMDA6NV0sIGJ5KCJIZWxsbyIpKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBleHRlbmRlZCBzbGljaW5nIGJ5IGNvbXBhcmluZyB3aXRoIGxpc3Qgc2xpY2luZy4KKyAgICAgICAgTCA9IGxpc3QocmFuZ2UoMjU1KSkKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KEwpCisgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgMTksIDEwMCwgLTEsIC0yLCAtMzEsIC0xMDApCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFNraXAgc3RlcCAwIChpbnZhbGlkKQorICAgICAgICAgICAgICAgIGZvciBzdGVwIGluIGluZGljZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbc3RhcnQ6c3RvcDpzdGVwXSwgc2VsZi50eXBlMnRlc3QoTFtzdGFydDpzdG9wOnN0ZXBdKSkKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBzYW1wbGUgPSB1IkhlbGxvIHdvcmxkXG5cdTEyMzRcdTU2NzhcdTlhYmNcdWRlZjAiCisgICAgICAgIGZvciBlbmMgaW4gKCJ1dGY4IiwgInV0ZjE2Iik6CisgICAgICAgICAgICBiID0gc2VsZi50eXBlMnRlc3Qoc2FtcGxlLCBlbmMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudHlwZTJ0ZXN0KHNhbXBsZS5lbmNvZGUoZW5jKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgc2VsZi50eXBlMnRlc3QsIHNhbXBsZSwgImxhdGluMSIpCisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChzYW1wbGUsICJsYXRpbjEiLCAiaWdub3JlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBzZWxmLnR5cGUydGVzdChzYW1wbGVbOi00XSwgInV0Zi04IikpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIHNhbXBsZSA9IHUiSGVsbG8gd29ybGRcblx1MTIzNFx1NTY3OFx1OWFiY1xkZWYwXGRlZjAiCisgICAgICAgIGZvciBlbmMgaW4gKCJ1dGY4IiwgInV0ZjE2Iik6CisgICAgICAgICAgICBiID0gc2VsZi50eXBlMnRlc3Qoc2FtcGxlLCBlbmMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZGVjb2RlKGVuYyksIHNhbXBsZSkKKyAgICAgICAgc2FtcGxlID0gdSJIZWxsbyB3b3JsZFxuXHg4MFx4ODFceGZlXHhmZiIKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KHNhbXBsZSwgImxhdGluMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgYi5kZWNvZGUsICJ1dGY4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmRlY29kZSgidXRmOCIsICJpZ25vcmUiKSwgIkhlbGxvIHdvcmxkXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZGVjb2RlKGVycm9ycz0iaWdub3JlIiwgZW5jb2Rpbmc9InV0ZjgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiSGVsbG8gd29ybGRcbiIpCisKKyAgICBkZWYgdGVzdF9mcm9tX2ludChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgc2VsZi50eXBlMnRlc3QoKSkKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudHlwZTJ0ZXN0KFswXSoxMCkpCisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdCgxMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBzZWxmLnR5cGUydGVzdChbMF0qMTAwMDApKQorCisgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgorICAgICAgICBiMSA9IHNlbGYudHlwZTJ0ZXN0KGIiYWJjIikKKyAgICAgICAgYjIgPSBzZWxmLnR5cGUydGVzdChiImRlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYjEgKyBiMiwgYiJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIxICsgYnl0ZXMoYiJkZWYiKSwgYiJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiZGVmIikgKyBiMSwgYiJkZWZhYmMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYjEgKyB1ImRlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB1ImFiYyIgKyBiMikKKworICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAgICAgZm9yIGIgaW4gYiJhYmMiLCBzZWxmLnR5cGUydGVzdChiImFiYyIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiICogMywgYiJhYmNhYmNhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiICogMCwgYiIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiICogLTEsIGIiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiICogMy4xNCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAzLjE0ICogYikKKyAgICAgICAgICAgICMgWFhYIFNob3VsZG4ndCBieXRlcyBhbmQgYnl0ZWFycmF5IGFncmVlIG9uIHdoYXQgdG8gcmFpc2U/CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBiICogc3lzLm1heHNpemUpCisKKyAgICBkZWYgdGVzdF9yZXBlYXRfMWNoYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYid4JykqMTAwLCBzZWxmLnR5cGUydGVzdChbb3JkKCd4JyldKjEwMCkpCisKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGIiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihvcmQoJ2EnKSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihpbnQob3JkKCdhJykpLCBiKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDIwMCwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAzMDAgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAtMSBpbiBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZmxvYXQob3JkKCdhJykpIGluIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB1ImEiIGluIGIpCisgICAgICAgIGZvciBmIGluIGJ5dGVzLCBieXRlYXJyYXk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGYoYiIiKSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZihiImEiKSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZihiImIiKSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZihiImMiKSwgYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZihiImFiIiksIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGYoYiJiYyIpLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmKGIiYWJjIiksIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGYoYiJhYyIpLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihmKGIiZCIpLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihmKGIiZGFiIiksIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGYoYiJhYmQiKSwgYikKKworICAgIGRlZiB0ZXN0X2Zyb21oZXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgodScnKSwgc2VsZi50eXBlMnRlc3QoKSkKKyAgICAgICAgYiA9IGJ5dGVhcnJheShbMHgxYSwgMHgyYiwgMHgzMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QuZnJvbWhleCh1JzFhMkIzMCcpLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgodScgIDFBIDJCICAzMCAgICcpLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgodScwMDAwJyksIGInXDBcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsIHUnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0LmZyb21oZXgsIHUncnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCB1JzFhIGIgY2QnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCB1J1x4MDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnR5cGUydGVzdC5mcm9taGV4LCB1JzEyICAgXHgwMCAgIDM0JykKKworICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiIiKS5qb2luKFtdKSwgYiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGIiIikuam9pbihbYiIiXSksIGIiIikKKyAgICAgICAgZm9yIGxzdCBpbiBbW2IiYWJjIl0sIFtiImEiLCBiImJjIl0sIFtiImFiIiwgYiJjIl0sIFtiImEiLCBiImIiLCBiImMiXV06CisgICAgICAgICAgICBsc3QgPSBsaXN0KG1hcChzZWxmLnR5cGUydGVzdCwgbHN0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiIiKS5qb2luKGxzdCksIGIiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiIiKS5qb2luKHR1cGxlKGxzdCkpLCBiImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGIiIikuam9pbihpdGVyKGxzdCkpLCBiImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYiIuIikuam9pbihbYiJhYiIsIGIiY2QiXSksIGIiYWIuY2QiKQorICAgICAgICAjIFhYWCBtb3JlLi4uCisKKyAgICBkZWYgdGVzdF9jb3VudChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuY291bnQoYidpJyksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5jb3VudChiJ3NzJyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5jb3VudChiJ3cnKSwgMCkKKworICAgIGRlZiB0ZXN0X3N0YXJ0c3dpdGgoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR5cGUydGVzdCgpLnN0YXJ0c3dpdGgoYiJhbnl0aGluZyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5zdGFydHN3aXRoKGIiaGVsbG8iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuc3RhcnRzd2l0aChiImhlbCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5zdGFydHN3aXRoKGIiaCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIuc3RhcnRzd2l0aChiImhlbGxvdyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIuc3RhcnRzd2l0aChiImhhIikpCisKKyAgICBkZWYgdGVzdF9lbmRzd2l0aChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGJ5dGVhcnJheSgpLmVuZHN3aXRoKGIiYW55dGhpbmciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuZW5kc3dpdGgoYiJoZWxsbyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5lbmRzd2l0aChiImxsbyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5lbmRzd2l0aChiIm8iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiLmVuZHN3aXRoKGIid2hlbGxvIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYi5lbmRzd2l0aChiIm5vIikpCisKKyAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5maW5kKGInc3MnKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZpbmQoYidzcycsIDMpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZmluZChiJ3NzJywgMSwgNyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5maW5kKGInc3MnLCAxLCAzKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5maW5kKGIndycpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZpbmQoYidtaXNzaXNzaXBwaWFuJyksIC0xKQorCisgICAgZGVmIHRlc3RfcmZpbmQoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJmaW5kKGInc3MnKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJmaW5kKGInc3MnLCAzKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJmaW5kKGInc3MnLCAwLCA2KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJmaW5kKGIndycpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJmaW5kKGInbWlzc2lzc2lwcGlhbicpLCAtMSkKKworICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYid3b3JsZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5pbmRleChiJ3cnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmluZGV4KGInb3JsJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGIuaW5kZXgsIGInd29ybScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGIuaW5kZXgsIGInbGRvJykKKworICAgIGRlZiB0ZXN0X3JpbmRleChzZWxmKToKKyAgICAgICAgIyBYWFggY291bGQgYmUgbW9yZSByaWdvcm91cworICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYid3b3JsZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yaW5kZXgoYid3JyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yaW5kZXgoYidvcmwnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYi5yaW5kZXgsIGInd29ybScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGIucmluZGV4LCBiJ2xkbycpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yZXBsYWNlKGInaScsIGInYScpLCBiJ21hc3Nhc3NhcHBhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJlcGxhY2UoYidzcycsIGIneCcpLCBiJ21peGl4aXBwaScpCisKKyAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3BsaXQoYidpJyksIFtiJ20nLCBiJ3NzJywgYidzcycsIGIncHAnLCBiJyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3BsaXQoYidzcycpLCBbYidtaScsIGInaScsIGInaXBwaSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3BsaXQoYid3JyksIFtiXSkKKworICAgIGRlZiB0ZXN0X3NwbGl0X3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIGZvciBiIGluIChiJyAgYXJmICBiYXJmICAnLCBiJ2FyZlx0YmFyZicsIGInYXJmXG5iYXJmJywgYidhcmZccmJhcmYnLAorICAgICAgICAgICAgICAgICAgYidhcmZcZmJhcmYnLCBiJ2FyZlx2YmFyZicpOgorICAgICAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3BsaXQoKSwgW2InYXJmJywgYidiYXJmJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3BsaXQoTm9uZSksIFtiJ2FyZicsIGInYmFyZiddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnNwbGl0KE5vbmUsIDIpLCBbYidhcmYnLCBiJ2JhcmYnXSkKKyAgICAgICAgZm9yIGIgaW4gKGInYVx4MUNiJywgYidhXHgxRGInLCBiJ2FceDFFYicsIGInYVx4MUZiJyk6CisgICAgICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zcGxpdCgpLCBbYl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYicgIGEgIGJiICBjICAnKS5zcGxpdChOb25lLCAwKSwgW2InYSAgYmIgIGMgICddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGInICBhICBiYiAgYyAgJykuc3BsaXQoTm9uZSwgMSksIFtiJ2EnLCBiJ2JiICBjICAnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJyAgYSAgYmIgIGMgICcpLnNwbGl0KE5vbmUsIDIpLCBbYidhJywgYidiYicsIGInYyAgJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYicgIGEgIGJiICBjICAnKS5zcGxpdChOb25lLCAzKSwgW2InYScsIGInYmInLCBiJ2MnXSkKKworICAgIGRlZiB0ZXN0X3NwbGl0X3N0cmluZ19lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdChiJ2EgYicpLnNwbGl0LCB1JyAnKQorCisgICAgZGVmIHRlc3Rfc3BsaXRfdW5pY29kZXdoaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiIlx4MDlceDBBXHgwQlx4MENceDBEXHgxQ1x4MURceDFFXHgxRiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zcGxpdCgpLCBbYidceDFjXHgxZFx4MWVceDFmJ10pCisKKyAgICBkZWYgdGVzdF9yc3BsaXQoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzcGxpdChiJ2knKSwgW2InbScsIGInc3MnLCBiJ3NzJywgYidwcCcsIGInJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3BsaXQoYidzcycpLCBbYidtaScsIGInaScsIGInaXBwaSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnNwbGl0KGIndycpLCBbYl0pCisKKyAgICBkZWYgdGVzdF9yc3BsaXRfd2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgZm9yIGIgaW4gKGInICBhcmYgIGJhcmYgICcsIGInYXJmXHRiYXJmJywgYidhcmZcbmJhcmYnLCBiJ2FyZlxyYmFyZicsCisgICAgICAgICAgICAgICAgICBiJ2FyZlxmYmFyZicsIGInYXJmXHZiYXJmJyk6CisgICAgICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3BsaXQoKSwgW2InYXJmJywgYidiYXJmJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnNwbGl0KE5vbmUpLCBbYidhcmYnLCBiJ2JhcmYnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3BsaXQoTm9uZSwgMiksIFtiJ2FyZicsIGInYmFyZiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGInICBhICBiYiAgYyAgJykucnNwbGl0KE5vbmUsIDApLCBbYicgIGEgIGJiICBjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYicgIGEgIGJiICBjICAnKS5yc3BsaXQoTm9uZSwgMSksIFtiJyAgYSAgYmInLCBiJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdChiJyAgYSAgYmIgIGMgICcpLnJzcGxpdChOb25lLCAyKSwgW2InICBhJywgYidiYicsIGInYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGInICBhICBiYiAgYyAgJykucnNwbGl0KE5vbmUsIDMpLCBbYidhJywgYidiYicsIGInYyddKQorCisgICAgZGVmIHRlc3RfcnNwbGl0X3N0cmluZ19lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdChiJ2EgYicpLnJzcGxpdCwgdScgJykKKworICAgIGRlZiB0ZXN0X3JzcGxpdF91bmljb2Rld2hpdGVzcGFjZShzZWxmKToKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGIiXHgwOVx4MEFceDBCXHgwQ1x4MERceDFDXHgxRFx4MUVceDFGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzcGxpdCgpLCBbYidceDFjXHgxZFx4MWVceDFmJ10pCisKKyAgICBkZWYgdGVzdF9wYXJ0aXRpb24oc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnBhcnRpdGlvbihiJ3NzJyksIChiJ21pJywgYidzcycsIGInaXNzaXBwaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucGFydGl0aW9uKGIndycpLCAoYidtaXNzaXNzaXBwaScsIGInJywgYicnKSkKKworICAgIGRlZiB0ZXN0X3JwYXJ0aXRpb24oc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJwYXJ0aXRpb24oYidzcycpLCAoYidtaXNzaScsIGInc3MnLCBiJ2lwcGknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJwYXJ0aXRpb24oYidpJyksIChiJ21pc3Npc3NpcHAnLCBiJ2knLCBiJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnBhcnRpdGlvbihiJ3cnKSwgKGInJywgYicnLCBiJ21pc3Npc3NpcHBpJykpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBmb3IgYiBpbiBiIiIsIGIiYSIsIGIiYWJjIiwgYiJceGZmYWJceDgwIiwgYiJcMFwwXDM3N1wwXDAiOgorICAgICAgICAgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiKQorICAgICAgICAgICAgICAgIHBzID0gcGlja2xlLmR1bXBzKGIsIHByb3RvKQorICAgICAgICAgICAgICAgIHEgPSBwaWNrbGUubG9hZHMocHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBxKQorCisgICAgZGVmIHRlc3Rfc3RyaXAoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJ21pc3Npc3NpcHBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnN0cmlwKGInaScpLCBiJ21pc3Npc3NpcHAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3RyaXAoYidtJyksIGInaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zdHJpcChiJ3BpJyksIGInbWlzc2lzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zdHJpcChiJ2ltJyksIGInc3Npc3NpcHAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3RyaXAoYidwaW0nKSwgYidzc2lzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5zdHJpcChiKSwgYicnKQorCisgICAgZGVmIHRlc3RfbHN0cmlwKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5sc3RyaXAoYidpJyksIGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIubHN0cmlwKGInbScpLCBiJ2lzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIubHN0cmlwKGIncGknKSwgYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5sc3RyaXAoYidpbScpLCBiJ3NzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5sc3RyaXAoYidwaW0nKSwgYidzc2lzc2lwcGknKQorCisgICAgZGVmIHRlc3RfcnN0cmlwKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidtaXNzaXNzaXBwaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3RyaXAoYidpJyksIGInbWlzc2lzc2lwcCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3RyaXAoYidtJyksIGInbWlzc2lzc2lwcGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnN0cmlwKGIncGknKSwgYidtaXNzaXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJzdHJpcChiJ2ltJyksIGInbWlzc2lzc2lwcCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yc3RyaXAoYidwaW0nKSwgYidtaXNzaXNzJykKKworICAgIGRlZiB0ZXN0X3N0cmlwX3doaXRlc3BhY2Uoc2VsZik6CisgICAgICAgIGIgPSBzZWxmLnR5cGUydGVzdChiJyBcdFxuXHJcZlx2YWJjIFx0XG5cclxmXHYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuc3RyaXAoKSwgYidhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIubHN0cmlwKCksIGInYWJjIFx0XG5cclxmXHYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucnN0cmlwKCksIGInIFx0XG5cclxmXHZhYmMnKQorCisgICAgZGVmIHRlc3Rfc3RyaXBfYnl0ZWFycmF5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGInYWJjJykuc3RyaXAobWVtb3J5dmlldyhiJ2FjJykpLCBiJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KGInYWJjJykubHN0cmlwKG1lbW9yeXZpZXcoYidhYycpKSwgYidiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50eXBlMnRlc3QoYidhYmMnKS5yc3RyaXAobWVtb3J5dmlldyhiJ2FjJykpLCBiJ2FiJykKKworICAgIGRlZiB0ZXN0X3N0cmlwX3N0cmluZ19lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnR5cGUydGVzdChiJ2FiYycpLnN0cmlwLCB1J2InKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0KGInYWJjJykubHN0cmlwLCB1J2InKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHlwZTJ0ZXN0KGInYWJjJykucnN0cmlwLCB1J2InKQorCisgICAgZGVmIHRlc3Rfb3JkKHNlbGYpOgorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidcMEFceDdmXHg4MFx4ZmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtvcmQoYltpOmkrMV0pIGZvciBpIGluIHJhbmdlKGxlbihiKSldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFswLCA2NSwgMTI3LCAxMjgsIDI1NV0pCisKKyAgICBkZWYgdGVzdF9ub25lX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZSAxMTgyOAorICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYidoZWxsbycpCisgICAgICAgIGwgPSBzZWxmLnR5cGUydGVzdChiJ2wnKQorICAgICAgICBoID0gc2VsZi50eXBlMnRlc3QoYidoJykKKyAgICAgICAgeCA9IHNlbGYudHlwZTJ0ZXN0KGIneCcpCisgICAgICAgIG8gPSBzZWxmLnR5cGUydGVzdChiJ28nKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgYi5maW5kKGwsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGIuZmluZChsLCAtMiwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgYi5maW5kKGwsIE5vbmUsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBiLmZpbmQoaCwgTm9uZSwgTm9uZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBiLnJmaW5kKGwsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGIucmZpbmQobCwgLTIsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGIucmZpbmQobCwgTm9uZSwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGIucmZpbmQoaCwgTm9uZSwgTm9uZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBiLmluZGV4KGwsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGIuaW5kZXgobCwgLTIsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGIuaW5kZXgobCwgTm9uZSwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGIuaW5kZXgoaCwgTm9uZSwgTm9uZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBiLnJpbmRleChsLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBiLnJpbmRleChsLCAtMiwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgYi5yaW5kZXgobCwgTm9uZSwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGIucmluZGV4KGgsIE5vbmUsIE5vbmUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgYi5jb3VudChsLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBiLmNvdW50KGwsIC0yLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBiLmNvdW50KGwsIE5vbmUsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBiLmNvdW50KHgsIE5vbmUsIE5vbmUpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgYi5lbmRzd2l0aChvLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBiLmVuZHN3aXRoKG8sIC0yLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBiLmVuZHN3aXRoKGwsIE5vbmUsIC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgYi5lbmRzd2l0aCh4LCBOb25lLCBOb25lKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGIuc3RhcnRzd2l0aChoLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBiLnN0YXJ0c3dpdGgobCwgLTIsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGIuc3RhcnRzd2l0aChoLCBOb25lLCAtMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGIuc3RhcnRzd2l0aCh4LCBOb25lLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfZXRjX3JhaXNlX2NvcnJlY3RfZXJyb3JfbWVzc2FnZXMoc2VsZik6CisgICAgICAgICMgaXNzdWUgMTE4MjgKKyAgICAgICAgYiA9IHNlbGYudHlwZTJ0ZXN0KGInaGVsbG8nKQorICAgICAgICB4ID0gc2VsZi50eXBlMnRlc3QoYid4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xiZmluZFxiJywgYi5maW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXGJyZmluZFxiJywgYi5yZmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoVHlwZUVycm9yLCByJ1xiaW5kZXhcYicsIGIuaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYnJpbmRleFxiJywgYi5yaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYmNvdW50XGInLCBiLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsIHInXGJzdGFydHN3aXRoXGInLCBiLnN0YXJ0c3dpdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKFR5cGVFcnJvciwgcidcYmVuZHN3aXRoXGInLCBiLmVuZHN3aXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCBOb25lLCBOb25lLCBOb25lKQorCisKK2NsYXNzIEJ5dGVBcnJheVRlc3QoQmFzZUJ5dGVzVGVzdCk6CisgICAgdHlwZTJ0ZXN0ID0gYnl0ZWFycmF5CisKKyAgICBkZWYgdGVzdF9ub2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgYnl0ZWFycmF5KCkpCisKKyAgICBkZWYgdGVzdF9ieXRlYXJyYXlfYXBpKHNlbGYpOgorICAgICAgICBzaG9ydF9zYW1wbGUgPSBiIkhlbGxvIHdvcmxkXG4iCisgICAgICAgIHNhbXBsZSA9IHNob3J0X3NhbXBsZSArIGIiXDAiKigyMCAtIGxlbihzaG9ydF9zYW1wbGUpKQorICAgICAgICB0Zm4gPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFByZXBhcmUKKyAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShzaG9ydF9zYW1wbGUpCisgICAgICAgICAgICAjIFRlc3QgcmVhZGludG8KKyAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgYiA9IGJ5dGVhcnJheSgyMCkKKyAgICAgICAgICAgICAgICBuID0gZi5yZWFkaW50byhiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCBsZW4oc2hvcnRfc2FtcGxlKSkKKyAgICAgICAgICAgICMgUHl0aG9uIDIueAorICAgICAgICAgICAgYl9zYW1wbGUgPSAob3JkKHMpIGZvciBzIGluIHNhbXBsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgbGlzdChiX3NhbXBsZSkpCisgICAgICAgICAgICAjIFRlc3Qgd3JpdGluZyBpbiBiaW5hcnkgbW9kZQorICAgICAgICAgICAgd2l0aCBvcGVuKHRmbiwgIndiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKGIpCisgICAgICAgICAgICB3aXRoIG9wZW4odGZuLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIHNhbXBsZSkKKyAgICAgICAgICAgICMgVGV4dCBtb2RlIGlzIGFtYmlndW91czsgZG9uJ3QgdGVzdAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0Zm4pCisgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfcmV2ZXJzZShzZWxmKToKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJldmVyc2UoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ29sbGVoJykKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiJ2hlbGxvMScpICMgdGVzdCBldmVuIG51bWJlciBvZiBpdGVtcworICAgICAgICBiLnJldmVyc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInMW9sbGVoJykKKyAgICAgICAgYiA9IGJ5dGVhcnJheSgpCisgICAgICAgIGIucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYikKKworICAgIGRlZiB0ZXN0X3JlZ2V4cHMoc2VsZik6CisgICAgICAgIGRlZiBieShzKToKKyAgICAgICAgICAgIHJldHVybiBieXRlYXJyYXkobWFwKG9yZCwgcykpCisgICAgICAgIGIgPSBieSgiSGVsbG8sIHdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5maW5kYWxsKHIiXHcrIiwgYiksIFtieSgiSGVsbG8iKSwgYnkoIndvcmxkIildKQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKKyAgICAgICAgYiA9IGJ5dGVhcnJheShbMSwgMiwgM10pCisgICAgICAgIGJbMV0gPSAxMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzEsIDEwMCwgM10pKQorICAgICAgICBiWy0xXSA9IDIwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMSwgMTAwLCAyMDBdKSkKKyAgICAgICAgYlswXSA9IEluZGV4YWJsZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzEwLCAxMDAsIDIwMF0pKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiWzNdID0gMAorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgcmFpc2UgSW5kZXhFcnJvciIpCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBiWy0xMF0gPSAwCisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBJbmRleEVycm9yIikKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJbMF0gPSAyNTYKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYlswXSA9IEluZGV4YWJsZSgtMSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYlswXSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFR5cGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KHJhbmdlKDEwKSkKKyAgICAgICAgZGVsIGJbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkocmFuZ2UoMSwgMTApKSkKKyAgICAgICAgZGVsIGJbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KHJhbmdlKDEsIDkpKSkKKyAgICAgICAgZGVsIGJbNF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzEsIDIsIDMsIDQsIDYsIDcsIDhdKSkKKworICAgIGRlZiB0ZXN0X3NldHNsaWNlKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBsaXN0KHJhbmdlKDEwKSkpCisKKyAgICAgICAgYlswOjVdID0gYnl0ZWFycmF5KFsxLCAxLCAxLCAxLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzEsIDEsIDEsIDEsIDEsIDUsIDYsIDcsIDgsIDldKSkKKworICAgICAgICBkZWwgYlswOi01XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbNSwgNiwgNywgOCwgOV0pKQorCisgICAgICAgIGJbMDowXSA9IGJ5dGVhcnJheShbMCwgMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KHJhbmdlKDEwKSkpCisKKyAgICAgICAgYlstNzotM10gPSBieXRlYXJyYXkoWzEwMCwgMTAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzAsIDEsIDIsIDEwMCwgMTAxLCA3LCA4LCA5XSkpCisKKyAgICAgICAgYlszOjVdID0gWzMsIDQsIDUsIDZdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KHJhbmdlKDEwKSkpCisKKyAgICAgICAgYlszOjBdID0gWzQyLCA0MiwgNDJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KFswLCAxLCAyLCA0MiwgNDIsIDQyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XSkpCisKKyAgICAgICAgYlszOl0gPSBiJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoWzAsIDEsIDIsIDEwMiwgMTExLCAxMTFdKSkKKworICAgICAgICBiWzozXSA9IG1lbW9yeXZpZXcoYidmb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMTAyLCAxMTEsIDExMSwgMTAyLCAxMTEsIDExMV0pKQorCisgICAgICAgIGJbMzo0XSA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KFsxMDIsIDExMSwgMTExLCAxMTEsIDExMV0pKQorCisgICAgICAgIGJbMTpdID0gbGlzdChiJ3V1dXUnKSAgIyB0aGlzIHdvcmtzIG9ubHkgb24gUHl0aG9uMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShbMTAyLCAxMTcsIDExNywgMTE3LCAxMTddKSkKKworICAgICAgICBmb3IgZWxlbSBpbiBbNSwgLTUsIDAsIGxvbmcoMTBlMjApLCB1J3N0cicsIDIuMywgW3UnYScsIHUnYiddLCBbW11dXToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICBiWzM6NF0gPSBlbGVtCisKKyAgICAgICAgZm9yIGVsZW0gaW4gW1syNTQsIDI1NSwgMjU2XSwgWy0yNTYsIDkwMDBdXToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgYlszOjRdID0gZWxlbQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfc2V0X2RlbF9zbGljZShzZWxmKToKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCAxOSwgMzAwLCAxPDwzMzMsIC0xLCAtMiwgLTMxLCAtMzAwKQorICAgICAgICBmb3Igc3RhcnQgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIGZvciBzdG9wIGluIGluZGljZXM6CisgICAgICAgICAgICAgICAgIyBTa2lwIGludmFsaWQgc3RlcCAwCisgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gaW5kaWNlc1sxOl06CisgICAgICAgICAgICAgICAgICAgIEwgPSBsaXN0KHJhbmdlKDI1NSkpCisgICAgICAgICAgICAgICAgICAgIGIgPSBieXRlYXJyYXkoTCkKKyAgICAgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHNsaWNlIG9mIGV4YWN0bHkgdGhlIHJpZ2h0IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIyBidXQgd2l0aCBkaWZmZXJlbnQgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IExbc3RhcnQ6c3RvcDpzdGVwXQorICAgICAgICAgICAgICAgICAgICBkYXRhLnJldmVyc2UoKQorICAgICAgICAgICAgICAgICAgICBMW3N0YXJ0OnN0b3A6c3RlcF0gPSBkYXRhCisgICAgICAgICAgICAgICAgICAgIGJbc3RhcnQ6c3RvcDpzdGVwXSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBieXRlYXJyYXkoTCkpCisKKyAgICAgICAgICAgICAgICAgICAgZGVsIExbc3RhcnQ6c3RvcDpzdGVwXQorICAgICAgICAgICAgICAgICAgICBkZWwgYltzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KEwpKQorCisgICAgZGVmIHRlc3Rfc2V0c2xpY2VfdHJhcChzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCB3ZSBjb3JyZWN0bHkgaGFuZGxlIGFzc2lnbmluZyBzZWxmCisgICAgICAgICMgdG8gYSBzbGljZSBvZiBzZWxmICh0aGUgb2xkIExhbWJlcnQgTWVlcnRlbnMgdHJhcCkuCisgICAgICAgIGIgPSBieXRlYXJyYXkocmFuZ2UoMjU2KSkKKyAgICAgICAgYls4Ol0gPSBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KGxpc3QocmFuZ2UoOCkpICsgbGlzdChyYW5nZSgyNTYpKSkpCisKKyAgICBkZWYgdGVzdF9pY29uY2F0KHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KGIiYWJjIikKKyAgICAgICAgYjEgPSBiCisgICAgICAgIGIgKz0gYiJkZWYiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYiJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBiMSkKKyAgICAgICAgYiArPSBiInh5eiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiImFiY2RlZnh5eiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGIgKz0gdSIiCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImJ5dGVzICs9IHVuaWNvZGUgZGlkbid0IHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9pcmVwZWF0KHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KGIiYWJjIikKKyAgICAgICAgYjEgPSBiCisgICAgICAgIGIgKj0gMworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjYWJjYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIgaXMgYjEpCisKKyAgICBkZWYgdGVzdF9pcmVwZWF0XzFjaGFyKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KGIieCIpCisgICAgICAgIGIxID0gYgorICAgICAgICBiICo9IDEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIieCIqMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBiMSkKKworICAgIGRlZiB0ZXN0X2FsbG9jKHNlbGYpOgorICAgICAgICBiID0gYnl0ZWFycmF5KCkKKyAgICAgICAgYWxsb2MgPSBiLl9fYWxsb2NfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGxvYyA+PSAwKQorICAgICAgICBzZXEgPSBbYWxsb2NdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICBiICs9IGIieCIKKyAgICAgICAgICAgIGFsbG9jID0gYi5fX2FsbG9jX18oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbG9jID49IGxlbihiKSkKKyAgICAgICAgICAgIGlmIGFsbG9jIG5vdCBpbiBzZXE6CisgICAgICAgICAgICAgICAgc2VxLmFwcGVuZChhbGxvYykKKworICAgIGRlZiB0ZXN0X2V4dGVuZChzZWxmKToKKyAgICAgICAgb3JpZyA9IGInaGVsbG8nCisgICAgICAgIGEgPSBieXRlYXJyYXkob3JpZykKKyAgICAgICAgYS5leHRlbmQoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBvcmlnICsgb3JpZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzU6XSwgb3JpZykKKyAgICAgICAgYSA9IGJ5dGVhcnJheShiJycpCisgICAgICAgICMgVGVzdCBpdGVyYXRvcnMgdGhhdCBkb24ndCBoYXZlIGEgX19sZW5ndGhfaGludF9fCisgICAgICAgIGEuZXh0ZW5kKG1hcChvcmQsIG9yaWcgKiAyNSkpCisgICAgICAgIGEuZXh0ZW5kKG9yZCh4KSBmb3IgeCBpbiBvcmlnICogMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgb3JpZyAqIDUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTU6XSwgb3JpZykKKyAgICAgICAgYSA9IGJ5dGVhcnJheShiJycpCisgICAgICAgIGEuZXh0ZW5kKGl0ZXIobWFwKG9yZCwgb3JpZyAqIDUwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgb3JpZyAqIDUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTU6XSwgb3JpZykKKyAgICAgICAgYSA9IGJ5dGVhcnJheShiJycpCisgICAgICAgIGEuZXh0ZW5kKGxpc3QobWFwKG9yZCwgb3JpZyAqIDUwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgb3JpZyAqIDUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTU6XSwgb3JpZykKKyAgICAgICAgYSA9IGJ5dGVhcnJheShiJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuZXh0ZW5kLCBbMCwgMSwgMiwgMjU2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5leHRlbmQsIFswLCAxLCAyLCAtMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGEpLCAwKQorICAgICAgICBhID0gYnl0ZWFycmF5KGInJykKKyAgICAgICAgYS5leHRlbmQoW0luZGV4YWJsZShvcmQoJ2EnKSldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGInYScpCisKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkoYidoZWxsbycpCisgICAgICAgIGIucmVtb3ZlKG9yZCgnbCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInaGVsbycpCisgICAgICAgIGIucmVtb3ZlKG9yZCgnbCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInaGVvJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBiLnJlbW92ZShvcmQoJ2wnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogYi5yZW1vdmUoNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGIucmVtb3ZlKHUnZScpKQorICAgICAgICAjIHJlbW92ZSBmaXJzdCBhbmQgbGFzdAorICAgICAgICBiLnJlbW92ZShvcmQoJ28nKSkKKyAgICAgICAgYi5yZW1vdmUob3JkKCdoJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidlJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGIucmVtb3ZlKHUnZScpKQorICAgICAgICBiLnJlbW92ZShJbmRleGFibGUob3JkKCdlJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInJykKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiJ3dvcmxkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnBvcCgpLCBvcmQoJ2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnBvcCgwKSwgb3JkKCd3JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5wb3AoLTIpLCBvcmQoJ3InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgbGFtYmRhOiBiLnBvcCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogYnl0ZWFycmF5KCkucG9wKCkpCisgICAgICAgICMgdGVzdCBmb3IgaXNzdWUgIzY4NDYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlYXJyYXkoYidceGZmJykucG9wKCksIDB4ZmYpCisKKyAgICBkZWYgdGVzdF9ub3NvcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBsYW1iZGE6IGJ5dGVhcnJheSgpLnNvcnQoKSkKKworICAgIGRlZiB0ZXN0X2FwcGVuZChzZWxmKToKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiJ2hlbGwnKQorICAgICAgICBiLmFwcGVuZChvcmQoJ28nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmFwcGVuZCgxMDApLCBOb25lKQorICAgICAgICBiID0gYnl0ZWFycmF5KCkKKyAgICAgICAgYi5hcHBlbmQob3JkKCdBJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYi5hcHBlbmQodSdvJykpCisgICAgICAgIGIgPSBieXRlYXJyYXkoKQorICAgICAgICBiLmFwcGVuZChJbmRleGFibGUob3JkKCdBJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInQScpCisKKyAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CisgICAgICAgIGIgPSBieXRlYXJyYXkoYidtc3Nzc3BwJykKKyAgICAgICAgYi5pbnNlcnQoMSwgb3JkKCdpJykpCisgICAgICAgIGIuaW5zZXJ0KDQsIG9yZCgnaScpKQorICAgICAgICBiLmluc2VydCgtMiwgb3JkKCdpJykpCisgICAgICAgIGIuaW5zZXJ0KDEwMDAsIG9yZCgnaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInbWlzc2lzc2lwcGknKQorICAgICAgICAjIGFsbG93ZWQgaW4gMi54CisgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYi5pbnNlcnQoMCwgYicxJykpCisgICAgICAgIGIgPSBieXRlYXJyYXkoKQorICAgICAgICBiLmluc2VydCgwLCBJbmRleGFibGUob3JkKCdBJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGInQScpCisKKyAgICBkZWYgdGVzdF9jb3BpZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgNDM0OC4gIE1ha2Ugc3VyZSB0aGF0IG9wZXJhdGlvbnMgdGhhdCBkb24ndCBtdXRhdGUgdGhlIGFycmF5CisgICAgICAgICMgY29weSB0aGUgYnl0ZXMuCisgICAgICAgIGIgPSBieXRlYXJyYXkoYidhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIgaXMgYi5yZXBsYWNlKGInYWJjJywgYidjZGUnLCAwKSkKKworICAgICAgICB0ID0gYnl0ZWFycmF5KFtpIGZvciBpIGluIHJhbmdlKDI1NildKQorICAgICAgICB4ID0gYnl0ZWFycmF5KGInJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4IGlzIHgudHJhbnNsYXRlKHQpKQorCisgICAgZGVmIHRlc3RfcGFydGl0aW9uX2J5dGVhcnJheV9kb2VzbnRfc2hhcmVfbnVsbHN0cmluZyhzZWxmKToKKyAgICAgICAgYSwgYiwgYyA9IGJ5dGVhcnJheShiIngiKS5wYXJ0aXRpb24oYiJ5IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBub3QgYykKKyAgICAgICAgYiArPSBiIiEiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQorICAgICAgICBhLCBiLCBjID0gYnl0ZWFycmF5KGIieCIpLnBhcnRpdGlvbihiInkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCisgICAgICAgICMgU2FtZSBmb3IgcnBhcnRpdGlvbgorICAgICAgICBiLCBjLCBhID0gYnl0ZWFycmF5KGIieCIpLnJwYXJ0aXRpb24oYiJ5IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBub3QgYykKKyAgICAgICAgYiArPSBiIiEiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQorICAgICAgICBjLCBiLCBhID0gYnl0ZWFycmF5KGIieCIpLnJwYXJ0aXRpb24oYiJ5IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQorCisgICAgZGVmIHRlc3RfcmVzaXplX2ZvcmJpZGRlbihzZWxmKToKKyAgICAgICAgIyAjNDUwOTogY2FuJ3QgcmVzaXplIGEgYnl0ZWFycmF5IHdoZW4gdGhlcmUgYXJlIGJ1ZmZlciBleHBvcnRzLCBldmVuCisgICAgICAgICMgaWYgaXQgd291bGRuJ3QgcmVhbGxvY2F0ZSB0aGUgdW5kZXJseWluZyBidWZmZXIuCisgICAgICAgICMgRnVydGhlcm1vcmUsIG5vIGRlc3RydWN0aXZlIGNoYW5nZXMgdG8gdGhlIGJ1ZmZlciBtYXkgYmUgYXBwbGllZAorICAgICAgICAjIGJlZm9yZSByYWlzaW5nIHRoZSBlcnJvci4KKyAgICAgICAgYiA9IGJ5dGVhcnJheShyYW5nZSgxMCkpCisgICAgICAgIHYgPSBtZW1vcnl2aWV3KGIpCisgICAgICAgIGRlZiByZXNpemUobik6CisgICAgICAgICAgICBiWzE6LTFdID0gcmFuZ2UobiArIDEsIDIqbiAtIDEpCisgICAgICAgIHJlc2l6ZSgxMCkKKyAgICAgICAgb3JpZyA9IGJbOl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIHJlc2l6ZSwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgb3JpZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIHJlc2l6ZSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBvcmlnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhCdWZmZXJFcnJvciwgcmVzaXplLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG9yaWcpCisgICAgICAgICMgT3RoZXIgb3BlcmF0aW9ucyBpbXBseWluZyByZXNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGIucG9wLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG9yaWcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBiLnJlbW92ZSwgYlsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBvcmlnKQorICAgICAgICBkZWYgZGVsaXRlbSgpOgorICAgICAgICAgICAgZGVsIGJbMV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQnVmZmVyRXJyb3IsIGRlbGl0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgb3JpZykKKyAgICAgICAgIyBkZWxldGluZyBhIG5vbi1jb250aWd1b3VzIHNsaWNlCisgICAgICAgIGRlZiBkZWxzbGljZSgpOgorICAgICAgICAgICAgYlsxOi0xOjJdID0gYiIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEJ1ZmZlckVycm9yLCBkZWxzbGljZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBvcmlnKQorCisgICAgZGVmIHRlc3RfZW1wdHlfYnl0ZWFycmF5KHNlbGYpOgorICAgICAgICAjIElzc3VlICM3NTYxOiBvcGVyYXRpb25zIG9uIGVtcHR5IGJ5dGVhcnJheXMgY291bGQgY3Jhc2ggaW4gbWFueQorICAgICAgICAjIHNpdHVhdGlvbnMsIGR1ZSB0byBhIGZyYWdpbGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisgICAgICAgICMgUHlCeXRlQXJyYXlfQVNfU1RSSU5HKCkgQyBtYWNyby4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCBieXRlYXJyYXkoYicnKSkKKworCitjbGFzcyBBc3NvcnRlZEJ5dGVzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIworICAgICMgVGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBieXRlcyBhbmQgYnl0ZWFycmF5CisgICAgIworCisgICAgQGNoZWNrX2J5dGVzX3dhcm5pbmdzCisgICAgZGVmIHRlc3RfcmVwcl9zdHIoc2VsZik6CisgICAgICAgIGZvciBmIGluIHN0ciwgcmVwcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihieXRlYXJyYXkoKSksICJieXRlYXJyYXkoYicnKSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYnl0ZWFycmF5KFswXSkpLCAiYnl0ZWFycmF5KGInXFx4MDAnKSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYnl0ZWFycmF5KFswLCAxLCAyNTQsIDI1NV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ5dGVhcnJheShiJ1xceDAwXFx4MDFcXHhmZVxceGZmJykiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGIiYWJjIiksICJiJ2FiYyciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGIiJyIpLCAnJydiIiciJycnKSAjICcnJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGIiJ1wiIiksIHIiIiJiJ1wnIiciIiIpICMgJworCisgICAgZGVmIHRlc3RfY29tcGFyZV9ieXRlc190b19ieXRlYXJyYXkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiID09IGJ5dGVzKGIiYWJjIiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYiIgIT0gYnl0ZXMoYiJhYmMiKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiIiA8PSBieXRlcyhiImFiYyIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWIiIDwgYnl0ZXMoYiJhYmMiKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiYyIgPj0gYnl0ZXMoYiJhYiIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiA+IGJ5dGVzKGIiYWIiKSwgVHJ1ZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiAhPSBieXRlcyhiImFiYyIpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiIiA9PSBieXRlcyhiImFiYyIpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiIiA+IGJ5dGVzKGIiYWJjIiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWIiID49IGJ5dGVzKGIiYWJjIiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiA8IGJ5dGVzKGIiYWIiKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiIDw9IGJ5dGVzKGIiYWIiKSwgRmFsc2UpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiYyIpID09IGIiYWJjIiwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiIikgIT0gYiJhYmMiLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWIiKSA8PSBiImFiYyIsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYiIpIDwgYiJhYmMiLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWJjIikgPj0gYiJhYiIsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYmMiKSA+IGIiYWIiLCBUcnVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYmMiKSAhPSBiImFiYyIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWIiKSA9PSBiImFiYyIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzKGIiYWIiKSA+IGIiYWJjIiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYiIpID49IGIiYWJjIiwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYmMiKSA8IGIiYWIiLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChieXRlcyhiImFiYyIpIDw9IGIiYWIiLCBGYWxzZSkKKworICAgIEB0ZXN0LnRlc3Rfc3VwcG9ydC5yZXF1aXJlc19kb2NzdHJpbmdzCisgICAgZGVmIHRlc3RfZG9jKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShieXRlYXJyYXkuX19kb2NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJ5dGVhcnJheS5fX2RvY19fLnN0YXJ0c3dpdGgoImJ5dGVhcnJheSgiKSwgYnl0ZWFycmF5Ll9fZG9jX18pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKGJ5dGVzLl9fZG9jX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShieXRlcy5fX2RvY19fLnN0YXJ0c3dpdGgoImJ5dGVzKCIpLCBieXRlcy5fX2RvY19fKQorCisgICAgZGVmIHRlc3RfZnJvbV9ieXRlYXJyYXkoc2VsZik6CisgICAgICAgIHNhbXBsZSA9IGJ5dGVzKGIiSGVsbG8gd29ybGRcblx4ODBceDgxXHhmZVx4ZmYiKQorICAgICAgICBidWYgPSBtZW1vcnl2aWV3KHNhbXBsZSkKKyAgICAgICAgYiA9IGJ5dGVhcnJheShidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYnl0ZWFycmF5KHNhbXBsZSkpCisKKyAgICBAY2hlY2tfYnl0ZXNfd2FybmluZ3MKKyAgICBkZWYgdGVzdF90b19zdHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGInJyksICJiJyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihiJ3gnKSwgImIneCciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihiJ1x4ODAnKSwgImInXFx4ODAnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYnl0ZWFycmF5KGInJykpLCAiYnl0ZWFycmF5KGInJykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihieXRlYXJyYXkoYid4JykpLCAiYnl0ZWFycmF5KGIneCcpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYnl0ZWFycmF5KGInXHg4MCcpKSwgImJ5dGVhcnJheShiJ1xceDgwJykiKQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbChzZWxmKToKKyAgICAgICAgdGVzdHMgPSAgWworICAgICAgICAgICAgKGIiV29uZGVyZnVsIHNwYW0iLCAiV29uZGVyZnVsIHNwYW0iKSwKKyAgICAgICAgICAgIChiciJXb25kZXJmdWwgc3BhbSB0b28iLCAiV29uZGVyZnVsIHNwYW0gdG9vIiksCisgICAgICAgICAgICAoYiJceGFhXHgwMFwwMDBcMjAwIiwgIlx4YWFceDAwXDAwMFwyMDAiKSwKKyAgICAgICAgICAgIChiciJceGFhXHgwMFwwMDBcMjAwIiwgciJceGFhXHgwMFwwMDBcMjAwIiksCisgICAgICAgIF0KKyAgICAgICAgZm9yIGIsIHMgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGJ5dGVhcnJheShzLCAnbGF0aW4tMScpKQorICAgICAgICBmb3IgYyBpbiByYW5nZSgxMjgsIDI1Nik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiIiVzIicgJSBjaHIoYykpCisKKyAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZik6CisgICAgICAgIGIgPSBiJ2hlbGxvJworICAgICAgICBiYSA9IGJ5dGVhcnJheShiKQorICAgICAgICByb3NldHRhID0gYnl0ZWFycmF5KHJhbmdlKDAsIDI1NikpCisgICAgICAgIHJvc2V0dGFbb3JkKCdvJyldID0gb3JkKCdlJykKKyAgICAgICAgYyA9IGIudHJhbnNsYXRlKHJvc2V0dGEsIGInbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgYidoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidoZWUnKQorICAgICAgICBjID0gYmEudHJhbnNsYXRlKHJvc2V0dGEsIGInbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmEsIGInaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGInaGVlJykKKyAgICAgICAgYyA9IGIudHJhbnNsYXRlKE5vbmUsIGInZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYidobGxvJykKKyAgICAgICAgYyA9IGJhLnRyYW5zbGF0ZShOb25lLCBiJ2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGInaGxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYi50cmFuc2xhdGUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYmEudHJhbnNsYXRlLCBOb25lLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc3BsaXRfYnl0ZWFycmF5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInYSBiJy5zcGxpdChtZW1vcnl2aWV3KGInICcpKSwgW2InYScsIGInYiddKQorCisgICAgZGVmIHRlc3RfcnNwbGl0X2J5dGVhcnJheShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJ2EgYicucnNwbGl0KG1lbW9yeXZpZXcoYicgJykpLCBbYidhJywgYidiJ10pCisKKyAgICAjIE9wdGltaXphdGlvbnM6CisgICAgIyBfX2l0ZXJfXz8gKG9wdGltaXphdGlvbikKKyAgICAjIF9fcmV2ZXJzZWRfXz8gKG9wdGltaXphdGlvbikKKworICAgICMgWFhYIE1vcmUgc3RyaW5nIG1ldGhvZHM/ICAoVGhvc2UgdGhhdCBkb24ndCB1c2UgY2hhcmFjdGVyIHByb3BlcnRpZXMpCisKKyAgICAjIFRoZXJlIGFyZSB0ZXN0cyBpbiBzdHJpbmdfdGVzdHMucHkgdGhhdCBhcmUgbW9yZQorICAgICMgY29tcHJlaGVuc2l2ZSBmb3IgdGhpbmdzIGxpa2Ugc3BsaXQsIHBhcnRpdGlvbiwgZXRjLgorICAgICMgVW5mb3J0dW5hdGVseSB0aGV5IGFyZSBhbGwgYnVuZGxlZCB3aXRoIHRlc3RzIHRoYXQKKyAgICAjIGFyZSBub3QgYXBwcm9wcmlhdGUgZm9yIGJ5dGVzCisKKyAgICAjIEkndmUgc3RhcnRlZCBwb3J0aW5nIHNvbWUgb2YgdGhvc2UgaW50byBieXRlYXJyYXlfdGVzdHMucHksIHdlIHNob3VsZCBwb3J0CisgICAgIyB0aGUgcmVzdCB0aGF0IG1ha2Ugc2Vuc2UgKHRoZSBjb2RlIGNhbiBiZSBjbGVhbmVkIHVwIHRvIHVzZSBtb2Rlcm4KKyAgICAjIHVuaXR0ZXN0IG1ldGhvZHMgYXQgdGhlIHNhbWUgdGltZSkuCisKK2NsYXNzIEJ5dGVhcnJheVBFUDMxMzdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICB0ZXN0LmJ1ZmZlcl90ZXN0cy5NaXhpbkJ5dGVzQnVmZmVyQ29tbW9uVGVzdHMpOgorICAgIGRlZiBtYXJzaGFsKHNlbGYsIHgpOgorICAgICAgICByZXR1cm4gYnl0ZWFycmF5KHgpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5zX25ld19jb3B5KHNlbGYpOgorICAgICAgICB2YWwgPSBzZWxmLm1hcnNoYWwoYicxMjM0JykKKyAgICAgICAgIyBPbiBpbW11dGFibGUgdHlwZXMgdGhlc2UgTUFZIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGVtc2VsdmVzCisgICAgICAgICMgYnV0IG9uIG11dGFibGUgdHlwZXMgbGlrZSBieXRlYXJyYXkgdGhleSBNVVNUIHJldHVybiBhIG5ldyBjb3B5LgorICAgICAgICBmb3IgbWV0aG5hbWUgaW4gKCd6ZmlsbCcsICdyanVzdCcsICdsanVzdCcsICdjZW50ZXInKToKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIodmFsLCBtZXRobmFtZSkKKyAgICAgICAgICAgIG5ld3ZhbCA9IG1ldGhvZCgzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsIG5ld3ZhbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWwgaXMgbm90IG5ld3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRobmFtZSsnIHJldHVybmVkIHNlbGYgb24gYSBtdXRhYmxlIG9iamVjdCcpCisgICAgICAgIGZvciBleHByIGluICgndmFsLnNwbGl0KClbMF0nLCAndmFsLnJzcGxpdCgpWzBdJywKKyAgICAgICAgICAgICAgICAgICAgICd2YWwucGFydGl0aW9uKCIuIilbMF0nLCAndmFsLnJwYXJ0aXRpb24oIi4iKVsyXScsCisgICAgICAgICAgICAgICAgICAgICAndmFsLnNwbGl0bGluZXMoKVswXScsICd2YWwucmVwbGFjZSgiIiwgIiIpJyk6CisgICAgICAgICAgICBuZXd2YWwgPSBldmFsKGV4cHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgbmV3dmFsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbCBpcyBub3QgbmV3dmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHIrJyByZXR1cm5lZCB2YWwgb24gYSBtdXRhYmxlIG9iamVjdCcpCisKK2NsYXNzIEZpeGVkU3RyaW5nVGVzdCh0ZXN0LnN0cmluZ190ZXN0cy5CYXNlVGVzdCk6CisKKyAgICBkZWYgZml4dHlwZShzZWxmLCBvYmopOgorICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgc3RyKToKKyAgICAgICAgICAgIHJldHVybiBvYmouZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIHJldHVybiBzdXBlcihGaXhlZFN0cmluZ1Rlc3QsIHNlbGYpLmZpeHR5cGUob2JqKQorCisgICAgIyBDdXJyZW50bHkgdGhlIGJ5dGVzIGNvbnRhaW5tZW50IHRlc3RpbmcgdXNlcyBhIHNpbmdsZSBpbnRlZ2VyCisgICAgIyB2YWx1ZS4gVGhpcyBtYXkgbm90IGJlIHRoZSBmaW5hbCBkZXNpZ24sIGJ1dCB1bnRpbCB0aGVuIHRoZQorICAgICMgYnl0ZXMgc2VjdGlvbiB3aXRoIGluIGEgYnl0ZXMgY29udGFpbm1lbnQgbm90IHZhbGlkCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgIHBhc3MKKyAgICBkZWYgdGVzdF9leHBhbmR0YWJzKHNlbGYpOgorICAgICAgICBwYXNzCisgICAgZGVmIHRlc3RfdXBwZXIoc2VsZik6CisgICAgICAgIHBhc3MKKyAgICBkZWYgdGVzdF9sb3dlcihzZWxmKToKKyAgICAgICAgcGFzcworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgICMgWFhYIGNoZWNrIHRoaXMgb3V0CisgICAgICAgIHBhc3MKKworCitjbGFzcyBCeXRlQXJyYXlBc1N0cmluZ1Rlc3QoRml4ZWRTdHJpbmdUZXN0KToKKyAgICB0eXBlMnRlc3QgPSBieXRlYXJyYXkKKworCitjbGFzcyBCeXRlQXJyYXlTdWJjbGFzcyhieXRlYXJyYXkpOgorICAgIHBhc3MKKworY2xhc3MgQnl0ZUFycmF5U3ViY2xhc3NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhCeXRlQXJyYXlTdWJjbGFzcywgYnl0ZWFycmF5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKEJ5dGVBcnJheVN1YmNsYXNzKCksIGJ5dGVhcnJheSkKKworICAgICAgICBhLCBiID0gYiJhYmNkIiwgYiJlZmdoIgorICAgICAgICBfYSwgX2IgPSBCeXRlQXJyYXlTdWJjbGFzcyhhKSwgQnl0ZUFycmF5U3ViY2xhc3MoYikKKworICAgICAgICAjIHRlc3QgY29tcGFyaXNvbiBvcGVyYXRvcnMgd2l0aCBzdWJjbGFzcyBpbnN0YW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9hID09IF9hKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2EgIT0gX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYSA8IF9iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2EgPD0gX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYiA+PSBfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9iID4gX2EpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYSBpcyBub3QgYSkKKworICAgICAgICAjIHRlc3QgY29uY2F0IG9mIHN1YmNsYXNzIGluc3RhbmNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyBiLCBfYSArIF9iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyBiLCBhICsgX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArIGIsIF9hICsgYikKKworICAgICAgICAjIHRlc3QgcmVwZWF0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhKjUgPT0gX2EqNSkKKworICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGpvaW4gcmV0dXJucyBhIE5FVyBvYmplY3QgZm9yIHNpbmdsZSBpdGVtIHNlcXVlbmNlcworICAgICAgICAjIGludm9sdmluZyBhIHN1YmNsYXNzLgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGl0IGlzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlLgorICAgICAgICBzMSA9IEJ5dGVBcnJheVN1YmNsYXNzKGIiYWJjZCIpCisgICAgICAgIHMyID0gYnl0ZWFycmF5KCkuam9pbihbczFdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoczEgaXMgbm90IHMyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShzMikgaXMgYnl0ZWFycmF5LCB0eXBlKHMyKSkKKworICAgICAgICAjIFRlc3QgcmV2ZXJzZSwgY2FsbGluZyBqb2luIG9uIHN1YmNsYXNzCisgICAgICAgIHMzID0gczEuam9pbihbYiJhYmNkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHMzKSBpcyBieXRlYXJyYXkpCisKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIGEgPSBCeXRlQXJyYXlTdWJjbGFzcyhiImFiY2QiKQorICAgICAgICBhLnggPSAxMAorICAgICAgICBhLnkgPSBCeXRlQXJyYXlTdWJjbGFzcyhiImVmZ2giKQorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyAgICAgICAgICAgIGIgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGEsIHByb3RvKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYSksIGlkKGIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIGIueCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS55LCBiLnkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYSksIHR5cGUoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYS55KSwgdHlwZShiLnkpKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgYSA9IEJ5dGVBcnJheVN1YmNsYXNzKGIiYWJjZCIpCisgICAgICAgIGEueCA9IDEwCisgICAgICAgIGEueSA9IEJ5dGVBcnJheVN1YmNsYXNzKGIiZWZnaCIpCisgICAgICAgIGZvciBjb3B5X21ldGhvZCBpbiAoY29weS5jb3B5LCBjb3B5LmRlZXBjb3B5KToKKyAgICAgICAgICAgIGIgPSBjb3B5X21ldGhvZChhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChhKSwgaWQoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgYi54KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnksIGIueSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhKSwgdHlwZShiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShhLnkpLCB0eXBlKGIueSkpCisKKyAgICBkZWYgdGVzdF9pbml0X292ZXJyaWRlKHNlbGYpOgorICAgICAgICBjbGFzcyBzdWJjbGFzcyhieXRlYXJyYXkpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5ld2FyZz0xLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGJ5dGVhcnJheS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHggPSBzdWJjbGFzcyg0LCBzb3VyY2U9YiJhYmNkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBiImFiY2QiKQorICAgICAgICB4ID0gc3ViY2xhc3MobmV3YXJnPTQsIHNvdXJjZT1iImFiY2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGIiYWJjZCIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJ5dGVzVGVzdCkKKyAgICAjdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEFzc29ydGVkQnl0ZXNUZXN0KQorICAgICN0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQnl0ZXNBc1N0cmluZ1Rlc3QpCisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBCeXRlQXJyYXlUZXN0LAorICAgICAgICBCeXRlQXJyYXlBc1N0cmluZ1Rlc3QsCisgICAgICAgIEJ5dGVBcnJheVN1YmNsYXNzVGVzdCwKKyAgICAgICAgQnl0ZWFycmF5UEVQMzEzN1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J5dGVzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J5dGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg3ODEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J5dGVzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J5dGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTg3ODEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnl0ZXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjc1MTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfYnoyLnB5CkBAIC0wLDAgKzEsNDgyIEBACisjIS91c3IvYmluL2VudiBweXRob24KK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIF80RywgYmlnbWVtdGVzdCwgaW1wb3J0X21vZHVsZSwgZmluZGZpbGUKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK2J6MiA9IGltcG9ydF9tb2R1bGUoJ2J6MicpCitmcm9tIGJ6MiBpbXBvcnQgQloyRmlsZSwgQloyQ29tcHJlc3NvciwgQloyRGVjb21wcmVzc29yCisKK2hhc19jbWRsaW5lX2J1bnppcDIgPSBzeXMucGxhdGZvcm0gbm90IGluICgid2luMzIiLCAib3MyZW14IiwgInJpc2NvcyIpCisKK2NsYXNzIEJhc2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiQmFzZSBmb3Igb3RoZXIgdGVzdGNhc2VzLiIKKyAgICBURVhUID0gJ3Jvb3Q6eDowOjA6cm9vdDovcm9vdDovYmluL2Jhc2hcbmJpbjp4OjE6MTpiaW46L2JpbjpcbmRhZW1vbjp4OjI6MjpkYWVtb246L3NiaW46XG5hZG06eDozOjQ6YWRtOi92YXIvYWRtOlxubHA6eDo0Ojc6bHA6L3Zhci9zcG9vbC9scGQ6XG5zeW5jOng6NTowOnN5bmM6L3NiaW46L2Jpbi9zeW5jXG5zaHV0ZG93bjp4OjY6MDpzaHV0ZG93bjovc2Jpbjovc2Jpbi9zaHV0ZG93blxuaGFsdDp4Ojc6MDpoYWx0Oi9zYmluOi9zYmluL2hhbHRcbm1haWw6eDo4OjEyOm1haWw6L3Zhci9zcG9vbC9tYWlsOlxubmV3czp4Ojk6MTM6bmV3czovdmFyL3Nwb29sL25ld3M6XG51dWNwOng6MTA6MTQ6dXVjcDovdmFyL3Nwb29sL3V1Y3A6XG5vcGVyYXRvcjp4OjExOjA6b3BlcmF0b3I6L3Jvb3Q6XG5nYW1lczp4OjEyOjEwMDpnYW1lczovdXNyL2dhbWVzOlxuZ29waGVyOng6MTM6MzA6Z29waGVyOi91c3IvbGliL2dvcGhlci1kYXRhOlxuZnRwOng6MTQ6NTA6RlRQIFVzZXI6L3Zhci9mdHA6L2Jpbi9iYXNoXG5ub2JvZHk6eDo2NTUzNDo2NTUzNDpOb2JvZHk6L2hvbWU6XG5wb3N0Zml4Ong6MTAwOjEwMTpwb3N0Zml4Oi92YXIvc3Bvb2wvcG9zdGZpeDpcbm5pZW1leWVyOng6NTAwOjUwMDo6L2hvbWUvbmllbWV5ZXI6L2Jpbi9iYXNoXG5wb3N0Z3Jlczp4OjEwMToxMDI6UG9zdGdyZVNRTCBTZXJ2ZXI6L3Zhci9saWIvcGdzcWw6L2Jpbi9iYXNoXG5teXNxbDp4OjEwMjoxMDM6TXlTUUwgc2VydmVyOi92YXIvbGliL215c3FsOi9iaW4vYmFzaFxud3d3Ong6MTAzOjEwNDo6L3Zhci93d3c6L2Jpbi9mYWxzZVxuJworICAgIERBVEEgPSAnQlpoOTFBWSZTWS5ceGM4Tlx4MThceDAwXHgwMT5fXHg4MFx4MDBceDEwQFx4MDJceGZmXHhmMFx4MDFceDA3blx4MDA/XHhlN1x4ZmZceGUwMFx4MDFceDk5XHhhYVx4MDBceGMwXHgwM0ZceDg2XHg4YyMmXHg4M0ZceDlhXHgwM1x4MDZceGE2XHhkMFx4YTZceDkzTVx4MGZRXHhhN1x4YThceDA2XHg4MDRoaFx4MTIkXHgxMVx4YTRpNFx4ZjE0U1x4ZDI8UVx4YjVceDBmSFx4ZDNceGQ0XHhkZFx4ZDVceDg3XHhiYlx4ZjhceDk0XHJceDhmXHhhZklceDEyXHhlMVx4YzlceGY4L0VceDAwcHVceDg5XHgxMl1ceGM5XHhiYkRMXG5RXHgwZVx0MVx4MTJceGRmXHhhMFx4YzBceDk3XHhhYzJPOVx4ODlceDEzXHg5NFx4MGVceDFjN1x4MGVkXHg5NUlceDBjXHhhYUpceGE0XHgxOExceDEwXHgwNSNceDljXHhhZlx4YmFceGJjL1x4OTdceDhhI0NceGM4XHhlMVx4OGNXXHhmOVx4ZTJceGQwXHhkNk1ceGE3XHg4YlhhPGVceDg0dFx4Y2JMXHhiM1x4YTdceGQ5XHhjZFx4ZDFceGNiXHg4NC5ceGFmXHhiM1x4YWJceGFiXHhhZGBufVx4YTBsaFx0RSxceDhlWlx4MTVceDE3Vkg+XHg4OFx4ZTVceGNkOWdkNlx4MGJcblx4ZTlceDliXHhkNVx4OGFceDk5XHhmN1x4MDguS1x4OGV2XHhmYlx4Zjd4d1x4YmJceGRmXHhhMVx4OTJceGYxXHhkZHwvIjtceGEyXHhiYVx4OWZceGQ1XHhiMSNBXHhiNlx4ZjZceGIzb1x4YzlceGM1eVxcXHhlYk9ceGU3XHg4NVx4OWFceGJjXHhiNmY4XHg5NTJceGQ1XHhkNyIlXHg4OT5WLFx4ZjdceGE2elx4ZTJceDlmXHhhM1x4ZGZceDExXHgxMSJceGQ2RSlJXHhhOVx4MTNeXHhjYVx4ZjNyXHhkMFx4MDNVXHg5MjJceGYyNlx4ZWNceGI2XHhlZFx4OGJceGMzVVx4MTNceDlkXHhjNVx4MTcwXHhhNFx4ZmFeXHg5Mlx4YWNERlx4OGFceDk3XHhkNlx4MTlceGZlXHhkZFx4YjhceGJkXHgxYVx4OWFceDE5XHhhM1x4ODBhbmtSXHg4Ylx4ZTVceGQ4M11ceGE5XHhjNlx4MDhceDgyZlx4ZjZceGI5IjZsJFx4YjhqQFx4YzBceDhhXHhiMGwxLi5ceGJha1x4ODNsc1x4MTVceGJjXHhmNFx4YzFceDEzXHhiZVx4ZjhFXHhiOFx4OWRcclx4YThceDlka1x4ODRceGQzblx4ZmFceGFjUVx4MDdceGIxJXlceGFhdlx4YjRceDA4XHhlMHpceDFiXHgxNlx4ZjVceDA0XHhlOVx4Y2NceGI5XHgwOHpceDFlbjcuR1x4ZmNdXHhjOVx4MTRceGUxQkBceGJiIThgJworICAgIERBVEFfQ1JMRiA9ICdCWmg5MUFZJlNZXHhhZXpceGJiTlx4MDBceDAxSFx4ZGZceDgwXHgwMFx4MTJAXHgwMlx4ZmZceGYwXHgwMVx4MDduXHgwMD9ceGU3XHhmZlx4ZTBAXHgwMVx4YmNceGM2YFx4ODYqXHg4ZD1NXHhhOVx4OWFceDg2XHhkMExAXHgwZklceGE2IVx4YTFceDEzXHhjOFx4ODhqZGlceDhkQFx4MDNAXHgxYVx4MWFceDBjXHgwY1x4ODMgXHgwMFx4YzRoMlx4MTlceDAxXHg4MkRceDg0ZVx0XHhlOFx4OTlceDg5XHgxOVx4MWFoXHgwMFxyXHgxYVx4MTFceGFmXHg5Ylx4MGZHXHhmNShceDFiXHgxZj9cdFx4MTJceGNmXHhiNVx4ZmNceDk1RVx4MDBwc1x4ODlceDEyXlx4YTRceGRkXHhhMiZceDA1KFx4ODdceDA0XHg5OFx4ODl1XHhlNDAlXHhiNlx4MTlcJ1x4OGNceGM0XHg4OVx4Y2FceDA3XHgwZVx4MWIhXHg5MVVJRlUlQ1x4OTk0IURJXHhkMlx4ZmFceGYwXHhmMU44V1x4ZGVceDEzQVx4ZjVceDljciU/XHg5ZjM7STQ1QVx4ZDFceDhiVFx4YjE8bFx4YmFceGNiX1x4YzAweFlceDE3clx4MTdceDg4XHgwOFx4MDhAXHhhMFxyeUBceDEwXHgwNCQpYFx4ZjJceGNlXHg4OXpceGIwc1x4ZWNceDliLmlXXHg5ZFx4ODFceGI1LSt0XHg5Zlx4MWFcJ1x4OTdkQlx4ZjV4XHhiNVx4YmUuWy5ceGQ3XHgwZVx4ODFceGU3XHgwOFx4MWNOYFx4ODhceDEwXHhjYVx4ODdceGMzISJceDgwXHg5MlJceGExL1x4ZDFceGMwXHhlNm1mXHhhY1x4YmRceDk5XHhjY2FceGIzXHg4NzgwPlx4YTRceGM3XHg4ZFx4MWFcXCJceGFkXHhhMVx4YWJ5QmdceDE1XHhiOWxceDg4XHg4OFx4OTFrIlx4OTRceGE0XHhkNFx4ODlceGFlKlx4YTZceDBiXHgxMFx4MGNceGQ2XHhkNG1ceGU4Nlx4ZWNceGI1alx4OGFceDg2alwnO1x4Y2EuXHgwMUlceGYyXHhhYUpceGU4XHg4OFx4OGNVK3QzXHhmYlx4MGNcblx4YTMzXHgxM3IyXHJceDE2XHhlMFx4YjMoXHhiZlx4MWRceDgzclx4ZTdNXHhmMERceDEzNjVceGQ4XHg4OFx4ZDNceGE0XHg5Mlx4Y2IyXHgwNlx4MDRcXFx4YzFceGIwXHhlYS8vXHhiZWsmXHhkOFx4ZTYrdFx4ZTVceGExXHgxM1x4YWRhXHgxNlx4ZGVyNSJ3XVx4YTJpXHhiN1tceDk3UiBceGUySVRceGNkO1pceDA0ZGs0XHhhZFx4OGFcdFx4ZDNceDgxelx4MTBceGYxOl5gXHhhYlx4MWZceGM1XHhkY1x4OTFOXHgxNCQrXHg5ZVx4YWVceGQzXHg4MCcKKyAgICBFTVBUWV9EQVRBID0gJ0JaaDlceDE3ckU4UFx4OTBceDAwXHgwMFx4MDBceDAwJworCisgICAgaWYgaGFzX2NtZGxpbmVfYnVuemlwMjoKKyAgICAgICAgZGVmIGRlY29tcHJlc3Moc2VsZiwgZGF0YSk6CisgICAgICAgICAgICBwb3AgPSBzdWJwcm9jZXNzLlBvcGVuKCJidW56aXAyIiwgc2hlbGw9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgICAgICBwb3Auc3RkaW4ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHBvcC5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICByZXQgPSBwb3Auc3Rkb3V0LnJlYWQoKQorICAgICAgICAgICAgcG9wLnN0ZG91dC5jbG9zZSgpCisgICAgICAgICAgICBpZiBwb3Aud2FpdCgpICE9IDA6CisgICAgICAgICAgICAgICAgcmV0ID0gYnoyLmRlY29tcHJlc3MoZGF0YSkKKyAgICAgICAgICAgIHJldHVybiByZXQKKworICAgIGVsc2U6CisgICAgICAgICMgYnVuemlwMiBpc24ndCBhdmFpbGFibGUgdG8gcnVuIG9uIFdpbmRvd3MuCisgICAgICAgIGRlZiBkZWNvbXByZXNzKHNlbGYsIGRhdGEpOgorICAgICAgICAgICAgcmV0dXJuIGJ6Mi5kZWNvbXByZXNzKGRhdGEpCisKKworY2xhc3MgQloyRmlsZVRlc3QoQmFzZVRlc3QpOgorICAgICJUZXN0IEJaMkZpbGUgdHlwZSBtaXNjZWxsYW5lb3VzIG1ldGhvZHMuIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gVEVTVEZOCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNlbGYuZmlsZW5hbWUpOgorICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCisKKyAgICBkZWYgY3JlYXRlVGVtcEZpbGUoc2VsZiwgY3JsZj0wKToKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBpZiBjcmxmOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLkRBVEFfQ1JMRgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5EQVRBCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisKKyAgICBkZWYgdGVzdFJlYWQoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5yZWFkKCkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyZi5yZWFkLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWQoKSwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3RSZWFkMChzZWxmKToKKyAgICAgICAgIyBUZXN0IEJCWjJGaWxlLnJlYWQoMCkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyZi5yZWFkLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWQoMCksICIiKQorCisgICAgZGVmIHRlc3RSZWFkQ2h1bmsxMChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnJlYWQoKSBpbiBjaHVua3Mgb2YgMTAgYnl0ZXMiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHRleHQgPSAnJworICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBzdHIgPSBiejJmLnJlYWQoMTApCisgICAgICAgICAgICAgICAgaWYgbm90IHN0cjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0ZXh0ICs9IHN0cgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdFJlYWQxMDAoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5yZWFkKDEwMCkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi5yZWFkKDEwMCksIHNlbGYuVEVYVFs6MTAwXSkKKworICAgIGRlZiB0ZXN0UmVhZExpbmUoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5yZWFkbGluZSgpIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ6MmYucmVhZGxpbmUsIE5vbmUpCisgICAgICAgICAgICBzaW8gPSBTdHJpbmdJTyhzZWxmLlRFWFQpCisgICAgICAgICAgICBmb3IgbGluZSBpbiBzaW8ucmVhZGxpbmVzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWRsaW5lKCksIGxpbmUpCisKKyAgICBkZWYgdGVzdFJlYWRMaW5lcyhzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnJlYWRsaW5lcygpIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ6MmYucmVhZGxpbmVzLCBOb25lKQorICAgICAgICAgICAgc2lvID0gU3RyaW5nSU8oc2VsZi5URVhUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWRsaW5lcygpLCBzaW8ucmVhZGxpbmVzKCkpCisKKyAgICBkZWYgdGVzdEl0ZXJhdG9yKHNlbGYpOgorICAgICAgICAjICJUZXN0IGl0ZXIoQloyRmlsZSkiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIHNpbyA9IFN0cmluZ0lPKHNlbGYuVEVYVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdGVyKGJ6MmYpKSwgc2lvLnJlYWRsaW5lcygpKQorCisgICAgZGVmIHRlc3RDbG9zZWRJdGVyYXRvckRlYWRsb2NrKHNlbGYpOgorICAgICAgICAjICJUZXN0IHRoYXQgaXRlcmF0aW9uIG9uIGEgY2xvc2VkIGJ6MmZpbGUgcmVsZWFzZXMgdGhlIGxvY2suIgorICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUzMzA5CisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICBiejJmID0gQloyRmlsZShzZWxmLmZpbGVuYW1lKQorICAgICAgICBiejJmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnoyZi5uZXh0KQorICAgICAgICAjIFRoaXMgY2FsbCB3aWxsIGRlYWRsb2NrIG9mIHRoZSBhYm92ZSAubmV4dCBjYWxsIGZhaWxlZCB0bworICAgICAgICAjIHJlbGVhc2UgdGhlIGxvY2suCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ6MmYucmVhZGxpbmVzKQorCisgICAgZGVmIHRlc3RYUmVhZExpbmVzKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUueHJlYWRsaW5lcygpIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgYnoyZiA9IEJaMkZpbGUoc2VsZi5maWxlbmFtZSkKKyAgICAgICAgc2lvID0gU3RyaW5nSU8oc2VsZi5URVhUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYnoyZi54cmVhZGxpbmVzKCkpLCBzaW8ucmVhZGxpbmVzKCkpCisgICAgICAgIGJ6MmYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RVbml2ZXJzYWxOZXdsaW5lc0xGKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUucmVhZCgpIHdpdGggdW5pdmVyc2FsIG5ld2xpbmVzIChcXG4pIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgYnoyZiA9IEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgInJVIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWQoKSwgc2VsZi5URVhUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYubmV3bGluZXMsICJcbiIpCisgICAgICAgIGJ6MmYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RVbml2ZXJzYWxOZXdsaW5lc0NSTEYoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5yZWFkKCkgd2l0aCB1bml2ZXJzYWwgbmV3bGluZXMgKFxcclxcbikiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoY3JsZj0xKQorICAgICAgICBiejJmID0gQloyRmlsZShzZWxmLmZpbGVuYW1lLCAiclUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCBzZWxmLlRFWFQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi5uZXdsaW5lcywgIlxyXG4iKQorICAgICAgICBiejJmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0V3JpdGUoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS53cml0ZSgpIgorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgInciKSBhcyBiejJmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBiejJmLndyaXRlKQorICAgICAgICAgICAgYnoyZi53cml0ZShzZWxmLlRFWFQpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRlY29tcHJlc3MoZi5yZWFkKCkpLCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdFdyaXRlQ2h1bmtzMTAoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS53cml0ZSgpIHdpdGggY2h1bmtzIG9mIDEwIGJ5dGVzIgorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgInciKSBhcyBiejJmOgorICAgICAgICAgICAgbiA9IDAKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgc3RyID0gc2VsZi5URVhUW24qMTA6KG4rMSkqMTBdCisgICAgICAgICAgICAgICAgaWYgbm90IHN0cjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBiejJmLndyaXRlKHN0cikKKyAgICAgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGVjb21wcmVzcyhmLnJlYWQoKSksIHNlbGYuVEVYVCkKKworICAgIGRlZiB0ZXN0V3JpdGVMaW5lcyhzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLndyaXRlbGluZXMoKSIKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUsICJ3IikgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyZi53cml0ZWxpbmVzKQorICAgICAgICAgICAgc2lvID0gU3RyaW5nSU8oc2VsZi5URVhUKQorICAgICAgICAgICAgYnoyZi53cml0ZWxpbmVzKHNpby5yZWFkbGluZXMoKSkKKyAgICAgICAgIyBwYXRjaCAjMTUzNTUwMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiejJmLndyaXRlbGluZXMsIFsiYSJdKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kZWNvbXByZXNzKGYucmVhZCgpKSwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3RXcml0ZU1ldGhvZHNPblJlYWRPbmx5RmlsZShzZWxmKToKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUsICJ3IikgYXMgYnoyZjoKKyAgICAgICAgICAgIGJ6MmYud3JpdGUoImFiYyIpCisKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUsICJyIikgYXMgYnoyZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGJ6MmYud3JpdGUsICJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGJ6MmYud3JpdGVsaW5lcywgWyJhIl0pCisKKyAgICBkZWYgdGVzdFNlZWtGb3J3YXJkKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUuc2VlaygxNTAsIDApIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ6MmYuc2VlaykKKyAgICAgICAgICAgIGJ6MmYuc2VlaygxNTApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCBzZWxmLlRFWFRbMTUwOl0pCisKKyAgICBkZWYgdGVzdFNlZWtCYWNrd2FyZHMoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5zZWVrKC0xNTAsIDEpIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICBiejJmLnJlYWQoNTAwKQorICAgICAgICAgICAgYnoyZi5zZWVrKC0xNTAsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCBzZWxmLlRFWFRbNTAwLTE1MDpdKQorCisgICAgZGVmIHRlc3RTZWVrQmFja3dhcmRzRnJvbUVuZChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnNlZWsoLTE1MCwgMikiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIGJ6MmYuc2VlaygtMTUwLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWQoKSwgc2VsZi5URVhUW2xlbihzZWxmLlRFWFQpLTE1MDpdKQorCisgICAgZGVmIHRlc3RTZWVrUG9zdEVuZChzZWxmKToKKyAgICAgICAgIyAiVGVzdCBCWjJGaWxlLnNlZWsoMTUwMDAwKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgYnoyZi5zZWVrKDE1MDAwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnoyZi50ZWxsKCksIGxlbihzZWxmLlRFWFQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWQoKSwgIiIpCisKKyAgICBkZWYgdGVzdFNlZWtQb3N0RW5kVHdpY2Uoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRmlsZS5zZWVrKDE1MDAwMCkgdHdpY2UiCisgICAgICAgIHNlbGYuY3JlYXRlVGVtcEZpbGUoKQorICAgICAgICB3aXRoIEJaMkZpbGUoc2VsZi5maWxlbmFtZSkgYXMgYnoyZjoKKyAgICAgICAgICAgIGJ6MmYuc2VlaygxNTAwMDApCisgICAgICAgICAgICBiejJmLnNlZWsoMTUwMDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnRlbGwoKSwgbGVuKHNlbGYuVEVYVCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYucmVhZCgpLCAiIikKKworICAgIGRlZiB0ZXN0U2Vla1ByZVN0YXJ0KHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkZpbGUuc2VlaygtMTUwLCAwKSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgYnoyZi5zZWVrKC0xNTApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ6MmYudGVsbCgpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJmLnJlYWQoKSwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3RPcGVuRGVsKHNlbGYpOgorICAgICAgICAjICJUZXN0IG9wZW5pbmcgYW5kIGRlbGV0aW5nIGEgZmlsZSBtYW55IHRpbWVzIgorICAgICAgICBzZWxmLmNyZWF0ZVRlbXBGaWxlKCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMDAwKToKKyAgICAgICAgICAgIG8gPSBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpCisgICAgICAgICAgICBkZWwgbworCisgICAgZGVmIHRlc3RPcGVuTm9uZXhpc3RlbnQoc2VsZik6CisgICAgICAgICMgIlRlc3Qgb3BlbmluZyBhIG5vbmV4aXN0ZW50IGZpbGUiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIEJaMkZpbGUsICIvbm9uL2V4aXN0ZW50IikKKworICAgIGRlZiB0ZXN0TW9kZVUoc2VsZik6CisgICAgICAgICMgQnVnICMxMTk0MTgxOiBiejIuQloyRmlsZSBvcGVuZWQgZm9yIHdyaXRlIHdpdGggbW9kZSAiVSIKKyAgICAgICAgc2VsZi5jcmVhdGVUZW1wRmlsZSgpCisgICAgICAgIGJ6MmYgPSBCWjJGaWxlKHNlbGYuZmlsZW5hbWUsICJVIikKKyAgICAgICAgYnoyZi5jbG9zZSgpCisgICAgICAgIGYgPSBmaWxlKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGYuc2VlaygwLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBsZW4oc2VsZi5EQVRBKSkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdEJ1ZzExOTEwNDMoc2VsZik6CisgICAgICAgICMgcmVhZGxpbmVzKCkgZm9yIGZpbGVzIGNvbnRhaW5pbmcgbm8gbmV3bGluZQorICAgICAgICBkYXRhID0gJ0JaaDkxQVkmU1lceGQ5Ylx4ODldXHgwMFx4MDBceDAwXHgwM1x4ODBceDA0XHgwMFx4MDJceDAwXHgwY1x4MDAgXHgwMCFceDlhaDNNXHgxMzxdXHhjOVx4MTRceGUxQkNlXHg4YSV0JworICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlbmFtZSwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGJ6MmY6CisgICAgICAgICAgICBsaW5lcyA9IGJ6MmYucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWydUZXN0J10pCisgICAgICAgIHdpdGggQloyRmlsZShzZWxmLmZpbGVuYW1lKSBhcyBiejJmOgorICAgICAgICAgICAgeGxpbmVzID0gbGlzdChiejJmLnJlYWRsaW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhsaW5lcywgWydUZXN0J10pCisKKyAgICBkZWYgdGVzdENvbnRleHRQcm90b2NvbChzZWxmKToKKyAgICAgICAgIyBCWjJGaWxlIHN1cHBvcnRzIHRoZSBjb250ZXh0IG1hbmFnZW1lbnQgcHJvdG9jb2wKKyAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGIieHh4IikKKyAgICAgICAgZiA9IEJaMkZpbGUoc2VsZi5maWxlbmFtZSwgInJiIikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJfX2VudGVyX18gb24gYSBjbG9zZWQgZmlsZSBkaWRuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBCWjJGaWxlKHNlbGYuZmlsZW5hbWUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiMSAvLyAwIGRpZG4ndCByYWlzZSBhbiBleGNlcHRpb24iKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdFRocmVhZGluZyhzZWxmKToKKyAgICAgICAgIyBVc2luZyBhIEJaMkZpbGUgZnJvbSBzZXZlcmFsIHRocmVhZHMgZG9lc24ndCBkZWFkbG9jayAoaXNzdWUgIzcyMDUpLgorICAgICAgICBkYXRhID0gIjEiICogMioqMjAKKyAgICAgICAgbnRocmVhZHMgPSAxMAorICAgICAgICB3aXRoIGJ6Mi5CWjJGaWxlKHNlbGYuZmlsZW5hbWUsICd3YicpIGFzIGY6CisgICAgICAgICAgICBkZWYgY29tcCgpOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICB0aHJlYWRzID0gW3RocmVhZGluZy5UaHJlYWQodGFyZ2V0PWNvbXApIGZvciBpIGluIHJhbmdlKG50aHJlYWRzKV0KKyAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgIHQuam9pbigpCisKKyAgICBkZWYgdGVzdE1peGVkSXRlcmF0aW9uUmVhZHMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzgzOTc6IG1peGVkIGl0ZXJhdGlvbiBhbmQgcmVhZHMgc2hvdWxkIGJlIGZvcmJpZGRlbi4KKyAgICAgICAgd2l0aCBiejIuQloyRmlsZShzZWxmLmZpbGVuYW1lLCAnd2InKSBhcyBmOgorICAgICAgICAgICAgIyBUaGUgaW50ZXJuYWwgYnVmZmVyIHNpemUgaXMgaGFyZC13aXJlZCB0byA4MTkyIGJ5dGVzLCB3ZSBtdXN0CisgICAgICAgICAgICAjIHdyaXRlIG91dCBtb3JlIHRoYW4gdGhhdCBmb3IgdGhlIHRlc3QgdG8gc3RvcCBoYWxmIHRocm91Z2gKKyAgICAgICAgICAgICMgdGhlIGJ1ZmZlci4KKyAgICAgICAgICAgIGYud3JpdGUoc2VsZi5URVhUICogMTAwKQorICAgICAgICB3aXRoIGJ6Mi5CWjJGaWxlKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBuZXh0KGYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWRsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5yZWFkbGluZXMpCisKK2NsYXNzIEJaMkNvbXByZXNzb3JUZXN0KEJhc2VUZXN0KToKKyAgICBkZWYgdGVzdENvbXByZXNzKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkNvbXByZXNzb3IuY29tcHJlc3MoKS9mbHVzaCgpIgorICAgICAgICBiejJjID0gQloyQ29tcHJlc3NvcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnoyYy5jb21wcmVzcykKKyAgICAgICAgZGF0YSA9IGJ6MmMuY29tcHJlc3Moc2VsZi5URVhUKQorICAgICAgICBkYXRhICs9IGJ6MmMuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGVjb21wcmVzcyhkYXRhKSwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3RDb21wcmVzc0VtcHR5U3RyaW5nKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkNvbXByZXNzb3IuY29tcHJlc3MoKS9mbHVzaCgpIG9mIGVtcHR5IHN0cmluZyIKKyAgICAgICAgYnoyYyA9IEJaMkNvbXByZXNzb3IoKQorICAgICAgICBkYXRhID0gYnoyYy5jb21wcmVzcygnJykKKyAgICAgICAgZGF0YSArPSBiejJjLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBzZWxmLkVNUFRZX0RBVEEpCisKKyAgICBkZWYgdGVzdENvbXByZXNzQ2h1bmtzMTAoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyQ29tcHJlc3Nvci5jb21wcmVzcygpL2ZsdXNoKCkgd2l0aCBjaHVua3Mgb2YgMTAgYnl0ZXMiCisgICAgICAgIGJ6MmMgPSBCWjJDb21wcmVzc29yKCkKKyAgICAgICAgbiA9IDAKKyAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzdHIgPSBzZWxmLlRFWFRbbioxMDoobisxKSoxMF0KKyAgICAgICAgICAgIGlmIG5vdCBzdHI6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGRhdGEgKz0gYnoyYy5jb21wcmVzcyhzdHIpCisgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgZGF0YSArPSBiejJjLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRlY29tcHJlc3MoZGF0YSksIHNlbGYuVEVYVCkKKworICAgIEBiaWdtZW10ZXN0KF80RywgbWVtdXNlPTEuMjUpCisgICAgZGVmIHRlc3RCaWdtZW0oc2VsZiwgc2l6ZSk6CisgICAgICAgIHRleHQgPSAiYSIgKiBzaXplCisgICAgICAgIGJ6MmMgPSBiejIuQloyQ29tcHJlc3NvcigpCisgICAgICAgIGRhdGEgPSBiejJjLmNvbXByZXNzKHRleHQpICsgYnoyYy5mbHVzaCgpCisgICAgICAgIGRlbCB0ZXh0CisgICAgICAgIHRleHQgPSBzZWxmLmRlY29tcHJlc3MoZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGV4dCksIHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zdHJpcCgiYSIpLCAiIikKKworCitjbGFzcyBCWjJEZWNvbXByZXNzb3JUZXN0KEJhc2VUZXN0KToKKyAgICBkZWYgdGVzdF9Db25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBCWjJEZWNvbXByZXNzb3IsIDQyKQorCisgICAgZGVmIHRlc3REZWNvbXByZXNzKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkRlY29tcHJlc3Nvci5kZWNvbXByZXNzKCkiCisgICAgICAgIGJ6MmQgPSBCWjJEZWNvbXByZXNzb3IoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ6MmQuZGVjb21wcmVzcykKKyAgICAgICAgdGV4dCA9IGJ6MmQuZGVjb21wcmVzcyhzZWxmLkRBVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgc2VsZi5URVhUKQorCisgICAgZGVmIHRlc3REZWNvbXByZXNzQ2h1bmtzMTAoc2VsZik6CisgICAgICAgICMgIlRlc3QgQloyRGVjb21wcmVzc29yLmRlY29tcHJlc3MoKSB3aXRoIGNodW5rcyBvZiAxMCBieXRlcyIKKyAgICAgICAgYnoyZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIHRleHQgPSAnJworICAgICAgICBuID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgc3RyID0gc2VsZi5EQVRBW24qMTA6KG4rMSkqMTBdCisgICAgICAgICAgICBpZiBub3Qgc3RyOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0ZXh0ICs9IGJ6MmQuZGVjb21wcmVzcyhzdHIpCisgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzZWxmLlRFWFQpCisKKyAgICBkZWYgdGVzdERlY29tcHJlc3NVbnVzZWREYXRhKHNlbGYpOgorICAgICAgICAjICJUZXN0IEJaMkRlY29tcHJlc3Nvci5kZWNvbXByZXNzKCkgd2l0aCB1bnVzZWQgZGF0YSIKKyAgICAgICAgYnoyZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIHVudXNlZF9kYXRhID0gInRoaXMgaXMgdW51c2VkIGRhdGEiCisgICAgICAgIHRleHQgPSBiejJkLmRlY29tcHJlc3Moc2VsZi5EQVRBK3VudXNlZF9kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHNlbGYuVEVYVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiejJkLnVudXNlZF9kYXRhLCB1bnVzZWRfZGF0YSkKKworICAgIGRlZiB0ZXN0RU9GRXJyb3Ioc2VsZik6CisgICAgICAgICMgIkNhbGxpbmcgQloyRGVjb21wcmVzc29yLmRlY29tcHJlc3MoKSBhZnRlciBFT1MgbXVzdCByYWlzZSBFT0ZFcnJvciIKKyAgICAgICAgYnoyZCA9IEJaMkRlY29tcHJlc3NvcigpCisgICAgICAgIHRleHQgPSBiejJkLmRlY29tcHJlc3Moc2VsZi5EQVRBKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgYnoyZC5kZWNvbXByZXNzLCAiYW55dGhpbmciKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgYnoyZC5kZWNvbXByZXNzLCAiIikKKworICAgIEBiaWdtZW10ZXN0KF80RywgbWVtdXNlPTEuMjUpCisgICAgZGVmIHRlc3RCaWdtZW0oc2VsZiwgc2l6ZSk6CisgICAgICAgICMgSXNzdWUgIzE0Mzk4OiBkZWNvbXByZXNzaW9uIGZhaWxzIHdoZW4gb3V0cHV0IGRhdGEgaXMgPj0yR0IuCisgICAgICAgIGlmIHNpemUgPCBfNEc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJUZXN0IG5lZWRzIDVHQiBvZiBtZW1vcnkgdG8gcnVuLiIpCisgICAgICAgIGNvbXByZXNzZWQgPSBiejIuY29tcHJlc3MoImEiICogXzRHKQorICAgICAgICB0ZXh0ID0gYnoyLkJaMkRlY29tcHJlc3NvcigpLmRlY29tcHJlc3MoY29tcHJlc3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGV4dCksIF80RykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LnN0cmlwKCJhIiksICIiKQorCisKK2NsYXNzIEZ1bmNUZXN0KEJhc2VUZXN0KToKKyAgICAiVGVzdCBtb2R1bGUgZnVuY3Rpb25zIgorCisgICAgZGVmIHRlc3RDb21wcmVzcyhzZWxmKToKKyAgICAgICAgIyAiVGVzdCBjb21wcmVzcygpIGZ1bmN0aW9uIgorICAgICAgICBkYXRhID0gYnoyLmNvbXByZXNzKHNlbGYuVEVYVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRlY29tcHJlc3MoZGF0YSksIHNlbGYuVEVYVCkKKworICAgIGRlZiB0ZXN0Q29tcHJlc3NFbXB0eVN0cmluZyhzZWxmKToKKyAgICAgICAgIyAiVGVzdCBjb21wcmVzcygpIG9mIGVtcHR5IHN0cmluZyIKKyAgICAgICAgdGV4dCA9IGJ6Mi5jb21wcmVzcygnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBzZWxmLkVNUFRZX0RBVEEpCisKKyAgICBkZWYgdGVzdERlY29tcHJlc3Moc2VsZik6CisgICAgICAgICMgIlRlc3QgZGVjb21wcmVzcygpIGZ1bmN0aW9uIgorICAgICAgICB0ZXh0ID0gYnoyLmRlY29tcHJlc3Moc2VsZi5EQVRBKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHNlbGYuVEVYVCkKKworICAgIGRlZiB0ZXN0RGVjb21wcmVzc0VtcHR5KHNlbGYpOgorICAgICAgICAjICJUZXN0IGRlY29tcHJlc3MoKSBmdW5jdGlvbiB3aXRoIGVtcHR5IHN0cmluZyIKKyAgICAgICAgdGV4dCA9IGJ6Mi5kZWNvbXByZXNzKCIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsICIiKQorCisgICAgZGVmIHRlc3REZWNvbXByZXNzVG9FbXB0eVN0cmluZyhzZWxmKToKKyAgICAgICAgIyAiVGVzdCBkZWNvbXByZXNzKCkgb2YgbWluaW1hbCBiejIgZGF0YSB0byBlbXB0eSBzdHJpbmciCisgICAgICAgIHRleHQgPSBiejIuZGVjb21wcmVzcyhzZWxmLkVNUFRZX0RBVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgJycpCisKKyAgICBkZWYgdGVzdERlY29tcHJlc3NJbmNvbXBsZXRlKHNlbGYpOgorICAgICAgICAjICJUZXN0IGRlY29tcHJlc3MoKSBmdW5jdGlvbiB3aXRoIGluY29tcGxldGUgZGF0YSIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnoyLmRlY29tcHJlc3MsIHNlbGYuREFUQVs6LTEwXSkKKworICAgIEBiaWdtZW10ZXN0KF80RywgbWVtdXNlPTEuMjUpCisgICAgZGVmIHRlc3RDb21wcmVzc0JpZ21lbShzZWxmLCBzaXplKToKKyAgICAgICAgdGV4dCA9ICJhIiAqIHNpemUKKyAgICAgICAgZGF0YSA9IGJ6Mi5jb21wcmVzcyh0ZXh0KQorICAgICAgICBkZWwgdGV4dAorICAgICAgICB0ZXh0ID0gc2VsZi5kZWNvbXByZXNzKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRleHQpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuc3RyaXAoImEiKSwgIiIpCisKKyAgICBAYmlnbWVtdGVzdChfNEcsIG1lbXVzZT0xLjI1KQorICAgIGRlZiB0ZXN0RGVjb21wcmVzc0JpZ21lbShzZWxmLCBzaXplKToKKyAgICAgICAgIyBJc3N1ZSAjMTQzOTg6IGRlY29tcHJlc3Npb24gZmFpbHMgd2hlbiBvdXRwdXQgZGF0YSBpcyA+PTJHQi4KKyAgICAgICAgaWYgc2l6ZSA8IF80RzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIlRlc3QgbmVlZHMgNUdCIG9mIG1lbW9yeSB0byBydW4uIikKKyAgICAgICAgY29tcHJlc3NlZCA9IGJ6Mi5jb21wcmVzcygiYSIgKiBfNEcpCisgICAgICAgIHRleHQgPSBiejIuZGVjb21wcmVzcyhjb21wcmVzc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXh0KSwgXzRHKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQuc3RyaXAoImEiKSwgIiIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBCWjJGaWxlVGVzdCwKKyAgICAgICAgQloyQ29tcHJlc3NvclRlc3QsCisgICAgICAgIEJaMkRlY29tcHJlc3NvclRlc3QsCisgICAgICAgIEZ1bmNUZXN0CisgICAgKQorICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQorCisjIHZpbTp0cz00OnN3PTQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iejIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjVjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iejIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2J6Mi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iejIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNjVjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9iejIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmYjc2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CkBAIC0wLDAgKzEsNDc1IEBACitpbXBvcnQgY2FsZW5kYXIKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IGxvY2FsZQoraW1wb3J0IGRhdGV0aW1lCisKKworcmVzdWx0XzIwMDRfdGV4dCA9ICIiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDQKKworICAgICAgSmFudWFyeSAgICAgICAgICAgICAgICAgICBGZWJydWFyeSAgICAgICAgICAgICAgICAgICBNYXJjaAorTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1CisgICAgICAgICAgMSAgMiAgMyAgNCAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgIDEgIDIgIDMgIDQgIDUgIDYgIDcKKyA1ICA2ICA3ICA4ICA5IDEwIDExICAgICAgIDIgIDMgIDQgIDUgIDYgIDcgIDggICAgICAgOCAgOSAxMCAxMSAxMiAxMyAxNAorMTIgMTMgMTQgMTUgMTYgMTcgMTggICAgICAgOSAxMCAxMSAxMiAxMyAxNCAxNSAgICAgIDE1IDE2IDE3IDE4IDE5IDIwIDIxCisxOSAyMCAyMSAyMiAyMyAyNCAyNSAgICAgIDE2IDE3IDE4IDE5IDIwIDIxIDIyICAgICAgMjIgMjMgMjQgMjUgMjYgMjcgMjgKKzI2IDI3IDI4IDI5IDMwIDMxICAgICAgICAgMjMgMjQgMjUgMjYgMjcgMjggMjkgICAgICAyOSAzMCAzMQorCisgICAgICAgQXByaWwgICAgICAgICAgICAgICAgICAgICAgTWF5ICAgICAgICAgICAgICAgICAgICAgICBKdW5lCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAxICAyICAzICA0ICAgICAgICAgICAgICAgICAgICAgIDEgIDIgICAgICAgICAgMSAgMiAgMyAgNCAgNSAgNgorIDUgIDYgIDcgIDggIDkgMTAgMTEgICAgICAgMyAgNCAgNSAgNiAgNyAgOCAgOSAgICAgICA3ICA4ICA5IDEwIDExIDEyIDEzCisxMiAxMyAxNCAxNSAxNiAxNyAxOCAgICAgIDEwIDExIDEyIDEzIDE0IDE1IDE2ICAgICAgMTQgMTUgMTYgMTcgMTggMTkgMjAKKzE5IDIwIDIxIDIyIDIzIDI0IDI1ICAgICAgMTcgMTggMTkgMjAgMjEgMjIgMjMgICAgICAyMSAyMiAyMyAyNCAyNSAyNiAyNworMjYgMjcgMjggMjkgMzAgICAgICAgICAgICAyNCAyNSAyNiAyNyAyOCAyOSAzMCAgICAgIDI4IDI5IDMwCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMxCisKKyAgICAgICAgSnVseSAgICAgICAgICAgICAgICAgICAgIEF1Z3VzdCAgICAgICAgICAgICAgICAgIFNlcHRlbWJlcgorTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1CisgICAgICAgICAgMSAgMiAgMyAgNCAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgIDEgIDIgIDMgIDQgIDUKKyA1ICA2ICA3ICA4ICA5IDEwIDExICAgICAgIDIgIDMgIDQgIDUgIDYgIDcgIDggICAgICAgNiAgNyAgOCAgOSAxMCAxMSAxMgorMTIgMTMgMTQgMTUgMTYgMTcgMTggICAgICAgOSAxMCAxMSAxMiAxMyAxNCAxNSAgICAgIDEzIDE0IDE1IDE2IDE3IDE4IDE5CisxOSAyMCAyMSAyMiAyMyAyNCAyNSAgICAgIDE2IDE3IDE4IDE5IDIwIDIxIDIyICAgICAgMjAgMjEgMjIgMjMgMjQgMjUgMjYKKzI2IDI3IDI4IDI5IDMwIDMxICAgICAgICAgMjMgMjQgMjUgMjYgMjcgMjggMjkgICAgICAyNyAyOCAyOSAzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAzMCAzMQorCisgICAgICBPY3RvYmVyICAgICAgICAgICAgICAgICAgIE5vdmVtYmVyICAgICAgICAgICAgICAgICAgRGVjZW1iZXIKK01vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdQorICAgICAgICAgICAgIDEgIDIgIDMgICAgICAgMSAgMiAgMyAgNCAgNSAgNiAgNyAgICAgICAgICAgICAxICAyICAzICA0ICA1CisgNCAgNSAgNiAgNyAgOCAgOSAxMCAgICAgICA4ICA5IDEwIDExIDEyIDEzIDE0ICAgICAgIDYgIDcgIDggIDkgMTAgMTEgMTIKKzExIDEyIDEzIDE0IDE1IDE2IDE3ICAgICAgMTUgMTYgMTcgMTggMTkgMjAgMjEgICAgICAxMyAxNCAxNSAxNiAxNyAxOCAxOQorMTggMTkgMjAgMjEgMjIgMjMgMjQgICAgICAyMiAyMyAyNCAyNSAyNiAyNyAyOCAgICAgIDIwIDIxIDIyIDIzIDI0IDI1IDI2CisyNSAyNiAyNyAyOCAyOSAzMCAzMSAgICAgIDI5IDMwICAgICAgICAgICAgICAgICAgICAgMjcgMjggMjkgMzAgMzEKKyIiIgorCityZXN1bHRfMjAwNF9odG1sID0gIiIiCis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJhc2NpaSI/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWFzY2lpIiAvPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iY2FsZW5kYXIuY3NzIiAvPgorPHRpdGxlPkNhbGVuZGFyIGZvciAyMDA0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ieWVhciI+Cis8dHI+PHRoIGNvbHNwYW49IjMiIGNsYXNzPSJ5ZWFyIj4yMDA0PC90aD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkphbnVhcnk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InRodSI+MTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zPC90ZD48dGQgY2xhc3M9InN1biI+NDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjY8L3RkPjx0ZCBjbGFzcz0id2VkIj43PC90ZD48dGQgY2xhc3M9InRodSI+ODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjExPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEzPC90ZD48dGQgY2xhc3M9IndlZCI+MTQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE2PC90ZD48dGQgY2xhc3M9InNhdCI+MTc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTk8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIxPC90ZD48dGQgY2xhc3M9InRodSI+MjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI0PC90ZD48dGQgY2xhc3M9InN1biI+MjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI2PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjc8L3RkPjx0ZCBjbGFzcz0id2VkIj4yODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI5PC90ZD48dGQgY2xhc3M9ImZyaSI+MzA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5GZWJydWFyeTwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yPC90ZD48dGQgY2xhc3M9InR1ZSI+MzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij41PC90ZD48dGQgY2xhc3M9ImZyaSI+NjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjc8L3RkPjx0ZCBjbGFzcz0ic3VuIj44PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj45PC90ZD48dGQgY2xhc3M9InR1ZSI+MTA8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjEyPC90ZD48dGQgY2xhc3M9ImZyaSI+MTM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE3PC90ZD48dGQgY2xhc3M9IndlZCI+MTg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIwPC90ZD48dGQgY2xhc3M9InNhdCI+MjE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjM8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI1PC90ZD48dGQgY2xhc3M9InRodSI+MjY8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI4PC90ZD48dGQgY2xhc3M9InN1biI+Mjk8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPk1hcmNoPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE8L3RkPjx0ZCBjbGFzcz0idHVlIj4yPC90ZD48dGQgY2xhc3M9IndlZCI+MzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjQ8L3RkPjx0ZCBjbGFzcz0iZnJpIj41PC90ZD48dGQgY2xhc3M9InNhdCI+NjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjc8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjg8L3RkPjx0ZCBjbGFzcz0idHVlIj45PC90ZD48dGQgY2xhc3M9IndlZCI+MTA8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEyPC90ZD48dGQgY2xhc3M9InNhdCI+MTM8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTU8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE3PC90ZD48dGQgY2xhc3M9InRodSI+MTg8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xOTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIwPC90ZD48dGQgY2xhc3M9InN1biI+MjE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIyPC90ZD48dGQgY2xhc3M9InR1ZSI+MjM8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI1PC90ZD48dGQgY2xhc3M9ImZyaSI+MjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI4PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yOTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjMwPC90ZD48dGQgY2xhc3M9IndlZCI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjwvdHI+PHRyPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+QXByaWw8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InRodSI+MTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zPC90ZD48dGQgY2xhc3M9InN1biI+NDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjY8L3RkPjx0ZCBjbGFzcz0id2VkIj43PC90ZD48dGQgY2xhc3M9InRodSI+ODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjExPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEzPC90ZD48dGQgY2xhc3M9IndlZCI+MTQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE2PC90ZD48dGQgY2xhc3M9InNhdCI+MTc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTk8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIxPC90ZD48dGQgY2xhc3M9InRodSI+MjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI0PC90ZD48dGQgY2xhc3M9InN1biI+MjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI2PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjc8L3RkPjx0ZCBjbGFzcz0id2VkIj4yODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI5PC90ZD48dGQgY2xhc3M9ImZyaSI+MzA8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5NYXk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4zPC90ZD48dGQgY2xhc3M9InR1ZSI+NDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjU8L3RkPjx0ZCBjbGFzcz0idGh1Ij42PC90ZD48dGQgY2xhc3M9ImZyaSI+NzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjg8L3RkPjx0ZCBjbGFzcz0ic3VuIj45PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjExPC90ZD48dGQgY2xhc3M9IndlZCI+MTI8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE0PC90ZD48dGQgY2xhc3M9InNhdCI+MTU8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTc8L3RkPjx0ZCBjbGFzcz0idHVlIj4xODwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE5PC90ZD48dGQgY2xhc3M9InRodSI+MjA8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIyPC90ZD48dGQgY2xhc3M9InN1biI+MjM8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI0PC90ZD48dGQgY2xhc3M9InR1ZSI+MjU8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI3PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjg8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yOTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjMwPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+SnVuZTwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE8L3RkPjx0ZCBjbGFzcz0id2VkIj4yPC90ZD48dGQgY2xhc3M9InRodSI+MzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjQ8L3RkPjx0ZCBjbGFzcz0ic2F0Ij41PC90ZD48dGQgY2xhc3M9InN1biI+NjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjg8L3RkPjx0ZCBjbGFzcz0id2VkIj45PC90ZD48dGQgY2xhc3M9InRodSI+MTA8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEyPC90ZD48dGQgY2xhc3M9InN1biI+MTM8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE0PC90ZD48dGQgY2xhc3M9InR1ZSI+MTU8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE3PC90ZD48dGQgY2xhc3M9ImZyaSI+MTg8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xOTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIwPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIyPC90ZD48dGQgY2xhc3M9IndlZCI+MjM8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI1PC90ZD48dGQgY2xhc3M9InNhdCI+MjY8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjg8L3RkPjx0ZCBjbGFzcz0idHVlIj4yOTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjMwPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkp1bHk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InRodSI+MTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zPC90ZD48dGQgY2xhc3M9InN1biI+NDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjY8L3RkPjx0ZCBjbGFzcz0id2VkIj43PC90ZD48dGQgY2xhc3M9InRodSI+ODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjExPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEzPC90ZD48dGQgY2xhc3M9IndlZCI+MTQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE2PC90ZD48dGQgY2xhc3M9InNhdCI+MTc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTk8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIxPC90ZD48dGQgY2xhc3M9InRodSI+MjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI0PC90ZD48dGQgY2xhc3M9InN1biI+MjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI2PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjc8L3RkPjx0ZCBjbGFzcz0id2VkIj4yODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI5PC90ZD48dGQgY2xhc3M9ImZyaSI+MzA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5BdWd1c3Q8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InN1biI+MTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjM8L3RkPjx0ZCBjbGFzcz0id2VkIj40PC90ZD48dGQgY2xhc3M9InRodSI+NTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij43PC90ZD48dGQgY2xhc3M9InN1biI+ODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+OTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEwPC90ZD48dGQgY2xhc3M9IndlZCI+MTE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEzPC90ZD48dGQgY2xhc3M9InNhdCI+MTQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTY8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE4PC90ZD48dGQgY2xhc3M9InRodSI+MTk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIxPC90ZD48dGQgY2xhc3M9InN1biI+MjI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIzPC90ZD48dGQgY2xhc3M9InR1ZSI+MjQ8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI2PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI5PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4zMDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+U2VwdGVtYmVyPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0id2VkIj4xPC90ZD48dGQgY2xhc3M9InRodSI+MjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij40PC90ZD48dGQgY2xhc3M9InN1biI+NTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjc8L3RkPjx0ZCBjbGFzcz0id2VkIj44PC90ZD48dGQgY2xhc3M9InRodSI+OTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEwPC90ZD48dGQgY2xhc3M9InNhdCI+MTE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTM8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE1PC90ZD48dGQgY2xhc3M9InRodSI+MTY8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE4PC90ZD48dGQgY2xhc3M9InN1biI+MTk8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIwPC90ZD48dGQgY2xhc3M9InR1ZSI+MjE8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIzPC90ZD48dGQgY2xhc3M9ImZyaSI+MjQ8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI2PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI4PC90ZD48dGQgY2xhc3M9IndlZCI+Mjk8L3RkPjx0ZCBjbGFzcz0idGh1Ij4zMDwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjwvdHI+PHRyPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+T2N0b2JlcjwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yPC90ZD48dGQgY2xhc3M9InN1biI+MzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjU8L3RkPjx0ZCBjbGFzcz0id2VkIj42PC90ZD48dGQgY2xhc3M9InRodSI+NzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjg8L3RkPjx0ZCBjbGFzcz0ic2F0Ij45PC90ZD48dGQgY2xhc3M9InN1biI+MTA8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjExPC90ZD48dGQgY2xhc3M9InR1ZSI+MTI8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE0PC90ZD48dGQgY2xhc3M9ImZyaSI+MTU8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE3PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xODwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE5PC90ZD48dGQgY2xhc3M9IndlZCI+MjA8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIyPC90ZD48dGQgY2xhc3M9InNhdCI+MjM8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjU8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI3PC90ZD48dGQgY2xhc3M9InRodSI+Mjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yOTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjMwPC90ZD48dGQgY2xhc3M9InN1biI+MzE8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPk5vdmVtYmVyPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE8L3RkPjx0ZCBjbGFzcz0idHVlIj4yPC90ZD48dGQgY2xhc3M9IndlZCI+MzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjQ8L3RkPjx0ZCBjbGFzcz0iZnJpIj41PC90ZD48dGQgY2xhc3M9InNhdCI+NjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjc8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjg8L3RkPjx0ZCBjbGFzcz0idHVlIj45PC90ZD48dGQgY2xhc3M9IndlZCI+MTA8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEyPC90ZD48dGQgY2xhc3M9InNhdCI+MTM8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTU8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE3PC90ZD48dGQgY2xhc3M9InRodSI+MTg8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xOTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIwPC90ZD48dGQgY2xhc3M9InN1biI+MjE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIyPC90ZD48dGQgY2xhc3M9InR1ZSI+MjM8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI1PC90ZD48dGQgY2xhc3M9ImZyaSI+MjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI4PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yOTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjMwPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+RGVjZW1iZXI8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yPC90ZD48dGQgY2xhc3M9ImZyaSI+MzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj41PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj42PC90ZD48dGQgY2xhc3M9InR1ZSI+NzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij45PC90ZD48dGQgY2xhc3M9ImZyaSI+MTA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjEyPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE0PC90ZD48dGQgY2xhc3M9IndlZCI+MTU8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE3PC90ZD48dGQgY2xhc3M9InNhdCI+MTg8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xOTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjA8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIyPC90ZD48dGQgY2xhc3M9InRodSI+MjM8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI1PC90ZD48dGQgY2xhc3M9InN1biI+MjY8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI3PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjg8L3RkPjx0ZCBjbGFzcz0id2VkIj4yOTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjMwPC90ZD48dGQgY2xhc3M9ImZyaSI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PC90cj48L3RhYmxlPjwvYm9keT4KKzwvaHRtbD4KKyIiIgorCisKK2NsYXNzIE91dHB1dFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbm9ybWFsaXplX2NhbGVuZGFyKHNlbGYsIHMpOgorICAgICAgICAjIEZpbHRlcnMgb3V0IGxvY2FsZSBkZXBlbmRlbnQgc3RyaW5ncworICAgICAgICBkZWYgbmVpdGhlcnNwYWNlbm9yZGlnaXQoYyk6CisgICAgICAgICAgICByZXR1cm4gbm90IGMuaXNzcGFjZSgpIGFuZCBub3QgYy5pc2RpZ2l0KCkKKworICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIHMuc3BsaXRsaW5lcyhGYWxzZSk6CisgICAgICAgICAgICAjIERyb3AgdGV4dHMsIGFzIHRoZXkgYXJlIGxvY2FsZSBkZXBlbmRlbnQKKyAgICAgICAgICAgIGlmIGxpbmUgYW5kIG5vdCBmaWx0ZXIobmVpdGhlcnNwYWNlbm9yZGlnaXQsIGxpbmUpOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICByZXR1cm4gbGluZXMKKworICAgIGRlZiB0ZXN0X291dHB1dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYubm9ybWFsaXplX2NhbGVuZGFyKGNhbGVuZGFyLmNhbGVuZGFyKDIwMDQpKSwKKyAgICAgICAgICAgIHNlbGYubm9ybWFsaXplX2NhbGVuZGFyKHJlc3VsdF8yMDA0X3RleHQpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X291dHB1dF90ZXh0Y2FsZW5kYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjYWxlbmRhci5UZXh0Q2FsZW5kYXIoKS5mb3JtYXR5ZWFyKDIwMDQpLnN0cmlwKCksCisgICAgICAgICAgICByZXN1bHRfMjAwNF90ZXh0LnN0cmlwKCkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0X2h0bWxjYWxlbmRhcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNhbGVuZGFyLkhUTUxDYWxlbmRhcigpLmZvcm1hdHllYXJwYWdlKDIwMDQpLnN0cmlwKCksCisgICAgICAgICAgICByZXN1bHRfMjAwNF9odG1sLnN0cmlwKCkKKyAgICAgICAgKQorCisKK2NsYXNzIENhbGVuZGFyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2lzbGVhcChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgcmV0dXJuIGlzIHJpZ2h0IGZvciBhIGZldyB5ZWFycywgYW5kCisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlIHJldHVybiB2YWx1ZXMgYXJlIDEgb3IgMCwgbm90IGp1c3QgdHJ1ZSBvcgorICAgICAgICAjIGZhbHNlIChzZWUgU0YgYnVnICM0ODU3OTQpLiAgU3BlY2lmaWMgYWRkaXRpb25hbCB0ZXN0cyBtYXkKKyAgICAgICAgIyBiZSBhcHByb3ByaWF0ZTsgdGhpcyB0ZXN0cyBhIHNpbmdsZSAiY3ljbGUiLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmlzbGVhcCgyMDAwKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5pc2xlYXAoMjAwMSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsZW5kYXIuaXNsZWFwKDIwMDIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmlzbGVhcCgyMDAzKSwgMCkKKworICAgIGRlZiB0ZXN0X3NldGZpcnN0d2Vla2RheShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2FsZW5kYXIuc2V0Zmlyc3R3ZWVrZGF5LCAnZmxhYmJlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNhbGVuZGFyLnNldGZpcnN0d2Vla2RheSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNhbGVuZGFyLnNldGZpcnN0d2Vla2RheSwgMjAwKQorICAgICAgICBvcmlnID0gY2FsZW5kYXIuZmlyc3R3ZWVrZGF5KCkKKyAgICAgICAgY2FsZW5kYXIuc2V0Zmlyc3R3ZWVrZGF5KGNhbGVuZGFyLlNVTkRBWSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5maXJzdHdlZWtkYXkoKSwgY2FsZW5kYXIuU1VOREFZKQorICAgICAgICBjYWxlbmRhci5zZXRmaXJzdHdlZWtkYXkoY2FsZW5kYXIuTU9OREFZKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGVuZGFyLmZpcnN0d2Vla2RheSgpLCBjYWxlbmRhci5NT05EQVkpCisgICAgICAgIGNhbGVuZGFyLnNldGZpcnN0d2Vla2RheShvcmlnKQorCisgICAgZGVmIHRlc3RfZW51bWVyYXRld2Vla2RheXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGNhbGVuZGFyLmRheV9hYmJyLl9fZ2V0aXRlbV9fLCAtMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGNhbGVuZGFyLmRheV9uYW1lLl9fZ2V0aXRlbV9fLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oW2QgZm9yIGQgaW4gY2FsZW5kYXIuZGF5X2FiYnJdKSwgNykKKworICAgIGRlZiB0ZXN0X2RheXMoc2VsZik6CisgICAgICAgIGZvciBhdHRyIGluICJkYXlfbmFtZSIsICJkYXlfYWJiciI6CisgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoY2FsZW5kYXIsIGF0dHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZSksIDcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZVs6XSksIDcpCisgICAgICAgICAgICAjIGVuc3VyZSB0aGV5J3JlIGFsbCB1bmlxdWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldCh2YWx1ZSkpLCA3KQorICAgICAgICAgICAgIyB2ZXJpZnkgaXQgImFjdHMgbGlrZSBhIHNlcXVlbmNlIiBpbiB0d28gZm9ybXMgb2YgaXRlcmF0aW9uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWzo6LTFdLCBsaXN0KHJldmVyc2VkKHZhbHVlKSkpCisKKyAgICBkZWYgdGVzdF9tb250aHMoc2VsZik6CisgICAgICAgIGZvciBhdHRyIGluICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiOgorICAgICAgICAgICAgdmFsdWUgPSBnZXRhdHRyKGNhbGVuZGFyLCBhdHRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWUpLCAxMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlWzpdKSwgMTMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWzBdLCAiIikKKyAgICAgICAgICAgICMgZW5zdXJlIHRoZXkncmUgYWxsIHVuaXF1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0KHZhbHVlKSksIDEzKQorICAgICAgICAgICAgIyB2ZXJpZnkgaXQgImFjdHMgbGlrZSBhIHNlcXVlbmNlIiBpbiB0d28gZm9ybXMgb2YgaXRlcmF0aW9uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWzo6LTFdLCBsaXN0KHJldmVyc2VkKHZhbHVlKSkpCisKKyAgICBkZWYgdGVzdF9sb2NhbGVjYWxlbmRhcnMoc2VsZik6CisgICAgICAgICMgZW5zdXJlIHRoYXQgTG9jYWxle1RleHQsSFRNTH1DYWxlbmRhciByZXNldHMgdGhlIGxvY2FsZSBwcm9wZXJseQorICAgICAgICAjIChpdCBpcyBzdGlsbCBub3QgdGhyZWFkLXNhZmUgdGhvdWdoKQorICAgICAgICBvbGRfb2N0b2JlciA9IGNhbGVuZGFyLlRleHRDYWxlbmRhcigpLmZvcm1hdG1vbnRobmFtZSgyMDEwLCAxMCwgMTApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNhbCA9IGNhbGVuZGFyLkxvY2FsZVRleHRDYWxlbmRhcihsb2NhbGU9JycpCisgICAgICAgICAgICBsb2NhbF93ZWVrZGF5ID0gY2FsLmZvcm1hdHdlZWtkYXkoMSwgMTApCisgICAgICAgICAgICBsb2NhbF9tb250aCA9IGNhbC5mb3JtYXRtb250aG5hbWUoMjAxMCwgMTAsIDEwKQorICAgICAgICBleGNlcHQgbG9jYWxlLkVycm9yOgorICAgICAgICAgICAgIyBjYW5ub3Qgc2V0IHRoZSBzeXN0ZW0gZGVmYXVsdCBsb2NhbGUgLS0gc2tpcCByZXN0IG9mIHRlc3QKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdjYW5ub3Qgc2V0IHRoZSBzeXN0ZW0gZGVmYXVsdCBsb2NhbGUnKQorICAgICAgICAjIHNob3VsZCBiZSBlbmNvZGFibGUKKyAgICAgICAgbG9jYWxfd2Vla2RheS5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgbG9jYWxfbW9udGguZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvY2FsX3dlZWtkYXkpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKGxvY2FsX21vbnRoKSwgMTApCisgICAgICAgIGNhbCA9IGNhbGVuZGFyLkxvY2FsZUhUTUxDYWxlbmRhcihsb2NhbGU9JycpCisgICAgICAgIGxvY2FsX3dlZWtkYXkgPSBjYWwuZm9ybWF0d2Vla2RheSgxKQorICAgICAgICBsb2NhbF9tb250aCA9IGNhbC5mb3JtYXRtb250aG5hbWUoMjAxMCwgMTApCisgICAgICAgICMgc2hvdWxkIGJlIGVuY29kYWJsZQorICAgICAgICBsb2NhbF93ZWVrZGF5LmVuY29kZSgndXRmLTgnKQorICAgICAgICBsb2NhbF9tb250aC5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgbmV3X29jdG9iZXIgPSBjYWxlbmRhci5UZXh0Q2FsZW5kYXIoKS5mb3JtYXRtb250aG5hbWUoMjAxMCwgMTAsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9sZF9vY3RvYmVyLCBuZXdfb2N0b2JlcikKKworICAgIGRlZiB0ZXN0X2l0ZXJtb250aGRhdGVzKHNlbGYpOgorICAgICAgICAjIGVuc3VyZSBpdGVybW9udGhkYXRlcyBkb2Vzbid0IG92ZXJmbG93IGFmdGVyIGRhdGV0aW1lLk1BWFlFQVIKKyAgICAgICAgIyBzZWUgIzE1NDIxCisgICAgICAgIGxpc3QoY2FsZW5kYXIuQ2FsZW5kYXIoKS5pdGVybW9udGhkYXRlcyhkYXRldGltZS5NQVhZRUFSLCAxMikpCisKKworY2xhc3MgTW9udGhDYWxlbmRhclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYub2xkZmlyc3R3ZWVrZGF5ID0gY2FsZW5kYXIuZmlyc3R3ZWVrZGF5KCkKKyAgICAgICAgY2FsZW5kYXIuc2V0Zmlyc3R3ZWVrZGF5KHNlbGYuZmlyc3R3ZWVrZGF5KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBjYWxlbmRhci5zZXRmaXJzdHdlZWtkYXkoc2VsZi5vbGRmaXJzdHdlZWtkYXkpCisKKyAgICBkZWYgY2hlY2tfd2Vla3Moc2VsZiwgeWVhciwgbW9udGgsIHdlZWtzKToKKyAgICAgICAgY2FsID0gY2FsZW5kYXIubW9udGhjYWxlbmRhcih5ZWFyLCBtb250aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY2FsKSwgbGVuKHdlZWtzKSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbih3ZWVrcykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWVrc1tpXSwgc3VtKGRheSAhPSAwIGZvciBkYXkgaW4gY2FsW2ldKSkKKworCitjbGFzcyBNb25kYXlUZXN0Q2FzZShNb250aENhbGVuZGFyVGVzdENhc2UpOgorICAgIGZpcnN0d2Vla2RheSA9IGNhbGVuZGFyLk1PTkRBWQorCisgICAgZGVmIHRlc3RfZmVicnVhcnkoc2VsZik6CisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gbW9uZGF5ICg3KzcrNys3IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5OSwgMiwgKDcsIDcsIDcsIDcpKQorCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gdHVlc2RheSAoNis3KzcrNysxIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNSwgMiwgKDYsIDcsIDcsIDcsIDEpKQorCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gc3VuZGF5ICgxKzcrNys3KzYgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTg3LCAyLCAoMSwgNywgNywgNywgNikpCisKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMSBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODgsIDIsICg3LCA3LCA3LCA3LCAxKSkKKworICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHR1ZXNkYXkgKDYrNys3KzcrMiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NzIsIDIsICg2LCA3LCA3LCA3LCAyKSkKKworICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAwNCwgMiwgKDEsIDcsIDcsIDcsIDcpKQorCisgICAgZGVmIHRlc3RfYXByaWwoc2VsZik6CisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gbW9uZGF5ICg3KzcrNys3KzIgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTM1LCA0LCAoNywgNywgNywgNywgMikpCisKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzMgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTc1LCA0LCAoNiwgNywgNywgNywgMykpCisKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzdW5kYXkgKDErNys3KzcrNysxIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk0NSwgNCwgKDEsIDcsIDcsIDcsIDcsIDEpKQorCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gc2F0dXJkYXkgKDIrNys3KzcrNyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5OTUsIDQsICgyLCA3LCA3LCA3LCA3KSkKKworICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIGZyaWRheSAoMys3KzcrNys2IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5NCwgNCwgKDMsIDcsIDcsIDcsIDYpKQorCisgICAgZGVmIHRlc3RfZGVjZW1iZXIoc2VsZik6CisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gbW9uZGF5ICg3KzcrNys3KzMgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTgwLCAxMiwgKDcsIDcsIDcsIDcsIDMpKQorCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gdHVlc2RheSAoNis3KzcrNys0IGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk4NywgMTIsICg2LCA3LCA3LCA3LCA0KSkKKworICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3KzIgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTY4LCAxMiwgKDEsIDcsIDcsIDcsIDcsIDIpKQorCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gdGh1cnNkYXkgKDQrNys3KzcrNiBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODgsIDEyLCAoNCwgNywgNywgNywgNikpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBmcmlkYXkgKDMrNys3KzcrNyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwMTcsIDEyLCAoMywgNywgNywgNywgNykpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBzYXR1cmRheSAoMis3KzcrNys3KzEgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDY4LCAxMiwgKDIsIDcsIDcsIDcsIDcsIDEpKQorCisKK2NsYXNzIFN1bmRheVRlc3RDYXNlKE1vbnRoQ2FsZW5kYXJUZXN0Q2FzZSk6CisgICAgZmlyc3R3ZWVrZGF5ID0gY2FsZW5kYXIuU1VOREFZCisKKyAgICBkZWYgdGVzdF9mZWJydWFyeShzZWxmKToKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzdW5kYXkgKDcrNys3KzcgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA5LCAyLCAoNywgNywgNywgNykpCisKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBtb25kYXkgKDYrNys3KzcrMSBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5OTksIDIsICg2LCA3LCA3LCA3LCAxKSkKKworICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgxKzcrNys3KzYgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk3LCAyLCAoMSwgNywgNywgNywgNikpCisKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBzdW5kYXkgKDcrNys3KzcrMSBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwMDQsIDIsICg3LCA3LCA3LCA3LCAxKSkKKworICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIG1vbmRheSAoNis3KzcrNysyIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2MCwgMiwgKDYsIDcsIDcsIDcsIDIpKQorCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gc2F0dXJkYXkgKDErNys3KzcrNyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NjQsIDIsICgxLCA3LCA3LCA3LCA3KSkKKworICAgIGRlZiB0ZXN0X2FwcmlsKHNlbGYpOgorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNysyIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTkyMywgNCwgKDcsIDcsIDcsIDcsIDIpKQorCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gbW9uZGF5ICg2KzcrNys3KzMgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTE4LCA0LCAoNiwgNywgNywgNywgMykpCisKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3KzEgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTUwLCA0LCAoMSwgNywgNywgNywgNywgMSkpCisKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBmcmlkYXkgKDIrNys3KzcrNyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NjAsIDQsICgyLCA3LCA3LCA3LCA3KSkKKworICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHRodXJzZGF5ICgzKzcrNys3KzYgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTA5LCA0LCAoMywgNywgNywgNywgNikpCisKKyAgICBkZWYgdGVzdF9kZWNlbWJlcihzZWxmKToKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBzdW5kYXkgKDcrNys3KzcrMyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwODAsIDEyLCAoNywgNywgNywgNywgMykpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBtb25kYXkgKDYrNys3KzcrNCBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NDEsIDEyLCAoNiwgNywgNywgNywgNCkpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3KzIgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTIzLCAxMiwgKDEsIDcsIDcsIDcsIDcsIDIpKQorCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gd2VkbmVzZGF5ICg0KzcrNys3KzYgZGF5cykKKyAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTQ4LCAxMiwgKDQsIDcsIDcsIDcsIDYpKQorCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gdGh1cnNkYXkgKDMrNys3KzcrNyBkYXlzKQorICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MjcsIDEyLCAoMywgNywgNywgNywgNykpCisKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBmcmlkYXkgKDIrNys3KzcrNysxIGRheXMpCisgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk5NSwgMTIsICgyLCA3LCA3LCA3LCA3LCAxKSkKKworCitjbGFzcyBNb250aFJhbmdlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2phbnVhcnkoc2VsZik6CisgICAgICAgICMgVGVzdHMgdmFsaWQgbG93ZXIgYm91bmRhcnkgY2FzZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5tb250aHJhbmdlKDIwMDQsMSksICgzLDMxKSkKKworICAgIGRlZiB0ZXN0X2ZlYnJ1YXJ5X2xlYXAoc2VsZik6CisgICAgICAgICMgVGVzdHMgRmVicnVhcnkgZHVyaW5nIGxlYXAgeWVhci4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5tb250aHJhbmdlKDIwMDQsMiksICg2LDI5KSkKKworICAgIGRlZiB0ZXN0X2ZlYnJ1YXJ5X25vbmxlYXAoc2VsZik6CisgICAgICAgICMgVGVzdHMgRmVicnVhcnkgaW4gbm9uLWxlYXAgeWVhci4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5tb250aHJhbmdlKDIwMTAsMiksICgwLDI4KSkKKworICAgIGRlZiB0ZXN0X2RlY2VtYmVyKHNlbGYpOgorICAgICAgICAjIFRlc3RzIHZhbGlkIHVwcGVyIGJvdW5kYXJ5IGNhc2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsZW5kYXIubW9udGhyYW5nZSgyMDA0LDEyKSwgKDIsMzEpKQorCisgICAgZGVmIHRlc3RfemVyb3RoX21vbnRoKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGxvdyBpbnZhbGlkIGJvdW5kYXJ5IGNhc2UuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoY2FsZW5kYXIuSWxsZWdhbE1vbnRoRXJyb3IpOgorICAgICAgICAgICAgY2FsZW5kYXIubW9udGhyYW5nZSgyMDA0LCAwKQorCisgICAgZGVmIHRlc3RfdGhpcnRlZW50aF9tb250aChzZWxmKToKKyAgICAgICAgIyBUZXN0cyBoaWdoIGludmFsaWQgYm91bmRhcnkgY2FzZS4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhjYWxlbmRhci5JbGxlZ2FsTW9udGhFcnJvcik6CisgICAgICAgICAgICBjYWxlbmRhci5tb250aHJhbmdlKDIwMDQsIDEzKQorCitjbGFzcyBMZWFwZGF5c1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9ub19yYW5nZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IHdoZW4gbm8gcmFuZ2UgaS5lLiB0d28gaWRlbnRpY2FsIHllYXJzIGFzIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5sZWFwZGF5cygyMDEwLDIwMTApLCAwKQorCisgICAgZGVmIHRlc3Rfbm9fbGVhcGRheXMoc2VsZik6CisgICAgICAgICMgdGVzdCB3aGVuIG5vIGxlYXAgeWVhcnMgaW4gcmFuZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5sZWFwZGF5cygyMDEwLDIwMTEpLCAwKQorCisgICAgZGVmIHRlc3Rfbm9fbGVhcGRheXNfdXBwZXJfYm91bmRhcnkoc2VsZik6CisgICAgICAgICMgdGVzdCBubyBsZWFwIHllYXJzIGluIHJhbmdlLCB3aGVuIHVwcGVyIGJvdW5kYXJ5IGlzIGEgbGVhcCB5ZWFyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsZW5kYXIubGVhcGRheXMoMjAxMCwyMDEyKSwgMCkKKworICAgIGRlZiB0ZXN0X29uZV9sZWFwZGF5X2xvd2VyX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICAjIHRlc3Qgd2hlbiBvbmUgbGVhcCB5ZWFyIGluIHJhbmdlLCBsb3dlciBib3VuZGFyeSBpcyBsZWFwIHllYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxlbmRhci5sZWFwZGF5cygyMDEyLDIwMTMpLCAxKQorCisgICAgZGVmIHRlc3Rfc2V2ZXJhbF9sZWFweWVhcnNfaW5fcmFuZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FsZW5kYXIubGVhcGRheXMoMTk5NywyMDIwKSwgNSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgT3V0cHV0VGVzdENhc2UsCisgICAgICAgIENhbGVuZGFyVGVzdENhc2UsCisgICAgICAgIE1vbmRheVRlc3RDYXNlLAorICAgICAgICBTdW5kYXlUZXN0Q2FzZSwKKyAgICAgICAgTW9udGhSYW5nZVRlc3RDYXNlLAorICAgICAgICBMZWFwZGF5c1Rlc3RDYXNlLAorICAgICkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxlbmRhci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxlbmRhci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0Y2M2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxlbmRhci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxlbmRhci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0Y2M2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGVuZGFyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYWxsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDZjMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weQpAQCAtMCwwICsxLDEzNCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFRoZSB0ZXN0IGNhc2VzIGhlcmUgY292ZXIgc2V2ZXJhbCBwYXRocyB0aHJvdWdoIHRoZSBmdW5jdGlvbiBjYWxsaW5nCisjIGNvZGUuICBUaGV5IGRlcGVuZCBvbiB0aGUgTUVUSF9YWFggZmxhZyB0aGF0IGlzIHVzZWQgdG8gZGVmaW5lIGEgQworIyBmdW5jdGlvbiwgd2hpY2ggY2FuJ3QgYmUgdmVyaWZpZWQgZnJvbSBQeXRob24uICBJZiB0aGUgTUVUSF9YWFggZGVjbAorIyBmb3IgYSBDIGZ1bmN0aW9uIGNoYW5nZXMsIHRoZXNlIHRlc3RzIG1heSBub3QgY292ZXIgdGhlIHJpZ2h0IHBhdGhzLgorCitjbGFzcyBDRnVuY3Rpb25DYWxscyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF92YXJhcmdzMChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5oYXNfa2V5KQorCisgICAgZGVmIHRlc3RfdmFyYXJnczEoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHt9Lmhhc19rZXkoMCkKKworICAgIGRlZiB0ZXN0X3ZhcmFyZ3MyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9Lmhhc19rZXksIDAsIDEpCisKKyAgICBkZWYgdGVzdF92YXJhcmdzMF9leHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHt9Lmhhc19rZXkoKigpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfdmFyYXJnczFfZXh0KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB7fS5oYXNfa2V5KCooMCwpKQorCisgICAgZGVmIHRlc3RfdmFyYXJnczJfZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAge30uaGFzX2tleSgqKDEsIDIpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICBkZWYgdGVzdF92YXJhcmdzMF9rdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5oYXNfa2V5LCB4PTIpCisKKyAgICBkZWYgdGVzdF92YXJhcmdzMV9rdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5oYXNfa2V5LCB4PTIpCisKKyAgICBkZWYgdGVzdF92YXJhcmdzMl9rdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5oYXNfa2V5LCB4PTIsIHk9MikKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MwXzAoc2VsZik6CisgICAgICAgIHt9LmtleXMoKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5rZXlzLCAwKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5rZXlzLCAwLCAxKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMF9leHQoc2VsZik6CisgICAgICAgIHt9LmtleXMoKigpKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczBfMV9leHQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHt9LmtleXMoKigwLCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MwXzJfZXh0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB7fS5rZXlzKCooMSwgMikpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MwXzBfa3coc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHt9LmtleXMoeD0yKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMF8xX2t3KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHt9LmtleXMsIHg9MikKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MwXzJfa3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwge30ua2V5cywgeD0yLCB5PTIpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMV8wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFtdLmNvdW50KQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczFfMShzZWxmKToKKyAgICAgICAgW10uY291bnQoMSkKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgW10uY291bnQsIDEsIDIpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMV8wX2V4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgW10uY291bnQoKigpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMV8xX2V4dChzZWxmKToKKyAgICAgICAgW10uY291bnQoKigxLCkpCisKKyAgICBkZWYgdGVzdF9vbGRhcmdzMV8yX2V4dChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgW10uY291bnQoKigxLCAyKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCisgICAgZGVmIHRlc3Rfb2xkYXJnczFfMF9rdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBbXS5jb3VudCwgeD0yKQorCisgICAgZGVmIHRlc3Rfb2xkYXJnczFfMV9rdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBbXS5jb3VudCwge30sIHg9MikKKworICAgIGRlZiB0ZXN0X29sZGFyZ3MxXzJfa3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgW10uY291bnQsIHg9MiwgeT0yKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENGdW5jdGlvbkNhbGxzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhN2EwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FsbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhN2EwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhcGkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYXBpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZGIzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jYXBpLnB5CkBAIC0wLDAgKzEsMTQwIEBACisjIFJ1biB0aGUgX3Rlc3RjYXBpIG1vZHVsZSB0ZXN0cyAodGVzdHMgZm9yIHRoZSBQeXRob24vQyBBUEkpOiAgYnkgZGVmbiwKKyMgdGhlc2UgYXJlIGFsbCBmdW5jdGlvbnMgX3Rlc3RjYXBpIGV4cG9ydHMgd2hvc2UgbmFtZSBiZWdpbnMgd2l0aCAndGVzdF8nLgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordHJ5OgorICAgIGltcG9ydCB0aHJlYWQKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkID0gTm9uZQorICAgIHRocmVhZGluZyA9IE5vbmUKK2ltcG9ydCBfdGVzdGNhcGkKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIFRlc3RQZW5kaW5nQ2FsbHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHBlbmRpbmdjYWxsc19zdWJtaXQoc2VsZiwgbCwgbik6CisgICAgICAgIGRlZiBjYWxsYmFjaygpOgorICAgICAgICAgICAgI3RoaXMgZnVuY3Rpb24gY2FuIGJlIGludGVycnVwdGVkIGJ5IHRocmVhZCBzd2l0Y2hpbmcgc28gbGV0J3MKKyAgICAgICAgICAgICN1c2UgYW4gYXRvbWljIG9wZXJhdGlvbgorICAgICAgICAgICAgbC5hcHBlbmQoTm9uZSkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAocmFuZG9tLnJhbmRvbSgpKjAuMDIpICMwLjAxIHNlY3Mgb24gYXZlcmFnZQorICAgICAgICAgICAgI3RyeSBzdWJtaXR0aW5nIGNhbGxiYWNrIHVudGlsIHN1Y2Nlc3NmdWwuCisgICAgICAgICAgICAjcmVseSBvbiByZWd1bGFyIGludGVycnVwdCB0byBmbHVzaCBxdWV1ZSBpZiB3ZSBhcmUKKyAgICAgICAgICAgICN1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGlmIF90ZXN0Y2FwaS5fcGVuZGluZ190aHJlYWRmdW5jKGNhbGxiYWNrKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICBkZWYgcGVuZGluZ2NhbGxzX3dhaXQoc2VsZiwgbCwgbiwgY29udGV4dCA9IE5vbmUpOgorICAgICAgICAjbm93LCBzdGljayBhcm91bmQgdW50aWwgbFswXSBoYXMgZ3Jvd24gdG8gMTAKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICB3aGlsZSBsZW4obCkgIT0gbjoKKyAgICAgICAgICAgICN0aGlzIGJ1c3kgbG9vcCBpcyB3aGVyZSB3ZSBleHBlY3QgdG8gYmUgaW50ZXJydXB0ZWQgdG8KKyAgICAgICAgICAgICNydW4gb3VyIGNhbGxiYWNrcy4gIE5vdGUgdGhhdCBjYWxsYmFja3MgYXJlIG9ubHkgcnVuIG9uIHRoZQorICAgICAgICAgICAgI21haW4gdGhyZWFkCisgICAgICAgICAgICBpZiBGYWxzZSBhbmQgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIiglaSkiJShsZW4obCksKSwKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDAwKToKKyAgICAgICAgICAgICAgICBhID0gaSppCisgICAgICAgICAgICBpZiBjb250ZXh0IGFuZCBub3QgY29udGV4dC5ldmVudC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvdW50IDwgMTAwMDAsCisgICAgICAgICAgICAgICAgInRpbWVvdXQgd2FpdGluZyBmb3IgJWkgY2FsbGJhY2tzLCBnb3QgJWkiJShuLCBsZW4obCkpKQorICAgICAgICBpZiBGYWxzZSBhbmQgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiKCVpKSIlKGxlbihsKSwpCisKKyAgICBkZWYgdGVzdF9wZW5kaW5nY2FsbHNfdGhyZWFkZWQoc2VsZik6CisgICAgICAgICNkbyBldmVyeSBjYWxsYmFjayBvbiBhIHNlcGFyYXRlIHRocmVhZAorICAgICAgICBuID0gMzIgI3RvdGFsIGNhbGxiYWNrcworICAgICAgICB0aHJlYWRzID0gW10KKyAgICAgICAgY2xhc3MgZm9vKG9iamVjdCk6cGFzcworICAgICAgICBjb250ZXh0ID0gZm9vKCkKKyAgICAgICAgY29udGV4dC5sID0gW10KKyAgICAgICAgY29udGV4dC5uID0gMiAjc3VibWl0cyBwZXIgdGhyZWFkCisgICAgICAgIGNvbnRleHQublRocmVhZHMgPSBuIC8vIGNvbnRleHQubgorICAgICAgICBjb250ZXh0Lm5GaW5pc2hlZCA9IDAKKyAgICAgICAgY29udGV4dC5sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBjb250ZXh0LmV2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShjb250ZXh0Lm5UaHJlYWRzKToKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnBlbmRpbmdjYWxsc190aHJlYWQsIGFyZ3MgPSAoY29udGV4dCwpKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorCisgICAgICAgIHNlbGYucGVuZGluZ2NhbGxzX3dhaXQoY29udGV4dC5sLCBuLCBjb250ZXh0KQorCisgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICB0LmpvaW4oKQorCisgICAgZGVmIHBlbmRpbmdjYWxsc190aHJlYWQoc2VsZiwgY29udGV4dCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucGVuZGluZ2NhbGxzX3N1Ym1pdChjb250ZXh0LmwsIGNvbnRleHQubikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdpdGggY29udGV4dC5sb2NrOgorICAgICAgICAgICAgICAgIGNvbnRleHQubkZpbmlzaGVkICs9IDEKKyAgICAgICAgICAgICAgICBuRmluaXNoZWQgPSBjb250ZXh0Lm5GaW5pc2hlZAorICAgICAgICAgICAgICAgIGlmIEZhbHNlIGFuZCB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImZpbmlzaGVkIHRocmVhZHM6ICIsIG5GaW5pc2hlZAorICAgICAgICAgICAgaWYgbkZpbmlzaGVkID09IGNvbnRleHQublRocmVhZHM6CisgICAgICAgICAgICAgICAgY29udGV4dC5ldmVudC5zZXQoKQorCisgICAgZGVmIHRlc3RfcGVuZGluZ2NhbGxzX25vbl90aHJlYWRlZChzZWxmKToKKyAgICAgICAgI2FnYWluLCBqdXN0IHVzaW5nIHRoZSBtYWluIHRocmVhZCwgbGlrZWx5IHRoZXkgd2lsbCBhbGwgYmUgZGlzcGF0Y2hlZCBhdAorICAgICAgICAjb25jZS4gIEl0IGlzIG9rIHRvIGFzayBmb3IgdG9vIG1hbnksIGJlY2F1c2Ugd2UgbG9vcCB1bnRpbCB3ZSBmaW5kIGEgc2xvdC4KKyAgICAgICAgI3RoZSBsb29wIGNhbiBiZSBpbnRlcnJ1cHRlZCB0byBkaXNwYXRjaC4KKyAgICAgICAgI3RoZXJlIGFyZSBvbmx5IDMyIGRpc3BhdGNoIHNsb3RzLCBzbyB3ZSBnbyBmb3IgdHdpY2UgdGhhdCEKKyAgICAgICAgbCA9IFtdCisgICAgICAgIG4gPSA2NAorICAgICAgICBzZWxmLnBlbmRpbmdjYWxsc19zdWJtaXQobCwgbikKKyAgICAgICAgc2VsZi5wZW5kaW5nY2FsbHNfd2FpdChsLCBuKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZyBhbmQgdGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIFRlc3RUaHJlYWRTdGF0ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBAdGVzdF9zdXBwb3J0LnJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X3RocmVhZF9zdGF0ZShzZWxmKToKKyAgICAgICAgIyBzb21lIGV4dHJhIHRocmVhZC1zdGF0ZSB0ZXN0cyBkcml2ZW4gdmlhIF90ZXN0Y2FwaQorICAgICAgICBkZWYgdGFyZ2V0KCk6CisgICAgICAgICAgICBpZGVudHMgPSBbXQorCisgICAgICAgICAgICBkZWYgY2FsbGJhY2soKToKKyAgICAgICAgICAgICAgICBpZGVudHMuYXBwZW5kKHRocmVhZC5nZXRfaWRlbnQoKSkKKworICAgICAgICAgICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZShjYWxsYmFjaykKKyAgICAgICAgICAgIGEgPSBiID0gY2FsbGJhY2sKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgICAgICMgQ2hlY2sgb3VyIG1haW4gdGhyZWFkIGlzIGluIHRoZSBsaXN0IGV4YWN0bHkgMyB0aW1lcy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWRlbnRzLmNvdW50KHRocmVhZC5nZXRfaWRlbnQoKSksIDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIG1haW4gdGhyZWFkIGNvcnJlY3RseSBpbiB0aGUgbGlzdCIpCisKKyAgICAgICAgdGFyZ2V0KCkKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXRhcmdldCkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZvciBuYW1lIGluIGRpcihfdGVzdGNhcGkpOgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ3Rlc3RfJyk6CisgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihfdGVzdGNhcGksIG5hbWUpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiaW50ZXJuYWwiLCBuYW1lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVzdCgpCisgICAgICAgICAgICBleGNlcHQgX3Rlc3RjYXBpLmVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCBzeXMuZXhjX2luZm8oKVsxXQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0UGVuZGluZ0NhbGxzLCBUZXN0VGhyZWFkU3RhdGUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhcGkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FwaS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmNGMyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhcGkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhcGkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2FwaS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBmNGMyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NhcGkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWRhYTgyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5CkBAIC0wLDAgKzEsMzAgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIldoaW1weSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGNkIG1vZHVsZQorICAgUm9nZXIgRS4gTWFzc2UKKyIiIgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgaW1wb3J0X21vZHVsZQorCitjZCA9IGltcG9ydF9tb2R1bGUoJ2NkJykKKworY2RhdHRycyA9IFsnQkxPQ0tTSVpFJywgJ0NEUk9NJywgJ0RBVEFTSVpFJywgJ0VSUk9SJywgJ05PRElTQycsICdQQVVTRUQnLCAnUExBWUlORycsICdSRUFEWScsCisgICAgICAgICAgICdTVElMTCcsICdfX2RvY19fJywgJ19fbmFtZV9fJywgJ2F0aW1lJywgJ2F1ZGlvJywgJ2NhdGFsb2cnLCAnY29udHJvbCcsICdjcmVhdGVwYXJzZXInLCAnZXJyb3InLAorICAgICAgICAgICAnaWRlbnQnLCAnaW5kZXgnLCAnbXNmdG9mcmFtZScsICdvcGVuJywgJ3BudW0nLCAncHRpbWUnXQorCisKKyMgVGhpcyBpcyBhIHZlcnkgaW5vYnRydXNpdmUgdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgY2QgbW9kdWxlIGFuZCBhbGwgaXRzCisjIGF0dHJpYnV0ZXMuICBNb3JlIGNvbXByZWhlbnNpdmUgZXhhbXBsZXMgY2FuIGJlIGZvdW5kIGluIERlbW8vY2QgYW5kCisjIHJlcXVpcmUgdGhhdCB5b3UgaGF2ZSBhIENEIGFuZCBhIENEIFJPTSBkcml2ZQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyB0b3VjaCBhbGwgdGhlIGF0dHJpYnV0ZXMgb2YgY2Qgd2l0aG91dCBkb2luZyBhbnl0aGluZworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdUb3VjaGluZyBjZCBtb2R1bGUgYXR0cmlidXRlcy4uLicKKyAgICBmb3IgYXR0ciBpbiBjZGF0dHJzOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3RvdWNoaW5nOiAnLCBhdHRyCisgICAgICAgIGdldGF0dHIoY2QsIGF0dHIpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5NmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5NmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZmdwYXJzZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZmdwYXJzZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNzNmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NmZ3BhcnNlci5weQpAQCAtMCwwICsxLDczOCBAQAoraW1wb3J0IENvbmZpZ1BhcnNlcgoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFVzZXJEaWN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgU29ydGVkRGljdChVc2VyRGljdC5Vc2VyRGljdCk6CisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmRhdGEuaXRlbXMoKQorICAgICAgICByZXN1bHQuc29ydCgpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmRhdGEua2V5cygpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBYWFggbmV2ZXIgdXNlZD8KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pdGVtcygpCisgICAgICAgIHJldHVybiBbaVsxXSBmb3IgaSBpbiByZXN1bHRdCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOiByZXR1cm4gaXRlcihzZWxmLml0ZW1zKCkpCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOiByZXR1cm4gaXRlcihzZWxmLmtleXMoKSkKKyAgICBfX2l0ZXJfXyA9IGl0ZXJrZXlzCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6IHJldHVybiBpdGVyKHNlbGYudmFsdWVzKCkpCisKKworY2xhc3MgVGVzdENhc2VCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBhbGxvd19ub192YWx1ZSA9IEZhbHNlCisKKyAgICBkZWYgbmV3Y29uZmlnKHNlbGYsIGRlZmF1bHRzPU5vbmUpOgorICAgICAgICBpZiBkZWZhdWx0cyBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jZiA9IHNlbGYuY29uZmlnX2NsYXNzKGFsbG93X25vX3ZhbHVlPXNlbGYuYWxsb3dfbm9fdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNmID0gc2VsZi5jb25maWdfY2xhc3MoZGVmYXVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfbm9fdmFsdWU9c2VsZi5hbGxvd19ub192YWx1ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY2YKKworICAgIGRlZiBmcm9tc3RyaW5nKHNlbGYsIHN0cmluZywgZGVmYXVsdHM9Tm9uZSk6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoZGVmYXVsdHMpCisgICAgICAgIHNpbyA9IFN0cmluZ0lPLlN0cmluZ0lPKHN0cmluZykKKyAgICAgICAgY2YucmVhZGZwKHNpbykKKyAgICAgICAgcmV0dXJuIGNmCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgY29uZmlnX3N0cmluZyA9ICgKKyAgICAgICAgICAgICJbRm9vIEJhcl1cbiIKKyAgICAgICAgICAgICJmb289YmFyXG4iCisgICAgICAgICAgICAiW1NwYWNleSBCYXJdXG4iCisgICAgICAgICAgICAiZm9vID0gYmFyXG4iCisgICAgICAgICAgICAiW0NvbW1lbnRlZCBCYXJdXG4iCisgICAgICAgICAgICAiZm9vOiBiYXIgOyBjb21tZW50XG4iCisgICAgICAgICAgICAiW0xvbmcgTGluZV1cbiIKKyAgICAgICAgICAgICJmb286IHRoaXMgbGluZSBpcyBtdWNoLCBtdWNoIGxvbmdlciB0aGFuIG15IGVkaXRvclxuIgorICAgICAgICAgICAgIiAgIGxpa2VzIGl0LlxuIgorICAgICAgICAgICAgIltTZWN0aW9uXFx3aXRoJHdlaXJkJWNoYXJhY3RlcnNbXHRdXG4iCisgICAgICAgICAgICAiW0ludGVybmF0aW9uYWxpemVkIFN0dWZmXVxuIgorICAgICAgICAgICAgImZvb1tiZ106IEJ1bGdhcmlhblxuIgorICAgICAgICAgICAgImZvbz1EZWZhdWx0XG4iCisgICAgICAgICAgICAiZm9vW2VuXT1FbmdsaXNoXG4iCisgICAgICAgICAgICAiZm9vW2RlXT1EZXV0c2NoXG4iCisgICAgICAgICAgICAiW1NwYWNlc11cbiIKKyAgICAgICAgICAgICJrZXkgd2l0aCBzcGFjZXMgOiB2YWx1ZVxuIgorICAgICAgICAgICAgImFub3RoZXIgd2l0aCBzcGFjZXMgPSBzcGxhdCFcbiIKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi5hbGxvd19ub192YWx1ZToKKyAgICAgICAgICAgIGNvbmZpZ19zdHJpbmcgKz0gKAorICAgICAgICAgICAgICAgICJbTm9WYWx1ZV1cbiIKKyAgICAgICAgICAgICAgICAib3B0aW9uLXdpdGhvdXQtdmFsdWVcbiIKKyAgICAgICAgICAgICAgICApCisKKyAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoY29uZmlnX3N0cmluZykKKyAgICAgICAgTCA9IGNmLnNlY3Rpb25zKCkKKyAgICAgICAgTC5zb3J0KCkKKyAgICAgICAgRSA9IFtyJ0NvbW1lbnRlZCBCYXInLAorICAgICAgICAgICAgIHInRm9vIEJhcicsCisgICAgICAgICAgICAgcidJbnRlcm5hdGlvbmFsaXplZCBTdHVmZicsCisgICAgICAgICAgICAgcidMb25nIExpbmUnLAorICAgICAgICAgICAgIHInU2VjdGlvblx3aXRoJHdlaXJkJWNoYXJhY3RlcnNbJyAnXHQnLAorICAgICAgICAgICAgIHInU3BhY2VzJywKKyAgICAgICAgICAgICByJ1NwYWNleSBCYXInLAorICAgICAgICAgICAgIF0KKyAgICAgICAgaWYgc2VsZi5hbGxvd19ub192YWx1ZToKKyAgICAgICAgICAgIEUuYXBwZW5kKHInTm9WYWx1ZScpCisgICAgICAgIEUuc29ydCgpCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShMLCBFKQorCisgICAgICAgICMgVGhlIHVzZSBvZiBzcGFjZXMgaW4gdGhlIHNlY3Rpb24gbmFtZXMgc2VydmVzIGFzIGEKKyAgICAgICAgIyByZWdyZXNzaW9uIHRlc3QgZm9yIFNvdXJjZUZvcmdlIGJ1ZyAjNTgzMjQ4OgorICAgICAgICAjIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi81ODMyNDgKKyAgICAgICAgZXEoY2YuZ2V0KCdGb28gQmFyJywgJ2ZvbycpLCAnYmFyJykKKyAgICAgICAgZXEoY2YuZ2V0KCdTcGFjZXkgQmFyJywgJ2ZvbycpLCAnYmFyJykKKyAgICAgICAgZXEoY2YuZ2V0KCdDb21tZW50ZWQgQmFyJywgJ2ZvbycpLCAnYmFyJykKKyAgICAgICAgZXEoY2YuZ2V0KCdTcGFjZXMnLCAna2V5IHdpdGggc3BhY2VzJyksICd2YWx1ZScpCisgICAgICAgIGVxKGNmLmdldCgnU3BhY2VzJywgJ2Fub3RoZXIgd2l0aCBzcGFjZXMnKSwgJ3NwbGF0IScpCisgICAgICAgIGlmIHNlbGYuYWxsb3dfbm9fdmFsdWU6CisgICAgICAgICAgICBlcShjZi5nZXQoJ05vVmFsdWUnLCAnb3B0aW9uLXdpdGhvdXQtdmFsdWUnKSwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdfX25hbWVfXycsIGNmLm9wdGlvbnMoIkZvbyBCYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnX19uYW1lX18gIm9wdGlvbiIgc2hvdWxkIG5vdCBiZSBleHBvc2VkIGJ5IHRoZSBBUEkhJykKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcmlnaHQgdGhpbmdzIGhhcHBlbiBmb3IgcmVtb3ZlX29wdGlvbigpOworICAgICAgICAjIGFkZGVkIHRvIGluY2x1ZGUgY2hlY2sgZm9yIFNvdXJjZUZvcmdlIGJ1ZyAjMTIzMzI0OgorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YucmVtb3ZlX29wdGlvbignRm9vIEJhcicsICdmb28nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVfb3B0aW9uKCkgZmFpbGVkIHRvIHJlcG9ydCBleGlzdGVuY2Ugb2Ygb3B0aW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5oYXNfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAorICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX29wdGlvbigpIGZhaWxlZCB0byByZW1vdmUgb3B0aW9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5yZW1vdmVfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAorICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX29wdGlvbigpIGZhaWxlZCB0byByZXBvcnQgbm9uLWV4aXN0ZW5jZSBvZiBvcHRpb24iCisgICAgICAgICAgICAgICAgICAgICIgdGhhdCB3YXMgcmVtb3ZlZCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQ29uZmlnUGFyc2VyLk5vU2VjdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjZi5yZW1vdmVfb3B0aW9uLCAnTm8gU3VjaCBTZWN0aW9uJywgJ2ZvbycpCisKKyAgICAgICAgZXEoY2YuZ2V0KCdMb25nIExpbmUnLCAnZm9vJyksCisgICAgICAgICAgICd0aGlzIGxpbmUgaXMgbXVjaCwgbXVjaCBsb25nZXIgdGhhbiBteSBlZGl0b3Jcbmxpa2VzIGl0LicpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NlbnNpdGl2aXR5KHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgY2YuYWRkX3NlY3Rpb24oIkEiKQorICAgICAgICBjZi5hZGRfc2VjdGlvbigiYSIpCisgICAgICAgIEwgPSBjZi5zZWN0aW9ucygpCisgICAgICAgIEwuc29ydCgpCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShMLCBbIkEiLCAiYSJdKQorICAgICAgICBjZi5zZXQoImEiLCAiQiIsICJ2YWx1ZSIpCisgICAgICAgIGVxKGNmLm9wdGlvbnMoImEiKSwgWyJiIl0pCisgICAgICAgIGVxKGNmLmdldCgiYSIsICJiIiksICJ2YWx1ZSIsCisgICAgICAgICAgICJjb3VsZCBub3QgbG9jYXRlIG9wdGlvbiwgZXhwZWN0aW5nIGNhc2UtaW5zZW5zaXRpdmUgb3B0aW9uIG5hbWVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNmLmhhc19vcHRpb24oImEiLCAiYiIpKQorICAgICAgICBjZi5zZXQoIkEiLCAiQS1CIiwgIkEtQiB2YWx1ZSIpCisgICAgICAgIGZvciBvcHQgaW4gKCJhLWIiLCAiQS1iIiwgImEtQiIsICJBLUIiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICBjZi5oYXNfb3B0aW9uKCJBIiwgb3B0KSwKKyAgICAgICAgICAgICAgICAiaGFzX29wdGlvbigpIHJldHVybmVkIGZhbHNlIGZvciBvcHRpb24gd2hpY2ggc2hvdWxkIGV4aXN0IikKKyAgICAgICAgZXEoY2Yub3B0aW9ucygiQSIpLCBbImEtYiJdKQorICAgICAgICBlcShjZi5vcHRpb25zKCJhIiksIFsiYiJdKQorICAgICAgICBjZi5yZW1vdmVfb3B0aW9uKCJhIiwgIkIiKQorICAgICAgICBlcShjZi5vcHRpb25zKCJhIiksIFtdKQorCisgICAgICAgICMgU0YgYnVnICM0MzIzNjk6CisgICAgICAgIGNmID0gc2VsZi5mcm9tc3RyaW5nKAorICAgICAgICAgICAgIltNeVNlY3Rpb25dXG5PcHRpb246IGZpcnN0IGxpbmVcblx0c2Vjb25kIGxpbmVcbiIpCisgICAgICAgIGVxKGNmLm9wdGlvbnMoIk15U2VjdGlvbiIpLCBbIm9wdGlvbiJdKQorICAgICAgICBlcShjZi5nZXQoIk15U2VjdGlvbiIsICJPcHRpb24iKSwgImZpcnN0IGxpbmVcbnNlY29uZCBsaW5lIikKKworICAgICAgICAjIFNGIGJ1ZyAjNTYxODIyOgorICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZygiW3NlY3Rpb25dXG5uZWtleT1uZXZhbHVlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0cz17ImtleSI6InZhbHVlIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjZi5oYXNfb3B0aW9uKCJzZWN0aW9uIiwgIktleSIpKQorCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X2Nhc2Vfc2Vuc2l0aXZpdHkoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoeyJmb28iOiAiQmFyIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZi5nZXQoIkRFRkFVTFQiLCAiRm9vIiksICJCYXIiLAorICAgICAgICAgICAgImNvdWxkIG5vdCBsb2NhdGUgb3B0aW9uLCBleHBlY3RpbmcgY2FzZS1pbnNlbnNpdGl2ZSBvcHRpb24gbmFtZXMiKQorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKHsiRm9vIjogIkJhciJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2YuZ2V0KCJERUZBVUxUIiwgIkZvbyIpLCAiQmFyIiwKKyAgICAgICAgICAgICJjb3VsZCBub3QgbG9jYXRlIG9wdGlvbiwgZXhwZWN0aW5nIGNhc2UtaW5zZW5zaXRpdmUgZGVmYXVsdHMiKQorCisgICAgZGVmIHRlc3RfcGFyc2VfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIHNlbGYucGFyc2VfZXJyb3IoQ29uZmlnUGFyc2VyLlBhcnNpbmdFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiW0Zvb11cbiAgZXh0cmEtc3BhY2VzOiBzcGxhdFxuIikKKyAgICAgICAgc2VsZi5wYXJzZV9lcnJvcihDb25maWdQYXJzZXIuUGFyc2luZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbRm9vXVxuICBleHRyYS1zcGFjZXM9IHNwbGF0XG4iKQorICAgICAgICBzZWxmLnBhcnNlX2Vycm9yKENvbmZpZ1BhcnNlci5QYXJzaW5nRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIltGb29dXG46dmFsdWUtd2l0aG91dC1vcHRpb24tbmFtZVxuIikKKyAgICAgICAgc2VsZi5wYXJzZV9lcnJvcihDb25maWdQYXJzZXIuUGFyc2luZ0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbRm9vXVxuPXZhbHVlLXdpdGhvdXQtb3B0aW9uLW5hbWVcbiIpCisgICAgICAgIHNlbGYucGFyc2VfZXJyb3IoQ29uZmlnUGFyc2VyLk1pc3NpbmdTZWN0aW9uSGVhZGVyRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFNlY3Rpb24hXG4iKQorCisgICAgZGVmIHBhcnNlX2Vycm9yKHNlbGYsIGV4Yywgc3JjKToKKyAgICAgICAgc2lvID0gU3RyaW5nSU8uU3RyaW5nSU8oc3JjKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhleGMsIHNlbGYuY2YucmVhZGZwLCBzaW8pCisKKyAgICBkZWYgdGVzdF9xdWVyeV9lcnJvcnMoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLnNlY3Rpb25zKCksIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJuZXcgQ29uZmlnUGFyc2VyIHNob3VsZCBoYXZlIG5vIGRlZmluZWQgc2VjdGlvbnMiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNmLmhhc19zZWN0aW9uKCJGb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibmV3IENvbmZpZ1BhcnNlciBzaG91bGQgaGF2ZSBubyBhY2tub3dsZWRnZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzZWN0aW9ucyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKENvbmZpZ1BhcnNlci5Ob1NlY3Rpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2Yub3B0aW9ucywgIkZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKENvbmZpZ1BhcnNlci5Ob1NlY3Rpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2Yuc2V0LCAiZm9vIiwgImJhciIsICJ2YWx1ZSIpCisgICAgICAgIHNlbGYuZ2V0X2Vycm9yKENvbmZpZ1BhcnNlci5Ob1NlY3Rpb25FcnJvciwgImZvbyIsICJiYXIiKQorICAgICAgICBjZi5hZGRfc2VjdGlvbigiZm9vIikKKyAgICAgICAgc2VsZi5nZXRfZXJyb3IoQ29uZmlnUGFyc2VyLk5vT3B0aW9uRXJyb3IsICJmb28iLCAiYmFyIikKKworICAgIGRlZiBnZXRfZXJyb3Ioc2VsZiwgZXhjLCBzZWN0aW9uLCBvcHRpb24pOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNmLmdldChzZWN0aW9uLCBvcHRpb24pCisgICAgICAgIGV4Y2VwdCBleGMsIGU6CisgICAgICAgICAgICByZXR1cm4gZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24gdHlwZSAlcy4lcyIKKyAgICAgICAgICAgICAgICAgICAgICAlIChleGMuX19tb2R1bGVfXywgZXhjLl9fbmFtZV9fKSkKKworICAgIGRlZiB0ZXN0X2Jvb2xlYW4oc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5mcm9tc3RyaW5nKAorICAgICAgICAgICAgIltCT09MVEVTVF1cbiIKKyAgICAgICAgICAgICJUMT0xXG4iCisgICAgICAgICAgICAiVDI9VFJVRVxuIgorICAgICAgICAgICAgIlQzPVRydWVcbiIKKyAgICAgICAgICAgICJUND1vTlxuIgorICAgICAgICAgICAgIlQ1PXllc1xuIgorICAgICAgICAgICAgIkYxPTBcbiIKKyAgICAgICAgICAgICJGMj1GQUxTRVxuIgorICAgICAgICAgICAgIkYzPUZhbHNlXG4iCisgICAgICAgICAgICAiRjQ9b0ZGXG4iCisgICAgICAgICAgICAiRjU9bk9cbiIKKyAgICAgICAgICAgICJFMT0yXG4iCisgICAgICAgICAgICAiRTI9Zm9vXG4iCisgICAgICAgICAgICAiRTM9LTFcbiIKKyAgICAgICAgICAgICJFND0wLjFcbiIKKyAgICAgICAgICAgICJFNT1GQUxTRSBBTkQgTU9SRSIKKyAgICAgICAgICAgICkKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UoMSwgNSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YuZ2V0Ym9vbGVhbignQk9PTFRFU1QnLCAndCVkJyAlIHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICdmJWQnICUgeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YuZ2V0Ym9vbGVhbiwgJ0JPT0xURVNUJywgJ2UlZCcgJSB4KQorCisgICAgZGVmIHRlc3Rfd2VpcmRfZXJyb3JzKHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgY2YuYWRkX3NlY3Rpb24oIkZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKENvbmZpZ1BhcnNlci5EdXBsaWNhdGVTZWN0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNmLmFkZF9zZWN0aW9uLCAiRm9vIikKKworICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICBjb25maWdfc3RyaW5nID0gKAorICAgICAgICAgICAgIltMb25nIExpbmVdXG4iCisgICAgICAgICAgICAiZm9vOiB0aGlzIGxpbmUgaXMgbXVjaCwgbXVjaCBsb25nZXIgdGhhbiBteSBlZGl0b3JcbiIKKyAgICAgICAgICAgICIgICBsaWtlcyBpdC5cbiIKKyAgICAgICAgICAgICJbREVGQVVMVF1cbiIKKyAgICAgICAgICAgICJmb286IGFub3RoZXIgdmVyeVxuIgorICAgICAgICAgICAgIiBsb25nIGxpbmVcbiIKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi5hbGxvd19ub192YWx1ZToKKyAgICAgICAgICAgIGNvbmZpZ19zdHJpbmcgKz0gKAorICAgICAgICAgICAgIltWYWx1ZWxlc3NdXG4iCisgICAgICAgICAgICAib3B0aW9uLXdpdGhvdXQtdmFsdWVcbiIKKyAgICAgICAgICAgICkKKworICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZyhjb25maWdfc3RyaW5nKQorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGNmLndyaXRlKG91dHB1dCkKKyAgICAgICAgZXhwZWN0X3N0cmluZyA9ICgKKyAgICAgICAgICAgICJbREVGQVVMVF1cbiIKKyAgICAgICAgICAgICJmb28gPSBhbm90aGVyIHZlcnlcbiIKKyAgICAgICAgICAgICJcdGxvbmcgbGluZVxuIgorICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgIltMb25nIExpbmVdXG4iCisgICAgICAgICAgICAiZm9vID0gdGhpcyBsaW5lIGlzIG11Y2gsIG11Y2ggbG9uZ2VyIHRoYW4gbXkgZWRpdG9yXG4iCisgICAgICAgICAgICAiXHRsaWtlcyBpdC5cbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi5hbGxvd19ub192YWx1ZToKKyAgICAgICAgICAgIGV4cGVjdF9zdHJpbmcgKz0gKAorICAgICAgICAgICAgICAgICJbVmFsdWVsZXNzXVxuIgorICAgICAgICAgICAgICAgICJvcHRpb24td2l0aG91dC12YWx1ZVxuIgorICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksIGV4cGVjdF9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9zZXRfc3RyaW5nX3R5cGVzKHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZygiW3NlY3RdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24xPWZvb1xuIikKKyAgICAgICAgIyBDaGVjayB0aGF0IHdlIGRvbid0IGdldCBhbiBleGNlcHRpb24gd2hlbiBzZXR0aW5nIHZhbHVlcyBpbgorICAgICAgICAjIGFuIGV4aXN0aW5nIHNlY3Rpb24gdXNpbmcgc3RyaW5nczoKKyAgICAgICAgY2xhc3MgbXlzdHIoc3RyKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2Yuc2V0KCJzZWN0IiwgIm9wdGlvbjEiLCAic3BsYXQiKQorICAgICAgICBjZi5zZXQoInNlY3QiLCAib3B0aW9uMSIsIG15c3RyKCJzcGxhdCIpKQorICAgICAgICBjZi5zZXQoInNlY3QiLCAib3B0aW9uMiIsICJzcGxhdCIpCisgICAgICAgIGNmLnNldCgic2VjdCIsICJvcHRpb24yIiwgbXlzdHIoInNwbGF0IikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNmLnNldCgic2VjdCIsICJvcHRpb24xIiwgdW5pY29kZSgic3BsYXQiKSkKKyAgICAgICAgICAgIGNmLnNldCgic2VjdCIsICJvcHRpb24yIiwgdW5pY29kZSgic3BsYXQiKSkKKworICAgIGRlZiB0ZXN0X3JlYWRfcmV0dXJuc19maWxlX2xpc3Qoc2VsZik6CisgICAgICAgIGZpbGUxID0gdGVzdF9zdXBwb3J0LmZpbmRmaWxlKCJjZmdwYXJzZXIuMSIpCisgICAgICAgICMgY2hlY2sgd2hlbiB3ZSBwYXNzIGEgbWl4IG9mIHJlYWRhYmxlIGFuZCBub24tcmVhZGFibGUgZmlsZXM6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBwYXJzZWRfZmlsZXMgPSBjZi5yZWFkKFtmaWxlMSwgIm5vbmV4aXN0ZW50LWZpbGUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfZmlsZXMsIFtmaWxlMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCJGb28gQmFyIiwgImZvbyIpLCAibmV3YmFyIikKKyAgICAgICAgIyBjaGVjayB3aGVuIHdlIHBhc3Mgb25seSBhIGZpbGVuYW1lOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgcGFyc2VkX2ZpbGVzID0gY2YucmVhZChmaWxlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfZmlsZXMsIFtmaWxlMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCJGb28gQmFyIiwgImZvbyIpLCAibmV3YmFyIikKKyAgICAgICAgIyBjaGVjayB3aGVuIHdlIHBhc3Mgb25seSBtaXNzaW5nIGZpbGVzOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgcGFyc2VkX2ZpbGVzID0gY2YucmVhZChbIm5vbmV4aXN0ZW50LWZpbGUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfZmlsZXMsIFtdKQorICAgICAgICAjIGNoZWNrIHdoZW4gd2UgcGFzcyBubyBmaWxlczoKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIHBhcnNlZF9maWxlcyA9IGNmLnJlYWQoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VkX2ZpbGVzLCBbXSkKKworICAgICMgc2hhcmVkIGJ5IHN1YmNsYXNzZXMKKyAgICBkZWYgZ2V0X2ludGVycG9sYXRpb25fY29uZmlnKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5mcm9tc3RyaW5nKAorICAgICAgICAgICAgIltGb29dXG4iCisgICAgICAgICAgICAiYmFyPXNvbWV0aGluZyAlKHdpdGgxKXMgaW50ZXJwb2xhdGlvbiAoMSBzdGVwKVxuIgorICAgICAgICAgICAgImJhcjk9c29tZXRoaW5nICUod2l0aDkpcyBsb3RzIG9mIGludGVycG9sYXRpb24gKDkgc3RlcHMpXG4iCisgICAgICAgICAgICAiYmFyMTA9c29tZXRoaW5nICUod2l0aDEwKXMgbG90cyBvZiBpbnRlcnBvbGF0aW9uICgxMCBzdGVwcylcbiIKKyAgICAgICAgICAgICJiYXIxMT1zb21ldGhpbmcgJSh3aXRoMTEpcyBsb3RzIG9mIGludGVycG9sYXRpb24gKDExIHN0ZXBzKVxuIgorICAgICAgICAgICAgIndpdGgxMT0lKHdpdGgxMClzXG4iCisgICAgICAgICAgICAid2l0aDEwPSUod2l0aDkpc1xuIgorICAgICAgICAgICAgIndpdGg5PSUod2l0aDgpc1xuIgorICAgICAgICAgICAgIndpdGg4PSUoV2l0aDcpc1xuIgorICAgICAgICAgICAgIndpdGg3PSUoV0lUSDYpc1xuIgorICAgICAgICAgICAgIndpdGg2PSUod2l0aDUpc1xuIgorICAgICAgICAgICAgIldpdGg1PSUod2l0aDQpc1xuIgorICAgICAgICAgICAgIldJVEg0PSUod2l0aDMpc1xuIgorICAgICAgICAgICAgIndpdGgzPSUod2l0aDIpc1xuIgorICAgICAgICAgICAgIndpdGgyPSUod2l0aDEpc1xuIgorICAgICAgICAgICAgIndpdGgxPXdpdGhcbiIKKyAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICJbTXV0dWFsIFJlY3Vyc2lvbl1cbiIKKyAgICAgICAgICAgICJmb289JShiYXIpc1xuIgorICAgICAgICAgICAgImJhcj0lKGZvbylzXG4iCisgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAiW0ludGVycG9sYXRpb24gRXJyb3JdXG4iCisgICAgICAgICAgICAibmFtZT0lKHJlZmVyZW5jZSlzXG4iLAorICAgICAgICAgICAgIyBubyBkZWZpbml0aW9uIGZvciAncmVmZXJlbmNlJworICAgICAgICAgICAgZGVmYXVsdHM9eyJnZXRuYW1lIjogIiUoX19uYW1lX18pcyJ9KQorCisgICAgZGVmIGNoZWNrX2l0ZW1zX2NvbmZpZyhzZWxmLCBleHBlY3RlZCk6CisgICAgICAgIGNmID0gc2VsZi5mcm9tc3RyaW5nKAorICAgICAgICAgICAgIltzZWN0aW9uXVxuIgorICAgICAgICAgICAgIm5hbWUgPSB2YWx1ZVxuIgorICAgICAgICAgICAgImtleTogfCUobmFtZSlzfCBcbiIKKyAgICAgICAgICAgICJnZXRkZWZhdWx0OiB8JShkZWZhdWx0KXN8XG4iCisgICAgICAgICAgICAiZ2V0bmFtZTogfCUoX19uYW1lX18pc3wiLAorICAgICAgICAgICAgZGVmYXVsdHM9eyJkZWZhdWx0IjogIjxkZWZhdWx0PiJ9KQorICAgICAgICBMID0gbGlzdChjZi5pdGVtcygic2VjdGlvbiIpKQorICAgICAgICBMLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwsIGV4cGVjdGVkKQorCisKK2NsYXNzIENvbmZpZ1BhcnNlclRlc3RDYXNlKFRlc3RDYXNlQmFzZSk6CisgICAgY29uZmlnX2NsYXNzID0gQ29uZmlnUGFyc2VyLkNvbmZpZ1BhcnNlcgorICAgIGFsbG93X25vX3ZhbHVlID0gVHJ1ZQorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbihzZWxmKToKKyAgICAgICAgcmF3dmFsID0geworICAgICAgICAgICAgQ29uZmlnUGFyc2VyLkNvbmZpZ1BhcnNlcjogKCJzb21ldGhpbmcgJSh3aXRoMTEpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvdHMgb2YgaW50ZXJwb2xhdGlvbiAoMTEgc3RlcHMpIiksCisgICAgICAgICAgICBDb25maWdQYXJzZXIuU2FmZUNvbmZpZ1BhcnNlcjogIiUod2l0aDEpcyIsCisgICAgICAgIH0KKyAgICAgICAgY2YgPSBzZWxmLmdldF9pbnRlcnBvbGF0aW9uX2NvbmZpZygpCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJnZXRuYW1lIiksICJGb28iKQorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJiYXIiKSwgInNvbWV0aGluZyB3aXRoIGludGVycG9sYXRpb24gKDEgc3RlcCkiKQorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJiYXI5IiksCisgICAgICAgICAgICJzb21ldGhpbmcgd2l0aCBsb3RzIG9mIGludGVycG9sYXRpb24gKDkgc3RlcHMpIikKKyAgICAgICAgZXEoY2YuZ2V0KCJGb28iLCAiYmFyMTAiKSwKKyAgICAgICAgICAgInNvbWV0aGluZyB3aXRoIGxvdHMgb2YgaW50ZXJwb2xhdGlvbiAoMTAgc3RlcHMpIikKKyAgICAgICAgc2VsZi5nZXRfZXJyb3IoQ29uZmlnUGFyc2VyLkludGVycG9sYXRpb25EZXB0aEVycm9yLCAiRm9vIiwgImJhcjExIikKKworICAgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25fbWlzc2luZ192YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5nZXRfaW50ZXJwb2xhdGlvbl9jb25maWcoKQorICAgICAgICBlID0gc2VsZi5nZXRfZXJyb3IoQ29uZmlnUGFyc2VyLkludGVycG9sYXRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcnBvbGF0aW9uIEVycm9yIiwgIm5hbWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUucmVmZXJlbmNlLCAicmVmZXJlbmNlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLnNlY3Rpb24sICJJbnRlcnBvbGF0aW9uIEVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm9wdGlvbiwgIm5hbWUiKQorCisgICAgZGVmIHRlc3RfaXRlbXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaXRlbXNfY29uZmlnKFsoJ2RlZmF1bHQnLCAnPGRlZmF1bHQ+JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2dldGRlZmF1bHQnLCAnfDxkZWZhdWx0PnwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZ2V0bmFtZScsICd8c2VjdGlvbnwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgna2V5JywgJ3x2YWx1ZXwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnbmFtZScsICd2YWx1ZScpXSkKKworICAgIGRlZiB0ZXN0X3NldF9ub25zdHJpbmdfdHlwZXMoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBjZi5hZGRfc2VjdGlvbignbm9uLXN0cmluZycpCisgICAgICAgIGNmLnNldCgnbm9uLXN0cmluZycsICdpbnQnLCAxKQorICAgICAgICBjZi5zZXQoJ25vbi1zdHJpbmcnLCAnbGlzdCcsIFswLCAxLCAxLCAyLCAzLCA1LCA4LCAxMywgJyUoJ10pCisgICAgICAgIGNmLnNldCgnbm9uLXN0cmluZycsICdkaWN0JywgeydwaSc6IDMuMTQxNTksICclKCc6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclKGxpc3QpJzogJyUobGlzdCknfSkKKyAgICAgICAgY2Yuc2V0KCdub24tc3RyaW5nJywgJ3N0cmluZ193aXRoX2ludGVycG9sYXRpb24nLCAnJShsaXN0KXMnKQorICAgICAgICBjZi5zZXQoJ25vbi1zdHJpbmcnLCAnbm8tdmFsdWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgnbm9uLXN0cmluZycsICdpbnQnLCByYXc9VHJ1ZSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2YuZ2V0LCAnbm9uLXN0cmluZycsICdpbnQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgnbm9uLXN0cmluZycsICdsaXN0JywgcmF3PVRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAxLCAxLCAyLCAzLCA1LCA4LCAxMywgJyUoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2YuZ2V0LCAnbm9uLXN0cmluZycsICdsaXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoJ25vbi1zdHJpbmcnLCAnZGljdCcsIHJhdz1UcnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J3BpJzogMy4xNDE1OSwgJyUoJzogMSwgJyUobGlzdCknOiAnJShsaXN0KSd9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNmLmdldCwgJ25vbi1zdHJpbmcnLCAnZGljdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCdub24tc3RyaW5nJywgJ3N0cmluZ193aXRoX2ludGVycG9sYXRpb24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXc9VHJ1ZSksICclKGxpc3QpcycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNmLmdldCwgJ25vbi1zdHJpbmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RyaW5nX3dpdGhfaW50ZXJwb2xhdGlvbicsIHJhdz1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoJ25vbi1zdHJpbmcnLCAnbm8tdmFsdWUnKSwgTm9uZSkKKworY2xhc3MgTXVsdGlsaW5lVmFsdWVzVGVzdENhc2UoVGVzdENhc2VCYXNlKToKKyAgICBjb25maWdfY2xhc3MgPSBDb25maWdQYXJzZXIuQ29uZmlnUGFyc2VyCisgICAgd29uZGVyZnVsX3NwYW0gPSAoIkknbSBoYXZpbmcgc3BhbSBzcGFtIHNwYW0gc3BhbSAiCisgICAgICAgICAgICAgICAgICAgICAgInNwYW0gc3BhbSBzcGFtIGJlYWtlZCBiZWFucyBzcGFtICIKKyAgICAgICAgICAgICAgICAgICAgICAic3BhbSBzcGFtIGFuZCBzcGFtISIpLnJlcGxhY2UoJyAnLCAnXHRcbicpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5uZXdjb25maWcoKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgcyA9ICdzZWN0aW9ue30nLmZvcm1hdChpKQorICAgICAgICAgICAgY2YuYWRkX3NlY3Rpb24ocykKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICBjZi5zZXQocywgJ2xvdmVseV9zcGFte30nLmZvcm1hdChqKSwgc2VsZi53b25kZXJmdWxfc3BhbSkKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3JykgYXMgZjoKKyAgICAgICAgICAgIGNmLndyaXRlKGYpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZG9taW5hdGluZ19tdWx0aWxpbmVfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIHdlJ3JlIHJlYWRpbmcgZnJvbSBmaWxlIGJlY2F1c2UgdGhpcyBpcyB3aGVyZSB0aGUgY29kZSBjaGFuZ2VkCisgICAgICAgICMgZHVyaW5nIHBlcmZvcm1hbmNlIHVwZGF0ZXMgaW4gUHl0aG9uIDMuMgorICAgICAgICBjZl9mcm9tX2ZpbGUgPSBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKSBhcyBmOgorICAgICAgICAgICAgY2ZfZnJvbV9maWxlLnJlYWRmcChmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmX2Zyb21fZmlsZS5nZXQoJ3NlY3Rpb244JywgJ2xvdmVseV9zcGFtNCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud29uZGVyZnVsX3NwYW0ucmVwbGFjZSgnXHRcbicsICdcbicpKQorCitjbGFzcyBSYXdDb25maWdQYXJzZXJUZXN0Q2FzZShUZXN0Q2FzZUJhc2UpOgorICAgIGNvbmZpZ19jbGFzcyA9IENvbmZpZ1BhcnNlci5SYXdDb25maWdQYXJzZXIKKworICAgIGRlZiB0ZXN0X2ludGVycG9sYXRpb24oc2VsZik6CisgICAgICAgIGNmID0gc2VsZi5nZXRfaW50ZXJwb2xhdGlvbl9jb25maWcoKQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoY2YuZ2V0KCJGb28iLCAiZ2V0bmFtZSIpLCAiJShfX25hbWVfXylzIikKKyAgICAgICAgZXEoY2YuZ2V0KCJGb28iLCAiYmFyIiksCisgICAgICAgICAgICJzb21ldGhpbmcgJSh3aXRoMSlzIGludGVycG9sYXRpb24gKDEgc3RlcCkiKQorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJiYXI5IiksCisgICAgICAgICAgICJzb21ldGhpbmcgJSh3aXRoOSlzIGxvdHMgb2YgaW50ZXJwb2xhdGlvbiAoOSBzdGVwcykiKQorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJiYXIxMCIpLAorICAgICAgICAgICAic29tZXRoaW5nICUod2l0aDEwKXMgbG90cyBvZiBpbnRlcnBvbGF0aW9uICgxMCBzdGVwcykiKQorICAgICAgICBlcShjZi5nZXQoIkZvbyIsICJiYXIxMSIpLAorICAgICAgICAgICAic29tZXRoaW5nICUod2l0aDExKXMgbG90cyBvZiBpbnRlcnBvbGF0aW9uICgxMSBzdGVwcykiKQorCisgICAgZGVmIHRlc3RfaXRlbXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaXRlbXNfY29uZmlnKFsoJ2RlZmF1bHQnLCAnPGRlZmF1bHQ+JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2dldGRlZmF1bHQnLCAnfCUoZGVmYXVsdClzfCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdnZXRuYW1lJywgJ3wlKF9fbmFtZV9fKXN8JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2tleScsICd8JShuYW1lKXN8JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ25hbWUnLCAndmFsdWUnKV0pCisKKyAgICBkZWYgdGVzdF9zZXRfbm9uc3RyaW5nX3R5cGVzKHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgY2YuYWRkX3NlY3Rpb24oJ25vbi1zdHJpbmcnKQorICAgICAgICBjZi5zZXQoJ25vbi1zdHJpbmcnLCAnaW50JywgMSkKKyAgICAgICAgY2Yuc2V0KCdub24tc3RyaW5nJywgJ2xpc3QnLCBbMCwgMSwgMSwgMiwgMywgNSwgOCwgMTNdKQorICAgICAgICBjZi5zZXQoJ25vbi1zdHJpbmcnLCAnZGljdCcsIHsncGknOiAzLjE0MTU5fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoJ25vbi1zdHJpbmcnLCAnaW50JyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCdub24tc3RyaW5nJywgJ2xpc3QnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbMCwgMSwgMSwgMiwgMywgNSwgOCwgMTNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgnbm9uLXN0cmluZycsICdkaWN0JyksIHsncGknOiAzLjE0MTU5fSkKKworCitjbGFzcyBTYWZlQ29uZmlnUGFyc2VyVGVzdENhc2UoQ29uZmlnUGFyc2VyVGVzdENhc2UpOgorICAgIGNvbmZpZ19jbGFzcyA9IENvbmZpZ1BhcnNlci5TYWZlQ29uZmlnUGFyc2VyCisKKyAgICBkZWYgdGVzdF9zYWZlX2ludGVycG9sYXRpb24oc2VsZik6CisgICAgICAgICMgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi81MTE3MzcKKyAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoIltzZWN0aW9uXVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uMT14eHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbjI9JShvcHRpb24xKXMveHh4XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvaz0lKG9wdGlvbjEpcy8lJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdF9vaz0lKG9wdGlvbjIpcy8lJXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNmLmdldCgic2VjdGlvbiIsICJvayIpLCAieHh4LyVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoInNlY3Rpb24iLCAibm90X29rIiksICJ4eHgveHh4LyVzIikKKworICAgIGRlZiB0ZXN0X3NldF9tYWxmb3JtYXR0ZWRfaW50ZXJwb2xhdGlvbihzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoIltzZWN0XVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uMT1mb29cbiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoJ3NlY3QnLCAib3B0aW9uMSIpLCAiZm9vIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjZi5zZXQsICJzZWN0IiwgIm9wdGlvbjEiLCAiJWZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMSIsICJmb28lIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24xIiwgImYlb28iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2YuZ2V0KCdzZWN0JywgIm9wdGlvbjEiKSwgImZvbyIpCisKKyAgICAgICAgIyBidWcgIzU3NDE6IGRvdWJsZSBwZXJjZW50cyBhcmUgKm5vdCogbWFsZm9ybWVkCisgICAgICAgIGNmLnNldCgic2VjdCIsICJvcHRpb24yIiwgImZvbyUlYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5nZXQoInNlY3QiLCAib3B0aW9uMiIpLCAiZm9vJWJhciIpCisKKyAgICBkZWYgdGVzdF9zZXRfbm9uc3RyaW5nX3R5cGVzKHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYuZnJvbXN0cmluZygiW3NlY3RdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24xPWZvb1xuIikKKyAgICAgICAgIyBDaGVjayB0aGF0IHdlIGdldCBhIFR5cGVFcnJvciB3aGVuIHNldHRpbmcgbm9uLXN0cmluZyB2YWx1ZXMKKyAgICAgICAgIyBpbiBhbiBleGlzdGluZyBzZWN0aW9uOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMSIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24xIiwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMSIsIG9iamVjdCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMiIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2Yuc2V0LCAic2VjdCIsICJvcHRpb24yIiwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNmLnNldCwgInNlY3QiLCAib3B0aW9uMiIsIG9iamVjdCgpKQorCisgICAgZGVmIHRlc3RfYWRkX3NlY3Rpb25fZGVmYXVsdF8xKHNlbGYpOgorICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2YuYWRkX3NlY3Rpb24sICJkZWZhdWx0IikKKworICAgIGRlZiB0ZXN0X2FkZF9zZWN0aW9uX2RlZmF1bHRfMihzZWxmKToKKyAgICAgICAgY2YgPSBzZWxmLm5ld2NvbmZpZygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNmLmFkZF9zZWN0aW9uLCAiREVGQVVMVCIpCisKKworY2xhc3MgU2FmZUNvbmZpZ1BhcnNlclRlc3RDYXNlTm9WYWx1ZShTYWZlQ29uZmlnUGFyc2VyVGVzdENhc2UpOgorICAgIGFsbG93X25vX3ZhbHVlID0gVHJ1ZQorCitjbGFzcyBUZXN0Q2hhaW5NYXAodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2lzc3VlXzEyNzE3KHNlbGYpOgorICAgICAgICBkMSA9IGRpY3QocmVkPTEsIGdyZWVuPTIpCisgICAgICAgIGQyID0gZGljdChncmVlbj0zLCBibHVlPTQpCisgICAgICAgIGRjb21iID0gZDIuY29weSgpCisgICAgICAgIGRjb21iLnVwZGF0ZShkMSkKKyAgICAgICAgY20gPSBDb25maWdQYXJzZXIuX0NoYWlubWFwKGQxLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGNtLmtleXMoKSwgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoY20ua2V5cygpKSwgc2V0KGRjb21iLmtleXMoKSkpICAgICAgIyBrZXlzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoY20udmFsdWVzKCkpLCBzZXQoZGNvbWIudmFsdWVzKCkpKSAgIyB2YWx1ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChjbS5pdGVtcygpKSwgc2V0KGRjb21iLml0ZW1zKCkpKSAgICAjIGl0ZW1zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoY20pLCBzZXQoZGNvbWIpKSAgICAgICAgICAgICAgICAgICAgIyBfX2l0ZXJfXyAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLCBkY29tYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIF9fZXFfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2NtW2tdIGZvciBrIGluIGRjb21iXSwgZGNvbWIudmFsdWVzKCkpICMgX19nZXRpdGVtX18oKQorICAgICAgICBrbGlzdCA9ICdyZWQgZ3JlZW4gYmx1ZSBibGFjayBicm93bicuc3BsaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtjbS5nZXQoaywgMTApIGZvciBrIGluIGtsaXN0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbZGNvbWIuZ2V0KGssIDEwKSBmb3IgayBpbiBrbGlzdF0pICAgICAgIyBnZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtrIGluIGNtIGZvciBrIGluIGtsaXN0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbayBpbiBkY29tYiBmb3IgayBpbiBrbGlzdF0pICAgICAgICAgICAgIyBfX2NvbnRhaW5zX18oKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtjbS5oYXNfa2V5KGspIGZvciBrIGluIGtsaXN0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rjb21iLmhhc19rZXkoaykgZm9yIGsgaW4ga2xpc3RdKSAgIyBoYXNfa2V5KCkKKworY2xhc3MgSXNzdWU3MDA1VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3Qgb3V0cHV0IHdoZW4gTm9uZSBpcyBzZXQoKSBhcyBhIHZhbHVlIGFuZCBhbGxvd19ub192YWx1ZSA9PSBGYWxzZS4KKworICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3MDA1CisKKyAgICAiIiIKKworICAgIGV4cGVjdGVkX291dHB1dCA9ICJbc2VjdGlvbl1cbm9wdGlvbiA9IE5vbmVcblxuIgorCisgICAgZGVmIHByZXBhcmUoc2VsZiwgY29uZmlnX2NsYXNzKToKKyAgICAgICAgIyBUaGlzIGlzIHRoZSBkZWZhdWx0LCBidXQgdGhhdCdzIHRoZSBwb2ludC4KKyAgICAgICAgY3AgPSBjb25maWdfY2xhc3MoYWxsb3dfbm9fdmFsdWU9RmFsc2UpCisgICAgICAgIGNwLmFkZF9zZWN0aW9uKCJzZWN0aW9uIikKKyAgICAgICAgY3Auc2V0KCJzZWN0aW9uIiwgIm9wdGlvbiIsIE5vbmUpCisgICAgICAgIHNpbyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgY3Aud3JpdGUoc2lvKQorICAgICAgICByZXR1cm4gc2lvLmdldHZhbHVlKCkKKworICAgIGRlZiB0ZXN0X25vbmVfYXNfdmFsdWVfc3RyaW5naWZpZWQoc2VsZik6CisgICAgICAgIG91dHB1dCA9IHNlbGYucHJlcGFyZShDb25maWdQYXJzZXIuQ29uZmlnUGFyc2VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dCwgc2VsZi5leHBlY3RlZF9vdXRwdXQpCisKKyAgICBkZWYgdGVzdF9ub25lX2FzX3ZhbHVlX3N0cmluZ2lmaWVkX3JhdyhzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gc2VsZi5wcmVwYXJlKENvbmZpZ1BhcnNlci5SYXdDb25maWdQYXJzZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LCBzZWxmLmV4cGVjdGVkX291dHB1dCkKKworCitjbGFzcyBTb3J0ZWRUZXN0Q2FzZShSYXdDb25maWdQYXJzZXJUZXN0Q2FzZSk6CisgICAgZGVmIG5ld2NvbmZpZyhzZWxmLCBkZWZhdWx0cz1Ob25lKToKKyAgICAgICAgc2VsZi5jZiA9IHNlbGYuY29uZmlnX2NsYXNzKGRlZmF1bHRzPWRlZmF1bHRzLCBkaWN0X3R5cGU9U29ydGVkRGljdCkKKyAgICAgICAgcmV0dXJuIHNlbGYuY2YKKworICAgIGRlZiB0ZXN0X3NvcnRlZChzZWxmKToKKyAgICAgICAgc2VsZi5mcm9tc3RyaW5nKCJbYl1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvND0xXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAibzM9MlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIm8yPTNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvMT00XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiW2FdXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiaz12XG4iKQorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHNlbGYuY2Yud3JpdGUob3V0cHV0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbYV1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiayA9IHZcblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJbYl1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibzEgPSA0XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIm8yID0gM1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJvMyA9IDJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAibzQgPSAxXG5cbiIpCisKKworY2xhc3MgRXhjZXB0aW9uUGlja2xpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIGlzc3VlICMxMzc2MDogQ29uZmlnUGFyc2VyIGV4Y2VwdGlvbnMgYXJlIG5vdCBwaWNrbGFibGUuIiIiCisKKyAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5FcnJvcigndmFsdWUnKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3Rfbm9zZWN0aW9uZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuTm9TZWN0aW9uRXJyb3IoJ3NlY3Rpb24nKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5zZWN0aW9uLCBlMi5zZWN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X25vb3B0aW9uZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuTm9PcHRpb25FcnJvcignb3B0aW9uJywgJ3NlY3Rpb24nKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5zZWN0aW9uLCBlMi5zZWN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm9wdGlvbiwgZTIub3B0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X2R1cGxpY2F0ZXNlY3Rpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5EdXBsaWNhdGVTZWN0aW9uRXJyb3IoJ3NlY3Rpb24nKQorICAgICAgICBwaWNrbGVkID0gcGlja2xlLmR1bXBzKGUxKQorICAgICAgICBlMiA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLm1lc3NhZ2UsIGUyLm1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuYXJncywgZTIuYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5zZWN0aW9uLCBlMi5zZWN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X2ludGVycG9sYXRpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5JbnRlcnBvbGF0aW9uRXJyb3IoJ29wdGlvbicsICdzZWN0aW9uJywgJ21zZycpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEub3B0aW9uLCBlMi5vcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbm1pc3NpbmdvcHRpb25lcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5JbnRlcnBvbGF0aW9uTWlzc2luZ09wdGlvbkVycm9yKCdvcHRpb24nLCAnc2VjdGlvbicsCisgICAgICAgICAgICAncmF3dmFsJywgJ3JlZmVyZW5jZScpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEub3B0aW9uLCBlMi5vcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEucmVmZXJlbmNlLCBlMi5yZWZlcmVuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfaW50ZXJwb2xhdGlvbnN5bnRheGVycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLkludGVycG9sYXRpb25TeW50YXhFcnJvcignb3B0aW9uJywgJ3NlY3Rpb24nLCAnbXNnJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuc2VjdGlvbiwgZTIuc2VjdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5vcHRpb24sIGUyLm9wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGUxKSwgcmVwcihlMikpCisKKyAgICBkZWYgdGVzdF9pbnRlcnBvbGF0aW9uZGVwdGhlcnJvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHBpY2tsZQorICAgICAgICBlMSA9IENvbmZpZ1BhcnNlci5JbnRlcnBvbGF0aW9uRGVwdGhFcnJvcignb3B0aW9uJywgJ3NlY3Rpb24nLAorICAgICAgICAgICAgJ3Jhd3ZhbCcpCisgICAgICAgIHBpY2tsZWQgPSBwaWNrbGUuZHVtcHMoZTEpCisgICAgICAgIGUyID0gcGlja2xlLmxvYWRzKHBpY2tsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubWVzc2FnZSwgZTIubWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5hcmdzLCBlMi5hcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLnNlY3Rpb24sIGUyLnNlY3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEub3B0aW9uLCBlMi5vcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisgICAgZGVmIHRlc3RfcGFyc2luZ2Vycm9yKHNlbGYpOgorICAgICAgICBpbXBvcnQgcGlja2xlCisgICAgICAgIGUxID0gQ29uZmlnUGFyc2VyLlBhcnNpbmdFcnJvcignc291cmNlJykKKyAgICAgICAgZTEuYXBwZW5kKDEsICdsaW5lMScpCisgICAgICAgIGUxLmFwcGVuZCgyLCAnbGluZTInKQorICAgICAgICBlMS5hcHBlbmQoMywgJ2xpbmUzJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEuZmlsZW5hbWUsIGUyLmZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmVycm9ycywgZTIuZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZTEpLCByZXByKGUyKSkKKworICAgIGRlZiB0ZXN0X21pc3NpbmdzZWN0aW9uaGVhZGVyZXJyb3Ioc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgZTEgPSBDb25maWdQYXJzZXIuTWlzc2luZ1NlY3Rpb25IZWFkZXJFcnJvcignZmlsZW5hbWUnLCAxMjMsICdsaW5lJykKKyAgICAgICAgcGlja2xlZCA9IHBpY2tsZS5kdW1wcyhlMSkKKyAgICAgICAgZTIgPSBwaWNrbGUubG9hZHMocGlja2xlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5tZXNzYWdlLCBlMi5tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUxLmFyZ3MsIGUyLmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubGluZSwgZTIubGluZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlMS5maWxlbmFtZSwgZTIuZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZTEubGluZW5vLCBlMi5saW5lbm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihlMSksIHJlcHIoZTIpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBDb25maWdQYXJzZXJUZXN0Q2FzZSwKKyAgICAgICAgTXVsdGlsaW5lVmFsdWVzVGVzdENhc2UsCisgICAgICAgIFJhd0NvbmZpZ1BhcnNlclRlc3RDYXNlLAorICAgICAgICBTYWZlQ29uZmlnUGFyc2VyVGVzdENhc2UsCisgICAgICAgIFNhZmVDb25maWdQYXJzZXJUZXN0Q2FzZU5vVmFsdWUsCisgICAgICAgIFNvcnRlZFRlc3RDYXNlLAorICAgICAgICBJc3N1ZTcwMDVUZXN0Q2FzZSwKKyAgICAgICAgVGVzdENoYWluTWFwLAorICAgICAgICBFeGNlcHRpb25QaWNrbGluZ1Rlc3RDYXNlLAorICAgICAgICApCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NmZ3BhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NmZ3BhcnNlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NmZ3BhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMGVjZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NmZ3BhcnNlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2dpLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2dpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YWJlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZ2kucHkKQEAgLTAsMCArMSwzOTQgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgY2hlY2tfd2FybmluZ3MKK2ltcG9ydCBjZ2kKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgSGFja2VkU3lzTW9kdWxlOgorICAgICMgVGhlIHJlZ3Jlc3Npb24gdGVzdCB3aWxsIGhhdmUgcmVhbCB2YWx1ZXMgaW4gc3lzLmFyZ3YsIHdoaWNoCisgICAgIyB3aWxsIGNvbXBsZXRlbHkgY29uZnVzZSB0aGUgdGVzdCBvZiB0aGUgY2dpIG1vZHVsZQorICAgIGFyZ3YgPSBbXQorICAgIHN0ZGluID0gc3lzLnN0ZGluCisKK2NnaS5zeXMgPSBIYWNrZWRTeXNNb2R1bGUoKQorCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworY2xhc3MgQ29tcGFyYWJsZUV4Y2VwdGlvbjoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZXJyKToKKyAgICAgICAgc2VsZi5lcnIgPSBlcnIKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc3RyKHNlbGYuZXJyKQorCisgICAgZGVmIF9fY21wX18oc2VsZiwgYW5FeGMpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhbkV4YywgRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICB4ID0gY21wKHNlbGYuZXJyLl9fY2xhc3NfXywgYW5FeGMuX19jbGFzc19fKQorICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICByZXR1cm4gY21wKHNlbGYuZXJyLmFyZ3MsIGFuRXhjLmFyZ3MpCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYuZXJyLCBhdHRyKQorCitkZWYgZG9fdGVzdChidWYsIG1ldGhvZCk6CisgICAgZW52ID0ge30KKyAgICBpZiBtZXRob2QgPT0gIkdFVCI6CisgICAgICAgIGZwID0gTm9uZQorICAgICAgICBlbnZbJ1JFUVVFU1RfTUVUSE9EJ10gPSAnR0VUJworICAgICAgICBlbnZbJ1FVRVJZX1NUUklORyddID0gYnVmCisgICAgZWxpZiBtZXRob2QgPT0gIlBPU1QiOgorICAgICAgICBmcCA9IFN0cmluZ0lPKGJ1ZikKKyAgICAgICAgZW52WydSRVFVRVNUX01FVEhPRCddID0gJ1BPU1QnCisgICAgICAgIGVudlsnQ09OVEVOVF9UWVBFJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJworICAgICAgICBlbnZbJ0NPTlRFTlRfTEVOR1RIJ10gPSBzdHIobGVuKGJ1ZikpCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gbWV0aG9kOiAlcyIgJSBtZXRob2QKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBjZ2kucGFyc2UoZnAsIGVudiwgc3RyaWN0X3BhcnNpbmc9MSkKKyAgICBleGNlcHQgU3RhbmRhcmRFcnJvciwgZXJyOgorICAgICAgICByZXR1cm4gQ29tcGFyYWJsZUV4Y2VwdGlvbihlcnIpCisKK3BhcnNlX3N0cmljdF90ZXN0X2Nhc2VzID0gWworICAgICgiIiwgVmFsdWVFcnJvcigiYmFkIHF1ZXJ5IGZpZWxkOiAnJyIpKSwKKyAgICAoIiYiLCBWYWx1ZUVycm9yKCJiYWQgcXVlcnkgZmllbGQ6ICcnIikpLAorICAgICgiJiYiLCBWYWx1ZUVycm9yKCJiYWQgcXVlcnkgZmllbGQ6ICcnIikpLAorICAgICgiOyIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJyciKSksCisgICAgKCI7JjsiLCBWYWx1ZUVycm9yKCJiYWQgcXVlcnkgZmllbGQ6ICcnIikpLAorICAgICMgU2hvdWxkIHRoZSBuZXh0IGZldyByZWFsbHkgYmUgdmFsaWQ/CisgICAgKCI9Iiwge30pLAorICAgICgiPSY9Iiwge30pLAorICAgICgiPTs9Iiwge30pLAorICAgICMgVGhpcyByZXN0IHNlZW0gdG8gbWFrZSBzZW5zZQorICAgICgiPWEiLCB7Jyc6IFsnYSddfSksCisgICAgKCImPWEiLCBWYWx1ZUVycm9yKCJiYWQgcXVlcnkgZmllbGQ6ICcnIikpLAorICAgICgiPWEmIiwgVmFsdWVFcnJvcigiYmFkIHF1ZXJ5IGZpZWxkOiAnJyIpKSwKKyAgICAoIj0mYSIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJ2EnIikpLAorICAgICgiYj1hIiwgeydiJzogWydhJ119KSwKKyAgICAoImIrPWEiLCB7J2IgJzogWydhJ119KSwKKyAgICAoImE9Yj1hIiwgeydhJzogWydiPWEnXX0pLAorICAgICgiYT0rYj1hIiwgeydhJzogWycgYj1hJ119KSwKKyAgICAoIiZiPWEiLCBWYWx1ZUVycm9yKCJiYWQgcXVlcnkgZmllbGQ6ICcnIikpLAorICAgICgiYiY9YSIsIFZhbHVlRXJyb3IoImJhZCBxdWVyeSBmaWVsZDogJ2InIikpLAorICAgICgiYT1hK2ImYj1iK2MiLCB7J2EnOiBbJ2EgYiddLCAnYic6IFsnYiBjJ119KSwKKyAgICAoImE9YStiJmE9YithIiwgeydhJzogWydhIGInLCAnYiBhJ119KSwKKyAgICAoIng9MSZ5PTIuMCZ6PTItMy4lMmIwIiwgeyd4JzogWycxJ10sICd5JzogWycyLjAnXSwgJ3onOiBbJzItMy4rMCddfSksCisgICAgKCJ4PTE7eT0yLjAmej0yLTMuJTJiMCIsIHsneCc6IFsnMSddLCAneSc6IFsnMi4wJ10sICd6JzogWycyLTMuKzAnXX0pLAorICAgICgieD0xO3k9Mi4wO3o9Mi0zLiUyYjAiLCB7J3gnOiBbJzEnXSwgJ3knOiBbJzIuMCddLCAneic6IFsnMi0zLiswJ119KSwKKyAgICAoIkhiYzUxNjExNjhjNTQyMzMzNjMzMzE1ZGVlMTE4MjIyNzprZXlfc3RvcmVfc2VxaWQ9NDAwMDA2JmN1eWVyPXImdmlldz1idXN0b21lciZvcmRlcl9pZD0wYmIyZTI0ODYzODgzM2Q0OGNiN2ZlZDMwMDAwMGYxYiZleHBpcmU9OTY0NTQ2MjYzJmxvYmFsZT1lbi1VUyZraWQ9MTMwMDAzLjMwMDAzOCZzcz1lbnYiLAorICAgICB7J0hiYzUxNjExNjhjNTQyMzMzNjMzMzE1ZGVlMTE4MjIyNzprZXlfc3RvcmVfc2VxaWQnOiBbJzQwMDAwNiddLAorICAgICAgJ2N1eWVyJzogWydyJ10sCisgICAgICAnZXhwaXJlJzogWyc5NjQ1NDYyNjMnXSwKKyAgICAgICdraWQnOiBbJzEzMDAwMy4zMDAwMzgnXSwKKyAgICAgICdsb2JhbGUnOiBbJ2VuLVVTJ10sCisgICAgICAnb3JkZXJfaWQnOiBbJzBiYjJlMjQ4NjM4ODMzZDQ4Y2I3ZmVkMzAwMDAwZjFiJ10sCisgICAgICAnc3MnOiBbJ2VudiddLAorICAgICAgJ3ZpZXcnOiBbJ2J1c3RvbWVyJ10sCisgICAgICB9KSwKKworICAgICgiZ3JvdXBfaWQ9NTQ3MCZzZXQ9Y3VzdG9tJl9hc3NpZ25lZF90bz0zMTM5MiZfc3RhdHVzPTEmX2NhdGVnb3J5PTEwMCZTVUJNSVQ9QnJvd3NlIiwKKyAgICAgeydTVUJNSVQnOiBbJ0Jyb3dzZSddLAorICAgICAgJ19hc3NpZ25lZF90byc6IFsnMzEzOTInXSwKKyAgICAgICdfY2F0ZWdvcnknOiBbJzEwMCddLAorICAgICAgJ19zdGF0dXMnOiBbJzEnXSwKKyAgICAgICdncm91cF9pZCc6IFsnNTQ3MCddLAorICAgICAgJ3NldCc6IFsnY3VzdG9tJ10sCisgICAgICB9KQorICAgIF0KKworZGVmIGZpcnN0X2VsdHMobGlzdCk6CisgICAgcmV0dXJuIG1hcChsYW1iZGEgeDp4WzBdLCBsaXN0KQorCitkZWYgZmlyc3Rfc2Vjb25kX2VsdHMobGlzdCk6CisgICAgcmV0dXJuIG1hcChsYW1iZGEgcDoocFswXSwgcFsxXVswXSksIGxpc3QpCisKK2RlZiBnZW5fcmVzdWx0KGRhdGEsIGVudmlyb24pOgorICAgIGZha2Vfc3RkaW4gPSBTdHJpbmdJTyhkYXRhKQorICAgIGZha2Vfc3RkaW4uc2VlaygwKQorICAgIGZvcm0gPSBjZ2kuRmllbGRTdG9yYWdlKGZwPWZha2Vfc3RkaW4sIGVudmlyb249ZW52aXJvbikKKworICAgIHJlc3VsdCA9IHt9CisgICAgZm9yIGssIHYgaW4gZGljdChmb3JtKS5pdGVtcygpOgorICAgICAgICByZXN1bHRba10gPSBpc2luc3RhbmNlKHYsIGxpc3QpIGFuZCBmb3JtLmdldGxpc3Qoaykgb3Igdi52YWx1ZQorCisgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBDZ2lUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lc2NhcGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInRlc3QgJmFtcDsgc3RyaW5nIiwgY2dpLmVzY2FwZSgidGVzdCAmIHN0cmluZyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCImbHQ7dGVzdCBzdHJpbmcmZ3Q7IiwgY2dpLmVzY2FwZSgiPHRlc3Qgc3RyaW5nPiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCImcXVvdDt0ZXN0IHN0cmluZyZxdW90OyIsIGNnaS5lc2NhcGUoJyJ0ZXN0IHN0cmluZyInLCBUcnVlKSkKKworICAgIGRlZiB0ZXN0X3N0cmljdChzZWxmKToKKyAgICAgICAgZm9yIG9yaWcsIGV4cGVjdCBpbiBwYXJzZV9zdHJpY3RfdGVzdF9jYXNlczoKKyAgICAgICAgICAgICMgVGVzdCBiYXNpYyBwYXJzaW5nCisgICAgICAgICAgICBkID0gZG9fdGVzdChvcmlnLCAiR0VUIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZXhwZWN0LCAiRXJyb3IgcGFyc2luZyAlcyIgJSByZXByKG9yaWcpKQorICAgICAgICAgICAgZCA9IGRvX3Rlc3Qob3JpZywgIlBPU1QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBleHBlY3QsICJFcnJvciBwYXJzaW5nICVzIiAlIHJlcHIob3JpZykpCisKKyAgICAgICAgICAgIGVudiA9IHsnUVVFUllfU1RSSU5HJzogb3JpZ30KKyAgICAgICAgICAgIGZjZCA9IGNnaS5Gb3JtQ29udGVudERpY3QoZW52KQorICAgICAgICAgICAgc2QgPSBjZ2kuU3ZGb3JtQ29udGVudERpY3QoZW52KQorICAgICAgICAgICAgZnMgPSBjZ2kuRmllbGRTdG9yYWdlKGVudmlyb249ZW52KQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3QsIGRpY3QpOgorICAgICAgICAgICAgICAgICMgdGVzdCBkaWN0IGludGVyZmFjZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV4cGVjdCksIGxlbihmY2QpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChleHBlY3Qua2V5cygpLCBmY2Qua2V5cygpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChleHBlY3QudmFsdWVzKCksIGZjZC52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoZXhwZWN0Lml0ZW1zKCksIGZjZC5pdGVtcygpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmNkLmdldCgibm9uZXhpc3RlbnQgZmllbGQiLCAiZGVmYXVsdCIpLCAiZGVmYXVsdCIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2QpLCBsZW4oZnMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChzZC5rZXlzKCksIGZzLmtleXMoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzLmdldHZhbHVlKCJub25leGlzdGVudCBmaWVsZCIsICJkZWZhdWx0IiksICJkZWZhdWx0IikKKyAgICAgICAgICAgICAgICAjIHRlc3QgaW5kaXZpZHVhbCBmaWVsZHMKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGV4cGVjdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdF92YWwgPSBleHBlY3Rba2V5XQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZmNkLmhhc19rZXkoa2V5KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKGZjZFtrZXldLCBleHBlY3Rba2V5XSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmY2QuZ2V0KGtleSwgImRlZmF1bHQiKSwgZmNkW2tleV0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmcy5oYXNfa2V5KGtleSkpCisgICAgICAgICAgICAgICAgICAgIGlmIGxlbihleHBlY3RfdmFsKSA+IDE6CisgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdmFsdWUgPSAwCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGVfdmFsdWUgPSAxCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNkW2tleV0KKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnMuZ2V0dmFsdWUoa2V5KSwgZXhwZWN0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaW5nbGVfdmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgZXhwZWN0X3ZhbFswXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnMuZ2V0dmFsdWUoa2V5KSwgZXhwZWN0X3ZhbFswXSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKHNkLmdldGxpc3Qoa2V5KSwgZXhwZWN0X3ZhbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2luZ2xlX3ZhbHVlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKHNkLnZhbHVlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfZWx0cyhleHBlY3QudmFsdWVzKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKHNkLml0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9zZWNvbmRfZWx0cyhleHBlY3QuaXRlbXMoKSkpCisKKyAgICBkZWYgdGVzdF93ZWlyZF9mb3JtY29udGVudGRpY3Qoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgd2VpcmQgRm9ybUNvbnRlbnREaWN0IGNsYXNzZXMKKyAgICAgICAgZW52ID0geydRVUVSWV9TVFJJTkcnOiAieD0xJnk9Mi4wJno9Mi0zLiUyYjAmMT0xYWJjIn0KKyAgICAgICAgZXhwZWN0ID0geyd4JzogMSwgJ3knOiAyLjAsICd6JzogJzItMy4rMCcsICcxJzogJzFhYmMnfQorICAgICAgICBkID0gY2dpLkludGVycEZvcm1Db250ZW50RGljdChlbnYpCisgICAgICAgIGZvciBrLCB2IGluIGV4cGVjdC5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW2tdLCB2KQorICAgICAgICBmb3IgaywgdiBpbiBkLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdFtrXSwgdikKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKGV4cGVjdC52YWx1ZXMoKSwgZC52YWx1ZXMoKSkKKworICAgIGRlZiB0ZXN0X2xvZyhzZWxmKToKKyAgICAgICAgY2dpLmxvZygiVGVzdGluZyIpCisKKyAgICAgICAgY2dpLmxvZ2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBjZ2kuaW5pdGxvZygiJXMiLCAiVGVzdGluZyBpbml0bG9nIDEiKQorICAgICAgICBjZ2kubG9nKCIlcyIsICJUZXN0aW5nIGxvZyAyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZ2kubG9nZnAuZ2V0dmFsdWUoKSwgIlRlc3RpbmcgaW5pdGxvZyAxXG5UZXN0aW5nIGxvZyAyXG4iKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cygiL2Rldi9udWxsIik6CisgICAgICAgICAgICBjZ2kubG9nZnAgPSBOb25lCisgICAgICAgICAgICBjZ2kubG9nZmlsZSA9ICIvZGV2L251bGwiCisgICAgICAgICAgICBjZ2kuaW5pdGxvZygiJXMiLCAiVGVzdGluZyBsb2cgMyIpCisgICAgICAgICAgICBjZ2kubG9nKCJUZXN0aW5nIGxvZyA0IikKKworICAgIGRlZiB0ZXN0X2ZpZWxkc3RvcmFnZV9yZWFkbGluZShzZWxmKToKKyAgICAgICAgIyBGaWVsZFN0b3JhZ2UgdXNlcyByZWFkbGluZSwgd2hpY2ggaGFzIHRoZSBjYXBhY2l0eSB0byByZWFkIGFsbAorICAgICAgICAjIGNvbnRlbnRzIG9mIHRoZSBpbnB1dCBmaWxlIGludG8gbWVtb3J5OyB3ZSB1c2UgcmVhZGxpbmUncyBzaXplIGFyZ3VtZW50CisgICAgICAgICMgdG8gcHJldmVudCB0aGF0IGZvciBmaWxlcyB0aGF0IGRvIG5vdCBjb250YWluIGFueSBuZXdsaW5lcyBpbgorICAgICAgICAjIG5vbi1HRVQvSEVBRCByZXF1ZXN0cworICAgICAgICBjbGFzcyBUZXN0UmVhZGxpbmVGaWxlOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLm51bWNhbGxzID0gMAorCisgICAgICAgICAgICBkZWYgcmVhZGxpbmUoc2VsZiwgc2l6ZT1Ob25lKToKKyAgICAgICAgICAgICAgICBzZWxmLm51bWNhbGxzICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlLnJlYWRsaW5lKHNpemUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZS5yZWFkbGluZSgpCisKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBmaWxlID0gc2VsZi5fX2RpY3RfX1snZmlsZSddCisgICAgICAgICAgICAgICAgYSA9IGdldGF0dHIoZmlsZSwgbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhLCBpbnQpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWUsIGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIGEKKworICAgICAgICBmID0gVGVzdFJlYWRsaW5lRmlsZSh0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkpCisgICAgICAgIGYud3JpdGUoJ3gnICogMjU2ICogMTAyNCkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIGVudiA9IHsnUkVRVUVTVF9NRVRIT0QnOidQVVQnfQorICAgICAgICBmcyA9IGNnaS5GaWVsZFN0b3JhZ2UoZnA9ZiwgZW52aXJvbj1lbnYpCisgICAgICAgICMgaWYgd2UncmUgbm90IGNodW5raW5nIHByb3Blcmx5LCByZWFkbGluZSBpcyBvbmx5IGNhbGxlZCB0d2ljZQorICAgICAgICAjIChieSByZWFkX2JpbmFyeSk7IGlmIHdlIGFyZSBjaHVua2luZyBwcm9wZXJseSwgaXQgd2lsbCBiZSBjYWxsZWQgNSB0aW1lcworICAgICAgICAjIGFzIGxvbmcgYXMgdGhlIGNodW5rc2l6ZSBpcyAxIDw8IDE2LgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5udW1jYWxscyA+IDIpCisKKyAgICBkZWYgdGVzdF9maWVsZHN0b3JhZ2VfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICAjVGVzdCBiYXNpYyBGaWVsZFN0b3JhZ2UgbXVsdGlwYXJ0IHBhcnNpbmcKKyAgICAgICAgZW52ID0geydSRVFVRVNUX01FVEhPRCc6J1BPU1QnLCAnQ09OVEVOVF9UWVBFJzonbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tNzIxODM3MzczMzUwNzA1NTI2Njg4MTY0Njg0JywgJ0NPTlRFTlRfTEVOR1RIJzonNTU4J30KKyAgICAgICAgcG9zdGRhdGEgPSAiIiItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTcyMTgzNzM3MzM1MDcwNTUyNjY4ODE2NDY4NAorQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJpZCIKKworMTIzNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0idGl0bGUiCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iZmlsZSI7IGZpbGVuYW1lPSJ0ZXN0LnR4dCIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCitUZXN0aW5nIDEyMy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ic3VibWl0IgorCisgQWRkXHgyMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03MjE4MzczNzMzNTA3MDU1MjY2ODgxNjQ2ODQtLQorIiIiCisgICAgICAgIGZzID0gY2dpLkZpZWxkU3RvcmFnZShmcD1TdHJpbmdJTyhwb3N0ZGF0YSksIGVudmlyb249ZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmcy5saXN0KSwgNCkKKyAgICAgICAgZXhwZWN0ID0gW3snbmFtZSc6J2lkJywgJ2ZpbGVuYW1lJzpOb25lLCAndmFsdWUnOicxMjM0J30sCisgICAgICAgICAgICAgICAgICB7J25hbWUnOid0aXRsZScsICdmaWxlbmFtZSc6Tm9uZSwgJ3ZhbHVlJzonJ30sCisgICAgICAgICAgICAgICAgICB7J25hbWUnOidmaWxlJywgJ2ZpbGVuYW1lJzondGVzdC50eHQnLCd2YWx1ZSc6J1Rlc3RpbmcgMTIzLlxuJ30sCisgICAgICAgICAgICAgICAgICB7J25hbWUnOidzdWJtaXQnLCAnZmlsZW5hbWUnOk5vbmUsICd2YWx1ZSc6JyBBZGQgJ31dCisgICAgICAgIGZvciB4IGluIHJhbmdlKGxlbihmcy5saXN0KSk6CisgICAgICAgICAgICBmb3IgaywgZXhwIGluIGV4cGVjdFt4XS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGdvdCA9IGdldGF0dHIoZnMubGlzdFt4XSwgaykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwKQorCisgICAgX3FzX3Jlc3VsdCA9IHsKKyAgICAgICAgJ2tleTEnOiAndmFsdWUxJywKKyAgICAgICAgJ2tleTInOiBbJ3ZhbHVlMngnLCAndmFsdWUyeSddLAorICAgICAgICAna2V5Myc6ICd2YWx1ZTMnLAorICAgICAgICAna2V5NCc6ICd2YWx1ZTQnCisgICAgfQorICAgIGRlZiB0ZXN0UVNBbmRVcmxFbmNvZGUoc2VsZik6CisgICAgICAgIGRhdGEgPSAia2V5Mj12YWx1ZTJ4JmtleTM9dmFsdWUzJmtleTQ9dmFsdWU0IgorICAgICAgICBlbnZpcm9uID0geworICAgICAgICAgICAgJ0NPTlRFTlRfTEVOR1RIJzogICBzdHIobGVuKGRhdGEpKSwKKyAgICAgICAgICAgICdDT05URU5UX1RZUEUnOiAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcsCisgICAgICAgICAgICAnUVVFUllfU1RSSU5HJzogICAgICdrZXkxPXZhbHVlMSZrZXkyPXZhbHVlMnknLAorICAgICAgICAgICAgJ1JFUVVFU1RfTUVUSE9EJzogICAnUE9TVCcsCisgICAgICAgIH0KKyAgICAgICAgdiA9IGdlbl9yZXN1bHQoZGF0YSwgZW52aXJvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9xc19yZXN1bHQsIHYpCisKKyAgICBkZWYgdGVzdFFTQW5kRm9ybURhdGEoc2VsZik6CisgICAgICAgIGRhdGEgPSAiIiIKKy0tLTEyMworQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJrZXkyIgorCit2YWx1ZTJ5CistLS0xMjMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ia2V5MyIKKwordmFsdWUzCistLS0xMjMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ia2V5NCIKKwordmFsdWU0CistLS0xMjMtLQorIiIiCisgICAgICAgIGVudmlyb24gPSB7CisgICAgICAgICAgICAnQ09OVEVOVF9MRU5HVEgnOiAgIHN0cihsZW4oZGF0YSkpLAorICAgICAgICAgICAgJ0NPTlRFTlRfVFlQRSc6ICAgICAnbXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LTEyMycsCisgICAgICAgICAgICAnUVVFUllfU1RSSU5HJzogICAgICdrZXkxPXZhbHVlMSZrZXkyPXZhbHVlMngnLAorICAgICAgICAgICAgJ1JFUVVFU1RfTUVUSE9EJzogICAnUE9TVCcsCisgICAgICAgIH0KKyAgICAgICAgdiA9IGdlbl9yZXN1bHQoZGF0YSwgZW52aXJvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9xc19yZXN1bHQsIHYpCisKKyAgICBkZWYgdGVzdFFTQW5kRm9ybURhdGFGaWxlKHNlbGYpOgorICAgICAgICBkYXRhID0gIiIiCistLS0xMjMKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ia2V5MiIKKwordmFsdWUyeQorLS0tMTIzCitDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImtleTMiCisKK3ZhbHVlMworLS0tMTIzCitDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9ImtleTQiCisKK3ZhbHVlNAorLS0tMTIzCitDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InVwbG9hZCI7IGZpbGVuYW1lPSJmYWtlLnR4dCIKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorCit0aGlzIGlzIHRoZSBjb250ZW50IG9mIHRoZSBmYWtlIGZpbGUKKworLS0tMTIzLS0KKyIiIgorICAgICAgICBlbnZpcm9uID0geworICAgICAgICAgICAgJ0NPTlRFTlRfTEVOR1RIJzogICBzdHIobGVuKGRhdGEpKSwKKyAgICAgICAgICAgICdDT05URU5UX1RZUEUnOiAgICAgJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PS0xMjMnLAorICAgICAgICAgICAgJ1FVRVJZX1NUUklORyc6ICAgICAna2V5MT12YWx1ZTEma2V5Mj12YWx1ZTJ4JywKKyAgICAgICAgICAgICdSRVFVRVNUX01FVEhPRCc6ICAgJ1BPU1QnLAorICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IHNlbGYuX3FzX3Jlc3VsdC5jb3B5KCkKKyAgICAgICAgcmVzdWx0LnVwZGF0ZSh7CisgICAgICAgICAgICAndXBsb2FkJzogJ3RoaXMgaXMgdGhlIGNvbnRlbnQgb2YgdGhlIGZha2UgZmlsZVxuJworICAgICAgICB9KQorICAgICAgICB2ID0gZ2VuX3Jlc3VsdChkYXRhLCBlbnZpcm9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgdikKKworICAgIGRlZiB0ZXN0X2RlcHJlY2F0ZWRfcGFyc2VfcXMoc2VsZik6CisgICAgICAgICMgdGhpcyBmdW5jIGlzIG1vdmVkIHRvIHVybHBhcnNlLCB0aGlzIGlzIGp1c3QgYSBzYW5pdHkgY2hlY2sKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygoJ2NnaS5wYXJzZV9xcyBpcyBkZXByZWNhdGVkLCB1c2UgdXJscGFyc2UuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyc2VfcXMgaW5zdGVhZCcsIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeydhJzogWydBMSddLCAnQic6IFsnQjMnXSwgJ2InOiBbJ0IyJ119LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZ2kucGFyc2VfcXMoJ2E9QTEmYj1CMiZCPUIzJykpCisKKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX3BhcnNlX3FzbChzZWxmKToKKyAgICAgICAgIyB0aGlzIGZ1bmMgaXMgbW92ZWQgdG8gdXJscGFyc2UsIHRoaXMgaXMganVzdCBhIHNhbml0eSBjaGVjaworICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnY2dpLnBhcnNlX3FzbCBpcyBkZXByZWNhdGVkLCB1c2UgdXJscGFyc2UuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFyc2VfcXNsIGluc3RlYWQnLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ2EnLCAnQTEnKSwgKCdiJywgJ0IyJyksICgnQicsICdCMycpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2dpLnBhcnNlX3FzbCgnYT1BMSZiPUIyJkI9QjMnKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX2hlYWRlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNnaS5wYXJzZV9oZWFkZXIoInRleHQvcGxhaW4iKSwKKyAgICAgICAgICAgICgidGV4dC9wbGFpbiIsIHt9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNnaS5wYXJzZV9oZWFkZXIoInRleHQvdm5kLmp1c3QubWFkZS50aGlzLnVwIDsgIiksCisgICAgICAgICAgICAoInRleHQvdm5kLmp1c3QubWFkZS50aGlzLnVwIiwge30pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcigidGV4dC9wbGFpbjtjaGFyc2V0PXVzLWFzY2lpIiksCisgICAgICAgICAgICAoInRleHQvcGxhaW4iLCB7ImNoYXJzZXQiOiAidXMtYXNjaWkifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCd0ZXh0L3BsYWluIDsgY2hhcnNldD0idXMtYXNjaWkiJyksCisgICAgICAgICAgICAoInRleHQvcGxhaW4iLCB7ImNoYXJzZXQiOiAidXMtYXNjaWkifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjZ2kucGFyc2VfaGVhZGVyKCd0ZXh0L3BsYWluIDsgY2hhcnNldD0idXMtYXNjaWkiOyBhbm90aGVyPW9wdCcpLAorICAgICAgICAgICAgKCJ0ZXh0L3BsYWluIiwgeyJjaGFyc2V0IjogInVzLWFzY2lpIiwgImFub3RoZXIiOiAib3B0In0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcignYXR0YWNobWVudDsgZmlsZW5hbWU9InNpbGx5LnR4dCInKSwKKyAgICAgICAgICAgICgiYXR0YWNobWVudCIsIHsiZmlsZW5hbWUiOiAic2lsbHkudHh0In0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcignYXR0YWNobWVudDsgZmlsZW5hbWU9InN0cmFuZ2U7bmFtZSInKSwKKyAgICAgICAgICAgICgiYXR0YWNobWVudCIsIHsiZmlsZW5hbWUiOiAic3RyYW5nZTtuYW1lIn0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY2dpLnBhcnNlX2hlYWRlcignYXR0YWNobWVudDsgZmlsZW5hbWU9InN0cmFuZ2U7bmFtZSI7c2l6ZT0xMjM7JyksCisgICAgICAgICAgICAoImF0dGFjaG1lbnQiLCB7ImZpbGVuYW1lIjogInN0cmFuZ2U7bmFtZSIsICJzaXplIjogIjEyMyJ9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNnaS5wYXJzZV9oZWFkZXIoJ2Zvcm0tZGF0YTsgbmFtZT0iZmlsZXMiOyBmaWxlbmFtZT0iZm9cXCJvO2JhciInKSwKKyAgICAgICAgICAgICgiZm9ybS1kYXRhIiwgeyJuYW1lIjogImZpbGVzIiwgImZpbGVuYW1lIjogJ2ZvIm87YmFyJ30pKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQ2dpVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NnaS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZ2kucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDgwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZ2kucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NnaS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZ2kucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDgwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jZ2kucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTg0MDU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2hhcm1hcGNvZGVjLnB5CkBAIC0wLDAgKzEsNTYgQEAKKyIiIiBQeXRob24gY2hhcmFjdGVyIG1hcHBpbmcgY29kZWMgdGVzdAorCitUaGlzIHVzZXMgdGhlIHRlc3QgY29kZWMgaW4gdGVzdGNvZGVjLnB5IGFuZCB0aHVzIGFsc28gdGVzdHMgdGhlCitlbmNvZGluZ3MgcGFja2FnZSBsb29rdXAgc2NoZW1lLgorCitXcml0dGVuIGJ5IE1hcmMtQW5kcmUgTGVtYnVyZyAobWFsQGxlbWJ1cmcuY29tKS4KKworKGMpIENvcHlyaWdodCAyMDAwIEd1aWRvIHZhbiBSb3NzdW0uCisKKyIiIiMiCisKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCwgdW5pdHRlc3QKKworaW1wb3J0IGNvZGVjcworCisjIFJlZ2lzdGVyIGEgc2VhcmNoIGZ1bmN0aW9uIHdoaWNoIGtub3dzIGFib3V0IG91ciBjb2RlYworZGVmIGNvZGVjX3NlYXJjaF9mdW5jdGlvbihlbmNvZGluZyk6CisgICAgaWYgZW5jb2RpbmcgPT0gJ3Rlc3Rjb2RlYyc6CisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdGNvZGVjCisgICAgICAgIHJldHVybiB0dXBsZSh0ZXN0Y29kZWMuZ2V0cmVnZW50cnkoKSkKKyAgICByZXR1cm4gTm9uZQorCitjb2RlY3MucmVnaXN0ZXIoY29kZWNfc2VhcmNoX2Z1bmN0aW9uKQorCisjIHRlc3QgY29kZWMncyBuYW1lIChzZWUgdGVzdC90ZXN0Y29kZWMucHkpCitjb2RlY25hbWUgPSAndGVzdGNvZGVjJworCitjbGFzcyBDaGFybWFwQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcngoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnYWJjJywgY29kZWNuYW1lKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ3hkZWYnLCBjb2RlY25hbWUpLCB1J2FiY2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnZGVmeCcsIGNvZGVjbmFtZSksIHUnZGVmYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdkeGYnLCBjb2RlY25hbWUpLCB1J2RhYmNmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdkeGZ4JywgY29kZWNuYW1lKSwgdSdkYWJjZmFiYycpCisKKyAgICBkZWYgdGVzdF9lbmNvZGV4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnYWJjJy5lbmNvZGUoY29kZWNuYW1lKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd4ZGVmJy5lbmNvZGUoY29kZWNuYW1lKSwgJ2FiY2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdkZWZ4Jy5lbmNvZGUoY29kZWNuYW1lKSwgJ2RlZmFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdkeGYnLmVuY29kZShjb2RlY25hbWUpLCAnZGFiY2YnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnZHhmeCcuZW5jb2RlKGNvZGVjbmFtZSksICdkYWJjZmFiYycpCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgneWRlZicsIGNvZGVjbmFtZSksIHUnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdkZWZ5JywgY29kZWNuYW1lKSwgdSdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ2R5ZicsIGNvZGVjbmFtZSksIHUnZGYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ2R5ZnknLCBjb2RlY25hbWUpLCB1J2RmJykKKworICAgIGRlZiB0ZXN0X21hcHRvdW5kZWZpbmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHVuaWNvZGUsICdhYmNcMDAxJywgY29kZWNuYW1lKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENoYXJtYXBDb2RlY1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jaGFybWFwY29kZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jaGFybWFwY29kZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NoYXJtYXBjb2RlYy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jaGFybWFwY29kZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYmE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jaGFybWFwY29kZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2wucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTAxMDJlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsLnB5CkBAIC0wLDAgKzEsODIgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIldoaW1weSB0ZXN0IHNjcmlwdCBmb3IgdGhlIGNsIG1vZHVsZQorICAgUm9nZXIgRS4gTWFzc2UKKyIiIgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgaW1wb3J0X21vZHVsZQorCitjbCA9IGltcG9ydF9tb2R1bGUoJ2NsJykKKworY2xhdHRycyA9IFsnQURERURfQUxHT1JJVEhNX0VSUk9SJywgJ0FMQVcnLCAnQUxHT1JJVEhNX0lEJywKKydBTEdPUklUSE1fVkVSU0lPTicsICdBVURJTycsICdBV0FSRV9FUlJPUicsICdBV0FSRV9NUEVHX0FVRElPJywKKydBV0FSRV9NVUxUSVJBVEUnLCAnQVdDTVBfQ09OU1RfUVVBTCcsICdBV0NNUF9GSVhFRF9SQVRFJywKKydBV0NNUF9JTkRFUEVOREVOVCcsICdBV0NNUF9KT0lOVF9TVEVSRU8nLCAnQVdDTVBfTE9TU0xFU1MnLAorJ0FXQ01QX01QRUdfTEFZRVJfSScsICdBV0NNUF9NUEVHX0xBWUVSX0lJJywgJ0FXQ01QX1NURVJFTycsCisnQWxnb3JpdGhtJywgJ0FsZ29yaXRobU51bWJlcicsICdBbGdvcml0aG1UeXBlJywgJ0F1ZGlvRm9ybWF0TmFtZScsCisnQkFEX0FMR09SSVRITV9OQU1FJywgJ0JBRF9BTEdPUklUSE1fVFlQRScsICdCQURfQkxPQ0tfU0laRScsCisnQkFEX0JPQVJEJywgJ0JBRF9CVUZGRVJJTkcnLCAnQkFEX0JVRkZFUkxFTkdUSF9ORUcnLAorJ0JBRF9CVUZGRVJMRU5HVEhfT0REJywgJ0JBRF9CVUZGRVJfRVhJU1RTJywgJ0JBRF9CVUZGRVJfSEFORExFJywKKydCQURfQlVGRkVSX1BPSU5URVInLCAnQkFEX0JVRkZFUl9RVUVSWV9TSVpFJywgJ0JBRF9CVUZGRVJfU0laRScsCisnQkFEX0JVRkZFUl9TSVpFX1BPSU5URVInLCAnQkFEX0JVRkZFUl9UWVBFJywKKydCQURfQ09NUFJFU1NJT05fU0NIRU1FJywgJ0JBRF9DT01QUkVTU09SX0hBTkRMRScsCisnQkFEX0NPTVBSRVNTT1JfSEFORExFX1BPSU5URVInLCAnQkFEX0ZSQU1FX1NJWkUnLAorJ0JBRF9GVU5DVElPTkFMSVRZJywgJ0JBRF9GVU5DVElPTl9QT0lOVEVSJywgJ0JBRF9IRUFERVJfU0laRScsCisnQkFEX0lOSVRJQUxfVkFMVUUnLCAnQkFEX0lOVEVSTkFMX0ZPUk1BVCcsICdCQURfTElDRU5TRScsCisnQkFEX01JTl9HVF9NQVgnLCAnQkFEX05PX0JVRkZFUlNQQUNFJywgJ0JBRF9OVU1CRVJfT0ZfQkxPQ0tTJywKKydCQURfUEFSQU0nLCAnQkFEX1BBUkFNX0lEX1BPSU5URVInLCAnQkFEX1BBUkFNX1RZUEUnLCAnQkFEX1BPSU5URVInLAorJ0JBRF9QVkJVRkZFUicsICdCQURfU0NIRU1FX1BPSU5URVInLCAnQkFEX1NUUkVBTV9IRUFERVInLAorJ0JBRF9TVFJJTkdfUE9JTlRFUicsICdCQURfVEVYVF9TVFJJTkdfUFRSJywgJ0JFU1RfRklUJywKKydCSURJUkVDVElPTkFMJywgJ0JJVFJBVEVfUE9MSUNZJywgJ0JJVFJBVEVfVEFSR0VUJywKKydCSVRTX1BFUl9DT01QT05FTlQnLCAnQkxFTkRJTkcnLCAnQkxPQ0tfU0laRScsICdCT1RUT01fVVAnLAorJ0JVRkZFUl9OT1RfQ1JFQVRFRCcsICdCVUZfREFUQScsICdCVUZfRlJBTUUnLCAnQnl0ZXNQZXJQaXhlbCcsCisnQnl0ZXNQZXJTYW1wbGUnLCAnQ0hBTk5FTF9QT0xJQ1knLCAnQ0hST01BX1RIUkVTSE9MRCcsICdDT0RFQycsCisnQ09NUE9ORU5UUycsICdDT01QUkVTU0VEX0JVRkZFUl9TSVpFJywgJ0NPTVBSRVNTSU9OX1JBVElPJywKKydDT01QUkVTU09SJywgJ0NPTlRJTlVPVVNfQkxPQ0snLCAnQ09OVElOVU9VU19OT05CTE9DSycsCisnQ29tcHJlc3NJbWFnZScsICdEQVRBJywgJ0RFQ09NUFJFU1NPUicsICdEZWNvbXByZXNzSW1hZ2UnLAorJ0VER0VfVEhSRVNIT0xEJywgJ0VOQUJMRV9JTUFHRUlORk8nLCAnRU5EX09GX1NFUVVFTkNFJywgJ0VOVU1fVkFMVUUnLAorJ0VYQUNUX0NPTVBSRVNTSU9OX1JBVElPJywgJ0VYVEVSTkFMX0RFVklDRScsICdGTE9BVElOR19FTlVNX1ZBTFVFJywKKydGTE9BVElOR19SQU5HRV9WQUxVRScsICdGUkFNRScsICdGUkFNRV9CVUZGRVJfU0laRScsCisnRlJBTUVfQlVGRkVSX1NJWkVfWkVSTycsICdGUkFNRV9SQVRFJywgJ0ZSQU1FX1RZUEUnLCAnRzcxMV9BTEFXJywKKydHNzExX1VMQVcnLCAnR1JBWVNDQUxFJywgJ0dldEFsZ29yaXRobU5hbWUnLCAnSERDQycsCisnSERDQ19TQU1QTEVTX1BFUl9USUxFJywgJ0hEQ0NfVElMRV9USFJFU0hPTEQnLCAnSEVBREVSX1NUQVJUX0NPREUnLAorJ0lNQUdFX0hFSUdIVCcsICdJTUFHRV9XSURUSCcsICdJTlRFUk5BTF9GT1JNQVQnLAorJ0lOVEVSTkFMX0lNQUdFX0hFSUdIVCcsICdJTlRFUk5BTF9JTUFHRV9XSURUSCcsICdJTlRSQScsICdKUEVHJywKKydKUEVHX0VSUk9SJywgJ0pQRUdfTlVNX1BBUkFNUycsICdKUEVHX1FVQUxJVFlfRkFDVE9SJywKKydKUEVHX1FVQU5USVpBVElPTl9UQUJMRVMnLCAnSlBFR19TT0ZUV0FSRScsICdKUEVHX1NUUkVBTV9IRUFERVJTJywKKydLRVlGUkFNRScsICdMQVNUX0ZSQU1FX0lOREVYJywgJ0xBWUVSJywgJ0xVTUFfVEhSRVNIT0xEJywKKydNQVhfTlVNQkVSX09GX0FVRElPX0FMR09SSVRITVMnLCAnTUFYX05VTUJFUl9PRl9PUklHSU5BTF9GT1JNQVRTJywKKydNQVhfTlVNQkVSX09GX1BBUkFNUycsICdNQVhfTlVNQkVSX09GX1ZJREVPX0FMR09SSVRITVMnLCAnTU9OTycsCisnTVBFR19WSURFTycsICdNVkMxJywgJ01WQzInLCAnTVZDMl9CTEVORElORycsICdNVkMyX0JMRU5ESU5HX09GRicsCisnTVZDMl9CTEVORElOR19PTicsICdNVkMyX0NIUk9NQV9USFJFU0hPTEQnLCAnTVZDMl9FREdFX1RIUkVTSE9MRCcsCisnTVZDMl9FUlJPUicsICdNVkMyX0xVTUFfVEhSRVNIT0xEJywgJ05FWFRfTk9UX0FWQUlMQUJMRScsCisnTk9JU0VfTUFSR0lOJywgJ05PTkUnLCAnTlVNQkVSX09GX0ZSQU1FUycsICdOVU1CRVJfT0ZfUEFSQU1TJywKKydPUklFTlRBVElPTicsICdPUklHSU5BTF9GT1JNQVQnLCAnT3BlbkNvbXByZXNzb3InLAorJ09wZW5EZWNvbXByZXNzb3InLCAnUEFSQU1fT1VUX09GX1JBTkdFJywgJ1BSRURJQ1RFRCcsICdQUkVST0xMJywKKydQYXJhbUlEJywgJ1BhcmFtTnVtYmVyJywgJ1BhcmFtVHlwZScsICdRVUFMSVRZX0ZBQ1RPUicsCisnUVVBTElUWV9MRVZFTCcsICdRdWVyeUFsZ29yaXRobXMnLCAnUXVlcnlNYXhIZWFkZXJTaXplJywKKydRdWVyeVNjaGVtZScsICdRdWVyeVNjaGVtZUZyb21OYW1lJywgJ1JBTkdFX1ZBTFVFJywgJ1JHQicsICdSR0IzMzInLAorJ1JHQjgnLCAnUkdCQScsICdSR0JYJywgJ1JMRScsICdSTEUyNCcsICdSVFInLCAnUlRSMScsCisnUlRSX1FVQUxJVFlfTEVWRUwnLCAnU0FNUExFU19QRVJfVElMRScsICdTQ0hFTUVfQlVTWScsCisnU0NIRU1FX05PVF9BVkFJTEFCTEUnLCAnU1BFRUQnLCAnU1RFUkVPX0lOVEVSTEVBVkVEJywKKydTVFJFQU1fSEVBREVSUycsICdTZXREZWZhdWx0JywgJ1NldE1heCcsICdTZXRNaW4nLCAnVElMRV9USFJFU0hPTEQnLAorJ1RPUF9ET1dOJywgJ1VMQVcnLCAnVU5DT01QUkVTU0VEJywgJ1VOQ09NUFJFU1NFRF9BVURJTycsCisnVU5DT01QUkVTU0VEX1ZJREVPJywgJ1VOS05PV05fU0NIRU1FJywgJ1ZJREVPJywgJ1ZpZGVvRm9ybWF0TmFtZScsCisnWScsICdZQ2JDcicsICdZQ2JDcjQyMicsICdZQ2JDcjQyMkRDJywgJ1lDYkNyNDIySEMnLCAnWVVWJywgJ1lVVjQyMicsCisnWVVWNDIyREMnLCAnWVVWNDIySEMnLCAnX19kb2NfXycsICdfX25hbWVfXycsICdjdnRfdHlwZScsICdlcnJvciddCisKKworIyBUaGlzIGlzIGEgdmVyeSBpbm9idHJ1c2l2ZSB0ZXN0IGZvciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBjbAorIyBtb2R1bGUgYW5kIGFsbCBpdHMgYXR0cmlidXRlcy4KKworZGVmIHRlc3RfbWFpbigpOgorICAgICMgdG91Y2ggYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGFsIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnVG91Y2hpbmcgY2wgbW9kdWxlIGF0dHJpYnV0ZXMuLi4nCisgICAgZm9yIGF0dHIgaW4gY2xhdHRyczoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd0b3VjaGluZzogJywgYXR0cgorICAgICAgICBnZXRhdHRyKGNsLCBhdHRyKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2wucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODE4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2wucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ODE4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbGFzcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWNkZjA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHkKQEAgLTAsMCArMSw2NDYgQEAKKyJUZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIFB5dGhvbiBjbGFzc2VzIGltcGxlbWVudGluZyBvcGVyYXRvcnMuIgorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKwordGVzdG1ldGhzID0gWworCisjIEJpbmFyeSBvcGVyYXRpb25zCisgICAgImFkZCIsCisgICAgInJhZGQiLAorICAgICJzdWIiLAorICAgICJyc3ViIiwKKyAgICAibXVsIiwKKyAgICAicm11bCIsCisgICAgImRpdiIsCisgICAgInJkaXYiLAorICAgICJtb2QiLAorICAgICJybW9kIiwKKyAgICAiZGl2bW9kIiwKKyAgICAicmRpdm1vZCIsCisgICAgInBvdyIsCisgICAgInJwb3ciLAorICAgICJyc2hpZnQiLAorICAgICJycnNoaWZ0IiwKKyAgICAibHNoaWZ0IiwKKyAgICAicmxzaGlmdCIsCisgICAgImFuZCIsCisgICAgInJhbmQiLAorICAgICJvciIsCisgICAgInJvciIsCisgICAgInhvciIsCisgICAgInJ4b3IiLAorCisjIExpc3QvZGljdCBvcGVyYXRpb25zCisgICAgImNvbnRhaW5zIiwKKyAgICAiZ2V0aXRlbSIsCisgICAgImdldHNsaWNlIiwKKyAgICAic2V0aXRlbSIsCisgICAgInNldHNsaWNlIiwKKyAgICAiZGVsaXRlbSIsCisgICAgImRlbHNsaWNlIiwKKworIyBVbmFyeSBvcGVyYXRpb25zCisgICAgIm5lZyIsCisgICAgInBvcyIsCisgICAgImFicyIsCisKKyMgZ2VuZXJpYyBvcGVyYXRpb25zCisgICAgImluaXQiLAorICAgIF0KKworIyBUaGVzZSBuZWVkIHRvIHJldHVybiBzb21ldGhpbmcgb3RoZXIgdGhhbiBOb25lCisjICAgICJjb2VyY2UiLAorIyAgICAiaGFzaCIsCisjICAgICJzdHIiLAorIyAgICAicmVwciIsCisjICAgICJpbnQiLAorIyAgICAibG9uZyIsCisjICAgICJmbG9hdCIsCisjICAgICJvY3QiLAorIyAgICAiaGV4IiwKKworIyBUaGVzZSBhcmUgc2VwYXJhdGUgYmVjYXVzZSB0aGV5IGNhbiBpbmZsdWVuY2UgdGhlIHRlc3Qgb2Ygb3RoZXIgbWV0aG9kcy4KKyMgICAgImdldGF0dHIiLAorIyAgICAic2V0YXR0ciIsCisjICAgICJkZWxhdHRyIiwKKworY2FsbExzdCA9IFtdCitkZWYgdHJhY2tDYWxsKGYpOgorICAgIGRlZiB0cmFjaygqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBjYWxsTHN0LmFwcGVuZCgoZi5fX25hbWVfXywgYXJncykpCisgICAgICAgIHJldHVybiBmKCphcmdzLCAqKmt3YXJncykKKyAgICByZXR1cm4gdHJhY2sKKworY2xhc3MgQWxsVGVzdHM6CisgICAgdHJhY2tDYWxsID0gdHJhY2tDYWxsCisKKyAgICBAdHJhY2tDYWxsCisgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gKHNlbGYsKSArIGFyZ3MKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19oYXNoX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gaGFzaChpZChzZWxmKSkKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19zdHJfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAiQWxsVGVzdHMiCisKKyAgICBAdHJhY2tDYWxsCisgICAgZGVmIF9fcmVwcl9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuICJBbGxUZXN0cyIKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19pbnRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAxCisKKyAgICBAdHJhY2tDYWxsCisgICAgZGVmIF9fZmxvYXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAxLjAKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19sb25nX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gMUwKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19vY3RfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAnMDEnCisKKyAgICBAdHJhY2tDYWxsCisgICAgZGVmIF9faGV4X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gJzB4MScKKworICAgIEB0cmFja0NhbGwKKyAgICBkZWYgX19jbXBfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJldHVybiAwCisKKyMgU3ludGhlc2l6ZSBhbGwgdGhlIG90aGVyIEFsbFRlc3RzIG1ldGhvZHMgZnJvbSB0aGUgbmFtZXMgaW4gdGVzdG1ldGhzLgorCittZXRob2RfdGVtcGxhdGUgPSAiIiJcCitAdHJhY2tDYWxsCitkZWYgX18lKG1ldGhvZClzX18oc2VsZiwgKmFyZ3MpOgorICAgIHBhc3MKKyIiIgorCitmb3IgbWV0aG9kIGluIHRlc3RtZXRoczoKKyAgICBleGVjIG1ldGhvZF90ZW1wbGF0ZSAlIGxvY2FscygpIGluIEFsbFRlc3RzLl9fZGljdF9fCisKK2RlbCBtZXRob2QsIG1ldGhvZF90ZW1wbGF0ZQorCitjbGFzcyBDbGFzc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorCisgICAgZGVmIGFzc2VydENhbGxTdGFjayhzZWxmLCBleHBlY3RlZF9jYWxscyk6CisgICAgICAgIGFjdHVhbENhbGxMaXN0ID0gY2FsbExzdFs6XSAgIyBuZWVkIHRvIGNvcHkgYmVjYXVzZSB0aGUgY29tcGFyaXNvbiBiZWxvdyB3aWxsIGFkZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkaXRpb25hbCBjYWxscyB0byBjYWxsTHN0CisgICAgICAgIGlmIGV4cGVjdGVkX2NhbGxzICE9IGFjdHVhbENhbGxMaXN0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBjYWxsIGxpc3Q6XG4gICVzXG5kb2VzIG5vdCBtYXRjaCBhY3R1YWwgY2FsbCBsaXN0XG4gICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdGVkX2NhbGxzLCBhY3R1YWxDYWxsTGlzdCkpCisKKyAgICBkZWYgdGVzdEluaXQoc2VsZik6CisgICAgICAgIGZvbyA9IEFsbFRlc3RzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19pbml0X18iLCAoZm9vLCkpXSkKKworICAgIGRlZiB0ZXN0QmluYXJ5T3BzKHNlbGYpOgorICAgICAgICB0ZXN0bWUgPSBBbGxUZXN0cygpCisgICAgICAgICMgQmluYXJ5IG9wZXJhdGlvbnMKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lICsgMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fYWRkX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxICsgdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19yYWRkX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgLSAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19zdWJfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgLSB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3JzdWJfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSAqIDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX211bF9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSAqIHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcm11bF9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBpZiAxLzIgPT0gMDoKKyAgICAgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAgICAgdGVzdG1lIC8gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX2Rpdl9fIiwgKHRlc3RtZSwgMSkpXSkKKworCisgICAgICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgICAgIDEgLyB0ZXN0bWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19yZGl2X18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgJSAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19tb2RfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgJSB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3Jtb2RfXyIsICh0ZXN0bWUsIDEpKV0pCisKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgZGl2bW9kKHRlc3RtZSwxKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fZGl2bW9kX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBkaXZtb2QoMSwgdGVzdG1lKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcmRpdm1vZF9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lICoqIDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3Bvd19fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSAqKiB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3Jwb3dfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSA+PiAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19yc2hpZnRfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgPj4gdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19ycnNoaWZ0X18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgPDwgMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fbHNoaWZ0X18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxIDw8IHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcmxzaGlmdF9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lICYgMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fYW5kX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxICYgdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19yYW5kX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgfCAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX19vcl9fIiwgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgMSB8IHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoIl9fcm9yX18iLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgXiAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgiX194b3JfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgXiB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCJfX3J4b3JfXyIsICh0ZXN0bWUsIDEpKV0pCisKKyAgICBkZWYgdGVzdExpc3RBbmREaWN0T3BzKHNlbGYpOgorICAgICAgICB0ZXN0bWUgPSBBbGxUZXN0cygpCisKKyAgICAgICAgIyBMaXN0L2RpY3Qgb3BlcmF0aW9ucworCisgICAgICAgIGNsYXNzIEVtcHR5OiBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgMSBpbiBFbXB0eSgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ZhaWxlZCwgc2hvdWxkIGhhdmUgcmFpc2VkIFR5cGVFcnJvcicpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgaW4gdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fY29udGFpbnNfXycsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZVsxXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2dldGl0ZW1fXycsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZVsxXSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19zZXRpdGVtX18nLCAodGVzdG1lLCAxLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBkZWwgdGVzdG1lWzFdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZGVsaXRlbV9fJywgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzo0Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19nZXRzbGljZV9fJywgKHRlc3RtZSwgMCwgNDIpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZVs6NDJdID0gIlRoZSBBbnN3ZXIiCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fc2V0c2xpY2VfXycsICh0ZXN0bWUsIDAsIDQyLCAiVGhlIEFuc3dlciIpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGRlbCB0ZXN0bWVbOjQyXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2RlbHNsaWNlX18nLCAodGVzdG1lLCAwLCA0MikpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzI6MTAyNDoxMF0KKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19nZXRpdGVtX18nLCAodGVzdG1lLCBzbGljZSgyLCAxMDI0LCAxMCkpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZVsyOjEwMjQ6MTBdID0gIkEgbG90IgorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX3NldGl0ZW1fXycsICh0ZXN0bWUsIHNsaWNlKDIsIDEwMjQsIDEwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkEgbG90IikpXSkKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGRlbCB0ZXN0bWVbMjoxMDI0OjEwXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2RlbGl0ZW1fXycsICh0ZXN0bWUsIHNsaWNlKDIsIDEwMjQsIDEwKSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzo0MiwgLi4uLCA6MjQ6LCAyNCwgMTAwXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2dldGl0ZW1fXycsICh0ZXN0bWUsIChzbGljZShOb25lLCA0MiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsbGlwc2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZShOb25lLCAyNCwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0LCAxMDApKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzo0MiwgLi4uLCA6MjQ6LCAyNCwgMTAwXSA9ICJTdHJhbmdlIgorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX3NldGl0ZW1fXycsICh0ZXN0bWUsIChzbGljZShOb25lLCA0MiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsbGlwc2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZShOb25lLCAyNCwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0LCAxMDApLCAiU3RyYW5nZSIpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBkZWwgdGVzdG1lWzo0MiwgLi4uLCA6MjQ6LCAyNCwgMTAwXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2RlbGl0ZW1fXycsICh0ZXN0bWUsIChzbGljZShOb25lLCA0MiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsbGlwc2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGljZShOb25lLCAyNCwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0LCAxMDApKSldKQorCisgICAgICAgICMgTm93IHJlbW92ZSB0aGUgc2xpY2UgaG9va3MgdG8gc2VlIGlmIGNvbnZlcnRpbmcgbm9ybWFsIHNsaWNlcyB0bworICAgICAgICAjICBzbGljZSBvYmplY3Qgd29ya3MuCisKKyAgICAgICAgZ2V0c2xpY2UgPSBBbGxUZXN0cy5fX2dldHNsaWNlX18KKyAgICAgICAgZGVsIEFsbFRlc3RzLl9fZ2V0c2xpY2VfXworICAgICAgICBzZXRzbGljZSA9IEFsbFRlc3RzLl9fc2V0c2xpY2VfXworICAgICAgICBkZWwgQWxsVGVzdHMuX19zZXRzbGljZV9fCisgICAgICAgIGRlbHNsaWNlID0gQWxsVGVzdHMuX19kZWxzbGljZV9fCisgICAgICAgIGRlbCBBbGxUZXN0cy5fX2RlbHNsaWNlX18KKworICAgICAgICAjIFhYWCB3aGVuIHVzaW5nIG5ldy1zdHlsZSBjbGFzc2VzIHRoZSBzbGljZSB0ZXN0bWVbOjQyXSBwcm9kdWNlcworICAgICAgICAjICBzbGljZShOb25lLCA0MiwgTm9uZSkgaW5zdGVhZCBvZiBzbGljZSgwLCA0MiwgTm9uZSkuIHB5M2sgd2lsbCBoYXZlCisgICAgICAgICMgIHRvIGNoYW5nZSB0aGlzIHRlc3QuCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWVbOjQyXQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2dldGl0ZW1fXycsICh0ZXN0bWUsIHNsaWNlKDAsIDQyLCBOb25lKSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lWzo0Ml0gPSAiVGhlIEFuc3dlciIKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19zZXRpdGVtX18nLCAodGVzdG1lLCBzbGljZSgwLCA0MiwgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBBbnN3ZXIiKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgZGVsIHRlc3RtZVs6NDJdCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZGVsaXRlbV9fJywgKHRlc3RtZSwgc2xpY2UoMCwgNDIsIE5vbmUpKSldKQorCisgICAgICAgICMgUmVzdG9yZSB0aGUgc2xpY2UgbWV0aG9kcywgb3IgdGhlIHRlc3RzIHdpbGwgZmFpbCB3aXRoIHJlZ3J0ZXN0IC1SLgorICAgICAgICBBbGxUZXN0cy5fX2dldHNsaWNlX18gPSBnZXRzbGljZQorICAgICAgICBBbGxUZXN0cy5fX3NldHNsaWNlX18gPSBzZXRzbGljZQorICAgICAgICBBbGxUZXN0cy5fX2RlbHNsaWNlX18gPSBkZWxzbGljZQorCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0RGVsSXRlbShzZWxmKToKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIG9rID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHNlbGYub2sgPSBUcnVlCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgIyBTdWJ0bGU6IHdlIG5lZWQgdG8gY2FsbCBQeVNlcXVlbmNlX1NldEl0ZW0sIG5vdCBQeU1hcHBpbmdfU2V0SXRlbS4KKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHNlcXVlbmNlX2RlbGl0ZW0KKyAgICAgICAgc2VxdWVuY2VfZGVsaXRlbShhLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5vaykKKworCisgICAgZGVmIHRlc3RVbmFyeU9wcyhzZWxmKToKKyAgICAgICAgdGVzdG1lID0gQWxsVGVzdHMoKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAtdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fbmVnX18nLCAodGVzdG1lLCkpXSkKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgICt0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19wb3NfXycsICh0ZXN0bWUsKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgYWJzKHRlc3RtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19hYnNfXycsICh0ZXN0bWUsKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgaW50KHRlc3RtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19pbnRfXycsICh0ZXN0bWUsKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgbG9uZyh0ZXN0bWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fbG9uZ19fJywgKHRlc3RtZSwpKV0pCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBmbG9hdCh0ZXN0bWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZmxvYXRfXycsICh0ZXN0bWUsKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgb2N0KHRlc3RtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19vY3RfXycsICh0ZXN0bWUsKSldKQorICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgaGV4KHRlc3RtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19oZXhfXycsICh0ZXN0bWUsKSldKQorCisKKyAgICBkZWYgdGVzdE1pc2Moc2VsZik6CisgICAgICAgIHRlc3RtZSA9IEFsbFRlc3RzKCkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgaGFzaCh0ZXN0bWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19faGFzaF9fJywgKHRlc3RtZSwpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHJlcHIodGVzdG1lKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX3JlcHJfXycsICh0ZXN0bWUsKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBzdHIodGVzdG1lKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX3N0cl9fJywgKHRlc3RtZSwpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSA9PSAxCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICh0ZXN0bWUsIDEpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZSA8IDEKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKHRlc3RtZSwgMSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgdGVzdG1lID4gMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICBldmFsKCd0ZXN0bWUgPD4gMScpICAjIFhYWCBraWxsIHRoaXMgaW4gcHkzaworICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUgIT0gMQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAodGVzdG1lLCAxKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxID09IHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAoMSwgdGVzdG1lKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxIDwgdGVzdG1lCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoIl9fY29lcmNlX18iLCAodGVzdG1lLCAxKSksICgnX19jbXBfXycsICgxLCB0ZXN0bWUpKV0pCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIDEgPiB0ZXN0bWUKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygiX19jb2VyY2VfXyIsICh0ZXN0bWUsIDEpKSwgKCdfX2NtcF9fJywgKDEsIHRlc3RtZSkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgZXZhbCgnMSA8PiB0ZXN0bWUnKQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAoMSwgdGVzdG1lKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICAxICE9IHRlc3RtZQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCJfX2NvZXJjZV9fIiwgKHRlc3RtZSwgMSkpLCAoJ19fY21wX18nLCAoMSwgdGVzdG1lKSldKQorCisKKyAgICBkZWYgdGVzdEdldFNldEFuZERlbChzZWxmKToKKyAgICAgICAgIyBJbnRlcmZlcmluZyB0ZXN0cworICAgICAgICBjbGFzcyBFeHRyYVRlc3RzKEFsbFRlc3RzKToKKyAgICAgICAgICAgIEB0cmFja0NhbGwKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICJTb21lVmFsIgorCisgICAgICAgICAgICBAdHJhY2tDYWxsCisgICAgICAgICAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgQHRyYWNrQ2FsbAorICAgICAgICAgICAgZGVmIF9fZGVsYXR0cl9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdG1lID0gRXh0cmFUZXN0cygpCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIHRlc3RtZS5zcGFtCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fZ2V0YXR0cl9fJywgKHRlc3RtZSwgInNwYW0iKSldKQorCisgICAgICAgIGNhbGxMc3RbOl0gPSBbXQorICAgICAgICB0ZXN0bWUuZWdncyA9ICJzcGFtLCBzcGFtLCBzcGFtIGFuZCBoYW0iCisgICAgICAgIHNlbGYuYXNzZXJ0Q2FsbFN0YWNrKFsoJ19fc2V0YXR0cl9fJywgKHRlc3RtZSwgImVnZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3BhbSwgc3BhbSwgc3BhbSBhbmQgaGFtIikpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgZGVsIHRlc3RtZS5jYXJkaW5hbAorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2RlbGF0dHJfXycsICh0ZXN0bWUsICJjYXJkaW5hbCIpKV0pCisKKyAgICBkZWYgdGVzdERlbChzZWxmKToKKyAgICAgICAgeCA9IFtdCisKKyAgICAgICAgY2xhc3MgRGVsVGVzdDoKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHguYXBwZW5kKCJjcmFiIHBlb3BsZSwgY3JhYiBwZW9wbGUiKQorICAgICAgICB0ZXN0bWUgPSBEZWxUZXN0KCkKKyAgICAgICAgZGVsIHRlc3RtZQorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyJjcmFiIHBlb3BsZSwgY3JhYiBwZW9wbGUiXSwgeCkKKworICAgIGRlZiB0ZXN0QmFkVHlwZVJldHVybmVkKHNlbGYpOgorICAgICAgICAjIHJldHVybiB2YWx1ZXMgb2Ygc29tZSBtZXRob2QgYXJlIHR5cGUtY2hlY2tlZAorICAgICAgICBjbGFzcyBCYWRUeXBlQ2xhc3M6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgX19mbG9hdF9fID0gX19pbnRfXworICAgICAgICAgICAgX19sb25nX18gPSBfX2ludF9fCisgICAgICAgICAgICBfX3N0cl9fID0gX19pbnRfXworICAgICAgICAgICAgX19yZXByX18gPSBfX2ludF9fCisgICAgICAgICAgICBfX29jdF9fID0gX19pbnRfXworICAgICAgICAgICAgX19oZXhfXyA9IF9faW50X18KKworICAgICAgICBmb3IgZiBpbiBbaW50LCBmbG9hdCwgbG9uZywgc3RyLCByZXByLCBvY3QsIGhleF06CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIEJhZFR5cGVDbGFzcygpKQorCisgICAgZGVmIHRlc3RNaXhJbnRzQW5kTG9uZ3Moc2VsZik6CisgICAgICAgICMgbWl4aW5nIHVwIGludHMgYW5kIGxvbmdzIGlzIG9rYXkKKyAgICAgICAgY2xhc3MgSW50TG9uZ01peENsYXNzOgorICAgICAgICAgICAgQHRyYWNrQ2FsbAorICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyTAorCisgICAgICAgICAgICBAdHJhY2tDYWxsCisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDY0CisKKyAgICAgICAgbWl4SW50QW5kTG9uZyA9IEludExvbmdNaXhDbGFzcygpCisKKyAgICAgICAgY2FsbExzdFs6XSA9IFtdCisgICAgICAgIGFzX2ludCA9IGludChtaXhJbnRBbmRMb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYXNfaW50KSwgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc19pbnQsIDQyTCkKKyAgICAgICAgc2VsZi5hc3NlcnRDYWxsU3RhY2soWygnX19pbnRfXycsIChtaXhJbnRBbmRMb25nLCkpXSkKKworICAgICAgICBjYWxsTHN0WzpdID0gW10KKyAgICAgICAgYXNfbG9uZyA9IGxvbmcobWl4SW50QW5kTG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGFzX2xvbmcpLCBsb25nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzX2xvbmcsIDY0KQorICAgICAgICBzZWxmLmFzc2VydENhbGxTdGFjayhbKCdfX2xvbmdfXycsIChtaXhJbnRBbmRMb25nLCkpXSkKKworICAgIGRlZiB0ZXN0SGFzaFN0dWZmKHNlbGYpOgorICAgICAgICAjIFRlc3QgY29ycmVjdCBlcnJvcnMgZnJvbSBoYXNoKCkgb24gb2JqZWN0cyB3aXRoIGNvbXBhcmlzb25zIGJ1dAorICAgICAgICAjICBubyBfX2hhc2hfXworCisgICAgICAgIGNsYXNzIEMwOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGhhc2goQzAoKSkgIyBUaGlzIHNob3VsZCB3b3JrOyB0aGUgbmV4dCB0d28gc2hvdWxkIHJhaXNlIFR5cGVFcnJvcgorCisgICAgICAgIGNsYXNzIEMxOgorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOiByZXR1cm4gMAorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgQzEoKSkKKworICAgICAgICBjbGFzcyBDMjoKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiByZXR1cm4gMQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgQzIoKSkKKworCisgICAgZGVmIHRlc3RTRkJ1ZzUzMjY0NihzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBTRiBidWcgNTMyNjQ2CisKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgQS5fX2NhbGxfXyA9IEEoKQorICAgICAgICBhID0gQSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYSgpICMgVGhpcyBzaG91bGQgbm90IHNlZ2ZhdWx0CisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCB0byByYWlzZSBSdW50aW1lRXJyb3IiKQorCisgICAgZGVmIHRlc3RGb3JFeGNlcHRpb25zUmFpc2VkSW5JbnN0YW5jZUdldGF0dHIyKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGZvciBleGNlcHRpb25zIHJhaXNlZCBpbiBpbnN0YW5jZV9nZXRhdHRyMigpLgorCisgICAgICAgIGRlZiBib29oKHNlbGYpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoImJvb2giKQorCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBhID0gcHJvcGVydHkoYm9vaCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgQSgpLmEgIyBSYWlzZWQgQXR0cmlidXRlRXJyb3I6IEEgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnYScKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCB4OgorICAgICAgICAgICAgaWYgc3RyKHgpICE9ICJib29oIjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImF0dHJpYnV0ZSBlcnJvciBmb3IgQSgpLmEgZ290IG1hc2tlZDogJXMiICUgeCkKKworICAgICAgICBjbGFzcyBFOgorICAgICAgICAgICAgX19lcV9fID0gcHJvcGVydHkoYm9vaCkKKyAgICAgICAgRSgpID09IEUoKSAjIEluIGRlYnVnIG1vZGUsIGNhdXNlZCBhIEMtbGV2ZWwgYXNzZXJ0KCkgdG8gZmFpbAorCisgICAgICAgIGNsYXNzIEk6CisgICAgICAgICAgICBfX2luaXRfXyA9IHByb3BlcnR5KGJvb2gpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgSW4gZGVidWcgbW9kZSwgcHJpbnRlZCBYWFggdW5kZXRlY3RlZCBlcnJvciBhbmQKKyAgICAgICAgICAgICMgIHJhaXNlcyBBdHRyaWJ1dGVFcnJvcgorICAgICAgICAgICAgSSgpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgeDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiYXR0cmlidXRlIGVycm9yIGZvciBJLl9faW5pdF9fIGdvdCBtYXNrZWQiKQorCisgICAgZGVmIHRlc3RIYXNoQ29tcGFyaXNvbk9mTWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvbXBhcmlzb24gYW5kIGhhc2ggb2YgbWV0aG9kcworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBmKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiBnKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnggPT0gb3RoZXIueAorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLngKKyAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBhMSA9IEEoMSkKKyAgICAgICAgYTIgPSBBKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTEuZiwgYTEuZikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhMS5mLCBhMi5mKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGExLmYsIGExLmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTEuZiwgQSgxKS5mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYTEuZiksIGhhc2goYTEuZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChhMS5mKSwgaGFzaChBKDEpLmYpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoQS5mLCBhMS5mKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKEEuZiwgQS5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEIuZiwgQS5mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goQi5mKSwgaGFzaChBLmYpKQorCisgICAgICAgICMgdGhlIGZvbGxvd2luZyB0cmlnZ2VycyBhIFN5c3RlbUVycm9yIGluIDIuNAorICAgICAgICBhID0gQShoYXNoKEEuZi5pbV9mdW5jKV4oLTEpKQorICAgICAgICBoYXNoKGEuZikKKworICAgIGRlZiB0ZXN0QXR0clNsb3RzKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgYyBpbiBDLCBDKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUoYykuX19nZXRhdHRyaWJ1dGVfXywgYywgW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUoYykuX19zZXRhdHRyX18sIGMsIFtdLCBbXSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoIi4rX18oZ2V0fHNldHxkZWwpc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiY2xhc3NpYyBpbnQgZGl2aXNpb24iLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCI8PiBub3Qgc3VwcG9ydGVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ2xhc3NUZXN0cykKKworaWYgX19uYW1lX189PSdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsYXNzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsYXNzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhkNzlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsYXNzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NsYXNzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjhkNzlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY2xhc3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtYXRoLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21hdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI1YzRiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtYXRoLnB5CkBAIC0wLDAgKzEsNDc0IEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X21hdGggaW1wb3J0IHBhcnNlX3Rlc3RmaWxlLCB0ZXN0X2ZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGNtYXRoLCBtYXRoCitmcm9tIGNtYXRoIGltcG9ydCBwaGFzZSwgcG9sYXIsIHJlY3QsIHBpCisKK0lORiA9IGZsb2F0KCdpbmYnKQorTkFOID0gZmxvYXQoJ25hbicpCisKK2NvbXBsZXhfemVyb3MgPSBbY29tcGxleCh4LCB5KSBmb3IgeCBpbiBbMC4wLCAtMC4wXSBmb3IgeSBpbiBbMC4wLCAtMC4wXV0KK2NvbXBsZXhfaW5maW5pdGllcyA9IFtjb21wbGV4KHgsIHkpIGZvciB4LCB5IGluIFsKKyAgICAgICAgKElORiwgMC4wKSwgICMgMXN0IHF1YWRyYW50CisgICAgICAgIChJTkYsIDIuMyksCisgICAgICAgIChJTkYsIElORiksCisgICAgICAgICgyLjMsIElORiksCisgICAgICAgICgwLjAsIElORiksCisgICAgICAgICgtMC4wLCBJTkYpLCAjIDJuZCBxdWFkcmFudAorICAgICAgICAoLTIuMywgSU5GKSwKKyAgICAgICAgKC1JTkYsIElORiksCisgICAgICAgICgtSU5GLCAyLjMpLAorICAgICAgICAoLUlORiwgMC4wKSwKKyAgICAgICAgKC1JTkYsIC0wLjApLCAjIDNyZCBxdWFkcmFudAorICAgICAgICAoLUlORiwgLTIuMyksCisgICAgICAgICgtSU5GLCAtSU5GKSwKKyAgICAgICAgKC0yLjMsIC1JTkYpLAorICAgICAgICAoLTAuMCwgLUlORiksCisgICAgICAgICgwLjAsIC1JTkYpLCAjIDR0aCBxdWFkcmFudAorICAgICAgICAoMi4zLCAtSU5GKSwKKyAgICAgICAgKElORiwgLUlORiksCisgICAgICAgIChJTkYsIC0yLjMpLAorICAgICAgICAoSU5GLCAtMC4wKQorICAgICAgICBdXQorY29tcGxleF9uYW5zID0gW2NvbXBsZXgoeCwgeSkgZm9yIHgsIHkgaW4gWworICAgICAgICAoTkFOLCAtSU5GKSwKKyAgICAgICAgKE5BTiwgLTIuMyksCisgICAgICAgIChOQU4sIC0wLjApLAorICAgICAgICAoTkFOLCAwLjApLAorICAgICAgICAoTkFOLCAyLjMpLAorICAgICAgICAoTkFOLCBJTkYpLAorICAgICAgICAoLUlORiwgTkFOKSwKKyAgICAgICAgKC0yLjMsIE5BTiksCisgICAgICAgICgtMC4wLCBOQU4pLAorICAgICAgICAoMC4wLCBOQU4pLAorICAgICAgICAoMi4zLCBOQU4pLAorICAgICAgICAoSU5GLCBOQU4pCisgICAgICAgIF1dCisKK2NsYXNzIENNYXRoVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgbGlzdCBvZiBhbGwgZnVuY3Rpb25zIGluIGNtYXRoCisgICAgdGVzdF9mdW5jdGlvbnMgPSBbZ2V0YXR0cihjbWF0aCwgZm5hbWUpIGZvciBmbmFtZSBpbiBbCisgICAgICAgICAgICAnYWNvcycsICdhY29zaCcsICdhc2luJywgJ2FzaW5oJywgJ2F0YW4nLCAnYXRhbmgnLAorICAgICAgICAgICAgJ2NvcycsICdjb3NoJywgJ2V4cCcsICdsb2cnLCAnbG9nMTAnLCAnc2luJywgJ3NpbmgnLAorICAgICAgICAgICAgJ3NxcnQnLCAndGFuJywgJ3RhbmgnXV0KKyAgICAjIHRlc3QgZmlyc3QgYW5kIHNlY29uZCBhcmd1bWVudHMgaW5kZXBlbmRlbnRseSBmb3IgMi1hcmd1bWVudCBsb2cKKyAgICB0ZXN0X2Z1bmN0aW9ucy5hcHBlbmQobGFtYmRhIHggOiBjbWF0aC5sb2coeCwgMTcyOS4gKyAwaikpCisgICAgdGVzdF9mdW5jdGlvbnMuYXBwZW5kKGxhbWJkYSB4IDogY21hdGgubG9nKDE0Li0yN2osIHgpKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfdmFsdWVzID0gb3Blbih0ZXN0X2ZpbGUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudGVzdF92YWx1ZXMuY2xvc2UoKQorCisgICAgZGVmIHJBc3NlcnRBbG1vc3RFcXVhbChzZWxmLCBhLCBiLCByZWxfZXJyID0gMmUtMTUsIGFic19lcnIgPSA1ZS0zMjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9Tm9uZSk6CisgICAgICAgICIiIkZhaWwgaWYgdGhlIHR3byBmbG9hdGluZy1wb2ludCBudW1iZXJzIGFyZSBub3QgYWxtb3N0IGVxdWFsLgorCisgICAgICAgIERldGVybWluZSB3aGV0aGVyIGZsb2F0aW5nLXBvaW50IHZhbHVlcyBhIGFuZCBiIGFyZSBlcXVhbCB0byB3aXRoaW4KKyAgICAgICAgYSAoc21hbGwpIHJvdW5kaW5nIGVycm9yLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGZvciByZWxfZXJyIGFuZAorICAgICAgICBhYnNfZXJyIGFyZSBjaG9zZW4gdG8gYmUgc3VpdGFibGUgZm9yIHBsYXRmb3JtcyB3aGVyZSBhIGZsb2F0IGlzCisgICAgICAgIHJlcHJlc2VudGVkIGJ5IGFuIElFRUUgNzU0IGRvdWJsZS4gIFRoZXkgYWxsb3cgYW4gZXJyb3Igb2YgYmV0d2VlbgorICAgICAgICA5IGFuZCAxOSB1bHBzLgorICAgICAgICAiIiIKKworICAgICAgICAjIHNwZWNpYWwgdmFsdWVzIHRlc3RpbmcKKyAgICAgICAgaWYgbWF0aC5pc25hbihhKToKKyAgICAgICAgICAgIGlmIG1hdGguaXNuYW4oYik6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmZhaWwobXNnIG9yICd7IXJ9IHNob3VsZCBiZSBuYW4nLmZvcm1hdChiKSkKKworICAgICAgICBpZiBtYXRoLmlzaW5mKGEpOgorICAgICAgICAgICAgaWYgYSA9PSBiOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZyBvciAnZmluaXRlIHJlc3VsdCB3aGVyZSBpbmZpbml0eSBleHBlY3RlZDogJworICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZCB7IXJ9LCBnb3QgeyFyfScuZm9ybWF0KGEsIGIpKQorCisgICAgICAgICMgaWYgYm90aCBhIGFuZCBiIGFyZSB6ZXJvLCBjaGVjayB3aGV0aGVyIHRoZXkgaGF2ZSB0aGUgc2FtZSBzaWduCisgICAgICAgICMgKGluIHRoZW9yeSB0aGVyZSBhcmUgZXhhbXBsZXMgd2hlcmUgaXQgd291bGQgYmUgbGVnaXRpbWF0ZSBmb3IgYQorICAgICAgICAjIGFuZCBiIHRvIGhhdmUgb3Bwb3NpdGUgc2lnbnM7IGluIHByYWN0aWNlIHRoZXNlIGhhcmRseSBldmVyCisgICAgICAgICMgb2NjdXIpLgorICAgICAgICBpZiBub3QgYSBhbmQgbm90IGI6CisgICAgICAgICAgICBpZiBtYXRoLmNvcHlzaWduKDEuLCBhKSAhPSBtYXRoLmNvcHlzaWduKDEuLCBiKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwobXNnIG9yICd6ZXJvIGhhcyB3cm9uZyBzaWduOiBleHBlY3RlZCB7IXJ9LCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3QgeyFyfScuZm9ybWF0KGEsIGIpKQorCisgICAgICAgICMgaWYgYS1iIG92ZXJmbG93cywgb3IgYiBpcyBpbmZpbml0ZSwgcmV0dXJuIEZhbHNlLiAgQWdhaW4sIGluCisgICAgICAgICMgdGhlb3J5IHRoZXJlIGFyZSBleGFtcGxlcyB3aGVyZSBhIGlzIHdpdGhpbiBhIGZldyB1bHBzIG9mIHRoZQorICAgICAgICAjIG1heCByZXByZXNlbnRhYmxlIGZsb2F0LCBhbmQgdGhlbiBiIGNvdWxkIGxlZ2l0aW1hdGVseSBiZQorICAgICAgICAjIGluZmluaXRlLiAgSW4gcHJhY3RpY2UgdGhlc2UgZXhhbXBsZXMgYXJlIHJhcmUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFic29sdXRlX2Vycm9yID0gYWJzKGItYSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHRlc3QgcGFzc2VzIGlmIGVpdGhlciB0aGUgYWJzb2x1dGUgZXJyb3Igb3IgdGhlIHJlbGF0aXZlCisgICAgICAgICAgICAjIGVycm9yIGlzIHN1ZmZpY2llbnRseSBzbWFsbC4gIFRoZSBkZWZhdWx0cyBhbW91bnQgdG8gYW4KKyAgICAgICAgICAgICMgZXJyb3Igb2YgYmV0d2VlbiA5IHVscHMgYW5kIDE5IHVscHMgb24gYW4gSUVFRS03NTQgY29tcGxpYW50CisgICAgICAgICAgICAjIG1hY2hpbmUuCisgICAgICAgICAgICBpZiBhYnNvbHV0ZV9lcnJvciA8PSBtYXgoYWJzX2VyciwgcmVsX2VyciAqIGFicyhhKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbChtc2cgb3IKKyAgICAgICAgICAgICAgICAgICd7IXJ9IGFuZCB7IXJ9IGFyZSBub3Qgc3VmZmljaWVudGx5IGNsb3NlJy5mb3JtYXQoYSwgYikpCisKKyAgICBkZWYgdGVzdF9jb25zdGFudHMoc2VsZik6CisgICAgICAgIGVfZXhwZWN0ZWQgPSAyLjcxODI4MTgyODQ1OTA0NTIzNTM2CisgICAgICAgIHBpX2V4cGVjdGVkID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNtYXRoLnBpLCBwaV9leHBlY3RlZCwgcGxhY2VzPTksCisgICAgICAgICAgICBtc2c9ImNtYXRoLnBpIGlzIHt9OyBzaG91bGQgYmUge30iLmZvcm1hdChjbWF0aC5waSwgcGlfZXhwZWN0ZWQpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNtYXRoLmUsIGVfZXhwZWN0ZWQsIHBsYWNlcz05LAorICAgICAgICAgICAgbXNnPSJjbWF0aC5lIGlzIHt9OyBzaG91bGQgYmUge30iLmZvcm1hdChjbWF0aC5lLCBlX2V4cGVjdGVkKSkKKworICAgIGRlZiB0ZXN0X3VzZXJfb2JqZWN0KHNlbGYpOgorICAgICAgICAjIFRlc3QgYXV0b21hdGljIGNhbGxpbmcgb2YgX19jb21wbGV4X18gYW5kIF9fZmxvYXRfXyBieSBjbWF0aAorICAgICAgICAjIGZ1bmN0aW9ucworCisgICAgICAgICMgc29tZSByYW5kb20gdmFsdWVzIHRvIHVzZSBhcyB0ZXN0IHZhbHVlczsgd2UgYXZvaWQgdmFsdWVzCisgICAgICAgICMgZm9yIHdoaWNoIGFueSBvZiB0aGUgZnVuY3Rpb25zIGluIGNtYXRoIGlzIHVuZGVmaW5lZAorICAgICAgICAjIChpLmUuIDAuLCAxLiwgLTEuLCAxaiwgLTFqKSBvciB3b3VsZCBjYXVzZSBvdmVyZmxvdworICAgICAgICBjeF9hcmcgPSA0LjQxOTQxNDQzOSArIDEuNDk3MTAwMTEzagorICAgICAgICBmbHRfYXJnID0gLTYuMTMxNjc3NzI1CisKKyAgICAgICAgIyBhIHZhcmlldHkgb2Ygbm9uLWNvbXBsZXggbnVtYmVycywgdXNlZCB0byBjaGVjayB0aGF0CisgICAgICAgICMgbm9uLWNvbXBsZXggcmV0dXJuIHZhbHVlcyBmcm9tIF9fY29tcGxleF9fIGdpdmUgYW4gZXJyb3IKKyAgICAgICAgbm9uX2NvbXBsZXhlcyA9IFsibm90IGNvbXBsZXgiLCAxLCA1TCwgMi4sIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0KCksIE5vdEltcGxlbWVudGVkXQorCisgICAgICAgICMgTm93IHdlIGludHJvZHVjZSBhIHZhcmlldHkgb2YgY2xhc3NlcyB3aG9zZSBpbnN0YW5jZXMgbWlnaHQKKyAgICAgICAgIyBlbmQgdXAgYmVpbmcgcGFzc2VkIHRvIHRoZSBjbWF0aCBmdW5jdGlvbnMKKworICAgICAgICAjIHVzdWFsIGNhc2U6IG5ldy1zdHlsZSBjbGFzcyBpbXBsZW1lbnRpbmcgX19jb21wbGV4X18KKyAgICAgICAgY2xhc3MgTXlDb21wbGV4KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKyAgICAgICAgIyBvbGQtc3R5bGUgY2xhc3MgaW1wbGVtZW50aW5nIF9fY29tcGxleF9fCisgICAgICAgIGNsYXNzIE15Q29tcGxleE9TOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorCisgICAgICAgICMgY2xhc3NlcyBmb3Igd2hpY2ggX19jb21wbGV4X18gcmFpc2VzIGFuIGV4Y2VwdGlvbgorICAgICAgICBjbGFzcyBTb21lRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE15Q29tcGxleEV4Y2VwdGlvbihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFNvbWVFeGNlcHRpb24KKyAgICAgICAgY2xhc3MgTXlDb21wbGV4RXhjZXB0aW9uT1M6CisgICAgICAgICAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgU29tZUV4Y2VwdGlvbgorCisgICAgICAgICMgc29tZSBjbGFzc2VzIG5vdCBwcm92aWRpbmcgX19mbG9hdF9fIG9yIF9fY29tcGxleF9fCisgICAgICAgIGNsYXNzIE5laXRoZXJDb21wbGV4Tm9yRmxvYXQob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTmVpdGhlckNvbXBsZXhOb3JGbG9hdE9TOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBNeUludChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IHJldHVybiAyCisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6IHJldHVybiAyTAorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKTogcmV0dXJuIDIKKyAgICAgICAgY2xhc3MgTXlJbnRPUzoKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOiByZXR1cm4gMgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOiByZXR1cm4gMkwKKyAgICAgICAgICAgIGRlZiBfX2luZGV4X18oc2VsZik6IHJldHVybiAyCisKKyAgICAgICAgIyBvdGhlciBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgX19mbG9hdF9fIGFuZCBfX2NvbXBsZXhfXworICAgICAgICAjIHRoYXQgc2hvdWxkIHdvcmsKKyAgICAgICAgY2xhc3MgRmxvYXRBbmRDb21wbGV4KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBmbHRfYXJnCisgICAgICAgICAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGN4X2FyZworICAgICAgICBjbGFzcyBGbG9hdEFuZENvbXBsZXhPUzoKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsdF9hcmcKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY3hfYXJnCisgICAgICAgIGNsYXNzIEp1c3RGbG9hdChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmx0X2FyZworICAgICAgICBjbGFzcyBKdXN0RmxvYXRPUzoKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZsdF9hcmcKKworICAgICAgICBmb3IgZiBpbiBzZWxmLnRlc3RfZnVuY3Rpb25zOgorICAgICAgICAgICAgIyB1c3VhbCB1c2FnZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKE15Q29tcGxleChjeF9hcmcpKSwgZihjeF9hcmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKE15Q29tcGxleE9TKGN4X2FyZykpLCBmKGN4X2FyZykpCisgICAgICAgICAgICAjIG90aGVyIGNvbWJpbmF0aW9ucyBvZiBfX2Zsb2F0X18gYW5kIF9fY29tcGxleF9fCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoRmxvYXRBbmRDb21wbGV4KCkpLCBmKGN4X2FyZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoRmxvYXRBbmRDb21wbGV4T1MoKSksIGYoY3hfYXJnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihKdXN0RmxvYXQoKSksIGYoZmx0X2FyZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoSnVzdEZsb2F0T1MoKSksIGYoZmx0X2FyZykpCisgICAgICAgICAgICAjIFR5cGVFcnJvciBzaG91bGQgYmUgcmFpc2VkIGZvciBjbGFzc2VzIG5vdCBwcm92aWRpbmcKKyAgICAgICAgICAgICMgZWl0aGVyIF9fY29tcGxleF9fIG9yIF9fZmxvYXRfXywgZXZlbiBpZiB0aGV5IHByb3ZpZGUKKyAgICAgICAgICAgICMgX19pbnRfXywgX19sb25nX18gb3IgX19pbmRleF9fLiAgQW4gb2xkLXN0eWxlIGNsYXNzCisgICAgICAgICAgICAjIGN1cnJlbnRseSByYWlzZXMgQXR0cmlidXRlRXJyb3IgaW5zdGVhZCBvZiBhIFR5cGVFcnJvcjsKKyAgICAgICAgICAgICMgdGhpcyBjb3VsZCBiZSBjb25zaWRlcmVkIGEgYnVnLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCBOZWl0aGVyQ29tcGxleE5vckZsb2F0KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIE15SW50KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIGYsIE5laXRoZXJDb21wbGV4Tm9yRmxvYXRPUygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBmLCBNeUludE9TKCkpCisgICAgICAgICAgICAjIG5vbi1jb21wbGV4IHJldHVybiB2YWx1ZSBmcm9tIF9fY29tcGxleF9fIC0+IFR5cGVFcnJvcgorICAgICAgICAgICAgZm9yIGJhZF9jb21wbGV4IGluIG5vbl9jb21wbGV4ZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCBNeUNvbXBsZXgoYmFkX2NvbXBsZXgpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgTXlDb21wbGV4T1MoYmFkX2NvbXBsZXgpKQorICAgICAgICAgICAgIyBleGNlcHRpb25zIGluIF9fY29tcGxleF9fIHNob3VsZCBiZSBwcm9wYWdhdGVkIGNvcnJlY3RseQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU29tZUV4Y2VwdGlvbiwgZiwgTXlDb21wbGV4RXhjZXB0aW9uKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTb21lRXhjZXB0aW9uLCBmLCBNeUNvbXBsZXhFeGNlcHRpb25PUygpKQorCisgICAgZGVmIHRlc3RfaW5wdXRfdHlwZShzZWxmKToKKyAgICAgICAgIyBpbnRzIGFuZCBsb25ncyBzaG91bGQgYmUgYWNjZXB0YWJsZSBpbnB1dHMgdG8gYWxsIGNtYXRoCisgICAgICAgICMgZnVuY3Rpb25zLCBieSB2aXJ0dWUgb2YgcHJvdmlkaW5nIGEgX19mbG9hdF9fIG1ldGhvZAorICAgICAgICBmb3IgZiBpbiBzZWxmLnRlc3RfZnVuY3Rpb25zOgorICAgICAgICAgICAgZm9yIGFyZyBpbiBbMiwgMkwsIDIuXToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYXJnKSwgZihhcmcuX19mbG9hdF9fKCkpKQorCisgICAgICAgICMgYnV0IHN0cmluZ3Mgc2hvdWxkIGdpdmUgYSBUeXBlRXJyb3IKKyAgICAgICAgZm9yIGYgaW4gc2VsZi50ZXN0X2Z1bmN0aW9uczoKKyAgICAgICAgICAgIGZvciBhcmcgaW4gWyJhIiwgImxvbmdfc3RyaW5nIiwgIjAiLCAiMWoiLCAiIl06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCBhcmcpCisKKyAgICBkZWYgdGVzdF9jbWF0aF9tYXRjaGVzX21hdGgoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBjb3JyZXNwb25kaW5nIGNtYXRoIGFuZCBtYXRoIGZ1bmN0aW9ucyBhcmUgZXF1YWwKKyAgICAgICAgIyBmb3IgZmxvYXRzIGluIHRoZSBhcHByb3ByaWF0ZSByYW5nZQorCisgICAgICAgICMgdGVzdF92YWx1ZXMgaW4gKDAsIDEpCisgICAgICAgIHRlc3RfdmFsdWVzID0gWzAuMDEsIDAuMSwgMC4yLCAwLjUsIDAuOSwgMC45OV0KKworICAgICAgICAjIHRlc3RfdmFsdWVzIGZvciBmdW5jdGlvbnMgZGVmaW5lZCBvbiBbLTEuLCAxLl0KKyAgICAgICAgdW5pdF9pbnRlcnZhbCA9IHRlc3RfdmFsdWVzICsgWy14IGZvciB4IGluIHRlc3RfdmFsdWVzXSArIFwKKyAgICAgICAgICAgIFswLiwgMS4sIC0xLl0KKworICAgICAgICAjIHRlc3RfdmFsdWVzIGZvciBsb2csIGxvZzEwLCBzcXJ0CisgICAgICAgIHBvc2l0aXZlID0gdGVzdF92YWx1ZXMgKyBbMS5dICsgWzEuL3ggZm9yIHggaW4gdGVzdF92YWx1ZXNdCisgICAgICAgIG5vbm5lZ2F0aXZlID0gWzAuXSArIHBvc2l0aXZlCisKKyAgICAgICAgIyB0ZXN0X3ZhbHVlcyBmb3IgZnVuY3Rpb25zIGRlZmluZWQgb24gdGhlIHdob2xlIHJlYWwgbGluZQorICAgICAgICByZWFsX2xpbmUgPSBbMC5dICsgcG9zaXRpdmUgKyBbLXggZm9yIHggaW4gcG9zaXRpdmVdCisKKyAgICAgICAgdGVzdF9mdW5jdGlvbnMgPSB7CisgICAgICAgICAgICAnYWNvcycgOiB1bml0X2ludGVydmFsLAorICAgICAgICAgICAgJ2FzaW4nIDogdW5pdF9pbnRlcnZhbCwKKyAgICAgICAgICAgICdhdGFuJyA6IHJlYWxfbGluZSwKKyAgICAgICAgICAgICdjb3MnIDogcmVhbF9saW5lLAorICAgICAgICAgICAgJ2Nvc2gnIDogcmVhbF9saW5lLAorICAgICAgICAgICAgJ2V4cCcgOiByZWFsX2xpbmUsCisgICAgICAgICAgICAnbG9nJyA6IHBvc2l0aXZlLAorICAgICAgICAgICAgJ2xvZzEwJyA6IHBvc2l0aXZlLAorICAgICAgICAgICAgJ3NpbicgOiByZWFsX2xpbmUsCisgICAgICAgICAgICAnc2luaCcgOiByZWFsX2xpbmUsCisgICAgICAgICAgICAnc3FydCcgOiBub25uZWdhdGl2ZSwKKyAgICAgICAgICAgICd0YW4nIDogcmVhbF9saW5lLAorICAgICAgICAgICAgJ3RhbmgnIDogcmVhbF9saW5lfQorCisgICAgICAgIGZvciBmbiwgdmFsdWVzIGluIHRlc3RfZnVuY3Rpb25zLml0ZW1zKCk6CisgICAgICAgICAgICBmbG9hdF9mbiA9IGdldGF0dHIobWF0aCwgZm4pCisgICAgICAgICAgICBjb21wbGV4X2ZuID0gZ2V0YXR0cihjbWF0aCwgZm4pCisgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgeiA9IGNvbXBsZXhfZm4odikKKyAgICAgICAgICAgICAgICBzZWxmLnJBc3NlcnRBbG1vc3RFcXVhbChmbG9hdF9mbih2KSwgei5yZWFsKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4sIHouaW1hZykKKworICAgICAgICAjIHRlc3QgdHdvLWFyZ3VtZW50IHZlcnNpb24gb2YgbG9nIHdpdGggdmFyaW91cyBiYXNlcworICAgICAgICBmb3IgYmFzZSBpbiBbMC41LCAyLiwgMTAuXToKKyAgICAgICAgICAgIGZvciB2IGluIHBvc2l0aXZlOgorICAgICAgICAgICAgICAgIHogPSBjbWF0aC5sb2codiwgYmFzZSkKKyAgICAgICAgICAgICAgICBzZWxmLnJBc3NlcnRBbG1vc3RFcXVhbChtYXRoLmxvZyh2LCBiYXNlKSwgei5yZWFsKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4sIHouaW1hZykKKworICAgIGRlZiB0ZXN0X3NwZWNpZmljX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgaWYgbm90IGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRlZiByZWN0X2NvbXBsZXgoeik6CisgICAgICAgICAgICAiIiJXcmFwcGVkIHZlcnNpb24gb2YgcmVjdCB0aGF0IGFjY2VwdHMgYSBjb21wbGV4IG51bWJlciBpbnN0ZWFkIG9mCisgICAgICAgICAgICB0d28gZmxvYXQgYXJndW1lbnRzLiIiIgorICAgICAgICAgICAgcmV0dXJuIGNtYXRoLnJlY3Qoei5yZWFsLCB6LmltYWcpCisKKyAgICAgICAgZGVmIHBvbGFyX2NvbXBsZXgoeik6CisgICAgICAgICAgICAiIiJXcmFwcGVkIHZlcnNpb24gb2YgcG9sYXIgdGhhdCByZXR1cm5zIGEgY29tcGxleCBudW1iZXIgaW5zdGVhZCBvZgorICAgICAgICAgICAgdHdvIGZsb2F0cy4iIiIKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV4KCpwb2xhcih6KSkKKworICAgICAgICBmb3IgaWQsIGZuLCBhciwgYWksIGVyLCBlaSwgZmxhZ3MgaW4gcGFyc2VfdGVzdGZpbGUodGVzdF9maWxlKToKKyAgICAgICAgICAgIGFyZyA9IGNvbXBsZXgoYXIsIGFpKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjb21wbGV4KGVyLCBlaSkKKyAgICAgICAgICAgIGlmIGZuID09ICdyZWN0JzoKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiA9IHJlY3RfY29tcGxleAorICAgICAgICAgICAgZWxpZiBmbiA9PSAncG9sYXInOgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gcG9sYXJfY29tcGxleAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmdW5jdGlvbiA9IGdldGF0dHIoY21hdGgsIGZuKQorICAgICAgICAgICAgaWYgJ2RpdmlkZS1ieS16ZXJvJyBpbiBmbGFncyBvciAnaW52YWxpZCcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBmdW5jdGlvbihhcmcpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdWYWx1ZUVycm9yIG5vdCByYWlzZWQgaW4gdGVzdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICd7fToge30oY29tcGxleCh7IXJ9LCB7IXJ9KSknLmZvcm1hdChpZCwgZm4sIGFyLCBhaSkpCisKKyAgICAgICAgICAgIGlmICdvdmVyZmxvdycgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBmdW5jdGlvbihhcmcpCisgICAgICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdPdmVyZmxvd0Vycm9yIG5vdCByYWlzZWQgaW4gdGVzdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICd7fToge30oY29tcGxleCh7IXJ9LCB7IXJ9KSknLmZvcm1hdChpZCwgZm4sIGFyLCBhaSkpCisKKyAgICAgICAgICAgIGFjdHVhbCA9IGZ1bmN0aW9uKGFyZykKKworICAgICAgICAgICAgaWYgJ2lnbm9yZS1yZWFsLXNpZ24nIGluIGZsYWdzOgorICAgICAgICAgICAgICAgIGFjdHVhbCA9IGNvbXBsZXgoYWJzKGFjdHVhbC5yZWFsKSwgYWN0dWFsLmltYWcpCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBjb21wbGV4KGFicyhleHBlY3RlZC5yZWFsKSwgZXhwZWN0ZWQuaW1hZykKKyAgICAgICAgICAgIGlmICdpZ25vcmUtaW1hZy1zaWduJyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBhY3R1YWwgPSBjb21wbGV4KGFjdHVhbC5yZWFsLCBhYnMoYWN0dWFsLmltYWcpKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gY29tcGxleChleHBlY3RlZC5yZWFsLCBhYnMoZXhwZWN0ZWQuaW1hZykpCisKKyAgICAgICAgICAgICMgZm9yIHRoZSByZWFsIHBhcnQgb2YgdGhlIGxvZyBmdW5jdGlvbiwgd2UgYWxsb3cgYW4KKyAgICAgICAgICAgICMgYWJzb2x1dGUgZXJyb3Igb2YgdXAgdG8gMmUtMTUuCisgICAgICAgICAgICBpZiBmbiBpbiAoJ2xvZycsICdsb2cxMCcpOgorICAgICAgICAgICAgICAgIHJlYWxfYWJzX2VyciA9IDJlLTE1CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlYWxfYWJzX2VyciA9IDVlLTMyMworCisgICAgICAgICAgICBlcnJvcl9tZXNzYWdlID0gKAorICAgICAgICAgICAgICAgICd7fToge30oY29tcGxleCh7IXJ9LCB7IXJ9KSlcbicKKyAgICAgICAgICAgICAgICAnRXhwZWN0ZWQ6IGNvbXBsZXgoeyFyfSwgeyFyfSlcbicKKyAgICAgICAgICAgICAgICAnUmVjZWl2ZWQ6IGNvbXBsZXgoeyFyfSwgeyFyfSlcbicKKyAgICAgICAgICAgICAgICAnUmVjZWl2ZWQgdmFsdWUgaW5zdWZmaWNpZW50bHkgY2xvc2UgdG8gZXhwZWN0ZWQgdmFsdWUuJworICAgICAgICAgICAgICAgICkuZm9ybWF0KGlkLCBmbiwgYXIsIGFpLAorICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQucmVhbCwgZXhwZWN0ZWQuaW1hZywKKyAgICAgICAgICAgICAgICAgICAgIGFjdHVhbC5yZWFsLCBhY3R1YWwuaW1hZykKKyAgICAgICAgICAgIHNlbGYuckFzc2VydEFsbW9zdEVxdWFsKGV4cGVjdGVkLnJlYWwsIGFjdHVhbC5yZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic19lcnI9cmVhbF9hYnNfZXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz1lcnJvcl9tZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5yQXNzZXJ0QWxtb3N0RXF1YWwoZXhwZWN0ZWQuaW1hZywgYWN0dWFsLmltYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPWVycm9yX21lc3NhZ2UpCisKKyAgICBkZWYgYXNzZXJ0Q0lTRXF1YWwoc2VsZiwgYSwgYik6CisgICAgICAgIGVwcyA9IDFFLTcKKyAgICAgICAgaWYgYWJzKGFbMF0gLSBiWzBdKSA+IGVwcyBvciBhYnMoYVsxXSAtIGJbMV0pID4gZXBzOgorICAgICAgICAgICAgc2VsZi5mYWlsKChhICxiKSkKKworICAgIGRlZiB0ZXN0X3BvbGFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydENJU0VxdWFsKHBvbGFyKDApLCAoMC4sIDAuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRDSVNFcXVhbChwb2xhcigxLiksICgxLiwgMC4pKQorICAgICAgICBzZWxmLmFzc2VydENJU0VxdWFsKHBvbGFyKC0xLiksICgxLiwgcGkpKQorICAgICAgICBzZWxmLmFzc2VydENJU0VxdWFsKHBvbGFyKDFqKSwgKDEuLCBwaS8yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRDSVNFcXVhbChwb2xhcigtMWopLCAoMS4sIC1waS8yKSkKKworICAgIGRlZiB0ZXN0X3BoYXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKDApLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZSgxLiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKC0xLiksIHBpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKC0xLisxRS0zMDBqKSwgcGkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoLTEuLTFFLTMwMGopLCAtcGkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoMWopLCBwaS8yKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKC0xaiksIC1waS8yKQorCisgICAgICAgICMgemVyb3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaGFzZShjb21wbGV4KDAuMCwgMC4wKSksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaGFzZShjb21wbGV4KDAuMCwgLTAuMCkpLCAtMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBoYXNlKGNvbXBsZXgoLTAuMCwgMC4wKSksIHBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBoYXNlKGNvbXBsZXgoLTAuMCwgLTAuMCkpLCAtcGkpCisKKyAgICAgICAgIyBpbmZpbml0aWVzCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgtSU5GLCAtMC4wKSksIC1waSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC1JTkYsIC0yLjMpKSwgLXBpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoLUlORiwgLUlORikpLCAtMC43NSpwaSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC0yLjMsIC1JTkYpKSwgLXBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgtMC4wLCAtSU5GKSksIC1waS8yKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoMC4wLCAtSU5GKSksIC1waS8yKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoMi4zLCAtSU5GKSksIC1waS8yKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoSU5GLCAtSU5GKSksIC1waS80KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBoYXNlKGNvbXBsZXgoSU5GLCAtMi4zKSksIC0wLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGhhc2UoY29tcGxleChJTkYsIC0wLjApKSwgLTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaGFzZShjb21wbGV4KElORiwgMC4wKSksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaGFzZShjb21wbGV4KElORiwgMi4zKSksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KElORiwgSU5GKSksIHBpLzQpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgyLjMsIElORikpLCBwaS8yKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoMC4wLCBJTkYpKSwgcGkvMikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC0wLjAsIElORikpLCBwaS8yKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBoYXNlKGNvbXBsZXgoLTIuMywgSU5GKSksIHBpLzIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocGhhc2UoY29tcGxleCgtSU5GLCBJTkYpKSwgMC43NSpwaSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC1JTkYsIDIuMykpLCBwaSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwaGFzZShjb21wbGV4KC1JTkYsIDAuMCkpLCBwaSkKKworICAgICAgICAjIHJlYWwgb3IgaW1hZ2luYXJ5IHBhcnQgTmFOCisgICAgICAgIGZvciB6IGluIGNvbXBsZXhfbmFuczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKHBoYXNlKHopKSkKKworICAgIGRlZiB0ZXN0X2FicyhzZWxmKToKKyAgICAgICAgIyB6ZXJvcworICAgICAgICBmb3IgeiBpbiBjb21wbGV4X3plcm9zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoeiksIDAuMCkKKworICAgICAgICAjIGluZmluaXRpZXMKKyAgICAgICAgZm9yIHogaW4gY29tcGxleF9pbmZpbml0aWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoeiksIElORikKKworICAgICAgICAjIHJlYWwgb3IgaW1hZ2luYXJ5IHBhcnQgTmFOCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKGNvbXBsZXgoTkFOLCAtSU5GKSksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCAtMi4zKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleChOQU4sIC0wLjApKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgMC4wKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleChOQU4sIDIuMykpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleChOQU4sIElORikpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWJzKGNvbXBsZXgoLUlORiwgTkFOKSksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoLTIuMywgTkFOKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleCgtMC4wLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KDAuMCwgTkFOKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleCgyLjMsIE5BTikpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleChJTkYsIE5BTikpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgTkFOKSkpKQorCisgICAgICAgICMgcmVzdWx0IG92ZXJmbG93cworICAgICAgICBpZiBmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBhYnMsIGNvbXBsZXgoMS40ZTMwOCwgMS40ZTMwOCkpCisKKyAgICBkZWYgYXNzZXJ0Q0VxdWFsKHNlbGYsIGEsIGIpOgorICAgICAgICBlcHMgPSAxRS03CisgICAgICAgIGlmIGFicyhhLnJlYWwgLSBiWzBdKSA+IGVwcyBvciBhYnMoYS5pbWFnIC0gYlsxXSkgPiBlcHM6CisgICAgICAgICAgICBzZWxmLmZhaWwoKGEgLGIpKQorCisgICAgZGVmIHRlc3RfcmVjdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRDRXF1YWwocmVjdCgwLCAwKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydENFcXVhbChyZWN0KDEsIDApLCAoMS4sIDApKQorICAgICAgICBzZWxmLmFzc2VydENFcXVhbChyZWN0KDEsIC1waSksICgtMS4sIDApKQorICAgICAgICBzZWxmLmFzc2VydENFcXVhbChyZWN0KDEsIHBpLzIpLCAoMCwgMS4pKQorICAgICAgICBzZWxmLmFzc2VydENFcXVhbChyZWN0KDEsIC1waS8yKSwgKDAsIC0xLikpCisKKyAgICBkZWYgdGVzdF9pc25hbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc25hbigxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc25hbigxaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY21hdGguaXNuYW4oSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKE5BTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc25hbihjb21wbGV4KE5BTiwgMCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNuYW4oY29tcGxleCgwLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBJTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoSU5GLCBOQU4pKSkKKworICAgIGRlZiB0ZXN0X2lzaW5mKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzaW5mKDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzaW5mKDFqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc2luZihOQU4pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzaW5mKGNvbXBsZXgoSU5GLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc2luZihjb21wbGV4KDAsIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChJTkYsIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChOQU4sIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChJTkYsIE5BTikpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQ01hdGhUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21hdGgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21hdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ODgwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21hdGgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21hdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ODgwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOTI1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWQucHkKQEAgLTAsMCArMSwyNDYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiCitUZXN0IHNjcmlwdCBmb3IgdGhlICdjbWQnIG1vZHVsZQorT3JpZ2luYWwgYnkgTWljaGFlbCBTY2huZWlkZXIKKyIiIgorCisKK2ltcG9ydCBjbWQKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgcmUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFN0cmluZ0lPCisKK2NsYXNzIHNhbXBsZWNtZGNsYXNzKGNtZC5DbWQpOgorICAgICIiIgorICAgIEluc3RhbmNlIHRoZSBzYW1wbGVjbGFzczoKKyAgICA+Pj4gbXljbWQgPSBzYW1wbGVjbWRjbGFzcygpCisKKyAgICBUZXN0IGZvciB0aGUgZnVuY3Rpb24gcGFyc2VsaW5lKCk6CisgICAgPj4+IG15Y21kLnBhcnNlbGluZSgiIikKKyAgICAoTm9uZSwgTm9uZSwgJycpCisgICAgPj4+IG15Y21kLnBhcnNlbGluZSgiPyIpCisgICAgKCdoZWxwJywgJycsICdoZWxwICcpCisgICAgPj4+IG15Y21kLnBhcnNlbGluZSgiP2hlbHAiKQorICAgICgnaGVscCcsICdoZWxwJywgJ2hlbHAgaGVscCcpCisgICAgPj4+IG15Y21kLnBhcnNlbGluZSgiISIpCisgICAgKCdzaGVsbCcsICcnLCAnc2hlbGwgJykKKyAgICA+Pj4gbXljbWQucGFyc2VsaW5lKCIhY29tbWFuZCIpCisgICAgKCdzaGVsbCcsICdjb21tYW5kJywgJ3NoZWxsIGNvbW1hbmQnKQorICAgID4+PiBteWNtZC5wYXJzZWxpbmUoImZ1bmMiKQorICAgICgnZnVuYycsICcnLCAnZnVuYycpCisgICAgPj4+IG15Y21kLnBhcnNlbGluZSgiZnVuYyBhcmcxIikKKyAgICAoJ2Z1bmMnLCAnYXJnMScsICdmdW5jIGFyZzEnKQorCisKKyAgICBUZXN0IGZvciB0aGUgZnVuY3Rpb24gb25lY21kKCk6CisgICAgPj4+IG15Y21kLm9uZWNtZCgiIikKKyAgICA+Pj4gbXljbWQub25lY21kKCJhZGQgNCA1IikKKyAgICA5CisgICAgPj4+IG15Y21kLm9uZWNtZCgiIikKKyAgICA5CisgICAgPj4+IG15Y21kLm9uZWNtZCgidGVzdCIpCisgICAgKioqIFVua25vd24gc3ludGF4OiB0ZXN0CisKKyAgICBUZXN0IGZvciB0aGUgZnVuY3Rpb24gZW1wdHlsaW5lKCk6CisgICAgPj4+IG15Y21kLmVtcHR5bGluZSgpCisgICAgKioqIFVua25vd24gc3ludGF4OiB0ZXN0CisKKyAgICBUZXN0IGZvciB0aGUgZnVuY3Rpb24gZGVmYXVsdCgpOgorICAgID4+PiBteWNtZC5kZWZhdWx0KCJkZWZhdWx0IikKKyAgICAqKiogVW5rbm93biBzeW50YXg6IGRlZmF1bHQKKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZWRlZmF1bHQoKToKKyAgICA+Pj4gbXljbWQuY29tcGxldGVkZWZhdWx0KCkKKyAgICBUaGlzIGlzIHRoZSBjb21wbGV0ZWRlZmF1bHQgbWV0aG9kZQorICAgID4+PiBteWNtZC5jb21wbGV0ZW5hbWVzKCJhIikKKyAgICBbJ2FkZCddCisKKyAgICBUZXN0IGZvciB0aGUgZnVuY3Rpb24gY29tcGxldGVuYW1lcygpOgorICAgID4+PiBteWNtZC5jb21wbGV0ZW5hbWVzKCIxMiIpCisgICAgW10KKyAgICA+Pj4gbXljbWQuY29tcGxldGVuYW1lcygiaGVscCIpCisgICAgWydoZWxwJ10KKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBjb21wbGV0ZV9oZWxwKCk6CisgICAgPj4+IG15Y21kLmNvbXBsZXRlX2hlbHAoImEiKQorICAgIFsnYWRkJ10KKyAgICA+Pj4gbXljbWQuY29tcGxldGVfaGVscCgiaGUiKQorICAgIFsnaGVscCddCisgICAgPj4+IG15Y21kLmNvbXBsZXRlX2hlbHAoIjEyIikKKyAgICBbXQorICAgID4+PiBzb3J0ZWQobXljbWQuY29tcGxldGVfaGVscCgiIikpCisgICAgWydhZGQnLCAnZXhpdCcsICdoZWxwJywgJ3NoZWxsJ10KKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBkb19oZWxwKCk6CisgICAgPj4+IG15Y21kLmRvX2hlbHAoInRlc3RldCIpCisgICAgKioqIE5vIGhlbHAgb24gdGVzdGV0CisgICAgPj4+IG15Y21kLmRvX2hlbHAoImFkZCIpCisgICAgaGVscCB0ZXh0IGZvciBhZGQKKyAgICA+Pj4gbXljbWQub25lY21kKCJoZWxwIGFkZCIpCisgICAgaGVscCB0ZXh0IGZvciBhZGQKKyAgICA+Pj4gbXljbWQuZG9faGVscCgiIikKKyAgICA8QkxBTktMSU5FPgorICAgIERvY3VtZW50ZWQgY29tbWFuZHMgKHR5cGUgaGVscCA8dG9waWM+KToKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgICAgYWRkICBoZWxwCisgICAgPEJMQU5LTElORT4KKyAgICBVbmRvY3VtZW50ZWQgY29tbWFuZHM6CisgICAgPT09PT09PT09PT09PT09PT09PT09PQorICAgIGV4aXQgIHNoZWxsCisgICAgPEJMQU5LTElORT4KKworICAgIFRlc3QgZm9yIHRoZSBmdW5jdGlvbiBwcmludF90b3BpY3MoKToKKyAgICA+Pj4gbXljbWQucHJpbnRfdG9waWNzKCJoZWFkZXIiLCBbImNvbW1hbmQxIiwgImNvbW1hbmQyIl0sIDIgLDEwKQorICAgIGhlYWRlcgorICAgID09PT09PQorICAgIGNvbW1hbmQxCisgICAgY29tbWFuZDIKKyAgICA8QkxBTktMSU5FPgorCisgICAgVGVzdCBmb3IgdGhlIGZ1bmN0aW9uIGNvbHVtbml6ZSgpOgorICAgID4+PiBteWNtZC5jb2x1bW5pemUoW3N0cihpKSBmb3IgaSBpbiB4cmFuZ2UoMjApXSkKKyAgICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1ICAxNiAgMTcgIDE4ICAxOQorICAgID4+PiBteWNtZC5jb2x1bW5pemUoW3N0cihpKSBmb3IgaSBpbiB4cmFuZ2UoMjApXSwgMTApCisgICAgMCAgNyAgIDE0CisgICAgMSAgOCAgIDE1CisgICAgMiAgOSAgIDE2CisgICAgMyAgMTAgIDE3CisgICAgNCAgMTEgIDE4CisgICAgNSAgMTIgIDE5CisgICAgNiAgMTMKKworICAgIFRoaXMgaXMgYSBpbnRlcmFjdGl2ZSB0ZXN0LCBwdXQgc29tZSBjb21tYW5kcyBpbiB0aGUgY21kcXVldWUgYXR0cmlidXRlCisgICAgYW5kIGxldCBpdCBleGVjdXRlCisgICAgVGhpcyB0ZXN0IGluY2x1ZGVzIHRoZSBwcmVsb29wKCksIHBvc3Rsb29wKCksIGRlZmF1bHQoKSwgZW1wdHlsaW5lKCksCisgICAgcGFyc2VsaW5lKCksIGRvX2hlbHAoKSBmdW5jdGlvbnMKKyAgICA+Pj4gbXljbWQudXNlX3Jhd2lucHV0PTAKKyAgICA+Pj4gbXljbWQuY21kcXVldWU9WyIiLCAiYWRkIiwgImFkZCA0IDUiLCAiaGVscCIsICJoZWxwIGFkZCIsImV4aXQiXQorICAgID4+PiBteWNtZC5jbWRsb29wKCkKKyAgICBIZWxsbyBmcm9tIHByZWxvb3AKKyAgICBoZWxwIHRleHQgZm9yIGFkZAorICAgICoqKiBpbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHMKKyAgICA5CisgICAgPEJMQU5LTElORT4KKyAgICBEb2N1bWVudGVkIGNvbW1hbmRzICh0eXBlIGhlbHAgPHRvcGljPik6CisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgIGFkZCAgaGVscAorICAgIDxCTEFOS0xJTkU+CisgICAgVW5kb2N1bWVudGVkIGNvbW1hbmRzOgorICAgID09PT09PT09PT09PT09PT09PT09PT0KKyAgICBleGl0ICBzaGVsbAorICAgIDxCTEFOS0xJTkU+CisgICAgaGVscCB0ZXh0IGZvciBhZGQKKyAgICBIZWxsbyBmcm9tIHBvc3Rsb29wCisgICAgIiIiCisKKyAgICBkZWYgcHJlbG9vcChzZWxmKToKKyAgICAgICAgcHJpbnQgIkhlbGxvIGZyb20gcHJlbG9vcCIKKworICAgIGRlZiBwb3N0bG9vcChzZWxmKToKKyAgICAgICAgcHJpbnQgIkhlbGxvIGZyb20gcG9zdGxvb3AiCisKKyAgICBkZWYgY29tcGxldGVkZWZhdWx0KHNlbGYsICppZ25vcmVkKToKKyAgICAgICAgcHJpbnQgIlRoaXMgaXMgdGhlIGNvbXBsZXRlZGVmYXVsdCBtZXRob2RlIgorICAgICAgICByZXR1cm4KKworICAgIGRlZiBjb21wbGV0ZV9jb21tYW5kKHNlbGYpOgorICAgICAgICBwcmludCAiY29tcGxldGUgY29tbWFuZCIKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgZG9fc2hlbGwoc2VsZiwgcyk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBkb19hZGQoc2VsZiwgcyk6CisgICAgICAgIGwgPSBzLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKGwpICE9IDI6CisgICAgICAgICAgICBwcmludCAiKioqIGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50cyIKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsID0gW2ludChpKSBmb3IgaSBpbiBsXQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHByaW50ICIqKiogYXJndW1lbnRzIHNob3VsZCBiZSBudW1iZXJzIgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHByaW50IGxbMF0rbFsxXQorCisgICAgZGVmIGhlbHBfYWRkKHNlbGYpOgorICAgICAgICBwcmludCAiaGVscCB0ZXh0IGZvciBhZGQiCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGRvX2V4aXQoc2VsZiwgYXJnKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBUZXN0QWx0ZXJuYXRlSW5wdXQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgY2xhc3Mgc2ltcGxlY21kKGNtZC5DbWQpOgorCisgICAgICAgIGRlZiBkb19wcmludChzZWxmLCBhcmdzKToKKyAgICAgICAgICAgIHByaW50ID4+c2VsZi5zdGRvdXQsIGFyZ3MKKworICAgICAgICBkZWYgZG9fRU9GKHNlbGYsIGFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworCisgICAgY2xhc3Mgc2ltcGxlY21kMihzaW1wbGVjbWQpOgorCisgICAgICAgIGRlZiBkb19FT0Yoc2VsZiwgYXJncyk6CisgICAgICAgICAgICBwcmludCA+PnNlbGYuc3Rkb3V0LCAnKioqIFVua25vd24gc3ludGF4OiBFT0YnCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisKKyAgICBkZWYgdGVzdF9maWxlX3dpdGhfbWlzc2luZ19maW5hbF9ubChzZWxmKToKKyAgICAgICAgaW5wdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygicHJpbnQgdGVzdFxucHJpbnQgdGVzdDIiKQorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGNtZCA9IHNlbGYuc2ltcGxlY21kKHN0ZGluPWlucHV0LCBzdGRvdXQ9b3V0cHV0KQorICAgICAgICBjbWQudXNlX3Jhd2lucHV0ID0gRmFsc2UKKyAgICAgICAgY21kLmNtZGxvb3AoKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpTGluZUVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgKCIoQ21kKSB0ZXN0XG4iCisgICAgICAgICAgICAgIihDbWQpIHRlc3QyXG4iCisgICAgICAgICAgICAgIihDbWQpICIpKQorCisKKyAgICBkZWYgdGVzdF9pbnB1dF9yZXNldF9hdF9FT0Yoc2VsZik6CisgICAgICAgIGlucHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oInByaW50IHRlc3RcbnByaW50IHRlc3QyIikKKyAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBjbWQgPSBzZWxmLnNpbXBsZWNtZDIoc3RkaW49aW5wdXQsIHN0ZG91dD1vdXRwdXQpCisgICAgICAgIGNtZC51c2VfcmF3aW5wdXQgPSBGYWxzZQorICAgICAgICBjbWQuY21kbG9vcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlMaW5lRXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAoIihDbWQpIHRlc3RcbiIKKyAgICAgICAgICAgICAiKENtZCkgdGVzdDJcbiIKKyAgICAgICAgICAgICAiKENtZCkgKioqIFVua25vd24gc3ludGF4OiBFT0ZcbiIpKQorICAgICAgICBpbnB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCJwcmludCBcblxuIikKKyAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBjbWQuc3RkaW4gPSBpbnB1dAorICAgICAgICBjbWQuc3Rkb3V0ID0gb3V0cHV0CisgICAgICAgIGNtZC5jbWRsb29wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRNdWx0aUxpbmVFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICgiKENtZCkgXG4iCisgICAgICAgICAgICAgIihDbWQpIFxuIgorICAgICAgICAgICAgICIoQ21kKSAqKiogVW5rbm93biBzeW50YXg6IEVPRlxuIikpCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9jbWQKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF9jbWQsIHZlcmJvc2UpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0QWx0ZXJuYXRlSW5wdXQpCisKK2RlZiB0ZXN0X2NvdmVyYWdlKGNvdmVyZGlyKToKKyAgICB0cmFjZSA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0cmFjZScpCisgICAgdHJhY2VyPXRyYWNlLlRyYWNlKGlnbm9yZWRpcnM9W3N5cy5wcmVmaXgsIHN5cy5leGVjX3ByZWZpeCxdLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9MCwgY291bnQ9MSkKKyAgICB0cmFjZXIucnVuKCdyZWxvYWQoY21kKTt0ZXN0X21haW4oKScpCisgICAgcj10cmFjZXIucmVzdWx0cygpCisgICAgcHJpbnQgIldyaXRpbmcgY292ZXJhZ2UgcmVzdWx0cy4uLiIKKyAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwgY292ZXJkaXI9Y292ZXJkaXIpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgIi1jIiBpbiBzeXMuYXJndjoKKyAgICAgICAgdGVzdF9jb3ZlcmFnZSgnL3RtcC9jbWQuY292ZXInKQorICAgIGVsaWYgIi1pIiBpbiBzeXMuYXJndjoKKyAgICAgICAgc2FtcGxlY21kY2xhc3MoKS5jbWRsb29wKCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMWI3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmMWI3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmYyNmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmUucHkKQEAgLTAsMCArMSwxNDMgQEAKKyMgVGVzdHMgaW52b2NhdGlvbiBvZiB0aGUgaW50ZXJwcmV0ZXIgd2l0aCB2YXJpb3VzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyMgQWxsIHRlc3RzIGFyZSBleGVjdXRlZCB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcyBpZ25vcmVkCisjIFNlZSB0ZXN0X2NtZF9saW5lX3NjcmlwdC5weSBmb3IgdGVzdGluZyBvZiBzY3JpcHQgZXhlY3V0aW9uCisKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgKAorICAgIGFzc2VydF9weXRob25fb2ssIGFzc2VydF9weXRob25fZmFpbHVyZSwgc3Bhd25fcHl0aG9uLCBraWxsX3B5dGhvbiwKKyAgICBweXRob25fZXhpdF9jb2RlCispCisKKworY2xhc3MgQ21kTGluZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzdGFydF9weXRob24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBwID0gc3Bhd25fcHl0aG9uKCphcmdzKQorICAgICAgICByZXR1cm4ga2lsbF9weXRob24ocCkKKworICAgIGRlZiBleGl0X2NvZGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gcHl0aG9uX2V4aXRfY29kZSgqYXJncykKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yaWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZXhpdF9jb2RlKCcuJyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5leGl0X2NvZGUoJzwgLicpLCAwKQorCisgICAgZGVmIHZlcmlmeV92YWxpZF9mbGFnKHNlbGYsIGNtZF9saW5lKToKKyAgICAgICAgZGF0YSA9IHNlbGYuc3RhcnRfcHl0aG9uKGNtZF9saW5lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YSA9PSAnJyBvciBkYXRhLmVuZHN3aXRoKCdcbicpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdUcmFjZWJhY2snLCBkYXRhKQorCisgICAgZGVmIHRlc3Rfb3B0aW1pemUoc2VsZik6CisgICAgICAgIHNlbGYudmVyaWZ5X3ZhbGlkX2ZsYWcoJy1PJykKKyAgICAgICAgc2VsZi52ZXJpZnlfdmFsaWRfZmxhZygnLU9PJykKKworICAgIGRlZiB0ZXN0X3Eoc2VsZik6CisgICAgICAgIHNlbGYudmVyaWZ5X3ZhbGlkX2ZsYWcoJy1Rb2xkJykKKyAgICAgICAgc2VsZi52ZXJpZnlfdmFsaWRfZmxhZygnLVFuZXcnKQorICAgICAgICBzZWxmLnZlcmlmeV92YWxpZF9mbGFnKCctUXdhcm4nKQorICAgICAgICBzZWxmLnZlcmlmeV92YWxpZF9mbGFnKCctUXdhcm5hbGwnKQorCisgICAgZGVmIHRlc3Rfc2l0ZV9mbGFnKHNlbGYpOgorICAgICAgICBzZWxmLnZlcmlmeV92YWxpZF9mbGFnKCctUycpCisKKyAgICBkZWYgdGVzdF91c2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJbigndXNhZ2UnLCBzZWxmLnN0YXJ0X3B5dGhvbignLWgnKSkKKworICAgIGRlZiB0ZXN0X3ZlcnNpb24oc2VsZik6CisgICAgICAgIHZlcnNpb24gPSAnUHl0aG9uICVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnN0YXJ0X3B5dGhvbignLVYnKS5zdGFydHN3aXRoKHZlcnNpb24pKQorCisgICAgZGVmIHRlc3RfcnVuX21vZHVsZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGV4cGVjdGVkIG9wZXJhdGlvbiBvZiB0aGUgJy1tJyBzd2l0Y2gKKyAgICAgICAgIyBTd2l0Y2ggbmVlZHMgYW4gYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmV4aXRfY29kZSgnLW0nKSwgMCkKKyAgICAgICAgIyBDaGVjayB3ZSBnZXQgYW4gZXJyb3IgZm9yIGEgbm9uZXhpc3RlbnQgbW9kdWxlCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCisgICAgICAgICAgICBzZWxmLmV4aXRfY29kZSgnLW0nLCAnZm5vcmQ0MzUyMHh5eicpLAorICAgICAgICAgICAgMCkKKyAgICAgICAgIyBDaGVjayB0aGUgcnVucHkgbW9kdWxlIGFsc28gZ2l2ZXMgYW4gZXJyb3IgZm9yCisgICAgICAgICMgYSBub25leGlzdGVudCBtb2R1bGUKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jb2RlKCctbScsICdydW5weScsICdmbm9yZDQzNTIweHl6JyksCisgICAgICAgICAgICAwKQorICAgICAgICAjIEFsbCBnb29kIGlmIG1vZHVsZSBpcyBsb2NhdGVkIGFuZCBydW4gc3VjY2Vzc2Z1bGx5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzZWxmLmV4aXRfY29kZSgnLW0nLCAndGltZWl0JywgJy1uJywgJzEnKSwKKyAgICAgICAgICAgIDApCisKKyAgICBkZWYgdGVzdF9ydW5fbW9kdWxlX2J1ZzE3NjQ0MDcoc2VsZik6CisgICAgICAgICMgLW0gYW5kIC1pIG5lZWQgdG8gcGxheSB3ZWxsIHRvZ2V0aGVyCisgICAgICAgICMgUnVucyB0aGUgdGltZWl0IG1vZHVsZSBhbmQgY2hlY2tzIHRoZSBfX21haW5fXworICAgICAgICAjIG5hbWVzcGFjZSBoYXMgYmVlbiBwb3B1bGF0ZWQgYXBwcm9wcmlhdGVseQorICAgICAgICBwID0gc3Bhd25fcHl0aG9uKCctaScsICctbScsICd0aW1laXQnLCAnLW4nLCAnMScpCisgICAgICAgIHAuc3RkaW4ud3JpdGUoJ1RpbWVyXG4nKQorICAgICAgICBwLnN0ZGluLndyaXRlKCdleGl0KClcbicpCisgICAgICAgIGRhdGEgPSBraWxsX3B5dGhvbihwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YS5zdGFydHN3aXRoKCcxIGxvb3AnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignX19tYWluX18uVGltZXInLCBkYXRhKQorCisgICAgZGVmIHRlc3RfcnVuX2NvZGUoc2VsZik6CisgICAgICAgICMgVGVzdCBleHBlY3RlZCBvcGVyYXRpb24gb2YgdGhlICctYycgc3dpdGNoCisgICAgICAgICMgU3dpdGNoIG5lZWRzIGFuIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5leGl0X2NvZGUoJy1jJyksIDApCisgICAgICAgICMgQ2hlY2sgd2UgZ2V0IGFuIGVycm9yIGZvciBhbiB1bmNhdWdodCBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jb2RlKCctYycsICdyYWlzZSBFeGNlcHRpb24nKSwKKyAgICAgICAgICAgIDApCisgICAgICAgICMgQWxsIGdvb2QgaWYgZXhlY3V0aW9uIGlzIHN1Y2Nlc3NmdWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZXhpdF9jb2RlKCctYycsICdwYXNzJyksCisgICAgICAgICAgICAwKQorCisgICAgZGVmIHRlc3RfaGFzaF9yYW5kb21pemF0aW9uKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IC1SIGVuYWJsZXMgaGFzaCByYW5kb21pemF0aW9uOgorICAgICAgICBzZWxmLnZlcmlmeV92YWxpZF9mbGFnKCctUicpCisgICAgICAgIGhhc2hlcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIpOgorICAgICAgICAgICAgY29kZSA9ICdwcmludChoYXNoKCJzcGFtIikpJworICAgICAgICAgICAgZGF0YSA9IHNlbGYuc3RhcnRfcHl0aG9uKCctUicsICctYycsIGNvZGUpCisgICAgICAgICAgICBoYXNoZXMuYXBwZW5kKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaGFzaGVzWzBdLCBoYXNoZXNbMV0pCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBzeXMuZmxhZ3MgY29udGFpbnMgaGFzaF9yYW5kb21pemF0aW9uCisgICAgICAgIGNvZGUgPSAnaW1wb3J0IHN5czsgcHJpbnQgc3lzLmZsYWdzJworICAgICAgICBkYXRhID0gc2VsZi5zdGFydF9weXRob24oJy1SJywgJy1jJywgY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdoYXNoX3JhbmRvbWl6YXRpb249MScgaW4gZGF0YSkKKworICAgIGRlZiB0ZXN0X2RlbF9fX21haW5fXyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTUwMDE6IFB5UnVuX1NpbXBsZUZpbGVFeEZsYWdzKCkgZGlkIGNyYXNoIGJlY2F1c2UgaXQga2VwdCBhCisgICAgICAgICMgYm9ycm93ZWQgcmVmZXJlbmNlIHRvIHRoZSBkaWN0IG9mIF9fbWFpbl9fIG1vZHVsZSBhbmQgbGF0ZXIgbW9kaWZ5CisgICAgICAgICMgdGhlIGRpY3Qgd2hlcmVhcyB0aGUgbW9kdWxlIHdhcyBkZXN0cm95ZWQKKyAgICAgICAgZmlsZW5hbWUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3QudGVzdF9zdXBwb3J0LnVubGluaywgZmlsZW5hbWUpCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInciKSBhcyBzY3JpcHQ6CisgICAgICAgICAgICBwcmludCA+PnNjcmlwdCwgImltcG9ydCBzeXMiCisgICAgICAgICAgICBwcmludCA+PnNjcmlwdCwgImRlbCBzeXMubW9kdWxlc1snX19tYWluX18nXSIKKyAgICAgICAgYXNzZXJ0X3B5dGhvbl9vayhmaWxlbmFtZSkKKworICAgIGRlZiB0ZXN0X3Vua25vd25fb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCctRScsICcteicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidVbmtub3duIG9wdGlvbjogLXonLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLnNwbGl0bGluZXMoKS5jb3VudChiJ1Vua25vd24gb3B0aW9uOiAteicpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgb3V0KQorICAgICAgICAjIEFkZCAid2l0aG91dD0nLUUnIiB0byBwcmV2ZW50IF9hc3NlcnRfcHl0aG9uIHRvIGFwcGVuZCAtRQorICAgICAgICAjIHRvIGVudl92YXJzIGFuZCBjaGFuZ2UgdGhlIG91dHB1dCBvZiBzdGRlcnIKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9mYWlsdXJlKCcteicsIHdpdGhvdXQ9Jy1FJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiJ1Vua25vd24gb3B0aW9uOiAteicsIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuc3BsaXRsaW5lcygpLmNvdW50KGInVW5rbm93biBvcHRpb246IC16JyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBvdXQpCisgICAgICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fZmFpbHVyZSgnLWEnLCAnLXonLCB3aXRob3V0PSctRScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidVbmtub3duIG9wdGlvbjogLWEnLCBlcnIpCisgICAgICAgICMgb25seSB0aGUgZmlyc3QgdW5rbm93biBvcHRpb24gaXMgcmVwb3J0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihiJ1Vua25vd24gb3B0aW9uOiAteicsIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuc3BsaXRsaW5lcygpLmNvdW50KGInVW5rbm93biBvcHRpb246IC1hJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBvdXQpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbWRMaW5lVGVzdCkKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGIzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNGIzNTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMDUyMjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKQEAgLTAsMCArMSwyMjkgQEAKKyMgVGVzdHMgY29tbWFuZCBsaW5lIGV4ZWN1dGlvbiBvZiBzY3JpcHRzCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Citmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgKHJ1bl9weXRob24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGlyLCBtYWtlX3NjcmlwdCwgY29tcGlsZV9zY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydF9weXRob25fZmFpbHVyZSwgbWFrZV9wa2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfemlwX3NjcmlwdCwgbWFrZV96aXBfcGtnKQorCit2ZXJib3NlID0gdGVzdC50ZXN0X3N1cHBvcnQudmVyYm9zZQorCisKK2V4YW1wbGVfYXJncyA9IFsndGVzdDEnLCAndGVzdDInLCAndGVzdDMnXQorCit0ZXN0X3NvdXJjZSA9ICIiIlwKKyMgU2NyaXB0IG1heSBiZSBydW4gd2l0aCBvcHRpbWlzYXRpb24gZW5hYmxlZCwgc28gZG9uJ3QgcmVseSBvbiBhc3NlcnQKKyMgc3RhdGVtZW50cyBiZWluZyBleGVjdXRlZAorZGVmIGFzc2VydEVxdWFsKGxocywgcmhzKToKKyAgICBpZiBsaHMgIT0gcmhzOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignJXIgIT0gJXInICUgKGxocywgcmhzKSkKK2RlZiBhc3NlcnRJZGVudGljYWwobGhzLCByaHMpOgorICAgIGlmIGxocyBpcyBub3QgcmhzOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignJXIgaXMgbm90ICVyJyAlIChsaHMsIHJocykpCisjIENoZWNrIGJhc2ljIGNvZGUgZXhlY3V0aW9uCityZXN1bHQgPSBbJ1RvcCBsZXZlbCBhc3NpZ25tZW50J10KK2RlZiBmKCk6CisgICAgcmVzdWx0LmFwcGVuZCgnTG93ZXIgbGV2ZWwgcmVmZXJlbmNlJykKK2YoKQorYXNzZXJ0RXF1YWwocmVzdWx0LCBbJ1RvcCBsZXZlbCBhc3NpZ25tZW50JywgJ0xvd2VyIGxldmVsIHJlZmVyZW5jZSddKQorIyBDaGVjayBwb3B1bGF0aW9uIG9mIG1hZ2ljIHZhcmlhYmxlcworYXNzZXJ0RXF1YWwoX19uYW1lX18sICdfX21haW5fXycpCitwcmludCAnX19maWxlX189PSVyJyAlIF9fZmlsZV9fCitwcmludCAnX19wYWNrYWdlX189PSVyJyAlIF9fcGFja2FnZV9fCisjIENoZWNrIHRoZSBzeXMgbW9kdWxlCitpbXBvcnQgc3lzCithc3NlcnRJZGVudGljYWwoZ2xvYmFscygpLCBzeXMubW9kdWxlc1tfX25hbWVfX10uX19kaWN0X18pCitwcmludCAnc3lzLmFyZ3ZbMF09PSVyJyAlIHN5cy5hcmd2WzBdCisiIiIKKworZGVmIF9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsIHNjcmlwdF9iYXNlbmFtZSwgc291cmNlPXRlc3Rfc291cmNlKToKKyAgICByZXR1cm4gbWFrZV9zY3JpcHQoc2NyaXB0X2Rpciwgc2NyaXB0X2Jhc2VuYW1lLCBzb3VyY2UpCisKK2RlZiBfbWFrZV90ZXN0X3ppcF9wa2coemlwX2RpciwgemlwX2Jhc2VuYW1lLCBwa2dfbmFtZSwgc2NyaXB0X2Jhc2VuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U9dGVzdF9zb3VyY2UsIGRlcHRoPTEpOgorICAgIHJldHVybiBtYWtlX3ppcF9wa2coemlwX2RpciwgemlwX2Jhc2VuYW1lLCBwa2dfbmFtZSwgc2NyaXB0X2Jhc2VuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLCBkZXB0aCkKKworIyBUaGVyZSdzIG5vIGVhc3kgd2F5IHRvIHBhc3MgdGhlIHNjcmlwdCBkaXJlY3RvcnkgaW4gdG8gZ2V0CisjIC1tIHRvIHdvcmsgKGF2b2lkaW5nIHRoYXQgaXMgdGhlIHdob2xlIHBvaW50IG9mIG1ha2luZworIyBkaXJlY3RvcmllcyBhbmQgemlwZmlsZXMgZXhlY3V0YWJsZSEpCisjIFNvIHdlIGZha2UgaXQgZm9yIHRlc3RpbmcgcHVycG9zZXMgd2l0aCBhIGN1c3RvbSBsYXVuY2ggc2NyaXB0CitsYXVuY2hfc291cmNlID0gIiIiXAoraW1wb3J0IHN5cywgb3MucGF0aCwgcnVucHkKK3N5cy5wYXRoLmluc2VydCgwLCAlcykKK3J1bnB5Ll9ydW5fbW9kdWxlX2FzX21haW4oJXIpCisiIiIKKworZGVmIF9tYWtlX2xhdW5jaF9zY3JpcHQoc2NyaXB0X2Rpciwgc2NyaXB0X2Jhc2VuYW1lLCBtb2R1bGVfbmFtZSwgcGF0aD1Ob25lKToKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIHBhdGggPSAib3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSIKKyAgICBlbHNlOgorICAgICAgICBwYXRoID0gcmVwcihwYXRoKQorICAgIHNvdXJjZSA9IGxhdW5jaF9zb3VyY2UgJSAocGF0aCwgbW9kdWxlX25hbWUpCisgICAgcmV0dXJuIG1ha2Vfc2NyaXB0KHNjcmlwdF9kaXIsIHNjcmlwdF9iYXNlbmFtZSwgc291cmNlKQorCitjbGFzcyBDbWRMaW5lVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9jaGVja19zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGV4cGVjdGVkX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfYXJndjAsIGV4cGVjdGVkX3BhY2thZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNtZF9saW5lX3N3aXRjaGVzKToKKyAgICAgICAgcnVuX2FyZ3MgPSBjbWRfbGluZV9zd2l0Y2hlcyArIChzY3JpcHRfbmFtZSwpCisgICAgICAgIGV4aXRfY29kZSwgZGF0YSA9IHJ1bl9weXRob24oKnJ1bl9hcmdzKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ091dHB1dCBmcm9tIHRlc3Qgc2NyaXB0ICVyOicgJSBzY3JpcHRfbmFtZQorICAgICAgICAgICAgcHJpbnQgZGF0YQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4aXRfY29kZSwgMCkKKyAgICAgICAgcHJpbnRlZF9maWxlID0gJ19fZmlsZV9fPT0lcicgJSBleHBlY3RlZF9maWxlCisgICAgICAgIHByaW50ZWRfYXJndjAgPSAnc3lzLmFyZ3ZbMF09PSVyJyAlIGV4cGVjdGVkX2FyZ3YwCisgICAgICAgIHByaW50ZWRfcGFja2FnZSA9ICdfX3BhY2thZ2VfXz09JXInICUgZXhwZWN0ZWRfcGFja2FnZQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ0V4cGVjdGVkIG91dHB1dDonCisgICAgICAgICAgICBwcmludCBwcmludGVkX2ZpbGUKKyAgICAgICAgICAgIHByaW50IHByaW50ZWRfcGFja2FnZQorICAgICAgICAgICAgcHJpbnQgcHJpbnRlZF9hcmd2MAorICAgICAgICBzZWxmLmFzc2VydEluKHByaW50ZWRfZmlsZSwgZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihwcmludGVkX3BhY2thZ2UsIGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHJpbnRlZF9hcmd2MCwgZGF0YSkKKworICAgIGRlZiBfY2hlY2tfaW1wb3J0X2Vycm9yKHNlbGYsIHNjcmlwdF9uYW1lLCBleHBlY3RlZF9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmNtZF9saW5lX3N3aXRjaGVzKToKKyAgICAgICAgcnVuX2FyZ3MgPSBjbWRfbGluZV9zd2l0Y2hlcyArIChzY3JpcHRfbmFtZSwpCisgICAgICAgIGV4aXRfY29kZSwgZGF0YSA9IHJ1bl9weXRob24oKnJ1bl9hcmdzKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ091dHB1dCBmcm9tIHRlc3Qgc2NyaXB0ICVyOicgJSBzY3JpcHRfbmFtZQorICAgICAgICAgICAgcHJpbnQgZGF0YQorICAgICAgICAgICAgcHJpbnQgJ0V4cGVjdGVkIG91dHB1dDogJXInICUgZXhwZWN0ZWRfbXNnCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXhwZWN0ZWRfbXNnLCBkYXRhKQorCisgICAgZGVmIHRlc3RfYmFzaWNfc2NyaXB0KHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgJ3NjcmlwdCcpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoc2NyaXB0X25hbWUsIHNjcmlwdF9uYW1lLCBzY3JpcHRfbmFtZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3NjcmlwdF9jb21waWxlZChzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsICdzY3JpcHQnKQorICAgICAgICAgICAgY29tcGlsZWRfbmFtZSA9IGNvbXBpbGVfc2NyaXB0KHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgb3MucmVtb3ZlKHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KGNvbXBpbGVkX25hbWUsIGNvbXBpbGVkX25hbWUsIGNvbXBpbGVkX25hbWUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCAnX19tYWluX18nKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KHNjcmlwdF9kaXIsIHNjcmlwdF9uYW1lLCBzY3JpcHRfZGlyLCAnJykKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9jb21waWxlZChzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsICdfX21haW5fXycpCisgICAgICAgICAgICBjb21waWxlZF9uYW1lID0gY29tcGlsZV9zY3JpcHQoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBvcy5yZW1vdmUoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoc2NyaXB0X2RpciwgY29tcGlsZWRfbmFtZSwgc2NyaXB0X2RpciwgJycpCisKKyAgICBkZWYgdGVzdF9kaXJlY3RvcnlfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgbXNnID0gImNhbid0IGZpbmQgJ19fbWFpbl9fJyBtb2R1bGUgaW4gJXIiICUgc2NyaXB0X2RpcgorICAgICAgICAgICAgc2VsZi5fY2hlY2tfaW1wb3J0X2Vycm9yKHNjcmlwdF9kaXIsIG1zZykKKworICAgIGRlZiB0ZXN0X3ppcGZpbGUoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCAnX19tYWluX18nKQorICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gbWFrZV96aXBfc2NyaXB0KHNjcmlwdF9kaXIsICd0ZXN0X3ppcCcsIHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KHppcF9uYW1lLCBydW5fbmFtZSwgemlwX25hbWUsICcnKQorCisgICAgZGVmIHRlc3RfemlwZmlsZV9jb21waWxlZChzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsICdfX21haW5fXycpCisgICAgICAgICAgICBjb21waWxlZF9uYW1lID0gY29tcGlsZV9zY3JpcHQoc2NyaXB0X25hbWUpCisgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBtYWtlX3ppcF9zY3JpcHQoc2NyaXB0X2RpciwgJ3Rlc3RfemlwJywgY29tcGlsZWRfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdCh6aXBfbmFtZSwgcnVuX25hbWUsIHppcF9uYW1lLCAnJykKKworICAgIGRlZiB0ZXN0X3ppcGZpbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCAnbm90X21haW4nKQorICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gbWFrZV96aXBfc2NyaXB0KHNjcmlwdF9kaXIsICd0ZXN0X3ppcCcsIHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgbXNnID0gImNhbid0IGZpbmQgJ19fbWFpbl9fJyBtb2R1bGUgaW4gJXIiICUgemlwX25hbWUKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ltcG9ydF9lcnJvcih6aXBfbmFtZSwgbXNnKQorCisgICAgZGVmIHRlc3RfbW9kdWxlX2luX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgcGtnX2RpciA9IG9zLnBhdGguam9pbihzY3JpcHRfZGlyLCAndGVzdF9wa2cnKQorICAgICAgICAgICAgbWFrZV9wa2cocGtnX2RpcikKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gX21ha2VfdGVzdF9zY3JpcHQocGtnX2RpciwgJ3NjcmlwdCcpCisgICAgICAgICAgICBsYXVuY2hfbmFtZSA9IF9tYWtlX2xhdW5jaF9zY3JpcHQoc2NyaXB0X2RpciwgJ2xhdW5jaCcsICd0ZXN0X3BrZy5zY3JpcHQnKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KGxhdW5jaF9uYW1lLCBzY3JpcHRfbmFtZSwgc2NyaXB0X25hbWUsICd0ZXN0X3BrZycpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfaW5fcGFja2FnZV9pbl96aXBmaWxlKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHppcF9uYW1lLCBydW5fbmFtZSA9IF9tYWtlX3Rlc3RfemlwX3BrZyhzY3JpcHRfZGlyLCAndGVzdF96aXAnLCAndGVzdF9wa2cnLCAnc2NyaXB0JykKKyAgICAgICAgICAgIGxhdW5jaF9uYW1lID0gX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCAnbGF1bmNoJywgJ3Rlc3RfcGtnLnNjcmlwdCcsIHppcF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KGxhdW5jaF9uYW1lLCBydW5fbmFtZSwgcnVuX25hbWUsICd0ZXN0X3BrZycpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfaW5fc3VicGFja2FnZV9pbl96aXBmaWxlKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHppcF9uYW1lLCBydW5fbmFtZSA9IF9tYWtlX3Rlc3RfemlwX3BrZyhzY3JpcHRfZGlyLCAndGVzdF96aXAnLCAndGVzdF9wa2cnLCAnc2NyaXB0JywgZGVwdGg9MikKKyAgICAgICAgICAgIGxhdW5jaF9uYW1lID0gX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCAnbGF1bmNoJywgJ3Rlc3RfcGtnLnRlc3RfcGtnLnNjcmlwdCcsIHppcF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KGxhdW5jaF9uYW1lLCBydW5fbmFtZSwgcnVuX25hbWUsICd0ZXN0X3BrZy50ZXN0X3BrZycpCisKKyAgICBkZWYgdGVzdF9wYWNrYWdlKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHBrZ19kaXIgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIG1ha2VfcGtnKHBrZ19kaXIpCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IF9tYWtlX3Rlc3Rfc2NyaXB0KHBrZ19kaXIsICdfX21haW5fXycpCisgICAgICAgICAgICBsYXVuY2hfbmFtZSA9IF9tYWtlX2xhdW5jaF9zY3JpcHQoc2NyaXB0X2RpciwgJ2xhdW5jaCcsICd0ZXN0X3BrZycpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQobGF1bmNoX25hbWUsIHNjcmlwdF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9uYW1lLCAndGVzdF9wa2cnKQorCisgICAgZGVmIHRlc3RfcGFja2FnZV9jb21waWxlZChzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsICd0ZXN0X3BrZycpCisgICAgICAgICAgICBtYWtlX3BrZyhwa2dfZGlyKQorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChwa2dfZGlyLCAnX19tYWluX18nKQorICAgICAgICAgICAgY29tcGlsZWRfbmFtZSA9IGNvbXBpbGVfc2NyaXB0KHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgb3MucmVtb3ZlKHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgbGF1bmNoX25hbWUgPSBfbWFrZV9sYXVuY2hfc2NyaXB0KHNjcmlwdF9kaXIsICdsYXVuY2gnLCAndGVzdF9wa2cnKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KGxhdW5jaF9uYW1lLCBjb21waWxlZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkX25hbWUsICd0ZXN0X3BrZycpCisKKyAgICBkZWYgdGVzdF9wYWNrYWdlX2Vycm9yKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHBrZ19kaXIgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIG1ha2VfcGtnKHBrZ19kaXIpCisgICAgICAgICAgICBtc2cgPSAoIid0ZXN0X3BrZycgaXMgYSBwYWNrYWdlIGFuZCBjYW5ub3QgIgorICAgICAgICAgICAgICAgICAgICJiZSBkaXJlY3RseSBleGVjdXRlZCIpCisgICAgICAgICAgICBsYXVuY2hfbmFtZSA9IF9tYWtlX2xhdW5jaF9zY3JpcHQoc2NyaXB0X2RpciwgJ2xhdW5jaCcsICd0ZXN0X3BrZycpCisgICAgICAgICAgICBzZWxmLl9jaGVja19pbXBvcnRfZXJyb3IobGF1bmNoX25hbWUsIG1zZykKKworICAgIGRlZiB0ZXN0X3BhY2thZ2VfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIHBrZ19kaXIgPSBvcy5wYXRoLmpvaW4oc2NyaXB0X2RpciwgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIG1ha2VfcGtnKHBrZ19kaXIpCisgICAgICAgICAgICBtYWluX2RpciA9IG9zLnBhdGguam9pbihwa2dfZGlyLCAnX19tYWluX18nKQorICAgICAgICAgICAgbWFrZV9wa2cobWFpbl9kaXIpCisgICAgICAgICAgICBtc2cgPSAoIkNhbm5vdCB1c2UgcGFja2FnZSBhcyBfX21haW5fXyBtb2R1bGU7ICIKKyAgICAgICAgICAgICAgICAgICAiJ3Rlc3RfcGtnJyBpcyBhIHBhY2thZ2UgYW5kIGNhbm5vdCAiCisgICAgICAgICAgICAgICAgICAgImJlIGRpcmVjdGx5IGV4ZWN1dGVkIikKKyAgICAgICAgICAgIGxhdW5jaF9uYW1lID0gX21ha2VfbGF1bmNoX3NjcmlwdChzY3JpcHRfZGlyLCAnbGF1bmNoJywgJ3Rlc3RfcGtnJykKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ltcG9ydF9lcnJvcihsYXVuY2hfbmFtZSwgbXNnKQorCisgICAgZGVmIHRlc3RfZGFzaF9tX2Vycm9yX2NvZGVfaXNfb25lKHNlbGYpOgorICAgICAgICAjIElmIGEgbW9kdWxlIGlzIGludm9rZWQgd2l0aCB0aGUgLW0gY29tbWFuZCBsaW5lIGZsYWcKKyAgICAgICAgIyBhbmQgcmVzdWx0cyBpbiBhbiBlcnJvciB0aGF0IHRoZSByZXR1cm4gY29kZSB0byB0aGUKKyAgICAgICAgIyBzaGVsbCBpcyAnMScKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBwa2dfZGlyID0gb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsICd0ZXN0X3BrZycpCisgICAgICAgICAgICBtYWtlX3BrZyhwa2dfZGlyKQorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBfbWFrZV90ZXN0X3NjcmlwdChwa2dfZGlyLCAnb3RoZXInLCAiaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzogcmFpc2UgVmFsdWVFcnJvciIpCisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1tJywgJ3Rlc3RfcGtnLm90aGVyJywgKmV4YW1wbGVfYXJncykKKyAgICAgICAgICAgIGlmIHZlcmJvc2UgPiAxOgorICAgICAgICAgICAgICAgIHByaW50KG91dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDEpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDbWRMaW5lVGVzdCkKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNzJmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgwNzJmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NtZF9saW5lX3NjcmlwdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhZGY1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGUucHkKQEAgLTAsMCArMSwxNDcgQEAKKyIiIlRoaXMgbW9kdWxlIGluY2x1ZGVzIHRlc3RzIG9mIHRoZSBjb2RlIG9iamVjdCByZXByZXNlbnRhdGlvbi4KKworPj4+IGRlZiBmKHgpOgorLi4uICAgICBkZWYgZyh5KToKKy4uLiAgICAgICAgIHJldHVybiB4ICsgeQorLi4uICAgICByZXR1cm4gZworLi4uCisKKz4+PiBkdW1wKGYuZnVuY19jb2RlKQorbmFtZTogZgorYXJnY291bnQ6IDEKK25hbWVzOiAoKQordmFybmFtZXM6ICgneCcsICdnJykKK2NlbGx2YXJzOiAoJ3gnLCkKK2ZyZWV2YXJzOiAoKQorbmxvY2FsczogMgorZmxhZ3M6IDMKK2NvbnN0czogKCdOb25lJywgJzxjb2RlIG9iamVjdCBnPicpCisKKz4+PiBkdW1wKGYoNCkuZnVuY19jb2RlKQorbmFtZTogZworYXJnY291bnQ6IDEKK25hbWVzOiAoKQordmFybmFtZXM6ICgneScsKQorY2VsbHZhcnM6ICgpCitmcmVldmFyczogKCd4JywpCitubG9jYWxzOiAxCitmbGFnczogMTkKK2NvbnN0czogKCdOb25lJywpCisKKz4+PiBkZWYgaCh4LCB5KToKKy4uLiAgICAgYSA9IHggKyB5CisuLi4gICAgIGIgPSB4IC0geQorLi4uICAgICBjID0gYSAqIGIKKy4uLiAgICAgcmV0dXJuIGMKKy4uLgorPj4+IGR1bXAoaC5mdW5jX2NvZGUpCituYW1lOiBoCithcmdjb3VudDogMgorbmFtZXM6ICgpCit2YXJuYW1lczogKCd4JywgJ3knLCAnYScsICdiJywgJ2MnKQorY2VsbHZhcnM6ICgpCitmcmVldmFyczogKCkKK25sb2NhbHM6IDUKK2ZsYWdzOiA2NworY29uc3RzOiAoJ05vbmUnLCkKKworPj4+IGRlZiBhdHRycyhvYmopOgorLi4uICAgICBwcmludCBvYmouYXR0cjEKKy4uLiAgICAgcHJpbnQgb2JqLmF0dHIyCisuLi4gICAgIHByaW50IG9iai5hdHRyMworCis+Pj4gZHVtcChhdHRycy5mdW5jX2NvZGUpCituYW1lOiBhdHRycworYXJnY291bnQ6IDEKK25hbWVzOiAoJ2F0dHIxJywgJ2F0dHIyJywgJ2F0dHIzJykKK3Zhcm5hbWVzOiAoJ29iaicsKQorY2VsbHZhcnM6ICgpCitmcmVldmFyczogKCkKK25sb2NhbHM6IDEKK2ZsYWdzOiA2NworY29uc3RzOiAoJ05vbmUnLCkKKworPj4+IGRlZiBvcHRpbWl6ZV9hd2F5KCk6CisuLi4gICAgICdkb2Mgc3RyaW5nJworLi4uICAgICAnbm90IGEgZG9jc3RyaW5nJworLi4uICAgICA1MworLi4uICAgICA1M0wKKworPj4+IGR1bXAob3B0aW1pemVfYXdheS5mdW5jX2NvZGUpCituYW1lOiBvcHRpbWl6ZV9hd2F5Cithcmdjb3VudDogMAorbmFtZXM6ICgpCit2YXJuYW1lczogKCkKK2NlbGx2YXJzOiAoKQorZnJlZXZhcnM6ICgpCitubG9jYWxzOiAwCitmbGFnczogNjcKK2NvbnN0czogKCInZG9jIHN0cmluZyciLCAnTm9uZScpCisKKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgX3Rlc3RjYXBpCisKKworZGVmIGNvbnN0cyh0KToKKyAgICAiIiJZaWVsZCBhIGRvY3Rlc3Qtc2FmZSBzZXF1ZW5jZSBvZiBvYmplY3QgcmVwcnMuIiIiCisgICAgZm9yIGVsdCBpbiB0OgorICAgICAgICByID0gcmVwcihlbHQpCisgICAgICAgIGlmIHIuc3RhcnRzd2l0aCgiPGNvZGUgb2JqZWN0Iik6CisgICAgICAgICAgICB5aWVsZCAiPGNvZGUgb2JqZWN0ICVzPiIgJSBlbHQuY29fbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgeWllbGQgcgorCitkZWYgZHVtcChjbyk6CisgICAgIiIiUHJpbnQgb3V0IGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIGNvZGUgb2JqZWN0LiIiIgorICAgIGZvciBhdHRyIGluIFsibmFtZSIsICJhcmdjb3VudCIsICJuYW1lcyIsICJ2YXJuYW1lcyIsICJjZWxsdmFycyIsCisgICAgICAgICAgICAgICAgICJmcmVldmFycyIsICJubG9jYWxzIiwgImZsYWdzIl06CisgICAgICAgIHByaW50ICIlczogJXMiICUgKGF0dHIsIGdldGF0dHIoY28sICJjb18iICsgYXR0cikpCisgICAgcHJpbnQgImNvbnN0czoiLCB0dXBsZShjb25zdHMoY28uY29fY29uc3RzKSkKKworCitjbGFzcyBDb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9uZXdlbXB0eShzZWxmKToKKyAgICAgICAgY28gPSBfdGVzdGNhcGkuY29kZV9uZXdlbXB0eSgiZmlsZW5hbWUiLCAiZnVuY25hbWUiLCAxNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjby5jb19maWxlbmFtZSwgImZpbGVuYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjby5jb19uYW1lLCAiZnVuY25hbWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX2ZpcnN0bGluZW5vLCAxNSkKKworCitjbGFzcyBDb2RlV2Vha1JlZlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgY29kZSBvYmplY3QgaW4gYSBjbGVhbiBlbnZpcm9ubWVudCBzbyB0aGF0IHdlIGtub3cgd2UgaGF2ZQorICAgICAgICAjIHRoZSBvbmx5IHJlZmVyZW5jZSB0byBpdCBsZWZ0LgorICAgICAgICBuYW1lc3BhY2UgPSB7fQorICAgICAgICBleGVjICJkZWYgZigpOiBwYXNzIiBpbiBnbG9iYWxzKCksIG5hbWVzcGFjZQorICAgICAgICBmID0gbmFtZXNwYWNlWyJmIl0KKyAgICAgICAgZGVsIG5hbWVzcGFjZQorCisgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UKKyAgICAgICAgZGVmIGNhbGxiYWNrKGNvZGUpOgorICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisKKyAgICAgICAgIyBmIGlzIG5vdyB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uLCBhbmQgdGhyb3VnaCBpdCwgdGhlIGNvZGUKKyAgICAgICAgIyBvYmplY3QuICBXaGlsZSB3ZSBob2xkIGl0LCBjaGVjayB0aGF0IHdlIGNhbiBjcmVhdGUgYSB3ZWFrcmVmIGFuZAorICAgICAgICAjIGRlcmVmIGl0LiAgVGhlbiBkZWxldGUgaXQsIGFuZCBjaGVjayB0aGF0IHRoZSBjYWxsYmFjayBnZXRzIGNhbGxlZCBhbmQKKyAgICAgICAgIyB0aGUgcmVmZXJlbmNlIGRpZXMuCisgICAgICAgIGNvZGVyZWYgPSB3ZWFrcmVmLnJlZihmLl9fY29kZV9fLCBjYWxsYmFjaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woY29kZXJlZigpKSkKKyAgICAgICAgZGVsIGYKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShib29sKGNvZGVyZWYoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNhbGxlZCkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX2RvY3Rlc3QsIHJ1bl91bml0dGVzdAorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9jb2RlCisgICAgcnVuX2RvY3Rlc3QodGVzdF9jb2RlLCB2ZXJib3NlKQorICAgIHJ1bl91bml0dGVzdChDb2RlVGVzdCwgQ29kZVdlYWtSZWZUZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwY2M4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwY2M4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjMmRmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjY2FsbGJhY2tzLnB5CkBAIC0wLDAgKzEsODA0IEBACitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQsIHVuaXR0ZXN0CitpbXBvcnQgc3lzLCBjb2RlY3MsIGh0bWxlbnRpdHlkZWZzLCB1bmljb2RlZGF0YQorCitjbGFzcyBQb3NSZXR1cm46CisgICAgIyB0aGlzIGNhbiBiZSB1c2VkIGZvciBjb25maWd1cmFibGUgY2FsbGJhY2tzCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucG9zID0gMAorCisgICAgZGVmIGhhbmRsZShzZWxmLCBleGMpOgorICAgICAgICBvbGRwb3MgPSBzZWxmLnBvcworICAgICAgICByZWFscG9zID0gb2xkcG9zCisgICAgICAgIGlmIHJlYWxwb3M8MDoKKyAgICAgICAgICAgIHJlYWxwb3MgPSBsZW4oZXhjLm9iamVjdCkgKyByZWFscG9zCisgICAgICAgICMgaWYgd2UgZG9uJ3QgYWR2YW5jZSB0aGlzIHRpbWUsIHRlcm1pbmF0ZSBvbiB0aGUgbmV4dCBjYWxsCisgICAgICAgICMgb3RoZXJ3aXNlIHdlJ2QgZ2V0IGFuIGVuZGxlc3MgbG9vcAorICAgICAgICBpZiByZWFscG9zIDw9IGV4Yy5zdGFydDoKKyAgICAgICAgICAgIHNlbGYucG9zID0gbGVuKGV4Yy5vYmplY3QpCisgICAgICAgIHJldHVybiAodSI8Pz4iLCBvbGRwb3MpCisKKyMgQSBVbmljb2RlRW5jb2RlRXJyb3Igb2JqZWN0IHdpdGggYSBiYWQgc3RhcnQgYXR0cmlidXRlCitjbGFzcyBCYWRTdGFydFVuaWNvZGVFbmNvZGVFcnJvcihVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLl9faW5pdF9fKHNlbGYsICJhc2NpaSIsIHUiIiwgMCwgMSwgImJhZCIpCisgICAgICAgIHNlbGYuc3RhcnQgPSBbXQorCisjIEEgVW5pY29kZUVuY29kZUVycm9yIG9iamVjdCB3aXRoIGEgYmFkIG9iamVjdCBhdHRyaWJ1dGUKK2NsYXNzIEJhZE9iamVjdFVuaWNvZGVFbmNvZGVFcnJvcihVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLl9faW5pdF9fKHNlbGYsICJhc2NpaSIsIHUiIiwgMCwgMSwgImJhZCIpCisgICAgICAgIHNlbGYub2JqZWN0ID0gW10KKworIyBBIFVuaWNvZGVEZWNvZGVFcnJvciBvYmplY3Qgd2l0aG91dCBhbiBlbmQgYXR0cmlidXRlCitjbGFzcyBOb0VuZFVuaWNvZGVEZWNvZGVFcnJvcihVbmljb2RlRGVjb2RlRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVW5pY29kZURlY29kZUVycm9yLl9faW5pdF9fKHNlbGYsICJhc2NpaSIsICIiLCAwLCAxLCAiYmFkIikKKyAgICAgICAgZGVsIHNlbGYuZW5kCisKKyMgQSBVbmljb2RlRGVjb2RlRXJyb3Igb2JqZWN0IHdpdGggYSBiYWQgb2JqZWN0IGF0dHJpYnV0ZQorY2xhc3MgQmFkT2JqZWN0VW5pY29kZURlY29kZUVycm9yKFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBVbmljb2RlRGVjb2RlRXJyb3IuX19pbml0X18oc2VsZiwgImFzY2lpIiwgIiIsIDAsIDEsICJiYWQiKQorICAgICAgICBzZWxmLm9iamVjdCA9IFtdCisKKyMgQSBVbmljb2RlVHJhbnNsYXRlRXJyb3Igb2JqZWN0IHdpdGhvdXQgYSBzdGFydCBhdHRyaWJ1dGUKK2NsYXNzIE5vU3RhcnRVbmljb2RlVHJhbnNsYXRlRXJyb3IoVW5pY29kZVRyYW5zbGF0ZUVycm9yKToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFVuaWNvZGVUcmFuc2xhdGVFcnJvci5fX2luaXRfXyhzZWxmLCB1IiIsIDAsIDEsICJiYWQiKQorICAgICAgICBkZWwgc2VsZi5zdGFydAorCisjIEEgVW5pY29kZVRyYW5zbGF0ZUVycm9yIG9iamVjdCB3aXRob3V0IGFuIGVuZCBhdHRyaWJ1dGUKK2NsYXNzIE5vRW5kVW5pY29kZVRyYW5zbGF0ZUVycm9yKFVuaWNvZGVUcmFuc2xhdGVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IuX19pbml0X18oc2VsZiwgIHUiIiwgMCwgMSwgImJhZCIpCisgICAgICAgIGRlbCBzZWxmLmVuZAorCisjIEEgVW5pY29kZVRyYW5zbGF0ZUVycm9yIG9iamVjdCB3aXRob3V0IGFuIG9iamVjdCBhdHRyaWJ1dGUKK2NsYXNzIE5vT2JqZWN0VW5pY29kZVRyYW5zbGF0ZUVycm9yKFVuaWNvZGVUcmFuc2xhdGVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IuX19pbml0X18oc2VsZiwgdSIiLCAwLCAxLCAiYmFkIikKKyAgICAgICAgZGVsIHNlbGYub2JqZWN0CisKK2NsYXNzIENvZGVjQ2FsbGJhY2tUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3htbGNoYXJyZWZyZXBsYWNlKHNlbGYpOgorICAgICAgICAjIHJlcGxhY2UgdW5lbmNvZGFibGUgY2hhcmFjdGVycyB3aGljaCBudW1lcmljIGNoYXJhY3RlciBlbnRpdGllcy4KKyAgICAgICAgIyBGb3IgYXNjaWksIGxhdGluLTEgYW5kIGNoYXJtYXBzIHRoaXMgaXMgY29tcGxldGVseSBpbXBsZW1lbnRlZAorICAgICAgICAjIGluIEMgYW5kIHNob3VsZCBiZSByZWFzb25hYmx5IGZhc3QuCisgICAgICAgIHMgPSB1Ilx1MzBiOVx1MzBkMVx1MzBlMiBceGU0bmQgZWdncyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHMuZW5jb2RlKCJhc2NpaSIsICJ4bWxjaGFycmVmcmVwbGFjZSIpLAorICAgICAgICAgICAgIiYjMTI0NzM7JiMxMjQ5NzsmIzEyNTE0OyAmIzIyODtuZCBlZ2dzIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzLmVuY29kZSgibGF0aW4tMSIsICJ4bWxjaGFycmVmcmVwbGFjZSIpLAorICAgICAgICAgICAgIiYjMTI0NzM7JiMxMjQ5NzsmIzEyNTE0OyBceGU0bmQgZWdncyIKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfeG1sY2hhcm5hbWVyZXBsYWNlKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGltZSB1c2UgYSBuYW1lZCBjaGFyYWN0ZXIgZW50aXR5IGZvciB1bmVuY29kYWJsZQorICAgICAgICAjIGNoYXJhY3RlcnMsIGlmIG9uZSBpcyBhdmFpbGFibGUuCisKKyAgICAgICAgZGVmIHhtbGNoYXJuYW1lcmVwbGFjZShleGMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKKyAgICAgICAgICAgIGwgPSBbXQorICAgICAgICAgICAgZm9yIGMgaW4gZXhjLm9iamVjdFtleGMuc3RhcnQ6ZXhjLmVuZF06CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYlczsiICUgaHRtbGVudGl0eWRlZnMuY29kZXBvaW50Mm5hbWVbb3JkKGMpXSkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKHUiJiMlZDsiICUgb3JkKGMpKQorICAgICAgICAgICAgcmV0dXJuICh1IiIuam9pbihsKSwgZXhjLmVuZCkKKworICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoCisgICAgICAgICAgICAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiLCB4bWxjaGFybmFtZXJlcGxhY2UpCisKKyAgICAgICAgc2luID0gdSJceGFiXHUyMTFjXHhiYiA9IFx1MjMyOVx1MTIzNFx1MjBhY1x1MjMyYSIKKyAgICAgICAgc291dCA9ICImbGFxdW87JnJlYWw7JnJhcXVvOyA9ICZsYW5nOyYjNDY2MDsmZXVybzsmcmFuZzsiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgiYXNjaWkiLCAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiKSwgc291dCkKKyAgICAgICAgc291dCA9ICJceGFiJnJlYWw7XHhiYiA9ICZsYW5nOyYjNDY2MDsmZXVybzsmcmFuZzsiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgibGF0aW4tMSIsICJ0ZXN0LnhtbGNoYXJuYW1lcmVwbGFjZSIpLCBzb3V0KQorICAgICAgICBzb3V0ID0gIlx4YWImcmVhbDtceGJiID0gJmxhbmc7JiM0NjYwO1x4YTQmcmFuZzsiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgiaXNvLTg4NTktMTUiLCAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiKSwgc291dCkKKworICAgIGRlZiB0ZXN0X3VuaW5hbWVyZXBsYWNlKHNlbGYpOgorICAgICAgICAjIFdlJ3JlIHVzaW5nIHRoZSBuYW1lcyBmcm9tIHRoZSB1bmljb2RlIGRhdGFiYXNlIHRoaXMgdGltZSwKKyAgICAgICAgIyBhbmQgd2UncmUgZG9pbmcgInN5bnRheCBoaWdobGlnaHRpbmciIGhlcmUsIGkuZS4gd2UgaW5jbHVkZQorICAgICAgICAjIHRoZSByZXBsYWNlZCB0ZXh0IGluIEFOU0kgZXNjYXBlIHNlcXVlbmNlcy4gRm9yIHRoaXMgaXQgaXMKKyAgICAgICAgIyB1c2VmdWwgdGhhdCB0aGUgZXJyb3IgaGFuZGxlciBpcyBub3QgY2FsbGVkIGZvciBldmVyeSBzaW5nbGUKKyAgICAgICAgIyB1bmVuY29kYWJsZSBjaGFyYWN0ZXIsIGJ1dCBmb3IgYSBjb21wbGV0ZSBzZXF1ZW5jZSBvZgorICAgICAgICAjIHVuZW5jb2RhYmxlIGNoYXJhY3RlcnMsIG90aGVyd2lzZSB3ZSB3b3VsZCBvdXRwdXQgbWFueQorICAgICAgICAjIHVubmVjZXNzYXJ5IGVzY2FwZSBzZXF1ZW5jZXMuCisKKyAgICAgICAgZGVmIHVuaW5hbWVyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICAgICAgbCA9IFtdCisgICAgICAgICAgICBmb3IgYyBpbiBleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXToKKyAgICAgICAgICAgICAgICBsLmFwcGVuZCh1bmljb2RlZGF0YS5uYW1lKGMsIHUiMHgleCIgJSBvcmQoYykpKQorICAgICAgICAgICAgcmV0dXJuICh1IlwwMzNbMW0lc1wwMzNbMG0iICUgdSIsICIuam9pbihsKSwgZXhjLmVuZCkKKworICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoCisgICAgICAgICAgICAidGVzdC51bmluYW1lcmVwbGFjZSIsIHVuaW5hbWVyZXBsYWNlKQorCisgICAgICAgIHNpbiA9IHUiXHhhY1x1MTIzNFx1MjBhY1x1ODAwMCIKKyAgICAgICAgc291dCA9ICJcMDMzWzFtTk9UIFNJR04sIEVUSElPUElDIFNZTExBQkxFIFNFRSwgRVVSTyBTSUdOLCBDSksgVU5JRklFRCBJREVPR1JBUEgtODAwMFwwMzNbMG0iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgiYXNjaWkiLCAidGVzdC51bmluYW1lcmVwbGFjZSIpLCBzb3V0KQorCisgICAgICAgIHNvdXQgPSAiXHhhY1wwMzNbMW1FVEhJT1BJQyBTWUxMQUJMRSBTRUUsIEVVUk8gU0lHTiwgQ0pLIFVOSUZJRUQgSURFT0dSQVBILTgwMDBcMDMzWzBtIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpbi5lbmNvZGUoImxhdGluLTEiLCAidGVzdC51bmluYW1lcmVwbGFjZSIpLCBzb3V0KQorCisgICAgICAgIHNvdXQgPSAiXHhhY1wwMzNbMW1FVEhJT1BJQyBTWUxMQUJMRSBTRUVcMDMzWzBtXHhhNFwwMzNbMW1DSksgVU5JRklFRCBJREVPR1JBUEgtODAwMFwwMzNbMG0iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgiaXNvLTg4NTktMTUiLCAidGVzdC51bmluYW1lcmVwbGFjZSIpLCBzb3V0KQorCisgICAgZGVmIHRlc3RfYmFja3NsYXNoZXNjYXBlKHNlbGYpOgorICAgICAgICAjIERvZXMgdGhlIHNhbWUgYXMgdGhlICJ1bmljb2RlLWVzY2FwZSIgZW5jb2RpbmcsIGJ1dCB3aXRoIGRpZmZlcmVudAorICAgICAgICAjIGJhc2UgZW5jb2RpbmdzLgorICAgICAgICBzaW4gPSB1ImFceGFjXHUxMjM0XHUyMGFjXHU4MDAwIgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+IDB4ZmZmZjoKKyAgICAgICAgICAgIHNpbiArPSB1bmljaHIoc3lzLm1heHVuaWNvZGUpCisgICAgICAgIHNvdXQgPSAiYVxceGFjXFx1MTIzNFxcdTIwYWNcXHU4MDAwIgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+IDB4ZmZmZjoKKyAgICAgICAgICAgIHNvdXQgKz0gIlxcVSUwOHgiICUgc3lzLm1heHVuaWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZW5jb2RlKCJhc2NpaSIsICJiYWNrc2xhc2hyZXBsYWNlIiksIHNvdXQpCisKKyAgICAgICAgc291dCA9ICJhXHhhY1xcdTEyMzRcXHUyMGFjXFx1ODAwMCIKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICBzb3V0ICs9ICJcXFUlMDh4IiAlIHN5cy5tYXh1bmljb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgibGF0aW4tMSIsICJiYWNrc2xhc2hyZXBsYWNlIiksIHNvdXQpCisKKyAgICAgICAgc291dCA9ICJhXHhhY1xcdTEyMzRceGE0XFx1ODAwMCIKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICBzb3V0ICs9ICJcXFUlMDh4IiAlIHN5cy5tYXh1bmljb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2luLmVuY29kZSgiaXNvLTg4NTktMTUiLCAiYmFja3NsYXNocmVwbGFjZSIpLCBzb3V0KQorCisgICAgZGVmIHRlc3RfZGVjb2RpbmdfY2FsbGJhY2tzKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgYSB0ZXN0IGZvciBhIGRlY29kaW5nIGNhbGxiYWNrIGhhbmRsZXIKKyAgICAgICAgIyB0aGF0IGFsbG93cyB0aGUgZGVjb2Rpbmcgb2YgdGhlIGludmFsaWQgc2VxdWVuY2UKKyAgICAgICAgIyAiXHhjMFx4ODAiIGFuZCByZXR1cm5zICJceDAwIiBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXJyb3IuCisgICAgICAgICMgQWxsIG90aGVyIGlsbGVnYWwgc2VxdWVuY2VzIHdpbGwgYmUgaGFuZGxlZCBzdHJpY3RseS4KKyAgICAgICAgZGVmIHJlbGF4ZWR1dGY4KGV4Yyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICAgICAgaWYgZXhjLm9iamVjdFtleGMuc3RhcnQ6ZXhjLnN0YXJ0KzJdID09ICJceGMwXHg4MCI6CisgICAgICAgICAgICAgICAgcmV0dXJuICh1Ilx4MDAiLCBleGMuc3RhcnQrMikgIyByZXRyeSBhZnRlciB0d28gYnl0ZXMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgZXhjCisKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LnJlbGF4ZWR1dGY4IiwgcmVsYXhlZHV0ZjgpCisKKyAgICAgICAgIyBhbGwgdGhlICJceGMwXHg4MCIgd2lsbCBiZSBkZWNvZGVkIHRvICJceDAwIgorICAgICAgICBzaW4gPSAiYVx4MDBiXHhjMFx4ODBjXHhjM1x4YmNceGMwXHg4MFx4YzBceDgwIgorICAgICAgICBzb3V0ID0gdSJhXHgwMGJceDAwY1x4ZmNceDAwXHgwMCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaW4uZGVjb2RlKCJ1dGYtOCIsICJ0ZXN0LnJlbGF4ZWR1dGY4IiksIHNvdXQpCisKKyAgICAgICAgIyAiXHhjMFx4ODEiIGlzIG5vdCB2YWxpZCBhbmQgYSBVbmljb2RlRGVjb2RlRXJyb3Igd2lsbCBiZSByYWlzZWQKKyAgICAgICAgc2luID0gIlx4YzBceDgwXHhjMFx4ODEiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgc2luLmRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgInV0Zi04IiwgInRlc3QucmVsYXhlZHV0ZjgiKQorCisgICAgZGVmIHRlc3RfY2hhcm1hcGVuY29kZShzZWxmKToKKyAgICAgICAgIyBGb3IgY2hhcm1hcCBlbmNvZGluZ3MgdGhlIHJlcGxhY2VtZW50IHN0cmluZyB3aWxsIGJlCisgICAgICAgICMgbWFwcGVkIHRocm91Z2ggdGhlIGVuY29kaW5nIGFnYWluLiBUaGlzIG1lYW5zLCB0aGF0CisgICAgICAgICMgdG8gYmUgYWJsZSB0byB1c2UgZS5nLiB0aGUgInJlcGxhY2UiIGhhbmRsZXIsIHRoZQorICAgICAgICAjIGNoYXJtYXAgaGFzIHRvIGhhdmUgYSBtYXBwaW5nIGZvciAiPyIuCisgICAgICAgIGNoYXJtYXAgPSBkaWN0KFsgKG9yZChjKSwgMipjLnVwcGVyKCkpIGZvciBjIGluICJhYmNkZWZnaCJdKQorICAgICAgICBzaW4gPSB1ImFiYyIKKyAgICAgICAgc291dCA9ICJBQUJCQ0MiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLmNoYXJtYXBfZW5jb2RlKHNpbiwgInN0cmljdCIsIGNoYXJtYXApWzBdLCBzb3V0KQorCisgICAgICAgIHNpbiA9IHUiYWJjQSIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9lbmNvZGUsIHNpbiwgInN0cmljdCIsIGNoYXJtYXApCisKKyAgICAgICAgY2hhcm1hcFtvcmQoIj8iKV0gPSAiWFlaIgorICAgICAgICBzaW4gPSB1ImFiY0RFRiIKKyAgICAgICAgc291dCA9ICJBQUJCQ0NYWVpYWVpYWVoiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLmNoYXJtYXBfZW5jb2RlKHNpbiwgInJlcGxhY2UiLCBjaGFybWFwKVswXSwgc291dCkKKworICAgICAgICBjaGFybWFwW29yZCgiPyIpXSA9IHUiWFlaIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2VuY29kZSwgc2luLCAicmVwbGFjZSIsIGNoYXJtYXApCisKKyAgICAgICAgY2hhcm1hcFtvcmQoIj8iKV0gPSB1IlhZWiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9lbmNvZGUsIHNpbiwgInJlcGxhY2UiLCBjaGFybWFwKQorCisgICAgZGVmIHRlc3RfZGVjb2RldW5pY29kZWludGVybmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwXHgwMCIuZGVjb2RlLAorICAgICAgICAgICAgInVuaWNvZGUtaW50ZXJuYWwiLAorICAgICAgICApCisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gMHhmZmZmOgorICAgICAgICAgICAgZGVmIGhhbmRsZXJfdW5pY29kZWludGVybmFsKGV4Yyk6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBVbmljb2RlRGVjb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImRvbid0IGtub3cgaG93IHRvIGhhbmRsZSAlciIgJSBleGMpCisgICAgICAgICAgICAgICAgcmV0dXJuICh1Ilx4MDEiLCAxKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwXHgwMCIuZGVjb2RlKCJ1bmljb2RlLWludGVybmFsIiwgImlnbm9yZSIpLAorICAgICAgICAgICAgICAgIHUiXHUwMDAwIgorICAgICAgICAgICAgKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwXHgwMCIuZGVjb2RlKCJ1bmljb2RlLWludGVybmFsIiwgInJlcGxhY2UiKSwKKyAgICAgICAgICAgICAgICB1Ilx1MDAwMFx1ZmZmZCIKKyAgICAgICAgICAgICkKKworICAgICAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0Lmh1aSIsIGhhbmRsZXJfdW5pY29kZWludGVybmFsKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDBceDAwXHgwMCIuZGVjb2RlKCJ1bmljb2RlLWludGVybmFsIiwgInRlc3QuaHVpIiksCisgICAgICAgICAgICAgICAgdSJcdTAwMDBcdTAwMDFcdTAwMDAiCisgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja3Moc2VsZik6CisgICAgICAgIGRlZiBoYW5kbGVyMShleGMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBVbmljb2RlRW5jb2RlRXJyb3IpIFwKKyAgICAgICAgICAgICAgIGFuZCBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICAgICAgbCA9IFt1IjwlZD4iICUgb3JkKGV4Yy5vYmplY3RbcG9zXSkgZm9yIHBvcyBpbiB4cmFuZ2UoZXhjLnN0YXJ0LCBleGMuZW5kKV0KKyAgICAgICAgICAgIHJldHVybiAodSJbJXNdIiAlIHUiIi5qb2luKGwpLCBleGMuZW5kKQorCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5oYW5kbGVyMSIsIGhhbmRsZXIxKQorCisgICAgICAgIGRlZiBoYW5kbGVyMihleGMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBVbmljb2RlRGVjb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKKyAgICAgICAgICAgIGwgPSBbdSI8JWQ+IiAlIG9yZChleGMub2JqZWN0W3Bvc10pIGZvciBwb3MgaW4geHJhbmdlKGV4Yy5zdGFydCwgZXhjLmVuZCldCisgICAgICAgICAgICByZXR1cm4gKHUiWyVzXSIgJSB1IiIuam9pbihsKSwgZXhjLmVuZCsxKSAjIHNraXAgb25lIGNoYXJhY3RlcgorCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5oYW5kbGVyMiIsIGhhbmRsZXIyKQorCisgICAgICAgIHMgPSAiXHgwMFx4ODFceDdmXHg4MFx4ZmYiCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHMuZGVjb2RlKCJhc2NpaSIsICJ0ZXN0LmhhbmRsZXIxIiksCisgICAgICAgICAgICB1Ilx4MDBbPDEyOT5dXHg3Zls8MTI4Pl1bPDI1NT5dIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzLmRlY29kZSgiYXNjaWkiLCAidGVzdC5oYW5kbGVyMiIpLAorICAgICAgICAgICAgdSJceDAwWzwxMjk+XVs8MTI4Pl0iCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgIlxcdTMwNDJcdTN4eHgiLmRlY29kZSgidW5pY29kZS1lc2NhcGUiLCAidGVzdC5oYW5kbGVyMSIpLAorICAgICAgICAgICAgdSJcdTMwNDJbPDkyPjwxMTc+PDUxPl14eHgiCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgIlxcdTMwNDJcdTN4eCIuZGVjb2RlKCJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmhhbmRsZXIxIiksCisgICAgICAgICAgICB1Ilx1MzA0Mls8OTI+PDExNz48NTE+XXh4IgorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiYWJjIiwgInRlc3QuaGFuZGxlcjEiLCB7b3JkKCJhIik6IHUieiJ9KVswXSwKKyAgICAgICAgICAgIHUiels8OTg+XVs8OTk+XSIKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1ImdceGZjXHhkZnJrIi5lbmNvZGUoImFzY2lpIiwgInRlc3QuaGFuZGxlcjEiKSwKKyAgICAgICAgICAgIHUiZ1s8MjUyPjwyMjM+XXJrIgorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHUiZ1x4ZmNceGRmIi5lbmNvZGUoImFzY2lpIiwgInRlc3QuaGFuZGxlcjEiKSwKKyAgICAgICAgICAgIHUiZ1s8MjUyPjwyMjM+XSIKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfbG9uZ3N0cmluZ3Moc2VsZik6CisgICAgICAgICMgdGVzdCBsb25nIHN0cmluZ3MgdG8gY2hlY2sgZm9yIG1lbW9yeSBvdmVyZmxvdyBwcm9ibGVtcworICAgICAgICBlcnJvcnMgPSBbICJzdHJpY3QiLCAiaWdub3JlIiwgInJlcGxhY2UiLCAieG1sY2hhcnJlZnJlcGxhY2UiLAorICAgICAgICAgICAgICAgICAgICJiYWNrc2xhc2hyZXBsYWNlIl0KKyAgICAgICAgIyByZWdpc3RlciB0aGUgaGFuZGxlcnMgdW5kZXIgZGlmZmVyZW50IG5hbWVzLAorICAgICAgICAjIHRvIHByZXZlbnQgdGhlIGNvZGVjIGZyb20gcmVjb2duaXppbmcgdGhlIG5hbWUKKyAgICAgICAgZm9yIGVyciBpbiBlcnJvcnM6CisgICAgICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuIiArIGVyciwgY29kZWNzLmxvb2t1cF9lcnJvcihlcnIpKQorICAgICAgICBsID0gMTAwMAorICAgICAgICBlcnJvcnMgKz0gWyAidGVzdC4iICsgZXJyIGZvciBlcnIgaW4gZXJyb3JzIF0KKyAgICAgICAgZm9yIHVuaSBpbiBbIHMqbCBmb3IgcyBpbiAodSJ4IiwgdSJcdTMwNDIiLCB1ImFceGU0IikgXToKKyAgICAgICAgICAgIGZvciBlbmMgaW4gKCJhc2NpaSIsICJsYXRpbi0xIiwgImlzby04ODU5LTEiLCAiaXNvLTg4NTktMTUiLAorICAgICAgICAgICAgICAgICAgICAgICAgInV0Zi04IiwgInV0Zi03IiwgInV0Zi0xNiIsICJ1dGYtMzIiKToKKyAgICAgICAgICAgICAgICBmb3IgZXJyIGluIGVycm9yczoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdW5pLmVuY29kZShlbmMsIGVycikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjaGVja19leGNlcHRpb25vYmplY3RhcmdzKHNlbGYsIGV4Y3R5cGUsIGFyZ3MsIG1zZyk6CisgICAgICAgICMgVGVzdCBVbmljb2RlRXJyb3Igc3ViY2xhc3NlczogY29uc3RydWN0aW9uLCBhdHRyaWJ1dGUgYXNzaWdubWVudCBhbmQgX19zdHJfXyBjb252ZXJzaW9uCisgICAgICAgICMgY2hlY2sgd2l0aCBvbmUgbWlzc2luZyBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV4Y3R5cGUsICphcmdzWzotMV0pCisgICAgICAgICMgY2hlY2sgd2l0aCBvbmUgYXJndW1lbnQgdG9vIG11Y2gKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBleGN0eXBlLCAqKGFyZ3MgKyBbInRvbyBtdWNoIl0pKQorICAgICAgICAjIGNoZWNrIHdpdGggb25lIGFyZ3VtZW50IG9mIHRoZSB3cm9uZyB0eXBlCisgICAgICAgIHdyb25nYXJncyA9IFsgInNwYW0iLCB1ImVnZ3MiLCA0MiwgMS4wLCBOb25lIF0KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihhcmdzKSk6CisgICAgICAgICAgICBmb3Igd3JvbmdhcmcgaW4gd3JvbmdhcmdzOgorICAgICAgICAgICAgICAgIGlmIHR5cGUod3JvbmdhcmcpIGlzIHR5cGUoYXJnc1tpXSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgIyBidWlsZCBhcmd1bWVudCBhcnJheQorICAgICAgICAgICAgICAgIGNhbGxhcmdzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UobGVuKGFyZ3MpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaT09ajoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhcmdzLmFwcGVuZCh3cm9uZ2FyZykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxhcmdzLmFwcGVuZChhcmdzW2ldKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXhjdHlwZSwgKmNhbGxhcmdzKQorCisgICAgICAgICMgY2hlY2sgd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgYW5kIHR5cGUgb2YgYXJndW1lbnRzCisgICAgICAgIGV4YyA9IGV4Y3R5cGUoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGV4YyksIG1zZykKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVlbmNvZGVlcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgWyJhc2NpaSIsIHUiZ1x4ZmNyayIsIDEsIDIsICJvdWNoIl0sCisgICAgICAgICAgICAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyIHUnXFx4ZmMnIGluIHBvc2l0aW9uIDE6IG91Y2giCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgWyJhc2NpaSIsIHUiZ1x4ZmNyayIsIDEsIDQsICJvdWNoIl0sCisgICAgICAgICAgICAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAxLTM6IG91Y2giCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgWyJhc2NpaSIsIHUiXHhmY3giLCAwLCAxLCAib3VjaCJdLAorICAgICAgICAgICAgIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciB1J1xceGZjJyBpbiBwb3NpdGlvbiAwOiBvdWNoIgorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tfZXhjZXB0aW9ub2JqZWN0YXJncygKKyAgICAgICAgICAgIFVuaWNvZGVFbmNvZGVFcnJvciwKKyAgICAgICAgICAgIFsiYXNjaWkiLCB1Ilx1MDEwMHgiLCAwLCAxLCAib3VjaCJdLAorICAgICAgICAgICAgIidhc2NpaScgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlciB1J1xcdTAxMDAnIGluIHBvc2l0aW9uIDA6IG91Y2giCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgWyJhc2NpaSIsIHUiXHVmZmZmeCIsIDAsIDEsICJvdWNoIl0sCisgICAgICAgICAgICAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyIHUnXFx1ZmZmZicgaW4gcG9zaXRpb24gMDogb3VjaCIKKyAgICAgICAgKQorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+IDB4ZmZmZjoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZXhjZXB0aW9ub2JqZWN0YXJncygKKyAgICAgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgWyJhc2NpaSIsIHUiXFUwMDAxMDAwMHgiLCAwLCAxLCAib3VjaCJdLAorICAgICAgICAgICAgICAgICInYXNjaWknIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXIgdSdcXFUwMDAxMDAwMCcgaW4gcG9zaXRpb24gMDogb3VjaCIKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVkZWNvZGVlcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgWyJhc2NpaSIsICJnXHhmY3JrIiwgMSwgMiwgIm91Y2giXSwKKyAgICAgICAgICAgICInYXNjaWknIGNvZGVjIGNhbid0IGRlY29kZSBieXRlIDB4ZmMgaW4gcG9zaXRpb24gMTogb3VjaCIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICBbImFzY2lpIiwgImdceGZjcmsiLCAxLCAzLCAib3VjaCJdLAorICAgICAgICAgICAgIidhc2NpaScgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGVzIGluIHBvc2l0aW9uIDEtMjogb3VjaCIKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfdW5pY29kZXRyYW5zbGF0ZWVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IsCisgICAgICAgICAgICBbdSJnXHhmY3JrIiwgMSwgMiwgIm91Y2giXSwKKyAgICAgICAgICAgICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVyIHUnXFx4ZmMnIGluIHBvc2l0aW9uIDE6IG91Y2giCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgVW5pY29kZVRyYW5zbGF0ZUVycm9yLAorICAgICAgICAgICAgW3UiZ1x1MDEwMHJrIiwgMSwgMiwgIm91Y2giXSwKKyAgICAgICAgICAgICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVyIHUnXFx1MDEwMCcgaW4gcG9zaXRpb24gMTogb3VjaCIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IsCisgICAgICAgICAgICBbdSJnXHVmZmZmcmsiLCAxLCAyLCAib3VjaCJdLAorICAgICAgICAgICAgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXIgdSdcXHVmZmZmJyBpbiBwb3NpdGlvbiAxOiBvdWNoIgorICAgICAgICApCisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gMHhmZmZmOgorICAgICAgICAgICAgc2VsZi5jaGVja19leGNlcHRpb25vYmplY3RhcmdzKAorICAgICAgICAgICAgICAgIFVuaWNvZGVUcmFuc2xhdGVFcnJvciwKKyAgICAgICAgICAgICAgICBbdSJnXFUwMDAxMDAwMHJrIiwgMSwgMiwgIm91Y2giXSwKKyAgICAgICAgICAgICAgICAiY2FuJ3QgdHJhbnNsYXRlIGNoYXJhY3RlciB1J1xcVTAwMDEwMDAwJyBpbiBwb3NpdGlvbiAxOiBvdWNoIgorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrX2V4Y2VwdGlvbm9iamVjdGFyZ3MoCisgICAgICAgICAgICBVbmljb2RlVHJhbnNsYXRlRXJyb3IsCisgICAgICAgICAgICBbdSJnXHhmY3JrIiwgMSwgMywgIm91Y2giXSwKKyAgICAgICAgICAgICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAxLTI6IG91Y2giCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2JhZGFuZGdvb2RzdHJpY3RleGNlcHRpb25zKHNlbGYpOgorICAgICAgICAjICJzdHJpY3QiIGNvbXBsYWlucyBhYm91dCBhIG5vbi1leGNlcHRpb24gcGFzc2VkIGluCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLnN0cmljdF9lcnJvcnMsCisgICAgICAgICAgICA0MgorICAgICAgICApCisgICAgICAgICMgInN0cmljdCIgY29tcGxhaW5zIGFib3V0IHRoZSB3cm9uZyBleGNlcHRpb24gdHlwZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIGNvZGVjcy5zdHJpY3RfZXJyb3JzLAorICAgICAgICAgICAgRXhjZXB0aW9uKCJvdWNoIikKKyAgICAgICAgKQorCisgICAgICAgICMgSWYgdGhlIGNvcnJlY3QgZXhjZXB0aW9uIGlzIHBhc3NlZCBpbiwgInN0cmljdCIgcmFpc2VzIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLnN0cmljdF9lcnJvcnMsCisgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2JhZGFuZGdvb2RpZ25vcmVleGNlcHRpb25zKHNlbGYpOgorICAgICAgICAjICJpZ25vcmUiIGNvbXBsYWlucyBhYm91dCBhIG5vbi1leGNlcHRpb24gcGFzc2VkIGluCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgIGNvZGVjcy5pZ25vcmVfZXJyb3JzLAorICAgICAgICAgICA0MgorICAgICAgICApCisgICAgICAgICMgImlnbm9yZSIgY29tcGxhaW5zIGFib3V0IHRoZSB3cm9uZyBleGNlcHRpb24gdHlwZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICBjb2RlY3MuaWdub3JlX2Vycm9ycywKKyAgICAgICAgICAgVW5pY29kZUVycm9yKCJvdWNoIikKKyAgICAgICAgKQorICAgICAgICAjIElmIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiBpcyBwYXNzZWQgaW4sICJpZ25vcmUiIHJldHVybnMgYW4gZW1wdHkgcmVwbGFjZW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5pZ25vcmVfZXJyb3JzKFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgKHUiIiwgMSkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmlnbm9yZV9lcnJvcnMoVW5pY29kZURlY29kZUVycm9yKCJhc2NpaSIsICJceGZmIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAodSIiLCAxKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuaWdub3JlX2Vycm9ycyhVbmljb2RlVHJhbnNsYXRlRXJyb3IodSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1IiIsIDEpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2JhZGFuZGdvb2RyZXBsYWNlZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgIyAicmVwbGFjZSIgY29tcGxhaW5zIGFib3V0IGEgbm9uLWV4Y2VwdGlvbiBwYXNzZWQgaW4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICA0MgorICAgICAgICApCisgICAgICAgICMgInJlcGxhY2UiIGNvbXBsYWlucyBhYm91dCB0aGUgd3JvbmcgZXhjZXB0aW9uIHR5cGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICBVbmljb2RlRXJyb3IoIm91Y2giKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgQmFkT2JqZWN0VW5pY29kZUVuY29kZUVycm9yKCkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5yZXBsYWNlX2Vycm9ycywKKyAgICAgICAgICAgIEJhZE9iamVjdFVuaWNvZGVEZWNvZGVFcnJvcigpCisgICAgICAgICkKKyAgICAgICAgIyBXaXRoIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbiwgInJlcGxhY2UiIHJldHVybnMgYW4gIj8iIG9yIHUiXHVmZmZkIiByZXBsYWNlbWVudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLnJlcGxhY2VfZXJyb3JzKFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgKHUiPyIsIDEpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5yZXBsYWNlX2Vycm9ycyhVbmljb2RlRGVjb2RlRXJyb3IoImFzY2lpIiwgIlx4ZmYiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1Ilx1ZmZmZCIsIDEpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5yZXBsYWNlX2Vycm9ycyhVbmljb2RlVHJhbnNsYXRlRXJyb3IodSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1Ilx1ZmZmZCIsIDEpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2JhZGFuZGdvb2R4bWxjaGFycmVmcmVwbGFjZWV4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgInhtbGNoYXJyZWZyZXBsYWNlIiBjb21wbGFpbnMgYWJvdXQgYSBub24tZXhjZXB0aW9uIHBhc3NlZCBpbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICBjb2RlY3MueG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICA0MgorICAgICAgICApCisgICAgICAgICMgInhtbGNoYXJyZWZyZXBsYWNlIiBjb21wbGFpbnMgYWJvdXQgdGhlIHdyb25nIGV4Y2VwdGlvbiB0eXBlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICBjb2RlY3MueG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICBVbmljb2RlRXJyb3IoIm91Y2giKQorICAgICAgICApCisgICAgICAgICMgInhtbGNoYXJyZWZyZXBsYWNlIiBjYW4gb25seSBiZSB1c2VkIGZvciBlbmNvZGluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy54bWxjaGFycmVmcmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICBVbmljb2RlRGVjb2RlRXJyb3IoImFzY2lpIiwgIlx4ZmYiLCAwLCAxLCAib3VjaCIpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MueG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgVW5pY29kZVRyYW5zbGF0ZUVycm9yKHUiXHUzMDQyIiwgMCwgMSwgIm91Y2giKQorICAgICAgICApCisgICAgICAgICMgVXNlIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbgorICAgICAgICBjcyA9ICgwLCAxLCA5LCAxMCwgOTksIDEwMCwgOTk5LCAxMDAwLCA5OTk5LCAxMDAwMCwgMHgzMDQyKQorICAgICAgICBzID0gIiIuam9pbih1bmljaHIoYykgZm9yIGMgaW4gY3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MueG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzKAorICAgICAgICAgICAgICAgIFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCBzLCAwLCBsZW4ocyksICJvdWNoIikKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAodSIiLmpvaW4odSImIyVkOyIgJSBvcmQoYykgZm9yIGMgaW4gcyksIGxlbihzKSkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFkYW5kZ29vZGJhY2tzbGFzaHJlcGxhY2VleGNlcHRpb25zKHNlbGYpOgorICAgICAgICAjICJiYWNrc2xhc2hyZXBsYWNlIiBjb21wbGFpbnMgYWJvdXQgYSBub24tZXhjZXB0aW9uIHBhc3NlZCBpbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgIDQyCisgICAgICAgICkKKyAgICAgICAgIyAiYmFja3NsYXNocmVwbGFjZSIgY29tcGxhaW5zIGFib3V0IHRoZSB3cm9uZyBleGNlcHRpb24gdHlwZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICBVbmljb2RlRXJyb3IoIm91Y2giKQorICAgICAgICApCisgICAgICAgICMgImJhY2tzbGFzaHJlcGxhY2UiIGNhbiBvbmx5IGJlIHVzZWQgZm9yIGVuY29kaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgVW5pY29kZURlY29kZUVycm9yKCJhc2NpaSIsICJceGZmIiwgMCwgMSwgIm91Y2giKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgVW5pY29kZVRyYW5zbGF0ZUVycm9yKHUiXHUzMDQyIiwgMCwgMSwgIm91Y2giKQorICAgICAgICApCisgICAgICAgICMgVXNlIHRoZSBjb3JyZWN0IGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmJhY2tzbGFzaHJlcGxhY2VfZXJyb3JzKFVuaWNvZGVFbmNvZGVFcnJvcigiYXNjaWkiLCB1Ilx1MzA0MiIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgKHUiXFx1MzA0MiIsIDEpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyhVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJceDAwIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAodSJcXHgwMCIsIDEpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyhVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJceGZmIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAodSJcXHhmZiIsIDEpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyhVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJcdTAxMDAiLCAwLCAxLCAib3VjaCIpKSwKKyAgICAgICAgICAgICh1IlxcdTAxMDAiLCAxKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMoVW5pY29kZUVuY29kZUVycm9yKCJhc2NpaSIsIHUiXHVmZmZmIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAodSJcXHVmZmZmIiwgMSkKKyAgICAgICAgKQorICAgICAgICBpZiBzeXMubWF4dW5pY29kZT4weGZmZmY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIGNvZGVjcy5iYWNrc2xhc2hyZXBsYWNlX2Vycm9ycyhVbmljb2RlRW5jb2RlRXJyb3IoImFzY2lpIiwgdSJcVTAwMDEwMDAwIiwgMCwgMSwgIm91Y2giKSksCisgICAgICAgICAgICAgICAgKHUiXFxVMDAwMTAwMDAiLCAxKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMoVW5pY29kZUVuY29kZUVycm9yKCJhc2NpaSIsIHUiXFUwMDEwZmZmZiIsIDAsIDEsICJvdWNoIikpLAorICAgICAgICAgICAgICAgICh1IlxcVTAwMTBmZmZmIiwgMSkKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2JhZGhhbmRsZXJyZXN1bHRzKHNlbGYpOgorICAgICAgICByZXN1bHRzID0gKCA0MiwgdSJmb28iLCAoMSwyLDMpLCAodSJmb28iLCAxLCAzKSwgKHUiZm9vIiwgTm9uZSksICh1ImZvbyIsKSwgKCJmb28iLCAxLCAzKSwgKCJmb28iLCBOb25lKSwgKCJmb28iLCkgKQorICAgICAgICBlbmNzID0gKCJhc2NpaSIsICJsYXRpbi0xIiwgImlzby04ODU5LTEiLCAiaXNvLTg4NTktMTUiKQorCisgICAgICAgIGZvciByZXMgaW4gcmVzdWx0czoKKyAgICAgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5iYWRoYW5kbGVyIiwgbGFtYmRhIHg6IHJlcykKKyAgICAgICAgICAgIGZvciBlbmMgaW4gZW5jczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICB1Ilx1MzA0MiIuZW5jb2RlLAorICAgICAgICAgICAgICAgICAgICBlbmMsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0LmJhZGhhbmRsZXIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZm9yIChlbmMsIGJ5dGVzKSBpbiAoCisgICAgICAgICAgICAgICAgKCJhc2NpaSIsICJceGZmIiksCisgICAgICAgICAgICAgICAgKCJ1dGYtOCIsICJceGZmIiksCisgICAgICAgICAgICAgICAgKCJ1dGYtNyIsICIreC0iKSwKKyAgICAgICAgICAgICAgICAoInVuaWNvZGUtaW50ZXJuYWwiLCAiXHgwMCIpLAorICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICBieXRlcy5kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgIGVuYywKKyAgICAgICAgICAgICAgICAgICAgInRlc3QuYmFkaGFuZGxlciIKKyAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9sb29rdXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLnN0cmljdF9lcnJvcnMsIGNvZGVjcy5sb29rdXBfZXJyb3IoInN0cmljdCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5pZ25vcmVfZXJyb3JzLCBjb2RlY3MubG9va3VwX2Vycm9yKCJpZ25vcmUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3Muc3RyaWN0X2Vycm9ycywgY29kZWNzLmxvb2t1cF9lcnJvcigic3RyaWN0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MueG1sY2hhcnJlZnJlcGxhY2VfZXJyb3JzLAorICAgICAgICAgICAgY29kZWNzLmxvb2t1cF9lcnJvcigieG1sY2hhcnJlZnJlcGxhY2UiKQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuYmFja3NsYXNocmVwbGFjZV9lcnJvcnMsCisgICAgICAgICAgICBjb2RlY3MubG9va3VwX2Vycm9yKCJiYWNrc2xhc2hyZXBsYWNlIikKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfdW5lbmNvZGFibGVyZXBsYWNlbWVudChzZWxmKToKKyAgICAgICAgZGVmIHVuZW5jcmVwbChleGMpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICh1Ilx1NDI0MiIsIGV4Yy5lbmQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LnVuZW5jcmVwbGhhbmRsZXIiLCB1bmVuY3JlcGwpCisgICAgICAgIGZvciBlbmMgaW4gKCJhc2NpaSIsICJpc28tODg1OS0xIiwgImlzby04ODU5LTE1Iik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBVbmljb2RlRW5jb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgdSJcdTQyNDIiLmVuY29kZSwKKyAgICAgICAgICAgICAgICBlbmMsCisgICAgICAgICAgICAgICAgInRlc3QudW5lbmNyZXBsaGFuZGxlciIKKyAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2JhZHJlZ2lzdGVyY2FsbChzZWxmKToKKyAgICAgICAgIyBlbmhhbmNlIGNvdmVyYWdlIG9mOgorICAgICAgICAjIE1vZHVsZXMvX2NvZGVjc21vZHVsZS5jOjpyZWdpc3Rlcl9lcnJvcigpCisgICAgICAgICMgUHl0aG9uL2NvZGVjcy5jOjpQeUNvZGVjX1JlZ2lzdGVyRXJyb3IoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5yZWdpc3Rlcl9lcnJvciwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLnJlZ2lzdGVyX2Vycm9yLCAidGVzdC5kdW1teSIsIDQyKQorCisgICAgZGVmIHRlc3RfYmFkbG9va3VwY2FsbChzZWxmKToKKyAgICAgICAgIyBlbmhhbmNlIGNvdmVyYWdlIG9mOgorICAgICAgICAjIE1vZHVsZXMvX2NvZGVjc21vZHVsZS5jOjpsb29rdXBfZXJyb3IoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5sb29rdXBfZXJyb3IpCisKKyAgICBkZWYgdGVzdF91bmtub3duaGFuZGxlcihzZWxmKToKKyAgICAgICAgIyBlbmhhbmNlIGNvdmVyYWdlIG9mOgorICAgICAgICAjIE1vZHVsZXMvX2NvZGVjc21vZHVsZS5jOjpsb29rdXBfZXJyb3IoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgY29kZWNzLmxvb2t1cF9lcnJvciwgInRlc3QudW5rbm93biIpCisKKyAgICBkZWYgdGVzdF94bWxjaGFycmVmdmFsdWVzKHNlbGYpOgorICAgICAgICAjIGVuaGFuY2UgY292ZXJhZ2Ugb2Y6CisgICAgICAgICMgUHl0aG9uL2NvZGVjcy5jOjpQeUNvZGVjX1hNTENoYXJSZWZSZXBsYWNlRXJyb3JzKCkKKyAgICAgICAgIyBhbmQgaW5saW5lIGltcGxlbWVudGF0aW9ucworICAgICAgICB2ID0gKDEsIDUsIDEwLCA1MCwgMTAwLCA1MDAsIDEwMDAsIDUwMDAsIDEwMDAwLCA1MDAwMCkKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGU+PTEwMDAwMDoKKyAgICAgICAgICAgIHYgKz0gKDEwMDAwMCwgNTAwMDAwLCAxMDAwMDAwKQorICAgICAgICBzID0gdSIiLmpvaW4oW3VuaWNocih4KSBmb3IgeCBpbiB2XSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LnhtbGNoYXJyZWZyZXBsYWNlIiwgY29kZWNzLnhtbGNoYXJyZWZyZXBsYWNlX2Vycm9ycykKKyAgICAgICAgZm9yIGVuYyBpbiAoImFzY2lpIiwgImlzby04ODU5LTE1Iik6CisgICAgICAgICAgICBmb3IgZXJyIGluICgieG1sY2hhcnJlZnJlcGxhY2UiLCAidGVzdC54bWxjaGFycmVmcmVwbGFjZSIpOgorICAgICAgICAgICAgICAgIHMuZW5jb2RlKGVuYywgZXJyKQorCisgICAgZGVmIHRlc3RfZGVjb2RlaGVscGVyKHNlbGYpOgorICAgICAgICAjIGVuaGFuY2UgY292ZXJhZ2Ugb2Y6CisgICAgICAgICMgT2JqZWN0cy91bmljb2Rlb2JqZWN0LmM6OnVuaWNvZGVfZGVjb2RlX2NhbGxfZXJyb3JoYW5kbGVyKCkKKyAgICAgICAgIyBhbmQgY2FsbGVycworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgIlx4ZmYiLmRlY29kZSwgImFzY2lpIiwgInRlc3QudW5rbm93biIpCisKKyAgICAgICAgZGVmIGJhZGRlY29kZXJldHVybjEoZXhjKToKKyAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuYmFkZGVjb2RlcmV0dXJuMSIsIGJhZGRlY29kZXJldHVybjEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgIlx4ZmYiLmRlY29kZSwgImFzY2lpIiwgInRlc3QuYmFkZGVjb2RlcmV0dXJuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgIlxcIi5kZWNvZGUsICJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmJhZGRlY29kZXJldHVybjEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsICJcXHgwIi5kZWNvZGUsICJ1bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmJhZGRlY29kZXJldHVybjEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsICJcXHgweSIuZGVjb2RlLCAidW5pY29kZS1lc2NhcGUiLCAidGVzdC5iYWRkZWNvZGVyZXR1cm4xIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAiXFxVZmZmZmVlZWUiLmRlY29kZSwgInVuaWNvZGUtZXNjYXBlIiwgInRlc3QuYmFkZGVjb2RlcmV0dXJuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgIlxcdXl5eXkiLmRlY29kZSwgInJhdy11bmljb2RlLWVzY2FwZSIsICJ0ZXN0LmJhZGRlY29kZXJldHVybjEiKQorCisgICAgICAgIGRlZiBiYWRkZWNvZGVyZXR1cm4yKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUiPyIsIE5vbmUpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5iYWRkZWNvZGVyZXR1cm4yIiwgYmFkZGVjb2RlcmV0dXJuMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAiXHhmZiIuZGVjb2RlLCAiYXNjaWkiLCAidGVzdC5iYWRkZWNvZGVyZXR1cm4yIikKKworICAgICAgICBoYW5kbGVyID0gUG9zUmV0dXJuKCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LnBvc3JldHVybiIsIGhhbmRsZXIuaGFuZGxlKQorCisgICAgICAgICMgVmFsaWQgbmVnYXRpdmUgcG9zaXRpb24KKyAgICAgICAgaGFuZGxlci5wb3MgPSAtMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJceGZmMCIuZGVjb2RlKCJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpLCB1Ijw/PjAiKQorCisgICAgICAgICMgVmFsaWQgbmVnYXRpdmUgcG9zaXRpb24KKyAgICAgICAgaGFuZGxlci5wb3MgPSAtMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJceGZmMCIuZGVjb2RlKCJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpLCB1Ijw/Pjw/PiIpCisKKyAgICAgICAgIyBOZWdhdGl2ZSBwb3NpdGlvbiBvdXQgb2YgYm91bmRzCisgICAgICAgIGhhbmRsZXIucG9zID0gLTMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgIlx4ZmYwIi5kZWNvZGUsICJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpCisKKyAgICAgICAgIyBWYWxpZCBwb3NpdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXHhmZjAiLmRlY29kZSgiYXNjaWkiLCAidGVzdC5wb3NyZXR1cm4iKSwgdSI8Pz4wIikKKworICAgICAgICAjIExhcmdlc3QgdmFsaWQgcG9zaXRpdmUgcG9zaXRpb24gKG9uZSBiZXlvbmQgZW5kIG9mIGlucHV0KQorICAgICAgICBoYW5kbGVyLnBvcyA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXHhmZjAiLmRlY29kZSgiYXNjaWkiLCAidGVzdC5wb3NyZXR1cm4iKSwgdSI8Pz4iKQorCisgICAgICAgICMgSW52YWxpZCBwb3NpdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgIlx4ZmYwIi5kZWNvZGUsICJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpCisKKyAgICAgICAgIyBSZXN0YXJ0IGF0IHRoZSAiMCIKKyAgICAgICAgaGFuZGxlci5wb3MgPSA2CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlxcdXl5eXkwIi5kZWNvZGUoInJhdy11bmljb2RlLWVzY2FwZSIsICJ0ZXN0LnBvc3JldHVybiIpLCB1Ijw/PjAiKQorCisgICAgICAgIGNsYXNzIEQoZGljdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHhmZiIsICJzdHJpY3QiLCB7MHhmZjogTm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4ZmYiLCAic3RyaWN0IiwgRCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4ZmYiLCAic3RyaWN0IiwgezB4ZmY6IDB4MTEwMDAwfSkKKworICAgIGRlZiB0ZXN0X2VuY29kZWhlbHBlcihzZWxmKToKKyAgICAgICAgIyBlbmhhbmNlIGNvdmVyYWdlIG9mOgorICAgICAgICAjIE9iamVjdHMvdW5pY29kZW9iamVjdC5jOjp1bmljb2RlX2VuY29kZV9jYWxsX2Vycm9yaGFuZGxlcigpCisgICAgICAgICMgYW5kIGNhbGxlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTG9va3VwRXJyb3IsIHUiXHhmZiIuZW5jb2RlLCAiYXNjaWkiLCAidGVzdC51bmtub3duIikKKworICAgICAgICBkZWYgYmFkZW5jb2RlcmV0dXJuMShleGMpOgorICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5iYWRlbmNvZGVyZXR1cm4xIiwgYmFkZW5jb2RlcmV0dXJuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1Ilx4ZmYiLmVuY29kZSwgImFzY2lpIiwgInRlc3QuYmFkZW5jb2RlcmV0dXJuMSIpCisKKyAgICAgICAgZGVmIGJhZGVuY29kZXJldHVybjIoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSI/IiwgTm9uZSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmJhZGVuY29kZXJldHVybjIiLCBiYWRlbmNvZGVyZXR1cm4yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiXHhmZiIuZW5jb2RlLCAiYXNjaWkiLCAidGVzdC5iYWRlbmNvZGVyZXR1cm4yIikKKworICAgICAgICBoYW5kbGVyID0gUG9zUmV0dXJuKCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LnBvc3JldHVybiIsIGhhbmRsZXIuaGFuZGxlKQorCisgICAgICAgICMgVmFsaWQgbmVnYXRpdmUgcG9zaXRpb24KKyAgICAgICAgaGFuZGxlci5wb3MgPSAtMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXHhmZjAiLmVuY29kZSgiYXNjaWkiLCAidGVzdC5wb3NyZXR1cm4iKSwgIjw/PjAiKQorCisgICAgICAgICMgVmFsaWQgbmVnYXRpdmUgcG9zaXRpb24KKyAgICAgICAgaGFuZGxlci5wb3MgPSAtMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXHhmZjAiLmVuY29kZSgiYXNjaWkiLCAidGVzdC5wb3NyZXR1cm4iKSwgIjw/Pjw/PiIpCisKKyAgICAgICAgIyBOZWdhdGl2ZSBwb3NpdGlvbiBvdXQgb2YgYm91bmRzCisgICAgICAgIGhhbmRsZXIucG9zID0gLTMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdSJceGZmMCIuZW5jb2RlLCAiYXNjaWkiLCAidGVzdC5wb3NyZXR1cm4iKQorCisgICAgICAgICMgVmFsaWQgcG9zaXRpdmUgcG9zaXRpb24KKyAgICAgICAgaGFuZGxlci5wb3MgPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJceGZmMCIuZW5jb2RlKCJhc2NpaSIsICJ0ZXN0LnBvc3JldHVybiIpLCAiPD8+MCIpCisKKyAgICAgICAgIyBMYXJnZXN0IHZhbGlkIHBvc2l0aXZlIHBvc2l0aW9uIChvbmUgYmV5b25kIGVuZCBvZiBpbnB1dAorICAgICAgICBoYW5kbGVyLnBvcyA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ilx4ZmYwIi5lbmNvZGUoImFzY2lpIiwgInRlc3QucG9zcmV0dXJuIiksICI8Pz4iKQorCisgICAgICAgICMgSW52YWxpZCBwb3NpdGl2ZSBwb3NpdGlvbgorICAgICAgICBoYW5kbGVyLnBvcyA9IDMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdSJceGZmMCIuZW5jb2RlLCAiYXNjaWkiLCAidGVzdC5wb3NyZXR1cm4iKQorCisgICAgICAgIGhhbmRsZXIucG9zID0gMAorCisgICAgICAgIGNsYXNzIEQoZGljdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgIGZvciBlcnIgaW4gKCJzdHJpY3QiLCAicmVwbGFjZSIsICJ4bWxjaGFycmVmcmVwbGFjZSIsICJiYWNrc2xhc2hyZXBsYWNlIiwgInRlc3QucG9zcmV0dXJuIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIGNvZGVjcy5jaGFybWFwX2VuY29kZSwgdSJceGZmIiwgZXJyLCB7MHhmZjogTm9uZX0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9lbmNvZGUsIHUiXHhmZiIsIGVyciwgRCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuY2hhcm1hcF9lbmNvZGUsIHUiXHhmZiIsIGVyciwgezB4ZmY6IDMwMH0pCisKKyAgICBkZWYgdGVzdF90cmFuc2xhdGVoZWxwZXIoc2VsZik6CisgICAgICAgICMgZW5oYW5jZSBjb3ZlcmFnZSBvZjoKKyAgICAgICAgIyBPYmplY3RzL3VuaWNvZGVvYmplY3QuYzo6dW5pY29kZV9lbmNvZGVfY2FsbF9lcnJvcmhhbmRsZXIoKQorICAgICAgICAjIGFuZCBjYWxsZXJzCisgICAgICAgICMgKFVuZm9ydHVuYXRlbHkgdGhlIGVycm9ycyBhcmd1bWVudCBpcyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZQorICAgICAgICAjIGZyb20gUHl0aG9uLCBzbyB3ZSBjYW4ndCB0ZXN0IHRoYXQgbXVjaCkKKyAgICAgICAgY2xhc3MgRChkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJceGZmIi50cmFuc2xhdGUsIEQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1Ilx4ZmYiLnRyYW5zbGF0ZSwgezB4ZmY6IHN5cy5tYXh1bmljb2RlKzF9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiXHhmZiIudHJhbnNsYXRlLCB7MHhmZjogKCl9KQorCisgICAgZGVmIHRlc3RfYnVnODI4NzM3KHNlbGYpOgorICAgICAgICBjaGFybWFwID0geworICAgICAgICAgICAgb3JkKCImIik6IHUiJmFtcDsiLAorICAgICAgICAgICAgb3JkKCI8Iik6IHUiJmx0OyIsCisgICAgICAgICAgICBvcmQoIj4iKTogdSImZ3Q7IiwKKyAgICAgICAgICAgIG9yZCgnIicpOiB1IiZxdW90OyIsCisgICAgICAgIH0KKworICAgICAgICBmb3IgbiBpbiAoMSwgMTAsIDEwMCwgMTAwMCk6CisgICAgICAgICAgICB0ZXh0ID0gdSdhYmM8ZGVmPmdoaScqbgorICAgICAgICAgICAgdGV4dC50cmFuc2xhdGUoY2hhcm1hcCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb2RlY0NhbGxiYWNrVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODk3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNjYWxsYmFja3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViODk3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2NhbGxiYWNrcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTVlOGRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKQEAgLTAsMCArMSw4NiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNlbmNvZGluZ3NfY24ucHkKKyMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgUFJDIGVuY29kaW5ncy4KKyMKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVGVzdF9HQjIzMTIodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZ2IyMzEyJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdnYjIzMTInKQorICAgIGNvZGVjdGVzdHMgPSAoCisgICAgICAgICMgaW52YWxpZCBieXRlcworICAgICAgICAoImFiY1x4ODFceDgxXHhjMVx4YzQiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4YzgiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4ODFceDgxXHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhIiksCisgICAgICAgICgiYWJjXHg4MVx4ODFceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhXHVmZmZkIiksCisgICAgICAgICgiYWJjXHg4MVx4ODFceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTgwNGEiKSwKKyAgICAgICAgKCJceGMxXHg2NCIsICJzdHJpY3QiLCBOb25lKSwKKyAgICApCisKK2NsYXNzIFRlc3RfR0JLKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2diaycKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnZ2JrJykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ODA0YSIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1ODA0YVx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHU4MDRhIiksCisgICAgICAgICgiXHg4M1x4MzRceDgzXHgzMSIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKHUiXHUzMGZiIiwgInN0cmljdCIsIE5vbmUpLAorICAgICkKKworY2xhc3MgVGVzdF9HQjE4MDMwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2diMTgwMzAnCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2diMTgwMzAnKQorICAgIGNvZGVjdGVzdHMgPSAoCisgICAgICAgICMgaW52YWxpZCBieXRlcworICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4YzgiLCAic3RyaWN0IiwgIE5vbmUpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhIiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNFx4YzgiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhXHVmZmZkIiksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJpZ25vcmUiLCAgdSJhYmNcdTgwNGEiKSwKKyAgICAgICAgKCJhYmNceDg0XHgzOVx4ODRceDM5XHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU4MDRhIiksCisgICAgICAgICh1Ilx1MzBmYiIsICJzdHJpY3QiLCAiXHg4MTlceGE3OSIpLAorICAgICkKKyAgICBoYXNfaXNvMTA2NDYgPSBUcnVlCisKK2NsYXNzIFRlc3RfSFoodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnaHonCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2h6JykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIHRlc3QgJ35cbicgKDMgbGluZXMpCisgICAgICAgIChiJ1RoaXMgc2VudGVuY2UgaXMgaW4gQVNDSUkuXG4nCisgICAgICAgICBiJ1RoZSBuZXh0IHNlbnRlbmNlIGlzIGluIEdCLn57PDpLeTI7U3sjLH59flxuJworICAgICAgICAgYid+e05wSilsNkhLISN+fUJ5ZS5cbicsCisgICAgICAgICAnc3RyaWN0JywKKyAgICAgICAgIHUnVGhpcyBzZW50ZW5jZSBpcyBpbiBBU0NJSS5cbicKKyAgICAgICAgIHUnVGhlIG5leHQgc2VudGVuY2UgaXMgaW4gR0IuJworICAgICAgICAgdSdcdTVkZjFcdTYyNDBcdTRlMGRcdTZiMzJcdWZmMGNcdTUyZmZcdTY1YmRcdTY1YmNcdTRlYmFcdTMwMDInCisgICAgICAgICB1J0J5ZS5cbicpLAorICAgICAgICAjIHRlc3QgJ35cbicgKDQgbGluZXMpCisgICAgICAgIChiJ1RoaXMgc2VudGVuY2UgaXMgaW4gQVNDSUkuXG4nCisgICAgICAgICBiJ1RoZSBuZXh0IHNlbnRlbmNlIGlzIGluIEdCLn5cbicKKyAgICAgICAgIGInfns8Okt5MjtTeyMsTnBKKWw2SEshI359flxuJworICAgICAgICAgYidCeWUuXG4nLAorICAgICAgICAgJ3N0cmljdCcsCisgICAgICAgICB1J1RoaXMgc2VudGVuY2UgaXMgaW4gQVNDSUkuXG4nCisgICAgICAgICB1J1RoZSBuZXh0IHNlbnRlbmNlIGlzIGluIEdCLicKKyAgICAgICAgIHUnXHU1ZGYxXHU2MjQwXHU0ZTBkXHU2YjMyXHVmZjBjXHU1MmZmXHU2NWJkXHU2NWJjXHU0ZWJhXHUzMDAyJworICAgICAgICAgdSdCeWUuXG4nKSwKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgIChiJ2FifmNkJywgJ3JlcGxhY2UnLCB1J2FiXHVGRkZEZCcpLAorICAgICAgICAoYidhYlx4ZmZjZCcsICdyZXBsYWNlJywgdSdhYlx1RkZGRGNkJyksCisgICAgICAgIChiJ2FifntceDgxXHg4MVx4NDFceDQ0fn1jZCcsICdyZXBsYWNlJywgdSdhYlx1RkZGRFx1RkZGRFx1ODA0QWNkJyksCisgICAgKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmJhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfY24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NmJhN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19jbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19oay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWMyNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKQEAgLTAsMCArMSwyNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNlbmNvZGluZ3NfaGsucHkKKyMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSG9uZ0tvbmcgZW5jb2RpbmdzLgorIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0X0JpZzVIS1NDUyh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdiaWc1aGtzY3MnCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2JpZzVoa3NjcycpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhjOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdThiMTAiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0XHhjOCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdThiMTBcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgImlnbm9yZSIsICB1ImFiY1x1OGIxMCIpLAorICAgICkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM0Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2hrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM0Y2NmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfaGsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMWQyYWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSVNPIDIwMjIgZW5jb2RpbmdzLgorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitDT01NT05fQ09ERUNfVEVTVFMgPSAoCisgICAgICAgICMgaW52YWxpZCBieXRlcworICAgICAgICAoYidhYlx4RkZjZCcsICdyZXBsYWNlJywgdSdhYlx1RkZGRGNkJyksCisgICAgICAgIChiJ2FiXHgxQmRlZicsICdyZXBsYWNlJywgdSdhYlx4MUJkZWYnKSwKKyAgICAgICAgKGInYWJceDFCJGRlZicsICdyZXBsYWNlJywgdSdhYlx1RkZGRCcpLAorICAgICkKKworY2xhc3MgVGVzdF9JU08yMDIyX0pQKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2lzbzIwMjJfanAnCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2lzbzIwMjJfanAnKQorICAgIGNvZGVjdGVzdHMgPSBDT01NT05fQ09ERUNfVEVTVFMgKyAoCisgICAgICAgIChiJ2FiXHgxQk5kZWYnLCAncmVwbGFjZScsIHUnYWJceDFCTmRlZicpLAorICAgICkKKworY2xhc3MgVGVzdF9JU08yMDIyX0pQMih0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdpc28yMDIyX2pwXzInCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2lzbzIwMjJfanAnKQorICAgIGNvZGVjdGVzdHMgPSBDT01NT05fQ09ERUNfVEVTVFMgKyAoCisgICAgICAgIChiJ2FiXHgxQk5kZWYnLCAncmVwbGFjZScsIHUnYWJkZWYnKSwKKyAgICApCisKK2NsYXNzIFRlc3RfSVNPMjAyMl9LUih0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdpc28yMDIyX2tyJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdpc28yMDIyX2tyJykKKyAgICBjb2RlY3Rlc3RzID0gQ09NTU9OX0NPREVDX1RFU1RTICsgKAorICAgICAgICAoYidhYlx4MUJOZGVmJywgJ3JlcGxhY2UnLCB1J2FiXHgxQk5kZWYnKSwKKyAgICApCisKKyAgICAjIGlzbzIwMjJfa3IudHh0IGNhbm5vdCBiZSB1c2VkIHRvIHRlc3QgImNodW5rIGNvZGluZyI6IHRoZSBlc2NhcGUKKyAgICAjIHNlcXVlbmNlIGlzIG9ubHkgd3JpdHRlbiBvbiB0aGUgZmlyc3QgbGluZQorICAgIGRlZiB0ZXN0X2NodW5rY29kaW5nKHNlbGYpOgorICAgICAgICBwYXNzCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTBhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2lzbzIwMjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTBhZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19pc28yMDIyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmODFmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weQpAQCAtMCwwICsxLDEwNSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNlbmNvZGluZ3NfanAucHkKKyMgICBDb2RlYyBlbmNvZGluZyB0ZXN0cyBmb3IgSmFwYW5lc2UgZW5jb2RpbmdzLgorIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0X0NQOTMyKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2NwOTMyJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdzaGlmdF9qaXMnKQorICAgIGNvZGVjdGVzdHMgPSAoCisgICAgICAgICMgaW52YWxpZCBieXRlcworICAgICAgICAoImFiY1x4ODFceDAwXHg4MVx4MDBceDgyXHg4NCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhmOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MVx4MDBceDgyXHg4NCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWZmNDQiKSwKKyAgICAgICAgKCJhYmNceDgxXHgwMFx4ODJceDg0XHg4OCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWZmNDRcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgxXHgwMFx4ODJceDg0IiwgImlnbm9yZSIsICB1ImFiY1x1ZmY0NCIpLAorICAgICAgICAjIHNqaXMgdnMgY3A5MzIKKyAgICAgICAgKCJcXFx4N2UiLCAicmVwbGFjZSIsIHUiXFxceDdlIiksCisgICAgICAgICgiXHg4MVx4NWZceDgxXHg2MVx4ODFceDdjIiwgInJlcGxhY2UiLCB1Ilx1ZmYzY1x1MjIyNVx1ZmYwZCIpLAorICAgICkKKworY2xhc3MgVGVzdF9FVUNfSklTWDAyMTModGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2V1Y19qaXN4MDIxMycKKyAgICB0c3RyaW5nID0gdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LmxvYWRfdGVzdHN0cmluZygnZXVjX2ppc3gwMjEzJykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Nzk1NiIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1Nzk1Nlx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHU3OTU2IiksCisgICAgICAgICgiYWJjXHg4Zlx4ODNceDgzIiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZCIpLAorICAgICAgICAoIlx4YzFceDY0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTFceGMwIiwgInN0cmljdCIsIHUiXHVmZjNjIiksCisgICAgKQorICAgIHhtbGNoYXJuYW1ldGVzdCA9ICgKKyAgICAgICAgdSJceGFiXHUyMTFjXHhiYiA9IFx1MjMyOVx1MTIzNFx1MjMyYSIsCisgICAgICAgICJceGE5XHhhOCZyZWFsO1x4YTlceGIyID0gJmxhbmc7JiM0NjYwOyZyYW5nOyIKKyAgICApCisKK2V1Y2pwX2NvbW1vbnRlc3RzID0gKAorICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHU3OTU2IiksCisgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0XHhjOCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdTc5NTZcdWZmZmQiKSwKKyAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHU3OTU2IiksCisgICAgKCJhYmNceDhmXHg4M1x4ODMiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkIiksCisgICAgKCJceGMxXHg2NCIsICJzdHJpY3QiLCBOb25lKSwKKykKKworY2xhc3MgVGVzdF9FVUNfSlBfQ09NUEFUKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnZXVjX2pwJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdldWNfanAnKQorICAgIGNvZGVjdGVzdHMgPSBldWNqcF9jb21tb250ZXN0cyArICgKKyAgICAgICAgKCJceGExXHhjMFxcIiwgInN0cmljdCIsIHUiXHVmZjNjXFwiKSwKKyAgICAgICAgKHUiXHhhNSIsICJzdHJpY3QiLCAiXHg1YyIpLAorICAgICAgICAodSJcdTIwM2UiLCAic3RyaWN0IiwgIlx4N2UiKSwKKyAgICApCisKK3NoaWZ0amlzX2NvbW1vbmVuY3Rlc3RzID0gKAorICAgICgiYWJjXHg4MFx4ODBceDgyXHg4NCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgKCJhYmNceGY4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAoImFiY1x4ODBceDgwXHg4Mlx4ODQiLCAicmVwbGFjZSIsIHUiYWJjXHVmZmZkXHVmZjQ0IiksCisgICAgKCJhYmNceDgwXHg4MFx4ODJceDg0XHg4OCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWZmNDRcdWZmZmQiKSwKKyAgICAoImFiY1x4ODBceDgwXHg4Mlx4ODRkZWYiLCAiaWdub3JlIiwgIHUiYWJjXHVmZjQ0ZGVmIiksCispCisKK2NsYXNzIFRlc3RfU0pJU19DT01QQVQodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnc2hpZnRfamlzJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdzaGlmdF9qaXMnKQorICAgIGNvZGVjdGVzdHMgPSBzaGlmdGppc19jb21tb25lbmN0ZXN0cyArICgKKyAgICAgICAgKCJcXFx4N2UiLCAic3RyaWN0IiwgdSJcXFx4N2UiKSwKKyAgICAgICAgKCJceDgxXHg1Zlx4ODFceDYxXHg4MVx4N2MiLCAic3RyaWN0IiwgdSJcdWZmM2NcdTIwMTZcdTIyMTIiKSwKKyAgICApCisKK2NsYXNzIFRlc3RfU0pJU1gwMjEzKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ3NoaWZ0X2ppc3gwMjEzJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdzaGlmdF9qaXN4MDIxMycpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MFx4ODBceDgyXHg4NCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhmOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MFx4ODBceDgyXHg4NCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWZmNDQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4ODJceDg0XHg4OCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWZmNDRcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4ODJceDg0ZGVmIiwgImlnbm9yZSIsICB1ImFiY1x1ZmY0NGRlZiIpLAorICAgICAgICAjIHNqaXMgdnMgY3A5MzIKKyAgICAgICAgKCJcXFx4N2UiLCAicmVwbGFjZSIsIHUiXHhhNVx1MjAzZSIpLAorICAgICAgICAoIlx4ODFceDVmXHg4MVx4NjFceDgxXHg3YyIsICJyZXBsYWNlIiwgdSJceDVjXHUyMDE2XHUyMjEyIiksCisgICAgKQorICAgIHhtbGNoYXJuYW1ldGVzdCA9ICgKKyAgICAgICAgdSJceGFiXHUyMTFjXHhiYiA9IFx1MjMyOVx1MTIzNFx1MjMyYSIsCisgICAgICAgICJceDg1RyZyZWFsO1x4ODVRID0gJmxhbmc7JiM0NjYwOyZyYW5nOyIKKyAgICApCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwNWQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19qcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwNWQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2pwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjODY2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQpAQCAtMCwwICsxLDY5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9jb2RlY2VuY29kaW5nc19rci5weQorIyAgIENvZGVjIGVuY29kaW5nIHRlc3RzIGZvciBST0sgZW5jb2RpbmdzLgorIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0X0NQOTQ5KHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2NwOTQ5JworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdjcDk0OScpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhjOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWM4OTQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0XHhjOCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWM4OTRcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgImlnbm9yZSIsICB1ImFiY1x1Yzg5NCIpLAorICAgICkKKworY2xhc3MgVGVzdF9FVUNLUih0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdldWNfa3InCisgICAgdHN0cmluZyA9IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5sb2FkX3Rlc3RzdHJpbmcoJ2V1Y19rcicpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhjOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWM4OTQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0XHhjOCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWM4OTRcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgImlnbm9yZSIsICB1ImFiY1x1Yzg5NCIpLAorCisgICAgICAgICMgY29tcG9zZWQgbWFrZS11cCBzZXF1ZW5jZSBlcnJvcnMKKyAgICAgICAgKCJceGE0XHhkNCIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKCJceGE0XHhkNFx4YTQiLCAic3RyaWN0IiwgTm9uZSksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhiNiIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKCJceGE0XHhkNFx4YTRceGI2XHhhNCIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKCJceGE0XHhkNFx4YTRceGI2XHhhNFx4ZDAiLCAic3RyaWN0IiwgTm9uZSksCisgICAgICAgICgiXHhhNFx4ZDRceGE0XHhiNlx4YTRceGQwXHhhNCIsICJzdHJpY3QiLCBOb25lKSwKKyAgICAgICAgKCJceGE0XHhkNFx4YTRceGI2XHhhNFx4ZDBceGE0XHhkNCIsICJzdHJpY3QiLCB1Ilx1YzRkNCIpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGE0XHhkMFx4YTRceGQ0eCIsICJzdHJpY3QiLCB1Ilx1YzRkNHgiKSwKKyAgICAgICAgKCJhXHhhNFx4ZDRceGE0XHhiNlx4YTQiLCAicmVwbGFjZSIsIHUiYVx1ZmZmZCIpLAorICAgICAgICAoIlx4YTRceGQ0XHhhM1x4YjZceGE0XHhkMFx4YTRceGQ0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGEzXHhkMFx4YTRceGQ0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGE0XHhkMFx4YTNceGQ0IiwgInN0cmljdCIsIE5vbmUpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4ZmZceGE0XHhkMFx4YTRceGQ0IiwgInJlcGxhY2UiLCB1Ilx1ZmZmZCIpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGE0XHhmZlx4YTRceGQ0IiwgInJlcGxhY2UiLCB1Ilx1ZmZmZCIpLAorICAgICAgICAoIlx4YTRceGQ0XHhhNFx4YjZceGE0XHhkMFx4YTRceGZmIiwgInJlcGxhY2UiLCB1Ilx1ZmZmZCIpLAorICAgICAgICAoIlx4YzFceGM0IiwgInN0cmljdCIsIHUiXHVjODk0IiksCisgICAgKQorCitjbGFzcyBUZXN0X0pPSEFCKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2pvaGFiJworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdqb2hhYicpCisgICAgY29kZWN0ZXN0cyA9ICgKKyAgICAgICAgIyBpbnZhbGlkIGJ5dGVzCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHhjOCIsICJzdHJpY3QiLCAgTm9uZSksCisgICAgICAgICgiYWJjXHg4MFx4ODBceGMxXHhjNCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWNkMjciKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0XHhjOCIsICJyZXBsYWNlIiwgdSJhYmNcdWZmZmRcdWNkMjdcdWZmZmQiKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgImlnbm9yZSIsICB1ImFiY1x1Y2QyNyIpLAorICAgICkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWYzMDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX2tyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWYzMDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3Nfa3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzZDA2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CkBAIC0wLDAgKzEsMjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyB0ZXN0X2NvZGVjZW5jb2RpbmdzX3R3LnB5CisjICAgQ29kZWMgZW5jb2RpbmcgdGVzdHMgZm9yIFJPQyBlbmNvZGluZ3MuCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RfQmlnNSh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdiaWc1JworICAgIHRzdHJpbmcgPSB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQubG9hZF90ZXN0c3RyaW5nKCdiaWc1JykKKyAgICBjb2RlY3Rlc3RzID0gKAorICAgICAgICAjIGludmFsaWQgYnl0ZXMKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceGM4IiwgInN0cmljdCIsICBOb25lKSwKKyAgICAgICAgKCJhYmNceDgwXHg4MFx4YzFceGM0IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1OGIxMCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzRceGM4IiwgInJlcGxhY2UiLCB1ImFiY1x1ZmZmZFx1OGIxMFx1ZmZmZCIpLAorICAgICAgICAoImFiY1x4ODBceDgwXHhjMVx4YzQiLCAiaWdub3JlIiwgIHUiYWJjXHU4YjEwIiksCisgICAgKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjcwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNlbmNvZGluZ3NfdHcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjcwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY2VuY29kaW5nc190dy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2NuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NGZjNTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHkKQEAgLTAsMCArMSwzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNtYXBzX2NuLnB5CisjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUFJDIGVuY29kaW5ncworIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0R0IyMzEyTWFwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZV9NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdnYjIzMTInCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vcGVvcGxlLmZyZWVic2Qub3JnL35wZXJreS9pMThuL0VVQy1DTi5UWFQnCisKK2NsYXNzIFRlc3RHQktNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2diaycKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL1ZFTkRPUlMvJyBcCisgICAgICAgICAgICAgICAgICdNSUNTRlQvV0lORE9XUy9DUDkzNi5UWFQnCisKK2NsYXNzIFRlc3RHQjE4MDMwTWFwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZV9NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2diMTgwMzAnCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vc291cmNlLmljdS1wcm9qZWN0Lm9yZy9yZXBvcy9pY3UvZGF0YS8nIFwKKyAgICAgICAgICAgICAgICAgJ3RydW5rL2NoYXJzZXQvZGF0YS94bWwvZ2ItMTgwMzAtMjAwMC54bWwnCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MmRhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19jbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MmRhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfY24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjJhYjdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2hrLnB5CkBAIC0wLDAgKzEsMjEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyB0ZXN0X2NvZGVjbWFwc19oay5weQorIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEhvbmdLb25nIGVuY29kaW5ncworIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0QmlnNUhLU0NTTWFwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZV9NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZW5jb2RpbmcgPSAnYmlnNWhrc2NzJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3Blb3BsZS5mcmVlYnNkLm9yZy9+cGVya3kvaTE4bi9CSUc1SEtTQ1MtMjAwNC5UWFQnCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gWyd1cmxmZXRjaCddCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMGNmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19oay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMGNmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfaGsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDY2YTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5CkBAIC0wLDAgKzEsNjcgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyB0ZXN0X2NvZGVjbWFwc19qcC5weQorIyAgIENvZGVjIG1hcHBpbmcgdGVzdHMgZm9yIEphcGFuZXNlIGVuY29kaW5ncworIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0Q1A5MzJNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2NwOTMyJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvJyBcCisgICAgICAgICAgICAgICAgICdXSU5ET1dTL0NQOTMyLlRYVCcKKyAgICBzdXBtYXBzID0gWworICAgICAgICAoJ1x4ODAnLCB1J1x1MDA4MCcpLAorICAgICAgICAoJ1x4YTAnLCB1J1x1ZjhmMCcpLAorICAgICAgICAoJ1x4ZmQnLCB1J1x1ZjhmMScpLAorICAgICAgICAoJ1x4ZmUnLCB1J1x1ZjhmMicpLAorICAgICAgICAoJ1x4ZmYnLCB1J1x1ZjhmMycpLAorICAgIF0KKyAgICBmb3IgaSBpbiByYW5nZSgweGExLCAweGUwKToKKyAgICAgICAgc3VwbWFwcy5hcHBlbmQoKGNocihpKSwgdW5pY2hyKGkrMHhmZWMwKSkpCisKKworY2xhc3MgVGVzdEVVQ0pQQ09NUEFUTWFwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZV9NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdldWNfanAnCisgICAgbWFwZmlsZW5hbWUgPSAnRVVDLUpQLlRYVCcKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly9wZW9wbGUuZnJlZWJzZC5vcmcvfnBlcmt5L2kxOG4vRVVDLUpQLlRYVCcKKworCitjbGFzcyBUZXN0U0pJU0NPTVBBVE1hcCh0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuVGVzdEJhc2VfTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdzaGlmdF9qaXMnCisgICAgbWFwZmlsZW5hbWUgPSAnU0hJRlRKSVMuVFhUJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvT0JTT0xFVEUnIFwKKyAgICAgICAgICAgICAgICAgJy9FQVNUQVNJQS9KSVMvU0hJRlRKSVMuVFhUJworICAgIHBhc3NfZW5jdGVzdCA9IFsKKyAgICAgICAgKCdceDgxXycsIHUnXFwnKSwKKyAgICBdCisgICAgcGFzc19kZWN0ZXN0ID0gWworICAgICAgICAoJ1xcJywgdSdceGE1JyksCisgICAgICAgICgnficsIHUnXHUyMDNlJyksCisgICAgICAgICgnXHg4MV8nLCB1J1xcJyksCisgICAgXQorCitjbGFzcyBUZXN0RVVDSklTWDAyMTNNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2V1Y19qaXN4MDIxMycKKyAgICBtYXBmaWxlbmFtZSA9ICdFVUMtSklTWDAyMTMuVFhUJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3Blb3BsZS5mcmVlYnNkLm9yZy9+cGVya3kvaTE4bi9FVUMtSklTWDAyMTMuVFhUJworCisKK2NsYXNzIFRlc3RTSklTWDAyMTNNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdzaGlmdF9qaXN4MDIxMycKKyAgICBtYXBmaWxlbmFtZSA9ICdTSElGVF9KSVNYMDIxMy5UWFQnCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vcGVvcGxlLmZyZWVic2Qub3JnL35wZXJreS9pMThuL1NISUZUX0pJU1gwMjEzLlRYVCcKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2NTdhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2pwLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2NTdhYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc19qcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YzYxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHkKQEAgLTAsMCArMSw0NCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIHRlc3RfY29kZWNtYXBzX2tyLnB5CisjICAgQ29kZWMgbWFwcGluZyB0ZXN0cyBmb3IgUk9LIGVuY29kaW5ncworIworCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBUZXN0Q1A5NDlNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2NwOTQ5JworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQnIFwKKyAgICAgICAgICAgICAgICAgJy9XSU5ET1dTL0NQOTQ5LlRYVCcKKworCitjbGFzcyBUZXN0RVVDS1JNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2V1Y19rcicKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly9wZW9wbGUuZnJlZWJzZC5vcmcvfnBlcmt5L2kxOG4vRVVDLUtSLlRYVCcKKworICAgICMgQTRENCBIQU5HVUwgRklMTEVSIGluZGljYXRlcyB0aGUgYmVnaW4gb2YgOC1ieXRlcyBtYWtlLXVwIHNlcXVlbmNlLgorICAgIHBhc3NfZW5jdGVzdCA9IFsoJ1x4YTRceGQ0JywgdSdcdTMxNjQnKV0KKyAgICBwYXNzX2RlY3Rlc3QgPSBbKCdceGE0XHhkNCcsIHUnXHUzMTY0JyldCisKKworY2xhc3MgVGVzdEpPSEFCTWFwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZV9NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBlbmNvZGluZyA9ICdqb2hhYicKKyAgICBtYXBmaWxldXJsID0gJ2h0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljL01BUFBJTkdTL09CU09MRVRFL0VBU1RBU0lBLycgXAorICAgICAgICAgICAgICAgICAnS1NDL0pPSEFCLlRYVCcKKyAgICAjIEtTIFggMTAwMSBzdGFuZGFyZCBhc3NpZ25lZCAweDVjIGFzIFdPTiBTSUdOLgorICAgICMgYnV0LCBpbiBlYXJseSA5MHMgdGhhdCBpcyB0aGUgb25seSBlcmEgdXNlZCBqb2hhYiB3aWRlbHksCisgICAgIyB0aGUgbW9zdCBzb2Z0d2FyZXMgaW1wbGVtZW50cyBpdCBhcyBSRVZFUlNFIFNPTElEVVMuCisgICAgIyBTbywgd2UgaWdub3JlIHRoZSBzdGFuZGFyZCBoZXJlLgorICAgIHBhc3NfZW5jdGVzdCA9IFsoJ1xcJywgdSdcdTIwYTknKV0KKyAgICBwYXNzX2RlY3Rlc3QgPSBbKCdcXCcsIHUnXHUyMGE5JyldCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM0ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfa3IucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjM0ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX2tyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzYWUyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjbWFwc190dy5weQpAQCAtMCwwICsxLDMxIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9jb2RlY21hcHNfdHcucHkKKyMgICBDb2RlYyBtYXBwaW5nIHRlc3RzIGZvciBST0MgZW5jb2RpbmdzCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIFRlc3RCSUc1TWFwKHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5UZXN0QmFzZV9NYXBwaW5nLAorICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2JpZzUnCisgICAgbWFwZmlsZXVybCA9ICdodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy9NQVBQSU5HUy9PQlNPTEVURS8nIFwKKyAgICAgICAgICAgICAgICAgJ0VBU1RBU0lBL09USEVSL0JJRzUuVFhUJworCitjbGFzcyBUZXN0Q1A5NTBNYXAodGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LlRlc3RCYXNlX01hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGVuY29kaW5nID0gJ2NwOTUwJworICAgIG1hcGZpbGV1cmwgPSAnaHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvTUFQUElOR1MvVkVORE9SUy9NSUNTRlQvJyBcCisgICAgICAgICAgICAgICAgICdXSU5ET1dTL0NQOTUwLlRYVCcKKyAgICBwYXNzX2VuY3Rlc3QgPSBbCisgICAgICAgICgnXHhhMlx4Y2MnLCB1J1x1NTM0MScpLAorICAgICAgICAoJ1x4YTJceGNlJywgdSdcdTUzNDUnKSwKKyAgICBdCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDZkODZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY21hcHNfdHcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDZkODZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZWNtYXBzX3R3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjZjgxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weQpAQCAtMCwwICsxLDIwMTggQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBsb2NhbGUKK2ltcG9ydCBzeXMsIFN0cmluZ0lPLCBfdGVzdGNhcGkKKworZGVmIGNvZGluZ19jaGVja2VyKHNlbGYsIGNvZGVyKToKKyAgICBkZWYgY2hlY2soaW5wdXQsIGV4cGVjdCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZXIoaW5wdXQpLCAoZXhwZWN0LCBsZW4oaW5wdXQpKSkKKyAgICByZXR1cm4gY2hlY2sKKworY2xhc3MgUXVldWUob2JqZWN0KToKKyAgICAiIiIKKyAgICBxdWV1ZTogd3JpdGUgYnl0ZXMgYXQgb25lIGVuZCwgcmVhZCBieXRlcyBmcm9tIHRoZSBvdGhlciBlbmQKKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2J1ZmZlciA9ICIiCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgY2hhcnMpOgorICAgICAgICBzZWxmLl9idWZmZXIgKz0gY2hhcnMKKworICAgIGRlZiByZWFkKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBpZiBzaXplPDA6CisgICAgICAgICAgICBzID0gc2VsZi5fYnVmZmVyCisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSAiIgorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHMgPSBzZWxmLl9idWZmZXJbOnNpemVdCisgICAgICAgICAgICBzZWxmLl9idWZmZXIgPSBzZWxmLl9idWZmZXJbc2l6ZTpdCisgICAgICAgICAgICByZXR1cm4gcworCitjbGFzcyBSZWFkVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNoZWNrX3BhcnRpYWwoc2VsZiwgaW5wdXQsIHBhcnRpYWxyZXN1bHRzKToKKyAgICAgICAgIyBnZXQgYSBTdHJlYW1SZWFkZXIgZm9yIHRoZSBlbmNvZGluZyBhbmQgZmVlZCB0aGUgYnl0ZXN0cmluZyB2ZXJzaW9uCisgICAgICAgICMgb2YgaW5wdXQgdG8gdGhlIHJlYWRlciBieXRlIGJ5IGJ5dGUuIFJlYWQgZXZlcnl0aGluZyBhdmFpbGFibGUgZnJvbQorICAgICAgICAjIHRoZSBTdHJlYW1SZWFkZXIgYW5kIGNoZWNrIHRoYXQgdGhlIHJlc3VsdHMgZXF1YWwgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICMgZW50cmllcyBmcm9tIHBhcnRpYWxyZXN1bHRzLgorICAgICAgICBxID0gUXVldWUoKQorICAgICAgICByID0gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShxKQorICAgICAgICByZXN1bHQgPSB1IiIKKyAgICAgICAgZm9yIChjLCBwYXJ0aWFscmVzdWx0KSBpbiB6aXAoaW5wdXQuZW5jb2RlKHNlbGYuZW5jb2RpbmcpLCBwYXJ0aWFscmVzdWx0cyk6CisgICAgICAgICAgICBxLndyaXRlKGMpCisgICAgICAgICAgICByZXN1bHQgKz0gci5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBwYXJ0aWFscmVzdWx0KQorICAgICAgICAjIGNoZWNrIHRoYXQgdGhlcmUncyBub3RoaW5nIGxlZnQgaW4gdGhlIGJ1ZmZlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnJlYWQoKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuYnl0ZWJ1ZmZlciwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5jaGFyYnVmZmVyLCB1IiIpCisKKyAgICAgICAgIyBkbyB0aGUgY2hlY2sgYWdhaW4sIHRoaXMgdGltZSB1c2luZyBhIGluY3JlbWVudGFsIGRlY29kZXIKKyAgICAgICAgZCA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoc2VsZi5lbmNvZGluZykoKQorICAgICAgICByZXN1bHQgPSB1IiIKKyAgICAgICAgZm9yIChjLCBwYXJ0aWFscmVzdWx0KSBpbiB6aXAoaW5wdXQuZW5jb2RlKHNlbGYuZW5jb2RpbmcpLCBwYXJ0aWFscmVzdWx0cyk6CisgICAgICAgICAgICByZXN1bHQgKz0gZC5kZWNvZGUoYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBwYXJ0aWFscmVzdWx0KQorICAgICAgICAjIGNoZWNrIHRoYXQgdGhlcmUncyBub3RoaW5nIGxlZnQgaW4gdGhlIGJ1ZmZlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmRlY29kZSgiIiwgVHJ1ZSksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmJ1ZmZlciwgIiIpCisKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIHRoZSByZXNldCBtZXRob2Qgd29ya3MgcHJvcGVybHkKKyAgICAgICAgZC5yZXNldCgpCisgICAgICAgIHJlc3VsdCA9IHUiIgorICAgICAgICBmb3IgKGMsIHBhcnRpYWxyZXN1bHQpIGluIHppcChpbnB1dC5lbmNvZGUoc2VsZi5lbmNvZGluZyksIHBhcnRpYWxyZXN1bHRzKToKKyAgICAgICAgICAgIHJlc3VsdCArPSBkLmRlY29kZShjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHBhcnRpYWxyZXN1bHQpCisgICAgICAgICMgY2hlY2sgdGhhdCB0aGVyZSdzIG5vdGhpbmcgbGVmdCBpbiB0aGUgYnVmZmVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGVjb2RlKCIiLCBUcnVlKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYnVmZmVyLCAiIikKKworICAgICAgICAjIGNoZWNrIGl0ZXJkZWNvZGUoKQorICAgICAgICBlbmNvZGVkID0gaW5wdXQuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgIHUiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKGVuY29kZWQsIHNlbGYuZW5jb2RpbmcpKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgZGVmIGdldHJlYWRlcihpbnB1dCk6CisgICAgICAgICAgICBzdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTyhpbnB1dC5lbmNvZGUoc2VsZi5lbmNvZGluZykpCisgICAgICAgICAgICByZXR1cm4gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShzdHJlYW0pCisKKyAgICAgICAgZGVmIHJlYWRhbGxsaW5lcyhpbnB1dCwga2VlcGVuZHM9VHJ1ZSwgc2l6ZT1Ob25lKToKKyAgICAgICAgICAgIHJlYWRlciA9IGdldHJlYWRlcihpbnB1dCkKKyAgICAgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgbGluZSA9IHJlYWRlci5yZWFkbGluZShzaXplPXNpemUsIGtlZXBlbmRzPWtlZXBlbmRzKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgcmV0dXJuICJ8Ii5qb2luKGxpbmVzKQorCisgICAgICAgIHMgPSB1ImZvb1xuYmFyXHJcbmJhelxyc3BhbVx1MjAyOGVnZ3MiCisgICAgICAgIHNleHBlY3RlZCA9IHUiZm9vXG58YmFyXHJcbnxiYXpccnxzcGFtXHUyMDI4fGVnZ3MiCisgICAgICAgIHNleHBlY3RlZG5vZW5kcyA9IHUiZm9vfGJhcnxiYXp8c3BhbXxlZ2dzIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRhbGxsaW5lcyhzLCBUcnVlKSwgc2V4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRhbGxsaW5lcyhzLCBGYWxzZSksIHNleHBlY3RlZG5vZW5kcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkYWxsbGluZXMocywgVHJ1ZSwgMTApLCBzZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGFsbGxpbmVzKHMsIEZhbHNlLCAxMCksIHNleHBlY3RlZG5vZW5kcykKKworICAgICAgICAjIFRlc3QgbG9uZyBsaW5lcyAobXVsdGlwbGUgY2FsbHMgdG8gcmVhZCgpIGluIHJlYWRsaW5lKCkpCisgICAgICAgIHZ3ID0gW10KKyAgICAgICAgdndvID0gW10KKyAgICAgICAgZm9yIChpLCBsaW5lZW5kKSBpbiBlbnVtZXJhdGUodSJcbiBcclxuIFxyIFx1MjAyOCIuc3BsaXQoKSk6CisgICAgICAgICAgICB2dy5hcHBlbmQoKGkqMjAwKSp1IlwzMDQyIiArIGxpbmVlbmQpCisgICAgICAgICAgICB2d28uYXBwZW5kKChpKjIwMCkqdSJcMzA0MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGFsbGxpbmVzKCIiLmpvaW4odncpLCBUcnVlKSwgIiIuam9pbih2dykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGFsbGxpbmVzKCIiLmpvaW4odncpLCBGYWxzZSksIiIuam9pbih2d28pKQorCisgICAgICAgICMgVGVzdCBsaW5lcyB3aGVyZSB0aGUgZmlyc3QgcmVhZCBtaWdodCBlbmQgd2l0aCBcciwgc28gdGhlCisgICAgICAgICMgcmVhZGVyIGhhcyB0byBsb29rIGFoZWFkIHdoZXRoZXIgdGhpcyBpcyBhIGxvbmUgXHIgb3IgYSBcclxuCisgICAgICAgIGZvciBzaXplIGluIHhyYW5nZSg4MCk6CisgICAgICAgICAgICBmb3IgbGluZWVuZCBpbiB1IlxuIFxyXG4gXHIgXHUyMDI4Ii5zcGxpdCgpOgorICAgICAgICAgICAgICAgIHMgPSAxMCooc2l6ZSp1ImEiICsgbGluZWVuZCArIHUieHh4XG4iKQorICAgICAgICAgICAgICAgIHJlYWRlciA9IGdldHJlYWRlcihzKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9VHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKnUiYSIgKyBsaW5lZW5kLAorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcmVhZGVyID0gZ2V0cmVhZGVyKHMpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1GYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplKnUiYSIsCisgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2J1ZzExNzUzOTYoc2VsZik6CisgICAgICAgIHMgPSBbCisgICAgICAgICAgICAnPCUhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuJywKKyAgICAgICAgICAgICcgICAgQkxPRyBpbmRleCBwYWdlOiBzaG93IHJlY2VudCBhcnRpY2xlcyxcclxuJywKKyAgICAgICAgICAgICcgICAgdG9kYXlcJ3MgYXJ0aWNsZXMsIG9yIGFydGljbGVzIG9mIGEgc3BlY2lmaWMgZGF0ZS5cclxuJywKKyAgICAgICAgICAgICc9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tJT5cclxuJywKKyAgICAgICAgICAgICc8JUBpbnB1dGVuY29kaW5nPSJJU08tODg1OS0xIiU+XHJcbicsCisgICAgICAgICAgICAnPCVAcGFnZXRlbXBsYXRlPVRFTVBMQVRFLnklPlxyXG4nLAorICAgICAgICAgICAgJzwlQGltcG9ydD1pbXBvcnQgZnJvZy51dGlsLCBmcm9nJT5cclxuJywKKyAgICAgICAgICAgICc8JUBpbXBvcnQ9aW1wb3J0IGZyb2cub2JqZWN0cyU+XHJcbicsCisgICAgICAgICAgICAnPCVAaW1wb3J0PWZyb20gZnJvZy5zdG9yYWdlZXJyb3JzIGltcG9ydCBTdG9yYWdlRXJyb3IlPlxyXG4nLAorICAgICAgICAgICAgJzwlXHJcbicsCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICAnaW1wb3J0IGxvZ2dpbmdcclxuJywKKyAgICAgICAgICAgICdsb2c9bG9nZ2luZy5nZXRMb2dnZXIoIlNuYWtlbGV0cy5sb2dnZXIiKVxyXG4nLAorICAgICAgICAgICAgJ1xyXG4nLAorICAgICAgICAgICAgJ1xyXG4nLAorICAgICAgICAgICAgJ3VzZXI9c2VsZi5TZXNzaW9uQ3R4LnVzZXJcclxuJywKKyAgICAgICAgICAgICdzdG9yYWdlRW5naW5lPXNlbGYuU2Vzc2lvbkN0eC5zdG9yYWdlRW5naW5lXHJcbicsCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICAnZGVmIHJlYWRBcnRpY2xlc0Zyb21EYXRlKGRhdGUsIGNvdW50PU5vbmUpOlxyXG4nLAorICAgICAgICAgICAgJyAgICBlbnRyeWlkcz1zdG9yYWdlRW5naW5lLmxpc3RCbG9nRW50cmllcyhkYXRlKVxyXG4nLAorICAgICAgICAgICAgJyAgICBlbnRyeWlkcy5yZXZlcnNlKCkgIyBkZXNjZW5kaW5nXHJcbicsCisgICAgICAgICAgICAnICAgIGlmIGNvdW50OlxyXG4nLAorICAgICAgICAgICAgJyAgICAgICAgZW50cnlpZHM9ZW50cnlpZHNbOmNvdW50XVxyXG4nLAorICAgICAgICAgICAgJyAgICB0cnk6XHJcbicsCisgICAgICAgICAgICAnICAgICAgICByZXR1cm4gWyBmcm9nLm9iamVjdHMuQmxvZ0VudHJ5LmxvYWQoc3RvcmFnZUVuZ2luZSwgZGF0ZSwgSWQpIGZvciBJZCBpbiBlbnRyeWlkcyBdXHJcbicsCisgICAgICAgICAgICAnICAgIGV4Y2VwdCBTdG9yYWdlRXJyb3IseDpcclxuJywKKyAgICAgICAgICAgICcgICAgICAgIGxvZy5lcnJvcigiRXJyb3IgbG9hZGluZyBhcnRpY2xlczogIitzdHIoeCkpXHJcbicsCisgICAgICAgICAgICAnICAgICAgICBzZWxmLmFib3J0KCJjYW5ub3QgbG9hZCBhcnRpY2xlcyIpXHJcbicsCisgICAgICAgICAgICAnXHJcbicsCisgICAgICAgICAgICAnc2hvd2RhdGU9Tm9uZVxyXG4nLAorICAgICAgICAgICAgJ1xyXG4nLAorICAgICAgICAgICAgJ2FyZz1zZWxmLlJlcXVlc3QuZ2V0QXJnKClcclxuJywKKyAgICAgICAgICAgICdpZiBhcmc9PSJ0b2RheSI6XHJcbicsCisgICAgICAgICAgICAnICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLSBUT0RBWVwnUyBBUlRJQ0xFU1xyXG4nLAorICAgICAgICAgICAgJyAgICBzZWxmLndyaXRlKCI8aDI+VG9kYXlcJ3MgYXJ0aWNsZXM8L2gyPiIpXHJcbicsCisgICAgICAgICAgICAnICAgIHNob3dkYXRlID0gZnJvZy51dGlsLmlzb2RhdGVzdHIoKSBcclxuJywKKyAgICAgICAgICAgICcgICAgZW50cmllcyA9IHJlYWRBcnRpY2xlc0Zyb21EYXRlKHNob3dkYXRlKVxyXG4nLAorICAgICAgICAgICAgJ2VsaWYgYXJnPT0iYWN0aXZlIjpcclxuJywKKyAgICAgICAgICAgICcgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tIEFDVElWRSBBUlRJQ0xFUyByZWRpcmVjdFxyXG4nLAorICAgICAgICAgICAgJyAgICBzZWxmLllyZWRpcmVjdCgiYWN0aXZlLnkiKVxyXG4nLAorICAgICAgICAgICAgJ2VsaWYgYXJnPT0ibG9naW4iOlxyXG4nLAorICAgICAgICAgICAgJyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0gTE9HSU4gUEFHRSByZWRpcmVjdFxyXG4nLAorICAgICAgICAgICAgJyAgICBzZWxmLllyZWRpcmVjdCgibG9naW4ueSIpXHJcbicsCisgICAgICAgICAgICAnZWxpZiBhcmc9PSJkYXRlIjpcclxuJywKKyAgICAgICAgICAgICcgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tIEFSVElDTEVTIE9GIEEgU1BFQ0lGSUMgREFURVxyXG4nLAorICAgICAgICAgICAgJyAgICBzaG93ZGF0ZSA9IHNlbGYuUmVxdWVzdC5nZXRQYXJhbWV0ZXIoImRhdGUiKVxyXG4nLAorICAgICAgICAgICAgJyAgICBzZWxmLndyaXRlKCI8aDI+QXJ0aWNsZXMgd3JpdHRlbiBvbiAlczwvaDI+IiUgZnJvZy51dGlsLm1lZGl1bWRhdGVzdHIoc2hvd2RhdGUpKVxyXG4nLAorICAgICAgICAgICAgJyAgICBlbnRyaWVzID0gcmVhZEFydGljbGVzRnJvbURhdGUoc2hvd2RhdGUpXHJcbicsCisgICAgICAgICAgICAnZWxzZTpcclxuJywKKyAgICAgICAgICAgICcgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tIFJFQ0VOVCBBUlRJQ0xFU1xyXG4nLAorICAgICAgICAgICAgJyAgICBzZWxmLndyaXRlKCI8aDI+UmVjZW50IGFydGljbGVzPC9oMj4iKVxyXG4nLAorICAgICAgICAgICAgJyAgICBkYXRlcz1zdG9yYWdlRW5naW5lLmxpc3RCbG9nRW50cnlEYXRlcygpXHJcbicsCisgICAgICAgICAgICAnICAgIGlmIGRhdGVzOlxyXG4nLAorICAgICAgICAgICAgJyAgICAgICAgZW50cmllcz1bXVxyXG4nLAorICAgICAgICAgICAgJyAgICAgICAgU0hPV0FNT1VOVD0xMFxyXG4nLAorICAgICAgICAgICAgJyAgICAgICAgZm9yIHNob3dkYXRlIGluIGRhdGVzOlxyXG4nLAorICAgICAgICAgICAgJyAgICAgICAgICAgIGVudHJpZXMuZXh0ZW5kKCByZWFkQXJ0aWNsZXNGcm9tRGF0ZShzaG93ZGF0ZSwgU0hPV0FNT1VOVC1sZW4oZW50cmllcykpIClcclxuJywKKyAgICAgICAgICAgICcgICAgICAgICAgICBpZiBsZW4oZW50cmllcyk+PVNIT1dBTU9VTlQ6XHJcbicsCisgICAgICAgICAgICAnICAgICAgICAgICAgICAgIGJyZWFrXHJcbicsCisgICAgICAgICAgICAnICAgICAgICAgICAgICAgIFxyXG4nLAorICAgICAgICBdCisgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiLmpvaW4ocykuZW5jb2RlKHNlbGYuZW5jb2RpbmcpKQorICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKHNlbGYuZW5jb2RpbmcpKHN0cmVhbSkKKyAgICAgICAgZm9yIChpLCBsaW5lKSBpbiBlbnVtZXJhdGUocmVhZGVyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgc1tpXSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcXVldWUoc2VsZik6CisgICAgICAgIHEgPSBRdWV1ZSgpCisgICAgICAgIHdyaXRlciA9IGNvZGVjcy5nZXR3cml0ZXIoc2VsZi5lbmNvZGluZykocSkKKyAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShxKQorCisgICAgICAgICMgTm8gbGluZWVuZHMKKyAgICAgICAgd3JpdGVyLndyaXRlKHUiZm9vXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1GYWxzZSksIHUiZm9vIikKKyAgICAgICAgd3JpdGVyLndyaXRlKHUiXG5iYXJcciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPUZhbHNlKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1GYWxzZSksIHUiYmFyIikKKyAgICAgICAgd3JpdGVyLndyaXRlKHUiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9RmFsc2UpLCB1ImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPUZhbHNlKSwgdSIiKQorCisgICAgICAgICMgTGluZWVuZHMKKyAgICAgICAgd3JpdGVyLndyaXRlKHUiZm9vXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1UcnVlKSwgdSJmb29cciIpCisgICAgICAgIHdyaXRlci53cml0ZSh1IlxuYmFyXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZShrZWVwZW5kcz1UcnVlKSwgdSJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPVRydWUpLCB1ImJhclxyIikKKyAgICAgICAgd3JpdGVyLndyaXRlKHUiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9VHJ1ZSksIHUiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoa2VlcGVuZHM9VHJ1ZSksIHUiIikKKyAgICAgICAgd3JpdGVyLndyaXRlKHUiZm9vXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKGtlZXBlbmRzPVRydWUpLCB1ImZvb1xyXG4iKQorCisgICAgZGVmIHRlc3RfYnVnMTA5ODk5MF9hKHNlbGYpOgorICAgICAgICBzMSA9IHUieHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCB5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5XHJcbiIKKyAgICAgICAgczIgPSB1Im9mZmVuZGluZyBsaW5lOiBsYWRmaiBhc2tsZGZqIGtsYXNkaiBmc2tsYSBkZnphc2tkaiBmYXNrbGZqIGxhc2tkIGZqYXNrbGZ6enp6YWEld2hlcmVpc3RoaXMhISFcclxuIgorICAgICAgICBzMyA9IHUibmV4dCBsaW5lLlxyXG4iCisKKyAgICAgICAgcyA9IChzMStzMitzMykuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHN0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKHMpCisgICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoc2VsZi5lbmNvZGluZykoc3RyZWFtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZSgpLCBzMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoKSwgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKCksIHMzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZSgpLCB1IiIpCisKKyAgICBkZWYgdGVzdF9idWcxMDk4OTkwX2Ioc2VsZik6CisgICAgICAgIHMxID0gdSJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFcclxuIgorICAgICAgICBzMiA9IHUiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiXHJcbiIKKyAgICAgICAgczMgPSB1InN0aWxsb2theTpiYmJieHhcclxuIgorICAgICAgICBzNCA9IHUiYnJva2VuISEhIWJhZGJhZFxyXG4iCisgICAgICAgIHM1ID0gdSJhZ2Fpbm9rYXkuXHJcbiIKKworICAgICAgICBzID0gKHMxK3MyK3MzK3M0K3M1KS5lbmNvZGUoc2VsZi5lbmNvZGluZykKKyAgICAgICAgc3RyZWFtID0gU3RyaW5nSU8uU3RyaW5nSU8ocykKKyAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcihzZWxmLmVuY29kaW5nKShzdHJlYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKCksIHMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZSgpLCBzMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoKSwgczMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRsaW5lKCksIHM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWFkbGluZSgpLCBzNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZGxpbmUoKSwgdSIiKQorCitjbGFzcyBVVEYzMlRlc3QoUmVhZFRlc3QpOgorICAgIGVuY29kaW5nID0gInV0Zi0zMiIKKworICAgIHNwYW1sZSA9ICgnXHhmZlx4ZmVceDAwXHgwMCcKKyAgICAgICAgICAgICAgJ3NceDAwXHgwMFx4MDBwXHgwMFx4MDBceDAwYVx4MDBceDAwXHgwMG1ceDAwXHgwMFx4MDAnCisgICAgICAgICAgICAgICdzXHgwMFx4MDBceDAwcFx4MDBceDAwXHgwMGFceDAwXHgwMFx4MDBtXHgwMFx4MDBceDAwJykKKyAgICBzcGFtYmUgPSAoJ1x4MDBceDAwXHhmZVx4ZmYnCisgICAgICAgICAgICAgICdceDAwXHgwMFx4MDBzXHgwMFx4MDBceDAwcFx4MDBceDAwXHgwMGFceDAwXHgwMFx4MDBtJworICAgICAgICAgICAgICAnXHgwMFx4MDBceDAwc1x4MDBceDAwXHgwMHBceDAwXHgwMFx4MDBhXHgwMFx4MDBceDAwbScpCisKKyAgICBkZWYgdGVzdF9vbmx5X29uZV9ib20oc2VsZik6CisgICAgICAgIF8sXyxyZWFkZXIsd3JpdGVyID0gY29kZWNzLmxvb2t1cChzZWxmLmVuY29kaW5nKQorICAgICAgICAjIGVuY29kZSBzb21lIHN0cmVhbQorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBmID0gd3JpdGVyKHMpCisgICAgICAgIGYud3JpdGUodSJzcGFtIikKKyAgICAgICAgZi53cml0ZSh1InNwYW0iKQorICAgICAgICBkID0gcy5nZXR2YWx1ZSgpCisgICAgICAgICMgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBleGFjdGx5IG9uZSBCT00gaW4gaXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQgPT0gc2VsZi5zcGFtbGUgb3IgZCA9PSBzZWxmLnNwYW1iZSkKKyAgICAgICAgIyB0cnkgdG8gcmVhZCBpdCBiYWNrCisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTyhkKQorICAgICAgICBmID0gcmVhZGVyKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIHUic3BhbXNwYW0iKQorCisgICAgZGVmIHRlc3RfYmFkYm9tKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oNCoiXHhmZiIpCisgICAgICAgIGYgPSBjb2RlY3MuZ2V0cmVhZGVyKHNlbGYuZW5jb2RpbmcpKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgZi5yZWFkKQorCisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTyg4KiJceGZmIikKKyAgICAgICAgZiA9IGNvZGVjcy5nZXRyZWFkZXIoc2VsZi5lbmNvZGluZykocykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBmLnJlYWQpCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCisgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgdSIiLCAjIGZpcnN0IGJ5dGUgb2YgQk9NIHJlYWQKKyAgICAgICAgICAgICAgICB1IiIsICMgc2Vjb25kIGJ5dGUgb2YgQk9NIHJlYWQKKyAgICAgICAgICAgICAgICB1IiIsICMgdGhpcmQgYnl0ZSBvZiBCT00gcmVhZAorICAgICAgICAgICAgICAgIHUiIiwgIyBmb3VydGggYnl0ZSBvZiBCT00gcmVhZCA9PiBieXRlb3JkZXIga25vd24KKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfaGFuZGxlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHUnXHVmZmZkJywgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLnV0Zl8zMl9kZWNvZGUoJ1x4MDEnLCAncmVwbGFjZScsIFRydWUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh1JycsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfZGVjb2RlKCdceDAxJywgJ2lnbm9yZScsIFRydWUpKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMzJfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiXHhmZiIsICJzdHJpY3QiLCBUcnVlKQorCisgICAgZGVmIHRlc3RfaXNzdWU4OTQxKHNlbGYpOgorICAgICAgICAjIElzc3VlICM4OTQxOiBpbnN1ZmZpY2llbnQgcmVzdWx0IGFsbG9jYXRpb24gd2hlbiBkZWNvZGluZyBpbnRvCisgICAgICAgICMgc3Vycm9nYXRlIHBhaXJzIG9uIFVDUy0yIGJ1aWxkcy4KKyAgICAgICAgZW5jb2RlZF9sZSA9ICdceGZmXHhmZVx4MDBceDAwJyArICdceDAwXHgwMFx4MDFceDAwJyAqIDEwMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTAwMDAnICogMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2RlY29kZShlbmNvZGVkX2xlKVswXSkKKyAgICAgICAgZW5jb2RlZF9iZSA9ICdceDAwXHgwMFx4ZmVceGZmJyArICdceDAwXHgwMVx4MDBceDAwJyAqIDEwMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTAwMDAnICogMTAyNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzMyX2RlY29kZShlbmNvZGVkX2JlKVswXSkKKworY2xhc3MgVVRGMzJMRVRlc3QoUmVhZFRlc3QpOgorICAgIGVuY29kaW5nID0gInV0Zi0zMi1sZSIKKworICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXFUwMDAxMDIwMyIuZW5jb2RlKHNlbGYuZW5jb2RpbmcpLCAiXHgwM1x4MDJceDAxXHgwMCIpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgY29kZWNzLnV0Zl8zMl9sZV9kZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJceGZmIiwgInN0cmljdCIsIFRydWUpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTg5NDEoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzg5NDE6IGluc3VmZmljaWVudCByZXN1bHQgYWxsb2NhdGlvbiB3aGVuIGRlY29kaW5nIGludG8KKyAgICAgICAgIyBzdXJyb2dhdGUgcGFpcnMgb24gVUNTLTIgYnVpbGRzLgorICAgICAgICBlbmNvZGVkID0gJ1x4MDBceDAwXHgwMVx4MDAnICogMTAyNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDAwMCcgKiAxMDI0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMzJfbGVfZGVjb2RlKGVuY29kZWQpWzBdKQorCitjbGFzcyBVVEYzMkJFVGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTMyLWJlIgorCisgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAorICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZiIsCisgICAgICAgICAgICAgICAgdSJceDAwXHhmZlx1MDEwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgXQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJcVTAwMDEwMjAzIi5lbmNvZGUoc2VsZi5lbmNvZGluZyksICJceDAwXHgwMVx4MDJceDAzIikKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBjb2RlY3MudXRmXzMyX2JlX2RlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlx4ZmYiLCAic3RyaWN0IiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2lzc3VlODk0MShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODk0MTogaW5zdWZmaWNpZW50IHJlc3VsdCBhbGxvY2F0aW9uIHdoZW4gZGVjb2RpbmcgaW50bworICAgICAgICAjIHN1cnJvZ2F0ZSBwYWlycyBvbiBVQ1MtMiBidWlsZHMuCisgICAgICAgIGVuY29kZWQgPSAnXHgwMFx4MDFceDAwXHgwMCcgKiAxMDI0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwMDAwJyAqIDEwMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLnV0Zl8zMl9iZV9kZWNvZGUoZW5jb2RlZClbMF0pCisKKworY2xhc3MgVVRGMTZUZXN0KFJlYWRUZXN0KToKKyAgICBlbmNvZGluZyA9ICJ1dGYtMTYiCisKKyAgICBzcGFtbGUgPSAnXHhmZlx4ZmVzXHgwMHBceDAwYVx4MDBtXHgwMHNceDAwcFx4MDBhXHgwMG1ceDAwJworICAgIHNwYW1iZSA9ICdceGZlXHhmZlx4MDBzXHgwMHBceDAwYVx4MDBtXHgwMHNceDAwcFx4MDBhXHgwMG0nCisKKyAgICBkZWYgdGVzdF9vbmx5X29uZV9ib20oc2VsZik6CisgICAgICAgIF8sXyxyZWFkZXIsd3JpdGVyID0gY29kZWNzLmxvb2t1cChzZWxmLmVuY29kaW5nKQorICAgICAgICAjIGVuY29kZSBzb21lIHN0cmVhbQorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBmID0gd3JpdGVyKHMpCisgICAgICAgIGYud3JpdGUodSJzcGFtIikKKyAgICAgICAgZi53cml0ZSh1InNwYW0iKQorICAgICAgICBkID0gcy5nZXR2YWx1ZSgpCisgICAgICAgICMgY2hlY2sgd2hldGhlciB0aGVyZSBpcyBleGFjdGx5IG9uZSBCT00gaW4gaXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQgPT0gc2VsZi5zcGFtbGUgb3IgZCA9PSBzZWxmLnNwYW1iZSkKKyAgICAgICAgIyB0cnkgdG8gcmVhZCBpdCBiYWNrCisgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTyhkKQorICAgICAgICBmID0gcmVhZGVyKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIHUic3BhbXNwYW0iKQorCisgICAgZGVmIHRlc3RfYmFkYm9tKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oIlx4ZmZceGZmIikKKyAgICAgICAgZiA9IGNvZGVjcy5nZXRyZWFkZXIoc2VsZi5lbmNvZGluZykocykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBmLnJlYWQpCisKKyAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCJceGZmXHhmZlx4ZmZceGZmIikKKyAgICAgICAgZiA9IGNvZGVjcy5nZXRyZWFkZXIoc2VsZi5lbmNvZGluZykocykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBmLnJlYWQpCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BhcnRpYWwoCisgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgdSIiLCAjIGZpcnN0IGJ5dGUgb2YgQk9NIHJlYWQKKyAgICAgICAgICAgICAgICB1IiIsICMgc2Vjb25kIGJ5dGUgb2YgQk9NIHJlYWQgPT4gYnl0ZW9yZGVyIGtub3duCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwMTAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBdCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2hhbmRsZXJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh1J1x1ZmZmZCcsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy51dGZfMTZfZGVjb2RlKCdceDAxJywgJ3JlcGxhY2UnLCBUcnVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodScnLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MudXRmXzE2X2RlY29kZSgnXHgwMScsICdpZ25vcmUnLCBUcnVlKSkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBjb2RlY3MudXRmXzE2X2RlY29kZSwgIlx4ZmYiLCAic3RyaWN0IiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2J1ZzY5MTI5MShzZWxmKToKKyAgICAgICAgIyBGaWxlcyBhcmUgYWx3YXlzIG9wZW5lZCBpbiBiaW5hcnkgbW9kZSwgZXZlbiBpZiBubyBiaW5hcnkgbW9kZSB3YXMKKyAgICAgICAgIyBzcGVjaWZpZWQuICBUaGlzIG1lYW5zIHRoYXQgbm8gYXV0b21hdGljIGNvbnZlcnNpb24gb2YgJ1xuJyBpcyBkb25lCisgICAgICAgICMgb24gcmVhZGluZyBhbmQgd3JpdGluZy4KKyAgICAgICAgczEgPSB1J0hlbGxvXHJcbndvcmxkXHJcbicKKworICAgICAgICBzID0gczEuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X3N1cHBvcnQudW5saW5rLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShzKQorICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICdVJywgZW5jb2Rpbmc9c2VsZi5lbmNvZGluZykgYXMgcmVhZGVyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIucmVhZCgpLCBzMSkKKworY2xhc3MgVVRGMTZMRVRlc3QoUmVhZFRlc3QpOgorICAgIGVuY29kaW5nID0gInV0Zi0xNi1sZSIKKworICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICAgIChiJ1x4ZmYnLCB1J1x1ZmZmZCcpLAorICAgICAgICAgICAgKGInQVx4MDBaJywgdSdBXHVmZmZkJyksCisgICAgICAgICAgICAoYidBXHgwMEJceDAwQ1x4MDBEXHgwMFonLCB1J0FCQ0RcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4MDBceGQ4JywgdSdcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4MDBceGQ4QScsIHUnXHVmZmZkJyksCisgICAgICAgICAgICAoYidceDAwXHhkOEFceDAwJywgdSdcdWZmZmRBJyksCisgICAgICAgICAgICAoYidceDAwXHhkY0FceDAwJywgdSdcdWZmZmRBJyksCisgICAgICAgIF0KKyAgICAgICAgZm9yIHJhdywgZXhwZWN0ZWQgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMTZfbGVfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3LCAnc3RyaWN0JywgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmRlY29kZSgndXRmLTE2bGUnLCAncmVwbGFjZScpLCBleHBlY3RlZCkKKworY2xhc3MgVVRGMTZCRVRlc3QoUmVhZFRlc3QpOgorICAgIGVuY29kaW5nID0gInV0Zi0xNi1iZSIKKworICAgIGRlZiB0ZXN0X3BhcnRpYWwoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcGFydGlhbCgKKyAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDAiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHgwMFx4ZmZcdTAxMDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICAgIChiJ1x4ZmYnLCB1J1x1ZmZmZCcpLAorICAgICAgICAgICAgKGInXHgwMEFceGZmJywgdSdBXHVmZmZkJyksCisgICAgICAgICAgICAoYidceDAwQVx4MDBCXHgwMENceDAwRFonLCB1J0FCQ0RcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4ZDhceDAwJywgdSdcdWZmZmQnKSwKKyAgICAgICAgICAgIChiJ1x4ZDhceDAwXHhkYycsIHUnXHVmZmZkJyksCisgICAgICAgICAgICAoYidceGQ4XHgwMFx4MDBBJywgdSdcdWZmZmRBJyksCisgICAgICAgICAgICAoYidceGRjXHgwMFx4MDBBJywgdSdcdWZmZmRBJyksCisgICAgICAgIF0KKyAgICAgICAgZm9yIHJhdywgZXhwZWN0ZWQgaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMTZfYmVfZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3LCAnc3RyaWN0JywgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmRlY29kZSgndXRmLTE2YmUnLCAncmVwbGFjZScpLCBleHBlY3RlZCkKKworY2xhc3MgVVRGOFRlc3QoUmVhZFRlc3QpOgorICAgIGVuY29kaW5nID0gInV0Zi04IgorCisgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAorICAgICAgICAgICAgdSJceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHUiXHgwMCIsCisgICAgICAgICAgICAgICAgdSJceDAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmIiwKKyAgICAgICAgICAgICAgICB1Ilx4MDBceGZmXHUwN2ZmXHUwODAwXHVmZmZmXFUwMDAxMDAwMCIsCisgICAgICAgICAgICBdCisgICAgICAgICkKKworY2xhc3MgVVRGN1Rlc3QoUmVhZFRlc3QpOgorICAgIGVuY29kaW5nID0gInV0Zi03IgorCisgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAorICAgICAgICAgICAgdSJhKy1iIiwKKyAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICB1ImEiLAorICAgICAgICAgICAgICAgIHUiYSIsCisgICAgICAgICAgICAgICAgdSJhKyIsCisgICAgICAgICAgICAgICAgdSJhKy0iLAorICAgICAgICAgICAgICAgIHUiYSstYiIsCisgICAgICAgICAgICBdCisgICAgICAgICkKKworY2xhc3MgVVRGMTZFeFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy51dGZfMTZfZXhfZGVjb2RlLCAiXHhmZiIsICJzdHJpY3QiLCAwLCBUcnVlKQorCisgICAgZGVmIHRlc3RfYmFkX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLnV0Zl8xNl9leF9kZWNvZGUpCisKK2NsYXNzIFJlYWRCdWZmZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2FycmF5KHNlbGYpOgorICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5yZWFkYnVmZmVyX2VuY29kZShhcnJheS5hcnJheSgiYyIsICJzcGFtIikpLAorICAgICAgICAgICAgKCJzcGFtIiwgNCkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLnJlYWRidWZmZXJfZW5jb2RlKCIiKSwgKCIiLCAwKSkKKworICAgIGRlZiB0ZXN0X2JhZF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5yZWFkYnVmZmVyX2VuY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MucmVhZGJ1ZmZlcl9lbmNvZGUsIDQyKQorCitjbGFzcyBDaGFyQnVmZmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLmNoYXJidWZmZXJfZW5jb2RlKCJzcGFtIiksICgic3BhbSIsIDQpKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLmNoYXJidWZmZXJfZW5jb2RlKCIiKSwgKCIiLCAwKSkKKworICAgIGRlZiB0ZXN0X2JhZF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5jaGFyYnVmZmVyX2VuY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2RlY3MuY2hhcmJ1ZmZlcl9lbmNvZGUsIDQyKQorCitjbGFzcyBVVEY4U2lnVGVzdChSZWFkVGVzdCk6CisgICAgZW5jb2RpbmcgPSAidXRmLTgtc2lnIgorCisgICAgZGVmIHRlc3RfcGFydGlhbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJ0aWFsKAorICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZlx1MDgwMFx1ZmZmZlxVMDAwMTAwMDAiLAorICAgICAgICAgICAgWworICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1IiIsCisgICAgICAgICAgICAgICAgdSIiLCAjIEZpcnN0IEJPTSBoYXMgYmVlbiByZWFkIGFuZCBza2lwcGVkCisgICAgICAgICAgICAgICAgdSIiLAorICAgICAgICAgICAgICAgIHUiIiwKKyAgICAgICAgICAgICAgICB1Ilx1ZmVmZiIsICMgU2Vjb25kIEJPTSBoYXMgYmVlbiByZWFkIGFuZCBlbWl0dGVkCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwIiwgIyAiXHgwMCIgcmVhZCBhbmQgZW1pdHRlZAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMCIsICMgRmlyc3QgYnl0ZSBvZiBlbmNvZGVkIHUiXHhmZiIgcmVhZAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmYiLCAjIFNlY29uZCBieXRlIG9mIGVuY29kZWQgdSJceGZmIiByZWFkCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZiIsICMgRmlyc3QgYnl0ZSBvZiBlbmNvZGVkIHUiXHUwN2ZmIiByZWFkCisgICAgICAgICAgICAgICAgdSJcdWZlZmZceDAwXHhmZlx1MDdmZiIsICMgU2Vjb25kIGJ5dGUgb2YgZW5jb2RlZCB1Ilx1MDdmZiIgcmVhZAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmYiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmYiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDAiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmYiLAorICAgICAgICAgICAgICAgIHUiXHVmZWZmXHgwMFx4ZmZcdTA3ZmZcdTA4MDBcdWZmZmZcVTAwMDEwMDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYnVnMTYwMTUwMShzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzE2MDE1MDE6IGNoZWNrIHRoYXQgdGhlIGNvZGVjIHdvcmtzIHdpdGggYSBidWZmZXIKKyAgICAgICAgdW5pY29kZSgiXHhlZlx4YmJceGJmIiwgInV0Zi04LXNpZyIpCisKKyAgICBkZWYgdGVzdF9ib20oc2VsZik6CisgICAgICAgIGQgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKCJ1dGYtOC1zaWciKSgpCisgICAgICAgIHMgPSB1InNwYW0iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5kZWNvZGUocy5lbmNvZGUoInV0Zi04LXNpZyIpKSwgcykKKworICAgIGRlZiB0ZXN0X3N0cmVhbV9ib20oc2VsZik6CisgICAgICAgIHVuaXN0cmluZyA9IHUiQUJDXHUwMEExXHUyMjAwWFlaIgorICAgICAgICBieXRlc3RyaW5nID0gY29kZWNzLkJPTV9VVEY4ICsgIkFCQ1x4QzJceEExXHhFMlx4ODhceDgwWFlaIgorCisgICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoInV0Zi04LXNpZyIpCisgICAgICAgIGZvciBzaXplaGludCBpbiBbTm9uZV0gKyByYW5nZSgxLCAxMSkgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgaXN0cmVhbSA9IHJlYWRlcihTdHJpbmdJTy5TdHJpbmdJTyhieXRlc3RyaW5nKSkKKyAgICAgICAgICAgIG9zdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIHNpemVoaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKHNpemVoaW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpc3RyZWFtLnJlYWQoKQorCisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShkYXRhKQorCisgICAgICAgICAgICBnb3QgPSBvc3RyZWFtLmdldHZhbHVlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCB1bmlzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9zdHJlYW1fYmFyZShzZWxmKToKKyAgICAgICAgdW5pc3RyaW5nID0gdSJBQkNcdTAwQTFcdTIyMDBYWVoiCisgICAgICAgIGJ5dGVzdHJpbmcgPSAiQUJDXHhDMlx4QTFceEUyXHg4OFx4ODBYWVoiCisKKyAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcigidXRmLTgtc2lnIikKKyAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lXSArIHJhbmdlKDEsIDExKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFs2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNF06CisgICAgICAgICAgICBpc3RyZWFtID0gcmVhZGVyKFN0cmluZ0lPLlN0cmluZ0lPKGJ5dGVzdHJpbmcpKQorICAgICAgICAgICAgb3N0cmVhbSA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgc2l6ZWhpbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpc3RyZWFtLnJlYWQoc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZCgpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICAgICAgICAgIGdvdCA9IG9zdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIHVuaXN0cmluZykKKworY2xhc3MgRXNjYXBlRGVjb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29kZWNzLmVzY2FwZV9kZWNvZGUoIiIpLCAoIiIsIDApKQorCisgICAgZGVmIHRlc3RfcmF3KHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MuZXNjYXBlX2RlY29kZQorICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgYiA9IGNocihiKQorICAgICAgICAgICAgaWYgYiAhPSAnXFwnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGIgKyAnMCcpLCAoYiArICcwJywgMikpCisKKyAgICBkZWYgdGVzdF9lc2NhcGUoc2VsZik6CisgICAgICAgIGRlY29kZSA9IGNvZGVjcy5lc2NhcGVfZGVjb2RlCisgICAgICAgIGNoZWNrID0gY29kaW5nX2NoZWNrZXIoc2VsZiwgZGVjb2RlKQorICAgICAgICBjaGVjayhiIltcXFxuXSIsIGIiW10iKQorICAgICAgICBjaGVjayhicidbXCJdJywgYidbIl0nKQorICAgICAgICBjaGVjayhiciJbXCddIiwgYiJbJ10iKQorICAgICAgICBjaGVjayhiciJbXFxdIiwgYnIiW1xdIikKKyAgICAgICAgY2hlY2soYnIiW1xhXSIsIGIiW1x4MDddIikKKyAgICAgICAgY2hlY2soYnIiW1xiXSIsIGIiW1x4MDhdIikKKyAgICAgICAgY2hlY2soYnIiW1x0XSIsIGIiW1x4MDldIikKKyAgICAgICAgY2hlY2soYnIiW1xuXSIsIGIiW1x4MGFdIikKKyAgICAgICAgY2hlY2soYnIiW1x2XSIsIGIiW1x4MGJdIikKKyAgICAgICAgY2hlY2soYnIiW1xmXSIsIGIiW1x4MGNdIikKKyAgICAgICAgY2hlY2soYnIiW1xyXSIsIGIiW1x4MGRdIikKKyAgICAgICAgY2hlY2soYnIiW1w3XSIsIGIiW1x4MDddIikKKyAgICAgICAgY2hlY2soYnIiW1w4XSIsIGJyIltcOF0iKQorICAgICAgICBjaGVjayhiciJbXDc4XSIsIGIiW1x4MDc4XSIpCisgICAgICAgIGNoZWNrKGJyIltcNDFdIiwgYiJbIV0iKQorICAgICAgICBjaGVjayhiciJbXDQxOF0iLCBiIlshOF0iKQorICAgICAgICBjaGVjayhiciJbXDEwMV0iLCBiIltBXSIpCisgICAgICAgIGNoZWNrKGJyIltcMTAxMF0iLCBiIltBMF0iKQorICAgICAgICBjaGVjayhiciJbXDUwMV0iLCBiIltBXSIpCisgICAgICAgIGNoZWNrKGJyIltceDQxXSIsIGIiW0FdIikKKyAgICAgICAgY2hlY2soYnIiW1xYNDFdIiwgYnIiW1xYNDFdIikKKyAgICAgICAgY2hlY2soYnIiW1x4NDEwXSIsIGIiW0EwXSIpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBiID0gY2hyKGIpCisgICAgICAgICAgICBpZiBiIG5vdCBpbiAnXG4iXCdcXGFidG52ZnIwMTIzNDU2N3gnOgorICAgICAgICAgICAgICAgIGNoZWNrKCdcXCcgKyBiLCAnXFwnICsgYikKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLmVzY2FwZV9kZWNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGVjb2RlLCBiciJceCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRlY29kZSwgYnIiW1x4XSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGJyIltceF1ceCIsICJpZ25vcmUiKSwgKGIiW10iLCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4XVx4IiwgInJlcGxhY2UiKSwgKGIiWz9dPyIsIDYpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkZWNvZGUsIGJyIlx4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRlY29kZSwgYnIiW1x4MF0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShiciJbXHgwXVx4MCIsICJpZ25vcmUiKSwgKGIiW10iLCA4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoYnIiW1x4MF1ceDAiLCAicmVwbGFjZSIpLCAoYiJbP10/IiwgOCkpCisKK2NsYXNzIFJlY29kaW5nVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVjb2Rpbmcoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGYyID0gY29kZWNzLkVuY29kZWRGaWxlKGYsICJ1bmljb2RlX2ludGVybmFsIiwgInV0Zi04IikKKyAgICAgICAgZjIud3JpdGUodSJhIikKKyAgICAgICAgZjIuY2xvc2UoKQorICAgICAgICAjIFB5dGhvbiB1c2VkIHRvIGNyYXNoIG9uIHRoaXMgYXQgZXhpdCBiZWNhdXNlIG9mIGEgcmVmY291bnQKKyAgICAgICAgIyBidWcgaW4gX2NvZGVjc21vZHVsZS5jCisKKyMgRnJvbSBSRkMgMzQ5MgorcHVueWNvZGVfdGVzdGNhc2VzID0gWworICAgICMgQSBBcmFiaWMgKEVneXB0aWFuKToKKyAgICAodSJcdTA2NDRcdTA2NEFcdTA2NDdcdTA2NDVcdTA2MjdcdTA2MjhcdTA2MkFcdTA2NDNcdTA2NDQiCisgICAgIHUiXHUwNjQ1XHUwNjQ4XHUwNjM0XHUwNjM5XHUwNjMxXHUwNjI4XHUwNjRBXHUwNjFGIiwKKyAgICAgImVnYnBkYWo2YnU0YnhmZ2VoZnZ3eG4iKSwKKyAgICAjIEIgQ2hpbmVzZSAoc2ltcGxpZmllZCk6CisgICAgKHUiXHU0RUQ2XHU0RUVDXHU0RTNBXHU0RUMwXHU0RTQ4XHU0RTBEXHU4QkY0XHU0RTJEXHU2NTg3IiwKKyAgICAgImlocXdjcmI0Y3Y4YThkcWcwNTZwcWp5ZSIpLAorICAgICMgQyBDaGluZXNlICh0cmFkaXRpb25hbCk6CisgICAgKHUiXHU0RUQ2XHU1MDExXHU3MjMyXHU0RUMwXHU5RUJEXHU0RTBEXHU4QUFBXHU0RTJEXHU2NTg3IiwKKyAgICAgImlocXdjdHZ6YzkxZjY1OWRyc3MzeDhibzB5YiIpLAorICAgICMgRCBDemVjaDogUHJvPGNjYXJvbj5wcm9zdDxlY2Fyb24+bmVtbHV2PGlhY3V0ZT48Y2Nhcm9uPmVza3kKKyAgICAodSJcdTAwNTBcdTAwNzJcdTAwNkZcdTAxMERcdTAwNzBcdTAwNzJcdTAwNkZcdTAwNzNcdTAwNzQiCisgICAgIHUiXHUwMTFCXHUwMDZFXHUwMDY1XHUwMDZEXHUwMDZDXHUwMDc1XHUwMDc2XHUwMEVEXHUwMTBEIgorICAgICB1Ilx1MDA2NVx1MDA3M1x1MDA2Qlx1MDA3OSIsCisgICAgICJQcm9wcm9zdG5lbWx1dmVza3ktdXliMjRkbWE0MWEiKSwKKyAgICAjIEUgSGVicmV3OgorICAgICh1Ilx1MDVEQ1x1MDVERVx1MDVENFx1MDVENFx1MDVERFx1MDVFNFx1MDVFOVx1MDVENVx1MDVEOCIKKyAgICAgdSJcdTA1RENcdTA1RDBcdTA1REVcdTA1RDNcdTA1RDFcdTA1RThcdTA1RDlcdTA1RERcdTA1RTIiCisgICAgIHUiXHUwNUQxXHUwNUU4XHUwNUQ5XHUwNUVBIiwKKyAgICAgIjRkYmNhZ2RhaHltYnhla2hlaDZlMGE3ZmVpMGIiKSwKKyAgICAjIEYgSGluZGkgKERldmFuYWdhcmkpOgorICAgICh1Ilx1MDkyRlx1MDkzOVx1MDkzMlx1MDk0Qlx1MDkxN1x1MDkzOVx1MDkzRlx1MDkyOFx1MDk0RCIKKyAgICB1Ilx1MDkyNlx1MDk0MFx1MDkxNVx1MDk0RFx1MDkyRlx1MDk0Qlx1MDkwMlx1MDkyOFx1MDkzOSIKKyAgICB1Ilx1MDk0MFx1MDkwMlx1MDkyQ1x1MDk0Qlx1MDkzMlx1MDkzOFx1MDkxNVx1MDkyNFx1MDk0NyIKKyAgICB1Ilx1MDkzOVx1MDk0OFx1MDkwMiIsCisgICAgImkxYmFhN2VjaTlnbHJkOWIyYWUxYmowaGZjZ2c2aXlhZjhvMGExZGlnMGNkIiksCisKKyAgICAjKEcpIEphcGFuZXNlIChrYW5qaSBhbmQgaGlyYWdhbmEpOgorICAgICh1Ilx1MzA2QVx1MzA1Q1x1MzA3Rlx1MzA5M1x1MzA2QVx1NjVFNVx1NjcyQ1x1OEE5RVx1MzA5MiIKKyAgICB1Ilx1OEE3MVx1MzA1N1x1MzA2Nlx1MzA0Rlx1MzA4Q1x1MzA2QVx1MzA0NFx1MzA2RVx1MzA0QiIsCisgICAgICJuOGpvazVheTVkemFiZDVieW05ZjBjbTU2ODVycmpldHI2cGR4YSIpLAorCisgICAgIyAoSCkgS29yZWFuIChIYW5ndWwgc3lsbGFibGVzKToKKyAgICAodSJcdUMxMzhcdUFDQzRcdUM3NThcdUJBQThcdUI0RTBcdUMwQUNcdUI3OENcdUI0RTRcdUM3NzQiCisgICAgIHUiXHVENTVDXHVBRDZEXHVDNUI0XHVCOTdDXHVDNzc0XHVENTc0XHVENTVDXHVCMkU0XHVCQTc0IgorICAgICB1Ilx1QzVCQ1x1QjlDOFx1QjA5OFx1Qzg4Qlx1Qzc0NFx1QUU0QyIsCisgICAgICI5ODlhb21zdmk1ZTgzZGIxZDJhMzU1Y3YxZTB2YWsxZHdydjkzZDV4YmgxNWEwZHQzMGE1aiIKKyAgICAgInBzZDg3OWNjbTZmZWE5OGMiKSwKKworICAgICMgKEkpIFJ1c3NpYW4gKEN5cmlsbGljKToKKyAgICAodSJcdTA0M0ZcdTA0M0VcdTA0NDdcdTA0MzVcdTA0M0NcdTA0NDNcdTA0MzZcdTA0MzVcdTA0M0UiCisgICAgIHUiXHUwNDNEXHUwNDM4XHUwNDNEXHUwNDM1XHUwNDMzXHUwNDNFXHUwNDMyXHUwNDNFXHUwNDQwIgorICAgICB1Ilx1MDQ0Rlx1MDQ0Mlx1MDQzRlx1MDQzRVx1MDQ0MFx1MDQ0M1x1MDQ0MVx1MDQ0MVx1MDQzQSIKKyAgICAgdSJcdTA0MzgiLAorICAgICAiYjFhYmZhYWVwZHJubmJnZWZiYURvdGN3YXRtcTJnNGwiKSwKKworICAgICMgKEopIFNwYW5pc2g6IFBvcnF1PGVhY3V0ZT5ub3B1ZWRlbnNpbXBsZW1lbnRlaGFibGFyZW5Fc3BhPG50aWxkZT5vbAorICAgICh1Ilx1MDA1MFx1MDA2Rlx1MDA3Mlx1MDA3MVx1MDA3NVx1MDBFOVx1MDA2RVx1MDA2Rlx1MDA3MCIKKyAgICAgdSJcdTAwNzVcdTAwNjVcdTAwNjRcdTAwNjVcdTAwNkVcdTAwNzNcdTAwNjlcdTAwNkRcdTAwNzAiCisgICAgIHUiXHUwMDZDXHUwMDY1XHUwMDZEXHUwMDY1XHUwMDZFXHUwMDc0XHUwMDY1XHUwMDY4XHUwMDYxIgorICAgICB1Ilx1MDA2Mlx1MDA2Q1x1MDA2MVx1MDA3Mlx1MDA2NVx1MDA2RVx1MDA0NVx1MDA3M1x1MDA3MCIKKyAgICAgdSJcdTAwNjFcdTAwRjFcdTAwNkZcdTAwNkMiLAorICAgICAiUG9ycXVub3B1ZWRlbnNpbXBsZW1lbnRlaGFibGFyZW5Fc3Bhb2wtZm1kNTZhIiksCisKKyAgICAjIChLKSBWaWV0bmFtZXNlOgorICAgICMgIFQ8YWRvdGJlbG93PmlzYW9oPG9kb3RiZWxvdz5raDxvY2lyYz5uZ3RoPGVjaXJjaG9va2Fib3ZlPmNoXAorICAgICMgICA8aWhvb2thYm92ZT5uPG9hY3V0ZT5pdGk8ZWNpcmNhY3V0ZT5uZ1ZpPGVjaXJjZG90YmVsb3c+dAorICAgICh1Ilx1MDA1NFx1MUVBMVx1MDA2OVx1MDA3M1x1MDA2MVx1MDA2Rlx1MDA2OFx1MUVDRFx1MDA2QiIKKyAgICAgdSJcdTAwNjhcdTAwRjRcdTAwNkVcdTAwNjdcdTAwNzRcdTAwNjhcdTFFQzNcdTAwNjNcdTAwNjgiCisgICAgIHUiXHUxRUM5XHUwMDZFXHUwMEYzXHUwMDY5XHUwMDc0XHUwMDY5XHUxRUJGXHUwMDZFXHUwMDY3IgorICAgICB1Ilx1MDA1Nlx1MDA2OVx1MUVDN1x1MDA3NCIsCisgICAgICJUaXNhb2hraG5ndGhjaG5pdGluZ1ZpdC1ramNyODI2OHF5eGFmZDJmMWI5ZyIpLAorCisgICAgIyhMKSAzPG5lbj5CPGd1bWk+PGtpbnBhY2hpPjxzZW5zZWk+CisgICAgKHUiXHUwMDMzXHU1RTc0XHUwMDQyXHU3RDQ0XHU5MUQxXHU1MTZCXHU1MTQ4XHU3NTFGIiwKKyAgICAgIjNCLXd3NGM1ZTE4MGU1NzVhNjVsc3kyYiIpLAorCisgICAgIyAoTSkgPGFtdXJvPjxuYW1pZT4td2l0aC1TVVBFUi1NT05LRVlTCisgICAgKHUiXHU1Qjg5XHU1QkE0XHU1OTQ4XHU3RjhFXHU2MDc1XHUwMDJEXHUwMDc3XHUwMDY5XHUwMDc0IgorICAgICB1Ilx1MDA2OFx1MDAyRFx1MDA1M1x1MDA1NVx1MDA1MFx1MDA0NVx1MDA1Mlx1MDAyRFx1MDA0RCIKKyAgICAgdSJcdTAwNEZcdTAwNEVcdTAwNEJcdTAwNDVcdTAwNTlcdTAwNTMiLAorICAgICAiLXdpdGgtU1VQRVItTU9OS0VZUy1wYzU4YWc4MGE4cWFpMDBnN245biIpLAorCisgICAgIyAoTikgSGVsbG8tQW5vdGhlci1XYXktPHNvcmV6b3JlPjxubz48YmFzaG8+CisgICAgKHUiXHUwMDQ4XHUwMDY1XHUwMDZDXHUwMDZDXHUwMDZGXHUwMDJEXHUwMDQxXHUwMDZFXHUwMDZGIgorICAgICB1Ilx1MDA3NFx1MDA2OFx1MDA2NVx1MDA3Mlx1MDAyRFx1MDA1N1x1MDA2MVx1MDA3OVx1MDAyRCIKKyAgICAgdSJcdTMwNURcdTMwOENcdTMwNUVcdTMwOENcdTMwNkVcdTU4MzRcdTYyNDAiLAorICAgICAiSGVsbG8tQW5vdGhlci1XYXktLWZjNHF1YTA1YXV3YjM2NzR2ZnIwYiIpLAorCisgICAgIyAoTykgPGhpdG90c3U+PHlhbmU+PG5vPjxzaGl0YT4yCisgICAgKHUiXHUzMDcyXHUzMDY4XHUzMDY0XHU1QzRCXHU2ODM5XHUzMDZFXHU0RTBCXHUwMDMyIiwKKyAgICAgIjItdTl0bHpyOTc1NmJ0M3VjMHYiKSwKKworICAgICMgKFApIE1hamk8ZGU+S29pPHN1cnU+NTxieW91PjxtYWU+CisgICAgKHUiXHUwMDREXHUwMDYxXHUwMDZBXHUwMDY5XHUzMDY3XHUwMDRCXHUwMDZGXHUwMDY5XHUzMDU5IgorICAgICB1Ilx1MzA4Qlx1MDAzNVx1NzlEMlx1NTI0RCIsCisgICAgICJNYWppS29pNS03ODNndWU2cXowNzVhem01ZSIpLAorCisgICAgICMgKFEpIDxwYWZpaT5kZTxydW5iYT4KKyAgICAodSJcdTMwRDFcdTMwRDVcdTMwQTNcdTMwRkNcdTAwNjRcdTAwNjVcdTMwRUJcdTMwRjNcdTMwRDAiLAorICAgICAiZGUtamc0YXZoYnkxbm9jMGQiKSwKKworICAgICMgKFIpIDxzb25vPjxzdXBpaWRvPjxkZT4KKyAgICAodSJcdTMwNURcdTMwNkVcdTMwQjlcdTMwRDRcdTMwRkNcdTMwQzlcdTMwNjciLAorICAgICAiZDlqdWF1NDFhd2N6Y3pwIiksCisKKyAgICAjIChTKSAtPiAkMS4wMCA8LQorICAgICh1Ilx1MDAyRFx1MDAzRVx1MDAyMFx1MDAyNFx1MDAzMVx1MDAyRVx1MDAzMFx1MDAzMFx1MDAyMCIKKyAgICAgdSJcdTAwM0NcdTAwMkQiLAorICAgICAiLT4gJDEuMDAgPC0tIikKKyAgICBdCisKK2ZvciBpIGluIHB1bnljb2RlX3Rlc3RjYXNlczoKKyAgICBpZiBsZW4oaSkhPTI6CisgICAgICAgIHByaW50IHJlcHIoaSkKKworY2xhc3MgUHVueWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIGZvciB1bmksIHB1bnkgaW4gcHVueWNvZGVfdGVzdGNhc2VzOgorICAgICAgICAgICAgIyBOZWVkIHRvIGNvbnZlcnQgYm90aCBzdHJpbmdzIHRvIGxvd2VyIGNhc2UsIHNpbmNlCisgICAgICAgICAgICAjIHNvbWUgb2YgdGhlIGV4dGVuZGVkIGVuY29kaW5ncyB1c2UgdXBwZXIgY2FzZSwgYnV0IG91cgorICAgICAgICAgICAgIyBjb2RlIHByb2R1Y2VzIG9ubHkgbG93ZXIgY2FzZS4gQ29udmVydGluZyBqdXN0IHB1bnkgdG8KKyAgICAgICAgICAgICMgbG93ZXIgaXMgYWxzbyBpbnN1ZmZpY2llbnQsIHNpbmNlIHNvbWUgb2YgdGhlIGlucHV0IGNoYXJhY3RlcnMKKyAgICAgICAgICAgICMgYXJlIHVwcGVyIGNhc2UuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaS5lbmNvZGUoInB1bnljb2RlIikubG93ZXIoKSwgcHVueS5sb3dlcigpKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgdW5pLCBwdW55IGluIHB1bnljb2RlX3Rlc3RjYXNlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pLCBwdW55LmRlY29kZSgicHVueWNvZGUiKSkKKworY2xhc3MgVW5pY29kZUludGVybmFsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYnVnMTI1MTMwMChzZWxmKToKKyAgICAgICAgIyBEZWNvZGluZyB3aXRoIHVuaWNvZGVfaW50ZXJuYWwgdXNlZCB0byBub3QgY29ycmVjdGx5IGhhbmRsZSAiY29kZQorICAgICAgICAjIHBvaW50cyIgYWJvdmUgMHgxMGZmZmYgb24gVUNTLTQgYnVpbGRzLgorICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+IDB4ZmZmZjoKKyAgICAgICAgICAgIG9rID0gWworICAgICAgICAgICAgICAgICgiXHgwMFx4MTBceGZmXHhmZiIsIHUiXFUwMDEwZmZmZiIpLAorICAgICAgICAgICAgICAgICgiXHgwMFx4MDBceDAxXHgwMSIsIHUiXFUwMDAwMDEwMSIpLAorICAgICAgICAgICAgICAgICgiIiwgdSIiKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIG5vdF9vayA9IFsKKyAgICAgICAgICAgICAgICAiXHg3Zlx4ZmZceGZmXHhmZiIsCisgICAgICAgICAgICAgICAgIlx4ODBceDAwXHgwMFx4MDAiLAorICAgICAgICAgICAgICAgICJceDgxXHgwMFx4MDBceDAwIiwKKyAgICAgICAgICAgICAgICAiXHgwMCIsCisgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwIiwKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgIGZvciBpbnRlcm5hbCwgdW5pIGluIG9rOgorICAgICAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICAgICAgICAgIGludGVybmFsID0gIiIuam9pbihyZXZlcnNlZChpbnRlcm5hbCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmksIGludGVybmFsLmRlY29kZSgidW5pY29kZV9pbnRlcm5hbCIpKQorICAgICAgICAgICAgZm9yIGludGVybmFsIGluIG5vdF9vazoKKyAgICAgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbCA9ICIiLmpvaW4ocmV2ZXJzZWQoaW50ZXJuYWwpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgaW50ZXJuYWwuZGVjb2RlLAorICAgICAgICAgICAgICAgICAgICAidW5pY29kZV9pbnRlcm5hbCIpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfZXJyb3JfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPiAweGZmZmY6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIlx4MDBceDAwXHgwMFx4MDBceDAwXHgxMVx4MTFceDAwIi5kZWNvZGUoInVuaWNvZGVfaW50ZXJuYWwiKQorICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciwgZXg6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgidW5pY29kZV9pbnRlcm5hbCIsIGV4LmVuY29kaW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlx4MDBceDAwXHgwMFx4MDBceDAwXHgxMVx4MTFceDAwIiwgZXgub2JqZWN0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgZXguc3RhcnQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg4LCBleC5lbmQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfY2FsbGJhY2soc2VsZik6CisgICAgICAgIGlmIHN5cy5tYXh1bmljb2RlID4gMHhmZmZmOgorICAgICAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJVbmljb2RlSW50ZXJuYWxUZXN0IiwgY29kZWNzLmlnbm9yZV9lcnJvcnMpCisgICAgICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGRlY29kZXIoInVuaWNvZGVfaW50ZXJuYWwiKQorICAgICAgICAgICAgYWIgPSB1ImFiIi5lbmNvZGUoInVuaWNvZGVfaW50ZXJuYWwiKQorICAgICAgICAgICAgaWdub3JlZCA9IGRlY29kZXIoIiVzXHgyMlx4MjJceDIyXHgyMiVzIiAlIChhYls6NF0sIGFiWzQ6XSksCisgICAgICAgICAgICAgICAgIlVuaWNvZGVJbnRlcm5hbFRlc3QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodSJhYiIsIDEyKSwgaWdub3JlZCkKKworICAgIGRlZiB0ZXN0X2VuY29kZV9sZW5ndGgoc2VsZik6CisgICAgICAgICMgSXNzdWUgMzczOQorICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGVuY29kZXIoInVuaWNvZGVfaW50ZXJuYWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIodSJhIilbMV0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlcih1Ilx4ZTlcdTAxNDIiKVsxXSwgMikKKworICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGVuY29kZXIoInN0cmluZy1lc2NhcGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIocidceDAwJylbMV0sIDQpCisKKyMgRnJvbSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWRuL2RyYWZ0LWpvc2Vmc3Nvbi1pZG4tdGVzdC12ZWN0b3JzLmh0bWwKK25hbWVwcmVwX3Rlc3RzID0gWworICAgICMgMy4xIE1hcCB0byBub3RoaW5nLgorICAgICgnZm9vXHhjMlx4YWRceGNkXHg4Zlx4ZTFceGEwXHg4Nlx4ZTFceGEwXHg4YmJhcicKKyAgICAgJ1x4ZTJceDgwXHg4Ylx4ZTJceDgxXHhhMGJhelx4ZWZceGI4XHg4MFx4ZWZceGI4XHg4OFx4ZWYnCisgICAgICdceGI4XHg4Zlx4ZWZceGJiXHhiZicsCisgICAgICdmb29iYXJiYXonKSwKKyAgICAjIDMuMiBDYXNlIGZvbGRpbmcgQVNDSUkgVSswMDQzIFUrMDA0MSBVKzAwNDYgVSswMDQ1LgorICAgICgnQ0FGRScsCisgICAgICdjYWZlJyksCisgICAgIyAzLjMgQ2FzZSBmb2xkaW5nIDhiaXQgVSswMERGIChnZXJtYW4gc2hhcnAgcykuCisgICAgIyBUaGUgb3JpZ2luYWwgdGVzdCBjYXNlIGlzIGJvZ3VzOyBpdCBzYXlzIFx4YzNceGRmCisgICAgKCdceGMzXHg5ZicsCisgICAgICdzcycpLAorICAgICMgMy40IENhc2UgZm9sZGluZyBVKzAxMzAgKHR1cmtpc2ggY2FwaXRhbCBJIHdpdGggZG90KS4KKyAgICAoJ1x4YzRceGIwJywKKyAgICAgJ2lceGNjXHg4NycpLAorICAgICMgMy41IENhc2UgZm9sZGluZyBtdWx0aWJ5dGUgVSswMTQzIFUrMDM3QS4KKyAgICAoJ1x4YzVceDgzXHhjZFx4YmEnLAorICAgICAnXHhjNVx4ODQgXHhjZVx4YjknKSwKKyAgICAjIDMuNiBDYXNlIGZvbGRpbmcgVSsyMTIxIFUrMzNDNiBVKzFEN0JCLgorICAgICMgWFhYOiBza2lwIHRoaXMgYXMgaXQgZmFpbHMgaW4gVUNTLTIgbW9kZQorICAgICMoJ1x4ZTJceDg0XHhhMVx4ZTNceDhmXHg4Nlx4ZjBceDlkXHg5ZVx4YmInLAorICAgICMgJ3RlbGNceGUyXHg4OFx4OTVrZ1x4Y2ZceDgzJyksCisgICAgKE5vbmUsIE5vbmUpLAorICAgICMgMy43IE5vcm1hbGl6YXRpb24gb2YgVSswMDZhIFUrMDMwYyBVKzAwQTAgVSswMEFBLgorICAgICgnalx4Y2NceDhjXHhjMlx4YTBceGMyXHhhYScsCisgICAgICdceGM3XHhiMCBhJyksCisgICAgIyAzLjggQ2FzZSBmb2xkaW5nIFUrMUZCNyBhbmQgbm9ybWFsaXphdGlvbi4KKyAgICAoJ1x4ZTFceGJlXHhiNycsCisgICAgICdceGUxXHhiZVx4YjZceGNlXHhiOScpLAorICAgICMgMy45IFNlbGYtcmV2ZXJ0aW5nIGNhc2UgZm9sZGluZyBVKzAxRjAgYW5kIG5vcm1hbGl6YXRpb24uCisgICAgIyBUaGUgb3JpZ2luYWwgdGVzdCBjYXNlIGlzIGJvZ3VzLCBpdCBzYXlzIGBceGM3XHhmMCcKKyAgICAoJ1x4YzdceGIwJywKKyAgICAgJ1x4YzdceGIwJyksCisgICAgIyAzLjEwIFNlbGYtcmV2ZXJ0aW5nIGNhc2UgZm9sZGluZyBVKzAzOTAgYW5kIG5vcm1hbGl6YXRpb24uCisgICAgKCdceGNlXHg5MCcsCisgICAgICdceGNlXHg5MCcpLAorICAgICMgMy4xMSBTZWxmLXJldmVydGluZyBjYXNlIGZvbGRpbmcgVSswM0IwIGFuZCBub3JtYWxpemF0aW9uLgorICAgICgnXHhjZVx4YjAnLAorICAgICAnXHhjZVx4YjAnKSwKKyAgICAjIDMuMTIgU2VsZi1yZXZlcnRpbmcgY2FzZSBmb2xkaW5nIFUrMUU5NiBhbmQgbm9ybWFsaXphdGlvbi4KKyAgICAoJ1x4ZTFceGJhXHg5NicsCisgICAgICdceGUxXHhiYVx4OTYnKSwKKyAgICAjIDMuMTMgU2VsZi1yZXZlcnRpbmcgY2FzZSBmb2xkaW5nIFUrMUY1NiBhbmQgbm9ybWFsaXphdGlvbi4KKyAgICAoJ1x4ZTFceGJkXHg5NicsCisgICAgICdceGUxXHhiZFx4OTYnKSwKKyAgICAjIDMuMTQgQVNDSUkgc3BhY2UgY2hhcmFjdGVyIFUrMDAyMC4KKyAgICAoJyAnLAorICAgICAnICcpLAorICAgICMgMy4xNSBOb24tQVNDSUkgOGJpdCBzcGFjZSBjaGFyYWN0ZXIgVSswMEEwLgorICAgICgnXHhjMlx4YTAnLAorICAgICAnICcpLAorICAgICMgMy4xNiBOb24tQVNDSUkgbXVsdGlieXRlIHNwYWNlIGNoYXJhY3RlciBVKzE2ODAuCisgICAgKCdceGUxXHg5YVx4ODAnLAorICAgICBOb25lKSwKKyAgICAjIDMuMTcgTm9uLUFTQ0lJIG11bHRpYnl0ZSBzcGFjZSBjaGFyYWN0ZXIgVSsyMDAwLgorICAgICgnXHhlMlx4ODBceDgwJywKKyAgICAgJyAnKSwKKyAgICAjIDMuMTggWmVybyBXaWR0aCBTcGFjZSBVKzIwMGIuCisgICAgKCdceGUyXHg4MFx4OGInLAorICAgICAnJyksCisgICAgIyAzLjE5IE5vbi1BU0NJSSBtdWx0aWJ5dGUgc3BhY2UgY2hhcmFjdGVyIFUrMzAwMC4KKyAgICAoJ1x4ZTNceDgwXHg4MCcsCisgICAgICcgJyksCisgICAgIyAzLjIwIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVycyBVKzAwMTAgVSswMDdGLgorICAgICgnXHgxMFx4N2YnLAorICAgICAnXHgxMFx4N2YnKSwKKyAgICAjIDMuMjEgTm9uLUFTQ0lJIDhiaXQgY29udHJvbCBjaGFyYWN0ZXIgVSswMDg1LgorICAgICgnXHhjMlx4ODUnLAorICAgICBOb25lKSwKKyAgICAjIDMuMjIgTm9uLUFTQ0lJIG11bHRpYnl0ZSBjb250cm9sIGNoYXJhY3RlciBVKzE4MEUuCisgICAgKCdceGUxXHhhMFx4OGUnLAorICAgICBOb25lKSwKKyAgICAjIDMuMjMgWmVybyBXaWR0aCBOby1CcmVhayBTcGFjZSBVK0ZFRkYuCisgICAgKCdceGVmXHhiYlx4YmYnLAorICAgICAnJyksCisgICAgIyAzLjI0IE5vbi1BU0NJSSBjb250cm9sIGNoYXJhY3RlciBVKzFEMTc1LgorICAgICgnXHhmMFx4OWRceDg1XHhiNScsCisgICAgIE5vbmUpLAorICAgICMgMy4yNSBQbGFuZSAwIHByaXZhdGUgdXNlIGNoYXJhY3RlciBVK0YxMjMuCisgICAgKCdceGVmXHg4NFx4YTMnLAorICAgICBOb25lKSwKKyAgICAjIDMuMjYgUGxhbmUgMTUgcHJpdmF0ZSB1c2UgY2hhcmFjdGVyIFUrRjEyMzQuCisgICAgKCdceGYzXHhiMVx4ODhceGI0JywKKyAgICAgTm9uZSksCisgICAgIyAzLjI3IFBsYW5lIDE2IHByaXZhdGUgdXNlIGNoYXJhY3RlciBVKzEwRjIzNC4KKyAgICAoJ1x4ZjRceDhmXHg4OFx4YjQnLAorICAgICBOb25lKSwKKyAgICAjIDMuMjggTm9uLWNoYXJhY3RlciBjb2RlIHBvaW50IFUrOEZGRkUuCisgICAgKCdceGYyXHg4Zlx4YmZceGJlJywKKyAgICAgTm9uZSksCisgICAgIyAzLjI5IE5vbi1jaGFyYWN0ZXIgY29kZSBwb2ludCBVKzEwRkZGRi4KKyAgICAoJ1x4ZjRceDhmXHhiZlx4YmYnLAorICAgICBOb25lKSwKKyAgICAjIDMuMzAgU3Vycm9nYXRlIGNvZGUgVStERjQyLgorICAgICgnXHhlZFx4YmRceDgyJywKKyAgICAgTm9uZSksCisgICAgIyAzLjMxIE5vbi1wbGFpbiB0ZXh0IGNoYXJhY3RlciBVK0ZGRkQuCisgICAgKCdceGVmXHhiZlx4YmQnLAorICAgICBOb25lKSwKKyAgICAjIDMuMzIgSWRlb2dyYXBoaWMgZGVzY3JpcHRpb24gY2hhcmFjdGVyIFUrMkZGNS4KKyAgICAoJ1x4ZTJceGJmXHhiNScsCisgICAgIE5vbmUpLAorICAgICMgMy4zMyBEaXNwbGF5IHByb3BlcnR5IGNoYXJhY3RlciBVKzAzNDEuCisgICAgKCdceGNkXHg4MScsCisgICAgICdceGNjXHg4MScpLAorICAgICMgMy4zNCBMZWZ0LXRvLXJpZ2h0IG1hcmsgVSsyMDBFLgorICAgICgnXHhlMlx4ODBceDhlJywKKyAgICAgTm9uZSksCisgICAgIyAzLjM1IERlcHJlY2F0ZWQgVSsyMDJBLgorICAgICgnXHhlMlx4ODBceGFhJywKKyAgICAgTm9uZSksCisgICAgIyAzLjM2IExhbmd1YWdlIHRhZ2dpbmcgY2hhcmFjdGVyIFUrRTAwMDEuCisgICAgKCdceGYzXHhhMFx4ODBceDgxJywKKyAgICAgTm9uZSksCisgICAgIyAzLjM3IExhbmd1YWdlIHRhZ2dpbmcgY2hhcmFjdGVyIFUrRTAwNDIuCisgICAgKCdceGYzXHhhMFx4ODFceDgyJywKKyAgICAgTm9uZSksCisgICAgIyAzLjM4IEJpZGk6IFJhbmRBTENhdCBjaGFyYWN0ZXIgVSswNUJFIGFuZCBMQ2F0IGNoYXJhY3RlcnMuCisgICAgKCdmb29ceGQ2XHhiZWJhcicsCisgICAgIE5vbmUpLAorICAgICMgMy4zOSBCaWRpOiBSYW5kQUxDYXQgY2hhcmFjdGVyIFUrRkQ1MCBhbmQgTENhdCBjaGFyYWN0ZXJzLgorICAgICgnZm9vXHhlZlx4YjVceDkwYmFyJywKKyAgICAgTm9uZSksCisgICAgIyAzLjQwIEJpZGk6IFJhbmRBTENhdCBjaGFyYWN0ZXIgVStGQjM4IGFuZCBMQ2F0IGNoYXJhY3RlcnMuCisgICAgKCdmb29ceGVmXHhiOVx4YjZiYXInLAorICAgICAnZm9vIFx4ZDlceDhlYmFyJyksCisgICAgIyAzLjQxIEJpZGk6IFJhbmRBTENhdCB3aXRob3V0IHRyYWlsaW5nIFJhbmRBTENhdCBVKzA2MjcgVSswMDMxLgorICAgICgnXHhkOFx4YTcxJywKKyAgICAgTm9uZSksCisgICAgIyAzLjQyIEJpZGk6IFJhbmRBTENhdCBjaGFyYWN0ZXIgVSswNjI3IFUrMDAzMSBVKzA2MjguCisgICAgKCdceGQ4XHhhNzFceGQ4XHhhOCcsCisgICAgICdceGQ4XHhhNzFceGQ4XHhhOCcpLAorICAgICMgMy40MyBVbmFzc2lnbmVkIGNvZGUgcG9pbnQgVStFMDAwMi4KKyAgICAjIFNraXAgdGhpcyB0ZXN0IGFzIHdlIGFsbG93IHVuYXNzaWduZWQKKyAgICAjKCdceGYzXHhhMFx4ODBceDgyJywKKyAgICAjIE5vbmUpLAorICAgIChOb25lLCBOb25lKSwKKyAgICAjIDMuNDQgTGFyZ2VyIHRlc3QgKHNocmlua2luZykuCisgICAgIyBPcmlnaW5hbCB0ZXN0IGNhc2UgcmVhZHMgXHhjM1x4ZGYKKyAgICAoJ1hceGMyXHhhZFx4YzNceDlmXHhjNFx4YjBceGUyXHg4NFx4YTFqXHhjY1x4OGNceGMyXHhhMFx4YzInCisgICAgICdceGFhXHhjZVx4YjBceGUyXHg4MFx4ODAnLAorICAgICAneHNzaVx4Y2NceDg3dGVsXHhjN1x4YjAgYVx4Y2VceGIwICcpLAorICAgICMgMy40NSBMYXJnZXIgdGVzdCAoZXhwYW5kaW5nKS4KKyAgICAjIE9yaWdpbmFsIHRlc3QgY2FzZSByZWFkcyBceGMzXHg5ZgorICAgICgnWFx4YzNceDlmXHhlM1x4OGNceDk2XHhjNFx4YjBceGUyXHg4NFx4YTFceGUyXHg5Mlx4OWZceGUzXHg4YycKKyAgICAgJ1x4ODAnLAorICAgICAneHNzXHhlM1x4ODJceGFkXHhlM1x4ODNceGFkXHhlM1x4ODNceGExXHhlM1x4ODNceGJjXHhlMycKKyAgICAgJ1x4ODNceDg4XHhlM1x4ODNceGFiaVx4Y2NceDg3dGVsXHgyOGRceDI5XHhlM1x4ODInCisgICAgICdceGEyXHhlM1x4ODNceDkxXHhlM1x4ODNceGJjXHhlM1x4ODNceDg4JykKKyAgICBdCisKKworY2xhc3MgTmFtZXByZXBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9uYW1lcHJlcChzZWxmKToKKyAgICAgICAgZnJvbSBlbmNvZGluZ3MuaWRuYSBpbXBvcnQgbmFtZXByZXAKKyAgICAgICAgZm9yIHBvcywgKG9yaWcsIHByZXBwZWQpIGluIGVudW1lcmF0ZShuYW1lcHJlcF90ZXN0cyk6CisgICAgICAgICAgICBpZiBvcmlnIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBTa2lwcGVkCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICMgVGhlIFVuaWNvZGUgc3RyaW5ncyBhcmUgZ2l2ZW4gaW4gVVRGLTgKKyAgICAgICAgICAgIG9yaWcgPSB1bmljb2RlKG9yaWcsICJ1dGYtOCIpCisgICAgICAgICAgICBpZiBwcmVwcGVkIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBJbnB1dCBjb250YWlucyBwcm9oaWJpdGVkIGNoYXJhY3RlcnMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIG5hbWVwcmVwLCBvcmlnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmVwcGVkID0gdW5pY29kZShwcmVwcGVkLCAidXRmLTgiKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lcHJlcChvcmlnKSwgcHJlcHBlZCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLGU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkKCJUZXN0IDMuJWQ6ICVzIiAlIChwb3MrMSwgc3RyKGUpKSkKKworY2xhc3MgSUROQUNvZGVjVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYnVpbHRpbl9kZWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgicHl0aG9uLm9yZyIsICJpZG5hIiksIHUicHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgicHl0aG9uLm9yZy4iLCAiaWRuYSIpLCB1InB5dGhvbi5vcmcuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZyIsICJpZG5hIiksIHUicHl0aFx4ZjZuLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgieG4tLXB5dGhuLW11YS5vcmcuIiwgImlkbmEiKSwgdSJweXRoXHhmNm4ub3JnLiIpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InB5dGhvbi5vcmciLmVuY29kZSgiaWRuYSIpLCAicHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInB5dGhvbi5vcmcuIi5lbmNvZGUoImlkbmEiKSwgInB5dGhvbi5vcmcuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InB5dGhceGY2bi5vcmciLmVuY29kZSgiaWRuYSIpLCAieG4tLXB5dGhuLW11YS5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUicHl0aFx4ZjZuLm9yZy4iLmVuY29kZSgiaWRuYSIpLCAieG4tLXB5dGhuLW11YS5vcmcuIikKKworICAgIGRlZiB0ZXN0X3N0cmVhbShzZWxmKToKKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIHIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJpZG5hIikoU3RyaW5nSU8uU3RyaW5nSU8oImFiYyIpKQorICAgICAgICByLnJlYWQoMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLnJlYWQoKSwgdSIiKQorCisgICAgZGVmIHRlc3RfaW5jcmVtZW50YWxfZGVjb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmRlY29kZSgicHl0aG9uLm9yZyIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRob24ub3JnIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJweXRob24ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRob24ub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmRlY29kZSgieG4tLXB5dGhuLW11YS5vcmcuIiwgImlkbmEiKSksCisgICAgICAgICAgICB1InB5dGhceGY2bi5vcmcuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJ4bi0tcHl0aG4tbXVhLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgIHUicHl0aFx4ZjZuLm9yZy4iCisgICAgICAgICkKKworICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcigiaWRuYSIpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgieG4tLXhhbSIsICksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgicGxlLTl0YS5vIiwgKSwgdSJceGU0eGFtcGxlLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUodSJyZyIpLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUodSIiLCBUcnVlKSwgdSJvcmciKQorCisgICAgICAgIGRlY29kZXIucmVzZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCJ4bi0teGFtIiwgKSwgdSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCJwbGUtOXRhLm8iLCApLCB1Ilx4ZTR4YW1wbGUuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgicmcuIiksIHUib3JnLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpLCB1IiIpCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbF9lbmNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZW5jb2RlKHUicHl0aG9uLm9yZyIsICJpZG5hIikpLAorICAgICAgICAgICAgInB5dGhvbi5vcmciCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRob24ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInB5dGhvbi5vcmcuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZW5jb2RlKHUicHl0aFx4ZjZuLm9yZy4iLCAiaWRuYSIpKSwKKyAgICAgICAgICAgICJ4bi0tcHl0aG4tbXVhLm9yZy4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRoXHhmNm4ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInhuLS1weXRobi1tdWEub3JnLiIKKyAgICAgICAgKQorCisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCJpZG5hIikoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUiXHhlNHgiKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSJhbXBsZS5vcmciKSwgInhuLS14YW1wbGUtOXRhLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKSwgIm9yZyIpCisKKyAgICAgICAgZW5jb2Rlci5yZXNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSJceGU0eCIpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1ImFtcGxlLm9yZy4iKSwgInhuLS14YW1wbGUtOXRhLm9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUiIiwgVHJ1ZSksICIiKQorCitjbGFzcyBDb2RlY3NNb2R1bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuZGVjb2RlKCdceGU0XHhmNlx4ZmMnLCAnbGF0aW4tMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1J1x4ZTRceGY2XHhmYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmRlY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuZGVjb2RlKCdhYmMnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGNvZGVjcy5kZWNvZGUsICdceGZmJywgJ2FzY2lpJykKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MuZW5jb2RlKHUnXHhlNFx4ZjZceGZjJywgJ2xhdGluLTEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4ZTRceGY2XHhmYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmVuY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTG9va3VwRXJyb3IsIGNvZGVjcy5lbmNvZGUsICJmb28iLCAiX19zcGFtX18iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5lbmNvZGUodSdhYmMnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgY29kZWNzLmVuY29kZSwgdSdceGZmZmYnLCAnYXNjaWknKQorCisgICAgZGVmIHRlc3RfcmVnaXN0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLnJlZ2lzdGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5yZWdpc3RlciwgNDIpCisKKyAgICBkZWYgdGVzdF9sb29rdXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmxvb2t1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTG9va3VwRXJyb3IsIGNvZGVjcy5sb29rdXAsICJfX3NwYW1fXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvb2t1cEVycm9yLCBjb2RlY3MubG9va3VwLCAiICIpCisKKyAgICBkZWYgdGVzdF9nZXRlbmNvZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5nZXRlbmNvZGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgY29kZWNzLmdldGVuY29kZXIsICJfX3NwYW1fXyIpCisKKyAgICBkZWYgdGVzdF9nZXRkZWNvZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvZGVjcy5nZXRkZWNvZGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhMb29rdXBFcnJvciwgY29kZWNzLmdldGRlY29kZXIsICJfX3NwYW1fXyIpCisKKyAgICBkZWYgdGVzdF9nZXRyZWFkZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmdldHJlYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTG9va3VwRXJyb3IsIGNvZGVjcy5nZXRyZWFkZXIsICJfX3NwYW1fXyIpCisKKyAgICBkZWYgdGVzdF9nZXR3cml0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29kZWNzLmdldHdyaXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTG9va3VwRXJyb3IsIGNvZGVjcy5nZXR3cml0ZXIsICJfX3NwYW1fXyIpCisKKyAgICBkZWYgdGVzdF9sb29rdXBfaXNzdWUxODEzKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxODEzOiB1bmRlciBUdXJraXNoIGxvY2FsZXMsIGxvb2t1cCBvZiBzb21lIGNvZGVjcyBmYWlsZWQKKyAgICAgICAgIyBiZWNhdXNlICdJJyBpcyBsb3dlcmNhc2VkIGFzIGEgZG90bGVzcyAiaSIKKyAgICAgICAgb2xkbG9jYWxlID0gbG9jYWxlLmdldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChsb2NhbGUuc2V0bG9jYWxlLCBsb2NhbGUuTENfQ1RZUEUsIG9sZGxvY2FsZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsICd0cl9UUicpCisgICAgICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3I6CisgICAgICAgICAgICAjIFVuc3VwcG9ydGVkIGxvY2FsZSBvbiB0aGlzIHN5c3RlbQorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgndGVzdCBuZWVkcyBUdXJraXNoIGxvY2FsZScpCisgICAgICAgIGMgPSBjb2RlY3MubG9va3VwKCdBU0NJSScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5uYW1lLCAnYXNjaWknKQorCitjbGFzcyBTdHJlYW1SZWFkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCd1dGYtOCcpCisgICAgICAgIHNlbGYuc3RyZWFtID0gU3RyaW5nSU8uU3RyaW5nSU8oJ1x4ZWRceDk1XHg5Y1xuXHhlYVx4YjhceDgwJykKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYucmVhZGVyKHNlbGYuc3RyZWFtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmVzKCksIFt1J1x1ZDU1Y1xuJywgdSdcdWFlMDAnXSkKKworY2xhc3MgRW5jb2RlZEZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oJ1x4ZWRceDk1XHg5Y1xuXHhlYVx4YjhceDgwJykKKyAgICAgICAgZWYgPSBjb2RlY3MuRW5jb2RlZEZpbGUoZiwgJ3V0Zi0xNi1sZScsICd1dGYtOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWYucmVhZCgpLCAnXFxceGQ1XG5ceDAwXHgwMFx4YWUnKQorCisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIGVmID0gY29kZWNzLkVuY29kZWRGaWxlKGYsICd1dGYtOCcsICdsYXRpbjEnKQorICAgICAgICBlZi53cml0ZSgnXHhjM1x4YmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZ2V0dmFsdWUoKSwgJ1x4ZmMnKQorCitjbGFzcyBTdHIyU3RyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBzaW4gPSAiXHg4MCIuZW5jb2RlKCJiYXNlNjRfY29kZWMiKQorICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJiYXNlNjRfY29kZWMiKShTdHJpbmdJTy5TdHJpbmdJTyhzaW4pKQorICAgICAgICBzb3V0ID0gcmVhZGVyLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXQsICJceDgwIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNvdXQsIHN0cikKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBzaW4gPSAiXHg4MCIuZW5jb2RlKCJiYXNlNjRfY29kZWMiKQorICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJiYXNlNjRfY29kZWMiKShTdHJpbmdJTy5TdHJpbmdJTyhzaW4pKQorICAgICAgICBzb3V0ID0gcmVhZGVyLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3V0LCAiXHg4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzb3V0LCBzdHIpCisKK2FsbF91bmljb2RlX2VuY29kaW5ncyA9IFsKKyAgICAiYXNjaWkiLAorICAgICJiYXNlNjRfY29kZWMiLAorICAgICJiaWc1IiwKKyAgICAiYmlnNWhrc2NzIiwKKyAgICAiY2hhcm1hcCIsCisgICAgImNwMDM3IiwKKyAgICAiY3AxMDA2IiwKKyAgICAiY3AxMDI2IiwKKyAgICAiY3AxMTQwIiwKKyAgICAiY3AxMjUwIiwKKyAgICAiY3AxMjUxIiwKKyAgICAiY3AxMjUyIiwKKyAgICAiY3AxMjUzIiwKKyAgICAiY3AxMjU0IiwKKyAgICAiY3AxMjU1IiwKKyAgICAiY3AxMjU2IiwKKyAgICAiY3AxMjU3IiwKKyAgICAiY3AxMjU4IiwKKyAgICAiY3A0MjQiLAorICAgICJjcDQzNyIsCisgICAgImNwNTAwIiwKKyAgICAiY3A3MjAiLAorICAgICJjcDczNyIsCisgICAgImNwNzc1IiwKKyAgICAiY3A4NTAiLAorICAgICJjcDg1MiIsCisgICAgImNwODU1IiwKKyAgICAiY3A4NTYiLAorICAgICJjcDg1NyIsCisgICAgImNwODU4IiwKKyAgICAiY3A4NjAiLAorICAgICJjcDg2MSIsCisgICAgImNwODYyIiwKKyAgICAiY3A4NjMiLAorICAgICJjcDg2NCIsCisgICAgImNwODY1IiwKKyAgICAiY3A4NjYiLAorICAgICJjcDg2OSIsCisgICAgImNwODc0IiwKKyAgICAiY3A4NzUiLAorICAgICJjcDkzMiIsCisgICAgImNwOTQ5IiwKKyAgICAiY3A5NTAiLAorICAgICJldWNfamlzXzIwMDQiLAorICAgICJldWNfamlzeDAyMTMiLAorICAgICJldWNfanAiLAorICAgICJldWNfa3IiLAorICAgICJnYjE4MDMwIiwKKyAgICAiZ2IyMzEyIiwKKyAgICAiZ2JrIiwKKyAgICAiaGV4X2NvZGVjIiwKKyAgICAiaHBfcm9tYW44IiwKKyAgICAiaHoiLAorICAgICJpZG5hIiwKKyAgICAiaXNvMjAyMl9qcCIsCisgICAgImlzbzIwMjJfanBfMSIsCisgICAgImlzbzIwMjJfanBfMiIsCisgICAgImlzbzIwMjJfanBfMjAwNCIsCisgICAgImlzbzIwMjJfanBfMyIsCisgICAgImlzbzIwMjJfanBfZXh0IiwKKyAgICAiaXNvMjAyMl9rciIsCisgICAgImlzbzg4NTlfMSIsCisgICAgImlzbzg4NTlfMTAiLAorICAgICJpc284ODU5XzExIiwKKyAgICAiaXNvODg1OV8xMyIsCisgICAgImlzbzg4NTlfMTQiLAorICAgICJpc284ODU5XzE1IiwKKyAgICAiaXNvODg1OV8xNiIsCisgICAgImlzbzg4NTlfMiIsCisgICAgImlzbzg4NTlfMyIsCisgICAgImlzbzg4NTlfNCIsCisgICAgImlzbzg4NTlfNSIsCisgICAgImlzbzg4NTlfNiIsCisgICAgImlzbzg4NTlfNyIsCisgICAgImlzbzg4NTlfOCIsCisgICAgImlzbzg4NTlfOSIsCisgICAgImpvaGFiIiwKKyAgICAia29pOF9yIiwKKyAgICAia29pOF91IiwKKyAgICAibGF0aW5fMSIsCisgICAgIm1hY19jeXJpbGxpYyIsCisgICAgIm1hY19ncmVlayIsCisgICAgIm1hY19pY2VsYW5kIiwKKyAgICAibWFjX2xhdGluMiIsCisgICAgIm1hY19yb21hbiIsCisgICAgIm1hY190dXJraXNoIiwKKyAgICAicGFsbW9zIiwKKyAgICAicHRjcDE1NCIsCisgICAgInB1bnljb2RlIiwKKyAgICAicmF3X3VuaWNvZGVfZXNjYXBlIiwKKyAgICAicm90XzEzIiwKKyAgICAic2hpZnRfamlzIiwKKyAgICAic2hpZnRfamlzXzIwMDQiLAorICAgICJzaGlmdF9qaXN4MDIxMyIsCisgICAgInRpc182MjAiLAorICAgICJ1bmljb2RlX2VzY2FwZSIsCisgICAgInVuaWNvZGVfaW50ZXJuYWwiLAorICAgICJ1dGZfMTYiLAorICAgICJ1dGZfMTZfYmUiLAorICAgICJ1dGZfMTZfbGUiLAorICAgICJ1dGZfNyIsCisgICAgInV0Zl84IiwKK10KKworaWYgaGFzYXR0cihjb2RlY3MsICJtYmNzX2VuY29kZSIpOgorICAgIGFsbF91bmljb2RlX2VuY29kaW5ncy5hcHBlbmQoIm1iY3MiKQorCisjIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzIHdvcmsgb25seSB3aXRoIHN0ciwgbm90IHVuaWNvZGUKK2FsbF9zdHJpbmdfZW5jb2RpbmdzID0gWworICAgICJxdW9wcmlfY29kZWMiLAorICAgICJzdHJpbmdfZXNjYXBlIiwKKyAgICAidXVfY29kZWMiLAorXQorCisjIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgaXMgbm90IHRlc3RlZCwgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3NlZAorIyB0byB3b3JrOgorIyAgICAidW5kZWZpbmVkIgorCisjIFRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzIGRvbid0IHdvcmsgaW4gc3RhdGVmdWwgbW9kZQorYnJva2VuX3VuaWNvZGVfd2l0aF9zdHJlYW1zID0gWworICAgICJiYXNlNjRfY29kZWMiLAorICAgICJoZXhfY29kZWMiLAorICAgICJwdW55Y29kZSIsCisgICAgInVuaWNvZGVfaW50ZXJuYWwiCitdCiticm9rZW5faW5jcmVtZW50YWxfY29kZXJzID0gYnJva2VuX3VuaWNvZGVfd2l0aF9zdHJlYW1zWzpdCisKKyMgVGhlIGZvbGxvd2luZyBlbmNvZGluZ3Mgb25seSBzdXBwb3J0ICJzdHJpY3QiIG1vZGUKK29ubHlfc3RyaWN0X21vZGUgPSBbCisgICAgImlkbmEiLAorICAgICJ6bGliX2NvZGVjIiwKKyAgICAiYnoyX2NvZGVjIiwKK10KKwordHJ5OgorICAgIGltcG9ydCBiejIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIGFsbF91bmljb2RlX2VuY29kaW5ncy5hcHBlbmQoImJ6Ml9jb2RlYyIpCisgICAgYnJva2VuX3VuaWNvZGVfd2l0aF9zdHJlYW1zLmFwcGVuZCgiYnoyX2NvZGVjIikKKwordHJ5OgorICAgIGltcG9ydCB6bGliCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBhbGxfdW5pY29kZV9lbmNvZGluZ3MuYXBwZW5kKCJ6bGliX2NvZGVjIikKKyAgICBicm9rZW5fdW5pY29kZV93aXRoX3N0cmVhbXMuYXBwZW5kKCJ6bGliX2NvZGVjIikKKworY2xhc3MgQmFzaWNVbmljb2RlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICBzID0gdSJhYmMxMjMiICMgYWxsIGNvZGVjcyBzaG91bGQgYmUgYWJsZSB0byBlbmNvZGUgdGhlc2UKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIGFsbF91bmljb2RlX2VuY29kaW5nczoKKyAgICAgICAgICAgIG5hbWUgPSBjb2RlY3MubG9va3VwKGVuY29kaW5nKS5uYW1lCisgICAgICAgICAgICBpZiBlbmNvZGluZy5lbmRzd2l0aCgiX2NvZGVjIik6CisgICAgICAgICAgICAgICAgbmFtZSArPSAiX2NvZGVjIgorICAgICAgICAgICAgZWxpZiBlbmNvZGluZyA9PSAibGF0aW5fMSI6CisgICAgICAgICAgICAgICAgbmFtZSA9ICJsYXRpbl8xIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGluZy5yZXBsYWNlKCJfIiwgIi0iKSwgbmFtZS5yZXBsYWNlKCJfIiwgIi0iKSkKKyAgICAgICAgICAgIChieXRlcywgc2l6ZSkgPSBjb2RlY3MuZ2V0ZW5jb2RlcihlbmNvZGluZykocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZSwgbGVuKHMpLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoc2l6ZSwgbGVuKHMpLCBlbmNvZGluZykpCisgICAgICAgICAgICAoY2hhcnMsIHNpemUpID0gY29kZWNzLmdldGRlY29kZXIoZW5jb2RpbmcpKGJ5dGVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFycywgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGNoYXJzLCBzLCBlbmNvZGluZykpCisKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIG5vdCBpbiBicm9rZW5fdW5pY29kZV93aXRoX3N0cmVhbXM6CisgICAgICAgICAgICAgICAgIyBjaGVjayBzdHJlYW0gcmVhZGVyL3dyaXRlcgorICAgICAgICAgICAgICAgIHEgPSBRdWV1ZSgpCisgICAgICAgICAgICAgICAgd3JpdGVyID0gY29kZWNzLmdldHdyaXRlcihlbmNvZGluZykocSkKKyAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ID0gIiIKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoYykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBxLnJlYWQoKQorICAgICAgICAgICAgICAgIHEgPSBRdWV1ZSgpCisgICAgICAgICAgICAgICAgcmVhZGVyID0gY29kZWNzLmdldHJlYWRlcihlbmNvZGluZykocSkKKyAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiCisgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgcS53cml0ZShjKQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IHJlYWRlci5yZWFkKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIG5vdCBpbiBicm9rZW5faW5jcmVtZW50YWxfY29kZXJzOgorICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyIChmZXRjaGVkIHZpYSB0aGUgUHl0aG9uCisgICAgICAgICAgICAgICAgIyBhbmQgQyBBUEkpIGFuZCBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykoKQorICAgICAgICAgICAgICAgICAgICBjZW5jb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGVuY29kZXIoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgZXhjZXB0IExvb2t1cEVycm9yOiAjIG5vIEluY3JlbWVudGFsRW5jb2RlcgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiCisgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHM6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IGVuY29kZXIuZW5jb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgKz0gZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykoKQorICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiCisgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIGVuY29kZWRyZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ICs9IGRlY29kZXIuZGVjb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKKworICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIEMgQVBJCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIgorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBjZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBjZGVjb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIKKyAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKGMpCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gY2RlY29kZXIuZGVjb2RlKCIiLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZWRyZXN1bHQsIHMsICIlciAhPSAlciAoZW5jb2Rpbmc9JXIpIiAlIChkZWNvZGVkcmVzdWx0LCBzLCBlbmNvZGluZykpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHUiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKGNvZGVjcy5pdGVyZW5jb2RlKHMsIGVuY29kaW5nKSwgZW5jb2RpbmcpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKHJlc3VsdCwgcywgZW5jb2RpbmcpKQorCisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaXRlcmVuY29kZSgpL2l0ZXJkZWNvZGUoKSB3aXRoIGVtcHR5IHN0cmluZworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB1IiIuam9pbihjb2RlY3MuaXRlcmRlY29kZShjb2RlY3MuaXRlcmVuY29kZSh1IiIsIGVuY29kaW5nKSwgZW5jb2RpbmcpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgdSIiKQorCisgICAgICAgICAgICAgICAgaWYgZW5jb2Rpbmcgbm90IGluIG9ubHlfc3RyaWN0X21vZGU6CisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyIHdpdGggZXJyb3JzIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKSgiaWdub3JlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNlbmNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZywgImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjogIyBubyBJbmNyZW1lbnRhbEVuY29kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgPSAiIi5qb2luKGVuY29kZXIuZW5jb2RlKGMpIGZvciBjIGluIHMpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykoImlnbm9yZSIpCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkcmVzdWx0ID0gdSIiLmpvaW4oZGVjb2Rlci5kZWNvZGUoYykgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKKworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiLmpvaW4oY2VuY29kZXIuZW5jb2RlKGMpIGZvciBjIGluIHMpCisgICAgICAgICAgICAgICAgICAgICAgICBjZGVjb2RlciA9IF90ZXN0Y2FwaS5jb2RlY19pbmNyZW1lbnRhbGRlY29kZXIoZW5jb2RpbmcsICJpZ25vcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIi5qb2luKGNkZWNvZGVyLmRlY29kZShjKSBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoZGVjb2RlZHJlc3VsdCwgcywgZW5jb2RpbmcpKQorCisgICAgZGVmIHRlc3Rfc2VlayhzZWxmKToKKyAgICAgICAgIyBhbGwgY29kZWNzIHNob3VsZCBiZSBhYmxlIHRvIGVuY29kZSB0aGVzZQorICAgICAgICBzID0gdSIlc1xuJXNcbiIgJSAoMTAwKnUiYWJjMTIzIiwgMTAwKnUiZGVmNDU2IikKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIGFsbF91bmljb2RlX2VuY29kaW5nczoKKyAgICAgICAgICAgIGlmIGVuY29kaW5nID09ICJpZG5hIjogIyBGSVhNRTogU2VlIFNGIGJ1ZyAjMTE2MzE3OAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBlbmNvZGluZyBpbiBicm9rZW5fdW5pY29kZV93aXRoX3N0cmVhbXM6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoZW5jb2RpbmcpKFN0cmluZ0lPLlN0cmluZ0lPKHMuZW5jb2RlKGVuY29kaW5nKSkpCisgICAgICAgICAgICBmb3IgdCBpbiB4cmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgIyBUZXN0IHRoYXQgY2FsbGluZyBzZWVrIHJlc2V0cyB0aGUgaW50ZXJuYWwgY29kZWMgc3RhdGUgYW5kIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICByZWFkZXIuc2VlaygwLCAwKQorICAgICAgICAgICAgICAgIGxpbmUgPSByZWFkZXIucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1s6bGVuKGxpbmUpXSwgbGluZSkKKworICAgIGRlZiB0ZXN0X2JhZF9kZWNvZGVfYXJncyhzZWxmKToKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIGFsbF91bmljb2RlX2VuY29kaW5nczoKKyAgICAgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0ZGVjb2RlcihlbmNvZGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVjb2RlcikKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIG5vdCBpbiAoImlkbmEiLCAicHVueWNvZGUiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlY29kZXIsIDQyKQorCisgICAgZGVmIHRlc3RfYmFkX2VuY29kZV9hcmdzKHNlbGYpOgorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYWxsX3VuaWNvZGVfZW5jb2RpbmdzOgorICAgICAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRlbmNvZGVyKGVuY29kaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlbmNvZGVyKQorCisgICAgZGVmIHRlc3RfZW5jb2RpbmdfbWFwX3R5cGVfaW5pdGlhbGl6ZWQoc2VsZik6CisgICAgICAgIGZyb20gZW5jb2RpbmdzIGltcG9ydCBjcDExNDAKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gY3Jhc2gsIHdlIGFyZSBvbmx5IHZlcmlmeWluZyB0aGVyZSdzIG5vIGNyYXNoLgorICAgICAgICB0YWJsZV90eXBlID0gdHlwZShjcDExNDAuZW5jb2RpbmdfdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFibGVfdHlwZSwgdGFibGVfdHlwZSkKKworY2xhc3MgQmFzaWNTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIHMgPSAiYWJjMTIzIgorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gYWxsX3N0cmluZ19lbmNvZGluZ3M6CisgICAgICAgICAgICAoYnl0ZXMsIHNpemUpID0gY29kZWNzLmdldGVuY29kZXIoZW5jb2RpbmcpKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemUsIGxlbihzKSkKKyAgICAgICAgICAgIChjaGFycywgc2l6ZSkgPSBjb2RlY3MuZ2V0ZGVjb2RlcihlbmNvZGluZykoYnl0ZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoYXJzLCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoY2hhcnMsIHMsIGVuY29kaW5nKSkKKworY2xhc3MgQ2hhcm1hcFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2RlY29kZV93aXRoX3N0cmluZ19tYXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLCB1ImFiYyIpLAorICAgICAgICAgICAgKHUiYWJjIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgYiJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwgdSJhYiIKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLCB1ImFiXHVmZmZlIgorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInJlcGxhY2UiLCB1ImFiIiksCisgICAgICAgICAgICAodSJhYlx1ZmZmZCIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAicmVwbGFjZSIsIHUiYWJcdWZmZmUiKSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJpZ25vcmUiLCB1ImFiIiksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAiaWdub3JlIiwgdSJhYlx1ZmZmZSIpLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgYWxsYnl0ZXMgPSAiIi5qb2luKGNocihpKSBmb3IgaSBpbiB4cmFuZ2UoMjU2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZShhbGxieXRlcywgImlnbm9yZSIsIHUiIiksCisgICAgICAgICAgICAodSIiLCBsZW4oYWxsYnl0ZXMpKQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfd2l0aF9pbnQyc3RyX21hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnYyd9KSwKKyAgICAgICAgICAgICh1ImFiYyIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdBYScsIDE6IHUnQmInLCAyOiB1J0NjJ30pLAorICAgICAgICAgICAgKHUiQWFCYkNjIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J1xVMDAxMEZGRkYnLCAxOiB1J2InLCAyOiB1J2MnfSksCisgICAgICAgICAgICAodSJcVTAwMTBGRkZGYmMiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnJ30pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InfQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiBOb25lfQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTQ4NTAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiB1J1x1ZmZmZSd9CisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYid9KSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJywgMjogTm9uZX0pLAorICAgICAgICAgICAgKHUiYWJcdWZmZmQiLCAzKQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTQ4NTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInJlcGxhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InLCAyOiB1J1x1ZmZmZSd9KSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiB1J2EnLCAxOiB1J2InfSksCisgICAgICAgICAgICAodSJhYiIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogdSdhJywgMTogdSdiJywgMjogTm9uZX0pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTQ4NTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IHUnYScsIDE6IHUnYicsIDI6IHUnXHVmZmZlJ30pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgYWxsYnl0ZXMgPSAiIi5qb2luKGNocihpKSBmb3IgaSBpbiB4cmFuZ2UoMjU2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZShhbGxieXRlcywgImlnbm9yZSIsIHt9KSwKKyAgICAgICAgICAgICh1IiIsIGxlbihhbGxieXRlcykpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2RlY29kZV93aXRoX2ludDJpbnRfbWFwKHNlbGYpOgorICAgICAgICBhID0gb3JkKHUnYScpCisgICAgICAgIGIgPSBvcmQodSdiJykKKyAgICAgICAgYyA9IG9yZCh1J2MnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiBhLCAxOiBiLCAyOiBjfSksCisgICAgICAgICAgICAodSJhYmMiLCAzKQorICAgICAgICApCisKKyAgICAgICAgIyBJc3N1ZSAjMTUzNzkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IDB4MTBGRkZGLCAxOiBiLCAyOiBjfSksCisgICAgICAgICAgICAodSJcVTAwMTBGRkZGYmMiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlLCAiXHgwMFx4MDFceDAyIiwgInN0cmljdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHswOiAweDExMDAwMCwgMTogYiwgMjogY30KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSwgIlx4MDBceDAxXHgwMiIsICJzdHJpY3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYn0sCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUsICJceDAwXHgwMVx4MDIiLCAic3RyaWN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IGEsIDE6IGIsIDI6IDB4RkZGRX0sCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAicmVwbGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IGEsIDE6IGJ9KSwKKyAgICAgICAgICAgICh1ImFiXHVmZmZkIiwgMykKKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjb2RlY3MuY2hhcm1hcF9kZWNvZGUoIlx4MDBceDAxXHgwMiIsICJyZXBsYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYiwgMjogMHhGRkZFfSksCisgICAgICAgICAgICAodSJhYlx1ZmZmZCIsIDMpCisgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29kZWNzLmNoYXJtYXBfZGVjb2RlKCJceDAwXHgwMVx4MDIiLCAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MDogYSwgMTogYn0pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvZGVjcy5jaGFybWFwX2RlY29kZSgiXHgwMFx4MDFceDAyIiwgImlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezA6IGEsIDE6IGIsIDI6IDB4RkZGRX0pLAorICAgICAgICAgICAgKHUiYWIiLCAzKQorICAgICAgICApCisKKworY2xhc3MgV2l0aFN0bXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbmNvZGVkZmlsZShzZWxmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCJceGMzXHhiYyIpCisgICAgICAgIHdpdGggY29kZWNzLkVuY29kZWRGaWxlKGYsICJsYXRpbi0xIiwgInV0Zi04IikgYXMgZWY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVmLnJlYWQoKSwgIlx4ZmMiKQorCisgICAgZGVmIHRlc3Rfc3RyZWFtcmVhZGVyd3JpdGVyKHNlbGYpOgorICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oIlx4YzNceGJjIikKKyAgICAgICAgaW5mbyA9IGNvZGVjcy5sb29rdXAoInV0Zi04IikKKyAgICAgICAgd2l0aCBjb2RlY3MuU3RyZWFtUmVhZGVyV3JpdGVyKGYsIGluZm8uc3RyZWFtcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zdHJlYW13cml0ZXIsICdzdHJpY3QnKSBhcyBzcnc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNydy5yZWFkKCksIHUiXHhmYyIpCisKKworY2xhc3MgVW5pY29kZUVzY2FwZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy51bmljb2RlX2VzY2FwZV9lbmNvZGUodSIiKSwgKCIiLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlKCIiKSwgKHUiIiwgMCkpCisKKyAgICBkZWYgdGVzdF9yYXdfZW5jb2RlKHNlbGYpOgorICAgICAgICBlbmNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZW5jb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDMyLCAxMjcpOgorICAgICAgICAgICAgaWYgYiAhPSBvcmQoJ1xcJyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGUodW5pY2hyKGIpKSwgKGNocihiKSwgMSkpCisKKyAgICBkZWYgdGVzdF9yYXdfZGVjb2RlKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZGVjb2RlCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpZiBiICE9IG9yZCgnXFwnKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShjaHIoYikgKyAnMCcpLCAodW5pY2hyKGIpICsgdScwJywgMikpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVfZW5jb2RlKHNlbGYpOgorICAgICAgICBlbmNvZGUgPSBjb2RlY3MudW5pY29kZV9lc2NhcGVfZW5jb2RlCisgICAgICAgIGNoZWNrID0gY29kaW5nX2NoZWNrZXIoc2VsZiwgZW5jb2RlKQorICAgICAgICBjaGVjayh1J1x0JywgcidcdCcpCisgICAgICAgIGNoZWNrKHUnXG4nLCByJ1xuJykKKyAgICAgICAgY2hlY2sodSdccicsIHInXHInKQorICAgICAgICBjaGVjayh1J1xcJywgcidcXCcpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDMyKToKKyAgICAgICAgICAgIGlmIGNocihiKSBub3QgaW4gJ1x0XG5ccic6CisgICAgICAgICAgICAgICAgY2hlY2sodW5pY2hyKGIpLCAnXFx4JTAyeCcgJSBiKQorICAgICAgICBmb3IgYiBpbiByYW5nZSgxMjcsIDI1Nik6CisgICAgICAgICAgICBjaGVjayh1bmljaHIoYiksICdcXHglMDJ4JyAlIGIpCisgICAgICAgIGNoZWNrKHUnXHUyMGFjJywgcidcdTIwYWMnKQorICAgICAgICBjaGVjayh1J1xVMDAwMWQxMjAnLCByJ1xVMDAwMWQxMjAnKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2RlY29kZShzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBjaGVjayA9IGNvZGluZ19jaGVja2VyKHNlbGYsIGRlY29kZSkKKyAgICAgICAgY2hlY2soIltcXFxuXSIsIHUiW10iKQorICAgICAgICBjaGVjayhyJ1tcIl0nLCB1J1siXScpCisgICAgICAgIGNoZWNrKHIiW1wnXSIsIHUiWyddIikKKyAgICAgICAgY2hlY2sociJbXFxdIiwgdXIiW1xdIikKKyAgICAgICAgY2hlY2sociJbXGFdIiwgdSJbXHgwN10iKQorICAgICAgICBjaGVjayhyIltcYl0iLCB1IltceDA4XSIpCisgICAgICAgIGNoZWNrKHIiW1x0XSIsIHUiW1x4MDldIikKKyAgICAgICAgY2hlY2sociJbXG5dIiwgdSJbXHgwYV0iKQorICAgICAgICBjaGVjayhyIltcdl0iLCB1IltceDBiXSIpCisgICAgICAgIGNoZWNrKHIiW1xmXSIsIHUiW1x4MGNdIikKKyAgICAgICAgY2hlY2sociJbXHJdIiwgdSJbXHgwZF0iKQorICAgICAgICBjaGVjayhyIltcN10iLCB1IltceDA3XSIpCisgICAgICAgIGNoZWNrKHIiW1w4XSIsIHVyIltcOF0iKQorICAgICAgICBjaGVjayhyIltcNzhdIiwgdSJbXHgwNzhdIikKKyAgICAgICAgY2hlY2sociJbXDQxXSIsIHUiWyFdIikKKyAgICAgICAgY2hlY2sociJbXDQxOF0iLCB1IlshOF0iKQorICAgICAgICBjaGVjayhyIltcMTAxXSIsIHUiW0FdIikKKyAgICAgICAgY2hlY2sociJbXDEwMTBdIiwgdSJbQTBdIikKKyAgICAgICAgY2hlY2sociJbXHg0MV0iLCB1IltBXSIpCisgICAgICAgIGNoZWNrKHIiW1x4NDEwXSIsIHUiW0EwXSIpCisgICAgICAgIGNoZWNrKHIiXHUyMGFjIiwgdSJcdTIwYWMiKQorICAgICAgICBjaGVjayhyIlxVMDAwMWQxMjAiLCB1IlxVMDAwMWQxMjAiKQorICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgaWYgY2hyKGIpIG5vdCBpbiAnXG4iXCdcXGFidG52ZnIwMTIzNDU2N3h1VU4nOgorICAgICAgICAgICAgICAgIGNoZWNrKCdcXCcgKyBjaHIoYiksIHUnXFwnICsgdW5pY2hyKGIpKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9ycyhzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnVuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBmb3IgYywgZCBpbiAoJ3gnLCAyKSwgKCd1JywgNCksICgnVScsIDQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcIiArIGMgKyAiMCIqaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW1xcIiArIGMgKyAiMCIqaSArICJdIikKKyAgICAgICAgICAgICAgICBkYXRhID0gIltcXCIgKyBjICsgIjAiKmkgKyAiXVxcIiArIGMgKyAiMCIqaQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJpZ25vcmUiKSwgKHUiW10iLCBsZW4oZGF0YSkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodSJbXHVmZmZkXVx1ZmZmZCIsIGxlbihkYXRhKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2RlLCByIlxVMDAxMTAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShyIlxVMDAxMTAwMDAiLCAiaWdub3JlIiksICh1IiIsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUociJcVTAwMTEwMDAwIiwgInJlcGxhY2UiKSwgKHUiXHVmZmZkIiwgMTApKQorCisKK2NsYXNzIFJhd1VuaWNvZGVFc2NhcGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZSh1IiIpLCAoIiIsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGVjcy5yYXdfdW5pY29kZV9lc2NhcGVfZGVjb2RlKCIiKSwgKHUiIiwgMCkpCisKKyAgICBkZWYgdGVzdF9yYXdfZW5jb2RlKHNlbGYpOgorICAgICAgICBlbmNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2VuY29kZQorICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGUodW5pY2hyKGIpKSwgKGNocihiKSwgMSkpCisKKyAgICBkZWYgdGVzdF9yYXdfZGVjb2RlKHNlbGYpOgorICAgICAgICBkZWNvZGUgPSBjb2RlY3MucmF3X3VuaWNvZGVfZXNjYXBlX2RlY29kZQorICAgICAgICBmb3IgYiBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUoY2hyKGIpICsgJzAnKSwgKHVuaWNocihiKSArIHUnMCcsIDIpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2VuY29kZShzZWxmKToKKyAgICAgICAgZW5jb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9lbmNvZGUKKyAgICAgICAgY2hlY2sgPSBjb2RpbmdfY2hlY2tlcihzZWxmLCBlbmNvZGUpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpZiBjaHIoYikgbm90IGluICd1VSc6CisgICAgICAgICAgICAgICAgY2hlY2sodSdcXCcgKyB1bmljaHIoYiksICdcXCcgKyBjaHIoYikpCisgICAgICAgIGNoZWNrKHUnXHUyMGFjJywgcidcdTIwYWMnKQorICAgICAgICBjaGVjayh1J1xVMDAwMWQxMjAnLCByJ1xVMDAwMWQxMjAnKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2RlY29kZShzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUKKyAgICAgICAgY2hlY2sgPSBjb2RpbmdfY2hlY2tlcihzZWxmLCBkZWNvZGUpCisgICAgICAgIGZvciBiIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBpZiBjaHIoYikgbm90IGluICd1VSc6CisgICAgICAgICAgICAgICAgY2hlY2soJ1xcJyArIGNocihiKSwgdSdcXCcgKyB1bmljaHIoYikpCisgICAgICAgIGNoZWNrKHIiXHUyMGFjIiwgdSJcdTIwYWMiKQorICAgICAgICBjaGVjayhyIlxVMDAwMWQxMjAiLCB1IlxVMDAwMWQxMjAiKQorCisgICAgZGVmIHRlc3RfZGVjb2RlX2Vycm9ycyhzZWxmKToKKyAgICAgICAgZGVjb2RlID0gY29kZWNzLnJhd191bmljb2RlX2VzY2FwZV9kZWNvZGUKKyAgICAgICAgZm9yIGMsIGQgaW4gKCd1JywgNCksICgnVScsIDQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxcIiArIGMgKyAiMCIqaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW1xcIiArIGMgKyAiMCIqaSArICJdIikKKyAgICAgICAgICAgICAgICBkYXRhID0gIltcXCIgKyBjICsgIjAiKmkgKyAiXVxcIiArIGMgKyAiMCIqaQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJpZ25vcmUiKSwgKHUiW10iLCBsZW4oZGF0YSkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlKGRhdGEsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodSJbXHVmZmZkXVx1ZmZmZCIsIGxlbihkYXRhKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgZGVjb2RlLCByIlxVMDAxMTAwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZShyIlxVMDAxMTAwMDAiLCAiaWdub3JlIiksICh1IiIsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUociJcVTAwMTEwMDAwIiwgInJlcGxhY2UiKSwgKHUiXHVmZmZkIiwgMTApKQorCisKK2NsYXNzIEJvbVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3NlZWswKHNlbGYpOgorICAgICAgICBkYXRhID0gdSIxMjM0NTY3ODkwIgorICAgICAgICB0ZXN0cyA9ICgidXRmLTE2IiwKKyAgICAgICAgICAgICAgICAgInV0Zi0xNi1sZSIsCisgICAgICAgICAgICAgICAgICJ1dGYtMTYtYmUiLAorICAgICAgICAgICAgICAgICAidXRmLTMyIiwKKyAgICAgICAgICAgICAgICAgInV0Zi0zMi1sZSIsCisgICAgICAgICAgICAgICAgICJ1dGYtMzItYmUiKQorICAgICAgICBzZWxmLmFkZENsZWFudXAodGVzdF9zdXBwb3J0LnVubGluaywgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIHRlc3RzOgorICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgQk9NIGlzIHdyaXR0ZW4gb25seSBvbmNlCisgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZGF0YSAqIDIpCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZGF0YSAqIDIpCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgQk9NIGlzIHdyaXR0ZW4gYWZ0ZXIgYSBzZWVrKDApCisgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YVswXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGYudGVsbCgpLCAwKQorICAgICAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkYXRhKQorCisgICAgICAgICAgICAjIChTdHJlYW1Xcml0ZXIpIENoZWNrIHRoYXQgdGhlIEJPTSBpcyB3cml0dGVuIGFmdGVyIGEgc2VlaygwKQorICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndysnLCBlbmNvZGluZz1lbmNvZGluZykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlci53cml0ZShkYXRhWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZi53cml0ZXIudGVsbCgpLCAwKQorICAgICAgICAgICAgICAgIGYud3JpdGVyLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBmLndyaXRlci53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGRhdGEpCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgQk9NIGlzIG5vdCB3cml0dGVuIGFmdGVyIGEgc2VlaygpIGF0IGEgcG9zaXRpb24KKyAgICAgICAgICAgICMgZGlmZmVyZW50IHRoYW4gdGhlIHN0YXJ0CisgICAgICAgICAgICB3aXRoIGNvZGVjcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycsIGVuY29kaW5nPWVuY29kaW5nKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICBmLnNlZWsoZi50ZWxsKCkpCisgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGRhdGEgKiAyKQorCisgICAgICAgICAgICAjIChTdHJlYW1Xcml0ZXIpIENoZWNrIHRoYXQgdGhlIEJPTSBpcyBub3Qgd3JpdHRlbiBhZnRlciBhIHNlZWsoKQorICAgICAgICAgICAgIyBhdCBhIHBvc2l0aW9uIGRpZmZlcmVudCB0aGFuIHRoZSBzdGFydAorICAgICAgICAgICAgd2l0aCBjb2RlY3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndysnLCBlbmNvZGluZz1lbmNvZGluZykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlci53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGYud3JpdGVyLnNlZWsoZi53cml0ZXIudGVsbCgpKQorICAgICAgICAgICAgICAgIGYud3JpdGVyLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZGF0YSAqIDIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFVURjMyVGVzdCwKKyAgICAgICAgVVRGMzJMRVRlc3QsCisgICAgICAgIFVURjMyQkVUZXN0LAorICAgICAgICBVVEYxNlRlc3QsCisgICAgICAgIFVURjE2TEVUZXN0LAorICAgICAgICBVVEYxNkJFVGVzdCwKKyAgICAgICAgVVRGOFRlc3QsCisgICAgICAgIFVURjhTaWdUZXN0LAorICAgICAgICBVVEY3VGVzdCwKKyAgICAgICAgVVRGMTZFeFRlc3QsCisgICAgICAgIFJlYWRCdWZmZXJUZXN0LAorICAgICAgICBDaGFyQnVmZmVyVGVzdCwKKyAgICAgICAgRXNjYXBlRGVjb2RlVGVzdCwKKyAgICAgICAgUmVjb2RpbmdUZXN0LAorICAgICAgICBQdW55Y29kZVRlc3QsCisgICAgICAgIFVuaWNvZGVJbnRlcm5hbFRlc3QsCisgICAgICAgIE5hbWVwcmVwVGVzdCwKKyAgICAgICAgSUROQUNvZGVjVGVzdCwKKyAgICAgICAgQ29kZWNzTW9kdWxlVGVzdCwKKyAgICAgICAgU3RyZWFtUmVhZGVyVGVzdCwKKyAgICAgICAgRW5jb2RlZEZpbGVUZXN0LAorICAgICAgICBTdHIyU3RyVGVzdCwKKyAgICAgICAgQmFzaWNVbmljb2RlVGVzdCwKKyAgICAgICAgQmFzaWNTdHJUZXN0LAorICAgICAgICBDaGFybWFwVGVzdCwKKyAgICAgICAgV2l0aFN0bXRUZXN0LAorICAgICAgICBVbmljb2RlRXNjYXBlVGVzdCwKKyAgICAgICAgUmF3VW5pY29kZUVzY2FwZVRlc3QsCisgICAgICAgIEJvbVRlc3QsCisgICAgKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWMyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVjcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMWMyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RlY3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGNkM2NlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kZW9wLnB5CkBAIC0wLDAgKzEsMzA0IEBACisiIiIKKyAgIFRlc3QgY2FzZXMgZm9yIGNvZGVvcC5weQorICAgTmljayBNYXRoZXdzb24KKyIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGlzX2p5dGhvbgorCitmcm9tIGNvZGVvcCBpbXBvcnQgY29tcGlsZV9jb21tYW5kLCBQeUNGX0RPTlRfSU1QTFlfREVERU5UCisKK2lmIGlzX2p5dGhvbjoKKyAgICBpbXBvcnQgc3lzCisgICAgaW1wb3J0IGNTdHJpbmdJTworCisgICAgZGVmIHVuaWZ5X2NhbGxhYmxlcyhkKToKKyAgICAgICAgZm9yIG4sdiBpbiBkLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBjYWxsYWJsZSh2KToKKyAgICAgICAgICAgICAgICBkW25dID0gY2FsbGFibGUKKyAgICAgICAgcmV0dXJuIGQKKworY2xhc3MgQ29kZW9wVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydFZhbGlkKHNlbGYsIHN0ciwgc3ltYm9sPSdzaW5nbGUnKToKKyAgICAgICAgJycnc3VjY2VlZCBpZmYgc3RyIGlzIGEgdmFsaWQgcGllY2Ugb2YgY29kZScnJworICAgICAgICBpZiBpc19qeXRob246CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZV9jb21tYW5kKHN0ciwgIjxpbnB1dD4iLCBzeW1ib2wpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY29kZSkKKyAgICAgICAgICAgIGlmIHN5bWJvbCA9PSAic2luZ2xlIjoKKyAgICAgICAgICAgICAgICBkLHIgPSB7fSx7fQorICAgICAgICAgICAgICAgIHNhdmVkX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBkCisgICAgICAgICAgICAgICAgICAgIGV4ZWMgY29tcGlsZShzdHIsIjxpbnB1dD4iLCJzaW5nbGUiKSBpbiByCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVkX3N0ZG91dAorICAgICAgICAgICAgZWxpZiBzeW1ib2wgPT0gJ2V2YWwnOgorICAgICAgICAgICAgICAgIGN0eCA9IHsnYSc6IDJ9CisgICAgICAgICAgICAgICAgZCA9IHsgJ3ZhbHVlJzogZXZhbChjb2RlLGN0eCkgfQorICAgICAgICAgICAgICAgIHIgPSB7ICd2YWx1ZSc6IGV2YWwoc3RyLGN0eCkgfQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmlmeV9jYWxsYWJsZXMociksdW5pZnlfY2FsbGFibGVzKGQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjb21waWxlKHN0ciwgIjxpbnB1dD4iLCBzeW1ib2wsIFB5Q0ZfRE9OVF9JTVBMWV9ERURFTlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBpbGVfY29tbWFuZChzdHIsICI8aW5wdXQ+Iiwgc3ltYm9sKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgYXNzZXJ0SW5jb21wbGV0ZShzZWxmLCBzdHIsIHN5bWJvbD0nc2luZ2xlJyk6CisgICAgICAgICcnJ3N1Y2NlZWQgaWZmIHN0ciBpcyB0aGUgc3RhcnQgb2YgYSB2YWxpZCBwaWVjZSBvZiBjb2RlJycnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGlsZV9jb21tYW5kKHN0ciwgc3ltYm9sPXN5bWJvbCksIE5vbmUpCisKKyAgICBkZWYgYXNzZXJ0SW52YWxpZChzZWxmLCBzdHIsIHN5bWJvbD0nc2luZ2xlJywgaXNfc3ludGF4PTEpOgorICAgICAgICAnJydzdWNjZWVkIGlmZiBzdHIgaXMgdGhlIHN0YXJ0IG9mIGFuIGludmFsaWQgcGllY2Ugb2YgY29kZScnJworICAgICAgICB0cnk6CisgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQoc3RyLHN5bWJvbD1zeW1ib2wpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQgZm9yIGludmFsaWQgY29kZSIpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19zeW50YXgpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19zeW50YXgpCisKKyAgICBkZWYgdGVzdF92YWxpZChzZWxmKToKKyAgICAgICAgYXYgPSBzZWxmLmFzc2VydFZhbGlkCisKKyAgICAgICAgIyBzcGVjaWFsIGNhc2UKKyAgICAgICAgaWYgbm90IGlzX2p5dGhvbjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGlsZV9jb21tYW5kKCIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZSgicGFzcyIsICI8aW5wdXQ+IiwgJ3NpbmdsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDRl9ET05UX0lNUExZX0RFREVOVCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBpbGVfY29tbWFuZCgiXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZSgicGFzcyIsICI8aW5wdXQ+IiwgJ3NpbmdsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlDRl9ET05UX0lNUExZX0RFREVOVCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhdigiIikKKyAgICAgICAgICAgIGF2KCJcbiIpCisKKyAgICAgICAgYXYoImEgPSAxIikKKyAgICAgICAgYXYoIlxuYSA9IDEiKQorICAgICAgICBhdigiYSA9IDFcbiIpCisgICAgICAgIGF2KCJhID0gMVxuXG4iKQorICAgICAgICBhdigiXG5cbmEgPSAxXG5cbiIpCisKKyAgICAgICAgYXYoImRlZiB4KCk6XG4gIHBhc3NcbiIpCisgICAgICAgIGF2KCJpZiAxOlxuIHBhc3NcbiIpCisKKyAgICAgICAgYXYoIlxuXG5pZiAxOiBwYXNzXG4iKQorICAgICAgICBhdigiXG5cbmlmIDE6IHBhc3NcblxuIikKKworICAgICAgICBhdigiZGVmIHgoKTpcblxuIHBhc3NcbiIpCisgICAgICAgIGF2KCJkZWYgeCgpOlxuICBwYXNzXG4gIFxuIikKKyAgICAgICAgYXYoImRlZiB4KCk6XG4gIHBhc3NcbiBcbiIpCisKKyAgICAgICAgYXYoInBhc3NcbiIpCisgICAgICAgIGF2KCIzKiozXG4iKQorCisgICAgICAgIGF2KCJpZiA5PT0zOlxuICAgcGFzc1xuZWxzZTpcbiAgIHBhc3NcbiIpCisgICAgICAgIGF2KCJpZiAxOlxuIHBhc3NcbiBpZiAxOlxuICBwYXNzXG4gZWxzZTpcbiAgcGFzc1xuIikKKworICAgICAgICBhdigiI2FcbiNiXG5hID0gM1xuIikKKyAgICAgICAgYXYoIiNhXG5cbiAgIFxuYT0zXG4iKQorICAgICAgICBhdigiYT0zXG5cbiIpCisgICAgICAgIGF2KCJhID0gOSsgXFxcbjMiKQorCisgICAgICAgIGF2KCIzKiozIiwiZXZhbCIpCisgICAgICAgIGF2KCIobGFtYmRhIHo6IFxuIHoqKjMpIiwiZXZhbCIpCisKKyAgICAgICAgYXYoIjkrIFxcXG4zIiwiZXZhbCIpCisgICAgICAgIGF2KCI5KyBcXFxuM1xuIiwiZXZhbCIpCisKKyAgICAgICAgYXYoIlxuXG5hKiozIiwiZXZhbCIpCisgICAgICAgIGF2KCJcbiBcbmEqKjMiLCJldmFsIikKKyAgICAgICAgYXYoIiNhXG4jYlxuYSoqMyIsImV2YWwiKQorCisgICAgICAgIGF2KCJcblxuYSA9IDFcblxuIikKKyAgICAgICAgYXYoIlxuXG5pZiAxOiBhPTFcblxuIikKKworICAgICAgICBhdigiaWYgMTpcbiBwYXNzXG4gaWYgMTpcbiAgcGFzc1xuIGVsc2U6XG4gIHBhc3NcbiIpCisgICAgICAgIGF2KCIjYVxuXG4gICBcbmE9M1xuXG4iKQorCisgICAgICAgIGF2KCJcblxuYSoqMyIsImV2YWwiKQorICAgICAgICBhdigiXG4gXG5hKiozIiwiZXZhbCIpCisgICAgICAgIGF2KCIjYVxuI2JcbmEqKjMiLCJldmFsIikKKworICAgICAgICBhdigiZGVmIGYoKTpcbiB0cnk6IHBhc3NcbiBmaW5hbGx5OiBbeCBmb3IgeCBpbiAoMSwyKV1cbiIpCisgICAgICAgIGF2KCJkZWYgZigpOlxuIHBhc3NcbiNmb29cbiIpCisgICAgICAgIGF2KCJAYS5iLmNcbmRlZiBmKCk6XG4gcGFzc1xuIikKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGUoc2VsZik6CisgICAgICAgIGFpID0gc2VsZi5hc3NlcnRJbmNvbXBsZXRlCisKKyAgICAgICAgYWkoIihhICoqIikKKyAgICAgICAgYWkoIihhLGIsIikKKyAgICAgICAgYWkoIihhLGIsKCIpCisgICAgICAgIGFpKCIoYSxiLCgiKQorICAgICAgICBhaSgiYSA9ICgiKQorICAgICAgICBhaSgiYSA9IHsiKQorICAgICAgICBhaSgiYiArIHsiKQorCisgICAgICAgIGFpKCJpZiA5PT0zOlxuICAgcGFzc1xuZWxzZToiKQorICAgICAgICBhaSgiaWYgOT09MzpcbiAgIHBhc3NcbmVsc2U6XG4iKQorICAgICAgICBhaSgiaWYgOT09MzpcbiAgIHBhc3NcbmVsc2U6XG4gICBwYXNzIikKKyAgICAgICAgYWkoImlmIDE6IikKKyAgICAgICAgYWkoImlmIDE6XG4iKQorICAgICAgICBhaSgiaWYgMTpcbiBwYXNzXG4gaWYgMTpcbiAgcGFzc1xuIGVsc2U6IikKKyAgICAgICAgYWkoImlmIDE6XG4gcGFzc1xuIGlmIDE6XG4gIHBhc3NcbiBlbHNlOlxuIikKKyAgICAgICAgYWkoImlmIDE6XG4gcGFzc1xuIGlmIDE6XG4gIHBhc3NcbiBlbHNlOlxuICBwYXNzIikKKworICAgICAgICBhaSgiZGVmIHgoKToiKQorICAgICAgICBhaSgiZGVmIHgoKTpcbiIpCisgICAgICAgIGFpKCJkZWYgeCgpOlxuXG4iKQorCisgICAgICAgIGFpKCJkZWYgeCgpOlxuICBwYXNzIikKKyAgICAgICAgYWkoImRlZiB4KCk6XG4gIHBhc3NcbiAiKQorICAgICAgICBhaSgiZGVmIHgoKTpcbiAgcGFzc1xuICAiKQorICAgICAgICBhaSgiXG5cbmRlZiB4KCk6XG4gIHBhc3MiKQorCisgICAgICAgIGFpKCJhID0gOSsgXFwiKQorICAgICAgICBhaSgiYSA9ICdhXFwiKQorICAgICAgICBhaSgiYSA9ICcnJ3h5IikKKworICAgICAgICBhaSgiIiwiZXZhbCIpCisgICAgICAgIGFpKCJcbiIsImV2YWwiKQorICAgICAgICBhaSgiKCIsImV2YWwiKQorICAgICAgICBhaSgiKFxuXG5cbiIsImV2YWwiKQorICAgICAgICBhaSgiKDkrIiwiZXZhbCIpCisgICAgICAgIGFpKCI5KyBcXCIsImV2YWwiKQorICAgICAgICBhaSgibGFtYmRhIHo6IFxcIiwiZXZhbCIpCisKKyAgICAgICAgYWkoImlmIFRydWU6XG4gaWYgVHJ1ZTpcbiAgaWYgVHJ1ZTogICBcbiIpCisKKyAgICAgICAgYWkoIkBhKCIpCisgICAgICAgIGFpKCJAYShiIikKKyAgICAgICAgYWkoIkBhKGIsIikKKyAgICAgICAgYWkoIkBhKGIsYyIpCisgICAgICAgIGFpKCJAYShiLGMsIikKKworICAgICAgICBhaSgiZnJvbSBhIGltcG9ydCAoIikKKyAgICAgICAgYWkoImZyb20gYSBpbXBvcnQgKGIiKQorICAgICAgICBhaSgiZnJvbSBhIGltcG9ydCAoYiwiKQorICAgICAgICBhaSgiZnJvbSBhIGltcG9ydCAoYixjIikKKyAgICAgICAgYWkoImZyb20gYSBpbXBvcnQgKGIsYywiKQorCisgICAgICAgIGFpKCJbIik7CisgICAgICAgIGFpKCJbYSIpOworICAgICAgICBhaSgiW2EsIik7CisgICAgICAgIGFpKCJbYSxiIik7CisgICAgICAgIGFpKCJbYSxiLCIpOworCisgICAgICAgIGFpKCJ7Iik7CisgICAgICAgIGFpKCJ7YSIpOworICAgICAgICBhaSgie2E6Iik7CisgICAgICAgIGFpKCJ7YTpiIik7CisgICAgICAgIGFpKCJ7YTpiLCIpOworICAgICAgICBhaSgie2E6YixjIik7CisgICAgICAgIGFpKCJ7YTpiLGM6Iik7CisgICAgICAgIGFpKCJ7YTpiLGM6ZCIpOworICAgICAgICBhaSgie2E6YixjOmQsIik7CisKKyAgICAgICAgYWkoImEoIikKKyAgICAgICAgYWkoImEoYiIpCisgICAgICAgIGFpKCJhKGIsIikKKyAgICAgICAgYWkoImEoYixjIikKKyAgICAgICAgYWkoImEoYixjLCIpCisKKyAgICAgICAgYWkoImFbIikKKyAgICAgICAgYWkoImFbYiIpCisgICAgICAgIGFpKCJhW2IsIikKKyAgICAgICAgYWkoImFbYjoiKQorICAgICAgICBhaSgiYVtiOmMiKQorICAgICAgICBhaSgiYVtiOmM6IikKKyAgICAgICAgYWkoImFbYjpjOmQiKQorCisgICAgICAgIGFpKCJkZWYgYSgiKQorICAgICAgICBhaSgiZGVmIGEoYiIpCisgICAgICAgIGFpKCJkZWYgYShiLCIpCisgICAgICAgIGFpKCJkZWYgYShiLGMiKQorICAgICAgICBhaSgiZGVmIGEoYixjLCIpCisKKyAgICAgICAgYWkoIigiKQorICAgICAgICBhaSgiKGEiKQorICAgICAgICBhaSgiKGEsIikKKyAgICAgICAgYWkoIihhLGIiKQorICAgICAgICBhaSgiKGEsYiwiKQorCisgICAgICAgIGFpKCJpZiBhOlxuIHBhc3NcbmVsaWYgYjoiKQorICAgICAgICBhaSgiaWYgYTpcbiBwYXNzXG5lbGlmIGI6XG4gcGFzc1xuZWxzZToiKQorCisgICAgICAgIGFpKCJ3aGlsZSBhOiIpCisgICAgICAgIGFpKCJ3aGlsZSBhOlxuIHBhc3NcbmVsc2U6IikKKworICAgICAgICBhaSgiZm9yIGEgaW4gYjoiKQorICAgICAgICBhaSgiZm9yIGEgaW4gYjpcbiBwYXNzXG5lbHNlOiIpCisKKyAgICAgICAgYWkoInRyeToiKQorICAgICAgICBhaSgidHJ5OlxuIHBhc3NcbmV4Y2VwdDoiKQorICAgICAgICBhaSgidHJ5OlxuIHBhc3NcbmZpbmFsbHk6IikKKyAgICAgICAgYWkoInRyeTpcbiBwYXNzXG5leGNlcHQ6XG4gcGFzc1xuZmluYWxseToiKQorCisgICAgICAgIGFpKCJ3aXRoIGE6IikKKyAgICAgICAgYWkoIndpdGggYSBhcyBiOiIpCisKKyAgICAgICAgYWkoImNsYXNzIGE6IikKKyAgICAgICAgYWkoImNsYXNzIGEoIikKKyAgICAgICAgYWkoImNsYXNzIGEoYiIpCisgICAgICAgIGFpKCJjbGFzcyBhKGIsIikKKyAgICAgICAgYWkoImNsYXNzIGEoKToiKQorCisgICAgICAgIGFpKCJbeCBmb3IiKQorICAgICAgICBhaSgiW3ggZm9yIHggaW4iKQorICAgICAgICBhaSgiW3ggZm9yIHggaW4gKCIpCisKKyAgICAgICAgYWkoIih4IGZvciIpCisgICAgICAgIGFpKCIoeCBmb3IgeCBpbiIpCisgICAgICAgIGFpKCIoeCBmb3IgeCBpbiAoIikKKworICAgIGRlZiB0ZXN0X2ludmFsaWQoc2VsZik6CisgICAgICAgIGFpID0gc2VsZi5hc3NlcnRJbnZhbGlkCisgICAgICAgIGFpKCJhIGIiKQorCisgICAgICAgIGFpKCJhIEAiKQorICAgICAgICBhaSgiYSBiIEAiKQorICAgICAgICBhaSgiYSAqKiBAIikKKworICAgICAgICBhaSgiYSA9ICIpCisgICAgICAgIGFpKCJhID0gOSArIikKKworICAgICAgICBhaSgiZGVmIHgoKTpcblxucGFzc1xuIikKKworICAgICAgICBhaSgiXG5cbiBpZiAxOiBwYXNzXG5cbnBhc3MiKQorCisgICAgICAgIGFpKCJhID0gOSsgXFxcbiIpCisgICAgICAgIGFpKCJhID0gJ2FcXCAiKQorICAgICAgICBhaSgiYSA9ICdhXFxcbiIpCisKKyAgICAgICAgYWkoImEgPSAxIiwiZXZhbCIpCisgICAgICAgIGFpKCJhID0gKCIsImV2YWwiKQorICAgICAgICBhaSgiXSIsImV2YWwiKQorICAgICAgICBhaSgiKCkpIiwiZXZhbCIpCisgICAgICAgIGFpKCJbfSIsImV2YWwiKQorICAgICAgICBhaSgiOSsiLCJldmFsIikKKyAgICAgICAgYWkoImxhbWJkYSB6OiIsImV2YWwiKQorICAgICAgICBhaSgiYSBiIiwiZXZhbCIpCisKKyAgICAgICAgYWkoInJldHVybiAyLjMiKQorICAgICAgICBhaSgiaWYgKGEgPT0gMSBhbmQgYiA9IDIpOiBwYXNzIikKKworICAgICAgICBhaSgiZGVsIDEiKQorICAgICAgICBhaSgiZGVsICgpIikKKyAgICAgICAgYWkoImRlbCAoMSwpIikKKyAgICAgICAgYWkoImRlbCBbMV0iKQorICAgICAgICBhaSgiZGVsICcxJyIpCisKKyAgICAgICAgYWkoIltpIGZvciBpIGluIHJhbmdlKDEwKV0gPSAoMSwgMiwgMykiKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGlsZV9jb21tYW5kKCJhID0gMVxuIiwgImFiYyIpLmNvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUoImEgPSAxXG4iLCAiYWJjIiwgJ3NpbmdsZScpLmNvX2ZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNvbXBpbGVfY29tbWFuZCgiYSA9IDFcbiIsICJhYmMiKS5jb19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlKCJhID0gMVxuIiwgImRlZiIsICdzaW5nbGUnKS5jb19maWxlbmFtZSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KENvZGVvcFRlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2Rlb3AucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjk0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2Rlb3AucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGVvcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2Rlb3AucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjk0ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2Rlb3AucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGluZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjVkZGIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kaW5nLnB5CkBAIC0wLDAgKzEsMzcgQEAKKworaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0LCB1bml0dGVzdAoraW1wb3J0IG9zCisKK2NsYXNzIENvZGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2JhZF9jb2Rpbmcoc2VsZik6CisgICAgICAgIG1vZHVsZV9uYW1lID0gJ2JhZF9jb2RpbmcnCisgICAgICAgIHNlbGYudmVyaWZ5X2JhZF9tb2R1bGUobW9kdWxlX25hbWUpCisKKyAgICBkZWYgdGVzdF9iYWRfY29kaW5nMihzZWxmKToKKyAgICAgICAgbW9kdWxlX25hbWUgPSAnYmFkX2NvZGluZzInCisgICAgICAgIHNlbGYudmVyaWZ5X2JhZF9tb2R1bGUobW9kdWxlX25hbWUpCisKKyAgICBkZWYgdmVyaWZ5X2JhZF9tb2R1bGUoc2VsZiwgbW9kdWxlX25hbWUpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgX19pbXBvcnRfXywgJ3Rlc3QuJyArIG1vZHVsZV9uYW1lKQorCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhdGgsIG1vZHVsZV9uYW1lICsgJy5weScpCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSkgYXMgZnA6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCB0ZXh0LCBmaWxlbmFtZSwgJ2V4ZWMnKQorCisgICAgZGVmIHRlc3RfZXJyb3JfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU2Mjg5CisgICAgICAgIGlucHV0ID0gdSIjIGNvZGluZzogYXNjaWlcblxOe1NOT1dNQU59Ii5lbmNvZGUoJ3V0Zi04JykKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIGNvbXBpbGUoaW5wdXQsICI8c3RyaW5nPiIsICJleGVjIikKKyAgICAgICAgZXhwZWN0ZWQgPSAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweGUyIGluIHBvc2l0aW9uIDE2OiAiIFwKKyAgICAgICAgICAgICAgICAgICAib3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KSIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMuZXhjZXB0aW9uLmFyZ3NbMF0uc3RhcnRzd2l0aChleHBlY3RlZCkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb2RpbmdUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RpbmcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdlZDRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2RpbmcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdlZDRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29kaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2VyY2lvbi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTVjNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2VyY2lvbi5weQpAQCAtMCwwICsxLDM0OCBAQAoraW1wb3J0IGNvcHkKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBUZXN0RmFpbGVkLCBjaGVja193YXJuaW5ncworCisKKyMgRmFrZSBhIG51bWJlciB0aGF0IGltcGxlbWVudHMgbnVtZXJpYyBtZXRob2RzIHRocm91Z2ggX19jb2VyY2VfXworY2xhc3MgQ29lcmNlTnVtYmVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLmFyZyA9IGFyZworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzxDb2VyY2VOdW1iZXIgJXM+JyAlIHJlcHIoc2VsZi5hcmcpCisKKyAgICBkZWYgX19jb2VyY2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIENvZXJjZU51bWJlcik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcsIG90aGVyLmFyZworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChzZWxmLmFyZywgb3RoZXIpCisKKyMgTmV3LXN0eWxlIGNsYXNzIHZlcnNpb24gb2YgQ29lcmNlTnVtYmVyCitjbGFzcyBDb2VyY2VUbyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLmFyZyA9IGFyZworICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQ29lcmNlVG8pOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlci5hcmcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZywgb3RoZXIKKworCisjIEZha2UgYSBudW1iZXIgdGhhdCBpbXBsZW1lbnRzIG51bWVyaWMgb3BzIHRocm91Z2ggbWV0aG9kcy4KK2NsYXNzIE1ldGhvZE51bWJlcjoKKyAgICBkZWYgX19pbml0X18oc2VsZixhcmcpOgorICAgICAgICBzZWxmLmFyZyA9IGFyZworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzxNZXRob2ROdW1iZXIgJXM+JyAlIHJlcHIoc2VsZi5hcmcpCisKKyAgICBkZWYgX19hZGRfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJnICsgb3RoZXIKKworICAgIGRlZiBfX3JhZGRfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyICsgc2VsZi5hcmcKKworICAgIGRlZiBfX3N1Yl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgLSBvdGhlcgorCisgICAgZGVmIF9fcnN1Yl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgLSBzZWxmLmFyZworCisgICAgZGVmIF9fbXVsX18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmFyZyAqIG90aGVyCisKKyAgICBkZWYgX19ybXVsX18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAqIHNlbGYuYXJnCisKKyAgICBkZWYgX19kaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJnIC8gb3RoZXIKKworICAgIGRlZiBfX3JkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyIC8gc2VsZi5hcmcKKworICAgIGRlZiBfX3RydWVkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJnIC8gb3RoZXIKKworICAgIGRlZiBfX3J0cnVlZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBvdGhlciAvIHNlbGYuYXJnCisKKyAgICBkZWYgX19mbG9vcmRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgLy8gb3RoZXIKKworICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgLy8gc2VsZi5hcmcKKworICAgIGRlZiBfX3Bvd19fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi5hcmcgKiogb3RoZXIKKworICAgIGRlZiBfX3Jwb3dfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyICoqIHNlbGYuYXJnCisKKyAgICBkZWYgX19tb2RfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJnICUgb3RoZXIKKworICAgIGRlZiBfX3Jtb2RfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyICUgc2VsZi5hcmcKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIGNtcChzZWxmLmFyZywgb3RoZXIpCisKKworY2FuZGlkYXRlcyA9IFsyLCAyTCwgNC4wLCAyKzBqLCBbMV0sICgyLCksIE5vbmUsCisgICAgICAgICAgICAgIE1ldGhvZE51bWJlcigyKSwgQ29lcmNlTnVtYmVyKDIpXQorCitpbmZpeF9iaW5vcHMgPSBbICcrJywgJy0nLCAnKicsICcqKicsICclJywgJy8vJywgJy8nIF0KKworVEUgPSBUeXBlRXJyb3IKKyMgYiA9IGJvdGggbm9ybWFsIGFuZCBhdWdtZW50ZWQgZ2l2ZSBzYW1lIHJlc3VsdCBsaXN0CisjIHMgPSBzaW5nbGUgcmVzdWx0IGxpc3RzIGZvciBub3JtYWwgYW5kIGF1Z21lbnRlZAorIyBlID0gZXF1YWxzIG90aGVyIHJlc3VsdHMKKyMgcmVzdWx0IGxpc3RzOiBbJysnLCAnLScsICcqJywgJyoqJywgJyUnLCAnLy8nLCAoJ2NsYXNzaWMgLycsICduZXcgLycpXQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDItdHVwbGUgaWYgcmVzdWx0cyBkaWZmZXIKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBvbmx5IG9uZSB2YWx1ZQoraW5maXhfcmVzdWx0cyA9IHsKKyAgICAjIDIKKyAgICAoMCwwKTogKCdiJywgWzQsIDAsIDQsIDQsIDAsIDEsICgxLCAxLjApXSksCisgICAgKDAsMSk6ICgnZScsICgwLDApKSwKKyAgICAoMCwyKTogKCdiJywgWzYuMCwgLTIuMCwgOC4wLCAxNi4wLCAyLjAsIDAuMCwgMC41XSksCisgICAgKDAsMyk6ICgnYicsIFs0KzBqLCAwKzBqLCA0KzBqLCA0KzBqLCAwKzBqLCAxKzBqLCAxKzBqXSksCisgICAgKDAsNCk6ICgnYicsIFtURSwgVEUsIFsxLCAxXSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoMCw1KTogKCdiJywgW1RFLCBURSwgKDIsIDIpLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgwLDYpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoMCw3KTogKCdlJywgKDAsMCkpLAorICAgICgwLDgpOiAoJ2UnLCAoMCwwKSksCisKKyAgICAjIDJMCisgICAgKDEsMCk6ICgnZScsICgwLDApKSwKKyAgICAoMSwxKTogKCdlJywgKDAsMSkpLAorICAgICgxLDIpOiAoJ2UnLCAoMCwyKSksCisgICAgKDEsMyk6ICgnZScsICgwLDMpKSwKKyAgICAoMSw0KTogKCdlJywgKDAsNCkpLAorICAgICgxLDUpOiAoJ2UnLCAoMCw1KSksCisgICAgKDEsNik6ICgnZScsICgwLDYpKSwKKyAgICAoMSw3KTogKCdlJywgKDAsNykpLAorICAgICgxLDgpOiAoJ2UnLCAoMCw4KSksCisKKyAgICAjIDQuMAorICAgICgyLDApOiAoJ2InLCBbNi4wLCAyLjAsIDguMCwgMTYuMCwgMC4wLCAyLjAsIDIuMF0pLAorICAgICgyLDEpOiAoJ2UnLCAoMiwwKSksCisgICAgKDIsMik6ICgnYicsIFs4LjAsIDAuMCwgMTYuMCwgMjU2LjAsIDAuMCwgMS4wLCAxLjBdKSwKKyAgICAoMiwzKTogKCdiJywgWzYrMGosIDIrMGosIDgrMGosIDE2KzBqLCAwKzBqLCAyKzBqLCAyKzBqXSksCisgICAgKDIsNCk6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICgyLDUpOiAoJ2UnLCAoMiw0KSksCisgICAgKDIsNik6ICgnZScsICgyLDQpKSwKKyAgICAoMiw3KTogKCdlJywgKDIsMCkpLAorICAgICgyLDgpOiAoJ2UnLCAoMiwwKSksCisKKyAgICAjICgyKzBqKQorICAgICgzLDApOiAoJ2InLCBbNCswaiwgMCswaiwgNCswaiwgNCswaiwgMCswaiwgMSswaiwgMSswal0pLAorICAgICgzLDEpOiAoJ2UnLCAoMywwKSksCisgICAgKDMsMik6ICgnYicsIFs2KzBqLCAtMiswaiwgOCswaiwgMTYrMGosIDIrMGosIDArMGosIDAuNSswal0pLAorICAgICgzLDMpOiAoJ2InLCBbNCswaiwgMCswaiwgNCswaiwgNCswaiwgMCswaiwgMSswaiwgMSswal0pLAorICAgICgzLDQpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoMyw1KTogKCdlJywgKDMsNCkpLAorICAgICgzLDYpOiAoJ2UnLCAoMyw0KSksCisgICAgKDMsNyk6ICgnZScsICgzLDApKSwKKyAgICAoMyw4KTogKCdlJywgKDMsMCkpLAorCisgICAgIyBbMV0KKyAgICAoNCwwKTogKCdiJywgW1RFLCBURSwgWzEsIDFdLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDEpOiAoJ2UnLCAoNCwwKSksCisgICAgKDQsMik6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDMpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCw0KTogKCdiJywgW1sxLCAxXSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDUpOiAoJ3MnLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLCBbWzEsIDJdLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNik6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDcpOiAoJ2UnLCAoNCwwKSksCisgICAgKDQsOCk6ICgnZScsICg0LDApKSwKKworICAgICMgKDIsKQorICAgICg1LDApOiAoJ2InLCBbVEUsIFRFLCAoMiwgMiksIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDUsMSk6ICgnZScsICg1LDApKSwKKyAgICAoNSwyKTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDUsMyk6ICgnZScsICg1LDIpKSwKKyAgICAoNSw0KTogKCdlJywgKDUsMikpLAorICAgICg1LDUpOiAoJ2InLCBbKDIsIDIpLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDUsNik6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg1LDcpOiAoJ2UnLCAoNSwwKSksCisgICAgKDUsOCk6ICgnZScsICg1LDApKSwKKworICAgICMgTm9uZQorICAgICg2LDApOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNiwxKTogKCdlJywgKDYsMCkpLAorICAgICg2LDIpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsMyk6ICgnZScsICg2LDApKSwKKyAgICAoNiw0KTogKCdlJywgKDYsMCkpLAorICAgICg2LDUpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsNik6ICgnZScsICg2LDApKSwKKyAgICAoNiw3KTogKCdlJywgKDYsMCkpLAorICAgICg2LDgpOiAoJ2UnLCAoNiwwKSksCisKKyAgICAjIE1ldGhvZE51bWJlcigyKQorICAgICg3LDApOiAoJ2UnLCAoMCwwKSksCisgICAgKDcsMSk6ICgnZScsICgwLDEpKSwKKyAgICAoNywyKTogKCdlJywgKDAsMikpLAorICAgICg3LDMpOiAoJ2UnLCAoMCwzKSksCisgICAgKDcsNCk6ICgnZScsICgwLDQpKSwKKyAgICAoNyw1KTogKCdlJywgKDAsNSkpLAorICAgICg3LDYpOiAoJ2UnLCAoMCw2KSksCisgICAgKDcsNyk6ICgnZScsICgwLDcpKSwKKyAgICAoNyw4KTogKCdlJywgKDAsOCkpLAorCisgICAgIyBDb2VyY2VOdW1iZXIoMikKKyAgICAoOCwwKTogKCdlJywgKDAsMCkpLAorICAgICg4LDEpOiAoJ2UnLCAoMCwxKSksCisgICAgKDgsMik6ICgnZScsICgwLDIpKSwKKyAgICAoOCwzKTogKCdlJywgKDAsMykpLAorICAgICg4LDQpOiAoJ2UnLCAoMCw0KSksCisgICAgKDgsNSk6ICgnZScsICgwLDUpKSwKKyAgICAoOCw2KTogKCdlJywgKDAsNikpLAorICAgICg4LDcpOiAoJ2UnLCAoMCw3KSksCisgICAgKDgsOCk6ICgnZScsICgwLDgpKSwKK30KKworZGVmIHByb2Nlc3NfaW5maXhfcmVzdWx0cygpOgorICAgIGZvciBrZXkgaW4gc29ydGVkKGluZml4X3Jlc3VsdHMpOgorICAgICAgICB2YWwgPSBpbmZpeF9yZXN1bHRzW2tleV0KKyAgICAgICAgaWYgdmFsWzBdID09ICdlJzoKKyAgICAgICAgICAgIGluZml4X3Jlc3VsdHNba2V5XSA9IGluZml4X3Jlc3VsdHNbdmFsWzFdXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgdmFsWzBdID09ICdzJzoKKyAgICAgICAgICAgICAgICByZXMgPSAodmFsWzFdLCB2YWxbMl0pCisgICAgICAgICAgICBlbGlmIHZhbFswXSA9PSAnYic6CisgICAgICAgICAgICAgICAgcmVzID0gKHZhbFsxXSwgdmFsWzFdKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXNbaV1bNl0sIHR1cGxlKToKKyAgICAgICAgICAgICAgICAgICAgaWYgMS8yID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3Rpbmcgd2l0aCBjbGFzc2ljIChmbG9vcikgZGl2aXNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tpXVs2XSA9IHJlc1tpXVs2XVswXQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0aW5nIHdpdGggLVFuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc1tpXVs2XSA9IHJlc1tpXVs2XVsxXQorICAgICAgICAgICAgaW5maXhfcmVzdWx0c1trZXldID0gcmVzCisKKword2l0aCBjaGVja193YXJuaW5ncygoImNsYXNzaWMgKGludHxsb25nKSBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAgICAgICAgIHF1aWV0PVRydWUpOgorICAgIHByb2Nlc3NfaW5maXhfcmVzdWx0cygpCisgICAgIyBub3cgaW5maXhfcmVzdWx0cyBoYXMgdHdvIGxpc3RzIG9mIHJlc3VsdHMgZm9yIGV2ZXJ5IHBhaXJpbmcuCisKK3ByZWZpeF9iaW5vcHMgPSBbICdkaXZtb2QnIF0KK3ByZWZpeF9yZXN1bHRzID0gWworICAgIFsoMSwwKSwgKDFMLDBMKSwgKDAuMCwyLjApLCAoKDErMGopLDBqKSwgVEUsIFRFLCBURSwgVEUsICgxLDApXSwKKyAgICBbKDFMLDBMKSwgKDFMLDBMKSwgKDAuMCwyLjApLCAoKDErMGopLDBqKSwgVEUsIFRFLCBURSwgVEUsICgxTCwwTCldLAorICAgIFsoMi4wLDAuMCksICgyLjAsMC4wKSwgKDEuMCwwLjApLCAoKDIrMGopLDBqKSwgVEUsIFRFLCBURSwgVEUsICgyLjAsMC4wKV0sCisgICAgWygoMSswaiksMGopLCAoKDErMGopLDBqKSwgKDBqLCgyKzBqKSksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKCgxKzBqKSwwaildLAorICAgIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSwKKyAgICBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSwKKyAgICBbKDEsMCksICgxTCwwTCksICgwLjAsMi4wKSwgKCgxKzBqKSwwaiksIFRFLCBURSwgVEUsIFRFLCAoMSwwKV0KK10KKworZGVmIGZvcm1hdF9mbG9hdCh2YWx1ZSk6CisgICAgaWYgYWJzKHZhbHVlKSA8IDAuMDE6CisgICAgICAgIHJldHVybiAnMC4wJworICAgIGVsc2U6CisgICAgICAgIHJldHVybiAnJS4xZicgJSB2YWx1ZQorCisjIGF2b2lkIHRlc3RpbmcgcGxhdGZvcm0gZnAgcXVpcmtzCitkZWYgZm9ybWF0X3Jlc3VsdCh2YWx1ZSk6CisgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgY29tcGxleCk6CisgICAgICAgIHJldHVybiAnKCVzICsgJXNqKScgJSAoZm9ybWF0X2Zsb2F0KHZhbHVlLnJlYWwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9mbG9hdCh2YWx1ZS5pbWFnKSkKKyAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICAgICAgcmV0dXJuIGZvcm1hdF9mbG9hdCh2YWx1ZSkKKyAgICByZXR1cm4gc3RyKHZhbHVlKQorCitjbGFzcyBDb2VyY2lvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2luZml4X2Jpbm9wcyhzZWxmKToKKyAgICAgICAgZm9yIGlhLCBhIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgIGZvciBpYiwgYiBpbiBlbnVtZXJhdGUoY2FuZGlkYXRlcyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cyA9IGluZml4X3Jlc3VsdHNbKGlhLCBpYildCisgICAgICAgICAgICAgICAgZm9yIG9wLCByZXMsIGlyZXMgaW4gemlwKGluZml4X2Jpbm9wcywgcmVzdWx0c1swXSwgcmVzdWx0c1sxXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhICVzIGInICUgb3AsIHsnYSc6IGEsICdiJzogYn0pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdF9yZXN1bHQocmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3Jlc3VsdChldmFsKCdhICVzIGInICUgb3ApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzICVzICVzID09ICVzIGZhaWxlZCcgJSAoYSwgb3AsIGIsIHJlcykpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHogPSBjb3B5LmNvcHkoYSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IGNvcHkuRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICB6ID0gYSAjIGFzc3VtZSBpdCBoYXMgbm8gaW5wbGFjZSBvcHMKKyAgICAgICAgICAgICAgICAgICAgaWYgaXJlcyBpcyBURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjICd6ICVzPSBiJyAlIG9wCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJUeXBlRXJyb3Igbm90IHJhaXNlZCIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjKCd6ICVzPSBiJyAlIG9wKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpcmVzLCB6KQorCisgICAgZGVmIHRlc3RfcHJlZml4X2Jpbm9wcyhzZWxmKToKKyAgICAgICAgZm9yIGlhLCBhIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgIGZvciBpYiwgYiBpbiBlbnVtZXJhdGUoY2FuZGlkYXRlcyk6CisgICAgICAgICAgICAgICAgZm9yIG9wIGluIHByZWZpeF9iaW5vcHM6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHByZWZpeF9yZXN1bHRzW2lhXVtpYl0KKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzIGlzIFRFOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzKGEsIGIpJyAlIG9wLCB7J2EnOiBhLCAnYic6IGJ9KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXRfcmVzdWx0KHJlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9yZXN1bHQoZXZhbCgnJXMoYSwgYiknICUgb3ApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzKCVzLCAlcykgPT0gJXMgZmFpbGVkJyAlIChvcCwgYSwgYiwgcmVzKSkKKworICAgIGRlZiB0ZXN0X2NtcHR5cGVzKHNlbGYpOgorICAgICAgICAjIEJ1aWx0LWluIHRwX2NvbXBhcmUgc2xvdHMgZXhwZWN0IHRoZWlyIGFyZ3VtZW50cyB0byBoYXZlIHRoZQorICAgICAgICAjIHNhbWUgdHlwZSwgYnV0IGEgdXNlci1kZWZpbmVkIF9fY29lcmNlX18gZG9lc24ndCBoYXZlIHRvIG9iZXkuCisgICAgICAgICMgU0YgIzk4MDM1MgorICAgICAgICBldmlsX2NvZXJjZXIgPSBDb2VyY2VUbyg0MikKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlc2UgZG9uJ3QgY3Jhc2ggYW55IG1vcmUKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjbXAodSdmaXNoJywgZXZpbF9jb2VyY2VyKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjbXAoc2xpY2UoMSksIGV2aWxfY29lcmNlciksIDApCisgICAgICAgICMgLi4uYnV0IHRoYXQgdGhpcyBzdGlsbCB3b3JrcworICAgICAgICBjbGFzcyBXYWNreUNvbXBhcmVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgSW52YWxpZCBjbXAgbWFrZXMgdGhpcyB1bmhhc2hhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKFdhY2t5Q29tcGFyZXIoKSwgZXZpbF9jb2VyY2VyKSwgMCkKKyAgICAgICAgIyAuLi5hbmQgY2xhc3NpYyBjbGFzc2VzIHRvbywgc2luY2UgdGhhdCBjb2RlIHBhdGggaXMgYSBsaXR0bGUgZGlmZmVyZW50CisgICAgICAgIGNsYXNzIENsYXNzaWNXYWNreUNvbXBhcmVyOgorICAgICAgICAgICAgZGVmIF9fY21wX18oc2xmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG90aGVyID09IDQyLCAnZXhwZWN0ZWQgZXZpbF9jb2VyY2VyLCBnb3QgJXInICUgb3RoZXIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoQ2xhc3NpY1dhY2t5Q29tcGFyZXIoKSwgZXZpbF9jb2VyY2VyKSwgMCkKKworICAgIGRlZiB0ZXN0X2luZmluaXRlX3JlY19jbGFzc2ljX2NsYXNzZXMoc2VsZik6CisgICAgICAgICMgaWYgX19jb2VyY2VfXygpIHJldHVybnMgaXRzIGFyZ3VtZW50cyByZXZlcnNlZCBpdCBjYXVzZXMgYW4gaW5maW5pdGUKKyAgICAgICAgIyByZWN1cnNpb24gZm9yIGNsYXNzaWMgY2xhc3Nlcy4KKyAgICAgICAgY2xhc3MgVGVzdGVyOgorICAgICAgICAgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciwgc2VsZgorCisgICAgICAgIGV4YyA9IFRlc3RGYWlsZWQoIl9fY29lcmNlX18oKSByZXR1cm5pbmcgaXRzIGFyZ3VtZW50cyByZXZlcnNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNob3VsZCByYWlzZSBSdW50aW1lRXJyb3IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBUZXN0ZXIoKSArIDEKKyAgICAgICAgZXhjZXB0IChSdW50aW1lRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcmFpc2UgZXhjCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBleGMKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCJjb21wbGV4IGRpdm1vZC4uLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiY2xhc3NpYyAoaW50fGxvbmcpIGRpdmlzaW9uIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0PVRydWUpOgorICAgICAgICBydW5fdW5pdHRlc3QoQ29lcmNpb25UZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2VyY2lvbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2VyY2lvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiODI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2VyY2lvbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2VyY2lvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhiODI2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvZXJjaW9uLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZGViM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQpAQCAtMCwwICsxLDEwNDIgQEAKKworaW1wb3J0IHVuaXR0ZXN0LCBkb2N0ZXN0LCBvcGVyYXRvcgoraW1wb3J0IGluc3BlY3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlLCBDb3VudGVyLCBPcmRlcmVkRGljdAorZnJvbSB0ZXN0IGltcG9ydCBtYXBwaW5nX3Rlc3RzCitpbXBvcnQgcGlja2xlLCBjUGlja2xlLCBjb3B5Citmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlLCBzaHVmZmxlCitpbXBvcnQga2V5d29yZAoraW1wb3J0IHJlCitpbXBvcnQgc3lzCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgU2V0LCBNdXRhYmxlU2V0Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBNYXBwaW5nLCBNdXRhYmxlTWFwcGluZworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgU2VxdWVuY2UsIE11dGFibGVTZXF1ZW5jZQorCitUZXN0TlQgPSBuYW1lZHR1cGxlKCdUZXN0TlQnLCAneCB5IHonKSAgICAjIHR5cGUgdXNlZCBmb3IgcGlja2xlIHRlc3RzCisKK2NsYXNzIFRlc3ROYW1lZFR1cGxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ZhY3Rvcnkoc2VsZik6CisgICAgICAgIFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCAneCB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQb2ludC5fX25hbWVfXywgJ1BvaW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQb2ludC5fX3Nsb3RzX18sICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBvaW50Ll9fbW9kdWxlX18sIF9fbmFtZV9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBvaW50Ll9fZ2V0aXRlbV9fLCB0dXBsZS5fX2dldGl0ZW1fXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQb2ludC5fZmllbGRzLCAoJ3gnLCAneScpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5hbWVkdHVwbGUsICdhYmMlJywgJ2VmZyBnaGknKSAgICAgICAjIHR5cGUgaGFzIG5vbi1hbHBoYSBjaGFyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5hbWVkdHVwbGUsICdjbGFzcycsICdlZmcgZ2hpJykgICAgICAjIHR5cGUgaGFzIGtleXdvcmQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJzlhYmMnLCAnZWZnIGdoaScpICAgICAgICMgdHlwZSBzdGFydHMgd2l0aCBkaWdpdAorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5hbWVkdHVwbGUsICdhYmMnLCAnZWZnIGclaGknKSAgICAgICAjIGZpZWxkIHdpdGggbm9uLWFscGhhIGNoYXIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJ2FiYycsICdhYmMgY2xhc3MnKSAgICAgICMgZmllbGQgaGFzIGtleXdvcmQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJ2FiYycsICc4ZWZnIDlnaGknKSAgICAgICMgZmllbGQgc3RhcnRzIHdpdGggZGlnaXQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJ2FiYycsICdfZWZnIGdoaScpICAgICAgICMgZmllbGQgd2l0aCBsZWFkaW5nIHVuZGVyc2NvcmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmFtZWR0dXBsZSwgJ2FiYycsICdlZmcgZWZnIGdoaScpICAgICMgZHVwbGljYXRlIGZpZWxkCisKKyAgICAgICAgbmFtZWR0dXBsZSgnUG9pbnQwJywgJ3gxIHkyJykgICAjIFZlcmlmeSB0aGF0IG51bWJlcnMgYXJlIGFsbG93ZWQgaW4gbmFtZXMKKyAgICAgICAgbmFtZWR0dXBsZSgnXycsICdhIGIgYycpICAgICAgICAjIFRlc3QgbGVhZGluZyB1bmRlcnNjb3JlcyBpbiBhIHR5cGVuYW1lCisKKyAgICAgICAgbnQgPSBuYW1lZHR1cGxlKCdudCcsIHUndGhlIHF1aWNrIGJyb3duIGZveCcpICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHVuaWNvZGUgaW5wdXQKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigidSciLCByZXByKG50Ll9maWVsZHMpKQorICAgICAgICBudCA9IG5hbWVkdHVwbGUoJ250JywgKHUndGhlJywgdSdxdWljaycpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdW5pY29kZSBpbnB1dAorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJ1JyIsIHJlcHIobnQuX2ZpZWxkcykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQb2ludC5fbWFrZSwgWzExXSkgICAgICAgICAgICAgICAgICAgICAjIGNhdGNoIHRvbyBmZXcgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBvaW50Ll9tYWtlLCBbMTEsIDIyLCAzM10pICAgICAgICAgICAgICMgY2F0Y2ggdG9vIG1hbnkgYXJncworCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfZmFjdG9yeV9kb2NfYXR0cihzZWxmKToKKyAgICAgICAgUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBvaW50Ll9fZG9jX18sICdQb2ludCh4LCB5KScpCisKKyAgICBkZWYgdGVzdF9uYW1lX2ZpeGVyKHNlbGYpOgorICAgICAgICBmb3Igc3BlYywgcmVuYW1lZCBpbiBbCisgICAgICAgICAgICBbKCdlZmcnLCAnZyVoaScpLCAgKCdlZmcnLCAnXzEnKV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWVsZCB3aXRoIG5vbi1hbHBoYSBjaGFyCisgICAgICAgICAgICBbKCdhYmMnLCAnY2xhc3MnKSwgKCdhYmMnLCAnXzEnKV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmaWVsZCBoYXMga2V5d29yZAorICAgICAgICAgICAgWygnOGVmZycsICc5Z2hpJyksICgnXzAnLCAnXzEnKV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmllbGQgc3RhcnRzIHdpdGggZGlnaXQKKyAgICAgICAgICAgIFsoJ2FiYycsICdfZWZnJyksICgnYWJjJywgJ18xJyldLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpZWxkIHdpdGggbGVhZGluZyB1bmRlcnNjb3JlCisgICAgICAgICAgICBbKCdhYmMnLCAnZWZnJywgJ2VmZycsICdnaGknKSwgKCdhYmMnLCAnZWZnJywgJ18yJywgJ2doaScpXSwgICAgIyBkdXBsaWNhdGUgZmllbGQKKyAgICAgICAgICAgIFsoJ2FiYycsICcnLCAneCcpLCAoJ2FiYycsICdfMScsICd4JyldLCAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpZWxkbmFtZSBpcyBhIHNwYWNlCisgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWVkdHVwbGUoJ05UJywgc3BlYywgcmVuYW1lPVRydWUpLl9maWVsZHMsIHJlbmFtZWQpCisKKyAgICBkZWYgdGVzdF9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsICd4IHknKQorICAgICAgICBwID0gUG9pbnQoMTEsIDIyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIFBvaW50KHg9MTEsIHk9MjIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIFBvaW50KDExLCB5PTIyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBQb2ludCh5PTIyLCB4PTExKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBQb2ludCgqKDExLCAyMikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIFBvaW50KCoqZGljdCh4PTExLCB5PTIyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgUG9pbnQsIDEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0b28gZmV3IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQb2ludCwgMSwgMiwgMykgICAgICAgICAgICAgICAgICAgICAgICAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAnUG9pbnQoWFhYPTEsIHk9MiknLCBsb2NhbHMoKSkgICAjIHdyb25nIGtleXdvcmQgYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAnUG9pbnQoeD0xKScsIGxvY2FscygpKSAgICAgICAgICAjIG1pc3Npbmcga2V5d29yZCBhcmd1bWVudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocCksICdQb2ludCh4PTExLCB5PTIyKScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ19fZGljdF9fJywgZGlyKHApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGluc3RhbmNlIGhhcyBubyBkaWN0CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ19fd2Vha3JlZl9fJywgZGlyKHApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIFBvaW50Ll9tYWtlKFsxMSwgMjJdKSkgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBfbWFrZSBjbGFzc21ldGhvZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuX2ZpZWxkcywgKCd4JywgJ3knKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBfZmllbGRzIGF0dHJpYnV0ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuX3JlcGxhY2UoeD0xKSwgKDEsIDIyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBfcmVwbGFjZSBtZXRob2QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLl9hc2RpY3QoKSwgZGljdCh4PTExLCB5PTIyKSkgICAgICAgICAgICAgICAgICAgICAjIHRlc3QgX2FzZGljdCBtZXRob2QKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwLl9yZXBsYWNlKHg9MSwgZXJyb3I9MikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9mYWlsKCdEaWQgbm90IGRldGVjdCBhbiBpbmNvcnJlY3QgZmllbGRuYW1lJykKKworICAgICAgICAjIHZlcmlmeSB0aGF0IGZpZWxkIHN0cmluZyBjYW4gaGF2ZSBjb21tYXMKKyAgICAgICAgUG9pbnQgPSBuYW1lZHR1cGxlKCdQb2ludCcsICd4LCB5JykKKyAgICAgICAgcCA9IFBvaW50KHg9MTEsIHk9MjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihwKSwgJ1BvaW50KHg9MTEsIHk9MjIpJykKKworICAgICAgICAjIHZlcmlmeSB0aGF0IGZpZWxkc3BlYyBjYW4gYmUgYSBub24tc3RyaW5nIHNlcXVlbmNlCisgICAgICAgIFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCAoJ3gnLCAneScpKQorICAgICAgICBwID0gUG9pbnQoeD0xMSwgeT0yMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHApLCAnUG9pbnQoeD0xMSwgeT0yMiknKQorCisgICAgZGVmIHRlc3RfdHVwbGVuZXNzKHNlbGYpOgorICAgICAgICBQb2ludCA9IG5hbWVkdHVwbGUoJ1BvaW50JywgJ3ggeScpCisgICAgICAgIHAgPSBQb2ludCgxMSwgMjIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHAsIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsICgxMSwgMjIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWF0Y2hlcyBhIHJlYWwgdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShwKSwgKDExLCAyMikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvZXJjYWJsZSB0byBhIHJlYWwgdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHApLCBbMTEsIDIyXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvZXJjYWJsZSB0byBhIGxpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgocCksIDIyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGl0ZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KCpwKSwgMjIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdGFyLWFibGUKKyAgICAgICAgeCwgeSA9IHAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCAoeCwgeSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVucGFja3MgbGlrZSBhIHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHBbMF0sIHBbMV0pLCAoMTEsIDIyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbmRleGFibGUgbGlrZSBhIHR1cGxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHAuX19nZXRpdGVtX18sIDMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLngsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC55LCB5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZXZhbCwgJ3AueicsIGxvY2FscygpKQorCisgICAgZGVmIHRlc3Rfb2RkX3NpemVzKHNlbGYpOgorICAgICAgICBaZXJvID0gbmFtZWR0dXBsZSgnWmVybycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFplcm8oKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWmVyby5fbWFrZShbXSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoWmVybygpKSwgJ1plcm8oKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWmVybygpLl9hc2RpY3QoKSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWmVybygpLl9maWVsZHMsICgpKQorCisgICAgICAgIERvdCA9IG5hbWVkdHVwbGUoJ0RvdCcsICdkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEb3QoMSksICgxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRG90Ll9tYWtlKFsxXSksICgxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRG90KDEpLmQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihEb3QoMSkpLCAnRG90KGQ9MSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERvdCgxKS5fYXNkaWN0KCksIHsnZCc6MX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRG90KDEpLl9yZXBsYWNlKGQ9OTk5KSwgKDk5OSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERvdCgxKS5fZmllbGRzLCAoJ2QnLCkpCisKKyAgICAgICAgbiA9IDUwMDAKKyAgICAgICAgaW1wb3J0IHN0cmluZywgcmFuZG9tCisgICAgICAgIG5hbWVzID0gbGlzdChzZXQoJycuam9pbihbcmFuZG9tLmNob2ljZShzdHJpbmcuYXNjaWlfbGV0dGVycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSgxMCldKSBmb3IgaSBpbiByYW5nZShuKSkpCisgICAgICAgIG4gPSBsZW4obmFtZXMpCisgICAgICAgIEJpZyA9IG5hbWVkdHVwbGUoJ0JpZycsIG5hbWVzKQorICAgICAgICBiID0gQmlnKCpyYW5nZShuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCB0dXBsZShyYW5nZShuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQmlnLl9tYWtlKHJhbmdlKG4pKSwgdHVwbGUocmFuZ2UobikpKQorICAgICAgICBmb3IgcG9zLCBuYW1lIGluIGVudW1lcmF0ZShuYW1lcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIoYiwgbmFtZSksIHBvcykKKyAgICAgICAgcmVwcihiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIHJlcHIoKSBkb2Vzbid0IGJsb3ctdXAKKyAgICAgICAgZCA9IGIuX2FzZGljdCgpCisgICAgICAgIGRfZXhwZWN0ZWQgPSBkaWN0KHppcChuYW1lcywgcmFuZ2UobikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRfZXhwZWN0ZWQpCisgICAgICAgIGIyID0gYi5fcmVwbGFjZSgqKmRpY3QoWyhuYW1lc1sxXSwgOTk5KSwobmFtZXNbLTVdLCA0MildKSkKKyAgICAgICAgYjJfZXhwZWN0ZWQgPSByYW5nZShuKQorICAgICAgICBiMl9leHBlY3RlZFsxXSA9IDk5OQorICAgICAgICBiMl9leHBlY3RlZFstNV0gPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIyLCB0dXBsZShiMl9leHBlY3RlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fZmllbGRzLCB0dXBsZShuYW1lcykpCisKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIHAgPSBUZXN0TlQoeD0xMCwgeT0yMCwgej0zMCkKKyAgICAgICAgZm9yIG1vZHVsZSBpbiBwaWNrbGUsIGNQaWNrbGU6CisgICAgICAgICAgICBsb2FkcyA9IGdldGF0dHIobW9kdWxlLCAnbG9hZHMnKQorICAgICAgICAgICAgZHVtcHMgPSBnZXRhdHRyKG1vZHVsZSwgJ2R1bXBzJykKKyAgICAgICAgICAgIGZvciBwcm90b2NvbCBpbiAtMSwgMCwgMSwgMjoKKyAgICAgICAgICAgICAgICBxID0gbG9hZHMoZHVtcHMocCwgcHJvdG9jb2wpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgcSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuX2ZpZWxkcywgcS5fZmllbGRzKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgcCA9IFRlc3ROVCh4PTEwLCB5PTIwLCB6PTMwKQorICAgICAgICBmb3IgY29waWVyIGluIGNvcHkuY29weSwgY29weS5kZWVwY29weToKKyAgICAgICAgICAgIHEgPSBjb3BpZXIocCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgcSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fZmllbGRzLCBxLl9maWVsZHMpCisKKyAgICBkZWYgdGVzdF9uYW1lX2NvbmZsaWN0cyhzZWxmKToKKyAgICAgICAgIyBTb21lIG5hbWVzIGxpa2UgInNlbGYiLCAiY2xzIiwgInR1cGxlIiwgIml0ZW1nZXR0ZXIiLCBhbmQgInByb3BlcnR5IgorICAgICAgICAjIGZhaWxlZCB3aGVuIHVzZWQgYXMgZmllbGQgbmFtZXMuICBUZXN0IHRvIG1ha2Ugc3VyZSB0aGVzZSBub3cgd29yay4KKyAgICAgICAgVCA9IG5hbWVkdHVwbGUoJ1QnLCAnaXRlbWdldHRlciBwcm9wZXJ0eSBzZWxmIGNscyB0dXBsZScpCisgICAgICAgIHQgPSBUKDEsIDIsIDMsIDQsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgKDEsMiwzLDQsNSkpCisgICAgICAgIG5ld3QgPSB0Ll9yZXBsYWNlKGl0ZW1nZXR0ZXI9MTAsIHByb3BlcnR5PTIwLCBzZWxmPTMwLCBjbHM9NDAsIHR1cGxlPTUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3QsICgxMCwyMCwzMCw0MCw1MCkpCisKKyAgICAgICAgIyBCcm9hZGVyIHRlc3Qgb2YgYWxsIGludGVyZXN0aW5nIG5hbWVzIGluIGEgdGVtcGxhdGUKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgdGVtcGxhdGU6CisgICAgICAgICAgICBUID0gbmFtZWR0dXBsZSgnVCcsICd4JywgdmVyYm9zZT1UcnVlKQorICAgICAgICB3b3JkcyA9IHNldChyZS5maW5kYWxsKCdbQS1aYS16XSsnLCB0ZW1wbGF0ZS5nZXR2YWx1ZSgpKSkKKyAgICAgICAgd29yZHMgLT0gc2V0KGtleXdvcmQua3dsaXN0KQorICAgICAgICBUID0gbmFtZWR0dXBsZSgnVCcsIHdvcmRzKQorICAgICAgICAjIHRlc3QgX19uZXdfXworICAgICAgICB2YWx1ZXMgPSB0dXBsZShyYW5nZShsZW4od29yZHMpKSkKKyAgICAgICAgdCA9IFQoKnZhbHVlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCB2YWx1ZXMpCisgICAgICAgIHQgPSBUKCoqZGljdCh6aXAoVC5fZmllbGRzLCB2YWx1ZXMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCB2YWx1ZXMpCisgICAgICAgICMgdGVzdCBfbWFrZQorICAgICAgICB0ID0gVC5fbWFrZSh2YWx1ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdmFsdWVzKQorICAgICAgICAjIGV4ZXJjaXNlIF9fcmVwcl9fCisgICAgICAgIHJlcHIodCkKKyAgICAgICAgIyB0ZXN0IF9hc2RpY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Ll9hc2RpY3QoKSwgZGljdCh6aXAoVC5fZmllbGRzLCB2YWx1ZXMpKSkKKyAgICAgICAgIyB0ZXN0IF9yZXBsYWNlCisgICAgICAgIHQgPSBULl9tYWtlKHZhbHVlcykKKyAgICAgICAgbmV3dmFsdWVzID0gdHVwbGUodioxMCBmb3IgdiBpbiB2YWx1ZXMpCisgICAgICAgIG5ld3QgPSB0Ll9yZXBsYWNlKCoqZGljdCh6aXAoVC5fZmllbGRzLCBuZXd2YWx1ZXMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXd0LCBuZXd2YWx1ZXMpCisgICAgICAgICMgdGVzdCBfZmllbGRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVC5fZmllbGRzLCB0dXBsZSh3b3JkcykpCisgICAgICAgICMgdGVzdCBfX2dldG5ld2FyZ3NfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX19nZXRuZXdhcmdzX18oKSwgdmFsdWVzKQorCitjbGFzcyBBQkNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhzZWxmLCBhYmMsICpuYW1lcyk6CisgICAgICAgIG1ldGhvZHN0dWJzID0gZGljdC5mcm9ta2V5cyhuYW1lcywgbGFtYmRhIHMsICphcmdzOiAwKQorCisgICAgICAgICMgZXZlcnl0aGluZyBzaG91bGQgd29yayB3aWxsIGFsbCByZXF1aXJlZCBtZXRob2RzIGFyZSBwcmVzZW50CisgICAgICAgIEMgPSB0eXBlKCdDJywgKGFiYywpLCBtZXRob2RzdHVicykKKyAgICAgICAgQygpCisKKyAgICAgICAgIyBpbnN0YW50aWF0aW9uIHNob3VsZCBmYWlsIGlmIGEgcmVxdWlyZWQgbWV0aG9kIGlzIG1pc3NpbmcKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBzdHVicyA9IG1ldGhvZHN0dWJzLmNvcHkoKQorICAgICAgICAgICAgZGVsIHN0dWJzW25hbWVdCisgICAgICAgICAgICBDID0gdHlwZSgnQycsIChhYmMsKSwgc3R1YnMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEMsIG5hbWUpCisKKyAgICBkZWYgdmFsaWRhdGVfaXNpbnN0YW5jZShzZWxmLCBhYmMsIG5hbWUpOgorICAgICAgICBzdHViID0gbGFtYmRhIHMsICphcmdzOiAwCisKKyAgICAgICAgIyBuZXctc3R5bGUgY2xhc3MKKyAgICAgICAgQyA9IHR5cGUoJ0MnLCAob2JqZWN0LCksIHtuYW1lOiBzdHVifSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKEMoKSwgYWJjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBhYmMpKQorICAgICAgICAjIG9sZC1zdHlsZSBjbGFzcworICAgICAgICBjbGFzcyBDOiBwYXNzCisgICAgICAgIHNldGF0dHIoQywgbmFtZSwgc3R1YikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKEMoKSwgYWJjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBhYmMpKQorCisgICAgICAgICMgbmV3LXN0eWxlIGNsYXNzCisgICAgICAgIEMgPSB0eXBlKCdDJywgKG9iamVjdCwpLCB7J19faGFzaF9fJzogTm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShDKCksIGFiYykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIGFiYykpCisgICAgICAgICMgb2xkLXN0eWxlIGNsYXNzCisgICAgICAgIGNsYXNzIEM6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKEMoKSwgYWJjKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQywgYWJjKSkKKworICAgIGRlZiB2YWxpZGF0ZV9jb21wYXJpc29uKHNlbGYsIGluc3RhbmNlKToKKyAgICAgICAgb3BzID0gWydsdCcsICdndCcsICdsZScsICdnZScsICduZScsICdvcicsICdhbmQnLCAneG9yJywgJ3N1YiddCisgICAgICAgIG9wZXJhdG9ycyA9IHt9CisgICAgICAgIGZvciBvcCBpbiBvcHM6CisgICAgICAgICAgICBuYW1lID0gJ19fJyArIG9wICsgJ19fJworICAgICAgICAgICAgb3BlcmF0b3JzW25hbWVdID0gZ2V0YXR0cihvcGVyYXRvciwgbmFtZSkKKworICAgICAgICBjbGFzcyBPdGhlcjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnJpZ2h0X3NpZGUgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgc2VsZi5yaWdodF9zaWRlID0gVHJ1ZQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBfX2x0X18gPSBfX2VxX18KKyAgICAgICAgICAgIF9fZ3RfXyA9IF9fZXFfXworICAgICAgICAgICAgX19sZV9fID0gX19lcV9fCisgICAgICAgICAgICBfX2dlX18gPSBfX2VxX18KKyAgICAgICAgICAgIF9fbmVfXyA9IF9fZXFfXworICAgICAgICAgICAgX19yb3JfXyA9IF9fZXFfXworICAgICAgICAgICAgX19yYW5kX18gPSBfX2VxX18KKyAgICAgICAgICAgIF9fcnhvcl9fID0gX19lcV9fCisgICAgICAgICAgICBfX3JzdWJfXyA9IF9fZXFfXworCisgICAgICAgIGZvciBuYW1lLCBvcCBpbiBvcGVyYXRvcnMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGluc3RhbmNlLCBuYW1lKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgb3RoZXIgPSBPdGhlcigpCisgICAgICAgICAgICBvcChpbnN0YW5jZSwgb3RoZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIucmlnaHRfc2lkZSwnUmlnaHQgc2lkZSBub3QgY2FsbGVkIGZvciAlcy4lcycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlICh0eXBlKGluc3RhbmNlKSwgbmFtZSkpCisKK2NsYXNzIFRlc3RPbmVUcmlja1BvbnlBQkNzKEFCQ1Rlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X0hhc2hhYmxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgbm9uLWhhc2hhYmxlcworICAgICAgICBub25fc2FtcGxlcyA9IFtsaXN0KCksIHNldCgpLCBkaWN0KCldCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIEhhc2hhYmxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgIyBDaGVjayBzb21lIGhhc2hhYmxlcworICAgICAgICBzYW1wbGVzID0gW05vbmUsCisgICAgICAgICAgICAgICAgICAgaW50KCksIGZsb2F0KCksIGNvbXBsZXgoKSwKKyAgICAgICAgICAgICAgICAgICBzdHIoKSwKKyAgICAgICAgICAgICAgICAgICB0dXBsZSgpLCBmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICBpbnQsIGxpc3QsIG9iamVjdCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciB4IGluIHNhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgSGFzaGFibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBIYXNoYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgSGFzaGFibGUpCisgICAgICAgICMgQ2hlY2sgZGlyZWN0IHN1YmNsYXNzaW5nCisgICAgICAgIGNsYXNzIEgoSGFzaGFibGUpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihILCBzZWxmKS5fX2hhc2hfXygpCisgICAgICAgICAgICBfX2VxX18gPSBIYXNoYWJsZS5fX2VxX18gIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goSCgpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGludCwgSCkpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhIYXNoYWJsZSwgJ19faGFzaF9fJykKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9pc2luc3RhbmNlKEhhc2hhYmxlLCAnX19oYXNoX18nKQorCisgICAgZGVmIHRlc3RfSXRlcmFibGUoc2VsZik6CisgICAgICAgICMgQ2hlY2sgc29tZSBub24taXRlcmFibGVzCisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxal0KKyAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgSXRlcmFibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAjIENoZWNrIHNvbWUgaXRlcmFibGVzCisgICAgICAgIHNhbXBsZXMgPSBbc3RyKCksCisgICAgICAgICAgICAgICAgICAgdHVwbGUoKSwgbGlzdCgpLCBzZXQoKSwgZnJvemVuc2V0KCksIGRpY3QoKSwKKyAgICAgICAgICAgICAgICAgICBkaWN0KCkua2V5cygpLCBkaWN0KCkuaXRlbXMoKSwgZGljdCgpLnZhbHVlcygpLAorICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAorICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBJdGVyYWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIEl0ZXJhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgIyBDaGVjayBkaXJlY3Qgc3ViY2xhc3NpbmcKKyAgICAgICAgY2xhc3MgSShJdGVyYWJsZSk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEksIHNlbGYpLl9faXRlcl9fKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KEkoKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3Moc3RyLCBJKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEl0ZXJhYmxlLCAnX19pdGVyX18nKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoSXRlcmFibGUsICdfX2l0ZXJfXycpCisKKyAgICBkZWYgdGVzdF9JdGVyYXRvcihzZWxmKToKKyAgICAgICAgbm9uX3NhbXBsZXMgPSBbTm9uZSwgNDIsIDMuMTQsIDFqLCAiIi5lbmNvZGUoJ2FzY2lpJyksICIiLCAoKSwgW10sCisgICAgICAgICAgICB7fSwgc2V0KCldCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIEl0ZXJhdG9yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIEl0ZXJhdG9yKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgc2FtcGxlcyA9IFtpdGVyKHN0cigpKSwKKyAgICAgICAgICAgICAgICAgICBpdGVyKHR1cGxlKCkpLCBpdGVyKGxpc3QoKSksIGl0ZXIoZGljdCgpKSwKKyAgICAgICAgICAgICAgICAgICBpdGVyKHNldCgpKSwgaXRlcihmcm96ZW5zZXQoKSksCisgICAgICAgICAgICAgICAgICAgaXRlcihkaWN0KCkua2V5cygpKSwgaXRlcihkaWN0KCkuaXRlbXMoKSksCisgICAgICAgICAgICAgICAgICAgaXRlcihkaWN0KCkudmFsdWVzKCkpLAorICAgICAgICAgICAgICAgICAgIChsYW1iZGE6ICh5aWVsZCkpKCksCisgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAorICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBJdGVyYXRvcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIEl0ZXJhdG9yKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEl0ZXJhdG9yLCAnbmV4dCcsICdfX2l0ZXJfXycpCisKKyAgICAgICAgIyBJc3N1ZSAxMDU2NQorICAgICAgICBjbGFzcyBOZXh0T25seToKKyAgICAgICAgICAgIGRlZiBfX25leHRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoTmV4dE9ubHkoKSwgSXRlcmF0b3IpCisgICAgICAgIGNsYXNzIE5leHRPbmx5TmV3KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKE5leHRPbmx5TmV3KCksIEl0ZXJhdG9yKQorCisgICAgZGVmIHRlc3RfU2l6ZWQoc2VsZik6CisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAorICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIFNpemVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIFNpemVkKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgc2FtcGxlcyA9IFtzdHIoKSwKKyAgICAgICAgICAgICAgICAgICB0dXBsZSgpLCBsaXN0KCksIHNldCgpLCBmcm96ZW5zZXQoKSwgZGljdCgpLAorICAgICAgICAgICAgICAgICAgIGRpY3QoKS5rZXlzKCksIGRpY3QoKS5pdGVtcygpLCBkaWN0KCkudmFsdWVzKCksCisgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIFNpemVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgU2l6ZWQpLCByZXByKHR5cGUoeCkpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoU2l6ZWQsICdfX2xlbl9fJykKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9pc2luc3RhbmNlKFNpemVkLCAnX19sZW5fXycpCisKKyAgICBkZWYgdGVzdF9Db250YWluZXIoc2VsZik6CisgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxaiwKKyAgICAgICAgICAgICAgICAgICAgICAgKGxhbWJkYTogKHlpZWxkKSkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAorICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHgsIENvbnRhaW5lcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBDb250YWluZXIpLCByZXByKHR5cGUoeCkpKQorICAgICAgICBzYW1wbGVzID0gW3N0cigpLAorICAgICAgICAgICAgICAgICAgIHR1cGxlKCksIGxpc3QoKSwgc2V0KCksIGZyb3plbnNldCgpLCBkaWN0KCksCisgICAgICAgICAgICAgICAgICAgZGljdCgpLmtleXMoKSwgZGljdCgpLml0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgXQorICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIENvbnRhaW5lcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbnRhaW5lciksIHJlcHIodHlwZSh4KSkpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhDb250YWluZXIsICdfX2NvbnRhaW5zX18nKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2lzaW5zdGFuY2UoQ29udGFpbmVyLCAnX19jb250YWluc19fJykKKworICAgIGRlZiB0ZXN0X0NhbGxhYmxlKHNlbGYpOgorICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosCisgICAgICAgICAgICAgICAgICAgICAgICIiLCAiIi5lbmNvZGUoJ2FzY2lpJyksICgpLCBbXSwge30sIHNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAobGFtYmRhOiAoeWllbGQpKSgpLAorICAgICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCisgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoeCwgQ2FsbGFibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgQ2FsbGFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICBzYW1wbGVzID0gW2xhbWJkYTogTm9uZSwKKyAgICAgICAgICAgICAgICAgICB0eXBlLCBpbnQsIG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICBsZW4sCisgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQsIFtdLmFwcGVuZCwKKyAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciB4IGluIHNhbXBsZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgQ2FsbGFibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBDYWxsYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhDYWxsYWJsZSwgJ19fY2FsbF9fJykKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9pc2luc3RhbmNlKENhbGxhYmxlLCAnX19jYWxsX18nKQorCisgICAgZGVmIHRlc3RfZGlyZWN0X3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICBmb3IgQiBpbiBIYXNoYWJsZSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBTaXplZCwgQ29udGFpbmVyLCBDYWxsYWJsZToKKyAgICAgICAgICAgIGNsYXNzIEMoQik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBDKSkKKworICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbihzZWxmKToKKyAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CisgICAgICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSB0eXBlCisgICAgICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICAjIE1ha2Ugc3VyZSBpdCBpc24ndCBoYXNoYWJsZSBieSBkZWZhdWx0CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQywgQiksIEIuX19uYW1lX18pCisgICAgICAgICAgICBCLnJlZ2lzdGVyKEMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBCKSkKKworY2xhc3MgV2l0aFNldChNdXRhYmxlU2V0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdD0oKSk6CisgICAgICAgIHNlbGYuZGF0YSA9IHNldChpdCkKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGF0YSkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGl0ZXIoc2VsZi5kYXRhKQorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBpdGVtKToKKyAgICAgICAgcmV0dXJuIGl0ZW0gaW4gc2VsZi5kYXRhCisKKyAgICBkZWYgYWRkKHNlbGYsIGl0ZW0pOgorICAgICAgICBzZWxmLmRhdGEuYWRkKGl0ZW0pCisKKyAgICBkZWYgZGlzY2FyZChzZWxmLCBpdGVtKToKKyAgICAgICAgc2VsZi5kYXRhLmRpc2NhcmQoaXRlbSkKKworY2xhc3MgVGVzdENvbGxlY3Rpb25BQkNzKEFCQ1Rlc3RDYXNlKToKKworICAgICMgWFhYIEZvciBub3csIHdlIG9ubHkgdGVzdCBzb21lIHZpcnR1YWwgaW5oZXJpdGFuY2UgcHJvcGVydGllcy4KKyAgICAjIFdlIHNob3VsZCBhbHNvIHRlc3QgdGhlIHByb3BlciBiZWhhdmlvciBvZiB0aGUgY29sbGVjdGlvbiBBQkNzCisgICAgIyBhcyByZWFsIGJhc2UgY2xhc3NlcyBvciBtaXgtaW4gY2xhc3Nlcy4KKworICAgIGRlZiB0ZXN0X1NldChzZWxmKToKKyAgICAgICAgZm9yIHNhbXBsZSBpbiBbc2V0LCBmcm96ZW5zZXRdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNhbXBsZSgpLCBTZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIFNldCkpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhTZXQsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLCAnX19sZW5fXycpCisgICAgICAgIGNsYXNzIE15U2V0KFNldCk6CisgICAgICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9jb21wYXJpc29uKE15U2V0KCkpCisKKyAgICBkZWYgdGVzdF9oYXNoX1NldChzZWxmKToKKyAgICAgICAgY2xhc3MgT25lVHdvVGhyZWVTZXQoU2V0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRlbnRzID0gWzEsIDIsIDNdCisgICAgICAgICAgICBkZWYgX19jb250YWluc19fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHJldHVybiB4IGluIHNlbGYuY29udGVudHMKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5jb250ZW50cykKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihzZWxmLmNvbnRlbnRzKQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9oYXNoKCkKKyAgICAgICAgYSwgYiA9IE9uZVR3b1RocmVlU2V0KCksIE9uZVR3b1RocmVlU2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2goYSkgPT0gaGFzaChiKSkKKworICAgIGRlZiB0ZXN0X011dGFibGVTZXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZXQoKSwgTXV0YWJsZVNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc2V0LCBNdXRhYmxlU2V0KSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKGZyb3plbnNldCgpLCBNdXRhYmxlU2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoZnJvemVuc2V0LCBNdXRhYmxlU2V0KSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKE11dGFibGVTZXQsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLCAnX19sZW5fXycsCisgICAgICAgICAgICAnYWRkJywgJ2Rpc2NhcmQnKQorCisgICAgZGVmIHRlc3RfaXNzdWVfNTY0NyhzZWxmKToKKyAgICAgICAgIyBNdXRhYmxlU2V0Ll9faWFuZF9fIG11dGF0ZWQgdGhlIHNldCBkdXJpbmcgaXRlcmF0aW9uCisgICAgICAgIHMgPSBXaXRoU2V0KCdhYmNkJykKKyAgICAgICAgcyAmPSBXaXRoU2V0KCdjZGVmJykgICAgICAgICAgICAjIFRoaXMgdXNlZCB0byBmYWlsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHMpLCBzZXQoJ2NkJykpCisKKyAgICBkZWYgdGVzdF9pc3N1ZV80OTIwKHNlbGYpOgorICAgICAgICAjIE11dGFibGVTZXQucG9wKCkgbWV0aG9kIGRpZCBub3Qgd29yaworICAgICAgICBjbGFzcyBNeVNldChjb2xsZWN0aW9ucy5NdXRhYmxlU2V0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXz1bJ19fcyddCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZixpdGVtcz1Ob25lKToKKyAgICAgICAgICAgICAgICBpZiBpdGVtcyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBpdGVtcz1bXQorICAgICAgICAgICAgICAgIHNlbGYuX19zPXNldChpdGVtcykKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZix2KToKKyAgICAgICAgICAgICAgICByZXR1cm4gdiBpbiBzZWxmLl9fcworICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX19zKQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9fcykKKyAgICAgICAgICAgIGRlZiBhZGQoc2VsZix2KToKKyAgICAgICAgICAgICAgICByZXN1bHQ9diBub3QgaW4gc2VsZi5fX3MKKyAgICAgICAgICAgICAgICBzZWxmLl9fcy5hZGQodikKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgICAgICBkZWYgZGlzY2FyZChzZWxmLHYpOgorICAgICAgICAgICAgICAgIHJlc3VsdD12IGluIHNlbGYuX19zCisgICAgICAgICAgICAgICAgc2VsZi5fX3MuZGlzY2FyZCh2KQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIk15U2V0KCVzKSIgJSByZXByKGxpc3Qoc2VsZikpCisgICAgICAgIHMgPSBNeVNldChbNSw0MywyLDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucG9wKCksIDEpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTg3NTAoc2VsZik6CisgICAgICAgIGVtcHR5ID0gV2l0aFNldCgpCisgICAgICAgIGZ1bGwgPSBXaXRoU2V0KHJhbmdlKDEwKSkKKyAgICAgICAgcyA9IFdpdGhTZXQoZnVsbCkKKyAgICAgICAgcyAtPSBzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgZW1wdHkpCisgICAgICAgIHMgPSBXaXRoU2V0KGZ1bGwpCisgICAgICAgIHMgXj0gcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIGVtcHR5KQorICAgICAgICBzID0gV2l0aFNldChmdWxsKQorICAgICAgICBzICY9IHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBmdWxsKQorICAgICAgICBzIHw9IHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBmdWxsKQorCisgICAgZGVmIHRlc3RfTWFwcGluZyhzZWxmKToKKyAgICAgICAgZm9yIHNhbXBsZSBpbiBbZGljdF06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2FtcGxlKCksIE1hcHBpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIE1hcHBpbmcpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoTWFwcGluZywgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKKyAgICAgICAgICAgICdfX2dldGl0ZW1fXycpCisgICAgICAgIGNsYXNzIE15TWFwcGluZyhjb2xsZWN0aW9ucy5NYXBwaW5nKToKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpdGVyKCgpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2NvbXBhcmlzb24oTXlNYXBwaW5nKCkpCisKKyAgICBkZWYgdGVzdF9NdXRhYmxlTWFwcGluZyhzZWxmKToKKyAgICAgICAgZm9yIHNhbXBsZSBpbiBbZGljdF06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2FtcGxlKCksIE11dGFibGVNYXBwaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc2FtcGxlLCBNdXRhYmxlTWFwcGluZykpCisgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhNdXRhYmxlTWFwcGluZywgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKKyAgICAgICAgICAgICdfX2dldGl0ZW1fXycsICdfX3NldGl0ZW1fXycsICdfX2RlbGl0ZW1fXycpCisKKyAgICBkZWYgdGVzdF9TZXF1ZW5jZShzZWxmKToKKyAgICAgICAgZm9yIHNhbXBsZSBpbiBbdHVwbGUsIGxpc3QsIHN0cl06CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2FtcGxlKCksIFNlcXVlbmNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc2FtcGxlLCBTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGJhc2VzdHJpbmcsIFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHJhbmdlKDEwKSwgU2VxdWVuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHhyYW5nZSwgU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzdHIsIFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKFNlcXVlbmNlLCAnX19jb250YWluc19fJywgJ19faXRlcl9fJywgJ19fbGVuX18nLAorICAgICAgICAgICAgJ19fZ2V0aXRlbV9fJykKKworICAgIGRlZiB0ZXN0X011dGFibGVTZXF1ZW5jZShzZWxmKToKKyAgICAgICAgZm9yIHNhbXBsZSBpbiBbdHVwbGUsIHN0cl06CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2Uoc2FtcGxlKCksIE11dGFibGVTZXF1ZW5jZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhzYW1wbGUsIE11dGFibGVTZXF1ZW5jZSkpCisgICAgICAgIGZvciBzYW1wbGUgaW4gW2xpc3RdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNhbXBsZSgpLCBNdXRhYmxlU2VxdWVuY2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIE11dGFibGVTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhiYXNlc3RyaW5nLCBNdXRhYmxlU2VxdWVuY2UpKQorICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoTXV0YWJsZVNlcXVlbmNlLCAnX19jb250YWluc19fJywgJ19faXRlcl9fJywKKyAgICAgICAgICAgICdfX2xlbl9fJywgJ19fZ2V0aXRlbV9fJywgJ19fc2V0aXRlbV9fJywgJ19fZGVsaXRlbV9fJywgJ2luc2VydCcpCisKK2NsYXNzIFRlc3RDb3VudGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgYyA9IENvdW50ZXIoJ2FiY2FiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgQ291bnRlcih7J2EnOjMgLCAnYic6IDIsICdjJzogMX0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIENvdW50ZXIoYT0zLCBiPTIsIGM9MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShjLCBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYywgTWFwcGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQ291bnRlciwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKENvdW50ZXIsIE1hcHBpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oYy52YWx1ZXMoKSksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGMudmFsdWVzKCkpLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGMua2V5cygpKSwgWydhJywgJ2InLCAnYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChjKSwgWydhJywgJ2InLCAnYyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChjLml0ZW1zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2EnLCAzKSwgKCdiJywgMiksICgnYycsIDEpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjWydiJ10sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY1sneiddLCAwKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuaGFzX2tleSgnYycpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmhhc19rZXkoJ3onKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fX2NvbnRhaW5zX18oJ2MnKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9fY29udGFpbnNfXygneicpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldCgnYicsIDEwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldCgneicsIDEwKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgZGljdChhPTMsIGI9MiwgYz0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAiQ291bnRlcih7J2EnOiAzLCAnYic6IDIsICdjJzogMX0pIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1vc3RfY29tbW9uKCksIFsoJ2EnLCAzKSwgKCdiJywgMiksICgnYycsIDEpXSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubW9zdF9jb21tb24oaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2EnLCAzKSwgKCdiJywgMiksICgnYycsIDEpXVs6aV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihzb3J0ZWQoYy5lbGVtZW50cygpKSksICdhYWFiYmMnKQorICAgICAgICBjWydhJ10gKz0gMSAgICAgICAgICMgaW5jcmVtZW50IGFuIGV4aXN0aW5nIHZhbHVlCisgICAgICAgIGNbJ2InXSAtPSAyICAgICAgICAgIyBzdWIgZXhpc3RpbmcgdmFsdWUgdG8gemVybworICAgICAgICBkZWwgY1snYyddICAgICAgICAgICMgcmVtb3ZlIGFuIGVudHJ5CisgICAgICAgIGRlbCBjWydjJ10gICAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBkZWwgZG9lc24ndCByYWlzZSBLZXlFcnJvcgorICAgICAgICBjWydkJ10gLT0gMiAgICAgICAgICMgc3ViIGZyb20gYSBtaXNzaW5nIHZhbHVlCisgICAgICAgIGNbJ2UnXSA9IC01ICAgICAgICAgIyBkaXJlY3RseSBhc3NpZ24gYSBtaXNzaW5nIHZhbHVlCisgICAgICAgIGNbJ2YnXSArPSA0ICAgICAgICAgIyBhZGQgdG8gYSBtaXNzaW5nIHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgZGljdChhPTQsIGI9MCwgZD0tMiwgZT0tNSwgZj00KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5qb2luKHNvcnRlZChjLmVsZW1lbnRzKCkpKSwgJ2FhYWFmZmZmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnBvcCgnZicpLCA0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdmJywgYykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBlbGVtLCBjbnQgPSBjLnBvcGl0ZW0oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihlbGVtLCBjKQorICAgICAgICBjLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnQ291bnRlcigpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgQ291bnRlci5mcm9ta2V5cywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgYykKKyAgICAgICAgYy51cGRhdGUoZGljdChhPTUsIGI9MykpCisgICAgICAgIGMudXBkYXRlKGM9MSkKKyAgICAgICAgYy51cGRhdGUoQ291bnRlcignYScgKiA1MCArICdiJyAqIDMwKSkKKyAgICAgICAgYy51cGRhdGUoKSAgICAgICAgICAjIHRlc3QgY2FzZSB3aXRoIG5vIGFyZ3MKKyAgICAgICAgYy5fX2luaXRfXygnYScgKiA1MDAgKyAnYicgKiAzMDApCisgICAgICAgIGMuX19pbml0X18oJ2NkYycpCisgICAgICAgIGMuX19pbml0X18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIGRpY3QoYT01NTUsIGI9MzMzLCBjPTMsIGQ9MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zZXRkZWZhdWx0KCdkJywgNSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY1snZCddLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2V0ZGVmYXVsdCgnZScsIDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNbJ2UnXSwgNSkKKworICAgIGRlZiB0ZXN0X2NvcHlpbmcoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBjb3VudGVycyBhcmUgY29weWFibGUsIGRlZXBjb3B5YWJsZSwgcGlja2xhYmxlLCBhbmQKKyAgICAgICAgI2hhdmUgYSByZXByL2V2YWwgcm91bmQtdHJpcAorICAgICAgICB3b3JkcyA9IENvdW50ZXIoJ3doaWNoIHdpdGNoIGhhZCB3aGljaCB3aXRjaGVzIHdyaXN0IHdhdGNoJy5zcGxpdCgpKQorICAgICAgICB1cGRhdGVfdGVzdCA9IENvdW50ZXIoKQorICAgICAgICB1cGRhdGVfdGVzdC51cGRhdGUod29yZHMpCisgICAgICAgIGZvciBpLCBkdXAgaW4gZW51bWVyYXRlKFsKKyAgICAgICAgICAgICAgICAgICAgd29yZHMuY29weSgpLAorICAgICAgICAgICAgICAgICAgICBjb3B5LmNvcHkod29yZHMpLAorICAgICAgICAgICAgICAgICAgICBjb3B5LmRlZXBjb3B5KHdvcmRzKSwKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyh3b3JkcywgMCkpLAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHdvcmRzLCAxKSksCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMod29yZHMsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyh3b3JkcywgLTEpKSwKKyAgICAgICAgICAgICAgICAgICAgY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKHdvcmRzLCAwKSksCisgICAgICAgICAgICAgICAgICAgIGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyh3b3JkcywgMSkpLAorICAgICAgICAgICAgICAgICAgICBjUGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMod29yZHMsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgY1BpY2tsZS5sb2FkcyhjUGlja2xlLmR1bXBzKHdvcmRzLCAtMSkpLAorICAgICAgICAgICAgICAgICAgICBldmFsKHJlcHIod29yZHMpKSwKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgIENvdW50ZXIod29yZHMpLAorICAgICAgICAgICAgICAgICAgICBdKToKKyAgICAgICAgICAgIG1zZyA9IChpLCBkdXAsIHdvcmRzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR1cCBpcyBub3Qgd29yZHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR1cCwgd29yZHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkdXApLCBsZW4od29yZHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGR1cCksIHR5cGUod29yZHMpKQorCisgICAgZGVmIHRlc3RfY29weV9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgTXlDb3VudGVyKENvdW50ZXIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjID0gTXlDb3VudGVyKCdzbGFydGliYXJ0ZmFzdCcpCisgICAgICAgIGQgPSBjLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBsZW4oYykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShkKSwgdHlwZShjKSkKKworICAgIGRlZiB0ZXN0X2NvbnZlcnNpb25zKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgdG86IHNldCwgbGlzdCwgZGljdAorICAgICAgICBzID0gJ3NoZSBzZWxscyBzZWEgc2hlbGxzIGJ5IHRoZSBzZWEgc2hvcmUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKENvdW50ZXIocykuZWxlbWVudHMoKSksIHNvcnRlZChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoQ291bnRlcihzKSksIHNvcnRlZChzZXQocykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QoQ291bnRlcihzKSksIGRpY3QoQ291bnRlcihzKS5pdGVtcygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoQ291bnRlcihzKSksIHNldChzKSkKKworICAgIGRlZiB0ZXN0X2ludmFyaWFudF9mb3JfdGhlX2luX29wZXJhdG9yKHNlbGYpOgorICAgICAgICBjID0gQ291bnRlcihhPTEwLCBiPS0yLCBjPTApCisgICAgICAgIGZvciBlbGVtIGluIGM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBpbiBjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbGVtLCBjKQorCisgICAgZGVmIHRlc3RfbXVsdGlzZXRfb3BlcmF0aW9ucyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBhZGRpbmcgYSB6ZXJvIGNvdW50ZXIgd2lsbCBzdHJpcCB6ZXJvcyBhbmQgbmVnYXRpdmVzCisgICAgICAgIGMgPSBDb3VudGVyKGE9MTAsIGI9LTIsIGM9MCkgKyBDb3VudGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KGMpLCBkaWN0KGE9MTApKQorCisgICAgICAgIGVsZW1lbnRzID0gJ2FiY2QnCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDApOgorICAgICAgICAgICAgIyB0ZXN0IHJhbmRvbSBwYWlycyBvZiBtdWx0aXNldHMKKyAgICAgICAgICAgIHAgPSBDb3VudGVyKGRpY3QoKGVsZW0sIHJhbmRyYW5nZSgtMiw0KSkgZm9yIGVsZW0gaW4gZWxlbWVudHMpKQorICAgICAgICAgICAgcC51cGRhdGUoZT0xLCBmPS0xLCBnPTApCisgICAgICAgICAgICBxID0gQ291bnRlcihkaWN0KChlbGVtLCByYW5kcmFuZ2UoLTIsNCkpIGZvciBlbGVtIGluIGVsZW1lbnRzKSkKKyAgICAgICAgICAgIHEudXBkYXRlKGg9MSwgaT0tMSwgaj0wKQorICAgICAgICAgICAgZm9yIGNvdW50ZXJvcCwgbnVtYmVyb3AgaW4gWworICAgICAgICAgICAgICAgIChDb3VudGVyLl9fYWRkX18sIGxhbWJkYSB4LCB5OiBtYXgoMCwgeCt5KSksCisgICAgICAgICAgICAgICAgKENvdW50ZXIuX19zdWJfXywgbGFtYmRhIHgsIHk6IG1heCgwLCB4LXkpKSwKKyAgICAgICAgICAgICAgICAoQ291bnRlci5fX29yX18sIGxhbWJkYSB4LCB5OiBtYXgoMCx4LHkpKSwKKyAgICAgICAgICAgICAgICAoQ291bnRlci5fX2FuZF9fLCBsYW1iZGEgeCwgeTogbWF4KDAsIG1pbih4LHkpKSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvdW50ZXJvcChwLCBxKQorICAgICAgICAgICAgICAgIGZvciB4IGluIGVsZW1lbnRzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG51bWJlcm9wKHBbeF0sIHFbeF0pLCByZXN1bHRbeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvdW50ZXJvcCwgeCwgcCwgcSkpCisgICAgICAgICAgICAgICAgIyB2ZXJpZnkgdGhhdCByZXN1bHRzIGV4Y2x1ZGUgbm9uLXBvc2l0aXZlIGNvdW50cworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4PjAgZm9yIHggaW4gcmVzdWx0LnZhbHVlcygpKQorCisgICAgICAgIGVsZW1lbnRzID0gJ2FiY2RlZicKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgcmFuZG9tIG11bHRpc2V0cyB3aXRoIG5vIHJlcGVhdHMgYXJlIGV4YWN0bHkgbGlrZSBzZXRzCisgICAgICAgICAgICBwID0gQ291bnRlcihkaWN0KChlbGVtLCByYW5kcmFuZ2UoMCwgMikpIGZvciBlbGVtIGluIGVsZW1lbnRzKSkKKyAgICAgICAgICAgIHEgPSBDb3VudGVyKGRpY3QoKGVsZW0sIHJhbmRyYW5nZSgwLCAyKSkgZm9yIGVsZW0gaW4gZWxlbWVudHMpKQorICAgICAgICAgICAgZm9yIGNvdW50ZXJvcCwgc2V0b3AgaW4gWworICAgICAgICAgICAgICAgIChDb3VudGVyLl9fc3ViX18sIHNldC5fX3N1Yl9fKSwKKyAgICAgICAgICAgICAgICAoQ291bnRlci5fX29yX18sIHNldC5fX29yX18pLAorICAgICAgICAgICAgICAgIChDb3VudGVyLl9fYW5kX18sIHNldC5fX2FuZF9fKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICAgICAgY291bnRlcl9yZXN1bHQgPSBjb3VudGVyb3AocCwgcSkKKyAgICAgICAgICAgICAgICBzZXRfcmVzdWx0ID0gc2V0b3Aoc2V0KHAuZWxlbWVudHMoKSksIHNldChxLmVsZW1lbnRzKCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRlcl9yZXN1bHQsIGRpY3QuZnJvbWtleXMoc2V0X3Jlc3VsdCwgMSkpCisKKyAgICBkZWYgdGVzdF9zdWJ0cmFjdChzZWxmKToKKyAgICAgICAgYyA9IENvdW50ZXIoYT0tNSwgYj0wLCBjPTUsIGQ9MTAsIGU9MTUsZz00MCkKKyAgICAgICAgYy5zdWJ0cmFjdChhPTEsIGI9MiwgYz0tMywgZD0xMCwgZT0yMCwgZj0zMCwgaD0tNTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgQ291bnRlcihhPS02LCBiPS0yLCBjPTgsIGQ9MCwgZT0tNSwgZj0tMzAsIGc9NDAsIGg9NTApKQorICAgICAgICBjID0gQ291bnRlcihhPS01LCBiPTAsIGM9NSwgZD0xMCwgZT0xNSxnPTQwKQorICAgICAgICBjLnN1YnRyYWN0KENvdW50ZXIoYT0xLCBiPTIsIGM9LTMsIGQ9MTAsIGU9MjAsIGY9MzAsIGg9LTUwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBDb3VudGVyKGE9LTYsIGI9LTIsIGM9OCwgZD0wLCBlPS01LCBmPS0zMCwgZz00MCwgaD01MCkpCisgICAgICAgIGMgPSBDb3VudGVyKCdhYWFiYmNkJykKKyAgICAgICAgYy5zdWJ0cmFjdCgnYWFhYWJiY2NlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBDb3VudGVyKGE9LTEsIGI9MCwgYz0tMSwgZD0xLCBlPS0xKSkKKworY2xhc3MgVGVzdE9yZGVyZWREaWN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIE9yZGVyZWREaWN0KFsoJ2EnLCAxKSwgKCdiJywgMildLCBOb25lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG9vIG1hbnkgYXJncworICAgICAgICBwYWlycyA9IFsoJ2EnLCAxKSwgKCdiJywgMiksICgnYycsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKE9yZGVyZWREaWN0KGRpY3QocGFpcnMpKS5pdGVtcygpKSwgcGFpcnMpICAgICAgICAgICAjIGRpY3QgaW5wdXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoT3JkZXJlZERpY3QoKipkaWN0KHBhaXJzKSkuaXRlbXMoKSksIHBhaXJzKSAgICAgICAgICMga3dkcyBpbnB1dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoT3JkZXJlZERpY3QocGFpcnMpLml0ZW1zKCkpLCBwYWlycykgICAgICAgICAgICAgICAgICAgIyBwYWlycyBpbnB1dAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoT3JkZXJlZERpY3QoWygnYScsIDEpLCAoJ2InLCAyKSwgKCdjJywgOSksICgnZCcsIDQpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9MywgZT01KS5pdGVtcygpKSwgcGFpcnMpICAgICAgICAgICAgICAgICMgbWl4ZWQgaW5wdXQKKworICAgICAgICAjIG1ha2Ugc3VyZSBubyBwb3NpdGlvbmFsIGFyZ3MgY29uZmxpY3Qgd2l0aCBwb3NzaWJsZSBrd2RhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRhcmdzcGVjKE9yZGVyZWREaWN0Ll9fZGljdF9fWydfX2luaXRfXyddKS5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnc2VsZiddKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgZGlyZWN0IGNhbGxzIHRvIF9faW5pdF9fIGRvIG5vdCBjbGVhciBwcmV2aW91cyBjb250ZW50cworICAgICAgICBkID0gT3JkZXJlZERpY3QoWygnYScsIDEpLCAoJ2InLCAyKSwgKCdjJywgMyksICgnZCcsIDQ0KSwgKCdlJywgNTUpXSkKKyAgICAgICAgZC5fX2luaXRfXyhbKCdlJywgNSksICgnZicsIDYpXSwgZz03LCBkPTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkLml0ZW1zKCkpLAorICAgICAgICAgICAgWygnYScsIDEpLCAoJ2InLCAyKSwgKCdjJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNiksICgnZycsIDcpXSkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgT3JkZXJlZERpY3QoKS51cGRhdGUoWygnYScsIDEpLCAoJ2InLCAyKV0sIE5vbmUpICAgICAgICAgICAgICAgICAgICAgICAgIyB0b28gbWFueSBhcmdzCisgICAgICAgIHBhaXJzID0gWygnYScsIDEpLCAoJ2InLCAyKSwgKCdjJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KV0KKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIG9kLnVwZGF0ZShkaWN0KHBhaXJzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQob2QuaXRlbXMoKSksIHBhaXJzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGljdCBpbnB1dAorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgb2QudXBkYXRlKCoqZGljdChwYWlycykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKG9kLml0ZW1zKCkpLCBwYWlycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGt3ZHMgaW5wdXQKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIG9kLnVwZGF0ZShwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZW1zKCkpLCBwYWlycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGFpcnMgaW5wdXQKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIG9kLnVwZGF0ZShbKCdhJywgMSksICgnYicsIDIpLCAoJ2MnLCA5KSwgKCdkJywgNCldLCBjPTMsIGU9NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZW1zKCkpLCBwYWlycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWl4ZWQgaW5wdXQKKworICAgICAgICAjIElzc3VlIDkxMzc6IE5hbWVkIGFyZ3VtZW50IGNhbGxlZCAnb3RoZXInIG9yICdzZWxmJworICAgICAgICAjIHNob3VsZG4ndCBiZSB0cmVhdGVkIHNwZWNpYWxseS4KKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIG9kLnVwZGF0ZShzZWxmPTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIFsoJ3NlbGYnLCAyMyldKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KCkKKyAgICAgICAgb2QudXBkYXRlKG90aGVyPXt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIFsoJ290aGVyJywge30pXSkKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIG9kLnVwZGF0ZShyZWQ9NSwgYmx1ZT02LCBvdGhlcj03LCBzZWxmPTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGxpc3Qob2QuaXRlbXMoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2JsdWUnLCA2KSwgKCdvdGhlcicsIDcpLCAoJ3JlZCcsIDUpLCAoJ3NlbGYnLCA4KV0pCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBkaXJlY3QgY2FsbHMgdG8gdXBkYXRlIGRvIG5vdCBjbGVhciBwcmV2aW91cyBjb250ZW50cworICAgICAgICAjIGFkZCB0aGF0IHVwZGF0ZXMgaXRlbXMgYXJlIG5vdCBtb3ZlZCB0byB0aGUgZW5kCisgICAgICAgIGQgPSBPcmRlcmVkRGljdChbKCdhJywgMSksICgnYicsIDIpLCAoJ2MnLCAzKSwgKCdkJywgNDQpLCAoJ2UnLCA1NSldKQorICAgICAgICBkLnVwZGF0ZShbKCdlJywgNSksICgnZicsIDYpXSwgZz03LCBkPTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkLml0ZW1zKCkpLAorICAgICAgICAgICAgWygnYScsIDEpLCAoJ2InLCAyKSwgKCdjJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNiksICgnZycsIDcpXSkKKworICAgIGRlZiB0ZXN0X2FiYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKE9yZGVyZWREaWN0KCksIE11dGFibGVNYXBwaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhPcmRlcmVkRGljdCwgTXV0YWJsZU1hcHBpbmcpKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCisgICAgICAgIHNodWZmbGUocGFpcnMpCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9kKSwgbGVuKHBhaXJzKSkKKyAgICAgICAgb2QuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvZCksIDApCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBwYWlycyA9IFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICBkZWwgb2RbJ2EnXQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhJywgb2QpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgZGVsIG9kWydhJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZW1zKCkpLCBwYWlyc1s6Ml0gKyBwYWlyc1szOl0pCisKKyAgICBkZWYgdGVzdF9zZXRpdGVtKHNlbGYpOgorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KFsoJ2QnLCAxKSwgKCdiJywgMiksICgnYycsIDMpLCAoJ2EnLCA0KSwgKCdlJywgNSldKQorICAgICAgICBvZFsnYyddID0gMTAgICAgICAgICAgICMgZXhpc3RpbmcgZWxlbWVudAorICAgICAgICBvZFsnZiddID0gMjAgICAgICAgICAgICMgbmV3IGVsZW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZW1zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2QnLCAxKSwgKCdiJywgMiksICgnYycsIDEwKSwgKCdhJywgNCksICgnZScsIDUpLCAoJ2YnLCAyMCldKQorCisgICAgZGVmIHRlc3RfaXRlcmF0b3JzKHNlbGYpOgorICAgICAgICBwYWlycyA9IFsoJ2MnLCAxKSwgKCdiJywgMiksICgnYScsIDMpLCAoJ2QnLCA0KSwgKCdlJywgNSksICgnZicsIDYpXQorICAgICAgICBzaHVmZmxlKHBhaXJzKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QpLCBbdFswXSBmb3IgdCBpbiBwYWlyc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2Qua2V5cygpWzpdLCBbdFswXSBmb3IgdCBpbiBwYWlyc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QudmFsdWVzKClbOl0sIFt0WzFdIGZvciB0IGluIHBhaXJzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZC5pdGVtcygpWzpdLCBwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG9kLml0ZXJrZXlzKCkpLCBbdFswXSBmb3IgdCBpbiBwYWlyc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC5pdGVydmFsdWVzKCkpLCBbdFsxXSBmb3IgdCBpbiBwYWlyc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC5pdGVyaXRlbXMoKSksIHBhaXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmV2ZXJzZWQob2QpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbdFswXSBmb3IgdCBpbiByZXZlcnNlZChwYWlycyldKQorCisgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmKToKKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgc2h1ZmZsZShwYWlycykKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgd2hpbGUgcGFpcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLnBvcGl0ZW0oKSwgcGFpcnMucG9wKCkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgb2QucG9waXRlbSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9kKSwgMCkKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgc2h1ZmZsZShwYWlycykKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgc2h1ZmZsZShwYWlycykKKyAgICAgICAgd2hpbGUgcGFpcnM6CisgICAgICAgICAgICBrLCB2ID0gcGFpcnMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2QucG9wKGspLCB2KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgICAgICAgIG9kLnBvcCgneHl6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2QpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9kLnBvcChrLCAxMjM0NSksIDEyMzQ1KQorCisgICAgICAgICMgbWFrZSBzdXJlIHBvcCBzdGlsbCB3b3JrcyB3aGVuIF9fbWlzc2luZ19fIGlzIGRlZmluZWQKKyAgICAgICAgY2xhc3MgTWlzc2luZyhPcmRlcmVkRGljdCk6CisgICAgICAgICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBtID0gTWlzc2luZyhhPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5wb3AoJ2InLCA1KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnBvcCgnYScsIDYpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucG9wKCdhJywgNiksIDYpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgorICAgICAgICAgICAgbS5wb3AoJ2EnKQorCisgICAgZGVmIHRlc3RfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCisgICAgICAgIHNodWZmbGUocGFpcnMpCisgICAgICAgIG9kMSA9IE9yZGVyZWREaWN0KHBhaXJzKQorICAgICAgICBvZDIgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZDEsIG9kMikgICAgICAgICAgIyBzYW1lIG9yZGVyIGltcGxpZXMgZXF1YWxpdHkKKyAgICAgICAgcGFpcnMgPSBwYWlyc1syOl0gKyBwYWlyc1s6Ml0KKyAgICAgICAgb2QyID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob2QxLCBvZDIpICAgICAgICMgZGlmZmVyZW50IG9yZGVyIGltcGxpZXMgaW5lcXVhbGl0eQorICAgICAgICAjIGNvbXBhcmlzb24gdG8gcmVndWxhciBkaWN0IGlzIG5vdCBvcmRlciBzZW5zaXRpdmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvZDEsIGRpY3Qob2QyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0KG9kMiksIG9kMSkKKyAgICAgICAgIyBkaWZmZXJlbnQgbGVuZ3RoIGltcGxpZWQgaW5lcXVhbGl0eQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG9kMSwgT3JkZXJlZERpY3QocGFpcnNbOi0xXSkpCisKKyAgICBkZWYgdGVzdF9jb3B5aW5nKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgb3JkZXJlZCBkaWN0cyBhcmUgY29weWFibGUsIGRlZXBjb3B5YWJsZSwgcGlja2xhYmxlLAorICAgICAgICAjIGFuZCBoYXZlIGEgcmVwci9ldmFsIHJvdW5kLXRyaXAKKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgdXBkYXRlX3Rlc3QgPSBPcmRlcmVkRGljdCgpCisgICAgICAgIHVwZGF0ZV90ZXN0LnVwZGF0ZShvZCkKKyAgICAgICAgZm9yIGksIGR1cCBpbiBlbnVtZXJhdGUoWworICAgICAgICAgICAgICAgICAgICBvZC5jb3B5KCksCisgICAgICAgICAgICAgICAgICAgIGNvcHkuY29weShvZCksCisgICAgICAgICAgICAgICAgICAgIGNvcHkuZGVlcGNvcHkob2QpLAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKG9kLCAwKSksCisgICAgICAgICAgICAgICAgICAgIHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMob2QsIDEpKSwKKyAgICAgICAgICAgICAgICAgICAgcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhvZCwgMikpLAorICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKG9kLCAtMSkpLAorICAgICAgICAgICAgICAgICAgICBldmFsKHJlcHIob2QpKSwKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgIE9yZGVyZWREaWN0KG9kKSwKKyAgICAgICAgICAgICAgICAgICAgXSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZHVwIGlzIG5vdCBvZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHVwLCBvZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkdXAuaXRlbXMoKSksIGxpc3Qob2QuaXRlbXMoKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkdXApLCBsZW4ob2QpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGR1cCksIHR5cGUob2QpKQorCisgICAgZGVmIHRlc3RfeWFtbF9saW5rYWdlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IF9fcmVkdWNlX18gaXMgc2V0dXAgaW4gYSB3YXkgdGhhdCBzdXBwb3J0cyBQeVlBTUwncyBkdW1wKCkgZmVhdHVyZS4KKyAgICAgICAgIyBJbiB5YW1sLCBsaXN0cyBhcmUgbmF0aXZlIGJ1dCB0dXBsZXMgYXJlIG5vdC4KKyAgICAgICAgcGFpcnMgPSBbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0KKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChwYWlycykKKyAgICAgICAgIyB5YW1sLmR1bXAob2QpIC0tPgorICAgICAgICAjICchIXB5dGhvbi9vYmplY3QvYXBwbHk6X19tYWluX18uT3JkZXJlZERpY3Rcbi0gLSBbYSwgMV1cbiAgLSBbYiwgMl1cbicKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbCh0eXBlKHBhaXIpPT1saXN0IGZvciBwYWlyIGluIG9kLl9fcmVkdWNlX18oKVsxXSkpCisKKyAgICBkZWYgdGVzdF9yZWR1Y2Vfbm90X3Rvb19mYXQoc2VsZik6CisgICAgICAgICMgZG8gbm90IHNhdmUgaW5zdGFuY2UgZGljdGlvbmFyeSBpZiBub3QgbmVlZGVkCisgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9kLl9fcmVkdWNlX18oKSksIDIpCisgICAgICAgIG9kLnggPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvZC5fX3JlZHVjZV9fKCkpLCAzKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgb2QgPSBPcmRlcmVkRGljdChbKCdjJywgMSksICgnYicsIDIpLCAoJ2EnLCAzKSwgKCdkJywgNCksICgnZScsIDUpLCAoJ2YnLCA2KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihvZCksCisgICAgICAgICAgICAiT3JkZXJlZERpY3QoWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXByKG9kKSksIG9kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoT3JkZXJlZERpY3QoKSksICJPcmRlcmVkRGljdCgpIikKKworICAgIGRlZiB0ZXN0X3JlcHJfcmVjdXJzaXZlKHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAjOTgyNgorICAgICAgICBvZCA9IE9yZGVyZWREaWN0LmZyb21rZXlzKCdhYmMnKQorICAgICAgICBvZFsneCddID0gb2QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKG9kKSwKKyAgICAgICAgICAgICJPcmRlcmVkRGljdChbKCdhJywgTm9uZSksICgnYicsIE5vbmUpLCAoJ2MnLCBOb25lKSwgKCd4JywgLi4uKV0pIikKKworICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CisgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCisgICAgICAgIHNodWZmbGUocGFpcnMpCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCisgICAgICAgIHBhaXJfb3JkZXIgPSBsaXN0KG9kLml0ZW1zKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2Quc2V0ZGVmYXVsdCgnYScsIDEwKSwgMykKKyAgICAgICAgIyBtYWtlIHN1cmUgb3JkZXIgZGlkbid0IGNoYW5nZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIHBhaXJfb3JkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2Quc2V0ZGVmYXVsdCgneCcsIDEwKSwgMTApCisgICAgICAgICMgbWFrZSBzdXJlICd4JyBpcyBhZGRlZCB0byB0aGUgZW5kCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC5pdGVtcygpKVstMV0sICgneCcsIDEwKSkKKworICAgICAgICAjIG1ha2Ugc3VyZSBzZXRkZWZhdWx0IHN0aWxsIHdvcmtzIHdoZW4gX19taXNzaW5nX18gaXMgZGVmaW5lZAorICAgICAgICBjbGFzcyBNaXNzaW5nKE9yZGVyZWREaWN0KToKKyAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTWlzc2luZygpLnNldGRlZmF1bHQoNSwgOSksIDkpCisKKyAgICBkZWYgdGVzdF9yZWluc2VydChzZWxmKToKKyAgICAgICAgIyBHaXZlbiBpbnNlcnQgYSwgaW5zZXJ0IGIsIGRlbGV0ZSBhLCByZS1pbnNlcnQgYSwKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCBhIGlzIG5vdyBsYXRlciB0aGFuIGIuCisgICAgICAgIG9kID0gT3JkZXJlZERpY3QoKQorICAgICAgICBvZFsnYSddID0gMQorICAgICAgICBvZFsnYiddID0gMgorICAgICAgICBkZWwgb2RbJ2EnXQorICAgICAgICBvZFsnYSddID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIFsoJ2InLCAyKSwgKCdhJywgMSldKQorCisgICAgZGVmIHRlc3Rfdmlld3Moc2VsZik6CisgICAgICAgIHMgPSAndGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciBhIGxhenkgZG9nIHllc3RlcmRheSBiZWZvcmUgZGF3bicuc3BsaXQoKQorICAgICAgICBvZCA9IE9yZGVyZWREaWN0LmZyb21rZXlzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC52aWV3a2V5cygpKSwgIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC52aWV3dmFsdWVzKCkpLCAgW05vbmUgZm9yIGsgaW4gc10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChvZC52aWV3aXRlbXMoKSksICBbKGssIE5vbmUpIGZvciBrIGluIHNdKQorCisgICAgZGVmIHRlc3Rfb3ZlcnJpZGVfdXBkYXRlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHVwZGF0ZSgpIHdpdGhvdXQgYnJlYWtpbmcgX19pbml0X18oKQorICAgICAgICBjbGFzcyBNeU9EKE9yZGVyZWREaWN0KToKKyAgICAgICAgICAgIGRlZiB1cGRhdGUoc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCkKKyAgICAgICAgaXRlbXMgPSBbKCdhJywgMSksICgnYycsIDMpLCAoJ2InLCAyKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KE15T0QoaXRlbXMpLml0ZW1zKCkpLCBpdGVtcykKKworY2xhc3MgR2VuZXJhbE1hcHBpbmdUZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgdHlwZTJ0ZXN0ID0gT3JkZXJlZERpY3QKKworICAgIGRlZiB0ZXN0X3BvcGl0ZW0oc2VsZik6CisgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9waXRlbSkKKworY2xhc3MgTXlPcmRlcmVkRGljdChPcmRlcmVkRGljdCk6CisgICAgcGFzcworCitjbGFzcyBTdWJjbGFzc01hcHBpbmdUZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgdHlwZTJ0ZXN0ID0gTXlPcmRlcmVkRGljdAorCisgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3BpdGVtKQorCitpbXBvcnQgY29sbGVjdGlvbnMKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIE5hbWVkVHVwbGVEb2NzID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUobW9kdWxlPWNvbGxlY3Rpb25zKQorICAgIHRlc3RfY2xhc3NlcyA9IFtUZXN0TmFtZWRUdXBsZSwgTmFtZWRUdXBsZURvY3MsIFRlc3RPbmVUcmlja1BvbnlBQkNzLAorICAgICAgICAgICAgICAgICAgICBUZXN0Q29sbGVjdGlvbkFCQ3MsIFRlc3RDb3VudGVyLAorICAgICAgICAgICAgICAgICAgICBUZXN0T3JkZXJlZERpY3QsIEdlbmVyYWxNYXBwaW5nVGVzdHMsIFN1YmNsYXNzTWFwcGluZ1Rlc3RzXQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QoY29sbGVjdGlvbnMsIHZlcmJvc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTliMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTliMTk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29sb3JzeXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjZDg4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5CkBAIC0wLDAgKzEsNzYgQEAKK2ltcG9ydCB1bml0dGVzdCwgdGVzdC50ZXN0X3N1cHBvcnQKK2ltcG9ydCBjb2xvcnN5cworCitkZWYgZnJhbmdlKHN0YXJ0LCBzdG9wLCBzdGVwKToKKyAgICB3aGlsZSBzdGFydCA8PSBzdG9wOgorICAgICAgICB5aWVsZCBzdGFydAorICAgICAgICBzdGFydCArPSBzdGVwCisKK2NsYXNzIENvbG9yc3lzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0VHJpcGxlRXF1YWwoc2VsZiwgdHIxLCB0cjIpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0cjEpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0cjIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHRyMVswXSwgdHIyWzBdKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHRyMVsxXSwgdHIyWzFdKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHRyMVsyXSwgdHIyWzJdKQorCisgICAgZGVmIHRlc3RfaHN2X3JvdW5kdHJpcChzZWxmKToKKyAgICAgICAgZm9yIHIgaW4gZnJhbmdlKDAuMCwgMS4wLCAwLjIpOgorICAgICAgICAgICAgZm9yIGcgaW4gZnJhbmdlKDAuMCwgMS4wLCAwLjIpOgorICAgICAgICAgICAgICAgIGZvciBiIGluIGZyYW5nZSgwLjAsIDEuMCwgMC4yKToKKyAgICAgICAgICAgICAgICAgICAgcmdiID0gKHIsIGcsIGIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJpcGxlRXF1YWwoCisgICAgICAgICAgICAgICAgICAgICAgICByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnN5cy5oc3ZfdG9fcmdiKCpjb2xvcnN5cy5yZ2JfdG9faHN2KCpyZ2IpKQorICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9oc3ZfdmFsdWVzKHNlbGYpOgorICAgICAgICB2YWx1ZXMgPSBbCisgICAgICAgICAgICAjIHJnYiwgaHN2CisgICAgICAgICAgICAoKDAuMCwgMC4wLCAwLjApLCAoICAwICAsIDAuMCwgMC4wKSksICMgYmxhY2sKKyAgICAgICAgICAgICgoMC4wLCAwLjAsIDEuMCksICg0Li82LiwgMS4wLCAxLjApKSwgIyBibHVlCisgICAgICAgICAgICAoKDAuMCwgMS4wLCAwLjApLCAoMi4vNi4sIDEuMCwgMS4wKSksICMgZ3JlZW4KKyAgICAgICAgICAgICgoMC4wLCAxLjAsIDEuMCksICgzLi82LiwgMS4wLCAxLjApKSwgIyBjeWFuCisgICAgICAgICAgICAoKDEuMCwgMC4wLCAwLjApLCAoICAwICAsIDEuMCwgMS4wKSksICMgcmVkCisgICAgICAgICAgICAoKDEuMCwgMC4wLCAxLjApLCAoNS4vNi4sIDEuMCwgMS4wKSksICMgcHVycGxlCisgICAgICAgICAgICAoKDEuMCwgMS4wLCAwLjApLCAoMS4vNi4sIDEuMCwgMS4wKSksICMgeWVsbG93CisgICAgICAgICAgICAoKDEuMCwgMS4wLCAxLjApLCAoICAwICAsIDAuMCwgMS4wKSksICMgd2hpdGUKKyAgICAgICAgICAgICgoMC41LCAwLjUsIDAuNSksICggIDAgICwgMC4wLCAwLjUpKSwgIyBncmV5CisgICAgICAgIF0KKyAgICAgICAgZm9yIChyZ2IsIGhzdikgaW4gdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcmlwbGVFcXVhbChoc3YsIGNvbG9yc3lzLnJnYl90b19oc3YoKnJnYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRyaXBsZUVxdWFsKHJnYiwgY29sb3JzeXMuaHN2X3RvX3JnYigqaHN2KSkKKworICAgIGRlZiB0ZXN0X2hsc19yb3VuZHRyaXAoc2VsZik6CisgICAgICAgIGZvciByIGluIGZyYW5nZSgwLjAsIDEuMCwgMC4yKToKKyAgICAgICAgICAgIGZvciBnIGluIGZyYW5nZSgwLjAsIDEuMCwgMC4yKToKKyAgICAgICAgICAgICAgICBmb3IgYiBpbiBmcmFuZ2UoMC4wLCAxLjAsIDAuMik6CisgICAgICAgICAgICAgICAgICAgIHJnYiA9IChyLCBnLCBiKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRyaXBsZUVxdWFsKAorICAgICAgICAgICAgICAgICAgICAgICAgcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzeXMuaGxzX3RvX3JnYigqY29sb3JzeXMucmdiX3RvX2hscygqcmdiKSkKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfaGxzX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgdmFsdWVzID0gWworICAgICAgICAgICAgIyByZ2IsIGhscworICAgICAgICAgICAgKCgwLjAsIDAuMCwgMC4wKSwgKCAgMCAgLCAwLjAsIDAuMCkpLCAjIGJsYWNrCisgICAgICAgICAgICAoKDAuMCwgMC4wLCAxLjApLCAoNC4vNi4sIDAuNSwgMS4wKSksICMgYmx1ZQorICAgICAgICAgICAgKCgwLjAsIDEuMCwgMC4wKSwgKDIuLzYuLCAwLjUsIDEuMCkpLCAjIGdyZWVuCisgICAgICAgICAgICAoKDAuMCwgMS4wLCAxLjApLCAoMy4vNi4sIDAuNSwgMS4wKSksICMgY3lhbgorICAgICAgICAgICAgKCgxLjAsIDAuMCwgMC4wKSwgKCAgMCAgLCAwLjUsIDEuMCkpLCAjIHJlZAorICAgICAgICAgICAgKCgxLjAsIDAuMCwgMS4wKSwgKDUuLzYuLCAwLjUsIDEuMCkpLCAjIHB1cnBsZQorICAgICAgICAgICAgKCgxLjAsIDEuMCwgMC4wKSwgKDEuLzYuLCAwLjUsIDEuMCkpLCAjIHllbGxvdworICAgICAgICAgICAgKCgxLjAsIDEuMCwgMS4wKSwgKCAgMCAgLCAxLjAsIDAuMCkpLCAjIHdoaXRlCisgICAgICAgICAgICAoKDAuNSwgMC41LCAwLjUpLCAoICAwICAsIDAuNSwgMC4wKSksICMgZ3JleQorICAgICAgICBdCisgICAgICAgIGZvciAocmdiLCBobHMpIGluIHZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJpcGxlRXF1YWwoaGxzLCBjb2xvcnN5cy5yZ2JfdG9faGxzKCpyZ2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcmlwbGVFcXVhbChyZ2IsIGNvbG9yc3lzLmhsc190b19yZ2IoKmhscykpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29sb3JzeXNUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xvcnN5cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xvcnN5cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiZTc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xvcnN5cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb2xvcnN5cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJiZTc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbG9yc3lzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21tYW5kcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbW1hbmRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NmIxODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21tYW5kcy5weQpAQCAtMCwwICsxLDc0IEBACisnJycKKyAgIFRlc3RzIGZvciBjb21tYW5kcyBtb2R1bGUKKyAgIE5pY2sgTWF0aGV3c29uCisnJycKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zLCB0ZW1wZmlsZSwgcmUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuLCBpbXBvcnRfbW9kdWxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja193YXJuaW5ncworCisjIFNpbGVuY2UgUHkzayB3YXJuaW5nCitjb21tYW5kcyA9IGltcG9ydF9tb2R1bGUoJ2NvbW1hbmRzJywgZGVwcmVjYXRlZD1UcnVlKQorCisjIFRoZSBtb2R1bGUgc2F5czoKKyMgICAiTkIgVGhpcyBvbmx5IHdvcmtzIChhbmQgaXMgb25seSByZWxldmFudCkgZm9yIFVOSVguIgorIworIyBBY3R1YWxseSwgZ2V0b3V0cHV0IHNob3VsZCB3b3JrIG9uIGFueSBwbGF0Zm9ybSB3aXRoIGFuIG9zLnBvcGVuLCBidXQKKyMgSSdsbCB0YWtlIHRoZSBjb21tZW50IGFzIGdpdmVuLCBhbmQgc2tpcCB0aGlzIHN1aXRlLgorCitpZiBvcy5uYW1lICE9ICdwb3NpeCc6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ05vdCBwb3NpeDsgc2tpcHBpbmcgdGVzdF9jb21tYW5kcycpCisKKworY2xhc3MgQ29tbWFuZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2dldG91dHB1dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tYW5kcy5nZXRvdXRwdXQoJ2VjaG8geHl6enknKSwgJ3h5enp5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21tYW5kcy5nZXRzdGF0dXNvdXRwdXQoJ2VjaG8geHl6enknKSwgKDAsICd4eXp6eScpKQorCisgICAgICAgICMgd2UgdXNlIG1rZHRlbXAgaW4gdGhlIG5leHQgbGluZSB0byBjcmVhdGUgYW4gZW1wdHkgZGlyZWN0b3J5CisgICAgICAgICMgdW5kZXIgb3VyIGV4Y2x1c2l2ZSBjb250cm9sOyBmcm9tIHRoYXQsIHdlIGNhbiBpbnZlbnQgYSBwYXRobmFtZQorICAgICAgICAjIHRoYXQgd2UgX2tub3dfIHdvbid0IGV4aXN0LiAgVGhpcyBpcyBndWFyYW50ZWVkIHRvIGZhaWwuCisgICAgICAgIGRpciA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5qb2luKGRpciwgImZvbyIpCisKKyAgICAgICAgICAgIHN0YXR1cywgb3V0cHV0ID0gY29tbWFuZHMuZ2V0c3RhdHVzb3V0cHV0KCdjYXQgJyArIG5hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN0YXR1cywgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGRpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBvcy5ybWRpcihkaXIpCisKKyAgICBkZWYgdGVzdF9nZXRzdGF0dXMoc2VsZik6CisgICAgICAgICMgVGhpcyBwYXR0ZXJuIHNob3VsZCBtYXRjaCAnbHMgLWxkIC8uJyBvbiBhbnkgcG9zaXgKKyAgICAgICAgIyBzeXN0ZW0sIGhvd2V2ZXIgcGVydmVyc2VseSBjb25maWd1cmVkLiAgRXZlbiBvbiBzeXN0ZW1zCisgICAgICAgICMgKGUuZy4sIEN5Z3dpbikgd2hlcmUgdXNlciBhbmQgZ3JvdXAgbmFtZXMgY2FuIGhhdmUgc3BhY2VzOgorICAgICAgICAjICAgICBkcnd4ci14ci14ICAgMTUgQWRtaW5pc3QgRG9tYWluIFUgICAgIDQwOTYgQXVnIDEyIDEyOjUwIC8KKyAgICAgICAgIyAgICAgZHJ3eHIteHIteCAgIDE1IEpvZSBVc2VyIE15IEdyb3VwICAgICA0MDk2IEF1ZyAxMiAxMjo1MCAvCisgICAgICAgICMgTm90ZSB0aGF0IHRoZSBmaXJzdCBjYXNlIGFib3ZlIGhhcyBhIHNwYWNlIGluIHRoZSBncm91cCBuYW1lCisgICAgICAgICMgd2hpbGUgdGhlIHNlY29uZCBvbmUgaGFzIGEgc3BhY2UgaW4gYm90aCBuYW1lcy4KKyAgICAgICAgIyBTcGVjaWFsIGF0dHJpYnV0ZXMgc3VwcG9ydGVkOgorICAgICAgICAjICAgKyA9IGhhcyBBQ0xzCisgICAgICAgICMgICBAID0gaGFzIE1hYyBPUyBYIGV4dGVuZGVkIGF0dHJpYnV0ZXMKKyAgICAgICAgIyAgIC4gPSBoYXMgYSBTRUxpbnV4IHNlY3VyaXR5IGNvbnRleHQKKyAgICAgICAgcGF0ID0gcicnJ2QuLi4uLi4uLi4gICAjIEl0IGlzIGEgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgICAgWy4rQF0/ICAgICAgICMgSXQgbWF5IGhhdmUgc3BlY2lhbCBhdHRyaWJ1dGVzLgorICAgICAgICAgICAgICAgICAgXHMrXGQrICAgICAgICMgSXQgaGFzIHNvbWUgbnVtYmVyIG9mIGxpbmtzLgorICAgICAgICAgICAgICAgICAgW14vXSogICAgICAgICMgU2tpcCB1c2VyLCBncm91cCwgc2l6ZSwgYW5kIGRhdGUuCisgICAgICAgICAgICAgICAgICAvXC4gICAgICAgICAgIyBhbmQgZW5kIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgICAgICAgICAgICAnJycKKworICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgiLipjb21tYW5kcy5nZXRzdGF0dXMuLiBpcyBkZXByZWNhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gocGF0LCBjb21tYW5kcy5nZXRzdGF0dXMoIi8uIiksIHJlLlZFUkJPU0UpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoQ29tbWFuZFRlc3RzKQorICAgIHJlYXBfY2hpbGRyZW4oKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbW1hbmRzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbW1hbmRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzFhYmIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tbWFuZHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbW1hbmRzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbW1hbmRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzFhYmIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tbWFuZHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wYXJlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZGE4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wYXJlLnB5CkBAIC0wLDAgKzEsNTggQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgRW1wdHk6CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJzxFbXB0eT4nCisKK2NsYXNzIENvZXJjZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5hcmcgPSBhcmcKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8Q29lcmNlICVzPicgJSBzZWxmLmFyZworCisgICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDb2VyY2UpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlci5hcmcKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZywgb3RoZXIKKworY2xhc3MgQ21wOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZyk6CisgICAgICAgIHNlbGYuYXJnID0gYXJnCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPENtcCAlcz4nICUgc2VsZi5hcmcKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIGNtcChzZWxmLmFyZywgb3RoZXIpCisKK2NsYXNzIENvbXBhcmlzb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzZXQxID0gWzIsIDIuMCwgMkwsIDIrMGosIENvZXJjZSgyKSwgQ21wKDIuMCldCisgICAgc2V0MiA9IFtbMV0sICgzLCksIE5vbmUsIEVtcHR5KCldCisgICAgY2FuZGlkYXRlcyA9IHNldDEgKyBzZXQyCisKKyAgICBkZWYgdGVzdF9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZm9yIGEgaW4gc2VsZi5jYW5kaWRhdGVzOgorICAgICAgICAgICAgZm9yIGIgaW4gc2VsZi5jYW5kaWRhdGVzOgorICAgICAgICAgICAgICAgIGlmICgoYSBpbiBzZWxmLnNldDEpIGFuZCAoYiBpbiBzZWxmLnNldDEpKSBvciBhIGlzIGI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGEsIGIpCisKKyAgICBkZWYgdGVzdF9pZF9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgZGVmYXVsdCBjb21wYXJpc29uIGNvbXBhcmVzIGlkKCkgb2YgYXJncworICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgTC5pbnNlcnQobGVuKEwpLy8yLCBFbXB0eSgpKQorICAgICAgICBmb3IgYSBpbiBMOgorICAgICAgICAgICAgZm9yIGIgaW4gTDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChhLCBiKSwgY21wKGlkKGEpLCBpZChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYT0lciwgYj0lcicgJSAoYSwgYikpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvbXBhcmlzb25UZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wYXJlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODRkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wYXJlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wYXJlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBhcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ODRkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wYXJlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNiNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZS5weQpAQCAtMCwwICsxLDUyNiBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgX2FzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB0ZXh0d3JhcAorCitjbGFzcyBUZXN0U3BlY2lmaWNzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25vX2VuZGluZ19uZXdsaW5lKHNlbGYpOgorICAgICAgICBjb21waWxlKCJoaSIsICI8dGVzdD4iLCAiZXhlYyIpCisgICAgICAgIGNvbXBpbGUoImhpXHIiLCAiPHRlc3Q+IiwgImV4ZWMiKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIGNvbXBpbGUoIiIsICI8dGVzdD4iLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdF9vdGhlcl9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgY29tcGlsZSgiXHJcbiIsICI8dGVzdD4iLCAiZXhlYyIpCisgICAgICAgIGNvbXBpbGUoIlxyIiwgIjx0ZXN0PiIsICJleGVjIikKKyAgICAgICAgY29tcGlsZSgiaGlcclxuc3R1ZmZcclxuZGVmIGYoKTpcbiAgICBwYXNzXHIiLCAiPHRlc3Q+IiwgImV4ZWMiKQorICAgICAgICBjb21waWxlKCJ0aGlzX2lzXHJyZWFsbHlfb2xkX21hY1xyZGVmIGYoKTpcbiAgICBwYXNzIiwgIjx0ZXN0PiIsICJleGVjIikKKworICAgIGRlZiB0ZXN0X2RlYnVnX2Fzc2lnbm1lbnQoc2VsZik6CisgICAgICAgICMgY2F0Y2ggYXNzaWdubWVudHMgdG8gX19kZWJ1Z19fCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCAnX19kZWJ1Z19fID0gMScsICc/JywgJ3NpbmdsZScpCisgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICBwcmV2ID0gX19idWlsdGluX18uX19kZWJ1Z19fCisgICAgICAgIHNldGF0dHIoX19idWlsdGluX18sICdfX2RlYnVnX18nLCAnc3VyZScpCisgICAgICAgIHNldGF0dHIoX19idWlsdGluX18sICdfX2RlYnVnX18nLCBwcmV2KQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRfaGFuZGxpbmcoc2VsZik6CisgICAgICAgICMgZGV0ZWN0IGR1cGxpY2F0ZSBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgJ2xhbWJkYSBhLGE6MCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAnbGFtYmRhIGEsYT0xOjAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgJ2xhbWJkYSBhPTEsYT0xOjAnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjICdkZWYgZihhLCBhKTogcGFzcycKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZHVwbGljYXRlIGFyZ3VtZW50cyIpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyAnZGVmIGYoYSA9IDAsIGEgPSAxKTogcGFzcycKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZHVwbGljYXRlIGtleXdvcmQgYXJndW1lbnRzIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjICdkZWYgZihhKTogZ2xvYmFsIGE7IGEgPSAxJworICAgICAgICAgICAgc2VsZi5mYWlsKCJ2YXJpYWJsZSBpcyBnbG9iYWwgYW5kIGxvY2FsIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc3ludGF4X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwgIjErKjMiLCAiZmlsZW5hbWUiLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdF9ub25lX2tleXdvcmRfYXJnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwgImYoTm9uZT0xKSIsICI8c3RyaW5nPiIsICJleGVjIikKKworICAgIGRlZiB0ZXN0X2R1cGxpY2F0ZV9nbG9iYWxfbG9jYWwoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgJ2RlZiBmKGEpOiBnbG9iYWwgYTsgYSA9IDEnCisgICAgICAgICAgICBzZWxmLmZhaWwoInZhcmlhYmxlIGlzIGdsb2JhbCBhbmQgbG9jYWwiKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9leGVjX2Z1bmN0aW9uYWxfc3R5bGUoc2VsZik6CisgICAgICAgICMgRXhlYydpbmcgYSB0dXBsZSBvZiBsZW5ndGggMiB3b3Jrcy4KKyAgICAgICAgZyA9IHsnYic6IDJ9CisgICAgICAgIGV4ZWMoImEgPSBiICsgMSIsIGcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ1snYSddLCAzKQorCisgICAgICAgICMgQXMgZG9lcyBleGVjJ2luZyBhIHR1cGxlIG9mIGxlbmd0aCAzLgorICAgICAgICBsID0geydiJzogM30KKyAgICAgICAgZyA9IHsnYic6IDUsICdjJzogN30KKyAgICAgICAgZXhlYygiYSA9IGIgKyBjIiwgZywgbCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsIGcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobFsnYSddLCAxMCkKKworICAgICAgICAjIFR1cGxlcyBub3Qgb2YgbGVuZ3RoIDIgb3IgMyBhcmUgaW52YWxpZC4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgZXhlYygiYSA9IGIgKyAxIiwpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgZXhlYygiYSA9IGIgKyAxIiwge30sIHt9LCB7fSkKKworICAgICAgICAjIENhbid0IG1peCBhbmQgbWF0Y2ggdGhlIHR3byBjYWxsaW5nIGZvcm1zLgorICAgICAgICBnID0geydhJzogMywgJ2InOiA0fQorICAgICAgICBsID0ge30KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgZXhlYygiYSA9IGIgKyAxIiwgZykgaW4gZworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBleGVjKCJhID0gYiArIDEiLCBnLCBsKSBpbiBnLCBsCisKKyAgICBkZWYgdGVzdF9leGVjX3dpdGhfZ2VuZXJhbF9tYXBwaW5nX2Zvcl9sb2NhbHMoc2VsZik6CisKKyAgICAgICAgY2xhc3MgTToKKyAgICAgICAgICAgICJUZXN0IG1hcHBpbmcgaW50ZXJmYWNlIHZlcnN1cyBwb3NzaWJsZSBjYWxscyBmcm9tIGV2YWwoKS4iCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICBpZiBrZXkgPT0gJ2EnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTIKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0cyA9IChrZXksIHZhbHVlKQorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QoJ3h5eicpCisKKyAgICAgICAgbSA9IE0oKQorICAgICAgICBnID0gZ2xvYmFscygpCisgICAgICAgIGV4ZWMgJ3ogPSBhJyBpbiBnLCBtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZXN1bHRzLCAoJ3onLCAxMikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgJ3ogPSBiJyBpbiBnLCBtCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0RpZCBub3QgZGV0ZWN0IGEgS2V5RXJyb3InKQorICAgICAgICBleGVjICd6ID0gZGlyKCknIGluIGcsIG0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlc3VsdHMsICgneicsIGxpc3QoJ3h5eicpKSkKKyAgICAgICAgZXhlYyAneiA9IGdsb2JhbHMoKScgaW4gZywgbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVzdWx0cywgKCd6JywgZykpCisgICAgICAgIGV4ZWMgJ3ogPSBsb2NhbHMoKScgaW4gZywgbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVzdWx0cywgKCd6JywgbSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgJ3ogPSBiJyBpbiBtCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0RpZCBub3QgdmFsaWRhdGUgZ2xvYmFscyBhcyBhIHJlYWwgZGljdCcpCisKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgICJOb24tbWFwcGluZyIKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbSA9IEEoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjICd6ID0gYScgaW4gZywgbQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdEaWQgbm90IHZhbGlkYXRlIGxvY2FscyBhcyBhIG1hcHBpbmcnKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgZGljdCBzdWJjbGFzc2VzIHdvcmsgYXMgd2VsbAorICAgICAgICBjbGFzcyBEKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09ICdhJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEyCisgICAgICAgICAgICAgICAgcmV0dXJuIGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQorICAgICAgICBkID0gRCgpCisgICAgICAgIGV4ZWMgJ3ogPSBhJyBpbiBnLCBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsneiddLCAxMikKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2FyZyhzZWxmKToKKyAgICAgICAgbG9uZ2V4cHIgPSAneCA9IHggb3IgJyArICcteCcgKiAyNTAwCisgICAgICAgIGNvZGUgPSAnJycKK2RlZiBmKHgpOgorICAgICVzCisgICAgJXMKKyAgICAlcworICAgICVzCisgICAgJXMKKyAgICAlcworICAgICVzCisgICAgJXMKKyAgICAlcworICAgICVzCisgICAgIyB0aGUgZXhwcmVzc2lvbnMgYWJvdmUgaGF2ZSBubyBlZmZlY3QsIHggPT0gYXJndW1lbnQKKyAgICB3aGlsZSB4OgorICAgICAgICB4IC09IDEKKyAgICAgICAgIyBFWFRFTkRFRF9BUkcvSlVNUF9BQlNPTFVURSBoZXJlCisgICAgcmV0dXJuIHgKKycnJyAlICgobG9uZ2V4cHIsKSoxMCkKKyAgICAgICAgZXhlYyBjb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZig1KSwgMCkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhfYXJncyhzZWxmKToKKworICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgICAgICgidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwgU3ludGF4V2FybmluZykpOgorICAgICAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoJycnCisgICAgICAgIGRlZiBjb21wX2FyZ3MoKGEsIGIpKToKKyAgICAgICAgICAgIHJldHVybiBhLGIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wX2FyZ3MoKDEsIDIpKSwgKDEsIDIpKQorCisgICAgICAgIGRlZiBjb21wX2FyZ3MoKGEsIGIpPSgzLCA0KSk6CisgICAgICAgICAgICByZXR1cm4gYSwgYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBfYXJncygoMSwgMikpLCAoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcF9hcmdzKCksICgzLCA0KSkKKworICAgICAgICBkZWYgY29tcF9hcmdzKGEsIChiLCBjKSk6CisgICAgICAgICAgICByZXR1cm4gYSwgYiwgYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBfYXJncygxLCAoMiwgMykpLCAoMSwgMiwgMykpCisKKyAgICAgICAgZGVmIGNvbXBfYXJncyhhPTIsIChiLCBjKT0oMywgNCkpOgorICAgICAgICAgICAgcmV0dXJuIGEsIGIsIGMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wX2FyZ3MoMSwgKDIsIDMpKSwgKDEsIDIsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBfYXJncygpLCAoMiwgMywgNCkpCisgICAgICAgICcnJykKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50X29yZGVyKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjICdkZWYgZihhPTEsIChiLCBjKSk6IHBhc3MnCisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vbi1kZWZhdWx0IGFyZ3MgYWZ0ZXIgZGVmYXVsdCIpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2Zsb2F0X2xpdGVyYWxzKHNlbGYpOgorICAgICAgICAjIHRlc3RpbmcgYmFkIGZsb2F0IGxpdGVyYWxzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiMmUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgIjIuMGUrIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICIxZS0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgIjMtNGUvMjEiKQorCisgICAgZGVmIHRlc3RfaW5kZW50YXRpb24oc2VsZik6CisgICAgICAgICMgdGVzdGluZyBjb21waWxlKCkgb2YgaW5kZW50ZWQgYmxvY2sgdy9vIHRyYWlsaW5nIG5ld2xpbmUiCisgICAgICAgIHMgPSAiIiIKK2lmIDE6CisgICAgaWYgMjoKKyAgICAgICAgcGFzcyIiIgorICAgICAgICBjb21waWxlKHMsICI8c3RyaW5nPiIsICJleGVjIikKKworICAgICMgVGhpcyB0ZXN0IGlzIHByb2JhYmx5IHNwZWNpZmljIHRvIENQeXRob24gYW5kIG1heSBub3QgZ2VuZXJhbGl6ZQorICAgICMgdG8gb3RoZXIgaW1wbGVtZW50YXRpb25zLiAgV2UgYXJlIHRyeWluZyB0byBlbnN1cmUgdGhhdCB3aGVuCisgICAgIyB0aGUgZmlyc3QgbGluZSBvZiBjb2RlIHN0YXJ0cyBhZnRlciAyNTYsIGNvcnJlY3QgbGluZSBudW1iZXJzCisgICAgIyBpbiB0cmFjZWJhY2tzIGFyZSBzdGlsbCBwcm9kdWNlZC4KKyAgICBkZWYgdGVzdF9sZWFkaW5nX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBzMjU2ID0gIiIuam9pbihbIlxuIl0gKiAyNTYgKyBbInNwYW0iXSkKKyAgICAgICAgY28gPSBjb21waWxlKHMyNTYsICdmbicsICdleGVjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjby5jb19maXJzdGxpbmVubywgMjU3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX2xub3RhYiwgJycpCisKKyAgICBkZWYgdGVzdF9saXRlcmFsc193aXRoX2xlYWRpbmdfemVyb2VzKHNlbGYpOgorICAgICAgICBmb3IgYXJnIGluIFsiMDc3Nzg3IiwgIjB4aiIsICIweC4iLCAiMGUiLCAgIjA5MDAwMDAwMDAwMDAwMCIsCisgICAgICAgICAgICAgICAgICAgICIwODAwMDAwMDAwMDAwMDAiLCAiMDAwMDAwMDAwMDAwMDA5IiwgIjAwMDAwMDAwMDAwMDAwOCIsCisgICAgICAgICAgICAgICAgICAgICIwYjQyIiwgIjBCQURDQUZFIiwgIjBvMTIzNDU2Nzg5IiwgIjBiMS4xIiwgIjBvNC4yIiwKKyAgICAgICAgICAgICAgICAgICAgIjBiMTAxajIiLCAiMG8xNTNqMiIsICIwYjEwMGUxIiwgIjBvNzc3ZTEiLCAiMG84IiwgIjBvNzgiXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCBhcmcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwNzc3IiksIDUxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwNzc3TCIpLCA1MTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDAwNzc3IiksIDUxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIweGZmIiksIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIweGZmTCIpLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMFhmRiIpLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDc3Ny4iKSwgNzc3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA3NzcuMCIpLCA3NzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwNzc3ZTAiKSwgNzc3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA3NzdlMSIpLCA3NzcwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjBlMCIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjAwMDBFLTAxMiIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA5LjUiKSwgOS41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA3NzdqIiksIDc3N2opCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDBqIiksIDBqKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjAwLjAiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwZTMiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwOTAwMDAwMDAwMDAwMDAuIiksIDkwMDAwMDAwMDAwMDAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwOTAwMDAwMDAwMDAwMDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIpLCA5MDAwMDAwMDAwMDAwMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDkwMDAwMDAwMDAwMDAwZTAiKSwgOTAwMDAwMDAwMDAwMDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjA5MDAwMDAwMDAwMDAwMGUtMCIpLCA5MDAwMDAwMDAwMDAwMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDkwMDAwMDAwMDAwMDAwaiIpLCA5MDAwMDAwMDAwMDAwMGopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDAwMDAwMDAwMDAwMDA3IiksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDAwMDAwMDAwMDAwMDA4LiIpLCA4LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMDAwMDAwMDAwMDAwMDkuIiksIDkuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjBiMTAxMDEwIiksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIi0wYjAwMDAwMDAwMDAxMCIpLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwbzc3NyIpLCA1MTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiLTBvMDAwMDAxMCIpLCAtOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCIwMjAwMDAwMDAwMDAuMCIpLCAyMDAwMDAwMDAwMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIjAzNzc3Nzc3Nzc3N2UwIiksIDM3Nzc3Nzc3Nzc3LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAuMCkKKworICAgIGRlZiB0ZXN0X3VuYXJ5X21pbnVzKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0cmVhdG1lbnQgb2YgdW5hcnkgbWludXMgb24gbmVnYXRpdmUgbnVtYmVycyBTRiBidWcgIzY2MDQ1NQorICAgICAgICBpZiBzeXMubWF4aW50ID09IDIxNDc0ODM2NDc6CisgICAgICAgICAgICAjIDMyLWJpdCBtYWNoaW5lCisgICAgICAgICAgICBhbGxfb25lX2JpdHMgPSAnMHhmZmZmZmZmZicKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChhbGxfb25lX2JpdHMpLCA0Mjk0OTY3Mjk1TCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgiLSIgKyBhbGxfb25lX2JpdHMpLCAtNDI5NDk2NzI5NUwpCisgICAgICAgIGVsaWYgc3lzLm1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICAgICAgIyA2NC1iaXQgbWFjaGluZQorICAgICAgICAgICAgYWxsX29uZV9iaXRzID0gJzB4ZmZmZmZmZmZmZmZmZmZmZicKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChhbGxfb25lX2JpdHMpLCAxODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIi0iICsgYWxsX29uZV9iaXRzKSwgLTE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiSG93IG1hbnkgYml0cyAqZG9lcyogdGhpcyBtYWNoaW5lIGhhdmU/Pz8iKQorICAgICAgICAjIFZlcmlmeSB0cmVhdG1lbnQgb2YgY29uc3RhbnQgZm9sZGluZyBvbiAtKHN5cy5tYXhpbnQrMSkKKyAgICAgICAgIyBpLmUuIC0yMTQ3NDgzNjQ4IG9uIDMyIGJpdCBwbGF0Zm9ybXMuICBTaG91bGQgcmV0dXJuIGludCwgbm90IGxvbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShldmFsKCIlcyIgJSAoLXN5cy5tYXhpbnQgLSAxKSksIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGV2YWwoIiVzIiAlICgtc3lzLm1heGludCAtIDIpKSwgbG9uZykKKworICAgIGlmIHN5cy5tYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwNzoKKyAgICAgICAgZGVmIHRlc3RfMzJfNjNfYml0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgICAgIGEgPSArNDI5NDk2NzI5NiAgIyAxIDw8IDMyCisgICAgICAgICAgICBiID0gLTQyOTQ5NjcyOTYgICMgMSA8PCAzMgorICAgICAgICAgICAgYyA9ICsyODE0NzQ5NzY3MTA2NTYgICMgMSA8PCA0OAorICAgICAgICAgICAgZCA9IC0yODE0NzQ5NzY3MTA2NTYgICMgMSA8PCA0OAorICAgICAgICAgICAgZSA9ICs0NjExNjg2MDE4NDI3Mzg3OTA0ICAjIDEgPDwgNjIKKyAgICAgICAgICAgIGYgPSAtNDYxMTY4NjAxODQyNzM4NzkwNCAgIyAxIDw8IDYyCisgICAgICAgICAgICBnID0gKzkyMjMzNzIwMzY4NTQ3NzU4MDcgICMgMSA8PCA2MyAtIDEKKyAgICAgICAgICAgIGggPSAtOTIyMzM3MjAzNjg1NDc3NTgwNyAgIyAxIDw8IDYzIC0gMQorCisgICAgICAgICAgICBmb3IgdmFyaWFibGUgaW4gc2VsZi50ZXN0XzMyXzYzX2JpdF92YWx1ZXMuZnVuY19jb2RlLmNvX2NvbnN0czoKKyAgICAgICAgICAgICAgICBpZiB2YXJpYWJsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZhcmlhYmxlLCBpbnQpCisKKyAgICBkZWYgdGVzdF9zZXF1ZW5jZV91bnBhY2tpbmdfZXJyb3Ioc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHNlcXVlbmNlIHBhY2tpbmcvdW5wYWNraW5nIHdpdGggIm9yIi4gIFNGIGJ1ZyAjNzU3ODE4CisgICAgICAgIGksaiA9ICgxLCAtMSkgb3IgKC0xLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaiwgLTEpCisKKyAgICBkZWYgdGVzdF9ub25lX2Fzc2lnbm1lbnQoc2VsZik6CisgICAgICAgIHN0bXRzID0gWworICAgICAgICAgICAgJ05vbmUgPSAwJywKKyAgICAgICAgICAgICdOb25lICs9IDAnLAorICAgICAgICAgICAgJ19fYnVpbHRpbnNfXy5Ob25lID0gMCcsCisgICAgICAgICAgICAnZGVmIE5vbmUoKTogcGFzcycsCisgICAgICAgICAgICAnY2xhc3MgTm9uZTogcGFzcycsCisgICAgICAgICAgICAnKGEsIE5vbmUpID0gMCwgMCcsCisgICAgICAgICAgICAnZm9yIE5vbmUgaW4gcmFuZ2UoMTApOiBwYXNzJywKKyAgICAgICAgICAgICdkZWYgZihOb25lKTogcGFzcycsCisgICAgICAgICAgICAnaW1wb3J0IE5vbmUnLAorICAgICAgICAgICAgJ2ltcG9ydCB4IGFzIE5vbmUnLAorICAgICAgICAgICAgJ2Zyb20geCBpbXBvcnQgTm9uZScsCisgICAgICAgICAgICAnZnJvbSB4IGltcG9ydCB5IGFzIE5vbmUnCisgICAgICAgIF0KKyAgICAgICAgZm9yIHN0bXQgaW4gc3RtdHM6CisgICAgICAgICAgICBzdG10ICs9ICJcbiIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCBzdG10LCAndG1wJywgJ3NpbmdsZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZSwgc3RtdCwgJ3RtcCcsICdleGVjJykKKyAgICAgICAgIyBUaGlzIGlzIG9rLgorICAgICAgICBjb21waWxlKCJmcm9tIE5vbmUgaW1wb3J0IHgiLCAidG1wIiwgImV4ZWMiKQorICAgICAgICBjb21waWxlKCJmcm9tIHggaW1wb3J0IE5vbmUgYXMgeSIsICJ0bXAiLCAiZXhlYyIpCisgICAgICAgIGNvbXBpbGUoImltcG9ydCBOb25lIGFzIHgiLCAidG1wIiwgImV4ZWMiKQorCisgICAgZGVmIHRlc3RfaW1wb3J0KHNlbGYpOgorICAgICAgICBzdWNjZWVkID0gWworICAgICAgICAgICAgJ2ltcG9ydCBzeXMnLAorICAgICAgICAgICAgJ2ltcG9ydCBvcywgc3lzJywKKyAgICAgICAgICAgICdpbXBvcnQgb3MgYXMgYmFyJywKKyAgICAgICAgICAgICdpbXBvcnQgb3MucGF0aCBhcyBiYXInLAorICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcywgZ2VuZXJhdG9ycycsCisgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAobmVzdGVkX3Njb3BlcyxcbmdlbmVyYXRvcnMpJywKKyAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChuZXN0ZWRfc2NvcGVzLFxuZ2VuZXJhdG9ycywpJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgc3RkaW4sIHN0ZGVyciwgc3Rkb3V0JywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKHN0ZGluLCBzdGRlcnIsXG5zdGRvdXQpJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKHN0ZGluLCBzdGRlcnIsXG5zdGRvdXQsKScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IChzdGRpblxuLCBzdGRlcnIsIHN0ZG91dCknLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCAoc3RkaW5cbiwgc3RkZXJyLCBzdGRvdXQsKScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IHN0ZGluIGFzIHNpLCBzdGRvdXQgYXMgc28sIHN0ZGVyciBhcyBzZScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IChzdGRpbiBhcyBzaSwgc3Rkb3V0IGFzIHNvLCBzdGRlcnIgYXMgc2UpJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgKHN0ZGluIGFzIHNpLCBzdGRvdXQgYXMgc28sIHN0ZGVyciBhcyBzZSwpJywKKyAgICAgICAgICAgIF0KKyAgICAgICAgZmFpbCA9IFsKKyAgICAgICAgICAgICdpbXBvcnQgKG9zLCBzeXMpJywKKyAgICAgICAgICAgICdpbXBvcnQgKG9zKSwgKHN5cyknLAorICAgICAgICAgICAgJ2ltcG9ydCAoKG9zKSwgKHN5cykpJywKKyAgICAgICAgICAgICdpbXBvcnQgKHN5cycsCisgICAgICAgICAgICAnaW1wb3J0IHN5cyknLAorICAgICAgICAgICAgJ2ltcG9ydCAob3MsKScsCisgICAgICAgICAgICAnaW1wb3J0IG9zIEFzIGJhcicsCisgICAgICAgICAgICAnaW1wb3J0IG9zLnBhdGggYSBiYXInLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiBBcyBzdGRvdXQnLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiBhIHN0ZG91dCcsCisgICAgICAgICAgICAnZnJvbSAoc3lzKSBpbXBvcnQgc3RkaW4nLAorICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgKG5lc3RlZF9zY29wZXMnLAorICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcyknLAorICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcyxcbmdlbmVyYXRvcnMnLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCAoc3RkaW4nLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiknLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiwgc3Rkb3V0LFxuc3RkZXJyJywKKyAgICAgICAgICAgICdmcm9tIHN5cyBpbXBvcnQgc3RkaW4gc2knLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiwnCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0ICgqKScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IChzdGRpbiwsIHN0ZG91dCwgc3RkZXJyKScsCisgICAgICAgICAgICAnZnJvbSBzeXMgaW1wb3J0IChzdGRpbiwgc3Rkb3V0KSwnLAorICAgICAgICAgICAgXQorICAgICAgICBmb3Igc3RtdCBpbiBzdWNjZWVkOgorICAgICAgICAgICAgY29tcGlsZShzdG10LCAndG1wJywgJ2V4ZWMnKQorICAgICAgICBmb3Igc3RtdCBpbiBmYWlsOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIHN0bXQsICd0bXAnLCAnZXhlYycpCisKKyAgICBkZWYgdGVzdF9mb3JfZGlzdGluY3RfY29kZV9vYmplY3RzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAxMDQ4ODcwCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmMSA9IGxhbWJkYSB4PTE6IHgKKyAgICAgICAgICAgIGYyID0gbGFtYmRhIHg9MjogeAorICAgICAgICAgICAgcmV0dXJuIGYxLCBmMgorICAgICAgICBmMSwgZjIgPSBmKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChmMS5mdW5jX2NvZGUpLCBpZChmMi5mdW5jX2NvZGUpKQorCisgICAgZGVmIHRlc3RfbGFtYmRhX2RvYyhzZWxmKToKKyAgICAgICAgbCA9IGxhbWJkYTogImZvbyIKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobC5fX2RvY19fKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgY29kZSA9IHUiIyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbnBhc3NcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIGNvZGUsICJ0bXAiLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdF9zdWJzY3JpcHRzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAxNDQ4ODA0CisgICAgICAgICMgQ2xhc3MgdG8gbWFrZSB0ZXN0aW5nIHN1YnNjcmlwdCByZXN1bHRzIGVhc3kKKyAgICAgICAgY2xhc3Mgc3RyX21hcChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHt9CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kYXRhW3N0cihrZXkpXQorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YVtzdHIoa2V5KV0gPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgZGVsIHNlbGYuZGF0YVtzdHIoa2V5KV0KKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKGtleSkgaW4gc2VsZi5kYXRhCisgICAgICAgIGQgPSBzdHJfbWFwKCkKKyAgICAgICAgIyBJbmRleAorICAgICAgICBkWzFdID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIDEpCisgICAgICAgIGRbMV0gKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIDIpCisgICAgICAgIGRlbCBkWzFdCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMSwgZCkKKyAgICAgICAgIyBUdXBsZSBvZiBpbmRpY2VzCisgICAgICAgIGRbMSwgMV0gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxLCAxXSwgMSkKKyAgICAgICAgZFsxLCAxXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxLCAxXSwgMikKKyAgICAgICAgZGVsIGRbMSwgMV0KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigoMSwgMSksIGQpCisgICAgICAgICMgU2ltcGxlIHNsaWNlCisgICAgICAgIGRbMToyXSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzE6Ml0sIDEpCisgICAgICAgIGRbMToyXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxOjJdLCAyKQorICAgICAgICBkZWwgZFsxOjJdCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oc2xpY2UoMSwgMiksIGQpCisgICAgICAgICMgVHVwbGUgb2Ygc2ltcGxlIHNsaWNlcworICAgICAgICBkWzE6MiwgMToyXSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzE6MiwgMToyXSwgMSkKKyAgICAgICAgZFsxOjIsIDE6Ml0gKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMToyLCAxOjJdLCAyKQorICAgICAgICBkZWwgZFsxOjIsIDE6Ml0KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigoc2xpY2UoMSwgMiksIHNsaWNlKDEsIDIpKSwgZCkKKyAgICAgICAgIyBFeHRlbmRlZCBzbGljZQorICAgICAgICBkWzE6MjozXSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzE6MjozXSwgMSkKKyAgICAgICAgZFsxOjI6M10gKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMToyOjNdLCAyKQorICAgICAgICBkZWwgZFsxOjI6M10KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihzbGljZSgxLCAyLCAzKSwgZCkKKyAgICAgICAgIyBUdXBsZSBvZiBleHRlbmRlZCBzbGljZXMKKyAgICAgICAgZFsxOjI6MywgMToyOjNdID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMToyOjMsIDE6MjozXSwgMSkKKyAgICAgICAgZFsxOjI6MywgMToyOjNdICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzE6MjozLCAxOjI6M10sIDIpCisgICAgICAgIGRlbCBkWzE6MjozLCAxOjI6M10KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigoc2xpY2UoMSwgMiwgMyksIHNsaWNlKDEsIDIsIDMpKSwgZCkKKyAgICAgICAgIyBFbGxpcHNpcworICAgICAgICBkWy4uLl0gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsuLi5dLCAxKQorICAgICAgICBkWy4uLl0gKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbLi4uXSwgMikKKyAgICAgICAgZGVsIGRbLi4uXQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKEVsbGlwc2lzLCBkKQorICAgICAgICAjIFR1cGxlIG9mIEVsbGlwc2VzCisgICAgICAgIGRbLi4uLCAuLi5dID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbLi4uLCAuLi5dLCAxKQorICAgICAgICBkWy4uLiwgLi4uXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsuLi4sIC4uLl0sIDIpCisgICAgICAgIGRlbCBkWy4uLiwgLi4uXQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKChFbGxpcHNpcywgRWxsaXBzaXMpLCBkKQorCisgICAgZGVmIHRlc3RfbWFuZ2xpbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIF9fbWFuZ2xlZCA9IDEKKyAgICAgICAgICAgICAgICBfX25vdF9tYW5nbGVkX18gPSAyCisgICAgICAgICAgICAgICAgaW1wb3J0IF9fbWFuZ2xlZF9tb2QKKyAgICAgICAgICAgICAgICBpbXBvcnQgX19wYWNrYWdlX18ubW9kdWxlCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiX0FfX21hbmdsZWQiLCBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydEluKCJfX25vdF9tYW5nbGVkX18iLCBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydEluKCJfQV9fbWFuZ2xlZF9tb2QiLCBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydEluKCJfX3BhY2thZ2VfXyIsIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCisKKyAgICBkZWYgdGVzdF9jb21waWxlX2FzdChzZWxmKToKKyAgICAgICAgZm5hbWUgPSBfX2ZpbGVfXworICAgICAgICBpZiBmbmFtZS5sb3dlcigpLmVuZHN3aXRoKCgncHljJywgJ3B5bycpKToKKyAgICAgICAgICAgIGZuYW1lID0gZm5hbWVbOi0xXQorICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICdyJykgYXMgZjoKKyAgICAgICAgICAgIGZjb250ZW50cyA9IGYucmVhZCgpCisgICAgICAgIHNhbXBsZV9jb2RlID0gWworICAgICAgICAgICAgWyc8YXNzaWduPicsICd4ID0gNSddLAorICAgICAgICAgICAgWyc8cHJpbnQxPicsICdwcmludCAxJ10sCisgICAgICAgICAgICBbJzxwcmludHY+JywgJ3ByaW50IHYnXSwKKyAgICAgICAgICAgIFsnPHByaW50VHJ1ZT4nLCAncHJpbnQgVHJ1ZSddLAorICAgICAgICAgICAgWyc8cHJpbnRMaXN0PicsICdwcmludCBbXSddLAorICAgICAgICAgICAgWyc8aWZibG9jaz4nLCAiIiJpZiBUcnVlOlxuICAgIHBhc3NcbiIiIl0sCisgICAgICAgICAgICBbJzxmb3JibG9jaz4nLCAiIiJmb3IgbiBpbiBbMSwgMiwgM106XG4gICAgcHJpbnQgblxuIiIiXSwKKyAgICAgICAgICAgIFsnPGRlZmZ1bmM+JywgIiIiZGVmIGZvbygpOlxuICAgIHBhc3NcbmZvbygpXG4iIiJdLAorICAgICAgICAgICAgW2ZuYW1lLCBmY29udGVudHNdLAorICAgICAgICBdCisKKyAgICAgICAgZm9yIGZuYW1lLCBjb2RlIGluIHNhbXBsZV9jb2RlOgorICAgICAgICAgICAgY28xID0gY29tcGlsZShjb2RlLCAnJXMxJyAlIGZuYW1lLCAnZXhlYycpCisgICAgICAgICAgICBhc3QgPSBjb21waWxlKGNvZGUsICclczInICUgZm5hbWUsICdleGVjJywgX2FzdC5QeUNGX09OTFlfQVNUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYXN0KSA9PSBfYXN0Lk1vZHVsZSkKKyAgICAgICAgICAgIGNvMiA9IGNvbXBpbGUoYXN0LCAnJXMzJyAlIGZuYW1lLCAnZXhlYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvMSwgY28yKQorICAgICAgICAgICAgIyB0aGUgY29kZSBvYmplY3QncyBmaWxlbmFtZSBjb21lcyBmcm9tIHRoZSBzZWNvbmQgY29tcGlsYXRpb24gc3RlcAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbzIuY29fZmlsZW5hbWUsICclczMnICUgZm5hbWUpCisKKyAgICAgICAgIyByYWlzZSBleGNlcHRpb24gd2hlbiBub2RlIHR5cGUgZG9lc24ndCBtYXRjaCB3aXRoIGNvbXBpbGUgbW9kZQorICAgICAgICBjbzEgPSBjb21waWxlKCdwcmludCAxJywgJzxzdHJpbmc+JywgJ2V4ZWMnLCBfYXN0LlB5Q0ZfT05MWV9BU1QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGlsZSwgY28xLCAnPGFzdD4nLCAnZXZhbCcpCisKKyAgICAgICAgIyByYWlzZSBleGNlcHRpb24gd2hlbiBub2RlIHR5cGUgaXMgbm8gc3RhcnQgbm9kZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBpbGUsIF9hc3QuSWYoKSwgJzxhc3Q+JywgJ2V4ZWMnKQorCisgICAgICAgICMgcmFpc2UgZXhjZXB0aW9uIHdoZW4gbm9kZSBoYXMgaW52YWxpZCBjaGlsZHJlbgorICAgICAgICBhc3QgPSBfYXN0Lk1vZHVsZSgpCisgICAgICAgIGFzdC5ib2R5ID0gW19hc3QuQm9vbE9wKCldCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGlsZSwgYXN0LCAnPGFzdD4nLCAnZXhlYycpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFNwZWNpZmljcykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzc1ZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzc1ZDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZmNjk4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVhbGwucHkKQEAgLTAsMCArMSw4MCBAQAoraW1wb3J0IGNvbXBpbGVhbGwKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcworaW1wb3J0IHB5X2NvbXBpbGUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCB0ZW1wZmlsZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIENvbXBpbGVhbGxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYuc291cmNlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksICdfdGVzdC5weScpCisgICAgICAgIHNlbGYuYmNfcGF0aCA9IHNlbGYuc291cmNlX3BhdGggKyAoJ2MnIGlmIF9fZGVidWdfXyBlbHNlICdvJykKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuc291cmNlX3BhdGgsICd3JykgYXMgZmlsZToKKyAgICAgICAgICAgIGZpbGUud3JpdGUoJ3ggPSAxMjNcbicpCisgICAgICAgIHNlbGYuc291cmNlX3BhdGgyID0gb3MucGF0aC5qb2luKHNlbGYuZGlyZWN0b3J5LCAnX3Rlc3QyLnB5JykKKyAgICAgICAgc2VsZi5iY19wYXRoMiA9IHNlbGYuc291cmNlX3BhdGgyICsgKCdjJyBpZiBfX2RlYnVnX18gZWxzZSAnbycpCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZShzZWxmLnNvdXJjZV9wYXRoLCBzZWxmLnNvdXJjZV9wYXRoMikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmRpcmVjdG9yeSkKKworICAgIGRlZiBkYXRhKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAncmInKSBhcyBmaWxlOgorICAgICAgICAgICAgZGF0YSA9IGZpbGUucmVhZCg4KQorICAgICAgICBtdGltZSA9IGludChvcy5zdGF0KHNlbGYuc291cmNlX3BhdGgpLnN0X210aW1lKQorICAgICAgICBjb21wYXJlID0gc3RydWN0LnBhY2soJzw0c2wnLCBpbXAuZ2V0X21hZ2ljKCksIG10aW1lKQorICAgICAgICByZXR1cm4gZGF0YSwgY29tcGFyZQorCisgICAgZGVmIHJlY3JlYXRpb25fY2hlY2soc2VsZiwgbWV0YWRhdGEpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGNvbXBpbGVhbGwgcmVjcmVhdGVzIGJ5dGVjb2RlIHdoZW4gdGhlIG5ldyBtZXRhZGF0YSBpcworICAgICAgICB1c2VkLiIiIgorICAgICAgICBpZiBub3QgaGFzYXR0cihvcywgJ3N0YXQnKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoc2VsZi5zb3VyY2VfcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgqc2VsZi5kYXRhKCkpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmJjX3BhdGgsICdyYicpIGFzIGZpbGU6CisgICAgICAgICAgICBiYyA9IGZpbGUucmVhZCgpW2xlbihtZXRhZGF0YSk6XQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5iY19wYXRoLCAnd2InKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZShtZXRhZGF0YSkKKyAgICAgICAgICAgIGZpbGUud3JpdGUoYmMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoKnNlbGYuZGF0YSgpKQorICAgICAgICBjb21waWxlYWxsLmNvbXBpbGVfZGlyKHNlbGYuZGlyZWN0b3J5LCBmb3JjZT1GYWxzZSwgcXVpZXQ9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCpzZWxmLmRhdGEoKSkKKworICAgIGRlZiB0ZXN0X210aW1lKHNlbGYpOgorICAgICAgICAjIFRlc3QgYSBjaGFuZ2UgaW4gbXRpbWUgbGVhZHMgdG8gYSBuZXcgLnB5Yy4KKyAgICAgICAgc2VsZi5yZWNyZWF0aW9uX2NoZWNrKHN0cnVjdC5wYWNrKCc8NHNsJywgaW1wLmdldF9tYWdpYygpLCAxKSkKKworICAgIGRlZiB0ZXN0X21hZ2ljX251bWJlcihzZWxmKToKKyAgICAgICAgIyBUZXN0IGEgY2hhbmdlIGluIG10aW1lIGxlYWRzIHRvIGEgbmV3IC5weWMuCisgICAgICAgIHNlbGYucmVjcmVhdGlvbl9jaGVjayhiJ1wwXDBcMFwwJykKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfZmlsZXMoc2VsZik6CisgICAgICAgICMgVGVzdCBjb21waWxpbmcgYSBzaW5nbGUgZmlsZSwgYW5kIGNvbXBsZXRlIGRpcmVjdG9yeQorICAgICAgICBmb3IgZm4gaW4gKHNlbGYuYmNfcGF0aCwgc2VsZi5iY19wYXRoMik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZuKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY29tcGlsZWFsbC5jb21waWxlX2ZpbGUoc2VsZi5zb3VyY2VfcGF0aCwgZm9yY2U9RmFsc2UsIHF1aWV0PVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShzZWxmLmJjX3BhdGgpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3Qgb3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoMikpCisgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgpCisgICAgICAgIGNvbXBpbGVhbGwuY29tcGlsZV9kaXIoc2VsZi5kaXJlY3RvcnksIGZvcmNlPUZhbHNlLCBxdWlldD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoKSBcCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3MucGF0aC5pc2ZpbGUoc2VsZi5iY19wYXRoMikpCisgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgpCisgICAgICAgIG9zLnVubGluayhzZWxmLmJjX3BhdGgyKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb21waWxlYWxsVGVzdHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBkNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlYWxsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBkNjE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZWFsbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21waWxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk4ODExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHkKQEAgLTAsMCArMSwzMTcgQEAKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorY29tcGlsZXIgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdjb21waWxlcicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2Zyb20gY29tcGlsZXIuYXN0IGltcG9ydCBmbGF0dGVuCitpbXBvcnQgb3MsIHN5cywgdGltZSwgdW5pdHRlc3QKK2Zyb20gcmFuZG9tIGltcG9ydCByYW5kb20KK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKyMgSG93IG11Y2ggdGltZSBpbiBzZWNvbmRzIGNhbiBwYXNzIGJlZm9yZSB3ZSBwcmludCBhICdTdGlsbCB3b3JraW5nJyBtZXNzYWdlLgorX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMID0gNSAqIDYwCisKK2NsYXNzIFRyaXZpYWxDb250ZXh0KG9iamVjdCk6CisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgcGFzcworCitjbGFzcyBDb21waWxlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RDb21waWxlTGlicmFyeShzZWxmKToKKyAgICAgICAgIyBBIHNpbXBsZSBidXQgbGFyZ2UgdGVzdC4gIENvbXBpbGUgYWxsIHRoZSBjb2RlIGluIHRoZQorICAgICAgICAjIHN0YW5kYXJkIGxpYnJhcnkgYW5kIGl0cyB0ZXN0IHN1aXRlLiAgVGhpcyBkb2Vzbid0IHZlcmlmeQorICAgICAgICAjIHRoYXQgYW55IG9mIHRoZSBjb2RlIGlzIGNvcnJlY3QsIG1lcmVseSB0aGUgY29tcGlsZXIgaXMgYWJsZQorICAgICAgICAjIHRvIGdlbmVyYXRlIHNvbWUga2luZCBvZiBjb2RlIGZvciBpdC4KKworICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAjIHdhcm5pbmc6IGlmICdvcycgb3IgJ3Rlc3Rfc3VwcG9ydCcgYXJlIG1vdmVkIGluIHNvbWUgb3RoZXIgZGlyLAorICAgICAgICAjIHRoZXkgc2hvdWxkIGJlIGNoYW5nZWQgaGVyZS4KKyAgICAgICAgbGliZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLl9fZmlsZV9fKQorICAgICAgICB0ZXN0ZGlyID0gb3MucGF0aC5kaXJuYW1lKHRlc3QudGVzdF9zdXBwb3J0Ll9fZmlsZV9fKQorCisgICAgICAgIGZvciBkaXIgaW4gW3Rlc3RkaXJdOgorICAgICAgICAgICAgZm9yIGJhc2VuYW1lIGluICJ0ZXN0X29zLnB5Iiw6CisgICAgICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgICAgIGlmIG5leHRfdGltZSA8PSB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgICAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgXAorICAgICAgICAgICAgICAgICAgICAgICAnICB0ZXN0Q29tcGlsZUxpYnJhcnkgc3RpbGwgd29ya2luZywgYmUgcGF0aWVudC4uLicKKyAgICAgICAgICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorCisgICAgICAgICAgICAgICAgaWYgbm90IGJhc2VuYW1lLmVuZHN3aXRoKCIucHkiKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBub3QgVEVTVF9BTEwgYW5kIHJhbmRvbSgpIDwgMC45ODoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGRpciwgYmFzZW5hbWUpCisgICAgICAgICAgICAgICAgaWYgdGVzdC50ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImNvbXBpbGluZyIsIHBhdGgKKyAgICAgICAgICAgICAgICBmID0gb3BlbihwYXRoLCAiVSIpCisgICAgICAgICAgICAgICAgYnVmID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBpZiAiYmFkc3ludGF4IiBpbiBiYXNlbmFtZSBvciAiYmFkX2NvZGluZyIgaW4gYmFzZW5hbWU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlci5jb21waWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYsIGJhc2VuYW1lLCAiZXhlYyIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZXIuY29tcGlsZShidWYsIGJhc2VuYW1lLCAiZXhlYyIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gbGlzdChlLmFyZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFwcGVuZCgiaW4gZmlsZSAlc10iICUgYmFzZW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAjYXJnc1swXSArPSAiW2luIGZpbGUgJXNdIiAlIGJhc2VuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICBlLmFyZ3MgPSB0dXBsZShhcmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiB0ZXN0TmV3Q2xhc3NTeW50YXgoc2VsZik6CisgICAgICAgIGNvbXBpbGVyLmNvbXBpbGUoImNsYXNzIGZvbygpOnBhc3NcblxuIiwiPHN0cmluZz4iLCJleGVjIikKKworICAgIGRlZiB0ZXN0WWllbGRFeHByKHNlbGYpOgorICAgICAgICBjb21waWxlci5jb21waWxlKCJkZWYgZygpOiB5aWVsZFxuXG4iLCAiPHN0cmluZz4iLCAiZXhlYyIpCisKKyAgICBkZWYgdGVzdEtleXdvcmRBZnRlclN0YXJhcmdzKHNlbGYpOgorICAgICAgICBkZWYgZigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYXJncywga3dhcmdzKSwgKCgyLDMpLCB7J3gnOiAxLCAneSc6IDR9KSkKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2YoeD0xLCAqKDIsIDMpLCB5PTQpJywgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICBleGVjIGMgaW4geydmJzogZn0KKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgY29tcGlsZXIucGFyc2UsICJmb28oYT0xLCBiKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlci5wYXJzZSwgImZvbygxLCAqYXJncywgMykiKQorCisgICAgZGVmIHRlc3RUcnlFeGNlcHRGaW5hbGx5KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBleGNlcHQgYW5kIGZpbmFsbHkgY2xhdXNlcyBpbiBvbmUgdHJ5IHN0bXQgYXJlIHJlY29nbml6ZWQKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoInRyeTpcbiAxLy8wXG5leGNlcHQ6XG4gZSA9IDFcbmZpbmFsbHk6XG4gZiA9IDEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN0cmluZz4iLCAiZXhlYyIpCisgICAgICAgIGRjdCA9IHt9CisgICAgICAgIGV4ZWMgYyBpbiBkY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY3QuZ2V0KCdlJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGN0LmdldCgnZicpLCAxKQorCisgICAgZGVmIHRlc3REZWZhdWx0QXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGVyLnBhcnNlLCAiZGVmIGZvbyhhPTEsIGIpOiBwYXNzIikKKworICAgIGRlZiB0ZXN0RG9jc3RyaW5ncyhzZWxmKToKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJyJkb2MiJywgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdfX2RvY19fJywgYy5jb19uYW1lcykKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2RlZiBmKCk6XG4gImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCisgICAgICAgIGcgPSB7fQorICAgICAgICBleGVjIGMgaW4gZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdbJ2YnXS5fX2RvY19fLCAiZG9jIikKKworICAgIGRlZiB0ZXN0TGluZU5vKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBhbGwgbm9kZXMgZXhjZXB0IE1vZHVsZSBoYXZlIGEgY29ycmVjdCBsaW5lbm8gYXR0cmlidXRlLgorICAgICAgICBmaWxlbmFtZSA9IF9fZmlsZV9fCisgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmaWxlbmFtZVs6LTFdCisgICAgICAgIHRyZWUgPSBjb21waWxlci5wYXJzZUZpbGUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuY2hlY2tfbGluZW5vKHRyZWUpCisKKyAgICBkZWYgY2hlY2tfbGluZW5vKHNlbGYsIG5vZGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9jaGVja19saW5lbm8obm9kZSkKKyAgICAgICAgZXhjZXB0IEFzc2VydGlvbkVycm9yOgorICAgICAgICAgICAgcHJpbnQgbm9kZS5fX2NsYXNzX18sIG5vZGUubGluZW5vCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIF9jaGVja19saW5lbm8oc2VsZiwgbm9kZSk6CisgICAgICAgIGlmIG5vdCBub2RlLl9fY2xhc3NfXyBpbiBOT0xJTkVOTzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShub2RlLmxpbmVubywgaW50LAorICAgICAgICAgICAgICAgICJsaW5lbm89JXMgb24gJXMiICUgKG5vZGUubGluZW5vLCBub2RlLl9fY2xhc3NfXykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm9kZS5saW5lbm8gPiAwLAorICAgICAgICAgICAgICAgICJsaW5lbm89JXMgb24gJXMiICUgKG5vZGUubGluZW5vLCBub2RlLl9fY2xhc3NfXykpCisgICAgICAgIGZvciBjaGlsZCBpbiBub2RlLmdldENoaWxkTm9kZXMoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbGluZW5vKGNoaWxkKQorCisgICAgZGVmIHRlc3RGbGF0dGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYXR0ZW4oWzEsIFsyXV0pLCBbMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxhdHRlbigoMSwgKDIsKSkpLCBbMSwgMl0pCisKKyAgICBkZWYgdGVzdE5lc3RlZFNjb3BlKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZGVmIGcoKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICBhID0gMVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGRlZiBmKCk6IHJldHVybiBhICsgMlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHJldHVybiBmKClcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCA9IGcoKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjJykKKyAgICAgICAgZGN0ID0ge30KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjdC5nZXQoJ3Jlc3VsdCcpLCAzKQorCisgICAgZGVmIHRlc3RHZW5FeHAoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCdsaXN0KChpLGopIGZvciBpIGluIHJhbmdlKDMpIGlmIGkgPCAzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICBmb3IgaiBpbiByYW5nZSg0KSBpZiBqID4gMiknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN0cmluZz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjKSwgWygwLCAzKSwgKDEsIDMpLCAoMiwgMyldKQorCisgICAgZGVmIHRlc3RTZXRMaXRlcmFsKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnezEsIDIsIDN9JywgJzxzdHJpbmc+JywgJ2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYyksIHsxLDIsM30pCisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCd7MSwgMiwgMyx9JywgJzxzdHJpbmc+JywgJ2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYyksIHsxLDIsM30pCisKKyAgICBkZWYgdGVzdERpY3RMaXRlcmFsKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnezE6MiwgMjozLCAzOjR9JywgJzxzdHJpbmc+JywgJ2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYyksIHsxOjIsIDI6MywgMzo0fSkKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ3sxOjIsIDI6MywgMzo0LH0nLCAnPHN0cmluZz4nLCAnZXZhbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChjKSwgezE6MiwgMjozLCAzOjR9KQorCisgICAgZGVmIHRlc3RTZXRDb21wKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgne3ggZm9yIHggaW4gcmFuZ2UoMSwgNCl9JywgJzxzdHJpbmc+JywgJ2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYyksIHsxLCAyLCAzfSkKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ3t4ICogeSBmb3IgeCBpbiByYW5nZSgzKSBpZiB4ICE9IDAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgZm9yIHkgaW4gcmFuZ2UoNCkgaWYgeSAhPSAwfScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdldmFsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGMpLCB7MSwgMiwgMywgNCwgNn0pCisKKyAgICBkZWYgdGVzdERpY3RDb21wKHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgne3g6eCsxIGZvciB4IGluIHJhbmdlKDEsIDQpfScsICc8c3RyaW5nPicsICdldmFsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGMpLCB7MToyLCAyOjMsIDM6NH0pCisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCd7KHgsIHkpIDogeSBmb3IgeCBpbiByYW5nZSgyKSBpZiB4ICE9IDAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICBmb3IgeSBpbiByYW5nZSgzKSBpZiB5ICE9IDB9JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdHJpbmc+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2YWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoYyksIHsoMSwgMik6IDIsICgxLCAxKTogMX0pCisKKyAgICBkZWYgdGVzdFdpdGgoc2VsZik6CisgICAgICAgICMgU0YgYnVnIDE2MzgyNDMKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZiBmKCk6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgd2l0aCBUcml2aWFsQ29udGV4dCgpOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICByZXR1cm4gMVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0ID0gZigpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdHJpbmc+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4ZWMnICkKKyAgICAgICAgZGN0ID0geydUcml2aWFsQ29udGV4dCc6IFRyaXZpYWxDb250ZXh0fQorICAgICAgICBleGVjIGMgaW4gZGN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGN0LmdldCgncmVzdWx0JyksIDEpCisKKyAgICBkZWYgdGVzdFdpdGhBc3Moc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWYgZigpOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIHdpdGggVHJpdmlhbENvbnRleHQoKSBhcyB0YzpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgcmV0dXJuIDFcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc3VsdCA9IGYoKScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3RyaW5nPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGVjJyApCisgICAgICAgIGRjdCA9IHsnVHJpdmlhbENvbnRleHQnOiBUcml2aWFsQ29udGV4dH0KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjdC5nZXQoJ3Jlc3VsdCcpLCAxKQorCisgICAgZGVmIHRlc3RXaXRoTXVsdChzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgY2xhc3MgQ3R4OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG4pOgorICAgICAgICAgICAgICAgIHNlbGYubiA9IG4KKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgZXZlbnRzLmFwcGVuZChzZWxmLm4pCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnRcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZiBmKCk6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgd2l0aCBDdHgoMSkgYXMgdGMsIEN0eCgyKSBhcyB0YzI6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgIHJldHVybiAxXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZXN1bHQgPSBmKCknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN0cmluZz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhlYycgKQorICAgICAgICBkY3QgPSB7J0N0eCc6IEN0eH0KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjdC5nZXQoJ3Jlc3VsdCcpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgWzEsIDJdKQorCisgICAgZGVmIHRlc3RHbG9iYWwoc2VsZik6CisgICAgICAgIGNvZGUgPSBjb21waWxlci5jb21waWxlKCdnbG9iYWwgeFxueD0xJywgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICBkMSA9IHsnX19idWlsdGluc19fJzoge319CisgICAgICAgIGQyID0ge30KKyAgICAgICAgZXhlYyBjb2RlIGluIGQxLCBkMgorICAgICAgICAjIHggc2hvdWxkIGJlIGluIHRoZSBnbG9iYWxzIGRpY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS5nZXQoJ3gnKSwgMSkKKworICAgIGRlZiB0ZXN0UHJpbnRGdW5jdGlvbihzZWxmKToKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb25cbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ByaW50KCJhIiwgImIiLCBzZXA9IioqIiwgZW5kPSIrKyIsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlPW91dHB1dCknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHN0cmluZz4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhlYycgKQorICAgICAgICBkY3QgPSB7J291dHB1dCc6IFN0cmluZ0lPKCl9CisgICAgICAgIGV4ZWMgYyBpbiBkY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY3RbJ291dHB1dCddLmdldHZhbHVlKCksICdhKipiKysnKQorCisgICAgZGVmIF90ZXN0RXJyRW5jKHNlbGYsIHNyYywgdGV4dCwgb2Zmc2V0KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29tcGlsZShzcmMsICIiLCAiZXhlYyIpCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5vZmZzZXQsIG9mZnNldCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS50ZXh0LCB0ZXh0KQorCisgICAgZGVmIHRlc3RTb3VyY2VDb2RlRW5jb2RpbmdzRXJyb3Ioc2VsZik6CisgICAgICAgICMgVGVzdCBTeW50YXhFcnJvciB3aXRoIGVuY29kaW5nIGRlZmluaXRpb24KKyAgICAgICAgc2ppcyA9ICJwcmludCAnXHg4M1x4NzBceDgzXHg0M1x4ODNceDVjXHg4M1x4OTMnLCAnXG4iCisgICAgICAgIGFzY2lpID0gInByaW50ICcxMjM0NTY3OCcsICdcbiIKKyAgICAgICAgZW5jZGVmID0gIiMhIC0qLSBjb2Rpbmc6IFNoaWZ0SklTIC0qLVxuIgorCisgICAgICAgICMgYXNjaWkgc291cmNlIHdpdGhvdXQgZW5jZGVmCisgICAgICAgIHNlbGYuX3Rlc3RFcnJFbmMoYXNjaWksIGFzY2lpLCAxOSkKKworICAgICAgICAjIGFzY2lpIHNvdXJjZSB3aXRoIGVuY2RlZgorICAgICAgICBzZWxmLl90ZXN0RXJyRW5jKGVuY2RlZithc2NpaSwgYXNjaWksIDE5KQorCisgICAgICAgICMgbm9uLWFzY2lpIHNvdXJjZSB3aXRoIGVuY2RlZgorICAgICAgICBzZWxmLl90ZXN0RXJyRW5jKGVuY2RlZitzamlzLCBzamlzLCAxOSkKKworICAgICAgICAjIFNoaWZ0SklTIHNvdXJjZSB3aXRob3V0IGVuY2RlZgorICAgICAgICBzZWxmLl90ZXN0RXJyRW5jKHNqaXMsIHNqaXMsIDE5KQorCisKK05PTElORU5PID0gKGNvbXBpbGVyLmFzdC5Nb2R1bGUsIGNvbXBpbGVyLmFzdC5TdG10LCBjb21waWxlci5hc3QuRGlzY2FyZCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjb2RlIGJlbG93IGlzIGp1c3QgdXNlZCB0byB0cmlnZ2VyIHNvbWUgcG9zc2libGUgZXJyb3JzLCBmb3IgdGhlIGJlbmVmaXQgb2YKKyMgdGVzdExpbmVObworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitjbGFzcyBUb3RvOgorICAgICIiImRvY3N0cmluZyIiIgorICAgIHBhc3MKKworYSwgYiA9IDIsIDMKK1tjLCBkXSA9IDUsIDYKK2wgPSBbKHgsIHkpIGZvciB4LCB5IGluIHppcChyYW5nZSg1KSwgcmFuZ2UoNSwxMCkpXQorbFswXQorbFszOjRdCitkID0geydhJzogMn0KK2QgPSB7fQorZCA9IHt4OiB5IGZvciB4LCB5IGluIHppcChyYW5nZSg1KSwgcmFuZ2UoNSwxMCkpfQorcyA9IHt4IGZvciB4IGluIHJhbmdlKDEwKX0KK3MgPSB7MX0KK3QgPSAoKQordCA9ICgxLCAyKQorbCA9IFtdCitsID0gWzEsIDJdCitpZiBsOgorICAgIHBhc3MKK2Vsc2U6CisgICAgYSwgYiA9IGIsIGEKKwordHJ5OgorICAgIHByaW50IHlvCitleGNlcHQ6CisgICAgeW8gPSAzCitlbHNlOgorICAgIHlvICs9IDMKKwordHJ5OgorICAgIGEgKz0gYgorZmluYWxseToKKyAgICBiID0gMAorCitmcm9tIG1hdGggaW1wb3J0ICoKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZ2xvYmFsIFRFU1RfQUxMCisgICAgVEVTVF9BTEwgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCJjcHUiKQorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChDb21waWxlclRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQzNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBpbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjQzNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29tcGlsZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTg2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4LnB5CkBAIC0wLDAgKzEsNjUxIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2Zyb20gcmFuZG9tIGltcG9ydCByYW5kb20KK2Zyb20gbWF0aCBpbXBvcnQgYXRhbjIsIGlzbmFuLCBjb3B5c2lnbgorCitJTkYgPSBmbG9hdCgiaW5mIikKK05BTiA9IGZsb2F0KCJuYW4iKQorIyBUaGVzZSB0ZXN0cyBlbnN1cmUgdGhhdCBjb21wbGV4IG1hdGggZG9lcyB0aGUgcmlnaHQgdGhpbmcKKworY2xhc3MgQ29tcGxleFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKGEsIGNvbXBsZXgpOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShiLCBjb21wbGV4KToKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5hc3NlcnRBbG1vc3RFcXVhbChzZWxmLCBhLnJlYWwsIGIucmVhbCkKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5hc3NlcnRBbG1vc3RFcXVhbChzZWxmLCBhLmltYWcsIGIuaW1hZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuYXNzZXJ0QWxtb3N0RXF1YWwoc2VsZiwgYS5yZWFsLCBiKQorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLmFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEuaW1hZywgMC4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGIsIGNvbXBsZXgpOgorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLmFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGEsIGIucmVhbCkKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5hc3NlcnRBbG1vc3RFcXVhbChzZWxmLCAwLiwgYi5pbWFnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5hc3NlcnRBbG1vc3RFcXVhbChzZWxmLCBhLCBiKQorCisgICAgZGVmIGFzc2VydENsb3NlQWJzKHNlbGYsIHgsIHksIGVwcz0xZS05KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWZmIGZsb2F0cyB4IGFuZCB5ICJhcmUgY2xvc2VcIiIiIgorICAgICAgICAjIHB1dCB0aGUgb25lIHdpdGggbGFyZ2VyIG1hZ25pdHVkZSBzZWNvbmQKKyAgICAgICAgaWYgYWJzKHgpID4gYWJzKHkpOgorICAgICAgICAgICAgeCwgeSA9IHksIHgKKyAgICAgICAgaWYgeSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIGFicyh4KSA8IGVwcworICAgICAgICBpZiB4ID09IDA6CisgICAgICAgICAgICByZXR1cm4gYWJzKHkpIDwgZXBzCisgICAgICAgICMgY2hlY2sgdGhhdCByZWxhdGl2ZSBkaWZmZXJlbmNlIDwgZXBzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoKHgteSkveSkgPCBlcHMpCisKKyAgICBkZWYgYXNzZXJ0RmxvYXRzQXJlSWRlbnRpY2FsKHNlbGYsIHgsIHkpOgorICAgICAgICAiIiJhc3NlcnQgdGhhdCBmbG9hdHMgeCBhbmQgeSBhcmUgaWRlbnRpY2FsLCBpbiB0aGUgc2Vuc2UgdGhhdDoKKyAgICAgICAgKDEpIGJvdGggeCBhbmQgeSBhcmUgbmFucywgb3IKKyAgICAgICAgKDIpIGJvdGggeCBhbmQgeSBhcmUgaW5maW5pdGllcywgd2l0aCB0aGUgc2FtZSBzaWduLCBvcgorICAgICAgICAoMykgYm90aCB4IGFuZCB5IGFyZSB6ZXJvcywgd2l0aCB0aGUgc2FtZSBzaWduLCBvcgorICAgICAgICAoNCkgeCBhbmQgeSBhcmUgYm90aCBmaW5pdGUgYW5kIG5vbnplcm8sIGFuZCB4ID09IHkKKworICAgICAgICAiIiIKKyAgICAgICAgbXNnID0gJ2Zsb2F0cyB7IXJ9IGFuZCB7IXJ9IGFyZSBub3QgaWRlbnRpY2FsJworCisgICAgICAgIGlmIGlzbmFuKHgpIG9yIGlzbmFuKHkpOgorICAgICAgICAgICAgaWYgaXNuYW4oeCkgYW5kIGlzbmFuKHkpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmIHggPT0geToKKyAgICAgICAgICAgIGlmIHggIT0gMC4wOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBib3RoIHplcm87IGNoZWNrIHRoYXQgc2lnbnMgbWF0Y2gKKyAgICAgICAgICAgIGVsaWYgY29weXNpZ24oMS4wLCB4KSA9PSBjb3B5c2lnbigxLjAsIHkpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtc2cgKz0gJzogemVyb3MgaGF2ZSBkaWZmZXJlbnQgc2lnbnMnCisgICAgICAgIHNlbGYuZmFpbChtc2cuZm9ybWF0KHgsIHkpKQorCisgICAgZGVmIGFzc2VydENsb3NlKHNlbGYsIHgsIHksIGVwcz0xZS05KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWZmIGNvbXBsZXhlcyB4IGFuZCB5ICJhcmUgY2xvc2VcIiIiIgorICAgICAgICBzZWxmLmFzc2VydENsb3NlQWJzKHgucmVhbCwgeS5yZWFsLCBlcHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Q2xvc2VBYnMoeC5pbWFnLCB5LmltYWcsIGVwcykKKworICAgIGRlZiBjaGVja19kaXYoc2VsZiwgeCwgeSk6CisgICAgICAgICIiIkNvbXB1dGUgY29tcGxleCB6PXgqeSwgYW5kIGNoZWNrIHRoYXQgei94PT15IGFuZCB6L3k9PXguIiIiCisgICAgICAgIHogPSB4ICogeQorICAgICAgICBpZiB4ICE9IDA6CisgICAgICAgICAgICBxID0geiAvIHgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Q2xvc2UocSwgeSkKKyAgICAgICAgICAgIHEgPSB6Ll9fZGl2X18oeCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Q2xvc2UocSwgeSkKKyAgICAgICAgICAgIHEgPSB6Ll9fdHJ1ZWRpdl9fKHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydENsb3NlKHEsIHkpCisgICAgICAgIGlmIHkgIT0gMDoKKyAgICAgICAgICAgIHEgPSB6IC8geQorICAgICAgICAgICAgc2VsZi5hc3NlcnRDbG9zZShxLCB4KQorICAgICAgICAgICAgcSA9IHouX19kaXZfXyh5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRDbG9zZShxLCB4KQorICAgICAgICAgICAgcSA9IHouX190cnVlZGl2X18oeSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Q2xvc2UocSwgeCkKKworICAgIGRlZiB0ZXN0X2RpdihzZWxmKToKKyAgICAgICAgc2ltcGxlX3JlYWwgPSBbZmxvYXQoaSkgZm9yIGkgaW4geHJhbmdlKC01LCA2KV0KKyAgICAgICAgc2ltcGxlX2NvbXBsZXggPSBbY29tcGxleCh4LCB5KSBmb3IgeCBpbiBzaW1wbGVfcmVhbCBmb3IgeSBpbiBzaW1wbGVfcmVhbF0KKyAgICAgICAgZm9yIHggaW4gc2ltcGxlX2NvbXBsZXg6CisgICAgICAgICAgICBmb3IgeSBpbiBzaW1wbGVfY29tcGxleDoKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2Rpdih4LCB5KQorCisgICAgICAgICMgQSBuYWl2ZSBjb21wbGV4IGRpdmlzaW9uIGFsZ29yaXRobSAoc3VjaCBhcyBpbiAyLjApIGlzIHZlcnkgcHJvbmUgdG8KKyAgICAgICAgIyBub25zZW5zZSBlcnJvcnMgZm9yIHRoZXNlIChvdmVyZmxvd3MgYW5kIHVuZGVyZmxvd3MpLgorICAgICAgICBzZWxmLmNoZWNrX2Rpdihjb21wbGV4KDFlMjAwLCAxZTIwMCksIDErMGopCisgICAgICAgIHNlbGYuY2hlY2tfZGl2KGNvbXBsZXgoMWUtMjAwLCAxZS0yMDApLCAxKzBqKQorCisgICAgICAgICMgSnVzdCBmb3IgZnVuLgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZGl2KGNvbXBsZXgocmFuZG9tKCksIHJhbmRvbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXgocmFuZG9tKCksIHJhbmRvbSgpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgY29tcGxleC5fX2Rpdl9fLCAxKzFqLCAwKzBqKQorICAgICAgICAjIEZJWE1FOiBUaGUgZm9sbG93aW5nIGN1cnJlbnRseSBjcmFzaGVzIG9uIEFscGhhCisgICAgICAgICMgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG93LCAxZTIwMCsxaiwgMWUyMDArMWopCisKKyAgICBkZWYgdGVzdF90cnVlZGl2KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXguX190cnVlZGl2X18oMiswaiwgMSsxaiksIDEtMWopCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBjb21wbGV4Ll9fdHJ1ZWRpdl9fLCAxKzFqLCAwKzBqKQorCisgICAgZGVmIHRlc3RfZmxvb3JkaXYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleC5fX2Zsb29yZGl2X18oMyswaiwgMS41KzBqKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGNvbXBsZXguX19mbG9vcmRpdl9fLCAzKzBqLCAwKzBqKQorCisgICAgZGVmIHRlc3RfY29lcmNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBjb21wbGV4Ll9fY29lcmNlX18sIDErMWosIDFMPDwxMDAwMCkKKworICAgIGRlZiB0ZXN0X25vX2ltcGxpY2l0X2NvZXJjZShzZWxmKToKKyAgICAgICAgIyBQeXRob24gMi43IHJlbW92ZWQgaW1wbGljaXQgY29lcmNpb24gZnJvbSB0aGUgY29tcGxleCB0eXBlCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEgKyAyLjBqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA8IDIuMGopCisKKyAgICBkZWYgdGVzdF9yaWNoY29tcGFyZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4Ll9fZXFfXygxKzFqLCAxTDw8MTAwMDApLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4Ll9fbHRfXygxKzFqLCBOb25lKSwgTm90SW1wbGVtZW50ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY29tcGxleC5fX2VxX18oMSsxaiwgMSsxaiksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoY29tcGxleC5fX2VxX18oMSsxaiwgMisyaiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKGNvbXBsZXguX19uZV9fKDErMWosIDErMWopLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhjb21wbGV4Ll9fbmVfXygxKzFqLCAyKzJqKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4Ll9fbHRfXywgMSsxaiwgMisyaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4Ll9fbGVfXywgMSsxaiwgMisyaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4Ll9fZ3RfXywgMSsxaiwgMisyaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4Ll9fZ2VfXywgMSsxaiwgMisyaikKKworICAgIGRlZiB0ZXN0X3JpY2hjb21wYXJlX2JvdW5kYXJpZXMoc2VsZik6CisgICAgICAgIGRlZiBjaGVjayhuLCBkZWx0YXMsIGlzX2VxdWFsLCBpbWFnID0gMC4wKToKKyAgICAgICAgICAgIGZvciBkZWx0YSBpbiBkZWx0YXM6CisgICAgICAgICAgICAgICAgaSA9IG4gKyBkZWx0YQorICAgICAgICAgICAgICAgIHogPSBjb21wbGV4KGksIGltYWcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhjb21wbGV4Ll9fZXFfXyh6LCBpKSwgaXNfZXF1YWwoZGVsdGEpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoY29tcGxleC5fX25lX18oeiwgaSksIG5vdCBpc19lcXVhbChkZWx0YSkpCisgICAgICAgICMgRm9yIElFRUUtNzU0IGRvdWJsZXMgdGhlIGZvbGxvd2luZyBzaG91bGQgaG9sZDoKKyAgICAgICAgIyAgICB4IGluIFsyICoqICg1MiArIGkpLCAyICoqICg1MyArIGkgKyAxKV0gLT4geCBtb2QgMiAqKiBpID09IDAKKyAgICAgICAgIyB3aGVyZSB0aGUgaW50ZXJ2YWwgaXMgcmVwcmVzZW50YWJsZSwgb2YgY291cnNlLgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAxMCk6CisgICAgICAgICAgICBwb3cgPSA1MiArIGkKKyAgICAgICAgICAgIG11bHQgPSAyICoqIGkKKyAgICAgICAgICAgIGNoZWNrKDIgKiogcG93LCByYW5nZSgxLCAxMDEpLCBsYW1iZGEgZGVsdGE6IGRlbHRhICUgbXVsdCA9PSAwKQorICAgICAgICAgICAgY2hlY2soMiAqKiBwb3csIHJhbmdlKDEsIDEwMSksIGxhbWJkYSBkZWx0YTogRmFsc2UsIGZsb2F0KGkpKQorICAgICAgICBjaGVjaygyICoqIDUzLCByYW5nZSgtMTAwLCAwKSwgbGFtYmRhIGRlbHRhOiBUcnVlKQorCisgICAgZGVmIHRlc3RfbW9kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgKDErMWopLl9fbW9kX18sIDArMGopCisKKyAgICAgICAgYSA9IDMuMzMrNC40M2oKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYSAlIDAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJtb2R1bG8gcGFyYW1hIGNhbid0IGJlIDAiKQorCisgICAgZGVmIHRlc3RfZGl2bW9kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZGl2bW9kLCAxKzFqLCAwKzBqKQorCisgICAgZGVmIHRlc3RfcG93KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygxKzFqLCAwKzBqKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHBvdygwKzBqLCAyKzBqKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcG93LCAwKzBqLCAxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMWosIC0xKSwgMS8xaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChwb3coMWosIDIwMCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvdywgMSsxaiwgMSsxaiwgMSsxaikKKworICAgICAgICBhID0gMy4zMys0LjQzagorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKiogMGosIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAqKiAwLiswLmosIDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzaiAqKiAwaiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzaiAqKiAwLCAxKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDBqICoqIGEKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgZmFpbCAwLjAgdG8gbmVnYXRpdmUgb3IgY29tcGxleCBwb3dlciIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgMGogKiogKDMtMmopCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGZhaWwgMC4wIHRvIG5lZ2F0aXZlIG9yIGNvbXBsZXggcG93ZXIiKQorCisgICAgICAgICMgVGhlIGZvbGxvd2luZyBpcyB1c2VkIHRvIGV4ZXJjaXNlIGNlcnRhaW4gY29kZSBwYXRocworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKiogMTA1LCBhICoqIDEwNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICoqIC0xMDUsIGEgKiogLTEwNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICoqIC0zMCwgYSAqKiAtMzApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLjBqICoqIDAsIDEpCisKKyAgICAgICAgYiA9IDUuMSsyLjNqCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvdywgYSwgYiwgMCkKKworICAgIGRlZiB0ZXN0X2Jvb2xjb250ZXh0KHNlbGYpOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wbGV4KHJhbmRvbSgpICsgMWUtNiwgcmFuZG9tKCkgKyAxZS02KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb21wbGV4KDAuMCwgMC4wKSkKKworICAgIGRlZiB0ZXN0X2Nvbmp1Z2F0ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRDbG9zZShjb21wbGV4KDUuMywgOS44KS5jb25qdWdhdGUoKSwgNS4zLTkuOGopCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgY2xhc3MgT1M6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOiBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKTogcmV0dXJuIHNlbGYudmFsdWUKKyAgICAgICAgY2xhc3MgTlMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6IHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOiByZXR1cm4gc2VsZi52YWx1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXgoT1MoMSsxMGopKSwgMSsxMGopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleChOUygxKzEwaikpLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCBPUyhOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCBOUyhOb25lKSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIjErMTBqIiksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMTApLCAxMCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDEwLjApLCAxMCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDEwTCksIDEwKzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMTArMGopLCAxMCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDEsMTApLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDEsMTBMKSwgMSsxMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgxLDEwLjApLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDFMLDEwKSwgMSsxMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgxTCwxMEwpLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDFMLDEwLjApLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDEuMCwxMCksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMS4wLDEwTCksIDErMTBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMS4wLDEwLjApLCAxKzEwaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDMuMTQrMGopLCAzLjE0KzBqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoMy4xNCksIDMuMTQrMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgzMTQpLCAzMTQuMCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDMxNEwpLCAzMTQuMCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDMuMTQrMGosIDBqKSwgMy4xNCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDMuMTQsIDAuMCksIDMuMTQrMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgzMTQsIDApLCAzMTQuMCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDMxNEwsIDBMKSwgMzE0LjArMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgwaiwgMy4xNGopLCAtMy4xNCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDAuMCwgMy4xNGopLCAtMy4xNCswaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KDBqLCAzLjE0KSwgMy4xNGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgwLjAsIDMuMTQpLCAzLjE0aikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIxIiksIDErMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgiMWoiKSwgMWopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgpLCAgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCItMSIpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIrMSIpLCArMSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIoMSsyaikiKSwgMSsyaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIoMS4zKzIuMmopIiksIDEuMysyLjJqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgoIjMuMTQrMUoiKSwgMy4xNCsxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIgKCArMy4xNC02SiApIiksIDMuMTQtNmopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgiICggKzMuMTQtSiApIiksIDMuMTQtMWopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgiICggKzMuMTQraiApIiksIDMuMTQrMWopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgiSiIpLCAxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIoIGogKSIpLCAxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIrSiIpLCAxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCIoIC1qKSIpLCAtMWopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgnMWUtNTAwJyksIDAuMCArIDAuMGopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleCgnLTFlLTUwMGonKSwgMC4wIC0gMC4waikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KCctMWUtNTAwKzFlLTUwMGonKSwgLTAuMCArIDAuMGopCisKKyAgICAgICAgY2xhc3MgY29tcGxleDIoY29tcGxleCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KGNvbXBsZXgyKDErMWopKSwgMSsxaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KHJlYWw9MTcsIGltYWc9MjMpLCAxNysyM2opCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleChyZWFsPTE3KzIzaiksIDE3KzIzaikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KHJlYWw9MTcrMjNqLCBpbWFnPTIzKSwgMTcrNDZqKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGNvbXBsZXgocmVhbD0xKzJqLCBpbWFnPTMrNGopLCAtMys1aikKKworICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHNpZ24gb2YgYSB6ZXJvIGluIHRoZSByZWFsIG9yIGltYWdpbmFyeSBwYXJ0CisgICAgICAgICMgaXMgcHJlc2VydmVkIHdoZW4gY29uc3RydWN0aW5nIGZyb20gdHdvIGZsb2F0cy4gIChUaGVzZSBjaGVja3MKKyAgICAgICAgIyBhcmUgaGFybWxlc3Mgb24gc3lzdGVtcyB3aXRob3V0IHN1cHBvcnQgZm9yIHNpZ25lZCB6ZXJvcy4pCisgICAgICAgIGRlZiBzcGxpdF96ZXJvcyh4KToKKyAgICAgICAgICAgICIiIkZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgZGlmZmVyZW50IHJlc3VsdHMgZm9yIDAuIGFuZCAtMC4iIiIKKyAgICAgICAgICAgIHJldHVybiBhdGFuMih4LCAtMS4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdF96ZXJvcyhjb21wbGV4KDEuLCAwLikuaW1hZyksIHNwbGl0X3plcm9zKDAuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdF96ZXJvcyhjb21wbGV4KDEuLCAtMC4pLmltYWcpLCBzcGxpdF96ZXJvcygtMC4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0X3plcm9zKGNvbXBsZXgoMC4sIDEuKS5yZWFsKSwgc3BsaXRfemVyb3MoMC4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0X3plcm9zKGNvbXBsZXgoLTAuLCAxLikucmVhbCksIHNwbGl0X3plcm9zKC0wLikpCisKKyAgICAgICAgYyA9IDMuMTQgKyAxagorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGxleChjKSBpcyBjKQorICAgICAgICBkZWwgYworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGxleCwgIjEiLCAiMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGxleCwgMSwgIjEiKQorCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXgodW5pY29kZSgiICAzLjE0K0ogICIpKSwgMy4xNCsxaikKKworICAgICAgICAjIFNGIGJ1ZyA1NDM4NDA6ICBjb21wbGV4KHN0cmluZykgYWNjZXB0cyBzdHJpbmdzIHdpdGggXDAKKyAgICAgICAgIyBGaXhlZCBpbiAyLjMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICcxKzFqXDBqJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludCwgNSszaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsb25nLCA1KzNqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZsb2F0LCA1KzNqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiXDAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiM1wwOSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGxleCwgIjEiLCAiMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGxleCwgIjEiLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCAxLCAiMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxKyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxKzFqKzFqIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIi0tIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIigxKzJqIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIjErMmopIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIjErKDJqKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIoMSsyaikxMjMiKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgdW5pY29kZSgieCIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiMWorMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxZTFlaiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxZSsrMWVqIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tcGxleCwgIikxKzJqKCIpCisgICAgICAgICMgdGhlIGZvbGxvd2luZyB0aHJlZSBhcmUgYWNjZXB0ZWQgYnkgUHl0aG9uIDIuNgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiMS4uMWoiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb21wbGV4LCAiMS4xMS4xaiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvbXBsZXgsICIxZTEuMWoiKQorCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICAjIGNoZWNrIHRoYXQgY29tcGxleCBhY2NlcHRzIGxvbmcgdW5pY29kZSBzdHJpbmdzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoY29tcGxleCh1bmljb2RlKCIxIio1MDApKSksIGNvbXBsZXgpCisKKyAgICAgICAgY2xhc3MgRXZpbEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIGV2aWxjb21wbGV4OgorICAgICAgICAgICAgZGVmIF9fY29tcGxleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV2aWxFeGMKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFdmlsRXhjLCBjb21wbGV4LCBldmlsY29tcGxleCgpKQorCisgICAgICAgIGNsYXNzIGZsb2F0MjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChjb21wbGV4KGZsb2F0Mig0Mi4pKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleChyZWFsPWZsb2F0MigxNy4pLCBpbWFnPWZsb2F0MigyMy4pKSwgMTcrMjNqKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXBsZXgsIGZsb2F0MihOb25lKSkKKworICAgICAgICBjbGFzcyBjb21wbGV4MChjb21wbGV4KToKKyAgICAgICAgICAgICIiIlRlc3QgdXNhZ2Ugb2YgX19jb21wbGV4X18oKSB3aGVuIGluaGVyaXRpbmcgZnJvbSAnY29tcGxleCciIiIKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDJqCisKKyAgICAgICAgY2xhc3MgY29tcGxleDEoY29tcGxleCk6CisgICAgICAgICAgICAiIiJUZXN0IHVzYWdlIG9mIF9fY29tcGxleF9fKCkgd2l0aCBhIF9fbmV3X18oKSBtZXRob2QiIiIKKyAgICAgICAgICAgIGRlZiBfX25ld19fKHNlbGYsIHZhbHVlPTBqKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tcGxleC5fX25ld19fKHNlbGYsIDIqdmFsdWUpCisgICAgICAgICAgICBkZWYgX19jb21wbGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBjb21wbGV4Mihjb21wbGV4KToKKyAgICAgICAgICAgICIiIk1ha2Ugc3VyZSB0aGF0IF9fY29tcGxleF9fKCkgY2FsbHMgZmFpbCBpZiBhbnl0aGluZyBvdGhlciB0aGFuIGEKKyAgICAgICAgICAgIGNvbXBsZXggaXMgcmV0dXJuZWQiIiIKKyAgICAgICAgICAgIGRlZiBfX2NvbXBsZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleChjb21wbGV4MCgxaikpLCA0MmopCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoY29tcGxleChjb21wbGV4MSgxaikpLCAyaikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wbGV4LCBjb21wbGV4MigxaikpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgeGNvbXBsZXgoY29tcGxleCk6CisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgoY29tcGxleChzZWxmKSArIG90aGVyKQorICAgICAgICAgICAgX19yYWRkX18gPSBfX2FkZF9fCisKKyAgICAgICAgICAgIGRlZiBfX3N1Yl9fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChjb21wbGV4KHNlbGYpICsgb3RoZXIpCisgICAgICAgICAgICBfX3JzdWJfXyA9IF9fc3ViX18KKworICAgICAgICAgICAgZGVmIF9fbXVsX18oc2VsZixvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHhjb21wbGV4KGNvbXBsZXgoc2VsZikgKiBvdGhlcikKKyAgICAgICAgICAgIF9fcm11bF9fID0gX19tdWxfXworCisgICAgICAgICAgICBkZWYgX19kaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgoY29tcGxleChzZWxmKSAvIG90aGVyKQorCisgICAgICAgICAgICBkZWYgX19yZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHhjb21wbGV4KG90aGVyIC8gY29tcGxleChzZWxmKSkKKworICAgICAgICAgICAgX190cnVlZGl2X18gPSBfX2Rpdl9fCisgICAgICAgICAgICBfX3J0cnVlZGl2X18gPSBfX3JkaXZfXworCisgICAgICAgICAgICBkZWYgX19mbG9vcmRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChjb21wbGV4KHNlbGYpIC8vIG90aGVyKQorCisgICAgICAgICAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgob3RoZXIgLy8gY29tcGxleChzZWxmKSkKKworICAgICAgICAgICAgZGVmIF9fcG93X18oc2VsZixvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHhjb21wbGV4KGNvbXBsZXgoc2VsZikgKiogb3RoZXIpCisKKyAgICAgICAgICAgIGRlZiBfX3Jwb3dfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgob3RoZXIgKiogY29tcGxleChzZWxmKSApCisKKyAgICAgICAgICAgIGRlZiBfX21vZF9fKHNlbGYsb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiB4Y29tcGxleChjb21wbGV4KHNlbGYpICUgb3RoZXIpCisKKyAgICAgICAgICAgIGRlZiBfX3Jtb2RfXyhzZWxmLG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4geGNvbXBsZXgob3RoZXIgJSBjb21wbGV4KHNlbGYpKQorCisgICAgICAgIGluZml4X2Jpbm9wcyA9ICgnKycsICctJywgJyonLCAnKionLCAnJScsICcvLycsICcvJykKKyAgICAgICAgeGNvbXBsZXhfdmFsdWVzID0gKHhjb21wbGV4KDEpLCB4Y29tcGxleCgxMjMuMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB4Y29tcGxleCgtMTArMmopLCB4Y29tcGxleCgzKzE4N2opLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeGNvbXBsZXgoMy03OGopKQorICAgICAgICB0ZXN0X3ZhbHVlcyA9ICgxLCAxMjMuMCwgMTAtMTlqLCB4Y29tcGxleCgxKzJqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgeGNvbXBsZXgoMSs4N2opLCB4Y29tcGxleCgxMCs5MGopKQorCisgICAgICAgIGZvciBvcCBpbiBpbmZpeF9iaW5vcHM6CisgICAgICAgICAgICBmb3IgeCBpbiB4Y29tcGxleF92YWx1ZXM6CisgICAgICAgICAgICAgICAgZm9yIHkgaW4gdGVzdF92YWx1ZXM6CisgICAgICAgICAgICAgICAgICAgIGEgPSAneCAlcyB5JyAlIG9wCisgICAgICAgICAgICAgICAgICAgIGIgPSAneSAlcyB4JyAlIG9wCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGV2YWwoYSkpIGlzIHR5cGUoZXZhbChiKSkgaXMgeGNvbXBsZXgpCisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoLTMwLCAzMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goeCksIGhhc2goY29tcGxleCh4LCAwKSkpCisgICAgICAgICAgICB4IC89IDMuMCAgICAjIG5vdyBjaGVjayBhZ2FpbnN0IGZsb2F0aW5nIHBvaW50CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goeCksIGhhc2goY29tcGxleCh4LCAwLikpKQorCisgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgorICAgICAgICBudW1zID0gW2NvbXBsZXgoeC8zLiwgeS83LikgZm9yIHggaW4geHJhbmdlKC05LDkpIGZvciB5IGluIHhyYW5nZSgtOSw5KV0KKyAgICAgICAgZm9yIG51bSBpbiBudW1zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgobnVtLnJlYWwqKjIgKyBudW0uaW1hZyoqMikgICoqIDAuNSwgYWJzKG51bSkpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoMSs2aiksICcoMSs2aiknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoMS02aiksICcoMS02aiknKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVwcigtKDErMGopKSwgJygtMSstMGopJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEtNmosY29tcGxleChyZXByKDEtNmopKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxKzZqLGNvbXBsZXgocmVwcigxKzZqKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTZqLGNvbXBsZXgocmVwcigtNmopKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg2aixjb21wbGV4KHJlcHIoNmopKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29tcGxleCgxLiwgSU5GKSksICIoMStpbmZqKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb21wbGV4KDEuLCAtSU5GKSksICIoMS1pbmZqKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb21wbGV4KElORiwgMSkpLCAiKGluZisxaikiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29tcGxleCgtSU5GLCBJTkYpKSwgIigtaW5mK2luZmopIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbXBsZXgoTkFOLCAxKSksICIobmFuKzFqKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb21wbGV4KDEsIE5BTikpLCAiKDErbmFuaikiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29tcGxleChOQU4sIE5BTikpLCAiKG5hbituYW5qKSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbXBsZXgoMCwgSU5GKSksICJpbmZqIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvbXBsZXgoMCwgLUlORikpLCAiLWluZmoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29tcGxleCgwLCBOQU4pKSwgIm5hbmoiKQorCisgICAgZGVmIHRlc3RfbmVnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMSs2aiksIC0xLTZqKQorCisgICAgZGVmIHRlc3RfZmlsZShzZWxmKToKKyAgICAgICAgYSA9IDMuMzMrNC40M2oKKyAgICAgICAgYiA9IDUuMSsyLjNqCisKKyAgICAgICAgZm8gPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICAgICAgcHJpbnQgPj5mbywgYSwgYgorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnJlYWQoKSwgIiVzICVzXG4iICUgKGEsIGIpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgKGZvIGlzIG5vdCBOb25lKSBhbmQgKG5vdCBmby5jbG9zZWQpOgorICAgICAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2dldG5ld2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDErMmopLl9fZ2V0bmV3YXJnc19fKCksICgxLjAsIDIuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEtMmopLl9fZ2V0bmV3YXJnc19fKCksICgxLjAsIC0yLjApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgyaikuX19nZXRuZXdhcmdzX18oKSwgKDAuMCwgMi4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTBqKS5fX2dldG5ld2FyZ3NfXygpLCAoMC4wLCAtMC4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KDAsIElORikuX19nZXRuZXdhcmdzX18oKSwgKDAuMCwgSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KElORiwgMCkuX19nZXRuZXdhcmdzX18oKSwgKElORiwgMC4wKSkKKworICAgIGlmIGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKToKKyAgICAgICAgZGVmIHRlc3RfcGx1c19taW51c18waihzZWxmKToKKyAgICAgICAgICAgICMgdGVzdCB0aGF0IC0waiBhbmQgMGogbGl0ZXJhbHMgYXJlIG5vdCBpZGVudGlmaWVkCisgICAgICAgICAgICB6MSwgejIgPSAwaiwgLTBqCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0YW4yKHoxLmltYWcsIC0xLiksIGF0YW4yKDAuLCAtMS4pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdGFuMih6Mi5pbWFnLCAtMS4pLCBhdGFuMigtMC4sIC0xLikpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgcmVxdWlyZXMgSUVFRSA3NTQgZG91YmxlcyIpCisgICAgZGVmIHRlc3Rfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleCgiMWU1MDAiKSwgY29tcGxleChJTkYsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleCgiLTFlNTAwaiIpLCBjb21wbGV4KDAuMCwgLUlORikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleCgiLTFlNTAwKzEuOGUzMDhqIiksIGNvbXBsZXgoLUlORiwgSU5GKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKyAgICBkZWYgdGVzdF9yZXByX3JvdW5kdHJpcChzZWxmKToKKyAgICAgICAgdmFscyA9IFswLjAsIDFlLTUwMCwgMWUtMzE1LCAxZS0yMDAsIDAuMDEyMywgMy4xNDE1LCAxZTUwLCBJTkYsIE5BTl0KKyAgICAgICAgdmFscyArPSBbLXYgZm9yIHYgaW4gdmFsc10KKworICAgICAgICAjIGNvbXBsZXgocmVwcih6KSkgc2hvdWxkIHJlY292ZXIgeiBleGFjdGx5LCBldmVuIGZvciBjb21wbGV4CisgICAgICAgICMgbnVtYmVycyBpbnZvbHZpbmcgYW4gaW5maW5pdHksIG5hbiwgb3IgbmVnYXRpdmUgemVybworICAgICAgICBmb3IgeCBpbiB2YWxzOgorICAgICAgICAgICAgZm9yIHkgaW4gdmFsczoKKyAgICAgICAgICAgICAgICB6ID0gY29tcGxleCh4LCB5KQorICAgICAgICAgICAgICAgIHJvdW5kdHJpcCA9IGNvbXBsZXgocmVwcih6KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZsb2F0c0FyZUlkZW50aWNhbCh6LnJlYWwsIHJvdW5kdHJpcC5yZWFsKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmxvYXRzQXJlSWRlbnRpY2FsKHouaW1hZywgcm91bmR0cmlwLmltYWcpCisKKyAgICAgICAgIyBpZiB3ZSBwcmVkZWZpbmUgc29tZSBjb25zdGFudHMsIHRoZW4gZXZhbChyZXByKHopKSBzaG91bGQKKyAgICAgICAgIyBhbHNvIHdvcmssIGV4Y2VwdCB0aGF0IGl0IG1pZ2h0IGNoYW5nZSB0aGUgc2lnbiBvZiB6ZXJvcworICAgICAgICBpbmYsIG5hbiA9IGZsb2F0KCdpbmYnKSwgZmxvYXQoJ25hbicpCisgICAgICAgIGluZmosIG5hbmogPSBjb21wbGV4KDAuMCwgaW5mKSwgY29tcGxleCgwLjAsIG5hbikKKyAgICAgICAgZm9yIHggaW4gdmFsczoKKyAgICAgICAgICAgIGZvciB5IGluIHZhbHM6CisgICAgICAgICAgICAgICAgeiA9IGNvbXBsZXgoeCwgeSkKKyAgICAgICAgICAgICAgICByb3VuZHRyaXAgPSBldmFsKHJlcHIoeikpCisgICAgICAgICAgICAgICAgIyBhZGRpbmcgMC4wIGhhcyBubyBlZmZlY3QgYmVzaWRlIGNoYW5naW5nIC0wLjAgdG8gMC4wCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGbG9hdHNBcmVJZGVudGljYWwoMC4wICsgei5yZWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMCArIHJvdW5kdHJpcC5yZWFsKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmxvYXRzQXJlSWRlbnRpY2FsKDAuMCArIHouaW1hZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAgKyByb3VuZHRyaXAuaW1hZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgIyBlbXB0eSBmb3JtYXQgc3RyaW5nIGlzIHNhbWUgYXMgc3RyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMSszaiwgJycpLCBzdHIoMSszaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNSszLjVqLCAnJyksIHN0cigxLjUrMy41aikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDNqLCAnJyksIHN0cigzaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDMuMmosICcnKSwgc3RyKDMuMmopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgzKzBqLCAnJyksIHN0cigzKzBqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMy4yKzBqLCAnJyksIHN0cigzLjIrMGopKQorCisgICAgICAgICMgZW1wdHkgcHJlc2VudGF0aW9uIHR5cGUgc2hvdWxkIHN0aWxsIGJlIGFuYWxvZ291cyB0byBzdHIsCisgICAgICAgICMgZXZlbiB3aGVuIGZvcm1hdCBzdHJpbmcgaXMgbm9uZW1wdHkgKGlzc3VlICM1OTIwKS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMy4yKzBqLCAnLScpLCBzdHIoMy4yKzBqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMy4yKzBqLCAnPCcpLCBzdHIoMy4yKzBqKSkKKyAgICAgICAgeiA9IDQvNy4gLSAxMDBqLzcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICcnKSwgc3RyKHopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh6LCAnLScpLCBzdHIoeikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICc8JyksIHN0cih6KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJzEwJyksIHN0cih6KSkKKyAgICAgICAgeiA9IGNvbXBsZXgoMC4wLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICcnKSwgc3RyKHopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh6LCAnLScpLCBzdHIoeikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICc8JyksIHN0cih6KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJzInKSwgc3RyKHopKQorICAgICAgICB6ID0gY29tcGxleCgtMC4wLCAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICcnKSwgc3RyKHopKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh6LCAnLScpLCBzdHIoeikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHosICc8JyksIHN0cih6KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeiwgJzMnKSwgc3RyKHopKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDErM2osICdnJyksICcxKzNqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoM2osICdnJyksICcwKzNqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzMuNWosICdnJyksICcxLjUrMy41aicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzMuNWosICcrZycpLCAnKzEuNSszLjVqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41LTMuNWosICcrZycpLCAnKzEuNS0zLjVqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41LTMuNWosICctZycpLCAnMS41LTMuNWonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrMy41aiwgJyBnJyksICcgMS41KzMuNWonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUtMy41aiwgJyBnJyksICcgMS41LTMuNWonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS41KzMuNWosICcgZycpLCAnLTEuNSszLjVqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuNS0zLjVqLCAnIGcnKSwgJy0xLjUtMy41aicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuNS0zLjVlLTIwaiwgJ2cnKSwgJy0xLjUtMy41ZS0yMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS41LTMuNWosICdmJyksICctMS41MDAwMDAtMy41MDAwMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuNS0zLjVqLCAnRicpLCAnLTEuNTAwMDAwLTMuNTAwMDAwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjUtMy41aiwgJ2UnKSwgJy0xLjUwMDAwMGUrMDAtMy41MDAwMDBlKzAwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjUtMy41aiwgJy4yZScpLCAnLTEuNTBlKzAwLTMuNTBlKzAwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjUtMy41aiwgJy4yRScpLCAnLTEuNTBFKzAwLTMuNTBFKzAwaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjVlMTAtMy41ZTVqLCAnLjJHJyksICctMS41RSsxMC0zLjVFKzA1aicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnPDIwZycpLCAgJzEuNSszaiAgICAgICAgICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnKjwyMGcnKSwgJzEuNSszaioqKioqKioqKioqKioqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnPjIwZycpLCAgJyAgICAgICAgICAgICAgMS41KzNqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnXjIwZycpLCAgJyAgICAgICAxLjUrM2ogICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnPDIwJyksICAgJygxLjUrM2opICAgICAgICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnPjIwJyksICAgJyAgICAgICAgICAgICgxLjUrM2opJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnXjIwJyksICAgJyAgICAgICgxLjUrM2opICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS4xMjMtMy4xMjNqLCAnXjIwLjInKSwgJyAgICAgKDEuMS0zLjFqKSAgICAgJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICcyMC4yZicpLCAnICAgICAgICAgIDEuNTArMy4wMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjUrM2osICc+MjAuMmYnKSwgJyAgICAgICAgICAxLjUwKzMuMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41KzNqLCAnPDIwLjJmJyksICcxLjUwKzMuMDBqICAgICAgICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNWUyMCszaiwgJzwyMC4yZicpLCAnMTUwMDAwMDAwMDAwMDAwMDAwMDAwLjAwKzMuMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41ZTIwKzNqLCAnPjQwLjJmJyksICcgICAgICAgICAgMTUwMDAwMDAwMDAwMDAwMDAwMDAwLjAwKzMuMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMS41ZTIwKzNqLCAnXjQwLC4yZicpLCAnICAxNTAsMDAwLDAwMCwwMDAsMDAwLDAwMCwwMDAuMDArMy4wMGogICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEuNWUyMSszaiwgJ140MCwuMmYnKSwgJyAxLDUwMCwwMDAsMDAwLDAwMCwwMDAsMDAwLDAwMC4wMCszLjAwaiAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjVlMjErMzAwMGosICcsLjJmJyksICcxLDUwMCwwMDAsMDAwLDAwMCwwMDAsMDAwLDAwMC4wMCszLDAwMC4wMGonKQorCisgICAgICAgICMgYWx0ZXJuYXRlIGlzIGludmFsaWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgKDEuNSswLjVqKS5fX2Zvcm1hdF9fLCAnI2YnKQorCisgICAgICAgICMgemVybyBwYWRkaW5nIGlzIGludmFsaWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgKDEuNSswLjVqKS5fX2Zvcm1hdF9fLCAnMDEwZicpCisKKyAgICAgICAgIyAnPScgYWxpZ25tZW50IGlzIGludmFsaWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgKDEuNSszaikuX19mb3JtYXRfXywgJz0yMCcpCisKKyAgICAgICAgIyBpbnRlZ2VyIHByZXNlbnRhdGlvbiB0eXBlcyBhcmUgYW4gZXJyb3IKKyAgICAgICAgZm9yIHQgaW4gJ2JjZG94WCc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAoMS41KzAuNWopLl9fZm9ybWF0X18sIHQpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgZXZlcnl0aGluZyB3b3JrcyBpbiAnJy5mb3JtYXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcqezA6LjNmfSonLmZvcm1hdCgzLjE0MTU5KzIuNzE4MjhqKSwgJyozLjE0MisyLjcxOGoqJykKKworICAgICAgICAjIGlzc3VlIDMzODI6ICdmJyBhbmQgJ0YnIHdpdGggaW5mJ3MgYW5kIG5hbidzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOmZ9Jy5mb3JtYXQoSU5GKzBqKSwgJ2luZiswLjAwMDAwMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpGfScuZm9ybWF0KElORiswaiksICdJTkYrMC4wMDAwMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdCgtSU5GKzBqKSwgJy1pbmYrMC4wMDAwMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdCgtSU5GKzBqKSwgJy1JTkYrMC4wMDAwMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdChjb21wbGV4KElORiwgSU5GKSksICdpbmYraW5maicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoY29tcGxleChJTkYsIElORikpLCAnSU5GK0lORmonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KGNvbXBsZXgoSU5GLCAtSU5GKSksICdpbmYtaW5maicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoY29tcGxleChJTkYsIC1JTkYpKSwgJ0lORi1JTkZqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdChjb21wbGV4KC1JTkYsIElORikpLCAnLWluZitpbmZqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdChjb21wbGV4KC1JTkYsIElORikpLCAnLUlORitJTkZqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdChjb21wbGV4KC1JTkYsIC1JTkYpKSwgJy1pbmYtaW5maicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoY29tcGxleCgtSU5GLCAtSU5GKSksICctSU5GLUlORmonKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOmZ9Jy5mb3JtYXQoY29tcGxleChOQU4sIDApKSwgJ25hbiswLjAwMDAwMGonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpGfScuZm9ybWF0KGNvbXBsZXgoTkFOLCAwKSksICdOQU4rMC4wMDAwMDBqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdChjb21wbGV4KE5BTiwgTkFOKSksICduYW4rbmFuaicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoY29tcGxleChOQU4sIE5BTikpLCAnTkFOK05BTmonKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJjb21wbGV4IGRpdm1vZC4uLCAvLyBhbmQgJSBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVwcmVjYXRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvbXBsZXhUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmJmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmJmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM2Y2JlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weQpAQCAtMCwwICsxLDExOCBAQAorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdGV4dHdyYXAKKworY2xhc3MgQ29tcGxleEFyZ3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2soc2VsZiwgZnVuYywgZXhwZWN0ZWQsICphcmdzKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKCphcmdzKSwgZXhwZWN0ZWQpCisKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGVzdGVkIGJlbG93IGFzIGxhbWJkYXMgdG9vLiAgSWYgeW91IGFkZCBhCisgICAgIyBmdW5jdGlvbiB0ZXN0LCBhbHNvIGFkZCBhIHNpbWlsYXIgbGFtYmRhIHRlc3QuCisKKyAgICAjIEZ1bmN0aW9ucyBhcmUgd3JhcHBlZCBpbiAiZXhlYyIgc3RhdGVtZW50cyBpbiBvcmRlciB0bworICAgICMgc2lsZW5jZSBQeTNrIHdhcm5pbmdzLgorCisgICAgZGVmIHRlc3RfZnVuY19wYXJlbnNfbm9fdW5wYWNraW5nKHNlbGYpOgorICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgZGVmIGYoKCgoKHgpKSkpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAxLCAxKQorICAgICAgICAjIElubmVyIHBhcmVucyBhcmUgZWxpZGVkLCBzYW1lIGFzOiBmKHgsKQorICAgICAgICBkZWYgZigoKHgpKSwpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDIsIDIpCisgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2Z1bmNfMShzZWxmKToKKyAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgIGRlZiBmKCgoKCh4KSwpKSkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDMsICgzLCkpCisgICAgICAgIGRlZiBmKCgoKCh4KSksKSkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDQsICg0LCkpCisgICAgICAgIGRlZiBmKCgoKCh4KSkpLCkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDUsICg1LCkpCisgICAgICAgIGRlZiBmKCgoeCksKSk6IHJldHVybiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNiwgKDYsKSkKKyAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfZnVuY18yKHNlbGYpOgorICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgZGVmIGYoKCgoKHgpKSwpLCkpOiByZXR1cm4geAorICAgICAgICBzZWxmLmNoZWNrKGYsIDIsICgoMiwpLCkpCisgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2Z1bmNfMyhzZWxmKToKKyAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgIGRlZiBmKCgoKCgoeCkpLCksKSwpKTogcmV0dXJuIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAzLCAoKCgzLCksKSwpKQorICAgICAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9mdW5jX2NvbXBsZXgoc2VsZik6CisgICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICBkZWYgZigoKCgoKHgpKSwpLCksKSwgYSwgYiwgYyk6IHJldHVybiB4LCBhLCBiLCBjCisgICAgICAgIHNlbGYuY2hlY2soZiwgKDMsIDksIDgsIDcpLCAoKCgzLCksKSwpLCA5LCA4LCA3KQorCisgICAgICAgIGRlZiBmKCgoKCgoKHgpKSwpKSwpLCksIGEsIGIsIGMpOiByZXR1cm4geCwgYSwgYiwgYworICAgICAgICBzZWxmLmNoZWNrKGYsICgzLCA5LCA4LCA3KSwgKCgoMywpLCksKSwgOSwgOCwgNykKKworICAgICAgICBkZWYgZihhLCBiLCBjLCAoKCgoKCh4KSksKSksKSwpKTogcmV0dXJuIGEsIGIsIGMsIHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAoOSwgOCwgNywgMyksIDksIDgsIDcsICgoKDMsKSwpLCkpCisgICAgICAgICIiIikKKworICAgICMgRHVwbGljYXRlIHRoZSB0ZXN0cyBhYm92ZSwgYnV0IGZvciBsYW1iZGEuICBJZiB5b3UgYWRkIGEgbGFtYmRhIHRlc3QsCisgICAgIyBhbHNvIGFkZCBhIHNpbWlsYXIgZnVuY3Rpb24gdGVzdCBhYm92ZS4KKworICAgIGRlZiB0ZXN0X2xhbWJkYV9wYXJlbnNfbm9fdW5wYWNraW5nKHNlbGYpOgorICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpKSkpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDEsIDEpCisgICAgICAgICMgSW5uZXIgcGFyZW5zIGFyZSBlbGlkZWQsIHNhbWUgYXM6IGYoeCwpCisgICAgICAgIGYgPSBsYW1iZGEgKCh4KSksOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgMiwgMikKKyAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfbGFtYmRhXzEoc2VsZik6CisgICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCksKSkpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDMsICgzLCkpCisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCh4KSksKSkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNCwgKDQsKSkKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpKSksKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCA1LCAoNSwpKQorICAgICAgICBmID0gbGFtYmRhICgoKHgpLCkpOiB4CisgICAgICAgIHNlbGYuY2hlY2soZiwgNiwgKDYsKSkKKyAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfbGFtYmRhXzIoc2VsZik6CisgICAgICAgIGV4ZWMgdGV4dHdyYXAuZGVkZW50KCIiIgorICAgICAgICBmID0gbGFtYmRhICgoKCgoeCkpLCksKSk6IHgKKyAgICAgICAgc2VsZi5jaGVjayhmLCAyLCAoKDIsKSwpKQorICAgICAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9sYW1iZGFfMyhzZWxmKToKKyAgICAgICAgZXhlYyB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCgoeCkpLCksKSwpKTogeAorICAgICAgICBzZWxmLmNoZWNrKGYsIDMsICgoKDMsKSwpLCkpCisgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2xhbWJkYV9jb21wbGV4KHNlbGYpOgorICAgICAgICBleGVjIHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgZiA9IGxhbWJkYSAoKCgoKHgpKSwpLCksKSwgYSwgYiwgYzogKHgsIGEsIGIsIGMpCisgICAgICAgIHNlbGYuY2hlY2soZiwgKDMsIDksIDgsIDcpLCAoKCgzLCksKSwpLCA5LCA4LCA3KQorCisgICAgICAgIGYgPSBsYW1iZGEgKCgoKCgoeCkpLCkpLCksKSwgYSwgYiwgYzogKHgsIGEsIGIsIGMpCisgICAgICAgIHNlbGYuY2hlY2soZiwgKDMsIDksIDgsIDcpLCAoKCgzLCksKSwpLCA5LCA4LCA3KQorCisgICAgICAgIGYgPSBsYW1iZGEgYSwgYiwgYywgKCgoKCgoeCkpLCkpLCksKTogKGEsIGIsIGMsIHgpCisgICAgICAgIHNlbGYuY2hlY2soZiwgKDksIDgsIDcsIDMpLCA5LCA4LCA3LCAoKCgzLCksKSwpKQorICAgICAgICAiIiIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgKCJwYXJlbnRoZXNpemVkIGFyZ3VtZW50IG5hbWVzIGFyZSBpbnZhbGlkIiwgU3ludGF4V2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvbXBsZXhBcmdzVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmU1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbXBsZXhfYXJncy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZmU1MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb21wbGV4X2FyZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGFpbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzODA4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5CkBAIC0wLDAgKzEsMTExIEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBoYXZlX3VuaWNvZGUsIHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgYmFzZV9zZXQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsKToKKyAgICAgICAgc2VsZi5lbCA9IGVsCisKK2NsYXNzIHNldChiYXNlX3NldCk6CisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBlbCk6CisgICAgICAgIHJldHVybiBzZWxmLmVsID09IGVsCisKK2NsYXNzIHNlcShiYXNlX3NldCk6CisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG4pOgorICAgICAgICByZXR1cm4gW3NlbGYuZWxdW25dCisKKworY2xhc3MgVGVzdENvbnRhaW5zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jb21tb25fdGVzdHMoc2VsZik6CisgICAgICAgIGEgPSBiYXNlX3NldCgxKQorICAgICAgICBiID0gc2V0KDEpCisgICAgICAgIGMgPSBzZXEoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigxLCBiKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDAsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMSwgYykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigwLCBjKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogMSBpbiBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogMSBub3QgaW4gYSkKKworICAgICAgICAjIHRlc3QgY2hhciBpbiBzdHJpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYycsICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdkJywgJ2FiYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJycsICdhYmMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBOb25lIGluICdhYmMnKQorCisgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICBkZWYgdGVzdF9jaGFyX2luX3VuaWNvZGUoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdjJywgdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdkJywgdW5pY29kZSgnYWJjJykpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJycsIHVuaWNvZGUoJycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih1bmljb2RlKCcnKSwgJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHVuaWNvZGUoJycpLCB1bmljb2RlKCcnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJycsIHVuaWNvZGUoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih1bmljb2RlKCcnKSwgJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHVuaWNvZGUoJycpLCB1bmljb2RlKCdhYmMnKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IE5vbmUgaW4gdW5pY29kZSgnYWJjJykpCisKKyAgICAgICAgICAgICMgdGVzdCBVbmljb2RlIGNoYXIgaW4gVW5pY29kZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih1bmljb2RlKCdjJyksIHVuaWNvZGUoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbih1bmljb2RlKCdkJyksIHVuaWNvZGUoJ2FiYycpKQorCisgICAgICAgICAgICAjIHRlc3QgVW5pY29kZSBjaGFyIGluIHN0cmluZworICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih1bmljb2RlKCdjJyksICdhYmMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbih1bmljb2RlKCdkJyksICdhYmMnKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9zZXF1ZW5jZV90eXBlcyhzZWxmKToKKyAgICAgICAgIyBhIGNvbGxlY3Rpb24gb2YgdGVzdHMgb24gYnVpbHRpbiBzZXF1ZW5jZSB0eXBlcworICAgICAgICBhID0gcmFuZ2UoMTApCisgICAgICAgIGZvciBpIGluIGE6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGksIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMTYsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYSwgYSkKKworICAgICAgICBhID0gdHVwbGUoYSkKKyAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigxNiwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihhLCBhKQorCisgICAgICAgIGNsYXNzIERldmlhbnQxOgorICAgICAgICAgICAgIiIiQmVoYXZlcyBzdHJhbmdlbHkgd2hlbiBjb21wYXJlZAorCisgICAgICAgICAgICBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjb250YWlucyBjb2RlCisgICAgICAgICAgICB3b3JrcyB3aGVuIHRoZSBsaXN0IGlzIG1vZGlmaWVkIGR1cmluZyB0aGUgY2hlY2suCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGFMaXN0ID0gcmFuZ2UoMTUpCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgb3RoZXIgPT0gMTI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYUxpc3QucmVtb3ZlKDEyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFMaXN0LnJlbW92ZSgxMykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hTGlzdC5yZW1vdmUoMTQpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBzZWxmLmFzc2VydE5vdEluKERldmlhbnQxKCksIERldmlhbnQxLmFMaXN0KQorCisgICAgICAgIGNsYXNzIERldmlhbnQyOgorICAgICAgICAgICAgIiIiQmVoYXZlcyBzdHJhbmdlbHkgd2hlbiBjb21wYXJlZAorCisgICAgICAgICAgICBUaGlzIGNsYXNzIHJhaXNlcyBhbiBleGNlcHRpb24gZHVyaW5nIGNvbXBhcmlzb24uICBUaGF0IGluCisgICAgICAgICAgICB0dXJuIGNhdXNlcyB0aGUgY29tcGFyaXNvbiB0byBmYWlsIHdpdGggYSBUeXBlRXJyb3IuCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBvdGhlciA9PSA0OgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJnb3RjaGEiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihEZXZpYW50MigpLCBhKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdENvbnRhaW5zKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250YWlucy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250YWlucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2NjgyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250YWlucy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250YWlucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk2NjgyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvbnRhaW5zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjhjOTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQpAQCAtMCwwICsxLDMyNiBAQAorIiIiVW5pdCB0ZXN0cyBmb3IgY29udGV4dGxpYi5weSwgYW5kIG90aGVyIGNvbnRleHQgbWFuYWdlcnMuIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGNvbnRleHRsaWIgaW1wb3J0ICogICMgVGVzdHMgX19hbGxfXworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCisKK2NsYXNzIENvbnRleHRNYW5hZ2VyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfcGxhaW4oc2VsZik6CisgICAgICAgIHN0YXRlID0gW10KKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiB3b29ob28oKToKKyAgICAgICAgICAgIHN0YXRlLmFwcGVuZCgxKQorICAgICAgICAgICAgeWllbGQgNDIKKyAgICAgICAgICAgIHN0YXRlLmFwcGVuZCg5OTkpCisgICAgICAgIHdpdGggd29vaG9vKCkgYXMgeDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgNDIpCisgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzEsIDQyLCA5OTldKQorCisgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfZmluYWxseShzZWxmKToKKyAgICAgICAgc3RhdGUgPSBbXQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHdvb2hvbygpOgorICAgICAgICAgICAgc3RhdGUuYXBwZW5kKDEpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgNDIKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3RhdGUuYXBwZW5kKDk5OSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICB3aXRoIHdvb2hvbygpIGFzIHg6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzFdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgNDIpCisgICAgICAgICAgICAgICAgc3RhdGUuYXBwZW5kKHgpCisgICAgICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbMSwgNDIsIDk5OV0pCisKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9ub19yZXJhaXNlKHNlbGYpOgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIHdoZWUoKToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGN0eCA9IHdoZWUoKQorICAgICAgICBjdHguX19lbnRlcl9fKCkKKyAgICAgICAgIyBDYWxsaW5nIF9fZXhpdF9fIHNob3VsZCBub3QgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGN0eC5fX2V4aXRfXyhUeXBlRXJyb3IsIFR5cGVFcnJvcigiZm9vIiksIE5vbmUpKQorCisgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfdHJhcF95aWVsZF9hZnRlcl90aHJvdyhzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiB3aG9vKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICB5aWVsZAorICAgICAgICBjdHggPSB3aG9vKCkKKyAgICAgICAgY3R4Ll9fZW50ZXJfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgUnVudGltZUVycm9yLCBjdHguX19leGl0X18sIFR5cGVFcnJvciwgVHlwZUVycm9yKCJmb28iKSwgTm9uZQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9leGNlcHQoc2VsZik6CisgICAgICAgIHN0YXRlID0gW10KKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiB3b29ob28oKToKKyAgICAgICAgICAgIHN0YXRlLmFwcGVuZCgxKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkIDQyCisgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3IsIGU6CisgICAgICAgICAgICAgICAgc3RhdGUuYXBwZW5kKGUuYXJnc1swXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbMSwgNDIsIDk5OV0pCisgICAgICAgIHdpdGggd29vaG9vKCkgYXMgeDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgNDIpCisgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoeCkKKyAgICAgICAgICAgIHJhaXNlIFplcm9EaXZpc2lvbkVycm9yKDk5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzEsIDQyLCA5OTldKQorCisgICAgZGVmIF9jcmVhdGVfY29udGV4dG1hbmFnZXJfYXR0cmlicyhzZWxmKToKKyAgICAgICAgZGVmIGF0dHJpYnMoKiprdyk6CisgICAgICAgICAgICBkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgICAgICAgICAgICAgZm9yIGssdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKGZ1bmMsayx2KQorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jCisgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGUKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIEBhdHRyaWJzKGZvbz0nYmFyJykKKyAgICAgICAgZGVmIGJheihzcGFtKToKKyAgICAgICAgICAgICIiIldoZWUhIiIiCisgICAgICAgIHJldHVybiBiYXoKKworICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX2F0dHJpYnMoc2VsZik6CisgICAgICAgIGJheiA9IHNlbGYuX2NyZWF0ZV9jb250ZXh0bWFuYWdlcl9hdHRyaWJzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXouX19uYW1lX18sJ2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmF6LmZvbywgJ2JhcicpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9kb2NfYXR0cmliKHNlbGYpOgorICAgICAgICBiYXogPSBzZWxmLl9jcmVhdGVfY29udGV4dG1hbmFnZXJfYXR0cmlicygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmF6Ll9fZG9jX18sICJXaGVlISIpCisKK2NsYXNzIE5lc3RlZFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgWFhYIFRoaXMgbmVlZHMgbW9yZSB3b3JrCisKKyAgICBkZWYgdGVzdF9uZXN0ZWQoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgeWllbGQgMQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGIoKToKKyAgICAgICAgICAgIHlpZWxkIDIKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBjKCk6CisgICAgICAgICAgICB5aWVsZCAzCisgICAgICAgIHdpdGggbmVzdGVkKGEoKSwgYigpLCBjKCkpIGFzICh4LCB5LCB6KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeiwgMykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9jbGVhbnVwKHNlbGYpOgorICAgICAgICBzdGF0ZSA9IFtdCisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgc3RhdGUuYXBwZW5kKDEpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeWllbGQgMgorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoMykKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBiKCk6CisgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoNCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZCA1CisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN0YXRlLmFwcGVuZCg2KQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIHdpdGggbmVzdGVkKGEoKSwgYigpKSBhcyAoeCwgeSk6CisgICAgICAgICAgICAgICAgc3RhdGUuYXBwZW5kKHgpCisgICAgICAgICAgICAgICAgc3RhdGUuYXBwZW5kKHkpCisgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxLCA0LCAyLCA1LCA2LCAzXSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9yaWdodF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgeWllbGQgMQorICAgICAgICBjbGFzcyBiKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgd2l0aCBuZXN0ZWQoYSgpLCBiKCkpIGFzICh4LCB5KToKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeCwgeSksICgxLCAyKSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9iX3N3YWxsb3dzKHNlbGYpOgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGEoKToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYigpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBTd2FsbG93IHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggbmVzdGVkKGEoKSwgYigpKToKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3Qgc3dhbGxvdyBaZXJvRGl2aXNpb25FcnJvciIpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfYnJlYWsoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgc3RhdGUgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBzdGF0ZSArPSAxCisgICAgICAgICAgICB3aXRoIG5lc3RlZChhKCksIGEoKSk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHN0YXRlICs9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIDEpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfY29udGludWUoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgeWllbGQKKyAgICAgICAgc3RhdGUgPSAwCisgICAgICAgIHdoaWxlIHN0YXRlIDwgMzoKKyAgICAgICAgICAgIHN0YXRlICs9IDEKKyAgICAgICAgICAgIHdpdGggbmVzdGVkKGEoKSwgYSgpKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc3RhdGUgKz0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgMykKKworICAgIGRlZiB0ZXN0X25lc3RlZF9yZXR1cm4oc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgYSgpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICB3aXRoIG5lc3RlZChhKCksIGEoKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvbygpLCAxKQorCitjbGFzcyBDbG9zaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBYWFggVGhpcyBuZWVkcyBtb3JlIHdvcmsKKworICAgIGRlZiB0ZXN0X2Nsb3Npbmcoc2VsZik6CisgICAgICAgIHN0YXRlID0gW10KKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoMSkKKyAgICAgICAgeCA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbXSkKKyAgICAgICAgd2l0aCBjbG9zaW5nKHgpIGFzIHk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxXSkKKworICAgIGRlZiB0ZXN0X2Nsb3NpbmdfZXJyb3Ioc2VsZik6CisgICAgICAgIHN0YXRlID0gW10KKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICBzdGF0ZS5hcHBlbmQoMSkKKyAgICAgICAgeCA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbXSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvcik6CisgICAgICAgICAgICB3aXRoIGNsb3NpbmcoeCkgYXMgeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdGUsIFsxXSkKKworY2xhc3MgRmlsZUNvbnRleHRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdFdpdGhPcGVuKHNlbGYpOgorICAgICAgICB0Zm4gPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gTm9uZQorICAgICAgICAgICAgd2l0aCBvcGVuKHRmbiwgInciKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisgICAgICAgICAgICAgICAgZi53cml0ZSgiQm9vaFxuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKyAgICAgICAgICAgIGYgPSBOb25lCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4odGZuLCAiciIpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICJCb29oXG4iKQorICAgICAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGZuKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgTG9ja0NvbnRleHRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYm9pbGVyUGxhdGUoc2VsZiwgbG9jaywgbG9ja2VkKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2NrZWQoKSkKKyAgICAgICAgd2l0aCBsb2NrOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvY2tlZCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvY2tlZCgpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIHdpdGggbG9jazoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG9ja2VkKCkpCisgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCisKKyAgICBkZWYgdGVzdFdpdGhMb2NrKHNlbGYpOgorICAgICAgICBsb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBzZWxmLmJvaWxlclBsYXRlKGxvY2ssIGxvY2subG9ja2VkKQorCisgICAgZGVmIHRlc3RXaXRoUkxvY2soc2VsZik6CisgICAgICAgIGxvY2sgPSB0aHJlYWRpbmcuUkxvY2soKQorICAgICAgICBzZWxmLmJvaWxlclBsYXRlKGxvY2ssIGxvY2suX2lzX293bmVkKQorCisgICAgZGVmIHRlc3RXaXRoQ29uZGl0aW9uKHNlbGYpOgorICAgICAgICBsb2NrID0gdGhyZWFkaW5nLkNvbmRpdGlvbigpCisgICAgICAgIGRlZiBsb2NrZWQoKToKKyAgICAgICAgICAgIHJldHVybiBsb2NrLl9pc19vd25lZCgpCisgICAgICAgIHNlbGYuYm9pbGVyUGxhdGUobG9jaywgbG9ja2VkKQorCisgICAgZGVmIHRlc3RXaXRoU2VtYXBob3JlKHNlbGYpOgorICAgICAgICBsb2NrID0gdGhyZWFkaW5nLlNlbWFwaG9yZSgpCisgICAgICAgIGRlZiBsb2NrZWQoKToKKyAgICAgICAgICAgIGlmIGxvY2suYWNxdWlyZShGYWxzZSk6CisgICAgICAgICAgICAgICAgbG9jay5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgc2VsZi5ib2lsZXJQbGF0ZShsb2NrLCBsb2NrZWQpCisKKyAgICBkZWYgdGVzdFdpdGhCb3VuZGVkU2VtYXBob3JlKHNlbGYpOgorICAgICAgICBsb2NrID0gdGhyZWFkaW5nLkJvdW5kZWRTZW1hcGhvcmUoKQorICAgICAgICBkZWYgbG9ja2VkKCk6CisgICAgICAgICAgICBpZiBsb2NrLmFjcXVpcmUoRmFsc2UpOgorICAgICAgICAgICAgICAgIGxvY2sucmVsZWFzZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHNlbGYuYm9pbGVyUGxhdGUobG9jaywgbG9ja2VkKQorCisjIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIHRlc3QgYWN0dWFsbHkgcnVuIHVuZGVyIHJlZ3J0ZXN0LnB5IQorZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgiV2l0aC1zdGF0ZW1lbnRzIG5vdyBkaXJlY3RseSBzdXBwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm11bHRpcGxlIGNvbnRleHQgbWFuYWdlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGV4dGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBiNDEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGV4dGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGV4dGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjBiNDEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29udGV4dGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNjEzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWUucHkKQEAgLTAsMCArMSw5OSBAQAorIyBTaW1wbGUgdGVzdCBzdWl0ZSBmb3IgQ29va2llLnB5CisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgcnVuX2RvY3Rlc3QsIGNoZWNrX3dhcm5pbmdzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBDb29raWUKKworCitjbGFzcyBDb29raWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBDdXJyZW50bHkgdGhpcyBvbmx5IHRlc3RzIFNpbXBsZUNvb2tpZQorICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBjYXNlcyA9IFsKKyAgICAgICAgICAgIHsgJ2RhdGEnOiAnY2hpcHM9YWhveTsgdmllbm5hPWZpbmdlcicsCisgICAgICAgICAgICAgICdkaWN0JzogeydjaGlwcyc6J2Fob3knLCAndmllbm5hJzonZmluZ2VyJ30sCisgICAgICAgICAgICAgICdyZXByJzogIjxTaW1wbGVDb29raWU6IGNoaXBzPSdhaG95JyB2aWVubmE9J2Zpbmdlcic+IiwKKyAgICAgICAgICAgICAgJ291dHB1dCc6ICdTZXQtQ29va2llOiBjaGlwcz1haG95XG5TZXQtQ29va2llOiB2aWVubmE9ZmluZ2VyJywKKyAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgIHsgJ2RhdGEnOiAna2VlYmxlcj0iRT1tYzI7IEw9XFwiTG92ZXNcXCI7IGZ1ZGdlPVxcMDEyOyInLAorICAgICAgICAgICAgICAnZGljdCc6IHsna2VlYmxlcicgOiAnRT1tYzI7IEw9IkxvdmVzIjsgZnVkZ2U9XDAxMjsnfSwKKyAgICAgICAgICAgICAgJ3JlcHInOiAnJyc8U2ltcGxlQ29va2llOiBrZWVibGVyPSdFPW1jMjsgTD0iTG92ZXMiOyBmdWRnZT1cXG47Jz4nJycsCisgICAgICAgICAgICAgICdvdXRwdXQnOiAnU2V0LUNvb2tpZToga2VlYmxlcj0iRT1tYzI7IEw9XFwiTG92ZXNcXCI7IGZ1ZGdlPVxcMDEyOyInLAorICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgIyBDaGVjayBpbGxlZ2FsIGNvb2tpZXMgdGhhdCBoYXZlIGFuICc9JyBjaGFyIGluIGFuIHVucXVvdGVkIHZhbHVlCisgICAgICAgICAgICB7ICdkYXRhJzogJ2tlZWJsZXI9RT1tYzInLAorICAgICAgICAgICAgICAnZGljdCc6IHsna2VlYmxlcicgOiAnRT1tYzInfSwKKyAgICAgICAgICAgICAgJ3JlcHInOiAiPFNpbXBsZUNvb2tpZToga2VlYmxlcj0nRT1tYzInPiIsCisgICAgICAgICAgICAgICdvdXRwdXQnOiAnU2V0LUNvb2tpZToga2VlYmxlcj1FPW1jMicsCisgICAgICAgICAgICB9CisgICAgICAgIF0KKworICAgICAgICBmb3IgY2FzZSBpbiBjYXNlczoKKyAgICAgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgICAgIEMubG9hZChjYXNlWydkYXRhJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoQyksIGNhc2VbJ3JlcHInXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5vdXRwdXQoc2VwPSdcbicpLCBjYXNlWydvdXRwdXQnXSkKKyAgICAgICAgICAgIGZvciBrLCB2IGluIHNvcnRlZChjYXNlWydkaWN0J10uaXRlcml0ZW1zKCkpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1trXS52YWx1ZSwgdikKKworICAgIGRlZiB0ZXN0X2xvYWQoc2VsZik6CisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgQy5sb2FkKCdDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7IFZlcnNpb249MTsgUGF0aD0vYWNtZScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddLnZhbHVlLCAnV0lMRV9FX0NPWU9URScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsndmVyc2lvbiddLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsncGF0aCddLCAnL2FjbWUnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5vdXRwdXQoWydwYXRoJ10pLAorICAgICAgICAgICAgJ1NldC1Db29raWU6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgUGF0aD0vYWNtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5qc19vdXRwdXQoKSwgciIiIgorICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgIDwhLS0gYmVnaW4gaGlkaW5nCisgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9ICJDdXN0b21lcj1cIldJTEVfRV9DT1lPVEVcIjsgUGF0aD0vYWNtZTsgVmVyc2lvbj0xIjsKKyAgICAgICAgLy8gZW5kIGhpZGluZyAtLT4KKyAgICAgICAgPC9zY3JpcHQ+CisgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmpzX291dHB1dChbJ3BhdGgnXSksIHIiIiIKKyAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgICAgICA8IS0tIGJlZ2luIGhpZGluZworICAgICAgICBkb2N1bWVudC5jb29raWUgPSAiQ3VzdG9tZXI9XCJXSUxFX0VfQ09ZT1RFXCI7IFBhdGg9L2FjbWUiOworICAgICAgICAvLyBlbmQgaGlkaW5nIC0tPgorICAgICAgICA8L3NjcmlwdD4KKyAgICAgICAgIiIiKQorCisgICAgICAgICMgbG9hZGluZyAnZXhwaXJlcycKKyAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICBDLmxvYWQoJ0N1c3RvbWVyPSJXIjsgZXhwaXJlcz1XZWQsIDAxIEphbiAyMDEwIDAwOjAwOjAwIEdNVCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsnZXhwaXJlcyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICdXZWQsIDAxIEphbiAyMDEwIDAwOjAwOjAwIEdNVCcpCisgICAgICAgIEMgPSBDb29raWUuU2ltcGxlQ29va2llKCkKKyAgICAgICAgQy5sb2FkKCdDdXN0b21lcj0iVyI7IGV4cGlyZXM9V2VkLCAwMSBKYW4gOTggMDA6MDA6MDAgR01UJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddWydleHBpcmVzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1dlZCwgMDEgSmFuIDk4IDAwOjAwOjAwIEdNVCcpCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9lbmNvZGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgOTgyNDogc29tZSBicm93c2VycyBkb24ndCBmb2xsb3cgdGhlIHN0YW5kYXJkOyB3ZSBub3cKKyAgICAgICAgIyBlbmNvZGUgLCBhbmQgOyB0byBrZWVwIHRoZW0gZnJvbSB0cmlwcGluZyB1cC4KKyAgICAgICAgQyA9IENvb2tpZS5TaW1wbGVDb29raWUoKQorICAgICAgICBDWyd2YWwnXSA9ICJzb21lLGZ1bmt5O3N0dWZmIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMub3V0cHV0KFsndmFsJ10pLAorICAgICAgICAgICAgJ1NldC1Db29raWU6IHZhbD0ic29tZVxcMDU0ZnVua3lcXDA3M3N0dWZmIicpCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfbWV0YShzZWxmKToKKyAgICAgICAgIyBUcnkgY29va2llIHdpdGggcXVvdGVkIG1ldGEtZGF0YQorICAgICAgICBDID0gQ29va2llLlNpbXBsZUNvb2tpZSgpCisgICAgICAgIEMubG9hZCgnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDWydDdXN0b21lciddLnZhbHVlLCAnV0lMRV9FX0NPWU9URScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsndmVyc2lvbiddLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1snQ3VzdG9tZXInXVsncGF0aCddLCAnL2FjbWUnKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KENvb2tpZVRlc3RzKQorICAgIGlmIENvb2tpZS5fX2RvY19fIGlzIG5vdCBOb25lOgorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnLitDb29raWUgY2xhc3MgaXMgaW5zZWN1cmU7IGRvIG5vdCB1c2UgaXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHJ1bl9kb2N0ZXN0KENvb2tpZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliZDY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliZDY2OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llbGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29va2llbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGFkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWVsaWIucHkKQEAgLTAsMCArMSwxNzYyIEBACisjIC0qLSBjb2Rpbmc6IGxhdGluLTEgLSotCisiIiJUZXN0cyBmb3IgY29va2llbGliLnB5LiIiIgorCitpbXBvcnQgY29va2llbGliCitpbXBvcnQgb3MKK2ltcG9ydCByZQoraW1wb3J0IHRpbWUKKworZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBEYXRlVGltZVRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3RpbWUyaXNveihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHRpbWUyaXNvegorCisgICAgICAgIGJhc2UgPSAxMDE5MjI3MDAwCisgICAgICAgIGRheSA9IDI0KjM2MDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lMmlzb3ooYmFzZSksICIyMDAyLTA0LTE5IDE0OjM2OjQwWiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZTJpc296KGJhc2UrZGF5KSwgIjIwMDItMDQtMjAgMTQ6MzY6NDBaIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lMmlzb3ooYmFzZSsyKmRheSksICIyMDAyLTA0LTIxIDE0OjM2OjQwWiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZTJpc296KGJhc2UrMypkYXkpLCAiMjAwMi0wNC0yMiAxNDozNjo0MFoiKQorCisgICAgICAgIGF6ID0gdGltZTJpc296KCkKKyAgICAgICAgYnogPSB0aW1lMmlzb3ooNTAwMDAwKQorICAgICAgICBmb3IgdGV4dCBpbiAoYXosIGJ6KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gociJeXGR7NH0tXGRcZC1cZFxkIFxkXGQ6XGRcZDpcZFxkWiQiLCB0ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHRpbWUyaXNveiBmb3JtYXQ6ICVzICVzIiAlIChheiwgYnopKQorCisgICAgZGVmIHRlc3RfaHR0cDJ0aW1lKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgaHR0cDJ0aW1lCisKKyAgICAgICAgZGVmIHBhcnNlX2RhdGUodGV4dCk6CisgICAgICAgICAgICByZXR1cm4gdGltZS5nbXRpbWUoaHR0cDJ0aW1lKHRleHQpKVs6Nl0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2RhdGUoIjAxIEphbiAyMDAxIiksICgyMDAxLCAxLCAxLCAwLCAwLCAwLjApKQorCisgICAgICAgICMgdGhpcyB0ZXN0IHdpbGwgYnJlYWsgYXJvdW5kIHllYXIgMjA3MAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX2RhdGUoIjAzLUZlYi0yMCIpLCAoMjAyMCwgMiwgMywgMCwgMCwgMC4wKSkKKworICAgICAgICAjIHRoaXMgdGVzdCB3aWxsIGJyZWFrIGFyb3VuZCB5ZWFyIDIwNDgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZV9kYXRlKCIwMy1GZWItOTgiKSwgKDE5OTgsIDIsIDMsIDAsIDAsIDAuMCkpCisKKyAgICBkZWYgdGVzdF9odHRwMnRpbWVfZm9ybWF0cyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGh0dHAydGltZSwgdGltZTJpc296CisKKyAgICAgICAgIyB0ZXN0IGh0dHAydGltZSBmb3Igc3VwcG9ydGVkIGRhdGVzLiAgVGVzdCBjYXNlcyB3aXRoIDIgZGlnaXQgeWVhcgorICAgICAgICAjIHdpbGwgcHJvYmFibHkgYnJlYWsgaW4geWVhciAyMDQ0LgorICAgICAgICB0ZXN0cyA9IFsKKyAgICAgICAgICdUaHUsIDAzIEZlYiAxOTk0IDAwOjAwOjAwIEdNVCcsICAjIHByb3Bvc2VkIG5ldyBIVFRQIGZvcm1hdAorICAgICAgICAgJ1RodXJzZGF5LCAwMy1GZWItOTQgMDA6MDA6MDAgR01UJywgICMgb2xkIHJmYzg1MCBIVFRQIGZvcm1hdAorICAgICAgICAgJ1RodXJzZGF5LCAwMy1GZWItMTk5NCAwMDowMDowMCBHTVQnLCAgIyBicm9rZW4gcmZjODUwIEhUVFAgZm9ybWF0CisKKyAgICAgICAgICcwMyBGZWIgMTk5NCAwMDowMDowMCBHTVQnLCAgIyBIVFRQIGZvcm1hdCAobm8gd2Vla2RheSkKKyAgICAgICAgICcwMy1GZWItOTQgMDA6MDA6MDAgR01UJywgICMgb2xkIHJmYzg1MCAobm8gd2Vla2RheSkKKyAgICAgICAgICcwMy1GZWItMTk5NCAwMDowMDowMCBHTVQnLCAgIyBicm9rZW4gcmZjODUwIChubyB3ZWVrZGF5KQorICAgICAgICAgJzAzLUZlYi0xOTk0IDAwOjAwIEdNVCcsICAjIGJyb2tlbiByZmM4NTAgKG5vIHdlZWtkYXksIG5vIHNlY29uZHMpCisgICAgICAgICAnMDMtRmViLTE5OTQgMDA6MDAnLCAgIyBicm9rZW4gcmZjODUwIChubyB3ZWVrZGF5LCBubyBzZWNvbmRzLCBubyB0eikKKworICAgICAgICAgJzAzLUZlYi05NCcsICAjIG9sZCByZmM4NTAgSFRUUCBmb3JtYXQgKG5vIHdlZWtkYXksIG5vIHRpbWUpCisgICAgICAgICAnMDMtRmViLTE5OTQnLCAgIyBicm9rZW4gcmZjODUwIEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5LCBubyB0aW1lKQorICAgICAgICAgJzAzIEZlYiAxOTk0JywgICMgcHJvcG9zZWQgbmV3IEhUVFAgZm9ybWF0IChubyB3ZWVrZGF5LCBubyB0aW1lKQorCisgICAgICAgICAjIEEgZmV3IHRlc3RzIHdpdGggZXh0cmEgc3BhY2UgYXQgdmFyaW91cyBwbGFjZXMKKyAgICAgICAgICcgIDAzICAgRmViICAgMTk5NCAgMDowMCAgJywKKyAgICAgICAgICcgIDAzLUZlYi0xOTk0ICAnLAorICAgICAgICBdCisKKyAgICAgICAgdGVzdF90ID0gNzYwMjMzNjAwICAjIGFzc3VtZSBicm9rZW4gUE9TSVggY291bnRpbmcgb2Ygc2Vjb25kcworICAgICAgICByZXN1bHQgPSB0aW1lMmlzb3oodGVzdF90KQorICAgICAgICBleHBlY3RlZCA9ICIxOTk0LTAyLTAzIDAwOjAwOjAwWiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAgPT4gICclcycgKCVzKSIgJSAodGVzdF90LCByZXN1bHQsIGV4cGVjdGVkKSkKKworICAgICAgICBmb3IgcyBpbiB0ZXN0czoKKyAgICAgICAgICAgIHQgPSBodHRwMnRpbWUocykKKyAgICAgICAgICAgIHQyID0gaHR0cDJ0aW1lKHMubG93ZXIoKSkKKyAgICAgICAgICAgIHQzID0gaHR0cDJ0aW1lKHMudXBwZXIoKSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQgPT0gdDIgPT0gdDMgPT0gdGVzdF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnICA9PiAgJXMsICVzLCAlcyAoJXMpIiAlIChzLCB0LCB0MiwgdDMsIHRlc3RfdCkpCisKKyAgICBkZWYgdGVzdF9odHRwMnRpbWVfZ2FyYmFnZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGh0dHAydGltZQorCisgICAgICAgIGZvciB0ZXN0IGluIFsKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJ0dhcmJhZ2UnLAorICAgICAgICAgICAgJ01hbmRhZyAxNi4gU2VwdGVtYmVyIDE5OTYnLAorICAgICAgICAgICAgJzAxLTAwLTE5ODAnLAorICAgICAgICAgICAgJzAxLTEzLTE5ODAnLAorICAgICAgICAgICAgJzAwLTAxLTE5ODAnLAorICAgICAgICAgICAgJzMyLTAxLTE5ODAnLAorICAgICAgICAgICAgJzAxLTAxLTE5ODAgMjU6MDA6MDAnLAorICAgICAgICAgICAgJzAxLTAxLTE5ODAgMDA6NjE6MDAnLAorICAgICAgICAgICAgJzAxLTAxLTE5ODAgMDA6MDA6NjInLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShodHRwMnRpbWUodGVzdCkgaXMgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDJ0aW1lKCVzKSBpcyBub3QgTm9uZVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwMnRpbWUodGVzdCkgJXMiICUgKHRlc3QsIGh0dHAydGltZSh0ZXN0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICApCisKKworY2xhc3MgSGVhZGVyVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcGFyc2VfbnNfaGVhZGVyc19leHBpcmVzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcGFyc2VfbnNfaGVhZGVycworCisgICAgICAgICMgcXVvdGVzIHNob3VsZCBiZSBzdHJpcHBlZAorICAgICAgICBleHBlY3RlZCA9IFtbKCdmb28nLCAnYmFyJyksICgnZXhwaXJlcycsIDIyMDkwNjk0MTJMKSwgKCd2ZXJzaW9uJywgJzAnKV1dCisgICAgICAgIGZvciBoZHIgaW4gWworICAgICAgICAgICAgJ2Zvbz1iYXI7IGV4cGlyZXM9MDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UJywKKyAgICAgICAgICAgICdmb289YmFyOyBleHBpcmVzPSIwMSBKYW4gMjA0MCAyMjoyMzozMiBHTVQiJywKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3BhcnNlX25zX2hlYWRlcnNfdmVyc2lvbihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHBhcnNlX25zX2hlYWRlcnMKKworICAgICAgICAjIHF1b3RlcyBzaG91bGQgYmUgc3RyaXBwZWQKKyAgICAgICAgZXhwZWN0ZWQgPSBbWygnZm9vJywgJ2JhcicpLCAoJ3ZlcnNpb24nLCAnMScpXV0KKyAgICAgICAgZm9yIGhkciBpbiBbCisgICAgICAgICAgICAnZm9vPWJhcjsgdmVyc2lvbj0iMSInLAorICAgICAgICAgICAgJ2Zvbz1iYXI7IFZlcnNpb249IjEiJywKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3BhcnNlX25zX2hlYWRlcnNfc3BlY2lhbF9uYW1lcyhzZWxmKToKKyAgICAgICAgIyBuYW1lcyBzdWNoIGFzICdleHBpcmVzJyBhcmUgbm90IHNwZWNpYWwgaW4gZmlyc3QgbmFtZT12YWx1ZSBwYWlyCisgICAgICAgICMgb2YgU2V0LUNvb2tpZTogaGVhZGVyCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBwYXJzZV9uc19oZWFkZXJzCisKKyAgICAgICAgIyBDb29raWUgd2l0aCBuYW1lICdleHBpcmVzJworICAgICAgICBoZHIgPSAnZXhwaXJlcz0wMSBKYW4gMjA0MCAyMjoyMzozMiBHTVQnCisgICAgICAgIGV4cGVjdGVkID0gW1soImV4cGlyZXMiLCAiMDEgSmFuIDIwNDAgMjI6MjM6MzIgR01UIiksICgidmVyc2lvbiIsICIwIildXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlX25zX2hlYWRlcnMoW2hkcl0pLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2pvaW5faGVhZGVyX3dvcmRzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgam9pbl9oZWFkZXJfd29yZHMKKworICAgICAgICBqb2luZWQgPSBqb2luX2hlYWRlcl93b3JkcyhbWygiZm9vIiwgTm9uZSksICgiYmFyIiwgImJheiIpXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoam9pbmVkLCAiZm9vOyBiYXI9YmF6IikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpvaW5faGVhZGVyX3dvcmRzKFtbXV0pLCAiIikKKworICAgIGRlZiB0ZXN0X3NwbGl0X2hlYWRlcl93b3JkcyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHNwbGl0X2hlYWRlcl93b3JkcworCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKCJmb28iLCBbWygiZm9vIiwgTm9uZSldXSksCisgICAgICAgICAgICAoImZvbz1iYXIiLCBbWygiZm9vIiwgImJhciIpXV0pLAorICAgICAgICAgICAgKCIgICBmb28gICAiLCBbWygiZm9vIiwgTm9uZSldXSksCisgICAgICAgICAgICAoIiAgIGZvbz0gICAiLCBbWygiZm9vIiwgIiIpXV0pLAorICAgICAgICAgICAgKCIgICBmb289IiwgW1soImZvbyIsICIiKV1dKSwKKyAgICAgICAgICAgICgiICAgZm9vPSAgIDsgIiwgW1soImZvbyIsICIiKV1dKSwKKyAgICAgICAgICAgICgiICAgZm9vPSAgIDsgYmFyPSBiYXogIiwgW1soImZvbyIsICIiKSwgKCJiYXIiLCAiYmF6IildXSksCisgICAgICAgICAgICAoImZvbz1iYXIgYmFyPWJheiIsIFtbKCJmb28iLCAiYmFyIiksICgiYmFyIiwgImJheiIpXV0pLAorICAgICAgICAgICAgIyBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgaWYgdGhpcyBuZXh0IGZhaWxzLCBidXQgaXQgd29ya3MgQVRNCisgICAgICAgICAgICAoImZvbz0gYmFyPWJheiIsIFtbKCJmb28iLCAiYmFyPWJheiIpXV0pLAorICAgICAgICAgICAgKCJmb289YmFyO2Jhcj1iYXoiLCBbWygiZm9vIiwgImJhciIpLCAoImJhciIsICJiYXoiKV1dKSwKKyAgICAgICAgICAgICgnZm9vIGJhciBiYXonLCBbWygiZm9vIiwgTm9uZSksICgiYmFyIiwgTm9uZSksICgiYmF6IiwgTm9uZSldXSksCisgICAgICAgICAgICAoImEsIGIsIGMiLCBbWygiYSIsIE5vbmUpXSwgWygiYiIsIE5vbmUpXSwgWygiYyIsIE5vbmUpXV0pLAorICAgICAgICAgICAgKHInZm9vOyBiYXI9YmF6LCBzcGFtPSwgZm9vPSJcLFw7XCIiLCBiYXI9ICcsCisgICAgICAgICAgICAgW1soImZvbyIsIE5vbmUpLCAoImJhciIsICJiYXoiKV0sCisgICAgICAgICAgICAgIFsoInNwYW0iLCAiIildLCBbKCJmb28iLCAnLDsiJyldLCBbKCJiYXIiLCAiIildXSksCisgICAgICAgICAgICBdCisKKyAgICAgICAgZm9yIGFyZywgZXhwZWN0IGluIHRlc3RzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNwbGl0X2hlYWRlcl93b3JkcyhbYXJnXSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBpbXBvcnQgdHJhY2ViYWNrLCBTdHJpbmdJTworICAgICAgICAgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhOb25lLCBmKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICIoZXJyb3IgLS0gdHJhY2ViYWNrIGZvbGxvd3MpXG5cbiVzIiAlIGYuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICBleHBlY3QsICIiIgorV2hlbiBwYXJzaW5nOiAnJXMnCitFeHBlY3RlZDogICAgICclcycKK0dvdDogICAgICAgICAgJyVzJworIiIiICUgKGFyZywgZXhwZWN0LCByZXN1bHQpKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgc3BsaXRfaGVhZGVyX3dvcmRzLCBqb2luX2hlYWRlcl93b3JkcworCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgKCJmb28iLCAiZm9vIiksCisgICAgICAgICAgICAoImZvbz1iYXIiLCAiZm9vPWJhciIpLAorICAgICAgICAgICAgKCIgICBmb28gICAiLCAiZm9vIiksCisgICAgICAgICAgICAoImZvbz0iLCAnZm9vPSIiJyksCisgICAgICAgICAgICAoImZvbz1iYXIgYmFyPWJheiIsICJmb289YmFyOyBiYXI9YmF6IiksCisgICAgICAgICAgICAoImZvbz1iYXI7YmFyPWJheiIsICJmb289YmFyOyBiYXI9YmF6IiksCisgICAgICAgICAgICAoJ2ZvbyBiYXIgYmF6JywgImZvbzsgYmFyOyBiYXoiKSwKKyAgICAgICAgICAgIChyJ2Zvbz0iXCIiIGJhcj0iXFwiJywgcidmb289IlwiIjsgYmFyPSJcXCInKSwKKyAgICAgICAgICAgICgnZm9vLCwsYmFyJywgJ2ZvbywgYmFyJyksCisgICAgICAgICAgICAoJ2Zvbz1iYXIsYmFyPWJheicsICdmb289YmFyLCBiYXI9YmF6JyksCisKKyAgICAgICAgICAgICgndGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEnLAorICAgICAgICAgICAgICd0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiJyksCisKKyAgICAgICAgICAgICgnZm9vPSJiYXIiOyBwb3J0PSI4MCw4MSI7IGRpc2NhcmQsIGJhcj1iYXonLAorICAgICAgICAgICAgICdmb289YmFyOyBwb3J0PSI4MCw4MSI7IGRpc2NhcmQsIGJhcj1iYXonKSwKKworICAgICAgICAgICAgKHInQmFzaWMgcmVhbG09IlwiZm9vXFxcXGJhclwiIicsCisgICAgICAgICAgICAgcidCYXNpYzsgcmVhbG09IlwiZm9vXFxcXGJhclwiIicpCisgICAgICAgICAgICBdCisKKyAgICAgICAgZm9yIGFyZywgZXhwZWN0IGluIHRlc3RzOgorICAgICAgICAgICAgaW5wdXQgPSBzcGxpdF9oZWFkZXJfd29yZHMoW2FyZ10pCisgICAgICAgICAgICByZXMgPSBqb2luX2hlYWRlcl93b3JkcyhpbnB1dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBleHBlY3QsICIiIgorV2hlbiBwYXJzaW5nOiAnJXMnCitFeHBlY3RlZDogICAgICclcycKK0dvdDogICAgICAgICAgJyVzJworSW5wdXQgd2FzOiAgICAnJXMnCisiIiIgJSAoYXJnLCBleHBlY3QsIHJlcywgaW5wdXQpKQorCisKK2NsYXNzIEZha2VSZXNwb25zZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaGVhZGVycz1bXSwgdXJsPU5vbmUpOgorICAgICAgICAiIiIKKyAgICAgICAgaGVhZGVyczogbGlzdCBvZiBSRkM4MjItc3R5bGUgJ0tleTogdmFsdWUnIHN0cmluZ3MKKyAgICAgICAgIiIiCisgICAgICAgIGltcG9ydCBtaW1ldG9vbHMsIFN0cmluZ0lPCisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTygiXG4iLmpvaW4oaGVhZGVycykpCisgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShmKQorICAgICAgICBzZWxmLl91cmwgPSB1cmwKKyAgICBkZWYgaW5mbyhzZWxmKTogcmV0dXJuIHNlbGYuX2hlYWRlcnMKKworZGVmIGludGVyYWN0XzI5NjUoY29va2llamFyLCB1cmwsICpzZXRfY29va2llX2hkcnMpOgorICAgIHJldHVybiBfaW50ZXJhY3QoY29va2llamFyLCB1cmwsIHNldF9jb29raWVfaGRycywgIlNldC1Db29raWUyIikKKworZGVmIGludGVyYWN0X25ldHNjYXBlKGNvb2tpZWphciwgdXJsLCAqc2V0X2Nvb2tpZV9oZHJzKToKKyAgICByZXR1cm4gX2ludGVyYWN0KGNvb2tpZWphciwgdXJsLCBzZXRfY29va2llX2hkcnMsICJTZXQtQ29va2llIikKKworZGVmIF9pbnRlcmFjdChjb29raWVqYXIsIHVybCwgc2V0X2Nvb2tpZV9oZHJzLCBoZHJfbmFtZSk6CisgICAgIiIiUGVyZm9ybSBhIHNpbmdsZSByZXF1ZXN0IC8gcmVzcG9uc2UgY3ljbGUsIHJldHVybmluZyBDb29raWU6IGhlYWRlci4iIiIKKyAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICByZXEgPSBSZXF1ZXN0KHVybCkKKyAgICBjb29raWVqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgIGNvb2tpZV9oZHIgPSByZXEuZ2V0X2hlYWRlcigiQ29va2llIiwgIiIpCisgICAgaGVhZGVycyA9IFtdCisgICAgZm9yIGhkciBpbiBzZXRfY29va2llX2hkcnM6CisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCIlczogJXMiICUgKGhkcl9uYW1lLCBoZHIpKQorICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCB1cmwpCisgICAgY29va2llamFyLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICByZXR1cm4gY29va2llX2hkcgorCisKK2NsYXNzIEZpbGVDb29raWVKYXJUZXN0cyhUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbHdwX3ZhbHVlbGVzc19jb29raWUoc2VsZik6CisgICAgICAgICMgY29va2llcyB3aXRoIG5vIHZhbHVlIHNob3VsZCBiZSBzYXZlZCBhbmQgbG9hZGVkIGNvbnNpc3RlbnRseQorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgTFdQQ29va2llSmFyCisgICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBjID0gTFdQQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2JvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiYm9vIl0udmFsdWUsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGMuc2F2ZShmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKKyAgICAgICAgICAgIGMgPSBMV1BDb29raWVKYXIoKQorICAgICAgICAgICAgYy5sb2FkKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OiBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImJvbyJdLnZhbHVlLCBOb25lKQorCisgICAgZGVmIHRlc3RfYmFkX21hZ2ljKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgTFdQQ29va2llSmFyLCBNb3ppbGxhQ29va2llSmFyLCBMb2FkRXJyb3IKKyAgICAgICAgIyBJT0Vycm9ycyAoZWcuIGZpbGUgZG9lc24ndCBleGlzdCkgYXJlIGFsbG93ZWQgdG8gcHJvcGFnYXRlCisgICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBmb3IgY29va2llamFyX2NsYXNzIGluIExXUENvb2tpZUphciwgTW96aWxsYUNvb2tpZUphcjoKKyAgICAgICAgICAgIGMgPSBjb29raWVqYXJfY2xhc3MoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGMubG9hZChmaWxlbmFtZT0iZm9yIHRoaXMgdGVzdCB0byB3b3JrLCBhIGZpbGUgd2l0aCB0aGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGVuYW1lIHNob3VsZCBub3QgZXhpc3QiKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICAjIGV4YWN0bHkgSU9FcnJvciwgbm90IExvYWRFcnJvcgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLl9fY2xhc3NfXywgSU9FcnJvcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBJT0Vycm9yIGZvciBpbnZhbGlkIGZpbGVuYW1lIikKKyAgICAgICAgIyBJbnZhbGlkIGNvbnRlbnRzIG9mIGNvb2tpZXMgZmlsZSAoZWcuIGJhZCBtYWdpYyBzdHJpbmcpCisgICAgICAgICMgY2F1c2VzIGEgTG9hZEVycm9yLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgInciKQorICAgICAgICAgICAgZi53cml0ZSgib29wc1xuIikKKyAgICAgICAgICAgIGZvciBjb29raWVqYXJfY2xhc3MgaW4gTFdQQ29va2llSmFyLCBNb3ppbGxhQ29va2llSmFyOgorICAgICAgICAgICAgICAgIGMgPSBjb29raWVqYXJfY2xhc3MoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKExvYWRFcnJvciwgYy5sb2FkLCBmaWxlbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeTogb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6IHBhc3MKKworY2xhc3MgQ29va2llVGVzdHMoVGVzdENhc2UpOgorICAgICMgWFhYCisgICAgIyBHZXQgcmlkIG9mIHN0cmluZyBjb21wYXJpc29ucyB3aGVyZSBub3QgYWN0dWFsbHkgdGVzdGluZyBzdHIgLyByZXByLgorICAgICMgLmNsZWFyKCkgZXRjLgorICAgICMgSVAgYWRkcmVzc2VzIGxpa2UgNTAgKHNpbmdsZSBudW1iZXIsIG5vIGRvdCkgYW5kIGRvbWFpbi1tYXRjaGluZworICAgICMgIGZ1bmN0aW9ucyAoYW5kIGlzX0hETik/ICBTZWUgZHJhZnQgUkZDIDI5NjUgZXJyYXRhLgorICAgICMgU3RyaWN0bmVzcyBzd2l0Y2hlcworICAgICMgaXNfdGhpcmRfcGFydHkoKQorICAgICMgdW52ZXJpZmlhYmlsaXR5IC8gdGhpcmQtcGFydHkgYmxvY2tpbmcKKyAgICAjIE5ldHNjYXBlIGNvb2tpZXMgd29yayB0aGUgc2FtZSBhcyBSRkMgMjk2NSB3aXRoIHJlZ2FyZCB0byBwb3J0LgorICAgICMgU2V0LUNvb2tpZSB3aXRoIG5lZ2F0aXZlIG1heCBhZ2UuCisgICAgIyBJZiB0dXJuIFJGQyAyOTY1IGhhbmRsaW5nIG9mZiwgU2V0LUNvb2tpZTIgY29va2llcyBzaG91bGQgbm90IGNsb2JiZXIKKyAgICAjICBTZXQtQ29va2llIGNvb2tpZXMuCisgICAgIyBDb29raWUyIHNob3VsZCBiZSBzZW50IGlmICphbnkqIGNvb2tpZXMgYXJlIG5vdCBWMSAoaWUuIFYwIE9SIFYyIGV0Yy4pLgorICAgICMgQ29va2llcyAoVjEgYW5kIFYwKSB3aXRoIG5vIGV4cGlyeSBkYXRlIHNob3VsZCBiZSBzZXQgdG8gYmUgZGlzY2FyZGVkLgorICAgICMgUkZDIDI5NjUgUXVvdGluZzoKKyAgICAjICBTaG91bGQgYWNjZXB0IHVucXVvdGVkIGNvb2tpZS1hdHRyaWJ1dGUgdmFsdWVzPyAgY2hlY2sgZXJyYXRhIGRyYWZ0LgorICAgICMgICBXaGljaCBhcmUgcmVxdWlyZWQgb24gdGhlIHdheSBpbiBhbmQgb3V0PworICAgICMgIFNob3VsZCBhbHdheXMgcmV0dXJuIHF1b3RlZCBjb29raWUtYXR0cmlidXRlIHZhbHVlcz8KKyAgICAjIFByb3BlciB0ZXN0aW5nIG9mIHdoZW4gUkZDIDI5NjUgY2xvYmJlcnMgTmV0c2NhcGUgKHdhaXRpbmcgZm9yIGVycmF0YSkuCisgICAgIyBQYXRoLW1hdGNoIG9uIHJldHVybiAoc2FtZSBmb3IgVjAgYW5kIFYxKS4KKyAgICAjIFJGQyAyOTY1IGFjY2VwdGFuY2UgYW5kIHJldHVybmluZyBydWxlcworICAgICMgIFNldC1Db29raWUyIHdpdGhvdXQgdmVyc2lvbiBhdHRyaWJ1dGUgaXMgcmVqZWN0ZWQuCisKKyAgICAjIE5ldHNjYXBlIHBlY3VsaWFyaXRpZXMgbGlzdCBmcm9tIFJvbmFsZCBUc2NoYWxhci4KKyAgICAjIFRoZSBmaXJzdCB0d28gc3RpbGwgbmVlZCB0ZXN0cywgdGhlIHJlc3QgYXJlIGNvdmVyZWQuCisjIyAtIFF1b3Rpbmc6IG9ubHkgcXVvdGVzIGFyb3VuZCB0aGUgZXhwaXJlcyB2YWx1ZSBhcmUgcmVjb2duaXplZCBhcyBzdWNoCisjIyAgIChhbmQgeWVzLCBzb21lIGZvbGtzIHF1b3RlIHRoZSBleHBpcmVzIHZhbHVlKTsgcXVvdGVzIGFyb3VuZCBhbnkgb3RoZXIKKyMjICAgdmFsdWUgYXJlIHRyZWF0ZWQgYXMgcGFydCBvZiB0aGUgdmFsdWUuCisjIyAtIFdoaXRlIHNwYWNlOiB3aGl0ZSBzcGFjZSBhcm91bmQgbmFtZXMgYW5kIHZhbHVlcyBpcyBpZ25vcmVkCisjIyAtIERlZmF1bHQgcGF0aDogaWYgbm8gcGF0aCBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGRlZmF1bHRzIHRvIHRoZQorIyMgICBwYXRoIGluIHRoZSByZXF1ZXN0LXVyaSB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIHRoZSBsYXN0ICcvJy4gTm90ZQorIyMgICB0aGF0IHRoaXMgaXMgZW50aXJlbHkgZGlmZmVyZW50IGZyb20gd2hhdCB0aGUgc3BlYyBzYXlzLgorIyMgLSBDb21tYXMgYW5kIG90aGVyIGRlbGltaXRlcnM6IE5ldHNjYXBlIGp1c3QgcGFyc2VzIHVudGlsIHRoZSBuZXh0ICc7Jy4KKyMjICAgVGhpcyBtZWFucyBpdCB3aWxsIGFsbG93IGNvbW1hcyBldGMgaW5zaWRlIHZhbHVlcyAoYW5kIHllcywgYm90aAorIyMgICBjb21tYXMgYW5kIGVxdWFscyBhcmUgY29tbW9ubHkgYXBwZWFyIGluIHRoZSBjb29raWUgdmFsdWUpLiBUaGlzIGFsc28KKyMjICAgbWVhbnMgdGhhdCBpZiB5b3UgZm9sZCBtdWx0aXBsZSBTZXQtQ29va2llIGhlYWRlciBmaWVsZHMgaW50byBvbmUsCisjIyAgIGNvbW1hLXNlcGFyYXRlZCBsaXN0LCBpdCdsbCBiZSBhIGhlYWRhY2hlIHRvIHBhcnNlIChhdCBsZWFzdCBteSBoZWFkCisjIyAgIHN0YXJ0cyBodXJ0aW5nIGV2ZXJ5dGltZSBJIHRoaW5rIG9mIHRoYXQgY29kZSkuCisjIyAtIEV4cGlyZXM6IFlvdSdsbCBnZXQgYWxsIHNvcnRzIG9mIGRhdGUgZm9ybWF0cyBpbiB0aGUgZXhwaXJlcywKKyMjICAgaW5jbHVkaW5nIGVtdHB5IGV4cGlyZXMgYXR0cmlidXRlcyAoImV4cGlyZXM9IikuIEJlIGFzIGZsZXhpYmxlIGFzIHlvdQorIyMgICBjYW4sIGFuZCBjZXJ0YWlubHkgZG9uJ3QgZXhwZWN0IHRoZSB3ZWVrZGF5IHRvIGJlIHRoZXJlOyBpZiB5b3UgY2FuJ3QKKyMjICAgcGFyc2UgaXQsIGp1c3QgaWdub3JlIGl0IGFuZCBwcmV0ZW5kIGl0J3MgYSBzZXNzaW9uIGNvb2tpZS4KKyMjIC0gRG9tYWluLW1hdGNoaW5nOiBOZXRzY2FwZSB1c2VzIHRoZSAyLWRvdCBydWxlIGZvciBfYWxsXyBkb21haW5zLCBub3QKKyMjICAganVzdCB0aGUgNyBzcGVjaWFsIFRMRCdzIGxpc3RlZCBpbiB0aGVpciBzcGVjLiBBbmQgZm9sa3MgcmVseSBvbgorIyMgICB0aGF0Li4uCisKKyAgICBkZWYgdGVzdF9kb21haW5fcmV0dXJuX29rKHNlbGYpOgorICAgICAgICAjIHRlc3Qgb3B0aW1pemF0aW9uOiAuZG9tYWluX3JldHVybl9vaygpIHNob3VsZCBmaWx0ZXIgb3V0IG1vc3QKKyAgICAgICAgIyBkb21haW5zIGluIHRoZSBDb29raWVKYXIgYmVmb3JlIHdlIHRyeSB0byBhY2Nlc3MgdGhlbSAoYmVjYXVzZSB0aGF0CisgICAgICAgICMgbWF5IHJlcXVpcmUgZGlzayBhY2Nlc3MgLS0gaW4gcGFydGljdWxhciwgd2l0aCBNU0lFQ29va2llSmFyKQorICAgICAgICAjIFRoaXMgaXMgb25seSBhIHJvdWdoIGNoZWNrIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLCBzbyBpdCdzIG5vdCB0b28KKyAgICAgICAgIyBjcml0aWNhbCBhcyBsb25nIGFzIGl0J3Mgc3VmZmljaWVudGx5IGxpYmVyYWwuCisgICAgICAgIGltcG9ydCBjb29raWVsaWIsIHVybGxpYjIKKyAgICAgICAgcG9sID0gY29va2llbGliLkRlZmF1bHRDb29raWVQb2xpY3koKQorICAgICAgICBmb3IgdXJsLCBkb21haW4sIG9rIGluIFsKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICJibGFoLmNvbSIsIEZhbHNlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICJyaHViYXJiLmJsYWguY29tIiwgRmFsc2UpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgInJodWJhcmIuZm9vLmJhci5jb20iLCBGYWxzZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiLmZvby5iYXIuY29tIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28uYmFyLmNvbS8iLCAiZm9vLmJhci5jb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5iYXIuY29tLyIsICIuYmFyLmNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmJhci5jb20vIiwgImNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAicmh1YmFyYi5mb28uY29tIiwgRmFsc2UpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLmNvbS8iLCAiLmZvby5jb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5jb20vIiwgImZvby5jb20iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby5jb20vIiwgImNvbSIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICJyaHViYXJiLmZvbyIsIEZhbHNlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiLmZvbyIsIFRydWUpLAorICAgICAgICAgICAgKCJodHRwOi8vZm9vLyIsICJmb28iLCBUcnVlKSwKKyAgICAgICAgICAgICgiaHR0cDovL2Zvby8iLCAiZm9vLmxvY2FsIiwgVHJ1ZSksCisgICAgICAgICAgICAoImh0dHA6Ly9mb28vIiwgIi5sb2NhbCIsIFRydWUpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHJlcXVlc3QgPSB1cmxsaWIyLlJlcXVlc3QodXJsKQorICAgICAgICAgICAgciA9IHBvbC5kb21haW5fcmV0dXJuX29rKGRvbWFpbiwgcmVxdWVzdCkKKyAgICAgICAgICAgIGlmIG9rOiBzZWxmLmFzc2VydFRydWUocikKKyAgICAgICAgICAgIGVsc2U6IHNlbGYuYXNzZXJ0VHJ1ZShub3QgcikKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfdmFsdWUoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBsd3BfY29va2llX3N0cgorCisgICAgICAgICMgbWlzc2luZyA9IHNpZ24gaW4gQ29va2llOiBoZWFkZXIgaXMgcmVnYXJkZWQgYnkgTW96aWxsYSBhcyBhIG1pc3NpbmcKKyAgICAgICAgIyBuYW1lLCBhbmQgYnkgY29va2llbGliIGFzIGEgbWlzc2luZyB2YWx1ZQorICAgICAgICBmaWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdlZ2dzJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJyJzcGFtIjsgcGF0aD0vZm9vLycpCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImVnZ3MiXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLnZhbHVlIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llLm5hbWUsICJlZ2dzIikKKyAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bJy9mb28vJ11bJyJzcGFtIiddCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUudmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUubmFtZSwgJyJzcGFtIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHdwX2Nvb2tpZV9zdHIoY29va2llKSwgKAorICAgICAgICAgICAgcicic3BhbSI7IHBhdGg9Ii9mb28vIjsgZG9tYWluPSJ3d3cuYWNtZS5jb20iOyAnCisgICAgICAgICAgICAncGF0aF9zcGVjOyBkaXNjYXJkOyB2ZXJzaW9uPTAnKSkKKyAgICAgICAgb2xkX3N0ciA9IHJlcHIoYykKKyAgICAgICAgYy5zYXZlKGlnbm9yZV9leHBpcmVzPVRydWUsIGlnbm9yZV9kaXNjYXJkPVRydWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGMgPSBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lKQorICAgICAgICAgICAgYy5yZXZlcnQoaWdub3JlX2V4cGlyZXM9VHJ1ZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhjLmZpbGVuYW1lKQorICAgICAgICAjIGNvb2tpZXMgdW5jaGFuZ2VkIGFwYXJ0IGZyb20gbG9zdCBpbmZvIHJlLiB3aGV0aGVyIHBhdGggd2FzIHNwZWNpZmllZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcmVwcihjKSwKKyAgICAgICAgICAgIHJlLnN1YigicGF0aF9zcGVjaWZpZWQ9JXMiICUgVHJ1ZSwgInBhdGhfc3BlY2lmaWVkPSVzIiAlIEZhbHNlLAorICAgICAgICAgICAgICAgICAgIG9sZF9zdHIpCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICcic3BhbSI7IGVnZ3MnKQorCisgICAgZGVmIHRlc3RfcmZjMjEwOV9oYW5kbGluZyhzZWxmKToKKyAgICAgICAgIyBSRkMgMjEwOSBjb29raWVzIGFyZSBoYW5kbGVkIGFzIFJGQyAyOTY1IG9yIE5ldHNjYXBlIGNvb2tpZXMsCisgICAgICAgICMgZGVwZW5kZW50IG9uIHBvbGljeSBzZXR0aW5ncworICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgZm9yIHJmYzIxMDlfYXNfbmV0c2NhcGUsIHJmYzI5NjUsIHZlcnNpb24gaW4gWworICAgICAgICAgICAgIyBkZWZhdWx0IGFjY29yZGluZyB0byByZmMyOTY1IGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZAorICAgICAgICAgICAgKE5vbmUsIEZhbHNlLCAwKSwKKyAgICAgICAgICAgIChOb25lLCBUcnVlLCAxKSwKKyAgICAgICAgICAgICMgZXhwbGljaXQgcmZjMjEwOV9hc19uZXRzY2FwZQorICAgICAgICAgICAgKEZhbHNlLCBGYWxzZSwgTm9uZSksICAjIHZlcnNpb24gTm9uZSBoZXJlIG1lYW5zIG5vIGNvb2tpZSBzdG9yZWQKKyAgICAgICAgICAgIChGYWxzZSwgVHJ1ZSwgMSksCisgICAgICAgICAgICAoVHJ1ZSwgRmFsc2UsIDApLAorICAgICAgICAgICAgKFRydWUsIFRydWUsIDApLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHBvbGljeSA9IERlZmF1bHRDb29raWVQb2xpY3koCisgICAgICAgICAgICAgICAgcmZjMjEwOV9hc19uZXRzY2FwZT1yZmMyMTA5X2FzX25ldHNjYXBlLAorICAgICAgICAgICAgICAgIHJmYzI5NjU9cmZjMjk2NSkKKyAgICAgICAgICAgIGMgPSBDb29raWVKYXIocG9saWN5KQorICAgICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIiwgIm5pPW5pOyBWZXJzaW9uPTEiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bIm5pIl0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmVyc2lvbiBpcyBOb25lKSAgIyBkaWRuJ3QgZXhwZWN0IGEgc3RvcmVkIGNvb2tpZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS52ZXJzaW9uLCB2ZXJzaW9uKQorICAgICAgICAgICAgICAgICMgMjk2NSBjb29raWVzIGFyZSB1bmFmZmVjdGVkCisgICAgICAgICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7IFZlcnNpb249MSIpCisgICAgICAgICAgICAgICAgaWYgcmZjMjk2NToKKyAgICAgICAgICAgICAgICAgICAgY29va2llMjk2NSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImZvbyJdCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llMjk2NS52ZXJzaW9uLCAxKQorCisgICAgZGVmIHRlc3RfbnNfcGFyc2VyKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBERUZBVUxUX0hUVFBfUE9SVAorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnc3BhbT1lZ2dzOyBEb01haW49LmFjbWUuY29tOyBwb3J0OyBibEFyZ2g9ImZlZXAiJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ25pPW5pOyBwb3J0PTgwLDgwODAnKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbTo4MC8iLCAnbmluaT1uaScpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICdmb289YmFyOyBleHBpcmVzPScpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsICdzcGFtPWVnZ3M7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGlyZXM9IkZvbyBCYXIgMjUgMzM6MjI6MTEgMzAyMiInKQorCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbIi5hY21lLmNvbSJdWyIvIl1bInNwYW0iXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS5kb21haW4sICIuYWNtZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29va2llLnBvcnQsIERFRkFVTFRfSFRUUF9QT1JUKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKKyAgICAgICAgIyBjYXNlIGlzIHByZXNlcnZlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmhhc19ub25zdGFuZGFyZF9hdHRyKCJibEFyZ2giKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgIG5vdCBjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsYXJnaCIpKQorCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bIm5pIl0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUuZG9tYWluLCAid3d3LmFjbWUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb29raWUuZG9tYWluX3NwZWNpZmllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb29raWUucG9ydCwgIjgwLDgwODAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLnBvcnRfc3BlY2lmaWVkKQorCisgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bIm5pbmkiXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLnBvcnQgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCisKKyAgICAgICAgIyBpbnZhbGlkIGV4cGlyZXMgc2hvdWxkIG5vdCBjYXVzZSBjb29raWUgdG8gYmUgZHJvcHBlZAorICAgICAgICBmb28gPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28iXQorICAgICAgICBzcGFtID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vIl0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvby5leHBpcmVzIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGFtLmV4cGlyZXMgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X25zX3BhcnNlcl9zcGVjaWFsX25hbWVzKHNlbGYpOgorICAgICAgICAjIG5hbWVzIHN1Y2ggYXMgJ2V4cGlyZXMnIGFyZSBub3Qgc3BlY2lhbCBpbiBmaXJzdCBuYW1lPXZhbHVlIHBhaXIKKyAgICAgICAgIyBvZiBTZXQtQ29va2llOiBoZWFkZXIKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphcgorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZXhwaXJlcz1lZ2dzJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ3ZlcnNpb249ZWdnczsgc3BhbT1lZ2dzJykKKworICAgICAgICBjb29raWVzID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2V4cGlyZXMnIGluIGNvb2tpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndmVyc2lvbicgaW4gY29va2llcykKKworICAgIGRlZiB0ZXN0X2V4cGlyZXMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCB0aW1lMm5ldHNjYXBlLCBDb29raWVKYXIKKworICAgICAgICAjIGlmIGV4cGlyZXMgaXMgaW4gZnV0dXJlLCBrZWVwIGNvb2tpZS4uLgorICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgZnV0dXJlID0gdGltZTJuZXRzY2FwZSh0aW1lLnRpbWUoKSszNjAwKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIjsgZXhwaXJlcz0lcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAxKQorICAgICAgICBub3cgPSB0aW1lMm5ldHNjYXBlKHRpbWUudGltZSgpLTEpCisgICAgICAgICMgLi4uIGFuZCBpZiBpbiBwYXN0IG9yIHByZXNlbnQsIGRpc2NhcmQgaXQKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2Zvbz0iZWdncyI7IGV4cGlyZXM9JXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbm93KQorICAgICAgICBoID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc3BhbT0iYmFyIicgaW4gaCBhbmQgImZvbyIgbm90IGluIGgpCisKKyAgICAgICAgIyBtYXgtYWdlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBleHBpcmVzLCBhbmQgemVybyBtYXgtYWdlIGlzIHJlcXVlc3QgdG8KKyAgICAgICAgIyBkZWxldGUgYm90aCBuZXcgY29va2llIGFuZCBhbnkgb2xkIG1hdGNoaW5nIGNvb2tpZQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnZWdncz0iYmFyIjsgZXhwaXJlcz0lcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBmdXR1cmUpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdiYXI9ImJhciI7IGV4cGlyZXM9JXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnV0dXJlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2VnZ3M9ImJhciI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGlyZXM9JXM7IG1heC1hZ2U9MCcgJSBmdXR1cmUpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdiYXI9ImJhciI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ21heC1hZ2U9MDsgZXhwaXJlcz0lcycgJSBmdXR1cmUpCisgICAgICAgIGggPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKworICAgICAgICAjIHRlc3QgZXhwaXJ5IGF0IGVuZCBvZiBzZXNzaW9uIGZvciBjb29raWVzIHdpdGggbm8gZXhwaXJlcyBhdHRyaWJ1dGUKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cucmh1YmFyYi5uZXQvIiwgJ3dodW09ImZpenoiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDIpCisgICAgICAgIGMuY2xlYXJfc2Vzc2lvbl9jb29raWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3NwYW09ImJhciInLCBoKQorCisgICAgICAgICMgWFhYIFJGQyAyOTY1IGV4cGlyeSBydWxlcyAoc29tZSBhcHBseSB0byBWMCB0b28pCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3BhdGgoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICAjIFJGQyAyOTY1CisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIi8iLCBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoIiwgJ2VnZ3M9ImJhciI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiLyIsIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsCisgICAgICAgICAgICAgICAgICAgICAgJ2VnZ3M9ImJhciI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiL2JsYWgvIiwgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ2VnZ3M9ImJhciI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiL2JsYWgvcmh1YmFyYi8iLCBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKKworICAgICAgICAjIE5ldHNjYXBlCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiLyIsIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoIiwgJ2VnZ3M9ImJhciInKQorICAgICAgICBzZWxmLmFzc2VydEluKCIvIiwgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsICdlZ2dzPSJiYXIiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiL2JsYWgiLCBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiLyIsICdlZ2dzPSJiYXIiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiL2JsYWgvcmh1YmFyYiIsIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9wYXRoX3dpdGhfcXVlcnkoc2VsZik6CisgICAgICAgIGNqID0gY29va2llbGliLkNvb2tpZUphcigpCisgICAgICAgIHVyaSA9ICJodHRwOi8vZXhhbXBsZS5jb20vP3NwYW0vZWdncyIKKyAgICAgICAgdmFsdWUgPSAnZWdncz0iYmFyIicKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY2osIHVyaSwgdmFsdWUpCisgICAgICAgICMgZGVmYXVsdCBwYXRoIGRvZXMgbm90IGluY2x1ZGUgcXVlcnksIHNvIGlzICIvIiwgbm90ICIvP3NwYW0iCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIi8iLCBjai5fY29va2llc1siZXhhbXBsZS5jb20iXSkKKyAgICAgICAgIyBjb29raWUgaXMgc2VudCBiYWNrIHRvIHRoZSBzYW1lIFVSSQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0X25ldHNjYXBlKGNqLCB1cmkpLCB2YWx1ZSkKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9wYXRoKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgZXNjYXBlX3BhdGgKKyAgICAgICAgY2FzZXMgPSBbCisgICAgICAgICAgICAjIHF1b3RlZCBzYWZlCisgICAgICAgICAgICAoIi9mb28lMmYvYmFyIiwgIi9mb28lMkYvYmFyIiksCisgICAgICAgICAgICAoIi9mb28lMkYvYmFyIiwgIi9mb28lMkYvYmFyIiksCisgICAgICAgICAgICAjIHF1b3RlZCAlCisgICAgICAgICAgICAoIi9mb28lJS9iYXIiLCAiL2ZvbyUlL2JhciIpLAorICAgICAgICAgICAgIyBxdW90ZWQgdW5zYWZlCisgICAgICAgICAgICAoIi9mbyUxOW8vYmFyIiwgIi9mbyUxOW8vYmFyIiksCisgICAgICAgICAgICAoIi9mbyU3ZG8vYmFyIiwgIi9mbyU3RG8vYmFyIiksCisgICAgICAgICAgICAjIHVucXVvdGVkIHNhZmUKKyAgICAgICAgICAgICgiL2Zvby9iYXImIiwgIi9mb28vYmFyJiIpLAorICAgICAgICAgICAgKCIvZm9vLy9iYXIiLCAiL2Zvby8vYmFyIiksCisgICAgICAgICAgICAoIlwxNzYvZm9vL2JhciIsICJcMTc2L2Zvby9iYXIiKSwKKyAgICAgICAgICAgICMgdW5xdW90ZWQgdW5zYWZlCisgICAgICAgICAgICAoIi9mb29cMDMxL2JhciIsICIvZm9vJTE5L2JhciIpLAorICAgICAgICAgICAgKCIvXDE3NWZvby9iYXIiLCAiLyU3RGZvby9iYXIiKSwKKyAgICAgICAgICAgICMgdW5pY29kZQorICAgICAgICAgICAgKHUiL2Zvby9iYXJcdWFiY2QiLCAiL2Zvby9iYXIlRUElQUYlOEQiKSwgICMgVVRGLTggZW5jb2RlZAorICAgICAgICAgICAgXQorICAgICAgICBmb3IgYXJnLCByZXN1bHQgaW4gY2FzZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVzY2FwZV9wYXRoKGFyZyksIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X3JlcXVlc3RfcGF0aChzZWxmKToKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X3BhdGgKKyAgICAgICAgIyB3aXRoIHBhcmFtZXRlcnMKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9yaGV1bS9yaGFwb250aWN1bTsiCisgICAgICAgICAgICAgICAgICAgICAgImZvbz1iYXI7c2luZz1zb25nP2FwcGxlcz1wZWFycyZzcGFtPWVnZ3MjbmkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3RfcGF0aChyZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIvcmhldW0vcmhhcG9udGljdW07Zm9vPWJhcjtzaW5nPXNvbmciKQorICAgICAgICAjIHdpdGhvdXQgcGFyYW1ldGVycworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmV4YW1wbGUuY29tL3JoZXVtL3JoYXBvbnRpY3VtPyIKKyAgICAgICAgICAgICAgICAgICAgICAiYXBwbGVzPXBlYXJzJnNwYW09ZWdncyNuaSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF9wYXRoKHJlcSksICIvcmhldW0vcmhhcG9udGljdW0iKQorICAgICAgICAjIG1pc3NpbmcgZmluYWwgc2xhc2gKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF9wYXRoKHJlcSksICIvIikKKworICAgIGRlZiB0ZXN0X3JlcXVlc3RfcG9ydChzZWxmKToKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCByZXF1ZXN0X3BvcnQsIERFRkFVTFRfSFRUUF9QT1JUCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206MTIzNC8iLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo0MzIxIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF9wb3J0KHJlcSksICIxMjM0IikKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo0MzIxIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdF9wb3J0KHJlcSksIERFRkFVTFRfSFRUUF9QT1JUKQorCisgICAgZGVmIHRlc3RfcmVxdWVzdF9ob3N0KHNlbGYpOgorICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlcXVlc3RfaG9zdAorICAgICAgICAjIHRoaXMgcmVxdWVzdCBpcyBpbGxlZ2FsIChSRkMyNjE2LCAxNC4yLjMpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly8xLjEuMS4xLyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjgwIn0pCisgICAgICAgICMgbGlid3d3LXBlcmwgd2FudHMgdGhpcyByZXNwb25zZSwgYnV0IHRoYXQgc2VlbXMgd3JvbmcgKFJGQyAyNjE2LAorICAgICAgICAjIHNlY3Rpb24gNS4yLCBwb2ludCAxLiwgYW5kIFJGQyAyOTY1IHNlY3Rpb24gMSwgcGFyYWdyYXBoIDMpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0X2hvc3QocmVxKSwgIjEuMS4xLjEiKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAiaXJyZWxldmFudC5jb20ifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0X2hvc3QocmVxKSwgInd3dy5hY21lLmNvbSIpCisgICAgICAgICMgbm90IGFjdHVhbGx5IHN1cmUgdGhpcyBvbmUgaXMgdmFsaWQgUmVxdWVzdCBvYmplY3QsIHNvIG1heWJlIHNob3VsZAorICAgICAgICAjIHJlbW92ZSB0ZXN0IGZvciBubyBob3N0IGluIHVybCBpbiByZXF1ZXN0X2hvc3QgZnVuY3Rpb24/CisgICAgICAgIHJlcSA9IFJlcXVlc3QoIi9yZXNvdXJjZS5odG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb20ifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0X2hvc3QocmVxKSwgInd3dy5hY21lLmNvbSIpCisgICAgICAgICMgcG9ydCBzaG91bGRuJ3QgYmUgaW4gcmVxdWVzdC1ob3N0CisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb206MjM0NS9yZXNvdXJjZS5odG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiSG9zdCI6ICJ3d3cuYWNtZS5jb206NTQzMiJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3RfaG9zdChyZXEpLCAid3d3LmFjbWUuY29tIikKKworICAgIGRlZiB0ZXN0X2lzX0hETihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGlzX0hETgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNfSEROKCJmb28uYmFyLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNfSEROKCIxZm9vMi4zYmFyNC41Y29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCIxOTIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzX0hETigiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCIuZm9vLmJhci5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi4uZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCJmb28uIikpCisKKyAgICBkZWYgdGVzdF9yZWFjaChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHJlYWNoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhY2goInd3dy5hY21lLmNvbSIpLCAiLmFjbWUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFjaCgiYWNtZS5jb20iKSwgImFjbWUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFjaCgiYWNtZS5sb2NhbCIpLCAiLmxvY2FsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFjaCgiLmxvY2FsIiksICIubG9jYWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWNoKCIuY29tIiksICIuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFjaCgiLiIpLCAiLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhY2goIiIpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFjaCgiMTkyLjE2OC4wLjEiKSwgIjE5Mi4xNjguMC4xIikKKworICAgIGRlZiB0ZXN0X2RvbWFpbl9tYXRjaChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGRvbWFpbl9tYXRjaCwgdXNlcl9kb21haW5fbWF0Y2gKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiMTkyLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCJhLmIuYy5jb20iLCAiLmMuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCIuYy5jb20iLCAiYS5iLmMuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goImV4YW1wbGUubG9jYWwiLCAiLmxvY2FsIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCJibGFoLmJsYWgiLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCIiLCAiLnJodWJhcmIucmh1YmFyYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCIiLCAiIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICJhY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICIuYWNtZS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJyaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goInd3dy5yaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJ5LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAibSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIjE5Mi4xNjguMS4xIikpCisgICAgICAgICMgbm90IGJvdGggSEROcywgc28gbXVzdCBzdHJpbmctY29tcGFyZSBlcXVhbCB0byBtYXRjaAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuIikpCisgICAgICAgICMgZW1wdHkgc3RyaW5nIGlzIGEgc3BlY2lhbCBjYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIiIpKQorCisgICAgZGVmIHRlc3Rfd3JvbmdfZG9tYWluKHNlbGYpOgorICAgICAgICAjIENvb2tpZXMgd2hvc2UgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lIGRvZXMgbm90IGRvbWFpbi1tYXRjaCB0aGUKKyAgICAgICAgIyBkb21haW4gYXJlIHJlamVjdGVkLgorCisgICAgICAgICMgWFhYIGZhciBmcm9tIGNvbXBsZXRlCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cubmFzdHkuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj1mcmllbmRseS5vcmc7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDApCisKKyAgICBkZWYgdGVzdF9zdHJpY3RfZG9tYWluKHNlbGYpOgorICAgICAgICAjIENvb2tpZXMgd2hvc2UgZG9tYWluIGlzIGEgY291bnRyeS1jb2RlIHRsZCBsaWtlIC5jby51ayBzaG91bGQKKyAgICAgICAgIyBub3QgYmUgc2V0IGlmIENvb2tpZVBvbGljeS5zdHJpY3RfZG9tYWluIGlzIHRydWUuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjcCA9IERlZmF1bHRDb29raWVQb2xpY3koc3RyaWN0X2RvbWFpbj1UcnVlKQorICAgICAgICBjaiA9IENvb2tpZUphcihwb2xpY3k9Y3ApCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGNqLCAiaHR0cDovL2V4YW1wbGUuY28udWsvIiwgJ25vPXByb2JsZW1vJykKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY2osICJodHRwOi8vZXhhbXBsZS5jby51ay8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnb2tleT1kb2tleTsgRG9tYWluPS5leGFtcGxlLmNvLnVrJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY2opLCAyKQorICAgICAgICBmb3IgcHNldWRvX3RsZCBpbiBbIi5jby51ayIsICIub3JnLnphIiwgIi50eC51cyIsICIubmFtZS51cyJdOgorICAgICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoY2osICJodHRwOi8vZXhhbXBsZS4lcy8iICUgcHNldWRvX3RsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFtPWVnZ3M7IERvbWFpbj0uY28udWsnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY2opLCAyKQorCisgICAgZGVmIHRlc3RfdHdvX2NvbXBvbmVudF9kb21haW5fbnMoc2VsZik6CisgICAgICAgICMgTmV0c2NhcGU6IC53d3cuYmFyLmNvbSwgd3d3LmJhci5jb20sIC5iYXIuY29tLCBiYXIuY29tLCBubyBkb21haW4KKyAgICAgICAgIyBzaG91bGQgYWxsIGdldCBhY2NlcHRlZCwgYXMgc2hvdWxkIC5hY21lLmNvbSwgYWNtZS5jb20gYW5kIG5vIGRvbWFpbgorICAgICAgICAjIGZvciAyLWNvbXBvbmVudCBkb21haW5zIGxpa2UgYWNtZS5jb20uCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKworICAgICAgICAjIHR3by1jb21wb25lbnQgVjAgZG9tYWluIGlzIE9LCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iLCAnbnM9YmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1siZm9vLm5ldCJdWyIvIl1bIm5zIl0udmFsdWUsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC8iKSwgIm5zPWJhciIpCisgICAgICAgICMgKndpbGwqIGJlIHJldHVybmVkIHRvIGFueSBvdGhlciBkb21haW4gKHVubGlrZSBSRkMgMjk2NSkuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28ubmV0LyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJucz1iYXIiKQorICAgICAgICAjIC4uLnVubGVzcyByZXF1ZXN0ZWQgb3RoZXJ3aXNlCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3koCisgICAgICAgICAgICBzdHJpY3RfbnNfZG9tYWluPURlZmF1bHRDb29raWVQb2xpY3kuRG9tYWluU3RyaWN0Tm9uRG9tYWluKQorICAgICAgICBjLnNldF9wb2xpY3kocG9sKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5uZXQvIiksICIiKQorCisgICAgICAgICMgdW5saWtlIFJGQyAyOTY1LCBldmVuIGV4cGxpY2l0IHR3by1jb21wb25lbnQgZG9tYWluIGlzIE9LLAorICAgICAgICAjIGJlY2F1c2UgLmZvby5uZXQgbWF0Y2hlcyBmb28ubmV0CisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW0xPWVnZ3M7IGRvbWFpbj1mb28ubmV0JykKKyAgICAgICAgIyBldmVuIGlmIHN0YXJ0cyB3aXRoIGEgZG90IC0tIGluIE5TIHJ1bGVzLCAuZm9vLm5ldCBtYXRjaGVzIGZvby5uZXQhCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vYmFyLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGFtMj1lZ2dzOyBkb21haW49LmZvby5uZXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9jb29raWVzWyIuZm9vLm5ldCJdWyIvZm9vIl1bInNwYW0xIl0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX2Nvb2tpZXNbIi5mb28ubmV0Il1bIi9mb28vYmFyIl1bInNwYW0yIl0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImVnZ3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZm9vLm5ldC9mb28vYmFyLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzcGFtMj1lZ2dzOyBzcGFtMT1lZ2dzOyBucz1iYXIiKQorCisgICAgICAgICMgdG9wLWxldmVsIGRvbWFpbiBpcyB0b28gZ2VuZXJhbAorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2Zvby5uZXQvIiwgJ25pbmk9Im5pIjsgZG9tYWluPS5uZXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKKworIyMgICAgICAgICAjIE5ldHNjYXBlIHByb3RvY29sIGRvZXNuJ3QgYWxsb3cgbm9uLXNwZWNpYWwgdG9wIGxldmVsIGRvbWFpbnMgKHN1Y2gKKyMjICAgICAgICAgIyBhcyBjby51aykgaW4gdGhlIGRvbWFpbiBhdHRyaWJ1dGUgdW5sZXNzIHRoZXJlIGFyZSBhdCBsZWFzdCB0aHJlZQorIyMgICAgICAgICAjIGRvdHMgaW4gaXQuCisgICAgICAgICMgT2ggeWVzIGl0IGRvZXMhICBSZWFsIGltcGxlbWVudGF0aW9ucyBkb24ndCBjaGVjayB0aGlzLCBhbmQgcmVhbAorICAgICAgICAjIGNvb2tpZXMgKG9mIGNvdXJzZSkgcmVseSBvbiB0aGF0IGJlaGF2aW91ci4KKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9mb28uY28udWsiLCAnbmFzdHk9dHJpY2s7IGRvbWFpbj0uY28udWsnKQorIyMgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDQpCisKKyAgICBkZWYgdGVzdF90d29fY29tcG9uZW50X2RvbWFpbl9yZmMyOTY1KHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorCisgICAgICAgICMgdHdvLWNvbXBvbmVudCBWMSBkb21haW4gaXMgT0sKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvIiwgJ2Zvbz1iYXI7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1siZm9vLm5ldCJdWyIvIl1bImZvbyJdLnZhbHVlLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZm9vLm5ldC8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJFZlcnNpb249MTsgZm9vPWJhciIpCisgICAgICAgICMgd29uJ3QgYmUgcmV0dXJuZWQgdG8gYW55IG90aGVyIGRvbWFpbiAoYmVjYXVzZSBkb21haW4gd2FzIGltcGxpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5mb28ubmV0LyIpLCAiIikKKworICAgICAgICAjIHVubGVzcyBkb21haW4gaXMgZ2l2ZW4gZXhwbGljaXRseSwgYmVjYXVzZSB0aGVuIGl0IG11c3QgYmUKKyAgICAgICAgIyByZXdyaXR0ZW4gdG8gc3RhcnQgd2l0aCBhIGRvdDogZm9vLm5ldCAtLT4gLmZvby5uZXQsIHdoaWNoIGRvZXMKKyAgICAgICAgIyBub3QgZG9tYWluLW1hdGNoIGZvby5uZXQKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAnc3BhbT1lZ2dzOyBkb21haW49Zm9vLm5ldDsgcGF0aD0vZm9vOyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28ubmV0L2ZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIkVmVyc2lvbj0xOyBmb289YmFyIikKKworICAgICAgICAjIGV4cGxpY2l0IGZvby5uZXQgZnJvbSB0aHJlZS1jb21wb25lbnQgZG9tYWluIHd3dy5mb28ubmV0ICpkb2VzKiBnZXQKKyAgICAgICAgIyBzZXQsIGJlY2F1c2UgLmZvby5uZXQgZG9tYWluLW1hdGNoZXMgLmZvby5uZXQKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5mb28ubmV0L2Zvby8iLAorICAgICAgICAgICAgICAgICAgICAgICdzcGFtPWVnZ3M7IGRvbWFpbj1mb28ubmV0OyBWZXJzaW9uPSIxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5fY29va2llc1siLmZvby5uZXQiXVsiL2Zvby8iXVsic3BhbSJdLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJlZ2dzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIkVmVyc2lvbj0xOyBmb289YmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmZvby5uZXQvZm9vLyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICckVmVyc2lvbj0xOyBzcGFtPWVnZ3M7ICREb21haW49ImZvby5uZXQiJykKKworICAgICAgICAjIHRvcC1sZXZlbCBkb21haW4gaXMgdG9vIGdlbmVyYWwKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2Zvby5uZXQvIiwKKyAgICAgICAgICAgICAgICAgICAgICAnbmk9Im5pIjsgZG9tYWluPSIubmV0IjsgVmVyc2lvbj0iMSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKworICAgICAgICAjIFJGQyAyOTY1IGRvZXNuJ3QgcmVxdWlyZSBibG9ja2luZyB0aGlzCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9mb28uY28udWsvIiwKKyAgICAgICAgICAgICAgICAgICAgICAnbmFzdHk9dHJpY2s7IGRvbWFpbj0uY28udWs7IFZlcnNpb249IjEiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDMpCisKKyAgICBkZWYgdGVzdF9kb21haW5fYWxsb3coc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeSgKKyAgICAgICAgICAgIGJsb2NrZWRfZG9tYWlucz1bImFjbWUuY29tIl0sCisgICAgICAgICAgICBhbGxvd2VkX2RvbWFpbnM9WyJ3d3cuYWNtZS5jb20iXSkpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2FjbWUuY29tLyIpCisgICAgICAgIGhlYWRlcnMgPSBbIlNldC1Db29raWU6IENVU1RPTUVSPVdJTEVfRV9DT1lPVEU7IHBhdGg9LyJdCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL2FjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMCkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5jb3lvdGUuY29tLyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5jb3lvdGUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKworICAgICAgICAjIHNldCBhIGNvb2tpZSB3aXRoIG5vbi1hbGxvd2VkIGRvbWFpbi4uLgorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmNveW90ZS5jb20vIikKKyAgICAgICAgY29va2llcyA9IGMubWFrZV9jb29raWVzKHJlcywgcmVxKQorICAgICAgICBjLnNldF9jb29raWUoY29va2llc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDIpCisgICAgICAgICMgLi4uIGFuZCBjaGVjayBpcyBkb2Vzbid0IGdldCByZXR1cm5lZAorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCByZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisKKyAgICBkZWYgdGVzdF9kb21haW5fYmxvY2soc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgcG9sID0gRGVmYXVsdENvb2tpZVBvbGljeSgKKyAgICAgICAgICAgIHJmYzI5NjU9VHJ1ZSwgYmxvY2tlZF9kb21haW5zPVsiLmFjbWUuY29tIl0pCisgICAgICAgIGMgPSBDb29raWVKYXIocG9saWN5PXBvbCkKKyAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vIl0KKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDApCisKKyAgICAgICAgcCA9IHBvbC5zZXRfYmxvY2tlZF9kb21haW5zKFsiYWNtZS5jb20iXSkKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAxKQorCisgICAgICAgIGMuY2xlYXIoKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5yb2FkcnVubmVyLm5ldC8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cucm9hZHJ1bm5lci5uZXQvIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpIGFuZAorICAgICAgICAgICAgICAgICAgICAgIHJlcS5oYXNfaGVhZGVyKCJDb29raWUyIikpKQorCisgICAgICAgIGMuY2xlYXIoKQorICAgICAgICBwb2wuc2V0X2Jsb2NrZWRfZG9tYWlucyhbIi5hY21lLmNvbSJdKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisKKyAgICAgICAgIyBzZXQgYSBjb29raWUgd2l0aCBibG9ja2VkIGRvbWFpbi4uLgorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjb29raWVzID0gYy5tYWtlX2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgIGMuc2V0X2Nvb2tpZShjb29raWVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKyAgICAgICAgIyAuLi4gYW5kIGNoZWNrIGlzIGRvZXNuJ3QgZ2V0IHJldHVybmVkCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKworICAgIGRlZiB0ZXN0X3NlY3VyZShzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGZvciBucyBpbiBUcnVlLCBGYWxzZToKKyAgICAgICAgICAgIGZvciB3aGl0ZXNwYWNlIGluICIgIiwgIiI6CisgICAgICAgICAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgICAgICAgICAgaWYgbnM6CisgICAgICAgICAgICAgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgaW50ID0gaW50ZXJhY3RfbmV0c2NhcGUKKyAgICAgICAgICAgICAgICAgICAgdnMgPSAiIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorICAgICAgICAgICAgICAgICAgICBpbnQgPSBpbnRlcmFjdF8yOTY1CisgICAgICAgICAgICAgICAgICAgIHZzID0gIjsgVmVyc2lvbj0xIgorICAgICAgICAgICAgICAgIGMuc2V0X3BvbGljeShwb2wpCisgICAgICAgICAgICAgICAgdXJsID0gImh0dHA6Ly93d3cuYWNtZS5jb20vIgorICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28xPWJhciVzJXMiICUgKHZzLCB3aGl0ZXNwYWNlKSkKKyAgICAgICAgICAgICAgICBpbnQoYywgdXJsLCAiZm9vMj1iYXIlczsgc2VjdXJlJXMiICUgICh2cywgd2hpdGVzcGFjZSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICBub3QgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMSJdLnNlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgIm5vbi1zZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgc2VjdXJlIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgICAgIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbzIiXS5zZWN1cmUsCisgICAgICAgICAgICAgICAgICAgICJzZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgbm9uLXNlY3VyZSIpCisKKyAgICBkZWYgdGVzdF9xdW90ZV9jb29raWVfdmFsdWUoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsIHInZm9vPVxiImEicjsgVmVyc2lvbj0xJykKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLCByJyRWZXJzaW9uPTE7IGZvbz1cXGJcImFcInInKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maW5hbF9zbGFzaChzZWxmKToKKyAgICAgICAgIyBNaXNzaW5nIHNsYXNoIGZyb20gcmVxdWVzdCBVUkwncyBhYnNfcGF0aCBzaG91bGQgYmUgYXNzdW1lZCBwcmVzZW50LgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbSIKKyAgICAgICAgYyA9IENvb2tpZUphcihEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkpCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAiZm9vPWJhcjsgVmVyc2lvbj0xIikKKyAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAxKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKKworICAgIGRlZiB0ZXN0X2RvbWFpbl9taXJyb3Ioc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIkRvbWFpbiIsIGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgImFic2VudCBkb21haW4gcmV0dXJuZWQgd2l0aCBkb21haW4gcHJlc2VudCIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49LmJhci5jb20nKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJyREb21haW49Ii5iYXIuY29tIicsIGgsICJkb21haW4gbm90IHJldHVybmVkIikKKworICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKKyAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCisgICAgICAgICMgbm90ZSBtaXNzaW5nIGluaXRpYWwgZG90IGluIERvbWFpbgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49YmFyLmNvbScpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJERvbWFpbj0iYmFyLmNvbSInLCBoLCAiZG9tYWluIG5vdCByZXR1cm5lZCIpCisKKyAgICBkZWYgdGVzdF9wYXRoX21pcnJvcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiUGF0aCIsIGgsICJhYnNlbnQgcGF0aCByZXR1cm5lZCB3aXRoIHBhdGggcHJlc2VudCIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQYXRoPS8nKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJyRQYXRoPSIvIicsIGgsICJwYXRoIG5vdCByZXR1cm5lZCIpCisKKyAgICBkZWYgdGVzdF9wb3J0X21pcnJvcihzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHBvbCA9IERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKQorCisgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiUG9ydCIsIGgsICJhYnNlbnQgcG9ydCByZXR1cm5lZCB3aXRoIHBvcnQgcHJlc2VudCIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgInNwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0IikKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKCJcJFBvcnQoW149XXwkKSIsIGgpLAorICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBubyB2YWx1ZSBub3QgcmV0dXJuZWQgd2l0aCBubyB2YWx1ZSIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0PSI4MCInKQorICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJyRQb3J0PSI4MCInLCBoLAorICAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggc2luZ2xlIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIHNpbmdsZSB2YWx1ZSIpCisKKyAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCisgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0PSI4MCw4MDgwIicpCisgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJFBvcnQ9IjgwLDgwODAiJywgaCwKKyAgICAgICAgICAgICAgICAgICAgICAicG9ydCB3aXRoIG11bHRpcGxlIHZhbHVlcyBub3QgcmV0dXJuZWQgd2l0aCBtdWx0aXBsZSAiCisgICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyIpCisKKyAgICBkZWYgdGVzdF9ub19yZXR1cm5fY29tbWVudChzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgJworICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50PSJkb2VzIGFueWJvZHkgcmVhZCB0aGVzZT8iOyAnCisgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnRVUkw9Imh0dHA6Ly9mb28uYmFyLm5ldC9jb21tZW50Lmh0bWwiJykKKyAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICAiQ29tbWVudCIgbm90IGluIGgsCisgICAgICAgICAgICAiQ29tbWVudCBvciBDb21tZW50VVJMIGNvb2tpZS1hdHRyaWJ1dGVzIHJldHVybmVkIHRvIHNlcnZlciIpCisKKyAgICBkZWYgdGVzdF9Db29raWVfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIENvb2tpZSwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGNzID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKyAgICAgICAgIyBhZGQgc29tZSByYW5kb20gY29va2llcworICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL2JsYWguc3BhbS5vcmcvIiwgJ2Zvbz1lZ2dzOyBWZXJzaW9uPTE7ICcKKyAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudD0iZG9lcyBhbnlib2R5IHJlYWQgdGhlc2U/IjsgJworICAgICAgICAgICAgICAgICAgICAgICdDb21tZW50VVJMPSJodHRwOi8vZm9vLmJhci5uZXQvY29tbWVudC5odG1sIicpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGNzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoLyIsICJzcGFtPWJhcjsgc2VjdXJlIikKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjcywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC8iLAorICAgICAgICAgICAgICAgICAgICAgICJmb289YmFyOyBzZWN1cmU7IFZlcnNpb249MSIpCisgICAgICAgIGludGVyYWN0XzI5NjUoY3MsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vPWJhcjsgcGF0aD0vOyBWZXJzaW9uPTEiKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGNzLCAiaHR0cDovL3d3dy5zb2wubm8iLAorICAgICAgICAgICAgICAgICAgICAgIHInYmFuZz13YWxsb3A7IHZlcnNpb249MTsgZG9tYWluPSIuc29sLm5vIjsgJworICAgICAgICAgICAgICAgICAgICAgIHIncG9ydD0iOTAsMTAwLCA4MCw4MDgwIjsgJworICAgICAgICAgICAgICAgICAgICAgIHInbWF4LWFnZT0xMDA7IENvbW1lbnQgPSAiSnVzdCBraWRkaW5nISAoXCJ8XFxcXCkgIicpCisKKyAgICAgICAgdmVyc2lvbnMgPSBbMSwgMSwgMSwgMCwgMV0KKyAgICAgICAgbmFtZXMgPSBbImJhbmciLCAiZm9vIiwgImZvbyIsICJzcGFtIiwgImZvbyJdCisgICAgICAgIGRvbWFpbnMgPSBbIi5zb2wubm8iLCAiYmxhaC5zcGFtLm9yZyIsICJ3d3cuYWNtZS5jb20iLAorICAgICAgICAgICAgICAgICAgICJ3d3cuYWNtZS5jb20iLCAid3d3LmFjbWUuY29tIl0KKyAgICAgICAgcGF0aHMgPSBbIi8iLCAiLyIsICIvIiwgIi9ibGFoIiwgIi9ibGFoLyJdCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNCk6CisgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgZm9yIGMgaW4gY3M6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGMsIENvb2tpZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMudmVyc2lvbiwgdmVyc2lvbnNbaV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm5hbWUsIG5hbWVzW2ldKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5kb21haW4sIGRvbWFpbnNbaV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnBhdGgsIHBhdGhzW2ldKQorICAgICAgICAgICAgICAgIGkgPSBpICsgMQorCisgICAgZGVmIHRlc3RfcGFyc2VfbnNfaGVhZGVycyhzZWxmKToKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IHBhcnNlX25zX2hlYWRlcnMKKworICAgICAgICAjIG1pc3NpbmcgZG9tYWluIHZhbHVlIChpbnZhbGlkIGNvb2tpZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcnNlX25zX2hlYWRlcnMoWyJmb289YmFyOyBwYXRoPS87IGRvbWFpbiJdKSwKKyAgICAgICAgICAgIFtbKCJmb28iLCAiYmFyIiksCisgICAgICAgICAgICAgICgicGF0aCIsICIvIiksICgiZG9tYWluIiwgTm9uZSksICgidmVyc2lvbiIsICIwIildXQorICAgICAgICAgICAgKQorICAgICAgICAjIGludmFsaWQgZXhwaXJlcyB2YWx1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcGFyc2VfbnNfaGVhZGVycyhbImZvbz1iYXI7IGV4cGlyZXM9Rm9vIEJhciAxMiAzMzoyMjoxMSAyMDAwIl0pLAorICAgICAgICAgICAgW1soImZvbyIsICJiYXIiKSwgKCJleHBpcmVzIiwgTm9uZSksICgidmVyc2lvbiIsICIwIildXQorICAgICAgICAgICAgKQorICAgICAgICAjIG1pc3NpbmcgY29va2llIHZhbHVlICh2YWxpZCBjb29raWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJzZV9uc19oZWFkZXJzKFsiZm9vIl0pLAorICAgICAgICAgICAgW1soImZvbyIsIE5vbmUpLCAoInZlcnNpb24iLCAiMCIpXV0KKyAgICAgICAgICAgICkKKyAgICAgICAgIyBzaG91bGRuJ3QgYWRkIHZlcnNpb24gaWYgaGVhZGVyIGlzIGVtcHR5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VfbnNfaGVhZGVycyhbIiJdKSwgW10pCisKKyAgICBkZWYgdGVzdF9iYWRfY29va2llX2hlYWRlcihzZWxmKToKKworICAgICAgICBkZWYgY29va2llamFyX2Zyb21fY29va2llX2hlYWRlcnMoaGVhZGVycyk6CisgICAgICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisgICAgICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFJlcXVlc3QKKyAgICAgICAgICAgIGMgPSBDb29raWVKYXIoKQorICAgICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQorICAgICAgICAgICAgciA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5leGFtcGxlLmNvbS8iKQorICAgICAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMociwgcmVxKQorICAgICAgICAgICAgcmV0dXJuIGMKKworICAgICAgICAjIG5vbmUgb2YgdGhlc2UgYmFkIGhlYWRlcnMgc2hvdWxkIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSByYWlzZWQKKyAgICAgICAgZm9yIGhlYWRlcnMgaW4gWworICAgICAgICAgICAgWyJTZXQtQ29va2llOiAiXSwgICMgYWN0dWFsbHksIG5vdGhpbmcgd3Jvbmcgd2l0aCB0aGlzCisgICAgICAgICAgICBbIlNldC1Db29raWUyOiAiXSwgICMgZGl0dG8KKyAgICAgICAgICAgICMgbWlzc2luZyBkb21haW4gdmFsdWUKKyAgICAgICAgICAgIFsiU2V0LUNvb2tpZTI6IGE9Zm9vOyBwYXRoPS87IFZlcnNpb249MTsgZG9tYWluIl0sCisgICAgICAgICAgICAjIGJhZCBtYXgtYWdlCisgICAgICAgICAgICBbIlNldC1Db29raWU6IGI9Zm9vOyBtYXgtYWdlPW9vcHMiXSwKKyAgICAgICAgICAgICMgYmFkIHZlcnNpb24KKyAgICAgICAgICAgIFsiU2V0LUNvb2tpZTogYj1mb287IHZlcnNpb249c3BhbSJdLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGMgPSBjb29raWVqYXJfZnJvbV9jb29raWVfaGVhZGVycyhoZWFkZXJzKQorICAgICAgICAgICAgIyB0aGVzZSBiYWQgY29va2llcyBzaG91bGRuJ3QgYmUgc2V0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMCkKKworICAgICAgICAjIGNvb2tpZSB3aXRoIGludmFsaWQgZXhwaXJlcyBpcyB0cmVhdGVkIGFzIHNlc3Npb24gY29va2llCisgICAgICAgIGhlYWRlcnMgPSBbIlNldC1Db29raWU6IGM9Zm9vOyBleHBpcmVzPUZvbyBCYXIgMTIgMzM6MjI6MTEgMjAwMCJdCisgICAgICAgIGMgPSBjb29raWVqYXJfZnJvbV9jb29raWVfaGVhZGVycyhoZWFkZXJzKQorICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuZXhhbXBsZS5jb20iXVsiLyJdWyJjIl0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS5leHBpcmVzIGlzIE5vbmUpCisKKworY2xhc3MgTFdQQ29va2llVGVzdHMoVGVzdENhc2UpOgorICAgICMgVGVzdHMgdGFrZW4gZnJvbSBsaWJ3d3ctcGVybCwgd2l0aCBhIGZldyBtb2RpZmljYXRpb25zIGFuZCBhZGRpdGlvbnMuCisKKyAgICBkZWYgdGVzdF9uZXRzY2FwZV9leGFtcGxlXzEoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgIyBGaXJzdCB3ZSBjaGVjayB0aGF0IGl0IHdvcmtzIGZvciB0aGUgb3JpZ2luYWwgZXhhbXBsZSBhdAorICAgICAgICAjIGh0dHA6Ly93d3cubmV0c2NhcGUuY29tL25ld3NyZWYvc3RkL2Nvb2tpZV9zcGVjLmh0bWwKKworICAgICAgICAjIENsaWVudCByZXF1ZXN0cyBhIGRvY3VtZW50LCBhbmQgcmVjZWl2ZXMgaW4gdGhlIHJlc3BvbnNlOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vOyBleHBpcmVzPVdlZG5lc2RheSwgMDktTm92LTk5IDIzOjEyOjQwIEdNVAorICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFCisgICAgICAgICMKKyAgICAgICAgIyBDbGllbnQgcmVxdWVzdHMgYSBkb2N1bWVudCwgYW5kIHJlY2VpdmVzIGluIHRoZSByZXNwb25zZToKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8KKyAgICAgICAgIworICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi8iIG9uIHRoaXMgc2VydmVyLCBpdCBzZW5kczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIENvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKKyAgICAgICAgIworICAgICAgICAjIENsaWVudCByZWNlaXZlczoKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mbworICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiLyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMQorICAgICAgICAjCisgICAgICAgICMgV2hlbiBjbGllbnQgcmVxdWVzdHMgYSBVUkwgaW4gcGF0aCAiL2ZvbyIgb24gdGhpcyBzZXJ2ZXIsIGl0IHNlbmRzOgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llOiBDVVNUT01FUj1XSUxFX0VfQ09ZT1RFOyBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMTsgU0hJUFBJTkc9RkVERVgKKyAgICAgICAgIworICAgICAgICAjIFRoZSBsYXN0IENvb2tpZSBpcyBidWdneSwgYmVjYXVzZSBib3RoIHNwZWNpZmljYXRpb25zIHNheSB0aGF0IHRoZQorICAgICAgICAjIG1vc3Qgc3BlY2lmaWMgY29va2llIG11c3QgYmUgc2VudCBmaXJzdC4gIFNISVBQSU5HPUZFREVYIGlzIHRoZQorICAgICAgICAjIG1vc3Qgc3BlY2lmaWMgYW5kIHNob3VsZCB0aHVzIGJlIGZpcnN0LgorCisgICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQorCisgICAgICAgIGhlYWRlcnMgPSBbXQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1ID0gVHJ1ZSkpCisKKyAgICAgICAgI3JlcSA9IFJlcXVlc3QoImh0dHA6Ly8xLjEuMS4xLyIsCisgICAgICAgICMgICAgICAgICAgICAgIGhlYWRlcnM9eyJIb3N0IjogInd3dy5hY21lLmNvbTo4MCJ9KQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tOjgwLyIsCisgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17Ikhvc3QiOiAid3d3LmFjbWUuY29tOjgwIn0pCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoCisgICAgICAgICAgICAiU2V0LUNvb2tpZTogQ1VTVE9NRVI9V0lMRV9FX0NPWU9URTsgcGF0aD0vIDsgIgorICAgICAgICAgICAgImV4cGlyZXM9V2VkbmVzZGF5LCAwOS1Ob3YtJWQgMjM6MTI6NDAgR01UIiAlIHllYXJfcGx1c19vbmUpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpLCAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIkNvb2tpZTIiKSwgJyRWZXJzaW9uPSIxIicpCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoIlNldC1Db29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxOyBwYXRoPS8iKQorICAgICAgICByZXMgPSBGYWtlUmVzcG9uc2UoaGVhZGVycywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vYmFyIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQorICAgICAgICBzZWxmLmFzc2VydEluKCJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIsIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiLCBoKQorCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCdTZXQtQ29va2llOiBTSElQUElORz1GRURFWDsgcGF0aD0vZm9vJykKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tIikKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiwgaCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIsIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIlNISVBQSU5HPUZFREVYIiwgaCkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8iKQorICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKKworICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiwgaCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIsIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLnN0YXJ0c3dpdGgoIlNISVBQSU5HPUZFREVYOyIpKQorCisgICAgZGVmIHRlc3RfbmV0c2NhcGVfZXhhbXBsZV8yKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorCisgICAgICAgICMgU2Vjb25kIEV4YW1wbGUgdHJhbnNhY3Rpb24gc2VxdWVuY2U6CisgICAgICAgICMKKyAgICAgICAgIyBBc3N1bWUgYWxsIG1hcHBpbmdzIGZyb20gYWJvdmUgaGF2ZSBiZWVuIGNsZWFyZWQuCisgICAgICAgICMKKyAgICAgICAgIyBDbGllbnQgcmVjZWl2ZXM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMTsgcGF0aD0vCisgICAgICAgICMKKyAgICAgICAgIyBXaGVuIGNsaWVudCByZXF1ZXN0cyBhIFVSTCBpbiBwYXRoICIvIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IFBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxCisgICAgICAgICMKKyAgICAgICAgIyBDbGllbnQgcmVjZWl2ZXM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7IHBhdGg9L2FtbW8KKyAgICAgICAgIworICAgICAgICAjIFdoZW4gY2xpZW50IHJlcXVlc3RzIGEgVVJMIGluIHBhdGggIi9hbW1vIiBvbiB0aGlzIHNlcnZlciwgaXQgc2VuZHM6CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBDb29raWU6IFBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMzsgUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDEKKyAgICAgICAgIworICAgICAgICAjICAgICAgIE5PVEU6IFRoZXJlIGFyZSB0d28gbmFtZS92YWx1ZSBwYWlycyBuYW1lZCAiUEFSVF9OVU1CRVIiIGR1ZSB0bworICAgICAgICAjICAgICAgIHRoZSBpbmhlcml0YW5jZSBvZiB0aGUgIi8iIG1hcHBpbmcgaW4gYWRkaXRpb24gdG8gdGhlICIvYW1tbyIgbWFwcGluZy4KKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgaGVhZGVycyA9IFtdCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9Uk9DS0VUX0xBVU5DSEVSXzAwMDE7IHBhdGg9LyIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iKQorCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIpCisKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoCisgICAgICAgICAgICAiU2V0LUNvb2tpZTogUEFSVF9OVU1CRVI9UklESU5HX1JPQ0tFVF8wMDIzOyBwYXRoPS9hbW1vIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly93d3cuYWNtZS5jb20vYW1tbyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gociJQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7XHMqIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKSkKKworICAgIGRlZiB0ZXN0X2lldGZfZXhhbXBsZV8xKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CisgICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICMgVGhlbiB3ZSB0ZXN0IHdpdGggdGhlIGV4YW1wbGVzIGZyb20gZHJhZnQtaWV0Zi1odHRwLXN0YXRlLW1hbi1tZWMtMDMudHh0CisgICAgICAgICMKKyAgICAgICAgIyA1LiAgRVhBTVBMRVMKKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKworICAgICAgICAjCisgICAgICAgICMgNS4xICBFeGFtcGxlIDEKKyAgICAgICAgIworICAgICAgICAjIE1vc3QgZGV0YWlsIG9mIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGhlYWRlcnMgaGFzIGJlZW4gb21pdHRlZC4gIEFzc3VtZQorICAgICAgICAjIHRoZSB1c2VyIGFnZW50IGhhcyBubyBzdG9yZWQgY29va2llcy4KKyAgICAgICAgIworICAgICAgICAjICAgMS4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL2xvZ2luIEhUVFAvMS4xCisgICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KKyAgICAgICAgIworICAgICAgICAjICAgICAgIFVzZXIgaWRlbnRpZmllcyBzZWxmIHZpYSBhIGZvcm0uCisgICAgICAgICMKKyAgICAgICAgIyAgIDIuICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAorICAgICAgICAjCisgICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCisgICAgICAgICMgICAgICAgU2V0LUNvb2tpZTI6IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgICAgICAgQ29va2llIHJlZmxlY3RzIHVzZXIncyBpZGVudGl0eS4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9sb2dpbicsCisgICAgICAgICAgICAnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb29raWUpCisKKyAgICAgICAgIworICAgICAgICAjICAgMy4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL3BpY2tpdGVtIEhUVFAvMS4xCisgICAgICAgICMgICAgICAgQ29va2llOiAkVmVyc2lvbj0iMSI7IEN1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgJFBhdGg9Ii9hY21lIgorICAgICAgICAjICAgICAgIFtmb3JtIGRhdGFdCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBVc2VyIHNlbGVjdHMgYW4gaXRlbSBmb3IgYGBzaG9wcGluZyBiYXNrZXQuJycKKyAgICAgICAgIworICAgICAgICAjICAgNC4gIFNlcnZlciAtPiBVc2VyIEFnZW50CisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBIVFRQLzEuMSAyMDAgT0sKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llMjogUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICAgICAgICBQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFNob3BwaW5nIGJhc2tldCBjb250YWlucyBhbiBpdGVtLgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9waWNraXRlbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpOworICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKAorICAgICAgICAgICAgcideXCRWZXJzaW9uPSI/MSI/OyBDdXN0b21lcj0iP1dJTEVfRV9DT1lPVEUiPzsgXCRQYXRoPSIvYWNtZSIkJywKKyAgICAgICAgICAgIGNvb2tpZSkpCisKKyAgICAgICAgIworICAgICAgICAjICAgNS4gIFVzZXIgQWdlbnQgLT4gU2VydmVyCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBQT1NUIC9hY21lL3NoaXBwaW5nIEhUVFAvMS4xCisgICAgICAgICMgICAgICAgQ29va2llOiAkVmVyc2lvbj0iMSI7CisgICAgICAgICMgICAgICAgICAgICAgICBDdXN0b21lcj0iV0lMRV9FX0NPWU9URSI7ICRQYXRoPSIvYWNtZSI7CisgICAgICAgICMgICAgICAgICAgICAgICBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyAkUGF0aD0iL2FjbWUiCisgICAgICAgICMgICAgICAgW2Zvcm0gZGF0YV0KKyAgICAgICAgIworICAgICAgICAjICAgICAgIFVzZXIgc2VsZWN0cyBzaGlwcGluZyBtZXRob2QgZnJvbSBmb3JtLgorICAgICAgICAjCisgICAgICAgICMgICA2LiAgU2VydmVyIC0+IFVzZXIgQWdlbnQKKyAgICAgICAgIworICAgICAgICAjICAgICAgIEhUVFAvMS4xIDIwMCBPSworICAgICAgICAjICAgICAgIFNldC1Db29raWUyOiBTaGlwcGluZz0iRmVkRXgiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBOZXcgY29va2llIHJlZmxlY3RzIHNoaXBwaW5nIG1ldGhvZC4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvc2hpcHBpbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTaGlwcGluZz0iRmVkRXgiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJykKKworICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKHInXlwkVmVyc2lvbj0iPzEiPzsnLCBjb29raWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKHInUGFydF9OdW1iZXI9Ij9Sb2NrZXRfTGF1bmNoZXJfMDAwMSI/OycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXHMqXCRQYXRoPSJcL2FjbWUiJywgY29va2llKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyJ0N1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/O1xzKlwkUGF0aD0iXC9hY21lIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llKSkKKworICAgICAgICAjCisgICAgICAgICMgICA3LiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKKyAgICAgICAgIworICAgICAgICAjICAgICAgIFBPU1QgL2FjbWUvcHJvY2VzcyBIVFRQLzEuMQorICAgICAgICAjICAgICAgIENvb2tpZTogJFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgICAgICAgQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyAkUGF0aD0iL2FjbWUiOworICAgICAgICAjICAgICAgICAgICAgICAgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIjsKKyAgICAgICAgIyAgICAgICAgICAgICAgIFNoaXBwaW5nPSJGZWRFeCI7ICRQYXRoPSIvYWNtZSIKKyAgICAgICAgIyAgICAgICBbZm9ybSBkYXRhXQorICAgICAgICAjCisgICAgICAgICMgICAgICAgVXNlciBjaG9vc2VzIHRvIHByb2Nlc3Mgb3JkZXIuCisgICAgICAgICMKKyAgICAgICAgIyAgIDguICBTZXJ2ZXIgLT4gVXNlciBBZ2VudAorICAgICAgICAjCisgICAgICAgICMgICAgICAgSFRUUC8xLjEgMjAwIE9LCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBUcmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvcHJvY2VzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgIHJlLnNlYXJjaChyJ1NoaXBwaW5nPSI/RmVkRXgiPztccypcJFBhdGg9IlwvYWNtZSInLCBjb29raWUpIGFuZAorICAgICAgICAgICAgIldJTEVfRV9DT1lPVEUiIGluIGNvb2tpZSkKKworICAgICAgICAjCisgICAgICAgICMgVGhlIHVzZXIgYWdlbnQgbWFrZXMgYSBzZXJpZXMgb2YgcmVxdWVzdHMgb24gdGhlIG9yaWdpbiBzZXJ2ZXIsIGFmdGVyCisgICAgICAgICMgZWFjaCBvZiB3aGljaCBpdCByZWNlaXZlcyBhIG5ldyBjb29raWUuICBBbGwgdGhlIGNvb2tpZXMgaGF2ZSB0aGUgc2FtZQorICAgICAgICAjIFBhdGggYXR0cmlidXRlIGFuZCAoZGVmYXVsdCkgZG9tYWluLiAgQmVjYXVzZSB0aGUgcmVxdWVzdCBVUkxzIGFsbCBoYXZlCisgICAgICAgICMgL2FjbWUgYXMgYSBwcmVmaXgsIGFuZCB0aGF0IG1hdGNoZXMgdGhlIFBhdGggYXR0cmlidXRlLCBlYWNoIHJlcXVlc3QKKyAgICAgICAgIyBjb250YWlucyBhbGwgdGhlIGNvb2tpZXMgcmVjZWl2ZWQgc28gZmFyLgorCisgICAgZGVmIHRlc3RfaWV0Zl9leGFtcGxlXzIoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICAjIDUuMiAgRXhhbXBsZSAyCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhlIGVmZmVjdCBvZiB0aGUgUGF0aCBhdHRyaWJ1dGUuICBBbGwgZGV0YWlsCisgICAgICAgICMgb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaGVhZGVycyBoYXMgYmVlbiBvbWl0dGVkLiAgQXNzdW1lIHRoZSB1c2VyIGFnZW50CisgICAgICAgICMgaGFzIG5vIHN0b3JlZCBjb29raWVzLgorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorCisgICAgICAgICMgSW1hZ2luZSB0aGUgdXNlciBhZ2VudCBoYXMgcmVjZWl2ZWQsIGluIHJlc3BvbnNlIHRvIGVhcmxpZXIgcmVxdWVzdHMsCisgICAgICAgICMgdGhlIHJlc3BvbnNlIGhlYWRlcnMKKyAgICAgICAgIworICAgICAgICAjIFNldC1Db29raWUyOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsKKyAgICAgICAgIyAgICAgICAgIFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgYW5kCisgICAgICAgICMKKyAgICAgICAgIyBTZXQtQ29va2llMjogUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7IFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgUGF0aD0iL2FjbWUvYW1tbyIKKworICAgICAgICBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9hbW1vL3NwZWNpZmljIiwKKyAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJywKKyAgICAgICAgICAgICdQYXJ0X051bWJlcj0iUmlkaW5nX1JvY2tldF8wMDIzIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lL2FtbW8iJykKKworICAgICAgICAjIEEgc3Vic2VxdWVudCByZXF1ZXN0IGJ5IHRoZSB1c2VyIGFnZW50IHRvIHRoZSAoc2FtZSkgc2VydmVyIGZvciBVUkxzIG9mCisgICAgICAgICMgdGhlIGZvcm0gL2FjbWUvYW1tby8uLi4gIHdvdWxkIGluY2x1ZGUgdGhlIGZvbGxvd2luZyByZXF1ZXN0IGhlYWRlcjoKKyAgICAgICAgIworICAgICAgICAjIENvb2tpZTogJFZlcnNpb249IjEiOworICAgICAgICAjICAgICAgICAgUGFydF9OdW1iZXI9IlJpZGluZ19Sb2NrZXRfMDAyMyI7ICRQYXRoPSIvYWNtZS9hbW1vIjsKKyAgICAgICAgIyAgICAgICAgIFBhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICRQYXRoPSIvYWNtZSIKKyAgICAgICAgIworICAgICAgICAjIE5vdGUgdGhhdCB0aGUgTkFNRT1WQUxVRSBwYWlyIGZvciB0aGUgY29va2llIHdpdGggdGhlIG1vcmUgc3BlY2lmaWMgUGF0aAorICAgICAgICAjIGF0dHJpYnV0ZSwgL2FjbWUvYW1tbywgY29tZXMgYmVmb3JlIHRoZSBvbmUgd2l0aCB0aGUgbGVzcyBzcGVjaWZpYyBQYXRoCisgICAgICAgICMgYXR0cmlidXRlLCAvYWNtZS4gIEZ1cnRoZXIgbm90ZSB0aGF0IHRoZSBzYW1lIGNvb2tpZSBuYW1lIGFwcGVhcnMgbW9yZQorICAgICAgICAjIHRoYW4gb25jZS4KKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvYW1tby8uLi4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICByZS5zZWFyY2gociJSaWRpbmdfUm9ja2V0XzAwMjMuKlJvY2tldF9MYXVuY2hlcl8wMDAxIiwgY29va2llKSkKKworICAgICAgICAjIEEgc3Vic2VxdWVudCByZXF1ZXN0IGJ5IHRoZSB1c2VyIGFnZW50IHRvIHRoZSAoc2FtZSkgc2VydmVyIGZvciBhIFVSTCBvZgorICAgICAgICAjIHRoZSBmb3JtIC9hY21lL3BhcnRzLyB3b3VsZCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgcmVxdWVzdCBoZWFkZXI6CisgICAgICAgICMKKyAgICAgICAgIyBDb29raWU6ICRWZXJzaW9uPSIxIjsgUGFydF9OdW1iZXI9IlJvY2tldF9MYXVuY2hlcl8wMDAxIjsgJFBhdGg9Ii9hY21lIgorICAgICAgICAjCisgICAgICAgICMgSGVyZSwgdGhlIHNlY29uZCBjb29raWUncyBQYXRoIGF0dHJpYnV0ZSAvYWNtZS9hbW1vIGlzIG5vdCBhIHByZWZpeCBvZgorICAgICAgICAjIHRoZSByZXF1ZXN0IFVSTCwgL2FjbWUvcGFydHMvLCBzbyB0aGUgY29va2llIGRvZXMgbm90IGdldCBmb3J3YXJkZWQgdG8KKyAgICAgICAgIyB0aGUgc2VydmVyLgorCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wYXJ0cy8iKQorICAgICAgICBzZWxmLmFzc2VydEluKCJSb2NrZXRfTGF1bmNoZXJfMDAwMSIsIGNvb2tpZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiUmlkaW5nX1JvY2tldF8wMDIzIiwgY29va2llKQorCisgICAgZGVmIHRlc3RfcmVqZWN0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmVqZWN0aW9uIG9mIFNldC1Db29raWUyIHJlc3BvbnNlcyBiYXNlZCBvbiBkb21haW4sIHBhdGgsIHBvcnQuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBEZWZhdWx0Q29va2llUG9saWN5LCBMV1BDb29raWVKYXIKKworICAgICAgICBwb2wgPSBEZWZhdWx0Q29va2llUG9saWN5KHJmYzI5NjU9VHJ1ZSkKKworICAgICAgICBjID0gTFdQQ29va2llSmFyKHBvbGljeT1wb2wpCisKKyAgICAgICAgbWF4X2FnZSA9ICJtYXgtYWdlPTM2MDAiCisKKyAgICAgICAgIyBpbGxlZ2FsIGRvbWFpbiAobm8gZW1iZWRkZWQgZG90cykKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj0iLmNvbSI7IHZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYykKKworICAgICAgICAjIGxlZ2FsIGRvbWFpbgorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGluZz1wb25nOyBkb21haW49ImFjbWUuY29tIjsgdmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisKKyAgICAgICAgIyBpbGxlZ2FsIGRvbWFpbiAoaG9zdCBwcmVmaXggInd3dy5hIiBjb250YWlucyBhIGRvdCkKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hLmFjbWUuY29tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hpej1iYW5nOyBkb21haW49ImFjbWUuY29tIjsgdmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDEpCisKKyAgICAgICAgIyBsZWdhbCBkb21haW4KKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hLmFjbWUuY29tIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd293PWZsdXR0ZXI7IGRvbWFpbj0iLmEuYWNtZS5jb20iOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKworICAgICAgICAjIGNhbid0IHBhcnRpYWxseSBtYXRjaCBhbiBJUC1hZGRyZXNzCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly8xMjUuMTI1LjEyNS4xMjUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd6enp6PXBpbmc7IGRvbWFpbj0iMTI1LjEyNS4xMjUiOyB2ZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKworICAgICAgICAjIGlsbGVnYWwgcGF0aCAobXVzdCBiZSBwcmVmaXggb2YgcmVxdWVzdCBwYXRoKQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LnNvbC5ubyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JsYWg9cmh1YmFyYjsgZG9tYWluPSIuc29sLm5vIjsgcGF0aD0iL2ZvbyI7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyc2lvbj0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDIpCisKKyAgICAgICAgIyBsZWdhbCBwYXRoCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vL2Zvby9iYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiaW5nPWJvbmc7IGRvbWFpbj0iLnNvbC5ubyI7IHBhdGg9Ii9mb28iOyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAzKQorCisgICAgICAgICMgaWxsZWdhbCBwb3J0IChyZXF1ZXN0LXBvcnQgbm90IGluIGxpc3QpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hpej1mZmZ0OyBkb21haW49Ii5zb2wubm8iOyBwb3J0PSI5MCwxMDAiOyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcnNpb249MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCAzKQorCisgICAgICAgICMgbGVnYWwgcG9ydAorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgIHInYmFuZz13YWxsb3A7IHZlcnNpb249MTsgZG9tYWluPSIuc29sLm5vIjsgJworICAgICAgICAgICAgcidwb3J0PSI5MCwxMDAsIDgwLDgwODAiOyAnCisgICAgICAgICAgICByJ21heC1hZ2U9MTAwOyBDb21tZW50ID0gIkp1c3Qga2lkZGluZyEgKFwifFxcXFwpICInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgNCkKKworICAgICAgICAjIHBvcnQgYXR0cmlidXRlIHdpdGhvdXQgYW55IHZhbHVlIChjdXJyZW50IHBvcnQpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuc29sLm5vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vOT1iYXI7IHZlcnNpb249MTsgZG9tYWluPSIuc29sLm5vIjsgcG9ydDsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYXgtYWdlPTEwMDsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgNSkKKworICAgICAgICAjIGVuY29kZWQgcGF0aAorICAgICAgICAjIExXUCBoYXMgdGhpcyB0ZXN0LCBidXQgdW5lc2NhcGluZyBhbGxvd2VkIHBhdGggY2hhcmFjdGVycyBzZWVtcworICAgICAgICAjIGxpa2UgYSBiYWQgaWRlYSwgc28gSSB0aGluayB0aGlzIHNob3VsZCBmYWlsOgorIyMgICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LnNvbC5uby9mb28vIiwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgcidmb284PWJhcjsgdmVyc2lvbj0xOyBwYXRoPSIvJTY2b28iJykKKyAgICAgICAgIyBidXQgdGhpcyBpcyBPSywgYmVjYXVzZSAnPCcgaXMgbm90IGFuIGFsbG93ZWQgSFRUUCBVUkwgcGF0aAorICAgICAgICAjIGNoYXJhY3RlcjoKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5zb2wubm8vPG9vLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidmb284PWJhcjsgdmVyc2lvbj0xOyBwYXRoPSIvJTNjb28iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIDYpCisKKyAgICAgICAgIyBzYXZlIGFuZCByZXN0b3JlCisgICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGMuc2F2ZShmaWxlbmFtZSwgaWdub3JlX2Rpc2NhcmQ9VHJ1ZSkKKyAgICAgICAgICAgIG9sZCA9IHJlcHIoYykKKworICAgICAgICAgICAgYyA9IExXUENvb2tpZUphcihwb2xpY3k9cG9sKQorICAgICAgICAgICAgYy5sb2FkKGZpbGVuYW1lLCBpZ25vcmVfZGlzY2FyZD1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OiBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2xkLCByZXByKGMpKQorCisgICAgZGVmIHRlc3RfdXJsX2VuY29kaW5nKHNlbGYpOgorICAgICAgICAjIFRyeSBzb21lIFVSTCBlbmNvZGluZ3Mgb2YgdGhlIFBBVEhzLgorICAgICAgICAjICh0aGUgYmVoYXZpb3VyIGhlcmUgaGFzIGNoYW5nZWQgZnJvbSBsaWJ3d3ctcGVybCkKKyAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIGMgPSBDb29raWVKYXIoRGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyUyZiUyNS8lM2MlM2MlMEFuZXclRTUvJUU1IiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vICA9ICAgYmFyOyB2ZXJzaW9uICAgID0gICAxIikKKworICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KAorICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1Lzw8JTBhbmV35S/m+OUiLAorICAgICAgICAgICAgJ2Jhcj1iYXo7IHBhdGg9Ii9mb28vIjsgdmVyc2lvbj0xJyk7CisgICAgICAgIHZlcnNpb25fcmUgPSByZS5jb21waWxlKHInXlwkdmVyc2lvbj1cIj8xXCI/JywgcmUuSSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJmb289YmFyIiBpbiBjb29raWUgYW5kIHZlcnNpb25fcmUuc2VhcmNoKGNvb2tpZSkpCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKKyAgICAgICAgICAgIGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2Zvby8lMjUvPDwlMGFuZXflL+b45SIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llKQorCisgICAgICAgICMgdW5pY29kZSBVUkwgZG9lc24ndCByYWlzZSBleGNlcHRpb24KKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCB1Imh0dHA6Ly93d3cuYWNtZS5jb20vXHhmYyIpCisKKyAgICBkZWYgdGVzdF9tb3ppbGxhKHNlbGYpOgorICAgICAgICAjIFNhdmUgLyBsb2FkIE1vemlsbGEvTmV0c2NhcGUgY29va2llIGZpbGUgZm9ybWF0LgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgTW96aWxsYUNvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQorCisgICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQorCisgICAgICAgIGZpbGVuYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorCisgICAgICAgIGMgPSBNb3ppbGxhQ29va2llSmFyKGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3k9RGVmYXVsdENvb2tpZVBvbGljeShyZmMyOTY1PVRydWUpKQorICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgImZvbzE9YmFyOyBtYXgtYWdlPTEwMDsgVmVyc2lvbj0xIikKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgcG9ydD0iODAiOyBtYXgtYWdlPTEwMDsgRGlzY2FyZDsgVmVyc2lvbj0xJykKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAiZm9vMz1iYXI7IHNlY3VyZTsgVmVyc2lvbj0xIikKKworICAgICAgICBleHBpcmVzID0gImV4cGlyZXM9MDktTm92LSVkIDIzOjEyOjQwIEdNVCIgJSAoeWVhcl9wbHVzX29uZSwpCisgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmZvby5jb20vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvb2E9YmFyOyAlcyIgJSBleHBpcmVzKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28uY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29iPWJhcjsgRG9tYWluPS5mb28uY29tOyAlcyIgJSBleHBpcmVzKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5mb28uY29tLyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmb29jPWJhcjsgRG9tYWluPXd3dy5mb28uY29tOyAlcyIgJSBleHBpcmVzKQorCisgICAgICAgIGRlZiBzYXZlX2FuZF9yZXN0b3JlKGNqLCBpZ25vcmVfZGlzY2FyZCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2ouc2F2ZShpZ25vcmVfZGlzY2FyZD1pZ25vcmVfZGlzY2FyZCkKKyAgICAgICAgICAgICAgICBuZXdfYyA9IE1vemlsbGFDb29raWVKYXIoZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKyAgICAgICAgICAgICAgICBuZXdfYy5sb2FkKGlnbm9yZV9kaXNjYXJkPWlnbm9yZV9kaXNjYXJkKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6IG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjogcGFzcworICAgICAgICAgICAgcmV0dXJuIG5ld19jCisKKyAgICAgICAgbmV3X2MgPSBzYXZlX2FuZF9yZXN0b3JlKGMsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5ld19jKSwgNikgICMgbm9uZSBkaXNjYXJkZWQKKyAgICAgICAgc2VsZi5hc3NlcnRJbigibmFtZT0nZm9vMScsIHZhbHVlPSdiYXInIiwgcmVwcihuZXdfYykpCisKKyAgICAgICAgbmV3X2MgPSBzYXZlX2FuZF9yZXN0b3JlKGMsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuZXdfYyksIDQpICAjIDIgb2YgdGhlbSBkaXNjYXJkZWQgb24gc2F2ZQorICAgICAgICBzZWxmLmFzc2VydEluKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciLCByZXByKG5ld19jKSkKKworICAgIGRlZiB0ZXN0X25ldHNjYXBlX21pc2Moc2VsZik6CisgICAgICAgICMgU29tZSBhZGRpdGlvbmFsIE5ldHNjYXBlIGNvb2tpZXMgdGVzdHMuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgYyA9IENvb2tpZUphcigpCisgICAgICAgIGhlYWRlcnMgPSBbXQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZm9vLmJhci5hY21lLmNvbS9mb28iKQorCisgICAgICAgICMgTmV0c2NhcGUgYWxsb3dzIGEgaG9zdCBwYXJ0IHRoYXQgY29udGFpbnMgZG90cworICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogQ3VzdG9tZXI9V0lMRV9FX0NPWU9URTsgZG9tYWluPS5hY21lLmNvbSIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICAjIGFuZCB0aGF0IHRoZSBkb21haW4gaXMgdGhlIHNhbWUgYXMgdGhlIGhvc3Qgd2l0aG91dCBhZGRpbmcgYSBsZWFkaW5nCisgICAgICAgICMgZG90IHRvIHRoZSBkb21haW4uICBTaG91bGQgbm90IHF1b3RlIGV2ZW4gaWYgc3RyYW5nZSBjaGFycyBhcmUgdXNlZAorICAgICAgICAjIGluIHRoZSBjb29raWUgdmFsdWUuCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBQQVJUX05VTUJFUj0zLDQ7IGRvbWFpbj1mb28uYmFyLmFjbWUuY29tIikKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICJodHRwOi8vd3d3LmFjbWUuY29tL2ZvbyIpCisgICAgICAgIGMuZXh0cmFjdF9jb29raWVzKHJlcywgcmVxKQorCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9mb28uYmFyLmFjbWUuY29tL2ZvbyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICAiUEFSVF9OVU1CRVI9Myw0IiBpbiByZXEuZ2V0X2hlYWRlcigiQ29va2llIikgYW5kCisgICAgICAgICAgICAiQ3VzdG9tZXI9V0lMRV9FX0NPWU9URSIgaW4gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKQorCisgICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc18yOTY1KHNlbGYpOgorICAgICAgICAjIFRlc3QgaGFuZGxpbmcgb2YgbG9jYWwgaW50cmFuZXQgaG9zdG5hbWVzIHdpdGhvdXQgYSBkb3QuCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NT1UcnVlKSkKKyAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vMT1iYXI7IFBPUlQ7IERpc2NhcmQ7IFZlcnNpb249MTsiKQorICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmb28yPWJhcjsgZG9tYWluPSIubG9jYWwiOyBWZXJzaW9uPTEnKQorICAgICAgICBzZWxmLmFzc2VydEluKCJmb28xPWJhciIsIGNvb2tpZSkKKworICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iLCAnZm9vMz1iYXI7IFZlcnNpb249MScpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly9leGFtcGxlLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZvbzI9YmFyIiwgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKKworICAgIGRlZiB0ZXN0X2ludHJhbmV0X2RvbWFpbnNfbnMoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKworICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NSA9IEZhbHNlKSkKKyAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9leGFtcGxlLyIsICJmb28xPWJhciIpCisgICAgICAgIGNvb2tpZSA9IGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vZXhhbXBsZS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vMj1iYXI7IGRvbWFpbj0ubG9jYWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vMT1iYXIiLCBjb29raWUpCisKKyAgICAgICAgY29va2llID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly9leGFtcGxlLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZvbzI9YmFyIiwgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMikKKworICAgIGRlZiB0ZXN0X2VtcHR5X3BhdGgoc2VsZik6CisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIsIERlZmF1bHRDb29raWVQb2xpY3kKKyAgICAgICAgZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0CisKKyAgICAgICAgIyBUZXN0IGZvciBlbXB0eSBwYXRoCisgICAgICAgICMgQnJva2VuIHdlYi1zZXJ2ZXIgT1JJT04vMS4zLjM4IHJldHVybnMgdG8gdGhlIGNsaWVudCByZXNwb25zZSBsaWtlCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICBTZXQtQ29va2llOiBKU0VTU0lPTklEPUFCQ0RFUkFORE9NMTIzOyBQYXRoPQorICAgICAgICAjCisgICAgICAgICMgaWUuIHdpdGggUGF0aCBzZXQgdG8gbm90aGluZy4KKyAgICAgICAgIyBJbiB0aGlzIGNhc2UsIGV4dHJhY3RfY29va2llcygpIG11c3Qgc2V0IGNvb2tpZSB0byAvIChyb290KQorICAgICAgICBjID0gQ29va2llSmFyKERlZmF1bHRDb29raWVQb2xpY3kocmZjMjk2NSA9IFRydWUpKQorICAgICAgICBoZWFkZXJzID0gW10KKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tLyIpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBKU0VTU0lPTklEPUFCQ0RFUkFORE9NMTIzOyBQYXRoPSIpCisgICAgICAgIHJlcyA9IEZha2VSZXNwb25zZShoZWFkZXJzLCAiaHR0cDovL3d3dy5hbnRzLmNvbS8iKQorICAgICAgICBjLmV4dHJhY3RfY29va2llcyhyZXMsIHJlcSkKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LmFudHMuY29tLyIpCisgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJKU0VTU0lPTklEPUFCQ0RFUkFORE9NMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llMiIpLCAnJFZlcnNpb249IjEiJykKKworICAgICAgICAjIG1pc3NpbmcgcGF0aCBpbiB0aGUgcmVxdWVzdCBVUkkKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hbnRzLmNvbTo4MDgwIikKKyAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiQ29va2llIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkpTRVNTSU9OSUQ9QUJDREVSQU5ET00xMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaGVhZGVyKCJDb29raWUyIiksICckVmVyc2lvbj0iMSInKQorCisgICAgZGVmIHRlc3Rfc2Vzc2lvbl9jb29raWVzKHNlbGYpOgorICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyCisgICAgICAgIGZyb20gdXJsbGliMiBpbXBvcnQgUmVxdWVzdAorCisgICAgICAgIHllYXJfcGx1c19vbmUgPSB0aW1lLmxvY2FsdGltZSgpWzBdICsgMQorCisgICAgICAgICMgQ2hlY2sgc2Vzc2lvbiBjb29raWVzIGFyZSBkZWxldGVkIHByb3Blcmx5IGJ5CisgICAgICAgICMgQ29va2llSmFyLmNsZWFyX3Nlc3Npb25fY29va2llcyBtZXRob2QKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCdodHRwOi8vd3d3LnBlcmxtZWlzdGVyLmNvbS9zY3JpcHRzJykKKyAgICAgICAgaGVhZGVycyA9IFtdCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBzMT1zZXNzaW9uO1BhdGg9L3NjcmlwdHMiKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogcDE9cGVybTsgRG9tYWluPS5wZXJsbWVpc3Rlci5jb207IgorICAgICAgICAgICAgICAgICAgICAgICAiUGF0aD0vO2V4cGlyZXM9RnJpLCAwMi1GZWItJWQgMjM6MjQ6MjAgR01UIiAlCisgICAgICAgICAgICAgICAgICAgICAgIHllYXJfcGx1c19vbmUpCisgICAgICAgIGhlYWRlcnMuYXBwZW5kKCJTZXQtQ29va2llOiBwMj1wZXJtO1BhdGg9LztleHBpcmVzPUZyaSwgIgorICAgICAgICAgICAgICAgICAgICAgICAiMDItRmViLSVkIDIzOjI0OjIwIEdNVCIgJSB5ZWFyX3BsdXNfb25lKQorICAgICAgICBoZWFkZXJzLmFwcGVuZCgiU2V0LUNvb2tpZTogczI9c2Vzc2lvbjtQYXRoPS9zY3JpcHRzOyIKKyAgICAgICAgICAgICAgICAgICAgICAgIkRvbWFpbj0ucGVybG1laXN0ZXIuY29tIikKKyAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWUyOiBzMz1zZXNzaW9uO1ZlcnNpb249MTtEaXNjYXJkO1BhdGg9Ii8iJykKKyAgICAgICAgcmVzID0gRmFrZVJlc3BvbnNlKGhlYWRlcnMsICdodHRwOi8vd3d3LnBlcmxtZWlzdGVyLmNvbS9zY3JpcHRzJykKKworICAgICAgICBjID0gQ29va2llSmFyKCkKKyAgICAgICAgYy5leHRyYWN0X2Nvb2tpZXMocmVzLCByZXEpCisgICAgICAgICMgSG93IG1hbnkgc2Vzc2lvbi9wZXJtYW5lbnQgY29va2llcyBkbyB3ZSBoYXZlPworICAgICAgICBjb3VudGVyID0geyJzZXNzaW9uX2FmdGVyIjogMCwKKyAgICAgICAgICAgICAgICAgICAicGVybV9hZnRlciI6IDAsCisgICAgICAgICAgICAgICAgICAgInNlc3Npb25fYmVmb3JlIjogMCwKKyAgICAgICAgICAgICAgICAgICAicGVybV9iZWZvcmUiOiAwfQorICAgICAgICBmb3IgY29va2llIGluIGM6CisgICAgICAgICAgICBrZXkgPSAiJXNfYmVmb3JlIiAlIGNvb2tpZS52YWx1ZQorICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQorICAgICAgICBjLmNsZWFyX3Nlc3Npb25fY29va2llcygpCisgICAgICAgICMgSG93IG1hbnkgbm93PworICAgICAgICBmb3IgY29va2llIGluIGM6CisgICAgICAgICAgICBrZXkgPSAiJXNfYWZ0ZXIiICUgY29va2llLnZhbHVlCisgICAgICAgICAgICBjb3VudGVyW2tleV0gPSBjb3VudGVyW2tleV0gKyAxCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoCisgICAgICAgICAgICAjIGEgcGVybWFuZW50IGNvb2tpZSBnb3QgbG9zdCBhY2NpZGVudGFsbHkKKyAgICAgICAgICAgIGNvdW50ZXJbInBlcm1fYWZ0ZXIiXSAhPSBjb3VudGVyWyJwZXJtX2JlZm9yZSJdIG9yCisgICAgICAgICAgICAjIGEgc2Vzc2lvbiBjb29raWUgaGFzbid0IGJlZW4gY2xlYXJlZAorICAgICAgICAgICAgY291bnRlclsic2Vzc2lvbl9hZnRlciJdICE9IDAgb3IKKyAgICAgICAgICAgICMgd2UgZGlkbid0IGhhdmUgc2Vzc2lvbiBjb29raWVzIGluIHRoZSBmaXJzdCBwbGFjZQorICAgICAgICAgICAgY291bnRlclsic2Vzc2lvbl9iZWZvcmUiXSA9PSAwKSkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgRGF0ZVRpbWVUZXN0cywKKyAgICAgICAgSGVhZGVyVGVzdHMsCisgICAgICAgIENvb2tpZVRlc3RzLAorICAgICAgICBGaWxlQ29va2llSmFyVGVzdHMsCisgICAgICAgIExXUENvb2tpZVRlc3RzLAorICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWVsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDQwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWVsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nvb2tpZWxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWVsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMDQwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb29raWVsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjRmMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5LnB5CkBAIC0wLDAgKzEsNzEyIEBACisiIiJVbml0IHRlc3RzIGZvciB0aGUgY29weSBtb2R1bGUuIiIiCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgY29weV9yZWcKK2ltcG9ydCB3ZWFrcmVmCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgVGVzdENvcHkodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBBdHRlbXB0IGZ1bGwgbGluZSBjb3ZlcmFnZSBvZiBjb3B5LnB5IGZyb20gdG9wIHRvIGJvdHRvbQorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHkuRXJyb3IgaXMgY29weS5lcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoY29weS5FcnJvciwgRXhjZXB0aW9uKSkKKworICAgICMgVGhlIGNvcHkoKSBtZXRob2QKKworICAgIGRlZiB0ZXN0X2NvcHlfYmFzaWMoc2VsZik6CisgICAgICAgIHggPSA0MgorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKworICAgIGRlZiB0ZXN0X2NvcHlfY29weShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2NvcHlfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gQyhzZWxmLmZvbykKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9fY2xhc3NfXywgeC5fX2NsYXNzX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5mb28sIHguZm9vKQorCisgICAgZGVmIHRlc3RfY29weV9yZWdpc3RyeShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBmb28pOgorICAgICAgICAgICAgICAgIG9iaiA9IG9iamVjdC5fX25ld19fKGNscykKKyAgICAgICAgICAgICAgICBvYmouZm9vID0gZm9vCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICBkZWYgcGlja2xlX0Mob2JqKToKKyAgICAgICAgICAgIHJldHVybiAoQywgKG9iai5mb28sKSkKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29weS5jb3B5LCB4KQorICAgICAgICBjb3B5X3JlZy5waWNrbGUoQywgcGlja2xlX0MsIEMpCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfcmVkdWNlX2V4KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90byk6CisgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgInNob3VsZG4ndCBjYWxsIHRoaXMiCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQorCisgICAgZGVmIHRlc3RfY29weV9yZWR1Y2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICB4ID0gQygpCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfY2FudChzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCJfX3JlZHVjZSIpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQorICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQorICAgICAgICB4ID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNvcHkuRXJyb3IsIGNvcHkuY29weSwgeCkKKworICAgICMgVHlwZS1zcGVjaWZpYyBfY29weV94eHgoKSBtZXRob2RzCisKKyAgICBkZWYgdGVzdF9jb3B5X2F0b21pYyhzZWxmKToKKyAgICAgICAgY2xhc3MgQ2xhc3NpYzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTmV3U3R5bGUob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdGVzdHMgPSBbTm9uZSwgNDIsIDJMKioxMDAsIDMuMTQsIFRydWUsIEZhbHNlLCAxaiwKKyAgICAgICAgICAgICAgICAgImhlbGxvIiwgdSJoZWxsb1x1MTIzNCIsIGYuZnVuY19jb2RlLAorICAgICAgICAgICAgICAgICBOZXdTdHlsZSwgeHJhbmdlKDEwKSwgQ2xhc3NpYywgbWF4XQorICAgICAgICBmb3IgeCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3B5LmNvcHkoeCkgaXMgeCwgcmVwcih4KSkKKworICAgIGRlZiB0ZXN0X2NvcHlfbGlzdChzZWxmKToKKyAgICAgICAgeCA9IFsxLCAyLCAzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weSh4KSwgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfdHVwbGUoc2VsZik6CisgICAgICAgIHggPSAoMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5LmNvcHkoeCksIHgpCisKKyAgICBkZWYgdGVzdF9jb3B5X2RpY3Qoc2VsZik6CisgICAgICAgIHggPSB7ImZvbyI6IDEsICJiYXIiOiAyfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weSh4KSwgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfaW5zdF92YW5pbGxhKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZm9vLCBvdGhlci5mb28pCisgICAgICAgIHggPSBDKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weSh4KSwgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfaW5zdF9jb3B5KHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2NvcHlfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gQyhzZWxmLmZvbykKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZm9vLCBvdGhlci5mb28pCisgICAgICAgIHggPSBDKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weSh4KSwgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfaW5zdF9nZXRpbml0YXJncyhzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19nZXRpbml0YXJnc19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi5mb28sKQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KHgpLCB4KQorCisgICAgZGVmIHRlc3RfY29weV9pbnN0X2dldHN0YXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHsiZm9vIjogc2VsZi5mb299CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmZvbywgb3RoZXIuZm9vKQorICAgICAgICB4ID0gQyg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5LmNvcHkoeCksIHgpCisKKyAgICBkZWYgdGVzdF9jb3B5X2luc3Rfc2V0c3RhdGUoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBzdGF0ZVsiZm9vIl0KKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZm9vLCBvdGhlci5mb28pCisgICAgICAgIHggPSBDKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weSh4KSwgeCkKKworICAgIGRlZiB0ZXN0X2NvcHlfaW5zdF9nZXRzdGF0ZV9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZvbworICAgICAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBzdGF0ZQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5jb3B5KHgpLCB4KQorCisgICAgIyBUaGUgZGVlcGNvcHkoKSBtZXRob2QKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2Jhc2ljKHNlbGYpOgorICAgICAgICB4ID0gNDIKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfbWVtbyhzZWxmKToKKyAgICAgICAgIyBUZXN0cyBvZiByZWZsZXhpdmUgb2JqZWN0cyBhcmUgdW5kZXIgdHlwZS1zcGVjaWZpYyBzZWN0aW9ucyBiZWxvdy4KKyAgICAgICAgIyBUaGlzIHRlc3RzIG9ubHkgcmVwZXRpdGlvbnMgb2Ygb2JqZWN0cy4KKyAgICAgICAgeCA9IFtdCisgICAgICAgIHggPSBbeCwgeF0KKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF0gaXMgbm90IHhbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5WzBdIGlzIHlbMV0pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9pc3N1YmNsYXNzKHNlbGYpOgorICAgICAgICAjIFhYWCBOb3RlOiB0aGVyZSdzIG5vIHdheSB0byB0ZXN0IHRoZSBUeXBlRXJyb3IgY29taW5nIG91dCBvZgorICAgICAgICAjIGlzc3ViY2xhc3MoKSAtLSB0aGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIGFuIGV4dGVuc2lvbgorICAgICAgICAjIG1vZHVsZSBkZWZpbmVzIGEgInR5cGUiIHRoYXQgZG9lc24ndCBmb3JtYWxseSBpbmhlcml0IGZyb20KKyAgICAgICAgIyB0eXBlLgorICAgICAgICBjbGFzcyBNZXRhKHR5cGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE1ldGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5LmRlZXBjb3B5KEMpLCBDKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfZGVlcGNvcHkoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW89Tm9uZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIEMoc2VsZi5mb28pCisgICAgICAgIHggPSBDKDQyKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX19jbGFzc19fLCB4Ll9fY2xhc3NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmZvbywgeC5mb28pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9yZWdpc3RyeShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBmb28pOgorICAgICAgICAgICAgICAgIG9iaiA9IG9iamVjdC5fX25ld19fKGNscykKKyAgICAgICAgICAgICAgICBvYmouZm9vID0gZm9vCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICBkZWYgcGlja2xlX0Mob2JqKToKKyAgICAgICAgICAgIHJldHVybiAoQywgKG9iai5mb28sKSkKKyAgICAgICAgeCA9IEMoNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29weS5kZWVwY29weSwgeCkKKyAgICAgICAgY29weV9yZWcucGlja2xlKEMsIHBpY2tsZV9DLCBDKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVkdWNlX2V4KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfZXhfXyhzZWxmLCBwcm90byk6CisgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgInNob3VsZG4ndCBjYWxsIHRoaXMiCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZHVjZShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fcmVkdWNlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2NhbnQoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgiX19yZWR1Y2UiKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkKKyAgICAgICAgeCA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjb3B5LkVycm9yLCBjb3B5LmRlZXBjb3B5LCB4KQorCisgICAgIyBUeXBlLXNwZWNpZmljIF9kZWVwY29weV94eHgoKSBtZXRob2RzCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9hdG9taWMoc2VsZik6CisgICAgICAgIGNsYXNzIENsYXNzaWM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE5ld1N0eWxlKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRlc3RzID0gW05vbmUsIDQyLCAyTCoqMTAwLCAzLjE0LCBUcnVlLCBGYWxzZSwgMWosCisgICAgICAgICAgICAgICAgICJoZWxsbyIsIHUiaGVsbG9cdTEyMzQiLCBmLmZ1bmNfY29kZSwKKyAgICAgICAgICAgICAgICAgTmV3U3R5bGUsIHhyYW5nZSgxMCksIENsYXNzaWMsIG1heF0KKyAgICAgICAgZm9yIHggaW4gdGVzdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY29weS5kZWVwY29weSh4KSBpcyB4LCByZXByKHgpKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfbGlzdChzZWxmKToKKyAgICAgICAgeCA9IFtbMSwgMl0sIDNdCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVmbGV4aXZlX2xpc3Qoc2VsZik6CisgICAgICAgIHggPSBbXQorICAgICAgICB4LmFwcGVuZCh4KQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5WzBdIGlzIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHkpLCAxKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfdHVwbGUoc2VsZik6CisgICAgICAgIHggPSAoWzEsIDJdLCAzKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXSBpcyBub3QgeVswXSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZmxleGl2ZV90dXBsZShzZWxmKToKKyAgICAgICAgeCA9IChbXSwpCisgICAgICAgIHhbMF0uYXBwZW5kKHgpCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCB5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF0gaXMgbm90IHhbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5WzBdWzBdIGlzIHkpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9kaWN0KHNlbGYpOgorICAgICAgICB4ID0geyJmb28iOiBbMSwgMl0sICJiYXIiOiAzfQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFsiZm9vIl0gaXMgbm90IHlbImZvbyJdKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVmbGV4aXZlX2RpY3Qoc2VsZik6CisgICAgICAgIHggPSB7fQorICAgICAgICB4Wydmb28nXSA9IHgKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVsnZm9vJ10gaXMgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeSksIDEpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9rZWVwYWxpdmUoc2VsZik6CisgICAgICAgIG1lbW8gPSB7fQorICAgICAgICB4ID0gNDIKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCwgbWVtbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lbW9baWQoeCldIGlzIHgpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X3ZhbmlsbGEoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoWzQyXSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9kZWVwY29weShzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19kZWVwY29weV9fKHNlbGYsIG1lbW8pOgorICAgICAgICAgICAgICAgIHJldHVybiBDKGNvcHkuZGVlcGNvcHkoc2VsZi5mb28sIG1lbW8pKQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoWzQyXSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfZ2V0aW5pdGFyZ3Moc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fZ2V0aW5pdGFyZ3NfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYuZm9vLCkKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZm9vLCBvdGhlci5mb28pCisgICAgICAgIHggPSBDKFs0Ml0pCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X2dldHN0YXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHsiZm9vIjogc2VsZi5mb299CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmZvbywgb3RoZXIuZm9vKQorICAgICAgICB4ID0gQyhbNDJdKQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9zZXRzdGF0ZShzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmb28pOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IHN0YXRlWyJmb28iXQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5mb28sIG90aGVyLmZvbykKKyAgICAgICAgeCA9IEMoWzQyXSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfZ2V0c3RhdGVfc2V0c3RhdGUoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5mb28KKyAgICAgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gc3RhdGUKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuZm9vLCBvdGhlci5mb28pCisgICAgICAgIHggPSBDKFs0Ml0pCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9yZWZsZXhpdmVfaW5zdChzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeCA9IEMoKQorICAgICAgICB4LmZvbyA9IHgKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyB5KQorCisgICAgIyBfcmVjb25zdHJ1Y3QoKQorCisgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3Rfc3RyaW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIKKyAgICAgICAgeCA9IEMoKQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCisKKyAgICBkZWYgdGVzdF9yZWNvbnN0cnVjdF9ub3N0YXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEMsICgpKQorICAgICAgICB4ID0gQygpCisgICAgICAgIHguZm9vID0gNDIKKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5fX2NsYXNzX18gaXMgeC5fX2NsYXNzX18pCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5Ll9fY2xhc3NfXyBpcyB4Ll9fY2xhc3NfXykKKworICAgIGRlZiB0ZXN0X3JlY29uc3RydWN0X3N0YXRlKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEMsICgpLCBzZWxmLl9fZGljdF9fKQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5fX2RpY3RfXywgb3RoZXIuX19kaWN0X18pCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICB4ID0gQygpCisgICAgICAgIHguZm9vID0gWzQyXQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQorCisgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3Rfc3RhdGVfc2V0c3RhdGUoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoQywgKCksIHNlbGYuX19kaWN0X18pCisgICAgICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fZGljdF9fLnVwZGF0ZShzdGF0ZSkKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYuX19kaWN0X18sIG90aGVyLl9fZGljdF9fKQorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgeCA9IEMoKQorICAgICAgICB4LmZvbyA9IFs0Ml0KKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKKworICAgIGRlZiB0ZXN0X3JlY29uc3RydWN0X3JlZmxleGl2ZShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB4ID0gQygpCisgICAgICAgIHguZm9vID0geAorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIHkpCisKKyAgICAjIEFkZGl0aW9ucyBmb3IgUHl0aG9uIDIuMyBhbmQgcGlja2xlIHByb3RvY29sIDIKKworICAgIGRlZiB0ZXN0X3JlZHVjZV80dHVwbGUoc2VsZik6CisgICAgICAgIGNsYXNzIEMobGlzdCk6CisgICAgICAgICAgICBkZWYgX19yZWR1Y2VfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKEMsICgpLCBzZWxmLl9fZGljdF9fLCBpdGVyKHNlbGYpKQorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAoY21wKGxpc3Qoc2VsZiksIGxpc3Qob3RoZXIpKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgY21wKHNlbGYuX19kaWN0X18sIG90aGVyLl9fZGljdF9fKSkKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIHggPSBDKFtbMSwgMl0sIDNdKQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIHlbMF0pCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQorCisgICAgZGVmIHRlc3RfcmVkdWNlXzV0dXBsZShzZWxmKToKKyAgICAgICAgY2xhc3MgQyhkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlZHVjZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoQywgKCksIHNlbGYuX19kaWN0X18sIE5vbmUsIHNlbGYuaXRlcml0ZW1zKCkpCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChjbXAoZGljdChzZWxmKSwgbGlzdChkaWN0KSkgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGNtcChzZWxmLl9fZGljdF9fLCBvdGhlci5fX2RpY3RfXykpCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICB4ID0gQyhbKCJmb28iLCBbMSwgMl0pLCAoImJhciIsIDMpXSkKKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFsiZm9vIl0gaXMgeVsiZm9vIl0pCisgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WyJmb28iXSBpcyBub3QgeVsiZm9vIl0pCisKKyAgICBkZWYgdGVzdF9jb3B5X3Nsb3RzKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbImZvbyJdCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeC5mb28gPSBbNDJdCisgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZm9vIGlzIHkuZm9vKQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfc2xvdHMoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiZm9vIl0KKyAgICAgICAgeCA9IEMoKQorICAgICAgICB4LmZvbyA9IFs0Ml0KKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmZvbyBpcyBub3QgeS5mb28pCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9kaWN0X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBDKGRpY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGQ9Tm9uZSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGQ6CisgICAgICAgICAgICAgICAgICAgIGQgPSB7fQorICAgICAgICAgICAgICAgIHNlbGYuX2tleXMgPSBsaXN0KGQua2V5cygpKQorICAgICAgICAgICAgICAgIGRpY3QuX19pbml0X18oc2VsZiwgZCkKKyAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIGl0ZW0pOgorICAgICAgICAgICAgICAgIGRpY3QuX19zZXRpdGVtX18oc2VsZiwga2V5LCBpdGVtKQorICAgICAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5fa2V5czoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fa2V5cy5hcHBlbmQoa2V5KQorICAgICAgICB4ID0gQyhkPXsnZm9vJzowfSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX2tleXMsIHkuX2tleXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICB4WydiYXInXSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh4LCB5KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHguX2tleXMsIHkuX2tleXMpCisKKyAgICBkZWYgdGVzdF9jb3B5X2xpc3Rfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEMobGlzdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHggPSBDKFtbMSwgMl0sIDNdKQorICAgICAgICB4LmZvbyA9IFs0LCA1XQorICAgICAgICB5ID0gY29weS5jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4KSwgbGlzdCh5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIHlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmZvbyBpcyB5LmZvbykKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2xpc3Rfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEMobGlzdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHggPSBDKFtbMSwgMl0sIDNdKQorICAgICAgICB4LmZvbyA9IFs0LCA1XQorICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCksIGxpc3QoeSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIHkuZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXSBpcyBub3QgeVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZm9vIGlzIG5vdCB5LmZvbykKKworICAgIGRlZiB0ZXN0X2NvcHlfdHVwbGVfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEModHVwbGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB4ID0gQyhbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoeCksICgxLCAyLCAzKSkKKyAgICAgICAgeSA9IGNvcHkuY29weSh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKHkpLCAoMSwgMiwgMykpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV90dXBsZV9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgQyh0dXBsZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHggPSBDKFtbMSwgMl0sIDNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKHgpLCAoWzEsIDJdLCAzKSkKKyAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSh5KSwgKFsxLCAyXSwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXSBpcyBub3QgeVswXSkKKworICAgIGRlZiB0ZXN0X2dldHN0YXRlX2V4YyhzZWxmKToKKyAgICAgICAgY2xhc3MgRXZpbFN0YXRlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJhaW4ndCBnb3Qgbm8gc3RpY2tpbicgc3RhdGUiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvcHkuY29weSwgRXZpbFN0YXRlKCkpCisKKyAgICBkZWYgdGVzdF9jb3B5X2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weShnbG9iYWxfZm9vKSwgZ2xvYmFsX2ZvbykKKyAgICAgICAgZGVmIGZvbyh4LCB5KTogcmV0dXJuIHgreQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weShmb28pLCBmb28pCisgICAgICAgIGJhciA9IGxhbWJkYTogTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuY29weShiYXIpLCBiYXIpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5LmRlZXBjb3B5KGdsb2JhbF9mb28pLCBnbG9iYWxfZm9vKQorICAgICAgICBkZWYgZm9vKHgsIHkpOiByZXR1cm4geCt5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weS5kZWVwY29weShmb28pLCBmb28pCisgICAgICAgIGJhciA9IGxhbWJkYTogTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHkuZGVlcGNvcHkoYmFyKSwgYmFyKQorCisgICAgZGVmIF9jaGVja193ZWFrcmVmKHNlbGYsIF9jb3B5KToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvYmogPSBDKCkKKyAgICAgICAgeCA9IHdlYWtyZWYucmVmKG9iaikKKyAgICAgICAgeSA9IF9jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCisgICAgICAgIGRlbCBvYmoKKyAgICAgICAgeSA9IF9jb3B5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCisKKyAgICBkZWYgdGVzdF9jb3B5X3dlYWtyZWYoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX3dlYWtyZWYoY29weS5jb3B5KQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHlfd2Vha3JlZihzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfd2Vha3JlZihjb3B5LmRlZXBjb3B5KQorCisgICAgZGVmIF9jaGVja19jb3B5X3dlYWtkaWN0KHNlbGYsIF9kaWN0dHlwZSk6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSwgYiwgYywgZCA9IFtDKCkgZm9yIGkgaW4geHJhbmdlKDQpXQorICAgICAgICB1ID0gX2RpY3R0eXBlKCkKKyAgICAgICAgdVthXSA9IGIKKyAgICAgICAgdVtjXSA9IGQKKyAgICAgICAgdiA9IGNvcHkuY29weSh1KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHYgaXMgdSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZbYV0sIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodltjXSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIDIpCisgICAgICAgIGRlbCBjLCBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpLCAxKQorICAgICAgICB4LCB5ID0gQygpLCBDKCkKKyAgICAgICAgIyBUaGUgdW5kZXJseWluZyBjb250YWluZXJzIGFyZSBkZWNvdXBsZWQKKyAgICAgICAgdlt4XSA9IHkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbih4LCB1KQorCisgICAgZGVmIHRlc3RfY29weV93ZWFra2V5ZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfY29weV93ZWFrZGljdCh3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KQorCisgICAgZGVmIHRlc3RfY29weV93ZWFrdmFsdWVkaWN0KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19jb3B5X3dlYWtkaWN0KHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3dlYWtrZXlkaWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgc2VsZi5pID0gaQorICAgICAgICBhLCBiLCBjLCBkID0gW0MoaSkgZm9yIGkgaW4geHJhbmdlKDQpXQorICAgICAgICB1ID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSgpCisgICAgICAgIHVbYV0gPSBiCisgICAgICAgIHVbY10gPSBkCisgICAgICAgICMgS2V5cyBhcmVuJ3QgY29waWVkLCB2YWx1ZXMgYXJlCisgICAgICAgIHYgPSBjb3B5LmRlZXBjb3B5KHUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodiwgdSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodlthXSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHZbY10gaXMgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2W2FdLmksIGIuaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2W2NdLmksIGQuaSkKKyAgICAgICAgZGVsIGMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIDEpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV93ZWFrdmFsdWVkaWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgc2VsZi5pID0gaQorICAgICAgICBhLCBiLCBjLCBkID0gW0MoaSkgZm9yIGkgaW4geHJhbmdlKDQpXQorICAgICAgICB1ID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKKyAgICAgICAgdVthXSA9IGIKKyAgICAgICAgdVtjXSA9IGQKKyAgICAgICAgIyBLZXlzIGFyZSBjb3BpZWQsIHZhbHVlcyBhcmVuJ3QKKyAgICAgICAgdiA9IGNvcHkuZGVlcGNvcHkodSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2LCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSwgMikKKyAgICAgICAgKHgsIHkpLCAoeiwgdCkgPSBzb3J0ZWQodi5pdGVtcygpLCBrZXk9bGFtYmRhIHBhaXI6IHBhaXJbMF0uaSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4IGlzIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5pLCBhLmkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeiBpcyBjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHouaSwgYy5pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodCBpcyBkKQorICAgICAgICBkZWwgeCwgeSwgeiwgdAorICAgICAgICBkZWwgZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2KSwgMSkKKworICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2JvdW5kX21ldGhvZChzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgbShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGYgPSBGb28oKQorICAgICAgICBmLmIgPSBmLm0KKyAgICAgICAgZyA9IGNvcHkuZGVlcGNvcHkoZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm0sIGcuYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGcuYi5pbV9zZWxmIGlzIGcpCisgICAgICAgIGcuYigpCisKKworZGVmIGdsb2JhbF9mb28oeCwgeSk6IHJldHVybiB4K3kKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdENvcHkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiZGQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiZGQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY29weV9yZWcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkYjhiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5CkBAIC0wLDAgKzEsMTIxIEBACitpbXBvcnQgY29weV9yZWcKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnBpY2tsZXRlc3RlciBpbXBvcnQgRXh0ZW5zaW9uU2F2ZXIKKworY2xhc3MgQzoKKyAgICBwYXNzCisKKworY2xhc3MgV2l0aG91dFNsb3RzKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBXaXRoV2Vha3JlZihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgnX193ZWFrcmVmX18nLCkKKworY2xhc3MgV2l0aFByaXZhdGUob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAoJ19fc3BhbScsKQorCitjbGFzcyBXaXRoU2luZ2xlU3RyaW5nKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ3NwYW0nCisKK2NsYXNzIFdpdGhJbmhlcml0ZWQoV2l0aFNpbmdsZVN0cmluZyk6CisgICAgX19zbG90c19fID0gKCdlZ2dzJywpCisKKworY2xhc3MgQ29weVJlZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvcHlfcmVnLnBpY2tsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQywgTm9uZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vbmNhbGxhYmxlX3JlZHVjZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3B5X3JlZy5waWNrbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoMSksICJub3QgYSBjYWxsYWJsZSIpCisKKyAgICBkZWYgdGVzdF9ub25jYWxsYWJsZV9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb3B5X3JlZy5waWNrbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUoMSksIGludCwgIm5vdCBhIGNhbGxhYmxlIikKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgY29weS5jb3B5KFRydWUpKQorCisgICAgZGVmIHRlc3RfZXh0ZW5zaW9uX3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBtb2QsIGZ1bmMsIGNvZGUgPSAnanVuazEgJywgJyBqdW5rMicsIDB4YWJjZAorICAgICAgICBlID0gRXh0ZW5zaW9uU2F2ZXIoY29kZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBTaG91bGRuJ3QgYmUgaW4gcmVnaXN0cnkgbm93LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weV9yZWcucmVtb3ZlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZCwgZnVuYywgY29kZSkKKyAgICAgICAgICAgIGNvcHlfcmVnLmFkZF9leHRlbnNpb24obW9kLCBmdW5jLCBjb2RlKQorICAgICAgICAgICAgIyBTaG91bGQgYmUgaW4gdGhlIHJlZ2lzdHJ5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHlfcmVnLl9leHRlbnNpb25fcmVnaXN0cnlbbW9kLCBmdW5jXSA9PSBjb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHlfcmVnLl9pbnZlcnRlZF9yZWdpc3RyeVtjb2RlXSA9PSAobW9kLCBmdW5jKSkKKyAgICAgICAgICAgICMgU2hvdWxkbid0IGJlIGluIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oY29kZSwgY29weV9yZWcuX2V4dGVuc2lvbl9jYWNoZSkKKyAgICAgICAgICAgICMgUmVkdW5kYW50IHJlZ2lzdHJhdGlvbiBzaG91bGQgYmUgT0suCisgICAgICAgICAgICBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uKG1vZCwgZnVuYywgY29kZSkgICMgc2hvdWxkbid0IGJsb3cgdXAKKyAgICAgICAgICAgICMgQ29uZmxpY3RpbmcgY29kZS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvcHlfcmVnLmFkZF9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QsIGZ1bmMsIGNvZGUgKyAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weV9yZWcucmVtb3ZlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZCwgZnVuYywgY29kZSArIDEpCisgICAgICAgICAgICAjIENvbmZsaWN0aW5nIG1vZHVsZSBuYW1lLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weV9yZWcuYWRkX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZFsxOl0sIGZ1bmMsIGNvZGUgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weV9yZWcucmVtb3ZlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZFsxOl0sIGZ1bmMsIGNvZGUgKQorICAgICAgICAgICAgIyBDb25mbGljdGluZyBmdW5jdGlvbiBuYW1lLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29weV9yZWcuYWRkX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZCwgZnVuY1sxOl0sIGNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jWzE6XSwgY29kZSkKKyAgICAgICAgICAgICMgQ2FuJ3QgcmVtb3ZlIG9uZSB0aGF0IGlzbid0IHJlZ2lzdGVyZWQgYXQgYWxsLgorICAgICAgICAgICAgaWYgY29kZSArIDEgbm90IGluIGNvcHlfcmVnLl9pbnZlcnRlZF9yZWdpc3RyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZFsxOl0sIGZ1bmNbMTpdLCBjb2RlICsgMSkKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZS5yZXN0b3JlKCkKKworICAgICAgICAjIFNob3VsZG4ndCBiZSB0aGVyZSBhbnltb3JlLgorICAgICAgICBzZWxmLmFzc2VydE5vdEluKChtb2QsIGZ1bmMpLCBjb3B5X3JlZy5fZXh0ZW5zaW9uX3JlZ2lzdHJ5KQorICAgICAgICAjIFRoZSBjb2RlICptYXkqIGJlIGluIGNvcHlfcmVnLl9leHRlbnNpb25fcmVnaXN0cnksIHRob3VnaCwgaWYKKyAgICAgICAgIyB3ZSBoYXBwZW5lZCB0byBwaWNrIG9uIGEgcmVnaXN0ZXJlZCBjb2RlLiAgU28gZG9uJ3QgY2hlY2sgZm9yCisgICAgICAgICMgdGhhdC4KKworICAgICAgICAjIENoZWNrIHZhbGlkIGNvZGVzIGF0IHRoZSBsaW1pdHMuCisgICAgICAgIGZvciBjb2RlIGluIDEsIDB4N2ZmZmZmZmY6CisgICAgICAgICAgICBlID0gRXh0ZW5zaW9uU2F2ZXIoY29kZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb3B5X3JlZy5hZGRfZXh0ZW5zaW9uKG1vZCwgZnVuYywgY29kZSkKKyAgICAgICAgICAgICAgICBjb3B5X3JlZy5yZW1vdmVfZXh0ZW5zaW9uKG1vZCwgZnVuYywgY29kZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZS5yZXN0b3JlKCkKKworICAgICAgICAjIEVuc3VyZSBpbnZhbGlkIGNvZGVzIGJsb3cgdXAuCisgICAgICAgIGZvciBjb2RlIGluIC0xLCAwLCAweDgwMDAwMDAwTDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvcHlfcmVnLmFkZF9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QsIGZ1bmMsIGNvZGUpCisKKyAgICBkZWYgdGVzdF9zbG90bmFtZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29weV9yZWcuX3Nsb3RuYW1lcyhXaXRob3V0U2xvdHMpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhXZWFrcmVmKSwgW10pCisgICAgICAgIGV4cGVjdGVkID0gWydfV2l0aFByaXZhdGVfX3NwYW0nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aFByaXZhdGUpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhTaW5nbGVTdHJpbmcpLCBbJ3NwYW0nXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ2VnZ3MnLCAnc3BhbSddCisgICAgICAgIGV4cGVjdGVkLnNvcnQoKQorICAgICAgICByZXN1bHQgPSBjb3B5X3JlZy5fc2xvdG5hbWVzKFdpdGhJbmhlcml0ZWQpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvcHlSZWdUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5X3JlZy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5X3JlZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhMDhlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5X3JlZy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jb3B5X3JlZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhMDhlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NvcHlfcmVnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3BpY2tsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM3MDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3BpY2tsZS5weQpAQCAtMCwwICsxLDIzNyBAQAoraW1wb3J0IGNQaWNrbGUKK2ltcG9ydCBjU3RyaW5nSU8KK2ltcG9ydCBpbworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCAoQWJzdHJhY3RQaWNrbGVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlclVucGlja2xlck9iamVjdFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ21lbVBpY2tsZVRlc3RzKQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgY1N0cmluZ0lPTWl4aW46CisgICAgb3V0cHV0ID0gaW5wdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8KKworICAgIGRlZiBjbG9zZShzZWxmLCBmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBCeXRlc0lPTWl4aW46CisgICAgb3V0cHV0ID0gaW5wdXQgPSBpby5CeXRlc0lPCisKKyAgICBkZWYgY2xvc2Uoc2VsZiwgZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgRmlsZUlPTWl4aW46CisKKyAgICBkZWYgb3V0cHV0KHNlbGYpOgorICAgICAgICByZXR1cm4gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2IrJykKKworICAgIGRlZiBpbnB1dChzZWxmLCBkYXRhKToKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diKycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIGNsb3NlKHNlbGYsIGYpOgorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisKK2NsYXNzIGNQaWNrbGVUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzLCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kdW1wcyA9IGNQaWNrbGUuZHVtcHMKKyAgICAgICAgc2VsZi5sb2FkcyA9IGNQaWNrbGUubG9hZHMKKworICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKKyAgICBtb2R1bGUgPSBjUGlja2xlCisKK2NsYXNzIGNQaWNrbGVQaWNrbGVyVGVzdHMoQWJzdHJhY3RQaWNrbGVUZXN0cyk6CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wKToKKyAgICAgICAgZiA9IHNlbGYub3V0cHV0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IGNQaWNrbGUuUGlja2xlcihmLCBwcm90bykKKyAgICAgICAgICAgIHAuZHVtcChhcmcpCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIHJldHVybiBmLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jbG9zZShmKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgIGYgPSBzZWxmLmlucHV0KGJ1ZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IGNQaWNrbGUuVW5waWNrbGVyKGYpCisgICAgICAgICAgICByZXR1cm4gcC5sb2FkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoZikKKworICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKKworY2xhc3MgY1N0cmluZ0lPQ1BpY2tsZXJUZXN0cyhjU3RyaW5nSU9NaXhpbiwgY1BpY2tsZVBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCitjbGFzcyBCeXRlc0lPQ1BpY2tsZXJUZXN0cyhCeXRlc0lPTWl4aW4sIGNQaWNrbGVQaWNrbGVyVGVzdHMpOgorICAgIHBhc3MKKworY2xhc3MgRmlsZUlPQ1BpY2tsZXJUZXN0cyhGaWxlSU9NaXhpbiwgY1BpY2tsZVBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCisKK2NsYXNzIGNQaWNrbGVMaXN0UGlja2xlclRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMpOgorCisgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCk6CisgICAgICAgIHAgPSBjUGlja2xlLlBpY2tsZXIocHJvdG8pCisgICAgICAgIHAuZHVtcChhcmcpCisgICAgICAgIHJldHVybiBwLmdldHZhbHVlKCkKKworICAgIGRlZiBsb2FkcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGYgPSBzZWxmLmlucHV0KGFyZ3NbMF0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBjUGlja2xlLlVucGlja2xlcihmKQorICAgICAgICAgICAgcmV0dXJuIHAubG9hZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKGYpCisKKyAgICBlcnJvciA9IGNQaWNrbGUuQmFkUGlja2xlR2V0CisKK2NsYXNzIGNTdHJpbmdJT0NQaWNrbGVyTGlzdFRlc3RzKGNTdHJpbmdJT01peGluLCBjUGlja2xlTGlzdFBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCitjbGFzcyBCeXRlc0lPQ1BpY2tsZXJMaXN0VGVzdHMoQnl0ZXNJT01peGluLCBjUGlja2xlTGlzdFBpY2tsZXJUZXN0cyk6CisgICAgcGFzcworCitjbGFzcyBGaWxlSU9DUGlja2xlckxpc3RUZXN0cyhGaWxlSU9NaXhpbiwgY1BpY2tsZUxpc3RQaWNrbGVyVGVzdHMpOgorICAgIHBhc3MKKworCitjbGFzcyBjUGlja2xlRmFzdFBpY2tsZXJUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzKToKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTApOgorICAgICAgICBmID0gc2VsZi5vdXRwdXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gY1BpY2tsZS5QaWNrbGVyKGYsIHByb3RvKQorICAgICAgICAgICAgcC5mYXN0ID0gMQorICAgICAgICAgICAgcC5kdW1wKGFyZykKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsb3NlKGYpCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmID0gc2VsZi5pbnB1dChhcmdzWzBdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0gY1BpY2tsZS5VbnBpY2tsZXIoZikKKyAgICAgICAgICAgIHJldHVybiBwLmxvYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jbG9zZShmKQorCisgICAgZXJyb3IgPSBjUGlja2xlLkJhZFBpY2tsZUdldAorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2xpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlVGVzdHMudGVzdF9yZWN1cnNpdmVfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV90dXBsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQaWNrbGVUZXN0cy50ZXN0X3JlY3Vyc2l2ZV90dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZikKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV9pbnN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBpY2tsZVRlc3RzLnRlc3RfcmVjdXJzaXZlX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQaWNrbGVUZXN0cy50ZXN0X3JlY3Vyc2l2ZV9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX211bHRpKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBYnN0cmFjdFBpY2tsZVRlc3RzLnRlc3RfcmVjdXJzaXZlX211bHRpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKQorCisgICAgZGVmIHRlc3Rfbm9ucmVjdXJzaXZlX2RlZXAoc2VsZik6CisgICAgICAgICMgSWYgaXQncyBub3QgY3ljbGljLCBpdCBzaG91bGQgcGlja2xlIE9LIGV2ZW4gaWYgdGhlIG5lc3RpbmcKKyAgICAgICAgIyBkZXB0aCBleGNlZWRzIFBZX0NQSUNLTEVfRkFTVF9MSU1JVC4gIFRoYXQgaGFwcGVucyB0byBiZQorICAgICAgICAjIDUwIHRvZGF5LiAgSmFjayBKYW5zZW4gcmVwb3J0ZWQgc3RhY2sgb3ZlcmZsb3cgb24gTWFjIE9TIDkKKyAgICAgICAgIyBhdCA2NC4KKyAgICAgICAgYSA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDYwKToKKyAgICAgICAgICAgIGEgPSBbYV0KKyAgICAgICAgYiA9IHNlbGYubG9hZHMoc2VsZi5kdW1wcyhhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCitjbGFzcyBjU3RyaW5nSU9DUGlja2xlckZhc3RUZXN0cyhjU3RyaW5nSU9NaXhpbiwgY1BpY2tsZUZhc3RQaWNrbGVyVGVzdHMpOgorICAgIHBhc3MKKworY2xhc3MgQnl0ZXNJT0NQaWNrbGVyRmFzdFRlc3RzKEJ5dGVzSU9NaXhpbiwgY1BpY2tsZUZhc3RQaWNrbGVyVGVzdHMpOgorICAgIHBhc3MKKworY2xhc3MgRmlsZUlPQ1BpY2tsZXJGYXN0VGVzdHMoRmlsZUlPTWl4aW4sIGNQaWNrbGVGYXN0UGlja2xlclRlc3RzKToKKyAgICBwYXNzCisKKworY2xhc3MgY1BpY2tsZVBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cyhBYnN0cmFjdFBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cyk6CisKKyAgICBwaWNrbGVyX2NsYXNzID0gY1BpY2tsZS5QaWNrbGVyCisgICAgdW5waWNrbGVyX2NsYXNzID0gY1BpY2tsZS5VbnBpY2tsZXIKKworY2xhc3MgY1BpY2tsZUJpZ21lbVBpY2tsZVRlc3RzKEJpZ21lbVBpY2tsZVRlc3RzKToKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9MCk6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIGNQaWNrbGUuZHVtcHMoYXJnLCBwcm90bykKKworICAgIGRlZiBsb2FkcyhzZWxmLCBidWYpOgorICAgICAgICAjIElnbm9yZSBmYXN0CisgICAgICAgIHJldHVybiBjUGlja2xlLmxvYWRzKGJ1ZikKKworCitjbGFzcyBOb2RlKG9iamVjdCk6CisgICAgcGFzcworCitjbGFzcyBjUGlja2xlRGVlcFJlY3Vyc2l2ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaXNzdWUyNzAyKHNlbGYpOgorICAgICAgICAjIFRoaXMgc2hvdWxkIHJhaXNlIGEgUmVjdXJzaW9uTGltaXQgYnV0IGluIHNvbWUKKyAgICAgICAgIyBwbGF0Zm9ybXMgKEZyZWVCU0QsIHdpbjMyKSBzb21ldGltZXMgcmFpc2VzIEtleUVycm9yIGluc3RlYWQsCisgICAgICAgICMgb3IganVzdCBzaWxlbnRseSB0ZXJtaW5hdGVzIHRoZSBpbnRlcnByZXRlciAoPWNyYXNoZXMpLgorICAgICAgICBub2RlcyA9IFtOb2RlKCkgZm9yIGkgaW4gcmFuZ2UoNTAwKV0KKyAgICAgICAgZm9yIG4gaW4gbm9kZXM6CisgICAgICAgICAgICBuLmNvbm5lY3Rpb25zID0gbGlzdChub2RlcykKKyAgICAgICAgICAgIG4uY29ubmVjdGlvbnMucmVtb3ZlKG4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChBdHRyaWJ1dGVFcnJvciwgUnVudGltZUVycm9yKSwgY1BpY2tsZS5kdW1wcywgbikKKworICAgIGRlZiB0ZXN0X2lzc3VlMzE3OShzZWxmKToKKyAgICAgICAgIyBTYWZlIHRlc3QsIGJlY2F1c2UgSSBicm9rZSB0aGlzIGNhc2Ugd2hlbiBmaXhpbmcgdGhlCisgICAgICAgICMgYmVoYXZpb3VyIGZvciB0aGUgcHJldmlvdXMgdGVzdC4KKyAgICAgICAgcmVzPVtdCisgICAgICAgIGZvciB4IGluIHJhbmdlKDEsMjAwMCk6CisgICAgICAgICAgICByZXMuYXBwZW5kKGRpY3QoZG9jPXgsIHNpbWlsYXI9W10pKQorICAgICAgICBjUGlja2xlLmR1bXBzKHJlcykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgY1BpY2tsZVRlc3RzLAorICAgICAgICBjU3RyaW5nSU9DUGlja2xlclRlc3RzLAorICAgICAgICBCeXRlc0lPQ1BpY2tsZXJUZXN0cywKKyAgICAgICAgRmlsZUlPQ1BpY2tsZXJUZXN0cywKKyAgICAgICAgY1N0cmluZ0lPQ1BpY2tsZXJMaXN0VGVzdHMsCisgICAgICAgIEJ5dGVzSU9DUGlja2xlckxpc3RUZXN0cywKKyAgICAgICAgRmlsZUlPQ1BpY2tsZXJMaXN0VGVzdHMsCisgICAgICAgIGNTdHJpbmdJT0NQaWNrbGVyRmFzdFRlc3RzLAorICAgICAgICBCeXRlc0lPQ1BpY2tsZXJGYXN0VGVzdHMsCisgICAgICAgIEZpbGVJT0NQaWNrbGVyRmFzdFRlc3RzLAorICAgICAgICBjUGlja2xlRGVlcFJlY3Vyc2l2ZSwKKyAgICAgICAgY1BpY2tsZVBpY2tsZXJVbnBpY2tsZXJPYmplY3RUZXN0cywKKyAgICAgICAgY1BpY2tsZUJpZ21lbVBpY2tsZVRlc3RzLAorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3BpY2tsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjBmZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3BpY2tsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3BpY2tsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcGlja2xlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjBmZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3BpY2tsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Byb2ZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcHJvZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNmZTYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Byb2ZpbGUucHkKQEAgLTAsMCArMSwxMjcgQEAKKyIiIlRlc3Qgc3VpdGUgZm9yIHRoZSBjUHJvZmlsZSBtb2R1bGUuIiIiCisKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVEVTVEZOLCB1bmxpbmsKKworIyByaXAgb2ZmIGFsbCBpbnRlcmVzdGluZyBzdHVmZiBmcm9tIHRlc3RfcHJvZmlsZQoraW1wb3J0IGNQcm9maWxlCitmcm9tIHRlc3QudGVzdF9wcm9maWxlIGltcG9ydCBQcm9maWxlVGVzdCwgcmVnZW5lcmF0ZV9leHBlY3RlZF9vdXRwdXQKKworY2xhc3MgQ1Byb2ZpbGVUZXN0KFByb2ZpbGVUZXN0KToKKyAgICBwcm9maWxlcmNsYXNzID0gY1Byb2ZpbGUuUHJvZmlsZQorICAgIGV4cGVjdGVkX2xpc3Rfc29ydF9vdXRwdXQgPSAie21ldGhvZCAnc29ydCcgb2YgJ2xpc3QnIG9iamVjdHN9IgorCisgICAgIyBJc3N1ZSAzODk1LgorICAgIGRlZiB0ZXN0X2JhZF9jb3VudGVyX2R1cmluZ19kZWFsbG9jKHNlbGYpOgorICAgICAgICBpbXBvcnQgX2xzcHJvZgorICAgICAgICAjIE11c3QgdXNlIGEgZmlsZSBhcyBTdHJpbmdJTyBkb2Vzbid0IHRyaWdnZXIgdGhlIGJ1Zy4KKyAgICAgICAgc3lzLnN0ZGVyciA9IG9wZW4oVEVTVEZOLCAndycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9iaiA9IF9sc3Byb2YuUHJvZmlsZXIobGFtYmRhOiBpbnQpCisgICAgICAgICAgICBvYmouZW5hYmxlKCkKKyAgICAgICAgICAgIG9iaiA9IF9sc3Byb2YuUHJvZmlsZXIoMSkKKyAgICAgICAgICAgIG9iai5kaXNhYmxlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRlcnIgPSBzeXMuX19zdGRlcnJfXworICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KENQcm9maWxlVGVzdCkKKworZGVmIG1haW4oKToKKyAgICBpZiAnLXInIG5vdCBpbiBzeXMuYXJndjoKKyAgICAgICAgdGVzdF9tYWluKCkKKyAgICBlbHNlOgorICAgICAgICByZWdlbmVyYXRlX2V4cGVjdGVkX291dHB1dChfX2ZpbGVfXywgQ1Byb2ZpbGVUZXN0KQorCisKKyMgRG9uJ3QgcmVtb3ZlIHRoaXMgY29tbWVudC4gRXZlcnl0aGluZyBiZWxvdyBpdCBpcyBhdXRvLWdlbmVyYXRlZC4KKyMtLWN1dC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitDUHJvZmlsZVRlc3QuZXhwZWN0ZWRfb3V0cHV0WydwcmludF9zdGF0cyddID0gIiIiXAorICAgICAgICAgMTI2IGZ1bmN0aW9uIGNhbGxzICgxMDYgcHJpbWl0aXZlIGNhbGxzKSBpbiAxLjAwMCBzZWNvbmRzCisKKyAgIE9yZGVyZWQgYnk6IHN0YW5kYXJkIG5hbWUKKworICAgbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsIGZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbikKKyAgICAgICAgMSAgICAwLjAwMCAgICAwLjAwMCAgICAxLjAwMCAgICAxLjAwMCA8c3RyaW5nPjoxKDxtb2R1bGU+KQorICAgICAgIDI4ICAgIDAuMDI4ICAgIDAuMDAxICAgIDAuMDI4ICAgIDAuMDAxIHByb2ZpbGVlLnB5OjExMChfX2dldGF0dHJfXykKKyAgICAgICAgMSAgICAwLjI3MCAgICAwLjI3MCAgICAxLjAwMCAgICAxLjAwMCBwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykKKyAgICAgMjMvMyAgICAwLjE1MCAgICAwLjAwNyAgICAwLjE3MCAgICAwLjA1NyBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpCisgICAgICAgMjAgICAgMC4wMjAgICAgMC4wMDEgICAgMC4wMjAgICAgMC4wMDEgcHJvZmlsZWUucHk6NDgobXVsKQorICAgICAgICAyICAgIDAuMDQwICAgIDAuMDIwICAgIDAuNjAwICAgIDAuMzAwIHByb2ZpbGVlLnB5OjU1KGhlbHBlcikKKyAgICAgICAgNCAgICAwLjExNiAgICAwLjAyOSAgICAwLjEyMCAgICAwLjAzMCBwcm9maWxlZS5weTo3MyhoZWxwZXIxKQorICAgICAgICAyICAgIDAuMDAwICAgIDAuMDAwICAgIDAuMTQwICAgIDAuMDcwIHByb2ZpbGVlLnB5Ojg0KGhlbHBlcjJfaW5kaXJlY3QpCisgICAgICAgIDggICAgMC4zMTIgICAgMC4wMzkgICAgMC40MDAgICAgMC4wNTAgcHJvZmlsZWUucHk6ODgoaGVscGVyMikKKyAgICAgICAgOCAgICAwLjA2NCAgICAwLjAwOCAgICAwLjA4MCAgICAwLjAxMCBwcm9maWxlZS5weTo5OChzdWJoZWxwZXIpCisgICAgICAgMTIgICAgMC4wMDAgICAgMC4wMDAgICAgMC4wMTIgICAgMC4wMDEge2hhc2F0dHJ9CisgICAgICAgIDQgICAgMC4wMDAgICAgMC4wMDAgICAgMC4wMDAgICAgMC4wMDAge21ldGhvZCAnYXBwZW5kJyBvZiAnbGlzdCcgb2JqZWN0c30KKyAgICAgICAgMSAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCB7bWV0aG9kICdkaXNhYmxlJyBvZiAnX2xzcHJvZi5Qcm9maWxlcicgb2JqZWN0c30KKyAgICAgICAgOCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCB7cmFuZ2V9CisgICAgICAgIDQgICAgMC4wMDAgICAgMC4wMDAgICAgMC4wMDAgICAgMC4wMDAge3N5cy5leGNfaW5mb30KKworCisiIiIKK0NQcm9maWxlVGVzdC5leHBlY3RlZF9vdXRwdXRbJ3ByaW50X2NhbGxlcnMnXSA9ICIiIlwKKyAgIE9yZGVyZWQgYnk6IHN0YW5kYXJkIG5hbWUKKworRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgY2FsbGVkIGJ5Li4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuY2FsbHMgIHRvdHRpbWUgIGN1bXRpbWUKKzxzdHJpbmc+OjEoPG1vZHVsZT4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0KK3Byb2ZpbGVlLnB5OjExMChfX2dldGF0dHJfXykgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAxNiAgICAwLjAxNiAgICAwLjAxNiAgcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICAgIDAuMDEyICAgIDAuMDEyICB7aGFzYXR0cn0KK3Byb2ZpbGVlLnB5OjI1KHRlc3RmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAgMSAgICAwLjI3MCAgICAxLjAwMCAgPHN0cmluZz46MSg8bW9kdWxlPikKK3Byb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAgMSAgICAwLjAxNCAgICAwLjEzMCAgcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwLzMgICAgMC4xMzAgICAgMC4xNDcgIHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAwLjAwNiAgICAwLjA0MCAgcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkKK3Byb2ZpbGVlLnB5OjQ4KG11bCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAyMCAgICAwLjAyMCAgICAwLjAyMCAgcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKQorcHJvZmlsZWUucHk6NTUoaGVscGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICAyICAgIDAuMDQwICAgIDAuNjAwICBwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykKK3Byb2ZpbGVlLnB5OjczKGhlbHBlcjEpICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAgNCAgICAwLjExNiAgICAwLjEyMCAgcHJvZmlsZWUucHk6NTUoaGVscGVyKQorcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkgICAgICAgICAgICAgICAgICA8LSAgICAgICAyICAgIDAuMDAwICAgIDAuMTQwICBwcm9maWxlZS5weTo1NShoZWxwZXIpCitwcm9maWxlZS5weTo4OChoZWxwZXIyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIDwtICAgICAgIDYgICAgMC4yMzQgICAgMC4zMDAgIHByb2ZpbGVlLnB5OjU1KGhlbHBlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAwLjA3OCAgICAwLjEwMCAgcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkKK3Byb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAgOCAgICAwLjA2NCAgICAwLjA4MCAgcHJvZmlsZWUucHk6ODgoaGVscGVyMikKK3toYXNhdHRyfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAgNCAgICAwLjAwMCAgICAwLjAwNCAgcHJvZmlsZWUucHk6NzMoaGVscGVyMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgICAwLjAwMCAgICAwLjAwOCAgcHJvZmlsZWUucHk6ODgoaGVscGVyMikKK3ttZXRob2QgJ2FwcGVuZCcgb2YgJ2xpc3QnIG9iamVjdHN9ICAgICAgICAgICAgICAgPC0gICAgICAgNCAgICAwLjAwMCAgICAwLjAwMCAgcHJvZmlsZWUucHk6NzMoaGVscGVyMSkKK3ttZXRob2QgJ2Rpc2FibGUnIG9mICdfbHNwcm9mLlByb2ZpbGVyJyBvYmplY3RzfSAgPC0KK3tyYW5nZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC0gICAgICAgOCAgICAwLjAwMCAgICAwLjAwMCAgcHJvZmlsZWUucHk6OTgoc3ViaGVscGVyKQore3N5cy5leGNfaW5mb30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8LSAgICAgICA0ICAgIDAuMDAwICAgIDAuMDAwICBwcm9maWxlZS5weTo3MyhoZWxwZXIxKQorCisKKyIiIgorQ1Byb2ZpbGVUZXN0LmV4cGVjdGVkX291dHB1dFsncHJpbnRfY2FsbGVlcyddID0gIiIiXAorICAgT3JkZXJlZCBieTogc3RhbmRhcmQgbmFtZQorCitGdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmNhbGxzICB0b3R0aW1lICBjdW10aW1lCis8c3RyaW5nPjoxKDxtb2R1bGU+KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgIDEgICAgMC4yNzAgICAgMS4wMDAgIHByb2ZpbGVlLnB5OjI1KHRlc3RmdW5jKQorcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKSAgICAgICAgICAgICAgICAgICAgICAtPgorcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgICAgICAxICAgIDAuMDE0ICAgIDAuMTMwICBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgMC4wNDAgICAgMC42MDAgIHByb2ZpbGVlLnB5OjU1KGhlbHBlcikKK3Byb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkgICAgICAgICAgICAgICAgICAgICAgICAgLT4gICAgMjAvMyAgICAwLjEzMCAgICAwLjE0NyAgcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwICAgIDAuMDIwICAgIDAuMDIwICBwcm9maWxlZS5weTo0OChtdWwpCitwcm9maWxlZS5weTo0OChtdWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Citwcm9maWxlZS5weTo1NShoZWxwZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgIDQgICAgMC4xMTYgICAgMC4xMjAgIHByb2ZpbGVlLnB5OjczKGhlbHBlcjEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgMC4wMDAgICAgMC4xNDAgIHByb2ZpbGVlLnB5Ojg0KGhlbHBlcjJfaW5kaXJlY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYgICAgMC4yMzQgICAgMC4zMDAgIHByb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpCitwcm9maWxlZS5weTo3MyhoZWxwZXIxKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgIDQgICAgMC4wMDAgICAgMC4wMDQgIHtoYXNhdHRyfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgIDAuMDAwICAgIDAuMDAwICB7bWV0aG9kICdhcHBlbmQnIG9mICdsaXN0JyBvYmplY3RzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ICAgIDAuMDAwICAgIDAuMDAwICB7c3lzLmV4Y19pbmZvfQorcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkgICAgICAgICAgICAgICAgICAtPiAgICAgICAyICAgIDAuMDA2ICAgIDAuMDQwICBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgMC4wNzggICAgMC4xMDAgIHByb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpCitwcm9maWxlZS5weTo4OChoZWxwZXIyKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgIDggICAgMC4wNjQgICAgMC4wODAgIHByb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgICAwLjAwMCAgICAwLjAwOCAge2hhc2F0dHJ9Citwcm9maWxlZS5weTo5OChzdWJoZWxwZXIpICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICAgICAgMTYgICAgMC4wMTYgICAgMC4wMTYgIHByb2ZpbGVlLnB5OjExMChfX2dldGF0dHJfXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCAgICAwLjAwMCAgICAwLjAwMCAge3JhbmdlfQore2hhc2F0dHJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgICAgIDEyICAgIDAuMDEyICAgIDAuMDEyICBwcm9maWxlZS5weToxMTAoX19nZXRhdHRyX18pCit7bWV0aG9kICdhcHBlbmQnIG9mICdsaXN0JyBvYmplY3RzfSAgICAgICAgICAgICAgIC0+Cit7bWV0aG9kICdkaXNhYmxlJyBvZiAnX2xzcHJvZi5Qcm9maWxlcicgb2JqZWN0c30gIC0+Cit7cmFuZ2V9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Cit7c3lzLmV4Y19pbmZvfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+CisKKworIiIiCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcHJvZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcHJvZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxNDEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nwcm9maWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcHJvZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcHJvZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxNDEyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nwcm9maWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcnlwdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NyeXB0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjIwMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jcnlwdC5weQpAQCAtMCwwICsxLDE3IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2NyeXB0ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2NyeXB0JykKKworY2xhc3MgQ3J5cHRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jcnlwdChzZWxmKToKKyAgICAgICAgYyA9IGNyeXB0LmNyeXB0KCdteXBhc3N3b3JkJywgJ2FiJykKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnVGVzdCBlbmNyeXB0aW9uOiAnLCBjCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENyeXB0VGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NyeXB0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NyeXB0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZlYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3J5cHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NyeXB0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2NyeXB0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZlYjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3J5cHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2NhNWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3N2LnB5CkBAIC0wLDAgKzEsMTA3NiBAQAorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQorIyBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBjc3YgcGFja2FnZSB1bml0IHRlc3RzCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgY3N2CitpbXBvcnQgZ2MKK2ltcG9ydCBpbworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgVGVzdF9Dc3YodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIgorICAgIFRlc3QgdGhlIHVuZGVybHlpbmcgQyBjc3YgcGFyc2VyIGluIHdheXMgdGhhdCBhcmUgbm90IGFwcHJvcHJpYXRlCisgICAgZnJvbSB0aGUgaGlnaCBsZXZlbCBpbnRlcmZhY2UuIEZ1cnRoZXIgdGVzdHMgb2YgdGhpcyBuYXR1cmUgYXJlIGRvbmUKKyAgICBpbiBUZXN0RGlhbGVjdFJlZ2lzdHJ5LgorICAgICIiIgorICAgIGRlZiBfdGVzdF9hcmdfdmFsaWQoc2VsZiwgY3RvciwgYXJnKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBiYWRfYXR0ciA9IDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXIgPSAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgZGVsaW1pdGVyID0gJ1hYJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBjdG9yLCBhcmcsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgZGVsaW1pdGVyPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBkZWxpbWl0ZXI9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIHF1b3RlY2hhcj0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN0b3IsIGFyZywgbGluZXRlcm1pbmF0b3I9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsIGxpbmV0ZXJtaW5hdG9yPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLCBxdW90aW5nPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3RvciwgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9BTEwsIHF1b3RlY2hhcj0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjdG9yLCBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTCwgcXVvdGVjaGFyPU5vbmUpCisKKyAgICBkZWYgdGVzdF9yZWFkZXJfYXJnX3ZhbGlkKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2FyZ192YWxpZChjc3YucmVhZGVyLCBbXSkKKworICAgIGRlZiB0ZXN0X3dyaXRlcl9hcmdfdmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfYXJnX3ZhbGlkKGNzdi53cml0ZXIsIFN0cmluZ0lPKCkpCisKKyAgICBkZWYgX3Rlc3RfZGVmYXVsdF9hdHRycyhzZWxmLCBjdG9yLCAqYXJncyk6CisgICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpCisgICAgICAgICMgQ2hlY2sgZGVmYXVsdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICcsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kb3VibGVxdW90ZSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5lc2NhcGVjaGFyLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmxpbmV0ZXJtaW5hdG9yLCAiXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGVjaGFyLCAnIicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QucXVvdGluZywgY3N2LlFVT1RFX01JTklNQUwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc3RyaWN0LCBGYWxzZSkKKyAgICAgICAgIyBUcnkgZGVsZXRpbmcgb3IgY2hhbmdpbmcgYXR0cmlidXRlcyAodGhleSBhcmUgcmVhZC1vbmx5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGF0dHIsIG9iai5kaWFsZWN0LCAnZGVsaW1pdGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBvYmouZGlhbGVjdCwgJ2RlbGltaXRlcicsICc6JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGRlbGF0dHIsIG9iai5kaWFsZWN0LCAncXVvdGluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBvYmouZGlhbGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3F1b3RpbmcnLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmVhZGVyX2F0dHJzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2RlZmF1bHRfYXR0cnMoY3N2LnJlYWRlciwgW10pCisKKyAgICBkZWYgdGVzdF93cml0ZXJfYXR0cnMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZGVmYXVsdF9hdHRycyhjc3Yud3JpdGVyLCBTdHJpbmdJTygpKQorCisgICAgZGVmIF90ZXN0X2t3X2F0dHJzKHNlbGYsIGN0b3IsICphcmdzKToKKyAgICAgICAgIyBOb3cgdHJ5IHdpdGggYWx0ZXJuYXRlIG9wdGlvbnMKKyAgICAgICAga3dhcmdzID0gZGljdChkZWxpbWl0ZXI9JzonLCBkb3VibGVxdW90ZT1GYWxzZSwgZXNjYXBlY2hhcj0nXFwnLAorICAgICAgICAgICAgICAgICAgICAgIGxpbmV0ZXJtaW5hdG9yPSdccicsIHF1b3RlY2hhcj0nKicsCisgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgc2tpcGluaXRpYWxzcGFjZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgIHN0cmljdD1UcnVlKQorICAgICAgICBvYmogPSBjdG9yKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kZWxpbWl0ZXIsICc6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5kb3VibGVxdW90ZSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZXNjYXBlY2hhciwgJ1xcJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIlxyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90ZWNoYXIsICcqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5xdW90aW5nLCBjc3YuUVVPVEVfTk9ORSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5za2lwaW5pdGlhbHNwYWNlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnN0cmljdCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3JlYWRlcl9rd19hdHRycyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9rd19hdHRycyhjc3YucmVhZGVyLCBbXSkKKworICAgIGRlZiB0ZXN0X3dyaXRlcl9rd19hdHRycyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9rd19hdHRycyhjc3Yud3JpdGVyLCBTdHJpbmdJTygpKQorCisgICAgZGVmIF90ZXN0X2RpYWxlY3RfYXR0cnMoc2VsZiwgY3RvciwgKmFyZ3MpOgorICAgICAgICAjIE5vdyB0cnkgd2l0aCBkaWFsZWN0LWRlcml2ZWQgb3B0aW9ucworICAgICAgICBjbGFzcyBkaWFsZWN0OgorICAgICAgICAgICAgZGVsaW1pdGVyPSctJworICAgICAgICAgICAgZG91YmxlcXVvdGU9RmFsc2UKKyAgICAgICAgICAgIGVzY2FwZWNoYXI9J14nCisgICAgICAgICAgICBsaW5ldGVybWluYXRvcj0nJCcKKyAgICAgICAgICAgIHF1b3RlY2hhcj0nIycKKyAgICAgICAgICAgIHF1b3Rpbmc9Y3N2LlFVT1RFX0FMTAorICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZT1UcnVlCisgICAgICAgICAgICBzdHJpY3Q9RmFsc2UKKyAgICAgICAgYXJncyA9IGFyZ3MgKyAoZGlhbGVjdCwpCisgICAgICAgIG9iaiA9IGN0b3IoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZGVsaW1pdGVyLCAnLScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3QuZG91YmxlcXVvdGUsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LmVzY2FwZWNoYXIsICdeJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5saW5ldGVybWluYXRvciwgIiQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RlY2hhciwgJyMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5kaWFsZWN0LnF1b3RpbmcsIGNzdi5RVU9URV9BTEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouZGlhbGVjdC5zdHJpY3QsIEZhbHNlKQorCisgICAgZGVmIHRlc3RfcmVhZGVyX2RpYWxlY3RfYXR0cnMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZGlhbGVjdF9hdHRycyhjc3YucmVhZGVyLCBbXSkKKworICAgIGRlZiB0ZXN0X3dyaXRlcl9kaWFsZWN0X2F0dHJzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2RpYWxlY3RfYXR0cnMoY3N2LndyaXRlciwgU3RyaW5nSU8oKSkKKworCisgICAgZGVmIF93cml0ZV90ZXN0KHNlbGYsIGZpZWxkcywgZXhwZWN0LCAqKmt3YXJncyk6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosICoqa3dhcmdzKQorICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGZpZWxkcykKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ICsgd3JpdGVyLmRpYWxlY3QubGluZXRlcm1pbmF0b3IpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfYXJnX3ZhbGlkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3dyaXRlX3Rlc3QsIE5vbmUsICcnKQorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KCgpLCAnJykKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbTm9uZV0sICciIicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW05vbmVdLCBOb25lLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpCisgICAgICAgICMgQ2hlY2sgdGhhdCBleGNlcHRpb25zIGFyZSBwYXNzZWQgdXAgdGhlIGNoYWluCisgICAgICAgIGNsYXNzIEJhZExpc3Q6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMTA7CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgaSA+IDI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwgQmFkTGlzdCgpLCAnJykKKyAgICAgICAgY2xhc3MgQmFkSXRlbToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi5fd3JpdGVfdGVzdCwgW0JhZEl0ZW0oKV0sICcnKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfYmlnZmllbGQoc2VsZik6CisgICAgICAgICMgVGhpcyBleGVyY2lzZXMgdGhlIGJ1ZmZlciByZWFsbG9jIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogNTAwMDAKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbYmlnc3RyaW5nLGJpZ3N0cmluZ10sICclcywlcycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgKGJpZ3N0cmluZywgYmlnc3RyaW5nKSkKKworICAgIGRlZiB0ZXN0X3dyaXRlX3F1b3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSwicCxxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywxLCdwLHEnXSwgJ2EsMSxwLHEnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSwicCxxIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9NSU5JTUFMKQorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICciYSIsMSwicCxxIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05OVU1FUklDKQorICAgICAgICBzZWxmLl93cml0ZV90ZXN0KFsnYScsMSwncCxxJ10sICciYSIsIjEiLCJwLHEiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX0FMTCkKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJ2FcbmInLDFdLCAnImFcbmIiLCIxIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9BTEwpCisKKyAgICBkZWYgdGVzdF93cml0ZV9lc2NhcGUoc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSwicCxxIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsnYScsMSwncCwicSInXSwgJ2EsMSwicCxcXCJxXFwiIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVzY2FwZWNoYXI9Tm9uZSwgZG91YmxlcXVvdGU9RmFsc2UpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLCJxIiddLCAnYSwxLCJwLFxcInFcXCIiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIGRvdWJsZXF1b3RlID0gRmFsc2UpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWyciJ10sICciIiIiJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVjaGFyPSdcXCcsIHF1b3RpbmcgPSBjc3YuUVVPVEVfTUlOSU1BTCkKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX01JTklNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZSkKKyAgICAgICAgc2VsZi5fd3JpdGVfdGVzdChbJyInXSwgJ1xcIicsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3QoWydhJywxLCdwLHEnXSwgJ2EsMSxwXFwscScsCisgICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlY2hhcj0nXFwnLCBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUpCisKKyAgICBkZWYgdGVzdF93cml0ZXJvd3Moc2VsZik6CisgICAgICAgIGNsYXNzIEJyb2tlbkZpbGU6CisgICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgYnVmKToKKyAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yCisgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoQnJva2VuRmlsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBbWydhJ11dKQorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBOb25lKQorICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93cyhbWydhJywnYiddLFsnYycsJ2QnXV0pCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICJhLGJcclxuYyxkXHJcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfZmxvYXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTM1NzM6IGxvc3Mgb2YgcHJlY2lzaW9uIGJlY2F1c2UgY3N2LndyaXRlcgorICAgICAgICAjIHVzZXMgc3RyKCkgZm9yIGZsb2F0cyBpbnN0ZWFkIG9mIHJlcHIoKQorICAgICAgICBvcmlnX3JvdyA9IFsxLjIzNDU2Nzg5MDEyMywgMS4wLzcuMCwgJ2FiYyddCisgICAgICAgIGYgPSBTdHJpbmdJTygpCisgICAgICAgIGMgPSBjc3Yud3JpdGVyKGYsIHF1b3Rpbmc9Y3N2LlFVT1RFX05PTk5VTUVSSUMpCisgICAgICAgIGMud3JpdGVyb3cob3JpZ19yb3cpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBjID0gY3N2LnJlYWRlcihmLCBxdW90aW5nPWNzdi5RVU9URV9OT05OVU1FUklDKQorICAgICAgICBuZXdfcm93ID0gbmV4dChjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWdfcm93LCBuZXdfcm93KQorCisgICAgZGVmIF9yZWFkX3Rlc3Qoc2VsZiwgaW5wdXQsIGV4cGVjdCwgKiprd2FyZ3MpOgorICAgICAgICByZWFkZXIgPSBjc3YucmVhZGVyKGlucHV0LCAqKmt3YXJncykKKyAgICAgICAgcmVzdWx0ID0gbGlzdChyZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3QpCisKKyAgICBkZWYgdGVzdF9yZWFkX29kZGlucHV0cyhzZWxmKToKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFtdLCBbXSkKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnJ10sIFtbXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJyJhYiJjJ10sIE5vbmUsIHN0cmljdCA9IDEpCisgICAgICAgICMgY2Fubm90IGhhbmRsZSBudWxsIGJ5dGVzIGZvciB0aGUgbW9tZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbJ2FiXDBjJ10sIE5vbmUsIHN0cmljdCA9IDEpCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJyJhYiJjJ10sIFtbJ2FiYyddXSwgZG91YmxlcXVvdGUgPSAwKQorCisgICAgZGVmIHRlc3RfcmVhZF9lb2woc2VsZik6CisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYiddLCBbWydhJywnYiddXSkKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxiXG4nXSwgW1snYScsJ2InXV0pCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxyXG4nXSwgW1snYScsJ2InXV0pCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsYlxyJ10sIFtbJ2EnLCdiJ11dKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwgWydhLGJccmMsZCddLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFsnYSxiXG5jLGQnXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgc2VsZi5fcmVhZF90ZXN0LCBbJ2EsYlxyXG5jLGQnXSwgW10pCisKKyAgICBkZWYgdGVzdF9yZWFkX2VvZihzZWxmKToKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSwiJ10sIFtbJ2EnLCAnJ11dKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWyciYSddLCBbWydhJ11dKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydeJ10sIFtbJ1xuJ11dLCBlc2NhcGVjaGFyPSdeJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFsnYSwiJ10sIFtdLCBzdHJpY3Q9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFsnImEnXSwgW10sIHN0cmljdD1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWydeJ10sIFtdLCBlc2NhcGVjaGFyPSdeJywgc3RyaWN0PVRydWUpCisKKyAgICBkZWYgdGVzdF9yZWFkX2VzY2FwZShzZWxmKToKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSxcXGIsYyddLCBbWydhJywgJ2InLCAnYyddXSwgZXNjYXBlY2hhcj0nXFwnKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLGJcXCxjJ10sIFtbJ2EnLCAnYixjJ11dLCBlc2NhcGVjaGFyPSdcXCcpCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJ2EsImJcXCxjIiddLCBbWydhJywgJ2IsYyddXSwgZXNjYXBlY2hhcj0nXFwnKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWydhLCJiLFxcYyInXSwgW1snYScsICdiLGMnXV0sIGVzY2FwZWNoYXI9J1xcJykKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSwiYixjXFwiIiddLCBbWydhJywgJ2IsYyInXV0sIGVzY2FwZWNoYXI9J1xcJykKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnYSwiYixjIlxcJ10sIFtbJ2EnLCAnYixjXFwnXV0sIGVzY2FwZWNoYXI9J1xcJykKKworICAgIGRlZiB0ZXN0X3JlYWRfcXVvdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnMSwiLDMsIiw1J10sIFtbJzEnLCAnLDMsJywgJzUnXV0pCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdChbJzEsIiwzLCIsNSddLCBbWycxJywgJyInLCAnMycsICciJywgJzUnXV0sCisgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZWNoYXI9Tm9uZSwgZXNjYXBlY2hhcj0nXFwnKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoWycxLCIsMywiLDUnXSwgW1snMScsICciJywgJzMnLCAnIicsICc1J11dLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9ORSwgZXNjYXBlY2hhcj0nXFwnKQorICAgICAgICAjIHdpbGwgdGhpcyBmYWlsIHdoZXJlIGxvY2FsZSB1c2VzIGNvbW1hIGZvciBkZWNpbWFscz8KKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnLDMsIjUiLDcuMywgOSddLCBbWycnLCAzLCAnNScsIDcuMywgOV1dLAorICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1jc3YuUVVPVEVfTk9OTlVNRVJJQykKKyAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFsnImFcbmIiLCA3J10sIFtbJ2FcbmInLCAnIDcnXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuX3JlYWRfdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWydhYmMsMyddLCBbW11dLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90aW5nPWNzdi5RVU9URV9OT05OVU1FUklDKQorCisgICAgZGVmIHRlc3RfcmVhZF9iaWdmaWVsZChzZWxmKToKKyAgICAgICAgIyBUaGlzIGV4ZXJjaXNlcyB0aGUgYnVmZmVyIHJlYWxsb2MgZnVuY3Rpb25hbGl0eSBhbmQgZmllbGQgc2l6ZQorICAgICAgICAjIGxpbWl0cy4KKyAgICAgICAgbGltaXQgPSBjc3YuZmllbGRfc2l6ZV9saW1pdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNpemUgPSA1MDAwMAorICAgICAgICAgICAgYmlnc3RyaW5nID0gJ1gnICogc2l6ZQorICAgICAgICAgICAgYmlnbGluZSA9ICclcywlcycgJSAoYmlnc3RyaW5nLCBiaWdzdHJpbmcpCisgICAgICAgICAgICBzZWxmLl9yZWFkX3Rlc3QoW2JpZ2xpbmVdLCBbW2JpZ3N0cmluZywgYmlnc3RyaW5nXV0pCisgICAgICAgICAgICBjc3YuZmllbGRfc2l6ZV9saW1pdChzaXplKQorICAgICAgICAgICAgc2VsZi5fcmVhZF90ZXN0KFtiaWdsaW5lXSwgW1tiaWdzdHJpbmcsIGJpZ3N0cmluZ11dKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjc3YuZmllbGRfc2l6ZV9saW1pdCgpLCBzaXplKQorICAgICAgICAgICAgY3N2LmZpZWxkX3NpemVfbGltaXQoc2l6ZS0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3N2LkVycm9yLCBzZWxmLl9yZWFkX3Rlc3QsIFtiaWdsaW5lXSwgW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5maWVsZF9zaXplX2xpbWl0LCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZmllbGRfc2l6ZV9saW1pdCwgMSwgTm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNzdi5maWVsZF9zaXplX2xpbWl0KGxpbWl0KQorCisgICAgZGVmIHRlc3RfcmVhZF9saW5lbnVtKHNlbGYpOgorICAgICAgICBmb3IgciBpbiAoY3N2LnJlYWRlcihbJ2xpbmUsMScsICdsaW5lLDInLCAnbGluZSwzJ10pLAorICAgICAgICAgICAgICAgICAgY3N2LkRpY3RSZWFkZXIoWydsaW5lLDEnLCAnbGluZSwyJywgJ2xpbmUsMyddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bJ2EnLCAnYicsICdjJ10pKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMCkKKyAgICAgICAgICAgIHIubmV4dCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubGluZV9udW0sIDEpCisgICAgICAgICAgICByLm5leHQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmxpbmVfbnVtLCAyKQorICAgICAgICAgICAgci5uZXh0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHIubmV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5saW5lX251bSwgMykKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcF9xdW90ZWVkX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3cml0ZXIud3JpdGVyb3dzLCBOb25lKQorICAgICAgICAgICAgcm93cyA9IFtbJ2FcbmInLCdiJ10sWydjJywneFxyXG5kJ11dCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3dzKHJvd3MpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIGZvciBpLCByb3cgaW4gZW51bWVyYXRlKGNzdi5yZWFkZXIoZmlsZW9iaikpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm93LCByb3dzW2ldKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworY2xhc3MgVGVzdERpYWxlY3RSZWdpc3RyeSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVnaXN0cnlfYmFkYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YubGlzdF9kaWFsZWN0cywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YuZ2V0X2RpYWxlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LmdldF9kaWFsZWN0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIGNzdi5nZXRfZGlhbGVjdCwgIm5vbmVzdWNoIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YudW5yZWdpc3Rlcl9kaWFsZWN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkYXJndW1lbnQ9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVnaXN0ZXJfZGlhbGVjdCwgIm5vbmVzdWNoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGluZz1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNzdi5yZWdpc3Rlcl9kaWFsZWN0LCBbXSkKKworICAgIGRlZiB0ZXN0X3JlZ2lzdHJ5KHNlbGYpOgorICAgICAgICBjbGFzcyBteWV4Y2VsdHN2KGNzdi5leGNlbCk6CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSAiXHQiCisgICAgICAgIG5hbWUgPSAibXlleGNlbHRzdiIKKyAgICAgICAgZXhwZWN0ZWRfZGlhbGVjdHMgPSBjc3YubGlzdF9kaWFsZWN0cygpICsgW25hbWVdCisgICAgICAgIGV4cGVjdGVkX2RpYWxlY3RzLnNvcnQoKQorICAgICAgICBjc3YucmVnaXN0ZXJfZGlhbGVjdChuYW1lLCBteWV4Y2VsdHN2KQorICAgICAgICBzZWxmLmFkZENsZWFudXAoY3N2LnVucmVnaXN0ZXJfZGlhbGVjdCwgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjc3YuZ2V0X2RpYWxlY3QobmFtZSkuZGVsaW1pdGVyLCAnXHQnKQorICAgICAgICBnb3RfZGlhbGVjdHMgPSBzb3J0ZWQoY3N2Lmxpc3RfZGlhbGVjdHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9kaWFsZWN0cywgZ290X2RpYWxlY3RzKQorCisgICAgZGVmIHRlc3RfcmVnaXN0ZXJfa3dhcmdzKHNlbGYpOgorICAgICAgICBuYW1lID0gJ2ZlZGNiYScKKyAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QobmFtZSwgZGVsaW1pdGVyPSc7JykKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QsIG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3N2LmdldF9kaWFsZWN0KG5hbWUpLmRlbGltaXRlciwgJzsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtbJ1gnLCAnWScsICdaJ11dLCBsaXN0KGNzdi5yZWFkZXIoWydYO1k7WiddLCBuYW1lKSkpCisKKyAgICBkZWYgdGVzdF9pbmNvbXBsZXRlX2RpYWxlY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIG15ZXhjZWx0c3YoY3N2LkRpYWxlY3QpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gIlx0IgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZXhjZWx0c3YpCisKKyAgICBkZWYgdGVzdF9zcGFjZV9kaWFsZWN0KHNlbGYpOgorICAgICAgICBjbGFzcyBzcGFjZShjc3YuZXhjZWwpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gIiAiCisgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKKyAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAiXFwiCisKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoImFiYyBkZWZcbmMxY2NjY2MxIGJlbnplbmVcbiIpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJkciA9IGNzdi5yZWFkZXIoZmlsZW9iaiwgZGlhbGVjdD1zcGFjZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZHIubmV4dCgpLCBbImFiYyIsICJkZWYiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmRyLm5leHQoKSwgWyJjMWNjY2NjMSIsICJiZW56ZW5lIl0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfZGlhbGVjdF9hcHBseShzZWxmKToKKyAgICAgICAgY2xhc3MgdGVzdEEoY3N2LmV4Y2VsKToKKyAgICAgICAgICAgIGRlbGltaXRlciA9ICJcdCIKKyAgICAgICAgY2xhc3MgdGVzdEIoY3N2LmV4Y2VsKToKKyAgICAgICAgICAgIGRlbGltaXRlciA9ICI6IgorICAgICAgICBjbGFzcyB0ZXN0Qyhjc3YuZXhjZWwpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gInwiCisKKyAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QoJ3Rlc3RDJywgdGVzdEMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmopCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KFsxLDIsM10pCisgICAgICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjEsMiwzXHJcbiIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCB0ZXN0QSkKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWzEsMiwzXSkKKyAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMVx0Mlx0M1xyXG4iKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD10ZXN0QigpKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQorICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxOjI6M1xyXG4iKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0ndGVzdEMnKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhbMSwyLDNdKQorICAgICAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksICIxfDJ8M1xyXG4iKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgICAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD10ZXN0QSwgZGVsaW1pdGVyPSc7JykKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coWzEsMiwzXSkKKyAgICAgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCAiMTsyOzNcclxuIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNzdi51bnJlZ2lzdGVyX2RpYWxlY3QoJ3Rlc3RDJykKKworICAgIGRlZiB0ZXN0X2JhZF9kaWFsZWN0KHNlbGYpOgorICAgICAgICAjIFVua25vd24gcGFyYW1ldGVyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIGJhZF9hdHRyID0gMCkKKyAgICAgICAgIyBCYWQgdmFsdWVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIGRlbGltaXRlciA9IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LnJlYWRlciwgW10sIHF1b3RpbmcgPSAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjc3YucmVhZGVyLCBbXSwgcXVvdGluZyA9IDEwMCkKKworY2xhc3MgVGVzdENzdkJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiByZWFkZXJBc3NlcnRFcXVhbChzZWxmLCBpbnB1dCwgZXhwZWN0ZWRfcmVzdWx0KToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoaW5wdXQpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIoZmlsZW9iaiwgZGlhbGVjdCA9IHNlbGYuZGlhbGVjdCkKKyAgICAgICAgICAgIGZpZWxkcyA9IGxpc3QocmVhZGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZHMsIGV4cGVjdGVkX3Jlc3VsdCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgd3JpdGVyQXNzZXJ0RXF1YWwoc2VsZiwgaW5wdXQsIGV4cGVjdGVkX3Jlc3VsdCk6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3QgPSBzZWxmLmRpYWxlY3QpCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3dzKGlucHV0KQorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZCgpLCBleHBlY3RlZF9yZXN1bHQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCitjbGFzcyBUZXN0RGlhbGVjdEV4Y2VsKFRlc3RDc3ZCYXNlKToKKyAgICBkaWFsZWN0ID0gJ2V4Y2VsJworCisgICAgZGVmIHRlc3Rfc2luZ2xlKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhYmMnLCBbWydhYmMnXV0pCisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJzEsMiwzLDQsNScsIFtbJzEnLCcyJywnMycsJzQnLCc1J11dKQorCisgICAgZGVmIHRlc3RfYmxhbmtsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcnLCBbXSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2ZpZWxkcyhzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnLCcsIFtbJycsICcnXV0pCisKKyAgICBkZWYgdGVzdF9zaW5nbGVxdW90ZWQoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyIiJywgW1snJ11dKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlcXVvdGVkX2xlZnRfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyIiLCcsIFtbJycsJyddXSkKKworICAgIGRlZiB0ZXN0X3NpbmdsZXF1b3RlZF9yaWdodF9lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnLCIiJywgW1snJywnJ11dKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlZF9xdW90ZShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnIiIiIicsIFtbJyInXV0pCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfcXVvdGVzKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciIiIiIiInLCBbWyciIiddXSkKKworICAgIGRlZiB0ZXN0X2lubGluZV9xdW90ZShzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnYSIiYicsIFtbJ2EiImInXV0pCisKKyAgICBkZWYgdGVzdF9pbmxpbmVfcXVvdGVzKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCdhImIiYycsIFtbJ2EiYiJjJ11dKQorCisgICAgZGVmIHRlc3RfcXVvdGVzX2FuZF9tb3JlKHNlbGYpOgorICAgICAgICAjIEV4Y2VsIHdvdWxkIG5ldmVyIHdyaXRlIGEgZmllbGQgY29udGFpbmluZyAnImEiYicsIGJ1dCB3aGVuCisgICAgICAgICMgcmVhZGluZyBvbmUsIGl0IHdpbGwgcmV0dXJuICdhYicuCisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyJhImInLCBbWydhYiddXSkKKworICAgIGRlZiB0ZXN0X2xvbmVfcXVvdGUoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJ2EiYicsIFtbJ2EiYiddXSkKKworICAgIGRlZiB0ZXN0X3F1b3RlX2FuZF9xdW90ZShzZWxmKToKKyAgICAgICAgIyBFeGNlbCB3b3VsZCBuZXZlciB3cml0ZSBhIGZpZWxkIGNvbnRhaW5pbmcgJyJhIiAiYiInLCBidXQgd2hlbgorICAgICAgICAjIHJlYWRpbmcgb25lLCBpdCB3aWxsIHJldHVybiAnYSAiYiInLgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciYSIgImIiJywgW1snYSAiYiInXV0pCisKKyAgICBkZWYgdGVzdF9zcGFjZV9hbmRfcXVvdGUoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJyAiYSInLCBbWycgImEiJ11dKQorCisgICAgZGVmIHRlc3RfcXVvdGVkKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCcxLDIsMywiSSB0aGluaywgdGhlcmVmb3JlIEkgYW0iLDUsNicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1snMScsICcyJywgJzMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0kgdGhpbmssIHRoZXJlZm9yZSBJIGFtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc1JywgJzYnXV0pCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfcXVvdGUoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJzEsMiwzLCIiIkkgc2VlLCIiIHNhaWQgdGhlIGJsaW5kIG1hbiIsImFzIGhlIHBpY2tlZCB1cCBoaXMgaGFtbWVyIGFuZCBzYXciJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWycxJywgJzInLCAnMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIkkgc2VlLCIgc2FpZCB0aGUgYmxpbmQgbWFuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcyBoZSBwaWNrZWQgdXAgaGlzIGhhbW1lciBhbmQgc2F3J11dKQorCisgICAgZGVmIHRlc3RfcXVvdGVkX25sKHNlbGYpOgorICAgICAgICBpbnB1dCA9ICcnJ1wKKzEsMiwzLCIiIkkgc2VlLCIiCitzYWlkIHRoZSBibGluZCBtYW4iLCJhcyBoZSBwaWNrZWQgdXAgaGlzCitoYW1tZXIgYW5kIHNhdyIKKzksOCw3LDYnJycKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbChpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbWycxJywgJzInLCAnMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciSSBzZWUsIlxuc2FpZCB0aGUgYmxpbmQgbWFuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FzIGhlIHBpY2tlZCB1cCBoaXNcbmhhbW1lciBhbmQgc2F3J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnOScsJzgnLCc3JywnNiddXSkKKworICAgIGRlZiB0ZXN0X2R1YmlvdXNfcXVvdGUoc2VsZik6CisgICAgICAgIHNlbGYucmVhZGVyQXNzZXJ0RXF1YWwoJzEyLDEyLDEiLCcsIFtbJzEyJywgJzEyJywgJzEiJywgJyddXSkKKworICAgIGRlZiB0ZXN0X251bGwoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW10sICcnKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX3dyaXRlcihzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMnXV0sICdhYmNcclxuJykKKworICAgIGRlZiB0ZXN0X3NpbXBsZV93cml0ZXIoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVyQXNzZXJ0RXF1YWwoW1sxLCAyLCAnYWJjJywgMywgNF1dLCAnMSwyLGFiYywzLDRcclxuJykKKworICAgIGRlZiB0ZXN0X3F1b3RlcyhzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWzEsIDIsICdhImJjIicsIDMsIDRdXSwgJzEsMiwiYSIiYmMiIiIsMyw0XHJcbicpCisKKyAgICBkZWYgdGVzdF9xdW90ZV9maWVsZHNlcChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMsZGVmJ11dLCAnImFiYyxkZWYiXHJcbicpCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWzEsIDIsICdhXG5iYycsIDMsIDRdXSwgJzEsMiwiYVxuYmMiLDMsNFxyXG4nKQorCitjbGFzcyBFc2NhcGVkRXhjZWwoY3N2LmV4Y2VsKToKKyAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKKyAgICBlc2NhcGVjaGFyID0gJ1xcJworCitjbGFzcyBUZXN0RXNjYXBlZEV4Y2VsKFRlc3RDc3ZCYXNlKToKKyAgICBkaWFsZWN0ID0gRXNjYXBlZEV4Y2VsKCkKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9maWVsZHNlcChzZWxmKToKKyAgICAgICAgc2VsZi53cml0ZXJBc3NlcnRFcXVhbChbWydhYmMsZGVmJ11dLCAnYWJjXFwsZGVmXHJcbicpCisKKyAgICBkZWYgdGVzdF9yZWFkX2VzY2FwZV9maWVsZHNlcChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkZXJBc3NlcnRFcXVhbCgnYWJjXFwsZGVmXHJcbicsIFtbJ2FiYyxkZWYnXV0pCisKK2NsYXNzIFF1b3RlZEVzY2FwZWRFeGNlbChjc3YuZXhjZWwpOgorICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9OTlVNRVJJQworICAgIGVzY2FwZWNoYXIgPSAnXFwnCisKK2NsYXNzIFRlc3RRdW90ZWRFc2NhcGVkRXhjZWwoVGVzdENzdkJhc2UpOgorICAgIGRpYWxlY3QgPSBRdW90ZWRFc2NhcGVkRXhjZWwoKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgorICAgICAgICBzZWxmLndyaXRlckFzc2VydEVxdWFsKFtbJ2FiYyxkZWYnXV0sICciYWJjLGRlZiJcclxuJykKKworICAgIGRlZiB0ZXN0X3JlYWRfZXNjYXBlX2ZpZWxkc2VwKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWRlckFzc2VydEVxdWFsKCciYWJjXFwsZGVmIlxyXG4nLCBbWydhYmMsZGVmJ11dKQorCitjbGFzcyBUZXN0RGljdEZpZWxkcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyMjICJsb25nIiBtZWFucyB0aGUgcm93IGlzIGxvbmdlciB0aGFuIHRoZSBudW1iZXIgb2YgZmllbGRuYW1lcworICAgICMjIyAic2hvcnQiIG1lYW5zIHRoZXJlIGFyZSBmZXdlciBlbGVtZW50cyBpbiB0aGUgcm93IHRoYW4gZmllbGRuYW1lcworICAgIGRlZiB0ZXN0X3dyaXRlX3NpbXBsZV9kaWN0KHNlbGYpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gaW8ub3BlbihmZCwgJ3crYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlciA9IGNzdi5EaWN0V3JpdGVyKGZpbGVvYmosIGZpZWxkbmFtZXMgPSBbImYxIiwgImYyIiwgImYzIl0pCisgICAgICAgICAgICB3cml0ZXIud3JpdGVoZWFkZXIoKQorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVvYmoucmVhZGxpbmUoKSwgImYxLGYyLGYzXHJcbiIpCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coeyJmMSI6IDEwLCAiZjMiOiAiYWJjIn0pCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIGZpbGVvYmoucmVhZGxpbmUoKSAjIGhlYWRlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgIjEwLCxhYmNcclxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF93cml0ZV9ub19maWVsZHMoc2VsZik6CisgICAgICAgIGZpbGVvYmogPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3N2LkRpY3RXcml0ZXIsIGZpbGVvYmopCisKKyAgICBkZWYgdGVzdF9yZWFkX2RpY3RfZmllbGRzKHNlbGYpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiY1xyXG4iKQorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bImYxIiwgImYyIiwgImYzIl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywgImYzIjogJ2FiYyd9KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9ub19maWVsZG5hbWVzKHNlbGYpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiZjEsZjIsZjNcclxuMSwyLGFiY1xyXG4iKQorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIuZmllbGRuYW1lcywgWyJmMSIsICJmMiIsICJmMyJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsICJmMyI6ICdhYmMnfSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICAjIFR3byB0ZXN0IGNhc2VzIHRvIG1ha2Ugc3VyZSBleGlzdGluZyB3YXlzIG9mIGltcGxpY2l0bHkgc2V0dGluZworICAgICMgZmllbGRuYW1lcyBjb250aW51ZSB0byB3b3JrLiAgQm90aCBhcmlzZSBmcm9tIGRpc2N1c3Npb24gaW4gaXNzdWUzNDM2LgorICAgIGRlZiB0ZXN0X3JlYWRfZGljdF9maWVsZG5hbWVzX2Zyb21fZmlsZShzZWxmKToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImYxLGYyLGYzXHJcbjEsMixhYmNcclxuIikKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZiwgZmllbGRuYW1lcz1jc3YucmVhZGVyKGYpLm5leHQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiLCAiZjMiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfcmVhZF9kaWN0X2ZpZWxkbmFtZXNfY2hhaW4oc2VsZik6CisgICAgICAgIGltcG9ydCBpdGVydG9vbHMKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImYxLGYyLGYzXHJcbjEsMixhYmNcclxuIikKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoZikKKyAgICAgICAgICAgIGZpcnN0ID0gbmV4dChyZWFkZXIpCisgICAgICAgICAgICBmb3Igcm93IGluIGl0ZXJ0b29scy5jaGFpbihbZmlyc3RdLCByZWFkZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiLCAiZjMiXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdywgeyJmMSI6ICcxJywgImYyIjogJzInLCAiZjMiOiAnYWJjJ30pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfcmVhZF9sb25nKHNlbGYpOgorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZW9iai53cml0ZSgiMSwyLGFiYyw0LDUsNlxyXG4iKQorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz1bImYxIiwgImYyIl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiZjEiOiAnMScsICJmMiI6ICcyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmU6IFsiYWJjIiwgIjQiLCAiNSIsICI2Il19KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ193aXRoX3Jlc3Qoc2VsZik6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlb2JqLndyaXRlKCIxLDIsYWJjLDQsNSw2XHJcbiIpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPVsiZjEiLCAiZjIiXSwgcmVzdGtleT0iX3Jlc3QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7ImYxIjogJzEnLCAiZjIiOiAnMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX3Jlc3QiOiBbImFiYyIsICI0IiwgIjUiLCAiNiJdfSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZpbGVvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF9yZWFkX2xvbmdfd2l0aF9yZXN0X25vX2ZpZWxkbmFtZXMoc2VsZik6CisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlb2JqLndyaXRlKCJmMSxmMlxyXG4xLDIsYWJjLDQsNSw2XHJcbiIpCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKGZpbGVvYmosIHJlc3RrZXk9Il9yZXN0IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLmZpZWxkbmFtZXMsIFsiZjEiLCAiZjIiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJmMSI6ICcxJywgImYyIjogJzInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9yZXN0IjogWyJhYmMiLCAiNCIsICI1IiwgIjYiXX0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfcmVhZF9zaG9ydChzZWxmKToKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGVvYmoud3JpdGUoIjEsMixhYmMsNCw1LDZcclxuMSwyLGFiY1xyXG4iKQorICAgICAgICAgICAgZmlsZW9iai5zZWVrKDApCisgICAgICAgICAgICByZWFkZXIgPSBjc3YuRGljdFJlYWRlcihmaWxlb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iMSAyIDMgNCA1IDYiLnNwbGl0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0dmFsPSJERUZBVUxUIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyIxIjogJzEnLCAiMiI6ICcyJywgIjMiOiAnYWJjJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjQiOiAnREVGQVVMVCcsICI1IjogJ0RFRkFVTFQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYiOiAnREVGQVVMVCd9KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X3JlYWRfbXVsdGkoc2VsZik6CisgICAgICAgIHNhbXBsZSA9IFsKKyAgICAgICAgICAgICcyMTQ3NDgzNjQ4LDQzLjBlMTIsMTcsYWJjLGRlZlxyXG4nLAorICAgICAgICAgICAgJzE0NzQ4MzY0OCw0My4wZTIsMTcsYWJjLGRlZlxyXG4nLAorICAgICAgICAgICAgJzQ3NDgzNjQ4LDQzLjAsMTcwLGFiYyxkZWZcclxuJworICAgICAgICAgICAgXQorCisgICAgICAgIHJlYWRlciA9IGNzdi5EaWN0UmVhZGVyKHNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRuYW1lcz0iaTEgZmxvYXQgaTIgczEgczIiLnNwbGl0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLm5leHQoKSwgeyJpMSI6ICcyMTQ3NDgzNjQ4JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsb2F0IjogJzQzLjBlMTInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaTIiOiAnMTcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiczEiOiAnYWJjJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInMyIjogJ2RlZid9KQorCisgICAgZGVmIHRlc3RfcmVhZF93aXRoX2JsYW5rcyhzZWxmKToKKyAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoWyIxLDIsYWJjLDQsNSw2XHJcbiIsIlxyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEsMixhYmMsNCw1LDZcclxuIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkbmFtZXM9IjEgMiAzIDQgNSA2Ii5zcGxpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5uZXh0KCksIHsiMSI6ICcxJywgIjIiOiAnMicsICIzIjogJ2FiYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI0IjogJzQnLCAiNSI6ICc1JywgIjYiOiAnNid9KQorCisgICAgZGVmIHRlc3RfcmVhZF9zZW1pX3NlcChzZWxmKToKKyAgICAgICAgcmVhZGVyID0gY3N2LkRpY3RSZWFkZXIoWyIxOzI7YWJjOzQ7NTs2XHJcbiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZG5hbWVzPSIxIDIgMyA0IDUgNiIuc3BsaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyPSc7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIubmV4dCgpLCB7IjEiOiAnMScsICIyIjogJzInLCAiMyI6ICdhYmMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNCI6ICc0JywgIjUiOiAnNScsICI2IjogJzYnfSkKKworY2xhc3MgVGVzdEFycmF5V3JpdGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9pbnRfd3JpdGUoc2VsZik6CisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICBjb250ZW50cyA9IFsoMjAtaSkgZm9yIGkgaW4gcmFuZ2UoMjApXQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2knLCBjb250ZW50cykKKworICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSJleGNlbCIpCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coYSkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gIiwiLmpvaW4oW3N0cihpKSBmb3IgaSBpbiBhXSkrIlxyXG4iCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZV93cml0ZShzZWxmKToKKyAgICAgICAgaW1wb3J0IGFycmF5CisgICAgICAgIGNvbnRlbnRzID0gWygyMC1pKSowLjEgZm9yIGkgaW4gcmFuZ2UoMjApXQorICAgICAgICBhID0gYXJyYXkuYXJyYXkoJ2QnLCBjb250ZW50cykKKyAgICAgICAgZmQsIG5hbWUgPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgZmlsZW9iaiA9IG9zLmZkb3BlbihmZCwgIncrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyaXRlciA9IGNzdi53cml0ZXIoZmlsZW9iaiwgZGlhbGVjdD0iZXhjZWwiKQorICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KGEpCisgICAgICAgICAgICBleHBlY3RlZCA9ICIsIi5qb2luKFtyZXByKGkpIGZvciBpIGluIGFdKSsiXHJcbiIKKyAgICAgICAgICAgIGZpbGVvYmouc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlb2JqLnJlYWQoKSwgZXhwZWN0ZWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmaWxlb2JqLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhuYW1lKQorCisgICAgZGVmIHRlc3RfZmxvYXRfd3JpdGUoc2VsZik6CisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICBjb250ZW50cyA9IFsoMjAtaSkqMC4xIGZvciBpIGluIHJhbmdlKDIwKV0KKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCdmJywgY29udGVudHMpCisgICAgICAgIGZkLCBuYW1lID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIGZpbGVvYmogPSBvcy5mZG9wZW4oZmQsICJ3K2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3cml0ZXIgPSBjc3Yud3JpdGVyKGZpbGVvYmosIGRpYWxlY3Q9ImV4Y2VsIikKKyAgICAgICAgICAgIHdyaXRlci53cml0ZXJvdyhhKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSAiLCIuam9pbihbcmVwcihpKSBmb3IgaSBpbiBhXSkrIlxyXG4iCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworICAgIGRlZiB0ZXN0X2NoYXJfd3JpdGUoc2VsZik6CisgICAgICAgIGltcG9ydCBhcnJheSwgc3RyaW5nCisgICAgICAgIGEgPSBhcnJheS5hcnJheSgnYycsIHN0cmluZy5sZXR0ZXJzKQorICAgICAgICBmZCwgbmFtZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBmaWxlb2JqID0gb3MuZmRvcGVuKGZkLCAidytiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihmaWxlb2JqLCBkaWFsZWN0PSJleGNlbCIpCisgICAgICAgICAgICB3cml0ZXIud3JpdGVyb3coYSkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gIiwiLmpvaW4oYSkrIlxyXG4iCisgICAgICAgICAgICBmaWxlb2JqLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZW9iai5yZWFkKCksIGV4cGVjdGVkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZmlsZW9iai5jbG9zZSgpCisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKworY2xhc3MgVGVzdERpYWxlY3RWYWxpZGl0eSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcXVvdGluZyhzZWxmKToKKyAgICAgICAgY2xhc3MgbXlkaWFsZWN0KGNzdi5EaWFsZWN0KToKKyAgICAgICAgICAgIGRlbGltaXRlciA9ICI7IgorICAgICAgICAgICAgZXNjYXBlY2hhciA9ICdcXCcKKyAgICAgICAgICAgIGRvdWJsZXF1b3RlID0gRmFsc2UKKyAgICAgICAgICAgIHNraXBpbml0aWFsc3BhY2UgPSBUcnVlCisgICAgICAgICAgICBsaW5ldGVybWluYXRvciA9ICdcclxuJworICAgICAgICAgICAgcXVvdGluZyA9IGNzdi5RVU9URV9OT05FCisgICAgICAgIGQgPSBteWRpYWxlY3QoKQorCisgICAgICAgIG15ZGlhbGVjdC5xdW90aW5nID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhjc3YuRXJyb3IsIG15ZGlhbGVjdCkKKworICAgICAgICBteWRpYWxlY3QuZG91YmxlcXVvdGUgPSBUcnVlCisgICAgICAgIG15ZGlhbGVjdC5xdW90aW5nID0gY3N2LlFVT1RFX0FMTAorICAgICAgICBteWRpYWxlY3QucXVvdGVjaGFyID0gJyInCisgICAgICAgIGQgPSBteWRpYWxlY3QoKQorCisgICAgICAgIG15ZGlhbGVjdC5xdW90ZWNoYXIgPSAiJyciCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorCisgICAgICAgIG15ZGlhbGVjdC5xdW90ZWNoYXIgPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorCisgICAgZGVmIHRlc3RfZGVsaW1pdGVyKHNlbGYpOgorICAgICAgICBjbGFzcyBteWRpYWxlY3QoY3N2LkRpYWxlY3QpOgorICAgICAgICAgICAgZGVsaW1pdGVyID0gIjsiCisgICAgICAgICAgICBlc2NhcGVjaGFyID0gJ1xcJworICAgICAgICAgICAgZG91YmxlcXVvdGUgPSBGYWxzZQorICAgICAgICAgICAgc2tpcGluaXRpYWxzcGFjZSA9IFRydWUKKyAgICAgICAgICAgIGxpbmV0ZXJtaW5hdG9yID0gJ1xyXG4nCisgICAgICAgICAgICBxdW90aW5nID0gY3N2LlFVT1RFX05PTkUKKyAgICAgICAgZCA9IG15ZGlhbGVjdCgpCisKKyAgICAgICAgbXlkaWFsZWN0LmRlbGltaXRlciA9ICI6OjoiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorCisgICAgICAgIG15ZGlhbGVjdC5kZWxpbWl0ZXIgPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorCisgICAgZGVmIHRlc3RfbGluZXRlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgIGNsYXNzIG15ZGlhbGVjdChjc3YuRGlhbGVjdCk6CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSAiOyIKKyAgICAgICAgICAgIGVzY2FwZWNoYXIgPSAnXFwnCisgICAgICAgICAgICBkb3VibGVxdW90ZSA9IEZhbHNlCisgICAgICAgICAgICBza2lwaW5pdGlhbHNwYWNlID0gVHJ1ZQorICAgICAgICAgICAgbGluZXRlcm1pbmF0b3IgPSAnXHJcbicKKyAgICAgICAgICAgIHF1b3RpbmcgPSBjc3YuUVVPVEVfTk9ORQorICAgICAgICBkID0gbXlkaWFsZWN0KCkKKworICAgICAgICBteWRpYWxlY3QubGluZXRlcm1pbmF0b3IgPSAiOjo6IgorICAgICAgICBkID0gbXlkaWFsZWN0KCkKKworICAgICAgICBteWRpYWxlY3QubGluZXRlcm1pbmF0b3IgPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGNzdi5FcnJvciwgbXlkaWFsZWN0KQorCisKK2NsYXNzIFRlc3RTbmlmZmVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBzYW1wbGUxID0gIiIiXAorSGFycnkncywgQXJsaW5ndG9uIEhlaWdodHMsIElMLCAyLzEvMDMsIEtpbWkgSGF5ZXMKK1NoYXJrIENpdHksIEdsZW5kYWxlIEhlaWdodHMsIElMLCAxMi8yOC8wMiwgUHJlemVuY2UKK1RvbW15J3MgUGxhY2UsIEJsdWUgSXNsYW5kLCBJTCwgMTIvMjgvMDIsIEJsdWUgU3VuZGF5L1doaXRlIENyb3cKK1N0b25lY3V0dGVycyBTZWFmb29kIGFuZCBDaG9wIEhvdXNlLCBMZW1vbnQsIElMLCAxMi8xOS8wMiwgV2VlayBCYWNrCisiIiIKKyAgICBzYW1wbGUyID0gIiIiXAorJ0hhcnJ5JydzJzonQXJsaW5ndG9uIEhlaWdodHMnOidJTCc6JzIvMS8wMyc6J0tpbWkgSGF5ZXMnCisnU2hhcmsgQ2l0eSc6J0dsZW5kYWxlIEhlaWdodHMnOidJTCc6JzEyLzI4LzAyJzonUHJlemVuY2UnCisnVG9tbXknJ3MgUGxhY2UnOidCbHVlIElzbGFuZCc6J0lMJzonMTIvMjgvMDInOidCbHVlIFN1bmRheS9XaGl0ZSBDcm93JworJ1N0b25lY3V0dGVycyAnJ1NlYWZvb2QnJyBhbmQgQ2hvcCBIb3VzZSc6J0xlbW9udCc6J0lMJzonMTIvMTkvMDInOidXZWVrIEJhY2snCisiIiIKKyAgICBoZWFkZXIgPSAnJydcCisidmVudWUiLCJjaXR5Iiwic3RhdGUiLCJkYXRlIiwicGVyZm9ybWVycyIKKycnJworICAgIHNhbXBsZTMgPSAnJydcCiswNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMz8wNS8wNS8wMworMDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDM/MDUvMDUvMDMKKzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzPzA1LzA1LzAzCisnJycKKworICAgIHNhbXBsZTQgPSAnJydcCisyMTQ3NDgzNjQ4OzQzLjBlMTI7MTc7YWJjO2RlZgorMTQ3NDgzNjQ4OzQzLjBlMjsxNzthYmM7ZGVmCis0NzQ4MzY0ODs0My4wOzE3MDthYmM7ZGVmCisnJycKKworICAgIHNhbXBsZTUgPSAiYWFhXHRiYmJcclxuQUFBXHRcclxuQkJCXHRcclxuIgorICAgIHNhbXBsZTYgPSAiYXxifGNcclxuZHxlfGZcclxuIgorICAgIHNhbXBsZTcgPSAiJ2EnfCdiJ3wnYydcclxuJ2QnfGV8ZlxyXG4iCisKKyAgICBkZWYgdGVzdF9oYXNfaGVhZGVyKHNlbGYpOgorICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNuaWZmZXIuaGFzX2hlYWRlcihzZWxmLnNhbXBsZTEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbmlmZmVyLmhhc19oZWFkZXIoc2VsZi5oZWFkZXIrc2VsZi5zYW1wbGUxKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3NuaWZmKHNlbGYpOgorICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICIsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnF1b3RlY2hhciwgJyInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSwgVHJ1ZSkKKworICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICI6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LnF1b3RlY2hhciwgIiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3Quc2tpcGluaXRpYWxzcGFjZSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9kZWxpbWl0ZXJzKHNlbGYpOgorICAgICAgICBzbmlmZmVyID0gY3N2LlNuaWZmZXIoKQorICAgICAgICBkaWFsZWN0ID0gc25pZmZlci5zbmlmZihzZWxmLnNhbXBsZTMpCisgICAgICAgICMgZ2l2ZW4gdGhhdCBhbGwgdGhyZWUgbGluZXMgaW4gc2FtcGxlMyBhcmUgZXF1YWwsCisgICAgICAgICMgSSB0aGluayB0aGF0IGFueSBjaGFyYWN0ZXIgY291bGQgaGF2ZSBiZWVuICdndWVzc2VkJyBhcyB0aGUKKyAgICAgICAgIyBkZWxpbWl0ZXIsIGRlcGVuZGluZyBvbiBkaWN0aW9uYXJ5IG9yZGVyCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZGlhbGVjdC5kZWxpbWl0ZXIsIHNlbGYuc2FtcGxlMykKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSI/LCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICI/IikKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSIvLCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICIvIikKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAiOyIpCisgICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgIlx0IikKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGU2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QuZGVsaW1pdGVyLCAifCIpCisgICAgICAgIGRpYWxlY3QgPSBzbmlmZmVyLnNuaWZmKHNlbGYuc2FtcGxlNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWFsZWN0LmRlbGltaXRlciwgInwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpYWxlY3QucXVvdGVjaGFyLCAiJyIpCisKKyAgICBkZWYgdGVzdF9kb3VibGVxdW90ZShzZWxmKToKKyAgICAgICAgc25pZmZlciA9IGNzdi5TbmlmZmVyKCkKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5oZWFkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGlhbGVjdC5kb3VibGVxdW90ZSkKKyAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlhbGVjdC5kb3VibGVxdW90ZSkKKworaWYgbm90IGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOiBwcmludCAiKioqIHNraXBwaW5nIGxlYWthZ2UgdGVzdHMgKioqIgorZWxzZToKKyAgICBjbGFzcyBOVUw6CisgICAgICAgIGRlZiB3cml0ZShzLCAqYXJncyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdyaXRlbGluZXMgPSB3cml0ZQorCisgICAgY2xhc3MgVGVzdExlYWtzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3RfY3JlYXRlX3JlYWQoc2VsZik6CisgICAgICAgICAgICBkZWx0YSA9IDAKKyAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKKyAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgICAgICBjc3YucmVhZGVyKFsiYSxiLGNcclxuIl0pCisgICAgICAgICAgICAgICAgY3N2LnJlYWRlcihbImEsYixjXHJcbiJdKQorICAgICAgICAgICAgICAgIGNzdi5yZWFkZXIoWyJhLGIsY1xyXG4iXSkKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYworICAgICAgICAgICAgICAgIGxhc3RyYyA9IHJjCisgICAgICAgICAgICAjIGlmIGNzdi5yZWFkZXIoKSBsZWFrcywgbGFzdCBkZWx0YSBzaG91bGQgYmUgMyBvciBtb3JlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlbHRhIDwgMywgVHJ1ZSkKKworICAgICAgICBkZWYgdGVzdF9jcmVhdGVfd3JpdGUoc2VsZik6CisgICAgICAgICAgICBkZWx0YSA9IDAKKyAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIHMgPSBOVUwoKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQorICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICAgICAgICAgIGNzdi53cml0ZXIocykKKyAgICAgICAgICAgICAgICBjc3Yud3JpdGVyKHMpCisgICAgICAgICAgICAgICAgY3N2LndyaXRlcihzKQorICAgICAgICAgICAgICAgIGRlbHRhID0gcmMtbGFzdHJjCisgICAgICAgICAgICAgICAgbGFzdHJjID0gcmMKKyAgICAgICAgICAgICMgaWYgY3N2LndyaXRlcigpIGxlYWtzLCBsYXN0IGRlbHRhIHNob3VsZCBiZSAzIG9yIG1vcmUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVsdGEgPCAzLCBUcnVlKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgICAgICBkZWx0YSA9IDAKKyAgICAgICAgICAgIHJvd3MgPSBbImEsYixjXHJcbiJdKjUKKyAgICAgICAgICAgIGxhc3RyYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMCk6CisgICAgICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5nYXJiYWdlLCBbXSkKKyAgICAgICAgICAgICAgICByYyA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgICAgICByZHIgPSBjc3YucmVhZGVyKHJvd3MpCisgICAgICAgICAgICAgICAgZm9yIHJvdyBpbiByZHI6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYworICAgICAgICAgICAgICAgIGxhc3RyYyA9IHJjCisgICAgICAgICAgICAjIGlmIHJlYWRlciBsZWFrcyBkdXJpbmcgcmVhZCwgZGVsdGEgc2hvdWxkIGJlIDUgb3IgbW9yZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDUsIFRydWUpCisKKyAgICAgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgICAgICBkZWx0YSA9IDAKKyAgICAgICAgICAgIHJvd3MgPSBbWzEsMiwzXV0qNQorICAgICAgICAgICAgcyA9IE5VTCgpCisgICAgICAgICAgICBsYXN0cmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjApOgorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuZ2FyYmFnZSwgW10pCisgICAgICAgICAgICAgICAgcmMgPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgICAgICAgICAgd3JpdGVyID0gY3N2LndyaXRlcihzKQorICAgICAgICAgICAgICAgIGZvciByb3cgaW4gcm93czoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlcm93KHJvdykKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHJjLWxhc3RyYworICAgICAgICAgICAgICAgIGxhc3RyYyA9IHJjCisgICAgICAgICAgICAjIGlmIHdyaXRlciBsZWFrcyBkdXJpbmcgd3JpdGUsIGxhc3QgZGVsdGEgc2hvdWxkIGJlIDUgb3IgbW9yZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWx0YSA8IDUsIFRydWUpCisKKyMgY29tbWVudGVkIG91dCBmb3Igbm93IC0gY3N2IG1vZHVsZSBkb2Vzbid0IHlldCBzdXBwb3J0IFVuaWNvZGUKKyMjIGNsYXNzIFRlc3RVbmljb2RlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyMjICAgICBkZWYgdGVzdF91bmljb2RlX3JlYWQoc2VsZik6CisjIyAgICAgICAgIGltcG9ydCBjb2RlY3MKKyMjICAgICAgICAgZiA9IGNvZGVjcy5FbmNvZGVkRmlsZShTdHJpbmdJTygiTWFydGluIHZvbiBM9ndpcywiCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1hcmMgQW5kcukgTGVtYnVyZywiCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkd1aWRvIHZhbiBSb3NzdW0sIgorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFu529pcyBQaW5hcmRcclxuIiksCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9lbmNvZGluZz0naXNvLTg4NTktMScpCisjIyAgICAgICAgIHJlYWRlciA9IGNzdi5yZWFkZXIoZikKKyMjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlYWRlciksIFtbdSJNYXJ0aW4gdm9uIEz2d2lzIiwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSJNYXJjIEFuZHLpIExlbWJ1cmciLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Ikd1aWRvIHZhbiBSb3NzdW0iLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1IkZyYW7nb2lzIFBpbmFyZG4iXV0pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBtb2QgPSBzeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAqW2dldGF0dHIobW9kLCBuYW1lKSBmb3IgbmFtZSBpbiBkaXIobW9kKSBpZiBuYW1lLnN0YXJ0c3dpdGgoJ1Rlc3QnKV0KKyAgICApCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jc3YucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzE0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jc3YucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Nzdi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jc3YucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YzE0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jc3YucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N0eXBlcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N0eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2YyODc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3R5cGVzLnB5CkBAIC0wLDAgKzEsMTUgQEAKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKKyNTa2lwIHRlc3RzIGlmIF9jdHlwZXMgbW9kdWxlIGRvZXMgbm90IGV4aXN0CitpbXBvcnRfbW9kdWxlKCdfY3R5cGVzJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgaW1wb3J0IGN0eXBlcy50ZXN0CisgICAgc2tpcHBlZCwgdGVzdGNhc2VzID0gY3R5cGVzLnRlc3QuZ2V0X3Rlc3RzKGN0eXBlcy50ZXN0LCAidGVzdF8qLnB5IiwgdmVyYm9zaXR5PTApCisgICAgc3VpdGVzID0gW3VuaXR0ZXN0Lm1ha2VTdWl0ZSh0KSBmb3IgdCBpbiB0ZXN0Y2FzZXNdCisgICAgcnVuX3VuaXR0ZXN0KHVuaXR0ZXN0LlRlc3RTdWl0ZShzdWl0ZXMpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3R5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmYwNWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3R5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3R5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmYwNWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3R5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzZWNjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2N1cnNlcy5weQpAQCAtMCwwICsxLDI5NSBAQAorIworIyBUZXN0IHNjcmlwdCBmb3IgdGhlIGN1cnNlcyBtb2R1bGUKKyMKKyMgVGhpcyBzY3JpcHQgZG9lc24ndCBhY3R1YWxseSBkaXNwbGF5IGFueXRoaW5nIHZlcnkgY29oZXJlbnQuIGJ1dCBpdAorIyBkb2VzIGNhbGwgZXZlcnkgbWV0aG9kIGFuZCBmdW5jdGlvbi4KKyMKKyMgRnVuY3Rpb25zIG5vdCB0ZXN0ZWQ6IHtkZWYscmVzZXR9X3tzaGVsbCxwcm9nfV9tb2RlLCBnZXRjaCgpLCBnZXRzdHIoKSwKKyMgaW5pdF9jb2xvcigpCisjIE9ubHkgY2FsbGVkLCBub3QgdGVzdGVkOiBnZXRtb3VzZSgpLCB1bmdldG1vdXNlKCkKKyMKKworaW1wb3J0IHN5cywgdGVtcGZpbGUsIG9zCisKKyMgT3B0aW9uYWxseSB0ZXN0IGN1cnNlcyBtb2R1bGUuICBUaGlzIGN1cnJlbnRseSByZXF1aXJlcyB0aGF0IHRoZQorIyAnY3Vyc2VzJyByZXNvdXJjZSBiZSBnaXZlbiBvbiB0aGUgcmVncnRlc3QgY29tbWFuZCBsaW5lIHVzaW5nIHRoZSAtdQorIyBvcHRpb24uICBJZiBub3QgYXZhaWxhYmxlLCBub3RoaW5nIGFmdGVyIHRoaXMgbGluZSB3aWxsIGJlIGV4ZWN1dGVkLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlcXVpcmVzLCBpbXBvcnRfbW9kdWxlCityZXF1aXJlcygnY3Vyc2VzJykKK2N1cnNlcyA9IGltcG9ydF9tb2R1bGUoJ2N1cnNlcycpCitjdXJzZXMucGFuZWwgPSBpbXBvcnRfbW9kdWxlKCdjdXJzZXMucGFuZWwnKQorCisKKyMgWFhYOiBpZiBuZXd0ZXJtIHdhcyBzdXBwb3J0ZWQgd2UgY291bGQgdXNlIGl0IGluc3RlYWQgb2YgaW5pdHNjciBhbmQgbm90IGV4aXQKK3Rlcm0gPSBvcy5lbnZpcm9uLmdldCgnVEVSTScpCitpZiBub3QgdGVybSBvciB0ZXJtID09ICd1bmtub3duJzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIiRURVJNPSVyLCBjYWxsaW5nIGluaXRzY3IoKSBtYXkgY2F1c2UgZXhpdCIgJSB0ZXJtCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAiY3lnd2luIjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiY3lnd2luJ3MgY3Vyc2VzIG1vc3RseSBqdXN0IGhhbmdzIikKKworZGVmIHdpbmRvd19mdW5jcyhzdGRzY3IpOgorICAgICJUZXN0IHRoZSBtZXRob2RzIG9mIHdpbmRvd3MiCisgICAgd2luID0gY3Vyc2VzLm5ld3dpbigxMCwxMCkKKyAgICB3aW4gPSBjdXJzZXMubmV3d2luKDUsNSwgNSw1KQorICAgIHdpbjIgPSBjdXJzZXMubmV3d2luKDE1LDE1LCA1LDUpCisKKyAgICBmb3IgbWV0aCBpbiBbc3Rkc2NyLmFkZGNoLCBzdGRzY3IuYWRkc3RyXToKKyAgICAgICAgZm9yIGFyZ3MgaW4gWygnYScpLCAoJ2EnLCBjdXJzZXMuQV9CT0xEKSwKKyAgICAgICAgICAgICAgICAgICAgICg0LDQsICdhJyksICg1LDUsICdhJywgY3Vyc2VzLkFfQk9MRCldOgorICAgICAgICAgICAgbWV0aCgqYXJncykKKworICAgIGZvciBtZXRoIGluIFtzdGRzY3IuYm94LCBzdGRzY3IuY2xlYXIsIHN0ZHNjci5jbHJ0b2JvdCwKKyAgICAgICAgICAgICAgICAgc3Rkc2NyLmNscnRvZW9sLCBzdGRzY3IuY3Vyc3luY3VwLCBzdGRzY3IuZGVsY2gsCisgICAgICAgICAgICAgICAgIHN0ZHNjci5kZWxldGVsbiwgc3Rkc2NyLmVyYXNlLCBzdGRzY3IuZ2V0YmVneXgsCisgICAgICAgICAgICAgICAgIHN0ZHNjci5nZXRia2dkLCBzdGRzY3IuZ2V0a2V5LCBzdGRzY3IuZ2V0bWF4eXgsCisgICAgICAgICAgICAgICAgIHN0ZHNjci5nZXRwYXJ5eCwgc3Rkc2NyLmdldHl4LCBzdGRzY3IuaW5jaCwKKyAgICAgICAgICAgICAgICAgc3Rkc2NyLmluc2VydGxuLCBzdGRzY3IuaW5zdHIsIHN0ZHNjci5pc193aW50b3VjaGVkLAorICAgICAgICAgICAgICAgICB3aW4ubm91dHJlZnJlc2gsIHN0ZHNjci5yZWRyYXd3aW4sIHN0ZHNjci5yZWZyZXNoLAorICAgICAgICAgICAgICAgICBzdGRzY3Iuc3RhbmRvdXQsIHN0ZHNjci5zdGFuZGVuZCwgc3Rkc2NyLnN5bmNkb3duLAorICAgICAgICAgICAgICAgICBzdGRzY3Iuc3luY3VwLCBzdGRzY3IudG91Y2h3aW4sIHN0ZHNjci51bnRvdWNod2luXToKKyAgICAgICAgbWV0aCgpCisKKyAgICBzdGRzY3IuYWRkbnN0cignMTIzNCcsIDMpCisgICAgc3Rkc2NyLmFkZG5zdHIoJzEyMzQnLCAzLCBjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5hZGRuc3RyKDQsNCwgJzEyMzQnLCAzKQorICAgIHN0ZHNjci5hZGRuc3RyKDUsNSwgJzEyMzQnLCAzLCBjdXJzZXMuQV9CT0xEKQorCisgICAgc3Rkc2NyLmF0dHJvbihjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5hdHRyb2ZmKGN1cnNlcy5BX0JPTEQpCisgICAgc3Rkc2NyLmF0dHJzZXQoY3Vyc2VzLkFfQk9MRCkKKyAgICBzdGRzY3IuYmtnZCgnICcpCisgICAgc3Rkc2NyLmJrZ2QoJyAnLCBjdXJzZXMuQV9SRVZFUlNFKQorICAgIHN0ZHNjci5ia2dkc2V0KCcgJykKKyAgICBzdGRzY3IuYmtnZHNldCgnICcsIGN1cnNlcy5BX1JFVkVSU0UpCisKKyAgICB3aW4uYm9yZGVyKDY1LCA2NiwgNjcsIDY4LAorICAgICAgICAgICAgICAgNjksIDcwLCA3MSwgNzIpCisgICAgd2luLmJvcmRlcignfCcsICchJywgJy0nLCAnXycsCisgICAgICAgICAgICAgICAnKycsICdcXCcsICcjJywgJy8nKQorICAgIHRyeToKKyAgICAgICAgd2luLmJvcmRlcig2NSwgNjYsIDY3LCA2OCwKKyAgICAgICAgICAgICAgICAgICA2OSwgW10sIDcxLCA3MikKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiRXhwZWN0ZWQgd2luLmJvcmRlcigpIHRvIHJhaXNlIFR5cGVFcnJvciIKKworICAgIHN0ZHNjci5jbGVhcm9rKDEpCisKKyAgICB3aW40ID0gc3Rkc2NyLmRlcndpbigyLDIpCisgICAgd2luNCA9IHN0ZHNjci5kZXJ3aW4oMSwxLCA1LDUpCisgICAgd2luNC5tdmRlcndpbig5LDkpCisKKyAgICBzdGRzY3IuZWNob2NoYXIoJ2EnKQorICAgIHN0ZHNjci5lY2hvY2hhcignYScsIGN1cnNlcy5BX0JPTEQpCisgICAgc3Rkc2NyLmhsaW5lKCctJywgNSkKKyAgICBzdGRzY3IuaGxpbmUoJy0nLCA1LCBjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5obGluZSgxLDEsJy0nLCA1KQorICAgIHN0ZHNjci5obGluZSgxLDEsJy0nLCA1LCBjdXJzZXMuQV9CT0xEKQorCisgICAgc3Rkc2NyLmlkY29rKDEpCisgICAgc3Rkc2NyLmlkbG9rKDEpCisgICAgc3Rkc2NyLmltbWVkb2soMSkKKyAgICBzdGRzY3IuaW5zY2goJ2MnKQorICAgIHN0ZHNjci5pbnNkZWxsbigxKQorICAgIHN0ZHNjci5pbnNuc3RyKCdhYmMnLCAzKQorICAgIHN0ZHNjci5pbnNuc3RyKCdhYmMnLCAzLCBjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5pbnNuc3RyKDUsIDUsICdhYmMnLCAzKQorICAgIHN0ZHNjci5pbnNuc3RyKDUsIDUsICdhYmMnLCAzLCBjdXJzZXMuQV9CT0xEKQorCisgICAgc3Rkc2NyLmluc3N0cignZGVmJykKKyAgICBzdGRzY3IuaW5zc3RyKCdkZWYnLCBjdXJzZXMuQV9CT0xEKQorICAgIHN0ZHNjci5pbnNzdHIoNSwgNSwgJ2RlZicpCisgICAgc3Rkc2NyLmluc3N0cig1LCA1LCAnZGVmJywgY3Vyc2VzLkFfQk9MRCkKKyAgICBzdGRzY3IuaXNfbGluZXRvdWNoZWQoMCkKKyAgICBzdGRzY3Iua2V5cGFkKDEpCisgICAgc3Rkc2NyLmxlYXZlb2soMSkKKyAgICBzdGRzY3IubW92ZSgzLDMpCisgICAgd2luLm12d2luKDIsMikKKyAgICBzdGRzY3Iubm9kZWxheSgxKQorICAgIHN0ZHNjci5ub3RpbWVvdXQoMSkKKyAgICB3aW4yLm92ZXJsYXkod2luKQorICAgIHdpbjIub3ZlcndyaXRlKHdpbikKKyAgICB3aW4yLm92ZXJsYXkod2luLCAxLCAyLCAzLCAzLCAyLCAxKQorICAgIHdpbjIub3ZlcndyaXRlKHdpbiwgMSwgMiwgMywgMywgMiwgMSkKKyAgICBzdGRzY3IucmVkcmF3bG4oMSwyKQorCisgICAgc3Rkc2NyLnNjcm9sbG9rKDEpCisgICAgc3Rkc2NyLnNjcm9sbCgpCisgICAgc3Rkc2NyLnNjcm9sbCgyKQorICAgIHN0ZHNjci5zY3JvbGwoLTMpCisKKyAgICBzdGRzY3IubW92ZSgxMiwgMikKKyAgICBzdGRzY3Iuc2V0c2NycmVnKDEwLDE1KQorICAgIHdpbjMgPSBzdGRzY3Iuc3Vid2luKDEwLDEwKQorICAgIHdpbjMgPSBzdGRzY3Iuc3Vid2luKDEwLDEwLCA1LDUpCisgICAgc3Rkc2NyLnN5bmNvaygxKQorICAgIHN0ZHNjci50aW1lb3V0KDUpCisgICAgc3Rkc2NyLnRvdWNobGluZSg1LDUpCisgICAgc3Rkc2NyLnRvdWNobGluZSg1LDUsMCkKKyAgICBzdGRzY3IudmxpbmUoJ2EnLCAzKQorICAgIHN0ZHNjci52bGluZSgnYScsIDMsIGN1cnNlcy5BX1NUQU5ET1VUKQorICAgIHN0ZHNjci5jaGdhdCg1LCAyLCAzLCBjdXJzZXMuQV9CTElOSykKKyAgICBzdGRzY3IuY2hnYXQoMywgY3Vyc2VzLkFfQk9MRCkKKyAgICBzdGRzY3IuY2hnYXQoNSwgOCwgY3Vyc2VzLkFfVU5ERVJMSU5FKQorICAgIHN0ZHNjci5jaGdhdChjdXJzZXMuQV9CTElOSykKKyAgICBzdGRzY3IucmVmcmVzaCgpCisKKyAgICBzdGRzY3IudmxpbmUoMSwxLCAnYScsIDMpCisgICAgc3Rkc2NyLnZsaW5lKDEsMSwgJ2EnLCAzLCBjdXJzZXMuQV9TVEFORE9VVCkKKworICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAncmVzaXplJyk6CisgICAgICAgIHN0ZHNjci5yZXNpemUoKQorICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAnZW5jbG9zZScpOgorICAgICAgICBzdGRzY3IuZW5jbG9zZSgpCisKKworZGVmIG1vZHVsZV9mdW5jcyhzdGRzY3IpOgorICAgICJUZXN0IG1vZHVsZS1sZXZlbCBmdW5jdGlvbnMiCisKKyAgICBmb3IgZnVuYyBpbiBbY3Vyc2VzLmJhdWRyYXRlLCBjdXJzZXMuYmVlcCwgY3Vyc2VzLmNhbl9jaGFuZ2VfY29sb3IsCisgICAgICAgICAgICAgICAgIGN1cnNlcy5jYnJlYWssIGN1cnNlcy5kZWZfcHJvZ19tb2RlLCBjdXJzZXMuZG91cGRhdGUsCisgICAgICAgICAgICAgICAgIGN1cnNlcy5maWx0ZXIsIGN1cnNlcy5mbGFzaCwgY3Vyc2VzLmZsdXNoaW5wLAorICAgICAgICAgICAgICAgICBjdXJzZXMuaGFzX2NvbG9ycywgY3Vyc2VzLmhhc19pYywgY3Vyc2VzLmhhc19pbCwKKyAgICAgICAgICAgICAgICAgY3Vyc2VzLmlzZW5kd2luLCBjdXJzZXMua2lsbGNoYXIsIGN1cnNlcy5sb25nbmFtZSwKKyAgICAgICAgICAgICAgICAgY3Vyc2VzLm5vY2JyZWFrLCBjdXJzZXMubm9lY2hvLCBjdXJzZXMubm9ubCwKKyAgICAgICAgICAgICAgICAgY3Vyc2VzLm5vcWlmbHVzaCwgY3Vyc2VzLm5vcmF3LAorICAgICAgICAgICAgICAgICBjdXJzZXMucmVzZXRfcHJvZ19tb2RlLCBjdXJzZXMudGVybWF0dHJzLAorICAgICAgICAgICAgICAgICBjdXJzZXMudGVybW5hbWUsIGN1cnNlcy5lcmFzZWNoYXIsIGN1cnNlcy5nZXRzeXhdOgorICAgICAgICBmdW5jKCkKKworICAgICMgRnVuY3Rpb25zIHRoYXQgYWN0dWFsbHkgbmVlZCBhcmd1bWVudHMKKyAgICBpZiBjdXJzZXMudGlnZXRzdHIoImNub3JtIik6CisgICAgICAgIGN1cnNlcy5jdXJzX3NldCgxKQorICAgIGN1cnNlcy5kZWxheV9vdXRwdXQoMSkKKyAgICBjdXJzZXMuZWNobygpIDsgY3Vyc2VzLmVjaG8oMSkKKworICAgIGZ4ID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgIyBjZiB0ZW1wZmlsZS5weSBUZW1wb3JhcnlGaWxlIHZzIE5hbWVkVGVtcG9yYXJ5RmlsZQorICAgIGlmIG9zLm5hbWUgIT0gJ3Bvc2l4JyBvciBvcy5zeXMucGxhdGZvcm0gPT0gJ2N5Z3dpbic6CisgICAgICAgIGYgPSBmeC5maWxlCisgICAgZWxzZToKKyAgICAgICAgZiA9IGZ4CisgICAgc3Rkc2NyLnB1dHdpbihmKQorICAgIGYuc2VlaygwKQorICAgIGN1cnNlcy5nZXR3aW4oZikKKyAgICBmeC5jbG9zZSgpCisKKyAgICBjdXJzZXMuaGFsZmRlbGF5KDEpCisgICAgY3Vyc2VzLmludHJmbHVzaCgxKQorICAgIGN1cnNlcy5tZXRhKDEpCisgICAgY3Vyc2VzLm5hcG1zKDEwMCkKKyAgICBjdXJzZXMubmV3cGFkKDUwLDUwKQorICAgIHdpbiA9IGN1cnNlcy5uZXd3aW4oNSw1KQorICAgIHdpbiA9IGN1cnNlcy5uZXd3aW4oNSw1LCAxLDEpCisgICAgY3Vyc2VzLm5sKCkgOyBjdXJzZXMubmwoMSkKKyAgICBjdXJzZXMucHV0cCgnYWJjJykKKyAgICBjdXJzZXMucWlmbHVzaCgpCisgICAgY3Vyc2VzLnJhdygpIDsgY3Vyc2VzLnJhdygxKQorICAgIGN1cnNlcy5zZXRzeXgoNSw1KQorICAgIGN1cnNlcy50aWdldGZsYWcoJ2hjJykKKyAgICBjdXJzZXMudGlnZXRudW0oJ2NvJykKKyAgICBjdXJzZXMudGlnZXRzdHIoJ2NyJykKKyAgICBjdXJzZXMudHBhcm0oJ2NyJykKKyAgICBjdXJzZXMudHlwZWFoZWFkKHN5cy5fX3N0ZGluX18uZmlsZW5vKCkpCisgICAgY3Vyc2VzLnVuY3RybCgnYScpCisgICAgY3Vyc2VzLnVuZ2V0Y2goJ2EnKQorICAgIGN1cnNlcy51c2VfZW52KDEpCisKKyAgICAjIEZ1bmN0aW9ucyBvbmx5IGF2YWlsYWJsZSBvbiBhIGZldyBwbGF0Zm9ybXMKKyAgICBpZiBjdXJzZXMuaGFzX2NvbG9ycygpOgorICAgICAgICBjdXJzZXMuc3RhcnRfY29sb3IoKQorICAgICAgICBjdXJzZXMuaW5pdF9wYWlyKDIsIDEsMSkKKyAgICAgICAgY3Vyc2VzLmNvbG9yX2NvbnRlbnQoMSkKKyAgICAgICAgY3Vyc2VzLmNvbG9yX3BhaXIoMikKKyAgICAgICAgY3Vyc2VzLnBhaXJfY29udGVudChjdXJzZXMuQ09MT1JfUEFJUlMgLSAxKQorICAgICAgICBjdXJzZXMucGFpcl9udW1iZXIoMCkKKworICAgICAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ3VzZV9kZWZhdWx0X2NvbG9ycycpOgorICAgICAgICAgICAgY3Vyc2VzLnVzZV9kZWZhdWx0X2NvbG9ycygpCisKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ2tleW5hbWUnKToKKyAgICAgICAgY3Vyc2VzLmtleW5hbWUoMTMpCisKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ2hhc19rZXknKToKKyAgICAgICAgY3Vyc2VzLmhhc19rZXkoMTMpCisKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ2dldG1vdXNlJyk6CisgICAgICAgIChhdmFpbG1hc2ssIG9sZG1hc2spID0gY3Vyc2VzLm1vdXNlbWFzayhjdXJzZXMuQlVUVE9OMV9QUkVTU0VEKQorICAgICAgICAjIGF2YWlsbWFzayBpbmRpY2F0ZXMgdGhhdCBtb3VzZSBzdHVmZiBub3QgYXZhaWxhYmxlLgorICAgICAgICBpZiBhdmFpbG1hc2sgIT0gMDoKKyAgICAgICAgICAgIGN1cnNlcy5tb3VzZWludGVydmFsKDEwKQorICAgICAgICAgICAgIyBqdXN0IHZlcmlmeSB0aGVzZSBkb24ndCBjYXVzZSBlcnJvcnMKKyAgICAgICAgICAgIGN1cnNlcy51bmdldG1vdXNlKDAsIDAsIDAsIDAsIGN1cnNlcy5CVVRUT04xX1BSRVNTRUQpCisgICAgICAgICAgICBtID0gY3Vyc2VzLmdldG1vdXNlKCkKKworICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAnaXNfdGVybV9yZXNpemVkJyk6CisgICAgICAgIGN1cnNlcy5pc190ZXJtX3Jlc2l6ZWQoKnN0ZHNjci5nZXRtYXh5eCgpKQorICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAncmVzaXpldGVybScpOgorICAgICAgICBjdXJzZXMucmVzaXpldGVybSgqc3Rkc2NyLmdldG1heHl4KCkpCisgICAgaWYgaGFzYXR0cihjdXJzZXMsICdyZXNpemVfdGVybScpOgorICAgICAgICBjdXJzZXMucmVzaXplX3Rlcm0oKnN0ZHNjci5nZXRtYXh5eCgpKQorCitkZWYgdW5pdF90ZXN0cygpOgorICAgIGZyb20gY3Vyc2VzIGltcG9ydCBhc2NpaQorICAgIGZvciBjaCwgZXhwZWN0ZWQgaW4gWygnYScsICdhJyksICgnQScsICdBJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCc7JywgJzsnKSwgKCcgJywgJyAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ1x4N2YnLCAnXj8nKSwgKCdcbicsICdeSicpLCAoJ1wwJywgJ15AJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIyBNZXRhLWJpdCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdceDhhJywgJyFeSicpLCAoJ1x4YzEnLCAnIUEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBdOgorICAgICAgICBpZiBhc2NpaS51bmN0cmwoY2gpICE9IGV4cGVjdGVkOgorICAgICAgICAgICAgcHJpbnQgJ2N1cnNlcy51bmN0cmwgZmFpbHMgb24gY2hhcmFjdGVyJywgcmVwcihjaCkKKworCitkZWYgdGVzdF91c2VycHRyX3dpdGhvdXRfc2V0KHN0ZHNjcik6CisgICAgdyA9IGN1cnNlcy5uZXd3aW4oMTAsIDEwKQorICAgIHAgPSBjdXJzZXMucGFuZWwubmV3X3BhbmVsKHcpCisgICAgIyB0cnkgdG8gYWNjZXNzIHVzZXJwdHIoKSBiZWZvcmUgY2FsbGluZyBzZXRfdXNlcnB0cigpIC0tIHNlZ2ZhdWx0cworICAgIHRyeToKKyAgICAgICAgcC51c2VycHRyKCkKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAndXNlcnB0ciBzaG91bGQgZmFpbCBzaW5jZSBub3Qgc2V0JworICAgIGV4Y2VwdCBjdXJzZXMucGFuZWwuZXJyb3I6CisgICAgICAgIHBhc3MKKworZGVmIHRlc3RfcmVzaXplX3Rlcm0oc3Rkc2NyKToKKyAgICBpZiBoYXNhdHRyKGN1cnNlcywgJ3Jlc2l6ZXRlcm0nKToKKyAgICAgICAgbGluZXMsIGNvbHMgPSBjdXJzZXMuTElORVMsIGN1cnNlcy5DT0xTCisgICAgICAgIGN1cnNlcy5yZXNpemV0ZXJtKGxpbmVzIC0gMSwgY29scyArIDEpCisKKyAgICAgICAgaWYgY3Vyc2VzLkxJTkVTICE9IGxpbmVzIC0gMSBvciBjdXJzZXMuQ09MUyAhPSBjb2xzICsgMToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkV4cGVjdGVkIHJlc2l6ZXRlcm0gdG8gdXBkYXRlIExJTkVTIGFuZCBDT0xTIgorCitkZWYgdGVzdF9pc3N1ZTYyNDMoc3Rkc2NyKToKKyAgICBjdXJzZXMudW5nZXRjaCgxMDI1KQorICAgIHN0ZHNjci5nZXRrZXkoKQorCitkZWYgbWFpbihzdGRzY3IpOgorICAgIGN1cnNlcy5zYXZldHR5KCkKKyAgICB0cnk6CisgICAgICAgIG1vZHVsZV9mdW5jcyhzdGRzY3IpCisgICAgICAgIHdpbmRvd19mdW5jcyhzdGRzY3IpCisgICAgICAgIHRlc3RfdXNlcnB0cl93aXRob3V0X3NldChzdGRzY3IpCisgICAgICAgIHRlc3RfcmVzaXplX3Rlcm0oc3Rkc2NyKQorICAgICAgICB0ZXN0X2lzc3VlNjI0MyhzdGRzY3IpCisgICAgZmluYWxseToKKyAgICAgICAgY3Vyc2VzLnJlc2V0dHkoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGN1cnNlcy53cmFwcGVyKG1haW4pCisgICAgdW5pdF90ZXN0cygpCitlbHNlOgorICAgIGlmIG5vdCBzeXMuX19zdGRvdXRfXy5pc2F0dHkoKToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInN5cy5fX3N0ZG91dF9fIGlzIG5vdCBhIHR0eSIpCisgICAgIyB0ZXN0aW5nIHNldHVwdGVybSgpIGluc2lkZSBpbml0c2NyL2VuZHdpbgorICAgICMgY2F1c2VzIHRlcm1pbmFsIGJyZWFrYWdlCisgICAgY3Vyc2VzLnNldHVwdGVybShmZD1zeXMuX19zdGRvdXRfXy5maWxlbm8oKSkKKyAgICB0cnk6CisgICAgICAgIHN0ZHNjciA9IGN1cnNlcy5pbml0c2NyKCkKKyAgICAgICAgbWFpbihzdGRzY3IpCisgICAgZmluYWxseToKKyAgICAgICAgY3Vyc2VzLmVuZHdpbigpCisgICAgdW5pdF90ZXN0cygpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Vyc2VzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2UxY2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Vyc2VzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9jdXJzZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Vyc2VzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2UxY2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfY3Vyc2VzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RhdGV0aW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNDZkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weQpAQCAtMCwwICsxLDMzNjcgQEAKKyIiIlRlc3QgZGF0ZS90aW1lIHR5cGUuCisKK1NlZSBodHRwOi8vd3d3LnpvcGUub3JnL01lbWJlcnMvZmRyYWtlL0RhdGVUaW1lV2lraS9UZXN0Q2FzZXMKKyIiIgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgoraW1wb3J0IHN5cworaW1wb3J0IHBpY2tsZQoraW1wb3J0IGNQaWNrbGUKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitmcm9tIGRhdGV0aW1lIGltcG9ydCBNSU5ZRUFSLCBNQVhZRUFSCitmcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKK2Zyb20gZGF0ZXRpbWUgaW1wb3J0IHR6aW5mbworZnJvbSBkYXRldGltZSBpbXBvcnQgdGltZQorZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZSwgZGF0ZXRpbWUKKworcGlja2xlX2Nob2ljZXMgPSBbKHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8pCisgICAgICAgICAgICAgICAgICBmb3IgcGlja2xlciBpbiBwaWNrbGUsIGNQaWNrbGUKKyAgICAgICAgICAgICAgICAgIGZvciB1bnBpY2tsZXIgaW4gcGlja2xlLCBjUGlja2xlCisgICAgICAgICAgICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UoMyldCithc3NlcnQgbGVuKHBpY2tsZV9jaG9pY2VzKSA9PSAyKjIqMworCisjIEFuIGFyYml0cmFyeSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgb2Ygbm9uLWRhdGV0aW1lIHR5cGVzLCBmb3IgdGVzdGluZworIyBtaXhlZC10eXBlIGNvbXBhcmlzb25zLgorT1RIRVJTVFVGRiA9ICgxMCwgMTBMLCAzNC41LCAiYWJjIiwge30sIFtdLCAoKSkKKworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBtb2R1bGUgdGVzdHMKKworY2xhc3MgVGVzdE1vZHVsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb25zdGFudHMoc2VsZik6CisgICAgICAgIGltcG9ydCBkYXRldGltZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGV0aW1lLk1JTllFQVIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0ZXRpbWUuTUFYWUVBUiwgOTk5OSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdHppbmZvIHRlc3RzCisKK2NsYXNzIEZpeGVkT2Zmc2V0KHR6aW5mbyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG9mZnNldCwgbmFtZSwgZHN0b2Zmc2V0PTQyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvZmZzZXQsIGludCk6CisgICAgICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEobWludXRlcz1vZmZzZXQpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZHN0b2Zmc2V0LCBpbnQpOgorICAgICAgICAgICAgZHN0b2Zmc2V0ID0gdGltZWRlbHRhKG1pbnV0ZXM9ZHN0b2Zmc2V0KQorICAgICAgICBzZWxmLl9fb2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgIHNlbGYuX19uYW1lID0gbmFtZQorICAgICAgICBzZWxmLl9fZHN0b2Zmc2V0ID0gZHN0b2Zmc2V0CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUubG93ZXIoKQorICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgorICAgICAgICByZXR1cm4gc2VsZi5fX29mZnNldAorICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgorICAgICAgICByZXR1cm4gc2VsZi5fX25hbWUKKyAgICBkZWYgZHN0KHNlbGYsIGR0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kc3RvZmZzZXQKKworY2xhc3MgUGlja2xhYmxlRml4ZWRPZmZzZXQoRml4ZWRPZmZzZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQ9Tm9uZSwgbmFtZT1Ob25lLCBkc3RvZmZzZXQ9Tm9uZSk6CisgICAgICAgIEZpeGVkT2Zmc2V0Ll9faW5pdF9fKHNlbGYsIG9mZnNldCwgbmFtZSwgZHN0b2Zmc2V0KQorCitjbGFzcyBUZXN0VFpJbmZvKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25vbl9hYnN0cmFjdG5lc3Moc2VsZik6CisgICAgICAgICMgSW4gb3JkZXIgdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBnZXQgcGlja2xlZCwgdGhlIEMgaW1wbGVtZW50YXRpb24KKyAgICAgICAgIyB3YXNuJ3QgYWJsZSB0byBnZXQgYXdheSB3aXRoIGhhdmluZyBfX2luaXRfXyByYWlzZQorICAgICAgICAjIE5vdEltcGxlbWVudGVkRXJyb3IuCisgICAgICAgIHVzZWxlc3MgPSB0emluZm8oKQorICAgICAgICBkdCA9IGRhdGV0aW1lLm1heAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCB1c2VsZXNzLnR6bmFtZSwgZHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHVzZWxlc3MudXRjb2Zmc2V0LCBkdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgdXNlbGVzcy5kc3QsIGR0KQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfbXVzdF9vdmVycmlkZShzZWxmKToKKyAgICAgICAgY2xhc3MgTm90RW5vdWdoKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgb2Zmc2V0LCBuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fb2Zmc2V0ID0gb2Zmc2V0CisgICAgICAgICAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE5vdEVub3VnaCwgdHppbmZvKSkKKyAgICAgICAgbmUgPSBOb3RFbm91Z2goMywgIk5vdEJ5QUxvbmdTaG90IikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG5lLCB0emluZm8pCisKKyAgICAgICAgZHQgPSBkYXRldGltZS5ub3coKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBuZS50em5hbWUsIGR0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBuZS51dGNvZmZzZXQsIGR0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBuZS5kc3QsIGR0KQorCisgICAgZGVmIHRlc3Rfbm9ybWFsKHNlbGYpOgorICAgICAgICBmbyA9IEZpeGVkT2Zmc2V0KDMsICJUaHJlZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmbywgdHppbmZvKQorICAgICAgICBmb3IgZHQgaW4gZGF0ZXRpbWUubm93KCksIE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnV0Y29mZnNldChkdCksIHRpbWVkZWx0YShtaW51dGVzPTMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby50em5hbWUoZHQpLCAiVGhyZWUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5kc3QoZHQpLCB0aW1lZGVsdGEobWludXRlcz00MikpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZ19iYXNlKHNlbGYpOgorICAgICAgICAjIFRoZXJlJ3Mgbm8gcG9pbnQgdG8gcGlja2xpbmcgdHppbmZvIG9iamVjdHMgb24gdGhlaXIgb3duICh0aGV5CisgICAgICAgICMgY2Fycnkgbm8gZGF0YSksIGJ1dCB0aGV5IG5lZWQgdG8gYmUgcGlja2xhYmxlIGFueXdheSBlbHNlCisgICAgICAgICMgY29uY3JldGUgc3ViY2xhc3NlcyBjYW4ndCBiZSBwaWNrbGVkLgorICAgICAgICBvcmlnID0gdHppbmZvLl9fbmV3X18odHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShvcmlnKSBpcyB0emluZm8pCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGRlcml2ZWQpIGlzIHR6aW5mbykKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBjYW4gcGlja2xlL3VucGlja2xlIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3MuCisgICAgICAgIG9mZnNldCA9IHRpbWVkZWx0YShtaW51dGVzPS0zMDApCisgICAgICAgIG9yaWcgPSBQaWNrbGFibGVGaXhlZE9mZnNldChvZmZzZXQsICdjb29raWUnKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob3JpZywgdHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShvcmlnKSBpcyBQaWNrbGFibGVGaXhlZE9mZnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLnV0Y29mZnNldChOb25lKSwgb2Zmc2V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcudHpuYW1lKE5vbmUpLCAnY29va2llJykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRlcml2ZWQsIHR6aW5mbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGRlcml2ZWQpIGlzIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXJpdmVkLnV0Y29mZnNldChOb25lKSwgb2Zmc2V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXJpdmVkLnR6bmFtZShOb25lKSwgJ2Nvb2tpZScpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEJhc2UgY2xhc2UgZm9yIHRlc3RpbmcgYSBwYXJ0aWN1bGFyIGFzcGVjdCBvZiB0aW1lZGVsdGEsIHRpbWUsIGRhdGUgYW5kCisjIGRhdGV0aW1lIGNvbXBhcmlzb25zLgorCitjbGFzcyBIYXJtbGVzc01peGVkQ29tcGFyaXNvbjoKKyAgICAjIFRlc3QgdGhhdCBfX2VxX18gYW5kIF9fbmVfXyBkb24ndCBjb21wbGFpbiBmb3IgbWl4ZWQtdHlwZSBjb21wYXJpc29ucy4KKworICAgICMgU3ViY2xhc3NlcyBtdXN0IGRlZmluZSAndGhlY2xhc3MnLCBhbmQgdGhlY2xhc3MoMSwgMSwgMSkgbXVzdCBiZSBhCisgICAgIyBsZWdpdCBjb25zdHJ1Y3Rvci4KKworICAgIGRlZiB0ZXN0X2hhcm1sZXNzX21peGVkX2NvbXBhcmlzb24oc2VsZik6CisgICAgICAgIG1lID0gc2VsZi50aGVjbGFzcygxLCAxLCAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWUgPT0gKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZSAhPSAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgoKSA9PSBtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgpICE9IG1lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obWUsIFsxLCAyMEwsIFtdLCBtZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oW10sIFttZSwgMSwgMjBMLCBbXV0pCisKKyAgICBkZWYgdGVzdF9oYXJtZnVsX21peGVkX2NvbXBhcmlzb24oc2VsZik6CisgICAgICAgIG1lID0gc2VsZi50aGVjbGFzcygxLCAxLCAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtZSA8ICgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogbWUgPD0gKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtZSA+ICgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogbWUgPj0gKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6ICgpIDwgbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAoKSA8PSBtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6ICgpID4gbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAoKSA+PSBtZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgKCksIG1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgbWUsICgpKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyB0aW1lZGVsdGEgdGVzdHMKKworY2xhc3MgVGVzdFRpbWVEZWx0YShIYXJtbGVzc01peGVkQ29tcGFyaXNvbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdGhlY2xhc3MgPSB0aW1lZGVsdGEKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGQgPSB0aW1lZGVsdGEKKworICAgICAgICAjIENoZWNrIGtleXdvcmQgYXJncyB0byBjb25zdHJ1Y3RvcgorICAgICAgICBlcSh0ZCgpLCB0ZCh3ZWVrcz0wLCBkYXlzPTAsIGhvdXJzPTAsIG1pbnV0ZXM9MCwgc2Vjb25kcz0wLAorICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHM9MCwgbWljcm9zZWNvbmRzPTApKQorICAgICAgICBlcSh0ZCgxKSwgdGQoZGF5cz0xKSkKKyAgICAgICAgZXEodGQoMCwgMSksIHRkKHNlY29uZHM9MSkpCisgICAgICAgIGVxKHRkKDAsIDAsIDEpLCB0ZChtaWNyb3NlY29uZHM9MSkpCisgICAgICAgIGVxKHRkKHdlZWtzPTEpLCB0ZChkYXlzPTcpKQorICAgICAgICBlcSh0ZChkYXlzPTEpLCB0ZChob3Vycz0yNCkpCisgICAgICAgIGVxKHRkKGhvdXJzPTEpLCB0ZChtaW51dGVzPTYwKSkKKyAgICAgICAgZXEodGQobWludXRlcz0xKSwgdGQoc2Vjb25kcz02MCkpCisgICAgICAgIGVxKHRkKHNlY29uZHM9MSksIHRkKG1pbGxpc2Vjb25kcz0xMDAwKSkKKyAgICAgICAgZXEodGQobWlsbGlzZWNvbmRzPTEpLCB0ZChtaWNyb3NlY29uZHM9MTAwMCkpCisKKyAgICAgICAgIyBDaGVjayBmbG9hdCBhcmdzIHRvIGNvbnN0cnVjdG9yCisgICAgICAgIGVxKHRkKHdlZWtzPTEuMC83KSwgdGQoZGF5cz0xKSkKKyAgICAgICAgZXEodGQoZGF5cz0xLjAvMjQpLCB0ZChob3Vycz0xKSkKKyAgICAgICAgZXEodGQoaG91cnM9MS4wLzYwKSwgdGQobWludXRlcz0xKSkKKyAgICAgICAgZXEodGQobWludXRlcz0xLjAvNjApLCB0ZChzZWNvbmRzPTEpKQorICAgICAgICBlcSh0ZChzZWNvbmRzPTAuMDAxKSwgdGQobWlsbGlzZWNvbmRzPTEpKQorICAgICAgICBlcSh0ZChtaWxsaXNlY29uZHM9MC4wMDEpLCB0ZChtaWNyb3NlY29uZHM9MSkpCisKKyAgICBkZWYgdGVzdF9jb21wdXRhdGlvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0ZCA9IHRpbWVkZWx0YQorCisgICAgICAgIGEgPSB0ZCg3KSAjIE9uZSB3ZWVrCisgICAgICAgIGIgPSB0ZCgwLCA2MCkgIyBPbmUgbWludXRlCisgICAgICAgIGMgPSB0ZCgwLCAwLCAxMDAwKSAjIE9uZSBtaWxsaXNlY29uZAorICAgICAgICBlcShhK2IrYywgdGQoNywgNjAsIDEwMDApKQorICAgICAgICBlcShhLWIsIHRkKDYsIDI0KjM2MDAgLSA2MCkpCisgICAgICAgIGVxKC1hLCB0ZCgtNykpCisgICAgICAgIGVxKCthLCB0ZCg3KSkKKyAgICAgICAgZXEoLWIsIHRkKC0xLCAyNCozNjAwIC0gNjApKQorICAgICAgICBlcSgtYywgdGQoLTEsIDI0KjM2MDAgLSAxLCA5OTkwMDApKQorICAgICAgICBlcShhYnMoYSksIGEpCisgICAgICAgIGVxKGFicygtYSksIGEpCisgICAgICAgIGVxKHRkKDYsIDI0KjM2MDApLCBhKQorICAgICAgICBlcSh0ZCgwLCAwLCA2MCoxMDAwMDAwKSwgYikKKyAgICAgICAgZXEoYSoxMCwgdGQoNzApKQorICAgICAgICBlcShhKjEwLCAxMCphKQorICAgICAgICBlcShhKjEwTCwgMTAqYSkKKyAgICAgICAgZXEoYioxMCwgdGQoMCwgNjAwKSkKKyAgICAgICAgZXEoMTAqYiwgdGQoMCwgNjAwKSkKKyAgICAgICAgZXEoYioxMEwsIHRkKDAsIDYwMCkpCisgICAgICAgIGVxKGMqMTAsIHRkKDAsIDAsIDEwMDAwKSkKKyAgICAgICAgZXEoMTAqYywgdGQoMCwgMCwgMTAwMDApKQorICAgICAgICBlcShjKjEwTCwgdGQoMCwgMCwgMTAwMDApKQorICAgICAgICBlcShhKi0xLCAtYSkKKyAgICAgICAgZXEoYiotMiwgLWItYikKKyAgICAgICAgZXEoYyotMiwgLWMrLWMpCisgICAgICAgIGVxKGIqKDYwKjI0KSwgKGIqNjApKjI0KQorICAgICAgICBlcShiKig2MCoyNCksICg2MCpiKSoyNCkKKyAgICAgICAgZXEoYyoxMDAwLCB0ZCgwLCAxKSkKKyAgICAgICAgZXEoMTAwMCpjLCB0ZCgwLCAxKSkKKyAgICAgICAgZXEoYS8vNywgdGQoMSkpCisgICAgICAgIGVxKGIvLzEwLCB0ZCgwLCA2KSkKKyAgICAgICAgZXEoYy8vMTAwMCwgdGQoMCwgMCwgMSkpCisgICAgICAgIGVxKGEvLzEwLCB0ZCgwLCA3KjI0KjM2MCkpCisgICAgICAgIGVxKGEvLzM2MDAwMDAsIHRkKDAsIDAsIDcqMjQqMTAwMCkpCisKKyAgICAgICAgIyBJc3N1ZSAjMTE1NzYKKyAgICAgICAgZXEodGQoOTk5OTk5OTk5LCA4NjM5OSwgOTk5OTk5KSAtIHRkKDk5OTk5OTk5OSwgODYzOTksIDk5OTk5OCksCisgICAgICAgICAgIHRkKDAsIDAsIDEpKQorICAgICAgICBlcSh0ZCg5OTk5OTk5OTksIDEsIDEpIC0gdGQoOTk5OTk5OTk5LCAxLCAwKSwKKyAgICAgICAgICAgdGQoMCwgMCwgMSkpCisKKworICAgIGRlZiB0ZXN0X2Rpc2FsbG93ZWRfY29tcHV0YXRpb25zKHNlbGYpOgorICAgICAgICBhID0gdGltZWRlbHRhKDQyKQorCisgICAgICAgICMgQWRkL3N1YiBpbnRzLCBsb25ncywgZmxvYXRzIHNob3VsZCBiZSBpbGxlZ2FsCisgICAgICAgIGZvciBpIGluIDEsIDFMLCAxLjA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEtaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBpK2EpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogaS1hKQorCisgICAgICAgICMgTXVsL2RpdiBieSBmbG9hdCBpc24ndCBzdXBwb3J0ZWQuCisgICAgICAgIHggPSAyLjMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEqeCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHgqYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEveCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHgvYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEgLy8geCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHggLy8gYSkKKworICAgICAgICAjIERpdmlzaW9uIG9mIGludCBieSB0aW1lZGVsdGEgZG9lc24ndCBtYWtlIHNlbnNlLgorICAgICAgICAjIERpdmlzaW9uIGJ5IHplcm8gZG9lc24ndCBtYWtlIHNlbnNlLgorICAgICAgICBmb3IgemVybyBpbiAwLCAwTDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB6ZXJvIC8vIGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGFtYmRhOiBhIC8vIHplcm8pCisKKyAgICBkZWYgdGVzdF9iYXNpY19hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBkYXlzLCBzZWNvbmRzLCB1cyA9IDEsIDcsIDMxCisgICAgICAgIHRkID0gdGltZWRlbHRhKGRheXMsIHNlY29uZHMsIHVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRkLmRheXMsIGRheXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQuc2Vjb25kcywgc2Vjb25kcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZC5taWNyb3NlY29uZHMsIHVzKQorCisgICAgZGVmIHRlc3RfdG90YWxfc2Vjb25kcyhzZWxmKToKKyAgICAgICAgdGQgPSB0aW1lZGVsdGEoZGF5cz0zNjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQudG90YWxfc2Vjb25kcygpLCAzMTUzNjAwMC4wKQorICAgICAgICBmb3IgdG90YWxfc2Vjb25kcyBpbiBbMTIzNDU2Ljc4OTAxMiwgLTEyMzQ1Ni43ODkwMTIsIDAuMTIzNDU2LCAwLCAxZTZdOgorICAgICAgICAgICAgdGQgPSB0aW1lZGVsdGEoc2Vjb25kcz10b3RhbF9zZWNvbmRzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZC50b3RhbF9zZWNvbmRzKCksIHRvdGFsX3NlY29uZHMpCisgICAgICAgICMgSXNzdWU4NjQ0OiBUZXN0IHRoYXQgdGQudG90YWxfc2Vjb25kcygpIGhhcyB0aGUgc2FtZQorICAgICAgICAjIGFjY3VyYWN5IGFzIHRkIC8gdGltZWRlbHRhKHNlY29uZHM9MSkuCisgICAgICAgIGZvciBtcyBpbiBbLTEsIC0yLCAtMTIzXToKKyAgICAgICAgICAgIHRkID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz1tcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQudG90YWxfc2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDI0KjM2MDAqdGQuZGF5cyArIHRkLnNlY29uZHMpKjEwKio2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRkLm1pY3Jvc2Vjb25kcykvMTAqKjYpCisKKyAgICBkZWYgdGVzdF9jYXJyaWVzKHNlbGYpOgorICAgICAgICB0MSA9IHRpbWVkZWx0YShkYXlzPTEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgd2Vla3M9LTcsCisgICAgICAgICAgICAgICAgICAgICAgIGhvdXJzPS0yNCooMTAwLTQ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWludXRlcz0tMywKKyAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcz0xMiwKKyAgICAgICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzPSgzKjYwIC0gMTIpICogMWU2ICsgMSkKKyAgICAgICAgdDIgPSB0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorCisgICAgZGVmIHRlc3RfaGFzaF9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgdDEgPSB0aW1lZGVsdGEoZGF5cz0xMDAsCisgICAgICAgICAgICAgICAgICAgICAgIHdlZWtzPS03LAorICAgICAgICAgICAgICAgICAgICAgICBob3Vycz0tMjQqKDEwMC00OSksCisgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZXM9LTMsCisgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHM9MTIsCisgICAgICAgICAgICAgICAgICAgICAgIG1pY3Jvc2Vjb25kcz0oMyo2MCAtIDEyKSAqIDEwMDAwMDApCisgICAgICAgIHQyID0gdGltZWRlbHRhKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQxKSwgaGFzaCh0MikpCisKKyAgICAgICAgdDEgKz0gdGltZWRlbHRhKHdlZWtzPTcpCisgICAgICAgIHQyICs9IHRpbWVkZWx0YShkYXlzPTcqNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godDIpKQorCisgICAgICAgIGQgPSB7dDE6IDF9CisgICAgICAgIGRbdDJdID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW3QxXSwgMikKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBhcmdzID0gMTIsIDM0LCA1NgorICAgICAgICBvcmlnID0gdGltZWRlbHRhKCphcmdzKQorICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKKyAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKKyAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYpOgorICAgICAgICB0MSA9IHRpbWVkZWx0YSgyLCAzLCA0KQorICAgICAgICB0MiA9IHRpbWVkZWx0YSgyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMCkKKworICAgICAgICBmb3IgYXJncyBpbiAoMywgMywgMyksICgyLCA0LCA0KSwgKDIsIDMsIDUpOgorICAgICAgICAgICAgdDIgPSB0aW1lZGVsdGEoKmFyZ3MpICAgIyB0aGlzIGlzIGxhcmdlciB0aGFuIHQxCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID49IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyICE9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKKworICAgICAgICBmb3IgYmFkYXJnIGluIE9USEVSU1RVRkY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxID09IGJhZGFyZywgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxICE9IGJhZGFyZywgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFkYXJnID09IHQxLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFkYXJnICE9IHQxLCBUcnVlKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPD0gYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxIDwgYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID4gYmFkYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID49IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBiYWRhcmcgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnID49IHQxKQorCisgICAgZGVmIHRlc3Rfc3RyKHNlbGYpOgorICAgICAgICB0ZCA9IHRpbWVkZWx0YQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBlcShzdHIodGQoMSkpLCAiMSBkYXksIDA6MDA6MDAiKQorICAgICAgICBlcShzdHIodGQoLTEpKSwgIi0xIGRheSwgMDowMDowMCIpCisgICAgICAgIGVxKHN0cih0ZCgyKSksICIyIGRheXMsIDA6MDA6MDAiKQorICAgICAgICBlcShzdHIodGQoLTIpKSwgIi0yIGRheXMsIDA6MDA6MDAiKQorCisgICAgICAgIGVxKHN0cih0ZChob3Vycz0xMiwgbWludXRlcz01OCwgc2Vjb25kcz01OSkpLCAiMTI6NTg6NTkiKQorICAgICAgICBlcShzdHIodGQoaG91cnM9MiwgbWludXRlcz0zLCBzZWNvbmRzPTQpKSwgIjI6MDM6MDQiKQorICAgICAgICBlcShzdHIodGQod2Vla3M9LTMwLCBob3Vycz0yMywgbWludXRlcz0xMiwgc2Vjb25kcz0zNCkpLAorICAgICAgICAgICAiLTIxMCBkYXlzLCAyMzoxMjozNCIpCisKKyAgICAgICAgZXEoc3RyKHRkKG1pbGxpc2Vjb25kcz0xKSksICIwOjAwOjAwLjAwMTAwMCIpCisgICAgICAgIGVxKHN0cih0ZChtaWNyb3NlY29uZHM9MykpLCAiMDowMDowMC4wMDAwMDMiKQorCisgICAgICAgIGVxKHN0cih0ZChkYXlzPTk5OTk5OTk5OSwgaG91cnM9MjMsIG1pbnV0ZXM9NTksIHNlY29uZHM9NTksCisgICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzPTk5OTk5OSkpLAorICAgICAgICAgICAiOTk5OTk5OTk5IGRheXMsIDIzOjU5OjU5Ljk5OTk5OSIpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CisgICAgICAgIGZvciB0ZCBpbiAodGltZWRlbHRhKGRheXM9OTk5OTk5OTk5LCBob3Vycz0yMywgbWludXRlcz01OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcz01OSwgbWljcm9zZWNvbmRzPTk5OTk5OSksCisgICAgICAgICAgICAgICAgICAgdGltZWRlbHRhKGRheXM9LTk5OTk5OTk5OSksCisgICAgICAgICAgICAgICAgICAgdGltZWRlbHRhKGRheXM9MSwgc2Vjb25kcz0yLCBtaWNyb3NlY29uZHM9MykpOgorCisgICAgICAgICAgICAjIFZlcmlmeSB0ZCAtPiBzdHJpbmcgLT4gdGQgaWRlbnRpdHkuCisgICAgICAgICAgICBzID0gcmVwcih0ZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQorICAgICAgICAgICAgcyA9IHNbOTpdCisgICAgICAgICAgICB0ZDIgPSBldmFsKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRkLCB0ZDIpCisKKyAgICAgICAgICAgICMgVmVyaWZ5IGlkZW50aXR5IHZpYSByZWNvbnN0cnVjdGluZyBmcm9tIHBpZWNlcy4KKyAgICAgICAgICAgIHRkMiA9IHRpbWVkZWx0YSh0ZC5kYXlzLCB0ZC5zZWNvbmRzLCB0ZC5taWNyb3NlY29uZHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRkLCB0ZDIpCisKKyAgICBkZWYgdGVzdF9yZXNvbHV0aW9uX2luZm8oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0aW1lZGVsdGEubWluLCB0aW1lZGVsdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0aW1lZGVsdGEubWF4LCB0aW1lZGVsdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0aW1lZGVsdGEucmVzb2x1dGlvbiwgdGltZWRlbHRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZWRlbHRhLm1heCA+IHRpbWVkZWx0YS5taW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZWRlbHRhLm1pbiwgdGltZWRlbHRhKC05OTk5OTk5OTkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWVkZWx0YS5tYXgsIHRpbWVkZWx0YSg5OTk5OTk5OTksIDI0KjM2MDAtMSwgMWU2LTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWVkZWx0YS5yZXNvbHV0aW9uLCB0aW1lZGVsdGEoMCwgMCwgMSkpCisKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgdGlueSA9IHRpbWVkZWx0YS5yZXNvbHV0aW9uCisKKyAgICAgICAgdGQgPSB0aW1lZGVsdGEubWluICsgdGlueQorICAgICAgICB0ZCAtPSB0aW55ICAjIG5vIHByb2JsZW0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdGQuX19zdWJfXywgdGlueSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdGQuX19hZGRfXywgLXRpbnkpCisKKyAgICAgICAgdGQgPSB0aW1lZGVsdGEubWF4IC0gdGlueQorICAgICAgICB0ZCArPSB0aW55ICAjIG5vIHByb2JsZW0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdGQuX19hZGRfXywgdGlueSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdGQuX19zdWJfXywgLXRpbnkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbGFtYmRhOiAtdGltZWRlbHRhLm1heCkKKworICAgIGRlZiB0ZXN0X21pY3Jvc2Vjb25kX3JvdW5kaW5nKHNlbGYpOgorICAgICAgICB0ZCA9IHRpbWVkZWx0YQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICAjIFNpbmdsZS1maWVsZCByb3VuZGluZy4KKyAgICAgICAgZXEodGQobWlsbGlzZWNvbmRzPTAuNC8xMDAwKSwgdGQoMCkpICAgICMgcm91bmRzIHRvIDAKKyAgICAgICAgZXEodGQobWlsbGlzZWNvbmRzPS0wLjQvMTAwMCksIHRkKDApKSAgICAjIHJvdW5kcyB0byAwCisgICAgICAgIGVxKHRkKG1pbGxpc2Vjb25kcz0wLjYvMTAwMCksIHRkKG1pY3Jvc2Vjb25kcz0xKSkKKyAgICAgICAgZXEodGQobWlsbGlzZWNvbmRzPS0wLjYvMTAwMCksIHRkKG1pY3Jvc2Vjb25kcz0tMSkpCisKKyAgICAgICAgIyBSb3VuZGluZyBkdWUgdG8gY29udHJpYnV0aW9ucyBmcm9tIG1vcmUgdGhhbiBvbmUgZmllbGQuCisgICAgICAgIHVzX3Blcl9ob3VyID0gMzYwMGU2CisgICAgICAgIHVzX3Blcl9kYXkgPSB1c19wZXJfaG91ciAqIDI0CisgICAgICAgIGVxKHRkKGRheXM9LjQvdXNfcGVyX2RheSksIHRkKDApKQorICAgICAgICBlcSh0ZChob3Vycz0uMi91c19wZXJfaG91ciksIHRkKDApKQorICAgICAgICBlcSh0ZChkYXlzPS40L3VzX3Blcl9kYXksIGhvdXJzPS4yL3VzX3Blcl9ob3VyKSwgdGQobWljcm9zZWNvbmRzPTEpKQorCisgICAgICAgIGVxKHRkKGRheXM9LS40L3VzX3Blcl9kYXkpLCB0ZCgwKSkKKyAgICAgICAgZXEodGQoaG91cnM9LS4yL3VzX3Blcl9ob3VyKSwgdGQoMCkpCisgICAgICAgIGVxKHRkKGRheXM9LS40L3VzX3Blcl9kYXksIGhvdXJzPS0uMi91c19wZXJfaG91ciksIHRkKG1pY3Jvc2Vjb25kcz0tMSkpCisKKyAgICBkZWYgdGVzdF9tYXNzaXZlX25vcm1hbGl6YXRpb24oc2VsZik6CisgICAgICAgIHRkID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodGQuZGF5cywgdGQuc2Vjb25kcywgdGQubWljcm9zZWNvbmRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoLTEsIDI0KjM2MDAtMSwgOTk5OTk5KSkKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHRpbWVkZWx0YSgwKSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3RpbWVkZWx0YShzZWxmKToKKworICAgICAgICBjbGFzcyBUKHRpbWVkZWx0YSk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgZnJvbV90ZCh0ZCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFQodGQuZGF5cywgdGQuc2Vjb25kcywgdGQubWljcm9zZWNvbmRzKQorCisgICAgICAgICAgICBkZWYgYXNfaG91cnMoc2VsZik6CisgICAgICAgICAgICAgICAgc3VtID0gKHNlbGYuZGF5cyAqIDI0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWNvbmRzIC8gMzYwMC4wICsKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5taWNyb3NlY29uZHMgLyAzNjAwZTYpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJvdW5kKHN1bSkKKworICAgICAgICB0MSA9IFQoZGF5cz0xKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0MSkgaXMgVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5hc19ob3VycygpLCAyNCkKKworICAgICAgICB0MiA9IFQoZGF5cz0tMSwgc2Vjb25kcz0tMzYwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodDIpIGlzIFQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuYXNfaG91cnMoKSwgLTI1KQorCisgICAgICAgIHQzID0gdDEgKyB0MgorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0MykgaXMgdGltZWRlbHRhKQorICAgICAgICB0NCA9IFQuZnJvbV90ZCh0MykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodDQpIGlzIFQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMuZGF5cywgdDQuZGF5cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5zZWNvbmRzLCB0NC5zZWNvbmRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLm1pY3Jvc2Vjb25kcywgdDQubWljcm9zZWNvbmRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0MyksIHN0cih0NCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDQuYXNfaG91cnMoKSwgLTEpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGRhdGUgdGVzdHMKKworY2xhc3MgVGVzdERhdGVPbmx5KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3RzIGhlcmUgd29uJ3QgcGFzcyBpZiBhbHNvIHJ1biBvbiBkYXRldGltZSBvYmplY3RzLCBzbyBkb24ndAorICAgICMgc3ViY2xhc3MgdGhpcyB0byB0ZXN0IGRhdGV0aW1lcyB0b28uCisKKyAgICBkZWYgdGVzdF9kZWx0YV9ub25fZGF5c19pZ25vcmVkKHNlbGYpOgorICAgICAgICBkdCA9IGRhdGUoMjAwMCwgMSwgMikKKyAgICAgICAgZGVsdGEgPSB0aW1lZGVsdGEoZGF5cz0xLCBob3Vycz0yLCBtaW51dGVzPTMsIHNlY29uZHM9NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm9zZWNvbmRzPTUpCisgICAgICAgIGRheXMgPSB0aW1lZGVsdGEoZGVsdGEuZGF5cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXlzLCB0aW1lZGVsdGEoMSkpCisKKyAgICAgICAgZHQyID0gZHQgKyBkZWx0YQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiwgZHQgKyBkYXlzKQorCisgICAgICAgIGR0MiA9IGRlbHRhICsgZHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIsIGR0ICsgZGF5cykKKworICAgICAgICBkdDIgPSBkdCAtIGRlbHRhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLCBkdCAtIGRheXMpCisKKyAgICAgICAgZGVsdGEgPSAtZGVsdGEKKyAgICAgICAgZGF5cyA9IHRpbWVkZWx0YShkZWx0YS5kYXlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRheXMsIHRpbWVkZWx0YSgtMikpCisKKyAgICAgICAgZHQyID0gZHQgKyBkZWx0YQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiwgZHQgKyBkYXlzKQorCisgICAgICAgIGR0MiA9IGRlbHRhICsgZHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIsIGR0ICsgZGF5cykKKworICAgICAgICBkdDIgPSBkdCAtIGRlbHRhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLCBkdCAtIGRheXMpCisKK2NsYXNzIFN1YmNsYXNzRGF0ZShkYXRlKToKKyAgICBzdWJfdmFyID0gMQorCitjbGFzcyBUZXN0RGF0ZShIYXJtbGVzc01peGVkQ29tcGFyaXNvbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdHMgaGVyZSBzaG91bGQgcGFzcyBmb3IgYm90aCBkYXRlcyBhbmQgZGF0ZXRpbWVzLCBleGNlcHQgZm9yIGEKKyAgICAjIGZldyB0ZXN0cyB0aGF0IFRlc3REYXRlVGltZSBvdmVycmlkZXMuCisKKyAgICB0aGVjbGFzcyA9IGRhdGUKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnllYXIsIDIwMDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQubW9udGgsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZGF5LCAxKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwKHNlbGYpOgorICAgICAgICBmb3IgZHQgaW4gKHNlbGYudGhlY2xhc3MoMSwgMiwgMyksCisgICAgICAgICAgICAgICAgICAgc2VsZi50aGVjbGFzcy50b2RheSgpKToKKyAgICAgICAgICAgICMgVmVyaWZ5IGR0IC0+IHN0cmluZyAtPiBkYXRlIGlkZW50aXR5LgorICAgICAgICAgICAgcyA9IHJlcHIoZHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCdkYXRldGltZS4nKSkKKyAgICAgICAgICAgIHMgPSBzWzk6XQorICAgICAgICAgICAgZHQyID0gZXZhbChzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQorCisgICAgICAgICAgICAjIFZlcmlmeSBpZGVudGl0eSB2aWEgcmVjb25zdHJ1Y3RpbmcgZnJvbSBwaWVjZXMuCisgICAgICAgICAgICBkdDIgPSBzZWxmLnRoZWNsYXNzKGR0LnllYXIsIGR0Lm1vbnRoLCBkdC5kYXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LCBkdDIpCisKKyAgICBkZWYgdGVzdF9vcmRpbmFsX2NvbnZlcnNpb25zKHNlbGYpOgorICAgICAgICAjIENoZWNrIHNvbWUgZml4ZWQgdmFsdWVzLgorICAgICAgICBmb3IgeSwgbSwgZCwgbiBpbiBbKDEsIDEsIDEsIDEpLCAgICAgICMgY2FsZW5kYXIgb3JpZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgMTIsIDMxLCAzNjUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsIDEsIDEsIDM2NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZpcnN0IGV4YW1wbGUgZnJvbSAiQ2FsZW5kcmljYWwgQ2FsY3VsYXRpb25zIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5NDUsIDExLCAxMiwgNzEwMzQ3KV06CisgICAgICAgICAgICBkID0gc2VsZi50aGVjbGFzcyh5LCBtLCBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCBkLnRvb3JkaW5hbCgpKQorICAgICAgICAgICAgZnJvbW9yZCA9IHNlbGYudGhlY2xhc3MuZnJvbW9yZGluYWwobikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZnJvbW9yZCkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZnJvbW9yZCwgImhvdXIiKToKKyAgICAgICAgICAgICMgaWYgd2UncmUgY2hlY2tpbmcgc29tZXRoaW5nIGZhbmNpZXIgdGhhbiBhIGRhdGUsIHZlcmlmeQorICAgICAgICAgICAgIyB0aGUgZXh0cmEgZmllbGRzIGhhdmUgYmVlbiB6ZXJvZWQgb3V0CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcm9tb3JkLmhvdXIsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcm9tb3JkLm1pbnV0ZSwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyb21vcmQuc2Vjb25kLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnJvbW9yZC5taWNyb3NlY29uZCwgMCkKKworICAgICAgICAjIENoZWNrIGZpcnN0IGFuZCBsYXN0IGRheXMgb2YgeWVhciBzcG90dGlseSBhY3Jvc3MgdGhlIHdob2xlCisgICAgICAgICMgcmFuZ2Ugb2YgeWVhcnMgc3VwcG9ydGVkLgorICAgICAgICBmb3IgeWVhciBpbiB4cmFuZ2UoTUlOWUVBUiwgTUFYWUVBUisxLCA3KToKKyAgICAgICAgICAgICMgVmVyaWZ5ICh5ZWFyLCAxLCAxKSAtPiBvcmRpbmFsIC0+IHksIG0sIGQgaXMgaWRlbnRpdHkuCisgICAgICAgICAgICBkID0gc2VsZi50aGVjbGFzcyh5ZWFyLCAxLCAxKQorICAgICAgICAgICAgbiA9IGQudG9vcmRpbmFsKCkKKyAgICAgICAgICAgIGQyID0gc2VsZi50aGVjbGFzcy5mcm9tb3JkaW5hbChuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkMikKKyAgICAgICAgICAgICMgVmVyaWZ5IHRoYXQgbW92aW5nIGJhY2sgYSBkYXkgZ2V0cyB0byB0aGUgZW5kIG9mIHllYXItMS4KKyAgICAgICAgICAgIGlmIHllYXIgPiAxOgorICAgICAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzLmZyb21vcmRpbmFsKG4tMSkKKyAgICAgICAgICAgICAgICBkMiA9IHNlbGYudGhlY2xhc3MoeWVhci0xLCAxMiwgMzEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLnRvb3JkaW5hbCgpLCBuLTEpCisKKyAgICAgICAgIyBUZXN0IGV2ZXJ5IGRheSBpbiBhIGxlYXAteWVhciBhbmQgYSBub24tbGVhcCB5ZWFyLgorICAgICAgICBkaW0gPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV0KKyAgICAgICAgZm9yIHllYXIsIGlzbGVhcCBpbiAoMjAwMCwgVHJ1ZSksICgyMDAyLCBGYWxzZSk6CisgICAgICAgICAgICBuID0gc2VsZi50aGVjbGFzcyh5ZWFyLCAxLCAxKS50b29yZGluYWwoKQorICAgICAgICAgICAgZm9yIG1vbnRoLCBtYXhkYXkgaW4gemlwKHJhbmdlKDEsIDEzKSwgZGltKToKKyAgICAgICAgICAgICAgICBpZiBtb250aCA9PSAyIGFuZCBpc2xlYXA6CisgICAgICAgICAgICAgICAgICAgIG1heGRheSArPSAxCisgICAgICAgICAgICAgICAgZm9yIGRheSBpbiByYW5nZSgxLCBtYXhkYXkrMSk6CisgICAgICAgICAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKHllYXIsIG1vbnRoLCBkYXkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC50b29yZGluYWwoKSwgbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBzZWxmLnRoZWNsYXNzLmZyb21vcmRpbmFsKG4pKQorICAgICAgICAgICAgICAgICAgICBuICs9IDEKKworICAgIGRlZiB0ZXN0X2V4dHJlbWVfb3JkaW5hbHMoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzLm1pbgorICAgICAgICBhID0gc2VsZi50aGVjbGFzcyhhLnllYXIsIGEubW9udGgsIGEuZGF5KSAgIyBnZXQgcmlkIG9mIHRpbWUgcGFydHMKKyAgICAgICAgYW9yZCA9IGEudG9vcmRpbmFsKCkKKyAgICAgICAgYiA9IGEuZnJvbW9yZGluYWwoYW9yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogYS5mcm9tb3JkaW5hbChhb3JkIC0gMSkpCisKKyAgICAgICAgYiA9IGEgKyB0aW1lZGVsdGEoZGF5cz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIudG9vcmRpbmFsKCksIGFvcmQgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudGhlY2xhc3MuZnJvbW9yZGluYWwoYW9yZCArIDEpKQorCisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzLm1heAorICAgICAgICBhID0gc2VsZi50aGVjbGFzcyhhLnllYXIsIGEubW9udGgsIGEuZGF5KSAgIyBnZXQgcmlkIG9mIHRpbWUgcGFydHMKKyAgICAgICAgYW9yZCA9IGEudG9vcmRpbmFsKCkKKyAgICAgICAgYiA9IGEuZnJvbW9yZGluYWwoYW9yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogYS5mcm9tb3JkaW5hbChhb3JkICsgMSkpCisKKyAgICAgICAgYiA9IGEgLSB0aW1lZGVsdGEoZGF5cz0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIudG9vcmRpbmFsKCksIGFvcmQgLSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIHNlbGYudGhlY2xhc3MuZnJvbW9yZGluYWwoYW9yZCAtIDEpKQorCisgICAgZGVmIHRlc3RfYmFkX2NvbnN0cnVjdG9yX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgIyBiYWQgeWVhcnMKKyAgICAgICAgc2VsZi50aGVjbGFzcyhNSU5ZRUFSLCAxLCAxKSAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcyhNQVhZRUFSLCAxLCAxKSAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgTUlOWUVBUi0xLCAxLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCBNQVhZRUFSKzEsIDEsIDEpCisgICAgICAgICMgYmFkIG1vbnRocworICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDEsIDEpICAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMTIsIDEpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMTMsIDEpCisgICAgICAgICMgYmFkIGRheXMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAyLCAyOSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDQsIDIsIDI5KSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjQwMCwgMiwgMjkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMiwgMzApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDEsIDIsIDI5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMTAwLCAyLCAyOSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMTkwMCwgMiwgMjkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDAsIDEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDAsIDEsIDMyKQorCisgICAgZGVmIHRlc3RfaGFzaF9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwMCwgMTIsIDMxKQorICAgICAgICAjIHNhbWUgdGhpbmcKKyAgICAgICAgZSA9IHNlbGYudGhlY2xhc3MoMjAwMCwgMTIsIDMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgaGFzaChlKSkKKworICAgICAgICBkaWMgPSB7ZDogMX0KKyAgICAgICAgZGljW2VdID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tkXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWNbZV0sIDIpCisKKyAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMjAwMSwgIDEsICAxKQorICAgICAgICAjIHNhbWUgdGhpbmcKKyAgICAgICAgZSA9IHNlbGYudGhlY2xhc3MoMjAwMSwgIDEsICAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgaGFzaChlKSkKKworICAgICAgICBkaWMgPSB7ZDogMX0KKyAgICAgICAgZGljW2VdID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tkXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWNbZV0sIDIpCisKKyAgICBkZWYgdGVzdF9jb21wdXRhdGlvbnMoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDEsIDMxKQorICAgICAgICBiID0gc2VsZi50aGVjbGFzcygxOTU2LCAxLCAzMSkKKworICAgICAgICBkaWZmID0gYS1iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlmZi5kYXlzLCA0NiozNjUgKyBsZW4ocmFuZ2UoMTk1NiwgMjAwMiwgNCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmYuc2Vjb25kcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWZmLm1pY3Jvc2Vjb25kcywgMCkKKworICAgICAgICBkYXkgPSB0aW1lZGVsdGEoMSkKKyAgICAgICAgd2VlayA9IHRpbWVkZWx0YSg3KQorICAgICAgICBhID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyBkYXksIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF5ICsgYSwgc2VsZi50aGVjbGFzcygyMDAyLCAzLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gZGF5LCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC1kYXkgKyBhLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyB3ZWVrLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSB3ZWVrLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDIsIDIzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgNTIqd2Vlaywgc2VsZi50aGVjbGFzcygyMDAzLCAzLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gNTIqd2Vlaywgc2VsZi50aGVjbGFzcygyMDAxLCAzLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSArIHdlZWspIC0gYSwgd2VlaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSArIGRheSkgLSBhLCBkYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgLSB3ZWVrKSAtIGEsIC13ZWVrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhIC0gZGF5KSAtIGEsIC1kYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhICsgd2VlayksIC13ZWVrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAoYSArIGRheSksIC1kYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhIC0gd2VlayksIHdlZWspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhIC0gZGF5KSwgZGF5KQorCisgICAgICAgICMgQWRkL3N1YiBpbnRzLCBsb25ncywgZmxvYXRzIHNob3VsZCBiZSBpbGxlZ2FsCisgICAgICAgIGZvciBpIGluIDEsIDFMLCAxLjA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEtaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBpK2EpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogaS1hKQorCisgICAgICAgICMgZGVsdGEgLSBkYXRlIGlzIHNlbnNlbGVzcy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGRheSAtIGEpCisgICAgICAgICMgbWl4aW5nIGRhdGUgYW5kIChkZWx0YSBvciBkYXRlKSB2aWEgKiBvciAvLyBpcyBzZW5zZWxlc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGRheSAqIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhICogZGF5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZGF5IC8vIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhIC8vIGRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEgKiBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSAvLyBhKQorICAgICAgICAjIGRhdGUgKyBkYXRlIGlzIHNlbnNlbGVzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSArIGEpCisKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgdGlueSA9IHNlbGYudGhlY2xhc3MucmVzb2x1dGlvbgorCisgICAgICAgIGZvciBkZWx0YSBpbiBbdGlueSwgdGltZWRlbHRhKDEpLCB0aW1lZGVsdGEoMildOgorICAgICAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzLm1pbiArIGRlbHRhCisgICAgICAgICAgICBkdCAtPSBkZWx0YSAgIyBubyBwcm9ibGVtCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBkdC5fX3N1Yl9fLCBkZWx0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGR0Ll9fYWRkX18sIC1kZWx0YSkKKworICAgICAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzLm1heCAtIGRlbHRhCisgICAgICAgICAgICBkdCArPSBkZWx0YSAgIyBubyBwcm9ibGVtCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBkdC5fX2FkZF9fLCBkZWx0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGR0Ll9fc3ViX18sIC1kZWx0YSkKKworICAgIGRlZiB0ZXN0X2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgIGltcG9ydCB0aW1lCisKKyAgICAgICAgIyBUcnkgYW4gYXJiaXRyYXJ5IGZpeGVkIHZhbHVlLgorICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gMTk5OSwgOSwgMTkKKyAgICAgICAgdHMgPSB0aW1lLm1rdGltZSgoeWVhciwgbW9udGgsIGRheSwgMCwgMCwgMCwgMCwgMCwgLTEpKQorICAgICAgICBkID0gc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKHRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQueWVhciwgeWVhcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLm1vbnRoLCBtb250aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmRheSwgZGF5KQorCisgICAgZGVmIHRlc3RfaW5zYW5lX2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgcGxhdGZvcm0gbWFwcyB0aW1lX3QgdG8gZG91YmxlLAorICAgICAgICAjIGFuZCB0aGF0IHRoaXMgdGVzdCB3aWxsIGZhaWwgdGhlcmUuICBUaGlzIHRlc3Qgc2hvdWxkCisgICAgICAgICMgZXhlbXB0IHN1Y2ggcGxhdGZvcm1zIChwcm92aWRlZCB0aGV5IHJldHVybiByZWFzb25hYmxlCisgICAgICAgICMgcmVzdWx0cyEpLgorICAgICAgICBmb3IgaW5zYW5lIGluIC0xZTIwMCwgMWUyMDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNhbmUpCisKKyAgICBkZWYgdGVzdF90b2RheShzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKworICAgICAgICAjIFdlIGNsYWltIHRoYXQgdG9kYXkoKSBpcyBsaWtlIGZyb210aW1lc3RhbXAodGltZS50aW1lKCkpLCBzbworICAgICAgICAjIHByb3ZlIGl0LgorICAgICAgICBmb3IgZHVtbXkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICB0b2RheSA9IHNlbGYudGhlY2xhc3MudG9kYXkoKQorICAgICAgICAgICAgdHMgPSB0aW1lLnRpbWUoKQorICAgICAgICAgICAgdG9kYXlhZ2FpbiA9IHNlbGYudGhlY2xhc3MuZnJvbXRpbWVzdGFtcCh0cykKKyAgICAgICAgICAgIGlmIHRvZGF5ID09IHRvZGF5YWdhaW46CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgVGhlcmUgYXJlIHNldmVyYWwgbGVnaXQgcmVhc29ucyB0aGF0IGNvdWxkIGZhaWw6CisgICAgICAgICAgICAjIDEuIEl0IHJlY2VudGx5IGJlY2FtZSBtaWRuaWdodCwgYmV0d2VlbiB0aGUgdG9kYXkoKSBhbmQgdGhlCisgICAgICAgICAgICAjICAgIHRpbWUoKSBjYWxscy4KKyAgICAgICAgICAgICMgMi4gVGhlIHBsYXRmb3JtIHRpbWUoKSBoYXMgc3VjaCBmaW5lIHJlc29sdXRpb24gdGhhdCB3ZSdsbAorICAgICAgICAgICAgIyAgICBuZXZlciBnZXQgdGhlIHNhbWUgdmFsdWUgdHdpY2UuCisgICAgICAgICAgICAjIDMuIFRoZSBwbGF0Zm9ybSB0aW1lKCkgaGFzIHBvb3IgcmVzb2x1dGlvbiwgYW5kIHdlIGp1c3QKKyAgICAgICAgICAgICMgICAgaGFwcGVuZWQgdG8gY2FsbCB0b2RheSgpIHJpZ2h0IGJlZm9yZSBhIHJlc29sdXRpb24gcXVhbnR1bQorICAgICAgICAgICAgIyAgICBib3VuZGFyeS4KKyAgICAgICAgICAgICMgNC4gVGhlIHN5c3RlbSBjbG9jayBnb3QgZmlkZGxlZCBiZXR3ZWVuIGNhbGxzLgorICAgICAgICAgICAgIyBJbiBhbnkgY2FzZSwgd2FpdCBhIGxpdHRsZSB3aGlsZSBhbmQgdHJ5IGFnYWluLgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisKKyAgICAgICAgIyBJdCB3b3JrZWQgb3IgaXQgZGlkbid0LiAgSWYgaXQgZGlkbid0LCBhc3N1bWUgaXQncyByZWFzb24gIzIsIGFuZAorICAgICAgICAjIGxldCB0aGUgdGVzdCBwYXNzIGlmIHRoZXkncmUgd2l0aGluIGhhbGYgYSBzZWNvbmQgb2YgZWFjaCBvdGhlci4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRvZGF5ID09IHRvZGF5YWdhaW4gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGFicyh0b2RheWFnYWluIC0gdG9kYXkpIDwgdGltZWRlbHRhKHNlY29uZHM9MC41KSkKKworICAgIGRlZiB0ZXN0X3dlZWtkYXkoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgIyBNYXJjaCA0LCAyMDAyIGlzIGEgTW9uZGF5CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhlY2xhc3MoMjAwMiwgMywgNCtpKS53ZWVrZGF5KCksIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhlY2xhc3MoMjAwMiwgMywgNCtpKS5pc293ZWVrZGF5KCksIGkrMSkKKyAgICAgICAgICAgICMgSmFudWFyeSAyLCAxOTU2IGlzIGEgTW9uZGF5CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhlY2xhc3MoMTk1NiwgMSwgMitpKS53ZWVrZGF5KCksIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhlY2xhc3MoMTk1NiwgMSwgMitpKS5pc293ZWVrZGF5KCksIGkrMSkKKworICAgIGRlZiB0ZXN0X2lzb2NhbGVuZGFyKHNlbGYpOgorICAgICAgICAjIENoZWNrIGV4YW1wbGVzIGZyb20KKyAgICAgICAgIyBodHRwOi8vd3d3LnBoeXMudXUubmwvfnZnZW50L2NhbGVuZGFyL2lzb2NhbGVuZGFyLmh0bQorICAgICAgICBmb3IgaSBpbiByYW5nZSg3KToKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDMsIDEyLCAyMitpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmlzb2NhbGVuZGFyKCksICgyMDAzLCA1MiwgaSsxKSkKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDMsIDEyLCAyOSkgKyB0aW1lZGVsdGEoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc29jYWxlbmRhcigpLCAoMjAwNCwgMSwgaSsxKSkKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDQsIDEsIDUraSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc29jYWxlbmRhcigpLCAoMjAwNCwgMiwgaSsxKSkKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDksIDEyLCAyMStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmlzb2NhbGVuZGFyKCksICgyMDA5LCA1MiwgaSsxKSkKKyAgICAgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDksIDEyLCAyOCkgKyB0aW1lZGVsdGEoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc29jYWxlbmRhcigpLCAoMjAwOSwgNTMsIGkrMSkpCisgICAgICAgICAgICBkID0gc2VsZi50aGVjbGFzcygyMDEwLCAxLCA0K2kpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXNvY2FsZW5kYXIoKSwgKDIwMTAsIDEsIGkrMSkpCisKKyAgICBkZWYgdGVzdF9pc29fbG9uZ195ZWFycyhzZWxmKToKKyAgICAgICAgIyBDYWxjdWxhdGUgbG9uZyBJU08geWVhcnMgYW5kIGNvbXBhcmUgdG8gdGFibGUgZnJvbQorICAgICAgICAjIGh0dHA6Ly93d3cucGh5cy51dS5ubC9+dmdlbnQvY2FsZW5kYXIvaXNvY2FsZW5kYXIuaHRtCisgICAgICAgIElTT19MT05HX1lFQVJTX1RBQkxFID0gIiIiCisgICAgICAgICAgICAgIDQgICAzMiAgIDYwICAgODgKKyAgICAgICAgICAgICAgOSAgIDM3ICAgNjUgICA5MworICAgICAgICAgICAgIDE1ICAgNDMgICA3MSAgIDk5CisgICAgICAgICAgICAgMjAgICA0OCAgIDc2CisgICAgICAgICAgICAgMjYgICA1NCAgIDgyCisKKyAgICAgICAgICAgIDEwNSAgMTMzICAxNjEgIDE4OQorICAgICAgICAgICAgMTExICAxMzkgIDE2NyAgMTk1CisgICAgICAgICAgICAxMTYgIDE0NCAgMTcyCisgICAgICAgICAgICAxMjIgIDE1MCAgMTc4CisgICAgICAgICAgICAxMjggIDE1NiAgMTg0CisKKyAgICAgICAgICAgIDIwMSAgMjI5ICAyNTcgIDI4NQorICAgICAgICAgICAgMjA3ICAyMzUgIDI2MyAgMjkxCisgICAgICAgICAgICAyMTIgIDI0MCAgMjY4ICAyOTYKKyAgICAgICAgICAgIDIxOCAgMjQ2ICAyNzQKKyAgICAgICAgICAgIDIyNCAgMjUyICAyODAKKworICAgICAgICAgICAgMzAzICAzMzEgIDM1OSAgMzg3CisgICAgICAgICAgICAzMDggIDMzNiAgMzY0ICAzOTIKKyAgICAgICAgICAgIDMxNCAgMzQyICAzNzAgIDM5OAorICAgICAgICAgICAgMzIwICAzNDggIDM3NgorICAgICAgICAgICAgMzI1ICAzNTMgIDM4MQorICAgICAgICAiIiIKKyAgICAgICAgaXNvX2xvbmdfeWVhcnMgPSBtYXAoaW50LCBJU09fTE9OR19ZRUFSU19UQUJMRS5zcGxpdCgpKQorICAgICAgICBpc29fbG9uZ195ZWFycy5zb3J0KCkKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDQwMCk6CisgICAgICAgICAgICBkID0gc2VsZi50aGVjbGFzcygyMDAwK2ksIDEyLCAzMSkKKyAgICAgICAgICAgIGQxID0gc2VsZi50aGVjbGFzcygxNjAwK2ksIDEyLCAzMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pc29jYWxlbmRhcigpWzE6XSwgZDEuaXNvY2FsZW5kYXIoKVsxOl0pCisgICAgICAgICAgICBpZiBkLmlzb2NhbGVuZGFyKClbMV0gPT0gNTM6CisgICAgICAgICAgICAgICAgTC5hcHBlbmQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMLCBpc29fbG9uZ195ZWFycykKKworICAgIGRlZiB0ZXN0X2lzb2Zvcm1hdChzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMiwgMywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDAwMi0wMy0wMiIpCisKKyAgICBkZWYgdGVzdF9jdGltZShzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmN0aW1lKCksICJTYXQgTWFyICAyIDAwOjAwOjAwIDIwMDIiKQorCisgICAgZGVmIHRlc3Rfc3RyZnRpbWUoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDUsIDMsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zdHJmdGltZSgibTolbSBkOiVkIHk6JXkiKSwgIm06MDMgZDowMiB5OjA1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCIiKSwgIiIpICMgU0YgYnVnICM3NjEzMzcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCd4JyoxMDAwKSwgJ3gnKjEwMDApICMgU0YgYnVnICMxNTU2Nzg0CisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LnN0cmZ0aW1lKSAjIG5lZWRzIGFuIGFyZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUsICJvbmUiLCAidHdvIikgIyB0b28gbWFueSBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5zdHJmdGltZSwgNDIpICMgYXJnIHdyb25nIHR5cGUKKworICAgICAgICAjIHRlc3QgdGhhdCB1bmljb2RlIGlucHV0IGlzIGFsbG93ZWQgKGlzc3VlIDI3ODIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5zdHJmdGltZSh1IiVtIiksICIwMyIpCisKKyAgICAgICAgIyBBIG5haXZlIG9iamVjdCByZXBsYWNlcyAleiBhbmQgJVogdy8gZW1wdHkgc3RyaW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCInJXonICclWiciKSwgIicnICcnIikKKworICAgICAgICAjbWFrZSBzdXJlIHRoYXQgaW52YWxpZCBmb3JtYXQgc3BlY2lmaWVycyBhcmUgaGFuZGxlZCBjb3JyZWN0bHkKKyAgICAgICAgI3NlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuc3RyZnRpbWUsICIlZSIpCisgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnN0cmZ0aW1lLCAiJSIpCisgICAgICAgICNzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnN0cmZ0aW1lLCAiJSMiKQorCisgICAgICAgICNvaCB3ZWxsLCBzb21lIHN5c3RlbXMganVzdCBpZ25vcmUgdGhvc2UgaW52YWxpZCBvbmVzLgorICAgICAgICAjYXQgbGVhc3QsIGV4Y2VyY2lzZSB0aGVtIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIGNyYXNoZXMKKyAgICAgICAgI2FyZSBnZW5lcmF0ZWQKKyAgICAgICAgZm9yIGYgaW4gWyIlZSIsICIlIiwgIiUjIl06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdC5zdHJmdGltZShmKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICNjaGVjayB0aGF0IHRoaXMgc3RhbmRhcmQgZXh0ZW5zaW9uIHdvcmtzCisgICAgICAgIHQuc3RyZnRpbWUoIiVmIikKKworCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3MoMjAwNywgOSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuX19mb3JtYXRfXygnJyksIHN0cihkdCkpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IGEgZGVyaXZlZCBjbGFzcydzIF9fc3RyX18oKSBnZXRzIGNhbGxlZAorICAgICAgICBjbGFzcyBBKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdBJworICAgICAgICBhID0gQSgyMDA3LCA5LCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZm9ybWF0X18oJycpLCAnQScpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IGEgZGVyaXZlZCBjbGFzcydzIHN0cmZ0aW1lIGdldHMgY2FsbGVkCisgICAgICAgIGNsYXNzIEIoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICBkZWYgc3RyZnRpbWUoc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAnQicKKyAgICAgICAgYiA9IEIoMjAwNywgOSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fX2Zvcm1hdF9fKCcnKSwgc3RyKGR0KSkKKworICAgICAgICBmb3IgZm10IGluIFsibTolbSBkOiVkIHk6JXkiLAorICAgICAgICAgICAgICAgICAgICAibTolbSBkOiVkIHk6JXkgSDolSCBNOiVNIFM6JVMiLAorICAgICAgICAgICAgICAgICAgICAiJXogJVoiLAorICAgICAgICAgICAgICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5fX2Zvcm1hdF9fKGZtdCksIGR0LnN0cmZ0aW1lKGZtdCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19mb3JtYXRfXyhmbXQpLCBkdC5zdHJmdGltZShmbXQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLl9fZm9ybWF0X18oZm10KSwgJ0InKQorCisgICAgZGVmIHRlc3RfcmVzb2x1dGlvbl9pbmZvKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5taW4sIHNlbGYudGhlY2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLnRoZWNsYXNzLm1heCwgc2VsZi50aGVjbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudGhlY2xhc3MucmVzb2x1dGlvbiwgdGltZWRlbHRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGVjbGFzcy5tYXggPiBzZWxmLnRoZWNsYXNzLm1pbikKKworICAgIGRlZiB0ZXN0X2V4dHJlbWVfdGltZWRlbHRhKHNlbGYpOgorICAgICAgICBiaWcgPSBzZWxmLnRoZWNsYXNzLm1heCAtIHNlbGYudGhlY2xhc3MubWluCisgICAgICAgICMgMzY1MjA1OCBkYXlzLCAyMyBob3VycywgNTkgbWludXRlcywgNTkgc2Vjb25kcywgOTk5OTk5IG1pY3Jvc2Vjb25kcworICAgICAgICBuID0gKGJpZy5kYXlzKjI0KjM2MDAgKyBiaWcuc2Vjb25kcykqMTAwMDAwMCArIGJpZy5taWNyb3NlY29uZHMKKyAgICAgICAgIyBuID09IDMxNTUzNzg5NzU5OTk5OTk5OSB+PSAyKio1OC4xMworICAgICAgICBqdXN0YXNiaWcgPSB0aW1lZGVsdGEoMCwgMCwgbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaWcsIGp1c3Rhc2JpZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZWNsYXNzLm1pbiArIGJpZywgc2VsZi50aGVjbGFzcy5tYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGVjbGFzcy5tYXggLSBiaWcsIHNlbGYudGhlY2xhc3MubWluKQorCisgICAgZGVmIHRlc3RfdGltZXR1cGxlKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSg3KToKKyAgICAgICAgICAgICMgSmFudWFyeSAyLCAxOTU2IGlzIGEgTW9uZGF5ICgwKQorICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMTk1NiwgMSwgMitpKQorICAgICAgICAgICAgdCA9IGQudGltZXR1cGxlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgKDE5NTYsIDEsIDIraSwgMCwgMCwgMCwgaSwgMitpLCAtMSkpCisgICAgICAgICAgICAjIEZlYnJ1YXJ5IDEsIDE5NTYgaXMgYSBXZWRuZXNkYXkgKDIpCisgICAgICAgICAgICBkID0gc2VsZi50aGVjbGFzcygxOTU2LCAyLCAxK2kpCisgICAgICAgICAgICB0ID0gZC50aW1ldHVwbGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCAoMTk1NiwgMiwgMStpLCAwLCAwLCAwLCAoMitpKSU3LCAzMitpLCAtMSkpCisgICAgICAgICAgICAjIE1hcmNoIDEsIDE5NTYgaXMgYSBUaHVyc2RheSAoMyksIGFuZCBpcyB0aGUgMzErMjkrMSA9IDYxc3QgZGF5CisgICAgICAgICAgICAjIG9mIHRoZSB5ZWFyLgorICAgICAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMTk1NiwgMywgMStpKQorICAgICAgICAgICAgdCA9IGQudGltZXR1cGxlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgKDE5NTYsIDMsIDEraSwgMCwgMCwgMCwgKDMraSklNywgNjEraSwgLTEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX3llYXIsIDE5NTYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbW9uLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX21kYXksIDEraSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV9ob3VyLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX21pbiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV9zZWMsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fd2RheSwgKDMraSklNykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV95ZGF5LCA2MStpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX2lzZHN0LCAtMSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBhcmdzID0gNiwgNywgMjMKKyAgICAgICAgb3JpZyA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZik6CisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygyLCAzLCA0KQorICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCisKKyAgICAgICAgZm9yIGFyZ3MgaW4gKDMsIDMsIDMpLCAoMiwgNCwgNCksICgyLCAzLCA1KToKKyAgICAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqYXJncykgICAjIHRoaXMgaXMgbGFyZ2VyIHRoYW4gdDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPj0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgIT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgIT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID09IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA9PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPCB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPj0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAxKQorCisgICAgICAgIGZvciBiYWRhcmcgaW4gT1RIRVJTVFVGRjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEgPT0gYmFkYXJnLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEgIT0gYmFkYXJnLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWRhcmcgPT0gdDEsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWRhcmcgIT0gdDEsIFRydWUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA8IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA+IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA+PSBiYWRhcmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGJhZGFyZyA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGJhZGFyZyA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGJhZGFyZyA+PSB0MSkKKworICAgIGRlZiB0ZXN0X21peGVkX2NvbXBhcmUoc2VsZik6CisgICAgICAgIG91ciA9IHNlbGYudGhlY2xhc3MoMjAwMCwgNCwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIG91ciwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIDEsIG91cikKKworICAgICAgICBjbGFzcyBBbm90aGVyRGF0ZVRpbWVDbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICMgUmV0dXJuICJlcXVhbCIgc28gY2FsbGluZyB0aGlzIGNhbid0IGJlIGNvbmZ1c2VkIHdpdGgKKyAgICAgICAgICAgICAgICAjIGNvbXBhcmUtYnktYWRkcmVzcyAod2hpY2ggbmV2ZXIgc2F5cyAiZXF1YWwiIGZvciBkaXN0aW5jdAorICAgICAgICAgICAgICAgICMgb2JqZWN0cykuCisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisKKyAgICAgICAgIyBUaGlzIHN0aWxsIGVycm9ycywgYmVjYXVzZSBkYXRlIGFuZCBkYXRldGltZSBjb21wYXJpc29uIHJhaXNlCisgICAgICAgICMgVHlwZUVycm9yIGluc3RlYWQgb2YgTm90SW1wbGVtZW50ZWQgd2hlbiB0aGV5IGRvbid0IGtub3cgd2hhdCB0bworICAgICAgICAjIGRvLCBpbiBvcmRlciB0byBzdG9wIGNvbXBhcmlzb24gZnJvbSBmYWxsaW5nIGJhY2sgdG8gdGhlIGRlZmF1bHQKKyAgICAgICAgIyBjb21wYXJlLWJ5LWFkZHJlc3MuCisgICAgICAgIHRoZWlyID0gQW5vdGhlckRhdGVUaW1lQ2xhc3MoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgb3VyLCB0aGVpcikKKyAgICAgICAgIyBPb3BzOiAgVGhlIG5leHQgc3RhYiByYWlzZXMgVHlwZUVycm9yIGluIHRoZSBDIGltcGxlbWVudGF0aW9uLAorICAgICAgICAjIGJ1dCBub3QgaW4gdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBkYXRldGltZS4gIFRoZSBkaWZmZXJlbmNlCisgICAgICAgICMgaXMgZHVlIHRvIHRoYXQgdGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVzIF9fY21wX18gYnV0CisgICAgICAgICMgdGhlIEMgaW1wbGVtZW50YXRpb24gZGVmaW5lcyB0cF9yaWNoY29tcGFyZS4gIFRoaXMgaXMgbW9yZSBwYWluCisgICAgICAgICMgdG8gZml4IHRoYW4gaXQncyB3b3J0aCwgc28gY29tbWVudGluZyBvdXQgdGhlIHRlc3QuCisgICAgICAgICMgc2VsZi5hc3NlcnRFcXVhbChjbXAodGhlaXIsIG91ciksIDApCisKKyAgICAgICAgIyBCdXQgZGF0ZSBhbmQgZGF0ZXRpbWUgY29tcGFyaXNvbiByZXR1cm4gTm90SW1wbGVtZW50ZWQgaW5zdGVhZCBpZiB0aGUKKyAgICAgICAgIyBvdGhlciBvYmplY3QgaGFzIGEgdGltZXR1cGxlIGF0dHIuICBUaGlzIGdpdmVzIHRoZSBvdGhlciBvYmplY3QgYQorICAgICAgICAjIGNoYW5jZSB0byBkbyB0aGUgY29tcGFyaXNvbi4KKyAgICAgICAgY2xhc3MgQ29tcGFyYWJsZShBbm90aGVyRGF0ZVRpbWVDbGFzcyk6CisgICAgICAgICAgICBkZWYgdGltZXR1cGxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoKQorCisgICAgICAgIHRoZWlyID0gQ29tcGFyYWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKG91ciwgdGhlaXIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0aGVpciwgb3VyKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91ciA9PSB0aGVpcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRoZWlyID09IG91cikKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgICMgQWxsIGRhdGVzIGFyZSBjb25zaWRlcmVkIHRydWUuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZWNsYXNzLm1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhlY2xhc3MubWF4KQorCisgICAgZGVmIHRlc3Rfc3RyZnRpbWVfb3V0X29mX3JhbmdlKHNlbGYpOgorICAgICAgICAjIEZvciBuYXN0eSB0ZWNobmljYWwgcmVhc29ucywgd2UgY2FuJ3QgaGFuZGxlIHllYXJzIGJlZm9yZSAxOTAwLgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xzKDE5MDAsIDEsIDEpLnN0cmZ0aW1lKCIlWSIpLCAiMTkwMCIpCisgICAgICAgIGZvciB5IGluIDEsIDQ5LCA1MSwgOTksIDEwMCwgMTAwMCwgMTg5OToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNscyh5LCAxLCAxKS5zdHJmdGltZSwgIiVZIikKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgYXJncyA9IFsxLCAyLCAzXQorICAgICAgICBiYXNlID0gY2xzKCphcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UsIGJhc2UucmVwbGFjZSgpKQorCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBuYW1lLCBuZXd2YWwgaW4gKCgieWVhciIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm1vbnRoIiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZGF5IiwgNCkpOgorICAgICAgICAgICAgbmV3YXJncyA9IGFyZ3NbOl0KKyAgICAgICAgICAgIG5ld2FyZ3NbaV0gPSBuZXd2YWwKKyAgICAgICAgICAgIGV4cGVjdGVkID0gY2xzKCpuZXdhcmdzKQorICAgICAgICAgICAgZ290ID0gYmFzZS5yZXBsYWNlKCoqe25hbWU6IG5ld3ZhbH0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAjIE91dCBvZiBib3VuZHMuCisgICAgICAgIGJhc2UgPSBjbHMoMjAwMCwgMiwgMjkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJhc2UucmVwbGFjZSwgeWVhcj0yMDAxKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfZGF0ZShzZWxmKToKKworICAgICAgICBjbGFzcyBDKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgdGhlQW5zd2VyID0gNDIKKworICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd3MpOgorICAgICAgICAgICAgICAgIHRlbXAgPSBrd3MuY29weSgpCisgICAgICAgICAgICAgICAgZXh0cmEgPSB0ZW1wLnBvcCgnZXh0cmEnKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYudGhlY2xhc3MuX19uZXdfXyhjbHMsICphcmdzLCAqKnRlbXApCisgICAgICAgICAgICAgICAgcmVzdWx0LmV4dHJhID0gZXh0cmEKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGRlZiBuZXdtZXRoKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBzZWxmLnllYXIgKyBzZWxmLm1vbnRoCisKKyAgICAgICAgYXJncyA9IDIwMDMsIDQsIDE0CisKKyAgICAgICAgZHQxID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgZHQyID0gQygqYXJncywgKip7J2V4dHJhJzogN30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIuX19jbGFzc19fLCBDKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi50aGVBbnN3ZXIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5leHRyYSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDEudG9vcmRpbmFsKCksIGR0Mi50b29yZGluYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIubmV3bWV0aCgtNyksIGR0MS55ZWFyICsgZHQxLm1vbnRoIC0gNykKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nX3N1YmNsYXNzX2RhdGUoc2VsZik6CisKKyAgICAgICAgYXJncyA9IDYsIDcsIDIzCisgICAgICAgIG9yaWcgPSBTdWJjbGFzc0RhdGUoKmFyZ3MpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKworICAgIGRlZiB0ZXN0X2JhY2tkb29yX3Jlc2lzdGFuY2Uoc2VsZik6CisgICAgICAgICMgRm9yIGZhc3QgdW5waWNrbGluZywgdGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYSBwaWNrbGUgc3RyaW5nLgorICAgICAgICAjIFRoaXMgaXMgYSBsb3ctb3ZlcmhlYWQgYmFja2Rvb3IuICBBIHVzZXIgY2FuIChieSBpbnRlbnQgb3IKKyAgICAgICAgIyBtaXN0YWtlKSBwYXNzIGEgc3RyaW5nIGRpcmVjdGx5LCB3aGljaCAoaWYgaXQncyB0aGUgcmlnaHQgbGVuZ3RoKQorICAgICAgICAjIHdpbGwgZ2V0IHRyZWF0ZWQgbGlrZSBhIHBpY2tsZSwgYW5kIGJ5cGFzcyB0aGUgbm9ybWFsIHNhbml0eQorICAgICAgICAjIGNoZWNrcyBpbiB0aGUgY29uc3RydWN0b3IuICBUaGlzIGNhbiBjcmVhdGUgaW5zYW5lIG9iamVjdHMuCisgICAgICAgICMgVGhlIGNvbnN0cnVjdG9yIGRvZXNuJ3Qgd2FudCB0byBidXJuIHRoZSB0aW1lIHRvIHZhbGlkYXRlIGFsbAorICAgICAgICAjIGZpZWxkcywgYnV0IGRvZXMgY2hlY2sgdGhlIG1vbnRoIGZpZWxkLiAgVGhpcyBzdG9wcywgZS5nLiwKKyAgICAgICAgIyBkYXRldGltZS5kYXRldGltZSgnMTk5NS0wMy0yNScpIGZyb20geWllbGRpbmcgYW4gaW5zYW5lIG9iamVjdC4KKyAgICAgICAgYmFzZSA9ICcxOTk1LTAzLTI1JworICAgICAgICBpZiBub3QgaXNzdWJjbGFzcyhzZWxmLnRoZWNsYXNzLCBkYXRldGltZSk6CisgICAgICAgICAgICBiYXNlID0gYmFzZVs6NF0KKyAgICAgICAgZm9yIG1vbnRoX2J5dGUgaW4gJzknLCBjaHIoMCksIGNocigxMyksICdceGZmJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50aGVjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVs6Ml0gKyBtb250aF9ieXRlICsgYmFzZVszOl0pCisgICAgICAgIGZvciBvcmRfYnl0ZSBpbiByYW5nZSgxLCAxMyk6CisgICAgICAgICAgICAjIFRoaXMgc2hvdWxkbid0IGJsb3cgdXAgYmVjYXVzZSBvZiB0aGUgbW9udGggYnl0ZSBhbG9uZS4gIElmCisgICAgICAgICAgICAjIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzIHRvIGRvIG1vcmUtY2FyZWZ1bCBjaGVja2luZywgaXQgbWF5CisgICAgICAgICAgICAjIGJsb3cgdXAgYmVjYXVzZSBvdGhlciBmaWVsZHMgYXJlIGluc2FuZS4KKyAgICAgICAgICAgIHNlbGYudGhlY2xhc3MoYmFzZVs6Ml0gKyBjaHIob3JkX2J5dGUpICsgYmFzZVszOl0pCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGRhdGV0aW1lIHRlc3RzCisKK2NsYXNzIFN1YmNsYXNzRGF0ZXRpbWUoZGF0ZXRpbWUpOgorICAgIHN1Yl92YXIgPSAxCisKK2NsYXNzIFRlc3REYXRlVGltZShUZXN0RGF0ZSk6CisKKyAgICB0aGVjbGFzcyA9IGRhdGV0aW1lCisKKyAgICBkZWYgdGVzdF9iYXNpY19hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMSwgMTIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQueWVhciwgMjAwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5tb250aCwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuaG91ciwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQubWludXRlLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnNlY29uZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5taWNyb3NlY29uZCwgMCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2F0dHJpYnV0ZXNfbm9uemVybyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYWxsIGF0dHJpYnV0ZXMgYXJlIG5vbi16ZXJvIHNvIGJ1Z3MgaW4KKyAgICAgICAgIyBiaXQtc2hpZnRpbmcgYWNjZXNzIHNob3cgdXAuCisgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxLCAxMiwgNTksIDU5LCA4MDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnllYXIsIDIwMDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQubW9udGgsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZGF5LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LmhvdXIsIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Lm1pbnV0ZSwgNTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuc2Vjb25kLCA1OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5taWNyb3NlY29uZCwgODAwMCkKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcChzZWxmKToKKyAgICAgICAgZm9yIGR0IGluIChzZWxmLnRoZWNsYXNzKDEsIDIsIDMsIDQsIDUsIDYsIDcpLAorICAgICAgICAgICAgICAgICAgIHNlbGYudGhlY2xhc3Mubm93KCkpOgorICAgICAgICAgICAgIyBWZXJpZnkgZHQgLT4gc3RyaW5nIC0+IGRhdGV0aW1lIGlkZW50aXR5LgorICAgICAgICAgICAgcyA9IHJlcHIoZHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCdkYXRldGltZS4nKSkKKyAgICAgICAgICAgIHMgPSBzWzk6XQorICAgICAgICAgICAgZHQyID0gZXZhbChzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQorCisgICAgICAgICAgICAjIFZlcmlmeSBpZGVudGl0eSB2aWEgcmVjb25zdHJ1Y3RpbmcgZnJvbSBwaWVjZXMuCisgICAgICAgICAgICBkdDIgPSBzZWxmLnRoZWNsYXNzKGR0LnllYXIsIGR0Lm1vbnRoLCBkdC5kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0LmhvdXIsIGR0Lm1pbnV0ZSwgZHQuc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdC5taWNyb3NlY29uZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGR0MikKKworICAgIGRlZiB0ZXN0X2lzb2Zvcm1hdChzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMiwgMywgMiwgNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAyLTAzLTAyVDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJ1QnKSwgIjAwMDItMDMtMDJUMDQ6MDU6MDEuMDAwMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnICcpLCAiMDAwMi0wMy0wMiAwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCdceDAwJyksICIwMDAyLTAzLTAyXHgwMDA0OjA1OjAxLjAwMDEyMyIpCisgICAgICAgICMgc3RyIGlzIElTTyBmb3JtYXQgd2l0aCB0aGUgc2VwYXJhdG9yIGZvcmNlZCB0byBhIGJsYW5rLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgIjAwMDItMDMtMDIgMDQ6MDU6MDEuMDAwMTIzIikKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyLCAzLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICAgICIwMDAyLTAzLTAyVDAwOjAwOjAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgnVCcpLCAiMDAwMi0wMy0wMlQwMDowMDowMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoJyAnKSwgIjAwMDItMDMtMDIgMDA6MDA6MDAiKQorICAgICAgICAjIHN0ciBpcyBJU08gZm9ybWF0IHdpdGggdGhlIHNlcGFyYXRvciBmb3JjZWQgdG8gYSBibGFuay4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksICIwMDAyLTAzLTAyIDAwOjAwOjAwIikKKworICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDIwMDcsIDksIDEwLCA0LCA1LCAxLCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuX19mb3JtYXRfXygnJyksIHN0cihkdCkpCisKKyAgICAgICAgIyBjaGVjayB0aGF0IGEgZGVyaXZlZCBjbGFzcydzIF9fc3RyX18oKSBnZXRzIGNhbGxlZAorICAgICAgICBjbGFzcyBBKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdBJworICAgICAgICBhID0gQSgyMDA3LCA5LCAxMCwgNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19mb3JtYXRfXygnJyksICdBJykKKworICAgICAgICAjIGNoZWNrIHRoYXQgYSBkZXJpdmVkIGNsYXNzJ3Mgc3RyZnRpbWUgZ2V0cyBjYWxsZWQKKyAgICAgICAgY2xhc3MgQihzZWxmLnRoZWNsYXNzKToKKyAgICAgICAgICAgIGRlZiBzdHJmdGltZShzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuICdCJworICAgICAgICBiID0gQigyMDA3LCA5LCAxMCwgNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuX19mb3JtYXRfXygnJyksIHN0cihkdCkpCisKKyAgICAgICAgZm9yIGZtdCBpbiBbIm06JW0gZDolZCB5OiV5IiwKKyAgICAgICAgICAgICAgICAgICAgIm06JW0gZDolZCB5OiV5IEg6JUggTTolTSBTOiVTIiwKKyAgICAgICAgICAgICAgICAgICAgIiV6ICVaIiwKKyAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuX19mb3JtYXRfXyhmbXQpLCBkdC5zdHJmdGltZShmbXQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZm9ybWF0X18oZm10KSwgZHQuc3RyZnRpbWUoZm10KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fX2Zvcm1hdF9fKGZtdCksICdCJykKKworICAgIGRlZiB0ZXN0X21vcmVfY3RpbWUoc2VsZik6CisgICAgICAgICMgVGVzdCBmaWVsZHMgdGhhdCBUZXN0RGF0ZSBkb2Vzbid0IHRvdWNoLgorICAgICAgICBpbXBvcnQgdGltZQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDIsIDE4LCAzLCA1LCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5jdGltZSgpLCAiU2F0IE1hciAgMiAxODowMzowNSAyMDAyIikKKyAgICAgICAgIyBPb3BzISAgVGhlIG5leHQgbGluZSBmYWlscyBvbiBXaW4ySyB1bmRlciBNU1ZDIDYsIHNvIGl0J3MgY29tbWVudGVkCisgICAgICAgICMgb3V0LiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB0LmN0aW1lKCkgcHJvZHVjZXMgIiAyIiBmb3IgdGhlIGRheSwKKyAgICAgICAgIyBidXQgcGxhdGZvcm0gY3RpbWUoKSBwcm9kdWNlcyAiMDIiIGZvciB0aGUgZGF5LiAgQWNjb3JkaW5nIHRvCisgICAgICAgICMgQzk5LCB0LmN0aW1lKCkgaXMgY29ycmVjdCBoZXJlLgorICAgICAgICAjIHNlbGYuYXNzZXJ0RXF1YWwodC5jdGltZSgpLCB0aW1lLmN0aW1lKHRpbWUubWt0aW1lKHQudGltZXR1cGxlKCkpKSkKKworICAgICAgICAjIFNvIHRlc3QgYSBjYXNlIHdoZXJlIHRoYXQgZGlmZmVyZW5jZSBkb2Vzbid0IG1hdHRlci4KKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMjIsIDE4LCAzLCA1LCAxMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5jdGltZSgpLCB0aW1lLmN0aW1lKHRpbWUubWt0aW1lKHQudGltZXR1cGxlKCkpKSkKKworICAgIGRlZiB0ZXN0X3R6X2luZGVwZW5kZW50X2NvbXBhcmluZyhzZWxmKToKKyAgICAgICAgZHQxID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxLCA5LCAwLCAwKQorICAgICAgICBkdDIgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEsIDEwLCAwLCAwKQorICAgICAgICBkdDMgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEsIDksIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQxLCBkdDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdDIgPiBkdDMpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgY29tcGFyaXNvbiBkb2Vzbid0IGZvcmdldCBtaWNyb3NlY29uZHMsIGFuZCBpc24ndCBkb25lCisgICAgICAgICMgdmlhIGNvbXBhcmluZyBhIGZsb2F0IHRpbWVzdGFtcCAoYW4gSUVFRSBkb3VibGUgZG9lc24ndCBoYXZlIGVub3VnaAorICAgICAgICAjIHByZWNpc2lvbiB0byBzcGFuIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24gYWNyb3NzIHllYXJzIDEgdGhydSA5OTk5LAorICAgICAgICAjIHNvIGNvbXBhcmluZyB2aWEgdGltZXN0YW1wIG5lY2Vzc2FyaWx5IGNhbGxzIHNvbWUgZGlzdGluY3QgdmFsdWVzCisgICAgICAgICMgZXF1YWwpLgorICAgICAgICBkdDEgPSBzZWxmLnRoZWNsYXNzKE1BWFlFQVIsIDEyLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk4KQorICAgICAgICB1cyA9IHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSkKKyAgICAgICAgZHQyID0gZHQxICsgdXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIgLSBkdDEsIHVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQxIDwgZHQyKQorCisgICAgZGVmIHRlc3Rfc3RyZnRpbWVfd2l0aF9iYWRfdHpuYW1lX3JlcGxhY2Uoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IG9rIGlmIHR6aW5mby50em5hbWUoKS5yZXBsYWNlKCkgcmV0dXJucyBhIG5vbi1zdHJpbmcKKyAgICAgICAgY2xhc3MgTXlUekluZm8oRml4ZWRPZmZzZXQpOgorICAgICAgICAgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgY2xhc3MgTXlTdHIoc3RyKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIHJlcGxhY2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gTXlTdHIoJ25hbWUnKQorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygyMDA1LCAzLCAyLCAwLCAwLCAwLCAwLCBNeVR6SW5mbygzLCAnbmFtZScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUsICclWicpCisKKyAgICBkZWYgdGVzdF9iYWRfY29uc3RydWN0b3JfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICAjIGJhZCB5ZWFycworICAgICAgICBzZWxmLnRoZWNsYXNzKE1JTllFQVIsIDEsIDEpICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKE1BWFlFQVIsIDEsIDEpICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCBNSU5ZRUFSLTEsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIE1BWFlFQVIrMSwgMSwgMSkKKyAgICAgICAgIyBiYWQgbW9udGhzCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMSkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxMiwgMSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAwLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAxMywgMSkKKyAgICAgICAgIyBiYWQgZGF5cworICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDIsIDI5KSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwNCwgMiwgMjkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyNDAwLCAyLCAyOSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMDAwLCAyLCAzMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMSwgMiwgMjkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIxMDAsIDIsIDI5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAxOTAwLCAyLCAyOSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzIpCisgICAgICAgICMgYmFkIGhvdXJzCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMzEsIDApICAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMzEsIDIzKSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDAsIDEsIDMxLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzEsIDI0KQorICAgICAgICAjIGJhZCBtaW51dGVzCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMzEsIDIzLCAwKSAgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDEsIDMxLCAyMywgNTkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzEsIDIzLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzEsIDIzLCA2MCkKKyAgICAgICAgIyBiYWQgc2Vjb25kcworICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDAsIDEsIDMxLCAyMywgNTksIDApICAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMCwgMSwgMzEsIDIzLCA1OSwgNTkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjAwMCwgMSwgMzEsIDIzLCA1OSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIwMDAsIDEsIDMxLCAyMywgNTksIDYwKQorICAgICAgICAjIGJhZCBtaWNyb3NlY29uZHMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxLCAzMSwgMjMsIDU5LCA1OSwgMCkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMDAwLCAxLCAzMSwgMjMsIDU5LCA1OSwgOTk5OTk5KSAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAsIDEsIDMxLCAyMywgNTksIDU5LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjAwMCwgMSwgMzEsIDIzLCA1OSwgNTksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDApCisKKyAgICBkZWYgdGVzdF9oYXNoX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBkID0gc2VsZi50aGVjbGFzcygyMDAwLCAxMiwgMzEsIDIzLCAzMCwgMTcpCisgICAgICAgIGUgPSBzZWxmLnRoZWNsYXNzKDIwMDAsIDEyLCAzMSwgMjMsIDMwLCAxNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIGhhc2goZSkpCisKKyAgICAgICAgZGljID0ge2Q6IDF9CisgICAgICAgIGRpY1tlXSA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGljKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWNbZF0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljW2VdLCAyKQorCisgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzKDIwMDEsICAxLCAgMSwgIDAsICA1LCAxNykKKyAgICAgICAgZSA9IHNlbGYudGhlY2xhc3MoMjAwMSwgIDEsICAxLCAgMCwgIDUsIDE3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgaGFzaChlKSkKKworICAgICAgICBkaWMgPSB7ZDogMX0KKyAgICAgICAgZGljW2VdID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tkXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWNbZV0sIDIpCisKKyAgICBkZWYgdGVzdF9jb21wdXRhdGlvbnMoc2VsZik6CisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDEsIDMxKQorICAgICAgICBiID0gc2VsZi50aGVjbGFzcygxOTU2LCAxLCAzMSkKKyAgICAgICAgZGlmZiA9IGEtYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmYuZGF5cywgNDYqMzY1ICsgbGVuKHJhbmdlKDE5NTYsIDIwMDIsIDQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWZmLnNlY29uZHMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlmZi5taWNyb3NlY29uZHMsIDApCisgICAgICAgIGEgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDIsIDE3LCA2KQorICAgICAgICBtaWxsaXNlYyA9IHRpbWVkZWx0YSgwLCAwLCAxMDAwKQorICAgICAgICBob3VyID0gdGltZWRlbHRhKDAsIDM2MDApCisgICAgICAgIGRheSA9IHRpbWVkZWx0YSgxKQorICAgICAgICB3ZWVrID0gdGltZWRlbHRhKDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArIGhvdXIsIHNlbGYudGhlY2xhc3MoMjAwMiwgMywgMiwgMTgsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvdXIgKyBhLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDIsIDE4LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgMTAqaG91ciwgc2VsZi50aGVjbGFzcygyMDAyLCAzLCAzLCAzLCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gaG91ciwgc2VsZi50aGVjbGFzcygyMDAyLCAzLCAyLCAxNiwgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLWhvdXIgKyBhLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDIsIDE2LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gaG91ciwgYSArIC1ob3VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAyMCpob3VyLCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEsIDIxLCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgZGF5LCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDMsIDE3LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gZGF5LCBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEsIDE3LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgd2Vlaywgc2VsZi50aGVjbGFzcygyMDAyLCAzLCA5LCAxNywgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIHdlZWssIHNlbGYudGhlY2xhc3MoMjAwMiwgMiwgMjMsIDE3LCA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgNTIqd2Vlaywgc2VsZi50aGVjbGFzcygyMDAzLCAzLCAxLCAxNywgNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIDUyKndlZWssIHNlbGYudGhlY2xhc3MoMjAwMSwgMywgMywgMTcsIDYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhICsgd2VlaykgLSBhLCB3ZWVrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhICsgZGF5KSAtIGEsIGRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSArIGhvdXIpIC0gYSwgaG91cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSArIG1pbGxpc2VjKSAtIGEsIG1pbGxpc2VjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhIC0gd2VlaykgLSBhLCAtd2VlaykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSAtIGRheSkgLSBhLCAtZGF5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhIC0gaG91cikgLSBhLCAtaG91cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSAtIG1pbGxpc2VjKSAtIGEsIC1taWxsaXNlYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgKyB3ZWVrKSwgLXdlZWspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhICsgZGF5KSwgLWRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKGEgKyBob3VyKSwgLWhvdXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhICsgbWlsbGlzZWMpLCAtbWlsbGlzZWMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhIC0gd2VlayksIHdlZWspCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIChhIC0gZGF5KSwgZGF5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAoYSAtIGhvdXIpLCBob3VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgLSAoYSAtIG1pbGxpc2VjKSwgbWlsbGlzZWMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArICh3ZWVrICsgZGF5ICsgaG91ciArIG1pbGxpc2VjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDEwLCAxOCwgNiwgMCwgMTAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArICh3ZWVrICsgZGF5ICsgaG91ciArIG1pbGxpc2VjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoKChhICsgd2VlaykgKyBkYXkpICsgaG91cikgKyBtaWxsaXNlYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKHdlZWsgKyBkYXkgKyBob3VyICsgbWlsbGlzZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGhlY2xhc3MoMjAwMiwgMiwgMjIsIDE2LCA1LCA1OSwgOTk5MDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gKHdlZWsgKyBkYXkgKyBob3VyICsgbWlsbGlzZWMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoKGEgLSB3ZWVrKSAtIGRheSkgLSBob3VyKSAtIG1pbGxpc2VjKQorICAgICAgICAjIEFkZC9zdWIgaW50cywgbG9uZ3MsIGZsb2F0cyBzaG91bGQgYmUgaWxsZWdhbAorICAgICAgICBmb3IgaSBpbiAxLCAxTCwgMS4wOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEraSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhLWkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogaSthKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGktYSkKKworICAgICAgICAjIGRlbHRhIC0gZGF0ZXRpbWUgaXMgc2Vuc2VsZXNzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZGF5IC0gYSkKKyAgICAgICAgIyBtaXhpbmcgZGF0ZXRpbWUgYW5kIChkZWx0YSBvciBkYXRldGltZSkgdmlhICogb3IgLy8gaXMgc2Vuc2VsZXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBkYXkgKiBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSAqIGRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGRheSAvLyBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSAvLyBkYXkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhICogYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGEgLy8gYSkKKyAgICAgICAgIyBkYXRldGltZSArIGRhdGV0aW1lIGlzIHNlbnNlbGVzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYSArIGEpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgYXJncyA9IDYsIDcsIDIzLCAyMCwgNTksIDEsIDY0KioyCisgICAgICAgIG9yaWcgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKKyAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKKyAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCisKKyAgICBkZWYgdGVzdF9tb3JlX3BpY2tsaW5nKHNlbGYpOgorICAgICAgICBhID0gc2VsZi50aGVjbGFzcygyMDAzLCAyLCA3LCAxNiwgNDgsIDM3LCA0NDQxMTYpCisgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMoYSkKKyAgICAgICAgYiA9IHBpY2tsZS5sb2FkcyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIueWVhciwgMjAwMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLm1vbnRoLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZGF5LCA3KQorCisgICAgZGVmIHRlc3RfcGlja2xpbmdfc3ViY2xhc3NfZGF0ZXRpbWUoc2VsZik6CisgICAgICAgIGFyZ3MgPSA2LCA3LCAyMywgMjAsIDU5LCAxLCA2NCoqMgorICAgICAgICBvcmlnID0gU3ViY2xhc3NEYXRldGltZSgqYXJncykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorCisgICAgZGVmIHRlc3RfbW9yZV9jb21wYXJlKHNlbGYpOgorICAgICAgICAjIFRoZSB0ZXN0X2NvbXBhcmUoKSBpbmhlcml0ZWQgZnJvbSBUZXN0RGF0ZSBjb3ZlcnMgdGhlIGVycm9yIGNhc2VzLgorICAgICAgICAjIFdlIGp1c3Qgd2FudCB0byB0ZXN0IGxleGljb2dyYXBoaWMgb3JkZXJpbmcgb24gdGhlIG1lbWJlcnMgZGF0ZXRpbWUKKyAgICAgICAgIyBoYXMgdGhhdCBkYXRlIGxhY2tzLgorICAgICAgICBhcmdzID0gWzIwMDAsIDExLCAyOSwgMjAsIDU4LCAxNiwgOTk5OTk4XQorICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGFyZ3MpKToKKyAgICAgICAgICAgIG5ld2FyZ3MgPSBhcmdzWzpdCisgICAgICAgICAgICBuZXdhcmdzW2ldID0gYXJnc1tpXSArIDEKKyAgICAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqbmV3YXJncykgICAjIHRoaXMgaXMgbGFyZ2VyIHRoYW4gdDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPj0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgIT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgIT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID09IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA9PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPCB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPj0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAxKQorCisKKyAgICAjIEEgaGVscGVyIGZvciB0aW1lc3RhbXAgY29uc3RydWN0b3IgdGVzdHMuCisgICAgZGVmIHZlcmlmeV9maWVsZF9lcXVhbGl0eShzZWxmLCBleHBlY3RlZCwgZ290KToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZC50bV95ZWFyLCBnb3QueWVhcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZC50bV9tb24sIGdvdC5tb250aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZC50bV9tZGF5LCBnb3QuZGF5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLnRtX2hvdXIsIGdvdC5ob3VyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLnRtX21pbiwgZ290Lm1pbnV0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZC50bV9zZWMsIGdvdC5zZWNvbmQpCisKKyAgICBkZWYgdGVzdF9mcm9tdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBpbXBvcnQgdGltZQorCisgICAgICAgIHRzID0gdGltZS50aW1lKCkKKyAgICAgICAgZXhwZWN0ZWQgPSB0aW1lLmxvY2FsdGltZSh0cykKKyAgICAgICAgZ290ID0gc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKHRzKQorICAgICAgICBzZWxmLnZlcmlmeV9maWVsZF9lcXVhbGl0eShleHBlY3RlZCwgZ290KQorCisgICAgZGVmIHRlc3RfdXRjZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKworICAgICAgICB0cyA9IHRpbWUudGltZSgpCisgICAgICAgIGV4cGVjdGVkID0gdGltZS5nbXRpbWUodHMpCisgICAgICAgIGdvdCA9IHNlbGYudGhlY2xhc3MudXRjZnJvbXRpbWVzdGFtcCh0cykKKyAgICAgICAgc2VsZi52ZXJpZnlfZmllbGRfZXF1YWxpdHkoZXhwZWN0ZWQsIGdvdCkKKworICAgIGRlZiB0ZXN0X21pY3Jvc2Vjb25kX3JvdW5kaW5nKHNlbGYpOgorICAgICAgICAjIFRlc3Qgd2hldGhlciBmcm9tdGltZXN0YW1wICJyb3VuZHMgdXAiIGZsb2F0cyB0aGF0IGFyZSBsZXNzCisgICAgICAgICMgdGhhbiBvbmUgbWljcm9zZWNvbmQgc21hbGxlciB0aGFuIGFuIGludGVnZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKDAuOTk5OTk5OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wKDEpKQorCisgICAgZGVmIHRlc3RfaW5zYW5lX2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgICMgSXQncyBwb3NzaWJsZSB0aGF0IHNvbWUgcGxhdGZvcm0gbWFwcyB0aW1lX3QgdG8gZG91YmxlLAorICAgICAgICAjIGFuZCB0aGF0IHRoaXMgdGVzdCB3aWxsIGZhaWwgdGhlcmUuICBUaGlzIHRlc3Qgc2hvdWxkCisgICAgICAgICMgZXhlbXB0IHN1Y2ggcGxhdGZvcm1zIChwcm92aWRlZCB0aGV5IHJldHVybiByZWFzb25hYmxlCisgICAgICAgICMgcmVzdWx0cyEpLgorICAgICAgICBmb3IgaW5zYW5lIGluIC0xZTIwMCwgMWUyMDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLmZyb210aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNhbmUpCisKKyAgICBkZWYgdGVzdF9pbnNhbmVfdXRjZnJvbXRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgIyBJdCdzIHBvc3NpYmxlIHRoYXQgc29tZSBwbGF0Zm9ybSBtYXBzIHRpbWVfdCB0byBkb3VibGUsCisgICAgICAgICMgYW5kIHRoYXQgdGhpcyB0ZXN0IHdpbGwgZmFpbCB0aGVyZS4gIFRoaXMgdGVzdCBzaG91bGQKKyAgICAgICAgIyBleGVtcHQgc3VjaCBwbGF0Zm9ybXMgKHByb3ZpZGVkIHRoZXkgcmV0dXJuIHJlYXNvbmFibGUKKyAgICAgICAgIyByZXN1bHRzISkuCisgICAgICAgIGZvciBpbnNhbmUgaW4gLTFlMjAwLCAxZTIwMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MudXRjZnJvbXRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2FuZSkKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiV2luZG93cyBkb2Vzbid0IGFjY2VwdCBuZWdhdGl2ZSB0aW1lc3RhbXBzIikKKyAgICBkZWYgdGVzdF9uZWdhdGl2ZV9mbG9hdF9mcm9tdGltZXN0YW1wKHNlbGYpOgorICAgICAgICAjIFRoZSByZXN1bHQgaXMgdHotZGVwZW5kZW50OyBhdCBsZWFzdCB0ZXN0IHRoYXQgdGhpcyBkb2Vzbid0CisgICAgICAgICMgZmFpbCAobGlrZSBpdCBkaWQgYmVmb3JlIGJ1ZyAxNjQ2NzI4IHdhcyBmaXhlZCkuCisgICAgICAgIHNlbGYudGhlY2xhc3MuZnJvbXRpbWVzdGFtcCgtMS4wNSkKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW5kb3dzIGRvZXNuJ3QgYWNjZXB0IG5lZ2F0aXZlIHRpbWVzdGFtcHMiKQorICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2Zsb2F0X3V0Y2Zyb210aW1lc3RhbXAoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLnRoZWNsYXNzLnV0Y2Zyb210aW1lc3RhbXAoLTEuMDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgc2VsZi50aGVjbGFzcygxOTY5LCAxMiwgMzEsIDIzLCA1OSwgNTgsIDk1MDAwMCkpCisKKyAgICBkZWYgdGVzdF91dGNub3coc2VsZik6CisgICAgICAgIGltcG9ydCB0aW1lCisKKyAgICAgICAgIyBDYWxsIGl0IGEgc3VjY2VzcyBpZiB1dGNub3coKSBhbmQgdXRjZnJvbXRpbWVzdGFtcCgpIGFyZSB3aXRoaW4KKyAgICAgICAgIyBhIHNlY29uZCBvZiBlYWNoIG90aGVyLgorICAgICAgICB0b2xlcmFuY2UgPSB0aW1lZGVsdGEoc2Vjb25kcz0xKQorICAgICAgICBmb3IgZHVtbXkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBmcm9tX25vdyA9IHNlbGYudGhlY2xhc3MudXRjbm93KCkKKyAgICAgICAgICAgIGZyb21fdGltZXN0YW1wID0gc2VsZi50aGVjbGFzcy51dGNmcm9tdGltZXN0YW1wKHRpbWUudGltZSgpKQorICAgICAgICAgICAgaWYgYWJzKGZyb21fdGltZXN0YW1wIC0gZnJvbV9ub3cpIDw9IHRvbGVyYW5jZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBFbHNlIHRyeSBhZ2FpbiBhIGZldyB0aW1lcy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicyhmcm9tX3RpbWVzdGFtcCAtIGZyb21fbm93KSA8PSB0b2xlcmFuY2UpCisKKyAgICBkZWYgdGVzdF9zdHJwdGltZShzZWxmKToKKyAgICAgICAgaW1wb3J0IF9zdHJwdGltZQorCisgICAgICAgIHN0cmluZyA9ICcyMDA0LTEyLTAxIDEzOjAyOjQ3LjE5NycKKyAgICAgICAgZm9ybWF0ID0gJyVZLSVtLSVkICVIOiVNOiVTLiVmJworICAgICAgICByZXN1bHQsIGZyYWMgPSBfc3RycHRpbWUuX3N0cnB0aW1lKHN0cmluZywgZm9ybWF0KQorICAgICAgICBleHBlY3RlZCA9IHNlbGYudGhlY2xhc3MoKihyZXN1bHRbMDo2XSsoZnJhYywpKSkKKyAgICAgICAgZ290ID0gc2VsZi50aGVjbGFzcy5zdHJwdGltZShzdHJpbmcsIGZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgZGVmIHRlc3RfbW9yZV90aW1ldHVwbGUoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0cyBmaWVsZHMgYmV5b25kIHRob3NlIHRlc3RlZCBieSB0aGUgVGVzdERhdGUudGVzdF90aW1ldHVwbGUuCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDQsIDEyLCAzMSwgNiwgMjIsIDMzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudGltZXR1cGxlKCksICgyMDA0LCAxMiwgMzEsIDYsIDIyLCAzMywgNCwgMzY2LCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50aW1ldHVwbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodC55ZWFyLCB0Lm1vbnRoLCB0LmRheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdC5ob3VyLCB0Lm1pbnV0ZSwgdC5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHQud2Vla2RheSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRvb3JkaW5hbCgpIC0gZGF0ZSh0LnllYXIsIDEsIDEpLnRvb3JkaW5hbCgpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpKQorICAgICAgICB0dCA9IHQudGltZXR1cGxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dC50bV95ZWFyLCB0LnllYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHQudG1fbW9uLCB0Lm1vbnRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0LnRtX21kYXksIHQuZGF5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0LnRtX2hvdXIsIHQuaG91cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dC50bV9taW4sIHQubWludXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0LnRtX3NlYywgdC5zZWNvbmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHQudG1fd2RheSwgdC53ZWVrZGF5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHQudG1feWRheSwgdC50b29yZGluYWwoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSh0LnllYXIsIDEsIDEpLnRvb3JkaW5hbCgpICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dC50bV9pc2RzdCwgLTEpCisKKyAgICBkZWYgdGVzdF9tb3JlX3N0cmZ0aW1lKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGVzdHMgZmllbGRzIGJleW9uZCB0aG9zZSB0ZXN0ZWQgYnkgdGhlIFRlc3REYXRlLnRlc3Rfc3RyZnRpbWUuCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDQsIDEyLCAzMSwgNiwgMjIsIDMzLCA0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCIlbSAlZCAleSAlZiAlUyAlTSAlSCAlaiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEyIDMxIDA0IDAwMDA0NyAzMyAyMiAwNiAzNjYiKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdChzZWxmKToKKyAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDQsIDE4LCA0NSwgMywgMTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXRlKCksIGRhdGUoMjAwMiwgMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQudGltZSgpLCB0aW1lKDE4LCA0NSwgMywgMTIzNCkpCisKKyAgICBkZWYgdGVzdF9jb21iaW5lKHNlbGYpOgorICAgICAgICBkID0gZGF0ZSgyMDAyLCAzLCA0KQorICAgICAgICB0ID0gdGltZSgxOCwgNDUsIDMsIDEyMzQpCisgICAgICAgIGV4cGVjdGVkID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCA0LCAxOCwgNDUsIDMsIDEyMzQpCisgICAgICAgIGNvbWJpbmUgPSBzZWxmLnRoZWNsYXNzLmNvbWJpbmUKKyAgICAgICAgZHQgPSBjb21iaW5lKGQsIHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGV4cGVjdGVkKQorCisgICAgICAgIGR0ID0gY29tYmluZSh0aW1lPXQsIGRhdGU9ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkdC5kYXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgZHQudGltZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LCBjb21iaW5lKGR0LmRhdGUoKSwgZHQudGltZSgpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmUpICMgbmVlZCBhbiBhcmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCBkKSAjIG5lZWQgdHdvIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCB0LCBkKSAjIGFyZ3MgcmV2ZXJzZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCBkLCB0LCAxKSAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5lLCAiZGF0ZSIsICJ0aW1lIikgIyB3cm9uZyB0eXBlcworCisgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBhcmdzID0gWzEsIDIsIDMsIDQsIDUsIDYsIDddCisgICAgICAgIGJhc2UgPSBjbHMoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZS5yZXBsYWNlKCkpCisKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIG5hbWUsIG5ld3ZhbCBpbiAoKCJ5ZWFyIiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibW9udGgiLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkYXkiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJob3VyIiwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibWludXRlIiwgNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgic2Vjb25kIiwgNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibWljcm9zZWNvbmQiLCA4KSk6CisgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQorICAgICAgICAgICAgbmV3YXJnc1tpXSA9IG5ld3ZhbAorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjbHMoKm5ld2FyZ3MpCisgICAgICAgICAgICBnb3QgPSBiYXNlLnJlcGxhY2UoKip7bmFtZTogbmV3dmFsfSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgICMgT3V0IG9mIGJvdW5kcy4KKyAgICAgICAgYmFzZSA9IGNscygyMDAwLCAyLCAyOSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCB5ZWFyPTIwMDEpCisKKyAgICBkZWYgdGVzdF9hc3RpbWV6b25lKHNlbGYpOgorICAgICAgICAjIFByZXR0eSBib3JpbmchICBUaGUgVFogdGVzdCBpcyBtb3JlIGludGVyZXN0aW5nIGhlcmUuICBhc3RpbWV6b25lKCkKKyAgICAgICAgIyBzaW1wbHkgY2FuJ3QgYmUgYXBwbGllZCB0byBhIG5haXZlIG9iamVjdC4KKyAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzLm5vdygpCisgICAgICAgIGYgPSBGaXhlZE9mZnNldCg0NCwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZHQuYXN0aW1lem9uZSkgIyBub3QgZW5vdWdoIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkdC5hc3RpbWV6b25lLCBmLCBmKSAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkdC5hc3RpbWV6b25lLCBkdCkgIyBhcmcgd3JvbmcgdHlwZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkdC5hc3RpbWV6b25lLCBmKSAjIG5haXZlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGR0LmFzdGltZXpvbmUsIHR6PWYpICAjIG5haXZlCisKKyAgICAgICAgY2xhc3MgQm9ndXModHppbmZvKToKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gTm9uZQorICAgICAgICAgICAgZGVmIGRzdChzZWxmLCBkdCk6IHJldHVybiB0aW1lZGVsdGEoMCkKKyAgICAgICAgYm9nID0gQm9ndXMoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkdC5hc3RpbWV6b25lLCBib2cpICAgIyBuYWl2ZQorCisgICAgICAgIGNsYXNzIEFsc29Cb2d1cyh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHJldHVybiB0aW1lZGVsdGEoMCkKKyAgICAgICAgICAgIGRlZiBkc3Qoc2VsZiwgZHQpOiByZXR1cm4gTm9uZQorICAgICAgICBhbHNvYm9nID0gQWxzb0JvZ3VzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZHQuYXN0aW1lem9uZSwgYWxzb2JvZykgIyBhbHNvIG5haXZlCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19kYXRldGltZShzZWxmKToKKworICAgICAgICBjbGFzcyBDKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgdGhlQW5zd2VyID0gNDIKKworICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd3MpOgorICAgICAgICAgICAgICAgIHRlbXAgPSBrd3MuY29weSgpCisgICAgICAgICAgICAgICAgZXh0cmEgPSB0ZW1wLnBvcCgnZXh0cmEnKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYudGhlY2xhc3MuX19uZXdfXyhjbHMsICphcmdzLCAqKnRlbXApCisgICAgICAgICAgICAgICAgcmVzdWx0LmV4dHJhID0gZXh0cmEKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGRlZiBuZXdtZXRoKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBzZWxmLnllYXIgKyBzZWxmLm1vbnRoICsgc2VsZi5zZWNvbmQKKworICAgICAgICBhcmdzID0gMjAwMywgNCwgMTQsIDEyLCAxMywgNDEKKworICAgICAgICBkdDEgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBkdDIgPSBDKCphcmdzLCAqKnsnZXh0cmEnOiA3fSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5fX2NsYXNzX18sIEMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLnRoZUFuc3dlciwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLmV4dHJhLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MS50b29yZGluYWwoKSwgZHQyLnRvb3JkaW5hbCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5uZXdtZXRoKC03KSwgZHQxLnllYXIgKyBkdDEubW9udGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHQxLnNlY29uZCAtIDcpCisKK2NsYXNzIFN1YmNsYXNzVGltZSh0aW1lKToKKyAgICBzdWJfdmFyID0gMQorCitjbGFzcyBUZXN0VGltZShIYXJtbGVzc01peGVkQ29tcGFyaXNvbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdGhlY2xhc3MgPSB0aW1lCisKKyAgICBkZWYgdGVzdF9iYXNpY19hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmhvdXIsIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWludXRlLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2Vjb25kLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWljcm9zZWNvbmQsIDApCisKKyAgICBkZWYgdGVzdF9iYXNpY19hdHRyaWJ1dGVzX25vbnplcm8oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFsbCBhdHRyaWJ1dGVzIGFyZSBub24temVybyBzbyBidWdzIGluCisgICAgICAgICMgYml0LXNoaWZ0aW5nIGFjY2VzcyBzaG93IHVwLgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxMiwgNTksIDU5LCA4MDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaG91ciwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5taW51dGUsIDU5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2Vjb25kLCA1OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1pY3Jvc2Vjb25kLCA4MDAwKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwKHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0KQorCisgICAgICAgICMgVmVyaWZ5IHQgLT4gc3RyaW5nIC0+IHRpbWUgaWRlbnRpdHkuCisgICAgICAgIHMgPSByZXByKHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQorICAgICAgICBzID0gc1s5Ol0KKyAgICAgICAgdDIgPSBldmFsKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdDIpCisKKyAgICAgICAgIyBWZXJpZnkgaWRlbnRpdHkgdmlhIHJlY29uc3RydWN0aW5nIGZyb20gcGllY2VzLgorICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3ModC5ob3VyLCB0Lm1pbnV0ZSwgdC5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0Lm1pY3Jvc2Vjb25kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHQyKQorCisgICAgZGVmIHRlc3RfY29tcGFyaW5nKHNlbGYpOgorICAgICAgICBhcmdzID0gWzEsIDIsIDMsIDRdCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMCkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYXJncykpOgorICAgICAgICAgICAgbmV3YXJncyA9IGFyZ3NbOl0KKyAgICAgICAgICAgIG5ld2FyZ3NbaV0gPSBhcmdzW2ldICsgMQorICAgICAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKCpuZXdhcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSAhPSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiAhPSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyID09IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCisKKyAgICAgICAgZm9yIGJhZGFyZyBpbiBPVEhFUlNUVUZGOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSA9PSBiYWRhcmcsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSAhPSBiYWRhcmcsIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhZGFyZyA9PSB0MSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhZGFyZyAhPSB0MSwgVHJ1ZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxIDw9IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA8IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA+IGJhZGFyZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA+PSBiYWRhcmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYmFkYXJnIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGJhZGFyZyA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGJhZGFyZyA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGJhZGFyZyA+PSB0MSkKKworICAgIGRlZiB0ZXN0X2JhZF9jb25zdHJ1Y3Rvcl9hcmd1bWVudHMoc2VsZik6CisgICAgICAgICMgYmFkIGhvdXJzCisgICAgICAgIHNlbGYudGhlY2xhc3MoMCwgMCkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMywgMCkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAtMSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjQsIDApCisgICAgICAgICMgYmFkIG1pbnV0ZXMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMywgMCkgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMywgNTkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjMsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMywgNjApCisgICAgICAgICMgYmFkIHNlY29uZHMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMywgNTksIDApICAgICMgbm8gZXhjZXB0aW9uCisgICAgICAgIHNlbGYudGhlY2xhc3MoMjMsIDU5LCA1OSkgICAjIG5vIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMywgNTksIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnRoZWNsYXNzLCAyMywgNTksIDYwKQorICAgICAgICAjIGJhZCBtaWNyb3NlY29uZHMKKyAgICAgICAgc2VsZi50aGVjbGFzcygyMywgNTksIDU5LCAwKSAgICAgICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi50aGVjbGFzcygyMywgNTksIDU5LCA5OTk5OTkpICAgIyBubyBleGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi50aGVjbGFzcywgMjMsIDU5LCA1OSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYudGhlY2xhc3MsIDIzLCA1OSwgNTksIDEwMDAwMDApCisKKyAgICBkZWYgdGVzdF9oYXNoX2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBkID0gc2VsZi50aGVjbGFzcygyMywgMzAsIDE3KQorICAgICAgICBlID0gc2VsZi50aGVjbGFzcygyMywgMzAsIDE3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgaGFzaChlKSkKKworICAgICAgICBkaWMgPSB7ZDogMX0KKyAgICAgICAgZGljW2VdID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tkXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWNbZV0sIDIpCisKKyAgICAgICAgZCA9IHNlbGYudGhlY2xhc3MoMCwgIDUsIDE3KQorICAgICAgICBlID0gc2VsZi50aGVjbGFzcygwLCAgNSwgMTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCBoYXNoKGUpKQorCisgICAgICAgIGRpYyA9IHtkOiAxfQorICAgICAgICBkaWNbZV0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpYyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljW2RdLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY1tlXSwgMikKKworICAgIGRlZiB0ZXN0X2lzb2Zvcm1hdChzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoNCwgNSwgMSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksICIwNDowNTowMS4wMDAxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaXNvZm9ybWF0KCksIHN0cih0KSkKKworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgIjAwOjAwOjAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MobWljcm9zZWNvbmQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMDAwMDAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MobWljcm9zZWNvbmQ9MTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgIjAwOjAwOjAwLjAwMDAxMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgc3RyKHQpKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKG1pY3Jvc2Vjb25kPTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMDAwMTAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MobWljcm9zZWNvbmQ9MTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMDAxMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCisKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MobWljcm9zZWNvbmQ9MTAwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgIjAwOjAwOjAwLjAxMDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pc29mb3JtYXQoKSwgc3RyKHQpKQorCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKG1pY3Jvc2Vjb25kPTEwMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMTAwMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lmlzb2Zvcm1hdCgpLCBzdHIodCkpCisKKyAgICBkZWYgdGVzdF8xNjUzNzM2KHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBpdCBkb2Vzbid0IGFjY2VwdCBleHRyYSBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyhzZWNvbmQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0Lmlzb2Zvcm1hdCwgZm9vPTMpCisKKyAgICBkZWYgdGVzdF9zdHJmdGltZShzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCclSCAlTSAlUyAlZicpLCAiMDEgMDIgMDMgMDAwMDA0IikKKyAgICAgICAgIyBBIG5haXZlIG9iamVjdCByZXBsYWNlcyAleiBhbmQgJVogd2l0aCBlbXB0eSBzdHJpbmdzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc3RyZnRpbWUoIicleicgJyVaJyIpLCAiJycgJyciKQorCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX19mb3JtYXRfXygnJyksIHN0cih0KSkKKworICAgICAgICAjIGNoZWNrIHRoYXQgYSBkZXJpdmVkIGNsYXNzJ3MgX19zdHJfXygpIGdldHMgY2FsbGVkCisgICAgICAgIGNsYXNzIEEoc2VsZi50aGVjbGFzcyk6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0EnCisgICAgICAgIGEgPSBBKDEsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2Zvcm1hdF9fKCcnKSwgJ0EnKQorCisgICAgICAgICMgY2hlY2sgdGhhdCBhIGRlcml2ZWQgY2xhc3MncyBzdHJmdGltZSBnZXRzIGNhbGxlZAorICAgICAgICBjbGFzcyBCKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgZGVmIHN0cmZ0aW1lKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ0InCisgICAgICAgIGIgPSBCKDEsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fX2Zvcm1hdF9fKCcnKSwgc3RyKHQpKQorCisgICAgICAgIGZvciBmbXQgaW4gWyclSCAlTSAlUycsCisgICAgICAgICAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX19mb3JtYXRfXyhmbXQpLCB0LnN0cmZ0aW1lKGZtdCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19mb3JtYXRfXyhmbXQpLCB0LnN0cmZ0aW1lKGZtdCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuX19mb3JtYXRfXyhmbXQpLCAnQicpCisKKyAgICBkZWYgdGVzdF9zdHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCkpLCAiMDE6MDI6MDMuMDAwMDA0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VsZi50aGVjbGFzcygxMCwgMiwgMywgNDAwMCkpLCAiMTA6MDI6MDMuMDA0MDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VsZi50aGVjbGFzcygwLCAyLCAzLCA0MDAwMDApKSwgIjAwOjAyOjAzLjQwMDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNlbGYudGhlY2xhc3MoMTIsIDIsIDMsIDApKSwgIjEyOjAyOjAzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoc2VsZi50aGVjbGFzcygyMywgMTUsIDAsIDApKSwgIjIzOjE1OjAwIikKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIG5hbWUgPSAnZGF0ZXRpbWUuJyArIHNlbGYudGhlY2xhc3MuX19uYW1lX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNlbGYudGhlY2xhc3MoMSwgMiwgMywgNCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcygxLCAyLCAzLCA0KSIgJSBuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi50aGVjbGFzcygxMCwgMiwgMywgNDAwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcygxMCwgMiwgMywgNDAwMCkiICUgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNlbGYudGhlY2xhc3MoMCwgMiwgMywgNDAwMDAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKDAsIDIsIDMsIDQwMDAwMCkiICUgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNlbGYudGhlY2xhc3MoMTIsIDIsIDMsIDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoMTIsIDIsIDMpIiAlIG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzZWxmLnRoZWNsYXNzKDIzLCAxNSwgMCwgMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcygyMywgMTUpIiAlIG5hbWUpCisKKyAgICBkZWYgdGVzdF9yZXNvbHV0aW9uX2luZm8oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLnRoZWNsYXNzLm1pbiwgc2VsZi50aGVjbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYudGhlY2xhc3MubWF4LCBzZWxmLnRoZWNsYXNzKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5yZXNvbHV0aW9uLCB0aW1lZGVsdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZWNsYXNzLm1heCA+IHNlbGYudGhlY2xhc3MubWluKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIGFyZ3MgPSAyMCwgNTksIDE2LCA2NCoqMgorICAgICAgICBvcmlnID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmdfc3ViY2xhc3NfdGltZShzZWxmKToKKyAgICAgICAgYXJncyA9IDIwLCA1OSwgMTYsIDY0KioyCisgICAgICAgIG9yaWcgPSBTdWJjbGFzc1RpbWUoKmFyZ3MpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNscygxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNscygwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNscygwLCAwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNscygwLCAwLCAwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbHMoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2xzKCkpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIGFyZ3MgPSBbMSwgMiwgMywgNF0KKyAgICAgICAgYmFzZSA9IGNscygqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCBiYXNlLnJlcGxhY2UoKSkKKworICAgICAgICBpID0gMAorICAgICAgICBmb3IgbmFtZSwgbmV3dmFsIGluICgoImhvdXIiLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaW51dGUiLCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJzZWNvbmQiLCA3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaWNyb3NlY29uZCIsIDgpKToKKyAgICAgICAgICAgIG5ld2FyZ3MgPSBhcmdzWzpdCisgICAgICAgICAgICBuZXdhcmdzW2ldID0gbmV3dmFsCisgICAgICAgICAgICBleHBlY3RlZCA9IGNscygqbmV3YXJncykKKyAgICAgICAgICAgIGdvdCA9IGJhc2UucmVwbGFjZSgqKntuYW1lOiBuZXd2YWx9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgaSArPSAxCisKKyAgICAgICAgIyBPdXQgb2YgYm91bmRzLgorICAgICAgICBiYXNlID0gY2xzKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJhc2UucmVwbGFjZSwgaG91cj0yNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBtaW51dGU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJhc2UucmVwbGFjZSwgc2Vjb25kPTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBtaWNyb3NlY29uZD0xMDAwMDAwKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfdGltZShzZWxmKToKKworICAgICAgICBjbGFzcyBDKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgdGhlQW5zd2VyID0gNDIKKworICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd3MpOgorICAgICAgICAgICAgICAgIHRlbXAgPSBrd3MuY29weSgpCisgICAgICAgICAgICAgICAgZXh0cmEgPSB0ZW1wLnBvcCgnZXh0cmEnKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYudGhlY2xhc3MuX19uZXdfXyhjbHMsICphcmdzLCAqKnRlbXApCisgICAgICAgICAgICAgICAgcmVzdWx0LmV4dHJhID0gZXh0cmEKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGRlZiBuZXdtZXRoKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBzZWxmLmhvdXIgKyBzZWxmLnNlY29uZAorCisgICAgICAgIGFyZ3MgPSA0LCA1LCA2CisKKyAgICAgICAgZHQxID0gc2VsZi50aGVjbGFzcygqYXJncykKKyAgICAgICAgZHQyID0gQygqYXJncywgKip7J2V4dHJhJzogN30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIuX19jbGFzc19fLCBDKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi50aGVBbnN3ZXIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5leHRyYSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDEuaXNvZm9ybWF0KCksIGR0Mi5pc29mb3JtYXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIubmV3bWV0aCgtNyksIGR0MS5ob3VyICsgZHQxLnNlY29uZCAtIDcpCisKKyAgICBkZWYgdGVzdF9iYWNrZG9vcl9yZXNpc3RhbmNlKHNlbGYpOgorICAgICAgICAjIHNlZSBUZXN0RGF0ZS50ZXN0X2JhY2tkb29yX3Jlc2lzdGFuY2UoKS4KKyAgICAgICAgYmFzZSA9ICcyOjU5LjAnCisgICAgICAgIGZvciBob3VyX2J5dGUgaW4gJyAnLCAnOScsIGNocigyNCksICdceGZmJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50aGVjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91cl9ieXRlICsgYmFzZVsxOl0pCisKKyMgQSBtaXhpbiBmb3IgY2xhc3NlcyB3aXRoIGEgdHppbmZvPSBhcmd1bWVudC4gIFN1YmNsYXNzZXMgbXVzdCBkZWZpbmUKKyMgdGhlY2xhc3MgYXMgYSBjbGFzcyBhdHJpYnV0ZSwgYW5kIHRoZWNsYXNzKDEsIDEsIDEsIHR6aW5mbz13aGF0ZXZlcikKKyMgbXVzdCBiZSBsZWdpdCAod2hpY2ggaXMgdHJ1ZSBmb3IgdGltZSBhbmQgZGF0ZXRpbWUpLgorY2xhc3MgVFpJbmZvQmFzZToKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50X3Bhc3Npbmcoc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgIyBBIGRhdGV0aW1lIHBhc3NlcyBpdHNlbGYgb24sIGEgdGltZSBwYXNzZXMgTm9uZS4KKyAgICAgICAgY2xhc3MgaW50cm9zcGVjdGl2ZSh0emluZm8pOgorICAgICAgICAgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6ICAgIHJldHVybiBkdCBhbmQgInJlYWwiIG9yICJub25lIgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzID0gZHQgYW5kIDQyIG9yIC00MikKKyAgICAgICAgICAgIGRzdCA9IHV0Y29mZnNldAorCisgICAgICAgIG9iaiA9IGNscygxLCAyLCAzLCB0emluZm89aW50cm9zcGVjdGl2ZSgpKQorCisgICAgICAgIGV4cGVjdGVkID0gY2xzIGlzIHRpbWUgYW5kICJub25lIiBvciAicmVhbCIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoudHpuYW1lKCksIGV4cGVjdGVkKQorCisgICAgICAgIGV4cGVjdGVkID0gdGltZWRlbHRhKG1pbnV0ZXM9KGNscyBpcyB0aW1lIGFuZCAtNDIgb3IgNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai51dGNvZmZzZXQoKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLmRzdCgpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2JhZF90emluZm9fY2xhc3NlcyhzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNscywgMSwgMSwgMSwgdHppbmZvPTEyKQorCisgICAgICAgIGNsYXNzIE5pY2VUcnkob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbHMsIDEsIDEsIDEsIHR6aW5mbz1OaWNlVHJ5KQorCisgICAgICAgIGNsYXNzIEJldHRlclRyeSh0emluZm8pOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcGFzcworICAgICAgICBiID0gQmV0dGVyVHJ5KCkKKyAgICAgICAgdCA9IGNscygxLCAxLCAxLCB0emluZm89YikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQudHppbmZvIGlzIGIpCisKKyAgICBkZWYgdGVzdF91dGNfb2Zmc2V0X291dF9vZl9ib3VuZHMoc2VsZik6CisgICAgICAgIGNsYXNzIEVkZ3kodHppbmZvKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQpOgorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0ID0gdGltZWRlbHRhKG1pbnV0ZXM9b2Zmc2V0KQorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYub2Zmc2V0CisKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBmb3Igb2Zmc2V0LCBsZWdpdCBpbiAoKC0xNDQwLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE0MzksIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE0MzksIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE0NDAsIEZhbHNlKSk6CisgICAgICAgICAgICBpZiBjbHMgaXMgdGltZToKKyAgICAgICAgICAgICAgICB0ID0gY2xzKDEsIDIsIDMsIHR6aW5mbz1FZGd5KG9mZnNldCkpCisgICAgICAgICAgICBlbGlmIGNscyBpcyBkYXRldGltZToKKyAgICAgICAgICAgICAgICB0ID0gY2xzKDYsIDYsIDYsIDEsIDIsIDMsIHR6aW5mbz1FZGd5KG9mZnNldCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGFzc2VydCAwLCAiaW1wb3NzaWJsZSIKKyAgICAgICAgICAgIGlmIGxlZ2l0OgorICAgICAgICAgICAgICAgIGFvZnMgPSBhYnMob2Zmc2V0KQorICAgICAgICAgICAgICAgIGgsIG0gPSBkaXZtb2QoYW9mcywgNjApCisgICAgICAgICAgICAgICAgdGFnID0gIiVjJTAyZDolMDJkIiAlIChvZmZzZXQgPCAwIGFuZCAnLScgb3IgJysnLCBoLCBtKQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodCwgZGF0ZXRpbWUpOgorICAgICAgICAgICAgICAgICAgICB0ID0gdC50aW1ldHooKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAiMDE6MDI6MDMiICsgdGFnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHIsIHQpCisKKyAgICBkZWYgdGVzdF90emluZm9fY2xhc3NlcyhzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBjbGFzcyBDMSh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHJldHVybiBOb25lCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOiByZXR1cm4gTm9uZQorICAgICAgICBmb3IgdCBpbiAoY2xzKDEsIDEsIDEpLAorICAgICAgICAgICAgICAgICAgY2xzKDEsIDEsIDEsIHR6aW5mbz1Ob25lKSwKKyAgICAgICAgICAgICAgICAgIGNscygxLCAxLCAxLCB0emluZm89QzEoKSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQudXRjb2Zmc2V0KCkgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LmRzdCgpIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodC50em5hbWUoKSBpcyBOb25lKQorCisgICAgICAgIGNsYXNzIEMzKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPS0xNDM5KQorICAgICAgICAgICAgZGVmIGRzdChzZWxmLCBkdCk6IHJldHVybiB0aW1lZGVsdGEobWludXRlcz0xNDM5KQorICAgICAgICAgICAgZGVmIHR6bmFtZShzZWxmLCBkdCk6IHJldHVybiAiYW5hbWUiCisgICAgICAgIHQgPSBjbHMoMSwgMSwgMSwgdHppbmZvPUMzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTE0MzkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZHN0KCksIHRpbWVkZWx0YShtaW51dGVzPTE0MzkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudHpuYW1lKCksICJhbmFtZSIpCisKKyAgICAgICAgIyBXcm9uZyB0eXBlcy4KKyAgICAgICAgY2xhc3MgQzQodHppbmZvKToKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gImFuYW1lIgorICAgICAgICAgICAgZGVmIGRzdChzZWxmLCBkdCk6IHJldHVybiA3CisgICAgICAgICAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KTogcmV0dXJuIDAKKyAgICAgICAgdCA9IGNscygxLCAxLCAxLCB0emluZm89QzQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LnV0Y29mZnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LmRzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LnR6bmFtZSkKKworICAgICAgICAjIE9mZnNldCBvdXQgb2YgcmFuZ2UuCisgICAgICAgIGNsYXNzIEM2KHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShob3Vycz0tMjQpCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShob3Vycz0yNCkKKyAgICAgICAgdCA9IGNscygxLCAxLCAxLCB0emluZm89QzYoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC51dGNvZmZzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuZHN0KQorCisgICAgICAgICMgTm90IGEgd2hvbGUgbnVtYmVyIG9mIG1pbnV0ZXMuCisgICAgICAgIGNsYXNzIEM3KHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KTogcmV0dXJuIHRpbWVkZWx0YShzZWNvbmRzPTYxKQorICAgICAgICAgICAgZGVmIGRzdChzZWxmLCBkdCk6IHJldHVybiB0aW1lZGVsdGEobWljcm9zZWNvbmRzPS04MSkKKyAgICAgICAgdCA9IGNscygxLCAxLCAxLCB0emluZm89QzcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC51dGNvZmZzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuZHN0KQorCisgICAgZGVmIHRlc3RfYXdhcmVfY29tcGFyZShzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworCisgICAgICAgICMgRW5zdXJlIHRoYXQgdXRjb2Zmc2V0KCkgZ2V0cyBpZ25vcmVkIGlmIHRoZSBjb21wYXJhbmRzIGhhdmUKKyAgICAgICAgIyB0aGUgc2FtZSB0emluZm8gbWVtYmVyLgorICAgICAgICBjbGFzcyBPcGVyYW5kRGVwZW5kZW50T2Zmc2V0KHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIHQpOgorICAgICAgICAgICAgICAgIGlmIHQubWludXRlIDwgMTA6CisgICAgICAgICAgICAgICAgICAgICMgZDAgYW5kIGQxIGVxdWFsIGFmdGVyIGFkanVzdG1lbnQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPXQubWludXRlKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgZDIgb2ZmIGluIHRoZSB3ZWVkcworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXM9NTkpCisKKyAgICAgICAgYmFzZSA9IGNscyg4LCA5LCAxMCwgdHppbmZvPU9wZXJhbmREZXBlbmRlbnRPZmZzZXQoKSkKKyAgICAgICAgZDAgPSBiYXNlLnJlcGxhY2UobWludXRlPTMpCisgICAgICAgIGQxID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT05KQorICAgICAgICBkMiA9IGJhc2UucmVwbGFjZShtaW51dGU9MTEpCisgICAgICAgIGZvciB4IGluIGQwLCBkMSwgZDI6CisgICAgICAgICAgICBmb3IgeSBpbiBkMCwgZDEsIGQyOgorICAgICAgICAgICAgICAgIGdvdCA9IGNtcCh4LCB5KQorICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gY21wKHgubWludXRlLCB5Lm1pbnV0ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgIyBIb3dldmVyLCBpZiB0aGV5J3JlIGRpZmZlcmVudCBtZW1iZXJzLCB1Y3RvZmZzZXQgaXMgbm90IGlnbm9yZWQuCisgICAgICAgICMgTm90ZSB0aGF0IGEgdGltZSBjYW4ndCBhY3R1YWxseSBoYXZlIGFuIG9wZXJhbmQtZGVwZWRlbnQgb2Zmc2V0LAorICAgICAgICAjIHRob3VnaCAoYW5kIHRpbWUudXRjb2Zmc2V0KCkgcGFzc2VzIE5vbmUgdG8gdHppbmZvLnV0Y29mZnNldCgpKSwKKyAgICAgICAgIyBzbyBza2lwIHRoaXMgdGVzdCBmb3IgdGltZS4KKyAgICAgICAgaWYgY2xzIGlzIG5vdCB0aW1lOgorICAgICAgICAgICAgZDAgPSBiYXNlLnJlcGxhY2UobWludXRlPTMsIHR6aW5mbz1PcGVyYW5kRGVwZW5kZW50T2Zmc2V0KCkpCisgICAgICAgICAgICBkMSA9IGJhc2UucmVwbGFjZShtaW51dGU9OSwgdHppbmZvPU9wZXJhbmREZXBlbmRlbnRPZmZzZXQoKSkKKyAgICAgICAgICAgIGQyID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT0xMSwgdHppbmZvPU9wZXJhbmREZXBlbmRlbnRPZmZzZXQoKSkKKyAgICAgICAgICAgIGZvciB4IGluIGQwLCBkMSwgZDI6CisgICAgICAgICAgICAgICAgZm9yIHkgaW4gZDAsIGQxLCBkMjoKKyAgICAgICAgICAgICAgICAgICAgZ290ID0gY21wKHgsIHkpCisgICAgICAgICAgICAgICAgICAgIGlmICh4IGlzIGQwIG9yIHggaXMgZDEpIGFuZCAoeSBpcyBkMCBvciB5IGlzIGQxKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gMAorICAgICAgICAgICAgICAgICAgICBlbGlmIHggaXMgeSBpcyBkMjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gMAorICAgICAgICAgICAgICAgICAgICBlbGlmIHggaXMgZDI6CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IC0xCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgeSBpcyBkMgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworCisjIFRlc3RpbmcgdGltZSBvYmplY3RzIHdpdGggYSBub24tTm9uZSB0emluZm8uCitjbGFzcyBUZXN0VGltZVRaKFRlc3RUaW1lLCBUWkluZm9CYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgdGhlY2xhc3MgPSB0aW1lCisKKyAgICBkZWYgdGVzdF9lbXB0eShzZWxmKToKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuaG91ciwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1pbnV0ZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnNlY29uZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Lm1pY3Jvc2Vjb25kLCAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC50emluZm8gaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X3pvbmVzKHNlbGYpOgorICAgICAgICBlc3QgPSBGaXhlZE9mZnNldCgtMzAwLCAiRVNUIiwgMSkKKyAgICAgICAgdXRjID0gRml4ZWRPZmZzZXQoMCwgIlVUQyIsIC0yKQorICAgICAgICBtZXQgPSBGaXhlZE9mZnNldCg2MCwgIk1FVCIsIDMpCisgICAgICAgIHQxID0gdGltZSggNywgNDcsIHR6aW5mbz1lc3QpCisgICAgICAgIHQyID0gdGltZSgxMiwgNDcsIHR6aW5mbz11dGMpCisgICAgICAgIHQzID0gdGltZSgxMywgNDcsIHR6aW5mbz1tZXQpCisgICAgICAgIHQ0ID0gdGltZShtaWNyb3NlY29uZD00MCkKKyAgICAgICAgdDUgPSB0aW1lKG1pY3Jvc2Vjb25kPTQwLCB0emluZm89dXRjKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEudHppbmZvLCBlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudHppbmZvLCB1dGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMudHppbmZvLCBtZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0NC50emluZm8gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0NS50emluZm8sIHV0YykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0tMzAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTYwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQ0LnV0Y29mZnNldCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdDEudXRjb2Zmc2V0LCAibm8gYXJncyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS50em5hbWUoKSwgIkVTVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudHpuYW1lKCksICJVVEMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnR6bmFtZSgpLCAiTUVUIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQ0LnR6bmFtZSgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdDEudHpuYW1lLCAibm8gYXJncyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuZHN0KCksIHRpbWVkZWx0YShtaW51dGVzPS0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0NC5kc3QoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQxLmRzdCwgIm5vIGFyZ3MiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDEpLCBoYXNoKHQzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQyKSwgaGFzaCh0MykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLCB0MykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQ0ID09IHQ1KSAjIG1peGVkIHR6LWF3YXJlICYgbmFpdmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQ0IDwgdDUpICMgbWl4ZWQgdHotYXdhcmUgJiBuYWl2ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDUgPCB0NCkgIyBtaXhlZCB0ei1hd2FyZSAmIG5haXZlCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDEpLCAiMDc6NDc6MDAtMDU6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0MiksICIxMjo0NzowMCswMDowMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQzKSwgIjEzOjQ3OjAwKzAxOjAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDQpLCAiMDA6MDA6MDAuMDAwMDQwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDUpLCAiMDA6MDA6MDAuMDAwMDQwKzAwOjAwIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLmlzb2Zvcm1hdCgpLCAiMDc6NDc6MDAtMDU6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLmlzb2Zvcm1hdCgpLCAiMTI6NDc6MDArMDA6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLmlzb2Zvcm1hdCgpLCAiMTM6NDc6MDArMDE6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQ0Lmlzb2Zvcm1hdCgpLCAiMDA6MDA6MDAuMDAwMDQwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0NS5pc29mb3JtYXQoKSwgIjAwOjAwOjAwLjAwMDA0MCswMDowMCIpCisKKyAgICAgICAgZCA9ICdkYXRldGltZS50aW1lJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodDEpLCBkICsgIig3LCA0NywgdHppbmZvPWVzdCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodDIpLCBkICsgIigxMiwgNDcsIHR6aW5mbz11dGMpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQzKSwgZCArICIoMTMsIDQ3LCB0emluZm89bWV0KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0NCksIGQgKyAiKDAsIDAsIDAsIDQwKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0NSksIGQgKyAiKDAsIDAsIDAsIDQwLCB0emluZm89dXRjKSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5zdHJmdGltZSgiJUg6JU06JVMgJSVaPSVaICUlej0leiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwNzo0NzowMCAlWj1FU1QgJXo9LTA1MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnN0cmZ0aW1lKCIlSDolTTolUyAlWiAleiIpLCAiMTI6NDc6MDAgVVRDICswMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5zdHJmdGltZSgiJUg6JU06JVMgJVogJXoiKSwgIjEzOjQ3OjAwIE1FVCArMDEwMCIpCisKKyAgICAgICAgeXVjayA9IEZpeGVkT2Zmc2V0KC0xNDM5LCAiJXogJVogJSV6JSVaIikKKyAgICAgICAgdDEgPSB0aW1lKDIzLCA1OSwgdHppbmZvPXl1Y2spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEuc3RyZnRpbWUoIiVIOiVNICUlWj0nJVonICUlej0nJXonIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIzOjU5ICVaPScleiAlWiAlJXolJVonICV6PSctMjM1OSciKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBhbiBpbnZhbGlkIHR6bmFtZSByZXN1bHQgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgY2xhc3MgQmFkdHpuYW1lKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KTogcmV0dXJuIDQyCisgICAgICAgIHQgPSB0aW1lKDIsIDMsIDQsIHR6aW5mbz1CYWR0em5hbWUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0cmZ0aW1lKCIlSDolTTolUyIpLCAiMDI6MDM6MDQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuc3RyZnRpbWUsICIlWiIpCisKKyAgICBkZWYgdGVzdF9oYXNoX2VkZ2VfY2FzZXMoc2VsZik6CisgICAgICAgICMgT2Zmc2V0cyB0aGF0IG92ZXJmbG93IGEgYmFzaWMgdGltZS4KKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDAsIDEsIDIsIDMsIHR6aW5mbz1GaXhlZE9mZnNldCgxNDM5LCAiIikpCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygwLCAwLCAyLCAzLCB0emluZm89Rml4ZWRPZmZzZXQoMTQzOCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDEpLCBoYXNoKHQyKSkKKworICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMjMsIDU4LCA2LCAxMDAsIHR6aW5mbz1GaXhlZE9mZnNldCgtMTAwMCwgIiIpKQorICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoMjMsIDQ4LCA2LCAxMDAsIHR6aW5mbz1GaXhlZE9mZnNldCgtMTAxMCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDEpLCBoYXNoKHQyKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICAjIFRyeSBvbmUgd2l0aG91dCBhIHR6aW5mby4KKyAgICAgICAgYXJncyA9IDIwLCA1OSwgMTYsIDY0KioyCisgICAgICAgIG9yaWcgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKKyAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKKyAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCisKKyAgICAgICAgIyBUcnkgb25lIHdpdGggYSB0emluZm8uCisgICAgICAgIHRpbmZvID0gUGlja2xhYmxlRml4ZWRPZmZzZXQoLTMwMCwgJ2Nvb2tpZScpCisgICAgICAgIG9yaWcgPSBzZWxmLnRoZWNsYXNzKDUsIDYsIDcsIHR6aW5mbz10aW5mbykKKyAgICAgICAgZm9yIHBpY2tsZXIsIHVucGlja2xlciwgcHJvdG8gaW4gcGlja2xlX2Nob2ljZXM6CisgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCisgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRlcml2ZWQudHppbmZvLCBQaWNrbGFibGVGaXhlZE9mZnNldCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVyaXZlZC51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudHpuYW1lKCksICdjb29raWUnKQorCisgICAgZGVmIHRlc3RfbW9yZV9ib29sKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2FzZXMgd2l0aCBub24tTm9uZSB0emluZm8uCisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKworICAgICAgICB0ID0gY2xzKDAsIHR6aW5mbz1GaXhlZE9mZnNldCgtMzAwLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0KQorCisgICAgICAgIHQgPSBjbHMoNSwgdHppbmZvPUZpeGVkT2Zmc2V0KC0zMDAsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCisKKyAgICAgICAgdCA9IGNscyg1LCB0emluZm89Rml4ZWRPZmZzZXQoMzAwLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdCkKKworICAgICAgICB0ID0gY2xzKDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDIzKjYwICsgNTksICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0KQorCisgICAgICAgICMgTW9zdGx5IGVuc3VyaW5nIHRoaXMgZG9lc24ndCBvdmVyZmxvdyBpbnRlcm5hbGx5LgorICAgICAgICB0ID0gY2xzKDAsIHR6aW5mbz1GaXhlZE9mZnNldCgyMyo2MCArIDU5LCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0KQorCisgICAgICAgICMgQnV0IHRoaXMgc2hvdWxkIHlpZWxkIGEgdmFsdWUgZXJyb3IgLS0gdGhlIHV0Y29mZnNldCBpcyBib2d1cy4KKyAgICAgICAgdCA9IGNscygwLCB0emluZm89Rml4ZWRPZmZzZXQoMjQqNjAsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBib29sKHQpKQorCisgICAgICAgICMgTGlrZXdpc2UuCisgICAgICAgIHQgPSBjbHMoMCwgdHppbmZvPUZpeGVkT2Zmc2V0KC0yNCo2MCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGJvb2wodCkpCisKKyAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYpOgorICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCisgICAgICAgIHoxMDAgPSBGaXhlZE9mZnNldCgxMDAsICIrMTAwIikKKyAgICAgICAgem0yMDAgPSBGaXhlZE9mZnNldCh0aW1lZGVsdGEobWludXRlcz0tMjAwKSwgIi0yMDAiKQorICAgICAgICBhcmdzID0gWzEsIDIsIDMsIDQsIHoxMDBdCisgICAgICAgIGJhc2UgPSBjbHMoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZS5yZXBsYWNlKCkpCisKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIG5hbWUsIG5ld3ZhbCBpbiAoKCJob3VyIiwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibWludXRlIiwgNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgic2Vjb25kIiwgNyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibWljcm9zZWNvbmQiLCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ0emluZm8iLCB6bTIwMCkpOgorICAgICAgICAgICAgbmV3YXJncyA9IGFyZ3NbOl0KKyAgICAgICAgICAgIG5ld2FyZ3NbaV0gPSBuZXd2YWwKKyAgICAgICAgICAgIGV4cGVjdGVkID0gY2xzKCpuZXdhcmdzKQorICAgICAgICAgICAgZ290ID0gYmFzZS5yZXBsYWNlKCoqe25hbWU6IG5ld3ZhbH0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gZ2V0IHJpZCBvZiBhIHR6aW5mby4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLnR6bmFtZSgpLCAiKzEwMCIpCisgICAgICAgIGJhc2UyID0gYmFzZS5yZXBsYWNlKHR6aW5mbz1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHppbmZvIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50em5hbWUoKSBpcyBOb25lKQorCisgICAgICAgICMgRW5zdXJlIHdlIGNhbiBhZGQgb25lLgorICAgICAgICBiYXNlMyA9IGJhc2UyLnJlcGxhY2UodHppbmZvPXoxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZTMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCisKKyAgICAgICAgIyBPdXQgb2YgYm91bmRzLgorICAgICAgICBiYXNlID0gY2xzKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJhc2UucmVwbGFjZSwgaG91cj0yNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBtaW51dGU9LTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJhc2UucmVwbGFjZSwgc2Vjb25kPTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYmFzZS5yZXBsYWNlLCBtaWNyb3NlY29uZD0xMDAwMDAwKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfY29tcGFyZShzZWxmKToKKyAgICAgICAgdDEgPSB0aW1lKDEsIDIsIDMpCisgICAgICAgIHQyID0gdGltZSgxLCAyLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0MikKKyAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0MikKKyAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz1GaXhlZE9mZnNldChOb25lLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPUZpeGVkT2Zmc2V0KDAsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID09IHQyKQorCisgICAgICAgICMgSW4gdGltZSB3LyBpZGVudGljYWwgdHppbmZvIG9iamVjdHMsIHV0Y29mZnNldCBpcyBpZ25vcmVkLgorICAgICAgICBjbGFzcyBWYXJpZXModHppbmZvKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCA9IHRpbWVkZWx0YShtaW51dGVzPTIyKQorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSB0aW1lZGVsdGEobWludXRlcz0xKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm9mZnNldAorCisgICAgICAgIHYgPSBWYXJpZXMoKQorICAgICAgICB0MSA9IHQyLnJlcGxhY2UodHppbmZvPXYpCisgICAgICAgIHQyID0gdDIucmVwbGFjZSh0emluZm89dikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MjMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0yNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorCisgICAgICAgICMgQnV0IGlmIHRoZXkncmUgbm90IGlkZW50aWNhbCwgaXQgaXNuJ3QgaWdub3JlZC4KKyAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz1WYXJpZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpICAjIHQxJ3Mgb2Zmc2V0IGNvdW50ZXIgc3RpbGwgZ29pbmcgdXAKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3RpbWV0eihzZWxmKToKKworICAgICAgICBjbGFzcyBDKHNlbGYudGhlY2xhc3MpOgorICAgICAgICAgICAgdGhlQW5zd2VyID0gNDIKKworICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd3MpOgorICAgICAgICAgICAgICAgIHRlbXAgPSBrd3MuY29weSgpCisgICAgICAgICAgICAgICAgZXh0cmEgPSB0ZW1wLnBvcCgnZXh0cmEnKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYudGhlY2xhc3MuX19uZXdfXyhjbHMsICphcmdzLCAqKnRlbXApCisgICAgICAgICAgICAgICAgcmVzdWx0LmV4dHJhID0gZXh0cmEKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgIGRlZiBuZXdtZXRoKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBzZWxmLmhvdXIgKyBzZWxmLnNlY29uZAorCisgICAgICAgIGFyZ3MgPSA0LCA1LCA2LCA1MDAsIEZpeGVkT2Zmc2V0KC0zMDAsICJFU1QiLCAxKQorCisgICAgICAgIGR0MSA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIGR0MiA9IEMoKmFyZ3MsICoqeydleHRyYSc6IDd9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLl9fY2xhc3NfXywgQykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIudGhlQW5zd2VyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdDIuZXh0cmEsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQxLnV0Y29mZnNldCgpLCBkdDIudXRjb2Zmc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLm5ld21ldGgoLTcpLCBkdDEuaG91ciArIGR0MS5zZWNvbmQgLSA3KQorCisKKyMgVGVzdGluZyBkYXRldGltZSBvYmplY3RzIHdpdGggYSBub24tTm9uZSB0emluZm8uCisKK2NsYXNzIFRlc3REYXRlVGltZVRaKFRlc3REYXRlVGltZSwgVFpJbmZvQmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHRoZWNsYXNzID0gZGF0ZXRpbWUKKworICAgIGRlZiB0ZXN0X3RyaXZpYWwoc2VsZik6CisgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcygxLCAyLCAzLCA0LCA1LCA2LCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnllYXIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQubW9udGgsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZGF5LCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LmhvdXIsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQubWludXRlLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LnNlY29uZCwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5taWNyb3NlY29uZCwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC50emluZm8sIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ldmVuX21vcmVfY29tcGFyZShzZWxmKToKKyAgICAgICAgIyBUaGUgdGVzdF9jb21wYXJlKCkgYW5kIHRlc3RfbW9yZV9jb21wYXJlKCkgaW5oZXJpdGVkIGZyb20gVGVzdERhdGUKKyAgICAgICAgIyBhbmQgVGVzdERhdGVUaW1lIGNvdmVyZWQgbm9uLXR6aW5mbyBjYXNlcy4KKworICAgICAgICAjIFNtYWxsZXN0IHBvc3NpYmxlIGFmdGVyIFVUQyBhZGp1c3RtZW50LgorICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMSwgMSwgdHppbmZvPUZpeGVkT2Zmc2V0KDE0MzksICIiKSkKKyAgICAgICAgIyBMYXJnZXN0IHBvc3NpYmxlIGFmdGVyIFVUQyBhZGp1c3RtZW50LgorICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm89Rml4ZWRPZmZzZXQoLTE0MzksICIiKSkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aG9zZSBjb21wYXJlIGNvcnJlY3RseSwgYW5kIHcvbyBvdmVyZmxvdy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID4gdDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPT0gdDIpCisKKyAgICAgICAgIyBFcXVhbCBhZmVyIGFkanVzdG1lbnQuCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxMiwgMzEsIDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDEsICIiKSkKKyAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKDIsIDEsIDEsIDMsIDEzLCB0emluZm89Rml4ZWRPZmZzZXQoMyo2MCsxMysyLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorCisgICAgICAgICMgQ2hhbmdlIHQxIG5vdCB0byBzdWJ0cmFjdCBhIG1pbnV0ZSwgYW5kIHQxIHNob3VsZCBiZSBsYXJnZXIuCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxMiwgMzEsIDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDAsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID4gdDIpCisKKyAgICAgICAgIyBDaGFuZ2UgdDEgdG8gc3VidHJhY3QgMiBtaW51dGVzLCBhbmQgdDEgc2hvdWxkIGJlIHNtYWxsZXIuCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxMiwgMzEsIDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCisKKyAgICAgICAgIyBCYWNrIHRvIHRoZSBvcmlnaW5hbCB0MSwgYnV0IG1ha2Ugc2Vjb25kcyByZXNvbHZlIGl0LgorICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMTIsIDMxLCAyMywgNTksIHR6aW5mbz1GaXhlZE9mZnNldCgxLCAiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQ9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID4gdDIpCisKKyAgICAgICAgIyBMaWtld2lzZSwgYnV0IG1ha2UgbWljcm9zZWNvbmRzIHJlc29sdmUgaXQuCisgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxMiwgMzEsIDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDEsICIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3Jvc2Vjb25kPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+IHQyKQorCisgICAgICAgICMgTWFrZSB0MiBuYWl2ZSBhbmQgaXQgc2hvdWxkIGZhaWwuCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcy5taW4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLCB0MikKKworICAgICAgICAjIEl0J3MgYWxzbyBuYWl2ZSBpZiBpdCBoYXMgdHppbmZvIGJ1dCB0emluZm8udXRjb2Zmc2V0KCkgaXMgTm9uZS4KKyAgICAgICAgY2xhc3MgTmFpdmUodHppbmZvKToKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gTm9uZQorICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoNSwgNiwgNywgdHppbmZvPU5haXZlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB0MSA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MiwgdDIpCisKKyAgICAgICAgIyBPVE9ILCBpdCdzIE9LIHRvIGNvbXBhcmUgdHdvIG9mIHRoZXNlIG1peGluZyB0aGUgdHdvIHdheXMgb2YgYmVpbmcKKyAgICAgICAgIyBuYWl2ZS4KKyAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDUsIDYsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorCisgICAgICAgICMgVHJ5IGEgYm9ndXMgdWN0b2Zmc2V0LgorICAgICAgICBjbGFzcyBCb2d1cyh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPTE0NDApICMgb3V0IG9mIGJvdW5kcworICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMiwgMiwgMiwgdHppbmZvPUJvZ3VzKCkpCisgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygyLCAyLCAyLCB0emluZm89Rml4ZWRPZmZzZXQoMCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHQxID09IHQyKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgICMgVHJ5IG9uZSB3aXRob3V0IGEgdHppbmZvLgorICAgICAgICBhcmdzID0gNiwgNywgMjMsIDIwLCA1OSwgMSwgNjQqKjIKKyAgICAgICAgb3JpZyA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKworICAgICAgICAjIFRyeSBvbmUgd2l0aCBhIHR6aW5mby4KKyAgICAgICAgdGluZm8gPSBQaWNrbGFibGVGaXhlZE9mZnNldCgtMzAwLCAnY29va2llJykKKyAgICAgICAgb3JpZyA9IHNlbGYudGhlY2xhc3MoKmFyZ3MsICoqeyd0emluZm8nOiB0aW5mb30pCisgICAgICAgIGRlcml2ZWQgPSBzZWxmLnRoZWNsYXNzKDEsIDEsIDEsIHR6aW5mbz1GaXhlZE9mZnNldCgwLCAiIiwgMCkpCisgICAgICAgIGZvciBwaWNrbGVyLCB1bnBpY2tsZXIsIHByb3RvIGluIHBpY2tsZV9jaG9pY2VzOgorICAgICAgICAgICAgZ3JlZW4gPSBwaWNrbGVyLmR1bXBzKG9yaWcsIHByb3RvKQorICAgICAgICAgICAgZGVyaXZlZCA9IHVucGlja2xlci5sb2FkcyhncmVlbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZywgZGVyaXZlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkZXJpdmVkLnR6aW5mbywgUGlja2xhYmxlRml4ZWRPZmZzZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPS0zMDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXJpdmVkLnR6bmFtZSgpLCAnY29va2llJykKKworICAgIGRlZiB0ZXN0X2V4dHJlbWVfaGFzaGVzKHNlbGYpOgorICAgICAgICAjIElmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBoYXNoIHRoZXNlIHZpYSBzdWJ0cmFjdGluZyB0aGUgb2Zmc2V0CisgICAgICAgICMgdGhlbiBoYXNoaW5nIGEgZGF0ZXRpbWUgb2JqZWN0LCBPdmVyZmxvd0Vycm9yIHJlc3VsdHMuICBUaGUKKyAgICAgICAgIyBQeXRob24gaW1wbGVtZW50YXRpb24gdXNlZCB0byBibG93IHVwIGhlcmUuCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDEsIDEsIDEsIHR6aW5mbz1GaXhlZE9mZnNldCgxNDM5LCAiIikpCisgICAgICAgIGhhc2godCkKKyAgICAgICAgdCA9IHNlbGYudGhlY2xhc3MoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR6aW5mbz1GaXhlZE9mZnNldCgtMTQzOSwgIiIpKQorICAgICAgICBoYXNoKHQpCisKKyAgICAgICAgIyBPVE9ILCBhbiBPT0Igb2Zmc2V0IHNob3VsZCBibG93IHVwLgorICAgICAgICB0ID0gc2VsZi50aGVjbGFzcyg1LCA1LCA1LCB0emluZm89Rml4ZWRPZmZzZXQoLTE0NDAsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaGFzaCwgdCkKKworICAgIGRlZiB0ZXN0X3pvbmVzKHNlbGYpOgorICAgICAgICBlc3QgPSBGaXhlZE9mZnNldCgtMzAwLCAiRVNUIikKKyAgICAgICAgdXRjID0gRml4ZWRPZmZzZXQoMCwgIlVUQyIpCisgICAgICAgIG1ldCA9IEZpeGVkT2Zmc2V0KDYwLCAiTUVUIikKKyAgICAgICAgdDEgPSBkYXRldGltZSgyMDAyLCAzLCAxOSwgIDcsIDQ3LCB0emluZm89ZXN0KQorICAgICAgICB0MiA9IGRhdGV0aW1lKDIwMDIsIDMsIDE5LCAxMiwgNDcsIHR6aW5mbz11dGMpCisgICAgICAgIHQzID0gZGF0ZXRpbWUoMjAwMiwgMywgMTksIDEzLCA0NywgdHppbmZvPW1ldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS50emluZm8sIGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi50emluZm8sIHV0YykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My50emluZm8sIG1ldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz02MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEudHpuYW1lKCksICJFU1QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnR6bmFtZSgpLCAiVVRDIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My50em5hbWUoKSwgIk1FVCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDEpLCBoYXNoKHQzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHQyKSwgaGFzaCh0MykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLCB0MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MiwgdDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQxKSwgIjIwMDItMDMtMTkgMDc6NDc6MDAtMDU6MDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0MiksICIyMDAyLTAzLTE5IDEyOjQ3OjAwKzAwOjAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDMpLCAiMjAwMi0wMy0xOSAxMzo0NzowMCswMTowMCIpCisgICAgICAgIGQgPSAnZGF0ZXRpbWUuZGF0ZXRpbWUoMjAwMiwgMywgMTksICcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQxKSwgZCArICI3LCA0NywgdHppbmZvPWVzdCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodDIpLCBkICsgIjEyLCA0NywgdHppbmZvPXV0YykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodDMpLCBkICsgIjEzLCA0NywgdHppbmZvPW1ldCkiKQorCisgICAgZGVmIHRlc3RfY29tYmluZShzZWxmKToKKyAgICAgICAgbWV0ID0gRml4ZWRPZmZzZXQoNjAsICJNRVQiKQorICAgICAgICBkID0gZGF0ZSgyMDAyLCAzLCA0KQorICAgICAgICB0eiA9IHRpbWUoMTgsIDQ1LCAzLCAxMjM0LCB0emluZm89bWV0KQorICAgICAgICBkdCA9IGRhdGV0aW1lLmNvbWJpbmUoZCwgdHopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGRhdGV0aW1lKDIwMDIsIDMsIDQsIDE4LCA0NSwgMywgMTIzNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0emluZm89bWV0KSkKKworICAgIGRlZiB0ZXN0X2V4dHJhY3Qoc2VsZik6CisgICAgICAgIG1ldCA9IEZpeGVkT2Zmc2V0KDYwLCAiTUVUIikKKyAgICAgICAgZHQgPSBzZWxmLnRoZWNsYXNzKDIwMDIsIDMsIDQsIDE4LCA0NSwgMywgMTIzNCwgdHppbmZvPW1ldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kYXRlKCksIGRhdGUoMjAwMiwgMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQudGltZSgpLCB0aW1lKDE4LCA0NSwgMywgMTIzNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQudGltZXR6KCksIHRpbWUoMTgsIDQ1LCAzLCAxMjM0LCB0emluZm89bWV0KSkKKworICAgIGRlZiB0ZXN0X3R6X2F3YXJlX2FyaXRobWV0aWMoc2VsZik6CisgICAgICAgIGltcG9ydCByYW5kb20KKworICAgICAgICBub3cgPSBzZWxmLnRoZWNsYXNzLm5vdygpCisgICAgICAgIHR6NTUgPSBGaXhlZE9mZnNldCgtMzMwLCAid2VzdCA1OjMwIikKKyAgICAgICAgdGltZWF3YXJlID0gbm93LnRpbWUoKS5yZXBsYWNlKHR6aW5mbz10ejU1KQorICAgICAgICBub3dhd2FyZSA9IHNlbGYudGhlY2xhc3MuY29tYmluZShub3cuZGF0ZSgpLCB0aW1lYXdhcmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3dhd2FyZS50emluZm8gaXMgdHo1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3dhd2FyZS50aW1ldHooKSwgdGltZWF3YXJlKQorCisgICAgICAgICMgQ2FuJ3QgbWl4IGF3YXJlIGFuZCBub24tYXdhcmUuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBub3cgLSBub3dhd2FyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG5vd2F3YXJlIC0gbm93KQorCisgICAgICAgICMgQW5kIGFkZGluZyBkYXRldGltZSdzIGRvZXNuJ3QgbWFrZSBzZW5zZSwgYXdhcmUgb3Igbm90LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogbm93ICsgbm93YXdhcmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBub3dhd2FyZSArIG5vdykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG5vd2F3YXJlICsgbm93YXdhcmUpCisKKyAgICAgICAgIyBTdWJ0cmFjdGluZyBzaG91bGQgeWllbGQgMC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3cgLSBub3csIHRpbWVkZWx0YSgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3dhd2FyZSAtIG5vd2F3YXJlLCB0aW1lZGVsdGEoMCkpCisKKyAgICAgICAgIyBBZGRpbmcgYSBkZWx0YSBzaG91bGQgcHJlc2VydmUgdHppbmZvLgorICAgICAgICBkZWx0YSA9IHRpbWVkZWx0YSh3ZWVrcz0xLCBtaW51dGVzPTEyLCBtaWNyb3NlY29uZHM9NTY3OCkKKyAgICAgICAgbm93YXdhcmVwbHVzID0gbm93YXdhcmUgKyBkZWx0YQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm93YXdhcmUudHppbmZvIGlzIHR6NTUpCisgICAgICAgIG5vd2F3YXJlcGx1czIgPSBkZWx0YSArIG5vd2F3YXJlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3dhd2FyZXBsdXMyLnR6aW5mbyBpcyB0ejU1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlcGx1cywgbm93YXdhcmVwbHVzMikKKworICAgICAgICAjIHRoYXQgLSBkZWx0YSBzaG91bGQgYmUgd2hhdCB3ZSBzdGFydGVkIHdpdGgsIGFuZCB0aGF0IC0gd2hhdCB3ZQorICAgICAgICAjIHN0YXJ0ZWQgd2l0aCBzaG91bGQgYmUgZGVsdGEuCisgICAgICAgIGRpZmYgPSBub3dhd2FyZXBsdXMgLSBkZWx0YQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlmZi50emluZm8gaXMgdHo1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3dhd2FyZSwgZGlmZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGRlbHRhIC0gbm93YXdhcmVwbHVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlcGx1cyAtIG5vd2F3YXJlLCBkZWx0YSkKKworICAgICAgICAjIE1ha2UgdXAgYSByYW5kb20gdGltZXpvbmUuCisgICAgICAgIHR6ciA9IEZpeGVkT2Zmc2V0KHJhbmRvbS5yYW5kcmFuZ2UoLTE0MzksIDE0NDApLCAicmFuZG9tdGltZXpvbmUiKQorICAgICAgICAjIEF0dGFjaCBpdCB0byBub3dhd2FyZXBsdXMuCisgICAgICAgIG5vd2F3YXJlcGx1cyA9IG5vd2F3YXJlcGx1cy5yZXBsYWNlKHR6aW5mbz10enIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3dhd2FyZXBsdXMudHppbmZvIGlzIHR6cikKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGRpZmZlcmVuY2UgdGFrZXMgdGhlIHRpbWV6b25lIGFkanVzdG1lbnRzIGludG8gYWNjb3VudC4KKyAgICAgICAgZ290ID0gbm93YXdhcmUgLSBub3dhd2FyZXBsdXMKKyAgICAgICAgIyBFeHBlY3RlZDogIChub3dhd2FyZSBiYXNlIC0gbm93YXdhcmUgb2Zmc2V0KSAtCisgICAgICAgICMgICAgICAgICAgICAobm93YXdhcmVwbHVzIGJhc2UgLSBub3dhd2FyZXBsdXMgb2Zmc2V0KSA9CisgICAgICAgICMgICAgICAgICAgICAobm93YXdhcmUgYmFzZSAtIG5vd2F3YXJlcGx1cyBiYXNlKSArCisgICAgICAgICMgICAgICAgICAgICAobm93YXdhcmVwbHVzIG9mZnNldCAtIG5vd2F3YXJlIG9mZnNldCkgPQorICAgICAgICAjICAgICAgICAgICAgLWRlbHRhICsgbm93YXdhcmVwbHVzIG9mZnNldCAtIG5vd2F3YXJlIG9mZnNldAorICAgICAgICBleHBlY3RlZCA9IG5vd2F3YXJlcGx1cy51dGNvZmZzZXQoKSAtIG5vd2F3YXJlLnV0Y29mZnNldCgpIC0gZGVsdGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgICAgICMgVHJ5IG1heCBwb3NzaWJsZSBkaWZmZXJlbmNlLgorICAgICAgICBtaW4gPSBzZWxmLnRoZWNsYXNzKDEsIDEsIDEsIHR6aW5mbz1GaXhlZE9mZnNldCgxNDM5LCAibWluIikpCisgICAgICAgIG1heCA9IHNlbGYudGhlY2xhc3MoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTk5OTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvPUZpeGVkT2Zmc2V0KC0xNDM5LCAibWF4IikpCisgICAgICAgIG1heGRpZmYgPSBtYXggLSBtaW4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXhkaWZmLCBzZWxmLnRoZWNsYXNzLm1heCAtIHNlbGYudGhlY2xhc3MubWluICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lZGVsdGEobWludXRlcz0yKjE0MzkpKQorCisgICAgZGVmIHRlc3RfdHppbmZvX25vdyhzZWxmKToKKyAgICAgICAgbWV0aCA9IHNlbGYudGhlY2xhc3Mubm93CisgICAgICAgICMgRW5zdXJlIGl0IGRvZXNuJ3QgcmVxdWlyZSB0emluZm8gKGkuZS4sIHRoYXQgdGhpcyBkb2Vzbid0IGJsb3cgdXApLgorICAgICAgICBiYXNlID0gbWV0aCgpCisgICAgICAgICMgVHJ5IHdpdGggYW5kIHdpdGhvdXQgbmFtaW5nIHRoZSBrZXl3b3JkLgorICAgICAgICBvZmY0MiA9IEZpeGVkT2Zmc2V0KDQyLCAiNDIiKQorICAgICAgICBhbm90aGVyID0gbWV0aChvZmY0MikKKyAgICAgICAgYWdhaW4gPSBtZXRoKHR6PW9mZjQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYW5vdGhlci50emluZm8gaXMgYWdhaW4udHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFub3RoZXIudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTQyKSkKKyAgICAgICAgIyBCYWQgYXJndW1lbnQgd2l0aCBhbmQgdy9vIG5hbWluZyB0aGUga2V5d29yZC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCB0emluZm89MTYpCisgICAgICAgICMgQmFkIGtleXdvcmQgbmFtZS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCB0aW5mbz1vZmY0MikKKyAgICAgICAgIyBUb28gbWFueSBhcmdzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIG9mZjQyLCBvZmY0MikKKworICAgICAgICAjIFdlIGRvbid0IGtub3cgd2hpY2ggdGltZSB6b25lIHdlJ3JlIGluLCBhbmQgZG9uJ3QgaGF2ZSBhIHR6aW5mbworICAgICAgICAjIGNsYXNzIHRvIHJlcHJlc2VudCBpdCwgc28gc2VlaW5nIHdoZXRoZXIgYSB0eiBhcmd1bWVudCBhY3R1YWxseQorICAgICAgICAjIGRvZXMgYSBjb252ZXJzaW9uIGlzIHRyaWNreS4KKyAgICAgICAgd2VpcmR0eiA9IEZpeGVkT2Zmc2V0KHRpbWVkZWx0YShob3Vycz0xNSwgbWludXRlcz01OCksICJ3ZWlyZHR6IiwgMCkKKyAgICAgICAgdXRjID0gRml4ZWRPZmZzZXQoMCwgInV0YyIsIDApCisgICAgICAgIGZvciBkdW1teSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIG5vdyA9IGRhdGV0aW1lLm5vdyh3ZWlyZHR6KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdy50emluZm8gaXMgd2VpcmR0eikKKyAgICAgICAgICAgIHV0Y25vdyA9IGRhdGV0aW1lLnV0Y25vdygpLnJlcGxhY2UodHppbmZvPXV0YykKKyAgICAgICAgICAgIG5vdzIgPSB1dGNub3cuYXN0aW1lem9uZSh3ZWlyZHR6KQorICAgICAgICAgICAgaWYgYWJzKG5vdyAtIG5vdzIpIDwgdGltZWRlbHRhKHNlY29uZHM9MzApOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAjIEVsc2UgdGhlIGNvZGUgaXMgYnJva2VuLCBvciBtb3JlIHRoYW4gMzAgc2Vjb25kcyBwYXNzZWQgYmV0d2VlbgorICAgICAgICAgICAgIyBjYWxsczsgYXNzdW1pbmcgdGhlIGxhdHRlciwganVzdCB0cnkgYWdhaW4uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRocmVlIHN0cmlrZXMgYW5kIHdlJ3JlIG91dC4KKyAgICAgICAgICAgIHNlbGYuZmFpbCgidXRjbm93KCksIG5vdyh0eiksIG9yIGFzdGltZXpvbmUoKSBtYXkgYmUgYnJva2VuIikKKworICAgIGRlZiB0ZXN0X3R6aW5mb19mcm9tdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICBtZXRoID0gc2VsZi50aGVjbGFzcy5mcm9tdGltZXN0YW1wCisgICAgICAgIHRzID0gdGltZS50aW1lKCkKKyAgICAgICAgIyBFbnN1cmUgaXQgZG9lc24ndCByZXF1aXJlIHR6aW5mbyAoaS5lLiwgdGhhdCB0aGlzIGRvZXNuJ3QgYmxvdyB1cCkuCisgICAgICAgIGJhc2UgPSBtZXRoKHRzKQorICAgICAgICAjIFRyeSB3aXRoIGFuZCB3aXRob3V0IG5hbWluZyB0aGUga2V5d29yZC4KKyAgICAgICAgb2ZmNDIgPSBGaXhlZE9mZnNldCg0MiwgIjQyIikKKyAgICAgICAgYW5vdGhlciA9IG1ldGgodHMsIG9mZjQyKQorICAgICAgICBhZ2FpbiA9IG1ldGgodHMsIHR6PW9mZjQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYW5vdGhlci50emluZm8gaXMgYWdhaW4udHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFub3RoZXIudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTQyKSkKKyAgICAgICAgIyBCYWQgYXJndW1lbnQgd2l0aCBhbmQgdy9vIG5hbWluZyB0aGUga2V5d29yZC4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZXRoLCB0cywgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIHR6aW5mbz0xNikKKyAgICAgICAgIyBCYWQga2V5d29yZCBuYW1lLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIHRzLCB0aW5mbz1vZmY0MikKKyAgICAgICAgIyBUb28gbWFueSBhcmdzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIHRzLCBvZmY0Miwgb2ZmNDIpCisgICAgICAgICMgVG9vIGZldyBhcmdzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgpCisKKyAgICAgICAgIyBUcnkgdG8gbWFrZSBzdXJlIHR6PSBhY3R1YWxseSBkb2VzIHNvbWUgY29udmVyc2lvbi4KKyAgICAgICAgdGltZXN0YW1wID0gMTAwMDAwMDAwMAorICAgICAgICB1dGNkYXRldGltZSA9IGRhdGV0aW1lLnV0Y2Zyb210aW1lc3RhbXAodGltZXN0YW1wKQorICAgICAgICAjIEluIFBPU0lYIChlcG9jaCAxOTcwKSwgdGhhdCdzIDIwMDEtMDktMDkgMDE6NDY6NDAgVVRDLCBnaXZlIG9yIHRha2UuCisgICAgICAgICMgQnV0IG9uIHNvbWUgZmxhdm9yIG9mIE1hYywgaXQncyBub3doZXJlIG5lYXIgdGhhdC4gIFNvIHdlIGNhbid0IGhhdmUKKyAgICAgICAgIyBhbnkgaWRlYSBoZXJlIHdoYXQgdGltZSB0aGF0IGFjdHVhbGx5IGlzLCB3ZSBjYW4gb25seSB0ZXN0IHRoYXQKKyAgICAgICAgIyByZWxhdGl2ZSBjaGFuZ2VzIG1hdGNoLgorICAgICAgICB1dGNvZmZzZXQgPSB0aW1lZGVsdGEoaG91cnM9LTE1LCBtaW51dGVzPTM5KSAjIGFyYml0cmFyeSwgYnV0IG5vdCB6ZXJvCisgICAgICAgIHR6ID0gRml4ZWRPZmZzZXQodXRjb2Zmc2V0LCAidHoiLCAwKQorICAgICAgICBleHBlY3RlZCA9IHV0Y2RhdGV0aW1lICsgdXRjb2Zmc2V0CisgICAgICAgIGdvdCA9IGRhdGV0aW1lLmZyb210aW1lc3RhbXAodGltZXN0YW1wLCB0eikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290LnJlcGxhY2UodHppbmZvPU5vbmUpKQorCisgICAgZGVmIHRlc3RfdHppbmZvX3V0Y25vdyhzZWxmKToKKyAgICAgICAgbWV0aCA9IHNlbGYudGhlY2xhc3MudXRjbm93CisgICAgICAgICMgRW5zdXJlIGl0IGRvZXNuJ3QgcmVxdWlyZSB0emluZm8gKGkuZS4sIHRoYXQgdGhpcyBkb2Vzbid0IGJsb3cgdXApLgorICAgICAgICBiYXNlID0gbWV0aCgpCisgICAgICAgICMgVHJ5IHdpdGggYW5kIHdpdGhvdXQgbmFtaW5nIHRoZSBrZXl3b3JkOyBmb3Igd2hhdGV2ZXIgcmVhc29uLAorICAgICAgICAjIHV0Y25vdygpIGRvZXNuJ3QgYWNjZXB0IGEgdHppbmZvIGFyZ3VtZW50LgorICAgICAgICBvZmY0MiA9IEZpeGVkT2Zmc2V0KDQyLCAiNDIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIG9mZjQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIHR6aW5mbz1vZmY0MikKKworICAgIGRlZiB0ZXN0X3R6aW5mb191dGNmcm9tdGltZXN0YW1wKHNlbGYpOgorICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICBtZXRoID0gc2VsZi50aGVjbGFzcy51dGNmcm9tdGltZXN0YW1wCisgICAgICAgIHRzID0gdGltZS50aW1lKCkKKyAgICAgICAgIyBFbnN1cmUgaXQgZG9lc24ndCByZXF1aXJlIHR6aW5mbyAoaS5lLiwgdGhhdCB0aGlzIGRvZXNuJ3QgYmxvdyB1cCkuCisgICAgICAgIGJhc2UgPSBtZXRoKHRzKQorICAgICAgICAjIFRyeSB3aXRoIGFuZCB3aXRob3V0IG5hbWluZyB0aGUga2V5d29yZDsgZm9yIHdoYXRldmVyIHJlYXNvbiwKKyAgICAgICAgIyB1dGNmcm9tdGltZXN0YW1wKCkgZG9lc24ndCBhY2NlcHQgYSB0emluZm8gYXJndW1lbnQuCisgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIG9mZjQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIHRzLCB0emluZm89b2ZmNDIpCisKKyAgICBkZWYgdGVzdF90emluZm9fdGltZXR1cGxlKHNlbGYpOgorICAgICAgICAjIFRlc3REYXRlVGltZSB0ZXN0ZWQgbW9zdCBvZiB0aGlzLiAgZGF0ZXRpbWUgYWRkcyBhIHR3aXN0IHRvIHRoZQorICAgICAgICAjIERTVCBmbGFnLgorICAgICAgICBjbGFzcyBEU1QodHppbmZvKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkc3R2YWx1ZSk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShkc3R2YWx1ZSwgaW50KToKKyAgICAgICAgICAgICAgICAgICAgZHN0dmFsdWUgPSB0aW1lZGVsdGEobWludXRlcz1kc3R2YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmRzdHZhbHVlID0gZHN0dmFsdWUKKyAgICAgICAgICAgIGRlZiBkc3Qoc2VsZiwgZHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRzdHZhbHVlCisKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworICAgICAgICBmb3IgZHN0dmFsdWUsIGZsYWcgaW4gKC0zMywgMSksICgzMywgMSksICgwLCAwKSwgKE5vbmUsIC0xKToKKyAgICAgICAgICAgIGQgPSBjbHMoMSwgMSwgMSwgMTAsIDIwLCAzMCwgNDAsIHR6aW5mbz1EU1QoZHN0dmFsdWUpKQorICAgICAgICAgICAgdCA9IGQudGltZXR1cGxlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgdC50bV95ZWFyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB0LnRtX21vbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgdC50bV9tZGF5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgdC50bV9ob3VyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyMCwgdC50bV9taW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMwLCB0LnRtX3NlYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdC50bV93ZGF5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB0LnRtX3lkYXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWcsIHQudG1faXNkc3QpCisKKyAgICAgICAgIyBkc3QoKSByZXR1cm5zIHdyb25nIHR5cGUuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2xzKDEsIDEsIDEsIHR6aW5mbz1EU1QoIngiKSkudGltZXR1cGxlKQorCisgICAgICAgICMgZHN0KCkgYXQgdGhlIGVkZ2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xzKDEsMSwxLCB0emluZm89RFNUKDE0MzkpKS50aW1ldHVwbGUoKS50bV9pc2RzdCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMoMSwxLDEsIHR6aW5mbz1EU1QoLTE0MzkpKS50aW1ldHVwbGUoKS50bV9pc2RzdCwgMSkKKworICAgICAgICAjIGRzdCgpIG91dCBvZiByYW5nZS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2xzKDEsMSwxLCB0emluZm89RFNUKDE0NDApKS50aW1ldHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNscygxLDEsMSwgdHppbmZvPURTVCgtMTQ0MCkpLnRpbWV0dXBsZSkKKworICAgIGRlZiB0ZXN0X3V0Y3RpbWV0dXBsZShzZWxmKToKKyAgICAgICAgY2xhc3MgRFNUKHR6aW5mbyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZHN0dmFsdWUpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZHN0dmFsdWUsIGludCk6CisgICAgICAgICAgICAgICAgICAgIGRzdHZhbHVlID0gdGltZWRlbHRhKG1pbnV0ZXM9ZHN0dmFsdWUpCisgICAgICAgICAgICAgICAgc2VsZi5kc3R2YWx1ZSA9IGRzdHZhbHVlCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kc3R2YWx1ZQorCisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgIyBUaGlzIGNhbid0IHdvcms6ICBEU1QgZGlkbid0IGltcGxlbWVudCB1dGNvZmZzZXQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNscygxLCAxLCAxLCB0emluZm89RFNUKDApKS51dGNvZmZzZXQpCisKKyAgICAgICAgY2xhc3MgVU9GUyhEU1QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVvZnMsIGRvZnM9Tm9uZSk6CisgICAgICAgICAgICAgICAgRFNULl9faW5pdF9fKHNlbGYsIGRvZnMpCisgICAgICAgICAgICAgICAgc2VsZi51b2ZzID0gdGltZWRlbHRhKG1pbnV0ZXM9dW9mcykKKyAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnVvZnMKKworICAgICAgICAjIEVuc3VyZSB0bV9pc2RzdCBpcyAwIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBkc3QoKSBzYXlzOiAgRFNUIGlzIG5ldmVyCisgICAgICAgICMgaW4gZWZmZWN0IGZvciBhIFVUQyB0aW1lLgorICAgICAgICBmb3IgZHN0dmFsdWUgaW4gLTMzLCAzMywgMCwgTm9uZToKKyAgICAgICAgICAgIGQgPSBjbHMoMSwgMiwgMywgMTAsIDIwLCAzMCwgNDAsIHR6aW5mbz1VT0ZTKC01MywgZHN0dmFsdWUpKQorICAgICAgICAgICAgdCA9IGQudXRjdGltZXR1cGxlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC55ZWFyLCB0LnRtX3llYXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQubW9udGgsIHQudG1fbW9uKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmRheSwgdC50bV9tZGF5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMSwgdC50bV9ob3VyKSAjIDIwbW0gKyA1M21tID0gMWhuICsgMTNtbQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMywgdC50bV9taW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuc2Vjb25kLCB0LnRtX3NlYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC53ZWVrZGF5KCksIHQudG1fd2RheSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC50b29yZGluYWwoKSAtIGRhdGUoMSwgMSwgMSkudG9vcmRpbmFsKCkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnRtX3lkYXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHQudG1faXNkc3QpCisKKyAgICAgICAgIyBBdCB0aGUgZWRnZXMsIFVUQyBhZGp1c3RtZW50IGNhbiBub3JtYWxpemUgaW50byB5ZWFycyBvdXQtb2YtcmFuZ2UKKyAgICAgICAgIyBmb3IgYSBkYXRldGltZSBvYmplY3QuICBFbnN1cmUgdGhhdCBhIGNvcnJlY3QgdGltZXR1cGxlIGlzCisgICAgICAgICMgY3JlYXRlZCBhbnl3YXkuCisgICAgICAgIHRpbnkgPSBjbHMoTUlOWUVBUiwgMSwgMSwgMCwgMCwgMzcsIHR6aW5mbz1VT0ZTKDE0MzkpKQorICAgICAgICAjIFRoYXQgZ29lcyBiYWNrIDEgbWludXRlIGxlc3MgdGhhbiBhIGZ1bGwgZGF5LgorICAgICAgICB0ID0gdGlueS51dGN0aW1ldHVwbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1feWVhciwgTUlOWUVBUi0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1fbW9uLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX21kYXksIDMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1faG91ciwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX21pbiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX3NlYywgMzcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV95ZGF5LCAzNjYpICAgICMgInllYXIgMCIgaXMgYSBsZWFwIHllYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX2lzZHN0LCAwKQorCisgICAgICAgIGh1Z2UgPSBjbHMoTUFYWUVBUiwgMTIsIDMxLCAyMywgNTksIDM3LCA5OTk5OTksIHR6aW5mbz1VT0ZTKC0xNDM5KSkKKyAgICAgICAgIyBUaGF0IGdvZXMgZm9yd2FyZCAxIG1pbnV0ZSBsZXNzIHRoYW4gYSBmdWxsIGRheS4KKyAgICAgICAgdCA9IGh1Z2UudXRjdGltZXR1cGxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX3llYXIsIE1BWFlFQVIrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX21vbiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX21kYXksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV9ob3VyLCAyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX21pbiwgNTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50bV9zZWMsIDM3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudG1feWRheSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRtX2lzZHN0LCAwKQorCisgICAgZGVmIHRlc3RfdHppbmZvX2lzb2Zvcm1hdChzZWxmKToKKyAgICAgICAgemVybyA9IEZpeGVkT2Zmc2V0KDAsICIrMDA6MDAiKQorICAgICAgICBwbHVzID0gRml4ZWRPZmZzZXQoMjIwLCAiKzAzOjQwIikKKyAgICAgICAgbWludXMgPSBGaXhlZE9mZnNldCgtMjMxLCAiLTAzOjUxIikKKyAgICAgICAgdW5rbm93biA9IEZpeGVkT2Zmc2V0KE5vbmUsICIiKQorCisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgZGF0ZXN0ciA9ICcwMDAxLTAyLTAzJworICAgICAgICBmb3Igb2ZzIGluIE5vbmUsIHplcm8sIHBsdXMsIG1pbnVzLCB1bmtub3duOgorICAgICAgICAgICAgZm9yIHVzIGluIDAsIDk4NzAwMToKKyAgICAgICAgICAgICAgICBkID0gY2xzKDEsIDIsIDMsIDQsIDUsIDU5LCB1cywgdHppbmZvPW9mcykKKyAgICAgICAgICAgICAgICB0aW1lc3RyID0gJzA0OjA1OjU5JyArICh1cyBhbmQgJy45ODcwMDEnIG9yICcnKQorICAgICAgICAgICAgICAgIG9mc3N0ciA9IG9mcyBpcyBub3QgTm9uZSBhbmQgZC50em5hbWUoKSBvciAnJworICAgICAgICAgICAgICAgIHRhaWxzdHIgPSB0aW1lc3RyICsgb2Zzc3RyCisgICAgICAgICAgICAgICAgaXNvID0gZC5pc29mb3JtYXQoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNvLCBkYXRlc3RyICsgJ1QnICsgdGFpbHN0cikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzbywgZC5pc29mb3JtYXQoJ1QnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXNvZm9ybWF0KCdrJyksIGRhdGVzdHIgKyAnaycgKyB0YWlsc3RyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCBkYXRlc3RyICsgJyAnICsgdGFpbHN0cikKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKKyAgICAgICAgejEwMCA9IEZpeGVkT2Zmc2V0KDEwMCwgIisxMDAiKQorICAgICAgICB6bTIwMCA9IEZpeGVkT2Zmc2V0KHRpbWVkZWx0YShtaW51dGVzPS0yMDApLCAiLTIwMCIpCisgICAgICAgIGFyZ3MgPSBbMSwgMiwgMywgNCwgNSwgNiwgNywgejEwMF0KKyAgICAgICAgYmFzZSA9IGNscygqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCBiYXNlLnJlcGxhY2UoKSkKKworICAgICAgICBpID0gMAorICAgICAgICBmb3IgbmFtZSwgbmV3dmFsIGluICgoInllYXIiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtb250aCIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImRheSIsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhvdXIiLCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaW51dGUiLCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJzZWNvbmQiLCA3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJtaWNyb3NlY29uZCIsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInR6aW5mbyIsIHptMjAwKSk6CisgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQorICAgICAgICAgICAgbmV3YXJnc1tpXSA9IG5ld3ZhbAorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjbHMoKm5ld2FyZ3MpCisgICAgICAgICAgICBnb3QgPSBiYXNlLnJlcGxhY2UoKip7bmFtZTogbmV3dmFsfSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgIGkgKz0gMQorCisgICAgICAgICMgRW5zdXJlIHdlIGNhbiBnZXQgcmlkIG9mIGEgdHppbmZvLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UudHpuYW1lKCksICIrMTAwIikKKyAgICAgICAgYmFzZTIgPSBiYXNlLnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50emluZm8gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhc2UyLnR6bmFtZSgpIGlzIE5vbmUpCisKKyAgICAgICAgIyBFbnN1cmUgd2UgY2FuIGFkZCBvbmUuCisgICAgICAgIGJhc2UzID0gYmFzZTIucmVwbGFjZSh0emluZm89ejEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCBiYXNlMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJhc2UudHppbmZvIGlzIGJhc2UzLnR6aW5mbykKKworICAgICAgICAjIE91dCBvZiBib3VuZHMuCisgICAgICAgIGJhc2UgPSBjbHMoMjAwMCwgMiwgMjkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJhc2UucmVwbGFjZSwgeWVhcj0yMDAxKQorCisgICAgZGVmIHRlc3RfbW9yZV9hc3RpbWV6b25lKHNlbGYpOgorICAgICAgICAjIFRoZSBpbmhlcml0ZWQgdGVzdF9hc3RpbWV6b25lIGNvdmVyZWQgc29tZSB0cml2aWFsIGFuZCBlcnJvciBjYXNlcy4KKyAgICAgICAgZm5vbmUgPSBGaXhlZE9mZnNldChOb25lLCAiTm9uZSIpCisgICAgICAgIGY0NG0gPSBGaXhlZE9mZnNldCg0NCwgIjQ0IikKKyAgICAgICAgZm01aCA9IEZpeGVkT2Zmc2V0KC10aW1lZGVsdGEoaG91cnM9NSksICJtMzAwIikKKworICAgICAgICBkdCA9IHNlbGYudGhlY2xhc3Mubm93KHR6PWY0NG0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdC50emluZm8gaXMgZjQ0bSkKKyAgICAgICAgIyBSZXBsYWNpbmcgd2l0aCBkZWdlbmVyYXRlIHR6aW5mbyByYWlzZXMgYW4gZXhjZXB0aW9uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkdC5hc3RpbWV6b25lLCBmbm9uZSkKKyAgICAgICAgIyBEaXR0byB3aXRoIE5vbmUgdHouCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZHQuYXN0aW1lem9uZSwgTm9uZSkKKyAgICAgICAgIyBSZXBsYWNpbmcgd2l0aCBzYW1lIHR6aW5mbyBtYWtlcyBubyBjaGFuZ2UuCisgICAgICAgIHggPSBkdC5hc3RpbWV6b25lKGR0LnR6aW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHgudHppbmZvIGlzIGY0NG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5kYXRlKCksIGR0LmRhdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnRpbWUoKSwgZHQudGltZSgpKQorCisgICAgICAgICMgUmVwbGFjaW5nIHdpdGggZGlmZmVyZW50IHR6aW5mbyBkb2VzIGFkanVzdC4KKyAgICAgICAgZ290ID0gZHQuYXN0aW1lem9uZShmbTVoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ290LnR6aW5mbyBpcyBmbTVoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdC51dGNvZmZzZXQoKSwgdGltZWRlbHRhKGhvdXJzPS01KSkKKyAgICAgICAgZXhwZWN0ZWQgPSBkdCAtIGR0LnV0Y29mZnNldCgpICAjIGluIGVmZmVjdCwgY29udmVydCB0byBVVEMKKyAgICAgICAgZXhwZWN0ZWQgKz0gZm01aC51dGNvZmZzZXQoZHQpICAjIGFuZCBmcm9tIHRoZXJlIHRvIGxvY2FsIHRpbWUKKyAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5yZXBsYWNlKHR6aW5mbz1mbTVoKSAjIGFuZCBhdHRhY2ggbmV3IHR6aW5mbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdC5kYXRlKCksIGV4cGVjdGVkLmRhdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QudGltZSgpLCBleHBlY3RlZC50aW1lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LnRpbWV0eigpLCBleHBlY3RlZC50aW1ldHooKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdvdC50emluZm8gaXMgZXhwZWN0ZWQudHppbmZvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9hd2FyZV9zdWJ0cmFjdChzZWxmKToKKyAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcworCisgICAgICAgICMgRW5zdXJlIHRoYXQgdXRjb2Zmc2V0KCkgaXMgaWdub3JlZCB3aGVuIHRoZSBvcGVyYW5kcyBoYXZlIHRoZQorICAgICAgICAjIHNhbWUgdHppbmZvIG1lbWJlci4KKyAgICAgICAgY2xhc3MgT3BlcmFuZERlcGVuZGVudE9mZnNldCh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBpZiB0Lm1pbnV0ZSA8IDEwOgorICAgICAgICAgICAgICAgICAgICAjIGQwIGFuZCBkMSBlcXVhbCBhZnRlciBhZGp1c3RtZW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aW1lZGVsdGEobWludXRlcz10Lm1pbnV0ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGQyIG9mZiBpbiB0aGUgd2VlZHMKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVkZWx0YShtaW51dGVzPTU5KQorCisgICAgICAgIGJhc2UgPSBjbHMoOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCB0emluZm89T3BlcmFuZERlcGVuZGVudE9mZnNldCgpKQorICAgICAgICBkMCA9IGJhc2UucmVwbGFjZShtaW51dGU9MykKKyAgICAgICAgZDEgPSBiYXNlLnJlcGxhY2UobWludXRlPTkpCisgICAgICAgIGQyID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT0xMSkKKyAgICAgICAgZm9yIHggaW4gZDAsIGQxLCBkMjoKKyAgICAgICAgICAgIGZvciB5IGluIGQwLCBkMSwgZDI6CisgICAgICAgICAgICAgICAgZ290ID0geCAtIHkKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRpbWVkZWx0YShtaW51dGVzPXgubWludXRlIC0geS5taW51dGUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgICAgICMgT1RPSCwgaWYgdGhlIHR6aW5mbyBtZW1iZXJzIGFyZSBkaXN0aW5jdCwgdXRjb2Zmc2V0cyBhcmVuJ3QKKyAgICAgICAgIyBpZ25vcmVkLgorICAgICAgICBiYXNlID0gY2xzKDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCkKKyAgICAgICAgZDAgPSBiYXNlLnJlcGxhY2UobWludXRlPTMsIHR6aW5mbz1PcGVyYW5kRGVwZW5kZW50T2Zmc2V0KCkpCisgICAgICAgIGQxID0gYmFzZS5yZXBsYWNlKG1pbnV0ZT05LCB0emluZm89T3BlcmFuZERlcGVuZGVudE9mZnNldCgpKQorICAgICAgICBkMiA9IGJhc2UucmVwbGFjZShtaW51dGU9MTEsIHR6aW5mbz1PcGVyYW5kRGVwZW5kZW50T2Zmc2V0KCkpCisgICAgICAgIGZvciB4IGluIGQwLCBkMSwgZDI6CisgICAgICAgICAgICBmb3IgeSBpbiBkMCwgZDEsIGQyOgorICAgICAgICAgICAgICAgIGdvdCA9IHggLSB5CisgICAgICAgICAgICAgICAgaWYgKHggaXMgZDAgb3IgeCBpcyBkMSkgYW5kICh5IGlzIGQwIG9yIHkgaXMgZDEpOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRpbWVkZWx0YSgwKQorICAgICAgICAgICAgICAgIGVsaWYgeCBpcyB5IGlzIGQyOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHRpbWVkZWx0YSgwKQorICAgICAgICAgICAgICAgIGVsaWYgeCBpcyBkMjoKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0aW1lZGVsdGEobWludXRlcz0oMTEtNTkpLTApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHkgaXMgZDIKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSB0aW1lZGVsdGEobWludXRlcz0wLSgxMS01OSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfY29tcGFyZShzZWxmKToKKyAgICAgICAgdDEgPSBkYXRldGltZSgxLCAyLCAzLCA0LCA1LCA2LCA3KQorICAgICAgICB0MiA9IGRhdGV0aW1lKDEsIDIsIDMsIDQsIDUsIDYsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPUZpeGVkT2Zmc2V0KE5vbmUsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCisgICAgICAgIHQyID0gdDIucmVwbGFjZSh0emluZm89Rml4ZWRPZmZzZXQoMCwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogdDEgPT0gdDIpCisKKyAgICAgICAgIyBJbiBkYXRldGltZSB3LyBpZGVudGljYWwgdHppbmZvIG9iamVjdHMsIHV0Y29mZnNldCBpcyBpZ25vcmVkLgorICAgICAgICBjbGFzcyBWYXJpZXModHppbmZvKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCA9IHRpbWVkZWx0YShtaW51dGVzPTIyKQorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCB0KToKKyAgICAgICAgICAgICAgICBzZWxmLm9mZnNldCArPSB0aW1lZGVsdGEobWludXRlcz0xKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm9mZnNldAorCisgICAgICAgIHYgPSBWYXJpZXMoKQorICAgICAgICB0MSA9IHQyLnJlcGxhY2UodHppbmZvPXYpCisgICAgICAgIHQyID0gdDIucmVwbGFjZSh0emluZm89dikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MjMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz0yNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorCisgICAgICAgICMgQnV0IGlmIHRoZXkncmUgbm90IGlkZW50aWNhbCwgaXQgaXNuJ3QgaWdub3JlZC4KKyAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz1WYXJpZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpICAjIHQxJ3Mgb2Zmc2V0IGNvdW50ZXIgc3RpbGwgZ29pbmcgdXAKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2RhdGV0aW1ldHooc2VsZik6CisKKyAgICAgICAgY2xhc3MgQyhzZWxmLnRoZWNsYXNzKToKKyAgICAgICAgICAgIHRoZUFuc3dlciA9IDQyCisKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dzKToKKyAgICAgICAgICAgICAgICB0ZW1wID0ga3dzLmNvcHkoKQorICAgICAgICAgICAgICAgIGV4dHJhID0gdGVtcC5wb3AoJ2V4dHJhJykKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzZWxmLnRoZWNsYXNzLl9fbmV3X18oY2xzLCAqYXJncywgKip0ZW1wKQorICAgICAgICAgICAgICAgIHJlc3VsdC5leHRyYSA9IGV4dHJhCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgICAgICAgICBkZWYgbmV3bWV0aChzZWxmLCBzdGFydCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgc2VsZi5ob3VyICsgc2VsZi55ZWFyCisKKyAgICAgICAgYXJncyA9IDIwMDIsIDEyLCAzMSwgNCwgNSwgNiwgNTAwLCBGaXhlZE9mZnNldCgtMzAwLCAiRVNUIiwgMSkKKworICAgICAgICBkdDEgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQorICAgICAgICBkdDIgPSBDKCphcmdzLCAqKnsnZXh0cmEnOiA3fSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5fX2NsYXNzX18sIEMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLnRoZUFuc3dlciwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQyLmV4dHJhLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MS51dGNvZmZzZXQoKSwgZHQyLnV0Y29mZnNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0Mi5uZXdtZXRoKC03KSwgZHQxLmhvdXIgKyBkdDEueWVhciAtIDcpCisKKyMgUGFpbiB0byBzZXQgdXAgRFNULWF3YXJlIHR6aW5mbyBjbGFzc2VzLgorCitkZWYgZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKGR0KToKKyAgICBkYXlzX3RvX2dvID0gNiAtIGR0LndlZWtkYXkoKQorICAgIGlmIGRheXNfdG9fZ286CisgICAgICAgIGR0ICs9IHRpbWVkZWx0YShkYXlzX3RvX2dvKQorICAgIHJldHVybiBkdAorCitaRVJPID0gdGltZWRlbHRhKDApCitIT1VSID0gdGltZWRlbHRhKGhvdXJzPTEpCitEQVkgPSB0aW1lZGVsdGEoZGF5cz0xKQorIyBJbiB0aGUgVVMsIERTVCBzdGFydHMgYXQgMmFtIChzdGFuZGFyZCB0aW1lKSBvbiB0aGUgZmlyc3QgU3VuZGF5IGluIEFwcmlsLgorRFNUU1RBUlQgPSBkYXRldGltZSgxLCA0LCAxLCAyKQorIyBhbmQgZW5kcyBhdCAyYW0gKERTVCB0aW1lOyAxYW0gc3RhbmRhcmQgdGltZSkgb24gdGhlIGxhc3QgU3VuZGF5IG9mIE9jdCwKKyMgd2hpY2ggaXMgdGhlIGZpcnN0IFN1bmRheSBvbiBvciBhZnRlciBPY3QgMjUuICBCZWNhdXNlIHdlIHZpZXcgMTpNTSBhcworIyBiZWluZyBzdGFuZGFyZCB0aW1lIG9uIHRoYXQgZGF5LCB0aGVyZSBpcyBubyBzcGVsbGluZyBpbiBsb2NhbCB0aW1lIG9mCisjIHRoZSBsYXN0IGhvdXIgb2YgRFNUICh0aGF0J3MgMTpNTSBEU1QsIGJ1dCAxOk1NIGlzIHRha2VuIGFzIHN0YW5kYXJkIHRpbWUpLgorRFNURU5EID0gZGF0ZXRpbWUoMSwgMTAsIDI1LCAxKQorCitjbGFzcyBVU1RpbWVab25lKHR6aW5mbyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaG91cnMsIHJlcHJuYW1lLCBzdGRuYW1lLCBkc3RuYW1lKToKKyAgICAgICAgc2VsZi5zdGRvZmZzZXQgPSB0aW1lZGVsdGEoaG91cnM9aG91cnMpCisgICAgICAgIHNlbGYucmVwcm5hbWUgPSByZXBybmFtZQorICAgICAgICBzZWxmLnN0ZG5hbWUgPSBzdGRuYW1lCisgICAgICAgIHNlbGYuZHN0bmFtZSA9IGRzdG5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucmVwcm5hbWUKKworICAgIGRlZiB0em5hbWUoc2VsZiwgZHQpOgorICAgICAgICBpZiBzZWxmLmRzdChkdCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kc3RuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGRuYW1lCisKKyAgICBkZWYgdXRjb2Zmc2V0KHNlbGYsIGR0KToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3Rkb2Zmc2V0ICsgc2VsZi5kc3QoZHQpCisKKyAgICBkZWYgZHN0KHNlbGYsIGR0KToKKyAgICAgICAgaWYgZHQgaXMgTm9uZSBvciBkdC50emluZm8gaXMgTm9uZToKKyAgICAgICAgICAgICMgQW4gZXhjZXB0aW9uIGluc3RlYWQgbWF5IGJlIHNlbnNpYmxlIGhlcmUsIGluIG9uZSBvciBtb3JlIG9mCisgICAgICAgICAgICAjIHRoZSBjYXNlcy4KKyAgICAgICAgICAgIHJldHVybiBaRVJPCisgICAgICAgIGFzc2VydCBkdC50emluZm8gaXMgc2VsZgorCisgICAgICAgICMgRmluZCBmaXJzdCBTdW5kYXkgaW4gQXByaWwuCisgICAgICAgIHN0YXJ0ID0gZmlyc3Rfc3VuZGF5X29uX29yX2FmdGVyKERTVFNUQVJULnJlcGxhY2UoeWVhcj1kdC55ZWFyKSkKKyAgICAgICAgYXNzZXJ0IHN0YXJ0LndlZWtkYXkoKSA9PSA2IGFuZCBzdGFydC5tb250aCA9PSA0IGFuZCBzdGFydC5kYXkgPD0gNworCisgICAgICAgICMgRmluZCBsYXN0IFN1bmRheSBpbiBPY3RvYmVyLgorICAgICAgICBlbmQgPSBmaXJzdF9zdW5kYXlfb25fb3JfYWZ0ZXIoRFNURU5ELnJlcGxhY2UoeWVhcj1kdC55ZWFyKSkKKyAgICAgICAgYXNzZXJ0IGVuZC53ZWVrZGF5KCkgPT0gNiBhbmQgZW5kLm1vbnRoID09IDEwIGFuZCBlbmQuZGF5ID49IDI1CisKKyAgICAgICAgIyBDYW4ndCBjb21wYXJlIG5haXZlIHRvIGF3YXJlIG9iamVjdHMsIHNvIHN0cmlwIHRoZSB0aW1lem9uZSBmcm9tCisgICAgICAgICMgZHQgZmlyc3QuCisgICAgICAgIGlmIHN0YXJ0IDw9IGR0LnJlcGxhY2UodHppbmZvPU5vbmUpIDwgZW5kOgorICAgICAgICAgICAgcmV0dXJuIEhPVVIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBaRVJPCisKK0Vhc3Rlcm4gID0gVVNUaW1lWm9uZSgtNSwgIkVhc3Rlcm4iLCAgIkVTVCIsICJFRFQiKQorQ2VudHJhbCAgPSBVU1RpbWVab25lKC02LCAiQ2VudHJhbCIsICAiQ1NUIiwgIkNEVCIpCitNb3VudGFpbiA9IFVTVGltZVpvbmUoLTcsICJNb3VudGFpbiIsICJNU1QiLCAiTURUIikKK1BhY2lmaWMgID0gVVNUaW1lWm9uZSgtOCwgIlBhY2lmaWMiLCAgIlBTVCIsICJQRFQiKQordXRjX3JlYWwgPSBGaXhlZE9mZnNldCgwLCAiVVRDIiwgMCkKKyMgRm9yIGJldHRlciB0ZXN0IGNvdmVyYWdlLCB3ZSB3YW50IGFub3RoZXIgZmxhdm9yIG9mIFVUQyB0aGF0J3Mgd2VzdCBvZgorIyB0aGUgRWFzdGVybiBhbmQgUGFjaWZpYyB0aW1lem9uZXMuCit1dGNfZmFrZSA9IEZpeGVkT2Zmc2V0KC0xMio2MCwgIlVUQ2Zha2UiLCAwKQorCitjbGFzcyBUZXN0VGltZXpvbmVDb252ZXJzaW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGUgRFNUIHN3aXRjaCB0aW1lcyBmb3IgMjAwMiwgaW4gc3RkIHRpbWUuCisgICAgZHN0b24gPSBkYXRldGltZSgyMDAyLCA0LCA3LCAyKQorICAgIGRzdG9mZiA9IGRhdGV0aW1lKDIwMDIsIDEwLCAyNywgMSkKKworICAgIHRoZWNsYXNzID0gZGF0ZXRpbWUKKworICAgICMgQ2hlY2sgYSB0aW1lIHRoYXQncyBpbnNpZGUgRFNULgorICAgIGRlZiBjaGVja2luc2lkZShzZWxmLCBkdCwgdHosIHV0YywgZHN0b24sIGRzdG9mZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuZHN0KCksIEhPVVIpCisKKyAgICAgICAgIyBDb252ZXJzaW9uIHRvIG91ciBvd24gdGltZXpvbmUgaXMgYWx3YXlzIGFuIGlkZW50aXR5LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LmFzdGltZXpvbmUodHopLCBkdCkKKworICAgICAgICBhc3V0YyA9IGR0LmFzdGltZXpvbmUodXRjKQorICAgICAgICB0aGVyZV9hbmRfYmFjayA9IGFzdXRjLmFzdGltZXpvbmUodHopCisKKyAgICAgICAgIyBDb252ZXJzaW9uIHRvIFVUQyBhbmQgYmFjayBpc24ndCBhbHdheXMgYW4gaWRlbnRpdHkgaGVyZSwKKyAgICAgICAgIyBiZWNhdXNlIHRoZXJlIGFyZSByZWR1bmRhbnQgc3BlbGxpbmdzIChpbiBsb2NhbCB0aW1lKSBvZgorICAgICAgICAjIFVUQyB0aW1lIHdoZW4gRFNUIGJlZ2luczogIHRoZSBjbG9jayBqdW1wcyBmcm9tIDE6NTk6NTkKKyAgICAgICAgIyB0byAzOjAwOjAwLCBhbmQgYSBsb2NhbCB0aW1lIG9mIDI6TU06U1MgZG9lc24ndCByZWFsbHkKKyAgICAgICAgIyBtYWtlIHNlbnNlIHRoZW4uICBUaGUgY2xhc3NlcyBhYm92ZSB0cmVhdCAyOk1NOlNTIGFzCisgICAgICAgICMgZGF5bGlnaHQgdGltZSB0aGVuIChpdCdzICJhZnRlciAyYW0iKSwgcmVhbGx5IGFuIGFsaWFzCisgICAgICAgICMgZm9yIDE6TU06U1Mgc3RhbmRhcmQgdGltZS4gIFRoZSBsYXR0ZXIgZm9ybSBpcyB3aGF0CisgICAgICAgICMgY29udmVyc2lvbiBiYWNrIGZyb20gVVRDIHByb2R1Y2VzLgorICAgICAgICBpZiBkdC5kYXRlKCkgPT0gZHN0b24uZGF0ZSgpIGFuZCBkdC5ob3VyID09IDI6CisgICAgICAgICAgICAjIFdlJ3JlIGluIHRoZSByZWR1bmRhbnQgaG91ciwgYW5kIGNvbWluZyBiYWNrIGZyb20KKyAgICAgICAgICAgICMgVVRDIGdpdmVzIHRoZSAxOk1NOlNTIHN0YW5kYXJkLXRpbWUgc3BlbGxpbmcuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRoZXJlX2FuZF9iYWNrICsgSE9VUiwgZHQpCisgICAgICAgICAgICAjIEFsdGhvdWdoIGR1cmluZyB3YXMgY29uc2lkZXJlZCB0byBiZSBpbiBkYXlsaWdodAorICAgICAgICAgICAgIyB0aW1lLCB0aGVyZV9hbmRfYmFjayBpcyBub3QuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRoZXJlX2FuZF9iYWNrLmRzdCgpLCBaRVJPKQorICAgICAgICAgICAgIyBUaGV5J3JlIHRoZSBzYW1lIHRpbWVzIGluIFVUQy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhlcmVfYW5kX2JhY2suYXN0aW1lem9uZSh1dGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdC5hc3RpbWV6b25lKHV0YykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdlJ3JlIG5vdCBpbiB0aGUgcmVkdW5kYW50IGhvdXIuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0LCB0aGVyZV9hbmRfYmFjaykKKworICAgICAgICAjIEJlY2F1c2Ugd2UgaGF2ZSBhIHJlZHVuZGFudCBzcGVsbGluZyB3aGVuIERTVCBiZWdpbnMsIHRoZXJlIGlzCisgICAgICAgICMgKHVuZm9ydHVuYXRlbHkpIGFuIGhvdXIgd2hlbiBEU1QgZW5kcyB0aGF0IGNhbid0IGJlIHNwZWxsZWQgYXQgYWxsIGluCisgICAgICAgICMgbG9jYWwgdGltZS4gIFdoZW4gRFNUIGVuZHMsIHRoZSBjbG9jayBqdW1wcyBmcm9tIDE6NTkgYmFjayB0byAxOjAwCisgICAgICAgICMgYWdhaW4uICBUaGUgaG91ciAxOk1NIERTVCBoYXMgbm8gc3BlbGxpbmcgdGhlbjogIDE6TU0gaXMgdGFrZW4gdG8gYmUKKyAgICAgICAgIyBzdGFuZGFyZCB0aW1lLiAgMTpNTSBEU1QgPT0gMDpNTSBFU1QsIGJ1dCAwOk1NIGlzIHRha2VuIHRvIGJlCisgICAgICAgICMgZGF5bGlnaHQgdGltZS4gIFRoZSBob3VyIDE6TU0gZGF5bGlnaHQgPT0gMDpNTSBzdGFuZGFyZCBjYW4ndCBiZQorICAgICAgICAjIGV4cHJlc3NlZCBpbiBsb2NhbCB0aW1lLiAgTmV2ZXJ0aGVsZXNzLCB3ZSB3YW50IGNvbnZlcnNpb24gYmFjaworICAgICAgICAjIGZyb20gVVRDIHRvIG1pbWljIHRoZSBsb2NhbCBjbG9jaydzICJyZXBlYXQgYW4gaG91ciIgYmVoYXZpb3IuCisgICAgICAgIG5leHRob3VyX3V0YyA9IGFzdXRjICsgSE9VUgorICAgICAgICBuZXh0aG91cl90eiA9IG5leHRob3VyX3V0Yy5hc3RpbWV6b25lKHR6KQorICAgICAgICBpZiBkdC5kYXRlKCkgPT0gZHN0b2ZmLmRhdGUoKSBhbmQgZHQuaG91ciA9PSAwOgorICAgICAgICAgICAgIyBXZSdyZSBpbiB0aGUgaG91ciBiZWZvcmUgdGhlIGxhc3QgRFNUIGhvdXIuICBUaGUgbGFzdCBEU1QgaG91cgorICAgICAgICAgICAgIyBpcyBpbmVmZmFibGUuICBXZSB3YW50IHRoZSBjb252ZXJzaW9uIGJhY2sgdG8gcmVwZWF0IDE6TU0uCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHRob3VyX3R6LCBkdC5yZXBsYWNlKGhvdXI9MSkpCisgICAgICAgICAgICBuZXh0aG91cl91dGMgKz0gSE9VUgorICAgICAgICAgICAgbmV4dGhvdXJfdHogPSBuZXh0aG91cl91dGMuYXN0aW1lem9uZSh0eikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dGhvdXJfdHosIGR0LnJlcGxhY2UoaG91cj0xKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dGhvdXJfdHogLSBkdCwgSE9VUikKKworICAgICMgQ2hlY2sgYSB0aW1lIHRoYXQncyBvdXRzaWRlIERTVC4KKyAgICBkZWYgY2hlY2tvdXRzaWRlKHNlbGYsIGR0LCB0eiwgdXRjKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdC5kc3QoKSwgWkVSTykKKworICAgICAgICAjIENvbnZlcnNpb24gdG8gb3VyIG93biB0aW1lem9uZSBpcyBhbHdheXMgYW4gaWRlbnRpdHkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQuYXN0aW1lem9uZSh0eiksIGR0KQorCisgICAgICAgICMgQ29udmVydGluZyB0byBVVEMgYW5kIGJhY2sgaXMgYW4gaWRlbnRpdHkgdG9vLgorICAgICAgICBhc3V0YyA9IGR0LmFzdGltZXpvbmUodXRjKQorICAgICAgICB0aGVyZV9hbmRfYmFjayA9IGFzdXRjLmFzdGltZXpvbmUodHopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIHRoZXJlX2FuZF9iYWNrKQorCisgICAgZGVmIGNvbnZlcnRfYmV0d2Vlbl90el9hbmRfdXRjKHNlbGYsIHR6LCB1dGMpOgorICAgICAgICBkc3RvbiA9IHNlbGYuZHN0b24ucmVwbGFjZSh0emluZm89dHopCisgICAgICAgICMgQmVjYXVzZSAxOk1NIG9uIHRoZSBkYXkgRFNUIGVuZHMgaXMgdGFrZW4gYXMgYmVpbmcgc3RhbmRhcmQgdGltZSwKKyAgICAgICAgIyB0aGVyZSBpcyBubyBzcGVsbGluZyBpbiB0eiBmb3IgdGhlIGxhc3QgaG91ciBvZiBkYXlsaWdodCB0aW1lLgorICAgICAgICAjIEZvciBwdXJwb3NlcyBvZiB0aGUgdGVzdCwgdGhlIGxhc3QgaG91ciBvZiBEU1QgaXMgMDpNTSwgd2hpY2ggaXMKKyAgICAgICAgIyB0YWtlbiBhcyBiZWluZyBkYXlsaWdodCB0aW1lIChhbmQgMTpNTSBpcyB0YWtlbiBhcyBiZWluZyBzdGFuZGFyZAorICAgICAgICAjIHRpbWUpLgorICAgICAgICBkc3RvZmYgPSBzZWxmLmRzdG9mZi5yZXBsYWNlKHR6aW5mbz10eikKKyAgICAgICAgZm9yIGRlbHRhIGluICh0aW1lZGVsdGEod2Vla3M9MTMpLAorICAgICAgICAgICAgICAgICAgICAgIERBWSwKKyAgICAgICAgICAgICAgICAgICAgICBIT1VSLAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVkZWx0YShtaW51dGVzPTEpLAorICAgICAgICAgICAgICAgICAgICAgIHRpbWVkZWx0YShtaWNyb3NlY29uZHM9MSkpOgorCisgICAgICAgICAgICBzZWxmLmNoZWNraW5zaWRlKGRzdG9uLCB0eiwgdXRjLCBkc3RvbiwgZHN0b2ZmKQorICAgICAgICAgICAgZm9yIGR1cmluZyBpbiBkc3RvbiArIGRlbHRhLCBkc3RvZmYgLSBkZWx0YToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNraW5zaWRlKGR1cmluZywgdHosIHV0YywgZHN0b24sIGRzdG9mZikKKworICAgICAgICAgICAgc2VsZi5jaGVja291dHNpZGUoZHN0b2ZmLCB0eiwgdXRjKQorICAgICAgICAgICAgZm9yIG91dHNpZGUgaW4gZHN0b24gLSBkZWx0YSwgZHN0b2ZmICsgZGVsdGE6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja291dHNpZGUob3V0c2lkZSwgdHosIHV0YykKKworICAgIGRlZiB0ZXN0X2Vhc3koc2VsZik6CisgICAgICAgICMgRGVzcGl0ZSB0aGUgbmFtZSBvZiB0aGlzIHRlc3QsIHRoZSBlbmRjYXNlcyBhcmUgZXhjcnVjaWF0aW5nLgorICAgICAgICBzZWxmLmNvbnZlcnRfYmV0d2Vlbl90el9hbmRfdXRjKEVhc3Rlcm4sIHV0Y19yZWFsKQorICAgICAgICBzZWxmLmNvbnZlcnRfYmV0d2Vlbl90el9hbmRfdXRjKFBhY2lmaWMsIHV0Y19yZWFsKQorICAgICAgICBzZWxmLmNvbnZlcnRfYmV0d2Vlbl90el9hbmRfdXRjKEVhc3Rlcm4sIHV0Y19mYWtlKQorICAgICAgICBzZWxmLmNvbnZlcnRfYmV0d2Vlbl90el9hbmRfdXRjKFBhY2lmaWMsIHV0Y19mYWtlKQorICAgICAgICAjIFRoZSBuZXh0IGlzIHJlYWxseSBkYW5jaW5nIG5lYXIgdGhlIGVkZ2UuICBJdCB3b3JrcyBiZWNhdXNlCisgICAgICAgICMgUGFjaWZpYyBhbmQgRWFzdGVybiBhcmUgZmFyIGVub3VnaCBhcGFydCB0aGF0IHRoZWlyICJwcm9ibGVtCisgICAgICAgICMgaG91cnMiIGRvbid0IG92ZXJsYXAuCisgICAgICAgIHNlbGYuY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoRWFzdGVybiwgUGFjaWZpYykKKyAgICAgICAgc2VsZi5jb252ZXJ0X2JldHdlZW5fdHpfYW5kX3V0YyhQYWNpZmljLCBFYXN0ZXJuKQorICAgICAgICAjIE9UT0gsIHRoZXNlIGZhaWwhICBEb24ndCBlbmFibGUgdGhlbS4gIFRoZSBkaWZmaWN1bHR5IGlzIHRoYXQKKyAgICAgICAgIyB0aGUgZWRnZSBjYXNlIHRlc3RzIGFzc3VtZSB0aGF0IGV2ZXJ5IGhvdXIgaXMgcmVwcmVzZW50YWJsZSBpbgorICAgICAgICAjIHRoZSAidXRjIiBjbGFzcy4gIFRoaXMgaXMgYWx3YXlzIHRydWUgZm9yIGEgZml4ZWQtb2Zmc2V0IHR6aW5mbworICAgICAgICAjIGNsYXNzIChsa2UgdXRjX3JlYWwgYW5kIHV0Y19mYWtlKSwgYnV0IG5vdCBmb3IgRWFzdGVybiBvciBDZW50cmFsLgorICAgICAgICAjIEZvciB0aGVzZSBhZGphY2VudCBEU1QtYXdhcmUgdGltZSB6b25lcywgdGhlIHJhbmdlIG9mIHRpbWUgb2Zmc2V0cworICAgICAgICAjIHRlc3RlZCBlbmRzIHVwIGNyZWF0aW5nIGhvdXJzIGluIHRoZSBvbmUgdGhhdCBhcmVuJ3QgcmVwcmVzZW50YWJsZQorICAgICAgICAjIGluIHRoZSBvdGhlci4gIEZvciB0aGUgc2FtZSByZWFzb24sIHdlIHdvdWxkIHNlZSBmYWlsdXJlcyBpbiB0aGUKKyAgICAgICAgIyBFYXN0ZXJuIHZzIFBhY2lmaWMgdGVzdHMgdG9vIGlmIHdlIGFkZGVkIDMqSE9VUiB0byB0aGUgbGlzdCBvZgorICAgICAgICAjIG9mZnNldCBkZWx0YXMgaW4gY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoKS4KKyAgICAgICAgIworICAgICAgICAjIHNlbGYuY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoRWFzdGVybiwgQ2VudHJhbCkgICMgY2FuJ3Qgd29yaworICAgICAgICAjIHNlbGYuY29udmVydF9iZXR3ZWVuX3R6X2FuZF91dGMoQ2VudHJhbCwgRWFzdGVybikgICMgY2FuJ3Qgd29yaworCisgICAgZGVmIHRlc3RfdHJpY2t5KHNlbGYpOgorICAgICAgICAjIDIyOjAwIG9uIGRheSBiZWZvcmUgZGF5bGlnaHQgc3RhcnRzLgorICAgICAgICBmb3VyYmFjayA9IHNlbGYuZHN0b24gLSB0aW1lZGVsdGEoaG91cnM9NCkKKyAgICAgICAgbmluZXdlc3QgPSBGaXhlZE9mZnNldCgtOSo2MCwgIi0wOTAwIiwgMCkKKyAgICAgICAgZm91cmJhY2sgPSBmb3VyYmFjay5yZXBsYWNlKHR6aW5mbz1uaW5ld2VzdCkKKyAgICAgICAgIyAyMjowMC0wOTAwIGlzIDc6MDAgVVRDID09IDI6MDAgRVNUID09IDM6MDAgRFNULiAgU2luY2UgaXQncyAiYWZ0ZXIKKyAgICAgICAgIyAyIiwgd2Ugc2hvdWxkIGdldCB0aGUgMyBzcGVsbGluZy4KKyAgICAgICAgIyBJZiB3ZSBwbHVnIDIyOjAwIHRoZSBkYXkgYmVmb3JlIGludG8gRWFzdGVybiwgaXQgImxvb2tzIGxpa2Ugc3RkCisgICAgICAgICMgdGltZSIsIHNvIGl0cyBvZmZzZXQgaXMgcmV0dXJuZWQgYXMgLTUsIGFuZCAtNSAtIC05ID0gNC4gIEFkZGluZyA0CisgICAgICAgICMgdG8gMjI6MDAgbGFuZHMgb24gMjowMCwgd2hpY2ggbWFrZXMgbm8gc2Vuc2UgaW4gbG9jYWwgdGltZSAodGhlCisgICAgICAgICMgbG9jYWwgY2xvY2sganVtcHMgZnJvbSAxIHRvIDMpLiAgVGhlIHBvaW50IGhlcmUgaXMgdG8gbWFrZSBzdXJlIHdlCisgICAgICAgICMgZ2V0IHRoZSAzIHNwZWxsaW5nLgorICAgICAgICBleHBlY3RlZCA9IHNlbGYuZHN0b24ucmVwbGFjZShob3VyPTMpCisgICAgICAgIGdvdCA9IGZvdXJiYWNrLmFzdGltZXpvbmUoRWFzdGVybikucmVwbGFjZSh0emluZm89Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgICAgICMgU2ltaWxhciwgYnV0IG1hcCB0byA2OjAwIFVUQyA9PSAxOjAwIEVTVCA9PSAyOjAwIERTVC4gIEluIHRoYXQKKyAgICAgICAgIyBjYXNlIHdlIHdhbnQgdGhlIDE6MDAgc3BlbGxpbmcuCisgICAgICAgIHNpeHV0YyA9IHNlbGYuZHN0b24ucmVwbGFjZShob3VyPTYsIHR6aW5mbz11dGNfcmVhbCkKKyAgICAgICAgIyBOb3cgNjowMCAibG9va3MgbGlrZSBkYXlsaWdodCIsIHNvIHRoZSBvZmZzZXQgd3J0IEVhc3Rlcm4gaXMgLTQsCisgICAgICAgICMgYW5kIGFkZGluZyAtNC0wID09IC00IGdpdmVzIHRoZSAyOjAwIHNwZWxsaW5nLiAgV2Ugd2FudCB0aGUgMTowMCBFU1QKKyAgICAgICAgIyBzcGVsbGluZy4KKyAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLmRzdG9uLnJlcGxhY2UoaG91cj0xKQorICAgICAgICBnb3QgPSBzaXh1dGMuYXN0aW1lem9uZShFYXN0ZXJuKS5yZXBsYWNlKHR6aW5mbz1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAgICAgIyBOb3cgb24gdGhlIGRheSBEU1QgZW5kcywgd2Ugd2FudCAicmVwZWF0IGFuIGhvdXIiIGJlaGF2aW9yLgorICAgICAgICAjICBVVEMgIDQ6TU0gIDU6TU0gIDY6TU0gIDc6TU0gIGNoZWNraW5nIHRoZXNlCisgICAgICAgICMgIEVTVCAyMzpNTSAgMDpNTSAgMTpNTSAgMjpNTQorICAgICAgICAjICBFRFQgIDA6TU0gIDE6TU0gIDI6TU0gIDM6TU0KKyAgICAgICAgIyB3YWxsICAwOk1NICAxOk1NICAxOk1NICAyOk1NICBhZ2FpbnN0IHRoZXNlCisgICAgICAgIGZvciB1dGMgaW4gdXRjX3JlYWwsIHV0Y19mYWtlOgorICAgICAgICAgICAgZm9yIHR6IGluIEVhc3Rlcm4sIFBhY2lmaWM6CisgICAgICAgICAgICAgICAgZmlyc3Rfc3RkX2hvdXIgPSBzZWxmLmRzdG9mZiAtIHRpbWVkZWx0YShob3Vycz0yKSAjIDIzOk1NCisgICAgICAgICAgICAgICAgIyBDb252ZXJ0IHRoYXQgdG8gVVRDLgorICAgICAgICAgICAgICAgIGZpcnN0X3N0ZF9ob3VyIC09IHR6LnV0Y29mZnNldChOb25lKQorICAgICAgICAgICAgICAgICMgQWRqdXN0IGZvciBwb3NzaWJseSBmYWtlIFVUQy4KKyAgICAgICAgICAgICAgICBhc3V0YyA9IGZpcnN0X3N0ZF9ob3VyICsgdXRjLnV0Y29mZnNldChOb25lKQorICAgICAgICAgICAgICAgICMgRmlyc3QgVVRDIGhvdXIgdG8gY29udmVydDsgdGhpcyBpcyA0OjAwIHdoZW4gdXRjPXV0Y19yZWFsICYKKyAgICAgICAgICAgICAgICAjIHR6PUVhc3Rlcm4uCisgICAgICAgICAgICAgICAgYXN1dGNiYXNlID0gYXN1dGMucmVwbGFjZSh0emluZm89dXRjKQorICAgICAgICAgICAgICAgIGZvciB0emhvdXIgaW4gKDAsIDEsIDEsIDIpOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZGJhc2UgPSBzZWxmLmRzdG9mZi5yZXBsYWNlKGhvdXI9dHpob3VyKQorICAgICAgICAgICAgICAgICAgICBmb3IgbWludXRlIGluIDAsIDMwLCA1OToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZXhwZWN0ZWRiYXNlLnJlcGxhY2UobWludXRlPW1pbnV0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzdXRjID0gYXN1dGNiYXNlLnJlcGxhY2UobWludXRlPW1pbnV0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzdHogPSBhc3V0Yy5hc3RpbWV6b25lKHR6KQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc3R6LnJlcGxhY2UodHppbmZvPU5vbmUpLCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgYXN1dGNiYXNlICs9IEhPVVIKKworCisgICAgZGVmIHRlc3RfYm9ndXNfZHN0KHNlbGYpOgorICAgICAgICBjbGFzcyBvayh0emluZm8pOgorICAgICAgICAgICAgZGVmIHV0Y29mZnNldChzZWxmLCBkdCk6IHJldHVybiBIT1VSCisgICAgICAgICAgICBkZWYgZHN0KHNlbGYsIGR0KTogcmV0dXJuIEhPVVIKKworICAgICAgICBub3cgPSBzZWxmLnRoZWNsYXNzLm5vdygpLnJlcGxhY2UodHppbmZvPXV0Y19yZWFsKQorICAgICAgICAjIERvZXNuJ3QgYmxvdyB1cC4KKyAgICAgICAgbm93LmFzdGltZXpvbmUob2soKSkKKworICAgICAgICAjIERvZXMgYmxvdyB1cC4KKyAgICAgICAgY2xhc3Mgbm90b2sob2spOgorICAgICAgICAgICAgZGVmIGRzdChzZWxmLCBkdCk6IHJldHVybiBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5vdy5hc3RpbWV6b25lLCBub3RvaygpKQorCisgICAgZGVmIHRlc3RfZnJvbXV0YyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBFYXN0ZXJuLmZyb211dGMpICAgIyBub3QgZW5vdWdoIGFyZ3MKKyAgICAgICAgbm93ID0gZGF0ZXRpbWUudXRjbm93KCkucmVwbGFjZSh0emluZm89dXRjX3JlYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEVhc3Rlcm4uZnJvbXV0Yywgbm93KSAjIHdyb25nIHR6aW5mbworICAgICAgICBub3cgPSBub3cucmVwbGFjZSh0emluZm89RWFzdGVybikgICAjIGluc2VydCBjb3JyZWN0IHR6aW5mbworICAgICAgICBlbm93ID0gRWFzdGVybi5mcm9tdXRjKG5vdykgICAgICAgICAjIGRvZXNuJ3QgYmxvdyB1cAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVub3cudHppbmZvLCBFYXN0ZXJuKSAjIGhhcyByaWdodCB0emluZm8gbWVtYmVyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRWFzdGVybi5mcm9tdXRjLCBub3csIG5vdykgIyB0b28gbWFueSBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRWFzdGVybi5mcm9tdXRjLCBkYXRlLnRvZGF5KCkpICMgd3JvbmcgdHlwZQorCisgICAgICAgICMgQWx3YXlzIGNvbnZlcnRzIFVUQyB0byBzdGFuZGFyZCB0aW1lLgorICAgICAgICBjbGFzcyBGYXV4VVNUaW1lWm9uZShVU1RpbWVab25lKToKKyAgICAgICAgICAgIGRlZiBmcm9tdXRjKHNlbGYsIGR0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZHQgKyBzZWxmLnN0ZG9mZnNldAorICAgICAgICBGRWFzdGVybiAgPSBGYXV4VVNUaW1lWm9uZSgtNSwgIkZFYXN0ZXJuIiwgICJGRVNUIiwgIkZFRFQiKQorCisgICAgICAgICMgIFVUQyAgNDpNTSAgNTpNTSAgNjpNTSAgNzpNTSAgODpNTSAgOTpNTQorICAgICAgICAjICBFU1QgMjM6TU0gIDA6TU0gIDE6TU0gIDI6TU0gIDM6TU0gIDQ6TU0KKyAgICAgICAgIyAgRURUICAwOk1NICAxOk1NICAyOk1NICAzOk1NICA0Ok1NICA1Ok1NCisKKyAgICAgICAgIyBDaGVjayBhcm91bmQgRFNUIHN0YXJ0LgorICAgICAgICBzdGFydCA9IHNlbGYuZHN0b24ucmVwbGFjZShob3VyPTQsIHR6aW5mbz1FYXN0ZXJuKQorICAgICAgICBmc3RhcnQgPSBzdGFydC5yZXBsYWNlKHR6aW5mbz1GRWFzdGVybikKKyAgICAgICAgZm9yIHdhbGwgaW4gMjMsIDAsIDEsIDMsIDQsIDU6CisgICAgICAgICAgICBleHBlY3RlZCA9IHN0YXJ0LnJlcGxhY2UoaG91cj13YWxsKQorICAgICAgICAgICAgaWYgd2FsbCA9PSAyMzoKKyAgICAgICAgICAgICAgICBleHBlY3RlZCAtPSB0aW1lZGVsdGEoZGF5cz0xKQorICAgICAgICAgICAgZ290ID0gRWFzdGVybi5mcm9tdXRjKHN0YXJ0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgICAgICAgICBleHBlY3RlZCA9IGZzdGFydCArIEZFYXN0ZXJuLnN0ZG9mZnNldAorICAgICAgICAgICAgZ290ID0gRkVhc3Rlcm4uZnJvbXV0Yyhmc3RhcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAgICAgICAgICMgRW5zdXJlIGFzdGltZXpvbmUoKSBjYWxscyBmcm9tdXRjKCkgdG9vLgorICAgICAgICAgICAgZ290ID0gZnN0YXJ0LnJlcGxhY2UodHppbmZvPXV0Y19yZWFsKS5hc3RpbWV6b25lKEZFYXN0ZXJuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorCisgICAgICAgICAgICBzdGFydCArPSBIT1VSCisgICAgICAgICAgICBmc3RhcnQgKz0gSE9VUgorCisgICAgICAgICMgQ2hlY2sgYXJvdW5kIERTVCBlbmQuCisgICAgICAgIHN0YXJ0ID0gc2VsZi5kc3RvZmYucmVwbGFjZShob3VyPTQsIHR6aW5mbz1FYXN0ZXJuKQorICAgICAgICBmc3RhcnQgPSBzdGFydC5yZXBsYWNlKHR6aW5mbz1GRWFzdGVybikKKyAgICAgICAgZm9yIHdhbGwgaW4gMCwgMSwgMSwgMiwgMywgNDoKKyAgICAgICAgICAgIGV4cGVjdGVkID0gc3RhcnQucmVwbGFjZShob3VyPXdhbGwpCisgICAgICAgICAgICBnb3QgPSBFYXN0ZXJuLmZyb211dGMoc3RhcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAgICAgICAgIGV4cGVjdGVkID0gZnN0YXJ0ICsgRkVhc3Rlcm4uc3Rkb2Zmc2V0CisgICAgICAgICAgICBnb3QgPSBGRWFzdGVybi5mcm9tdXRjKGZzdGFydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgICAgICAgICAgIyBFbnN1cmUgYXN0aW1lem9uZSgpIGNhbGxzIGZyb211dGMoKSB0b28uCisgICAgICAgICAgICBnb3QgPSBmc3RhcnQucmVwbGFjZSh0emluZm89dXRjX3JlYWwpLmFzdGltZXpvbmUoRkVhc3Rlcm4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QpCisKKyAgICAgICAgICAgIHN0YXJ0ICs9IEhPVVIKKyAgICAgICAgICAgIGZzdGFydCArPSBIT1VSCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgb2RkYmFsbHMKKworY2xhc3MgT2RkYmFsbHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYnVnXzEwMjgzMDYoc2VsZik6CisgICAgICAgICMgVHJ5aW5nIHRvIGNvbXBhcmUgYSBkYXRlIHRvIGEgZGF0ZXRpbWUgc2hvdWxkIGFjdCBsaWtlIGEgbWl4ZWQtCisgICAgICAgICMgdHlwZSBjb21wYXJpc29uLCBkZXNwaXRlIHRoYXQgZGF0ZXRpbWUgaXMgYSBzdWJjbGFzcyBvZiBkYXRlLgorICAgICAgICBhc19kYXRlID0gZGF0ZS50b2RheSgpCisgICAgICAgIGFzX2RhdGV0aW1lID0gZGF0ZXRpbWUuY29tYmluZShhc19kYXRlLCB0aW1lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhc19kYXRlICE9IGFzX2RhdGV0aW1lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZXRpbWUgIT0gYXNfZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRlID09IGFzX2RhdGV0aW1lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGFzX2RhdGV0aW1lID09IGFzX2RhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhc19kYXRlIDwgYXNfZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhc19kYXRldGltZSA8IGFzX2RhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhc19kYXRlIDw9IGFzX2RhdGV0aW1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZXRpbWUgPD0gYXNfZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGUgPiBhc19kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGV0aW1lID4gYXNfZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGFzX2RhdGUgPj0gYXNfZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBhc19kYXRldGltZSA+PSBhc19kYXRlKQorCisgICAgICAgICMgTmV2ZXJ0aGVsc3MsIGNvbXBhcmlzb24gc2hvdWxkIHdvcmsgd2l0aCB0aGUgYmFzZS1jbGFzcyAoZGF0ZSkKKyAgICAgICAgIyBwcm9qZWN0aW9uIGlmIHVzZSBvZiBhIGRhdGUgbWV0aG9kIGlzIGZvcmNlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFzX2RhdGUuX19lcV9fKGFzX2RhdGV0aW1lKSkKKyAgICAgICAgZGlmZmVyZW50X2RheSA9IChhc19kYXRlLmRheSArIDEpICUgMjAgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUucmVwbGFjZShkYXk9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudF9kYXkpKSkKKworICAgICAgICAjIEFuZCBkYXRlIHNob3VsZCBjb21wYXJlIHdpdGggb3RoZXIgc3ViY2xhc3NlcyBvZiBkYXRlLiAgSWYgYQorICAgICAgICAjIHN1YmNsYXNzIHdhbnRzIHRvIHN0b3AgdGhpcywgaXQncyB1cCB0byB0aGUgc3ViY2xhc3MgdG8gZG8gc28uCisgICAgICAgIGRhdGVfc2MgPSBTdWJjbGFzc0RhdGUoYXNfZGF0ZS55ZWFyLCBhc19kYXRlLm1vbnRoLCBhc19kYXRlLmRheSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc19kYXRlLCBkYXRlX3NjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGVfc2MsIGFzX2RhdGUpCisKKyAgICAgICAgIyBEaXR0byBmb3IgZGF0ZXRpbWVzLgorICAgICAgICBkYXRldGltZV9zYyA9IFN1YmNsYXNzRGF0ZXRpbWUoYXNfZGF0ZXRpbWUueWVhciwgYXNfZGF0ZXRpbWUubW9udGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc19kYXRlLmRheSwgMCwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc19kYXRldGltZSwgZGF0ZXRpbWVfc2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0ZXRpbWVfc2MsIGFzX2RhdGV0aW1lKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGF0ZXRpbWUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGF0ZXRpbWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYzJiNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGF0ZXRpbWUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGF0ZXRpbWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTZkYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYXRldGltZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjBiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kYm0ucHkKQEAgLTAsMCArMSw0MiBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorZGJtID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2RibScpCisKK2NsYXNzIERibVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5kID0gZGJtLm9wZW4oc2VsZi5maWxlbmFtZSwgJ2MnKQorICAgICAgICBzZWxmLmQuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3Igc3VmZml4IGluIFsnJywgJy5wYWcnLCAnLmRpcicsICcuZGInXToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSArIHN1ZmZpeCkKKworICAgIGRlZiB0ZXN0X2tleXMoc2VsZik6CisgICAgICAgIHNlbGYuZCA9IGRibS5vcGVuKHNlbGYuZmlsZW5hbWUsICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmQua2V5cygpLCBbXSkKKyAgICAgICAgYSA9IFsoJ2EnLCAnYicpLCAoJzEyMzQ1Njc4OTEwJywgJzAxOTIzNzQxMDk4MjM0MDkxMjg0MDE5ODI0MicpXQorICAgICAgICBmb3IgaywgdiBpbiBhOgorICAgICAgICAgICAgc2VsZi5kW2tdID0gdgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChzZWxmLmQua2V5cygpKSwgc29ydGVkKGsgZm9yIChrLCB2KSBpbiBhKSkKKyAgICAgICAgZm9yIGssIHYgaW4gYToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgc2VsZi5kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRba10sIHYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ3h4eCcsIHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5kWyd4eHgnXSkKKyAgICAgICAgc2VsZi5kLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X21vZGVzKHNlbGYpOgorICAgICAgICBmb3IgbW9kZSBpbiBbJ3InLCAncncnLCAndycsICduJ106CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5kID0gZGJtLm9wZW4oc2VsZi5maWxlbmFtZSwgbW9kZSkKKyAgICAgICAgICAgICAgICBzZWxmLmQuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IGRibS5lcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChEYm1UZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RibS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MDI1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RibS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGJtLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RibS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MDI1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RibS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjaW1hbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY2ltYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxODRlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY2ltYWwucHkKQEAgLTAsMCArMSwyMzUxIEBACisjIENvcHlyaWdodCAoYykgMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworIyBXcml0dGVuIGJ5IEVyaWMgUHJpY2UgPGVwcmljZSBhdCB0amhzc3QuZWR1PgorIyAgICBhbmQgRmFjdW5kbyBCYXRpc3RhIDxmYWN1bmRvIGF0IHRhbmlxdWV0aWwuY29tLmFyPgorIyAgICBhbmQgUmF5bW9uZCBIZXR0aW5nZXIgPHB5dGhvbiBhdCByY24uY29tPgorIyAgICBhbmQgQWFoeiAoYWFoeiBhdCBwb2JveC5jb20pCisjICAgIGFuZCBUaW0gUGV0ZXJzCisKKyIiIgorVGhlc2UgYXJlIHRoZSB0ZXN0IGNhc2VzIGZvciB0aGUgRGVjaW1hbCBtb2R1bGUuCisKK1RoZXJlIGFyZSB0d28gZ3JvdXBzIG9mIHRlc3RzLCBBcml0aG1ldGljIGFuZCBCZWhhdmlvdXIuIFRoZSBmb3JtZXIgdGVzdAordGhlIERlY2ltYWwgYXJpdGhtZXRpYyB1c2luZyB0aGUgdGVzdHMgcHJvdmlkZWQgYnkgTWlrZSBDb3dsaXNoYXcuIFRoZSBsYXR0ZXIKK3Rlc3QgdGhlIHB5dGhvbmljIGJlaGF2aW91ciBhY2NvcmRpbmcgdG8gUEVQIDMyNy4KKworQ293bGlzaGF3J3MgdGVzdHMgY2FuIGJlIGRvd25sb2FkZWQgZnJvbToKKworICAgd3d3Mi5odXJzbGV5LmlibS5jb20vZGVjaW1hbC9kZWN0ZXN0LnppcAorCitUaGlzIHRlc3QgbW9kdWxlIGNhbiBiZSBjYWxsZWQgZnJvbSBjb21tYW5kIGxpbmUgd2l0aCBvbmUgcGFyYW1ldGVyIChBcml0aG1ldGljCitvciBCZWhhdmlvdXIpIHRvIHRlc3QgZWFjaCBwYXJ0LCBvciB3aXRob3V0IHBhcmFtZXRlciB0byB0ZXN0IGJvdGggcGFydHMuIElmCit5b3UncmUgd29ya2luZyB0aHJvdWdoIElETEUsIHlvdSBjYW4gaW1wb3J0IHRoaXMgdGVzdCBtb2R1bGUgYW5kIGNhbGwgdGVzdF9tYWluKCkKK3dpdGggdGhlIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQuCisiIiIKKworaW1wb3J0IG1hdGgKK2ltcG9ydCBvcywgc3lzCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBwaWNrbGUsIGNvcHkKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBkZWNpbWFsIGltcG9ydCAqCitpbXBvcnQgbnVtYmVycworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHJ1bl91bml0dGVzdCwgcnVuX2RvY3Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcmVzb3VyY2VfZW5hYmxlZCwgY2hlY2tfcHkza193YXJuaW5ncykKK2ltcG9ydCByYW5kb20KK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCisjIFVzZWZ1bCBUZXN0IENvbnN0YW50CitTaWduYWxzID0gdHVwbGUoZ2V0Y29udGV4dCgpLmZsYWdzLmtleXMoKSkKKworIyBTaWduYWxzIG9yZGVyZWQgd2l0aCByZXNwZWN0IHRvIHByZWNlZGVuY2U6IHdoZW4gYW4gb3BlcmF0aW9uCisjIHByb2R1Y2VzIG11bHRpcGxlIHNpZ25hbHMsIHNpZ25hbHMgb2NjdXJyaW5nIGxhdGVyIGluIHRoZSBsaXN0CisjIHNob3VsZCBiZSBoYW5kbGVkIGJlZm9yZSB0aG9zZSBvY2N1cnJpbmcgZWFybGllciBpbiB0aGUgbGlzdC4KK09yZGVyZWRTaWduYWxzID0gKENsYW1wZWQsIFJvdW5kZWQsIEluZXhhY3QsIFN1Ym5vcm1hbCwKKyAgICAgICAgICAgICAgICAgIFVuZGVyZmxvdywgT3ZlcmZsb3csIERpdmlzaW9uQnlaZXJvLCBJbnZhbGlkT3BlcmF0aW9uKQorCisjIFRlc3RzIGFyZSBidWlsdCBhcm91bmQgdGhlc2UgYXNzdW1lZCBjb250ZXh0IGRlZmF1bHRzLgorIyB0ZXN0X21haW4oKSByZXN0b3JlcyB0aGUgb3JpZ2luYWwgY29udGV4dC4KK2RlZiBpbml0KCk6CisgICAgZ2xvYmFsIE9SSUdJTkFMX0NPTlRFWFQKKyAgICBPUklHSU5BTF9DT05URVhUID0gZ2V0Y29udGV4dCgpLmNvcHkoKQorICAgIERlZmF1bHRUZXN0Q29udGV4dCA9IENvbnRleHQoCisgICAgICAgIHByZWMgPSA5LAorICAgICAgICByb3VuZGluZyA9IFJPVU5EX0hBTEZfRVZFTiwKKyAgICAgICAgdHJhcHMgPSBkaWN0LmZyb21rZXlzKFNpZ25hbHMsIDApCisgICAgICAgICkKKyAgICBzZXRjb250ZXh0KERlZmF1bHRUZXN0Q29udGV4dCkKKworIyBkZWNvcmF0b3IgZm9yIHNraXBwaW5nIHRlc3RzIG9uIG5vbi1JRUVFIDc1NCBwbGF0Zm9ybXMKK3JlcXVpcmVzX0lFRUVfNzU0ID0gdW5pdHRlc3Quc2tpcFVubGVzcygKKyAgICBmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIiksCisgICAgInRlc3QgcmVxdWlyZXMgSUVFRSA3NTQgZG91YmxlcyIpCisKK1RFU1REQVRBRElSID0gJ2RlY2ltYWx0ZXN0ZGF0YScKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZmlsZSA9IHN5cy5hcmd2WzBdCitlbHNlOgorICAgIGZpbGUgPSBfX2ZpbGVfXwordGVzdGRpciA9IG9zLnBhdGguZGlybmFtZShmaWxlKSBvciBvcy5jdXJkaXIKK2RpcmVjdG9yeSA9IHRlc3RkaXIgKyBvcy5zZXAgKyBURVNUREFUQURJUiArIG9zLnNlcAorCitza2lwX2V4cGVjdGVkID0gbm90IG9zLnBhdGguaXNkaXIoZGlyZWN0b3J5KQorCisjIGxpc3Qgb2YgaW5kaXZpZHVhbCAuZGVjVGVzdCB0ZXN0IGlkcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGVzdHMgdGhhdAorIyB3ZSdyZSBza2lwcGluZyBmb3Igb25lIHJlYXNvbiBvciBhbm90aGVyLgorc2tpcHBlZF90ZXN0X2lkcyA9IHNldChbCisgICAgIyBTa2lwIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHNjYWxlYiB0ZXN0cy4KKyAgICAnc2NieDE2NCcsCisgICAgJ3NjYngxNjUnLAorCisgICAgIyBGb3Igc29tZSBvcGVyYXRpb25zIChjdXJyZW50bHkgZXhwLCBsbiwgbG9nMTAsIHBvd2VyKSwgdGhlIGRlY051bWJlcgorICAgICMgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIGltcG9zZXMgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgb24gdGhlIGNvbnRleHQKKyAgICAjIGFuZCBvcGVyYW5kcy4gIFRoZXNlIHJlc3RyaWN0aW9ucyBhcmUgbm90IHBhcnQgb2YgdGhlIHNwZWNpZmljYXRpb247CisgICAgIyBob3dldmVyLCB0aGUgZWZmZWN0IG9mIHRoZXNlIHJlc3RyaWN0aW9ucyBkb2VzIHNob3cgdXAgaW4gc29tZSBvZiB0aGUKKyAgICAjIHRlc3RjYXNlcy4gIFdlIHNraXAgdGVzdGNhc2VzIHRoYXQgdmlvbGF0ZSB0aGVzZSByZXN0cmljdGlvbnMsIHNpbmNlCisgICAgIyBEZWNpbWFsIGJlaGF2ZXMgZGlmZmVyZW50bHkgZnJvbSBkZWNOdW1iZXIgZm9yIHRoZXNlIHRlc3RjYXNlcyBzbyB0aGVzZQorICAgICMgdGVzdGNhc2VzIHdvdWxkIG90aGVyd2lzZSBmYWlsLgorICAgICdleHB4OTAxJywKKyAgICAnZXhweDkwMicsCisgICAgJ2V4cHg5MDMnLAorICAgICdleHB4OTA1JywKKyAgICAnbG54OTAxJywKKyAgICAnbG54OTAyJywKKyAgICAnbG54OTAzJywKKyAgICAnbG54OTA1JywKKyAgICAnbG9neDkwMScsCisgICAgJ2xvZ3g5MDInLAorICAgICdsb2d4OTAzJywKKyAgICAnbG9neDkwNScsCisgICAgJ3Bvd3gxMTgzJywKKyAgICAncG93eDExODQnLAorICAgICdwb3d4NDAwMScsCisgICAgJ3Bvd3g0MDAyJywKKyAgICAncG93eDQwMDMnLAorICAgICdwb3d4NDAwNScsCisgICAgJ3Bvd3g0MDA4JywKKyAgICAncG93eDQwMTAnLAorICAgICdwb3d4NDAxMicsCisgICAgJ3Bvd3g0MDE0JywKKyAgICBdKQorCisjIE1ha2Ugc3VyZSBpdCBhY3R1YWxseSByYWlzZXMgZXJyb3JzIHdoZW4gbm90IGV4cGVjdGVkIGFuZCBjYXVnaHQgaW4gZmxhZ3MKKyMgU2xvd2VyLCBzaW5jZSBpdCBydW5zIHNvbWUgdGhpbmdzIHNldmVyYWwgdGltZXMuCitFWFRFTkRFREVSUk9SVEVTVCA9IEZhbHNlCisKKyNNYXAgdGhlIHRlc3QgY2FzZXMnIGVycm9yIG5hbWVzIHRvIHRoZSBhY3R1YWwgZXJyb3JzCitFcnJvck5hbWVzID0geydjbGFtcGVkJyA6IENsYW1wZWQsCisgICAgICAgICAgICAgICdjb252ZXJzaW9uX3N5bnRheCcgOiBJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAnZGl2aXNpb25fYnlfemVybycgOiBEaXZpc2lvbkJ5WmVybywKKyAgICAgICAgICAgICAgJ2RpdmlzaW9uX2ltcG9zc2libGUnIDogSW52YWxpZE9wZXJhdGlvbiwKKyAgICAgICAgICAgICAgJ2RpdmlzaW9uX3VuZGVmaW5lZCcgOiBJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAnaW5leGFjdCcgOiBJbmV4YWN0LAorICAgICAgICAgICAgICAnaW52YWxpZF9jb250ZXh0JyA6IEludmFsaWRPcGVyYXRpb24sCisgICAgICAgICAgICAgICdpbnZhbGlkX29wZXJhdGlvbicgOiBJbnZhbGlkT3BlcmF0aW9uLAorICAgICAgICAgICAgICAnb3ZlcmZsb3cnIDogT3ZlcmZsb3csCisgICAgICAgICAgICAgICdyb3VuZGVkJyA6IFJvdW5kZWQsCisgICAgICAgICAgICAgICdzdWJub3JtYWwnIDogU3Vibm9ybWFsLAorICAgICAgICAgICAgICAndW5kZXJmbG93JyA6IFVuZGVyZmxvd30KKworCitkZWYgTm9uZnVuY3Rpb24oKmFyZ3MpOgorICAgICIiIkRvZXNuJ3QgZG8gYW55dGhpbmcuIiIiCisgICAgcmV0dXJuIE5vbmUKKworUm91bmRpbmdEaWN0ID0geydjZWlsaW5nJyA6IFJPVU5EX0NFSUxJTkcsICNNYXBzIHRlc3QtY2FzZSBuYW1lcyB0byByb3VuZGluZ3MuCisgICAgICAgICAgICAgICAgJ2Rvd24nIDogUk9VTkRfRE9XTiwKKyAgICAgICAgICAgICAgICAnZmxvb3InIDogUk9VTkRfRkxPT1IsCisgICAgICAgICAgICAgICAgJ2hhbGZfZG93bicgOiBST1VORF9IQUxGX0RPV04sCisgICAgICAgICAgICAgICAgJ2hhbGZfZXZlbicgOiBST1VORF9IQUxGX0VWRU4sCisgICAgICAgICAgICAgICAgJ2hhbGZfdXAnIDogUk9VTkRfSEFMRl9VUCwKKyAgICAgICAgICAgICAgICAndXAnIDogUk9VTkRfVVAsCisgICAgICAgICAgICAgICAgJzA1dXAnIDogUk9VTkRfMDVVUH0KKworIyBOYW1lIGFkYXB0ZXIgdG8gYmUgYWJsZSB0byBjaGFuZ2UgdGhlIERlY2ltYWwgYW5kIENvbnRleHQKKyMgaW50ZXJmYWNlIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHRlc3QgZmlsZXMgZnJvbSBDb3dsaXNoYXcKK25hbWVBZGFwdGVyID0geydhbmQnOidsb2dpY2FsX2FuZCcsCisgICAgICAgICAgICAgICAnYXBwbHknOidfYXBwbHknLAorICAgICAgICAgICAgICAgJ2NsYXNzJzonbnVtYmVyX2NsYXNzJywKKyAgICAgICAgICAgICAgICdjb21wYXJlc2lnJzonY29tcGFyZV9zaWduYWwnLAorICAgICAgICAgICAgICAgJ2NvbXBhcmV0b3RhbCc6J2NvbXBhcmVfdG90YWwnLAorICAgICAgICAgICAgICAgJ2NvbXBhcmV0b3RtYWcnOidjb21wYXJlX3RvdGFsX21hZycsCisgICAgICAgICAgICAgICAnY29weSc6J2NvcHlfZGVjaW1hbCcsCisgICAgICAgICAgICAgICAnY29weWFicyc6J2NvcHlfYWJzJywKKyAgICAgICAgICAgICAgICdjb3B5bmVnYXRlJzonY29weV9uZWdhdGUnLAorICAgICAgICAgICAgICAgJ2NvcHlzaWduJzonY29weV9zaWduJywKKyAgICAgICAgICAgICAgICdkaXZpZGVpbnQnOidkaXZpZGVfaW50JywKKyAgICAgICAgICAgICAgICdpbnZlcnQnOidsb2dpY2FsX2ludmVydCcsCisgICAgICAgICAgICAgICAnaXNjYW5vbmljYWwnOidpc19jYW5vbmljYWwnLAorICAgICAgICAgICAgICAgJ2lzZmluaXRlJzonaXNfZmluaXRlJywKKyAgICAgICAgICAgICAgICdpc2luZmluaXRlJzonaXNfaW5maW5pdGUnLAorICAgICAgICAgICAgICAgJ2lzbmFuJzonaXNfbmFuJywKKyAgICAgICAgICAgICAgICdpc25vcm1hbCc6J2lzX25vcm1hbCcsCisgICAgICAgICAgICAgICAnaXNxbmFuJzonaXNfcW5hbicsCisgICAgICAgICAgICAgICAnaXNzaWduZWQnOidpc19zaWduZWQnLAorICAgICAgICAgICAgICAgJ2lzc25hbic6J2lzX3NuYW4nLAorICAgICAgICAgICAgICAgJ2lzc3Vibm9ybWFsJzonaXNfc3Vibm9ybWFsJywKKyAgICAgICAgICAgICAgICdpc3plcm8nOidpc196ZXJvJywKKyAgICAgICAgICAgICAgICdtYXhtYWcnOidtYXhfbWFnJywKKyAgICAgICAgICAgICAgICdtaW5tYWcnOidtaW5fbWFnJywKKyAgICAgICAgICAgICAgICduZXh0bWludXMnOiduZXh0X21pbnVzJywKKyAgICAgICAgICAgICAgICduZXh0cGx1cyc6J25leHRfcGx1cycsCisgICAgICAgICAgICAgICAnbmV4dHRvd2FyZCc6J25leHRfdG93YXJkJywKKyAgICAgICAgICAgICAgICdvcic6J2xvZ2ljYWxfb3InLAorICAgICAgICAgICAgICAgJ3JlZHVjZSc6J25vcm1hbGl6ZScsCisgICAgICAgICAgICAgICAncmVtYWluZGVybmVhcic6J3JlbWFpbmRlcl9uZWFyJywKKyAgICAgICAgICAgICAgICdzYW1lcXVhbnR1bSc6J3NhbWVfcXVhbnR1bScsCisgICAgICAgICAgICAgICAnc3F1YXJlcm9vdCc6J3NxcnQnLAorICAgICAgICAgICAgICAgJ3RvZW5nJzondG9fZW5nX3N0cmluZycsCisgICAgICAgICAgICAgICAndG9pbnRlZ3JhbCc6J3RvX2ludGVncmFsX3ZhbHVlJywKKyAgICAgICAgICAgICAgICd0b2ludGVncmFseCc6J3RvX2ludGVncmFsX2V4YWN0JywKKyAgICAgICAgICAgICAgICd0b3NjaSc6J3RvX3NjaV9zdHJpbmcnLAorICAgICAgICAgICAgICAgJ3hvcic6J2xvZ2ljYWxfeG9yJywKKyAgICAgICAgICAgICAgfQorCisjIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHJldHVybiBUcnVlL0ZhbHNlIHJhdGhlciB0aGFuIGEgRGVjaW1hbCBpbnN0YW5jZQorCitMT0dJQ0FMX0ZVTkNUSU9OUyA9ICgKKyAgICAnaXNfY2Fub25pY2FsJywKKyAgICAnaXNfZmluaXRlJywKKyAgICAnaXNfaW5maW5pdGUnLAorICAgICdpc19uYW4nLAorICAgICdpc19ub3JtYWwnLAorICAgICdpc19xbmFuJywKKyAgICAnaXNfc2lnbmVkJywKKyAgICAnaXNfc25hbicsCisgICAgJ2lzX3N1Ym5vcm1hbCcsCisgICAgJ2lzX3plcm8nLAorICAgICdzYW1lX3F1YW50dW0nLAorICAgICkKKworY2xhc3MgRGVjaW1hbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIkNsYXNzIHdoaWNoIHRlc3RzIHRoZSBEZWNpbWFsIGNsYXNzIGFnYWluc3QgdGhlIHRlc3QgY2FzZXMuCisKKyAgICBDaGFuZ2VkIGZvciB1bml0dGVzdC4KKyAgICAiIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29udGV4dCA9IENvbnRleHQoKQorICAgICAgICBzZWxmLmlnbm9yZV9saXN0ID0gWycjJ10KKyAgICAgICAgIyBCYXNpY2FsbHksIGEgIyBtZWFucyByZXR1cm4gTmFOIEludmFsaWRPcGVyYXRpb24uCisgICAgICAgICMgRGlmZmVyZW50IGZyb20gYSBzTmFOIGluIHRyaW0KKworICAgICAgICBzZWxmLkNoYW5nZURpY3QgPSB7J3ByZWNpc2lvbicgOiBzZWxmLmNoYW5nZV9wcmVjaXNpb24sCisgICAgICAgICAgICAgICAgICAgICAgJ3JvdW5kaW5nJyA6IHNlbGYuY2hhbmdlX3JvdW5kaW5nX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAnbWF4ZXhwb25lbnQnIDogc2VsZi5jaGFuZ2VfbWF4X2V4cG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICdtaW5leHBvbmVudCcgOiBzZWxmLmNoYW5nZV9taW5fZXhwb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgJ2NsYW1wJyA6IHNlbGYuY2hhbmdlX2NsYW1wfQorCisgICAgZGVmIGV2YWxfZmlsZShzZWxmLCBmaWxlKToKKyAgICAgICAgZ2xvYmFsIHNraXBfZXhwZWN0ZWQKKyAgICAgICAgaWYgc2tpcF9leHBlY3RlZDoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgd2l0aCBvcGVuKGZpbGUpIGFzIGY6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoJ1xyXG4nLCAnJykucmVwbGFjZSgnXG4nLCAnJykKKyAgICAgICAgICAgICAgICAjcHJpbnQgbGluZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdCA9IHNlbGYuZXZhbF9saW5lKGxpbmUpCisgICAgICAgICAgICAgICAgZXhjZXB0IERlY2ltYWxFeGNlcHRpb24gYXMgZXhjZXB0aW9uOgorICAgICAgICAgICAgICAgICAgICAjRXhjZXB0aW9uIHJhaXNlZCB3aGVyZSB0aGVyZSBzaG91bGRuJ3QgaGF2ZSBiZWVuIG9uZS4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdFeGNlcHRpb24gIicrZXhjZXB0aW9uLl9fY2xhc3NfXy5fX25hbWVfXyArICciIHJhaXNlZCBvbiBsaW5lICcrbGluZSkKKworICAgICAgICByZXR1cm4KKworICAgIGRlZiBldmFsX2xpbmUoc2VsZiwgcyk6CisgICAgICAgIGlmIHMuZmluZCgnIC0+ICcpID49IDAgYW5kIHNbOjJdICE9ICctLScgYW5kIG5vdCBzLnN0YXJ0c3dpdGgoJyAgLS0nKToKKyAgICAgICAgICAgIHMgPSAocy5zcGxpdCgnLT4nKVswXSArICctPicgKworICAgICAgICAgICAgICAgICBzLnNwbGl0KCctPicpWzFdLnNwbGl0KCctLScpWzBdKS5zdHJpcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gcy5zcGxpdCgnLS0nKVswXS5zdHJpcCgpCisKKyAgICAgICAgZm9yIGlnbm9yZSBpbiBzZWxmLmlnbm9yZV9saXN0OgorICAgICAgICAgICAgaWYgcy5maW5kKGlnbm9yZSkgPj0gMDoKKyAgICAgICAgICAgICAgICAjcHJpbnQgcy5zcGxpdCgpWzBdLCAnTm90SW1wbGVtZW50ZWQtLScsIGlnbm9yZQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmICc6JyBpbiBzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZXZhbF9kaXJlY3RpdmUocykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmV2YWxfZXF1YXRpb24ocykKKworICAgIGRlZiBldmFsX2RpcmVjdGl2ZShzZWxmLCBzKToKKyAgICAgICAgZnVuY3QsIHZhbHVlID0gbWFwKGxhbWJkYSB4OiB4LnN0cmlwKCkubG93ZXIoKSwgcy5zcGxpdCgnOicpKQorICAgICAgICBpZiBmdW5jdCA9PSAncm91bmRpbmcnOgorICAgICAgICAgICAgdmFsdWUgPSBSb3VuZGluZ0RpY3RbdmFsdWVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBpbnQodmFsdWUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZnVuY3QgPSBzZWxmLkNoYW5nZURpY3QuZ2V0KGZ1bmN0LCBOb25mdW5jdGlvbikKKyAgICAgICAgZnVuY3QodmFsdWUpCisKKyAgICBkZWYgZXZhbF9lcXVhdGlvbihzZWxmLCBzKToKKyAgICAgICAgI2dsb2JhbCBERUZBVUxUX1BSRUNJU0lPTgorICAgICAgICAjcHJpbnQgREVGQVVMVF9QUkVDSVNJT04KKworICAgICAgICBpZiBub3QgVEVTVF9BTEwgYW5kIHJhbmRvbS5yYW5kb20oKSA8IDAuOTA6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBTaWRlcyA9IHMuc3BsaXQoJy0+JykKKyAgICAgICAgICAgIEwgPSBTaWRlc1swXS5zdHJpcCgpLnNwbGl0KCkKKyAgICAgICAgICAgIGlkID0gTFswXQorICAgICAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICAgICAgcHJpbnQgIlRlc3QgIiwgaWQsCisgICAgICAgICAgICBmdW5jdCA9IExbMV0ubG93ZXIoKQorICAgICAgICAgICAgdmFsc3RlbXAgPSBMWzI6XQorICAgICAgICAgICAgTCA9IFNpZGVzWzFdLnN0cmlwKCkuc3BsaXQoKQorICAgICAgICAgICAgYW5zID0gTFswXQorICAgICAgICAgICAgZXhjZXB0aW9ucyA9IExbMTpdCisgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciwgSW5kZXhFcnJvcik6CisgICAgICAgICAgICByYWlzZSBJbnZhbGlkT3BlcmF0aW9uCisgICAgICAgIGRlZiBGaXhRdW90ZXModmFsKToKKyAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCInJyIsICdTaW5nbGVRdW90ZScpLnJlcGxhY2UoJyIiJywgJ0RvdWJsZVF1b3RlJykKKyAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCInIiwgJycpLnJlcGxhY2UoJyInLCAnJykKKyAgICAgICAgICAgIHZhbCA9IHZhbC5yZXBsYWNlKCdTaW5nbGVRdW90ZScsICInIikucmVwbGFjZSgnRG91YmxlUXVvdGUnLCAnIicpCisgICAgICAgICAgICByZXR1cm4gdmFsCisKKyAgICAgICAgaWYgaWQgaW4gc2tpcHBlZF90ZXN0X2lkczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZuYW1lID0gbmFtZUFkYXB0ZXIuZ2V0KGZ1bmN0LCBmdW5jdCkKKyAgICAgICAgaWYgZm5hbWUgPT0gJ3Jlc2NhbGUnOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZ1bmN0ID0gZ2V0YXR0cihzZWxmLmNvbnRleHQsIGZuYW1lKQorICAgICAgICB2YWxzID0gW10KKyAgICAgICAgY29uZ2xvbWVyYXRlID0gJycKKyAgICAgICAgcXVvdGUgPSAwCisgICAgICAgIHRoZWlyZXhjZXB0aW9ucyA9IFtFcnJvck5hbWVzW3gubG93ZXIoKV0gZm9yIHggaW4gZXhjZXB0aW9uc10KKworICAgICAgICBmb3IgZXhjZXB0aW9uIGluIFNpZ25hbHM6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXhjZXB0aW9uXSA9IDEgI0NhdGNoIHRoZXNlIGJ1Z3MuLi4KKyAgICAgICAgZm9yIGV4Y2VwdGlvbiBpbiB0aGVpcmV4Y2VwdGlvbnM6CisgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXhjZXB0aW9uXSA9IDAKKyAgICAgICAgZm9yIGksIHZhbCBpbiBlbnVtZXJhdGUodmFsc3RlbXApOgorICAgICAgICAgICAgaWYgdmFsLmNvdW50KCInIikgJSAyID09IDE6CisgICAgICAgICAgICAgICAgcXVvdGUgPSAxIC0gcXVvdGUKKyAgICAgICAgICAgIGlmIHF1b3RlOgorICAgICAgICAgICAgICAgIGNvbmdsb21lcmF0ZSA9IGNvbmdsb21lcmF0ZSArICcgJyArIHZhbAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHZhbCA9IGNvbmdsb21lcmF0ZSArIHZhbAorICAgICAgICAgICAgICAgIGNvbmdsb21lcmF0ZSA9ICcnCisgICAgICAgICAgICB2ID0gRml4UXVvdGVzKHZhbCkKKyAgICAgICAgICAgIGlmIGZuYW1lIGluICgndG9fc2NpX3N0cmluZycsICd0b19lbmdfc3RyaW5nJyk6CisgICAgICAgICAgICAgICAgaWYgRVhURU5ERURFUlJPUlRFU1Q6CisgICAgICAgICAgICAgICAgICAgIGZvciBlcnJvciBpbiB0aGVpcmV4Y2VwdGlvbnM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXJyb3JdID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0KHNlbGYuY29udGV4dC5jcmVhdGVfZGVjaW1hbCh2KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgU2lnbmFscywgZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJhaXNlZCAlcyBpbiAlcyB3aGVuICVzIGRpc2FibGVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUsIHMsIGVycm9yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IHJhaXNlICVzIGluICVzIiAlIChlcnJvciwgcykpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbnRleHQudHJhcHNbZXJyb3JdID0gMAorICAgICAgICAgICAgICAgIHYgPSBzZWxmLmNvbnRleHQuY3JlYXRlX2RlY2ltYWwodikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdiA9IERlY2ltYWwodiwgc2VsZi5jb250ZXh0KQorICAgICAgICAgICAgdmFscy5hcHBlbmQodikKKworICAgICAgICBhbnMgPSBGaXhRdW90ZXMoYW5zKQorCisgICAgICAgIGlmIEVYVEVOREVERVJST1JURVNUIGFuZCBmbmFtZSBub3QgaW4gKCd0b19zY2lfc3RyaW5nJywgJ3RvX2VuZ19zdHJpbmcnKToKKyAgICAgICAgICAgIGZvciBlcnJvciBpbiB0aGVpcmV4Y2VwdGlvbnM6CisgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LnRyYXBzW2Vycm9yXSA9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0KCp2YWxzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdCBTaWduYWxzLCBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJhaXNlZCAlcyBpbiAlcyB3aGVuICVzIGRpc2FibGVkIiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLCBzLCBlcnJvcikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IHJhaXNlICVzIGluICVzIiAlIChlcnJvciwgcykpCisgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LnRyYXBzW2Vycm9yXSA9IDAKKworICAgICAgICAgICAgIyBhcyBhYm92ZSwgYnV0IGFkZCB0cmFwcyBjdW11bGF0aXZlbHksIHRvIGNoZWNrIHByZWNlZGVuY2UKKyAgICAgICAgICAgIG9yZGVyZWRfZXJyb3JzID0gW2UgZm9yIGUgaW4gT3JkZXJlZFNpZ25hbHMgaWYgZSBpbiB0aGVpcmV4Y2VwdGlvbnNdCisgICAgICAgICAgICBmb3IgZXJyb3IgaW4gb3JkZXJlZF9lcnJvcnM6CisgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LnRyYXBzW2Vycm9yXSA9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZ1bmN0KCp2YWxzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGV4Y2VwdCBTaWduYWxzLCBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJhaXNlZCAlcyBpbiAlczsgZXhwZWN0ZWQgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlKGUpLCBzLCBlcnJvcikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IHJhaXNlICVzIGluICVzIiAlIChlcnJvciwgcykpCisgICAgICAgICAgICAjIHJlc2V0IHRyYXBzCisgICAgICAgICAgICBmb3IgZXJyb3IgaW4gb3JkZXJlZF9lcnJvcnM6CisgICAgICAgICAgICAgICAgc2VsZi5jb250ZXh0LnRyYXBzW2Vycm9yXSA9IDAKKworCisgICAgICAgIGlmIERFQlVHOgorICAgICAgICAgICAgcHJpbnQgIi0tIiwgc2VsZi5jb250ZXh0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IHN0cihmdW5jdCgqdmFscykpCisgICAgICAgICAgICBpZiBmbmFtZSBpbiBMT0dJQ0FMX0ZVTkNUSU9OUzoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHIoaW50KGV2YWwocmVzdWx0KSkpICMgJ1RydWUnLCAnRmFsc2UnIC0+ICcxJywgJzAnCisgICAgICAgIGV4Y2VwdCBTaWduYWxzLCBlcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiUmFpc2VkICVzIGluICVzIiAlIChlcnJvciwgcykpCisgICAgICAgIGV4Y2VwdDogI0NhdGNoIGFueSBlcnJvciBsb25nIGVub3VnaCB0byBzdGF0ZSB0aGUgdGVzdCBjYXNlLgorICAgICAgICAgICAgcHJpbnQgIkVSUk9SOiIsIHMKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgbXlleGNlcHRpb25zID0gc2VsZi5nZXRleGNlcHRpb25zKCkKKyAgICAgICAgc2VsZi5jb250ZXh0LmNsZWFyX2ZsYWdzKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICdJbmNvcnJlY3QgYW5zd2VyIGZvciAnICsgcyArICcgLS0gZ290ICcgKyByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChteWV4Y2VwdGlvbnMsIHRoZWlyZXhjZXB0aW9ucywKKyAgICAgICAgICAgICAgJ0luY29ycmVjdCBmbGFncyBzZXQgaW4gJyArIHMgKyAnIC0tIGdvdCAnICsgc3RyKG15ZXhjZXB0aW9ucykpCisgICAgICAgIHJldHVybgorCisgICAgZGVmIGdldGV4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbZSBmb3IgZSBpbiBTaWduYWxzIGlmIHNlbGYuY29udGV4dC5mbGFnc1tlXV0KKworICAgIGRlZiBjaGFuZ2VfcHJlY2lzaW9uKHNlbGYsIHByZWMpOgorICAgICAgICBzZWxmLmNvbnRleHQucHJlYyA9IHByZWMKKyAgICBkZWYgY2hhbmdlX3JvdW5kaW5nX21ldGhvZChzZWxmLCByb3VuZGluZyk6CisgICAgICAgIHNlbGYuY29udGV4dC5yb3VuZGluZyA9IHJvdW5kaW5nCisgICAgZGVmIGNoYW5nZV9taW5fZXhwb25lbnQoc2VsZiwgZXhwKToKKyAgICAgICAgc2VsZi5jb250ZXh0LkVtaW4gPSBleHAKKyAgICBkZWYgY2hhbmdlX21heF9leHBvbmVudChzZWxmLCBleHApOgorICAgICAgICBzZWxmLmNvbnRleHQuRW1heCA9IGV4cAorICAgIGRlZiBjaGFuZ2VfY2xhbXAoc2VsZiwgY2xhbXApOgorICAgICAgICBzZWxmLmNvbnRleHQuX2NsYW1wID0gY2xhbXAKKworCisKKyMgVGhlIGZvbGxvd2luZyBjbGFzc2VzIHRlc3QgdGhlIGJlaGF2aW91ciBvZiBEZWNpbWFsIGFjY29yZGluZyB0byBQRVAgMzI3CisKK2NsYXNzIERlY2ltYWxFeHBsaWNpdENvbnN0cnVjdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1VuaXQgdGVzdHMgZm9yIEV4cGxpY2l0IENvbnN0cnVjdGlvbiBjYXNlcyBvZiBEZWNpbWFsLicnJworCisgICAgZGVmIHRlc3RfZXhwbGljaXRfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCgpLCBEZWNpbWFsKCIwIikpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9mcm9tX05vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRGVjaW1hbCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2Zyb21faW50KHNlbGYpOgorCisgICAgICAgICNwb3NpdGl2ZQorICAgICAgICBkID0gRGVjaW1hbCg0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICc0NScpCisKKyAgICAgICAgI3ZlcnkgbGFyZ2UgcG9zaXRpdmUKKyAgICAgICAgZCA9IERlY2ltYWwoNTAwMDAwMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzUwMDAwMDEyMycpCisKKyAgICAgICAgI25lZ2F0aXZlCisgICAgICAgIGQgPSBEZWNpbWFsKC00NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICctNDUnKQorCisgICAgICAgICN6ZXJvCisgICAgICAgIGQgPSBEZWNpbWFsKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnMCcpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9mcm9tX3N0cmluZyhzZWxmKToKKworICAgICAgICAjZW1wdHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCgnJykpLCAnTmFOJykKKworICAgICAgICAjaW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoJzQ1JykpLCAnNDUnKQorCisgICAgICAgICNmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKCc0NS4zNCcpKSwgJzQ1LjM0JykKKworICAgICAgICAjZW5naW5lZXIgbm90YXRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCgnNDVlMicpKSwgJzQuNUUrMycpCisKKyAgICAgICAgI2p1c3Qgbm90IGEgbnVtYmVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoJ3VnbHknKSksICdOYU4nKQorCisgICAgICAgICNsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHBlcm1pdHRlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKCcxLjNFNCBcbicpKSwgJzEuM0UrNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoJyAgLTcuODknKSksICctNy44OScpCisKKyAgICAgICAgI3VuaWNvZGUgc3RyaW5ncyBzaG91bGQgYmUgcGVybWl0dGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwodScwRS0wMTcnKSksICcwRS0xNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwodSc0NScpKSwgJzQ1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRGVjaW1hbCh1Jy1JbmYnKSksICctSW5maW5pdHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKHUnTmFOMTIzJykpLCAnTmFOMTIzJykKKworICAgIGRlZiB0ZXN0X2V4cGxpY2l0X2Zyb21fdHVwbGVzKHNlbGYpOgorCisgICAgICAgICN6ZXJvCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMCwgKDAsKSwgMCkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzAnKQorCisgICAgICAgICNpbnQKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoNCwgNSksIDApICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICctNDUnKQorCisgICAgICAgICNmbG9hdAorICAgICAgICBkID0gRGVjaW1hbCggKDAsICg0LCA1LCAzLCA0KSwgLTIpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICc0NS4zNCcpCisKKyAgICAgICAgI3dlaXJkCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKDQsIDMsIDQsIDksIDEsIDMsIDUsIDMsIDQpLCAtMjUpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICctNC4zNDkxMzUzNEUtMTcnKQorCisgICAgICAgICN3cm9uZyBudW1iZXIgb2YgaXRlbXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAzLCA0LCA5LCAxKSkgKQorCisgICAgICAgICNiYWQgc2lnbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEZWNpbWFsLCAoOCwgKDQsIDMsIDQsIDksIDEpLCAyKSApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERlY2ltYWwsICgwLiwgKDQsIDMsIDQsIDksIDEpLCAyKSApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERlY2ltYWwsIChEZWNpbWFsKDEpLCAoNCwgMywgNCwgOSwgMSksIDIpKQorCisgICAgICAgICNiYWQgZXhwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERlY2ltYWwsICgxLCAoNCwgMywgNCwgOSwgMSksICd3cm9uZyEnKSApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERlY2ltYWwsICgxLCAoNCwgMywgNCwgOSwgMSksIDAuKSApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERlY2ltYWwsICgxLCAoNCwgMywgNCwgOSwgMSksICcxJykgKQorCisgICAgICAgICNiYWQgY29lZmZpY2llbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERlY2ltYWwsICgxLCAoNCwgMywgNCwgTm9uZSwgMSksIDIpICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAtMywgNCwgOSwgMSksIDIpICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAxMCwgNCwgOSwgMSksIDIpICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgRGVjaW1hbCwgKDEsICg0LCAzLCA0LCAnYScsIDEpLCAyKSApCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9mcm9tX2Jvb2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbChEZWNpbWFsKDApKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYm9vbChEZWNpbWFsKDEpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKEZhbHNlKSwgRGVjaW1hbCgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKFRydWUpLCBEZWNpbWFsKDEpKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfZnJvbV9EZWNpbWFsKHNlbGYpOgorCisgICAgICAgICNwb3NpdGl2ZQorICAgICAgICBkID0gRGVjaW1hbCg0NSkKKyAgICAgICAgZSA9IERlY2ltYWwoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICc0NScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorCisgICAgICAgICN2ZXJ5IGxhcmdlIHBvc2l0aXZlCisgICAgICAgIGQgPSBEZWNpbWFsKDUwMDAwMDEyMykKKyAgICAgICAgZSA9IERlY2ltYWwoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICc1MDAwMDAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKKworICAgICAgICAjbmVnYXRpdmUKKyAgICAgICAgZCA9IERlY2ltYWwoLTQ1KQorICAgICAgICBlID0gRGVjaW1hbChkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJy00NScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorCisgICAgICAgICN6ZXJvCisgICAgICAgIGQgPSBEZWNpbWFsKDApCisgICAgICAgIGUgPSBEZWNpbWFsKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfZXhwbGljaXRfZnJvbV9mbG9hdChzZWxmKToKKyAgICAgICAgciA9IERlY2ltYWwoMC4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUociksIERlY2ltYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIpLAorICAgICAgICAgICAgICAgICcwLjEwMDAwMDAwMDAwMDAwMDAwNTU1MTExNTEyMzEyNTc4MjcwMjExODE1ODM0MDQ1NDEwMTU2MjUnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRGVjaW1hbChmbG9hdCgnbmFuJykpLmlzX3FuYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKERlY2ltYWwoZmxvYXQoJ2luZicpKS5pc19pbmZpbml0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRGVjaW1hbChmbG9hdCgnLWluZicpKS5pc19pbmZpbml0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKGZsb2F0KCduYW4nKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCdOYU4nKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoZmxvYXQoJ2luZicpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKERlY2ltYWwoJ0luZmluaXR5JykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKGZsb2F0KCctaW5mJykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoRGVjaW1hbCgnLUluZmluaXR5JykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKGZsb2F0KCctMC4wJykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoRGVjaW1hbCgnLTAnKSkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIwMCk6CisgICAgICAgICAgICB4ID0gcmFuZG9tLmV4cG92YXJpYXRlKDAuMDEpICogKHJhbmRvbS5yYW5kb20oKSAqIDIuMCAtIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgZmxvYXQoRGVjaW1hbCh4KSkpICMgcm91bmR0cmlwCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9jb250ZXh0X2NyZWF0ZV9kZWNpbWFsKHNlbGYpOgorCisgICAgICAgIG5jID0gY29weS5jb3B5KGdldGNvbnRleHQoKSkKKyAgICAgICAgbmMucHJlYyA9IDMKKworICAgICAgICAjIGVtcHR5CisgICAgICAgIGQgPSBEZWNpbWFsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICcwJykKKyAgICAgICAgZCA9IG5jLmNyZWF0ZV9kZWNpbWFsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICcwJykKKworICAgICAgICAjIGZyb20gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG5jLmNyZWF0ZV9kZWNpbWFsLCBOb25lKQorCisgICAgICAgICMgZnJvbSBpbnQKKyAgICAgICAgZCA9IG5jLmNyZWF0ZV9kZWNpbWFsKDQ1NikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQsIERlY2ltYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmMuY3JlYXRlX2RlY2ltYWwoNDU2NzgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5jLmNyZWF0ZV9kZWNpbWFsKCc0NTdFKzInKSkKKworICAgICAgICAjIGZyb20gc3RyaW5nCisgICAgICAgIGQgPSBEZWNpbWFsKCc0NTY3ODknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzQ1Njc4OScpCisgICAgICAgIGQgPSBuYy5jcmVhdGVfZGVjaW1hbCgnNDU2Nzg5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICc0LjU3RSs1JykKKyAgICAgICAgIyBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIHNob3VsZCByZXN1bHQgaW4gYSBOYU47CisgICAgICAgICMgc3BhY2VzIGFyZSBhbHJlYWR5IGNoZWNrZWQgaW4gQ293bGlzaGF3J3MgdGVzdC1zdWl0ZSwgc28KKyAgICAgICAgIyBoZXJlIHdlIGp1c3QgY2hlY2sgdGhhdCBhIHRyYWlsaW5nIG5ld2xpbmUgcmVzdWx0cyBpbiBhIE5hTgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihuYy5jcmVhdGVfZGVjaW1hbCgnMy4xNFxuJykpLCAnTmFOJykKKworICAgICAgICAjIGZyb20gdHVwbGVzCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKDQsIDMsIDQsIDksIDEsIDMsIDUsIDMsIDQpLCAtMjUpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZCksICctNC4zNDkxMzUzNEUtMTcnKQorICAgICAgICBkID0gbmMuY3JlYXRlX2RlY2ltYWwoICgxLCAoNCwgMywgNCwgOSwgMSwgMywgNSwgMywgNCksIC0yNSkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJy00LjM1RS0xNycpCisKKyAgICAgICAgIyBmcm9tIERlY2ltYWwKKyAgICAgICAgcHJldmRlYyA9IERlY2ltYWwoNTAwMDAwMTIzKQorICAgICAgICBkID0gRGVjaW1hbChwcmV2ZGVjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzUwMDAwMDEyMycpCisgICAgICAgIGQgPSBuYy5jcmVhdGVfZGVjaW1hbChwcmV2ZGVjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkKSwgJzUuMDBFKzgnKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9kaWdpdHMoc2VsZik6CisgICAgICAgIHRlc3RfdmFsdWVzID0geworICAgICAgICAgICAgdSdcdWZmMTEnOiAnMScsCisgICAgICAgICAgICB1J1x1MDY2MC5cdTA2NjBcdTA2NjNcdTA2NjdcdTA2NjJlLVx1MDY2MycgOiAnMC4wMDAwMzcyJywKKyAgICAgICAgICAgIHUnLW5hblx1MGM2OFx1MGM2YVx1MGM2Nlx1MGM2NicgOiAnLU5hTjI0MDAnLAorICAgICAgICAgICAgfQorICAgICAgICBmb3IgaW5wdXQsIGV4cGVjdGVkIGluIHRlc3RfdmFsdWVzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihEZWNpbWFsKGlucHV0KSksIGV4cGVjdGVkKQorCisKK2NsYXNzIERlY2ltYWxJbXBsaWNpdENvbnN0cnVjdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1VuaXQgdGVzdHMgZm9yIEltcGxpY2l0IENvbnN0cnVjdGlvbiBjYXNlcyBvZiBEZWNpbWFsLicnJworCisgICAgZGVmIHRlc3RfaW1wbGljaXRfZnJvbV9Ob25lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdEZWNpbWFsKDUpICsgTm9uZScsIGdsb2JhbHMoKSkKKworICAgIGRlZiB0ZXN0X2ltcGxpY2l0X2Zyb21faW50KHNlbGYpOgorICAgICAgICAjbm9ybWFsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoNSkgKyA0NSksICc1MCcpCisgICAgICAgICNleGNlZWRpbmcgcHJlY2lzaW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCg1KSArIDEyMzQ1Njc4OTAwMCwgRGVjaW1hbCgxMjM0NTY3ODkwMDApKQorCisgICAgZGVmIHRlc3RfaW1wbGljaXRfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwgJ0RlY2ltYWwoNSkgKyAiMyInLCBnbG9iYWxzKCkpCisKKyAgICBkZWYgdGVzdF9pbXBsaWNpdF9mcm9tX2Zsb2F0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdEZWNpbWFsKDUpICsgMi4yJywgZ2xvYmFscygpKQorCisgICAgZGVmIHRlc3RfaW1wbGljaXRfZnJvbV9EZWNpbWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNSkgKyBEZWNpbWFsKDQ1KSwgRGVjaW1hbCg1MCkpCisKKyAgICBkZWYgdGVzdF9yb3Aoc2VsZik6CisgICAgICAgICMgQWxsb3cgb3RoZXIgY2xhc3NlcyB0byBiZSB0cmFpbmVkIHRvIGludGVyYWN0IHdpdGggRGVjaW1hbHMKKyAgICAgICAgY2xhc3MgRToKKyAgICAgICAgICAgIGRlZiBfX2Rpdm1vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gJ2Rpdm1vZCAnICsgc3RyKG90aGVyKQorICAgICAgICAgICAgZGVmIF9fcmRpdm1vZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKG90aGVyKSArICcgcmRpdm1vZCcKKyAgICAgICAgICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnbHQgJyArIHN0cihvdGhlcikKKyAgICAgICAgICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnZ3QgJyArIHN0cihvdGhlcikKKyAgICAgICAgICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnbGUgJyArIHN0cihvdGhlcikKKyAgICAgICAgICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnZ2UgJyArIHN0cihvdGhlcikKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnZXEgJyArIHN0cihvdGhlcikKKyAgICAgICAgICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAnbmUgJyArIHN0cihvdGhlcikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdm1vZChFKCksIERlY2ltYWwoMTApKSwgJ2Rpdm1vZCAxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKERlY2ltYWwoMTApLCBFKCkpLCAnMTAgcmRpdm1vZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnRGVjaW1hbCgxMCkgPCBFKCknKSwgJ2d0IDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdEZWNpbWFsKDEwKSA+IEUoKScpLCAnbHQgMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0RlY2ltYWwoMTApIDw9IEUoKScpLCAnZ2UgMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0RlY2ltYWwoMTApID49IEUoKScpLCAnbGUgMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0RlY2ltYWwoMTApID09IEUoKScpLCAnZXEgMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0RlY2ltYWwoMTApICE9IEUoKScpLCAnbmUgMTAnKQorCisgICAgICAgICMgaW5zZXJ0IG9wZXJhdG9yIG1ldGhvZHMgYW5kIHRoZW4gZXhlcmNpc2UgdGhlbQorICAgICAgICBvcGxpc3QgPSBbCisgICAgICAgICAgICAoJysnLCAnX19hZGRfXycsICdfX3JhZGRfXycpLAorICAgICAgICAgICAgKCctJywgJ19fc3ViX18nLCAnX19yc3ViX18nKSwKKyAgICAgICAgICAgICgnKicsICdfX211bF9fJywgJ19fcm11bF9fJyksCisgICAgICAgICAgICAoJyUnLCAnX19tb2RfXycsICdfX3Jtb2RfXycpLAorICAgICAgICAgICAgKCcvLycsICdfX2Zsb29yZGl2X18nLCAnX19yZmxvb3JkaXZfXycpLAorICAgICAgICAgICAgKCcqKicsICdfX3Bvd19fJywgJ19fcnBvd19fJykKKyAgICAgICAgXQorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIGlmIDEgLyAyID09IDA6CisgICAgICAgICAgICAgICAgIyB0ZXN0aW5nIHdpdGggY2xhc3NpYyBkaXZpc2lvbiwgc28gYWRkIF9fZGl2X18KKyAgICAgICAgICAgICAgICBvcGxpc3QuYXBwZW5kKCgnLycsICdfX2Rpdl9fJywgJ19fcmRpdl9fJykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgdGVzdGluZyB3aXRoIC1RbmV3LCBzbyBhZGQgX190cnVlZGl2X18KKyAgICAgICAgICAgICAgICBvcGxpc3QuYXBwZW5kKCgnLycsICdfX3RydWVkaXZfXycsICdfX3J0cnVlZGl2X18nKSkKKworICAgICAgICBmb3Igc3ltLCBsb3AsIHJvcCBpbiBvcGxpc3Q6CisgICAgICAgICAgICBzZXRhdHRyKEUsIGxvcCwgbGFtYmRhIHNlbGYsIG90aGVyOiAnc3RyJyArIGxvcCArIHN0cihvdGhlcikpCisgICAgICAgICAgICBzZXRhdHRyKEUsIHJvcCwgbGFtYmRhIHNlbGYsIG90aGVyOiBzdHIob3RoZXIpICsgcm9wICsgJ3N0cicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0UoKScgKyBzeW0gKyAnRGVjaW1hbCgxMCknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0cicgKyBsb3AgKyAnMTAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKCdEZWNpbWFsKDEwKScgKyBzeW0gKyAnRSgpJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMCcgKyByb3AgKyAnc3RyJykKKworCitjbGFzcyBEZWNpbWFsRm9ybWF0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVW5pdCB0ZXN0cyBmb3IgdGhlIGZvcm1hdCBmdW5jdGlvbi4nJycKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nKHNlbGYpOgorICAgICAgICAjIHRyaXBsZXMgZ2l2aW5nIGEgZm9ybWF0LCBhIERlY2ltYWwsIGFuZCB0aGUgZXhwZWN0ZWQgcmVzdWx0CisgICAgICAgIHRlc3RfdmFsdWVzID0gWworICAgICAgICAgICAgKCdlJywgJzBFLTE1JywgJzBlLTE1JyksCisgICAgICAgICAgICAoJ2UnLCAnMi4zRS0xNScsICcyLjNlLTE1JyksCisgICAgICAgICAgICAoJ2UnLCAnMi4zMEUrMicsICcyLjMwZSsyJyksICMgcHJlc2VydmUgc2lnbmlmaWNhbnQgemVyb3MKKyAgICAgICAgICAgICgnZScsICcyLjMwMDAwRS0xNScsICcyLjMwMDAwZS0xNScpLAorICAgICAgICAgICAgKCdlJywgJzEuMjM0NTY3ODkxMjM0NTY3ODllNDAnLCAnMS4yMzQ1Njc4OTEyMzQ1Njc4OWUrNDAnKSwKKyAgICAgICAgICAgICgnZScsICcxLjUnLCAnMS41ZSswJyksCisgICAgICAgICAgICAoJ2UnLCAnMC4xNScsICcxLjVlLTEnKSwKKyAgICAgICAgICAgICgnZScsICcwLjAxNScsICcxLjVlLTInKSwKKyAgICAgICAgICAgICgnZScsICcwLjAwMDAwMDAwMDAwMTUnLCAnMS41ZS0xMicpLAorICAgICAgICAgICAgKCdlJywgJzE1LjAnLCAnMS41MGUrMScpLAorICAgICAgICAgICAgKCdlJywgJy0xNScsICctMS41ZSsxJyksCisgICAgICAgICAgICAoJ2UnLCAnMCcsICcwZSswJyksCisgICAgICAgICAgICAoJ2UnLCAnMEUxJywgJzBlKzEnKSwKKyAgICAgICAgICAgICgnZScsICcwLjAnLCAnMGUtMScpLAorICAgICAgICAgICAgKCdlJywgJzAuMDAnLCAnMGUtMicpLAorICAgICAgICAgICAgKCcuNmUnLCAnMEUtMTUnLCAnMC4wMDAwMDBlLTknKSwKKyAgICAgICAgICAgICgnLjZlJywgJzAnLCAnMC4wMDAwMDBlKzYnKSwKKyAgICAgICAgICAgICgnLjZlJywgJzkuOTk5OTk5JywgJzkuOTk5OTk5ZSswJyksCisgICAgICAgICAgICAoJy42ZScsICc5Ljk5OTk5OTknLCAnMS4wMDAwMDBlKzEnKSwKKyAgICAgICAgICAgICgnLjZlJywgJy0xLjIzZTUnLCAnLTEuMjMwMDAwZSs1JyksCisgICAgICAgICAgICAoJy42ZScsICcxLjIzNDU2Nzg5ZS0zJywgJzEuMjM0NTY4ZS0zJyksCisgICAgICAgICAgICAoJ2YnLCAnMCcsICcwJyksCisgICAgICAgICAgICAoJ2YnLCAnMC4wJywgJzAuMCcpLAorICAgICAgICAgICAgKCdmJywgJzBFLTInLCAnMC4wMCcpLAorICAgICAgICAgICAgKCdmJywgJzAuMDBFLTgnLCAnMC4wMDAwMDAwMDAwJyksCisgICAgICAgICAgICAoJ2YnLCAnMEUxJywgJzAnKSwgIyBsb3NlcyBleHBvbmVudCBpbmZvcm1hdGlvbgorICAgICAgICAgICAgKCdmJywgJzMuMkUxJywgJzMyJyksCisgICAgICAgICAgICAoJ2YnLCAnMy4yRTInLCAnMzIwJyksCisgICAgICAgICAgICAoJ2YnLCAnMy4yMEUyJywgJzMyMCcpLAorICAgICAgICAgICAgKCdmJywgJzMuMjAwRTInLCAnMzIwLjAnKSwKKyAgICAgICAgICAgICgnZicsICczLjJFLTYnLCAnMC4wMDAwMDMyJyksCisgICAgICAgICAgICAoJy42ZicsICcwRS0xNScsICcwLjAwMDAwMCcpLCAjIGFsbCB6ZXJvcyB0cmVhdGVkIGVxdWFsbHkKKyAgICAgICAgICAgICgnLjZmJywgJzBFMScsICcwLjAwMDAwMCcpLAorICAgICAgICAgICAgKCcuNmYnLCAnMCcsICcwLjAwMDAwMCcpLAorICAgICAgICAgICAgKCcuMGYnLCAnMCcsICcwJyksICMgbm8gZGVjaW1hbCBwb2ludAorICAgICAgICAgICAgKCcuMGYnLCAnMGUtMicsICcwJyksCisgICAgICAgICAgICAoJy4wZicsICczLjE0MTU5MjY1JywgJzMnKSwKKyAgICAgICAgICAgICgnLjFmJywgJzMuMTQxNTkyNjUnLCAnMy4xJyksCisgICAgICAgICAgICAoJy40ZicsICczLjE0MTU5MjY1JywgJzMuMTQxNicpLAorICAgICAgICAgICAgKCcuNmYnLCAnMy4xNDE1OTI2NScsICczLjE0MTU5MycpLAorICAgICAgICAgICAgKCcuN2YnLCAnMy4xNDE1OTI2NScsICczLjE0MTU5MjYnKSwgIyByb3VuZC1oYWxmLWV2ZW4hCisgICAgICAgICAgICAoJy44ZicsICczLjE0MTU5MjY1JywgJzMuMTQxNTkyNjUnKSwKKyAgICAgICAgICAgICgnLjlmJywgJzMuMTQxNTkyNjUnLCAnMy4xNDE1OTI2NTAnKSwKKworICAgICAgICAgICAgKCdnJywgJzAnLCAnMCcpLAorICAgICAgICAgICAgKCdnJywgJzAuMCcsICcwLjAnKSwKKyAgICAgICAgICAgICgnZycsICcwRTEnLCAnMGUrMScpLAorICAgICAgICAgICAgKCdHJywgJzBFMScsICcwRSsxJyksCisgICAgICAgICAgICAoJ2cnLCAnMEUtNScsICcwLjAwMDAwJyksCisgICAgICAgICAgICAoJ2cnLCAnMEUtNicsICcwLjAwMDAwMCcpLAorICAgICAgICAgICAgKCdnJywgJzBFLTcnLCAnMGUtNycpLAorICAgICAgICAgICAgKCdnJywgJy0wRTInLCAnLTBlKzInKSwKKyAgICAgICAgICAgICgnLjBnJywgJzMuMTQxNTkyNjUnLCAnMycpLCAgIyAwIHNpZyBmaWcgLT4gMSBzaWcgZmlnCisgICAgICAgICAgICAoJy4xZycsICczLjE0MTU5MjY1JywgJzMnKSwKKyAgICAgICAgICAgICgnLjJnJywgJzMuMTQxNTkyNjUnLCAnMy4xJyksCisgICAgICAgICAgICAoJy41ZycsICczLjE0MTU5MjY1JywgJzMuMTQxNicpLAorICAgICAgICAgICAgKCcuN2cnLCAnMy4xNDE1OTI2NScsICczLjE0MTU5MycpLAorICAgICAgICAgICAgKCcuOGcnLCAnMy4xNDE1OTI2NScsICczLjE0MTU5MjYnKSwgIyByb3VuZC1oYWxmLWV2ZW4hCisgICAgICAgICAgICAoJy45ZycsICczLjE0MTU5MjY1JywgJzMuMTQxNTkyNjUnKSwKKyAgICAgICAgICAgICgnLjEwZycsICczLjE0MTU5MjY1JywgJzMuMTQxNTkyNjUnKSwgIyBkb24ndCBwYWQKKworICAgICAgICAgICAgKCclJywgJzBFMScsICcwJScpLAorICAgICAgICAgICAgKCclJywgJzBFMCcsICcwJScpLAorICAgICAgICAgICAgKCclJywgJzBFLTEnLCAnMCUnKSwKKyAgICAgICAgICAgICgnJScsICcwRS0yJywgJzAlJyksCisgICAgICAgICAgICAoJyUnLCAnMEUtMycsICcwLjAlJyksCisgICAgICAgICAgICAoJyUnLCAnMEUtNCcsICcwLjAwJScpLAorCisgICAgICAgICAgICAoJy4zJScsICcwJywgJzAuMDAwJScpLCAjIGFsbCB6ZXJvcyB0cmVhdGVkIGVxdWFsbHkKKyAgICAgICAgICAgICgnLjMlJywgJzBFMTAnLCAnMC4wMDAlJyksCisgICAgICAgICAgICAoJy4zJScsICcwRS0xMCcsICcwLjAwMCUnKSwKKyAgICAgICAgICAgICgnLjMlJywgJzIuMzQnLCAnMjM0LjAwMCUnKSwKKyAgICAgICAgICAgICgnLjMlJywgJzEuMjM0NTY3JywgJzEyMy40NTclJyksCisgICAgICAgICAgICAoJy4wJScsICcxLjIzJywgJzEyMyUnKSwKKworICAgICAgICAgICAgKCdlJywgJ05hTicsICdOYU4nKSwKKyAgICAgICAgICAgICgnZicsICctTmFOMTIzJywgJy1OYU4xMjMnKSwKKyAgICAgICAgICAgICgnK2cnLCAnTmFONDU2JywgJytOYU40NTYnKSwKKyAgICAgICAgICAgICgnLjNlJywgJ0luZicsICdJbmZpbml0eScpLAorICAgICAgICAgICAgKCcuMTZmJywgJy1JbmYnLCAnLUluZmluaXR5JyksCisgICAgICAgICAgICAoJy4wZycsICctc05hTicsICctc05hTicpLAorCisgICAgICAgICAgICAoJycsICcxLjAwJywgJzEuMDAnKSwKKworICAgICAgICAgICAgIyB0ZXN0IGFsaWdubWVudCBhbmQgcGFkZGluZworICAgICAgICAgICAgKCc2JywgJzEyMycsICcgICAxMjMnKSwKKyAgICAgICAgICAgICgnPDYnLCAnMTIzJywgJzEyMyAgICcpLAorICAgICAgICAgICAgKCc+NicsICcxMjMnLCAnICAgMTIzJyksCisgICAgICAgICAgICAoJ142JywgJzEyMycsICcgMTIzICAnKSwKKyAgICAgICAgICAgICgnPSs2JywgJzEyMycsICcrICAxMjMnKSwKKyAgICAgICAgICAgICgnIzwxMCcsICdOYU4nLCAnTmFOIyMjIyMjIycpLAorICAgICAgICAgICAgKCcjPDEwJywgJy00LjMnLCAnLTQuMyMjIyMjIycpLAorICAgICAgICAgICAgKCcjPCsxMCcsICcwLjAxMzAnLCAnKzAuMDEzMCMjIycpLAorICAgICAgICAgICAgKCcjPCAxMCcsICcwLjAxMzAnLCAnIDAuMDEzMCMjIycpLAorICAgICAgICAgICAgKCdAPjEwJywgJy1JbmYnLCAnQC1JbmZpbml0eScpLAorICAgICAgICAgICAgKCcjPjUnLCAnLUluZicsICctSW5maW5pdHknKSwKKyAgICAgICAgICAgICgnP141JywgJzEyMycsICc/MTIzPycpLAorICAgICAgICAgICAgKCclXjYnLCAnMTIzJywgJyUxMjMlJScpLAorICAgICAgICAgICAgKCcgXjYnLCAnLTQ1LjYnLCAnLTQ1LjYgJyksCisgICAgICAgICAgICAoJy89MTAnLCAnLTQ1LjYnLCAnLS8vLy8vNDUuNicpLAorICAgICAgICAgICAgKCcvPSsxMCcsICc0NS42JywgJysvLy8vLzQ1LjYnKSwKKyAgICAgICAgICAgICgnLz0gMTAnLCAnNDUuNicsICcgLy8vLy80NS42JyksCisKKyAgICAgICAgICAgICMgdGhvdXNhbmRzIHNlcGFyYXRvcgorICAgICAgICAgICAgKCcsJywgJzEyMzQ1NjcnLCAnMSwyMzQsNTY3JyksCisgICAgICAgICAgICAoJywnLCAnMTIzNDU2JywgJzEyMyw0NTYnKSwKKyAgICAgICAgICAgICgnLCcsICcxMjM0NScsICcxMiwzNDUnKSwKKyAgICAgICAgICAgICgnLCcsICcxMjM0JywgJzEsMjM0JyksCisgICAgICAgICAgICAoJywnLCAnMTIzJywgJzEyMycpLAorICAgICAgICAgICAgKCcsJywgJzEyJywgJzEyJyksCisgICAgICAgICAgICAoJywnLCAnMScsICcxJyksCisgICAgICAgICAgICAoJywnLCAnMCcsICcwJyksCisgICAgICAgICAgICAoJywnLCAnLTEyMzQ1NjcnLCAnLTEsMjM0LDU2NycpLAorICAgICAgICAgICAgKCcsJywgJy0xMjM0NTYnLCAnLTEyMyw0NTYnKSwKKyAgICAgICAgICAgICgnNywnLCAnMTIzNDU2JywgJzEyMyw0NTYnKSwKKyAgICAgICAgICAgICgnOCwnLCAnMTIzNDU2JywgJyAxMjMsNDU2JyksCisgICAgICAgICAgICAoJzA4LCcsICcxMjM0NTYnLCAnMCwxMjMsNDU2JyksICMgc3BlY2lhbCBjYXNlOiBleHRyYSAwIG5lZWRlZAorICAgICAgICAgICAgKCcrMDgsJywgJzEyMzQ1NicsICcrMTIzLDQ1NicpLCAjIGJ1dCBub3QgaWYgdGhlcmUncyBhIHNpZ24KKyAgICAgICAgICAgICgnIDA4LCcsICcxMjM0NTYnLCAnIDEyMyw0NTYnKSwKKyAgICAgICAgICAgICgnMDgsJywgJy0xMjM0NTYnLCAnLTEyMyw0NTYnKSwKKyAgICAgICAgICAgICgnKzA5LCcsICcxMjM0NTYnLCAnKzAsMTIzLDQ1NicpLAorICAgICAgICAgICAgIyAuLi4gd2l0aCBmcmFjdGlvbmFsIHBhcnQuLi4KKyAgICAgICAgICAgICgnMDcsJywgJzEyMzQuNTYnLCAnMSwyMzQuNTYnKSwKKyAgICAgICAgICAgICgnMDgsJywgJzEyMzQuNTYnLCAnMSwyMzQuNTYnKSwKKyAgICAgICAgICAgICgnMDksJywgJzEyMzQuNTYnLCAnMDEsMjM0LjU2JyksCisgICAgICAgICAgICAoJzAxMCwnLCAnMTIzNC41NicsICcwMDEsMjM0LjU2JyksCisgICAgICAgICAgICAoJzAxMSwnLCAnMTIzNC41NicsICcwLDAwMSwyMzQuNTYnKSwKKyAgICAgICAgICAgICgnMDEyLCcsICcxMjM0LjU2JywgJzAsMDAxLDIzNC41NicpLAorICAgICAgICAgICAgKCcwOCwuMWYnLCAnMTIzNC41JywgJzAxLDIzNC41JyksCisgICAgICAgICAgICAjIG5vIHRob3VzYW5kcyBzZXBhcmF0b3JzIGluIGZyYWN0aW9uIHBhcnQKKyAgICAgICAgICAgICgnLCcsICcxLjIzNDU2Nzg5JywgJzEuMjM0NTY3ODknKSwKKyAgICAgICAgICAgICgnLCUnLCAnMTIzLjQ1Njc4OScsICcxMiwzNDUuNjc4OSUnKSwKKyAgICAgICAgICAgICgnLGUnLCAnMTIzNDU2JywgJzEuMjM0NTZlKzUnKSwKKyAgICAgICAgICAgICgnLEUnLCAnMTIzNDU2JywgJzEuMjM0NTZFKzUnKSwKKworICAgICAgICAgICAgIyBpc3N1ZSA2ODUwCisgICAgICAgICAgICAoJ2E9LTcuMCcsICcwLjEyMzQ1JywgJ2FhYWEwLjEnKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIGZtdCwgZCwgcmVzdWx0IGluIHRlc3RfdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoRGVjaW1hbChkKSwgZm10KSwgcmVzdWx0KQorCisgICAgZGVmIHRlc3Rfbl9mb3JtYXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gbG9jYWxlIGltcG9ydCBDSEFSX01BWAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIFNldCB1cCBzb21lIGxvY2FsZWNvbnYtbGlrZSBkaWN0aW9uYXJpZXMKKyAgICAgICAgZW5fVVMgPSB7CisgICAgICAgICAgICAnZGVjaW1hbF9wb2ludCcgOiAnLicsCisgICAgICAgICAgICAnZ3JvdXBpbmcnIDogWzMsIDMsIDBdLAorICAgICAgICAgICAgJ3Rob3VzYW5kc19zZXAnOiAnLCcKKyAgICAgICAgICAgIH0KKworICAgICAgICBmcl9GUiA9IHsKKyAgICAgICAgICAgICdkZWNpbWFsX3BvaW50JyA6ICcsJywKKyAgICAgICAgICAgICdncm91cGluZycgOiBbQ0hBUl9NQVhdLAorICAgICAgICAgICAgJ3Rob3VzYW5kc19zZXAnIDogJycKKyAgICAgICAgICAgIH0KKworICAgICAgICBydV9SVSA9IHsKKyAgICAgICAgICAgICdkZWNpbWFsX3BvaW50JyA6ICcsJywKKyAgICAgICAgICAgICdncm91cGluZycgOiBbMywgMywgMF0sCisgICAgICAgICAgICAndGhvdXNhbmRzX3NlcCcgOiAnICcKKyAgICAgICAgICAgIH0KKworICAgICAgICBjcmF6eSA9IHsKKyAgICAgICAgICAgICdkZWNpbWFsX3BvaW50JyA6ICcmJywKKyAgICAgICAgICAgICdncm91cGluZycgOiBbMSwgNCwgMiwgQ0hBUl9NQVhdLAorICAgICAgICAgICAgJ3Rob3VzYW5kc19zZXAnIDogJy0nCisgICAgICAgICAgICB9CisKKworICAgICAgICBkZWYgZ2V0X2ZtdCh4LCBsb2NhbGUsIGZtdD0nbicpOgorICAgICAgICAgICAgcmV0dXJuIERlY2ltYWwuX19mb3JtYXRfXyhEZWNpbWFsKHgpLCBmbXQsIF9sb2NhbGVjb252PWxvY2FsZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoRGVjaW1hbCgnMTIuNycpLCBlbl9VUyksICcxMi43JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KERlY2ltYWwoJzEyLjcnKSwgZnJfRlIpLCAnMTIsNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdChEZWNpbWFsKCcxMi43JyksIHJ1X1JVKSwgJzEyLDcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoRGVjaW1hbCgnMTIuNycpLCBjcmF6eSksICcxLTImNycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1Njc4OSwgZW5fVVMpLCAnMTIzLDQ1Niw3ODknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2Nzg5LCBmcl9GUiksICcxMjM0NTY3ODknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2Nzg5LCBydV9SVSksICcxMjMgNDU2IDc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTY3ODkwMTIzLCBjcmF6eSksICcxMjM0NTYtNzgtOTAxMi0zJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2Nzg5LCBlbl9VUywgJy42bicpLCAnMS4yMzQ1N2UrOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTY3ODksIGZyX0ZSLCAnLjZuJyksICcxLDIzNDU3ZSs4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1Njc4OSwgcnVfUlUsICcuNm4nKSwgJzEsMjM0NTdlKzgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2Nzg5LCBjcmF6eSwgJy42bicpLCAnMSYyMzQ1N2UrOCcpCisKKyAgICAgICAgIyB6ZXJvIHBhZGRpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQsIGZyX0ZSLCAnMDNuJyksICcxMjM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQsIGZyX0ZSLCAnMDRuJyksICcxMjM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQsIGZyX0ZSLCAnMDVuJyksICcwMTIzNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0LCBmcl9GUiwgJzA2bicpLCAnMDAxMjM0JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDUsIGVuX1VTLCAnMDVuJyksICcxMiwzNDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDUsIGVuX1VTLCAnMDZuJyksICcxMiwzNDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDUsIGVuX1VTLCAnMDduJyksICcwMTIsMzQ1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1LCBlbl9VUywgJzA4bicpLCAnMCwwMTIsMzQ1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1LCBlbl9VUywgJzA5bicpLCAnMCwwMTIsMzQ1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1LCBlbl9VUywgJzAxMG4nKSwgJzAwLDAxMiwzNDUnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTYsIGNyYXp5LCAnMDZuJyksICcxLTIzNDUtNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTYsIGNyYXp5LCAnMDduJyksICcxLTIzNDUtNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTYsIGNyYXp5LCAnMDhuJyksICcxLTIzNDUtNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTYsIGNyYXp5LCAnMDluJyksICcwMS0yMzQ1LTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9mbXQoMTIzNDU2LCBjcmF6eSwgJzAxMG4nKSwgJzAtMDEtMjM0NS02JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1NiwgY3JhenksICcwMTFuJyksICcwLTAxLTIzNDUtNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2ZtdCgxMjM0NTYsIGNyYXp5LCAnMDEybicpLCAnMDAtMDEtMjM0NS02JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZm10KDEyMzQ1NiwgY3JhenksICcwMTNuJyksICcwMDAtMDEtMjM0NS02JykKKworCitjbGFzcyBEZWNpbWFsQXJpdGhtZXRpY09wZXJhdG9yc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1VuaXQgdGVzdHMgZm9yIGFsbCBhcml0aG1ldGljIG9wZXJhdG9ycywgYmluYXJ5IGFuZCB1bmFyeS4nJycKKworICAgIGRlZiB0ZXN0X2FkZGl0aW9uKHNlbGYpOgorCisgICAgICAgIGQxID0gRGVjaW1hbCgnLTExLjEnKQorICAgICAgICBkMiA9IERlY2ltYWwoJzIyLjInKQorCisgICAgICAgICN0d28gRGVjaW1hbHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMStkMiwgRGVjaW1hbCgnMTEuMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyK2QxLCBEZWNpbWFsKCcxMS4xJykpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgbGVmdAorICAgICAgICBjID0gZDEgKyA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnLTYuMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIHJpZ2h0CisgICAgICAgIGMgPSA1ICsgZDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCctNi4xJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI2lubGluZSB3aXRoIGRlY2ltYWwKKyAgICAgICAgZDEgKz0gZDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnMTEuMScpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBvdGhlciB0eXBlCisgICAgICAgIGQxICs9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnMTYuMScpKQorCisgICAgZGVmIHRlc3Rfc3VidHJhY3Rpb24oc2VsZik6CisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCctMTEuMScpCisgICAgICAgIGQyID0gRGVjaW1hbCgnMjIuMicpCisKKyAgICAgICAgI3R3byBEZWNpbWFscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLWQyLCBEZWNpbWFsKCctMzMuMycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLWQxLCBEZWNpbWFsKCczMy4zJykpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgbGVmdAorICAgICAgICBjID0gZDEgLSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnLTE2LjEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCByaWdodAorICAgICAgICBjID0gNSAtIGQxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnMTYuMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBkZWNpbWFsCisgICAgICAgIGQxIC09IGQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJy0zMy4zJykpCisKKyAgICAgICAgI2lubGluZSB3aXRoIG90aGVyIHR5cGUKKyAgICAgICAgZDEgLT0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCctMzguMycpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGljYXRpb24oc2VsZik6CisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCctNScpCisgICAgICAgIGQyID0gRGVjaW1hbCgnMycpCisKKyAgICAgICAgI3R3byBEZWNpbWFscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxKmQyLCBEZWNpbWFsKCctMTUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMipkMSwgRGVjaW1hbCgnLTE1JykpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgbGVmdAorICAgICAgICBjID0gZDEgKiA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnLTI1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgcmlnaHQKKyAgICAgICAgYyA9IDUgKiBkMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJy0yNScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBkZWNpbWFsCisgICAgICAgIGQxICo9IGQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJy0xNScpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBvdGhlciB0eXBlCisgICAgICAgIGQxICo9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnLTc1JykpCisKKyAgICBkZWYgdGVzdF9kaXZpc2lvbihzZWxmKToKKworICAgICAgICBkMSA9IERlY2ltYWwoJy01JykKKyAgICAgICAgZDIgPSBEZWNpbWFsKCcyJykKKworICAgICAgICAjdHdvIERlY2ltYWxzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEvZDIsIERlY2ltYWwoJy0yLjUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi9kMSwgRGVjaW1hbCgnLTAuNCcpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIGxlZnQKKyAgICAgICAgYyA9IGQxIC8gNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJy0xLjI1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgcmlnaHQKKyAgICAgICAgYyA9IDQgLyBkMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJy0wLjgnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjaW5saW5lIHdpdGggZGVjaW1hbAorICAgICAgICBkMSAvPSBkMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCctMi41JykpCisKKyAgICAgICAgI2lubGluZSB3aXRoIG90aGVyIHR5cGUKKyAgICAgICAgZDEgLz0gNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCctMC42MjUnKSkKKworICAgIGRlZiB0ZXN0X2Zsb29yX2RpdmlzaW9uKHNlbGYpOgorCisgICAgICAgIGQxID0gRGVjaW1hbCgnNScpCisgICAgICAgIGQyID0gRGVjaW1hbCgnMicpCisKKyAgICAgICAgI3R3byBEZWNpbWFscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLy9kMiwgRGVjaW1hbCgnMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLy9kMSwgRGVjaW1hbCgnMCcpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIGxlZnQKKyAgICAgICAgYyA9IGQxIC8vIDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCcxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI3dpdGggb3RoZXIgdHlwZSwgcmlnaHQKKyAgICAgICAgYyA9IDcgLy8gZDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCcxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI2lubGluZSB3aXRoIGRlY2ltYWwKKyAgICAgICAgZDEgLy89IGQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJzInKSkKKworICAgICAgICAjaW5saW5lIHdpdGggb3RoZXIgdHlwZQorICAgICAgICBkMSAvLz0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBEZWNpbWFsKCcxJykpCisKKyAgICBkZWYgdGVzdF9wb3dlcmluZyhzZWxmKToKKworICAgICAgICBkMSA9IERlY2ltYWwoJzUnKQorICAgICAgICBkMiA9IERlY2ltYWwoJzInKQorCisgICAgICAgICN0d28gRGVjaW1hbHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSoqZDIsIERlY2ltYWwoJzI1JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIqKmQxLCBEZWNpbWFsKCczMicpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIGxlZnQKKyAgICAgICAgYyA9IGQxICoqIDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBEZWNpbWFsKCc2MjUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCByaWdodAorICAgICAgICBjID0gNyAqKiBkMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJzE2ODA3JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShjKSwgdHlwZShkMSkpCisKKyAgICAgICAgI2lubGluZSB3aXRoIGRlY2ltYWwKKyAgICAgICAgZDEgKio9IGQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJzI1JykpCisKKyAgICAgICAgI2lubGluZSB3aXRoIG90aGVyIHR5cGUKKyAgICAgICAgZDEgKio9IDQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgRGVjaW1hbCgnMzkwNjI1JykpCisKKyAgICBkZWYgdGVzdF9tb2R1bGUoc2VsZik6CisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCc1JykKKyAgICAgICAgZDIgPSBEZWNpbWFsKCcyJykKKworICAgICAgICAjdHdvIERlY2ltYWxzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDElZDIsIERlY2ltYWwoJzEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiVkMSwgRGVjaW1hbCgnMicpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIGxlZnQKKyAgICAgICAgYyA9IGQxICUgNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMsIERlY2ltYWwoJzEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGMpLCB0eXBlKGQxKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCByaWdodAorICAgICAgICBjID0gNyAlIGQxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgRGVjaW1hbCgnMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYyksIHR5cGUoZDEpKQorCisgICAgICAgICNpbmxpbmUgd2l0aCBkZWNpbWFsCisgICAgICAgIGQxICU9IGQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJzEnKSkKKworICAgICAgICAjaW5saW5lIHdpdGggb3RoZXIgdHlwZQorICAgICAgICBkMSAlPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIERlY2ltYWwoJzEnKSkKKworICAgIGRlZiB0ZXN0X2Zsb29yX2Rpdl9tb2R1bGUoc2VsZik6CisKKyAgICAgICAgZDEgPSBEZWNpbWFsKCc1JykKKyAgICAgICAgZDIgPSBEZWNpbWFsKCcyJykKKworICAgICAgICAjdHdvIERlY2ltYWxzCisgICAgICAgIChwLCBxKSA9IGRpdm1vZChkMSwgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgRGVjaW1hbCgnMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEsIERlY2ltYWwoJzEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHApLCB0eXBlKGQxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHEpLCB0eXBlKGQxKSkKKworICAgICAgICAjd2l0aCBvdGhlciB0eXBlLCBsZWZ0CisgICAgICAgIChwLCBxKSA9IGRpdm1vZChkMSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBEZWNpbWFsKCcxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgRGVjaW1hbCgnMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocCksIHR5cGUoZDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocSksIHR5cGUoZDEpKQorCisgICAgICAgICN3aXRoIG90aGVyIHR5cGUsIHJpZ2h0CisgICAgICAgIChwLCBxKSA9IGRpdm1vZCg3LCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCBEZWNpbWFsKCcxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocSwgRGVjaW1hbCgnMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocCksIHR5cGUoZDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocSksIHR5cGUoZDEpKQorCisgICAgZGVmIHRlc3RfdW5hcnlfb3BlcmF0b3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCtEZWNpbWFsKDQ1KSwgRGVjaW1hbCgrNDUpKSAgICAgICAgICAgIyAgKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC1EZWNpbWFsKDQ1KSwgRGVjaW1hbCgtNDUpKSAgICAgICAgICAgIyAgLQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhEZWNpbWFsKDQ1KSksIGFicyhEZWNpbWFsKC00NSkpKSAgIyBhYnMKKworICAgIGRlZiB0ZXN0X25hbl9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgIyBjb21wYXJpc29ucyBpbnZvbHZpbmcgc2lnbmFsaW5nIG5hbnMgc2lnbmFsIEludmFsaWRPcGVyYXRpb24KKworICAgICAgICAjIG9yZGVyIGNvbXBhcmlzb25zICg8LCA8PSwgPiwgPj0pIGludm9sdmluZyBvbmx5IHF1aWV0IG5hbnMKKyAgICAgICAgIyBhbHNvIHNpZ25hbCBJbnZhbGlkT3BlcmF0aW9uCisKKyAgICAgICAgIyBlcXVhbGl0eSBjb21wYXJpc29ucyAoPT0sICE9KSBpbnZvbHZpbmcgb25seSBxdWlldCBuYW5zCisgICAgICAgICMgZG9uJ3Qgc2lnbmFsLCBidXQgcmV0dXJuIEZhbHNlIG9yIFRydWUgcmVzcGVjdGl2ZWx5LgorCisgICAgICAgIG4gPSBEZWNpbWFsKCdOYU4nKQorICAgICAgICBzID0gRGVjaW1hbCgnc05hTicpCisgICAgICAgIGkgPSBEZWNpbWFsKCdJbmYnKQorICAgICAgICBmID0gRGVjaW1hbCgnMicpCisKKyAgICAgICAgcW5hbl9wYWlycyA9IChuLCBuKSwgKG4sIGkpLCAoaSwgbiksIChuLCBmKSwgKGYsIG4pCisgICAgICAgIHNuYW5fcGFpcnMgPSAocywgbiksIChuLCBzKSwgKHMsIGkpLCAoaSwgcyksIChzLCBmKSwgKGYsIHMpLCAocywgcykKKyAgICAgICAgb3JkZXJfb3BzID0gb3BlcmF0b3IubHQsIG9wZXJhdG9yLmxlLCBvcGVyYXRvci5ndCwgb3BlcmF0b3IuZ2UKKyAgICAgICAgZXF1YWxpdHlfb3BzID0gb3BlcmF0b3IuZXEsIG9wZXJhdG9yLm5lCisKKyAgICAgICAgIyByZXN1bHRzIHdoZW4gSW52YWxpZE9wZXJhdGlvbiBpcyBub3QgdHJhcHBlZAorICAgICAgICBmb3IgeCwgeSBpbiBxbmFuX3BhaXJzICsgc25hbl9wYWlyczoKKyAgICAgICAgICAgIGZvciBvcCBpbiBvcmRlcl9vcHMgKyBlcXVhbGl0eV9vcHM6CisgICAgICAgICAgICAgICAgZ290ID0gb3AoeCwgeSkKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFRydWUgaWYgb3AgaXMgb3BlcmF0b3IubmUgZWxzZSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZXhwZWN0ZWQsIGdvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB7MCFyfSBmb3Igb3BlcmF0b3IuezF9KHsyIXJ9LCB7MyFyfSk7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb3QgezQhcn0iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBvcC5fX25hbWVfXywgeCwgeSwgZ290KSkKKworICAgICAgICAjIHJlcGVhdCB0aGUgYWJvdmUsIGJ1dCB0aGlzIHRpbWUgdHJhcCB0aGUgSW52YWxpZE9wZXJhdGlvbgorICAgICAgICB3aXRoIGxvY2FsY29udGV4dCgpIGFzIGN0eDoKKyAgICAgICAgICAgIGN0eC50cmFwc1tJbnZhbGlkT3BlcmF0aW9uXSA9IDEKKworICAgICAgICAgICAgZm9yIHgsIHkgaW4gcW5hbl9wYWlyczoKKyAgICAgICAgICAgICAgICBmb3Igb3AgaW4gZXF1YWxpdHlfb3BzOgorICAgICAgICAgICAgICAgICAgICBnb3QgPSBvcCh4LCB5KQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFRydWUgaWYgb3AgaXMgb3BlcmF0b3IubmUgZWxzZSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKGV4cGVjdGVkLCBnb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHswIXJ9IGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhdG9yLnsxfSh7MiFyfSwgezMhcn0pOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCB7NCFyfSIuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLCBvcC5fX25hbWVfXywgeCwgeSwgZ290KSkKKworICAgICAgICAgICAgZm9yIHgsIHkgaW4gc25hbl9wYWlyczoKKyAgICAgICAgICAgICAgICBmb3Igb3AgaW4gZXF1YWxpdHlfb3BzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbnZhbGlkT3BlcmF0aW9uLCBvcGVyYXRvci5lcSwgeCwgeSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW52YWxpZE9wZXJhdGlvbiwgb3BlcmF0b3IubmUsIHgsIHkpCisKKyAgICAgICAgICAgIGZvciB4LCB5IGluIHFuYW5fcGFpcnMgKyBzbmFuX3BhaXJzOgorICAgICAgICAgICAgICAgIGZvciBvcCBpbiBvcmRlcl9vcHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEludmFsaWRPcGVyYXRpb24sIG9wLCB4LCB5KQorCisgICAgZGVmIHRlc3RfY29weV9zaWduKHNlbGYpOgorICAgICAgICBkID0gRGVjaW1hbCgxKS5jb3B5X3NpZ24oRGVjaW1hbCgtMikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDEpLmNvcHlfc2lnbigtMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRGVjaW1hbCgxKS5jb3B5X3NpZ24sICctMicpCisKKyMgVGhlIGZvbGxvd2luZyBhcmUgdHdvIGZ1bmN0aW9ucyB1c2VkIHRvIHRlc3QgdGhyZWFkaW5nIGluIHRoZSBuZXh0IGNsYXNzCisKK2RlZiB0aGZ1bmMxKGNscyk6CisgICAgZDEgPSBEZWNpbWFsKDEpCisgICAgZDMgPSBEZWNpbWFsKDMpCisgICAgdGVzdDEgPSBkMS9kMworICAgIGNscy5zeW5jaHJvLndhaXQoKQorICAgIHRlc3QyID0gZDEvZDMKKyAgICBjbHMuZmluaXNoMS5zZXQoKQorCisgICAgY2xzLmFzc2VydEVxdWFsKHRlc3QxLCBEZWNpbWFsKCcwLjMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMnKSkKKyAgICBjbHMuYXNzZXJ0RXF1YWwodGVzdDIsIERlY2ltYWwoJzAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMycpKQorICAgIHJldHVybgorCitkZWYgdGhmdW5jMihjbHMpOgorICAgIGQxID0gRGVjaW1hbCgxKQorICAgIGQzID0gRGVjaW1hbCgzKQorICAgIHRlc3QxID0gZDEvZDMKKyAgICB0aGlzY29udGV4dCA9IGdldGNvbnRleHQoKQorICAgIHRoaXNjb250ZXh0LnByZWMgPSAxOAorICAgIHRlc3QyID0gZDEvZDMKKyAgICBjbHMuc3luY2hyby5zZXQoKQorICAgIGNscy5maW5pc2gyLnNldCgpCisKKyAgICBjbHMuYXNzZXJ0RXF1YWwodGVzdDEsIERlY2ltYWwoJzAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMycpKQorICAgIGNscy5hc3NlcnRFcXVhbCh0ZXN0MiwgRGVjaW1hbCgnMC4zMzMzMzMzMzMzMzMzMzMzMzMnKSkKKyAgICByZXR1cm4KKworCitjbGFzcyBEZWNpbWFsVXNlT2ZDb250ZXh0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgJycnVW5pdCB0ZXN0cyBmb3IgVXNlIG9mIENvbnRleHQgY2FzZXMgaW4gRGVjaW1hbC4nJycKKworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHRocmVhZGluZworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgdGhyZWFkaW5nID0gTm9uZQorCisgICAgIyBUYWtlIGNhcmUgZXhlY3V0aW5nIHRoaXMgdGVzdCBmcm9tIElETEUsIHRoZXJlJ3MgYW4gaXNzdWUgaW4gdGhyZWFkaW5nCisgICAgIyB0aGF0IGhhbmdzIElETEUgYW5kIEkgY291bGRuJ3QgZmluZCBpdAorCisgICAgZGVmIHRlc3RfdGhyZWFkaW5nKHNlbGYpOgorICAgICAgICAjVGVzdCB0aGUgInRocmVhZGluZyBpc29sYXRpb24iIG9mIGEgQ29udGV4dC4KKworICAgICAgICBzZWxmLnN5bmNocm8gPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLmZpbmlzaDEgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLmZpbmlzaDIgPSB0aHJlYWRpbmcuRXZlbnQoKQorCisgICAgICAgIHRoMSA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXRoZnVuYzEsIGFyZ3M9KHNlbGYsKSkKKyAgICAgICAgdGgyID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9dGhmdW5jMiwgYXJncz0oc2VsZiwpKQorCisgICAgICAgIHRoMS5zdGFydCgpCisgICAgICAgIHRoMi5zdGFydCgpCisKKyAgICAgICAgc2VsZi5maW5pc2gxLndhaXQoKQorICAgICAgICBzZWxmLmZpbmlzaDIud2FpdCgpCisgICAgICAgIHJldHVybgorCisgICAgaWYgdGhyZWFkaW5nIGlzIE5vbmU6CisgICAgICAgIGRlbCB0ZXN0X3RocmVhZGluZworCisKK2NsYXNzIERlY2ltYWxVc2FiaWxpdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAnJydVbml0IHRlc3RzIGZvciBVc2FiaWxpdHkgY2FzZXMgb2YgRGVjaW1hbC4nJycKKworICAgIGRlZiB0ZXN0X2NvbXBhcmlzb25fb3BlcmF0b3JzKHNlbGYpOgorCisgICAgICAgIGRhID0gRGVjaW1hbCgnMjMuNDInKQorICAgICAgICBkYiA9IERlY2ltYWwoJzIzLjQyJykKKyAgICAgICAgZGMgPSBEZWNpbWFsKCc0NScpCisKKyAgICAgICAgI3R3byBEZWNpbWFscworICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIoZGMsIGRhKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChkYywgZGEpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhkYSwgZGMpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGRhLCBkYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYSwgZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGEsIGRjKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChkYSwgZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGRhLCBkYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGMsZGEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYSxkYyksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYSxkYiksIDApCisKKyAgICAgICAgI2EgRGVjaW1hbCBhbmQgYW4gaW50CisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihkYywgMjMpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygyMywgZGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGMsIDQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYywyMyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKDIzLGRjKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGRjLDQ1KSwgMCkKKworICAgICAgICAjYSBEZWNpbWFsIGFuZCB1bmNvbXBhcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYSwgJ3VnbHknKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhLCAzMi43KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhLCBvYmplY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYSwgb2JqZWN0KQorCisgICAgICAgICMgc29ydGFibGUKKyAgICAgICAgYSA9IG1hcChEZWNpbWFsLCB4cmFuZ2UoMTAwKSkKKyAgICAgICAgYiA9ICBhWzpdCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGEpCisgICAgICAgIGEuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgICAgICAjIHdpdGggTm9uZQorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRGVjaW1hbCgxKSA8IE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRGVjaW1hbCgxKSA+IE5vbmUpCisKKyAgICBkZWYgdGVzdF9kZWNpbWFsX2Zsb2F0X2NvbXBhcmlzb24oc2VsZik6CisgICAgICAgIGRhID0gRGVjaW1hbCgnMC4yNScpCisgICAgICAgIGRiID0gRGVjaW1hbCgnMy4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKGRhLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKGRhLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcihkYiwgMC4yNSkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoZGIsIDAuMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZGEsIDEuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYSwgMC4yNSkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKDMuMCwgZGEpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKDMuMCwgZGEpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygwLjI1LCBkYikKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoMC4yNSwgZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoMC4yNSwgZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMy4wLCBkYikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCgwLjEsIERlY2ltYWwoJzAuMScpKQorCisgICAgZGVmIHRlc3RfY29weV9hbmRfZGVlcGNvcHlfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgZCA9IERlY2ltYWwoJzQzLjI0JykKKyAgICAgICAgYyA9IGNvcHkuY29weShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGMpLCBpZChkKSkKKyAgICAgICAgZGMgPSBjb3B5LmRlZXBjb3B5KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZGMpLCBpZChkKSkKKworICAgIGRlZiB0ZXN0X2hhc2hfbWV0aG9kKHNlbGYpOgorICAgICAgICAjanVzdCB0aGF0IGl0J3MgaGFzaGFibGUKKyAgICAgICAgaGFzaChEZWNpbWFsKDIzKSkKKyAgICAgICAgaGFzaChEZWNpbWFsKCdJbmZpbml0eScpKQorICAgICAgICBoYXNoKERlY2ltYWwoJy1JbmZpbml0eScpKQorICAgICAgICBoYXNoKERlY2ltYWwoJ25hbjEyMycpKQorICAgICAgICBoYXNoKERlY2ltYWwoJy1OYU4nKSkKKworICAgICAgICB0ZXN0X3ZhbHVlcyA9IFtEZWNpbWFsKHNpZ24qKDIqKm0gKyBuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIG0gaW4gWzAsIDE0LCAxNSwgMTYsIDE3LCAzMCwgMzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiwgMzMsIDYyLCA2MywgNjQsIDY1LCA2Nl0KKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIG4gaW4gcmFuZ2UoLTEwLCAxMCkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNpZ24gaW4gWy0xLCAxXV0KKyAgICAgICAgdGVzdF92YWx1ZXMuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICBEZWNpbWFsKCItMCIpLCAjIHplcm9zCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiMC4wMCIpLAorICAgICAgICAgICAgICAgIERlY2ltYWwoIi0wLjAwMCIpLAorICAgICAgICAgICAgICAgIERlY2ltYWwoIjBFMTAiKSwKKyAgICAgICAgICAgICAgICBEZWNpbWFsKCItMEUxMiIpLAorICAgICAgICAgICAgICAgIERlY2ltYWwoIjEwLjAiKSwgIyBuZWdhdGl2ZSBleHBvbmVudAorICAgICAgICAgICAgICAgIERlY2ltYWwoIi0yMy4wMDAwMCIpLAorICAgICAgICAgICAgICAgIERlY2ltYWwoIjEyMzBFMTAwIiksICMgcG9zaXRpdmUgZXhwb25lbnQKKyAgICAgICAgICAgICAgICBEZWNpbWFsKCItNC41Njc4RTUwIiksCisgICAgICAgICAgICAgICAgIyBhIHZhbHVlIGZvciB3aGljaCBoYXNoKG4pICE9IGhhc2gobiAlICgyKio2NC0xKSkKKyAgICAgICAgICAgICAgICAjIGluIFB5dGhvbiBwcmUtMi42CisgICAgICAgICAgICAgICAgRGVjaW1hbCgyKio2NCArIDIqKjMyIC0gMSksCisgICAgICAgICAgICAgICAgIyBzZWxlY3Rpb24gb2YgdmFsdWVzIHdoaWNoIGZhaWwgd2l0aCB0aGUgb2xkIChiZWZvcmUKKyAgICAgICAgICAgICAgICAjIHZlcnNpb24gMi42KSBsb25nLl9faGFzaF9fCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiMS42MzRFMTAwIiksCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiOTAuNjk3RTEwMCIpLAorICAgICAgICAgICAgICAgIERlY2ltYWwoIjE4OC44M0UxMDAiKSwKKyAgICAgICAgICAgICAgICBEZWNpbWFsKCIxNjUyLjlFMTAwIiksCisgICAgICAgICAgICAgICAgRGVjaW1hbCgiNTY1MzFFMTAwIiksCisgICAgICAgICAgICAgICAgXSkKKworICAgICAgICAjIGNoZWNrIHRoYXQgaGFzaChkKSA9PSBoYXNoKGludChkKSkgZm9yIGludGVncmFsIHZhbHVlcworICAgICAgICBmb3IgdmFsdWUgaW4gdGVzdF92YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godmFsdWUpLCBoYXNoKGludCh2YWx1ZSkpKQorCisgICAgICAgICN0aGUgc2FtZSBoYXNoIHRoYXQgdG8gYW4gaW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChEZWNpbWFsKDIzKSksIGhhc2goMjMpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIERlY2ltYWwoJ3NOYU4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2goRGVjaW1hbCgnSW5mJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzaChEZWNpbWFsKCctSW5mJykpKQorCisgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgaGFzaGVzIG9mIGEgRGVjaW1hbCBmbG9hdCBtYXRjaCB3aGVuIHRoZXkKKyAgICAgICAgIyByZXByZXNlbnQgZXhhY3RseSB0aGUgc2FtZSB2YWx1ZXMKKyAgICAgICAgdGVzdF9zdHJpbmdzID0gWydpbmYnLCAnLUluZicsICcwLjAnLCAnLS4wZTEnLAorICAgICAgICAgICAgICAgICAgICAgICAgJzM0LjAnLCAnMi41JywgJzExMjM5MC42MjUnLCAnLTAuNTE1NjI1J10KKyAgICAgICAgZm9yIHMgaW4gdGVzdF9zdHJpbmdzOgorICAgICAgICAgICAgZiA9IGZsb2F0KHMpCisgICAgICAgICAgICBkID0gRGVjaW1hbChzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGYpLCBoYXNoKGQpKQorCisgICAgICAgICMgY2hlY2sgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGhhc2ggZG9lc24ndCBkZXBlbmQgb24gdGhlCisgICAgICAgICMgY3VycmVudCBjb250ZXh0IChpc3N1ZSAjMTc1NykKKyAgICAgICAgYyA9IGdldGNvbnRleHQoKQorICAgICAgICBvbGRfcHJlY2lzaW9uID0gYy5wcmVjCisgICAgICAgIHggPSBEZWNpbWFsKCIxMjM0NTY3ODkuMSIpCisKKyAgICAgICAgYy5wcmVjID0gNgorICAgICAgICBoMSA9IGhhc2goeCkKKyAgICAgICAgYy5wcmVjID0gMTAKKyAgICAgICAgaDIgPSBoYXNoKHgpCisgICAgICAgIGMucHJlYyA9IDE2CisgICAgICAgIGgzID0gaGFzaCh4KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDEsIGgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgxLCBoMykKKyAgICAgICAgYy5wcmVjID0gb2xkX3ByZWNpc2lvbgorCisgICAgZGVmIHRlc3RfbWluX2FuZF9tYXhfbWV0aG9kcyhzZWxmKToKKworICAgICAgICBkMSA9IERlY2ltYWwoJzE1LjMyJykKKyAgICAgICAgZDIgPSBEZWNpbWFsKCcyOC41JykKKyAgICAgICAgbDEgPSAxNQorICAgICAgICBsMiA9IDI4CisKKyAgICAgICAgI2JldHdlZW4gRGVjaW1hbHMKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtaW4oZDEsZDIpLCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtaW4oZDIsZDEpLCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtYXgoZDEsZDIpLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhtYXgoZDIsZDEpLCBkMikKKworICAgICAgICAjYmV0d2VlbiBEZWNpbWFsIGFuZCBsb25nCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobWluKGQxLGwyKSwgZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobWluKGwyLGQxKSwgZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobWF4KGwxLGQyKSwgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobWF4KGQyLGwxKSwgZDIpCisKKyAgICBkZWYgdGVzdF9hc19ub256ZXJvKHNlbGYpOgorICAgICAgICAjYXMgZmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEZWNpbWFsKDApKQorICAgICAgICAjYXMgdHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRGVjaW1hbCgnMC4zNzInKSkKKworICAgIGRlZiB0ZXN0X3Rvc3RyaW5nX21ldGhvZHMoc2VsZik6CisgICAgICAgICNUZXN0IHN0ciBhbmQgcmVwciBtZXRob2RzLgorCisgICAgICAgIGQgPSBEZWNpbWFsKCcxNS4zMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGQpLCAnMTUuMzInKSAgICAgICAgICAgICAgICMgc3RyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkKSwgIkRlY2ltYWwoJzE1LjMyJykiKSAgICMgcmVwcgorCisgICAgICAgICMgcmVzdWx0IHR5cGUgb2Ygc3RyaW5nIG1ldGhvZHMgc2hvdWxkIGJlIHN0ciwgbm90IHVuaWNvZGUKKyAgICAgICAgdW5pY29kZV9pbnB1dHMgPSBbdScxMjMuNCcsIHUnMC41RTInLCB1J0luZmluaXR5JywgdSdzTmFOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdSctMC4wRTEwMCcsIHUnLU5hTjAwMScsIHUnLUluZiddCisKKyAgICAgICAgZm9yIHUgaW4gdW5pY29kZV9pbnB1dHM6CisgICAgICAgICAgICBkID0gRGVjaW1hbCh1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHN0cihkKSksIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXByKGQpKSwgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQudG9fZW5nX3N0cmluZygpKSwgc3RyKQorCisgICAgZGVmIHRlc3RfdG9udW1fbWV0aG9kcyhzZWxmKToKKyAgICAgICAgI1Rlc3QgZmxvYXQsIGludCBhbmQgbG9uZyBtZXRob2RzLgorCisgICAgICAgIGQxID0gRGVjaW1hbCgnNjYnKQorICAgICAgICBkMiA9IERlY2ltYWwoJzE1LjMyJykKKworICAgICAgICAjaW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGQxKSwgNjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGQyKSwgMTUpCisKKyAgICAgICAgI2xvbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGQxKSwgNjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhkMiksIDE1KQorCisgICAgICAgICNmbG9hdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KGQxKSwgNjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoZDIpLCAxNS4zMikKKworICAgIGRlZiB0ZXN0X25hbl90b19mbG9hdChzZWxmKToKKyAgICAgICAgIyBUZXN0IGNvbnZlcnNpb25zIG9mIGRlY2ltYWwgTkFOcyB0byBmbG9hdC4KKyAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1NTQ0CisgICAgICAgIGZvciBzIGluICgnbmFuJywgJ25hbjEyMzQnLCAnLW5hbicsICctbmFuMjQ2OCcpOgorICAgICAgICAgICAgZiA9IGZsb2F0KERlY2ltYWwocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmKSkKKworICAgIGRlZiB0ZXN0X3NuYW5fdG9fZmxvYXQoc2VsZik6CisgICAgICAgIGZvciBzIGluICgnc25hbicsICctc25hbicsICdzbmFuMTM1NycsICctc25hbjEyMzQnKToKKyAgICAgICAgICAgIGQgPSBEZWNpbWFsKHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgZCkKKworICAgIGRlZiB0ZXN0X2V2YWxfcm91bmRfdHJpcChzZWxmKToKKworICAgICAgICAjd2l0aCB6ZXJvCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMCwgKDAsKSwgMCkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGV2YWwocmVwcihkKSkpCisKKyAgICAgICAgI2ludAorICAgICAgICBkID0gRGVjaW1hbCggKDEsICg0LCA1KSwgMCkgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGV2YWwocmVwcihkKSkpCisKKyAgICAgICAgI2Zsb2F0CisgICAgICAgIGQgPSBEZWNpbWFsKCAoMCwgKDQsIDUsIDMsIDQpLCAtMikgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGV2YWwocmVwcihkKSkpCisKKyAgICAgICAgI3dlaXJkCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKDQsIDMsIDQsIDksIDEsIDMsIDUsIDMsIDQpLCAtMjUpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBldmFsKHJlcHIoZCkpKQorCisgICAgZGVmIHRlc3RfYXNfdHVwbGUoc2VsZik6CisKKyAgICAgICAgI3dpdGggemVybworICAgICAgICBkID0gRGVjaW1hbCgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDAsICgwLCksIDApICkKKworICAgICAgICAjaW50CisgICAgICAgIGQgPSBEZWNpbWFsKC00NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmFzX3R1cGxlKCksICgxLCAoNCwgNSksIDApICkKKworICAgICAgICAjY29tcGxpY2F0ZWQgc3RyaW5nCisgICAgICAgIGQgPSBEZWNpbWFsKCItNC4zNDkxMzUzNEUtMTciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICg0LCAzLCA0LCA5LCAxLCAzLCA1LCAzLCA0KSwgLTI1KSApCisKKyAgICAgICAgI2luZgorICAgICAgICBkID0gRGVjaW1hbCgiSW5maW5pdHkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDAsICgwLCksICdGJykgKQorCisgICAgICAgICNsZWFkaW5nIHplcm9zIGluIGNvZWZmaWNpZW50IHNob3VsZCBiZSBzdHJpcHBlZAorICAgICAgICBkID0gRGVjaW1hbCggKDAsICgwLCAwLCA0LCAwLCA1LCAzLCA0KSwgLTIpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmFzX3R1cGxlKCksICgwLCAoNCwgMCwgNSwgMywgNCksIC0yKSApCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKDAsIDAsIDApLCAzNykgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgwLCksIDM3KSkKKyAgICAgICAgZCA9IERlY2ltYWwoICgxLCAoKSwgMzcpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmFzX3R1cGxlKCksICgxLCAoMCwpLCAzNykpCisKKyAgICAgICAgI2xlYWRpbmcgemVyb3MgaW4gTmFOIGRpYWdub3N0aWMgaW5mbyBzaG91bGQgYmUgc3RyaXBwZWQKKyAgICAgICAgZCA9IERlY2ltYWwoICgwLCAoMCwgMCwgNCwgMCwgNSwgMywgNCksICduJykgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDAsICg0LCAwLCA1LCAzLCA0KSwgJ24nKSApCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKDAsIDAsIDApLCAnTicpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmFzX3R1cGxlKCksICgxLCAoKSwgJ04nKSApCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKCksICduJykgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDEsICgpLCAnbicpICkKKworICAgICAgICAjY29lZmZpY2llbnQgaW4gaW5maW5pdHkgc2hvdWxkIGJlIGlnbm9yZWQKKyAgICAgICAgZCA9IERlY2ltYWwoICgwLCAoNCwgNSwgMywgNCksICdGJykgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYXNfdHVwbGUoKSwgKDAsICgwLCksICdGJykpCisgICAgICAgIGQgPSBEZWNpbWFsKCAoMSwgKDAsIDIsIDcsIDEpLCAnRicpICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmFzX3R1cGxlKCksICgxLCAoMCwpLCAnRicpKQorCisgICAgZGVmIHRlc3RfaW1tdXRhYmlsaXR5X29wZXJhdGlvbnMoc2VsZik6CisgICAgICAgICMgRG8gb3BlcmF0aW9ucyBhbmQgY2hlY2sgdGhhdCBpdCBkaWRuJ3QgY2hhbmdlIGNoYW5nZSBpbnRlcm5hbCBvYmplY3RzLgorCisgICAgICAgIGQxID0gRGVjaW1hbCgnLTI1ZTU1JykKKyAgICAgICAgYjEgPSBEZWNpbWFsKCctMjVlNTUnKQorICAgICAgICBkMiA9IERlY2ltYWwoJzMzZSszMycpCisgICAgICAgIGIyID0gRGVjaW1hbCgnMzNlKzMzJykKKworICAgICAgICBkZWYgY2hlY2tTYW1lRGVjKG9wZXJhdGlvbiwgdXNlT3RoZXI9RmFsc2UpOgorICAgICAgICAgICAgaWYgdXNlT3RoZXI6CisgICAgICAgICAgICAgICAgZXZhbCgiZDEuIiArIG9wZXJhdGlvbiArICIoZDIpIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9zaWduLCBiMS5fc2lnbikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9pbnQsIGIxLl9pbnQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS5fZXhwLCBiMS5fZXhwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuX3NpZ24sIGIyLl9zaWduKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuX2ludCwgYjIuX2ludCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLl9leHAsIGIyLl9leHApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV2YWwoImQxLiIgKyBvcGVyYXRpb24gKyAiKCkiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX3NpZ24sIGIxLl9zaWduKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuX2ludCwgYjEuX2ludCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9leHAsIGIxLl9leHApCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBEZWNpbWFsKGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9zaWduLCBiMS5fc2lnbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS5faW50LCBiMS5faW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLl9leHAsIGIxLl9leHApCisKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2Fic19fIikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2FkZF9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2Rpdl9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2Rpdm1vZF9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2VxX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fbmVfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19sZV9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2x0X18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fZ2VfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19ndF9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX2Zsb2F0X18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fZmxvb3JkaXZfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19oYXNoX18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9faW50X18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fdHJ1bmNfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19sb25nX18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fbW9kX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fbXVsX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fbmVnX18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fbm9uemVyb19fIikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3Bvc19fIikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3Bvd19fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3JhZGRfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19yZGl2X18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fcmRpdm1vZF9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3JlcHJfXyIpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19yZmxvb3JkaXZfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19ybW9kX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fcm11bF9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJfX3Jwb3dfXyIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygiX19yc3ViX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fc3RyX18iKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fc3ViX18iLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIl9fdHJ1ZWRpdl9fIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJhZGp1c3RlZCIpCisgICAgICAgIGNoZWNrU2FtZURlYygiYXNfdHVwbGUiKQorICAgICAgICBjaGVja1NhbWVEZWMoImNvbXBhcmUiLCBUcnVlKQorICAgICAgICBjaGVja1NhbWVEZWMoIm1heCIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygibWluIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJub3JtYWxpemUiKQorICAgICAgICBjaGVja1NhbWVEZWMoInF1YW50aXplIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJyZW1haW5kZXJfbmVhciIsIFRydWUpCisgICAgICAgIGNoZWNrU2FtZURlYygic2FtZV9xdWFudHVtIiwgVHJ1ZSkKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJzcXJ0IikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJ0b19lbmdfc3RyaW5nIikKKyAgICAgICAgY2hlY2tTYW1lRGVjKCJ0b19pbnRlZ3JhbCIpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc2luZyhzZWxmKToKKyAgICAgICAgIyBEaWZmZXJlbnQgYmVoYXZpb3VycyB3aGVuIHN1YmNsYXNzaW5nIERlY2ltYWwKKworICAgICAgICBjbGFzcyBNeURlY2ltYWwoRGVjaW1hbCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZDEgPSBNeURlY2ltYWwoMSkKKyAgICAgICAgZDIgPSBNeURlY2ltYWwoMikKKyAgICAgICAgZCA9IGQxICsgZDIKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGQpLCBEZWNpbWFsKQorCisgICAgICAgIGQgPSBkMS5tYXgoZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShkKSwgRGVjaW1hbCkKKworICAgIGRlZiB0ZXN0X2ltcGxpY2l0X2NvbnRleHQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgcmVzdWx0cyB3aGVuIGNvbnRleHQgZ2l2ZW4gaW1wbGljaXRseS4gIChJc3N1ZSAyNDc4KQorICAgICAgICBjID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKERlY2ltYWwoMCkuc3FydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoYy5zcXJ0KERlY2ltYWwoMCkpKSkKKworICAgIGRlZiB0ZXN0X2NvbnZlcnNpb25zX2Zyb21faW50KHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgbWV0aG9kcyB0YWtpbmcgYSBzZWNvbmQgRGVjaW1hbCBhcmd1bWVudCB3aWxsCisgICAgICAgICMgYWx3YXlzIGFjY2VwdCBhbiBpbnRlZ2VyIGluIHBsYWNlIG9mIGEgRGVjaW1hbC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDQpLmNvbXBhcmUoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg0KS5jb21wYXJlKERlY2ltYWwoMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNCkuY29tcGFyZV9zaWduYWwoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg0KS5jb21wYXJlX3NpZ25hbChEZWNpbWFsKDMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDQpLmNvbXBhcmVfdG90YWwoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg0KS5jb21wYXJlX3RvdGFsKERlY2ltYWwoMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoNCkuY29tcGFyZV90b3RhbF9tYWcoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg0KS5jb21wYXJlX3RvdGFsX21hZyhEZWNpbWFsKDMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDEwMTAxKS5sb2dpY2FsX2FuZCgxMDAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDEwMTAxKS5sb2dpY2FsX2FuZChEZWNpbWFsKDEwMDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDEwMTAxKS5sb2dpY2FsX29yKDEwMDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoMTAxMDEpLmxvZ2ljYWxfb3IoRGVjaW1hbCgxMDAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCgxMDEwMSkubG9naWNhbF94b3IoMTAwMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCgxMDEwMSkubG9naWNhbF94b3IoRGVjaW1hbCgxMDAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCg1NjcpLm1heCgxMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoNTY3KS5tYXgoRGVjaW1hbCgxMjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDU2NykubWF4X21hZygxMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoNTY3KS5tYXhfbWFnKERlY2ltYWwoMTIzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCg1NjcpLm1pbigxMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoNTY3KS5taW4oRGVjaW1hbCgxMjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDU2NykubWluX21hZygxMjMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoNTY3KS5taW5fbWFnKERlY2ltYWwoMTIzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCg1NjcpLm5leHRfdG93YXJkKDEyMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg1NjcpLm5leHRfdG93YXJkKERlY2ltYWwoMTIzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCgxMjM0KS5xdWFudGl6ZSgxMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoMTIzNCkucXVhbnRpemUoRGVjaW1hbCgxMDApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDc2OCkucmVtYWluZGVyX25lYXIoMTIzNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCg3NjgpLnJlbWFpbmRlcl9uZWFyKERlY2ltYWwoMTIzNCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoMTIzKS5yb3RhdGUoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCgxMjMpLnJvdGF0ZShEZWNpbWFsKDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDEyMzQpLnNhbWVfcXVhbnR1bSgxMDAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKDEyMzQpLnNhbWVfcXVhbnR1bShEZWNpbWFsKDEwMDApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKCc5LjEyMycpLnNjYWxlYigtMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKCc5LjEyMycpLnNjYWxlYihEZWNpbWFsKC0xMDApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKDQ1Nikuc2hpZnQoLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoNDU2KS5zaGlmdChEZWNpbWFsKC0xKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEZWNpbWFsKC0xMikuZm1hKERlY2ltYWwoNDUpLCA2NyksCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaW1hbCgtMTIpLmZtYShEZWNpbWFsKDQ1KSwgRGVjaW1hbCg2NykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoLTEyKS5mbWEoNDUsIDY3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZWNpbWFsKC0xMikuZm1hKERlY2ltYWwoNDUpLCBEZWNpbWFsKDY3KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbCgtMTIpLmZtYSg0NSwgRGVjaW1hbCg2NykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlY2ltYWwoLTEyKS5mbWEoRGVjaW1hbCg0NSksIERlY2ltYWwoNjcpKSkKKworCitjbGFzcyBEZWNpbWFsUHl0aG9uQVBJdGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYWJjKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLk51bWJlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLlJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoRGVjaW1hbCgwKSwgbnVtYmVycy5OdW1iZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLlJlYWwpCisKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIGQgPSBEZWNpbWFsKCctMy4xNDE1OTAwMDAnKQorICAgICAgICBwID0gcGlja2xlLmR1bXBzKGQpCisgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBlKQorCisgICAgZGVmIHRlc3RfaW50KHNlbGYpOgorICAgICAgICBmb3IgeCBpbiByYW5nZSgtMjUwLCAyNTApOgorICAgICAgICAgICAgcyA9ICclMC4yZicgJSAoeCAvIDEwMC4wKQorICAgICAgICAgICAgIyBzaG91bGQgd29yayB0aGUgc2FtZSBhcyBmb3IgZmxvYXRzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChEZWNpbWFsKHMpKSwgaW50KGZsb2F0KHMpKSkKKyAgICAgICAgICAgICMgc2hvdWxkIHdvcmsgdGhlIHNhbWUgYXMgdG9faW50ZWdyYWwgaW4gdGhlIFJPVU5EX0RPV04gbW9kZQorICAgICAgICAgICAgZCA9IERlY2ltYWwocykKKyAgICAgICAgICAgIHIgPSBkLnRvX2ludGVncmFsKFJPVU5EX0RPV04pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERlY2ltYWwoaW50KGQpKSwgcikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsIERlY2ltYWwoJy1uYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCBEZWNpbWFsKCdzbmFuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGludCwgRGVjaW1hbCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGludCwgRGVjaW1hbCgnLWluZicpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvbmcsIERlY2ltYWwoJy1uYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgRGVjaW1hbCgnc25hbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsb25nLCBEZWNpbWFsKCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbG9uZywgRGVjaW1hbCgnLWluZicpKQorCisgICAgZGVmIHRlc3RfdHJ1bmMoc2VsZik6CisgICAgICAgIGZvciB4IGluIHJhbmdlKC0yNTAsIDI1MCk6CisgICAgICAgICAgICBzID0gJyUwLjJmJyAlICh4IC8gMTAwLjApCisgICAgICAgICAgICAjIHNob3VsZCB3b3JrIHRoZSBzYW1lIGFzIGZvciBmbG9hdHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KERlY2ltYWwocykpLCBpbnQoZmxvYXQocykpKQorICAgICAgICAgICAgIyBzaG91bGQgd29yayB0aGUgc2FtZSBhcyB0b19pbnRlZ3JhbCBpbiB0aGUgUk9VTkRfRE9XTiBtb2RlCisgICAgICAgICAgICBkID0gRGVjaW1hbChzKQorICAgICAgICAgICAgciA9IGQudG9faW50ZWdyYWwoUk9VTkRfRE9XTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGVjaW1hbChtYXRoLnRydW5jKGQpKSwgcikKKworICAgIGRlZiB0ZXN0X2Zyb21fZmxvYXQoc2VsZik6CisKKyAgICAgICAgY2xhc3MgIE15RGVjaW1hbChEZWNpbWFsKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICByID0gTXlEZWNpbWFsLmZyb21fZmxvYXQoMC4xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUociksIE15RGVjaW1hbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIociksCisgICAgICAgICAgICAgICAgJzAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNScpCisgICAgICAgIGJpZ2ludCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTXlEZWNpbWFsLmZyb21fZmxvYXQoYmlnaW50KSwgTXlEZWNpbWFsKGJpZ2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShNeURlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnbmFuJykpLmlzX3FuYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkuaXNfaW5maW5pdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCctaW5mJykpLmlzX2luZmluaXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCduYW4nKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCdOYU4nKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCdJbmZpbml0eScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoTXlEZWNpbWFsLmZyb21fZmxvYXQoZmxvYXQoJy1pbmYnKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCctSW5maW5pdHknKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTXlEZWNpbWFsLmZyb21fZmxvYXQsICdhYmMnKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyMDApOgorICAgICAgICAgICAgeCA9IHJhbmRvbS5leHBvdmFyaWF0ZSgwLjAxKSAqIChyYW5kb20ucmFuZG9tKCkgKiAyLjAgLSAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGZsb2F0KE15RGVjaW1hbC5mcm9tX2Zsb2F0KHgpKSkgIyByb3VuZHRyaXAKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoc2VsZik6CisgICAgICAgIGNvbnRleHQgPSBDb250ZXh0KHByZWM9NSwgcm91bmRpbmc9Uk9VTkRfRE9XTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvbnRleHQuY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdChtYXRoLnBpKSwKKyAgICAgICAgICAgIERlY2ltYWwoJzMuMTQxNScpCisgICAgICAgICkKKyAgICAgICAgY29udGV4dCA9IENvbnRleHQocHJlYz01LCByb3VuZGluZz1ST1VORF9VUCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvbnRleHQuY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdChtYXRoLnBpKSwKKyAgICAgICAgICAgIERlY2ltYWwoJzMuMTQxNicpCisgICAgICAgICkKKyAgICAgICAgY29udGV4dCA9IENvbnRleHQocHJlYz01LCB0cmFwcz1bSW5leGFjdF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgSW5leGFjdCwKKyAgICAgICAgICAgIGNvbnRleHQuY3JlYXRlX2RlY2ltYWxfZnJvbV9mbG9hdCwKKyAgICAgICAgICAgIG1hdGgucGkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoY29udGV4dC5jcmVhdGVfZGVjaW1hbF9mcm9tX2Zsb2F0KC0wLjApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCgnLTAnKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb250ZXh0LmNyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoMS4wKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkRlY2ltYWwoJzEnKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb250ZXh0LmNyZWF0ZV9kZWNpbWFsX2Zyb21fZmxvYXQoMTApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRGVjaW1hbCgnMTAnKSIpCisKK2NsYXNzIENvbnRleHRBUEl0ZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9waWNrbGUoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoYykpCisgICAgICAgIGZvciBrIGluIHZhcnMoYyk6CisgICAgICAgICAgICB2MSA9IHZhcnMoYylba10KKyAgICAgICAgICAgIHYyID0gdmFycyhlKVtrXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2MSwgdjIpCisKKyAgICBkZWYgdGVzdF9lcXVhbGl0eV93aXRoX290aGVyX3R5cGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEluKERlY2ltYWwoMTApLCBbJ2EnLCAxLjAsIERlY2ltYWwoMTApLCAoMSwyKSwge31dKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKERlY2ltYWwoMTApLCBbJ2EnLCAxLjAsICgxLDIpLCB7fV0pCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICAjIEFsbCBjb3BpZXMgc2hvdWxkIGJlIGRlZXAKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChjKSwgaWQoZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoYy5mbGFncyksIGlkKGQuZmxhZ3MpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMudHJhcHMpLCBpZChkLnRyYXBzKSkKKworICAgIGRlZiB0ZXN0X2FicyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5hYnMoRGVjaW1hbCgtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5hYnMoLTEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuYWJzLCAnLTEnKQorCisgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmFkZChEZWNpbWFsKDEpLCBEZWNpbWFsKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuYWRkKDEsIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuYWRkKERlY2ltYWwoMSksIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuYWRkKDEsIERlY2ltYWwoMSkpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuYWRkLCAnMScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5hZGQsIDEsICcxJykKKworICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuY29tcGFyZShEZWNpbWFsKDEpLCBEZWNpbWFsKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZSgxLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmUoRGVjaW1hbCgxKSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlKDEsIERlY2ltYWwoMSkpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29tcGFyZSwgJzEnLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29tcGFyZSwgMSwgJzEnKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV9zaWduYWwoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuY29tcGFyZV9zaWduYWwoRGVjaW1hbCgxKSwgRGVjaW1hbCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmVfc2lnbmFsKDEsIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZV9zaWduYWwoRGVjaW1hbCgxKSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlX3NpZ25hbCgxLCBEZWNpbWFsKDEpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvbXBhcmVfc2lnbmFsLCAnMScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5jb21wYXJlX3NpZ25hbCwgMSwgJzEnKQorCisgICAgZGVmIHRlc3RfY29tcGFyZV90b3RhbChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5jb21wYXJlX3RvdGFsKERlY2ltYWwoMSksIERlY2ltYWwoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlX3RvdGFsKDEsIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZV90b3RhbChEZWNpbWFsKDEpLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmVfdG90YWwoMSwgRGVjaW1hbCgxKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5jb21wYXJlX3RvdGFsLCAnMScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5jb21wYXJlX3RvdGFsLCAxLCAnMScpCisKKyAgICBkZWYgdGVzdF9jb21wYXJlX3RvdGFsX21hZyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5jb21wYXJlX3RvdGFsX21hZyhEZWNpbWFsKDEpLCBEZWNpbWFsKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29tcGFyZV90b3RhbF9tYWcoMSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb21wYXJlX3RvdGFsX21hZyhEZWNpbWFsKDEpLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvbXBhcmVfdG90YWxfbWFnKDEsIERlY2ltYWwoMSkpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuY29tcGFyZV90b3RhbF9tYWcsICcxJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvbXBhcmVfdG90YWxfbWFnLCAxLCAnMScpCisKKyAgICBkZWYgdGVzdF9jb3B5X2FicyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5jb3B5X2FicyhEZWNpbWFsKC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvcHlfYWJzKC0xKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvcHlfYWJzLCAnLTEnKQorCisgICAgZGVmIHRlc3RfY29weV9kZWNpbWFsKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmNvcHlfZGVjaW1hbChEZWNpbWFsKC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvcHlfZGVjaW1hbCgtMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5jb3B5X2RlY2ltYWwsICctMScpCisKKyAgICBkZWYgdGVzdF9jb3B5X25lZ2F0ZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5jb3B5X25lZ2F0ZShEZWNpbWFsKC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvcHlfbmVnYXRlKC0xKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvcHlfbmVnYXRlLCAnLTEnKQorCisgICAgZGVmIHRlc3RfY29weV9zaWduKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmNvcHlfc2lnbihEZWNpbWFsKDEpLCBEZWNpbWFsKC0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmNvcHlfc2lnbigxLCAtMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5jb3B5X3NpZ24oRGVjaW1hbCgxKSwgLTIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuY29weV9zaWduKDEsIERlY2ltYWwoLTIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvcHlfc2lnbiwgJzEnLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmNvcHlfc2lnbiwgMSwgJy0yJykKKworICAgIGRlZiB0ZXN0X2RpdmlkZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5kaXZpZGUoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdmlkZSgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdmlkZShEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdmlkZSgxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmRpdmlkZSwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZGl2aWRlLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9kaXZpZGVfaW50KHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmRpdmlkZV9pbnQoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdmlkZV9pbnQoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5kaXZpZGVfaW50KERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZGl2aWRlX2ludCgxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmRpdmlkZV9pbnQsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmRpdmlkZV9pbnQsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X2Rpdm1vZChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5kaXZtb2QoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdm1vZCgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdm1vZChEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmRpdm1vZCgxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmRpdm1vZCwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZGl2bW9kLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9leHAoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuZXhwKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZXhwKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmV4cCwgJzEwJykKKworICAgIGRlZiB0ZXN0X2ZtYShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5mbWEoRGVjaW1hbCgyKSwgRGVjaW1hbCgzKSwgRGVjaW1hbCg0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZtYSgyLCAzLCA0KSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZtYShEZWNpbWFsKDIpLCAzLCA0KSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZtYSgyLCBEZWNpbWFsKDMpLCA0KSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZtYSgyLCAzLCBEZWNpbWFsKDQpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZtYShEZWNpbWFsKDIpLCBEZWNpbWFsKDMpLCA0KSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmZtYSwgJzInLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuZm1hLCAyLCAnMycsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5mbWEsIDIsIDMsICc0JykKKworICAgIGRlZiB0ZXN0X2lzX2Zpbml0ZShzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5pc19maW5pdGUoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5pc19maW5pdGUoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuaXNfZmluaXRlLCAnMTAnKQorCisgICAgZGVmIHRlc3RfaXNfaW5maW5pdGUoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuaXNfaW5maW5pdGUoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5pc19pbmZpbml0ZSgxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5pc19pbmZpbml0ZSwgJzEwJykKKworICAgIGRlZiB0ZXN0X2lzX25hbihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5pc19uYW4oRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5pc19uYW4oMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuaXNfbmFuLCAnMTAnKQorCisgICAgZGVmIHRlc3RfaXNfbm9ybWFsKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmlzX25vcm1hbChEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmlzX25vcm1hbCgxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5pc19ub3JtYWwsICcxMCcpCisKKyAgICBkZWYgdGVzdF9pc19xbmFuKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmlzX3FuYW4oRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5pc19xbmFuKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmlzX3FuYW4sICcxMCcpCisKKyAgICBkZWYgdGVzdF9pc19zaWduZWQoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuaXNfc2lnbmVkKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuaXNfc2lnbmVkKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmlzX3NpZ25lZCwgJzEwJykKKworICAgIGRlZiB0ZXN0X2lzX3NuYW4oc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMuaXNfc25hbihEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmlzX3NuYW4oMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuaXNfc25hbiwgJzEwJykKKworICAgIGRlZiB0ZXN0X2lzX3N1Ym5vcm1hbChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5pc19zdWJub3JtYWwoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5pc19zdWJub3JtYWwoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuaXNfc3Vibm9ybWFsLCAnMTAnKQorCisgICAgZGVmIHRlc3RfaXNfemVybyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5pc196ZXJvKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuaXNfemVybygxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5pc196ZXJvLCAnMTAnKQorCisgICAgZGVmIHRlc3RfbG4oc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubG4oRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sbigxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5sbiwgJzEwJykKKworICAgIGRlZiB0ZXN0X2xvZzEwKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmxvZzEwKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9nMTAoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubG9nMTAsICcxMCcpCisKKyAgICBkZWYgdGVzdF9sb2diKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLmxvZ2IoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2diKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmxvZ2IsICcxMCcpCisKKyAgICBkZWYgdGVzdF9sb2dpY2FsX2FuZChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5sb2dpY2FsX2FuZChEZWNpbWFsKDEpLCBEZWNpbWFsKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9naWNhbF9hbmQoMSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2dpY2FsX2FuZChEZWNpbWFsKDEpLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxvZ2ljYWxfYW5kKDEsIERlY2ltYWwoMSkpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubG9naWNhbF9hbmQsICcxJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmxvZ2ljYWxfYW5kLCAxLCAnMScpCisKKyAgICBkZWYgdGVzdF9sb2dpY2FsX2ludmVydChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5sb2dpY2FsX2ludmVydChEZWNpbWFsKDEwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9naWNhbF9pbnZlcnQoMTAwMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5sb2dpY2FsX2ludmVydCwgJzEwMDAnKQorCisgICAgZGVmIHRlc3RfbG9naWNhbF9vcihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5sb2dpY2FsX29yKERlY2ltYWwoMSksIERlY2ltYWwoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2dpY2FsX29yKDEsIDEpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9naWNhbF9vcihEZWNpbWFsKDEpLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxvZ2ljYWxfb3IoMSwgRGVjaW1hbCgxKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5sb2dpY2FsX29yLCAnMScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5sb2dpY2FsX29yLCAxLCAnMScpCisKKyAgICBkZWYgdGVzdF9sb2dpY2FsX3hvcihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5sb2dpY2FsX3hvcihEZWNpbWFsKDEpLCBEZWNpbWFsKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubG9naWNhbF94b3IoMSwgMSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5sb2dpY2FsX3hvcihEZWNpbWFsKDEpLCAxKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmxvZ2ljYWxfeG9yKDEsIERlY2ltYWwoMSkpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubG9naWNhbF94b3IsICcxJywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLmxvZ2ljYWxfeG9yLCAxLCAnMScpCisKKyAgICBkZWYgdGVzdF9tYXgoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubWF4KERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tYXgoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tYXgoRGVjaW1hbCgxKSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tYXgoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5tYXgsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1heCwgMSwgJzInKQorCisgICAgZGVmIHRlc3RfbWF4X21hZyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5tYXhfbWFnKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tYXhfbWFnKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubWF4X21hZyhEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1heF9tYWcoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5tYXhfbWFnLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5tYXhfbWFnLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9taW4oc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubWluKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5taW4oMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5taW4oRGVjaW1hbCgxKSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5taW4oMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5taW4sICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1pbiwgMSwgJzInKQorCisgICAgZGVmIHRlc3RfbWluX21hZyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5taW5fbWFnKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5taW5fbWFnKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubWluX21hZyhEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1pbl9tYWcoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5taW5fbWFnLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5taW5fbWFnLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9taW51cyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5taW51cyhEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm1pbnVzKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm1pbnVzLCAnMTAnKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbHkoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubXVsdGlwbHkoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm11bHRpcGx5KDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubXVsdGlwbHkoRGVjaW1hbCgxKSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5tdWx0aXBseSgxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm11bHRpcGx5LCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5tdWx0aXBseSwgMSwgJzInKQorCisgICAgZGVmIHRlc3RfbmV4dF9taW51cyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5uZXh0X21pbnVzKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubmV4dF9taW51cygxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5uZXh0X21pbnVzLCAnMTAnKQorCisgICAgZGVmIHRlc3RfbmV4dF9wbHVzKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLm5leHRfcGx1cyhEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm5leHRfcGx1cygxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5uZXh0X3BsdXMsICcxMCcpCisKKyAgICBkZWYgdGVzdF9uZXh0X3Rvd2FyZChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5uZXh0X3Rvd2FyZChEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubmV4dF90b3dhcmQoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5uZXh0X3Rvd2FyZChEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm5leHRfdG93YXJkKDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMubmV4dF90b3dhcmQsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm5leHRfdG93YXJkLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9ub3JtYWxpemUoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMubm9ybWFsaXplKERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubm9ybWFsaXplKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLm5vcm1hbGl6ZSwgJzEwJykKKworICAgIGRlZiB0ZXN0X251bWJlcl9jbGFzcyhzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubnVtYmVyX2NsYXNzKDEyMyksIGMubnVtYmVyX2NsYXNzKERlY2ltYWwoMTIzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5udW1iZXJfY2xhc3MoMCksIGMubnVtYmVyX2NsYXNzKERlY2ltYWwoMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMubnVtYmVyX2NsYXNzKC00NSksIGMubnVtYmVyX2NsYXNzKERlY2ltYWwoLTQ1KSkpCisKKyAgICBkZWYgdGVzdF9wb3dlcihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5wb3dlcihEZWNpbWFsKDEpLCBEZWNpbWFsKDQpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucG93ZXIoMSwgNCwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5wb3dlcihEZWNpbWFsKDEpLCA0LCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnBvd2VyKDEsIERlY2ltYWwoNCksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucG93ZXIoMSwgNCwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5wb3dlcihEZWNpbWFsKDEpLCBEZWNpbWFsKDQpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnBvd2VyLCAnMScsIDQsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5wb3dlciwgMSwgJzQnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucG93ZXIsIDEsIDQsICcyJykKKworICAgIGRlZiB0ZXN0X3BsdXMoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMucGx1cyhEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnBsdXMoMTApLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucGx1cywgJzEwJykKKworICAgIGRlZiB0ZXN0X3F1YW50aXplKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnF1YW50aXplKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5xdWFudGl6ZSgxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnF1YW50aXplKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucXVhbnRpemUoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5xdWFudGl6ZSwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucXVhbnRpemUsIDEsICcyJykKKworICAgIGRlZiB0ZXN0X3JlbWFpbmRlcihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5yZW1haW5kZXIoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJlbWFpbmRlcigxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJlbWFpbmRlcihEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJlbWFpbmRlcigxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnJlbWFpbmRlciwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucmVtYWluZGVyLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9yZW1haW5kZXJfbmVhcihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5yZW1haW5kZXJfbmVhcihEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMucmVtYWluZGVyX25lYXIoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5yZW1haW5kZXJfbmVhcihEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnJlbWFpbmRlcl9uZWFyKDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMucmVtYWluZGVyX25lYXIsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnJlbWFpbmRlcl9uZWFyLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9yb3RhdGUoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMucm90YXRlKERlY2ltYWwoMSksIERlY2ltYWwoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5yb3RhdGUoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5yb3RhdGUoRGVjaW1hbCgxKSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5yb3RhdGUoMSwgRGVjaW1hbCgyKSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5yb3RhdGUsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnJvdGF0ZSwgMSwgJzInKQorCisgICAgZGVmIHRlc3Rfc3FydChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5zcXJ0KERlY2ltYWwoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc3FydCgxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5zcXJ0LCAnMTAnKQorCisgICAgZGVmIHRlc3Rfc2FtZV9xdWFudHVtKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnNhbWVfcXVhbnR1bShEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2FtZV9xdWFudHVtKDEsIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2FtZV9xdWFudHVtKERlY2ltYWwoMSksIDIpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2FtZV9xdWFudHVtKDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuc2FtZV9xdWFudHVtLCAnMScsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy5zYW1lX3F1YW50dW0sIDEsICcyJykKKworICAgIGRlZiB0ZXN0X3NjYWxlYihzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5zY2FsZWIoRGVjaW1hbCgxKSwgRGVjaW1hbCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNjYWxlYigxLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNjYWxlYihEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNjYWxlYigxLCBEZWNpbWFsKDIpKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnNjYWxlYiwgJzEnLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuc2NhbGViLCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9zaGlmdChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5zaGlmdChEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc2hpZnQoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zaGlmdChEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNoaWZ0KDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuc2hpZnQsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnNoaWZ0LCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF9zdWJ0cmFjdChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy5zdWJ0cmFjdChEZWNpbWFsKDEpLCBEZWNpbWFsKDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuc3VidHJhY3QoMSwgMiksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zdWJ0cmFjdChEZWNpbWFsKDEpLCAyKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnN1YnRyYWN0KDEsIERlY2ltYWwoMikpLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGMuc3VidHJhY3QsICcxJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnN1YnRyYWN0LCAxLCAnMicpCisKKyAgICBkZWYgdGVzdF90b19lbmdfc3RyaW5nKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnRvX2VuZ19zdHJpbmcoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy50b19lbmdfc3RyaW5nKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnRvX2VuZ19zdHJpbmcsICcxMCcpCisKKyAgICBkZWYgdGVzdF90b19zY2lfc3RyaW5nKHNlbGYpOgorICAgICAgICBjID0gQ29udGV4dCgpCisgICAgICAgIGQgPSBjLnRvX3NjaV9zdHJpbmcoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy50b19zY2lfc3RyaW5nKDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnRvX3NjaV9zdHJpbmcsICcxMCcpCisKKyAgICBkZWYgdGVzdF90b19pbnRlZ3JhbF9leGFjdChzZWxmKToKKyAgICAgICAgYyA9IENvbnRleHQoKQorICAgICAgICBkID0gYy50b19pbnRlZ3JhbF9leGFjdChEZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnRvX2ludGVncmFsX2V4YWN0KDEwKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLnRvX2ludGVncmFsX2V4YWN0LCAnMTAnKQorCisgICAgZGVmIHRlc3RfdG9faW50ZWdyYWxfdmFsdWUoc2VsZik6CisgICAgICAgIGMgPSBDb250ZXh0KCkKKyAgICAgICAgZCA9IGMudG9faW50ZWdyYWxfdmFsdWUoRGVjaW1hbCgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy50b19pbnRlZ3JhbF92YWx1ZSgxMCksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYy50b19pbnRlZ3JhbF92YWx1ZSwgJzEwJykKKworY2xhc3MgV2l0aFN0YXRlbWVudFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgQ2FuJ3QgZG8gdGhlc2UgYXMgZG9jc3RyaW5ncyB1bnRpbCBQeXRob24gMi42CisgICAgIyBhcyBkb2N0ZXN0IGNhbid0IGhhbmRsZSBfX2Z1dHVyZV9fIHN0YXRlbWVudHMKKworICAgIGRlZiB0ZXN0X2xvY2FsY29udGV4dChzZWxmKToKKyAgICAgICAgIyBVc2UgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGNvbnRleHQgaW4gdGhlIGJsb2NrCisgICAgICAgIG9yaWdfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KCkgYXMgZW50ZXJfY3R4OgorICAgICAgICAgICAgc2V0X2N0eCA9IGdldGNvbnRleHQoKQorICAgICAgICBmaW5hbF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvcmlnX2N0eCwgZmluYWxfY3R4LCAnZGlkIG5vdCByZXN0b3JlIGNvbnRleHQgY29ycmVjdGx5JykKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChvcmlnX2N0eCwgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2V0X2N0eCwgZW50ZXJfY3R4LCAnX19lbnRlcl9fIHJldHVybmVkIHdyb25nIGNvbnRleHQnKQorCisgICAgZGVmIHRlc3RfbG9jYWxjb250ZXh0YXJnKHNlbGYpOgorICAgICAgICAjIFVzZSBhIGNvcHkgb2YgdGhlIHN1cHBsaWVkIGNvbnRleHQgaW4gdGhlIGJsb2NrCisgICAgICAgIG9yaWdfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIG5ld19jdHggPSBDb250ZXh0KHByZWM9NDIpCisgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KG5ld19jdHgpIGFzIGVudGVyX2N0eDoKKyAgICAgICAgICAgIHNldF9jdHggPSBnZXRjb250ZXh0KCkKKyAgICAgICAgZmluYWxfY3R4ID0gZ2V0Y29udGV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMob3JpZ19jdHgsIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0X2N0eC5wcmVjLCBuZXdfY3R4LnByZWMsICdkaWQgbm90IHNldCBjb3JyZWN0IGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KG5ld19jdHgsIHNldF9jdHgsICdkaWQgbm90IGNvcHkgdGhlIGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydElzKHNldF9jdHgsIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKKworY2xhc3MgQ29udGV4dEZsYWdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mbGFnc19pcnJlbGV2YW50KHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIHJlc3VsdCAobnVtZXJpYyByZXN1bHQgKyBmbGFncyByYWlzZWQpIG9mIGFuCisgICAgICAgICMgYXJpdGhtZXRpYyBvcGVyYXRpb24gZG9lc24ndCBkZXBlbmQgb24gdGhlIGN1cnJlbnQgZmxhZ3MKKworICAgICAgICBjb250ZXh0ID0gQ29udGV4dChwcmVjPTksIEVtaW4gPSAtOTk5OTk5OTk5LCBFbWF4ID0gOTk5OTk5OTk5LAorICAgICAgICAgICAgICAgICAgICByb3VuZGluZz1ST1VORF9IQUxGX0VWRU4sIHRyYXBzPVtdLCBmbGFncz1bXSkKKworICAgICAgICAjIG9wZXJhdGlvbnMgdGhhdCByYWlzZSB2YXJpb3VzIGZsYWdzLCBpbiB0aGUgZm9ybSAoZnVuY3Rpb24sIGFyZ2xpc3QpCisgICAgICAgIG9wZXJhdGlvbnMgPSBbCisgICAgICAgICAgICAoY29udGV4dC5fYXBwbHksIFtEZWNpbWFsKCIxMDBFLTEwMDAwMDAwMDkiKV0pLAorICAgICAgICAgICAgKGNvbnRleHQuc3FydCwgW0RlY2ltYWwoMildKSwKKyAgICAgICAgICAgIChjb250ZXh0LmFkZCwgW0RlY2ltYWwoIjEuMjM0NTY3ODkiKSwgRGVjaW1hbCgiOS44NzY1NDMyMSIpXSksCisgICAgICAgICAgICAoY29udGV4dC5tdWx0aXBseSwgW0RlY2ltYWwoIjEuMjM0NTY3ODkiKSwgRGVjaW1hbCgiOS44NzY1NDMyMSIpXSksCisgICAgICAgICAgICAoY29udGV4dC5zdWJ0cmFjdCwgW0RlY2ltYWwoIjEuMjM0NTY3ODkiKSwgRGVjaW1hbCgiOS44NzY1NDMyMSIpXSksCisgICAgICAgICAgICBdCisKKyAgICAgICAgIyB0cnkgdmFyaW91cyBmbGFncyBpbmRpdmlkdWFsbHksIHRoZW4gYSB3aG9sZSBsb3QgYXQgb25jZQorICAgICAgICBmbGFnc2V0cyA9IFtbSW5leGFjdF0sIFtSb3VuZGVkXSwgW1VuZGVyZmxvd10sIFtDbGFtcGVkXSwgW1N1Ym5vcm1hbF0sCisgICAgICAgICAgICAgICAgICAgIFtJbmV4YWN0LCBSb3VuZGVkLCBVbmRlcmZsb3csIENsYW1wZWQsIFN1Ym5vcm1hbF1dCisKKyAgICAgICAgZm9yIGZuLCBhcmdzIGluIG9wZXJhdGlvbnM6CisgICAgICAgICAgICAjIGZpbmQgYW5zd2VyIGFuZCBmbGFncyByYWlzZWQgdXNpbmcgYSBjbGVhbiBjb250ZXh0CisgICAgICAgICAgICBjb250ZXh0LmNsZWFyX2ZsYWdzKCkKKyAgICAgICAgICAgIGFucyA9IGZuKCphcmdzKQorICAgICAgICAgICAgZmxhZ3MgPSBbayBmb3IgaywgdiBpbiBjb250ZXh0LmZsYWdzLml0ZW1zKCkgaWYgdl0KKworICAgICAgICAgICAgZm9yIGV4dHJhX2ZsYWdzIGluIGZsYWdzZXRzOgorICAgICAgICAgICAgICAgICMgc2V0IGZsYWdzLCBiZWZvcmUgY2FsbGluZyBvcGVyYXRpb24KKyAgICAgICAgICAgICAgICBjb250ZXh0LmNsZWFyX2ZsYWdzKCkKKyAgICAgICAgICAgICAgICBmb3IgZmxhZyBpbiBleHRyYV9mbGFnczoKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5fcmFpc2VfZXJyb3IoZmxhZykKKyAgICAgICAgICAgICAgICBuZXdfYW5zID0gZm4oKmFyZ3MpCisKKyAgICAgICAgICAgICAgICAjIGZsYWdzIHRoYXQgd2UgZXhwZWN0IHRvIGJlIHNldCBhZnRlciB0aGUgb3BlcmF0aW9uCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZmxhZ3MgPSBsaXN0KGZsYWdzKQorICAgICAgICAgICAgICAgIGZvciBmbGFnIGluIGV4dHJhX2ZsYWdzOgorICAgICAgICAgICAgICAgICAgICBpZiBmbGFnIG5vdCBpbiBleHBlY3RlZF9mbGFnczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2ZsYWdzLmFwcGVuZChmbGFnKQorCisgICAgICAgICAgICAgICAgIyBmbGFncyB3ZSBhY3R1YWxseSBnb3QKKyAgICAgICAgICAgICAgICBuZXdfZmxhZ3MgPSBbayBmb3Igayx2IGluIGNvbnRleHQuZmxhZ3MuaXRlbXMoKSBpZiB2XQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbnMsIG5ld19hbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmF0aW9uIHByb2R1Y2VzIGRpZmZlcmVudCBhbnN3ZXJzIGRlcGVuZGluZyBvbiBmbGFncyBzZXQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzLCBnb3QgJXMuIiAlIChhbnMsIG5ld19hbnMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChuZXdfZmxhZ3MsIGV4cGVjdGVkX2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYXRpb24gcmFpc2VzIGRpZmZlcmVudCBmbGFncyBkZXBlbmRpbmcgb24gZmxhZ3Mgc2V0OiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXMsIGdvdCAlcyIgJSAoZXhwZWN0ZWRfZmxhZ3MsIG5ld19mbGFncykpCisKK2RlZiB0ZXN0X21haW4oYXJpdGg9RmFsc2UsIHZlcmJvc2U9Tm9uZSwgdG9kb190ZXN0cz1Ob25lLCBkZWJ1Zz1Ob25lKToKKyAgICAiIiIgRXhlY3V0ZSB0aGUgdGVzdHMuCisKKyAgICBSdW5zIGFsbCBhcml0aG1ldGljIHRlc3RzIGlmIGFyaXRoIGlzIFRydWUgb3IgaWYgdGhlICJkZWNpbWFsIiByZXNvdXJjZQorICAgIGlzIGVuYWJsZWQgaW4gcmVncnRlc3QucHkKKyAgICAiIiIKKworICAgIGluaXQoKQorICAgIGdsb2JhbCBURVNUX0FMTCwgREVCVUcKKyAgICBURVNUX0FMTCA9IGFyaXRoIG9yIGlzX3Jlc291cmNlX2VuYWJsZWQoJ2RlY2ltYWwnKQorICAgIERFQlVHID0gZGVidWcKKworICAgIGlmIHRvZG9fdGVzdHMgaXMgTm9uZToKKyAgICAgICAgdGVzdF9jbGFzc2VzID0gWworICAgICAgICAgICAgRGVjaW1hbEV4cGxpY2l0Q29uc3RydWN0aW9uVGVzdCwKKyAgICAgICAgICAgIERlY2ltYWxJbXBsaWNpdENvbnN0cnVjdGlvblRlc3QsCisgICAgICAgICAgICBEZWNpbWFsQXJpdGhtZXRpY09wZXJhdG9yc1Rlc3QsCisgICAgICAgICAgICBEZWNpbWFsRm9ybWF0VGVzdCwKKyAgICAgICAgICAgIERlY2ltYWxVc2VPZkNvbnRleHRUZXN0LAorICAgICAgICAgICAgRGVjaW1hbFVzYWJpbGl0eVRlc3QsCisgICAgICAgICAgICBEZWNpbWFsUHl0aG9uQVBJdGVzdHMsCisgICAgICAgICAgICBDb250ZXh0QVBJdGVzdHMsCisgICAgICAgICAgICBEZWNpbWFsVGVzdCwKKyAgICAgICAgICAgIFdpdGhTdGF0ZW1lbnRUZXN0LAorICAgICAgICAgICAgQ29udGV4dEZsYWdzCisgICAgICAgIF0KKyAgICBlbHNlOgorICAgICAgICB0ZXN0X2NsYXNzZXMgPSBbRGVjaW1hbFRlc3RdCisKKyAgICAjIER5bmFtaWNhbGx5IGJ1aWxkIGN1c3RvbSB0ZXN0IGRlZmluaXRpb24gZm9yIGVhY2ggZmlsZSBpbiB0aGUgdGVzdAorICAgICMgZGlyZWN0b3J5IGFuZCBhZGQgdGhlIGRlZmluaXRpb25zIHRvIHRoZSBEZWNpbWFsVGVzdCBjbGFzcy4gIFRoaXMKKyAgICAjIHByb2NlZHVyZSBpbnN1cmVzIHRoYXQgbmV3IGZpbGVzIGRvIG5vdCBnZXQgc2tpcHBlZC4KKyAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihkaXJlY3RvcnkpOgorICAgICAgICBpZiAnLmRlY1Rlc3QnIG5vdCBpbiBmaWxlbmFtZSBvciBmaWxlbmFtZS5zdGFydHN3aXRoKCIuIik6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBoZWFkLCB0YWlsID0gZmlsZW5hbWUuc3BsaXQoJy4nKQorICAgICAgICBpZiB0b2RvX3Rlc3RzIGlzIG5vdCBOb25lIGFuZCBoZWFkIG5vdCBpbiB0b2RvX3Rlc3RzOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgdGVzdGVyID0gbGFtYmRhIHNlbGYsIGY9ZmlsZW5hbWU6IHNlbGYuZXZhbF9maWxlKGRpcmVjdG9yeSArIGYpCisgICAgICAgIHNldGF0dHIoRGVjaW1hbFRlc3QsICd0ZXN0XycgKyBoZWFkLCB0ZXN0ZXIpCisgICAgICAgIGRlbCBmaWxlbmFtZSwgaGVhZCwgdGFpbCwgdGVzdGVyCisKKworICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgIGlmIHRvZG9fdGVzdHMgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCBkZWNpbWFsIGFzIERlY2ltYWxNb2R1bGUKKyAgICAgICAgICAgIHJ1bl9kb2N0ZXN0KERlY2ltYWxNb2R1bGUsIHZlcmJvc2UpCisgICAgZmluYWxseToKKyAgICAgICAgc2V0Y29udGV4dChPUklHSU5BTF9DT05URVhUKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCBvcHRwYXJzZQorICAgIHAgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIoInRlc3RfZGVjaW1hbC5weSBbLS1kZWJ1Z10gW3stLXNraXAgfCB0ZXN0MSBbdGVzdDIgWy4uLl1dfV0iKQorICAgIHAuYWRkX29wdGlvbignLS1kZWJ1ZycsICctZCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGhlbHA9J3Nob3dzIHRoZSB0ZXN0IG51bWJlciBhbmQgY29udGV4dCBiZWZvcmUgZWFjaCB0ZXN0JykKKyAgICBwLmFkZF9vcHRpb24oJy0tc2tpcCcsICAnLXMnLCBhY3Rpb249J3N0b3JlX3RydWUnLCBoZWxwPSdza2lwIG92ZXIgOTAlIG9mIHRoZSBhcml0aG1ldGljIHRlc3RzJykKKyAgICAob3B0LCBhcmdzKSA9IHAucGFyc2VfYXJncygpCisKKyAgICBpZiBvcHQuc2tpcDoKKyAgICAgICAgdGVzdF9tYWluKGFyaXRoPUZhbHNlLCB2ZXJib3NlPVRydWUpCisgICAgZWxpZiBhcmdzOgorICAgICAgICB0ZXN0X21haW4oYXJpdGg9VHJ1ZSwgdmVyYm9zZT1UcnVlLCB0b2RvX3Rlc3RzPWFyZ3MsIGRlYnVnPW9wdC5kZWJ1ZykKKyAgICBlbHNlOgorICAgICAgICB0ZXN0X21haW4oYXJpdGg9VHJ1ZSwgdmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjaW1hbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNpbWFsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmRlZTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjaW1hbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjaW1hbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZWNpbWFsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmRlZTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjaW1hbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY29yYXRvcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyYmMzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY29yYXRvcnMucHkKQEAgLTAsMCArMSwzMDkgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZGVmIGZ1bmNhdHRycygqKmt3ZHMpOgorICAgIGRlZiBkZWNvcmF0ZShmdW5jKToKKyAgICAgICAgZnVuYy5fX2RpY3RfXy51cGRhdGUoa3dkcykKKyAgICAgICAgcmV0dXJuIGZ1bmMKKyAgICByZXR1cm4gZGVjb3JhdGUKKworY2xhc3MgTWlzY0RlY29yYXRvcnMgKG9iamVjdCk6CisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBhdXRob3IobmFtZSk6CisgICAgICAgIGRlZiBkZWNvcmF0ZShmdW5jKToKKyAgICAgICAgICAgIGZ1bmMuX19kaWN0X19bJ2F1dGhvciddID0gbmFtZQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKyAgICAgICAgcmV0dXJuIGRlY29yYXRlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgRGJjaGVja0Vycm9yIChFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHByc3RyLCBmdW5jLCBhcmdzLCBrd2RzKToKKyAgICAgICAgIyBBIHJlYWwgdmVyc2lvbiBvZiB0aGlzIHdvdWxkIHNldCBhdHRyaWJ1dGVzIGhlcmUKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsICJkYmNoZWNrICVyIGZhaWxlZCAoZnVuYz0lcyBhcmdzPSVzIGt3ZHM9JXMpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwcnN0ciwgZnVuYywgYXJncywga3dkcykpCisKKworZGVmIGRiY2hlY2soZXhwcnN0ciwgZ2xvYmFscz1Ob25lLCBsb2NhbHM9Tm9uZSk6CisgICAgIkRlY29yYXRvciB0byBpbXBsZW1lbnQgZGVidWdnaW5nIGFzc2VydGlvbnMiCisgICAgZGVmIGRlY29yYXRlKGZ1bmMpOgorICAgICAgICBleHByID0gY29tcGlsZShleHByc3RyLCAiZGJjaGVjay0lcyIgJSBmdW5jLmZ1bmNfbmFtZSwgImV2YWwiKQorICAgICAgICBkZWYgY2hlY2soKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICBpZiBub3QgZXZhbChleHByLCBnbG9iYWxzLCBsb2NhbHMpOgorICAgICAgICAgICAgICAgIHJhaXNlIERiY2hlY2tFcnJvcihleHByc3RyLCBmdW5jLCBhcmdzLCBrd2RzKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3dkcykKKyAgICAgICAgcmV0dXJuIGNoZWNrCisgICAgcmV0dXJuIGRlY29yYXRlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIGNvdW50Y2FsbHMoY291bnRzKToKKyAgICAiRGVjb3JhdG9yIHRvIGNvdW50IGNhbGxzIHRvIGEgZnVuY3Rpb24iCisgICAgZGVmIGRlY29yYXRlKGZ1bmMpOgorICAgICAgICBmdW5jX25hbWUgPSBmdW5jLmZ1bmNfbmFtZQorICAgICAgICBjb3VudHNbZnVuY19uYW1lXSA9IDAKKyAgICAgICAgZGVmIGNhbGwoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICBjb3VudHNbZnVuY19uYW1lXSArPSAxCisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2RzKQorICAgICAgICBjYWxsLmZ1bmNfbmFtZSA9IGZ1bmNfbmFtZQorICAgICAgICByZXR1cm4gY2FsbAorICAgIHJldHVybiBkZWNvcmF0ZQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBtZW1vaXplKGZ1bmMpOgorICAgIHNhdmVkID0ge30KKyAgICBkZWYgY2FsbCgqYXJncyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzYXZlZFthcmdzXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXMgPSBmdW5jKCphcmdzKQorICAgICAgICAgICAgc2F2ZWRbYXJnc10gPSByZXMKKyAgICAgICAgICAgIHJldHVybiByZXMKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICMgVW5oYXNoYWJsZSBhcmd1bWVudAorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MpCisgICAgY2FsbC5mdW5jX25hbWUgPSBmdW5jLmZ1bmNfbmFtZQorICAgIHJldHVybiBjYWxsCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdERlY29yYXRvcnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2luZ2xlKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgZm9vKCk6IHJldHVybiA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuZm9vKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoKS5mb28oKSwgNDIpCisKKyAgICBkZWYgdGVzdF9zdGF0aWNtZXRob2RfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgZGVmIG5vdGFtZXRob2QoeCk6CisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG5vdGFtZXRob2QsIDEpCisKKyAgICBkZWYgdGVzdF9kb3R0ZWQoc2VsZik6CisgICAgICAgIGRlY29yYXRvcnMgPSBNaXNjRGVjb3JhdG9ycygpCisgICAgICAgIEBkZWNvcmF0b3JzLmF1dGhvcignQ2xlZXNlJykKKyAgICAgICAgZGVmIGZvbygpOiByZXR1cm4gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28oKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLmF1dGhvciwgJ0NsZWVzZScpCisKKyAgICBkZWYgdGVzdF9hcmdmb3JtcyhzZWxmKToKKyAgICAgICAgIyBBIGZldyB0ZXN0cyBvZiBhcmd1bWVudCBwYXNzaW5nLCBhcyB3ZSB1c2UgcmVzdHJpY3RlZCBmb3JtCisgICAgICAgICMgb2YgZXhwcmVzc2lvbnMgZm9yIGRlY29yYXRvcnMuCisKKyAgICAgICAgZGVmIG5vdGVhcmdzKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgZGVmIGRlY29yYXRlKGZ1bmMpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoZnVuYywgJ2RidmFsJywgKGFyZ3MsIGt3ZHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jCisgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGUKKworICAgICAgICBhcmdzID0gKCAnTm93JywgJ2lzJywgJ3RoZScsICd0aW1lJyApCisgICAgICAgIGt3ZHMgPSBkaWN0KG9uZT0xLCB0d289MikKKyAgICAgICAgQG5vdGVhcmdzKCphcmdzLCAqKmt3ZHMpCisgICAgICAgIGRlZiBmMSgpOiByZXR1cm4gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMSgpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMS5kYnZhbCwgKGFyZ3MsIGt3ZHMpKQorCisgICAgICAgIEBub3RlYXJncygndGVycnknLCAnZ2lsbGlhbScsIGVyaWM9J2lkbGUnLCBqb2huPSdjbGVlc2UnKQorICAgICAgICBkZWYgZjIoKTogcmV0dXJuIDg0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIoKSwgODQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjIuZGJ2YWwsICgoJ3RlcnJ5JywgJ2dpbGxpYW0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0KGVyaWM9J2lkbGUnLCBqb2huPSdjbGVlc2UnKSkpCisKKyAgICAgICAgQG5vdGVhcmdzKDEsIDIsKQorICAgICAgICBkZWYgZjMoKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYzLmRidmFsLCAoKDEsIDIpLCB7fSkpCisKKyAgICBkZWYgdGVzdF9kYmNoZWNrKHNlbGYpOgorICAgICAgICBAZGJjaGVjaygnYXJnc1sxXSBpcyBub3QgTm9uZScpCisgICAgICAgIGRlZiBmKGEsIGIpOgorICAgICAgICAgICAgcmV0dXJuIGEgKyBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigxLCAyKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGJjaGVja0Vycm9yLCBmLCAxLCBOb25lKQorCisgICAgZGVmIHRlc3RfbWVtb2l6ZShzZWxmKToKKyAgICAgICAgY291bnRzID0ge30KKworICAgICAgICBAbWVtb2l6ZQorICAgICAgICBAY291bnRjYWxscyhjb3VudHMpCisgICAgICAgIGRlZiBkb3VibGUoeCk6CisgICAgICAgICAgICByZXR1cm4geCAqIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkb3VibGUuZnVuY19uYW1lLCAnZG91YmxlJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50cywgZGljdChkb3VibGU9MCkpCisKKyAgICAgICAgIyBPbmx5IHRoZSBmaXJzdCBjYWxsIHdpdGggYSBnaXZlbiBhcmd1bWVudCBidW1wcyB0aGUgY2FsbCBjb3VudDoKKyAgICAgICAgIworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZSgyKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudHNbJ2RvdWJsZSddLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZSgyKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudHNbJ2RvdWJsZSddLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZSgzKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudHNbJ2RvdWJsZSddLCAyKQorCisgICAgICAgICMgVW5oYXNoYWJsZSBhcmd1bWVudHMgZG8gbm90IGdldCBtZW1vaXplZDoKKyAgICAgICAgIworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZShbMTBdKSwgWzEwLCAxMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRzWydkb3VibGUnXSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkb3VibGUoWzEwXSksIFsxMCwgMTBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50c1snZG91YmxlJ10sIDQpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgICMgVGVzdCBzeW50YXggcmVzdHJpY3Rpb25zIC0gdGhlc2UgYXJlIGFsbCBjb21waWxlLXRpbWUgZXJyb3JzOgorICAgICAgICAjCisgICAgICAgIGZvciBleHByIGluIFsgIjErMiIsICJ4WzNdIiwgIigxLCAyKSIgXToKKyAgICAgICAgICAgICMgU2FuaXR5IGNoZWNrOiBpcyBleHByIGlzIGEgdmFsaWQgZXhwcmVzc2lvbiBieSBpdHNlbGY/CisgICAgICAgICAgICBjb21waWxlKGV4cHIsICJ0ZXN0ZXhwciIsICJleGVjIikKKworICAgICAgICAgICAgY29kZXN0ciA9ICJAJXNcbmRlZiBmKCk6IHBhc3MiICUgZXhwcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIGNvZGVzdHIsICJ0ZXN0IiwgImV4ZWMiKQorCisgICAgICAgICMgWW91IGNhbid0IHB1dCBtdWx0aXBsZSBkZWNvcmF0b3JzIG9uIGEgc2luZ2xlIGxpbmU6CisgICAgICAgICMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJAZjEgQGYyXG5kZWYgZigpOiBwYXNzIiwgInRlc3QiLCAiZXhlYyIpCisKKyAgICAgICAgIyBUZXN0IHJ1bnRpbWUgZXJyb3JzCisKKyAgICAgICAgZGVmIHVuaW1wKGZ1bmMpOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorICAgICAgICBjb250ZXh0ID0gZGljdChudWxsdmFsPU5vbmUsIHVuaW1wPXVuaW1wKQorCisgICAgICAgIGZvciBleHByLCBleGMgaW4gWyAoInVuZGVmIiwgTmFtZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgibnVsbHZhbCIsIFR5cGVFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoIm51bGx2YWwuYXR0ciIsIEF0dHJpYnV0ZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgidW5pbXAiLCBOb3RJbXBsZW1lbnRlZEVycm9yKV06CisgICAgICAgICAgICBjb2Rlc3RyID0gIkAlc1xuZGVmIGYoKTogcGFzc1xuYXNzZXJ0IGYoKSBpcyBOb25lIiAlIGV4cHIKKyAgICAgICAgICAgIGNvZGUgPSBjb21waWxlKGNvZGVzdHIsICJ0ZXN0IiwgImV4ZWMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXhjLCBldmFsLCBjb2RlLCBjb250ZXh0KQorCisgICAgZGVmIHRlc3RfZG91YmxlKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBAZnVuY2F0dHJzKGFiYz0xLCB4eXo9ImhhaGEiKQorICAgICAgICAgICAgQGZ1bmNhdHRycyhib29oPTQyKQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogcmV0dXJuIDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQygpLmZvbygpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmZvby5hYmMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5mb28ueHl6LCAiaGFoYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5mb28uYm9vaCwgNDIpCisKKyAgICBkZWYgdGVzdF9vcmRlcihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgZGVjb3JhdG9ycyBhcmUgYXBwbGllZCBpbiB0aGUgcHJvcGVyIG9yZGVyIHRvIHRoZSBmdW5jdGlvbgorICAgICAgICAjIHRoZXkgYXJlIGRlY29yYXRpbmcuCisgICAgICAgIGRlZiBjYWxsbnVtKG51bSk6CisgICAgICAgICAgICAiIiJEZWNvcmF0b3IgZmFjdG9yeSB0aGF0IHJldHVybnMgYSBkZWNvcmF0b3IgdGhhdCByZXBsYWNlcyB0aGUKKyAgICAgICAgICAgIHBhc3NlZC1pbiBmdW5jdGlvbiB3aXRoIG9uZSB0aGF0IHJldHVybnMgdGhlIHZhbHVlIG9mICdudW0nIiIiCisgICAgICAgICAgICBkZWYgZGVjbyhmdW5jKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGFtYmRhOiBudW0KKyAgICAgICAgICAgIHJldHVybiBkZWNvCisgICAgICAgIEBjYWxsbnVtKDIpCisgICAgICAgIEBjYWxsbnVtKDEpCisgICAgICAgIGRlZiBmb28oKTogcmV0dXJuIDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vKCksIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIG9yZGVyIG9mIGRlY29yYXRvcnMgaXMgaW5jb3JyZWN0IikKKworICAgIGRlZiB0ZXN0X2V2YWxfb3JkZXIoc2VsZik6CisgICAgICAgICMgRXZhbHVhdGluZyBhIGRlY29yYXRlZCBmdW5jdGlvbiBpbnZvbHZlcyBmb3VyIHN0ZXBzIGZvciBlYWNoCisgICAgICAgICMgZGVjb3JhdG9yLW1ha2VyICh0aGUgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgZGVjb3JhdG9yKToKKyAgICAgICAgIworICAgICAgICAjICAgIDE6IEV2YWx1YXRlIHRoZSBkZWNvcmF0b3ItbWFrZXIgbmFtZQorICAgICAgICAjICAgIDI6IEV2YWx1YXRlIHRoZSBkZWNvcmF0b3ItbWFrZXIgYXJndW1lbnRzIChpZiBhbnkpCisgICAgICAgICMgICAgMzogQ2FsbCB0aGUgZGVjb3JhdG9yLW1ha2VyIHRvIG1ha2UgYSBkZWNvcmF0b3IKKyAgICAgICAgIyAgICA0OiBDYWxsIHRoZSBkZWNvcmF0b3IKKyAgICAgICAgIworICAgICAgICAjIFdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGRlY29yYXRvcnMsIHRoZXNlIHN0ZXBzIHNob3VsZCBiZQorICAgICAgICAjIHBlcmZvcm1lZCBpbiB0aGUgYWJvdmUgb3JkZXIgZm9yIGVhY2ggZGVjb3JhdG9yLCBidXQgd2Ugc2hvdWxkCisgICAgICAgICMgaXRlcmF0ZSB0aHJvdWdoIHRoZSBkZWNvcmF0b3JzIGluIHRoZSByZXZlcnNlIG9mIHRoZSBvcmRlciB0aGV5CisgICAgICAgICMgYXBwZWFyIGluIHRoZSBzb3VyY2UuCisKKyAgICAgICAgYWN0aW9ucyA9IFtdCisKKyAgICAgICAgZGVmIG1ha2VfZGVjb3JhdG9yKHRhZyk6CisgICAgICAgICAgICBhY3Rpb25zLmFwcGVuZCgnbWFrZWRlYycgKyB0YWcpCisgICAgICAgICAgICBkZWYgZGVjb3JhdGUoZnVuYyk6CisgICAgICAgICAgICAgICAgYWN0aW9ucy5hcHBlbmQoJ2NhbGxkZWMnICsgdGFnKQorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jCisgICAgICAgICAgICByZXR1cm4gZGVjb3JhdGUKKworICAgICAgICBjbGFzcyBOYW1lTG9va3VwVHJhY2VyIChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgICAgICAgICBzZWxmLmluZGV4ID0gaW5kZXgKKworICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGZuYW1lKToKKyAgICAgICAgICAgICAgICBpZiBmbmFtZSA9PSAnbWFrZV9kZWNvcmF0b3InOgorICAgICAgICAgICAgICAgICAgICBvcG5hbWUsIHJlcyA9ICgnZXZhbG5hbWUnLCBtYWtlX2RlY29yYXRvcikKKyAgICAgICAgICAgICAgICBlbGlmIGZuYW1lID09ICdhcmcnOgorICAgICAgICAgICAgICAgICAgICBvcG5hbWUsIHJlcyA9ICgnZXZhbGFyZ3MnLCBzdHIoc2VsZi5pbmRleCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAiVW5rbm93biBhdHRybmFtZSAlcyIgJSBmbmFtZQorICAgICAgICAgICAgICAgIGFjdGlvbnMuYXBwZW5kKCclcyVkJyAlIChvcG5hbWUsIHNlbGYuaW5kZXgpKQorICAgICAgICAgICAgICAgIHJldHVybiByZXMKKworICAgICAgICBjMSwgYzIsIGMzID0gbWFwKE5hbWVMb29rdXBUcmFjZXIsIFsgMSwgMiwgMyBdKQorCisgICAgICAgIGV4cGVjdGVkX2FjdGlvbnMgPSBbICdldmFsbmFtZTEnLCAnZXZhbGFyZ3MxJywgJ21ha2VkZWMxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V2YWxuYW1lMicsICdldmFsYXJnczInLCAnbWFrZWRlYzInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXZhbG5hbWUzJywgJ2V2YWxhcmdzMycsICdtYWtlZGVjMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWxsZGVjMycsICdjYWxsZGVjMicsICdjYWxsZGVjMScgXQorCisgICAgICAgIGFjdGlvbnMgPSBbXQorICAgICAgICBAYzEubWFrZV9kZWNvcmF0b3IoYzEuYXJnKQorICAgICAgICBAYzIubWFrZV9kZWNvcmF0b3IoYzIuYXJnKQorICAgICAgICBAYzMubWFrZV9kZWNvcmF0b3IoYzMuYXJnKQorICAgICAgICBkZWYgZm9vKCk6IHJldHVybiA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvbygpLCA0MikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdGlvbnMsIGV4cGVjdGVkX2FjdGlvbnMpCisKKyAgICAgICAgIyBUZXN0IHRoZSBlcXVpdmFsZW5jZSBjbGFpbSBpbiBjaGFwdGVyIDcgb2YgdGhlIHJlZmVyZW5jZSBtYW51YWwuCisgICAgICAgICMKKyAgICAgICAgYWN0aW9ucyA9IFtdCisgICAgICAgIGRlZiBiYXIoKTogcmV0dXJuIDQyCisgICAgICAgIGJhciA9IGMxLm1ha2VfZGVjb3JhdG9yKGMxLmFyZykoYzIubWFrZV9kZWNvcmF0b3IoYzIuYXJnKShjMy5tYWtlX2RlY29yYXRvcihjMy5hcmcpKGJhcikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhcigpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3Rpb25zLCBleHBlY3RlZF9hY3Rpb25zKQorCitjbGFzcyBUZXN0Q2xhc3NEZWNvcmF0b3JzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgZGVmIHBsYWluKHgpOgorICAgICAgICAgICAgeC5leHRyYSA9ICdIZWxsbycKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIEBwbGFpbgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmV4dHJhLCAnSGVsbG8nKQorCisgICAgZGVmIHRlc3RfZG91YmxlKHNlbGYpOgorICAgICAgICBkZWYgdGVuKHgpOgorICAgICAgICAgICAgeC5leHRyYSA9IDEwCisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBkZWYgYWRkX2ZpdmUoeCk6CisgICAgICAgICAgICB4LmV4dHJhICs9IDUKKyAgICAgICAgICAgIHJldHVybiB4CisKKyAgICAgICAgQGFkZF9maXZlCisgICAgICAgIEB0ZW4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5leHRyYSwgMTUpCisKKyAgICBkZWYgdGVzdF9vcmRlcihzZWxmKToKKyAgICAgICAgZGVmIGFwcGxpZWRfZmlyc3QoeCk6CisgICAgICAgICAgICB4LmV4dHJhID0gJ2ZpcnN0JworICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgZGVmIGFwcGxpZWRfc2Vjb25kKHgpOgorICAgICAgICAgICAgeC5leHRyYSA9ICdzZWNvbmQnCisgICAgICAgICAgICByZXR1cm4geAorICAgICAgICBAYXBwbGllZF9zZWNvbmQKKyAgICAgICAgQGFwcGxpZWRfZmlyc3QKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5leHRyYSwgJ3NlY29uZCcpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3REZWNvcmF0b3JzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdENsYXNzRGVjb3JhdG9ycykKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY29yYXRvcnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyM2NlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY29yYXRvcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY29yYXRvcnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVjb3JhdG9ycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYyZjQ3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlY29yYXRvcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q3NjBiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5CkBAIC0wLDAgKzEsMTgxIEBACisiIiJVbml0IHRlc3RzIGZvciBjb2xsZWN0aW9ucy5kZWZhdWx0ZGljdC4iIiIKKworaW1wb3J0IG9zCitpbXBvcnQgY29weQoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CisKK2RlZiBmb29iYXIoKToKKyAgICByZXR1cm4gbGlzdAorCitjbGFzcyBUZXN0RGVmYXVsdERpY3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIGQxID0gZGVmYXVsdGRpY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLmRlZmF1bHRfZmFjdG9yeSwgTm9uZSkKKyAgICAgICAgZDEuZGVmYXVsdF9mYWN0b3J5ID0gbGlzdAorICAgICAgICBkMVsxMl0uYXBwZW5kKDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCB7MTI6IFs0Ml19KQorICAgICAgICBkMVsxMl0uYXBwZW5kKDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCB7MTI6IFs0MiwgMjRdfSkKKyAgICAgICAgZDFbMTNdCisgICAgICAgIGQxWzE0XQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCB7MTI6IFs0MiwgMjRdLCAxMzogW10sIDE0OiBbXX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMVsxMl0gaXMgbm90IGQxWzEzXSBpcyBub3QgZDFbMTRdKQorICAgICAgICBkMiA9IGRlZmF1bHRkaWN0KGxpc3QsIGZvbz0xLCBiYXI9MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIHsiZm9vIjogMSwgImJhciI6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyWyJmb28iXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMlsiYmFyIl0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDJbNDJdLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vIiwgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZvbyIsIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiYmFyIiwgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImJhciIsIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbig0MiwgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oNDIsIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigxMiwgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMTIsIGQyLmtleXMoKSkKKyAgICAgICAgZDIuZGVmYXVsdF9mYWN0b3J5ID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZDJbMTVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJncywgKDE1LCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImQyWzE1XSBkaWRuJ3QgcmFpc2UgS2V5RXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlZmF1bHRkaWN0LCAxKQorCisgICAgZGVmIHRlc3RfbWlzc2luZyhzZWxmKToKKyAgICAgICAgZDEgPSBkZWZhdWx0ZGljdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkMS5fX21pc3NpbmdfXywgNDIpCisgICAgICAgIGQxLmRlZmF1bHRfZmFjdG9yeSA9IGxpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS5fX21pc3NpbmdfXyg0MiksIFtdKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgZDEgPSBkZWZhdWx0ZGljdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEuZGVmYXVsdF9mYWN0b3J5LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZDEpLCAiZGVmYXVsdGRpY3QoTm9uZSwge30pIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKHJlcHIoZDEpKSwgZDEpCisgICAgICAgIGQxWzExXSA9IDQxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkMSksICJkZWZhdWx0ZGljdChOb25lLCB7MTE6IDQxfSkiKQorICAgICAgICBkMiA9IGRlZmF1bHRkaWN0KGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIGludCkKKyAgICAgICAgZDJbMTJdID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQyKSwgImRlZmF1bHRkaWN0KDx0eXBlICdpbnQnPiwgezEyOiA0Mn0pIikKKyAgICAgICAgZGVmIGZvbygpOiByZXR1cm4gNDMKKyAgICAgICAgZDMgPSBkZWZhdWx0ZGljdChmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMy5kZWZhdWx0X2ZhY3RvcnkgaXMgZm9vKQorICAgICAgICBkM1sxM10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQzKSwgImRlZmF1bHRkaWN0KCVzLCB7MTM6IDQzfSkiICUgcmVwcihmb28pKQorCisgICAgZGVmIHRlc3RfcHJpbnQoc2VsZik6CisgICAgICAgIGQxID0gZGVmYXVsdGRpY3QoKQorICAgICAgICBkZWYgZm9vKCk6IHJldHVybiA0MgorICAgICAgICBkMiA9IGRlZmF1bHRkaWN0KGZvbywgezE6IDJ9KQorICAgICAgICAjIE5PVEU6IFdlIGNhbid0IHVzZSB0ZW1wZmlsZS5bTmFtZWRdVGVtcG9yYXJ5RmlsZSBzaW5jZSB0aGlzCisgICAgICAgICMgY29kZSBtdXN0IGV4ZXJjaXNlIHRoZSB0cF9wcmludCBDIGNvZGUsIHdoaWNoIG9ubHkgZ2V0cworICAgICAgICAjIGludm9rZWQgZm9yICpyZWFsKiBmaWxlcy4KKyAgICAgICAgdGZuID0gdGVtcGZpbGUubWt0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4odGZuLCAidysiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByaW50ID4+ZiwgZDEKKyAgICAgICAgICAgICAgICBwcmludCA+PmYsIGQyCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksIHJlcHIoZDEpICsgIlxuIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgcmVwcihkMikgKyAiXG4iKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0Zm4pCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBkMSA9IGRlZmF1bHRkaWN0KCkKKyAgICAgICAgZDIgPSBkMS5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQyKSwgZGVmYXVsdGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuZGVmYXVsdF9mYWN0b3J5LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCB7fSkKKyAgICAgICAgZDEuZGVmYXVsdF9mYWN0b3J5ID0gbGlzdAorICAgICAgICBkMyA9IGQxLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZDMpLCBkZWZhdWx0ZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMy5kZWZhdWx0X2ZhY3RvcnksIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDMsIHt9KQorICAgICAgICBkMVs0Ml0KKyAgICAgICAgZDQgPSBkMS5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQ0KSwgZGVmYXVsdGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDQuZGVmYXVsdF9mYWN0b3J5LCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQ0LCB7NDI6IFtdfSkKKyAgICAgICAgZDRbMTJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDQsIHs0MjogW10sIDEyOiBbXX0pCisKKyAgICAgICAgIyBJc3N1ZSA2NjM3OiBDb3B5IGZhaWxzIGZvciBlbXB0eSBkZWZhdWx0IGRpY3QKKyAgICAgICAgZCA9IGRlZmF1bHRkaWN0KCkKKyAgICAgICAgZFsnYSddID0gNDIKKyAgICAgICAgZSA9IGQuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVsnYSddLCA0MikKKworICAgIGRlZiB0ZXN0X3NoYWxsb3dfY29weShzZWxmKToKKyAgICAgICAgZDEgPSBkZWZhdWx0ZGljdChmb29iYXIsIHsxOiAxfSkKKyAgICAgICAgZDIgPSBjb3B5LmNvcHkoZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuZGVmYXVsdF9mYWN0b3J5LCBmb29iYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGQxKQorICAgICAgICBkMS5kZWZhdWx0X2ZhY3RvcnkgPSBsaXN0CisgICAgICAgIGQyID0gY29weS5jb3B5KGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZDEpCisKKyAgICBkZWYgdGVzdF9kZWVwX2NvcHkoc2VsZik6CisgICAgICAgIGQxID0gZGVmYXVsdGRpY3QoZm9vYmFyLCB7MTogWzFdfSkKKyAgICAgICAgZDIgPSBjb3B5LmRlZXBjb3B5KGQxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgZm9vYmFyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxWzFdIGlzIG5vdCBkMlsxXSkKKyAgICAgICAgZDEuZGVmYXVsdF9mYWN0b3J5ID0gbGlzdAorICAgICAgICBkMiA9IGNvcHkuZGVlcGNvcHkoZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIuZGVmYXVsdF9mYWN0b3J5LCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCBkMSkKKworICAgIGRlZiB0ZXN0X2tleWVycm9yX3dpdGhvdXRfZmFjdG9yeShzZWxmKToKKyAgICAgICAgZDEgPSBkZWZhdWx0ZGljdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGQxWygxLCldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJnc1swXSwgKDEsKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgS2V5RXJyb3IiKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaXZlX3JlcHIoc2VsZik6CisgICAgICAgICMgSXNzdWUyMDQ1OiBzdGFjayBvdmVyZmxvdyB3aGVuIGRlZmF1bHRfZmFjdG9yeSBpcyBhIGJvdW5kIG1ldGhvZAorICAgICAgICBjbGFzcyBzdWIoZGVmYXVsdGRpY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9mYWN0b3J5ID0gc2VsZi5fZmFjdG9yeQorICAgICAgICAgICAgZGVmIF9mYWN0b3J5KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBkID0gc3ViKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZCkuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICJkZWZhdWx0ZGljdCg8Ym91bmQgbWV0aG9kIHN1Yi5fZmFjdG9yeSBvZiBkZWZhdWx0ZGljdCguLi4iKSkKKworICAgICAgICAjIE5PVEU6IHByaW50aW5nIGEgc3ViY2xhc3Mgb2YgYSBidWlsdGluIHR5cGUgZG9lcyBub3QgY2FsbCBpdHMKKyAgICAgICAgIyB0cF9wcmludCBzbG90LiBTbyB0aGlzIHBhcnQgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgdGVzdCBhcyBhYm92ZS4KKyAgICAgICAgdGZuID0gdGVtcGZpbGUubWt0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IG9wZW4odGZuLCAidysiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHByaW50ID4+ZiwgZAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJlbW92ZSh0Zm4pCisKKyAgICBkZWYgdGVzdF9jYWxsYWJsZV9hcmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVmYXVsdGRpY3QsIHt9KQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0RGVmYXVsdERpY3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIxNGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIxNGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlcXVlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1YTBjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlcXVlLnB5CkBAIC0wLDAgKzEsODAzIEBACitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgc2VxX3Rlc3RzCitpbXBvcnQgZ2MKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgY29weQoraW1wb3J0IGNQaWNrbGUgYXMgcGlja2xlCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgc3RydWN0CisKK0JJRyA9IDEwMDAwMAorCitkZWYgZmFpbCgpOgorICAgIHJhaXNlIFN5bnRheEVycm9yCisgICAgeWllbGQgMQorCitjbGFzcyBCYWRDbXA6CisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCitjbGFzcyBNdXRhdGVDbXA6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlcXVlLCByZXN1bHQpOgorICAgICAgICBzZWxmLmRlcXVlID0gZGVxdWUKKyAgICAgICAgc2VsZi5yZXN1bHQgPSByZXN1bHQKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgc2VsZi5kZXF1ZS5jbGVhcigpCisgICAgICAgIHJldHVybiBzZWxmLnJlc3VsdAorCitjbGFzcyBUZXN0QmFzaWModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKC01MTI1LCAtNTAwMCkpCisgICAgICAgIGQuX19pbml0X18oeHJhbmdlKDIwMCkpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgyMDAsIDQwMCk6CisgICAgICAgICAgICBkLmFwcGVuZChpKQorICAgICAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2UoLTIwMCwgMCkpOgorICAgICAgICAgICAgZC5hcHBlbmRsZWZ0KGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoLTIwMCwgNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDYwMCkKKworICAgICAgICBsZWZ0ID0gW2QucG9wbGVmdCgpIGZvciBpIGluIHhyYW5nZSgyNTApXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlZnQsIHJhbmdlKC0yMDAsIDUwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCByYW5nZSg1MCwgNDAwKSkKKworICAgICAgICByaWdodCA9IFtkLnBvcCgpIGZvciBpIGluIHhyYW5nZSgyNTApXQorICAgICAgICByaWdodC5yZXZlcnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyaWdodCwgcmFuZ2UoMTUwLCA0MDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKDUwLCAxNTApKQorCisgICAgZGVmIHRlc3RfbWF4bGVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkZXF1ZSwgJ2FiYycsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkZXF1ZSwgJ2FiYycsIC0yKQorICAgICAgICBpdCA9IGl0ZXIocmFuZ2UoMTApKQorICAgICAgICBkID0gZGVxdWUoaXQsIG1heGxlbj0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXQpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQpLCAnZGVxdWUoWzcsIDgsIDldLCBtYXhsZW49MyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKDcsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkZXF1ZShyYW5nZSgxMCksIDMpKQorICAgICAgICBkLmFwcGVuZCgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCByYW5nZSg4LCAxMSkpCisgICAgICAgIGQuYXBwZW5kbGVmdCg3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKDcsIDEwKSkKKyAgICAgICAgZC5leHRlbmQoWzEwLCAxMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoOSwgMTIpKQorICAgICAgICBkLmV4dGVuZGxlZnQoWzgsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKDcsIDEwKSkKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZSgyMDApLCBtYXhsZW49MTApCisgICAgICAgIGQuYXBwZW5kKGQpCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50ID4+IGZvLCBkLAorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnJlYWQoKSwgcmVwcihkKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgICAgICBkID0gZGVxdWUocmFuZ2UoMTApLCBtYXhsZW49Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQpLCAnZGVxdWUoWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldKScpCisgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCA+PiBmbywgZCwKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby5yZWFkKCksIHJlcHIoZCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9tYXhsZW5femVybyhzZWxmKToKKyAgICAgICAgaXQgPSBpdGVyKHJhbmdlKDEwMCkpCisgICAgICAgIGRlcXVlKGl0LCBtYXhsZW49MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgW10pCisKKyAgICAgICAgaXQgPSBpdGVyKHJhbmdlKDEwMCkpCisgICAgICAgIGQgPSBkZXF1ZShtYXhsZW49MCkKKyAgICAgICAgZC5leHRlbmQoaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdCksIFtdKQorCisgICAgICAgIGl0ID0gaXRlcihyYW5nZSgxMDApKQorICAgICAgICBkID0gZGVxdWUobWF4bGVuPTApCisgICAgICAgIGQuZXh0ZW5kbGVmdChpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgW10pCisKKyAgICBkZWYgdGVzdF9tYXhsZW5fYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcXVlKCkubWF4bGVuLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcXVlKCdhYmMnKS5tYXhsZW4sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVxdWUoJ2FiYycsIG1heGxlbj00KS5tYXhsZW4sIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVxdWUoJ2FiYycsIG1heGxlbj0yKS5tYXhsZW4sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVxdWUoJ2FiYycsIG1heGxlbj0wKS5tYXhsZW4sIDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgZCA9IGRlcXVlKCdhYmMnKQorICAgICAgICAgICAgZC5tYXhsZW4gPSAxMAorCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIGZvciBzIGluICgnJywgJ2FicmFjYWRhYnJhJywgJ3NpbXNhbGFiaW0nKjUwMCsnYWJjJyk6CisgICAgICAgICAgICBzID0gbGlzdChzKQorICAgICAgICAgICAgZCA9IGRlcXVlKHMpCisgICAgICAgICAgICBmb3IgbGV0dGVyIGluICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eic6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KGxldHRlciksIGQuY291bnQobGV0dGVyKSwgKHMsIGQsIGxldHRlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5jb3VudCkgICAgICAgIyB0b28gZmV3IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmNvdW50LCAxLCAyKSAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgY2xhc3MgQmFkQ29tcGFyZToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIEFyaXRobWV0aWNFcnJvcgorICAgICAgICBkID0gZGVxdWUoWzEsIDIsIEJhZENvbXBhcmUoKSwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyaXRobWV0aWNFcnJvciwgZC5jb3VudCwgMikKKyAgICAgICAgZCA9IGRlcXVlKFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJpdGhtZXRpY0Vycm9yLCBkLmNvdW50LCBCYWRDb21wYXJlKCkpCisgICAgICAgIGNsYXNzIE11dGF0aW5nQ29tcGFyZToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuZC5wb3AoKQorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIG0gPSBNdXRhdGluZ0NvbXBhcmUoKQorICAgICAgICBkID0gZGVxdWUoWzEsIDIsIDMsIG0sIDQsIDVdKQorICAgICAgICBtLmQgPSBkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZC5jb3VudCwgMykKKworICAgICAgICAjIHRlc3QgaXNzdWUxMTAwNAorICAgICAgICAjIGJsb2NrIGFkdmFuY2UgZmFpbGVkIGFmdGVyIHJvdGF0aW9uIGFsaWduZWQgZWxlbWVudHMgb24gcmlnaHQgc2lkZSBvZiBibG9jaworICAgICAgICBkID0gZGVxdWUoW05vbmVdKjE2KQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZCkpOgorICAgICAgICAgICAgZC5yb3RhdGUoLTEpCisgICAgICAgIGQucm90YXRlKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3VudCgxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmNvdW50KE5vbmUpLCAxNikKKworICAgIGRlZiB0ZXN0X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoJ3hhYmMnKTsgZC5wb3BsZWZ0KCkKKyAgICAgICAgZm9yIGUgaW4gW2QsIGRlcXVlKCdhYmMnKSwgZGVxdWUoJ2FiJyksIGRlcXVlKCksIGxpc3QoZCldOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkPT1lLCB0eXBlKGQpPT10eXBlKGUpIGFuZCBsaXN0KGQpPT1saXN0KGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkIT1lLCBub3QodHlwZShkKT09dHlwZShlKSBhbmQgbGlzdChkKT09bGlzdChlKSkpCisKKyAgICAgICAgYXJncyA9IG1hcChkZXF1ZSwgKCcnLCAnYScsICdiJywgJ2FiJywgJ2JhJywgJ2FiYycsICd4YmEnLCAneGFiYycsICdjYmEnKSkKKyAgICAgICAgZm9yIHggaW4gYXJnczoKKyAgICAgICAgICAgIGZvciB5IGluIGFyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4ID09IHksIGxpc3QoeCkgPT0gbGlzdCh5KSwgKHgseSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4ICE9IHksIGxpc3QoeCkgIT0gbGlzdCh5KSwgKHgseSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4IDwgIHksIGxpc3QoeCkgPCAgbGlzdCh5KSwgKHgseSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4IDw9IHksIGxpc3QoeCkgPD0gbGlzdCh5KSwgKHgseSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4ID4gIHksIGxpc3QoeCkgPiAgbGlzdCh5KSwgKHgseSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4ID49IHksIGxpc3QoeCkgPj0gbGlzdCh5KSwgKHgseSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoeCx5KSwgY21wKGxpc3QoeCksbGlzdCh5KSksICh4LHkpKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuZXh0ZW5kLCAxKQorICAgICAgICBkLmV4dGVuZCgnYmNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KCdhYmNkJykpCisgICAgICAgIGQuZXh0ZW5kKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdCgnYWJjZGFiY2QnKSkKKworICAgIGRlZiB0ZXN0X2lhZGQoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgnYScpCisgICAgICAgIGQgKz0gJ2JjZCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KCdhYmNkJykpCisgICAgICAgIGQgKz0gZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoJ2FiY2RhYmNkJykpCisKKyAgICBkZWYgdGVzdF9leHRlbmRsZWZ0KHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuZXh0ZW5kbGVmdCwgMSkKKyAgICAgICAgZC5leHRlbmRsZWZ0KCdiY2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QocmV2ZXJzZWQoJ2FiY2QnKSkpCisgICAgICAgIGQuZXh0ZW5kbGVmdChkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoJ2FiY2RkY2JhJykpCisgICAgICAgIGQgPSBkZXF1ZSgpCisgICAgICAgIGQuZXh0ZW5kbGVmdChyYW5nZSgxMDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KHJldmVyc2VkKHJhbmdlKDEwMDApKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBkLmV4dGVuZGxlZnQsIGZhaWwoKSkKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIG4gPSAyMDAKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZShuKSkKKyAgICAgICAgbCA9IHJhbmdlKG4pCisgICAgICAgIGZvciBpIGluIHhyYW5nZShuKToKKyAgICAgICAgICAgIGQucG9wbGVmdCgpCisgICAgICAgICAgICBsLnBvcCgwKQorICAgICAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgorICAgICAgICAgICAgICAgIGQuYXBwZW5kKGkpCisgICAgICAgICAgICAgICAgbC5hcHBlbmQoaSkKKyAgICAgICAgICAgIGZvciBqIGluIHhyYW5nZSgxLWxlbihsKSwgbGVuKGwpKToKKyAgICAgICAgICAgICAgICBhc3NlcnQgZFtqXSA9PSBsW2pdCisKKyAgICAgICAgZCA9IGRlcXVlKCdzdXBlcm1hbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFswXSwgJ3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbLTFdLCAnbicpCisgICAgICAgIGQgPSBkZXF1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGQuX19nZXRpdGVtX18sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGQuX19nZXRpdGVtX18sIC0xKQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKKyAgICAgICAgbiA9IDIwMAorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKG4pKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uobik6CisgICAgICAgICAgICBkW2ldID0gMTAgKiBpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgWzEwKmkgZm9yIGkgaW4geHJhbmdlKG4pXSkKKyAgICAgICAgbCA9IGxpc3QoZCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEtbiwgMCwgLTEpOgorICAgICAgICAgICAgZFtpXSA9IDcqaQorICAgICAgICAgICAgbFtpXSA9IDcqaQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGwpCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICBuID0gNTAwICAgICAgICAgIyBPKG4qKjIpIHRlc3QsIGRvbid0IG1ha2UgdGhpcyB0b28gYmlnCisgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2UobikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGQuX19kZWxpdGVtX18sIC1uLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGQuX19kZWxpdGVtX18sIG4pCisgICAgICAgIGZvciBpIGluIHhyYW5nZShuKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBuLWkpCisgICAgICAgICAgICBqID0gcmFuZG9tLnJhbmRyYW5nZSgtbGVuKGQpLCBsZW4oZCkpCisgICAgICAgICAgICB2YWwgPSBkW2pdCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHZhbCwgZCkKKyAgICAgICAgICAgIGRlbCBkW2pdCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKHZhbCwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisKKyAgICBkZWYgdGVzdF9yZXZlcnNlKHNlbGYpOgorICAgICAgICBuID0gNTAwICAgICAgICAgIyBPKG4qKjIpIHRlc3QsIGRvbid0IG1ha2UgdGhpcyB0b28gYmlnCisgICAgICAgIGRhdGEgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBpIGluIHJhbmdlKG4pXQorICAgICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAgICAgICAgIGQgPSBkZXF1ZShkYXRhWzppXSkKKyAgICAgICAgICAgIHIgPSBkLnJldmVyc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KHJldmVyc2VkKGRhdGFbOmldKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHIsIE5vbmUpCisgICAgICAgICAgICBkLnJldmVyc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBkYXRhWzppXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLnJldmVyc2UsIDEpICAgICAgICAgICMgQXJpdHkgaXMgemVybworCisgICAgZGVmIHRlc3Rfcm90YXRlKHNlbGYpOgorICAgICAgICBzID0gdHVwbGUoJ2FiY2RlJykKKyAgICAgICAgbiA9IGxlbihzKQorCisgICAgICAgIGQgPSBkZXF1ZShzKQorICAgICAgICBkLnJvdGF0ZSgxKSAgICAgICAgICAgICAjIHZlcmlmeSByb3QoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5qb2luKGQpLCAnZWFiY2QnKQorCisgICAgICAgIGQgPSBkZXF1ZShzKQorICAgICAgICBkLnJvdGF0ZSgtMSkgICAgICAgICAgICAjIHZlcmlmeSByb3QoLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihkKSwgJ2JjZGVhJykKKyAgICAgICAgZC5yb3RhdGUoKSAgICAgICAgICAgICAgIyBjaGVjayBkZWZhdWx0IHRvIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShkKSwgcykKKworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobiozKToKKyAgICAgICAgICAgIGQgPSBkZXF1ZShzKQorICAgICAgICAgICAgZSA9IGRlcXVlKGQpCisgICAgICAgICAgICBkLnJvdGF0ZShpKSAgICAgICAgICMgY2hlY2sgdnMuIHJvdCgxKSBuIHRpbWVzCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoaSk6CisgICAgICAgICAgICAgICAgZS5yb3RhdGUoMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoZCksIHR1cGxlKGUpKQorICAgICAgICAgICAgZC5yb3RhdGUoLWkpICAgICAgICAjIGNoZWNrIHRoYXQgaXQgd29ya3MgaW4gcmV2ZXJzZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShkKSwgcykKKyAgICAgICAgICAgIGUucm90YXRlKG4taSkgICAgICAgIyBjaGVjayB0aGF0IGl0IHdyYXBzIGZvcndhcmQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoZSksIHMpCisKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKG4qMyk6CisgICAgICAgICAgICBkID0gZGVxdWUocykKKyAgICAgICAgICAgIGUgPSBkZXF1ZShkKQorICAgICAgICAgICAgZC5yb3RhdGUoLWkpCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoaSk6CisgICAgICAgICAgICAgICAgZS5yb3RhdGUoLTEpICAgICMgY2hlY2sgdnMuIHJvdCgtMSkgbiB0aW1lcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShkKSwgdHVwbGUoZSkpCisgICAgICAgICAgICBkLnJvdGF0ZShpKSAgICAgICAgICMgY2hlY2sgdGhhdCBpdCB3b3JrcyBpbiByZXZlcnNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGQpLCBzKQorICAgICAgICAgICAgZS5yb3RhdGUoaS1uKSAgICAgICAjIGNoZWNrIHRoYXQgaXQgd3JhcHMgYmFja2Fyb3VuZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShlKSwgcykKKworICAgICAgICBkID0gZGVxdWUocykKKyAgICAgICAgZSA9IGRlcXVlKHMpCisgICAgICAgIGUucm90YXRlKEJJRysxNykgICAgICAgICMgdmVyaWZ5IG9uIGxvbmcgc2VyaWVzIG9mIHJvdGF0ZXMKKyAgICAgICAgZHIgPSBkLnJvdGF0ZQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoQklHKzE3KToKKyAgICAgICAgICAgIGRyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShkKSwgdHVwbGUoZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLnJvdGF0ZSwgJ3gnKSAgICMgV3JvbmcgYXJnIHR5cGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLnJvdGF0ZSwgMSwgMTApICMgVG9vIG1hbnkgYXJncworCisgICAgICAgIGQgPSBkZXF1ZSgpCisgICAgICAgIGQucm90YXRlKCkgICAgICAgICAgICAgICMgcm90YXRlIGFuIGVtcHR5IGRlcXVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGVxdWUoKSkKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAyKQorICAgICAgICBkLnBvcGxlZnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMSkKKyAgICAgICAgZC5wb3AoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZC5wb3ApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorICAgICAgICBkLmFwcGVuZCgnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQorICAgICAgICBkLmFwcGVuZGxlZnQoJ2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMikKKyAgICAgICAgZC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorCisgICAgZGVmIHRlc3RfdW5kZXJmbG93KHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBkLnBvcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZC5wb3BsZWZ0KQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2UoMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDEwMCkKKyAgICAgICAgZC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIFtdKQorICAgICAgICBkLmNsZWFyKCkgICAgICAgICAgICAgICAjIGNsZWFyIGFuIGVtdHB5IGRlcXVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgW10pCisKKyAgICBkZWYgdGVzdF9yZW1vdmUoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgnYWJjZGVmZ2hjaWonKQorICAgICAgICBkLnJlbW92ZSgnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGVxdWUoJ2FiZGVmZ2hjaWonKSkKKyAgICAgICAgZC5yZW1vdmUoJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRlcXVlKCdhYmRlZmdoaWonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZC5yZW1vdmUsICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkZXF1ZSgnYWJkZWZnaGlqJykpCisKKyAgICAgICAgIyBIYW5kbGUgY29tcGFyaXNvbiBlcnJvcnMKKyAgICAgICAgZCA9IGRlcXVlKFsnYScsICdiJywgQmFkQ21wKCksICdjJ10pCisgICAgICAgIGUgPSBkZXF1ZShkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGQucmVtb3ZlLCAnYycpCisgICAgICAgIGZvciB4LCB5IGluIHppcChkLCBlKToKKyAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgb3JpZ2luYWwgb3JkZXIgYW5kIHZhbHVlcyBhcmUgcmV0YWluZWQuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyB5KQorCisgICAgICAgICMgSGFuZGxlIGV2aWwgbXV0YXRvcgorICAgICAgICBmb3IgbWF0Y2ggaW4gKFRydWUsIEZhbHNlKToKKyAgICAgICAgICAgIGQgPSBkZXF1ZShbJ2FiJ10pCisgICAgICAgICAgICBkLmV4dGVuZChbTXV0YXRlQ21wKGQsIG1hdGNoKSwgJ2MnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGQucmVtb3ZlLCAnYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRlcXVlKCkpCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKDIwMCkpCisgICAgICAgIGUgPSBldmFsKHJlcHIoZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKyAgICAgICAgZC5hcHBlbmQoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignLi4uJywgcmVwcihkKSkKKworICAgIGRlZiB0ZXN0X3ByaW50KHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoeHJhbmdlKDIwMCkpCisgICAgICAgIGQuYXBwZW5kKGQpCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50ID4+IGZvLCBkLAorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgZm8gPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnJlYWQoKSwgcmVwcihkKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGVxdWUsICdhYmMnLCAyLCAzKTsKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZXF1ZSwgMSk7CisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGRlcXVlKCdhYmMnKSkKKworICAgIGRlZiB0ZXN0X2xvbmdfc3RlYWR5c3RhdGVfcXVldWVfcG9wbGVmdChzZWxmKToKKyAgICAgICAgZm9yIHNpemUgaW4gKDAsIDEsIDIsIDEwMCwgMTAwMCk6CisgICAgICAgICAgICBkID0gZGVxdWUoeHJhbmdlKHNpemUpKQorICAgICAgICAgICAgYXBwZW5kLCBwb3AgPSBkLmFwcGVuZCwgZC5wb3BsZWZ0CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSwgQklHKToKKyAgICAgICAgICAgICAgICBhcHBlbmQoaSkKKyAgICAgICAgICAgICAgICB4ID0gcG9wKCkKKyAgICAgICAgICAgICAgICBpZiB4ICE9IGkgLSBzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGktc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoQklHLXNpemUsIEJJRykpCisKKyAgICBkZWYgdGVzdF9sb25nX3N0ZWFkeXN0YXRlX3F1ZXVlX3BvcHJpZ2h0KHNlbGYpOgorICAgICAgICBmb3Igc2l6ZSBpbiAoMCwgMSwgMiwgMTAwLCAxMDAwKToKKyAgICAgICAgICAgIGQgPSBkZXF1ZShyZXZlcnNlZCh4cmFuZ2Uoc2l6ZSkpKQorICAgICAgICAgICAgYXBwZW5kLCBwb3AgPSBkLmFwcGVuZGxlZnQsIGQucG9wCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2l6ZSwgQklHKToKKyAgICAgICAgICAgICAgICBhcHBlbmQoaSkKKyAgICAgICAgICAgICAgICB4ID0gcG9wKCkKKyAgICAgICAgICAgICAgICBpZiB4ICE9IGkgLSBzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGktc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXZlcnNlZChsaXN0KGQpKSksIHJhbmdlKEJJRy1zaXplLCBCSUcpKQorCisgICAgZGVmIHRlc3RfYmlnX3F1ZXVlX3BvcGxlZnQoc2VsZik6CisgICAgICAgIHBhc3MKKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgYXBwZW5kLCBwb3AgPSBkLmFwcGVuZCwgZC5wb3BsZWZ0CisgICAgICAgIGZvciBpIGluIHhyYW5nZShCSUcpOgorICAgICAgICAgICAgYXBwZW5kKGkpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShCSUcpOgorICAgICAgICAgICAgeCA9IHBvcCgpCisgICAgICAgICAgICBpZiB4ICE9IGk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBpKQorCisgICAgZGVmIHRlc3RfYmlnX3F1ZXVlX3BvcHJpZ2h0KHNlbGYpOgorICAgICAgICBkID0gZGVxdWUoKQorICAgICAgICBhcHBlbmQsIHBvcCA9IGQuYXBwZW5kbGVmdCwgZC5wb3AKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKEJJRyk6CisgICAgICAgICAgICBhcHBlbmQoaSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKEJJRyk6CisgICAgICAgICAgICB4ID0gcG9wKCkKKyAgICAgICAgICAgIGlmIHggIT0gaToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGkpCisKKyAgICBkZWYgdGVzdF9iaWdfc3RhY2tfcmlnaHQoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSgpCisgICAgICAgIGFwcGVuZCwgcG9wID0gZC5hcHBlbmQsIGQucG9wCisgICAgICAgIGZvciBpIGluIHhyYW5nZShCSUcpOgorICAgICAgICAgICAgYXBwZW5kKGkpCisgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHhyYW5nZShCSUcpKToKKyAgICAgICAgICAgIHggPSBwb3AoKQorICAgICAgICAgICAgaWYgeCAhPSBpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisKKyAgICBkZWYgdGVzdF9iaWdfc3RhY2tfbGVmdChzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgYXBwZW5kLCBwb3AgPSBkLmFwcGVuZGxlZnQsIGQucG9wbGVmdAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoQklHKToKKyAgICAgICAgICAgIGFwcGVuZChpKQorICAgICAgICBmb3IgaSBpbiByZXZlcnNlZCh4cmFuZ2UoQklHKSk6CisgICAgICAgICAgICB4ID0gcG9wKCkKKyAgICAgICAgICAgIGlmIHggIT0gaToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorCisgICAgZGVmIHRlc3Rfcm91bmR0cmlwX2l0ZXJfaW5pdChzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZSgyMDApKQorICAgICAgICBlID0gZGVxdWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZSgyMDApKQorICAgICAgICBmb3IgaSBpbiByYW5nZShwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhkLCBpKQorICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoZSkpCisKKyMjICAgIGRlZiB0ZXN0X3BpY2tsZV9yZWN1cnNpdmUoc2VsZik6CisjIyAgICAgICAgZCA9IGRlcXVlKCdhYmMnKQorIyMgICAgICAgIGQuYXBwZW5kKGQpCisjIyAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKKyMjICAgICAgICAgICAgZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoZCwgaSkpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorIyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKGUpLCBpZChlWy0xXSkpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weShzZWxmKToKKyAgICAgICAgbXV0ID0gWzEwXQorICAgICAgICBkID0gZGVxdWUoW211dF0pCisgICAgICAgIGUgPSBjb3B5LmRlZXBjb3B5KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKyAgICAgICAgbXV0WzBdID0gMTEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIG11dCA9IFsxMF0KKyAgICAgICAgZCA9IGRlcXVlKFttdXRdKQorICAgICAgICBlID0gY29weS5jb3B5KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKyAgICAgICAgbXV0WzBdID0gMTEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkKSwgaWQoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgIGRlZiB0ZXN0X3JldmVyc2VkKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAoJ2FiY2QnLCB4cmFuZ2UoMjAwMCkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkKGRlcXVlKHMpKSksIGxpc3QocmV2ZXJzZWQocykpKQorCisgICAgZGVmIHRlc3RfZ2NfZG9lc250X2Jsb3d1cChzZWxmKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgICMgVGhpcyB1c2VkIHRvIGFzc2VydC1mYWlsIGluIGRlcXVlX3RyYXZlcnNlKCkgdW5kZXIgYSBkZWJ1ZworICAgICAgICAjIGJ1aWxkLCBvciBydW4gd2lsZCB3aXRoIGEgTlVMTCBwb2ludGVyIGluIGEgcmVsZWFzZSBidWlsZC4KKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBkLmFwcGVuZCgxKQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgdGVzdF9jb250YWluZXJfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgICMgQnVnICMzNjgwOiB0cF90cmF2ZXJzZSB3YXMgbm90IGltcGxlbWVudGVkIGZvciBkZXF1ZSBpdGVyYXRvciBvYmplY3RzCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMik6CisgICAgICAgICAgICBvYmogPSBDKCkKKyAgICAgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKG9iaikKKyAgICAgICAgICAgIGlmIGkgPT0gMDoKKyAgICAgICAgICAgICAgICBjb250YWluZXIgPSBkZXF1ZShbb2JqLCAxXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY29udGFpbmVyID0gcmV2ZXJzZWQoZGVxdWUoW29iaiwgMV0pKQorICAgICAgICAgICAgb2JqLnggPSBpdGVyKGNvbnRhaW5lcikKKyAgICAgICAgICAgIGRlbCBvYmosIGNvbnRhaW5lcgorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmKCkgaXMgTm9uZSwgIkN5Y2xlIHdhcyBub3QgY29sbGVjdGVkIikKKworICAgIGNoZWNrX3NpemVvZiA9IHRlc3Rfc3VwcG9ydC5jaGVja19zaXplb2YKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mKHNlbGYpOgorICAgICAgICBCTE9DS0xFTiA9IDYyCisgICAgICAgIGJhc2VzaXplID0gdGVzdF9zdXBwb3J0LmNhbGNvYmpzaXplKCcyUDRQbFAnKQorICAgICAgICBibG9ja3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoJzJQJWRQJyAlIEJMT0NLTEVOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iamVjdC5fX3NpemVvZl9fKGRlcXVlKCkpLCBiYXNlc2l6ZSkKKyAgICAgICAgY2hlY2sgPSBzZWxmLmNoZWNrX3NpemVvZgorICAgICAgICBjaGVjayhkZXF1ZSgpLCBiYXNlc2l6ZSArIGJsb2Nrc2l6ZSkKKyAgICAgICAgY2hlY2soZGVxdWUoJ2EnKSwgYmFzZXNpemUgKyBibG9ja3NpemUpCisgICAgICAgIGNoZWNrKGRlcXVlKCdhJyAqIChCTE9DS0xFTiAvLyAyKSksIGJhc2VzaXplICsgYmxvY2tzaXplKQorICAgICAgICBjaGVjayhkZXF1ZSgnYScgKiAoQkxPQ0tMRU4gLy8gMiArIDEpKSwgYmFzZXNpemUgKyAyICogYmxvY2tzaXplKQorICAgICAgICBjaGVjayhkZXF1ZSgnYScgKiAoNDIgKiBCTE9DS0xFTikpLCBiYXNlc2l6ZSArIDQzICogYmxvY2tzaXplKQorCitjbGFzcyBUZXN0VmFyaW91c0l0ZXJhdG9yQXJncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChzZXFfdGVzdHMuU2VxdWVuY2UsIHNlcV90ZXN0cy5JdGVyRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICBzZXFfdGVzdHMuSXRlckdlbiwgc2VxX3Rlc3RzLkl0ZXJGdW5jU3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICBzZXFfdGVzdHMuaXRlcm11bHRpLCBzZXFfdGVzdHMuaXRlcmZ1bmMpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkZXF1ZShnKHMpKSksIGxpc3QoZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlcXVlLCBzZXFfdGVzdHMuSXRlck5leHRPbmx5KHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZXF1ZSwgc2VxX3Rlc3RzLkl0ZXJOb05leHQocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZGVxdWUsIHNlcV90ZXN0cy5JdGVyR2VuRXhjKHMpKQorCisgICAgZGVmIHRlc3RfaXRlcl93aXRoX2FsdGVyZWRfZGF0YShzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCdhYmNkZWZnJykKKyAgICAgICAgaXQgPSBpdGVyKGQpCisgICAgICAgIGQucG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBpdC5uZXh0KQorCisgICAgZGVmIHRlc3RfcnVudGltZV9lcnJvcl9vbl9lbXB0eV9kZXF1ZShzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCkKKyAgICAgICAgaXQgPSBpdGVyKGQpCisgICAgICAgIGQuYXBwZW5kKDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGl0Lm5leHQpCisKK2NsYXNzIERlcXVlKGRlcXVlKToKKyAgICBwYXNzCisKK2NsYXNzIERlcXVlV2l0aEJhZEl0ZXIoZGVxdWUpOgorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yCisKK2NsYXNzIFRlc3RTdWJjbGFzcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGQgPSBEZXF1ZSh4cmFuZ2UoMjUpKQorICAgICAgICBkLl9faW5pdF9fKHhyYW5nZSgyMDApKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjAwLCA0MDApOgorICAgICAgICAgICAgZC5hcHBlbmQoaSkKKyAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKC0yMDAsIDApKToKKyAgICAgICAgICAgIGQuYXBwZW5kbGVmdChpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIHJhbmdlKC0yMDAsIDQwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCA2MDApCisKKyAgICAgICAgbGVmdCA9IFtkLnBvcGxlZnQoKSBmb3IgaSBpbiB4cmFuZ2UoMjUwKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZWZ0LCByYW5nZSgtMjAwLCA1MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgcmFuZ2UoNTAsIDQwMCkpCisKKyAgICAgICAgcmlnaHQgPSBbZC5wb3AoKSBmb3IgaSBpbiB4cmFuZ2UoMjUwKV0KKyAgICAgICAgcmlnaHQucmV2ZXJzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmlnaHQsIHJhbmdlKDE1MCwgNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCByYW5nZSg1MCwgMTUwKSkKKworICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisKKyAgICBkZWYgdGVzdF9jb3B5X3BpY2tsZShzZWxmKToKKworICAgICAgICBkID0gRGVxdWUoJ2FiYycpCisKKyAgICAgICAgZSA9IGQuX19jb3B5X18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgICAgICBlID0gRGVxdWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoZSkpCisKKyAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhkKQorICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgICAgICBkID0gRGVxdWUoJ2FiY2RlJywgbWF4bGVuPTQpCisKKyAgICAgICAgZSA9IGQuX19jb3B5X18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworICAgICAgICBlID0gRGVxdWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGQpLCB0eXBlKGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZCksIGxpc3QoZSkpCisKKyAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhkKQorICAgICAgICBlID0gcGlja2xlLmxvYWRzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZCksIGlkKGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgbGlzdChlKSkKKworIyMgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorIyMgICAgICAgIGQgPSBEZXF1ZSgnYWJjJykKKyMjICAgICAgICBkLmFwcGVuZChkKQorIyMKKyMjICAgICAgICBlID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhkKSkKKyMjICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQpLCBpZChlKSkKKyMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoZCksIHR5cGUoZSkpCisjIyAgICAgICAgZGQgPSBkLnBvcCgpCisjIyAgICAgICAgZWUgPSBlLnBvcCgpCisjIyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChlKSwgaWQoZWUpKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZSkKKyMjCisjIyAgICAgICAgZC54ID0gZAorIyMgICAgICAgIGUgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGQpKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoZSksIGlkKGUueCkpCisjIworIyMgICAgICAgIGQgPSBEZXF1ZVdpdGhCYWRJdGVyKCdhYmMnKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcGlja2xlLmR1bXBzLCBkKQorCisgICAgZGVmIHRlc3Rfd2Vha3JlZihzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKCdnYWxsYWhhZCcpCisgICAgICAgIHAgPSB3ZWFrcmVmLnByb3h5KGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHApLCBzdHIoZCkpCisgICAgICAgIGQgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBzdHIsIHApCisKKyAgICBkZWYgdGVzdF9zdHJhbmdlX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBYKGRlcXVlKToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcihbXSkKKyAgICAgICAgZDEgPSBYKFsxLDIsM10pCisgICAgICAgIGQyID0gWChbNCw1LDZdKQorICAgICAgICBkMSA9PSBkMiAgICMgbm90IGNsZWFyIGlmIHRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgVHJ1ZSBvciBGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAjIGJ1dCBpdCB1c2VkIHRvIGdpdmUgYSBTeXN0ZW1FcnJvcgorCisKK2NsYXNzIFN1YmNsYXNzV2l0aEt3YXJncyhkZXF1ZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5ld2FyZz0xKToKKyAgICAgICAgZGVxdWUuX19pbml0X18oc2VsZikKKworY2xhc3MgVGVzdFN1YmNsYXNzV2l0aEt3YXJncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc3ViY2xhc3Nfd2l0aF9rd2FyZ3Moc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxNDg2NjYzIC0tIHRoaXMgdXNlZCB0byBlcnJvbmVvdXNseSByYWlzZSBhIFR5cGVFcnJvcgorICAgICAgICBTdWJjbGFzc1dpdGhLd2FyZ3MobmV3YXJnPTEpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbGlicmVmdGVzdCA9ICIiIgorRXhhbXBsZSBmcm9tIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZTogIERvYy9saWIvbGliY29sbGVjdGlvbnMudGV4CisKKz4+PiBmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorPj4+IGQgPSBkZXF1ZSgnZ2hpJykgICAgICAgICAgICAgICAgICMgbWFrZSBhIG5ldyBkZXF1ZSB3aXRoIHRocmVlIGl0ZW1zCis+Pj4gZm9yIGVsZW0gaW4gZDogICAgICAgICAgICAgICAgICAgIyBpdGVyYXRlIG92ZXIgdGhlIGRlcXVlJ3MgZWxlbWVudHMKKy4uLiAgICAgcHJpbnQgZWxlbS51cHBlcigpCitHCitICitJCis+Pj4gZC5hcHBlbmQoJ2onKSAgICAgICAgICAgICAgICAgICAgIyBhZGQgYSBuZXcgZW50cnkgdG8gdGhlIHJpZ2h0IHNpZGUKKz4+PiBkLmFwcGVuZGxlZnQoJ2YnKSAgICAgICAgICAgICAgICAjIGFkZCBhIG5ldyBlbnRyeSB0byB0aGUgbGVmdCBzaWRlCis+Pj4gZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IHRoZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVxdWUKK2RlcXVlKFsnZicsICdnJywgJ2gnLCAnaScsICdqJ10pCis+Pj4gZC5wb3AoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZXR1cm4gYW5kIHJlbW92ZSB0aGUgcmlnaHRtb3N0IGl0ZW0KKydqJworPj4+IGQucG9wbGVmdCgpICAgICAgICAgICAgICAgICAgICAgICMgcmV0dXJuIGFuZCByZW1vdmUgdGhlIGxlZnRtb3N0IGl0ZW0KKydmJworPj4+IGxpc3QoZCkgICAgICAgICAgICAgICAgICAgICAgICAgICMgbGlzdCB0aGUgY29udGVudHMgb2YgdGhlIGRlcXVlCitbJ2cnLCAnaCcsICdpJ10KKz4+PiBkWzBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHBlZWsgYXQgbGVmdG1vc3QgaXRlbQorJ2cnCis+Pj4gZFstMV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwZWVrIGF0IHJpZ2h0bW9zdCBpdGVtCisnaScKKz4+PiBsaXN0KHJldmVyc2VkKGQpKSAgICAgICAgICAgICAgICAjIGxpc3QgdGhlIGNvbnRlbnRzIG9mIGEgZGVxdWUgaW4gcmV2ZXJzZQorWydpJywgJ2gnLCAnZyddCis+Pj4gJ2gnIGluIGQgICAgICAgICAgICAgICAgICAgICAgICAgIyBzZWFyY2ggdGhlIGRlcXVlCitUcnVlCis+Pj4gZC5leHRlbmQoJ2prbCcpICAgICAgICAgICAgICAgICAgIyBhZGQgbXVsdGlwbGUgZWxlbWVudHMgYXQgb25jZQorPj4+IGQKK2RlcXVlKFsnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnXSkKKz4+PiBkLnJvdGF0ZSgxKSAgICAgICAgICAgICAgICAgICAgICAjIHJpZ2h0IHJvdGF0aW9uCis+Pj4gZAorZGVxdWUoWydsJywgJ2cnLCAnaCcsICdpJywgJ2onLCAnayddKQorPj4+IGQucm90YXRlKC0xKSAgICAgICAgICAgICAgICAgICAgICMgbGVmdCByb3RhdGlvbgorPj4+IGQKK2RlcXVlKFsnZycsICdoJywgJ2knLCAnaicsICdrJywgJ2wnXSkKKz4+PiBkZXF1ZShyZXZlcnNlZChkKSkgICAgICAgICAgICAgICAjIG1ha2UgYSBuZXcgZGVxdWUgaW4gcmV2ZXJzZSBvcmRlcgorZGVxdWUoWydsJywgJ2snLCAnaicsICdpJywgJ2gnLCAnZyddKQorPj4+IGQuY2xlYXIoKSAgICAgICAgICAgICAgICAgICAgICAgICMgZW1wdHkgdGhlIGRlcXVlCis+Pj4gZC5wb3AoKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjYW5ub3QgcG9wIGZyb20gYW4gZW1wdHkgZGVxdWUKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPHB5c2hlbGwjNj4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KKyAgICBkLnBvcCgpCitJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBkZXF1ZQorCis+Pj4gZC5leHRlbmRsZWZ0KCdhYmMnKSAgICAgICAgICAgICAgIyBleHRlbmRsZWZ0KCkgcmV2ZXJzZXMgdGhlIGlucHV0IG9yZGVyCis+Pj4gZAorZGVxdWUoWydjJywgJ2InLCAnYSddKQorCisKKworPj4+IGRlZiBkZWxldGVfbnRoKGQsIG4pOgorLi4uICAgICBkLnJvdGF0ZSgtbikKKy4uLiAgICAgZC5wb3BsZWZ0KCkKKy4uLiAgICAgZC5yb3RhdGUobikKKy4uLgorPj4+IGQgPSBkZXF1ZSgnYWJjZGVmJykKKz4+PiBkZWxldGVfbnRoKGQsIDIpICAgIyByZW1vdmUgdGhlIGVudHJ5IGF0IGRbMl0KKz4+PiBkCitkZXF1ZShbJ2EnLCAnYicsICdkJywgJ2UnLCAnZiddKQorCisKKworPj4+IGRlZiByb3VuZHJvYmluKCppdGVyYWJsZXMpOgorLi4uICAgICBwZW5kaW5nID0gZGVxdWUoaXRlcihpKSBmb3IgaSBpbiBpdGVyYWJsZXMpCisuLi4gICAgIHdoaWxlIHBlbmRpbmc6CisuLi4gICAgICAgICB0YXNrID0gcGVuZGluZy5wb3BsZWZ0KCkKKy4uLiAgICAgICAgIHRyeToKKy4uLiAgICAgICAgICAgICB5aWVsZCB0YXNrLm5leHQoKQorLi4uICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisuLi4gICAgICAgICAgICAgY29udGludWUKKy4uLiAgICAgICAgIHBlbmRpbmcuYXBwZW5kKHRhc2spCisuLi4KKworPj4+IGZvciB2YWx1ZSBpbiByb3VuZHJvYmluKCdhYmMnLCAnZCcsICdlZmdoJyk6CisuLi4gICAgIHByaW50IHZhbHVlCisuLi4KK2EKK2QKK2UKK2IKK2YKK2MKK2cKK2gKKworCis+Pj4gZGVmIG1ha2V0cmVlKGl0ZXJhYmxlKToKKy4uLiAgICAgZCA9IGRlcXVlKGl0ZXJhYmxlKQorLi4uICAgICB3aGlsZSBsZW4oZCkgPiAxOgorLi4uICAgICAgICAgcGFpciA9IFtkLnBvcGxlZnQoKSwgZC5wb3BsZWZ0KCldCisuLi4gICAgICAgICBkLmFwcGVuZChwYWlyKQorLi4uICAgICByZXR1cm4gbGlzdChkKQorLi4uCis+Pj4gcHJpbnQgbWFrZXRyZWUoJ2FiY2RlZmdoJykKK1tbW1snYScsICdiJ10sIFsnYycsICdkJ11dLCBbWydlJywgJ2YnXSwgWydnJywgJ2gnXV1dXQorCisiIiIKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK19fdGVzdF9fID0geydsaWJyZWZ0ZXN0JyA6IGxpYnJlZnRlc3R9CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBpbXBvcnQgc3lzCisgICAgdGVzdF9jbGFzc2VzID0gKAorICAgICAgICBUZXN0QmFzaWMsCisgICAgICAgIFRlc3RWYXJpb3VzSXRlcmF0b3JBcmdzLAorICAgICAgICBUZXN0U3ViY2xhc3MsCisgICAgICAgIFRlc3RTdWJjbGFzc1dpdGhLd2FyZ3MsCisgICAgKQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKKyAgICAjIGRvY3Rlc3RzCisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2RlcXVlCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZGVxdWUsIHZlcmJvc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlcXVlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlcXVlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDMwM2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlcXVlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RlcXVlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODRmOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVxdWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2NjRhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC0wLDAgKzEsNDcyNyBAQAoraW1wb3J0IF9fYnVpbHRpbl9fCitpbXBvcnQgZ2MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2Vha3JlZgorCitmcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIE9wZXJhdG9yc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5iaW5vcHMgPSB7CisgICAgICAgICAgICAnYWRkJzogJysnLAorICAgICAgICAgICAgJ3N1Yic6ICctJywKKyAgICAgICAgICAgICdtdWwnOiAnKicsCisgICAgICAgICAgICAnZGl2JzogJy8nLAorICAgICAgICAgICAgJ2Rpdm1vZCc6ICdkaXZtb2QnLAorICAgICAgICAgICAgJ3Bvdyc6ICcqKicsCisgICAgICAgICAgICAnbHNoaWZ0JzogJzw8JywKKyAgICAgICAgICAgICdyc2hpZnQnOiAnPj4nLAorICAgICAgICAgICAgJ2FuZCc6ICcmJywKKyAgICAgICAgICAgICd4b3InOiAnXicsCisgICAgICAgICAgICAnb3InOiAnfCcsCisgICAgICAgICAgICAnY21wJzogJ2NtcCcsCisgICAgICAgICAgICAnbHQnOiAnPCcsCisgICAgICAgICAgICAnbGUnOiAnPD0nLAorICAgICAgICAgICAgJ2VxJzogJz09JywKKyAgICAgICAgICAgICduZSc6ICchPScsCisgICAgICAgICAgICAnZ3QnOiAnPicsCisgICAgICAgICAgICAnZ2UnOiAnPj0nLAorICAgICAgICB9CisKKyAgICAgICAgZm9yIG5hbWUsIGV4cHIgaW4gc2VsZi5iaW5vcHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGV4cHIuaXNsb3dlcigpOgorICAgICAgICAgICAgICAgIGV4cHIgPSBleHByICsgIihhLCBiKSIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwciA9ICdhICVzIGInICUgZXhwcgorICAgICAgICAgICAgc2VsZi5iaW5vcHNbbmFtZV0gPSBleHByCisKKyAgICAgICAgc2VsZi51bm9wcyA9IHsKKyAgICAgICAgICAgICdwb3MnOiAnKycsCisgICAgICAgICAgICAnbmVnJzogJy0nLAorICAgICAgICAgICAgJ2Ficyc6ICdhYnMnLAorICAgICAgICAgICAgJ2ludmVydCc6ICd+JywKKyAgICAgICAgICAgICdpbnQnOiAnaW50JywKKyAgICAgICAgICAgICdsb25nJzogJ2xvbmcnLAorICAgICAgICAgICAgJ2Zsb2F0JzogJ2Zsb2F0JywKKyAgICAgICAgICAgICdvY3QnOiAnb2N0JywKKyAgICAgICAgICAgICdoZXgnOiAnaGV4JywKKyAgICAgICAgfQorCisgICAgICAgIGZvciBuYW1lLCBleHByIGluIHNlbGYudW5vcHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGV4cHIuaXNsb3dlcigpOgorICAgICAgICAgICAgICAgIGV4cHIgPSBleHByICsgIihhKSIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhwciA9ICclcyBhJyAlIGV4cHIKKyAgICAgICAgICAgIHNlbGYudW5vcHNbbmFtZV0gPSBleHByCisKKyAgICBkZWYgdW5vcF90ZXN0KHNlbGYsIGEsIHJlcywgZXhwcj0ibGVuKGEpIiwgbWV0aD0iX19sZW5fXyIpOgorICAgICAgICBkID0geydhJzogYX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGV4cHIsIGQpLCByZXMpCisgICAgICAgIHQgPSB0eXBlKGEpCisgICAgICAgIG0gPSBnZXRhdHRyKHQsIG1ldGgpCisKKyAgICAgICAgIyBGaW5kIG1ldGhvZCBpbiBwYXJlbnQgY2xhc3MKKyAgICAgICAgd2hpbGUgbWV0aCBub3QgaW4gdC5fX2RpY3RfXzoKKyAgICAgICAgICAgIHQgPSB0Ll9fYmFzZXNfX1swXQorICAgICAgICAjIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIChlLmcuIFB5UHkpLCAnbScgY2FuIGJlIGEgcmVndWxhciB1bmJvdW5kCisgICAgICAgICMgbWV0aG9kIG9iamVjdDsgdGhlIGdldGF0dHIoKSBiZWxvdyBvYnRhaW5zIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIobSwgJ2ltX2Z1bmMnLCBtKSwgdC5fX2RpY3RfX1ttZXRoXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtKGEpLCByZXMpCisgICAgICAgIGJtID0gZ2V0YXR0cihhLCBtZXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJtKCksIHJlcykKKworICAgIGRlZiBiaW5vcF90ZXN0KHNlbGYsIGEsIGIsIHJlcywgZXhwcj0iYStiIiwgbWV0aD0iX19hZGRfXyIpOgorICAgICAgICBkID0geydhJzogYSwgJ2InOiBifQorCisgICAgICAgICMgWFhYIEhhY2sgc28gdGhpcyBwYXNzZXMgYmVmb3JlIDIuMyB3aGVuIC1RbmV3IGlzIHNwZWNpZmllZC4KKyAgICAgICAgaWYgbWV0aCA9PSAiX19kaXZfXyIgYW5kIDEvMiA9PSAwLjU6CisgICAgICAgICAgICBtZXRoID0gIl9fdHJ1ZWRpdl9fIgorCisgICAgICAgIGlmIG1ldGggPT0gJ19fZGl2bW9kX18nOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGV4cHIsIGQpLCByZXMpCisgICAgICAgIHQgPSB0eXBlKGEpCisgICAgICAgIG0gPSBnZXRhdHRyKHQsIG1ldGgpCisgICAgICAgIHdoaWxlIG1ldGggbm90IGluIHQuX19kaWN0X186CisgICAgICAgICAgICB0ID0gdC5fX2Jhc2VzX19bMF0KKyAgICAgICAgIyBpbiBzb21lIGltcGxlbWVudGF0aW9ucyAoZS5nLiBQeVB5KSwgJ20nIGNhbiBiZSBhIHJlZ3VsYXIgdW5ib3VuZAorICAgICAgICAjIG1ldGhvZCBvYmplY3Q7IHRoZSBnZXRhdHRyKCkgYmVsb3cgb2J0YWlucyBpdHMgdW5kZXJseWluZyBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKG0sICdpbV9mdW5jJywgbSksIHQuX19kaWN0X19bbWV0aF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobShhLCBiKSwgcmVzKQorICAgICAgICBibSA9IGdldGF0dHIoYSwgbWV0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChibShiKSwgcmVzKQorCisgICAgZGVmIHRlcm5vcF90ZXN0KHNlbGYsIGEsIGIsIGMsIHJlcywgZXhwcj0iYVtiOmNdIiwgbWV0aD0iX19nZXRzbGljZV9fIik6CisgICAgICAgIGQgPSB7J2EnOiBhLCAnYic6IGIsICdjJzogY30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGV4cHIsIGQpLCByZXMpCisgICAgICAgIHQgPSB0eXBlKGEpCisgICAgICAgIG0gPSBnZXRhdHRyKHQsIG1ldGgpCisgICAgICAgIHdoaWxlIG1ldGggbm90IGluIHQuX19kaWN0X186CisgICAgICAgICAgICB0ID0gdC5fX2Jhc2VzX19bMF0KKyAgICAgICAgIyBpbiBzb21lIGltcGxlbWVudGF0aW9ucyAoZS5nLiBQeVB5KSwgJ20nIGNhbiBiZSBhIHJlZ3VsYXIgdW5ib3VuZAorICAgICAgICAjIG1ldGhvZCBvYmplY3Q7IHRoZSBnZXRhdHRyKCkgYmVsb3cgb2J0YWlucyBpdHMgdW5kZXJseWluZyBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKG0sICdpbV9mdW5jJywgbSksIHQuX19kaWN0X19bbWV0aF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobShhLCBiLCBjKSwgcmVzKQorICAgICAgICBibSA9IGdldGF0dHIoYSwgbWV0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChibShiLCBjKSwgcmVzKQorCisgICAgZGVmIHNldG9wX3Rlc3Qoc2VsZiwgYSwgYiwgcmVzLCBzdG10PSJhKz1iIiwgbWV0aD0iX19pYWRkX18iKToKKyAgICAgICAgZCA9IHsnYSc6IGRlZXBjb3B5KGEpLCAnYic6IGJ9CisgICAgICAgIGV4ZWMgc3RtdCBpbiBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCByZXMpCisgICAgICAgIHQgPSB0eXBlKGEpCisgICAgICAgIG0gPSBnZXRhdHRyKHQsIG1ldGgpCisgICAgICAgIHdoaWxlIG1ldGggbm90IGluIHQuX19kaWN0X186CisgICAgICAgICAgICB0ID0gdC5fX2Jhc2VzX19bMF0KKyAgICAgICAgIyBpbiBzb21lIGltcGxlbWVudGF0aW9ucyAoZS5nLiBQeVB5KSwgJ20nIGNhbiBiZSBhIHJlZ3VsYXIgdW5ib3VuZAorICAgICAgICAjIG1ldGhvZCBvYmplY3Q7IHRoZSBnZXRhdHRyKCkgYmVsb3cgb2J0YWlucyBpdHMgdW5kZXJseWluZyBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKG0sICdpbV9mdW5jJywgbSksIHQuX19kaWN0X19bbWV0aF0pCisgICAgICAgIGRbJ2EnXSA9IGRlZXBjb3B5KGEpCisgICAgICAgIG0oZFsnYSddLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgcmVzKQorICAgICAgICBkWydhJ10gPSBkZWVwY29weShhKQorICAgICAgICBibSA9IGdldGF0dHIoZFsnYSddLCBtZXRoKQorICAgICAgICBibShiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgcmVzKQorCisgICAgZGVmIHNldDJvcF90ZXN0KHNlbGYsIGEsIGIsIGMsIHJlcywgc3RtdD0iYVtiXT1jIiwgbWV0aD0iX19zZXRpdGVtX18iKToKKyAgICAgICAgZCA9IHsnYSc6IGRlZXBjb3B5KGEpLCAnYic6IGIsICdjJzogY30KKyAgICAgICAgZXhlYyBzdG10IGluIGQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydhJ10sIHJlcykKKyAgICAgICAgdCA9IHR5cGUoYSkKKyAgICAgICAgbSA9IGdldGF0dHIodCwgbWV0aCkKKyAgICAgICAgd2hpbGUgbWV0aCBub3QgaW4gdC5fX2RpY3RfXzoKKyAgICAgICAgICAgIHQgPSB0Ll9fYmFzZXNfX1swXQorICAgICAgICAjIGluIHNvbWUgaW1wbGVtZW50YXRpb25zIChlLmcuIFB5UHkpLCAnbScgY2FuIGJlIGEgcmVndWxhciB1bmJvdW5kCisgICAgICAgICMgbWV0aG9kIG9iamVjdDsgdGhlIGdldGF0dHIoKSBiZWxvdyBvYnRhaW5zIGl0cyB1bmRlcmx5aW5nIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIobSwgJ2ltX2Z1bmMnLCBtKSwgdC5fX2RpY3RfX1ttZXRoXSkKKyAgICAgICAgZFsnYSddID0gZGVlcGNvcHkoYSkKKyAgICAgICAgbShkWydhJ10sIGIsIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCByZXMpCisgICAgICAgIGRbJ2EnXSA9IGRlZXBjb3B5KGEpCisgICAgICAgIGJtID0gZ2V0YXR0cihkWydhJ10sIG1ldGgpCisgICAgICAgIGJtKGIsIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCByZXMpCisKKyAgICBkZWYgc2V0M29wX3Rlc3Qoc2VsZiwgYSwgYiwgYywgZCwgcmVzLCBzdG10PSJhW2I6Y109ZCIsIG1ldGg9Il9fc2V0c2xpY2VfXyIpOgorICAgICAgICBkaWN0aW9uYXJ5ID0geydhJzogZGVlcGNvcHkoYSksICdiJzogYiwgJ2MnOiBjLCAnZCc6IGR9CisgICAgICAgIGV4ZWMgc3RtdCBpbiBkaWN0aW9uYXJ5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGlvbmFyeVsnYSddLCByZXMpCisgICAgICAgIHQgPSB0eXBlKGEpCisgICAgICAgIHdoaWxlIG1ldGggbm90IGluIHQuX19kaWN0X186CisgICAgICAgICAgICB0ID0gdC5fX2Jhc2VzX19bMF0KKyAgICAgICAgbSA9IGdldGF0dHIodCwgbWV0aCkKKyAgICAgICAgIyBpbiBzb21lIGltcGxlbWVudGF0aW9ucyAoZS5nLiBQeVB5KSwgJ20nIGNhbiBiZSBhIHJlZ3VsYXIgdW5ib3VuZAorICAgICAgICAjIG1ldGhvZCBvYmplY3Q7IHRoZSBnZXRhdHRyKCkgYmVsb3cgb2J0YWlucyBpdHMgdW5kZXJseWluZyBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKG0sICdpbV9mdW5jJywgbSksIHQuX19kaWN0X19bbWV0aF0pCisgICAgICAgIGRpY3Rpb25hcnlbJ2EnXSA9IGRlZXBjb3B5KGEpCisgICAgICAgIG0oZGljdGlvbmFyeVsnYSddLCBiLCBjLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3Rpb25hcnlbJ2EnXSwgcmVzKQorICAgICAgICBkaWN0aW9uYXJ5WydhJ10gPSBkZWVwY29weShhKQorICAgICAgICBibSA9IGdldGF0dHIoZGljdGlvbmFyeVsnYSddLCBtZXRoKQorICAgICAgICBibShiLCBjLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3Rpb25hcnlbJ2EnXSwgcmVzKQorCisgICAgZGVmIHRlc3RfbGlzdHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBsaXN0IG9wZXJhdGlvbnMuLi4KKyAgICAgICAgIyBBc3NlcnRzIGFyZSB3aXRoaW4gaW5kaXZpZHVhbCB0ZXN0IG1ldGhvZHMKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KFsxXSwgWzJdLCBbMSwyXSwgImErYiIsICJfX2FkZF9fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KFsxLDIsM10sIDIsIDEsICJiIGluIGEiLCAiX19jb250YWluc19fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KFsxLDIsM10sIDQsIDAsICJiIGluIGEiLCAiX19jb250YWluc19fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KFsxLDIsM10sIDEsIDIsICJhW2JdIiwgIl9fZ2V0aXRlbV9fIikKKyAgICAgICAgc2VsZi50ZXJub3BfdGVzdChbMSwyLDNdLCAwLCAyLCBbMSwyXSwgImFbYjpjXSIsICJfX2dldHNsaWNlX18iKQorICAgICAgICBzZWxmLnNldG9wX3Rlc3QoWzFdLCBbMl0sIFsxLDJdLCAiYSs9YiIsICJfX2lhZGRfXyIpCisgICAgICAgIHNlbGYuc2V0b3BfdGVzdChbMSwyXSwgMywgWzEsMiwxLDIsMSwyXSwgImEqPWIiLCAiX19pbXVsX18iKQorICAgICAgICBzZWxmLnVub3BfdGVzdChbMSwyLDNdLCAzLCAibGVuKGEpIiwgIl9fbGVuX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoWzEsMl0sIDMsIFsxLDIsMSwyLDEsMl0sICJhKmIiLCAiX19tdWxfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChbMSwyXSwgMywgWzEsMiwxLDIsMSwyXSwgImIqYSIsICJfX3JtdWxfXyIpCisgICAgICAgIHNlbGYuc2V0Mm9wX3Rlc3QoWzEsMl0sIDEsIDMsIFsxLDNdLCAiYVtiXT1jIiwgIl9fc2V0aXRlbV9fIikKKyAgICAgICAgc2VsZi5zZXQzb3BfdGVzdChbMSwyLDMsNF0sIDEsIDMsIFs1LDZdLCBbMSw1LDYsNF0sICJhW2I6Y109ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19zZXRzbGljZV9fIikKKworICAgIGRlZiB0ZXN0X2RpY3RzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZGljdCBvcGVyYXRpb25zLi4uCisgICAgICAgIGlmIGhhc2F0dHIoZGljdCwgJ19fY21wX18nKTogICAjIFB5UHkgaGFzIG9ubHkgcmljaCBjb21wYXJpc29uIG9uIGRpY3RzCisgICAgICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoezE6Mn0sIHsyOjF9LCAtMSwgImNtcChhLGIpIiwgIl9fY21wX18iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHsxOjJ9LCB7MjoxfSwgVHJ1ZSwgImEgPCBiIiwgIl9fbHRfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdCh7MToyLDM6NH0sIDEsIDEsICJiIGluIGEiLCAiX19jb250YWluc19fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHsxOjIsMzo0fSwgMiwgMCwgImIgaW4gYSIsICJfX2NvbnRhaW5zX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3QoezE6MiwzOjR9LCAxLCAyLCAiYVtiXSIsICJfX2dldGl0ZW1fXyIpCisKKyAgICAgICAgZCA9IHsxOjIsIDM6NH0KKyAgICAgICAgbDEgPSBbXQorICAgICAgICBmb3IgaSBpbiBkLmtleXMoKToKKyAgICAgICAgICAgIGwxLmFwcGVuZChpKQorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGkgaW4gaXRlcihkKToKKyAgICAgICAgICAgIGwuYXBwZW5kKGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgbDEpCisgICAgICAgIGwgPSBbXQorICAgICAgICBmb3IgaSBpbiBkLl9faXRlcl9fKCk6CisgICAgICAgICAgICBsLmFwcGVuZChpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIGwxKQorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGkgaW4gZGljdC5fX2l0ZXJfXyhkKToKKyAgICAgICAgICAgIGwuYXBwZW5kKGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgbDEpCisgICAgICAgIGQgPSB7MToyLCAzOjR9CisgICAgICAgIHNlbGYudW5vcF90ZXN0KGQsIDIsICJsZW4oYSkiLCAiX19sZW5fXyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXByKGQpLCB7fSksIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChkLl9fcmVwcl9fKCksIHt9KSwgZCkKKyAgICAgICAgc2VsZi5zZXQyb3BfdGVzdCh7MToyLDM6NH0sIDIsIDMsIHsxOjIsMjozLDM6NH0sICJhW2JdPWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fc2V0aXRlbV9fIikKKworICAgICMgVGVzdHMgZm9yIHVuYXJ5IGFuZCBiaW5hcnkgb3BlcmF0b3JzCisgICAgZGVmIG51bWJlcl9vcGVyYXRvcnMoc2VsZiwgYSwgYiwgc2tpcD1bXSk6CisgICAgICAgIGRpY3QgPSB7J2EnOiBhLCAnYic6IGJ9CisKKyAgICAgICAgZm9yIG5hbWUsIGV4cHIgaW4gc2VsZi5iaW5vcHMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNraXA6CisgICAgICAgICAgICAgICAgbmFtZSA9ICJfXyVzX18iICUgbmFtZQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoYSwgbmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGV2YWwoZXhwciwgZGljdCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5iaW5vcF90ZXN0KGEsIGIsIHJlcywgZXhwciwgbmFtZSkKKworICAgICAgICBmb3IgbmFtZSwgZXhwciBpbiBzZWxmLnVub3BzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiBza2lwOgorICAgICAgICAgICAgICAgIG5hbWUgPSAiX18lc19fIiAlIG5hbWUKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGEsIG5hbWUpOgorICAgICAgICAgICAgICAgICAgICByZXMgPSBldmFsKGV4cHIsIGRpY3QpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5vcF90ZXN0KGEsIHJlcywgZXhwciwgbmFtZSkKKworICAgIGRlZiB0ZXN0X2ludHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBpbnQgb3BlcmF0aW9ucy4uLgorICAgICAgICBzZWxmLm51bWJlcl9vcGVyYXRvcnMoMTAwLCAzKQorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgY3Jhc2hlcyBpbiBQeXRob24gMi4yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEpLl9fbm9uemVyb19fKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDApLl9fbm9uemVyb19fKCksIDApCisgICAgICAgICMgVGhpcyByZXR1cm5zICdOb3RJbXBsZW1lbnRlZCcgaW4gUHl0aG9uIDIuMgorICAgICAgICBjbGFzcyBDKGludCk6CisgICAgICAgICAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQyg1TCksIDUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEMoKSArICIiCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vdEltcGxlbWVudGVkIHNob3VsZCBoYXZlIGNhdXNlZCBUeXBlRXJyb3IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBDKHN5cy5tYXhpbnQrMSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPdmVyZmxvd0Vycm9yIikKKworICAgIGRlZiB0ZXN0X2xvbmdzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbG9uZyBvcGVyYXRpb25zLi4uCisgICAgICAgIHNlbGYubnVtYmVyX29wZXJhdG9ycygxMDBMLCAzTCkKKworICAgIGRlZiB0ZXN0X2Zsb2F0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGZsb2F0IG9wZXJhdGlvbnMuLi4KKyAgICAgICAgc2VsZi5udW1iZXJfb3BlcmF0b3JzKDEwMC4wLCAzLjApCisKKyAgICBkZWYgdGVzdF9jb21wbGV4ZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBjb21wbGV4IG9wZXJhdGlvbnMuLi4KKyAgICAgICAgc2VsZi5udW1iZXJfb3BlcmF0b3JzKDEwMC4waiwgMy4waiwgc2tpcD1bJ2x0JywgJ2xlJywgJ2d0JywgJ2dlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ludCcsICdsb25nJywgJ2Zsb2F0J10pCisKKyAgICAgICAgY2xhc3MgTnVtYmVyKGNvbXBsZXgpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydwcmVjJ10KKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcGxleC5fX25ld19fKGNscywgKmFyZ3MpCisgICAgICAgICAgICAgICAgcmVzdWx0LnByZWMgPSBrd2RzLmdldCgncHJlYycsIDEyKQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBwcmVjID0gc2VsZi5wcmVjCisgICAgICAgICAgICAgICAgaWYgc2VsZi5pbWFnID09IDAuMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIlLipnIiAlIChwcmVjLCBzZWxmLnJlYWwpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5yZWFsID09IDAuMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIlLipnaiIgJSAocHJlYywgc2VsZi5pbWFnKQorICAgICAgICAgICAgICAgIHJldHVybiAiKCUuKmcrJS4qZ2opIiAlIChwcmVjLCBzZWxmLnJlYWwsIHByZWMsIHNlbGYuaW1hZykKKyAgICAgICAgICAgIF9fc3RyX18gPSBfX3JlcHJfXworCisgICAgICAgIGEgPSBOdW1iZXIoMy4xNCwgcHJlYz02KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYSksICIzLjE0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnByZWMsIDYpCisKKyAgICAgICAgYSA9IE51bWJlcihhLCBwcmVjPTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgIjMuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5wcmVjLCAyKQorCisgICAgICAgIGEgPSBOdW1iZXIoMjM0LjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgIjIzNC41IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnByZWMsIDEyKQorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidGhlIG1vZHVsZSAneHhzdWJ0eXBlJyBpcyBpbnRlcm5hbCIpCisgICAgZGVmIHRlc3Rfc3BhbV9saXN0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHNwYW1saXN0IG9wZXJhdGlvbnMuLi4KKyAgICAgICAgaW1wb3J0IGNvcHksIHh4c3VidHlwZSBhcyBzcGFtCisKKyAgICAgICAgZGVmIHNwYW1saXN0KGwsIG1lbW89Tm9uZSk6CisgICAgICAgICAgICBpbXBvcnQgeHhzdWJ0eXBlIGFzIHNwYW0KKyAgICAgICAgICAgIHJldHVybiBzcGFtLnNwYW1saXN0KGwpCisKKyAgICAgICAgIyBUaGlzIGlzIGFuIHVnbHkgaGFjazoKKyAgICAgICAgY29weS5fZGVlcGNvcHlfZGlzcGF0Y2hbc3BhbS5zcGFtbGlzdF0gPSBzcGFtbGlzdAorCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtbGlzdChbMV0pLCBzcGFtbGlzdChbMl0pLCBzcGFtbGlzdChbMSwyXSksICJhK2IiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19hZGRfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtbGlzdChbMSwyLDNdKSwgMiwgMSwgImIgaW4gYSIsICJfX2NvbnRhaW5zX18iKQorICAgICAgICBzZWxmLmJpbm9wX3Rlc3Qoc3BhbWxpc3QoWzEsMiwzXSksIDQsIDAsICJiIGluIGEiLCAiX19jb250YWluc19fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1saXN0KFsxLDIsM10pLCAxLCAyLCAiYVtiXSIsICJfX2dldGl0ZW1fXyIpCisgICAgICAgIHNlbGYudGVybm9wX3Rlc3Qoc3BhbWxpc3QoWzEsMiwzXSksIDAsIDIsIHNwYW1saXN0KFsxLDJdKSwgImFbYjpjXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19nZXRzbGljZV9fIikKKyAgICAgICAgc2VsZi5zZXRvcF90ZXN0KHNwYW1saXN0KFsxXSksIHNwYW1saXN0KFsyXSksIHNwYW1saXN0KFsxLDJdKSwgImErPWIiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19pYWRkX18iKQorICAgICAgICBzZWxmLnNldG9wX3Rlc3Qoc3BhbWxpc3QoWzEsMl0pLCAzLCBzcGFtbGlzdChbMSwyLDEsMiwxLDJdKSwgImEqPWIiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19pbXVsX18iKQorICAgICAgICBzZWxmLnVub3BfdGVzdChzcGFtbGlzdChbMSwyLDNdKSwgMywgImxlbihhKSIsICJfX2xlbl9fIikKKyAgICAgICAgc2VsZi5iaW5vcF90ZXN0KHNwYW1saXN0KFsxLDJdKSwgMywgc3BhbWxpc3QoWzEsMiwxLDIsMSwyXSksICJhKmIiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19tdWxfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtbGlzdChbMSwyXSksIDMsIHNwYW1saXN0KFsxLDIsMSwyLDEsMl0pLCAiYiphIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIl9fcm11bF9fIikKKyAgICAgICAgc2VsZi5zZXQyb3BfdGVzdChzcGFtbGlzdChbMSwyXSksIDEsIDMsIHNwYW1saXN0KFsxLDNdKSwgImFbYl09YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiX19zZXRpdGVtX18iKQorICAgICAgICBzZWxmLnNldDNvcF90ZXN0KHNwYW1saXN0KFsxLDIsMyw0XSksIDEsIDMsIHNwYW1saXN0KFs1LDZdKSwKKyAgICAgICAgICAgICAgICAgICBzcGFtbGlzdChbMSw1LDYsNF0pLCAiYVtiOmNdPWQiLCAiX19zZXRzbGljZV9fIikKKyAgICAgICAgIyBUZXN0IHN1YmNsYXNzaW5nCisgICAgICAgIGNsYXNzIEMoc3BhbS5zcGFtbGlzdCk6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiByZXR1cm4gMQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5mb28oKSwgMSkKKyAgICAgICAgYS5hcHBlbmQoMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFsxMDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgMCkKKyAgICAgICAgYS5zZXRzdGF0ZSg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmdldHN0YXRlKCksIDQyKQorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidGhlIG1vZHVsZSAneHhzdWJ0eXBlJyBpcyBpbnRlcm5hbCIpCisgICAgZGVmIHRlc3Rfc3BhbV9kaWN0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHNwYW1kaWN0IG9wZXJhdGlvbnMuLi4KKyAgICAgICAgaW1wb3J0IGNvcHksIHh4c3VidHlwZSBhcyBzcGFtCisgICAgICAgIGRlZiBzcGFtZGljdChkLCBtZW1vPU5vbmUpOgorICAgICAgICAgICAgaW1wb3J0IHh4c3VidHlwZSBhcyBzcGFtCisgICAgICAgICAgICBzZCA9IHNwYW0uc3BhbWRpY3QoKQorICAgICAgICAgICAgZm9yIGssIHYgaW4gZC5pdGVtcygpOgorICAgICAgICAgICAgICAgIHNkW2tdID0gdgorICAgICAgICAgICAgcmV0dXJuIHNkCisgICAgICAgICMgVGhpcyBpcyBhbiB1Z2x5IGhhY2s6CisgICAgICAgIGNvcHkuX2RlZXBjb3B5X2Rpc3BhdGNoW3NwYW0uc3BhbWRpY3RdID0gc3BhbWRpY3QKKworICAgICAgICBzZWxmLmJpbm9wX3Rlc3Qoc3BhbWRpY3QoezE6Mn0pLCBzcGFtZGljdCh7MjoxfSksIC0xLCAiY21wKGEsYikiLAorICAgICAgICAgICAgICAgICAgICAgICAiX19jbXBfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtZGljdCh7MToyLDM6NH0pLCAxLCAxLCAiYiBpbiBhIiwgIl9fY29udGFpbnNfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtZGljdCh7MToyLDM6NH0pLCAyLCAwLCAiYiBpbiBhIiwgIl9fY29udGFpbnNfXyIpCisgICAgICAgIHNlbGYuYmlub3BfdGVzdChzcGFtZGljdCh7MToyLDM6NH0pLCAxLCAyLCAiYVtiXSIsICJfX2dldGl0ZW1fXyIpCisgICAgICAgIGQgPSBzcGFtZGljdCh7MToyLDM6NH0pCisgICAgICAgIGwxID0gW10KKyAgICAgICAgZm9yIGkgaW4gZC5rZXlzKCk6CisgICAgICAgICAgICBsMS5hcHBlbmQoaSkKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGZvciBpIGluIGl0ZXIoZCk6CisgICAgICAgICAgICBsLmFwcGVuZChpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIGwxKQorICAgICAgICBsID0gW10KKyAgICAgICAgZm9yIGkgaW4gZC5fX2l0ZXJfXygpOgorICAgICAgICAgICAgbC5hcHBlbmQoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBsMSkKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGZvciBpIGluIHR5cGUoc3BhbWRpY3Qoe30pKS5fX2l0ZXJfXyhkKToKKyAgICAgICAgICAgIGwuYXBwZW5kKGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgbDEpCisgICAgICAgIHN0cmFpZ2h0ZCA9IHsxOjIsIDM6NH0KKyAgICAgICAgc3BhbWQgPSBzcGFtZGljdChzdHJhaWdodGQpCisgICAgICAgIHNlbGYudW5vcF90ZXN0KHNwYW1kLCAyLCAibGVuKGEpIiwgIl9fbGVuX18iKQorICAgICAgICBzZWxmLnVub3BfdGVzdChzcGFtZCwgcmVwcihzdHJhaWdodGQpLCAicmVwcihhKSIsICJfX3JlcHJfXyIpCisgICAgICAgIHNlbGYuc2V0Mm9wX3Rlc3Qoc3BhbWRpY3QoezE6MiwzOjR9KSwgMiwgMywgc3BhbWRpY3QoezE6MiwyOjMsMzo0fSksCisgICAgICAgICAgICAgICAgICAgImFbYl09YyIsICJfX3NldGl0ZW1fXyIpCisgICAgICAgICMgVGVzdCBzdWJjbGFzc2luZworICAgICAgICBjbGFzcyBDKHNwYW0uc3BhbWRpY3QpOgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKTogcmV0dXJuIDEKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaXRlbXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5mb28oKSwgMSkKKyAgICAgICAgYVsnZm9vJ10gPSAnYmFyJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuaXRlbXMoKSwgWygnZm9vJywgJ2JhcicpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmdldHN0YXRlKCksIDApCisgICAgICAgIGEuc2V0c3RhdGUoMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgMTAwKQorCitjbGFzcyBDbGFzc1Byb3BlcnRpZXNBbmRNZXRob2RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3B5dGhvbl9kaWN0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIFB5dGhvbiBzdWJjbGFzcyBvZiBkaWN0Li4uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGRpY3QsIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoe30sIGRpY3QpCisgICAgICAgIGQgPSBkaWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuX19jbGFzc19fIGlzIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkLCBkaWN0KQorICAgICAgICBjbGFzcyBDKGRpY3QpOgorICAgICAgICAgICAgc3RhdGUgPSAtMQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGZfbG9jYWwsICphLCAqKmt3KToKKyAgICAgICAgICAgICAgICBpZiBhOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhKSwgMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZl9sb2NhbC5zdGF0ZSA9IGFbMF0KKyAgICAgICAgICAgICAgICBpZiBrdzoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4ga3cuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGZfbG9jYWxbdl0gPSBrCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZXQoa2V5LCAwKQorICAgICAgICAgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGZfbG9jYWwsIGtleSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShrZXksIHR5cGUoMCkpCisgICAgICAgICAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmX2xvY2FsLCBrZXksIHZhbHVlKQorICAgICAgICAgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUKKyAgICAgICAgICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBkaWN0KSkKKyAgICAgICAgYTEgPSBDKDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGExLnN0YXRlLCAxMikKKyAgICAgICAgYTIgPSBDKGZvbz0xLCBiYXI9MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMlsxXSA9PSAnZm9vJyBhbmQgYTJbMl0sICdiYXInKQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zdGF0ZSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAtMSkKKyAgICAgICAgYS5zZXRzdGF0ZSgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuc3RhdGUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAwKQorICAgICAgICBhLnNldHN0YXRlKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuc3RhdGUsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs0Ml0sIDApCisgICAgICAgIGFbNDJdID0gMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzQyXSwgMjQpCisgICAgICAgIE4gPSA1MAorICAgICAgICBmb3IgaSBpbiByYW5nZShOKToKKyAgICAgICAgICAgIGFbaV0gPSBDKCkKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgICAgIGFbaV1bal0gPSBpKmoKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTik6CisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShOKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbaV1bal0sIGkqaikKKworICAgIGRlZiB0ZXN0X3B5dGhvbl9saXN0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIFB5dGhvbiBzdWJjbGFzcyBvZiBsaXN0Li4uCisgICAgICAgIGNsYXNzIEMobGlzdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QuX19nZXRpdGVtX18oc2VsZiwgaSkgKyAxMDAKKyAgICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChpLCBqKQorICAgICAgICBhID0gQygpCisgICAgICAgIGEuZXh0ZW5kKFswLDEsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswXSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMV0sIDEwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzJdLCAxMDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVsxMDA6MjAwXSwgKDEwMCwyMDApKQorCisgICAgZGVmIHRlc3RfbWV0YWNsYXNzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19tZXRhY2xhc3NfXy4uLgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IHR5cGUKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSAwCisgICAgICAgICAgICBkZWYgZ2V0c3RhdGUoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19zdGF0ZQorICAgICAgICAgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9fc3RhdGUgPSBzdGF0ZQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5nZXRzdGF0ZSgpLCAwKQorICAgICAgICBhLnNldHN0YXRlKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgMTApCisgICAgICAgIGNsYXNzIEQ6CisgICAgICAgICAgICBjbGFzcyBfX21ldGFjbGFzc19fKHR5cGUpOgorICAgICAgICAgICAgICAgIGRlZiBteXNlbGYoY2xzKTogcmV0dXJuIGNscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQubXlzZWxmKCksIEQpCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLl9fY2xhc3NfXywgRCkKKyAgICAgICAgY2xhc3MgTTEodHlwZSk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0KToKKyAgICAgICAgICAgICAgICBkaWN0WydfX3NwYW1fXyddID0gMQorICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdCkKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMuX19zcGFtX18sIDEpCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9fc3BhbV9fLCAxKQorCisgICAgICAgIGNsYXNzIF9pbnN0YW5jZShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBNMihvYmplY3QpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdCk6CisgICAgICAgICAgICAgICAgc2VsZiA9IG9iamVjdC5fX25ld19fKGNscykKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgICAgICAgICAgc2VsZi5iYXNlcyA9IGJhc2VzCisgICAgICAgICAgICAgICAgc2VsZi5kaWN0ID0gZGljdAorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgaXQgPSBfaW5zdGFuY2UoKQorICAgICAgICAgICAgICAgICMgRWFybHkgYmluZGluZyBvZiBtZXRob2RzCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmRpY3Q6CisgICAgICAgICAgICAgICAgICAgIGlmIGtleS5zdGFydHN3aXRoKCJfXyIpOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihpdCwga2V5LCBzZWxmLmRpY3Rba2V5XS5fX2dldF9fKGl0LCBzZWxmKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNMgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5uYW1lLCAnQycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5iYXNlcywgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3NwYW0nLCBDLmRpY3QpCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLnNwYW0oKSwgNDIpCisKKyAgICAgICAgIyBNb3JlIG1ldGFjbGFzcyBleGFtcGxlcworCisgICAgICAgIGNsYXNzIGF1dG9zdXBlcih0eXBlKToKKyAgICAgICAgICAgICMgQXV0b21hdGljYWxseSBhZGQgX19zdXBlciB0byB0aGUgY2xhc3MKKyAgICAgICAgICAgICMgVGhpcyB0cmljayBvbmx5IHdvcmtzIGZvciBkeW5hbWljIGNsYXNzZXMKKyAgICAgICAgICAgIGRlZiBfX25ld19fKG1ldGFjbGFzcywgbmFtZSwgYmFzZXMsIGRpY3QpOgorICAgICAgICAgICAgICAgIGNscyA9IHN1cGVyKGF1dG9zdXBlciwgbWV0YWNsYXNzKS5fX25ld19fKG1ldGFjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBiYXNlcywgZGljdCkKKyAgICAgICAgICAgICAgICAjIE5hbWUgbWFuZ2xpbmcgZm9yIF9fc3VwZXIgcmVtb3ZlcyBsZWFkaW5nIHVuZGVyc2NvcmVzCisgICAgICAgICAgICAgICAgd2hpbGUgbmFtZVs6MV0gPT0gIl8iOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVsxOl0KKyAgICAgICAgICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gIl8lc19fc3VwZXIiICUgbmFtZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSAiX19zdXBlciIKKyAgICAgICAgICAgICAgICBzZXRhdHRyKGNscywgbmFtZSwgc3VwZXIoY2xzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xzCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYXV0b3N1cGVyCisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkEiCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkIiICsgc2VsZi5fX3N1cGVyLm1ldGgoKQorICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDIiArIHNlbGYuX19zdXBlci5tZXRoKCkKKyAgICAgICAgY2xhc3MgRChDLCBCKToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiRCIgKyBzZWxmLl9fc3VwZXIubWV0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRCgpLm1ldGgoKSwgIkRDQkEiKQorICAgICAgICBjbGFzcyBFKEIsIEMpOgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFIiArIHNlbGYuX19zdXBlci5tZXRoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFKCkubWV0aCgpLCAiRUJDQSIpCisKKyAgICAgICAgY2xhc3MgYXV0b3Byb3BlcnR5KHR5cGUpOgorICAgICAgICAgICAgIyBBdXRvbWF0aWNhbGx5IGNyZWF0ZSBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdoZW4gbWV0aG9kcworICAgICAgICAgICAgIyBuYW1lZCBfZ2V0X3ggYW5kL29yIF9zZXRfeCBhcmUgZm91bmQKKyAgICAgICAgICAgIGRlZiBfX25ld19fKG1ldGFjbGFzcywgbmFtZSwgYmFzZXMsIGRpY3QpOgorICAgICAgICAgICAgICAgIGhpdHMgPSB7fQorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBkaWN0Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aCgiX2dldF8iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleVs1Ol0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldCwgc2V0ID0gaGl0cy5nZXQoa2V5LCAoTm9uZSwgTm9uZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBnZXQgPSB2YWwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpdHNba2V5XSA9IGdldCwgc2V0CisgICAgICAgICAgICAgICAgICAgIGVsaWYga2V5LnN0YXJ0c3dpdGgoIl9zZXRfIik6CisgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBrZXlbNTpdCisgICAgICAgICAgICAgICAgICAgICAgICBnZXQsIHNldCA9IGhpdHMuZ2V0KGtleSwgKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2V0ID0gdmFsCisgICAgICAgICAgICAgICAgICAgICAgICBoaXRzW2tleV0gPSBnZXQsIHNldAorICAgICAgICAgICAgICAgIGZvciBrZXksIChnZXQsIHNldCkgaW4gaGl0cy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgZGljdFtrZXldID0gcHJvcGVydHkoZ2V0LCBzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKGF1dG9wcm9wZXJ0eSwgbWV0YWNsYXNzKS5fX25ld19fKG1ldGFjbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIGJhc2VzLCBkaWN0KQorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGF1dG9wcm9wZXJ0eQorICAgICAgICAgICAgZGVmIF9nZXRfeChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gLXNlbGYuX194CisgICAgICAgICAgICBkZWYgX3NldF94KHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYuX194ID0gLXgKKyAgICAgICAgYSA9IEEoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYSwgIngiKSkKKyAgICAgICAgYS54ID0gMTIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX0FfX3gsIC0xMikKKworICAgICAgICBjbGFzcyBtdWx0aW1ldGFjbGFzcyhhdXRvcHJvcGVydHksIGF1dG9zdXBlcik6CisgICAgICAgICAgICAjIE1lcmdlIG9mIG11bHRpcGxlIGNvb3BlcmF0aW5nIG1ldGFjbGFzc2VzCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gbXVsdGltZXRhY2xhc3MKKyAgICAgICAgICAgIGRlZiBfZ2V0X3goc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJBIgorICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgZGVmIF9nZXRfeChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkIiICsgc2VsZi5fX3N1cGVyLl9nZXRfeCgpCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBkZWYgX2dldF94KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQyIgKyBzZWxmLl9fc3VwZXIuX2dldF94KCkKKyAgICAgICAgY2xhc3MgRChDLCBCKToKKyAgICAgICAgICAgIGRlZiBfZ2V0X3goc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJEIiArIHNlbGYuX19zdXBlci5fZ2V0X3goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQoKS54LCAiRENCQSIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdHlwZSh4KSBkb2Vzbid0IGNhbGwgeC5fX2NsYXNzX18uX19pbml0X18KKyAgICAgICAgY2xhc3MgVCh0eXBlKToKKyAgICAgICAgICAgIGNvdW50ZXIgPSAwCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIFQuY291bnRlciArPSAxCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gVAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFQuY291bnRlciwgMSkKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYSksIEMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVC5jb3VudGVyLCAxKQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KTogcGFzcworICAgICAgICBjID0gQygpCisgICAgICAgIHRyeTogYygpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJjYWxsaW5nIG9iamVjdCB3L28gY2FsbCBtZXRob2Qgc2hvdWxkIHJhaXNlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJUeXBlRXJyb3IiKQorCisgICAgICAgICMgVGVzdGluZyBjb2RlIHRvIGZpbmQgbW9zdCBkZXJpdmVkIGJhc2VjbGFzcworICAgICAgICBjbGFzcyBBKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5fX25ld19fKCphcmdzLCAqKmt3YXJncykKKworICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IEEKKworICAgICAgICAjIFRoZSBtb3N0IGRlcml2ZWQgbWV0YWNsYXNzIG9mIEQgaXMgQSByYXRoZXIgdGhhbiB0eXBlLgorICAgICAgICBjbGFzcyBEKEIsIEMpOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbW9kdWxlX3N1YmNsYXNzZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBQeXRob24gc3ViY2xhc3Mgb2YgbW9kdWxlLi4uCisgICAgICAgIGxvZyA9IFtdCisgICAgICAgIE1UID0gdHlwZShzeXMpCisgICAgICAgIGNsYXNzIE1NKE1UKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBNVC5fX2luaXRfXyhzZWxmLCBuYW1lKQorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgbG9nLmFwcGVuZCgoImdldGF0dHIiLCBuYW1lKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTVQuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKQorICAgICAgICAgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKCgic2V0YXR0ciIsIG5hbWUsIHZhbHVlKSkKKyAgICAgICAgICAgICAgICBNVC5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgIGRlZiBfX2RlbGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKCgiZGVsYXR0ciIsIG5hbWUpKQorICAgICAgICAgICAgICAgIE1ULl9fZGVsYXR0cl9fKHNlbGYsIG5hbWUpCisgICAgICAgIGEgPSBNTSgiYSIpCisgICAgICAgIGEuZm9vID0gMTIKKyAgICAgICAgeCA9IGEuZm9vCisgICAgICAgIGRlbCBhLmZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZywgWygic2V0YXR0ciIsICJmb28iLCAxMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJnZXRhdHRyIiwgImZvbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZGVsYXR0ciIsICJmb28iKV0pCisKKyAgICAgICAgIyBodHRwOi8vcHl0aG9uLm9yZy9zZi8xMTc0NzEyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIE1vZHVsZSh0eXBlcy5Nb2R1bGVUeXBlLCBzdHIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW5oZXJpdGluZyBmcm9tIE1vZHVsZVR5cGUgYW5kIHN0ciBhdCB0aGUgc2FtZSB0aW1lICIKKyAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGZhaWwiKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfaW5oZXJpdGVuY2Uoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtdWx0aXBsZSBpbmhlcml0YW5jZS4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gMAorICAgICAgICAgICAgZGVmIGdldHN0YXRlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fc3RhdGUKKyAgICAgICAgICAgIGRlZiBzZXRzdGF0ZShzZWxmLCBzdGF0ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fX3N0YXRlID0gc3RhdGUKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZ2V0c3RhdGUoKSwgMCkKKyAgICAgICAgYS5zZXRzdGF0ZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmdldHN0YXRlKCksIDEwKQorICAgICAgICBjbGFzcyBEKGRpY3QsIEMpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHR5cGUoe30pLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgQy5fX2luaXRfXyhzZWxmKQorICAgICAgICBkID0gRCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5rZXlzKCksIFtdKQorICAgICAgICBkWyJoZWxsbyJdID0gIndvcmxkIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXRlbXMoKSwgWygiaGVsbG8iLCAid29ybGQiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsiaGVsbG8iXSwgIndvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldHN0YXRlKCksIDApCisgICAgICAgIGQuc2V0c3RhdGUoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXRzdGF0ZSgpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELl9fbXJvX18sIChELCBkaWN0LCBDLCBvYmplY3QpKQorCisgICAgICAgICMgU0YgYnVnICM0NDI4MzMKKyAgICAgICAgY2xhc3MgTm9kZShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludChzZWxmLmZvbygpKQorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIjIzIgorICAgICAgICBjbGFzcyBGcmFnKE5vZGUsIGxpc3QpOgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIjQyIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vZGUoKS5fX2ludF9fKCksIDIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChOb2RlKCkpLCAyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGcmFnKCkuX19pbnRfXygpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoRnJhZygpKSwgNDIpCisKKyAgICAgICAgIyBNSSBtaXhpbmcgY2xhc3NpYyBhbmQgbmV3LXN0eWxlIGNsYXNzZXMuCisKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIHggPSAxCisKKyAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgeCA9IDIKKworICAgICAgICBjbGFzcyBEKEIsIEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQueCwgMSkKKworICAgICAgICAjIENsYXNzaWMgTVJPIGlzIHByZXNlcnZlZCBmb3IgYSBjbGFzc2ljIGJhc2UgY2xhc3MuCisgICAgICAgIGNsYXNzIEUoRCwgb2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFLl9fbXJvX18sIChFLCBELCBCLCBBLCBDLCBvYmplY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUueCwgMSkKKworICAgICAgICAjIEJ1dCB3aXRoIGEgbWl4IG9mIGNsYXNzaWMgYmFzZXMsIHRoZWlyIE1ST3MgYXJlIGNvbWJpbmVkIHVzaW5nCisgICAgICAgICMgbmV3LXN0eWxlIE1STy4KKyAgICAgICAgY2xhc3MgRihCLCBDLCBvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYuX19tcm9fXywgKEYsIEIsIEMsIEEsIG9iamVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRi54LCAyKQorCisgICAgICAgICMgVHJ5IHNvbWV0aGluZyBlbHNlLgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIGNtZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDIGEiCisgICAgICAgICAgICBkZWYgYWxsX21ldGhvZChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkMgYiIKKworICAgICAgICBjbGFzcyBNMShDLCBvYmplY3QpOgorICAgICAgICAgICAgZGVmIG0xbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTTEgYSIKKyAgICAgICAgICAgIGRlZiBhbGxfbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTTEgYiIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE0xLl9fbXJvX18sIChNMSwgQywgb2JqZWN0KSkKKyAgICAgICAgbSA9IE0xKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmNtZXRob2QoKSwgIkMgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5tMW1ldGhvZCgpLCAiTTEgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5hbGxfbWV0aG9kKCksICJNMSBiIikKKworICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgZGVmIGRtZXRob2Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJEIGEiCisgICAgICAgICAgICBkZWYgYWxsX21ldGhvZChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkQgYiIKKworICAgICAgICBjbGFzcyBNMihELCBvYmplY3QpOgorICAgICAgICAgICAgZGVmIG0ybWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTTIgYSIKKyAgICAgICAgICAgIGRlZiBhbGxfbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTTIgYiIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE0yLl9fbXJvX18sIChNMiwgRCwgQywgb2JqZWN0KSkKKyAgICAgICAgbSA9IE0yKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmNtZXRob2QoKSwgIkMgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5kbWV0aG9kKCksICJEIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ubTJtZXRob2QoKSwgIk0yIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uYWxsX21ldGhvZCgpLCAiTTIgYiIpCisKKyAgICAgICAgY2xhc3MgTTMoTTEsIE0yLCBvYmplY3QpOgorICAgICAgICAgICAgZGVmIG0zbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTTMgYSIKKyAgICAgICAgICAgIGRlZiBhbGxfbWV0aG9kKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiTTMgYiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNMy5fX21yb19fLCAoTTMsIE0xLCBNMiwgRCwgQywgb2JqZWN0KSkKKyAgICAgICAgbSA9IE0zKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmNtZXRob2QoKSwgIkMgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5kbWV0aG9kKCksICJEIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ubTFtZXRob2QoKSwgIk0xIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ubTJtZXRob2QoKSwgIk0yIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ubTNtZXRob2QoKSwgIk0zIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uYWxsX21ldGhvZCgpLCAiTTMgYiIpCisKKyAgICAgICAgY2xhc3MgQ2xhc3NpYzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgTmV3KENsYXNzaWMpOgorICAgICAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSB0eXBlCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5ldyBjbGFzcyB3aXRoIG9ubHkgY2xhc3NpYyBiYXNlcyAtIHNob3VsZG4ndCBiZSIpCisKKyAgICBkZWYgdGVzdF9kaWFtb25kX2luaGVyaXRlbmNlKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugc3BlY2lhbCBjYXNlcy4uLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgc3BhbShzZWxmKTogcmV0dXJuICJBIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEEoKS5zcGFtKCksICJBIikKKyAgICAgICAgY2xhc3MgQihBKToKKyAgICAgICAgICAgIGRlZiBib28oc2VsZik6IHJldHVybiAiQiIKKyAgICAgICAgICAgIGRlZiBzcGFtKHNlbGYpOiByZXR1cm4gIkIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQigpLnNwYW0oKSwgIkIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEIoKS5ib28oKSwgIkIiKQorICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgZGVmIGJvbyhzZWxmKTogcmV0dXJuICJDIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoKS5zcGFtKCksICJBIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDKCkuYm9vKCksICJDIikKKyAgICAgICAgY2xhc3MgRChCLCBDKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQoKS5zcGFtKCksICJCIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEKCkuYm9vKCksICJCIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELl9fbXJvX18sIChELCBCLCBDLCBBLCBvYmplY3QpKQorICAgICAgICBjbGFzcyBFKEMsIEIpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRSgpLnNwYW0oKSwgIkIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUoKS5ib28oKSwgIkMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUuX19tcm9fXywgKEUsIEMsIEIsIEEsIG9iamVjdCkpCisgICAgICAgICMgTVJPIG9yZGVyIGRpc2FncmVlbWVudAorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBGKEQsIEUpOiBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIE1STyBvcmRlciBkaXNhZ3JlZW1lbnQgKEYpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgRyhFLCBEKTogcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBNUk8gb3JkZXIgZGlzYWdyZWVtZW50IChHKSIpCisKKyAgICAjIHNlZSB0aHJlYWQgcHl0aG9uLWRldi8yMDAyLU9jdG9iZXIvMDI5MDM1Lmh0bWwKKyAgICBkZWYgdGVzdF9leDVfZnJvbV9jM19zd2l0Y2goc2VsZik6CisgICAgICAgICMgVGVzdGluZyBleDUgZnJvbSBDMyBzd2l0Y2ggZGlzY3Vzc2lvbi4uLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIEMob2JqZWN0KTogcGFzcworICAgICAgICBjbGFzcyBYKEEpOiBwYXNzCisgICAgICAgIGNsYXNzIFkoQSk6IHBhc3MKKyAgICAgICAgY2xhc3MgWihYLEIsWSxDKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFouX19tcm9fXywgKFosIFgsIEIsIFksIEEsIEMsIG9iamVjdCkpCisKKyAgICAjIHNlZSAiQSBNb25vdG9uaWMgU3VwZXJjbGFzcyBMaW5lYXJpemF0aW9uIGZvciBEeWxhbiIsCisgICAgIyBieSBLaW0gQmFycmV0dCBldCBhbC4gKE9PUFNMQSAxOTk2KQorICAgIGRlZiB0ZXN0X21vbm90b25pY2l0eShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIE1STyBtb25vdG9uaWNpdHkuLi4KKyAgICAgICAgY2xhc3MgQm9hdChvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIERheUJvYXQoQm9hdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgV2hlZWxCb2F0KEJvYXQpOiBwYXNzCisgICAgICAgIGNsYXNzIEVuZ2luZUxlc3MoRGF5Qm9hdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgU21hbGxNdWx0aWh1bGwoRGF5Qm9hdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgUGVkYWxXaGVlbEJvYXQoRW5naW5lTGVzcyxXaGVlbEJvYXQpOiBwYXNzCisgICAgICAgIGNsYXNzIFNtYWxsQ2F0YW1hcmFuKFNtYWxsTXVsdGlodWxsKTogcGFzcworICAgICAgICBjbGFzcyBQZWRhbG8oUGVkYWxXaGVlbEJvYXQsU21hbGxDYXRhbWFyYW4pOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZWRhbFdoZWVsQm9hdC5fX21yb19fLAorICAgICAgICAgICAgICAoUGVkYWxXaGVlbEJvYXQsIEVuZ2luZUxlc3MsIERheUJvYXQsIFdoZWVsQm9hdCwgQm9hdCwgb2JqZWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTbWFsbENhdGFtYXJhbi5fX21yb19fLAorICAgICAgICAgICAgICAoU21hbGxDYXRhbWFyYW4sIFNtYWxsTXVsdGlodWxsLCBEYXlCb2F0LCBCb2F0LCBvYmplY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBlZGFsby5fX21yb19fLAorICAgICAgICAgICAgICAoUGVkYWxvLCBQZWRhbFdoZWVsQm9hdCwgRW5naW5lTGVzcywgU21hbGxDYXRhbWFyYW4sCisgICAgICAgICAgICAgICBTbWFsbE11bHRpaHVsbCwgRGF5Qm9hdCwgV2hlZWxCb2F0LCBCb2F0LCBvYmplY3QpKQorCisgICAgIyBzZWUgIkEgTW9ub3RvbmljIFN1cGVyY2xhc3MgTGluZWFyaXphdGlvbiBmb3IgRHlsYW4iLAorICAgICMgYnkgS2ltIEJhcnJldHQgZXQgYWwuIChPT1BTTEEgMTk5NikKKyAgICBkZWYgdGVzdF9jb25zaXN0ZW5jeV93aXRoX2VwZyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNvbnNpc3RlbmN5IHdpdGggRVBHLi4uCisgICAgICAgIGNsYXNzIFBhbmUob2JqZWN0KTogcGFzcworICAgICAgICBjbGFzcyBTY3JvbGxpbmdNaXhpbihvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIEVkaXRpbmdNaXhpbihvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIFNjcm9sbGFibGVQYW5lKFBhbmUsU2Nyb2xsaW5nTWl4aW4pOiBwYXNzCisgICAgICAgIGNsYXNzIEVkaXRhYmxlUGFuZShQYW5lLEVkaXRpbmdNaXhpbik6IHBhc3MKKyAgICAgICAgY2xhc3MgRWRpdGFibGVTY3JvbGxhYmxlUGFuZShTY3JvbGxhYmxlUGFuZSxFZGl0YWJsZVBhbmUpOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFZGl0YWJsZVNjcm9sbGFibGVQYW5lLl9fbXJvX18sCisgICAgICAgICAgICAgIChFZGl0YWJsZVNjcm9sbGFibGVQYW5lLCBTY3JvbGxhYmxlUGFuZSwgRWRpdGFibGVQYW5lLCBQYW5lLAorICAgICAgICAgICAgICAgIFNjcm9sbGluZ01peGluLCBFZGl0aW5nTWl4aW4sIG9iamVjdCkpCisKKyAgICBkZWYgdGVzdF9tcm9fZGlzYWdyZWVtZW50KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZXJyb3IgbWVzc2FnZXMgZm9yIE1STyBkaXNhZ3JlZW1lbnQuLi4KKyAgICAgICAgbXJvX2Vycl9tc2cgPSAiIiJDYW5ub3QgY3JlYXRlIGEgY29uc2lzdGVudCBtZXRob2QgcmVzb2x1dGlvbgorb3JkZXIgKE1STykgZm9yIGJhc2VzICIiIgorCisgICAgICAgIGRlZiByYWlzZXMoZXhjLCBleHBlY3RlZCwgY2FsbGFibGUsICphcmdzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjYWxsYWJsZSgqYXJncykKKyAgICAgICAgICAgIGV4Y2VwdCBleGMsIG1zZzoKKyAgICAgICAgICAgICAgICAjIHRoZSBleGFjdCBtc2cgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgYW4gaW1wbCBkZXRhaWwKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuY2hlY2tfaW1wbF9kZXRhaWwoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHN0cihtc2cpLnN0YXJ0c3dpdGgoZXhwZWN0ZWQpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJNZXNzYWdlICVyLCBleHBlY3RlZCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIobXNnKSwgZXhwZWN0ZWQpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkICVzIiAlIGV4YykKKworICAgICAgICBjbGFzcyBBKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQihBKTogcGFzcworICAgICAgICBjbGFzcyBDKG9iamVjdCk6IHBhc3MKKworICAgICAgICAjIFRlc3Qgc29tZSB2ZXJ5IHNpbXBsZSBlcnJvcnMKKyAgICAgICAgcmFpc2VzKFR5cGVFcnJvciwgImR1cGxpY2F0ZSBiYXNlIGNsYXNzIEEiLAorICAgICAgICAgICAgICAgdHlwZSwgIlgiLCAoQSwgQSksIHt9KQorICAgICAgICByYWlzZXMoVHlwZUVycm9yLCBtcm9fZXJyX21zZywKKyAgICAgICAgICAgICAgIHR5cGUsICJYIiwgKEEsIEIpLCB7fSkKKyAgICAgICAgcmFpc2VzKFR5cGVFcnJvciwgbXJvX2Vycl9tc2csCisgICAgICAgICAgICAgICB0eXBlLCAiWCIsIChBLCBDLCBCKSwge30pCisgICAgICAgICMgVGVzdCBhIHNsaWdodGx5IG1vcmUgY29tcGxleCBlcnJvcgorICAgICAgICBjbGFzcyBHcmlkTGF5b3V0KG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgSG9yaXpvbnRhbEdyaWQoR3JpZExheW91dCk6IHBhc3MKKyAgICAgICAgY2xhc3MgVmVydGljYWxHcmlkKEdyaWRMYXlvdXQpOiBwYXNzCisgICAgICAgIGNsYXNzIEhWR3JpZChIb3Jpem9udGFsR3JpZCwgVmVydGljYWxHcmlkKTogcGFzcworICAgICAgICBjbGFzcyBWSEdyaWQoVmVydGljYWxHcmlkLCBIb3Jpem9udGFsR3JpZCk6IHBhc3MKKyAgICAgICAgcmFpc2VzKFR5cGVFcnJvciwgbXJvX2Vycl9tc2csCisgICAgICAgICAgICAgICB0eXBlLCAiQ29uZnVzZWRHcmlkIiwgKEhWR3JpZCwgVkhHcmlkKSwge30pCisKKyAgICBkZWYgdGVzdF9vYmplY3RfY2xhc3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBvYmplY3QgY2xhc3MuLi4KKyAgICAgICAgYSA9IG9iamVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2NsYXNzX18sIG9iamVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGEpLCBvYmplY3QpCisgICAgICAgIGIgPSBvYmplY3QoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiZm9vIikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGEuZm9vID0gMTIKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgib2JqZWN0KCkgc2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIGEgZm9vIGF0dHJpYnV0ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihvYmplY3QoKSwgIl9fZGljdF9fIikpCisKKyAgICAgICAgY2xhc3MgQ2RpY3Qob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeCA9IENkaWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fZGljdF9fLCB7fSkKKyAgICAgICAgeC5mb28gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fX2RpY3RfXywgeydmb28nOiAxfSkKKworICAgIGRlZiB0ZXN0X3Nsb3RzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19zbG90c19fLi4uCisgICAgICAgIGNsYXNzIEMwKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQorICAgICAgICB4ID0gQzAoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAiZm9vIikpCisKKyAgICAgICAgY2xhc3MgQzEob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnYSddCisgICAgICAgIHggPSBDMSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAiX19kaWN0X18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICJhIikpCisgICAgICAgIHguYSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIDEpCisgICAgICAgIHguYSA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmEsIE5vbmUpCisgICAgICAgIGRlbCB4LmEKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICJhIikpCisKKyAgICAgICAgY2xhc3MgQzMob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnYScsICdiJywgJ2MnXQorICAgICAgICB4ID0gQzMoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoeCwgJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICdjJykpCisgICAgICAgIHguYSA9IDEKKyAgICAgICAgeC5iID0gMgorICAgICAgICB4LmMgPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmMsIDMpCisKKyAgICAgICAgY2xhc3MgQzQob2JqZWN0KToKKyAgICAgICAgICAgICIiIlZhbGlkYXRlIG5hbWUgbWFuZ2xpbmciIiIKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnX19hJ10KKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fX2EgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2EKKyAgICAgICAgeCA9IEM0KDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih4LCAnX19kaWN0X18nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHgsICdfX2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmdldCgpLCA1KQorICAgICAgICB0cnk6CisgICAgICAgICAgICB4Ll9fYSA9IDYKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEb3VibGUgdW5kZXJzY29yZWQgbmFtZXMgbm90IG1hbmdsZWQiKQorCisgICAgICAgICMgTWFrZSBzdXJlIHNsb3QgbmFtZXMgYXJlIHByb3BlciBpZGVudGlmaWVycworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gW05vbmVdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIltOb25lXSBzbG90cyBub3QgY2F1Z2h0IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiZm9vIGJhciJdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlsnZm9vIGJhciddIHNsb3RzIG5vdCBjYXVnaHQiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICAgICAgX19zbG90c19fID0gWyJmb29cMGJhciJdCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlsnZm9vXFwwYmFyJ10gc2xvdHMgbm90IGNhdWdodCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIjEiXQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJbJzEnXSBzbG90cyBub3QgY2F1Z2h0IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiIl0KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiWycnXSBzbG90cyBub3QgY2F1Z2h0IikKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJhIiwgImFfYiIsICJfYSIsICJBMDEyMzQ1Njc4OVoiXQorICAgICAgICAjIFhYWChubm9yd2l0eik6IHdhcyB0aGVyZSBzdXBwb3NlZCB0byBiZSBzb21ldGhpbmcgdGVzdGVkCisgICAgICAgICMgZnJvbSB0aGUgY2xhc3MgYWJvdmU/CisKKyAgICAgICAgIyBUZXN0IGEgc2luZ2xlIHN0cmluZyBpcyBub3QgZXhwYW5kZWQgYXMgYSBzZXF1ZW5jZS4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gImFiYyIKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBjLmFiYyA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmFiYywgNSkKKworICAgICAgICAjIFRlc3QgdW5pY29kZSBzbG90IG5hbWVzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgVGVzdCBhIHNpbmdsZSB1bmljb2RlIHN0cmluZyBpcyBub3QgZXhwYW5kZWQgYXMgYSBzZXF1ZW5jZS4KKyAgICAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSB1bmljb2RlKCJhYmMiKQorICAgICAgICAgICAgYyA9IEMoKQorICAgICAgICAgICAgYy5hYmMgPSA1CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuYWJjLCA1KQorCisgICAgICAgICAgICAjIF91bmljb2RlX3RvX3N0cmluZyB1c2VkIHRvIG1vZGlmeSBzbG90cyBpbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMKKyAgICAgICAgICAgIHNsb3RzID0gKHVuaWNvZGUoImZvbyIpLCB1bmljb2RlKCJiYXIiKSkKKyAgICAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBzbG90cworICAgICAgICAgICAgeCA9IEMoKQorICAgICAgICAgICAgeC5mb28gPSA1CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCA1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNsb3RzWzBdKSwgdW5pY29kZSkKKyAgICAgICAgICAgICMgdGhpcyB1c2VkIHRvIGxlYWsgcmVmZXJlbmNlcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgX19zbG90c19fID0gW3VuaWNocigxMjgpXQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlt1bmljaHIoMTI4KV0gc2xvdHMgbm90IGNhdWdodCIpCisKKyAgICAgICAgIyBUZXN0IGxlYWtzCisgICAgICAgIGNsYXNzIENvdW50ZWQob2JqZWN0KToKKyAgICAgICAgICAgIGNvdW50ZXIgPSAwICAgICMgY291bnRzIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIGFsaXZlCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgQ291bnRlZC5jb3VudGVyICs9IDEKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIENvdW50ZWQuY291bnRlciAtPSAxCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnYScsICdiJywgJ2MnXQorICAgICAgICB4ID0gQygpCisgICAgICAgIHguYSA9IENvdW50ZWQoKQorICAgICAgICB4LmIgPSBDb3VudGVkKCkKKyAgICAgICAgeC5jID0gQ291bnRlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ291bnRlZC5jb3VudGVyLCAzKQorICAgICAgICBkZWwgeAorICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ291bnRlZC5jb3VudGVyLCAwKQorICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB4ID0gRCgpCisgICAgICAgIHguYSA9IENvdW50ZWQoKQorICAgICAgICB4LnogPSBDb3VudGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDIpCisgICAgICAgIGRlbCB4CisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDb3VudGVkLmNvdW50ZXIsIDApCisgICAgICAgIGNsYXNzIEUoRCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ2UnXQorICAgICAgICB4ID0gRSgpCisgICAgICAgIHguYSA9IENvdW50ZWQoKQorICAgICAgICB4LnogPSBDb3VudGVkKCkKKyAgICAgICAgeC5lID0gQ291bnRlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ291bnRlZC5jb3VudGVyLCAzKQorICAgICAgICBkZWwgeAorICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ291bnRlZC5jb3VudGVyLCAwKQorCisgICAgICAgICMgVGVzdCBjeWNsaWNhbCBsZWFrcyBbU0YgYnVnIDUxOTYyMV0KKyAgICAgICAgY2xhc3MgRihvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydhJywgJ2InXQorICAgICAgICBzID0gRigpCisgICAgICAgIHMuYSA9IFtDb3VudGVkKCksIHNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ291bnRlZC5jb3VudGVyLCAxKQorICAgICAgICBzID0gTm9uZQorICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ291bnRlZC5jb3VudGVyLCAwKQorCisgICAgICAgICMgVGVzdCBsb29rdXAgbGVha3MgW1NGIGJ1ZyA1NzI1NjddCisgICAgICAgIGlmIGhhc2F0dHIoZ2MsICdnZXRfb2JqZWN0cycpOgorICAgICAgICAgICAgY2xhc3MgRyhvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICAgICAgZyA9IEcoKQorICAgICAgICAgICAgb3JpZ19vYmplY3RzID0gbGVuKGdjLmdldF9vYmplY3RzKCkpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIGc9PWcKKyAgICAgICAgICAgIG5ld19vYmplY3RzID0gbGVuKGdjLmdldF9vYmplY3RzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWdfb2JqZWN0cywgbmV3X29iamVjdHMpCisKKyAgICAgICAgY2xhc3MgSChvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydhJywgJ2InXQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuYSA9IDEKKyAgICAgICAgICAgICAgICBzZWxmLmIgPSAyCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmXyk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmXy5hLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZl8uYiwgMikKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzOgorICAgICAgICAgICAgaCA9IEgoKQorICAgICAgICAgICAgZGVsIGgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcnKQorCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9ICJhIgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGRlbCBYKCkuYQorCisgICAgZGVmIHRlc3Rfc2xvdHNfc3BlY2lhbChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIF9fZGljdF9fIGFuZCBfX3dlYWtyZWZfXyBpbiBfX3Nsb3RzX18uLi4KKyAgICAgICAgY2xhc3MgRChvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJfX2RpY3RfXyJdCisgICAgICAgIGEgPSBEKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKKyAgICAgICAgYS5mb28gPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19kaWN0X18sIHsiZm9vIjogNDJ9KQorCisgICAgICAgIGNsYXNzIFcob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiX193ZWFrcmVmX18iXQorICAgICAgICBhID0gVygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYSwgIl9fZGljdF9fIikpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGEuZm9vID0gNDIKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYmUgYWxsb3dlZCB0byBzZXQgYS5mb28iKQorCisgICAgICAgIGNsYXNzIEMxKFcsIEQpOgorICAgICAgICAgICAgX19zbG90c19fID0gW10KKyAgICAgICAgYSA9IEMxKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQorICAgICAgICBhLmZvbyA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywgeyJmb28iOiA0Mn0pCisKKyAgICAgICAgY2xhc3MgQzIoRCwgVyk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQorICAgICAgICBhID0gQzIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCisgICAgICAgIGEuZm9vID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLl9fZGljdF9fLCB7ImZvbyI6IDQyfSkKKworICAgIGRlZiB0ZXN0X3Nsb3RzX2Rlc2NyaXB0b3Ioc2VsZik6CisgICAgICAgICMgSXNzdWUyMTE1OiBzbG90IGRlc2NyaXB0b3JzIGRpZCBub3QgY29ycmVjdGx5IGNoZWNrCisgICAgICAgICMgdGhlIHR5cGUgb2YgdGhlIGdpdmVuIG9iamVjdAorICAgICAgICBpbXBvcnQgYWJjCisgICAgICAgIGNsYXNzIE15QUJDOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCisgICAgICAgICAgICBfX3Nsb3RzX18gPSAiYSIKKworICAgICAgICBjbGFzcyBVbnJlbGF0ZWQob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgTXlBQkMucmVnaXN0ZXIoVW5yZWxhdGVkKQorCisgICAgICAgIHUgPSBVbnJlbGF0ZWQoKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodSwgTXlBQkMpCisKKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gY3Jhc2gKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBNeUFCQy5hLl9fc2V0X18sIHUsIDMpCisKKyAgICBkZWYgdGVzdF9tZXRhY2xhc3NfY21wKHNlbGYpOgorICAgICAgICAjIFNlZSBidWcgNzQ5MS4KKyAgICAgICAgY2xhc3MgTSh0eXBlKToKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFggPCBNKQorCisgICAgZGVmIHRlc3RfZHluYW1pY3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBjbGFzcyBhdHRyaWJ1dGUgcHJvcGFnYXRpb24uLi4KKyAgICAgICAgY2xhc3MgRChvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBFKEQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBGKEQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBELmZvbyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELmZvbywgMSkKKyAgICAgICAgIyBUZXN0IHRoYXQgZHluYW1pYyBhdHRyaWJ1dGVzIGFyZSBpbmhlcml0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFLmZvbywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGLmZvbywgMSkKKyAgICAgICAgIyBUZXN0IGR5bmFtaWMgaW5zdGFuY2VzCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYSwgImZvb2JhciIpKQorICAgICAgICBDLmZvb2JhciA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmZvb2JhciwgMikKKyAgICAgICAgQy5tZXRob2QgPSBsYW1iZGEgc2VsZjogNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm1ldGhvZCgpLCA0MikKKyAgICAgICAgQy5fX3JlcHJfXyA9IGxhbWJkYSBzZWxmOiAiQygpIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYSksICJDKCkiKQorICAgICAgICBDLl9faW50X18gPSBsYW1iZGEgc2VsZjogMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGEpLCAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5mb29iYXIsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAic3BhbSIpKQorICAgICAgICBkZWYgbXlnZXRhdHRyKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgaWYgbmFtZSA9PSAic3BhbSI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzcGFtIgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgQy5fX2dldGF0dHJfXyA9IG15Z2V0YXR0cgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuc3BhbSwgInNwYW0iKQorICAgICAgICBhLm5ldyA9IDEyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5uZXcsIDEyKQorICAgICAgICBkZWYgbXlzZXRhdHRyKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gInNwYW0iOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKQorICAgICAgICBDLl9fc2V0YXR0cl9fID0gbXlzZXRhdHRyCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGEuc3BhbSA9ICJub3Qgc3BhbSIKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBBdHRyaWJ1dGVFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zcGFtLCAic3BhbSIpCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgZC5mb28gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mb28sIDEpCisKKyAgICAgICAgIyBUZXN0IGhhbmRsaW5nIG9mIGludCpzZXEgYW5kIHNlcSppbnQKKyAgICAgICAgY2xhc3MgSShpbnQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIipJKDIpLCAiYWEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEkoMikqImEiLCAiYWEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIqSSgzKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChJKDMpKjIsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSSgzKSpJKDIpLCA2KQorCisgICAgICAgICMgVGVzdCBoYW5kbGluZyBvZiBsb25nKnNlcSBhbmQgc2VxKmxvbmcKKyAgICAgICAgY2xhc3MgTChsb25nKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIqTCgyTCksICJhYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTCgyTCkqImEiLCAiYWEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIqTCgzKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMKDMpKjIsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTCgzKSpMKDIpLCA2KQorCisgICAgICAgICMgVGVzdCBjb21wYXJpc29uIG9mIGNsYXNzZXMgd2l0aCBkeW5hbWljIG1ldGFjbGFzc2VzCisgICAgICAgIGNsYXNzIGR5bmFtaWNtZXRhY2xhc3ModHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIHNvbWVjbGFzczoKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBkeW5hbWljbWV0YWNsYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc29tZWNsYXNzLCBvYmplY3QpCisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBlcnJvcnMuLi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQyhsaXN0LCBkaWN0KToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImluaGVyaXRhbmNlIGZyb20gYm90aCBsaXN0IGFuZCBkaWN0IHNob3VsZCBiZSBpbGxlZ2FsIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKG9iamVjdCwgTm9uZSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbmhlcml0YW5jZSBmcm9tIG5vbi10eXBlIHNob3VsZCBiZSBpbGxlZ2FsIikKKyAgICAgICAgY2xhc3MgQ2xhc3NpYzoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBDKHR5cGUobGVuKSk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbmhlcml0YW5jZSBmcm9tIENGdW5jdGlvbiBzaG91bGQgYmUgaWxsZWdhbCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IDEKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiX19zbG90c19fID0gMSBzaG91bGQgYmUgaWxsZWdhbCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsxXQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJfX3Nsb3RzX18gPSBbMV0gc2hvdWxkIGJlIGlsbGVnYWwiKQorCisgICAgICAgIGNsYXNzIE0xKHR5cGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBNMih0eXBlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQTEob2JqZWN0KToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNMQorICAgICAgICBjbGFzcyBBMihvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IE0yCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIEIoQTEsIEEyKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImZpbmRpbmcgdGhlIG1vc3QgZGVyaXZlZCBtZXRhY2xhc3Mgc2hvdWxkIGhhdmUgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X2NsYXNzbWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNsYXNzIG1ldGhvZHMuLi4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZvbygqYSk6IHJldHVybiBhCisgICAgICAgICAgICBnb28gPSBjbGFzc21ldGhvZChmb28pCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmdvbygxKSwgKEMsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ29vKDEpLCAoQywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5mb28oMSksIChjLCAxKSkKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZCA9IEQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZ29vKDEpLCAoRCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nb28oMSksIChELCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbygxKSwgKGQsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZm9vKGQsIDEpLCAoZCwgMSkpCisgICAgICAgICMgVGVzdCBmb3IgYSBzcGVjaWZpYyBjcmFzaCAoU0YgYnVnIDUyODEzMikKKyAgICAgICAgZGVmIGYoY2xzLCBhcmcpOiByZXR1cm4gKGNscywgYXJnKQorICAgICAgICBmZiA9IGNsYXNzbWV0aG9kKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmYuX19nZXRfXygwLCBpbnQpKDQyKSwgKGludCwgNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZmLl9fZ2V0X18oMCkoNDIpLCAoaW50LCA0MikpCisKKyAgICAgICAgIyBUZXN0IHN1cGVyKCkgd2l0aCBjbGFzc21ldGhvZHMgKFNGIGJ1ZyA1MzU0NDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5nb28uaW1fc2VsZiwgQykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELmdvby5pbV9zZWxmLCBEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1cGVyKEQsRCkuZ29vLmltX3NlbGYsIEQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VwZXIoRCxkKS5nb28uaW1fc2VsZiwgRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdXBlcihELEQpLmdvbygpLCAoRCwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1cGVyKEQsZCkuZ29vKCksIChELCkpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBhIG5vbi1jYWxsYWJsZSB3aWxsIHJhaXNlCisgICAgICAgIG1ldGggPSBjbGFzc21ldGhvZCgxKS5fX2dldF9fKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGNsYXNzbWV0aG9kKCkgZG9lc24ndCBhbGxvdyBrZXl3b3JkIGFyZ3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY2xhc3NtZXRob2QoZiwga3c9MSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2xhc3NtZXRob2Qgc2hvdWxkbid0IGFjY2VwdCBrZXl3b3JkIGFyZ3MiKQorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidGhlIG1vZHVsZSAneHhzdWJ0eXBlJyBpcyBpbnRlcm5hbCIpCisgICAgZGVmIHRlc3RfY2xhc3NtZXRob2RzX2luX2Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBDLWJhc2VkIGNsYXNzIG1ldGhvZHMuLi4KKyAgICAgICAgaW1wb3J0IHh4c3VidHlwZSBhcyBzcGFtCisgICAgICAgIGEgPSAoMSwgMiwgMykKKyAgICAgICAgZCA9IHsnYWJjJzogMTIzfQorICAgICAgICB4LCBhMSwgZDEgPSBzcGFtLnNwYW1saXN0LmNsYXNzbWV0aCgqYSwgKipkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHNwYW0uc3BhbWxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZDEpCisgICAgICAgIHgsIGExLCBkMSA9IHNwYW0uc3BhbWxpc3QoKS5jbGFzc21ldGgoKmEsICoqZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBzcGFtLnNwYW1saXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQxKQorICAgICAgICBzcGFtX2NtID0gc3BhbS5zcGFtbGlzdC5fX2RpY3RfX1snY2xhc3NtZXRoJ10KKyAgICAgICAgeDIsIGEyLCBkMiA9IHNwYW1fY20oc3BhbS5zcGFtbGlzdCwgKmEsICoqZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Miwgc3BhbS5zcGFtbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMiwgYTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDIsIGQxKQorICAgICAgICBjbGFzcyBTdWJTcGFtKHNwYW0uc3BhbWxpc3QpOiBwYXNzCisgICAgICAgIHgyLCBhMiwgZDIgPSBzcGFtX2NtKFN1YlNwYW0sICphLCAqKmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDIsIFN1YlNwYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTIsIGExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCBkMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc3BhbV9jbSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHNwYW1fY20oc3BhbS5zcGFtbGlzdCgpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzcGFtX2NtKGxpc3QpCisKKyAgICBkZWYgdGVzdF9zdGF0aWNtZXRob2RzKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc3RhdGljIG1ldGhvZHMuLi4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZvbygqYSk6IHJldHVybiBhCisgICAgICAgICAgICBnb28gPSBzdGF0aWNtZXRob2QoZm9vKQorICAgICAgICBjID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5nb28oMSksICgxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5nb28oMSksICgxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5mb28oMSksIChjLCAxLCkpCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELmdvbygxKSwgKDEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdvbygxKSwgKDEsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbygxKSwgKGQsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZm9vKGQsIDEpLCAoZCwgMSkpCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJ0aGUgbW9kdWxlICd4eHN1YnR5cGUnIGlzIGludGVybmFsIikKKyAgICBkZWYgdGVzdF9zdGF0aWNtZXRob2RzX2luX2Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyBDLWJhc2VkIHN0YXRpYyBtZXRob2RzLi4uCisgICAgICAgIGltcG9ydCB4eHN1YnR5cGUgYXMgc3BhbQorICAgICAgICBhID0gKDEsIDIsIDMpCisgICAgICAgIGQgPSB7ImFiYyI6IDEyM30KKyAgICAgICAgeCwgYTEsIGQxID0gc3BhbS5zcGFtbGlzdC5zdGF0aWNtZXRoKCphLCAqKmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkMSkKKyAgICAgICAgeCwgYTEsIGQyID0gc3BhbS5zcGFtbGlzdCgpLnN0YXRpY21ldGgoKmEsICoqZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGQxKQorCisgICAgZGVmIHRlc3RfY2xhc3NpYyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNsYXNzaWMgY2xhc3Nlcy4uLgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIGZvbygqYSk6IHJldHVybiBhCisgICAgICAgICAgICBnb28gPSBjbGFzc21ldGhvZChmb28pCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmdvbygxKSwgKEMsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ29vKDEpLCAoQywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5mb28oMSksIChjLCAxKSkKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZCA9IEQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZ29vKDEpLCAoRCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nb28oMSksIChELCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbygxKSwgKGQsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuZm9vKGQsIDEpLCAoZCwgMSkpCisgICAgICAgIGNsYXNzIEU6ICMgKm5vdCogc3ViY2xhc3NpbmcgZnJvbSBDCisgICAgICAgICAgICBmb28gPSBDLmZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUoKS5mb28sIEMuZm9vKSAjIGkuZS4sIHVuYm91bmQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoQy5mb28uX19nZXRfXyhDKCkpKS5zdGFydHN3aXRoKCI8Ym91bmQgbWV0aG9kICIpKQorCisgICAgZGVmIHRlc3RfY29tcGF0dHIoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBjb21wdXRlZCBhdHRyaWJ1dGVzLi4uCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGNsYXNzIGNvbXB1dGVkX2F0dHJpYnV0ZShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZXQsIHNldD1Ob25lLCBkZWxldGU9Tm9uZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX19nZXQgPSBnZXQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3NldCA9IHNldAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fZGVsZXRlID0gZGVsZXRlCisgICAgICAgICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCB0eXBlPU5vbmUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2dldChvYmopCisgICAgICAgICAgICAgICAgZGVmIF9fc2V0X18oc2VsZiwgb2JqLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fc2V0KG9iaiwgdmFsdWUpCisgICAgICAgICAgICAgICAgZGVmIF9fZGVsZXRlX18oc2VsZiwgb2JqKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19kZWxldGUob2JqKQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuX194ID0gMAorICAgICAgICAgICAgZGVmIF9fZ2V0X3goc2VsZik6CisgICAgICAgICAgICAgICAgeCA9IHNlbGYuX194CisgICAgICAgICAgICAgICAgc2VsZi5fX3ggPSB4KzEKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgZGVmIF9fc2V0X3goc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi5fX3ggPSB4CisgICAgICAgICAgICBkZWYgX19kZWxldGVfeChzZWxmKToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fX3gKKyAgICAgICAgICAgIHggPSBjb21wdXRlZF9hdHRyaWJ1dGUoX19nZXRfeCwgX19zZXRfeCwgX19kZWxldGVfeCkKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDEpCisgICAgICAgIGEueCA9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS54LCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDExKQorICAgICAgICBkZWwgYS54CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihhLCAneCcpLCAwKQorCisgICAgZGVmIHRlc3RfbmV3c2xvdHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBfX25ld19fIHNsb3Qgb3ZlcnJpZGUuLi4KKyAgICAgICAgY2xhc3MgQyhsaXN0KToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CisgICAgICAgICAgICAgICAgc2VsZiA9IGxpc3QuX19uZXdfXyhjbHMpCisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IHNlbGYuZm9vICsgMgorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5mb28sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2NsYXNzX18sIEMpCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGIgPSBEKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZvbywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLl9fY2xhc3NfXywgRCkKKworICAgIGRlZiB0ZXN0X2FsdG1ybyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG1ybygpIGFuZCBvdmVycmlkaW5nIGl0Li4uCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmKHNlbGYpOiByZXR1cm4gIkEiCisgICAgICAgIGNsYXNzIEIoQSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEMoQSk6CisgICAgICAgICAgICBkZWYgZihzZWxmKTogcmV0dXJuICJDIgorICAgICAgICBjbGFzcyBEKEIsIEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQubXJvKCksIFtELCBCLCBDLCBBLCBvYmplY3RdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEQuX19tcm9fXywgKEQsIEIsIEMsIEEsIG9iamVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRCgpLmYoKSwgIkMiKQorCisgICAgICAgIGNsYXNzIFBlcnZlcnNlTWV0YVR5cGUodHlwZSk6CisgICAgICAgICAgICBkZWYgbXJvKGNscyk6CisgICAgICAgICAgICAgICAgTCA9IHR5cGUubXJvKGNscykKKyAgICAgICAgICAgICAgICBMLnJldmVyc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiBMCisgICAgICAgIGNsYXNzIFgoRCxCLEMsQSk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gUGVydmVyc2VNZXRhVHlwZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguX19tcm9fXywgKG9iamVjdCwgQSwgQywgQiwgRCwgWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpLmYoKSwgIkEiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgICAgICBjbGFzcyBfX21ldGFjbGFzc19fKHR5cGUpOgorICAgICAgICAgICAgICAgICAgICBkZWYgbXJvKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzZWxmLCBkaWN0LCBvYmplY3RdCisgICAgICAgICAgICAjIEluIENQeXRob24sIHRoZSBjbGFzcyBjcmVhdGlvbiBhYm92ZSBhbHJlYWR5IHJhaXNlcworICAgICAgICAgICAgIyBUeXBlRXJyb3IsIGFzIGEgcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBmYWN0IHRoYXQKKyAgICAgICAgICAgICMgaW5zdGFuY2VzIG9mIFggd291bGQgc2VnZmF1bHQgaXQuICBJbiBvdGhlciBQeXRob24KKyAgICAgICAgICAgICMgaW1wbGVtZW50YXRpb25zIGl0IHdvdWxkIGJlIG9rIHRvIGxldCB0aGUgY2xhc3MgWAorICAgICAgICAgICAgIyBiZSBjcmVhdGVkLCBidXQgaW5zdGVhZCBnZXQgYSBjbGVhbiBUeXBlRXJyb3Igb24gdGhlCisgICAgICAgICAgICAjIF9fc2V0aXRlbV9fIGJlbG93LgorICAgICAgICAgICAgeCA9IG9iamVjdC5fX25ld19fKFgpCisgICAgICAgICAgICB4WzVdID0gNgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkZXZpb3VzIG1ybygpIHJldHVybiBub3QgY2F1Z2h0IikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICAgICAgY2xhc3MgX19tZXRhY2xhc3NfXyh0eXBlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIG1ybyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMV0KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm9uLWNsYXNzIG1ybygpIHJldHVybiBub3QgY2F1Z2h0IikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICAgICAgY2xhc3MgX19tZXRhY2xhc3NfXyh0eXBlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIG1ybyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vbi1zZXF1ZW5jZSBtcm8oKSByZXR1cm4gbm90IGNhdWdodCIpCisKKyAgICBkZWYgdGVzdF9vdmVybG9hZGluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG9wZXJhdG9yIG92ZXJsb2FkaW5nLi4uCisKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgIkludGVybWVkaWF0ZSBjbGFzcyBiZWNhdXNlIG9iamVjdCBkb2Vzbid0IGhhdmUgYSBfX3NldGF0dHJfXyIKKworICAgICAgICBjbGFzcyBDKEIpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gImZvbyI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoImdldGF0dHIiLCBuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gImZvbyI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0YXR0ciA9IChuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQi5fX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSkKKyAgICAgICAgICAgIGRlZiBfX2RlbGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICJmb28iOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGF0dHIgPSBuYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEIuX19kZWxhdHRyX18oc2VsZiwgbmFtZSkKKworICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuICgiZ2V0aXRlbSIsIGtleSkKKyAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnNldGl0ZW0gPSAoa2V5LCB2YWx1ZSkKKyAgICAgICAgICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHNlbGYuZGVsaXRlbSA9IGtleQorCisgICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICAgICAgICAgIHJldHVybiAoImdldHNsaWNlIiwgaSwgaikKKyAgICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0c2xpY2UgPSAoaSwgaiwgdmFsdWUpCisgICAgICAgICAgICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICAgICAgICAgIHNlbGYuZGVsc2xpY2UgPSAoaSwgaikKKworICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5mb28sICgiZ2V0YXR0ciIsICJmb28iKSkKKyAgICAgICAgYS5mb28gPSAxMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuc2V0YXR0ciwgKCJmb28iLCAxMikpCisgICAgICAgIGRlbCBhLmZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZGVsYXR0ciwgImZvbyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEyXSwgKCJnZXRpdGVtIiwgMTIpKQorICAgICAgICBhWzEyXSA9IDIxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5zZXRpdGVtLCAoMTIsIDIxKSkKKyAgICAgICAgZGVsIGFbMTJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5kZWxpdGVtLCAxMikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMDoxMF0sICgiZ2V0c2xpY2UiLCAwLCAxMCkpCisgICAgICAgIGFbMDoxMF0gPSAiZm9vIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuc2V0c2xpY2UsICgwLCAxMCwgImZvbyIpKQorICAgICAgICBkZWwgYVswOjEwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZGVsc2xpY2UsICgwLCAxMCkpCisKKyAgICBkZWYgdGVzdF9tZXRob2RzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbWV0aG9kcy4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54CisgICAgICAgIGMxID0gQygxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLmZvbygpLCAxKQorICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgYm9vID0gQy5mb28KKyAgICAgICAgICAgIGdvbyA9IGMxLmZvbworICAgICAgICBkMiA9IEQoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5mb28oKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5ib28oKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5nb28oKSwgMSkKKyAgICAgICAgY2xhc3MgRShvYmplY3QpOgorICAgICAgICAgICAgZm9vID0gQy5mb28KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFKCkuZm9vLCBDLmZvbykgIyBpLmUuLCB1bmJvdW5kCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKEMuZm9vLl9fZ2V0X18oQygxKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCisKKyAgICBkZWYgdGVzdF9zcGVjaWFsX21ldGhvZF9sb29rdXAoc2VsZik6CisgICAgICAgICMgVGhlIGxvb2t1cCBvZiBzcGVjaWFsIG1ldGhvZHMgYnlwYXNzZXMgX19nZXRhdHRyX18gYW5kCisgICAgICAgICMgX19nZXRhdHRyaWJ1dGVfXywgYnV0IHRoZXkgc3RpbGwgY2FuIGJlIGRlc2NyaXB0b3JzLgorCisgICAgICAgIGRlZiBydW5fY29udGV4dChtYW5hZ2VyKToKKyAgICAgICAgICAgIHdpdGggbWFuYWdlcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBpZGVuKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZGVmIGhlbGxvKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICJoZWxsbyIKKyAgICAgICAgZGVmIGVtcHR5X3NlcShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBkZWYgemVybyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGRlZiBjb21wbGV4X251bShzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAxagorICAgICAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgZGVmIHJldHVybl90cnVlKHNlbGYsIHRoaW5nPU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZGVmIGRvX2lzaW5zdGFuY2Uob2JqKToKKyAgICAgICAgICAgIHJldHVybiBpc2luc3RhbmNlKGludCwgb2JqKQorICAgICAgICBkZWYgZG9faXNzdWJjbGFzcyhvYmopOgorICAgICAgICAgICAgcmV0dXJuIGlzc3ViY2xhc3MoaW50LCBvYmopCisgICAgICAgIGRlZiBzd2FsbG93KCphcmdzKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGRvX2RpY3RfbWlzc2luZyhjaGVja2VyKToKKyAgICAgICAgICAgIGNsYXNzIERpY3RTdWIoY2hlY2tlci5fX2NsYXNzX18sIGRpY3QpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRGljdFN1YigpWyJoaSJdLCA0KQorICAgICAgICBkZWYgc29tZV9udW1iZXIoc2VsZl8sIGtleSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleSwgImhpIikKKyAgICAgICAgICAgIHJldHVybiA0CisgICAgICAgIGRlZiBmb3JtYXRfaW1wbChzZWxmLCBzcGVjKToKKyAgICAgICAgICAgIHJldHVybiAiaGVsbG8iCisKKyAgICAgICAgIyBJdCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgZXZlcnkgc3BlY2lhbCBtZXRob2QgdGVzdGVkIGhlcmUsIGJ1dCBJJ20KKyAgICAgICAgIyBvbmx5IGxpc3RpbmcgdGhlIG9uZXMgSSBjYW4gcmVtZW1iZXIgb3V0c2lkZSBvZiB0eXBlb2JqZWN0LmMsIHNpbmNlIGl0CisgICAgICAgICMgZG9lcyBpdCByaWdodC4KKyAgICAgICAgc3BlY2lhbHMgPSBbCisgICAgICAgICAgICAoIl9fdW5pY29kZV9fIiwgdW5pY29kZSwgaGVsbG8sIHNldCgpLCB7fSksCisgICAgICAgICAgICAoIl9fcmV2ZXJzZWRfXyIsIHJldmVyc2VkLCBlbXB0eV9zZXEsIHNldCgpLCB7fSksCisgICAgICAgICAgICAoIl9fbGVuZ3RoX2hpbnRfXyIsIGxpc3QsIHplcm8sIHNldCgpLAorICAgICAgICAgICAgIHsiX19pdGVyX18iIDogaWRlbiwgIm5leHQiIDogc3RvcH0pLAorICAgICAgICAgICAgKCJfX3NpemVvZl9fIiwgc3lzLmdldHNpemVvZiwgemVybywgc2V0KCksIHt9KSwKKyAgICAgICAgICAgICgiX19pbnN0YW5jZWNoZWNrX18iLCBkb19pc2luc3RhbmNlLCByZXR1cm5fdHJ1ZSwgc2V0KCksIHt9KSwKKyAgICAgICAgICAgICgiX19taXNzaW5nX18iLCBkb19kaWN0X21pc3NpbmcsIHNvbWVfbnVtYmVyLAorICAgICAgICAgICAgIHNldCgoIl9fY2xhc3NfXyIsKSksIHt9KSwKKyAgICAgICAgICAgICgiX19zdWJjbGFzc2NoZWNrX18iLCBkb19pc3N1YmNsYXNzLCByZXR1cm5fdHJ1ZSwKKyAgICAgICAgICAgICBzZXQoKCJfX2Jhc2VzX18iLCkpLCB7fSksCisgICAgICAgICAgICAoIl9fZW50ZXJfXyIsIHJ1bl9jb250ZXh0LCBpZGVuLCBzZXQoKSwgeyJfX2V4aXRfXyIgOiBzd2FsbG93fSksCisgICAgICAgICAgICAoIl9fZXhpdF9fIiwgcnVuX2NvbnRleHQsIHN3YWxsb3csIHNldCgpLCB7Il9fZW50ZXJfXyIgOiBpZGVufSksCisgICAgICAgICAgICAoIl9fY29tcGxleF9fIiwgY29tcGxleCwgY29tcGxleF9udW0sIHNldCgpLCB7fSksCisgICAgICAgICAgICAoIl9fZm9ybWF0X18iLCBmb3JtYXQsIGZvcm1hdF9pbXBsLCBzZXQoKSwge30pLAorICAgICAgICAgICAgKCJfX2Rpcl9fIiwgZGlyLCBlbXB0eV9zZXEsIHNldCgpLCB7fSksCisgICAgICAgICAgICBdCisKKyAgICAgICAgY2xhc3MgQ2hlY2tlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIsIHRlc3Q9c2VsZik6CisgICAgICAgICAgICAgICAgdGVzdC5mYWlsKCJfX2dldGF0dHJfXyBjYWxsZWQgd2l0aCB7MH0iLmZvcm1hdChhdHRyKSkKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIGF0dHIsIHRlc3Q9c2VsZik6CisgICAgICAgICAgICAgICAgaWYgYXR0ciBub3QgaW4gb2s6CisgICAgICAgICAgICAgICAgICAgIHRlc3QuZmFpbCgiX19nZXRhdHRyaWJ1dGVfXyBjYWxsZWQgd2l0aCB7MH0iLmZvcm1hdChhdHRyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgYXR0cikKKyAgICAgICAgY2xhc3MgU3BlY2lhbERlc2NyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wbCk6CisgICAgICAgICAgICAgICAgc2VsZi5pbXBsID0gaW1wbAorICAgICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCBvd25lcik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgxKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmltcGwuX19nZXRfXyhvYmosIG93bmVyKQorICAgICAgICBjbGFzcyBNeUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBFcnJEZXNjcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0X18oc2VsZiwgb2JqLCBvd25lcik6CisgICAgICAgICAgICAgICAgcmFpc2UgTXlFeGNlcHRpb24KKworICAgICAgICBmb3IgbmFtZSwgcnVubmVyLCBtZXRoX2ltcGwsIG9rLCBlbnYgaW4gc3BlY2lhbHM6CisgICAgICAgICAgICBjbGFzcyBYKENoZWNrZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZvciBhdHRyLCBvYmogaW4gZW52Lml0ZXJpdGVtcygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIoWCwgYXR0ciwgb2JqKQorICAgICAgICAgICAgc2V0YXR0cihYLCBuYW1lLCBtZXRoX2ltcGwpCisgICAgICAgICAgICBydW5uZXIoWCgpKQorCisgICAgICAgICAgICByZWNvcmQgPSBbXQorICAgICAgICAgICAgY2xhc3MgWChDaGVja2VyKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgYXR0ciwgb2JqIGluIGVudi5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKFgsIGF0dHIsIG9iaikKKyAgICAgICAgICAgIHNldGF0dHIoWCwgbmFtZSwgU3BlY2lhbERlc2NyKG1ldGhfaW1wbCkpCisgICAgICAgICAgICBydW5uZXIoWCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFsxXSwgbmFtZSkKKworICAgICAgICAgICAgY2xhc3MgWChDaGVja2VyKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmb3IgYXR0ciwgb2JqIGluIGVudi5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKFgsIGF0dHIsIG9iaikKKyAgICAgICAgICAgIHNldGF0dHIoWCwgbmFtZSwgRXJyRGVzY3IoKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBydW5uZXIoWCgpKQorICAgICAgICAgICAgZXhjZXB0IE15RXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ7MCFyfSBkaWRuJ3QgcmFpc2UiLmZvcm1hdChuYW1lKSkKKworICAgIGRlZiB0ZXN0X3NwZWNpYWxzKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc3BlY2lhbCBvcGVyYXRvcnMuLi4KKyAgICAgICAgIyBUZXN0IG9wZXJhdG9ycyBsaWtlIF9faGFzaF9fIGZvciB3aGljaCBhIGJ1aWx0LWluIGRlZmF1bHQgZXhpc3RzCisKKyAgICAgICAgIyBUZXN0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBzdGF0aWMgY2xhc3NlcworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgMCA8PSBpIDwgMTA6IHJldHVybiBpCisgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgICAgICBjMSA9IEMoKQorICAgICAgICBjMiA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBjMSkgIyBXaGF0PworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMxKSwgaWQoYzIpKQorICAgICAgICBoYXNoKGMxKQorICAgICAgICBoYXNoKGMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChjMSwgYzIpLCBjbXAoaWQoYzEpLCBpZChjMikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLCBjMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMxICE9IGMyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGMxICE9IGMxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGMxID09IGMyKQorICAgICAgICAjIE5vdGUgdGhhdCB0aGUgbW9kdWxlIG5hbWUgYXBwZWFycyBpbiBzdHIvcmVwciwgYW5kIHRoYXQgdmFyaWVzCisgICAgICAgICMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhpcyB0ZXN0IGlzIHJ1biBzdGFuZGFsb25lIG9yIGZyb20gYSBmcmFtZXdvcmsuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoYzEpLmZpbmQoJ0Mgb2JqZWN0IGF0ICcpID49IDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGMxKSwgcmVwcihjMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oLTEsIGMxKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGksIGMxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEwLCBjMSkKKyAgICAgICAgIyBUZXN0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBkeW5hbWljIGNsYXNzZXMKKyAgICAgICAgY2xhc3MgRChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIDAgPD0gaSA8IDEwOiByZXR1cm4gaQorICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgZDEgPSBEKCkKKyAgICAgICAgZDIgPSBEKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBub3QgZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoZDEpLCBpZChkMikpCisgICAgICAgIGhhc2goZDEpCisgICAgICAgIGhhc2goZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGQxLCBkMiksIGNtcChpZChkMSksIGlkKGQyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIGQxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGQxLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkMSAhPSBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkMSA9PSBkMikKKyAgICAgICAgIyBOb3RlIHRoYXQgdGhlIG1vZHVsZSBuYW1lIGFwcGVhcnMgaW4gc3RyL3JlcHIsIGFuZCB0aGF0IHZhcmllcworICAgICAgICAjIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgdGVzdCBpcyBydW4gc3RhbmRhbG9uZSBvciBmcm9tIGEgZnJhbWV3b3JrLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKGQxKS5maW5kKCdEIG9iamVjdCBhdCAnKSA+PSAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkMSksIHJlcHIoZDEpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKC0xLCBkMSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpLCBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigxMCwgZDEpCisgICAgICAgICMgVGVzdCBvdmVycmlkZGVuIGJlaGF2aW9yIGZvciBzdGF0aWMgY2xhc3NlcworICAgICAgICBjbGFzcyBQcm94eShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbm90IG5vdCBzZWxmLngKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaChzZWxmLngpCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54ID09IG90aGVyCisgICAgICAgICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi54ICE9IG90aGVyCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLngsIG90aGVyLngpCisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIlByb3h5OiVzIiAlIHNlbGYueAorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiUHJveHkoJXIpIiAlIHNlbGYueAorICAgICAgICAgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlIGluIHNlbGYueAorICAgICAgICBwMCA9IFByb3h5KDApCisgICAgICAgIHAxID0gUHJveHkoMSkKKyAgICAgICAgcF8xID0gUHJveHkoLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IHAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocDApLCBoYXNoKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAwLCBwMCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwMCwgcDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcDAgIT0gcDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm90IHAwLCBwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocDAsIHAxKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAwLCBwMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAwLCBwXzEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihwMCksICJQcm94eTowIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHAwKSwgIlByb3h5KDApIikKKyAgICAgICAgcDEwID0gUHJveHkocmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKC0xLCBwMTApCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgcDEwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEwLCBwMTApCisgICAgICAgICMgVGVzdCBvdmVycmlkZGVuIGJlaGF2aW9yIGZvciBkeW5hbWljIGNsYXNzZXMKKyAgICAgICAgY2xhc3MgRFByb3h5KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBub3Qgbm90IHNlbGYueAorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoKHNlbGYueCkKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnggPT0gb3RoZXIKKyAgICAgICAgICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnggIT0gb3RoZXIKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYueCwgb3RoZXIueCkKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiRFByb3h5OiVzIiAlIHNlbGYueAorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiRFByb3h5KCVyKSIgJSBzZWxmLngKKyAgICAgICAgICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbiBzZWxmLngKKyAgICAgICAgcDAgPSBEUHJveHkoMCkKKyAgICAgICAgcDEgPSBEUHJveHkoMSkKKyAgICAgICAgcF8xID0gRFByb3h5KC0xKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHAwKSwgaGFzaCgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMCwgcDApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocDAsIHAxKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5vdCBwMCwgcDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm90IHAwLCBwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAocDAsIHAxKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAwLCBwMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAwLCBwXzEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihwMCksICJEUHJveHk6MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihwMCksICJEUHJveHkoMCkiKQorICAgICAgICBwMTAgPSBEUHJveHkocmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKC0xLCBwMTApCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgcDEwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEwLCBwMTApCisKKyAgICAgICAgIyBTYWZldHkgdGVzdCBmb3IgX19jbXBfXworICAgICAgICBkZWYgdW5zYWZlY21wKGEsIGIpOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoYSwgJ19fY21wX18nKToKKyAgICAgICAgICAgICAgICByZXR1cm4gICAjIHNvbWUgdHlwZXMgZG9uJ3QgaGF2ZSBhIF9fY21wX18gYW55IG1vcmUgKHNvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgYW55IG1vcmUpLCBvciBtYXliZSB0aGV5CisgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXZlciBoYWQgYSBfX2NtcF9fIGF0IGFsbCwgZS5nLiBpbiBQeVB5CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYS5fX2NsYXNzX18uX19jbXBfXyhhLCBiKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGFsbG93ICVzLl9fY21wX18oJXIsICVyKSIgJSAoCisgICAgICAgICAgICAgICAgICAgIGEuX19jbGFzc19fLCBhLCBiKSkKKworICAgICAgICB1bnNhZmVjbXAodSIxMjMiLCAiMTIzIikKKyAgICAgICAgdW5zYWZlY21wKCIxMjMiLCB1IjEyMyIpCisgICAgICAgIHVuc2FmZWNtcCgxLCAxLjApCisgICAgICAgIHVuc2FmZWNtcCgxLjAsIDEpCisgICAgICAgIHVuc2FmZWNtcCgxLCAxTCkKKyAgICAgICAgdW5zYWZlY21wKDFMLCAxKQorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgiY3VzdG9tIGxvZ2ljIGZvciBwcmludGluZyB0byByZWFsIGZpbGUgb2JqZWN0cyIpCisgICAgZGVmIHRlc3RfcmVjdXJzaW9uc18xKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcmVjdXJzaW9uIGNoZWNrcyAuLi4KKyAgICAgICAgY2xhc3MgTGV0dGVyKHN0cik6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGxldHRlcik6CisgICAgICAgICAgICAgICAgaWYgbGV0dGVyID09ICdFUFMnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyLl9fbmV3X18oY2xzKQorICAgICAgICAgICAgICAgIHJldHVybiBzdHIuX19uZXdfXyhjbHMsIGxldHRlcikKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0VQUycKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAjIHN5cy5zdGRvdXQgbmVlZHMgdG8gYmUgdGhlIG9yaWdpbmFsIHRvIHRyaWdnZXIgdGhlIHJlY3Vyc2lvbiBidWcKKyAgICAgICAgdGVzdF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHN5cy5zdGRvdXQgPSB0ZXN0X3N1cHBvcnQuZ2V0X29yaWdpbmFsX3N0ZG91dCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbm90aGluZyBzaG91bGQgYWN0dWFsbHkgYmUgcHJpbnRlZCwgdGhpcyBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICBwcmludCBMZXR0ZXIoJ3cnKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBhIFJ1bnRpbWVFcnJvciBmb3IgcHJpbnQgcmVjdXJzaW9uIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSB0ZXN0X3N0ZG91dAorCisgICAgZGVmIHRlc3RfcmVjdXJzaW9uc18yKHNlbGYpOgorICAgICAgICAjIEJ1ZyAjMTIwMjUzMy4KKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBBLl9fbXVsX18gPSB0eXBlcy5NZXRob2RUeXBlKGxhbWJkYSBzZWxmLCB4OiBzZWxmICogeCwgTm9uZSwgQSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgQSgpKjIKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgYSBSdW50aW1lRXJyb3IiKQorCisgICAgZGVmIHRlc3Rfd2Vha3JlZnMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyB3ZWFrIHJlZmVyZW5jZXMuLi4KKyAgICAgICAgaW1wb3J0IHdlYWtyZWYKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjID0gQygpCisgICAgICAgIHIgPSB3ZWFrcmVmLnJlZihjKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIoKSwgYykKKyAgICAgICAgZGVsIGMKKyAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIoKSwgTm9uZSkKKyAgICAgICAgZGVsIHIKKyAgICAgICAgY2xhc3MgTm9XZWFrKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ2ZvbyddCisgICAgICAgIG5vID0gTm9XZWFrKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2Vha3JlZi5yZWYobm8pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIobXNnKS5maW5kKCJ3ZWFrIHJlZmVyZW5jZSIpID49IDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndlYWtyZWYucmVmKG5vKSBzaG91bGQgYmUgaWxsZWdhbCIpCisgICAgICAgIGNsYXNzIFdlYWsob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnZm9vJywgJ19fd2Vha3JlZl9fJ10KKyAgICAgICAgeWVzID0gV2VhaygpCisgICAgICAgIHIgPSB3ZWFrcmVmLnJlZih5ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocigpLCB5ZXMpCisgICAgICAgIGRlbCB5ZXMKKyAgICAgICAgdGVzdF9zdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIoKSwgTm9uZSkKKyAgICAgICAgZGVsIHIKKworICAgIGRlZiB0ZXN0X3Byb3BlcnRpZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBwcm9wZXJ0eS4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0eChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3gKKyAgICAgICAgICAgIGRlZiBzZXR4KHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9feCA9IHZhbHVlCisgICAgICAgICAgICBkZWYgZGVseChzZWxmKToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fX3gKKyAgICAgICAgICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4LCBkZWx4LCBkb2M9IkknbSB0aGUgeCBwcm9wZXJ0eS4iKQorICAgICAgICBhID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAieCIpKQorICAgICAgICBhLnggPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX0NfX3gsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEueCwgNDIpCisgICAgICAgIGRlbCBhLngKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJ4IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiX0NfX3giKSkKKyAgICAgICAgQy54Ll9fc2V0X18oYSwgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMueC5fX2dldF9fKGEpLCAxMDApCisgICAgICAgIEMueC5fX2RlbGV0ZV9fKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAieCIpKQorCisgICAgICAgIHJhdyA9IEMuX19kaWN0X19bJ3gnXQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmF3LCBwcm9wZXJ0eSkKKworICAgICAgICBhdHRycyA9IGRpcihyYXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9fZG9jX18iLCBhdHRycykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZmdldCIsIGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEluKCJmc2V0IiwgYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImZkZWwiLCBhdHRycykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhdy5fX2RvY19fLCAiSSdtIHRoZSB4IHByb3BlcnR5LiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyYXcuZmdldCBpcyBDLl9fZGljdF9fWydnZXR4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyYXcuZnNldCBpcyBDLl9fZGljdF9fWydzZXR4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyYXcuZmRlbCBpcyBDLl9fZGljdF9fWydkZWx4J10pCisKKyAgICAgICAgZm9yIGF0dHIgaW4gIl9fZG9jX18iLCAiZmdldCIsICJmc2V0IiwgImZkZWwiOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNldGF0dHIocmF3LCBhdHRyLCA0MikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIG1zZzoKKyAgICAgICAgICAgICAgICBpZiBzdHIobXNnKS5maW5kKCdyZWFkb25seScpIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3aGVuIHNldHRpbmcgcmVhZG9ubHkgYXR0ciAlciBvbiBhIHByb3BlcnR5LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvdCB1bmV4cGVjdGVkIFR5cGVFcnJvciBtc2cgJXIiICUgKGF0dHIsIHN0cihtc2cpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IgZnJvbSB0cnlpbmcgdG8gc2V0IHJlYWRvbmx5ICVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyIG9uIGEgcHJvcGVydHkiICUgYXR0cikKKworICAgICAgICBjbGFzcyBEKG9iamVjdCk6CisgICAgICAgICAgICBfX2dldGl0ZW1fXyA9IHByb3BlcnR5KGxhbWJkYSBzOiAxLzApCisKKyAgICAgICAgZCA9IEQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiBkOgorICAgICAgICAgICAgICAgIHN0cihpKQorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFplcm9EaXZpc2lvbkVycm9yIGZyb20gYmFkIHByb3BlcnR5IikKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X3Byb3BlcnRpZXNfZG9jX2F0dHJpYihzZWxmKToKKyAgICAgICAgY2xhc3MgRShvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldHRlcihzZWxmKToKKyAgICAgICAgICAgICAgICAiZ2V0dGVyIG1ldGhvZCIKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgZGVmIHNldHRlcihzZWxmXywgdmFsdWUpOgorICAgICAgICAgICAgICAgICJzZXR0ZXIgbWV0aG9kIgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHByb3AgPSBwcm9wZXJ0eShnZXR0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3AuX19kb2NfXywgImdldHRlciBtZXRob2QiKQorICAgICAgICAgICAgcHJvcDIgPSBwcm9wZXJ0eShmc2V0PXNldHRlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvcDIuX19kb2NfXywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3Rlc3RjYXBpX25vX3NlZ2ZhdWx0KHNlbGYpOgorICAgICAgICAjIHRoaXMgc2VnZmF1bHRlZCBpbiAyLjViMgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgICAgICBwID0gcHJvcGVydHkoX3Rlc3RjYXBpLnRlc3Rfd2l0aF9kb2NzdHJpbmcpCisKKyAgICBkZWYgdGVzdF9wcm9wZXJ0aWVzX3BsdXMoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGZvbyA9IHByb3BlcnR5KGRvYz0iaGVsbG8iKQorICAgICAgICAgICAgQGZvby5nZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZvbworICAgICAgICAgICAgQGZvby5zZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZvbyA9IGFicyh2YWx1ZSkKKyAgICAgICAgICAgIEBmb28uZGVsZXRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fZm9vCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmZvby5fX2RvY19fLCAiaGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYywgImZvbyIpKQorICAgICAgICBjLmZvbyA9IC00MgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihjLCAnX2ZvbycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuX2ZvbywgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5mb28sIDQyKQorICAgICAgICBkZWwgYy5mb28KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGMsICdfZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihjLCAiZm9vIikpCisKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIEBDLmZvby5kZWxldGVyCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2ZvbworICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBkID0gRCgpCisgICAgICAgIGQuZm9vID0gMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbywgMjQpCisgICAgICAgIGRlbCBkLmZvbworICAgICAgICBkZWwgZC5mb28KKworICAgICAgICBjbGFzcyBFKG9iamVjdCk6CisgICAgICAgICAgICBAcHJvcGVydHkKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ZvbworICAgICAgICAgICAgQGZvby5zZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgQGZvby5zZXR0ZXIKKyAgICAgICAgICAgIGRlZiBmb28oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZvbyA9IGFicyh2YWx1ZSkKKyAgICAgICAgICAgIEBmb28uZGVsZXRlcgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fZm9vCisKKyAgICAgICAgZSA9IEUoKQorICAgICAgICBlLmZvbyA9IC00MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZm9vLCA0MikKKyAgICAgICAgZGVsIGUuZm9vCisKKyAgICAgICAgY2xhc3MgRihFKToKKyAgICAgICAgICAgIEBFLmZvby5kZWxldGVyCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLl9mb28KKyAgICAgICAgICAgIEBmb28uc2V0dGVyCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLl9mb28gPSBtYXgoMCwgdmFsdWUpCisgICAgICAgIGYgPSBGKCkKKyAgICAgICAgZi5mb28gPSAtMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmZvbywgMCkKKyAgICAgICAgZGVsIGYuZm9vCisKKyAgICBkZWYgdGVzdF9kaWN0X2NvbnN0cnVjdG9ycyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGRpY3QgY29uc3RydWN0b3IgLi4uCisgICAgICAgIGQgPSBkaWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7fSkKKyAgICAgICAgZCA9IGRpY3Qoe30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwge30pCisgICAgICAgIGQgPSBkaWN0KHsxOiAyLCAnYSc6ICdiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgezE6IDIsICdhJzogJ2InfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KGQuaXRlbXMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGljdChkLml0ZXJpdGVtcygpKSkKKyAgICAgICAgZCA9IGRpY3QoeydvbmUnOjEsICd0d28nOjJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIGRpY3Qob25lPTEsIHR3bz0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KCoqZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGljdCh7Im9uZSI6IDF9LCB0d289MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGljdChbKCJ0d28iLCAyKV0sIG9uZT0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KFsoIm9uZSIsIDEwMCksICgidHdvIiwgMjAwKV0sICoqZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGljdCgqKmQpKQorCisgICAgICAgIGZvciBiYWRhcmcgaW4gMCwgMEwsIDBqLCAiMCIsIFswXSwgKDAsKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkaWN0KGJhZGFyZykKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgaWYgYmFkYXJnID09ICIwIjoKKyAgICAgICAgICAgICAgICAgICAgIyBJdCdzIGEgc2VxdWVuY2UsIGFuZCBpdHMgZWxlbWVudHMgYXJlIGFsc28gc2VxdWVuY2VzIChnb3R0YQorICAgICAgICAgICAgICAgICAgICAjIGxvdmUgc3RyaW5ncyA8d2luaz4pLCBidXQgdGhleSBhcmVuJ3Qgb2YgbGVuZ3RoIDIsIHNvIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgIyBvbmUgc2VlbWVkIGJldHRlciBhcyBhIFZhbHVlRXJyb3IgdGhhbiBhIFR5cGVFcnJvci4KKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gVHlwZUVycm9yIGZyb20gZGljdCglcikiICUgYmFkYXJnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIFR5cGVFcnJvciBmcm9tIGRpY3QoJXIpIiAlIGJhZGFyZykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkaWN0KHt9LCB7fSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gVHlwZUVycm9yIGZyb20gZGljdCh7fSwge30pIikKKworICAgICAgICBjbGFzcyBNYXBwaW5nOgorICAgICAgICAgICAgIyBMYWNrcyBhIC5rZXlzKCkgbWV0aG9kOyB3aWxsIGJlIGFkZGVkIGxhdGVyLgorICAgICAgICAgICAgZGljdCA9IHsxOjIsIDM6NCwgJ2EnOjFqfQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpY3QoTWFwcGluZygpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBUeXBlRXJyb3IgZnJvbSBkaWN0KGluY29tcGxldGUgbWFwcGluZykiKQorCisgICAgICAgIE1hcHBpbmcua2V5cyA9IGxhbWJkYSBzZWxmOiBzZWxmLmRpY3Qua2V5cygpCisgICAgICAgIE1hcHBpbmcuX19nZXRpdGVtX18gPSBsYW1iZGEgc2VsZiwgaTogc2VsZi5kaWN0W2ldCisgICAgICAgIGQgPSBkaWN0KE1hcHBpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBNYXBwaW5nLmRpY3QpCisKKyAgICAgICAgIyBJbml0IGZyb20gc2VxdWVuY2Ugb2YgaXRlcmFibGUgb2JqZWN0cywgZWFjaCBwcm9kdWNpbmcgYSAyLXNlcXVlbmNlLgorICAgICAgICBjbGFzcyBBZGRyZXNzQm9va0VudHJ5OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0LCBsYXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLmZpcnN0ID0gZmlyc3QKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3QgPSBsYXN0CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXIoW3NlbGYuZmlyc3QsIHNlbGYubGFzdF0pCisKKyAgICAgICAgZCA9IGRpY3QoW0FkZHJlc3NCb29rRW50cnkoJ1RpbScsICdXYXJzYXcnKSwKKyAgICAgICAgICAgICAgICAgIEFkZHJlc3NCb29rRW50cnkoJ0JhcnJ5JywgJ1BldGVycycpLAorICAgICAgICAgICAgICAgICAgQWRkcmVzc0Jvb2tFbnRyeSgnVGltJywgJ1BldGVycycpLAorICAgICAgICAgICAgICAgICAgQWRkcmVzc0Jvb2tFbnRyeSgnQmFycnknLCAnV2Fyc2F3JyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsnQmFycnknOiAnV2Fyc2F3JywgJ1RpbSc6ICdQZXRlcnMnfSkKKworICAgICAgICBkID0gZGljdCh6aXAocmFuZ2UoNCksIHJhbmdlKDEsIDUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkaWN0KFsoaSwgaSsxKSBmb3IgaSBpbiByYW5nZSg0KV0pKQorCisgICAgICAgICMgQmFkIHNlcXVlbmNlIGxlbmd0aHMuCisgICAgICAgIGZvciBiYWQgaW4gWygndG9vc2hvcnQnLCldLCBbKCd0b28nLCAnbG9uZycsICdieSAxJyldOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRpY3QoYmFkKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIFZhbHVlRXJyb3IgZnJvbSBkaWN0KCVyKSIgJSBiYWQpCisKKyAgICBkZWYgdGVzdF9kaXIoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkaXIoKSAuLi4KKyAgICAgICAganVuayA9IDEyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKCksIFsnanVuaycsICdzZWxmJ10pCisgICAgICAgIGRlbCBqdW5rCisKKyAgICAgICAgIyBKdXN0IG1ha2Ugc3VyZSB0aGVzZSBkb24ndCBibG93IHVwIQorICAgICAgICBmb3IgYXJnIGluIDIsIDJMLCAyaiwgMmUwLCBbMl0sICIyIiwgdSIyIiwgKDIsKSwgezI6Mn0sIHR5cGUsIHNlbGYudGVzdF9kaXI6CisgICAgICAgICAgICBkaXIoYXJnKQorCisgICAgICAgICMgVHJ5IGNsYXNzaWMgY2xhc3Nlcy4KKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIENkYXRhID0gMQorICAgICAgICAgICAgZGVmIENtZXRob2Qoc2VsZik6IHBhc3MKKworICAgICAgICBjc3R1ZmYgPSBbJ0NkYXRhJywgJ0NtZXRob2QnLCAnX19kb2NfXycsICdfX21vZHVsZV9fJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoQyksIGNzdHVmZikKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaW1fc2VsZicsIGRpcihDLkNtZXRob2QpKQorCisgICAgICAgIGMgPSBDKCkgICMgYy5fX2RvY19fIGlzIGFuIG9kZCB0aGluZyB0byBzZWUgaGVyZTsgZGl0dG8gYy5fX21vZHVsZV9fLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihjKSwgY3N0dWZmKQorCisgICAgICAgIGMuY2RhdGEgPSAyCisgICAgICAgIGMuY21ldGhvZCA9IGxhbWJkYSBzZWxmOiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKGMpLCBjc3R1ZmYgKyBbJ2NkYXRhJywgJ2NtZXRob2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaW1fc2VsZicsIGRpcihjLkNtZXRob2QpKQorCisgICAgICAgIGNsYXNzIEEoQyk6CisgICAgICAgICAgICBBZGF0YSA9IDEKKyAgICAgICAgICAgIGRlZiBBbWV0aG9kKHNlbGYpOiBwYXNzCisKKyAgICAgICAgYXN0dWZmID0gWydBZGF0YScsICdBbWV0aG9kJ10gKyBjc3R1ZmYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoQSksIGFzdHVmZikKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaW1fc2VsZicsIGRpcihBLkFtZXRob2QpKQorICAgICAgICBhID0gQSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKGEpLCBhc3R1ZmYpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2ltX3NlbGYnLCBkaXIoYS5BbWV0aG9kKSkKKyAgICAgICAgYS5hZGF0YSA9IDQyCisgICAgICAgIGEuYW1ldGhvZCA9IGxhbWJkYSBzZWxmOiAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKGEpLCBhc3R1ZmYgKyBbJ2FkYXRhJywgJ2FtZXRob2QnXSkKKworICAgICAgICAjIFRoZSBzYW1lLCBidXQgd2l0aCBuZXctc3R5bGUgY2xhc3Nlcy4gIFNpbmNlIHRoZXNlIGhhdmUgb2JqZWN0IGFzIGEKKyAgICAgICAgIyBiYXNlIGNsYXNzLCBhIGxvdCBtb3JlIGdldHMgc3Vja2VkIGluLgorICAgICAgICBkZWYgaW50ZXJlc3Rpbmcoc3RyaW5ncyk6CisgICAgICAgICAgICByZXR1cm4gW3MgZm9yIHMgaW4gc3RyaW5ncyBpZiBub3Qgcy5zdGFydHN3aXRoKCdfJyldCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgQ2RhdGEgPSAxCisgICAgICAgICAgICBkZWYgQ21ldGhvZChzZWxmKTogcGFzcworCisgICAgICAgIGNzdHVmZiA9IFsnQ2RhdGEnLCAnQ21ldGhvZCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJlc3RpbmcoZGlyKEMpKSwgY3N0dWZmKQorCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmVzdGluZyhkaXIoYykpLCBjc3R1ZmYpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2ltX3NlbGYnLCBkaXIoQy5DbWV0aG9kKSkKKworICAgICAgICBjLmNkYXRhID0gMgorICAgICAgICBjLmNtZXRob2QgPSBsYW1iZGEgc2VsZjogMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihjKSksIGNzdHVmZiArIFsnY2RhdGEnLCAnY21ldGhvZCddKQorICAgICAgICBzZWxmLmFzc2VydEluKCdpbV9zZWxmJywgZGlyKGMuQ21ldGhvZCkpCisKKyAgICAgICAgY2xhc3MgQShDKToKKyAgICAgICAgICAgIEFkYXRhID0gMQorICAgICAgICAgICAgZGVmIEFtZXRob2Qoc2VsZik6IHBhc3MKKworICAgICAgICBhc3R1ZmYgPSBbJ0FkYXRhJywgJ0FtZXRob2QnXSArIGNzdHVmZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihBKSksIGFzdHVmZikKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaW1fc2VsZicsIGRpcihBLkFtZXRob2QpKQorICAgICAgICBhID0gQSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJlc3RpbmcoZGlyKGEpKSwgYXN0dWZmKQorICAgICAgICBhLmFkYXRhID0gNDIKKyAgICAgICAgYS5hbWV0aG9kID0gbGFtYmRhIHNlbGY6IDMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnRlcmVzdGluZyhkaXIoYSkpLCBhc3R1ZmYgKyBbJ2FkYXRhJywgJ2FtZXRob2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignaW1fc2VsZicsIGRpcihhLkFtZXRob2QpKQorCisgICAgICAgICMgVHJ5IGEgbW9kdWxlIHN1YmNsYXNzLgorICAgICAgICBjbGFzcyBNKHR5cGUoc3lzKSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG1pbnN0YW5jZSA9IE0oIm0iKQorICAgICAgICBtaW5zdGFuY2UuYiA9IDIKKyAgICAgICAgbWluc3RhbmNlLmEgPSAxCisgICAgICAgIG5hbWVzID0gW3ggZm9yIHggaW4gZGlyKG1pbnN0YW5jZSkgaWYgeCBub3QgaW4gWyJfX25hbWVfXyIsICJfX2RvY19fIl1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXMsIFsnYScsICdiJ10pCisKKyAgICAgICAgY2xhc3MgTTIoTSk6CisgICAgICAgICAgICBkZWYgZ2V0ZGljdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIk5vdCBhIGRpY3QhIgorICAgICAgICAgICAgX19kaWN0X18gPSBwcm9wZXJ0eShnZXRkaWN0KQorCisgICAgICAgIG0yaW5zdGFuY2UgPSBNMigibTIiKQorICAgICAgICBtMmluc3RhbmNlLmIgPSAyCisgICAgICAgIG0yaW5zdGFuY2UuYSA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMmluc3RhbmNlLl9fZGljdF9fLCAiTm90IGEgZGljdCEiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkaXIobTJpbnN0YW5jZSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFR3byBlc3NlbnRpYWxseSBmZWF0dXJlbGVzcyBvYmplY3RzLCBqdXN0IGluaGVyaXRpbmcgc3R1ZmYgZnJvbQorICAgICAgICAjIG9iamVjdC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoTm90SW1wbGVtZW50ZWQpLCBkaXIoRWxsaXBzaXMpKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuY2hlY2tfaW1wbF9kZXRhaWwoKToKKyAgICAgICAgICAgICMgTm9uZSBkaWZmZXJzIGluIFB5UHk6IGl0IGhhcyBhIF9fbm9uemVyb19fCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihOb25lKSwgZGlyKEVsbGlwc2lzKSkKKworICAgICAgICAjIE5hc3R5IHRlc3QgY2FzZSBmb3IgcHJveGllZCBvYmplY3RzCisgICAgICAgIGNsYXNzIFdyYXBwZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmopOgorICAgICAgICAgICAgICAgIHNlbGYuX19vYmogPSBvYmoKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIldyYXBwZXIoJXMpIiAlIHJlcHIoc2VsZi5fX29iaikKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiBXcmFwcGVyKHNlbGYuX19vYmpba2V5XSkKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBsZW4oc2VsZi5fX29iaikKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gV3JhcHBlcihnZXRhdHRyKHNlbGYuX19vYmosIG5hbWUpKQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGNsYXNzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBXcmFwcGVyKHR5cGUoc2VsZikpCisgICAgICAgICAgICBfX2NsYXNzX18gPSBwcm9wZXJ0eShfX2dldGNsYXNzKQorCisgICAgICAgIGRpcihDKCkpICMgVGhpcyB1c2VkIHRvIHNlZ2ZhdWx0CisKKyAgICBkZWYgdGVzdF9zdXBlcnMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzdXBlci4uLgorCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYsIGEpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQSglcikiICUgYQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQSgpLm1ldGgoMSksICJBKDEpIikKKworICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuX19zdXBlciA9IHN1cGVyKEIsIHNlbGYpCisgICAgICAgICAgICBkZWYgbWV0aChzZWxmLCBhKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkIoJXIpIiAlIGEgKyBzZWxmLl9fc3VwZXIubWV0aChhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQigpLm1ldGgoMiksICJCKDIpQSgyKSIpCisKKyAgICAgICAgY2xhc3MgQyhBKToKKyAgICAgICAgICAgIGRlZiBtZXRoKHNlbGYsIGEpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQyglcikiICUgYSArIHNlbGYuX19zdXBlci5tZXRoKGEpCisgICAgICAgIEMuX0NfX3N1cGVyID0gc3VwZXIoQykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoKS5tZXRoKDMpLCAiQygzKUEoMykiKQorCisgICAgICAgIGNsYXNzIEQoQywgQik6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmLCBhKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkQoJXIpIiAlIGEgKyBzdXBlcihELCBzZWxmKS5tZXRoKGEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEKCkubWV0aCg0KSwgIkQoNClDKDQpQig0KUEoNCkiKQorCisgICAgICAgICMgVGVzdCBmb3Igc3ViY2xhc3Npbmcgc3VwZXIKKworICAgICAgICBjbGFzcyBteXN1cGVyKHN1cGVyKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKG15c3VwZXIsIHNlbGYpLl9faW5pdF9fKCphcmdzKQorCisgICAgICAgIGNsYXNzIEUoRCk6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmLCBhKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkUoJXIpIiAlIGEgKyBteXN1cGVyKEUsIHNlbGYpLm1ldGgoYSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUoKS5tZXRoKDUpLCAiRSg1KUQoNSlDKDUpQig1KUEoNSkiKQorCisgICAgICAgIGNsYXNzIEYoRSk6CisgICAgICAgICAgICBkZWYgbWV0aChzZWxmLCBhKToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi5fX3N1cGVyICMgPT0gbXlzdXBlcihGLCBzZWxmKQorICAgICAgICAgICAgICAgIHJldHVybiAiRiglcilbJXNdIiAlIChhLCBzLl9fY2xhc3NfXy5fX25hbWVfXykgKyBzLm1ldGgoYSkKKyAgICAgICAgRi5fRl9fc3VwZXIgPSBteXN1cGVyKEYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKCkubWV0aCg2KSwgIkYoNilbbXlzdXBlcl1FKDYpRCg2KUMoNilCKDYpQSg2KSIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgY2VydGFpbiBlcnJvcnMgYXJlIHJhaXNlZAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1cGVyKEQsIDQyKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgc3VwZXIoRCwgNDIpIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdXBlcihELCBDKCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBhbGxvdyBzdXBlcihELCBDKCkpIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdXBlcihEKS5fX2dldF9fKDEyKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgc3VwZXIoRCkuX19nZXRfXygxMikiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1cGVyKEQpLl9fZ2V0X18oQygpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgc3VwZXIoRCkuX19nZXRfXyhDKCkpIikKKworICAgICAgICAjIE1ha2Ugc3VyZSBkYXRhIGRlc2NyaXB0b3JzIGNhbiBiZSBvdmVycmlkZGVuIGFuZCBhY2Nlc3NlZCB2aWEgc3VwZXIKKyAgICAgICAgIyAobmV3IGZlYXR1cmUgaW4gUHl0aG9uIDIuMykKKworICAgICAgICBjbGFzcyBERGJhc2Uob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXR4KHNlbGYpOiByZXR1cm4gNDIKKyAgICAgICAgICAgIHggPSBwcm9wZXJ0eShnZXR4KQorCisgICAgICAgIGNsYXNzIEREc3ViKEREYmFzZSk6CisgICAgICAgICAgICBkZWYgZ2V0eChzZWxmKTogcmV0dXJuICJoZWxsbyIKKyAgICAgICAgICAgIHggPSBwcm9wZXJ0eShnZXR4KQorCisgICAgICAgIGRkID0gRERzdWIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRkLngsICJoZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VwZXIoRERzdWIsIGRkKS54LCA0MikKKworICAgICAgICAjIEVuc3VyZSB0aGF0IHN1cGVyKCkgbG9va3VwIG9mIGRlc2NyaXB0b3IgZnJvbSBjbGFzc21ldGhvZAorICAgICAgICAjIHdvcmtzIChTRiBJRCMgNzQzNjI3KQorCisgICAgICAgIGNsYXNzIEJhc2Uob2JqZWN0KToKKyAgICAgICAgICAgIGFQcm9wID0gcHJvcGVydHkobGFtYmRhIHNlbGY6ICJmb28iKQorCisgICAgICAgIGNsYXNzIFN1YihCYXNlKToKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHRlc3Qoa2xhc3MpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihTdWIsa2xhc3MpLmFQcm9wCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTdWIudGVzdCgpLCBCYXNlLmFQcm9wKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgc3VwZXIoKSBkb2Vzbid0IGFsbG93IGtleXdvcmQgYXJncworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdXBlcihCYXNlLCBrdz0xKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgic3VwZXIgc2hvdWxkbid0IGFjY2VwdCBrZXl3b3JkIGFyZ3MiKQorCisgICAgZGVmIHRlc3RfYmFzaWNfaW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBpbmhlcml0YW5jZSBmcm9tIGJhc2ljIHR5cGVzLi4uCisKKyAgICAgICAgY2xhc3MgaGV4aW50KGludCk6CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhleChzZWxmKQorICAgICAgICAgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBoZXhpbnQoaW50Ll9fYWRkX18oc2VsZiwgb3RoZXIpKQorICAgICAgICAgICAgIyAoTm90ZSB0aGF0IG92ZXJyaWRpbmcgX19yYWRkX18gZG9lc24ndCB3b3JrLAorICAgICAgICAgICAgIyBiZWNhdXNlIHRoZSBpbnQgdHlwZSBnZXRzIGZpcnN0IGRpYnMuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoaGV4aW50KDcpICsgOSksICIweDEwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGhleGludCgxMDAwKSArIDcpLCAiMHgzZWYiKQorICAgICAgICBhID0gaGV4aW50KDEyMzQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIDEyMzQ1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChhKSwgMTIzNDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoYSkuX19jbGFzc19fIGlzIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgrYSkuX19jbGFzc19fIGlzIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4+IDApLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PCAwKS5fX2NsYXNzX18gaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGhleGludCgwKSA8PCAxMikuX19jbGFzc19fIGlzIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChoZXhpbnQoMCkgPj4gMTIpLl9fY2xhc3NfXyBpcyBpbnQpCisKKyAgICAgICAgY2xhc3Mgb2N0bG9uZyhsb25nKToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzID0gb2N0KHNlbGYpCisgICAgICAgICAgICAgICAgaWYgc1stMV0gPT0gJ0wnOgorICAgICAgICAgICAgICAgICAgICBzID0gc1s6LTFdCisgICAgICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc3VwZXIob2N0bG9uZywgc2VsZikuX19hZGRfXyhvdGhlcikpCisgICAgICAgICAgICBfX3JhZGRfXyA9IF9fYWRkX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIob2N0bG9uZygzKSArIDUpLCAiMDEwIikKKyAgICAgICAgIyAoTm90ZSB0aGF0IG92ZXJyaWRpbmcgX19yYWRkX18gaGVyZSBvbmx5IHNlZW1zIHRvIHdvcmsKKyAgICAgICAgIyBiZWNhdXNlIHRoZSBleGFtcGxlIHVzZXMgYSBzaG9ydCBpbnQgbGVmdCBhcmd1bWVudC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKDUgKyBvY3Rsb25nKDMwMDApKSwgIjA1Njc1IikKKyAgICAgICAgYSA9IG9jdGxvbmcoMTIzNDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgMTIzNDVMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoYSksIDEyMzQ1TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1TCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb25nKGEpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCthKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgtYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoLW9jdGxvbmcoMCkpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPj4gMCkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PCAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIC0gMCkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiogMSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAvLyAxKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgxICogYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSB8IDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgXiAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICYgLTFMKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChvY3Rsb25nKDApIDw8IDEyKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChvY3Rsb25nKDApID4+IDEyKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicyhvY3Rsb25nKDApKS5fX2NsYXNzX18gaXMgbG9uZykKKworICAgICAgICAjIEJlY2F1c2Ugb2N0bG9uZyBvdmVycmlkZXMgX19hZGRfXywgd2UgY2FuJ3QgY2hlY2sgdGhlIGFic2VuY2Ugb2YgKzAKKyAgICAgICAgIyBvcHRpbWl6YXRpb25zIHVzaW5nIG9jdGxvbmcuCisgICAgICAgIGNsYXNzIGxvbmdjbG9uZShsb25nKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IGxvbmdjbG9uZSgxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKyAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgwICsgYSkuX19jbGFzc19fIGlzIGxvbmcpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IG5lZ2F0aXZlIGNsb25lcyBkb24ndCBzZWdmYXVsdAorICAgICAgICBhID0gbG9uZ2Nsb25lKC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19kaWN0X18sIHt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoYSksIC0xKSAgIyBzZWxmLmFzc2VydFRydWUgUHlOdW1iZXJfTG9uZygpIGNvcGllcyB0aGUgc2lnbiBiaXQKKworICAgICAgICBjbGFzcyBwcmVjZmxvYXQoZmxvYXQpOgorICAgICAgICAgICAgX19zbG90c19fID0gWydwcmVjJ10KKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT0wLjAsIHByZWM9MTIpOgorICAgICAgICAgICAgICAgIHNlbGYucHJlYyA9IGludChwcmVjKQorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiJS4qZyIgJSAoc2VsZi5wcmVjLCBzZWxmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocHJlY2Zsb2F0KDEuMSkpLCAiMS4xIikKKyAgICAgICAgYSA9IHByZWNmbG9hdCgxMjM0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCAxMjM0NS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KGEpLCAxMjM0NS4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmxvYXQoYSkuX19jbGFzc19fIGlzIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goMTIzNDUuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoK2EpLl9fY2xhc3NfXyBpcyBmbG9hdCkKKworICAgICAgICBjbGFzcyBtYWRjb21wbGV4KGNvbXBsZXgpOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiJS4xN2dqJSsuMTdnIiAlIChzZWxmLmltYWcsIHNlbGYucmVhbCkKKyAgICAgICAgYSA9IG1hZGNvbXBsZXgoLTMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihhKSwgIjRqLTMiKQorICAgICAgICBiYXNlID0gY29tcGxleCgtMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLl9fY2xhc3NfXywgY29tcGxleCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXgoYSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleChhKS5fX2NsYXNzX18sIGNvbXBsZXgpCisgICAgICAgIGEgPSBtYWRjb21wbGV4KGEpICAjIGp1c3QgdHJ5aW5nIGFub3RoZXIgZm9ybSBvZiB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEpLCAiNGotMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21wbGV4KGEpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBsZXgoYSkuX19jbGFzc19fLCBjb21wbGV4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goYmFzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCthKS5fX2NsYXNzX18sIGNvbXBsZXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgKyAwKS5fX2NsYXNzX18sIGNvbXBsZXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSArIDAsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgLSAwKS5fX2NsYXNzX18sIGNvbXBsZXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIDAsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgKiAxKS5fX2NsYXNzX18sIGNvbXBsZXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAqIDEsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEgLyAxKS5fX2NsYXNzX18sIGNvbXBsZXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAvIDEsIGJhc2UpCisKKyAgICAgICAgY2xhc3MgbWFkdHVwbGUodHVwbGUpOgorICAgICAgICAgICAgX3JldiA9IE5vbmUKKyAgICAgICAgICAgIGRlZiByZXYoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fcmV2IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV2CisgICAgICAgICAgICAgICAgTCA9IGxpc3Qoc2VsZikKKyAgICAgICAgICAgICAgICBMLnJldmVyc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuX3JldiA9IHNlbGYuX19jbGFzc19fKEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldgorICAgICAgICBhID0gbWFkdHVwbGUoKDEsMiwzLDQsNSw2LDcsOCw5LDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsICgxLDIsMyw0LDUsNiw3LDgsOSwwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnJldigpLCBtYWR0dXBsZSgoMCw5LDgsNyw2LDUsNCwzLDIsMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEucmV2KCkucmV2KCksIG1hZHR1cGxlKCgxLDIsMyw0LDUsNiw3LDgsOSwwKSkpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDUxMik6CisgICAgICAgICAgICB0ID0gbWFkdHVwbGUocmFuZ2UoaSkpCisgICAgICAgICAgICB1ID0gdC5yZXYoKQorICAgICAgICAgICAgdiA9IHUucmV2KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgdCkKKyAgICAgICAgYSA9IG1hZHR1cGxlKCgxLDIsMyw0LDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGEpLCAoMSwyLDMsNCw1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR1cGxlKGEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKCgxLDIsMyw0LDUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFbOl0uX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiAxKS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDApLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICsgKCkpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgYSA9IG1hZHR1cGxlKCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGEpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR1cGxlKGEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICsgYSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiAwKS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMikuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCisKKyAgICAgICAgY2xhc3MgbWFkc3RyaW5nKHN0cik6CisgICAgICAgICAgICBfcmV2ID0gTm9uZQorICAgICAgICAgICAgZGVmIHJldihzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9yZXYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXYKKyAgICAgICAgICAgICAgICBMID0gbGlzdChzZWxmKQorICAgICAgICAgICAgICAgIEwucmV2ZXJzZSgpCisgICAgICAgICAgICAgICAgc2VsZi5fcmV2ID0gc2VsZi5fX2NsYXNzX18oIiIuam9pbihMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV2CisgICAgICAgIHMgPSBtYWRzdHJpbmcoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucmV2KCksIG1hZHN0cmluZygienl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJldigpLnJldigpLCBtYWRzdHJpbmcoImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IikpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBzID0gbWFkc3RyaW5nKCIiLmpvaW4obWFwKGNociwgcmFuZ2UoaSkpKSkKKyAgICAgICAgICAgIHQgPSBzLnJldigpCisgICAgICAgICAgICB1ID0gdC5yZXYoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzKQorICAgICAgICBzID0gbWFkc3RyaW5nKCIxMjM0NSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHMpLCAiMTIzNDUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKHMpLl9fY2xhc3NfXyBpcyBzdHIpCisKKyAgICAgICAgYmFzZSA9ICJceDAwIiAqIDUKKyAgICAgICAgcyA9IG1hZHN0cmluZyhiYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHMpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChzKSwgaGFzaChiYXNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7czogMX1bYmFzZV0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe2Jhc2U6IDF9W3NdLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKHMgKyAiIikuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICsgIiIsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoIiIgKyBzKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIiICsgcywgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChzICogMCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICogMCwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyAqIDEpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDEsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyAqIDIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDIsIGJhc2UgKyBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc1s6XS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbOl0sIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzWzA6MF0uX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzA6MF0sICIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdHJpcCgpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdHJpcCgpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5sc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMubHN0cmlwKCksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnJzdHJpcCgpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yc3RyaXAoKSwgYmFzZSkKKyAgICAgICAgaWRlbnRpdHl0YWIgPSAnJy5qb2luKFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnRyYW5zbGF0ZShpZGVudGl0eXRhYikuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiwgIngiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudHJhbnNsYXRlKGlkZW50aXR5dGFiLCAieCIpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudHJhbnNsYXRlKGlkZW50aXR5dGFiLCAiXHgwMCIpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMucmVwbGFjZSgieCIsICJ4IikuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJlcGxhY2UoIngiLCAieCIpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5sanVzdChsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sanVzdChsZW4ocykpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5yanVzdChsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yanVzdChsZW4ocykpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5jZW50ZXIobGVuKHMpKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuY2VudGVyKGxlbihzKSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmxvd2VyKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmxvd2VyKCksIGJhc2UpCisKKyAgICAgICAgY2xhc3MgbWFkdW5pY29kZSh1bmljb2RlKToKKyAgICAgICAgICAgIF9yZXYgPSBOb25lCisgICAgICAgICAgICBkZWYgcmV2KHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3JldiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldgorICAgICAgICAgICAgICAgIEwgPSBsaXN0KHNlbGYpCisgICAgICAgICAgICAgICAgTC5yZXZlcnNlKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9yZXYgPSBzZWxmLl9fY2xhc3NfXyh1IiIuam9pbihMKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmV2CisgICAgICAgIHUgPSBtYWR1bmljb2RlKCJBQkNERUYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIHUiQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnJldigpLCBtYWR1bmljb2RlKHUiRkVEQ0JBIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5yZXYoKS5yZXYoKSwgbWFkdW5pY29kZSh1IkFCQ0RFRiIpKQorICAgICAgICBiYXNlID0gdSIxMjM0NSIKKyAgICAgICAgdSA9IG1hZHVuaWNvZGUoYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHUpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSh1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHUpLCBoYXNoKGJhc2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt1OiAxfVtiYXNlXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7YmFzZTogMX1bdV0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5zdHJpcCgpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5sc3RyaXAoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmxzdHJpcCgpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yc3RyaXAoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnJzdHJpcCgpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yZXBsYWNlKHUieCIsIHUieCIpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucmVwbGFjZSh1IngiLCB1IngiKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUucmVwbGFjZSh1Inh5IiwgdSJ4eSIpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucmVwbGFjZSh1Inh5IiwgdSJ4eSIpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5jZW50ZXIobGVuKHUpKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmNlbnRlcihsZW4odSkpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5sanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUubGp1c3QobGVuKHUpKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUucmp1c3QobGVuKHUpKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnJqdXN0KGxlbih1KSksIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1Lmxvd2VyKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sb3dlcigpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS51cHBlcigpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUudXBwZXIoKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuY2FwaXRhbGl6ZSgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuY2FwaXRhbGl6ZSgpLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS50aXRsZSgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUudGl0bGUoKSwgYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1ICsgdSIiKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ICsgdSIiLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKHUiIiArIHUpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiIiArIHUsIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSAqIDApLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKiAwLCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSAqIDEpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKiAxLCBiYXNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKHUgKiAyKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ICogMiwgYmFzZSArIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1WzpdLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVbOl0sIGJhc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1WzA6MF0uX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVswOjBdLCB1IiIpCisKKyAgICAgICAgY2xhc3Mgc3VibGlzdChsaXN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IHN1Ymxpc3QocmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgcmFuZ2UoNSkpCisgICAgICAgIGEuYXBwZW5kKCJoZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgcmFuZ2UoNSkgKyBbImhlbGxvIl0pCisgICAgICAgIGFbNV0gPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgcmFuZ2UoNikpCisgICAgICAgIGEuZXh0ZW5kKHJhbmdlKDYsIDIwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCByYW5nZSgyMCkpCisgICAgICAgIGFbLTU6XSA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgcmFuZ2UoMTUpKQorICAgICAgICBkZWwgYVsxMDoxNV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGEpLCByYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswXSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzldLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwXSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xXSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo1XSwgcmFuZ2UoNSkpCisKKyAgICAgICAgY2xhc3MgQ291bnRlZElucHV0KGZpbGUpOgorICAgICAgICAgICAgIiIiQ291bnRzIGxpbmVzIHJlYWQgYnkgc2VsZi5yZWFkbGluZSgpLgorCisgICAgICAgICAgICBzZWxmLmxpbmVubyBpcyB0aGUgMC1iYXNlZCBvcmRpbmFsIG9mIHRoZSBsYXN0IGxpbmUgcmVhZCwgdXAgdG8KKyAgICAgICAgICAgIGEgbWF4aW11bSBvZiBvbmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGUuCisKKyAgICAgICAgICAgIHNlbGYuYXRlb2YgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZmluYWwgIiIgbGluZSBoYXMgYmVlbiByZWFkLAorICAgICAgICAgICAgYXQgd2hpY2ggcG9pbnQgc2VsZi5saW5lbm8gc3RvcHMgaW5jcmVtZW50aW5nLCBhbmQgZnVydGhlciBjYWxscworICAgICAgICAgICAgdG8gcmVhZGxpbmUoKSBjb250aW51ZSB0byByZXR1cm4gIiIuCisgICAgICAgICAgICAiIiIKKworICAgICAgICAgICAgbGluZW5vID0gMAorICAgICAgICAgICAgYXRlb2YgPSAwCisgICAgICAgICAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5hdGVvZjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICAgICAgcyA9IGZpbGUucmVhZGxpbmUoc2VsZikKKyAgICAgICAgICAgICAgICAjIE5leHQgbGluZSB3b3JrcyB0b28uCisgICAgICAgICAgICAgICAgIyBzID0gc3VwZXIoQ291bnRlZElucHV0LCBzZWxmKS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gKz0gMQorICAgICAgICAgICAgICAgIGlmIHMgPT0gIiI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXRlb2YgPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIHMKKworICAgICAgICBmID0gZmlsZShuYW1lPXRlc3Rfc3VwcG9ydC5URVNURk4sIG1vZGU9J3cnKQorICAgICAgICBsaW5lcyA9IFsnYVxuJywgJ2JcbicsICdjXG4nXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlbGluZXMobGluZXMpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGYgPSBDb3VudGVkSW5wdXQodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIGZvciAoaSwgZXhwZWN0ZWQpIGluIHppcChyYW5nZSgxLCA1KSArIFs0XSwgbGluZXMgKyAyICogWyIiXSk6CisgICAgICAgICAgICAgICAgZ290ID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5saW5lbm8sIGkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmF0ZW9mLCAoaSA+IGxlbihsaW5lcykpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3Rfa2V5d29yZHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBrZXl3b3JkIGFyZ3MgdG8gYmFzaWMgdHlwZSBjb25zdHJ1Y3RvcnMgLi4uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHg9MSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoeD0yKSwgMi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoeD0zKSwgM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tcGxleChpbWFnPTQyLCByZWFsPTY2NiksIGNvbXBsZXgoNjY2LCA0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG9iamVjdD01MDApLCAnNTAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHN0cmluZz0nYWJjJywgZXJyb3JzPSdzdHJpY3QnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKHNlcXVlbmNlPXJhbmdlKDMpKSwgKDAsIDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc2VxdWVuY2U9KDAsIDEsIDIpKSwgcmFuZ2UoMykpCisgICAgICAgICMgbm90ZTogYXMgb2YgUHl0aG9uIDIuMywgZGljdCgpIG5vIGxvbmdlciBoYXMgYW4gIml0ZW1zIiBrZXl3b3JkIGFyZworCisgICAgICAgIGZvciBjb25zdHJ1Y3RvciBpbiAoaW50LCBmbG9hdCwgbG9uZywgY29tcGxleCwgc3RyLCB1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlLCBsaXN0LCBmaWxlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3Rvcihib2d1c19rZXl3b3JkX2FyZz0xKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgVHlwZUVycm9yIGZyb20gYm9ndXMga2V5d29yZCBhcmd1bWVudCB0byAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIGNvbnN0cnVjdG9yKQorCisgICAgZGVmIHRlc3Rfc3RyX3N1YmNsYXNzX2FzX2RpY3Rfa2V5KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgYSBzdHIgc3ViY2xhc3MgdXNlZCBhcyBkaWN0IGtleSAuLgorCisgICAgICAgIGNsYXNzIGNpc3RyKHN0cik6CisgICAgICAgICAgICAiIiJTdWJsY2FzcyBvZiBzdHIgdGhhdCBjb21wdXRlcyBfX2VxX18gY2FzZS1pbnNlbnNpdGl2ZWx5LgorCisgICAgICAgICAgICBBbHNvIGNvbXB1dGVzIGEgaGFzaCBjb2RlIG9mIHRoZSBzdHJpbmcgaW4gY2Fub25pY2FsIGZvcm0uCisgICAgICAgICAgICAiIiIKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbm9uaWNhbCA9IHZhbHVlLmxvd2VyKCkKKyAgICAgICAgICAgICAgICBzZWxmLmhhc2hjb2RlID0gaGFzaChzZWxmLmNhbm9uaWNhbCkKKworICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGNpc3RyKToKKyAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBjaXN0cihvdGhlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jYW5vbmljYWwgPT0gb3RoZXIuY2Fub25pY2FsCisKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5oYXNoY29kZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2lzdHIoJ0FCQycpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYUJjJywgY2lzdHIoJ0FCQycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjaXN0cignQUJDJykpLCAnQUJDJykKKworICAgICAgICBkID0ge2Npc3RyKCdvbmUnKTogMSwgY2lzdHIoJ3R3bycpOiAyLCBjaXN0cigndEhyZWUnKTogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW2Npc3RyKCdvbmUnKV0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtjaXN0cigndFdvJyldLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbY2lzdHIoJ1RIckVFJyldLCAzKQorICAgICAgICBzZWxmLmFzc2VydEluKGNpc3RyKCdPTmUnKSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChjaXN0cigndGhyRUUnKSksIDMpCisKKyAgICBkZWYgdGVzdF9jbGFzc2ljX2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgY2xhc3NpYyBjb21wYXJpc29ucy4uLgorICAgICAgICBjbGFzcyBjbGFzc2ljOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciBiYXNlIGluIChjbGFzc2ljLCBpbnQsIG9iamVjdCk6CisgICAgICAgICAgICBjbGFzcyBDKGJhc2UpOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSBpbnQodmFsdWUpCisgICAgICAgICAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi52YWx1ZSwgb3RoZXIudmFsdWUpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGludCkgb3IgaXNpbnN0YW5jZShvdGhlciwgbG9uZyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYudmFsdWUsIG90aGVyKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworCisgICAgICAgICAgICBjMSA9IEMoMSkKKyAgICAgICAgICAgIGMyID0gQygyKQorICAgICAgICAgICAgYzMgPSBDKDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLCAxKQorICAgICAgICAgICAgYyA9IHsxOiBjMSwgMjogYzIsIDM6IGMzfQorICAgICAgICAgICAgZm9yIHggaW4gMSwgMiwgMzoKKyAgICAgICAgICAgICAgICBmb3IgeSBpbiAxLCAyLCAzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21wKGNbeF0sIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICBmb3Igb3AgaW4gIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSI6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgiY1t4XSAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtcChjW3hdLCB5KSA9PSBjbXAoeCwgeSksICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtcCh4LCBjW3ldKSA9PSBjbXAoeCwgeSksICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKworICAgIGRlZiB0ZXN0X3JpY2hfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyByaWNoIGNvbXBhcmlzb25zLi4uCisgICAgICAgIGNsYXNzIFooY29tcGxleCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHogPSBaKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeiwgMSswaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxKzBqLCB6KQorICAgICAgICBjbGFzcyBaWihjb21wbGV4KToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFicyhzZWxmIC0gb3RoZXIpIDw9IDFlLTYKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgenogPSBaWigxLjAwMDAwMDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoenosIDErMGopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSswaiwgenopCisKKyAgICAgICAgY2xhc3MgY2xhc3NpYzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIGJhc2UgaW4gKGNsYXNzaWMsIGludCwgb2JqZWN0LCBsaXN0KToKKyAgICAgICAgICAgIGNsYXNzIEMoYmFzZSk6CisgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IGludCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmXywgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBjYWxsIF9fY21wX18iKQorICAgICAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEMpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgaW50KSBvciBpc2luc3RhbmNlKG90aGVyLCBsb25nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID09IG90aGVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlICE9IG90aGVyLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGludCkgb3IgaXNpbnN0YW5jZShvdGhlciwgbG9uZyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSAhPSBvdGhlcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgICAgICAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA8IG90aGVyLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGludCkgb3IgaXNpbnN0YW5jZShvdGhlciwgbG9uZyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA8IG90aGVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDw9IG90aGVyLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGludCkgb3IgaXNpbnN0YW5jZShvdGhlciwgbG9uZyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA8PSBvdGhlcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgICAgICAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgQyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA+IG90aGVyLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGludCkgb3IgaXNpbnN0YW5jZShvdGhlciwgbG9uZyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA+IG90aGVyCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorICAgICAgICAgICAgICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID49IG90aGVyLnZhbHVlCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGludCkgb3IgaXNpbnN0YW5jZShvdGhlciwgbG9uZyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA+PSBvdGhlcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICAgICAgICAgIGMxID0gQygxKQorICAgICAgICAgICAgYzIgPSBDKDIpCisgICAgICAgICAgICBjMyA9IEMoMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYzEsIDEpCisgICAgICAgICAgICBjID0gezE6IGMxLCAyOiBjMiwgMzogYzN9CisgICAgICAgICAgICBmb3IgeCBpbiAxLCAyLCAzOgorICAgICAgICAgICAgICAgIGZvciB5IGluIDEsIDIsIDM6CisgICAgICAgICAgICAgICAgICAgIGZvciBvcCBpbiAiPCIsICI8PSIsICI9PSIsICIhPSIsICI+IiwgIj49IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCJjW3hdICVzIGNbeV0iICUgb3ApID09IGV2YWwoInggJXMgeSIgJSBvcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgeSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgieCAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4PSVkLCB5PSVkIiAlICh4LCB5KSkKKworICAgIGRlZiB0ZXN0X2NvZXJjaW9ucyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNvZXJjaW9ucy4uLgorICAgICAgICBjbGFzcyBJKGludCk6IHBhc3MKKyAgICAgICAgY29lcmNlKEkoMCksIDApCisgICAgICAgIGNvZXJjZSgwLCBJKDApKQorICAgICAgICBjbGFzcyBMKGxvbmcpOiBwYXNzCisgICAgICAgIGNvZXJjZShMKDApLCAwKQorICAgICAgICBjb2VyY2UoTCgwKSwgMEwpCisgICAgICAgIGNvZXJjZSgwLCBMKDApKQorICAgICAgICBjb2VyY2UoMEwsIEwoMCkpCisgICAgICAgIGNsYXNzIEYoZmxvYXQpOiBwYXNzCisgICAgICAgIGNvZXJjZShGKDApLCAwKQorICAgICAgICBjb2VyY2UoRigwKSwgMEwpCisgICAgICAgIGNvZXJjZShGKDApLCAwLikKKyAgICAgICAgY29lcmNlKDAsIEYoMCkpCisgICAgICAgIGNvZXJjZSgwTCwgRigwKSkKKyAgICAgICAgY29lcmNlKDAuLCBGKDApKQorICAgICAgICBjbGFzcyBDKGNvbXBsZXgpOiBwYXNzCisgICAgICAgIGNvZXJjZShDKDApLCAwKQorICAgICAgICBjb2VyY2UoQygwKSwgMEwpCisgICAgICAgIGNvZXJjZShDKDApLCAwLikKKyAgICAgICAgY29lcmNlKEMoMCksIDBqKQorICAgICAgICBjb2VyY2UoMCwgQygwKSkKKyAgICAgICAgY29lcmNlKDBMLCBDKDApKQorICAgICAgICBjb2VyY2UoMC4sIEMoMCkpCisgICAgICAgIGNvZXJjZSgwaiwgQygwKSkKKworICAgIGRlZiB0ZXN0X2Rlc2NyZG9jKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZGVzY3JpcHRvciBkb2Mgc3RyaW5ncy4uLgorICAgICAgICBkZWYgY2hlY2soZGVzY3IsIHdoYXQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXNjci5fX2RvY19fLCB3aGF0KQorICAgICAgICBjaGVjayhmaWxlLmNsb3NlZCwgIlRydWUgaWYgdGhlIGZpbGUgaXMgY2xvc2VkIikgIyBnZXRzZXQgZGVzY3JpcHRvcgorICAgICAgICBjaGVjayhmaWxlLm5hbWUsICJmaWxlIG5hbWUiKSAjIG1lbWJlciBkZXNjcmlwdG9yCisKKyAgICBkZWYgdGVzdF9kb2NfZGVzY3JpcHRvcihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIF9fZG9jX18gZGVzY3JpcHRvci4uLgorICAgICAgICAjIFNGIGJ1ZyA1NDI5ODQKKyAgICAgICAgY2xhc3MgRG9jRGVzY3Iob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iamVjdCwgb3R5cGUpOgorICAgICAgICAgICAgICAgIGlmIG9iamVjdDoKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0ID0gb2JqZWN0Ll9fY2xhc3NfXy5fX25hbWVfXyArICcgaW5zdGFuY2UnCisgICAgICAgICAgICAgICAgaWYgb3R5cGU6CisgICAgICAgICAgICAgICAgICAgIG90eXBlID0gb3R5cGUuX19uYW1lX18KKyAgICAgICAgICAgICAgICByZXR1cm4gJ29iamVjdD0lczsgdHlwZT0lcycgJSAob2JqZWN0LCBvdHlwZSkKKyAgICAgICAgY2xhc3MgT2xkQ2xhc3M6CisgICAgICAgICAgICBfX2RvY19fID0gRG9jRGVzY3IoKQorICAgICAgICBjbGFzcyBOZXdDbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgX19kb2NfXyA9IERvY0Rlc2NyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChPbGRDbGFzcy5fX2RvY19fLCAnb2JqZWN0PU5vbmU7IHR5cGU9T2xkQ2xhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE9sZENsYXNzKCkuX19kb2NfXywgJ29iamVjdD1PbGRDbGFzcyBpbnN0YW5jZTsgdHlwZT1PbGRDbGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTmV3Q2xhc3MuX19kb2NfXywgJ29iamVjdD1Ob25lOyB0eXBlPU5ld0NsYXNzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOZXdDbGFzcygpLl9fZG9jX18sICdvYmplY3Q9TmV3Q2xhc3MgaW5zdGFuY2U7IHR5cGU9TmV3Q2xhc3MnKQorCisgICAgZGVmIHRlc3Rfc2V0X2NsYXNzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19jbGFzc19fIGFzc2lnbm1lbnQuLi4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOiBwYXNzCisgICAgICAgIGNsYXNzIEQob2JqZWN0KTogcGFzcworICAgICAgICBjbGFzcyBFKG9iamVjdCk6IHBhc3MKKyAgICAgICAgY2xhc3MgRihELCBFKTogcGFzcworICAgICAgICBmb3IgY2xzIGluIEMsIEQsIEUsIEY6CisgICAgICAgICAgICBmb3IgY2xzMiBpbiBDLCBELCBFLCBGOgorICAgICAgICAgICAgICAgIHggPSBjbHMoKQorICAgICAgICAgICAgICAgIHguX19jbGFzc19fID0gY2xzMgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4Ll9fY2xhc3NfXyBpcyBjbHMyKQorICAgICAgICAgICAgICAgIHguX19jbGFzc19fID0gY2xzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguX19jbGFzc19fIGlzIGNscykKKyAgICAgICAgZGVmIGNhbnQoeCwgQyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBDCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgJXIuX19jbGFzc19fID0gJXIiICUgKHgsIEMpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbGF0dHIoeCwgIl9fY2xhc3NfXyIpCisgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYWxsb3cgZGVsICVyLl9fY2xhc3NfXyIgJSB4KQorICAgICAgICBjYW50KEMoKSwgbGlzdCkKKyAgICAgICAgY2FudChsaXN0KCksIEMpCisgICAgICAgIGNhbnQoQygpLCAxKQorICAgICAgICBjYW50KEMoKSwgb2JqZWN0KQorICAgICAgICBjYW50KG9iamVjdCgpLCBsaXN0KQorICAgICAgICBjYW50KGxpc3QoKSwgb2JqZWN0KQorICAgICAgICBjbGFzcyBJbnQoaW50KTogX19zbG90c19fID0gW10KKyAgICAgICAgY2FudCgyLCBJbnQpCisgICAgICAgIGNhbnQoSW50KCksIGludCkKKyAgICAgICAgY2FudChUcnVlLCBpbnQpCisgICAgICAgIGNhbnQoMiwgYm9vbCkKKyAgICAgICAgbyA9IG9iamVjdCgpCisgICAgICAgIGNhbnQobywgdHlwZSgxKSkKKyAgICAgICAgY2FudChvLCB0eXBlKE5vbmUpKQorICAgICAgICBkZWwgbworICAgICAgICBjbGFzcyBHKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbImEiLCAiYiJdCisgICAgICAgIGNsYXNzIEgob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiYiIsICJhIl0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgY2xhc3MgSShvYmplY3QpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiYSIsICJiIl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNsYXNzIEkob2JqZWN0KToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbdW5pY29kZSgiYSIpLCB1bmljb2RlKCJiIildCisgICAgICAgIGNsYXNzIEoob2JqZWN0KToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiYyIsICJiIl0KKyAgICAgICAgY2xhc3MgSyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJhIiwgImIiLCAiZCJdCisgICAgICAgIGNsYXNzIEwoSCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbImUiXQorICAgICAgICBjbGFzcyBNKEkpOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJlIl0KKyAgICAgICAgY2xhc3MgTihKKToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiX193ZWFrcmVmX18iXQorICAgICAgICBjbGFzcyBQKEopOgorICAgICAgICAgICAgX19zbG90c19fID0gWyJfX2RpY3RfXyJdCisgICAgICAgIGNsYXNzIFEoSik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFIoSik6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fZGljdF9fIiwgIl9fd2Vha3JlZl9fIl0KKworICAgICAgICBmb3IgY2xzLCBjbHMyIGluICgoRywgSCksIChHLCBJKSwgKEksIEgpLCAoUSwgUiksIChSLCBRKSk6CisgICAgICAgICAgICB4ID0gY2xzKCkKKyAgICAgICAgICAgIHguYSA9IDEKKyAgICAgICAgICAgIHguX19jbGFzc19fID0gY2xzMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguX19jbGFzc19fIGlzIGNsczIsCisgICAgICAgICAgICAgICAgICAgImFzc2lnbmluZyAlciBhcyBfX2NsYXNzX18gZm9yICVyIHNpbGVudGx5IGZhaWxlZCIgJSAoY2xzMiwgeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMSkKKyAgICAgICAgICAgIHguX19jbGFzc19fID0gY2xzCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzLAorICAgICAgICAgICAgICAgICAgICJhc3NpZ25pbmcgJXIgYXMgX19jbGFzc19fIGZvciAlciBzaWxlbnRseSBmYWlsZWQiICUgKGNscywgeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMSkKKyAgICAgICAgZm9yIGNscyBpbiBHLCBKLCBLLCBMLCBNLCBOLCBQLCBSLCBsaXN0LCBJbnQ6CisgICAgICAgICAgICBmb3IgY2xzMiBpbiBHLCBKLCBLLCBMLCBNLCBOLCBQLCBSLCBsaXN0LCBJbnQ6CisgICAgICAgICAgICAgICAgaWYgY2xzIGlzIGNsczI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgY2FudChjbHMoKSwgY2xzMikKKworICAgICAgICAjIElzc3VlNTI4Mzogd2hlbiBfX2NsYXNzX18gY2hhbmdlcyBpbiBfX2RlbF9fLCB0aGUgd3JvbmcKKyAgICAgICAgIyB0eXBlIGdldHMgREVDUkVGJ2QuCisgICAgICAgIGNsYXNzIE8ob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5fX2NsYXNzX18gPSBPCisgICAgICAgIGwgPSBbQSgpIGZvciB4IGluIHJhbmdlKDEwMCldCisgICAgICAgIGRlbCBsCisKKyAgICBkZWYgdGVzdF9zZXRfZGljdChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIF9fZGljdF9fIGFzc2lnbm1lbnQuLi4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOiBwYXNzCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgYS5fX2RpY3RfXyA9IHsnYic6IDF9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5iLCAxKQorICAgICAgICBkZWYgY2FudCh4LCBkaWN0KToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4Ll9fZGljdF9fID0gZGljdAorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGFsbG93ICVyLl9fZGljdF9fID0gJXIiICUgKHgsIGRpY3QpKQorICAgICAgICBjYW50KGEsIE5vbmUpCisgICAgICAgIGNhbnQoYSwgW10pCisgICAgICAgIGNhbnQoYSwgMSkKKyAgICAgICAgZGVsIGEuX19kaWN0X18gIyBEZWxldGluZyBfX2RpY3RfXyBpcyBhbGxvd2VkCisKKyAgICAgICAgY2xhc3MgQmFzZShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgdmVyaWZ5X2RpY3RfcmVhZG9ubHkoeCk6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHggaGFzIHRvIGJlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgaW5oZXJpdGluZyBmcm9tIEJhc2UuCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIGNhbnQoeCwge30pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVsIHguX19kaWN0X18KKyAgICAgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBhbGxvdyBkZWwgJXIuX19kaWN0X18iICUgeCkKKyAgICAgICAgICAgIGRpY3RfZGVzY3IgPSBCYXNlLl9fZGljdF9fWyJfX2RpY3RfXyJdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGljdF9kZXNjci5fX3NldF9fKHgsIHt9KQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZGljdF9kZXNjciBhbGxvd2VkIGFjY2VzcyB0byAlcidzIGRpY3QiICUgeCkKKworICAgICAgICAjIENsYXNzZXMgZG9uJ3QgYWxsb3cgX19kaWN0X18gYXNzaWdubWVudCBhbmQgaGF2ZSByZWFkb25seSBkaWN0cworICAgICAgICBjbGFzcyBNZXRhMSh0eXBlLCBCYXNlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTWV0YTIoQmFzZSwgdHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEQob2JqZWN0KToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhMQorICAgICAgICBjbGFzcyBFKG9iamVjdCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YTIKKyAgICAgICAgZm9yIGNscyBpbiBDLCBELCBFOgorICAgICAgICAgICAgdmVyaWZ5X2RpY3RfcmVhZG9ubHkoY2xzKQorICAgICAgICAgICAgY2xhc3NfZGljdCA9IGNscy5fX2RpY3RfXworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNsYXNzX2RpY3RbInNwYW0iXSA9ICJlZ2dzIgorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXIncyBfX2RpY3RfXyBjYW4gYmUgbW9kaWZpZWQiICUgY2xzKQorCisgICAgICAgICMgTW9kdWxlcyBhbHNvIGRpc2FsbG93IF9fZGljdF9fIGFzc2lnbm1lbnQKKyAgICAgICAgY2xhc3MgTW9kdWxlMSh0eXBlcy5Nb2R1bGVUeXBlLCBCYXNlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgTW9kdWxlMihCYXNlLCB0eXBlcy5Nb2R1bGVUeXBlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIE1vZHVsZVR5cGUgaW4gTW9kdWxlMSwgTW9kdWxlMjoKKyAgICAgICAgICAgIG1vZCA9IE1vZHVsZVR5cGUoInNwYW0iKQorICAgICAgICAgICAgdmVyaWZ5X2RpY3RfcmVhZG9ubHkobW9kKQorICAgICAgICAgICAgbW9kLl9fZGljdF9fWyJzcGFtIl0gPSAiZWdncyIKKworICAgICAgICAjIEV4Y2VwdGlvbidzIF9fZGljdF9fIGNhbiBiZSByZXBsYWNlZCwgYnV0IG5vdCBkZWxldGVkCisgICAgICAgICMgKGF0IGxlYXN0IG5vdCBhbnkgbW9yZSB0aGFuIHJlZ3VsYXIgZXhjZXB0aW9uJ3MgX19kaWN0X18gY2FuCisgICAgICAgICMgYmUgZGVsZXRlZDsgb24gQ1B5dGhvbiBpdCBpcyBub3QgdGhlIGNhc2UsIHdoZXJlYXMgb24gUHlQeSB0aGV5CisgICAgICAgICMgY2FuLCBqdXN0IGxpa2UgYW55IG90aGVyIG5ldy1zdHlsZSBpbnN0YW5jZSdzIF9fZGljdF9fLikKKyAgICAgICAgZGVmIGNhbl9kZWxldGVfZGljdChlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWwgZS5fX2RpY3RfXworICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgY2xhc3MgRXhjZXB0aW9uMShFeGNlcHRpb24sIEJhc2UpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBFeGNlcHRpb24yKEJhc2UsIEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBFeGNlcHRpb25UeXBlIGluIEV4Y2VwdGlvbiwgRXhjZXB0aW9uMSwgRXhjZXB0aW9uMjoKKyAgICAgICAgICAgIGUgPSBFeGNlcHRpb25UeXBlKCkKKyAgICAgICAgICAgIGUuX19kaWN0X18gPSB7ImEiOiAxfQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmEsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbl9kZWxldGVfZGljdChlKSwgY2FuX2RlbGV0ZV9kaWN0KFZhbHVlRXJyb3IoKSkpCisKKyAgICBkZWYgdGVzdF9waWNrbGVzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcGlja2xpbmcgYW5kIGNvcHlpbmcgbmV3LXN0eWxlIGNsYXNzZXMgYW5kIG9iamVjdHMuLi4KKyAgICAgICAgaW1wb3J0IHBpY2tsZSwgY1BpY2tsZQorCisgICAgICAgIGRlZiBzb3J0ZWRpdGVtcyhkKToKKyAgICAgICAgICAgIEwgPSBkLml0ZW1zKCkKKyAgICAgICAgICAgIEwuc29ydCgpCisgICAgICAgICAgICByZXR1cm4gTAorCisgICAgICAgIGdsb2JhbCBDCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICBzdXBlcihDLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgICAgICAgICAgc2VsZi5hID0gYQorICAgICAgICAgICAgICAgIHNlbGYuYiA9IGIKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkMoJXIsICVyKSIgJSAoc2VsZi5hLCBzZWxmLmIpCisKKyAgICAgICAgZ2xvYmFsIEMxCisgICAgICAgIGNsYXNzIEMxKGxpc3QpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBhLCBiKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoQzEsIGNscykuX19uZXdfXyhjbHMpCisgICAgICAgICAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLmEsIHNlbGYuYikKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhLCBiKToKKyAgICAgICAgICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5iID0gYgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQzEoJXIsICVyKTwlcj4iICUgKHNlbGYuYSwgc2VsZi5iLCBsaXN0KHNlbGYpKQorCisgICAgICAgIGdsb2JhbCBDMgorICAgICAgICBjbGFzcyBDMihpbnQpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBhLCBiLCB2YWw9MCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEMyLCBjbHMpLl9fbmV3X18oY2xzLCB2YWwpCisgICAgICAgICAgICBkZWYgX19nZXRuZXdhcmdzX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIChzZWxmLmEsIHNlbGYuYiwgaW50KHNlbGYpKQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGEsIGIsIHZhbD0wKToKKyAgICAgICAgICAgICAgICBzZWxmLmEgPSBhCisgICAgICAgICAgICAgICAgc2VsZi5iID0gYgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQzIoJXIsICVyKTwlcj4iICUgKHNlbGYuYSwgc2VsZi5iLCBpbnQoc2VsZikpCisKKyAgICAgICAgZ2xvYmFsIEMzCisgICAgICAgIGNsYXNzIEMzKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5mb28KKyAgICAgICAgICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgZm9vKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworCisgICAgICAgIGdsb2JhbCBDNGNsYXNzaWMsIEM0CisgICAgICAgIGNsYXNzIEM0Y2xhc3NpYzogIyBjbGFzc2ljCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEM0KEM0Y2xhc3NpYywgb2JqZWN0KTogIyBtaXhlZCBpbmhlcml0YW5jZQorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciBwIGluIHBpY2tsZSwgY1BpY2tsZToKKyAgICAgICAgICAgIGZvciBiaW4gaW4gMCwgMToKKyAgICAgICAgICAgICAgICBmb3IgY2xzIGluIEMsIEMxLCBDMjoKKyAgICAgICAgICAgICAgICAgICAgcyA9IHAuZHVtcHMoY2xzLCBiaW4pCisgICAgICAgICAgICAgICAgICAgIGNsczIgPSBwLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMyIGlzIGNscykKKworICAgICAgICAgICAgICAgIGEgPSBDMSgxLCAyKTsgYS5hcHBlbmQoNDIpOyBhLmFwcGVuZCgyNCkKKyAgICAgICAgICAgICAgICBiID0gQzIoImhlbGxvIiwgIndvcmxkIiwgNDIpCisgICAgICAgICAgICAgICAgcyA9IHAuZHVtcHMoKGEsIGIpLCBiaW4pCisgICAgICAgICAgICAgICAgeCwgeSA9IHAubG9hZHMocykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX19jbGFzc19fLCBhLl9fY2xhc3NfXykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZGl0ZW1zKHguX19kaWN0X18pLCBzb3J0ZWRpdGVtcyhhLl9fZGljdF9fKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX19jbGFzc19fLCBiLl9fY2xhc3NfXykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZGl0ZW1zKHkuX19kaWN0X18pLCBzb3J0ZWRpdGVtcyhiLl9fZGljdF9fKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoeCksIHJlcHIoYSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHkpLCByZXByKGIpKQorICAgICAgICAgICAgICAgICMgVGVzdCBmb3IgX19nZXRzdGF0ZV9fIGFuZCBfX3NldHN0YXRlX18gb24gbmV3IHN0eWxlIGNsYXNzCisgICAgICAgICAgICAgICAgdSA9IEMzKDQyKQorICAgICAgICAgICAgICAgIHMgPSBwLmR1bXBzKHUsIGJpbikKKyAgICAgICAgICAgICAgICB2ID0gcC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5fX2NsYXNzX18sIHYuX19jbGFzc19fKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5mb28sIHYuZm9vKQorICAgICAgICAgICAgICAgICMgVGVzdCBmb3IgcGlja2xhYmlsaXR5IG9mIGh5YnJpZCBjbGFzcworICAgICAgICAgICAgICAgIHUgPSBDNCgpCisgICAgICAgICAgICAgICAgdS5mb28gPSA0MgorICAgICAgICAgICAgICAgIHMgPSBwLmR1bXBzKHUsIGJpbikKKyAgICAgICAgICAgICAgICB2ID0gcC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5fX2NsYXNzX18sIHYuX19jbGFzc19fKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5mb28sIHYuZm9vKQorCisgICAgICAgICMgVGVzdGluZyBjb3B5LmRlZXBjb3B5KCkKKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgZm9yIGNscyBpbiBDLCBDMSwgQzI6CisgICAgICAgICAgICBjbHMyID0gY29weS5kZWVwY29weShjbHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzMiBpcyBjbHMpCisKKyAgICAgICAgYSA9IEMxKDEsIDIpOyBhLmFwcGVuZCg0Mik7IGEuYXBwZW5kKDI0KQorICAgICAgICBiID0gQzIoImhlbGxvIiwgIndvcmxkIiwgNDIpCisgICAgICAgIHgsIHkgPSBjb3B5LmRlZXBjb3B5KChhLCBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9fY2xhc3NfXywgYS5fX2NsYXNzX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkaXRlbXMoeC5fX2RpY3RfXyksIHNvcnRlZGl0ZW1zKGEuX19kaWN0X18pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuX19jbGFzc19fLCBiLl9fY2xhc3NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWRpdGVtcyh5Ll9fZGljdF9fKSwgc29ydGVkaXRlbXMoYi5fX2RpY3RfXykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih4KSwgcmVwcihhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHkpLCByZXByKGIpKQorCisgICAgZGVmIHRlc3RfcGlja2xlX3Nsb3RzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcGlja2xpbmcgb2YgY2xhc3NlcyB3aXRoIF9fc2xvdHNfXyAuLi4KKyAgICAgICAgaW1wb3J0IHBpY2tsZSwgY1BpY2tsZQorICAgICAgICAjIFBpY2tsaW5nIG9mIGNsYXNzZXMgd2l0aCBfX3Nsb3RzX18gYnV0IHdpdGhvdXQgX19nZXRzdGF0ZV9fIHNob3VsZCBmYWlsCisgICAgICAgIGdsb2JhbCBCLCBDLCBELCBFCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZm9yIGJhc2UgaW4gW29iamVjdCwgQl06CisgICAgICAgICAgICBjbGFzcyBDKGJhc2UpOgorICAgICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsnYSddCisgICAgICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcHMoQygpKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGZhaWw6IHBpY2tsZSBDIGluc3RhbmNlIC0gJXMiICUgYmFzZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjUGlja2xlLmR1bXBzKEMoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBmYWlsOiBjUGlja2xlIEMgaW5zdGFuY2UgLSAlcyIgJSBiYXNlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBpY2tsZS5kdW1wcyhDKCkpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgZmFpbDogcGlja2xlIEQgaW5zdGFuY2UgLSAlcyIgJSBiYXNlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNQaWNrbGUuZHVtcHMoRCgpKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGZhaWw6IGNQaWNrbGUgRCBpbnN0YW5jZSAtICVzIiAlIGJhc2UpCisgICAgICAgICAgICAjIEdpdmUgQyBhIG5pY2UgZ2VuZXJpYyBfX2dldHN0YXRlX18gYW5kIF9fc2V0c3RhdGVfXworICAgICAgICAgICAgY2xhc3MgQyhiYXNlKToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ2EnXQorICAgICAgICAgICAgICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fLmNvcHkoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBkID0ge30KKyAgICAgICAgICAgICAgICAgICAgZm9yIGNscyBpbiBzZWxmLl9fY2xhc3NfXy5fX21yb19fOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNuIGluIGNscy5fX2RpY3RfXy5nZXQoJ19fc2xvdHNfXycsICgpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRbc25dID0gZ2V0YXR0cihzZWxmLCBzbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQKKyAgICAgICAgICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIGQpOgorICAgICAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBkLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGssIHYpCisgICAgICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgTm93IGl0IHNob3VsZCB3b3JrCisgICAgICAgICAgICB4ID0gQygpCisgICAgICAgICAgICB5ID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyh4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cih5LCAnYScpLCAwKQorICAgICAgICAgICAgeSA9IGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyh4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cih5LCAnYScpLCAwKQorICAgICAgICAgICAgeC5hID0gNDIKKyAgICAgICAgICAgIHkgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmEsIDQyKQorICAgICAgICAgICAgeSA9IGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyh4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5hLCA0MikKKyAgICAgICAgICAgIHggPSBEKCkKKyAgICAgICAgICAgIHguYSA9IDQyCisgICAgICAgICAgICB4LmIgPSAxMDAKKyAgICAgICAgICAgIHkgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmEgKyB5LmIsIDE0MikKKyAgICAgICAgICAgIHkgPSBjUGlja2xlLmxvYWRzKGNQaWNrbGUuZHVtcHMoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYSArIHkuYiwgMTQyKQorICAgICAgICAgICAgIyBBIHN1YmNsYXNzIHRoYXQgYWRkcyBhIHNsb3Qgc2hvdWxkIGFsc28gd29yaworICAgICAgICAgICAgY2xhc3MgRShDKToKKyAgICAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ2InXQorICAgICAgICAgICAgeCA9IEUoKQorICAgICAgICAgICAgeC5hID0gNDIKKyAgICAgICAgICAgIHguYiA9ICJmb28iCisgICAgICAgICAgICB5ID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyh4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5hLCB4LmEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYiwgeC5iKQorICAgICAgICAgICAgeSA9IGNQaWNrbGUubG9hZHMoY1BpY2tsZS5kdW1wcyh4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5hLCB4LmEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkuYiwgeC5iKQorCisgICAgZGVmIHRlc3RfYmluYXJ5X29wZXJhdG9yX292ZXJyaWRlKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgb3ZlcnJpZGVzIG9mIGJpbmFyeSBvcGVyYXRpb25zLi4uCisgICAgICAgIGNsYXNzIEkoaW50KToKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkkoJXIpIiAlIGludChzZWxmKQorICAgICAgICAgICAgZGVmIF9fYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBJKGludChzZWxmKSArIGludChvdGhlcikpCisgICAgICAgICAgICBfX3JhZGRfXyA9IF9fYWRkX18KKyAgICAgICAgICAgIGRlZiBfX3Bvd19fKHNlbGYsIG90aGVyLCBtb2Q9Tm9uZSk6CisgICAgICAgICAgICAgICAgaWYgbW9kIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJKHBvdyhpbnQoc2VsZiksIGludChvdGhlcikpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJKHBvdyhpbnQoc2VsZiksIGludChvdGhlciksIGludChtb2QpKSkKKyAgICAgICAgICAgIGRlZiBfX3Jwb3dfXyhzZWxmLCBvdGhlciwgbW9kPU5vbmUpOgorICAgICAgICAgICAgICAgIGlmIG1vZCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gSShwb3coaW50KG90aGVyKSwgaW50KHNlbGYpLCBtb2QpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJKHBvdyhpbnQob3RoZXIpLCBpbnQoc2VsZiksIGludChtb2QpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoSSgxKSArIEkoMikpLCAiSSgzKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihJKDEpICsgMiksICJJKDMpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKDEgKyBJKDIpKSwgIkkoMykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoSSgyKSAqKiBJKDMpKSwgIkkoOCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoMiAqKiBJKDMpKSwgIkkoOCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoSSgyKSAqKiAzKSwgIkkoOCkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocG93KEkoMiksIEkoMyksIEkoNSkpKSwgIkkoMykiKQorICAgICAgICBjbGFzcyBTKHN0cik6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5sb3dlcigpID09IG90aGVyLmxvd2VyKCkKKyAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19wcm9wYWdhdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHByb3BhZ2F0aW9uIG9mIHNsb3QgZnVuY3Rpb25zIHRvIHN1YmNsYXNzZXMuLi4KKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBEKEIsIEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkID0gRCgpCisgICAgICAgIG9yaWdfaGFzaCA9IGhhc2goZCkgIyByZWxhdGVkIHRvIGlkKGQpIGluIHBsYXRmb3JtLWRlcGVuZGVudCB3YXlzCisgICAgICAgIEEuX19oYXNoX18gPSBsYW1iZGEgc2VsZjogNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCA0MikKKyAgICAgICAgQy5fX2hhc2hfXyA9IGxhbWJkYSBzZWxmOiAzMTQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGQpLCAzMTQpCisgICAgICAgIEIuX19oYXNoX18gPSBsYW1iZGEgc2VsZjogMTQ0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgMTQ0KQorICAgICAgICBELl9faGFzaF9fID0gbGFtYmRhIHNlbGY6IDEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIDEwMCkKKyAgICAgICAgRC5fX2hhc2hfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBkKQorICAgICAgICBkZWwgRC5fX2hhc2hfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIDE0NCkKKyAgICAgICAgQi5fX2hhc2hfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBkKQorICAgICAgICBkZWwgQi5fX2hhc2hfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIDMxNCkKKyAgICAgICAgQy5fX2hhc2hfXyA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBkKQorICAgICAgICBkZWwgQy5fX2hhc2hfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZCksIDQyKQorICAgICAgICBBLl9faGFzaF9fID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGQpCisgICAgICAgIGRlbCBBLl9faGFzaF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChkKSwgb3JpZ19oYXNoKQorICAgICAgICBkLmZvbyA9IDQyCisgICAgICAgIGQuYmFyID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbywgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5iYXIsIDQyKQorICAgICAgICBkZWYgX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gImZvbyI6CisgICAgICAgICAgICAgICAgcmV0dXJuIDI0CisgICAgICAgICAgICByZXR1cm4gb2JqZWN0Ll9fZ2V0YXR0cmlidXRlX18oc2VsZiwgbmFtZSkKKyAgICAgICAgQS5fX2dldGF0dHJpYnV0ZV9fID0gX19nZXRhdHRyaWJ1dGVfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmJhciwgNDIpCisgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIGlmIG5hbWUgaW4gKCJzcGFtIiwgImZvbyIsICJiYXIiKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImhlbGxvIgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKKyAgICAgICAgQi5fX2dldGF0dHJfXyA9IF9fZ2V0YXR0cl9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5zcGFtLCAiaGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmJhciwgNDIpCisgICAgICAgIGRlbCBBLl9fZ2V0YXR0cmlidXRlX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbywgNDIpCisgICAgICAgIGRlbCBkLmZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCAiaGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuYmFyLCA0MikKKyAgICAgICAgZGVsIEIuX19nZXRhdHRyX18KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZC5mb28KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkLmZvbyBzaG91bGQgYmUgdW5kZWZpbmVkIG5vdyIpCisKKyAgICAgICAgIyBUZXN0IGEgbmFzdHkgYnVnIGluIHJlY3Vyc2VfZG93bl9zdWJjbGFzc2VzKCkKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWwgQgorICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIEEuX19zZXRpdGVtX18gPSBsYW1iZGEgKmE6IE5vbmUgIyBjcmFzaAorCisgICAgZGVmIHRlc3RfYnVmZmVyX2luaGVyaXRhbmNlKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgdGhhdCBidWZmZXIgaW50ZXJmYWNlIGlzIGluaGVyaXRlZCAuLi4KKworICAgICAgICBpbXBvcnQgYmluYXNjaWkKKyAgICAgICAgIyBTRiBidWcgWyM0NzAwNDBdIFBhcnNlVHVwbGUgdCMgdnMgc3ViY2xhc3Nlcy4KKworICAgICAgICBjbGFzcyBNeVN0cihzdHIpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBiYXNlID0gJ2FiYycKKyAgICAgICAgbSA9IE15U3RyKGJhc2UpCisgICAgICAgICMgYjJhX2hleCB1c2VzIHRoZSBidWZmZXIgaW50ZXJmYWNlIHRvIGdldCBpdHMgYXJndW1lbnQncyB2YWx1ZSwgdmlhCisgICAgICAgICMgUHlBcmdfUGFyc2VUdXBsZSAndCMnIGNvZGUuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluYXNjaWkuYjJhX2hleChtKSwgYmluYXNjaWkuYjJhX2hleChiYXNlKSkKKworICAgICAgICAjIEl0J3Mgbm90IGNsZWFyIHRoYXQgdW5pY29kZSB3aWxsIGNvbnRpbnVlIHRvIHN1cHBvcnQgdGhlIGNoYXJhY3RlcgorICAgICAgICAjIGJ1ZmZlciBpbnRlcmZhY2UsIGFuZCB0aGlzIHRlc3Qgd2lsbCBmYWlsIGlmIHRoYXQncyB0YWtlbiBhd2F5LgorICAgICAgICBjbGFzcyBNeVVuaSh1bmljb2RlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYmFzZSA9IHUnYWJjJworICAgICAgICBtID0gTXlVbmkoYmFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5iMmFfaGV4KG0pLCBiaW5hc2NpaS5iMmFfaGV4KGJhc2UpKQorCisgICAgICAgIGNsYXNzIE15SW50KGludCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIG0gPSBNeUludCg0MikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYmluYXNjaWkuYjJhX2hleChtKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdzdWJjbGFzcyBvZiBpbnQgc2hvdWxkIG5vdCBoYXZlIGEgYnVmZmVyIGludGVyZmFjZScpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zdHJfb2Zfc3RyX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19zdHJfXyBkZWZpbmVkIGluIHN1YmNsYXNzIG9mIHN0ciAuLi4KKyAgICAgICAgaW1wb3J0IGJpbmFzY2lpCisgICAgICAgIGltcG9ydCBjU3RyaW5nSU8KKworICAgICAgICBjbGFzcyBvY3RldHN0cmluZyhzdHIpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmFzY2lpLmIyYV9oZXgoc2VsZikKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZiArICIgcmVwciIKKworICAgICAgICBvID0gb2N0ZXRzdHJpbmcoJ0EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobyksIG9jdGV0c3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3RyKG8pKSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVwcihvKSksIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmQobyksIDB4NDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG8pLCAnNDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIobyksICdBIHJlcHInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uX19zdHJfXygpLCAnNDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uX19yZXByX18oKSwgJ0EgcmVwcicpCisKKyAgICAgICAgY2FwdHVyZSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICMgQ2FsbGluZyBzdHIoKSBvciBub3QgZXhlcmNpc2VzIGRpZmZlcmVudCBpbnRlcm5hbCBwYXRocy4KKyAgICAgICAgcHJpbnQgPj4gY2FwdHVyZSwgbworICAgICAgICBwcmludCA+PiBjYXB0dXJlLCBzdHIobykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXB0dXJlLmdldHZhbHVlKCksICc0MVxuNDFcbicpCisgICAgICAgIGNhcHR1cmUuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfa2V5d29yZF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBrZXl3b3JkIGFyZ3VtZW50cyB0byBfX2luaXRfXywgX19jYWxsX18uLi4KKyAgICAgICAgZGVmIGYoYSk6IHJldHVybiBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5fX2NhbGxfXyhhPTQyKSwgNDIpCisgICAgICAgIGEgPSBbXQorICAgICAgICBsaXN0Ll9faW5pdF9fKGEsIHNlcXVlbmNlPVswLCAxLCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMCwgMSwgMl0pCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpdmVfY2FsbChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHJlY3Vyc2l2ZSBfX2NhbGxfXygpIGJ5IHNldHRpbmcgdG8gaW5zdGFuY2Ugb2YgY2xhc3MuLi4KKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIEEuX19jYWxsX18gPSBBKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgQSgpKCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVjdXJzaW9uIGxpbWl0IHNob3VsZCBoYXZlIGJlZW4gcmVhY2hlZCBmb3IgX19jYWxsX18oKSIpCisKKyAgICBkZWYgdGVzdF9kZWxldGVfaG9vayhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIF9fZGVsX18gaG9vay4uLgorICAgICAgICBsb2cgPSBbXQorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBsb2cuYXBwZW5kKDEpCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2csIFtdKQorICAgICAgICBkZWwgYworICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLCBbMV0pCisKKyAgICAgICAgY2xhc3MgRChvYmplY3QpOiBwYXNzCisgICAgICAgIGQgPSBEKCkKKyAgICAgICAgdHJ5OiBkZWwgZFswXQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiaW52YWxpZCBkZWwoKSBkaWRuJ3QgcmFpc2UgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X2hhc2hfaW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBoYXNoIG9mIG11dGFibGUgc3ViY2xhc3Nlcy4uLgorCisgICAgICAgIGNsYXNzIG15ZGljdChkaWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZCA9IG15ZGljdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhhc2goZCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaGFzaCgpIG9mIGRpY3Qgc3ViY2xhc3Mgc2hvdWxkIGZhaWwiKQorCisgICAgICAgIGNsYXNzIG15bGlzdChsaXN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZCA9IG15bGlzdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhhc2goZCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaGFzaCgpIG9mIGxpc3Qgc3ViY2xhc3Mgc2hvdWxkIGZhaWwiKQorCisgICAgZGVmIHRlc3Rfc3RyX29wZXJhdGlvbnMoc2VsZik6CisgICAgICAgIHRyeTogJ2EnICsgNQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiJycgKyA1IGRvZXNuJ3QgcmFpc2UgVHlwZUVycm9yIikKKworICAgICAgICB0cnk6ICcnLnNwbGl0KCcnKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIicnLnNwbGl0KCcnKSBkb2Vzbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgICAgIHRyeTogJycuam9pbihbMF0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCInJy5qb2luKFswXSkgZG9lc24ndCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgICAgIHRyeTogJycucmluZGV4KCc1JykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCInJy5yaW5kZXgoJzUnKSBkb2Vzbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgICAgIHRyeTogJyUobilzJyAlIE5vbmUKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIiclKG4pcycgJSBOb25lIGRvZXNuJ3QgcmFpc2UgVHlwZUVycm9yIikKKworICAgICAgICB0cnk6ICclKG4nICUge30KKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCInJShuJyAlIHt9ICcnIGRvZXNuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAnJSpzJyAlICgnYWJjJykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIiclKnMnICUgKCdhYmMnKSBkb2Vzbid0IHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAnJSouKnMnICUgKCdhYmMnLCA1KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiJyUqLipzJyAlICgnYWJjJywgNSkgZG9lc24ndCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgICAgIHRyeTogJyVzJyAlICgxLCAyKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiJyVzJyAlICgxLCAyKSBkb2Vzbid0IHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAnJScgJSBOb25lCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiJyUnICUgTm9uZSBkb2Vzbid0IHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzUzNDI1MycuaXNkaWdpdCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCc1MzQyNTN4Jy5pc2RpZ2l0KCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVjJyAlIDUsICdceDA1JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJWMnICUgJzUnLCAnNScpCisKKyAgICBkZWYgdGVzdF9kZWVwY29weV9yZWN1cnNpdmUoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkZWVwY29weSBvZiByZWN1cnNpdmUgb2JqZWN0cy4uLgorICAgICAgICBjbGFzcyBOb2RlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gTm9kZSgpCisgICAgICAgIGIgPSBOb2RlKCkKKyAgICAgICAgYS5iID0gYgorICAgICAgICBiLmEgPSBhCisgICAgICAgIHogPSBkZWVwY29weShhKSAjIFRoaXMgYmxldyB1cCBiZWZvcmUKKworICAgIGRlZiB0ZXN0X3VuaW50aWFsaXplZF9tb2R1bGVzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgdW5pbml0aWFsaXplZCBtb2R1bGUgb2JqZWN0cy4uLgorICAgICAgICBmcm9tIHR5cGVzIGltcG9ydCBNb2R1bGVUeXBlIGFzIE0KKyAgICAgICAgbSA9IE0uX19uZXdfXyhNKQorICAgICAgICBzdHIobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNhdHRyKG0sICJfX25hbWVfXyIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2F0dHIobSwgIl9fZmlsZV9fIiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihtLCAiZm9vIiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5fX2RpY3RfXykgICAjIE5vbmUgb3Ige30gYXJlIGJvdGggcmVhc29uYWJsZSBhbnN3ZXJzCisgICAgICAgIG0uZm9vID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uX19kaWN0X18sIHsiZm9vIjogMX0pCisKKyAgICBkZWYgdGVzdF9mdW5ueV9uZXcoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBfX25ld19fIHJldHVybmluZyBzb21ldGhpbmcgdW5leHBlY3RlZC4uLgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGFyZyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhcmcsIHN0cik6IHJldHVybiBbMSwgMiwgM10KKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UoYXJnLCBpbnQpOiByZXR1cm4gb2JqZWN0Ll9fbmV3X18oRCkKKyAgICAgICAgICAgICAgICBlbHNlOiByZXR1cm4gb2JqZWN0Ll9fbmV3X18oY2xzKQorICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6CisgICAgICAgICAgICAgICAgc2VsZi5mb28gPSBhcmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDKCIxIiksIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEKCIxIiksIFsxLCAyLCAzXSkKKyAgICAgICAgZCA9IEQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZvbywgTm9uZSkKKyAgICAgICAgZCA9IEMoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc2luc3RhbmNlKGQsIEQpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZm9vLCAxKQorICAgICAgICBkID0gRCgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoZCwgRCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mb28sIDEpCisKKyAgICBkZWYgdGVzdF9pbXVsX2J1ZyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGZvciBfX2ltdWxfXyBwcm9ibGVtcy4uLgorICAgICAgICAjIFNGIGJ1ZyA1NDQ2NDcKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW11bF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKHNlbGYsIG90aGVyKQorICAgICAgICB4ID0gQygpCisgICAgICAgIHkgPSB4CisgICAgICAgIHkgKj0gMS4wCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgKHgsIDEuMCkpCisgICAgICAgIHkgPSB4CisgICAgICAgIHkgKj0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksICh4LCAyKSkKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeSAqPSAzTAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksICh4LCAzTCkpCisgICAgICAgIHkgPSB4CisgICAgICAgIHkgKj0gMUw8PDEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksICh4LCAxTDw8MTAwKSkKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeSAqPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgKHgsIE5vbmUpKQorICAgICAgICB5ID0geAorICAgICAgICB5ICo9ICJmb28iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgKHgsICJmb28iKSkKKworICAgIGRlZiB0ZXN0X2NvcHlfc2V0c3RhdGUoc2VsZik6CisgICAgICAgICMgVGVzdGluZyB0aGF0IGNvcHkuKmNvcHkoKSBjb3JyZWN0bHkgdXNlcyBfX3NldHN0YXRlX18uLi4KKyAgICAgICAgaW1wb3J0IGNvcHkKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbz1Ob25lKToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbyA9IGZvbworICAgICAgICAgICAgICAgIHNlbGYuX19mb28gPSBmb28KKyAgICAgICAgICAgIGRlZiBzZXRmb28oc2VsZiwgZm9vPU5vbmUpOgorICAgICAgICAgICAgICAgIHNlbGYuZm9vID0gZm9vCisgICAgICAgICAgICBkZWYgZ2V0Zm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZm9vCisgICAgICAgICAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBbc2VsZi5mb29dCisgICAgICAgICAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGZfLCBsc3QpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxzdCksIDEpCisgICAgICAgICAgICAgICAgc2VsZl8uX19mb28gPSBzZWxmXy5mb28gPSBsc3RbMF0KKyAgICAgICAgYSA9IEMoNDIpCisgICAgICAgIGEuc2V0Zm9vKDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuZm9vLCAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLmdldGZvbygpLCA0MikKKyAgICAgICAgYiA9IGNvcHkuY29weShhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZm9vLCAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmdldGZvbygpLCAyNCkKKyAgICAgICAgYiA9IGNvcHkuZGVlcGNvcHkoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLmZvbywgMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5nZXRmb28oKSwgMjQpCisKKyAgICBkZWYgdGVzdF9zbGljZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBjYXNlcyB3aXRoIHNsaWNlcyBhbmQgb3ZlcnJpZGRlbiBfX2dldGl0ZW1fXyAuLi4KKworICAgICAgICAjIFN0cmluZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiaGVsbG8iWzo0XSwgImhlbGwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJoZWxsbyJbc2xpY2UoNCldLCAiaGVsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyLl9fZ2V0aXRlbV9fKCJoZWxsbyIsIHNsaWNlKDQpKSwgImhlbGwiKQorICAgICAgICBjbGFzcyBTKHN0cik6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ci5fX2dldGl0ZW1fXyhzZWxmLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFMoImhlbGxvIilbOjRdLCAiaGVsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUygiaGVsbG8iKVtzbGljZSg0KV0sICJoZWxsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTKCJoZWxsbyIpLl9fZ2V0aXRlbV9fKHNsaWNlKDQpKSwgImhlbGwiKQorICAgICAgICAjIFR1cGxlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxLDIsMylbOjJdLCAoMSwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSwyLDMpW3NsaWNlKDIpXSwgKDEsMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUuX19nZXRpdGVtX18oKDEsMiwzKSwgc2xpY2UoMikpLCAoMSwyKSkKKyAgICAgICAgY2xhc3MgVCh0dXBsZSk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHR1cGxlLl9fZ2V0aXRlbV9fKHNlbGYsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVCgoMSwyLDMpKVs6Ml0sICgxLDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFQoKDEsMiwzKSlbc2xpY2UoMildLCAoMSwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUKCgxLDIsMykpLl9fZ2V0aXRlbV9fKHNsaWNlKDIpKSwgKDEsMikpCisgICAgICAgICMgTGlzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbMSwyLDNdWzoyXSwgWzEsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsMiwzXVtzbGljZSgyKV0sIFsxLDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QuX19nZXRpdGVtX18oWzEsMiwzXSwgc2xpY2UoMikpLCBbMSwyXSkKKyAgICAgICAgY2xhc3MgTChsaXN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdC5fX2dldGl0ZW1fXyhzZWxmLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwoWzEsMiwzXSlbOjJdLCBbMSwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMKFsxLDIsM10pW3NsaWNlKDIpXSwgWzEsMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTChbMSwyLDNdKS5fX2dldGl0ZW1fXyhzbGljZSgyKSksIFsxLDJdKQorICAgICAgICAjIE5vdyBkbyBsaXN0cyBhbmQgX19zZXRpdGVtX18KKyAgICAgICAgYSA9IEwoWzEsMiwzXSkKKyAgICAgICAgYVtzbGljZSgxLCAzKV0gPSBbMywyXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIFsxLDMsMl0pCisgICAgICAgIGFbc2xpY2UoMCwgMiwgMSldID0gWzMsMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMywxLDJdKQorICAgICAgICBhLl9fc2V0aXRlbV9fKHNsaWNlKDEsIDMpLCBbMiwxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMywyLDFdKQorICAgICAgICBhLl9fc2V0aXRlbV9fKHNsaWNlKDAsIDIsIDEpLCBbMiwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBbMiwzLDFdKQorCisgICAgZGVmIHRlc3Rfc3VidHlwZV9yZXN1cnJlY3Rpb24oc2VsZik6CisgICAgICAgICMgVGVzdGluZyByZXN1cnJlY3Rpb24gb2YgbmV3LXN0eWxlIGluc3RhbmNlLi4uCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgY29udGFpbmVyID0gW10KKworICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgIyByZXN1cnJlY3QgdGhlIGluc3RhbmNlCisgICAgICAgICAgICAgICAgQy5jb250YWluZXIuYXBwZW5kKHNlbGYpCisKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBjLmF0dHIgPSA0MgorCisgICAgICAgICMgVGhlIG1vc3QgaW50ZXJlc3RpbmcgdGhpbmcgaGVyZSBpcyB3aGV0aGVyIHRoaXMgYmxvd3MgdXAsIGR1ZSB0bworICAgICAgICAjIGZsYXdlZCBHQyB0cmFja2luZyBsb2dpYyBpbiB0eXBlb2JqZWN0LmMncyBjYWxsX2ZpbmFsaXplcigpIChhIDIuMi4xCisgICAgICAgICMgYnVnKS4KKyAgICAgICAgZGVsIGMKKworICAgICAgICAjIElmIHRoYXQgZGlkbid0IGJsb3cgdXAsIGl0J3MgYWxzbyBpbnRlcmVzdGluZyB0byBzZWUgd2hldGhlciBjbGVhcmluZworICAgICAgICAjIHRoZSBsYXN0IGNvbnRhaW5lciBzbG90IHdvcmtzOiB0aGF0IHdpbGwgYXR0ZW1wdCB0byBkZWxldGUgYyBhZ2FpbiwKKyAgICAgICAgIyB3aGljaCB3aWxsIGNhdXNlIGMgdG8gZ2V0IGFwcGVuZGVkIGJhY2sgdG8gdGhlIGNvbnRhaW5lciBhZ2FpbgorICAgICAgICAjICJkdXJpbmciIHRoZSBkZWwuICAoT24gbm9uLUNQeXRob24gaW1wbGVtZW50YXRpb25zLCBob3dldmVyLCBfX2RlbF9fCisgICAgICAgICMgaXMgdHlwaWNhbGx5IG5vdCBjYWxsZWQgYWdhaW4uKQorICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEMuY29udGFpbmVyKSwgMSkKKyAgICAgICAgZGVsIEMuY29udGFpbmVyWy0xXQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuY2hlY2tfaW1wbF9kZXRhaWwoKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEMuY29udGFpbmVyKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5jb250YWluZXJbLTFdLmF0dHIsIDQyKQorCisgICAgICAgICMgTWFrZSBjIG1vcnRhbCBhZ2Fpbiwgc28gdGhhdCB0aGUgdGVzdCBmcmFtZXdvcmsgd2l0aCAtbCBkb2Vzbid0IHJlcG9ydAorICAgICAgICAjIGl0IGFzIGEgbGVhay4KKyAgICAgICAgZGVsIEMuX19kZWxfXworCisgICAgZGVmIHRlc3Rfc2xvdHNfdHJhc2goc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzbG90IHRyYXNoLi4uCisgICAgICAgICMgRGVhbGxvY2F0aW5nIGRlZXBseSBuZXN0ZWQgc2xvdHRlZCB0cmFzaCBjYXVzZWQgc3RhY2sgb3ZlcmZsb3dzCisgICAgICAgIGNsYXNzIHRyYXNoKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX18gPSBbJ3gnXQorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgbyA9IE5vbmUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDUwMDAwKToKKyAgICAgICAgICAgIG8gPSB0cmFzaChvKQorICAgICAgICBkZWwgbworCisgICAgZGVmIHRlc3Rfc2xvdHNfbXVsdGlwbGVfaW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgICMgU0YgYnVnIDU3NTIyOSwgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugdy8gc2xvdHMgZHVtcHMgY29yZQorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBfX3Nsb3RzX189KCkKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDKEEsQikgOgorICAgICAgICAgICAgX19zbG90c19fPSgpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5jaGVja19pbXBsX2RldGFpbCgpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fYmFzaWNzaXplX18sIEIuX19iYXNpY3NpemVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoQywgJ19fZGljdF9fJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKEMsICdfX3dlYWtyZWZfXycpKQorICAgICAgICBDKCkueCA9IDIKKworICAgIGRlZiB0ZXN0X3JtdWwoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBjb3JyZWN0IGludm9jYXRpb24gb2YgX19ybXVsX18uLi4KKyAgICAgICAgIyBTRiBwYXRjaCA1OTI2NDYKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAibXVsIgorICAgICAgICAgICAgZGVmIF9fcm11bF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gInJtdWwiCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhKjIsICJtdWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEqMi4yLCAibXVsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyKmEsICJybXVsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLjIqYSwgInJtdWwiKQorCisgICAgZGVmIHRlc3RfaXBvdyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGNvcnJlY3QgaW52b2NhdGlvbiBvZiBfX2lwb3dfXy4uLgorICAgICAgICAjIFtTRiBidWcgNjIwMTc5XQorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pcG93X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEMoKQorICAgICAgICBhICoqPSAyCisKKyAgICBkZWYgdGVzdF9tdXRhYmxlX2Jhc2VzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbXV0YWJsZSBiYXNlcy4uLgorCisgICAgICAgICMgc3R1ZmYgdGhhdCBzaG91bGQgd29yazoKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDMihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cmlidXRlX18oc2VsZiwgYXR0cik6CisgICAgICAgICAgICAgICAgaWYgYXR0ciA9PSAnYSc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAyCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEMyLCBzZWxmKS5fX2dldGF0dHJpYnV0ZV9fKGF0dHIpCisgICAgICAgICAgICBkZWYgbWV0aChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBjbGFzcyBEKEMpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBFKEQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkID0gRCgpCisgICAgICAgIGUgPSBFKCkKKyAgICAgICAgRC5fX2Jhc2VzX18gPSAoQywpCisgICAgICAgIEQuX19iYXNlc19fID0gKEMyLCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLm1ldGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1ldGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMyLl9fc3ViY2xhc3Nlc19fKCksIFtEXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgRC5fX2Jhc2VzX18KKyAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGJlIGFibGUgdG8gZGVsZXRlIC5fX2Jhc2VzX18iKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEQuX19iYXNlc19fID0gKCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOgorICAgICAgICAgICAgaWYgc3RyKG1zZykgPT0gImEgbmV3LXN0eWxlIGNsYXNzIGNhbid0IGhhdmUgb25seSBjbGFzc2ljIGJhc2VzIjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGVycm9yIG1lc3NhZ2UgZm9yIC5fX2Jhc2VzX18gPSAoKSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBiZSBhYmxlIHRvIHNldCAuX19iYXNlc19fIHRvICgpIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBELl9fYmFzZXNfXyA9IChELCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgYWN0dWFsbHksIHdlJ2xsIGhhdmUgY3Jhc2hlZCBieSBoZXJlLi4uCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBiZSBhYmxlIHRvIGNyZWF0ZSBpbmhlcml0YW5jZSBjeWNsZXMiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEQuX19iYXNlc19fID0gKEMsIEMpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZG4ndCBkZXRlY3QgcmVwZWF0ZWQgYmFzZSBjbGFzc2VzIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBELl9fYmFzZXNfXyA9IChFLCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGJlIGFibGUgdG8gY3JlYXRlIGluaGVyaXRhbmNlIGN5Y2xlcyIpCisKKyAgICAgICAgIyBsZXQncyB0aHJvdyBhIGNsYXNzaWMgY2xhc3MgaW50byB0aGUgbWl4OgorICAgICAgICBjbGFzcyBDbGFzc2ljOgorICAgICAgICAgICAgZGVmIG1ldGgyKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAzCisKKyAgICAgICAgRC5fX2Jhc2VzX18gPSAoQywgQ2xhc3NpYykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQubWV0aDIoKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1ldGgyKCksIDMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGQuYQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImF0dHJpYnV0ZSBzaG91bGQgaGF2ZSB2YW5pc2hlZCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRC5fX2Jhc2VzX18gPSAoQ2xhc3NpYywpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5ldy1zdHlsZSBjbGFzcyBtdXN0IGhhdmUgYSBuZXctc3R5bGUgYmFzZSIpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2Jhc2VzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBhbGwgdGhlIGJ1aWx0aW4gdHlwZXMgY2FuIGhhdmUgdGhlaXIgYmFzZSBxdWVyaWVkIHdpdGhvdXQKKyAgICAgICAgIyBzZWdmYXVsdGluZy4gU2VlIGlzc3VlICM1Nzg3LgorICAgICAgICBidWlsdGluX3R5cGVzID0gW3RwIGZvciB0cCBpbiBfX2J1aWx0aW5fXy5fX2RpY3RfXy5pdGVydmFsdWVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRwLCB0eXBlKV0KKyAgICAgICAgZm9yIHRwIGluIGJ1aWx0aW5fdHlwZXM6CisgICAgICAgICAgICBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyh0cCwgIl9fYmFzZXNfXyIpCisgICAgICAgICAgICBpZiB0cCBpcyBub3Qgb2JqZWN0OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRwLl9fYmFzZXNfXyksIDEsIHRwKQorCisgICAgICAgIGNsYXNzIEwobGlzdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgTC5fX2Jhc2VzX18gPSAoZGljdCwpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCB0dXJuIGxpc3Qgc3ViY2xhc3MgaW50byBkaWN0IHN1YmNsYXNzIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsaXN0Ll9fYmFzZXNfXyA9IChkaWN0LCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkbid0IGJlIGFibGUgdG8gYXNzaWduIHRvIGxpc3QuX19iYXNlc19fIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBELl9fYmFzZXNfXyA9IChDLCBsaXN0KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IDAsICJiZXN0X2Jhc2UgY2FsY3VsYXRpb24gZm91bmQgd2FudGluZyIKKworCisgICAgZGVmIHRlc3RfbXV0YWJsZV9iYXNlc193aXRoX2ZhaWxpbmdfbXJvKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbXV0YWJsZSBiYXNlcyB3aXRoIGZhaWxpbmcgbXJvLi4uCisgICAgICAgIGNsYXNzIFdvcmtPbmNlKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oc2VsZiwgbmFtZSwgYmFzZXMsIG5zKToKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWcgPSAwCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKFdvcmtPbmNlLCBzZWxmKS5fX25ld19fKFdvcmtPbmNlLCBuYW1lLCBiYXNlcywgbnMpCisgICAgICAgICAgICBkZWYgbXJvKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmxhZyA+IDA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImJvem8iCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mbGFnICs9IDEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUubXJvKHNlbGYpCisKKyAgICAgICAgY2xhc3MgV29ya0Fsd2F5cyh0eXBlKToKKyAgICAgICAgICAgIGRlZiBtcm8oc2VsZik6CisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgLm1ybygpcyBhcmVuJ3QgY2FsbGVkCisgICAgICAgICAgICAgICAgIyB3aXRoIGFuIGV4Y2VwdGlvbiBzZXQgKHdoaWNoIHdhcyBwb3NzaWJsZSBhdCBvbmUgcG9pbnQpLgorICAgICAgICAgICAgICAgICMgQW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIHByaW50ZWQgaW4gYSBkZWJ1ZyBidWlsZC4KKyAgICAgICAgICAgICAgICAjIFdoYXQncyBhIGdvb2Qgd2F5IHRvIHRlc3QgZm9yIHRoaXM/CisgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUubXJvKHNlbGYpCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEMyKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBFKEQpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEYoRCk6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gV29ya09uY2UKKworICAgICAgICBjbGFzcyBHKEQpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IFdvcmtBbHdheXMKKworICAgICAgICAjIEltbWVkaWF0ZSBzdWJjbGFzc2VzIGhhdmUgdGhlaXIgbXJvJ3MgYWRqdXN0ZWQgaW4gYWxwaGFiZXRpY2FsCisgICAgICAgICMgb3JkZXIsIHNvIEUncyB3aWxsIGdldCBhZGp1c3RlZCBiZWZvcmUgYWRqdXN0aW5nIEYncyBmYWlscy4gIFdlCisgICAgICAgICMgY2hlY2sgaGVyZSB0aGF0IEUncyBnZXRzIHJlc3RvcmVkLgorCisgICAgICAgIEVfbXJvX2JlZm9yZSA9IEUuX19tcm9fXworICAgICAgICBEX21yb19iZWZvcmUgPSBELl9fbXJvX18KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBELl9fYmFzZXNfXyA9IChDMiwpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUuX19tcm9fXywgRV9tcm9fYmVmb3JlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChELl9fbXJvX18sIERfbXJvX2JlZm9yZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhjZXB0aW9uIG5vdCBwcm9wYWdhdGVkIikKKworICAgIGRlZiB0ZXN0X211dGFibGVfYmFzZXNfY2F0Y2hfbXJvX2NvbmZsaWN0KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbXV0YWJsZSBiYXNlcyBjYXRjaCBtcm8gY29uZmxpY3QuLi4KKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEIob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBDKEEsIEIpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEQoQSwgQik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgRShDLCBEKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBDLl9fYmFzZXNfXyA9IChCLCBBKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWRuJ3QgY2F0Y2ggTVJPIGNvbmZsaWN0IikKKworICAgIGRlZiB0ZXN0X211dGFibGVfbmFtZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBtdXRhYmxlIG5hbWVzLi4uCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIEMuX19tb2R1bGVfXyBjb3VsZCBiZSAndGVzdF9kZXNjcicgb3IgJ19fbWFpbl9fJworICAgICAgICBtb2QgPSBDLl9fbW9kdWxlX18KKworICAgICAgICBDLl9fbmFtZV9fID0gJ0QnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKEMuX19tb2R1bGVfXywgQy5fX25hbWVfXyksIChtb2QsICdEJykpCisKKyAgICAgICAgQy5fX25hbWVfXyA9ICdELkUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKEMuX19tb2R1bGVfXywgQy5fX25hbWVfXyksIChtb2QsICdELkUnKSkKKworICAgIGRlZiB0ZXN0X2V2aWxfdHlwZV9uYW1lKHNlbGYpOgorICAgICAgICAjIEEgYmFkbHkgcGxhY2VkIFB5X0RFQ1JFRiBpbiB0eXBlX3NldF9uYW1lIGxlZCB0byBhcmJpdHJhcnkgY29kZQorICAgICAgICAjIGV4ZWN1dGlvbiB3aGlsZSB0aGUgdHlwZSBzdHJ1Y3R1cmUgd2FzIG5vdCBpbiBhIHNhbmUgc3RhdGUsIGFuZCBhCisgICAgICAgICMgcG9zc2libGUgc2VnbWVudGF0aW9uIGZhdWx0IGFzIGEgcmVzdWx0LiAgU2VlIGJ1ZyAjMTY0NDcuCisgICAgICAgIGNsYXNzIE5hc3R5KHN0cik6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBDLl9fbmFtZV9fID0gIm90aGVyIgorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBDLl9fbmFtZV9fID0gTmFzdHkoImFiYyIpCisgICAgICAgIEMuX19uYW1lX18gPSAibm9ybWFsIgorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmlnaHRfb3Aoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBjb3JyZWN0IGRpc3BhdGNoIG9mIHN1YmNsYXNzIG92ZXJsb2FkaW5nIF9fcjxvcD5fXy4uLgorCisgICAgICAgICMgVGhpcyBjb2RlIHRlc3RzIHZhcmlvdXMgY2FzZXMgd2hlcmUgcmlnaHQtZGlzcGF0Y2ggb2YgYSBzdWJjbGFzcworICAgICAgICAjIHNob3VsZCBiZSBwcmVmZXJyZWQgb3ZlciBsZWZ0LWRpc3BhdGNoIG9mIGEgYmFzZSBjbGFzcy4KKworICAgICAgICAjIENhc2UgMTogc3ViY2xhc3Mgb2YgaW50OyB0aGlzIHRlc3RzIGNvZGUgaW4gYWJzdHJhY3QuYzo6YmluYXJ5X29wMSgpCisKKyAgICAgICAgY2xhc3MgQihpbnQpOgorICAgICAgICAgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJCLl9fZmxvb3JkaXZfXyIKKyAgICAgICAgICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkIuX19yZmxvb3JkaXZfXyIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEIoMSkgLy8gMSwgIkIuX19mbG9vcmRpdl9fIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxIC8vIEIoMSksICJCLl9fcmZsb29yZGl2X18iKQorCisgICAgICAgICMgQ2FzZSAyOiBzdWJjbGFzcyBvZiBvYmplY3Q7IHRoaXMgaXMganVzdCB0aGUgYmFzZWxpbmUgZm9yIGNhc2UgMworCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAiQy5fX2Zsb29yZGl2X18iCisgICAgICAgICAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJDLl9fcmZsb29yZGl2X18iCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDKCkgLy8gMSwgIkMuX19mbG9vcmRpdl9fIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxIC8vIEMoKSwgIkMuX19yZmxvb3JkaXZfXyIpCisKKyAgICAgICAgIyBDYXNlIDM6IHN1YmNsYXNzIG9mIG5ldy1zdHlsZSBjbGFzczsgaGVyZSBpdCBnZXRzIGludGVyZXN0aW5nCisKKyAgICAgICAgY2xhc3MgRChDKToKKyAgICAgICAgICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAiRC5fX2Zsb29yZGl2X18iCisgICAgICAgICAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJELl9fcmZsb29yZGl2X18iCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChEKCkgLy8gQygpLCAiRC5fX2Zsb29yZGl2X18iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoKSAvLyBEKCksICJELl9fcmZsb29yZGl2X18iKQorCisgICAgICAgICMgQ2FzZSA0OiB0aGlzIGRpZG4ndCB3b3JrIHJpZ2h0IGluIDIuMi4yIGFuZCAyLjNhMQorCisgICAgICAgIGNsYXNzIEUoQyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFLl9fcmZsb29yZGl2X18sIEMuX19yZmxvb3JkaXZfXykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUoKSAvLyAxLCAiQy5fX2Zsb29yZGl2X18iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgLy8gRSgpLCAiQy5fX3JmbG9vcmRpdl9fIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFKCkgLy8gQygpLCAiQy5fX2Zsb29yZGl2X18iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEMoKSAvLyBFKCksICJDLl9fZmxvb3JkaXZfXyIpICMgVGhpcyBvbmUgd291bGQgZmFpbAorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidGVzdGluZyBhbiBpbnRlcm5hbCBraW5kIG9mIG1ldGhvZCBvYmplY3QiKQorICAgIGRlZiB0ZXN0X21ldGhfY2xhc3NfZ2V0KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgX19nZXRfXyBtZXRob2Qgb2YgTUVUSF9DTEFTUyBDIG1ldGhvZHMuLi4KKyAgICAgICAgIyBGdWxsIGNvdmVyYWdlIG9mIGRlc2Nyb2JqZWN0LmM6OmNsYXNzbWV0aG9kX2dldCgpCisKKyAgICAgICAgIyBCYXNlbGluZQorICAgICAgICBhcmcgPSBbMSwgMiwgM10KKyAgICAgICAgcmVzID0gezE6IE5vbmUsIDI6IE5vbmUsIDM6IE5vbmV9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdC5mcm9ta2V5cyhhcmcpLCByZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe30uZnJvbWtleXMoYXJnKSwgcmVzKQorCisgICAgICAgICMgTm93IGdldCB0aGUgZGVzY3JpcHRvcgorICAgICAgICBkZXNjciA9IGRpY3QuX19kaWN0X19bImZyb21rZXlzIl0KKworICAgICAgICAjIE1vcmUgYmFzZWxpbmUgdXNpbmcgdGhlIGRlc2NyaXB0b3IgZGlyZWN0bHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXNjci5fX2dldF9fKE5vbmUsIGRpY3QpKGFyZyksIHJlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXNjci5fX2dldF9fKHt9KShhcmcpLCByZXMpCisKKyAgICAgICAgIyBOb3cgY2hlY2sgdmFyaW91cyBlcnJvciBjYXNlcworICAgICAgICB0cnk6CisgICAgICAgICAgICBkZXNjci5fX2dldF9fKE5vbmUsIE5vbmUpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBoYXZlIGFsbG93ZWQgZGVzY3IuX19nZXRfXyhOb25lLCBOb25lKSIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlc2NyLl9fZ2V0X18oNDIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBoYXZlIGFsbG93ZWQgZGVzY3IuX19nZXRfXyg0MikiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZXNjci5fX2dldF9fKE5vbmUsIDQyKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgaGF2ZSBhbGxvd2VkIGRlc2NyLl9fZ2V0X18oTm9uZSwgNDIpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVzY3IuX19nZXRfXyhOb25lLCBpbnQpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZG4ndCBoYXZlIGFsbG93ZWQgZGVzY3IuX19nZXRfXyhOb25lLCBpbnQpIikKKworICAgIGRlZiB0ZXN0X2lzaW5zdF9pc2NsYXNzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcHJveHkgaXNpbnN0YW5jZSgpIGFuZCBpc2NsYXNzKCkuLi4KKyAgICAgICAgY2xhc3MgUHJveHkob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmopOgorICAgICAgICAgICAgICAgIHNlbGYuX19vYmogPSBvYmoKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgiX1Byb3h5X18iKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fX29iaiwgbmFtZSkKKyAgICAgICAgIyBUZXN0IHdpdGggYSBjbGFzc2ljIGNsYXNzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBDKCkKKyAgICAgICAgcGEgPSBQcm94eShhKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYSwgQykgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBhLCBDKSAjIFRlc3QKKyAgICAgICAgIyBUZXN0IHdpdGggYSBjbGFzc2ljIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBEKCkKKyAgICAgICAgcGEgPSBQcm94eShhKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYSwgQykgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBhLCBDKSAjIFRlc3QKKyAgICAgICAgIyBUZXN0IHdpdGggYSBuZXctc3R5bGUgY2xhc3MKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gQygpCisgICAgICAgIHBhID0gUHJveHkoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGEsIEMpICAjIEJhc2VsaW5lCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwYSwgQykgIyBUZXN0CisgICAgICAgICMgVGVzdCB3aXRoIGEgbmV3LXN0eWxlIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIEQoQyk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBEKCkKKyAgICAgICAgcGEgPSBQcm94eShhKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYSwgQykgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBhLCBDKSAjIFRlc3QKKworICAgIGRlZiB0ZXN0X3Byb3h5X3N1cGVyKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc3VwZXIoKSBmb3IgYSBwcm94eSBvYmplY3QuLi4KKyAgICAgICAgY2xhc3MgUHJveHkob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmopOgorICAgICAgICAgICAgICAgIHNlbGYuX19vYmogPSBvYmoKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgiX1Byb3h5X18iKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fX29iaiwgbmFtZSkKKworICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZihzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkIuZiIKKworICAgICAgICBjbGFzcyBDKEIpOgorICAgICAgICAgICAgZGVmIGYoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKEMsIHNlbGYpLmYoKSArICItPkMuZiIKKworICAgICAgICBvYmogPSBDKCkKKyAgICAgICAgcCA9IFByb3h5KG9iaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fZGljdF9fWyJmIl0ocCksICJCLmYtPkMuZiIpCisKKyAgICBkZWYgdGVzdF9jYXJsb3ZlcnJlKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcHJvaGliaXRpb24gb2YgQ2FybG8gVmVycmUncyBoYWNrLi4uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9iamVjdC5fX3NldGF0dHJfXyhzdHIsICJmb28iLCA0MikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQ2FybG8gVmVycmUgX19zZXRhdHRyX18gc3VjY2VlZGVkISIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9iamVjdC5fX2RlbGF0dHJfXyhzdHIsICJsb3dlciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkNhcmxvIFZlcnJlIF9fZGVsYXR0cl9fIHN1Y2NlZWRlZCEiKQorCisgICAgZGVmIHRlc3Rfd2Vha3JlZl9zZWdmYXVsdChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHdlYWtyZWYgc2VnZmF1bHQuLi4KKyAgICAgICAgIyBTRiA3NDI5MTEKKyAgICAgICAgaW1wb3J0IHdlYWtyZWYKKworICAgICAgICBjbGFzcyBQcm92b2tlcjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWZlcnJlbnQpOgorICAgICAgICAgICAgICAgIHNlbGYucmVmID0gd2Vha3JlZi5yZWYocmVmZXJyZW50KQorCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICB4ID0gc2VsZi5yZWYoKQorCisgICAgICAgIGNsYXNzIE9vcHMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBvID0gT29wcygpCisgICAgICAgIG8ud2hhdGV2ZXIgPSBQcm92b2tlcihvKQorICAgICAgICBkZWwgbworCisgICAgZGVmIHRlc3Rfd3JhcHBlcl9zZWdmYXVsdChzZWxmKToKKyAgICAgICAgIyBTRiA5MjcyNDg6IGRlZXBseSBuZXN0ZWQgd3JhcHBlcnMgY291bGQgY2F1c2Ugc3RhY2sgb3ZlcmZsb3cKKyAgICAgICAgZiA9IGxhbWJkYTpOb25lCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDAwMDAwKToKKyAgICAgICAgICAgIGYgPSBmLl9fY2FsbF9fCisgICAgICAgIGYgPSBOb25lCisKKyAgICBkZWYgdGVzdF9maWxlX2ZhdWx0KHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc3lzLnN0ZG91dCBpcyBjaGFuZ2VkIGluIGdldGF0dHIuLi4KKyAgICAgICAgdGVzdF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGNsYXNzIFN0ZG91dEd1YXJkOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzeXMuX19zdGRvdXRfXworICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiUHJlbWF0dXJlIGFjY2VzcyB0byBzeXMuc3Rkb3V0LiVzIiAlIGF0dHIpCisgICAgICAgIHN5cy5zdGRvdXQgPSBTdGRvdXRHdWFyZCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50ICJPb3BzISIKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSB0ZXN0X3N0ZG91dAorCisgICAgZGVmIHRlc3RfdmljaW91c19kZXNjcmlwdG9yX25vbnNlbnNlKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgdmljaW91c19kZXNjcmlwdG9yX25vbnNlbnNlLi4uCisKKyAgICAgICAgIyBBIHBvdGVudGlhbCBzZWdmYXVsdCBzcG90dGVkIGJ5IFRob21hcyBXb3V0ZXJzIGluIG1haWwgdG8KKyAgICAgICAgIyBweXRob24tZGV2IDIwMDMtMDQtMTcsIHR1cm5lZCBpbnRvIGFuIGV4YW1wbGUgJiBmaXhlZCBieSBNaWNoYWVsCisgICAgICAgICMgSHVkc29uIGp1c3QgbGVzcyB0aGFuIGZvdXIgbW9udGhzIGxhdGVyLi4uCisKKyAgICAgICAgY2xhc3MgRXZpbChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBoYXNoKCdhdHRyJykKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGRlbCBDLmF0dHIKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorCisgICAgICAgIGNsYXNzIERlc2NyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRfXyhzZWxmLCBvYiwgdHlwZT1Ob25lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGF0dHIgPSBEZXNjcigpCisKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBjLl9fZGljdF9fW0V2aWwoKV0gPSAwCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmF0dHIsIDEpCisgICAgICAgICMgdGhpcyBtYWtlcyBhIGNyYXNoIG1vcmUgbGlrZWx5OgorICAgICAgICB0ZXN0X3N1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihjLCAnYXR0cicpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgICMgU0YgMTE1NTkzOAorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRm9vKCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkIG5vdCB0ZXN0IF9faW5pdF9fKCkgZm9yIE5vbmUgcmV0dXJuIikKKworICAgIGRlZiB0ZXN0X21ldGhvZF93cmFwcGVyKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbWV0aG9kLXdyYXBwZXIgb2JqZWN0cy4uLgorICAgICAgICAjIDx0eXBlICdtZXRob2Qtd3JhcHBlcic+IGRpZCBub3Qgc3VwcG9ydCBhbnkgcmVmbGVjdGlvbiBiZWZvcmUgMi41CisKKyAgICAgICAgbCA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBsLl9fYWRkX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBbXS5fX2FkZF9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fICE9IFs1XS5fX2FkZF9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fICE9IGwuX19tdWxfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX25hbWVfXyA9PSAnX19hZGRfXycpCisgICAgICAgIGlmIGhhc2F0dHIobC5fX2FkZF9fLCAnX19zZWxmX18nKToKKyAgICAgICAgICAgICMgQ1B5dGhvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX3NlbGZfXyBpcyBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX29iamNsYXNzX18gaXMgbGlzdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aGVyZSBbXS5fX2FkZF9fIGlzIGEgbm9ybWFsIGJvdW5kIG1ldGhvZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5pbV9zZWxmIGlzIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLmltX2NsYXNzIGlzIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLl9fZG9jX18sIGxpc3QuX19hZGRfXy5fX2RvY19fKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYXNoKGwuX19hZGRfXykKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gVHlwZUVycm9yIGZyb20gaGFzaChbXS5fX2FkZF9fKSIpCisKKyAgICAgICAgdCA9ICgpCisgICAgICAgIHQgKz0gKDcsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuX19hZGRfXywgKDcsKS5fX2FkZF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godC5fX2FkZF9fKSwgaGFzaCgoNywpLl9fYWRkX18pKQorCisgICAgZGVmIHRlc3Rfbm90X2ltcGxlbWVudGVkKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgTm90SW1wbGVtZW50ZWQuLi4KKyAgICAgICAgIyBhbGwgYmluYXJ5IG1ldGhvZHMgc2hvdWxkIGJlIGFibGUgdG8gcmV0dXJuIGEgTm90SW1wbGVtZW50ZWQKKyAgICAgICAgaW1wb3J0IG9wZXJhdG9yCisKKyAgICAgICAgZGVmIHNwZWNpYWxtZXRob2Qoc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICAgICAgZGVmIGNoZWNrKGV4cHIsIHgsIHkpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGV4ZWMgZXhwciBpbiB7J3gnOiB4LCAneSc6IHksICdvcGVyYXRvcic6IG9wZXJhdG9yfQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gVHlwZUVycm9yIGZyb20gJXIiICUgKGV4cHIsKSkKKworICAgICAgICBOMSA9IHN5cy5tYXhpbnQgKyAxTCAgICAjIG1pZ2h0IHRyaWdnZXIgT3ZlcmZsb3dFcnJvcnMgaW5zdGVhZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFR5cGVFcnJvcnMKKyAgICAgICAgTjIgPSBzeXMubWF4aW50ICAgICAgICAgIyBpZiBzaXplb2YoaW50KSA8IHNpemVvZihsb25nKSwgbWlnaHQgdHJpZ2dlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgVmFsdWVFcnJvcnMgaW5zdGVhZCBvZiBUeXBlRXJyb3JzCisgICAgICAgIGZvciBtZXRhY2xhc3MgaW4gW3R5cGUsIHR5cGVzLkNsYXNzVHlwZV06CisgICAgICAgICAgICBmb3IgbmFtZSwgZXhwciwgaWV4cHIgaW4gWworICAgICAgICAgICAgICAgICAgICAoJ19fYWRkX18nLCAgICAgICd4ICsgeScsICAgICAgICAgICAgICAgICAgICd4ICs9IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX3N1Yl9fJywgICAgICAneCAtIHknLCAgICAgICAgICAgICAgICAgICAneCAtPSB5JyksCisgICAgICAgICAgICAgICAgICAgICgnX19tdWxfXycsICAgICAgJ3ggKiB5JywgICAgICAgICAgICAgICAgICAgJ3ggKj0geScpLAorICAgICAgICAgICAgICAgICAgICAoJ19fdHJ1ZWRpdl9fJywgICdvcGVyYXRvci50cnVlZGl2KHgsIHkpJywgIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAoJ19fZmxvb3JkaXZfXycsICdvcGVyYXRvci5mbG9vcmRpdih4LCB5KScsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAoJ19fZGl2X18nLCAgICAgICd4IC8geScsICAgICAgICAgICAgICAgICAgICd4IC89IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX21vZF9fJywgICAgICAneCAlIHknLCAgICAgICAgICAgICAgICAgICAneCAlPSB5JyksCisgICAgICAgICAgICAgICAgICAgICgnX19kaXZtb2RfXycsICAgJ2Rpdm1vZCh4LCB5KScsICAgICAgICAgICAgTm9uZSksCisgICAgICAgICAgICAgICAgICAgICgnX19wb3dfXycsICAgICAgJ3ggKiogeScsICAgICAgICAgICAgICAgICAgJ3ggKio9IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX2xzaGlmdF9fJywgICAneCA8PCB5JywgICAgICAgICAgICAgICAgICAneCA8PD0geScpLAorICAgICAgICAgICAgICAgICAgICAoJ19fcnNoaWZ0X18nLCAgICd4ID4+IHknLCAgICAgICAgICAgICAgICAgICd4ID4+PSB5JyksCisgICAgICAgICAgICAgICAgICAgICgnX19hbmRfXycsICAgICAgJ3ggJiB5JywgICAgICAgICAgICAgICAgICAgJ3ggJj0geScpLAorICAgICAgICAgICAgICAgICAgICAoJ19fb3JfXycsICAgICAgICd4IHwgeScsICAgICAgICAgICAgICAgICAgICd4IHw9IHknKSwKKyAgICAgICAgICAgICAgICAgICAgKCdfX3hvcl9fJywgICAgICAneCBeIHknLCAgICAgICAgICAgICAgICAgICAneCBePSB5JyksCisgICAgICAgICAgICAgICAgICAgICgnX19jb2VyY2VfXycsICAgJ2NvZXJjZSh4LCB5KScsICAgICAgICAgICAgTm9uZSldOgorICAgICAgICAgICAgICAgIGlmIG5hbWUgPT0gJ19fY29lcmNlX18nOgorICAgICAgICAgICAgICAgICAgICBybmFtZSA9IG5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBybmFtZSA9ICdfX3InICsgbmFtZVsyOl0KKyAgICAgICAgICAgICAgICBBID0gbWV0YWNsYXNzKCdBJywgKCksIHtuYW1lOiBzcGVjaWFsbWV0aG9kfSkKKyAgICAgICAgICAgICAgICBCID0gbWV0YWNsYXNzKCdCJywgKCksIHtybmFtZTogc3BlY2lhbG1ldGhvZH0pCisgICAgICAgICAgICAgICAgYSA9IEEoKQorICAgICAgICAgICAgICAgIGIgPSBCKCkKKyAgICAgICAgICAgICAgICBjaGVjayhleHByLCBhLCBhKQorICAgICAgICAgICAgICAgIGNoZWNrKGV4cHIsIGEsIGIpCisgICAgICAgICAgICAgICAgY2hlY2soZXhwciwgYiwgYSkKKyAgICAgICAgICAgICAgICBjaGVjayhleHByLCBiLCBiKQorICAgICAgICAgICAgICAgIGNoZWNrKGV4cHIsIGEsIE4xKQorICAgICAgICAgICAgICAgIGNoZWNrKGV4cHIsIGEsIE4yKQorICAgICAgICAgICAgICAgIGNoZWNrKGV4cHIsIE4xLCBiKQorICAgICAgICAgICAgICAgIGNoZWNrKGV4cHIsIE4yLCBiKQorICAgICAgICAgICAgICAgIGlmIGlleHByOgorICAgICAgICAgICAgICAgICAgICBjaGVjayhpZXhwciwgYSwgYSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2soaWV4cHIsIGEsIGIpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGlleHByLCBiLCBhKQorICAgICAgICAgICAgICAgICAgICBjaGVjayhpZXhwciwgYiwgYikKKyAgICAgICAgICAgICAgICAgICAgY2hlY2soaWV4cHIsIGEsIE4xKQorICAgICAgICAgICAgICAgICAgICBjaGVjayhpZXhwciwgYSwgTjIpCisgICAgICAgICAgICAgICAgICAgIGluYW1lID0gJ19faScgKyBuYW1lWzI6XQorICAgICAgICAgICAgICAgICAgICBDID0gbWV0YWNsYXNzKCdDJywgKCksIHtpbmFtZTogc3BlY2lhbG1ldGhvZH0pCisgICAgICAgICAgICAgICAgICAgIGMgPSBDKCkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2soaWV4cHIsIGMsIGEpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGlleHByLCBjLCBiKQorICAgICAgICAgICAgICAgICAgICBjaGVjayhpZXhwciwgYywgTjEpCisgICAgICAgICAgICAgICAgICAgIGNoZWNrKGlleHByLCBjLCBOMikKKworICAgIGRlZiB0ZXN0X2Fzc2lnbl9zbGljZShzZWxmKToKKyAgICAgICAgIyBjZXZhbC5jJ3MgYXNzaWduX3NsaWNlIHVzZWQgdG8gY2hlY2sgZm9yCisgICAgICAgICMgdHAtPnRwX2FzX3NlcXVlbmNlLT5zcV9zbGljZSBpbnN0ZWFkIG9mCisgICAgICAgICMgdHAtPnRwX2FzX3NlcXVlbmNlLT5zcV9hc3Nfc2xpY2UKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19zZXRzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBjWzE6Ml0gPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy52YWx1ZSwgMykKKworICAgIGRlZiB0ZXN0X3NldF9hbmRfbm9fZ2V0KHNlbGYpOgorICAgICAgICAjIFNlZQorICAgICAgICAjIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAxMC1KYW51YXJ5LzA5NTYzNy5odG1sCisgICAgICAgIGNsYXNzIERlc2NyKG9iamVjdCk6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICAgICAgICAgIGRlZiBfX3NldF9fKHNlbGYsIG9iaiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIG9iai5fX2RpY3RfX1tzZWxmLm5hbWVdID0gdmFsdWUKKyAgICAgICAgZGVzY3IgPSBEZXNjcigiYSIpCisKKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgYSA9IGRlc2NyCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICBzZWxmLmFzc2VydElzKHguYSwgZGVzY3IpCisgICAgICAgIHguYSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCA0MikKKworICAgICAgICAjIEFsc28gY2hlY2sgdHlwZV9nZXRhdHRybyBmb3IgY29ycmVjdG5lc3MuCisgICAgICAgIGNsYXNzIE1ldGEodHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSBNZXRhCisgICAgICAgIFguYSA9IDQyCisgICAgICAgIE1ldGEuYSA9IERlc2NyKCJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmEsIDQyKQorCisgICAgZGVmIHRlc3RfZ2V0YXR0cl9ob29rcyhzZWxmKToKKyAgICAgICAgIyBpc3N1ZSA0MjMwCisKKyAgICAgICAgY2xhc3MgRGVzY3JpcHRvcihvYmplY3QpOgorICAgICAgICAgICAgY291bnRlciA9IDAKKyAgICAgICAgICAgIGRlZiBfX2dldF9fKHNlbGYsIG9iaiwgb2JqdHlwZT1Ob25lKToKKyAgICAgICAgICAgICAgICBkZWYgZ2V0dGVyKG5hbWUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvdW50ZXIgKz0gMQorICAgICAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBnZXR0ZXIKKworICAgICAgICBkZXNjciA9IERlc2NyaXB0b3IoKQorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBfX2dldGF0dHJpYnV0ZV9fID0gZGVzY3IKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgX19nZXRhdHRyX18gPSBkZXNjcgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBfX2dldGF0dHJpYnV0ZV9fID0gZGVzY3IKKyAgICAgICAgICAgIF9fZ2V0YXR0cl9fID0gZGVzY3IKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgQSgpLCAiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVzY3IuY291bnRlciwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIEIoKSwgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2NyLmNvdW50ZXIsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCBDKCksICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXNjci5jb3VudGVyLCA0KQorCisgICAgICAgIGNsYXNzIEV2aWxHZXRhdHRyaWJ1dGUob2JqZWN0KToKKyAgICAgICAgICAgICMgVGhpcyB1c2VkIHRvIHNlZ2ZhdWx0CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJpYnV0ZV9fKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIGRlbCBFdmlsR2V0YXR0cmlidXRlLl9fZ2V0YXR0cl9fCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIEV2aWxHZXRhdHRyaWJ1dGUoKSwgImF0dHIiKQorCisgICAgZGVmIHRlc3RfdHlwZV9fX2dldGF0dHJpYnV0ZV9fKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUuX19nZXRhdHRyaWJ1dGVfXywgbGlzdCwgdHlwZSkKKworICAgIGRlZiB0ZXN0X2Fic3RyYWN0bWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyB0eXBlIHByZXRlbmRzIG5vdCB0byBoYXZlIF9fYWJzdHJhY3RtZXRob2RzX18uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCB0eXBlLCAiX19hYnN0cmFjdG1ldGhvZHNfXyIpCisgICAgICAgIGNsYXNzIG1ldGEodHlwZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBnZXRhdHRyLCBtZXRhLCAiX19hYnN0cmFjdG1ldGhvZHNfXyIpCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBkZWwgWC5fX2Fic3RyYWN0bWV0aG9kc19fCisKKyAgICBkZWYgdGVzdF9wcm94eV9jYWxsKHNlbGYpOgorICAgICAgICBjbGFzcyBGYWtlU3RyKG9iamVjdCk6CisgICAgICAgICAgICBfX2NsYXNzX18gPSBzdHIKKworICAgICAgICBmYWtlX3N0ciA9IEZha2VTdHIoKQorICAgICAgICAjIGlzaW5zdGFuY2UoKSByZWFkcyBfX2NsYXNzX18gb24gbmV3IHN0eWxlIGNsYXNzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZmFrZV9zdHIsIHN0cikpCisKKyAgICAgICAgIyBjYWxsIGEgbWV0aG9kIGRlc2NyaXB0b3IKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgc3RyLnNwbGl0KGZha2Vfc3RyKQorCisgICAgICAgICMgY2FsbCBhIHNsb3Qgd3JhcHBlciBkZXNjcmlwdG9yCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHN0ci5fX2FkZF9fKGZha2Vfc3RyLCAiYWJjIikKKworICAgIGRlZiB0ZXN0X3JlcHJfYXNfc3RyKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMTYwMzogY3Jhc2ggb3IgaW5maW5pdGUgbG9vcCB3aGVuIHJlYmluZGluZyBfX3N0cl9fIGFzCisgICAgICAgICMgX19yZXByX18uCisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBGb28uX19yZXByX18gPSBGb28uX19zdHJfXworICAgICAgICBmb28gPSBGb28oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHN0ciwgZm9vKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHJlcHIsIGZvbykKKworICAgIGRlZiB0ZXN0X21peGluZ19zbG90X3dyYXBwZXJzKHNlbGYpOgorICAgICAgICBjbGFzcyBYKGRpY3QpOgorICAgICAgICAgICAgX19zZXRhdHRyX18gPSBkaWN0Ll9fc2V0aXRlbV9fCisgICAgICAgIHggPSBYKCkKKyAgICAgICAgeC55ID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WyJ5Il0sIDQyKQorCisgICAgZGVmIHRlc3RfY3ljbGVfdGhyb3VnaF9kaWN0KHNlbGYpOgorICAgICAgICAjIFNlZSBidWcgIzE0Njk2MjkKKyAgICAgICAgY2xhc3MgWChkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5fX2RpY3RfXyA9IHNlbGYKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmF0dHIgPSA0MgorICAgICAgICB3ciA9IHdlYWtyZWYucmVmKHgpCisgICAgICAgIGRlbCB4CisgICAgICAgIHRlc3Rfc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUod3IoKSkKKyAgICAgICAgZm9yIG8gaW4gZ2MuZ2V0X29iamVjdHMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QodHlwZShvKSwgWCkKKworY2xhc3MgRGljdFByb3h5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLkMgPSBDCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEluKCdkaWN0X3Byb3h5KHsnLCByZXByKHZhcnMoc2VsZi5DKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIidtZXRoJzoiLCByZXByKHZhcnMoc2VsZi5DKSkpCisKKyAgICBkZWYgdGVzdF9pdGVyX2tleXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkaWN0LXByb3h5IGl0ZXJrZXlzLi4uCisgICAgICAgIGtleXMgPSBbIGtleSBmb3Iga2V5IGluIHNlbGYuQy5fX2RpY3RfXy5pdGVya2V5cygpIF0KKyAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrZXlzLCBbJ19fZGljdF9fJywgJ19fZG9jX18nLCAnX19tb2R1bGVfXycsCisgICAgICAgICAgICAnX193ZWFrcmVmX18nLCAnbWV0aCddKQorCisgICAgZGVmIHRlc3RfaXRlcl92YWx1ZXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkaWN0LXByb3h5IGl0ZXJ2YWx1ZXMuLi4KKyAgICAgICAgdmFsdWVzID0gWyB2YWx1ZXMgZm9yIHZhbHVlcyBpbiBzZWxmLkMuX19kaWN0X18uaXRlcnZhbHVlcygpIF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgNSkKKworICAgIGRlZiB0ZXN0X2l0ZXJfaXRlbXMoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBkaWN0LXByb3h5IGl0ZXJpdGVtcy4uLgorICAgICAgICBrZXlzID0gWyBrZXkgZm9yIChrZXksIHZhbHVlKSBpbiBzZWxmLkMuX19kaWN0X18uaXRlcml0ZW1zKCkgXQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIFsnX19kaWN0X18nLCAnX19kb2NfXycsICdfX21vZHVsZV9fJywKKyAgICAgICAgICAgICdfX3dlYWtyZWZfXycsICdtZXRoJ10pCisKKyAgICBkZWYgdGVzdF9kaWN0X3R5cGVfd2l0aF9tZXRhY2xhc3Moc2VsZik6CisgICAgICAgICMgVGVzdGluZyB0eXBlIG9mIF9fZGljdF9fIHdoZW4gX19tZXRhY2xhc3NfXyBzZXQuLi4KKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBNKHR5cGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgIyBJbiAyLjNhMSwgQy5fX2RpY3RfXyB3YXMgYSByZWFsIGRpY3QgcmF0aGVyIHRoYW4gYSBkaWN0IHByb3h5CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoQy5fX2RpY3RfXyksIHR5cGUoQi5fX2RpY3RfXykpCisKKworY2xhc3MgUFR5cGVzTG9uZ0luaXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoaXMgaXMgaW4gaXRzIG93biBUZXN0Q2FzZSBzbyB0aGF0IGl0IGNhbiBiZSBydW4gYmVmb3JlIGFueSBvdGhlciB0ZXN0cy4KKyAgICBkZWYgdGVzdF9weXR5cGVfbG9uZ19yZWFkeShzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIFNGIGJ1ZyA1NTE0MTIgLi4uCisKKyAgICAgICAgIyBUaGlzIGR1bXBzIGNvcmUgd2hlbiBTRiBidWcgNTUxNDEyIGlzbid0IGZpeGVkIC0tCisgICAgICAgICMgYnV0IG9ubHkgd2hlbiB0ZXN0X2Rlc2NyLnB5IGlzIHJ1biBzZXBhcmF0ZWx5LgorICAgICAgICAjIChUaGF0IGNhbid0IGJlIGhlbHBlZCAtLSBhcyBzb29uIGFzIFB5VHlwZV9SZWFkeSgpCisgICAgICAgICMgaXMgY2FsbGVkIGZvciBQeUxvbmdfVHlwZSwgdGhlIGJ1ZyBpcyBnb25lLikKKyAgICAgICAgY2xhc3MgVXNlckxvbmcob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3Bvd19fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBvdygwTCwgVXNlckxvbmcoKSwgMEwpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIEFub3RoZXIgc2VnZmF1bHQgb25seSB3aGVuIHJ1biBlYXJseQorICAgICAgICAjIChiZWZvcmUgUHlUeXBlX1JlYWR5KHR1cGxlKSBpcyBjYWxsZWQpCisgICAgICAgIHR5cGUubXJvKHR1cGxlKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBkZXByZWNhdGlvbnMgPSBbKHInY29tcGxleCBkaXZtb2RcKFwpLCAvLyBhbmQgJSBhcmUgZGVwcmVjYXRlZCQnLAorICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKV0KKyAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgIGRlcHJlY2F0aW9ucyArPSBbCisgICAgICAgICAgICAoImNsYXNzaWMgKGludHxsb25nKSBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoImNvZXJjZS4uIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgKCIuK19fKGdldHxzZXR8ZGVsKXNsaWNlX18gaGFzIGJlZW4gcmVtb3ZlZCIsIERlcHJlY2F0aW9uV2FybmluZyldCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKmRlcHJlY2F0aW9ucyk6CisgICAgICAgICMgUnVuIGFsbCBsb2NhbCB0ZXN0IGNhc2VzLCB3aXRoIFBUeXBlc0xvbmdJbml0VGVzdCBmaXJzdC4KKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQVHlwZXNMb25nSW5pdFRlc3QsIE9wZXJhdG9yc1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NQcm9wZXJ0aWVzQW5kTWV0aG9kcywgRGljdFByb3h5VGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGFhYmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWEzMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3IucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGVzY3J0dXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmZjBjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5CkBAIC0wLDAgKzEsNDk3IEBACisjIFRoaXMgY29udGFpbnMgbW9zdCBvZiB0aGUgZXhlY3V0YWJsZSBleGFtcGxlcyBmcm9tIEd1aWRvJ3MgZGVzY3IKKyMgdHV0b3JpYWwsIG9uY2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8yLjIvZGVzY3JpbnRyby5odG1sCisjCisjIEEgZmV3IGV4YW1wbGVzIGxlZnQgaW1wbGljaXQgaW4gdGhlIHdyaXRldXAgd2VyZSBmbGVzaGVkIG91dCwgYSBmZXcgd2VyZQorIyBza2lwcGVkIGR1ZSB0byBsYWNrIG9mIGludGVyZXN0IChlLmcuLCBmYWtpbmcgc3VwZXIoKSBieSBoYW5kIGlzbid0CisjIG9mIG11Y2ggaW50ZXJlc3QgYW55bW9yZSksIGFuZCBhIGZldyB3ZXJlIGZpZGRsZWQgdG8gbWFrZSB0aGUgb3V0cHV0CisjIGRldGVybWluaXN0aWMuCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHNvcnRkaWN0CitpbXBvcnQgcHByaW50CisKK2NsYXNzIGRlZmF1bHRkaWN0KGRpY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZhdWx0PU5vbmUpOgorICAgICAgICBkaWN0Ll9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuZGVmYXVsdCA9IGRlZmF1bHQKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZGljdC5fX2dldGl0ZW1fXyhzZWxmLCBrZXkpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRlZmF1bHQKKworICAgIGRlZiBnZXQoc2VsZiwga2V5LCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgYXJncyA9IChzZWxmLmRlZmF1bHQsKQorICAgICAgICByZXR1cm4gZGljdC5nZXQoc2VsZiwga2V5LCAqYXJncykKKworICAgIGRlZiBtZXJnZShzZWxmLCBvdGhlcik6CisgICAgICAgIGZvciBrZXkgaW4gb3RoZXI6CisgICAgICAgICAgICBpZiBrZXkgbm90IGluIHNlbGY6CisgICAgICAgICAgICAgICAgc2VsZltrZXldID0gb3RoZXJba2V5XQorCit0ZXN0XzEgPSAiIiIKKworSGVyZSdzIHRoZSBuZXcgdHlwZSBhdCB3b3JrOgorCisgICAgPj4+IHByaW50IGRlZmF1bHRkaWN0ICAgICAgICAgICAgICAgIyBzaG93IG91ciB0eXBlCisgICAgPGNsYXNzICd0ZXN0LnRlc3RfZGVzY3J0dXQuZGVmYXVsdGRpY3QnPgorICAgID4+PiBwcmludCB0eXBlKGRlZmF1bHRkaWN0KSAgICAgICAgICMgaXRzIG1ldGF0eXBlCisgICAgPHR5cGUgJ3R5cGUnPgorICAgID4+PiBhID0gZGVmYXVsdGRpY3QoZGVmYXVsdD0wLjApICAgICMgY3JlYXRlIGFuIGluc3RhbmNlCisgICAgPj4+IHByaW50IGEgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IHRoZSBpbnN0YW5jZQorICAgIHt9CisgICAgPj4+IHByaW50IHR5cGUoYSkgICAgICAgICAgICAgICAgICAgIyBzaG93IGl0cyB0eXBlCisgICAgPGNsYXNzICd0ZXN0LnRlc3RfZGVzY3J0dXQuZGVmYXVsdGRpY3QnPgorICAgID4+PiBwcmludCBhLl9fY2xhc3NfXyAgICAgICAgICAgICAgICMgc2hvdyBpdHMgY2xhc3MKKyAgICA8Y2xhc3MgJ3Rlc3QudGVzdF9kZXNjcnR1dC5kZWZhdWx0ZGljdCc+CisgICAgPj4+IHByaW50IHR5cGUoYSkgaXMgYS5fX2NsYXNzX18gICAgIyBpdHMgdHlwZSBpcyBpdHMgY2xhc3MKKyAgICBUcnVlCisgICAgPj4+IGFbMV0gPSAzLjI1ICAgICAgICAgICAgICAgICAgICAgIyBtb2RpZnkgdGhlIGluc3RhbmNlCisgICAgPj4+IHByaW50IGEgICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IHRoZSBuZXcgdmFsdWUKKyAgICB7MTogMy4yNX0KKyAgICA+Pj4gcHJpbnQgYVsxXSAgICAgICAgICAgICAgICAgICAgICAjIHNob3cgdGhlIG5ldyBpdGVtCisgICAgMy4yNQorICAgID4+PiBwcmludCBhWzBdICAgICAgICAgICAgICAgICAgICAgICMgYSBub24tZXhpc3RlbnQgaXRlbQorICAgIDAuMAorICAgID4+PiBhLm1lcmdlKHsxOjEwMCwgMjoyMDB9KSAgICAgICAgICMgdXNlIGEgZGljdCBtZXRob2QKKyAgICA+Pj4gcHJpbnQgc29ydGRpY3QoYSkgICAgICAgICAgICAgICAjIHNob3cgdGhlIHJlc3VsdAorICAgIHsxOiAzLjI1LCAyOiAyMDB9CisgICAgPj4+CisKK1dlIGNhbiBhbHNvIHVzZSB0aGUgbmV3IHR5cGUgaW4gY29udGV4dHMgd2hlcmUgY2xhc3NpYyBvbmx5IGFsbG93cyAicmVhbCIKK2RpY3Rpb25hcmllcywgc3VjaCBhcyB0aGUgbG9jYWxzL2dsb2JhbHMgZGljdGlvbmFyaWVzIGZvciB0aGUgZXhlYworc3RhdGVtZW50IG9yIHRoZSBidWlsdC1pbiBmdW5jdGlvbiBldmFsKCk6CisKKyAgICA+Pj4gZGVmIHNvcnRlZChzZXEpOgorICAgIC4uLiAgICAgc2VxLnNvcnQoa2V5PXN0cikKKyAgICAuLi4gICAgIHJldHVybiBzZXEKKyAgICA+Pj4gcHJpbnQgc29ydGVkKGEua2V5cygpKQorICAgIFsxLCAyXQorICAgID4+PiBleGVjICJ4ID0gMzsgcHJpbnQgeCIgaW4gYQorICAgIDMKKyAgICA+Pj4gcHJpbnQgc29ydGVkKGEua2V5cygpKQorICAgIFsxLCAyLCAnX19idWlsdGluc19fJywgJ3gnXQorICAgID4+PiBwcmludCBhWyd4J10KKyAgICAzCisgICAgPj4+CisKK05vdyBJJ2xsIHNob3cgdGhhdCBkZWZhdWx0ZGljdCBpbnN0YW5jZXMgaGF2ZSBkeW5hbWljIGluc3RhbmNlIHZhcmlhYmxlcywKK2p1c3QgbGlrZSBjbGFzc2ljIGNsYXNzZXM6CisKKyAgICA+Pj4gYS5kZWZhdWx0ID0gLTEKKyAgICA+Pj4gcHJpbnQgYVsibm93YXkiXQorICAgIC0xCisgICAgPj4+IGEuZGVmYXVsdCA9IC0xMDAwCisgICAgPj4+IHByaW50IGFbIm5vd2F5Il0KKyAgICAtMTAwMAorICAgID4+PiAnZGVmYXVsdCcgaW4gZGlyKGEpCisgICAgVHJ1ZQorICAgID4+PiBhLngxID0gMTAwCisgICAgPj4+IGEueDIgPSAyMDAKKyAgICA+Pj4gcHJpbnQgYS54MQorICAgIDEwMAorICAgID4+PiBkID0gZGlyKGEpCisgICAgPj4+ICdkZWZhdWx0JyBpbiBkIGFuZCAneDEnIGluIGQgYW5kICd4MicgaW4gZAorICAgIFRydWUKKyAgICA+Pj4gcHJpbnQgc29ydGRpY3QoYS5fX2RpY3RfXykKKyAgICB7J2RlZmF1bHQnOiAtMTAwMCwgJ3gxJzogMTAwLCAneDInOiAyMDB9CisgICAgPj4+CisiIiIKKworY2xhc3MgZGVmYXVsdGRpY3QyKGRpY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnZGVmYXVsdCddCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgZGljdC5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmRlZmF1bHQgPSBkZWZhdWx0CisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGRpY3QuX19nZXRpdGVtX18oc2VsZiwga2V5KQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWZhdWx0CisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgKmFyZ3MpOgorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIGFyZ3MgPSAoc2VsZi5kZWZhdWx0LCkKKyAgICAgICAgcmV0dXJuIGRpY3QuZ2V0KHNlbGYsIGtleSwgKmFyZ3MpCisKKyAgICBkZWYgbWVyZ2Uoc2VsZiwgb3RoZXIpOgorICAgICAgICBmb3Iga2V5IGluIG90aGVyOgorICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWxmOgorICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KKwordGVzdF8yID0gIiIiCisKK1RoZSBfX3Nsb3RzX18gZGVjbGFyYXRpb24gdGFrZXMgYSBsaXN0IG9mIGluc3RhbmNlIHZhcmlhYmxlcywgYW5kIHJlc2VydmVzCitzcGFjZSBmb3IgZXhhY3RseSB0aGVzZSBpbiB0aGUgaW5zdGFuY2UuIFdoZW4gX19zbG90c19fIGlzIHVzZWQsIG90aGVyCitpbnN0YW5jZSB2YXJpYWJsZXMgY2Fubm90IGJlIGFzc2lnbmVkIHRvOgorCisgICAgPj4+IGEgPSBkZWZhdWx0ZGljdDIoZGVmYXVsdD0wLjApCisgICAgPj4+IGFbMV0KKyAgICAwLjAKKyAgICA+Pj4gYS5kZWZhdWx0ID0gLTEKKyAgICA+Pj4gYVsxXQorICAgIC0xCisgICAgPj4+IGEueDEgPSAxCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICAgIEF0dHJpYnV0ZUVycm9yOiAnZGVmYXVsdGRpY3QyJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAneDEnCisgICAgPj4+CisKKyIiIgorCit0ZXN0XzMgPSAiIiIKKworSW50cm9zcGVjdGluZyBpbnN0YW5jZXMgb2YgYnVpbHQtaW4gdHlwZXMKKworRm9yIGluc3RhbmNlIG9mIGJ1aWx0LWluIHR5cGVzLCB4Ll9fY2xhc3NfXyBpcyBub3cgdGhlIHNhbWUgYXMgdHlwZSh4KToKKworICAgID4+PiB0eXBlKFtdKQorICAgIDx0eXBlICdsaXN0Jz4KKyAgICA+Pj4gW10uX19jbGFzc19fCisgICAgPHR5cGUgJ2xpc3QnPgorICAgID4+PiBsaXN0CisgICAgPHR5cGUgJ2xpc3QnPgorICAgID4+PiBpc2luc3RhbmNlKFtdLCBsaXN0KQorICAgIFRydWUKKyAgICA+Pj4gaXNpbnN0YW5jZShbXSwgZGljdCkKKyAgICBGYWxzZQorICAgID4+PiBpc2luc3RhbmNlKFtdLCBvYmplY3QpCisgICAgVHJ1ZQorICAgID4+PgorCitVbmRlciB0aGUgbmV3IHByb3Bvc2FsLCB0aGUgX19tZXRob2RzX18gYXR0cmlidXRlIG5vIGxvbmdlciBleGlzdHM6CisKKyAgICA+Pj4gW10uX19tZXRob2RzX18KKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgICAgQXR0cmlidXRlRXJyb3I6ICdsaXN0JyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnX19tZXRob2RzX18nCisgICAgPj4+CisKK0luc3RlYWQsIHlvdSBjYW4gZ2V0IHRoZSBzYW1lIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpc3QgdHlwZToKKworICAgID4+PiBwcHJpbnQucHByaW50KGRpcihsaXN0KSkgICAgIyBsaWtlIGxpc3QuX19kaWN0X18ua2V5cygpLCBidXQgc29ydGVkCisgICAgWydfX2FkZF9fJywKKyAgICAgJ19fY2xhc3NfXycsCisgICAgICdfX2NvbnRhaW5zX18nLAorICAgICAnX19kZWxhdHRyX18nLAorICAgICAnX19kZWxpdGVtX18nLAorICAgICAnX19kZWxzbGljZV9fJywKKyAgICAgJ19fZG9jX18nLAorICAgICAnX19lcV9fJywKKyAgICAgJ19fZm9ybWF0X18nLAorICAgICAnX19nZV9fJywKKyAgICAgJ19fZ2V0YXR0cmlidXRlX18nLAorICAgICAnX19nZXRpdGVtX18nLAorICAgICAnX19nZXRzbGljZV9fJywKKyAgICAgJ19fZ3RfXycsCisgICAgICdfX2hhc2hfXycsCisgICAgICdfX2lhZGRfXycsCisgICAgICdfX2ltdWxfXycsCisgICAgICdfX2luaXRfXycsCisgICAgICdfX2l0ZXJfXycsCisgICAgICdfX2xlX18nLAorICAgICAnX19sZW5fXycsCisgICAgICdfX2x0X18nLAorICAgICAnX19tdWxfXycsCisgICAgICdfX25lX18nLAorICAgICAnX19uZXdfXycsCisgICAgICdfX3JlZHVjZV9fJywKKyAgICAgJ19fcmVkdWNlX2V4X18nLAorICAgICAnX19yZXByX18nLAorICAgICAnX19yZXZlcnNlZF9fJywKKyAgICAgJ19fcm11bF9fJywKKyAgICAgJ19fc2V0YXR0cl9fJywKKyAgICAgJ19fc2V0aXRlbV9fJywKKyAgICAgJ19fc2V0c2xpY2VfXycsCisgICAgICdfX3NpemVvZl9fJywKKyAgICAgJ19fc3RyX18nLAorICAgICAnX19zdWJjbGFzc2hvb2tfXycsCisgICAgICdhcHBlbmQnLAorICAgICAnY291bnQnLAorICAgICAnZXh0ZW5kJywKKyAgICAgJ2luZGV4JywKKyAgICAgJ2luc2VydCcsCisgICAgICdwb3AnLAorICAgICAncmVtb3ZlJywKKyAgICAgJ3JldmVyc2UnLAorICAgICAnc29ydCddCisKK1RoZSBuZXcgaW50cm9zcGVjdGlvbiBBUEkgZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIHRoZSBvbGQgb25lOiAgaW4KK2FkZGl0aW9uIHRvIHRoZSByZWd1bGFyIG1ldGhvZHMsIGl0IGFsc28gc2hvd3MgdGhlIG1ldGhvZHMgdGhhdCBhcmUKK25vcm1hbGx5IGludm9rZWQgdGhyb3VnaCBzcGVjaWFsIG5vdGF0aW9ucywgZS5nLiBfX2lhZGRfXyAoKz0pLCBfX2xlbl9fCisobGVuKSwgX19uZV9fICghPSkuIFlvdSBjYW4gaW52b2tlIGFueSBtZXRob2QgZnJvbSB0aGlzIGxpc3QgZGlyZWN0bHk6CisKKyAgICA+Pj4gYSA9IFsndGljJywgJ3RhYyddCisgICAgPj4+IGxpc3QuX19sZW5fXyhhKSAgICAgICAgICAjIHNhbWUgYXMgbGVuKGEpCisgICAgMgorICAgID4+PiBhLl9fbGVuX18oKSAgICAgICAgICAgICAgIyBkaXR0bworICAgIDIKKyAgICA+Pj4gbGlzdC5hcHBlbmQoYSwgJ3RvZScpICAgICMgc2FtZSBhcyBhLmFwcGVuZCgndG9lJykKKyAgICA+Pj4gYQorICAgIFsndGljJywgJ3RhYycsICd0b2UnXQorICAgID4+PgorCitUaGlzIGlzIGp1c3QgbGlrZSBpdCBpcyBmb3IgdXNlci1kZWZpbmVkIGNsYXNzZXMuCisiIiIKKwordGVzdF80ID0gIiIiCisKK1N0YXRpYyBtZXRob2RzIGFuZCBjbGFzcyBtZXRob2RzCisKK1RoZSBuZXcgaW50cm9zcGVjdGlvbiBBUEkgbWFrZXMgaXQgcG9zc2libGUgdG8gYWRkIHN0YXRpYyBtZXRob2RzIGFuZCBjbGFzcworbWV0aG9kcy4gU3RhdGljIG1ldGhvZHMgYXJlIGVhc3kgdG8gZGVzY3JpYmU6IHRoZXkgYmVoYXZlIHByZXR0eSBtdWNoIGxpa2UKK3N0YXRpYyBtZXRob2RzIGluIEMrKyBvciBKYXZhLiBIZXJlJ3MgYW4gZXhhbXBsZToKKworICAgID4+PiBjbGFzcyBDOgorICAgIC4uLgorICAgIC4uLiAgICAgQHN0YXRpY21ldGhvZAorICAgIC4uLiAgICAgZGVmIGZvbyh4LCB5KToKKyAgICAuLi4gICAgICAgICBwcmludCAic3RhdGljbWV0aG9kIiwgeCwgeQorCisgICAgPj4+IEMuZm9vKDEsIDIpCisgICAgc3RhdGljbWV0aG9kIDEgMgorICAgID4+PiBjID0gQygpCisgICAgPj4+IGMuZm9vKDEsIDIpCisgICAgc3RhdGljbWV0aG9kIDEgMgorCitDbGFzcyBtZXRob2RzIHVzZSBhIHNpbWlsYXIgcGF0dGVybiB0byBkZWNsYXJlIG1ldGhvZHMgdGhhdCByZWNlaXZlIGFuCitpbXBsaWNpdCBmaXJzdCBhcmd1bWVudCB0aGF0IGlzIHRoZSAqY2xhc3MqIGZvciB3aGljaCB0aGV5IGFyZSBpbnZva2VkLgorCisgICAgPj4+IGNsYXNzIEM6CisgICAgLi4uICAgICBAY2xhc3NtZXRob2QKKyAgICAuLi4gICAgIGRlZiBmb28oY2xzLCB5KToKKyAgICAuLi4gICAgICAgICBwcmludCAiY2xhc3NtZXRob2QiLCBjbHMsIHkKKworICAgID4+PiBDLmZvbygxKQorICAgIGNsYXNzbWV0aG9kIHRlc3QudGVzdF9kZXNjcnR1dC5DIDEKKyAgICA+Pj4gYyA9IEMoKQorICAgID4+PiBjLmZvbygxKQorICAgIGNsYXNzbWV0aG9kIHRlc3QudGVzdF9kZXNjcnR1dC5DIDEKKworICAgID4+PiBjbGFzcyBEKEMpOgorICAgIC4uLiAgICAgcGFzcworCisgICAgPj4+IEQuZm9vKDEpCisgICAgY2xhc3NtZXRob2QgdGVzdC50ZXN0X2Rlc2NydHV0LkQgMQorICAgID4+PiBkID0gRCgpCisgICAgPj4+IGQuZm9vKDEpCisgICAgY2xhc3NtZXRob2QgdGVzdC50ZXN0X2Rlc2NydHV0LkQgMQorCitUaGlzIHByaW50cyAiY2xhc3NtZXRob2QgX19tYWluX18uRCAxIiBib3RoIHRpbWVzOyBpbiBvdGhlciB3b3JkcywgdGhlCitjbGFzcyBwYXNzZWQgYXMgdGhlIGZpcnN0IGFyZ3VtZW50IG9mIGZvbygpIGlzIHRoZSBjbGFzcyBpbnZvbHZlZCBpbiB0aGUKK2NhbGwsIG5vdCB0aGUgY2xhc3MgaW52b2x2ZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgZm9vKCkuCisKK0J1dCBub3RpY2UgdGhpczoKKworICAgID4+PiBjbGFzcyBFKEMpOgorICAgIC4uLiAgICAgQGNsYXNzbWV0aG9kCisgICAgLi4uICAgICBkZWYgZm9vKGNscywgeSk6ICMgb3ZlcnJpZGUgQy5mb28KKyAgICAuLi4gICAgICAgICBwcmludCAiRS5mb28oKSBjYWxsZWQiCisgICAgLi4uICAgICAgICAgQy5mb28oeSkKKworICAgID4+PiBFLmZvbygxKQorICAgIEUuZm9vKCkgY2FsbGVkCisgICAgY2xhc3NtZXRob2QgdGVzdC50ZXN0X2Rlc2NydHV0LkMgMQorICAgID4+PiBlID0gRSgpCisgICAgPj4+IGUuZm9vKDEpCisgICAgRS5mb28oKSBjYWxsZWQKKyAgICBjbGFzc21ldGhvZCB0ZXN0LnRlc3RfZGVzY3J0dXQuQyAxCisKK0luIHRoaXMgZXhhbXBsZSwgdGhlIGNhbGwgdG8gQy5mb28oKSBmcm9tIEUuZm9vKCkgd2lsbCBzZWUgY2xhc3MgQyBhcyBpdHMKK2ZpcnN0IGFyZ3VtZW50LCBub3QgY2xhc3MgRS4gVGhpcyBpcyB0byBiZSBleHBlY3RlZCwgc2luY2UgdGhlIGNhbGwKK3NwZWNpZmllcyB0aGUgY2xhc3MgQy4gQnV0IGl0IHN0cmVzc2VzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlc2UgY2xhc3MKK21ldGhvZHMgYW5kIG1ldGhvZHMgZGVmaW5lZCBpbiBtZXRhY2xhc3NlcyAod2hlcmUgYW4gdXBjYWxsIHRvIGEgbWV0YW1ldGhvZAord291bGQgcGFzcyB0aGUgdGFyZ2V0IGNsYXNzIGFzIGFuIGV4cGxpY2l0IGZpcnN0IGFyZ3VtZW50KS4KKyIiIgorCit0ZXN0XzUgPSAiIiIKKworQXR0cmlidXRlcyBkZWZpbmVkIGJ5IGdldC9zZXQgbWV0aG9kcworCisKKyAgICA+Pj4gY2xhc3MgcHJvcGVydHkob2JqZWN0KToKKyAgICAuLi4KKyAgICAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnZXQsIHNldD1Ob25lKToKKyAgICAuLi4gICAgICAgICBzZWxmLl9fZ2V0ID0gZ2V0CisgICAgLi4uICAgICAgICAgc2VsZi5fX3NldCA9IHNldAorICAgIC4uLgorICAgIC4uLiAgICAgZGVmIF9fZ2V0X18oc2VsZiwgaW5zdCwgdHlwZT1Ob25lKToKKyAgICAuLi4gICAgICAgICByZXR1cm4gc2VsZi5fX2dldChpbnN0KQorICAgIC4uLgorICAgIC4uLiAgICAgZGVmIF9fc2V0X18oc2VsZiwgaW5zdCwgdmFsdWUpOgorICAgIC4uLiAgICAgICAgIGlmIHNlbGYuX19zZXQgaXMgTm9uZToKKyAgICAuLi4gICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJ0aGlzIGF0dHJpYnV0ZSBpcyByZWFkLW9ubHkiCisgICAgLi4uICAgICAgICAgcmV0dXJuIHNlbGYuX19zZXQoaW5zdCwgdmFsdWUpCisKK05vdyBsZXQncyBkZWZpbmUgYSBjbGFzcyB3aXRoIGFuIGF0dHJpYnV0ZSB4IGRlZmluZWQgYnkgYSBwYWlyIG9mIG1ldGhvZHMsCitnZXR4KCkgYW5kIHNldHgoKToKKworICAgID4+PiBjbGFzcyBDKG9iamVjdCk6CisgICAgLi4uCisgICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgLi4uICAgICAgICAgc2VsZi5fX3ggPSAwCisgICAgLi4uCisgICAgLi4uICAgICBkZWYgZ2V0eChzZWxmKToKKyAgICAuLi4gICAgICAgICByZXR1cm4gc2VsZi5fX3gKKyAgICAuLi4KKyAgICAuLi4gICAgIGRlZiBzZXR4KHNlbGYsIHgpOgorICAgIC4uLiAgICAgICAgIGlmIHggPCAwOiB4ID0gMAorICAgIC4uLiAgICAgICAgIHNlbGYuX194ID0geAorICAgIC4uLgorICAgIC4uLiAgICAgeCA9IHByb3BlcnR5KGdldHgsIHNldHgpCisKK0hlcmUncyBhIHNtYWxsIGRlbW9uc3RyYXRpb246CisKKyAgICA+Pj4gYSA9IEMoKQorICAgID4+PiBhLnggPSAxMAorICAgID4+PiBwcmludCBhLngKKyAgICAxMAorICAgID4+PiBhLnggPSAtMTAKKyAgICA+Pj4gcHJpbnQgYS54CisgICAgMAorICAgID4+PgorCitIbW0gLS0gcHJvcGVydHkgaXMgYnVpbHRpbiBub3csIHNvIGxldCdzIHRyeSBpdCB0aGF0IHdheSB0b28uCisKKyAgICA+Pj4gZGVsIHByb3BlcnR5ICAjIHVubWFzayB0aGUgYnVpbHRpbgorICAgID4+PiBwcm9wZXJ0eQorICAgIDx0eXBlICdwcm9wZXJ0eSc+CisKKyAgICA+Pj4gY2xhc3MgQyhvYmplY3QpOgorICAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgIC4uLiAgICAgICAgIHNlbGYuX194ID0gMAorICAgIC4uLiAgICAgZGVmIGdldHgoc2VsZik6CisgICAgLi4uICAgICAgICAgcmV0dXJuIHNlbGYuX194CisgICAgLi4uICAgICBkZWYgc2V0eChzZWxmLCB4KToKKyAgICAuLi4gICAgICAgICBpZiB4IDwgMDogeCA9IDAKKyAgICAuLi4gICAgICAgICBzZWxmLl9feCA9IHgKKyAgICAuLi4gICAgIHggPSBwcm9wZXJ0eShnZXR4LCBzZXR4KQorCisKKyAgICA+Pj4gYSA9IEMoKQorICAgID4+PiBhLnggPSAxMAorICAgID4+PiBwcmludCBhLngKKyAgICAxMAorICAgID4+PiBhLnggPSAtMTAKKyAgICA+Pj4gcHJpbnQgYS54CisgICAgMAorICAgID4+PgorIiIiCisKK3Rlc3RfNiA9ICIiIgorCitNZXRob2QgcmVzb2x1dGlvbiBvcmRlcgorCitUaGlzIGV4YW1wbGUgaXMgaW1wbGljaXQgaW4gdGhlIHdyaXRldXAuCisKKz4+PiBjbGFzcyBBOiAgICAjIGNsYXNzaWMgY2xhc3MKKy4uLiAgICAgZGVmIHNhdmUoc2VsZik6CisuLi4gICAgICAgICBwcmludCAiY2FsbGVkIEEuc2F2ZSgpIgorPj4+IGNsYXNzIEIoQSk6CisuLi4gICAgIHBhc3MKKz4+PiBjbGFzcyBDKEEpOgorLi4uICAgICBkZWYgc2F2ZShzZWxmKToKKy4uLiAgICAgICAgIHByaW50ICJjYWxsZWQgQy5zYXZlKCkiCis+Pj4gY2xhc3MgRChCLCBDKToKKy4uLiAgICAgcGFzcworCis+Pj4gRCgpLnNhdmUoKQorY2FsbGVkIEEuc2F2ZSgpCisKKz4+PiBjbGFzcyBBKG9iamVjdCk6ICAjIG5ldyBjbGFzcworLi4uICAgICBkZWYgc2F2ZShzZWxmKToKKy4uLiAgICAgICAgIHByaW50ICJjYWxsZWQgQS5zYXZlKCkiCis+Pj4gY2xhc3MgQihBKToKKy4uLiAgICAgcGFzcworPj4+IGNsYXNzIEMoQSk6CisuLi4gICAgIGRlZiBzYXZlKHNlbGYpOgorLi4uICAgICAgICAgcHJpbnQgImNhbGxlZCBDLnNhdmUoKSIKKz4+PiBjbGFzcyBEKEIsIEMpOgorLi4uICAgICBwYXNzCisKKz4+PiBEKCkuc2F2ZSgpCitjYWxsZWQgQy5zYXZlKCkKKyIiIgorCitjbGFzcyBBKG9iamVjdCk6CisgICAgZGVmIG0oc2VsZik6CisgICAgICAgIHJldHVybiAiQSIKKworY2xhc3MgQihBKToKKyAgICBkZWYgbShzZWxmKToKKyAgICAgICAgcmV0dXJuICJCIiArIHN1cGVyKEIsIHNlbGYpLm0oKQorCitjbGFzcyBDKEEpOgorICAgIGRlZiBtKHNlbGYpOgorICAgICAgICByZXR1cm4gIkMiICsgc3VwZXIoQywgc2VsZikubSgpCisKK2NsYXNzIEQoQywgQik6CisgICAgZGVmIG0oc2VsZik6CisgICAgICAgIHJldHVybiAiRCIgKyBzdXBlcihELCBzZWxmKS5tKCkKKworCit0ZXN0XzcgPSAiIiIKKworQ29vcGVyYXRpdmUgbWV0aG9kcyBhbmQgInN1cGVyIgorCis+Pj4gcHJpbnQgRCgpLm0oKSAjICJEQ0JBIgorRENCQQorIiIiCisKK3Rlc3RfOCA9ICIiIgorCitCYWNrd2FyZHMgaW5jb21wYXRpYmlsaXRpZXMKKworPj4+IGNsYXNzIEE6CisuLi4gICAgIGRlZiBmb28oc2VsZik6CisuLi4gICAgICAgICBwcmludCAiY2FsbGVkIEEuZm9vKCkiCisKKz4+PiBjbGFzcyBCKEEpOgorLi4uICAgICBwYXNzCisKKz4+PiBjbGFzcyBDKEEpOgorLi4uICAgICBkZWYgZm9vKHNlbGYpOgorLi4uICAgICAgICAgQi5mb28oc2VsZikKKworPj4+IEMoKS5mb28oKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorIC4uLgorVHlwZUVycm9yOiB1bmJvdW5kIG1ldGhvZCBmb28oKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEIgaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQgKGdvdCBDIGluc3RhbmNlIGluc3RlYWQpCisKKz4+PiBjbGFzcyBDKEEpOgorLi4uICAgICBkZWYgZm9vKHNlbGYpOgorLi4uICAgICAgICAgQS5mb28oc2VsZikKKz4+PiBDKCkuZm9vKCkKK2NhbGxlZCBBLmZvbygpCisiIiIKKworX190ZXN0X18gPSB7InR1dDEiOiB0ZXN0XzEsCisgICAgICAgICAgICAidHV0MiI6IHRlc3RfMiwKKyAgICAgICAgICAgICJ0dXQzIjogdGVzdF8zLAorICAgICAgICAgICAgInR1dDQiOiB0ZXN0XzQsCisgICAgICAgICAgICAidHV0NSI6IHRlc3RfNSwKKyAgICAgICAgICAgICJ0dXQ2IjogdGVzdF82LAorICAgICAgICAgICAgInR1dDciOiB0ZXN0XzcsCisgICAgICAgICAgICAidHV0OCI6IHRlc3RfOH0KKworIyBNYWdpYyB0ZXN0IG5hbWUgdGhhdCByZWdydGVzdC5weSBpbnZva2VzICphZnRlciogaW1wb3J0aW5nIHRoaXMgbW9kdWxlLgorIyBUaGlzIHdvcm1zIGFyb3VuZCBhIGJvb3RzdHJhcCBwcm9ibGVtLgorIyBOb3RlIHRoYXQgZG9jdGVzdCBhbmQgcmVncnRlc3QgYm90aCBsb29rIGluIHN5cy5hcmd2IGZvciBhICItdiIgYXJndW1lbnQsCisjIHNvIHRoaXMgd29ya3MgYXMgZXhwZWN0ZWQgaW4gYm90aCB3YXlzIG9mIHJ1bm5pbmcgcmVncnRlc3QuCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgIyBPYnNjdXJlOiAgaW1wb3J0IHRoaXMgbW9kdWxlIGFzIHRlc3QudGVzdF9kZXNjcnR1dCBpbnN0ZWFkIG9mIGFzCisgICAgIyBwbGFpbiB0ZXN0X2Rlc2NydHV0IGJlY2F1c2UgdGhlIG5hbWUgb2YgdGhpcyBtb2R1bGUgd29ya3MgaXRzIHdheQorICAgICMgaW50byB0aGUgZG9jdGVzdCBleGFtcGxlcywgYW5kIHVubGVzcyB0aGUgZnVsbCB0ZXN0LnRlc3RfZGVzY3J0dXQKKyAgICAjIGJ1c2luZXNzIGlzIHVzZWQgdGhlIG5hbWUgY2FuIGNoYW5nZSBkZXBlbmRpbmcgb24gaG93IHRoZSB0ZXN0IGlzCisgICAgIyBpbnZva2VkLgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCB0ZXN0X2Rlc2NydHV0CisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZGVzY3J0dXQsIHZlcmJvc2UpCisKKyMgVGhpcyBwYXJ0IGlzbid0IG5lZWRlZCBmb3IgcmVncnRlc3QsIGJ1dCBmb3IgcnVubmluZyB0aGUgdGVzdCBkaXJlY3RseS4KK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKDEpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjcnR1dC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjcnR1dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhMzQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjcnR1dC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kZXNjcnR1dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhMzQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rlc2NydHV0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODQwZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weQpAQCAtMCwwICsxLDcwNCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgVXNlckRpY3QsIHJhbmRvbSwgc3RyaW5nCitpbXBvcnQgZ2MsIHdlYWtyZWYKKworCitjbGFzcyBEaWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgICMgY2FsbGluZyBidWlsdC1pbiB0eXBlcyB3aXRob3V0IGFyZ3VtZW50IG11c3QgcmV0dXJuIGVtcHR5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdCgpLCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChkaWN0KCksIHt9KQorCisgICAgZGVmIHRlc3RfbGl0ZXJhbF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgIyBjaGVjayBsaXRlcmFsIGNvbnN0cnVjdG9yIGZvciBkaWZmZXJlbnQgc2l6ZWQgZGljdHMKKyAgICAgICAgIyAodG8gZXhlcmNpc2UgdGhlIEJVSUxEX01BUCBvcGFyZykuCisgICAgICAgIGZvciBuIGluICgwLCAxLCA2LCAyNTYsIDQwMCk6CisgICAgICAgICAgICBpdGVtcyA9IFsoJycuam9pbihyYW5kb20uc2FtcGxlKHN0cmluZy5sZXR0ZXJzLCA4KSksIGkpCisgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuKV0KKyAgICAgICAgICAgIHJhbmRvbS5zaHVmZmxlKGl0ZW1zKQorICAgICAgICAgICAgZm9ybWF0dGVkX2l0ZW1zID0gKCd7IXJ9OiB7OmR9Jy5mb3JtYXQoaywgdikgZm9yIGssIHYgaW4gaXRlbXMpCisgICAgICAgICAgICBkaWN0bGl0ZXJhbCA9ICd7JyArICcsICcuam9pbihmb3JtYXR0ZWRfaXRlbXMpICsgJ30nCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoZGljdGxpdGVyYWwpLCBkaWN0KGl0ZW1zKSkKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMobm90IHt9LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoezE6IDJ9KQorICAgICAgICBzZWxmLmFzc2VydElzKGJvb2woe30pLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhib29sKHsxOiAyfSksIFRydWUpCisKKyAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleXMoKSwgW10pCisgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIGsgPSBkLmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmhhc19rZXkoJ2InKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQua2V5cywgTm9uZSkKKworICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52YWx1ZXMoKSwgW10pCisgICAgICAgIGQgPSB7MToyfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQudmFsdWVzKCksIFsyXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQudmFsdWVzLCBOb25lKQorCisgICAgZGVmIHRlc3RfaXRlbXMoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuaXRlbXMoKSwgW10pCisKKyAgICAgICAgZCA9IHsxOjJ9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5pdGVtcygpLCBbKDEsIDIpXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuaXRlbXMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkLmhhc19rZXkoJ2EnKSkKKyAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KKyAgICAgICAgayA9IGQua2V5cygpCisgICAgICAgIGsuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgWydhJywgJ2InXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuaGFzX2tleSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ2EnIGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgbm90IGluIGQpCisgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCBkKQorICAgICAgICBzZWxmLmFzc2VydEluKCdiJywgZCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYycsIGQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLl9fY29udGFpbnNfXykKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAwKQorICAgICAgICBkID0geydhJzogMSwgJ2InOiAyfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMikKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYSddLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2InXSwgMikKKyAgICAgICAgZFsnYyddID0gMworICAgICAgICBkWydhJ10gPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnYyddLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgNCkKKyAgICAgICAgZGVsIGRbJ2InXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsnYSc6IDQsICdjJzogM30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLl9fZ2V0aXRlbV9fKQorCisgICAgICAgIGNsYXNzIEJhZEVxKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyNAorCisgICAgICAgIGQgPSB7fQorICAgICAgICBkW0JhZEVxKCldID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQuX19nZXRpdGVtX18sIDIzKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkSGFzaChvYmplY3QpOgorICAgICAgICAgICAgZmFpbCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIHggPSBCYWRIYXNoKCkKKyAgICAgICAgZFt4XSA9IDQyCisgICAgICAgIHguZmFpbCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLl9fZ2V0aXRlbV9fLCB4KQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIGQgPSB7MToxLCAyOjIsIDM6M30KKyAgICAgICAgZC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwge30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmNsZWFyLCBOb25lKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgZC51cGRhdGUoezE6MTAwfSkKKyAgICAgICAgZC51cGRhdGUoezI6MjB9KQorICAgICAgICBkLnVwZGF0ZSh7MToxLCAyOjIsIDM6M30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgezE6MSwgMjoyLCAzOjN9KQorCisgICAgICAgIGQudXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MToxLCAyOjIsIDM6M30pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBkLnVwZGF0ZSwgTm9uZSkKKworICAgICAgICBjbGFzcyBTaW1wbGVVc2VyRGljdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmQgPSB7MToxLCAyOjIsIDM6M30KKyAgICAgICAgICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmQua2V5cygpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZFtpXQorICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgZC51cGRhdGUoU2ltcGxlVXNlckRpY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7MToxLCAyOjIsIDM6M30pCisKKyAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKKworICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgY2xhc3MgRmFpbGluZ1VzZXJEaWN0OgorICAgICAgICAgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgZC51cGRhdGUsIEZhaWxpbmdVc2VyRGljdCgpKQorCisgICAgICAgIGNsYXNzIEZhaWxpbmdVc2VyRGljdDoKKyAgICAgICAgICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAgICAgICAgIGNsYXNzIEJvZ29uSXRlcjoKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pID0gMQorICAgICAgICAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhJworICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjCisgICAgICAgICAgICAgICAgcmV0dXJuIEJvZ29uSXRlcigpCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgZC51cGRhdGUsIEZhaWxpbmdVc2VyRGljdCgpKQorCisgICAgICAgIGNsYXNzIEZhaWxpbmdVc2VyRGljdDoKKyAgICAgICAgICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAgICAgICAgIGNsYXNzIEJvZ29uSXRlcjoKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pID0gb3JkKCdhJykKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmkgPD0gb3JkKCd6Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRuID0gY2hyKHNlbGYuaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBydG4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gQm9nb25JdGVyKCkKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGQudXBkYXRlLCBGYWlsaW5nVXNlckRpY3QoKSkKKworICAgICAgICBjbGFzcyBiYWRzZXEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIHt9LnVwZGF0ZSwgYmFkc2VxKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwge30udXBkYXRlLCBbKDEsIDIsIDMpXSkKKworICAgIGRlZiB0ZXN0X2Zyb21rZXlzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydElzTm90KGQuZnJvbWtleXMoJ2FiYycpLCBkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cygoNCw1KSwwKSwgezQ6MCwgNTowfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKFtdKSwge30pCisgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICB5aWVsZCAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cyhnKCkpLCB7MTpOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB7fS5mcm9ta2V5cywgMykKKyAgICAgICAgY2xhc3MgZGljdGxpa2UoZGljdCk6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0bGlrZS5mcm9ta2V5cygnYScpLCB7J2EnOk5vbmV9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3RsaWtlKCkuZnJvbWtleXMoJ2EnKSwgeydhJzpOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGRpY3RsaWtlLmZyb21rZXlzKCdhJyksIGRpY3RsaWtlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLCBkaWN0bGlrZSkKKyAgICAgICAgY2xhc3MgbXlkaWN0KGRpY3QpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVXNlckRpY3QuVXNlckRpY3QoKQorICAgICAgICB1ZCA9IG15ZGljdC5mcm9ta2V5cygnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVkLCB7J2EnOk5vbmUsICdiJzpOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHVkLCBVc2VyRGljdC5Vc2VyRGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkaWN0LmZyb21rZXlzKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgYmFkZGljdDEoZGljdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGJhZGRpY3QxLmZyb21rZXlzLCBbMV0pCisKKyAgICAgICAgY2xhc3MgQmFkU2VxKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkaWN0LmZyb21rZXlzLCBCYWRTZXEoKSkKKworICAgICAgICBjbGFzcyBiYWRkaWN0MihkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4YywgYmFkZGljdDIuZnJvbWtleXMsIFsxXSkKKworICAgICAgICAjIHRlc3QgZmFzdCBwYXRoIGZvciBkaWN0aW9uYXJ5IGlucHV0cworICAgICAgICBkID0gZGljdCh6aXAocmFuZ2UoNiksIHJhbmdlKDYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0LmZyb21rZXlzKGQsIDApLCBkaWN0KHppcChyYW5nZSg2KSwgWzBdKjYpKSkKKworICAgICAgICBjbGFzcyBiYWRkaWN0MyhkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGQKKyAgICAgICAgZCA9IHtpIDogaSBmb3IgaSBpbiByYW5nZSgxMCl9CisgICAgICAgIHJlcyA9IGQuY29weSgpCisgICAgICAgIHJlcy51cGRhdGUoYT1Ob25lLCBiPU5vbmUsIGM9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWRkaWN0My5mcm9ta2V5cyh7ImEiLCAiYiIsICJjIn0pLCByZXMpCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBkID0gezE6MSwgMjoyLCAzOjN9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3B5KCksIHsxOjEsIDI6MiwgMzozfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7fS5jb3B5KCksIHt9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuY29weSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZC5nZXQoJ2MnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQorICAgICAgICBkID0geydhJzogMSwgJ2InOiAyfQorICAgICAgICBzZWxmLmFzc2VydElzKGQuZ2V0KCdjJyksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2MnLCAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhJywgMyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5nZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5nZXQsIE5vbmUsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9zZXRkZWZhdWx0KHNlbGYpOgorICAgICAgICAjIGRpY3Quc2V0ZGVmYXVsdCgpCisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydElzKGQuc2V0ZGVmYXVsdCgna2V5MCcpLCBOb25lKQorICAgICAgICBkLnNldGRlZmF1bHQoJ2tleTAnLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkLnNldGRlZmF1bHQoJ2tleTAnKSwgTm9uZSkKKyAgICAgICAgZC5zZXRkZWZhdWx0KCdrZXknLCBbXSkuYXBwZW5kKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsna2V5J11bMF0sIDMpCisgICAgICAgIGQuc2V0ZGVmYXVsdCgna2V5JywgW10pLmFwcGVuZCg0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkWydrZXknXSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5zZXRkZWZhdWx0KQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkSGFzaChvYmplY3QpOgorICAgICAgICAgICAgZmFpbCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIHggPSBCYWRIYXNoKCkKKyAgICAgICAgZFt4XSA9IDQyCisgICAgICAgIHguZmFpbCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnNldGRlZmF1bHQsIHgsIFtdKQorCisgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdF9hdG9taWMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzNTIxOiBzZXRkZWZhdWx0KCkgY2FsbHMgX19oYXNoX18gYW5kIF9fZXFfXyBvbmx5IG9uY2UuCisgICAgICAgIGNsYXNzIEhhc2hlZChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaGFzaF9jb3VudCA9IDAKKyAgICAgICAgICAgICAgICBzZWxmLmVxX2NvdW50ID0gMAorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaGFzaF9jb3VudCArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBzZWxmLmVxX2NvdW50ICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gaWQoc2VsZikgPT0gaWQob3RoZXIpCisgICAgICAgIGhhc2hlZDEgPSBIYXNoZWQoKQorICAgICAgICB5ID0ge2hhc2hlZDE6IDV9CisgICAgICAgIGhhc2hlZDIgPSBIYXNoZWQoKQorICAgICAgICB5LnNldGRlZmF1bHQoaGFzaGVkMiwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaGVkMS5oYXNoX2NvdW50LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2hlZDIuaGFzaF9jb3VudCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoZWQxLmVxX2NvdW50ICsgaGFzaGVkMi5lcV9jb3VudCwgMSkKKworICAgIGRlZiB0ZXN0X3BvcGl0ZW0oc2VsZik6CisgICAgICAgICMgZGljdC5wb3BpdGVtKCkKKyAgICAgICAgZm9yIGNvcHltb2RlIGluIC0xLCArMToKKyAgICAgICAgICAgICMgLTE6IGIgaGFzIHNhbWUgc3RydWN0dXJlIGFzIGEKKyAgICAgICAgICAgICMgKzE6IGIgaXMgYS5jb3B5KCkKKyAgICAgICAgICAgIGZvciBsb2cyc2l6ZSBpbiByYW5nZSgxMik6CisgICAgICAgICAgICAgICAgc2l6ZSA9IDIqKmxvZzJzaXplCisgICAgICAgICAgICAgICAgYSA9IHt9CisgICAgICAgICAgICAgICAgYiA9IHt9CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSk6CisgICAgICAgICAgICAgICAgICAgIGFbcmVwcihpKV0gPSBpCisgICAgICAgICAgICAgICAgICAgIGlmIGNvcHltb2RlIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJbcmVwcihpKV0gPSBpCisgICAgICAgICAgICAgICAgaWYgY29weW1vZGUgPiAwOgorICAgICAgICAgICAgICAgICAgICBiID0gYS5jb3B5KCkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaXplKToKKyAgICAgICAgICAgICAgICAgICAga2EsIHZhID0gdGEgPSBhLnBvcGl0ZW0oKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhLCBpbnQoa2EpKQorICAgICAgICAgICAgICAgICAgICBrYiwgdmIgPSB0YiA9IGIucG9waXRlbSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmIsIGludChrYikpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY29weW1vZGUgPCAwIGFuZCB0YSAhPSB0YikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShiKQorCisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5wb3BpdGVtKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGZvciBwb3Agd2l0aCBzcGVjaWZpZWQga2V5CisgICAgICAgIGQgPSB7fQorICAgICAgICBrLCB2ID0gJ2FiYycsICdkZWYnCisgICAgICAgIGRba10gPSB2CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBkLnBvcCwgJ2doaScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrKSwgdikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9wLCBrKQorCisgICAgICAgICMgdmVyaWZ5IGxvbmdzL2ludHMgZ2V0IHNhbWUgdmFsdWUgd2hlbiBrZXkgPiAzMiBiaXRzCisgICAgICAgICMgKGZvciA2NC1iaXQgYXJjaHMpLiAgU2VlIFNGIGJ1ZyAjNjg5NjU5LgorICAgICAgICB4ID0gNDUwMzU5OTYyNzM3MDQ5NkwKKyAgICAgICAgeSA9IDQ1MDM1OTk2MjczNzA0OTYKKyAgICAgICAgaCA9IHt4OiAnYW55dGhpbmcnLCB5OiAnc29tZXRoaW5nIGVsc2UnfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbeF0sIGhbeV0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrLCB2KSwgdikKKyAgICAgICAgZFtrXSA9IHYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrLCAxKSwgdikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQucG9wKQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkSGFzaChvYmplY3QpOgorICAgICAgICAgICAgZmFpbCA9IEZhbHNlCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5mYWlsOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIHggPSBCYWRIYXNoKCkKKyAgICAgICAgZFt4XSA9IDQyCisgICAgICAgIHguZmFpbCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBkLnBvcCwgeCkKKworICAgIGRlZiB0ZXN0X211dGF0aW5naXRlcmF0aW9uKHNlbGYpOgorICAgICAgICAjIGNoYW5naW5nIGRpY3Qgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uCisgICAgICAgIGQgPSB7fQorICAgICAgICBkWzFdID0gMQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICBmb3IgaSBpbiBkOgorICAgICAgICAgICAgICAgIGRbaSsxXSA9IDEKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGQgPSB7fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZCksICd7fScpCisgICAgICAgIGRbMV0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkKSwgJ3sxOiAyfScpCisgICAgICAgIGQgPSB7fQorICAgICAgICBkWzFdID0gZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZCksICd7MTogey4uLn19JykKKworICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcworCisgICAgICAgIGNsYXNzIEJhZFJlcHIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorCisgICAgICAgIGQgPSB7MTogQmFkUmVwcigpfQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIHJlcHIsIGQpCisKKyAgICBkZWYgdGVzdF9sZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh7fSA8IHt9KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHsxOiAyfSA8IHsxTDogMkx9KQorCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQmFkQ21wKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMoKQorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgIGQxID0ge0JhZENtcCgpOiAxfQorICAgICAgICBkMiA9IHsxOiAxfQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRXhjKToKKyAgICAgICAgICAgIGQxIDwgZDIKKworICAgIGRlZiB0ZXN0X21pc3Npbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGRpY3QgZG9lc24ndCBoYXZlIGEgX19taXNzaW5nX18gbWV0aG9kCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihkaWN0LCAiX19taXNzaW5nX18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHt9LCAiX19taXNzaW5nX18iKSkKKyAgICAgICAgIyBUZXN0IHNldmVyYWwgY2FzZXM6CisgICAgICAgICMgKEQpIHN1YmNsYXNzIGRlZmluZXMgX19taXNzaW5nX18gbWV0aG9kIHJldHVybmluZyBhIHZhbHVlCisgICAgICAgICMgKEUpIHN1YmNsYXNzIGRlZmluZXMgX19taXNzaW5nX18gbWV0aG9kIHJhaXNpbmcgUnVudGltZUVycm9yCisgICAgICAgICMgKEYpIHN1YmNsYXNzIHNldHMgX19taXNzaW5nX18gaW5zdGFuY2UgdmFyaWFibGUgKG5vIGVmZmVjdCkKKyAgICAgICAgIyAoRykgc3ViY2xhc3MgZG9lc24ndCBkZWZpbmUgX19taXNzaW5nX18gYXQgYSBhbGwKKyAgICAgICAgY2xhc3MgRChkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICBkID0gRCh7MTogMiwgMzogNH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsxXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzNdLCA0KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDIsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oMiwgZC5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsyXSwgNDIpCisKKyAgICAgICAgY2xhc3MgRShkaWN0KToKKyAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihrZXkpCisgICAgICAgIGUgPSBFKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpIGFzIGM6CisgICAgICAgICAgICBlWzQyXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZXhjZXB0aW9uLmFyZ3MsICg0MiwpKQorCisgICAgICAgIGNsYXNzIEYoZGljdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgIyBBbiBpbnN0YW5jZSB2YXJpYWJsZSBfX21pc3NpbmdfXyBzaG91bGQgaGF2ZSBubyBlZmZlY3QKKyAgICAgICAgICAgICAgICBzZWxmLl9fbWlzc2luZ19fID0gbGFtYmRhIGtleTogTm9uZQorICAgICAgICBmID0gRigpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpIGFzIGM6CisgICAgICAgICAgICBmWzQyXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZXhjZXB0aW9uLmFyZ3MsICg0MiwpKQorCisgICAgICAgIGNsYXNzIEcoZGljdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGcgPSBHKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIGdbNDJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5leGNlcHRpb24uYXJncywgKDQyLCkpCisKKyAgICBkZWYgdGVzdF90dXBsZV9rZXllcnJvcihzZWxmKToKKyAgICAgICAgIyBTRiAjMTU3NjY1NworICAgICAgICBkID0ge30KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIGRbKDEsKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmV4Y2VwdGlvbi5hcmdzLCAoKDEsKSwpKQorCisgICAgZGVmIHRlc3RfYmFkX2tleShzZWxmKToKKyAgICAgICAgIyBEaWN0aW9uYXJ5IGxvb2t1cHMgc2hvdWxkIGZhaWwgaWYgX19jbXBfXygpIHJhaXNlcyBhbiBleGNlcHRpb24uCisgICAgICAgIGNsYXNzIEN1c3RvbUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIEJhZERpY3RLZXk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5fX2NsYXNzX18pCisKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEN1c3RvbUV4Y2VwdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBvdGhlcgorCisgICAgICAgIGQgPSB7fQorICAgICAgICB4MSA9IEJhZERpY3RLZXkoKQorICAgICAgICB4MiA9IEJhZERpY3RLZXkoKQorICAgICAgICBkW3gxXSA9IDEKKyAgICAgICAgZm9yIHN0bXQgaW4gWydkW3gyXSA9IDInLAorICAgICAgICAgICAgICAgICAgICAgJ3ogPSBkW3gyXScsCisgICAgICAgICAgICAgICAgICAgICAneDIgaW4gZCcsCisgICAgICAgICAgICAgICAgICAgICAnZC5oYXNfa2V5KHgyKScsCisgICAgICAgICAgICAgICAgICAgICAnZC5nZXQoeDIpJywKKyAgICAgICAgICAgICAgICAgICAgICdkLnNldGRlZmF1bHQoeDIsIDQyKScsCisgICAgICAgICAgICAgICAgICAgICAnZC5wb3AoeDIpJywKKyAgICAgICAgICAgICAgICAgICAgICdkLnVwZGF0ZSh7eDI6IDJ9KSddOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhDdXN0b21FeGNlcHRpb24pOgorICAgICAgICAgICAgICAgIGV4ZWMgc3RtdCBpbiBsb2NhbHMoKQorCisgICAgZGVmIHRlc3RfcmVzaXplMShzZWxmKToKKyAgICAgICAgIyBEaWN0IHJlc2l6aW5nIGJ1ZywgZm91bmQgYnkgSmFjayBKYW5zZW4gaW4gMi4yIENWUyBkZXZlbG9wbWVudC4KKyAgICAgICAgIyBUaGlzIHZlcnNpb24gZ290IGFuIGFzc2VydCBmYWlsdXJlIGluIGRlYnVnIGJ1aWxkLCBpbmZpbml0ZSBsb29wIGluCisgICAgICAgICMgcmVsZWFzZSBidWlsZC4gIFVuZm9ydHVuYXRlbHksIHByb3Zva2luZyB0aGlzIGtpbmQgb2Ygc3R1ZmYgcmVxdWlyZXMKKyAgICAgICAgIyBhIG1peCBvZiBpbnNlcnRzIGFuZCBkZWxldGVzIGhpdHRpbmcgZXhhY3RseSB0aGUgcmlnaHQgaGFzaCBjb2RlcyBpbgorICAgICAgICAjIGV4YWN0bHkgdGhlIHJpZ2h0IG9yZGVyLCBhbmQgSSBjYW4ndCB0aGluayBvZiBhIHJhbmRvbWl6ZWQgYXBwcm9hY2gKKyAgICAgICAgIyB0aGF0IHdvdWxkIGJlICpsaWtlbHkqIHRvIGhpdCBhIGZhaWxpbmcgY2FzZSBpbiByZWFzb25hYmxlIHRpbWUuCisKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgZFtpXSA9IGkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBkZWwgZFtpXQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1LCA5KTogICMgaT09OCB3YXMgdGhlIHByb2JsZW0KKyAgICAgICAgICAgIGRbaV0gPSBpCisKKyAgICBkZWYgdGVzdF9yZXNpemUyKHNlbGYpOgorICAgICAgICAjIEFub3RoZXIgZGljdCByZXNpemluZyBidWcgKFNGIGJ1ZyAjMTQ1NjIwOSkuCisgICAgICAgICMgVGhpcyBjYXVzZWQgU2VnbWVudGF0aW9uIGZhdWx0cyBvciBJbGxlZ2FsIGluc3RydWN0aW9ucy4KKworICAgICAgICBjbGFzcyBYKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDUKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIHJlc2l6aW5nOgorICAgICAgICAgICAgICAgICAgICBkLmNsZWFyKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZCA9IHt9CisgICAgICAgIHJlc2l6aW5nID0gRmFsc2UKKyAgICAgICAgZFtYKCldID0gMQorICAgICAgICBkW1goKV0gPSAyCisgICAgICAgIGRbWCgpXSA9IDMKKyAgICAgICAgZFtYKCldID0gNAorICAgICAgICBkW1goKV0gPSA1CisgICAgICAgICMgbm93IHRyaWdnZXIgYSByZXNpemUKKyAgICAgICAgcmVzaXppbmcgPSBUcnVlCisgICAgICAgIGRbOV0gPSA2CisKKyAgICBkZWYgdGVzdF9lbXB0eV9wcmVzaXplZF9kaWN0X2luX2ZyZWVsaXN0KHNlbGYpOgorICAgICAgICAjIEJ1ZyAjMzUzNzogaWYgYW4gZW1wdHkgYnV0IHByZXNpemVkIGRpY3Qgd2l0aCBhIHNpemUgbGFyZ2VyCisgICAgICAgICMgdGhhbiA3IHdhcyBpbiB0aGUgZnJlZWxpc3QsIGl0IHRyaWdnZXJlZCBhbiBhc3NlcnRpb24gZmFpbHVyZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yKToKKyAgICAgICAgICAgIGQgPSB7J2EnOiAxIC8vIDAsICdiJzogTm9uZSwgJ2MnOiBOb25lLCAnZCc6IE5vbmUsICdlJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgJ2YnOiBOb25lLCAnZyc6IE5vbmUsICdoJzogTm9uZX0KKyAgICAgICAgZCA9IHt9CisKKyAgICBkZWYgdGVzdF9jb250YWluZXJfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgICMgQnVnICMzNjgwOiB0cF90cmF2ZXJzZSB3YXMgbm90IGltcGxlbWVudGVkIGZvciBkaWN0aXRlciBvYmplY3RzCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaXRlcmF0b3JzID0gKGRpY3QuaXRlcml0ZW1zLCBkaWN0Lml0ZXJ2YWx1ZXMsIGRpY3QuaXRlcmtleXMpCisgICAgICAgIGZvciBpIGluIGl0ZXJhdG9yczoKKyAgICAgICAgICAgIG9iaiA9IEMoKQorICAgICAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYob2JqKQorICAgICAgICAgICAgY29udGFpbmVyID0ge29iajogMX0KKyAgICAgICAgICAgIG9iai54ID0gaShjb250YWluZXIpCisgICAgICAgICAgICBkZWwgb2JqLCBjb250YWluZXIKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhyZWYoKSwgTm9uZSwgIkN5Y2xlIHdhcyBub3QgY29sbGVjdGVkIikKKworICAgIGRlZiBfbm90X3RyYWNrZWQoc2VsZiwgdCk6CisgICAgICAgICMgTmVzdGVkIGNvbnRhaW5lcnMgY2FuIHRha2Ugc2V2ZXJhbCBjb2xsZWN0aW9ucyB0byB1bnRyYWNrCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKHQpLCB0KQorCisgICAgZGVmIF90cmFja2VkKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZCh0KSwgdCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZCh0KSwgdCkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfdHJhY2tfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgICMgVGVzdCBHQy1vcHRpbWl6YXRpb24gb2YgZGljdCBsaXRlcmFscworICAgICAgICB4LCB5LCB6LCB3ID0gMS41LCAiYSIsICgxLCBOb25lKSwgW10KKworICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCh7fSkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoe3g6KCksIHk6eCwgejoxfSkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoezE6ICJhIiwgImIiOiAyfSkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoezE6IDIsIChOb25lLCBUcnVlLCBGYWxzZSwgKCkpOiBpbnR9KQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCh7MTogb2JqZWN0KCl9KQorCisgICAgICAgICMgRGljdHMgd2l0aCBtdXRhYmxlIGVsZW1lbnRzIGFyZSBhbHdheXMgdHJhY2tlZCwgZXZlbiBpZiB0aG9zZQorICAgICAgICAjIGVsZW1lbnRzIGFyZSBub3QgdHJhY2tlZCByaWdodCBub3cuCisgICAgICAgIHNlbGYuX3RyYWNrZWQoezE6IFtdfSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCh7MTogKFtdLCl9KQorICAgICAgICBzZWxmLl90cmFja2VkKHsxOiB7fX0pCisgICAgICAgIHNlbGYuX3RyYWNrZWQoezE6IHNldCgpfSkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfdHJhY2tfZHluYW1pYyhzZWxmKToKKyAgICAgICAgIyBUZXN0IEdDLW9wdGltaXphdGlvbiBvZiBkeW5hbWljYWxseS1jcmVhdGVkIGRpY3RzCisgICAgICAgIGNsYXNzIE15T2JqZWN0KG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHgsIHksIHosIHcsIG8gPSAxLjUsICJhIiwgKDEsIG9iamVjdCgpKSwgW10sIE15T2JqZWN0KCkKKworICAgICAgICBkID0gZGljdCgpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGQpCisgICAgICAgIGRbMV0gPSAiYSIKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgZFt5XSA9IDIKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgZFt6XSA9IDMKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZC5jb3B5KCkpCisgICAgICAgIGRbNF0gPSB3CisgICAgICAgIHNlbGYuX3RyYWNrZWQoZCkKKyAgICAgICAgc2VsZi5fdHJhY2tlZChkLmNvcHkoKSkKKyAgICAgICAgZFs0XSA9IE5vbmUKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZCkKKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQoZC5jb3B5KCkpCisKKyAgICAgICAgIyBkZCBpc24ndCB0cmFja2VkIHJpZ2h0IG5vdywgYnV0IGl0IG1heSBtdXRhdGUgYW5kIHRoZXJlZm9yZSBkCisgICAgICAgICMgd2hpY2ggY29udGFpbnMgaXQgbXVzdCBiZSB0cmFja2VkLgorICAgICAgICBkID0gZGljdCgpCisgICAgICAgIGRkID0gZGljdCgpCisgICAgICAgIGRbMV0gPSBkZAorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkZCkKKyAgICAgICAgc2VsZi5fdHJhY2tlZChkKQorICAgICAgICBkZFsxXSA9IGQKKyAgICAgICAgc2VsZi5fdHJhY2tlZChkZCkKKworICAgICAgICBkID0gZGljdC5mcm9ta2V5cyhbeCwgeSwgel0pCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGQpCisgICAgICAgIGRkID0gZGljdCgpCisgICAgICAgIGRkLnVwZGF0ZShkKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkZCkKKyAgICAgICAgZCA9IGRpY3QuZnJvbWtleXMoW3gsIHksIHosIG9dKQorICAgICAgICBzZWxmLl90cmFja2VkKGQpCisgICAgICAgIGRkID0gZGljdCgpCisgICAgICAgIGRkLnVwZGF0ZShkKQorICAgICAgICBzZWxmLl90cmFja2VkKGRkKQorCisgICAgICAgIGQgPSBkaWN0KHg9eCwgeT15LCB6PXopCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGQpCisgICAgICAgIGQgPSBkaWN0KHg9eCwgeT15LCB6PXosIHc9dykKKyAgICAgICAgc2VsZi5fdHJhY2tlZChkKQorICAgICAgICBkID0gZGljdCgpCisgICAgICAgIGQudXBkYXRlKHg9eCwgeT15LCB6PXopCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGQpCisgICAgICAgIGQudXBkYXRlKHc9dykKKyAgICAgICAgc2VsZi5fdHJhY2tlZChkKQorCisgICAgICAgIGQgPSBkaWN0KFsoeCwgeSksICh6LCAxKV0pCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKGQpCisgICAgICAgIGQgPSBkaWN0KFsoeCwgeSksICh6LCB3KV0pCisgICAgICAgIHNlbGYuX3RyYWNrZWQoZCkKKyAgICAgICAgZCA9IGRpY3QoKQorICAgICAgICBkLnVwZGF0ZShbKHgsIHkpLCAoeiwgMSldKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZChkKQorICAgICAgICBkLnVwZGF0ZShbKHgsIHkpLCAoeiwgdyldKQorICAgICAgICBzZWxmLl90cmFja2VkKGQpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3RyYWNrX3N1YnR5cGVzKHNlbGYpOgorICAgICAgICAjIERpY3Qgc3VidHlwZXMgYXJlIGFsd2F5cyB0cmFja2VkCisgICAgICAgIGNsYXNzIE15RGljdChkaWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fdHJhY2tlZChNeURpY3QoKSkKKworCitmcm9tIHRlc3QgaW1wb3J0IG1hcHBpbmdfdGVzdHMKKworY2xhc3MgR2VuZXJhbE1hcHBpbmdUZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgdHlwZTJ0ZXN0ID0gZGljdAorCitjbGFzcyBEaWN0KGRpY3QpOgorICAgIHBhc3MKKworY2xhc3MgU3ViY2xhc3NNYXBwaW5nVGVzdHMobWFwcGluZ190ZXN0cy5CYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wpOgorICAgIHR5cGUydGVzdCA9IERpY3QKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICgnZGljdCguaGFzX2tleS4ufCBpbmVxdWFsaXR5IGNvbXBhcmlzb25zKSBub3Qgc3VwcG9ydGVkIGluIDMueCcsCisgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgICAgIERpY3RUZXN0LAorICAgICAgICAgICAgR2VuZXJhbE1hcHBpbmdUZXN0cywKKyAgICAgICAgICAgIFN1YmNsYXNzTWFwcGluZ1Rlc3RzLAorICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzNTZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDUzNTZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3Rjb21wcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3Rjb21wcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGNiYjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5CkBAIC0wLDAgKzEsOTEgQEAKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisKKyMgRm9yIHNjb3BlIHRlc3RpbmcuCitnID0gIkdsb2JhbCB2YXJpYWJsZSIKKworCitjbGFzcyBEaWN0Q29tcHJlaGVuc2lvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWNzKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IHswOiAxMCwgMTogMTEsIDI6IDEyLCAzOiAxMywgNDogMTQsIDU6IDE1LCA2OiAxNiwgNzogMTcsCisgICAgICAgICAgICAgICAgICAgIDg6IDE4LCA5OiAxOX0KKyAgICAgICAgYWN0dWFsID0ge2s6IGsgKyAxMCBmb3IgayBpbiByYW5nZSgxMCl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKKworICAgICAgICBleHBlY3RlZCA9IHswOiAwLCAxOiAxLCAyOiAyLCAzOiAzLCA0OiA0LCA1OiA1LCA2OiA2LCA3OiA3LCA4OiA4LCA5OiA5fQorICAgICAgICBhY3R1YWwgPSB7azogdiBmb3IgayBpbiByYW5nZSgxMCkgZm9yIHYgaW4gcmFuZ2UoMTApIGlmIGsgPT0gdn0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfc2NvcGVfaXNvbGF0aW9uKHNlbGYpOgorICAgICAgICBrID0gIkxvY2FsIFZhcmlhYmxlIgorCisgICAgICAgIGV4cGVjdGVkID0gezA6IE5vbmUsIDE6IE5vbmUsIDI6IE5vbmUsIDM6IE5vbmUsIDQ6IE5vbmUsIDU6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgIDY6IE5vbmUsIDc6IE5vbmUsIDg6IE5vbmUsIDk6IE5vbmV9CisgICAgICAgIGFjdHVhbCA9IHtrOiBOb25lIGZvciBrIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssICJMb2NhbCBWYXJpYWJsZSIpCisKKyAgICAgICAgZXhwZWN0ZWQgPSB7OTogMSwgMTg6IDIsIDE5OiAyLCAyNzogMywgMjg6IDMsIDI5OiAzLCAzNjogNCwgMzc6IDQsCisgICAgICAgICAgICAgICAgICAgIDM4OiA0LCAzOTogNCwgNDU6IDUsIDQ2OiA1LCA0NzogNSwgNDg6IDUsIDQ5OiA1LCA1NDogNiwKKyAgICAgICAgICAgICAgICAgICAgNTU6IDYsIDU2OiA2LCA1NzogNiwgNTg6IDYsIDU5OiA2LCA2MzogNywgNjQ6IDcsIDY1OiA3LAorICAgICAgICAgICAgICAgICAgICA2NjogNywgNjc6IDcsIDY4OiA3LCA2OTogNywgNzI6IDgsIDczOiA4LCA3NDogOCwgNzU6IDgsCisgICAgICAgICAgICAgICAgICAgIDc2OiA4LCA3NzogOCwgNzg6IDgsIDc5OiA4LCA4MTogOSwgODI6IDksIDgzOiA5LCA4NDogOSwKKyAgICAgICAgICAgICAgICAgICAgODU6IDksIDg2OiA5LCA4NzogOSwgODg6IDksIDg5OiA5fQorICAgICAgICBhY3R1YWwgPSB7azogdiBmb3IgdiBpbiByYW5nZSgxMCkgZm9yIGsgaW4gcmFuZ2UodiAqIDksIHYgKiAxMCl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgIkxvY2FsIFZhcmlhYmxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfc2NvcGVfaXNvbGF0aW9uX2Zyb21fZ2xvYmFsKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9IHswOiBOb25lLCAxOiBOb25lLCAyOiBOb25lLCAzOiBOb25lLCA0OiBOb25lLCA1OiBOb25lLAorICAgICAgICAgICAgICAgICAgICA2OiBOb25lLCA3OiBOb25lLCA4OiBOb25lLCA5OiBOb25lfQorICAgICAgICBhY3R1YWwgPSB7ZzogTm9uZSBmb3IgZyBpbiByYW5nZSgxMCl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLCAiR2xvYmFsIHZhcmlhYmxlIikKKworICAgICAgICBleHBlY3RlZCA9IHs5OiAxLCAxODogMiwgMTk6IDIsIDI3OiAzLCAyODogMywgMjk6IDMsIDM2OiA0LCAzNzogNCwKKyAgICAgICAgICAgICAgICAgICAgMzg6IDQsIDM5OiA0LCA0NTogNSwgNDY6IDUsIDQ3OiA1LCA0ODogNSwgNDk6IDUsIDU0OiA2LAorICAgICAgICAgICAgICAgICAgICA1NTogNiwgNTY6IDYsIDU3OiA2LCA1ODogNiwgNTk6IDYsIDYzOiA3LCA2NDogNywgNjU6IDcsCisgICAgICAgICAgICAgICAgICAgIDY2OiA3LCA2NzogNywgNjg6IDcsIDY5OiA3LCA3MjogOCwgNzM6IDgsIDc0OiA4LCA3NTogOCwKKyAgICAgICAgICAgICAgICAgICAgNzY6IDgsIDc3OiA4LCA3ODogOCwgNzk6IDgsIDgxOiA5LCA4MjogOSwgODM6IDksIDg0OiA5LAorICAgICAgICAgICAgICAgICAgICA4NTogOSwgODY6IDksIDg3OiA5LCA4ODogOSwgODk6IDl9CisgICAgICAgIGFjdHVhbCA9IHtnOiB2IGZvciB2IGluIHJhbmdlKDEwKSBmb3IgZyBpbiByYW5nZSh2ICogOSwgdiAqIDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLCAiR2xvYmFsIHZhcmlhYmxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZ2xvYmFsX3Zpc2liaWxpdHkoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gezA6ICdHbG9iYWwgdmFyaWFibGUnLCAxOiAnR2xvYmFsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgMjogJ0dsb2JhbCB2YXJpYWJsZScsIDM6ICdHbG9iYWwgdmFyaWFibGUnLAorICAgICAgICAgICAgICAgICAgICA0OiAnR2xvYmFsIHZhcmlhYmxlJywgNTogJ0dsb2JhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDY6ICdHbG9iYWwgdmFyaWFibGUnLCA3OiAnR2xvYmFsIHZhcmlhYmxlJywKKyAgICAgICAgICAgICAgICAgICAgODogJ0dsb2JhbCB2YXJpYWJsZScsIDk6ICdHbG9iYWwgdmFyaWFibGUnfQorICAgICAgICBhY3R1YWwgPSB7azogZyBmb3IgayBpbiByYW5nZSgxMCl9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2xvY2FsX3Zpc2liaWxpdHkoc2VsZik6CisgICAgICAgIHYgPSAiTG9jYWwgdmFyaWFibGUiCisgICAgICAgIGV4cGVjdGVkID0gezA6ICdMb2NhbCB2YXJpYWJsZScsIDE6ICdMb2NhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDI6ICdMb2NhbCB2YXJpYWJsZScsIDM6ICdMb2NhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDQ6ICdMb2NhbCB2YXJpYWJsZScsIDU6ICdMb2NhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDY6ICdMb2NhbCB2YXJpYWJsZScsIDc6ICdMb2NhbCB2YXJpYWJsZScsCisgICAgICAgICAgICAgICAgICAgIDg6ICdMb2NhbCB2YXJpYWJsZScsIDk6ICdMb2NhbCB2YXJpYWJsZSd9CisgICAgICAgIGFjdHVhbCA9IHtrOiB2IGZvciBrIGluIHJhbmdlKDEwKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsICJMb2NhbCB2YXJpYWJsZSIpCisKKyAgICBkZWYgdGVzdF9pbGxlZ2FsX2Fzc2lnbm1lbnQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoU3ludGF4RXJyb3IsICJjYW4ndCBhc3NpZ24iKToKKyAgICAgICAgICAgIGNvbXBpbGUoInt4OiB5IGZvciB5LCB4IGluICgoMSwgMiksICgzLCA0KSl9ID0gNSIsICI8dGVzdD4iLAorICAgICAgICAgICAgICAgICAgICAiZXhlYyIpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChTeW50YXhFcnJvciwgImNhbid0IGFzc2lnbiIpOgorICAgICAgICAgICAgY29tcGlsZSgie3g6IHkgZm9yIHksIHggaW4gKCgxLCAyKSwgKDMsIDQpKX0gKz0gNSIsICI8dGVzdD4iLAorICAgICAgICAgICAgICAgICAgICAiZXhlYyIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0Y29tcHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ2NGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0Y29tcHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWQ2NGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGljdGNvbXBzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0dmlld3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0dmlld3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwMzY3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weQpAQCAtMCwwICsxLDE1NCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBEaWN0U2V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcnNfbm90X2NhbGxhYmxlKHNlbGYpOgorICAgICAgICBrdCA9IHR5cGUoe30udmlld2tleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBrdCwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwga3QpCisgICAgICAgIGl0ID0gdHlwZSh7fS52aWV3aXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpdCwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXQpCisgICAgICAgIHZ0ID0gdHlwZSh7fS52aWV3dmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdnQsIHt9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHZ0KQorCisgICAgZGVmIHRlc3RfZGljdF9rZXlzKHNlbGYpOgorICAgICAgICBkID0gezE6IDEwLCAiYSI6ICJBQkMifQorICAgICAgICBrZXlzID0gZC52aWV3a2V5cygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChrZXlzKSwgc2V0KFsxLCAiYSJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrZXlzLCBzZXQoWzEsICJhIl0pKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGtleXMsIHNldChbMSwgImEiLCAiYiJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChrZXlzLCBzZXQoWzEsICJiIl0pKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGtleXMsIHNldChbMV0pKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGtleXMsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEluKDEsIGtleXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oImEiLCBrZXlzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEwLCBrZXlzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJaIiwga2V5cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnZpZXdrZXlzKCksIGQudmlld2tleXMoKSkKKyAgICAgICAgZSA9IHsxOiAxMSwgImEiOiAiZGVmIn0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnZpZXdrZXlzKCksIGUudmlld2tleXMoKSkKKyAgICAgICAgZGVsIGVbImEiXQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGQudmlld2tleXMoKSwgZS52aWV3a2V5cygpKQorCisgICAgZGVmIHRlc3RfZGljdF9pdGVtcyhzZWxmKToKKyAgICAgICAgZCA9IHsxOiAxMCwgImEiOiAiQUJDIn0KKyAgICAgICAgaXRlbXMgPSBkLnZpZXdpdGVtcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0ZW1zKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoaXRlbXMpLCBzZXQoWygxLCAxMCksICgiYSIsICJBQkMiKV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zLCBzZXQoWygxLCAxMCksICgiYSIsICJBQkMiKV0pKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGl0ZW1zLCBzZXQoWygxLCAxMCksICgiYSIsICJBQkMiKSwgImp1bmsiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaXRlbXMsIHNldChbKDEsIDEwKSwgKCJhIiwgImRlZiIpXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaXRlbXMsIHNldChbKDEsIDEwKV0pKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGl0ZW1zLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoMSwgMTApLCBpdGVtcykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoImEiLCAiQUJDIiksIGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCgxLCAxMSksIGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEsIGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCgpLCBpdGVtcykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigoMSwpLCBpdGVtcykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigoMSwgMiwgMyksIGl0ZW1zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQudmlld2l0ZW1zKCksIGQudmlld2l0ZW1zKCkpCisgICAgICAgIGUgPSBkLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQudmlld2l0ZW1zKCksIGUudmlld2l0ZW1zKCkpCisgICAgICAgIGVbImEiXSA9ICJkZWYiCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZC52aWV3aXRlbXMoKSwgZS52aWV3aXRlbXMoKSkKKworICAgIGRlZiB0ZXN0X2RpY3RfbWl4ZWRfa2V5c19pdGVtcyhzZWxmKToKKyAgICAgICAgZCA9IHsoMSwgMSk6IDExLCAoMiwgMik6IDIyfQorICAgICAgICBlID0gezE6IDEsIDI6IDJ9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC52aWV3a2V5cygpLCBlLnZpZXdpdGVtcygpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGQudmlld2l0ZW1zKCksIGUudmlld2tleXMoKSkKKworICAgIGRlZiB0ZXN0X2RpY3RfdmFsdWVzKHNlbGYpOgorICAgICAgICBkID0gezE6IDEwLCAiYSI6ICJBQkMifQorICAgICAgICB2YWx1ZXMgPSBkLnZpZXd2YWx1ZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldCh2YWx1ZXMpLCBzZXQoWzEwLCAiQUJDIl0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCAyKQorCisgICAgZGVmIHRlc3RfZGljdF9yZXByKHNlbGYpOgorICAgICAgICBkID0gezE6IDEwLCAiYSI6ICJBQkMifQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmVwcihkKSwgc3RyKQorICAgICAgICByID0gcmVwcihkLnZpZXdpdGVtcygpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uociwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUociA9PSAiZGljdF9pdGVtcyhbKCdhJywgJ0FCQycpLCAoMSwgMTApXSkiIG9yCisgICAgICAgICAgICAgICAgICAgICAgICByID09ICJkaWN0X2l0ZW1zKFsoMSwgMTApLCAoJ2EnLCAnQUJDJyldKSIpCisgICAgICAgIHIgPSByZXByKGQudmlld2tleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHIsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIgPT0gImRpY3Rfa2V5cyhbJ2EnLCAxXSkiIG9yCisgICAgICAgICAgICAgICAgICAgICAgICByID09ICJkaWN0X2tleXMoWzEsICdhJ10pIikKKyAgICAgICAgciA9IHJlcHIoZC52aWV3dmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShyLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyID09ICJkaWN0X3ZhbHVlcyhbJ0FCQycsIDEwXSkiIG9yCisgICAgICAgICAgICAgICAgICAgICAgICByID09ICJkaWN0X3ZhbHVlcyhbMTAsICdBQkMnXSkiKQorCisgICAgZGVmIHRlc3Rfa2V5c19zZXRfb3BlcmF0aW9ucyhzZWxmKToKKyAgICAgICAgZDEgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIGQyID0geydiJzogMywgJ2MnOiAyfQorICAgICAgICBkMyA9IHsnZCc6IDQsICdlJzogNX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpICYgZDEudmlld2tleXMoKSwgeydhJywgJ2InfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpICYgZDIudmlld2tleXMoKSwgeydiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAmIGQzLnZpZXdrZXlzKCksIHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgJiBzZXQoZDEudmlld2tleXMoKSksIHsnYScsICdiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAmIHNldChkMi52aWV3a2V5cygpKSwgeydiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSAmIHNldChkMy52aWV3a2V5cygpKSwgc2V0KCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIHwgZDEudmlld2tleXMoKSwgeydhJywgJ2InfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIHwgZDIudmlld2tleXMoKSwgeydhJywgJ2InLCAnYyd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgfCBkMy52aWV3a2V5cygpLCB7J2EnLCAnYicsICdkJywgJ2UnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIHwgc2V0KGQxLnZpZXdrZXlzKCkpLCB7J2EnLCAnYid9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgfCBzZXQoZDIudmlld2tleXMoKSksIHsnYScsICdiJywgJ2MnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIHwgc2V0KGQzLnZpZXdrZXlzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsnYScsICdiJywgJ2QnLCAnZSd9KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2tleXMoKSBeIGQxLnZpZXdrZXlzKCksIHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgXiBkMi52aWV3a2V5cygpLCB7J2EnLCAnYyd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgXiBkMy52aWV3a2V5cygpLCB7J2EnLCAnYicsICdkJywgJ2UnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIF4gc2V0KGQxLnZpZXdrZXlzKCkpLCBzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3a2V5cygpIF4gc2V0KGQyLnZpZXdrZXlzKCkpLCB7J2EnLCAnYyd9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdrZXlzKCkgXiBzZXQoZDMudmlld2tleXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydhJywgJ2InLCAnZCcsICdlJ30pCisKKyAgICBkZWYgdGVzdF9pdGVtc19zZXRfb3BlcmF0aW9ucyhzZWxmKToKKyAgICAgICAgZDEgPSB7J2EnOiAxLCAnYic6IDJ9CisgICAgICAgIGQyID0geydhJzogMiwgJ2InOiAyfQorICAgICAgICBkMyA9IHsnZCc6IDQsICdlJzogNX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGQxLnZpZXdpdGVtcygpICYgZDEudmlld2l0ZW1zKCksIHsoJ2EnLCAxKSwgKCdiJywgMil9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpICYgZDIudmlld2l0ZW1zKCksIHsoJ2InLCAyKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgJiBkMy52aWV3aXRlbXMoKSwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgJiBzZXQoZDEudmlld2l0ZW1zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdiJywgMil9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpICYgc2V0KGQyLnZpZXdpdGVtcygpKSwgeygnYicsIDIpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSAmIHNldChkMy52aWV3aXRlbXMoKSksIHNldCgpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgfCBkMS52aWV3aXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7KCdhJywgMSksICgnYicsIDIpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSB8IGQyLnZpZXdpdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdhJywgMiksICgnYicsIDIpfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSB8IGQzLnZpZXdpdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdiJywgMiksICgnZCcsIDQpLCAoJ2UnLCA1KX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgfCBzZXQoZDEudmlld2l0ZW1zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdiJywgMil9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpIHwgc2V0KGQyLnZpZXdpdGVtcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7KCdhJywgMSksICgnYScsIDIpLCAoJ2InLCAyKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEudmlld2l0ZW1zKCkgfCBzZXQoZDMudmlld2l0ZW1zKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdiJywgMiksICgnZCcsIDQpLCAoJ2UnLCA1KX0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSBeIGQxLnZpZXdpdGVtcygpLCBzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMS52aWV3aXRlbXMoKSBeIGQyLnZpZXdpdGVtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsoJ2EnLCAxKSwgKCdhJywgMil9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLnZpZXdpdGVtcygpIF4gZDMudmlld2l0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeygnYScsIDEpLCAoJ2InLCAyKSwgKCdkJywgNCksICgnZScsIDUpfSkKKworCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRGljdFNldFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0dmlld3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTEzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0dmlld3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpY3R2aWV3cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0dmlld3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTEzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWN0dmlld3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGJmOTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliLnB5CkBAIC0wLDAgKzEsMjcyIEBACitpbXBvcnQgZGlmZmxpYgorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBmaW5kZmlsZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgZG9jdGVzdAoraW1wb3J0IHN5cworCisKK2NsYXNzIFRlc3RXaXRoQXNjaWkodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X29uZV9pbnNlcnQoc2VsZik6CisgICAgICAgIHNtID0gZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgJ2InICogMTAwLCAnYScgKyAnYicgKiAxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoc20ucmF0aW8oKSwgMC45OTUsIHBsYWNlcz0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc20uZ2V0X29wY29kZXMoKSksCisgICAgICAgICAgICBbICAgKCdpbnNlcnQnLCAwLCAwLCAwLCAxKSwKKyAgICAgICAgICAgICAgICAoJ2VxdWFsJywgMCwgMTAwLCAxLCAxMDEpXSkKKyAgICAgICAgc20gPSBkaWZmbGliLlNlcXVlbmNlTWF0Y2hlcihOb25lLCAnYicgKiAxMDAsICdiJyAqIDUwICsgJ2EnICsgJ2InICogNTApCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoc20ucmF0aW8oKSwgMC45OTUsIHBsYWNlcz0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc20uZ2V0X29wY29kZXMoKSksCisgICAgICAgICAgICBbICAgKCdlcXVhbCcsIDAsIDUwLCAwLCA1MCksCisgICAgICAgICAgICAgICAgKCdpbnNlcnQnLCA1MCwgNTAsIDUwLCA1MSksCisgICAgICAgICAgICAgICAgKCdlcXVhbCcsIDUwLCAxMDAsIDUxLCAxMDEpXSkKKworICAgIGRlZiB0ZXN0X29uZV9kZWxldGUoc2VsZik6CisgICAgICAgIHNtID0gZGlmZmxpYi5TZXF1ZW5jZU1hdGNoZXIoTm9uZSwgJ2EnICogNDAgKyAnYycgKyAnYicgKiA0MCwgJ2EnICogNDAgKyAnYicgKiA0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzbS5yYXRpbygpLCAwLjk5NCwgcGxhY2VzPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzbS5nZXRfb3Bjb2RlcygpKSwKKyAgICAgICAgICAgIFsgICAoJ2VxdWFsJywgMCwgNDAsIDAsIDQwKSwKKyAgICAgICAgICAgICAgICAoJ2RlbGV0ZScsIDQwLCA0MSwgNDAsIDQwKSwKKyAgICAgICAgICAgICAgICAoJ2VxdWFsJywgNDEsIDgxLCA0MCwgODApXSkKKworCitjbGFzcyBUZXN0QXV0b2p1bmsodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciB0aGUgYXV0b2p1bmsgcGFyYW1ldGVyIGFkZGVkIGluIDIuNyIiIgorICAgIGRlZiB0ZXN0X29uZV9pbnNlcnRfaG9tb2dlbm91c19zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgIyBCeSBkZWZhdWx0IGF1dG9qdW5rPVRydWUgYW5kIHRoZSBoZXVyaXN0aWMga2lja3MgaW4gZm9yIGEgc2VxdWVuY2UKKyAgICAgICAgIyBvZiBsZW5ndGggMjAwKworICAgICAgICBzZXExID0gJ2InICogMjAwCisgICAgICAgIHNlcTIgPSAnYScgKyAnYicgKiAyMDAKKworICAgICAgICBzbSA9IGRpZmZsaWIuU2VxdWVuY2VNYXRjaGVyKE5vbmUsIHNlcTEsIHNlcTIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoc20ucmF0aW8oKSwgMCwgcGxhY2VzPTMpCisKKyAgICAgICAgIyBOb3cgdHVybiB0aGUgaGV1cmlzdGljIG9mZgorICAgICAgICBzbSA9IGRpZmZsaWIuU2VxdWVuY2VNYXRjaGVyKE5vbmUsIHNlcTEsIHNlcTIsIGF1dG9qdW5rPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHNtLnJhdGlvKCksIDAuOTk3NSwgcGxhY2VzPTMpCisKKworY2xhc3MgVGVzdFNGYnVncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmF0aW9fZm9yX251bGxfc2VxbihzZWxmKToKKyAgICAgICAgIyBDaGVjayBjbGVhcmluZyBvZiBTRiBidWcgNzYzMDIzCisgICAgICAgIHMgPSBkaWZmbGliLlNlcXVlbmNlTWF0Y2hlcihOb25lLCBbXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yYXRpbygpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucXVpY2tfcmF0aW8oKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJlYWxfcXVpY2tfcmF0aW8oKSwgMSkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmluZ19lbXB0eV9saXN0cyhzZWxmKToKKyAgICAgICAgIyBDaGVjayBmaXggZm9yIGJ1ZyAjOTc5Nzk0CisgICAgICAgIGdyb3VwX2dlbiA9IGRpZmZsaWIuU2VxdWVuY2VNYXRjaGVyKE5vbmUsIFtdLCBbXSkuZ2V0X2dyb3VwZWRfb3Bjb2RlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGdyb3VwX2dlbi5uZXh0KQorICAgICAgICBkaWZmX2dlbiA9IGRpZmZsaWIudW5pZmllZF9kaWZmKFtdLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZGlmZl9nZW4ubmV4dCkKKworICAgIGRlZiB0ZXN0X2FkZGVkX3RhYl9oaW50KHNlbGYpOgorICAgICAgICAjIENoZWNrIGZpeCBmb3IgYnVnICMxNDg4OTQzCisgICAgICAgIGRpZmYgPSBsaXN0KGRpZmZsaWIuRGlmZmVyKCkuY29tcGFyZShbIlx0SSBhbSBhIGJ1Z2d5Il0sWyJcdFx0SSBhbSBhIGJ1ZyJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiLSBcdEkgYW0gYSBidWdneSIsIGRpZmZbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIj8gICAgICAgICAgICAtLVxuIiwgZGlmZlsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiKyBcdFx0SSBhbSBhIGJ1ZyIsIGRpZmZbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIj8gK1xuIiwgZGlmZlszXSkKKworcGF0Y2g5MTQ1NzVfZnJvbTEgPSAiIiIKKyAgIDEuIEJlYXV0aWZ1bCBpcyBiZVRUZXIgdGhhbiB1Z2x5LgorICAgMi4gRXhwbGljaXQgaXMgYmV0dGVyIHRoYW4gaW1wbGljaXQuCisgICAzLiBTaW1wbGUgaXMgYmV0dGVyIHRoYW4gY29tcGxleC4KKyAgIDQuIENvbXBsZXggaXMgYmV0dGVyIHRoYW4gY29tcGxpY2F0ZWQuCisiIiIKKworcGF0Y2g5MTQ1NzVfdG8xID0gIiIiCisgICAxLiBCZWF1dGlmdWwgaXMgYmV0dGVyIHRoYW4gdWdseS4KKyAgIDMuICAgU2ltcGxlIGlzIGJldHRlciB0aGFuIGNvbXBsZXguCisgICA0LiBDb21wbGljYXRlZCBpcyBiZXR0ZXIgdGhhbiBjb21wbGV4LgorICAgNS4gRmxhdCBpcyBiZXR0ZXIgdGhhbiBuZXN0ZWQuCisiIiIKKworcGF0Y2g5MTQ1NzVfZnJvbTIgPSAiIiIKK1x0XHRMaW5lIDE6IHByZWNlZWRlZCBieSBmcm9tOlt0dF0gdG86W3Nzc3NdCisgIFx0XHRMaW5lIDI6IHByZWNlZWRlZCBieSBmcm9tOltzc3R0XSB0bzpbc3Nzc3RdCisgIFx0IFx0TGluZSAzOiBwcmVjZWVkZWQgYnkgZnJvbTpbc3N0c3RdIHRvOltzc3Nzc3NdCitMaW5lIDQ6ICBcdGhhcyBmcm9tOltzc3RdIHRvOltzc3NdIGFmdGVyIDoKK0xpbmUgNTogaGFzIGZyb206W3RdIHRvOltzc10gYXQgZW5kXHQKKyIiIgorCitwYXRjaDkxNDU3NV90bzIgPSAiIiIKKyAgICBMaW5lIDE6IHByZWNlZWRlZCBieSBmcm9tOlt0dF0gdG86W3Nzc3NdCisgICAgXHRMaW5lIDI6IHByZWNlZWRlZCBieSBmcm9tOltzc3R0XSB0bzpbc3Nzc3RdCisgICAgICBMaW5lIDM6IHByZWNlZWRlZCBieSBmcm9tOltzc3RzdF0gdG86W3Nzc3Nzc10KK0xpbmUgNDogICBoYXMgZnJvbTpbc3N0XSB0bzpbc3NzXSBhZnRlciA6CitMaW5lIDU6IGhhcyBmcm9tOlt0XSB0bzpbc3NdIGF0IGVuZAorIiIiCisKK3BhdGNoOTE0NTc1X2Zyb20zID0gIiIibGluZSAwCisxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njg5MDEyMzQ1CitsaW5lIDEKK2xpbmUgMgorbGluZSAzCitsaW5lIDQgICBjaGFuZ2VkCitsaW5lIDUgICBjaGFuZ2VkCitsaW5lIDYgICBjaGFuZ2VkCitsaW5lIDcKK2xpbmUgOCAgc3VidHJhY3RlZAorbGluZSA5CisxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njg5MDEyMzQ1CitzaG9ydCBsaW5lCitqdXN0IGZpdHMgaW4hIQoranVzdCBmaXRzIGluIHR3byBsaW5lcyB5dXAhIQordGhlIGVuZCIiIgorCitwYXRjaDkxNDU3NV90bzMgPSAiIiJsaW5lIDAKKzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2ODkwMTIzNDUKK2xpbmUgMQorbGluZSAyICAgIGFkZGVkCitsaW5lIDMKK2xpbmUgNCAgIGNoYW5HRWQKK2xpbmUgNWEgIGNoYW5HZWQKK2xpbmUgNmEgIGNoYW5nRWQKK2xpbmUgNworbGluZSA4CitsaW5lIDkKKzEyMzQ1Njc4OTAKK2Fub3RoZXIgbG9uZyBsaW5lIHRoYXQgbmVlZHMgdG8gYmUgd3JhcHBlZAoranVzdCBmaXRTIGluISEKK2p1c3QgZml0cyBpbiB0d28gbGluZVMgeXVwISEKK3RoZSBlbmQiIiIKKworY2xhc3MgVGVzdFNGcGF0Y2hlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9odG1sX2RpZmYoc2VsZik6CisgICAgICAgICMgQ2hlY2sgU0YgcGF0Y2ggOTE0NTc1IGZvciBnZW5lcmF0aW5nIEhUTUwgZGlmZmVyZW5jZXMKKyAgICAgICAgZjFhID0gKChwYXRjaDkxNDU3NV9mcm9tMSArICcxMjNcbicqMTApKjMpCisgICAgICAgIHQxYSA9IChwYXRjaDkxNDU3NV90bzEgKyAnMTIzXG4nKjEwKSozCisgICAgICAgIGYxYiA9ICc0NTZcbicqMTAgKyBmMWEKKyAgICAgICAgdDFiID0gJzQ1NlxuJyoxMCArIHQxYQorICAgICAgICBmMWEgPSBmMWEuc3BsaXRsaW5lcygpCisgICAgICAgIHQxYSA9IHQxYS5zcGxpdGxpbmVzKCkKKyAgICAgICAgZjFiID0gZjFiLnNwbGl0bGluZXMoKQorICAgICAgICB0MWIgPSB0MWIuc3BsaXRsaW5lcygpCisgICAgICAgIGYyID0gcGF0Y2g5MTQ1NzVfZnJvbTIuc3BsaXRsaW5lcygpCisgICAgICAgIHQyID0gcGF0Y2g5MTQ1NzVfdG8yLnNwbGl0bGluZXMoKQorICAgICAgICBmMyA9IHBhdGNoOTE0NTc1X2Zyb20zCisgICAgICAgIHQzID0gcGF0Y2g5MTQ1NzVfdG8zCisgICAgICAgIGkgPSBkaWZmbGliLkh0bWxEaWZmKCkKKyAgICAgICAgaiA9IGRpZmZsaWIuSHRtbERpZmYodGFic2l6ZT0yKQorICAgICAgICBrID0gZGlmZmxpYi5IdG1sRGlmZih3cmFwY29sdW1uPTE0KQorCisgICAgICAgIGZ1bGwgPSBpLm1ha2VfZmlsZShmMWEsdDFhLCdmcm9tJywndG8nLGNvbnRleHQ9RmFsc2UsbnVtbGluZXM9NSkKKyAgICAgICAgdGFibGVzID0gJ1xuJy5qb2luKAorICAgICAgICAgICAgWworICAgICAgICAgICAgICc8aDI+Q29udGV4dCAoZmlyc3QgZGlmZiB3aXRoaW4gbnVtbGluZXM9NShkZWZhdWx0KSk8L2gyPicsCisgICAgICAgICAgICAgaS5tYWtlX3RhYmxlKGYxYSx0MWEsJ2Zyb20nLCd0bycsY29udGV4dD1UcnVlKSwKKyAgICAgICAgICAgICAnPGgyPkNvbnRleHQgKGZpcnN0IGRpZmYgYWZ0ZXIgbnVtbGluZXM9NShkZWZhdWx0KSk8L2gyPicsCisgICAgICAgICAgICAgaS5tYWtlX3RhYmxlKGYxYix0MWIsJ2Zyb20nLCd0bycsY29udGV4dD1UcnVlKSwKKyAgICAgICAgICAgICAnPGgyPkNvbnRleHQgKG51bWxpbmVzPTYpPC9oMj4nLAorICAgICAgICAgICAgIGkubWFrZV90YWJsZShmMWEsdDFhLCdmcm9tJywndG8nLGNvbnRleHQ9VHJ1ZSxudW1saW5lcz02KSwKKyAgICAgICAgICAgICAnPGgyPkNvbnRleHQgKG51bWxpbmVzPTApPC9oMj4nLAorICAgICAgICAgICAgIGkubWFrZV90YWJsZShmMWEsdDFhLCdmcm9tJywndG8nLGNvbnRleHQ9VHJ1ZSxudW1saW5lcz0wKSwKKyAgICAgICAgICAgICAnPGgyPlNhbWUgQ29udGV4dDwvaDI+JywKKyAgICAgICAgICAgICBpLm1ha2VfdGFibGUoZjFhLGYxYSwnZnJvbScsJ3RvJyxjb250ZXh0PVRydWUpLAorICAgICAgICAgICAgICc8aDI+U2FtZSBGdWxsPC9oMj4nLAorICAgICAgICAgICAgIGkubWFrZV90YWJsZShmMWEsZjFhLCdmcm9tJywndG8nLGNvbnRleHQ9RmFsc2UpLAorICAgICAgICAgICAgICc8aDI+RW1wdHkgQ29udGV4dDwvaDI+JywKKyAgICAgICAgICAgICBpLm1ha2VfdGFibGUoW10sW10sJ2Zyb20nLCd0bycsY29udGV4dD1UcnVlKSwKKyAgICAgICAgICAgICAnPGgyPkVtcHR5IEZ1bGw8L2gyPicsCisgICAgICAgICAgICAgaS5tYWtlX3RhYmxlKFtdLFtdLCdmcm9tJywndG8nLGNvbnRleHQ9RmFsc2UpLAorICAgICAgICAgICAgICc8aDI+dGFic2l6ZT0yPC9oMj4nLAorICAgICAgICAgICAgIGoubWFrZV90YWJsZShmMix0MiksCisgICAgICAgICAgICAgJzxoMj50YWJzaXplPWRlZmF1bHQ8L2gyPicsCisgICAgICAgICAgICAgaS5tYWtlX3RhYmxlKGYyLHQyKSwKKyAgICAgICAgICAgICAnPGgyPkNvbnRleHQgKHdyYXBjb2x1bW49MTQsbnVtbGluZXM9MCk8L2gyPicsCisgICAgICAgICAgICAgay5tYWtlX3RhYmxlKGYzLnNwbGl0bGluZXMoKSx0My5zcGxpdGxpbmVzKCksY29udGV4dD1UcnVlLG51bWxpbmVzPTApLAorICAgICAgICAgICAgICc8aDI+d3JhcGNvbHVtbj0xNCxzcGxpdGxpbmVzKCk8L2gyPicsCisgICAgICAgICAgICAgay5tYWtlX3RhYmxlKGYzLnNwbGl0bGluZXMoKSx0My5zcGxpdGxpbmVzKCkpLAorICAgICAgICAgICAgICc8aDI+d3JhcGNvbHVtbj0xNCxzcGxpdGxpbmVzKFRydWUpPC9oMj4nLAorICAgICAgICAgICAgIGsubWFrZV90YWJsZShmMy5zcGxpdGxpbmVzKFRydWUpLHQzLnNwbGl0bGluZXMoVHJ1ZSkpLAorICAgICAgICAgICAgIF0pCisgICAgICAgIGFjdHVhbCA9IGZ1bGwucmVwbGFjZSgnPC9ib2R5PicsJ1xuJXNcbjwvYm9keT4nICUgdGFibGVzKQorCisgICAgICAgICMgdGVtcG9yYXJpbHkgdW5jb21tZW50IG5leHQgdHdvIGxpbmVzIHRvIGJhc2VsaW5lIHRoaXMgdGVzdAorICAgICAgICAjd2l0aCBvcGVuKCd0ZXN0X2RpZmZsaWJfZXhwZWN0Lmh0bWwnLCd3JykgYXMgZnA6CisgICAgICAgICMgICAgZnAud3JpdGUoYWN0dWFsKQorCisgICAgICAgIHdpdGggb3BlbihmaW5kZmlsZSgndGVzdF9kaWZmbGliX2V4cGVjdC5odG1sJykpIGFzIGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGZwLnJlYWQoKSkKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2lvbl9saW1pdChzZWxmKToKKyAgICAgICAgIyBDaGVjayBpZiB0aGUgcHJvYmxlbSBkZXNjcmliZWQgaW4gcGF0Y2ggIzE0MTM3MTEgZXhpc3RzLgorICAgICAgICBsaW1pdCA9IHN5cy5nZXRyZWN1cnNpb25saW1pdCgpCisgICAgICAgIG9sZCA9IFsoaSUyIGFuZCAiSzolZCIgb3IgIlY6QTolZCIpICUgaSBmb3IgaSBpbiByYW5nZShsaW1pdCoyKV0KKyAgICAgICAgbmV3ID0gWyhpJTIgYW5kICJLOiVkIiBvciAiVjpCOiVkIikgJSBpIGZvciBpIGluIHJhbmdlKGxpbWl0KjIpXQorICAgICAgICBkaWZmbGliLlNlcXVlbmNlTWF0Y2hlcihOb25lLCBvbGQsIG5ldykuZ2V0X29wY29kZXMoKQorCisKK2NsYXNzIFRlc3RPdXRwdXRGb3JtYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3RhYl9kZWxpbWl0ZXIoc2VsZik6CisgICAgICAgIGFyZ3MgPSBbJ29uZScsICd0d28nLCAnT3JpZ2luYWwnLCAnQ3VycmVudCcsCisgICAgICAgICAgICAnMjAwNS0wMS0yNiAyMzozMDo1MCcsICcyMDEwLTA0LTAyIDEwOjIwOjUyJ10KKyAgICAgICAgdWQgPSBkaWZmbGliLnVuaWZpZWRfZGlmZigqYXJncywgbGluZXRlcm09JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh1ZClbMDoyXSwgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tLSBPcmlnaW5hbFx0MjAwNS0wMS0yNiAyMzozMDo1MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiKysrIEN1cnJlbnRcdDIwMTAtMDQtMDIgMTA6MjA6NTIiXSkKKyAgICAgICAgY2QgPSBkaWZmbGliLmNvbnRleHRfZGlmZigqYXJncywgbGluZXRlcm09JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjZClbMDoyXSwgWworICAgICAgICAgICAgICAgICAgICAgICAgICAgIioqKiBPcmlnaW5hbFx0MjAwNS0wMS0yNiAyMzozMDo1MCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS0tIEN1cnJlbnRcdDIwMTAtMDQtMDIgMTA6MjA6NTIiXSkKKworICAgIGRlZiB0ZXN0X25vX3RyYWlsaW5nX3RhYl9vbl9lbXB0eV9maWxlZGF0ZShzZWxmKToKKyAgICAgICAgYXJncyA9IFsnb25lJywgJ3R3bycsICdPcmlnaW5hbCcsICdDdXJyZW50J10KKyAgICAgICAgdWQgPSBkaWZmbGliLnVuaWZpZWRfZGlmZigqYXJncywgbGluZXRlcm09JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh1ZClbMDoyXSwgWyItLS0gT3JpZ2luYWwiLCAiKysrIEN1cnJlbnQiXSkKKworICAgICAgICBjZCA9IGRpZmZsaWIuY29udGV4dF9kaWZmKCphcmdzLCBsaW5ldGVybT0nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNkKVswOjJdLCBbIioqKiBPcmlnaW5hbCIsICItLS0gQ3VycmVudCJdKQorCisgICAgZGVmIHRlc3RfcmFuZ2VfZm9ybWF0X3VuaWZpZWQoc2VsZik6CisgICAgICAgICMgUGVyIHRoZSBkaWZmIHNwZWMgYXQgaHR0cDovL3d3dy51bml4Lm9yZy9zaW5nbGVfdW5peF9zcGVjaWZpY2F0aW9uLworICAgICAgICBzcGVjID0gJycnXAorICAgICAgICAgICBFYWNoIDxyYW5nZT4gZmllbGQgc2hhbGwgYmUgb2YgdGhlIGZvcm06CisgICAgICAgICAgICAgJTFkIiwgPGJlZ2lubmluZyBsaW5lIG51bWJlcj4gIGlmIHRoZSByYW5nZSBjb250YWlucyBleGFjdGx5IG9uZSBsaW5lLAorICAgICAgICAgICBhbmQ6CisgICAgICAgICAgICAiJTFkLCUxZCIsIDxiZWdpbm5pbmcgbGluZSBudW1iZXI+LCA8bnVtYmVyIG9mIGxpbmVzPiBvdGhlcndpc2UuCisgICAgICAgICAgIElmIGEgcmFuZ2UgaXMgZW1wdHksIGl0cyBiZWdpbm5pbmcgbGluZSBudW1iZXIgc2hhbGwgYmUgdGhlIG51bWJlciBvZgorICAgICAgICAgICB0aGUgbGluZSBqdXN0IGJlZm9yZSB0aGUgcmFuZ2UsIG9yIDAgaWYgdGhlIGVtcHR5IHJhbmdlIHN0YXJ0cyB0aGUgZmlsZS4KKyAgICAgICAgJycnCisgICAgICAgIGZtdCA9IGRpZmZsaWIuX2Zvcm1hdF9yYW5nZV91bmlmaWVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10KDMsMyksICczLDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCgzLDQpLCAnNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10KDMsNSksICc0LDInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCgzLDYpLCAnNCwzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQoMCwwKSwgJzAsMCcpCisKKyAgICBkZWYgdGVzdF9yYW5nZV9mb3JtYXRfY29udGV4dChzZWxmKToKKyAgICAgICAgIyBQZXIgdGhlIGRpZmYgc3BlYyBhdCBodHRwOi8vd3d3LnVuaXgub3JnL3NpbmdsZV91bml4X3NwZWNpZmljYXRpb24vCisgICAgICAgIHNwZWMgPSAnJydcCisgICAgICAgICAgIFRoZSByYW5nZSBvZiBsaW5lcyBpbiBmaWxlMSBzaGFsbCBiZSB3cml0dGVuIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0CisgICAgICAgICAgIGlmIHRoZSByYW5nZSBjb250YWlucyB0d28gb3IgbW9yZSBsaW5lczoKKyAgICAgICAgICAgICAgICIqKiogJWQsJWQgKioqKlxuIiwgPGJlZ2lubmluZyBsaW5lIG51bWJlcj4sIDxlbmRpbmcgbGluZSBudW1iZXI+CisgICAgICAgICAgIGFuZCB0aGUgZm9sbG93aW5nIGZvcm1hdCBvdGhlcndpc2U6CisgICAgICAgICAgICAgICAiKioqICVkICoqKipcbiIsIDxlbmRpbmcgbGluZSBudW1iZXI+CisgICAgICAgICAgIFRoZSBlbmRpbmcgbGluZSBudW1iZXIgb2YgYW4gZW1wdHkgcmFuZ2Ugc2hhbGwgYmUgdGhlIG51bWJlciBvZiB0aGUgcHJlY2VkaW5nIGxpbmUsCisgICAgICAgICAgIG9yIDAgaWYgdGhlIHJhbmdlIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KKworICAgICAgICAgICBOZXh0LCB0aGUgcmFuZ2Ugb2YgbGluZXMgaW4gZmlsZTIgc2hhbGwgYmUgd3JpdHRlbiBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdAorICAgICAgICAgICBpZiB0aGUgcmFuZ2UgY29udGFpbnMgdHdvIG9yIG1vcmUgbGluZXM6CisgICAgICAgICAgICAgICAiLS0tICVkLCVkIC0tLS1cbiIsIDxiZWdpbm5pbmcgbGluZSBudW1iZXI+LCA8ZW5kaW5nIGxpbmUgbnVtYmVyPgorICAgICAgICAgICBhbmQgdGhlIGZvbGxvd2luZyBmb3JtYXQgb3RoZXJ3aXNlOgorICAgICAgICAgICAgICAgIi0tLSAlZCAtLS0tXG4iLCA8ZW5kaW5nIGxpbmUgbnVtYmVyPgorICAgICAgICAnJycKKyAgICAgICAgZm10ID0gZGlmZmxpYi5fZm9ybWF0X3JhbmdlX2NvbnRleHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQoMywzKSwgJzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCgzLDQpLCAnNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10KDMsNSksICc0LDUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCgzLDYpLCAnNCw2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQoMCwwKSwgJzAnKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBkaWZmbGliLkh0bWxEaWZmLl9kZWZhdWx0X3ByZWZpeCA9IDAKKyAgICBEb2N0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKGRpZmZsaWIpCisgICAgcnVuX3VuaXR0ZXN0KAorICAgICAgICBUZXN0V2l0aEFzY2lpLCBUZXN0QXV0b2p1bmssIFRlc3RTRnBhdGNoZXMsIFRlc3RTRmJ1Z3MsCisgICAgICAgIFRlc3RPdXRwdXRGb3JtYXQsIERvY3Rlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0M2IzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpZmZsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0M2IzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaWZmbGliX2V4cGVjdC5odG1sIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlmZmxpYl9leHBlY3QuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWI2ZDdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlmZmxpYl9leHBlY3QuaHRtbApAQCAtMCwwICsxLDUyNiBAQAorCis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIgorICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KKworPGh0bWw+CisKKzxoZWFkPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIKKyAgICAgICAgICBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KKyAgICA8dGl0bGU+PC90aXRsZT4KKyAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgorICAgICAgICB0YWJsZS5kaWZmIHtmb250LWZhbWlseTpDb3VyaWVyOyBib3JkZXI6bWVkaXVtO30KKyAgICAgICAgLmRpZmZfaGVhZGVyIHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTB9CisgICAgICAgIHRkLmRpZmZfaGVhZGVyIHt0ZXh0LWFsaWduOnJpZ2h0fQorICAgICAgICAuZGlmZl9uZXh0IHtiYWNrZ3JvdW5kLWNvbG9yOiNjMGMwYzB9CisgICAgICAgIC5kaWZmX2FkZCB7YmFja2dyb3VuZC1jb2xvcjojYWFmZmFhfQorICAgICAgICAuZGlmZl9jaGcge2JhY2tncm91bmQtY29sb3I6I2ZmZmY3N30KKyAgICAgICAgLmRpZmZfc3ViIHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmFhYWF9CisgICAgPC9zdHlsZT4KKzwvaGVhZD4KKworPGJvZHk+CisgICAgCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG8wX190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8dGhlYWQ+PHRyPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPmZyb208L3RoPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPnRvPC90aD48L3RyPjwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMF9fMCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMF9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzBfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8wX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzBfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8wX18xIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTYiPjE2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMF9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xNyI+MTc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzBfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTgiPjE4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8yMSI+MjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzIxIj4yMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzIyIj4yMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMjMiPjIzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8yNCI+MjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzI1Ij4yNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMjYiPjI2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8yNiI+MjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8wX18yIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8yNyI+Mjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzI3Ij4yNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMjgiPjI4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMjkiPjI5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzMwIj4zMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzMxIj4zMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMF9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMF9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8zMiI+MzI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMzYiPjM2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8zNiI+MzY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF8zNyI+Mzc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzM4Ij4zODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfMzkiPjM5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF8zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF80MCI+NDA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzQxIj40MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfNDEiPjQxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfNDIiPjQyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF80MiI+NDI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMF80MyI+NDM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8wXzQzIj40MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20wXzQ0Ij40NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzBfNDQiPjQ0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTBfNDUiPjQ1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMF80NSI+NDU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+CisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBzdW1tYXJ5PSJMZWdlbmRzIj4KKyAgICAgICAgPHRyPiA8dGggY29sc3Bhbj0iMiI+IExlZ2VuZHMgPC90aD4gPC90cj4KKyAgICAgICAgPHRyPiA8dGQ+IDx0YWJsZSBib3JkZXI9IiIgc3VtbWFyeT0iQ29sb3JzIj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRoPiBDb2xvcnMgPC90aD4gPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7QWRkZWQmbmJzcDs8L3RkPjwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9jaGciPkNoYW5nZWQ8L3RkPiA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfc3ViIj5EZWxldGVkPC90ZD4gPC90cj4KKyAgICAgICAgICAgICAgICAgIDwvdGFibGU+PC90ZD4KKyAgICAgICAgICAgICA8dGQ+IDx0YWJsZSBib3JkZXI9IiIgc3VtbWFyeT0iTGlua3MiPgorICAgICAgICAgICAgICAgICAgICAgIDx0cj48dGggY29sc3Bhbj0iMiI+IExpbmtzIDwvdGg+IDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD4oZilpcnN0IGNoYW5nZTwvdGQ+IDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgPHRyPjx0ZD4obilleHQgY2hhbmdlPC90ZD4gPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICA8dHI+PHRkPih0KW9wPC90ZD4gPC90cj4KKyAgICAgICAgICAgICAgICAgIDwvdGFibGU+PC90ZD4gPC90cj4KKyAgICA8L3RhYmxlPgorCis8aDI+Q29udGV4dCAoZmlyc3QgZGlmZiB3aXRoaW4gbnVtbGluZXM9NShkZWZhdWx0KSk8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG8xX190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8dGhlYWQ+PHRyPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPmZyb208L3RoPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPnRvPC90aD48L3RyPjwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMV9fMCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMV9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzFfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzFfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4gICAgICAgIAorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzFfXzEiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMTYiPjE2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMV9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzE4Ij4xODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzIxIj4yMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMjEiPjIxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8yMiI+MjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzIzIj4yMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMjQiPjI0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8yNSI+MjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMV9fMiI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMjciPjI3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8yNyI+Mjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8yOCI+Mjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzI5Ij4yOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMjkiPjI5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMzAiPjMwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zMSI+MzE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzMxIj4zMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzFfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zMiI+MzI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzFfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMzIiPjMyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zNCI+MzQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zMyI+MzM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMzUiPjM1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zNCI+MzQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMzUiPjM1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzM2Ij4zNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMzYiPjM2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfMzciPjM3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV8zNyI+Mzc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMV8zOCI+Mzg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xXzM4Ij4zODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xXzM5Ij4zOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzFfMzkiPjM5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTFfNDAiPjQwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMV80MCI+NDA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8aDI+Q29udGV4dCAoZmlyc3QgZGlmZiBhZnRlciBudW1saW5lcz01KGRlZmF1bHQpKTwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzJfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDx0aGVhZD48dHI+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+ZnJvbTwvdGg+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+dG88L3RoPjwvdHI+PC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8yX18wIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl83Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjQ1NjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl83Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjQ1NjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfOCI+ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj40NTY8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfOCI+ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj40NTY8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzkiPjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+NDU2PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzkiPjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+NDU2PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+NDU2PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj40NTY8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzExIj4xMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMl9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzJfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMTciPjE3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMTgiPjE4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8xOSI+MTk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzE5Ij4xOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4gICAgICAgIAorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzJfXzEiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzIyIj4yMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMjMiPjIzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8yNCI+MjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzI1Ij4yNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMjYiPjI2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yNiI+MjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8yX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzI3Ij4yNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMl9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMjciPjI3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yOCI+Mjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMzAiPjMwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMzAiPjMwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzMxIj4zMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMzIiPjMyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8zMiI+MzI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8zMyI+MzM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMzUiPjM1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMl9fMiI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfMzciPjM3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl8zNyI+Mzc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl8zOCI+Mzg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzM4Ij4zODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzM5Ij4zOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfMzkiPjM5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfNDAiPjQwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80MCI+NDA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl80MSI+NDE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzQxIj40MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzJfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl80MiI+NDI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzJfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfNDIiPjQyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzEuJm5ic3A7QmVhdXRpZnVsJm5ic3A7aXMmbmJzcDtiZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+dHQ8L3NwYW4+ZXImbmJzcDt0aGFuJm5ic3A7dWdseS48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzQzIj40MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl80NCI+NDQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80MyI+NDM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOzwvc3Bhbj4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfNDUiPjQ1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80NCI+NDQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfNDUiPjQ1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4mbmJzcDtGbGF0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7bmVzdGVkLjwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzQ2Ij40NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfNDYiPjQ2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfNDciPjQ3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl80NyI+NDc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMl80OCI+NDg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8yXzQ4Ij40ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20yXzQ5Ij40OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzJfNDkiPjQ5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTJfNTAiPjUwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMl81MCI+NTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8aDI+Q29udGV4dCAobnVtbGluZXM9Nik8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG8zX190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8dGhlYWQ+PHRyPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPmZyb208L3RoPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPnRvPC90aD48L3RyPjwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvM19fMCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvM19fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzNfXzAiPmY8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8zX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzNfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzIuJm5ic3A7RXhwbGljaXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtpbXBsaWNpdC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM180Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM181Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGV4Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxpY2F0ZWQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM180Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfNiI+NjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM184Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM184Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvM19fMSI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18xMSI+MTE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18xNCI+MTQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTYiPjE2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvM19fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xNyI+MTc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzNfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTgiPjE4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18yMSI+MjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzIxIj4yMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzIyIj4yMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMjIiPjIyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMjMiPjIzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18yMyI+MjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18yNCI+MjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzI0Ij4yNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzI1Ij4yNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMjUiPjI1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvM19fMiI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMjYiPjI2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18yNiI+MjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18yNyI+Mjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzI3Ij4yNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMjgiPjI4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMjkiPjI5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18yOSI+Mjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzMwIj4zMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzMxIj4zMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMzEiPjMxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvM19fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvM19fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18zMiI+MzI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMzYiPjM2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18zNiI+MzY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM18zNyI+Mzc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzM4Ij4zODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTNfMzkiPjM5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvM18zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tM180MCI+NDA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8zXzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20zXzQxIj40MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzNfNDEiPjQxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPkNvbnRleHQgKG51bWxpbmVzPTApPC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvNF9fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPHRoZWFkPjx0cj48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj5mcm9tPC90aD48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj50bzwvdGg+PC90cj48L3RoZWFkPgorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzRfXzAiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzRfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNF9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNF8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsaWNhdGVkJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvNF9fMSI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNF9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNF8xNyI+MTc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5UVDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzRfXzIiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnR0PC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNF8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfMTgiPjE4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuPHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzRfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4mbmJzcDtDb21wbGljYXRlZCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzUuJm5ic3A7RmxhdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO25lc3RlZC48L3NwYW4+PC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvNF9fMiI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNF9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlRUPC9zcGFuPmVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNF9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNF8zMiI+MzI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj50dDwvc3Bhbj5lciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTRfMzMiPjMzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0Ljwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb200XzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzMzIj4zMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNF8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG80XzM0Ij4zNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxpY2F0ZWQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4Ljwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNF8zNSI+MzU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4mbmJzcDsmbmJzcDsmbmJzcDs1LiZuYnNwO0ZsYXQmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtuZXN0ZWQuPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPlNhbWUgQ29udGV4dDwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzVfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDx0aGVhZD48dHI+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+ZnJvbTwvdGg+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+dG88L3RoPjwvdHI+PC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG81X190b3AiPnQ8L2E+PC90ZD48dGQ+PC90ZD48dGQ+Jm5ic3A7Tm8gRGlmZmVyZW5jZXMgRm91bmQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG81X190b3AiPnQ8L2E+PC90ZD48dGQ+PC90ZD48dGQ+Jm5ic3A7Tm8gRGlmZmVyZW5jZXMgRm91bmQmbmJzcDs8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj5TYW1lIEZ1bGw8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG82X190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8dGhlYWQ+PHRyPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPmZyb208L3RoPjx0aCBjbGFzcz0iZGlmZl9uZXh0Ij48YnIgLz48L3RoPjx0aCBjb2xzcGFuPSIyIiBjbGFzcz0iZGlmZl9oZWFkZXIiPnRvPC90aD48L3RyPjwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNl9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvNl9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmVUVGVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4mbmJzcDtCZWF1dGlmdWwmbmJzcDtpcyZuYnNwO2JlVFRlciZuYnNwO3RoYW4mbmJzcDt1Z2x5LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsyLiZuYnNwO0V4cGxpY2l0Jm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7aW1wbGljaXQuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDszLiZuYnNwO1NpbXBsZSZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsZXguPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7My4mbmJzcDtTaW1wbGUmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGV4LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfNSI+NTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl83Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl83Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfOCI+ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfOCI+ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzkiPjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzkiPjk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzExIj4xMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8xMyI+MTM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzE2Ij4xNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmVUVGVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzE3Ij4xNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmVUVGVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8xOCI+MTg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMTkiPjE5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzIwIj4yMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMjAiPjIwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMjEiPjIxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8yMSI+MjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8yMiI+MjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzIyIj4yMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzIzIj4yMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMjMiPjIzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMjQiPjI0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8yNCI+MjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8yNSI+MjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzI1Ij4yNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzI2Ij4yNjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMjYiPjI2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMjciPjI3PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8yNyI+Mjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8yOCI+Mjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzI4Ij4yODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzI5Ij4yOTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMjkiPjI5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMzAiPjMwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8zMCI+MzA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zMSI+MzE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzMxIj4zMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmVUVGVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzMyIj4zMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDsxLiZuYnNwO0JlYXV0aWZ1bCZuYnNwO2lzJm5ic3A7YmVUVGVyJm5ic3A7dGhhbiZuYnNwO3VnbHkuPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zMyI+MzM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0LjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8zMyI+MzM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4mbmJzcDtFeHBsaWNpdCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2ltcGxpY2l0LjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMzQiPjM0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzMuJm5ic3A7U2ltcGxlJm5ic3A7aXMmbmJzcDtiZXR0ZXImbmJzcDt0aGFuJm5ic3A7Y29tcGxleC48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzM1Ij4zNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDsmbmJzcDsmbmJzcDs0LiZuYnNwO0NvbXBsZXgmbmJzcDtpcyZuYnNwO2JldHRlciZuYnNwO3RoYW4mbmJzcDtjb21wbGljYXRlZC48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMzUiPjM1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOyZuYnNwOzQuJm5ic3A7Q29tcGxleCZuYnNwO2lzJm5ic3A7YmV0dGVyJm5ic3A7dGhhbiZuYnNwO2NvbXBsaWNhdGVkLjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMzYiPjM2PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8zNiI+MzY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl8zNyI+Mzc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzM3Ij4zNzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzM4Ij4zODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfMzgiPjM4PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfMzkiPjM5PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl8zOSI+Mzk8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl80MCI+NDA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzQwIj40MDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzQxIj40MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfNDEiPjQxPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfNDIiPjQyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl80MiI+NDI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tNl80MyI+NDM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG82XzQzIj40MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb202XzQ0Ij40NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4xMjM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzZfNDQiPjQ0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTZfNDUiPjQ1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjEyMzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvNl80NSI+NDU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8aDI+RW1wdHkgQ29udGV4dDwvaDI+CisKKyAgICA8dGFibGUgY2xhc3M9ImRpZmYiIGlkPSJkaWZmbGliX2NoZ190bzdfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDx0aGVhZD48dHI+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+ZnJvbTwvdGg+PHRoIGNsYXNzPSJkaWZmX25leHQiPjxiciAvPjwvdGg+PHRoIGNvbHNwYW49IjIiIGNsYXNzPSJkaWZmX2hlYWRlciI+dG88L3RoPjwvdHI+PC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG83X190b3AiPnQ8L2E+PC90ZD48dGQ+PC90ZD48dGQ+Jm5ic3A7Tm8gRGlmZmVyZW5jZXMgRm91bmQmbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG83X190b3AiPnQ8L2E+PC90ZD48dGQ+PC90ZD48dGQ+Jm5ic3A7Tm8gRGlmZmVyZW5jZXMgRm91bmQmbmJzcDs8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj5FbXB0eSBGdWxsPC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvOF9fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPHRoZWFkPjx0cj48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj5mcm9tPC90aD48dGggY2xhc3M9ImRpZmZfbmV4dCI+PGJyIC8+PC90aD48dGggY29sc3Bhbj0iMiIgY2xhc3M9ImRpZmZfaGVhZGVyIj50bzwvdGg+PC90cj48L3RoZWFkPgorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzhfX3RvcCI+dDwvYT48L3RkPjx0ZD48L3RkPjx0ZD4mbmJzcDtFbXB0eSBGaWxlJm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOF9fdG9wIj50PC9hPjwvdGQ+PHRkPjwvdGQ+PHRkPiZuYnNwO0VtcHR5IEZpbGUmbmJzcDs8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj50YWJzaXplPTI8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG85X190b3AiCisgICAgICAgICAgIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgcnVsZXM9Imdyb3VwcyIgPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPgorICAgICAgICAKKyAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG85X18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG85X18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzEiPjE8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOV9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzlfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzlfX3RvcCI+dDwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbdHRdJm5ic3A7dG86W3Nzc3NdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvOV9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV8yIj4yPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDsxOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbdHRdJm5ic3A7dG86W3Nzc3NdPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV8zIj4zPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO0xpbmUmbmJzcDsyOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0dF0mbmJzcDt0bzpbc3Nzc3RdPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3RzdF0mbmJzcDt0bzpbc3Nzc3NzXTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvOV80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0c3RdJm5ic3A7dG86W3Nzc3Nzc108L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb205XzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzQ6Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDs8L3NwYW4+aGFzJm5ic3A7ZnJvbTpbc3N0XSZuYnNwO3RvOltzc3NdJm5ic3A7YWZ0ZXImbmJzcDs6PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzQ6Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDs8L3NwYW4+aGFzJm5ic3A7ZnJvbTpbc3N0XSZuYnNwO3RvOltzc3NdJm5ic3A7YWZ0ZXImbmJzcDs6PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tOV82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs1OiZuYnNwO2hhcyZuYnNwO2Zyb206W3RdJm5ic3A7dG86W3NzXSZuYnNwO2F0Jm5ic3A7ZW5kPHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4mbmJzcDs8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG85XzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj50YWJzaXplPWRlZmF1bHQ8L2gyPgorCisgICAgPHRhYmxlIGNsYXNzPSJkaWZmIiBpZD0iZGlmZmxpYl9jaGdfdG8xMF9fdG9wIgorICAgICAgICAgICBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHJ1bGVzPSJncm91cHMiID4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgPGNvbGdyb3VwPjwvY29sZ3JvdXA+IDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4KKyAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTBfXzAiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF8xIj4xPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTBfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEwX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzE6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOlt0dF0mbmJzcDt0bzpbc3Nzc108L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMF9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTBfMiI+MjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj5MaW5lJm5ic3A7MTombmJzcDtwcmVjZWVkZWQmbmJzcDtieSZuYnNwO2Zyb206W3R0XSZuYnNwO3RvOltzc3NzXTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzMiPjM8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7TGluZSZuYnNwOzI6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3R0XSZuYnNwO3RvOltzc3NzdF08L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMF80Ij40PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPkxpbmUmbmJzcDszOiZuYnNwO3ByZWNlZWRlZCZuYnNwO2J5Jm5ic3A7ZnJvbTpbc3N0c3RdJm5ic3A7dG86W3Nzc3Nzc108L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+TGluZSZuYnNwOzM6Jm5ic3A7cHJlY2VlZGVkJm5ic3A7YnkmbmJzcDtmcm9tOltzc3RzdF0mbmJzcDt0bzpbc3Nzc3NzXTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzQ6Jm5ic3A7Jm5ic3A7PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3NwYW4+aGFzJm5ic3A7ZnJvbTpbc3N0XSZuYnNwO3RvOltzc3NdJm5ic3A7YWZ0ZXImbmJzcDs6PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMF81Ij41PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPkxpbmUmbmJzcDs0OiZuYnNwOyZuYnNwOzxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPmhhcyZuYnNwO2Zyb206W3NzdF0mbmJzcDt0bzpbc3NzXSZuYnNwO2FmdGVyJm5ic3A7OjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEwXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8c3BhbiBjbGFzcz0iZGlmZl9zdWIiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEwXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+TGluZSZuYnNwOzU6Jm5ic3A7aGFzJm5ic3A7ZnJvbTpbdF0mbmJzcDt0bzpbc3NdJm5ic3A7YXQmbmJzcDtlbmQ8L3RkPjwvdHI+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90YWJsZT4KKzxoMj5Db250ZXh0ICh3cmFwY29sdW1uPTE0LG51bWxpbmVzPTApPC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvMTFfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIAorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzExX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMV9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTFfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmxpbmUmbmJzcDsyPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzExX18xIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTFfNCI+NDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmxpbmUmbmJzcDsyJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7YWRkZTwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmQ8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTFfXzEiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzExX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMV82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs0Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2hhbjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Zzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMV9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzExXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzQmbmJzcDsmbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5HPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+ZTwvc3Bhbj5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+RTwvc3Bhbj5kPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTFfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPmc8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMV83Ij43PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs1PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5hPC9zcGFuPiZuYnNwOyZuYnNwO2NoYW48c3BhbiBjbGFzcz0iZGlmZl9jaGciPkc8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj48L3NwYW4+ZWQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj48L3NwYW4+ZWQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMV84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs2PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj4mbmJzcDs8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbmc8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzExXzgiPjg8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzY8c3BhbiBjbGFzcz0iZGlmZl9jaGciPmE8L3NwYW4+Jm5ic3A7Jm5ic3A7Y2hhbmc8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPmU8L3NwYW4+ZDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9jaGciPkU8L3NwYW4+ZDwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4gICAgICAgIAorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzExX18yIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMV9fMyI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTFfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+bGluZSZuYnNwOzgmbmJzcDsmbmJzcDtzdWJ0cmE8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTFfXzMiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMV8xMCI+MTA8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5saW5lJm5ic3A7ODwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmN0ZWQ8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PiAgICAgICAgCisgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTFfXzMiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzExX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTExXzEyIj4xMjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPjEyMzQ1Njc4OTAxMjM0PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzExX190b3AiPnQ8L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMV8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj4xMjM0NTY3ODkwPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+NTY3ODkwMTIzNDU2ODk8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4wMTIzNDU8L3NwYW4+PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTFfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+c2hvcnQmbmJzcDtsaW5lPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTFfMTMiPjEzPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+YW5vdGhlciZuYnNwO2xvbmcmbmJzcDtsPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+aW5lJm5ic3A7dGhhdCZuYnNwO25lZWRzPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+Jm5ic3A7dG8mbmJzcDtiZSZuYnNwO3dyYXBwZWQ8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTFfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXQ8c3BhbiBjbGFzcz0iZGlmZl9jaGciPnM8L3NwYW4+Jm5ic3A7aW4hITwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTFfMTQiPjE0PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXQ8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlM8L3NwYW4+Jm5ic3A7aW4hITwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTExXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0cyZuYnNwO2luJm5ic3A7dDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTFfMTUiPjE1PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmp1c3QmbmJzcDtmaXRzJm5ic3A7aW4mbmJzcDt0PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+d28mbmJzcDtsaW5lPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5zPC9zcGFuPiZuYnNwO3l1cCEhPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPndvJm5ic3A7bGluZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Uzwvc3Bhbj4mbmJzcDt5dXAhITwvdGQ+PC90cj4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3RhYmxlPgorPGgyPndyYXBjb2x1bW49MTQsc3BsaXRsaW5lcygpPC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvMTJfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIAorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEyX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMl9fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzNDU2Nzg5MDEyMzQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzNDU2Nzg5MDEyMzQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj41Njc4OTAxMjM0NTY4OTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj41Njc4OTAxMjM0NTY4OTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTJfXzEiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4wMTIzNDU8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MDEyMzQ1PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTJfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj5saW5lJm5ic3A7Mjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMl9fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5saW5lJm5ic3A7MiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2FkZGU8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5kPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl82Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs0Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2hhbjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Zzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMl9fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzQmbmJzcDsmbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5HPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+ZTwvc3Bhbj5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+RTwvc3Bhbj5kPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xMl9fMiI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5nPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+YTwvc3Bhbj4mbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5HPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+PC9zcGFuPmVkPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+PC9zcGFuPmVkPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfOCI+ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO2NoYW5nPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl84Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs2PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5hPC9zcGFuPiZuYnNwOyZuYnNwO2NoYW5nPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xMl9fMyI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+ZTwvc3Bhbj5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+RTwvc3Bhbj5kPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTJfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTJfXzMiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmxpbmUmbmJzcDs4Jm5ic3A7Jm5ic3A7c3VidHJhPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEyX18zIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+bGluZSZuYnNwOzg8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj5jdGVkPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzExIj4xMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7OTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs5PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMl9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl8xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4xMjM0NTY3ODkwMTIzNDwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xMl9fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTJfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+MTIzNDU2Nzg5MDwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPjU2Nzg5MDEyMzQ1Njg5PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+MDEyMzQ1PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPnNob3J0Jm5ic3A7bGluZTwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmFub3RoZXImbmJzcDtsb25nJm5ic3A7bDwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmluZSZuYnNwO3RoYXQmbmJzcDtuZWVkczwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwO3RvJm5ic3A7YmUmbmJzcDt3cmFwcGVkPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEyXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5zPC9zcGFuPiZuYnNwO2luISE8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5TPC9zcGFuPiZuYnNwO2luISE8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl8xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+anVzdCZuYnNwO2ZpdHMmbmJzcDtpbiZuYnNwO3Q8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEyXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0cyZuYnNwO2luJm5ic3A7dDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPndvJm5ic3A7bGluZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+czwvc3Bhbj4mbmJzcDt5dXAhITwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj53byZuYnNwO2xpbmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlM8L3NwYW4+Jm5ic3A7eXVwISE8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xMl8xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+dGhlJm5ic3A7ZW5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xMl8xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+dGhlJm5ic3A7ZW5kPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8aDI+d3JhcGNvbHVtbj0xNCxzcGxpdGxpbmVzKFRydWUpPC9oMj4KKworICAgIDx0YWJsZSBjbGFzcz0iZGlmZiIgaWQ9ImRpZmZsaWJfY2hnX3RvMTNfX3RvcCIKKyAgICAgICAgICAgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIwIiBydWxlcz0iZ3JvdXBzIiA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIDxjb2xncm91cD48L2NvbGdyb3VwPiA8Y29sZ3JvdXA+PC9jb2xncm91cD4gPGNvbGdyb3VwPjwvY29sZ3JvdXA+CisgICAgICAgIAorICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiIGlkPSJkaWZmbGliX2NoZ190bzEzX18wIj48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xM19fMCI+ZjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MDwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX18wIj5mPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMSI+MTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzNDU2Nzg5MDEyMzQ8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzIiPjI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MTIzNDU2Nzg5MDEyMzQ8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj41Njc4OTAxMjM0NTY4OTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj41Njc4OTAxMjM0NTY4OTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCIgaWQ9ImRpZmZsaWJfY2hnX3RvMTNfXzEiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4wMTIzNDU8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+MDEyMzQ1PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMyI+MzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7MTwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTNfXzEiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj5saW5lJm5ic3A7Mjwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xM19fMSI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzQiPjQ8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5saW5lJm5ic3A7MiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwO2FkZGU8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfYWRkIj5kPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzM8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzUiPjU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzM8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX18yIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM182Ij42PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs0Jm5ic3A7Jm5ic3A7Jm5ic3A7Y2hhbjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Zzwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xM19fMiI+bjwvYT48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzYiPjY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzQmbmJzcDsmbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5HPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+ZTwvc3Bhbj5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+RTwvc3Bhbj5kPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xM19fMiI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzciPjc8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+bGluZSZuYnNwOzU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPiZuYnNwOzwvc3Bhbj4mbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5nPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfNyI+NzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+YTwvc3Bhbj4mbmJzcDsmbmJzcDtjaGFuPHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5HPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+PC9zcGFuPmVkPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+PC9zcGFuPmVkPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfOCI+ODwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+Jm5ic3A7PC9zcGFuPiZuYnNwOyZuYnNwO2NoYW5nPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM184Ij44PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs2PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5hPC9zcGFuPiZuYnNwOyZuYnNwO2NoYW5nPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0IiBpZD0iZGlmZmxpYl9jaGdfdG8xM19fMyI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+ZTwvc3Bhbj5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+RTwvc3Bhbj5kPC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJmcm9tMTNfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfOSI+OTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7NzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PGEgaHJlZj0iI2RpZmZsaWJfY2hnX3RvMTNfXzMiPm48L2E+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzEwIj4xMDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPmxpbmUmbmJzcDs4Jm5ic3A7Jm5ic3A7c3VidHJhPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjxhIGhyZWY9IiNkaWZmbGliX2NoZ190bzEzX18zIj5uPC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMTAiPjEwPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+bGluZSZuYnNwOzg8L3NwYW4+PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiPj48L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj5jdGVkPC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzExIj4xMTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5saW5lJm5ic3A7OTwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMTEiPjExPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPmxpbmUmbmJzcDs5PC90ZD48L3RyPgorICAgICAgICAgICAgPHRyPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xM19fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM18xMiI+MTI8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+PHNwYW4gY2xhc3M9ImRpZmZfc3ViIj4xMjM0NTY3ODkwMTIzNDwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48YSBocmVmPSIjZGlmZmxpYl9jaGdfdG8xM19fdG9wIj50PC9hPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9InRvMTNfMTIiPjEyPC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX2FkZCI+MTIzNDU2Nzg5MDwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPjU2Nzg5MDEyMzQ1Njg5PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPjxzcGFuIGNsYXNzPSJkaWZmX3N1YiI+MDEyMzQ1PC9zcGFuPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9zdWIiPnNob3J0Jm5ic3A7bGluZTwvc3Bhbj48L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzEzIj4xMzwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmFub3RoZXImbmJzcDtsb25nJm5ic3A7bDwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPmluZSZuYnNwO3RoYXQmbmJzcDtuZWVkczwvc3Bhbj48L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj48c3BhbiBjbGFzcz0iZGlmZl9hZGQiPiZuYnNwO3RvJm5ic3A7YmUmbmJzcDt3cmFwcGVkPC9zcGFuPjwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0iZnJvbTEzXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5zPC9zcGFuPiZuYnNwO2luISE8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzE0Ij4xNDwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0PHNwYW4gY2xhc3M9ImRpZmZfY2hnIj5TPC9zcGFuPiZuYnNwO2luISE8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM18xNSI+MTU8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+anVzdCZuYnNwO2ZpdHMmbmJzcDtpbiZuYnNwO3Q8L3RkPjx0ZCBjbGFzcz0iZGlmZl9uZXh0Ij48L3RkPjx0ZCBjbGFzcz0iZGlmZl9oZWFkZXIiIGlkPSJ0bzEzXzE1Ij4xNTwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj5qdXN0Jm5ic3A7Zml0cyZuYnNwO2luJm5ic3A7dDwvdGQ+PC90cj4KKyAgICAgICAgICAgIDx0cj48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIj4+PC90ZD48dGQgbm93cmFwPSJub3dyYXAiPndvJm5ic3A7bGluZTxzcGFuIGNsYXNzPSJkaWZmX2NoZyI+czwvc3Bhbj4mbmJzcDt5dXAhITwvdGQ+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciI+PjwvdGQ+PHRkIG5vd3JhcD0ibm93cmFwIj53byZuYnNwO2xpbmU8c3BhbiBjbGFzcz0iZGlmZl9jaGciPlM8L3NwYW4+Jm5ic3A7eXVwISE8L3RkPjwvdHI+CisgICAgICAgICAgICA8dHI+PHRkIGNsYXNzPSJkaWZmX25leHQiPjwvdGQ+PHRkIGNsYXNzPSJkaWZmX2hlYWRlciIgaWQ9ImZyb20xM18xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+dGhlJm5ic3A7ZW5kPC90ZD48dGQgY2xhc3M9ImRpZmZfbmV4dCI+PC90ZD48dGQgY2xhc3M9ImRpZmZfaGVhZGVyIiBpZD0idG8xM18xNiI+MTY8L3RkPjx0ZCBub3dyYXA9Im5vd3JhcCI+dGhlJm5ic3A7ZW5kPC90ZD48L3RyPgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGFibGU+Cis8L2JvZHk+CisKKzwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXJjYWNoZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWQzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXJjYWNoZS5weQpAQCAtMCwwICsxLDc3IEBACisiIiIKKyAgVGVzdCBjYXNlcyBmb3IgdGhlIGRpcmNhY2hlIG1vZHVsZQorICBOaWNrIE1hdGhld3NvbgorIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCitkaXJjYWNoZSA9IGltcG9ydF9tb2R1bGUoJ2RpcmNhY2hlJywgZGVwcmVjYXRlZD1UcnVlKQoraW1wb3J0IG9zLCB0aW1lLCBzeXMsIHRlbXBmaWxlCisKKworY2xhc3MgRGlyY2FjaGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlbXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGZuYW1lIGluIG9zLmxpc3RkaXIoc2VsZi50ZW1wZGlyKToKKyAgICAgICAgICAgIHNlbGYuZGVsVGVtcChmbmFtZSkKKyAgICAgICAgb3Mucm1kaXIoc2VsZi50ZW1wZGlyKQorCisgICAgZGVmIHdyaXRlVGVtcChzZWxmLCBmbmFtZSk6CisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXIsIGZuYW1lKSwgJ3cnKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBta2RpclRlbXAoc2VsZiwgZm5hbWUpOgorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCBmbmFtZSkpCisKKyAgICBkZWYgZGVsVGVtcChzZWxmLCBmbmFtZSk6CisgICAgICAgIGZuYW1lID0gb3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgZm5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZm5hbWUpOgorICAgICAgICAgICAgb3Mucm1kaXIoZm5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy51bmxpbmsoZm5hbWUpCisKKyAgICBkZWYgdGVzdF9saXN0ZGlyKHNlbGYpOgorICAgICAgICAjIyBTVUNDRVNTRlVMIENBU0VTCisgICAgICAgIGVudHJpZXMgPSBkaXJjYWNoZS5saXN0ZGlyKHNlbGYudGVtcGRpcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnRyaWVzLCBbXSkKKworICAgICAgICAjIENoZWNrIHRoYXQgY2FjaGUgaXMgYWN0dWFsbHkgY2FjaGluZywgbm90IGp1c3QgcGFzc2luZyB0aHJvdWdoLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpIGlzIGVudHJpZXMpCisKKyAgICAgICAgIyBEaXJlY3RvcmllcyBhcmVuJ3QgImZpbGVzIiBvbiBXaW5kb3dzLCBhbmQgZGlyZWN0b3J5IG10aW1lIGhhcworICAgICAgICAjIG5vdGhpbmcgdG8gZG8gd2l0aCB3aGVuIGZpbGVzIHVuZGVyIGEgZGlyZWN0b3J5IGdldCBjcmVhdGVkLgorICAgICAgICAjIFRoYXQgaXMsIHRoaXMgdGVzdCBjYW4ndCBwb3NzaWJseSB3b3JrIHVuZGVyIFdpbmRvd3MgLS0gZGlyY2FjaGUKKyAgICAgICAgIyBpcyBvbmx5IGdvb2QgZm9yIGNhcHR1cmluZyBhIG9uZS1zaG90IHNuYXBzaG90IHRoZXJlLgorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gbm90IGluICgnd2luJywgJ29zMicpOgorICAgICAgICAgICAgIyBTYWRseSwgZGlyY2FjaGUgaGFzIHRoZSBzYW1lIGdyYW51bGFyaXR5IGFzIHN0YXQubXRpbWUsIGFuZCBzbworICAgICAgICAgICAgIyBjYW4ndCBub3RpY2UgYW55IGNoYW5nZXMgdGhhdCBvY2N1cnJlZCB3aXRoaW4gMSBzZWMgb2YgdGhlIGxhc3QKKyAgICAgICAgICAgICMgdGltZSBpdCBleGFtaW5lZCBhIGRpcmVjdG9yeS4KKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgICAgIHNlbGYud3JpdGVUZW1wKCJ0ZXN0MSIpCisgICAgICAgICAgICBlbnRyaWVzID0gZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudHJpZXMsIFsndGVzdDEnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaXJjYWNoZS5saXN0ZGlyKHNlbGYudGVtcGRpcikgaXMgZW50cmllcykKKworICAgICAgICAjIyBVTlNVQ0NFU1NGVUwgQ0FTRVMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgZGlyY2FjaGUubGlzdGRpciwgc2VsZi50ZW1wZGlyKyJfbm9uZXhpc3RlbnQiKQorCisgICAgZGVmIHRlc3RfYW5ub3RhdGUoc2VsZik6CisgICAgICAgIHNlbGYud3JpdGVUZW1wKCJ0ZXN0MiIpCisgICAgICAgIHNlbGYubWtkaXJUZW1wKCJBIikKKyAgICAgICAgbHN0ID0gWydBJywgJ3Rlc3QyJywgJ3Rlc3Rfbm9uZXhpc3RlbnQnXQorICAgICAgICBkaXJjYWNoZS5hbm5vdGF0ZShzZWxmLnRlbXBkaXIsIGxzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFsnQS8nLCAndGVzdDInLCAndGVzdF9ub25leGlzdGVudCddKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0cnk6CisgICAgICAgIHJ1bl91bml0dGVzdChEaXJjYWNoZVRlc3RzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGRpcmNhY2hlLnJlc2V0KCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXJjYWNoZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXJjYWNoZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwMWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXJjYWNoZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXJjYWNoZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwMWMwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RpcmNhY2hlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNGI3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpcy5weQpAQCAtMCwwICsxLDE1MSBAQAorIyBNaW5pbWFsIHRlc3RzIGZvciBkaXMgbW9kdWxlCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgZGlzCitpbXBvcnQgU3RyaW5nSU8KKworCitkZWYgX2YoYSk6CisgICAgcHJpbnQgYQorICAgIHJldHVybiAxCisKK2Rpc19mID0gIiIiXAorICUtNGQgICAgICAgICAwIExPQURfRkFTVCAgICAgICAgICAgICAgICAwIChhKQorICAgICAgICAgICAgICAzIFBSSU5UX0lURU0KKyAgICAgICAgICAgICAgNCBQUklOVF9ORVdMSU5FCisKKyAlLTRkICAgICAgICAgNSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKyAgICAgICAgICAgICAgOCBSRVRVUk5fVkFMVUUKKyIiIiUoX2YuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMSwKKyAgICAgX2YuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMikKKworCitkZWYgYnVnNzA4OTAxKCk6CisgICAgZm9yIHJlcyBpbiByYW5nZSgxLAorICAgICAgICAgICAgICAgICAgICAgMTApOgorICAgICAgICBwYXNzCisKK2Rpc19idWc3MDg5MDEgPSAiIiJcCisgJS00ZCAgICAgICAgIDAgU0VUVVBfTE9PUCAgICAgICAgICAgICAgMjMgKHRvIDI2KQorICAgICAgICAgICAgICAzIExPQURfR0xPQkFMICAgICAgICAgICAgICAwIChyYW5nZSkKKyAgICAgICAgICAgICAgNiBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMSAoMSkKKworICUtNGQgICAgICAgICA5IExPQURfQ09OU1QgICAgICAgICAgICAgICAyICgxMCkKKyAgICAgICAgICAgICAxMiBDQUxMX0ZVTkNUSU9OICAgICAgICAgICAgMgorICAgICAgICAgICAgIDE1IEdFVF9JVEVSCisgICAgICAgID4+ICAgMTYgRk9SX0lURVIgICAgICAgICAgICAgICAgIDYgKHRvIDI1KQorICAgICAgICAgICAgIDE5IFNUT1JFX0ZBU1QgICAgICAgICAgICAgICAwIChyZXMpCisKKyAlLTRkICAgICAgICAyMiBKVU1QX0FCU09MVVRFICAgICAgICAgICAxNgorICAgICAgICA+PiAgIDI1IFBPUF9CTE9DSworICAgICAgICA+PiAgIDI2IExPQURfQ09OU1QgICAgICAgICAgICAgICAwIChOb25lKQorICAgICAgICAgICAgIDI5IFJFVFVSTl9WQUxVRQorIiIiJShidWc3MDg5MDEuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMSwKKyAgICAgYnVnNzA4OTAxLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubyArIDIsCisgICAgIGJ1ZzcwODkwMS5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAzKQorCisKK2RlZiBidWcxMzMzOTgyKHg9W10pOgorICAgIGFzc2VydCAwLCAoW3MgZm9yIHMgaW4geF0gKworICAgICAgICAgICAgICAxKQorICAgIHBhc3MKKworZGlzX2J1ZzEzMzM5ODIgPSAiIiJcCisgJS00ZCAgICAgICAgIDAgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDEgKDApCisgICAgICAgICAgICAgIDMgUE9QX0pVTVBfSUZfVFJVRSAgICAgICAgNDEKKyAgICAgICAgICAgICAgNiBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAoQXNzZXJ0aW9uRXJyb3IpCisgICAgICAgICAgICAgIDkgQlVJTERfTElTVCAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAxMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMCAoeCkKKyAgICAgICAgICAgICAxNSBHRVRfSVRFUgorICAgICAgICA+PiAgIDE2IEZPUl9JVEVSICAgICAgICAgICAgICAgIDEyICh0byAzMSkKKyAgICAgICAgICAgICAxOSBTVE9SRV9GQVNUICAgICAgICAgICAgICAgMSAocykKKyAgICAgICAgICAgICAyMiBMT0FEX0ZBU1QgICAgICAgICAgICAgICAgMSAocykKKyAgICAgICAgICAgICAyNSBMSVNUX0FQUEVORCAgICAgICAgICAgICAgMgorICAgICAgICAgICAgIDI4IEpVTVBfQUJTT0xVVEUgICAgICAgICAgIDE2CisKKyAlLTRkICAgPj4gICAzMSBMT0FEX0NPTlNUICAgICAgICAgICAgICAgMiAoMSkKKyAgICAgICAgICAgICAzNCBCSU5BUllfQURECisgICAgICAgICAgICAgMzUgQ0FMTF9GVU5DVElPTiAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAzOCBSQUlTRV9WQVJBUkdTICAgICAgICAgICAgMQorCisgJS00ZCAgID4+ICAgNDEgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgNDQgUkVUVVJOX1ZBTFVFCisiIiIlKGJ1ZzEzMzM5ODIuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vICsgMSwKKyAgICAgYnVnMTMzMzk4Mi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAyLAorICAgICBidWcxMzMzOTgyLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubyArIDMpCisKK19CSUdfTElORU5PX0ZPUk1BVCA9ICIiIlwKKyUzZCAgICAgICAgICAgMCBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAoc3BhbSkKKyAgICAgICAgICAgICAgMyBQT1BfVE9QCisgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgIDcgUkVUVVJOX1ZBTFVFCisiIiIKKworY2xhc3MgRGlzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBkb19kaXNhc3NlbWJseV90ZXN0KHNlbGYsIGZ1bmMsIGV4cGVjdGVkKToKKyAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHN5cy5zdGRvdXQgPSBzCisgICAgICAgIGRpcy5kaXMoZnVuYykKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisgICAgICAgIGdvdCA9IHMuZ2V0dmFsdWUoKQorICAgICAgICAjIFRyaW0gdHJhaWxpbmcgYmxhbmtzIChpZiBhbnkpLgorICAgICAgICBsaW5lcyA9IGdvdC5zcGxpdCgnXG4nKQorICAgICAgICBsaW5lcyA9IFtsaW5lLnJzdHJpcCgpIGZvciBsaW5lIGluIGxpbmVzXQorICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkLnNwbGl0KCJcbiIpCisgICAgICAgIGltcG9ydCBkaWZmbGliCisgICAgICAgIGlmIGV4cGVjdGVkICE9IGxpbmVzOgorICAgICAgICAgICAgc2VsZi5mYWlsKAorICAgICAgICAgICAgICAgICJldmVudHMgZGlkIG5vdCBtYXRjaCBleHBlY3RhdGlvbjpcbiIgKworICAgICAgICAgICAgICAgICJcbiIuam9pbihkaWZmbGliLm5kaWZmKGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVzKSkpCisKKyAgICBkZWYgdGVzdF9vcG1hcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXMub3BtYXBbIlNUT1BfQ09ERSJdLCAwKQorICAgICAgICBzZWxmLmFzc2VydEluKGRpcy5vcG1hcFsiTE9BRF9DT05TVCJdLCBkaXMuaGFzY29uc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZGlzLm9wbWFwWyJTVE9SRV9OQU1FIl0sIGRpcy5oYXNuYW1lKQorCisgICAgZGVmIHRlc3Rfb3BuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcy5vcG5hbWVbZGlzLm9wbWFwWyJMT0FEX0ZBU1QiXV0sICJMT0FEX0ZBU1QiKQorCisgICAgZGVmIHRlc3RfYm91bmRhcmllcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXMub3BtYXBbIkVYVEVOREVEX0FSRyJdLCBkaXMuRVhURU5ERURfQVJHKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcy5vcG1hcFsiU1RPUkVfTkFNRSJdLCBkaXMuSEFWRV9BUkdVTUVOVCkKKworICAgIGRlZiB0ZXN0X2RpcyhzZWxmKToKKyAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KF9mLCBkaXNfZikKKworICAgIGRlZiB0ZXN0X2J1Z183MDg5MDEoc2VsZik6CisgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChidWc3MDg5MDEsIGRpc19idWc3MDg5MDEpCisKKyAgICBkZWYgdGVzdF9idWdfMTMzMzk4MihzZWxmKToKKyAgICAgICAgIyBUaGlzIG9uZSBpcyBjaGVja2luZyBieXRlY29kZXMgZ2VuZXJhdGVkIGZvciBhbiBgYXNzZXJ0YCBzdGF0ZW1lbnQsCisgICAgICAgICMgc28gZmFpbHMgaWYgdGhlIHRlc3RzIGFyZSBydW4gd2l0aCAtTy4gIFNraXAgdGhpcyB0ZXN0IHRoZW4uCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChidWcxMzMzOTgyLCBkaXNfYnVnMTMzMzk4MikKKworICAgIGRlZiB0ZXN0X2JpZ19saW5lbm9zKHNlbGYpOgorICAgICAgICBkZWYgZnVuYyhjb3VudCk6CisgICAgICAgICAgICBuYW1lc3BhY2UgPSB7fQorICAgICAgICAgICAgZnVuYyA9ICJkZWYgZm9vKCk6XG4gIiArICIiLmpvaW4oWyJcbiAiXSAqIGNvdW50ICsgWyJzcGFtXG4iXSkKKyAgICAgICAgICAgIGV4ZWMgZnVuYyBpbiBuYW1lc3BhY2UKKyAgICAgICAgICAgIHJldHVybiBuYW1lc3BhY2VbJ2ZvbyddCisKKyAgICAgICAgIyBUZXN0IGFsbCBzbWFsbCByYW5nZXMKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEsIDMwMCk6CisgICAgICAgICAgICBleHBlY3RlZCA9IF9CSUdfTElORU5PX0ZPUk1BVCAlIChpICsgMikKKyAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChmdW5jKGkpLCBleHBlY3RlZCkKKworICAgICAgICAjIFRlc3Qgc29tZSBsYXJnZXIgcmFuZ2VzIHRvbworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMzAwLCA1MDAwLCAxMCk6CisgICAgICAgICAgICBleHBlY3RlZCA9IF9CSUdfTElORU5PX0ZPUk1BVCAlIChpICsgMikKKyAgICAgICAgICAgIHNlbGYuZG9fZGlzYXNzZW1ibHlfdGVzdChmdW5jKGkpLCBleHBlY3RlZCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChEaXNUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmE0ZTExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFiOWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXN0dXRpbHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kaXN0dXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTljYmJiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpc3R1dGlscy5weQpAQCAtMCwwICsxLDE4IEBACisiIiJUZXN0cyBmb3IgZGlzdHV0aWxzLgorCitUaGUgdGVzdHMgZm9yIGRpc3R1dGlscyBhcmUgZGVmaW5lZCBpbiB0aGUgZGlzdHV0aWxzLnRlc3RzIHBhY2thZ2U7Cit0aGUgdGVzdF9zdWl0ZSgpIGZ1bmN0aW9uIHRoZXJlIHJldHVybnMgYSB0ZXN0IHN1aXRlIHRoYXQncyByZWFkeSB0bworYmUgcnVuLgorIiIiCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgZGlzdHV0aWxzLnRlc3RzCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoZGlzdHV0aWxzLnRlc3RzLnRlc3Rfc3VpdGUoKSkKKyAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzdHV0aWxzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpc3R1dGlscy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYWQyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpc3R1dGlscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGlzdHV0aWxzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpc3R1dGlscy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGUxYWQyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Rpc3R1dGlscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MDY5YTc3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGwucHkKQEAgLTAsMCArMSwzOSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCBkbG1vZHVsZS5jCisgICBSb2dlciBFLiBNYXNzZSAgcmV2aXNlZCBzdHJhdGVneSBieSBCYXJyeSBXYXJzYXcKKyIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBpbXBvcnRfbW9kdWxlCitkbCA9IGltcG9ydF9tb2R1bGUoJ2RsJywgZGVwcmVjYXRlZD1UcnVlKQorCitzaGFyZWRsaWJzID0gWworICAgICgnL3Vzci9saWIvbGliYy5zbycsICdnZXRwaWQnKSwKKyAgICAoJy9saWIvbGliYy5zby42JywgJ2dldHBpZCcpLAorICAgICgnL3Vzci9iaW4vY3lnd2luMS5kbGwnLCAnZ2V0cGlkJyksCisgICAgKCcvdXNyL2xpYi9saWJjLmR5bGliJywgJ2dldHBpZCcpLAorICAgIF0KKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZvciBzLCBmdW5jIGluIHNoYXJlZGxpYnM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3RyeWluZyB0byBvcGVuOicsIHMsCisgICAgICAgICAgICBsID0gZGwub3BlbihzKQorICAgICAgICBleGNlcHQgZGwuZXJyb3IsIGVycjoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ2ZhaWxlZCcsIHJlcHIoc3RyKGVycikpCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdzdWNjZWVkZWQuLi4nLAorICAgICAgICAgICAgbC5jYWxsKGZ1bmMpCisgICAgICAgICAgICBsLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3dvcmtlZCEnCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCAnQ291bGQgbm90IG9wZW4gYW55IHNoYXJlZCBsaWJyYXJpZXMnCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjQzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjQzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUwNTdjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHkKQEAgLTAsMCArMSwyNzAxIEBACisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIiIiCitUZXN0IHNjcmlwdCBmb3IgZG9jdGVzdC4KKyIiIgorCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IGRvY3Rlc3QKKworIyBOT1RFOiBUaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIHRlc3RzIHJlbGF0aW5nIHRvIGludGVyYWN0aW9uIHdpdGgKKyMgICAgICAgemlwaW1wb3J0IGluIHRoZSB0ZXN0X3ppcGltcG9ydF9zdXBwb3J0IHRlc3QgbW9kdWxlLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBTYW1wbGUgT2JqZWN0cyAodXNlZCBieSB0ZXN0IGNhc2VzKQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgc2FtcGxlX2Z1bmModik6CisgICAgIiIiCisgICAgQmxhaCBibGFoCisKKyAgICA+Pj4gcHJpbnQgc2FtcGxlX2Z1bmMoMjIpCisgICAgNDQKKworICAgIFllZSBoYSEKKyAgICAiIiIKKyAgICByZXR1cm4gdit2CisKK2NsYXNzIFNhbXBsZUNsYXNzOgorICAgICIiIgorICAgID4+PiBwcmludCAxCisgICAgMQorCisgICAgPj4+ICMgY29tbWVudHMgZ2V0IGlnbm9yZWQuICBzbyBhcmUgZW1wdHkgUFMxIGFuZCBQUzIgcHJvbXB0czoKKyAgICA+Pj4KKyAgICAuLi4KKworICAgIE11bHRpbGluZSBleGFtcGxlOgorICAgID4+PiBzYyA9IFNhbXBsZUNsYXNzKDMpCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgIHNjID0gc2MuZG91YmxlKCkKKyAgICAuLi4gICAgIHByaW50IHNjLmdldCgpLAorICAgIDYgMTIgMjQgNDggOTYgMTkyIDM4NCA3NjggMTUzNiAzMDcyCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICIiIgorICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlQ2xhc3MoMTIpLmdldCgpCisgICAgICAgIDEyCisgICAgICAgICIiIgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIGRvdWJsZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBwcmludCBTYW1wbGVDbGFzcygxMikuZG91YmxlKCkuZ2V0KCkKKyAgICAgICAgMjQKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBTYW1wbGVDbGFzcyhzZWxmLnZhbCArIHNlbGYudmFsKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBwcmludCBTYW1wbGVDbGFzcygtNSkuZ2V0KCkKKyAgICAgICAgLTUKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnZhbAorCisgICAgZGVmIGFfc3RhdGljbWV0aG9kKHYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzLmFfc3RhdGljbWV0aG9kKDEwKQorICAgICAgICAxMQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHYrMQorICAgIGFfc3RhdGljbWV0aG9kID0gc3RhdGljbWV0aG9kKGFfc3RhdGljbWV0aG9kKQorCisgICAgZGVmIGFfY2xhc3NtZXRob2QoY2xzLCB2KToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBwcmludCBTYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kKDEwKQorICAgICAgICAxMgorICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlQ2xhc3MoMCkuYV9jbGFzc21ldGhvZCgxMCkKKyAgICAgICAgMTIKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB2KzIKKyAgICBhX2NsYXNzbWV0aG9kID0gY2xhc3NtZXRob2QoYV9jbGFzc21ldGhvZCkKKworICAgIGFfcHJvcGVydHkgPSBwcm9wZXJ0eShnZXQsIGRvYz0iIiIKKyAgICAgICAgPj4+IHByaW50IFNhbXBsZUNsYXNzKDIyKS5hX3Byb3BlcnR5CisgICAgICAgIDIyCisgICAgICAgICIiIikKKworICAgIGNsYXNzIE5lc3RlZENsYXNzOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHggPSBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcyg1KQorICAgICAgICA+Pj4geSA9IHguc3F1YXJlKCkKKyAgICAgICAgPj4+IHByaW50IHkuZ2V0KCkKKyAgICAgICAgMjUKKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWw9MCk6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgID4+PiBwcmludCBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcygpLmdldCgpCisgICAgICAgICAgICAwCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIGRlZiBzcXVhcmUoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3Moc2VsZi52YWwqc2VsZi52YWwpCisgICAgICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi52YWwKKworY2xhc3MgU2FtcGxlTmV3U3R5bGVDbGFzcyhvYmplY3QpOgorICAgIHIiIiIKKyAgICA+Pj4gcHJpbnQgJzFcbjJcbjMnCisgICAgMQorICAgIDIKKyAgICAzCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICIiIgorICAgICAgICA+Pj4gcHJpbnQgU2FtcGxlTmV3U3R5bGVDbGFzcygxMikuZ2V0KCkKKyAgICAgICAgMTIKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgZG91YmxlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgPj4+IHByaW50IFNhbXBsZU5ld1N0eWxlQ2xhc3MoMTIpLmRvdWJsZSgpLmdldCgpCisgICAgICAgIDI0CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gU2FtcGxlTmV3U3R5bGVDbGFzcyhzZWxmLnZhbCArIHNlbGYudmFsKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBwcmludCBTYW1wbGVOZXdTdHlsZUNsYXNzKC01KS5nZXQoKQorICAgICAgICAtNQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIEZha2Ugc3RkaW4gKGZvciB0ZXN0aW5nIGludGVyYWN0aXZlIGRlYnVnZ2luZykKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgX0Zha2VJbnB1dDoKKyAgICAiIiIKKyAgICBBIGZha2UgaW5wdXQgc3RyZWFtIGZvciBwZGIncyBpbnRlcmFjdGl2ZSBkZWJ1Z2dlci4gIFdoZW5ldmVyIGEKKyAgICBsaW5lIGlzIHJlYWQsIHByaW50IGl0ICh0byBzaW11bGF0ZSB0aGUgdXNlciB0eXBpbmcgaXQpLCBhbmQgdGhlbgorICAgIHJldHVybiBpdC4gIFRoZSBzZXQgb2YgbGluZXMgdG8gcmV0dXJuIGlzIHNwZWNpZmllZCBpbiB0aGUKKyAgICBjb25zdHJ1Y3RvcjsgdGhleSBzaG91bGQgbm90IGhhdmUgdHJhaWxpbmcgbmV3bGluZXMuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbmVzKToKKyAgICAgICAgc2VsZi5saW5lcyA9IGxpbmVzCisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGxpbmUgPSBzZWxmLmxpbmVzLnBvcCgwKQorICAgICAgICBwcmludCBsaW5lCisgICAgICAgIHJldHVybiBsaW5lKydcbicKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgVGVzdCBDYXNlcworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgdGVzdF9FeGFtcGxlKCk6IHIiIiIKK1VuaXQgdGVzdHMgZm9yIHRoZSBgRXhhbXBsZWAgY2xhc3MuCisKK0V4YW1wbGUgaXMgYSBzaW1wbGUgY29udGFpbmVyIGNsYXNzIHRoYXQgaG9sZHM6CisgIC0gYHNvdXJjZWA6IEEgc291cmNlIHN0cmluZy4KKyAgLSBgd2FudGA6IEFuIGV4cGVjdGVkIG91dHB1dCBzdHJpbmcuCisgIC0gYGV4Y19tc2dgOiBBbiBleHBlY3RlZCBleGNlcHRpb24gbWVzc2FnZSBzdHJpbmcgKG9yIE5vbmUgaWYgbm8KKyAgICBleGNlcHRpb24gaXMgZXhwZWN0ZWQpLgorICAtIGBsaW5lbm9gOiBBIGxpbmUgbnVtYmVyICh3aXRoaW4gdGhlIGRvY3N0cmluZykuCisgIC0gYGluZGVudGA6IFRoZSBleGFtcGxlJ3MgaW5kZW50YXRpb24gaW4gdGhlIGlucHV0IHN0cmluZy4KKyAgLSBgb3B0aW9uc2A6IEFuIG9wdGlvbiBkaWN0aW9uYXJ5LCBtYXBwaW5nIG9wdGlvbiBmbGFncyB0byBUcnVlIG9yCisgICAgRmFsc2UuCisKK1RoZXNlIGF0dHJpYnV0ZXMgYXJlIHNldCBieSB0aGUgY29uc3RydWN0b3IuICBgc291cmNlYCBhbmQgYHdhbnRgIGFyZQorcmVxdWlyZWQ7IHRoZSBvdGhlciBhdHRyaWJ1dGVzIGFsbCBoYXZlIGRlZmF1bHQgdmFsdWVzOgorCisgICAgPj4+IGV4YW1wbGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDEnLCAnMVxuJykKKyAgICA+Pj4gKGV4YW1wbGUuc291cmNlLCBleGFtcGxlLndhbnQsIGV4YW1wbGUuZXhjX21zZywKKyAgICAuLi4gIGV4YW1wbGUubGluZW5vLCBleGFtcGxlLmluZGVudCwgZXhhbXBsZS5vcHRpb25zKQorICAgICgncHJpbnQgMVxuJywgJzFcbicsIE5vbmUsIDAsIDAsIHt9KQorCitUaGUgZmlyc3QgdGhyZWUgYXR0cmlidXRlcyAoYHNvdXJjZWAsIGB3YW50YCwgYW5kIGBleGNfbXNnYCkgbWF5IGJlCitzcGVjaWZpZWQgcG9zaXRpb25hbGx5OyB0aGUgcmVtYWluaW5nIGFyZ3VtZW50cyBzaG91bGQgYmUgc3BlY2lmaWVkIGFzCitrZXl3b3JkIGFyZ3VtZW50czoKKworICAgID4+PiBleGNfbXNnID0gJ0luZGV4RXJyb3I6IHBvcCBmcm9tIGFuIGVtcHR5IGxpc3QnCisgICAgPj4+IGV4YW1wbGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ1tdLnBvcCgpJywgJycsIGV4Y19tc2csCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPTUsIGluZGVudD00LAorICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM9e2RvY3Rlc3QuRUxMSVBTSVM6IFRydWV9KQorICAgID4+PiAoZXhhbXBsZS5zb3VyY2UsIGV4YW1wbGUud2FudCwgZXhhbXBsZS5leGNfbXNnLAorICAgIC4uLiAgZXhhbXBsZS5saW5lbm8sIGV4YW1wbGUuaW5kZW50LCBleGFtcGxlLm9wdGlvbnMpCisgICAgKCdbXS5wb3AoKVxuJywgJycsICdJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0XG4nLCA1LCA0LCB7ODogVHJ1ZX0pCisKK1RoZSBjb25zdHJ1Y3RvciBub3JtYWxpemVzIHRoZSBgc291cmNlYCBzdHJpbmcgdG8gZW5kIGluIGEgbmV3bGluZToKKworICAgIFNvdXJjZSBzcGFucyBhIHNpbmdsZSBsaW5lOiBubyB0ZXJtaW5hdGluZyBuZXdsaW5lLgorICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ3ByaW50IDFcbicsICcxXG4nKQorCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDFcbicsICcxXG4nKQorICAgID4+PiBlLnNvdXJjZSwgZS53YW50CisgICAgKCdwcmludCAxXG4nLCAnMVxuJykKKworICAgIFNvdXJjZSBzcGFucyBtdWx0aXBsZSBsaW5lczogcmVxdWlyZSB0ZXJtaW5hdGluZyBuZXdsaW5lLgorICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxO1xucHJpbnQgMlxuJywgJzFcbjJcbicpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ3ByaW50IDE7XG5wcmludCAyXG4nLCAnMVxuMlxuJykKKworICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxO1xucHJpbnQgMicsICcxXG4yXG4nKQorICAgID4+PiBlLnNvdXJjZSwgZS53YW50CisgICAgKCdwcmludCAxO1xucHJpbnQgMlxuJywgJzFcbjJcbicpCisKKyAgICBFbXB0eSBzb3VyY2Ugc3RyaW5nICh3aGljaCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIHJlYWwgZXhhbXBsZXMpCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJycsICcnKQorICAgID4+PiBlLnNvdXJjZSwgZS53YW50CisgICAgKCdcbicsICcnKQorCitUaGUgY29uc3RydWN0b3Igbm9ybWFsaXplcyB0aGUgYHdhbnRgIHN0cmluZyB0byBlbmQgaW4gYSBuZXdsaW5lLAordW5sZXNzIGl0J3MgdGhlIGVtcHR5IHN0cmluZzoKKworICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ3ByaW50IDFcbicsICcxXG4nKQorCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50IDEnLCAnMScpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ3ByaW50IDFcbicsICcxXG4nKQorCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3ByaW50JywgJycpCisgICAgPj4+IGUuc291cmNlLCBlLndhbnQKKyAgICAoJ3ByaW50XG4nLCAnJykKKworVGhlIGNvbnN0cnVjdG9yIG5vcm1hbGl6ZXMgdGhlIGBleGNfbXNnYCBzdHJpbmcgdG8gZW5kIGluIGEgbmV3bGluZSwKK3VubGVzcyBpdCdzIGBOb25lYDoKKworICAgIE1lc3NhZ2Ugc3BhbnMgb25lIGxpbmUKKyAgICA+Pj4gZXhjX21zZyA9ICdJbmRleEVycm9yOiBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0JworICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdbXS5wb3AoKScsICcnLCBleGNfbXNnKQorICAgID4+PiBlLmV4Y19tc2cKKyAgICAnSW5kZXhFcnJvcjogcG9wIGZyb20gYW4gZW1wdHkgbGlzdFxuJworCisgICAgPj4+IGV4Y19tc2cgPSAnSW5kZXhFcnJvcjogcG9wIGZyb20gYW4gZW1wdHkgbGlzdFxuJworICAgID4+PiBlID0gZG9jdGVzdC5FeGFtcGxlKCdbXS5wb3AoKScsICcnLCBleGNfbXNnKQorICAgID4+PiBlLmV4Y19tc2cKKyAgICAnSW5kZXhFcnJvcjogcG9wIGZyb20gYW4gZW1wdHkgbGlzdFxuJworCisgICAgTWVzc2FnZSBzcGFucyBtdWx0aXBsZSBsaW5lcworICAgID4+PiBleGNfbXNnID0gJ1ZhbHVlRXJyb3I6IDFcbiAgMicKKyAgICA+Pj4gZSA9IGRvY3Rlc3QuRXhhbXBsZSgncmFpc2UgVmFsdWVFcnJvcigiMVxuICAyIiknLCAnJywgZXhjX21zZykKKyAgICA+Pj4gZS5leGNfbXNnCisgICAgJ1ZhbHVlRXJyb3I6IDFcbiAgMlxuJworCisgICAgPj4+IGV4Y19tc2cgPSAnVmFsdWVFcnJvcjogMVxuICAyXG4nCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3JhaXNlIFZhbHVlRXJyb3IoIjFcbiAgMiIpJywgJycsIGV4Y19tc2cpCisgICAgPj4+IGUuZXhjX21zZworICAgICdWYWx1ZUVycm9yOiAxXG4gIDJcbicKKworICAgIEVtcHR5IChidXQgbm9uLU5vbmUpIGV4Y2VwdGlvbiBtZXNzYWdlICh3aGljaCBzaG91bGQgbmV2ZXIgYXBwZWFyCisgICAgaW4gcmVhbCBleGFtcGxlcykKKyAgICA+Pj4gZXhjX21zZyA9ICcnCisgICAgPj4+IGUgPSBkb2N0ZXN0LkV4YW1wbGUoJ3JhaXNlIFgoKScsICcnLCBleGNfbXNnKQorICAgID4+PiBlLmV4Y19tc2cKKyAgICAnXG4nCisKK0NvbXBhcmUgYEV4YW1wbGVgOgorICAgID4+PiBleGFtcGxlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCAxJywgJzFcbicpCisgICAgPj4+IHNhbWVfZXhhbXBsZSA9IGRvY3Rlc3QuRXhhbXBsZSgncHJpbnQgMScsICcxXG4nKQorICAgID4+PiBvdGhlcl9leGFtcGxlID0gZG9jdGVzdC5FeGFtcGxlKCdwcmludCA0MicsICc0MlxuJykKKyAgICA+Pj4gZXhhbXBsZSA9PSBzYW1lX2V4YW1wbGUKKyAgICBUcnVlCisgICAgPj4+IGV4YW1wbGUgIT0gc2FtZV9leGFtcGxlCisgICAgRmFsc2UKKyAgICA+Pj4gaGFzaChleGFtcGxlKSA9PSBoYXNoKHNhbWVfZXhhbXBsZSkKKyAgICBUcnVlCisgICAgPj4+IGV4YW1wbGUgPT0gb3RoZXJfZXhhbXBsZQorICAgIEZhbHNlCisgICAgPj4+IGV4YW1wbGUgIT0gb3RoZXJfZXhhbXBsZQorICAgIFRydWUKKyIiIgorCitkZWYgdGVzdF9Eb2NUZXN0KCk6IHIiIiIKK1VuaXQgdGVzdHMgZm9yIHRoZSBgRG9jVGVzdGAgY2xhc3MuCisKK0RvY1Rlc3QgaXMgYSBjb2xsZWN0aW9uIG9mIGV4YW1wbGVzLCBleHRyYWN0ZWQgZnJvbSBhIGRvY3N0cmluZywgYWxvbmcKK3dpdGggaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgdGhlIGRvY3N0cmluZyBjb21lcyBmcm9tIChhIG5hbWUsCitmaWxlbmFtZSwgYW5kIGxpbmUgbnVtYmVyKS4gIFRoZSBkb2NzdHJpbmcgaXMgcGFyc2VkIGJ5IHRoZSBgRG9jVGVzdGAKK2NvbnN0cnVjdG9yOgorCisgICAgPj4+IGRvY3N0cmluZyA9ICcnJworICAgIC4uLiAgICAgPj4+IHByaW50IDEyCisgICAgLi4uICAgICAxMgorICAgIC4uLgorICAgIC4uLiBOb24tZXhhbXBsZSB0ZXh0LgorICAgIC4uLgorICAgIC4uLiAgICAgPj4+IHByaW50ICdhbm90aGVyXGV4YW1wbGUnCisgICAgLi4uICAgICBhbm90aGVyCisgICAgLi4uICAgICBleGFtcGxlCisgICAgLi4uICcnJworICAgID4+PiBnbG9icyA9IHt9ICMgZ2xvYmFscyB0byBydW4gdGhlIHRlc3QgaW4uCisgICAgPj4+IHBhcnNlciA9IGRvY3Rlc3QuRG9jVGVzdFBhcnNlcigpCisgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWVfZmlsZScsIDIwKQorICAgID4+PiBwcmludCB0ZXN0CisgICAgPERvY1Rlc3Qgc29tZV90ZXN0IGZyb20gc29tZV9maWxlOjIwICgyIGV4YW1wbGVzKT4KKyAgICA+Pj4gbGVuKHRlc3QuZXhhbXBsZXMpCisgICAgMgorICAgID4+PiBlMSwgZTIgPSB0ZXN0LmV4YW1wbGVzCisgICAgPj4+IChlMS5zb3VyY2UsIGUxLndhbnQsIGUxLmxpbmVubykKKyAgICAoJ3ByaW50IDEyXG4nLCAnMTJcbicsIDEpCisgICAgPj4+IChlMi5zb3VyY2UsIGUyLndhbnQsIGUyLmxpbmVubykKKyAgICAoInByaW50ICdhbm90aGVyXFxleGFtcGxlJ1xuIiwgJ2Fub3RoZXJcbmV4YW1wbGVcbicsIDYpCisKK1NvdXJjZSBpbmZvcm1hdGlvbiAobmFtZSwgZmlsZW5hbWUsIGFuZCBsaW5lIG51bWJlcikgaXMgYXZhaWxhYmxlIGFzCithdHRyaWJ1dGVzIG9uIHRoZSBkb2N0ZXN0IG9iamVjdDoKKworICAgID4+PiAodGVzdC5uYW1lLCB0ZXN0LmZpbGVuYW1lLCB0ZXN0LmxpbmVubykKKyAgICAoJ3NvbWVfdGVzdCcsICdzb21lX2ZpbGUnLCAyMCkKKworVGhlIGxpbmUgbnVtYmVyIG9mIGFuIGV4YW1wbGUgd2l0aGluIGl0cyBjb250YWluaW5nIGZpbGUgaXMgZm91bmQgYnkKK2FkZGluZyB0aGUgbGluZSBudW1iZXIgb2YgdGhlIGV4YW1wbGUgYW5kIHRoZSBsaW5lIG51bWJlciBvZiBpdHMKK2NvbnRhaW5pbmcgdGVzdDoKKworICAgID4+PiB0ZXN0LmxpbmVubyArIGUxLmxpbmVubworICAgIDIxCisgICAgPj4+IHRlc3QubGluZW5vICsgZTIubGluZW5vCisgICAgMjYKKworSWYgdGhlIGRvY3N0cmluZyBjb250YWlucyBpbmNvbnNpc3RhbnQgbGVhZGluZyB3aGl0ZXNwYWNlIGluIHRoZQorZXhwZWN0ZWQgb3V0cHV0IG9mIGFuIGV4YW1wbGUsIHRoZW4gYERvY1Rlc3RgIHdpbGwgcmFpc2UgYSBWYWx1ZUVycm9yOgorCisgICAgPj4+IGRvY3N0cmluZyA9IHInJycKKyAgICAuLi4gICAgICAgPj4+IHByaW50ICdiYWRcbmluZGVudGF0aW9uJworICAgIC4uLiAgICAgICBiYWQKKyAgICAuLi4gICAgIGluZGVudGF0aW9uCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gcGFyc2VyLmdldF9kb2N0ZXN0KGRvY3N0cmluZywgZ2xvYnMsICdzb21lX3Rlc3QnLCAnZmlsZW5hbWUnLCAwKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBsaW5lIDQgb2YgdGhlIGRvY3N0cmluZyBmb3Igc29tZV90ZXN0IGhhcyBpbmNvbnNpc3RlbnQgbGVhZGluZyB3aGl0ZXNwYWNlOiAnaW5kZW50YXRpb24nCisKK0lmIHRoZSBkb2NzdHJpbmcgY29udGFpbnMgaW5jb25zaXN0ZW50IGxlYWRpbmcgd2hpdGVzcGFjZSBvbgorY29udGludWF0aW9uIGxpbmVzLCB0aGVuIGBEb2NUZXN0YCB3aWxsIHJhaXNlIGEgVmFsdWVFcnJvcjoKKworICAgID4+PiBkb2NzdHJpbmcgPSByJycnCisgICAgLi4uICAgICAgID4+PiBwcmludCAoJ2JhZCBpbmRlbnRhdGlvbicsCisgICAgLi4uICAgICAuLi4gICAgICAgICAgMikKKyAgICAuLi4gICAgICAgKCdiYWQnLCAnaW5kZW50YXRpb24nKQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywgJ2ZpbGVuYW1lJywgMCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogbGluZSAyIG9mIHRoZSBkb2NzdHJpbmcgZm9yIHNvbWVfdGVzdCBoYXMgaW5jb25zaXN0ZW50IGxlYWRpbmcgd2hpdGVzcGFjZTogJy4uLiAgICAgICAgICAyKScKKworSWYgdGhlcmUncyBubyBibGFuayBzcGFjZSBhZnRlciBhIFBTMSBwcm9tcHQgKCc+Pj4nKSwgdGhlbiBgRG9jVGVzdGAKK3dpbGwgcmFpc2UgYSBWYWx1ZUVycm9yOgorCisgICAgPj4+IGRvY3N0cmluZyA9ICc+Pj5wcmludCAxXG4xJworICAgID4+PiBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsICdmaWxlbmFtZScsIDApCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IGxpbmUgMSBvZiB0aGUgZG9jc3RyaW5nIGZvciBzb21lX3Rlc3QgbGFja3MgYmxhbmsgYWZ0ZXIgPj4+OiAnPj4+cHJpbnQgMScKKworSWYgdGhlcmUncyBubyBibGFuayBzcGFjZSBhZnRlciBhIFBTMiBwcm9tcHQgKCcuLi4nKSwgdGhlbiBgRG9jVGVzdGAKK3dpbGwgcmFpc2UgYSBWYWx1ZUVycm9yOgorCisgICAgPj4+IGRvY3N0cmluZyA9ICc+Pj4gaWYgMTpcbi4uLnByaW50IDFcbjEnCisgICAgPj4+IHBhcnNlci5nZXRfZG9jdGVzdChkb2NzdHJpbmcsIGdsb2JzLCAnc29tZV90ZXN0JywgJ2ZpbGVuYW1lJywgMCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogbGluZSAyIG9mIHRoZSBkb2NzdHJpbmcgZm9yIHNvbWVfdGVzdCBsYWNrcyBibGFuayBhZnRlciAuLi46ICcuLi5wcmludCAxJworCitDb21wYXJlIGBEb2NUZXN0YDoKKworICAgID4+PiBkb2NzdHJpbmcgPSAnJycKKyAgICAuLi4gICAgID4+PiBwcmludCAxMgorICAgIC4uLiAgICAgMTIKKyAgICAuLi4gJycnCisgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWVfdGVzdCcsIDIwKQorICAgID4+PiBzYW1lX3Rlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ3NvbWVfdGVzdCcsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc29tZV90ZXN0JywgMjApCisgICAgPj4+IHRlc3QgPT0gc2FtZV90ZXN0CisgICAgVHJ1ZQorICAgID4+PiB0ZXN0ICE9IHNhbWVfdGVzdAorICAgIEZhbHNlCisgICAgPj4+IGhhc2godGVzdCkgPT0gaGFzaChzYW1lX3Rlc3QpCisgICAgVHJ1ZQorICAgID4+PiBkb2NzdHJpbmcgPSAnJycKKyAgICAuLi4gICAgID4+PiBwcmludCA0MgorICAgIC4uLiAgICAgNDIKKyAgICAuLi4gJycnCisgICAgPj4+IG90aGVyX3Rlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jc3RyaW5nLCBnbG9icywgJ290aGVyX3Rlc3QnLAorICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvdGhlcl9maWxlJywgMTApCisgICAgPj4+IHRlc3QgPT0gb3RoZXJfdGVzdAorICAgIEZhbHNlCisgICAgPj4+IHRlc3QgIT0gb3RoZXJfdGVzdAorICAgIFRydWUKKworQ29tcGFyZSBgRG9jVGVzdENhc2VgOgorCisgICAgPj4+IERvY1Rlc3RDYXNlID0gZG9jdGVzdC5Eb2NUZXN0Q2FzZQorICAgID4+PiB0ZXN0X2Nhc2UgPSBEb2NUZXN0Q2FzZSh0ZXN0KQorICAgID4+PiBzYW1lX3Rlc3RfY2FzZSA9IERvY1Rlc3RDYXNlKHNhbWVfdGVzdCkKKyAgICA+Pj4gb3RoZXJfdGVzdF9jYXNlID0gRG9jVGVzdENhc2Uob3RoZXJfdGVzdCkKKyAgICA+Pj4gdGVzdF9jYXNlID09IHNhbWVfdGVzdF9jYXNlCisgICAgVHJ1ZQorICAgID4+PiB0ZXN0X2Nhc2UgIT0gc2FtZV90ZXN0X2Nhc2UKKyAgICBGYWxzZQorICAgID4+PiBoYXNoKHRlc3RfY2FzZSkgPT0gaGFzaChzYW1lX3Rlc3RfY2FzZSkKKyAgICBUcnVlCisgICAgPj4+IHRlc3QgPT0gb3RoZXJfdGVzdF9jYXNlCisgICAgRmFsc2UKKyAgICA+Pj4gdGVzdCAhPSBvdGhlcl90ZXN0X2Nhc2UKKyAgICBUcnVlCisKKyIiIgorCitkZWYgdGVzdF9Eb2NUZXN0RmluZGVyKCk6IHIiIiIKK1VuaXQgdGVzdHMgZm9yIHRoZSBgRG9jVGVzdEZpbmRlcmAgY2xhc3MuCisKK0RvY1Rlc3RGaW5kZXIgaXMgdXNlZCB0byBleHRyYWN0IERvY1Rlc3RzIGZyb20gYW4gb2JqZWN0J3MgZG9jc3RyaW5nCithbmQgdGhlIGRvY3N0cmluZ3Mgb2YgaXRzIGNvbnRhaW5lZCBvYmplY3RzLiAgSXQgY2FuIGJlIHVzZWQgd2l0aAorbW9kdWxlcywgZnVuY3Rpb25zLCBjbGFzc2VzLCBtZXRob2RzLCBzdGF0aWNtZXRob2RzLCBjbGFzc21ldGhvZHMsIGFuZAorcHJvcGVydGllcy4KKworRmluZGluZyBUZXN0cyBpbiBGdW5jdGlvbnMKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitGb3IgYSBmdW5jdGlvbiB3aG9zZSBkb2NzdHJpbmcgY29udGFpbnMgZXhhbXBsZXMsIERvY1Rlc3RGaW5kZXIuZmluZCgpCit3aWxsIHJldHVybiBhIHNpbmdsZSB0ZXN0IChmb3IgdGhhdCBmdW5jdGlvbidzIGRvY3N0cmluZyk6CisKKyAgICA+Pj4gZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkKKworV2UnbGwgc2ltdWxhdGUgYSBfX2ZpbGVfXyBhdHRyIHRoYXQgZW5kcyBpbiBweWM6CisKKyAgICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CisgICAgPj4+IG9sZCA9IHRlc3QudGVzdF9kb2N0ZXN0Ll9fZmlsZV9fCisgICAgPj4+IHRlc3QudGVzdF9kb2N0ZXN0Ll9fZmlsZV9fID0gJ3Rlc3RfZG9jdGVzdC5weWMnCisKKyAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChzYW1wbGVfZnVuYykKKworICAgID4+PiBwcmludCB0ZXN0cyAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICBbPERvY1Rlc3Qgc2FtcGxlX2Z1bmMgZnJvbSAuLi46MTcgKDEgZXhhbXBsZSk+XQorCitUaGUgZXhhY3QgbmFtZSBkZXBlbmRzIG9uIGhvdyB0ZXN0X2RvY3Rlc3Qgd2FzIGludm9rZWQsIHNvIGFsbG93IGZvcgorbGVhZGluZyBwYXRoIGNvbXBvbmVudHMuCisKKyAgICA+Pj4gdGVzdHNbMF0uZmlsZW5hbWUgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAnLi4udGVzdF9kb2N0ZXN0LnB5JworCisgICAgPj4+IHRlc3QudGVzdF9kb2N0ZXN0Ll9fZmlsZV9fID0gb2xkCisKKworICAgID4+PiBlID0gdGVzdHNbMF0uZXhhbXBsZXNbMF0KKyAgICA+Pj4gKGUuc291cmNlLCBlLndhbnQsIGUubGluZW5vKQorICAgICgncHJpbnQgc2FtcGxlX2Z1bmMoMjIpXG4nLCAnNDRcbicsIDMpCisKK0J5IGRlZmF1bHQsIHRlc3RzIGFyZSBjcmVhdGVkIGZvciBvYmplY3RzIHdpdGggbm8gZG9jc3RyaW5nOgorCisgICAgPj4+IGRlZiBub19kb2NzdHJpbmcodik6CisgICAgLi4uICAgICBwYXNzCisgICAgPj4+IGZpbmRlci5maW5kKG5vX2RvY3N0cmluZykKKyAgICBbXQorCitIb3dldmVyLCB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYGV4Y2x1ZGVfZW1wdHlgIHRvIHRoZSBEb2NUZXN0RmluZGVyCitjb25zdHJ1Y3RvciBjYW4gYmUgdXNlZCB0byBleGNsdWRlIHRlc3RzIGZvciBvYmplY3RzIHdpdGggZW1wdHkKK2RvY3N0cmluZ3M6CisKKyAgICA+Pj4gZGVmIG5vX2RvY3N0cmluZyh2KToKKyAgICAuLi4gICAgIHBhc3MKKyAgICA+Pj4gZXhjbF9lbXB0eV9maW5kZXIgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoZXhjbHVkZV9lbXB0eT1UcnVlKQorICAgID4+PiBleGNsX2VtcHR5X2ZpbmRlci5maW5kKG5vX2RvY3N0cmluZykKKyAgICBbXQorCitJZiB0aGUgZnVuY3Rpb24gaGFzIGEgZG9jc3RyaW5nIHdpdGggbm8gZXhhbXBsZXMsIHRoZW4gYSB0ZXN0IHdpdGggbm8KK2V4YW1wbGVzIGlzIHJldHVybmVkLiAgKFRoaXMgbGV0cyBgRG9jVGVzdFJ1bm5lcmAgY29sbGVjdCBzdGF0aXN0aWNzCithYm91dCB3aGljaCBmdW5jdGlvbnMgaGF2ZSBubyB0ZXN0cyAtLSBidXQgaXMgdGhhdCB1c2VmdWw/ICBBbmQgc2hvdWxkCithbiBlbXB0eSB0ZXN0IGFsc28gYmUgY3JlYXRlZCB3aGVuIHRoZXJlJ3Mgbm8gZG9jc3RyaW5nPykKKworICAgID4+PiBkZWYgbm9fZXhhbXBsZXModik6CisgICAgLi4uICAgICAnJycgbm8gZG9jdGVzdCBleGFtcGxlcyAnJycKKyAgICA+Pj4gZmluZGVyLmZpbmQobm9fZXhhbXBsZXMpICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgWzxEb2NUZXN0IG5vX2V4YW1wbGVzIGZyb20gLi4uOjEgKG5vIGV4YW1wbGVzKT5dCisKK0ZpbmRpbmcgVGVzdHMgaW4gQ2xhc3Nlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitGb3IgYSBjbGFzcywgRG9jVGVzdEZpbmRlciB3aWxsIGNyZWF0ZSBhIHRlc3QgZm9yIHRoZSBjbGFzcydzCitkb2NzdHJpbmcsIGFuZCB3aWxsIHJlY3Vyc2l2ZWx5IGV4cGxvcmUgaXRzIGNvbnRlbnRzLCBpbmNsdWRpbmcKK21ldGhvZHMsIGNsYXNzbWV0aG9kcywgc3RhdGljbWV0aG9kcywgcHJvcGVydGllcywgYW5kIG5lc3RlZCBjbGFzc2VzLgorCisgICAgPj4+IGZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpCisgICAgPj4+IHRlc3RzID0gZmluZGVyLmZpbmQoU2FtcGxlQ2xhc3MpCisgICAgPj4+IGZvciB0IGluIHRlc3RzOgorICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQorICAgICAzICBTYW1wbGVDbGFzcworICAgICAzICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcworICAgICAxICBTYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcy5fX2luaXRfXworICAgICAxICBTYW1wbGVDbGFzcy5fX2luaXRfXworICAgICAyICBTYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kCisgICAgIDEgIFNhbXBsZUNsYXNzLmFfcHJvcGVydHkKKyAgICAgMSAgU2FtcGxlQ2xhc3MuYV9zdGF0aWNtZXRob2QKKyAgICAgMSAgU2FtcGxlQ2xhc3MuZG91YmxlCisgICAgIDEgIFNhbXBsZUNsYXNzLmdldAorCitOZXctc3R5bGUgY2xhc3NlcyBhcmUgYWxzbyBzdXBwb3J0ZWQ6CisKKyAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChTYW1wbGVOZXdTdHlsZUNsYXNzKQorICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKKyAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKKyAgICAgMSAgU2FtcGxlTmV3U3R5bGVDbGFzcworICAgICAxICBTYW1wbGVOZXdTdHlsZUNsYXNzLl9faW5pdF9fCisgICAgIDEgIFNhbXBsZU5ld1N0eWxlQ2xhc3MuZG91YmxlCisgICAgIDEgIFNhbXBsZU5ld1N0eWxlQ2xhc3MuZ2V0CisKK0ZpbmRpbmcgVGVzdHMgaW4gTW9kdWxlcworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitGb3IgYSBtb2R1bGUsIERvY1Rlc3RGaW5kZXIgd2lsbCBjcmVhdGUgYSB0ZXN0IGZvciB0aGUgY2xhc3MncworZG9jc3RyaW5nLCBhbmQgd2lsbCByZWN1cnNpdmVseSBleHBsb3JlIGl0cyBjb250ZW50cywgaW5jbHVkaW5nCitmdW5jdGlvbnMsIGNsYXNzZXMsIGFuZCB0aGUgYF9fdGVzdF9fYCBkaWN0aW9uYXJ5LCBpZiBpdCBleGlzdHM6CisKKyAgICA+Pj4gIyBBIG1vZHVsZQorICAgID4+PiBpbXBvcnQgdHlwZXMKKyAgICA+Pj4gbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ3NvbWVfbW9kdWxlJykKKyAgICA+Pj4gZGVmIHRyaXBsZSh2YWwpOgorICAgIC4uLiAgICAgJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgdHJpcGxlKDExKQorICAgIC4uLiAgICAgMzMKKyAgICAuLi4gICAgICcnJworICAgIC4uLiAgICAgcmV0dXJuIHZhbCozCisgICAgPj4+IG0uX19kaWN0X18udXBkYXRlKHsKKyAgICAuLi4gICAgICdzYW1wbGVfZnVuYyc6IHNhbXBsZV9mdW5jLAorICAgIC4uLiAgICAgJ1NhbXBsZUNsYXNzJzogU2FtcGxlQ2xhc3MsCisgICAgLi4uICAgICAnX19kb2NfXyc6ICcnJworICAgIC4uLiAgICAgICAgIE1vZHVsZSBkb2NzdHJpbmcuCisgICAgLi4uICAgICAgICAgICAgID4+PiBwcmludCAnbW9kdWxlJworICAgIC4uLiAgICAgICAgICAgICBtb2R1bGUKKyAgICAuLi4gICAgICAgICAnJycsCisgICAgLi4uICAgICAnX190ZXN0X18nOiB7CisgICAgLi4uICAgICAgICAgJ2QnOiAnPj4+IHByaW50IDZcbjZcbj4+PiBwcmludCA3XG43XG4nLAorICAgIC4uLiAgICAgICAgICdjJzogdHJpcGxlfX0pCisKKyAgICA+Pj4gZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkKKyAgICA+Pj4gIyBVc2UgbW9kdWxlPXRlc3QudGVzdF9kb2N0ZXN0LCB0byBwcmV2ZW50IGRvY3Rlc3QgZnJvbQorICAgID4+PiAjIGlnbm9yaW5nIHRoZSBvYmplY3RzIHNpbmNlIHRoZXkgd2VyZW4ndCBkZWZpbmVkIGluIG0uCisgICAgPj4+IGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgID4+PiB0ZXN0cyA9IGZpbmRlci5maW5kKG0sIG1vZHVsZT10ZXN0LnRlc3RfZG9jdGVzdCkKKyAgICA+Pj4gZm9yIHQgaW4gdGVzdHM6CisgICAgLi4uICAgICBwcmludCAnJTJzICAlcycgJSAobGVuKHQuZXhhbXBsZXMpLCB0Lm5hbWUpCisgICAgIDEgIHNvbWVfbW9kdWxlCisgICAgIDMgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzCisgICAgIDMgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLk5lc3RlZENsYXNzCisgICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLl9faW5pdF9fCisgICAgIDEgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLl9faW5pdF9fCisgICAgIDIgIHNvbWVfbW9kdWxlLlNhbXBsZUNsYXNzLmFfY2xhc3NtZXRob2QKKyAgICAgMSAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuYV9wcm9wZXJ0eQorICAgICAxICBzb21lX21vZHVsZS5TYW1wbGVDbGFzcy5hX3N0YXRpY21ldGhvZAorICAgICAxICBzb21lX21vZHVsZS5TYW1wbGVDbGFzcy5kb3VibGUKKyAgICAgMSAgc29tZV9tb2R1bGUuU2FtcGxlQ2xhc3MuZ2V0CisgICAgIDEgIHNvbWVfbW9kdWxlLl9fdGVzdF9fLmMKKyAgICAgMiAgc29tZV9tb2R1bGUuX190ZXN0X18uZAorICAgICAxICBzb21lX21vZHVsZS5zYW1wbGVfZnVuYworCitEdXBsaWNhdGUgUmVtb3ZhbAorfn5+fn5+fn5+fn5+fn5+fn4KK0lmIGEgc2luZ2xlIG9iamVjdCBpcyBsaXN0ZWQgdHdpY2UgKHVuZGVyIGRpZmZlcmVudCBuYW1lcyksIHRoZW4gdGVzdHMKK3dpbGwgb25seSBiZSBnZW5lcmF0ZWQgZm9yIGl0IG9uY2U6CisKKyAgICA+Pj4gZnJvbSB0ZXN0IGltcG9ydCBkb2N0ZXN0X2FsaWFzZXMKKyAgICA+Pj4gYXNzZXJ0IGRvY3Rlc3RfYWxpYXNlcy5Ud29OYW1lcy5mCisgICAgPj4+IGFzc2VydCBkb2N0ZXN0X2FsaWFzZXMuVHdvTmFtZXMuZworICAgID4+PiB0ZXN0cyA9IGV4Y2xfZW1wdHlfZmluZGVyLmZpbmQoZG9jdGVzdF9hbGlhc2VzKQorICAgID4+PiBwcmludCBsZW4odGVzdHMpCisgICAgMgorICAgID4+PiBwcmludCB0ZXN0c1swXS5uYW1lCisgICAgdGVzdC5kb2N0ZXN0X2FsaWFzZXMuVHdvTmFtZXMKKworICAgIFR3b05hbWVzLmYgYW5kIFR3b05hbWVzLmcgYXJlIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdC4KKyAgICBXZSBjYW4ndCBndWVzcyB3aGljaCB3aWxsIGJlIGZvdW5kIGluIGRvY3Rlc3QncyB0cmF2ZXJzYWwgb2YKKyAgICBUd29OYW1lcy5fX2RpY3RfXyBmaXJzdCwgc28gd2UgaGF2ZSB0byBhbGxvdyBmb3IgZWl0aGVyLgorCisgICAgPj4+IHRlc3RzWzFdLm5hbWUuc3BsaXQoJy4nKVstMV0gaW4gWydmJywgJ2cnXQorICAgIFRydWUKKworRW1wdHkgVGVzdHMKK35+fn5+fn5+fn5+CitCeSBkZWZhdWx0LCBhbiBvYmplY3Qgd2l0aCBubyBkb2N0ZXN0cyBkb2Vzbid0IGNyZWF0ZSBhbnkgdGVzdHM6CisKKyAgICA+Pj4gdGVzdHMgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKFNhbXBsZUNsYXNzKQorICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKKyAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKKyAgICAgMyAgU2FtcGxlQ2xhc3MKKyAgICAgMyAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MKKyAgICAgMSAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MuX19pbml0X18KKyAgICAgMSAgU2FtcGxlQ2xhc3MuX19pbml0X18KKyAgICAgMiAgU2FtcGxlQ2xhc3MuYV9jbGFzc21ldGhvZAorICAgICAxICBTYW1wbGVDbGFzcy5hX3Byb3BlcnR5CisgICAgIDEgIFNhbXBsZUNsYXNzLmFfc3RhdGljbWV0aG9kCisgICAgIDEgIFNhbXBsZUNsYXNzLmRvdWJsZQorICAgICAxICBTYW1wbGVDbGFzcy5nZXQKKworQnkgZGVmYXVsdCwgdGhhdCBleGNsdWRlZCBvYmplY3RzIHdpdGggbm8gZG9jdGVzdHMuICBleGNsdWRlX2VtcHR5PUZhbHNlCit0ZWxscyBpdCB0byBpbmNsdWRlIChlbXB0eSkgdGVzdHMgZm9yIG9iamVjdHMgd2l0aCBubyBkb2N0ZXN0cy4gIFRoaXMgZmVhdHVyZQoraXMgcmVhbGx5IHRvIHN1cHBvcnQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpbiB3aGF0IGRvY3Rlc3QubWFzdGVyLnN1bW1hcml6ZSgpCitkaXNwbGF5cy4KKworICAgID4+PiB0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcihleGNsdWRlX2VtcHR5PUZhbHNlKS5maW5kKFNhbXBsZUNsYXNzKQorICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKKyAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKKyAgICAgMyAgU2FtcGxlQ2xhc3MKKyAgICAgMyAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MKKyAgICAgMSAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MuX19pbml0X18KKyAgICAgMCAgU2FtcGxlQ2xhc3MuTmVzdGVkQ2xhc3MuZ2V0CisgICAgIDAgIFNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLnNxdWFyZQorICAgICAxICBTYW1wbGVDbGFzcy5fX2luaXRfXworICAgICAyICBTYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kCisgICAgIDEgIFNhbXBsZUNsYXNzLmFfcHJvcGVydHkKKyAgICAgMSAgU2FtcGxlQ2xhc3MuYV9zdGF0aWNtZXRob2QKKyAgICAgMSAgU2FtcGxlQ2xhc3MuZG91YmxlCisgICAgIDEgIFNhbXBsZUNsYXNzLmdldAorCitUdXJuaW5nIG9mZiBSZWN1cnNpb24KK35+fn5+fn5+fn5+fn5+fn5+fn5+fgorRG9jVGVzdEZpbmRlciBjYW4gYmUgdG9sZCBub3QgdG8gbG9vayBmb3IgdGVzdHMgaW4gY29udGFpbmVkIG9iamVjdHMKK3VzaW5nIHRoZSBgcmVjdXJzZWAgZmxhZzoKKworICAgID4+PiB0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcihyZWN1cnNlPUZhbHNlKS5maW5kKFNhbXBsZUNsYXNzKQorICAgID4+PiBmb3IgdCBpbiB0ZXN0czoKKyAgICAuLi4gICAgIHByaW50ICclMnMgICVzJyAlIChsZW4odC5leGFtcGxlcyksIHQubmFtZSkKKyAgICAgMyAgU2FtcGxlQ2xhc3MKKworTGluZSBudW1iZXJzCit+fn5+fn5+fn5+fn4KK0RvY1Rlc3RGaW5kZXIgZmluZHMgdGhlIGxpbmUgbnVtYmVyIG9mIGVhY2ggZXhhbXBsZToKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICcnJworICAgIC4uLiAgICAgPj4+IHggPSAxMgorICAgIC4uLgorICAgIC4uLiAgICAgc29tZSB0ZXh0CisgICAgLi4uCisgICAgLi4uICAgICA+Pj4gIyBleGFtcGxlcyBhcmUgbm90IGNyZWF0ZWQgZm9yIGNvbW1lbnRzICYgYmFyZSBwcm9tcHRzLgorICAgIC4uLiAgICAgPj4+CisgICAgLi4uICAgICAuLi4KKyAgICAuLi4KKyAgICAuLi4gICAgID4+PiBmb3IgeCBpbiByYW5nZSgxMCk6CisgICAgLi4uICAgICAuLi4gICAgIHByaW50IHgsCisgICAgLi4uICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5CisgICAgLi4uICAgICA+Pj4geC8vMgorICAgIC4uLiAgICAgNgorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IFtlLmxpbmVubyBmb3IgZSBpbiB0ZXN0LmV4YW1wbGVzXQorICAgIFsxLCA5LCAxMl0KKyIiIgorCitkZWYgdGVzdF9Eb2NUZXN0UGFyc2VyKCk6IHIiIiIKK1VuaXQgdGVzdHMgZm9yIHRoZSBgRG9jVGVzdFBhcnNlcmAgY2xhc3MuCisKK0RvY1Rlc3RQYXJzZXIgaXMgdXNlZCB0byBwYXJzZSBkb2NzdHJpbmdzIGNvbnRhaW5pbmcgZG9jdGVzdCBleGFtcGxlcy4KKworVGhlIGBwYXJzZWAgbWV0aG9kIGRpdmlkZXMgYSBkb2NzdHJpbmcgaW50byBleGFtcGxlcyBhbmQgaW50ZXJ2ZW5pbmcKK3RleHQ6CisKKyAgICA+Pj4gcyA9ICcnJworICAgIC4uLiAgICAgPj4+IHgsIHkgPSAyLCAzICAjIG5vIG91dHB1dCBleHBlY3RlZAorICAgIC4uLiAgICAgPj4+IGlmIDE6CisgICAgLi4uICAgICAuLi4gICAgIHByaW50IHgKKyAgICAuLi4gICAgIC4uLiAgICAgcHJpbnQgeQorICAgIC4uLiAgICAgMgorICAgIC4uLiAgICAgMworICAgIC4uLgorICAgIC4uLiAgICAgU29tZSB0ZXh0LgorICAgIC4uLiAgICAgPj4+IHgreQorICAgIC4uLiAgICAgNQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHBhcnNlciA9IGRvY3Rlc3QuRG9jVGVzdFBhcnNlcigpCisgICAgPj4+IGZvciBwaWVjZSBpbiBwYXJzZXIucGFyc2Uocyk6CisgICAgLi4uICAgICBpZiBpc2luc3RhbmNlKHBpZWNlLCBkb2N0ZXN0LkV4YW1wbGUpOgorICAgIC4uLiAgICAgICAgIHByaW50ICdFeGFtcGxlOicsIChwaWVjZS5zb3VyY2UsIHBpZWNlLndhbnQsIHBpZWNlLmxpbmVubykKKyAgICAuLi4gICAgIGVsc2U6CisgICAgLi4uICAgICAgICAgcHJpbnQgJyAgIFRleHQ6JywgYHBpZWNlYAorICAgICAgIFRleHQ6ICdcbicKKyAgICBFeGFtcGxlOiAoJ3gsIHkgPSAyLCAzICAjIG5vIG91dHB1dCBleHBlY3RlZFxuJywgJycsIDEpCisgICAgICAgVGV4dDogJycKKyAgICBFeGFtcGxlOiAoJ2lmIDE6XG4gICAgcHJpbnQgeFxuICAgIHByaW50IHlcbicsICcyXG4zXG4nLCAyKQorICAgICAgIFRleHQ6ICdcblNvbWUgdGV4dC5cbicKKyAgICBFeGFtcGxlOiAoJ3greVxuJywgJzVcbicsIDkpCisgICAgICAgVGV4dDogJycKKworVGhlIGBnZXRfZXhhbXBsZXNgIG1ldGhvZCByZXR1cm5zIGp1c3QgdGhlIGV4YW1wbGVzOgorCisgICAgPj4+IGZvciBwaWVjZSBpbiBwYXJzZXIuZ2V0X2V4YW1wbGVzKHMpOgorICAgIC4uLiAgICAgcHJpbnQgKHBpZWNlLnNvdXJjZSwgcGllY2Uud2FudCwgcGllY2UubGluZW5vKQorICAgICgneCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkXG4nLCAnJywgMSkKKyAgICAoJ2lmIDE6XG4gICAgcHJpbnQgeFxuICAgIHByaW50IHlcbicsICcyXG4zXG4nLCAyKQorICAgICgneCt5XG4nLCAnNVxuJywgOSkKKworVGhlIGBnZXRfZG9jdGVzdGAgbWV0aG9kIGNyZWF0ZXMgYSBUZXN0IGZyb20gdGhlIGV4YW1wbGVzLCBhbG9uZyB3aXRoIHRoZQorZ2l2ZW4gYXJndW1lbnRzOgorCisgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3Qocywge30sICduYW1lJywgJ2ZpbGVuYW1lJywgbGluZW5vPTUpCisgICAgPj4+ICh0ZXN0Lm5hbWUsIHRlc3QuZmlsZW5hbWUsIHRlc3QubGluZW5vKQorICAgICgnbmFtZScsICdmaWxlbmFtZScsIDUpCisgICAgPj4+IGZvciBwaWVjZSBpbiB0ZXN0LmV4YW1wbGVzOgorICAgIC4uLiAgICAgcHJpbnQgKHBpZWNlLnNvdXJjZSwgcGllY2Uud2FudCwgcGllY2UubGluZW5vKQorICAgICgneCwgeSA9IDIsIDMgICMgbm8gb3V0cHV0IGV4cGVjdGVkXG4nLCAnJywgMSkKKyAgICAoJ2lmIDE6XG4gICAgcHJpbnQgeFxuICAgIHByaW50IHlcbicsICcyXG4zXG4nLCAyKQorICAgICgneCt5XG4nLCAnNVxuJywgOSkKKyIiIgorCitjbGFzcyB0ZXN0X0RvY1Rlc3RSdW5uZXI6CisgICAgZGVmIGJhc2ljcygpOiByIiIiCitVbml0IHRlc3RzIGZvciB0aGUgYERvY1Rlc3RSdW5uZXJgIGNsYXNzLgorCitEb2NUZXN0UnVubmVyIGlzIHVzZWQgdG8gcnVuIERvY1Rlc3QgdGVzdCBjYXNlcywgYW5kIHRvIGFjY3VtdWxhdGUKK3N0YXRpc3RpY3MuICBIZXJlJ3MgYSBzaW1wbGUgRG9jVGVzdCBjYXNlIHdlIGNhbiB1c2U6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICAnJycKKyAgICAuLi4gICAgID4+PiB4ID0gMTIKKyAgICAuLi4gICAgID4+PiBwcmludCB4CisgICAgLi4uICAgICAxMgorICAgIC4uLiAgICAgPj4+IHgvLzIKKyAgICAuLi4gICAgIDYKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorCitUaGUgbWFpbiBEb2NUZXN0UnVubmVyIGludGVyZmFjZSBpcyB0aGUgYHJ1bmAgbWV0aG9kLCB3aGljaCBydW5zIGEKK2dpdmVuIERvY1Rlc3QgY2FzZSBpbiBhIGdpdmVuIG5hbWVzcGFjZSAoZ2xvYnMpLiAgSXQgcmV0dXJucyBhIHR1cGxlCitgKGYsdClgLCB3aGVyZSBgZmAgaXMgdGhlIG51bWJlciBvZiBmYWlsZWQgdGVzdHMgYW5kIGB0YCBpcyB0aGUgbnVtYmVyCitvZiB0cmllZCB0ZXN0cy4KKworICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0zKQorCitJZiBhbnkgZXhhbXBsZSBwcm9kdWNlcyBpbmNvcnJlY3Qgb3V0cHV0LCB0aGVuIHRoZSB0ZXN0IHJ1bm5lciByZXBvcnRzCit0aGUgZmFpbHVyZSBhbmQgcHJvY2VlZHMgdG8gdGhlIG5leHQgZXhhbXBsZToKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICcnJworICAgIC4uLiAgICAgPj4+IHggPSAxMgorICAgIC4uLiAgICAgPj4+IHByaW50IHgKKyAgICAuLi4gICAgIDE0CisgICAgLi4uICAgICA+Pj4geC8vMgorICAgIC4uLiAgICAgNgorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPVRydWUpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIFRyeWluZzoKKyAgICAgICAgeCA9IDEyCisgICAgRXhwZWN0aW5nIG5vdGhpbmcKKyAgICBvaworICAgIFRyeWluZzoKKyAgICAgICAgcHJpbnQgeAorICAgIEV4cGVjdGluZzoKKyAgICAgICAgMTQKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgNCwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCB4CisgICAgRXhwZWN0ZWQ6CisgICAgICAgIDE0CisgICAgR290OgorICAgICAgICAxMgorICAgIFRyeWluZzoKKyAgICAgICAgeC8vMgorICAgIEV4cGVjdGluZzoKKyAgICAgICAgNgorICAgIG9rCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0zKQorIiIiCisgICAgZGVmIHZlcmJvc2VfZmxhZygpOiByIiIiCitUaGUgYHZlcmJvc2VgIGZsYWcgbWFrZXMgdGhlIHRlc3QgcnVubmVyIGdlbmVyYXRlIG1vcmUgZGV0YWlsZWQKK291dHB1dDoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICcnJworICAgIC4uLiAgICAgPj4+IHggPSAxMgorICAgIC4uLiAgICAgPj4+IHByaW50IHgKKyAgICAuLi4gICAgIDEyCisgICAgLi4uICAgICA+Pj4geC8vMgorICAgIC4uLiAgICAgNgorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9VHJ1ZSkucnVuKHRlc3QpCisgICAgVHJ5aW5nOgorICAgICAgICB4ID0gMTIKKyAgICBFeHBlY3Rpbmcgbm90aGluZworICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICBwcmludCB4CisgICAgRXhwZWN0aW5nOgorICAgICAgICAxMgorICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICB4Ly8yCisgICAgRXhwZWN0aW5nOgorICAgICAgICA2CisgICAgb2sKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTMpCisKK0lmIHRoZSBgdmVyYm9zZWAgZmxhZyBpcyB1bnNwZWNpZmllZCwgdGhlbiB0aGUgb3V0cHV0IHdpbGwgYmUgdmVyYm9zZQoraWZmIGAtdmAgYXBwZWFycyBpbiBzeXMuYXJndjoKKworICAgID4+PiAjIFNhdmUgdGhlIHJlYWwgc3lzLmFyZ3YgbGlzdC4KKyAgICA+Pj4gb2xkX2FyZ3YgPSBzeXMuYXJndgorCisgICAgPj4+ICMgSWYgLXYgZG9lcyBub3QgYXBwZWFyIGluIHN5cy5hcmd2LCB0aGVuIG91dHB1dCBpc24ndCB2ZXJib3NlLgorICAgID4+PiBzeXMuYXJndiA9IFsndGVzdCddCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcigpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MykKKworICAgID4+PiAjIElmIC12IGRvZXMgYXBwZWFyIGluIHN5cy5hcmd2LCB0aGVuIG91dHB1dCBpcyB2ZXJib3NlLgorICAgID4+PiBzeXMuYXJndiA9IFsndGVzdCcsICctdiddCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcigpLnJ1bih0ZXN0KQorICAgIFRyeWluZzoKKyAgICAgICAgeCA9IDEyCisgICAgRXhwZWN0aW5nIG5vdGhpbmcKKyAgICBvaworICAgIFRyeWluZzoKKyAgICAgICAgcHJpbnQgeAorICAgIEV4cGVjdGluZzoKKyAgICAgICAgMTIKKyAgICBvaworICAgIFRyeWluZzoKKyAgICAgICAgeC8vMgorICAgIEV4cGVjdGluZzoKKyAgICAgICAgNgorICAgIG9rCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0zKQorCisgICAgPj4+ICMgUmVzdG9yZSBzeXMuYXJndgorICAgID4+PiBzeXMuYXJndiA9IG9sZF9hcmd2CisKK0luIHRoZSByZW1haW5pbmcgZXhhbXBsZXMsIHRoZSB0ZXN0IHJ1bm5lcidzIHZlcmJvc2l0eSB3aWxsIGJlCitleHBsaWNpdGx5IHNldCwgdG8gZW5zdXJlIHRoYXQgdGhlIHRlc3QgYmVoYXZpb3IgaXMgY29uc2lzdGVudC4KKyAgICAiIiIKKyAgICBkZWYgZXhjZXB0aW9ucygpOiByIiIiCitUZXN0cyBvZiBgRG9jVGVzdFJ1bm5lcmAncyBleGNlcHRpb24gaGFuZGxpbmcuCisKK0FuIGV4cGVjdGVkIGV4Y2VwdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCBhIHRyYWNlYmFjayBtZXNzYWdlLiAgVGhlCitsaW5lcyBiZXR3ZWVuIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgdHlwZS92YWx1ZSBtYXkgYmUgb21pdHRlZCBvcgorcmVwbGFjZWQgd2l0aCBhbnkgb3RoZXIgc3RyaW5nOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJycnCisgICAgLi4uICAgICA+Pj4geCA9IDEyCisgICAgLi4uICAgICA+Pj4gcHJpbnQgeC8vMAorICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorCitBbiBleGFtcGxlIG1heSBub3QgZ2VuZXJhdGUgb3V0cHV0IGJlZm9yZSBpdCByYWlzZXMgYW4gZXhjZXB0aW9uOyBpZgoraXQgZG9lcywgdGhlbiB0aGUgdHJhY2ViYWNrIG1lc3NhZ2Ugd2lsbCBub3QgYmUgcmVjb2duaXplZCBhcworc2lnbmFsaW5nIGFuIGV4cGVjdGVkIGV4Y2VwdGlvbiwgc28gdGhlIGV4YW1wbGUgd2lsbCBiZSByZXBvcnRlZCBhcyBhbgordW5leHBlY3RlZCBleGNlcHRpb246CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICAnJycKKyAgICAuLi4gICAgID4+PiB4ID0gMTIKKyAgICAuLi4gICAgID4+PiBwcmludCAncHJlLWV4Y2VwdGlvbiBvdXRwdXQnLCB4Ly8wCisgICAgLi4uICAgICBwcmUtZXhjZXB0aW9uIG91dHB1dAorICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDQsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgJ3ByZS1leGNlcHRpb24gb3V0cHV0JywgeC8vMAorICAgIEV4Y2VwdGlvbiByYWlzZWQ6CisgICAgICAgIC4uLgorICAgICAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybworICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKKworRXhjZXB0aW9uIG1lc3NhZ2VzIG1heSBjb250YWluIG5ld2xpbmVzOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IsICdtdWx0aVxubGluZVxubWVzc2FnZScKKyAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4gICAgIFZhbHVlRXJyb3I6IG11bHRpCisgICAgLi4uICAgICBsaW5lCisgICAgLi4uICAgICBtZXNzYWdlCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworSWYgYW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkLCBidXQgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHdyb25nIHR5cGUgb3IKK21lc3NhZ2UgaXMgcmFpc2VkLCB0aGVuIGl0IGlzIHJlcG9ydGVkIGFzIGEgZmFpbHVyZToKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiByYWlzZSBWYWx1ZUVycm9yLCAnbWVzc2FnZScKKyAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4gICAgIFZhbHVlRXJyb3I6IHdyb25nIG1lc3NhZ2UKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ21lc3NhZ2UnCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgVmFsdWVFcnJvcjogd3JvbmcgbWVzc2FnZQorICAgIEdvdDoKKyAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAuLi4KKyAgICAgICAgVmFsdWVFcnJvcjogbWVzc2FnZQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworSG93ZXZlciwgSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwgY2FuIGJlIHVzZWQgdG8gYWxsb3cgYSBtaXNtYXRjaCBpbiB0aGUKK2RldGFpbDoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiByYWlzZSBWYWx1ZUVycm9yLCAnbWVzc2FnZScgI2RvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAorICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgVmFsdWVFcnJvcjogd3JvbmcgbWVzc2FnZQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCisKK0lHTk9SRV9FWENFUFRJT05fREVUQUlMIGFsc28gaWdub3JlcyBkaWZmZXJlbmNlIGluIGV4Y2VwdGlvbiBmb3JtYXR0aW5nCitiZXR3ZWVuIFB5dGhvbiB2ZXJzaW9ucy4gRm9yIGV4YW1wbGUsIGluIFB5dGhvbiAzLngsIHRoZSBtb2R1bGUgcGF0aCBvZgordGhlIGV4Y2VwdGlvbiBpcyBpbiB0aGUgb3V0cHV0LCBidXQgdGhpcyB3aWxsIGZhaWwgdW5kZXIgUHl0aG9uIDI6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gZnJvbSBodHRwbGliIGltcG9ydCBIVFRQRXhjZXB0aW9uCisgICAgLi4uICAgICA+Pj4gcmFpc2UgSFRUUEV4Y2VwdGlvbignbWVzc2FnZScpCisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBodHRwbGliLkhUVFBFeGNlcHRpb246IG1lc3NhZ2UKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDQsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbignbWVzc2FnZScpCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgaHR0cGxpYi5IVFRQRXhjZXB0aW9uOiBtZXNzYWdlCisgICAgR290OgorICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgIC4uLgorICAgICAgICBIVFRQRXhjZXB0aW9uOiBtZXNzYWdlCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorCitCdXQgaW4gUHl0aG9uIDIgdGhlIG1vZHVsZSBwYXRoIGlzIG5vdCBpbmNsdWRlZCwgYW4gdGhlcmVmb3JlIGEgdGVzdCBtdXN0IGxvb2sKK2xpa2UgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIHN1Y2NlZWQgaW4gUHl0aG9uIDIuIEJ1dCB0aGF0IHRlc3Qgd2lsbCBmYWlsIHVuZGVyCitQeXRob24gMy4KKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiBmcm9tIGh0dHBsaWIgaW1wb3J0IEhUVFBFeGNlcHRpb24KKyAgICAuLi4gICAgID4+PiByYWlzZSBIVFRQRXhjZXB0aW9uKCdtZXNzYWdlJykKKyAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4gICAgIEhUVFBFeGNlcHRpb246IG1lc3NhZ2UKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorCitIb3dldmVyLCB3aXRoIElHTk9SRV9FWENFUFRJT05fREVUQUlMLCB0aGUgbW9kdWxlIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbgorKGlmIGFueSkgd2lsbCBiZSBpZ25vcmVkOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IGZyb20gaHR0cGxpYiBpbXBvcnQgSFRUUEV4Y2VwdGlvbgorICAgIC4uLiAgICAgPj4+IHJhaXNlIEhUVFBFeGNlcHRpb24oJ21lc3NhZ2UnKSAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uICAgICBIVFRQRXhjZXB0aW9uOiBtZXNzYWdlCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKworVGhlIG1vZHVsZSBwYXRoIHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkLCBzbyB0d28gZGlmZmVyZW50IG1vZHVsZSBwYXRocyB3aWxsCitzdGlsbCBwYXNzIGlmIElHTk9SRV9FWENFUFRJT05fREVUQUlMIGlzIGdpdmVuLiBUaGlzIGlzIGludGVudGlvbmFsLCBzbyBpdCBjYW4KK2JlIHVzZWQgd2hlbiBleGNlcHRpb25zIGhhdmUgY2hhbmdlZCBtb2R1bGUuCisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gZnJvbSBodHRwbGliIGltcG9ydCBIVFRQRXhjZXB0aW9uCisgICAgLi4uICAgICA+Pj4gcmFpc2UgSFRUUEV4Y2VwdGlvbignbWVzc2FnZScpICNkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKyAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4gICAgIGZvby5iYXIuSFRUUEV4Y2VwdGlvbjogbWVzc2FnZQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisKK0J1dCBJR05PUkVfRVhDRVBUSU9OX0RFVEFJTCBkb2VzIG5vdCBhbGxvdyBhIG1pc21hdGNoIGluIHRoZSBleGNlcHRpb24gdHlwZToKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiByYWlzZSBWYWx1ZUVycm9yLCAnbWVzc2FnZScgI2RvY3Rlc3Q6ICtJR05PUkVfRVhDRVBUSU9OX0RFVEFJTAorICAgIC4uLiAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIC4uLiAgICAgVHlwZUVycm9yOiB3cm9uZyB0eXBlCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAzLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdtZXNzYWdlJyAjZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgVHlwZUVycm9yOiB3cm9uZyB0eXBlCisgICAgR290OgorICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgIC4uLgorICAgICAgICBWYWx1ZUVycm9yOiBtZXNzYWdlCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorCitJZiBhbiBleGNlcHRpb24gaXMgcmFpc2VkIGJ1dCBub3QgZXhwZWN0ZWQsIHRoZW4gaXQgaXMgcmVwb3J0ZWQgYXMgYW4KK3VuZXhwZWN0ZWQgZXhjZXB0aW9uOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IDEvLzAKKyAgICAuLi4gICAgIDAKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgMS8vMAorICAgIEV4Y2VwdGlvbiByYWlzZWQ6CisgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAgLi4uCisgICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorIiIiCisgICAgZGVmIGRpc3BsYXlob29rKCk6IHIiIiIKK1Rlc3QgdGhhdCBjaGFuZ2luZyBzeXMuZGlzcGxheWhvb2sgZG9lc24ndCBtYXR0ZXIgZm9yIGRvY3Rlc3QuCisKKyAgICA+Pj4gaW1wb3J0IHN5cworICAgID4+PiBvcmlnX2Rpc3BsYXlob29rID0gc3lzLmRpc3BsYXlob29rCisgICAgPj4+IGRlZiBteV9kaXNwbGF5aG9vayh4KToKKyAgICAuLi4gICAgIHByaW50KCdoaSEnKQorICAgID4+PiBzeXMuZGlzcGxheWhvb2sgPSBteV9kaXNwbGF5aG9vaworICAgID4+PiBkZWYgZigpOgorICAgIC4uLiAgICAgJycnCisgICAgLi4uICAgICA+Pj4gMworICAgIC4uLiAgICAgMworICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IHIgPSBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgPj4+IHBvc3RfZGlzcGxheWhvb2sgPSBzeXMuZGlzcGxheWhvb2sKKworICAgIFdlIG5lZWQgdG8gcmVzdG9yZSBzeXMuZGlzcGxheWhvb2sgbm93LCBzbyB0aGF0IHdlJ2xsIGJlIGFibGUgdG8gdGVzdAorICAgIHJlc3VsdHMuCisKKyAgICA+Pj4gc3lzLmRpc3BsYXlob29rID0gb3JpZ19kaXNwbGF5aG9vaworCisgICAgT2ssIG5vdyB3ZSBjYW4gY2hlY2sgdGhhdCBldmVyeXRoaW5nIGlzIG9rLgorCisgICAgPj4+IHIKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCisgICAgPj4+IHBvc3RfZGlzcGxheWhvb2sgaXMgbXlfZGlzcGxheWhvb2sKKyAgICBUcnVlCisiIiIKKyAgICBkZWYgb3B0aW9uZmxhZ3MoKTogciIiIgorVGVzdHMgb2YgYERvY1Rlc3RSdW5uZXJgJ3Mgb3B0aW9uIGZsYWcgaGFuZGxpbmcuCisKK1NldmVyYWwgb3B0aW9uIGZsYWdzIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHRlc3QKK3J1bm5lci4gIFRoZXNlIGFyZSBkZWZpbmVkIGFzIG1vZHVsZSBjb25zdGFudHMgaW4gZG9jdGVzdCwgYW5kIHBhc3NlZAordG8gdGhlIERvY1Rlc3RSdW5uZXIgY29uc3RydWN0b3IgKG11bHRpcGxlIGNvbnN0YW50cyBzaG91bGQgYmUgT1JlZAordG9nZXRoZXIpLgorCitUaGUgRE9OVF9BQ0NFUFRfVFJVRV9GT1JfMSBmbGFnIGRpc2FibGVzIG1hdGNoZXMgYmV0d2VlbiBUcnVlL0ZhbHNlCithbmQgMS8wOgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgJz4+PiBUcnVlXG4xXG4nCisKKyAgICA+Pj4gIyBXaXRob3V0IHRoZSBmbGFnOgorICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0xKQorCisgICAgPj4+ICMgV2l0aCB0aGUgZmxhZzoKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LkRPTlRfQUNDRVBUX1RSVUVfRk9SXzEKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBUcnVlCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIDEKKyAgICBHb3Q6CisgICAgICAgIFRydWUKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCisKK1RoZSBET05UX0FDQ0VQVF9CTEFOS0xJTkUgZmxhZyBkaXNhYmxlcyB0aGUgbWF0Y2ggYmV0d2VlbiBibGFuayBsaW5lcworYW5kIHRoZSAnPEJMQU5LTElORT4nIG1hcmtlcjoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICc+Pj4gcHJpbnQgImFcXG5cXG5iIlxuYVxuPEJMQU5LTElORT5cbmJcbicKKworICAgID4+PiAjIFdpdGhvdXQgdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCisKKyAgICA+Pj4gIyBXaXRoIHRoZSBmbGFnOgorICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBmbGFncyA9IGRvY3Rlc3QuRE9OVF9BQ0NFUFRfQkxBTktMSU5FCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgImFcblxuYiIKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgYQorICAgICAgICA8QkxBTktMSU5FPgorICAgICAgICBiCisgICAgR290OgorICAgICAgICBhCisgICAgPEJMQU5LTElORT4KKyAgICAgICAgYgorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworVGhlIE5PUk1BTElaRV9XSElURVNQQUNFIGZsYWcgY2F1c2VzIGFsbCBzZXF1ZW5jZXMgb2Ygd2hpdGVzcGFjZSB0byBiZQordHJlYXRlZCBhcyBlcXVhbDoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICc+Pj4gcHJpbnQgMSwgMiwgM1xuICAxICAgMlxuIDMnCisKKyAgICA+Pj4gIyBXaXRob3V0IHRoZSBmbGFnOgorICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgMSwgMiwgMworICAgIEV4cGVjdGVkOgorICAgICAgICAgIDEgICAyCisgICAgICAgICAzCisgICAgR290OgorICAgICAgICAxIDIgMworICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworICAgID4+PiAjIFdpdGggdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGZsYWdzID0gZG9jdGVzdC5OT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworICAgIEFuIGV4YW1wbGUgZnJvbSB0aGUgZG9jczoKKyAgICA+Pj4gcHJpbnQgcmFuZ2UoMjApICNkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICBbMCwgICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksCisgICAgMTAsICAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5XQorCitUaGUgRUxMSVBTSVMgZmxhZyBjYXVzZXMgZWxsaXBzaXMgbWFya2VyICgiLi4uIikgaW4gdGhlIGV4cGVjdGVkCitvdXRwdXQgdG8gbWF0Y2ggYW55IHN1YnN0cmluZyBpbiB0aGUgYWN0dWFsIG91dHB1dDoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgICc+Pj4gcHJpbnQgcmFuZ2UoMTUpXG5bMCwgMSwgMiwgLi4uLCAxNF1cbicKKworICAgID4+PiAjIFdpdGhvdXQgdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCByYW5nZSgxNSkKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgWzAsIDEsIDIsIC4uLiwgMTRdCisgICAgR290OgorICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0XQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworICAgID4+PiAjIFdpdGggdGhlIGZsYWc6CisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGZsYWdzID0gZG9jdGVzdC5FTExJUFNJUworICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworICAgIC4uLiBhbHNvIG1hdGNoZXMgbm90aGluZzoKKworICAgID4+PiBmb3IgaSBpbiByYW5nZSgxMDApOgorICAgIC4uLiAgICAgcHJpbnQgaSoqMiwgI2RvY3Rlc3Q6ICtFTExJUFNJUworICAgIDAgMS4uLjQuLi45IDE2IC4uLiAzNiA0OSA2NCAuLi4gOTgwMQorCisgICAgLi4uIGNhbiBiZSBzdXJwcmlzaW5nOyBlLmcuLCB0aGlzIHRlc3QgcGFzc2VzOgorCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDIxKTogI2RvY3Rlc3Q6ICtFTExJUFNJUworICAgIC4uLiAgICAgcHJpbnQgaSwKKyAgICAwIDEgMiAuLi4xLi4uMi4uLjAKKworICAgIEV4YW1wbGVzIGZyb20gdGhlIGRvY3M6CisKKyAgICA+Pj4gcHJpbnQgcmFuZ2UoMjApICMgZG9jdGVzdDorRUxMSVBTSVMKKyAgICBbMCwgMSwgLi4uLCAxOCwgMTldCisKKyAgICA+Pj4gcHJpbnQgcmFuZ2UoMjApICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgLi4uICAgICAgICAgICAgICAgICAjIGRvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgIFswLCAgICAxLCAuLi4sICAgMTgsICAgIDE5XQorCitUaGUgU0tJUCBmbGFnIGNhdXNlcyBhbiBleGFtcGxlIHRvIGJlIHNraXBwZWQgZW50aXJlbHkuICBJLmUuLCB0aGUKK2V4YW1wbGUgaXMgbm90IHJ1bi4gIEl0IGNhbiBiZSB1c2VmdWwgaW4gY29udGV4dHMgd2hlcmUgZG9jdGVzdAorZXhhbXBsZXMgc2VydmUgYXMgYm90aCBkb2N1bWVudGF0aW9uIGFuZCB0ZXN0IGNhc2VzLCBhbmQgYW4gZXhhbXBsZQorc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzLCBidXQgc2hvdWxkIG5vdCBiZQorY2hlY2tlZCAoZS5nLiwgYmVjYXVzZSBpdHMgb3V0cHV0IGlzIHJhbmRvbSwgb3IgZGVwZW5kcyBvbiByZXNvdXJjZXMKK3doaWNoIHdvdWxkIGJlIHVuYXZhaWxhYmxlLikgIFRoZSBTS0lQIGZsYWcgY2FuIGFsc28gYmUgdXNlZCBmb3IKKydjb21tZW50aW5nIG91dCcgYnJva2VuIGV4YW1wbGVzLgorCisgICAgPj4+IGltcG9ydCB1bmF2YWlsYWJsZV9yZXNvdXJjZSAgICAgICAgICAgIyBkb2N0ZXN0OiArU0tJUAorICAgID4+PiB1bmF2YWlsYWJsZV9yZXNvdXJjZS5kb19zb21ldGhpbmcoKSAgICMgZG9jdGVzdDogK1NLSVAKKyAgICA+Pj4gdW5hdmFpbGFibGVfcmVzb3VyY2UuYmxvd191cCgpICAgICAgICAjIGRvY3Rlc3Q6ICtTS0lQCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAuLi4KKyAgICBVbmNoZWNrZWRCbG93VXBFcnJvcjogIE5vYm9keSBjaGVja3MgbWUuCisKKyAgICA+Pj4gaW1wb3J0IHJhbmRvbQorICAgID4+PiBwcmludCByYW5kb20ucmFuZG9tKCkgIyBkb2N0ZXN0OiArU0tJUAorICAgIDAuNzIxMjE2OTIzODg5CisKK1RoZSBSRVBPUlRfVURJRkYgZmxhZyBjYXVzZXMgZmFpbHVyZXMgdGhhdCBpbnZvbHZlIG11bHRpLWxpbmUgZXhwZWN0ZWQKK2FuZCBhY3R1YWwgb3V0cHV0cyB0byBiZSBkaXNwbGF5ZWQgdXNpbmcgYSB1bmlmaWVkIGRpZmY6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgJ1xuJy5qb2luKCdhYmNkZWZnJykKKyAgICAuLi4gICAgIGEKKyAgICAuLi4gICAgIEIKKyAgICAuLi4gICAgIGMKKyAgICAuLi4gICAgIGQKKyAgICAuLi4gICAgIGYKKyAgICAuLi4gICAgIGcKKyAgICAuLi4gICAgIGgKKyAgICAuLi4gICAgICcnJworCisgICAgPj4+ICMgV2l0aG91dCB0aGUgZmxhZzoKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAzLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50ICdcbicuam9pbignYWJjZGVmZycpCisgICAgRXhwZWN0ZWQ6CisgICAgICAgIGEKKyAgICAgICAgQgorICAgICAgICBjCisgICAgICAgIGQKKyAgICAgICAgZgorICAgICAgICBnCisgICAgICAgIGgKKyAgICBHb3Q6CisgICAgICAgIGEKKyAgICAgICAgYgorICAgICAgICBjCisgICAgICAgIGQKKyAgICAgICAgZQorICAgICAgICBmCisgICAgICAgIGcKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCisKKyAgICA+Pj4gIyBXaXRoIHRoZSBmbGFnOgorICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBmbGFncyA9IGRvY3Rlc3QuUkVQT1JUX1VESUZGCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgJ1xuJy5qb2luKCdhYmNkZWZnJykKKyAgICBEaWZmZXJlbmNlcyAodW5pZmllZCBkaWZmIHdpdGggLWV4cGVjdGVkICthY3R1YWwpOgorICAgICAgICBAQCAtMSw3ICsxLDcgQEAKKyAgICAgICAgIGEKKyAgICAgICAgLUIKKyAgICAgICAgK2IKKyAgICAgICAgIGMKKyAgICAgICAgIGQKKyAgICAgICAgK2UKKyAgICAgICAgIGYKKyAgICAgICAgIGcKKyAgICAgICAgLWgKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTEpCisKK1RoZSBSRVBPUlRfQ0RJRkYgZmxhZyBjYXVzZXMgZmFpbHVyZXMgdGhhdCBpbnZvbHZlIG11bHRpLWxpbmUgZXhwZWN0ZWQKK2FuZCBhY3R1YWwgb3V0cHV0cyB0byBiZSBkaXNwbGF5ZWQgdXNpbmcgYSBjb250ZXh0IGRpZmY6CisKKyAgICA+Pj4gIyBSZXVzZSBmKCkgZnJvbSB0aGUgUkVQT1JUX1VESUZGIGV4YW1wbGUsIGFib3ZlLgorICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBmbGFncyA9IGRvY3Rlc3QuUkVQT1JUX0NESUZGCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlLCBvcHRpb25mbGFncz1mbGFncykucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDMsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgJ1xuJy5qb2luKCdhYmNkZWZnJykKKyAgICBEaWZmZXJlbmNlcyAoY29udGV4dCBkaWZmIHdpdGggZXhwZWN0ZWQgZm9sbG93ZWQgYnkgYWN0dWFsKToKKyAgICAgICAgKioqKioqKioqKioqKioqCisgICAgICAgICoqKiAxLDcgKioqKgorICAgICAgICAgIGEKKyAgICAgICAgISBCCisgICAgICAgICAgYworICAgICAgICAgIGQKKyAgICAgICAgICBmCisgICAgICAgICAgZworICAgICAgICAtIGgKKyAgICAgICAgLS0tIDEsNyAtLS0tCisgICAgICAgICAgYQorICAgICAgICAhIGIKKyAgICAgICAgICBjCisgICAgICAgICAgZAorICAgICAgICArIGUKKyAgICAgICAgICBmCisgICAgICAgICAgZworICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MSkKKworCitUaGUgUkVQT1JUX05ESUZGIGZsYWcgY2F1c2VzIGZhaWx1cmVzIHRvIHVzZSB0aGUgZGlmZmxpYi5EaWZmZXIgYWxnb3JpdGhtCit1c2VkIGJ5IHRoZSBwb3B1bGFyIG5kaWZmLnB5IHV0aWxpdHkuICBUaGlzIGRvZXMgaW50cmFsaW5lIGRpZmZlcmVuY2UKK21hcmtpbmcsIGFzIHdlbGwgYXMgaW50ZXJsaW5lIGRpZmZlcmVuY2VzLgorCisgICAgPj4+IGRlZiBmKHgpOgorICAgIC4uLiAgICAgcicnJworICAgIC4uLiAgICAgPj4+IHByaW50ICJhIGIgIGMgZCBlIGYgZyBoIGkgICBqIGsgbCBtIgorICAgIC4uLiAgICAgYSBiIGMgZCBlIGYgZyBoIGkgaiBrIDEgbQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGZsYWdzID0gZG9jdGVzdC5SRVBPUlRfTkRJRkYKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMywgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAiYSBiICBjIGQgZSBmIGcgaCBpICAgaiBrIGwgbSIKKyAgICBEaWZmZXJlbmNlcyAobmRpZmYgd2l0aCAtZXhwZWN0ZWQgK2FjdHVhbCk6CisgICAgICAgIC0gYSBiIGMgZCBlIGYgZyBoIGkgaiBrIDEgbQorICAgICAgICA/ICAgICAgICAgICAgICAgICAgICAgICBeCisgICAgICAgICsgYSBiICBjIGQgZSBmIGcgaCBpICAgaiBrIGwgbQorICAgICAgICA/ICAgICArICAgICAgICAgICAgICArKyAgICBeCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0xKQorCitUaGUgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSBzdXBwcmVzc2VzIHJlc3VsdCBvdXRwdXQgYWZ0ZXIgdGhlIGZpcnN0CitmYWlsaW5nIGV4YW1wbGU6CisKKyAgICA+Pj4gZGVmIGYoeCk6CisgICAgLi4uICAgICByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgMSAjIGZpcnN0IHN1Y2Nlc3MKKyAgICAuLi4gICAgIDEKKyAgICAuLi4gICAgID4+PiBwcmludCAyICMgZmlyc3QgZmFpbHVyZQorICAgIC4uLiAgICAgMjAwCisgICAgLi4uICAgICA+Pj4gcHJpbnQgMyAjIHNlY29uZCBmYWlsdXJlCisgICAgLi4uICAgICAzMDAKKyAgICAuLi4gICAgID4+PiBwcmludCA0ICMgc2Vjb25kIHN1Y2Nlc3MKKyAgICAuLi4gICAgIDQKKyAgICAuLi4gICAgID4+PiBwcmludCA1ICMgdGhpcmQgZmFpbHVyZQorICAgIC4uLiAgICAgNTAwCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZmxhZ3MgPSBkb2N0ZXN0LlJFUE9SVF9PTkxZX0ZJUlNUX0ZBSUxVUkUKKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgNSwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAyICMgZmlyc3QgZmFpbHVyZQorICAgIEV4cGVjdGVkOgorICAgICAgICAyMDAKKyAgICBHb3Q6CisgICAgICAgIDIKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MywgYXR0ZW1wdGVkPTUpCisKK0hvd2V2ZXIsIG91dHB1dCBmcm9tIGByZXBvcnRfc3RhcnRgIGlzIG5vdCBzdXBwcmVzc2VkOgorCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPVRydWUsIG9wdGlvbmZsYWdzPWZsYWdzKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICBUcnlpbmc6CisgICAgICAgIHByaW50IDEgIyBmaXJzdCBzdWNjZXNzCisgICAgRXhwZWN0aW5nOgorICAgICAgICAxCisgICAgb2sKKyAgICBUcnlpbmc6CisgICAgICAgIHByaW50IDIgIyBmaXJzdCBmYWlsdXJlCisgICAgRXhwZWN0aW5nOgorICAgICAgICAyMDAKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgNSwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCAyICMgZmlyc3QgZmFpbHVyZQorICAgIEV4cGVjdGVkOgorICAgICAgICAyMDAKKyAgICBHb3Q6CisgICAgICAgIDIKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MywgYXR0ZW1wdGVkPTUpCisKK0ZvciB0aGUgcHVycG9zZXMgb2YgUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRSwgdW5leHBlY3RlZCBleGNlcHRpb25zCitjb3VudCBhcyBmYWlsdXJlczoKKworICAgID4+PiBkZWYgZih4KToKKyAgICAuLi4gICAgIHInJycKKyAgICAuLi4gICAgID4+PiBwcmludCAxICMgZmlyc3Qgc3VjY2VzcworICAgIC4uLiAgICAgMQorICAgIC4uLiAgICAgPj4+IHJhaXNlIFZhbHVlRXJyb3IoMikgIyBmaXJzdCBmYWlsdXJlCisgICAgLi4uICAgICAyMDAKKyAgICAuLi4gICAgID4+PiBwcmludCAzICMgc2Vjb25kIGZhaWx1cmUKKyAgICAuLi4gICAgIDMwMAorICAgIC4uLiAgICAgPj4+IHByaW50IDQgIyBzZWNvbmQgc3VjY2VzcworICAgIC4uLiAgICAgNAorICAgIC4uLiAgICAgPj4+IHByaW50IDUgIyB0aGlyZCBmYWlsdXJlCisgICAgLi4uICAgICA1MDAKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBmbGFncyA9IGRvY3Rlc3QuUkVQT1JUX09OTFlfRklSU1RfRkFJTFVSRQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSwgb3B0aW9uZmxhZ3M9ZmxhZ3MpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSA1LCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoMikgIyBmaXJzdCBmYWlsdXJlCisgICAgRXhjZXB0aW9uIHJhaXNlZDoKKyAgICAgICAgLi4uCisgICAgICAgIFZhbHVlRXJyb3I6IDIKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MywgYXR0ZW1wdGVkPTUpCisKK05ldyBvcHRpb24gZmxhZ3MgY2FuIGFsc28gYmUgcmVnaXN0ZXJlZCwgdmlhIHJlZ2lzdGVyX29wdGlvbmZsYWcoKS4gIEhlcmUKK3dlIHJlYWNoIGludG8gZG9jdGVzdCdzIGludGVybmFscyBhIGJpdC4KKworICAgID4+PiB1bmxpa2VseSA9ICJVTkxJS0VMWV9PUFRJT05fTkFNRSIKKyAgICA+Pj4gdW5saWtlbHkgaW4gZG9jdGVzdC5PUFRJT05GTEFHU19CWV9OQU1FCisgICAgRmFsc2UKKyAgICA+Pj4gbmV3X2ZsYWdfdmFsdWUgPSBkb2N0ZXN0LnJlZ2lzdGVyX29wdGlvbmZsYWcodW5saWtlbHkpCisgICAgPj4+IHVubGlrZWx5IGluIGRvY3Rlc3QuT1BUSU9ORkxBR1NfQllfTkFNRQorICAgIFRydWUKKworQmVmb3JlIDIuNC40LzIuNSwgcmVnaXN0ZXJpbmcgYSBuYW1lIG1vcmUgdGhhbiBvbmNlIGVycm9uZW91c2x5IGNyZWF0ZWQKK21vcmUgdGhhbiBvbmUgZmxhZyB2YWx1ZS4gIEhlcmUgd2UgdmVyaWZ5IHRoYXQncyBmaXhlZDoKKworICAgID4+PiByZWR1bmRhbnRfZmxhZ192YWx1ZSA9IGRvY3Rlc3QucmVnaXN0ZXJfb3B0aW9uZmxhZyh1bmxpa2VseSkKKyAgICA+Pj4gcmVkdW5kYW50X2ZsYWdfdmFsdWUgPT0gbmV3X2ZsYWdfdmFsdWUKKyAgICBUcnVlCisKK0NsZWFuIHVwLgorICAgID4+PiBkZWwgZG9jdGVzdC5PUFRJT05GTEFHU19CWV9OQU1FW3VubGlrZWx5XQorCisgICAgIiIiCisKKyAgICBkZWYgb3B0aW9uX2RpcmVjdGl2ZXMoKTogciIiIgorVGVzdHMgb2YgYERvY1Rlc3RSdW5uZXJgJ3Mgb3B0aW9uIGRpcmVjdGl2ZSBtZWNoYW5pc20uCisKK09wdGlvbiBkaXJlY3RpdmVzIGNhbiBiZSB1c2VkIHRvIHR1cm4gb3B0aW9uIGZsYWdzIG9uIG9yIG9mZiBmb3IgYQorc2luZ2xlIGV4YW1wbGUuICBUbyB0dXJuIGFuIG9wdGlvbiBvbiBmb3IgYW4gZXhhbXBsZSwgZm9sbG93IHRoYXQKK2V4YW1wbGUgd2l0aCBhIGNvbW1lbnQgb2YgdGhlIGZvcm0gYGAjIGRvY3Rlc3Q6ICtPUFRJT05gYDoKKworICAgID4+PiBkZWYgZih4KTogcicnJworICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIHNob3VsZCBmYWlsOiBubyBlbGxpcHNpcworICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICAuLi4KKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSAyLCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHJhbmdlKDEwKSAgICAgICAjIHNob3VsZCBmYWlsOiBubyBlbGxpcHNpcworICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgLi4uLCA5XQorICAgIEdvdDoKKyAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorCitUbyB0dXJuIGFuIG9wdGlvbiBvZmYgZm9yIGFuIGV4YW1wbGUsIGZvbGxvdyB0aGF0IGV4YW1wbGUgd2l0aCBhCitjb21tZW50IG9mIHRoZSBmb3JtIGBgIyBkb2N0ZXN0OiAtT1BUSU9OYGA6CisKKyAgICA+Pj4gZGVmIGYoeCk6IHInJycKKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkKKyAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCisgICAgLi4uCisgICAgLi4uICAgICA+Pj4gIyBzaG91bGQgZmFpbDogbm8gZWxsaXBzaXMKKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBkb2N0ZXN0OiAtRUxMSVBTSVMKKyAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UsCisgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25mbGFncz1kb2N0ZXN0LkVMTElQU0lTKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgNiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCByYW5nZSgxMCkgICAgICAgIyBkb2N0ZXN0OiAtRUxMSVBTSVMKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICBHb3Q6CisgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKKworT3B0aW9uIGRpcmVjdGl2ZXMgYWZmZWN0IG9ubHkgdGhlIGV4YW1wbGUgdGhhdCB0aGV5IGFwcGVhciB3aXRoOyB0aGV5CitkbyBub3QgY2hhbmdlIHRoZSBvcHRpb25zIGZvciBzdXJyb3VuZGluZyBleGFtcGxlczoKKworICAgID4+PiBkZWYgZih4KTogcicnJworICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsOiBubyBlbGxpcHNpcworICAgIC4uLiAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICAuLi4KKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAuLi4gICAgIFswLCAxLCAuLi4sIDldCisgICAgLi4uCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWw6IG5vIGVsbGlwc2lzCisgICAgLi4uICAgICBbMCwgMSwgLi4uLCA5XQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbDogbm8gZWxsaXBzaXMKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgWzAsIDEsIC4uLiwgOV0KKyAgICBHb3Q6CisgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlIC4uLiwgbGluZSA4LCBpbiBmCisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsOiBubyBlbGxpcHNpcworICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgLi4uLCA5XQorICAgIEdvdDoKKyAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTIsIGF0dGVtcHRlZD0zKQorCitNdWx0aXBsZSBvcHRpb25zIG1heSBiZSBtb2RpZmllZCBieSBhIHNpbmdsZSBvcHRpb24gZGlyZWN0aXZlLiAgVGhleQorbWF5IGJlIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlLCBjb21tYXMsIG9yIGJvdGg6CisKKyAgICA+Pj4gZGVmIGYoeCk6IHInJycKKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAorICAgIC4uLiAgICAgWzAsIDEsICAuLi4sICAgOV0KKyAgICAuLi4gICAgID4+PiBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgc3VjY2VlZAorICAgIC4uLiAgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgIC4uLiAgICAgWzAsIDEsICAuLi4sICAgOV0KKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgLi4uLCBsaW5lIDIsIGluIGYKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWwKKyAgICBFeHBlY3RlZDoKKyAgICAgICAgWzAsIDEsICAuLi4sICAgOV0KKyAgICBHb3Q6CisgICAgICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9MikKKworICAgID4+PiBkZWYgZih4KTogcicnJworICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBmYWlsCisgICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKSAgICAgICAjIFNob3VsZCBzdWNjZWVkCisgICAgLi4uICAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMsK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAorICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIEdvdDoKKyAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorCisgICAgPj4+IGRlZiBmKHgpOiByJycnCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIGZhaWwKKyAgICAuLi4gICAgIFswLCAxLCAgLi4uLCAgIDldCisgICAgLi4uICAgICA+Pj4gcHJpbnQgcmFuZ2UoMTApICAgICAgICMgU2hvdWxkIHN1Y2NlZWQKKyAgICAuLi4gICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUywgK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgLi4uICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAuLi4sIGxpbmUgMiwgaW4gZgorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBwcmludCByYW5nZSgxMCkgICAgICAgIyBTaG91bGQgZmFpbAorICAgIEV4cGVjdGVkOgorICAgICAgICBbMCwgMSwgIC4uLiwgICA5XQorICAgIEdvdDoKKyAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorCitUaGUgb3B0aW9uIGRpcmVjdGl2ZSBtYXkgYmUgcHV0IG9uIHRoZSBsaW5lIGZvbGxvd2luZyB0aGUgc291cmNlLCBhcworbG9uZyBhcyBhIGNvbnRpbnVhdGlvbiBwcm9tcHQgaXMgdXNlZDoKKworICAgID4+PiBkZWYgZih4KTogcicnJworICAgIC4uLiAgICAgPj4+IHByaW50IHJhbmdlKDEwKQorICAgIC4uLiAgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgLi4uICAgICBbMCwgMSwgLi4uLCA5XQorICAgIC4uLiAgICAgJycnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCisgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKS5ydW4odGVzdCkKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTEpCisKK0ZvciBleGFtcGxlcyB3aXRoIG11bHRpLWxpbmUgc291cmNlLCB0aGUgb3B0aW9uIGRpcmVjdGl2ZSBtYXkgYXBwZWFyCithdCB0aGUgZW5kIG9mIGFueSBsaW5lOgorCisgICAgPj4+IGRlZiBmKHgpOiByJycnCisgICAgLi4uICAgICA+Pj4gZm9yIHggaW4gcmFuZ2UoMTApOiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIC4uLiAgICAgLi4uICAgICBwcmludCB4LAorICAgIC4uLiAgICAgMCAxIDIgLi4uIDkKKyAgICAuLi4KKyAgICAuLi4gICAgID4+PiBmb3IgeCBpbiByYW5nZSgxMCk6CisgICAgLi4uICAgICAuLi4gICAgIHByaW50IHgsICAgICAgICAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgIC4uLiAgICAgMCAxIDIgLi4uIDkKKyAgICAuLi4gICAgICcnJworICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQorICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorCitJZiBtb3JlIHRoYW4gb25lIGxpbmUgb2YgYW4gZXhhbXBsZSB3aXRoIG11bHRpLWxpbmUgc291cmNlIGhhcyBhbgorb3B0aW9uIGRpcmVjdGl2ZSwgdGhlbiB0aGV5IGFyZSBjb21iaW5lZDoKKworICAgID4+PiBkZWYgZih4KTogcicnJworICAgIC4uLiAgICAgU2hvdWxkIGZhaWwgKG9wdGlvbiBkaXJlY3RpdmUgbm90IG9uIHRoZSBsYXN0IGxpbmUpOgorICAgIC4uLiAgICAgICAgID4+PiBmb3IgeCBpbiByYW5nZSgxMCk6ICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgLi4uICAgICAgICAgLi4uICAgICBwcmludCB4LCAgICAgICAgIyBkb2N0ZXN0OiArTk9STUFMSVpFX1dISVRFU1BBQ0UKKyAgICAuLi4gICAgICAgICAwICAxICAgIDIuLi45CisgICAgLi4uICAgICAnJycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KKyAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKworSXQgaXMgYW4gZXJyb3IgdG8gaGF2ZSBhIGNvbW1lbnQgb2YgdGhlIGZvcm0gYGAjIGRvY3Rlc3Q6YGAgdGhhdCBpcworKm5vdCogZm9sbG93ZWQgYnkgd29yZHMgb2YgdGhlIGZvcm0gYGArT1BUSU9OYGAgb3IgYGAtT1BUSU9OYGAsIHdoZXJlCitgYE9QVElPTmBgIGlzIGFuIG9wdGlvbiB0aGF0IGhhcyBiZWVuIHJlZ2lzdGVyZWQgd2l0aAorYHJlZ2lzdGVyX29wdGlvbmA6CisKKyAgICA+Pj4gIyBFcnJvcjogT3B0aW9uIG5vdCByZWdpc3RlcmVkCisgICAgPj4+IHMgPSAnPj4+IHByaW50IDEyICAgI2RvY3Rlc3Q6ICtCQURPUFRJT04nCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RQYXJzZXIoKS5nZXRfZG9jdGVzdChzLCB7fSwgJ3MnLCAncy5weScsIDApCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IGxpbmUgMSBvZiB0aGUgZG9jdGVzdCBmb3IgcyBoYXMgYW4gaW52YWxpZCBvcHRpb246ICcrQkFET1BUSU9OJworCisgICAgPj4+ICMgRXJyb3I6IE5vICsgb3IgLSBwcmVmaXgKKyAgICA+Pj4gcyA9ICc+Pj4gcHJpbnQgMTIgICAjZG9jdGVzdDogRUxMSVBTSVMnCisgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RQYXJzZXIoKS5nZXRfZG9jdGVzdChzLCB7fSwgJ3MnLCAncy5weScsIDApCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFZhbHVlRXJyb3I6IGxpbmUgMSBvZiB0aGUgZG9jdGVzdCBmb3IgcyBoYXMgYW4gaW52YWxpZCBvcHRpb246ICdFTExJUFNJUycKKworSXQgaXMgYW4gZXJyb3IgdG8gdXNlIGFuIG9wdGlvbiBkaXJlY3RpdmUgb24gYSBsaW5lIHRoYXQgY29udGFpbnMgbm8KK3NvdXJjZToKKworICAgID4+PiBzID0gJz4+PiAjIGRvY3Rlc3Q6ICtFTExJUFNJUycKKyAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdFBhcnNlcigpLmdldF9kb2N0ZXN0KHMsIHt9LCAncycsICdzLnB5JywgMCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogbGluZSAwIG9mIHRoZSBkb2N0ZXN0IGZvciBzIGhhcyBhbiBvcHRpb24gZGlyZWN0aXZlIG9uIGEgbGluZSB3aXRoIG5vIGV4YW1wbGU6ICcjIGRvY3Rlc3Q6ICtFTExJUFNJUycKKworICAgICIiIgorCisgICAgZGVmIHRlc3RfdW5pY29kZV9vdXRwdXQoc2VsZik6IHIiIiIKKworQ2hlY2sgdGhhdCB1bmljb2RlIG91dHB1dCB3b3JrczoKKworICAgID4+PiB1J1x4ZTknCisgICAgdSdceGU5JworCitJZiB3ZSByZXR1cm4gdW5pY29kZSwgU3Bvb2ZPdXQncyBidWYgdmFyaWFibGUgYmVjb21lcyBhdXRvbWFnaWNhbGx5Citjb252ZXJ0ZWQgdG8gdW5pY29kZS4gVGhpcyBtZWFucyBhbGwgc3Vic2VxdWVudCBvdXRwdXQgYmVjb21lcyBjb252ZXJ0ZWQKK3RvIHVuaWNvZGUsIGFuZCBpZiB0aGUgb3V0cHV0IGNvbnRhaW5zIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIHRoYXQgZmFpbGVkLgorSXQgdXNlZCB0byBiZSB0aGF0IHRoaXMgc3RhdGUgY2hhbmdlIGNhcnJpZWQgb24gYmV0d2VlbiB0ZXN0cywgbWVhbmluZwordGVzdHMgd291bGQgZmFpbCBpZiB1bmljb2RlIGhhcyBiZWVuIG91dHB1dCBwcmV2aW91c2x5IGluIHRoZSB0ZXN0cnVuLgorVGhpcyB0ZXN0IHRlc3RzIHRoYXQgdGhpcyBpcyBubyBsb25nZXIgc286CisKKyAgICA+Pj4gcHJpbnQgdSdhYmMnCisgICAgYWJjCisKK0FuZCB0aGVuIHJldHVybiBhIHN0cmluZyB3aXRoIG5vbi1hc2NpaSBjaGFyYWN0ZXJzOgorCisgICAgPj4+IHByaW50IHUnXHhlOScuZW5jb2RlKCd1dGYtOCcpCisgICAgw6kKKworICAgICIiIgorCisKK2RlZiB0ZXN0X3Rlc3Rzb3VyY2UoKTogciIiIgorVW5pdCB0ZXN0cyBmb3IgYHRlc3Rzb3VyY2UoKWAuCisKK1RoZSB0ZXN0c291cmNlKCkgZnVuY3Rpb24gdGFrZXMgYSBtb2R1bGUgYW5kIGEgbmFtZSwgZmluZHMgdGhlIChmaXJzdCkKK3Rlc3Qgd2l0aCB0aGF0IG5hbWUgaW4gdGhhdCBtb2R1bGUsIGFuZCBjb252ZXJ0cyBpdCB0byBhIHNjcmlwdC4gVGhlCitleGFtcGxlIGNvZGUgaXMgY29udmVydGVkIHRvIHJlZ3VsYXIgUHl0aG9uIGNvZGUuICBUaGUgc3Vycm91bmRpbmcKK3dvcmRzIGFuZCBleHBlY3RlZCBvdXRwdXQgYXJlIGNvbnZlcnRlZCB0byBjb21tZW50czoKKworICAgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICA+Pj4gbmFtZSA9ICd0ZXN0LnRlc3RfZG9jdGVzdC5zYW1wbGVfZnVuYycKKyAgICA+Pj4gcHJpbnQgZG9jdGVzdC50ZXN0c291cmNlKHRlc3QudGVzdF9kb2N0ZXN0LCBuYW1lKQorICAgICMgQmxhaCBibGFoCisgICAgIworICAgIHByaW50IHNhbXBsZV9mdW5jKDIyKQorICAgICMgRXhwZWN0ZWQ6CisgICAgIyMgNDQKKyAgICAjCisgICAgIyBZZWUgaGEhCisgICAgPEJMQU5LTElORT4KKworICAgID4+PiBuYW1lID0gJ3Rlc3QudGVzdF9kb2N0ZXN0LlNhbXBsZU5ld1N0eWxlQ2xhc3MnCisgICAgPj4+IHByaW50IGRvY3Rlc3QudGVzdHNvdXJjZSh0ZXN0LnRlc3RfZG9jdGVzdCwgbmFtZSkKKyAgICBwcmludCAnMVxuMlxuMycKKyAgICAjIEV4cGVjdGVkOgorICAgICMjIDEKKyAgICAjIyAyCisgICAgIyMgMworICAgIDxCTEFOS0xJTkU+CisKKyAgICA+Pj4gbmFtZSA9ICd0ZXN0LnRlc3RfZG9jdGVzdC5TYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kJworICAgID4+PiBwcmludCBkb2N0ZXN0LnRlc3Rzb3VyY2UodGVzdC50ZXN0X2RvY3Rlc3QsIG5hbWUpCisgICAgcHJpbnQgU2FtcGxlQ2xhc3MuYV9jbGFzc21ldGhvZCgxMCkKKyAgICAjIEV4cGVjdGVkOgorICAgICMjIDEyCisgICAgcHJpbnQgU2FtcGxlQ2xhc3MoMCkuYV9jbGFzc21ldGhvZCgxMCkKKyAgICAjIEV4cGVjdGVkOgorICAgICMjIDEyCisgICAgPEJMQU5LTElORT4KKyIiIgorCitkZWYgdGVzdF9kZWJ1ZygpOiByIiIiCisKK0NyZWF0ZSBhIGRvY3N0cmluZyB0aGF0IHdlIHdhbnQgdG8gZGVidWc6CisKKyAgICA+Pj4gcyA9ICcnJworICAgIC4uLiAgICAgPj4+IHggPSAxMgorICAgIC4uLiAgICAgPj4+IHByaW50IHgKKyAgICAuLi4gICAgIDEyCisgICAgLi4uICAgICAnJycKKworQ3JlYXRlIHNvbWUgZmFrZSBzdGRpbiBpbnB1dCwgdG8gZmVlZCB0byB0aGUgZGVidWdnZXI6CisKKyAgICA+Pj4gaW1wb3J0IHRlbXBmaWxlCisgICAgPj4+IHJlYWxfc3RkaW4gPSBzeXMuc3RkaW4KKyAgICA+Pj4gc3lzLnN0ZGluID0gX0Zha2VJbnB1dChbJ25leHQnLCAncHJpbnQgeCcsICdjb250aW51ZSddKQorCitSdW4gdGhlIGRlYnVnZ2VyIG9uIHRoZSBkb2NzdHJpbmcsIGFuZCB0aGVuIHJlc3RvcmUgc3lzLnN0ZGluLgorCisgICAgPj4+IHRyeTogZG9jdGVzdC5kZWJ1Z19zcmMocykKKyAgICAuLi4gZmluYWxseTogc3lzLnN0ZGluID0gcmVhbF9zdGRpbgorICAgID4gPHN0cmluZz4oMSk8bW9kdWxlPigpCisgICAgKFBkYikgbmV4dAorICAgIDEyCisgICAgLS1SZXR1cm4tLQorICAgID4gPHN0cmluZz4oMSk8bW9kdWxlPigpLT5Ob25lCisgICAgKFBkYikgcHJpbnQgeAorICAgIDEyCisgICAgKFBkYikgY29udGludWUKKworIiIiCisKK2RlZiB0ZXN0X3BkYl9zZXRfdHJhY2UoKToKKyAgICAiIiJVc2luZyBwZGIuc2V0X3RyYWNlIGZyb20gYSBkb2N0ZXN0LgorCisgICAgWW91IGNhbiB1c2UgcGRiLnNldF90cmFjZSBmcm9tIGEgZG9jdGVzdC4gIFRvIGRvIHNvLCB5b3UgbXVzdAorICAgIHJldHJpZXZlIHRoZSBzZXRfdHJhY2UgZnVuY3Rpb24gZnJvbSB0aGUgcGRiIG1vZHVsZSBhdCB0aGUgdGltZQorICAgIHlvdSB1c2UgaXQuICBUaGUgZG9jdGVzdCBtb2R1bGUgY2hhbmdlcyBzeXMuc3Rkb3V0IHNvIHRoYXQgaXQgY2FuCisgICAgY2FwdHVyZSBwcm9ncmFtIG91dHB1dC4gIEl0IGFsc28gdGVtcG9yYXJpbHkgcmVwbGFjZXMgcGRiLnNldF90cmFjZQorICAgIHdpdGggYSB2ZXJzaW9uIHRoYXQgcmVzdG9yZXMgc3Rkb3V0LiAgVGhpcyBpcyBuZWNlc3NhcnkgZm9yIHlvdSB0bworICAgIHNlZSBkZWJ1Z2dlciBvdXRwdXQuCisKKyAgICAgID4+PiBkb2MgPSAnJycKKyAgICAgIC4uLiA+Pj4geCA9IDQyCisgICAgICAuLi4gPj4+IHJhaXNlIEV4Y2VwdGlvbignY2zDqScpCisgICAgICAuLi4gVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uIEV4Y2VwdGlvbjogY2zDqQorICAgICAgLi4uID4+PiBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKKyAgICAgIC4uLiAnJycKKyAgICAgID4+PiBwYXJzZXIgPSBkb2N0ZXN0LkRvY1Rlc3RQYXJzZXIoKQorICAgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCB7fSwgImZvby1iw6RyQGJheiIsICJmb28tYsOkckBiYXoucHkiLCAwKQorICAgICAgPj4+IHJ1bm5lciA9IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPUZhbHNlKQorCisgICAgVG8gZGVtb25zdHJhdGUgdGhpcywgd2UnbGwgY3JlYXRlIGEgZmFrZSBzdGFuZGFyZCBpbnB1dCB0aGF0CisgICAgY2FwdHVyZXMgb3VyIGRlYnVnZ2VyIGlucHV0OgorCisgICAgICA+Pj4gaW1wb3J0IHRlbXBmaWxlCisgICAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgPj4+IHN5cy5zdGRpbiA9IF9GYWtlSW5wdXQoWworICAgICAgLi4uICAgICdwcmludCB4JywgICMgcHJpbnQgZGF0YSBkZWZpbmVkIGJ5IHRoZSBleGFtcGxlCisgICAgICAuLi4gICAgJ2NvbnRpbnVlJywgIyBzdG9wIGRlYnVnZ2luZworICAgICAgLi4uICAgICcnXSkKKworICAgICAgPj4+IHRyeTogcnVubmVyLnJ1bih0ZXN0KQorICAgICAgLi4uIGZpbmFsbHk6IHN5cy5zdGRpbiA9IHJlYWxfc3RkaW4KKyAgICAgIC0tUmV0dXJuLS0KKyAgICAgID4gPGRvY3Rlc3QgZm9vLWLDpHJAYmF6WzJdPigxKTxtb2R1bGU+KCktPk5vbmUKKyAgICAgIC0+IGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorICAgICAgKFBkYikgcHJpbnQgeAorICAgICAgNDIKKyAgICAgIChQZGIpIGNvbnRpbnVlCisgICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTMpCisKKyAgICAgIFlvdSBjYW4gYWxzbyBwdXQgcGRiLnNldF90cmFjZSBpbiBhIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGEgdGVzdDoKKworICAgICAgPj4+IGRlZiBjYWxsc19zZXRfdHJhY2UoKToKKyAgICAgIC4uLiAgICB5PTIKKyAgICAgIC4uLiAgICBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKKworICAgICAgPj4+IGRvYyA9ICcnJworICAgICAgLi4uID4+PiB4PTEKKyAgICAgIC4uLiA+Pj4gY2FsbHNfc2V0X3RyYWNlKCkKKyAgICAgIC4uLiAnJycKKyAgICAgID4+PiB0ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KGRvYywgZ2xvYmFscygpLCAiZm9vLWLDpHJAYmF6IiwgImZvby1iw6RyQGJhei5weSIsIDApCisgICAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgPj4+IHN5cy5zdGRpbiA9IF9GYWtlSW5wdXQoWworICAgICAgLi4uICAgICdwcmludCB5JywgICMgcHJpbnQgZGF0YSBkZWZpbmVkIGluIHRoZSBmdW5jdGlvbgorICAgICAgLi4uICAgICd1cCcsICAgICAgICMgb3V0IG9mIGZ1bmN0aW9uCisgICAgICAuLi4gICAgJ3ByaW50IHgnLCAgIyBwcmludCBkYXRhIGRlZmluZWQgYnkgdGhlIGV4YW1wbGUKKyAgICAgIC4uLiAgICAnY29udGludWUnLCAjIHN0b3AgZGVidWdnaW5nCisgICAgICAuLi4gICAgJyddKQorCisgICAgICA+Pj4gdHJ5OgorICAgICAgLi4uICAgICBydW5uZXIucnVuKHRlc3QpCisgICAgICAuLi4gZmluYWxseToKKyAgICAgIC4uLiAgICAgc3lzLnN0ZGluID0gcmVhbF9zdGRpbgorICAgICAgLS1SZXR1cm4tLQorICAgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VbOF0+KDMpY2FsbHNfc2V0X3RyYWNlKCktPk5vbmUKKyAgICAgIC0+IGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorICAgICAgKFBkYikgcHJpbnQgeQorICAgICAgMgorICAgICAgKFBkYikgdXAKKyAgICAgID4gPGRvY3Rlc3QgZm9vLWLDpHJAYmF6WzFdPigxKTxtb2R1bGU+KCkKKyAgICAgIC0+IGNhbGxzX3NldF90cmFjZSgpCisgICAgICAoUGRiKSBwcmludCB4CisgICAgICAxCisgICAgICAoUGRiKSBjb250aW51ZQorICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorCisgICAgRHVyaW5nIGludGVyYWN0aXZlIGRlYnVnZ2luZywgc291cmNlIGNvZGUgaXMgc2hvd24sIGV2ZW4gZm9yCisgICAgZG9jdGVzdCBleGFtcGxlczoKKworICAgICAgPj4+IGRvYyA9ICcnJworICAgICAgLi4uID4+PiBkZWYgZih4KToKKyAgICAgIC4uLiAuLi4gICAgIGcoeCoyKQorICAgICAgLi4uID4+PiBkZWYgZyh4KToKKyAgICAgIC4uLiAuLi4gICAgIHByaW50IHgrMworICAgICAgLi4uIC4uLiAgICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCisgICAgICAuLi4gPj4+IGYoMykKKyAgICAgIC4uLiAnJycKKyAgICAgID4+PiB0ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KGRvYywgZ2xvYmFscygpLCAiZm9vLWLDpHJAYmF6IiwgImZvby1iw6RyQGJhei5weSIsIDApCisgICAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgorICAgICAgPj4+IHN5cy5zdGRpbiA9IF9GYWtlSW5wdXQoWworICAgICAgLi4uICAgICdsaXN0JywgICAgICMgbGlzdCBzb3VyY2UgZnJvbSBleGFtcGxlIDIKKyAgICAgIC4uLiAgICAnbmV4dCcsICAgICAjIHJldHVybiBmcm9tIGcoKQorICAgICAgLi4uICAgICdsaXN0JywgICAgICMgbGlzdCBzb3VyY2UgZnJvbSBleGFtcGxlIDEKKyAgICAgIC4uLiAgICAnbmV4dCcsICAgICAjIHJldHVybiBmcm9tIGYoKQorICAgICAgLi4uICAgICdsaXN0JywgICAgICMgbGlzdCBzb3VyY2UgZnJvbSBleGFtcGxlIDMKKyAgICAgIC4uLiAgICAnY29udGludWUnLCAjIHN0b3AgZGVidWdnaW5nCisgICAgICAuLi4gICAgJyddKQorICAgICAgPj4+IHRyeTogcnVubmVyLnJ1bih0ZXN0KQorICAgICAgLi4uIGZpbmFsbHk6IHN5cy5zdGRpbiA9IHJlYWxfc3RkaW4KKyAgICAgIC4uLiAjIGRvY3Rlc3Q6ICtOT1JNQUxJWkVfV0hJVEVTUEFDRQorICAgICAgLS1SZXR1cm4tLQorICAgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMV0+KDMpZygpLT5Ob25lCisgICAgICAtPiBpbXBvcnQgcGRiOyBwZGIuc2V0X3RyYWNlKCkKKyAgICAgIChQZGIpIGxpc3QKKyAgICAgICAgMSAgICAgZGVmIGcoeCk6CisgICAgICAgIDIgICAgICAgICBwcmludCB4KzMKKyAgICAgICAgMyAgLT4gICAgIGltcG9ydCBwZGI7IHBkYi5zZXRfdHJhY2UoKQorICAgICAgW0VPRl0KKyAgICAgIChQZGIpIG5leHQKKyAgICAgIC0tUmV0dXJuLS0KKyAgICAgID4gPGRvY3Rlc3QgZm9vLWLDpHJAYmF6WzBdPigyKWYoKS0+Tm9uZQorICAgICAgLT4gZyh4KjIpCisgICAgICAoUGRiKSBsaXN0CisgICAgICAgIDEgICAgIGRlZiBmKHgpOgorICAgICAgICAyICAtPiAgICAgZyh4KjIpCisgICAgICBbRU9GXQorICAgICAgKFBkYikgbmV4dAorICAgICAgLS1SZXR1cm4tLQorICAgICAgPiA8ZG9jdGVzdCBmb28tYsOkckBiYXpbMl0+KDEpPG1vZHVsZT4oKS0+Tm9uZQorICAgICAgLT4gZigzKQorICAgICAgKFBkYikgbGlzdAorICAgICAgICAxICAtPiBmKDMpCisgICAgICBbRU9GXQorICAgICAgKFBkYikgY29udGludWUKKyAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIEZpbGUgImZvby1iw6RyQGJhei5weSIsIGxpbmUgNywgaW4gZm9vLWLDpHJAYmF6CisgICAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgICBmKDMpCisgICAgICBFeHBlY3RlZCBub3RoaW5nCisgICAgICBHb3Q6CisgICAgICAgICAgOQorICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0zKQorICAgICAgIiIiCisKK2RlZiB0ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkKCk6CisgICAgIiIiVGhpcyBpbGx1c3RyYXRlcyBtb3JlLWRlbWFuZGluZyB1c2Ugb2Ygc2V0X3RyYWNlIHdpdGggbmVzdGVkIGZ1bmN0aW9ucy4KKworICAgID4+PiBjbGFzcyBDKG9iamVjdCk6CisgICAgLi4uICAgICBkZWYgY2FsbHNfc2V0X3RyYWNlKHNlbGYpOgorICAgIC4uLiAgICAgICAgIHkgPSAxCisgICAgLi4uICAgICAgICAgaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCisgICAgLi4uICAgICAgICAgc2VsZi5mMSgpCisgICAgLi4uICAgICAgICAgeSA9IDIKKyAgICAuLi4gICAgIGRlZiBmMShzZWxmKToKKyAgICAuLi4gICAgICAgICB4ID0gMQorICAgIC4uLiAgICAgICAgIHNlbGYuZjIoKQorICAgIC4uLiAgICAgICAgIHggPSAyCisgICAgLi4uICAgICBkZWYgZjIoc2VsZik6CisgICAgLi4uICAgICAgICAgeiA9IDEKKyAgICAuLi4gICAgICAgICB6ID0gMgorCisgICAgPj4+IGNhbGxzX3NldF90cmFjZSA9IEMoKS5jYWxsc19zZXRfdHJhY2UKKworICAgID4+PiBkb2MgPSAnJycKKyAgICAuLi4gPj4+IGEgPSAxCisgICAgLi4uID4+PiBjYWxsc19zZXRfdHJhY2UoKQorICAgIC4uLiAnJycKKyAgICA+Pj4gcGFyc2VyID0gZG9jdGVzdC5Eb2NUZXN0UGFyc2VyKCkKKyAgICA+Pj4gcnVubmVyID0gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpCisgICAgPj4+IHRlc3QgPSBwYXJzZXIuZ2V0X2RvY3Rlc3QoZG9jLCBnbG9iYWxzKCksICJmb28tYsOkckBiYXoiLCAiZm9vLWLDpHJAYmF6LnB5IiwgMCkKKyAgICA+Pj4gcmVhbF9zdGRpbiA9IHN5cy5zdGRpbgorICAgID4+PiBzeXMuc3RkaW4gPSBfRmFrZUlucHV0KFsKKyAgICAuLi4gICAgJ3ByaW50IHknLCAgIyBwcmludCBkYXRhIGRlZmluZWQgaW4gdGhlIGZ1bmN0aW9uCisgICAgLi4uICAgICdzdGVwJywgJ3N0ZXAnLCAnc3RlcCcsICdzdGVwJywgJ3N0ZXAnLCAnc3RlcCcsICdwcmludCB6JywKKyAgICAuLi4gICAgJ3VwJywgJ3ByaW50IHgnLAorICAgIC4uLiAgICAndXAnLCAncHJpbnQgeScsCisgICAgLi4uICAgICd1cCcsICdwcmludCBmb28nLAorICAgIC4uLiAgICAnY29udGludWUnLCAjIHN0b3AgZGVidWdnaW5nCisgICAgLi4uICAgICcnXSkKKworICAgID4+PiB0cnk6CisgICAgLi4uICAgICBydW5uZXIucnVuKHRlc3QpCisgICAgLi4uIGZpbmFsbHk6CisgICAgLi4uICAgICBzeXMuc3RkaW4gPSByZWFsX3N0ZGluCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPig1KWNhbGxzX3NldF90cmFjZSgpCisgICAgLT4gc2VsZi5mMSgpCisgICAgKFBkYikgcHJpbnQgeQorICAgIDEKKyAgICAoUGRiKSBzdGVwCisgICAgLS1DYWxsLS0KKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDcpZjEoKQorICAgIC0+IGRlZiBmMShzZWxmKToKKyAgICAoUGRiKSBzdGVwCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPig4KWYxKCkKKyAgICAtPiB4ID0gMQorICAgIChQZGIpIHN0ZXAKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWRbMF0+KDkpZjEoKQorICAgIC0+IHNlbGYuZjIoKQorICAgIChQZGIpIHN0ZXAKKyAgICAtLUNhbGwtLQorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X2RvY3Rlc3QudGVzdF9wZGJfc2V0X3RyYWNlX25lc3RlZFswXT4oMTEpZjIoKQorICAgIC0+IGRlZiBmMihzZWxmKToKKyAgICAoUGRiKSBzdGVwCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPigxMilmMigpCisgICAgLT4geiA9IDEKKyAgICAoUGRiKSBzdGVwCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPigxMylmMigpCisgICAgLT4geiA9IDIKKyAgICAoUGRiKSBwcmludCB6CisgICAgMQorICAgIChQZGIpIHVwCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPig5KWYxKCkKKyAgICAtPiBzZWxmLmYyKCkKKyAgICAoUGRiKSBwcmludCB4CisgICAgMQorICAgIChQZGIpIHVwCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfZG9jdGVzdC50ZXN0X3BkYl9zZXRfdHJhY2VfbmVzdGVkWzBdPig1KWNhbGxzX3NldF90cmFjZSgpCisgICAgLT4gc2VsZi5mMSgpCisgICAgKFBkYikgcHJpbnQgeQorICAgIDEKKyAgICAoUGRiKSB1cAorICAgID4gPGRvY3Rlc3QgZm9vLWLDpHJAYmF6WzFdPigxKTxtb2R1bGU+KCkKKyAgICAtPiBjYWxsc19zZXRfdHJhY2UoKQorICAgIChQZGIpIHByaW50IGZvbworICAgICoqKiBOYW1lRXJyb3I6IG5hbWUgJ2ZvbycgaXMgbm90IGRlZmluZWQKKyAgICAoUGRiKSBjb250aW51ZQorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKyIiIgorCitkZWYgdGVzdF9Eb2NUZXN0U3VpdGUoKToKKyAgICAiIiJEb2NUZXN0U3VpdGUgY3JlYXRlcyBhIHVuaXR0ZXN0IHRlc3Qgc3VpdGUgZnJvbSBhIGRvY3Rlc3QuCisKKyAgICAgICBXZSBjcmVhdGUgYSBTdWl0ZSBieSBwcm92aWRpbmcgYSBtb2R1bGUuICBBIG1vZHVsZSBjYW4gYmUgcHJvdmlkZWQKKyAgICAgICBieSBwYXNzaW5nIGEgbW9kdWxlIG9iamVjdDoKKworICAgICAgICAgPj4+IGltcG9ydCB1bml0dGVzdAorICAgICAgICAgPj4+IGltcG9ydCB0ZXN0LnNhbXBsZV9kb2N0ZXN0CisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSh0ZXN0LnNhbXBsZV9kb2N0ZXN0KQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9ND4KKworICAgICAgIFdlIGNhbiBhbHNvIHN1cHBseSB0aGUgbW9kdWxlIGJ5IG5hbWU6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0JykKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj05IGVycm9ycz0wIGZhaWx1cmVzPTQ+CisKKyAgICAgICBUaGUgbW9kdWxlIG5lZWQgbm90IGNvbnRhaW4gYW55IGRvY3Rlc3QgZXhhbXBsZXM6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0X25vX2RvY3Rlc3RzJykKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0wIGVycm9ycz0wIGZhaWx1cmVzPTA+CisKKyAgICAgICBIb3dldmVyLCBpZiBEb2NUZXN0U3VpdGUgZmluZHMgbm8gZG9jc3RyaW5ncywgaXQgcmFpc2VzIGFuIGVycm9yOgorCisgICAgICAgICA+Pj4gdHJ5OgorICAgICAgICAgLi4uICAgICBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgndGVzdC5zYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzJykKKyAgICAgICAgIC4uLiBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgLi4uICAgICBlcnJvciA9IGUKKworICAgICAgICAgPj4+IHByaW50KGVycm9yLmFyZ3NbMV0pCisgICAgICAgICBoYXMgbm8gZG9jc3RyaW5ncworCisgICAgICAgWW91IGNhbiBwcmV2ZW50IHRoaXMgZXJyb3IgYnkgcGFzc2luZyBhIERvY1Rlc3RGaW5kZXIgaW5zdGFuY2Ugd2l0aAorICAgICAgIHRoZSBgZXhjbHVkZV9lbXB0eWAga2V5d29yZCBhcmd1bWVudCBzZXQgdG8gRmFsc2U6CisKKyAgICAgICAgID4+PiBmaW5kZXIgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoZXhjbHVkZV9lbXB0eT1GYWxzZSkKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0X25vX2RvY3N0cmluZ3MnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9maW5kZXI9ZmluZGVyKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTAgZXJyb3JzPTAgZmFpbHVyZXM9MD4KKworICAgICAgIFdlIGNhbiB1c2UgdGhlIGN1cnJlbnQgbW9kdWxlOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSB0ZXN0LnNhbXBsZV9kb2N0ZXN0LnRlc3Rfc3VpdGUoKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9ND4KKworICAgICAgIFdlIGNhbiBzdXBwbHkgZ2xvYmFsIHZhcmlhYmxlcy4gIElmIHdlIHBhc3MgZ2xvYnMsIHRoZXkgd2lsbCBiZQorICAgICAgIHVzZWQgaW5zdGVhZCBvZiB0aGUgbW9kdWxlIGdsb2JhbHMuICBIZXJlIHdlJ2xsIHBhc3MgYW4gZW1wdHkKKyAgICAgICBnbG9iYWxzLCB0cmlnZ2VyaW5nIGFuIGV4dHJhIGVycm9yOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgndGVzdC5zYW1wbGVfZG9jdGVzdCcsIGdsb2JzPXt9KQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9NT4KKworICAgICAgIEFsdGVybmF0aXZlbHksIHdlIGNhbiBwcm92aWRlIGV4dHJhIGdsb2JhbHMuICBIZXJlIHdlJ2xsIG1ha2UgYW4KKyAgICAgICBlcnJvciBnbyBhd2F5IGJ5IHByb3ZpZGluZyBhbiBleHRyYSBnbG9iYWwgdmFyaWFibGU6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKCd0ZXN0LnNhbXBsZV9kb2N0ZXN0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhZ2xvYnM9eyd5JzogMX0pCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49OSBlcnJvcnM9MCBmYWlsdXJlcz0zPgorCisgICAgICAgWW91IGNhbiBwYXNzIG9wdGlvbiBmbGFncy4gIEhlcmUgd2UnbGwgY2F1c2UgYW4gZXh0cmEgZXJyb3IKKyAgICAgICBieSBkaXNhYmxpbmcgdGhlIGJsYW5rLWxpbmUgZmVhdHVyZToKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3QnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRE9OVF9BQ0NFUFRfQkxBTktMSU5FKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9NT4KKworICAgICAgIFlvdSBjYW4gc3VwcGx5IHNldFVwIGFuZCB0ZWFyRG93biBmdW5jdGlvbnM6CisKKyAgICAgICAgID4+PiBkZWYgc2V0VXAodCk6CisgICAgICAgICAuLi4gICAgIGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgICAgICAgLi4uICAgICB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwID0gVHJ1ZQorCisgICAgICAgICA+Pj4gZGVmIHRlYXJEb3duKHQpOgorICAgICAgICAgLi4uICAgICBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICAgICAgIC4uLiAgICAgZGVsIHRlc3QudGVzdF9kb2N0ZXN0LnNpbGx5U2V0dXAKKworICAgICAgIEhlcmUsIHdlIGluc3RhbGxlZCBhIHNpbGx5IHZhcmlhYmxlIHRoYXQgdGhlIHRlc3QgZXhwZWN0czoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoJ3Rlc3Quc2FtcGxlX2RvY3Rlc3QnLAorICAgICAgICAgLi4uICAgICAgc2V0VXA9c2V0VXAsIHRlYXJEb3duPXRlYXJEb3duKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9Mz4KKworICAgICAgIEJ1dCB0aGUgdGVhckRvd24gcmVzdG9yZXMgc2FuaXR5OgorCisgICAgICAgICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CisgICAgICAgICA+Pj4gdGVzdC50ZXN0X2RvY3Rlc3Quc2lsbHlTZXR1cAorICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgICAgLi4uCisgICAgICAgICBBdHRyaWJ1dGVFcnJvcjogJ21vZHVsZScgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ3NpbGx5U2V0dXAnCisKKyAgICAgICBUaGUgc2V0VXAgYW5kIHRlYXJEb3duIGZ1bnRpb25zIGFyZSBwYXNzZWQgdGVzdCBvYmplY3RzLiBIZXJlCisgICAgICAgd2UnbGwgdXNlIHRoZSBzZXRVcCBmdW5jdGlvbiB0byBzdXBwbHkgdGhlIG1pc3NpbmcgdmFyaWFibGUgeToKKworICAgICAgICAgPj4+IGRlZiBzZXRVcCh0ZXN0KToKKyAgICAgICAgIC4uLiAgICAgdGVzdC5nbG9ic1sneSddID0gMQorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSgndGVzdC5zYW1wbGVfZG9jdGVzdCcsIHNldFVwPXNldFVwKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTkgZXJyb3JzPTAgZmFpbHVyZXM9Mz4KKworICAgICAgIEhlcmUsIHdlIGRpZG4ndCBuZWVkIHRvIHVzZSBhIHRlYXJEb3duIGZ1bmN0aW9uIGJlY2F1c2Ugd2UKKyAgICAgICBtb2RpZmllZCB0aGUgdGVzdCBnbG9iYWxzLCB3aGljaCBhcmUgYSBjb3B5IG9mIHRoZQorICAgICAgIHNhbXBsZV9kb2N0ZXN0IG1vZHVsZSBkaWN0aW9uYXJ5LiAgVGhlIHRlc3QgZ2xvYmFscyBhcmUKKyAgICAgICBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgZm9yIHVzIGFmdGVyIGEgdGVzdC4KKyAgICAgICAiIiIKKworZGVmIHRlc3RfRG9jRmlsZVN1aXRlKCk6CisgICAgIiIiV2UgY2FuIHRlc3QgdGVzdHMgZm91bmQgaW4gdGV4dCBmaWxlcyB1c2luZyBhIERvY0ZpbGVTdWl0ZS4KKworICAgICAgIFdlIGNyZWF0ZSBhIHN1aXRlIGJ5IHByb3ZpZGluZyB0aGUgbmFtZXMgb2Ygb25lIG9yIG1vcmUgdGV4dAorICAgICAgIGZpbGVzIHRoYXQgaW5jbHVkZSBleGFtcGxlczoKKworICAgICAgICAgPj4+IGltcG9ydCB1bml0dGVzdAorICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MyBlcnJvcnM9MCBmYWlsdXJlcz0zPgorCisgICAgICAgVGhlIHRlc3QgZmlsZXMgYXJlIGxvb2tlZCBmb3IgaW4gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQorICAgICAgIGNhbGxpbmcgbW9kdWxlLiAgQSBwYWNrYWdlIGtleXdvcmQgYXJndW1lbnQgY2FuIGJlIHByb3ZpZGVkIHRvCisgICAgICAgc3BlY2lmeSBhIGRpZmZlcmVudCByZWxhdGl2ZSBsb2NhdGlvbi4KKworICAgICAgICAgPj4+IGltcG9ydCB1bml0dGVzdAorICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlPSd0ZXN0JykKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTM+CisKKyAgICAgICBTdXBwb3J0IGZvciB1c2luZyBhIHBhY2thZ2UncyBfX2xvYWRlcl9fLmdldF9kYXRhKCkgaXMgYWxzbworICAgICAgIHByb3ZpZGVkLgorCisgICAgICAgICA+Pj4gaW1wb3J0IHVuaXR0ZXN0LCBwa2d1dGlsLCB0ZXN0CisgICAgICAgICA+Pj4gYWRkZWRfbG9hZGVyID0gRmFsc2UKKyAgICAgICAgID4+PiBpZiBub3QgaGFzYXR0cih0ZXN0LCAnX19sb2FkZXJfXycpOgorICAgICAgICAgLi4uICAgICB0ZXN0Ll9fbG9hZGVyX18gPSBwa2d1dGlsLmdldF9sb2FkZXIodGVzdCkKKyAgICAgICAgIC4uLiAgICAgYWRkZWRfbG9hZGVyID0gVHJ1ZQorICAgICAgICAgPj4+IHRyeToKKyAgICAgICAgIC4uLiAgICAgc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0NC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U9J3Rlc3QnKQorICAgICAgICAgLi4uICAgICBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgLi4uIGZpbmFsbHk6CisgICAgICAgICAuLi4gICAgIGlmIGFkZGVkX2xvYWRlcjoKKyAgICAgICAgIC4uLiAgICAgICAgIGRlbCB0ZXN0Ll9fbG9hZGVyX18KKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MyBlcnJvcnM9MCBmYWlsdXJlcz0zPgorCisgICAgICAgJy8nIHNob3VsZCBiZSB1c2VkIGFzIGEgcGF0aCBzZXBhcmF0b3IuICBJdCB3aWxsIGJlIGNvbnZlcnRlZAorICAgICAgIHRvIGEgbmF0aXZlIHNlcGFyYXRvciBhdCBydW4gdGltZToKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJy4uL3Rlc3QvdGVzdF9kb2N0ZXN0LnR4dCcpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MSBlcnJvcnM9MCBmYWlsdXJlcz0xPgorCisgICAgICAgSWYgRG9jRmlsZVN1aXRlIGlzIHVzZWQgZnJvbSBhbiBpbnRlcmFjdGl2ZSBzZXNzaW9uLCB0aGVuIGZpbGVzCisgICAgICAgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkgb2Ygc3lzLmFyZ3ZbMF06CisKKyAgICAgICAgID4+PiBpbXBvcnQgdHlwZXMsIG9zLnBhdGgsIHRlc3QudGVzdF9kb2N0ZXN0CisgICAgICAgICA+Pj4gc2F2ZV9hcmd2ID0gc3lzLmFyZ3YKKyAgICAgICAgID4+PiBzeXMuYXJndiA9IFt0ZXN0LnRlc3RfZG9jdGVzdC5fX2ZpbGVfX10KKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2U9dHlwZXMuTW9kdWxlVHlwZSgnX19tYWluX18nKSkKKyAgICAgICAgID4+PiBzeXMuYXJndiA9IHNhdmVfYXJndgorCisgICAgICAgQnkgc2V0dGluZyBgbW9kdWxlX3JlbGF0aXZlPUZhbHNlYCwgb3Mtc3BlY2lmaWMgcGF0aHMgbWF5IGJlCisgICAgICAgdXNlZCAoaW5jbHVkaW5nIGFic29sdXRlIHBhdGhzIGFuZCBwYXRocyByZWxhdGl2ZSB0byB0aGUKKyAgICAgICB3b3JraW5nIGRpcmVjdG9yeSk6CisKKyAgICAgICAgID4+PiAjIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGVzdCBwYWNrYWdlLgorICAgICAgICAgPj4+IHRlc3RfZG9jdGVzdF9wYXRoID0gb3MucGF0aC5hYnNwYXRoKHRlc3QudGVzdF9kb2N0ZXN0Ll9fZmlsZV9fKQorICAgICAgICAgPj4+IHRlc3RfcGtnX3BhdGggPSBvcy5wYXRoLnNwbGl0KHRlc3RfZG9jdGVzdF9wYXRoKVswXQorCisgICAgICAgICA+Pj4gIyBVc2UgaXQgdG8gZmluZCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0ZXN0X2RvY3Rlc3QudHh0LgorICAgICAgICAgPj4+IHRlc3RfZmlsZSA9IG9zLnBhdGguam9pbih0ZXN0X3BrZ19wYXRoLCAndGVzdF9kb2N0ZXN0LnR4dCcpCisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKHRlc3RfZmlsZSwgbW9kdWxlX3JlbGF0aXZlPUZhbHNlKQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTEgZXJyb3JzPTAgZmFpbHVyZXM9MT4KKworICAgICAgIEl0IGlzIGFuIGVycm9yIHRvIHNwZWNpZnkgYHBhY2thZ2VgIHdoZW4gYG1vZHVsZV9yZWxhdGl2ZT1GYWxzZWA6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKHRlc3RfZmlsZSwgbW9kdWxlX3JlbGF0aXZlPUZhbHNlLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZT0ndGVzdCcpCisgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgICBWYWx1ZUVycm9yOiBQYWNrYWdlIG1heSBvbmx5IGJlIHNwZWNpZmllZCBmb3IgbW9kdWxlLXJlbGF0aXZlIHBhdGhzLgorCisgICAgICAgWW91IGNhbiBzcGVjaWZ5IGluaXRpYWwgZ2xvYmFsIHZhcmlhYmxlczoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9icz17J2Zhdm9yaXRlX2NvbG9yJzogJ2JsdWUnfSkKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTI+CisKKyAgICAgICBJbiB0aGlzIGNhc2UsIHdlIHN1cHBsaWVkIGEgbWlzc2luZyBmYXZvcml0ZSBjb2xvci4gWW91IGNhbgorICAgICAgIHByb3ZpZGUgZG9jdGVzdCBvcHRpb25zOgorCisgICAgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0Mi50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDQudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25mbGFncz1kb2N0ZXN0LkRPTlRfQUNDRVBUX0JMQU5LTElORSwKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JzPXsnZmF2b3JpdGVfY29sb3InOiAnYmx1ZSd9KQorICAgICAgICAgPj4+IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICAgICA8dW5pdHRlc3QucmVzdWx0LlRlc3RSZXN1bHQgcnVuPTMgZXJyb3JzPTAgZmFpbHVyZXM9Mz4KKworICAgICAgIEFuZCwgeW91IGNhbiBwcm92aWRlIHNldFVwIGFuZCB0ZWFyRG93biBmdW5jdGlvbnM6CisKKyAgICAgICAgID4+PiBkZWYgc2V0VXAodCk6CisgICAgICAgICAuLi4gICAgIGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAorICAgICAgICAgLi4uICAgICB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwID0gVHJ1ZQorCisgICAgICAgICA+Pj4gZGVmIHRlYXJEb3duKHQpOgorICAgICAgICAgLi4uICAgICBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICAgICAgIC4uLiAgICAgZGVsIHRlc3QudGVzdF9kb2N0ZXN0LnNpbGx5U2V0dXAKKworICAgICAgIEhlcmUsIHdlIGluc3RhbGxlZCBhIHNpbGx5IHZhcmlhYmxlIHRoYXQgdGhlIHRlc3QgZXhwZWN0czoKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3RfZG9jdGVzdDIudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3Q0LnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRVcD1zZXRVcCwgdGVhckRvd249dGVhckRvd24pCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MyBlcnJvcnM9MCBmYWlsdXJlcz0yPgorCisgICAgICAgQnV0IHRoZSB0ZWFyRG93biByZXN0b3JlcyBzYW5pdHk6CisKKyAgICAgICAgID4+PiBpbXBvcnQgdGVzdC50ZXN0X2RvY3Rlc3QKKyAgICAgICAgID4+PiB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwCisgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgICAuLi4KKyAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiAnbW9kdWxlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc2lsbHlTZXR1cCcKKworICAgICAgIFRoZSBzZXRVcCBhbmQgdGVhckRvd24gZnVudGlvbnMgYXJlIHBhc3NlZCB0ZXN0IG9iamVjdHMuCisgICAgICAgSGVyZSwgd2UnbGwgdXNlIGEgc2V0VXAgZnVuY3Rpb24gdG8gc2V0IHRoZSBmYXZvcml0ZSBjb2xvciBpbgorICAgICAgIHRlc3RfZG9jdGVzdC50eHQ6CisKKyAgICAgICAgID4+PiBkZWYgc2V0VXAodGVzdCk6CisgICAgICAgICAuLi4gICAgIHRlc3QuZ2xvYnNbJ2Zhdm9yaXRlX2NvbG9yJ10gPSAnYmx1ZScKKworICAgICAgICAgPj4+IHN1aXRlID0gZG9jdGVzdC5Eb2NGaWxlU3VpdGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBzZXRVcD1zZXRVcCkKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0xIGVycm9ycz0wIGZhaWx1cmVzPTA+CisKKyAgICAgICBIZXJlLCB3ZSBkaWRuJ3QgbmVlZCB0byB1c2UgYSB0ZWFyRG93biBmdW5jdGlvbiBiZWNhdXNlIHdlCisgICAgICAgbW9kaWZpZWQgdGhlIHRlc3QgZ2xvYmFscy4gIFRoZSB0ZXN0IGdsb2JhbHMgYXJlCisgICAgICAgYXV0b21hdGljYWxseSBjbGVhcmVkIGZvciB1cyBhZnRlciBhIHRlc3QuCisKKyAgICAgICBUZXN0cyBpbiBhIGZpbGUgcnVuIHVzaW5nIGBEb2NGaWxlU3VpdGVgIGNhbiBhbHNvIGFjY2VzcyB0aGUKKyAgICAgICBgX19maWxlX19gIGdsb2JhbCwgd2hpY2ggaXMgc2V0IHRvIHRoZSBuYW1lIG9mIHRoZSBmaWxlCisgICAgICAgY29udGFpbmluZyB0aGUgdGVzdHM6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QzLnR4dCcpCisgICAgICAgICA+Pj4gc3VpdGUucnVuKHVuaXR0ZXN0LlRlc3RSZXN1bHQoKSkKKyAgICAgICAgIDx1bml0dGVzdC5yZXN1bHQuVGVzdFJlc3VsdCBydW49MSBlcnJvcnM9MCBmYWlsdXJlcz0wPgorCisgICAgICAgSWYgdGhlIHRlc3RzIGNvbnRhaW4gbm9uLUFTQ0lJIGNoYXJhY3RlcnMsIHdlIGhhdmUgdG8gc3BlY2lmeSB3aGljaAorICAgICAgIGVuY29kaW5nIHRoZSBmaWxlIGlzIGVuY29kZWQgd2l0aC4gV2UgZG8gc28gYnkgdXNpbmcgdGhlIGBlbmNvZGluZ2AKKyAgICAgICBwYXJhbWV0ZXI6CisKKyAgICAgICAgID4+PiBzdWl0ZSA9IGRvY3Rlc3QuRG9jRmlsZVN1aXRlKCd0ZXN0X2RvY3Rlc3QudHh0JywKKyAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0X2RvY3Rlc3QyLnR4dCcsCisgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdF9kb2N0ZXN0NC50eHQnLAorICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICAgICAgID4+PiBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgICAgPHVuaXR0ZXN0LnJlc3VsdC5UZXN0UmVzdWx0IHJ1bj0zIGVycm9ycz0wIGZhaWx1cmVzPTI+CisKKyAgICAgICAiIiIKKworZGVmIHRlc3RfdHJhaWxpbmdfc3BhY2VfaW5fdGVzdCgpOgorICAgICIiIgorICAgIFRyYWlsaW5nIHNwYWNlcyBpbiBleHBlY3RlZCBvdXRwdXQgYXJlIHNpZ25pZmljYW50OgorCisgICAgICA+Pj4geCwgeSA9ICdmb28nLCAnJworICAgICAgPj4+IHByaW50IHgsIHkKKyAgICAgIGZvbyBcbgorICAgICIiIgorCisKK2RlZiB0ZXN0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzKCk6CisgICAgIiIiRGVmYXVsdCB1bml0dGVzdCByZXBvcnRpbmcgZmxhZ3MgY2FuIGJlIHNldCB0byBjb250cm9sIHJlcG9ydGluZworCisgICAgSGVyZSwgd2UnbGwgc2V0IHRoZSBSRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFIG9wdGlvbiBzbyB3ZSBzZWUKKyAgICBvbmx5IHRoZSBmaXJzdCBmYWlsdXJlIG9mIGVhY2ggdGVzdC4gIEZpcnN0LCB3ZSdsbCBsb29rIGF0IHRoZQorICAgIG91dHB1dCB3aXRob3V0IHRoZSBmbGFnLiAgVGhlIGZpbGUgdGVzdF9kb2N0ZXN0LnR4dCBmaWxlIGhhcyB0d28KKyAgICB0ZXN0cy4gVGhleSBib3RoIGZhaWwgaWYgYmxhbmsgbGluZXMgYXJlIGRpc2FibGVkOgorCisgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRE9OVF9BQ0NFUFRfQkxBTktMSU5FKQorICAgICAgPj4+IGltcG9ydCB1bml0dGVzdAorICAgICAgPj4+IHJlc3VsdCA9IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICA+Pj4gcHJpbnQgcmVzdWx0LmZhaWx1cmVzWzBdWzFdICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgICBUcmFjZWJhY2sgLi4uCisgICAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgICBmYXZvcml0ZV9jb2xvcgorICAgICAgLi4uCisgICAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgICBpZiAxOgorICAgICAgLi4uCisKKyAgICBOb3RlIHRoYXQgd2Ugc2VlIGJvdGggZmFpbHVyZXMgZGlzcGxheWVkLgorCisgICAgICA+Pj4gb2xkID0gZG9jdGVzdC5zZXRfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MoCisgICAgICAuLi4gICAgZG9jdGVzdC5SRVBPUlRfT05MWV9GSVJTVF9GQUlMVVJFKQorCisgICAgTm93LCB3aGVuIHdlIHJ1biB0aGUgdGVzdDoKKworICAgICAgPj4+IHJlc3VsdCA9IHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisgICAgICA+Pj4gcHJpbnQgcmVzdWx0LmZhaWx1cmVzWzBdWzFdICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgICBUcmFjZWJhY2sgLi4uCisgICAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgICBmYXZvcml0ZV9jb2xvcgorICAgICAgRXhjZXB0aW9uIHJhaXNlZDoKKyAgICAgICAgICAuLi4KKyAgICAgICAgICBOYW1lRXJyb3I6IG5hbWUgJ2Zhdm9yaXRlX2NvbG9yJyBpcyBub3QgZGVmaW5lZAorICAgICAgPEJMQU5LTElORT4KKyAgICAgIDxCTEFOS0xJTkU+CisKKyAgICBXZSBnZXQgb25seSB0aGUgZmlyc3QgZmFpbHVyZS4KKworICAgIElmIHdlIGdpdmUgYW55IHJlcG9ydGluZyBvcHRpb25zIHdoZW4gd2Ugc2V0IHVwIHRoZSB0ZXN0cywKKyAgICBob3dldmVyOgorCisgICAgICA+Pj4gc3VpdGUgPSBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgndGVzdF9kb2N0ZXN0LnR4dCcsCisgICAgICAuLi4gICAgIG9wdGlvbmZsYWdzPWRvY3Rlc3QuRE9OVF9BQ0NFUFRfQkxBTktMSU5FIHwgZG9jdGVzdC5SRVBPUlRfTkRJRkYpCisKKyAgICBUaGVuIHRoZSBkZWZhdWx0IGVwb3J0aW5nIG9wdGlvbnMgYXJlIGlnbm9yZWQ6CisKKyAgICAgID4+PiByZXN1bHQgPSBzdWl0ZS5ydW4odW5pdHRlc3QuVGVzdFJlc3VsdCgpKQorICAgICAgPj4+IHByaW50IHJlc3VsdC5mYWlsdXJlc1swXVsxXSAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICAgVHJhY2ViYWNrIC4uLgorICAgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgICAgZmF2b3JpdGVfY29sb3IKKyAgICAgIC4uLgorICAgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgICAgaWYgMToKKyAgICAgICAgICAgICBwcmludCAnYScKKyAgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgIHByaW50ICdiJworICAgICAgRGlmZmVyZW5jZXMgKG5kaWZmIHdpdGggLWV4cGVjdGVkICthY3R1YWwpOgorICAgICAgICAgICAgYQorICAgICAgICAgIC0gPEJMQU5LTElORT4KKyAgICAgICAgICArCisgICAgICAgICAgICBiCisgICAgICA8QkxBTktMSU5FPgorICAgICAgPEJMQU5LTElORT4KKworCisgICAgVGVzdCBydW5uZXJzIGNhbiByZXN0b3JlIHRoZSBmb3JtYXR0aW5nIGZsYWdzIGFmdGVyIHRoZXkgcnVuOgorCisgICAgICA+Pj4gaWdub3JlZCA9IGRvY3Rlc3Quc2V0X3VuaXR0ZXN0X3JlcG9ydGZsYWdzKG9sZCkKKworICAgICIiIgorCitkZWYgdGVzdF90ZXN0ZmlsZSgpOiByIiIiCitUZXN0cyBmb3IgdGhlIGB0ZXN0ZmlsZSgpYCBmdW5jdGlvbi4gIFRoaXMgZnVuY3Rpb24gcnVucyBhbGwgdGhlCitkb2N0ZXN0IGV4YW1wbGVzIGluIGEgZ2l2ZW4gZmlsZS4gIEluIGl0cyBzaW1wbGUgaW52b2thdGlvbiwgaXQgaXMKK2NhbGxlZCB3aXRoIHRoZSBuYW1lIG9mIGEgZmlsZSwgd2hpY2ggaXMgdGFrZW4gdG8gYmUgcmVsYXRpdmUgdG8gdGhlCitjYWxsaW5nIG1vZHVsZS4gIFRoZSByZXR1cm4gdmFsdWUgaXMgKCNmYWlsdXJlcywgI3Rlc3RzKS4KKworV2UgZG9uJ3Qgd2FudCBgLXZgIGluIHN5cy5hcmd2IGZvciB0aGVzZSB0ZXN0cy4KKworICAgID4+PiBzYXZlX2FyZ3YgPSBzeXMuYXJndgorICAgID4+PiBpZiAnLXYnIGluIHN5cy5hcmd2OgorICAgIC4uLiAgICAgc3lzLmFyZ3YgPSBbYXJnIGZvciBhcmcgaW4gc2F2ZV9hcmd2IGlmIGFyZyAhPSAnLXYnXQorCisKKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0LnR4dCcpICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIEZpbGUgIi4uLiIsIGxpbmUgNiwgaW4gdGVzdF9kb2N0ZXN0LnR4dAorICAgIEZhaWxlZCBleGFtcGxlOgorICAgICAgICBmYXZvcml0ZV9jb2xvcgorICAgIEV4Y2VwdGlvbiByYWlzZWQ6CisgICAgICAgIC4uLgorICAgICAgICBOYW1lRXJyb3I6IG5hbWUgJ2Zhdm9yaXRlX2NvbG9yJyBpcyBub3QgZGVmaW5lZAorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAxIGl0ZW1zIGhhZCBmYWlsdXJlczoKKyAgICAgICAxIG9mICAgMiBpbiB0ZXN0X2RvY3Rlc3QudHh0CisgICAgKioqVGVzdCBGYWlsZWQqKiogMSBmYWlsdXJlcy4KKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKKyhOb3RlOiB3ZSdsbCBiZSBjbGVhcmluZyBkb2N0ZXN0Lm1hc3RlciBhZnRlciBlYWNoIGNhbGwgdG8KK2Bkb2N0ZXN0LnRlc3RmaWxlYCwgdG8gc3VwcHJlc3Mgd2FybmluZ3MgYWJvdXQgbXVsdGlwbGUgdGVzdHMgd2l0aCB0aGUKK3NhbWUgbmFtZS4pCisKK0dsb2JhbHMgbWF5IGJlIHNwZWNpZmllZCB3aXRoIHRoZSBgZ2xvYnNgIGFuZCBgZXh0cmFnbG9ic2AgcGFyYW1ldGVyczoKKworICAgID4+PiBnbG9icyA9IHsnZmF2b3JpdGVfY29sb3InOiAnYmx1ZSd9CisgICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBnbG9icz1nbG9icykKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKKyAgICA+Pj4gZXh0cmFnbG9icyA9IHsnZmF2b3JpdGVfY29sb3InOiAncmVkJ30KKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0LnR4dCcsIGdsb2JzPWdsb2JzLAorICAgIC4uLiAgICAgICAgICAgICAgICAgIGV4dHJhZ2xvYnM9ZXh0cmFnbG9icykgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAiLi4uIiwgbGluZSA2LCBpbiB0ZXN0X2RvY3Rlc3QudHh0CisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIGZhdm9yaXRlX2NvbG9yCisgICAgRXhwZWN0ZWQ6CisgICAgICAgICdibHVlJworICAgIEdvdDoKKyAgICAgICAgJ3JlZCcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgMSBpdGVtcyBoYWQgZmFpbHVyZXM6CisgICAgICAgMSBvZiAgIDIgaW4gdGVzdF9kb2N0ZXN0LnR4dAorICAgICoqKlRlc3QgRmFpbGVkKioqIDEgZmFpbHVyZXMuCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgorCitUaGUgZmlsZSBtYXkgYmUgbWFkZSByZWxhdGl2ZSB0byBhIGdpdmVuIG1vZHVsZSBvciBwYWNrYWdlLCB1c2luZyB0aGUKK29wdGlvbmFsIGBtb2R1bGVfcmVsYXRpdmVgIHBhcmFtZXRlcjoKKworICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3QudHh0JywgZ2xvYnM9Z2xvYnMsCisgICAgLi4uICAgICAgICAgICAgICAgICAgbW9kdWxlX3JlbGF0aXZlPSd0ZXN0JykKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTIpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKK1ZlcmJvc2l0eSBjYW4gYmUgaW5jcmVhc2VkIHdpdGggdGhlIG9wdGlvbmFsIGB2ZXJib3NlYCBwYXJhbWV0ZXI6CisKKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0LnR4dCcsIGdsb2JzPWdsb2JzLCB2ZXJib3NlPVRydWUpCisgICAgVHJ5aW5nOgorICAgICAgICBmYXZvcml0ZV9jb2xvcgorICAgIEV4cGVjdGluZzoKKyAgICAgICAgJ2JsdWUnCisgICAgb2sKKyAgICBUcnlpbmc6CisgICAgICAgIGlmIDE6CisgICAgICAgICAgIHByaW50ICdhJworICAgICAgICAgICBwcmludAorICAgICAgICAgICBwcmludCAnYicKKyAgICBFeHBlY3Rpbmc6CisgICAgICAgIGEKKyAgICAgICAgPEJMQU5LTElORT4KKyAgICAgICAgYgorICAgIG9rCisgICAgMSBpdGVtcyBwYXNzZWQgYWxsIHRlc3RzOgorICAgICAgIDIgdGVzdHMgaW4gdGVzdF9kb2N0ZXN0LnR4dAorICAgIDIgdGVzdHMgaW4gMSBpdGVtcy4KKyAgICAyIHBhc3NlZCBhbmQgMCBmYWlsZWQuCisgICAgVGVzdCBwYXNzZWQuCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgorCitUaGUgbmFtZSBvZiB0aGUgdGVzdCBtYXkgYmUgc3BlY2lmaWVkIHdpdGggdGhlIG9wdGlvbmFsIGBuYW1lYAorcGFyYW1ldGVyOgorCisgICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdC50eHQnLCBuYW1lPSduZXduYW1lJykKKyAgICAuLi4gIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgRmlsZSAiLi4uIiwgbGluZSA2LCBpbiBuZXduYW1lCisgICAgLi4uCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTEsIGF0dGVtcHRlZD0yKQorICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgorCitUaGUgc3VtbWFyeSByZXBvcnQgbWF5IGJlIHN1cHByZXNzZWQgd2l0aCB0aGUgb3B0aW9uYWwgYHJlcG9ydGAKK3BhcmFtZXRlcjoKKworICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3QudHh0JywgcmVwb3J0PUZhbHNlKQorICAgIC4uLiAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlICIuLi4iLCBsaW5lIDYsIGluIHRlc3RfZG9jdGVzdC50eHQKKyAgICBGYWlsZWQgZXhhbXBsZToKKyAgICAgICAgZmF2b3JpdGVfY29sb3IKKyAgICBFeGNlcHRpb24gcmFpc2VkOgorICAgICAgICAuLi4KKyAgICAgICAgTmFtZUVycm9yOiBuYW1lICdmYXZvcml0ZV9jb2xvcicgaXMgbm90IGRlZmluZWQKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKK1RoZSBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50IGByYWlzZV9vbl9lcnJvcmAgY2FuIGJlIHVzZWQgdG8gcmFpc2UgYW4KK2V4Y2VwdGlvbiBvbiB0aGUgZmlyc3QgZXJyb3IgKHdoaWNoIG1heSBiZSB1c2VmdWwgZm9yIHBvc3Rtb3J0ZW0KK2RlYnVnZ2luZyk6CisKKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0LnR4dCcsIHJhaXNlX29uX2Vycm9yPVRydWUpCisgICAgLi4uICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFVuZXhwZWN0ZWRFeGNlcHRpb246IC4uLgorICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgorCitJZiB0aGUgdGVzdHMgY29udGFpbiBub24tQVNDSUkgY2hhcmFjdGVycywgdGhlIHRlc3RzIG1pZ2h0IGZhaWwsIHNpbmNlCitpdCdzIHVua25vd24gd2hpY2ggZW5jb2RpbmcgaXMgdXNlZC4gVGhlIGVuY29kaW5nIGNhbiBiZSBzcGVjaWZpZWQKK3VzaW5nIHRoZSBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50IGBlbmNvZGluZ2A6CisKKyAgICA+Pj4gZG9jdGVzdC50ZXN0ZmlsZSgndGVzdF9kb2N0ZXN0NC50eHQnKSAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBGaWxlICIuLi4iLCBsaW5lIDcsIGluIHRlc3RfZG9jdGVzdDQudHh0CisgICAgRmFpbGVkIGV4YW1wbGU6CisgICAgICAgIHUnLi4uJworICAgIEV4cGVjdGVkOgorICAgICAgICB1J2ZceGY2XHhmNicKKyAgICBHb3Q6CisgICAgICAgIHUnZlx4YzNceGI2XHhjM1x4YjYnCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC4uLgorICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAxIGl0ZW1zIGhhZCBmYWlsdXJlczoKKyAgICAgICAyIG9mICAgNCBpbiB0ZXN0X2RvY3Rlc3Q0LnR4dAorICAgICoqKlRlc3QgRmFpbGVkKioqIDIgZmFpbHVyZXMuCisgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTIsIGF0dGVtcHRlZD00KQorICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgorCisgICAgPj4+IGRvY3Rlc3QudGVzdGZpbGUoJ3Rlc3RfZG9jdGVzdDQudHh0JywgZW5jb2Rpbmc9J3V0Zi04JykKKyAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTQpCisgICAgPj4+IGRvY3Rlc3QubWFzdGVyID0gTm9uZSAgIyBSZXNldCBtYXN0ZXIuCisKK1N3aXRjaCB0aGUgbW9kdWxlIGVuY29kaW5nIHRvICd1dGYtOCcgdG8gdGVzdCB0aGUgdmVyYm9zZSBvdXRwdXQgd2l0aG91dAorYm90aGVyaW5nIHdpdGggdGhlIGN1cnJlbnQgc3lzLnN0ZG91dCBlbmNvZGluZy4KKworICAgID4+PiBkb2N0ZXN0Ll9lbmNvZGluZywgc2F2ZWRfZW5jb2RpbmcgPSAndXRmLTgnLCBkb2N0ZXN0Ll9lbmNvZGluZworICAgID4+PiBkb2N0ZXN0LnRlc3RmaWxlKCd0ZXN0X2RvY3Rlc3Q0LnR4dCcsIGVuY29kaW5nPSd1dGYtOCcsIHZlcmJvc2U9VHJ1ZSkKKyAgICBUcnlpbmc6CisgICAgICAgIHUnZsO2w7YnCisgICAgRXhwZWN0aW5nOgorICAgICAgICB1J2ZceGY2XHhmNicKKyAgICBvaworICAgIFRyeWluZzoKKyAgICAgICAgdSdixIVyJworICAgIEV4cGVjdGluZzoKKyAgICAgICAgdSdiXHUwMTA1cicKKyAgICBvaworICAgIFRyeWluZzoKKyAgICAgICAgJ2bDtsO2JworICAgIEV4cGVjdGluZzoKKyAgICAgICAgJ2ZceGMzXHhiNlx4YzNceGI2JworICAgIG9rCisgICAgVHJ5aW5nOgorICAgICAgICAnYsSFcicKKyAgICBFeHBlY3Rpbmc6CisgICAgICAgICdiXHhjNFx4ODVyJworICAgIG9rCisgICAgMSBpdGVtcyBwYXNzZWQgYWxsIHRlc3RzOgorICAgICAgIDQgdGVzdHMgaW4gdGVzdF9kb2N0ZXN0NC50eHQKKyAgICA0IHRlc3RzIGluIDEgaXRlbXMuCisgICAgNCBwYXNzZWQgYW5kIDAgZmFpbGVkLgorICAgIFRlc3QgcGFzc2VkLgorICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9NCkKKyAgICA+Pj4gZG9jdGVzdC5fZW5jb2RpbmcgPSBzYXZlZF9lbmNvZGluZworICAgID4+PiBkb2N0ZXN0Lm1hc3RlciA9IE5vbmUgICMgUmVzZXQgbWFzdGVyLgorICAgID4+PiBzeXMuYXJndiA9IHNhdmVfYXJndgorIiIiCisKKyMgb2xkX3Rlc3QxLCAuLi4gdXNlZCB0byBsaXZlIGluIGRvY3Rlc3QucHksIGJ1dCBjbHV0dGVyZWQgaXQuICBOb3RlCisjIHRoYXQgdGhlc2UgdXNlIHRoZSBkZXByZWNhdGVkIGRvY3Rlc3QuVGVzdGVyLCBzbyBzaG91bGQgZ28gYXdheSAob3IKKyMgYmUgcmV3cml0dGVuKSBzb21lZGF5LgorCitkZWYgb2xkX3Rlc3QxKCk6IHIiIiIKKz4+PiBmcm9tIGRvY3Rlc3QgaW1wb3J0IFRlc3RlcgorPj4+IHQgPSBUZXN0ZXIoZ2xvYnM9eyd4JzogNDJ9LCB2ZXJib3NlPTApCis+Pj4gdC5ydW5zdHJpbmcocicnJworLi4uICAgICAgPj4+IHggPSB4ICogMgorLi4uICAgICAgPj4+IHByaW50IHgKKy4uLiAgICAgIDQyCisuLi4gJycnLCAnWFlaJykKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0xpbmUgMywgaW4gWFlaCitGYWlsZWQgZXhhbXBsZToKKyAgICBwcmludCB4CitFeHBlY3RlZDoKKyAgICA0MgorR290OgorICAgIDg0CitUZXN0UmVzdWx0cyhmYWlsZWQ9MSwgYXR0ZW1wdGVkPTIpCis+Pj4gdC5ydW5zdHJpbmcoIj4+PiB4ID0geCAqIDJcbj4+PiBwcmludCB4XG44NFxuIiwgJ2V4YW1wbGUyJykKK1Rlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MikKKz4+PiB0LnN1bW1hcml6ZSgpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisxIGl0ZW1zIGhhZCBmYWlsdXJlczoKKyAgIDEgb2YgICAyIGluIFhZWgorKioqVGVzdCBGYWlsZWQqKiogMSBmYWlsdXJlcy4KK1Rlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9NCkKKz4+PiB0LnN1bW1hcml6ZSh2ZXJib3NlPTEpCisxIGl0ZW1zIHBhc3NlZCBhbGwgdGVzdHM6CisgICAyIHRlc3RzIGluIGV4YW1wbGUyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisxIGl0ZW1zIGhhZCBmYWlsdXJlczoKKyAgIDEgb2YgICAyIGluIFhZWgorNCB0ZXN0cyBpbiAyIGl0ZW1zLgorMyBwYXNzZWQgYW5kIDEgZmFpbGVkLgorKioqVGVzdCBGYWlsZWQqKiogMSBmYWlsdXJlcy4KK1Rlc3RSZXN1bHRzKGZhaWxlZD0xLCBhdHRlbXB0ZWQ9NCkKKyIiIgorCitkZWYgb2xkX3Rlc3QyKCk6IHIiIiIKKyAgICAgICAgPj4+IGZyb20gZG9jdGVzdCBpbXBvcnQgVGVzdGVyCisgICAgICAgID4+PiB0ID0gVGVzdGVyKGdsb2JzPXt9LCB2ZXJib3NlPTEpCisgICAgICAgID4+PiB0ZXN0ID0gcicnJworICAgICAgICAuLi4gICAgIyBqdXN0IGFuIGV4YW1wbGUKKyAgICAgICAgLi4uICAgID4+PiB4ID0gMSArIDIKKyAgICAgICAgLi4uICAgID4+PiB4CisgICAgICAgIC4uLiAgICAzCisgICAgICAgIC4uLiAnJycKKyAgICAgICAgPj4+IHQucnVuc3RyaW5nKHRlc3QsICJFeGFtcGxlIikKKyAgICAgICAgUnVubmluZyBzdHJpbmcgRXhhbXBsZQorICAgICAgICBUcnlpbmc6CisgICAgICAgICAgICB4ID0gMSArIDIKKyAgICAgICAgRXhwZWN0aW5nIG5vdGhpbmcKKyAgICAgICAgb2sKKyAgICAgICAgVHJ5aW5nOgorICAgICAgICAgICAgeAorICAgICAgICBFeHBlY3Rpbmc6CisgICAgICAgICAgICAzCisgICAgICAgIG9rCisgICAgICAgIDAgb2YgMiBleGFtcGxlcyBmYWlsZWQgaW4gc3RyaW5nIEV4YW1wbGUKKyAgICAgICAgVGVzdFJlc3VsdHMoZmFpbGVkPTAsIGF0dGVtcHRlZD0yKQorIiIiCisKK2RlZiBvbGRfdGVzdDMoKTogciIiIgorICAgICAgICA+Pj4gZnJvbSBkb2N0ZXN0IGltcG9ydCBUZXN0ZXIKKyAgICAgICAgPj4+IHQgPSBUZXN0ZXIoZ2xvYnM9e30sIHZlcmJvc2U9MCkKKyAgICAgICAgPj4+IGRlZiBfZigpOgorICAgICAgICAuLi4gICAgICcnJ1RyaXZpYWwgZG9jc3RyaW5nIGV4YW1wbGUuCisgICAgICAgIC4uLiAgICAgPj4+IGFzc2VydCAyID09IDIKKyAgICAgICAgLi4uICAgICAnJycKKyAgICAgICAgLi4uICAgICByZXR1cm4gMzIKKyAgICAgICAgLi4uCisgICAgICAgID4+PiB0LnJ1bmRvYyhfZikgICMgZXhwZWN0IDAgZmFpbHVyZXMgaW4gMSBleGFtcGxlCisgICAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9MSkKKyIiIgorCitkZWYgb2xkX3Rlc3Q0KCk6ICIiIgorICAgICAgICA+Pj4gaW1wb3J0IHR5cGVzCisgICAgICAgID4+PiBtMSA9IHR5cGVzLk1vZHVsZVR5cGUoJ19tMScpCisgICAgICAgID4+PiBtMiA9IHR5cGVzLk1vZHVsZVR5cGUoJ19tMicpCisgICAgICAgID4+PiB0ZXN0X2RhdGEgPSBcIiIiCisgICAgICAgIC4uLiBkZWYgX2YoKToKKyAgICAgICAgLi4uICAgICAnJyc+Pj4gYXNzZXJ0IDEgPT0gMQorICAgICAgICAuLi4gICAgICcnJworICAgICAgICAuLi4gZGVmIGcoKToKKyAgICAgICAgLi4uICAgICcnJz4+PiBhc3NlcnQgMiAhPSAxCisgICAgICAgIC4uLiAgICAnJycKKyAgICAgICAgLi4uIGNsYXNzIEg6CisgICAgICAgIC4uLiAgICAnJyc+Pj4gYXNzZXJ0IDIgPiAxCisgICAgICAgIC4uLiAgICAnJycKKyAgICAgICAgLi4uICAgIGRlZiBiYXIoc2VsZik6CisgICAgICAgIC4uLiAgICAgICAgJycnPj4+IGFzc2VydCAxIDwgMgorICAgICAgICAuLi4gICAgICAgICcnJworICAgICAgICAuLi4gXCIiIgorICAgICAgICA+Pj4gZXhlYyB0ZXN0X2RhdGEgaW4gbTEuX19kaWN0X18KKyAgICAgICAgPj4+IGV4ZWMgdGVzdF9kYXRhIGluIG0yLl9fZGljdF9fCisgICAgICAgID4+PiBtMS5fX2RpY3RfXy51cGRhdGUoeyJmMiI6IG0yLl9mLCAiZzIiOiBtMi5nLCAiaDIiOiBtMi5IfSkKKworICAgICAgICBUZXN0cyB0aGF0IG9iamVjdHMgb3V0c2lkZSBtMSBhcmUgZXhjbHVkZWQ6CisKKyAgICAgICAgPj4+IGZyb20gZG9jdGVzdCBpbXBvcnQgVGVzdGVyCisgICAgICAgID4+PiB0ID0gVGVzdGVyKGdsb2JzPXt9LCB2ZXJib3NlPTApCisgICAgICAgID4+PiB0LnJ1bmRpY3QobTEuX19kaWN0X18sICJydW5kaWN0X3Rlc3QiLCBtMSkgICMgZjIgYW5kIGcyIGFuZCBoMiBza2lwcGVkCisgICAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9NCkKKworICAgICAgICBPbmNlIG1vcmUsIG5vdCBleGNsdWRpbmcgc3R1ZmYgb3V0c2lkZSBtMToKKworICAgICAgICA+Pj4gdCA9IFRlc3RlcihnbG9icz17fSwgdmVyYm9zZT0wKQorICAgICAgICA+Pj4gdC5ydW5kaWN0KG0xLl9fZGljdF9fLCAicnVuZGljdF90ZXN0X3B2dCIpICAjIE5vbmUgYXJlIHNraXBwZWQuCisgICAgICAgIFRlc3RSZXN1bHRzKGZhaWxlZD0wLCBhdHRlbXB0ZWQ9OCkKKworICAgICAgICBUaGUgZXhjbHVzaW9uIG9mIG9iamVjdHMgZnJvbSBvdXRzaWRlIHRoZSBkZXNpZ25hdGVkIG1vZHVsZSBpcworICAgICAgICBtZWFudCB0byBiZSBpbnZva2VkIGF1dG9tYWdpY2FsbHkgYnkgdGVzdG1vZC4KKworICAgICAgICA+Pj4gZG9jdGVzdC50ZXN0bW9kKG0xLCB2ZXJib3NlPUZhbHNlKQorICAgICAgICBUZXN0UmVzdWx0cyhmYWlsZWQ9MCwgYXR0ZW1wdGVkPTQpCisiIiIKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTWFpbgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyBDaGVjayB0aGUgZG9jdGVzdCBjYXNlcyBpbiBkb2N0ZXN0IGl0c2VsZjoKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QoZG9jdGVzdCwgdmVyYm9zaXR5PVRydWUpCisKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZG9jdGVzdAorCisgICAgIyBJZ25vcmUgYWxsIHdhcm5pbmdzIGFib3V0IHRoZSB1c2Ugb2YgY2xhc3MgVGVzdGVyIGluIHRoaXMgbW9kdWxlLgorICAgIGRlcHJlY2F0aW9ucyA9IFtdCisgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICBkZXByZWNhdGlvbnMuYXBwZW5kKCgiY2xhc3MgVGVzdGVyIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKQorICAgIGlmIHN5cy5weTNrd2FybmluZzoKKyAgICAgICAgZGVwcmVjYXRpb25zICs9IFsoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwgU3ludGF4V2FybmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJleGVjZmlsZS4uIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpXQorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCpkZXByZWNhdGlvbnMpOgorICAgICAgICAjIENoZWNrIHRoZSBkb2N0ZXN0IGNhc2VzIGRlZmluZWQgaGVyZToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZG9jdGVzdCwgdmVyYm9zaXR5PVRydWUpCisKK2ltcG9ydCBzeXMKK2RlZiB0ZXN0X2NvdmVyYWdlKGNvdmVyZGlyKToKKyAgICB0cmFjZSA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0cmFjZScpCisgICAgdHJhY2VyID0gdHJhY2UuVHJhY2UoaWdub3JlZGlycz1bc3lzLnByZWZpeCwgc3lzLmV4ZWNfcHJlZml4LF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2U9MCwgY291bnQ9MSkKKyAgICB0cmFjZXIucnVuKCdyZWxvYWQoZG9jdGVzdCk7IHRlc3RfbWFpbigpJykKKyAgICByID0gdHJhY2VyLnJlc3VsdHMoKQorICAgIHByaW50ICdXcml0aW5nIGNvdmVyYWdlIHJlc3VsdHMuLi4nCisgICAgci53cml0ZV9yZXN1bHRzKHNob3dfbWlzc2luZz1UcnVlLCBzdW1tYXJ5PVRydWUsCisgICAgICAgICAgICAgICAgICAgIGNvdmVyZGlyPWNvdmVyZGlyKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGlmICctYycgaW4gc3lzLmFyZ3Y6CisgICAgICAgIHRlc3RfY292ZXJhZ2UoJy90bXAvZG9jdGVzdC5jb3ZlcicpCisgICAgZWxzZToKKyAgICAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlZDI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1Nzg3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlODUxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QudHh0CkBAIC0wLDAgKzEsMTcgQEAKK1RoaXMgaXMgYSBzYW1wbGUgZG9jdGVzdCBpbiBhIHRleHQgZmlsZS4KKworSW4gdGhpcyBleGFtcGxlLCB3ZSdsbCByZWx5IG9uIGEgZ2xvYmFsIHZhcmlhYmxlIGJlaW5nIHNldCBmb3IgdXMKK2FscmVhZHk6CisKKyAgPj4+IGZhdm9yaXRlX2NvbG9yCisgICdibHVlJworCitXZSBjYW4gbWFrZSB0aGlzIGZhaWwgYnkgZGlzYWJsaW5nIHRoZSBibGFuay1saW5lIGZlYXR1cmUuCisKKyAgPj4+IGlmIDE6CisgIC4uLiAgICBwcmludCAnYScKKyAgLi4uICAgIHByaW50CisgIC4uLiAgICBwcmludCAnYicKKyAgYQorICA8QkxBTktMSU5FPgorICBiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDQzYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weQpAQCAtMCwwICsxLDEyNCBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KK3UiIiJBIG1vZHVsZSB0byB0ZXN0IHdoZXRoZXIgZG9jdGVzdCByZWNvZ25pemVzIHNvbWUgMi4yIGZlYXR1cmVzLAorbGlrZSBzdGF0aWMgYW5kIGNsYXNzIG1ldGhvZHMuCisKKz4+PiBwcmludCAneXVwJyAgIyAxCit5dXAKKworV2UgaW5jbHVkZSBzb21lIChyYW5kb20pIGVuY29kZWQgKHV0Zi04KSB0ZXh0IGluIHRoZSB0ZXh0IHN1cnJvdW5kaW5nCit0aGUgZXhhbXBsZS4gIEl0IHNob3VsZCBiZSBpZ25vcmVkOgorCivQidCK0IjQgdCCCisKKyIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpZiBzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiQ2Fubm90IHRlc3QgZG9jc3RyaW5ncyB3aXRoIC1PMiIpCisKK2NsYXNzIEMob2JqZWN0KToKKyAgICB1IiIiQ2xhc3MgQy4KKworICAgID4+PiBwcmludCBDKCkgICMgMgorICAgIDQyCisKKworICAgIFdlIGluY2x1ZGUgc29tZSAocmFuZG9tKSBlbmNvZGVkICh1dGYtOCkgdGV4dCBpbiB0aGUgdGV4dCBzdXJyb3VuZGluZworICAgIHRoZSBleGFtcGxlLiAgSXQgc2hvdWxkIGJlIGlnbm9yZWQ6CisKKyAgICAgICAg0InQitCI0IHQggorCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICIiIkMuX19pbml0X18uCisKKyAgICAgICAgPj4+IHByaW50IEMoKSAjIDMKKyAgICAgICAgNDIKKyAgICAgICAgIiIiCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBwcmludCBDKCkgIyA0CisgICAgICAgIDQyCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gIjQyIgorCisgICAgY2xhc3MgRChvYmplY3QpOgorICAgICAgICAiIiJBIG5lc3RlZCBEIGNsYXNzLgorCisgICAgICAgID4+PiBwcmludCAiSW4gRCEiICAgIyA1CisgICAgICAgIEluIEQhCisgICAgICAgICIiIgorCisgICAgICAgIGRlZiBuZXN0ZWQoc2VsZik6CisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgID4+PiBwcmludCAzICMgNgorICAgICAgICAgICAgMworICAgICAgICAgICAgIiIiCisKKyAgICBkZWYgZ2V0eChzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgID4+PiBjID0gQygpICAgICMgNworICAgICAgICA+Pj4gYy54ID0gMTIgICAjIDgKKyAgICAgICAgPj4+IHByaW50IGMueCAgIyA5CisgICAgICAgIC0xMgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIC1zZWxmLl94CisKKyAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6CisgICAgICAgICIiIgorICAgICAgICA+Pj4gYyA9IEMoKSAgICAgIyAxMAorICAgICAgICA+Pj4gYy54ID0gMTIgICAgIyAxMQorICAgICAgICA+Pj4gcHJpbnQgYy54ICAgIyAxMgorICAgICAgICAtMTIKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3ggPSB2YWx1ZQorCisgICAgeCA9IHByb3BlcnR5KGdldHgsIHNldHgsIGRvYz0iIiJcCisgICAgICAgID4+PiBjID0gQygpICAgICMgMTMKKyAgICAgICAgPj4+IGMueCA9IDEyICAgIyAxNAorICAgICAgICA+Pj4gcHJpbnQgYy54ICAjIDE1CisgICAgICAgIC0xMgorICAgICAgICAiIiIpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIHN0YXRtKCk6CisgICAgICAgICIiIgorICAgICAgICBBIHN0YXRpYyBtZXRob2QuCisKKyAgICAgICAgPj4+IHByaW50IEMuc3RhdG0oKSAgICAjIDE2CisgICAgICAgIDY2NgorICAgICAgICA+Pj4gcHJpbnQgQygpLnN0YXRtKCkgICMgMTcKKyAgICAgICAgNjY2CisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gNjY2CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgY2xzbShjbHMsIHZhbCk6CisgICAgICAgICIiIgorICAgICAgICBBIGNsYXNzIG1ldGhvZC4KKworICAgICAgICA+Pj4gcHJpbnQgQy5jbHNtKDIyKSAgICAjIDE4CisgICAgICAgIDIyCisgICAgICAgID4+PiBwcmludCBDKCkuY2xzbSgyMykgICMgMTkKKyAgICAgICAgMjMKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiB2YWwKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9kb2N0ZXN0MgorICAgIEVYUEVDVEVEID0gMTkKKyAgICBmLCB0ID0gdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZG9jdGVzdDIpCisgICAgaWYgdCAhPSBFWFBFQ1RFRDoKKyAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQoImV4cGVjdGVkICVkIHRlc3RzIHRvIHJ1biwgbm90ICVkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFWFBFQ1RFRCwgdCkpCisKKyMgUG9sbHV0ZSB0aGUgbmFtZXNwYWNlIHdpdGggYSBidW5jaCBvZiBpbXBvcnRlZCBmdW5jdGlvbnMgYW5kIGNsYXNzZXMsCisjIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbid0IGdldCB0ZXN0ZWQuCitmcm9tIGRvY3Rlc3QgaW1wb3J0ICoKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjFjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4ZjFjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDIudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTQ4NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0Mi50eHQKQEAgLTAsMCArMSwxNCBAQAorVGhpcyBpcyBhIHNhbXBsZSBkb2N0ZXN0IGluIGEgdGV4dCBmaWxlLgorCitJbiB0aGlzIGV4YW1wbGUsIHdlJ2xsIHJlbHkgb24gc29tZSBzaWxseSBzZXR1cDoKKworICA+Pj4gaW1wb3J0IHRlc3QudGVzdF9kb2N0ZXN0CisgID4+PiB0ZXN0LnRlc3RfZG9jdGVzdC5zaWxseVNldHVwCisgIFRydWUKKworVGhpcyB0ZXN0IGFsc28gaGFzIHNvbWUgKHJhbmRvbSkgZW5jb2RlZCAodXRmLTgpIHVuaWNvZGUgdGV4dDoKKworICDDr8K7wr/DkMKJw5DCisOQwojDkMKBw5DCggorCitUaGlzIGRvZXNuJ3QgY2F1c2UgYSBwcm9ibGVtIGluIHRoZSB0ZWN0IHN1cnJvdW5kaW5nIHRoZSBleGFtcGxlcywgYnV0Cit3ZSBpbmNsdWRlIGl0IGhlcmUgKGluIHRoaXMgdGVzdCB0ZXh0IGZpbGUpIHRvIG1ha2Ugc3VyZS4gOikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QzLnR4dCBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3QzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGE5NmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jdGVzdDMudHh0CkBAIC0wLDAgKzEsNSBAQAorCitIZXJlIHdlIGNoZWNrIHRoYXQgYF9fZmlsZV9fYCBpcyBwcm92aWRlZDoKKworICA+Pj4gdHlwZShfX2ZpbGVfXykKKyAgPHR5cGUgJ3N0cic+CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0NC50eHQgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N0ZXN0NC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxOWQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2RvY3Rlc3Q0LnR4dApAQCAtMCwwICsxLDE3IEBACitUaGlzIGlzIGEgc2FtcGxlIGRvY3Rlc3QgaW4gYSB0ZXh0IGZpbGUgdGhhdCBjb250YWlucyBub24tQVNDSUkgY2hhcmFjdGVycy4KK1RoaXMgZmlsZSBpcyBlbmNvZGVkIHVzaW5nIFVURi04LgorCitJbiBvcmRlciB0byBnZXQgdGhpcyB0ZXN0IHRvIHBhc3MsIHdlIGhhdmUgdG8gbWFudWFsbHkgc3BlY2lmeSB0aGUKK2VuY29kaW5nLgorCisgID4+PiB1J2bDtsO2JworICB1J2ZceGY2XHhmNicKKworICA+Pj4gdSdixIVyJworICB1J2JcdTAxMDVyJworCisgID4+PiAnZsO2w7YnCisgICdmXHhjM1x4YjZceGMzXHhiNicKKworICA+Pj4gJ2LEhXInCisgICdiXHhjNFx4ODVyJwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDE4MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKQEAgLTAsMCArMSwyMDEgQEAKK2Zyb20gRG9jWE1MUlBDU2VydmVyIGltcG9ydCBEb2NYTUxSUENTZXJ2ZXIKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordGhyZWFkaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCitpbXBvcnQgdGltZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHVuaXR0ZXN0CisKK1BPUlQgPSBOb25lCisKK2RlZiBtYWtlX3JlcXVlc3RfYW5kX3NraXBJZihjb25kaXRpb24sIHJlYXNvbik6CisgICAgIyBJZiB3ZSBza2lwIHRoZSB0ZXN0LCB3ZSBoYXZlIHRvIG1ha2UgYSByZXF1ZXN0IGJlY2F1c2UgdGhlCisgICAgIyB0aGUgc2VydmVyIGNyZWF0ZWQgaW4gc2V0VXAgYmxvY2tzIGV4cGVjdGluZyBvbmUgdG8gY29tZSBpbi4KKyAgICBpZiBub3QgY29uZGl0aW9uOgorICAgICAgICByZXR1cm4gbGFtYmRhIGZ1bmM6IGZ1bmMKKyAgICBkZWYgZGVjb3JhdG9yKGZ1bmMpOgorICAgICAgICBkZWYgbWFrZV9yZXF1ZXN0X2FuZF9za2lwKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi8iKQorICAgICAgICAgICAgc2VsZi5jbGllbnQuZ2V0cmVzcG9uc2UoKQorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QocmVhc29uKQorICAgICAgICByZXR1cm4gbWFrZV9yZXF1ZXN0X2FuZF9za2lwCisgICAgcmV0dXJuIGRlY29yYXRvcgorCisKK2RlZiBzZXJ2ZXIoZXZ0LCBudW1yZXF1ZXN0cyk6CisgICAgc2VydiA9IERvY1hNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDApLCBsb2dSZXF1ZXN0cz1GYWxzZSkKKworICAgIHRyeToKKyAgICAgICAgZ2xvYmFsIFBPUlQKKyAgICAgICAgUE9SVCA9IHNlcnYuc29ja2V0LmdldHNvY2tuYW1lKClbMV0KKworICAgICAgICAjIEFkZCBzb21lIGRvY3VtZW50YXRpb24KKyAgICAgICAgc2Vydi5zZXRfc2VydmVyX3RpdGxlKCJEb2NYTUxSUENTZXJ2ZXIgVGVzdCBEb2N1bWVudGF0aW9uIikKKyAgICAgICAgc2Vydi5zZXRfc2VydmVyX25hbWUoIkRvY1hNTFJQQ1NlcnZlciBUZXN0IERvY3MiKQorICAgICAgICBzZXJ2LnNldF9zZXJ2ZXJfZG9jdW1lbnRhdGlvbigKKyAgICAgICAgICAgICJUaGlzIGlzIGFuIFhNTC1SUEMgc2VydmVyJ3MgZG9jdW1lbnRhdGlvbiwgYnV0IHRoZSBzZXJ2ZXIgIgorICAgICAgICAgICAgImNhbiBiZSB1c2VkIGJ5IFBPU1RpbmcgdG8gL1JQQzIuIFRyeSBzZWxmLmFkZCwgdG9vLiIpCisKKyAgICAgICAgIyBDcmVhdGUgYW5kIHJlZ2lzdGVyIGNsYXNzZXMgYW5kIGZ1bmN0aW9ucworICAgICAgICBjbGFzcyBUZXN0Q2xhc3Mob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiB0ZXN0X21ldGhvZChzZWxmLCBhcmcpOgorICAgICAgICAgICAgICAgICIiIlRlc3QgbWV0aG9kJ3MgZG9jcy4gVGhpcyBtZXRob2QgdHJ1bHkgZG9lcyB2ZXJ5IGxpdHRsZS4iIiIKKyAgICAgICAgICAgICAgICBzZWxmLmFyZyA9IGFyZworCisgICAgICAgIHNlcnYucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQorICAgICAgICBzZXJ2LnJlZ2lzdGVyX2luc3RhbmNlKFRlc3RDbGFzcygpKQorCisgICAgICAgIGRlZiBhZGQoeCwgeSk6CisgICAgICAgICAgICAiIiJBZGQgdHdvIGluc3RhbmNlcyB0b2dldGhlci4gVGhpcyBmb2xsb3dzIFBFUDAwOCwgYnV0IGhhcyBub3RoaW5nCisgICAgICAgICAgICB0byBkbyB3aXRoIFJGQzE5NTIuIENhc2Ugc2hvdWxkIG1hdHRlcjogcEVwMDA4IGFuZCByRkMxOTUyLiAgVGhpbmdzCisgICAgICAgICAgICB0aGF0IHN0YXJ0IHdpdGggaHR0cCBhbmQgZnRwIHNob3VsZCBiZSBhdXRvLWxpbmtlZCwgdG9vOgorICAgICAgICAgICAgaHR0cDovL2dvb2dsZS5jb20uCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHJldHVybiB4ICsgeQorCisgICAgICAgIHNlcnYucmVnaXN0ZXJfZnVuY3Rpb24oYWRkKQorICAgICAgICBzZXJ2LnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LCB5OiB4LXkpCisKKyAgICAgICAgd2hpbGUgbnVtcmVxdWVzdHMgPiAwOgorICAgICAgICAgICAgc2Vydi5oYW5kbGVfcmVxdWVzdCgpCisgICAgICAgICAgICBudW1yZXF1ZXN0cyAtPSAxCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwYXNzCisgICAgZmluYWxseToKKyAgICAgICAgc2Vydi5zZXJ2ZXJfY2xvc2UoKQorICAgICAgICBQT1JUID0gTm9uZQorICAgICAgICBldnQuc2V0KCkKKworY2xhc3MgRG9jWE1MUlBDSFRUUEdFVFNlcnZlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl90aHJlYWRzID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCisgICAgICAgICMgRW5hYmxlIHNlcnZlciBmZWVkYmFjaworICAgICAgICBEb2NYTUxSUENTZXJ2ZXIuX3NlbmRfdHJhY2ViYWNrX2hlYWRlciA9IFRydWUKKworICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlciwgYXJncz0oc2VsZi5ldnQsIDEpKS5zdGFydCgpCisKKyAgICAgICAgIyB3YWl0IGZvciBwb3J0IHRvIGJlIGFzc2lnbmVkCisgICAgICAgIG4gPSAxMDAwCisgICAgICAgIHdoaWxlIG4gPiAwIGFuZCBQT1JUIGlzIE5vbmU6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDAxKQorICAgICAgICAgICAgbiAtPSAxCisKKyAgICAgICAgc2VsZi5jbGllbnQgPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCJsb2NhbGhvc3Q6JWQiICUgUE9SVCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQuY2xvc2UoKQorCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorCisgICAgICAgICMgRGlzYWJsZSBzZXJ2ZXIgZmVlZGJhY2sKKyAgICAgICAgRG9jWE1MUlBDU2VydmVyLl9zZW5kX3RyYWNlYmFja19oZWFkZXIgPSBGYWxzZQorICAgICAgICB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnNlbGYuX3RocmVhZHMpCisKKyAgICBkZWYgdGVzdF92YWxpZF9nZXRfcmVzcG9uc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LnJlcXVlc3QoIkdFVCIsICIvIikKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXMsIDIwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5nZXRoZWFkZXIoIkNvbnRlbnQtdHlwZSIpLCAidGV4dC9odG1sIikKKworICAgICAgICAjIFNlcnZlciByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIHdlIGRvbid0IHN0YXJ0IHRvIHJlYWQgdGhlIGRhdGEKKyAgICAgICAgcmVzcG9uc2UucmVhZCgpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2dldF9yZXNwb25zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi9zcGFtIikKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXMsIDQwNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5nZXRoZWFkZXIoIkNvbnRlbnQtdHlwZSIpLCAidGV4dC9wbGFpbiIpCisKKyAgICAgICAgcmVzcG9uc2UucmVhZCgpCisKKyAgICBkZWYgdGVzdF9sYW1iZGEoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCBsYW1iZGEgZnVuY3Rpb25hbGl0eSBzdGF5cyB0aGUgc2FtZS4gIFRoZSBvdXRwdXQgcHJvZHVjZWQKKyAgICAgICAgY3VycmVudGx5IGlzLCBJIHN1c3BlY3QgaW52YWxpZCBiZWNhdXNlIG9mIHRoZSB1bmVuY29kZWQgYnJhY2tldHMgaW4gdGhlCisgICAgICAgIEhUTUwsICI8bGFtYmRhPiIuCisKKyAgICAgICAgVGhlIHN1YnRyYWN0aW9uIGxhbWJkYSBtZXRob2QgaXMgdGVzdGVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi8iKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldHJlc3BvbnNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEluKCc8ZGw+PGR0PjxhIG5hbWU9Ii0mbHQ7bGFtYmRhJmd0OyI+PHN0cm9uZz4nCisgICAgICAgICAgICAgICAgICAgICAgJyZsdDtsYW1iZGEmZ3Q7PC9zdHJvbmc+PC9hPih4LCB5KTwvZHQ+PC9kbD4nLAorICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWQoKSkKKworICAgIEBtYWtlX3JlcXVlc3RfYW5kX3NraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfYXV0b2xpbmtpbmcoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhhdCB0aGUgc2VydmVyIGNvcnJlY3RseSBhdXRvbWF0aWNhbGx5IHdyYXBzIHJlZmVyZW5jZXMgdG8KKyAgICAgICAgUEVQUyBhbmQgUkZDcyB3aXRoIGxpbmtzLCBhbmQgdGhhdCBpdCBsaW5raWZpZXMgdGV4dCBzdGFydGluZyB3aXRoCisgICAgICAgIGh0dHAgb3IgZnRwIHByb3RvY29sIHByZWZpeGVzLgorCisgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgImFkZCIgbWV0aG9kIGNvbnRhaW5zIHRoZSB0ZXN0IG1hdGVyaWFsLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi8iKQorICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldHJlc3BvbnNlKCkKKworICAgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICAgKCc8ZGw+PGR0PjxhIG5hbWU9Ii1hZGQiPjxzdHJvbmc+YWRkPC9zdHJvbmc+PC9hPih4LCB5KTwvZHQ+PGRkPicKKyAgICAgICAgICAgICAnPHR0PkFkZCZuYnNwO3R3byZuYnNwO2luc3RhbmNlcyZuYnNwO3RvZ2V0aGVyLiZuYnNwO1RoaXMmbmJzcDsnCisgICAgICAgICAgICAgJ2ZvbGxvd3MmbmJzcDs8YSBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAwMDgvIj4nCisgICAgICAgICAgICAgJ1BFUDAwODwvYT4sJm5ic3A7YnV0Jm5ic3A7aGFzJm5ic3A7bm90aGluZzxicj5cbnRvJm5ic3A7ZG8mbmJzcDsnCisgICAgICAgICAgICAgJ3dpdGgmbmJzcDs8YSBocmVmPSJodHRwOi8vd3d3LnJmYy1lZGl0b3Iub3JnL3JmYy9yZmMxOTUyLnR4dCI+JworICAgICAgICAgICAgICdSRkMxOTUyPC9hPi4mbmJzcDtDYXNlJm5ic3A7c2hvdWxkJm5ic3A7bWF0dGVyOiZuYnNwO3BFcDAwOCZuYnNwOycKKyAgICAgICAgICAgICAnYW5kJm5ic3A7ckZDMTk1Mi4mbmJzcDsmbmJzcDtUaGluZ3M8YnI+XG50aGF0Jm5ic3A7c3RhcnQmbmJzcDsnCisgICAgICAgICAgICAgJ3dpdGgmbmJzcDtodHRwJm5ic3A7YW5kJm5ic3A7ZnRwJm5ic3A7c2hvdWxkJm5ic3A7YmUmbmJzcDsnCisgICAgICAgICAgICAgJ2F1dG8tbGlua2VkLCZuYnNwO3Rvbzo8YnI+XG48YSBocmVmPSJodHRwOi8vZ29vZ2xlLmNvbSI+JworICAgICAgICAgICAgICdodHRwOi8vZ29vZ2xlLmNvbTwvYT4uPC90dD48L2RkPjwvZGw+JyksIHJlc3BvbnNlLnJlYWQoKSkKKworICAgIEBtYWtlX3JlcXVlc3RfYW5kX3NraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3Rfc3lzdGVtX21ldGhvZHMoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhlIHByZWNlbnNlIG9mIHRocmVlIGNvbnNlY3V0aXZlIHN5c3RlbS4qIG1ldGhvZHMuCisKKyAgICAgICAgVGhpcyBhbHNvIHRlc3RzIHRoZWlyIHVzZSBvZiBwYXJhbWV0ZXIgdHlwZSByZWNvZ25pdGlvbiBhbmQgdGhlCisgICAgICAgIHN5c3RlbXMgcmVsYXRlZCB0byB0aGF0IHByb2Nlc3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmNsaWVudC5yZXF1ZXN0KCJHRVQiLCAiLyIpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQuZ2V0cmVzcG9uc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAoJzxkbD48ZHQ+PGEgbmFtZT0iLXN5c3RlbS5saXN0TWV0aG9kcyI+PHN0cm9uZz5zeXN0ZW0ubGlzdE1ldGhvZHMnCisgICAgICAgICAgICAgJzwvc3Ryb25nPjwvYT4oKTwvZHQ+PGRkPjx0dD48YSBocmVmPSIjLXN5c3RlbS5saXN0TWV0aG9kcyI+c3lzdGVtJworICAgICAgICAgICAgICcubGlzdE1ldGhvZHM8L2E+KCkmbmJzcDs9Jmd0OyZuYnNwO1tcJ2FkZFwnLCZuYnNwO1wnc3VidHJhY3RcJywnCisgICAgICAgICAgICAgJyZuYnNwO1wnbXVsdGlwbGVcJ108YnI+XG4mbmJzcDs8YnI+XG5SZXR1cm5zJm5ic3A7YSZuYnNwO2xpc3QnCisgICAgICAgICAgICAgJyZuYnNwO29mJm5ic3A7dGhlJm5ic3A7bWV0aG9kcyZuYnNwO3N1cHBvcnRlZCZuYnNwO2J5Jm5ic3A7dGhlJworICAgICAgICAgICAgICcmbmJzcDtzZXJ2ZXIuPC90dD48L2RkPjwvZGw+XG4gPGRsPjxkdD48YSBuYW1lPSItc3lzdGVtLm1ldGhvZEhlbHAiPicKKyAgICAgICAgICAgICAnPHN0cm9uZz5zeXN0ZW0ubWV0aG9kSGVscDwvc3Ryb25nPjwvYT4obWV0aG9kX25hbWUpPC9kdD48ZGQ+PHR0PicKKyAgICAgICAgICAgICAnPGEgaHJlZj0iIy1zeXN0ZW0ubWV0aG9kSGVscCI+c3lzdGVtLm1ldGhvZEhlbHA8L2E+KFwnYWRkXCcpJm5ic3A7JworICAgICAgICAgICAgICc9Jmd0OyZuYnNwOyJBZGRzJm5ic3A7dHdvJm5ic3A7aW50ZWdlcnMmbmJzcDt0b2dldGhlciI8YnI+XG4mbmJzcDsnCisgICAgICAgICAgICAgJzxicj5cblJldHVybnMmbmJzcDthJm5ic3A7c3RyaW5nJm5ic3A7Y29udGFpbmluZyZuYnNwO2RvY3VtZW50YXRpb24nCisgICAgICAgICAgICAgJyZuYnNwO2ZvciZuYnNwO3RoZSZuYnNwO3NwZWNpZmllZCZuYnNwO21ldGhvZC48L3R0PjwvZGQ+PC9kbD5cbiAnCisgICAgICAgICAgICAgJzxkbD48ZHQ+PGEgbmFtZT0iLXN5c3RlbS5tZXRob2RTaWduYXR1cmUiPjxzdHJvbmc+c3lzdGVtLicKKyAgICAgICAgICAgICAnbWV0aG9kU2lnbmF0dXJlPC9zdHJvbmc+PC9hPihtZXRob2RfbmFtZSk8L2R0PjxkZD48dHQ+PGEgaHJlZj0iIy0nCisgICAgICAgICAgICAgJ3N5c3RlbS5tZXRob2RTaWduYXR1cmUiPnN5c3RlbS5tZXRob2RTaWduYXR1cmU8L2E+KFwnYWRkXCcpJm5ic3A7JworICAgICAgICAgICAgICc9Jmd0OyZuYnNwO1tkb3VibGUsJm5ic3A7aW50LCZuYnNwO2ludF08YnI+XG4mbmJzcDs8YnI+XG5SZXR1cm5zJworICAgICAgICAgICAgICcmbmJzcDthJm5ic3A7bGlzdCZuYnNwO2Rlc2NyaWJpbmcmbmJzcDt0aGUmbmJzcDtzaWduYXR1cmUmbmJzcDtvZicKKyAgICAgICAgICAgICAnJm5ic3A7dGhlJm5ic3A7bWV0aG9kLiZuYnNwO0luJm5ic3A7dGhlPGJyPlxuYWJvdmUmbmJzcDtleGFtcGxlLCcKKyAgICAgICAgICAgICAnJm5ic3A7dGhlJm5ic3A7YWRkJm5ic3A7bWV0aG9kJm5ic3A7dGFrZXMmbmJzcDt0d28mbmJzcDtpbnRlZ2VycycKKyAgICAgICAgICAgICAnJm5ic3A7YXMmbmJzcDthcmd1bWVudHM8YnI+XG5hbmQmbmJzcDtyZXR1cm5zJm5ic3A7YSZuYnNwO2RvdWJsZScKKyAgICAgICAgICAgICAnJm5ic3A7cmVzdWx0Ljxicj5cbiZuYnNwOzxicj5cblRoaXMmbmJzcDtzZXJ2ZXImbmJzcDtkb2VzJm5ic3A7JworICAgICAgICAgICAgICdOT1QmbmJzcDtzdXBwb3J0Jm5ic3A7c3lzdGVtLm1ldGhvZFNpZ25hdHVyZS48L3R0PjwvZGQ+PC9kbD4nKSwKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWQoKSkKKworICAgIGRlZiB0ZXN0X2F1dG9saW5rX2RvdHRlZF9tZXRob2RzKHNlbGYpOgorICAgICAgICAiIiJUZXN0IHRoYXQgc2VsZmRvdCB2YWx1ZXMgYXJlIG1hZGUgc3Ryb25nIGF1dG9tYXRpY2FsbHkgaW4gdGhlCisgICAgICAgIGRvY3VtZW50YXRpb24uIiIiCisgICAgICAgIHNlbGYuY2xpZW50LnJlcXVlc3QoIkdFVCIsICIvIikKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiIiJUcnkmbmJzcDtzZWxmLjxzdHJvbmc+YWRkPC9zdHJvbmc+LCZuYnNwO3Rvby4iIiIsCisgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZCgpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChEb2NYTUxSUENIVFRQR0VUU2VydmVyKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZjNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kb2N4bWxycGMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjZjNjk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1iZGJtLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtYmRibS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFmYWMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtYmRibS5weQpAQCAtMCwwICsxLDE3OSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSBkdW1iZGJtIG1vZHVsZQorICAgT3JpZ2luYWwgYnkgUm9nZXIgRS4gTWFzc2UKKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGR1bWJkYm0KK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK19mbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKworZGVmIF9kZWxldGVfZmlsZXMoKToKKyAgICBmb3IgZXh0IGluIFsiLmRpciIsICIuZGF0IiwgIi5iYWsiXToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKF9mbmFtZSArIGV4dCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIER1bWJEQk1UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgX2RpY3QgPSB7JzAnOiAnJywKKyAgICAgICAgICAgICAnYSc6ICdQeXRob246JywKKyAgICAgICAgICAgICAnYic6ICdQcm9ncmFtbWluZycsCisgICAgICAgICAgICAgJ2MnOiAndGhlJywKKyAgICAgICAgICAgICAnZCc6ICd3YXknLAorICAgICAgICAgICAgICdmJzogJ0d1aWRvJywKKyAgICAgICAgICAgICAnZyc6ICdpbnRlbmRlZCcKKyAgICAgICAgICAgICB9CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncykKKworICAgIGRlZiB0ZXN0X2R1bWJkYm1fY3JlYXRpb24oc2VsZik6CisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lLCAnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5rZXlzKCksIFtdKQorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2RpY3Q6CisgICAgICAgICAgICBmW2tleV0gPSBzZWxmLl9kaWN0W2tleV0KKyAgICAgICAgc2VsZi5yZWFkX2hlbHBlcihmKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2R1bWJkYm1fY3JlYXRpb25fbW9kZShzZWxmKToKKyAgICAgICAgIyBPbiBwbGF0Zm9ybXMgd2l0aG91dCBjaG1vZCwgZG9uJ3QgZG8gYW55dGhpbmcuCisgICAgICAgIGlmIG5vdCAoaGFzYXR0cihvcywgJ2NobW9kJykgYW5kIGhhc2F0dHIob3MsICd1bWFzaycpKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9sZF91bWFzayA9IG9zLnVtYXNrKDAwMDIpCisgICAgICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ2MnLCAwNjM3KQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bWFzayhvbGRfdW1hc2spCisKKyAgICAgICAgZXhwZWN0ZWRfbW9kZSA9IDA2MzUKKyAgICAgICAgaWYgb3MubmFtZSAhPSAncG9zaXgnOgorICAgICAgICAgICAgIyBXaW5kb3dzIG9ubHkgc3VwcG9ydHMgc2V0dGluZyB0aGUgcmVhZC1vbmx5IGF0dHJpYnV0ZS4KKyAgICAgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgZmFpbCwgYnV0IGRvZXNuJ3Qgd29yayBsaWtlIFVuaXggZWl0aGVyLgorICAgICAgICAgICAgZXhwZWN0ZWRfbW9kZSA9IDA2NjYKKworICAgICAgICBpbXBvcnQgc3RhdAorICAgICAgICBzdCA9IG9zLnN0YXQoX2ZuYW1lICsgJy5kYXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQuU19JTU9ERShzdC5zdF9tb2RlKSwgZXhwZWN0ZWRfbW9kZSkKKyAgICAgICAgc3QgPSBvcy5zdGF0KF9mbmFtZSArICcuZGlyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0LlNfSU1PREUoc3Quc3RfbW9kZSksIGV4cGVjdGVkX21vZGUpCisKKyAgICBkZWYgdGVzdF9jbG9zZV90d2ljZShzZWxmKToKKyAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUpCisgICAgICAgIGZbJ2EnXSA9ICdiJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZbJ2EnXSwgJ2InKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9kdW1iZGJtX21vZGlmaWNhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5pbml0X2RiKCkKKyAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUsICd3JykKKyAgICAgICAgc2VsZi5fZGljdFsnZyddID0gZlsnZyddID0gImluZGVudGVkIgorICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZHVtYmRibV9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmluaXRfZGIoKQorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ3InKQorICAgICAgICBzZWxmLnJlYWRfaGVscGVyKGYpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZHVtYmRibV9rZXlzKHNlbGYpOgorICAgICAgICBzZWxmLmluaXRfZGIoKQorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSkKKyAgICAgICAga2V5cyA9IHNlbGYua2V5c19oZWxwZXIoZikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF93cml0ZV93cml0ZV9yZWFkKHNlbGYpOgorICAgICAgICAjIHRlc3QgZm9yIGJ1ZyAjNDgyNDYwCisgICAgICAgIGYgPSBkdW1iZGJtLm9wZW4oX2ZuYW1lKQorICAgICAgICBmWycxJ10gPSAnaGVsbG8nCisgICAgICAgIGZbJzEnXSA9ICdoZWxsbzInCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmWycxJ10sICdoZWxsbzInKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2xpbmVfZW5kaW5ncyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGZvciBidWcgIzExNzI3NjM6IGR1bWJkYm0gd291bGQgZGllIGlmIHRoZSBsaW5lIGVuZGluZ3MKKyAgICAgICAgIyB3ZXJlbid0IHdoYXQgd2FzIGV4cGVjdGVkLgorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSkKKyAgICAgICAgZlsnMSddID0gJ2hlbGxvJworICAgICAgICBmWycyJ10gPSAnaGVsbG8yJworICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIE1hbmdsZSB0aGUgZmlsZSBieSBhZGRpbmcgXHIgYmVmb3JlIGVhY2ggbmV3bGluZQorICAgICAgICBkYXRhID0gb3BlbihfZm5hbWUgKyAnLmRpcicpLnJlYWQoKQorICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCdcbicsICdcclxuJykKKyAgICAgICAgb3BlbihfZm5hbWUgKyAnLmRpcicsICd3YicpLndyaXRlKGRhdGEpCisKKyAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZlsnMSddLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZbJzInXSwgJ2hlbGxvMicpCisKKworICAgIGRlZiByZWFkX2hlbHBlcihzZWxmLCBmKToKKyAgICAgICAga2V5cyA9IHNlbGYua2V5c19oZWxwZXIoZikKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kaWN0W2tleV0sIGZba2V5XSkKKworICAgIGRlZiBpbml0X2RiKHNlbGYpOgorICAgICAgICBmID0gZHVtYmRibS5vcGVuKF9mbmFtZSwgJ3cnKQorICAgICAgICBmb3IgayBpbiBzZWxmLl9kaWN0OgorICAgICAgICAgICAgZltrXSA9IHNlbGYuX2RpY3Rba10KKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYga2V5c19oZWxwZXIoc2VsZiwgZik6CisgICAgICAgIGtleXMgPSBmLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBka2V5cyA9IHNlbGYuX2RpY3Qua2V5cygpCisgICAgICAgIGRrZXlzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIGRrZXlzKQorICAgICAgICByZXR1cm4ga2V5cworCisgICAgIyBQZXJmb3JtIHJhbmRvbWl6ZWQgb3BlcmF0aW9ucy4gIFRoaXMgZG9lc24ndCBtYWtlIGFzc3VtcHRpb25zIGFib3V0CisgICAgIyB3aGF0ICptaWdodCogZmFpbC4KKyAgICBkZWYgdGVzdF9yYW5kb20oc2VsZik6CisgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgZCA9IHt9ICAjIG1pcnJvciB0aGUgZGF0YWJhc2UKKyAgICAgICAgZm9yIGR1bW15IGluIHJhbmdlKDUpOgorICAgICAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUpCisgICAgICAgICAgICBmb3IgZHVtbXkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgICAgICBrID0gcmFuZG9tLmNob2ljZSgnYWJjZGVmZ2hpamtsbScpCisgICAgICAgICAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC4yOgorICAgICAgICAgICAgICAgICAgICBpZiBrIGluIGQ6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgZFtrXQorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGZba10KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB2ID0gcmFuZG9tLmNob2ljZSgnYWJjJykgKiByYW5kb20ucmFuZHJhbmdlKDEwMDAwKQorICAgICAgICAgICAgICAgICAgICBkW2tdID0gdgorICAgICAgICAgICAgICAgICAgICBmW2tdID0gdgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZba10sIHYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IGR1bWJkYm0ub3BlbihfZm5hbWUpCisgICAgICAgICAgICBleHBlY3RlZCA9IGQuaXRlbXMoKQorICAgICAgICAgICAgZXhwZWN0ZWQuc29ydCgpCisgICAgICAgICAgICBnb3QgPSBmLml0ZW1zKCkKKyAgICAgICAgICAgIGdvdC5zb3J0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBfZGVsZXRlX2ZpbGVzKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgX2RlbGV0ZV9maWxlcygpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRHVtYkRCTVRlc3RDYXNlKQorICAgIGZpbmFsbHk6CisgICAgICAgIF9kZWxldGVfZmlsZXMoKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1iZGJtLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bWJkYm0ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODkwODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1iZGJtLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1iZGJtLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bWJkYm0ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODkwODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1iZGJtLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDliZGQzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weQpAQCAtMCwwICsxLDE4MiBAQAorIiIiR2VuZXJpYyB0aHJlYWQgdGVzdHMuCisKK01lYW50IHRvIGJlIHVzZWQgYnkgZHVtbXlfdGhyZWFkIGFuZCB0aHJlYWQuICBUbyBhbGxvdyBmb3IgZGlmZmVyZW50IG1vZHVsZXMKK3RvIGJlIHVzZWQsIHRlc3RfbWFpbigpIGNhbiBiZSBjYWxsZWQgd2l0aCB0aGUgbW9kdWxlIHRvIHVzZSBhcyB0aGUgdGhyZWFkCitpbXBsZW1lbnRhdGlvbiBhcyBpdHMgc29sZSBhcmd1bWVudC4KKworIiIiCitpbXBvcnQgZHVtbXlfdGhyZWFkIGFzIF90aHJlYWQKK2ltcG9ydCB0aW1lCitpbXBvcnQgUXVldWUKK2ltcG9ydCByYW5kb20KK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworREVMQVkgPSAwICMgU2V0ID4gMCB3aGVuIHRlc3RpbmcgYSBtb2R1bGUgb3RoZXIgdGhhbiBkdW1teV90aHJlYWQsIHN1Y2ggYXMKKyAgICAgICAgICAjIHRoZSAndGhyZWFkJyBtb2R1bGUuCisKK2NsYXNzIExvY2tUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBsb2NrIG9iamVjdHMuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgbG9jaworICAgICAgICBzZWxmLmxvY2sgPSBfdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorCisgICAgZGVmIHRlc3RfaW5pdGxvY2soc2VsZik6CisgICAgICAgICNNYWtlIHN1cmUgbG9ja3Mgc3RhcnQgbG9ja2VkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5sb2NrLmxvY2tlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxvY2sgb2JqZWN0IGlzIG5vdCBpbml0aWFsaXplZCB1bmxvY2tlZC4iKQorCisgICAgZGVmIHRlc3RfcmVsZWFzZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHNlbGYubG9jay5yZWxlYXNlKCkKKyAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLmxvY2sucmVsZWFzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5sb2NrLmxvY2tlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkxvY2sgb2JqZWN0IGRpZCBub3QgcmVsZWFzZSBwcm9wZXJseS4iKQorCisgICAgZGVmIHRlc3RfaW1wcm9wZXJfcmVsZWFzZShzZWxmKToKKyAgICAgICAgI01ha2Ugc3VyZSByZWxlYXNlIG9mIGFuIHVubG9ja2VkIHRocmVhZCByYWlzZXMgX3RocmVhZC5lcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhfdGhyZWFkLmVycm9yLCBzZWxmLmxvY2sucmVsZWFzZSkKKworICAgIGRlZiB0ZXN0X2NvbmRfYWNxdWlyZV9zdWNjZXNzKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIHRoZSBjb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgdGhlIGxvY2sgd29ya3MuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmxvY2suYWNxdWlyZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgdGhlIGxvY2sgZmFpbGVkLiIpCisKKyAgICBkZWYgdGVzdF9jb25kX2FjcXVpcmVfZmFpbChzZWxmKToKKyAgICAgICAgI1Rlc3QgYWNxdWlyaW5nIGxvY2tlZCBsb2NrIHJldHVybnMgRmFsc2UKKyAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmxvY2suYWNxdWlyZSgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgYSBsb2NrZWQgbG9jayBpbmNvcnJlY3RseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2NlZWRlZC4iKQorCisgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfc3VjY2VzcyhzZWxmKToKKyAgICAgICAgI01ha2Ugc3VyZSB1bmNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiBhIGxvY2sgd29ya3MuCisgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubG9jay5sb2NrZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmNvbmRpb25hbCBsb2NraW5nIGZhaWxlZC4iKQorCisgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfcmV0dXJuX3ZhbChzZWxmKToKKyAgICAgICAgI01ha2Ugc3VyZSB0aGF0IGFuIHVuY29uZGl0aW9uYWwgbG9ja2luZyByZXR1cm5zIFRydWUuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmxvY2suYWNxdWlyZSgxKSBpcyBUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIlVuY29uZGl0aW9uYWwgbG9ja2luZyBkaWQgbm90IHJldHVybiBUcnVlLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmxvY2suYWNxdWlyZSgpIGlzIFRydWUpCisKKyAgICBkZWYgdGVzdF91bmNvbmRfYWNxdWlyZV9ibG9ja2luZyhzZWxmKToKKyAgICAgICAgI01ha2Ugc3VyZSB0aGF0IHVuY29uZGl0aW9uYWwgYWNxdWlyaW5nIG9mIGEgbG9ja2VkIGxvY2sgYmxvY2tzLgorICAgICAgICBkZWYgZGVsYXlfdW5sb2NrKHRvX3VubG9jaywgZGVsYXkpOgorICAgICAgICAgICAgIiIiSG9sZCBvbiB0byBsb2NrIGZvciBhIHNldCBhbW91bnQgb2YgdGltZSBiZWZvcmUgdW5sb2NraW5nLiIiIgorICAgICAgICAgICAgdGltZS5zbGVlcChkZWxheSkKKyAgICAgICAgICAgIHRvX3VubG9jay5yZWxlYXNlKCkKKworICAgICAgICBzZWxmLmxvY2suYWNxdWlyZSgpCisgICAgICAgIHN0YXJ0X3RpbWUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZChkZWxheV91bmxvY2ssKHNlbGYubG9jaywgREVMQVkpKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAiKioqIFdhaXRpbmcgZm9yIHRocmVhZCB0byByZWxlYXNlIHRoZSBsb2NrICJcCisgICAgICAgICAgICAiKGFwcHJveC4gJXMgc2VjLikgKioqIiAlIERFTEFZCisgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKKyAgICAgICAgZW5kX3RpbWUgPSBpbnQodGltZS50aW1lKCkpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgImRvbmUiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoZW5kX3RpbWUgLSBzdGFydF90aW1lKSA+PSBERUxBWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJCbG9ja2luZyBieSB1bmNvbmRpdGlvbmFsIGFjcXVpcmluZyBmYWlsZWQuIikKKworY2xhc3MgTWlzY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJNaXNjZWxsYW5lb3VzIHRlc3RzLiIiIgorCisgICAgZGVmIHRlc3RfZXhpdChzZWxmKToKKyAgICAgICAgI01ha2Ugc3VyZSBfdGhyZWFkLmV4aXQoKSByYWlzZXMgU3lzdGVtRXhpdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0LCBfdGhyZWFkLmV4aXQpCisKKyAgICBkZWYgdGVzdF9pZGVudChzZWxmKToKKyAgICAgICAgI1Rlc3Qgc2FuaXR5IG9mIF90aHJlYWQuZ2V0X2lkZW50KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKF90aHJlYWQuZ2V0X2lkZW50KCksIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdGhyZWFkLmdldF9pZGVudCgpIHJldHVybmVkIGEgbm9uLWludGVnZXIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3RocmVhZC5nZXRfaWRlbnQoKSAhPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIl90aHJlYWQuZ2V0X2lkZW50KCkgcmV0dXJuZWQgMCIpCisKKyAgICBkZWYgdGVzdF9Mb2NrVHlwZShzZWxmKToKKyAgICAgICAgI01ha2Ugc3VyZSBfdGhyZWFkLkxvY2tUeXBlIGlzIHRoZSBzYW1lIHR5cGUgYXMgX3RocmVhZC5hbGxvY2F0ZV9sb2NrZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShfdGhyZWFkLmFsbG9jYXRlX2xvY2soKSwgX3RocmVhZC5Mb2NrVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfdGhyZWFkLkxvY2tUeXBlIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiB3aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpcyByZXR1cm5lZCBieSBfdGhyZWFkLmFsbG9jYXRlX2xvY2soKSIpCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRfbWFpbihzZWxmKToKKyAgICAgICAgI0NhbGxpbmcgc3RhcnRfbmV3X3RocmVhZCB3aXRoIGEgZnVuY3Rpb24gdGhhdCBleGVjdXRlcyBpbnRlcnJ1cHRfbWFpbgorICAgICAgICAjIHNob3VsZCByYWlzZSBLZXlib2FyZEludGVycnVwdCB1cG9uIGNvbXBsZXRpb24uCisgICAgICAgIGRlZiBjYWxsX2ludGVycnVwdCgpOgorICAgICAgICAgICAgX3RocmVhZC5pbnRlcnJ1cHRfbWFpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleWJvYXJkSW50ZXJydXB0LCBfdGhyZWFkLnN0YXJ0X25ld190aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX2ludGVycnVwdCwgdHVwbGUoKSkKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdF9pbl9tYWluKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGlmIGludGVycnVwdF9tYWluIGlzIGNhbGxlZCBpbiBtYWluIHRocmVhdCB0aGF0CisgICAgICAgICMgS2V5Ym9hcmRJbnRlcnJ1cHQgaXMgcmFpc2VkIGluc3RhbnRseS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuaW50ZXJydXB0X21haW4pCisKK2NsYXNzIFRocmVhZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRocmVhZCBjcmVhdGlvbi4iIiIKKworICAgIGRlZiB0ZXN0X2FyZ19wYXNzaW5nKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIHRoYXQgcGFyYW1ldGVyIHBhc3Npbmcgd29ya3MuCisgICAgICAgIGRlZiBhcmdfdGVzdGVyKHF1ZXVlLCBhcmcxPUZhbHNlLCBhcmcyPUZhbHNlKToKKyAgICAgICAgICAgICIiIlVzZSB0byB0ZXN0IF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgpIHBhc3NlcyBhcmdzIHByb3Blcmx5LiIiIgorICAgICAgICAgICAgcXVldWUucHV0KChhcmcxLCBhcmcyKSkKKworICAgICAgICB0ZXN0aW5nX3F1ZXVlID0gUXVldWUuUXVldWUoMSkKKyAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGFyZ190ZXN0ZXIsICh0ZXN0aW5nX3F1ZXVlLCBUcnVlLCBUcnVlKSkKKyAgICAgICAgcmVzdWx0ID0gdGVzdGluZ19xdWV1ZS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgcGFzc2luZyBmb3IgdGhyZWFkIGNyZWF0aW9uIHVzaW5nIHR1cGxlIGZhaWxlZCIpCisgICAgICAgIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZChhcmdfdGVzdGVyLCB0dXBsZSgpLCB7J3F1ZXVlJzp0ZXN0aW5nX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhcmcxJzpUcnVlLCAnYXJnMic6VHJ1ZX0pCisgICAgICAgIHJlc3VsdCA9IHRlc3RpbmdfcXVldWUuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdFswXSBhbmQgcmVzdWx0WzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFyZ3VtZW50IHBhc3NpbmcgZm9yIHRocmVhZCBjcmVhdGlvbiB1c2luZyBrd2FyZ3MgZmFpbGVkIikKKyAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGFyZ190ZXN0ZXIsICh0ZXN0aW5nX3F1ZXVlLCBUcnVlKSwgeydhcmcyJzpUcnVlfSkKKyAgICAgICAgcmVzdWx0ID0gdGVzdGluZ19xdWV1ZS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgcGFzc2luZyBmb3IgdGhyZWFkIGNyZWF0aW9uIHVzaW5nIGJvdGggdHVwbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBrd2FyZ3MgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X211bHRpX2NyZWF0aW9uKHNlbGYpOgorICAgICAgICAjTWFrZSBzdXJlIG11bHRpcGxlIHRocmVhZHMgY2FuIGJlIGNyZWF0ZWQuCisgICAgICAgIGRlZiBxdWV1ZV9tYXJrKHF1ZXVlLCBkZWxheSk6CisgICAgICAgICAgICAiIiJXYWl0IGZvciBgYGRlbGF5YGAgc2Vjb25kcyBhbmQgdGhlbiBwdXQgc29tZXRoaW5nIGludG8gYGBxdWV1ZWBgIiIiCisgICAgICAgICAgICB0aW1lLnNsZWVwKGRlbGF5KQorICAgICAgICAgICAgcXVldWUucHV0KF90aHJlYWQuZ2V0X2lkZW50KCkpCisKKyAgICAgICAgdGhyZWFkX2NvdW50ID0gNQorICAgICAgICB0ZXN0aW5nX3F1ZXVlID0gUXVldWUuUXVldWUodGhyZWFkX2NvdW50KQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAiKioqIFRlc3RpbmcgbXVsdGlwbGUgdGhyZWFkIGNyZWF0aW9uICJcCisgICAgICAgICAgICAiKHdpbGwgdGFrZSBhcHByb3guICVzIHRvICVzIHNlYy4pICoqKiIgJSAoREVMQVksIHRocmVhZF9jb3VudCkKKyAgICAgICAgZm9yIGNvdW50IGluIHhyYW5nZSh0aHJlYWRfY291bnQpOgorICAgICAgICAgICAgaWYgREVMQVk6CisgICAgICAgICAgICAgICAgbG9jYWxfZGVsYXkgPSByb3VuZChyYW5kb20ucmFuZG9tKCksIDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvY2FsX2RlbGF5ID0gMAorICAgICAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKHF1ZXVlX21hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RpbmdfcXVldWUsIGxvY2FsX2RlbGF5KSkKKyAgICAgICAgdGltZS5zbGVlcChERUxBWSkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnZG9uZScKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RpbmdfcXVldWUucXNpemUoKSA9PSB0aHJlYWRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm90IGFsbCAlcyB0aHJlYWRzIGV4ZWN1dGVkIHByb3Blcmx5IGFmdGVyICVzIHNlYy4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICh0aHJlYWRfY291bnQsIERFTEFZKSkKKworZGVmIHRlc3RfbWFpbihpbXBvcnRlZF9tb2R1bGU9Tm9uZSk6CisgICAgZ2xvYmFsIF90aHJlYWQsIERFTEFZCisgICAgaWYgaW1wb3J0ZWRfbW9kdWxlOgorICAgICAgICBfdGhyZWFkID0gaW1wb3J0ZWRfbW9kdWxlCisgICAgICAgIERFTEFZID0gMgorICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBwcmludAorICAgICAgICBwcmludCAiKioqIFVzaW5nICVzIGFzIF90aHJlYWQgbW9kdWxlICoqKiIgJSBfdGhyZWFkCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChMb2NrVGVzdHMsIE1pc2NUZXN0cywgVGhyZWFkVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTFlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZTFlMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZGluZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2R1bW15X3RocmVhZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjU5ZDVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkaW5nLnB5CkBAIC0wLDAgKzEsNjMgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBkdW1teV90aHJlYWRpbmcgYXMgX3RocmVhZGluZworaW1wb3J0IHRpbWUKKworY2xhc3MgRHVtbXlUaHJlYWRpbmdUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBjbGFzcyBUZXN0VGhyZWFkKF90aHJlYWRpbmcuVGhyZWFkKToKKworICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgZ2xvYmFsIHJ1bm5pbmcKKyAgICAgICAgICAgIGdsb2JhbCBzZW1hCisgICAgICAgICAgICBnbG9iYWwgbXV0ZXgKKyAgICAgICAgICAgICMgVW5jb21tZW50IGlmIHRlc3RpbmcgYW5vdGhlciBtb2R1bGUsIHN1Y2ggYXMgdGhlIHJlYWwgJ3RocmVhZGluZycKKyAgICAgICAgICAgICMgbW9kdWxlLgorICAgICAgICAgICAgI2RlbGF5ID0gcmFuZG9tLnJhbmRvbSgpICogMgorICAgICAgICAgICAgZGVsYXkgPSAwCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAndGFzaycsIHNlbGYubmFtZSwgJ3dpbGwgcnVuIGZvcicsIGRlbGF5LCAnc2VjJworICAgICAgICAgICAgc2VtYS5hY3F1aXJlKCkKKyAgICAgICAgICAgIG11dGV4LmFjcXVpcmUoKQorICAgICAgICAgICAgcnVubmluZyArPSAxCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCBydW5uaW5nLCAndGFza3MgYXJlIHJ1bm5pbmcnCisgICAgICAgICAgICBtdXRleC5yZWxlYXNlKCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoZGVsYXkpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAndGFzaycsIHNlbGYubmFtZSwgJ2RvbmUnCisgICAgICAgICAgICBtdXRleC5hY3F1aXJlKCkKKyAgICAgICAgICAgIHJ1bm5pbmcgLT0gMQorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgc2VsZi5uYW1lLCAnaXMgZmluaXNoZWQuJywgcnVubmluZywgJ3Rhc2tzIGFyZSBydW5uaW5nJworICAgICAgICAgICAgbXV0ZXgucmVsZWFzZSgpCisgICAgICAgICAgICBzZW1hLnJlbGVhc2UoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm51bXRhc2tzID0gMTAKKyAgICAgICAgZ2xvYmFsIHNlbWEKKyAgICAgICAgc2VtYSA9IF90aHJlYWRpbmcuQm91bmRlZFNlbWFwaG9yZSh2YWx1ZT0zKQorICAgICAgICBnbG9iYWwgbXV0ZXgKKyAgICAgICAgbXV0ZXggPSBfdGhyZWFkaW5nLlJMb2NrKCkKKyAgICAgICAgZ2xvYmFsIHJ1bm5pbmcKKyAgICAgICAgcnVubmluZyA9IDAKKyAgICAgICAgc2VsZi50aHJlYWRzID0gW10KKworICAgIGRlZiB0ZXN0X3Rhc2tzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLm51bXRhc2tzKToKKyAgICAgICAgICAgIHQgPSBzZWxmLlRlc3RUaHJlYWQobmFtZT0iPHRocmVhZCAlZD4iJWkpCisgICAgICAgICAgICBzZWxmLnRocmVhZHMuYXBwZW5kKHQpCisgICAgICAgICAgICB0LnN0YXJ0KCkKKworICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd3YWl0aW5nIGZvciBhbGwgdGFza3MgdG8gY29tcGxldGUnCisgICAgICAgIGZvciB0IGluIHNlbGYudGhyZWFkczoKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ2FsbCB0YXNrcyBkb25lJworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChEdW1teVRocmVhZGluZ1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWRpbmcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA4MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9kdW1teV90aHJlYWRpbmcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjA4MTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNmUwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weQpAQCAtMCwwICsxLDE0IEBACisjIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cworCisjIFRoZSBzcGVjaWZpYyB0ZXN0cyBub3cgbGl2ZSBpbiBMaWIvZW1haWwvdGVzdAorZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWwgaW1wb3J0IHN1aXRlCitmcm9tIGVtYWlsLnRlc3QudGVzdF9lbWFpbF9yZW5hbWVkIGltcG9ydCBzdWl0ZSBhcyBzdWl0ZTIKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHN1aXRlKCkpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChzdWl0ZTIoKSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTIzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTIzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTFmODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKQEAgLTAsMCArMSwxNSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgZW1haWwgcGFja2FnZSB1bml0IHRlc3RzIGZvciAob3B0aW9uYWwpIEFzaWFuIGNvZGVjcworCisjIFRoZSBzcGVjaWZpYyB0ZXN0cyBub3cgbGl2ZSBpbiBMaWIvZW1haWwvdGVzdAorZnJvbSBlbWFpbC50ZXN0IGltcG9ydCB0ZXN0X2VtYWlsX2NvZGVjcworZnJvbSBlbWFpbC50ZXN0IGltcG9ydCB0ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VpdGUgPSB0ZXN0X2VtYWlsX2NvZGVjcy5zdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh0ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnN1aXRlKCkpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChzdWl0ZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzNjIzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzNjIzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4MTRkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKQEAgLTAsMCArMSwxMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMKKworIyBUaGUgc3BlY2lmaWMgdGVzdHMgbm93IGxpdmUgaW4gTGliL2VtYWlsL3Rlc3QKK2Zyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsX3JlbmFtZWQgaW1wb3J0IHN1aXRlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDI1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDI1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbnVtZXJhdGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbnVtZXJhdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5ZmY3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weQpAQCAtMCwwICsxLDI1NSBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIEc6CisgICAgJ1NlcXVlbmNlIHVzaW5nIF9fZ2V0aXRlbV9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VxbltpXQorCitjbGFzcyBJOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pID49IGxlbihzZWxmLnNlcW4pOiByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHYgPSBzZWxmLnNlcW5bc2VsZi5pXQorICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICByZXR1cm4gdgorCitjbGFzcyBJZzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgaXRlcmF0b3IgcHJvdG9jb2wgZGVmaW5lZCB3aXRoIGEgZ2VuZXJhdG9yJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgdmFsIGluIHNlbGYuc2VxbjoKKyAgICAgICAgICAgIHlpZWxkIHZhbAorCitjbGFzcyBYOgorICAgICdNaXNzaW5nIF9fZ2V0aXRlbV9fIGFuZCBfX2l0ZXJfXycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmkgPj0gbGVuKHNlbGYuc2Vxbik6IHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgdiA9IHNlbGYuc2VxbltzZWxmLmldCisgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgIHJldHVybiB2CisKK2NsYXNzIEU6CisgICAgJ1Rlc3QgcHJvcGFnYXRpb24gb2YgZXhjZXB0aW9ucycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgMyAvLyAwCisKK2NsYXNzIE46CisgICAgJ0l0ZXJhdG9yIG1pc3NpbmcgbmV4dCgpJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBFbnVtZXJhdGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBlbnVtID0gZW51bWVyYXRlCisgICAgc2VxLCByZXMgPSAnYWJjJywgWygwLCdhJyksICgxLCdiJyksICgyLCdjJyldCisKKyAgICBkZWYgdGVzdF9iYXNpY2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc2VsZi5lbnVtKHNlbGYuc2VxKSksIHNlbGYuZW51bSkKKyAgICAgICAgZSA9IHNlbGYuZW51bShzZWxmLnNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVyKGUpLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc2VsZi5lbnVtKHNlbGYuc2VxKSksIHNlbGYucmVzKQorICAgICAgICBzZWxmLmVudW0uX19kb2NfXworCisgICAgZGVmIHRlc3RfZ2V0aXRlbXNlcW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLmVudW0oRyhzZWxmLnNlcSkpKSwgc2VsZi5yZXMpCisgICAgICAgIGUgPSBzZWxmLmVudW0oRygnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGUubmV4dCkKKworICAgIGRlZiB0ZXN0X2l0ZXJhdG9yc2VxbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNlbGYuZW51bShJKHNlbGYuc2VxKSkpLCBzZWxmLnJlcykKKyAgICAgICAgZSA9IHNlbGYuZW51bShJKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZS5uZXh0KQorCisgICAgZGVmIHRlc3RfaXRlcmF0b3JnZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLmVudW0oSWcoc2VsZi5zZXEpKSksIHNlbGYucmVzKQorICAgICAgICBlID0gc2VsZi5lbnVtKElnKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZS5uZXh0KQorCisgICAgZGVmIHRlc3Rfbm9uaXRlcmFibGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5lbnVtLCBYKHNlbGYuc2VxKSkKKworICAgIGRlZiB0ZXN0X2lsbGZvcm1lZGl0ZXJhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIHNlbGYuZW51bShOKHNlbGYuc2VxKSkpCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fcHJvcGFnYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBzZWxmLmVudW0oRShzZWxmLnNlcSkpKQorCisgICAgZGVmIHRlc3RfYXJndW1lbnRjaGVjayhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmVudW0pICMgbm8gYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5lbnVtLCAxKSAjIHdyb25nIHR5cGUgKG5vdCBpdGVyYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmVudW0sICdhYmMnLCAnYScpICMgd3JvbmcgdHlwZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZW51bSwgJ2FiYycsIDIsIDMpICMgdG9vIG1hbnkgYXJndW1lbnRzCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3R1cGxlX3JldXNlKHNlbGYpOgorICAgICAgICAjIFRlc3RzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCB3aGVyZSB0dXBsZSBpcyByZXVzZWQKKyAgICAgICAgIyB3aGVuZXZlciBub3RoaW5nIGVsc2UgaG9sZHMgYSByZWZlcmVuY2UgdG8gaXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0KG1hcChpZCwgbGlzdChlbnVtZXJhdGUoc2VsZi5zZXEpKSkpKSwgbGVuKHNlbGYuc2VxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2V0KG1hcChpZCwgZW51bWVyYXRlKHNlbGYuc2VxKSkpKSwgbWluKDEsbGVuKHNlbGYuc2VxKSkpCisKK2NsYXNzIE15RW51bShlbnVtZXJhdGUpOgorICAgIHBhc3MKKworY2xhc3MgU3ViY2xhc3NUZXN0Q2FzZShFbnVtZXJhdGVUZXN0Q2FzZSk6CisKKyAgICBlbnVtID0gTXlFbnVtCisKK2NsYXNzIFRlc3RFbXB0eShFbnVtZXJhdGVUZXN0Q2FzZSk6CisKKyAgICBzZXEsIHJlcyA9ICcnLCBbXQorCitjbGFzcyBUZXN0QmlnKEVudW1lcmF0ZVRlc3RDYXNlKToKKworICAgIHNlcSA9IHJhbmdlKDEwLDIwMDAwLDIpCisgICAgcmVzID0gemlwKHJhbmdlKDIwMDAwKSwgc2VxKQorCitjbGFzcyBUZXN0UmV2ZXJzZWQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIGkgPCA1OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyKGkpCisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDUKKyAgICAgICAgZm9yIGRhdGEgaW4gJ2FiYycsIHJhbmdlKDUpLCB0dXBsZShlbnVtZXJhdGUoJ2FiYycpKSwgQSgpLCB4cmFuZ2UoMSwxNyw1KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkYXRhKVs6Oi0xXSwgbGlzdChyZXZlcnNlZChkYXRhKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmV2ZXJzZWQsIHt9KQorICAgICAgICAjIGRvbid0IGFsbG93IGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmV2ZXJzZWQsIFtdLCBhPTEpCisKKyAgICBkZWYgdGVzdF9jbGFzc2ljX2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9fcmV2ZXJzZWRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gWzIsIDFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXZlcnNlZChBKCkpKSwgWzIsIDFdKQorCisgICAgZGVmIHRlc3RfeHJhbmdlX29wdGltaXphdGlvbihzZWxmKToKKyAgICAgICAgeCA9IHhyYW5nZSgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmV2ZXJzZWQoeCkpLCB0eXBlKGl0ZXIoeCkpKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIG5vdCBhbiBpbnRlcmZhY2UgcmVxdWlyZW1lbnQKKyAgICAgICAgZnJvbSB0ZXN0LnRlc3RfaXRlcmxlbiBpbXBvcnQgbGVuCisgICAgICAgIGZvciBzIGluICgnaGVsbG8nLCB0dXBsZSgnaGVsbG8nKSwgbGlzdCgnaGVsbG8nKSwgeHJhbmdlKDUpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJldmVyc2VkKHMpKSwgbGVuKHMpKQorICAgICAgICAgICAgciA9IHJldmVyc2VkKHMpCisgICAgICAgICAgICBsaXN0KHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyKSwgMCkKKyAgICAgICAgY2xhc3MgU2VxV2l0aFdlaXJkTGVuOgorICAgICAgICAgICAgY2FsbGVkID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNhbGxlZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxMAorICAgICAgICAgICAgICAgIHJhaXNlIFplcm9EaXZpc2lvbkVycm9yCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbmRleAorICAgICAgICByID0gcmV2ZXJzZWQoU2VxV2l0aFdlaXJkTGVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsZW4sIHIpCisKKworICAgIGRlZiB0ZXN0X2djKHNlbGYpOgorICAgICAgICBjbGFzcyBTZXE6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4CisgICAgICAgIHMgPSBTZXEoKQorICAgICAgICByID0gcmV2ZXJzZWQocykKKyAgICAgICAgcy5yID0gcgorCisgICAgZGVmIHRlc3RfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgW10sICdleHRyYScpCisKKyAgICBkZWYgdGVzdF9idWcxMjI5NDI5KHNlbGYpOgorICAgICAgICAjIHRoaXMgYnVnIHdhcyBuZXZlciBpbiByZXZlcnNlZCwgaXQgd2FzIGluCisgICAgICAgICMgUHlPYmplY3RfQ2FsbE1ldGhvZCwgYW5kIHJldmVyc2VkX25ldyBjYWxscyB0aGF0IHNvbWV0aW1lcy4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAiZ2V0cmVmY291bnQiKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICByID0gZi5fX3JldmVyc2VkX18gPSBvYmplY3QoKQorICAgICAgICByYyA9IHN5cy5nZXRyZWZjb3VudChyKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV2ZXJzZWQoZikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vbi1jYWxsYWJsZSBfX3JldmVyc2VkX18gZGlkbid0IHJhaXNlISIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIHN5cy5nZXRyZWZjb3VudChyKSkKKworICAgIGRlZiB0ZXN0X29iam1ldGhvZHMoc2VsZik6CisgICAgICAgICMgT2JqZWN0cyBtdXN0IGhhdmUgX19sZW5fXygpIGFuZCBfX2dldGl0ZW1fXygpIGltcGxlbWVudGVkLgorICAgICAgICBjbGFzcyBOb0xlbihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYpOiByZXR1cm4gMQorICAgICAgICBubCA9IE5vTGVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgbmwpCisKKyAgICAgICAgY2xhc3MgTm9HZXRJdGVtKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIDIKKyAgICAgICAgbmdpID0gTm9HZXRJdGVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXZlcnNlZCwgbmdpKQorCisKK2NsYXNzIEVudW1lcmF0ZVN0YXJ0VGVzdENhc2UoRW51bWVyYXRlVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWNmdW5jdGlvbihzZWxmKToKKyAgICAgICAgZSA9IHNlbGYuZW51bShzZWxmLnNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVyKGUpLCBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc2VsZi5lbnVtKHNlbGYuc2VxKSksIHNlbGYucmVzKQorCisKK2NsYXNzIFRlc3RTdGFydChFbnVtZXJhdGVTdGFydFRlc3RDYXNlKToKKworICAgIGVudW0gPSBsYW1iZGEgc2VsZiwgaTogZW51bWVyYXRlKGksIHN0YXJ0PTExKQorICAgIHNlcSwgcmVzID0gJ2FiYycsIFsoMTEsICdhJyksICgxMiwgJ2InKSwgKDEzLCAnYycpXQorCisKK2NsYXNzIFRlc3RMb25nU3RhcnQoRW51bWVyYXRlU3RhcnRUZXN0Q2FzZSk6CisKKyAgICBlbnVtID0gbGFtYmRhIHNlbGYsIGk6IGVudW1lcmF0ZShpLCBzdGFydD1zeXMubWF4aW50KzEpCisgICAgc2VxLCByZXMgPSAnYWJjJywgWyhzeXMubWF4aW50KzEsJ2EnKSwgKHN5cy5tYXhpbnQrMiwnYicpLAorICAgICAgICAgICAgICAgICAgICAgICAoc3lzLm1heGludCszLCdjJyldCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbnVtZXJhdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExY2JlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbnVtZXJhdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VudW1lcmF0ZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbnVtZXJhdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExY2JlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lbnVtZXJhdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VvZi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VvZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjM5MTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5CkBAIC0wLDAgKzEsMzIgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiInRlc3Qgc2NyaXB0IGZvciBhIGZldyBuZXcgaW52YWxpZCB0b2tlbiBjYXRjaGVzIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgRU9GVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X0VPRkMoc2VsZik6CisgICAgICAgIGV4cGVjdCA9ICJFT0wgd2hpbGUgc2Nhbm5pbmcgc3RyaW5nIGxpdGVyYWwgKDxzdHJpbmc+LCBsaW5lIDEpIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBldmFsKCIiIid0aGlzIGlzIGEgdGVzdFwKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihtc2cpLCBleHBlY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZAorCisgICAgZGVmIHRlc3RfRU9GUyhzZWxmKToKKyAgICAgICAgZXhwZWN0ID0gKCJFT0Ygd2hpbGUgc2Nhbm5pbmcgdHJpcGxlLXF1b3RlZCBzdHJpbmcgbGl0ZXJhbCAiCisgICAgICAgICAgICAgICAgICAiKDxzdHJpbmc+LCBsaW5lIDEpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXZhbCgiIiInJyd0aGlzIGlzIGEgdGVzdCIiIikKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihtc2cpLCBleHBlY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZAorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChFT0ZUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VvZi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMGRkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VvZi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZW9mLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VvZi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxMGRkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2VvZi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXBvbGwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcG9sbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjZkOWVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXBvbGwucHkKQEAgLTAsMCArMSwyMjIgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYgVHdpc3RlZCBNYXRyaXggTGFib3JhdG9yaWVzLgorIworIyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyMgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisjICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyMgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorIyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyMgcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisjIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyMKKyMgVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUKKyMgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorIyBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyMgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyMgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRQorIyBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisjIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTgorIyBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyIiIgorVGVzdHMgZm9yIGVwb2xsIHdyYXBwZXIuCisiIiIKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBlcnJubworaW1wb3J0IHRpbWUKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraWYgbm90IGhhc2F0dHIoc2VsZWN0LCAiZXBvbGwiKToKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidGVzdCB3b3JrcyBvbmx5IG9uIExpbnV4IDIuNiIpCisKK3RyeToKKyAgICBzZWxlY3QuZXBvbGwoKQorZXhjZXB0IElPRXJyb3IsIGU6CisgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FTk9TWVM6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJrZXJuZWwgZG9lc24ndCBzdXBwb3J0IGVwb2xsKCkiKQorICAgIHJhaXNlCisKK2NsYXNzIFRlc3RFUG9sbCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyU29ja2V0ID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNlbGYuc2VydmVyU29ja2V0LmJpbmQoKCcxMjcuMC4wLjEnLCAwKSkKKyAgICAgICAgc2VsZi5zZXJ2ZXJTb2NrZXQubGlzdGVuKDEpCisgICAgICAgIHNlbGYuY29ubmVjdGlvbnMgPSBbc2VsZi5zZXJ2ZXJTb2NrZXRdCisKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIHNrdCBpbiBzZWxmLmNvbm5lY3Rpb25zOgorICAgICAgICAgICAgc2t0LmNsb3NlKCkKKworICAgIGRlZiBfY29ubmVjdGVkX3BhaXIoc2VsZik6CisgICAgICAgIGNsaWVudCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBjbGllbnQuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KCgnMTI3LjAuMC4xJywgc2VsZi5zZXJ2ZXJTb2NrZXQuZ2V0c29ja25hbWUoKVsxXSkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgZXJybm8uRUlOUFJPR1JFU1MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiQ29ubmVjdCBzaG91bGQgaGF2ZSByYWlzZWQgRUlOUFJPR1JFU1MiKQorICAgICAgICBzZXJ2ZXIsIGFkZHIgPSBzZWxmLnNlcnZlclNvY2tldC5hY2NlcHQoKQorCisgICAgICAgIHNlbGYuY29ubmVjdGlvbnMuZXh0ZW5kKChjbGllbnQsIHNlcnZlcikpCisgICAgICAgIHJldHVybiBjbGllbnQsIHNlcnZlcgorCisgICAgZGVmIHRlc3RfY3JlYXRlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBlcCA9IHNlbGVjdC5lcG9sbCgxNikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGU6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcihzdHIoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcC5maWxlbm8oKSA+IDAsIGVwLmZpbGVubygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGVwLmNsb3NlZCkKKyAgICAgICAgZXAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXAuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBlcC5maWxlbm8pCisKKyAgICBkZWYgdGVzdF9iYWRjcmVhdGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LmVwb2xsLCAxLCAyLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGVjdC5lcG9sbCwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LmVwb2xsLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGVjdC5lcG9sbCwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LmVwb2xsLCBbJ2ZvbyddKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGVjdC5lcG9sbCwge30pCisKKyAgICBkZWYgdGVzdF9hZGQoc2VsZik6CisgICAgICAgIHNlcnZlciwgY2xpZW50ID0gc2VsZi5fY29ubmVjdGVkX3BhaXIoKQorCisgICAgICAgIGVwID0gc2VsZWN0LmVwb2xsKDIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVwLnJlZ2lzdGVyKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgICAgICBlcC5yZWdpc3RlcihjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZXAuY2xvc2UoKQorCisgICAgICAgICMgYWRkaW5nIGJ5IG9iamVjdCB3LyBmaWxlbm8gd29ya3MsIHRvby4KKyAgICAgICAgZXAgPSBzZWxlY3QuZXBvbGwoMikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXAucmVnaXN0ZXIoc2VydmVyLCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgICAgIGVwLnJlZ2lzdGVyKGNsaWVudCwgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBlcC5jbG9zZSgpCisKKyAgICAgICAgZXAgPSBzZWxlY3QuZXBvbGwoMikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBUeXBlRXJyb3I6IGFyZ3VtZW50IG11c3QgYmUgYW4gaW50LCBvciBoYXZlIGEgZmlsZW5vKCkgbWV0aG9kLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBlcC5yZWdpc3Rlciwgb2JqZWN0KCksCisgICAgICAgICAgICAgICAgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGVwLnJlZ2lzdGVyLCBOb25lLAorICAgICAgICAgICAgICAgIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUKQorICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBmaWxlIGRlc2NyaXB0b3IgY2Fubm90IGJlIGEgbmVnYXRpdmUgaW50ZWdlciAoLTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBlcC5yZWdpc3RlciwgLTEsCisgICAgICAgICAgICAgICAgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgICAgICAjIElPRXJyb3I6IFtFcnJubyA5XSBCYWQgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBlcC5yZWdpc3RlciwgMTAwMDAsCisgICAgICAgICAgICAgICAgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgICAgICAjIHJlZ2lzdGVyaW5nIHR3aWNlIGFsc28gcmFpc2VzIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgZXAucmVnaXN0ZXIoc2VydmVyLCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGVwLnJlZ2lzdGVyLCBzZXJ2ZXIsCisgICAgICAgICAgICAgICAgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBlcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9mcm9tZmQoc2VsZik6CisgICAgICAgIHNlcnZlciwgY2xpZW50ID0gc2VsZi5fY29ubmVjdGVkX3BhaXIoKQorCisgICAgICAgIGVwID0gc2VsZWN0LmVwb2xsKDIpCisgICAgICAgIGVwMiA9IHNlbGVjdC5lcG9sbC5mcm9tZmQoZXAuZmlsZW5vKCkpCisKKyAgICAgICAgZXAyLnJlZ2lzdGVyKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LkVQT0xMSU4gfCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgIGVwMi5yZWdpc3RlcihjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUKQorCisgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwoMSwgNCkKKyAgICAgICAgZXZlbnRzMiA9IGVwMi5wb2xsKDAuOSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXZlbnRzKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXZlbnRzMiksIDIpCisKKyAgICAgICAgZXAuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBlcDIucG9sbCgxLCA0KQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCBlcnJuby5FQkFERiwgZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXBvbGwgb24gY2xvc2VkIGZkIGRpZG4ndCByYWlzZSBFQkFERiIpCisKKyAgICBkZWYgdGVzdF9jb250cm9sX2FuZF93YWl0KHNlbGYpOgorICAgICAgICBjbGllbnQsIHNlcnZlciA9IHNlbGYuX2Nvbm5lY3RlZF9wYWlyKCkKKworICAgICAgICBlcCA9IHNlbGVjdC5lcG9sbCgxNikKKyAgICAgICAgZXAucmVnaXN0ZXIoc2VydmVyLmZpbGVubygpLAorICAgICAgICAgICAgICAgICAgIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUIHwgc2VsZWN0LkVQT0xMRVQpCisgICAgICAgIGVwLnJlZ2lzdGVyKGNsaWVudC5maWxlbm8oKSwKKyAgICAgICAgICAgICAgICAgICBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCB8IHNlbGVjdC5FUE9MTEVUKQorCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwoMSwgNCkKKyAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMSwgdGhlbiAtIG5vdykKKworICAgICAgICBldmVudHMuc29ydCgpCisgICAgICAgIGV4cGVjdGVkID0gWyhjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5FUE9MTE9VVCksCisgICAgICAgICAgICAgICAgICAgIChzZXJ2ZXIuZmlsZW5vKCksIHNlbGVjdC5FUE9MTE9VVCldCisgICAgICAgIGV4cGVjdGVkLnNvcnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSwgdGhlbiAtIG5vdykKKworICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQorICAgICAgICBldmVudHMgPSBlcC5wb2xsKHRpbWVvdXQ9Mi4xLCBtYXhldmVudHM9NCkKKyAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZXZlbnRzKQorCisgICAgICAgIGNsaWVudC5zZW5kKCJIZWxsbyEiKQorICAgICAgICBzZXJ2ZXIuc2VuZCgid29ybGQhISEiKQorCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwoMSwgNCkKKyAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMDEpCisKKyAgICAgICAgZXZlbnRzLnNvcnQoKQorICAgICAgICBleHBlY3RlZCA9IFsoY2xpZW50LmZpbGVubygpLCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCksCisgICAgICAgICAgICAgICAgICAgIChzZXJ2ZXIuZmlsZW5vKCksIHNlbGVjdC5FUE9MTElOIHwgc2VsZWN0LkVQT0xMT1VUKV0KKyAgICAgICAgZXhwZWN0ZWQuc29ydCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgICAgIGVwLnVucmVnaXN0ZXIoY2xpZW50LmZpbGVubygpKQorICAgICAgICBlcC5tb2RpZnkoc2VydmVyLmZpbGVubygpLCBzZWxlY3QuRVBPTExPVVQpCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwoMSwgNCkKKyAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMDEpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBbKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LkVQT0xMT1VUKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxlY3QuZXBvbGwsIC0yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxlY3QuZXBvbGwoKS5yZWdpc3RlciwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5FUE9MTElOKQorCisgICAgZGVmIHRlc3RfdW5yZWdpc3Rlcl9jbG9zZWQoc2VsZik6CisgICAgICAgIHNlcnZlciwgY2xpZW50ID0gc2VsZi5fY29ubmVjdGVkX3BhaXIoKQorICAgICAgICBmZCA9IHNlcnZlci5maWxlbm8oKQorICAgICAgICBlcCA9IHNlbGVjdC5lcG9sbCgxNikKKyAgICAgICAgZXAucmVnaXN0ZXIoc2VydmVyKQorCisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwoMSwgNCkKKyAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMDEpCisKKyAgICAgICAgc2VydmVyLmNsb3NlKCkKKyAgICAgICAgZXAudW5yZWdpc3RlcihmZCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEVQb2xsKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcG9sbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcG9sbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyMjdmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vwb2xsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcG9sbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcG9sbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyMjdmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vwb2xsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcnJuby5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiODkxOGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcnJuby5weQpAQCAtMCwwICsxLDQwIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJUZXN0IHRoZSBlcnJubyBtb2R1bGUKKyAgIFJvZ2VyIEUuIE1hc3NlCisiIiIKKworaW1wb3J0IGVycm5vCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK3N0ZF9jX2Vycm9ycyA9IGZyb3plbnNldChbJ0VET00nLCAnRVJBTkdFJ10pCisKK2NsYXNzIEVycm5vQXR0cmlidXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZm9yX2ltcHJvcGVyX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgICMgTm8gdW5leHBlY3RlZCBhdHRyaWJ1dGVzIHNob3VsZCBiZSBvbiB0aGUgbW9kdWxlLgorICAgICAgICBmb3IgZXJyb3JfY29kZSBpbiBzdGRfY19lcnJvcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlcnJubywgZXJyb3JfY29kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVycm5vIGlzIG1pc3NpbmcgJXMiICUgZXJyb3JfY29kZSkKKworICAgIGRlZiB0ZXN0X3VzaW5nX2Vycm9yY29kZShzZWxmKToKKyAgICAgICAgIyBFdmVyeSBrZXkgdmFsdWUgaW4gZXJybm8uZXJyb3Jjb2RlIHNob3VsZCBiZSBvbiB0aGUgbW9kdWxlLgorICAgICAgICBmb3IgdmFsdWUgaW4gZXJybm8uZXJyb3Jjb2RlLml0ZXJ2YWx1ZXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVycm5vLCB2YWx1ZSksICdubyAlcyBhdHRyIGluIGVycm5vJyAlIHZhbHVlKQorCisKK2NsYXNzIEVycm9yY29kZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfaW5fZXJyb3Jjb2RlKHNlbGYpOgorICAgICAgICBmb3IgYXR0cmlidXRlIGluIGVycm5vLl9fZGljdF9fLml0ZXJrZXlzKCk6CisgICAgICAgICAgICBpZiBhdHRyaWJ1dGUuaXN1cHBlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZ2V0YXR0cihlcnJubywgYXR0cmlidXRlKSwgZXJybm8uZXJyb3Jjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vICVzIGF0dHIgaW4gZXJybm8uZXJyb3Jjb2RlJyAlIGF0dHJpYnV0ZSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChFcnJub0F0dHJpYnV0ZVRlc3RzLCBFcnJvcmNvZGVUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcnJuby5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcnJuby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5NWM1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcnJuby5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9lcnJuby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5NWM1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Vycm5vLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbl92YXJpYXRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZTc1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weQpAQCAtMCwwICsxLDE4MCBAQAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBFeGNlcHRpb25UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdHJ5X2V4Y2VwdF9lbHNlX2ZpbmFsbHkoc2VsZik6CisgICAgICAgIGhpdF9leGNlcHQgPSBGYWxzZQorICAgICAgICBoaXRfZWxzZSA9IEZhbHNlCisgICAgICAgIGhpdF9maW5hbGx5ID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICdueWFhIScKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhpdF9lbHNlID0gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaGl0X2ZpbmFsbHkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9leGNlcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfZmluYWxseSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoaXRfZWxzZSkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfZWxzZV9maW5hbGx5X25vX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgaGl0X2V4Y2VwdCA9IEZhbHNlCisgICAgICAgIGhpdF9lbHNlID0gRmFsc2UKKyAgICAgICAgaGl0X2ZpbmFsbHkgPSBGYWxzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhpdF9lbHNlID0gVHJ1ZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaGl0X2ZpbmFsbHkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoaXRfZXhjZXB0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2ZpbmFsbHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfZWxzZSkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfZmluYWxseShzZWxmKToKKyAgICAgICAgaGl0X2V4Y2VwdCA9IEZhbHNlCisgICAgICAgIGhpdF9maW5hbGx5ID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICd5YXJyIScKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGhpdF9maW5hbGx5ID0gVHJ1ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfZXhjZXB0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2ZpbmFsbHkpCisKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0X2ZpbmFsbHlfbm9fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKyAgICAgICAgaGl0X2ZpbmFsbHkgPSBGYWxzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGhpdF9maW5hbGx5ID0gVHJ1ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGl0X2V4Y2VwdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9maW5hbGx5KQorCisgICAgZGVmIHRlc3RfdHJ5X2V4Y2VwdChzZWxmKToKKyAgICAgICAgaGl0X2V4Y2VwdCA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCAnYWhveSEnCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGhpdF9leGNlcHQgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9leGNlcHQpCisKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0X25vX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgaGl0X2V4Y2VwdCA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGl0X2V4Y2VwdCkKKworICAgIGRlZiB0ZXN0X3RyeV9leGNlcHRfZWxzZShzZWxmKToKKyAgICAgICAgaGl0X2V4Y2VwdCA9IEZhbHNlCisgICAgICAgIGhpdF9lbHNlID0gRmFsc2UKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sICdmb28hJworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGl0X2Vsc2UgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoaXRfZWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9leGNlcHQpCisKKyAgICBkZWYgdGVzdF90cnlfZXhjZXB0X2Vsc2Vfbm9fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBoaXRfZXhjZXB0ID0gRmFsc2UKKyAgICAgICAgaGl0X2Vsc2UgPSBGYWxzZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaGl0X2V4Y2VwdCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhpdF9lbHNlID0gVHJ1ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGl0X2V4Y2VwdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9lbHNlKQorCisgICAgZGVmIHRlc3RfdHJ5X2ZpbmFsbHlfbm9fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBoaXRfZmluYWxseSA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaGl0X2ZpbmFsbHkgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9maW5hbGx5KQorCisgICAgZGVmIHRlc3RfbmVzdGVkKHNlbGYpOgorICAgICAgICBoaXRfZmluYWxseSA9IEZhbHNlCisgICAgICAgIGhpdF9pbm5lcl9leGNlcHQgPSBGYWxzZQorICAgICAgICBoaXRfaW5uZXJfZmluYWxseSA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgJ2lubmVyIGV4Y2VwdGlvbicKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBoaXRfaW5uZXJfZXhjZXB0ID0gVHJ1ZQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBoaXRfaW5uZXJfZmluYWxseSA9IFRydWUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGhpdF9maW5hbGx5ID0gVHJ1ZQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfaW5uZXJfZXhjZXB0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2lubmVyX2ZpbmFsbHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfZmluYWxseSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF9lbHNlKHNlbGYpOgorICAgICAgICBoaXRfZWxzZSA9IEZhbHNlCisgICAgICAgIGhpdF9maW5hbGx5ID0gRmFsc2UKKyAgICAgICAgaGl0X2V4Y2VwdCA9IEZhbHNlCisgICAgICAgIGhpdF9pbm5lcl9leGNlcHQgPSBGYWxzZQorICAgICAgICBoaXRfaW5uZXJfZWxzZSA9IEZhbHNlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBoaXRfaW5uZXJfZXhjZXB0ID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoaXRfaW5uZXJfZWxzZSA9IFRydWUKKworICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uLCAnb3V0ZXIgZXhjZXB0aW9uJworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBoaXRfZXhjZXB0ID0gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaGl0X2Vsc2UgPSBUcnVlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBoaXRfZmluYWxseSA9IFRydWUKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhpdF9pbm5lcl9leGNlcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoaXRfaW5uZXJfZWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoaXRfZWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhpdF9maW5hbGx5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGl0X2V4Y2VwdCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChFeGNlcHRpb25UZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9uX3ZhcmlhdGlvbnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9uX3ZhcmlhdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjE4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9uX3ZhcmlhdGlvbnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9uX3ZhcmlhdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjE4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25fdmFyaWF0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4NWNiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSw2NDYgQEAKKyMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgNSwgYnVpbHQtaW4gZXhjZXB0aW9ucworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHBpY2tsZSwgY1BpY2tsZQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAoVEVTVEZOLCB1bmxpbmssIHJ1bl91bml0dGVzdCwgY2FwdHVyZWRfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrX3dhcm5pbmdzLCBjcHl0aG9uX29ubHkpCitmcm9tIHRlc3QudGVzdF9wZXAzNTIgaW1wb3J0IGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworCisjIFhYWCBUaGlzIGlzIG5vdCByZWFsbHkgZW5vdWdoLCBlYWNoICpvcGVyYXRpb24qIHNob3VsZCBiZSB0ZXN0ZWQhCisKK2NsYXNzIEV4Y2VwdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0UmVsb2FkKHNlbGYpOgorICAgICAgICAjIFJlbG9hZGluZyB0aGUgYnVpbHQtaW4gZXhjZXB0aW9ucyBtb2R1bGUgZmFpbGVkIHByaW9yIHRvIFB5Mi4yLCB3aGlsZSBpdAorICAgICAgICAjIHNob3VsZCBhY3QgdGhlIHNhbWUgYXMgcmVsb2FkaW5nIGJ1aWx0LWluIHN5cy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBpbXAgaW1wb3J0IHJlbG9hZAorICAgICAgICAgICAgaW1wb3J0IGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIHJlbG9hZChleGNlcHRpb25zKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJlbG9hZGluZyBleGNlcHRpb25zOiAlcyIgJSBlKQorCisgICAgZGVmIHJhaXNlX2NhdGNoKHNlbGYsIGV4YywgZXhjbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIGV4YywgInNwYW0iCisgICAgICAgIGV4Y2VwdCBleGMsIGVycjoKKyAgICAgICAgICAgIGJ1ZjEgPSBzdHIoZXJyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBleGMoInNwYW0iKQorICAgICAgICBleGNlcHQgZXhjLCBlcnI6CisgICAgICAgICAgICBidWYyID0gc3RyKGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYxLCBidWYyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5fX25hbWVfXywgZXhjbmFtZSkKKworICAgIGRlZiB0ZXN0UmFpc2luZyhzZWxmKToKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChBdHRyaWJ1dGVFcnJvciwgIkF0dHJpYnV0ZUVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIHN5cywgInVuZGVmaW5lZF9hdHRyaWJ1dGUiKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goRU9GRXJyb3IsICJFT0ZFcnJvciIpCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBmcCA9IG9wZW4oVEVTVEZOLCAncicpCisgICAgICAgIHNhdmVzdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGluID0gZnAKKyAgICAgICAgICAgICAgICB4ID0gcmF3X2lucHV0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3RkaW4gPSBzYXZlc3RkaW4KKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIHVubGluayhURVNURk4pCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChJT0Vycm9yLCAiSU9FcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIG9wZW4sICd0aGlzIGZpbGUgZG9lcyBub3QgZXhpc3QnLCAncicpCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChJbXBvcnRFcnJvciwgIkltcG9ydEVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIF9faW1wb3J0X18sICJ1bmRlZmluZWRfbW9kdWxlIikKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKEluZGV4RXJyb3IsICJJbmRleEVycm9yIikKKyAgICAgICAgeCA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHguX19nZXRpdGVtX18sIDEwKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goS2V5RXJyb3IsICJLZXlFcnJvciIpCisgICAgICAgIHggPSB7fQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgeC5fX2dldGl0ZW1fXywgJ2tleScpCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChLZXlib2FyZEludGVycnVwdCwgIktleWJvYXJkSW50ZXJydXB0IikKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKE1lbW9yeUVycm9yLCAiTWVtb3J5RXJyb3IiKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goTmFtZUVycm9yLCAiTmFtZUVycm9yIikKKyAgICAgICAgdHJ5OiB4ID0gdW5kZWZpbmVkX3ZhcmlhYmxlCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6IHBhc3MKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKE92ZXJmbG93RXJyb3IsICJPdmVyZmxvd0Vycm9yIikKKyAgICAgICAgeCA9IDEKKyAgICAgICAgZm9yIGR1bW15IGluIHJhbmdlKDEyOCk6CisgICAgICAgICAgICB4ICs9IHggICMgdGhpcyBzaW1wbHkgc2hvdWxkbid0IGJsb3cgdXAKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKFJ1bnRpbWVFcnJvciwgIlJ1bnRpbWVFcnJvciIpCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChTeW50YXhFcnJvciwgIlN5bnRheEVycm9yIikKKyAgICAgICAgdHJ5OiBleGVjICcvXG4nCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjogcGFzcworCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goSW5kZW50YXRpb25FcnJvciwgIkluZGVudGF0aW9uRXJyb3IiKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goVGFiRXJyb3IsICJUYWJFcnJvciIpCisgICAgICAgICMgY2FuIG9ubHkgYmUgdGVzdGVkIHVuZGVyIC10dCwgYW5kIGlzIHRoZSBvbmx5IHRlc3QgZm9yIC10dAorICAgICAgICAjdHJ5OiBjb21waWxlKCJ0cnk6XG5cdDEvMFxuICAgIFx0MS8wXG5maW5hbGx5OlxuIHBhc3NcbiIsICc8c3RyaW5nPicsICdleGVjJykKKyAgICAgICAgI2V4Y2VwdCBUYWJFcnJvcjogcGFzcworICAgICAgICAjZWxzZTogc2VsZi5mYWlsKCJUYWJFcnJvciBub3QgcmFpc2VkIikKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKFN5c3RlbUVycm9yLCAiU3lzdGVtRXJyb3IiKQorCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goU3lzdGVtRXhpdCwgIlN5c3RlbUV4aXQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FeGl0LCBzeXMuZXhpdCwgMCkKKworICAgICAgICBzZWxmLnJhaXNlX2NhdGNoKFR5cGVFcnJvciwgIlR5cGVFcnJvciIpCisgICAgICAgIHRyeTogW10gKyAoKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChWYWx1ZUVycm9yLCAiVmFsdWVFcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNociwgMTAwMDApCisKKyAgICAgICAgc2VsZi5yYWlzZV9jYXRjaChaZXJvRGl2aXNpb25FcnJvciwgIlplcm9EaXZpc2lvbkVycm9yIikKKyAgICAgICAgdHJ5OiB4ID0gMSAvLyAwCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworCisgICAgICAgIHNlbGYucmFpc2VfY2F0Y2goRXhjZXB0aW9uLCAiRXhjZXB0aW9uIikKKyAgICAgICAgdHJ5OiB4ID0gMSAvLyAwCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6IHBhc3MKKworICAgIGRlZiB0ZXN0U3ludGF4RXJyb3JNZXNzYWdlKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGUgcmlnaHQgZXhjZXB0aW9uIG1lc3NhZ2UgaXMgcmFpc2VkIGZvciBlYWNoIG9mCisgICAgICAgICMgdGhlc2UgY29kZSBmcmFnbWVudHMKKworICAgICAgICBkZWYgY2ttc2coc3JjLCBtc2cpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbXBpbGUoc3JjLCAnPGZyYWdtZW50PicsICdleGVjJykKKyAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLm1zZyAhPSBtc2c6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgJXMsIGdvdCAlcyIgJSAobXNnLCBlLm1zZykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbGVkIHRvIGdldCBleHBlY3RlZCBTeW50YXhFcnJvciIpCisKKyAgICAgICAgcyA9ICcnJ3doaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBjb250aW51ZScnJworCisgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgY2ttc2cocywgIidjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZSIpCisKKyAgICAgICAgcyA9ICcnJ2lmIDE6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MnJycKKworICAgICAgICBja21zZyhzLCAiJ2NvbnRpbnVlJyBub3QgcHJvcGVybHkgaW4gbG9vcCIpCisgICAgICAgIGNrbXNnKCJjb250aW51ZVxuIiwgIidjb250aW51ZScgbm90IHByb3Blcmx5IGluIGxvb3AiKQorCisgICAgQGNweXRob25fb25seQorICAgIGRlZiB0ZXN0U2V0dGluZ0V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoYXQgc2V0dGluZyBhbiBleGNlcHRpb24gYXQgdGhlIEMgbGV2ZWwgd29ya3MgZXZlbiBpZiB0aGUKKyAgICAgICAgIyBleGNlcHRpb24gb2JqZWN0IGNhbid0IGJlIGNvbnN0cnVjdGVkLgorCisgICAgICAgIGNsYXNzIEJhZEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmXyk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiY2FuJ3QgaW5zdGFudGlhdGUgQmFkRXhjZXB0aW9uIgorCisgICAgICAgIGRlZiB0ZXN0X2NhcGkxKCk6CisgICAgICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX3Rlc3RjYXBpLnJhaXNlX2V4Y2VwdGlvbihCYWRFeGNlcHRpb24sIDEpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgZXhjLCBlcnIsIHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICBjbyA9IHRiLnRiX2ZyYW1lLmZfY29kZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fbmFtZSwgInRlc3RfY2FwaTEiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjby5jb19maWxlbmFtZS5lbmRzd2l0aCgndGVzdF9leGNlcHRpb25zJytvcy5leHRzZXArJ3B5JykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIikKKworICAgICAgICBkZWYgdGVzdF9jYXBpMigpOgorICAgICAgICAgICAgaW1wb3J0IF90ZXN0Y2FwaQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF90ZXN0Y2FwaS5yYWlzZV9leGNlcHRpb24oQmFkRXhjZXB0aW9uLCAwKQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGV4YywgZXJyLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICAgICAgY28gPSB0Yi50Yl9mcmFtZS5mX2NvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX25hbWUsICJfX2luaXRfXyIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvLmNvX2ZpbGVuYW1lLmVuZHN3aXRoKCd0ZXN0X2V4Y2VwdGlvbnMnK29zLmV4dHNlcCsncHknKSkKKyAgICAgICAgICAgICAgICBjbzIgPSB0Yi50Yl9mcmFtZS5mX2JhY2suZl9jb2RlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbzIuY29fbmFtZSwgInRlc3RfY2FwaTIiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICB0ZXN0X2NhcGkxKCkKKyAgICAgICAgICAgIHRlc3RfY2FwaTIoKQorCisgICAgZGVmIHRlc3RfV2luZG93c0Vycm9yKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBXaW5kb3dzRXJyb3IKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFdpbmRvd3NFcnJvcigxMDAxKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwMSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihXaW5kb3dzRXJyb3IoMTAwMSwgIm1lc3NhZ2UiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiW0Vycm9yIDEwMDFdIG1lc3NhZ2UiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChXaW5kb3dzRXJyb3IoMTAwMSwgIm1lc3NhZ2UiKS5lcnJubywgMjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLndpbmVycm9yLCAxMDAxKQorCisgICAgQGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworICAgIGRlZiB0ZXN0QXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoYXQgZXhjZXB0aW9uIGF0dHJpYnV0ZXMgYXJlIGhhcHB5CisKKyAgICAgICAgZXhjZXB0aW9uTGlzdCA9IFsKKyAgICAgICAgICAgIChCYXNlRXhjZXB0aW9uLCAoKSwgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoKX0pLAorICAgICAgICAgICAgKEJhc2VFeGNlcHRpb24sICgxLCApLCB7J21lc3NhZ2UnIDogMSwgJ2FyZ3MnIDogKDEsKX0pLAorICAgICAgICAgICAgKEJhc2VFeGNlcHRpb24sICgnZm9vJywpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnZm9vJywgJ2FyZ3MnIDogKCdmb28nLCl9KSwKKyAgICAgICAgICAgIChCYXNlRXhjZXB0aW9uLCAoJ2ZvbycsIDEpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdmb28nLCAxKX0pLAorICAgICAgICAgICAgKFN5c3RlbUV4aXQsICgnZm9vJywpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnZm9vJywgJ2FyZ3MnIDogKCdmb28nLCksICdjb2RlJyA6ICdmb28nfSksCisgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdmb28nLCAnYXJncycgOiAoJ2ZvbycsKSwgJ2ZpbGVuYW1lJyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiBOb25lLCAnc3RyZXJyb3InIDogTm9uZX0pLAorICAgICAgICAgICAgKElPRXJyb3IsICgnZm9vJywgJ2JhcicpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdmb28nLCAnYmFyJyksICdmaWxlbmFtZScgOiBOb25lLAorICAgICAgICAgICAgICAgICAnZXJybm8nIDogJ2ZvbycsICdzdHJlcnJvcicgOiAnYmFyJ30pLAorICAgICAgICAgICAgKElPRXJyb3IsICgnZm9vJywgJ2JhcicsICdiYXonKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZm9vJywgJ2JhcicpLCAnZmlsZW5hbWUnIDogJ2JheicsCisgICAgICAgICAgICAgICAgICdlcnJubycgOiAnZm9vJywgJ3N0cmVycm9yJyA6ICdiYXInfSksCisgICAgICAgICAgICAoSU9FcnJvciwgKCdmb28nLCAnYmFyJywgJ2JheicsICdxdXV4JyksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICcnLCAnYXJncycgOiAoJ2ZvbycsICdiYXInLCAnYmF6JywgJ3F1dXgnKX0pLAorICAgICAgICAgICAgKEVudmlyb25tZW50RXJyb3IsICgnZXJybm9TdHInLCAnc3RyRXJyb3JTdHInLCAnZmlsZW5hbWVTdHInKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgnZXJybm9TdHInLCAnc3RyRXJyb3JTdHInKSwKKyAgICAgICAgICAgICAgICAgJ3N0cmVycm9yJyA6ICdzdHJFcnJvclN0cicsICdlcnJubycgOiAnZXJybm9TdHInLAorICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnIDogJ2ZpbGVuYW1lU3RyJ30pLAorICAgICAgICAgICAgKEVudmlyb25tZW50RXJyb3IsICgxLCAnc3RyRXJyb3JTdHInLCAnZmlsZW5hbWVTdHInKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgxLCAnc3RyRXJyb3JTdHInKSwgJ2Vycm5vJyA6IDEsCisgICAgICAgICAgICAgICAgICdzdHJlcnJvcicgOiAnc3RyRXJyb3JTdHInLCAnZmlsZW5hbWUnIDogJ2ZpbGVuYW1lU3RyJ30pLAorICAgICAgICAgICAgKFN5bnRheEVycm9yLCAoKSwgeydtZXNzYWdlJyA6ICcnLCAnbXNnJyA6IE5vbmUsICd0ZXh0JyA6IE5vbmUsCisgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJyA6IE5vbmUsICdsaW5lbm8nIDogTm9uZSwgJ29mZnNldCcgOiBOb25lLAorICAgICAgICAgICAgICAgICdwcmludF9maWxlX2FuZF9saW5lJyA6IE5vbmV9KSwKKyAgICAgICAgICAgIChTeW50YXhFcnJvciwgKCdtc2dTdHInLCksCisgICAgICAgICAgICAgICAgeydtZXNzYWdlJyA6ICdtc2dTdHInLCAnYXJncycgOiAoJ21zZ1N0cicsKSwgJ3RleHQnIDogTm9uZSwKKyAgICAgICAgICAgICAgICAgJ3ByaW50X2ZpbGVfYW5kX2xpbmUnIDogTm9uZSwgJ21zZycgOiAnbXNnU3RyJywKKyAgICAgICAgICAgICAgICAgJ2ZpbGVuYW1lJyA6IE5vbmUsICdsaW5lbm8nIDogTm9uZSwgJ29mZnNldCcgOiBOb25lfSksCisgICAgICAgICAgICAoU3ludGF4RXJyb3IsICgnbXNnU3RyJywgKCdmaWxlbmFtZVN0cicsICdsaW5lbm9TdHInLCAnb2Zmc2V0U3RyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0U3RyJykpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ29mZnNldCcgOiAnb2Zmc2V0U3RyJywgJ3RleHQnIDogJ3RleHRTdHInLAorICAgICAgICAgICAgICAgICAnYXJncycgOiAoJ21zZ1N0cicsICgnZmlsZW5hbWVTdHInLCAnbGluZW5vU3RyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29mZnNldFN0cicsICd0ZXh0U3RyJykpLAorICAgICAgICAgICAgICAgICAncHJpbnRfZmlsZV9hbmRfbGluZScgOiBOb25lLCAnbXNnJyA6ICdtc2dTdHInLAorICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnIDogJ2ZpbGVuYW1lU3RyJywgJ2xpbmVubycgOiAnbGluZW5vU3RyJ30pLAorICAgICAgICAgICAgKFN5bnRheEVycm9yLCAoJ21zZ1N0cicsICdmaWxlbmFtZVN0cicsICdsaW5lbm9TdHInLCAnb2Zmc2V0U3RyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXh0U3RyJywgJ3ByaW50X2ZpbGVfYW5kX2xpbmVTdHInKSwKKyAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICd0ZXh0JyA6IE5vbmUsCisgICAgICAgICAgICAgICAgICdhcmdzJyA6ICgnbXNnU3RyJywgJ2ZpbGVuYW1lU3RyJywgJ2xpbmVub1N0cicsICdvZmZzZXRTdHInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RleHRTdHInLCAncHJpbnRfZmlsZV9hbmRfbGluZVN0cicpLAorICAgICAgICAgICAgICAgICAncHJpbnRfZmlsZV9hbmRfbGluZScgOiBOb25lLCAnbXNnJyA6ICdtc2dTdHInLAorICAgICAgICAgICAgICAgICAnZmlsZW5hbWUnIDogTm9uZSwgJ2xpbmVubycgOiBOb25lLCAnb2Zmc2V0JyA6IE5vbmV9KSwKKyAgICAgICAgICAgIChVbmljb2RlRXJyb3IsICgpLCB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgpLH0pLAorICAgICAgICAgICAgKFVuaWNvZGVFbmNvZGVFcnJvciwgKCdhc2NpaScsIHUnYScsIDAsIDEsICdvcmRpbmFsIG5vdCBpbiByYW5nZScpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdhc2NpaScsIHUnYScsIDAsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ29yZGluYWwgbm90IGluIHJhbmdlJyksCisgICAgICAgICAgICAgICAgICdlbmNvZGluZycgOiAnYXNjaWknLCAnb2JqZWN0JyA6IHUnYScsCisgICAgICAgICAgICAgICAgICdzdGFydCcgOiAwLCAncmVhc29uJyA6ICdvcmRpbmFsIG5vdCBpbiByYW5nZSd9KSwKKyAgICAgICAgICAgIChVbmljb2RlRGVjb2RlRXJyb3IsICgnYXNjaWknLCAnXHhmZicsIDAsIDEsICdvcmRpbmFsIG5vdCBpbiByYW5nZScpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKCdhc2NpaScsICdceGZmJywgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnKSwKKyAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJyA6ICdhc2NpaScsICdvYmplY3QnIDogJ1x4ZmYnLAorICAgICAgICAgICAgICAgICAnc3RhcnQnIDogMCwgJ3JlYXNvbicgOiAnb3JkaW5hbCBub3QgaW4gcmFuZ2UnfSksCisgICAgICAgICAgICAoVW5pY29kZVRyYW5zbGF0ZUVycm9yLCAodSJcdTMwNDIiLCAwLCAxLCAib3VjaCIpLAorICAgICAgICAgICAgICAgIHsnbWVzc2FnZScgOiAnJywgJ2FyZ3MnIDogKHUnXHUzMDQyJywgMCwgMSwgJ291Y2gnKSwKKyAgICAgICAgICAgICAgICAgJ29iamVjdCcgOiB1J1x1MzA0MicsICdyZWFzb24nIDogJ291Y2gnLAorICAgICAgICAgICAgICAgICAnc3RhcnQnIDogMCwgJ2VuZCcgOiAxfSksCisgICAgICAgIF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhjZXB0aW9uTGlzdC5hcHBlbmQoCisgICAgICAgICAgICAgICAgKFdpbmRvd3NFcnJvciwgKDEsICdzdHJFcnJvclN0cicsICdmaWxlbmFtZVN0cicpLAorICAgICAgICAgICAgICAgICAgICB7J21lc3NhZ2UnIDogJycsICdhcmdzJyA6ICgxLCAnc3RyRXJyb3JTdHInKSwKKyAgICAgICAgICAgICAgICAgICAgICdzdHJlcnJvcicgOiAnc3RyRXJyb3JTdHInLCAnd2luZXJyb3InIDogMSwKKyAgICAgICAgICAgICAgICAgICAgICdlcnJubycgOiAyMiwgJ2ZpbGVuYW1lJyA6ICdmaWxlbmFtZVN0cid9KQorICAgICAgICAgICAgKQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGZvciBleGMsIGFyZ3MsIGV4cGVjdGVkIGluIGV4Y2VwdGlvbkxpc3Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXhjKCphcmdzKQorICAgICAgICAgICAgZXhjZXB0IEJhc2VFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgaWYgdHlwZShlKSBpcyBub3QgZXhjOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICMgVmVyaWZ5IG1vZHVsZSBuYW1lCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGUpLl9fbW9kdWxlX18sICdleGNlcHRpb25zJykKKyAgICAgICAgICAgICAgICAjIFZlcmlmeSBubyByZWYgbGVha3MgaW4gRXhjX3N0cigpCisgICAgICAgICAgICAgICAgcyA9IHN0cihlKQorICAgICAgICAgICAgICAgIGZvciBjaGVja0FyZ05hbWUgaW4gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihnZXRhdHRyKGUsIGNoZWNrQXJnTmFtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIoZXhwZWN0ZWRbY2hlY2tBcmdOYW1lXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4Y2VwdGlvbiAiJXMiLCBhdHRyaWJ1dGUgIiVzIicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwcihlKSwgY2hlY2tBcmdOYW1lKSkKKworICAgICAgICAgICAgICAgICMgdGVzdCBmb3IgcGlja2xpbmcgc3VwcG9ydAorICAgICAgICAgICAgICAgIGZvciBwIGluIHBpY2tsZSwgY1BpY2tsZToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHByb3RvY29sIGluIHJhbmdlKHAuSElHSEVTVF9QUk9UT0NPTCArIDEpOgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gcC5sb2FkcyhwLmR1bXBzKGUsIHByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBjaGVja0FyZ05hbWUgaW4gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290ID0gcmVwcihnZXRhdHRyKG5ldywgY2hlY2tBcmdOYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50ID0gcmVwcihleHBlY3RlZFtjaGVja0FyZ05hbWVdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCB3YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BpY2tsZWQgIiVyIiwgYXR0cmlidXRlICIlcyInICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLCBjaGVja0FyZ05hbWUpKQorCisKKyAgICBkZWYgdGVzdERlcHJlY2F0ZWRNZXNzYWdlQXR0cmlidXRlKHNlbGYpOgorICAgICAgICAjIEFjY2Vzc2luZyBCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgYW5kIHJlbHlpbmcgb24gaXRzIHZhbHVlIHNldCBieQorICAgICAgICAjIEJhc2VFeGNlcHRpb24uX19pbml0X18gdHJpZ2dlcnMgYSBkZXByZWNhdGlvbiB3YXJuaW5nLgorICAgICAgICBleGMgPSBCYXNlRXhjZXB0aW9uKCJmb28iKQorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgiQmFzZUV4Y2VwdGlvbi5tZXNzYWdlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXMgb2YgUHl0aG9uIDIuNiIsIERlcHJlY2F0aW9uV2FybmluZykpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5tZXNzYWdlLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisKKyAgICBkZWYgdGVzdFJlZ3VsYXJNZXNzYWdlQXR0cmlidXRlKHNlbGYpOgorICAgICAgICAjIEFjY2Vzc2luZyBCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgYWZ0ZXIgZXhwbGljaXRseSBzZXR0aW5nIGEgdmFsdWUKKyAgICAgICAgIyBmb3IgaXQgZG9lcyBub3QgdHJpZ2dlciBhIGRlcHJlY2F0aW9uIHdhcm5pbmcuCisgICAgICAgIGV4YyA9IEJhc2VFeGNlcHRpb24oImZvbyIpCisgICAgICAgIGV4Yy5tZXNzYWdlID0gImJhciIKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncyhxdWlldD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMubWVzc2FnZSwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcud2FybmluZ3MpLCAwKQorICAgICAgICAjIERlbGV0aW5nIHRoZSBtZXNzYWdlIGlzIHN1cHBvcnRlZCwgdG9vLgorICAgICAgICBkZWwgZXhjLm1lc3NhZ2UKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBleGMubWVzc2FnZQorCisgICAgQGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworICAgIGRlZiB0ZXN0UGlja2xlTWVzc2FnZUF0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgIyBQaWNrbGluZyB3aXRoIG1lc3NhZ2UgYXR0cmlidXRlIG11c3Qgd29yaywgYXMgd2VsbC4KKyAgICAgICAgZSA9IEV4Y2VwdGlvbigiZm9vIikKKyAgICAgICAgZiA9IEV4Y2VwdGlvbigiZm9vIikKKyAgICAgICAgZi5tZXNzYWdlID0gImJhciIKKyAgICAgICAgZm9yIHAgaW4gcGlja2xlLCBjUGlja2xlOgorICAgICAgICAgICAgZXAgPSBwLmxvYWRzKHAuZHVtcHMoZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLm1lc3NhZ2UsICJmb28iKQorICAgICAgICAgICAgZnAgPSBwLmxvYWRzKHAuZHVtcHMoZikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLm1lc3NhZ2UsICJiYXIiKQorCisgICAgQGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworICAgIGRlZiB0ZXN0U2xpY2luZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgeW91IGNhbiBzbGljZSBhbiBleGNlcHRpb24gZGlyZWN0bHkgaW5zdGVhZCBvZiByZXF1aXJpbmcKKyAgICAgICAgIyBnb2luZyB0aHJvdWdoIHRoZSAnYXJncycgYXR0cmlidXRlLgorICAgICAgICBhcmdzID0gKDEsIDIsIDMpCisgICAgICAgIGV4YyA9IEJhc2VFeGNlcHRpb24oKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjWzpdLCBhcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5hcmdzWzpdLCBhcmdzKQorCisgICAgZGVmIHRlc3RLZXl3b3JkQXJncyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoYXQgYnVpbHRpbiBleGNlcHRpb24gZG9uJ3QgdGFrZSBrZXl3b3JkIGFyZ3MsCisgICAgICAgICMgYnV0IHVzZXItZGVmaW5lZCBzdWJjbGFzc2VzIGNhbiBpZiB0aGV5IHdhbnQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBCYXNlRXhjZXB0aW9uLCBhPTEpCisKKyAgICAgICAgY2xhc3MgRGVyaXZlZEV4Y2VwdGlvbihCYXNlRXhjZXB0aW9uKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmYW5jeV9hcmcpOgorICAgICAgICAgICAgICAgIEJhc2VFeGNlcHRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLmZhbmN5X2FyZyA9IGZhbmN5X2FyZworCisgICAgICAgIHggPSBEZXJpdmVkRXhjZXB0aW9uKGZhbmN5X2FyZz00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZhbmN5X2FyZywgNDIpCisKKyAgICBkZWYgdGVzdEluZmluaXRlUmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcmV0dXJuIGYoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGYpCisKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZygpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLTEKKworICAgICAgICAjIFRoZSB0ZXN0IHByaW50cyBhbiB1bnJhaXNhYmxlIHJlY3Vyc2lvbiBlcnJvciB3aGVuCisgICAgICAgICMgZG9pbmcgImV4Y2VwdCBWYWx1ZUVycm9yIiwgdGhpcyBpcyBiZWNhdXNlIHN1YmNsYXNzCisgICAgICAgICMgY2hlY2tpbmcgaGFzIHJlY3Vyc2lvbiBjaGVja2luZyB0b28uCisgICAgICAgIHdpdGggY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBnKCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIEtleUVycm9yIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgS2V5RXJyb3IiKQorCisgICAgZGVmIHRlc3RVbmljb2RlU3RyVXNhZ2Uoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGJvdGggaW5zdGFuY2VzIGFuZCBjbGFzc2VzIGhhdmUgYSBzdHIgYW5kIHVuaWNvZGUKKyAgICAgICAgIyByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihFeGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZShFeGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKEV4Y2VwdGlvbignYScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaWNvZGUoRXhjZXB0aW9uKHUnYScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaWNvZGUoRXhjZXB0aW9uKHUnXHhlMScpKSkKKworICAgIGRlZiB0ZXN0VW5pY29kZUNoYW5nZUF0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlIDczMDkuIFRoaXMgd2FzIGEgY3Jhc2hlci4KKworICAgICAgICB1ID0gVW5pY29kZUVuY29kZUVycm9yKCdiYXonLCB1J3h4eHh4JywgMSwgNSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiJ2JheicgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlcnMgaW4gcG9zaXRpb24gMS00OiBmb28iKQorICAgICAgICB1LmVuZCA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInYmF6JyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVyIHUnXFx4NzgnIGluIHBvc2l0aW9uIDE6IGZvbyIpCisgICAgICAgIHUuZW5kID0gNQorICAgICAgICB1LnJlYXNvbiA9IDB4MzQ1MzQ1MzQ1MzQ1MzQ1MzQ1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiJ2JheicgY29kZWMgY2FuJ3QgZW5jb2RlIGNoYXJhY3RlcnMgaW4gcG9zaXRpb24gMS00OiA5NjUyMzA5NTE0NDM2ODU3MjQ5OTciKQorICAgICAgICB1LmVuY29kaW5nID0gNDAwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgIic0MDAwJyBjb2RlYyBjYW4ndCBlbmNvZGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAxLTQ6IDk2NTIzMDk1MTQ0MzY4NTcyNDk5NyIpCisgICAgICAgIHUuc3RhcnQgPSAxMDAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiJzQwMDAnIGNvZGVjIGNhbid0IGVuY29kZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDEwMDAtNDogOTY1MjMwOTUxNDQzNjg1NzI0OTk3IikKKworICAgICAgICB1ID0gVW5pY29kZURlY29kZUVycm9yKCdiYXonLCAneHh4eHgnLCAxLCA1LCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInYmF6JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZXMgaW4gcG9zaXRpb24gMS00OiBmb28iKQorICAgICAgICB1LmVuZCA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInYmF6JyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweDc4IGluIHBvc2l0aW9uIDE6IGZvbyIpCisgICAgICAgIHUuZW5kID0gNQorICAgICAgICB1LnJlYXNvbiA9IDB4MzQ1MzQ1MzQ1MzQ1MzQ1MzQ1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiJ2JheicgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGVzIGluIHBvc2l0aW9uIDEtNDogOTY1MjMwOTUxNDQzNjg1NzI0OTk3IikKKyAgICAgICAgdS5lbmNvZGluZyA9IDQwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInNDAwMCcgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGVzIGluIHBvc2l0aW9uIDEtNDogOTY1MjMwOTUxNDQzNjg1NzI0OTk3IikKKyAgICAgICAgdS5zdGFydCA9IDEwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICInNDAwMCcgY29kZWMgY2FuJ3QgZGVjb2RlIGJ5dGVzIGluIHBvc2l0aW9uIDEwMDAtNDogOTY1MjMwOTUxNDQzNjg1NzI0OTk3IikKKworICAgICAgICB1ID0gVW5pY29kZVRyYW5zbGF0ZUVycm9yKHUneHh4eCcsIDEsIDUsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDEtNDogZm9vIikKKyAgICAgICAgdS5lbmQgPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUpLCAiY2FuJ3QgdHJhbnNsYXRlIGNoYXJhY3RlciB1J1xceDc4JyBpbiBwb3NpdGlvbiAxOiBmb28iKQorICAgICAgICB1LmVuZCA9IDUKKyAgICAgICAgdS5yZWFzb24gPSAweDM0NTM0NTM0NTM0NTM0NTM0NQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih1KSwgImNhbid0IHRyYW5zbGF0ZSBjaGFyYWN0ZXJzIGluIHBvc2l0aW9uIDEtNDogOTY1MjMwOTUxNDQzNjg1NzI0OTk3IikKKyAgICAgICAgdS5zdGFydCA9IDEwMDAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodSksICJjYW4ndCB0cmFuc2xhdGUgY2hhcmFjdGVycyBpbiBwb3NpdGlvbiAxMDAwLTQ6IDk2NTIzMDk1MTQ0MzY4NTcyNDk5NyIpCisKKyAgICBkZWYgdGVzdF9iYWRpc2luc3RhbmNlKHNlbGYpOgorICAgICAgICAjIEJ1ZyAjMjU0MjogaWYgaXNzdWJjbGFzcyhlLCBNeUV4Y2VwdGlvbikgcmFpc2VzIGFuIGV4Y2VwdGlvbiwKKyAgICAgICAgIyBpdCBzaG91bGQgYmUgaWdub3JlZAorICAgICAgICBjbGFzcyBNZXRhKHR5cGUpOgorICAgICAgICAgICAgZGVmIF9fc3ViY2xhc3NjaGVja19fKGNscywgc3ViY2xhc3MpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoKQorCisgICAgICAgIGNsYXNzIE15RXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gTWV0YQorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBzdGRlcnI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IoKQorICAgICAgICAgICAgZXhjZXB0IE15RXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhjZXB0aW9uIHNob3VsZCBub3QgYmUgYSBNeUV4Y2VwdGlvbiIpCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIEtleUVycm9yIikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgS2V5RXJyb3IiKQorCisgICAgICAgIHdpdGggY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBzdGRlcnI6CisgICAgICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGcoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgZSwgdiwgdGIgPSBnKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlIGlzIFJ1bnRpbWVFcnJvciwgZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIiwgc3RyKHYpKQorCisgICAgZGVmIHRlc3RfbmV3X3JldHVybnNfaW52YWxpZF9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgIzExNjI3LgorICAgICAgICBjbGFzcyBNeUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdCgpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgcmFpc2UgTXlFeGNlcHRpb24KKworICAgIGRlZiB0ZXN0X2Fzc2VydF93aXRoX3R1cGxlX2FyZyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXNzZXJ0IEZhbHNlLCAoMywpCisgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICIoMywpIikKKworICAgIGRlZiB0ZXN0X2JhZF9leGNlcHRpb25fY2xlYXJpbmcoc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlIDE2NDQ1OiB1c2Ugb2YgUHlfWERFQ1JFRiBpbnN0ZWFkIG9mIFB5X0NMRUFSIGluCisgICAgICAgICMgQmFzZUV4Y2VwdGlvbl9zZXRfbWVzc2FnZSBnYXZlIGEgcG9zc2libGUgd2F5IHRvIHNlZ2ZhdWx0IHRoZQorICAgICAgICAjIGludGVycHJldGVyLgorICAgICAgICBjbGFzcyBOYXN0eShzdHIpOgorICAgICAgICAgICAgZGVmIF9fZGVsX18obWVzc2FnZSk6CisgICAgICAgICAgICAgICAgZGVsIGUubWVzc2FnZQorCisgICAgICAgIGUgPSBWYWx1ZUVycm9yKE5hc3R5KCJtc2ciKSkKKyAgICAgICAgZS5hcmdzID0gKCkKKyAgICAgICAgZGVsIGUubWVzc2FnZQorCisKKyMgSGVscGVyIGNsYXNzIHVzZWQgYnkgVGVzdFNhbWVTdHJBbmRVbmljb2RlTXNnCitjbGFzcyBFeGNXaXRoT3ZlcnJpZGRlblN0cihFeGNlcHRpb24pOgorICAgICIiIlN1YmNsYXNzIG9mIEV4Y2VwdGlvbiB0aGF0IGFjY2VwdHMgYSBrZXl3b3JkICdtc2cnIGFyZyB0aGF0IGlzCisgICAgcmV0dXJuZWQgYnkgX19zdHJfXy4gJ21zZycgd29uJ3QgYmUgaW5jbHVkZWQgaW4gc2VsZi5hcmdzIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYubXNnID0ga3dhcmdzLnBvcCgnbXNnJykgIyBtc2cgc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50CisgICAgICAgIHN1cGVyKEV4Y1dpdGhPdmVycmlkZGVuU3RyLCBzZWxmKS5fX2luaXRfXygqYXJncywgKiprd2FyZ3MpCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1zZworCisKK2NsYXNzIFRlc3RTYW1lU3RyQW5kVW5pY29kZU1zZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIidW5pY29kZShlcnIpIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgbWVzc2FnZSBvZiBzdHIoZXJyKS4gU2VlICM2MTA4IiIiCisKKyAgICBkZWYgY2hlY2tfc2FtZV9tc2coc2VsZiwgZXhjLCBtc2cpOgorICAgICAgICAiIiJIZWxwZXIgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgc3RyKGV4YykgPT0gdW5pY29kZShleGMpID09IG1zZyIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihleGMpLCBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGV4YyksIHVuaWNvZGUoZXhjKSkKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgc2FtZSBtc2cgZm9yIGJ1aWx0LWluIGV4Y2VwdGlvbnMiIiIKKyAgICAgICAgIyBUaGVzZSBleGNlcHRpb25zIGltcGxlbWVudCBhIF9fc3RyX18gbWV0aG9kIHRoYXQgdXNlcyB0aGUgYXJncworICAgICAgICAjIHRvIGNyZWF0ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLiB1bmljb2RlKGUpIHNob3VsZCByZXR1cm4gdGhlIHNhbWUKKyAgICAgICAgIyBtZXNzYWdlLgorICAgICAgICBleGNlcHRpb25zID0gWworICAgICAgICAgICAgU3ludGF4RXJyb3IoJ2ludmFsaWQgc3ludGF4JywgKCc8c3RyaW5nPicsIDEsIDMsICcyKyozJykpLAorICAgICAgICAgICAgSU9FcnJvcigyLCAnTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeScpLAorICAgICAgICAgICAgS2V5RXJyb3IoJ2JvdGggc2hvdWxkIGhhdmUgdGhlIHNhbWUgcXVvdGVzJyksCisgICAgICAgICAgICBVbmljb2RlRGVjb2RlRXJyb3IoJ2FzY2lpJywgJ1x4YzNceGEwJywgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KScpLAorICAgICAgICAgICAgVW5pY29kZUVuY29kZUVycm9yKCdhc2NpaScsIHUnXHUxMjM0JywgMCwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3JkaW5hbCBub3QgaW4gcmFuZ2UoMTI4KScpCisgICAgICAgIF0KKyAgICAgICAgZm9yIGV4Y2VwdGlvbiBpbiBleGNlcHRpb25zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXhjZXB0aW9uKSwgdW5pY29kZShleGNlcHRpb24pKQorCisgICAgZGVmIHRlc3RfMF9hcmdzKHNlbGYpOgorICAgICAgICAiIiJDaGVjayBzYW1lIG1zZyBmb3IgRXhjZXB0aW9uIHdpdGggMCBhcmdzIiIiCisgICAgICAgICMgc3RyKCkgYW5kIHVuaWNvZGUoKSBvbiBhbiBFeGNlcHRpb24gd2l0aCBubyBhcmdzIHNob3VsZCByZXR1cm4gYW4KKyAgICAgICAgIyBlbXB0eSBzdHJpbmcKKyAgICAgICAgc2VsZi5jaGVja19zYW1lX21zZyhFeGNlcHRpb24oKSwgJycpCisKKyAgICBkZWYgdGVzdF8wX2FyZ3Nfd2l0aF9vdmVycmlkZGVuX19fc3RyX18oc2VsZik6CisgICAgICAgICIiIkNoZWNrIHNhbWUgbXNnIGZvciBleGNlcHRpb25zIHdpdGggMCBhcmdzIGFuZCBvdmVycmlkZGVuIF9fc3RyX18iIiIKKyAgICAgICAgIyBzdHIoKSBhbmQgdW5pY29kZSgpIG9uIGFuIGV4Y2VwdGlvbiB3aXRoIG92ZXJyaWRkZW4gX19zdHJfXyB0aGF0CisgICAgICAgICMgcmV0dXJucyBhbiBhc2NpaS1vbmx5IHN0cmluZyBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHN0cmluZworICAgICAgICBmb3IgbXNnIGluICgnZm9vJywgdSdmb28nKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc2FtZV9tc2coRXhjV2l0aE92ZXJyaWRkZW5TdHIobXNnPW1zZyksIG1zZykKKworICAgICAgICAjIGlmIF9fc3RyX18gcmV0dXJucyBhIG5vbi1hc2NpaSB1bmljb2RlIHN0cmluZyBzdHIoKSBzaG91bGQgZmFpbAorICAgICAgICAjIGJ1dCB1bmljb2RlKCkgc2hvdWxkIHJldHVybiB0aGUgdW5pY29kZSBzdHJpbmcKKyAgICAgICAgZSA9IEV4Y1dpdGhPdmVycmlkZGVuU3RyKG1zZz11J2ZceGY2XHhmNicpICMgbm8gYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHN0ciwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKGUpLCB1J2ZceGY2XHhmNicpCisKKyAgICBkZWYgdGVzdF8xX2FyZyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgc2FtZSBtc2cgZm9yIEV4Y2VwdGlvbnMgd2l0aCAxIGFyZyIiIgorICAgICAgICBmb3IgYXJnIGluICgnZm9vJywgdSdmb28nKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc2FtZV9tc2coRXhjZXB0aW9uKGFyZyksIGFyZykKKworICAgICAgICAjIGlmIF9fc3RyX18gaXMgbm90IG92ZXJyaWRkZW4gYW5kIHNlbGYuYXJnc1swXSBpcyBhIG5vbi1hc2NpaSB1bmljb2RlCisgICAgICAgICMgc3RyaW5nLCBzdHIoKSBzaG91bGQgdHJ5IHRvIHJldHVybiBzdHIoc2VsZi5hcmdzWzBdKSBhbmQgZmFpbC4KKyAgICAgICAgIyB1bmljb2RlKCkgc2hvdWxkIHJldHVybiB1bmljb2RlKHNlbGYuYXJnc1swXSkgYW5kIHN1Y2NlZWQuCisgICAgICAgIGUgPSBFeGNlcHRpb24odSdmXHhmNlx4ZjYnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHN0ciwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKGUpLCB1J2ZceGY2XHhmNicpCisKKyAgICBkZWYgdGVzdF8xX2FyZ193aXRoX292ZXJyaWRkZW5fX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgc2FtZSBtc2cgZm9yIGV4Y2VwdGlvbnMgd2l0aCBvdmVycmlkZGVuIF9fc3RyX18gYW5kIDEgYXJnIiIiCisgICAgICAgICMgd2hlbiBfX3N0cl9fIGlzIG92ZXJyaWRkZW4gYW5kIF9fdW5pY29kZV9fIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgICAgICAjIHVuaWNvZGUoZSkgcmV0dXJucyB0aGUgc2FtZSBhcyB1bmljb2RlKGUuX19zdHJfXygpKS4KKyAgICAgICAgZm9yIG1zZyBpbiAoJ2ZvbycsIHUnZm9vJyk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3NhbWVfbXNnKEV4Y1dpdGhPdmVycmlkZGVuU3RyKCdhcmcnLCBtc2c9bXNnKSwgbXNnKQorCisgICAgICAgICMgaWYgX19zdHJfXyByZXR1cm5zIGEgbm9uLWFzY2lpIHVuaWNvZGUgc3RyaW5nLCBzdHIoKSBzaG91bGQgZmFpbAorICAgICAgICAjIGJ1dCB1bmljb2RlKCkgc2hvdWxkIHN1Y2NlZWQuCisgICAgICAgIGUgPSBFeGNXaXRoT3ZlcnJpZGRlblN0cignYXJnJywgbXNnPXUnZlx4ZjZceGY2JykgIyAxIGFyZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIHN0ciwgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKGUpLCB1J2ZceGY2XHhmNicpCisKKyAgICBkZWYgdGVzdF9tYW55X2FyZ3Moc2VsZik6CisgICAgICAgICIiIkNoZWNrIHNhbWUgbXNnIGZvciBFeGNlcHRpb25zIHdpdGggbWFueSBhcmdzIiIiCisgICAgICAgIGFyZ3NsaXN0ID0gWworICAgICAgICAgICAgKDMsICdmb28nKSwKKyAgICAgICAgICAgICgxLCB1J2ZvbycsICdiYXInKSwKKyAgICAgICAgICAgICg0LCB1J2ZceGY2XHhmNicsIHUnYmFyJywgJ2JheicpCisgICAgICAgIF0KKyAgICAgICAgIyBib3RoIHN0cigpIGFuZCB1bmljb2RlKCkgc2hvdWxkIHJldHVybiBhIHJlcHIoKSBvZiB0aGUgYXJncworICAgICAgICBmb3IgYXJncyBpbiBhcmdzbGlzdDoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc2FtZV9tc2coRXhjZXB0aW9uKCphcmdzKSwgcmVwcihhcmdzKSkKKworICAgIGRlZiB0ZXN0X21hbnlfYXJnc193aXRoX292ZXJyaWRkZW5fX19zdHJfXyhzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgc2FtZSBtc2cgZm9yIGV4Y2VwdGlvbnMgd2l0aCBvdmVycmlkZGVuIF9fc3RyX18gYW5kIG1hbnkgYXJncyIiIgorICAgICAgICAjIGlmIF9fc3RyX18gcmV0dXJucyBhbiBhc2NpaSBzdHJpbmcgLyBhc2NpaSB1bmljb2RlIHN0cmluZworICAgICAgICAjIGJvdGggc3RyKCkgYW5kIHVuaWNvZGUoKSBzaG91bGQgc3VjY2VlZAorICAgICAgICBmb3IgbXNnIGluICgnZm9vJywgdSdmb28nKToKKyAgICAgICAgICAgIGUgPSBFeGNXaXRoT3ZlcnJpZGRlblN0cignYXJnMScsIHUnYXJnMicsIHUnZlx4ZjZceGY2JywgbXNnPW1zZykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc2FtZV9tc2coZSwgbXNnKQorCisgICAgICAgICMgaWYgX19zdHJfXyByZXR1cm5zIGEgbm9uLWFzY2lpIHVuaWNvZGUgc3RyaW5nLCBzdHIoKSBzaG91bGQgZmFpbAorICAgICAgICAjIGJ1dCB1bmljb2RlKCkgc2hvdWxkIHN1Y2NlZWQKKyAgICAgICAgZSA9IEV4Y1dpdGhPdmVycmlkZGVuU3RyKCdhcmcxJywgdSdmXHhmNlx4ZjYnLCB1J2FyZzMnLCAjIDMgYXJncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPXUnZlx4ZjZceGY2JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBzdHIsIGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShlKSwgdSdmXHhmNlx4ZjYnKQorCisgICAgQGNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbl93aXRoX2RvYyhzZWxmKToKKyAgICAgICAgaW1wb3J0IF90ZXN0Y2FwaQorICAgICAgICBkb2MyID0gIlRoaXMgaXMgYSB0ZXN0IGRvY3N0cmluZy4iCisgICAgICAgIGRvYzQgPSAiVGhpcyBpcyBhbm90aGVyIHRlc3QgZG9jc3RyaW5nLiIKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvciwgX3Rlc3RjYXBpLm1ha2VfZXhjZXB0aW9uX3dpdGhfZG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IxIikKKworICAgICAgICAjIHRlc3QgYmFzaWMgdXNhZ2Ugb2YgUHlFcnJfTmV3RXhjZXB0aW9uCisgICAgICAgIGVycm9yMSA9IF90ZXN0Y2FwaS5tYWtlX2V4Y2VwdGlvbl93aXRoX2RvYygiX3Rlc3RjYXBpLmVycm9yMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModHlwZShlcnJvcjEpLCB0eXBlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhlcnJvcjEsIEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGVycm9yMS5fX2RvY19fKQorCisgICAgICAgICMgdGVzdCB3aXRoIGdpdmVuIGRvY3N0cmluZworICAgICAgICBlcnJvcjIgPSBfdGVzdGNhcGkubWFrZV9leGNlcHRpb25fd2l0aF9kb2MoIl90ZXN0Y2FwaS5lcnJvcjIiLCBkb2MyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVycm9yMi5fX2RvY19fLCBkb2MyKQorCisgICAgICAgICMgdGVzdCB3aXRoIGV4cGxpY2l0IGJhc2UgKHdpdGhvdXQgZG9jc3RyaW5nKQorICAgICAgICBlcnJvcjMgPSBfdGVzdGNhcGkubWFrZV9leGNlcHRpb25fd2l0aF9kb2MoIl90ZXN0Y2FwaS5lcnJvcjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZT1lcnJvcjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGVycm9yMywgZXJyb3IyKSkKKworICAgICAgICAjIHRlc3Qgd2l0aCBleHBsaWNpdCBiYXNlIHR1cGxlCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXJyb3I0ID0gX3Rlc3RjYXBpLm1ha2VfZXhjZXB0aW9uX3dpdGhfZG9jKCJfdGVzdGNhcGkuZXJyb3I0IiwgZG9jNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcjMsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhlcnJvcjQsIGVycm9yMykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGVycm9yNCwgQykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyb3I0Ll9fZG9jX18sIGRvYzQpCisKKyAgICAgICAgIyB0ZXN0IHdpdGggZXhwbGljaXQgZGljdGlvbmFyeQorICAgICAgICBlcnJvcjUgPSBfdGVzdGNhcGkubWFrZV9leGNlcHRpb25fd2l0aF9kb2MoIl90ZXN0Y2FwaS5lcnJvcjUiLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yNCwgeydhJzogMX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGVycm9yNSwgZXJyb3I0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJvcjUuYSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJvcjUuX19kb2NfXywgIiIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChFeGNlcHRpb25UZXN0cywgVGVzdFNhbWVTdHJBbmRVbmljb2RlTXNnKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTlmNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NzQyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leHRjYWxsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXh0Y2FsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGUwOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZXh0Y2FsbC5weQpAQCAtMCwwICsxLDMxOSBAQAorIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKworIiIiRG9jdGVzdCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxzLgorCitXZSdyZSBnb2luZyB0aGUgdXNlIHRoZXNlIHR5cGVzIGZvciBleHRyYSB0ZXN0aW5nCisKKyAgICA+Pj4gZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKKyAgICA+Pj4gZnJvbSBVc2VyRGljdCBpbXBvcnQgVXNlckRpY3QKKworV2UncmUgZGVmaW5pbmcgZm91ciBoZWxwZXIgZnVuY3Rpb25zCisKKyAgICA+Pj4gZGVmIGUoYSxiKToKKyAgICAuLi4gICAgIHByaW50IGEsIGIKKworICAgID4+PiBkZWYgZigqYSwgKiprKToKKyAgICAuLi4gICAgIHByaW50IGEsIHRlc3Rfc3VwcG9ydC5zb3J0ZGljdChrKQorCisgICAgPj4+IGRlZiBnKHgsICp5LCAqKnopOgorICAgIC4uLiAgICAgcHJpbnQgeCwgeSwgdGVzdF9zdXBwb3J0LnNvcnRkaWN0KHopCisKKyAgICA+Pj4gZGVmIGgoaj0xLCBhPTIsIGg9Myk6CisgICAgLi4uICAgICBwcmludCBqLCBhLCBoCisKK0FyZ3VtZW50IGxpc3QgZXhhbXBsZXMKKworICAgID4+PiBmKCkKKyAgICAoKSB7fQorICAgID4+PiBmKDEpCisgICAgKDEsKSB7fQorICAgID4+PiBmKDEsIDIpCisgICAgKDEsIDIpIHt9CisgICAgPj4+IGYoMSwgMiwgMykKKyAgICAoMSwgMiwgMykge30KKyAgICA+Pj4gZigxLCAyLCAzLCAqKDQsIDUpKQorICAgICgxLCAyLCAzLCA0LCA1KSB7fQorICAgID4+PiBmKDEsIDIsIDMsICpbNCwgNV0pCisgICAgKDEsIDIsIDMsIDQsIDUpIHt9CisgICAgPj4+IGYoMSwgMiwgMywgKlVzZXJMaXN0KFs0LCA1XSkpCisgICAgKDEsIDIsIDMsIDQsIDUpIHt9CisKK0hlcmUgd2UgYWRkIGtleXdvcmQgYXJndW1lbnRzCisKKyAgICA+Pj4gZigxLCAyLCAzLCAqKnsnYSc6NCwgJ2InOjV9KQorICAgICgxLCAyLCAzKSB7J2EnOiA0LCAnYic6IDV9CisgICAgPj4+IGYoMSwgMiwgMywgKls0LCA1XSwgKip7J2EnOjYsICdiJzo3fSkKKyAgICAoMSwgMiwgMywgNCwgNSkgeydhJzogNiwgJ2InOiA3fQorICAgID4+PiBmKDEsIDIsIDMsIHg9NCwgeT01LCAqKDYsIDcpLCAqKnsnYSc6OCwgJ2InOiA5fSkKKyAgICAoMSwgMiwgMywgNiwgNykgeydhJzogOCwgJ2InOiA5LCAneCc6IDQsICd5JzogNX0KKworICAgID4+PiBmKDEsIDIsIDMsICoqVXNlckRpY3QoYT00LCBiPTUpKQorICAgICgxLCAyLCAzKSB7J2EnOiA0LCAnYic6IDV9CisgICAgPj4+IGYoMSwgMiwgMywgKig0LCA1KSwgKipVc2VyRGljdChhPTYsIGI9NykpCisgICAgKDEsIDIsIDMsIDQsIDUpIHsnYSc6IDYsICdiJzogN30KKyAgICA+Pj4gZigxLCAyLCAzLCB4PTQsIHk9NSwgKig2LCA3KSwgKipVc2VyRGljdChhPTgsIGI9OSkpCisgICAgKDEsIDIsIDMsIDYsIDcpIHsnYSc6IDgsICdiJzogOSwgJ3gnOiA0LCAneSc6IDV9CisKK0V4YW1wbGVzIHdpdGggaW52YWxpZCBhcmd1bWVudHMgKFR5cGVFcnJvcnMpLiBXZSdyZSBhbHNvIHRlc3RpbmcgdGhlIGZ1bmN0aW9uCituYW1lcyBpbiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2VzLgorCitWZXJpZnkgY2xlYXJpbmcgb2YgU0YgYnVnICM3MzM2NjcKKworICAgID4+PiBlKGM9NCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGUoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdjJworCisgICAgPj4+IGcoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZygpIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQgKDAgZ2l2ZW4pCisKKyAgICA+Pj4gZygqKCkpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBnKCkgdGFrZXMgYXQgbGVhc3QgMSBhcmd1bWVudCAoMCBnaXZlbikKKworICAgID4+PiBnKCooKSwgKip7fSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGcoKSB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50ICgwIGdpdmVuKQorCisgICAgPj4+IGcoMSkKKyAgICAxICgpIHt9CisgICAgPj4+IGcoMSwgMikKKyAgICAxICgyLCkge30KKyAgICA+Pj4gZygxLCAyLCAzKQorICAgIDEgKDIsIDMpIHt9CisgICAgPj4+IGcoMSwgMiwgMywgKig0LCA1KSkKKyAgICAxICgyLCAzLCA0LCA1KSB7fQorCisgICAgPj4+IGNsYXNzIE5vdGhpbmc6IHBhc3MKKyAgICAuLi4KKyAgICA+Pj4gZygqTm90aGluZygpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZygpIGFyZ3VtZW50IGFmdGVyICogbXVzdCBiZSBhIHNlcXVlbmNlLCBub3QgaW5zdGFuY2UKKworICAgID4+PiBjbGFzcyBOb3RoaW5nOgorICAgIC4uLiAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiA1CisgICAgLi4uCisKKyAgICA+Pj4gZygqTm90aGluZygpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZygpIGFyZ3VtZW50IGFmdGVyICogbXVzdCBiZSBhIHNlcXVlbmNlLCBub3QgaW5zdGFuY2UKKworICAgID4+PiBjbGFzcyBOb3RoaW5nKCk6CisgICAgLi4uICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIDUKKyAgICAuLi4gICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAuLi4gICAgICAgICBpZiBpPDM6IHJldHVybiBpCisgICAgLi4uICAgICAgICAgZWxzZTogcmFpc2UgSW5kZXhFcnJvcihpKQorICAgIC4uLgorCisgICAgPj4+IGcoKk5vdGhpbmcoKSkKKyAgICAwICgxLCAyKSB7fQorCisgICAgPj4+IGNsYXNzIE5vdGhpbmc6CisgICAgLi4uICAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuYyA9IDAKKyAgICAuLi4gICAgIGRlZiBfX2l0ZXJfXyhzZWxmKTogcmV0dXJuIHNlbGYKKyAgICAuLi4gICAgIGRlZiBuZXh0KHNlbGYpOgorICAgIC4uLiAgICAgICAgIGlmIHNlbGYuYyA9PSA0OgorICAgIC4uLiAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgLi4uICAgICAgICAgYyA9IHNlbGYuYworICAgIC4uLiAgICAgICAgIHNlbGYuYyArPSAxCisgICAgLi4uICAgICAgICAgcmV0dXJuIGMKKyAgICAuLi4KKworICAgID4+PiBnKCpOb3RoaW5nKCkpCisgICAgMCAoMSwgMiwgMykge30KKworTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGRvZXNuJ3Qgc3RvbXAgdGhlIGRpY3Rpb25hcnkKKworICAgID4+PiBkID0geydhJzogMSwgJ2InOiAyLCAnYyc6IDN9CisgICAgPj4+IGQyID0gZC5jb3B5KCkKKyAgICA+Pj4gZygxLCBkPTQsICoqZCkKKyAgICAxICgpIHsnYSc6IDEsICdiJzogMiwgJ2MnOiAzLCAnZCc6IDR9CisgICAgPj4+IGQgPT0gZDIKKyAgICBUcnVlCisKK1doYXQgYWJvdXQgd2lsbGZ1bCBtaXNjb25kdWN0PworCisgICAgPj4+IGRlZiBzYWJvdGV1cigqKmt3KToKKyAgICAuLi4gICAgIGt3Wyd4J10gPSAnbScKKyAgICAuLi4gICAgIHJldHVybiBrdworCisgICAgPj4+IGQgPSB7fQorICAgID4+PiBrdyA9IHNhYm90ZXVyKGE9MSwgKipkKQorICAgID4+PiBkCisgICAge30KKworCisgICAgPj4+IGcoMSwgMiwgMywgKip7J3gnOiA0LCAneSc6IDV9KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZygpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgJ3gnCisKKyAgICA+Pj4gZigqKnsxOjJ9KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZigpIGtleXdvcmRzIG11c3QgYmUgc3RyaW5ncworCisgICAgPj4+IGgoKip7J2UnOiAyfSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGgoKSBnb3QgYW4gdW5leHBlY3RlZCBrZXl3b3JkIGFyZ3VtZW50ICdlJworCisgICAgPj4+IGgoKmgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBoKCkgYXJndW1lbnQgYWZ0ZXIgKiBtdXN0IGJlIGEgc2VxdWVuY2UsIG5vdCBmdW5jdGlvbgorCisgICAgPj4+IGRpcigqaCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGRpcigpIGFyZ3VtZW50IGFmdGVyICogbXVzdCBiZSBhIHNlcXVlbmNlLCBub3QgZnVuY3Rpb24KKworICAgID4+PiBOb25lKCpoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogTm9uZVR5cGUgb2JqZWN0IGFyZ3VtZW50IGFmdGVyICogbXVzdCBiZSBhIHNlcXVlbmNlLCBcCitub3QgZnVuY3Rpb24KKworICAgID4+PiBoKCoqaCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGgoKSBhcmd1bWVudCBhZnRlciAqKiBtdXN0IGJlIGEgbWFwcGluZywgbm90IGZ1bmN0aW9uCisKKyAgICA+Pj4gZGlyKCoqaCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGRpcigpIGFyZ3VtZW50IGFmdGVyICoqIG11c3QgYmUgYSBtYXBwaW5nLCBub3QgZnVuY3Rpb24KKworICAgID4+PiBOb25lKCoqaCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IE5vbmVUeXBlIG9iamVjdCBhcmd1bWVudCBhZnRlciAqKiBtdXN0IGJlIGEgbWFwcGluZywgXAorbm90IGZ1bmN0aW9uCisKKyAgICA+Pj4gZGlyKGI9MSwgKip7J2InOiAxfSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IGRpcigpIGdvdCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGtleXdvcmQgYXJndW1lbnQgJ2InCisKK0Fub3RoZXIgaGVscGVyIGZ1bmN0aW9uCisKKyAgICA+Pj4gZGVmIGYyKCphLCAqKmIpOgorICAgIC4uLiAgICAgcmV0dXJuIGEsIGIKKworCisgICAgPj4+IGQgPSB7fQorICAgID4+PiBmb3IgaSBpbiB4cmFuZ2UoNTEyKToKKyAgICAuLi4gICAgIGtleSA9ICdrJWQnICUgaQorICAgIC4uLiAgICAgZFtrZXldID0gaQorICAgID4+PiBhLCBiID0gZjIoMSwgKigyLDMpLCAqKmQpCisgICAgPj4+IGxlbihhKSwgbGVuKGIpLCBiID09IGQKKyAgICAoMywgNTEyLCBUcnVlKQorCisgICAgPj4+IGNsYXNzIEZvbzoKKyAgICAuLi4gICAgIGRlZiBtZXRob2Qoc2VsZiwgYXJnMSwgYXJnMik6CisgICAgLi4uICAgICAgICAgcmV0dXJuIGFyZzErYXJnMgorCisgICAgPj4+IHggPSBGb28oKQorICAgID4+PiBGb28ubWV0aG9kKCooeCwgMSwgMikpCisgICAgMworICAgID4+PiBGb28ubWV0aG9kKHgsICooMSwgMikpCisgICAgMworICAgID4+PiBGb28ubWV0aG9kKCooMSwgMiwgMykpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiB1bmJvdW5kIG1ldGhvZCBtZXRob2QoKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEZvbyBpbnN0YW5jZSBhcyBcCitmaXJzdCBhcmd1bWVudCAoZ290IGludCBpbnN0YW5jZSBpbnN0ZWFkKQorCisgICAgPj4+IEZvby5tZXRob2QoMSwgKlsyLCAzXSkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBUeXBlRXJyb3I6IHVuYm91bmQgbWV0aG9kIG1ldGhvZCgpIG11c3QgYmUgY2FsbGVkIHdpdGggRm9vIGluc3RhbmNlIGFzIFwKK2ZpcnN0IGFyZ3VtZW50IChnb3QgaW50IGluc3RhbmNlIGluc3RlYWQpCisKK0EgUHlDRnVuY3Rpb24gdGhhdCB0YWtlcyBvbmx5IHBvc2l0aW9uYWwgcGFyYW1ldGVycyBzaG91bGQgYWxsb3cgYW4KK2VtcHR5IGtleXdvcmQgZGljdGlvbmFyeSB0byBwYXNzIHdpdGhvdXQgYSBjb21wbGFpbnQsIGJ1dCByYWlzZSBhCitUeXBlRXJyb3IgaWYgdGUgZGljdGlvbmFyeSBpcyBub3QgZW1wdHkKKworICAgID4+PiB0cnk6CisgICAgLi4uICAgICBzaWxlbmNlID0gaWQoMSwgKnt9KQorICAgIC4uLiAgICAgVHJ1ZQorICAgIC4uLiBleGNlcHQ6CisgICAgLi4uICAgICBGYWxzZQorICAgIFRydWUKKworICAgID4+PiBpZCgxLCAqKnsnZm9vJzogMX0pCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBpZCgpIHRha2VzIG5vIGtleXdvcmQgYXJndW1lbnRzCisKK0EgY29ybmVyIGNhc2Ugb2Yga2V5d29yZCBkaWN0aW9uYXJ5IGl0ZW1zIGJlaW5nIGRlbGV0ZWQgZHVyaW5nCit0aGUgZnVuY3Rpb24gY2FsbCBzZXR1cC4gU2VlIDxodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjAxNj4uCisKKyAgICA+Pj4gY2xhc3MgTmFtZShzdHIpOgorICAgIC4uLiAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgLi4uICAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgICAgZGVsIHhbc2VsZl0KKyAgICAuLi4gICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgLi4uICAgICAgICAgICAgICBwYXNzCisgICAgLi4uICAgICAgICAgcmV0dXJuIHN0ci5fX2VxX18oc2VsZiwgb3RoZXIpCisgICAgLi4uICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgLi4uICAgICAgICAgcmV0dXJuIHN0ci5fX2hhc2hfXyhzZWxmKQorCisgICAgPj4+IHggPSB7TmFtZSgiYSIpOjEsIE5hbWUoImIiKToyfQorICAgID4+PiBkZWYgZihhLCBiKToKKyAgICAuLi4gICAgIHByaW50IGEsYgorICAgID4+PiBmKCoqeCkKKyAgICAxIDIKKworQSBvYnNjdXJlIG1lc3NhZ2U6CisKKyAgICA+Pj4gZGVmIGYoYSwgYik6CisgICAgLi4uICAgIHBhc3MKKyAgICA+Pj4gZihiPTEpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVHlwZUVycm9yOiBmKCkgdGFrZXMgZXhhY3RseSAyIGFyZ3VtZW50cyAoMSBnaXZlbikKKworVGhlIG51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkIGluIGluY2x1ZGVzIGtleXdvcmRzOgorCisgICAgPj4+IGRlZiBmKGEpOgorICAgIC4uLiAgICBwYXNzCisgICAgPj4+IGYoNiwgYT00LCAqKDEsIDIsIDMpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogZigpIHRha2VzIGV4YWN0bHkgMSBhcmd1bWVudCAoNSBnaXZlbikKKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgRXh0Q2FsbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdW5pY29kZV9rZXl3b3JkcyhzZWxmKToKKyAgICAgICAgZGVmIGYoYSk6CisgICAgICAgICAgICByZXR1cm4gYQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoKip7dSdhJzogNH0pLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsICoqe3Unc3TDtnJlbic6IDR9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsICoqe3Unc29tZUxvbmdTdHJpbmcnOjJ9KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmKGE9NCwgKip7dSdhJzogNH0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImR1cGxpY2F0ZSBhcmd1bWVudHMgZGlkbid0IHJhaXNlIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHN5cy5tb2R1bGVzW19fbmFtZV9fXSwgVHJ1ZSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEV4dENhbGxUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leHRjYWxsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4dGNhbGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmFmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leHRjYWxsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leHRjYWxsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2V4dGNhbGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmFmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9leHRjYWxsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZjbnRsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzVmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weQpAQCAtMCwwICsxLDEyNSBAQAorIiIiVGVzdCBwcm9ncmFtIGZvciB0aGUgZmNudGwgQyBtb2R1bGUuCisKK09TLzIrRU1YIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgZmlsZSBsb2NraW5nIG9wZXJhdGlvbnMuCisKKyIiIgoraW1wb3J0IG9zCitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3lzCitpbXBvcnQgX3Rlc3RjYXBpCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICh2ZXJib3NlLCBURVNURk4sIHVubGluaywgcnVuX3VuaXR0ZXN0LAorICAgIGltcG9ydF9tb2R1bGUpCisKKyMgU2tpcCB0ZXN0IGlmIG5vIGZuY3RsIG1vZHVsZS4KK2ZjbnRsID0gaW1wb3J0X21vZHVsZSgnZmNudGwnKQorCisKKyMgVE9ETyAtIFdyaXRlIHRlc3RzIGZvciBmbG9jaygpIGFuZCBsb2NrZigpLgorCitkZWYgZ2V0X2xvY2tkYXRhKCk6CisgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2F0aGVvcycpOgorICAgICAgICBzdGFydF9sZW4gPSAicXEiCisgICAgZWxzZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuT19MQVJHRUZJTEUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc3RhcnRfbGVuID0gImxsIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3RhcnRfbGVuID0gInFxIgorCisgICAgaWYgKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCgnbmV0YnNkJywgJ2ZyZWVic2QnLCAnb3BlbmJzZCcsICdic2RvcycpKQorICAgICAgICBvciBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicpOgorICAgICAgICBpZiBzdHJ1Y3QuY2FsY3NpemUoJ2wnKSA9PSA4OgorICAgICAgICAgICAgb2ZmX3QgPSAnbCcKKyAgICAgICAgICAgIHBpZF90ID0gJ2knCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvZmZfdCA9ICdseHh4eCcKKyAgICAgICAgICAgIHBpZF90ID0gJ2wnCisgICAgICAgIGxvY2tkYXRhID0gc3RydWN0LnBhY2sob2ZmX3QgKyBvZmZfdCArIHBpZF90ICsgJ2hoJywgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY250bC5GX1dSTENLLCAwKQorICAgIGVsaWYgc3lzLnBsYXRmb3JtIGluIFsnYWl4MycsICdhaXg0JywgJ2hwLXV4QicsICd1bml4d2FyZTcnXToKKyAgICAgICAgbG9ja2RhdGEgPSBzdHJ1Y3QucGFjaygnaGhsbGxpaScsIGZjbnRsLkZfV1JMQ0ssIDAsIDAsIDAsIDAsIDAsIDApCisgICAgZWxpZiBzeXMucGxhdGZvcm0gaW4gWydvczJlbXgnXToKKyAgICAgICAgbG9ja2RhdGEgPSBOb25lCisgICAgZWxzZToKKyAgICAgICAgbG9ja2RhdGEgPSBzdHJ1Y3QucGFjaygnaGgnK3N0YXJ0X2xlbisnaGgnLCBmY250bC5GX1dSTENLLCAwLCAwLCAwLCAwLCAwKQorICAgIGlmIGxvY2tkYXRhOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ3N0cnVjdC5wYWNrOiAnLCByZXByKGxvY2tkYXRhKQorICAgIHJldHVybiBsb2NrZGF0YQorCitsb2NrZGF0YSA9IGdldF9sb2NrZGF0YSgpCisKKworY2xhc3MgVGVzdEZjbnRsKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5mID0gTm9uZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmYgYW5kIG5vdCBzZWxmLmYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2ZjbnRsX2ZpbGVubyhzZWxmKToKKyAgICAgICAgIyB0aGUgZXhhbXBsZSBmcm9tIHRoZSBsaWJyYXJ5IGRvY3MKKyAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgcnYgPSBmY250bC5mY250bChzZWxmLmYuZmlsZW5vKCksIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnU3RhdHVzIGZyb20gZmNudGwgd2l0aCBPX05PTkJMT0NLOiAnLCBydgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gbm90IGluIFsnb3MyZW14J106CisgICAgICAgICAgICBydiA9IGZjbnRsLmZjbnRsKHNlbGYuZi5maWxlbm8oKSwgZmNudGwuRl9TRVRMS1csIGxvY2tkYXRhKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnU3RyaW5nIGZyb20gZmNudGwgd2l0aCBGX1NFVExLVzogJywgcmVwcihydikKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2ZjbnRsX2ZpbGVfZGVzY3JpcHRvcihzZWxmKToKKyAgICAgICAgIyBhZ2FpbiwgYnV0IHBhc3MgdGhlIGZpbGUgcmF0aGVyIHRoYW4gbnVtZXJpYyBkZXNjcmlwdG9yCisgICAgICAgIHNlbGYuZiA9IG9wZW4oVEVTVEZOLCAndycpCisgICAgICAgIHJ2ID0gZmNudGwuZmNudGwoc2VsZi5mLCBmY250bC5GX1NFVEZMLCBvcy5PX05PTkJMT0NLKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gbm90IGluIFsnb3MyZW14J106CisgICAgICAgICAgICBydiA9IGZjbnRsLmZjbnRsKHNlbGYuZiwgZmNudGwuRl9TRVRMS1csIGxvY2tkYXRhKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZmNudGxfYmFkX2ZpbGUoc2VsZik6CisgICAgICAgIGNsYXNzIEY6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm4pOgorICAgICAgICAgICAgICAgIHNlbGYuZm4gPSBmbgorICAgICAgICAgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5mbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmY250bC5mY250bCwgLTEsIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZjbnRsLmZjbnRsLCBGKC0xKSwgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmY250bC5mY250bCwgJ3NwYW0nLCBmY250bC5GX1NFVEZMLCBvcy5PX05PTkJMT0NLKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZjbnRsLmZjbnRsLCBGKCdzcGFtJyksIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgICMgSXNzdWUgMTU5ODkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmNudGwuZmNudGwsIF90ZXN0Y2FwaS5JTlRfTUFYICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZjbnRsLmZjbnRsLCBGKF90ZXN0Y2FwaS5JTlRfTUFYICsgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY250bC5GX1NFVEZMLCBvcy5PX05PTkJMT0NLKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmY250bC5mY250bCwgX3Rlc3RjYXBpLklOVF9NSU4gLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNudGwuRl9TRVRGTCwgb3MuT19OT05CTE9DSykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmNudGwuZmNudGwsIEYoX3Rlc3RjYXBpLklOVF9NSU4gLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjbnRsLkZfU0VURkwsIG9zLk9fTk9OQkxPQ0spCisKKyAgICBkZWYgdGVzdF9mY250bF82NF9iaXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzMDkzNTI6IGZjbnRsIHNob3VsZG4ndCBmYWlsIHdoZW4gdGhlIHRoaXJkIGFyZyBmaXRzIGluIGEKKyAgICAgICAgIyBDICdsb25nJyBidXQgbm90IGluIGEgQyAnaW50Jy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kID0gZmNudGwuRl9OT1RJRlkKKyAgICAgICAgICAgICMgVGhpcyBmbGFnIGlzIGxhcmdlciB0aGFuIDIqKjMxIGluIDY0LWJpdCBidWlsZHMKKyAgICAgICAgICAgIGZsYWdzID0gZmNudGwuRE5fTVVMVElTSE9UCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIkZfTk9USUZZIG9yIEROX01VTFRJU0hPVCB1bmF2YWlsYWJsZSIpCisgICAgICAgIGZkID0gb3Mub3Blbihvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKFRFU1RGTikpLCBvcy5PX1JET05MWSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmNudGwuZmNudGwoZmQsIGNtZCwgZmxhZ3MpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RGY250bCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmNudGwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmNudGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjhmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmNudGwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmNudGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MjhmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mY250bC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZmYTRiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUucHkKQEAgLTAsMCArMSwzNDcgQEAKKyMgTk9URTogdGhpcyBmaWxlIHRlc3RzIHRoZSBuZXcgYGlvYCBsaWJyYXJ5IGJhY2twb3J0ZWQgZnJvbSBQeXRob24gMy54LgorIyBTaW1pbGFyIHRlc3RzIGZvciB0aGUgYnVpbHRpbiBmaWxlIG9iamVjdCBjYW4gYmUgZm91bmQgaW4gdGVzdF9maWxlMmsucHkuCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gYXJyYXkgaW1wb3J0IGFycmF5Citmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CisKK2ltcG9ydCBpbworaW1wb3J0IF9weWlvIGFzIHB5aW8KKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKK2Zyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0CisKK2NsYXNzIEF1dG9GaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgZmlsZSB0ZXN0cyBmb3Igd2hpY2ggYSB0ZXN0IGZpbGUgaXMgYXV0b21hdGljYWxseSBzZXQgdXAKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5mID0gc2VsZi5vcGVuKFRFU1RGTiwgJ3diJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mOgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKworICAgIGRlZiB0ZXN0V2Vha1JlZnMoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHdlYWsgcmVmZXJlbmNlcworICAgICAgICBwID0gcHJveHkoc2VsZi5mKQorICAgICAgICBwLndyaXRlKGIndGVzdHN0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnRlbGwoKSwgcC50ZWxsKCkpCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIHNlbGYuZiA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIGdldGF0dHIsIHAsICd0ZWxsJykKKworICAgIGRlZiB0ZXN0QXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgZXhwZWN0ZWQgYXR0cmlidXRlcyBleGlzdAorICAgICAgICBmID0gc2VsZi5mCisgICAgICAgIGYubmFtZSAgICAgIyBtZXJlbHkgc2hvdWxkbid0IGJsb3cgdXAKKyAgICAgICAgZi5tb2RlICAgICAjIGRpdHRvCisgICAgICAgIGYuY2xvc2VkICAgIyBkaXR0bworCisgICAgZGVmIHRlc3RSZWFkaW50byhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgcmVhZGludG8KKyAgICAgICAgc2VsZi5mLndyaXRlKGInMTInKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBhID0gYXJyYXkoJ2InLCBiJ3gnKjEwKQorICAgICAgICBzZWxmLmYgPSBzZWxmLm9wZW4oVEVTVEZOLCAncmInKQorICAgICAgICBuID0gc2VsZi5mLnJlYWRpbnRvKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicxMicsIGEudG9zdHJpbmcoKVs6bl0pCisKKyAgICBkZWYgdGVzdFJlYWRpbnRvX3RleHQoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHJlYWRpbnRvIHJlZnVzZXMgdGV4dCBmaWxlcworICAgICAgICBhID0gYXJyYXkoJ2InLCBiJ3gnKjEwKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBzZWxmLm9wZW4oVEVTVEZOLCAncicpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5mLCAicmVhZGludG8iKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLnJlYWRpbnRvLCBhKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzVXNlckxpc3Qoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBpbnN0YW5jZSBzZXF1ZW5jZQorICAgICAgICBsID0gVXNlckxpc3QoW2InMScsIGInMiddKQorICAgICAgICBzZWxmLmYud3JpdGVsaW5lcyhsKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBzZWxmLmYgPSBzZWxmLm9wZW4oVEVTVEZOLCAncmInKQorICAgICAgICBidWYgPSBzZWxmLmYucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBiJzEyJykKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc0ludGVnZXJzKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB3cml0ZWxpbmVzIHdpdGggaW50ZWdlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgWzEsIDIsIDNdKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzSW50ZWdlcnNVc2VyTGlzdChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd3JpdGVsaW5lcyB3aXRoIGludGVnZXJzIGluIFVzZXJMaXN0CisgICAgICAgIGwgPSBVc2VyTGlzdChbMSwyLDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBsKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzTm9uU3RyaW5nKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB3cml0ZWxpbmVzIHdpdGggbm9uLXN0cmluZyBvYmplY3QKKyAgICAgICAgY2xhc3MgTm9uU3RyaW5nOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb25TdHJpbmcoKSwgTm9uU3RyaW5nKCldKQorCisgICAgZGVmIHRlc3RFcnJvcnMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm5hbWUsIFRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmLmlzYXR0eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQorCisgICAgICAgIGlmIGhhc2F0dHIoZiwgInJlYWRpbnRvIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoSU9FcnJvciwgVHlwZUVycm9yKSwgZi5yZWFkaW50bywgIiIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCisKKyAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CisgICAgICAgIG1ldGhvZHMgPSBbKCdmaWxlbm8nLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCdmbHVzaCcsICgpKSwKKyAgICAgICAgICAgICAgICAgICAoJ2lzYXR0eScsICgpKSwKKyAgICAgICAgICAgICAgICAgICAoJ25leHQnLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCdyZWFkJywgKCkpLAorICAgICAgICAgICAgICAgICAgICgnd3JpdGUnLCAoYiIiLCkpLAorICAgICAgICAgICAgICAgICAgICgncmVhZGxpbmUnLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCdyZWFkbGluZXMnLCAoKSksCisgICAgICAgICAgICAgICAgICAgKCdzZWVrJywgKDAsKSksCisgICAgICAgICAgICAgICAgICAgKCd0ZWxsJywgKCkpLAorICAgICAgICAgICAgICAgICAgICgnd3JpdGUnLCAoYiIiLCkpLAorICAgICAgICAgICAgICAgICAgICgnd3JpdGVsaW5lcycsIChbXSwpKSwKKyAgICAgICAgICAgICAgICAgICAoJ19faXRlcl9fJywgKCkpLAorICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdhdGhlb3MnKToKKyAgICAgICAgICAgIG1ldGhvZHMuYXBwZW5kKCgndHJ1bmNhdGUnLCAoKSkpCisKKyAgICAgICAgIyBfX2V4aXRfXyBzaG91bGQgY2xvc2UgdGhlIGZpbGUKKyAgICAgICAgc2VsZi5mLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuY2xvc2VkKQorCisgICAgICAgIGZvciBtZXRob2RuYW1lLCBhcmdzIGluIG1ldGhvZHM6CisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKKyAgICAgICAgICAgICMgc2hvdWxkIHJhaXNlIG9uIGNsb3NlZCBmaWxlCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZXRob2QsICphcmdzKQorCisgICAgICAgICMgZmlsZSBpcyBjbG9zZWQsIF9fZXhpdF9fIHNob3VsZG4ndCBkbyBhbnl0aGluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKSwgTm9uZSkKKyAgICAgICAgIyBpdCBtdXN0IGFsc28gcmV0dXJuIE5vbmUgaWYgYW4gZXhjZXB0aW9uIHdhcyBnaXZlbgorICAgICAgICB0cnk6CisgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuX19leGl0X18oKnN5cy5leGNfaW5mbygpKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0UmVhZFdoZW5Xcml0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLmYucmVhZCkKKworY2xhc3MgQ0F1dG9GaWxlVGVzdHMoQXV0b0ZpbGVUZXN0cyk6CisgICAgb3BlbiA9IGlvLm9wZW4KKworY2xhc3MgUHlBdXRvRmlsZVRlc3RzKEF1dG9GaWxlVGVzdHMpOgorICAgIG9wZW4gPSBzdGF0aWNtZXRob2QocHlpby5vcGVuKQorCisKK2NsYXNzIE90aGVyRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0TW9kZVN0cmluZ3Moc2VsZik6CisgICAgICAgICMgY2hlY2sgaW52YWxpZCBtb2RlIHN0cmluZ3MKKyAgICAgICAgZm9yIG1vZGUgaW4gKCIiLCAiYVUiLCAid1UrIik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sIG1vZGUpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnJXIgaXMgYW4gaW52YWxpZCBmaWxlIG1vZGUnICUgbW9kZSkKKworICAgIGRlZiB0ZXN0U3RkaW4oc2VsZik6CisgICAgICAgICMgVGhpcyBjYXVzZXMgdGhlIGludGVycHJldGVyIHRvIGV4aXQgb24gT1NGMSB2NS4xLgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ29zZjFWNSc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoSU9FcnJvciwgVmFsdWVFcnJvciksIHN5cy5zdGRpbi5zZWVrLCAtMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50KCgKKyAgICAgICAgICAgICAgICAnICBTa2lwcGluZyBzeXMuc3RkaW4uc2VlaygtMSksIGl0IG1heSBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIuJworICAgICAgICAgICAgICAgICcgVGVzdCBtYW51YWxseS4nKSwgZmlsZT1zeXMuX19zdGRvdXRfXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKElPRXJyb3IsIFZhbHVlRXJyb3IpLCBzeXMuc3RkaW4udHJ1bmNhdGUpCisKKyAgICBkZWYgdGVzdEJhZE1vZGVBcmd1bWVudChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgdGhhdCB3ZSBnZXQgYSBzZW5zaWJsZSBlcnJvciBtZXNzYWdlIGZvciBiYWQgbW9kZSBhcmd1bWVudAorICAgICAgICBiYWRfbW9kZSA9ICJxd2VydHkiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oVEVTVEZOLCBiYWRfbW9kZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgbXNnOgorICAgICAgICAgICAgaWYgbXNnLmFyZ3NbMF0gIT0gMDoKKyAgICAgICAgICAgICAgICBzID0gc3RyKG1zZykKKyAgICAgICAgICAgICAgICBpZiBURVNURk4gaW4gcyBvciBiYWRfbW9kZSBub3QgaW4gczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJiYWQgZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBtb2RlOiAlcyIgJSBzKQorICAgICAgICAgICAgIyBpZiBtc2cuYXJnc1swXSA9PSAwLCB3ZSdyZSBwcm9iYWJseSBvbiBXaW5kb3dzIHdoZXJlIHRoZXJlIG1heSBiZQorICAgICAgICAgICAgIyBubyBvYnZpb3VzIHdheSB0byBkaXNjb3ZlciB3aHkgb3BlbigpIGZhaWxlZC4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBlcnJvciBmb3IgaW52YWxpZCBtb2RlOiAlcyIgJSBiYWRfbW9kZSkKKworICAgIGRlZiB0ZXN0U2V0QnVmZmVyU2l6ZShzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGJ1ZmZlciBzaXplIGRvZXNuJ3QgY2F1c2UKKyAgICAgICAgIyBtaXNiZWhhdmlvdXIgZXNwZWNpYWxseSB3aXRoIHJlcGVhdGVkIGNsb3NlKCkgY2FsbHMKKyAgICAgICAgZm9yIHMgaW4gKC0xLCAwLCAxLCA1MTIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oVEVTVEZOLCAnd2InLCBzKQorICAgICAgICAgICAgICAgIGYud3JpdGUoc3RyKHMpLmVuY29kZSgiYXNjaWkiKSkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBmID0gc2VsZi5vcGVuKFRFU1RGTiwgJ3JiJywgcykKKyAgICAgICAgICAgICAgICBkID0gaW50KGYucmVhZCgpLmRlY29kZSgiYXNjaWkiKSkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIG1zZzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Vycm9yIHNldHRpbmcgYnVmZmVyIHNpemUgJWQ6ICVzJyAlIChzLCBzdHIobXNnKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHMpCisKKyAgICBkZWYgdGVzdFRydW5jYXRlT25XaW5kb3dzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzgwMTYzMT4KKyAgICAgICAgIyAiZmlsZS50cnVuY2F0ZSBmYXVsdCBvbiB3aW5kb3dzIgorCisgICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgICAgIGYgPSBzZWxmLm9wZW4oVEVTVEZOLCAnd2InKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoYicxMjM0NTY3ODkwMScpICAgIyAxMSBieXRlcworICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oVEVTVEZOLCdyYisnKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCg1KQorICAgICAgICAgICAgaWYgZGF0YSAhPSBiJzEyMzQ1JzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJlYWQgb24gZmlsZSBvcGVuZWQgZm9yIHVwZGF0ZSBmYWlsZWQgJXIiICUgZGF0YSkKKyAgICAgICAgICAgIGlmIGYudGVsbCgpICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHBvcyBhZnRlciByZWFkIHdyb25nICVkIiAlIGYudGVsbCgpKQorCisgICAgICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgICAgIGlmIGYudGVsbCgpICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHBvcyBhZnRlciBmdHJ1bmNhdGUgd3JvbmcgJWQiICUgZi50ZWxsKCkpCisKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2l6ZSA9IG9zLnBhdGguZ2V0c2l6ZShURVNURk4pCisgICAgICAgICAgICBpZiBzaXplICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHNpemUgYWZ0ZXIgZnRydW5jYXRlIHdyb25nICVkIiAlIHNpemUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdEl0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSBjb21wbGV4IGludGVyYWN0aW9uIHdoZW4gbWl4aW5nIGZpbGUtaXRlcmF0aW9uIGFuZCB0aGUKKyAgICAgICAgIyB2YXJpb3VzIHJlYWQqIG1ldGhvZHMuCisgICAgICAgIGRhdGFvZmZzZXQgPSAxNjM4NAorICAgICAgICBmaWxsZXIgPSBiImhhbVxuIgorICAgICAgICBhc3NlcnQgbm90IGRhdGFvZmZzZXQgJSBsZW4oZmlsbGVyKSwgXAorICAgICAgICAgICAgImRhdGFvZmZzZXQgbXVzdCBiZSBtdWx0aXBsZSBvZiBsZW4oZmlsbGVyKSIKKyAgICAgICAgbmNodW5rcyA9IGRhdGFvZmZzZXQgLy8gbGVuKGZpbGxlcikKKyAgICAgICAgdGVzdGxpbmVzID0gWworICAgICAgICAgICAgYiJzcGFtLCBzcGFtIGFuZCBlZ2dzXG4iLAorICAgICAgICAgICAgYiJlZ2dzLCBzcGFtLCBoYW0gYW5kIHNwYW1cbiIsCisgICAgICAgICAgICBiInNhdXNzYWdlcywgc3BhbSwgc3BhbSBhbmQgZWdnc1xuIiwKKyAgICAgICAgICAgIGIic3BhbSwgaGFtLCBzcGFtIGFuZCBlZ2dzXG4iLAorICAgICAgICAgICAgYiJzcGFtLCBzcGFtLCBzcGFtLCBzcGFtLCBzcGFtLCBoYW0sIHNwYW1cbiIsCisgICAgICAgICAgICBiIndvbmRlcmZ1bCBzcGFhYWFhYW0uXG4iCisgICAgICAgIF0KKyAgICAgICAgbWV0aG9kcyA9IFsoInJlYWRsaW5lIiwgKCkpLCAoInJlYWQiLCAoKSksICgicmVhZGxpbmVzIiwgKCkpLAorICAgICAgICAgICAgICAgICAgICgicmVhZGludG8iLCAoYXJyYXkoImIiLCBiIiAiKjEwMCksKSldCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBQcmVwYXJlIHRoZSB0ZXN0ZmlsZQorICAgICAgICAgICAgYmFnID0gc2VsZi5vcGVuKFRFU1RGTiwgIndiIikKKyAgICAgICAgICAgIGJhZy53cml0ZShmaWxsZXIgKiBuY2h1bmtzKQorICAgICAgICAgICAgYmFnLndyaXRlbGluZXModGVzdGxpbmVzKQorICAgICAgICAgICAgYmFnLmNsb3NlKCkKKyAgICAgICAgICAgICMgVGVzdCBmb3IgYXBwcm9wcmlhdGUgZXJyb3JzIG1peGluZyByZWFkKiBhbmQgaXRlcmF0aW9uCisgICAgICAgICAgICBmb3IgbWV0aG9kbmFtZSwgYXJncyBpbiBtZXRob2RzOgorICAgICAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oVEVTVEZOLCAncmInKQorICAgICAgICAgICAgICAgIGlmIG5leHQoZikgIT0gZmlsbGVyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwsICJCcm9rZW4gdGVzdGZpbGUiCisgICAgICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIoZiwgbWV0aG9kbmFtZSkKKyAgICAgICAgICAgICAgICBtZXRoKCphcmdzKSAgIyBUaGlzIHNpbXBseSBzaG91bGRuJ3QgZmFpbAorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFRlc3QgdG8gc2VlIGlmIGhhcm1sZXNzIChieSBhY2NpZGVudCkgbWl4aW5nIG9mIHJlYWQqIGFuZAorICAgICAgICAgICAgIyBpdGVyYXRpb24gc3RpbGwgd29ya3MuIFRoaXMgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwKKyAgICAgICAgICAgICMgaXRlcmF0aW9uIGJ1ZmZlciAoY3VycmVudGx5IDgxOTIsKSBidXQgd2UgY2FuIHRlc3QgaXQgaW4gYQorICAgICAgICAgICAgIyBmbGV4aWJsZSBtYW5uZXIuICBFYWNoIGxpbmUgaW4gdGhlIGJhZyBvJyBoYW0gaXMgNCBieXRlcworICAgICAgICAgICAgIyAoImgiLCAiYSIsICJtIiwgIlxuIiksIHNvIDQwOTYgbGluZXMgb2YgdGhhdCBzaG91bGQgZ2V0IHVzCisgICAgICAgICAgICAjIGV4YWN0bHkgb24gdGhlIGJ1ZmZlciBib3VuZGFyeSBmb3IgYW55IHBvd2VyLW9mLTIgYnVmZmVyc2l6ZQorICAgICAgICAgICAgIyBiZXR3ZWVuIDQgYW5kIDE2Mzg0IChpbmNsdXNpdmUpLgorICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sICdyYicpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuY2h1bmtzKToKKyAgICAgICAgICAgICAgICBuZXh0KGYpCisgICAgICAgICAgICB0ZXN0bGluZSA9IHRlc3RsaW5lcy5wb3AoMCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRsaW5lKCkgYWZ0ZXIgbmV4dCgpIHdpdGggc3VwcG9zZWRseSBlbXB0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRpb24tYnVmZmVyIGZhaWxlZCBhbnl3YXkiKQorICAgICAgICAgICAgaWYgbGluZSAhPSB0ZXN0bGluZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRsaW5lKCkgYWZ0ZXIgbmV4dCgpIHdpdGggZW1wdHkgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZC4gR290ICVyLCBleHBlY3RlZCAlciIgJSAobGluZSwgdGVzdGxpbmUpKQorICAgICAgICAgICAgdGVzdGxpbmUgPSB0ZXN0bGluZXMucG9wKDApCisgICAgICAgICAgICBidWYgPSBhcnJheSgiYiIsIGIiXHgwMCIgKiBsZW4odGVzdGxpbmUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYucmVhZGludG8oYnVmKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkaW50bygpIGFmdGVyIG5leHQoKSB3aXRoIHN1cHBvc2VkbHkgZW1wdHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmF0aW9uLWJ1ZmZlciBmYWlsZWQgYW55d2F5IikKKyAgICAgICAgICAgIGxpbmUgPSBidWYudG9zdHJpbmcoKQorICAgICAgICAgICAgaWYgbGluZSAhPSB0ZXN0bGluZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRpbnRvKCkgYWZ0ZXIgbmV4dCgpIHdpdGggZW1wdHkgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZC4gR290ICVyLCBleHBlY3RlZCAlciIgJSAobGluZSwgdGVzdGxpbmUpKQorCisgICAgICAgICAgICB0ZXN0bGluZSA9IHRlc3RsaW5lcy5wb3AoMCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lID0gZi5yZWFkKGxlbih0ZXN0bGluZSkpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWQoKSBhZnRlciBuZXh0KCkgd2l0aCBzdXBwb3NlZGx5IGVtcHR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbi1idWZmZXIgZmFpbGVkIGFueXdheSIpCisgICAgICAgICAgICBpZiBsaW5lICE9IHRlc3RsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZCgpIGFmdGVyIG5leHQoKSB3aXRoIGVtcHR5IGJ1ZmZlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJmYWlsZWQuIEdvdCAlciwgZXhwZWN0ZWQgJXIiICUgKGxpbmUsIHRlc3RsaW5lKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lcyA9IGYucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGxpbmVzKCkgYWZ0ZXIgbmV4dCgpIHdpdGggc3VwcG9zZWRseSBlbXB0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRpb24tYnVmZmVyIGZhaWxlZCBhbnl3YXkiKQorICAgICAgICAgICAgaWYgbGluZXMgIT0gdGVzdGxpbmVzOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGxpbmVzKCkgYWZ0ZXIgbmV4dCgpIHdpdGggZW1wdHkgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZC4gR290ICVyLCBleHBlY3RlZCAlciIgJSAobGluZSwgdGVzdGxpbmUpKQorICAgICAgICAgICAgIyBSZWFkaW5nIGFmdGVyIGl0ZXJhdGlvbiBoaXQgRU9GIHNob3VsZG4ndCBodXJ0IGVpdGhlcgorICAgICAgICAgICAgZiA9IHNlbGYub3BlbihURVNURk4sICdyYicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIGYucmVhZGludG8oYnVmKQorICAgICAgICAgICAgICAgICAgICBmLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZCogZmFpbGVkIGFmdGVyIG5leHQoKSBjb25zdW1lZCBmaWxlIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorCitjbGFzcyBDT3RoZXJGaWxlVGVzdHMoT3RoZXJGaWxlVGVzdHMpOgorICAgIG9wZW4gPSBpby5vcGVuCisKK2NsYXNzIFB5T3RoZXJGaWxlVGVzdHMoT3RoZXJGaWxlVGVzdHMpOgorICAgIG9wZW4gPSBzdGF0aWNtZXRob2QocHlpby5vcGVuKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjIEhpc3RvcmljYWxseSwgdGhlc2UgdGVzdHMgaGF2ZSBiZWVuIHNsb3BweSBhYm91dCByZW1vdmluZyBURVNURk4uCisgICAgIyBTbyBnZXQgcmlkIG9mIGl0IG5vIG1hdHRlciB3aGF0LgorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KENBdXRvRmlsZVRlc3RzLCBQeUF1dG9GaWxlVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICBDT3RoZXJGaWxlVGVzdHMsIFB5T3RoZXJGaWxlVGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzNDMyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjOWFkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzYzM2I0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZTJrLnB5CkBAIC0wLDAgKzEsODMyIEBACitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHNlbGVjdAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0aW1lCitmcm9tIGFycmF5IGltcG9ydCBhcnJheQorZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdAorZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKKworY2xhc3MgQXV0b0ZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBmaWxlIHRlc3RzIGZvciB3aGljaCBhIHRlc3QgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgJ3diJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mOgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKworICAgIGRlZiB0ZXN0V2Vha1JlZnMoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHdlYWsgcmVmZXJlbmNlcworICAgICAgICBwID0gcHJveHkoc2VsZi5mKQorICAgICAgICBwLndyaXRlKCd0ZXN0c3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCBwLnRlbGwoKSkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSZWZlcmVuY2VFcnJvciwgZ2V0YXR0ciwgcCwgJ3RlbGwnKQorCisgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBleHBlY3RlZCBhdHRyaWJ1dGVzIGV4aXN0CisgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc29mdHNwYWNlID0gZi5zb2Z0c3BhY2UKKyAgICAgICAgZi5uYW1lICAgICAjIG1lcmVseSBzaG91bGRuJ3QgYmxvdyB1cAorICAgICAgICBmLm1vZGUgICAgICMgZGl0dG8KKyAgICAgICAgZi5jbG9zZWQgICAjIGRpdHRvCisKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgIyB2ZXJpZnkgc29mdHNwYWNlIGlzIHdyaXRhYmxlCisgICAgICAgICAgICBmLnNvZnRzcGFjZSA9IHNvZnRzcGFjZSAgICAjIG1lcmVseSBzaG91bGRuJ3QgYmxvdyB1cAorCisgICAgICAgICMgdmVyaWZ5IHRoZSBvdGhlcnMgYXJlbid0CisgICAgICAgIGZvciBhdHRyIGluICduYW1lJywgJ21vZGUnLCAnY2xvc2VkJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKSwgc2V0YXR0ciwgZiwgYXR0ciwgJ29vcHMnKQorCisgICAgZGVmIHRlc3RSZWFkaW50byhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgcmVhZGludG8KKyAgICAgICAgc2VsZi5mLndyaXRlKCcxMicpCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIGEgPSBhcnJheSgnYycsICd4JyoxMCkKKyAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sICdyYicpCisgICAgICAgIG4gPSBzZWxmLmYucmVhZGludG8oYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTInLCBhLnRvc3RyaW5nKClbOm5dKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzVXNlckxpc3Qoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBpbnN0YW5jZSBzZXF1ZW5jZQorICAgICAgICBsID0gVXNlckxpc3QoWycxJywgJzInXSkKKyAgICAgICAgc2VsZi5mLndyaXRlbGluZXMobCkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sICdyYicpCisgICAgICAgIGJ1ZiA9IHNlbGYuZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsICcxMicpCisKKyAgICBkZWYgdGVzdFdyaXRlbGluZXNJbnRlZ2VycyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd3JpdGVsaW5lcyB3aXRoIGludGVnZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIFsxLCAyLCAzXSkKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc0ludGVnZXJzVXNlckxpc3Qoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBpbnRlZ2VycyBpbiBVc2VyTGlzdAorICAgICAgICBsID0gVXNlckxpc3QoWzEsMiwzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgbCkKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc05vblN0cmluZyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd3JpdGVsaW5lcyB3aXRoIG5vbi1zdHJpbmcgb2JqZWN0CisgICAgICAgIGNsYXNzIE5vblN0cmluZzoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9uU3RyaW5nKCksIE5vblN0cmluZygpXSkKKworICAgIGRlZiB0ZXN0UmVwcihzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgcmVwciB3b3JrcworICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihzZWxmLmYpLnN0YXJ0c3dpdGgoIjxvcGVuIGZpbGUgJyIgKyBURVNURk4pKQorICAgICAgICAjIHNlZSBpc3N1ZSAjMTQxNjEKKyAgICAgICAgIyBXaW5kb3dzIGRvZXNuJ3QgbGlrZSBcclxuXHQiIGluIHRoZSBmaWxlIG5hbWUsIGJ1dCAnIGlzIG9rCisgICAgICAgIGZuYW1lID0gJ3h4XHJ4eFxueHhcJ3h4Inh4JyBpZiBzeXMucGxhdGZvcm0gIT0gIndpbjMyIiBlbHNlICJ4eCd4eCIKKyAgICAgICAgd2l0aCBvcGVuKGZuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBmbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGYpLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAgICAgICAgICI8b3BlbiBmaWxlICVyLCBtb2RlICd3JyBhdCIgJSBmbmFtZSkpCisKKyAgICBkZWYgdGVzdEVycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sICdyYicpCisgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm5hbWUsIFRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmLmlzYXR0eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi5yZWFkaW50bywgIiIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCisKKyAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CisgICAgICAgIG1ldGhvZHMgPSBbJ2ZpbGVubycsICdmbHVzaCcsICdpc2F0dHknLCAnbmV4dCcsICdyZWFkJywgJ3JlYWRpbnRvJywKKyAgICAgICAgICAgICAgICAgICAncmVhZGxpbmUnLCAncmVhZGxpbmVzJywgJ3NlZWsnLCAndGVsbCcsICd0cnVuY2F0ZScsCisgICAgICAgICAgICAgICAgICAgJ3dyaXRlJywgJ19faXRlcl9fJ10KKyAgICAgICAgZGVwcmVjYXRlZF9tZXRob2RzID0gWyd4cmVhZGxpbmVzJ10KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2F0aGVvcycpOgorICAgICAgICAgICAgbWV0aG9kcy5yZW1vdmUoJ3RydW5jYXRlJykKKworICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQorICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZi5jbG9zZWQpCisKKyAgICAgICAgZm9yIG1ldGhvZG5hbWUgaW4gbWV0aG9kczoKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZi5mLCBtZXRob2RuYW1lKQorICAgICAgICAgICAgIyBzaG91bGQgcmFpc2Ugb24gY2xvc2VkIGZpbGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ldGhvZCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgZm9yIG1ldGhvZG5hbWUgaW4gZGVwcmVjYXRlZF9tZXRob2RzOgorICAgICAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZi5mLCBtZXRob2RuYW1lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ldGhvZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIFtdKQorCisgICAgICAgICMgZmlsZSBpcyBjbG9zZWQsIF9fZXhpdF9fIHNob3VsZG4ndCBkbyBhbnl0aGluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKSwgTm9uZSkKKyAgICAgICAgIyBpdCBtdXN0IGFsc28gcmV0dXJuIE5vbmUgaWYgYW4gZXhjZXB0aW9uIHdhcyBnaXZlbgorICAgICAgICB0cnk6CisgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYuX19leGl0X18oKnN5cy5leGNfaW5mbygpKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0UmVhZFdoZW5Xcml0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLmYucmVhZCkKKworICAgIGRlZiB0ZXN0TmFzdHlXcml0ZWxpbmVzR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBkZWYgbmFzdHkoKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIGlmIGkgPT0gMzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgICAgICAgICB5aWVsZCBzdHIoaSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIG5hc3R5KCkpCisKKyAgICBkZWYgdGVzdElzc3VlNTY3NyhzZWxmKToKKyAgICAgICAgIyBSZW1hcms6IERvIG5vdCBwZXJmb3JtIG1vcmUgdGhhbiBvbmUgdGVzdCBwZXIgb3BlbiBmaWxlLAorICAgICAgICAjIHNpbmNlIHRoYXQgZG9lcyBOT1QgY2F0Y2ggdGhlIHJlYWRsaW5lIGVycm9yIG9uIFdpbmRvd3MuCisgICAgICAgIGRhdGEgPSAneHh4JworICAgICAgICBmb3IgbW9kZSBpbiBbJ3cnLCAnd2InLCAnYScsICdhYiddOgorICAgICAgICAgICAgZm9yIGF0dHIgaW4gWydyZWFkJywgJ3JlYWRsaW5lJywgJ3JlYWRsaW5lcyddOgorICAgICAgICAgICAgICAgIHNlbGYuZiA9IG9wZW4oVEVTVEZOLCBtb2RlKQorICAgICAgICAgICAgICAgIHNlbGYuZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGdldGF0dHIoc2VsZi5mLCBhdHRyKSkKKyAgICAgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmYgPSBvcGVuKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgIHNlbGYuZi53cml0ZShkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgbGFtYmRhOiBbbGluZSBmb3IgbGluZSBpbiBzZWxmLmZdKQorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sIG1vZGUpCisgICAgICAgICAgICBzZWxmLmYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYuZi5yZWFkaW50bywgYnl0ZWFycmF5KGxlbihkYXRhKSkpCisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorCisgICAgICAgIGZvciBtb2RlIGluIFsncicsICdyYicsICdVJywgJ1ViJywgJ1VyJywgJ3JVJywgJ3JiVScsICdyVWInXToKKyAgICAgICAgICAgIHNlbGYuZiA9IG9wZW4oVEVTVEZOLCBtb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc2VsZi5mLndyaXRlLCBkYXRhKQorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sIG1vZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgW2RhdGEsIGRhdGFdKQorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sIG1vZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzZWxmLmYudHJ1bmNhdGUpCisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorCitjbGFzcyBPdGhlckZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdE9wZW5EaXIoc2VsZik6CisgICAgICAgIHRoaXNfZGlyID0gb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIKKyAgICAgICAgZm9yIG1vZGUgaW4gKE5vbmUsICJ3Iik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgbW9kZToKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4odGhpc19kaXIsIG1vZGUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4odGhpc19kaXIpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5maWxlbmFtZSwgdGhpc19kaXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgib3BlbmluZyBhIGRpcmVjdG9yeSBkaWRuJ3QgcmFpc2UgYW4gSU9FcnJvciIpCisKKyAgICBkZWYgdGVzdE1vZGVTdHJpbmdzKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGludmFsaWQgbW9kZSBzdHJpbmdzCisgICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCclciBpcyBhbiBpbnZhbGlkIGZpbGUgbW9kZScgJSBtb2RlKQorCisgICAgICAgICMgU29tZSBpbnZhbGlkIG1vZGVzIGZhaWwgb24gV2luZG93cywgYnV0IHBhc3Mgb24gVW5peAorICAgICAgICAjIElzc3VlMzk2NTogYXZvaWQgYSBjcmFzaCBvbiBXaW5kb3dzIHdoZW4gZmlsZW5hbWUgaXMgdW5pY29kZQorICAgICAgICBmb3IgbmFtZSBpbiAoVEVTVEZOLCB1bmljb2RlKFRFU1RGTiksIHVuaWNvZGUoVEVTVEZOICsgJ1x0JykpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKG5hbWUsICJyciIpCisgICAgICAgICAgICBleGNlcHQgKElPRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFN0ZGluKHNlbGYpOgorICAgICAgICAjIFRoaXMgY2F1c2VzIHRoZSBpbnRlcnByZXRlciB0byBleGl0IG9uIE9TRjEgdjUuMS4KKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdvc2YxVjUnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc3lzLnN0ZGluLnNlZWssIC0xKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAgICAgICAgICcgIFNraXBwaW5nIHN5cy5zdGRpbi5zZWVrKC0xKSwgaXQgbWF5IGNyYXNoIHRoZSBpbnRlcnByZXRlci4nCisgICAgICAgICAgICAgICAgJyBUZXN0IG1hbnVhbGx5LicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHN5cy5zdGRpbi50cnVuY2F0ZSkKKworICAgIGRlZiB0ZXN0VW5pY29kZU9wZW4oc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHJlcHIgd29ya3MgZm9yIHVuaWNvZGUgdG9vCisgICAgICAgIGYgPSBvcGVuKHVuaWNvZGUoVEVTVEZOKSwgInciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihmKS5zdGFydHN3aXRoKCI8b3BlbiBmaWxlIHUnIiArIFRFU1RGTikpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIHRlc3RCYWRNb2RlQXJndW1lbnQoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHRoYXQgd2UgZ2V0IGEgc2Vuc2libGUgZXJyb3IgbWVzc2FnZSBmb3IgYmFkIG1vZGUgYXJndW1lbnQKKyAgICAgICAgYmFkX21vZGUgPSAicXdlcnR5IgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sIGJhZF9tb2RlKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvciwgbXNnOgorICAgICAgICAgICAgaWYgbXNnLmFyZ3NbMF0gIT0gMDoKKyAgICAgICAgICAgICAgICBzID0gc3RyKG1zZykKKyAgICAgICAgICAgICAgICBpZiBURVNURk4gaW4gcyBvciBiYWRfbW9kZSBub3QgaW4gczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJiYWQgZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBtb2RlOiAlcyIgJSBzKQorICAgICAgICAgICAgIyBpZiBtc2cuYXJnc1swXSA9PSAwLCB3ZSdyZSBwcm9iYWJseSBvbiBXaW5kb3dzIHdoZXJlIHRoZXJlIG1heQorICAgICAgICAgICAgIyBiZSBubyBvYnZpb3VzIHdheSB0byBkaXNjb3ZlciB3aHkgb3BlbigpIGZhaWxlZC4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBlcnJvciBmb3IgaW52YWxpZCBtb2RlOiAlcyIgJSBiYWRfbW9kZSkKKworICAgIGRlZiB0ZXN0U2V0QnVmZmVyU2l6ZShzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGJ1ZmZlciBzaXplIGRvZXNuJ3QgY2F1c2UKKyAgICAgICAgIyBtaXNiZWhhdmlvdXIgZXNwZWNpYWxseSB3aXRoIHJlcGVhdGVkIGNsb3NlKCkgY2FsbHMKKyAgICAgICAgZm9yIHMgaW4gKC0xLCAwLCAxLCA1MTIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3cnLCBzKQorICAgICAgICAgICAgICAgIGYud3JpdGUoc3RyKHMpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3InLCBzKQorICAgICAgICAgICAgICAgIGQgPSBpbnQoZi5yZWFkKCkpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnZXJyb3Igc2V0dGluZyBidWZmZXIgc2l6ZSAlZDogJXMnICUgKHMsIHN0cihtc2cpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgcykKKworICAgIGRlZiB0ZXN0VHJ1bmNhdGVPbldpbmRvd3Moc2VsZik6CisgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICAgICAgZGVmIGJ1ZzgwMTYzMSgpOgorICAgICAgICAgICAgIyBTRiBidWcgPGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi84MDE2MzE+CisgICAgICAgICAgICAjICJmaWxlLnRydW5jYXRlIGZhdWx0IG9uIHdpbmRvd3MiCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICd3YicpCisgICAgICAgICAgICBmLndyaXRlKCcxMjM0NTY3ODkwMScpICAgIyAxMSBieXRlcworICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwncmIrJykKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoNSkKKyAgICAgICAgICAgIGlmIGRhdGEgIT0gJzEyMzQ1JzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlJlYWQgb24gZmlsZSBvcGVuZWQgZm9yIHVwZGF0ZSBmYWlsZWQgJXIiICUgZGF0YSkKKyAgICAgICAgICAgIGlmIGYudGVsbCgpICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHBvcyBhZnRlciByZWFkIHdyb25nICVkIiAlIGYudGVsbCgpKQorCisgICAgICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgICAgIGlmIGYudGVsbCgpICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHBvcyBhZnRlciBmdHJ1bmNhdGUgd3JvbmcgJWQiICUgZi50ZWxsKCkpCisKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2l6ZSA9IG9zLnBhdGguZ2V0c2l6ZShURVNURk4pCisgICAgICAgICAgICBpZiBzaXplICE9IDU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlIHNpemUgYWZ0ZXIgZnRydW5jYXRlIHdyb25nICVkIiAlIHNpemUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnVnODAxNjMxKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdEl0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSBjb21wbGV4IGludGVyYWN0aW9uIHdoZW4gbWl4aW5nIGZpbGUtaXRlcmF0aW9uIGFuZCB0aGUKKyAgICAgICAgIyB2YXJpb3VzIHJlYWQqIG1ldGhvZHMuIE9zdGVuc2libHksIHRoZSBtaXh0dXJlIGNvdWxkIGp1c3QgYmUgdGVzdGVkCisgICAgICAgICMgdG8gd29yayB3aGVuIGl0IHNob3VsZCB3b3JrIGFjY29yZGluZyB0byB0aGUgUHl0aG9uIGxhbmd1YWdlLAorICAgICAgICAjIGluc3RlYWQgb2YgZmFpbCB3aGVuIGl0IHNob3VsZCBmYWlsIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBDUHl0aG9uCisgICAgICAgICMgaW1wbGVtZW50YXRpb24uICBQZW9wbGUgZG9uJ3QgYWx3YXlzIHByb2dyYW0gUHl0aG9uIHRoZSB3YXkgdGhleQorICAgICAgICAjIHNob3VsZCwgdGhvdWdoLCBhbmQgdGhlIGltcGxlbWVuYXRpb24gbWlnaHQgY2hhbmdlIGluIHN1YnRsZSB3YXlzLAorICAgICAgICAjIHNvIHdlIGV4cGxpY2l0bHkgdGVzdCBmb3IgZXJyb3JzLCB0b287IHRoZSB0ZXN0IHdpbGwganVzdCBoYXZlIHRvCisgICAgICAgICMgYmUgdXBkYXRlZCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzLgorICAgICAgICBkYXRhb2Zmc2V0ID0gMTYzODQKKyAgICAgICAgZmlsbGVyID0gImhhbVxuIgorICAgICAgICBhc3NlcnQgbm90IGRhdGFvZmZzZXQgJSBsZW4oZmlsbGVyKSwgXAorICAgICAgICAgICAgImRhdGFvZmZzZXQgbXVzdCBiZSBtdWx0aXBsZSBvZiBsZW4oZmlsbGVyKSIKKyAgICAgICAgbmNodW5rcyA9IGRhdGFvZmZzZXQgLy8gbGVuKGZpbGxlcikKKyAgICAgICAgdGVzdGxpbmVzID0gWworICAgICAgICAgICAgInNwYW0sIHNwYW0gYW5kIGVnZ3NcbiIsCisgICAgICAgICAgICAiZWdncywgc3BhbSwgaGFtIGFuZCBzcGFtXG4iLAorICAgICAgICAgICAgInNhdXNzYWdlcywgc3BhbSwgc3BhbSBhbmQgZWdnc1xuIiwKKyAgICAgICAgICAgICJzcGFtLCBoYW0sIHNwYW0gYW5kIGVnZ3NcbiIsCisgICAgICAgICAgICAic3BhbSwgc3BhbSwgc3BhbSwgc3BhbSwgc3BhbSwgaGFtLCBzcGFtXG4iLAorICAgICAgICAgICAgIndvbmRlcmZ1bCBzcGFhYWFhYW0uXG4iCisgICAgICAgIF0KKyAgICAgICAgbWV0aG9kcyA9IFsoInJlYWRsaW5lIiwgKCkpLCAoInJlYWQiLCAoKSksICgicmVhZGxpbmVzIiwgKCkpLAorICAgICAgICAgICAgICAgICAgICgicmVhZGludG8iLCAoYXJyYXkoImMiLCAiICIqMTAwKSwpKV0KKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFByZXBhcmUgdGhlIHRlc3RmaWxlCisgICAgICAgICAgICBiYWcgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICAgICAgYmFnLndyaXRlKGZpbGxlciAqIG5jaHVua3MpCisgICAgICAgICAgICBiYWcud3JpdGVsaW5lcyh0ZXN0bGluZXMpCisgICAgICAgICAgICBiYWcuY2xvc2UoKQorICAgICAgICAgICAgIyBUZXN0IGZvciBhcHByb3ByaWF0ZSBlcnJvcnMgbWl4aW5nIHJlYWQqIGFuZCBpdGVyYXRpb24KKyAgICAgICAgICAgIGZvciBtZXRob2RuYW1lLCBhcmdzIGluIG1ldGhvZHM6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOKQorICAgICAgICAgICAgICAgIGlmIGYubmV4dCgpICE9IGZpbGxlcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsLCAiQnJva2VuIHRlc3RmaWxlIgorICAgICAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKGYsIG1ldGhvZG5hbWUpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtZXRoKCphcmdzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyVyIGFmdGVyIG5leHQoKSBkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXRob2RuYW1lLCBhcmdzKSkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgIyBUZXN0IHRvIHNlZSBpZiBoYXJtbGVzcyAoYnkgYWNjaWRlbnQpIG1peGluZyBvZiByZWFkKiBhbmQKKyAgICAgICAgICAgICMgaXRlcmF0aW9uIHN0aWxsIHdvcmtzLiBUaGlzIGRlcGVuZHMgb24gdGhlIHNpemUgb2YgdGhlIGludGVybmFsCisgICAgICAgICAgICAjIGl0ZXJhdGlvbiBidWZmZXIgKGN1cnJlbnRseSA4MTkyLCkgYnV0IHdlIGNhbiB0ZXN0IGl0IGluIGEKKyAgICAgICAgICAgICMgZmxleGlibGUgbWFubmVyLiAgRWFjaCBsaW5lIGluIHRoZSBiYWcgbycgaGFtIGlzIDQgYnl0ZXMKKyAgICAgICAgICAgICMgKCJoIiwgImEiLCAibSIsICJcbiIpLCBzbyA0MDk2IGxpbmVzIG9mIHRoYXQgc2hvdWxkIGdldCB1cworICAgICAgICAgICAgIyBleGFjdGx5IG9uIHRoZSBidWZmZXIgYm91bmRhcnkgZm9yIGFueSBwb3dlci1vZi0yIGJ1ZmZlcnNpemUKKyAgICAgICAgICAgICMgYmV0d2VlbiA0IGFuZCAxNjM4NCAoaW5jbHVzaXZlKS4KKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTikKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG5jaHVua3MpOgorICAgICAgICAgICAgICAgIGYubmV4dCgpCisgICAgICAgICAgICB0ZXN0bGluZSA9IHRlc3RsaW5lcy5wb3AoMCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsaW5lID0gZi5yZWFkbGluZSgpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRsaW5lKCkgYWZ0ZXIgbmV4dCgpIHdpdGggc3VwcG9zZWRseSBlbXB0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRpb24tYnVmZmVyIGZhaWxlZCBhbnl3YXkiKQorICAgICAgICAgICAgaWYgbGluZSAhPSB0ZXN0bGluZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRsaW5lKCkgYWZ0ZXIgbmV4dCgpIHdpdGggZW1wdHkgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZC4gR290ICVyLCBleHBlY3RlZCAlciIgJSAobGluZSwgdGVzdGxpbmUpKQorICAgICAgICAgICAgdGVzdGxpbmUgPSB0ZXN0bGluZXMucG9wKDApCisgICAgICAgICAgICBidWYgPSBhcnJheSgiYyIsICJceDAwIiAqIGxlbih0ZXN0bGluZSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi5yZWFkaW50byhidWYpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlYWRpbnRvKCkgYWZ0ZXIgbmV4dCgpIHdpdGggc3VwcG9zZWRseSBlbXB0eSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVyYXRpb24tYnVmZmVyIGZhaWxlZCBhbnl3YXkiKQorICAgICAgICAgICAgbGluZSA9IGJ1Zi50b3N0cmluZygpCisgICAgICAgICAgICBpZiBsaW5lICE9IHRlc3RsaW5lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZGludG8oKSBhZnRlciBuZXh0KCkgd2l0aCBlbXB0eSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkLiBHb3QgJXIsIGV4cGVjdGVkICVyIiAlIChsaW5lLCB0ZXN0bGluZSkpCisKKyAgICAgICAgICAgIHRlc3RsaW5lID0gdGVzdGxpbmVzLnBvcCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmUgPSBmLnJlYWQobGVuKHRlc3RsaW5lKSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZCgpIGFmdGVyIG5leHQoKSB3aXRoIHN1cHBvc2VkbHkgZW1wdHkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlcmF0aW9uLWJ1ZmZlciBmYWlsZWQgYW55d2F5IikKKyAgICAgICAgICAgIGlmIGxpbmUgIT0gdGVzdGxpbmU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkKCkgYWZ0ZXIgbmV4dCgpIHdpdGggZW1wdHkgYnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZC4gR290ICVyLCBleHBlY3RlZCAlciIgJSAobGluZSwgdGVzdGxpbmUpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGxpbmVzID0gZi5yZWFkbGluZXMoKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkbGluZXMoKSBhZnRlciBuZXh0KCkgd2l0aCBzdXBwb3NlZGx5IGVtcHR5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZXJhdGlvbi1idWZmZXIgZmFpbGVkIGFueXdheSIpCisgICAgICAgICAgICBpZiBsaW5lcyAhPSB0ZXN0bGluZXM6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWFkbGluZXMoKSBhZnRlciBuZXh0KCkgd2l0aCBlbXB0eSBidWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkLiBHb3QgJXIsIGV4cGVjdGVkICVyIiAlIChsaW5lLCB0ZXN0bGluZSkpCisgICAgICAgICAgICAjIFJlYWRpbmcgYWZ0ZXIgaXRlcmF0aW9uIGhpdCBFT0Ygc2hvdWxkbid0IGh1cnQgZWl0aGVyCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gZjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZi5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgICAgIGYucmVhZGludG8oYnVmKQorICAgICAgICAgICAgICAgICAgICBmLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBmLnJlYWRsaW5lcygpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicmVhZCogZmFpbGVkIGFmdGVyIG5leHQoKSBjb25zdW1lZCBmaWxlIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorCitjbGFzcyBGaWxlU3ViY2xhc3NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEV4aXQoc2VsZik6CisgICAgICAgICMgdGVzdCB0aGF0IGV4aXRpbmcgd2l0aCBjb250ZXh0IGNhbGxzIHN1YmNsYXNzJyBjbG9zZQorICAgICAgICBjbGFzcyBDKGZpbGUpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLnN1YmNsYXNzX2Nsb3NlZCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZmlsZS5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnN1YmNsYXNzX2Nsb3NlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBmaWxlLmNsb3NlKHNlbGYpCisKKyAgICAgICAgd2l0aCBDKFRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5zdWJjbGFzc19jbG9zZWQpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEZpbGVUaHJlYWRpbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGVzZSB0ZXN0cyBjaGVjayB0aGUgYWJpbGl0eSB0byBjYWxsIHZhcmlvdXMgbWV0aG9kcyBvZiBmaWxlIG9iamVjdHMKKyAgICAjIChpbmNsdWRpbmcgY2xvc2UoKSkgY29uY3VycmVudGx5IHdpdGhvdXQgY3Jhc2hpbmcgdGhlIFB5dGhvbiBpbnRlcnByZXRlci4KKyAgICAjIFNlZSAjODE1NjQ2LCAjNTk1NjAxCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgc2VsZi5mID0gTm9uZQorICAgICAgICBzZWxmLmZpbGVuYW1lID0gVEVTVEZOCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAidyIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJcbiIuam9pbigiMDEyMzQ1Njc4OSIpKQorICAgICAgICBzZWxmLl9jb3VudF9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBzZWxmLmNsb3NlX2NvdW50ID0gMAorICAgICAgICBzZWxmLmNsb3NlX3N1Y2Nlc3NfY291bnQgPSAwCisgICAgICAgIHNlbGYudXNlX2J1ZmZlcmluZyA9IEZhbHNlCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IChFbnZpcm9ubWVudEVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGVuYW1lKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCpzZWxmLl90aHJlYWRzKQorCisgICAgZGVmIF9jcmVhdGVfZmlsZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi51c2VfYnVmZmVyaW5nOgorICAgICAgICAgICAgc2VsZi5mID0gb3BlbihzZWxmLmZpbGVuYW1lLCAidysiLCBidWZmZXJpbmc9MTAyNCoxNikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZiA9IG9wZW4oc2VsZi5maWxlbmFtZSwgIncrIikKKworICAgIGRlZiBfY2xvc2VfZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLl9jb3VudF9sb2NrOgorICAgICAgICAgICAgc2VsZi5jbG9zZV9jb3VudCArPSAxCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIHdpdGggc2VsZi5fY291bnRfbG9jazoKKyAgICAgICAgICAgIHNlbGYuY2xvc2Vfc3VjY2Vzc19jb3VudCArPSAxCisKKyAgICBkZWYgX2Nsb3NlX2FuZF9yZW9wZW5fZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5fY2xvc2VfZmlsZSgpCisgICAgICAgICMgaWYgY2xvc2UgcmFpc2VzIGFuIGV4Y2VwdGlvbiB0aGF0cyBmaW5lLCBzZWxmLmYgcmVtYWlucyB2YWxpZCBzbworICAgICAgICAjIHdlIGRvbid0IG5lZWQgdG8gcmVvcGVuLgorICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSgpCisKKyAgICBkZWYgX3J1bl93b3JrZXJzKHNlbGYsIGZ1bmMsIG5iX3dvcmtlcnMsIGR1cmF0aW9uPTAuMik6CisgICAgICAgIHdpdGggc2VsZi5fY291bnRfbG9jazoKKyAgICAgICAgICAgIHNlbGYuY2xvc2VfY291bnQgPSAwCisgICAgICAgICAgICBzZWxmLmNsb3NlX3N1Y2Nlc3NfY291bnQgPSAwCisgICAgICAgIHNlbGYuZG9fY29udGludWUgPSBUcnVlCisgICAgICAgIHRocmVhZHMgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuYl93b3JrZXJzKToKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZnVuYykKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorICAgICAgICAgICAgZm9yIF8gaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcChkdXJhdGlvbi8xMDApCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLl9jb3VudF9sb2NrOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmNsb3NlX2NvdW50LXNlbGYuY2xvc2Vfc3VjY2Vzc19jb3VudCA+IG5iX3dvcmtlcnMrMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdRJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKGR1cmF0aW9uKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5kb19jb250aW51ZSA9IEZhbHNlCisgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgIHQuam9pbigpCisKKyAgICBkZWYgX3Rlc3RfY2xvc2Vfb3Blbl9pbyhzZWxmLCBpb19mdW5jLCBuYl93b3JrZXJzPTUpOgorICAgICAgICBkZWYgd29ya2VyKCk6CisgICAgICAgICAgICBzZWxmLl9jcmVhdGVfZmlsZSgpCisgICAgICAgICAgICBmdW5jcyA9IGl0ZXJ0b29scy5jeWNsZSgoCisgICAgICAgICAgICAgICAgbGFtYmRhOiBpb19mdW5jKCksCisgICAgICAgICAgICAgICAgbGFtYmRhOiBzZWxmLl9jbG9zZV9hbmRfcmVvcGVuX2ZpbGUoKSwKKyAgICAgICAgICAgICkpCisgICAgICAgICAgICBmb3IgZiBpbiBmdW5jczoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5kb19jb250aW51ZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGYoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fcnVuX3dvcmtlcnMod29ya2VyLCBuYl93b3JrZXJzKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICMgVXNlZnVsIHZlcmJvc2Ugc3RhdGlzdGljcyB3aGVuIHR1bmluZyB0aGlzIHRlc3QgdG8gdGFrZQorICAgICAgICAgICAgIyBsZXNzIHRpbWUgdG8gcnVuIGJ1dCBzdGlsbCBlbnN1cmluZyB0aGF0IGl0cyBzdGlsbCB1c2VmdWwuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIHRoZSBwZXJjZW50IG9mIGNsb3NlIGNhbGxzIHRoYXQgcmFpc2VkIGFuIGVycm9yCisgICAgICAgICAgICBwZXJjZW50ID0gMTAwLiAtIDEwMC4qc2VsZi5jbG9zZV9zdWNjZXNzX2NvdW50L3NlbGYuY2xvc2VfY291bnQKKyAgICAgICAgICAgIHByaW50IHNlbGYuY2xvc2VfY291bnQsICgnJS40ZiAnICUgcGVyY2VudCksCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5fZmx1c2goc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYuZmx1c2goKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5faXRlcihzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIGxpc3QoaXRlcihzZWxmLmYpKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5faXNhdHR5KHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgc2VsZi5mLmlzYXR0eSgpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9wcmludChzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuZiwgJycKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3ByaW50X2J1ZmZlcmVkKHNlbGYpOgorICAgICAgICBzZWxmLnVzZV9idWZmZXJpbmcgPSBUcnVlCisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLmYsICcnCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9yZWFkKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgc2VsZi5mLnJlYWQoMCkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3JlYWRpbnRvKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgYSA9IGFycmF5KCdjJywgJ3h4eHh4JykKKyAgICAgICAgICAgIHNlbGYuZi5yZWFkaW50byhhKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5fcmVhZGxpbmUoc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYucmVhZGxpbmUoKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlX29wZW5faW8oaW9fZnVuYykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29wZW5fcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgc2VsZi5mLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl9zZWVrKHNlbGYpOgorICAgICAgICBkZWYgaW9fZnVuYygpOgorICAgICAgICAgICAgc2VsZi5mLnNlZWsoMCwgMCkKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3RlbGwoc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYudGVsbCgpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl90cnVuY2F0ZShzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHNlbGYuZi50cnVuY2F0ZSgpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2Vfb3Blbl9pbyhpb19mdW5jKQorCisgICAgZGVmIHRlc3RfY2xvc2Vfb3Blbl93cml0ZShzZWxmKToKKyAgICAgICAgZGVmIGlvX2Z1bmMoKToKKyAgICAgICAgICAgIHNlbGYuZi53cml0ZSgnJykKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9vcGVuX3dyaXRlbGluZXMoc2VsZik6CisgICAgICAgIGRlZiBpb19mdW5jKCk6CisgICAgICAgICAgICBzZWxmLmYud3JpdGVsaW5lcygnJykKKyAgICAgICAgc2VsZi5fdGVzdF9jbG9zZV9vcGVuX2lvKGlvX2Z1bmMpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAncG9zaXgnLCAndGVzdCByZXF1aXJlcyBhIHBvc2l4IHN5c3RlbS4nKQorY2xhc3MgVGVzdEZpbGVTaWduYWxFSU5UUih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF90ZXN0X3JlYWRpbmcoc2VsZiwgZGF0YV90b193cml0ZSwgcmVhZF9hbmRfdmVyaWZ5X2NvZGUsIG1ldGhvZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz1GYWxzZSk6CisgICAgICAgICIiIkdlbmVyaWMgYnVmZmVyZWQgcmVhZCBtZXRob2QgdGVzdCBoYXJuZXNzIHRvIHZlcmlmeSBFSU5UUiBiZWhhdmlvci4KKworICAgICAgICBBbHNvIHZhbGlkYXRlcyB0aGF0IFB5dGhvbiBzaWduYWwgaGFuZGxlcnMgYXJlIHJ1biBkdXJpbmcgdGhlIHJlYWQuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU6IFN0cmluZyB0byB3cml0ZSB0byB0aGUgY2hpbGQgcHJvY2VzcyBmb3IgcmVhZGluZworICAgICAgICAgICAgICAgIGJlZm9yZSBzZW5kaW5nIGl0IGEgc2lnbmFsLCBjb25maXJtaW5nIHRoZSBzaWduYWwgd2FzIGhhbmRsZWQsCisgICAgICAgICAgICAgICAgd3JpdGluZyBhIGZpbmFsIG5ld2xpbmUgY2hhciBhbmQgY2xvc2luZyB0aGUgaW5maWxlIHBpcGUuCisgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZTogU2luZ2xlICJsaW5lIiBvZiBjb2RlIHRvIHJlYWQgZnJvbSBhIGZpbGUKKyAgICAgICAgICAgICAgICBvYmplY3QgbmFtZWQgJ2luZmlsZScgYW5kIHZhbGlkYXRlIHRoZSByZXN1bHQuICBUaGlzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICBleGVjdXRlZCBhcyBwYXJ0IG9mIGEgcHl0aG9uIHN1YnByb2Nlc3MgZmVkIGRhdGFfdG9fd3JpdGUuCisgICAgICAgICAgICBtZXRob2RfbmFtZTogVGhlIG5hbWUgb2YgdGhlIHJlYWQgbWV0aG9kIGJlaW5nIHRlc3RlZCwgZm9yIHVzZSBpbgorICAgICAgICAgICAgICAgIGFuIGVycm9yIG1lc3NhZ2Ugb24gZmFpbHVyZS4KKyAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lczogSWYgVHJ1ZSwgaW5maWxlIHdpbGwgYmUgb3BlbmVkIGluIHVuaXZlcnNhbAorICAgICAgICAgICAgICAgIG5ld2xpbmUgbW9kZSBpbiB0aGUgY2hpbGQgcHJvY2Vzcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHVuaXZlcnNhbF9uZXdsaW5lczoKKyAgICAgICAgICAgICMgVGVzdCB0aGUgXHJcbiAtPiBcbiBjb252ZXJzaW9uIHdoaWxlIHdlJ3JlIGF0IGl0LgorICAgICAgICAgICAgZGF0YV90b193cml0ZSA9IGRhdGFfdG9fd3JpdGUucmVwbGFjZSgnXG4nLCAnXHJcbicpCisgICAgICAgICAgICBpbmZpbGVfc2V0dXBfY29kZSA9ICdpbmZpbGUgPSBvcy5mZG9wZW4oc3lzLnN0ZGluLmZpbGVubygpLCAiclUiKScKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGluZmlsZV9zZXR1cF9jb2RlID0gJ2luZmlsZSA9IHN5cy5zdGRpbicKKyAgICAgICAgIyBUb3RhbCBwaXBlIElPIGluIHRoaXMgZnVuY3Rpb24gaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHBvc2l4IE9TCisgICAgICAgICMgcGlwZSBidWZmZXIgc2l6ZSBvZiA1MTIgYnl0ZXMuICBObyB3cml0ZXIgc2hvdWxkIGJsb2NrLgorICAgICAgICBhc3NlcnQgbGVuKGRhdGFfdG9fd3JpdGUpIDwgNTEyLCAnZGF0YV90b193cml0ZSBtdXN0IGZpdCBpbiBwaXBlIGJ1Zi4nCisKKyAgICAgICAgY2hpbGRfY29kZSA9ICgKKyAgICAgICAgICAgICAnaW1wb3J0IG9zLCBzaWduYWwsIHN5cyA7JworICAgICAgICAgICAgICdzaWduYWwuc2lnbmFsKCcKKyAgICAgICAgICAgICAgICAgICAgICdzaWduYWwuU0lHSU5ULCBsYW1iZGEgcywgZjogc3lzLnN0ZGVyci53cml0ZSgiJFxcbiIpKSA7JworICAgICAgICAgICAgICsgaW5maWxlX3NldHVwX2NvZGUgKyAnIDsnICsKKyAgICAgICAgICAgICAnYXNzZXJ0IGlzaW5zdGFuY2UoaW5maWxlLCBmaWxlKSA7JworICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJHby5cXG4iKSA7JworICAgICAgICAgICAgICsgcmVhZF9hbmRfdmVyaWZ5X2NvZGUpCisgICAgICAgIHJlYWRlcl9wcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICctYycsIGNoaWxkX2NvZGVdLAorICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAjIFdhaXQgZm9yIHRoZSBzaWduYWwgaGFuZGxlciB0byBiZSBpbnN0YWxsZWQuCisgICAgICAgIGdvID0gcmVhZGVyX3Byb2Nlc3Muc3RkZXJyLnJlYWQoNCkKKyAgICAgICAgaWYgZ28gIT0gJ0dvLlxuJzoKKyAgICAgICAgICAgIHJlYWRlcl9wcm9jZXNzLmtpbGwoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdFcnJvciBmcm9tICVzIHByb2Nlc3Mgd2hpbGUgYXdhaXRpbmcgIkdvIjpcbiVzJyAlICgKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kX25hbWUsIGdvK3JlYWRlcl9wcm9jZXNzLnN0ZGVyci5yZWFkKCkpKQorICAgICAgICByZWFkZXJfcHJvY2Vzcy5zdGRpbi53cml0ZShkYXRhX3RvX3dyaXRlKQorICAgICAgICBzaWduYWxzX3NlbnQgPSAwCisgICAgICAgIHJsaXN0ID0gW10KKyAgICAgICAgIyBXZSBkb24ndCBrbm93IHdoZW4gdGhlIHJlYWRfYW5kX3ZlcmlmeV9jb2RlIGluIG91ciBjaGlsZCBpcyBhY3R1YWxseQorICAgICAgICAjIGV4ZWN1dGluZyB3aXRoaW4gdGhlIHJlYWQgc3lzdGVtIGNhbGwgd2Ugd2FudCB0byBpbnRlcnJ1cHQuICBUaGlzCisgICAgICAgICMgbG9vcCB3YWl0cyBmb3IgYSBiaXQgYmVmb3JlIHNlbmRpbmcgdGhlIGZpcnN0IHNpZ25hbCB0byBpbmNyZWFzZQorICAgICAgICAjIHRoZSBsaWtlbGlob29kIG9mIHRoYXQuICBJbXBsZW1lbnRhdGlvbnMgd2l0aG91dCBjb3JyZWN0IEVJTlRSCisgICAgICAgICMgYW5kIHNpZ25hbCBoYW5kbGluZyB1c3VhbGx5IGZhaWwgdGhpcyB0ZXN0LgorICAgICAgICB3aGlsZSBub3Qgcmxpc3Q6CisgICAgICAgICAgICBybGlzdCwgXywgXyA9IHNlbGVjdC5zZWxlY3QoW3JlYWRlcl9wcm9jZXNzLnN0ZGVycl0sICgpLCAoKSwgMC4wNSkKKyAgICAgICAgICAgIHJlYWRlcl9wcm9jZXNzLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgICAgICAjIEdpdmUgdGhlIHN1YnByb2Nlc3MgdGltZSB0byBoYW5kbGUgaXQgYmVmb3JlIHdlIGxvb3AgYXJvdW5kIGFuZAorICAgICAgICAgICAgIyBzZW5kIGFub3RoZXIgb25lLiAgT24gT1NYIHRoZSBzZWNvbmQgc2lnbmFsIGhhcHBlbmluZyBjbG9zZSB0bworICAgICAgICAgICAgIyBpbW1lZGlhdGVseSBhZnRlciB0aGUgZmlyc3Qgd2FzIGNhdXNpbmcgdGhlIHN1YnByb2Nlc3MgdG8gY3Jhc2gKKyAgICAgICAgICAgICMgdmlhIHRoZSBPUydzIGRlZmF1bHQgU0lHSU5UIGhhbmRsZXIuCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgICAgIHNpZ25hbHNfc2VudCArPSAxCisgICAgICAgICAgICBpZiBzaWduYWxzX3NlbnQgPiAyMDA6CisgICAgICAgICAgICAgICAgcmVhZGVyX3Byb2Nlc3Mua2lsbCgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJmYWlsZWQgdG8gaGFuZGxlIHNpZ25hbCBkdXJpbmcgJXMuIiAlIG1ldGhvZF9uYW1lKQorICAgICAgICAjIFRoaXMgYXNzdW1lcyBhbnl0aGluZyB1bmV4cGVjdGVkIHRoYXQgd3JpdGVzIHRvIHN0ZGVyciB3aWxsIGFsc28KKyAgICAgICAgIyB3cml0ZSBhIG5ld2xpbmUuICBUaGF0IGlzIHRydWUgb2YgdGhlIHRyYWNlYmFjayBwcmludGluZyBjb2RlLgorICAgICAgICBzaWduYWxfbGluZSA9IHJlYWRlcl9wcm9jZXNzLnN0ZGVyci5yZWFkbGluZSgpCisgICAgICAgIGlmIHNpZ25hbF9saW5lICE9ICckXG4nOgorICAgICAgICAgICAgcmVhZGVyX3Byb2Nlc3Mua2lsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ0Vycm9yIGZyb20gJXMgcHJvY2VzcyB3aGlsZSBhd2FpdGluZyBzaWduYWw6XG4lcycgJSAoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lLCBzaWduYWxfbGluZStyZWFkZXJfcHJvY2Vzcy5zdGRlcnIucmVhZCgpKSkKKyAgICAgICAgIyBXZSBhcHBlbmQgYSBuZXdsaW5lIHRvIG91ciBpbnB1dCBzbyB0aGF0IGEgcmVhZGxpbmUgY2FsbCBjYW4KKyAgICAgICAgIyBlbmQgb24gaXRzIG93biBiZWZvcmUgdGhlIEVPRiBpcyBzZWVuLgorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHJlYWRlcl9wcm9jZXNzLmNvbW11bmljYXRlKGlucHV0PSdcbicpCisgICAgICAgIGlmIHJlYWRlcl9wcm9jZXNzLnJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnJXMoKSBwcm9jZXNzIGV4aXRlZCByYz0lZC5cblNURE9VVDpcbiVzXG5TVERFUlI6XG4lcycgJSAoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lLCByZWFkZXJfcHJvY2Vzcy5yZXR1cm5jb2RlLCBzdGRvdXQsIHN0ZGVycikpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmLCB1bml2ZXJzYWxfbmV3bGluZXM9RmFsc2UpOgorICAgICAgICAiIiJmaWxlLnJlYWRsaW5lIG11c3QgaGFuZGxlIHNpZ25hbHMgYW5kIG5vdCBsb3NlIGRhdGEuIiIiCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPSdoZWxsbywgd29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT0oCisgICAgICAgICAgICAgICAgICAgICAgICAnbGluZSA9IGluZmlsZS5yZWFkbGluZSgpIDsnCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWRfbGluZSA9ICJoZWxsbywgd29ybGQhXFxuIiA7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2Fzc2VydCBsaW5lID09IGV4cGVjdGVkX2xpbmUsICgnCisgICAgICAgICAgICAgICAgICAgICAgICAnInJlYWQgJXIgZXhwZWN0ZWQgJXIiICUgKGxpbmUsIGV4cGVjdGVkX2xpbmUpKScKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIG1ldGhvZF9uYW1lPSdyZWFkbGluZScsCisgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPXVuaXZlcnNhbF9uZXdsaW5lcykKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lX3dpdGhfdW5pdmVyc2FsX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfcmVhZGxpbmUodW5pdmVyc2FsX25ld2xpbmVzPVRydWUpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZiwgdW5pdmVyc2FsX25ld2xpbmVzPUZhbHNlKToKKyAgICAgICAgIiIiZmlsZS5yZWFkbGluZXMgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9J2hlbGxvXG53b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPSgKKyAgICAgICAgICAgICAgICAgICAgICAgICdsaW5lcyA9IGluZmlsZS5yZWFkbGluZXMoKSA7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkX2xpbmVzID0gWyJoZWxsb1xcbiIsICJ3b3JsZCFcXG4iXSA7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2Fzc2VydCBsaW5lcyA9PSBleHBlY3RlZF9saW5lcywgKCcKKyAgICAgICAgICAgICAgICAgICAgICAgICcicmVhZGxpbmVzIHJldHVybmVkIHdyb25nIGRhdGEuXFxuIiAnCisgICAgICAgICAgICAgICAgICAgICAgICAnImdvdCBsaW5lcyAlclxcbmV4cGVjdGVkICAlciIgJworICAgICAgICAgICAgICAgICAgICAgICAgJyUgKGxpbmVzLCBleHBlY3RlZF9saW5lcykpJworICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgbWV0aG9kX25hbWU9J3JlYWRsaW5lcycsCisgICAgICAgICAgICAgICAgdW5pdmVyc2FsX25ld2xpbmVzPXVuaXZlcnNhbF9uZXdsaW5lcykKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lc193aXRoX3VuaXZlcnNhbF9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3JlYWRsaW5lcyh1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X3JlYWRhbGwoc2VsZik6CisgICAgICAgICIiIlVuYm91bmRlZCBmaWxlLnJlYWQoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT0naGVsbG8sIHdvcmxkIWFiY2RlZmdoaWprbG0nLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPSgKKyAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhID0gaW5maWxlLnJlYWQoKSA7JworICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkX2RhdGEgPSAiaGVsbG8sIHdvcmxkIWFiY2RlZmdoaWprbG1cXG4iOycKKyAgICAgICAgICAgICAgICAgICAgICAgICdhc3NlcnQgZGF0YSA9PSBleHBlY3RlZF9kYXRhLCAoJworICAgICAgICAgICAgICAgICAgICAgICAgJyJyZWFkICVyIGV4cGVjdGVkICVyIiAlIChkYXRhLCBleHBlY3RlZF9kYXRhKSknCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBtZXRob2RfbmFtZT0ndW5ib3VuZGVkIHJlYWQnKQorCisgICAgZGVmIHRlc3RfcmVhZGludG8oc2VsZik6CisgICAgICAgICIiImZpbGUucmVhZGludG8gbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9J2hlbGxvLCB3b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPSgKKyAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhID0gYnl0ZWFycmF5KDUwKSA7JworICAgICAgICAgICAgICAgICAgICAgICAgJ251bV9yZWFkID0gaW5maWxlLnJlYWRpbnRvKGRhdGEpIDsnCisgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWRfZGF0YSA9ICJoZWxsbywgd29ybGQhXFxuIjsnCisgICAgICAgICAgICAgICAgICAgICAgICAnYXNzZXJ0IGRhdGFbOm51bV9yZWFkXSA9PSBleHBlY3RlZF9kYXRhLCAoJworICAgICAgICAgICAgICAgICAgICAgICAgJyJyZWFkICVyIGV4cGVjdGVkICVyIiAlIChkYXRhLCBleHBlY3RlZF9kYXRhKSknCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBtZXRob2RfbmFtZT0ncmVhZGludG8nKQorCisKK2NsYXNzIFN0ZG91dFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X21vdmVfc3Rkb3V0X29uX3dyaXRlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDMyNDI6IHN5cy5zdGRvdXQgY2FuIGJlIHJlcGxhY2VkIChhbmQgZnJlZWQpIGR1cmluZyBhCisgICAgICAgICMgcHJpbnQgc3RhdGVtZW50OyBwcmV2ZW50IGEgc2VnZmF1bHQgaW4gdGhpcyBjYXNlCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorCisgICAgICAgIGNsYXNzIEZpbGU6CisgICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICAgICAgaWYgJ1xuJyBpbiBkYXRhOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gRmlsZSgpCisgICAgICAgICAgICBwcmludCAic29tZSB0ZXh0IgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisKKyAgICBkZWYgdGVzdF9kZWxfc3Rkb3V0X2JlZm9yZV9wcmludChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA0NTk3OiAncHJpbnQnIHdpdGggbm8gYXJndW1lbnQgd2Fzbid0IHJlcG9ydGluZyB3aGVuCisgICAgICAgICMgc3lzLnN0ZG91dCB3YXMgZGVsZXRlZC4KKyAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGRlbCBzeXMuc3Rkb3V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50CisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAibG9zdCBzeXMuc3Rkb3V0IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgUnVudGltZUVycm9yIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKworICAgICAgICBkZWYgZ2V0X21lc3NhZ2UoZW5jb2RpbmcsICpjb2RlKToKKyAgICAgICAgICAgIGNvZGUgPSAnXG4nLmpvaW4oY29kZSkKKyAgICAgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgICAgICBlbnZbJ1BZVEhPTklPRU5DT0RJTkcnXSA9IGVuY29kaW5nCisgICAgICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsIGNvZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgZW52PWVudikKKyAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2Nlc3MucmV0dXJuY29kZSwgMCkKKyAgICAgICAgICAgIHJldHVybiBzdGRvdXQKKworICAgICAgICBkZWYgY2hlY2tfbWVzc2FnZSh0ZXh0LCBlbmNvZGluZywgZXhwZWN0ZWQpOgorICAgICAgICAgICAgc3Rkb3V0ID0gZ2V0X21lc3NhZ2UoZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgImltcG9ydCBzeXMiLAorICAgICAgICAgICAgICAgICJzeXMuc3Rkb3V0LndyaXRlKCVyKSIgJSB0ZXh0LAorICAgICAgICAgICAgICAgICJzeXMuc3Rkb3V0LmZsdXNoKCkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsIGV4cGVjdGVkKQorCisgICAgICAgICMgdGVzdCB0aGUgZW5jb2RpbmcKKyAgICAgICAgY2hlY2tfbWVzc2FnZSh1JzE1XHUyMGFjJywgImlzby04ODU5LTE1IiwgIjE1XHhhNCIpCisgICAgICAgIGNoZWNrX21lc3NhZ2UodScxNVx1MjBhYycsICJ1dGYtOCIsICcxNVx4ZTJceDgyXHhhYycpCisgICAgICAgIGNoZWNrX21lc3NhZ2UodScxNVx1MjBhYycsICJ1dGYtMTYtbGUiLCAnMVx4MDA1XHgwMFx4YWNceDIwJykKKworICAgICAgICAjIHRlc3QgdGhlIGVycm9yIGhhbmRsZXIKKyAgICAgICAgY2hlY2tfbWVzc2FnZSh1JzE1XHUyMGFjJywgImlzby04ODU5LTE6aWdub3JlIiwgIjE1IikKKyAgICAgICAgY2hlY2tfbWVzc2FnZSh1JzE1XHUyMGFjJywgImlzby04ODU5LTE6cmVwbGFjZSIsICIxNT8iKQorICAgICAgICBjaGVja19tZXNzYWdlKHUnMTVcdTIwYWMnLCAiaXNvLTg4NTktMTpiYWNrc2xhc2hyZXBsYWNlIiwgIjE1XFx1MjBhYyIpCisKKyAgICAgICAgIyB0ZXN0IHRoZSBidWZmZXIgQVBJCisgICAgICAgIGZvciBvYmp0eXBlIGluICgnYnVmZmVyJywgJ2J5dGVhcnJheScpOgorICAgICAgICAgICAgc3Rkb3V0ID0gZ2V0X21lc3NhZ2UoJ2FzY2lpJywKKyAgICAgICAgICAgICAgICAnaW1wb3J0IHN5cycsCisgICAgICAgICAgICAgICAgcidzeXMuc3Rkb3V0LndyaXRlKCVzKCJceGU5IikpJyAlIG9ianR5cGUsCisgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgIlx4ZTkiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICAjIEhpc3RvcmljYWxseSwgdGhlc2UgdGVzdHMgaGF2ZSBiZWVuIHNsb3BweSBhYm91dCByZW1vdmluZyBURVNURk4uCisgICAgIyBTbyBnZXQgcmlkIG9mIGl0IG5vIG1hdHRlciB3aGF0LgorICAgIHRyeToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KEF1dG9GaWxlVGVzdHMsIE90aGVyRmlsZVRlc3RzLCBGaWxlU3ViY2xhc3NUZXN0cywKKyAgICAgICAgICAgIEZpbGVUaHJlYWRpbmdUZXN0cywgVGVzdEZpbGVTaWduYWxFSU5UUiwgU3Rkb3V0VGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlMmsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTY4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlMmsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGUyay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlMmsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZTdmZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlMmsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlX2VpbnRyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmZmM2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlX2VpbnRyLnB5CkBAIC0wLDAgKzEsMjM5IEBACisjIFdyaXR0ZW4gdG8gdGVzdCBpbnRlcnJ1cHRlZCBzeXN0ZW0gY2FsbHMgaW50ZXJmZXJpbmcgd2l0aCBvdXIgbWFueSBidWZmZXJlZAorIyBJTyBpbXBsZW1lbnRhdGlvbnMuICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTIyNjgKKyMKKyMgVGhpcyB0ZXN0cyB0aGUgJ19pbycgbW9kdWxlLiAgU2ltaWxhciB0ZXN0cyBmb3IgUHl0aG9uIDIueCdzIG9sZGVyCisjIGRlZmF1bHQgZmlsZSBJL08gaW1wbGVtZW50YXRpb24gZXhpc3Qgd2l0aGluIHRlc3RfZmlsZTJrLnB5LgorIworIyBJdCB3YXMgc3VnZ2VzdGVkIHRoYXQgdGhpcyBjb2RlIGNvdWxkIGJlIG1lcmdlZCBpbnRvIHRlc3RfaW8gYW5kIHRoZSB0ZXN0cworIyBtYWRlIHRvIHdvcmsgdXNpbmcgdGhlIHNhbWUgbWV0aG9kIGFzIHRoZSBleGlzdGluZyBzaWduYWwgdGVzdHMgaW4gdGVzdF9pby4KKyMgSSB3YXMgdW5hYmxlIHRvIGdldCBzaW5nbGUgcHJvY2VzcyB0ZXN0cyB1c2luZyBhbGFybSBvciBzZXRpdGltZXIgdGhhdCB3YXkKKyMgdG8gcmVwcm9kdWNlIHRoZSBFSU5UUiBwcm9ibGVtcy4gIFRoaXMgcHJvY2VzcyBiYXNlZCB0ZXN0IHN1aXRlIHJlcHJvZHVjZXMKKyMgdGhlIHByb2JsZW1zIHByaW9yIHRvIHRoZSBpc3N1ZTEyMjY4IHBhdGNoIHJlbGlhYmx5IG9uIExpbnV4IGFuZCBPU1guCisjICAtIGdyZWdvcnkucC5zbWl0aAorCitpbXBvcnQgb3MKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKKworIyBUZXN0IGltcG9ydCBhbGwgb2YgdGhlIHRoaW5ncyB3ZSdyZSBhYm91dCB0byB0cnkgdGVzdGluZyB1cCBmcm9udC4KK2Zyb20gX2lvIGltcG9ydCBGaWxlSU8KKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICdwb3NpeCcsICd0ZXN0cyByZXF1aXJlcyBhIHBvc2l4IHN5c3RlbS4nKQorY2xhc3MgVGVzdEZpbGVJT1NpZ25hbEludGVycnVwdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9wcm9jZXNzID0gTm9uZQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9wcm9jZXNzIGFuZCBzZWxmLl9wcm9jZXNzLnBvbGwoKSBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3Mua2lsbCgpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgX2dlbmVyYXRlX2luZmlsZV9zZXR1cF9jb2RlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpbmZpbGUgPSAuLi4gbGluZSBvZiBjb2RlIGZvciB0aGUgcmVhZGVyIHByb2Nlc3MuCisKKyAgICAgICAgc3ViY2xhc3Nlc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIHRlc3QgZGlmZmVyZW50IElPIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gKCdpbXBvcnQgX2lvIDsnCisgICAgICAgICAgICAgICAgJ2luZmlsZSA9IF9pby5GaWxlSU8oc3lzLnN0ZGluLmZpbGVubygpLCAicmIiKScpCisKKyAgICBkZWYgZmFpbF93aXRoX3Byb2Nlc3NfaW5mbyhzZWxmLCB3aHksIHN0ZG91dD1iJycsIHN0ZGVycj1iJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbXVuaWNhdGU9VHJ1ZSk6CisgICAgICAgICIiIkEgY29tbW9uIHdheSB0byBjbGVhbnVwIGFuZCBmYWlsIHdpdGggdXNlZnVsIGRlYnVnIG91dHB1dC4KKworICAgICAgICBLaWxscyB0aGUgcHJvY2VzcyBpZiBpdCBpcyBzdGlsbCBydW5uaW5nLCBjb2xsZWN0cyByZW1haW5pbmcgb3V0cHV0CisgICAgICAgIGFuZCBmYWlscyB0aGUgdGVzdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5jbHVkaW5nIHRoZSBvdXRwdXQuCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIHdoeTogVGV4dCB0byBnbyBhZnRlciAiRXJyb3IgZnJvbSBJTyBwcm9jZXNzIiBpbiB0aGUgbWVzc2FnZS4KKyAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyOiBzdGFuZGFyZCBvdXRwdXQgYW5kIGVycm9yIGZyb20gdGhlIHByb2Nlc3Mgc28KKyAgICAgICAgICAgICAgICBmYXIgdG8gaW5jbHVkZSBpbiB0aGUgZXJyb3IgbWVzc2FnZS4KKyAgICAgICAgICAgIGNvbW11bmljYXRlOiBib29sLCB3aGVuIFRydWUgd2UgY2FsbCBjb21tdW5pY2F0ZSgpIG9uIHRoZSBwcm9jZXNzCisgICAgICAgICAgICAgICAgYWZ0ZXIga2lsbGluZyBpdCB0byBnYXRoZXIgYWRkaXRpb25hbCBvdXRwdXQuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLl9wcm9jZXNzLnBvbGwoKSBpcyBOb25lOgorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpICAjIGdpdmUgaXQgdGltZSB0byBmaW5pc2ggcHJpbnRpbmcgdGhlIGVycm9yLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3MudGVybWluYXRlKCkgICMgRW5zdXJlIGl0IGRpZXMuCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIGNvbW11bmljYXRlOgorICAgICAgICAgICAgc3Rkb3V0X2VuZCwgc3RkZXJyX2VuZCA9IHNlbGYuX3Byb2Nlc3MuY29tbXVuaWNhdGUoKQorICAgICAgICAgICAgc3Rkb3V0ICs9IHN0ZG91dF9lbmQKKyAgICAgICAgICAgIHN0ZGVyciArPSBzdGRlcnJfZW5kCisgICAgICAgIHNlbGYuZmFpbCgnRXJyb3IgZnJvbSBJTyBwcm9jZXNzICVzOlxuU1RET1VUOlxuJXNTVERFUlI6XG4lc1xuJyAlCisgICAgICAgICAgICAgICAgICAod2h5LCBzdGRvdXQuZGVjb2RlKCksIHN0ZGVyci5kZWNvZGUoKSkpCisKKyAgICBkZWYgX3Rlc3RfcmVhZGluZyhzZWxmLCBkYXRhX3RvX3dyaXRlLCByZWFkX2FuZF92ZXJpZnlfY29kZSk6CisgICAgICAgICIiIkdlbmVyaWMgYnVmZmVyZWQgcmVhZCBtZXRob2QgdGVzdCBoYXJuZXNzIHRvIHZhbGlkYXRlIEVJTlRSIGJlaGF2aW9yLgorCisgICAgICAgIEFsc28gdmFsaWRhdGVzIHRoYXQgUHl0aG9uIHNpZ25hbCBoYW5kbGVycyBhcmUgcnVuIGR1cmluZyB0aGUgcmVhZC4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgZGF0YV90b193cml0ZTogU3RyaW5nIHRvIHdyaXRlIHRvIHRoZSBjaGlsZCBwcm9jZXNzIGZvciByZWFkaW5nCisgICAgICAgICAgICAgICAgYmVmb3JlIHNlbmRpbmcgaXQgYSBzaWduYWwsIGNvbmZpcm1pbmcgdGhlIHNpZ25hbCB3YXMgaGFuZGxlZCwKKyAgICAgICAgICAgICAgICB3cml0aW5nIGEgZmluYWwgbmV3bGluZSBhbmQgY2xvc2luZyB0aGUgaW5maWxlIHBpcGUuCisgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZTogU2luZ2xlICJsaW5lIiBvZiBjb2RlIHRvIHJlYWQgZnJvbSBhIGZpbGUKKyAgICAgICAgICAgICAgICBvYmplY3QgbmFtZWQgJ2luZmlsZScgYW5kIHZhbGlkYXRlIHRoZSByZXN1bHQuICBUaGlzIHdpbGwgYmUKKyAgICAgICAgICAgICAgICBleGVjdXRlZCBhcyBwYXJ0IG9mIGEgcHl0aG9uIHN1YnByb2Nlc3MgZmVkIGRhdGFfdG9fd3JpdGUuCisgICAgICAgICIiIgorICAgICAgICBpbmZpbGVfc2V0dXBfY29kZSA9IHNlbGYuX2dlbmVyYXRlX2luZmlsZV9zZXR1cF9jb2RlKCkKKyAgICAgICAgIyBUb3RhbCBwaXBlIElPIGluIHRoaXMgZnVuY3Rpb24gaXMgc21hbGxlciB0aGFuIHRoZSBtaW5pbXVtIHBvc2l4IE9TCisgICAgICAgICMgcGlwZSBidWZmZXIgc2l6ZSBvZiA1MTIgYnl0ZXMuICBObyB3cml0ZXIgc2hvdWxkIGJsb2NrLgorICAgICAgICBhc3NlcnQgbGVuKGRhdGFfdG9fd3JpdGUpIDwgNTEyLCAnZGF0YV90b193cml0ZSBtdXN0IGZpdCBpbiBwaXBlIGJ1Zi4nCisKKyAgICAgICAgIyBTdGFydCBhIHN1YnByb2Nlc3MgdG8gY2FsbCBvdXIgcmVhZCBtZXRob2Qgd2hpbGUgaGFuZGxpbmcgYSBzaWduYWwuCisgICAgICAgIHNlbGYuX3Byb2Nlc3MgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgJy11JywgJy1jJywKKyAgICAgICAgICAgICAgICAgJ2ltcG9ydCBpbywgc2lnbmFsLCBzeXMgOycKKyAgICAgICAgICAgICAgICAgJ3NpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdsYW1iZGEgcywgZjogc3lzLnN0ZGVyci53cml0ZSgiJFxcbiIpKSA7JworICAgICAgICAgICAgICAgICArIGluZmlsZV9zZXR1cF9jb2RlICsgJyA7JyArCisgICAgICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJXb3JtIFNpZ24hXFxuIikgOycKKyAgICAgICAgICAgICAgICAgKyByZWFkX2FuZF92ZXJpZnlfY29kZSArICcgOycgKworICAgICAgICAgICAgICAgICAnaW5maWxlLmNsb3NlKCknCisgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKworICAgICAgICAjIFdhaXQgZm9yIHRoZSBzaWduYWwgaGFuZGxlciB0byBiZSBpbnN0YWxsZWQuCisgICAgICAgIHdvcm1fc2lnbiA9IHNlbGYuX3Byb2Nlc3Muc3RkZXJyLnJlYWQobGVuKGInV29ybSBTaWduIVxuJykpCisgICAgICAgIGlmIHdvcm1fc2lnbiAhPSBiJ1dvcm0gU2lnbiFcbic6ICAjIFNlZSBhbHNvLCBEdW5lIGJ5IEZyYW5rIEhlcmJlcnQuCisgICAgICAgICAgICBzZWxmLmZhaWxfd2l0aF9wcm9jZXNzX2luZm8oJ3doaWxlIGF3YWl0aW5nIGEgc2lnbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXdvcm1fc2lnbikKKyAgICAgICAgc2VsZi5fcHJvY2Vzcy5zdGRpbi53cml0ZShkYXRhX3RvX3dyaXRlKQorCisgICAgICAgIHNpZ25hbHNfc2VudCA9IDAKKyAgICAgICAgcmxpc3QgPSBbXQorICAgICAgICAjIFdlIGRvbid0IGtub3cgd2hlbiB0aGUgcmVhZF9hbmRfdmVyaWZ5X2NvZGUgaW4gb3VyIGNoaWxkIGlzIGFjdHVhbGx5CisgICAgICAgICMgZXhlY3V0aW5nIHdpdGhpbiB0aGUgcmVhZCBzeXN0ZW0gY2FsbCB3ZSB3YW50IHRvIGludGVycnVwdC4gIFRoaXMKKyAgICAgICAgIyBsb29wIHdhaXRzIGZvciBhIGJpdCBiZWZvcmUgc2VuZGluZyB0aGUgZmlyc3Qgc2lnbmFsIHRvIGluY3JlYXNlCisgICAgICAgICMgdGhlIGxpa2VsaWhvb2Qgb2YgdGhhdC4gIEltcGxlbWVudGF0aW9ucyB3aXRob3V0IGNvcnJlY3QgRUlOVFIKKyAgICAgICAgIyBhbmQgc2lnbmFsIGhhbmRsaW5nIHVzdWFsbHkgZmFpbCB0aGlzIHRlc3QuCisgICAgICAgIHdoaWxlIG5vdCBybGlzdDoKKyAgICAgICAgICAgIHJsaXN0LCBfLCBfID0gc2VsZWN0LnNlbGVjdChbc2VsZi5fcHJvY2Vzcy5zdGRlcnJdLCAoKSwgKCksIDAuMDUpCisgICAgICAgICAgICBzZWxmLl9wcm9jZXNzLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgICAgICBzaWduYWxzX3NlbnQgKz0gMQorICAgICAgICAgICAgaWYgc2lnbmFsc19zZW50ID4gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYuX3Byb2Nlc3Mua2lsbCgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdyZWFkZXIgcHJvY2VzcyBmYWlsZWQgdG8gaGFuZGxlIG91ciBzaWduYWxzLicpCisgICAgICAgICMgVGhpcyBhc3N1bWVzIGFueXRoaW5nIHVuZXhwZWN0ZWQgdGhhdCB3cml0ZXMgdG8gc3RkZXJyIHdpbGwgYWxzbworICAgICAgICAjIHdyaXRlIGEgbmV3bGluZS4gIFRoYXQgaXMgdHJ1ZSBvZiB0aGUgdHJhY2ViYWNrIHByaW50aW5nIGNvZGUuCisgICAgICAgIHNpZ25hbF9saW5lID0gc2VsZi5fcHJvY2Vzcy5zdGRlcnIucmVhZGxpbmUoKQorICAgICAgICBpZiBzaWduYWxfbGluZSAhPSBiJyRcbic6CisgICAgICAgICAgICBzZWxmLmZhaWxfd2l0aF9wcm9jZXNzX2luZm8oJ3doaWxlIGF3YWl0aW5nIHNpZ25hbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXNpZ25hbF9saW5lKQorCisgICAgICAgICMgV2UgYXBwZW5kIGEgbmV3bGluZSB0byBvdXIgaW5wdXQgc28gdGhhdCBhIHJlYWRsaW5lIGNhbGwgY2FuCisgICAgICAgICMgZW5kIG9uIGl0cyBvd24gYmVmb3JlIHRoZSBFT0YgaXMgc2VlbiBhbmQgc28gdGhhdCB3ZSdyZSB0ZXN0aW5nCisgICAgICAgICMgdGhlIHJlYWQgY2FsbCB0aGF0IHdhcyBpbnRlcnJ1cHRlZCBieSBhIHNpZ25hbCBiZWZvcmUgdGhlIGVuZCBvZgorICAgICAgICAjIHRoZSBkYXRhIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkLgorICAgICAgICBzdGRvdXQsIHN0ZGVyciA9IHNlbGYuX3Byb2Nlc3MuY29tbXVuaWNhdGUoaW5wdXQ9YidcbicpCisgICAgICAgIGlmIHNlbGYuX3Byb2Nlc3MucmV0dXJuY29kZToKKyAgICAgICAgICAgIHNlbGYuZmFpbF93aXRoX3Byb2Nlc3NfaW5mbygKKyAgICAgICAgICAgICAgICAgICAgJ2V4aXRlZCByYz0lZCcgJSBzZWxmLl9wcm9jZXNzLnJldHVybmNvZGUsCisgICAgICAgICAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyLCBjb21tdW5pY2F0ZT1GYWxzZSkKKyAgICAgICAgIyBQQVNTIQorCisgICAgIyBTdHJpbmcgZm9ybWF0IGZvciB0aGUgcmVhZF9hbmRfdmVyaWZ5X2NvZGUgdXNlZCBieSByZWFkIG1ldGhvZHMuCisgICAgX1JFQURJTkdfQ09ERV9URU1QTEFURSA9ICgKKyAgICAgICAgICAgICdnb3QgPSBpbmZpbGUue3JlYWRfbWV0aG9kX25hbWV9KCkgOycKKyAgICAgICAgICAgICdleHBlY3RlZCA9IHtleHBlY3RlZCFyfSA7JworICAgICAgICAgICAgJ2Fzc2VydCBnb3QgPT0gZXhwZWN0ZWQsICgnCisgICAgICAgICAgICAgICAgICAgICcie3JlYWRfbWV0aG9kX25hbWV9IHJldHVybmVkIHdyb25nIGRhdGEuXFxuIicKKyAgICAgICAgICAgICAgICAgICAgJyJnb3QgZGF0YSAlclxcbmV4cGVjdGVkICVyIiAlIChnb3QsIGV4cGVjdGVkKSknCisgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgIiIicmVhZGxpbmUoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvLCB3b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkbGluZScsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1iJ2hlbGxvLCB3b3JsZCFcbicpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICAiIiJyZWFkbGluZXMoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvXG53b3JsZCEnLAorICAgICAgICAgICAgICAgIHJlYWRfYW5kX3ZlcmlmeV9jb2RlPXNlbGYuX1JFQURJTkdfQ09ERV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkX21ldGhvZF9uYW1lPSdyZWFkbGluZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9W2InaGVsbG9cbicsIGInd29ybGQhXG4nXSkpCisKKyAgICBkZWYgdGVzdF9yZWFkYWxsKHNlbGYpOgorICAgICAgICAiIiJyZWFkYWxsKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZGFsbCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1iJ2hlbGxvXG53b3JsZCFcbicpKQorICAgICAgICAjIHJlYWQoKSBpcyB0aGUgc2FtZSB0aGluZyBhcyByZWFkYWxsKCkuCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGluZygKKyAgICAgICAgICAgICAgICBkYXRhX3RvX3dyaXRlPWInaGVsbG9cbndvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9c2VsZi5fUkVBRElOR19DT0RFX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbWV0aG9kX25hbWU9J3JlYWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9YidoZWxsb1xud29ybGQhXG4nKSkKKworCitjbGFzcyBUZXN0QnVmZmVyZWRJT1NpZ25hbEludGVycnVwdChUZXN0RmlsZUlPU2lnbmFsSW50ZXJydXB0KToKKyAgICBkZWYgX2dlbmVyYXRlX2luZmlsZV9zZXR1cF9jb2RlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSBpbmZpbGUgPSAuLi4gbGluZSBvZiBjb2RlIHRvIG1ha2UgYSBCdWZmZXJlZFJlYWRlci4iIiIKKyAgICAgICAgcmV0dXJuICgnaW5maWxlID0gaW8ub3BlbihzeXMuc3RkaW4uZmlsZW5vKCksICJyYiIpIDsnCisgICAgICAgICAgICAgICAgJ2ltcG9ydCBfaW8gO2Fzc2VydCBpc2luc3RhbmNlKGluZmlsZSwgX2lvLkJ1ZmZlcmVkUmVhZGVyKScpCisKKyAgICBkZWYgdGVzdF9yZWFkYWxsKHNlbGYpOgorICAgICAgICAiIiJCdWZmZXJlZFJlYWRlci5yZWFkKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1iJ2hlbGxvXG53b3JsZCFcbicpKQorCisKK2NsYXNzIFRlc3RUZXh0SU9TaWduYWxJbnRlcnJ1cHQoVGVzdEZpbGVJT1NpZ25hbEludGVycnVwdCk6CisgICAgZGVmIF9nZW5lcmF0ZV9pbmZpbGVfc2V0dXBfY29kZShzZWxmKToKKyAgICAgICAgIiIiUmV0dXJucyB0aGUgaW5maWxlID0gLi4uIGxpbmUgb2YgY29kZSB0byBtYWtlIGEgVGV4dElPV3JhcHBlci4iIiIKKyAgICAgICAgcmV0dXJuICgnaW5maWxlID0gaW8ub3BlbihzeXMuc3RkaW4uZmlsZW5vKCksICJydCIsIG5ld2xpbmU9Tm9uZSkgOycKKyAgICAgICAgICAgICAgICAnaW1wb3J0IF9pbyA7YXNzZXJ0IGlzaW5zdGFuY2UoaW5maWxlLCBfaW8uVGV4dElPV3JhcHBlciknKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgICIiInJlYWRsaW5lKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsbywgd29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZGxpbmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQ9J2hlbGxvLCB3b3JsZCFcbicpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICAiIiJyZWFkbGluZXMoKSBtdXN0IGhhbmRsZSBzaWduYWxzIGFuZCBub3QgbG9zZSBkYXRhLiIiIgorICAgICAgICBzZWxmLl90ZXN0X3JlYWRpbmcoCisgICAgICAgICAgICAgICAgZGF0YV90b193cml0ZT1iJ2hlbGxvXHJcbndvcmxkIScsCisgICAgICAgICAgICAgICAgcmVhZF9hbmRfdmVyaWZ5X2NvZGU9c2VsZi5fUkVBRElOR19DT0RFX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRfbWV0aG9kX25hbWU9J3JlYWRsaW5lcycsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD1bJ2hlbGxvXG4nLCAnd29ybGQhXG4nXSkpCisKKyAgICBkZWYgdGVzdF9yZWFkYWxsKHNlbGYpOgorICAgICAgICAiIiJyZWFkKCkgbXVzdCBoYW5kbGUgc2lnbmFscyBhbmQgbm90IGxvc2UgZGF0YS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkaW5nKAorICAgICAgICAgICAgICAgIGRhdGFfdG9fd3JpdGU9YidoZWxsb1xud29ybGQhJywKKyAgICAgICAgICAgICAgICByZWFkX2FuZF92ZXJpZnlfY29kZT1zZWxmLl9SRUFESU5HX0NPREVfVEVNUExBVEUuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZF9tZXRob2RfbmFtZT0ncmVhZCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZD0iaGVsbG9cbndvcmxkIVxuIikpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RfY2FzZXMgPSBbCisgICAgICAgICAgICB0YyBmb3IgdGMgaW4gZ2xvYmFscygpLnZhbHVlcygpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHRjLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyh0YywgdW5pdHRlc3QuVGVzdENhc2UpXQorICAgIHJ1bl91bml0dGVzdCgqdGVzdF9jYXNlcykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlX2VpbnRyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTdjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlX2VpbnRyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlX2VpbnRyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVfZWludHIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ODZiZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlX2VpbnRyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlY21wLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzM5ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weQpAQCAtMCwwICsxLDEzNCBAQAorCitpbXBvcnQgb3MsIGZpbGVjbXAsIHNodXRpbCwgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgRmlsZUNvbXBhcmVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYubmFtZV9zYW1lID0gdGVzdF9zdXBwb3J0LlRFU1RGTiArICctc2FtZScKKyAgICAgICAgc2VsZi5uYW1lX2RpZmYgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgJy1kaWZmJworICAgICAgICBkYXRhID0gJ0NvbnRlbnRzIG9mIGZpbGUgZ28gaGVyZS5cbicKKyAgICAgICAgZm9yIG5hbWUgaW4gW3NlbGYubmFtZSwgc2VsZi5uYW1lX3NhbWUsIHNlbGYubmFtZV9kaWZmXToKKyAgICAgICAgICAgIG91dHB1dCA9IG9wZW4obmFtZSwgJ3cnKQorICAgICAgICAgICAgb3V0cHV0LndyaXRlKGRhdGEpCisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKQorCisgICAgICAgIG91dHB1dCA9IG9wZW4oc2VsZi5uYW1lX2RpZmYsICdhKycpCisgICAgICAgIG91dHB1dC53cml0ZSgnQW4gZXh0cmEgbGluZS5cbicpCisgICAgICAgIG91dHB1dC5jbG9zZSgpCisgICAgICAgIHNlbGYuZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLnVubGluayhzZWxmLm5hbWUpCisgICAgICAgIG9zLnVubGluayhzZWxmLm5hbWVfc2FtZSkKKyAgICAgICAgb3MudW5saW5rKHNlbGYubmFtZV9kaWZmKQorCisgICAgZGVmIHRlc3RfbWF0Y2hpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZV9zYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgZmlsZSB0byBpdHNlbGYgZmFpbHMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWVfc2FtZSwgc2hhbGxvdz1GYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGZpbGUgdG8gaXRzZWxmIGZhaWxzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lLCBzaGFsbG93PUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgZmlsZSB0byBpZGVudGljYWwgZmlsZSBmYWlscyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGZpbGUgdG8gaWRlbnRpY2FsIGZpbGUgZmFpbHMiKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lX2RpZmYpLAorICAgICAgICAgICAgICAgICAgICAiTWlzbWF0Y2hlZCBmaWxlcyBjb21wYXJlIGFzIGVxdWFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYuZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgIkZpbGUgYW5kIGRpcmVjdG9yeSBjb21wYXJlIGFzIGVxdWFsIikKKworY2xhc3MgRGlyQ29tcGFyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorICAgICAgICBzZWxmLmRpciA9IG9zLnBhdGguam9pbih0bXBkaXIsICdkaXInKQorICAgICAgICBzZWxmLmRpcl9zYW1lID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2Rpci1zYW1lJykKKyAgICAgICAgc2VsZi5kaXJfZGlmZiA9IG9zLnBhdGguam9pbih0bXBkaXIsICdkaXItZGlmZicpCisgICAgICAgIHNlbGYuY2FzZWluc2Vuc2l0aXZlID0gb3MucGF0aC5ub3JtY2FzZSgnQScpID09IG9zLnBhdGgubm9ybWNhc2UoJ2EnKQorICAgICAgICBkYXRhID0gJ0NvbnRlbnRzIG9mIGZpbGUgZ28gaGVyZS5cbicKKyAgICAgICAgZm9yIGRpciBpbiBbc2VsZi5kaXIsIHNlbGYuZGlyX3NhbWUsIHNlbGYuZGlyX2RpZmZdOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkaXIsIFRydWUpCisgICAgICAgICAgICBvcy5ta2RpcihkaXIpCisgICAgICAgICAgICBpZiBzZWxmLmNhc2VpbnNlbnNpdGl2ZSBhbmQgZGlyIGlzIHNlbGYuZGlyX3NhbWU6CisgICAgICAgICAgICAgICAgZm4gPSAnRmlMZScgICAgICMgVmVyaWZ5IGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmbiA9ICdmaWxlJworICAgICAgICAgICAgb3V0cHV0ID0gb3Blbihvcy5wYXRoLmpvaW4oZGlyLCBmbiksICd3JykKKyAgICAgICAgICAgIG91dHB1dC53cml0ZShkYXRhKQorICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCkKKworICAgICAgICBvdXRwdXQgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLmRpcl9kaWZmLCAnZmlsZTInKSwgJ3cnKQorICAgICAgICBvdXRwdXQud3JpdGUoJ0FuIGV4dHJhIGZpbGUuXG4nKQorICAgICAgICBvdXRwdXQuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyKQorICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyX3NhbWUpCisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5kaXJfZGlmZikKKworICAgIGRlZiB0ZXN0X2NtcGZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZWNtcC5jbXBmaWxlcyhzZWxmLmRpciwgc2VsZi5kaXIsIFsnZmlsZSddKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgKFsnZmlsZSddLCBbXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBkaXJlY3RvcnkgdG8gaXRzZWxmIGZhaWxzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyX3NhbWUsIFsnZmlsZSddKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgKFsnZmlsZSddLCBbXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBkaXJlY3RvcnkgdG8gc2FtZSBmYWlscyIpCisKKyAgICAgICAgIyBUcnkgaXQgd2l0aCBzaGFsbG93PUZhbHNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpciwgWydmaWxlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWxsb3c9RmFsc2UpID09CisgICAgICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFtdLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBpdHNlbGYgZmFpbHMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZWNtcC5jbXBmaWxlcyhzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwgWydmaWxlJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWxsb3c9RmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBkaXJlY3RvcnkgdG8gc2FtZSBmYWlscyIpCisKKyAgICAgICAgIyBBZGQgZGlmZmVyZW50IGZpbGUyCisgICAgICAgIG91dHB1dCA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYuZGlyLCAnZmlsZTInKSwgJ3cnKQorICAgICAgICBvdXRwdXQud3JpdGUoJ0RpZmZlcmVudCBjb250ZW50cy5cbicpCisgICAgICAgIG91dHB1dC5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZmlsZScsICdmaWxlMiddKSA9PQorICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFsnZmlsZTInXSwgW10pLAorICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIG1pc21hdGNoZWQgZGlyZWN0b3JpZXMgZmFpbHMiKQorCisKKyAgICBkZWYgdGVzdF9kaXJjbXAoc2VsZik6CisgICAgICAgICMgQ2hlY2sgYXR0cmlidXRlcyBmb3IgY29tcGFyaXNvbiBvZiB0d28gaWRlbnRpY2FsIGRpcmVjdG9yaWVzCisgICAgICAgIGQgPSBmaWxlY21wLmRpcmNtcChzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSkKKyAgICAgICAgaWYgc2VsZi5jYXNlaW5zZW5zaXRpdmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtkLmxlZnRfbGlzdCwgZC5yaWdodF9saXN0XSxbWydmaWxlJ10sIFsnRmlMZSddXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2QubGVmdF9saXN0LCBkLnJpZ2h0X2xpc3RdLFtbJ2ZpbGUnXSwgWydmaWxlJ11dKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5jb21tb24gPT0gWydmaWxlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmxlZnRfb25seSA9PSBkLnJpZ2h0X29ubHkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNhbWVfZmlsZXMgPT0gWydmaWxlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmRpZmZfZmlsZXMgPT0gW10pCisKKyAgICAgICAgIyBDaGVjayBhdHRyaWJ1dGVzIGZvciBjb21wYXJpc29uIG9mIHR3byBkaWZmZXJlbnQgZGlyZWN0b3JpZXMKKyAgICAgICAgZCA9IGZpbGVjbXAuZGlyY21wKHNlbGYuZGlyLCBzZWxmLmRpcl9kaWZmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5sZWZ0X2xpc3QgPT0gWydmaWxlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnJpZ2h0X2xpc3QgPT0gWydmaWxlJywgJ2ZpbGUyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmNvbW1vbiA9PSBbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQubGVmdF9vbmx5ID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5yaWdodF9vbmx5ID09IFsnZmlsZTInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuc2FtZV9maWxlcyA9PSBbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZGlmZl9maWxlcyA9PSBbXSkKKworICAgICAgICAjIEFkZCBkaWZmZXJlbnQgZmlsZTIKKyAgICAgICAgb3V0cHV0ID0gb3Blbihvcy5wYXRoLmpvaW4oc2VsZi5kaXIsICdmaWxlMicpLCAndycpCisgICAgICAgIG91dHB1dC53cml0ZSgnRGlmZmVyZW50IGNvbnRlbnRzLlxuJykKKyAgICAgICAgb3V0cHV0LmNsb3NlKCkKKyAgICAgICAgZCA9IGZpbGVjbXAuZGlyY21wKHNlbGYuZGlyLCBzZWxmLmRpcl9kaWZmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFsnZmlsZTInXSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChGaWxlQ29tcGFyZVRlc3RDYXNlLCBEaXJDb21wYXJlVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVjbXAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YTE0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVjbXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVjbXAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWNtcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0YTE0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVjbXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFlZDFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC0wLDAgKzEsMjI1IEBACisnJycKK1Rlc3RzIGZvciBmaWxlaW5wdXQgbW9kdWxlLgorTmljayBNYXRoZXdzb24KKycnJworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRFU1RGTiwgcnVuX3VuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB1bmxpbmsgYXMgc2FmZV91bmxpbmsKK2ltcG9ydCBzeXMsIHJlCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBmaWxlaW5wdXQgaW1wb3J0IEZpbGVJbnB1dCwgaG9va19lbmNvZGVkCisKKyMgVGhlIGZpbGVpbnB1dCBtb2R1bGUgaGFzIDIgaW50ZXJmYWNlczogdGhlIEZpbGVJbnB1dCBjbGFzcyB3aGljaCBkb2VzCisjIGFsbCB0aGUgd29yaywgYW5kIGEgZmV3IGZ1bmN0aW9ucyAoaW5wdXQsIGV0Yy4pIHRoYXQgdXNlIGEgZ2xvYmFsIF9zdGF0ZQorIyB2YXJpYWJsZS4gIFdlIG9ubHkgdGVzdCB0aGUgRmlsZUlucHV0IGNsYXNzLCBzaW5jZSB0aGUgb3RoZXIgZnVuY3Rpb25zCisjIG9ubHkgcHJvdmlkZSBhIHRoaW4gZmFjYWRlIG92ZXIgRmlsZUlucHV0LgorCisjIFdyaXRlIGxpbmVzIChhIGxpc3Qgb2YgbGluZXMpIHRvIHRlbXAgZmlsZSBudW1iZXIgaSwgYW5kIHJldHVybiB0aGUKKyMgdGVtcCBmaWxlJ3MgbmFtZS4KK2RlZiB3cml0ZVRtcChpLCBsaW5lcywgbW9kZT0ndycpOiAgIyBvcGVuaW5nIGluIHRleHQgbW9kZSBpcyB0aGUgZGVmYXVsdAorICAgIG5hbWUgPSBURVNURk4gKyBzdHIoaSkKKyAgICBmID0gb3BlbihuYW1lLCBtb2RlKQorICAgIGYud3JpdGVsaW5lcyhsaW5lcykKKyAgICBmLmNsb3NlKCkKKyAgICByZXR1cm4gbmFtZQorCitkZWYgcmVtb3ZlX3RlbXBmaWxlcygqbmFtZXMpOgorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBzYWZlX3VubGluayhuYW1lKQorCitjbGFzcyBCdWZmZXJTaXplc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9idWZmZXJfc2l6ZXMoc2VsZik6CisgICAgICAgICMgRmlyc3QsIHJ1biB0aGUgdGVzdHMgd2l0aCBkZWZhdWx0IGFuZCB0ZWVueSBidWZmZXIgc2l6ZS4KKyAgICAgICAgZm9yIHJvdW5kLCBicyBpbiAoMCwgMCksICgxLCAzMCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdDEgPSB3cml0ZVRtcCgxLCBbIkxpbmUgJXMgb2YgZmlsZSAxXG4iICUgKGkrMSkgZm9yIGkgaW4gcmFuZ2UoMTUpXSkKKyAgICAgICAgICAgICAgICB0MiA9IHdyaXRlVG1wKDIsIFsiTGluZSAlcyBvZiBmaWxlIDJcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxMCldKQorICAgICAgICAgICAgICAgIHQzID0gd3JpdGVUbXAoMywgWyJMaW5lICVzIG9mIGZpbGUgM1xuIiAlIChpKzEpIGZvciBpIGluIHJhbmdlKDUpXSkKKyAgICAgICAgICAgICAgICB0NCA9IHdyaXRlVG1wKDQsIFsiTGluZSAlcyBvZiBmaWxlIDRcbiIgJSAoaSsxKSBmb3IgaSBpbiByYW5nZSgxKV0pCisgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZV90ZXN0KHQxLCB0MiwgdDMsIHQ0LCBicywgcm91bmQpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEsIHQyLCB0MywgdDQpCisKKyAgICBkZWYgYnVmZmVyX3NpemVfdGVzdChzZWxmLCB0MSwgdDIsIHQzLCB0NCwgYnM9MCwgcm91bmQ9MCk6CisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUocidMSU5FIChcZCspIE9GIEZJTEUgKFxkKyknKQorCisgICAgICAgIHN0YXJ0ID0gMSArIHJvdW5kKjYKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICclcy4gU2ltcGxlIGl0ZXJhdGlvbiAoYnM9JXMpJyAlIChzdGFydCswLCBicykKKyAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9KHQxLCB0MiwgdDMsIHQ0KSwgYnVmc2l6ZT1icykKKyAgICAgICAgbGluZXMgPSBsaXN0KGZpKQorICAgICAgICBmaS5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgMzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXNbNF0sICdMaW5lIDUgb2YgZmlsZSAxXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzWzMwXSwgJ0xpbmUgMSBvZiBmaWxlIDRcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDMxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVuYW1lKCksIHQ0KQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnJXMuIFN0YXR1cyB2YXJpYWJsZXMgKGJzPSVzKScgJSAoc3RhcnQrMSwgYnMpCisgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPSh0MSwgdDIsIHQzLCB0NCksIGJ1ZnNpemU9YnMpCisgICAgICAgIHMgPSAieCIKKyAgICAgICAgd2hpbGUgcyBhbmQgcyAhPSAnTGluZSA2IG9mIGZpbGUgMlxuJzoKKyAgICAgICAgICAgIHMgPSBmaS5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaS5pc2ZpcnN0bGluZSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpLmlzc3RkaW4oKSkKKworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJyVzLiBOZXh0ZmlsZSAoYnM9JXMpJyAlIChzdGFydCsyLCBicykKKyAgICAgICAgZmkubmV4dGZpbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLnJlYWRsaW5lKCksICdMaW5lIDEgb2YgZmlsZSAzXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmxpbmVubygpLCAyMikKKyAgICAgICAgZmkuY2xvc2UoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnJXMuIFN0ZGluIChicz0lcyknICUgKHN0YXJ0KzMsIGJzKQorICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz0odDEsIHQyLCB0MywgdDQsICctJyksIGJ1ZnNpemU9YnMpCisgICAgICAgIHNhdmVzdGRpbiA9IHN5cy5zdGRpbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3RkaW4gPSBTdHJpbmdJTygiTGluZSAxIG9mIHN0ZGluXG5MaW5lIDIgb2Ygc3RkaW5cbiIpCisgICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lcyksIDMzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lc1szMl0sICdMaW5lIDIgb2Ygc3RkaW5cbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVuYW1lKCksICc8c3RkaW4+JykKKyAgICAgICAgICAgIGZpLm5leHRmaWxlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zdGRpbiA9IHNhdmVzdGRpbgorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnJXMuIEJvdW5kYXJ5IGNvbmRpdGlvbnMgKGJzPSVzKScgJSAoc3RhcnQrNCwgYnMpCisgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPSh0MSwgdDIsIHQzLCB0NCksIGJ1ZnNpemU9YnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgTm9uZSkKKyAgICAgICAgZmkubmV4dGZpbGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmxpbmVubygpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVuYW1lKCksIE5vbmUpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICclcy4gSW5wbGFjZSAoYnM9JXMpJyAlIChzdGFydCs1LCBicykKKyAgICAgICAgc2F2ZXN0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9KHQxLCB0MiwgdDMsIHQ0KSwgaW5wbGFjZT0xLCBidWZzaXplPWJzKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZmk6CisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOi0xXS51cHBlcigpCisgICAgICAgICAgICAgICAgcHJpbnQgbGluZQorICAgICAgICAgICAgZmkuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVzdGRvdXQKKworICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz0odDEsIHQyLCB0MywgdDQpLCBidWZzaXplPWJzKQorICAgICAgICBmb3IgbGluZSBpbiBmaToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZVstMV0sICdcbicpCisgICAgICAgICAgICBtID0gcGF0Lm1hdGNoKGxpbmVbOi0xXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KG0uZ3JvdXAoMSkpLCBmaS5maWxlbGluZW5vKCkpCisgICAgICAgIGZpLmNsb3NlKCkKKworY2xhc3MgRmlsZUlucHV0VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3plcm9fYnl0ZV9maWxlcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdDEgPSB3cml0ZVRtcCgxLCBbIiJdKQorICAgICAgICAgICAgdDIgPSB3cml0ZVRtcCgyLCBbIiJdKQorICAgICAgICAgICAgdDMgPSB3cml0ZVRtcCgzLCBbIlRoZSBvbmx5IGxpbmUgdGhlcmUgaXMuXG4iXSkKKyAgICAgICAgICAgIHQ0ID0gd3JpdGVUbXAoNCwgWyIiXSkKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPSh0MSwgdDIsIHQzLCB0NCkpCisKKyAgICAgICAgICAgIGxpbmUgPSBmaS5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsICdUaGUgb25seSBsaW5lIHRoZXJlIGlzLlxuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDMpCisKKyAgICAgICAgICAgIGxpbmUgPSBmaS5yZWFkbGluZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmxpbmVubygpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5maWxlbGluZW5vKCksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVuYW1lKCksIHQ0KQorICAgICAgICAgICAgZmkuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcmVtb3ZlX3RlbXBmaWxlcyh0MSwgdDIsIHQzLCB0NCkKKworICAgIGRlZiB0ZXN0X2ZpbGVzX3RoYXRfZG9udF9lbmRfd2l0aF9uZXdsaW5lKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiQVxuQlxuQyJdKQorICAgICAgICAgICAgdDIgPSB3cml0ZVRtcCgyLCBbIkRcbkVcbkYiXSkKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPSh0MSwgdDIpKQorICAgICAgICAgICAgbGluZXMgPSBsaXN0KGZpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWyJBXG4iLCAiQlxuIiwgIkMiLCAiRFxuIiwgIkVcbiIsICJGIl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByZW1vdmVfdGVtcGZpbGVzKHQxLCB0MikKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfZmlsZW5hbWVzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiQVxuQiJdKQorICAgICAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkKKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAnYXNjaWknCisgICAgICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz11bmljb2RlKHQxLCBlbmNvZGluZykpCisgICAgICAgICAgICBsaW5lcyA9IGxpc3QoZmkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbIkFcbiIsICJCIl0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICByZW1vdmVfdGVtcGZpbGVzKHQxKQorCisgICAgZGVmIHRlc3RfZmlsZW5vKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiQVxuQiJdKQorICAgICAgICAgICAgdDIgPSB3cml0ZVRtcCgyLCBbIkNcbkQiXSkKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPSh0MSwgdDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaS5maWxlbm8oKSwgLTEpCisgICAgICAgICAgICBsaW5lID0gZmkubmV4dCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpLmZpbGVubygpLCAtMSkKKyAgICAgICAgICAgIGZpLm5leHRmaWxlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5vKCksIC0xKQorICAgICAgICAgICAgbGluZSA9IGxpc3QoZmkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVubygpLCAtMSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHJlbW92ZV90ZW1wZmlsZXModDEsIHQyKQorCisgICAgZGVmIHRlc3Rfb3BlbmluZ19tb2RlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGludmFsaWQgbW9kZSwgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KG1vZGU9InciKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlSW5wdXQgc2hvdWxkIHJlamVjdCBpbnZhbGlkIG1vZGUgYXJndW1lbnQiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyB0cnkgb3BlbmluZyBpbiB1bml2ZXJzYWwgbmV3bGluZSBtb2RlCisgICAgICAgICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiQVxuQlxyXG5DXHJEIl0sIG1vZGU9IndiIikKKyAgICAgICAgICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPXQxLCBtb2RlPSJVIikKKyAgICAgICAgICAgIGxpbmVzID0gbGlzdChmaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIFsiQVxuIiwgIkJcbiIsICJDXG4iLCAiRCJdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcmVtb3ZlX3RlbXBmaWxlcyh0MSkKKworICAgIGRlZiB0ZXN0X2ZpbGVfb3BlbmluZ19ob29rKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIGNhbm5vdCB1c2Ugb3Blbmhvb2sgYW5kIGlucGxhY2UgbW9kZQorICAgICAgICAgICAgZmkgPSBGaWxlSW5wdXQoaW5wbGFjZT0xLCBvcGVuaG9vaz1sYW1iZGEgZixtOiBOb25lKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlSW5wdXQgc2hvdWxkIHJhaXNlIGlmIGJvdGggaW5wbGFjZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgb3Blbmhvb2sgYXJndW1lbnRzIGFyZSBnaXZlbiIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBmaSA9IEZpbGVJbnB1dChvcGVuaG9vaz0xKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJGaWxlSW5wdXQgc2hvdWxkIGNoZWNrIG9wZW5ob29rIGZvciBiZWluZyBjYWxsYWJsZSIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICB0MSA9IHdyaXRlVG1wKDEsIFsiQVxuQiJdLCBtb2RlPSJ3YiIpCisgICAgICAgICAgICBmaSA9IEZpbGVJbnB1dChmaWxlcz10MSwgb3Blbmhvb2s9aG9va19lbmNvZGVkKCJyb3QxMyIpKQorICAgICAgICAgICAgbGluZXMgPSBsaXN0KGZpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWyJOXG4iLCAiTyJdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcmVtb3ZlX3RlbXBmaWxlcyh0MSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChCdWZmZXJTaXplc1Rlc3RzLCBGaWxlSW5wdXRUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ZmI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0ZmI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NGNlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9maWxlaW8ucHkKQEAgLTAsMCArMSw0NzkgQEAKKyMgQWRhcHRlZCBmcm9tIHRlc3RfZmlsZS5weSBieSBEYW5pZWwgU3R1dHpiYWNoCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscworCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGFycmF5IGltcG9ydCBhcnJheQorZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCitmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAoraW1wb3J0IF90ZXN0Y2FwaQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIGNoZWNrX3dhcm5pbmdzLCBydW5fdW5pdHRlc3QsIG1ha2VfYmFkX2ZkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBweTNrX2J5dGVzIGFzIGJ5dGVzCitmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgcnVuX3B5dGhvbgorCitmcm9tIF9pbyBpbXBvcnQgRmlsZUlPIGFzIF9GaWxlSU8KKworY2xhc3MgQXV0b0ZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBmaWxlIHRlc3RzIGZvciB3aGljaCBhIHRlc3QgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmYgPSBfRmlsZUlPKFRFU1RGTiwgJ3cnKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmY6CisgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorCisgICAgZGVmIHRlc3RXZWFrUmVmcyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgd2VhayByZWZlcmVuY2VzCisgICAgICAgIHAgPSBwcm94eShzZWxmLmYpCisgICAgICAgIHAud3JpdGUoYnl0ZXMocmFuZ2UoMTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCBwLnRlbGwoKSkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSZWZlcmVuY2VFcnJvciwgZ2V0YXR0ciwgcCwgJ3RlbGwnKQorCisgICAgZGVmIHRlc3RTZWVrVGVsbChzZWxmKToKKyAgICAgICAgc2VsZi5mLndyaXRlKGJ5dGVzKHJhbmdlKDIwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnRlbGwoKSwgMjApCisgICAgICAgIHNlbGYuZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnRlbGwoKSwgMCkKKyAgICAgICAgc2VsZi5mLnNlZWsoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnRlbGwoKSwgMTApCisgICAgICAgIHNlbGYuZi5zZWVrKDUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnRlbGwoKSwgMTUpCisgICAgICAgIHNlbGYuZi5zZWVrKC01LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi50ZWxsKCksIDEwKQorICAgICAgICBzZWxmLmYuc2VlaygtNSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYudGVsbCgpLCAxNSkKKworICAgIGRlZiB0ZXN0QXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgZXhwZWN0ZWQgYXR0cmlidXRlcyBleGlzdAorICAgICAgICBmID0gc2VsZi5mCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm1vZGUsICJ3YiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5jbG9zZWQsIEZhbHNlKQorCisgICAgICAgICMgdmVyaWZ5IHRoZSBhdHRyaWJ1dGVzIGFyZSByZWFkb25seQorICAgICAgICBmb3IgYXR0ciBpbiAnbW9kZScsICdjbG9zZWQnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0YXR0ciwgZiwgYXR0ciwgJ29vcHMnKQorCisgICAgZGVmIHRlc3RSZWFkaW50byhzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgcmVhZGludG8KKyAgICAgICAgc2VsZi5mLndyaXRlKGIiXHgwMVx4MDIiKQorICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICBhID0gYXJyYXkoYidiJywgYid4JyoxMCkKKyAgICAgICAgc2VsZi5mID0gX0ZpbGVJTyhURVNURk4sICdyJykKKyAgICAgICAgbiA9IHNlbGYuZi5yZWFkaW50byhhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5KGInYicsIFsxLCAyXSksIGFbOm5dKQorCisgICAgZGVmIHRlc3RXcml0ZWxpbmVzTGlzdChzZWxmKToKKyAgICAgICAgbCA9IFtiJzEyMycsIGInNDU2J10KKyAgICAgICAgc2VsZi5mLndyaXRlbGluZXMobCkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gX0ZpbGVJTyhURVNURk4sICdyYicpCisgICAgICAgIGJ1ZiA9IHNlbGYuZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInMTIzNDU2JykKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc1VzZXJMaXN0KHNlbGYpOgorICAgICAgICBsID0gVXNlckxpc3QoW2InMTIzJywgYic0NTYnXSkKKyAgICAgICAgc2VsZi5mLndyaXRlbGluZXMobCkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5mID0gX0ZpbGVJTyhURVNURk4sICdyYicpCisgICAgICAgIGJ1ZiA9IHNlbGYuZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInMTIzNDU2JykKKworICAgIGRlZiB0ZXN0V3JpdGVsaW5lc0Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ub25lX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuZi53cml0ZShiImhpXG5ieWVcbmFiYyIpCisgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIHNlbGYuZiA9IF9GaWxlSU8oVEVTVEZOLCAncicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnJlYWQoTm9uZSksIGIiaGlcbmJ5ZVxuYWJjIikKKyAgICAgICAgc2VsZi5mLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmYucmVhZGxpbmUoTm9uZSksIGIiaGlcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnJlYWRsaW5lcyhOb25lKSwgW2IiYnllXG4iLCBiImFiYyJdKQorCisgICAgZGVmIHRlc3RSZXByKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi5mKSwgIjxfaW8uRmlsZUlPIG5hbWU9JXIgbW9kZT0nJXMnPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuZi5uYW1lLCBzZWxmLmYubW9kZSkpCisgICAgICAgIGRlbCBzZWxmLmYubmFtZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi5mKSwgIjxfaW8uRmlsZUlPIGZkPSVyIG1vZGU9JyVzJz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzZWxmLmYuZmlsZW5vKCksIHNlbGYuZi5tb2RlKSkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNlbGYuZiksICI8X2lvLkZpbGVJTyBbY2xvc2VkXT4iKQorCisgICAgZGVmIHRlc3RFcnJvcnMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLmYKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmLmlzYXR0eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChmLm5hbWUsIFRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5yZWFkLCAxMCkgIyBPcGVuIGZvciByZWFkaW5nCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCisgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgJ3InKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYucmVhZGludG8sICIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQorCisgICAgZGVmIHRlc3RNZXRob2RzKHNlbGYpOgorICAgICAgICBtZXRob2RzID0gWydmaWxlbm8nLCAnaXNhdHR5JywgJ3JlYWQnLCAncmVhZGludG8nLAorICAgICAgICAgICAgICAgICAgICdzZWVrJywgJ3RlbGwnLCAndHJ1bmNhdGUnLCAnd3JpdGUnLCAnc2Vla2FibGUnLAorICAgICAgICAgICAgICAgICAgICdyZWFkYWJsZScsICd3cml0YWJsZSddCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdhdGhlb3MnKToKKyAgICAgICAgICAgIG1ldGhvZHMucmVtb3ZlKCd0cnVuY2F0ZScpCisKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZi5jbG9zZWQpCisKKyAgICAgICAgZm9yIG1ldGhvZG5hbWUgaW4gbWV0aG9kczoKKyAgICAgICAgICAgIG1ldGhvZCA9IGdldGF0dHIoc2VsZi5mLCBtZXRob2RuYW1lKQorICAgICAgICAgICAgIyBzaG91bGQgcmFpc2Ugb24gY2xvc2VkIGZpbGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1ldGhvZCkKKworICAgIGRlZiB0ZXN0T3BlbmRpcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAzNzAzOiBvcGVuaW5nIGEgZGlyZWN0b3J5IHNob3VsZCBmaWxsIHRoZSBlcnJubworICAgICAgICAjIFdpbmRvd3MgYWx3YXlzIHJldHVybnMgIltFcnJubyAxM106IFBlcm1pc3Npb24gZGVuaWVkCisgICAgICAgICMgVW5peCBjYWxscyBkaXJjaGVjaygpIGFuZCByZXR1cm5zICJbRXJybm8gMjFdOiBJcyBhIGRpcmVjdG9yeSIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX0ZpbGVJTygnLicsICdyJykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZS5lcnJubywgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5maWxlbmFtZSwgIi4iKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgSU9FcnJvciIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKG9zLm5hbWUgPT0gJ250JywgInRlc3Qgb25seSB3b3JrcyBvbiBhIFBPU0lYLWxpa2Ugc3lzdGVtIikKKyAgICBkZWYgdGVzdE9wZW5EaXJGRChzZWxmKToKKyAgICAgICAgZmQgPSBvcy5vcGVuKCcuJywgb3MuT19SRE9OTFkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvcikgYXMgY206CisgICAgICAgICAgICBfRmlsZUlPKGZkLCAncicpCisgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRUlTRElSKQorCisgICAgI0Egc2V0IG9mIGZ1bmN0aW9ucyB0ZXN0aW5nIHRoYXQgd2UgZ2V0IGV4cGVjdGVkIGJlaGF2aW91ciBpZiBzb21lb25lIGhhcworICAgICNtYW51YWxseSBjbG9zZWQgdGhlIGludGVybmFsIGZpbGUgZGVzY3JpcHRvci4gIEZpcnN0LCBhIGRlY29yYXRvcjoKKyAgICBkZWYgQ2xvc2VkRkQoZnVuYyk6CisgICAgICAgIEB3cmFwcyhmdW5jKQorICAgICAgICBkZWYgd3JhcHBlcihzZWxmKToKKyAgICAgICAgICAgICNmb3JjaWJseSBjbG9zZSB0aGUgZmQgYmVmb3JlIGludm9raW5nIHRoZSBwcm9ibGVtIGZ1bmN0aW9uCisgICAgICAgICAgICBmID0gc2VsZi5mCisgICAgICAgICAgICBvcy5jbG9zZShmLmZpbGVubygpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZ1bmMoc2VsZiwgZikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiB3cmFwcGVyCisKKyAgICBkZWYgQ2xvc2VkRkRSYWlzZXMoZnVuYyk6CisgICAgICAgIEB3cmFwcyhmdW5jKQorICAgICAgICBkZWYgd3JhcHBlcihzZWxmKToKKyAgICAgICAgICAgICNmb3JjaWJseSBjbG9zZSB0aGUgZmQgYmVmb3JlIGludm9raW5nIHRoZSBwcm9ibGVtIGZ1bmN0aW9uCisgICAgICAgICAgICBmID0gc2VsZi5mCisgICAgICAgICAgICBvcy5jbG9zZShmLmZpbGVubygpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZ1bmMoc2VsZiwgZikKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVycm5vLCBlcnJuby5FQkFERikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgSU9FcnJvciIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gd3JhcHBlcgorCisgICAgQENsb3NlZEZEUmFpc2VzCisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2Uoc2VsZiwgZik6CisgICAgICAgIGYuY2xvc2UoKQorCisgICAgQENsb3NlZEZEUmFpc2VzCisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkV3JpdGUoc2VsZiwgZik6CisgICAgICAgIGYud3JpdGUoJ2EnKQorCisgICAgQENsb3NlZEZEUmFpc2VzCisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkU2VlayhzZWxmLCBmKToKKyAgICAgICAgZi5zZWVrKDApCisKKyAgICBAQ2xvc2VkRkRSYWlzZXMKKyAgICBkZWYgdGVzdEVycm5vT25DbG9zZWRUZWxsKHNlbGYsIGYpOgorICAgICAgICBmLnRlbGwoKQorCisgICAgQENsb3NlZEZEUmFpc2VzCisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkVHJ1bmNhdGUoc2VsZiwgZik6CisgICAgICAgIGYudHJ1bmNhdGUoMCkKKworICAgIEBDbG9zZWRGRAorICAgIGRlZiB0ZXN0RXJybm9PbkNsb3NlZFNlZWthYmxlKHNlbGYsIGYpOgorICAgICAgICBmLnNlZWthYmxlKCkKKworICAgIEBDbG9zZWRGRAorICAgIGRlZiB0ZXN0RXJybm9PbkNsb3NlZFJlYWRhYmxlKHNlbGYsIGYpOgorICAgICAgICBmLnJlYWRhYmxlKCkKKworICAgIEBDbG9zZWRGRAorICAgIGRlZiB0ZXN0RXJybm9PbkNsb3NlZFdyaXRhYmxlKHNlbGYsIGYpOgorICAgICAgICBmLndyaXRhYmxlKCkKKworICAgIEBDbG9zZWRGRAorICAgIGRlZiB0ZXN0RXJybm9PbkNsb3NlZEZpbGVubyhzZWxmLCBmKToKKyAgICAgICAgZi5maWxlbm8oKQorCisgICAgQENsb3NlZEZECisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkSXNhdHR5KHNlbGYsIGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuaXNhdHR5KCksIEZhbHNlKQorCisgICAgZGVmIFJlb3BlbkZvclJlYWQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmYgPSBfRmlsZUlPKFRFU1RGTiwgJ3InKQorICAgICAgICBvcy5jbG9zZShzZWxmLmYuZmlsZW5vKCkpCisgICAgICAgIHJldHVybiBzZWxmLmYKKworICAgIEBDbG9zZWRGRFJhaXNlcworICAgIGRlZiB0ZXN0RXJybm9PbkNsb3NlZFJlYWQoc2VsZiwgZik6CisgICAgICAgIGYgPSBzZWxmLlJlb3BlbkZvclJlYWQoKQorICAgICAgICBmLnJlYWQoMSkKKworICAgIEBDbG9zZWRGRFJhaXNlcworICAgIGRlZiB0ZXN0RXJybm9PbkNsb3NlZFJlYWRhbGwoc2VsZiwgZik6CisgICAgICAgIGYgPSBzZWxmLlJlb3BlbkZvclJlYWQoKQorICAgICAgICBmLnJlYWRhbGwoKQorCisgICAgQENsb3NlZEZEUmFpc2VzCisgICAgZGVmIHRlc3RFcnJub09uQ2xvc2VkUmVhZGludG8oc2VsZiwgZik6CisgICAgICAgIGYgPSBzZWxmLlJlb3BlbkZvclJlYWQoKQorICAgICAgICBhID0gYXJyYXkoYidiJywgYid4JyoxMCkKKyAgICAgICAgZi5yZWFkaW50byhhKQorCitjbGFzcyBPdGhlckZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEFibGVzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gX0ZpbGVJTyhURVNURk4sICJ3IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWthYmxlKCksIFRydWUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCAiciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGFibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgImErIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRhYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2Vla2FibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5pc2F0dHkoKSwgRmFsc2UpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICJ3aW4zMiI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmID0gX0ZpbGVJTygiL2Rldi90dHkiLCAiYSIpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgV2hlbiBydW4gaW4gYSBjcm9uIGpvYiB0aGVyZSBqdXN0IGFyZW4ndCBhbnkKKyAgICAgICAgICAgICAgICAgICAgIyB0dHlzLCBzbyBza2lwIHRoZSB0ZXN0LiAgVGhpcyBhbHNvIGhhbmRsZXMgb3RoZXIKKyAgICAgICAgICAgICAgICAgICAgIyBPUydlcyB0aGF0IGRvbid0IHN1cHBvcnQgL2Rldi90dHkuCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGFibGUoKSwgRmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gImRhcndpbiIgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgICAgJ2JzZCcgbm90IGluIHN5cy5wbGF0Zm9ybSBhbmQgXAorICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3N1bm9zJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIFNvbWVob3cgL2Rldi90dHkgYXBwZWFycyBzZWVrYWJsZSBvbiBzb21lIEJTRHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrYWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmlzYXR0eSgpLCBUcnVlKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdE1vZGVTdHJpbmdzKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGludmFsaWQgbW9kZSBzdHJpbmdzCisgICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIsICJydyIsICJydCIpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCclciBpcyBhbiBpbnZhbGlkIGZpbGUgbW9kZScgJSBtb2RlKQorCisgICAgZGVmIHRlc3RVbmljb2RlT3BlbihzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgcmVwciB3b3JrcyBmb3IgdW5pY29kZSB0b28KKyAgICAgICAgZiA9IF9GaWxlSU8oc3RyKFRFU1RGTiksICJ3IikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdEJ5dGVzT3BlbihzZWxmKToKKyAgICAgICAgIyBPcGVuaW5nIGEgYnl0ZXMgZmlsZW5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm4gPSBURVNURk4uZW5jb2RlKCJhc2NpaSIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAjIFNraXAgdGVzdAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYgPSBfRmlsZUlPKGZuLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoYiJhYmMiKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiYWJjIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVzdEludmFsaWRGZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX0ZpbGVJTywgLTEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBfRmlsZUlPLCBtYWtlX2JhZF9mZCgpKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIGltcG9ydCBtc3ZjcnQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIG1zdmNydC5nZXRfb3NmaGFuZGxlLCBtYWtlX2JhZF9mZCgpKQorICAgICAgICAjIElzc3VlIDE1OTg5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX0ZpbGVJTywgX3Rlc3RjYXBpLklOVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIF9GaWxlSU8sIF90ZXN0Y2FwaS5JTlRfTUlOIC0gMSkKKworICAgIGRlZiB0ZXN0QmFkTW9kZUFyZ3VtZW50KHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIGdldCBhIHNlbnNpYmxlIGVycm9yIG1lc3NhZ2UgZm9yIGJhZCBtb2RlIGFyZ3VtZW50CisgICAgICAgIGJhZF9tb2RlID0gInF3ZXJ0eSIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IF9GaWxlSU8oVEVTVEZOLCBiYWRfbW9kZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgbXNnOgorICAgICAgICAgICAgaWYgbXNnLmFyZ3NbMF0gIT0gMDoKKyAgICAgICAgICAgICAgICBzID0gc3RyKG1zZykKKyAgICAgICAgICAgICAgICBpZiBURVNURk4gaW4gcyBvciBiYWRfbW9kZSBub3QgaW4gczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJiYWQgZXJyb3IgbWVzc2FnZSBmb3IgaW52YWxpZCBtb2RlOiAlcyIgJSBzKQorICAgICAgICAgICAgIyBpZiBtc2cuYXJnc1swXSA9PSAwLCB3ZSdyZSBwcm9iYWJseSBvbiBXaW5kb3dzIHdoZXJlIHRoZXJlIG1heSBiZQorICAgICAgICAgICAgIyBubyBvYnZpb3VzIHdheSB0byBkaXNjb3ZlciB3aHkgb3BlbigpIGZhaWxlZC4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBlcnJvciBmb3IgaW52YWxpZCBtb2RlOiAlcyIgJSBiYWRfbW9kZSkKKworICAgIGRlZiB0ZXN0VHJ1bmNhdGUoc2VsZik6CisgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgJ3cnKQorICAgICAgICBmLndyaXRlKGJ5dGVzKGJ5dGVhcnJheShyYW5nZSgxMCkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMTApCisgICAgICAgIGYudHJ1bmNhdGUoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDAsIG9zLlNFRUtfRU5EKSwgNSkKKyAgICAgICAgZi50cnVuY2F0ZSgxNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCwgb3MuU0VFS19FTkQpLCAxNSkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRydW5jYXRlT25XaW5kb3dzKHNlbGYpOgorICAgICAgICBkZWYgYnVnODAxNjMxKCk6CisgICAgICAgICAgICAjIFNGIGJ1ZyA8aHR0cDovL3d3dy5weXRob24ub3JnL3NmLzgwMTYzMT4KKyAgICAgICAgICAgICMgImZpbGUudHJ1bmNhdGUgZmF1bHQgb24gd2luZG93cyIKKyAgICAgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgJ3cnKQorICAgICAgICAgICAgZi53cml0ZShieXRlcyhyYW5nZSgxMSkpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwncisnKQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCg1KQorICAgICAgICAgICAgaWYgZGF0YSAhPSBieXRlcyhyYW5nZSg1KSk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJSZWFkIG9uIGZpbGUgb3BlbmVkIGZvciB1cGRhdGUgZmFpbGVkICVyIiAlIGRhdGEpCisgICAgICAgICAgICBpZiBmLnRlbGwoKSAhPSA1OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRmlsZSBwb3MgYWZ0ZXIgcmVhZCB3cm9uZyAlZCIgJSBmLnRlbGwoKSkKKworICAgICAgICAgICAgZi50cnVuY2F0ZSgpCisgICAgICAgICAgICBpZiBmLnRlbGwoKSAhPSA1OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRmlsZSBwb3MgYWZ0ZXIgZnRydW5jYXRlIHdyb25nICVkIiAlIGYudGVsbCgpKQorCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNpemUgPSBvcy5wYXRoLmdldHNpemUoVEVTVEZOKQorICAgICAgICAgICAgaWYgc2l6ZSAhPSA1OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRmlsZSBzaXplIGFmdGVyIGZ0cnVuY2F0ZSB3cm9uZyAlZCIgJSBzaXplKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJ1ZzgwMTYzMSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIHRlc3RBcHBlbmQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3diJykKKyAgICAgICAgICAgIGYud3JpdGUoYidzcGFtJykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAnYWInKQorICAgICAgICAgICAgZi53cml0ZShiJ2VnZ3MnKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICdyYicpCisgICAgICAgICAgICBkID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBiJ3NwYW1lZ2dzJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0SW52YWxpZEluaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX0ZpbGVJTywgIjEiLCAwLCAwKQorCisgICAgZGVmIHRlc3RXYXJuaW5ncyhzZWxmKToKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncyhxdWlldD1UcnVlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Lndhcm5pbmdzLCBbXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX0ZpbGVJTywgW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcud2FybmluZ3MsIFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX0ZpbGVJTywgIi9zb21lL2ludmFsaWQvbmFtZSIsICJydCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcud2FybmluZ3MsIFtdKQorCisgICAgZGVmIHRlc3Rfc3Vycm9nYXRlcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODQzODogdHJ5IHRvIG9wZW4gYSBmaWxlbmFtZSBjb250YWluaW5nIHN1cnJvZ2F0ZXMuCisgICAgICAgICMgSXQgc2hvdWxkIGVpdGhlciBmYWlsIGJlY2F1c2UgdGhlIGZpbGUgZG9lc24ndCBleGlzdCBvciB0aGUgZmlsZW5hbWUKKyAgICAgICAgIyBjYW4ndCBiZSByZXByZXNlbnRlZCB1c2luZyB0aGUgZmlsZXN5c3RlbSBlbmNvZGluZywgYnV0IG5vdCBiZWNhdXNlCisgICAgICAgICMgb2YgYSBMb29rdXBFcnJvciBmb3IgdGhlIGVycm9yIGhhbmRsZXIgInN1cnJvZ2F0ZWVzY2FwZSIuCisgICAgICAgIGZpbGVuYW1lID0gdSdcdWRjODAudHh0JworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIF9GaWxlSU8oZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IChVbmljb2RlRW5jb2RlRXJyb3IsIElPRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFNwYXduIGEgc2VwYXJhdGUgUHl0aG9uIHByb2Nlc3Mgd2l0aCBhIGRpZmZlcmVudCAiZmlsZSBzeXN0ZW0KKyAgICAgICAgIyBkZWZhdWx0IGVuY29kaW5nIiwgdG8gZXhlcmNpc2UgdGhpcyBmdXJ0aGVyLgorICAgICAgICBlbnYgPSBkaWN0KG9zLmVudmlyb24pCisgICAgICAgIGVudltiJ0xDX0NUWVBFJ10gPSBiJ0MnCisgICAgICAgIF8sIG91dCA9IHJ1bl9weXRob24oJy1jJywgJ2ltcG9ydCBfaW87IF9pby5GaWxlSU8oJXIpJyAlIGZpbGVuYW1lLCBlbnY9ZW52KQorICAgICAgICBpZiAoJ1VuaWNvZGVFbmNvZGVFcnJvcicgbm90IGluIG91dCBhbmQgbm90CisgICAgICAgICAgICAgICAgKCAoJ0lPRXJyb3I6IFtFcnJubyAyXSBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5JyBpbiBvdXQpIG9yCisgICAgICAgICAgICAgICAgICAoJ0lPRXJyb3I6IFtFcnJubyAyMl0gSW52YWxpZCBhcmd1bWVudCcgaW4gb3V0KSApICk6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0JhZCBvdXRwdXQ6ICVyJyAlIG91dCkKKworICAgIGRlZiB0ZXN0VW5jbG9zZWRGRE9uRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBjbGFzcyBNeUV4Y2VwdGlvbihFeGNlcHRpb24pOiBwYXNzCisgICAgICAgIGNsYXNzIE15RmlsZUlPKF9GaWxlSU8pOgorICAgICAgICAgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBpZiBuYW1lID09ICJuYW1lIjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgTXlFeGNlcHRpb24oImJsb2NrZWQgc2V0dGluZyBuYW1lIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoTXlGaWxlSU8sIHNlbGYpLl9fc2V0YXR0cl9fKG5hbWUsIHZhbHVlKQorICAgICAgICBmZCA9IG9zLm9wZW4oX19maWxlX18sIG9zLk9fUkRPTkxZKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhNeUV4Y2VwdGlvbiwgTXlGaWxlSU8sIGZkKQorICAgICAgICBvcy5jbG9zZShmZCkgICMgc2hvdWxkIG5vdCByYWlzZSBPU0Vycm9yKEVCQURGKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyBIaXN0b3JpY2FsbHksIHRoZXNlIHRlc3RzIGhhdmUgYmVlbiBzbG9wcHkgYWJvdXQgcmVtb3ZpbmcgVEVTVEZOLgorICAgICMgU28gZ2V0IHJpZCBvZiBpdCBubyBtYXR0ZXIgd2hhdC4KKyAgICB0cnk6CisgICAgICAgIHJ1bl91bml0dGVzdChBdXRvRmlsZVRlc3RzLCBPdGhlckZpbGVUZXN0cykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlM2QzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpby5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmlsZWlvLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZlM2QzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZpbGVpby5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmxvYXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbG9hdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjQ2MzcxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZmxvYXQucHkKQEAgLTAsMCArMSwxNDAyIEBACisKK2ltcG9ydCB1bml0dGVzdCwgc3RydWN0CitpbXBvcnQgb3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgbWF0aAorZnJvbSBtYXRoIGltcG9ydCBpc2luZiwgaXNuYW4sIGNvcHlzaWduLCBsZGV4cAoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgZnJhY3Rpb25zCitpbXBvcnQgc3lzCisKK0lORiA9IGZsb2F0KCJpbmYiKQorTkFOID0gZmxvYXQoIm5hbiIpCisKK2hhdmVfZ2V0Zm9ybWF0ID0gaGFzYXR0cihmbG9hdCwgIl9fZ2V0Zm9ybWF0X18iKQorcmVxdWlyZXNfZ2V0Zm9ybWF0ID0gdW5pdHRlc3Quc2tpcFVubGVzcyhoYXZlX2dldGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVzIF9fZ2V0Zm9ybWF0X18iKQorcmVxdWlyZXNfc2V0Zm9ybWF0ID0gdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKGZsb2F0LCAiX19zZXRmb3JtYXRfXyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZXMgX19zZXRmb3JtYXRfXyIpCisjIGRlY29yYXRvciBmb3Igc2tpcHBpbmcgdGVzdHMgb24gbm9uLUlFRUUgNzU0IHBsYXRmb3JtcworcmVxdWlyZXNfSUVFRV83NTQgPSB1bml0dGVzdC5za2lwVW5sZXNzKGhhdmVfZ2V0Zm9ybWF0IGFuZAorICAgIGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKworI2xvY2F0ZSBmaWxlIHdpdGggZmxvYXQgZm9ybWF0IHRlc3QgdmFsdWVzCit0ZXN0X2RpciA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyCitmb3JtYXRfdGVzdGZpbGUgPSBvcy5wYXRoLmpvaW4odGVzdF9kaXIsICdmb3JtYXRmbG9hdF90ZXN0Y2FzZXMudHh0JykKKworY2xhc3MgR2VuZXJhbEZsb2F0Q2FzZXModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoMy4xNCksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoMzE0KSwgMzE0LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoMzE0TCksIDMxNC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIDMuMTQgICIpLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgMHgzLjEgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAtMHgzLnAtMSAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgICsweDMucC0xICAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIisrMy4xNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiKy0zLjE0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICItKzMuMTQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIi0tMy4xNCIpCisgICAgICAgICMgY2hlY2sgdGhhdCB3ZSBkb24ndCBhY2NlcHQgYWx0ZXJuYXRlIGV4cG9uZW50IG1hcmtlcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICItMS43ZDI5IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIzRC0xNCIpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHVuaWNvZGUoIiAgMy4xNCAgIikpLCAzLjE0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh1bmljb2RlKCIgIFx1MDY2My5cdTA2NjFcdTA2NjQgICIsJ3Jhdy11bmljb2RlLWVzY2FwZScpKSwgMy4xNCkKKworICAgICAgICAjIGV4dHJhIGxvbmcgc3RyaW5ncyBzaG91bGQgbm8gbG9uZ2VyIGJlIGEgcHJvYmxlbQorICAgICAgICAjIChpbiAyLjYsIGxvbmcgdW5pY29kZSBpbnB1dHMgdG8gZmxvYXQgcmFpc2VkIFZhbHVlRXJyb3IpCisgICAgICAgIGZsb2F0KCcuJyArICcxJyoxMDAwKQorICAgICAgICBmbG9hdCh1bmljb2RlKCcuJyArICcxJyoxMDAwKSkKKworICAgIGRlZiBjaGVja19jb252ZXJzaW9uX3RvX2ludChzZWxmLCB4KToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBpbnQoeCkgaGFzIHRoZSBjb3JyZWN0IHZhbHVlIGFuZCB0eXBlLCBmb3IgYSBmbG9hdCB4LiIiIgorICAgICAgICBuID0gaW50KHgpCisgICAgICAgIGlmIHggPj0gMC4wOgorICAgICAgICAgICAgIyB4ID49IDAgYW5kIG4gPSBpbnQoeCkgID09PiAgbiA8PSB4IDwgbiArIDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKG4sIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3MoeCwgbiArIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHggPCAwIGFuZCBuID0gaW50KHgpICA9PT4gIG4gPj0geCA+IG4gLSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChuLCB4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKHgsIG4gLSAxKQorCisgICAgICAgICMgUmVzdWx0IHNob3VsZCBiZSBhbiBpbnQgaWYgd2l0aGluIHJhbmdlLCBlbHNlIGEgbG9uZy4KKyAgICAgICAgaWYgLXN5cy5tYXhpbnQtMSA8PSBuIDw9IHN5cy5tYXhpbnQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobiksIGludCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShuKSwgbG9uZykKKworICAgICAgICAjIERvdWJsZSBjaGVjay4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGludChuKSksIHR5cGUobikpCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9uX3RvX2ludChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGZsb2F0cyB3aXRoaW4gdGhlIHJhbmdlIG9mIGFuIGludCBjb252ZXJ0IHRvIHR5cGUKKyAgICAgICAgIyBpbnQsIG5vdCBsb25nLiAgKGlzc3VlICMxMTE0NC4pCisgICAgICAgIGJvdW5kYXJ5ID0gZmxvYXQoc3lzLm1heGludCArIDEpCisgICAgICAgIGVwc2lsb24gPSAyKiotc3lzLmZsb2F0X2luZm8ubWFudF9kaWcgKiBib3VuZGFyeQorCisgICAgICAgICMgVGhlc2UgMiBmbG9hdHMgYXJlIGVpdGhlciBzaWRlIG9mIHRoZSBwb3NpdGl2ZSBpbnQvbG9uZyBib3VuZGFyeSBvbgorICAgICAgICAjIGJvdGggMzItYml0IGFuZCA2NC1iaXQgc3lzdGVtcy4KKyAgICAgICAgc2VsZi5jaGVja19jb252ZXJzaW9uX3RvX2ludChib3VuZGFyeSAtIGVwc2lsb24pCisgICAgICAgIHNlbGYuY2hlY2tfY29udmVyc2lvbl90b19pbnQoYm91bmRhcnkpCisKKyAgICAgICAgIyBUaGVzZSBmbG9hdHMgYXJlIGVpdGhlciBzaWRlIG9mIHRoZSBuZWdhdGl2ZSBsb25nL2ludCBib3VuZGFyeSBvbgorICAgICAgICAjIDY0LWJpdCBzeXN0ZW1zLi4uCisgICAgICAgIHNlbGYuY2hlY2tfY29udmVyc2lvbl90b19pbnQoLWJvdW5kYXJ5IC0gMiplcHNpbG9uKQorICAgICAgICBzZWxmLmNoZWNrX2NvbnZlcnNpb25fdG9faW50KC1ib3VuZGFyeSkKKworICAgICAgICAjIC4uLiBhbmQgdGhlc2Ugb25lcyBhcmUgZWl0aGVyIHNpZGUgb2YgdGhlIG5lZ2F0aXZlIGxvbmcvaW50CisgICAgICAgICMgYm91bmRhcnkgb24gMzItYml0IHN5c3RlbXMuCisgICAgICAgIHNlbGYuY2hlY2tfY29udmVyc2lvbl90b19pbnQoLWJvdW5kYXJ5IC0gMS4wKQorICAgICAgICBzZWxmLmNoZWNrX2NvbnZlcnNpb25fdG9faW50KC1ib3VuZGFyeSAtIDEuMCArIDIqZXBzaWxvbikKKworICAgIEB0ZXN0X3N1cHBvcnQucnVuX3dpdGhfbG9jYWxlKCdMQ19OVU1FUklDJywgJ2ZyX0ZSJywgJ2RlX0RFJykKKyAgICBkZWYgdGVzdF9mbG9hdF93aXRoX2NvbW1hKHNlbGYpOgorICAgICAgICAjIHNldCBsb2NhbGUgdG8gc29tZXRoaW5nIHRoYXQgZG9lc24ndCB1c2UgJy4nIGZvciB0aGUgZGVjaW1hbCBwb2ludAorICAgICAgICAjIGZsb2F0IG11c3Qgbm90IGFjY2VwdCB0aGUgbG9jYWxlIHNwZWNpZmljIGRlY2ltYWwgcG9pbnQgYnV0CisgICAgICAgICMgaXQgc3RpbGwgaGFzIHRvIGFjY2VwdCB0aGUgbm9ybWFsIHB5dGhvbiBzeW50YXgKKyAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICBpZiBub3QgbG9jYWxlLmxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddID09ICcsJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMy4xNCAgIiksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiszLjE0ICAiKSwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiLTMuMTQgICIpLCAtMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiLjE0ICAiKSwgLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIzLiAgIiksIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiMy5lMyAgIiksIDMwMDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiMy4yZTMgICIpLCAzMjAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjIuNWUtMSAgIiksIDAuMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjVlLTEiKSwgMC41KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgMywxNCAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgICszLDE0ICAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgLTMsMTQgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAweDMuMSAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIC0weDMucC0xICAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgKzB4My5wLTEgICIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMjUuZS0xICAiKSwgMi41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3Rfc3VwcG9ydC5mY21wKGZsb2F0KCIgIC4yNWUtMSAgIiksIC4wMjUpLCAwKQorCisgICAgZGVmIHRlc3RfZmxvYXRjb252ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGNhbGxzIHRvIF9fZmxvYXRfXygpIHdvcmsgcHJvcGVybHkKKyAgICAgICAgY2xhc3MgRm9vMDoKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyLgorCisgICAgICAgIGNsYXNzIEZvbzEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyLgorCisgICAgICAgIGNsYXNzIEZvbzIoZmxvYXQpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIuCisKKyAgICAgICAgY2xhc3MgRm9vMyhmbG9hdCk6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIHZhbHVlPTAuKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZmxvYXQuX19uZXdfXyhjbHMsIDIqdmFsdWUpCisKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBjbGFzcyBGb280KGZsb2F0KToKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgIyBJc3N1ZSA1NzU5OiBfX2Zsb2F0X18gbm90IGNhbGxlZCBvbiBzdHIgc3ViY2xhc3NlcyAodGhvdWdoIGl0IGlzIG9uCisgICAgICAgICMgdW5pY29kZSBzdWJjbGFzc2VzKS4KKyAgICAgICAgY2xhc3MgRm9vU3RyKHN0cik6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdChzdHIoc2VsZikpICsgMQorCisgICAgICAgIGNsYXNzIEZvb1VuaWNvZGUodW5pY29kZSk6CisgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdCh1bmljb2RlKHNlbGYpKSArIDEKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzAoKSksIDQyLikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb28xKCkpLCA0Mi4pCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoRm9vMigpKSwgNDIuKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZsb2F0KEZvbzMoMjEpKSwgNDIuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZsb2F0LCBGb280KDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb29Vbmljb2RlKCc4JykpLCA5LikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmbG9hdChGb29TdHIoJzgnKSksIDkuKQorCisgICAgZGVmIHRlc3RfaXNfaW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgoMS4xKS5pc19pbnRlZ2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoMS4pLmlzX2ludGVnZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmbG9hdCgibmFuIikuaXNfaW50ZWdlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZsb2F0KCJpbmYiKS5pc19pbnRlZ2VyKCkpCisKKyAgICBkZWYgdGVzdF9mbG9hdGFzcmF0aW8oc2VsZik6CisgICAgICAgIGZvciBmLCByYXRpbyBpbiBbCisgICAgICAgICAgICAgICAgKDAuODc1LCAoNywgOCkpLAorICAgICAgICAgICAgICAgICgtMC44NzUsICgtNywgOCkpLAorICAgICAgICAgICAgICAgICgwLjAsICgwLCAxKSksCisgICAgICAgICAgICAgICAgKDExLjUsICgyMywgMikpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5hc19pbnRlZ2VyX3JhdGlvKCksIHJhdGlvKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDAwKToKKyAgICAgICAgICAgIGYgPSByYW5kb20ucmFuZG9tKCkKKyAgICAgICAgICAgIGYgKj0gMTAgKiogcmFuZG9tLnJhbmRpbnQoLTEwMCwgMTAwKQorICAgICAgICAgICAgbiwgZCA9IGYuYXNfaW50ZWdlcl9yYXRpbygpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KG4pLl9fdHJ1ZWRpdl9fKGQpLCBmKQorCisgICAgICAgIFIgPSBmcmFjdGlvbnMuRnJhY3Rpb24KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFIoKmZsb2F0KDAuMCkuYXNfaW50ZWdlcl9yYXRpbygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSKDUsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFIoKmZsb2F0KDIuNSkuYXNfaW50ZWdlcl9yYXRpbygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSKDEsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFIoKmZsb2F0KDAuNSkuYXNfaW50ZWdlcl9yYXRpbygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSKDQ3Mjg3Nzk2MDg3MzkwMjEsIDIyNTE3OTk4MTM2ODUyNDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFIoKmZsb2F0KDIuMSkuYXNfaW50ZWdlcl9yYXRpbygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChSKC00NzI4Nzc5NjA4NzM5MDIxLCAyMjUxNzk5ODEzNjg1MjQ4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSKCpmbG9hdCgtMi4xKS5hc19pbnRlZ2VyX3JhdGlvKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFIoLTIxMDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFIoKmZsb2F0KC0yMTAwLjApLmFzX2ludGVnZXJfcmF0aW8oKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZmxvYXQoJ2luZicpLmFzX2ludGVnZXJfcmF0aW8pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0KCctaW5mJykuYXNfaW50ZWdlcl9yYXRpbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQoJ25hbicpLmFzX2ludGVnZXJfcmF0aW8pCisKKyAgICBkZWYgYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24oc2VsZiwgYSwgYik6CisgICAgICAgICMgZmFpbCB1bmxlc3MgYSA9PSBiIGFuZCBhIGFuZCBiIGhhdmUgdGhlIHNhbWUgc2lnbiBiaXQ7CisgICAgICAgICMgdGhlIG9ubHkgZGlmZmVyZW5jZSBmcm9tIGFzc2VydEVxdWFsIGlzIHRoYXQgdGhpcyB0ZXN0CisgICAgICAgICMgZGlzdGluZ3Vpc2hlcyAtMC4wIGFuZCAwLjAuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEsIGNvcHlzaWduKDEuMCwgYSkpLCAoYiwgY29weXNpZ24oMS4wLCBiKSkpCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBkZWYgdGVzdF9mbG9hdF9tb2Qoc2VsZik6CisgICAgICAgICMgQ2hlY2sgYmVoYXZpb3VyIG9mICUgb3BlcmF0b3IgZm9yIElFRUUgNzU0IHNwZWNpYWwgY2FzZXMuCisgICAgICAgICMgSW4gcGFydGljdWxhciwgY2hlY2sgc2lnbnMgb2YgemVyb3MuCisgICAgICAgIG1vZCA9IG9wZXJhdG9yLm1vZAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24obW9kKC0xLjAsIDEuMCksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoLTFlLTEwMCwgMS4wKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgtMC4wLCAxLjApLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24obW9kKDAuMCwgMS4wKSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgxZS0xMDAsIDEuMCksIDFlLTEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoMS4wLCAxLjApLCAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoLTEuMCwgLTEuMCksIC0wLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24obW9kKC0xZS0xMDAsIC0xLjApLCAtMWUtMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKG1vZCgtMC4wLCAtMS4wKSwgLTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoMC4wLCAtMS4wKSwgLTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoMWUtMTAwLCAtMS4wKSwgLTEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihtb2QoMS4wLCAtMS4wKSwgLTAuMCkKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X2Zsb2F0X3BvdyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGJ1aWx0aW4gcG93IGFuZCAqKiBvcGVyYXRvciBmb3IgSUVFRSA3NTQgc3BlY2lhbCBjYXNlcy4KKyAgICAgICAgIyBTcGVjaWFsIGNhc2VzIHRha2VuIGZyb20gc2VjdGlvbiBGLjkuNC40IG9mIHRoZSBDOTkgc3BlY2lmaWNhdGlvbgorCisgICAgICAgIGZvciBwb3dfb3AgaW4gcG93LCBvcGVyYXRvci5wb3c6CisgICAgICAgICAgICAjIHgqKk5BTiBpcyBOQU4gZm9yIGFueSB4IGV4Y2VwdCAxCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKC1JTkYsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcCgtMi4wLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoLTEuMCwgTkFOKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKC0wLjUsIE5BTikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcCgtMC4wLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoMC4wLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoMC41LCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoMi4wLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoSU5GLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoTkFOLCBOQU4pKSkKKworICAgICAgICAgICAgIyBOQU4qKnkgaXMgTkFOIGZvciBhbnkgeSBleGNlcHQgKy0wCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKE5BTiwgLUlORikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChOQU4sIC0yLjApKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihwb3dfb3AoTkFOLCAtMS4wKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4ocG93X29wKE5BTiwgLTAuNSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChOQU4sIDAuNSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChOQU4sIDEuMCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChOQU4sIDIuMCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKHBvd19vcChOQU4sIElORikpKQorCisgICAgICAgICAgICAjICgrLTApKip5IHJhaXNlcyBaZXJvRGl2aXNpb25FcnJvciBmb3IgeSBhIG5lZ2F0aXZlIG9kZCBpbnRlZ2VyCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcG93X29wLCAtMC4wLCAtMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHBvd19vcCwgMC4wLCAtMS4wKQorCisgICAgICAgICAgICAjICgrLTApKip5IHJhaXNlcyBaZXJvRGl2aXNpb25FcnJvciBmb3IgeSBmaW5pdGUgYW5kIG5lZ2F0aXZlCisgICAgICAgICAgICAjIGJ1dCBub3QgYW4gb2RkIGludGVnZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBwb3dfb3AsIC0wLjAsIC0yLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcG93X29wLCAtMC4wLCAtMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHBvd19vcCwgMC4wLCAtMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHBvd19vcCwgMC4wLCAtMC41KQorCisgICAgICAgICAgICAjICgrLTApKip5IGlzICstMCBmb3IgeSBhIHBvc2l0aXZlIG9kZCBpbnRlZ2VyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC4wLCAxLjApLCAtMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC4wLCAxLjApLCAwLjApCisKKyAgICAgICAgICAgICMgKCstMCkqKnkgaXMgMCBmb3IgeSBmaW5pdGUgYW5kIHBvc2l0aXZlIGJ1dCBub3QgYW4gb2RkIGludGVnZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjAsIDAuNSksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjAsIDIuMCksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuMCwgMC41KSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC4wLCAyLjApLCAwLjApCisKKyAgICAgICAgICAgICMgKC0xKSoqKy1pbmYgaXMgMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgLUlORiksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIElORiksIDEuMCkKKworICAgICAgICAgICAgIyAxKip5IGlzIDEgZm9yIGFueSB5LCBldmVuIGlmIHkgaXMgYW4gaW5maW5pdHkgb3IgbmFuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIC1JTkYpLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIC0yLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIC0xLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIC0wLjUpLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIC0wLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgMC41KSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMS4wLCAxLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIDIuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgSU5GKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMS4wLCBOQU4pLCAxLjApCisKKyAgICAgICAgICAgICMgeCoqKy0wIGlzIDEgZm9yIGFueSB4LCBldmVuIGlmIHggaXMgYSB6ZXJvLCBpbmZpbml0eSwgb3IgbmFuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtSU5GLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMS4wLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC41LCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC4wLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuNSwgMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMS4wLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgyLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKElORiwgMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoTkFOLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtSU5GLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTIuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIC0wLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMC41LCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuNSwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKElORiwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKE5BTiwgLTAuMCksIDEuMCkKKworICAgICAgICAgICAgIyB4Kip5IHJhaXNlcyBWYWx1ZUVycm9yIGZvciBmaW5pdGUgbmVnYXRpdmUgeCBhbmQgbm9uLWludGVncmFsIHkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvd19vcCwgLTIuMCwgLTAuNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvd19vcCwgLTIuMCwgMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93X29wLCAtMS4wLCAtMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93X29wLCAtMS4wLCAwLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3dfb3AsIC0wLjUsIC0wLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3dfb3AsIC0wLjUsIDAuNSkKKworICAgICAgICAgICAgIyB4KiotSU5GIGlzIElORiBmb3IgYWJzKHgpIDwgMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuNSwgLUlORiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjAsIC1JTkYpLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjAsIC1JTkYpLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjUsIC1JTkYpLCBJTkYpCisKKyAgICAgICAgICAgICMgeCoqLUlORiBpcyAwIGZvciBhYnMoeCkgPiAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtSU5GLCAtSU5GKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTIuMCwgLUlORiksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgLUlORiksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKElORiwgLUlORiksIDAuMCkKKworICAgICAgICAgICAgIyB4KipJTkYgaXMgMCBmb3IgYWJzKHgpIDwgMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuNSwgSU5GKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuMCwgSU5GKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC4wLCBJTkYpLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjUsIElORiksIDAuMCkKKworICAgICAgICAgICAgIyB4KipJTkYgaXMgSU5GIGZvciBhYnMoeCkgPiAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtSU5GLCBJTkYpLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCBJTkYpLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgyLjAsIElORiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKElORiwgSU5GKSwgSU5GKQorCisgICAgICAgICAgICAjICgtSU5GKSoqeSBpcyAtMC4wIGZvciB5IGEgbmVnYXRpdmUgb2RkIGludGVnZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIC0xLjApLCAtMC4wKQorCisgICAgICAgICAgICAjICgtSU5GKSoqeSBpcyAwLjAgZm9yIHkgbmVnYXRpdmUgYnV0IG5vdCBhbiBvZGQgaW50ZWdlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLUlORiwgLTAuNSksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIC0yLjApLCAwLjApCisKKyAgICAgICAgICAgICMgKC1JTkYpKip5IGlzIC1JTkYgZm9yIHkgYSBwb3NpdGl2ZSBvZGQgaW50ZWdlcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLUlORiwgMS4wKSwgLUlORikKKworICAgICAgICAgICAgIyAoLUlORikqKnkgaXMgSU5GIGZvciB5IHBvc2l0aXZlIGJ1dCBub3QgYW4gb2RkIGludGVnZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIDAuNSksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC1JTkYsIDIuMCksIElORikKKworICAgICAgICAgICAgIyBJTkYqKnkgaXMgSU5GIGZvciB5IHBvc2l0aXZlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcChJTkYsIDAuNSksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKElORiwgMS4wKSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAyLjApLCBJTkYpCisKKyAgICAgICAgICAgICMgSU5GKip5IGlzIDAuMCBmb3IgeSBuZWdhdGl2ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAtMi4wKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAtMS4wKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoSU5GLCAtMC41KSwgMC4wKQorCisgICAgICAgICAgICAjIGJhc2ljIGNoZWNrcyBub3QgY292ZXJlZCBieSB0aGUgc3BlY2lhbCBjYXNlcyBhYm92ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTIuMCwgLTIuMCksIDAuMjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAtMS4wKSwgLTAuNSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIC0wLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAxLjApLCAtMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTIuMCwgMi4wKSwgNC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgLTIuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIC0xLjApLCAtMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTEuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIDAuMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0xLjAsIDEuMCksIC0xLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMS4wLCAyLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgyLjAsIC0yLjApLCAwLjI1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAtMS4wKSwgMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAtMC4wKSwgMS4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMi4wLCAwLjApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgyLjAsIDEuMCksIDIuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgMi4wKSwgNC4wKQorCisgICAgICAgICAgICAjIDEgKiogbGFyZ2UgYW5kIC0xICoqIGxhcmdlOyBzb21lIGxpYm1zIGFwcGFyZW50bHkKKyAgICAgICAgICAgICMgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoZXNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgxLjAsIC0xZTEwMCksIDEuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDEuMCwgMWUxMDApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMS4wLCAtMWUxMDApLCAxLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMS4wLCAxZTEwMCksIDEuMCkKKworICAgICAgICAgICAgIyBjaGVjayBzaWduIGZvciByZXN1bHRzIHRoYXQgdW5kZXJmbG93IHRvIDAKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0yLjAsIC0yMDAwLjApLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwb3dfb3AsIC0yLjAsIC0yMDAwLjUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgtMi4wLCAtMjAwMS4wKSwgLTAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgLTIwMDAuMCksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgLTIwMDAuNSksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDIuMCwgLTIwMDEuMCksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKC0wLjUsIDIwMDAuMCksIDAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvd19vcCwgLTAuNSwgMjAwMC41KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoLTAuNSwgMjAwMS4wKSwgLTAuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxBbmRFcXVhbFNpZ24ocG93X29wKDAuNSwgMjAwMC4wKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEFuZEVxdWFsU2lnbihwb3dfb3AoMC41LCAyMDAwLjUpLCAwLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsQW5kRXF1YWxTaWduKHBvd19vcCgwLjUsIDIwMDEuMCksIDAuMCkKKworICAgICAgICAgICAgIyBjaGVjayB3ZSBkb24ndCByYWlzZSBhbiBleGNlcHRpb24gZm9yIHN1Ym5vcm1hbCByZXN1bHRzLAorICAgICAgICAgICAgIyBhbmQgdmFsaWRhdGUgc2lnbnMuICBUZXN0cyBjdXJyZW50bHkgZGlzYWJsZWQsIHNpbmNlCisgICAgICAgICAgICAjIHRoZXkgZmFpbCBvbiBzeXN0ZW1zIHdoZXJlIGEgc3Vibm9ybWFsIHJlc3VsdCBmcm9tIHBvdworICAgICAgICAgICAgIyBpcyBmbHVzaGVkIHRvIHplcm8gKGUuZy4gRGViaWFuL2lhNjQuKQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZSgwLjAgPCBwb3dfb3AoMC41LCAxMDQ4KSA8IDFlLTMxNSkKKyAgICAgICAgICAgICNzZWxmLmFzc2VydFRydWUoMC4wIDwgcG93X29wKC0wLjUsIDEwNDgpIDwgMWUtMzE1KQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZSgwLjAgPCBwb3dfb3AoMC41LCAxMDQ3KSA8IDFlLTMxNSkKKyAgICAgICAgICAgICNzZWxmLmFzc2VydFRydWUoMC4wID4gcG93X29wKC0wLjUsIDEwNDcpID4gLTFlLTMxNSkKKyAgICAgICAgICAgICNzZWxmLmFzc2VydFRydWUoMC4wIDwgcG93X29wKDIuMCwgLTEwNDgpIDwgMWUtMzE1KQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZSgwLjAgPCBwb3dfb3AoLTIuMCwgLTEwNDgpIDwgMWUtMzE1KQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZSgwLjAgPCBwb3dfb3AoMi4wLCAtMTA0NykgPCAxZS0zMTUpCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKDAuMCA+IHBvd19vcCgtMi4wLCAtMTA0NykgPiAtMWUtMzE1KQorCisKK0ByZXF1aXJlc19zZXRmb3JtYXQKK2NsYXNzIEZvcm1hdEZ1bmN0aW9uc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zYXZlX2Zvcm1hdHMgPSB7J2RvdWJsZSc6ZmxvYXQuX19nZXRmb3JtYXRfXygnZG91YmxlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmbG9hdCc6ZmxvYXQuX19nZXRmb3JtYXRfXygnZmxvYXQnKX0KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZmxvYXQuX19zZXRmb3JtYXRfXygnZG91YmxlJywgc2VsZi5zYXZlX2Zvcm1hdHNbJ2RvdWJsZSddKQorICAgICAgICBmbG9hdC5fX3NldGZvcm1hdF9fKCdmbG9hdCcsIHNlbGYuc2F2ZV9mb3JtYXRzWydmbG9hdCddKQorCisgICAgZGVmIHRlc3RfZ2V0Zm9ybWF0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEluKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2RvdWJsZScpLAorICAgICAgICAgICAgICAgICAgICAgIFsndW5rbm93bicsICdJRUVFLCBiaWctZW5kaWFuJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihmbG9hdC5fX2dldGZvcm1hdF9fKCdmbG9hdCcpLAorICAgICAgICAgICAgICAgICAgICAgIFsndW5rbm93bicsICdJRUVFLCBiaWctZW5kaWFuJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQuX19nZXRmb3JtYXRfXywgJ2NoaWNrZW4nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZsb2F0Ll9fZ2V0Zm9ybWF0X18sIDEpCisKKyAgICBkZWYgdGVzdF9zZXRmb3JtYXQoc2VsZik6CisgICAgICAgIGZvciB0IGluICdkb3VibGUnLCAnZmxvYXQnOgorICAgICAgICAgICAgZmxvYXQuX19zZXRmb3JtYXRfXyh0LCAndW5rbm93bicpCisgICAgICAgICAgICBpZiBzZWxmLnNhdmVfZm9ybWF0c1t0XSA9PSAnSUVFRSwgYmlnLWVuZGlhbic6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQuX19zZXRmb3JtYXRfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCAnSUVFRSwgbGl0dGxlLWVuZGlhbicpCisgICAgICAgICAgICBlbGlmIHNlbGYuc2F2ZV9mb3JtYXRzW3RdID09ICdJRUVFLCBsaXR0bGUtZW5kaWFuJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdC5fX3NldGZvcm1hdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQsICdJRUVFLCBiaWctZW5kaWFuJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQuX19zZXRmb3JtYXRfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCAnSUVFRSwgYmlnLWVuZGlhbicpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQuX19zZXRmb3JtYXRfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LCAnSUVFRSwgbGl0dGxlLWVuZGlhbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdC5fX3NldGZvcm1hdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCwgJ2NoaWNrZW4nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdC5fX3NldGZvcm1hdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnY2hpY2tlbicsICd1bmtub3duJykKKworQkVfRE9VQkxFX0lORiA9ICdceDdmXHhmMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKK0xFX0RPVUJMRV9JTkYgPSAnJy5qb2luKHJldmVyc2VkKEJFX0RPVUJMRV9JTkYpKQorQkVfRE9VQkxFX05BTiA9ICdceDdmXHhmOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKK0xFX0RPVUJMRV9OQU4gPSAnJy5qb2luKHJldmVyc2VkKEJFX0RPVUJMRV9OQU4pKQorCitCRV9GTE9BVF9JTkYgPSAnXHg3Zlx4ODBceDAwXHgwMCcKK0xFX0ZMT0FUX0lORiA9ICcnLmpvaW4ocmV2ZXJzZWQoQkVfRkxPQVRfSU5GKSkKK0JFX0ZMT0FUX05BTiA9ICdceDdmXHhjMFx4MDBceDAwJworTEVfRkxPQVRfTkFOID0gJycuam9pbihyZXZlcnNlZChCRV9GTE9BVF9OQU4pKQorCisjIG9uIG5vbi1JRUVFIHBsYXRmb3JtcywgYXR0ZW1wdGluZyB0byB1bnBhY2sgYSBiaXQgcGF0dGVybgorIyByZXByZXNlbnRpbmcgYW4gaW5maW5pdHkgb3IgYSBOYU4gc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKworQHJlcXVpcmVzX3NldGZvcm1hdAorY2xhc3MgVW5rbm93bkZvcm1hdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2F2ZV9mb3JtYXRzID0geydkb3VibGUnOmZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2RvdWJsZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmxvYXQnOmZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2Zsb2F0Jyl9CisgICAgICAgIGZsb2F0Ll9fc2V0Zm9ybWF0X18oJ2RvdWJsZScsICd1bmtub3duJykKKyAgICAgICAgZmxvYXQuX19zZXRmb3JtYXRfXygnZmxvYXQnLCAndW5rbm93bicpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZsb2F0Ll9fc2V0Zm9ybWF0X18oJ2RvdWJsZScsIHNlbGYuc2F2ZV9mb3JtYXRzWydkb3VibGUnXSkKKyAgICAgICAgZmxvYXQuX19zZXRmb3JtYXRfXygnZmxvYXQnLCBzZWxmLnNhdmVfZm9ybWF0c1snZmxvYXQnXSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9zcGVjaWFsc19kb250X3VucGFjayhzZWxmKToKKyAgICAgICAgZm9yIGZtdCwgZGF0YSBpbiBbKCc+ZCcsIEJFX0RPVUJMRV9JTkYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJz5kJywgQkVfRE9VQkxFX05BTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPGQnLCBMRV9ET1VCTEVfSU5GKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8ZCcsIExFX0RPVUJMRV9OQU4pXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cnVjdC51bnBhY2ssIGZtdCwgZGF0YSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0X3NwZWNpYWxzX2RvbnRfdW5wYWNrKHNlbGYpOgorICAgICAgICBmb3IgZm10LCBkYXRhIGluIFsoJz5mJywgQkVfRkxPQVRfSU5GKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc+ZicsIEJFX0ZMT0FUX05BTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPGYnLCBMRV9GTE9BVF9JTkYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJzxmJywgTEVfRkxPQVRfTkFOKV06CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJ1Y3QudW5wYWNrLCBmbXQsIGRhdGEpCisKKworIyBvbiBhbiBJRUVFIHBsYXRmb3JtLCBhbGwgd2UgZ3VhcmFudGVlIGlzIHRoYXQgYml0IHBhdHRlcm5zCisjIHJlcHJlc2VudGluZyBpbmZpbml0aWVzIG9yIE5hTnMgZG8gbm90IHJhaXNlIGFuIGV4Y2VwdGlvbjsgYWxsIGVsc2UKKyMgaXMgYWNjaWRlbnQgKHRvZGF5KS4KKyMgbGV0J3MgYWxzbyB0cnkgdG8gZ3VhcmFudGVlIHRoYXQgLTAuMCBhbmQgMC4wIGRvbid0IGdldCBjb25mdXNlZC4KKworY2xhc3MgSUVFRUZvcm1hdFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X2RvdWJsZV9zcGVjaWFsc19kb191bnBhY2soc2VsZik6CisgICAgICAgIGZvciBmbXQsIGRhdGEgaW4gWygnPmQnLCBCRV9ET1VCTEVfSU5GKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc+ZCcsIEJFX0RPVUJMRV9OQU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJzxkJywgTEVfRE9VQkxFX0lORiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPGQnLCBMRV9ET1VCTEVfTkFOKV06CisgICAgICAgICAgICBzdHJ1Y3QudW5wYWNrKGZtdCwgZGF0YSkKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X2Zsb2F0X3NwZWNpYWxzX2RvX3VucGFjayhzZWxmKToKKyAgICAgICAgZm9yIGZtdCwgZGF0YSBpbiBbKCc+ZicsIEJFX0ZMT0FUX0lORiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnPmYnLCBCRV9GTE9BVF9OQU4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJzxmJywgTEVfRkxPQVRfSU5GKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc8ZicsIExFX0ZMT0FUX05BTildOgorICAgICAgICAgICAgc3RydWN0LnVucGFjayhmbXQsIGRhdGEpCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBkZWYgdGVzdF9uZWdhdGl2ZV96ZXJvKHNlbGYpOgorICAgICAgICBkZWYgcG9zX3BvcygpOgorICAgICAgICAgICAgcmV0dXJuIDAuMCwgbWF0aC5hdGFuMigwLjAsIC0xKQorICAgICAgICBkZWYgcG9zX25lZygpOgorICAgICAgICAgICAgcmV0dXJuIDAuMCwgbWF0aC5hdGFuMigtMC4wLCAtMSkKKyAgICAgICAgZGVmIG5lZ19wb3MoKToKKyAgICAgICAgICAgIHJldHVybiAtMC4wLCBtYXRoLmF0YW4yKDAuMCwgLTEpCisgICAgICAgIGRlZiBuZWdfbmVnKCk6CisgICAgICAgICAgICByZXR1cm4gLTAuMCwgbWF0aC5hdGFuMigtMC4wLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NfcG9zKCksIG5lZ19wb3MoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NfbmVnKCksIG5lZ19uZWcoKSkKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X3VuZGVyZmxvd19zaWduKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgLTFlLTEwMDAgZ2l2ZXMgLTAuMCwgbm90IDAuMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoLTFlLTEwMDAsIC0xKSwgbWF0aC5hdGFuMigtMC4wLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMihmbG9hdCgnLTFlLTEwMDAnKSwgLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGguYXRhbjIoLTAuMCwgLTEpKQorCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICAjIHRoZXNlIHNob3VsZCBiZSByZXdyaXR0ZW4gdG8gdXNlIGJvdGggZm9ybWF0KHgsIHNwZWMpIGFuZAorICAgICAgICAjIHguX19mb3JtYXRfXyhzcGVjKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDAuMCwgJ2YnKSwgJzAuMDAwMDAwJykKKworICAgICAgICAjIHRoZSBkZWZhdWx0IGlzICdnJywgZXhjZXB0IGZvciBlbXB0eSBmb3JtYXQgc3BlYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgwLjAsICcnKSwgJzAuMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDAuMDEsICcnKSwgJzAuMDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgwLjAxLCAnZycpLCAnMC4wMScpCisKKyAgICAgICAgIyBlbXB0eSBwcmVzZW50YXRpb24gdHlwZSBzaG91bGQgZm9ybWF0IGluIHRoZSBzYW1lIHdheSBhcyBzdHIKKyAgICAgICAgIyAoaXNzdWUgNTkyMCkKKyAgICAgICAgeCA9IDEwMC83LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh4LCAnJyksIHN0cih4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoeCwgJy0nKSwgc3RyKHgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh4LCAnPicpLCBzdHIoeCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KHgsICcyJyksIHN0cih4KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgxLjAsICdmJyksICcxLjAwMDAwMCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuMCwgJ2YnKSwgJy0xLjAwMDAwMCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoIDEuMCwgJyBmJyksICcgMS4wMDAwMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCgtMS4wLCAnIGYnKSwgJy0xLjAwMDAwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KCAxLjAsICcrZicpLCAnKzEuMDAwMDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoLTEuMCwgJytmJyksICctMS4wMDAwMDAnKQorCisgICAgICAgICMgJSBmb3JtYXR0aW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KC0xLjAsICclJyksICctMTAwLjAwMDAwMCUnKQorCisgICAgICAgICMgY29udmVyc2lvbiB0byBzdHJpbmcgc2hvdWxkIGZhaWwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAzLjAsICJzIikKKworICAgICAgICAjIG90aGVyIGZvcm1hdCBzcGVjaWZpZXJzIHNob3VsZG4ndCB3b3JrIG9uIGZsb2F0cywKKyAgICAgICAgIyAgaW4gcGFydGljdWxhciBpbnQgc3BlY2lmaWVycworICAgICAgICBmb3IgZm9ybWF0X3NwZWMgaW4gKFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdhJyksIG9yZCgneicpKzEpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ0EnKSwgb3JkKCdaJykrMSldKToKKyAgICAgICAgICAgIGlmIG5vdCBmb3JtYXRfc3BlYyBpbiAnZUVmRmdHbiUnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMC4wLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDEuMCwgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAtMS4wLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDFlMTAwLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIC0xZTEwMCwgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAxZS0xMDAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgLTFlLTEwMCwgZm9ybWF0X3NwZWMpCisKKyAgICAgICAgIyBpc3N1ZSAzMzgyOiAnZicgYW5kICdGJyB3aXRoIGluZidzIGFuZCBuYW4ncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KElORiksICdpbmYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpGfScuZm9ybWF0KElORiksICdJTkYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpmfScuZm9ybWF0KC1JTkYpLCAnLWluZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOkZ9Jy5mb3JtYXQoLUlORiksICctSU5GJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Zn0nLmZvcm1hdChOQU4pLCAnbmFuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Rn0nLmZvcm1hdChOQU4pLCAnTkFOJykKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X2Zvcm1hdF90ZXN0ZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKGZvcm1hdF90ZXN0ZmlsZSkgYXMgdGVzdGZpbGU6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBvcGVuKGZvcm1hdF90ZXN0ZmlsZSk6CisgICAgICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCctLScpOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIGxocywgcmhzID0gbWFwKHN0ci5zdHJpcCwgbGluZS5zcGxpdCgnLT4nKSkKKyAgICAgICAgICAgICAgICBmbXQsIGFyZyA9IGxocy5zcGxpdCgpCisgICAgICAgICAgICAgICAgYXJnID0gZmxvYXQoYXJnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10ICUgYXJnLCByaHMpCisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGguaXNuYW4oYXJnKSBhbmQgY29weXNpZ24oMS4wLCBhcmcpID4gMC4wOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdCAlIC1hcmcsICctJyArIHJocykKKworICAgIGRlZiB0ZXN0X2lzc3VlNTg2NChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMTIzLjQ1NiwgJy40JyksICcxMjMuNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9ybWF0KDEyMzQuNTYsICcuNCcpLCAnMS4yMzVlKzAzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb3JtYXQoMTIzNDUuNiwgJy40JyksICcxLjIzNWUrMDQnKQorCitjbGFzcyBSZXByVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGZsb2F0c19maWxlID0gb3Blbihvcy5wYXRoLmpvaW4ob3MucGF0aC5zcGxpdChfX2ZpbGVfXylbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmxvYXRpbmdfcG9pbnRzLnR4dCcpKQorICAgICAgICBmb3IgbGluZSBpbiBmbG9hdHNfZmlsZToKKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lIG9yIGxpbmUuc3RhcnRzd2l0aCgnIycpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB2ID0gZXZhbChsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBldmFsKHJlcHIodikpKQorICAgICAgICBmbG9hdHNfZmlsZS5jbG9zZSgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhnZXRhdHRyKHN5cywgJ2Zsb2F0X3JlcHJfc3R5bGUnLCAnJykgPT0gJ3Nob3J0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGllcyBvbmx5IHdoZW4gdXNpbmcgc2hvcnQgZmxvYXQgcmVwciBzdHlsZSIpCisgICAgZGVmIHRlc3Rfc2hvcnRfcmVwcihzZWxmKToKKyAgICAgICAgIyB0ZXN0IHNob3J0IGZsb2F0IHJlcHIgaW50cm9kdWNlZCBpbiBQeXRob24gMy4xLiAgT25lIGFzcGVjdAorICAgICAgICAjIG9mIHRoaXMgcmVwciBpcyB0aGF0IHdlIGdldCBzb21lIGRlZ3JlZSBvZiBzdHIgLT4gZmxvYXQgLT4KKyAgICAgICAgIyBzdHIgcm91bmR0cmlwcGluZy4gIEluIHBhcnRpY3VsYXIsIGZvciBhbnkgbnVtZXJpYyBzdHJpbmcKKyAgICAgICAgIyBjb250YWluaW5nIDE1IG9yIGZld2VyIHNpZ25pZmljYW50IGRpZ2l0cywgdGhvc2UgZXhhY3Qgc2FtZQorICAgICAgICAjIGRpZ2l0cyAobW9kdWxvIHRyYWlsaW5nIHplcm9zKSBzaG91bGQgYXBwZWFyIGluIHRoZSBvdXRwdXQuCisgICAgICAgICMgTm8gbW9yZSByZXByKDAuMDMpIC0+ICIwLjAyOTk5OTk5OTk5OTk5OTk5OSIhCisKKyAgICAgICAgdGVzdF9zdHJpbmdzID0gWworICAgICAgICAgICAgIyBvdXRwdXQgYWx3YXlzIGluY2x1ZGVzICplaXRoZXIqIGEgZGVjaW1hbCBwb2ludCBhbmQgYXQKKyAgICAgICAgICAgICMgbGVhc3Qgb25lIGRpZ2l0IGFmdGVyIHRoYXQgcG9pbnQsIG9yIGFuIGV4cG9uZW50LgorICAgICAgICAgICAgJzAuMCcsCisgICAgICAgICAgICAnMS4wJywKKyAgICAgICAgICAgICcwLjAxJywKKyAgICAgICAgICAgICcwLjAyJywKKyAgICAgICAgICAgICcwLjAzJywKKyAgICAgICAgICAgICcwLjA0JywKKyAgICAgICAgICAgICcwLjA1JywKKyAgICAgICAgICAgICcxLjIzNDU2Nzg5JywKKyAgICAgICAgICAgICcxMC4wJywKKyAgICAgICAgICAgICcxMDAuMCcsCisgICAgICAgICAgICAjIHZhbHVlcyA+PSAxZTE2IGdldCBhbiBleHBvbmVudC4uLgorICAgICAgICAgICAgJzEwMDAwMDAwMDAwMDAwMDAuMCcsCisgICAgICAgICAgICAnOTk5OTk5OTk5OTk5OTk5MC4wJywKKyAgICAgICAgICAgICcxZSsxNicsCisgICAgICAgICAgICAnMWUrMTcnLAorICAgICAgICAgICAgIyAuLi4gYW5kIHNvIGRvIHZhbHVlcyA8IDFlLTQKKyAgICAgICAgICAgICcwLjAwMScsCisgICAgICAgICAgICAnMC4wMDEwMDEnLAorICAgICAgICAgICAgJzAuMDAwMTAwMDAwMDAwMDAwMDEnLAorICAgICAgICAgICAgJzAuMDAwMScsCisgICAgICAgICAgICAnOS45OTk5OTk5OTk5OTllLTA1JywKKyAgICAgICAgICAgICcxZS0wNScsCisgICAgICAgICAgICAjIHZhbHVlcyBkZXNpZ25lZCB0byBwcm92b2tlIGZhaWx1cmUgaWYgdGhlIEZQVSByb3VuZGluZworICAgICAgICAgICAgIyBwcmVjaXNpb24gaXNuJ3Qgc2V0IGNvcnJlY3RseQorICAgICAgICAgICAgJzguNzIyOTM3NzExMTAzNjFlKzI1JywKKyAgICAgICAgICAgICc3LjQ3MDA1MzA3MzQyMzEzZSsyNicsCisgICAgICAgICAgICAnMi44NjQzODAwMDQzOTY5OGUrMjgnLAorICAgICAgICAgICAgJzguODkxNDI5MDUyNDYxNzllKzI4JywKKyAgICAgICAgICAgICczLjA4NTc4MDg3MDc5MjMyZSszNScsCisgICAgICAgICAgICBdCisKKyAgICAgICAgZm9yIHMgaW4gdGVzdF9zdHJpbmdzOgorICAgICAgICAgICAgbmVncyA9ICctJytzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHJlcHIoZmxvYXQocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZWdzLCByZXByKGZsb2F0KG5lZ3MpKSkKKworCitAcmVxdWlyZXNfSUVFRV83NTQKK2NsYXNzIFJvdW5kVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3NlY29uZF9hcmd1bWVudF90eXBlKHNlbGYpOgorICAgICAgICAjIGFueSB0eXBlIHdpdGggYW4gX19pbmRleF9fIG1ldGhvZCBzaG91bGQgYmUgcGVybWl0dGVkIGFzCisgICAgICAgICMgYSBzZWNvbmQgYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgxMi4zNCwgVHJ1ZSksIDEyLjMpCisKKyAgICAgICAgY2xhc3MgTXlJbmRleChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKTogcmV0dXJuIDQKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgtMC4xMjM0NTYsIE15SW5kZXgoKSksIC0wLjEyMzUpCisgICAgICAgICMgYnV0IGZsb2F0cyBzaG91bGQgYmUgaWxsZWdhbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kLCAzLjE0MTU5LCAyLjApCisKKyAgICBkZWYgdGVzdF9pbmZfbmFuKHNlbGYpOgorICAgICAgICAjIHJvdW5kaW5nIGFuIGluZmluaXR5IG9yIG5hbiByZXR1cm5zIHRoZSBzYW1lIG51bWJlcjsKKyAgICAgICAgIyAoaW4gcHkzaywgcm91bmRpbmcgYW4gaW5maW5pdHkgb3IgbmFuIHJhaXNlcyBhbiBlcnJvciwKKyAgICAgICAgIyAgc2luY2UgdGhlIHJlc3VsdCBjYW4ndCBiZSByZXByZXNlbnRlZCBhcyBhIGxvbmcpLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtSU5GKSwgLUlORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4ocm91bmQoTkFOKSkpCisgICAgICAgIGZvciBuIGluIHJhbmdlKC01LCA1KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoSU5GLCBuKSwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtSU5GLCBuKSwgLUlORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKHJvdW5kKE5BTiwgbikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQsIElORiwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kLCAtSU5GLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQsIE5BTiwgImNlY2kgbidlc3QgcGFzIHVuIGludGVnZXIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJvdW5kLCAtMC4wLCAxaikKKworICAgIGRlZiB0ZXN0X2xhcmdlX24oc2VsZik6CisgICAgICAgIGZvciBuIGluIFszMjQsIDMyNSwgNDAwLCAyKiozMS0xLCAyKiozMSwgMioqMzIsIDIqKjEwMF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEyMy40NTYsIG4pLCAxMjMuNDU2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMTIzLjQ1NiwgbiksIC0xMjMuNDU2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxZTMwMCwgbiksIDFlMzAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxZS0zMjAsIG4pLCAxZS0zMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMWUxNTAsIDMwMCksIDFlMTUwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDFlMzAwLCAzMDcpLCAxZTMwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMy4xNDE1LCAzMDgpLCAtMy4xNDE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDFlMTUwLCAzMDkpLCAxZTE1MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxLjRlLTMxNSwgMzE1KSwgMWUtMzE1KQorCisgICAgZGVmIHRlc3Rfc21hbGxfbihzZWxmKToKKyAgICAgICAgZm9yIG4gaW4gWy0zMDgsIC0zMDksIC00MDAsIDEtMioqMzEsIC0yKiozMSwgLTIqKjMxLTEsIC0yKioxMDBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxMjMuNDU2LCBuKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgtMTIzLjQ1NiwgbiksIC0wLjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDFlMzAwLCBuKSwgMC4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxZS0zMjAsIG4pLCAwLjApCisKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcm91bmQsIDEuNmUzMDgsIC0zMDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJvdW5kLCAtMS43ZTMwOCwgLTMwOCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGdldGF0dHIoc3lzLCAnZmxvYXRfcmVwcl9zdHlsZScsICcnKSA9PSAnc2hvcnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IGFwcGxpZXMgb25seSB3aGVuIHVzaW5nIHNob3J0IGZsb2F0IHJlcHIgc3R5bGUiKQorICAgIGRlZiB0ZXN0X3ByZXZpb3VzX3JvdW5kX2J1Z3Moc2VsZik6CisgICAgICAgICMgcGFydGljdWxhciBjYXNlcyB0aGF0IGhhdmUgb2NjdXJyZWQgaW4gYnVnIHJlcG9ydHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1NjI5NDk5NTM0MjEzMTIuNSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIDU2Mjk0OTk1MzQyMTMxMi41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDU2Mjk0OTk1MzQyMTMxLjUsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDU2Mjk0OTk1MzQyMTMxLjUpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhnZXRhdHRyKHN5cywgJ2Zsb2F0X3JlcHJfc3R5bGUnLCAnJykgPT0gJ3Nob3J0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCBhcHBsaWVzIG9ubHkgd2hlbiB1c2luZyBzaG9ydCBmbG9hdCByZXByIHN0eWxlIikKKyAgICBkZWYgdGVzdF9oYWxmd2F5X2Nhc2VzKHNlbGYpOgorICAgICAgICAjIEhhbGZ3YXkgY2FzZXMgbmVlZCBzcGVjaWFsIGF0dGVudGlvbiwgc2luY2UgdGhlIGN1cnJlbnQKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gZGVhbCB3aXRoIHRoZW0gc3BlY2lhbGx5LiAgTm90ZSB0aGF0CisgICAgICAgICMgMi54IHJvdW5kcyBoYWxmd2F5IHZhbHVlcyB1cCAoaS5lLiwgYXdheSBmcm9tIHplcm8pIHdoaWxlCisgICAgICAgICMgMy54IGRvZXMgcm91bmQtaGFsZi10by1ldmVuLgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDAuMTI1LCAyKSwgMC4xMykKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgwLjM3NSwgMiksIDAuMzgpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMC42MjUsIDIpLCAwLjYzKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDAuODc1LCAyKSwgMC44OCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgtMC4xMjUsIDIpLCAtMC4xMykKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgtMC4zNzUsIDIpLCAtMC4zOCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgtMC42MjUsIDIpLCAtMC42MykKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgtMC44NzUsIDIpLCAtMC44OCkKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDAuMjUsIDEpLCAwLjMpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMC43NSwgMSksIDAuOCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgtMC4yNSwgMSksIC0wLjMpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoLTAuNzUsIDEpLCAtMC44KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTYuNSwgMCksIC03LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTUuNSwgMCksIC02LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTEuNSwgMCksIC0yLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoLTAuNSwgMCksIC0xLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMC41LCAwKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEuNSwgMCksIDIuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgyLjUsIDApLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMy41LCAwKSwgNC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDQuNSwgMCksIDUuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg1LjUsIDApLCA2LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNi41LCAwKSwgNy4wKQorCisgICAgICAgICMgc2FtZSBidXQgd2l0aG91dCBhbiBleHBsaWNpdCBzZWNvbmQgYXJndW1lbnQ7IGluIDMueCB0aGVzZQorICAgICAgICAjIHdpbGwgZ2l2ZSBpbnRlZ2VycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC02LjUpLCAtNy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC01LjUpLCAtNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0xLjUpLCAtMi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0wLjUpLCAtMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDAuNSksIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgxLjUpLCAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMi41KSwgMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDMuNSksIDQuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg0LjUpLCA1LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNS41KSwgNi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDYuNSksIDcuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0yNS4wLCAtMSksIC0zMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC0xNS4wLCAtMSksIC0yMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC01LjAsIC0xKSwgLTEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNS4wLCAtMSksIDEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoMTUuMCwgLTEpLCAyMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDI1LjAsIC0xKSwgMzAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCgzNS4wLCAtMSksIDQwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNDUuMCwgLTEpLCA1MC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDU1LjAsIC0xKSwgNjAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg2NS4wLCAtMSksIDcwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocm91bmQoNzUuMCwgLTEpLCA4MC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDg1LjAsIC0xKSwgOTAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZCg5NS4wLCAtMSksIDEwMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDEyMzI1LjAsIC0xKSwgMTIzMzAuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDM1MC4wLCAtMiksIDQwMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKDQ1MC4wLCAtMiksIDUwMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoMC41ZTIxLCAtMjEpLCAxZTIxKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDEuNWUyMSwgLTIxKSwgMmUyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgyLjVlMjEsIC0yMSksIDNlMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocm91bmQoNS41ZTIxLCAtMjEpLCA2ZTIxKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDguNWUyMSwgLTIxKSwgOWUyMSkKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0xLjVlMjIsIC0yMiksIC0yZTIyKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKC0wLjVlMjIsIC0yMiksIC0xZTIyKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJvdW5kKDAuNWUyMiwgLTIyKSwgMWUyMikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyb3VuZCgxLjVlMjIsIC0yMiksIDJlMjIpCisKKworICAgIEByZXF1aXJlc19JRUVFXzc1NAorICAgIGRlZiB0ZXN0X2Zvcm1hdF9zcGVjaWFscyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvcm1hdHRpbmcgb2YgbmFucyBhbmQgaW5mcy4KKworICAgICAgICBkZWYgdGVzdChmbXQsIHZhbHVlLCBleHBlY3RlZCk6CisgICAgICAgICAgICAjIFRlc3Qgd2l0aCBib3RoICUgYW5kIGZvcm1hdCgpLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQgJSB2YWx1ZSwgZXhwZWN0ZWQsIGZtdCkKKyAgICAgICAgICAgIGlmIG5vdCAnIycgaW4gZm10OgorICAgICAgICAgICAgICAgICMgVW50aWwgaXNzdWUgNzA5NCBpcyBpbXBsZW1lbnRlZCwgZm9ybWF0KCkgZm9yIGZsb2F0cyBkb2Vzbid0CisgICAgICAgICAgICAgICAgIyAgc3VwcG9ydCAnIycgZm9ybWF0dGluZworICAgICAgICAgICAgICAgIGZtdCA9IGZtdFsxOl0gIyBzdHJpcCBvZmYgdGhlICUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvcm1hdCh2YWx1ZSwgZm10KSwgZXhwZWN0ZWQsIGZtdCkKKworICAgICAgICBmb3IgZm10IGluIFsnJWUnLCAnJWYnLCAnJWcnLCAnJS4wZScsICclLjZmJywgJyUuMjBnJywKKyAgICAgICAgICAgICAgICAgICAgJyUjZScsICclI2YnLCAnJSNnJywgJyUjLjIwZScsICclIy4xNWYnLCAnJSMuM2cnXToKKyAgICAgICAgICAgIHBmbXQgPSAnJSsnICsgZm10WzE6XQorICAgICAgICAgICAgc2ZtdCA9ICclICcgKyBmbXRbMTpdCisgICAgICAgICAgICB0ZXN0KGZtdCwgSU5GLCAnaW5mJykKKyAgICAgICAgICAgIHRlc3QoZm10LCAtSU5GLCAnLWluZicpCisgICAgICAgICAgICB0ZXN0KGZtdCwgTkFOLCAnbmFuJykKKyAgICAgICAgICAgIHRlc3QoZm10LCAtTkFOLCAnbmFuJykKKyAgICAgICAgICAgICMgV2hlbiBhc2tpbmcgZm9yIGEgc2lnbiwgaXQncyBhbHdheXMgcHJvdmlkZWQuIG5hbnMgYXJlCisgICAgICAgICAgICAjICBhbHdheXMgcG9zaXRpdmUuCisgICAgICAgICAgICB0ZXN0KHBmbXQsIElORiwgJytpbmYnKQorICAgICAgICAgICAgdGVzdChwZm10LCAtSU5GLCAnLWluZicpCisgICAgICAgICAgICB0ZXN0KHBmbXQsIE5BTiwgJytuYW4nKQorICAgICAgICAgICAgdGVzdChwZm10LCAtTkFOLCAnK25hbicpCisgICAgICAgICAgICAjIFdoZW4gdXNpbmcgJyAnIGZvciBhIHNpZ24gY29kZSwgb25seSBpbmZzIGNhbiBiZSBuZWdhdGl2ZS4KKyAgICAgICAgICAgICMgIE90aGVycyBoYXZlIGEgc3BhY2UuCisgICAgICAgICAgICB0ZXN0KHNmbXQsIElORiwgJyBpbmYnKQorICAgICAgICAgICAgdGVzdChzZm10LCAtSU5GLCAnLWluZicpCisgICAgICAgICAgICB0ZXN0KHNmbXQsIE5BTiwgJyBuYW4nKQorICAgICAgICAgICAgdGVzdChzZm10LCAtTkFOLCAnIG5hbicpCisKKworIyBCZWdpbm5pbmcgd2l0aCBQeXRob24gMi42IGZsb2F0IGhhcyBjcm9zcyBwbGF0Zm9ybSBjb21wYXRpYmxlCisjIHdheXMgdG8gY3JlYXRlIGFuZCByZXByZXNlbnQgaW5mIGFuZCBuYW4KK2NsYXNzIEluZk5hblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2luZl9mcm9tX3N0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKGZsb2F0KCJpbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihmbG9hdCgiK2luZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKGZsb2F0KCItaW5mIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoImluZmluaXR5IikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoIitpbmZpbml0eSIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKGZsb2F0KCItaW5maW5pdHkiKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCJpbmYiKSksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIitpbmYiKSksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIi1pbmYiKSksICItaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCJpbmZpbml0eSIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiK2luZmluaXR5IikpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCItaW5maW5pdHkiKSksICItaW5mIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIklORiIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiK0luZiIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiLWlORiIpKSwgIi1pbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIkluZmluaXR5IikpLCAiaW5mIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCIraU5mSW5JdFkiKSksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIi1JTkZJTklUWSIpKSwgIi1pbmYiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCJpbmYiKSksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihmbG9hdCgiK2luZiIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCItaW5mIikpLCAiLWluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCJpbmZpbml0eSIpKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGZsb2F0KCIraW5maW5pdHkiKSksICJpbmYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihmbG9hdCgiLWluZmluaXR5IikpLCAiLWluZiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICJpbmZvIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIraW5mbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiLWluZm8iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgImluIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIraW4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIi1pbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiaW5maW5pdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiK0luZmluIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICItSU5GSSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiaW5maW5pdHlzIikKKworICAgIGRlZiB0ZXN0X2luZl9hc19zdHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigxZTMwMCAqIDFlMzAwKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcigtMWUzMDAgKiAxZTMwMCksICItaW5mIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cigxZTMwMCAqIDFlMzAwKSwgImluZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKC0xZTMwMCAqIDFlMzAwKSwgIi1pbmYiKQorCisgICAgZGVmIHRlc3RfbmFuX2Zyb21fc3RyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZmxvYXQoIm5hbiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGZsb2F0KCIrbmFuIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZmxvYXQoIi1uYW4iKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCJuYW4iKSksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIituYW4iKSksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoIi1uYW4iKSksICJuYW4iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiTkFOIikpLCAibmFuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCIrTkFuIikpLCAibmFuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCItTmFOIikpLCAibmFuIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihmbG9hdCgibmFuIikpLCAibmFuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZmxvYXQoIituYW4iKSksICJuYW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihmbG9hdCgiLW5hbiIpKSwgIm5hbiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICJuYW5hIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIrbmFuYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiLW5hbmEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIm5hIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIrbmEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIi1uYSIpCisKKyAgICBkZWYgdGVzdF9uYW5fYXNfc3RyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoMWUzMDAgKiAxZTMwMCAqIDApLCAibmFuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKC0xZTMwMCAqIDFlMzAwICogMCksICJuYW4iKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKDFlMzAwICogMWUzMDAgKiAwKSwgIm5hbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKC0xZTMwMCAqIDFlMzAwICogMCksICJuYW4iKQorCisgICAgZGVmIG5vdGVzdF9mbG9hdF9uYW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShOQU4uaXNfbmFuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoSU5GLmlzX25hbigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgwLikuaXNfbmFuKCkpCisKKyAgICBkZWYgbm90ZXN0X2Zsb2F0X2luZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKElORi5pc19pbmYoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShOQU4uaXNfaW5mKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKDAuKS5pc19pbmYoKSkKKworICAgIGRlZiB0ZXN0X2hhc2hfaW5mKHNlbGYpOgorICAgICAgICAjIHRoZSBhY3R1YWwgdmFsdWVzIGhlcmUgc2hvdWxkIGJlIHJlZ2FyZGVkIGFzIGFuCisgICAgICAgICMgaW1wbGVtZW50YXRpb24gZGV0YWlsLCBidXQgdGhleSBuZWVkIHRvIGJlCisgICAgICAgICMgaWRlbnRpY2FsIHRvIHRob3NlIHVzZWQgaW4gdGhlIERlY2ltYWwgbW9kdWxlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZmxvYXQoJ2luZicpKSwgMzE0MTU5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZmxvYXQoJy1pbmYnKSksIC0yNzE4MjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChmbG9hdCgnbmFuJykpLCAwKQorCisKK2Zyb21IZXggPSBmbG9hdC5mcm9taGV4Cit0b0hleCA9IGZsb2F0LmhleAorY2xhc3MgSGV4RmxvYXRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgTUFYID0gZnJvbUhleCgnMHguZmZmZmZmZmZmZmZmZjhwKzEwMjQnKSAgIyBtYXggbm9ybWFsCisgICAgTUlOID0gZnJvbUhleCgnMHgxcC0xMDIyJykgICAgICAgICAgICAgICAgIyBtaW4gbm9ybWFsCisgICAgVElOWSA9IGZyb21IZXgoJzB4MC4wMDAwMDAwMDAwMDAxcC0xMDIyJykgIyBtaW4gc3Vibm9ybWFsCisgICAgRVBTID0gZnJvbUhleCgnMHgwLjAwMDAwMDAwMDAwMDFwMCcpICMgZGlmZiBiZXR3ZWVuIDEuMCBhbmQgbmV4dCBmbG9hdCB1cAorCisgICAgZGVmIGlkZW50aWNhbChzZWxmLCB4LCB5KToKKyAgICAgICAgIyBjaGVjayB0aGF0IGZsb2F0cyB4IGFuZCB5IGFyZSBpZGVudGljYWwsIG9yIHRoYXQgYm90aAorICAgICAgICAjIGFyZSBOYU5zCisgICAgICAgIGlmIGlzbmFuKHgpIG9yIGlzbmFuKHkpOgorICAgICAgICAgICAgaWYgaXNuYW4oeCkgPT0gaXNuYW4oeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgeCA9PSB5IGFuZCAoeCAhPSAwLjAgb3IgY29weXNpZ24oMS4wLCB4KSA9PSBjb3B5c2lnbigxLjAsIHkpKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoJyVyIG5vdCBpZGVudGljYWwgdG8gJXInICUgKHgsIHkpKQorCisgICAgZGVmIHRlc3RfZW5kcyhzZWxmKToKKyAgICAgICAgc2VsZi5pZGVudGljYWwoc2VsZi5NSU4sIGxkZXhwKDEuMCwgLTEwMjIpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChzZWxmLlRJTlksIGxkZXhwKDEuMCwgLTEwNzQpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChzZWxmLkVQUywgbGRleHAoMS4wLCAtNTIpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChzZWxmLk1BWCwgMi4qKGxkZXhwKDEuMCwgMTAyMykgLSBsZGV4cCgxLjAsIDk3MCkpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9pbnB1dHMoc2VsZik6CisgICAgICAgIGludmFsaWRfaW5wdXRzID0gWworICAgICAgICAgICAgJ2luZmknLCAgICMgbWlzc3BlbHQgaW5maW5pdGllcyBhbmQgbmFucworICAgICAgICAgICAgJy1JbmZpbml0JywKKyAgICAgICAgICAgICcrK2luZicsCisgICAgICAgICAgICAnLStJbmYnLAorICAgICAgICAgICAgJy0tbmFuJywKKyAgICAgICAgICAgICcrLU5hTicsCisgICAgICAgICAgICAnc25hbicsCisgICAgICAgICAgICAnTmFOcycsCisgICAgICAgICAgICAnbm5hJywKKyAgICAgICAgICAgICdhbicsCisgICAgICAgICAgICAnbmYnLAorICAgICAgICAgICAgJ25maW5pdHknLAorICAgICAgICAgICAgJ2luaXR5JywKKyAgICAgICAgICAgICdpaW5pdHknLAorICAgICAgICAgICAgJzB4bmFuJywKKyAgICAgICAgICAgICcnLAorICAgICAgICAgICAgJyAnLAorICAgICAgICAgICAgJ3gxLjBwMCcsCisgICAgICAgICAgICAnMHhYMS4wcDAnLAorICAgICAgICAgICAgJysgMHgxLjBwMCcsICMgaW50ZXJuYWwgd2hpdGVzcGFjZQorICAgICAgICAgICAgJy0gMHgxLjBwMCcsCisgICAgICAgICAgICAnMCB4MS4wcDAnLAorICAgICAgICAgICAgJzB4IDEuMHAwJywKKyAgICAgICAgICAgICcweDEgMi4wcDAnLAorICAgICAgICAgICAgJysweDEgLjBwMCcsCisgICAgICAgICAgICAnMHgxLiAwcDAnLAorICAgICAgICAgICAgJy0weDEuMCAxcDAnLAorICAgICAgICAgICAgJy0weDEuMCBwMCcsCisgICAgICAgICAgICAnKzB4MS4wcCArMCcsCisgICAgICAgICAgICAnMHgxLjBwIC0wJywKKyAgICAgICAgICAgICcweDEuMHAgMCcsCisgICAgICAgICAgICAnKzB4MS4wcCsgMCcsCisgICAgICAgICAgICAnLTB4MS4wcC0gMCcsCisgICAgICAgICAgICAnKysweDEuMHAtMCcsICMgZG91YmxlIHNpZ25zCisgICAgICAgICAgICAnLS0weDEuMHAwJywKKyAgICAgICAgICAgICcrLTB4MS4wcCswJywKKyAgICAgICAgICAgICctKzB4MS4wcDAnLAorICAgICAgICAgICAgJzB4MS4wcCsrMCcsCisgICAgICAgICAgICAnKzB4MS4wcCstMCcsCisgICAgICAgICAgICAnLTB4MS4wcC0rMCcsCisgICAgICAgICAgICAnMHgxLjBwLS0wJywKKyAgICAgICAgICAgICcweDEuMC5wMCcsCisgICAgICAgICAgICAnMHgucDAnLCAjIG5vIGhleCBkaWdpdHMgYmVmb3JlIG9yIGFmdGVyIHBvaW50CisgICAgICAgICAgICAnMHgxLHAwJywgIyB3cm9uZyBkZWNpbWFsIHBvaW50IGNoYXJhY3RlcgorICAgICAgICAgICAgJzB4MXBhJywKKyAgICAgICAgICAgIHUnMHgxcFx1ZmYxMCcsICAjIGZ1bGx3aWR0aCBVbmljb2RlIGRpZ2l0cworICAgICAgICAgICAgdSdcdWZmMTB4MXAwJywKKyAgICAgICAgICAgIHUnMHhcdWZmMTFwMCcsCisgICAgICAgICAgICB1JzB4MS5cdWZmMTBwMCcsCisgICAgICAgICAgICAnMHgxcDAgXG4gMHgycDAnLAorICAgICAgICAgICAgJzB4MXAwXDAgMHgxcDAnLCAgIyBlbWJlZGRlZCBudWxsIGJ5dGUgaXMgbm90IGVuZCBvZiBzdHJpbmcKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gaW52YWxpZF9pbnB1dHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnJvbUhleCh4KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ0V4cGVjdGVkIGZsb2F0LmZyb21oZXgoJXIpIHRvIHJhaXNlIFZhbHVlRXJyb3I7ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdCAlciBpbnN0ZWFkJyAlICh4LCByZXN1bHQpKQorCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICB2YWx1ZV9wYWlycyA9IFsKKyAgICAgICAgICAgICgnaW5mJywgSU5GKSwKKyAgICAgICAgICAgICgnLUluZmluaXR5JywgLUlORiksCisgICAgICAgICAgICAoJ25hbicsIE5BTiksCisgICAgICAgICAgICAoJzEuMCcsIDEuMCksCisgICAgICAgICAgICAoJy0weC4yJywgLTAuMTI1KSwKKyAgICAgICAgICAgICgnLTAuMCcsIC0wLjApCisgICAgICAgICAgICBdCisgICAgICAgIHdoaXRlc3BhY2UgPSBbCisgICAgICAgICAgICAnJywKKyAgICAgICAgICAgICcgJywKKyAgICAgICAgICAgICdcdCcsCisgICAgICAgICAgICAnXG4nLAorICAgICAgICAgICAgJ1xuIFx0JywKKyAgICAgICAgICAgICdcZicsCisgICAgICAgICAgICAnXHYnLAorICAgICAgICAgICAgJ1xyJworICAgICAgICAgICAgXQorICAgICAgICBmb3IgaW5wLCBleHBlY3RlZCBpbiB2YWx1ZV9wYWlyczoKKyAgICAgICAgICAgIGZvciBsZWFkIGluIHdoaXRlc3BhY2U6CisgICAgICAgICAgICAgICAgZm9yIHRyYWlsIGluIHdoaXRlc3BhY2U6CisgICAgICAgICAgICAgICAgICAgIGdvdCA9IGZyb21IZXgobGVhZCArIGlucCArIHRyYWlsKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmlkZW50aWNhbChnb3QsIGV4cGVjdGVkKQorCisKKyAgICBkZWYgdGVzdF9mcm9tX2hleChzZWxmKToKKyAgICAgICAgTUlOID0gc2VsZi5NSU47CisgICAgICAgIE1BWCA9IHNlbGYuTUFYOworICAgICAgICBUSU5ZID0gc2VsZi5USU5ZOworICAgICAgICBFUFMgPSBzZWxmLkVQUzsKKworICAgICAgICAjIHR3byBzcGVsbGluZ3Mgb2YgaW5maW5pdHksIHdpdGggb3B0aW9uYWwgc2lnbnM7IGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnaW5mJyksIElORikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnK0luZicpLCBJTkYpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy1JTkYnKSwgLUlORikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnaU5mJyksIElORikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnSW5maW5pdHknKSwgSU5GKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcrSU5GSU5JVFknKSwgSU5GKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctaW5maW5pdHknKSwgLUlORikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLWlORmlOaXRZJyksIC1JTkYpCisKKyAgICAgICAgIyBuYW5zIHdpdGggb3B0aW9uYWwgc2lnbjsgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCduYW4nKSwgTkFOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcrTmFOJyksIE5BTikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLU5hTicpLCBOQU4pCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy1uQU4nKSwgTkFOKQorCisgICAgICAgICMgdmFyaWF0aW9ucyBpbiBpbnB1dCBmb3JtYXQKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMScpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJysxJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMS4nKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcxLjAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcxLjBwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzAxJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMDEuJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLicpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnKzB4MS4wJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDFwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMVAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxUDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEucDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMHAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMXA0JyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMXAwNCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjFwMDA0JyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxcCswJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxUC0wJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnKzB4MXAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwMXAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxcDAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCh1JzB4MXAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnIDB4MXAwICcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJ1xuIDB4MXAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxcDAgXHQnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGFwMCcpLCAxMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweEFwMCcpLCAxMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGFQMCcpLCAxMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweEFQMCcpLCAxMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGJlcDAnKSwgMTkwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4QmVwMCcpLCAxOTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhiRXAwJyksIDE5MC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWEJFMFAtNCcpLCAxOTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhCRXAwJyksIDE5MC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweEIuRXA0JyksIDE5MC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC5CRXA4JyksIDE5MC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC4wQkVwMTInKSwgMTkwLjApCisKKyAgICAgICAgIyBtb3ZpbmcgdGhlIHBvaW50IGFyb3VuZAorICAgICAgICBwaSA9IGZyb21IZXgoJzB4MS45MjFmYjU0NDQyZDE4cDEnKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC4wMDY0ODdlZDUxMTBiNDZwMTEnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjAwYzkwZmRhYTIyMTY4Y3AxMCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguMDE5MjFmYjU0NDQyZDE4cDknKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjAzMjQzZjZhODg4NWEzcDgnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjA2NDg3ZWQ1MTEwYjQ2cDcnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjBjOTBmZGFhMjIxNjhjcDYnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjE5MjFmYjU0NDQyZDE4cDUnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4LjMyNDNmNmE4ODg1YTNwNCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHguNjQ4N2VkNTExMGI0NnAzJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweC5jOTBmZGFhMjIxNjhjcDInKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS45MjFmYjU0NDQyZDE4cDEnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4My4yNDNmNmE4ODg1YTNwMCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHg2LjQ4N2VkNTExMGI0NnAtMScpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhjLjkwZmRhYTIyMTY4Y3AtMicpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxOS4yMWZiNTQ0NDJkMThwLTMnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MzIuNDNmNmE4ODg1YTNwLTQnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4NjQuODdlZDUxMTBiNDZwLTUnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4YzkuMGZkYWEyMjE2OGNwLTYnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MTkyLjFmYjU0NDQyZDE4cC03JyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDMyNC4zZjZhODg4NWEzcC04JyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDY0OC43ZWQ1MTEwYjQ2cC05JyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweGM5MC5mZGFhMjIxNjhjcC0xMCcpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxOTIxLmZiNTQ0NDJkMThwLTExJyksIHBpKQorICAgICAgICAjIC4uLgorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDE5MjFmYjU0NDQyZDEuOHAtNDcnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MzI0M2Y2YTg4ODVhM3AtNDgnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4NjQ4N2VkNTExMGI0NnAtNDknKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4YzkwZmRhYTIyMTY4Y3AtNTAnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MTkyMWZiNTQ0NDJkMThwLTUxJyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDMyNDNmNmE4ODg1YTMwcC01MicpLCBwaSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHg2NDg3ZWQ1MTEwYjQ2MHAtNTMnKSwgcGkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4YzkwZmRhYTIyMTY4YzBwLTU0JyksIHBpKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDE5MjFmYjU0NDQyZDE4MHAtNTUnKSwgcGkpCisKKworICAgICAgICAjIHJlc3VsdHMgdGhhdCBzaG91bGQgb3ZlcmZsb3cuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJy0weDFwMTAyNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcweDFwKzEwMjUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnKzBYMXAxMDMwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJy0weDFwKzExMDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnMFgxcDEyMzQ1Njc4OTEyMzQ1Njc4OScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcrMFguOHArMTAyNScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcrMHgwLjhwMTAyNScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICctMHgwLjRwMTAyNicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcwWDJwKzEwMjMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnMHgyLnAxMDIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJy0weDIuMHArMTAyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICcrMFg0cCsxMDIyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJzB4MS5mZmZmZmZmZmZmZmZmZnArMTAyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZyb21IZXgsICctMFgxLmZmZmZmZmZmZmZmZmY5cDEwMjMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnMFgxLmZmZmZmZmZmZmZmZmY4cDEwMjMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnKzB4My5mZmZmZmZmZmZmZmZmcDEwMjInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmcm9tSGV4LCAnMHgzZmZmZmZmZmZmZmZmZnArOTcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJzB4MTAwMDAwMDAwMDAwMDAwMDBwOTYwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZnJvbUhleCwgJy0wWGZmZmZmZmZmZmZmZmZmZmZwOTYwJykKKworICAgICAgICAjIC4uLmFuZCB0aG9zZSB0aGF0IHJvdW5kIHRvICstbWF4IGZsb2F0CisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJysweDEuZmZmZmZmZmZmZmZmZnArMTAyMycpLCBNQVgpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDEuZmZmZmZmZmZmZmZmZjdwMTAyMycpLCAtTUFYKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuZmZmZmZmZmZmZmZmZjdmZmZmZmZmZmZmZmZmcDEwMjMnKSwgTUFYKQorCisgICAgICAgICMgemVyb3MKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwcDAnKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDBwMTAwMCcpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDBwMTAyMycpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDBwMTAyNCcpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDBwMTAyNScpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDBwMjAwMCcpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MHAxMjM0NTY3ODkxMjM0NTY3ODknKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFgwcC0wJyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDBwLTEwMDAnKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwcC0xMDIzJyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYMHAtMTAyNCcpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHgwcC0xMDI1JyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDBwLTEwNzInKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgwcC0xMDczJyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4MHAtMTA3NCcpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDBwLTEwNzUnKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDBwLTEwNzYnKSwgMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFgwcC0yMDAwJyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDBwLTEyMzQ1Njc4OTEyMzQ1Njc4OScpLCAtMC4wKQorCisgICAgICAgICMgdmFsdWVzIHRoYXQgc2hvdWxkIHVuZGVyZmxvdyB0byAwCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMXAtMTA3NScpLCAwLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDFwLTEwNzUnKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4MXAtMTIzNDU2Nzg5MTIzNDU2Nzg5JyksIC0wLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwMDAwMXAtMTA3NScpLCBUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHgxLjFwLTEwNzUnKSwgLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS5mZmZmZmZmZmZmZmZmZmZmZnAtMTA3NScpLCBUSU5ZKQorCisgICAgICAgICMgY2hlY2sgcm91bmQtaGFsZi1ldmVuIGlzIHdvcmtpbmcgY29ycmVjdGx5IG5lYXIgMCAuLi4KKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxcC0xMDc2JyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgycC0xMDc2JyksIDAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgzcC0xMDc2JyksIFRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4NHAtMTA3NicpLCBUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDVwLTEwNzYnKSwgVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFg2cC0xMDc2JyksIDIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHg3cC0xMDc2JyksIDIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFg4cC0xMDc2JyksIDIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFg5cC0xMDc2JyksIDIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhhcC0xMDc2JyksIDIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFhicC0xMDc2JyksIDMqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhjcC0xMDc2JyksIDMqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFhkcC0xMDc2JyksIDMqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFhlcC0xMDc2JyksIDQqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHhmcC0xMDc2JyksIDQqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxMHAtMTA3NicpLCA0KlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0weDFwLTEwNzYnKSwgLTAuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYMnAtMTA3NicpLCAtMC4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHgzcC0xMDc2JyksIC1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFg0cC0xMDc2JyksIC1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHg1cC0xMDc2JyksIC1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHg2cC0xMDc2JyksIC0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDdwLTEwNzYnKSwgLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTBYOHAtMTA3NicpLCAtMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFg5cC0xMDc2JyksIC0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWGFwLTEwNzYnKSwgLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4YnAtMTA3NicpLCAtMypUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMHhjcC0xMDc2JyksIC0zKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWGRwLTEwNzYnKSwgLTMqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnLTB4ZXAtMTA3NicpLCAtNCpUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCctMFhmcC0xMDc2JyksIC00KlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJy0wWDEwcC0xMDc2JyksIC00KlRJTlkpCisKKyAgICAgICAgIyAuLi4gYW5kIG5lYXIgTUlOIC4uLgorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZDZwLTEwMjInKSwgTUlOLTMqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmQ4cC0xMDIyJyksIE1JTi0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZkYXAtMTAyMicpLCBNSU4tMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZGNwLTEwMjInKSwgTUlOLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmRlcC0xMDIyJyksIE1JTi0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZlMHAtMTAyMicpLCBNSU4tMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZTJwLTEwMjInKSwgTUlOLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmU0cC0xMDIyJyksIE1JTi0yKlRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZlNnAtMTAyMicpLCBNSU4tMipUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZThwLTEwMjInKSwgTUlOLTIqVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmVhcC0xMDIyJyksIE1JTi1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZWNwLTEwMjInKSwgTUlOLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZlZXAtMTAyMicpLCBNSU4tVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmYwcC0xMDIyJyksIE1JTi1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjJwLTEwMjInKSwgTUlOLVRJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmNHAtMTAyMicpLCBNSU4tVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmY2cC0xMDIyJyksIE1JTi1USU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZjhwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZmFwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZmNwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZmVwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDBwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDJwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDRwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDZwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDhwLTEwMjInKSwgTUlOKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMGFwLTEwMjInKSwgTUlOK1RJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAwY3AtMTAyMicpLCBNSU4rVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDBlcC0xMDIyJyksIE1JTitUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTBwLTEwMjInKSwgTUlOK1RJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAxMnAtMTAyMicpLCBNSU4rVElOWSkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDE0cC0xMDIyJyksIE1JTitUSU5ZKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMTZwLTEwMjInKSwgTUlOK1RJTlkpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAxOHAtMTAyMicpLCBNSU4rMipUSU5ZKQorCisgICAgICAgICMgLi4uIGFuZCBuZWFyIDEuMC4KKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmYwcDAnKSwgMS4wLUVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmYxcDAnKSwgMS4wLUVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgwLmZmZmZmZmZmZmZmZmYycDAnKSwgMS4wLUVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmYzcDAnKSwgMS4wLUVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgwLmZmZmZmZmZmZmZmZmY0cDAnKSwgMS4wLUVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgwLmZmZmZmZmZmZmZmZmY1cDAnKSwgMS4wLUVQUy8yKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDAuZmZmZmZmZmZmZmZmZjZwMCcpLCAxLjAtRVBTLzIpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmN3AwJyksIDEuMC1FUFMvMikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmY4cDAnKSwgMS4wLUVQUy8yKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDAuZmZmZmZmZmZmZmZmZjlwMCcpLCAxLjAtRVBTLzIpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMC5mZmZmZmZmZmZmZmZmYXAwJyksIDEuMC1FUFMvMikKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgwLmZmZmZmZmZmZmZmZmZicDAnKSwgMS4wLUVQUy8yKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDAuZmZmZmZmZmZmZmZmZmNwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MC5mZmZmZmZmZmZmZmZmZHAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgwLmZmZmZmZmZmZmZmZmZlcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDAuZmZmZmZmZmZmZmZmZmZwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS4wMDAwMDAwMDAwMDAwMHAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDAxcDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDJwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS4wMDAwMDAwMDAwMDAwM3AwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDA0cDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMDVwMCcpLCAxLjApCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS4wMDAwMDAwMDAwMDAwNnAwJyksIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDA3cDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDdmZmZmZmZmZmZmZmZmZmZmZmZmZnAwJyksCisgICAgICAgICAgICAgICAgICAgICAgIDEuMCkKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDA4cDAnKSwgMS4wKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMDgwMDAwMDAwMDAwMDAwMDAwMDFwMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAxK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDA5cDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDBhcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDBicDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDBjcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDBkcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDBlcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDBmcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDEwcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDExcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDEycDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDEzcDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDE0cDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDE1cDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDE2cDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDE3cDAnKSwgMS4wK0VQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDE3ZmZmZmZmZmZmZmZmZmZmZmZmZmZwMCcpLAorICAgICAgICAgICAgICAgICAgICAgICAxLjArRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMThwMCcpLCAxLjArMipFUFMpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS4wMDAwMDAwMDAwMDAxODAwMDAwMDAwMDAwMDAwMDAwMXAwJyksCisgICAgICAgICAgICAgICAgICAgICAgIDEuMCsyKkVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDE5cDAnKSwgMS4wKzIqRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcwWDEuMDAwMDAwMDAwMDAwMWFwMCcpLCAxLjArMipFUFMpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzBYMS4wMDAwMDAwMDAwMDAxYnAwJyksIDEuMCsyKkVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMHgxLjAwMDAwMDAwMDAwMDFjcDAnKSwgMS4wKzIqRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMWRwMCcpLCAxLjArMipFUFMpCisgICAgICAgIHNlbGYuaWRlbnRpY2FsKGZyb21IZXgoJzB4MS4wMDAwMDAwMDAwMDAxZXAwJyksIDEuMCsyKkVQUykKKyAgICAgICAgc2VsZi5pZGVudGljYWwoZnJvbUhleCgnMFgxLjAwMDAwMDAwMDAwMDFmcDAnKSwgMS4wKzIqRVBTKQorICAgICAgICBzZWxmLmlkZW50aWNhbChmcm9tSGV4KCcweDEuMDAwMDAwMDAwMDAwMjBwMCcpLCAxLjArMipFUFMpCisKKyAgICBkZWYgdGVzdF9yb3VuZHRyaXAoc2VsZik6CisgICAgICAgIGRlZiByb3VuZHRyaXAoeCk6CisgICAgICAgICAgICByZXR1cm4gZnJvbUhleCh0b0hleCh4KSkKKworICAgICAgICBmb3IgeCBpbiBbTkFOLCBJTkYsIHNlbGYuTUFYLCBzZWxmLk1JTiwgc2VsZi5NSU4tc2VsZi5USU5ZLCBzZWxmLlRJTlksIDAuMF06CisgICAgICAgICAgICBzZWxmLmlkZW50aWNhbCh4LCByb3VuZHRyaXAoeCkpCisgICAgICAgICAgICBzZWxmLmlkZW50aWNhbCgteCwgcm91bmR0cmlwKC14KSkKKworICAgICAgICAjIGZyb21IZXgodG9IZXgoeCkpIHNob3VsZCBleGFjdGx5IHJlY292ZXIgeCwgZm9yIGFueSBub24tTmFOIGZsb2F0IHguCisgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMDAwKToKKyAgICAgICAgICAgIGUgPSByYW5kb20ucmFuZHJhbmdlKC0xMjAwLCAxMjAwKQorICAgICAgICAgICAgbSA9IHJhbmRvbS5yYW5kb20oKQorICAgICAgICAgICAgcyA9IHJhbmRvbS5jaG9pY2UoWzEuMCwgLTEuMF0pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IHMqbGRleHAobSwgZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pZGVudGljYWwoeCwgZnJvbUhleCh0b0hleCh4KSkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEdlbmVyYWxGbG9hdENhc2VzLAorICAgICAgICBGb3JtYXRGdW5jdGlvbnNUZXN0Q2FzZSwKKyAgICAgICAgVW5rbm93bkZvcm1hdFRlc3RDYXNlLAorICAgICAgICBJRUVFRm9ybWF0VGVzdENhc2UsCisgICAgICAgIFJlcHJUZXN0Q2FzZSwKKyAgICAgICAgUm91bmRUZXN0Q2FzZSwKKyAgICAgICAgSW5mTmFuVGVzdCwKKyAgICAgICAgSGV4RmxvYXRUZXN0Q2FzZSwKKyAgICAgICAgKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbG9hdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbG9hdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0YzBkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zsb2F0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbG9hdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbG9hdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY0YzBkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zsb2F0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mbm1hdGNoLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2VjNTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weQpAQCAtMCwwICsxLDcyIEBACisiIiJUZXN0IGNhc2VzIGZvciB0aGUgZm5tYXRjaCBtb2R1bGUuIiIiCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBmbm1hdGNoIGltcG9ydCBmbm1hdGNoLCBmbm1hdGNoY2FzZSwgX01BWENBQ0hFLCBfY2FjaGUKK2Zyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaCwgZm5tYXRjaGNhc2UsIF9NQVhDQUNIRSwgX2NhY2hlLCBfcHVyZ2UKKworCitjbGFzcyBGbm1hdGNoVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBfcHVyZ2UoKQorCisgICAgZGVmIGNoZWNrX21hdGNoKHNlbGYsIGZpbGVuYW1lLCBwYXR0ZXJuLCBzaG91bGRfbWF0Y2g9MSwgZm49Zm5tYXRjaCk6CisgICAgICAgIGlmIHNob3VsZF9tYXRjaDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbihmaWxlbmFtZSwgcGF0dGVybiksCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVyIHRvIG1hdGNoIHBhdHRlcm4gJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZmlsZW5hbWUsIHBhdHRlcm4pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmbihmaWxlbmFtZSwgcGF0dGVybiksCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVyIG5vdCB0byBtYXRjaCBwYXR0ZXJuICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgKGZpbGVuYW1lLCBwYXR0ZXJuKSkKKworICAgIGRlZiB0ZXN0X2ZubWF0Y2goc2VsZik6CisgICAgICAgIGNoZWNrID0gc2VsZi5jaGVja19tYXRjaAorICAgICAgICBjaGVjaygnYWJjJywgJ2FiYycpCisgICAgICAgIGNoZWNrKCdhYmMnLCAnPyo/JykKKyAgICAgICAgY2hlY2soJ2FiYycsICc/Pz8qJykKKyAgICAgICAgY2hlY2soJ2FiYycsICcqPz8/JykKKyAgICAgICAgY2hlY2soJ2FiYycsICc/Pz8nKQorICAgICAgICBjaGVjaygnYWJjJywgJyonKQorICAgICAgICBjaGVjaygnYWJjJywgJ2FiW2NkXScpCisgICAgICAgIGNoZWNrKCdhYmMnLCAnYWJbIWRlXScpCisgICAgICAgIGNoZWNrKCdhYmMnLCAnYWJbZGVdJywgMCkKKyAgICAgICAgY2hlY2soJ2EnLCAnPz8nLCAwKQorICAgICAgICBjaGVjaygnYScsICdiJywgMCkKKworICAgICAgICAjIHRoZXNlIHRlc3QgdGhhdCAnXCcgaXMgaGFuZGxlZCBjb3JyZWN0bHkgaW4gY2hhcmFjdGVyIHNldHM7CisgICAgICAgICMgc2VlIFNGIGJ1ZyAjNDA5NjUxCisgICAgICAgIGNoZWNrKCdcXCcsIHInW1xdJykKKyAgICAgICAgY2hlY2soJ2EnLCByJ1shXF0nKQorICAgICAgICBjaGVjaygnXFwnLCByJ1shXF0nLCAwKQorCisgICAgICAgICMgdGVzdCB0aGF0IGZpbGVuYW1lcyB3aXRoIG5ld2xpbmVzIGluIHRoZW0gYXJlIGhhbmRsZWQgY29ycmVjdGx5LgorICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU2NjY1CisgICAgICAgIGNoZWNrKCdmb29cbmJhcicsICdmb28qJykKKyAgICAgICAgY2hlY2soJ2Zvb1xuYmFyXG4nLCAnZm9vKicpCisgICAgICAgIGNoZWNrKCdcbmZvbycsICdmb28qJywgRmFsc2UpCisgICAgICAgIGNoZWNrKCdcbicsICcqJykKKworICAgIGRlZiB0ZXN0X2ZubWF0Y2hjYXNlKHNlbGYpOgorICAgICAgICBjaGVjayA9IHNlbGYuY2hlY2tfbWF0Y2gKKyAgICAgICAgY2hlY2soJ0FiQycsICdhYmMnLCAwLCBmbm1hdGNoY2FzZSkKKyAgICAgICAgY2hlY2soJ2FiYycsICdBYkMnLCAwLCBmbm1hdGNoY2FzZSkKKworICAgIGRlZiB0ZXN0X2NhY2hlX2NsZWFyaW5nKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgY2FjaGVzIGRvIG5vdCBncm93IHRvbyBsYXJnZQorICAgICAgICAjIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3ODQ2CisKKyAgICAgICAgIyBzdHJpbmcgcGF0dGVybiBjYWNoZQorICAgICAgICBmb3IgaSBpbiByYW5nZShfTUFYQ0FDSEUgKyAxKToKKyAgICAgICAgICAgIGZubWF0Y2goJ2ZvbycsICc/JyAqIGkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobGVuKF9jYWNoZSksIF9NQVhDQUNIRSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRm5tYXRjaFRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZubWF0Y2gucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxNDM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZubWF0Y2gucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZubWF0Y2gucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm5tYXRjaC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxNDM2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZubWF0Y2gucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZvcmsxLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9yazEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkzMDY2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZvcmsxLnB5CkBAIC0wLDAgKzEsNzEgQEAKKyIiIlRoaXMgdGVzdCBjaGVja3MgZm9yIGNvcnJlY3QgZm9yaygpIGJlaGF2aW9yLgorIiIiCisKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgcmVhcF9jaGlsZHJlbiwgZ2V0X2F0dHJpYnV0ZSwgaW1wb3J0X21vZHVsZQordGhyZWFkaW5nID0gaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKKworI1NraXAgdGVzdCBpZiBmb3JrIGRvZXMgbm90IGV4aXN0LgorZ2V0X2F0dHJpYnV0ZShvcywgJ2ZvcmsnKQorCisKK2NsYXNzIEZvcmtUZXN0KEZvcmtXYWl0KToKKyAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXRwaWQoKSBzaG91bGRuJ3QgaGFuZywgYnV0IHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBzZWVtIHRvIGhhbmcKKyAgICAgICAgICAgICMgaW4gdGhlIGZvcmtpbmcgdGVzdHMuICBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZml4IHRoZSBwcm9ibGVtLgorICAgICAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgaWYgc3BpZCA9PSBjcGlkOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9sb2NrX2Zvcmsoc2VsZik6CisgICAgICAgIGltcG9ydF9zdGFydGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgZmFrZV9tb2R1bGVfbmFtZSA9ICJmYWtlIHRlc3QgbW9kdWxlIgorICAgICAgICBwYXJ0aWFsX21vZHVsZSA9ICJwYXJ0aWFsIgorICAgICAgICBjb21wbGV0ZV9tb2R1bGUgPSAiY29tcGxldGUiCisgICAgICAgIGRlZiBpbXBvcnRlcigpOgorICAgICAgICAgICAgaW1wLmFjcXVpcmVfbG9jaygpCisgICAgICAgICAgICBzeXMubW9kdWxlc1tmYWtlX21vZHVsZV9uYW1lXSA9IHBhcnRpYWxfbW9kdWxlCisgICAgICAgICAgICBpbXBvcnRfc3RhcnRlZC5zZXQoKQorICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAxKSAjIEdpdmUgdGhlIG90aGVyIHRocmVhZCB0aW1lIHRvIHRyeSBhbmQgYWNxdWlyZS4KKyAgICAgICAgICAgIHN5cy5tb2R1bGVzW2Zha2VfbW9kdWxlX25hbWVdID0gY29tcGxldGVfbW9kdWxlCisgICAgICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWltcG9ydGVyKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgaW1wb3J0X3N0YXJ0ZWQud2FpdCgpCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgcGlkOgorICAgICAgICAgICAgICAgIG0gPSBfX2ltcG9ydF9fKGZha2VfbW9kdWxlX25hbWUpCisgICAgICAgICAgICAgICAgaWYgbSA9PSBjb21wbGV0ZV9tb2R1bGU6CisgICAgICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3MuX2V4aXQoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgICAgICAjIEV4aXRjb2RlIDEgbWVhbnMgdGhlIGNoaWxkIGdvdCBhIHBhcnRpYWwgbW9kdWxlIChiYWQuKSBObworICAgICAgICAgICAgICAgICMgZXhpdGNvZGUgKGJ1dCBhIGhhbmcsIHdoaWNoIG1hbmlmZXN0cyBhcyAnZ290IHBpZCAwJykKKyAgICAgICAgICAgICAgICAjIG1lYW5zIHRoZSBjaGlsZCBkZWFkbG9ja2VkIChhbHNvIGJhZC4pCisgICAgICAgICAgICAgICAgc2VsZi53YWl0X2ltcGwocGlkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChGb3JrVGVzdCkKKyAgICByZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9yazEucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9yazEucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTgzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JrMS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9yazEucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9yazEucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MTgzYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JrMS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9ybWF0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZm9ybWF0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzBlZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JtYXQucHkKQEAgLTAsMCArMSwzMDcgQEAKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIGhhdmVfdW5pY29kZSwgVGVzdEZhaWxlZAoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0IGFzIHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK21heHNpemUgPSB0ZXN0X3N1cHBvcnQuTUFYX1B5X3NzaXplX3QKKworIyB0ZXN0IHN0cmluZyBmb3JtYXR0aW5nIG9wZXJhdG9yIChJIGFtIG5vdCBzdXJlIGlmIHRoaXMgaXMgYmVpbmcgdGVzdGVkCisjIGVsc2V3aGVyZSBidXQsIHN1cmVseSwgc29tZSBvZiB0aGUgZ2l2ZW4gY2FzZXMgYXJlICpub3QqIHRlc3RlZCBiZWNhdXNlCisjIHRoZXkgY3Jhc2ggcHl0aG9uKQorIyB0ZXN0IG9uIHVuaWNvZGUgc3RyaW5ncyBhcyB3ZWxsCisKK2RlZiB0ZXN0Zm9ybWF0KGZvcm1hdHN0ciwgYXJncywgb3V0cHV0PU5vbmUsIGxpbWl0PU5vbmUsIG92ZXJmbG93b2s9RmFsc2UpOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgIHByaW50ICIlcyAlJSAlcyA9PyAlcyAuLi4iICVcCisgICAgICAgICAgICAgICAgKHJlcHIoZm9ybWF0c3RyKSwgcmVwcihhcmdzKSwgcmVwcihvdXRwdXQpKSwKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICIlcyAlJSAlcyB3b3Jrcz8gLi4uIiAlIChyZXByKGZvcm1hdHN0ciksIHJlcHIoYXJncykpLAorICAgIHRyeToKKyAgICAgICAgcmVzdWx0ID0gZm9ybWF0c3RyICUgYXJncworICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICBpZiBub3Qgb3ZlcmZsb3dvazoKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnb3ZlcmZsb3cgKHRoaXMgaXMgZmluZSknCisgICAgZWxzZToKKyAgICAgICAgaWYgb3V0cHV0IGFuZCBsaW1pdCBpcyBOb25lIGFuZCByZXN1bHQgIT0gb3V0cHV0OgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAnbm8nCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiJXIgJSUgJXIgPT0gJXIgIT0gJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcm1hdHN0ciwgYXJncywgcmVzdWx0LCBvdXRwdXQpKQorICAgICAgICAjIHdoZW4gJ2xpbWl0JyBpcyBzcGVjaWZpZWQsIGl0IGRldGVybWluZXMgaG93IG1hbnkgY2hhcmFjdGVycworICAgICAgICAjIG11c3QgbWF0Y2ggZXhhY3RseTsgbGVuZ3RocyBtdXN0IGFsd2F5cyBtYXRjaC4KKyAgICAgICAgIyBleDogbGltaXQ9NSwgJzEyMzQ1Njc4JyBtYXRjaGVzICcxMjM0NV9fXycKKyAgICAgICAgIyAobWFpbmx5IGZvciBmbG9hdGluZyBwb2ludCBmb3JtYXQgdGVzdHMgZm9yIHdoaWNoIGFuIGV4YWN0IG1hdGNoCisgICAgICAgICMgY2FuJ3QgYmUgZ3VhcmFudGVlZCBkdWUgdG8gcm91bmRpbmcgYW5kIHJlcHJlc2VudGF0aW9uIGVycm9ycykKKyAgICAgICAgZWxpZiBvdXRwdXQgYW5kIGxpbWl0IGlzIG5vdCBOb25lIGFuZCAoCisgICAgICAgICAgICAgICAgbGVuKHJlc3VsdCkhPWxlbihvdXRwdXQpIG9yIHJlc3VsdFs6bGltaXRdIT1vdXRwdXRbOmxpbWl0XSk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdubycKKyAgICAgICAgICAgIHByaW50ICIlcyAlJSAlcyA9PSAlcyAhPSAlcyIgJSBcCisgICAgICAgICAgICAgICAgICAocmVwcihmb3JtYXRzdHIpLCByZXByKGFyZ3MpLCByZXByKHJlc3VsdCksIHJlcHIob3V0cHV0KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3llcycKKworCitkZWYgdGVzdGJvdGgoZm9ybWF0c3RyLCAqYXJncywgKiprd2FyZ3MpOgorICAgIHRlc3Rmb3JtYXQoZm9ybWF0c3RyLCAqYXJncywgKiprd2FyZ3MpCisgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICB0ZXN0Zm9ybWF0KHVuaWNvZGUoZm9ybWF0c3RyKSwgKmFyZ3MsICoqa3dhcmdzKQorCisKK2NsYXNzIEZvcm1hdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmKToKKyAgICAgICAgdGVzdGJvdGgoIiUuMWQiLCAoMSwpLCAiMSIpCisgICAgICAgIHRlc3Rib3RoKCIlLipkIiwgKHN5cy5tYXhpbnQsMSksIG92ZXJmbG93b2s9VHJ1ZSkgICMgZXhwZWN0IG92ZXJmbG93CisgICAgICAgIHRlc3Rib3RoKCIlLjEwMGQiLCAoMSwpLCAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCisgICAgICAgICAgICAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCisgICAgICAgICAgICAgICAgICcwMDAwMDAwMScsIG92ZXJmbG93b2s9VHJ1ZSkKKyAgICAgICAgdGVzdGJvdGgoIiUjLjExN3giLCAoMSwpLCAnMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKKyAgICAgICAgICAgICAgICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcKKyAgICAgICAgICAgICAgICAgJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEnLAorICAgICAgICAgICAgICAgICBvdmVyZmxvd29rPVRydWUpCisgICAgICAgIHRlc3Rib3RoKCIlIy4xMTh4IiwgKDEsKSwgJzB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCisgICAgICAgICAgICAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnCisgICAgICAgICAgICAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMScsCisgICAgICAgICAgICAgICAgIG92ZXJmbG93b2s9VHJ1ZSkKKworICAgICAgICB0ZXN0Ym90aCgiJWYiLCAoMS4wLCksICIxLjAwMDAwMCIpCisgICAgICAgICMgdGhlc2UgYXJlIHRyeWluZyB0byB0ZXN0IHRoZSBsaW1pdHMgb2YgdGhlIGludGVybmFsIG1hZ2ljLW51bWJlci1sZW5ndGgKKyAgICAgICAgIyBmb3JtYXR0aW5nIGJ1ZmZlciwgaWYgdGhhdCBudW1iZXIgY2hhbmdlcyB0aGVuIHRoZXNlIHRlc3RzIGFyZSBsZXNzCisgICAgICAgICMgZWZmZWN0aXZlCisgICAgICAgIHRlc3Rib3RoKCIlIy4qZyIsICgxMDksIC0xLmUrNDkvMy4pKQorICAgICAgICB0ZXN0Ym90aCgiJSMuKmciLCAoMTEwLCAtMS5lKzQ5LzMuKSkKKyAgICAgICAgdGVzdGJvdGgoIiUjLipnIiwgKDExMCwgLTEuZSsxMDAvMy4pKQorCisgICAgICAgICMgdGVzdCBzb21lIHJpZGljdWxvdXNseSBsYXJnZSBwcmVjaXNpb24sIGV4cGVjdCBvdmVyZmxvdworICAgICAgICB0ZXN0Ym90aCgnJTEyLipmJywgKDEyMzQ1NiwgMS4wKSkKKworICAgICAgICAjIGNoZWNrIGZvciBpbnRlcm5hbCBvdmVyZmxvdyB2YWxpZGF0aW9uIG9uIGxlbmd0aCBvZiBwcmVjaXNpb24KKyAgICAgICAgIyB0aGVzZSB0ZXN0cyBzaG91bGQgbm8gbG9uZ2VyIGNhdXNlIG92ZXJmbG93IGluIFB5dGhvbgorICAgICAgICAjIDIuNy8zLjEgYW5kIGxhdGVyLgorICAgICAgICB0ZXN0Ym90aCgiJSMuKmciLCAoMTEwLCAtMS5lKzEwMC8zLikpCisgICAgICAgIHRlc3Rib3RoKCIlIy4qRyIsICgxMTAsIC0xLmUrMTAwLzMuKSkKKyAgICAgICAgdGVzdGJvdGgoIiUjLipmIiwgKDExMCwgLTEuZSsxMDAvMy4pKQorICAgICAgICB0ZXN0Ym90aCgiJSMuKkYiLCAoMTEwLCAtMS5lKzEwMC8zLikpCisKKyAgICAgICAgIyBGb3JtYXR0aW5nIG9mIGxvbmcgaW50ZWdlcnMuIE92ZXJmbG93IGlzIG5vdCBvaworICAgICAgICB0ZXN0Ym90aCgiJXgiLCAxMEwsICJhIikKKyAgICAgICAgdGVzdGJvdGgoIiV4IiwgMTAwMDAwMDAwMDAwTCwgIjE3NDg3NmU4MDAiKQorICAgICAgICB0ZXN0Ym90aCgiJW8iLCAxMEwsICIxMiIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIDEwMDAwMDAwMDAwMEwsICIxMzUxMDM1NTY0MDAwIikKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgMTBMLCAiMTAiKQorICAgICAgICB0ZXN0Ym90aCgiJWQiLCAxMDAwMDAwMDAwMDBMLCAiMTAwMDAwMDAwMDAwIikKKworICAgICAgICBiaWcgPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBMCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIGJpZywgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIC1iaWcsICItMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiU1ZCIsIC1iaWcsICItMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUzMWQiLCAtYmlnLCAiLTEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMzJkIiwgLWJpZywgIiAtMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUtMzJkIiwgLWJpZywgIi0xMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAgIikKKyAgICAgICAgdGVzdGJvdGgoIiUwMzJkIiwgLWJpZywgIi0wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUtMDMyZCIsIC1iaWcsICItMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwICIpCisgICAgICAgIHRlc3Rib3RoKCIlMDM0ZCIsIC1iaWcsICItMDAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUwMzRkIiwgYmlnLCAiMDAwMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMCszNGQiLCBiaWcsICIrMDAwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUrMzRkIiwgYmlnLCAiICAgKzEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMzRkIiwgYmlnLCAiICAgIDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpCisgICAgICAgIHRlc3Rib3RoKCIlLjJkIiwgYmlnLCAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUuMzBkIiwgYmlnLCAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIikKKyAgICAgICAgdGVzdGJvdGgoIiUuMzFkIiwgYmlnLCAiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMzIuMzFkIiwgYmlnLCAiIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiKQorICAgICAgICB0ZXN0Ym90aCgiJWQiLCBmbG9hdChiaWcpLCAiMTIzNDU2X19fX19fX19fX19fX19fX19fX19fX19fIiwgNikKKworICAgICAgICBiaWcgPSAweDEyMzQ1Njc4OTBhYmNkZWYxMjM0NUwgICMgMjEgaGV4IGRpZ2l0cworICAgICAgICB0ZXN0Ym90aCgiJXgiLCBiaWcsICIxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJXgiLCAtYmlnLCAiLTEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlNXgiLCAtYmlnLCAiLTEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlMjJ4IiwgLWJpZywgIi0xMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJTIzeCIsIC1iaWcsICIgLTEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlLTIzeCIsIC1iaWcsICItMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1ICIpCisgICAgICAgIHRlc3Rib3RoKCIlMDIzeCIsIC1iaWcsICItMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlLTAyM3giLCAtYmlnLCAiLTEyMzQ1Njc4OTBhYmNkZWYxMjM0NSAiKQorICAgICAgICB0ZXN0Ym90aCgiJTAyNXgiLCAtYmlnLCAiLTAwMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlMDI1eCIsIGJpZywgIjAwMDAxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJTArMjV4IiwgYmlnLCAiKzAwMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlKzI1eCIsIGJpZywgIiAgICsxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJTI1eCIsIGJpZywgIiAgICAxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJS4yeCIsIGJpZywgIjEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlLjIxeCIsIGJpZywgIjEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlLjIyeCIsIGJpZywgIjAxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJTIzLjIyeCIsIGJpZywgIiAwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUtMjMuMjJ4IiwgYmlnLCAiMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSAiKQorICAgICAgICB0ZXN0Ym90aCgiJVgiLCBiaWcsICIxMjM0NTY3ODkwQUJDREVGMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJSNYIiwgYmlnLCAiMFgxMjM0NTY3ODkwQUJDREVGMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJSN4IiwgYmlnLCAiMHgxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJSN4IiwgLWJpZywgIi0weDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlIy4yM3giLCAtYmlnLCAiLTB4MDAxMjM0NTY3ODkwYWJjZGVmMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJSMrLjIzeCIsIGJpZywgIisweDAwMTIzNDU2Nzg5MGFiY2RlZjEyMzQ1IikKKyAgICAgICAgdGVzdGJvdGgoIiUjIC4yM3giLCBiaWcsICIgMHgwMDEyMzQ1Njc4OTBhYmNkZWYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlIysuMjNYIiwgYmlnLCAiKzBYMDAxMjM0NTY3ODkwQUJDREVGMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJSMtKy4yM1giLCBiaWcsICIrMFgwMDEyMzQ1Njc4OTBBQkNERUYxMjM0NSIpCisgICAgICAgIHRlc3Rib3RoKCIlIy0rMjYuMjNYIiwgYmlnLCAiKzBYMDAxMjM0NTY3ODkwQUJDREVGMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJSMtKzI3LjIzWCIsIGJpZywgIiswWDAwMTIzNDU2Nzg5MEFCQ0RFRjEyMzQ1ICIpCisgICAgICAgIHRlc3Rib3RoKCIlIysyNy4yM1giLCBiaWcsICIgKzBYMDAxMjM0NTY3ODkwQUJDREVGMTIzNDUiKQorICAgICAgICAjIG5leHQgb25lIGdldHMgdHdvIGxlYWRpbmcgemVyb2VzIGZyb20gcHJlY2lzaW9uLCBhbmQgYW5vdGhlciBmcm9tIHRoZQorICAgICAgICAjIDAgZmxhZyBhbmQgdGhlIHdpZHRoCisgICAgICAgIHRlc3Rib3RoKCIlIyswMjcuMjNYIiwgYmlnLCAiKzBYMDAwMTIzNDU2Nzg5MEFCQ0RFRjEyMzQ1IikKKyAgICAgICAgIyBzYW1lLCBleGNlcHQgbm8gMCBmbGFnCisgICAgICAgIHRlc3Rib3RoKCIlIysyNy4yM1giLCBiaWcsICIgKzBYMDAxMjM0NTY3ODkwQUJDREVGMTIzNDUiKQorICAgICAgICB0ZXN0Ym90aCgiJXgiLCBmbG9hdChiaWcpLCAiMTIzNDU2X19fX19fX19fX19fX19fIiwgNikKKworICAgICAgICBiaWcgPSAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzBMICAjIDMyIG9jdGFsIGRpZ2l0cworICAgICAgICB0ZXN0Ym90aCgiJW8iLCBiaWcsICIxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIC1iaWcsICItMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJTVvIiwgLWJpZywgIi0xMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMzNvIiwgLWJpZywgIi0xMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMzRvIiwgLWJpZywgIiAtMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJS0zNG8iLCAtYmlnLCAiLTEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwICIpCisgICAgICAgIHRlc3Rib3RoKCIlMDM0byIsIC1iaWcsICItMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUtMDM0byIsIC1iaWcsICItMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAgIikKKyAgICAgICAgdGVzdGJvdGgoIiUwMzZvIiwgLWJpZywgIi0wMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMDM2byIsIGJpZywgIjAwMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMCszNm8iLCBiaWcsICIrMDAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJSszNm8iLCBiaWcsICIgICArMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJTM2byIsIGJpZywgIiAgICAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlLjJvIiwgYmlnLCAiMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJS4zMm8iLCBiaWcsICIxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlLjMzbyIsIGJpZywgIjAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlMzQuMzNvIiwgYmlnLCAiIDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlLTM0LjMzbyIsIGJpZywgIjAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCAiKQorICAgICAgICB0ZXN0Ym90aCgiJW8iLCBiaWcsICIxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlI28iLCBiaWcsICIwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJSNvIiwgLWJpZywgIi0wMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJSMuMzRvIiwgLWJpZywgIi0wMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjKy4zNG8iLCBiaWcsICIrMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlIyAuMzRvIiwgYmlnLCAiIDAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJSMrLjM0byIsIGJpZywgIiswMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjLSsuMzRvIiwgYmlnLCAiKzAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICB0ZXN0Ym90aCgiJSMtKzM3LjM0byIsIGJpZywgIiswMDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwICAiKQorICAgICAgICB0ZXN0Ym90aCgiJSMrMzcuMzRvIiwgYmlnLCAiICArMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgICMgbmV4dCBvbmUgZ2V0cyBvbmUgbGVhZGluZyB6ZXJvIGZyb20gcHJlY2lzaW9uCisgICAgICAgIHRlc3Rib3RoKCIlLjMzbyIsIGJpZywgIjAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgICMgYmFzZSBtYXJrZXIgc2hvdWxkbid0IGNoYW5nZSB0aGF0LCBzaW5jZSAiMCIgaXMgcmVkdW5kYW50CisgICAgICAgIHRlc3Rib3RoKCIlIy4zM28iLCBiaWcsICIwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICAjIGJ1dCByZWR1Y2UgcHJlY2lzaW9uLCBhbmQgYmFzZSBtYXJrZXIgc2hvdWxkIGFkZCBhIHplcm8KKyAgICAgICAgdGVzdGJvdGgoIiUjLjMybyIsIGJpZywgIjAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgICMgb25lIGxlYWRpbmcgemVybyBmcm9tIHByZWNpc2lvbiwgYW5kIGFub3RoZXIgZnJvbSAiMCIgZmxhZyAmIHdpZHRoCisgICAgICAgIHRlc3Rib3RoKCIlMDM0LjMzbyIsIGJpZywgIjAwMTIzNDU2NzAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAiKQorICAgICAgICAjIGJhc2UgbWFya2VyIHNob3VsZG4ndCBjaGFuZ2UgdGhhdAorICAgICAgICB0ZXN0Ym90aCgiJTAjMzQuMzNvIiwgYmlnLCAiMDAxMjM0NTY3MDEyMzQ1NjcwMTIzNDU2NzAxMjM0NTY3MCIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIGZsb2F0KGJpZyksICIxMjM0NTZfX19fX19fX19fX19fX19fX19fX19fX19fXyIsIDYpCisKKyAgICAgICAgIyBTb21lIHNtYWxsIGludHMsIGluIGJvdGggUHl0aG9uIGludCBhbmQgbG9uZyBmbGF2b3JzKS4KKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgNDIsICI0MiIpCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIC00MiwgIi00MiIpCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIDQyTCwgIjQyIikKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgLTQyTCwgIi00MiIpCisgICAgICAgIHRlc3Rib3RoKCIlZCIsIDQyLjAsICI0MiIpCisgICAgICAgIHRlc3Rib3RoKCIlI3giLCAxLCAiMHgxIikKKyAgICAgICAgdGVzdGJvdGgoIiUjeCIsIDFMLCAiMHgxIikKKyAgICAgICAgdGVzdGJvdGgoIiUjWCIsIDEsICIwWDEiKQorICAgICAgICB0ZXN0Ym90aCgiJSNYIiwgMUwsICIwWDEiKQorICAgICAgICB0ZXN0Ym90aCgiJSN4IiwgMS4wLCAiMHgxIikKKyAgICAgICAgdGVzdGJvdGgoIiUjbyIsIDEsICIwMSIpCisgICAgICAgIHRlc3Rib3RoKCIlI28iLCAxTCwgIjAxIikKKyAgICAgICAgdGVzdGJvdGgoIiUjbyIsIDAsICIwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjbyIsIDBMLCAiMCIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIDAsICIwIikKKyAgICAgICAgdGVzdGJvdGgoIiVvIiwgMEwsICIwIikKKyAgICAgICAgdGVzdGJvdGgoIiVkIiwgMCwgIjAiKQorICAgICAgICB0ZXN0Ym90aCgiJWQiLCAwTCwgIjAiKQorICAgICAgICB0ZXN0Ym90aCgiJSN4IiwgMCwgIjB4MCIpCisgICAgICAgIHRlc3Rib3RoKCIlI3giLCAwTCwgIjB4MCIpCisgICAgICAgIHRlc3Rib3RoKCIlI1giLCAwLCAiMFgwIikKKyAgICAgICAgdGVzdGJvdGgoIiUjWCIsIDBMLCAiMFgwIikKKworICAgICAgICB0ZXN0Ym90aCgiJXgiLCAweDQyLCAiNDIiKQorICAgICAgICB0ZXN0Ym90aCgiJXgiLCAtMHg0MiwgIi00MiIpCisgICAgICAgIHRlc3Rib3RoKCIleCIsIDB4NDJMLCAiNDIiKQorICAgICAgICB0ZXN0Ym90aCgiJXgiLCAtMHg0MkwsICItNDIiKQorICAgICAgICB0ZXN0Ym90aCgiJXgiLCBmbG9hdCgweDQyKSwgIjQyIikKKworICAgICAgICB0ZXN0Ym90aCgiJW8iLCAwNDIsICI0MiIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIC0wNDIsICItNDIiKQorICAgICAgICB0ZXN0Ym90aCgiJW8iLCAwNDJMLCAiNDIiKQorICAgICAgICB0ZXN0Ym90aCgiJW8iLCAtMDQyTCwgIi00MiIpCisgICAgICAgIHRlc3Rib3RoKCIlbyIsIGZsb2F0KDA0MiksICI0MiIpCisKKyAgICAgICAgIyBhbHRlcm5hdGUgZmxvYXQgZm9ybWF0dGluZworICAgICAgICB0ZXN0Zm9ybWF0KCclZycsIDEuMSwgJzEuMScpCisgICAgICAgIHRlc3Rmb3JtYXQoJyUjZycsIDEuMSwgJzEuMTAwMDAnKQorCisgICAgICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTU1MTYuCisgICAgICAgIGNsYXNzIEludEZhaWxzKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkCisgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAKKworICAgICAgICBmc3QgPSBJbnRGYWlscygpCisgICAgICAgIHRlc3Rmb3JtYXQoIiV4IiwgZnN0LCAnMCcpCisKKyAgICAgICAgIyBUZXN0IGV4Y2VwdGlvbiBmb3IgdW5rbm93biBmb3JtYXQgY2hhcmFjdGVycworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1Rlc3RpbmcgZXhjZXB0aW9ucycKKworICAgICAgICBkZWYgdGVzdF9leGMoZm9ybWF0c3RyLCBhcmdzLCBleGNlcHRpb24sIGV4Y21zZyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVzdGZvcm1hdChmb3JtYXRzdHIsIGFyZ3MpCisgICAgICAgICAgICBleGNlcHQgZXhjZXB0aW9uLCBleGM6CisgICAgICAgICAgICAgICAgaWYgc3RyKGV4YykgPT0gZXhjbXNnOgorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInllcyIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAnbm8nCisgICAgICAgICAgICAgICAgICAgIHByaW50ICdVbmV4cGVjdGVkICcsIGV4Y2VwdGlvbiwgJzonLCByZXByKHN0cihleGMpKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICdubycKKyAgICAgICAgICAgICAgICBwcmludCAnVW5leHBlY3RlZCBleGNlcHRpb24nCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgJ2RpZCBub3QgZ2V0IGV4cGVjdGVkIGV4Y2VwdGlvbjogJXMnICUgZXhjbXNnCisKKyAgICAgICAgdGVzdF9leGMoJ2FiYyAlYScsIDEsIFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmb3JtYXQgY2hhcmFjdGVyICdhJyAoMHg2MSkgYXQgaW5kZXggNSIpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHRlc3RfZXhjKHVuaWNvZGUoJ2FiYyAlXHUzMDAwJywncmF3LXVuaWNvZGUtZXNjYXBlJyksIDEsIFZhbHVlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAidW5zdXBwb3J0ZWQgZm9ybWF0IGNoYXJhY3RlciAnPycgKDB4MzAwMCkgYXQgaW5kZXggNSIpCisKKyAgICAgICAgdGVzdF9leGMoJyVkJywgJzEnLCBUeXBlRXJyb3IsICIlZCBmb3JtYXQ6IGEgbnVtYmVyIGlzIHJlcXVpcmVkLCBub3Qgc3RyIikKKyAgICAgICAgdGVzdF9leGMoJyVnJywgJzEnLCBUeXBlRXJyb3IsICJmbG9hdCBhcmd1bWVudCByZXF1aXJlZCwgbm90IHN0ciIpCisgICAgICAgIHRlc3RfZXhjKCdubyBmb3JtYXQnLCAnMScsIFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgIm5vdCBhbGwgYXJndW1lbnRzIGNvbnZlcnRlZCBkdXJpbmcgc3RyaW5nIGZvcm1hdHRpbmciKQorICAgICAgICB0ZXN0X2V4Yygnbm8gZm9ybWF0JywgdScxJywgVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAibm90IGFsbCBhcmd1bWVudHMgY29udmVydGVkIGR1cmluZyBzdHJpbmcgZm9ybWF0dGluZyIpCisgICAgICAgIHRlc3RfZXhjKHUnbm8gZm9ybWF0JywgJzEnLCBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIikKKyAgICAgICAgdGVzdF9leGModSdubyBmb3JtYXQnLCB1JzEnLCBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJub3QgYWxsIGFyZ3VtZW50cyBjb252ZXJ0ZWQgZHVyaW5nIHN0cmluZyBmb3JtYXR0aW5nIikKKworICAgICAgICBjbGFzcyBGb29iYXIobG9uZyk6CisgICAgICAgICAgICBkZWYgX19vY3RfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIFJldHVybmluZyBhIG5vbi1zdHJpbmcgc2hvdWxkIG5vdCBibG93IHVwLgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmICsgMQorCisgICAgICAgIHRlc3RfZXhjKCclbycsIEZvb2JhcigpLCBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsIGxvbmcgZm91bmQiKQorCisgICAgICAgIGlmIG1heHNpemUgPT0gMioqMzEtMToKKyAgICAgICAgICAgICMgY3Jhc2hlcyAyLjIuMSBhbmQgZWFybGllcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAiJSpkIiUobWF4c2l6ZSwgLTEyNykKKyAgICAgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICciJSpkIiUobWF4c2l6ZSwgLTEyNykgc2hvdWxkIGZhaWwnCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEZvcm1hdFRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zvcm1hdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JtYXQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmEwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JtYXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zvcm1hdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JtYXQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYmEwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mb3JtYXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZwZm9ybWF0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkZTNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZwZm9ybWF0LnB5CkBAIC0wLDAgKzEsNzYgQEAKKycnJworICAgVGVzdHMgZm9yIGZwZm9ybWF0IG1vZHVsZQorICAgTmljayBNYXRoZXdzb24KKycnJworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCitpbXBvcnQgdW5pdHRlc3QKK2ZwZm9ybWF0ID0gaW1wb3J0X21vZHVsZSgnZnBmb3JtYXQnLCBkZXByZWNhdGVkPVRydWUpCitmaXgsIHNjaSwgTm90QU51bWJlciA9IGZwZm9ybWF0LmZpeCwgZnBmb3JtYXQuc2NpLCBmcGZvcm1hdC5Ob3RBTnVtYmVyCisKK1N0cmluZ1R5cGUgPSB0eXBlKCcnKQorCisjIFRlc3QgdGhlIG9sZCBhbmQgb2Jzb2xlc2NlbnQgZnBmb3JtYXQgbW9kdWxlLgorIworIyAoSXQncyBvYnNvbGVzY2VudCBiZWNhdXNlIGZpeChuLGQpID09ICIlLipmIiUoZCxuKSBhbmQKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2kobixkKSA9PSAiJS4qZSIlKGQsbikKKyMgIGZvciBhbGwgcmVhc29uYWJsZSBudW1lcmljIG4gYW5kIGQsIGV4Y2VwdCB0aGF0IHNjaSBnaXZlcyAzIGV4cG9uZW50CisjICBkaWdpdHMgaW5zdGVhZCBvZiAyLgorIworIyBEaWZmZXJlbmNlcyBvbmx5IG9jY3VyIGZvciB1bnJlYXNvbmFibGUgbiBhbmQgZC4gICAgPC4yIHdpbms+KQorCitjbGFzcyBGcGZvcm1hdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrRml4KHNlbGYsIG4sIGRpZ2l0cyk6CisgICAgICAgIHJlc3VsdCA9IGZpeChuLCBkaWdpdHMpCisgICAgICAgIGlmIGlzaW5zdGFuY2UobiwgU3RyaW5nVHlwZSk6CisgICAgICAgICAgICBuID0gcmVwcihuKQorICAgICAgICBleHBlY3RlZCA9ICIlLipmIiAlIChkaWdpdHMsIGZsb2F0KG4pKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgIGRlZiBjaGVja1NjaShzZWxmLCBuLCBkaWdpdHMpOgorICAgICAgICByZXN1bHQgPSBzY2kobiwgZGlnaXRzKQorICAgICAgICBpZiBpc2luc3RhbmNlKG4sIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgbiA9IHJlcHIobikKKyAgICAgICAgZXhwZWN0ZWQgPSAiJS4qZSIgJSAoZGlnaXRzLCBmbG9hdChuKSkKKyAgICAgICAgIyBhZGQgdGhlIGV4dHJhIDAgaWYgbmVlZGVkCisgICAgICAgIG51bSwgZXhwID0gZXhwZWN0ZWQuc3BsaXQoImUiKQorICAgICAgICBpZiBsZW4oZXhwKSA8IDQ6CisgICAgICAgICAgICBleHAgPSBleHBbMF0gKyAiMCIgKyBleHBbMTpdCisgICAgICAgIGV4cGVjdGVkID0gIiVzZSVzIiAlIChudW0sIGV4cCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9iYXNpY19jYXNlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXgoMTAwLjAvMywgMyksICczMy4zMzMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNjaSgxMDAuMC8zLCAzKSwgJzMuMzMzZSswMDEnKQorCisgICAgZGVmIHRlc3RfcmVhc29uYWJsZV92YWx1ZXMoc2VsZik6CisgICAgICAgIGZvciBkIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgZm9yIHZhbCBpbiAoMTAwMC4wLzMsIDEwMDAsIDEwMDAuMCwgLjAwMiwgMS4wLzMsIDFlMTApOgorICAgICAgICAgICAgICAgIGZvciByZWFsVmFsIGluICh2YWwsIDEuMC92YWwsIC12YWwsIC0xLjAvdmFsKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja0ZpeChyZWFsVmFsLCBkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrU2NpKHJlYWxWYWwsIGQpCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIyBOb3cgZm9yICd1bnJlYXNvbmFibGUgbiBhbmQgZCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXgoMS4wLCAxMDAwKSwgJzEuJysoJzAnKjEwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNjaSgiMSIrKCcwJyoxMDAwKSwgMCksICcxZSsxMDAwJykKKworICAgICAgICAjIFRoaXMgYmVoYXZpb3IgaXMgaW5jb25zaXN0ZW50LiAgc2NpIHJhaXNlcyBhbiBleGNlcHRpb247IGZpeCBkb2Vzbid0LgorICAgICAgICB5YWNodCA9ICJUaHJvYXR3b2JibGVyIE1hbmdyb3ZlIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeCh5YWNodCwgMTApLCB5YWNodCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2NpKHlhY2h0LCAxMCkKKyAgICAgICAgZXhjZXB0IE5vdEFOdW1iZXI6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiBvbiBub24tbnVtZXJpYyBzY2kiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoRnBmb3JtYXRUZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZwZm9ybWF0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZwZm9ybWF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY4NTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZwZm9ybWF0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZwZm9ybWF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTY4NTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnBmb3JtYXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTA5YmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJhY3Rpb25zLnB5CkBAIC0wLDAgKzEsNjA1IEBACisiIiJUZXN0cyBmb3IgTGliL2ZyYWN0aW9ucy5weS4iIiIKKworZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKK2ltcG9ydCBtYXRoCitpbXBvcnQgbnVtYmVycworaW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgZnJhY3Rpb25zCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gY29weSBpbXBvcnQgY29weSwgZGVlcGNvcHkKK2Zyb20gY1BpY2tsZSBpbXBvcnQgZHVtcHMsIGxvYWRzCitGID0gZnJhY3Rpb25zLkZyYWN0aW9uCitnY2QgPSBmcmFjdGlvbnMuZ2NkCisKKyMgZGVjb3JhdG9yIGZvciBza2lwcGluZyB0ZXN0cyBvbiBub24tSUVFRSA3NTQgcGxhdGZvcm1zCityZXF1aXJlc19JRUVFXzc1NCA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoCisgICAgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAorICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQorCitjbGFzcyBEdW1teUZsb2F0KG9iamVjdCk6CisgICAgIiIiRHVtbXkgZmxvYXQgY2xhc3MgZm9yIHRlc3RpbmcgY29tcGFyaXNvbnMgd2l0aCBGcmFjdGlvbnMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBmbG9hdCk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkR1bW15RmxvYXQgY2FuIG9ubHkgYmUgaW5pdGlhbGl6ZWQgZnJvbSBmbG9hdCIpCisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorCisgICAgZGVmIF9yaWNoY21wKHNlbGYsIG90aGVyLCBvcCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIG51bWJlcnMuUmF0aW9uYWwpOgorICAgICAgICAgICAgcmV0dXJuIG9wKEYuZnJvbV9mbG9hdChzZWxmLnZhbHVlKSwgb3RoZXIpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgRHVtbXlGbG9hdCk6CisgICAgICAgICAgICByZXR1cm4gb3Aoc2VsZi52YWx1ZSwgb3RoZXIudmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiByZXR1cm4gc2VsZi5fcmljaGNtcChvdGhlciwgb3BlcmF0b3IuZXEpCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLl9yaWNoY21wKG90aGVyLCBvcGVyYXRvci5sZSkKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKTogcmV0dXJuIHNlbGYuX3JpY2hjbXAob3RoZXIsIG9wZXJhdG9yLmx0KQorICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOiByZXR1cm4gc2VsZi5fcmljaGNtcChvdGhlciwgb3BlcmF0b3IuZ2UpCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6IHJldHVybiBzZWxmLl9yaWNoY21wKG90aGVyLCBvcGVyYXRvci5ndCkKKworICAgICMgc2hvdWxkbid0IGJlIGNhbGxpbmcgX19mbG9hdF9fIGF0IGFsbCB3aGVuIGRvaW5nIGNvbXBhcmlzb25zCisgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0IEZhbHNlLCAiX19mbG9hdF9fIHNob3VsZCBub3QgYmUgaW52b2tlZCBmb3IgY29tcGFyaXNvbnMiCisKKyAgICAjIHNhbWUgZ29lcyBmb3Igc3VidHJhY3Rpb24KKyAgICBkZWYgX19zdWJfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGFzc2VydCBGYWxzZSwgIl9fc3ViX18gc2hvdWxkIG5vdCBiZSBpbnZva2VkIGZvciBjb21wYXJpc29ucyIKKyAgICBfX3JzdWJfXyA9IF9fc3ViX18KKworICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICBfX2hhc2hfXyA9IE5vbmUKKworCitjbGFzcyBEdW1teVJhdGlvbmFsKG9iamVjdCk6CisgICAgIiIiVGVzdCBjb21wYXJpc29uIG9mIEZyYWN0aW9uIHdpdGggYSBuYWl2ZSByYXRpb25hbCBpbXBsZW1lbnRhdGlvbi4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBudW0sIGRlbik6CisgICAgICAgIGcgPSBnY2QobnVtLCBkZW4pCisgICAgICAgIHNlbGYubnVtID0gbnVtIC8vIGcKKyAgICAgICAgc2VsZi5kZW4gPSBkZW4gLy8gZworCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGZyYWN0aW9ucy5GcmFjdGlvbik6CisgICAgICAgICAgICByZXR1cm4gKHNlbGYubnVtID09IG90aGVyLl9udW1lcmF0b3IgYW5kCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGVuID09IG90aGVyLl9kZW5vbWluYXRvcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybihzZWxmLm51bSAqIG90aGVyLl9kZW5vbWluYXRvciA8IHNlbGYuZGVuICogb3RoZXIuX251bWVyYXRvcikKKworICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4oc2VsZi5udW0gKiBvdGhlci5fZGVub21pbmF0b3IgPiBzZWxmLmRlbiAqIG90aGVyLl9udW1lcmF0b3IpCisKKyAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuKHNlbGYubnVtICogb3RoZXIuX2Rlbm9taW5hdG9yIDw9IHNlbGYuZGVuICogb3RoZXIuX251bWVyYXRvcikKKworICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4oc2VsZi5udW0gKiBvdGhlci5fZGVub21pbmF0b3IgPj0gc2VsZi5kZW4gKiBvdGhlci5fbnVtZXJhdG9yKQorCisgICAgIyB0aGlzIGNsYXNzIGlzIGZvciB0ZXN0aW5nIGNvbXBhcmlzb25zOyBjb252ZXJzaW9uIHRvIGZsb2F0CisgICAgIyBzaG91bGQgbmV2ZXIgYmUgdXNlZCBmb3IgYSBjb21wYXJpc29uLCBzaW5jZSBpdCBsb3NlcyBhY2N1cmFjeQorICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgIGFzc2VydCBGYWxzZSwgIl9fZmxvYXRfXyBzaG91bGQgbm90IGJlIGludm9rZWQiCisKKyAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgX19oYXNoX18gPSBOb25lCisKKworY2xhc3MgRHVtbXlGcmFjdGlvbihmcmFjdGlvbnMuRnJhY3Rpb24pOgorICAgICIiIkR1bW15IEZyYWN0aW9uIHN1YmNsYXNzIGZvciBjb3B5IGFuZCBkZWVwY29weSB0ZXN0aW5nLiIiIgorCitjbGFzcyBHY2RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0TWlzYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnY2QoMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZ2NkKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBnY2QoLTEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGdjZCgwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgZ2NkKDAsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBnY2QoNywgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIGdjZCg3LCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZ2NkKC0yMywgMTUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEyLCBnY2QoMTIwLCA4NCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEyLCBnY2QoODQsIC0xMjApKQorCisKK2RlZiBfY29tcG9uZW50cyhyKToKKyAgICByZXR1cm4gKHIubnVtZXJhdG9yLCByLmRlbm9taW5hdG9yKQorCisKK2NsYXNzIEZyYWN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0VHlwZWRFcXVhbHMoc2VsZiwgZXhwZWN0ZWQsIGFjdHVhbCk6CisgICAgICAgICIiIkFzc2VydHMgdGhhdCBib3RoIHRoZSB0eXBlcyBhbmQgdmFsdWVzIGFyZSB0aGUgc2FtZS4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGV4cGVjdGVkKSwgdHlwZShhY3R1YWwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwpCisKKyAgICBkZWYgYXNzZXJ0UmFpc2VzTWVzc2FnZShzZWxmLCBleGNfdHlwZSwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZSwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiQXNzZXJ0cyB0aGF0IGNhbGxhYmxlKCphcmdzLCAqKmt3YXJncykgcmFpc2VzIGV4Y190eXBlKG1lc3NhZ2UpLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjYWxsYWJsZSgqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGV4Y2VwdCBleGNfdHlwZSwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgc3RyKGUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIlcyBub3QgcmFpc2VkIiAlIGV4Y190eXBlLl9fbmFtZV9fKQorCisgICAgZGVmIHRlc3RJbml0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwLCAxKSwgX2NvbXBvbmVudHMoRigpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNywgMSksIF9jb21wb25lbnRzKEYoNykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg3LCAzKSwgX2NvbXBvbmVudHMoRihGKDcsIDMpKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTEsIDEpLCBfY29tcG9uZW50cyhGKC0xLCAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0xLCAxKSwgX2NvbXBvbmVudHMoRigxLCAtMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxLCAxKSwgX2NvbXBvbmVudHMoRigtMiwgLTIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSwgMiksIF9jb21wb25lbnRzKEYoNSwgMTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNywgMTUpLCBfY29tcG9uZW50cyhGKDcsIDE1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEwKioyMywgMSksIF9jb21wb25lbnRzKEYoMTAqKjIzKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMywgNzcpLCBfY29tcG9uZW50cyhGKEYoMywgNyksIDExKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC05LCA1KSwgX2NvbXBvbmVudHMoRigyLCBGKC0xMCwgOSkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMjQ4NiwgMjQ4NSksIF9jb21wb25lbnRzKEYoRigyMiwgNyksIEYoMzU1LCAxMTMpKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKFplcm9EaXZpc2lvbkVycm9yLCAiRnJhY3Rpb24oMTIsIDApIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYsIDEyLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYsIDEuNSArIDNqKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgIjMvMiIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgMywgMGopCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgMywgMWopCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBkZWYgdGVzdEluaXRGcm9tRmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUsIDIpLCBfY29tcG9uZW50cyhGKDIuNSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwLCAxKSwgX2NvbXBvbmVudHMoRigtMC4wKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDM2MDI4Nzk3MDE4OTYzOTcsIDM2MDI4Nzk3MDE4OTYzOTY4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50cyhGKDAuMSkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYsIGZsb2F0KCduYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLCBmbG9hdCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgZmxvYXQoJy1pbmYnKSkKKworICAgIGRlZiB0ZXN0SW5pdEZyb21EZWNpbWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxMSwgMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRzKEYoRGVjaW1hbCgnMS4xJykpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNywgMjAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50cyhGKERlY2ltYWwoJzMuNWUtMicpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRzKEYoRGVjaW1hbCgnLjAwMGUyMCcpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgRGVjaW1hbCgnbmFuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRiwgRGVjaW1hbCgnc25hbicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYsIERlY2ltYWwoJ2luZicpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYsIERlY2ltYWwoJy1pbmYnKSkKKworICAgIGRlZiB0ZXN0RnJvbVN0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSwgMSksIF9jb21wb25lbnRzKEYoIjUiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDMsIDIpLCBfY29tcG9uZW50cyhGKCIzLzIiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDMsIDIpLCBfY29tcG9uZW50cyhGKCIgXG4gICszLzIiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0zLCAyKSwgX2NvbXBvbmVudHMoRigiLTMvMiAgIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxMywgMiksIF9jb21wb25lbnRzKEYoIiAgICAwMTMvMDIgXG4gICIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTMsIDIpLCBfY29tcG9uZW50cyhGKHUiICAgIDAxMy8wMiBcbiAgIikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDE2LCA1KSwgX2NvbXBvbmVudHMoRigiIDMuMiAiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0xNiwgNSksIF9jb21wb25lbnRzKEYodSIgLTMuMiAiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0zLCAxKSwgX2NvbXBvbmVudHMoRih1IiAtMy4gIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgzLCA1KSwgX2NvbXBvbmVudHMoRih1IiAuNiAiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEsIDMxMjUpLCBfY29tcG9uZW50cyhGKCIzMi5lLTUiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEwMDAwMDAsIDEpLCBfY29tcG9uZW50cyhGKCIxRSswNiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTEyMzAwLCAxKSwgX2NvbXBvbmVudHMoRigiLTEuMjNlNCIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCwgMSksIF9jb21wb25lbnRzKEYoIiAuMGUrMFx0IikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwLCAxKSwgX2NvbXBvbmVudHMoRigiLTAuMDAwZTAiKSkpCisKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBaZXJvRGl2aXNpb25FcnJvciwgIkZyYWN0aW9uKDMsIDApIiwKKyAgICAgICAgICAgIEYsICIzLzAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJzMvJyIsCisgICAgICAgICAgICBGLCAiMy8iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJy8yJyIsCisgICAgICAgICAgICBGLCAiLzIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJzMgLzInIiwKKyAgICAgICAgICAgIEYsICIzIC8yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgIyBEZW5vbWluYXRvcnMgZG9uJ3QgbmVlZCBhIHNpZ24uCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJzMvKzInIiwKKyAgICAgICAgICAgIEYsICIzLysyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgIyBJbWl0YXRlIGZsb2F0J3MgcGFyc2luZy4KKyAgICAgICAgICAgIFZhbHVlRXJyb3IsICJJbnZhbGlkIGxpdGVyYWwgZm9yIEZyYWN0aW9uOiAnKyAzLzInIiwKKyAgICAgICAgICAgIEYsICIrIDMvMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgICMgQXZvaWQgdHJlYXRpbmcgJy4nIGFzIGEgcmVnZXggc3BlY2lhbCBjaGFyYWN0ZXIuCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJzNhMiciLAorICAgICAgICAgICAgRiwgIjNhMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgICMgRG9uJ3QgYWNjZXB0IGNvbWJpbmF0aW9ucyBvZiBkZWNpbWFscyBhbmQgZnJhY3Rpb25zLgorICAgICAgICAgICAgVmFsdWVFcnJvciwgIkludmFsaWQgbGl0ZXJhbCBmb3IgRnJhY3Rpb246ICczLzcuMiciLAorICAgICAgICAgICAgRiwgIjMvNy4yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgIyBEb24ndCBhY2NlcHQgY29tYmluYXRpb25zIG9mIGRlY2ltYWxzIGFuZCBmcmFjdGlvbnMuCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJzMuMi83JyIsCisgICAgICAgICAgICBGLCAiMy4yLzciKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICAjIEFsbG93IDMuIGFuZCAuMywgYnV0IG5vdCAuCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiSW52YWxpZCBsaXRlcmFsIGZvciBGcmFjdGlvbjogJy4nIiwKKyAgICAgICAgICAgIEYsICIuIikKKworICAgIGRlZiB0ZXN0SW1tdXRhYmxlKHNlbGYpOgorICAgICAgICByID0gRig3LCAzKQorICAgICAgICByLl9faW5pdF9fKDIsIDE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg3LCAzKSwgX2NvbXBvbmVudHMocikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHIsICdudW1lcmF0b3InLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHIsICdkZW5vbWluYXRvcicsIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDcsIDMpLCBfY29tcG9uZW50cyhyKSkKKworICAgICAgICAjIEJ1dCBpZiB5b3UgX3JlYWxseV8gbmVlZCB0bzoKKyAgICAgICAgci5fbnVtZXJhdG9yID0gNAorICAgICAgICByLl9kZW5vbWluYXRvciA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNCwgMiksIF9jb21wb25lbnRzKHIpKQorICAgICAgICAjIFdoaWNoIGJyZWFrcyBzb21lIGltcG9ydGFudCBvcGVyYXRpb25zOgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKEYoNCwgMiksIHIpCisKKyAgICBkZWYgdGVzdEZyb21GbG9hdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBGLmZyb21fZmxvYXQsIDMrNGopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEwLCAxKSwgX2NvbXBvbmVudHMoRi5mcm9tX2Zsb2F0KDEwKSkpCisgICAgICAgIGJpZ2ludCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYmlnaW50LCAxKSwgX2NvbXBvbmVudHMoRi5mcm9tX2Zsb2F0KGJpZ2ludCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwLCAxKSwgX2NvbXBvbmVudHMoRi5mcm9tX2Zsb2F0KC0wLjApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAsIDEpLCBfY29tcG9uZW50cyhGLmZyb21fZmxvYXQoMTAuMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtNSwgMiksIF9jb21wb25lbnRzKEYuZnJvbV9mbG9hdCgtMi41KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDk5OTk5OTk5OTk5OTk5OTkxNjExMzkyLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50cyhGLmZyb21fZmxvYXQoMWUyMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KDEwKioyMyksIGZsb2F0KEYuZnJvbV9mbG9hdCgxZTIzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDM2MDI4Nzk3MDE4OTYzOTcsIDExMjU4OTk5MDY4NDI2MjQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRzKEYuZnJvbV9mbG9hdCgzLjIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLjIsIGZsb2F0KEYuZnJvbV9mbG9hdCgzLjIpKSkKKworICAgICAgICBpbmYgPSAxZTEwMDAKKyAgICAgICAgbmFuID0gaW5mIC0gaW5mCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFR5cGVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IGluZiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgRi5mcm9tX2Zsb2F0LCBpbmYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFR5cGVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IC1pbmYgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIEYuZnJvbV9mbG9hdCwgLWluZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgVHlwZUVycm9yLCAiQ2Fubm90IGNvbnZlcnQgbmFuIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBGLmZyb21fZmxvYXQsIG5hbikKKworICAgIGRlZiB0ZXN0RnJvbURlY2ltYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgRi5mcm9tX2RlY2ltYWwsIDMrNGopCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigxMCwgMSksIEYuZnJvbV9kZWNpbWFsKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDApLCBGLmZyb21fZGVjaW1hbChEZWNpbWFsKCItMCIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDUsIDEwKSwgRi5mcm9tX2RlY2ltYWwoRGVjaW1hbCgiMC41IikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoNSwgMTAwMCksIEYuZnJvbV9kZWNpbWFsKERlY2ltYWwoIjVlLTMiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRig1MDAwKSwgRi5mcm9tX2RlY2ltYWwoRGVjaW1hbCgiNWUzIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgLSBGKDEsIDEwKiozMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwoRGVjaW1hbCgiMC4iICsgIjkiICogMzApKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBUeXBlRXJyb3IsICJDYW5ub3QgY29udmVydCBJbmZpbml0eSB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoImluZiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBUeXBlRXJyb3IsICJDYW5ub3QgY29udmVydCAtSW5maW5pdHkgdG8gRnJhY3Rpb24uIiwKKyAgICAgICAgICAgIEYuZnJvbV9kZWNpbWFsLCBEZWNpbWFsKCItaW5mIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFR5cGVFcnJvciwgIkNhbm5vdCBjb252ZXJ0IE5hTiB0byBGcmFjdGlvbi4iLAorICAgICAgICAgICAgRi5mcm9tX2RlY2ltYWwsIERlY2ltYWwoIm5hbiIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc01lc3NhZ2UoCisgICAgICAgICAgICBUeXBlRXJyb3IsICJDYW5ub3QgY29udmVydCBzTmFOIHRvIEZyYWN0aW9uLiIsCisgICAgICAgICAgICBGLmZyb21fZGVjaW1hbCwgRGVjaW1hbCgic25hbiIpKQorCisgICAgZGVmIHRlc3RMaW1pdERlbm9taW5hdG9yKHNlbGYpOgorICAgICAgICBycGkgPSBGKCczLjE0MTU5MjY1MzU4OTc5MzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJwaS5saW1pdF9kZW5vbWluYXRvcigxMDAwMCksIEYoMzU1LCAxMTMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC1ycGkubGltaXRfZGVub21pbmF0b3IoMTAwMDApLCBGKC0zNTUsIDExMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnBpLmxpbWl0X2Rlbm9taW5hdG9yKDExMyksIEYoMzU1LCAxMTMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJwaS5saW1pdF9kZW5vbWluYXRvcigxMTIpLCBGKDMzMywgMTA2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDIwMSwgMjAwKS5saW1pdF9kZW5vbWluYXRvcigxMDApLCBGKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMjAxLCAyMDApLmxpbWl0X2Rlbm9taW5hdG9yKDEwMSksIEYoMTAyLCAxMDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMCkubGltaXRfZGVub21pbmF0b3IoMTAwMDApLCBGKDApKQorICAgICAgICBmb3IgaSBpbiAoMCwgLTEpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgICAgIFZhbHVlRXJyb3IsICJtYXhfZGVub21pbmF0b3Igc2hvdWxkIGJlIGF0IGxlYXN0IDEiLAorICAgICAgICAgICAgICAgIEYoMSkubGltaXRfZGVub21pbmF0b3IsIGkpCisKKyAgICBkZWYgdGVzdENvbnZlcnNpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKC0xLCBtYXRoLnRydW5jKEYoLTExLCAxMCkpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKC0xLCBpbnQoRigtMTEsIDEwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMSwgbWF0aC50cnVuYyhGKDExLCAxMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBib29sKEYoMCwgMSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGJvb2woRigzLCAyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMC4xLCBmbG9hdChGKDEsIDEwKSkpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IF9fZmxvYXRfXyBpc24ndCBpbXBsZW1lbnRlZCBieSBjb252ZXJ0aW5nIHRoZQorICAgICAgICAjIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IgdG8gZmxvYXQgYmVmb3JlIGRpdmlkaW5nLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmbG9hdCwgbG9uZygnMicqNDAwKyc3JykpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMi4wLzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KEYobG9uZygnMicqNDAwKyc3JyksIGxvbmcoJzMnKjQwMCsnMScpKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjErMGosIGNvbXBsZXgoRigxLDEwKSkpCisKKworICAgIGRlZiB0ZXN0QXJpdGhtZXRpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDEsIDIpLCBGKDEsIDEwKSArIEYoMiwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigtMywgMTApLCBGKDEsIDEwKSAtIEYoMiwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRigxLCAyNSksIEYoMSwgMTApICogRigyLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDEsIDQpLCBGKDEsIDEwKSAvIEYoMiwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMiwgRig5LCAxMCkgLy8gRigyLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxMCoqMjMsIEYoMTAqKjIzLCAxKSAvLyBGKDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMiwgMyksIEYoLTcsIDMpICUgRigzLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGKDgsIDI3KSwgRigyLCAzKSAqKiBGKDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMjcsIDgpLCBGKDIsIDMpICoqIEYoLTMpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDIuMCwgRig0KSAqKiBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEYoMSwgMSksICtGKDEsIDEpKQorICAgICAgICAjIFdpbGwgcmV0dXJuIDFqIGluIDMuMDoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93LCBGKC0xKSwgRigxLCAyKSkKKworICAgIGRlZiB0ZXN0TWl4ZWRBcml0aG1ldGljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMTEsIDEwKSwgRigxLCAxMCkgKyAxKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDEuMSwgRigxLCAxMCkgKyAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMS4xICsgMGosIEYoMSwgMTApICsgKDEuMCArIDBqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhGKDExLCAxMCksIDEgKyBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxLjEsIDEuMCArIEYoMSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDEuMSArIDBqLCAoMS4wICsgMGopICsgRigxLCAxMCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhGKC05LCAxMCksIEYoMSwgMTApIC0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygtMC45LCBGKDEsIDEwKSAtIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygtMC45ICsgMGosIEYoMSwgMTApIC0gKDEuMCArIDBqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhGKDksIDEwKSwgMSAtIEYoMSwgMTApKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuOSwgMS4wIC0gRigxLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMC45ICsgMGosICgxLjAgKyAwaikgLSBGKDEsIDEwKSkKKworICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMSwgMTApLCBGKDEsIDEwKSAqIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMC4xLCBGKDEsIDEwKSAqIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEgKyAwaiwgRigxLCAxMCkgKiAoMS4wICsgMGopKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMSwgMTApLCAxICogRigxLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMC4xLCAxLjAgKiBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEgKyAwaiwgKDEuMCArIDBqKSAqIEYoMSwgMTApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxLCAxMCksIEYoMSwgMTApIC8gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEsIEYoMSwgMTApIC8gMS4wKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAuMSArIDBqLCBGKDEsIDEwKSAvICgxLjAgKyAwaikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxMCwgMSksIDEgLyBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxMC4wLCAxLjAgLyBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygxMC4wICsgMGosICgxLjAgKyAwaikgLyBGKDEsIDEwKSkKKworICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDAsIEYoMSwgMTApIC8vIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMC4wLCBGKDEsIDEwKSAvLyAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMTAsIDEgLy8gRigxLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMTAqKjIzLCAxMCoqMjIgLy8gRigxLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMTAuMCwgMS4wIC8vIEYoMSwgMTApKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoRigxLCAxMCksIEYoMSwgMTApICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEsIEYoMSwgMTApICUgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMCwgMSksIDEgJSBGKDEsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjAsIDEuMCAlIEYoMSwgMTApKQorCisgICAgICAgICMgTm8gbmVlZCBmb3IgZGl2bW9kIHNpbmNlIHdlIGRvbid0IG92ZXJyaWRlIGl0LgorCisgICAgICAgICMgKiogaGFzIG1vcmUgaW50ZXJlc3RpbmcgY29udmVyc2lvbiBydWxlcy4KKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyhGKDEwMCwgMSksIEYoMSwgMTApICoqIC0yKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMTAwLCAxKSwgRigxMCwgMSkgKiogMikKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEsIEYoMSwgMTApICoqIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjEgKyAwaiwgRigxLCAxMCkgKiogKDEuMCArIDBqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscyg0ICwgMiAqKiBGKDIsIDEpKQorICAgICAgICAjIFdpbGwgcmV0dXJuIDFqIGluIDMuMDoKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG93LCAoLTEpLCBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKEYoMSwgNCkgLCAyICoqIEYoLTIsIDEpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKDIuMCAsIDQgKiogRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlZEVxdWFscygwLjI1LCAyLjAgKiogRigtMiwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoMS4wICsgMGosICgxLjAgKyAwaikgKiogRigxLCAxMCkpCisKKyAgICBkZWYgdGVzdE1peGluZ1dpdGhEZWNpbWFsKHNlbGYpOgorICAgICAgICAjIERlY2ltYWwgcmVmdXNlcyBtaXhlZCBjb21wYXJpc29ucy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNNZXNzYWdlKAorICAgICAgICAgICAgVHlwZUVycm9yLAorICAgICAgICAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKzogJ0ZyYWN0aW9uJyBhbmQgJ0RlY2ltYWwnIiwKKyAgICAgICAgICAgIG9wZXJhdG9yLmFkZCwgRigzLDExKSwgRGVjaW1hbCgnMy4xNDE1OTI2JykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzTWVzc2FnZSgKKyAgICAgICAgICAgIFR5cGVFcnJvciwKKyAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yICs6ICdEZWNpbWFsJyBhbmQgJ0ZyYWN0aW9uJyIsCisgICAgICAgICAgICBvcGVyYXRvci5hZGQsIERlY2ltYWwoJzMuMTQxNTkyNicpLCBGKDMsMTEpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKEYoNSwgMiksIERlY2ltYWwoJzIuNScpKQorCisgICAgZGVmIHRlc3RDb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPCBGKDIsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMSwgMikgPCBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8PSBGKDIsIDMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8PSBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMiwgMykgPD0gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPT0gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpID09IEYoMSwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSAhPSBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSAhPSBGKDEsIDMpKQorCisgICAgZGVmIHRlc3RDb21wYXJpc29uc0R1bW15UmF0aW9uYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpID09IER1bW15UmF0aW9uYWwoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEdW1teVJhdGlvbmFsKDEsIDIpID09IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA9PSBEdW1teVJhdGlvbmFsKDMsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKER1bW15UmF0aW9uYWwoMywgNCkgPT0gRigxLCAyKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA8IER1bW15UmF0aW9uYWwoMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA8IER1bW15UmF0aW9uYWwoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA8IER1bW15UmF0aW9uYWwoMSwgNykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA+IER1bW15UmF0aW9uYWwoMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA+IER1bW15UmF0aW9uYWwoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpID4gRHVtbXlSYXRpb25hbCgxLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPD0gRHVtbXlSYXRpb25hbCgzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPD0gRHVtbXlSYXRpb25hbCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpIDw9IER1bW15UmF0aW9uYWwoMSwgNykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA+PSBEdW1teVJhdGlvbmFsKDMsIDQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA+PSBEdW1teVJhdGlvbmFsKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA+PSBEdW1teVJhdGlvbmFsKDEsIDcpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEdW1teVJhdGlvbmFsKDEsIDIpIDwgRigzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEdW1teVJhdGlvbmFsKDEsIDIpIDwgRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEdW1teVJhdGlvbmFsKDEsIDIpIDwgRigxLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEdW1teVJhdGlvbmFsKDEsIDIpID4gRigzLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEdW1teVJhdGlvbmFsKDEsIDIpID4gRigxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKER1bW15UmF0aW9uYWwoMSwgMikgPiBGKDEsIDcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRHVtbXlSYXRpb25hbCgxLCAyKSA8PSBGKDMsIDQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRHVtbXlSYXRpb25hbCgxLCAyKSA8PSBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKER1bW15UmF0aW9uYWwoMSwgMikgPD0gRigxLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShEdW1teVJhdGlvbmFsKDEsIDIpID49IEYoMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEdW1teVJhdGlvbmFsKDEsIDIpID49IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEdW1teVJhdGlvbmFsKDEsIDIpID49IEYoMSwgNykpCisKKyAgICBkZWYgdGVzdENvbXBhcmlzb25zRHVtbXlGbG9hdChzZWxmKToKKyAgICAgICAgeCA9IER1bW15RmxvYXQoMS4vMy4pCisgICAgICAgIHkgPSBGKDEsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4ICE9IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IDwgeSBvciB4ID4geSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh4ID09IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeCA8PSB5IGFuZCB4ID49IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5ICE9IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IDwgeCBvciB5ID4geCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh5ID09IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeSA8PSB4IGFuZCB5ID49IHgpCisKKyAgICBkZWYgdGVzdE1peGVkTGVzcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgPCBGKDUsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDIgPCBGKDQsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRig1LCAyKSA8IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRig0LCAyKSA8IDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPCAwLjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA8IDAuNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAuNCA8IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMC41IDwgRigxLCAyKSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZsb2F0KCdpbmYnKSA8IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbG9hdCgnLWluZicpIDwgRigwLCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmxvYXQoJ25hbicpIDwgRigtMywgNykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpIDwgZmxvYXQoJ2luZicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMTcsIDEyKSA8IGZsb2F0KCctaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxNDQsIC04OSkgPCBmbG9hdCgnbmFuJykpCisKKyAgICBkZWYgdGVzdE1peGVkTGVzc0VxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoMC41IDw9IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMC42IDw9IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDEsIDIpIDw9IDAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDEsIDIpIDw9IDAuNCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgPD0gRig0LCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgyIDw9IEYoMywgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGKDQsIDIpIDw9IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRig1LCAyKSA8PSAyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmxvYXQoJ2luZicpIDw9IEYoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbG9hdCgnLWluZicpIDw9IEYoMCwgMTApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZsb2F0KCduYW4nKSA8PSBGKC0zLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEYoMSwgMikgPD0gZmxvYXQoJ2luZicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMTcsIDEyKSA8PSBmbG9hdCgnLWluZicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoMTQ0LCAtODkpIDw9IGZsb2F0KCduYW4nKSkKKworICAgIGRlZiB0ZXN0QmlnRmxvYXRDb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgIyBCZWNhdXNlIDEwKioyMyBjYW4ndCBiZSByZXByZXNlbnRlZCBleGFjdGx5IGFzIGEgZmxvYXQ6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxMCoqMjMpID09IGZsb2F0KDEwKioyMykpCisgICAgICAgICMgVGhlIGZpcnN0IHRlc3QgZGVtb25zdHJhdGVzIHdoeSB0aGVzZSBhcmUgaW1wb3J0YW50LgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDFlMjMgPCBmbG9hdChGKG1hdGgudHJ1bmMoMWUyMykgKyAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxZTIzIDwgRihtYXRoLnRydW5jKDFlMjMpICsgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMWUyMyA8PSBGKG1hdGgudHJ1bmMoMWUyMykgLSAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDFlMjMgPiBGKG1hdGgudHJ1bmMoMWUyMykgLSAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgxZTIzID49IEYobWF0aC50cnVuYygxZTIzKSArIDEpKQorCisgICAgZGVmIHRlc3RCaWdDb21wbGV4Q29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxMCoqMjMpID09IGNvbXBsZXgoMTAqKjIzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5ndCwgRigxMCoqMjMpLCBjb21wbGV4KDEwKioyMykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubGUsIEYoMTAqKjIzKSwgY29tcGxleCgxMCoqMjMpKQorCisgICAgICAgIHggPSBGKDMsIDgpCisgICAgICAgIHogPSBjb21wbGV4KDAuMzc1LCAwLjApCisgICAgICAgIHcgPSBjb21wbGV4KDAuMzc1LCAwLjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4ID09IHopCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoeCAhPSB6KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHggPT0gdykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggIT0gdykKKyAgICAgICAgZm9yIG9wIGluIG9wZXJhdG9yLmx0LCBvcGVyYXRvci5sZSwgb3BlcmF0b3IuZ3QsIG9wZXJhdG9yLmdlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcCwgeCwgeikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3AsIHosIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wLCB4LCB3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcCwgdywgeCkKKworICAgIGRlZiB0ZXN0TWl4ZWRFcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAuNSA9PSBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDAuNiA9PSBGKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRigxLCAyKSA9PSAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRigxLCAyKSA9PSAwLjQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyID09IEYoNCwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoMiA9PSBGKDMsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRig0LCAyKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEYoNSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDUsIDIpID09IGZsb2F0KCduYW4nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmbG9hdCgnbmFuJykgPT0gRigzLCA3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGKDUsIDIpID09IGZsb2F0KCdpbmYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmbG9hdCgnLWluZicpID09IEYoMiwgNSkpCisKKyAgICBkZWYgdGVzdFN0cmluZ2lmaWNhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiRnJhY3Rpb24oNywgMykiLCByZXByKEYoNywgMykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJGcmFjdGlvbig2MjgzMTg1MzA3LCAyMDAwMDAwMDAwKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihGKCczLjE0MTU5MjY1MzUnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkZyYWN0aW9uKC0xLCAxMDAwMDAwMDAwMDAwMDAwMDAwMDApIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXByKEYoMSwgLTEwKioyMCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCI3LzMiLCBzdHIoRig3LCAzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjciLCBzdHIoRig3LCAxKSkpCisKKyAgICBkZWYgdGVzdEhhc2goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCgyLjUpLCBoYXNoKEYoNSwgMikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goMTAqKjUwKSwgaGFzaChGKDEwKio1MCkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGhhc2goZmxvYXQoMTAqKjIzKSksIGhhc2goRigxMCoqMjMpKSkKKworICAgIGRlZiB0ZXN0QXBwcm94aW1hdGVQaShzZWxmKToKKyAgICAgICAgIyBBbGdvcml0aG0gYm9ycm93ZWQgZnJvbQorICAgICAgICAjIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGliL2RlY2ltYWwtcmVjaXBlcy5odG1sCisgICAgICAgIHRocmVlID0gRigzKQorICAgICAgICBsYXN0cywgdCwgcywgbiwgbmEsIGQsIGRhID0gMCwgdGhyZWUsIDMsIDEsIDAsIDAsIDI0CisgICAgICAgIHdoaWxlIGFicyhzIC0gbGFzdHMpID4gRigxLCAxMCoqOSk6CisgICAgICAgICAgICBsYXN0cyA9IHMKKyAgICAgICAgICAgIG4sIG5hID0gbituYSwgbmErOAorICAgICAgICAgICAgZCwgZGEgPSBkK2RhLCBkYSszMgorICAgICAgICAgICAgdCA9ICh0ICogbikgLyBkCisgICAgICAgICAgICBzICs9IHQKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtYXRoLnBpLCBzKQorCisgICAgZGVmIHRlc3RBcHByb3hpbWF0ZUNvczEoc2VsZik6CisgICAgICAgICMgQWxnb3JpdGhtIGJvcnJvd2VkIGZyb20KKyAgICAgICAgIyBodHRwOi8vZG9jcy5weXRob24ub3JnL2xpYi9kZWNpbWFsLXJlY2lwZXMuaHRtbAorICAgICAgICB4ID0gRigxKQorICAgICAgICBpLCBsYXN0cywgcywgZmFjdCwgbnVtLCBzaWduID0gMCwgMCwgRigxKSwgMSwgMSwgMQorICAgICAgICB3aGlsZSBhYnMocyAtIGxhc3RzKSA+IEYoMSwgMTAqKjkpOgorICAgICAgICAgICAgbGFzdHMgPSBzCisgICAgICAgICAgICBpICs9IDIKKyAgICAgICAgICAgIGZhY3QgKj0gaSAqIChpLTEpCisgICAgICAgICAgICBudW0gKj0geCAqIHgKKyAgICAgICAgICAgIHNpZ24gKj0gLTEKKyAgICAgICAgICAgIHMgKz0gbnVtIC8gZmFjdCAqIHNpZ24KKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtYXRoLmNvcygxKSwgcykKKworICAgIGRlZiB0ZXN0X2NvcHlfZGVlcGNvcHlfcGlja2xlKHNlbGYpOgorICAgICAgICByID0gRigxMywgNykKKyAgICAgICAgZHIgPSBEdW1teUZyYWN0aW9uKDEzLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIGxvYWRzKGR1bXBzKHIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChyKSwgaWQoY29weShyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQociksIGlkKGRlZXBjb3B5KHIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkciksIGlkKGNvcHkoZHIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChkciksIGlkKGRlZXBjb3B5KGRyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZWRFcXVhbHMoZHIsIGNvcHkoZHIpKQorICAgICAgICBzZWxmLmFzc2VydFR5cGVkRXF1YWxzKGRyLCBkZWVwY29weShkcikpCisKKyAgICBkZWYgdGVzdF9zbG90cyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA0OTk4CisgICAgICAgIHIgPSBGKDEzLCA3KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgciwgJ2EnLCAxMCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChGcmFjdGlvblRlc3QsIEdjZFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcmFjdGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmI3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcmFjdGlvbnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ZyYWN0aW9ucy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcmFjdGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOWQzYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mcmFjdGlvbnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zyb3plbi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zyb3plbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFmNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5CkBAIC0wLDAgKzEsNDcgQEAKKyMgVGVzdCB0aGUgZnJvemVuIG1vZHVsZSBkZWZpbmVkIGluIGZyb3plbi5jLgorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9zdGRvdXQsIHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisKK2NsYXNzIEZyb3plblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9mcm96ZW4oc2VsZik6CisKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IF9faGVsbG9fXworICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCB4OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IF9faGVsbG9fXyBmYWlsZWQ6IiArIHN0cih4KSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBfX3BoZWxsb19fCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIHg6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbXBvcnQgX19waGVsbG9fXyBmYWlsZWQ6IiArIHN0cih4KSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBfX3BoZWxsb19fLnNwYW0KKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgeDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImltcG9ydCBfX3BoZWxsb19fLnNwYW0gZmFpbGVkOiIgKyBzdHIoeCkpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgX19waGVsbG9fXy5mb28KKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IF9fcGhlbGxvX18uZm9vIHNob3VsZCBoYXZlIGZhaWxlZCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnSGVsbG8gd29ybGQuLi5cbkhlbGxvIHdvcmxkLi4uXG5IZWxsbyB3b3JsZC4uLlxuJykKKworICAgICAgICBkZWwgc3lzLm1vZHVsZXNbJ19faGVsbG9fXyddCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1snX19waGVsbG9fXyddCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1snX19waGVsbG9fXy5zcGFtJ10KKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEZyb3plblRlc3RzKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zyb3plbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMTdkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zyb3plbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnJvemVuLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zyb3plbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkMTdkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Zyb3plbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnRwbGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnRwbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MmU4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHkKQEAgLTAsMCArMSw3NzggQEAKKyIiIlRlc3Qgc2NyaXB0IGZvciBmdHBsaWIgbW9kdWxlLiIiIgorCisjIE1vZGlmaWVkIGJ5IEdpYW1wYW9sbyBSb2RvbGEnIHRvIHRlc3QgRlRQIGNsYXNzLCBJUHY2IGFuZCBUTFMKKyMgZW52aXJvbm1lbnQKKworaW1wb3J0IGZ0cGxpYgoraW1wb3J0IGFzeW5jb3JlCitpbXBvcnQgYXN5bmNoYXQKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IGVycm5vCitpbXBvcnQgb3MKK3RyeToKKyAgICBpbXBvcnQgc3NsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgc3NsID0gTm9uZQorCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IEhPU1QKK3RocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCisKKyMgdGhlIGR1bW15IGRhdGEgcmV0dXJuZWQgYnkgc2VydmVyIG92ZXIgdGhlIGRhdGEgY2hhbm5lbCB3aGVuCisjIFJFVFIsIExJU1QgYW5kIE5MU1QgY29tbWFuZHMgYXJlIGlzc3VlZAorUkVUUl9EQVRBID0gJ2FiY2RlMTIzNDVcclxuJyAqIDEwMDAKK0xJU1RfREFUQSA9ICdmb29cclxuYmFyXHJcbicKK05MU1RfREFUQSA9ICdmb29cclxuYmFyXHJcbicKKworCitjbGFzcyBEdW1teURUUEhhbmRsZXIoYXN5bmNoYXQuYXN5bmNfY2hhdCk6CisgICAgZHRwX2Nvbm5fY2xvc2VkID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCBiYXNlY2xhc3MpOgorICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0Ll9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgIHNlbGYuYmFzZWNsYXNzID0gYmFzZWNsYXNzCisgICAgICAgIHNlbGYuYmFzZWNsYXNzLmxhc3RfcmVjZWl2ZWRfZGF0YSA9ICcnCisKKyAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYuYmFzZWNsYXNzLmxhc3RfcmVjZWl2ZWRfZGF0YSArPSBzZWxmLnJlY3YoMTAyNCkKKworICAgIGRlZiBoYW5kbGVfY2xvc2Uoc2VsZik6CisgICAgICAgICMgWFhYOiB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIG1hbnkgdGltZXMgaW4gYSByb3cgZm9yIGEgc2luZ2xlCisgICAgICAgICMgY29ubmVjdGlvbiwgaW5jbHVkaW5nIGluIGNsZWFyLXRleHQgKG5vbi1UTFMpIG1vZGUuCisgICAgICAgICMgKGJlaGF2aW91ciB3aXRuZXNzZWQgd2l0aCB0ZXN0X2RhdGFfY29ubmVjdGlvbikKKyAgICAgICAgaWYgbm90IHNlbGYuZHRwX2Nvbm5fY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5iYXNlY2xhc3MucHVzaCgnMjI2IHRyYW5zZmVyIGNvbXBsZXRlJykKKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5kdHBfY29ubl9jbG9zZWQgPSBUcnVlCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZQorCisKK2NsYXNzIER1bW15RlRQSGFuZGxlcihhc3luY2hhdC5hc3luY19jaGF0KToKKworICAgIGR0cF9oYW5kbGVyID0gRHVtbXlEVFBIYW5kbGVyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQuX19pbml0X18oc2VsZiwgY29ubikKKyAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcigiXHJcbiIpCisgICAgICAgIHNlbGYuaW5fYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi5kdHAgPSBOb25lCisgICAgICAgIHNlbGYubGFzdF9yZWNlaXZlZF9jbWQgPSBOb25lCisgICAgICAgIHNlbGYubGFzdF9yZWNlaXZlZF9kYXRhID0gJycKKyAgICAgICAgc2VsZi5uZXh0X3Jlc3BvbnNlID0gJycKKyAgICAgICAgc2VsZi5yZXN0ID0gTm9uZQorICAgICAgICBzZWxmLnB1c2goJzIyMCB3ZWxjb21lJykKKworICAgIGRlZiBjb2xsZWN0X2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuaW5fYnVmZmVyLmFwcGVuZChkYXRhKQorCisgICAgZGVmIGZvdW5kX3Rlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgIGxpbmUgPSAnJy5qb2luKHNlbGYuaW5fYnVmZmVyKQorICAgICAgICBzZWxmLmluX2J1ZmZlciA9IFtdCisgICAgICAgIGlmIHNlbGYubmV4dF9yZXNwb25zZToKKyAgICAgICAgICAgIHNlbGYucHVzaChzZWxmLm5leHRfcmVzcG9uc2UpCisgICAgICAgICAgICBzZWxmLm5leHRfcmVzcG9uc2UgPSAnJworICAgICAgICBjbWQgPSBsaW5lLnNwbGl0KCcgJylbMF0ubG93ZXIoKQorICAgICAgICBzZWxmLmxhc3RfcmVjZWl2ZWRfY21kID0gY21kCisgICAgICAgIHNwYWNlID0gbGluZS5maW5kKCcgJykKKyAgICAgICAgaWYgc3BhY2UgIT0gLTE6CisgICAgICAgICAgICBhcmcgPSBsaW5lW3NwYWNlICsgMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmcgPSAiIgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdjbWRfJyArIGNtZCk6CisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdjbWRfJyArIGNtZCkKKyAgICAgICAgICAgIG1ldGhvZChhcmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB1c2goJzU1MCBjb21tYW5kICIlcyIgbm90IHVuZGVyc3Rvb2QuJyAlY21kKQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgcmFpc2UKKworICAgIGRlZiBwdXNoKHNlbGYsIGRhdGEpOgorICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0LnB1c2goc2VsZiwgZGF0YSArICdcclxuJykKKworICAgIGRlZiBjbWRfcG9ydChzZWxmLCBhcmcpOgorICAgICAgICBhZGRyID0gbWFwKGludCwgYXJnLnNwbGl0KCcsJykpCisgICAgICAgIGlwID0gJyVkLiVkLiVkLiVkJyAldHVwbGUoYWRkcls6NF0pCisgICAgICAgIHBvcnQgPSAoYWRkcls0XSAqIDI1NikgKyBhZGRyWzVdCisgICAgICAgIHMgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGlwLCBwb3J0KSwgdGltZW91dD0xMCkKKyAgICAgICAgc2VsZi5kdHAgPSBzZWxmLmR0cF9oYW5kbGVyKHMsIGJhc2VjbGFzcz1zZWxmKQorICAgICAgICBzZWxmLnB1c2goJzIwMCBhY3RpdmUgZGF0YSBjb25uZWN0aW9uIGVzdGFibGlzaGVkJykKKworICAgIGRlZiBjbWRfcGFzdihzZWxmLCBhcmcpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHNvY2suYmluZCgoc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVswXSwgMCkpCisgICAgICAgIHNvY2subGlzdGVuKDUpCisgICAgICAgIHNvY2suc2V0dGltZW91dCgxMCkKKyAgICAgICAgaXAsIHBvcnQgPSBzb2NrLmdldHNvY2tuYW1lKClbOjJdCisgICAgICAgIGlwID0gaXAucmVwbGFjZSgnLicsICcsJykKKyAgICAgICAgcDEsIHAyID0gZGl2bW9kKHBvcnQsIDI1NikKKyAgICAgICAgc2VsZi5wdXNoKCcyMjcgZW50ZXJpbmcgcGFzc2l2ZSBtb2RlICglcywlZCwlZCknICUoaXAsIHAxLCBwMikpCisgICAgICAgIGNvbm4sIGFkZHIgPSBzb2NrLmFjY2VwdCgpCisgICAgICAgIHNlbGYuZHRwID0gc2VsZi5kdHBfaGFuZGxlcihjb25uLCBiYXNlY2xhc3M9c2VsZikKKworICAgIGRlZiBjbWRfZXBydChzZWxmLCBhcmcpOgorICAgICAgICBhZiwgaXAsIHBvcnQgPSBhcmcuc3BsaXQoYXJnWzBdKVsxOi0xXQorICAgICAgICBwb3J0ID0gaW50KHBvcnQpCisgICAgICAgIHMgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGlwLCBwb3J0KSwgdGltZW91dD0xMCkKKyAgICAgICAgc2VsZi5kdHAgPSBzZWxmLmR0cF9oYW5kbGVyKHMsIGJhc2VjbGFzcz1zZWxmKQorICAgICAgICBzZWxmLnB1c2goJzIwMCBhY3RpdmUgZGF0YSBjb25uZWN0aW9uIGVzdGFibGlzaGVkJykKKworICAgIGRlZiBjbWRfZXBzdihzZWxmLCBhcmcpOgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVDYpCisgICAgICAgIHNvY2suYmluZCgoc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVswXSwgMCkpCisgICAgICAgIHNvY2subGlzdGVuKDUpCisgICAgICAgIHNvY2suc2V0dGltZW91dCgxMCkKKyAgICAgICAgcG9ydCA9IHNvY2suZ2V0c29ja25hbWUoKVsxXQorICAgICAgICBzZWxmLnB1c2goJzIyOSBlbnRlcmluZyBleHRlbmRlZCBwYXNzaXZlIG1vZGUgKHx8fCVkfCknICVwb3J0KQorICAgICAgICBjb25uLCBhZGRyID0gc29jay5hY2NlcHQoKQorICAgICAgICBzZWxmLmR0cCA9IHNlbGYuZHRwX2hhbmRsZXIoY29ubiwgYmFzZWNsYXNzPXNlbGYpCisKKyAgICBkZWYgY21kX2VjaG8oc2VsZiwgYXJnKToKKyAgICAgICAgIyBzZW5kcyBiYWNrIHRoZSByZWNlaXZlZCBzdHJpbmcgKHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUpCisgICAgICAgIHNlbGYucHVzaChhcmcpCisKKyAgICBkZWYgY21kX3VzZXIoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCczMzEgdXNlcm5hbWUgb2snKQorCisgICAgZGVmIGNtZF9wYXNzKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjMwIHBhc3N3b3JkIG9rJykKKworICAgIGRlZiBjbWRfYWNjdChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzIzMCBhY2N0IG9rJykKKworICAgIGRlZiBjbWRfcm5mcihzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzM1MCBybmZyIG9rJykKKworICAgIGRlZiBjbWRfcm50byhzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzI1MCBybnRvIG9rJykKKworICAgIGRlZiBjbWRfZGVsZShzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzI1MCBkZWxlIG9rJykKKworICAgIGRlZiBjbWRfY3dkKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjUwIGN3ZCBvaycpCisKKyAgICBkZWYgY21kX3NpemUoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcyNTAgMTAwMCcpCisKKyAgICBkZWYgY21kX21rZChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzI1NyAiJXMiJyAlYXJnKQorCisgICAgZGVmIGNtZF9ybWQoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcyNTAgcm1kIG9rJykKKworICAgIGRlZiBjbWRfcHdkKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMjU3ICJwd2Qgb2siJykKKworICAgIGRlZiBjbWRfdHlwZShzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzIwMCB0eXBlIG9rJykKKworICAgIGRlZiBjbWRfcXVpdChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzIyMSBxdWl0IG9rJykKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgY21kX3N0b3Ioc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcxMjUgc3RvciBvaycpCisKKyAgICBkZWYgY21kX3Jlc3Qoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5yZXN0ID0gYXJnCisgICAgICAgIHNlbGYucHVzaCgnMzUwIHJlc3Qgb2snKQorCisgICAgZGVmIGNtZF9yZXRyKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMTI1IHJldHIgb2snKQorICAgICAgICBpZiBzZWxmLnJlc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvZmZzZXQgPSBpbnQoc2VsZi5yZXN0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb2Zmc2V0ID0gMAorICAgICAgICBzZWxmLmR0cC5wdXNoKFJFVFJfREFUQVtvZmZzZXQ6XSkKKyAgICAgICAgc2VsZi5kdHAuY2xvc2Vfd2hlbl9kb25lKCkKKyAgICAgICAgc2VsZi5yZXN0ID0gTm9uZQorCisgICAgZGVmIGNtZF9saXN0KHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnMTI1IGxpc3Qgb2snKQorICAgICAgICBzZWxmLmR0cC5wdXNoKExJU1RfREFUQSkKKyAgICAgICAgc2VsZi5kdHAuY2xvc2Vfd2hlbl9kb25lKCkKKworICAgIGRlZiBjbWRfbmxzdChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJzEyNSBubHN0IG9rJykKKyAgICAgICAgc2VsZi5kdHAucHVzaChOTFNUX0RBVEEpCisgICAgICAgIHNlbGYuZHRwLmNsb3NlX3doZW5fZG9uZSgpCisKKworY2xhc3MgRHVtbXlGVFBTZXJ2ZXIoYXN5bmNvcmUuZGlzcGF0Y2hlciwgdGhyZWFkaW5nLlRocmVhZCk6CisKKyAgICBoYW5kbGVyID0gRHVtbXlGVFBIYW5kbGVyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcywgYWY9c29ja2V0LkFGX0lORVQpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVfc29ja2V0KGFmLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYmluZChhZGRyZXNzKQorICAgICAgICBzZWxmLmxpc3Rlbig1KQorICAgICAgICBzZWxmLmFjdGl2ZSA9IEZhbHNlCisgICAgICAgIHNlbGYuYWN0aXZlX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0ID0gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVs6Ml0KKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLmFjdGl2ZQorICAgICAgICBzZWxmLl9fZmxhZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuc3RhcnQoc2VsZikKKyAgICAgICAgc2VsZi5fX2ZsYWcud2FpdCgpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmFjdGl2ZSA9IFRydWUKKyAgICAgICAgc2VsZi5fX2ZsYWcuc2V0KCkKKyAgICAgICAgd2hpbGUgc2VsZi5hY3RpdmUgYW5kIGFzeW5jb3JlLnNvY2tldF9tYXA6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZV9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgYXN5bmNvcmUubG9vcCh0aW1lb3V0PTAuMSwgY291bnQ9MSkKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX2xvY2sucmVsZWFzZSgpCisgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbChpZ25vcmVfYWxsPVRydWUpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuYWN0aXZlCisgICAgICAgIHNlbGYuYWN0aXZlID0gRmFsc2UKKyAgICAgICAgc2VsZi5qb2luKCkKKworICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICBzZWxmLmhhbmRsZXIgPSBzZWxmLmhhbmRsZXIoY29ubikKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorICAgIGhhbmRsZV9yZWFkID0gaGFuZGxlX2Nvbm5lY3QKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlCisKKworaWYgc3NsIGlzIG5vdCBOb25lOgorCisgICAgQ0VSVEZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImtleWNlcnQucGVtIikKKworICAgIGNsYXNzIFNTTENvbm5lY3Rpb24ob2JqZWN0LCBhc3luY29yZS5kaXNwYXRjaGVyKToKKyAgICAgICAgIiIiQW4gYXN5bmNvcmUuZGlzcGF0Y2hlciBzdWJjbGFzcyBzdXBwb3J0aW5nIFRMUy9TU0wuIiIiCisKKyAgICAgICAgX3NzbF9hY2NlcHRpbmcgPSBGYWxzZQorICAgICAgICBfc3NsX2Nsb3NpbmcgPSBGYWxzZQorCisgICAgICAgIGRlZiBzZWN1cmVfY29ubmVjdGlvbihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc3NsLndyYXBfc29ja2V0KHNlbGYuc29ja2V0LCBzdXBwcmVzc19yYWdnZWRfZW9mcz1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPUNFUlRGSUxFLCBzZXJ2ZXJfc2lkZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICAgICAgc2VsZi5fc3NsX2FjY2VwdGluZyA9IFRydWUKKworICAgICAgICBkZWYgX2RvX3NzbF9oYW5kc2hha2Uoc2VsZik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSBpbiAoc3NsLlNTTF9FUlJPUl9XQU5UX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5TU0xfRVJST1JfV0FOVF9XUklURSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsaWYgZXJyLmFyZ3NbMF0gPT0gc3NsLlNTTF9FUlJPUl9FT0Y6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSA9PSBlcnJuby5FQ09OTkFCT1JURUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3NzbF9hY2NlcHRpbmcgPSBGYWxzZQorCisgICAgICAgIGRlZiBfZG9fc3NsX3NodXRkb3duKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fc3NsX2Nsb3NpbmcgPSBUcnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQgPSBzZWxmLnNvY2tldC51bndyYXAoKQorICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLlNTTF9FUlJPUl9XQU5UX1dSSVRFKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgIyBBbnkgInNvY2tldCBlcnJvciIgY29ycmVzcG9uZHMgdG8gYSBTU0xfRVJST1JfU1lTQ0FMTCByZXR1cm4KKyAgICAgICAgICAgICAgICAjIGZyb20gT3BlblNTTCdzIFNTTF9zaHV0ZG93bigpLCBjb3JyZXNwb25kaW5nIHRvIGEKKyAgICAgICAgICAgICAgICAjIGNsb3NlZCBzb2NrZXQgY29uZGl0aW9uLiBTZWUgYWxzbzoKKyAgICAgICAgICAgICAgICAjIGh0dHA6Ly93d3cubWFpbC1hcmNoaXZlLmNvbS9vcGVuc3NsLXVzZXJzQG9wZW5zc2wub3JnL21zZzYwNzEwLmh0bWwKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzZWxmLl9zc2xfY2xvc2luZyA9IEZhbHNlCisgICAgICAgICAgICBzdXBlcihTU0xDb25uZWN0aW9uLCBzZWxmKS5jbG9zZSgpCisKKyAgICAgICAgZGVmIGhhbmRsZV9yZWFkX2V2ZW50KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5fc3NsX2FjY2VwdGluZzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb19zc2xfaGFuZHNoYWtlKCkKKyAgICAgICAgICAgIGVsaWYgc2VsZi5fc3NsX2Nsb3Npbmc6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9fc3NsX3NodXRkb3duKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3VwZXIoU1NMQ29ubmVjdGlvbiwgc2VsZikuaGFuZGxlX3JlYWRfZXZlbnQoKQorCisgICAgICAgIGRlZiBoYW5kbGVfd3JpdGVfZXZlbnQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLl9zc2xfYWNjZXB0aW5nOgorICAgICAgICAgICAgICAgIHNlbGYuX2RvX3NzbF9oYW5kc2hha2UoKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9zc2xfY2xvc2luZzoKKyAgICAgICAgICAgICAgICBzZWxmLl9kb19zc2xfc2h1dGRvd24oKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdXBlcihTU0xDb25uZWN0aW9uLCBzZWxmKS5oYW5kbGVfd3JpdGVfZXZlbnQoKQorCisgICAgICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihTU0xDb25uZWN0aW9uLCBzZWxmKS5zZW5kKGRhdGEpCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgaWYgZXJyLmFyZ3NbMF0gaW4gKHNzbC5TU0xfRVJST1JfRU9GLCBzc2wuU1NMX0VSUk9SX1pFUk9fUkVUVVJOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wuU1NMX0VSUk9SX1dBTlRfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLlNTTF9FUlJPUl9XQU5UX1dSSVRFKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGRlZiByZWN2KHNlbGYsIGJ1ZmZlcl9zaXplKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoU1NMQ29ubmVjdGlvbiwgc2VsZikucmVjdihidWZmZXJfc2l6ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSBpbiAoc3NsLlNTTF9FUlJPUl9XQU5UX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5TU0xfRVJST1JfV0FOVF9XUklURSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJworICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdIGluIChzc2wuU1NMX0VSUk9SX0VPRiwgc3NsLlNTTF9FUlJPUl9aRVJPX1JFVFVSTik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShzZWxmLnNvY2tldCwgc3NsLlNTTFNvY2tldCkgYW5kCisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuX3NzbG9iaiBpcyBub3QgTm9uZSk6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9fc3NsX3NodXRkb3duKCkKKworCisgICAgY2xhc3MgRHVtbXlUTFNfRFRQSGFuZGxlcihTU0xDb25uZWN0aW9uLCBEdW1teURUUEhhbmRsZXIpOgorICAgICAgICAiIiJBIER1bW15RFRQSGFuZGxlciBzdWJjbGFzcyBzdXBwb3J0aW5nIFRMUy9TU0wuIiIiCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4sIGJhc2VjbGFzcyk6CisgICAgICAgICAgICBEdW1teURUUEhhbmRsZXIuX19pbml0X18oc2VsZiwgY29ubiwgYmFzZWNsYXNzKQorICAgICAgICAgICAgaWYgc2VsZi5iYXNlY2xhc3Muc2VjdXJlX2RhdGFfY2hhbm5lbDoKKyAgICAgICAgICAgICAgICBzZWxmLnNlY3VyZV9jb25uZWN0aW9uKCkKKworCisgICAgY2xhc3MgRHVtbXlUTFNfRlRQSGFuZGxlcihTU0xDb25uZWN0aW9uLCBEdW1teUZUUEhhbmRsZXIpOgorICAgICAgICAiIiJBIER1bW15RlRQSGFuZGxlciBzdWJjbGFzcyBzdXBwb3J0aW5nIFRMUy9TU0wuIiIiCisKKyAgICAgICAgZHRwX2hhbmRsZXIgPSBEdW1teVRMU19EVFBIYW5kbGVyCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvbm4pOgorICAgICAgICAgICAgRHVtbXlGVFBIYW5kbGVyLl9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgICAgICBzZWxmLnNlY3VyZV9kYXRhX2NoYW5uZWwgPSBGYWxzZQorCisgICAgICAgIGRlZiBjbWRfYXV0aChzZWxmLCBsaW5lKToKKyAgICAgICAgICAgICIiIlNldCB1cCBzZWN1cmUgY29udHJvbCBjaGFubmVsLiIiIgorICAgICAgICAgICAgc2VsZi5wdXNoKCcyMzQgQVVUSCBUTFMgc3VjY2Vzc2Z1bCcpCisgICAgICAgICAgICBzZWxmLnNlY3VyZV9jb25uZWN0aW9uKCkKKworICAgICAgICBkZWYgY21kX3Bic3ooc2VsZiwgbGluZSk6CisgICAgICAgICAgICAiIiJOZWdvdGlhdGUgc2l6ZSBvZiBidWZmZXIgZm9yIHNlY3VyZSBkYXRhIHRyYW5zZmVyLgorICAgICAgICAgICAgRm9yIFRMUy9TU0wgdGhlIG9ubHkgdmFsaWQgdmFsdWUgZm9yIHRoZSBwYXJhbWV0ZXIgaXMgJzAnLgorICAgICAgICAgICAgQW55IG90aGVyIHZhbHVlIGlzIGFjY2VwdGVkIGJ1dCBpZ25vcmVkLgorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBzZWxmLnB1c2goJzIwMCBQQlNaPTAgc3VjY2Vzc2Z1bC4nKQorCisgICAgICAgIGRlZiBjbWRfcHJvdChzZWxmLCBsaW5lKToKKyAgICAgICAgICAgICIiIlNldHVwIHVuL3NlY3VyZSBkYXRhIGNoYW5uZWwuIiIiCisgICAgICAgICAgICBhcmcgPSBsaW5lLnVwcGVyKCkKKyAgICAgICAgICAgIGlmIGFyZyA9PSAnQyc6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCcyMDAgUHJvdGVjdGlvbiBzZXQgdG8gQ2xlYXInKQorICAgICAgICAgICAgICAgIHNlbGYuc2VjdXJlX2RhdGFfY2hhbm5lbCA9IEZhbHNlCisgICAgICAgICAgICBlbGlmIGFyZyA9PSAnUCc6CisgICAgICAgICAgICAgICAgc2VsZi5wdXNoKCcyMDAgUHJvdGVjdGlvbiBzZXQgdG8gUHJpdmF0ZScpCisgICAgICAgICAgICAgICAgc2VsZi5zZWN1cmVfZGF0YV9jaGFubmVsID0gVHJ1ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnB1c2goIjUwMiBVbnJlY29nbml6ZWQgUFJPVCB0eXBlICh1c2UgQyBvciBQKS4iKQorCisKKyAgICBjbGFzcyBEdW1teVRMU19GVFBTZXJ2ZXIoRHVtbXlGVFBTZXJ2ZXIpOgorICAgICAgICBoYW5kbGVyID0gRHVtbXlUTFNfRlRQSGFuZGxlcgorCisKK2NsYXNzIFRlc3RGVFBDbGFzcyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyID0gRHVtbXlGVFBTZXJ2ZXIoKEhPU1QsIDApKQorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCisgICAgICAgIHNlbGYuY2xpZW50ID0gZnRwbGliLkZUUCh0aW1lb3V0PTEwKQorICAgICAgICBzZWxmLmNsaWVudC5jb25uZWN0KHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF9nZXR3ZWxjb21lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LmdldHdlbGNvbWUoKSwgJzIyMCB3ZWxjb21lJykKKworICAgIGRlZiB0ZXN0X3Nhbml0aXplKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnNhbml0aXplKCdmb28nKSwgcmVwcignZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQuc2FuaXRpemUoJ3Bhc3MgMTIzNDUnKSwgcmVwcigncGFzcyAqKioqKicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnNhbml0aXplKCdQQVNTIDEyMzQ1JyksIHJlcHIoJ1BBU1MgKioqKionKSkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl90ZW1wLCBzZWxmLmNsaWVudC5zZW5kY21kLCAnZWNobyA0MDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhmdHBsaWIuZXJyb3JfdGVtcCwgc2VsZi5jbGllbnQuc2VuZGNtZCwgJ2VjaG8gNDk5JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZnRwbGliLmVycm9yX3Blcm0sIHNlbGYuY2xpZW50LnNlbmRjbWQsICdlY2hvIDUwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl9wZXJtLCBzZWxmLmNsaWVudC5zZW5kY21kLCAnZWNobyA1OTknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhmdHBsaWIuZXJyb3JfcHJvdG8sIHNlbGYuY2xpZW50LnNlbmRjbWQsICdlY2hvIDk5OScpCisKKyAgICBkZWYgdGVzdF9hbGxfZXJyb3JzKHNlbGYpOgorICAgICAgICBleGNlcHRpb25zID0gKGZ0cGxpYi5lcnJvcl9yZXBseSwgZnRwbGliLmVycm9yX3RlbXAsIGZ0cGxpYi5lcnJvcl9wZXJtLAorICAgICAgICAgICAgICAgICAgICAgIGZ0cGxpYi5lcnJvcl9wcm90bywgZnRwbGliLkVycm9yLCBJT0Vycm9yLCBFT0ZFcnJvcikKKyAgICAgICAgZm9yIHggaW4gZXhjZXB0aW9uczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSB4KCdleGNlcHRpb24gbm90IGluY2x1ZGVkIGluIGFsbF9lcnJvcnMgc2V0JykKKyAgICAgICAgICAgIGV4Y2VwdCBmdHBsaWIuYWxsX2Vycm9yczoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9zZXRfcGFzdihzZWxmKToKKyAgICAgICAgIyBwYXNzaXZlIG1vZGUgaXMgc3VwcG9zZWQgdG8gYmUgZW5hYmxlZCBieSBkZWZhdWx0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNsaWVudC5wYXNzaXZlc2VydmVyKQorICAgICAgICBzZWxmLmNsaWVudC5zZXRfcGFzdihUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jbGllbnQucGFzc2l2ZXNlcnZlcikKKyAgICAgICAgc2VsZi5jbGllbnQuc2V0X3Bhc3YoRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5jbGllbnQucGFzc2l2ZXNlcnZlcikKKworICAgIGRlZiB0ZXN0X3ZvaWRjbWQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LnZvaWRjbWQoJ2VjaG8gMjAwJykKKyAgICAgICAgc2VsZi5jbGllbnQudm9pZGNtZCgnZWNobyAyOTknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhmdHBsaWIuZXJyb3JfcmVwbHksIHNlbGYuY2xpZW50LnZvaWRjbWQsICdlY2hvIDE5OScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl9yZXBseSwgc2VsZi5jbGllbnQudm9pZGNtZCwgJ2VjaG8gMzAwJykKKworICAgIGRlZiB0ZXN0X2xvZ2luKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5sb2dpbigpCisKKyAgICBkZWYgdGVzdF9hY2N0KHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5hY2N0KCdwYXNzd2QnKQorCisgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5yZW5hbWUoJ2EnLCAnYicpCisgICAgICAgIHNlbGYuc2VydmVyLmhhbmRsZXIubmV4dF9yZXNwb25zZSA9ICcyMDAnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ0cGxpYi5lcnJvcl9yZXBseSwgc2VsZi5jbGllbnQucmVuYW1lLCAnYScsICdiJykKKworICAgIGRlZiB0ZXN0X2RlbGV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQuZGVsZXRlKCdmb28nKQorICAgICAgICBzZWxmLnNlcnZlci5oYW5kbGVyLm5leHRfcmVzcG9uc2UgPSAnMTk5JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhmdHBsaWIuZXJyb3JfcmVwbHksIHNlbGYuY2xpZW50LmRlbGV0ZSwgJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9zaXplKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5zaXplKCdmb28nKQorCisgICAgZGVmIHRlc3RfbWtkKHNlbGYpOgorICAgICAgICBkaXIgPSBzZWxmLmNsaWVudC5ta2QoJy9mb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpciwgJy9mb28nKQorCisgICAgZGVmIHRlc3Rfcm1kKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5ybWQoJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9wd2Qoc2VsZik6CisgICAgICAgIGRpciA9IHNlbGYuY2xpZW50LnB3ZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyLCAncHdkIG9rJykKKworICAgIGRlZiB0ZXN0X3F1aXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGllbnQucXVpdCgpLCAnMjIxIHF1aXQgb2snKQorICAgICAgICAjIEVuc3VyZSB0aGUgY29ubmVjdGlvbiBnZXRzIGNsb3NlZDsgc29jayBhdHRyaWJ1dGUgc2hvdWxkIGJlIE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC5zb2NrLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmV0cmJpbmFyeShzZWxmKToKKyAgICAgICAgcmVjZWl2ZWQgPSBbXQorICAgICAgICBzZWxmLmNsaWVudC5yZXRyYmluYXJ5KCdyZXRyJywgcmVjZWl2ZWQuYXBwZW5kKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4ocmVjZWl2ZWQpLCBSRVRSX0RBVEEpCisKKyAgICBkZWYgdGVzdF9yZXRyYmluYXJ5X3Jlc3Qoc2VsZik6CisgICAgICAgIGZvciByZXN0IGluICgwLCAxMCwgMjApOgorICAgICAgICAgICAgcmVjZWl2ZWQgPSBbXQorICAgICAgICAgICAgc2VsZi5jbGllbnQucmV0cmJpbmFyeSgncmV0cicsIHJlY2VpdmVkLmFwcGVuZCwgcmVzdD1yZXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5qb2luKHJlY2VpdmVkKSwgUkVUUl9EQVRBW3Jlc3Q6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdyZXN0IHRlc3QgY2FzZSAlZCAlZCAlZCcgJSAocmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKCcnLmpvaW4ocmVjZWl2ZWQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKFJFVFJfREFUQVtyZXN0Ol0pKSkKKworICAgIGRlZiB0ZXN0X3JldHJsaW5lcyhzZWxmKToKKyAgICAgICAgcmVjZWl2ZWQgPSBbXQorICAgICAgICBzZWxmLmNsaWVudC5yZXRybGluZXMoJ3JldHInLCByZWNlaXZlZC5hcHBlbmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuam9pbihyZWNlaXZlZCksIFJFVFJfREFUQS5yZXBsYWNlKCdcclxuJywgJycpKQorCisgICAgZGVmIHRlc3Rfc3RvcmJpbmFyeShzZWxmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKFJFVFJfREFUQSkKKyAgICAgICAgc2VsZi5jbGllbnQuc3RvcmJpbmFyeSgnc3RvcicsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2ZXIuaGFuZGxlci5sYXN0X3JlY2VpdmVkX2RhdGEsIFJFVFJfREFUQSkKKyAgICAgICAgIyB0ZXN0IG5ldyBjYWxsYmFjayBhcmcKKyAgICAgICAgZmxhZyA9IFtdCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLmNsaWVudC5zdG9yYmluYXJ5KCdzdG9yJywgZiwgY2FsbGJhY2s9bGFtYmRhIHg6IGZsYWcuYXBwZW5kKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmxhZykKKworICAgIGRlZiB0ZXN0X3N0b3JiaW5hcnlfcmVzdChzZWxmKToKKyAgICAgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKFJFVFJfREFUQSkKKyAgICAgICAgZm9yIHIgaW4gKDMwLCAnMzAnKToKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5jbGllbnQuc3RvcmJpbmFyeSgnc3RvcicsIGYsIHJlc3Q9cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2ZXIuaGFuZGxlci5yZXN0LCBzdHIocikpCisKKyAgICBkZWYgdGVzdF9zdG9ybGluZXMoc2VsZik6CisgICAgICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTyhSRVRSX0RBVEEucmVwbGFjZSgnXHJcbicsICdcbicpKQorICAgICAgICBzZWxmLmNsaWVudC5zdG9ybGluZXMoJ3N0b3InLCBmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VydmVyLmhhbmRsZXIubGFzdF9yZWNlaXZlZF9kYXRhLCBSRVRSX0RBVEEpCisgICAgICAgICMgdGVzdCBuZXcgY2FsbGJhY2sgYXJnCisgICAgICAgIGZsYWcgPSBbXQorICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5jbGllbnQuc3RvcmxpbmVzKCdzdG9yIGZvbycsIGYsIGNhbGxiYWNrPWxhbWJkYSB4OiBmbGFnLmFwcGVuZChOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsYWcpCisKKyAgICBkZWYgdGVzdF9ubHN0KHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5ubHN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC5ubHN0KCksIE5MU1RfREFUQS5zcGxpdCgnXHJcbicpWzotMV0pCisKKyAgICBkZWYgdGVzdF9kaXIoc2VsZik6CisgICAgICAgIGwgPSBbXQorICAgICAgICBzZWxmLmNsaWVudC5kaXIobGFtYmRhIHg6IGwuYXBwZW5kKHgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4obCksIExJU1RfREFUQS5yZXBsYWNlKCdcclxuJywgJycpKQorCisgICAgZGVmIHRlc3RfbWFrZXBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50Lm1ha2Vwb3J0KCkKKyAgICAgICAgIyBJUHY0IGlzIGluIHVzZSwganVzdCBtYWtlIHN1cmUgc2VuZF9lcHJ0IGhhcyBub3QgYmVlbiB1c2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXJ2ZXIuaGFuZGxlci5sYXN0X3JlY2VpdmVkX2NtZCwgJ3BvcnQnKQorCisgICAgZGVmIHRlc3RfbWFrZXBhc3Yoc2VsZik6CisgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLmNsaWVudC5tYWtlcGFzdigpCisgICAgICAgIGNvbm4gPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKGhvc3QsIHBvcnQpLCAxMCkKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICMgSVB2NCBpcyBpbiB1c2UsIGp1c3QgbWFrZSBzdXJlIHNlbmRfZXBzdiBoYXMgbm90IGJlZW4gdXNlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VydmVyLmhhbmRsZXIubGFzdF9yZWNlaXZlZF9jbWQsICdwYXN2JykKKworCitjbGFzcyBUZXN0SVB2NkVudmlyb25tZW50KFRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teUZUUFNlcnZlcigoSE9TVCwgMCksIGFmPXNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQorICAgICAgICBzZWxmLmNsaWVudCA9IGZ0cGxpYi5GVFAoKQorICAgICAgICBzZWxmLmNsaWVudC5jb25uZWN0KHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF9hZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC5hZiwgc29ja2V0LkFGX0lORVQ2KQorCisgICAgZGVmIHRlc3RfbWFrZXBvcnQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50Lm1ha2Vwb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnZlci5oYW5kbGVyLmxhc3RfcmVjZWl2ZWRfY21kLCAnZXBydCcpCisKKyAgICBkZWYgdGVzdF9tYWtlcGFzdihzZWxmKToKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNlbGYuY2xpZW50Lm1ha2VwYXN2KCkKKyAgICAgICAgY29ubiA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoaG9zdCwgcG9ydCksIDEwKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnZlci5oYW5kbGVyLmxhc3RfcmVjZWl2ZWRfY21kLCAnZXBzdicpCisKKyAgICBkZWYgdGVzdF90cmFuc2ZlcihzZWxmKToKKyAgICAgICAgZGVmIHJldHIoKToKKyAgICAgICAgICAgIHJlY2VpdmVkID0gW10KKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnJldHJiaW5hcnkoJ3JldHInLCByZWNlaXZlZC5hcHBlbmQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4ocmVjZWl2ZWQpLCBSRVRSX0RBVEEpCisgICAgICAgIHNlbGYuY2xpZW50LnNldF9wYXN2KFRydWUpCisgICAgICAgIHJldHIoKQorICAgICAgICBzZWxmLmNsaWVudC5zZXRfcGFzdihGYWxzZSkKKyAgICAgICAgcmV0cigpCisKKworY2xhc3MgVGVzdFRMU19GVFBDbGFzc01peGluKFRlc3RGVFBDbGFzcyk6CisgICAgIiIiUmVwZWF0IFRlc3RGVFBDbGFzcyB0ZXN0cyBzdGFydGluZyB0aGUgVExTIGxheWVyIGZvciBib3RoIGNvbnRyb2wKKyAgICBhbmQgZGF0YSBjb25uZWN0aW9ucyBmaXJzdC4KKyAgICAiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teVRMU19GVFBTZXJ2ZXIoKEhPU1QsIDApKQorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCisgICAgICAgIHNlbGYuY2xpZW50ID0gZnRwbGliLkZUUF9UTFModGltZW91dD0xMCkKKyAgICAgICAgc2VsZi5jbGllbnQuY29ubmVjdChzZWxmLnNlcnZlci5ob3N0LCBzZWxmLnNlcnZlci5wb3J0KQorICAgICAgICAjIGVuYWJsZSBUTFMKKyAgICAgICAgc2VsZi5jbGllbnQuYXV0aCgpCisgICAgICAgIHNlbGYuY2xpZW50LnByb3RfcCgpCisKKworY2xhc3MgVGVzdFRMU19GVFBDbGFzcyhUZXN0Q2FzZSk6CisgICAgIiIiU3BlY2lmaWMgVExTX0ZUUCBjbGFzcyB0ZXN0cy4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBEdW1teVRMU19GVFBTZXJ2ZXIoKEhPU1QsIDApKQorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCisgICAgICAgIHNlbGYuY2xpZW50ID0gZnRwbGliLkZUUF9UTFModGltZW91dD0xMCkKKyAgICAgICAgc2VsZi5jbGllbnQuY29ubmVjdChzZWxmLnNlcnZlci5ob3N0LCBzZWxmLnNlcnZlci5wb3J0KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5jbG9zZSgpCisgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisgICAgZGVmIHRlc3RfY29udHJvbF9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2Uoc2VsZi5jbGllbnQuc29jaywgc3NsLlNTTFNvY2tldCkKKyAgICAgICAgc2VsZi5jbGllbnQuYXV0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLmNsaWVudC5zb2NrLCBzc2wuU1NMU29ja2V0KQorCisgICAgZGVmIHRlc3RfZGF0YV9jb25uZWN0aW9uKHNlbGYpOgorICAgICAgICAjIGNsZWFyIHRleHQKKyAgICAgICAgc29jayA9IHNlbGYuY2xpZW50LnRyYW5zZmVyY21kKCdsaXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKHNvY2ssIHNzbC5TU0xTb2NrZXQpCisgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnZvaWRyZXNwKCksICIyMjYgdHJhbnNmZXIgY29tcGxldGUiKQorCisgICAgICAgICMgc2VjdXJlZCwgYWZ0ZXIgUFJPVCBQCisgICAgICAgIHNlbGYuY2xpZW50LnByb3RfcCgpCisgICAgICAgIHNvY2sgPSBzZWxmLmNsaWVudC50cmFuc2ZlcmNtZCgnbGlzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzb2NrLCBzc2wuU1NMU29ja2V0KQorICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC52b2lkcmVzcCgpLCAiMjI2IHRyYW5zZmVyIGNvbXBsZXRlIikKKworICAgICAgICAjIFBST1QgQyBpcyBpc3N1ZWQsIHRoZSBjb25uZWN0aW9uIG11c3QgYmUgaW4gY2xlYXJ0ZXh0IGFnYWluCisgICAgICAgIHNlbGYuY2xpZW50LnByb3RfYygpCisgICAgICAgIHNvY2sgPSBzZWxmLmNsaWVudC50cmFuc2ZlcmNtZCgnbGlzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShzb2NrLCBzc2wuU1NMU29ja2V0KQorICAgICAgICBzb2NrLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC52b2lkcmVzcCgpLCAiMjI2IHRyYW5zZmVyIGNvbXBsZXRlIikKKworICAgIGRlZiB0ZXN0X2xvZ2luKHNlbGYpOgorICAgICAgICAjIGxvZ2luKCkgaXMgc3VwcG9zZWQgdG8gaW1wbGljaXRseSBzZWN1cmUgdGhlIGNvbnRyb2wgY29ubmVjdGlvbgorICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2Uoc2VsZi5jbGllbnQuc29jaywgc3NsLlNTTFNvY2tldCkKKyAgICAgICAgc2VsZi5jbGllbnQubG9naW4oKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5jbGllbnQuc29jaywgc3NsLlNTTFNvY2tldCkKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBBVVRIIFRMUyBkb2Vzbid0IGdldCBpc3N1ZWQgYWdhaW4KKyAgICAgICAgc2VsZi5jbGllbnQubG9naW4oKQorCisgICAgZGVmIHRlc3RfYXV0aF9pc3N1ZWRfdHdpY2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xpZW50LmF1dGgoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmNsaWVudC5hdXRoKQorCisgICAgZGVmIHRlc3RfYXV0aF9zc2woc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpZW50LnNzbF92ZXJzaW9uID0gc3NsLlBST1RPQ09MX1NTTHYzCisgICAgICAgICAgICBzZWxmLmNsaWVudC5hdXRoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuY2xpZW50LmF1dGgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNsaWVudC5zc2xfdmVyc2lvbiA9IHNzbC5QUk9UT0NPTF9UTFN2MQorCisKK2NsYXNzIFRlc3RUaW1lb3V0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgxMCkKKyAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuc2VydmVyLCBhcmdzPShzZWxmLmV2dCxzZWxmLnNvY2spKS5zdGFydCgpCisgICAgICAgICMgV2FpdCBmb3IgdGhlIHNlcnZlciB0byBiZSByZWFkeS4KKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisgICAgICAgIHNlbGYuZXZ0LmNsZWFyKCkKKyAgICAgICAgZnRwbGliLkZUUC5wb3J0ID0gc2VsZi5wb3J0CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorCisgICAgZGVmIHNlcnZlcihzZWxmLCBldnQsIHNlcnYpOgorICAgICAgICAjIFRoaXMgbWV0aG9kIHNldHMgdGhlIGV2dCAzIHRpbWVzOgorICAgICAgICAjICAxKSB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHJlYWR5IHRvIGJlIGFjY2VwdGVkLgorICAgICAgICAjICAyKSB3aGVuIGl0IGlzIHNhZmUgZm9yIHRoZSBjYWxsZXIgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgIyAgMykgd2hlbiB3ZSBoYXZlIGNsb3NlZCB0aGUgc29ja2V0CisgICAgICAgIHNlcnYubGlzdGVuKDUpCisgICAgICAgICMgKDEpIFNpZ25hbCB0aGUgY2FsbGVyIHRoYXQgd2UgYXJlIHJlYWR5IHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgZXZ0LnNldCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2LmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbm4uc2VuZCgiMSBIb2xhIG11bmRvXG4iKQorICAgICAgICAgICAgIyAoMikgU2lnbmFsIHRoZSBjYWxsZXIgdGhhdCBpdCBpcyBzYWZlIHRvIGNsb3NlIHRoZSBzb2NrZXQuCisgICAgICAgICAgICBldnQuc2V0KCkKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2Vydi5jbG9zZSgpCisgICAgICAgICAgICAjICgzKSBTaWduYWwgdGhlIGNhbGxlciB0aGF0IHdlIGFyZSBkb25lLgorICAgICAgICAgICAgZXZ0LnNldCgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQgLS0gdXNlIGdsb2JhbCBzb2NrZXQgdGltZW91dAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdHAgPSBmdHBsaWIuRlRQKCJsb2NhbGhvc3QiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnRwLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisgICAgICAgIGZ0cC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgorICAgICAgICAjIG5vIHRpbWVvdXQgLS0gZG8gbm90IHVzZSBnbG9iYWwgc29ja2V0IHRpbWVvdXQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnRwID0gZnRwbGliLkZUUCgibG9jYWxob3N0IiwgdGltZW91dD1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmdHAuc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5ldnQud2FpdCgpCisgICAgICAgIGZ0cC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXRWYWx1ZShzZWxmKToKKyAgICAgICAgIyBhIHZhbHVlCisgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAoSE9TVCwgdGltZW91dD0zMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdHAuc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgZnRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dENvbm5lY3Qoc2VsZik6CisgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAoKQorICAgICAgICBmdHAuY29ubmVjdChIT1NULCB0aW1lb3V0PTMwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ0cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBmdHAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RUaW1lb3V0RGlmZmVyZW50T3JkZXIoc2VsZik6CisgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAodGltZW91dD0zMCkKKyAgICAgICAgZnRwLmNvbm5lY3QoSE9TVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdHAuc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgZnRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dERpcmVjdEFjY2VzcyhzZWxmKToKKyAgICAgICAgZnRwID0gZnRwbGliLkZUUCgpCisgICAgICAgIGZ0cC50aW1lb3V0ID0gMzAKKyAgICAgICAgZnRwLmNvbm5lY3QoSE9TVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdHAuc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgZnRwLmNsb3NlKCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdHMgPSBbVGVzdEZUUENsYXNzLCBUZXN0VGltZW91dHNdCisgICAgaWYgc29ja2V0Lmhhc19pcHY2OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBEdW1teUZUUFNlcnZlcigoSE9TVCwgMCksIGFmPXNvY2tldC5BRl9JTkVUNikKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRlc3RzLmFwcGVuZChUZXN0SVB2NkVudmlyb25tZW50KQorCisgICAgaWYgc3NsIGlzIG5vdCBOb25lOgorICAgICAgICB0ZXN0cy5leHRlbmQoW1Rlc3RUTFNfRlRQQ2xhc3NNaXhpbiwgVGVzdFRMU19GVFBDbGFzc10pCisKKyAgICB0aHJlYWRfaW5mbyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCp0aHJlYWRfaW5mbykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnRwbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGU1ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnRwbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdHBsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnRwbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFiZjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnRwbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYzOWNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weQpAQCAtMCwwICsxLDM1MyBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKK2NsYXNzIEZ1bmNBdHRyc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgY2xhc3MgRjoKKyAgICAgICAgICAgIGRlZiBhKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGIoKToKKyAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgIHNlbGYuZiA9IEYKKyAgICAgICAgc2VsZi5maSA9IEYoKQorICAgICAgICBzZWxmLmIgPSBiCisKKyAgICBkZWYgY2Fubm90X3NldF9hdHRyKHNlbGYsIG9iaiwgbmFtZSwgdmFsdWUsIGV4Y2VwdGlvbnMpOgorICAgICAgICAjIEhlbHBlciBtZXRob2QgZm9yIG90aGVyIHRlc3RzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZXRhdHRyKG9iaiwgbmFtZSwgdmFsdWUpCisgICAgICAgIGV4Y2VwdCBleGNlcHRpb25zOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYmUgYWJsZSB0byBzZXQgJXMgdG8gJXIiICUgKG5hbWUsIHZhbHVlKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsYXR0cihvYmosIG5hbWUpCisgICAgICAgIGV4Y2VwdCBleGNlcHRpb25zOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYmUgYWJsZSB0byBkZWwgJXMiICUgbmFtZSkKKworCitjbGFzcyBGdW5jdGlvblByb3BlcnRpZXNUZXN0KEZ1bmNBdHRyc1Rlc3QpOgorICAgICMgSW5jbHVkZSB0aGUgZXh0ZXJuYWwgc2V0VXAgbWV0aG9kIHRoYXQgaXMgY29tbW9uIHRvIGFsbCB0ZXN0cworICAgIGRlZiB0ZXN0X21vZHVsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuX19tb2R1bGVfXywgX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9kaXJfaW5jbHVkZXNfY29ycmVjdF9hdHRycyhzZWxmKToKKyAgICAgICAgc2VsZi5iLmtub3duX2F0dHIgPSA3CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2tub3duX2F0dHInLCBkaXIoc2VsZi5iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzZXQgYXR0cmlidXRlcyBub3QgaW4gZGlyIGxpc3Rpbmcgb2YgbWV0aG9kIikKKyAgICAgICAgIyBUZXN0IG9uIHVuZGVybHlpbmcgZnVuY3Rpb24gb2JqZWN0IG9mIG1ldGhvZAorICAgICAgICBzZWxmLmYuYS5pbV9mdW5jLmtub3duX2F0dHIgPSA3CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2tub3duX2F0dHInLCBkaXIoc2VsZi5mLmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgInNldCBhdHRyaWJ1dGUgb24gdW5ib3VuZCBtZXRob2QgaW1wbGVtZW50YXRpb24gaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIG5vdCBpbiBkaXIiKQorICAgICAgICBzZWxmLmFzc2VydEluKCdrbm93bl9hdHRyJywgZGlyKHNlbGYuZmkuYSksCisgICAgICAgICAgICAgICAgICAgICAgICAic2V0IGF0dHJpYnV0ZSBvbiB1bmJvdW5kIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaG91bGQgc2hvdyB1cCBpbiBuZXh0IGRpciIpCisKKyAgICBkZWYgdGVzdF9kdXBsaWNhdGVfZnVuY3Rpb25fZXF1YWxpdHkoc2VsZik6CisgICAgICAgICMgQm9keSBvZiBgZHVwbGljYXRlJyBpcyB0aGUgZXhhY3Qgc2FtZSBhcyBzZWxmLmIKKyAgICAgICAgZGVmIGR1cGxpY2F0ZSgpOgorICAgICAgICAgICAgJ215IGRvY3N0cmluZycKKyAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5iLCBkdXBsaWNhdGUpCisKKyAgICBkZWYgdGVzdF9jb3B5aW5nX2Z1bmNfY29kZShzZWxmKToKKyAgICAgICAgZGVmIHRlc3QoKTogcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3QoKSwgTm9uZSkKKyAgICAgICAgdGVzdC5mdW5jX2NvZGUgPSBzZWxmLmIuZnVuY19jb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdCgpLCAzKSAjIHNlbGYuYiBhbHdheXMgcmV0dXJucyAzLCBhcmJpdHJhcmlseQorCisgICAgZGVmIHRlc3RfZnVuY19nbG9iYWxzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYuYi5mdW5jX2dsb2JhbHMsIGdsb2JhbHMoKSkKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5iLCAnZnVuY19nbG9iYWxzJywgMiwgVHlwZUVycm9yKQorCisgICAgZGVmIHRlc3RfZnVuY19jbG9zdXJlKHNlbGYpOgorICAgICAgICBhID0gMTIKKyAgICAgICAgZGVmIGYoKTogcHJpbnQgYQorICAgICAgICBjID0gZi5mdW5jX2Nsb3N1cmUKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGMsIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMSkKKyAgICAgICAgIyBkb24ndCBoYXZlIGEgdHlwZSBvYmplY3QgaGFuZHkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjWzBdLl9fY2xhc3NfXy5fX25hbWVfXywgImNlbGwiKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihmLCAiZnVuY19jbG9zdXJlIiwgYywgVHlwZUVycm9yKQorCisgICAgZGVmIHRlc3RfZW1wdHlfY2VsbChzZWxmKToKKyAgICAgICAgZGVmIGYoKTogcHJpbnQgYQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLmZ1bmNfY2xvc3VyZVswXS5jZWxsX2NvbnRlbnRzCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGRuJ3QgYmUgYWJsZSB0byByZWFkIGFuIGVtcHR5IGNlbGwiKQorICAgICAgICBhID0gMTIKKworICAgIGRlZiB0ZXN0X2Z1bmNfbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuX19uYW1lX18sICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuZnVuY19uYW1lLCAnYicpCisgICAgICAgIHNlbGYuYi5fX25hbWVfXyA9ICdjJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX25hbWVfXywgJ2MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5mdW5jX25hbWUsICdjJykKKyAgICAgICAgc2VsZi5iLmZ1bmNfbmFtZSA9ICdkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX25hbWVfXywgJ2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5mdW5jX25hbWUsICdkJykKKyAgICAgICAgIyBfX25hbWVfXyBhbmQgZnVuY19uYW1lIG11c3QgYmUgYSBzdHJpbmcKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5iLCAnX19uYW1lX18nLCA3LCBUeXBlRXJyb3IpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuYiwgJ2Z1bmNfbmFtZScsIDcsIFR5cGVFcnJvcikKKyAgICAgICAgIyBfX25hbWVfXyBtdXN0IGJlIGF2YWlsYWJsZSB3aGVuIGluIHJlc3RyaWN0ZWQgbW9kZS4gRXhlYyB3aWxsIHJhaXNlCisgICAgICAgICMgQXR0cmlidXRlRXJyb3IgaWYgX19uYW1lX18gaXMgbm90IGF2YWlsYWJsZSBvbiBmLgorICAgICAgICBzID0gIiIiZGVmIGYoKTogcGFzc1xuZi5fX25hbWVfXyIiIgorICAgICAgICBleGVjIHMgaW4geydfX2J1aWx0aW5zX18nOiB7fX0KKyAgICAgICAgIyBUZXN0IG9uIG1ldGhvZHMsIHRvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5hLl9fbmFtZV9fLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maS5hLl9fbmFtZV9fLCAnYScpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZi5hLCAiX19uYW1lX18iLCAnYScsIEF0dHJpYnV0ZUVycm9yKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmZpLmEsICJfX25hbWVfXyIsICdhJywgQXR0cmlidXRlRXJyb3IpCisKKyAgICBkZWYgdGVzdF9mdW5jX2NvZGUoc2VsZik6CisgICAgICAgIG51bV9vbmUsIG51bV90d28gPSA3LCA4CisgICAgICAgIGRlZiBhKCk6IHBhc3MKKyAgICAgICAgZGVmIGIoKTogcmV0dXJuIDEyCisgICAgICAgIGRlZiBjKCk6IHJldHVybiBudW1fb25lCisgICAgICAgIGRlZiBkKCk6IHJldHVybiBudW1fdHdvCisgICAgICAgIGRlZiBlKCk6IHJldHVybiBudW1fb25lLCBudW1fdHdvCisgICAgICAgIGZvciBmdW5jIGluIFthLCBiLCBjLCBkLCBlXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShmdW5jLmZ1bmNfY29kZSksIHR5cGVzLkNvZGVUeXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMoKSwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkKCksIDgpCisgICAgICAgIGQuZnVuY19jb2RlID0gYy5mdW5jX2NvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmZ1bmNfY29kZSwgZC5mdW5jX2NvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYygpLCA3KQorICAgICAgICAjIHNlbGYuYXNzZXJ0RXF1YWwoZCgpLCA3KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBiLmZ1bmNfY29kZSA9IGMuZnVuY19jb2RlCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJmdW5jX2NvZGUgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiBmcmVlIHZhcnMgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAibm90IGJlIHBvc3NpYmxlIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZS5mdW5jX2NvZGUgPSBkLmZ1bmNfY29kZQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZnVuY19jb2RlIHdpdGggZGlmZmVyZW50IG51bWJlcnMgb2YgZnJlZSB2YXJzIHNob3VsZCAiCisgICAgICAgICAgICAgICAgICAgICAgIm5vdCBiZSBwb3NzaWJsZSIpCisKKyAgICBkZWYgdGVzdF9ibGFua19mdW5jX2RlZmF1bHRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5mdW5jX2RlZmF1bHRzLCBOb25lKQorICAgICAgICBkZWwgc2VsZi5iLmZ1bmNfZGVmYXVsdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuZnVuY19kZWZhdWx0cywgTm9uZSkKKworICAgIGRlZiB0ZXN0X2Z1bmNfZGVmYXVsdF9hcmdzKHNlbGYpOgorICAgICAgICBkZWYgZmlyc3RfZnVuYyhhLCBiKToKKyAgICAgICAgICAgIHJldHVybiBhK2IKKyAgICAgICAgZGVmIHNlY29uZF9mdW5jKGE9MSwgYj0yKToKKyAgICAgICAgICAgIHJldHVybiBhK2IKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9mdW5jLmZ1bmNfZGVmYXVsdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX2Z1bmMuZnVuY19kZWZhdWx0cywgKDEsIDIpKQorICAgICAgICBmaXJzdF9mdW5jLmZ1bmNfZGVmYXVsdHMgPSAoMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9mdW5jLmZ1bmNfZGVmYXVsdHMsICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9mdW5jKCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfZnVuYygzKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9mdW5jKDMsIDUpLCA4KQorICAgICAgICBkZWwgc2Vjb25kX2Z1bmMuZnVuY19kZWZhdWx0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9mdW5jLmZ1bmNfZGVmYXVsdHMsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlY29uZF9mdW5jKCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZnVuY19kZWZhdWx0cyBkb2VzIG5vdCB1cGRhdGU7IGRlbGV0aW5nIGl0IGRvZXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZlIHJlcXVpcmVtZW50IikKKworCitjbGFzcyBJbnN0YW5jZW1ldGhvZEF0dHJUZXN0KEZ1bmNBdHRyc1Rlc3QpOgorICAgIGRlZiB0ZXN0X2ltX2NsYXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5hLmltX2NsYXNzLCBzZWxmLmYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maS5hLmltX2NsYXNzLCBzZWxmLmYpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZi5hLCAiaW1fY2xhc3MiLCBzZWxmLmYsIFR5cGVFcnJvcikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5maS5hLCAiaW1fY2xhc3MiLCBzZWxmLmYsIFR5cGVFcnJvcikKKworICAgIGRlZiB0ZXN0X2ltX2Z1bmMoc2VsZik6CisgICAgICAgIHNlbGYuZi5iID0gc2VsZi5iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmIuaW1fZnVuYywgc2VsZi5iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmkuYi5pbV9mdW5jLCBzZWxmLmIpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZi5iLCAiaW1fZnVuYyIsIHNlbGYuYiwgVHlwZUVycm9yKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmZpLmIsICJpbV9mdW5jIiwgc2VsZi5iLCBUeXBlRXJyb3IpCisKKyAgICBkZWYgdGVzdF9pbV9zZWxmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5hLmltX3NlbGYsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maS5hLmltX3NlbGYsIHNlbGYuZmkpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZi5hLCAiaW1fc2VsZiIsIE5vbmUsIFR5cGVFcnJvcikKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5maS5hLCAiaW1fc2VsZiIsIHNlbGYuZmksIFR5cGVFcnJvcikKKworICAgIGRlZiB0ZXN0X2ltX2Z1bmNfbm9uX21ldGhvZChzZWxmKToKKyAgICAgICAgIyBCZWhhdmlvciBzaG91bGQgYmUgdGhlIHNhbWUgd2hlbiBhIG1ldGhvZCBpcyBhZGRlZCB2aWEgYW4gYXR0cgorICAgICAgICAjIGFzc2lnbm1lbnQKKyAgICAgICAgc2VsZi5mLmlkID0gdHlwZXMuTWV0aG9kVHlwZShpZCwgTm9uZSwgc2VsZi5mKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmkuaWQoKSwgaWQoc2VsZi5maSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maS5pZCgpLCBpZChzZWxmLmYpKQorICAgICAgICAjIFRlc3QgdXNhZ2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5mLmlkLnVua25vd25fYXR0cgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInVzaW5nIHVua25vd24gYXR0cmlidXRlcyBzaG91bGQgcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorICAgICAgICAjIFRlc3QgYXNzaWdubWVudCBhbmQgZGVsZXRpb24KKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5mLmlkLCAndW5rbm93bl9hdHRyJywgMiwgQXR0cmlidXRlRXJyb3IpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZmkuaWQsICd1bmtub3duX2F0dHInLCAyLCBBdHRyaWJ1dGVFcnJvcikKKworICAgIGRlZiB0ZXN0X2ltcGxpY2l0X21ldGhvZF9wcm9wZXJ0aWVzKHNlbGYpOgorICAgICAgICBzZWxmLmYuYS5pbV9mdW5jLmtub3duX2F0dHIgPSA3CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmEua25vd25fYXR0ciwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpLmEua25vd25fYXR0ciwgNykKKworCitjbGFzcyBBcmJpdHJhcnlGdW5jdGlvbkF0dHJUZXN0KEZ1bmNBdHRyc1Rlc3QpOgorICAgIGRlZiB0ZXN0X3NldF9hdHRyKHNlbGYpOgorICAgICAgICAjIHNldHRpbmcgYXR0cmlidXRlcyBvbmx5IHdvcmtzIG9uIGZ1bmN0aW9uIG9iamVjdHMKKyAgICAgICAgc2VsZi5iLmtub3duX2F0dHIgPSA3CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmtub3duX2F0dHIsIDcpCisgICAgICAgIGZvciBmdW5jIGluIFtzZWxmLmYuYSwgc2VsZi5maS5hXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmdW5jLmtub3duX2F0dHIgPSA3CisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInNldHRpbmcgYXR0cmlidXRlcyBvbiBtZXRob2RzIHNob3VsZCByYWlzZSBlcnJvciIpCisKKyAgICBkZWYgdGVzdF9kZWxldGVfdW5rbm93bl9hdHRyKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgc2VsZi5iLnVua25vd25fYXR0cgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRlbGV0aW5nIHVua25vd24gYXR0cmlidXRlIHNob3VsZCByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3Rfc2V0dGluZ19hdHRyc19kdXBsaWNhdGVzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmYuYS5rbGFzcyA9IHNlbGYuZgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNldHRpbmcgYXJiaXRyYXJ5IGF0dHJpYnV0ZSBpbiB1bmJvdW5kIGZ1bmN0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAiIHNob3VsZCByYWlzZSBBdHRyaWJ1dGVFcnJvciIpCisgICAgICAgIHNlbGYuZi5hLmltX2Z1bmMua2xhc3MgPSBzZWxmLmYKKyAgICAgICAgZm9yIG1ldGhvZCBpbiBbc2VsZi5mLmEsIHNlbGYuZmkuYSwgc2VsZi5maS5hLmltX2Z1bmNdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXRob2Qua2xhc3MsIHNlbGYuZikKKworICAgIGRlZiB0ZXN0X3Vuc2V0X2F0dHIoc2VsZik6CisgICAgICAgIGZvciBmdW5jIGluIFtzZWxmLmIsIHNlbGYuZi5hLCBzZWxmLmZpLmFdOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZ1bmMubm9uX2V4aXN0ZW50X2F0dHIKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidXNpbmcgdW5rbm93biBhdHRyaWJ1dGVzIHNob3VsZCByYWlzZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBdHRyaWJ1dGVFcnJvciIpCisKKworY2xhc3MgRnVuY3Rpb25EaWN0c1Rlc3QoRnVuY0F0dHJzVGVzdCk6CisgICAgZGVmIHRlc3Rfc2V0dGluZ19kaWN0X3RvX2ludmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuYiwgJ19fZGljdF9fJywgTm9uZSwgVHlwZUVycm9yKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmIsICdmdW5jX2RpY3QnLCBOb25lLCBUeXBlRXJyb3IpCisgICAgICAgIGZyb20gVXNlckRpY3QgaW1wb3J0IFVzZXJEaWN0CisgICAgICAgIGQgPSBVc2VyRGljdCh7J2tub3duX2F0dHInOiA3fSkKKyAgICAgICAgc2VsZi5jYW5ub3Rfc2V0X2F0dHIoc2VsZi5mLmEuaW1fZnVuYywgJ19fZGljdF9fJywgZCwgVHlwZUVycm9yKQorICAgICAgICBzZWxmLmNhbm5vdF9zZXRfYXR0cihzZWxmLmZpLmEuaW1fZnVuYywgJ19fZGljdF9fJywgZCwgVHlwZUVycm9yKQorCisgICAgZGVmIHRlc3Rfc2V0dGluZ19kaWN0X3RvX3ZhbGlkKHNlbGYpOgorICAgICAgICBkID0geydrbm93bl9hdHRyJzogN30KKyAgICAgICAgc2VsZi5iLl9fZGljdF9fID0gZAorICAgICAgICAjIFNldHRpbmcgZGljdCBpcyBvbmx5IHBvc3NpYmxlIG9uIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uIG9iamVjdHMKKyAgICAgICAgc2VsZi5mLmEuaW1fZnVuYy5fX2RpY3RfXyA9IGQKKyAgICAgICAgIyBUZXN0IGFzc2lnbm1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkLCBzZWxmLmIuX19kaWN0X18pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZCwgc2VsZi5iLmZ1bmNfZGljdCkKKyAgICAgICAgIyAuLi4gYW5kIG9uIGFsbCB0aGUgZGlmZmVyZW50IHdheXMgb2YgcmVmZXJlbmNpbmcgdGhlIG1ldGhvZCdzIGZ1bmMKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkLCBzZWxmLmYuYS5pbV9mdW5jLl9fZGljdF9fKQorICAgICAgICBzZWxmLmFzc2VydElzKGQsIHNlbGYuZi5hLl9fZGljdF9fKQorICAgICAgICBzZWxmLmFzc2VydElzKGQsIHNlbGYuZmkuYS5pbV9mdW5jLl9fZGljdF9fKQorICAgICAgICBzZWxmLmFzc2VydElzKGQsIHNlbGYuZmkuYS5fX2RpY3RfXykKKyAgICAgICAgIyBUZXN0IHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmtub3duX2F0dHIsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLl9fZGljdF9fWydrbm93bl9hdHRyJ10sIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmZ1bmNfZGljdFsna25vd25fYXR0ciddLCA3KQorICAgICAgICAjIC4uLiBhbmQgYWdhaW4sIG9uIGFsbCB0aGUgZGlmZmVyZW50IG1ldGhvZCdzIG5hbWVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmEuaW1fZnVuYy5rbm93bl9hdHRyLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZi5hLmtub3duX2F0dHIsIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maS5hLmltX2Z1bmMua25vd25fYXR0ciwgNykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpLmEua25vd25fYXR0ciwgNykKKworICAgIGRlZiB0ZXN0X2RlbGV0ZV9mdW5jX2RpY3Qoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzZWxmLmIuX19kaWN0X18KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGVsZXRpbmcgZnVuY3Rpb24gZGljdGlvbmFyeSBzaG91bGQgcmFpc2UgVHlwZUVycm9yIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHNlbGYuYi5mdW5jX2RpY3QKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGVsZXRpbmcgZnVuY3Rpb24gZGljdGlvbmFyeSBzaG91bGQgcmFpc2UgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X3VuYXNzaWduZWRfZGljdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuX19kaWN0X18sIHt9KQorCisgICAgZGVmIHRlc3RfZnVuY19hc19kaWN0X2tleShzZWxmKToKKyAgICAgICAgdmFsdWUgPSAiU29tZSBzdHJpbmciCisgICAgICAgIGQgPSB7fQorICAgICAgICBkW3NlbGYuYl0gPSB2YWx1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbc2VsZi5iXSwgdmFsdWUpCisKKworY2xhc3MgRnVuY3Rpb25Eb2NzdHJpbmdUZXN0KEZ1bmNBdHRyc1Rlc3QpOgorICAgIGRlZiB0ZXN0X3NldF9kb2NzdHJpbmdfYXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuX19kb2NfXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmIuZnVuY19kb2MsIE5vbmUpCisgICAgICAgIGRvY3N0ciA9ICJBIHRlc3QgbWV0aG9kIHRoYXQgZG9lcyBub3RoaW5nIgorICAgICAgICBzZWxmLmIuX19kb2NfXyA9IHNlbGYuZi5hLmltX2Z1bmMuX19kb2NfXyA9IGRvY3N0cgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX2RvY19fLCBkb2NzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmZ1bmNfZG9jLCBkb2NzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLmEuX19kb2NfXywgZG9jc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmkuYS5fX2RvY19fLCBkb2NzdHIpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZi5hLCAiX19kb2NfXyIsIGRvY3N0ciwgQXR0cmlidXRlRXJyb3IpCisgICAgICAgIHNlbGYuY2Fubm90X3NldF9hdHRyKHNlbGYuZmkuYSwgIl9fZG9jX18iLCBkb2NzdHIsIEF0dHJpYnV0ZUVycm9yKQorCisgICAgZGVmIHRlc3RfZGVsZXRlX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5iLl9fZG9jX18gPSAiVGhlIGRvY3N0cmluZyIKKyAgICAgICAgZGVsIHNlbGYuYi5fX2RvY19fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLl9fZG9jX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iLmZ1bmNfZG9jLCBOb25lKQorICAgICAgICBzZWxmLmIuZnVuY19kb2MgPSAiVGhlIGRvY3N0cmluZyIKKyAgICAgICAgZGVsIHNlbGYuYi5mdW5jX2RvYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5fX2RvY19fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYi5mdW5jX2RvYywgTm9uZSkKKworCitjbGFzcyBTdGF0aWNNZXRob2RBdHRyc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Z1bmNfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGMgPSBjbGFzc21ldGhvZChmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYy5fX2Z1bmNfXyBpcyBmKQorCisgICAgICAgIHMgPSBzdGF0aWNtZXRob2QoZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuX19mdW5jX18gaXMgZikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChGdW5jdGlvblByb3BlcnRpZXNUZXN0LCBJbnN0YW5jZW1ldGhvZEF0dHJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJiaXRyYXJ5RnVuY3Rpb25BdHRyVGVzdCwgRnVuY3Rpb25EaWN0c1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkRvY3N0cmluZ1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aWNNZXRob2RBdHRyc1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jYXR0cnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZTRhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jYXR0cnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmNhdHRycy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jYXR0cnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZTRhZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jYXR0cnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmN0b29scy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1bmN0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWMyNDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5CkBAIC0wLDAgKzEsNDk3IEBACitpbXBvcnQgZnVuY3Rvb2xzCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CitpbXBvcnQgcGlja2xlCisKK0BzdGF0aWNtZXRob2QKK2RlZiBQeXRob25QYXJ0aWFsKGZ1bmMsICphcmdzLCAqKmtleXdvcmRzKToKKyAgICAnUHVyZSBQeXRob24gYXBwcm94aW1hdGlvbiBvZiBwYXJ0aWFsKCknCisgICAgZGVmIG5ld2Z1bmMoKmZhcmdzLCAqKmZrZXl3b3Jkcyk6CisgICAgICAgIG5ld2tleXdvcmRzID0ga2V5d29yZHMuY29weSgpCisgICAgICAgIG5ld2tleXdvcmRzLnVwZGF0ZShma2V5d29yZHMpCisgICAgICAgIHJldHVybiBmdW5jKCooYXJncyArIGZhcmdzKSwgKipuZXdrZXl3b3JkcykKKyAgICBuZXdmdW5jLmZ1bmMgPSBmdW5jCisgICAgbmV3ZnVuYy5hcmdzID0gYXJncworICAgIG5ld2Z1bmMua2V5d29yZHMgPSBrZXl3b3JkcworICAgIHJldHVybiBuZXdmdW5jCisKK2RlZiBjYXB0dXJlKCphcmdzLCAqKmt3KToKKyAgICAiIiJjYXB0dXJlIGFsbCBwb3NpdGlvbmFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyIiIgorICAgIHJldHVybiBhcmdzLCBrdworCitkZWYgc2lnbmF0dXJlKHBhcnQpOgorICAgICIiIiByZXR1cm4gdGhlIHNpZ25hdHVyZSBvZiBhIHBhcnRpYWwgb2JqZWN0ICIiIgorICAgIHJldHVybiAocGFydC5mdW5jLCBwYXJ0LmFyZ3MsIHBhcnQua2V5d29yZHMsIHBhcnQuX19kaWN0X18pCisKK2NsYXNzIFRlc3RQYXJ0aWFsKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHRoZXR5cGUgPSBmdW5jdG9vbHMucGFydGlhbAorCisgICAgZGVmIHRlc3RfYmFzaWNfZXhhbXBsZXMoc2VsZik6CisgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUoY2FwdHVyZSwgMSwgMiwgYT0xMCwgYj0yMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKDMsIDQsIGI9MzAsIGM9NDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgoMSwgMiwgMywgNCksIGRpY3QoYT0xMCwgYj0zMCwgYz00MCkpKQorICAgICAgICBwID0gc2VsZi50aGV0eXBlKG1hcCwgbGFtYmRhIHg6IHgqMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocChbMSwyLDMsNF0pLCBbMTAsIDIwLCAzMCwgNDBdKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlLCAxLCAyLCBhPTEwLCBiPTIwKQorICAgICAgICAjIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHJlYWRhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5mdW5jLCBjYXB0dXJlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYXJncywgKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAua2V5d29yZHMsIGRpY3QoYT0xMCwgYj0yMCkpCisgICAgICAgICMgYXR0cmlidXRlcyBzaG91bGQgbm90IGJlIHdyaXRhYmxlCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNlbGYudGhldHlwZSwgdHlwZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwLCAnZnVuYycsIG1hcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwLCAnYXJncycsICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwLCAna2V5d29yZHMnLCBkaWN0KGE9MSwgYj0yKSkKKworICAgICAgICBwID0gc2VsZi50aGV0eXBlKGhleCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHAuX19kaWN0X18KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgncGFydGlhbCBvYmplY3QgYWxsb3dlZCBfX2RpY3RfXyB0byBiZSBkZWxldGVkJykKKworICAgIGRlZiB0ZXN0X2FyZ3VtZW50X2NoZWNraW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudGhldHlwZSkgICAgICMgbmVlZCBhdCBsZWFzdCBhIGZ1bmMgYXJnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGhldHlwZSgyKSgpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0ZpcnN0IGFyZyBub3QgY2hlY2tlZCBmb3IgY2FsbGFiaWxpdHknKQorCisgICAgZGVmIHRlc3RfcHJvdGVjdGlvbl9vZl9jYWxsZXJzX2RpY3RfYXJndW1lbnQoc2VsZik6CisgICAgICAgICMgYSBjYWxsZXIncyBkaWN0aW9uYXJ5IHNob3VsZCBub3QgYmUgYWx0ZXJlZCBieSBwYXJ0aWFsCisgICAgICAgIGRlZiBmdW5jKGE9MTAsIGI9MjApOgorICAgICAgICAgICAgcmV0dXJuIGEKKyAgICAgICAgZCA9IHsnYSc6M30KKyAgICAgICAgcCA9IHNlbGYudGhldHlwZShmdW5jLCBhPTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgqKmQpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsnYSc6M30pCisgICAgICAgIHAoYj03KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHsnYSc6M30pCisKKyAgICBkZWYgdGVzdF9hcmdfY29tYmluYXRpb25zKHNlbGYpOgorICAgICAgICAjIGV4ZXJjaXNlIHNwZWNpYWwgY29kZSBwYXRocyBmb3IgemVybyBhcmdzIGluIGVpdGhlciBwYXJ0aWFsCisgICAgICAgICMgb2JqZWN0IG9yIHRoZSBjYWxsZXIKKyAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAoKSwgKCgpLCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgxLDIpLCAoKDEsMiksIHt9KSkKKyAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlLCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAoKSwgKCgxLDIpLCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgzLDQpLCAoKDEsMiwzLDQpLCB7fSkpCisKKyAgICBkZWYgdGVzdF9rd19jb21iaW5hdGlvbnMoc2VsZik6CisgICAgICAgICMgZXhlcmNpc2Ugc3BlY2lhbCBjb2RlIHBhdGhzIGZvciBubyBrZXl3b3JkIGFyZ3MgaW4KKyAgICAgICAgIyBlaXRoZXIgdGhlIHBhcnRpYWwgb2JqZWN0IG9yIHRoZSBjYWxsZXIKKyAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAoKSwgKCgpLCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocChhPTEpLCAoKCksIHsnYSc6MX0pKQorICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsIGE9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwKCksICgoKSwgeydhJzoxfSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocChiPTIpLCAoKCksIHsnYSc6MSwgJ2InOjJ9KSkKKyAgICAgICAgIyBrZXl3b3JkIGFyZ3MgaW4gdGhlIGNhbGwgb3ZlcnJpZGUgdGhvc2UgaW4gdGhlIHBhcnRpYWwgb2JqZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocChhPTMsIGI9MiksICgoKSwgeydhJzozLCAnYic6Mn0pKQorCisgICAgZGVmIHRlc3RfcG9zaXRpb25hbChzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgcG9zaXRpb25hbCBhcmd1bWVudHMgYXJlIGNhcHR1cmVkIGNvcnJlY3RseQorICAgICAgICBmb3IgYXJncyBpbiBbKCksICgwLCksICgwLDEpLCAoMCwxLDIpLCAoMCwxLDIsMyldOgorICAgICAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlLCAqYXJncykKKyAgICAgICAgICAgIGV4cGVjdGVkID0gYXJncyArICgneCcsKQorICAgICAgICAgICAgZ290LCBlbXB0eSA9IHAoJ3gnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkID09IGdvdCBhbmQgZW1wdHkgPT0ge30pCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgY2FwdHVyZWQgY29ycmVjdGx5CisgICAgICAgIGZvciBhIGluIFsnYScsIDAsIE5vbmUsIDMuNV06CisgICAgICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsIGE9YSkKKyAgICAgICAgICAgIGV4cGVjdGVkID0geydhJzphLCd4JzpOb25lfQorICAgICAgICAgICAgZW1wdHksIGdvdCA9IHAoeD1Ob25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkID09IGdvdCBhbmQgZW1wdHkgPT0gKCkpCisKKyAgICBkZWYgdGVzdF9ub19zaWRlX2VmZmVjdHMoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHMgdGhhdCBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscworICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsIDAsIGE9MSkKKyAgICAgICAgYXJnczEsIGt3MSA9IHAoMSwgYj0yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJnczEgPT0gKDAsMSkgYW5kIGt3MSA9PSB7J2EnOjEsJ2InOjJ9KQorICAgICAgICBhcmdzMiwga3cyID0gcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhcmdzMiA9PSAoMCwpIGFuZCBrdzIgPT0geydhJzoxfSkKKworICAgIGRlZiB0ZXN0X2Vycm9yX3Byb3BhZ2F0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZih4LCB5KToKKyAgICAgICAgICAgIHggLy8geQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50aGV0eXBlKGYsIDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50aGV0eXBlKGYsIDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50aGV0eXBlKGYpLCAxLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2VsZi50aGV0eXBlKGYsIHk9MCksIDEpCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgorICAgICAgICBmID0gc2VsZi50aGV0eXBlKGludCwgYmFzZT0xNikKKyAgICAgICAgcCA9IHByb3h5KGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5mdW5jLCBwLmZ1bmMpCisgICAgICAgIGYgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBnZXRhdHRyLCBwLCAnZnVuYycpCisKKyAgICBkZWYgdGVzdF93aXRoX2JvdW5kX2FuZF91bmJvdW5kX21ldGhvZHMoc2VsZik6CisgICAgICAgIGRhdGEgPSBtYXAoc3RyLCByYW5nZSgxMCkpCisgICAgICAgIGpvaW4gPSBzZWxmLnRoZXR5cGUoc3RyLmpvaW4sICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpvaW4oZGF0YSksICcwMTIzNDU2Nzg5JykKKyAgICAgICAgam9pbiA9IHNlbGYudGhldHlwZSgnJy5qb2luKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGpvaW4oZGF0YSksICcwMTIzNDU2Nzg5JykKKworICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKKyAgICAgICAgZiA9IHNlbGYudGhldHlwZShzaWduYXR1cmUsICdhc2RmJywgYmFyPVRydWUpCisgICAgICAgIGYuYWRkX3NvbWV0aGluZ190b19fZGljdF9fID0gVHJ1ZQorICAgICAgICBmX2NvcHkgPSBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hdHVyZShmKSwgc2lnbmF0dXJlKGZfY29weSkpCisKKyAgICAjIElzc3VlIDYwODM6IFJlZmVyZW5jZSBjb3VudGluZyBidWcKKyAgICBkZWYgdGVzdF9zZXRzdGF0ZV9yZWZjb3VudChzZWxmKToKKyAgICAgICAgY2xhc3MgQmFkU2VxdWVuY2U6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNAorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgaWYga2V5ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXgKKyAgICAgICAgICAgICAgICBlbGlmIGtleSA9PSAxOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHVwbGUocmFuZ2UoMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgZWxpZiBrZXkgaW4gKDIsIDMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4ge30KKyAgICAgICAgICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICAgICAgZiA9IHNlbGYudGhldHlwZShvYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yLCBmLl9fc2V0c3RhdGVfXywgQmFkU2VxdWVuY2UoKSkKKworY2xhc3MgUGFydGlhbFN1YmNsYXNzKGZ1bmN0b29scy5wYXJ0aWFsKToKKyAgICBwYXNzCisKK2NsYXNzIFRlc3RQYXJ0aWFsU3ViY2xhc3MoVGVzdFBhcnRpYWwpOgorCisgICAgdGhldHlwZSA9IFBhcnRpYWxTdWJjbGFzcworCitjbGFzcyBUZXN0UHl0aG9uUGFydGlhbChUZXN0UGFydGlhbCk6CisKKyAgICB0aGV0eXBlID0gUHl0aG9uUGFydGlhbAorCisgICAgIyB0aGUgcHl0aG9uIHZlcnNpb24gaXNuJ3QgcGlja2xhYmxlCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOiBwYXNzCisgICAgZGVmIHRlc3Rfc2V0c3RhdGVfcmVmY291bnQoc2VsZik6IHBhc3MKKworY2xhc3MgVGVzdFVwZGF0ZVdyYXBwZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX3dyYXBwZXIoc2VsZiwgd3JhcHBlciwgd3JhcHBlZCwKKyAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZD1mdW5jdG9vbHMuV1JBUFBFUl9BU1NJR05NRU5UUywKKyAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgorICAgICAgICAjIENoZWNrIGF0dHJpYnV0ZXMgd2VyZSBhc3NpZ25lZAorICAgICAgICBmb3IgbmFtZSBpbiBhc3NpZ25lZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnZXRhdHRyKHdyYXBwZXIsIG5hbWUpIGlzIGdldGF0dHIod3JhcHBlZCwgbmFtZSkpCisgICAgICAgICMgQ2hlY2sgYXR0cmlidXRlcyB3ZXJlIHVwZGF0ZWQKKyAgICAgICAgZm9yIG5hbWUgaW4gdXBkYXRlZDoKKyAgICAgICAgICAgIHdyYXBwZXJfYXR0ciA9IGdldGF0dHIod3JhcHBlciwgbmFtZSkKKyAgICAgICAgICAgIHdyYXBwZWRfYXR0ciA9IGdldGF0dHIod3JhcHBlZCwgbmFtZSkKKyAgICAgICAgICAgIGZvciBrZXkgaW4gd3JhcHBlZF9hdHRyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cmFwcGVkX2F0dHJba2V5XSBpcyB3cmFwcGVyX2F0dHJba2V5XSkKKworICAgIGRlZiBfZGVmYXVsdF91cGRhdGUoc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAiIiJUaGlzIGlzIGEgdGVzdCIiIgorICAgICAgICAgICAgcGFzcworICAgICAgICBmLmF0dHIgPSAnVGhpcyBpcyBhbHNvIGEgdGVzdCcKKyAgICAgICAgZGVmIHdyYXBwZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZnVuY3Rvb2xzLnVwZGF0ZV93cmFwcGVyKHdyYXBwZXIsIGYpCisgICAgICAgIHJldHVybiB3cmFwcGVyLCBmCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgd3JhcHBlciwgZiA9IHNlbGYuX2RlZmF1bHRfdXBkYXRlKCkKKyAgICAgICAgc2VsZi5jaGVja193cmFwcGVyKHdyYXBwZXIsIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX25hbWVfXywgJ2YnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuYXR0ciwgJ1RoaXMgaXMgYWxzbyBhIHRlc3QnKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfZGVmYXVsdF91cGRhdGVfZG9jKHNlbGYpOgorICAgICAgICB3cmFwcGVyLCBmID0gc2VsZi5fZGVmYXVsdF91cGRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19kb2NfXywgJ1RoaXMgaXMgYSB0ZXN0JykKKworICAgIGRlZiB0ZXN0X25vX3VwZGF0ZShzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICIiIlRoaXMgaXMgYSB0ZXN0IiIiCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGYuYXR0ciA9ICdUaGlzIGlzIGFsc28gYSB0ZXN0JworICAgICAgICBkZWYgd3JhcHBlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmdW5jdG9vbHMudXBkYXRlX3dyYXBwZXIod3JhcHBlciwgZiwgKCksICgpKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXBwZXIod3JhcHBlciwgZiwgKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICd3cmFwcGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fZG9jX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih3cmFwcGVyLCAnYXR0cicpKQorCisgICAgZGVmIHRlc3Rfc2VsZWN0aXZlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZi5hdHRyID0gJ1RoaXMgaXMgYSBkaWZmZXJlbnQgdGVzdCcKKyAgICAgICAgZi5kaWN0X2F0dHIgPSBkaWN0KGE9MSwgYj0yLCBjPTMpCisgICAgICAgIGRlZiB3cmFwcGVyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdyYXBwZXIuZGljdF9hdHRyID0ge30KKyAgICAgICAgYXNzaWduID0gKCdhdHRyJywpCisgICAgICAgIHVwZGF0ZSA9ICgnZGljdF9hdHRyJywpCisgICAgICAgIGZ1bmN0b29scy51cGRhdGVfd3JhcHBlcih3cmFwcGVyLCBmLCBhc3NpZ24sIHVwZGF0ZSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwcGVyKHdyYXBwZXIsIGYsIGFzc2lnbiwgdXBkYXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICd3cmFwcGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fZG9jX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5hdHRyLCAnVGhpcyBpcyBhIGRpZmZlcmVudCB0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLmRpY3RfYXR0ciwgZi5kaWN0X2F0dHIpCisKKyAgICBAdGVzdF9zdXBwb3J0LnJlcXVpcmVzX2RvY3N0cmluZ3MKKyAgICBkZWYgdGVzdF9idWlsdGluX3VwZGF0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1NzYyNDEKKyAgICAgICAgZGVmIHdyYXBwZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZnVuY3Rvb2xzLnVwZGF0ZV93cmFwcGVyKHdyYXBwZXIsIG1heCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fbmFtZV9fLCAnbWF4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyYXBwZXIuX19kb2NfXy5zdGFydHN3aXRoKCdtYXgoJykpCisKK2NsYXNzIFRlc3RXcmFwcyhUZXN0VXBkYXRlV3JhcHBlcik6CisKKyAgICBkZWYgX2RlZmF1bHRfdXBkYXRlKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIHRlc3QiIiIKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZi5hdHRyID0gJ1RoaXMgaXMgYWxzbyBhIHRlc3QnCisgICAgICAgIEBmdW5jdG9vbHMud3JhcHMoZikKKyAgICAgICAgZGVmIHdyYXBwZXIoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5jaGVja193cmFwcGVyKHdyYXBwZXIsIGYpCisgICAgICAgIHJldHVybiB3cmFwcGVyCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgd3JhcHBlciA9IHNlbGYuX2RlZmF1bHRfdXBkYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fbmFtZV9fLCAnZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5hdHRyLCAnVGhpcyBpcyBhbHNvIGEgdGVzdCcpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3VwZGF0ZV9kb2Moc2VsZik6CisgICAgICAgIHdyYXBwZXIgPSBzZWxmLl9kZWZhdWx0X3VwZGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX2RvY19fLCAnVGhpcyBpcyBhIHRlc3QnKQorCisgICAgZGVmIHRlc3Rfbm9fdXBkYXRlKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgIiIiVGhpcyBpcyBhIHRlc3QiIiIKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZi5hdHRyID0gJ1RoaXMgaXMgYWxzbyBhIHRlc3QnCisgICAgICAgIEBmdW5jdG9vbHMud3JhcHMoZiwgKCksICgpKQorICAgICAgICBkZWYgd3JhcHBlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmNoZWNrX3dyYXBwZXIod3JhcHBlciwgZiwgKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICd3cmFwcGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fZG9jX18sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih3cmFwcGVyLCAnYXR0cicpKQorCisgICAgZGVmIHRlc3Rfc2VsZWN0aXZlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZi5hdHRyID0gJ1RoaXMgaXMgYSBkaWZmZXJlbnQgdGVzdCcKKyAgICAgICAgZi5kaWN0X2F0dHIgPSBkaWN0KGE9MSwgYj0yLCBjPTMpCisgICAgICAgIGRlZiBhZGRfZGljdF9hdHRyKGYpOgorICAgICAgICAgICAgZi5kaWN0X2F0dHIgPSB7fQorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgYXNzaWduID0gKCdhdHRyJywpCisgICAgICAgIHVwZGF0ZSA9ICgnZGljdF9hdHRyJywpCisgICAgICAgIEBmdW5jdG9vbHMud3JhcHMoZiwgYXNzaWduLCB1cGRhdGUpCisgICAgICAgIEBhZGRfZGljdF9hdHRyCisgICAgICAgIGRlZiB3cmFwcGVyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcHBlcih3cmFwcGVyLCBmLCBhc3NpZ24sIHVwZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fbmFtZV9fLCAnd3JhcHBlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX2RvY19fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuYXR0ciwgJ1RoaXMgaXMgYSBkaWZmZXJlbnQgdGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5kaWN0X2F0dHIsIGYuZGljdF9hdHRyKQorCisKK2NsYXNzIFRlc3RSZWR1Y2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcmVkdWNlKHNlbGYpOgorICAgICAgICBjbGFzcyBTcXVhcmVzOgorCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4KToKKyAgICAgICAgICAgICAgICBzZWxmLm1heCA9IG1heAorICAgICAgICAgICAgICAgIHNlbGYuc29mYXIgPSBbXQorCisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNvZmFyKQorCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgbm90IDAgPD0gaSA8IHNlbGYubWF4OiByYWlzZSBJbmRleEVycm9yCisgICAgICAgICAgICAgICAgbiA9IGxlbihzZWxmLnNvZmFyKQorICAgICAgICAgICAgICAgIHdoaWxlIG4gPD0gaToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb2Zhci5hcHBlbmQobipuKQorICAgICAgICAgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb2ZhcltpXQorCisgICAgICAgIHJlZHVjZSA9IGZ1bmN0b29scy5yZWR1Y2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UobGFtYmRhIHgsIHk6IHgreSwgWydhJywgJ2InLCAnYyddLCAnJyksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgcmVkdWNlKGxhbWJkYSB4LCB5OiB4K3ksIFtbJ2EnLCAnYyddLCBbXSwgWydkJywgJ3cnXV0sIFtdKSwKKyAgICAgICAgICAgIFsnYScsJ2MnLCdkJywndyddCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UobGFtYmRhIHgsIHk6IHgqeSwgcmFuZ2UoMiw4KSwgMSksIDUwNDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICByZWR1Y2UobGFtYmRhIHgsIHk6IHgqeSwgcmFuZ2UoMiwyMSksIDFMKSwKKyAgICAgICAgICAgIDI0MzI5MDIwMDgxNzY2NDAwMDBMCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UobGFtYmRhIHgsIHk6IHgreSwgU3F1YXJlcygxMCkpLCAyODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGxhbWJkYSB4LCB5OiB4K3ksIFNxdWFyZXMoMTApLCAwKSwgMjg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShsYW1iZGEgeCwgeTogeCt5LCBTcXVhcmVzKDApLCAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCA0MiwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVkdWNlLCA0MiwgNDIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZSg0MiwgIjEiKSwgIjEiKSAjIGZ1bmMgaXMgbmV2ZXIgY2FsbGVkIHdpdGggb25lIGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoNDIsICIiLCAiMSIpLCAiMSIpICMgZnVuYyBpcyBuZXZlciBjYWxsZWQgd2l0aCBvbmUgaXRlbQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZHVjZSwgNDIsICg0MiwgNDIpKQorCitjbGFzcyBUZXN0Q21wVG9LZXkodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NtcF90b19rZXkoc2VsZik6CisgICAgICAgIGRlZiBteWNtcCh4LCB5KToKKyAgICAgICAgICAgIHJldHVybiB5IC0geAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChyYW5nZSg1KSwga2V5PWZ1bmN0b29scy5jbXBfdG9fa2V5KG15Y21wKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWzQsIDMsIDIsIDEsIDBdKQorCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgZGVmIG15Y21wKHgsIHkpOgorICAgICAgICAgICAgcmV0dXJuIHkgLSB4CisgICAgICAgIGtleSA9IGZ1bmN0b29scy5jbXBfdG9fa2V5KG15Y21wKQorICAgICAgICBrID0ga2V5KDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2goaykpCisKK2NsYXNzIFRlc3RUb3RhbE9yZGVyaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3RvdGFsX29yZGVyaW5nX2x0KHNlbGYpOgorICAgICAgICBAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPCBvdGhlci52YWx1ZQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMSkgPCBBKDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA+IEEoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDEpIDw9IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID49IEEoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpIDw9IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID49IEEoMikpCisKKyAgICBkZWYgdGVzdF90b3RhbF9vcmRlcmluZ19sZShzZWxmKToKKyAgICAgICAgQGZ1bmN0b29scy50b3RhbF9vcmRlcmluZworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDw9IG90aGVyLnZhbHVlCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgxKSA8IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID4gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMSkgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgyKSkKKworICAgIGRlZiB0ZXN0X3RvdGFsX29yZGVyaW5nX2d0KHNlbGYpOgorICAgICAgICBAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPiBvdGhlci52YWx1ZQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMSkgPCBBKDIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgyKSA+IEEoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDEpIDw9IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID49IEEoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpIDw9IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID49IEEoMikpCisKKyAgICBkZWYgdGVzdF90b3RhbF9vcmRlcmluZ19nZShzZWxmKToKKyAgICAgICAgQGZ1bmN0b29scy50b3RhbF9vcmRlcmluZworICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2dlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlID49IG90aGVyLnZhbHVlCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgxKSA8IEEoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKDIpID4gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMSkgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPD0gQSgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoMikgPj0gQSgyKSkKKworICAgIGRlZiB0ZXN0X3RvdGFsX29yZGVyaW5nX25vX292ZXJ3cml0ZShzZWxmKToKKyAgICAgICAgIyBuZXcgbWV0aG9kcyBzaG91bGQgbm90IG92ZXJ3cml0ZSBleGlzdGluZworICAgICAgICBAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCisgICAgICAgIGNsYXNzIEEoc3RyKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoImEiKSA8IEEoImIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoImIiKSA+IEEoImEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoImEiKSA8PSBBKCJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShBKCJiIikgPj0gQSgiYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQSgiYiIpIDw9IEEoImIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEEoImIiKSA+PSBBKCJiIikpCisKKyAgICBkZWYgdGVzdF9ub19vcGVyYXRpb25zX2RlZmluZWQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBAZnVuY3Rvb2xzLnRvdGFsX29yZGVyaW5nCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2J1Z18xMDA0MihzZWxmKToKKyAgICAgICAgQGZ1bmN0b29scy50b3RhbF9vcmRlcmluZworICAgICAgICBjbGFzcyBUZXN0VE86CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVGVzdFRPKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUgPT0gb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFRlc3RUTyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDwgb3RoZXIudmFsdWUKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgVGVzdFRPKDgpIDw9ICgpCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X2NsYXNzZXMgPSAoCisgICAgICAgIFRlc3RQYXJ0aWFsLAorICAgICAgICBUZXN0UGFydGlhbFN1YmNsYXNzLAorICAgICAgICBUZXN0UHl0aG9uUGFydGlhbCwKKyAgICAgICAgVGVzdFVwZGF0ZVdyYXBwZXIsCisgICAgICAgIFRlc3RUb3RhbE9yZGVyaW5nLAorICAgICAgICBUZXN0V3JhcHMsCisgICAgICAgIFRlc3RSZWR1Y2UsCisgICAgKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jdG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmMwOGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdW5jdG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmMwOGZmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmOWM0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZS5weQpAQCAtMCwwICsxLDExOSBAQAorIyBUZXN0IHZhcmlvdXMgZmxhdm9ycyBvZiBsZWdhbCBhbmQgaWxsZWdhbCBmdXR1cmUgc3RhdGVtZW50cworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgcmUKKworcnggPSByZS5jb21waWxlKCdcKChcUyspLnB5LCBsaW5lIChcZCspJykKKworZGVmIGdldF9lcnJvcl9sb2NhdGlvbihtc2cpOgorICAgIG1vID0gcnguc2VhcmNoKHN0cihtc2cpKQorICAgIHJldHVybiBtby5ncm91cCgxLCAyKQorCitjbGFzcyBGdXR1cmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Z1dHVyZTEoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxvYWQoJ3Rlc3RfZnV0dXJlMScpCisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9mdXR1cmUxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9mdXR1cmUxLnJlc3VsdCwgNikKKworICAgIGRlZiB0ZXN0X2Z1dHVyZTIoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxvYWQoJ3Rlc3RfZnV0dXJlMicpCisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9mdXR1cmUyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9mdXR1cmUyLnJlc3VsdCwgNikKKworICAgIGRlZiB0ZXN0X2Z1dHVyZTMoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxvYWQoJ3Rlc3RfZnV0dXJlMycpCisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9mdXR1cmUzCisKKyAgICBkZWYgdGVzdF9iYWRmdXR1cmUzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IGJhZHN5bnRheF9mdXR1cmUzCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgbXNnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJyb3JfbG9jYXRpb24obXNnKSwgKCJiYWRzeW50YXhfZnV0dXJlMyIsICczJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBkaWRuJ3Qgb2NjdXIiKQorCisgICAgZGVmIHRlc3RfYmFkZnV0dXJlNChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBiYWRzeW50YXhfZnV0dXJlNAorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm9yX2xvY2F0aW9uKG1zZyksICgiYmFkc3ludGF4X2Z1dHVyZTQiLCAnMycpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24gZGlkbid0IG9jY3VyIikKKworICAgIGRlZiB0ZXN0X2JhZGZ1dHVyZTUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgYmFkc3ludGF4X2Z1dHVyZTUKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJvcl9sb2NhdGlvbihtc2cpLCAoImJhZHN5bnRheF9mdXR1cmU1IiwgJzQnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGRpZG4ndCBvY2N1ciIpCisKKyAgICBkZWYgdGVzdF9iYWRmdXR1cmU2KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IGJhZHN5bnRheF9mdXR1cmU2CisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgbXNnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJyb3JfbG9jYXRpb24obXNnKSwgKCJiYWRzeW50YXhfZnV0dXJlNiIsICczJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBkaWRuJ3Qgb2NjdXIiKQorCisgICAgZGVmIHRlc3RfYmFkZnV0dXJlNyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBiYWRzeW50YXhfZnV0dXJlNworICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm9yX2xvY2F0aW9uKG1zZyksICgiYmFkc3ludGF4X2Z1dHVyZTciLCAnMycpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBleGNlcHRpb24gZGlkbid0IG9jY3VyIikKKworICAgIGRlZiB0ZXN0X2JhZGZ1dHVyZTgoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgYmFkc3ludGF4X2Z1dHVyZTgKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJvcl9sb2NhdGlvbihtc2cpLCAoImJhZHN5bnRheF9mdXR1cmU4IiwgJzMnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIGRpZG4ndCBvY2N1ciIpCisKKyAgICBkZWYgdGVzdF9iYWRmdXR1cmU5KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IGJhZHN5bnRheF9mdXR1cmU5CisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgbXNnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJyb3JfbG9jYXRpb24obXNnKSwgKCJiYWRzeW50YXhfZnV0dXJlOSIsICczJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIGV4Y2VwdGlvbiBkaWRuJ3Qgb2NjdXIiKQorCisgICAgZGVmIHRlc3RfcGFyc2VyaGFjayhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoYXQgdGhlIHBhcnNlci5jOjpmdXR1cmVfaGFjayBmdW5jdGlvbiB3b3JrcyBhcyBleHBlY3RlZAorICAgICAgICAjIE5vdGU6IGFsdGhvdWdoIHRoaXMgdGVzdCBtdXN0IHBhc3MsIGl0J3Mgbm90IHRlc3RpbmcgdGhlIG9yaWdpbmFsCisgICAgICAgICMgICAgICAgYnVnIGFzIG9mIDIuNiBzaW5jZSB0aGUgd2l0aCBzdGF0ZW1lbnQgaXMgbm90IG9wdGlvbmFsIGFuZAorICAgICAgICAjICAgICAgIHRoZSBwYXJzZXIgaGFjayBkaXNhYmxlZC4gSWYgYSBuZXcga2V5d29yZCBpcyBpbnRyb2R1Y2VkIGluCisgICAgICAgICMgICAgICAgMi42LCBjaGFuZ2UgdGhpcyB0byByZWZlciB0byB0aGUgbmV3IGZ1dHVyZSBpbXBvcnQuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgImZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb247IHByaW50IDAiCisgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic3ludGF4IGVycm9yIGRpZG4ndCBvY2N1ciIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhlYyAiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAocHJpbnRfZnVuY3Rpb24pOyBwcmludCAwIgorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInN5bnRheCBlcnJvciBkaWRuJ3Qgb2NjdXIiKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfZmVhdHVyZXMoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxvYWQoInRlc3QudGVzdF9mdXR1cmU1IikKKyAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2Z1dHVyZTUKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfbGl0ZXJhbHNfZXhlYyhzZWxmKToKKyAgICAgICAgc2NvcGUgPSB7fQorICAgICAgICBleGVjICJmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHM7IHggPSAnJyIgaW4gc2NvcGUKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNjb3BlWyJ4Il0sIHVuaWNvZGUpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoRnV0dXJlVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYTI3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdiYTI3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3YzJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTEucHkKQEAgLTAsMCArMSwxMSBAQAorIiIiVGhpcyBpcyBhIHRlc3QiIiIKKworIyBJbXBvcnQgdGhlIG5hbWUgbmVzdGVkX3Njb3BlcyB0d2ljZSB0byB0cmlnZ2VyIFNGIGJ1ZyAjNDA3Mzk0IChyZWdyZXNzaW9uKS4KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcywgbmVzdGVkX3Njb3BlcworCitkZWYgZih4KToKKyAgICBkZWYgZyh5KToKKyAgICAgICAgcmV0dXJuIHggKyB5CisgICAgcmV0dXJuIGcKKworcmVzdWx0ID0gZigyKSg0KQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUxLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIwMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUxLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWIwMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllYjczMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHkKQEAgLTAsMCArMSwxMCBAQAorIiIiVGhpcyBpcyBhIHRlc3QiIiIKKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzOyBpbXBvcnQgc3RyaW5nCisKK2RlZiBmKHgpOgorICAgIGRlZiBnKHkpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZworCityZXN1bHQgPSBmKDIpKDQpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTM5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZTM5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIzNTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlMy5weQpAQCAtMCwwICsxLDMwIEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IG5lc3RlZF9zY29wZXMKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit4ID0gMgorZGVmIG5lc3RlcigpOgorICAgIHggPSAzCisgICAgZGVmIGlubmVyKCk6CisgICAgICAgIHJldHVybiB4CisgICAgcmV0dXJuIGlubmVyKCkKKworCitjbGFzcyBUZXN0RnV0dXJlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Zsb29yX2Rpdl9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3IC8vIDIsIDMpCisKKyAgICBkZWYgdGVzdF90cnVlX2Rpdl9hc19kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDcgLyAyLCAzLjUpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfc2NvcGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5lc3RlcigpLCAzKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0RnV0dXJlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NWI5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NWI5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmUzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2Y4YWRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNC5weQpAQCAtMCwwICsxLDQ3IEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBUZXN0RnV0dXJlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0VHlwZShzZWxmLCBvYmosIHR5cCk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKG9iaikgaXMgdHlwLAorICAgICAgICAgICAgInR5cGUoJXIpIGlzICVyLCBub3QgJXIiICUgKG9iaiwgdHlwZShvYmopLCB0eXApKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9zdHJpbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGUoIiIsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSgnJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHIiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHInJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKCIiIiAiIiIsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSgnJycgJycnLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUociIiIiAiIiIsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZShyJycnICcnJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHUiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHUnJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHVyIiIsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSh1cicnLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUodSIiIiAiIiIsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSh1JycnICcnJywgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHVyIiIiICIiIiwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKHVyJycnICcnJywgdW5pY29kZSkKKworICAgICAgICBzZWxmLmFzc2VydFR5cGUoYiIiLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZShiJycsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKGJyIiIsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKGJyJycsIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUeXBlKGIiIiIgIiIiLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZShiJycnICcnJywgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFR5cGUoYnIiIiIgIiIiLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZShicicnJyAnJycsIHN0cikKKworICAgICAgICBzZWxmLmFzc2VydFR5cGUoJycgJycsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSgnJyB1JycsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSh1JycgJycsIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZSh1JycgdScnLCB1bmljb2RlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0RnV0dXJlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDliNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMDliNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU1LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg0MDcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlNS5weQpAQCAtMCwwICsxLDIxIEBACisjIENoZWNrIHRoYXQgbXVsdGlwbGUgZmVhdHVyZXMgY2FuIGJlIGVuYWJsZWQuCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHVuaWNvZGVfbGl0ZXJhbHMsIHByaW50X2Z1bmN0aW9uCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSAuIGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBUZXN0TXVsdGlwbGVGZWF0dXJlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF91bmljb2RlX2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoIiIsIHVuaWNvZGUpCisKKyAgICBkZWYgdGVzdF9wcmludF9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBzOgorICAgICAgICAgICAgcHJpbnQoImZvbyIsIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICJmb29cbiIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdE11bHRpcGxlRmVhdHVyZXMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU1LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDg2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU1LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU1LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZTUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMDg2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmU1LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjMzc4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2Z1dHVyZV9idWlsdGlucy5weQpAQCAtMCwwICsxLDM4IEBACitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQsIHVuaXR0ZXN0CisKKyMgd2UncmUgdGVzdGluZyB0aGUgYmVoYXZpb3Igb2YgdGhlc2UgZnV0dXJlIGJ1aWx0aW5zOgorZnJvbSBmdXR1cmVfYnVpbHRpbnMgaW1wb3J0IGhleCwgb2N0LCBtYXAsIHppcCwgZmlsdGVyCisKK2NsYXNzIEJ1aWx0aW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9oZXgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KDApLCAnMHgwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoMTYpLCAnMHgxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KDE2TCksICcweDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoLTE2KSwgJy0weDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXgoLTE2TCksICctMHgxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGV4LCB7fSkKKworICAgIGRlZiB0ZXN0X29jdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvY3QoMCksICcwbzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgxMDApLCAnMG8xNDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgxMDBMKSwgJzBvMTQ0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvY3QoLTEwMCksICctMG8xNDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9jdCgtMTAwTCksICctMG8xNDQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9jdCwgKCkpCisKKyAgICBkZWYgdGVzdF9pdGVydG9vbHMoc2VsZik6CisgICAgICAgIGZyb20gaXRlcnRvb2xzIGltcG9ydCBpbWFwLCBpemlwLCBpZmlsdGVyCisgICAgICAgICMgV2Ugd2lsbCBhc3N1bWUgdGhhdCB0aGUgaXRlcnRvb2xzIGZ1bmN0aW9ucyB3b3JrLCBzbyBwcm92aWRlZAorICAgICAgICAjIHRoYXQgd2UndmUgZ290IGlkZW50aWNhbCBjb3BwaWVzLCB3ZSB3aWxsIHdvcmshCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwLCBpbWFwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCwgaXppcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIsIGlmaWx0ZXIpCisgICAgICAgICMgVGVzdGluZyB0aGF0IGZpbHRlcihOb25lLCBzdHVmZikgcmFpc2VzIGEgd2FybmluZyBsaXZlcyBpbgorICAgICAgICAjIHRlc3RfcHkza3dhcm4ucHkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJ1aWx0aW5UZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlX2J1aWx0aW5zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY3NWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlX2J1aWx0aW5zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9mdXR1cmVfYnVpbHRpbnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlX2J1aWx0aW5zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTY3NWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZnV0dXJlX2J1aWx0aW5zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nYy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2djLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODc0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nYy5weQpAQCAtMCwwICsxLDcwOCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBydW5fdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgZ2MKK2ltcG9ydCB3ZWFrcmVmCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQorCisjIyMgU3VwcG9ydCBjb2RlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgQnVnIDEwNTU4MjAgaGFzIHNldmVyYWwgdGVzdHMgb2YgbG9uZ3N0YW5kaW5nIGJ1Z3MgaW52b2x2aW5nIHdlYWtyZWZzIGFuZAorIyBjeWNsaWMgZ2MuCisKKyMgQW4gaW5zdGFuY2Ugb2YgQzEwNTU4MjAgaGFzIGEgc2VsZi1sb29wLCBzbyBiZWNvbWVzIGN5Y2xpYyB0cmFzaCB3aGVuCisjIHVucmVhY2hhYmxlLgorY2xhc3MgQzEwNTU4MjAob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaSk6CisgICAgICAgIHNlbGYuaSA9IGkKKyAgICAgICAgc2VsZi5sb29wID0gc2VsZgorCitjbGFzcyBHQ19EZXRlY3RvcihvYmplY3QpOgorICAgICMgQ3JlYXRlIGFuIGluc3RhbmNlIEkuICBUaGVuIGdjIGhhc24ndCBoYXBwZW5lZCBhZ2FpbiBzbyBsb25nIGFzCisgICAgIyBJLmdjX2hhcHBlbmVkIGlzIGZhbHNlLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmdjX2hhcHBlbmVkID0gRmFsc2UKKworICAgICAgICBkZWYgaXRfaGFwcGVuZWQoaWdub3JlZCk6CisgICAgICAgICAgICBzZWxmLmdjX2hhcHBlbmVkID0gVHJ1ZQorCisgICAgICAgICMgQ3JlYXRlIGEgcGllY2Ugb2YgY3ljbGljIHRyYXNoIHRoYXQgdHJpZ2dlcnMgaXRfaGFwcGVuZWQgd2hlbgorICAgICAgICAjIGdjIGNvbGxlY3RzIGl0LgorICAgICAgICBzZWxmLndyID0gd2Vha3JlZi5yZWYoQzEwNTU4MjAoNjY2KSwgaXRfaGFwcGVuZWQpCisKKworIyMjIFRlc3RzCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2NsYXNzIEdDVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2xpc3Qoc2VsZik6CisgICAgICAgIGwgPSBbXQorICAgICAgICBsLmFwcGVuZChsKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIGwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnYy5jb2xsZWN0KCksIDEpCisKKyAgICBkZWYgdGVzdF9kaWN0KHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgZFsxXSA9IGQKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCAxKQorCisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZik6CisgICAgICAgICMgc2luY2UgdHVwbGVzIGFyZSBpbW11dGFibGUgd2UgY2xvc2UgdGhlIGxvb3Agd2l0aCBhIGxpc3QKKyAgICAgICAgbCA9IFtdCisgICAgICAgIHQgPSAobCwpCisgICAgICAgIGwuYXBwZW5kKHQpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBkZWwgdAorICAgICAgICBkZWwgbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmNvbGxlY3QoKSwgMikKKworICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgcGFzcworICAgICAgICBBLmEgPSBBCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBkZWwgQQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGdjLmNvbGxlY3QoKSwgMCkKKworICAgIGRlZiB0ZXN0X25ld3N0eWxlY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBBCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorCisgICAgZGVmIHRlc3RfaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5hID0gYQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIGEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChnYy5jb2xsZWN0KCksIDApCisKKyAgICBkZWYgdGVzdF9uZXdpbnN0YW5jZShzZWxmKToKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gQSgpCisgICAgICAgIGEuYSA9IGEKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBhCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorICAgICAgICBjbGFzcyBCKGxpc3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBDKEIsIEEpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gQygpCisgICAgICAgIGEuYSA9IGEKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBhCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorICAgICAgICBkZWwgQiwgQworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGdjLmNvbGxlY3QoKSwgMCkKKyAgICAgICAgQS5hID0gQSgpCisgICAgICAgIGRlbCBBCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmNvbGxlY3QoKSwgMCkKKworICAgIGRlZiB0ZXN0X21ldGhvZChzZWxmKToKKyAgICAgICAgIyBUcmlja3k6IHNlbGYuX19pbml0X18gaXMgYSBib3VuZCBtZXRob2QsIGl0IHJlZmVyZW5jZXMgdGhlIGluc3RhbmNlLgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuaW5pdCA9IHNlbGYuX19pbml0X18KKyAgICAgICAgYSA9IEEoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZGVsIGEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChnYy5jb2xsZWN0KCksIDApCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZXIoc2VsZik6CisgICAgICAgICMgQSgpIGlzIHVuY29sbGVjdGFibGUgaWYgaXQgaXMgcGFydCBvZiBhIGN5Y2xlLCBtYWtlIHN1cmUgaXQgc2hvd3MgdXAKKyAgICAgICAgIyBpbiBnYy5nYXJiYWdlLgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6IHBhc3MKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgYSA9IEEoKQorICAgICAgICBhLmEgPSBhCisgICAgICAgIGlkX2EgPSBpZChhKQorICAgICAgICBiID0gQigpCisgICAgICAgIGIuYiA9IGIKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlbCBhCisgICAgICAgIGRlbCBiCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZ2MuY29sbGVjdCgpLCAwKQorICAgICAgICBmb3Igb2JqIGluIGdjLmdhcmJhZ2U6CisgICAgICAgICAgICBpZiBpZChvYmopID09IGlkX2E6CisgICAgICAgICAgICAgICAgZGVsIG9iai5hCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkbid0IGZpbmQgb2JqIGluIGdhcmJhZ2UgKGZpbmFsaXplcikiKQorICAgICAgICBnYy5nYXJiYWdlLnJlbW92ZShvYmopCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZXJfbmV3Y2xhc3Moc2VsZik6CisgICAgICAgICMgQSgpIGlzIHVuY29sbGVjdGFibGUgaWYgaXQgaXMgcGFydCBvZiBhIGN5Y2xlLCBtYWtlIHN1cmUgaXQgc2hvd3MgdXAKKyAgICAgICAgIyBpbiBnYy5nYXJiYWdlLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKTogcGFzcworICAgICAgICBjbGFzcyBCKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGEgPSBBKCkKKyAgICAgICAgYS5hID0gYQorICAgICAgICBpZF9hID0gaWQoYSkKKyAgICAgICAgYiA9IEIoKQorICAgICAgICBiLmIgPSBiCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBkZWwgYQorICAgICAgICBkZWwgYgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGdjLmNvbGxlY3QoKSwgMCkKKyAgICAgICAgZm9yIG9iaiBpbiBnYy5nYXJiYWdlOgorICAgICAgICAgICAgaWYgaWQob2JqKSA9PSBpZF9hOgorICAgICAgICAgICAgICAgIGRlbCBvYmouYQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZG4ndCBmaW5kIG9iaiBpbiBnYXJiYWdlIChmaW5hbGl6ZXIpIikKKyAgICAgICAgZ2MuZ2FyYmFnZS5yZW1vdmUob2JqKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb24oc2VsZik6CisgICAgICAgICMgVHJpY2t5OiBmIC0+IGQgLT4gZiwgY29kZSBzaG91bGQgY2FsbCBkLmNsZWFyKCkgYWZ0ZXIgdGhlIGV4ZWMgdG8KKyAgICAgICAgIyBicmVhayB0aGUgY3ljbGUuCisgICAgICAgIGQgPSB7fQorICAgICAgICBleGVjKCJkZWYgZigpOiBwYXNzXG4iKSBpbiBkCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBkZWwgZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmNvbGxlY3QoKSwgMikKKworICAgIGRlZiB0ZXN0X2ZyYW1lKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGYoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmNvbGxlY3QoKSwgMSkKKworICAgIGRlZiB0ZXN0X3NhdmVhbGwoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgY3ljbGljIGdhcmJhZ2UgbGlrZSBsaXN0cyBzaG93IHVwIGluIGdjLmdhcmJhZ2UgaWYgdGhlCisgICAgICAgICMgU0FWRUFMTCBvcHRpb24gaXMgZW5hYmxlZC4KKworICAgICAgICAjIEZpcnN0IG1ha2Ugc3VyZSB3ZSBkb24ndCBzYXZlIGF3YXkgb3RoZXIgc3R1ZmYgdGhhdCBqdXN0IGhhcHBlbnMgdG8KKyAgICAgICAgIyBiZSB3YWl0aW5nIGZvciBjb2xsZWN0aW9uLgorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgIyBpZiB0aGlzIGZhaWxzLCBzb21lb25lIGVsc2UgY3JlYXRlZCBpbW1vcnRhbCB0cmFzaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdhcmJhZ2UsIFtdKQorCisgICAgICAgIEwgPSBbXQorICAgICAgICBMLmFwcGVuZChMKQorICAgICAgICBpZF9MID0gaWQoTCkKKworICAgICAgICBkZWJ1ZyA9IGdjLmdldF9kZWJ1ZygpCisgICAgICAgIGdjLnNldF9kZWJ1ZyhkZWJ1ZyB8IGdjLkRFQlVHX1NBVkVBTEwpCisgICAgICAgIGRlbCBMCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBnYy5zZXRfZGVidWcoZGVidWcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2MuZ2FyYmFnZSksIDEpCisgICAgICAgIG9iaiA9IGdjLmdhcmJhZ2UucG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChvYmopLCBpZF9MKQorCisgICAgZGVmIHRlc3RfZGVsKHNlbGYpOgorICAgICAgICAjIF9fZGVsX18gbWV0aG9kcyBjYW4gdHJpZ2dlciBjb2xsZWN0aW9uLCBtYWtlIHRoaXMgdG8gaGFwcGVuCisgICAgICAgIHRocmVzaG9sZHMgPSBnYy5nZXRfdGhyZXNob2xkKCkKKyAgICAgICAgZ2MuZW5hYmxlKCkKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCgxKQorCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBkaXIoc2VsZikKKyAgICAgICAgYSA9IEEoKQorICAgICAgICBkZWwgYQorCisgICAgICAgIGdjLmRpc2FibGUoKQorICAgICAgICBnYy5zZXRfdGhyZXNob2xkKCp0aHJlc2hvbGRzKQorCisgICAgZGVmIHRlc3RfZGVsX25ld2NsYXNzKHNlbGYpOgorICAgICAgICAjIF9fZGVsX18gbWV0aG9kcyBjYW4gdHJpZ2dlciBjb2xsZWN0aW9uLCBtYWtlIHRoaXMgdG8gaGFwcGVuCisgICAgICAgIHRocmVzaG9sZHMgPSBnYy5nZXRfdGhyZXNob2xkKCkKKyAgICAgICAgZ2MuZW5hYmxlKCkKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCgxKQorCisgICAgICAgIGNsYXNzIEEob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGRpcihzZWxmKQorICAgICAgICBhID0gQSgpCisgICAgICAgIGRlbCBhCisKKyAgICAgICAgZ2MuZGlzYWJsZSgpCisgICAgICAgIGdjLnNldF90aHJlc2hvbGQoKnRocmVzaG9sZHMpCisKKyAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGFyZSBmcmFnaWxlOgorICAgICMgVGhleSBwcmVjaXNlbHkgY291bnQgdGhlIG51bWJlciBvZiBhbGxvY2F0aW9ucywKKyAgICAjIHdoaWNoIGlzIGhpZ2hseSBpbXBsZW1lbnRhdGlvbi1kZXBlbmRlbnQuCisgICAgIyBGb3IgZXhhbXBsZToKKyAgICAjIC0gZGlzcG9zZWQgdHVwbGVzIGFyZSBub3QgZnJlZWQsIGJ1dCByZXVzZWQKKyAgICAjIC0gdGhlIGNhbGwgdG8gYXNzZXJ0RXF1YWwgc29tZWhvdyBhdm9pZHMgYnVpbGRpbmcgaXRzIGFyZ3MgdHVwbGUKKyAgICBkZWYgdGVzdF9nZXRfY291bnQoc2VsZik6CisgICAgICAgICMgQXZvaWQgZnV0dXJlIGFsbG9jYXRpb24gb2YgbWV0aG9kIG9iamVjdAorICAgICAgICBhc3NlcnRFcXVhbCA9IHNlbGYuX2Jhc2VBc3NlcnRFcXVhbAorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgYXNzZXJ0RXF1YWwoZ2MuZ2V0X2NvdW50KCksICgwLCAwLCAwKSkKKyAgICAgICAgYSA9IGRpY3QoKQorICAgICAgICAjIHNpbmNlIGdjLmNvbGxlY3QoKSwgd2UgY3JlYXRlZCB0d28gb2JqZWN0czoKKyAgICAgICAgIyB0aGUgZGljdCwgYW5kIHRoZSB0dXBsZSByZXR1cm5lZCBieSBnZXRfY291bnQoKQorICAgICAgICBhc3NlcnRFcXVhbChnYy5nZXRfY291bnQoKSwgKDIsIDAsIDApKQorCisgICAgZGVmIHRlc3RfY29sbGVjdF9nZW5lcmF0aW9ucyhzZWxmKToKKyAgICAgICAgIyBBdm9pZCBmdXR1cmUgYWxsb2NhdGlvbiBvZiBtZXRob2Qgb2JqZWN0CisgICAgICAgIGFzc2VydEVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgYSA9IGRpY3QoKQorICAgICAgICBnYy5jb2xsZWN0KDApCisgICAgICAgIGFzc2VydEVxdWFsKGdjLmdldF9jb3VudCgpLCAoMCwgMSwgMCkpCisgICAgICAgIGdjLmNvbGxlY3QoMSkKKyAgICAgICAgYXNzZXJ0RXF1YWwoZ2MuZ2V0X2NvdW50KCksICgwLCAwLCAxKSkKKyAgICAgICAgZ2MuY29sbGVjdCgyKQorICAgICAgICBhc3NlcnRFcXVhbChnYy5nZXRfY291bnQoKSwgKDAsIDAsIDApKQorCisgICAgZGVmIHRlc3RfdHJhc2hjYW4oc2VsZik6CisgICAgICAgIGNsYXNzIE91Y2g6CisgICAgICAgICAgICBuID0gMAorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgT3VjaC5uID0gT3VjaC5uICsgMQorICAgICAgICAgICAgICAgIGlmIE91Y2gubiAlIDE3ID09IDA6CisgICAgICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgICAgICMgInRyYXNoY2FuIiBpcyBhIGhhY2sgdG8gcHJldmVudCBzdGFjayBvdmVyZmxvdyB3aGVuIGRlYWxsb2NhdGluZworICAgICAgICAjIHZlcnkgZGVlcGx5IG5lc3RlZCB0dXBsZXMgZXRjLiAgSXQgd29ya3MgaW4gcGFydCBieSBhYnVzaW5nIHRoZQorICAgICAgICAjIHR5cGUgcG9pbnRlciBhbmQgcmVmY291bnQgZmllbGRzLCBhbmQgdGhhdCBjYW4geWllbGQgaG9ycmlibGUKKyAgICAgICAgIyBwcm9ibGVtcyB3aGVuIGdjIHRyaWVzIHRvIHRyYXZlcnNlIHRoZSBzdHJ1Y3R1cmVzLgorICAgICAgICAjIElmIHRoaXMgdGVzdCBmYWlscyAoYXMgaXQgZG9lcyBpbiAyLjAsIDIuMSBhbmQgMi4yKSwgaXQgd2lsbAorICAgICAgICAjIG1vc3QgbGlrZWx5IGRpZSB2aWEgc2VnZmF1bHQuCisKKyAgICAgICAgIyBOb3RlOiAgSW4gMi4zIHRoZSBwb3NzaWJpbGl0eSBmb3IgY29tcGlsaW5nIHdpdGhvdXQgY3ljbGljIGdjIHdhcworICAgICAgICAjIHJlbW92ZWQsIGFuZCB0aGF0IGluIHR1cm4gYWxsb3dzIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20gdG8gd29yaworICAgICAgICAjIHZpYSBtdWNoIHNpbXBsZXIgbWVhbnMgKGUuZy4sIGl0IG5ldmVyIGFidXNlcyB0aGUgdHlwZSBwb2ludGVyIG9yCisgICAgICAgICMgcmVmY291bnQgZmllbGRzIGFueW1vcmUpLiAgU2luY2UgaXQncyBtdWNoIGxlc3MgbGlrZWx5IHRvIGNhdXNlIGEKKyAgICAgICAgIyBwcm9ibGVtIG5vdywgdGhlIHZhcmlvdXMgY29uc3RhbnRzIGluIHRoaXMgZXhwZW5zaXZlICh3ZSBmb3JjZSBhIGxvdAorICAgICAgICAjIG9mIGZ1bGwgY29sbGVjdGlvbnMpIHRlc3QgYXJlIGN1dCBiYWNrIGZyb20gdGhlIDIuMiB2ZXJzaW9uLgorICAgICAgICBnYy5lbmFibGUoKQorICAgICAgICBOID0gMTUwCisgICAgICAgIGZvciBjb3VudCBpbiByYW5nZSgyKToKKyAgICAgICAgICAgIHQgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTik6CisgICAgICAgICAgICAgICAgdCA9IFt0LCBPdWNoKCldCisgICAgICAgICAgICB1ID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgICAgIHUgPSBbdSwgT3VjaCgpXQorICAgICAgICAgICAgdiA9IHt9CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShOKToKKyAgICAgICAgICAgICAgICB2ID0gezE6IHYsIDI6IE91Y2goKX0KKyAgICAgICAgZ2MuZGlzYWJsZSgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICJ0ZXN0IG1lYW5pbmdsZXNzIG9uIGJ1aWxkcyB3aXRob3V0IHRocmVhZHMiKQorICAgIGRlZiB0ZXN0X3RyYXNoY2FuX3RocmVhZHMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzOTkyOiB0cmFzaGNhbiBtZWNoYW5pc20gc2hvdWxkIGJlIHRocmVhZC1zYWZlCisgICAgICAgIE5FU1RJTkcgPSA2MAorICAgICAgICBOX1RIUkVBRFMgPSAyCisKKyAgICAgICAgZGVmIHNsZWVwZXJfZ2VuKCk6CisgICAgICAgICAgICAiIiJBIGdlbmVyYXRvciB0aGF0IHJlbGVhc2VzIHRoZSBHSUwgd2hlbiBjbG9zZWQgb3IgZGVhbGxvYydlZC4iIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB5aWVsZAorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDAwMDAxKQorCisgICAgICAgIGNsYXNzIEMobGlzdCk6CisgICAgICAgICAgICAjIEFwcGVuZGluZyB0byBhIGxpc3QgaXMgYXRvbWljLCB3aGljaCBhdm9pZHMgdGhlIHVzZSBvZiBhIGxvY2suCisgICAgICAgICAgICBpbml0cyA9IFtdCisgICAgICAgICAgICBkZWxzID0gW10KKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhbGlzdCk6CisgICAgICAgICAgICAgICAgc2VsZls6XSA9IGFsaXN0CisgICAgICAgICAgICAgICAgQy5pbml0cy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICMgVGhpcyBfX2RlbF9fIGlzIGNhbGxlZCBieSBzdWJ0eXBlX2RlYWxsb2MoKS4KKyAgICAgICAgICAgICAgICBDLmRlbHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICAgICAgIyBgZ2Agd2lsbCByZWxlYXNlIHRoZSBHSUwgd2hlbiBnYXJiYWdlLWNvbGxlY3RlZC4gIFRoaXMKKyAgICAgICAgICAgICAgICAjIGhlbHBzIGFzc2VydCBzdWJ0eXBlX2RlYWxsb2MncyBiZWhhdmlvdXIgd2hlbiB0aHJlYWRzCisgICAgICAgICAgICAgICAgIyBzd2l0Y2ggaW4gdGhlIG1pZGRsZSBvZiBpdC4KKyAgICAgICAgICAgICAgICBnID0gc2xlZXBlcl9nZW4oKQorICAgICAgICAgICAgICAgIG5leHQoZykKKyAgICAgICAgICAgICAgICAjIE5vdyB0aGF0IF9fZGVsX18gaXMgZmluaXNoZWQsIHN1YnR5cGVfZGVhbGxvYyB3aWxsIHByb2NlZWQKKyAgICAgICAgICAgICAgICAjIHRvIGNhbGwgbGlzdF9kZWFsbG9jLCB3aGljaCBhbHNvIHVzZXMgdGhlIHRyYXNoY2FuIG1lY2hhbmlzbS4KKworICAgICAgICBkZWYgbWFrZV9uZXN0ZWQoKToKKyAgICAgICAgICAgICIiIkNyZWF0ZSBhIHN1ZmZpY2llbnRseSBuZXN0ZWQgY29udGFpbmVyIG9iamVjdCBzbyB0aGF0IHRoZQorICAgICAgICAgICAgdHJhc2hjYW4gbWVjaGFuaXNtIGlzIGludm9rZWQgd2hlbiBkZWFsbG9jYXRpbmcgaXQuIiIiCisgICAgICAgICAgICB4ID0gQyhbXSkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKE5FU1RJTkcpOgorICAgICAgICAgICAgICAgIHggPSBbQyhbeF0pXQorICAgICAgICAgICAgZGVsIHgKKworICAgICAgICBkZWYgcnVuX3RocmVhZCgpOgorICAgICAgICAgICAgIiIiRXhlcmNpc2UgbWFrZV9uZXN0ZWQoKSBpbiBhIGxvb3AuIiIiCisgICAgICAgICAgICB3aGlsZSBub3QgZXhpdDoKKyAgICAgICAgICAgICAgICBtYWtlX25lc3RlZCgpCisKKyAgICAgICAgb2xkX2NoZWNraW50ZXJ2YWwgPSBzeXMuZ2V0Y2hlY2tpbnRlcnZhbCgpCisgICAgICAgIHN5cy5zZXRjaGVja2ludGVydmFsKDMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4aXQgPSBGYWxzZQorICAgICAgICAgICAgdGhyZWFkcyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShOX1RIUkVBRFMpOgorICAgICAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW5fdGhyZWFkKQorICAgICAgICAgICAgICAgIHRocmVhZHMuYXBwZW5kKHQpCisgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgdGltZS5zbGVlcCgxLjApCisgICAgICAgICAgICBleGl0ID0gVHJ1ZQorICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnNldGNoZWNraW50ZXJ2YWwob2xkX2NoZWNraW50ZXJ2YWwpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihDLmluaXRzKSwgbGVuKEMuZGVscykpCisKKyAgICBkZWYgdGVzdF9ib29tKHNlbGYpOgorICAgICAgICBjbGFzcyBCb29tOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIHNvbWVhdHRyaWJ1dGUpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF0dHIKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgorCisgICAgICAgIGEgPSBCb29tKCkKKyAgICAgICAgYiA9IEJvb20oKQorICAgICAgICBhLmF0dHIgPSBiCisgICAgICAgIGIuYXR0ciA9IGEKKworICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZ2FyYmFnZWxlbiA9IGxlbihnYy5nYXJiYWdlKQorICAgICAgICBkZWwgYSwgYgorICAgICAgICAjIGE8LT5iIGFyZSBpbiBhIHRyYXNoIGN5Y2xlIG5vdy4gIENvbGxlY3Rpb24gd2lsbCBpbnZva2UKKyAgICAgICAgIyBCb29tLl9fZ2V0YXR0cl9fICh0byBzZWUgd2hldGhlciBhIGFuZCBiIGhhdmUgX19kZWxfXyBtZXRob2RzKSwgYW5kCisgICAgICAgICMgX19nZXRhdHRyX18gZGVsZXRlcyB0aGUgaW50ZXJuYWwgImF0dHIiIGF0dHJpYnV0ZXMgYXMgYSBzaWRlIGVmZmVjdC4KKyAgICAgICAgIyBUaGF0IGNhdXNlcyB0aGUgdHJhc2ggY3ljbGUgdG8gZ2V0IHJlY2xhaW1lZCB2aWEgcmVmY291bnRzIGZhbGxpbmcgdG8KKyAgICAgICAgIyAwLCB0aHVzIG11dGF0aW5nIHRoZSB0cmFzaCBncmFwaCBhcyBhIHNpZGUgZWZmZWN0IG9mIG1lcmVseSBhc2tpbmcKKyAgICAgICAgIyB3aGV0aGVyIF9fZGVsX18gZXhpc3RzLiAgVGhpcyB1c2VkIHRvIChiZWZvcmUgMi4zYjEpIGNyYXNoIFB5dGhvbi4KKyAgICAgICAgIyBOb3cgX19nZXRhdHRyX18gaXNuJ3QgY2FsbGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmNvbGxlY3QoKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2MuZ2FyYmFnZSksIGdhcmJhZ2VsZW4pCisKKyAgICBkZWYgdGVzdF9ib29tMihzZWxmKToKKyAgICAgICAgY2xhc3MgQm9vbTI6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi54ID0gMAorCisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgc29tZWF0dHJpYnV0ZSk6CisgICAgICAgICAgICAgICAgc2VsZi54ICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnggPiAxOgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5hdHRyCisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKKworICAgICAgICBhID0gQm9vbTIoKQorICAgICAgICBiID0gQm9vbTIoKQorICAgICAgICBhLmF0dHIgPSBiCisgICAgICAgIGIuYXR0ciA9IGEKKworICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZ2FyYmFnZWxlbiA9IGxlbihnYy5nYXJiYWdlKQorICAgICAgICBkZWwgYSwgYgorICAgICAgICAjIE11Y2ggbGlrZSB0ZXN0X2Jvb20oKSwgZXhjZXB0IHRoYXQgX19nZXRhdHRyX18gZG9lc24ndCBicmVhayB0aGUKKyAgICAgICAgIyBjeWNsZSB1bnRpbCB0aGUgc2Vjb25kIHRpbWUgZ2MgY2hlY2tzIGZvciBfX2RlbF9fLiAgQXMgb2YgMi4zYjEsCisgICAgICAgICMgdGhlcmUgaXNuJ3QgYSBzZWNvbmQgdGltZSwgc28gdGhpcyBzaW1wbHkgY2xlYW5zIHVwIHRoZSB0cmFzaCBjeWNsZS4KKyAgICAgICAgIyBXZSBleHBlY3QgYSwgYiwgYS5fX2RpY3RfXyBhbmQgYi5fX2RpY3RfXyAoNCBvYmplY3RzKSB0byBnZXQKKyAgICAgICAgIyByZWNsYWltZWQgdGhpcyB3YXkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnYy5nYXJiYWdlKSwgZ2FyYmFnZWxlbikKKworICAgIGRlZiB0ZXN0X2Jvb21fbmV3KHNlbGYpOgorICAgICAgICAjIGJvb21fX25ldyBhbmQgYm9vbTJfbmV3IGFyZSBleGFjdGx5IGxpa2UgYm9vbSBhbmQgYm9vbTIsIGV4Y2VwdCB1c2UKKyAgICAgICAgIyBuZXctc3R5bGUgY2xhc3Nlcy4KKworICAgICAgICBjbGFzcyBCb29tX05ldyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIHNvbWVhdHRyaWJ1dGUpOgorICAgICAgICAgICAgICAgIGRlbCBzZWxmLmF0dHIKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgorCisgICAgICAgIGEgPSBCb29tX05ldygpCisgICAgICAgIGIgPSBCb29tX05ldygpCisgICAgICAgIGEuYXR0ciA9IGIKKyAgICAgICAgYi5hdHRyID0gYQorCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBnYXJiYWdlbGVuID0gbGVuKGdjLmdhcmJhZ2UpCisgICAgICAgIGRlbCBhLCBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnYy5nYXJiYWdlKSwgZ2FyYmFnZWxlbikKKworICAgIGRlZiB0ZXN0X2Jvb20yX25ldyhzZWxmKToKKyAgICAgICAgY2xhc3MgQm9vbTJfTmV3KG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi54ID0gMAorCisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgc29tZWF0dHJpYnV0ZSk6CisgICAgICAgICAgICAgICAgc2VsZi54ICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnggPiAxOgorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5hdHRyCisgICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IKKworICAgICAgICBhID0gQm9vbTJfTmV3KCkKKyAgICAgICAgYiA9IEJvb20yX05ldygpCisgICAgICAgIGEuYXR0ciA9IGIKKyAgICAgICAgYi5hdHRyID0gYQorCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBnYXJiYWdlbGVuID0gbGVuKGdjLmdhcmJhZ2UpCisgICAgICAgIGRlbCBhLCBiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2MuY29sbGVjdCgpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihnYy5nYXJiYWdlKSwgZ2FyYmFnZWxlbikKKworICAgIGRlZiB0ZXN0X2dldF9yZWZlcmVudHMoc2VsZik6CisgICAgICAgIGFsaXN0ID0gWzEsIDMsIDVdCisgICAgICAgIGdvdCA9IGdjLmdldF9yZWZlcmVudHMoYWxpc3QpCisgICAgICAgIGdvdC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGFsaXN0KQorCisgICAgICAgIGF0dXBsZSA9IHR1cGxlKGFsaXN0KQorICAgICAgICBnb3QgPSBnYy5nZXRfcmVmZXJlbnRzKGF0dXBsZSkKKyAgICAgICAgZ290LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgYWxpc3QpCisKKyAgICAgICAgYWRpY3QgPSB7MTogMywgNTogN30KKyAgICAgICAgZXhwZWN0ZWQgPSBbMSwgMywgNSwgN10KKyAgICAgICAgZ290ID0gZ2MuZ2V0X3JlZmVyZW50cyhhZGljdCkKKyAgICAgICAgZ290LnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgZ290ID0gZ2MuZ2V0X3JlZmVyZW50cyhbMSwgMl0sIHszOiA0fSwgKDAsIDAsIDApKQorICAgICAgICBnb3Quc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBbMCwgMF0gKyByYW5nZSg1KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdjLmdldF9yZWZlcmVudHMoMSwgJ2EnLCA0aiksIFtdKQorCisgICAgZGVmIHRlc3RfaXNfdHJhY2tlZChzZWxmKToKKyAgICAgICAgIyBBdG9taWMgYnVpbHQtaW4gdHlwZXMgYXJlIG5vdCB0cmFja2VkLCB1c2VyLWRlZmluZWQgb2JqZWN0cyBhbmQKKyAgICAgICAgIyBtdXRhYmxlIGNvbnRhaW5lcnMgYXJlLgorICAgICAgICAjIE5PVEU6IHR5cGVzIHdpdGggc3BlY2lhbCBvcHRpbWl6YXRpb25zIChlLmcuIHR1cGxlKSBoYXZlIHRlc3RzCisgICAgICAgICMgaW4gdGhlaXIgb3duIHRlc3QgZmlsZXMgaW5zdGVhZC4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2MuaXNfdHJhY2tlZCgxLjApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQoMS4wICsgNS4waikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2MuaXNfdHJhY2tlZChUcnVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKEZhbHNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKCJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2MuaXNfdHJhY2tlZCh1ImEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKGJ5dGVhcnJheSgiYSIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKHR5cGUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdjLmlzX3RyYWNrZWQoaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKG9iamVjdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2MuaXNfdHJhY2tlZChvYmplY3QoKSkpCisKKyAgICAgICAgY2xhc3MgT2xkU3R5bGU6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE5ld1N0eWxlKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnYy5pc190cmFja2VkKGdjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjLmlzX3RyYWNrZWQoT2xkU3R5bGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZChPbGRTdHlsZSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjLmlzX3RyYWNrZWQoTmV3U3R5bGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZChOZXdTdHlsZSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjLmlzX3RyYWNrZWQoW10pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZChzZXQoKSkpCisKKyAgICBkZWYgdGVzdF9idWcxMDU1ODIwYihzZWxmKToKKyAgICAgICAgIyBDb3JyZXNwb25kcyB0byB0ZW1wMmIucHkgaW4gdGhlIGJ1ZyByZXBvcnQuCisKKyAgICAgICAgb3VjaCA9IFtdCisgICAgICAgIGRlZiBjYWxsYmFjayhpZ25vcmVkKToKKyAgICAgICAgICAgIG91Y2hbOl0gPSBbd3IoKSBmb3Igd3IgaW4gV1JzXQorCisgICAgICAgIENzID0gW0MxMDU1ODIwKGkpIGZvciBpIGluIHJhbmdlKDIpXQorICAgICAgICBXUnMgPSBbd2Vha3JlZi5yZWYoYywgY2FsbGJhY2spIGZvciBjIGluIENzXQorICAgICAgICBjID0gTm9uZQorCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvdWNoKSwgMCkKKyAgICAgICAgIyBNYWtlIHRoZSB0d28gaW5zdGFuY2VzIHRyYXNoLCBhbmQgY29sbGVjdCBhZ2Fpbi4gIFRoZSBidWcgd2FzIHRoYXQKKyAgICAgICAgIyB0aGUgY2FsbGJhY2sgbWF0ZXJpYWxpemVkIGEgc3Ryb25nIHJlZmVyZW5jZSB0byBhbiBpbnN0YW5jZSwgYnV0IGdjCisgICAgICAgICMgY2xlYXJlZCB0aGUgaW5zdGFuY2UncyBkaWN0IGFueXdheS4KKyAgICAgICAgQ3MgPSBOb25lCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvdWNoKSwgMikgICMgZWxzZSB0aGUgY2FsbGJhY2tzIGRpZG4ndCBydW4KKyAgICAgICAgZm9yIHggaW4gb3VjaDoKKyAgICAgICAgICAgICMgSWYgdGhlIGNhbGxiYWNrIHJlc3VycmVjdGVkIG9uZSBvZiB0aGVzZSBndXlzLCB0aGUgaW5zdGFuY2UKKyAgICAgICAgICAgICMgd291bGQgYmUgZGFtYWdlZCwgd2l0aCBhbiBlbXB0eSBfX2RpY3RfXy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgTm9uZSkKKworY2xhc3MgR0NUb2dnbGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGdjLmVuYWJsZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGdjLmRpc2FibGUoKQorCisgICAgZGVmIHRlc3RfYnVnMTA1NTgyMGMoc2VsZik6CisgICAgICAgICMgQ29ycmVzcG9uZHMgdG8gdGVtcDJjLnB5IGluIHRoZSBidWcgcmVwb3J0LiAgVGhpcyBpcyBwcmV0dHkKKyAgICAgICAgIyBlbGFib3JhdGUuCisKKyAgICAgICAgYzAgPSBDMTA1NTgyMCgwKQorICAgICAgICAjIE1vdmUgYzAgaW50byBnZW5lcmF0aW9uIDIuCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgICAgIGMxID0gQzEwNTU4MjAoMSkKKyAgICAgICAgYzEua2VlcF9jMF9hbGl2ZSA9IGMwCisgICAgICAgIGRlbCBjMC5sb29wICMgbm93IG9ubHkgYzEga2VlcHMgYzAgYWxpdmUKKworICAgICAgICBjMiA9IEMxMDU1ODIwKDIpCisgICAgICAgIGMyd3IgPSB3ZWFrcmVmLnJlZihjMikgIyBubyBjYWxsYmFjayEKKworICAgICAgICBvdWNoID0gW10KKyAgICAgICAgZGVmIGNhbGxiYWNrKGlnbm9yZWQpOgorICAgICAgICAgICAgb3VjaFs6XSA9IFtjMndyKCldCisKKyAgICAgICAgIyBUaGUgY2FsbGJhY2sgZ2V0cyBhc3NvY2lhdGVkIHdpdGggYSB3ciBvbiBhbiBvYmplY3QgaW4gZ2VuZXJhdGlvbiAyLgorICAgICAgICBjMHdyID0gd2Vha3JlZi5yZWYoYzAsIGNhbGxiYWNrKQorCisgICAgICAgIGMwID0gYzEgPSBjMiA9IE5vbmUKKworICAgICAgICAjIFdoYXQgd2UndmUgc2V0IHVwOiAgYzAsIGMxLCBhbmQgYzIgYXJlIGFsbCB0cmFzaCBub3cuICBjMCBpcyBpbgorICAgICAgICAjIGdlbmVyYXRpb24gMi4gIFRoZSBvbmx5IHRoaW5nIGtlZXBpbmcgaXQgYWxpdmUgaXMgdGhhdCBjMSBwb2ludHMgdG8KKyAgICAgICAgIyBpdC4gYzEgYW5kIGMyIGFyZSBpbiBnZW5lcmF0aW9uIDAsIGFuZCBhcmUgaW4gc2VsZi1sb29wcy4gIFRoZXJlJ3MgYQorICAgICAgICAjIGdsb2JhbCB3ZWFrcmVmIHRvIGMyIChjMndyKSwgYnV0IHRoYXQgd2Vha3JlZiBoYXMgbm8gY2FsbGJhY2suCisgICAgICAgICMgVGhlcmUncyBhbHNvIGEgZ2xvYmFsIHdlYWtyZWYgdG8gYzAgKGMwd3IpLCBhbmQgdGhhdCBkb2VzIGhhdmUgYQorICAgICAgICAjIGNhbGxiYWNrLCBhbmQgdGhhdCBjYWxsYmFjayByZWZlcmVuY2VzIGMyIHZpYSBjMndyKCkuCisgICAgICAgICMKKyAgICAgICAgIyAgICAgICAgICAgICAgIGMwIGhhcyBhIHdyIHdpdGggY2FsbGJhY2ssIHdoaWNoIHJlZmVyZW5jZXMgYzJ3cgorICAgICAgICAjICAgICAgICAgICAgICAgXgorICAgICAgICAjICAgICAgICAgICAgICAgfAorICAgICAgICAjICAgICAgICAgICAgICAgfCAgICAgR2VuZXJhdGlvbiAyIGFib3ZlIGRvdHMKKyAgICAgICAgIy4gLiAuIC4gLiAuIC4gLnwuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorICAgICAgICAjICAgICAgICAgICAgICAgfCAgICAgR2VuZXJhdGlvbiAwIGJlbG93IGRvdHMKKyAgICAgICAgIyAgICAgICAgICAgICAgIHwKKyAgICAgICAgIyAgICAgICAgICAgICAgIHwKKyAgICAgICAgIyAgICAgICAgICAgIF4tPmMxICAgXi0+YzIgaGFzIGEgd3IgYnV0IG5vIGNhbGxiYWNrCisgICAgICAgICMgICAgICAgICAgICB8ICB8ICAgIHwgIHwKKyAgICAgICAgIyAgICAgICAgICAgIDwtLXYgICAgPC0tdgorICAgICAgICAjCisgICAgICAgICMgU28gdGhpcyBpcyB0aGUgbmlnaHRtYXJlOiAgd2hlbiBnZW5lcmF0aW9uIDAgZ2V0cyBjb2xsZWN0ZWQsIHdlIHNlZQorICAgICAgICAjIHRoYXQgYzIgaGFzIGEgY2FsbGJhY2stZnJlZSB3ZWFrcmVmLCBhbmQgYzEgZG9lc24ndCBldmVuIGhhdmUgYQorICAgICAgICAjIHdlYWtyZWYuICBDb2xsZWN0aW5nIGdlbmVyYXRpb24gMCBkb2Vzbid0IHNlZSBjMCBhdCBhbGwsIGFuZCBjMCBpcworICAgICAgICAjIHRoZSBvbmx5IG9iamVjdCB0aGF0IGhhcyBhIHdlYWtyZWYgd2l0aCBhIGNhbGxiYWNrLiAgZ2MgY2xlYXJzIGMxCisgICAgICAgICMgYW5kIGMyLiAgQ2xlYXJpbmcgYzEgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBkcm9wcGluZyB0aGUgcmVmY291bnQgb24KKyAgICAgICAgIyBjMCB0byAwLCBzbyBjMCBnb2VzIGF3YXkgKGRlc3BpdGUgdGhhdCBpdCdzIGluIGFuIG9sZGVyIGdlbmVyYXRpb24pCisgICAgICAgICMgYW5kIGMwJ3Mgd3IgY2FsbGJhY2sgdHJpZ2dlcnMuICBUaGF0IGluIHR1cm4gbWF0ZXJpYWxpemVzIGEgcmVmZXJlbmNlCisgICAgICAgICMgdG8gYzIgdmlhIGMyd3IoKSwgYnV0IGMyIGdldHMgY2xlYXJlZCBhbnl3YXkgYnkgZ2MuCisKKyAgICAgICAgIyBXZSB3YW50IHRvIGxldCBnYyBoYXBwZW4gIm5hdHVyYWxseSIsIHRvIHByZXNlcnZlIHRoZSBkaXN0aW5jdGlvbgorICAgICAgICAjIGJldHdlZW4gZ2VuZXJhdGlvbnMuCisgICAgICAgIGp1bmsgPSBbXQorICAgICAgICBpID0gMAorICAgICAgICBkZXRlY3RvciA9IEdDX0RldGVjdG9yKCkKKyAgICAgICAgd2hpbGUgbm90IGRldGVjdG9yLmdjX2hhcHBlbmVkOgorICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICBpZiBpID4gMTAwMDA6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJnYyBkaWRuJ3QgaGFwcGVuIGFmdGVyIDEwMDAwIGl0ZXJhdGlvbnMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3VjaCksIDApCisgICAgICAgICAgICBqdW5rLmFwcGVuZChbXSkgICMgdGhpcyB3aWxsIGV2ZW50dWFsbHkgdHJpZ2dlciBnYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91Y2gpLCAxKSAgIyBlbHNlIHRoZSBjYWxsYmFjayB3YXNuJ3QgaW52b2tlZAorICAgICAgICBmb3IgeCBpbiBvdWNoOgorICAgICAgICAgICAgIyBJZiB0aGUgY2FsbGJhY2sgcmVzdXJyZWN0ZWQgYzIsIHRoZSBpbnN0YW5jZSB3b3VsZCBiZSBkYW1hZ2VkLAorICAgICAgICAgICAgIyB3aXRoIGFuIGVtcHR5IF9fZGljdF9fLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBOb25lKQorCisgICAgZGVmIHRlc3RfYnVnMTA1NTgyMGQoc2VsZik6CisgICAgICAgICMgQ29ycmVzcG9uZHMgdG8gdGVtcDJkLnB5IGluIHRoZSBidWcgcmVwb3J0LiAgVGhpcyBpcyB2ZXJ5IG11Y2ggbGlrZQorICAgICAgICAjIHRlc3RfYnVnMTA1NTgyMGMsIGJ1dCB1c2VzIGEgX19kZWxfXyBtZXRob2QgaW5zdGVhZCBvZiBhIHdlYWtyZWYKKyAgICAgICAgIyBjYWxsYmFjayB0byBzbmVhayBpbiBhIHJlc3VycmVjdGlvbiBvZiBjeWNsaWMgdHJhc2guCisKKyAgICAgICAgb3VjaCA9IFtdCisgICAgICAgIGNsYXNzIEQoQzEwNTU4MjApOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgb3VjaFs6XSA9IFtjMndyKCldCisKKyAgICAgICAgZDAgPSBEKDApCisgICAgICAgICMgTW92ZSBhbGwgdGhlIGFib3ZlIGludG8gZ2VuZXJhdGlvbiAyLgorICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgICAgICBjMSA9IEMxMDU1ODIwKDEpCisgICAgICAgIGMxLmtlZXBfZDBfYWxpdmUgPSBkMAorICAgICAgICBkZWwgZDAubG9vcCAjIG5vdyBvbmx5IGMxIGtlZXBzIGQwIGFsaXZlCisKKyAgICAgICAgYzIgPSBDMTA1NTgyMCgyKQorICAgICAgICBjMndyID0gd2Vha3JlZi5yZWYoYzIpICMgbm8gY2FsbGJhY2shCisKKyAgICAgICAgZDAgPSBjMSA9IGMyID0gTm9uZQorCisgICAgICAgICMgV2hhdCB3ZSd2ZSBzZXQgdXA6ICBkMCwgYzEsIGFuZCBjMiBhcmUgYWxsIHRyYXNoIG5vdy4gIGQwIGlzIGluCisgICAgICAgICMgZ2VuZXJhdGlvbiAyLiAgVGhlIG9ubHkgdGhpbmcga2VlcGluZyBpdCBhbGl2ZSBpcyB0aGF0IGMxIHBvaW50cyB0bworICAgICAgICAjIGl0LiAgYzEgYW5kIGMyIGFyZSBpbiBnZW5lcmF0aW9uIDAsIGFuZCBhcmUgaW4gc2VsZi1sb29wcy4gIFRoZXJlJ3MKKyAgICAgICAgIyBhIGdsb2JhbCB3ZWFrcmVmIHRvIGMyIChjMndyKSwgYnV0IHRoYXQgd2Vha3JlZiBoYXMgbm8gY2FsbGJhY2suCisgICAgICAgICMgVGhlcmUgYXJlIG5vIG90aGVyIHdlYWtyZWZzLgorICAgICAgICAjCisgICAgICAgICMgICAgICAgICAgICAgICBkMCBoYXMgYSBfX2RlbF9fIG1ldGhvZCB0aGF0IHJlZmVyZW5jZXMgYzJ3cgorICAgICAgICAjICAgICAgICAgICAgICAgXgorICAgICAgICAjICAgICAgICAgICAgICAgfAorICAgICAgICAjICAgICAgICAgICAgICAgfCAgICAgR2VuZXJhdGlvbiAyIGFib3ZlIGRvdHMKKyAgICAgICAgIy4gLiAuIC4gLiAuIC4gLnwuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLiAuIC4gLgorICAgICAgICAjICAgICAgICAgICAgICAgfCAgICAgR2VuZXJhdGlvbiAwIGJlbG93IGRvdHMKKyAgICAgICAgIyAgICAgICAgICAgICAgIHwKKyAgICAgICAgIyAgICAgICAgICAgICAgIHwKKyAgICAgICAgIyAgICAgICAgICAgIF4tPmMxICAgXi0+YzIgaGFzIGEgd3IgYnV0IG5vIGNhbGxiYWNrCisgICAgICAgICMgICAgICAgICAgICB8ICB8ICAgIHwgIHwKKyAgICAgICAgIyAgICAgICAgICAgIDwtLXYgICAgPC0tdgorICAgICAgICAjCisgICAgICAgICMgU28gdGhpcyBpcyB0aGUgbmlnaHRtYXJlOiAgd2hlbiBnZW5lcmF0aW9uIDAgZ2V0cyBjb2xsZWN0ZWQsIHdlIHNlZQorICAgICAgICAjIHRoYXQgYzIgaGFzIGEgY2FsbGJhY2stZnJlZSB3ZWFrcmVmLCBhbmQgYzEgZG9lc24ndCBldmVuIGhhdmUgYQorICAgICAgICAjIHdlYWtyZWYuICBDb2xsZWN0aW5nIGdlbmVyYXRpb24gMCBkb2Vzbid0IHNlZSBkMCBhdCBhbGwuICBnYyBjbGVhcnMKKyAgICAgICAgIyBjMSBhbmQgYzIuICBDbGVhcmluZyBjMSBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGRyb3BwaW5nIHRoZSByZWZjb3VudAorICAgICAgICAjIG9uIGQwIHRvIDAsIHNvIGQwIGdvZXMgYXdheSAoZGVzcGl0ZSB0aGF0IGl0J3MgaW4gYW4gb2xkZXIKKyAgICAgICAgIyBnZW5lcmF0aW9uKSBhbmQgZDAncyBfX2RlbF9fIHRyaWdnZXJzLiAgVGhhdCBpbiB0dXJuIG1hdGVyaWFsaXplcworICAgICAgICAjIGEgcmVmZXJlbmNlIHRvIGMyIHZpYSBjMndyKCksIGJ1dCBjMiBnZXRzIGNsZWFyZWQgYW55d2F5IGJ5IGdjLgorCisgICAgICAgICMgV2Ugd2FudCB0byBsZXQgZ2MgaGFwcGVuICJuYXR1cmFsbHkiLCB0byBwcmVzZXJ2ZSB0aGUgZGlzdGluY3Rpb24KKyAgICAgICAgIyBiZXR3ZWVuIGdlbmVyYXRpb25zLgorICAgICAgICBkZXRlY3RvciA9IEdDX0RldGVjdG9yKCkKKyAgICAgICAganVuayA9IFtdCisgICAgICAgIGkgPSAwCisgICAgICAgIHdoaWxlIG5vdCBkZXRlY3Rvci5nY19oYXBwZW5lZDoKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgaWYgaSA+IDEwMDAwOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZ2MgZGlkbid0IGhhcHBlbiBhZnRlciAxMDAwMCBpdGVyYXRpb25zIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91Y2gpLCAwKQorICAgICAgICAgICAganVuay5hcHBlbmQoW10pICAjIHRoaXMgd2lsbCBldmVudHVhbGx5IHRyaWdnZXIgZ2MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvdWNoKSwgMSkgICMgZWxzZSBfX2RlbF9fIHdhc24ndCBpbnZva2VkCisgICAgICAgIGZvciB4IGluIG91Y2g6CisgICAgICAgICAgICAjIElmIF9fZGVsX18gcmVzdXJyZWN0ZWQgYzIsIHRoZSBpbnN0YW5jZSB3b3VsZCBiZSBkYW1hZ2VkLCB3aXRoIGFuCisgICAgICAgICAgICAjIGVtcHR5IF9fZGljdF9fLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBOb25lKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgZW5hYmxlZCA9IGdjLmlzZW5hYmxlZCgpCisgICAgZ2MuZGlzYWJsZSgpCisgICAgYXNzZXJ0IG5vdCBnYy5pc2VuYWJsZWQoKQorICAgIGRlYnVnID0gZ2MuZ2V0X2RlYnVnKCkKKyAgICBnYy5zZXRfZGVidWcoZGVidWcgJiB+Z2MuREVCVUdfTEVBSykgIyB0aGlzIHRlc3QgaXMgc3VwcG9zZWQgdG8gbGVhaworCisgICAgdHJ5OgorICAgICAgICBnYy5jb2xsZWN0KCkgIyBEZWxldGUgMm5kIGdlbmVyYXRpb24gZ2FyYmFnZQorICAgICAgICBydW5fdW5pdHRlc3QoR0NUZXN0cywgR0NUb2dnbGluZ1Rlc3RzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGdjLnNldF9kZWJ1ZyhkZWJ1ZykKKyAgICAgICAgIyB0ZXN0IGdjLmVuYWJsZSgpIGV2ZW4gaWYgR0MgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgInJlc3RvcmluZyBhdXRvbWF0aWMgY29sbGVjdGlvbiIKKyAgICAgICAgIyBtYWtlIHN1cmUgdG8gYWx3YXlzIHRlc3QgZ2MuZW5hYmxlKCkKKyAgICAgICAgZ2MuZW5hYmxlKCkKKyAgICAgICAgYXNzZXJ0IGdjLmlzZW5hYmxlZCgpCisgICAgICAgIGlmIG5vdCBlbmFibGVkOgorICAgICAgICAgICAgZ2MuZGlzYWJsZSgpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2djLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2djLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTM2OGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2djLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2djLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdmOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzAyYjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RiLnB5CkBAIC0wLDAgKzEsNzYxIEBACisjIFZlcmlmeSB0aGF0IGdkYiBjYW4gcHJldHR5LXByaW50IHRoZSB2YXJpb3VzIFB5T2JqZWN0KiB0eXBlcworIworIyBUaGUgY29kZSBmb3IgdGVzdGluZyBnZGIgd2FzIGFkYXB0ZWQgZnJvbSBzaW1pbGFyIHdvcmsgaW4gVW5sYWRlbiBTd2FsbG93J3MKKyMgTGliL3Rlc3QvdGVzdF9qaXRfZ2RiLnB5CisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzY29uZmlnCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgZmluZGZpbGUKKwordHJ5OgorICAgIGdkYl92ZXJzaW9uLCBfID0gc3VicHJvY2Vzcy5Qb3BlbihbImdkYiIsICItLXZlcnNpb24iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKQorZXhjZXB0IE9TRXJyb3I6CisgICAgIyBUaGlzIGlzIHdoYXQgIm5vIGdkYiIgbG9va3MgbGlrZS4gIFRoZXJlIG1heSwgaG93ZXZlciwgYmUgb3RoZXIKKyAgICAjIGVycm9ycyB0aGF0IG1hbmlmZXN0IHRoaXMgd2F5IHRvby4KKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiQ291bGRuJ3QgZmluZCBnZGIgb24gdGhlIHBhdGgiKQorZ2RiX3ZlcnNpb25fbnVtYmVyID0gcmUuc2VhcmNoKCJeR05VIGdkYiBbXlxkXSooXGQrKVwuKFxkKSIsIGdkYl92ZXJzaW9uKQorZ2RiX21ham9yX3ZlcnNpb24gPSBpbnQoZ2RiX3ZlcnNpb25fbnVtYmVyLmdyb3VwKDEpKQorZ2RiX21pbm9yX3ZlcnNpb24gPSBpbnQoZ2RiX3ZlcnNpb25fbnVtYmVyLmdyb3VwKDIpKQoraWYgZ2RiX21ham9yX3ZlcnNpb24gPCA3OgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJnZGIgdmVyc2lvbnMgYmVmb3JlIDcuMCBkaWRuJ3Qgc3VwcG9ydCBweXRob24gZW1iZWRkaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgU2F3OlxuIiArIGdkYl92ZXJzaW9uKQorCisjIExvY2F0aW9uIG9mIGN1c3RvbSBob29rcyBmaWxlIGluIGEgcmVwb3NpdG9yeSBjaGVja291dC4KK2NoZWNrb3V0X2hvb2tfcGF0aCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoc3lzLmV4ZWN1dGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweXRob24tZ2RiLnB5JykKKworZGVmIHJ1bl9nZGIoKmFyZ3MsICoqZW52X3ZhcnMpOgorICAgICIiIlJ1bnMgZ2RiIGluIC0tYmF0Y2ggbW9kZSB3aXRoIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBnaXZlbiBieSAqYXJncy4KKworICAgIFJldHVybnMgaXRzIChzdGRvdXQsIHN0ZGVycikKKyAgICAiIiIKKyAgICBpZiBlbnZfdmFyczoKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgZW52LnVwZGF0ZShlbnZfdmFycykKKyAgICBlbHNlOgorICAgICAgICBlbnYgPSBOb25lCisgICAgYmFzZV9jbWQgPSAoJ2dkYicsICctLWJhdGNoJykKKyAgICBpZiAoZ2RiX21ham9yX3ZlcnNpb24sIGdkYl9taW5vcl92ZXJzaW9uKSA+PSAoNywgNCk6CisgICAgICAgIGJhc2VfY21kICs9ICgnLWlleCcsICdhZGQtYXV0by1sb2FkLXNhZmUtcGF0aCAnICsgY2hlY2tvdXRfaG9va19wYXRoKQorICAgIG91dCwgZXJyID0gc3VicHJvY2Vzcy5Qb3BlbihiYXNlX2NtZCArIGFyZ3MsCisgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIGVudj1lbnYsCisgICAgICAgICkuY29tbXVuaWNhdGUoKQorICAgIHJldHVybiBvdXQsIGVycgorCisjIFZlcmlmeSB0aGF0ICJnZGIiIHdhcyBidWlsdCB3aXRoIHRoZSBlbWJlZGRlZCBweXRob24gc3VwcG9ydCBlbmFibGVkOgorZ2RicHlfdmVyc2lvbiwgXyA9IHJ1bl9nZGIoIi0tZXZhbC1jb21tYW5kPXB5dGhvbiBpbXBvcnQgc3lzOyBwcmludCBzeXMudmVyc2lvbl9pbmZvIikKK2lmIG5vdCBnZGJweV92ZXJzaW9uOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJnZGIgbm90IGJ1aWx0IHdpdGggZW1iZWRkZWQgcHl0aG9uIHN1cHBvcnQiKQorCisjIFZlcmlmeSB0aGF0ICJnZGIiIGNhbiBsb2FkIG91ciBjdXN0b20gaG9va3MuICBJbiB0aGVvcnkgdGhpcyBzaG91bGQgbmV2ZXIKKyMgZmFpbCwgYnV0IHdlIGRvbid0IGhhbmRsZSB0aGUgY2FzZSBvZiB0aGUgaG9va3MgZmlsZSBub3QgZXhpc3RpbmcgaWYgdGhlCisjIHRlc3RzIGFyZSBydW4gZnJvbSBhbiBpbnN0YWxsZWQgUHl0aG9uICh3ZSdsbCBwcm9kdWNlIGZhaWx1cmVzIGluIHRoYXQgY2FzZSkuCitjbWQgPSBbJy0tYXJncycsIHN5cy5leGVjdXRhYmxlXQorXywgZ2RicHlfZXJyb3JzID0gcnVuX2dkYignLS1hcmdzJywgc3lzLmV4ZWN1dGFibGUpCitpZiAiYXV0by1sb2FkaW5nIGhhcyBiZWVuIGRlY2xpbmVkIiBpbiBnZGJweV9lcnJvcnM6CisgICAgbXNnID0gImdkYiBzZWN1cml0eSBzZXR0aW5ncyBwcmV2ZW50IHVzZSBvZiBjdXN0b20gaG9va3M6ICIKKworZGVmIHB5dGhvbl9pc19vcHRpbWl6ZWQoKToKKyAgICBjZmxhZ3MgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXJzKClbJ1BZX0NGTEFHUyddCisgICAgZmluYWxfb3B0ID0gIiIKKyAgICBmb3Igb3B0IGluIGNmbGFncy5zcGxpdCgpOgorICAgICAgICBpZiBvcHQuc3RhcnRzd2l0aCgnLU8nKToKKyAgICAgICAgICAgIGZpbmFsX29wdCA9IG9wdAorICAgIHJldHVybiAoZmluYWxfb3B0IGFuZCBmaW5hbF9vcHQgIT0gJy1PMCcpCisKK2RlZiBnZGJfaGFzX2ZyYW1lX3NlbGVjdCgpOgorICAgICMgRG9lcyB0aGlzIGJ1aWxkIG9mIGdkYiBoYXZlIGdkYi5GcmFtZS5zZWxlY3QgPworICAgIHN0ZG91dCwgXyA9IHJ1bl9nZGIoIi0tZXZhbC1jb21tYW5kPXB5dGhvbiBwcmludChkaXIoZ2RiLkZyYW1lKSkiKQorICAgIG0gPSByZS5tYXRjaChyJy4qXFsoLiopXF0uKicsIHN0ZG91dCkKKyAgICBpZiBub3QgbToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlVuYWJsZSB0byBwYXJzZSBvdXRwdXQgZnJvbSBnZGIuRnJhbWUuc2VsZWN0IHRlc3QiKQorICAgIGdkYl9mcmFtZV9kaXIgPSBtLmdyb3VwKDEpLnNwbGl0KCcsICcpCisgICAgcmV0dXJuICInc2VsZWN0JyIgaW4gZ2RiX2ZyYW1lX2RpcgorCitIQVNfUFlVUF9QWURPV04gPSBnZGJfaGFzX2ZyYW1lX3NlbGVjdCgpCisKK2NsYXNzIERlYnVnZ2VyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdCB0aGF0IHRoZSBkZWJ1Z2dlciBjYW4gZGVidWcgUHl0aG9uLiIiIgorCisgICAgZGVmIGdldF9zdGFja190cmFjZShzZWxmLCBzb3VyY2U9Tm9uZSwgc2NyaXB0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50PSdQeU9iamVjdF9QcmludCcsCisgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9zaXRlPUZhbHNlKToKKyAgICAgICAgJycnCisgICAgICAgIFJ1biAncHl0aG9uIC1jIFNPVVJDRScgdW5kZXIgZ2RiIHdpdGggYSBicmVha3BvaW50LgorCisgICAgICAgIFN1cHBvcnQgaW5qZWN0aW5nIGNvbW1hbmRzIGFmdGVyIHRoZSBicmVha3BvaW50IGlzIHJlYWNoZWQKKworICAgICAgICBSZXR1cm5zIHRoZSBzdGRvdXQgZnJvbSBnZGIKKworICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ6IGlmIHByb3ZpZGVkLCBhIGxpc3Qgb2Ygc3RyaW5nczogZ2RiIGNvbW1hbmRzCisgICAgICAgICcnJworICAgICAgICAjIFdlIHVzZSAic2V0IGJyZWFrcG9pbnQgcGVuZGluZyB5ZXMiIHRvIGF2b2lkIGJsb2NraW5nIHdpdGggYToKKyAgICAgICAgIyAgIEZ1bmN0aW9uICJmb28iIG5vdCBkZWZpbmVkLgorICAgICAgICAjICAgTWFrZSBicmVha3BvaW50IHBlbmRpbmcgb24gZnV0dXJlIHNoYXJlZCBsaWJyYXJ5IGxvYWQ/ICh5IG9yIFtuXSkKKyAgICAgICAgIyBlcnJvciwgd2hpY2ggdHlwaWNhbGx5IGhhcHBlbnMgcHl0aG9uIGlzIGR5bmFtaWNhbGx5IGxpbmtlZCAodGhlCisgICAgICAgICMgYnJlYWtwb2ludHMgb2YgaW50ZXJlc3QgYXJlIHRvIGJlIGZvdW5kIGluIHRoZSBzaGFyZWQgbGlicmFyeSkKKyAgICAgICAgIyBXaGVuIHRoaXMgaGFwcGVucywgd2Ugc3RpbGwgZ2V0OgorICAgICAgICAjICAgRnVuY3Rpb24gIlB5T2JqZWN0X1ByaW50IiBub3QgZGVmaW5lZC4KKyAgICAgICAgIyBlbWl0dGVkIHRvIHN0ZGVyciBlYWNoIHRpbWUsIGFsYXMuCisKKyAgICAgICAgIyBJbml0aWFsbHkgSSBoYWQgIi0tZXZhbC1jb21tYW5kPWNvbnRpbnVlIiBoZXJlLCBidXQgcmVtb3ZlZCBpdCB0bworICAgICAgICAjIGF2b2lkIHJlcGVhdGVkIHByaW50IGJyZWFrcG9pbnRzIHdoZW4gdHJhdmVyc2luZyBoaWVyYXJjaGljYWwgZGF0YQorICAgICAgICAjIHN0cnVjdHVyZXMKKworICAgICAgICAjIEdlbmVyYXRlIGEgbGlzdCBvZiBjb21tYW5kcyBpbiBnZGIncyBsYW5ndWFnZToKKyAgICAgICAgY29tbWFuZHMgPSBbJ3NldCBicmVha3BvaW50IHBlbmRpbmcgeWVzJywKKyAgICAgICAgICAgICAgICAgICAgJ2JyZWFrICVzJyAlIGJyZWFrcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICdydW4nXQorICAgICAgICBpZiBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ6CisgICAgICAgICAgICBjb21tYW5kcyArPSBjbWRzX2FmdGVyX2JyZWFrcG9pbnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbW1hbmRzICs9IFsnYmFja3RyYWNlJ10KKworICAgICAgICAjIHByaW50IGNvbW1hbmRzCisKKyAgICAgICAgIyBVc2UgImNvbW1hbmRzIiB0byBnZW5lcmF0ZSB0aGUgYXJndW1lbnRzIHdpdGggd2hpY2ggdG8gaW52b2tlICJnZGIiOgorICAgICAgICBhcmdzID0gWyJnZGIiLCAiLS1iYXRjaCJdCisgICAgICAgIGFyZ3MgKz0gWyctLWV2YWwtY29tbWFuZD0lcycgJSBjbWQgZm9yIGNtZCBpbiBjb21tYW5kc10KKyAgICAgICAgYXJncyArPSBbIi0tYXJncyIsCisgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlXQorCisgICAgICAgIGlmIG5vdCBpbXBvcnRfc2l0ZToKKyAgICAgICAgICAgICMgLVMgc3VwcHJlc3NlcyB0aGUgZGVmYXVsdCAnaW1wb3J0IHNpdGUnCisgICAgICAgICAgICBhcmdzICs9IFsiLVMiXQorCisgICAgICAgIGlmIHNvdXJjZToKKyAgICAgICAgICAgIGFyZ3MgKz0gWyItYyIsIHNvdXJjZV0KKyAgICAgICAgZWxpZiBzY3JpcHQ6CisgICAgICAgICAgICBhcmdzICs9IFtzY3JpcHRdCisKKyAgICAgICAgIyBwcmludCBhcmdzCisgICAgICAgICMgcHJpbnQgJyAnLmpvaW4oYXJncykKKworICAgICAgICAjIFVzZSAiYXJncyIgdG8gaW52b2tlIGdkYiwgY2FwdHVyaW5nIHN0ZG91dCwgc3RkZXJyOgorICAgICAgICBvdXQsIGVyciA9IHJ1bl9nZGIoKmFyZ3MsIFBZVEhPTkhBU0hTRUVEPScwJykKKworICAgICAgICBlcnJsaW5lcyA9IGVyci5zcGxpdGxpbmVzKCkKKyAgICAgICAgdW5leHBlY3RlZF9lcnJsaW5lcyA9IFtdCisKKyAgICAgICAgIyBJZ25vcmUgc29tZSBiZW5pZ24gbWVzc2FnZXMgb24gc3RkZXJyLgorICAgICAgICBpZ25vcmVfcGF0dGVybnMgPSAoCisgICAgICAgICAgICAnRnVuY3Rpb24gIiVzIiBub3QgZGVmaW5lZC4nICUgYnJlYWtwb2ludCwKKyAgICAgICAgICAgICJ3YXJuaW5nOiBubyBsb2FkYWJsZSBzZWN0aW9ucyBmb3VuZCBpbiBhZGRlZCBzeW1ib2wtZmlsZSIKKyAgICAgICAgICAgICIgc3lzdGVtLXN1cHBsaWVkIERTTyIsCisgICAgICAgICAgICAid2FybmluZzogVW5hYmxlIHRvIGZpbmQgbGlidGhyZWFkX2RiIG1hdGNoaW5nIgorICAgICAgICAgICAgIiBpbmZlcmlvcidzIHRocmVhZCBsaWJyYXJ5LCB0aHJlYWQgZGVidWdnaW5nIHdpbGwiCisgICAgICAgICAgICAiIG5vdCBiZSBhdmFpbGFibGUuIiwKKyAgICAgICAgICAgICJ3YXJuaW5nOiBDYW5ub3QgaW5pdGlhbGl6ZSB0aHJlYWQgZGVidWdnaW5nIgorICAgICAgICAgICAgIiBsaWJyYXJ5OiBEZWJ1Z2dlciBzZXJ2aWNlIGZhaWxlZCIsCisgICAgICAgICAgICAnd2FybmluZzogQ291bGQgbm90IGxvYWQgc2hhcmVkIGxpYnJhcnkgc3ltYm9scyBmb3IgJworICAgICAgICAgICAgJ2xpbnV4LXZkc28uc28nLAorICAgICAgICAgICAgJ3dhcm5pbmc6IENvdWxkIG5vdCBsb2FkIHNoYXJlZCBsaWJyYXJ5IHN5bWJvbHMgZm9yICcKKyAgICAgICAgICAgICdsaW51eC1nYXRlLnNvJywKKyAgICAgICAgICAgICdEbyB5b3UgbmVlZCAic2V0IHNvbGliLXNlYXJjaC1wYXRoIiBvciAnCisgICAgICAgICAgICAnInNldCBzeXNyb290Ij8nLAorICAgICAgICAgICAgKQorICAgICAgICBmb3IgbGluZSBpbiBlcnJsaW5lczoKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoaWdub3JlX3BhdHRlcm5zKToKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkX2VycmxpbmVzLmFwcGVuZChsaW5lKQorCisgICAgICAgICMgRW5zdXJlIG5vIHVuZXhwZWN0ZWQgZXJyb3IgbWVzc2FnZXM6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5leHBlY3RlZF9lcnJsaW5lcywgW10pCisgICAgICAgIHJldHVybiBvdXQKKworICAgIGRlZiBnZXRfZ2RiX3JlcHIoc2VsZiwgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICBpbXBvcnRfc2l0ZT1GYWxzZSk6CisgICAgICAgICMgR2l2ZW4gYW4gaW5wdXQgcHl0aG9uIHNvdXJjZSByZXByZXNlbnRhdGlvbiBvZiBkYXRhLAorICAgICAgICAjIHJ1biAicHl0aG9uIC1jJ3ByaW50IERBVEEnIiB1bmRlciBnZGIgd2l0aCBhIGJyZWFrcG9pbnQgb24KKyAgICAgICAgIyBQeU9iamVjdF9QcmludCBhbmQgc2NyYXBlIG91dCBnZGIncyByZXByZXNlbnRhdGlvbiBvZiB0aGUgIm9wIgorICAgICAgICAjIHBhcmFtZXRlciwgYW5kIHZlcmlmeSB0aGF0IHRoZSBnZGIgZGlzcGxheXMgdGhlIHNhbWUgc3RyaW5nCisgICAgICAgICMKKyAgICAgICAgIyBGb3IgYSBuZXN0ZWQgc3RydWN0dXJlLCB0aGUgZmlyc3QgdGltZSB3ZSBoaXQgdGhlIGJyZWFrcG9pbnQgd2lsbAorICAgICAgICAjIGdpdmUgdXMgdGhlIHRvcC1sZXZlbCBzdHJ1Y3R1cmUKKyAgICAgICAgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNvdXJjZSwgYnJlYWtwb2ludD0nUHlPYmplY3RfUHJpbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PWNtZHNfYWZ0ZXJfYnJlYWtwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydF9zaXRlPWltcG9ydF9zaXRlKQorICAgICAgICAjIGdkYiBjYW4gaW5zZXJ0IGFkZGl0aW9uYWwgJ1xuJyBhbmQgc3BhY2UgY2hhcmFjdGVycyBpbiB2YXJpb3VzIHBsYWNlcworICAgICAgICAjIGluIGl0cyBvdXRwdXQsIGRlcGVuZGluZyBvbiB0aGUgd2lkdGggb2YgdGhlIHRlcm1pbmFsIGl0J3MgY29ubmVjdGVkCisgICAgICAgICMgdG8gKHVzaW5nIGl0cyAid3JhcF9oZXJlIiBmdW5jdGlvbikKKyAgICAgICAgbSA9IHJlLm1hdGNoKCcuKiMwXHMrUHlPYmplY3RfUHJpbnRccytcKFxzKm9wXD1ccyooLio/KSxccytmcD0uKlwpLionLAorICAgICAgICAgICAgICAgICAgICAgZ2RiX291dHB1dCwgcmUuRE9UQUxMKQorICAgICAgICBpZiBub3QgbToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnVW5leHBlY3RlZCBnZGIgb3V0cHV0OiAlclxuJXMnICUgKGdkYl9vdXRwdXQsIGdkYl9vdXRwdXQpKQorICAgICAgICByZXR1cm4gbS5ncm91cCgxKSwgZ2RiX291dHB1dAorCisgICAgZGVmIGFzc2VydEVuZHNXaXRoKHNlbGYsIGFjdHVhbCwgZXhwX2VuZCk6CisgICAgICAgICcnJ0Vuc3VyZSB0aGF0IHRoZSBnaXZlbiAiYWN0dWFsIiBzdHJpbmcgZW5kcyB3aXRoICJleHBfZW5kIicnJworICAgICAgICBzZWxmLmFzc2VydFRydWUoYWN0dWFsLmVuZHN3aXRoKGV4cF9lbmQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSclciBkaWQgbm90IGVuZCB3aXRoICVyJyAlIChhY3R1YWwsIGV4cF9lbmQpKQorCisgICAgZGVmIGFzc2VydE11bHRpbGluZU1hdGNoZXMoc2VsZiwgYWN0dWFsLCBwYXR0ZXJuKToKKyAgICAgICAgbSA9IHJlLm1hdGNoKHBhdHRlcm4sIGFjdHVhbCwgcmUuRE9UQUxMKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobSwgbXNnPSclciBkaWQgbm90IG1hdGNoICVyJyAlIChhY3R1YWwsIHBhdHRlcm4pKQorCisgICAgZGVmIGdldF9zYW1wbGVfc2NyaXB0KHNlbGYpOgorICAgICAgICByZXR1cm4gZmluZGZpbGUoJ2dkYl9zYW1wbGUucHknKQorCitjbGFzcyBQcmV0dHlQcmludFRlc3RzKERlYnVnZ2VyVGVzdHMpOgorICAgIGRlZiB0ZXN0X2dldHRpbmdfYmFja3RyYWNlKHNlbGYpOgorICAgICAgICBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2UoJ3ByaW50IDQyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdQeU9iamVjdF9QcmludCcgaW4gZ2RiX291dHB1dCkKKworICAgIGRlZiBhc3NlcnRHZGJSZXByKHNlbGYsIHZhbCwgY21kc19hZnRlcl9icmVha3BvaW50PU5vbmUpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IGdkYidzIHJlbmRlcmluZyBvZiB0aGUgdmFsdWUgaW4gYSBkZWJ1Z2dlZCBwcm9jZXNzCisgICAgICAgICMgbWF0Y2hlcyByZXByKHZhbHVlKSBpbiB0aGlzIHByb2Nlc3M6CisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJ3ByaW50ICcgKyByZXByKHZhbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkYl9yZXByLCByZXByKHZhbCksIGdkYl9vdXRwdXQpCisKKyAgICBkZWYgdGVzdF9pbnQoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiB2YXJpb3VzICJpbnQiIHZhbHVlcycKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKDQyKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKC03KQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc3lzLm1heGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKC1zeXMubWF4aW50KQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIHZhcmlvdXMgImxvbmciIHZhbHVlcycKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKDBMKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoMTAwMDAwMDAwMDAwMEwpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcigtMUwpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcigtMTAwMDAwMDAwMDAwMDAwMEwpCisKKyAgICBkZWYgdGVzdF9zaW5nbGV0b25zKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgVHJ1ZSwgRmFsc2UgYW5kIE5vbmUnCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcihOb25lKQorCisgICAgZGVmIHRlc3RfZGljdHMoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBkaWN0aW9uYXJpZXMnCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHsnZm9vJzogJ2Jhcid9KQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoInsnZm9vJzogJ2JhcicsICdkb3VnbGFzJzo0Mn0iKQorCisgICAgZGVmIHRlc3RfbGlzdHMoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBsaXN0cycKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKFtdKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIocmFuZ2UoNSkpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdzKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2Ygc3RyaW5ncycKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKCcnKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoJ0FuZCBub3cgZm9yIHNvbWV0aGluZyBob3BlZnVsbHkgdGhlIHNhbWUnKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoJ3N0cmluZyB3aXRoIGVtYmVkZGVkIE5VTCBoZXJlIFwwIGFuZCB0aGVuIHNvbWUgbW9yZSB0ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKCd0aGlzIGlzIGJ5dGUgMjU1Olx4ZmYgYW5kIGJ5dGUgMTI4Olx4ODAnKQorCisgICAgZGVmIHRlc3RfdHVwbGVzKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgdHVwbGVzJworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIodHVwbGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKCgxLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcigoJ2ZvbycsICdiYXInLCAnYmF6JykpCisKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgdW5pY29kZSB2YWx1ZXMnCisgICAgICAgICMgVGVzdCB0aGUgZW1wdHkgdW5pY29kZSBzdHJpbmc6CisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih1JycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRHZGJSZXByKHUnaGVsbG8gd29ybGQnKQorCisgICAgICAgICMgVGVzdCBwcmludGluZyBhIHNpbmdsZSBjaGFyYWN0ZXI6CisgICAgICAgICMgICAgVSsyNjIwIFNLVUxMIEFORCBDUk9TU0JPTkVTCisgICAgICAgIHNlbGYuYXNzZXJ0R2RiUmVwcih1J1x1MjYyMCcpCisKKyAgICAgICAgIyBUZXN0IHByaW50aW5nIGEgSmFwYW5lc2UgdW5pY29kZSBzdHJpbmcKKyAgICAgICAgIyAoSSBiZWxpZXZlIHRoaXMgcmVhZHMgIm1vamliYWtlIiwgdXNpbmcgMyBjaGFyYWN0ZXJzIGZyb20gdGhlIENKSworICAgICAgICAjIFVuaWZpZWQgSWRlb2dyYXBocyBhcmVhLCBmb2xsb3dlZCBieSBVKzMwNTEgSElSQUdBTkEgTEVUVEVSIEtFKQorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIodSdcdTY1ODdcdTViNTdcdTUzMTZcdTMwNTEnKQorCisgICAgICAgICMgVGVzdCBhIGNoYXJhY3RlciBvdXRzaWRlIHRoZSBCTVA6CisgICAgICAgICMgICAgVSsxRDEyMSBNVVNJQ0FMIFNZTUJPTCBDIENMRUYKKyAgICAgICAgIyBUaGlzIGlzOgorICAgICAgICAjIFVURi04OiAweEYwIDB4OUQgMHg4NCAweEExCisgICAgICAgICMgVVRGLTE2OiAweEQ4MzQgMHhERDIxCisgICAgICAgICMgVGhpcyB3aWxsIG9ubHkgd29yayBvbiB3aWRlLXVuaWNvZGUgYnVpbGRzOgorICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIodSJcVTAwMDFEMTIxIikKKworICAgIGRlZiB0ZXN0X3NldHMoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBzZXRzJworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoc2V0KCkpCisgICAgICAgIHJlcCA9IHNlbGYuZ2V0X2dkYl9yZXByKCJwcmludCBzZXQoWydhJywgJ2InXSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoInNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7J2EnLCAnYid9KQorICAgICAgICByZXAgPSBzZWxmLmdldF9nZGJfcmVwcigicHJpbnQgc2V0KFs0LCA1XSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoInNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7NCwgNX0pCisKKyAgICAgICAgIyBFbnN1cmUgdGhhdCB3ZSBoYW5kbGVkIHNldHMgY29udGFpbmluZyB0aGUgImR1bW15IiBrZXkgdmFsdWUsCisgICAgICAgICMgd2hpY2ggaGFwcGVucyBvbiBkZWxldGlvbjoKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignJydzID0gc2V0KFsnYScsJ2InXSkKK3MucG9wKCkKK3ByaW50IHMnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsICJzZXQoWydiJ10pIikKKworICAgIGRlZiB0ZXN0X2Zyb3plbnNldHMoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhlIHByZXR0eS1wcmludGluZyBvZiBmcm96ZW5zZXRzJworICAgICAgICBzZWxmLmFzc2VydEdkYlJlcHIoZnJvemVuc2V0KCkpCisgICAgICAgIHJlcCA9IHNlbGYuZ2V0X2dkYl9yZXByKCJwcmludCBmcm96ZW5zZXQoWydhJywgJ2InXSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoImZyb3plbnNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7J2EnLCAnYid9KQorICAgICAgICByZXAgPSBzZWxmLmdldF9nZGJfcmVwcigicHJpbnQgZnJvemVuc2V0KFs0LCA1XSkiKVswXQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwLnN0YXJ0c3dpdGgoImZyb3plbnNldChbIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXAuZW5kc3dpdGgoIl0pIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbChyZXApLCB7NCwgNX0pCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgorICAgICAgICAjIFRlc3QgYSBSdW50aW1lRXJyb3IKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignJycKK3RyeToKKyAgICByYWlzZSBSdW50aW1lRXJyb3IoIkkgYW0gYW4gZXJyb3IiKQorZXhjZXB0IFJ1bnRpbWVFcnJvciwgZToKKyAgICBwcmludCBlCisnJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImV4Y2VwdGlvbnMuUnVudGltZUVycm9yKCdJIGFtIGFuIGVycm9yJywpIikKKworCisgICAgICAgICMgVGVzdCBkaXZpc2lvbiBieSB6ZXJvOgorICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCcnJwordHJ5OgorICAgIGEgPSAxIC8gMAorZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yLCBlOgorICAgIHByaW50IGUKKycnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZGJfcmVwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9ucy5aZXJvRGl2aXNpb25FcnJvcignaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybycsKSIpCisKKyAgICBkZWYgdGVzdF9jbGFzc2ljX2NsYXNzKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgY2xhc3NpYyBjbGFzcyBpbnN0YW5jZXMnCisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJycnCitjbGFzcyBGb286CisgICAgcGFzcworZm9vID0gRm9vKCkKK2Zvby5hbl9pbnQgPSA0MgorcHJpbnQgZm9vJycnKQorICAgICAgICBtID0gcmUubWF0Y2gocic8Rm9vXChhbl9pbnQ9NDJcKSBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywgZ2RiX3JlcHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdVbmV4cGVjdGVkIGNsYXNzaWMtY2xhc3MgcmVuZGVyaW5nICVyJyAlIGdkYl9yZXByKQorCisgICAgZGVmIHRlc3RfbW9kZXJuX2NsYXNzKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgbmV3LXN0eWxlIGNsYXNzIGluc3RhbmNlcycKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignJycKK2NsYXNzIEZvbyhvYmplY3QpOgorICAgIHBhc3MKK2ZvbyA9IEZvbygpCitmb28uYW5faW50ID0gNDIKK3ByaW50IGZvbycnJykKKyAgICAgICAgbSA9IHJlLm1hdGNoKHInPEZvb1woYW5faW50PTQyXCkgYXQgcmVtb3RlIDB4WzAtOWEtZl0rPicsIGdkYl9yZXByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nVW5leHBlY3RlZCBuZXctc3R5bGUgY2xhc3MgcmVuZGVyaW5nICVyJyAlIGdkYl9yZXByKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NpbmdfbGlzdChzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgcHJldHR5LXByaW50aW5nIG9mIGFuIGluc3RhbmNlIG9mIGEgbGlzdCBzdWJjbGFzcycKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcignJycKK2NsYXNzIEZvbyhsaXN0KToKKyAgICBwYXNzCitmb28gPSBGb28oKQorZm9vICs9IFsxLCAyLCAzXQorZm9vLmFuX2ludCA9IDQyCitwcmludCBmb28nJycpCisgICAgICAgIG0gPSByZS5tYXRjaChyJzxGb29cKGFuX2ludD00MlwpIGF0IHJlbW90ZSAweFswLTlhLWZdKz4nLCBnZGJfcmVwcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0sCisgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J1VuZXhwZWN0ZWQgbmV3LXN0eWxlIGNsYXNzIHJlbmRlcmluZyAlcicgJSBnZGJfcmVwcikKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nX3R1cGxlKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSBwcmV0dHktcHJpbnRpbmcgb2YgYW4gaW5zdGFuY2Ugb2YgYSB0dXBsZSBzdWJjbGFzcycKKyAgICAgICAgIyBUaGlzIHNob3VsZCBleGVyY2lzZSB0aGUgbmVnYXRpdmUgdHBfZGljdG9mZnNldCBjb2RlIGluIHRoZQorICAgICAgICAjIG5ldy1zdHlsZSBjbGFzcyBzdXBwb3J0CisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJycnCitjbGFzcyBGb28odHVwbGUpOgorICAgIHBhc3MKK2ZvbyA9IEZvbygoMSwgMiwgMykpCitmb28uYW5faW50ID0gNDIKK3ByaW50IGZvbycnJykKKyAgICAgICAgbSA9IHJlLm1hdGNoKHInPEZvb1woYW5faW50PTQyXCkgYXQgcmVtb3RlIDB4WzAtOWEtZl0rPicsIGdkYl9yZXByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nVW5leHBlY3RlZCBuZXctc3R5bGUgY2xhc3MgcmVuZGVyaW5nICVyJyAlIGdkYl9yZXByKQorCisgICAgZGVmIGFzc2VydFNhbmUoc2VsZiwgc291cmNlLCBjb3JydXB0aW9uLCBleHB2YWx1ZT1Ob25lLCBleHB0eXBlPU5vbmUpOgorICAgICAgICAnJydSdW4gUHl0aG9uIHVuZGVyIGdkYiwgY29ycnVwdGluZyB2YXJpYWJsZXMgaW4gdGhlIGluZmVyaW9yIHByb2Nlc3MKKyAgICAgICAgaW1tZWRpYXRlbHkgYmVmb3JlIHRha2luZyBhIGJhY2t0cmFjZS4KKworICAgICAgICBWZXJpZnkgdGhhdCB0aGUgdmFyaWFibGUncyByZXByZXNlbnRhdGlvbiBpcyB0aGUgZXhwZWN0ZWQgZmFpbHNhZmUKKyAgICAgICAgcmVwcmVzZW50YXRpb24nJycKKyAgICAgICAgaWYgY29ycnVwdGlvbjoKKyAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bY29ycnVwdGlvbiwgJ2JhY2t0cmFjZSddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydiYWNrdHJhY2UnXQorCisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gXAorICAgICAgICAgICAgc2VsZi5nZXRfZ2RiX3JlcHIoc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PWNtZHNfYWZ0ZXJfYnJlYWtwb2ludCkKKworICAgICAgICBpZiBleHB2YWx1ZToKKyAgICAgICAgICAgIGlmIGdkYl9yZXByID09IHJlcHIoZXhwdmFsdWUpOgorICAgICAgICAgICAgICAgICMgZ2RiIG1hbmFnZWQgdG8gcHJpbnQgdGhlIHZhbHVlIGluIHNwaXRlIG9mIHRoZSBjb3JydXB0aW9uOworICAgICAgICAgICAgICAgICMgdGhpcyBpcyBnb29kIChzZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTgzMzApCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgZXhwdHlwZToKKyAgICAgICAgICAgIHBhdHRlcm4gPSAnPCcgKyBleHB0eXBlICsgJyBhdCByZW1vdGUgMHhbMC05YS1mXSs+JworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBNYXRjaCBhbnl0aGluZyBmb3IgdGhlIHR5cGUgbmFtZTsgMHhERUFEQkVFRiBjb3VsZCBwb2ludCB0bworICAgICAgICAgICAgIyBzb21ldGhpbmcgYXJiaXRyYXJ5IChzZWUgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU4MzMwKQorICAgICAgICAgICAgcGF0dGVybiA9ICc8LiogYXQgcmVtb3RlIDB4WzAtOWEtZl0rPicKKworICAgICAgICBtID0gcmUubWF0Y2gocGF0dGVybiwgZ2RiX3JlcHIpCisgICAgICAgIGlmIG5vdCBtOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGdkYl9yZXByLCBnZGJfb3V0cHV0KSkKKworICAgIGRlZiB0ZXN0X05VTExfcHRyKHNlbGYpOgorICAgICAgICAnRW5zdXJlIHRoYXQgYSBOVUxMIFB5T2JqZWN0KiBpcyBoYW5kbGVkIGdyYWNlZnVsbHknCisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gKAorICAgICAgICAgICAgc2VsZi5nZXRfZ2RiX3JlcHIoJ3ByaW50IDQyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3NldCB2YXJpYWJsZSBvcD0wJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhY2t0cmFjZSddKQorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsICcweDAnKQorCisgICAgZGVmIHRlc3RfTlVMTF9vYl90eXBlKHNlbGYpOgorICAgICAgICAnRW5zdXJlIHRoYXQgYSBQeU9iamVjdCogd2l0aCBOVUxMIG9iX3R5cGUgaXMgaGFuZGxlZCBncmFjZWZ1bGx5JworICAgICAgICBzZWxmLmFzc2VydFNhbmUoJ3ByaW50IDQyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzZXQgb3AtPm9iX3R5cGU9MCcpCisKKyAgICBkZWYgdGVzdF9jb3JydXB0X29iX3R5cGUoc2VsZik6CisgICAgICAgICdFbnN1cmUgdGhhdCBhIFB5T2JqZWN0KiB3aXRoIGEgY29ycnVwdCBvYl90eXBlIGlzIGhhbmRsZWQgZ3JhY2VmdWxseScKKyAgICAgICAgc2VsZi5hc3NlcnRTYW5lKCdwcmludCA0MicsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2V0IG9wLT5vYl90eXBlPTB4REVBREJFRUYnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwdmFsdWU9NDIpCisKKyAgICBkZWYgdGVzdF9jb3JydXB0X3RwX2ZsYWdzKHNlbGYpOgorICAgICAgICAnRW5zdXJlIHRoYXQgYSBQeU9iamVjdCogd2l0aCBhIHR5cGUgd2l0aCBjb3JydXB0IHRwX2ZsYWdzIGlzIGhhbmRsZWQnCisgICAgICAgIHNlbGYuYXNzZXJ0U2FuZSgncHJpbnQgNDInLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3NldCBvcC0+b2JfdHlwZS0+dHBfZmxhZ3M9MHgwJywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cHZhbHVlPTQyKQorCisgICAgZGVmIHRlc3RfY29ycnVwdF90cF9uYW1lKHNlbGYpOgorICAgICAgICAnRW5zdXJlIHRoYXQgYSBQeU9iamVjdCogd2l0aCBhIHR5cGUgd2l0aCBjb3JydXB0IHRwX25hbWUgaXMgaGFuZGxlZCcKKyAgICAgICAgc2VsZi5hc3NlcnRTYW5lKCdwcmludCA0MicsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2V0IG9wLT5vYl90eXBlLT50cF9uYW1lPTB4REVBREJFRUYnLAorICAgICAgICAgICAgICAgICAgICAgICAgZXhwdmFsdWU9NDIpCisKKyAgICBkZWYgdGVzdF9OVUxMX2luc3RhbmNlX2RpY3Qoc2VsZik6CisgICAgICAgICdFbnN1cmUgdGhhdCBhIFB5SW5zdGFuY2VPYmplY3Qgd2l0aCB3aXRoIGEgTlVMTCBpbl9kaWN0IGlzIGhhbmRsZWQnCisgICAgICAgIHNlbGYuYXNzZXJ0U2FuZSgnJycKK2NsYXNzIEZvbzoKKyAgICBwYXNzCitmb28gPSBGb28oKQorZm9vLmFuX2ludCA9IDQyCitwcmludCBmb28nJycsCisgICAgICAgICAgICAgICAgICAgICAgICAnc2V0ICgoUHlJbnN0YW5jZU9iamVjdCopb3ApLT5pbl9kaWN0ID0gMCcsCisgICAgICAgICAgICAgICAgICAgICAgICBleHB0eXBlPSdGb28nKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbnNfaGVscChzZWxmKToKKyAgICAgICAgJ0Vuc3VyZSB0aGF0IHRoZSBuZXctc3R5bGUgY2xhc3MgX0hlbHBlciBpbiBzaXRlLnB5IGNhbiBiZSBoYW5kbGVkJworICAgICAgICAjICh0aGlzIHdhcyB0aGUgaXNzdWUgY2F1c2luZyB0cmFjZWJhY2tzIGluCisgICAgICAgICMgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU4MDMyI21zZzEwMDUzNyApCisKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcigncHJpbnQgX19idWlsdGluc19fLmhlbHAnLCBpbXBvcnRfc2l0ZT1UcnVlKQorICAgICAgICBtID0gcmUubWF0Y2gocic8X0hlbHBlciBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywgZ2RiX3JlcHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdVbmV4cGVjdGVkIHJlbmRlcmluZyAlcicgJSBnZGJfcmVwcikKKworICAgIGRlZiB0ZXN0X3NlbGZyZWZlcmVudGlhbF9saXN0KHNlbGYpOgorICAgICAgICAnJydFbnN1cmUgdGhhdCBhIHJlZmVyZW5jZSBsb29wIGludm9sdmluZyBhIGxpc3QgZG9lc24ndCBsZWFkIHByb3h5dmFsCisgICAgICAgIGludG8gYW4gaW5maW5pdGUgbG9vcDonJycKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBcCisgICAgICAgICAgICBzZWxmLmdldF9nZGJfcmVwcigiYSA9IFszLCA0LCA1XSA7IGEuYXBwZW5kKGEpIDsgcHJpbnQgYSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZGJfcmVwciwgJ1szLCA0LCA1LCBbLi4uXV0nKQorCisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gXAorICAgICAgICAgICAgc2VsZi5nZXRfZ2RiX3JlcHIoImEgPSBbMywgNCwgNV0gOyBiID0gW2FdIDsgYS5hcHBlbmQoYikgOyBwcmludCBhIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkYl9yZXByLCAnWzMsIDQsIDUsIFtbLi4uXV1dJykKKworICAgIGRlZiB0ZXN0X3NlbGZyZWZlcmVudGlhbF9kaWN0KHNlbGYpOgorICAgICAgICAnJydFbnN1cmUgdGhhdCBhIHJlZmVyZW5jZSBsb29wIGludm9sdmluZyBhIGRpY3QgZG9lc24ndCBsZWFkIHByb3h5dmFsCisgICAgICAgIGludG8gYW4gaW5maW5pdGUgbG9vcDonJycKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBcCisgICAgICAgICAgICBzZWxmLmdldF9nZGJfcmVwcigiYSA9IHt9IDsgYiA9IHsnYmFyJzphfSA7IGFbJ2ZvbyddID0gYiA7IHByaW50IGEiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2RiX3JlcHIsICJ7J2Zvbyc6IHsnYmFyJzogey4uLn19fSIpCisKKyAgICBkZWYgdGVzdF9zZWxmcmVmZXJlbnRpYWxfb2xkX3N0eWxlX2luc3RhbmNlKHNlbGYpOgorICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IFwKKyAgICAgICAgICAgIHNlbGYuZ2V0X2dkYl9yZXByKCcnJworY2xhc3MgRm9vOgorICAgIHBhc3MKK2ZvbyA9IEZvbygpCitmb28uYW5fYXR0ciA9IGZvbworcHJpbnQgZm9vJycnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxGb29cKGFuX2F0dHI9PFwuXC5cLj5cKSBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9yZXByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2RiX3JlcHIsIGdkYl9vdXRwdXQpKQorCisgICAgZGVmIHRlc3Rfc2VsZnJlZmVyZW50aWFsX25ld19zdHlsZV9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBcCisgICAgICAgICAgICBzZWxmLmdldF9nZGJfcmVwcignJycKK2NsYXNzIEZvbyhvYmplY3QpOgorICAgIHBhc3MKK2ZvbyA9IEZvbygpCitmb28uYW5fYXR0ciA9IGZvbworcHJpbnQgZm9vJycnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goJzxGb29cKGFuX2F0dHI9PFwuXC5cLj5cKSBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9yZXByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2RiX3JlcHIsIGdkYl9vdXRwdXQpKQorCisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gXAorICAgICAgICAgICAgc2VsZi5nZXRfZ2RiX3JlcHIoJycnCitjbGFzcyBGb28ob2JqZWN0KToKKyAgICBwYXNzCithID0gRm9vKCkKK2IgPSBGb28oKQorYS5hbl9hdHRyID0gYgorYi5hbl9hdHRyID0gYQorcHJpbnQgYScnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCc8Rm9vXChhbl9hdHRyPTxGb29cKGFuX2F0dHI9PFwuXC5cLj5cKSBhdCByZW1vdGUgMHhbMC05YS1mXSs+XCkgYXQgcmVtb3RlIDB4WzAtOWEtZl0rPicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfcmVwciksCisgICAgICAgICAgICAgICAgICAgICAgICAnVW5leHBlY3RlZCBnZGIgcmVwcmVzZW50YXRpb246ICVyXG4lcycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdkYl9yZXByLCBnZGJfb3V0cHV0KSkKKworICAgIGRlZiB0ZXN0X3RydW5jYXRpb24oc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhhdCB2ZXJ5IGxvbmcgb3V0cHV0IGlzIHRydW5jYXRlZCcKKyAgICAgICAgZ2RiX3JlcHIsIGdkYl9vdXRwdXQgPSBzZWxmLmdldF9nZGJfcmVwcigncHJpbnQgcmFuZ2UoMTAwMCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkYl9yZXByLAorICAgICAgICAgICAgICAgICAgICAgICAgICJbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTQsIDE1LCAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LCA0OCwgNDksIDUwLCA1MSwgNTIsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLCA2NCwgNjUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiNjYsIDY3LCA2OCwgNjksIDcwLCA3MSwgNzIsIDczLCA3NCwgNzUsIDc2LCA3NywgNzgsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiNzksIDgwLCA4MSwgODIsIDgzLCA4NCwgODUsIDg2LCA4NywgODgsIDg5LCA5MCwgOTEsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiOTIsIDkzLCA5NCwgOTUsIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsIDExMiwgMTEzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTM0LCAxMzUsIDEzNiwgMTM3LCAxMzgsIDEzOSwgMTQwLCAxNDEsIDE0MiwgMTQzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjE0NCwgMTQ1LCAxNDYsIDE0NywgMTQ4LCAxNDksIDE1MCwgMTUxLCAxNTIsIDE1MywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LCAxNjAsIDE2MSwgMTYyLCAxNjMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjE3NCwgMTc1LCAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MSwgMTkyLCAxOTMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIjIwNCwgMjA1LCAyMDYsIDIwNywgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICIyMTQsIDIxNSwgMjE2LCAyMTcsIDIxOCwgMjE5LCAyMjAsIDIyMSwgMjIyLCAyMjMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMjI0LCAyMjUsIDIyNi4uLih0cnVuY2F0ZWQpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2RiX3JlcHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjQgKyBsZW4oJy4uLih0cnVuY2F0ZWQpJykpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBnZGJfcmVwciwgZ2RiX291dHB1dCA9IHNlbGYuZ2V0X2dkYl9yZXByKCdwcmludCBsZW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdkYl9yZXByLCAnPGJ1aWx0LWluIGZ1bmN0aW9uIGxlbj4nKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbl9tZXRob2Qoc2VsZik6CisgICAgICAgIGdkYl9yZXByLCBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfZ2RiX3JlcHIoJ2ltcG9ydCBzeXM7IHByaW50IHN5cy5zdGRvdXQucmVhZGxpbmVzJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCc8YnVpbHQtaW4gbWV0aG9kIHJlYWRsaW5lcyBvZiBmaWxlIG9iamVjdCBhdCByZW1vdGUgMHhbMC05YS1mXSs+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdkYl9yZXByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2RiX3JlcHIsIGdkYl9vdXRwdXQpKQorCisgICAgZGVmIHRlc3RfZnJhbWVzKHNlbGYpOgorICAgICAgICBnZGJfb3V0cHV0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2UoJycnCitkZWYgZm9vKGEsIGIsIGMpOgorICAgIHBhc3MKKworZm9vKDMsIDQsIDUpCitwcmludCBmb28uX19jb2RlX18nJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50PSdQeU9iamVjdF9QcmludCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydwcmludCAoUHlGcmFtZU9iamVjdCopKCgoUHlDb2RlT2JqZWN0KilvcCktPmNvX3pvbWJpZWZyYW1lKSddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChyJy4qXHMrXCQxID1ccytGcmFtZSAweFswLTlhLWZdKywgZm9yIGZpbGUgPHN0cmluZz4sIGxpbmUgMywgaW4gZm9vIFwoXClccysuKicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZGJfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmUuRE9UQUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdVbmV4cGVjdGVkIGdkYiByZXByZXNlbnRhdGlvbjogJXJcbiVzJyAlIChnZGJfb3V0cHV0LCBnZGJfb3V0cHV0KSkKKworQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCitjbGFzcyBQeUxpc3RUZXN0cyhEZWJ1Z2dlclRlc3RzKToKKyAgICBkZWYgYXNzZXJ0TGlzdGluZyhzZWxmLCBleHBlY3RlZCwgYWN0dWFsKToKKyAgICAgICAgc2VsZi5hc3NlcnRFbmRzV2l0aChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfYmFzaWNfY29tbWFuZChzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGF0IHRoZSAicHktbGlzdCIgY29tbWFuZCB3b3JrcycKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LWxpc3QnXSkKKworICAgICAgICBzZWxmLmFzc2VydExpc3RpbmcoJyAgIDUgICAgXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgNiAgICBkZWYgYmFyKGEsIGIsIGMpOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDcgICAgICAgIGJheihhLCBiLCBjKVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDggICAgXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgOSAgICBkZWYgYmF6KCphcmdzKTpcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgPjEwICAgICAgICBwcmludCg0MilcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgIDExICAgIFxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgMTIgICAgZm9vKDEsIDIsIDMpXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYnQpCisKKyAgICBkZWYgdGVzdF9vbmVfYWJzX2FyZyhzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSB0aGUgInB5LWxpc3QiIGNvbW1hbmQgd2l0aCBvbmUgYWJzb2x1dGUgYXJndW1lbnQnCisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS1saXN0IDknXSkKKworICAgICAgICBzZWxmLmFzc2VydExpc3RpbmcoJyAgIDkgICAgZGVmIGJheigqYXJncyk6XG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnID4xMCAgICAgICAgcHJpbnQoNDIpXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAxMSAgICBcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcgIDEyICAgIGZvbygxLCAyLCAzKVxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0KQorCisgICAgZGVmIHRlc3RfdHdvX2Fic19hcmdzKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoZSAicHktbGlzdCIgY29tbWFuZCB3aXRoIHR3byBhYnNvbHV0ZSBhcmd1bWVudHMnCisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS1saXN0IDEsMyddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0TGlzdGluZygnICAgMSAgICAjIFNhbXBsZSBzY3JpcHQgZm9yIHVzZSBieSB0ZXN0X2dkYi5weVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgIDIgICAgXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgMyAgICBkZWYgZm9vKGEsIGIsIGMpOlxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ0KQorCitjbGFzcyBTdGFja05hdmlnYXRpb25UZXN0cyhEZWJ1Z2dlclRlc3RzKToKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUFlVUF9QWURPV04sICJ0ZXN0IHJlcXVpcmVzIHB5LXVwL3B5LWRvd24gY29tbWFuZHMiKQorICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKKyAgICBkZWYgdGVzdF9weXVwX2NvbW1hbmQoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhhdCB0aGUgInB5LXVwIiBjb21tYW5kIHdvcmtzJworICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktdXAnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRNdWx0aWxpbmVNYXRjaGVzKGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcicnJ14uKgorI1swLTldKyBGcmFtZSAweFswLTlhLWZdKywgZm9yIGZpbGUgLipnZGJfc2FtcGxlLnB5LCBsaW5lIDcsIGluIGJhciBcKGE9MSwgYj0yLCBjPTNcKQorICAgIGJhelwoYSwgYiwgY1wpCiskJycnKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1BZVVBfUFlET1dOLCAidGVzdCByZXF1aXJlcyBweS11cC9weS1kb3duIGNvbW1hbmRzIikKKyAgICBkZWYgdGVzdF9kb3duX2F0X2JvdHRvbShzZWxmKToKKyAgICAgICAgJ1ZlcmlmeSBoYW5kbGluZyBvZiAicHktZG93biIgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2snCisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS1kb3duJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RW5kc1dpdGgoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBmaW5kIGEgbmV3ZXIgcHl0aG9uIGZyYW1lXG4nKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1BZVVBfUFlET1dOLCAidGVzdCByZXF1aXJlcyBweS11cC9weS1kb3duIGNvbW1hbmRzIikKKyAgICBkZWYgdGVzdF91cF9hdF90b3Aoc2VsZik6CisgICAgICAgICdWZXJpZnkgaGFuZGxpbmcgb2YgInB5LXVwIiBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaycKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LXVwJ10gKiA0KQorICAgICAgICBzZWxmLmFzc2VydEVuZHNXaXRoKGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gZmluZCBhbiBvbGRlciBweXRob24gZnJhbWVcbicpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUFlVUF9QWURPV04sICJ0ZXN0IHJlcXVpcmVzIHB5LXVwL3B5LWRvd24gY29tbWFuZHMiKQorICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKKyAgICBkZWYgdGVzdF91cF90aGVuX2Rvd24oc2VsZik6CisgICAgICAgICdWZXJpZnkgInB5LXVwIiBmb2xsb3dlZCBieSAicHktZG93biInCisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS11cCcsICdweS1kb3duJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInJydeLioKKyNbMC05XSsgRnJhbWUgMHhbMC05YS1mXSssIGZvciBmaWxlIC4qZ2RiX3NhbXBsZS5weSwgbGluZSA3LCBpbiBiYXIgXChhPTEsIGI9MiwgYz0zXCkKKyAgICBiYXpcKGEsIGIsIGNcKQorI1swLTldKyBGcmFtZSAweFswLTlhLWZdKywgZm9yIGZpbGUgLipnZGJfc2FtcGxlLnB5LCBsaW5lIDEwLCBpbiBiYXogXChhcmdzPVwoMSwgMiwgM1wpXCkKKyAgICBwcmludFwoNDJcKQorJCcnJykKKworY2xhc3MgUHlCdFRlc3RzKERlYnVnZ2VyVGVzdHMpOgorICAgIEB1bml0dGVzdC5za2lwSWYocHl0aG9uX2lzX29wdGltaXplZCgpLAorICAgICAgICAgICAgICAgICAgICAgIlB5dGhvbiB3YXMgY29tcGlsZWQgd2l0aCBvcHRpbWl6YXRpb25zIikKKyAgICBkZWYgdGVzdF9iYXNpY19jb21tYW5kKHNlbGYpOgorICAgICAgICAnVmVyaWZ5IHRoYXQgdGhlICJweS1idCIgY29tbWFuZCB3b3JrcycKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LWJ0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0TXVsdGlsaW5lTWF0Y2hlcyhidCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInJydeLioKKyNbMC05XSsgRnJhbWUgMHhbMC05YS1mXSssIGZvciBmaWxlIC4qZ2RiX3NhbXBsZS5weSwgbGluZSA3LCBpbiBiYXIgXChhPTEsIGI9MiwgYz0zXCkKKyAgICBiYXpcKGEsIGIsIGNcKQorI1swLTldKyBGcmFtZSAweFswLTlhLWZdKywgZm9yIGZpbGUgLipnZGJfc2FtcGxlLnB5LCBsaW5lIDQsIGluIGZvbyBcKGE9MSwgYj0yLCBjPTNcKQorICAgIGJhclwoYSwgYiwgY1wpCisjWzAtOV0rIEZyYW1lIDB4WzAtOWEtZl0rLCBmb3IgZmlsZSAuKmdkYl9zYW1wbGUucHksIGxpbmUgMTIsIGluIDxtb2R1bGU+IFwoXCkKKyAgICBmb29cKDEsIDIsIDNcKQorJycnKQorCitjbGFzcyBQeVByaW50VGVzdHMoRGVidWdnZXJUZXN0cyk6CisgICAgQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbnMiKQorICAgIGRlZiB0ZXN0X2Jhc2ljX2NvbW1hbmQoc2VsZik6CisgICAgICAgICdWZXJpZnkgdGhhdCB0aGUgInB5LXByaW50IiBjb21tYW5kIHdvcmtzJworICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktcHJpbnQgYXJncyddKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5sb2NhbCAnYXJncycgPSBcKDEsIDIsIDNcKVxuLioiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1BZVVBfUFlET1dOLCAidGVzdCByZXF1aXJlcyBweS11cC9weS1kb3duIGNvbW1hbmRzIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCisgICAgZGVmIHRlc3RfcHJpbnRfYWZ0ZXJfdXAoc2VsZik6CisgICAgICAgIGJ0ID0gc2VsZi5nZXRfc3RhY2tfdHJhY2Uoc2NyaXB0PXNlbGYuZ2V0X3NhbXBsZV9zY3JpcHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzX2FmdGVyX2JyZWFrcG9pbnQ9WydweS11cCcsICdweS1wcmludCBjJywgJ3B5LXByaW50IGInLCAncHktcHJpbnQgYSddKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5sb2NhbCAnYycgPSAzXG5sb2NhbCAnYicgPSAyXG5sb2NhbCAnYScgPSAxXG4uKiIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCisgICAgZGVmIHRlc3RfcHJpbnRpbmdfZ2xvYmFsKHNlbGYpOgorICAgICAgICBidCA9IHNlbGYuZ2V0X3N0YWNrX3RyYWNlKHNjcmlwdD1zZWxmLmdldF9zYW1wbGVfc2NyaXB0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kc19hZnRlcl9icmVha3BvaW50PVsncHktcHJpbnQgX19uYW1lX18nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRNdWx0aWxpbmVNYXRjaGVzKGJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciIuKlxuZ2xvYmFsICdfX25hbWVfXycgPSAnX19tYWluX18nXG4uKiIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCisgICAgZGVmIHRlc3RfcHJpbnRpbmdfYnVpbHRpbihzZWxmKToKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LXByaW50IGxlbiddKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5idWlsdGluICdsZW4nID0gPGJ1aWx0LWluIGZ1bmN0aW9uIGxlbj5cbi4qIikKKworY2xhc3MgUHlMb2NhbHNUZXN0cyhEZWJ1Z2dlclRlc3RzKToKKyAgICBAdW5pdHRlc3Quc2tpcElmKHB5dGhvbl9pc19vcHRpbWl6ZWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJQeXRob24gd2FzIGNvbXBpbGVkIHdpdGggb3B0aW1pemF0aW9ucyIpCisgICAgZGVmIHRlc3RfYmFzaWNfY29tbWFuZChzZWxmKToKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LWxvY2FscyddKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5hcmdzID0gXCgxLCAyLCAzXClcbi4qIikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19QWVVQX1BZRE9XTiwgInRlc3QgcmVxdWlyZXMgcHktdXAvcHktZG93biBjb21tYW5kcyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihweXRob25faXNfb3B0aW1pemVkKCksCisgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIHdhcyBjb21waWxlZCB3aXRoIG9wdGltaXphdGlvbnMiKQorICAgIGRlZiB0ZXN0X2xvY2Fsc19hZnRlcl91cChzZWxmKToKKyAgICAgICAgYnQgPSBzZWxmLmdldF9zdGFja190cmFjZShzY3JpcHQ9c2VsZi5nZXRfc2FtcGxlX3NjcmlwdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHNfYWZ0ZXJfYnJlYWtwb2ludD1bJ3B5LXVwJywgJ3B5LWxvY2FscyddKQorICAgICAgICBzZWxmLmFzc2VydE11bHRpbGluZU1hdGNoZXMoYnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIi4qXG5hID0gMVxuYiA9IDJcbmMgPSAzXG4uKiIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoUHJldHR5UHJpbnRUZXN0cywKKyAgICAgICAgICAgICAgICAgUHlMaXN0VGVzdHMsCisgICAgICAgICAgICAgICAgIFN0YWNrTmF2aWdhdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICBQeUJ0VGVzdHMsCisgICAgICAgICAgICAgICAgIFB5UHJpbnRUZXN0cywKKyAgICAgICAgICAgICAgICAgUHlMb2NhbHNUZXN0cworICAgICAgICAgICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzhjMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMzhjMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYm0ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGJtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTY5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZGJtLnB5CkBAIC0wLDAgKzEsODIgQEAKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdCwgdW5saW5rLCBpbXBvcnRfbW9kdWxlCitnZGJtID0gaW1wb3J0X21vZHVsZSgnZ2RibScpCisKKworZmlsZW5hbWUgPSBURVNURk4KKworY2xhc3MgVGVzdEdkYm0odW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmcgPSBOb25lCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZy5jbG9zZSgpCisgICAgICAgIHVubGluayhmaWxlbmFtZSkKKworICAgIGRlZiB0ZXN0X2tleV9tZXRob2RzKHNlbGYpOgorICAgICAgICBzZWxmLmcgPSBnZGJtLm9wZW4oZmlsZW5hbWUsICdjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmcua2V5cygpLCBbXSkKKyAgICAgICAgc2VsZi5nWydhJ10gPSAnYicKKyAgICAgICAgc2VsZi5nWycxMjM0NTY3ODkxMCddID0gJzAxOTIzNzQxMDk4MjM0MDkxMjg0MDE5ODI0MicKKyAgICAgICAga2V5X3NldCA9IHNldChzZWxmLmcua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleV9zZXQsIGZyb3plbnNldChbJ2EnLCAnMTIzNDU2Nzg5MTAnXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmcuaGFzX2tleSgnYScpKQorICAgICAgICBrZXkgPSBzZWxmLmcuZmlyc3RrZXkoKQorICAgICAgICB3aGlsZSBrZXk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGtleSwga2V5X3NldCkKKyAgICAgICAgICAgIGtleV9zZXQucmVtb3ZlKGtleSkKKyAgICAgICAgICAgIGtleSA9IHNlbGYuZy5uZXh0a2V5KGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5nWyd4eHgnXSkKKworICAgIGRlZiB0ZXN0X2Vycm9yX2NvbmRpdGlvbnMoc2VsZik6CisgICAgICAgICMgVHJ5IHRvIG9wZW4gYSBub24tZXhpc3RlbnQgZGF0YWJhc2UuCisgICAgICAgIHVubGluayhmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZ2RibS5lcnJvciwgZ2RibS5vcGVuLCBmaWxlbmFtZSwgJ3InKQorICAgICAgICAjIFRyeSB0byBhY2Nlc3MgYSBjbG9zZWQgZGF0YWJhc2UuCisgICAgICAgIHNlbGYuZyA9IGdkYm0ub3BlbihmaWxlbmFtZSwgJ2MnKQorICAgICAgICBzZWxmLmcuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhnZGJtLmVycm9yLCBsYW1iZGE6IHNlbGYuZ1snYSddKQorICAgICAgICAjIHRyeSBwYXNzIGFuIGludmFsaWQgb3BlbiBmbGFnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGdkYm0uZXJyb3IsIGxhbWJkYTogZ2RibS5vcGVuKGZpbGVuYW1lLCAncngnKS5jbG9zZSgpKQorCisgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgZmxhZyBwYXJhbWV0ZXIgb3BlbigpIGJ5IHRyeWluZyBhbGwgc3VwcG9ydGVkIGZsYWcgbW9kZXMuCisgICAgICAgIGFsbCA9IHNldChnZGJtLm9wZW5fZmxhZ3MpCisgICAgICAgICMgVGVzdCBzdGFuZGFyZCBmbGFncyAocHJlc3VtYWJseSAiY3J3biIpLgorICAgICAgICBtb2RlcyA9IGFsbCAtIHNldCgnZnN1JykKKyAgICAgICAgZm9yIG1vZGUgaW4gc29ydGVkKG1vZGVzKToKKyAgICAgICAgICAgIHNlbGYuZyA9IGdkYm0ub3BlbihmaWxlbmFtZSwgbW9kZSkKKyAgICAgICAgICAgIHNlbGYuZy5jbG9zZSgpCisKKyAgICAgICAgIyBUZXN0IGFkZGl0aW9uYWwgZmxhZ3MgKHByZXN1bWFibHkgImZzdSIpLgorICAgICAgICBmbGFncyA9IGFsbCAtIHNldCgnY3J3bicpCisgICAgICAgIGZvciBtb2RlIGluIG1vZGVzOgorICAgICAgICAgICAgZm9yIGZsYWcgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5nID0gZ2RibS5vcGVuKGZpbGVuYW1lLCBtb2RlICsgZmxhZykKKyAgICAgICAgICAgICAgICBzZWxmLmcuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfcmVvcmdhbml6ZShzZWxmKToKKyAgICAgICAgc2VsZi5nID0gZ2RibS5vcGVuKGZpbGVuYW1lLCAnYycpCisgICAgICAgIHNpemUwID0gb3MucGF0aC5nZXRzaXplKGZpbGVuYW1lKQorCisgICAgICAgIHNlbGYuZ1sneCddID0gJ3gnICogMTAwMDAKKyAgICAgICAgc2l6ZTEgPSBvcy5wYXRoLmdldHNpemUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplMCA8IHNpemUxKQorCisgICAgICAgIGRlbCBzZWxmLmdbJ3gnXQorICAgICAgICAjICdzaXplJyBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBldmVuIGFmdGVyIGRlbGV0aW5nIGFuIGVudHJ5LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguZ2V0c2l6ZShmaWxlbmFtZSksIHNpemUxKQorCisgICAgICAgIHNlbGYuZy5yZW9yZ2FuaXplKCkKKyAgICAgICAgc2l6ZTIgPSBvcy5wYXRoLmdldHNpemUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplMSA+IHNpemUyID49IHNpemUwKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEdkYm0pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYm0ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RibS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ODJhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYm0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYm0ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2RibS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0ODJhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dkYm0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3Mzk5ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CkBAIC0wLDAgKzEsMTkwNyBAQAordHV0b3JpYWxfdGVzdHMgPSAiIiIKK0xldCdzIHRyeSBhIHNpbXBsZSBnZW5lcmF0b3I6CisKKyAgICA+Pj4gZGVmIGYoKToKKyAgICAuLi4gICAgeWllbGQgMQorICAgIC4uLiAgICB5aWVsZCAyCisKKyAgICA+Pj4gZm9yIGkgaW4gZigpOgorICAgIC4uLiAgICAgcHJpbnQgaQorICAgIDEKKyAgICAyCisgICAgPj4+IGcgPSBmKCkKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICAxCisgICAgPj4+IGcubmV4dCgpCisgICAgMgorCisiRmFsbGluZyBvZmYgdGhlIGVuZCIgc3RvcHMgdGhlIGdlbmVyYXRvcjoKKworICAgID4+PiBnLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDIsIGluIGcKKyAgICBTdG9wSXRlcmF0aW9uCisKKyJyZXR1cm4iIGFsc28gc3RvcHMgdGhlIGdlbmVyYXRvcjoKKworICAgID4+PiBkZWYgZigpOgorICAgIC4uLiAgICAgeWllbGQgMQorICAgIC4uLiAgICAgcmV0dXJuCisgICAgLi4uICAgICB5aWVsZCAyICMgbmV2ZXIgcmVhY2hlZAorICAgIC4uLgorICAgID4+PiBnID0gZigpCisgICAgPj4+IGcubmV4dCgpCisgICAgMQorICAgID4+PiBnLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDMsIGluIGYKKyAgICBTdG9wSXRlcmF0aW9uCisgICAgPj4+IGcubmV4dCgpICMgb25jZSBzdG9wcGVkLCBjYW4ndCBiZSByZXN1bWVkCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICAgIFN0b3BJdGVyYXRpb24KKworInJhaXNlIFN0b3BJdGVyYXRpb24iIHN0b3BzIHRoZSBnZW5lcmF0b3IgdG9vOgorCisgICAgPj4+IGRlZiBmKCk6CisgICAgLi4uICAgICB5aWVsZCAxCisgICAgLi4uICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgLi4uICAgICB5aWVsZCAyICMgbmV2ZXIgcmVhY2hlZAorICAgIC4uLgorICAgID4+PiBnID0gZigpCisgICAgPj4+IGcubmV4dCgpCisgICAgMQorICAgID4+PiBnLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KKyAgICBTdG9wSXRlcmF0aW9uCisgICAgPj4+IGcubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPworICAgIFN0b3BJdGVyYXRpb24KKworSG93ZXZlciwgdGhleSBhcmUgbm90IGV4YWN0bHkgZXF1aXZhbGVudDoKKworICAgID4+PiBkZWYgZzEoKToKKyAgICAuLi4gICAgIHRyeToKKyAgICAuLi4gICAgICAgICByZXR1cm4KKyAgICAuLi4gICAgIGV4Y2VwdDoKKyAgICAuLi4gICAgICAgICB5aWVsZCAxCisgICAgLi4uCisgICAgPj4+IGxpc3QoZzEoKSkKKyAgICBbXQorCisgICAgPj4+IGRlZiBnMigpOgorICAgIC4uLiAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAuLi4gICAgIGV4Y2VwdDoKKyAgICAuLi4gICAgICAgICB5aWVsZCA0MgorICAgID4+PiBwcmludCBsaXN0KGcyKCkpCisgICAgWzQyXQorCitUaGlzIG1heSBiZSBzdXJwcmlzaW5nIGF0IGZpcnN0OgorCisgICAgPj4+IGRlZiBnMygpOgorICAgIC4uLiAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgIHJldHVybgorICAgIC4uLiAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICB5aWVsZCAxCisgICAgLi4uCisgICAgPj4+IGxpc3QoZzMoKSkKKyAgICBbMV0KKworTGV0J3MgY3JlYXRlIGFuIGFsdGVybmF0ZSByYW5nZSgpIGZ1bmN0aW9uIGltcGxlbWVudGVkIGFzIGEgZ2VuZXJhdG9yOgorCisgICAgPj4+IGRlZiB5cmFuZ2Uobik6CisgICAgLi4uICAgICBmb3IgaSBpbiByYW5nZShuKToKKyAgICAuLi4gICAgICAgICB5aWVsZCBpCisgICAgLi4uCisgICAgPj4+IGxpc3QoeXJhbmdlKDUpKQorICAgIFswLCAxLCAyLCAzLCA0XQorCitHZW5lcmF0b3JzIGFsd2F5cyByZXR1cm4gdG8gdGhlIG1vc3QgcmVjZW50IGNhbGxlcjoKKworICAgID4+PiBkZWYgY3JlYXRvcigpOgorICAgIC4uLiAgICAgciA9IHlyYW5nZSg1KQorICAgIC4uLiAgICAgcHJpbnQgImNyZWF0b3IiLCByLm5leHQoKQorICAgIC4uLiAgICAgcmV0dXJuIHIKKyAgICAuLi4KKyAgICA+Pj4gZGVmIGNhbGxlcigpOgorICAgIC4uLiAgICAgciA9IGNyZWF0b3IoKQorICAgIC4uLiAgICAgZm9yIGkgaW4gcjoKKyAgICAuLi4gICAgICAgICAgICAgcHJpbnQgImNhbGxlciIsIGkKKyAgICAuLi4KKyAgICA+Pj4gY2FsbGVyKCkKKyAgICBjcmVhdG9yIDAKKyAgICBjYWxsZXIgMQorICAgIGNhbGxlciAyCisgICAgY2FsbGVyIDMKKyAgICBjYWxsZXIgNAorCitHZW5lcmF0b3JzIGNhbiBjYWxsIG90aGVyIGdlbmVyYXRvcnM6CisKKyAgICA+Pj4gZGVmIHpyYW5nZShuKToKKyAgICAuLi4gICAgIGZvciBpIGluIHlyYW5nZShuKToKKyAgICAuLi4gICAgICAgICB5aWVsZCBpCisgICAgLi4uCisgICAgPj4+IGxpc3QoenJhbmdlKDUpKQorICAgIFswLCAxLCAyLCAzLCA0XQorCisiIiIKKworIyBUaGUgZXhhbXBsZXMgZnJvbSBQRVAgMjU1LgorCitwZXBfdGVzdHMgPSAiIiIKKworU3BlY2lmaWNhdGlvbjogIFlpZWxkCisKKyAgICBSZXN0cmljdGlvbjogIEEgZ2VuZXJhdG9yIGNhbm5vdCBiZSByZXN1bWVkIHdoaWxlIGl0IGlzIGFjdGl2ZWx5CisgICAgcnVubmluZzoKKworICAgID4+PiBkZWYgZygpOgorICAgIC4uLiAgICAgaSA9IG1lLm5leHQoKQorICAgIC4uLiAgICAgeWllbGQgaQorICAgID4+PiBtZSA9IGcoKQorICAgID4+PiBtZS5uZXh0KCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIC4uLgorICAgICAgRmlsZSAiPHN0cmluZz4iLCBsaW5lIDIsIGluIGcKKyAgICBWYWx1ZUVycm9yOiBnZW5lcmF0b3IgYWxyZWFkeSBleGVjdXRpbmcKKworU3BlY2lmaWNhdGlvbjogUmV0dXJuCisKKyAgICBOb3RlIHRoYXQgcmV0dXJuIGlzbid0IGFsd2F5cyBlcXVpdmFsZW50IHRvIHJhaXNpbmcgU3RvcEl0ZXJhdGlvbjogIHRoZQorICAgIGRpZmZlcmVuY2UgbGllcyBpbiBob3cgZW5jbG9zaW5nIHRyeS9leGNlcHQgY29uc3RydWN0cyBhcmUgdHJlYXRlZC4KKyAgICBGb3IgZXhhbXBsZSwKKworICAgICAgICA+Pj4gZGVmIGYxKCk6CisgICAgICAgIC4uLiAgICAgdHJ5OgorICAgICAgICAuLi4gICAgICAgICByZXR1cm4KKyAgICAgICAgLi4uICAgICBleGNlcHQ6CisgICAgICAgIC4uLiAgICAgICAgeWllbGQgMQorICAgICAgICA+Pj4gcHJpbnQgbGlzdChmMSgpKQorICAgICAgICBbXQorCisgICAgYmVjYXVzZSwgYXMgaW4gYW55IGZ1bmN0aW9uLCByZXR1cm4gc2ltcGx5IGV4aXRzLCBidXQKKworICAgICAgICA+Pj4gZGVmIGYyKCk6CisgICAgICAgIC4uLiAgICAgdHJ5OgorICAgICAgICAuLi4gICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIC4uLiAgICAgZXhjZXB0OgorICAgICAgICAuLi4gICAgICAgICB5aWVsZCA0MgorICAgICAgICA+Pj4gcHJpbnQgbGlzdChmMigpKQorICAgICAgICBbNDJdCisKKyAgICBiZWNhdXNlIFN0b3BJdGVyYXRpb24gaXMgY2FwdHVyZWQgYnkgYSBiYXJlICJleGNlcHQiLCBhcyBpcyBhbnkKKyAgICBleGNlcHRpb24uCisKK1NwZWNpZmljYXRpb246IEdlbmVyYXRvcnMgYW5kIEV4Y2VwdGlvbiBQcm9wYWdhdGlvbgorCisgICAgPj4+IGRlZiBmKCk6CisgICAgLi4uICAgICByZXR1cm4gMS8vMAorICAgID4+PiBkZWYgZygpOgorICAgIC4uLiAgICAgeWllbGQgZigpICAjIHRoZSB6ZXJvIGRpdmlzaW9uIGV4Y2VwdGlvbiBwcm9wYWdhdGVzCisgICAgLi4uICAgICB5aWVsZCA0MiAgICMgYW5kIHdlJ2xsIG5ldmVyIGdldCBoZXJlCisgICAgPj4+IGsgPSBnKCkKKyAgICA+Pj4gay5uZXh0KCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiBnCisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAyLCBpbiBmCisgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KKyAgICA+Pj4gay5uZXh0KCkgICMgYW5kIHRoZSBnZW5lcmF0b3IgY2Fubm90IGJlIHJlc3VtZWQKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CisgICAgU3RvcEl0ZXJhdGlvbgorICAgID4+PgorCitTcGVjaWZpY2F0aW9uOiBUcnkvRXhjZXB0L0ZpbmFsbHkKKworICAgID4+PiBkZWYgZigpOgorICAgIC4uLiAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgIHlpZWxkIDEKKyAgICAuLi4gICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgIHlpZWxkIDIKKyAgICAuLi4gICAgICAgICAgICAgMS8vMAorICAgIC4uLiAgICAgICAgICAgICB5aWVsZCAzICAjIG5ldmVyIGdldCBoZXJlCisgICAgLi4uICAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgIC4uLiAgICAgICAgICAgICB5aWVsZCA0CisgICAgLi4uICAgICAgICAgICAgIHlpZWxkIDUKKyAgICAuLi4gICAgICAgICAgICAgcmFpc2UKKyAgICAuLi4gICAgICAgICBleGNlcHQ6CisgICAgLi4uICAgICAgICAgICAgIHlpZWxkIDYKKyAgICAuLi4gICAgICAgICB5aWVsZCA3ICAgICAjIHRoZSAicmFpc2UiIGFib3ZlIHN0b3BzIHRoaXMKKyAgICAuLi4gICAgIGV4Y2VwdDoKKyAgICAuLi4gICAgICAgICB5aWVsZCA4CisgICAgLi4uICAgICB5aWVsZCA5CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgeCA9IDEyCisgICAgLi4uICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgIHlpZWxkIDEwCisgICAgLi4uICAgICB5aWVsZCAxMQorICAgID4+PiBwcmludCBsaXN0KGYoKSkKKyAgICBbMSwgMiwgNCwgNSwgOCwgOSwgMTAsIDExXQorICAgID4+PgorCitHdWlkbydzIGJpbmFyeSB0cmVlIGV4YW1wbGUuCisKKyAgICA+Pj4gIyBBIGJpbmFyeSB0cmVlIGNsYXNzLgorICAgID4+PiBjbGFzcyBUcmVlOgorICAgIC4uLgorICAgIC4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxhYmVsLCBsZWZ0PU5vbmUsIHJpZ2h0PU5vbmUpOgorICAgIC4uLiAgICAgICAgIHNlbGYubGFiZWwgPSBsYWJlbAorICAgIC4uLiAgICAgICAgIHNlbGYubGVmdCA9IGxlZnQKKyAgICAuLi4gICAgICAgICBzZWxmLnJpZ2h0ID0gcmlnaHQKKyAgICAuLi4KKyAgICAuLi4gICAgIGRlZiBfX3JlcHJfXyhzZWxmLCBsZXZlbD0wLCBpbmRlbnQ9IiAgICAiKToKKyAgICAuLi4gICAgICAgICBzID0gbGV2ZWwqaW5kZW50ICsgcmVwcihzZWxmLmxhYmVsKQorICAgIC4uLiAgICAgICAgIGlmIHNlbGYubGVmdDoKKyAgICAuLi4gICAgICAgICAgICAgcyA9IHMgKyAiXFxuIiArIHNlbGYubGVmdC5fX3JlcHJfXyhsZXZlbCsxLCBpbmRlbnQpCisgICAgLi4uICAgICAgICAgaWYgc2VsZi5yaWdodDoKKyAgICAuLi4gICAgICAgICAgICAgcyA9IHMgKyAiXFxuIiArIHNlbGYucmlnaHQuX19yZXByX18obGV2ZWwrMSwgaW5kZW50KQorICAgIC4uLiAgICAgICAgIHJldHVybiBzCisgICAgLi4uCisgICAgLi4uICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgLi4uICAgICAgICAgcmV0dXJuIGlub3JkZXIoc2VsZikKKworICAgID4+PiAjIENyZWF0ZSBhIFRyZWUgZnJvbSBhIGxpc3QuCisgICAgPj4+IGRlZiB0cmVlKGxpc3QpOgorICAgIC4uLiAgICAgbiA9IGxlbihsaXN0KQorICAgIC4uLiAgICAgaWYgbiA9PSAwOgorICAgIC4uLiAgICAgICAgIHJldHVybiBbXQorICAgIC4uLiAgICAgaSA9IG4gLy8gMgorICAgIC4uLiAgICAgcmV0dXJuIFRyZWUobGlzdFtpXSwgdHJlZShsaXN0WzppXSksIHRyZWUobGlzdFtpKzE6XSkpCisKKyAgICA+Pj4gIyBTaG93IGl0IG9mZjogY3JlYXRlIGEgdHJlZS4KKyAgICA+Pj4gdCA9IHRyZWUoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikKKworICAgID4+PiAjIEEgcmVjdXJzaXZlIGdlbmVyYXRvciB0aGF0IGdlbmVyYXRlcyBUcmVlIGxhYmVscyBpbiBpbi1vcmRlci4KKyAgICA+Pj4gZGVmIGlub3JkZXIodCk6CisgICAgLi4uICAgICBpZiB0OgorICAgIC4uLiAgICAgICAgIGZvciB4IGluIGlub3JkZXIodC5sZWZ0KToKKyAgICAuLi4gICAgICAgICAgICAgeWllbGQgeAorICAgIC4uLiAgICAgICAgIHlpZWxkIHQubGFiZWwKKyAgICAuLi4gICAgICAgICBmb3IgeCBpbiBpbm9yZGVyKHQucmlnaHQpOgorICAgIC4uLiAgICAgICAgICAgICB5aWVsZCB4CisKKyAgICA+Pj4gIyBTaG93IGl0IG9mZjogY3JlYXRlIGEgdHJlZS4KKyAgICA+Pj4gdCA9IHRyZWUoIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIikKKyAgICA+Pj4gIyBQcmludCB0aGUgbm9kZXMgb2YgdGhlIHRyZWUgaW4gaW4tb3JkZXIuCisgICAgPj4+IGZvciB4IGluIHQ6CisgICAgLi4uICAgICBwcmludCB4LAorICAgIEEgQiBDIEQgRSBGIEcgSCBJIEogSyBMIE0gTiBPIFAgUSBSIFMgVCBVIFYgVyBYIFkgWgorCisgICAgPj4+ICMgQSBub24tcmVjdXJzaXZlIGdlbmVyYXRvci4KKyAgICA+Pj4gZGVmIGlub3JkZXIobm9kZSk6CisgICAgLi4uICAgICBzdGFjayA9IFtdCisgICAgLi4uICAgICB3aGlsZSBub2RlOgorICAgIC4uLiAgICAgICAgIHdoaWxlIG5vZGUubGVmdDoKKyAgICAuLi4gICAgICAgICAgICAgc3RhY2suYXBwZW5kKG5vZGUpCisgICAgLi4uICAgICAgICAgICAgIG5vZGUgPSBub2RlLmxlZnQKKyAgICAuLi4gICAgICAgICB5aWVsZCBub2RlLmxhYmVsCisgICAgLi4uICAgICAgICAgd2hpbGUgbm90IG5vZGUucmlnaHQ6CisgICAgLi4uICAgICAgICAgICAgIHRyeToKKyAgICAuLi4gICAgICAgICAgICAgICAgIG5vZGUgPSBzdGFjay5wb3AoKQorICAgIC4uLiAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAuLi4gICAgICAgICAgICAgICAgIHJldHVybgorICAgIC4uLiAgICAgICAgICAgICB5aWVsZCBub2RlLmxhYmVsCisgICAgLi4uICAgICAgICAgbm9kZSA9IG5vZGUucmlnaHQKKworICAgID4+PiAjIEV4ZXJjaXNlIHRoZSBub24tcmVjdXJzaXZlIGdlbmVyYXRvci4KKyAgICA+Pj4gZm9yIHggaW4gdDoKKyAgICAuLi4gICAgIHByaW50IHgsCisgICAgQSBCIEMgRCBFIEYgRyBIIEkgSiBLIEwgTSBOIE8gUCBRIFIgUyBUIFUgViBXIFggWSBaCisKKyIiIgorCisjIEV4YW1wbGVzIGZyb20gSXRlcmF0b3ItTGlzdCBhbmQgUHl0aG9uLURldiBhbmQgYy5sLnB5LgorCitlbWFpbF90ZXN0cyA9ICIiIgorCitUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHlpZWxkaW5nIE5vbmUgYW5kIHJldHVybmluZyBpdC4KKworPj4+IGRlZiBnKCk6CisuLi4gICAgIGZvciBpIGluIHJhbmdlKDMpOgorLi4uICAgICAgICAgeWllbGQgTm9uZQorLi4uICAgICB5aWVsZCBOb25lCisuLi4gICAgIHJldHVybgorPj4+IGxpc3QoZygpKQorW05vbmUsIE5vbmUsIE5vbmUsIE5vbmVdCisKK0Vuc3VyZSB0aGF0IGV4cGxpY2l0bHkgcmFpc2luZyBTdG9wSXRlcmF0aW9uIGFjdHMgbGlrZSBhbnkgb3RoZXIgZXhjZXB0aW9uCitpbiB0cnkvZXhjZXB0LCBub3QgbGlrZSBhIHJldHVybi4KKworPj4+IGRlZiBnKCk6CisuLi4gICAgIHlpZWxkIDEKKy4uLiAgICAgdHJ5OgorLi4uICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorLi4uICAgICBleGNlcHQ6CisuLi4gICAgICAgICB5aWVsZCAyCisuLi4gICAgIHlpZWxkIDMKKz4+PiBsaXN0KGcoKSkKK1sxLCAyLCAzXQorCitOZXh0IG9uZSB3YXMgcG9zdGVkIHRvIGMubC5weS4KKworPj4+IGRlZiBnY29tYih4LCBrKToKKy4uLiAgICAgIkdlbmVyYXRlIGFsbCBjb21iaW5hdGlvbnMgb2YgayBlbGVtZW50cyBmcm9tIGxpc3QgeC4iCisuLi4KKy4uLiAgICAgaWYgayA+IGxlbih4KToKKy4uLiAgICAgICAgIHJldHVybgorLi4uICAgICBpZiBrID09IDA6CisuLi4gICAgICAgICB5aWVsZCBbXQorLi4uICAgICBlbHNlOgorLi4uICAgICAgICAgZmlyc3QsIHJlc3QgPSB4WzBdLCB4WzE6XQorLi4uICAgICAgICAgIyBBIGNvbWJpbmF0aW9uIGRvZXMgb3IgZG9lc24ndCBjb250YWluIGZpcnN0LgorLi4uICAgICAgICAgIyBJZiBpdCBkb2VzLCB0aGUgcmVtYWluZGVyIGlzIGEgay0xIGNvbWIgb2YgcmVzdC4KKy4uLiAgICAgICAgIGZvciBjIGluIGdjb21iKHJlc3QsIGstMSk6CisuLi4gICAgICAgICAgICAgYy5pbnNlcnQoMCwgZmlyc3QpCisuLi4gICAgICAgICAgICAgeWllbGQgYworLi4uICAgICAgICAgIyBJZiBpdCBkb2Vzbid0IGNvbnRhaW4gZmlyc3QsIGl0J3MgYSBrIGNvbWIgb2YgcmVzdC4KKy4uLiAgICAgICAgIGZvciBjIGluIGdjb21iKHJlc3QsIGspOgorLi4uICAgICAgICAgICAgIHlpZWxkIGMKKworPj4+IHNlcSA9IHJhbmdlKDEsIDUpCis+Pj4gZm9yIGsgaW4gcmFuZ2UobGVuKHNlcSkgKyAyKToKKy4uLiAgICAgcHJpbnQgIiVkLWNvbWJzIG9mICVzOiIgJSAoaywgc2VxKQorLi4uICAgICBmb3IgYyBpbiBnY29tYihzZXEsIGspOgorLi4uICAgICAgICAgcHJpbnQgIiAgICIsIGMKKzAtY29tYnMgb2YgWzEsIDIsIDMsIDRdOgorICAgIFtdCisxLWNvbWJzIG9mIFsxLCAyLCAzLCA0XToKKyAgICBbMV0KKyAgICBbMl0KKyAgICBbM10KKyAgICBbNF0KKzItY29tYnMgb2YgWzEsIDIsIDMsIDRdOgorICAgIFsxLCAyXQorICAgIFsxLCAzXQorICAgIFsxLCA0XQorICAgIFsyLCAzXQorICAgIFsyLCA0XQorICAgIFszLCA0XQorMy1jb21icyBvZiBbMSwgMiwgMywgNF06CisgICAgWzEsIDIsIDNdCisgICAgWzEsIDIsIDRdCisgICAgWzEsIDMsIDRdCisgICAgWzIsIDMsIDRdCis0LWNvbWJzIG9mIFsxLCAyLCAzLCA0XToKKyAgICBbMSwgMiwgMywgNF0KKzUtY29tYnMgb2YgWzEsIDIsIDMsIDRdOgorCitGcm9tIHRoZSBJdGVyYXRvcnMgbGlzdCwgYWJvdXQgdGhlIHR5cGVzIG9mIHRoZXNlIHRoaW5ncy4KKworPj4+IGRlZiBnKCk6CisuLi4gICAgIHlpZWxkIDEKKy4uLgorPj4+IHR5cGUoZykKKzx0eXBlICdmdW5jdGlvbic+Cis+Pj4gaSA9IGcoKQorPj4+IHR5cGUoaSkKKzx0eXBlICdnZW5lcmF0b3InPgorPj4+IFtzIGZvciBzIGluIGRpcihpKSBpZiBub3Qgcy5zdGFydHN3aXRoKCdfJyldCitbJ2Nsb3NlJywgJ2dpX2NvZGUnLCAnZ2lfZnJhbWUnLCAnZ2lfcnVubmluZycsICduZXh0JywgJ3NlbmQnLCAndGhyb3cnXQorPj4+IGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IEhBVkVfRE9DU1RSSU5HUworPj4+IHByaW50KGkubmV4dC5fX2RvY19fIGlmIEhBVkVfRE9DU1RSSU5HUyBlbHNlICd4Lm5leHQoKSAtPiB0aGUgbmV4dCB2YWx1ZSwgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbicpCit4Lm5leHQoKSAtPiB0aGUgbmV4dCB2YWx1ZSwgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbgorPj4+IGl0ZXIoaSkgaXMgaQorVHJ1ZQorPj4+IGltcG9ydCB0eXBlcworPj4+IGlzaW5zdGFuY2UoaSwgdHlwZXMuR2VuZXJhdG9yVHlwZSkKK1RydWUKKworQW5kIG1vcmUsIGFkZGVkIGxhdGVyLgorCis+Pj4gaS5naV9ydW5uaW5nCiswCis+Pj4gdHlwZShpLmdpX2ZyYW1lKQorPHR5cGUgJ2ZyYW1lJz4KKz4+PiBpLmdpX3J1bm5pbmcgPSA0MgorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KK1R5cGVFcnJvcjogcmVhZG9ubHkgYXR0cmlidXRlCis+Pj4gZGVmIGcoKToKKy4uLiAgICAgeWllbGQgbWUuZ2lfcnVubmluZworPj4+IG1lID0gZygpCis+Pj4gbWUuZ2lfcnVubmluZworMAorPj4+IG1lLm5leHQoKQorMQorPj4+IG1lLmdpX3J1bm5pbmcKKzAKKworQSBjbGV2ZXIgdW5pb24tZmluZCBpbXBsZW1lbnRhdGlvbiBmcm9tIGMubC5weSwgZHVlIHRvIERhdmlkIEVwcHN0ZWluLgorU2VudDogRnJpZGF5LCBKdW5lIDI5LCAyMDAxIDEyOjE2IFBNCitUbzogcHl0aG9uLWxpc3RAcHl0aG9uLm9yZworU3ViamVjdDogUmU6IFBFUCAyNTU6IFNpbXBsZSBHZW5lcmF0b3JzCisKKz4+PiBjbGFzcyBkaXNqb2ludFNldDoKKy4uLiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUpOgorLi4uICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorLi4uICAgICAgICAgc2VsZi5wYXJlbnQgPSBOb25lCisuLi4gICAgICAgICBzZWxmLmdlbmVyYXRvciA9IHNlbGYuZ2VuZXJhdGUoKQorLi4uCisuLi4gICAgIGRlZiBnZW5lcmF0ZShzZWxmKToKKy4uLiAgICAgICAgIHdoaWxlIG5vdCBzZWxmLnBhcmVudDoKKy4uLiAgICAgICAgICAgICB5aWVsZCBzZWxmCisuLi4gICAgICAgICBmb3IgeCBpbiBzZWxmLnBhcmVudC5nZW5lcmF0b3I6CisuLi4gICAgICAgICAgICAgeWllbGQgeAorLi4uCisuLi4gICAgIGRlZiBmaW5kKHNlbGYpOgorLi4uICAgICAgICAgcmV0dXJuIHNlbGYuZ2VuZXJhdG9yLm5leHQoKQorLi4uCisuLi4gICAgIGRlZiB1bmlvbihzZWxmLCBwYXJlbnQpOgorLi4uICAgICAgICAgaWYgc2VsZi5wYXJlbnQ6CisuLi4gICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiU29ycnksIEknbSBub3QgYSByb290ISIpCisuLi4gICAgICAgICBzZWxmLnBhcmVudCA9IHBhcmVudAorLi4uCisuLi4gICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorLi4uICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorCis+Pj4gbmFtZXMgPSAiQUJDREVGR0hJSktMTSIKKz4+PiBzZXRzID0gW2Rpc2pvaW50U2V0KG5hbWUpIGZvciBuYW1lIGluIG5hbWVzXQorPj4+IHJvb3RzID0gc2V0c1s6XQorCis+Pj4gaW1wb3J0IHJhbmRvbQorPj4+IGdlbiA9IHJhbmRvbS5XaWNobWFubkhpbGwoNDIpCis+Pj4gd2hpbGUgMToKKy4uLiAgICAgZm9yIHMgaW4gc2V0czoKKy4uLiAgICAgICAgIHByaW50ICIlcy0+JXMiICUgKHMsIHMuZmluZCgpKSwKKy4uLiAgICAgcHJpbnQKKy4uLiAgICAgaWYgbGVuKHJvb3RzKSA+IDE6CisuLi4gICAgICAgICBzMSA9IGdlbi5jaG9pY2Uocm9vdHMpCisuLi4gICAgICAgICByb290cy5yZW1vdmUoczEpCisuLi4gICAgICAgICBzMiA9IGdlbi5jaG9pY2Uocm9vdHMpCisuLi4gICAgICAgICBzMS51bmlvbihzMikKKy4uLiAgICAgICAgIHByaW50ICJtZXJnZWQiLCBzMSwgImludG8iLCBzMgorLi4uICAgICBlbHNlOgorLi4uICAgICAgICAgYnJlYWsKK0EtPkEgQi0+QiBDLT5DIEQtPkQgRS0+RSBGLT5GIEctPkcgSC0+SCBJLT5JIEotPkogSy0+SyBMLT5MIE0tPk0KK21lcmdlZCBEIGludG8gRworQS0+QSBCLT5CIEMtPkMgRC0+RyBFLT5FIEYtPkYgRy0+RyBILT5IIEktPkkgSi0+SiBLLT5LIEwtPkwgTS0+TQorbWVyZ2VkIEMgaW50byBGCitBLT5BIEItPkIgQy0+RiBELT5HIEUtPkUgRi0+RiBHLT5HIEgtPkggSS0+SSBKLT5KIEstPksgTC0+TCBNLT5NCittZXJnZWQgTCBpbnRvIEEKK0EtPkEgQi0+QiBDLT5GIEQtPkcgRS0+RSBGLT5GIEctPkcgSC0+SCBJLT5JIEotPkogSy0+SyBMLT5BIE0tPk0KK21lcmdlZCBIIGludG8gRQorQS0+QSBCLT5CIEMtPkYgRC0+RyBFLT5FIEYtPkYgRy0+RyBILT5FIEktPkkgSi0+SiBLLT5LIEwtPkEgTS0+TQorbWVyZ2VkIEIgaW50byBFCitBLT5BIEItPkUgQy0+RiBELT5HIEUtPkUgRi0+RiBHLT5HIEgtPkUgSS0+SSBKLT5KIEstPksgTC0+QSBNLT5NCittZXJnZWQgSiBpbnRvIEcKK0EtPkEgQi0+RSBDLT5GIEQtPkcgRS0+RSBGLT5GIEctPkcgSC0+RSBJLT5JIEotPkcgSy0+SyBMLT5BIE0tPk0KK21lcmdlZCBFIGludG8gRworQS0+QSBCLT5HIEMtPkYgRC0+RyBFLT5HIEYtPkYgRy0+RyBILT5HIEktPkkgSi0+RyBLLT5LIEwtPkEgTS0+TQorbWVyZ2VkIE0gaW50byBHCitBLT5BIEItPkcgQy0+RiBELT5HIEUtPkcgRi0+RiBHLT5HIEgtPkcgSS0+SSBKLT5HIEstPksgTC0+QSBNLT5HCittZXJnZWQgSSBpbnRvIEsKK0EtPkEgQi0+RyBDLT5GIEQtPkcgRS0+RyBGLT5GIEctPkcgSC0+RyBJLT5LIEotPkcgSy0+SyBMLT5BIE0tPkcKK21lcmdlZCBLIGludG8gQQorQS0+QSBCLT5HIEMtPkYgRC0+RyBFLT5HIEYtPkYgRy0+RyBILT5HIEktPkEgSi0+RyBLLT5BIEwtPkEgTS0+RworbWVyZ2VkIEYgaW50byBBCitBLT5BIEItPkcgQy0+QSBELT5HIEUtPkcgRi0+QSBHLT5HIEgtPkcgSS0+QSBKLT5HIEstPkEgTC0+QSBNLT5HCittZXJnZWQgQSBpbnRvIEcKK0EtPkcgQi0+RyBDLT5HIEQtPkcgRS0+RyBGLT5HIEctPkcgSC0+RyBJLT5HIEotPkcgSy0+RyBMLT5HIE0tPkcKKworIiIiCisjIEVtYWNzIHR1cmQgJworCisjIEZ1biB0ZXN0cyAoZm9yIHN1ZmZpY2llbnRseSB3YXJwZWQgbm90aW9ucyBvZiAiZnVuIikuCisKK2Z1bl90ZXN0cyA9ICIiIgorCitCdWlsZCB1cCB0byBhIHJlY3Vyc2l2ZSBTaWV2ZSBvZiBFcmF0b3N0aGVuZXMgZ2VuZXJhdG9yLgorCis+Pj4gZGVmIGZpcnN0bihnLCBuKToKKy4uLiAgICAgcmV0dXJuIFtnLm5leHQoKSBmb3IgaSBpbiByYW5nZShuKV0KKworPj4+IGRlZiBpbnRzZnJvbShpKToKKy4uLiAgICAgd2hpbGUgMToKKy4uLiAgICAgICAgIHlpZWxkIGkKKy4uLiAgICAgICAgIGkgKz0gMQorCis+Pj4gZmlyc3RuKGludHNmcm9tKDUpLCA3KQorWzUsIDYsIDcsIDgsIDksIDEwLCAxMV0KKworPj4+IGRlZiBleGNsdWRlX211bHRpcGxlcyhuLCBpbnRzKToKKy4uLiAgICAgZm9yIGkgaW4gaW50czoKKy4uLiAgICAgICAgIGlmIGkgJSBuOgorLi4uICAgICAgICAgICAgIHlpZWxkIGkKKworPj4+IGZpcnN0bihleGNsdWRlX211bHRpcGxlcygzLCBpbnRzZnJvbSgxKSksIDYpCitbMSwgMiwgNCwgNSwgNywgOF0KKworPj4+IGRlZiBzaWV2ZShpbnRzKToKKy4uLiAgICAgcHJpbWUgPSBpbnRzLm5leHQoKQorLi4uICAgICB5aWVsZCBwcmltZQorLi4uICAgICBub3RfZGl2aXNpYmxlX2J5X3ByaW1lID0gZXhjbHVkZV9tdWx0aXBsZXMocHJpbWUsIGludHMpCisuLi4gICAgIGZvciBwIGluIHNpZXZlKG5vdF9kaXZpc2libGVfYnlfcHJpbWUpOgorLi4uICAgICAgICAgeWllbGQgcAorCis+Pj4gcHJpbWVzID0gc2lldmUoaW50c2Zyb20oMikpCis+Pj4gZmlyc3RuKHByaW1lcywgMjApCitbMiwgMywgNSwgNywgMTEsIDEzLCAxNywgMTksIDIzLCAyOSwgMzEsIDM3LCA0MSwgNDMsIDQ3LCA1MywgNTksIDYxLCA2NywgNzFdCisKKworQW5vdGhlciBmYW1vdXMgcHJvYmxlbTogIGdlbmVyYXRlIGFsbCBpbnRlZ2VycyBvZiB0aGUgZm9ybQorICAgIDIqKmkgKiAzKipqICAqIDUqKmsKK2luIGluY3JlYXNpbmcgb3JkZXIsIHdoZXJlIGksaixrID49IDAuICBUcmlja2llciB0aGFuIGl0IG1heSBsb29rIGF0IGZpcnN0IQorVHJ5IHdyaXRpbmcgaXQgd2l0aG91dCBnZW5lcmF0b3JzLCBhbmQgY29ycmVjdGx5LCBhbmQgd2l0aG91dCBnZW5lcmF0aW5nCiszIGludGVybmFsIHJlc3VsdHMgZm9yIGVhY2ggcmVzdWx0IG91dHB1dC4KKworPj4+IGRlZiB0aW1lcyhuLCBnKToKKy4uLiAgICAgZm9yIGkgaW4gZzoKKy4uLiAgICAgICAgIHlpZWxkIG4gKiBpCis+Pj4gZmlyc3RuKHRpbWVzKDEwLCBpbnRzZnJvbSgxKSksIDEwKQorWzEwLCAyMCwgMzAsIDQwLCA1MCwgNjAsIDcwLCA4MCwgOTAsIDEwMF0KKworPj4+IGRlZiBtZXJnZShnLCBoKToKKy4uLiAgICAgbmcgPSBnLm5leHQoKQorLi4uICAgICBuaCA9IGgubmV4dCgpCisuLi4gICAgIHdoaWxlIDE6CisuLi4gICAgICAgICBpZiBuZyA8IG5oOgorLi4uICAgICAgICAgICAgIHlpZWxkIG5nCisuLi4gICAgICAgICAgICAgbmcgPSBnLm5leHQoKQorLi4uICAgICAgICAgZWxpZiBuZyA+IG5oOgorLi4uICAgICAgICAgICAgIHlpZWxkIG5oCisuLi4gICAgICAgICAgICAgbmggPSBoLm5leHQoKQorLi4uICAgICAgICAgZWxzZToKKy4uLiAgICAgICAgICAgICB5aWVsZCBuZworLi4uICAgICAgICAgICAgIG5nID0gZy5uZXh0KCkKKy4uLiAgICAgICAgICAgICBuaCA9IGgubmV4dCgpCisKK1RoZSBmb2xsb3dpbmcgd29ya3MsIGJ1dCBpcyBkb2luZyBhIHdoYWxlIG9mIGEgbG90IG9mIHJlZHVuZGFudCB3b3JrIC0tCitpdCdzIG5vdCBjbGVhciBob3cgdG8gZ2V0IHRoZSBpbnRlcm5hbCB1c2VzIG9mIG0yMzUgdG8gc2hhcmUgYSBzaW5nbGUKK2dlbmVyYXRvci4gIE5vdGUgdGhhdCBtZV90aW1lczIgKGV0YykgZWFjaCBuZWVkIHRvIHNlZSBldmVyeSBlbGVtZW50IGluIHRoZQorcmVzdWx0IHNlcXVlbmNlLiAgU28gdGhpcyBpcyBhbiBleGFtcGxlIHdoZXJlIGxhenkgbGlzdHMgYXJlIG1vcmUgbmF0dXJhbAorKHlvdSBjYW4gbG9vayBhdCB0aGUgaGVhZCBvZiBhIGxhenkgbGlzdCBhbnkgbnVtYmVyIG9mIHRpbWVzKS4KKworPj4+IGRlZiBtMjM1KCk6CisuLi4gICAgIHlpZWxkIDEKKy4uLiAgICAgbWVfdGltZXMyID0gdGltZXMoMiwgbTIzNSgpKQorLi4uICAgICBtZV90aW1lczMgPSB0aW1lcygzLCBtMjM1KCkpCisuLi4gICAgIG1lX3RpbWVzNSA9IHRpbWVzKDUsIG0yMzUoKSkKKy4uLiAgICAgZm9yIGkgaW4gbWVyZ2UobWVyZ2UobWVfdGltZXMyLAorLi4uICAgICAgICAgICAgICAgICAgICAgICAgICBtZV90aW1lczMpLAorLi4uICAgICAgICAgICAgICAgICAgICBtZV90aW1lczUpOgorLi4uICAgICAgICAgeWllbGQgaQorCitEb24ndCBwcmludCAidG9vIG1hbnkiIG9mIHRoZXNlIC0tIHRoZSBpbXBsZW1lbnRhdGlvbiBhYm92ZSBpcyBleHRyZW1lbHkKK2luZWZmaWNpZW50OiAgZWFjaCBjYWxsIG9mIG0yMzUoKSBsZWFkcyB0byAzIHJlY3Vyc2l2ZSBjYWxscywgYW5kIGluCit0dXJuIGVhY2ggb2YgdGhvc2UgMyBtb3JlLCBhbmQgc28gb24sIGFuZCBzbyBvbiwgdW50aWwgd2UndmUgZGVzY2VuZGVkCitlbm91Z2ggbGV2ZWxzIHRvIHNhdGlzZnkgdGhlIHByaW50IHN0bXRzLiAgVmVyeSBvZGQ6ICB3aGVuIEkgcHJpbnRlZCA1CitsaW5lcyBvZiByZXN1bHRzIGJlbG93LCB0aGlzIG1hbmFnZWQgdG8gc2NyZXcgdXAgV2luOTgncyBtYWxsb2MgaW4gInRoZQordXN1YWwiIHdheSwgaS5lLiB0aGUgaGVhcCBncmV3IG92ZXIgNE1iIHNvIFdpbjk4IHN0YXJ0ZWQgZnJhZ21lbnRpbmcKK2FkZHJlc3Mgc3BhY2UsIGFuZCBpdCAqbG9va2VkKiBsaWtlIGEgdmVyeSBzbG93IGxlYWsuCisKKz4+PiByZXN1bHQgPSBtMjM1KCkKKz4+PiBmb3IgaSBpbiByYW5nZSgzKToKKy4uLiAgICAgcHJpbnQgZmlyc3RuKHJlc3VsdCwgMTUpCitbMSwgMiwgMywgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxNSwgMTYsIDE4LCAyMCwgMjRdCitbMjUsIDI3LCAzMCwgMzIsIDM2LCA0MCwgNDUsIDQ4LCA1MCwgNTQsIDYwLCA2NCwgNzIsIDc1LCA4MF0KK1s4MSwgOTAsIDk2LCAxMDAsIDEwOCwgMTIwLCAxMjUsIDEyOCwgMTM1LCAxNDQsIDE1MCwgMTYwLCAxNjIsIDE4MCwgMTkyXQorCitIZWguICBIZXJlJ3Mgb25lIHdheSB0byBnZXQgYSBzaGFyZWQgbGlzdCwgY29tcGxldGUgd2l0aCBhbiBleGNydWNpYXRpbmcKK25hbWVzcGFjZSByZW5hbWluZyB0cmljay4gIFRoZSAqcHJldHR5KiBwYXJ0IGlzIHRoYXQgdGhlIHRpbWVzKCkgYW5kIG1lcmdlKCkKK2Z1bmN0aW9ucyBjYW4gYmUgcmV1c2VkIGFzLWlzLCBiZWNhdXNlIHRoZXkgb25seSBhc3N1bWUgdGhlaXIgc3RyZWFtCithcmd1bWVudHMgYXJlIGl0ZXJhYmxlIC0tIGEgTGF6eUxpc3QgaXMgdGhlIHNhbWUgYXMgYSBnZW5lcmF0b3IgdG8gdGltZXMoKS4KKworPj4+IGNsYXNzIExhenlMaXN0OgorLi4uICAgICBkZWYgX19pbml0X18oc2VsZiwgZyk6CisuLi4gICAgICAgICBzZWxmLnNvZmFyID0gW10KKy4uLiAgICAgICAgIHNlbGYuZmV0Y2ggPSBnLm5leHQKKy4uLgorLi4uICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisuLi4gICAgICAgICBzb2ZhciwgZmV0Y2ggPSBzZWxmLnNvZmFyLCBzZWxmLmZldGNoCisuLi4gICAgICAgICB3aGlsZSBpID49IGxlbihzb2Zhcik6CisuLi4gICAgICAgICAgICAgc29mYXIuYXBwZW5kKGZldGNoKCkpCisuLi4gICAgICAgICByZXR1cm4gc29mYXJbaV0KKworPj4+IGRlZiBtMjM1KCk6CisuLi4gICAgIHlpZWxkIDEKKy4uLiAgICAgIyBHYWNrOiAgbTIzNSBiZWxvdyBhY3R1YWxseSByZWZlcnMgdG8gYSBMYXp5TGlzdC4KKy4uLiAgICAgbWVfdGltZXMyID0gdGltZXMoMiwgbTIzNSkKKy4uLiAgICAgbWVfdGltZXMzID0gdGltZXMoMywgbTIzNSkKKy4uLiAgICAgbWVfdGltZXM1ID0gdGltZXMoNSwgbTIzNSkKKy4uLiAgICAgZm9yIGkgaW4gbWVyZ2UobWVyZ2UobWVfdGltZXMyLAorLi4uICAgICAgICAgICAgICAgICAgICAgICAgICBtZV90aW1lczMpLAorLi4uICAgICAgICAgICAgICAgICAgICBtZV90aW1lczUpOgorLi4uICAgICAgICAgeWllbGQgaQorCitQcmludCBhcyBtYW55IG9mIHRoZXNlIGFzIHlvdSBsaWtlIC0tICp0aGlzKiBpbXBsZW1lbnRhdGlvbiBpcyBtZW1vcnktCitlZmZpY2llbnQuCisKKz4+PiBtMjM1ID0gTGF6eUxpc3QobTIzNSgpKQorPj4+IGZvciBpIGluIHJhbmdlKDUpOgorLi4uICAgICBwcmludCBbbTIzNVtqXSBmb3IgaiBpbiByYW5nZSgxNSppLCAxNSooaSsxKSldCitbMSwgMiwgMywgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxNSwgMTYsIDE4LCAyMCwgMjRdCitbMjUsIDI3LCAzMCwgMzIsIDM2LCA0MCwgNDUsIDQ4LCA1MCwgNTQsIDYwLCA2NCwgNzIsIDc1LCA4MF0KK1s4MSwgOTAsIDk2LCAxMDAsIDEwOCwgMTIwLCAxMjUsIDEyOCwgMTM1LCAxNDQsIDE1MCwgMTYwLCAxNjIsIDE4MCwgMTkyXQorWzIwMCwgMjE2LCAyMjUsIDI0MCwgMjQzLCAyNTAsIDI1NiwgMjcwLCAyODgsIDMwMCwgMzIwLCAzMjQsIDM2MCwgMzc1LCAzODRdCitbNDAwLCA0MDUsIDQzMiwgNDUwLCA0ODAsIDQ4NiwgNTAwLCA1MTIsIDU0MCwgNTc2LCA2MDAsIDYyNSwgNjQwLCA2NDgsIDY3NV0KKworWWUgb2xkZSBGaWJvbmFjY2kgZ2VuZXJhdG9yLCBMYXp5TGlzdCBzdHlsZS4KKworPj4+IGRlZiBmaWJnZW4oYSwgYik6CisuLi4KKy4uLiAgICAgZGVmIHN1bShnLCBoKToKKy4uLiAgICAgICAgIHdoaWxlIDE6CisuLi4gICAgICAgICAgICAgeWllbGQgZy5uZXh0KCkgKyBoLm5leHQoKQorLi4uCisuLi4gICAgIGRlZiB0YWlsKGcpOgorLi4uICAgICAgICAgZy5uZXh0KCkgICAgIyB0aHJvdyBmaXJzdCBhd2F5CisuLi4gICAgICAgICBmb3IgeCBpbiBnOgorLi4uICAgICAgICAgICAgIHlpZWxkIHgKKy4uLgorLi4uICAgICB5aWVsZCBhCisuLi4gICAgIHlpZWxkIGIKKy4uLiAgICAgZm9yIHMgaW4gc3VtKGl0ZXIoZmliKSwKKy4uLiAgICAgICAgICAgICAgICAgIHRhaWwoaXRlcihmaWIpKSk6CisuLi4gICAgICAgICB5aWVsZCBzCisKKz4+PiBmaWIgPSBMYXp5TGlzdChmaWJnZW4oMSwgMikpCis+Pj4gZmlyc3RuKGl0ZXIoZmliKSwgMTcpCitbMSwgMiwgMywgNSwgOCwgMTMsIDIxLCAzNCwgNTUsIDg5LCAxNDQsIDIzMywgMzc3LCA2MTAsIDk4NywgMTU5NywgMjU4NF0KKworCitSdW5uaW5nIGFmdGVyIHlvdXIgdGFpbCB3aXRoIGl0ZXJ0b29scy50ZWUgKG5ldyBpbiB2ZXJzaW9uIDIuNCkKKworVGhlIGFsZ29yaXRobXMgIm0yMzUiIChIYW1taW5nKSBhbmQgRmlib25hY2NpIHByZXNlbnRlZCBhYm92ZSBhcmUgYm90aAorZXhhbXBsZXMgb2YgYSB3aG9sZSBmYW1pbHkgb2YgRlAgKGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcpIGFsZ29yaXRobXMKK3doZXJlIGEgZnVuY3Rpb24gcHJvZHVjZXMgYW5kIHJldHVybnMgYSBsaXN0IHdoaWxlIHRoZSBwcm9kdWN0aW9uIGFsZ29yaXRobQorc3VwcG9zZSB0aGUgbGlzdCBhcyBhbHJlYWR5IHByb2R1Y2VkIGJ5IHJlY3Vyc2l2ZWx5IGNhbGxpbmcgaXRzZWxmLgorRm9yIHRoZXNlIGFsZ29yaXRobXMgdG8gd29yaywgdGhleSBtdXN0OgorCistIHByb2R1Y2UgYXQgbGVhc3QgYSBmaXJzdCBlbGVtZW50IHdpdGhvdXQgcHJlc3VwcG9zaW5nIHRoZSBleGlzdGVuY2Ugb2YKKyAgdGhlIHJlc3Qgb2YgdGhlIGxpc3QKKy0gcHJvZHVjZSB0aGVpciBlbGVtZW50cyBpbiBhIGxhenkgbWFubmVyCisKK1RvIHdvcmsgZWZmaWNpZW50bHksIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QgbXVzdCBub3QgYmUgcmVjb21wdXRlZCBvdmVyCithbmQgb3ZlciBhZ2Fpbi4gVGhpcyBpcyBlbnN1cmVkIGluIG1vc3QgRlAgbGFuZ3VhZ2VzIGFzIGEgYnVpbHQtaW4gZmVhdHVyZS4KK0luIHB5dGhvbiwgd2UgaGF2ZSB0byBleHBsaWNpdGx5IG1haW50YWluIGEgbGlzdCBvZiBhbHJlYWR5IGNvbXB1dGVkIHJlc3VsdHMKK2FuZCBhYmFuZG9uIGdlbnVpbmUgcmVjdXJzaXZpdHkuCisKK1RoaXMgaXMgd2hhdCBoYWQgYmVlbiBhdHRlbXB0ZWQgYWJvdmUgd2l0aCB0aGUgTGF6eUxpc3QgY2xhc3MuIE9uZSBwcm9ibGVtCit3aXRoIHRoYXQgY2xhc3MgaXMgdGhhdCBpdCBrZWVwcyBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBnZW5lcmF0ZWQgcmVzdWx0cyBhbmQKK3RoZXJlZm9yZSBjb250aW51YWxseSBncm93cy4gVGhpcyBwYXJ0aWFsbHkgZGVmZWF0cyB0aGUgZ29hbCBvZiB0aGUgZ2VuZXJhdG9yCitjb25jZXB0LCB2aXouIHByb2R1Y2UgdGhlIHJlc3VsdHMgb25seSBhcyBuZWVkZWQgaW5zdGVhZCBvZiBwcm9kdWNpbmcgdGhlbQorYWxsIGFuZCB0aGVyZWJ5IHdhc3RpbmcgbWVtb3J5LgorCitUaGFua3MgdG8gaXRlcnRvb2xzLnRlZSwgaXQgaXMgbm93IGNsZWFyICJob3cgdG8gZ2V0IHRoZSBpbnRlcm5hbCB1c2VzIG9mCittMjM1IHRvIHNoYXJlIGEgc2luZ2xlIGdlbmVyYXRvciIuCisKKz4+PiBmcm9tIGl0ZXJ0b29scyBpbXBvcnQgdGVlCis+Pj4gZGVmIG0yMzUoKToKKy4uLiAgICAgZGVmIF9tMjM1KCk6CisuLi4gICAgICAgICB5aWVsZCAxCisuLi4gICAgICAgICBmb3IgbiBpbiBtZXJnZSh0aW1lcygyLCBtMiksCisuLi4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZSh0aW1lcygzLCBtMyksCisuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyg1LCBtNSkpKToKKy4uLiAgICAgICAgICAgICB5aWVsZCBuCisuLi4gICAgIG0xID0gX20yMzUoKQorLi4uICAgICBtMiwgbTMsIG01LCBtUmVzID0gdGVlKG0xLCA0KQorLi4uICAgICByZXR1cm4gbVJlcworCis+Pj4gaXQgPSBtMjM1KCkKKz4+PiBmb3IgaSBpbiByYW5nZSg1KToKKy4uLiAgICAgcHJpbnQgZmlyc3RuKGl0LCAxNSkKK1sxLCAyLCAzLCA0LCA1LCA2LCA4LCA5LCAxMCwgMTIsIDE1LCAxNiwgMTgsIDIwLCAyNF0KK1syNSwgMjcsIDMwLCAzMiwgMzYsIDQwLCA0NSwgNDgsIDUwLCA1NCwgNjAsIDY0LCA3MiwgNzUsIDgwXQorWzgxLCA5MCwgOTYsIDEwMCwgMTA4LCAxMjAsIDEyNSwgMTI4LCAxMzUsIDE0NCwgMTUwLCAxNjAsIDE2MiwgMTgwLCAxOTJdCitbMjAwLCAyMTYsIDIyNSwgMjQwLCAyNDMsIDI1MCwgMjU2LCAyNzAsIDI4OCwgMzAwLCAzMjAsIDMyNCwgMzYwLCAzNzUsIDM4NF0KK1s0MDAsIDQwNSwgNDMyLCA0NTAsIDQ4MCwgNDg2LCA1MDAsIDUxMiwgNTQwLCA1NzYsIDYwMCwgNjI1LCA2NDAsIDY0OCwgNjc1XQorCitUaGUgInRlZSIgZnVuY3Rpb24gZG9lcyBqdXN0IHdoYXQgd2Ugd2FudC4gSXQgaW50ZXJuYWxseSBrZWVwcyBhIGdlbmVyYXRlZAorcmVzdWx0IGZvciBhcyBsb25nIGFzIGl0IGhhcyBub3QgYmVlbiAiY29uc3VtZWQiIGZyb20gYWxsIG9mIHRoZSBkdXBsaWNhdGVkCitpdGVyYXRvcnMsIHdoZXJldXBvbiBpdCBpcyBkZWxldGVkLiBZb3UgY2FuIHRoZXJlZm9yZSBwcmludCB0aGUgaGFtbWluZworc2VxdWVuY2UgZHVyaW5nIGhvdXJzIHdpdGhvdXQgaW5jcmVhc2luZyBtZW1vcnkgdXNhZ2UsIG9yIHZlcnkgbGl0dGxlLgorCitUaGUgYmVhdXR5IG9mIGl0IGlzIHRoYXQgcmVjdXJzaXZlIHJ1bm5pbmctYWZ0ZXItdGhlaXItdGFpbCBGUCBhbGdvcml0aG1zCithcmUgcXVpdGUgc3RyYWlnaHRmb3J3YXJkbHkgZXhwcmVzc2VkIHdpdGggdGhpcyBQeXRob24gaWRpb20uCisKK1llIG9sZGUgRmlib25hY2NpIGdlbmVyYXRvciwgdGVlIHN0eWxlLgorCis+Pj4gZGVmIGZpYigpOgorLi4uCisuLi4gICAgIGRlZiBfaXN1bShnLCBoKToKKy4uLiAgICAgICAgIHdoaWxlIDE6CisuLi4gICAgICAgICAgICAgeWllbGQgZy5uZXh0KCkgKyBoLm5leHQoKQorLi4uCisuLi4gICAgIGRlZiBfZmliKCk6CisuLi4gICAgICAgICB5aWVsZCAxCisuLi4gICAgICAgICB5aWVsZCAyCisuLi4gICAgICAgICBmaWJUYWlsLm5leHQoKSAjIHRocm93IGZpcnN0IGF3YXkKKy4uLiAgICAgICAgIGZvciByZXMgaW4gX2lzdW0oZmliSGVhZCwgZmliVGFpbCk6CisuLi4gICAgICAgICAgICAgeWllbGQgcmVzCisuLi4KKy4uLiAgICAgcmVhbGZpYiA9IF9maWIoKQorLi4uICAgICBmaWJIZWFkLCBmaWJUYWlsLCBmaWJSZXMgPSB0ZWUocmVhbGZpYiwgMykKKy4uLiAgICAgcmV0dXJuIGZpYlJlcworCis+Pj4gZmlyc3RuKGZpYigpLCAxNykKK1sxLCAyLCAzLCA1LCA4LCAxMywgMjEsIDM0LCA1NSwgODksIDE0NCwgMjMzLCAzNzcsIDYxMCwgOTg3LCAxNTk3LCAyNTg0XQorCisiIiIKKworIyBzeW50YXhfdGVzdHMgbW9zdGx5IHByb3Zva2VzIFN5bnRheEVycm9ycy4gIEFsc28gZmlkZGxpbmcgd2l0aCAjaWYgMAorIyBoYWNrZXJ5LgorCitzeW50YXhfdGVzdHMgPSAiIiIKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHJldHVybiAyMgorLi4uICAgICB5aWVsZCAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uCitTeW50YXhFcnJvcjogJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5zeW50YXhbMF0+LCBsaW5lIDMpCisKKz4+PiBkZWYgZigpOgorLi4uICAgICB5aWVsZCAxCisuLi4gICAgIHJldHVybiAyMgorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLgorU3ludGF4RXJyb3I6ICdyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvciAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uc3ludGF4WzFdPiwgbGluZSAzKQorCisicmV0dXJuIE5vbmUiIGlzIG5vdCB0aGUgc2FtZSBhcyAicmV0dXJuIiBpbiBhIGdlbmVyYXRvcjoKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHlpZWxkIDEKKy4uLiAgICAgcmV0dXJuIE5vbmUKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4KK1N5bnRheEVycm9yOiAncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3IgKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLnN5bnRheFsyXT4sIGxpbmUgMykKKworVGhlc2UgYXJlIGZpbmU6CisKKz4+PiBkZWYgZigpOgorLi4uICAgICB5aWVsZCAxCisuLi4gICAgIHJldHVybgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgdHJ5OgorLi4uICAgICAgICAgeWllbGQgMQorLi4uICAgICBmaW5hbGx5OgorLi4uICAgICAgICAgcGFzcworCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgdHJ5OgorLi4uICAgICAgICAgdHJ5OgorLi4uICAgICAgICAgICAgIDEvLzAKKy4uLiAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKy4uLiAgICAgICAgICAgICB5aWVsZCA2NjYKKy4uLiAgICAgICAgIGV4Y2VwdDoKKy4uLiAgICAgICAgICAgICBwYXNzCisuLi4gICAgIGZpbmFsbHk6CisuLi4gICAgICAgICBwYXNzCisKKz4+PiBkZWYgZigpOgorLi4uICAgICB0cnk6CisuLi4gICAgICAgICB0cnk6CisuLi4gICAgICAgICAgICAgeWllbGQgMTIKKy4uLiAgICAgICAgICAgICAxLy8wCisuLi4gICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisuLi4gICAgICAgICAgICAgeWllbGQgNjY2CisuLi4gICAgICAgICBleGNlcHQ6CisuLi4gICAgICAgICAgICAgdHJ5OgorLi4uICAgICAgICAgICAgICAgICB4ID0gMTIKKy4uLiAgICAgICAgICAgICBmaW5hbGx5OgorLi4uICAgICAgICAgICAgICAgICB5aWVsZCAxMgorLi4uICAgICBleGNlcHQ6CisuLi4gICAgICAgICByZXR1cm4KKz4+PiBsaXN0KGYoKSkKK1sxMiwgNjY2XQorCis+Pj4gZGVmIGYoKToKKy4uLiAgICB5aWVsZAorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKworPj4+IGRlZiBmKCk6CisuLi4gICAgaWYgMDoKKy4uLiAgICAgICAgeWllbGQKKz4+PiB0eXBlKGYoKSkKKzx0eXBlICdnZW5lcmF0b3InPgorCisKKz4+PiBkZWYgZigpOgorLi4uICAgICBpZiAwOgorLi4uICAgICAgICAgeWllbGQgMQorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKz4+PiBkZWYgZigpOgorLi4uICAgIGlmICIiOgorLi4uICAgICAgICB5aWVsZCBOb25lCis+Pj4gdHlwZShmKCkpCis8dHlwZSAnZ2VuZXJhdG9yJz4KKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHJldHVybgorLi4uICAgICB0cnk6CisuLi4gICAgICAgICBpZiB4PT00OgorLi4uICAgICAgICAgICAgIHBhc3MKKy4uLiAgICAgICAgIGVsaWYgMDoKKy4uLiAgICAgICAgICAgICB0cnk6CisuLi4gICAgICAgICAgICAgICAgIDEvLzAKKy4uLiAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6CisuLi4gICAgICAgICAgICAgICAgIHBhc3MKKy4uLiAgICAgICAgICAgICBlbHNlOgorLi4uICAgICAgICAgICAgICAgICBpZiAwOgorLi4uICAgICAgICAgICAgICAgICAgICAgd2hpbGUgMTI6CisuLi4gICAgICAgICAgICAgICAgICAgICAgICAgeCArPSAxCisuLi4gICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgMiAjIGRvbid0IGJsaW5rCisuLi4gICAgICAgICAgICAgICAgICAgICAgICAgZihhLCBiLCBjLCBkLCBlKQorLi4uICAgICAgICAgZWxzZToKKy4uLiAgICAgICAgICAgICBwYXNzCisuLi4gICAgIGV4Y2VwdDoKKy4uLiAgICAgICAgIHggPSAxCisuLi4gICAgIHJldHVybgorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKz4+PiBkZWYgZigpOgorLi4uICAgICBpZiAwOgorLi4uICAgICAgICAgZGVmIGcoKToKKy4uLiAgICAgICAgICAgICB5aWVsZCAxCisuLi4KKz4+PiB0eXBlKGYoKSkKKzx0eXBlICdOb25lVHlwZSc+CisKKz4+PiBkZWYgZigpOgorLi4uICAgICBpZiAwOgorLi4uICAgICAgICAgY2xhc3MgQzoKKy4uLiAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisuLi4gICAgICAgICAgICAgICAgIHlpZWxkIDEKKy4uLiAgICAgICAgICAgICBkZWYgZihzZWxmKToKKy4uLiAgICAgICAgICAgICAgICAgeWllbGQgMgorPj4+IHR5cGUoZigpKQorPHR5cGUgJ05vbmVUeXBlJz4KKworPj4+IGRlZiBmKCk6CisuLi4gICAgIGlmIDA6CisuLi4gICAgICAgICByZXR1cm4KKy4uLiAgICAgaWYgMDoKKy4uLiAgICAgICAgIHlpZWxkIDIKKz4+PiB0eXBlKGYoKSkKKzx0eXBlICdnZW5lcmF0b3InPgorCisKKz4+PiBkZWYgZigpOgorLi4uICAgICBpZiAwOgorLi4uICAgICAgICAgbGFtYmRhIHg6ICB4ICAgICAgICAjIHNob3VsZG4ndCB0cmlnZ2VyIGhlcmUKKy4uLiAgICAgICAgIHJldHVybiAgICAgICAgICAgICAgIyBvciBoZXJlCisuLi4gICAgICAgICBkZWYgZihpKToKKy4uLiAgICAgICAgICAgICByZXR1cm4gMippICAgICAgIyBvciBoZXJlCisuLi4gICAgICAgICBpZiAwOgorLi4uICAgICAgICAgICAgIHJldHVybiAzICAgICAgICAjIGJ1dCAqdGhpcyogc3Vja3MgKGxpbmUgOCkKKy4uLiAgICAgaWYgMDoKKy4uLiAgICAgICAgIHlpZWxkIDIgICAgICAgICAgICAgIyBiZWNhdXNlIGl0J3MgYSBnZW5lcmF0b3IgKGxpbmUgMTApCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CitTeW50YXhFcnJvcjogJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5zeW50YXhbMjRdPiwgbGluZSAxMCkKKworVGhpcyBvbmUgY2F1c2VkIGEgY3Jhc2ggKHNlZSBTRiBidWcgNTY3NTM4KToKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIGZvciBpIGluIHJhbmdlKDMpOgorLi4uICAgICAgICAgdHJ5OgorLi4uICAgICAgICAgICAgIGNvbnRpbnVlCisuLi4gICAgICAgICBmaW5hbGx5OgorLi4uICAgICAgICAgICAgIHlpZWxkIGkKKy4uLgorPj4+IGcgPSBmKCkKKz4+PiBwcmludCBnLm5leHQoKQorMAorPj4+IHByaW50IGcubmV4dCgpCisxCis+Pj4gcHJpbnQgZy5uZXh0KCkKKzIKKz4+PiBwcmludCBnLm5leHQoKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorU3RvcEl0ZXJhdGlvbgorCisKK1Rlc3QgdGhlIGdpX2NvZGUgYXR0cmlidXRlCisKKz4+PiBkZWYgZigpOgorLi4uICAgICB5aWVsZCA1CisuLi4KKz4+PiBnID0gZigpCis+Pj4gZy5naV9jb2RlIGlzIGYuZnVuY19jb2RlCitUcnVlCis+Pj4gZy5uZXh0KCkKKzUKKz4+PiBnLm5leHQoKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorU3RvcEl0ZXJhdGlvbgorPj4+IGcuZ2lfY29kZSBpcyBmLmZ1bmNfY29kZQorVHJ1ZQorCisKK1Rlc3QgdGhlIF9fbmFtZV9fIGF0dHJpYnV0ZSBhbmQgdGhlIHJlcHIoKQorCis+Pj4gZGVmIGYoKToKKy4uLiAgICB5aWVsZCA1CisuLi4KKz4+PiBnID0gZigpCis+Pj4gZy5fX25hbWVfXworJ2YnCis+Pj4gcmVwcihnKSAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyc8Z2VuZXJhdG9yIG9iamVjdCBmIGF0IC4uLj4nCisKK0xhbWJkYXMgc2hvdWxkbid0IGhhdmUgdGhlaXIgdXN1YWwgcmV0dXJuIGJlaGF2aW9yLgorCis+Pj4geCA9IGxhbWJkYTogKHlpZWxkIDEpCis+Pj4gbGlzdCh4KCkpCitbMV0KKworPj4+IHggPSBsYW1iZGE6ICgoeWllbGQgMSksICh5aWVsZCAyKSkKKz4+PiBsaXN0KHgoKSkKK1sxLCAyXQorIiIiCisKKyMgY29uam9pbiBpcyBhIHNpbXBsZSBiYWNrdHJhY2tpbmcgZ2VuZXJhdG9yLCBuYW1lZCBpbiBob25vciBvZiBJY29uJ3MKKyMgImNvbmp1bmN0aW9uIiBjb250cm9sIHN0cnVjdHVyZS4gIFBhc3MgYSBsaXN0IG9mIG5vLWFyZ3VtZW50IGZ1bmN0aW9ucworIyB0aGF0IHJldHVybiBpdGVyYWJsZSBvYmplY3RzLiAgRWFzaWVzdCB0byBleHBsYWluIGJ5IGV4YW1wbGU6ICBhc3N1bWUgdGhlCisjIGZ1bmN0aW9uIGxpc3QgW3gsIHksIHpdIGlzIHBhc3NlZC4gIFRoZW4gY29uam9pbiBhY3RzIGxpa2U6CisjCisjIGRlZiBnKCk6CisjICAgICB2YWx1ZXMgPSBbTm9uZV0gKiAzCisjICAgICBmb3IgdmFsdWVzWzBdIGluIHgoKToKKyMgICAgICAgICBmb3IgdmFsdWVzWzFdIGluIHkoKToKKyMgICAgICAgICAgICAgZm9yIHZhbHVlc1syXSBpbiB6KCk6CisjICAgICAgICAgICAgICAgICB5aWVsZCB2YWx1ZXMKKyMKKyMgU28gc29tZSAzLWxpc3RzIG9mIHZhbHVlcyAqbWF5KiBiZSBnZW5lcmF0ZWQsIGVhY2ggdGltZSB3ZSBzdWNjZXNzZnVsbHkKKyMgZ2V0IGludG8gdGhlIGlubmVybW9zdCBsb29wLiAgSWYgYW4gaXRlcmF0b3IgZmFpbHMgKGlzIGV4aGF1c3RlZCkgYmVmb3JlCisjIHRoZW4sIGl0ICJiYWNrdHJhY2tzIiB0byBnZXQgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgbmVhcmVzdCBlbmNsb3NpbmcKKyMgaXRlcmF0b3IgKHRoZSBvbmUgInRvIHRoZSBsZWZ0IiksIGFuZCBzdGFydHMgYWxsIG92ZXIgYWdhaW4gYXQgdGhlIG5leHQKKyMgc2xvdCAocHVtcHMgYSBmcmVzaCBpdGVyYXRvcikuICBPZiBjb3Vyc2UgdGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuIHRoZQorIyBpdGVyYXRvcnMgaGF2ZSBzaWRlLWVmZmVjdHMsIHNvIHRoYXQgd2hpY2ggdmFsdWVzICpjYW4qIGJlIGdlbmVyYXRlZCBhdAorIyBlYWNoIHNsb3QgZGVwZW5kIG9uIHRoZSB2YWx1ZXMgaXRlcmF0ZWQgYXQgcHJldmlvdXMgc2xvdHMuCisKK2RlZiBzaW1wbGVfY29uam9pbihncyk6CisKKyAgICB2YWx1ZXMgPSBbTm9uZV0gKiBsZW4oZ3MpCisKKyAgICBkZWYgZ2VuKGkpOgorICAgICAgICBpZiBpID49IGxlbihncyk6CisgICAgICAgICAgICB5aWVsZCB2YWx1ZXMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciB2YWx1ZXNbaV0gaW4gZ3NbaV0oKToKKyAgICAgICAgICAgICAgICBmb3IgeCBpbiBnZW4oaSsxKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgeAorCisgICAgZm9yIHggaW4gZ2VuKDApOgorICAgICAgICB5aWVsZCB4CisKKyMgVGhhdCB3b3JrcyBmaW5lLCBidXQgcmVjdXJzaW5nIGEgbGV2ZWwgYW5kIGNoZWNraW5nIGkgYWdhaW5zdCBsZW4oZ3MpIGZvcgorIyBlYWNoIGl0ZW0gcHJvZHVjZWQgaXMgaW5lZmZpY2llbnQuICBCeSBkb2luZyBtYW51YWwgbG9vcCB1bnJvbGxpbmcgYWNyb3NzCisjIGdlbmVyYXRvciBib3VuZGFyaWVzLCBpdCdzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSBtb3N0IG9mIHRoYXQgb3ZlcmhlYWQuCisjIFRoaXMgaXNuJ3Qgd29ydGggdGhlIGJvdGhlciAqaW4gZ2VuZXJhbCogZm9yIGdlbmVyYXRvcnMsIGJ1dCBjb25qb2luKCkgaXMKKyMgYSBjb3JlIGJ1aWxkaW5nIGJsb2NrIGZvciBzb21lIENQVS1pbnRlbnNpdmUgZ2VuZXJhdG9yIGFwcGxpY2F0aW9ucy4KKworZGVmIGNvbmpvaW4oZ3MpOgorCisgICAgbiA9IGxlbihncykKKyAgICB2YWx1ZXMgPSBbTm9uZV0gKiBuCisKKyAgICAjIERvIG9uZSBsb29wIG5lc3QgYXQgdGltZSByZWN1cnNpdmVseSwgdW50aWwgdGhlICMgb2YgbG9vcCBuZXN0cworICAgICMgcmVtYWluaW5nIGlzIGRpdmlzaWJsZSBieSAzLgorCisgICAgZGVmIGdlbihpKToKKyAgICAgICAgaWYgaSA+PSBuOgorICAgICAgICAgICAgeWllbGQgdmFsdWVzCisKKyAgICAgICAgZWxpZiAobi1pKSAlIDM6CisgICAgICAgICAgICBpcDEgPSBpKzEKKyAgICAgICAgICAgIGZvciB2YWx1ZXNbaV0gaW4gZ3NbaV0oKToKKyAgICAgICAgICAgICAgICBmb3IgeCBpbiBnZW4oaXAxKToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgeAorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3IgeCBpbiBfZ2VuMyhpKToKKyAgICAgICAgICAgICAgICB5aWVsZCB4CisKKyAgICAjIERvIHRocmVlIGxvb3AgbmVzdHMgYXQgYSB0aW1lLCByZWN1cnNpbmcgb25seSBpZiBhdCBsZWFzdCB0aHJlZSBtb3JlCisgICAgIyByZW1haW4uICBEb24ndCBjYWxsIGRpcmVjdGx5OiAgdGhpcyBpcyBhbiBpbnRlcm5hbCBvcHRpbWl6YXRpb24gZm9yCisgICAgIyBnZW4ncyB1c2UuCisKKyAgICBkZWYgX2dlbjMoaSk6CisgICAgICAgIGFzc2VydCBpIDwgbiBhbmQgKG4taSkgJSAzID09IDAKKyAgICAgICAgaXAxLCBpcDIsIGlwMyA9IGkrMSwgaSsyLCBpKzMKKyAgICAgICAgZywgZzEsIGcyID0gZ3NbaSA6IGlwM10KKworICAgICAgICBpZiBpcDMgPj0gbjoKKyAgICAgICAgICAgICMgVGhlc2UgYXJlIHRoZSBsYXN0IHRocmVlLCBzbyB3ZSBjYW4geWllbGQgdmFsdWVzIGRpcmVjdGx5LgorICAgICAgICAgICAgZm9yIHZhbHVlc1tpXSBpbiBnKCk6CisgICAgICAgICAgICAgICAgZm9yIHZhbHVlc1tpcDFdIGluIGcxKCk6CisgICAgICAgICAgICAgICAgICAgIGZvciB2YWx1ZXNbaXAyXSBpbiBnMigpOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWVzCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQXQgbGVhc3QgNiBsb29wIG5lc3RzIHJlbWFpbjsgcGVlbCBvZmYgMyBhbmQgcmVjdXJzZSBmb3IgdGhlCisgICAgICAgICAgICAjIHJlc3QuCisgICAgICAgICAgICBmb3IgdmFsdWVzW2ldIGluIGcoKToKKyAgICAgICAgICAgICAgICBmb3IgdmFsdWVzW2lwMV0gaW4gZzEoKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIHZhbHVlc1tpcDJdIGluIGcyKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiBfZ2VuMyhpcDMpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHgKKworICAgIGZvciB4IGluIGdlbigwKToKKyAgICAgICAgeWllbGQgeAorCisjIEFuZCBvbmUgbW9yZSBhcHByb2FjaDogIEZvciBiYWNrdHJhY2tpbmcgYXBwcyBsaWtlIHRoZSBLbmlnaHQncyBUb3VyCisjIHNvbHZlciBiZWxvdywgdGhlIG51bWJlciBvZiBiYWNrdHJhY2tpbmcgbGV2ZWxzIGNhbiBiZSBlbm9ybW91cyAob25lCisjIGxldmVsIHBlciBzcXVhcmUsIGZvciB0aGUgS25pZ2h0J3MgVG91ciwgc28gdGhhdCBlLmcuIGEgMTAweDEwMCBib2FyZAorIyBuZWVkcyAxMCwwMDAgbGV2ZWxzKS4gIEluIHN1Y2ggY2FzZXMgUHl0aG9uIGlzIGxpa2VseSB0byBydW4gb3V0IG9mCisjIHN0YWNrIHNwYWNlIGR1ZSB0byByZWN1cnNpb24uICBTbyBoZXJlJ3MgYSByZWN1cnNpb24tZnJlZSB2ZXJzaW9uIG9mCisjIGNvbmpvaW4gdG9vLgorIyBOT1RFIFdFTEw6ICBUaGlzIGFsbG93cyBsYXJnZSBwcm9ibGVtcyB0byBiZSBzb2x2ZWQgd2l0aCBvbmx5IHRyaXZpYWwKKyMgZGVtYW5kcyBvbiBzdGFjayBzcGFjZS4gIFdpdGhvdXQgZXhwbGljaXRseSByZXN1bWFibGUgZ2VuZXJhdG9ycywgdGhpcyBpcworIyBtdWNoIGhhcmRlciB0byBhY2hpZXZlLiAgT1RPSCwgdGhpcyBpcyBtdWNoIHNsb3dlciAodXAgdG8gYSBmYWN0b3Igb2YgMikKKyMgdGhhbiB0aGUgZmFuY3kgdW5yb2xsZWQgcmVjdXJzaXZlIGNvbmpvaW4uCisKK2RlZiBmbGF0X2NvbmpvaW4oZ3MpOiAgIyByZW5hbWUgdG8gY29uam9pbiB0byBydW4gdGVzdHMgd2l0aCB0aGlzIGluc3RlYWQKKyAgICBuID0gbGVuKGdzKQorICAgIHZhbHVlcyA9IFtOb25lXSAqIG4KKyAgICBpdGVycyAgPSBbTm9uZV0gKiBuCisgICAgX1N0b3BJdGVyYXRpb24gPSBTdG9wSXRlcmF0aW9uICAjIG1ha2UgbG9jYWwgYmVjYXVzZSBjYXVnaHQgYSAqbG90KgorICAgIGkgPSAwCisgICAgd2hpbGUgMToKKyAgICAgICAgIyBEZXNjZW5kLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBpIDwgbjoKKyAgICAgICAgICAgICAgICBpdCA9IGl0ZXJzW2ldID0gZ3NbaV0oKS5uZXh0CisgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gaXQoKQorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBleGNlcHQgX1N0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhc3NlcnQgaSA9PSBuCisgICAgICAgICAgICB5aWVsZCB2YWx1ZXMKKworICAgICAgICAjIEJhY2t0cmFjayB1bnRpbCBhbiBvbGRlciBpdGVyYXRvciBjYW4gYmUgcmVzdW1lZC4KKyAgICAgICAgaSAtPSAxCisgICAgICAgIHdoaWxlIGkgPj0gMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSBpdGVyc1tpXSgpCisgICAgICAgICAgICAgICAgIyBTdWNjZXNzISAgU3RhcnQgZnJlc2ggYXQgbmV4dCBsZXZlbC4KKyAgICAgICAgICAgICAgICBpICs9IDEKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0IF9TdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgICAgICMgQ29udGludWUgYmFja3RyYWNraW5nLgorICAgICAgICAgICAgICAgIGkgLT0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXNzZXJ0IGkgPCAwCisgICAgICAgICAgICBicmVhaworCisjIEEgY29uam9pbi1iYXNlZCBOLVF1ZWVucyBzb2x2ZXIuCisKK2NsYXNzIFF1ZWVuczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbik6CisgICAgICAgIHNlbGYubiA9IG4KKyAgICAgICAgcmFuZ2VuID0gcmFuZ2UobikKKworICAgICAgICAjIEFzc2lnbiBhIHVuaXF1ZSBpbnQgdG8gZWFjaCBjb2x1bW4gYW5kIGRpYWdvbmFsLgorICAgICAgICAjIGNvbHVtbnM6ICBuIG9mIHRob3NlLCByYW5nZShuKS4KKyAgICAgICAgIyBOVy1TRSBkaWFnb25hbHM6IDJuLTEgb2YgdGhlc2UsIGktaiB1bmlxdWUgYW5kIGludmFyaWFudCBhbG9uZworICAgICAgICAjIGVhY2gsIHNtYWxsZXN0IGktaiBpcyAwLShuLTEpID0gMS1uLCBzbyBhZGQgbi0xIHRvIHNoaWZ0IHRvIDAtCisgICAgICAgICMgYmFzZWQuCisgICAgICAgICMgTkUtU1cgZGlhZ29uYWxzOiAybi0xIG9mIHRoZXNlLCBpK2ogdW5pcXVlIGFuZCBpbnZhcmlhbnQgYWxvbmcKKyAgICAgICAgIyBlYWNoLCBzbWFsbGVzdCBpK2ogaXMgMCwgbGFyZ2VzdCBpcyAybi0yLgorCisgICAgICAgICMgRm9yIGVhY2ggc3F1YXJlLCBjb21wdXRlIGEgYml0IHZlY3RvciBvZiB0aGUgY29sdW1ucyBhbmQKKyAgICAgICAgIyBkaWFnb25hbHMgaXQgY292ZXJzLCBhbmQgZm9yIGVhY2ggcm93IGNvbXB1dGUgYSBmdW5jdGlvbiB0aGF0CisgICAgICAgICMgZ2VuZXJhdGVzIHRoZSBwb3NzaWJsaXRpZXMgZm9yIHRoZSBjb2x1bW5zIGluIHRoYXQgcm93LgorICAgICAgICBzZWxmLnJvd2dlbmVyYXRvcnMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZW46CisgICAgICAgICAgICByb3d1c2VzID0gWygxTCA8PCBqKSB8ICAgICAgICAgICAgICAgICAgIyBjb2x1bW4gb3JkaW5hbAorICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgKG4gKyBpLWogKyBuLTEpKSB8ICAgICMgTlctU0Ugb3JkaW5hbAorICAgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgKG4gKyAyKm4tMSArIGkraikpICAgICMgTkUtU1cgb3JkaW5hbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlbl0KKworICAgICAgICAgICAgZGVmIHJvd2dlbihyb3d1c2VzPXJvd3VzZXMpOgorICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlbjoKKyAgICAgICAgICAgICAgICAgICAgdXNlcyA9IHJvd3VzZXNbal0KKyAgICAgICAgICAgICAgICAgICAgaWYgdXNlcyAmIHNlbGYudXNlZCA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi51c2VkIHw9IHVzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudXNlZCAmPSB+dXNlcworCisgICAgICAgICAgICBzZWxmLnJvd2dlbmVyYXRvcnMuYXBwZW5kKHJvd2dlbikKKworICAgICMgR2VuZXJhdGUgc29sdXRpb25zLgorICAgIGRlZiBzb2x2ZShzZWxmKToKKyAgICAgICAgc2VsZi51c2VkID0gMAorICAgICAgICBmb3Igcm93MmNvbCBpbiBjb25qb2luKHNlbGYucm93Z2VuZXJhdG9ycyk6CisgICAgICAgICAgICB5aWVsZCByb3cyY29sCisKKyAgICBkZWYgcHJpbnRzb2x1dGlvbihzZWxmLCByb3cyY29sKToKKyAgICAgICAgbiA9IHNlbGYubgorICAgICAgICBhc3NlcnQgbiA9PSBsZW4ocm93MmNvbCkKKyAgICAgICAgc2VwID0gIisiICsgIi0rIiAqIG4KKyAgICAgICAgcHJpbnQgc2VwCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgc3F1YXJlcyA9IFsiICIgZm9yIGogaW4gcmFuZ2UobildCisgICAgICAgICAgICBzcXVhcmVzW3JvdzJjb2xbaV1dID0gIlEiCisgICAgICAgICAgICBwcmludCAifCIgKyAifCIuam9pbihzcXVhcmVzKSArICJ8IgorICAgICAgICAgICAgcHJpbnQgc2VwCisKKyMgQSBjb25qb2luLWJhc2VkIEtuaWdodCdzIFRvdXIgc29sdmVyLiAgVGhpcyBpcyBwcmV0dHkgc29waGlzdGljYXRlZAorIyAoZS5nLiwgd2hlbiB1c2VkIHdpdGggZmxhdF9jb25qb2luIGFib3ZlLCBhbmQgcGFzc2luZyBoYXJkPTEgdG8gdGhlCisjIGNvbnN0cnVjdG9yLCBhIDIwMHgyMDAgS25pZ2h0J3MgVG91ciB3YXMgZm91bmQgcXVpY2tseSAtLSBub3RlIHRoYXQgd2UncmUKKyMgY3JlYXRpbmcgMTBzIG9mIHRob3VzYW5kcyBvZiBnZW5lcmF0b3JzIHRoZW4hKSwgYW5kIGlzIGxlbmd0aHkuCisKK2NsYXNzIEtuaWdodHM6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG0sIG4sIGhhcmQ9MCk6CisgICAgICAgIHNlbGYubSwgc2VsZi5uID0gbSwgbgorCisgICAgICAgICMgc29sdmUoKSB3aWxsIHNldCB1cCBzdWNjc1tpXSB0byBiZSBhIGxpc3Qgb2Ygc3F1YXJlICNpJ3MKKyAgICAgICAgIyBzdWNjZXNzb3JzLgorICAgICAgICBzdWNjcyA9IHNlbGYuc3VjY3MgPSBbXQorCisgICAgICAgICMgUmVtb3ZlIGkwIGZyb20gZWFjaCBvZiBpdHMgc3VjY2Vzc29yJ3Mgc3VjY2Vzc29yIGxpc3RzLCBpLmUuCisgICAgICAgICMgc3VjY2Vzc29ycyBjYW4ndCBnbyBiYWNrIHRvIGkwIGFnYWluLiAgUmV0dXJuIDAgaWYgd2UgY2FuCisgICAgICAgICMgZGV0ZWN0IHRoaXMgbWFrZXMgYSBzb2x1dGlvbiBpbXBvc3NpYmxlLCBlbHNlIHJldHVybiAxLgorCisgICAgICAgIGRlZiByZW1vdmVfZnJvbV9zdWNjZXNzb3JzKGkwLCBsZW49bGVuKToKKyAgICAgICAgICAgICMgSWYgd2UgcmVtb3ZlIGFsbCBleGl0cyBmcm9tIGEgZnJlZSBzcXVhcmUsIHdlJ3JlIGRlYWQ6CisgICAgICAgICAgICAjIGV2ZW4gaWYgd2UgbW92ZSB0byBpdCBuZXh0LCB3ZSBjYW4ndCBsZWF2ZSBpdCBhZ2Fpbi4KKyAgICAgICAgICAgICMgSWYgd2UgY3JlYXRlIGEgc3F1YXJlIHdpdGggb25lIGV4aXQsIHdlIG11c3QgdmlzaXQgaXQgbmV4dDsKKyAgICAgICAgICAgICMgZWxzZSBzb21lYm9keSBlbHNlIHdpbGwgaGF2ZSB0byB2aXNpdCBpdCwgYW5kIHNpbmNlIHRoZXJlJ3MKKyAgICAgICAgICAgICMgb25seSBvbmUgYWRqYWNlbnQsIHRoZXJlIHdvbid0IGJlIGEgd2F5IHRvIGxlYXZlIGl0IGFnYWluLgorICAgICAgICAgICAgIyBGaW5lbGx5LCBpZiB3ZSBjcmVhdGUgbW9yZSB0aGFuIG9uZSBmcmVlIHNxdWFyZSB3aXRoIGEKKyAgICAgICAgICAgICMgc2luZ2xlIGV4aXQsIHdlIGNhbiBvbmx5IG1vdmUgdG8gb25lIG9mIHRoZW0gbmV4dCwgbGVhdmluZworICAgICAgICAgICAgIyB0aGUgb3RoZXIgb25lIGEgZGVhZCBlbmQuCisgICAgICAgICAgICBuZTAgPSBuZTEgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiBzdWNjc1tpMF06CisgICAgICAgICAgICAgICAgcyA9IHN1Y2NzW2ldCisgICAgICAgICAgICAgICAgcy5yZW1vdmUoaTApCisgICAgICAgICAgICAgICAgZSA9IGxlbihzKQorICAgICAgICAgICAgICAgIGlmIGUgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgbmUwICs9IDEKKyAgICAgICAgICAgICAgICBlbGlmIGUgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgbmUxICs9IDEKKyAgICAgICAgICAgIHJldHVybiBuZTAgPT0gMCBhbmQgbmUxIDwgMgorCisgICAgICAgICMgUHV0IGkwIGJhY2sgaW4gZWFjaCBvZiBpdHMgc3VjY2Vzc29yJ3Mgc3VjY2Vzc29yIGxpc3RzLgorCisgICAgICAgIGRlZiBhZGRfdG9fc3VjY2Vzc29ycyhpMCk6CisgICAgICAgICAgICBmb3IgaSBpbiBzdWNjc1tpMF06CisgICAgICAgICAgICAgICAgc3VjY3NbaV0uYXBwZW5kKGkwKQorCisgICAgICAgICMgR2VuZXJhdGUgdGhlIGZpcnN0IG1vdmUuCisgICAgICAgIGRlZiBmaXJzdCgpOgorICAgICAgICAgICAgaWYgbSA8IDEgb3IgbiA8IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgICMgU2luY2Ugd2UncmUgbG9va2luZyBmb3IgYSBjeWNsZSwgaXQgZG9lc24ndCBtYXR0ZXIgd2hlcmUgd2UKKyAgICAgICAgICAgICMgc3RhcnQuICBTdGFydGluZyBpbiBhIGNvcm5lciBtYWtlcyB0aGUgMm5kIG1vdmUgZWFzeS4KKyAgICAgICAgICAgIGNvcm5lciA9IHNlbGYuY29vcmRzMmluZGV4KDAsIDApCisgICAgICAgICAgICByZW1vdmVfZnJvbV9zdWNjZXNzb3JzKGNvcm5lcikKKyAgICAgICAgICAgIHNlbGYubGFzdGlqID0gY29ybmVyCisgICAgICAgICAgICB5aWVsZCBjb3JuZXIKKyAgICAgICAgICAgIGFkZF90b19zdWNjZXNzb3JzKGNvcm5lcikKKworICAgICAgICAjIEdlbmVyYXRlIHRoZSBzZWNvbmQgbW92ZXMuCisgICAgICAgIGRlZiBzZWNvbmQoKToKKyAgICAgICAgICAgIGNvcm5lciA9IHNlbGYuY29vcmRzMmluZGV4KDAsIDApCisgICAgICAgICAgICBhc3NlcnQgc2VsZi5sYXN0aWogPT0gY29ybmVyICAjIGkuZS4sIHdlIHN0YXJ0ZWQgaW4gdGhlIGNvcm5lcgorICAgICAgICAgICAgaWYgbSA8IDMgb3IgbiA8IDM6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhc3NlcnQgbGVuKHN1Y2NzW2Nvcm5lcl0pID09IDIKKyAgICAgICAgICAgIGFzc2VydCBzZWxmLmNvb3JkczJpbmRleCgxLCAyKSBpbiBzdWNjc1tjb3JuZXJdCisgICAgICAgICAgICBhc3NlcnQgc2VsZi5jb29yZHMyaW5kZXgoMiwgMSkgaW4gc3VjY3NbY29ybmVyXQorICAgICAgICAgICAgIyBPbmx5IHR3byBjaG9pY2VzLiAgV2hpY2hldmVyIHdlIHBpY2ssIHRoZSBvdGhlciBtdXN0IGJlIHRoZQorICAgICAgICAgICAgIyBzcXVhcmUgcGlja2VkIG9uIG1vdmUgbSpuLCBhcyBpdCdzIHRoZSBvbmx5IHdheSB0byBnZXQgYmFjaworICAgICAgICAgICAgIyB0byAoMCwgMCkuICBTYXZlIGl0cyBpbmRleCBpbiBzZWxmLmZpbmFsIHNvIHRoYXQgbW92ZXMgYmVmb3JlCisgICAgICAgICAgICAjIHRoZSBsYXN0IGtub3cgaXQgbXVzdCBiZSBrZXB0IGZyZWUuCisgICAgICAgICAgICBmb3IgaSwgaiBpbiAoMSwgMiksICgyLCAxKToKKyAgICAgICAgICAgICAgICB0aGlzICA9IHNlbGYuY29vcmRzMmluZGV4KGksIGopCisgICAgICAgICAgICAgICAgZmluYWwgPSBzZWxmLmNvb3JkczJpbmRleCgzLWksIDMtaikKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmFsID0gZmluYWwKKworICAgICAgICAgICAgICAgIHJlbW92ZV9mcm9tX3N1Y2Nlc3NvcnModGhpcykKKyAgICAgICAgICAgICAgICBzdWNjc1tmaW5hbF0uYXBwZW5kKGNvcm5lcikKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3RpaiA9IHRoaXMKKyAgICAgICAgICAgICAgICB5aWVsZCB0aGlzCisgICAgICAgICAgICAgICAgc3VjY3NbZmluYWxdLnJlbW92ZShjb3JuZXIpCisgICAgICAgICAgICAgICAgYWRkX3RvX3N1Y2Nlc3NvcnModGhpcykKKworICAgICAgICAjIEdlbmVyYXRlIG1vdmVzIDMgdGhydSBtKm4tMS4KKyAgICAgICAgZGVmIGFkdmFuY2UobGVuPWxlbik6CisgICAgICAgICAgICAjIElmIHNvbWUgc3VjY2Vzc29yIGhhcyBvbmx5IG9uZSBleGl0LCBtdXN0IHRha2UgaXQuCisgICAgICAgICAgICAjIEVsc2UgZmF2b3Igc3VjY2Vzc29ycyB3aXRoIGZld2VyIGV4aXRzLgorICAgICAgICAgICAgY2FuZGlkYXRlcyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiBzdWNjc1tzZWxmLmxhc3Rpal06CisgICAgICAgICAgICAgICAgZSA9IGxlbihzdWNjc1tpXSkKKyAgICAgICAgICAgICAgICBhc3NlcnQgZSA+IDAsICJlbHNlIHJlbW92ZV9mcm9tX3N1Y2Nlc3NvcnMoKSBwcnVuaW5nIGZsYXdlZCIKKyAgICAgICAgICAgICAgICBpZiBlID09IDE6CisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMgPSBbKGUsIGkpXQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKChlLCBpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlcy5zb3J0KCkKKworICAgICAgICAgICAgZm9yIGUsIGkgaW4gY2FuZGlkYXRlczoKKyAgICAgICAgICAgICAgICBpZiBpICE9IHNlbGYuZmluYWw6CisgICAgICAgICAgICAgICAgICAgIGlmIHJlbW92ZV9mcm9tX3N1Y2Nlc3NvcnMoaSk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxhc3RpaiA9IGkKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGkKKyAgICAgICAgICAgICAgICAgICAgYWRkX3RvX3N1Y2Nlc3NvcnMoaSkKKworICAgICAgICAjIEdlbmVyYXRlIG1vdmVzIDMgdGhydSBtKm4tMS4gIEFsdGVybmF0aXZlIHZlcnNpb24gdXNpbmcgYQorICAgICAgICAjIHN0cm9uZ2VyIChidXQgbW9yZSBleHBlbnNpdmUpIGhldXJpc3RpYyB0byBvcmRlciBzdWNjZXNzb3JzLgorICAgICAgICAjIFNpbmNlIHRoZSAjIG9mIGJhY2t0cmFja2luZyBsZXZlbHMgaXMgbSpuLCBhIHBvb3IgbW92ZSBlYXJseSBvbgorICAgICAgICAjIGNhbiB0YWtlIGVvbnMgdG8gdW5kby4gIFNtYWxsZXN0IHNxdWFyZSBib2FyZCBmb3Igd2hpY2ggdGhpcworICAgICAgICAjIG1hdHRlcnMgYSBsb3QgaXMgNTJ4NTIuCisgICAgICAgIGRlZiBhZHZhbmNlX2hhcmQodm1pZD0obS0xKS8yLjAsIGhtaWQ9KG4tMSkvMi4wLCBsZW49bGVuKToKKyAgICAgICAgICAgICMgSWYgc29tZSBzdWNjZXNzb3IgaGFzIG9ubHkgb25lIGV4aXQsIG11c3QgdGFrZSBpdC4KKyAgICAgICAgICAgICMgRWxzZSBmYXZvciBzdWNjZXNzb3JzIHdpdGggZmV3ZXIgZXhpdHMuCisgICAgICAgICAgICAjIEJyZWFrIHRpZXMgdmlhIG1heCBkaXN0YW5jZSBmcm9tIGJvYXJkIGNlbnRlcnBvaW50IChmYXZvcgorICAgICAgICAgICAgIyBjb3JuZXJzIGFuZCBlZGdlcyB3aGVuZXZlciBwb3NzaWJsZSkuCisgICAgICAgICAgICBjYW5kaWRhdGVzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHN1Y2NzW3NlbGYubGFzdGlqXToKKyAgICAgICAgICAgICAgICBlID0gbGVuKHN1Y2NzW2ldKQorICAgICAgICAgICAgICAgIGFzc2VydCBlID4gMCwgImVsc2UgcmVtb3ZlX2Zyb21fc3VjY2Vzc29ycygpIHBydW5pbmcgZmxhd2VkIgorICAgICAgICAgICAgICAgIGlmIGUgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlcyA9IFsoZSwgMCwgaSldCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaTEsIGoxID0gc2VsZi5pbmRleDJjb29yZHMoaSkKKyAgICAgICAgICAgICAgICBkID0gKGkxIC0gdm1pZCkqKjIgKyAoajEgLSBobWlkKSoqMgorICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuYXBwZW5kKChlLCAtZCwgaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMuc29ydCgpCisKKyAgICAgICAgICAgIGZvciBlLCBkLCBpIGluIGNhbmRpZGF0ZXM6CisgICAgICAgICAgICAgICAgaWYgaSAhPSBzZWxmLmZpbmFsOgorICAgICAgICAgICAgICAgICAgICBpZiByZW1vdmVfZnJvbV9zdWNjZXNzb3JzKGkpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sYXN0aWogPSBpCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgICAgICAgICAgICAgIGFkZF90b19zdWNjZXNzb3JzKGkpCisKKyAgICAgICAgIyBHZW5lcmF0ZSB0aGUgbGFzdCBtb3ZlLgorICAgICAgICBkZWYgbGFzdCgpOgorICAgICAgICAgICAgYXNzZXJ0IHNlbGYuZmluYWwgaW4gc3VjY3Nbc2VsZi5sYXN0aWpdCisgICAgICAgICAgICB5aWVsZCBzZWxmLmZpbmFsCisKKyAgICAgICAgaWYgbSpuIDwgNDoKKyAgICAgICAgICAgIHNlbGYuc3F1YXJlZ2VuZXJhdG9ycyA9IFtmaXJzdF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc3F1YXJlZ2VuZXJhdG9ycyA9IFtmaXJzdCwgc2Vjb25kXSArIFwKKyAgICAgICAgICAgICAgICBbaGFyZCBhbmQgYWR2YW5jZV9oYXJkIG9yIGFkdmFuY2VdICogKG0qbiAtIDMpICsgXAorICAgICAgICAgICAgICAgIFtsYXN0XQorCisgICAgZGVmIGNvb3JkczJpbmRleChzZWxmLCBpLCBqKToKKyAgICAgICAgYXNzZXJ0IDAgPD0gaSA8IHNlbGYubQorICAgICAgICBhc3NlcnQgMCA8PSBqIDwgc2VsZi5uCisgICAgICAgIHJldHVybiBpICogc2VsZi5uICsgagorCisgICAgZGVmIGluZGV4MmNvb3JkcyhzZWxmLCBpbmRleCk6CisgICAgICAgIGFzc2VydCAwIDw9IGluZGV4IDwgc2VsZi5tICogc2VsZi5uCisgICAgICAgIHJldHVybiBkaXZtb2QoaW5kZXgsIHNlbGYubikKKworICAgIGRlZiBfaW5pdF9ib2FyZChzZWxmKToKKyAgICAgICAgc3VjY3MgPSBzZWxmLnN1Y2NzCisgICAgICAgIGRlbCBzdWNjc1s6XQorICAgICAgICBtLCBuID0gc2VsZi5tLCBzZWxmLm4KKyAgICAgICAgYzJpID0gc2VsZi5jb29yZHMyaW5kZXgKKworICAgICAgICBvZmZzZXRzID0gWyggMSwgIDIpLCAoIDIsICAxKSwgKCAyLCAtMSksICggMSwgLTIpLAorICAgICAgICAgICAgICAgICAgICgtMSwgLTIpLCAoLTIsIC0xKSwgKC0yLCAgMSksICgtMSwgIDIpXQorICAgICAgICByYW5nZW4gPSByYW5nZShuKQorICAgICAgICBmb3IgaSBpbiByYW5nZShtKToKKyAgICAgICAgICAgIGZvciBqIGluIHJhbmdlbjoKKyAgICAgICAgICAgICAgICBzID0gW2MyaShpK2lvLCBqK2pvKSBmb3IgaW8sIGpvIGluIG9mZnNldHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAwIDw9IGkraW8gPCBtIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gaitqbyA8IG5dCisgICAgICAgICAgICAgICAgc3VjY3MuYXBwZW5kKHMpCisKKyAgICAjIEdlbmVyYXRlIHNvbHV0aW9ucy4KKyAgICBkZWYgc29sdmUoc2VsZik6CisgICAgICAgIHNlbGYuX2luaXRfYm9hcmQoKQorICAgICAgICBmb3IgeCBpbiBjb25qb2luKHNlbGYuc3F1YXJlZ2VuZXJhdG9ycyk6CisgICAgICAgICAgICB5aWVsZCB4CisKKyAgICBkZWYgcHJpbnRzb2x1dGlvbihzZWxmLCB4KToKKyAgICAgICAgbSwgbiA9IHNlbGYubSwgc2VsZi5uCisgICAgICAgIGFzc2VydCBsZW4oeCkgPT0gbSpuCisgICAgICAgIHcgPSBsZW4oc3RyKG0qbikpCisgICAgICAgIGZvcm1hdCA9ICIlIiArIHN0cih3KSArICJkIgorCisgICAgICAgIHNxdWFyZXMgPSBbW05vbmVdICogbiBmb3IgaSBpbiByYW5nZShtKV0KKyAgICAgICAgayA9IDEKKyAgICAgICAgZm9yIGkgaW4geDoKKyAgICAgICAgICAgIGkxLCBqMSA9IHNlbGYuaW5kZXgyY29vcmRzKGkpCisgICAgICAgICAgICBzcXVhcmVzW2kxXVtqMV0gPSBmb3JtYXQgJSBrCisgICAgICAgICAgICBrICs9IDEKKworICAgICAgICBzZXAgPSAiKyIgKyAoIi0iICogdyArICIrIikgKiBuCisgICAgICAgIHByaW50IHNlcAorICAgICAgICBmb3IgaSBpbiByYW5nZShtKToKKyAgICAgICAgICAgIHJvdyA9IHNxdWFyZXNbaV0KKyAgICAgICAgICAgIHByaW50ICJ8IiArICJ8Ii5qb2luKHJvdykgKyAifCIKKyAgICAgICAgICAgIHByaW50IHNlcAorCitjb25qb2luX3Rlc3RzID0gIiIiCisKK0dlbmVyYXRlIHRoZSAzLWJpdCBiaW5hcnkgbnVtYmVycyBpbiBvcmRlci4gIFRoaXMgaWxsdXN0cmF0ZXMgZHVtYmVzdC0KK3Bvc3NpYmxlIHVzZSBvZiBjb25qb2luLCBqdXN0IHRvIGdlbmVyYXRlIHRoZSBmdWxsIGNyb3NzLXByb2R1Y3QuCisKKz4+PiBmb3IgYyBpbiBjb25qb2luKFtsYW1iZGE6IGl0ZXIoKDAsIDEpKV0gKiAzKToKKy4uLiAgICAgcHJpbnQgYworWzAsIDAsIDBdCitbMCwgMCwgMV0KK1swLCAxLCAwXQorWzAsIDEsIDFdCitbMSwgMCwgMF0KK1sxLCAwLCAxXQorWzEsIDEsIDBdCitbMSwgMSwgMV0KKworRm9yIGVmZmljaWVuY3kgaW4gdHlwaWNhbCBiYWNrdHJhY2tpbmcgYXBwcywgY29uam9pbigpIHlpZWxkcyB0aGUgc2FtZSBsaXN0CitvYmplY3QgZWFjaCB0aW1lLiAgU28gaWYgeW91IHdhbnQgdG8gc2F2ZSBhd2F5IGEgZnVsbCBhY2NvdW50IG9mIGl0cworZ2VuZXJhdGVkIHNlcXVlbmNlLCB5b3UgbmVlZCB0byBjb3B5IGl0cyByZXN1bHRzLgorCis+Pj4gZGVmIGdlbmNvcHkoaXRlcmF0b3IpOgorLi4uICAgICBmb3IgeCBpbiBpdGVyYXRvcjoKKy4uLiAgICAgICAgIHlpZWxkIHhbOl0KKworPj4+IGZvciBuIGluIHJhbmdlKDEwKToKKy4uLiAgICAgYWxsID0gbGlzdChnZW5jb3B5KGNvbmpvaW4oW2xhbWJkYTogaXRlcigoMCwgMSkpXSAqIG4pKSkKKy4uLiAgICAgcHJpbnQgbiwgbGVuKGFsbCksIGFsbFswXSA9PSBbMF0gKiBuLCBhbGxbLTFdID09IFsxXSAqIG4KKzAgMSBUcnVlIFRydWUKKzEgMiBUcnVlIFRydWUKKzIgNCBUcnVlIFRydWUKKzMgOCBUcnVlIFRydWUKKzQgMTYgVHJ1ZSBUcnVlCis1IDMyIFRydWUgVHJ1ZQorNiA2NCBUcnVlIFRydWUKKzcgMTI4IFRydWUgVHJ1ZQorOCAyNTYgVHJ1ZSBUcnVlCis5IDUxMiBUcnVlIFRydWUKKworQW5kIHJ1biBhbiA4LXF1ZWVucyBzb2x2ZXIuCisKKz4+PiBxID0gUXVlZW5zKDgpCis+Pj4gTElNSVQgPSAyCis+Pj4gY291bnQgPSAwCis+Pj4gZm9yIHJvdzJjb2wgaW4gcS5zb2x2ZSgpOgorLi4uICAgICBjb3VudCArPSAxCisuLi4gICAgIGlmIGNvdW50IDw9IExJTUlUOgorLi4uICAgICAgICAgcHJpbnQgIlNvbHV0aW9uIiwgY291bnQKKy4uLiAgICAgICAgIHEucHJpbnRzb2x1dGlvbihyb3cyY29sKQorU29sdXRpb24gMQorKy0rLSstKy0rLSstKy0rLSsKK3xRfCB8IHwgfCB8IHwgfCB8CisrLSstKy0rLSstKy0rLSstKworfCB8IHwgfCB8UXwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfCB8IHwgfCB8IHxRfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHwgfCB8UXwgfCB8CisrLSstKy0rLSstKy0rLSstKworfCB8IHxRfCB8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfCB8IHwgfCB8UXwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfFF8IHwgfCB8IHwgfCB8CisrLSstKy0rLSstKy0rLSstKworfCB8IHwgfFF8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCitTb2x1dGlvbiAyCisrLSstKy0rLSstKy0rLSstKworfFF8IHwgfCB8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfCB8IHwgfFF8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHwgfCB8IHwgfFF8CisrLSstKy0rLSstKy0rLSstKworfCB8IHxRfCB8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfCB8IHwgfCB8UXwgfAorKy0rLSstKy0rLSstKy0rLSsKK3wgfCB8IHxRfCB8IHwgfCB8CisrLSstKy0rLSstKy0rLSstKworfCB8UXwgfCB8IHwgfCB8IHwKKystKy0rLSstKy0rLSstKy0rCit8IHwgfCB8IHxRfCB8IHwgfAorKy0rLSstKy0rLSstKy0rLSsKKworPj4+IHByaW50IGNvdW50LCAic29sdXRpb25zIGluIGFsbC4iCis5MiBzb2x1dGlvbnMgaW4gYWxsLgorCitBbmQgcnVuIGEgS25pZ2h0J3MgVG91ciBvbiBhIDEweDEwIGJvYXJkLiAgTm90ZSB0aGF0IHRoZXJlIGFyZSBhYm91dAorMjAsMDAwIHNvbHV0aW9ucyBldmVuIG9uIGEgNng2IGJvYXJkLCBzbyBkb24ndCBkYXJlIHJ1biB0aGlzIHRvIGV4aGF1c3Rpb24uCisKKz4+PiBrID0gS25pZ2h0cygxMCwgMTApCis+Pj4gTElNSVQgPSAyCis+Pj4gY291bnQgPSAwCis+Pj4gZm9yIHggaW4gay5zb2x2ZSgpOgorLi4uICAgICBjb3VudCArPSAxCisuLi4gICAgIGlmIGNvdW50IDw9IExJTUlUOgorLi4uICAgICAgICAgcHJpbnQgIlNvbHV0aW9uIiwgY291bnQKKy4uLiAgICAgICAgIGsucHJpbnRzb2x1dGlvbih4KQorLi4uICAgICBlbHNlOgorLi4uICAgICAgICAgYnJlYWsKK1NvbHV0aW9uIDEKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8ICAxfCA1OHwgMjd8IDM0fCAgM3wgNDB8IDI5fCAxMHwgIDV8ICA4fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgMjZ8IDM1fCAgMnwgNTd8IDI4fCAzM3wgIDR8ICA3fCAzMHwgMTF8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA1OXwxMDB8IDczfCAzNnwgNDF8IDU2fCAzOXwgMzJ8ICA5fCAgNnwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDc0fCAyNXwgNjB8IDU1fCA3MnwgMzd8IDQyfCA0OXwgMTJ8IDMxfAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgNjF8IDg2fCA5OXwgNzZ8IDYzfCA1MnwgNDd8IDM4fCA0M3wgNTB8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCAyNHwgNzV8IDYyfCA4NXwgNTR8IDcxfCA2NHwgNTF8IDQ4fCAxM3wKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDg3fCA5OHwgOTF8IDgwfCA3N3wgODR8IDUzfCA0NnwgNjV8IDQ0fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgOTB8IDIzfCA4OHwgOTV8IDcwfCA3OXwgNjh8IDgzfCAxNHwgMTd8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA5N3wgOTJ8IDIxfCA3OHwgODF8IDk0fCAxOXwgMTZ8IDQ1fCA2NnwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDIyfCA4OXwgOTZ8IDkzfCAyMHwgNjl8IDgyfCA2N3wgMTh8IDE1fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK1NvbHV0aW9uIDIKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8ICAxfCA1OHwgMjd8IDM0fCAgM3wgNDB8IDI5fCAxMHwgIDV8ICA4fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgMjZ8IDM1fCAgMnwgNTd8IDI4fCAzM3wgIDR8ICA3fCAzMHwgMTF8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA1OXwxMDB8IDczfCAzNnwgNDF8IDU2fCAzOXwgMzJ8ICA5fCAgNnwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDc0fCAyNXwgNjB8IDU1fCA3MnwgMzd8IDQyfCA0OXwgMTJ8IDMxfAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgNjF8IDg2fCA5OXwgNzZ8IDYzfCA1MnwgNDd8IDM4fCA0M3wgNTB8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCAyNHwgNzV8IDYyfCA4NXwgNTR8IDcxfCA2NHwgNTF8IDQ4fCAxM3wKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDg3fCA5OHwgODl8IDgwfCA3N3wgODR8IDUzfCA0NnwgNjV8IDQ0fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKK3wgOTB8IDIzfCA5MnwgOTV8IDcwfCA3OXwgNjh8IDgzfCAxNHwgMTd8CisrLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworfCA5N3wgODh8IDIxfCA3OHwgODF8IDk0fCAxOXwgMTZ8IDQ1fCA2NnwKKystLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCit8IDIyfCA5MXwgOTZ8IDkzfCAyMHwgNjl8IDgyfCA2N3wgMTh8IDE1fAorKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKKyIiIgorCit3ZWFrcmVmX3Rlc3RzID0gIiIiXAorR2VuZXJhdG9ycyBhcmUgd2Vha2x5IHJlZmVyZW5jYWJsZToKKworPj4+IGltcG9ydCB3ZWFrcmVmCis+Pj4gZGVmIGdlbigpOgorLi4uICAgICB5aWVsZCAnZm9vIScKKy4uLgorPj4+IHdyID0gd2Vha3JlZi5yZWYoZ2VuKQorPj4+IHdyKCkgaXMgZ2VuCitUcnVlCis+Pj4gcCA9IHdlYWtyZWYucHJveHkoZ2VuKQorCitHZW5lcmF0b3ItaXRlcmF0b3JzIGFyZSB3ZWFrbHkgcmVmZXJlbmNhYmxlIGFzIHdlbGw6CisKKz4+PiBnaSA9IGdlbigpCis+Pj4gd3IgPSB3ZWFrcmVmLnJlZihnaSkKKz4+PiB3cigpIGlzIGdpCitUcnVlCis+Pj4gcCA9IHdlYWtyZWYucHJveHkoZ2kpCis+Pj4gbGlzdChwKQorWydmb28hJ10KKworIiIiCisKK2Nvcm91dGluZV90ZXN0cyA9ICIiIlwKK1NlbmRpbmcgYSB2YWx1ZSBpbnRvIGEgc3RhcnRlZCBnZW5lcmF0b3I6CisKKz4+PiBkZWYgZigpOgorLi4uICAgICBwcmludCAoeWllbGQgMSkKKy4uLiAgICAgeWllbGQgMgorPj4+IGcgPSBmKCkKKz4+PiBnLm5leHQoKQorMQorPj4+IGcuc2VuZCg0MikKKzQyCisyCisKK1NlbmRpbmcgYSB2YWx1ZSBpbnRvIGEgbmV3IGdlbmVyYXRvciBwcm9kdWNlcyBhIFR5cGVFcnJvcjoKKworPj4+IGYoKS5zZW5kKCJmb28iKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorLi4uCitUeXBlRXJyb3I6IGNhbid0IHNlbmQgbm9uLU5vbmUgdmFsdWUgdG8gYSBqdXN0LXN0YXJ0ZWQgZ2VuZXJhdG9yCisKKworWWllbGQgYnkgaXRzZWxmIHlpZWxkcyBOb25lOgorCis+Pj4gZGVmIGYoKTogeWllbGQKKz4+PiBsaXN0KGYoKSkKK1tOb25lXQorCisKKworQW4gb2JzY2VuZSBhYnVzZSBvZiBhIHlpZWxkIGV4cHJlc3Npb24gd2l0aGluIGEgZ2VuZXJhdG9yIGV4cHJlc3Npb246CisKKz4+PiBsaXN0KCh5aWVsZCAyMSkgZm9yIGkgaW4gcmFuZ2UoNCkpCitbMjEsIE5vbmUsIDIxLCBOb25lLCAyMSwgTm9uZSwgMjEsIE5vbmVdCisKK0FuZCBhIG1vcmUgc2FuZSwgYnV0IHN0aWxsIHdlaXJkIHVzYWdlOgorCis+Pj4gZGVmIGYoKTogbGlzdChpIGZvciBpIGluIFsoeWllbGQgMjYpXSkKKz4+PiB0eXBlKGYoKSkKKzx0eXBlICdnZW5lcmF0b3InPgorCisKK0EgeWllbGQgZXhwcmVzc2lvbiB3aXRoIGF1Z21lbnRlZCBhc3NpZ25tZW50LgorCis+Pj4gZGVmIGNvcm91dGluZShzZXEpOgorLi4uICAgICBjb3VudCA9IDAKKy4uLiAgICAgd2hpbGUgY291bnQgPCAyMDA6CisuLi4gICAgICAgICBjb3VudCArPSB5aWVsZAorLi4uICAgICAgICAgc2VxLmFwcGVuZChjb3VudCkKKz4+PiBzZXEgPSBbXQorPj4+IGMgPSBjb3JvdXRpbmUoc2VxKQorPj4+IGMubmV4dCgpCis+Pj4gcHJpbnQgc2VxCitbXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMF0KKz4+PiBjLnNlbmQoMTApCis+Pj4gcHJpbnQgc2VxCitbMTAsIDIwXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMCwgMjAsIDMwXQorCisKK0NoZWNrIHNvbWUgc3ludGF4IGVycm9ycyBmb3IgeWllbGQgZXhwcmVzc2lvbnM6CisKKz4+PiBmPWxhbWJkYTogKHlpZWxkIDEpLCh5aWVsZCAyKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzIxXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiAneWllbGQnIG91dHNpZGUgZnVuY3Rpb24KKworPj4+IGRlZiBmKCk6IHJldHVybiBsYW1iZGEgeD0oeWllbGQpOiAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorU3ludGF4RXJyb3I6ICdyZXR1cm4nIHdpdGggYXJndW1lbnQgaW5zaWRlIGdlbmVyYXRvciAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzIyXT4sIGxpbmUgMSkKKworPj4+IGRlZiBmKCk6IHggPSB5aWVsZCA9IHkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsyM10+IiwgbGluZSAxCitTeW50YXhFcnJvcjogYXNzaWdubWVudCB0byB5aWVsZCBleHByZXNzaW9uIG5vdCBwb3NzaWJsZQorCis+Pj4gZGVmIGYoKTogKHlpZWxkIGJhcikgPSB5CitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjRdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byB5aWVsZCBleHByZXNzaW9uCisKKz4+PiBkZWYgZigpOiAoeWllbGQgYmFyKSArPSB5CitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjVdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byB5aWVsZCBleHByZXNzaW9uCisKKworTm93IGNoZWNrIHNvbWUgdGhyb3coKSBjb25kaXRpb25zOgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgd2hpbGUgVHJ1ZToKKy4uLiAgICAgICAgIHRyeToKKy4uLiAgICAgICAgICAgICBwcmludCAoeWllbGQpCisuLi4gICAgICAgICBleGNlcHQgVmFsdWVFcnJvcix2OgorLi4uICAgICAgICAgICAgIHByaW50ICJjYXVnaHQgVmFsdWVFcnJvciAoJXMpIiAlICh2KSwKKz4+PiBpbXBvcnQgc3lzCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCisKKz4+PiBnLnRocm93KFZhbHVlRXJyb3IpICMgdHlwZSBvbmx5CitjYXVnaHQgVmFsdWVFcnJvciAoKQorCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yKCJ4eXoiKSkgICMgdmFsdWUgb25seQorY2F1Z2h0IFZhbHVlRXJyb3IgKHh5eikKKworPj4+IGcudGhyb3coVmFsdWVFcnJvciwgVmFsdWVFcnJvcigxKSkgICAjIHZhbHVlK21hdGNoaW5nIHR5cGUKK2NhdWdodCBWYWx1ZUVycm9yICgxKQorCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yLCBUeXBlRXJyb3IoMSkpICAjIG1pc21hdGNoZWQgdHlwZSwgcmV3cmFwcGVkCitjYXVnaHQgVmFsdWVFcnJvciAoMSkKKworPj4+IGcudGhyb3coVmFsdWVFcnJvciwgVmFsdWVFcnJvcigxKSwgTm9uZSkgICAjIGV4cGxpY2l0IE5vbmUgdHJhY2ViYWNrCitjYXVnaHQgVmFsdWVFcnJvciAoMSkKKworPj4+IGcudGhyb3coVmFsdWVFcnJvcigxKSwgImZvbyIpICAgICAgICMgYmFkIGFyZ3MKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitUeXBlRXJyb3I6IGluc3RhbmNlIGV4Y2VwdGlvbiBtYXkgbm90IGhhdmUgYSBzZXBhcmF0ZSB2YWx1ZQorCis+Pj4gZy50aHJvdyhWYWx1ZUVycm9yLCAiZm9vIiwgMjMpICAgICAgIyBiYWQgYXJncworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAuLi4KK1R5cGVFcnJvcjogdGhyb3coKSB0aGlyZCBhcmd1bWVudCBtdXN0IGJlIGEgdHJhY2ViYWNrIG9iamVjdAorCis+Pj4gZGVmIHRocm93KGcsZXhjKToKKy4uLiAgICAgdHJ5OgorLi4uICAgICAgICAgcmFpc2UgZXhjCisuLi4gICAgIGV4Y2VwdDoKKy4uLiAgICAgICAgIGcudGhyb3coKnN5cy5leGNfaW5mbygpKQorPj4+IHRocm93KGcsVmFsdWVFcnJvcikgIyBkbyBpdCB3aXRoIHRyYWNlYmFjayBpbmNsdWRlZAorY2F1Z2h0IFZhbHVlRXJyb3IgKCkKKworPj4+IGcuc2VuZCgxKQorMQorCis+Pj4gdGhyb3coZyxUeXBlRXJyb3IpICAjIHRlcm1pbmF0ZSB0aGUgZ2VuZXJhdG9yCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorVHlwZUVycm9yCisKKz4+PiBwcmludCBnLmdpX2ZyYW1lCitOb25lCisKKz4+PiBnLnNlbmQoMikKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitTdG9wSXRlcmF0aW9uCisKKz4+PiBnLnRocm93KFZhbHVlRXJyb3IsNikgICAgICAgIyB0aHJvdyBvbiBjbG9zZWQgZ2VuZXJhdG9yCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorVmFsdWVFcnJvcjogNgorCis+Pj4gZigpLnRocm93KFZhbHVlRXJyb3IsNykgICAgICMgdGhyb3cgb24ganVzdC1vcGVuZWQgZ2VuZXJhdG9yCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorVmFsdWVFcnJvcjogNworCis+Pj4gZigpLnRocm93KCJhYmMiKSAgICAgIyB0aHJvdyBvbiBqdXN0LW9wZW5lZCBnZW5lcmF0b3IKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitUeXBlRXJyb3I6IGV4Y2VwdGlvbnMgbXVzdCBiZSBjbGFzc2VzLCBvciBpbnN0YW5jZXMsIG5vdCBzdHIKKworTm93IGxldCdzIHRyeSBjbG9zaW5nIGEgZ2VuZXJhdG9yOgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgdHJ5OiB5aWVsZAorLi4uICAgICBleGNlcHQgR2VuZXJhdG9yRXhpdDoKKy4uLiAgICAgICAgIHByaW50ICJleGl0aW5nIgorCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCis+Pj4gZy5jbG9zZSgpCitleGl0aW5nCis+Pj4gZy5jbG9zZSgpICAjIHNob3VsZCBiZSBuby1vcCBub3cKKworPj4+IGYoKS5jbG9zZSgpICAjIGNsb3NlIG9uIGp1c3Qtb3BlbmVkIGdlbmVyYXRvciBzaG91bGQgYmUgZmluZQorCis+Pj4gZGVmIGYoKTogeWllbGQgICAgICAjIGFuIGV2ZW4gc2ltcGxlciBnZW5lcmF0b3IKKz4+PiBmKCkuY2xvc2UoKSAgICAgICAgICMgY2xvc2UgYmVmb3JlIG9wZW5pbmcKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKz4+PiBnLmNsb3NlKCkgICAgICAgICAgICMgY2xvc2Ugbm9ybWFsbHkKKworQW5kIGZpbmFsaXphdGlvbjoKKworPj4+IGRlZiBmKCk6CisuLi4gICAgIHRyeTogeWllbGQKKy4uLiAgICAgZmluYWxseToKKy4uLiAgICAgICAgIHByaW50ICJleGl0aW5nIgorCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCis+Pj4gZGVsIGcKK2V4aXRpbmcKKworPj4+IGNsYXNzIGNvbnRleHQob2JqZWN0KToKKy4uLiAgICBkZWYgX19lbnRlcl9fKHNlbGYpOiBwYXNzCisuLi4gICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKTogcHJpbnQgJ2V4aXRpbmcnCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgd2l0aCBjb250ZXh0KCk6CisuLi4gICAgICAgICAgeWllbGQKKz4+PiBnID0gZigpCis+Pj4gZy5uZXh0KCkKKz4+PiBkZWwgZworZXhpdGluZworCisKK0dlbmVyYXRvckV4aXQgaXMgbm90IGNhdWdodCBieSBleGNlcHQgRXhjZXB0aW9uOgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgdHJ5OiB5aWVsZAorLi4uICAgICBleGNlcHQgRXhjZXB0aW9uOiBwcmludCAnZXhjZXB0JworLi4uICAgICBmaW5hbGx5OiBwcmludCAnZmluYWxseScKKworPj4+IGcgPSBmKCkKKz4+PiBnLm5leHQoKQorPj4+IGRlbCBnCitmaW5hbGx5CisKKworTm93IGxldCdzIHRyeSBzb21lIGlsbC1iZWhhdmVkIGdlbmVyYXRvcnM6CisKKz4+PiBkZWYgZigpOgorLi4uICAgICB0cnk6IHlpZWxkCisuLi4gICAgIGV4Y2VwdCBHZW5lcmF0b3JFeGl0OgorLi4uICAgICAgICAgeWllbGQgImZvbyEiCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCis+Pj4gZy5jbG9zZSgpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorUnVudGltZUVycm9yOiBnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0Cis+Pj4gZy5jbG9zZSgpCisKKworT3VyIGlsbC1iZWhhdmVkIGNvZGUgc2hvdWxkIGJlIGludm9rZWQgZHVyaW5nIEdDOgorCis+Pj4gaW1wb3J0IHN5cywgU3RyaW5nSU8KKz4+PiBvbGQsIHN5cy5zdGRlcnIgPSBzeXMuc3RkZXJyLCBTdHJpbmdJTy5TdHJpbmdJTygpCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCis+Pj4gZGVsIGcKKz4+PiBzeXMuc3RkZXJyLmdldHZhbHVlKCkuc3RhcnRzd2l0aCgKKy4uLiAgICAgIkV4Y2VwdGlvbiBSdW50aW1lRXJyb3I6ICdnZW5lcmF0b3IgaWdub3JlZCBHZW5lcmF0b3JFeGl0JyBpbiAiCisuLi4gKQorVHJ1ZQorPj4+IHN5cy5zdGRlcnIgPSBvbGQKKworCitBbmQgZXJyb3JzIHRocm93biBkdXJpbmcgY2xvc2luZyBzaG91bGQgcHJvcGFnYXRlOgorCis+Pj4gZGVmIGYoKToKKy4uLiAgICAgdHJ5OiB5aWVsZAorLi4uICAgICBleGNlcHQgR2VuZXJhdG9yRXhpdDoKKy4uLiAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZmllISIpCis+Pj4gZyA9IGYoKQorPj4+IGcubmV4dCgpCis+Pj4gZy5jbG9zZSgpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorVHlwZUVycm9yOiBmaWUhCisKKworRW5zdXJlIHRoYXQgdmFyaW91cyB5aWVsZCBleHByZXNzaW9uIGNvbnN0cnVjdHMgbWFrZSB0aGVpcgorZW5jbG9zaW5nIGZ1bmN0aW9uIGEgZ2VuZXJhdG9yOgorCis+Pj4gZGVmIGYoKTogeCArPSB5aWVsZAorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKz4+PiBkZWYgZigpOiB4ID0geWllbGQKKz4+PiB0eXBlKGYoKSkKKzx0eXBlICdnZW5lcmF0b3InPgorCis+Pj4gZGVmIGYoKTogbGFtYmRhIHg9KHlpZWxkKTogMQorPj4+IHR5cGUoZigpKQorPHR5cGUgJ2dlbmVyYXRvcic+CisKKz4+PiBkZWYgZigpOiB4PShpIGZvciBpIGluICh5aWVsZCkgaWYgKHlpZWxkKSkKKz4+PiB0eXBlKGYoKSkKKzx0eXBlICdnZW5lcmF0b3InPgorCis+Pj4gZGVmIGYoZCk6IGRbKHlpZWxkICJhIildID0gZFsoeWllbGQgImIiKV0gPSAyNworPj4+IGRhdGEgPSBbMSwyXQorPj4+IGcgPSBmKGRhdGEpCis+Pj4gdHlwZShnKQorPHR5cGUgJ2dlbmVyYXRvcic+Cis+Pj4gZy5zZW5kKE5vbmUpCisnYScKKz4+PiBkYXRhCitbMSwgMl0KKz4+PiBnLnNlbmQoMCkKKydiJworPj4+IGRhdGEKK1syNywgMl0KKz4+PiB0cnk6IGcuc2VuZCgxKQorLi4uIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOiBwYXNzCis+Pj4gZGF0YQorWzI3LCAyN10KKworIiIiCisKK3JlZmxlYWtzX3Rlc3RzID0gIiIiCitQcmlvciB0byBhZGRpbmcgY3ljbGUtR0Mgc3VwcG9ydCB0byBpdGVydG9vbHMudGVlLCB0aGlzIGNvZGUgd291bGQgbGVhaworcmVmZXJlbmNlcy4gV2UgYWRkIGl0IHRvIHRoZSBzdGFuZGFyZCBzdWl0ZSBzbyB0aGUgcm91dGluZSByZWZsZWFrLXRlc3RzCit3b3VsZCB0cmlnZ2VyIGlmIGl0IHN0YXJ0cyBiZWluZyB1bmNsZWFuYWJsZSBhZ2Fpbi4KKworPj4+IGltcG9ydCBpdGVydG9vbHMKKz4+PiBkZWYgbGVhaygpOgorLi4uICAgICBjbGFzcyBnZW46CisuLi4gICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisuLi4gICAgICAgICAgICAgcmV0dXJuIHNlbGYKKy4uLiAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorLi4uICAgICAgICAgICAgIHJldHVybiBzZWxmLml0ZW0KKy4uLiAgICAgZyA9IGdlbigpCisuLi4gICAgIGhlYWQsIHRhaWwgPSBpdGVydG9vbHMudGVlKGcpCisuLi4gICAgIGcuaXRlbSA9IGhlYWQKKy4uLiAgICAgcmV0dXJuIGhlYWQKKz4+PiBpdCA9IGxlYWsoKQorCitNYWtlIHN1cmUgdG8gYWxzbyB0ZXN0IHRoZSBpbnZvbHZlbWVudCBvZiB0aGUgdGVlLWludGVybmFsIHRlZWRhdGFvYmplY3QsCit3aGljaCBzdG9yZXMgcmV0dXJuZWQgaXRlbXMuCisKKz4+PiBpdGVtID0gaXQubmV4dCgpCisKKworCitUaGlzIHRlc3QgbGVha2VkIGF0IG9uZSBwb2ludCBkdWUgdG8gZ2VuZXJhdG9yIGZpbmFsaXphdGlvbi9kZXN0cnVjdGlvbi4KK0l0IHdhcyBjb3BpZWQgZnJvbSBMaWIvdGVzdC9sZWFrZXJzL3Rlc3RfZ2VuZXJhdG9yX2N5Y2xlLnB5IGJlZm9yZSB0aGUgZmlsZQord2FzIHJlbW92ZWQuCisKKz4+PiBkZWYgbGVhaygpOgorLi4uICAgIGRlZiBnZW4oKToKKy4uLiAgICAgICAgd2hpbGUgVHJ1ZToKKy4uLiAgICAgICAgICAgIHlpZWxkIGcKKy4uLiAgICBnID0gZ2VuKCkKKworPj4+IGxlYWsoKQorCisKKworVGhpcyB0ZXN0IGlzbid0IHJlYWxseSBnZW5lcmF0b3IgcmVsYXRlZCwgYnV0IHJhdGhlciBleGNlcHRpb24taW4tY2xlYW51cAorcmVsYXRlZC4gVGhlIGNvcm91dGluZSB0ZXN0cyAoYWJvdmUpIGp1c3QgaGFwcGVuIHRvIGNhdXNlIGFuIGV4Y2VwdGlvbiBpbgordGhlIGdlbmVyYXRvcidzIF9fZGVsX18gKHRwX2RlbCkgbWV0aG9kLiBXZSBjYW4gYWxzbyB0ZXN0IGZvciB0aGlzCitleHBsaWNpdGx5LCB3aXRob3V0IGdlbmVyYXRvcnMuIFdlIGRvIGhhdmUgdG8gcmVkaXJlY3Qgc3RkZXJyIHRvIGF2b2lkCitwcmludGluZyB3YXJuaW5ncyBhbmQgdG8gZG91YmxlY2hlY2sgdGhhdCB3ZSBhY3R1YWxseSB0ZXN0ZWQgd2hhdCB3ZSB3YW50ZWQKK3RvIHRlc3QuCisKKz4+PiBpbXBvcnQgc3lzLCBTdHJpbmdJTworPj4+IG9sZCA9IHN5cy5zdGRlcnIKKz4+PiB0cnk6CisuLi4gICAgIHN5cy5zdGRlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisuLi4gICAgIGNsYXNzIExlYWtlcjoKKy4uLiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorLi4uICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorLi4uCisuLi4gICAgIGwgPSBMZWFrZXIoKQorLi4uICAgICBkZWwgbAorLi4uICAgICBlcnIgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkuc3RyaXAoKQorLi4uICAgICBlcnIuc3RhcnRzd2l0aCgKKy4uLiAgICAgICAgICJFeGNlcHRpb24gUnVudGltZUVycm9yOiBSdW50aW1lRXJyb3IoKSBpbiA8IgorLi4uICAgICApCisuLi4gICAgIGVyci5lbmRzd2l0aCgiPiBpZ25vcmVkIikKKy4uLiAgICAgbGVuKGVyci5zcGxpdGxpbmVzKCkpCisuLi4gZmluYWxseToKKy4uLiAgICAgc3lzLnN0ZGVyciA9IG9sZAorVHJ1ZQorVHJ1ZQorMQorCisKKworVGhlc2UgcmVmbGVhayB0ZXN0cyBzaG91bGQgcGVyaGFwcyBiZSBpbiBhIHRlc3RmaWxlIG9mIHRoZWlyIG93biwKK3Rlc3RfZ2VuZXJhdG9ycyBqdXN0IGhhcHBlbmVkIHRvIGJlIHRoZSB0ZXN0IHRoYXQgZHJldyB0aGVzZSBvdXQuCisKKyIiIgorCitfX3Rlc3RfXyA9IHsidHV0IjogICAgICB0dXRvcmlhbF90ZXN0cywKKyAgICAgICAgICAgICJwZXAiOiAgICAgIHBlcF90ZXN0cywKKyAgICAgICAgICAgICJlbWFpbCI6ICAgIGVtYWlsX3Rlc3RzLAorICAgICAgICAgICAgImZ1biI6ICAgICAgZnVuX3Rlc3RzLAorICAgICAgICAgICAgInN5bnRheCI6ICAgc3ludGF4X3Rlc3RzLAorICAgICAgICAgICAgImNvbmpvaW4iOiAgY29uam9pbl90ZXN0cywKKyAgICAgICAgICAgICJ3ZWFrcmVmIjogIHdlYWtyZWZfdGVzdHMsCisgICAgICAgICAgICAiY29yb3V0aW5lIjogIGNvcm91dGluZV90ZXN0cywKKyAgICAgICAgICAgICJyZWZsZWFrcyI6IHJlZmxlYWtzX3Rlc3RzLAorICAgICAgICAgICAgfQorCisjIE1hZ2ljIHRlc3QgbmFtZSB0aGF0IHJlZ3J0ZXN0LnB5IGludm9rZXMgKmFmdGVyKiBpbXBvcnRpbmcgdGhpcyBtb2R1bGUuCisjIFRoaXMgd29ybXMgYXJvdW5kIGEgYm9vdHN0cmFwIHByb2JsZW0uCisjIE5vdGUgdGhhdCBkb2N0ZXN0IGFuZCByZWdydGVzdCBib3RoIGxvb2sgaW4gc3lzLmFyZ3YgZm9yIGEgIi12IiBhcmd1bWVudCwKKyMgc28gdGhpcyB3b3JrcyBhcyBleHBlY3RlZCBpbiBib3RoIHdheXMgb2YgcnVubmluZyByZWdydGVzdC4KK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgdGVzdF9nZW5lcmF0b3JzCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfZ2VuZXJhdG9ycywgdmVyYm9zZSkKKworIyBUaGlzIHBhcnQgaXNuJ3QgbmVlZGVkIGZvciByZWdydGVzdCwgYnV0IGZvciBydW5uaW5nIHRoZSB0ZXN0IGRpcmVjdGx5LgoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oMSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBhZTYyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNTFmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk3NWI1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CkBAIC0wLDAgKzEsMjU2IEBACisiIiIKK1Rlc3RzIGNvbW1vbiB0byBnZW5lcmljcGF0aCwgbWFjcGF0aCwgbnRwYXRoIGFuZCBwb3NpeHBhdGgKKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgb3MKK2ltcG9ydCBnZW5lcmljcGF0aAoraW1wb3J0IHN5cworCisKK2RlZiBzYWZlX3JtZGlyKGRpcm5hbWUpOgorICAgIHRyeToKKyAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcGFzcworCisKK2NsYXNzIEdlbmVyaWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoZSBwYXRoIG1vZHVsZSB0byBiZSB0ZXN0ZWQKKyAgICBwYXRobW9kdWxlID0gZ2VuZXJpY3BhdGgKKyAgICBjb21tb25fYXR0cmlidXRlcyA9IFsnY29tbW9ucHJlZml4JywgJ2dldHNpemUnLCAnZ2V0YXRpbWUnLCAnZ2V0Y3RpbWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRtdGltZScsICdleGlzdHMnLCAnaXNkaXInLCAnaXNmaWxlJ10KKyAgICBhdHRyaWJ1dGVzID0gW10KKworICAgIGRlZiB0ZXN0X25vX2FyZ3VtZW50KHNlbGYpOgorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmNvbW1vbl9hdHRyaWJ1dGVzICsgc2VsZi5hdHRyaWJ1dGVzOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgICAgIGdldGF0dHIoc2VsZi5wYXRobW9kdWxlLCBhdHRyKSgpCisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsKCJ7fS57fSgpIGRpZCBub3QgcmFpc2UgYSBUeXBlRXJyb3IiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoc2VsZi5wYXRobW9kdWxlLl9fbmFtZV9fLCBhdHRyKSkKKworICAgIGRlZiB0ZXN0X2NvbW1vbnByZWZpeChzZWxmKToKKyAgICAgICAgY29tbW9ucHJlZml4ID0gc2VsZi5wYXRobW9kdWxlLmNvbW1vbnByZWZpeAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29tbW9ucHJlZml4KFtdKSwKKyAgICAgICAgICAgICIiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvbW1vbnByZWZpeChbIi9ob21lL3N3ZW5zb24vc3BhbSIsICIvaG9tZS9zd2VuL3NwYW0iXSksCisgICAgICAgICAgICAiL2hvbWUvc3dlbiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbi9zcGFtIiwgIi9ob21lL3N3ZW4vZWdncyJdKSwKKyAgICAgICAgICAgICIvaG9tZS9zd2VuLyIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbi9zcGFtIiwgIi9ob21lL3N3ZW4vc3BhbSJdKSwKKyAgICAgICAgICAgICIvaG9tZS9zd2VuL3NwYW0iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNvbW1vbnByZWZpeChbImhvbWU6c3dlbnNvbjpzcGFtIiwgImhvbWU6c3dlbjpzcGFtIl0pLAorICAgICAgICAgICAgImhvbWU6c3dlbiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29tbW9ucHJlZml4KFsiOmhvbWU6c3dlbjpzcGFtIiwgIjpob21lOnN3ZW46ZWdncyJdKSwKKyAgICAgICAgICAgICI6aG9tZTpzd2VuOiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgY29tbW9ucHJlZml4KFsiOmhvbWU6c3dlbjpzcGFtIiwgIjpob21lOnN3ZW46c3BhbSJdKSwKKyAgICAgICAgICAgICI6aG9tZTpzd2VuOnNwYW0iCisgICAgICAgICkKKworICAgICAgICB0ZXN0bGlzdCA9IFsnJywgJ2FiYycsICdYYmNkJywgJ1hiJywgJ1hZJywgJ2FiY2QnLAorICAgICAgICAgICAgICAgICAgICAnYVhjJywgJ2FiZCcsICdhYicsICdhWCcsICdhYmNYJ10KKyAgICAgICAgZm9yIHMxIGluIHRlc3RsaXN0OgorICAgICAgICAgICAgZm9yIHMyIGluIHRlc3RsaXN0OgorICAgICAgICAgICAgICAgIHAgPSBjb21tb25wcmVmaXgoW3MxLCBzMl0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMxLnN0YXJ0c3dpdGgocCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMyLnN0YXJ0c3dpdGgocCkpCisgICAgICAgICAgICAgICAgaWYgczEgIT0gczI6CisgICAgICAgICAgICAgICAgICAgIG4gPSBsZW4ocCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzMVtuOm4rMV0sIHMyW246bisxXSkKKworICAgIGRlZiB0ZXN0X2dldHNpemUoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXRobW9kdWxlLmdldHNpemUodGVzdF9zdXBwb3J0LlRFU1RGTiksIDMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZWQ6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF90aW1lKHNlbGYpOgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiYWIiKQorICAgICAgICAgICAgZi53cml0ZSgiYmFyIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIGQgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsICJmb29iYXIiKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGhtb2R1bGUuZ2V0Y3RpbWUodGVzdF9zdXBwb3J0LlRFU1RGTiksCisgICAgICAgICAgICAgICAgc2VsZi5wYXRobW9kdWxlLmdldG10aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZWQ6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9leGlzdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgRmFsc2UpCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgVHJ1ZSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhdGhtb2R1bGUgPT0gZ2VuZXJpY3BhdGg6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUubGV4aXN0cyh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfaXNkaXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5wYXRobW9kdWxlLmlzZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTiksIEZhbHNlKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBvcy5ta2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTiksIFRydWUpCisgICAgICAgICAgICBvcy5ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIHNhZmVfcm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2lzZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiZm9vIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBUcnVlKQorICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBvcy5ta2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLnBhdGhtb2R1bGUuaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pLCBGYWxzZSkKKyAgICAgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgc2FmZV9ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisKKyMgRm9sbG93aW5nIFRlc3RDYXNlIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBydW4gZnJvbSB0ZXN0X2dlbmVyaWNwYXRoLgorIyBJdCBpcyBpbmhlcml0ZWQgYnkgb3RoZXIgdGVzdCBtb2R1bGVzIChtYWNwYXRoLCBudHBhdGgsIHBvc2l4cGF0aCkuCisKK2NsYXNzIENvbW1vblRlc3QoR2VuZXJpY1Rlc3QpOgorICAgICMgVGhlIHBhdGggbW9kdWxlIHRvIGJlIHRlc3RlZAorICAgIHBhdGhtb2R1bGUgPSBOb25lCisgICAgY29tbW9uX2F0dHJpYnV0ZXMgPSBHZW5lcmljVGVzdC5jb21tb25fYXR0cmlidXRlcyArIFsKKyAgICAgICAgIyBQcm9wZXJ0aWVzCisgICAgICAgICdjdXJkaXInLCAncGFyZGlyJywgJ2V4dHNlcCcsICdzZXAnLAorICAgICAgICAncGF0aHNlcCcsICdkZWZwYXRoJywgJ2FsdHNlcCcsICdkZXZudWxsJywKKyAgICAgICAgIyBNZXRob2RzCisgICAgICAgICdub3JtY2FzZScsICdzcGxpdGRyaXZlJywgJ2V4cGFuZHZhcnMnLCAnbm9ybXBhdGgnLCAnYWJzcGF0aCcsCisgICAgICAgICdqb2luJywgJ3NwbGl0JywgJ3NwbGl0ZXh0JywgJ2lzYWJzJywgJ2Jhc2VuYW1lJywgJ2Rpcm5hbWUnLAorICAgICAgICAnbGV4aXN0cycsICdpc2xpbmsnLCAnaXNtb3VudCcsICdleHBhbmR1c2VyJywgJ25vcm1wYXRoJywgJ3JlYWxwYXRoJywKKyAgICBdCisKKyAgICBkZWYgdGVzdF9ub3JtY2FzZShzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IG5vcm1jYXNlKCkgaXMgaWRlbXBvdGVudAorICAgICAgICBwID0gIkZvTy8uL0JhUiIKKyAgICAgICAgcCA9IHNlbGYucGF0aG1vZHVsZS5ub3JtY2FzZShwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIHNlbGYucGF0aG1vZHVsZS5ub3JtY2FzZShwKSkKKworICAgIGRlZiB0ZXN0X3NwbGl0ZHJpdmUoc2VsZik6CisgICAgICAgICMgc3BsaXRkcml2ZSBmb3Igbm9uLU5UIHBhdGhzCisgICAgICAgIHNwbGl0ZHJpdmUgPSBzZWxmLnBhdGhtb2R1bGUuc3BsaXRkcml2ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0ZHJpdmUoIi9mb28vYmFyIiksICgiIiwgIi9mb28vYmFyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRkcml2ZSgiZm9vOmJhciIpLCAoIiIsICJmb286YmFyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRkcml2ZSgiOmZvbzpiYXIiKSwgKCIiLCAiOmZvbzpiYXIiKSkKKworICAgIGRlZiB0ZXN0X2V4cGFuZHZhcnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYucGF0aG1vZHVsZS5fX25hbWVfXyA9PSAnbWFjcGF0aCc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdtYWNwYXRoLmV4cGFuZHZhcnMgaXMgYSBzdHViJykKKyAgICAgICAgZXhwYW5kdmFycyA9IHNlbGYucGF0aG1vZHVsZS5leHBhbmR2YXJzCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBlbnYuY2xlYXIoKQorICAgICAgICAgICAgZW52WyJmb28iXSA9ICJiYXIiCisgICAgICAgICAgICBlbnZbIntmb28iXSA9ICJiYXoxIgorICAgICAgICAgICAgZW52WyJ7Zm9vfSJdID0gImJhejIiCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoImZvbyIpLCAiZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJGZvbyBiYXIiKSwgImJhciBiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIke2Zvb31iYXIiKSwgImJhcmJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiRbZm9vXWJhciIpLCAiJFtmb29dYmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJGJhciBiYXIiKSwgIiRiYXIgYmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJD9iYXIiKSwgIiQ/YmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kdmFycygiJHtmb299YmFyIiksICJiYXJiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIkZm9vfWJhciIpLCAiYmFyfWJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiR7Zm9vIiksICIke2ZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiR7e2Zvb319IiksICJiYXoxfSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGFuZHZhcnMoIiRmb28kZm9vIiksICJiYXJiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBhbmR2YXJzKCIkYmFyJGJhciIpLCAiJGJhciRiYXIiKQorCisgICAgZGVmIHRlc3RfYWJzcGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vIiwgc2VsZi5wYXRobW9kdWxlLmFic3BhdGgoImZvbyIpKQorCisgICAgICAgICMgQWJzcGF0aCByZXR1cm5zIGJ5dGVzIHdoZW4gdGhlIGFyZyBpcyBieXRlcworICAgICAgICBmb3IgcGF0aCBpbiAoJycsICdmb28nLCAnZlx4ZjJceGYyJywgJy9mb28nLCAnQzpcXCcpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlbGYucGF0aG1vZHVsZS5hYnNwYXRoKHBhdGgpLCBzdHIpCisKKyAgICBkZWYgdGVzdF9yZWFscGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiZm9vIiwgc2VsZi5wYXRobW9kdWxlLnJlYWxwYXRoKCJmb28iKSkKKworICAgIGRlZiB0ZXN0X25vcm1wYXRoX2lzc3VlNTgyNyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgbm9ybXBhdGggcHJlc2VydmVzIHVuaWNvZGUKKyAgICAgICAgZm9yIHBhdGggaW4gKHUnJywgdScuJywgdScvJywgdSdcXCcsIHUnLy8vZm9vLy4vL2Jhci8vJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5wYXRobW9kdWxlLm5vcm1wYXRoKHBhdGgpLCB1bmljb2RlKQorCisgICAgZGVmIHRlc3RfYWJzcGF0aF9pc3N1ZTM0MjYoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBhYnNwYXRoIHJldHVybnMgdW5pY29kZSB3aGVuIHRoZSBhcmcgaXMgdW5pY29kZQorICAgICAgICAjIHdpdGggYm90aCBBU0NJSSBhbmQgbm9uLUFTQ0lJIGN3ZHMuCisgICAgICAgIGFic3BhdGggPSBzZWxmLnBhdGhtb2R1bGUuYWJzcGF0aAorICAgICAgICBmb3IgcGF0aCBpbiAodScnLCB1J2Z1dScsIHUnZlx4ZjlceGY5JywgdScvZnV1JywgdSdVOlxcJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYWJzcGF0aChwYXRoKSwgdW5pY29kZSkKKworICAgICAgICB1bmljd2QgPSB1J1x4ZTd3XHhmMCcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnNlbmNvZGluZyA9IHRlc3Rfc3VwcG9ydC5URVNURk5fRU5DT0RJTkcgb3IgImFzY2lpIgorICAgICAgICAgICAgdW5pY3dkLmVuY29kZShmc2VuY29kaW5nKQorICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgIyBGUyBlbmNvZGluZyBpcyBwcm9iYWJseSBBU0NJSQorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudGVtcF9jd2QodW5pY3dkKToKKyAgICAgICAgICAgICAgICBmb3IgcGF0aCBpbiAodScnLCB1J2Z1dScsIHUnZlx4ZjlceGY5JywgdScvZnV1JywgdSdVOlxcJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhYnNwYXRoKHBhdGgpLCB1bmljb2RlKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicsCisgICAgICAgICJNYWMgT1MgWCBkZW5pZXMgdGhlIGNyZWF0aW9uIG9mIGEgZGlyZWN0b3J5IHdpdGggYW4gaW52YWxpZCB1dGY4IG5hbWUiKQorICAgIGRlZiB0ZXN0X25vbmFzY2lpX2Fic3BhdGgoc2VsZik6CisgICAgICAgICMgVGVzdCBub24tQVNDSUksIG5vbi1VVEY4IGJ5dGVzIGluIHRoZSBwYXRoLgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50ZW1wX2N3ZCgnXHhlN3dceGYwJyk6CisgICAgICAgICAgICBzZWxmLnRlc3RfYWJzcGF0aCgpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoR2VuZXJpY1Rlc3QpCisKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JhYzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JhYzM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5leHBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTkzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZW5leHBzLnB5CkBAIC0wLDAgKzEsMjgzIEBACitkb2N0ZXN0cyA9ICIiIgorCitUZXN0IHNpbXBsZSBsb29wIHdpdGggY29uZGl0aW9uYWwKKworICAgID4+PiBzdW0oaSppIGZvciBpIGluIHJhbmdlKDEwMCkgaWYgaSYxID09IDEpCisgICAgMTY2NjUwCisKK1Rlc3Qgc2ltcGxlIG5lc3RpbmcKKworICAgID4+PiBsaXN0KChpLGopIGZvciBpIGluIHJhbmdlKDMpIGZvciBqIGluIHJhbmdlKDQpICkKKyAgICBbKDAsIDApLCAoMCwgMSksICgwLCAyKSwgKDAsIDMpLCAoMSwgMCksICgxLCAxKSwgKDEsIDIpLCAoMSwgMyksICgyLCAwKSwgKDIsIDEpLCAoMiwgMiksICgyLCAzKV0KKworVGVzdCBuZXN0aW5nIHdpdGggdGhlIGlubmVyIGV4cHJlc3Npb24gZGVwZW5kZW50IG9uIHRoZSBvdXRlcgorCisgICAgPj4+IGxpc3QoKGksaikgZm9yIGkgaW4gcmFuZ2UoNCkgZm9yIGogaW4gcmFuZ2UoaSkgKQorICAgIFsoMSwgMCksICgyLCAwKSwgKDIsIDEpLCAoMywgMCksICgzLCAxKSwgKDMsIDIpXQorCitNYWtlIHN1cmUgdGhlIGluZHVjdGlvbiB2YXJpYWJsZSBpcyBub3QgZXhwb3NlZAorCisgICAgPj4+IGkgPSAyMAorICAgID4+PiBzdW0oaSppIGZvciBpIGluIHJhbmdlKDEwMCkpCisgICAgMzI4MzUwCisgICAgPj4+IGkKKyAgICAyMAorCitUZXN0IGZpcnN0IGNsYXNzCisKKyAgICA+Pj4gZyA9IChpKmkgZm9yIGkgaW4gcmFuZ2UoNCkpCisgICAgPj4+IHR5cGUoZykKKyAgICA8dHlwZSAnZ2VuZXJhdG9yJz4KKyAgICA+Pj4gbGlzdChnKQorICAgIFswLCAxLCA0LCA5XQorCitUZXN0IGRpcmVjdCBjYWxscyB0byBuZXh0KCkKKworICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSgzKSkKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICAwCisgICAgPj4+IGcubmV4dCgpCisgICAgMQorICAgID4+PiBnLm5leHQoKQorICAgIDQKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8cHlzaGVsbCMyMT4iLCBsaW5lIDEsIGluIC10b3BsZXZlbC0KKyAgICAgICAgZy5uZXh0KCkKKyAgICBTdG9wSXRlcmF0aW9uCisKK0RvZXMgaXQgc3RheSBzdG9wcGVkPworCisgICAgPj4+IGcubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHB5c2hlbGwjMjE+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCisgICAgICAgIGcubmV4dCgpCisgICAgU3RvcEl0ZXJhdGlvbgorICAgID4+PiBsaXN0KGcpCisgICAgW10KKworVGVzdCBydW5uaW5nIGdlbiB3aGVuIGRlZmluaW5nIGZ1bmN0aW9uIGlzIG91dCBvZiBzY29wZQorCisgICAgPj4+IGRlZiBmKG4pOgorICAgIC4uLiAgICAgcmV0dXJuIChpKmkgZm9yIGkgaW4geHJhbmdlKG4pKQorICAgID4+PiBsaXN0KGYoMTApKQorICAgIFswLCAxLCA0LCA5LCAxNiwgMjUsIDM2LCA0OSwgNjQsIDgxXQorCisgICAgPj4+IGRlZiBmKG4pOgorICAgIC4uLiAgICAgcmV0dXJuICgoaSxqKSBmb3IgaSBpbiB4cmFuZ2UoMykgZm9yIGogaW4geHJhbmdlKG4pKQorICAgID4+PiBsaXN0KGYoNCkpCisgICAgWygwLCAwKSwgKDAsIDEpLCAoMCwgMiksICgwLCAzKSwgKDEsIDApLCAoMSwgMSksICgxLCAyKSwgKDEsIDMpLCAoMiwgMCksICgyLCAxKSwgKDIsIDIpLCAoMiwgMyldCisgICAgPj4+IGRlZiBmKG4pOgorICAgIC4uLiAgICAgcmV0dXJuICgoaSxqKSBmb3IgaSBpbiB4cmFuZ2UoMykgZm9yIGogaW4geHJhbmdlKDQpIGlmIGogaW4geHJhbmdlKG4pKQorICAgID4+PiBsaXN0KGYoNCkpCisgICAgWygwLCAwKSwgKDAsIDEpLCAoMCwgMiksICgwLCAzKSwgKDEsIDApLCAoMSwgMSksICgxLCAyKSwgKDEsIDMpLCAoMiwgMCksICgyLCAxKSwgKDIsIDIpLCAoMiwgMyldCisgICAgPj4+IGxpc3QoZigyKSkKKyAgICBbKDAsIDApLCAoMCwgMSksICgxLCAwKSwgKDEsIDEpLCAoMiwgMCksICgyLCAxKV0KKworVmVyaWZ5IHRoYXQgcGFyZW50aGVzaXMgYXJlIHJlcXVpcmVkIGluIGEgc3RhdGVtZW50CisKKyAgICA+Pj4gZGVmIGYobik6CisgICAgLi4uICAgICByZXR1cm4gaSppIGZvciBpIGluIHhyYW5nZShuKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAuLi4KKyAgICBTeW50YXhFcnJvcjogaW52YWxpZCBzeW50YXgKKworVmVyaWZ5IHRoYXQgcGFyZW50aGVzaXMgYXJlIHJlcXVpcmVkIHdoZW4gdXNlZCBhcyBhIGtleXdvcmQgYXJndW1lbnQgdmFsdWUKKworICAgID4+PiBkaWN0KGEgPSBpIGZvciBpIGluIHhyYW5nZSgxMCkpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiBpbnZhbGlkIHN5bnRheAorCitWZXJpZnkgdGhhdCBwYXJlbnRoZXNpcyBhcmUgcmVxdWlyZWQgd2hlbiB1c2VkIGFzIGEga2V5d29yZCBhcmd1bWVudCB2YWx1ZQorCisgICAgPj4+IGRpY3QoYSA9IChpIGZvciBpIGluIHhyYW5nZSgxMCkpKSAjZG9jdGVzdDogK0VMTElQU0lTCisgICAgeydhJzogPGdlbmVyYXRvciBvYmplY3QgPGdlbmV4cHI+IGF0IC4uLj59CisKK1ZlcmlmeSBlYXJseSBiaW5kaW5nIGZvciB0aGUgb3V0ZXJtb3N0IGZvci1leHByZXNzaW9uCisKKyAgICA+Pj4geD0xMAorICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSh4KSkKKyAgICA+Pj4geCA9IDUKKyAgICA+Pj4gbGlzdChnKQorICAgIFswLCAxLCA0LCA5LCAxNiwgMjUsIDM2LCA0OSwgNjQsIDgxXQorCitWZXJpZnkgdGhhdCB0aGUgb3V0ZXJtb3N0IGZvci1leHByZXNzaW9uIG1ha2VzIGFuIGltbWVkaWF0ZSBjaGVjaworZm9yIGl0ZXJhYmlsaXR5CisKKyAgICA+Pj4gKGkgZm9yIGkgaW4gNikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICBGaWxlICI8cHlzaGVsbCM0PiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQorICAgICAgICAoaSBmb3IgaSBpbiA2KQorICAgIFR5cGVFcnJvcjogJ2ludCcgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZQorCitWZXJpZnkgbGF0ZSBiaW5kaW5nIGZvciB0aGUgb3V0ZXJtb3N0IGlmLWV4cHJlc3Npb24KKworICAgID4+PiBpbmNsdWRlID0gKDIsNCw2LDgpCisgICAgPj4+IGcgPSAoaSppIGZvciBpIGluIHJhbmdlKDEwKSBpZiBpIGluIGluY2x1ZGUpCisgICAgPj4+IGluY2x1ZGUgPSAoMSwzLDUsNyw5KQorICAgID4+PiBsaXN0KGcpCisgICAgWzEsIDksIDI1LCA0OSwgODFdCisKK1ZlcmlmeSBsYXRlIGJpbmRpbmcgZm9yIHRoZSBpbm5lcm1vc3QgZm9yLWV4cHJlc3Npb24KKworICAgID4+PiBnID0gKChpLGopIGZvciBpIGluIHJhbmdlKDMpIGZvciBqIGluIHJhbmdlKHgpKQorICAgID4+PiB4ID0gNAorICAgID4+PiBsaXN0KGcpCisgICAgWygwLCAwKSwgKDAsIDEpLCAoMCwgMiksICgwLCAzKSwgKDEsIDApLCAoMSwgMSksICgxLCAyKSwgKDEsIDMpLCAoMiwgMCksICgyLCAxKSwgKDIsIDIpLCAoMiwgMyldCisKK1ZlcmlmeSByZS11c2Ugb2YgdHVwbGVzIChhIHNpZGUgYmVuZWZpdCBvZiB1c2luZyBnZW5leHBzIG92ZXIgbGlzdGNvbXBzKQorCisgICAgPj4+IHR1cGxlaWRzID0gbWFwKGlkLCAoKGksaSkgZm9yIGkgaW4geHJhbmdlKDEwKSkpCisgICAgPj4+IGludChtYXgodHVwbGVpZHMpIC0gbWluKHR1cGxlaWRzKSkKKyAgICAwCisKK1ZlcmlmeSB0aGF0IHN5bnRheCBlcnJvcidzIGFyZSByYWlzZWQgZm9yIGdlbmV4cHMgdXNlZCBhcyBsdmFsdWVzCisKKyAgICA+Pj4gKHkgZm9yIHkgaW4gKDEsMikpID0gMTAKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgLi4uCisgICAgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXhwcy5fX3Rlc3RfXy5kb2N0ZXN0c1s0MF0+IiwgbGluZSAxCisgICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBnZW5lcmF0b3IgZXhwcmVzc2lvbgorCisgICAgPj4+ICh5IGZvciB5IGluICgxLDIpKSArPSAxMAorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgICAuLi4KKyAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9nZW5leHBzLl9fdGVzdF9fLmRvY3Rlc3RzWzQxXT4iLCBsaW5lIDEKKyAgICBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGdlbmVyYXRvciBleHByZXNzaW9uCisKKworIyMjIyMjIyMjIyMgVGVzdHMgYm9ycm93ZWQgZnJvbSBvciBpbnNwaXJlZCBieSB0ZXN0X2dlbmVyYXRvcnMucHkgIyMjIyMjIyMjIyMjCisKK01ha2UgYSBnZW5lcmF0b3IgdGhhdCBhY3RzIGxpa2UgcmFuZ2UoKQorCisgICAgPj4+IHlyYW5nZSA9IGxhbWJkYSBuOiAgKGkgZm9yIGkgaW4geHJhbmdlKG4pKQorICAgID4+PiBsaXN0KHlyYW5nZSgxMCkpCisgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisKK0dlbmVyYXRvcnMgYWx3YXlzIHJldHVybiB0byB0aGUgbW9zdCByZWNlbnQgY2FsbGVyOgorCisgICAgPj4+IGRlZiBjcmVhdG9yKCk6CisgICAgLi4uICAgICByID0geXJhbmdlKDUpCisgICAgLi4uICAgICBwcmludCAiY3JlYXRvciIsIHIubmV4dCgpCisgICAgLi4uICAgICByZXR1cm4gcgorICAgID4+PiBkZWYgY2FsbGVyKCk6CisgICAgLi4uICAgICByID0gY3JlYXRvcigpCisgICAgLi4uICAgICBmb3IgaSBpbiByOgorICAgIC4uLiAgICAgICAgICAgICBwcmludCAiY2FsbGVyIiwgaQorICAgID4+PiBjYWxsZXIoKQorICAgIGNyZWF0b3IgMAorICAgIGNhbGxlciAxCisgICAgY2FsbGVyIDIKKyAgICBjYWxsZXIgMworICAgIGNhbGxlciA0CisKK0dlbmVyYXRvcnMgY2FuIGNhbGwgb3RoZXIgZ2VuZXJhdG9yczoKKworICAgID4+PiBkZWYgenJhbmdlKG4pOgorICAgIC4uLiAgICAgZm9yIGkgaW4geXJhbmdlKG4pOgorICAgIC4uLiAgICAgICAgIHlpZWxkIGkKKyAgICA+Pj4gbGlzdCh6cmFuZ2UoNSkpCisgICAgWzAsIDEsIDIsIDMsIDRdCisKKworVmVyaWZ5IHRoYXQgYSBnZW4gZXhwIGNhbm5vdCBiZSByZXN1bWVkIHdoaWxlIGl0IGlzIGFjdGl2ZWx5IHJ1bm5pbmc6CisKKyAgICA+Pj4gZyA9IChtZS5uZXh0KCkgZm9yIGkgaW4geHJhbmdlKDEwKSkKKyAgICA+Pj4gbWUgPSBnCisgICAgPj4+IG1lLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxweXNoZWxsIzMwPiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQorICAgICAgICBtZS5uZXh0KCkKKyAgICAgIEZpbGUgIjxweXNoZWxsIzI4PiIsIGxpbmUgMSwgaW4gPGdlbmVyYXRvciBleHByZXNzaW9uPgorICAgICAgICBnID0gKG1lLm5leHQoKSBmb3IgaSBpbiB4cmFuZ2UoMTApKQorICAgIFZhbHVlRXJyb3I6IGdlbmVyYXRvciBhbHJlYWR5IGV4ZWN1dGluZworCitWZXJpZnkgZXhjZXB0aW9uIHByb3BhZ2F0aW9uCisKKyAgICA+Pj4gZyA9ICgxMCAvLyBpIGZvciBpIGluICg1LCAwLCAyKSkKKyAgICA+Pj4gZy5uZXh0KCkKKyAgICAyCisgICAgPj4+IGcubmV4dCgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgRmlsZSAiPHB5c2hlbGwjMzc+IiwgbGluZSAxLCBpbiAtdG9wbGV2ZWwtCisgICAgICAgIGcubmV4dCgpCisgICAgICBGaWxlICI8cHlzaGVsbCMzNT4iLCBsaW5lIDEsIGluIDxnZW5lcmF0b3IgZXhwcmVzc2lvbj4KKyAgICAgICAgZyA9ICgxMCAvLyBpIGZvciBpIGluICg1LCAwLCAyKSkKKyAgICBaZXJvRGl2aXNpb25FcnJvcjogaW50ZWdlciBkaXZpc2lvbiBvciBtb2R1bG8gYnkgemVybworICAgID4+PiBnLm5leHQoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIEZpbGUgIjxweXNoZWxsIzM4PiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQorICAgICAgICBnLm5leHQoKQorICAgIFN0b3BJdGVyYXRpb24KKworTWFrZSBzdXJlIHRoYXQgTm9uZSBpcyBhIHZhbGlkIHJldHVybiB2YWx1ZQorCisgICAgPj4+IGxpc3QoTm9uZSBmb3IgaSBpbiB4cmFuZ2UoMTApKQorICAgIFtOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lLCBOb25lXQorCitDaGVjayB0aGF0IGdlbmVyYXRvciBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50CisKKyAgICA+Pj4gZyA9IChpKmkgZm9yIGkgaW4gcmFuZ2UoMykpCisgICAgPj4+IGV4cGVjdGVkID0gc2V0KFsnZ2lfZnJhbWUnLCAnZ2lfcnVubmluZycsICduZXh0J10pCisgICAgPj4+IHNldChhdHRyIGZvciBhdHRyIGluIGRpcihnKSBpZiBub3QgYXR0ci5zdGFydHN3aXRoKCdfXycpKSA+PSBleHBlY3RlZAorICAgIFRydWUKKworICAgID4+PiBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBIQVZFX0RPQ1NUUklOR1MKKyAgICA+Pj4gcHJpbnQoZy5uZXh0Ll9fZG9jX18gaWYgSEFWRV9ET0NTVFJJTkdTIGVsc2UgJ3gubmV4dCgpIC0+IHRoZSBuZXh0IHZhbHVlLCBvciByYWlzZSBTdG9wSXRlcmF0aW9uJykKKyAgICB4Lm5leHQoKSAtPiB0aGUgbmV4dCB2YWx1ZSwgb3IgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgID4+PiBpbXBvcnQgdHlwZXMKKyAgICA+Pj4gaXNpbnN0YW5jZShnLCB0eXBlcy5HZW5lcmF0b3JUeXBlKQorICAgIFRydWUKKworQ2hlY2sgdGhlIF9faXRlcl9fIHNsb3QgaXMgZGVmaW5lZCB0byByZXR1cm4gc2VsZgorCisgICAgPj4+IGl0ZXIoZykgaXMgZworICAgIFRydWUKKworVmVyaWZ5IHRoYXQgdGhlIHJ1bm5pbmcgZmxhZyBpcyBzZXQgcHJvcGVybHkKKworICAgID4+PiBnID0gKG1lLmdpX3J1bm5pbmcgZm9yIGkgaW4gKDAsMSkpCisgICAgPj4+IG1lID0gZworICAgID4+PiBtZS5naV9ydW5uaW5nCisgICAgMAorICAgID4+PiBtZS5uZXh0KCkKKyAgICAxCisgICAgPj4+IG1lLmdpX3J1bm5pbmcKKyAgICAwCisKK1ZlcmlmeSB0aGF0IGdlbmV4cHMgYXJlIHdlYWtseSByZWZlcmVuY2FibGUKKworICAgID4+PiBpbXBvcnQgd2Vha3JlZgorICAgID4+PiBnID0gKGkqaSBmb3IgaSBpbiByYW5nZSg0KSkKKyAgICA+Pj4gd3IgPSB3ZWFrcmVmLnJlZihnKQorICAgID4+PiB3cigpIGlzIGcKKyAgICBUcnVlCisgICAgPj4+IHAgPSB3ZWFrcmVmLnByb3h5KGcpCisgICAgPj4+IGxpc3QocCkKKyAgICBbMCwgMSwgNCwgOV0KKworCisiIiIKKworCitfX3Rlc3RfXyA9IHsnZG9jdGVzdHMnIDogZG9jdGVzdHN9CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBpbXBvcnQgc3lzCisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfZ2VuZXhwcworICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2dlbmV4cHMsIHZlcmJvc2UpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X2dlbmV4cHMsIHZlcmJvc2UpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5YTc2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2VuZXhwcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM5YTc2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dlbmV4cHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzVhYTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzLnB5CkBAIC0wLDAgKzEsMzEgQEAKKyIiIgorVGVzdCB0aGUgaW50ZXJuYWwgZ2V0YXJncy5jIGltcGxlbWVudGF0aW9uCisKKyBQeUFyZ19QYXJzZVR1cGxlKCkgaXMgZGVmaW5lZCBoZXJlLgorCitUaGUgdGVzdCBoZXJlIGlzIG5vdCBpbnRlbmRlZCB0byB0ZXN0IGFsbCBvZiB0aGUgbW9kdWxlLCBqdXN0IHRoZQorc2luZ2xlIGNhc2UgdGhhdCBmYWlsZWQgYmV0d2VlbiAyLjEgYW5kIDIuMmEyLgorIiIiCisKKyMgbWFyc2hhbC5sb2FkcygpIHVzZXMgUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyM6bG9hZHMiKQorIyBUaGUgcyBjb2RlIHdpbGwgY2F1c2UgYSBVbmljb2RlIGNvbnZlcnNpb24gdG8gb2NjdXIuICBUaGlzIHRlc3QKKyMgdmVyaWZ5IHRoYXQgdGhlIGVycm9yIGlzIHByb3BhZ2F0ZWQgcHJvcGVybHkgZnJvbSB0aGUgQyBjb2RlIGJhY2sgdG8KKyMgUHl0aG9uLgorCitpbXBvcnQgbWFyc2hhbAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBHZXRBcmdzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBJZiB0aGUgZW5jb2Rpbmcgc3VjY2VlZHMgdXNpbmcgdGhlIGN1cnJlbnQgZGVmYXVsdCBlbmNvZGluZywKKyAgICAjIHRoaXMgdGVzdCB3aWxsIGZhaWwgYmVjYXVzZSBpdCBkb2VzIG5vdCB0ZXN0IHRoZSByaWdodCBwYXJ0IG9mIHRoZQorICAgICMgUHlBcmdfUGFyc2VUdXBsZSgpIGltcGxlbWVudGF0aW9uLgorICAgIGRlZiB0ZXN0X3dpdGhfbWFyc2hhbChzZWxmKToKKyAgICAgICAgYXJnID0gdW5pY29kZShyJ1wyMjInLCAndW5pY29kZS1lc2NhcGUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIG1hcnNoYWwubG9hZHMsIGFyZykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoR2V0QXJnc1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJncy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1N2ExZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJncy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M1N2ExZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2Mjk2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CkBAIC0wLDAgKzEsMzM1IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19rZXl3b3JkcworaW1wb3J0IHdhcm5pbmdzCisKKyIiIgorPiBIb3cgYWJvdXQgdGhlIGZvbGxvd2luZyBjb3VudGVycHJvcG9zYWwuIFRoaXMgYWxzbyBjaGFuZ2VzIHNvbWUgb2YKKz4gdGhlIG90aGVyIGZvcm1hdCBjb2RlcyB0byBiZSBhIGxpdHRsZSBtb3JlIHJlZ3VsYXIuCis+Cis+IENvZGUgQyB0eXBlIFJhbmdlIGNoZWNrCis+Cis+IGIgdW5zaWduZWQgY2hhciAwLi5VQ0hBUl9NQVgKKz4gaCBzaWduZWQgc2hvcnQgU0hSVF9NSU4uLlNIUlRfTUFYCis+IEIgdW5zaWduZWQgY2hhciBub25lICoqCis+IEggdW5zaWduZWQgc2hvcnQgbm9uZSAqKgorPiBrICogdW5zaWduZWQgbG9uZyBub25lCis+IEkgKiB1bnNpZ25lZCBpbnQgMC4uVUlOVF9NQVgKKworCis+IGkgaW50IElOVF9NSU4uLklOVF9NQVgKKz4gbCBsb25nIExPTkdfTUlOLi5MT05HX01BWAorCis+IEsgKiB1bnNpZ25lZCBsb25nIGxvbmcgbm9uZQorPiBMIGxvbmcgbG9uZyBMTE9OR19NSU4uLkxMT05HX01BWAorCis+IE5vdGVzOgorPgorPiAqIE5ldyBmb3JtYXQgY29kZXMuCis+Cis+ICoqIENoYW5nZWQgZnJvbSBwcmV2aW91cyAicmFuZ2UtYW5kLWEtaGFsZiIgdG8gIm5vbmUiOyB0aGUKKz4gcmFuZ2UtYW5kLWEtaGFsZiBjaGVja2luZyB3YXNuJ3QgcGFydGljdWxhcmx5IHVzZWZ1bC4KKworUGx1cyBhIEMgQVBJIG9yIHR3bywgZS5nLiBQeUludF9Bc0xvbmdNYXNrKCkgLT4KK3Vuc2lnbmVkIGxvbmcgYW5kIFB5SW50X0FzTG9uZ0xvbmdNYXNrKCkgLT4gdW5zaWduZWQKK2xvbmcgbG9uZyAoaWYgdGhhdCBleGlzdHMpLgorIiIiCisKK0xBUkdFID0gMHg3RkZGRkZGRgorVkVSWV9MQVJHRSA9IDB4RkYwMDAwMTIxMjEyMTIxMjEyMTIxMjQyTAorCitmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgVUNIQVJfTUFYLCBVU0hSVF9NQVgsIFVJTlRfTUFYLCBVTE9OR19NQVgsIElOVF9NQVgsIFwKKyAgICAgSU5UX01JTiwgTE9OR19NSU4sIExPTkdfTUFYLCBQWV9TU0laRV9UX01JTiwgUFlfU1NJWkVfVF9NQVgsIFwKKyAgICAgU0hSVF9NSU4sIFNIUlRfTUFYCisKKyMgZmFrZSwgdGhleSBhcmUgbm90IGRlZmluZWQgaW4gUHl0aG9uJ3MgaGVhZGVyIGZpbGVzCitMTE9OR19NQVggPSAyKio2My0xCitMTE9OR19NSU4gPSAtMioqNjMKK1VMTE9OR19NQVggPSAyKio2NC0xCisKK2NsYXNzIExvbmc6CisgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgIHJldHVybiA5OUwKKworY2xhc3MgSW50OgorICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gOTkKKworY2xhc3MgVW5zaWduZWRfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Ioc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2IKKyAgICAgICAgIyBiIHJldHVybnMgJ3Vuc2lnbmVkIGNoYXInLCBhbmQgZG9lcyByYW5nZSBjaGVja2luZyAoMCAuLi4gVUNIQVJfTUFYKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfYiwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19iKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfYihJbnQoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19iLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX2IoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX2IoVUNIQVJfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19iLCBVQ0hBUl9NQVggKyAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfYig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfYig0MkwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2IsIFZFUllfTEFSR0UpCisKKyAgICBkZWYgdGVzdF9CKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19CCisgICAgICAgICMgQiByZXR1cm5zICd1bnNpZ25lZCBjaGFyJywgbm8gcmFuZ2UgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0IsIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfQihMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0IoSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX0IoLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKC0xTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19CKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKFVDSEFSX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19CKFVDSEFSX01BWCsxKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0IoNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0IoNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVQ0hBUl9NQVggJiBWRVJZX0xBUkdFLCBnZXRhcmdzX0IoVkVSWV9MQVJHRSkpCisKKyAgICBkZWYgdGVzdF9IKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19ICisgICAgICAgICMgSCByZXR1cm5zICd1bnNpZ25lZCBzaG9ydCcsIG5vIHJhbmdlIGNoZWNraW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19ILCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0goTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19IKEludCgpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVTSFJUX01BWCwgZ2V0YXJnc19IKC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0goMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVVNIUlRfTUFYLCBnZXRhcmdzX0goVVNIUlRfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0goVVNIUlRfTUFYKzEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfSCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfSCg0MkwpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVkVSWV9MQVJHRSAmIFVTSFJUX01BWCwgZ2V0YXJnc19IKFZFUllfTEFSR0UpKQorCisgICAgZGVmIHRlc3RfSShzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfSQorICAgICAgICAjIEkgcmV0dXJucyAndW5zaWduZWQgaW50Jywgbm8gcmFuZ2UgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0ksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfSShMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0koSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUlOVF9NQVgsIGdldGFyZ3NfSSgtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19JKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVJTlRfTUFYLCBnZXRhcmdzX0koVUlOVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSShVSU5UX01BWCsxKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0koNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0koNDJMKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFZFUllfTEFSR0UgJiBVSU5UX01BWCwgZ2V0YXJnc19JKFZFUllfTEFSR0UpKQorCisgICAgZGVmIHRlc3RfayhzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfaworICAgICAgICAjIGsgcmV0dXJucyAndW5zaWduZWQgbG9uZycsIG5vIHJhbmdlIGNoZWNraW5nCisgICAgICAgICMgaXQgZG9lcyBub3QgYWNjZXB0IGZsb2F0LCBvciBpbnN0YW5jZXMgd2l0aCBfX2ludF9fCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19rLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfaywgTG9uZygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfaywgSW50KCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVTE9OR19NQVgsIGdldGFyZ3NfaygtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19rKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVMT05HX01BWCwgZ2V0YXJnc19rKFVMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19rKFVMT05HX01BWCsxKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2soNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2soNDJMKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFZFUllfTEFSR0UgJiBVTE9OR19NQVgsIGdldGFyZ3NfayhWRVJZX0xBUkdFKSkKKworY2xhc3MgU2lnbmVkX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9oKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19oCisgICAgICAgICMgaCByZXR1cm5zICdzaG9ydCcsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nIChTSFJUX01JTiAuLi4gU0hSVF9NQVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19oLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2goTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19oKEludCgpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2gsIFNIUlRfTUlOLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU0hSVF9NSU4sIGdldGFyZ3NfaChTSFJUX01JTikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU0hSVF9NQVgsIGdldGFyZ3NfaChTSFJUX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfaCwgU0hSVF9NQVgrMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2goNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2goNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19oLCBWRVJZX0xBUkdFKQorCisgICAgZGVmIHRlc3RfaShzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfaQorICAgICAgICAjIGkgcmV0dXJucyAnaW50JywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcgKElOVF9NSU4gLi4uIElOVF9NQVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19pLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2koTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19pKEludCgpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2ksIElOVF9NSU4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChJTlRfTUlOLCBnZXRhcmdzX2koSU5UX01JTikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSU5UX01BWCwgZ2V0YXJnc19pKElOVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2ksIElOVF9NQVgrMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2koNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2koNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19pLCBWRVJZX0xBUkdFKQorCisgICAgZGVmIHRlc3RfbChzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfbAorICAgICAgICAjIGwgcmV0dXJucyAnbG9uZycsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nIChMT05HX01JTiAuLi4gTE9OR19NQVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19sLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2woTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19sKEludCgpKSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2wsIExPTkdfTUlOLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTE9OR19NSU4sIGdldGFyZ3NfbChMT05HX01JTikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTE9OR19NQVgsIGdldGFyZ3NfbChMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbCwgTE9OR19NQVgrMSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2woNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2woNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19sLCBWRVJZX0xBUkdFKQorCisgICAgZGVmIHRlc3RfbihzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfbgorICAgICAgICAjIG4gcmV0dXJucyAnUHlfc3NpemVfdCcsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nCisgICAgICAgICMgKFBZX1NTSVpFX1RfTUlOIC4uLiBQWV9TU0laRV9UX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX24sIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfbihMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX24oSW50KCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbiwgUFlfU1NJWkVfVF9NSU4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQWV9TU0laRV9UX01JTiwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQWV9TU0laRV9UX01BWCwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19uLCBQWV9TU0laRV9UX01BWCsxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfbig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfbig0MkwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFZFUllfTEFSR0UpCisKKworY2xhc3MgTG9uZ0xvbmdfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X0woc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0wKKyAgICAgICAgIyBMIHJldHVybnMgJ2xvbmcgbG9uZycsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nIChMTE9OR19NSU4KKyAgICAgICAgIyAuLi4gTExPTkdfTUFYKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygKKyAgICAgICAgICAgICAgICAiaWdub3JlIiwKKyAgICAgICAgICAgICAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcsCisgICAgICAgICAgICAgICAgbWVzc2FnZT0iLippbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkLCBnb3QgZmxvYXQiLAorICAgICAgICAgICAgICAgIG1vZHVsZT1fX25hbWVfXykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZ2V0YXJnc19MKDMuMTQpKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygKKyAgICAgICAgICAgICAgICAiZXJyb3IiLAorICAgICAgICAgICAgICAgIGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICBtZXNzYWdlPSIuKmludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIsCisgICAgICAgICAgICAgICAgbW9kdWxlPSJ1bml0dGVzdCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcsIGdldGFyZ3NfTCwgMy4xNCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfTCwgIkhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19MKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfTChJbnQoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19MLCBMTE9OR19NSU4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMTE9OR19NSU4sIGdldGFyZ3NfTChMTE9OR19NSU4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExMT05HX01BWCwgZ2V0YXJnc19MKExMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfTCwgTExPTkdfTUFYKzEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19MKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19MKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfTCwgVkVSWV9MQVJHRSkKKworICAgIGRlZiB0ZXN0X0soc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0sKKyAgICAgICAgIyBLIHJldHVybiAndW5zaWduZWQgbG9uZyBsb25nJywgbm8gcmFuZ2UgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0ssIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19LLCBMb25nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19LLCBJbnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVTExPTkdfTUFYLCBnZXRhcmdzX0soVUxMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19LKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSyhVTExPTkdfTUFYKzEpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfSyg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfSyg0MkwpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVkVSWV9MQVJHRSAmIFVMTE9OR19NQVgsIGdldGFyZ3NfSyhWRVJZX0xBUkdFKSkKKworCitjbGFzcyBUdXBsZV9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX3R1cGxlCisKKyAgICAgICAgcmV0ID0gZ2V0YXJnc190dXBsZSgxLCAoMiwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0LCAoMSwyLDMpKQorCisgICAgICAgICMgbWFrZSBzdXJlIGludmFsaWQgdHVwbGUgYXJndW1lbnRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseQorICAgICAgICBjbGFzcyBzZXE6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG4pOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX3R1cGxlLCAxLCBzZXEoKSkKKworY2xhc3MgS2V5d29yZHNfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3Bvc2l0aW9uYWxfYXJncyhzZWxmKToKKyAgICAgICAgIyB1c2luZyBhbGwgcG9zaXRpb25hbCBhcmdzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZXRhcmdzX2tleXdvcmRzKCgxLDIpLCAzLCAoNCwoNSw2KSksICg3LDgsOSksIDEwKSwKKyAgICAgICAgICAgICgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkKKyAgICAgICAgICAgICkKKyAgICBkZWYgdGVzdF9taXhlZF9hcmdzKHNlbGYpOgorICAgICAgICAjIHBvc2l0aW9uYWwgYW5kIGtleXdvcmQgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZ2V0YXJnc19rZXl3b3JkcygoMSwyKSwgMywgKDQsKDUsNikpLCBhcmc0PSg3LDgsOSksIGFyZzU9MTApLAorICAgICAgICAgICAgKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwKQorICAgICAgICAgICAgKQorICAgIGRlZiB0ZXN0X2tleXdvcmRfYXJncyhzZWxmKToKKyAgICAgICAgIyBhbGwga2V5d29yZHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZHMoYXJnMT0oMSwyKSwgYXJnMj0zLCBhcmczPSg0LCg1LDYpKSwgYXJnND0oNyw4LDkpLCBhcmc1PTEwKSwKKyAgICAgICAgICAgICgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCkKKyAgICAgICAgICAgICkKKyAgICBkZWYgdGVzdF9vcHRpb25hbF9hcmdzKHNlbGYpOgorICAgICAgICAjIG1pc3Npbmcgb3B0aW9uYWwga2V5d29yZCBhcmdzLCBza2lwcGluZyB0dXBsZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZHMoYXJnMT0oMSwyKSwgYXJnMj0zLCBhcmc1PTEwKSwKKyAgICAgICAgICAgICgxLCAyLCAzLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMCkKKyAgICAgICAgICAgICkKKyAgICBkZWYgdGVzdF9yZXF1aXJlZF9hcmdzKHNlbGYpOgorICAgICAgICAjIHJlcXVpcmVkIGFyZyBtaXNzaW5nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdldGFyZ3Nfa2V5d29yZHMoYXJnMT0oMSwyKSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXJyKSwgIlJlcXVpcmVkIGFyZ3VtZW50ICdhcmcyJyAocG9zIDIpIG5vdCBmb3VuZCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1R5cGVFcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCcpCisgICAgZGVmIHRlc3RfdG9vX21hbnlfYXJncyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZ2V0YXJnc19rZXl3b3JkcygoMSwyKSwzLCg0LCg1LDYpKSwoNyw4LDkpLDEwLDExMSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXJyKSwgImZ1bmN0aW9uIHRha2VzIGF0IG1vc3QgNSBhcmd1bWVudHMgKDYgZ2l2ZW4pIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnVHlwZUVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkJykKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2tleXdvcmQoc2VsZik6CisgICAgICAgICMgZXh0cmFuZW91cyBrZXl3b3JkIGFyZworICAgICAgICB0cnk6CisgICAgICAgICAgICBnZXRhcmdzX2tleXdvcmRzKCgxLDIpLDMsYXJnNT0xMCxhcmc2NjY9NjY2KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlcnIpLCAiJ2FyZzY2NicgaXMgYW4gaW52YWxpZCBrZXl3b3JkIGFyZ3VtZW50IGZvciB0aGlzIGZ1bmN0aW9uIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnVHlwZUVycm9yIHNob3VsZCBoYXZlIGJlZW4gcmFpc2VkJykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gW1NpZ25lZF9UZXN0Q2FzZSwgVW5zaWduZWRfVGVzdENhc2UsIFR1cGxlX1Rlc3RDYXNlLCBLZXl3b3Jkc19UZXN0Q2FzZV0KKyAgICB0cnk6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0wsIGdldGFyZ3NfSworICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcyAjIFBZX0xPTkdfTE9ORyBub3QgYXZhaWxhYmxlCisgICAgZWxzZToKKyAgICAgICAgdGVzdHMuYXBwZW5kKExvbmdMb25nX1Rlc3RDYXNlKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzMi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzMi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5N2NiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzMi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRhcmdzMi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5N2NiOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldGFyZ3MyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyNDI4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldG9wdC5weQpAQCAtMCwwICsxLDE4NyBAQAorIyB0ZXN0X2dldG9wdC5weQorIyBEYXZpZCBHb29kZ2VyIDxkZ29vZGdlckBiaWdmb290LmNvbT4gMjAwMC0wOC0xOQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBydW5fZG9jdGVzdCwgcnVuX3VuaXR0ZXN0LCBFbnZpcm9ubWVudFZhckd1YXJkCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IGdldG9wdAorCitzZW50aW5lbCA9IG9iamVjdCgpCisKK2NsYXNzIEdldG9wdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZW52ID0gRW52aXJvbm1lbnRWYXJHdWFyZCgpCisgICAgICAgIGlmICJQT1NJWExZX0NPUlJFQ1QiIGluIHNlbGYuZW52OgorICAgICAgICAgICAgZGVsIHNlbGYuZW52WyJQT1NJWExZX0NPUlJFQ1QiXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmVudi5fX2V4aXRfXygpCisgICAgICAgIGRlbCBzZWxmLmVudgorCisgICAgZGVmIGFzc2VydEVycm9yKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGdldG9wdC5HZXRvcHRFcnJvciwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3Rfc2hvcnRfaGFzX2FyZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdldG9wdC5zaG9ydF9oYXNfYXJnKCdhJywgJ2E6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ2V0b3B0LnNob3J0X2hhc19hcmcoJ2EnLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5zaG9ydF9oYXNfYXJnLCAnYScsICdiJykKKworICAgIGRlZiB0ZXN0X2xvbmdfaGFzX2FyZ3Moc2VsZik6CisgICAgICAgIGhhc19hcmcsIG9wdGlvbiA9IGdldG9wdC5sb25nX2hhc19hcmdzKCdhYmMnLCBbJ2FiYz0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc19hcmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLCAnYWJjJykKKworICAgICAgICBoYXNfYXJnLCBvcHRpb24gPSBnZXRvcHQubG9uZ19oYXNfYXJncygnYWJjJywgWydhYmMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNfYXJnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbiwgJ2FiYycpCisKKyAgICAgICAgaGFzX2FyZywgb3B0aW9uID0gZ2V0b3B0LmxvbmdfaGFzX2FyZ3MoJ2FiYycsIFsnYWJjZCddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc19hcmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLCAnYWJjZCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQubG9uZ19oYXNfYXJncywgJ2FiYycsIFsnZGVmJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXJyb3IoZ2V0b3B0LmxvbmdfaGFzX2FyZ3MsICdhYmMnLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQubG9uZ19oYXNfYXJncywgJ2FiYycsIFsnYWJjZCcsJ2FiY2RlJ10pCisKKyAgICBkZWYgdGVzdF9kb19zaG9ydHMoc2VsZik6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fc2hvcnRzKFtdLCAnYScsICdhJywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLWEnLCAnJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFtdKQorCisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fc2hvcnRzKFtdLCAnYTEnLCAnYTonLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcxJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFtdKQorCisgICAgICAgICNvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX3Nob3J0cyhbXSwgJ2E9MScsICdhOicsIFtdKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcxJyldKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKKworICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX3Nob3J0cyhbXSwgJ2EnLCAnYTonLCBbJzEnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcxJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFtdKQorCisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fc2hvcnRzKFtdLCAnYScsICdhOicsIFsnMScsICcyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLWEnLCAnMScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbJzInXSkKKworICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5kb19zaG9ydHMsIFtdLCAnYTEnLCAnYScsIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5kb19zaG9ydHMsIFtdLCAnYScsICdhOicsIFtdKQorCisgICAgZGVmIHRlc3RfZG9fbG9uZ3Moc2VsZik6CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZG9fbG9uZ3MoW10sICdhYmMnLCBbJ2FiYyddLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctLWFiYycsICcnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19sb25ncyhbXSwgJ2FiYz0xJywgWydhYmM9J10sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tYWJjJywgJzEnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5kb19sb25ncyhbXSwgJ2FiYz0xJywgWydhYmNkPSddLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctLWFiY2QnLCAnMScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbXSkKKworICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX2xvbmdzKFtdLCAnYWJjJywgWydhYicsICdhYmMnLCAnYWJjZCddLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctLWFiYycsICcnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgIyBNdWNoIGxpa2UgdGhlIHByZWNlZGluZywgZXhjZXB0IHdpdGggYSBub24tYWxwaGEgY2hhcmFjdGVyICgiLSIpIGluCisgICAgICAgICMgb3B0aW9uIG5hbWUgdGhhdCBwcmVjZWRlcyAiPSI7IGZhaWxlZCBpbgorICAgICAgICAjIGh0dHA6Ly9weXRob24ub3JnL3NmLzEyNjg2MworICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmRvX2xvbmdzKFtdLCAnZm9vPTQyJywgWydmb28tYmFyJywgJ2Zvbz0nLF0sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIFsoJy0tZm9vJywgJzQyJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFtdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXJyb3IoZ2V0b3B0LmRvX2xvbmdzLCBbXSwgJ2FiYz0xJywgWydhYmMnXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXJyb3IoZ2V0b3B0LmRvX2xvbmdzLCBbXSwgJ2FiYycsIFsnYWJjPSddLCBbXSkKKworICAgIGRlZiB0ZXN0X2dldG9wdChzZWxmKToKKyAgICAgICAgIyBub3RlOiB0aGUgZW1wdHkgc3RyaW5nIGJldHdlZW4gJy1hJyBhbmQgJy0tYmV0YScgaXMgc2lnbmlmaWNhbnQ6CisgICAgICAgICMgaXQgc2ltdWxhdGVzIGFuIGVtcHR5IHN0cmluZyBvcHRpb24gYXJndW1lbnQgKCctYSAiIicpIG9uIHRoZQorICAgICAgICAjIGNvbW1hbmQgbGluZS4KKyAgICAgICAgY21kbGluZSA9IFsnLWEnLCAnMScsICctYicsICctLWFscGhhPTInLCAnLS1iZXRhJywgJy1hJywgJzMnLCAnLWEnLAorICAgICAgICAgICAgICAgICAgICcnLCAnLS1iZXRhJywgJ2FyZzEnLCAnYXJnMiddCisKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoY21kbGluZSwgJ2E6YicsIFsnYWxwaGE9JywgJ2JldGEnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcxJyksICgnLWInLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLS1hbHBoYScsICcyJyksICgnLS1iZXRhJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJy1hJywgJzMnKSwgKCctYScsICcnKSwgKCctLWJldGEnLCAnJyldKQorICAgICAgICAjIE5vdGUgYW1iaWd1aXR5IG9mICgnLWInLCAnJykgYW5kICgnLWEnLCAnJykgYWJvdmUuIFRoaXMgbXVzdCBiZQorICAgICAgICAjIGFjY291bnRlZCBmb3IgaW4gdGhlIGNvZGUgdGhhdCBjYWxscyBnZXRvcHQoKS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBbJ2FyZzEnLCAnYXJnMiddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXJyb3IoZ2V0b3B0LmdldG9wdCwgY21kbGluZSwgJ2E6YicsIFsnYWxwaGEnLCAnYmV0YSddKQorCisgICAgZGVmIHRlc3RfZ251X2dldG9wdChzZWxmKToKKyAgICAgICAgIyBUZXN0IGhhbmRsaW5nIG9mIEdOVSBzdHlsZSBzY2FubmluZyBtb2RlLgorICAgICAgICBjbWRsaW5lID0gWyctYScsICdhcmcxJywgJy1iJywgJzEnLCAnLS1hbHBoYScsICctLWJldGE9MiddCisKKyAgICAgICAgIyBHTlUgc3R5bGUKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nbnVfZ2V0b3B0KGNtZGxpbmUsICdhYjonLCBbJ2FscGhhJywgJ2JldGE9J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWydhcmcxJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLWEnLCAnJyksICgnLWInLCAnMScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJy0tYWxwaGEnLCAnJyksICgnLS1iZXRhJywgJzInKV0pCisKKyAgICAgICAgIyByZWNvZ25pemUgIi0iIGFzIGFuIGFyZ3VtZW50CisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ251X2dldG9wdChbJy1hJywgJy0nLCAnLWInLCAnLSddLCAnYWI6JywgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWyctJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLWEnLCAnJyksICgnLWInLCAnLScpXSkKKworICAgICAgICAjIFBvc2l4IHN0eWxlIHZpYSArCisgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ251X2dldG9wdChjbWRsaW5lLCAnK2FiOicsIFsnYWxwaGEnLCAnYmV0YT0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRzLCBbKCctYScsICcnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWydhcmcxJywgJy1iJywgJzEnLCAnLS1hbHBoYScsICctLWJldGE9MiddKQorCisgICAgICAgICMgUG9zaXggc3R5bGUgdmlhIFBPU0lYTFlfQ09SUkVDVAorICAgICAgICBzZWxmLmVudlsiUE9TSVhMWV9DT1JSRUNUIl0gPSAiMSIKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nbnVfZ2V0b3B0KGNtZGxpbmUsICdhYjonLCBbJ2FscGhhJywgJ2JldGE9J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0cywgWygnLWEnLCAnJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsnYXJnMScsICctYicsICcxJywgJy0tYWxwaGEnLCAnLS1iZXRhPTInXSkKKworICAgIGRlZiB0ZXN0X2xpYnJlZl9leGFtcGxlcyhzZWxmKToKKyAgICAgICAgcyA9ICIiIgorICAgICAgICBFeGFtcGxlcyBmcm9tIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZTogIERvYy9saWIvbGliZ2V0b3B0LnRleAorCisgICAgICAgIEFuIGV4YW1wbGUgdXNpbmcgb25seSBVbml4IHN0eWxlIG9wdGlvbnM6CisKKworICAgICAgICA+Pj4gaW1wb3J0IGdldG9wdAorICAgICAgICA+Pj4gYXJncyA9ICctYSAtYiAtY2ZvbyAtZCBiYXIgYTEgYTInLnNwbGl0KCkKKyAgICAgICAgPj4+IGFyZ3MKKyAgICAgICAgWyctYScsICctYicsICctY2ZvbycsICctZCcsICdiYXInLCAnYTEnLCAnYTInXQorICAgICAgICA+Pj4gb3B0bGlzdCwgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJncywgJ2FiYzpkOicpCisgICAgICAgID4+PiBvcHRsaXN0CisgICAgICAgIFsoJy1hJywgJycpLCAoJy1iJywgJycpLCAoJy1jJywgJ2ZvbycpLCAoJy1kJywgJ2JhcicpXQorICAgICAgICA+Pj4gYXJncworICAgICAgICBbJ2ExJywgJ2EyJ10KKworICAgICAgICBVc2luZyBsb25nIG9wdGlvbiBuYW1lcyBpcyBlcXVhbGx5IGVhc3k6CisKKworICAgICAgICA+Pj4gcyA9ICctLWNvbmRpdGlvbj1mb28gLS10ZXN0aW5nIC0tb3V0cHV0LWZpbGUgYWJjLmRlZiAteCBhMSBhMicKKyAgICAgICAgPj4+IGFyZ3MgPSBzLnNwbGl0KCkKKyAgICAgICAgPj4+IGFyZ3MKKyAgICAgICAgWyctLWNvbmRpdGlvbj1mb28nLCAnLS10ZXN0aW5nJywgJy0tb3V0cHV0LWZpbGUnLCAnYWJjLmRlZicsICcteCcsICdhMScsICdhMiddCisgICAgICAgID4+PiBvcHRsaXN0LCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAneCcsIFsKKyAgICAgICAgLi4uICAgICAnY29uZGl0aW9uPScsICdvdXRwdXQtZmlsZT0nLCAndGVzdGluZyddKQorICAgICAgICA+Pj4gb3B0bGlzdAorICAgICAgICBbKCctLWNvbmRpdGlvbicsICdmb28nKSwgKCctLXRlc3RpbmcnLCAnJyksICgnLS1vdXRwdXQtZmlsZScsICdhYmMuZGVmJyksICgnLXgnLCAnJyldCisgICAgICAgID4+PiBhcmdzCisgICAgICAgIFsnYTEnLCAnYTInXQorICAgICAgICAiIiIKKworICAgICAgICBpbXBvcnQgdHlwZXMKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoImxpYnJlZnRlc3QiLCBzKQorICAgICAgICBydW5fZG9jdGVzdChtLCB2ZXJib3NlKQorCisgICAgZGVmIHRlc3RfaXNzdWU0NjI5KHNlbGYpOgorICAgICAgICBsb25nb3B0cywgc2hvcnRvcHRzID0gZ2V0b3B0LmdldG9wdChbJy0taGVscD0nXSwgJycsIFsnaGVscD0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nb3B0cywgWygnLS1oZWxwJywgJycpXSkKKyAgICAgICAgbG9uZ29wdHMsIHNob3J0b3B0cyA9IGdldG9wdC5nZXRvcHQoWyctLWhlbHA9eCddLCAnJywgWydoZWxwPSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmdvcHRzLCBbKCctLWhlbHAnLCAneCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZ2V0b3B0LkdldG9wdEVycm9yLCBnZXRvcHQuZ2V0b3B0LCBbJy0taGVscD0nXSwgJycsIFsnaGVscCddKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEdldG9wdFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0b3B0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjA3YWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0b3B0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXRvcHQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0b3B0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjA3YWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0b3B0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXR0ZXh0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0dGV4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDM2OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2V0dGV4dC5weQpAQCAtMCwwICsxLDQ2NyBAQAoraW1wb3J0IG9zCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgc2h1dGlsCitpbXBvcnQgZ2V0dGV4dAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworIyBUT0RPOgorIyAgLSBBZGQgbmV3IHRlc3RzLCBmb3IgZXhhbXBsZSBmb3IgImRnZXR0ZXh0IgorIyAgLSBSZW1vdmUgZHVtbXkgdGVzdHMsIGZvciBleGFtcGxlIHRlc3RpbmcgZm9yIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcworIyAgICBoYXMgbm8gc2Vuc2UsIGl0IHdvdWxkIGhhdmUgaWYgd2Ugd2VyZSB0ZXN0aW5nIGEgcGFyc2VyIChpLmUuIHB5Z2V0dGV4dCkKKyMgIC0gVGVzdHMgc2hvdWxkIGhhdmUgb25seSBvbmUgYXNzZXJ0LgorCitHTlVfTU9fREFUQSA9ICcnJ1wKKzNoSUVsUUFBQUFBR0FBQUFIQUFBQUV3QUFBQUxBQUFBZkFBQUFBQUFBQUNvQUFBQUZRQUFBS2tBQUFBakFBQUF2d0FBQUtFQUFBRGoKK0FBQUFCd0FBQUlVQkFBQUxBQUFBalFFQUFFVUJBQUNaQVFBQUZnQUFBTjhDQUFBZUFBQUE5Z0lBQUtFQUFBQVZBd0FBQlFBQUFMY0QKK0FBQUpBQUFBdlFNQUFBRUFBQUFEQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUVBQUFBQlFBQUFBWUFBQUFDQUFBQUFGSmgKK2VXMXZibVFnVEhWNGRYSjVJRmxoWTJndGRBQlVhR1Z5WlNCcGN5QWxjeUJtYVd4bEFGUm9aWEpsSUdGeVpTQWxjeUJtYVd4bGN3QlUKK2FHbHpJRzF2WkhWc1pTQndjbTkyYVdSbGN5QnBiblJsY201aGRHbHZibUZzYVhwaGRHbHZiaUJoYm1RZ2JHOWpZV3hwZW1GMGFXOXUKK0NuTjFjSEJ2Y25RZ1ptOXlJSGx2ZFhJZ1VIbDBhRzl1SUhCeWIyZHlZVzF6SUdKNUlIQnliM1pwWkdsdVp5QmhiaUJwYm5SbGNtWmgKK1kyVWdkRzhnZEdobElFZE9WUXBuWlhSMFpYaDBJRzFsYzNOaFoyVWdZMkYwWVd4dlp5QnNhV0p5WVhKNUxnQnRkV3hzZFhOckFHNTEKK1pHZGxJRzUxWkdkbEFGQnliMnBsWTNRdFNXUXRWbVZ5YzJsdmJqb2dNaTR3Q2xCUExWSmxkbWx6YVc5dUxVUmhkR1U2SURJd01EQXQKK01EZ3RNamtnTVRJNk1Ua3RNRFE2TURBS1RHRnpkQzFVY21GdWMyeGhkRzl5T2lCS0xpQkVZWFpwWkNCSllzT2h3N0ZsZWlBOGFpMWsKK1lYWnBaRUJ1YjI5ekxtWnlQZ3BNWVc1bmRXRm5aUzFVWldGdE9pQllXQ0E4Y0hsMGFHOXVMV1JsZGtCd2VYUm9iMjR1YjNKblBncE4KK1NVMUZMVlpsY25OcGIyNDZJREV1TUFwRGIyNTBaVzUwTFZSNWNHVTZJSFJsZUhRdmNHeGhhVzQ3SUdOb1lYSnpaWFE5YVhOdkxUZzQKK05Ua3RNUXBEYjI1MFpXNTBMVlJ5WVc1elptVnlMVVZ1WTI5a2FXNW5PaUJ1YjI1bENrZGxibVZ5WVhSbFpDMUNlVG9nY0hsblpYUjAKK1pYaDBMbkI1SURFdU1RcFFiSFZ5WVd3dFJtOXliWE02SUc1d2JIVnlZV3h6UFRJN0lIQnNkWEpoYkQxdUlUMHhPd29BVkdoeWIyRjAKK2QyOWlZbXhsY2lCTllXNW5jbTkyWlFCSVlYa2dKWE1nWm1samFHVnlid0JJWVhrZ0pYTWdabWxqYUdWeWIzTUFSM1YyWmlCNlluRm8KK2VYSWdZMlZpYVhaeGNtWWdkbUZuY21WaGJtZDJZbUZ1ZVhadGJtZDJZbUVnYm1GeElIbGljRzU1ZG0xdVozWmlZUXBtYUdOalltVm4KK0lITmlaU0JzWW1obElFTnNaM1ZpWVNCalpXSjBaVzU2WmlCdmJDQmpaV0pwZG5GMllYUWdibUVnZG1GbmNtVnpibkJ5SUdkaUlHZDEKK2NpQlVRVWdLZEhKblozSnJaeUI2Y21abWJuUnlJSEJ1WjI1NVluUWdlWFp2Wlc1bGJDNEFZbUZqYjI0QWQybHVheUIzYVc1ckFBPT0KKycnJworCitVTU9fREFUQSA9ICcnJ1wKKzNoSUVsUUFBQUFBQ0FBQUFIQUFBQUN3QUFBQUZBQUFBUEFBQUFBQUFBQUJRQUFBQUJBQUFBRkVBQUFBUEFRQUFWZ0FBQUFRQUFBQm0KK0FRQUFBUUFBQUFJQUFBQUFBQUFBQUFBQUFBQUFBQUFBWVdMRG5nQlFjbTlxWldOMExVbGtMVlpsY25OcGIyNDZJREl1TUFwUVR5MVMKK1pYWnBjMmx2YmkxRVlYUmxPaUF5TURBekxUQTBMVEV4SURFeU9qUXlMVEEwTURBS1RHRnpkQzFVY21GdWMyeGhkRzl5T2lCQ1lYSnkKK2VTQkJMaUJYUVhKellYY2dQR0poY25KNVFIQjVkR2h2Ymk1dmNtYytDa3hoYm1kMVlXZGxMVlJsWVcwNklGaFlJRHh3ZVhSb2IyNHQKK1pHVjJRSEI1ZEdodmJpNXZjbWMrQ2sxSlRVVXRWbVZ5YzJsdmJqb2dNUzR3Q2tOdmJuUmxiblF0Vkhsd1pUb2dkR1Y0ZEM5d2JHRnAKK2Jqc2dZMmhoY25ObGREMTFkR1l0T0FwRGIyNTBaVzUwTFZSeVlXNXpabVZ5TFVWdVkyOWthVzVuT2lBM1ltbDBDa2RsYm1WeVlYUmwKK1pDMUNlVG9nYldGdWRXRnNiSGtLQU1La2VYb0EKKycnJworCitNTU9fREFUQSA9ICcnJ1wKKzNoSUVsUUFBQUFBQkFBQUFIQUFBQUNRQUFBQURBQUFBTEFBQUFBQUFBQUE0QUFBQWVBRUFBRGtBQUFBQkFBQUFBQUFBQUFBQUFBQUEKK1VISnZhbVZqZEMxSlpDMVdaWEp6YVc5dU9pQk9ieUJRY205cVpXTjBJREF1TUFwUVQxUXRRM0psWVhScGIyNHRSR0YwWlRvZ1YyVmsKK0lFUmxZeUF4TVNBd056bzBORG94TlNBeU1EQXlDbEJQTFZKbGRtbHphVzl1TFVSaGRHVTZJREl3TURJdE1EZ3RNVFFnTURFNk1UZzYKK05UZ3JNREE2TURBS1RHRnpkQzFVY21GdWMyeGhkRzl5T2lCS2IyaHVJRVJ2WlNBOGFtUnZaVUJsZUdGdGNHeGxMbU52YlQ0S1NtRnUKK1pTQkdiMjlpWVhJZ1BHcG1iMjlpWVhKQVpYaGhiWEJzWlM1amIyMCtDa3hoYm1kMVlXZGxMVlJsWVcwNklIaDRJRHg0ZUVCbGVHRnQKK2NHeGxMbU52YlQ0S1RVbE5SUzFXWlhKemFXOXVPaUF4TGpBS1EyOXVkR1Z1ZEMxVWVYQmxPaUIwWlhoMEwzQnNZV2x1T3lCamFHRnkKK2MyVjBQV2x6YnkwNE9EVTVMVEUxQ2tOdmJuUmxiblF0VkhKaGJuTm1aWEl0Ulc1amIyUnBibWM2SUhGMWIzUmxaQzF3Y21sdWRHRmkKK2JHVUtSMlZ1WlhKaGRHVmtMVUo1T2lCd2VXZGxkSFJsZUhRdWNIa2dNUzR6Q2dBPQorJycnCisKK0xPQ0FMRURJUiA9IG9zLnBhdGguam9pbigneHgnLCAnTENfTUVTU0FHRVMnKQorTU9GSUxFID0gb3MucGF0aC5qb2luKExPQ0FMRURJUiwgJ2dldHRleHQubW8nKQorVU1PRklMRSA9IG9zLnBhdGguam9pbihMT0NBTEVESVIsICd1Z2V0dGV4dC5tbycpCitNTU9GSUxFID0gb3MucGF0aC5qb2luKExPQ0FMRURJUiwgJ21ldGFkYXRhLm1vJykKKworCitjbGFzcyBHZXR0ZXh0QmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoTE9DQUxFRElSKToKKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKExPQ0FMRURJUikKKyAgICAgICAgd2l0aCBvcGVuKE1PRklMRSwgJ3diJykgYXMgZnA6CisgICAgICAgICAgICBmcC53cml0ZShiYXNlNjQuZGVjb2Rlc3RyaW5nKEdOVV9NT19EQVRBKSkKKyAgICAgICAgd2l0aCBvcGVuKFVNT0ZJTEUsICd3YicpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoYmFzZTY0LmRlY29kZXN0cmluZyhVTU9fREFUQSkpCisgICAgICAgIHdpdGggb3BlbihNTU9GSUxFLCAnd2InKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKGJhc2U2NC5kZWNvZGVzdHJpbmcoTU1PX0RBVEEpKQorCisgICAgICAgIHNlbGYuZW52ID0gdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKQorICAgICAgICBzZWxmLmVudlsnTEFOR1VBR0UnXSA9ICd4eCcKKyAgICAgICAgZ2V0dGV4dC5fdHJhbnNsYXRpb25zLmNsZWFyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5lbnYuX19leGl0X18oKQorICAgICAgICBkZWwgc2VsZi5lbnYKKyAgICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLnNwbGl0KExPQ0FMRURJUilbMF0pCisKKworY2xhc3MgR2V0dGV4dFRlc3RDYXNlMShHZXR0ZXh0QmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgR2V0dGV4dEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYubG9jYWxlZGlyID0gb3MuY3VyZGlyCisgICAgICAgIHNlbGYubW9maWxlID0gTU9GSUxFCisgICAgICAgIGdldHRleHQuaW5zdGFsbCgnZ2V0dGV4dCcsIHNlbGYubG9jYWxlZGlyKQorCisgICAgZGVmIHRlc3Rfc29tZV90cmFuc2xhdGlvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIHRlc3Qgc29tZSB0cmFuc2xhdGlvbnMKKyAgICAgICAgZXEoXygnYWxiYXRyb3NzJyksICdhbGJhdHJvc3MnKQorICAgICAgICBlcShfKHUnbXVsbHVzaycpLCAnYmFjb24nKQorICAgICAgICBlcShfKHInUmF5bW9uZCBMdXh1cnkgWWFjaC10JyksICdUaHJvYXR3b2JibGVyIE1hbmdyb3ZlJykKKyAgICAgICAgZXEoXyh1cidudWRnZSBudWRnZScpLCAnd2luayB3aW5rJykKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIGRvdWJsZSBxdW90ZXMKKyAgICAgICAgZXEoXygiYWxiYXRyb3NzIiksICdhbGJhdHJvc3MnKQorICAgICAgICBlcShfKHUibXVsbHVzayIpLCAnYmFjb24nKQorICAgICAgICBlcShfKHIiUmF5bW9uZCBMdXh1cnkgWWFjaC10IiksICdUaHJvYXR3b2JibGVyIE1hbmdyb3ZlJykKKyAgICAgICAgZXEoXyh1ciJudWRnZSBudWRnZSIpLCAnd2luayB3aW5rJykKKworICAgIGRlZiB0ZXN0X3RyaXBsZV9zaW5nbGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyB0cmlwbGUgc2luZ2xlIHF1b3RlcworICAgICAgICBlcShfKCcnJ2FsYmF0cm9zcycnJyksICdhbGJhdHJvc3MnKQorICAgICAgICBlcShfKHUnJydtdWxsdXNrJycnKSwgJ2JhY29uJykKKyAgICAgICAgZXEoXyhyJycnUmF5bW9uZCBMdXh1cnkgWWFjaC10JycnKSwgJ1Rocm9hdHdvYmJsZXIgTWFuZ3JvdmUnKQorICAgICAgICBlcShfKHVyJycnbnVkZ2UgbnVkZ2UnJycpLCAnd2luayB3aW5rJykKKworICAgIGRlZiB0ZXN0X3RyaXBsZV9kb3VibGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyB0cmlwbGUgZG91YmxlIHF1b3RlcworICAgICAgICBlcShfKCIiImFsYmF0cm9zcyIiIiksICdhbGJhdHJvc3MnKQorICAgICAgICBlcShfKHUiIiJtdWxsdXNrIiIiKSwgJ2JhY29uJykKKyAgICAgICAgZXEoXyhyIiIiUmF5bW9uZCBMdXh1cnkgWWFjaC10IiIiKSwgJ1Rocm9hdHdvYmJsZXIgTWFuZ3JvdmUnKQorICAgICAgICBlcShfKHVyIiIibnVkZ2UgbnVkZ2UiIiIpLCAnd2luayB3aW5rJykKKworICAgIGRlZiB0ZXN0X211bHRpbGluZV9zdHJpbmdzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBtdWx0aWxpbmUgc3RyaW5ncworICAgICAgICBlcShfKCcnJ1RoaXMgbW9kdWxlIHByb3ZpZGVzIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGl6YXRpb24KK3N1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZhY2UgdG8gdGhlIEdOVQorZ2V0dGV4dCBtZXNzYWdlIGNhdGFsb2cgbGlicmFyeS4nJycpLAorICAgICAgICAgICAnJydHdXZmIHpicWh5ciBjZWJpdnFyZiB2YWdyZWFuZ3ZiYW55dm1uZ3ZiYSBuYXEgeWJwbnl2bW5ndmJhCitmaGNjYmVnIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1ciBUQUgKK3RyZ2dya2cgenJmZm50ciBwbmdueWJ0IHl2b2VuZWwuJycnKQorCisgICAgZGVmIHRlc3RfdGhlX2FsdGVybmF0aXZlX2ludGVyZmFjZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgdGVzdCB0aGUgYWx0ZXJuYXRpdmUgaW50ZXJmYWNlCisgICAgICAgIHdpdGggb3BlbihzZWxmLm1vZmlsZSwgJ3JiJykgYXMgZnA6CisgICAgICAgICAgICB0ID0gZ2V0dGV4dC5HTlVUcmFuc2xhdGlvbnMoZnApCisgICAgICAgICMgSW5zdGFsbCB0aGUgdHJhbnNsYXRpb24gb2JqZWN0CisgICAgICAgIHQuaW5zdGFsbCgpCisgICAgICAgIGVxKF8oJ251ZGdlIG51ZGdlJyksICd3aW5rIHdpbmsnKQorICAgICAgICAjIFRyeSB1bmljb2RlIHJldHVybiB0eXBlCisgICAgICAgIHQuaW5zdGFsbCh1bmljb2RlPVRydWUpCisgICAgICAgIGVxKF8oJ211bGx1c2snKSwgJ2JhY29uJykKKyAgICAgICAgIyBUZXN0IGluc3RhbGxhdGlvbiBvZiBvdGhlciBtZXRob2RzCisgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICB0Lmluc3RhbGwodW5pY29kZT1UcnVlLCBuYW1lcz1bImdldHRleHQiLCAibGdldHRleHQiXSkKKyAgICAgICAgZXEoXywgdC51Z2V0dGV4dCkKKyAgICAgICAgZXEoX19idWlsdGluX18uZ2V0dGV4dCwgdC51Z2V0dGV4dCkKKyAgICAgICAgZXEobGdldHRleHQsIHQubGdldHRleHQpCisgICAgICAgIGRlbCBfX2J1aWx0aW5fXy5nZXR0ZXh0CisgICAgICAgIGRlbCBfX2J1aWx0aW5fXy5sZ2V0dGV4dAorCisKK2NsYXNzIEdldHRleHRUZXN0Q2FzZTIoR2V0dGV4dEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEdldHRleHRCYXNlVGVzdC5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLmxvY2FsZWRpciA9IG9zLmN1cmRpcgorICAgICAgICAjIFNldCB1cCB0aGUgYmluZGluZ3MKKyAgICAgICAgZ2V0dGV4dC5iaW5kdGV4dGRvbWFpbignZ2V0dGV4dCcsIHNlbGYubG9jYWxlZGlyKQorICAgICAgICBnZXR0ZXh0LnRleHRkb21haW4oJ2dldHRleHQnKQorICAgICAgICAjIEZvciBjb252ZW5pZW5jZQorICAgICAgICBzZWxmLl8gPSBnZXR0ZXh0LmdldHRleHQKKworICAgIGRlZiB0ZXN0X2JpbmR0ZXh0ZG9tYWluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldHRleHQuYmluZHRleHRkb21haW4oJ2dldHRleHQnKSwgc2VsZi5sb2NhbGVkaXIpCisKKyAgICBkZWYgdGVzdF90ZXh0ZG9tYWluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldHRleHQudGV4dGRvbWFpbigpLCAnZ2V0dGV4dCcpCisKKyAgICBkZWYgdGVzdF9zb21lX3RyYW5zbGF0aW9ucyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgdGVzdCBzb21lIHRyYW5zbGF0aW9ucworICAgICAgICBlcShzZWxmLl8oJ2FsYmF0cm9zcycpLCAnYWxiYXRyb3NzJykKKyAgICAgICAgZXEoc2VsZi5fKHUnbXVsbHVzaycpLCAnYmFjb24nKQorICAgICAgICBlcShzZWxmLl8ocidSYXltb25kIEx1eHVyeSBZYWNoLXQnKSwgJ1Rocm9hdHdvYmJsZXIgTWFuZ3JvdmUnKQorICAgICAgICBlcShzZWxmLl8odXInbnVkZ2UgbnVkZ2UnKSwgJ3dpbmsgd2luaycpCisKKyAgICBkZWYgdGVzdF9kb3VibGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBkb3VibGUgcXVvdGVzCisgICAgICAgIGVxKHNlbGYuXygiYWxiYXRyb3NzIiksICdhbGJhdHJvc3MnKQorICAgICAgICBlcShzZWxmLl8odSJtdWxsdXNrIiksICdiYWNvbicpCisgICAgICAgIGVxKHNlbGYuXyhyIlJheW1vbmQgTHV4dXJ5IFlhY2gtdCIpLCAnVGhyb2F0d29iYmxlciBNYW5ncm92ZScpCisgICAgICAgIGVxKHNlbGYuXyh1ciJudWRnZSBudWRnZSIpLCAnd2luayB3aW5rJykKKworICAgIGRlZiB0ZXN0X3RyaXBsZV9zaW5nbGVfcXVvdGVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyB0cmlwbGUgc2luZ2xlIHF1b3RlcworICAgICAgICBlcShzZWxmLl8oJycnYWxiYXRyb3NzJycnKSwgJ2FsYmF0cm9zcycpCisgICAgICAgIGVxKHNlbGYuXyh1JycnbXVsbHVzaycnJyksICdiYWNvbicpCisgICAgICAgIGVxKHNlbGYuXyhyJycnUmF5bW9uZCBMdXh1cnkgWWFjaC10JycnKSwgJ1Rocm9hdHdvYmJsZXIgTWFuZ3JvdmUnKQorICAgICAgICBlcShzZWxmLl8odXInJydudWRnZSBudWRnZScnJyksICd3aW5rIHdpbmsnKQorCisgICAgZGVmIHRlc3RfdHJpcGxlX2RvdWJsZV9xdW90ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIHRyaXBsZSBkb3VibGUgcXVvdGVzCisgICAgICAgIGVxKHNlbGYuXygiIiJhbGJhdHJvc3MiIiIpLCAnYWxiYXRyb3NzJykKKyAgICAgICAgZXEoc2VsZi5fKHUiIiJtdWxsdXNrIiIiKSwgJ2JhY29uJykKKyAgICAgICAgZXEoc2VsZi5fKHIiIiJSYXltb25kIEx1eHVyeSBZYWNoLXQiIiIpLCAnVGhyb2F0d29iYmxlciBNYW5ncm92ZScpCisgICAgICAgIGVxKHNlbGYuXyh1ciIiIm51ZGdlIG51ZGdlIiIiKSwgJ3dpbmsgd2luaycpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmVfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgbXVsdGlsaW5lIHN0cmluZ3MKKyAgICAgICAgZXEoc2VsZi5fKCcnJ1RoaXMgbW9kdWxlIHByb3ZpZGVzIGludGVybmF0aW9uYWxpemF0aW9uIGFuZCBsb2NhbGl6YXRpb24KK3N1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZhY2UgdG8gdGhlIEdOVQorZ2V0dGV4dCBtZXNzYWdlIGNhdGFsb2cgbGlicmFyeS4nJycpLAorICAgICAgICAgICAnJydHdXZmIHpicWh5ciBjZWJpdnFyZiB2YWdyZWFuZ3ZiYW55dm1uZ3ZiYSBuYXEgeWJwbnl2bW5ndmJhCitmaGNjYmVnIHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1ciBUQUgKK3RyZ2dya2cgenJmZm50ciBwbmdueWJ0IHl2b2VuZWwuJycnKQorCisKK2NsYXNzIFBsdXJhbEZvcm1zVGVzdENhc2UoR2V0dGV4dEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEdldHRleHRCYXNlVGVzdC5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLm1vZmlsZSA9IE1PRklMRQorCisgICAgZGVmIHRlc3RfcGx1cmFsX2Zvcm1zMShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHggPSBnZXR0ZXh0Lm5nZXR0ZXh0KCdUaGVyZSBpcyAlcyBmaWxlJywgJ1RoZXJlIGFyZSAlcyBmaWxlcycsIDEpCisgICAgICAgIGVxKHgsICdIYXkgJXMgZmljaGVybycpCisgICAgICAgIHggPSBnZXR0ZXh0Lm5nZXR0ZXh0KCdUaGVyZSBpcyAlcyBmaWxlJywgJ1RoZXJlIGFyZSAlcyBmaWxlcycsIDIpCisgICAgICAgIGVxKHgsICdIYXkgJXMgZmljaGVyb3MnKQorCisgICAgZGVmIHRlc3RfcGx1cmFsX2Zvcm1zMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHdpdGggb3BlbihzZWxmLm1vZmlsZSwgJ3JiJykgYXMgZnA6CisgICAgICAgICAgICB0ID0gZ2V0dGV4dC5HTlVUcmFuc2xhdGlvbnMoZnApCisgICAgICAgIHggPSB0Lm5nZXR0ZXh0KCdUaGVyZSBpcyAlcyBmaWxlJywgJ1RoZXJlIGFyZSAlcyBmaWxlcycsIDEpCisgICAgICAgIGVxKHgsICdIYXkgJXMgZmljaGVybycpCisgICAgICAgIHggPSB0Lm5nZXR0ZXh0KCdUaGVyZSBpcyAlcyBmaWxlJywgJ1RoZXJlIGFyZSAlcyBmaWxlcycsIDIpCisgICAgICAgIGVxKHgsICdIYXkgJXMgZmljaGVyb3MnKQorCisgICAgZGVmIHRlc3RfaHUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmID0gZ2V0dGV4dC5jMnB5KCcwJykKKyAgICAgICAgcyA9ICcnLmpvaW4oWyBzdHIoZih4KSkgZm9yIHggaW4gcmFuZ2UoMjAwKSBdKQorICAgICAgICBlcShzLCAiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiKQorCisgICAgZGVmIHRlc3RfZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmID0gZ2V0dGV4dC5jMnB5KCduICE9IDEnKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIxMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSIpCisKKyAgICBkZWYgdGVzdF9mcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJ24+MScpCisgICAgICAgIHMgPSAnJy5qb2luKFsgc3RyKGYoeCkpIGZvciB4IGluIHJhbmdlKDIwMCkgXSkKKyAgICAgICAgZXEocywgIjAwMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExIikKKworICAgIGRlZiB0ZXN0X2dkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZiA9IGdldHRleHQuYzJweSgnbj09MSA/IDAgOiBuPT0yID8gMSA6IDInKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIyMDEyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiIpCisKKyAgICBkZWYgdGVzdF9nZDIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFRlc3RzIHRoZSBjb21iaW5hdGlvbiBvZiBwYXJlbnRoZXNlcyBhbmQgIj86IgorICAgICAgICBmID0gZ2V0dGV4dC5jMnB5KCduPT0xID8gMCA6IChuPT0yID8gMSA6IDIpJykKKyAgICAgICAgcyA9ICcnLmpvaW4oWyBzdHIoZih4KSkgZm9yIHggaW4gcmFuZ2UoMjAwKSBdKQorICAgICAgICBlcShzLCAiMjAxMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIiKQorCisgICAgZGVmIHRlc3RfbHQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmID0gZ2V0dGV4dC5jMnB5KCduJTEwPT0xICYmIG4lMTAwIT0xMSA/IDAgOiBuJTEwPj0yICYmIChuJTEwMDwxMCB8fCBuJTEwMD49MjApID8gMSA6IDInKQorICAgICAgICBzID0gJycuam9pbihbIHN0cihmKHgpKSBmb3IgeCBpbiByYW5nZSgyMDApIF0pCisgICAgICAgIGVxKHMsICIyMDExMTExMTExMjIyMjIyMjIyMjIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIyMjIyMjIyMjIyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMTIwMTExMTExMTEyMDExMTExMTExMjAxMTExMTExMSIpCisKKyAgICBkZWYgdGVzdF9ydShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGYgPSBnZXR0ZXh0LmMycHkoJ24lMTA9PTEgJiYgbiUxMDAhPTExID8gMCA6IG4lMTA+PTIgJiYgbiUxMDw9NCAmJiAobiUxMDA8MTAgfHwgbiUxMDA+PTIwKSA/IDEgOiAyJykKKyAgICAgICAgcyA9ICcnLmpvaW4oWyBzdHIoZih4KSkgZm9yIHggaW4gcmFuZ2UoMjAwKSBdKQorICAgICAgICBlcShzLCAiMjAxMTEyMjIyMjIyMjIyMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMjIyMjIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIyMDExMTIyMjIyMjAxMTEyMjIyMjIwMTExMjIyMjIiKQorCisgICAgZGVmIHRlc3RfcGwoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmID0gZ2V0dGV4dC5jMnB5KCduPT0xID8gMCA6IG4lMTA+PTIgJiYgbiUxMDw9NCAmJiAobiUxMDA8MTAgfHwgbiUxMDA+PTIwKSA/IDEgOiAyJykKKyAgICAgICAgcyA9ICcnLmpvaW4oWyBzdHIoZih4KSkgZm9yIHggaW4gcmFuZ2UoMjAwKSBdKQorICAgICAgICBlcShzLCAiMjAxMTEyMjIyMjIyMjIyMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjIyMjIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIyMjExMTIyMjIyMjIxMTEyMjIyMjIyMTExMjIyMjIiKQorCisgICAgZGVmIHRlc3Rfc2woc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmID0gZ2V0dGV4dC5jMnB5KCduJTEwMD09MSA/IDAgOiBuJTEwMD09MiA/IDEgOiBuJTEwMD09MyB8fCBuJTEwMD09NCA/IDIgOiAzJykKKyAgICAgICAgcyA9ICcnLmpvaW4oWyBzdHIoZih4KSkgZm9yIHggaW4gcmFuZ2UoMjAwKSBdKQorICAgICAgICBlcShzLCAiMzAxMjIzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMwMTIyMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMiKQorCisgICAgZGVmIHRlc3Rfc2VjdXJpdHkoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgICMgVGVzdCBmb3IgYSBkYW5nZXJvdXMgZXhwcmVzc2lvbgorICAgICAgICByYWlzZXMoVmFsdWVFcnJvciwgZ2V0dGV4dC5jMnB5LCAib3MuY2htb2QoJy9ldGMvcGFzc3dkJywwNzc3KSIpCisKKworY2xhc3MgVW5pY29kZVRyYW5zbGF0aW9uc1Rlc3QoR2V0dGV4dEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEdldHRleHRCYXNlVGVzdC5zZXRVcChzZWxmKQorICAgICAgICB3aXRoIG9wZW4oVU1PRklMRSwgJ3JiJykgYXMgZnA6CisgICAgICAgICAgICBzZWxmLnQgPSBnZXR0ZXh0LkdOVVRyYW5zbGF0aW9ucyhmcCkKKyAgICAgICAgc2VsZi5fID0gc2VsZi50LnVnZXR0ZXh0CisKKyAgICBkZWYgdGVzdF91bmljb2RlX21zZ2lkKHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5fKCcnKSwgdW5pY29kZSkpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHNlbGYuXyh1JycpLCB1bmljb2RlKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfbXNnc3RyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoc2VsZi5fKHUnYWJceGRlJyksIHUnXHhhNHl6JykKKworCitjbGFzcyBXZWlyZE1ldGFkYXRhVGVzdChHZXR0ZXh0QmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgR2V0dGV4dEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHdpdGggb3BlbihNTU9GSUxFLCAncmInKSBhcyBmcDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnQgPSBnZXR0ZXh0LkdOVVRyYW5zbGF0aW9ucyhmcCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLnRlYXJEb3duKCkKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIHRlc3Rfd2VpcmRfbWV0YWRhdGEoc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLnQuaW5mbygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mb1snbGFzdC10cmFuc2xhdG9yJ10sCisgICAgICAgICAgICdKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT5cbkphbmUgRm9vYmFyIDxqZm9vYmFyQGV4YW1wbGUuY29tPicpCisKKworY2xhc3MgRHVtbXlHTlVUcmFuc2xhdGlvbnMoZ2V0dGV4dC5HTlVUcmFuc2xhdGlvbnMpOgorICAgIGRlZiBmb28oc2VsZik6CisgICAgICAgIHJldHVybiAnZm9vJworCisKK2NsYXNzIEdldHRleHRDYWNoZVRlc3RDYXNlKEdldHRleHRCYXNlVGVzdCk6CisgICAgZGVmIHRlc3RfY2FjaGUoc2VsZik6CisgICAgICAgIHNlbGYubG9jYWxlZGlyID0gb3MuY3VyZGlyCisgICAgICAgIHNlbGYubW9maWxlID0gTU9GSUxFCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2V0dGV4dC5fdHJhbnNsYXRpb25zKSwgMCkKKworICAgICAgICB0ID0gZ2V0dGV4dC50cmFuc2xhdGlvbignZ2V0dGV4dCcsIHNlbGYubG9jYWxlZGlyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdldHRleHQuX3RyYW5zbGF0aW9ucyksIDEpCisKKyAgICAgICAgdCA9IGdldHRleHQudHJhbnNsYXRpb24oJ2dldHRleHQnLCBzZWxmLmxvY2FsZWRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NfPUR1bW15R05VVHJhbnNsYXRpb25zKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdldHRleHQuX3RyYW5zbGF0aW9ucyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5fX2NsYXNzX18sIER1bW15R05VVHJhbnNsYXRpb25zKQorCisgICAgICAgICMgQ2FsbGluZyBpdCBhZ2FpbiBkb2Vzbid0IGFkZCB0byB0aGUgY2FjaGUKKworICAgICAgICB0ID0gZ2V0dGV4dC50cmFuc2xhdGlvbignZ2V0dGV4dCcsIHNlbGYubG9jYWxlZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc189RHVtbXlHTlVUcmFuc2xhdGlvbnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZ2V0dGV4dC5fdHJhbnNsYXRpb25zKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Ll9fY2xhc3NfXywgRHVtbXlHTlVUcmFuc2xhdGlvbnMpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKKworCisjIEZvciByZWZlcmVuY2UsIGhlcmUncyB0aGUgLnBvIGZpbGUgdXNlZCB0byBjcmVhdGVkIHRoZSBHTlVfTU9fREFUQSBhYm92ZS4KKyMKKyMgVGhlIG9yaWdpbmFsIHZlcnNpb24gd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZXMgd2l0aAorIyBweWdldHRleHQuIExhdGVyIGl0IHdhcyBtYW51YWxseSBtb2RpZmllZCB0byBhZGQgcGx1cmFsIGZvcm1zIHN1cHBvcnQuCisKKycnJworIyBEdW1teSB0cmFuc2xhdGlvbiBmb3IgdGhlIFB5dGhvbiB0ZXN0X2dldHRleHQucHkgbW9kdWxlLgorIyBDb3B5cmlnaHQgKEMpIDIwMDEgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQmFycnkgV2Fyc2F3IDxiYXJyeUBweXRob24ub3JnPiwgMjAwMC4KKyMKK21zZ2lkICIiCittc2dzdHIgIiIKKyJQcm9qZWN0LUlkLVZlcnNpb246IDIuMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDMtMDQtMTEgMTQ6MzItMDQwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogSi4gRGF2aWQgSWJhbmV6IDxqLWRhdmlkQG5vb3MuZnI+XG4iCisiTGFuZ3VhZ2UtVGVhbTogWFggPHB5dGhvbi1kZXZAcHl0aG9uLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xXG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdFxuIgorIkdlbmVyYXRlZC1CeTogcHlnZXR0ZXh0LnB5IDEuMVxuIgorIlBsdXJhbC1Gb3JtczogbnBsdXJhbHM9MjsgcGx1cmFsPW4hPTE7XG4iCisKKyM6IHRlc3RfZ2V0dGV4dC5weToxOSB0ZXN0X2dldHRleHQucHk6MjUgdGVzdF9nZXR0ZXh0LnB5OjMxIHRlc3RfZ2V0dGV4dC5weTozNworIzogdGVzdF9nZXR0ZXh0LnB5OjUxIHRlc3RfZ2V0dGV4dC5weTo4MCB0ZXN0X2dldHRleHQucHk6ODYgdGVzdF9nZXR0ZXh0LnB5OjkyCisjOiB0ZXN0X2dldHRleHQucHk6OTgKK21zZ2lkICJudWRnZSBudWRnZSIKK21zZ3N0ciAid2luayB3aW5rIgorCisjOiB0ZXN0X2dldHRleHQucHk6MTYgdGVzdF9nZXR0ZXh0LnB5OjIyIHRlc3RfZ2V0dGV4dC5weToyOCB0ZXN0X2dldHRleHQucHk6MzQKKyM6IHRlc3RfZ2V0dGV4dC5weTo3NyB0ZXN0X2dldHRleHQucHk6ODMgdGVzdF9nZXR0ZXh0LnB5Ojg5IHRlc3RfZ2V0dGV4dC5weTo5NQorbXNnaWQgImFsYmF0cm9zcyIKK21zZ3N0ciAiIgorCisjOiB0ZXN0X2dldHRleHQucHk6MTggdGVzdF9nZXR0ZXh0LnB5OjI0IHRlc3RfZ2V0dGV4dC5weTozMCB0ZXN0X2dldHRleHQucHk6MzYKKyM6IHRlc3RfZ2V0dGV4dC5weTo3OSB0ZXN0X2dldHRleHQucHk6ODUgdGVzdF9nZXR0ZXh0LnB5OjkxIHRlc3RfZ2V0dGV4dC5weTo5NworbXNnaWQgIlJheW1vbmQgTHV4dXJ5IFlhY2gtdCIKK21zZ3N0ciAiVGhyb2F0d29iYmxlciBNYW5ncm92ZSIKKworIzogdGVzdF9nZXR0ZXh0LnB5OjE3IHRlc3RfZ2V0dGV4dC5weToyMyB0ZXN0X2dldHRleHQucHk6MjkgdGVzdF9nZXR0ZXh0LnB5OjM1CisjOiB0ZXN0X2dldHRleHQucHk6NTYgdGVzdF9nZXR0ZXh0LnB5Ojc4IHRlc3RfZ2V0dGV4dC5weTo4NCB0ZXN0X2dldHRleHQucHk6OTAKKyM6IHRlc3RfZ2V0dGV4dC5weTo5NgorbXNnaWQgIm11bGx1c2siCittc2dzdHIgImJhY29uIgorCisjOiB0ZXN0X2dldHRleHQucHk6NDAgdGVzdF9nZXR0ZXh0LnB5OjEwMQorbXNnaWQgIiIKKyJUaGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9uXG4iCisic3VwcG9ydCBmb3IgeW91ciBQeXRob24gcHJvZ3JhbXMgYnkgcHJvdmlkaW5nIGFuIGludGVyZmFjZSB0byB0aGUgR05VXG4iCisiZ2V0dGV4dCBtZXNzYWdlIGNhdGFsb2cgbGlicmFyeS4iCittc2dzdHIgIiIKKyJHdXZmIHpicWh5ciBjZWJpdnFyZiB2YWdyZWFuZ3ZiYW55dm1uZ3ZiYSBuYXEgeWJwbnl2bW5ndmJhXG4iCisiZmhjY2JlZyBzYmUgbGJoZSBDbGd1YmEgY2VidGVuemYgb2wgY2ViaXZxdmF0IG5hIHZhZ3Jlc25wciBnYiBndXIgVEFIXG4iCisidHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4iCisKKyMgTWFudWFsbHkgYWRkZWQsIGFzIG5laXRoZXIgcHlnZXR0ZXh0IG5vciB4Z2V0dGV4dCBzdXBwb3J0IHBsdXJhbCBmb3JtcworIyBpbiBQeXRob24uCittc2dpZCAiVGhlcmUgaXMgJXMgZmlsZSIKK21zZ2lkX3BsdXJhbCAiVGhlcmUgYXJlICVzIGZpbGVzIgorbXNnc3RyWzBdICJIYXkgJXMgZmljaGVybyIKK21zZ3N0clsxXSAiSGF5ICVzIGZpY2hlcm9zIgorJycnCisKKyMgSGVyZSdzIHRoZSBzZWNvbmQgZXhhbXBsZSBwbyBmaWxlIGV4YW1wbGUsIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIFVNT19EQVRBCisjIGNvbnRhaW5pbmcgdXRmLTggZW5jb2RlZCBVbmljb2RlIHN0cmluZ3MKKworJycnCisjIER1bW15IHRyYW5zbGF0aW9uIGZvciB0aGUgUHl0aG9uIHRlc3RfZ2V0dGV4dC5weSBtb2R1bGUuCisjIENvcHlyaWdodCAoQykgMjAwMSBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBCYXJyeSBXYXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+LCAyMDAwLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogMi4wXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwMy0wNC0xMSAxMjo0Mi0wNDAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBCYXJyeSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+XG4iCisiTGFuZ3VhZ2UtVGVhbTogWFggPHB5dGhvbi1kZXZAcHl0aG9uLm9yZz5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXRcbiIKKyJHZW5lcmF0ZWQtQnk6IG1hbnVhbGx5XG4iCisKKyM6IG5vZmlsZTowCittc2dpZCAiYWJceGMzXHg5ZSIKK21zZ3N0ciAiXHhjMlx4YTR5eiIKKycnJworCisjIEhlcmUncyB0aGUgdGhpcmQgZXhhbXBsZSBwbyBmaWxlLCB1c2VkIHRvIGdlbmVyYXRlIE1NT19EQVRBCisKKycnJworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogTm8gUHJvamVjdCAwLjBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogV2VkIERlYyAxMSAwNzo0NDoxNSAyMDAyXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwMi0wOC0xNCAwMToxODo1OCswMDowMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogSm9obiBEb2UgPGpkb2VAZXhhbXBsZS5jb20+XG4iCisiSmFuZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogeHggPHh4QGV4YW1wbGUuY29tPlxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWlzby04ODU5LTE1XG4iCisiQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogcXVvdGVkLXByaW50YWJsZVxuIgorIkdlbmVyYXRlZC1CeTogcHlnZXR0ZXh0LnB5IDEuM1xuIgorJycnCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXR0ZXh0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldHRleHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGNjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXR0ZXh0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXR0ZXh0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dldHRleHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ZGNjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nZXR0ZXh0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM5MjY0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbC5weQpAQCAtMCwwICsxLDE1NSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVmVyeSBzaW1wbGUgdGVzdCBzY3JpcHQgZm9yIHRoZSBTR0kgZ2wgbGlicmFyeSBleHRlbnNpb24gbW9kdWxlCisgICAgdGFrZW4gbW9zdGx5IGZyb20gdGhlIGRvY3VtZW50YXRpb24uCisgICAgUm9nZXIgRS4gTWFzc2UKKyIiIgoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBpbXBvcnRfbW9kdWxlCitpbXBvcnQgdGltZQorZ2wgPSBpbXBvcnRfbW9kdWxlKCdnbCcpCitHTCA9IGltcG9ydF9tb2R1bGUoJ0dMJykKKworZ2xhdHRycyA9IFsnUkdCY29sb3InLCAnUkdCY3Vyc29yJywgJ1JHQm1vZGUnLCAnUkdCcmFuZ2UnLCAnUkdCd3JpdGVtYXNrJywKKydfX2RvY19fJywgJ19fbmFtZV9fJywgJ2FkZHRvcHVwJywgJ2FsdGdldG1hdHJpeCcsICdhcmMnLCAnYXJjZicsCisnYXJjZmknLCAnYXJjZnMnLCAnYXJjaScsICdhcmNzJywgJ2F0dGFjaGN1cnNvcicsICdiYWNrYnVmZmVyJywKKydiYWNrZmFjZScsICdiYm94MicsICdiYm94MmknLCAnYmJveDJzJywgJ2JnbmNsb3NlZGxpbmUnLCAnYmdubGluZScsCisnYmducG9pbnQnLCAnYmducG9seWdvbicsICdiZ25zdXJmYWNlJywgJ2JnbnRtZXNoJywgJ2JnbnRyaW0nLAorJ2JsYW5rc2NyZWVuJywgJ2JsYW5rdGltZScsICdibGVuZGZ1bmN0aW9uJywgJ2JsaW5rJywgJ2MzZicsICdjM2knLAorJ2MzcycsICdjNGYnLCAnYzRpJywgJ2M0cycsICdjYWxsb2JqJywgJ2NoYXJzdHInLCAnY2h1bmtzaXplJywgJ2NpcmMnLAorJ2NpcmNmJywgJ2NpcmNmaScsICdjaXJjZnMnLCAnY2lyY2knLCAnY2lyY3MnLCAnY2xlYXInLAorJ2NsZWFyaGl0Y29kZScsICdjbGtvZmYnLCAnY2xrb24nLCAnY2xvc2VvYmonLCAnY21vZGUnLCAnY21vdicsCisnY21vdjInLCAnY21vdjJpJywgJ2Ntb3YycycsICdjbW92aScsICdjbW92cycsICdjb2xvcicsICdjb2xvcmYnLAorJ2NvbXBhY3RpZnknLCAnY29uY2F2ZScsICdjcGFjaycsICdjcnYnLCAnY3J2bicsICdjdXJvcmlnaW4nLAorJ2N1cnNvZmYnLCAnY3Vyc29uJywgJ2N1cnN0eXBlJywgJ2N1cnZlYmFzaXMnLCAnY3VydmVpdCcsCisnY3VydmVwcmVjaXNpb24nLCAnY3ljbGVtYXAnLCAnY3pjbGVhcicsICdkZWZiYXNpcycsICdkZWZjdXJzb3InLAorJ2RlZmxpbmVzdHlsZScsICdkZWxvYmonLCAnZGVsdGFnJywgJ2RlcHRoY3VlJywgJ2RldnBvcnQnLCAnZGdsY2xvc2UnLAorJ2RnbG9wZW4nLCAnZGl0aGVyJywgJ2RvcHVwJywgJ2RvdWJsZWJ1ZmZlcicsICdkcmF3JywgJ2RyYXcyJywKKydkcmF3MmknLCAnZHJhdzJzJywgJ2RyYXdpJywgJ2RyYXdtb2RlJywgJ2RyYXdzJywgJ2VkaXRvYmonLAorJ2VuZGNsb3NlZGxpbmUnLCAnZW5kZnVsbHNjcm4nLCAnZW5kbGluZScsICdlbmRwaWNrJywgJ2VuZHBvaW50JywKKydlbmRwb2x5Z29uJywgJ2VuZHB1cG1vZGUnLCAnZW5kc2VsZWN0JywgJ2VuZHN1cmZhY2UnLCAnZW5kdG1lc2gnLAorJ2VuZHRyaW0nLCAnZmluaXNoJywgJ2ZvbnQnLCAnZm9yZWdyb3VuZCcsICdmcmVlcHVwJywgJ2Zyb250YnVmZmVyJywKKydmdWRnZScsICdmdWxsc2NybicsICdnUkdCY29sb3InLCAnZ1JHQm1hc2snLCAnZ2FtbWFyYW1wJywgJ2diZWdpbicsCisnZ2NvbmZpZycsICdnZW5vYmonLCAnZ2VudGFnJywgJ2dldGJhY2tmYWNlJywgJ2dldGJ1ZmZlcicsCisnZ2V0YnV0dG9uJywgJ2dldGNtbW9kZScsICdnZXRjb2xvcicsICdnZXRjcG9zJywgJ2dldGN1cnNvcicsCisnZ2V0ZGNtJywgJ2dldGRlcHRoJywgJ2dldGRlc2NlbmRlcicsICdnZXRkaXNwbGF5bW9kZScsICdnZXRkcmF3bW9kZScsCisnZ2V0Zm9udCcsICdnZXRnZGVzYycsICdnZXRncG9zJywgJ2dldGhlaWdodCcsICdnZXRoaXRjb2RlJywKKydnZXRsc2JhY2t1cCcsICdnZXRsc3JlcGVhdCcsICdnZXRsc3R5bGUnLCAnZ2V0bHdpZHRoJywgJ2dldG1hcCcsCisnZ2V0bWF0cml4JywgJ2dldG1jb2xvcicsICdnZXRtbW9kZScsICdnZXRtb25pdG9yJywKKydnZXRudXJic3Byb3BlcnR5JywgJ2dldG9wZW5vYmonLCAnZ2V0b3JpZ2luJywgJ2dldG90aGVybW9uaXRvcicsCisnZ2V0cGF0dGVybicsICdnZXRwbGFuZXMnLCAnZ2V0cG9ydCcsICdnZXRyZXNldGxzJywgJ2dldHNjcm1hc2snLAorJ2dldHNoYWRlJywgJ2dldHNpemUnLCAnZ2V0c20nLCAnZ2V0dHAnLCAnZ2V0dmFsdWF0b3InLCAnZ2V0dmlkZW8nLAorJ2dldHZpZXdwb3J0JywgJ2dldHdyaXRlbWFzaycsICdnZXR6YnVmZmVyJywgJ2dld3JpdGUnLCAnZ2ZsdXNoJywKKydnaW5pdCcsICdnbGNvbXBhdCcsICdncmVzZXQnLCAnZ3NlbGVjdCcsICdnc3luYycsICdndmVyc2lvbicsCisnaWNvbnNpemUnLCAnaWNvbnRpdGxlJywgJ2ltYWtlYmFja2dyb3VuZCcsICdpbml0bmFtZXMnLCAnaXNtZXgnLAorJ2lzb2JqJywgJ2lzcXVldWVkJywgJ2lzdGFnJywgJ2tlZXBhc3BlY3QnLCAnbFJHQnJhbmdlJywgJ2xhbXBvZmYnLAorJ2xhbXBvbicsICdsaW5lc21vb3RoJywgJ2xpbmV3aWR0aCcsICdsbWJpbmQnLCAnbG1jb2xvcicsICdsbWRlZicsCisnbG9hZG1hdHJpeCcsICdsb2FkbmFtZScsICdsb2dpY29wJywgJ2xvb2thdCcsICdscmVjdHJlYWQnLAorJ2xyZWN0d3JpdGUnLCAnbHNiYWNrdXAnLCAnbHNldGRlcHRoJywgJ2xzaGFkZXJhbmdlJywgJ2xzcmVwZWF0JywKKydtYWtlb2JqJywgJ21ha2V0YWcnLCAnbWFwY29sb3InLCAnbWFwdycsICdtYXB3MicsICdtYXhzaXplJywKKydtaW5zaXplJywgJ21tb2RlJywgJ21vdmUnLCAnbW92ZTInLCAnbW92ZTJpJywgJ21vdmUycycsICdtb3ZlaScsCisnbW92ZXMnLCAnbXVsdGltYXAnLCAnbXVsdG1hdHJpeCcsICduM2YnLCAnbmV3cHVwJywgJ25ld3RhZycsCisnbm9ib3JkZXInLCAnbm9pc2UnLCAnbm9wb3J0JywgJ25vcm1hbCcsICdudXJic2N1cnZlJywgJ251cmJzc3VyZmFjZScsCisnbnZhcnJheScsICdvYmpkZWxldGUnLCAnb2JqaW5zZXJ0JywgJ29ianJlcGxhY2UnLCAnb25lbWFwJywgJ29ydGhvJywKKydvcnRobzInLCAnb3ZlcmxheScsICdwYWNrcmVjdCcsICdwYWdlY29sb3InLCAncGFnZXdyaXRlbWFzaycsCisncGFzc3Rocm91Z2gnLCAncGF0Y2gnLCAncGF0Y2hiYXNpcycsICdwYXRjaGN1cnZlcycsICdwYXRjaHByZWNpc2lvbicsCisncGNsb3MnLCAncGRyJywgJ3BkcjInLCAncGRyMmknLCAncGRyMnMnLCAncGRyaScsICdwZHJzJywKKydwZXJzcGVjdGl2ZScsICdwaWNrJywgJ3BpY2tzaXplJywgJ3BpeG1vZGUnLCAncG12JywgJ3BtdjInLCAncG12MmknLAorJ3BtdjJzJywgJ3BtdmknLCAncG12cycsICdwbnQnLCAncG50MicsICdwbnQyaScsICdwbnQycycsICdwbnRpJywKKydwbnRzJywgJ3BudHNtb290aCcsICdwb2xhcnZpZXcnLCAncG9sZicsICdwb2xmMicsICdwb2xmMmknLCAncG9sZjJzJywKKydwb2xmaScsICdwb2xmcycsICdwb2x5JywgJ3BvbHkyJywgJ3BvbHkyaScsICdwb2x5MnMnLCAncG9seWknLAorJ3BvbHlzJywgJ3BvcGF0dHJpYnV0ZXMnLCAncG9wbWF0cml4JywgJ3BvcG5hbWUnLCAncG9wdmlld3BvcnQnLAorJ3ByZWZwb3NpdGlvbicsICdwcmVmc2l6ZScsICdwdXBtb2RlJywgJ3B1c2hhdHRyaWJ1dGVzJywgJ3B1c2htYXRyaXgnLAorJ3B1c2huYW1lJywgJ3B1c2h2aWV3cG9ydCcsICdwd2xjdXJ2ZScsICdxZGV2aWNlJywgJ3FlbnRlcicsICdxZ2V0ZmQnLAorJ3FyZWFkJywgJ3FyZXNldCcsICdxdGVzdCcsICdyY3J2JywgJ3JjcnZuJywgJ3JkcicsICdyZHIyJywgJ3JkcjJpJywKKydyZHIycycsICdyZHJpJywgJ3JkcnMnLCAncmVhZGRpc3BsYXknLCAncmVhZHNvdXJjZScsICdyZWN0JywKKydyZWN0Y29weScsICdyZWN0ZicsICdyZWN0ZmknLCAncmVjdGZzJywgJ3JlY3RpJywgJ3JlY3RzJywgJ3JlY3R6b29tJywKKydyZXNldGxzJywgJ3Jlc2hhcGV2aWV3cG9ydCcsICdyaW5nYmVsbCcsICdybXYnLCAncm12MicsICdybXYyaScsCisncm12MnMnLCAncm12aScsICdybXZzJywgJ3JvdCcsICdyb3RhdGUnLCAncnBhdGNoJywgJ3JwZHInLCAncnBkcjInLAorJ3JwZHIyaScsICdycGRyMnMnLCAncnBkcmknLCAncnBkcnMnLCAncnBtdicsICdycG12MicsICdycG12MmknLAorJ3JwbXYycycsICdycG12aScsICdycG12cycsICdzYm94JywgJ3Nib3hmJywgJ3Nib3hmaScsICdzYm94ZnMnLAorJ3Nib3hpJywgJ3Nib3hzJywgJ3NjYWxlJywgJ3NjcmVlbnNwYWNlJywgJ3Njcm1hc2snLCAnc2V0YmVsbCcsCisnc2V0Y3Vyc29yJywgJ3NldGRlcHRoJywgJ3NldGxpbmVzdHlsZScsICdzZXRtYXAnLCAnc2V0bW9uaXRvcicsCisnc2V0bnVyYnNwcm9wZXJ0eScsICdzZXRwYXR0ZXJuJywgJ3NldHB1cCcsICdzZXRzaGFkZScsICdzZXR2YWx1YXRvcicsCisnc2V0dmlkZW8nLCAnc2hhZGVtb2RlbCcsICdzaGFkZXJhbmdlJywgJ3NpbmdsZWJ1ZmZlcicsICdzbW9vdGhsaW5lJywKKydzcGNsb3MnLCAnc3BsZicsICdzcGxmMicsICdzcGxmMmknLCAnc3BsZjJzJywgJ3NwbGZpJywgJ3NwbGZzJywKKydzdGVwdW5pdCcsICdzdHJ3aWR0aCcsICdzdWJwaXhlbCcsICdzd2FwYnVmZmVycycsICdzd2FwaW50ZXJ2YWwnLAorJ3N3YXB0bWVzaCcsICdzd2lub3BlbicsICd0ZXh0Y29sb3InLCAndGV4dGluaXQnLCAndGV4dHBvcnQnLAorJ3RleHR3cml0ZW1hc2snLCAndGllJywgJ3Rwb2ZmJywgJ3Rwb24nLCAndHJhbnNsYXRlJywgJ3VuZGVybGF5JywKKyd1bnBhY2tyZWN0JywgJ3VucWRldmljZScsICd2MmQnLCAndjJmJywgJ3YyaScsICd2MnMnLCAndjNkJywgJ3YzZicsCisndjNpJywgJ3YzcycsICd2NGQnLCAndjRmJywgJ3Y0aScsICd2NHMnLCAndmFycmF5JywgJ3ZpZGVvY21kJywKKyd2aWV3cG9ydCcsICd2bmFycmF5JywgJ3dpbmF0dGFjaCcsICd3aW5jbG9zZScsICd3aW5jb25zdHJhaW50cycsCisnd2luZGVwdGgnLCAnd2luZG93JywgJ3dpbmdldCcsICd3aW5tb3ZlJywgJ3dpbm9wZW4nLCAnd2lucG9wJywKKyd3aW5wb3NpdGlvbicsICd3aW5wdXNoJywgJ3dpbnNldCcsICd3aW50aXRsZScsICd3bXBhY2snLCAnd3JpdGVtYXNrJywKKyd3cml0ZXBpeGVscycsICd4ZnB0JywgJ3hmcHQyJywgJ3hmcHQyaScsICd4ZnB0MnMnLCAneGZwdDQnLCAneGZwdDRpJywKKyd4ZnB0NHMnLCAneGZwdGknLCAneGZwdHMnLCAnemJ1ZmZlcicsICd6Y2xlYXInLCAnemRyYXcnLCAnemZ1bmN0aW9uJywKKyd6c291cmNlJywgJ3p3cml0ZW1hc2snXQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyBpbnN1cmUgdGhhdCB3ZSBhdCBsZWFzdCBoYXZlIGFuIFggZGlzcGxheSBiZWZvcmUgY29udGludWluZy4KKyAgICBpbXBvcnQgb3MKKyAgICB0cnk6CisgICAgICAgIGRpc3BsYXkgPSBvcy5lbnZpcm9uWydESVNQTEFZJ10KKyAgICBleGNlcHQ6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCAiTm8gJERJU1BMQVkgLS0gc2tpcHBpbmcgZ2wgdGVzdCIKKworICAgICMgdG91Y2ggYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIGdsIHdpdGhvdXQgZG9pbmcgYW55dGhpbmcKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnVG91Y2hpbmcgZ2wgbW9kdWxlIGF0dHJpYnV0ZXMuLi4nCisgICAgZm9yIGF0dHIgaW4gZ2xhdHRyczoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd0b3VjaGluZzogJywgYXR0cgorICAgICAgICBnZXRhdHRyKGdsLCBhdHRyKQorCisgICAgIyBjcmVhdGUgYSBzbWFsbCAnQ3Jpc3Njcm9zcycgd2luZG93CisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ0NyZWF0aW5nIGEgc21hbGwgIkNyaXNzQ3Jvc3MiIHdpbmRvdy4uLicKKyAgICAgICAgcHJpbnQgJ2ZvcmVncm91bmQnCisgICAgZ2wuZm9yZWdyb3VuZCgpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3ByZWZwb3NpdGlvbicKKyAgICBnbC5wcmVmcG9zaXRpb24oNTAwLCA5MDAsIDUwMCwgOTAwKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICd3aW5vcGVuICJDcmlzc0Nyb3NzIicKKyAgICB3ID0gZ2wud2lub3BlbignQ3Jpc3NDcm9zcycpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2NsZWFyJworICAgIGdsLmNsZWFyKCkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnb3J0aG8yJworICAgIGdsLm9ydGhvMigwLjAsIDQwMC4wLCAwLjAsIDQwMC4wKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdjb2xvciBXSElURScKKyAgICBnbC5jb2xvcihHTC5XSElURSkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnY29sb3IgUkVEJworICAgIGdsLmNvbG9yKEdMLlJFRCkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnYmdubGluZScKKyAgICBnbC5iZ25saW5lKCkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAndjJmJworICAgIGdsLnYyZigwLjAsIDAuMCkKKyAgICBnbC52MmYoNDAwLjAsIDQwMC4wKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdlbmRsaW5lJworICAgIGdsLmVuZGxpbmUoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdiZ25saW5lJworICAgIGdsLmJnbmxpbmUoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICd2MmknCisgICAgZ2wudjJpKDQwMCwgMCkKKyAgICBnbC52MmkoMCwgNDAwKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdlbmRsaW5lJworICAgIGdsLmVuZGxpbmUoKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdEaXNwbGF5aW5nIHdpbmRvdyBmb3IgMiBzZWNvbmRzLi4uJworICAgIHRpbWUuc2xlZXAoMikKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnd2luY2xvc2UnCisgICAgZ2wud2luY2xvc2UodykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyNmYyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyNmYyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzYwZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYi5weQpAQCAtMCwwICsxLDE4MSBAQAoraW1wb3J0IGdsb2IKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVEVTVEZOCisKKworZGVmIGZzZGVjb2RlKHMpOgorICAgIHJldHVybiB1bmljb2RlKHMsIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKKworCitjbGFzcyBHbG9iVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIG5vcm0oc2VsZiwgKnBhcnRzKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgKnBhcnRzKSkKKworICAgIGRlZiBta3RlbXAoc2VsZiwgKnBhcnRzKToKKyAgICAgICAgZmlsZW5hbWUgPSBzZWxmLm5vcm0oKnBhcnRzKQorICAgICAgICBiYXNlLCBmaWxlID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJhc2UpOgorICAgICAgICAgICAgb3MubWFrZWRpcnMoYmFzZSkKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICd3JykKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGVtcGRpciA9IFRFU1RGTiArICJfZGlyIgorICAgICAgICBzZWxmLm1rdGVtcCgnYScsICdEJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJ2FhYicsICdGJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJy5hYScsICdHJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJy5iYicsICdIJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJ2FhYScsICd6enpGJykKKyAgICAgICAgc2VsZi5ta3RlbXAoJ1paWicpCisgICAgICAgIHNlbGYubWt0ZW1wKCdhJywgJ2JjZCcsICdFRicpCisgICAgICAgIHNlbGYubWt0ZW1wKCdhJywgJ2JjZCcsICdlZmcnLCAnaGEnKQorICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc3ltbGluaycpOgorICAgICAgICAgICAgb3Muc3ltbGluayhzZWxmLm5vcm0oJ2Jyb2tlbicpLCBzZWxmLm5vcm0oJ3N5bTEnKSkKKyAgICAgICAgICAgIG9zLnN5bWxpbmsoJ2Jyb2tlbicsIHNlbGYubm9ybSgnc3ltMicpKQorICAgICAgICAgICAgb3Muc3ltbGluayhvcy5wYXRoLmpvaW4oJ2EnLCAnYmNkJyksIHNlbGYubm9ybSgnc3ltMycpKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYudGVtcGRpcikKKworICAgIGRlZiBnbG9iKHNlbGYsICpwYXJ0cyk6CisgICAgICAgIGlmIGxlbihwYXJ0cykgPT0gMToKKyAgICAgICAgICAgIHBhdHRlcm4gPSBwYXJ0c1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0dGVybiA9IG9zLnBhdGguam9pbigqcGFydHMpCisgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4oc2VsZi50ZW1wZGlyLCBwYXR0ZXJuKQorICAgICAgICByZXMgPSBnbG9iLmdsb2IocCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGdsb2IuaWdsb2IocCkpLCByZXMpCisgICAgICAgIHVyZXMgPSBbZnNkZWNvZGUoeCkgZm9yIHggaW4gcmVzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdsb2IuZ2xvYihmc2RlY29kZShwKSksIHVyZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChnbG9iLmlnbG9iKGZzZGVjb2RlKHApKSksIHVyZXMpCisgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiBhc3NlcnRTZXF1ZW5jZXNFcXVhbF9ub29yZGVyKHNlbGYsIGwxLCBsMik6CisgICAgICAgIGwxID0gbGlzdChsMSkKKyAgICAgICAgbDIgPSBsaXN0KGwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChsMSksIHNldChsMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGwxKSwgc29ydGVkKGwyKSkKKworICAgIGRlZiB0ZXN0X2dsb2JfbGl0ZXJhbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdhJyksIFtzZWxmLm5vcm0oJ2EnKV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignYScsICdEJyksIFtzZWxmLm5vcm0oJ2EnLCAnRCcpXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdhYWInKSwgW3NlbGYubm9ybSgnYWFiJyldKQorICAgICAgICBlcShzZWxmLmdsb2IoJ3p5bXVyZ3knKSwgW10pCisKKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKCcqJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7dHlwZShyKSBmb3IgciBpbiByZXN9LCB7c3RyfSkKKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKG9zLnBhdGguam9pbihvcy5jdXJkaXIsICcqJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe3R5cGUocikgZm9yIHIgaW4gcmVzfSwge3N0cn0pCisKKyAgICAgICAgIyB0ZXN0IHJldHVybiB0eXBlcyBhcmUgdW5pY29kZSwgYnV0IG9ubHkgaWYgb3MubGlzdGRpcgorICAgICAgICAjIHJldHVybnMgdW5pY29kZSBmaWxlbmFtZXMKKyAgICAgICAgdG1wID0gb3MubGlzdGRpcihmc2RlY29kZShvcy5jdXJkaXIpKQorICAgICAgICBpZiB7dHlwZSh4KSBmb3IgeCBpbiB0bXB9ID09IHt1bmljb2RlfToKKyAgICAgICAgICAgIHJlcyA9IGdsb2IuZ2xvYih1JyonKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7dHlwZShyKSBmb3IgciBpbiByZXN9LCB7dW5pY29kZX0pCisgICAgICAgICAgICByZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKGZzZGVjb2RlKG9zLmN1cmRpciksIHUnKicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7dHlwZShyKSBmb3IgciBpbiByZXN9LCB7dW5pY29kZX0pCisKKyAgICBkZWYgdGVzdF9nbG9iX29uZV9kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRTZXF1ZW5jZXNFcXVhbF9ub29yZGVyCisgICAgICAgIGVxKHNlbGYuZ2xvYignYSonKSwgbWFwKHNlbGYubm9ybSwgWydhJywgJ2FhYicsICdhYWEnXSkpCisgICAgICAgIGVxKHNlbGYuZ2xvYignKmEnKSwgbWFwKHNlbGYubm9ybSwgWydhJywgJ2FhYSddKSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCcuKicpLCBtYXAoc2VsZi5ub3JtLCBbJy5hYScsICcuYmInXSkpCisgICAgICAgIGVxKHNlbGYuZ2xvYignP2FhJyksIG1hcChzZWxmLm5vcm0sIFsnYWFhJ10pKQorICAgICAgICBlcShzZWxmLmdsb2IoJ2FhPycpLCBtYXAoc2VsZi5ub3JtLCBbJ2FhYScsICdhYWInXSkpCisgICAgICAgIGVxKHNlbGYuZ2xvYignYWFbYWJdJyksIG1hcChzZWxmLm5vcm0sIFsnYWFhJywgJ2FhYiddKSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCcqcScpLCBbXSkKKworICAgIGRlZiB0ZXN0X2dsb2JfbmVzdGVkX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKKyAgICAgICAgaWYgb3MucGF0aC5ub3JtY2FzZSgiYWJDRCIpID09ICJhYkNEIjoKKyAgICAgICAgICAgICMgY2FzZS1zZW5zaXRpdmUgZmlsZXN5c3RlbQorICAgICAgICAgICAgZXEoc2VsZi5nbG9iKCdhJywgJ2JjZCcsICdFKicpLCBbc2VsZi5ub3JtKCdhJywgJ2JjZCcsICdFRicpXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgY2FzZSBpbnNlbnNpdGl2ZSBmaWxlc3lzdGVtCisgICAgICAgICAgICBlcShzZWxmLmdsb2IoJ2EnLCAnYmNkJywgJ0UqJyksIFtzZWxmLm5vcm0oJ2EnLCAnYmNkJywgJ0VGJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5vcm0oJ2EnLCAnYmNkJywgJ2VmZycpXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdhJywgJ2JjZCcsICcqZycpLCBbc2VsZi5ub3JtKCdhJywgJ2JjZCcsICdlZmcnKV0pCisKKyAgICBkZWYgdGVzdF9nbG9iX2RpcmVjdG9yeV9uYW1lcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKKyAgICAgICAgZXEoc2VsZi5nbG9iKCcqJywgJ0QnKSwgW3NlbGYubm9ybSgnYScsICdEJyldKQorICAgICAgICBlcShzZWxmLmdsb2IoJyonLCAnKmEnKSwgW10pCisgICAgICAgIGVxKHNlbGYuZ2xvYignYScsICcqJywgJyonLCAnKmEnKSwKKyAgICAgICAgICAgW3NlbGYubm9ybSgnYScsICdiY2QnLCAnZWZnJywgJ2hhJyldKQorICAgICAgICBlcShzZWxmLmdsb2IoJz9hPycsICcqRicpLCBbc2VsZi5ub3JtKCdhYWEnLCAnenp6RicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ub3JtKCdhYWInLCAnRicpXSkKKworICAgIGRlZiB0ZXN0X2dsb2JfZGlyZWN0b3J5X3dpdGhfdHJhaWxpbmdfc2xhc2goc2VsZik6CisgICAgICAgICMgUGF0dGVybnMgZW5kaW5nIHdpdGggYSBzbGFzaCBzaG91bGRuJ3QgbWF0Y2ggbm9uLWRpcnMKKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKHNlbGYubm9ybSgnWipaJykgKyBvcy5zZXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKHNlbGYubm9ybSgnWlpaJykgKyBvcy5zZXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKKyAgICAgICAgIyBXaGVuIHRoZXJlIGlzIGEgd2lsZGNhcmQgcGF0dGVybiB3aGljaCBlbmRzIHdpdGggb3Muc2VwLCBnbG9iKCkKKyAgICAgICAgIyBkb2Vzbid0IGJsb3cgdXAuCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihzZWxmLm5vcm0oJ2FhKicpICsgb3Muc2VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAyKQorICAgICAgICAjIGVpdGhlciBvZiB0aGVzZSByZXN1bHRzIGlzIHJlYXNvbmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZXQocmVzKSwgWworICAgICAgICAgICAgICAgICAgICAgIHtzZWxmLm5vcm0oJ2FhYScpLCBzZWxmLm5vcm0oJ2FhYicpfSwKKyAgICAgICAgICAgICAgICAgICAgICB7c2VsZi5ub3JtKCdhYWEnKSArIG9zLnNlcCwgc2VsZi5ub3JtKCdhYWInKSArIG9zLnNlcH0sCisgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2dsb2JfdW5pY29kZV9kaXJlY3Rvcnlfd2l0aF90cmFpbGluZ19zbGFzaChzZWxmKToKKyAgICAgICAgIyBTYW1lIGFzIHRlc3RfZ2xvYl9kaXJlY3Rvcnlfd2l0aF90cmFpbGluZ19zbGFzaCwgYnV0IHdpdGggYW4KKyAgICAgICAgIyB1bmljb2RlIGFyZ3VtZW50LgorICAgICAgICByZXMgPSBnbG9iLmdsb2IoZnNkZWNvZGUoc2VsZi5ub3JtKCdaKlonKSArIG9zLnNlcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBbXSkKKyAgICAgICAgcmVzID0gZ2xvYi5nbG9iKGZzZGVjb2RlKHNlbGYubm9ybSgnWlpaJykgKyBvcy5zZXApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgW10pCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihmc2RlY29kZShzZWxmLm5vcm0oJ2FhKicpICsgb3Muc2VwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzKSwgMikKKyAgICAgICAgIyBlaXRoZXIgb2YgdGhlc2UgcmVzdWx0cyBpcyByZWFzb25hYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2V0KHJlcyksIFsKKyAgICAgICAgICAgICAgICAgICAgICB7ZnNkZWNvZGUoc2VsZi5ub3JtKCdhYWEnKSksIGZzZGVjb2RlKHNlbGYubm9ybSgnYWFiJykpfSwKKyAgICAgICAgICAgICAgICAgICAgICB7ZnNkZWNvZGUoc2VsZi5ub3JtKCdhYWEnKSArIG9zLnNlcCksCisgICAgICAgICAgICAgICAgICAgICAgIGZzZGVjb2RlKHNlbGYubm9ybSgnYWFiJykgKyBvcy5zZXApfSwKKyAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N5bWxpbmsnKSwgIlJlcXVpcmVzIHN5bWxpbmsgc3VwcG9ydCIpCisgICAgZGVmIHRlc3RfZ2xvYl9zeW1saW5rcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydFNlcXVlbmNlc0VxdWFsX25vb3JkZXIKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdzeW0zJyksIFtzZWxmLm5vcm0oJ3N5bTMnKV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignc3ltMycsICcqJyksIFtzZWxmLm5vcm0oJ3N5bTMnLCAnRUYnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9ybSgnc3ltMycsICdlZmcnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi5nbG9iKCdzeW0zJyArIG9zLnNlcCksCisgICAgICAgICAgICAgICAgICAgICAgW1tzZWxmLm5vcm0oJ3N5bTMnKV0sIFtzZWxmLm5vcm0oJ3N5bTMnKSArIG9zLnNlcF1dKQorICAgICAgICBlcShzZWxmLmdsb2IoJyonLCAnKkYnKSwKKyAgICAgICAgICAgW3NlbGYubm9ybSgnYWFhJywgJ3p6ekYnKSwgc2VsZi5ub3JtKCdhYWInLCAnRicpLAorICAgICAgICAgICAgc2VsZi5ub3JtKCdzeW0zJywgJ0VGJyldKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N5bWxpbmsnKSwgIlJlcXVpcmVzIHN5bWxpbmsgc3VwcG9ydCIpCisgICAgZGVmIHRlc3RfZ2xvYl9icm9rZW5fc3ltbGlua3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRTZXF1ZW5jZXNFcXVhbF9ub29yZGVyCisgICAgICAgIGVxKHNlbGYuZ2xvYignc3ltKicpLCBbc2VsZi5ub3JtKCdzeW0xJyksIHNlbGYubm9ybSgnc3ltMicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubm9ybSgnc3ltMycpXSkKKyAgICAgICAgZXEoc2VsZi5nbG9iKCdzeW0xJyksIFtzZWxmLm5vcm0oJ3N5bTEnKV0pCisgICAgICAgIGVxKHNlbGYuZ2xvYignc3ltMicpLCBbc2VsZi5ub3JtKCdzeW0yJyldKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW4zMiBzcGVjaWZpYyB0ZXN0IikKKyAgICBkZWYgdGVzdF9nbG9iX21hZ2ljX2luX2RyaXZlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgorICAgICAgICBlcShnbG9iLmdsb2IoJyo6JyksIFtdKQorICAgICAgICBlcShnbG9iLmdsb2IodScqOicpLCBbXSkKKyAgICAgICAgZXEoZ2xvYi5nbG9iKCc/OicpLCBbXSkKKyAgICAgICAgZXEoZ2xvYi5nbG9iKHUnPzonKSwgW10pCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChHbG9iVGVzdHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRlZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzRlZGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYmFsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYmFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiY2IxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHkKQEAgLTAsMCArMSw1MiBAQAorIiIiVmVyaWZ5IHRoYXQgd2FybmluZ3MgYXJlIGlzc3VlZCBmb3IgZ2xvYmFsIHN0YXRlbWVudHMgZm9sbG93aW5nIHVzZS4iIiIKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19zeW50YXhfZXJyb3IKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCisKKworY2xhc3MgR2xvYmFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3QxKHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfMSA9ICIiIlwKK2RlZiB3cm9uZzEoKToKKyAgICBhID0gMQorICAgIGIgPSAyCisgICAgZ2xvYmFsIGEKKyAgICBnbG9iYWwgYgorIiIiCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCBwcm9nX3RleHRfMSkKKworICAgIGRlZiB0ZXN0MihzZWxmKToKKyAgICAgICAgcHJvZ190ZXh0XzIgPSAiIiJcCitkZWYgd3JvbmcyKCk6CisgICAgcHJpbnQgeAorICAgIGdsb2JhbCB4CisiIiIKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsIHByb2dfdGV4dF8yKQorCisgICAgZGVmIHRlc3QzKHNlbGYpOgorICAgICAgICBwcm9nX3RleHRfMyA9ICIiIlwKK2RlZiB3cm9uZzMoKToKKyAgICBwcmludCB4CisgICAgeCA9IDIKKyAgICBnbG9iYWwgeAorIiIiCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCBwcm9nX3RleHRfMykKKworICAgIGRlZiB0ZXN0NChzZWxmKToKKyAgICAgICAgcHJvZ190ZXh0XzQgPSAiIiJcCitnbG9iYWwgeAoreCA9IDIKKyIiIgorICAgICAgICAjIHRoaXMgc2hvdWxkIHdvcmsKKyAgICAgICAgY29tcGlsZShwcm9nX3RleHRfNCwgIjx0ZXN0IHN0cmluZz4iLCAiZXhlYyIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgbW9kdWxlPSI8dGVzdCBzdHJpbmc+IikKKyAgICAgICAgcnVuX3VuaXR0ZXN0KEdsb2JhbFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYmFsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjcwZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYmFsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nbG9iYWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYmFsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjcwZDY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ2xvYmFsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNjMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weQpAQCAtMCwwICsxLDEwMjEgQEAKKyMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgMSwgZ3JhbW1hci4KKyMgVGhpcyBqdXN0IHRlc3RzIHdoZXRoZXIgdGhlIHBhcnNlciBhY2NlcHRzIHRoZW0gYWxsLgorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3N5bnRheF9lcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfcHkza193YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisjIHRlc3RpbmcgaW1wb3J0ICoKK2Zyb20gc3lzIGltcG9ydCAqCisKKworY2xhc3MgVG9rZW5UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdEJhY2tzbGFzaChzZWxmKToKKyAgICAgICAgIyBCYWNrc2xhc2ggbWVhbnMgbGluZSBjb250aW51YXRpb246CisgICAgICAgIHggPSAxIFwKKyAgICAgICAgKyAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgMiwgJ2JhY2tzbGFzaCBmb3IgbGluZSBjb250aW51YXRpb24nKQorCisgICAgICAgICMgQmFja3NsYXNoIGRvZXMgbm90IG1lYW5zIGNvbnRpbnVhdGlvbiBpbiBjb21tZW50cyA6XAorICAgICAgICB4ID0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIDAsICdiYWNrc2xhc2ggZW5kaW5nIGNvbW1lbnQnKQorCisgICAgZGVmIHRlc3RQbGFpbkludGVnZXJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmYsIDI1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwMzc3LCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjE0NzQ4MzY0NywgMDE3Nzc3Nzc3Nzc3KQorICAgICAgICAjICIweCIgaXMgbm90IGEgdmFsaWQgbGl0ZXJhbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgIjB4IikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IG1heGludAorICAgICAgICBpZiBtYXhpbnQgPT0gMjE0NzQ4MzY0NzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIxNDc0ODM2NDctMSwgLTAyMDAwMDAwMDAwMCkKKyAgICAgICAgICAgICMgWFhYIC0yMTQ3NDgzNjQ4CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMDM3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgweGZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIGZvciBzIGluICcyMTQ3NDgzNjQ4JywgJzA0MDAwMDAwMDAwMCcsICcweDEwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxpZiBtYXhpbnQgPT0gOTIyMzM3MjAzNjg1NDc3NTgwNzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSwgLTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgweGZmZmZmZmZmZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgZm9yIHMgaW4gJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCAnMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCBcCisgICAgICAgICAgICAgICAgICAgICAnMHgxMDAwMDAwMDAwMDAwMDAwMCc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB4ID0gZXZhbChzKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk92ZXJmbG93RXJyb3Igb24gaHVnZSBpbnRlZ2VyIGxpdGVyYWwgJXIiICUgcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnV2VpcmQgbWF4aW50IHZhbHVlICVyJyAlIG1heGludCkKKworICAgIGRlZiB0ZXN0TG9uZ0ludGVnZXJzKHNlbGYpOgorICAgICAgICB4ID0gMEwKKyAgICAgICAgeCA9IDBsCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmZmZMCisgICAgICAgIHggPSAweGZmZmZmZmZmZmZmZmZmZmZsCisgICAgICAgIHggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdMCisgICAgICAgIHggPSAwNzc3Nzc3Nzc3Nzc3Nzc3NzdsCisgICAgICAgIHggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBMCisgICAgICAgIHggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBsCisKKyAgICBkZWYgdGVzdEZsb2F0cyhzZWxmKToKKyAgICAgICAgeCA9IDMuMTQKKyAgICAgICAgeCA9IDMxNC4KKyAgICAgICAgeCA9IDAuMzE0CisgICAgICAgICMgWFhYIHggPSAwMDAuMzE0CisgICAgICAgIHggPSAuMzE0CisgICAgICAgIHggPSAzZTE0CisgICAgICAgIHggPSAzRTE0CisgICAgICAgIHggPSAzZS0xNAorICAgICAgICB4ID0gM2UrMTQKKyAgICAgICAgeCA9IDMuZTE0CisgICAgICAgIHggPSAuM2UxNAorICAgICAgICB4ID0gMy4xZTQKKworICAgIGRlZiB0ZXN0U3RyaW5nTGl0ZXJhbHMoc2VsZik6CisgICAgICAgIHggPSAnJzsgeSA9ICIiOyBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDAgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICdcJyc7IHkgPSAiJyI7IHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzkpCisgICAgICAgIHggPSAnIic7IHkgPSAiXCIiOyBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM0KQorICAgICAgICB4ID0gImRvZXNuJ3QgXCJzaHJpbmtcIiBkb2VzIGl0IgorICAgICAgICB5ID0gJ2RvZXNuXCd0ICJzaHJpbmsiIGRvZXMgaXQnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICJkb2VzIFwic2hyaW5rXCIgZG9lc24ndCBpdCIKKyAgICAgICAgeSA9ICdkb2VzICJzaHJpbmsiIGRvZXNuXCd0IGl0JworICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDI0IGFuZCB4ID09IHkpCisgICAgICAgIHggPSAiIiIKK1RoZSAicXVpY2siCiticm93biBmb3gKK2p1bXBzIG92ZXIKK3RoZSAnbGF6eScgZG9nLgorIiIiCisgICAgICAgIHkgPSAnXG5UaGUgInF1aWNrIlxuYnJvd24gZm94XG5qdW1wcyBvdmVyXG50aGUgXCdsYXp5XCcgZG9nLlxuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisgICAgICAgIHkgPSAnJycKK1RoZSAicXVpY2siCiticm93biBmb3gKK2p1bXBzIG92ZXIKK3RoZSAnbGF6eScgZG9nLgorJycnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgeSA9ICJcblwKK1RoZSBcInF1aWNrXCJcblwKK2Jyb3duIGZveFxuXAoranVtcHMgb3ZlclxuXAordGhlICdsYXp5JyBkb2cuXG5cCisiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgeSA9ICdcblwKK1RoZSBcInF1aWNrXCJcblwKK2Jyb3duIGZveFxuXAoranVtcHMgb3ZlclxuXAordGhlIFwnbGF6eVwnIGRvZy5cblwKKycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQorCisKK2NsYXNzIEdyYW1tYXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIHNpbmdsZV9pbnB1dDogTkVXTElORSB8IHNpbXBsZV9zdG10IHwgY29tcG91bmRfc3RtdCBORVdMSU5FCisgICAgIyBYWFggY2FuJ3QgdGVzdCBpbiBhIHNjcmlwdCAtLSB0aGlzIHJ1bGUgaXMgb25seSB1c2VkIHdoZW4gaW50ZXJhY3RpdmUKKworICAgICMgZmlsZV9pbnB1dDogKE5FV0xJTkUgfCBzdG10KSogRU5ETUFSS0VSCisgICAgIyBCZWluZyB0ZXN0ZWQgYXMgdGhpcyB2ZXJ5IG1vbWVudCB0aGlzIHZlcnkgbW9kdWxlCisKKyAgICAjIGV4cHJfaW5wdXQ6IHRlc3RsaXN0IE5FV0xJTkUKKyAgICAjIFhYWCBIYXJkIHRvIHRlc3QgLS0gdXNlZCBvbmx5IGluIGNhbGxzIHRvIGlucHV0KCkKKworICAgIGRlZiB0ZXN0RXZhbElucHV0KHNlbGYpOgorICAgICAgICAjIHRlc3RsaXN0IEVORE1BUktFUgorICAgICAgICB4ID0gZXZhbCgnMSwgMCBvciAxJykKKworICAgIGRlZiB0ZXN0RnVuY2RlZihzZWxmKToKKyAgICAgICAgIyMjICdkZWYnIE5BTUUgcGFyYW1ldGVycyAnOicgc3VpdGUKKyAgICAgICAgIyMjIHBhcmFtZXRlcnM6ICcoJyBbdmFyYXJnc2xpc3RdICcpJworICAgICAgICAjIyMgdmFyYXJnc2xpc3Q6IChmcGRlZiBbJz0nIHRlc3RdICcsJykqICgnKicgTkFNRSBbJywnICgnKionfCcqJyAnKicpIE5BTUVdCisgICAgICAgICMjIyAgICAgICAgICAgIHwgKCcqKid8JyonICcqJykgTkFNRSkKKyAgICAgICAgIyMjICAgICAgICAgICAgfCBmcGRlZiBbJz0nIHRlc3RdICgnLCcgZnBkZWYgWyc9JyB0ZXN0XSkqIFsnLCddCisgICAgICAgICMjIyBmcGRlZjogTkFNRSB8ICcoJyBmcGxpc3QgJyknCisgICAgICAgICMjIyBmcGxpc3Q6IGZwZGVmICgnLCcgZnBkZWYpKiBbJywnXQorICAgICAgICAjIyMgYXJnbGlzdDogKGFyZ3VtZW50ICcsJykqIChhcmd1bWVudCB8IConIHRlc3QgWycsJyAnKionIHRlc3RdIHwgJyoqJyB0ZXN0KQorICAgICAgICAjIyMgYXJndW1lbnQ6IFt0ZXN0ICc9J10gdGVzdCAgICMgUmVhbGx5IFtrZXl3b3JkICc9J10gdGVzdAorICAgICAgICBkZWYgZjEoKTogcGFzcworICAgICAgICBmMSgpCisgICAgICAgIGYxKCooKSkKKyAgICAgICAgZjEoKigpLCAqKnt9KQorICAgICAgICBkZWYgZjIob25lX2FyZ3VtZW50KTogcGFzcworICAgICAgICBkZWYgZjModHdvLCBhcmd1bWVudHMpOiBwYXNzCisgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgZXhlYygnZGVmIGY0KHR3bywgKGNvbXBvdW5kLCAoYXJndW1lbnQsIGxpc3QpKSk6IHBhc3MnKQorICAgICAgICBleGVjKCdkZWYgZjUoKGNvbXBvdW5kLCBmaXJzdCksIHR3byk6IHBhc3MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYyLmZ1bmNfY29kZS5jb192YXJuYW1lcywgKCdvbmVfYXJndW1lbnQnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ3R3bycsICdhcmd1bWVudHMnKSkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjQuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICgndHdvJywgJyhjb21wb3VuZCwgKGFyZ3VtZW50LCBsaXN0KSknLCAnY29tcG91bmQnLCAnYXJndW1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGlzdCcsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZjUuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLAorICAgICAgICAgICAgICAgICAgICgnKGNvbXBvdW5kLCBmaXJzdCknLCAndHdvJywgJ2NvbXBvdW5kJywgJ2ZpcnN0JykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGY0LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICgndHdvJywgJy4xJywgJ2NvbXBvdW5kJywgJ2FyZ3VtZW50JywgICdsaXN0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGY1LmZ1bmNfY29kZS5jb192YXJuYW1lcywKKyAgICAgICAgICAgICAgICAgICgnLjAnLCAndHdvJywgJ2NvbXBvdW5kJywgJ2ZpcnN0JykpCisgICAgICAgIGRlZiBhMShvbmVfYXJnLCk6IHBhc3MKKyAgICAgICAgZGVmIGEyKHR3bywgYXJncywpOiBwYXNzCisgICAgICAgIGRlZiB2MCgqcmVzdCk6IHBhc3MKKyAgICAgICAgZGVmIHYxKGEsICpyZXN0KTogcGFzcworICAgICAgICBkZWYgdjIoYSwgYiwgKnJlc3QpOiBwYXNzCisgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKyAgICAgICAgZXhlYygnZGVmIHYzKGEsIChiLCBjKSwgKnJlc3QpOiByZXR1cm4gYSwgYiwgYywgcmVzdCcpCisKKyAgICAgICAgZjEoKQorICAgICAgICBmMigxKQorICAgICAgICBmMigxLCkKKyAgICAgICAgZjMoMSwgMikKKyAgICAgICAgZjMoMSwgMiwpCisgICAgICAgIGY0KDEsICgyLCAoMywgNCkpKQorICAgICAgICB2MCgpCisgICAgICAgIHYwKDEpCisgICAgICAgIHYwKDEsKQorICAgICAgICB2MCgxLDIpCisgICAgICAgIHYwKDEsMiwzLDQsNSw2LDcsOCw5LDApCisgICAgICAgIHYxKDEpCisgICAgICAgIHYxKDEsKQorICAgICAgICB2MSgxLDIpCisgICAgICAgIHYxKDEsMiwzKQorICAgICAgICB2MSgxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MigxLDIpCisgICAgICAgIHYyKDEsMiwzKQorICAgICAgICB2MigxLDIsMyw0KQorICAgICAgICB2MigxLDIsMyw0LDUsNiw3LDgsOSwwKQorICAgICAgICB2MygxLCgyLDMpKQorICAgICAgICB2MygxLCgyLDMpLDQpCisgICAgICAgIHYzKDEsKDIsMyksNCw1LDYsNyw4LDksMCkKKworICAgICAgICAjIGNldmFsIHVucGFja3MgdGhlIGZvcm1hbCBhcmd1bWVudHMgaW50byB0aGUgZmlyc3QgYXJnY291bnQgbmFtZXM7CisgICAgICAgICMgdGh1cywgdGhlIG5hbWVzIG5lc3RlZCBpbnNpZGUgdHVwbGVzIG11c3QgYXBwZWFyIGFmdGVyIHRoZXNlIG5hbWVzLgorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2My5mdW5jX2NvZGUuY29fdmFybmFtZXMsICgnYScsICcoYiwgYyknLCAncmVzdCcsICdiJywgJ2MnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjMuZnVuY19jb2RlLmNvX3Zhcm5hbWVzLCAoJ2EnLCAnLjEnLCAncmVzdCcsICdiJywgJ2MnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2MygxLCAoMiwgMyksIDQpLCAoMSwgMiwgMywgKDQsKSkpCisgICAgICAgIGRlZiBkMDEoYT0xKTogcGFzcworICAgICAgICBkMDEoKQorICAgICAgICBkMDEoMSkKKyAgICAgICAgZDAxKCooMSwpKQorICAgICAgICBkMDEoKip7J2EnOjJ9KQorICAgICAgICBkZWYgZDExKGEsIGI9MSk6IHBhc3MKKyAgICAgICAgZDExKDEpCisgICAgICAgIGQxMSgxLCAyKQorICAgICAgICBkMTEoMSwgKip7J2InOjJ9KQorICAgICAgICBkZWYgZDIxKGEsIGIsIGM9MSk6IHBhc3MKKyAgICAgICAgZDIxKDEsIDIpCisgICAgICAgIGQyMSgxLCAyLCAzKQorICAgICAgICBkMjEoKigxLCAyLCAzKSkKKyAgICAgICAgZDIxKDEsICooMiwgMykpCisgICAgICAgIGQyMSgxLCAyLCAqKDMsKSkKKyAgICAgICAgZDIxKDEsIDIsICoqeydjJzozfSkKKyAgICAgICAgZGVmIGQwMihhPTEsIGI9Mik6IHBhc3MKKyAgICAgICAgZDAyKCkKKyAgICAgICAgZDAyKDEpCisgICAgICAgIGQwMigxLCAyKQorICAgICAgICBkMDIoKigxLCAyKSkKKyAgICAgICAgZDAyKDEsICooMiwpKQorICAgICAgICBkMDIoMSwgKip7J2InOjJ9KQorICAgICAgICBkMDIoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEyKGEsIGI9MSwgYz0yKTogcGFzcworICAgICAgICBkMTIoMSkKKyAgICAgICAgZDEyKDEsIDIpCisgICAgICAgIGQxMigxLCAyLCAzKQorICAgICAgICBkZWYgZDIyKGEsIGIsIGM9MSwgZD0yKTogcGFzcworICAgICAgICBkMjIoMSwgMikKKyAgICAgICAgZDIyKDEsIDIsIDMpCisgICAgICAgIGQyMigxLCAyLCAzLCA0KQorICAgICAgICBkZWYgZDAxdihhPTEsICpyZXN0KTogcGFzcworICAgICAgICBkMDF2KCkKKyAgICAgICAgZDAxdigxKQorICAgICAgICBkMDF2KDEsIDIpCisgICAgICAgIGQwMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDAxdigqKDEsKSkKKyAgICAgICAgZDAxdigqKnsnYSc6Mn0pCisgICAgICAgIGRlZiBkMTF2KGEsIGI9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMXYoMSkKKyAgICAgICAgZDExdigxLCAyKQorICAgICAgICBkMTF2KDEsIDIsIDMpCisgICAgICAgIGRlZiBkMjF2KGEsIGIsIGM9MSwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQyMXYoMSwgMikKKyAgICAgICAgZDIxdigxLCAyLCAzKQorICAgICAgICBkMjF2KDEsIDIsIDMsIDQpCisgICAgICAgIGQyMXYoKigxLCAyLCAzLCA0KSkKKyAgICAgICAgZDIxdigxLCAyLCAqKnsnYyc6IDN9KQorICAgICAgICBkZWYgZDAydihhPTEsIGI9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQwMnYoKQorICAgICAgICBkMDJ2KDEpCisgICAgICAgIGQwMnYoMSwgMikKKyAgICAgICAgZDAydigxLCAyLCAzKQorICAgICAgICBkMDJ2KDEsICooMiwgMywgNCkpCisgICAgICAgIGQwMnYoKip7J2EnOiAxLCAnYic6IDJ9KQorICAgICAgICBkZWYgZDEydihhLCBiPTEsIGM9MiwgKnJlc3QpOiBwYXNzCisgICAgICAgIGQxMnYoMSkKKyAgICAgICAgZDEydigxLCAyKQorICAgICAgICBkMTJ2KDEsIDIsIDMpCisgICAgICAgIGQxMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDEydigqKDEsIDIsIDMsIDQpKQorICAgICAgICBkMTJ2KDEsIDIsICooMywgNCwgNSkpCisgICAgICAgIGQxMnYoMSwgKigyLCksICoqeydjJzogM30pCisgICAgICAgIGRlZiBkMjJ2KGEsIGIsIGM9MSwgZD0yLCAqcmVzdCk6IHBhc3MKKyAgICAgICAgZDIydigxLCAyKQorICAgICAgICBkMjJ2KDEsIDIsIDMpCisgICAgICAgIGQyMnYoMSwgMiwgMywgNCkKKyAgICAgICAgZDIydigxLCAyLCAzLCA0LCA1KQorICAgICAgICBkMjJ2KCooMSwgMiwgMywgNCkpCisgICAgICAgIGQyMnYoMSwgMiwgKigzLCA0LCA1KSkKKyAgICAgICAgZDIydigxLCAqKDIsIDMpLCAqKnsnZCc6IDR9KQorICAgICAgICAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCisgICAgICAgIGV4ZWMoJ2RlZiBkMzF2KCh4KSk6IHBhc3MnKQorICAgICAgICBleGVjKCdkZWYgZDMydigoeCwpKTogcGFzcycpCisgICAgICAgIGQzMXYoMSkKKyAgICAgICAgZDMydigoMSwpKQorCisgICAgICAgICMga2V5d29yZCBhcmd1bWVudHMgYWZ0ZXIgKmFyZ2xpc3QKKyAgICAgICAgZGVmIGYoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJldHVybiBhcmdzLCBrd2FyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDEsIHg9MiwgKlszLCA0XSwgeT01KSwgKCgxLCAzLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3gnOjIsICd5Jzo1fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBldmFsLCAiZigxLCAqKDIsMyksIDQpIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICJmKDEsIHg9MiwgKigzLDQpLCB4PTUpIikKKworICAgICAgICAjIENoZWNrIGFzdCBlcnJvcnMgaW4gKmFyZ3MgYW5kICprd2FyZ3MKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCpnKDE9MikpIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmKCoqZygxPTIpKSIpCisKKyAgICBkZWYgdGVzdExhbWJkZWYoc2VsZik6CisgICAgICAgICMjIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0CisgICAgICAgIGwxID0gbGFtYmRhIDogMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxKCksIDApCisgICAgICAgIGwyID0gbGFtYmRhIDogYVtkXSAjIFhYWCBqdXN0IHRlc3RpbmcgdGhlIGV4cHJlc3Npb24KKyAgICAgICAgbDMgPSBsYW1iZGEgOiBbMiA8IHggZm9yIHggaW4gWy0xLCAzLCAwTF1dCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDMoKSwgWzAsIDEsIDBdKQorICAgICAgICBsNCA9IGxhbWJkYSB4ID0gbGFtYmRhIHkgPSBsYW1iZGEgej0xIDogeiA6IHkoKSA6IHgoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGw0KCksIDEpCisgICAgICAgIGw1ID0gbGFtYmRhIHgsIHksIHo9MjogeCArIHkgKyB6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDUoMSwgMiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobDUoMSwgMiwgMyksIDYpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAibGFtYmRhIHg6IHggPSAyIikKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJsYW1iZGEgKE5vbmUsKTogTm9uZSIpCisKKyAgICAjIyMgc3RtdDogc2ltcGxlX3N0bXQgfCBjb21wb3VuZF9zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0U2ltcGxlU3RtdChzZWxmKToKKyAgICAgICAgIyMjIHNpbXBsZV9zdG10OiBzbWFsbF9zdG10ICgnOycgc21hbGxfc3RtdCkqIFsnOyddCisgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeAorICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAjIHZlcmlmeSBzdGF0ZW1lbnRzIHRoYXQgZW5kIHdpdGggc2VtaS1jb2xvbnMKKyAgICAgICAgICAgIHggPSAxOyBwYXNzOyBkZWwgeDsKKyAgICAgICAgZm9vKCkKKworICAgICMjIyBzbWFsbF9zdG10OiBleHByX3N0bXQgfCBwcmludF9zdG10ICB8IHBhc3Nfc3RtdCB8IGRlbF9zdG10IHwgZmxvd19zdG10IHwgaW1wb3J0X3N0bXQgfCBnbG9iYWxfc3RtdCB8IGFjY2Vzc19zdG10IHwgZXhlY19zdG10CisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0RXhwclN0bXQoc2VsZik6CisgICAgICAgICMgKGV4cHJsaXN0ICc9JykqIGV4cHJsaXN0CisgICAgICAgIDEKKyAgICAgICAgMSwgMiwgMworICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSwgMiwgMworICAgICAgICB4ID0geSA9IHogPSAxLCAyLCAzCisgICAgICAgIHgsIHksIHogPSAxLCAyLCAzCisgICAgICAgIGFiYyA9IGEsIGIsIGMgPSB4LCB5LCB6ID0geHl6ID0gMSwgMiwgKDMsIDQpCisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJ4ICsgMSA9IDEiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImEgKyAxID0gYiArIDIiKQorCisgICAgZGVmIHRlc3RQcmludFN0bXQoc2VsZik6CisgICAgICAgICMgJ3ByaW50JyAodGVzdCAnLCcpKiBbdGVzdF0KKyAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisKKyAgICAgICAgIyBDYW4ndCB0ZXN0IHByaW50aW5nIHRvIHJlYWwgc3Rkb3V0IHdpdGhvdXQgY29tcGFyaW5nIG91dHB1dAorICAgICAgICAjIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgaW4gdW5pdHRlc3QuCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorCisgICAgICAgIHByaW50IDEsIDIsIDMKKyAgICAgICAgcHJpbnQgMSwgMiwgMywKKyAgICAgICAgcHJpbnQKKyAgICAgICAgcHJpbnQgMCBvciAxLCAwIG9yIDEsCisgICAgICAgIHByaW50IDAgb3IgMQorCisgICAgICAgICMgJ3ByaW50JyAnPj4nIHRlc3QgJywnCisgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsIDEsIDIsIDMKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMSwgMiwgMywKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dAorICAgICAgICBwcmludCA+PiBzeXMuc3Rkb3V0LCAwIG9yIDEsIDAgb3IgMSwKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZG91dCwgMCBvciAxCisKKyAgICAgICAgIyB0ZXN0IHByaW50aW5nIHRvIGFuIGluc3RhbmNlCisgICAgICAgIGNsYXNzIEd1bHA6CisgICAgICAgICAgICBkZWYgd3JpdGUoc2VsZiwgbXNnKTogcGFzcworCisgICAgICAgIGd1bHAgPSBHdWxwKCkKKyAgICAgICAgcHJpbnQgPj4gZ3VscCwgMSwgMiwgMworICAgICAgICBwcmludCA+PiBndWxwLCAxLCAyLCAzLAorICAgICAgICBwcmludCA+PiBndWxwCisgICAgICAgIHByaW50ID4+IGd1bHAsIDAgb3IgMSwgMCBvciAxLAorICAgICAgICBwcmludCA+PiBndWxwLCAwIG9yIDEKKworICAgICAgICAjIHRlc3QgcHJpbnQgPj4gTm9uZQorICAgICAgICBkZWYgZHJpdmVyKCk6CisgICAgICAgICAgICBvbGRzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gR3VscCgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVsbG1lKEd1bHAoKSkKKyAgICAgICAgICAgICAgICB0ZWxsbWUoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gb2xkc3Rkb3V0CisKKyAgICAgICAgIyB3ZSBzaG91bGQgc2VlIHRoaXMgb25jZQorICAgICAgICBkZWYgdGVsbG1lKGZpbGU9c3lzLnN0ZG91dCk6CisgICAgICAgICAgICBwcmludCA+PiBmaWxlLCAnaGVsbG8gd29ybGQnCisKKyAgICAgICAgZHJpdmVyKCkKKworICAgICAgICAjIHdlIHNob3VsZCBub3Qgc2VlIHRoaXMgYXQgYWxsCisgICAgICAgIGRlZiB0ZWxsbWUoZmlsZT1Ob25lKToKKyAgICAgICAgICAgIHByaW50ID4+IGZpbGUsICdnb29kYnllIHVuaXZlcnNlJworCisgICAgICAgIGRyaXZlcigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuc3Rkb3V0LmdldHZhbHVlKCksICcnJ1wKKzEgMiAzCisxIDIgMworMSAxIDEKKzEgMiAzCisxIDIgMworMSAxIDEKK2hlbGxvIHdvcmxkCisnJycpCisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorCisgICAgICAgICMgc3ludGF4IGVycm9ycworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgJ3ByaW50ICwnKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgJ3ByaW50ID4+IHgsJykKKworICAgIGRlZiB0ZXN0RGVsU3RtdChzZWxmKToKKyAgICAgICAgIyAnZGVsJyBleHBybGlzdAorICAgICAgICBhYmMgPSBbMSwyLDNdCisgICAgICAgIHgsIHksIHogPSBhYmMKKyAgICAgICAgeHl6ID0geCwgeSwgegorCisgICAgICAgIGRlbCBhYmMKKyAgICAgICAgZGVsIHgsIHksICh6LCB4eXopCisKKyAgICBkZWYgdGVzdFBhc3NTdG10KHNlbGYpOgorICAgICAgICAjICdwYXNzJworICAgICAgICBwYXNzCisKKyAgICAjIGZsb3dfc3RtdDogYnJlYWtfc3RtdCB8IGNvbnRpbnVlX3N0bXQgfCByZXR1cm5fc3RtdCB8IHJhaXNlX3N0bXQKKyAgICAjIFRlc3RlZCBiZWxvdworCisgICAgZGVmIHRlc3RCcmVha1N0bXQoc2VsZik6CisgICAgICAgICMgJ2JyZWFrJworICAgICAgICB3aGlsZSAxOiBicmVhaworCisgICAgZGVmIHRlc3RDb250aW51ZVN0bXQoc2VsZik6CisgICAgICAgICMgJ2NvbnRpbnVlJworICAgICAgICBpID0gMQorICAgICAgICB3aGlsZSBpOiBpID0gMDsgY29udGludWUKKworICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gIm9rIgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgbXNnID0gImNvbnRpbnVlIGZhaWxlZCB0byBjb250aW51ZSBpbnNpZGUgdHJ5IgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIG1zZyA9ICJjb250aW51ZSBpbnNpZGUgdHJ5IGNhbGxlZCBleGNlcHQgYmxvY2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgICAgICBtc2cgPSAiIgorICAgICAgICB3aGlsZSBub3QgbXNnOgorICAgICAgICAgICAgbXNnID0gImZpbmFsbHkgYmxvY2sgbm90IGNhbGxlZCIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBtc2cgPSAib2siCisgICAgICAgIGlmIG1zZyAhPSAib2siOgorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgIGRlZiB0ZXN0X2JyZWFrX2NvbnRpbnVlX2xvb3Aoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IHdhcnJhbnRzIGFuIGV4cGxhbmF0aW9uLiBJdCBpcyBhIHRlc3Qgc3BlY2lmaWNhbGx5IGZvciBTRiBidWdzCisgICAgICAgICMgIzQ2MzM1OSBhbmQgIzQ2MjkzNy4gVGhlIGJ1ZyBpcyB0aGF0IGEgJ2JyZWFrJyBzdGF0ZW1lbnQgZXhlY3V0ZWQgb3IKKyAgICAgICAgIyBleGNlcHRpb24gcmFpc2VkIGluc2lkZSBhIHRyeS9leGNlcHQgaW5zaWRlIGEgbG9vcCwgKmFmdGVyKiBhIGNvbnRpbnVlCisgICAgICAgICMgc3RhdGVtZW50IGhhcyBiZWVuIGV4ZWN1dGVkIGluIHRoYXQgbG9vcCwgd2lsbCBjYXVzZSB0aGUgd3JvbmcgbnVtYmVyIG9mCisgICAgICAgICMgYXJndW1lbnRzIHRvIGJlIHBvcHBlZCBvZmYgdGhlIHN0YWNrIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlciByZXNldCB0bworICAgICAgICAjIGEgdmVyeSBzbWFsbCBudW1iZXIgKHVzdWFsbHkgMC4pIEJlY2F1c2Ugb2YgdGhpcywgdGhlIGZvbGxvd2luZyB0ZXN0CisgICAgICAgICMgKm11c3QqIHdyaXR0ZW4gYXMgYSBmdW5jdGlvbiwgYW5kIHRoZSB0cmFja2luZyB2YXJzICptdXN0KiBiZSBmdW5jdGlvbgorICAgICAgICAjIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzLiBPdGhlcndpc2UsIHRoZSB0ZXN0IHdpbGwgbG9vcCBhbmQgbG9vcC4KKworICAgICAgICBkZWYgdGVzdF9pbm5lcihleHRyYV9idXJuaW5nX29pbCA9IDEsIGNvdW50PTApOgorICAgICAgICAgICAgYmlnX2hpcHBvID0gMgorICAgICAgICAgICAgd2hpbGUgYmlnX2hpcHBvOgorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGlmIGV4dHJhX2J1cm5pbmdfb2lsIGFuZCBiaWdfaGlwcG8gPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2J1cm5pbmdfb2lsIC09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGJpZ19oaXBwbyAtPSAxCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgaWYgY291bnQgPiAyIG9yIGJpZ19oaXBwbyAhPSAxOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiY29udGludWUgdGhlbiBicmVhayBpbiB0cnkvZXhjZXB0IGluIGxvb3AgYnJva2VuISIpCisgICAgICAgIHRlc3RfaW5uZXIoKQorCisgICAgZGVmIHRlc3RSZXR1cm4oc2VsZik6CisgICAgICAgICMgJ3JldHVybicgW3Rlc3RsaXN0XQorICAgICAgICBkZWYgZzEoKTogcmV0dXJuCisgICAgICAgIGRlZiBnMigpOiByZXR1cm4gMQorICAgICAgICBnMSgpCisgICAgICAgIHggPSBnMigpCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnJldHVybiAxIikKKworICAgIGRlZiB0ZXN0WWllbGQoc2VsZik6CisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiY2xhc3MgZm9vOnlpZWxkIDEiKQorCisgICAgZGVmIHRlc3RSYWlzZShzZWxmKToKKyAgICAgICAgIyAncmFpc2UnIHRlc3QgWycsJyB0ZXN0XQorICAgICAgICB0cnk6IHJhaXNlIFJ1bnRpbWVFcnJvciwgJ2p1c3QgdGVzdGluZycKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjogcGFzcworICAgICAgICB0cnk6IHJhaXNlIEtleWJvYXJkSW50ZXJydXB0CisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDogcGFzcworCisgICAgZGVmIHRlc3RJbXBvcnQoc2VsZik6CisgICAgICAgICMgJ2ltcG9ydCcgZG90dGVkX2FzX25hbWVzCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaW1wb3J0IHRpbWUsIHN5cworICAgICAgICAjICdmcm9tJyBkb3R0ZWRfbmFtZSAnaW1wb3J0JyAoJyonIHwgJygnIGltcG9ydF9hc19uYW1lcyAnKScgfCBpbXBvcnRfYXNfbmFtZXMpCisgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICBmcm9tIHRpbWUgaW1wb3J0ICh0aW1lKQorICAgICAgICAjIG5vdCB0ZXN0YWJsZSBpbnNpZGUgYSBmdW5jdGlvbiwgYnV0IGFscmVhZHkgZG9uZSBhdCB0b3Agb2YgdGhlIG1vZHVsZQorICAgICAgICAjIGZyb20gc3lzIGltcG9ydCAqCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBwYXRoLCBhcmd2CisgICAgICAgIGZyb20gc3lzIGltcG9ydCAocGF0aCwgYXJndikKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IChwYXRoLCBhcmd2LCkKKworICAgIGRlZiB0ZXN0R2xvYmFsKHNlbGYpOgorICAgICAgICAjICdnbG9iYWwnIE5BTUUgKCcsJyBOQU1FKSoKKyAgICAgICAgZ2xvYmFsIGEKKyAgICAgICAgZ2xvYmFsIGEsIGIKKyAgICAgICAgZ2xvYmFsIG9uZSwgdHdvLCB0aHJlZSwgZm91ciwgZml2ZSwgc2l4LCBzZXZlbiwgZWlnaHQsIG5pbmUsIHRlbgorCisgICAgZGVmIHRlc3RFeGVjKHNlbGYpOgorICAgICAgICAjICdleGVjJyBleHByIFsnaW4nIGV4cHIgWycsJyBleHByXV0KKyAgICAgICAgeiA9IE5vbmUKKyAgICAgICAgZGVsIHoKKyAgICAgICAgZXhlYyAnej0xKzFcbicKKyAgICAgICAgaWYgeiAhPSAyOiBzZWxmLmZhaWwoJ2V4ZWMgXCd6PTErMVwnXFxuJykKKyAgICAgICAgZGVsIHoKKyAgICAgICAgZXhlYyAnej0xKzEnCisgICAgICAgIGlmIHogIT0gMjogc2VsZi5mYWlsKCdleGVjIFwnej0xKzFcJycpCisgICAgICAgIHogPSBOb25lCisgICAgICAgIGRlbCB6CisgICAgICAgIGltcG9ydCB0eXBlcworICAgICAgICBpZiBoYXNhdHRyKHR5cGVzLCAiVW5pY29kZVR5cGUiKToKKyAgICAgICAgICAgIGV4ZWMgciIiImlmIDE6CisgICAgICAgICAgICBleGVjIHUnej0xKzFcbicKKyAgICAgICAgICAgIGlmIHogIT0gMjogc2VsZi5mYWlsKCdleGVjIHVcJ3o9MSsxXCdcXG4nKQorICAgICAgICAgICAgZGVsIHoKKyAgICAgICAgICAgIGV4ZWMgdSd6PTErMScKKyAgICAgICAgICAgIGlmIHogIT0gMjogc2VsZi5mYWlsKCdleGVjIHVcJ3o9MSsxXCcnKSIiIgorICAgICAgICBnID0ge30KKyAgICAgICAgZXhlYyAneiA9IDEnIGluIGcKKyAgICAgICAgaWYgJ19fYnVpbHRpbnNfXycgaW4gZzogZGVsIGdbJ19fYnVpbHRpbnNfXyddCisgICAgICAgIGlmIGcgIT0geyd6JzogMX06IHNlbGYuZmFpbCgnZXhlYyBcJ3ogPSAxXCcgaW4gZycpCisgICAgICAgIGcgPSB7fQorICAgICAgICBsID0ge30KKworICAgICAgICBleGVjICdnbG9iYWwgYTsgYSA9IDE7IGIgPSAyJyBpbiBnLCBsCisgICAgICAgIGlmICdfX2J1aWx0aW5zX18nIGluIGc6IGRlbCBnWydfX2J1aWx0aW5zX18nXQorICAgICAgICBpZiAnX19idWlsdGluc19fJyBpbiBsOiBkZWwgbFsnX19idWlsdGluc19fJ10KKyAgICAgICAgaWYgKGcsIGwpICE9ICh7J2EnOjF9LCB7J2InOjJ9KToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZXhlYyAuLi4gaW4gZyAoJXMpLCBsICglcyknICUoZyxsKSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0KHNlbGYpOgorICAgICAgICAjIGFzc2VydFRydWVzdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgYXNzZXJ0IDEKKyAgICAgICAgYXNzZXJ0IDEsIDEKKyAgICAgICAgYXNzZXJ0IGxhbWJkYSB4OngKKyAgICAgICAgYXNzZXJ0IDEsIGxhbWJkYSB4OngrMQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCBUcnVlCisgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCInYXNzZXJ0IFRydWUnIHNob3VsZCBub3QgaGF2ZSByYWlzZWQgYW4gQXNzZXJ0aW9uRXJyb3IiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCBUcnVlLCAndGhpcyBzaG91bGQgYWx3YXlzIHBhc3MnCisgICAgICAgIGV4Y2VwdCBBc3NlcnRpb25FcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCInYXNzZXJ0IFRydWUsIG1zZycgc2hvdWxkIG5vdCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAicmFpc2VkIGFuIEFzc2VydGlvbkVycm9yIikKKworICAgICMgdGhlc2UgdGVzdHMgZmFpbCBpZiBweXRob24gaXMgcnVuIHdpdGggLU8sIHNvIGNoZWNrIF9fZGVidWdfXworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKF9fZGVidWdfXywgIldvbid0IHdvcmsgaWYgX19kZWJ1Z19fIGlzIEZhbHNlIikKKyAgICBkZWYgdGVzdEFzc2VydDIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCAwLCAibXNnIgorICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgIm1zZyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkFzc2VydGlvbkVycm9yIG5vdCByYWlzZWQgYnkgYXNzZXJ0IDAiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFzc2VydCBGYWxzZQorICAgICAgICBleGNlcHQgQXNzZXJ0aW9uRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGUuYXJncyksIDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkFzc2VydGlvbkVycm9yIG5vdCByYWlzZWQgYnkgJ2Fzc2VydCBGYWxzZSciKQorCisKKyAgICAjIyMgY29tcG91bmRfc3RtdDogaWZfc3RtdCB8IHdoaWxlX3N0bXQgfCBmb3Jfc3RtdCB8IHRyeV9zdG10IHwgZnVuY2RlZiB8IGNsYXNzZGVmCisgICAgIyBUZXN0ZWQgYmVsb3cKKworICAgIGRlZiB0ZXN0SWYoc2VsZik6CisgICAgICAgICMgJ2lmJyB0ZXN0ICc6JyBzdWl0ZSAoJ2VsaWYnIHRlc3QgJzonIHN1aXRlKSogWydlbHNlJyAnOicgc3VpdGVdCisgICAgICAgIGlmIDE6IHBhc3MKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGlmIDA6IHBhc3MKKyAgICAgICAgZWxpZiAwOiBwYXNzCisgICAgICAgIGVsaWYgMDogcGFzcworICAgICAgICBlbGlmIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworCisgICAgZGVmIHRlc3RXaGlsZShzZWxmKToKKyAgICAgICAgIyAnd2hpbGUnIHRlc3QgJzonIHN1aXRlIFsnZWxzZScgJzonIHN1aXRlXQorICAgICAgICB3aGlsZSAwOiBwYXNzCisgICAgICAgIHdoaWxlIDA6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworCisgICAgICAgICMgSXNzdWUxOTIwOiAid2hpbGUgMCIgaXMgb3B0aW1pemVkIGF3YXksCisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlICJlbHNlIiBjbGF1c2UgaXMgc3RpbGwgcHJlc2VudC4KKyAgICAgICAgeCA9IDAKKyAgICAgICAgd2hpbGUgMDoKKyAgICAgICAgICAgIHggPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIDIpCisKKyAgICBkZWYgdGVzdEZvcihzZWxmKToKKyAgICAgICAgIyAnZm9yJyBleHBybGlzdCAnaW4nIGV4cHJsaXN0ICc6JyBzdWl0ZSBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgZm9yIGkgaW4gMSwgMiwgMzogcGFzcworICAgICAgICBmb3IgaSwgaiwgayBpbiAoKTogcGFzcworICAgICAgICBlbHNlOiBwYXNzCisgICAgICAgIGNsYXNzIFNxdWFyZXM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4KToKKyAgICAgICAgICAgICAgICBzZWxmLm1heCA9IG1heAorICAgICAgICAgICAgICAgIHNlbGYuc29mYXIgPSBbXQorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6IHJldHVybiBsZW4oc2VsZi5zb2ZhcikKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBub3QgMCA8PSBpIDwgc2VsZi5tYXg6IHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICBuID0gbGVuKHNlbGYuc29mYXIpCisgICAgICAgICAgICAgICAgd2hpbGUgbiA8PSBpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvZmFyLmFwcGVuZChuKm4pCisgICAgICAgICAgICAgICAgICAgIG4gPSBuKzEKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zb2ZhcltpXQorICAgICAgICBuID0gMAorICAgICAgICBmb3IgeCBpbiBTcXVhcmVzKDEwKTogbiA9IG4reAorICAgICAgICBpZiBuICE9IDI4NToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZm9yIG92ZXIgZ3Jvd2luZyBzZXF1ZW5jZScpCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgZm9yIHgsIGluIFsoMSwpLCAoMiwpLCAoMywpXToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFsxLCAyLCAzXSkKKworICAgIGRlZiB0ZXN0VHJ5KHNlbGYpOgorICAgICAgICAjIyMgdHJ5X3N0bXQ6ICd0cnknICc6JyBzdWl0ZSAoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0KKyAgICAgICAgIyMjICAgICAgICAgfCAndHJ5JyAnOicgc3VpdGUgJ2ZpbmFsbHknICc6JyBzdWl0ZQorICAgICAgICAjIyMgZXhjZXB0X2NsYXVzZTogJ2V4Y2VwdCcgW2V4cHIgWygnYXMnIHwgJywnKSBleHByXV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgMS8wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OiAxLzAKKyAgICAgICAgZXhjZXB0IEVPRkVycm9yOiBwYXNzCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgbXNnOiBwYXNzCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsIG1zZzogcGFzcworICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgZWxzZTogcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKTogcGFzcworICAgICAgICB0cnk6IDEvMAorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBUeXBlRXJyb3IsIFplcm9EaXZpc2lvbkVycm9yKSwgbXNnOiBwYXNzCisgICAgICAgIHRyeTogcGFzcworICAgICAgICBmaW5hbGx5OiBwYXNzCisKKyAgICBkZWYgdGVzdFN1aXRlKHNlbGYpOgorICAgICAgICAjIHNpbXBsZV9zdG10IHwgTkVXTElORSBJTkRFTlQgTkVXTElORSogKHN0bXQgTkVXTElORSopKyBERURFTlQKKyAgICAgICAgaWYgMTogcGFzcworICAgICAgICBpZiAxOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpZiAxOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIworICAgICAgICAgICAgIworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIworICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIworCisgICAgZGVmIHRlc3RUZXN0KHNlbGYpOgorICAgICAgICAjIyMgYW5kX3Rlc3QgKCdvcicgYW5kX3Rlc3QpKgorICAgICAgICAjIyMgYW5kX3Rlc3Q6IG5vdF90ZXN0ICgnYW5kJyBub3RfdGVzdCkqCisgICAgICAgICMjIyBub3RfdGVzdDogJ25vdCcgbm90X3Rlc3QgfCBjb21wYXJpc29uCisgICAgICAgIGlmIG5vdCAxOiBwYXNzCisgICAgICAgIGlmIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgaWYgMSBvciAxOiBwYXNzCisgICAgICAgIGlmIG5vdCBub3Qgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgbm90IDEgYW5kIDEgYW5kIDE6IHBhc3MKKyAgICAgICAgaWYgMSBhbmQgMSBvciAxIGFuZCAxIGFuZCAxIG9yIG5vdCAxIGFuZCAxOiBwYXNzCisKKyAgICBkZWYgdGVzdENvbXBhcmlzb24oc2VsZik6CisgICAgICAgICMjIyBjb21wYXJpc29uOiBleHByIChjb21wX29wIGV4cHIpKgorICAgICAgICAjIyMgY29tcF9vcDogJzwnfCc+J3wnPT0nfCc+PSd8Jzw9J3wnPD4nfCchPSd8J2luJ3wnbm90JyAnaW4nfCdpcyd8J2lzJyAnbm90JworICAgICAgICBpZiAxOiBwYXNzCisgICAgICAgIHggPSAoMSA9PSAxKQorICAgICAgICBpZiAxID09IDE6IHBhc3MKKyAgICAgICAgaWYgMSAhPSAxOiBwYXNzCisgICAgICAgIGlmIDEgPCAxOiBwYXNzCisgICAgICAgIGlmIDEgPiAxOiBwYXNzCisgICAgICAgIGlmIDEgPD0gMTogcGFzcworICAgICAgICBpZiAxID49IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpcyAxOiBwYXNzCisgICAgICAgIGlmIDEgaXMgbm90IDE6IHBhc3MKKyAgICAgICAgaWYgMSBpbiAoKTogcGFzcworICAgICAgICBpZiAxIG5vdCBpbiAoKTogcGFzcworICAgICAgICBpZiAxIDwgMSA+IDEgPT0gMSA+PSAxIDw9IDEgIT0gMSBpbiAxIG5vdCBpbiAxIGlzIDEgaXMgbm90IDE6IHBhc3MKKyAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICBpZiBldmFsKCcxIDw+IDEnKTogcGFzcworICAgICAgICBpZiBldmFsKCcxIDwgMSA+IDEgPT0gMSA+PSAxIDw9IDEgPD4gMSAhPSAxIGluIDEgbm90IGluIDEgaXMgMSBpcyBub3QgMScpOiBwYXNzCisKKyAgICBkZWYgdGVzdEJpbmFyeU1hc2tPcHMoc2VsZik6CisgICAgICAgIHggPSAxICYgMQorICAgICAgICB4ID0gMSBeIDEKKyAgICAgICAgeCA9IDEgfCAxCisKKyAgICBkZWYgdGVzdFNoaWZ0T3BzKHNlbGYpOgorICAgICAgICB4ID0gMSA8PCAxCisgICAgICAgIHggPSAxID4+IDEKKyAgICAgICAgeCA9IDEgPDwgMSA+PiAxCisKKyAgICBkZWYgdGVzdEFkZGl0aXZlT3BzKHNlbGYpOgorICAgICAgICB4ID0gMQorICAgICAgICB4ID0gMSArIDEKKyAgICAgICAgeCA9IDEgLSAxIC0gMQorICAgICAgICB4ID0gMSAtIDEgKyAxIC0gMSArIDEKKworICAgIGRlZiB0ZXN0TXVsdGlwbGljYXRpdmVPcHMoc2VsZik6CisgICAgICAgIHggPSAxICogMQorICAgICAgICB4ID0gMSAvIDEKKyAgICAgICAgeCA9IDEgJSAxCisgICAgICAgIHggPSAxIC8gMSAqIDEgJSAxCisKKyAgICBkZWYgdGVzdFVuYXJ5T3BzKHNlbGYpOgorICAgICAgICB4ID0gKzEKKyAgICAgICAgeCA9IC0xCisgICAgICAgIHggPSB+MQorICAgICAgICB4ID0gfjEgXiAxICYgMSB8IDEgJiAxIF4gLTEKKyAgICAgICAgeCA9IC0xKjEvMSArIDEqMSAtIC0tLTEqMQorCisgICAgZGVmIHRlc3RTZWxlY3RvcnMoc2VsZik6CisgICAgICAgICMjIyB0cmFpbGVyOiAnKCcgW3Rlc3RsaXN0XSAnKScgfCAnWycgc3Vic2NyaXB0ICddJyB8ICcuJyBOQU1FCisgICAgICAgICMjIyBzdWJzY3JpcHQ6IGV4cHIgfCBbZXhwcl0gJzonIFtleHByXQorCisgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgYyA9IHN5cy5wYXRoWzBdCisgICAgICAgIHggPSB0aW1lLnRpbWUoKQorICAgICAgICB4ID0gc3lzLm1vZHVsZXNbJ3RpbWUnXS50aW1lKCkKKyAgICAgICAgYSA9ICcwMTIzNCcKKyAgICAgICAgYyA9IGFbMF0KKyAgICAgICAgYyA9IGFbLTFdCisgICAgICAgIHMgPSBhWzA6NV0KKyAgICAgICAgcyA9IGFbOjVdCisgICAgICAgIHMgPSBhWzA6XQorICAgICAgICBzID0gYVs6XQorICAgICAgICBzID0gYVstNTpdCisgICAgICAgIHMgPSBhWzotMV0KKyAgICAgICAgcyA9IGFbLTQ6LTNdCisgICAgICAgICMgQSByb3VnaCB0ZXN0IG9mIFNGIGJ1ZyAxMzMzOTgyLiAgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTMzMzk4MgorICAgICAgICAjIFRoZSB0ZXN0aW5nIGhlcmUgaXMgZmFpcmx5IGluY29tcGxldGUuCisgICAgICAgICMgVGVzdCBjYXNlcyBzaG91bGQgaW5jbHVkZTogY29tbWFzIHdpdGggMSBhbmQgMiBjb2xvbnMKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGRbMV0gPSAxCisgICAgICAgIGRbMSxdID0gMgorICAgICAgICBkWzEsMl0gPSAzCisgICAgICAgIGRbMSwyLDNdID0gNAorICAgICAgICBMID0gbGlzdChkKQorICAgICAgICBMLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihMKSwgJ1sxLCAoMSwpLCAoMSwgMiksICgxLCAyLCAzKV0nKQorCisgICAgZGVmIHRlc3RBdG9tcyhzZWxmKToKKyAgICAgICAgIyMjIGF0b206ICcoJyBbdGVzdGxpc3RdICcpJyB8ICdbJyBbdGVzdGxpc3RdICddJyB8ICd7JyBbZGljdG1ha2VyXSAnfScgfCAnYCcgdGVzdGxpc3QgJ2AnIHwgTkFNRSB8IE5VTUJFUiB8IFNUUklORworICAgICAgICAjIyMgZGljdG9yc2V0bWFrZXI6ICh0ZXN0ICc6JyB0ZXN0ICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSB8ICh0ZXN0ICgnLCcgdGVzdCkqIFsnLCddKQorCisgICAgICAgIHggPSAoMSkKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMykKKyAgICAgICAgeCA9ICgxIG9yIDIgb3IgMywgMiwgMykKKworICAgICAgICB4ID0gW10KKyAgICAgICAgeCA9IFsxXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzXQorICAgICAgICB4ID0gWzEgb3IgMiBvciAzLCAyLCAzXQorICAgICAgICB4ID0gW10KKworICAgICAgICB4ID0ge30KKyAgICAgICAgeCA9IHsnb25lJzogMX0KKyAgICAgICAgeCA9IHsnb25lJzogMSx9CisgICAgICAgIHggPSB7J29uZScgb3IgJ3R3byc6IDEgb3IgMn0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDJ9CisgICAgICAgIHggPSB7J29uZSc6IDEsICd0d28nOiAyLH0KKyAgICAgICAgeCA9IHsnb25lJzogMSwgJ3R3byc6IDIsICd0aHJlZSc6IDMsICdmb3VyJzogNCwgJ2ZpdmUnOiA1LCAnc2l4JzogNn0KKworICAgICAgICB4ID0geydvbmUnfQorICAgICAgICB4ID0geydvbmUnLCAxLH0KKyAgICAgICAgeCA9IHsnb25lJywgJ3R3bycsICd0aHJlZSd9CisgICAgICAgIHggPSB7MiwgMywgNCx9CisKKyAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICB4ID0gZXZhbCgnYHhgJykKKyAgICAgICAgeCA9IGV2YWwoJ2AxIG9yIDIgb3IgM2AnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ2AxLDJgJyksICcoMSwgMiknKQorCisgICAgICAgIHggPSB4CisgICAgICAgIHggPSAneCcKKyAgICAgICAgeCA9IDEyMworCisgICAgIyMjIGV4cHJsaXN0OiBleHByICgnLCcgZXhwcikqIFsnLCddCisgICAgIyMjIHRlc3RsaXN0OiB0ZXN0ICgnLCcgdGVzdCkqIFsnLCddCisgICAgIyBUaGVzZSBoYXZlIGJlZW4gZXhlcmNpc2VkIGVub3VnaCBhYm92ZQorCisgICAgZGVmIHRlc3RDbGFzc2RlZihzZWxmKToKKyAgICAgICAgIyAnY2xhc3MnIE5BTUUgWycoJyBbdGVzdGxpc3RdICcpJ10gJzonIHN1aXRlCisgICAgICAgIGNsYXNzIEI6IHBhc3MKKyAgICAgICAgY2xhc3MgQjIoKTogcGFzcworICAgICAgICBjbGFzcyBDMShCKTogcGFzcworICAgICAgICBjbGFzcyBDMihCKTogcGFzcworICAgICAgICBjbGFzcyBEKEMxLCBDMiwgQik6IHBhc3MKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBtZXRoMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIG1ldGgyKHNlbGYsIGFyZyk6IHBhc3MKKyAgICAgICAgICAgIGRlZiBtZXRoMyhzZWxmLCBhMSwgYTIpOiBwYXNzCisgICAgICAgICMgZGVjb3JhdG9yOiAnQCcgZG90dGVkX25hbWUgWyAnKCcgW2FyZ2xpc3RdICcpJyBdIE5FV0xJTkUKKyAgICAgICAgIyBkZWNvcmF0b3JzOiBkZWNvcmF0b3IrCisgICAgICAgICMgZGVjb3JhdGVkOiBkZWNvcmF0b3JzIChjbGFzc2RlZiB8IGZ1bmNkZWYpCisgICAgICAgIGRlZiBjbGFzc19kZWNvcmF0b3IoeCk6CisgICAgICAgICAgICB4LmRlY29yYXRlZCA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIEBjbGFzc19kZWNvcmF0b3IKKyAgICAgICAgY2xhc3MgRzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChHLmRlY29yYXRlZCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0RGljdGNvbXBzKHNlbGYpOgorICAgICAgICAjIGRpY3RvcnNldG1ha2VyOiAoICh0ZXN0ICc6JyB0ZXN0IChjb21wX2ZvciB8CisgICAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnLCcgdGVzdCAnOicgdGVzdCkqIFsnLCddKSkgfAorICAgICAgICAjICAgICAgICAgICAgICAgICAgICh0ZXN0IChjb21wX2ZvciB8ICgnLCcgdGVzdCkqIFsnLCddKSkgKQorICAgICAgICBudW1zID0gWzEsIDIsIDNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe2k6aSsxIGZvciBpIGluIG51bXN9LCB7MTogMiwgMjogMywgMzogNH0pCisKKyAgICBkZWYgdGVzdExpc3Rjb21wcyhzZWxmKToKKyAgICAgICAgIyBsaXN0IGNvbXByZWhlbnNpb24gdGVzdHMKKyAgICAgICAgbnVtcyA9IFsxLCAyLCAzLCA0LCA1XQorICAgICAgICBzdHJzID0gWyJBcHBsZSIsICJCYW5hbmEiLCAiQ29jb251dCJdCisgICAgICAgIHNwY3MgPSBbIiAgQXBwbGUiLCAiIEJhbmFuYSAiLCAiQ29jbyAgbnV0ICAiXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3Muc3RyaXAoKSBmb3IgcyBpbiBzcGNzXSwgWydBcHBsZScsICdCYW5hbmEnLCAnQ29jbyAgbnV0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzMgKiB4IGZvciB4IGluIG51bXNdLCBbMywgNiwgOSwgMTIsIDE1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbeCBmb3IgeCBpbiBudW1zIGlmIHggPiAyXSwgWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSwgcykgZm9yIGkgaW4gbnVtcyBmb3IgcyBpbiBzdHJzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdBcHBsZScpLCAoMSwgJ0JhbmFuYScpLCAoMSwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdBcHBsZScpLCAoMiwgJ0JhbmFuYScpLCAoMiwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdBcHBsZScpLCAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdBcHBsZScpLCAoNCwgJ0JhbmFuYScpLCAoNCwgJ0NvY29udXQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdBcHBsZScpLCAoNSwgJ0JhbmFuYScpLCAoNSwgJ0NvY29udXQnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhpLCBzKSBmb3IgaSBpbiBudW1zIGZvciBzIGluIFtmIGZvciBmIGluIHN0cnMgaWYgIm4iIGluIGZdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDEsICdCYW5hbmEnKSwgKDEsICdDb2NvbnV0JyksICgyLCAnQmFuYW5hJyksICgyLCAnQ29jb251dCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ0JhbmFuYScpLCAoMywgJ0NvY29udXQnKSwgKDQsICdCYW5hbmEnKSwgKDQsICdDb2NvbnV0JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnQmFuYW5hJyksICg1LCAnQ29jb251dCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGxhbWJkYSBhOlthKippIGZvciBpIGluIHJhbmdlKGErMSldKShqKSBmb3IgaiBpbiByYW5nZSg1KV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW1sxXSwgWzEsIDFdLCBbMSwgMiwgNF0sIFsxLCAzLCA5LCAyN10sIFsxLCA0LCAxNiwgNjQsIDI1Nl1dKQorCisgICAgICAgIGRlZiB0ZXN0X2luX2Z1bmMobCk6CisgICAgICAgICAgICByZXR1cm4gW05vbmUgPCB4IDwgMyBmb3IgeCBpbiBsIGlmIHggPiAyXQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdF9pbl9mdW5jKG51bXMpLCBbRmFsc2UsIEZhbHNlLCBGYWxzZV0pCisKKyAgICAgICAgZGVmIHRlc3RfbmVzdGVkX2Zyb250KCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtbeSBmb3IgeSBpbiBbeCwgeCArIDFdXSBmb3IgeCBpbiBbMSwzLDVdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1sxLCAyXSwgWzMsIDRdLCBbNSwgNl1dKQorCisgICAgICAgIHRlc3RfbmVzdGVkX2Zyb250KCkKKworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIltpLCBzIGZvciBpIGluIG51bXMgZm9yIHMgaW4gc3Ryc10iKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIlt4IGlmIHldIikKKworICAgICAgICBzdXBwbGllcnMgPSBbCisgICAgICAgICAgKDEsICJCb2VpbmciKSwKKyAgICAgICAgICAoMiwgIkZvcmQiKSwKKyAgICAgICAgICAoMywgIk1hY2RvbmFsZHMiKQorICAgICAgICBdCisKKyAgICAgICAgcGFydHMgPSBbCisgICAgICAgICAgKDEwLCAiQWlybGluZXIiKSwKKyAgICAgICAgICAoMjAsICJFbmdpbmUiKSwKKyAgICAgICAgICAoMzAsICJDaGVlc2VidXJnZXIiKQorICAgICAgICBdCisKKyAgICAgICAgc3VwcGFydCA9IFsKKyAgICAgICAgICAoMSwgMTApLCAoMSwgMjApLCAoMiwgMjApLCAoMywgMzApCisgICAgICAgIF0KKworICAgICAgICB4ID0gWworICAgICAgICAgIChzbmFtZSwgcG5hbWUpCisgICAgICAgICAgICBmb3IgKHNubywgc25hbWUpIGluIHN1cHBsaWVycworICAgICAgICAgICAgICBmb3IgKHBubywgcG5hbWUpIGluIHBhcnRzCisgICAgICAgICAgICAgICAgZm9yIChzcF9zbm8sIHNwX3BubykgaW4gc3VwcGFydAorICAgICAgICAgICAgICAgICAgaWYgc25vID09IHNwX3NubyBhbmQgcG5vID09IHNwX3BubworICAgICAgICBdCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBbKCdCb2VpbmcnLCAnQWlybGluZXInKSwgKCdCb2VpbmcnLCAnRW5naW5lJyksICgnRm9yZCcsICdFbmdpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdNYWNkb25hbGRzJywgJ0NoZWVzZWJ1cmdlcicpXSkKKworICAgIGRlZiB0ZXN0R2VuZXhwcyhzZWxmKToKKyAgICAgICAgIyBnZW5lcmF0b3IgZXhwcmVzc2lvbiB0ZXN0cworICAgICAgICBnID0gKFt4IGZvciB4IGluIHJhbmdlKDEwKV0gZm9yIHggaW4gcmFuZ2UoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5uZXh0KCksIFt4IGZvciB4IGluIHJhbmdlKDEwKV0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGcubmV4dCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoJ3Nob3VsZCBwcm9kdWNlIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uJykKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYSA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZyA9IChhIGZvciBkIGluIGEpCisgICAgICAgICAgICBnLm5leHQoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCdzaG91bGQgcHJvZHVjZSBUeXBlRXJyb3InKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJyksIFsoeCwgeSkgZm9yIHggaW4gJ2FiY2QnIGZvciB5IGluICdhYmNkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoeCwgeSkgZm9yIHggaW4gJ2FiJyBmb3IgeSBpbiAneHknKSwgWyh4LCB5KSBmb3IgeCBpbiAnYWInIGZvciB5IGluICd4eSddKQorCisgICAgICAgIGEgPSBbeCBmb3IgeCBpbiByYW5nZSgxMCldCisgICAgICAgIGIgPSAoeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiBhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oYiksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bSh4KioyIGZvciB4IGluIHJhbmdlKDEwKSksIHN1bShbeCoqMiBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCp4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4JTIpLCBzdW0oW3gqeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCUyXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gcmFuZ2UoMTApKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpKSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiBbeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkpXSksIHN1bShbeCBmb3IgeCBpbiByYW5nZSgxMCldKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oeCBmb3IgeCBpbiAoeSBmb3IgeSBpbiAoeiBmb3IgeiBpbiByYW5nZSgxMCkgaWYgVHJ1ZSkpIGlmIFRydWUpLCBzdW0oW3ggZm9yIHggaW4gcmFuZ2UoMTApXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKHggZm9yIHggaW4gKHkgZm9yIHkgaW4gKHogZm9yIHogaW4gcmFuZ2UoMTApIGlmIFRydWUpIGlmIEZhbHNlKSBpZiBUcnVlKSwgMCkKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICJmb28oeCBmb3IgeCBpbiByYW5nZSgxMCksIDEwMCkiKQorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgImZvbygxMDAsIHggZm9yIHggaW4gcmFuZ2UoMTApKSIpCisKKyAgICBkZWYgdGVzdENvbXByZWhlbnNpb25TcGVjaWFscyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGZvciBvdXRtb3N0IGl0ZXJhYmxlIHByZWNvbXB1dGF0aW9uCisgICAgICAgIHggPSAxMDsgZyA9IChpIGZvciBpIGluIHJhbmdlKHgpKTsgeCA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChnKSksIDEwKQorCisgICAgICAgICMgVGhpcyBzaG91bGQgaG9sZCwgc2luY2Ugd2UncmUgb25seSBwcmVjb21wdXRpbmcgb3V0bW9zdCBpdGVyYWJsZS4KKyAgICAgICAgeCA9IDEwOyB0ID0gRmFsc2U7IGcgPSAoKGksaikgZm9yIGkgaW4gcmFuZ2UoeCkgaWYgdCBmb3IgaiBpbiByYW5nZSh4KSkKKyAgICAgICAgeCA9IDU7IHQgPSBUcnVlOworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaSxqKSBmb3IgaSBpbiByYW5nZSgxMCkgZm9yIGogaW4gcmFuZ2UoNSldLCBsaXN0KGcpKQorCisgICAgICAgICMgR3JhbW1hciBhbGxvd3MgbXVsdGlwbGUgYWRqYWNlbnQgJ2lmJ3MgaW4gbGlzdGNvbXBzIGFuZCBnZW5leHBzLAorICAgICAgICAjIGV2ZW4gdGhvdWdoIGl0J3Mgc2lsbHkuIE1ha2Ugc3VyZSBpdCB3b3JrcyAoaWZlbHNlIGJyb2tlIHRoaXMuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMgXSwgWzEsIDUsIDddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCBmb3IgeCBpbiByYW5nZSgxMCkgaWYgeCAlIDIgaWYgeCAlIDMpLCBbMSwgNSwgN10pCisKKyAgICAgICAgIyB2ZXJpZnkgdW5wYWNraW5nIHNpbmdsZSBlbGVtZW50IHR1cGxlcyBpbiBsaXN0Y29tcC9nZW5leHAuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3ggZm9yIHgsIGluIFsoNCwpLCAoNSwpLCAoNiwpXV0sIFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHggZm9yIHgsIGluIFsoNywpLCAoOCwpLCAoOSwpXSksIFs3LCA4LCA5XSkKKworICAgIGRlZiB0ZXN0X3dpdGhfc3RhdGVtZW50KHNlbGYpOgorICAgICAgICBjbGFzcyBtYW5hZ2VyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoMSwgMikKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHdpdGggbWFuYWdlcigpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyB4OgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyAoeCwgeSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpLCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHdpdGggbWFuYWdlcigpIGFzIHgsIG1hbmFnZXIoKSBhcyB5OgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIG1hbmFnZXIoKSBhcyB4LCBtYW5hZ2VyKCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdElmRWxzZUV4cHIoc2VsZik6CisgICAgICAgICMgVGVzdCBpZmVsc2UgZXhwcmVzc2lvbnMgaW4gdmFyaW91cyBjYXNlcworICAgICAgICBkZWYgX2NoZWNrZXZhbChtc2csIHJldCk6CisgICAgICAgICAgICAiaGVscGVyIHRvIGNoZWNrIHRoYXQgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyBpcyBkb25lIGNvcnJlY3RseSIKKyAgICAgICAgICAgIHByaW50IHgKKyAgICAgICAgICAgIHJldHVybiByZXQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCgpIGZvciB4IGluIGxhbWJkYTogVHJ1ZSwgbGFtYmRhOiBGYWxzZSBpZiB4KCkgXSwgW1RydWVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsgeCgpIGZvciB4IGluIChsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UpIGlmIHgoKSBdLCBbVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyB4KEZhbHNlKSBmb3IgeCBpbiAobGFtYmRhIHg6IEZhbHNlIGlmIHggZWxzZSBUcnVlLCBsYW1iZGEgeDogVHJ1ZSBpZiB4IGVsc2UgRmFsc2UpIGlmIHgoRmFsc2UpIF0sIFtUcnVlXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgMSIsIDApKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoX2NoZWNrZXZhbCgiY2hlY2sgMiIsIDApIGlmIDAgZWxzZSA1KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSBhbmQgNiBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCg1IGFuZCA2KSBpZiAwIGVsc2UgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDUgYW5kICg2IGlmIDEgZWxzZSAxKSksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgb3IgX2NoZWNrZXZhbCgiY2hlY2sgMyIsIDIpIGlmIDAgZWxzZSAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMSBvciBfY2hlY2tldmFsKCJjaGVjayA0IiwgMikgaWYgMSBlbHNlIF9jaGVja2V2YWwoImNoZWNrIDUiLCAzKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDAgb3IgNSBpZiAxIGVsc2UgX2NoZWNrZXZhbCgiY2hlY2sgNiIsIDMpKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobm90IDUgaWYgMSBlbHNlIDEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobm90IDUgaWYgMCBlbHNlIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2ICsgMSBpZiAxIGVsc2UgMiksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDYgLSAxIGlmIDEgZWxzZSAyKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAqIDIgaWYgMSBlbHNlIDQpLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNiAvIDIgaWYgMSBlbHNlIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2IDwgNCBpZiAwIGVsc2UgMiksIDIpCisKKyAgICBkZWYgdGVzdF9wYXJlbl9ldmFsdWF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDE2IC8vICg0IC8vIDIpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxNiAvLyA0KSAvLyAyLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDE2IC8vIDQgLy8gMiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEZhbHNlIGlzICgyIGlzIDMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKChGYWxzZSBpcyAyKSBpcyAzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEZhbHNlIGlzIDIgaXMgMykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCJiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgKCJ0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nIGhhcyBiZWVuIHJlbW92ZWQiLCBTeW50YXhXYXJuaW5nKSwKKyAgICAgICAgICAgICgicGFyZW50aGVzaXplZCBhcmd1bWVudCBuYW1lcyBhcmUgaW52YWxpZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgKCJjbGFzc2ljIGludCBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoIi4rIG5vdCBzdXBwb3J0ZWQgaW4gMy54IiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHJ1bl91bml0dGVzdChUb2tlblRlc3RzLCBHcmFtbWFyVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dyYW1tYXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkNTc0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dyYW1tYXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dyYW1tYXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JhbW1hci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlZGI0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dyYW1tYXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmQyYmFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3JwLnB5CkBAIC0wLDAgKzEsOTcgQEAKKyIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgZ3JwIG1vZHVsZS4iIiIKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitncnAgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnZ3JwJykKKworY2xhc3MgR3JvdXBEYXRhYmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBjaGVja192YWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgICMgY2hlY2sgdGhhdCBhIGdycCB0dXBsZSBoYXMgdGhlIGVudHJpZXMgYW5kCisgICAgICAgICMgYXR0cmlidXRlcyBwcm9taXNlZCBieSB0aGUgZG9jcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZSksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbMF0sIHZhbHVlLmdyX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2YWx1ZS5ncl9uYW1lLCBiYXNlc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWzFdLCB2YWx1ZS5ncl9wYXNzd2QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2YWx1ZS5ncl9wYXNzd2QsIGJhc2VzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbMl0sIHZhbHVlLmdyX2dpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZhbHVlLmdyX2dpZCwgKGxvbmcsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbM10sIHZhbHVlLmdyX21lbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZhbHVlLmdyX21lbSwgbGlzdCkKKworICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZW50cmllcyA9IGdycC5nZXRncmFsbCgpCisKKyAgICAgICAgZm9yIGUgaW4gZW50cmllczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdmFsdWUoZSkKKworICAgICAgICBpZiBsZW4oZW50cmllcykgPiAxMDAwOiAgIyBIdWdlIGdyb3VwIGZpbGUgKE5JUz8pIC0tIHNraXAgdGhlIHJlc3QKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZvciBlIGluIGVudHJpZXM6CisgICAgICAgICAgICBlMiA9IGdycC5nZXRncmdpZChlLmdyX2dpZCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdmFsdWUoZTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUyLmdyX2dpZCwgZS5ncl9naWQpCisgICAgICAgICAgICBuYW1lID0gZS5ncl9uYW1lCisgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJysnKSBvciBuYW1lLnN0YXJ0c3dpdGgoJy0nKToKKyAgICAgICAgICAgICAgICAjIE5JUy1yZWxhdGVkIGVudHJ5CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGUyID0gZ3JwLmdldGdybmFtKG5hbWUpCisgICAgICAgICAgICBzZWxmLmNoZWNrX3ZhbHVlKGUyKQorICAgICAgICAgICAgIyBUaGVyZSBhcmUgaW5zdGFuY2VzIHdoZXJlIGdldGdyYWxsKCkgcmV0dXJucyBncm91cCBuYW1lcyBpbgorICAgICAgICAgICAgIyBsb3dlcmNhc2Ugd2hpbGUgZ2V0Z3JnaWQoKSByZXR1cm5zIHByb3BlciBjYXNpbmcuCisgICAgICAgICAgICAjIERpc2NvdmVyZWQgb24gVWJ1bnR1IDUuMDQgKGN1c3RvbSkuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUyLmdyX25hbWUubG93ZXIoKSwgbmFtZS5sb3dlcigpKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdycC5nZXRncmdpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBncnAuZ2V0Z3JuYW0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ3JwLmdldGdyYWxsLCA0MikKKworICAgICAgICAjIHRyeSB0byBnZXQgc29tZSBlcnJvcnMKKyAgICAgICAgYnluYW1lcyA9IHt9CisgICAgICAgIGJ5Z2lkcyA9IHt9CisgICAgICAgIGZvciAobiwgcCwgZywgbWVtKSBpbiBncnAuZ2V0Z3JhbGwoKToKKyAgICAgICAgICAgIGlmIG5vdCBuIG9yIG4gPT0gJysnOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgc2tpcCBOSVMgZW50cmllcyBldGMuCisgICAgICAgICAgICBieW5hbWVzW25dID0gZworICAgICAgICAgICAgYnlnaWRzW2ddID0gbgorCisgICAgICAgIGFsbG5hbWVzID0gYnluYW1lcy5rZXlzKCkKKyAgICAgICAgbmFtZWkgPSAwCisgICAgICAgIGZha2VuYW1lID0gYWxsbmFtZXNbbmFtZWldCisgICAgICAgIHdoaWxlIGZha2VuYW1lIGluIGJ5bmFtZXM6CisgICAgICAgICAgICBjaGFycyA9IGxpc3QoZmFrZW5hbWUpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNoYXJzKSk6CisgICAgICAgICAgICAgICAgaWYgY2hhcnNbaV0gPT0gJ3onOgorICAgICAgICAgICAgICAgICAgICBjaGFyc1tpXSA9ICdBJworICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgY2hhcnNbaV0gPT0gJ1onOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNoYXJzW2ldID0gY2hyKG9yZChjaGFyc1tpXSkgKyAxKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1laSA9IG5hbWVpICsgMQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZmFrZW5hbWUgPSBhbGxuYW1lc1tuYW1laV0KKyAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgIyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uIGlmIHNvLCBqdXN0IGZvcmdldCBpdAorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZmFrZW5hbWUgPSAnJy5qb2luKGNoYXJzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBncnAuZ2V0Z3JuYW0sIGZha2VuYW1lKQorCisgICAgICAgICMgQ2hvb3NlIGEgbm9uLWV4aXN0ZW50IGdpZC4KKyAgICAgICAgZmFrZWdpZCA9IDQxMjcKKyAgICAgICAgd2hpbGUgZmFrZWdpZCBpbiBieWdpZHM6CisgICAgICAgICAgICBmYWtlZ2lkID0gKGZha2VnaWQgKiAzKSAlIDB4MTAwMDAKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZ3JwLmdldGdyZ2lkLCBmYWtlZ2lkKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChHcm91cERhdGFiYXNlVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncnAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDNlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncnAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2dycC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncnAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZDNlM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ncnAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2d6aXAucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nemlwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MmM1NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9nemlwLnB5CkBAIC0wLDAgKzEsMzA0IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJUZXN0IHNjcmlwdCBmb3IgdGhlIGd6aXAgbW9kdWxlLgorIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcworaW1wb3J0IGlvCitpbXBvcnQgc3RydWN0CitnemlwID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2d6aXAnKQorCitkYXRhMSA9ICIiIiAgaW50IGxlbmd0aD1ERUZBVUxUQUxMT0MsIGVyciA9IFpfT0s7CisgIFB5T2JqZWN0ICpSZXRWYWw7CisgIGludCBmbHVzaG1vZGUgPSBaX0ZJTklTSDsKKyAgdW5zaWduZWQgbG9uZyBzdGFydF90b3RhbF9vdXQ7CisKKyIiIgorCitkYXRhMiA9ICIiIi8qIHpsaWJtb2R1bGUuYyAtLSBnemlwLWNvbXBhdGlibGUgZGF0YSBjb21wcmVzc2lvbiAqLworLyogU2VlIGh0dHA6Ly93d3cuZ3ppcC5vcmcvemxpYi8KKy8qIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsIGZvciBXaW5kb3dzICovCisiIiIKKworCitjbGFzcyBUZXN0R3ppcCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZW5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi5maWxlbmFtZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLmZpbGVuYW1lKQorCisKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICd3YicpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGRhdGExICogNTApCisKKyAgICAgICAgICAgICMgVHJ5IGZsdXNoIGFuZCBmaWxlbm8uCisgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgIGYuZmlsZW5vKCkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICdmc3luYycpOgorICAgICAgICAgICAgICAgIG9zLmZzeW5jKGYuZmlsZW5vKCkpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIFRlc3QgbXVsdGlwbGUgY2xvc2UoKSBjYWxscy4KKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfd3JpdGUoKQorICAgICAgICAjIFRyeSByZWFkaW5nLgorICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3InKSBhcyBmOgorICAgICAgICAgICAgZCA9IGYucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgZGF0YTEqNTApCisKKyAgICBkZWYgdGVzdF9yZWFkX3VuaXZlcnNhbF9uZXdsaW5lcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNTE0ODogUmVhZGluZyBicmVha3Mgd2hlbiBtb2RlIGNvbnRhaW5zICdVJy4KKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICdyVScpIGFzIGY6CisgICAgICAgICAgICBkID0gZi5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkYXRhMSo1MCkKKworICAgIGRlZiB0ZXN0X2lvX29uX2Nsb3NlZF9vYmplY3Qoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IEkvTyBvcGVyYXRpb25zIG9uIGNsb3NlZCBHemlwRmlsZSBvYmplY3RzIHJhaXNlIGEKKyAgICAgICAgIyBWYWx1ZUVycm9yLCBqdXN0IGxpa2UgdGhlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb25zIG9uIGZpbGUgb2JqZWN0cy4KKworICAgICAgICAjIFdyaXRlIHRvIGEgZmlsZSwgb3BlbiBpdCBmb3IgcmVhZGluZywgdGhlbiBjbG9zZSBpdC4KKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgZiA9IGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3InKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIGYucmVhZCgxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBmLnRlbGwoKQorICAgICAgICAjIE9wZW4gdGhlIGZpbGUgZm9yIHdyaXRpbmcsIHRoZW4gY2xvc2UgaXQuCisgICAgICAgIGYgPSBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICd3JykKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBmLndyaXRlKCcnKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgZi5mbHVzaCgpCisKKyAgICBkZWYgdGVzdF9hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisgICAgICAgICMgQXBwZW5kIHRvIHRoZSBwcmV2aW91cyBmaWxlCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAnYWInKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShkYXRhMiAqIDE1KQorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgZCA9IGYucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgKGRhdGExKjUwKSArIChkYXRhMioxNSkpCisKKyAgICBkZWYgdGVzdF9tYW55X2FwcGVuZChzZWxmKToKKyAgICAgICAgIyBCdWcgIzEwNzQyNjEgd2FzIHRyaWdnZXJlZCB3aGVuIHJlYWRpbmcgYSBmaWxlIHRoYXQgY29udGFpbmVkCisgICAgICAgICMgbWFueSwgbWFueSBtZW1iZXJzLiAgQ3JlYXRlIHN1Y2ggYSBmaWxlIGFuZCB2ZXJpZnkgdGhhdCByZWFkaW5nIGl0CisgICAgICAgICMgd29ya3MuCisgICAgICAgIHdpdGggZ3ppcC5vcGVuKHNlbGYuZmlsZW5hbWUsICd3YicsIDkpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCdhJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgMjAwKToKKyAgICAgICAgICAgIHdpdGggZ3ppcC5vcGVuKHNlbGYuZmlsZW5hbWUsICJhYiIsIDkpIGFzIGY6ICMgYXBwZW5kCisgICAgICAgICAgICAgICAgZi53cml0ZSgnYScpCisKKyAgICAgICAgIyBUcnkgcmVhZGluZyB0aGUgZmlsZQorICAgICAgICB3aXRoIGd6aXAub3BlbihzZWxmLmZpbGVuYW1lLCAicmIiKSBhcyB6Z2ZpbGU6CisgICAgICAgICAgICBjb250ZW50cyA9ICIiCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHp0eHQgPSB6Z2ZpbGUucmVhZCg4MTkyKQorICAgICAgICAgICAgICAgIGNvbnRlbnRzICs9IHp0eHQKKyAgICAgICAgICAgICAgICBpZiBub3QgenR4dDogYnJlYWsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50cywgJ2EnKjIwMSkKKworICAgIGRlZiB0ZXN0X2J1ZmZlcmVkX3JlYWRlcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNzQ3MTogYSBHemlwRmlsZSBjYW4gYmUgd3JhcHBlZCBpbiBhIEJ1ZmZlcmVkUmVhZGVyIGZvcgorICAgICAgICAjIHBlcmZvcm1hbmNlLgorICAgICAgICBzZWxmLnRlc3Rfd3JpdGUoKQorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgd2l0aCBpby5CdWZmZXJlZFJlYWRlcihmKSBhcyByOgorICAgICAgICAgICAgICAgIGxpbmVzID0gW2xpbmUgZm9yIGxpbmUgaW4gcl0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCA1MCAqIGRhdGExLnNwbGl0bGluZXMoVHJ1ZSkpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X3dyaXRlKCkKKyAgICAgICAgIyBUcnkgLnJlYWRsaW5lKCkgd2l0aCB2YXJ5aW5nIGxpbmUgbGVuZ3RocworCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgbGluZV9sZW5ndGggPSAwCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIEwgPSBmLnJlYWRsaW5lKGxpbmVfbGVuZ3RoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBMIGFuZCBsaW5lX2xlbmd0aCAhPSAwOiBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oTCkgPD0gbGluZV9sZW5ndGgpCisgICAgICAgICAgICAgICAgbGluZV9sZW5ndGggPSAobGluZV9sZW5ndGggKyAxKSAlIDUwCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisgICAgICAgICMgVHJ5IC5yZWFkbGluZXMoKQorCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgTCA9IGYucmVhZGxpbmVzKCkKKworICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgTCA9IGYucmVhZGxpbmVzKDE1MCkKKyAgICAgICAgICAgICAgICBpZiBMID09IFtdOiBicmVhaworCisgICAgZGVmIHRlc3Rfc2Vla19yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3Rfd3JpdGUoKQorICAgICAgICAjIFRyeSBzZWVrLCByZWFkIHRlc3QKKworICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSkgYXMgZjoKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgb2xkcG9zID0gZi50ZWxsKCkKKyAgICAgICAgICAgICAgICBsaW5lMSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lMTogYnJlYWsKKyAgICAgICAgICAgICAgICBuZXdwb3MgPSBmLnRlbGwoKQorICAgICAgICAgICAgICAgIGYuc2VlayhvbGRwb3MpICAjIG5lZ2F0aXZlIHNlZWsKKyAgICAgICAgICAgICAgICBpZiBsZW4obGluZTEpPjEwOgorICAgICAgICAgICAgICAgICAgICBhbW91bnQgPSAxMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFtb3VudCA9IGxlbihsaW5lMSkKKyAgICAgICAgICAgICAgICBsaW5lMiA9IGYucmVhZChhbW91bnQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lMVs6YW1vdW50XSwgbGluZTIpCisgICAgICAgICAgICAgICAgZi5zZWVrKG5ld3BvcykgICMgcG9zaXRpdmUgc2VlaworCisgICAgZGVmIHRlc3Rfc2Vla193aGVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisgICAgICAgICMgVHJ5IHNlZWsod2hlbmNlPTEpLCByZWFkIHRlc3QKKworICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSkgYXMgZjoKKyAgICAgICAgICAgIGYucmVhZCgxMCkKKyAgICAgICAgICAgIGYuc2VlaygxMCwgd2hlbmNlPTEpCisgICAgICAgICAgICB5ID0gZi5yZWFkKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIGRhdGExWzIwOjMwXSkKKworICAgIGRlZiB0ZXN0X3NlZWtfd3JpdGUoc2VsZik6CisgICAgICAgICMgVHJ5IHNlZWssIHdyaXRlIHRlc3QKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGZvciBwb3MgaW4gcmFuZ2UoMCwgMjU2LCAxNik6CisgICAgICAgICAgICAgICAgZi5zZWVrKHBvcykKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdHWlxuJykKKworICAgIGRlZiB0ZXN0X21vZGUoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF93cml0ZSgpCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAncicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubXlmaWxlb2JqLm1vZGUsICdyYicpCisKKyAgICBkZWYgdGVzdF8xNjQ3NDg0KHNlbGYpOgorICAgICAgICBmb3IgbW9kZSBpbiAoJ3diJywgJ3JiJyk6CisgICAgICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgbW9kZSkgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihmLCAibmFtZSIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5uYW1lLCBzZWxmLmZpbGVuYW1lKQorCisgICAgZGVmIHRlc3RfbXRpbWUoc2VsZik6CisgICAgICAgIG10aW1lID0gMTIzNDU2Nzg5CisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAndycsIG10aW1lID0gbXRpbWUpIGFzIGZXcml0ZToKKyAgICAgICAgICAgIGZXcml0ZS53cml0ZShkYXRhMSkKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUpIGFzIGZSZWFkOgorICAgICAgICAgICAgZGF0YVJlYWQgPSBmUmVhZC5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YVJlYWQsIGRhdGExKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZlJlYWQsICdtdGltZScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmUmVhZC5tdGltZSwgbXRpbWUpCisKKyAgICBkZWYgdGVzdF9tZXRhZGF0YShzZWxmKToKKyAgICAgICAgbXRpbWUgPSAxMjM0NTY3ODkKKworICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgJ3cnLCBtdGltZSA9IG10aW1lKSBhcyBmV3JpdGU6CisgICAgICAgICAgICBmV3JpdGUud3JpdGUoZGF0YTEpCisKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZW5hbWUsICdyYicpIGFzIGZSZWFkOgorICAgICAgICAgICAgIyBzZWUgUkZDIDE5NTI6IGh0dHA6Ly93d3cuZmFxcy5vcmcvcmZjcy9yZmMxOTUyLmh0bWwKKworICAgICAgICAgICAgaWRCeXRlcyA9IGZSZWFkLnJlYWQoMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWRCeXRlcywgJ1x4MWZceDhiJykgIyBnemlwIElECisKKyAgICAgICAgICAgIGNtQnl0ZSA9IGZSZWFkLnJlYWQoMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21CeXRlLCAnXHgwOCcpICMgZGVmbGF0ZQorCisgICAgICAgICAgICBmbGFnc0J5dGUgPSBmUmVhZC5yZWFkKDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWdzQnl0ZSwgJ1x4MDgnKSAjIG9ubHkgdGhlIEZOQU1FIGZsYWcgaXMgc2V0CisKKyAgICAgICAgICAgIG10aW1lQnl0ZXMgPSBmUmVhZC5yZWFkKDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG10aW1lQnl0ZXMsIHN0cnVjdC5wYWNrKCc8aScsIG10aW1lKSkgIyBsaXR0bGUtZW5kaWFuCisKKyAgICAgICAgICAgIHhmbEJ5dGUgPSBmUmVhZC5yZWFkKDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhmbEJ5dGUsICdceDAyJykgIyBtYXhpbXVtIGNvbXByZXNzaW9uCisKKyAgICAgICAgICAgIG9zQnl0ZSA9IGZSZWFkLnJlYWQoMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3NCeXRlLCAnXHhmZicpICMgT1MgInVua25vd24iIChPUy1pbmRlcGVuZGVudCkKKworICAgICAgICAgICAgIyBTaW5jZSB0aGUgRk5BTUUgZmxhZyBpcyBzZXQsIHRoZSB6ZXJvLXRlcm1pbmF0ZWQgZmlsZW5hbWUgZm9sbG93cy4KKyAgICAgICAgICAgICMgUkZDIDE5NTIgc3BlY2lmaWVzIHRoYXQgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgZmlsZSwgaWYgYW55LgorICAgICAgICAgICAgIyBIb3dldmVyLCB0aGUgZ3ppcCBtb2R1bGUgZGVmYXVsdHMgdG8gc3RvcmluZyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0CisgICAgICAgICAgICAjIGZpbGUgaW4gdGhpcyBmaWVsZC4KKyAgICAgICAgICAgIGV4cGVjdGVkID0gc2VsZi5maWxlbmFtZS5lbmNvZGUoJ0xhdGluLTEnKSArICdceDAwJworICAgICAgICAgICAgbmFtZUJ5dGVzID0gZlJlYWQucmVhZChsZW4oZXhwZWN0ZWQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lQnl0ZXMsIGV4cGVjdGVkKQorCisgICAgICAgICAgICAjIFNpbmNlIG5vIG90aGVyIGZsYWdzIHdlcmUgc2V0LCB0aGUgaGVhZGVyIGVuZHMgaGVyZS4KKyAgICAgICAgICAgICMgUmF0aGVyIHRoYW4gcHJvY2VzcyB0aGUgY29tcHJlc3NlZCBkYXRhLCBsZXQncyBzZWVrIHRvIHRoZSB0cmFpbGVyLgorICAgICAgICAgICAgZlJlYWQuc2Vlayhvcy5zdGF0KHNlbGYuZmlsZW5hbWUpLnN0X3NpemUgLSA4KQorCisgICAgICAgICAgICBjcmMzMkJ5dGVzID0gZlJlYWQucmVhZCg0KSAjIENSQzMyIG9mIHVuY29tcHJlc3NlZCBkYXRhIFtkYXRhMV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3JjMzJCeXRlcywgJ1x4YWZceGQ3ZFx4ODMnKQorCisgICAgICAgICAgICBpc2l6ZUJ5dGVzID0gZlJlYWQucmVhZCg0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc2l6ZUJ5dGVzLCBzdHJ1Y3QucGFjaygnPGknLCBsZW4oZGF0YTEpKSkKKworICAgIGRlZiB0ZXN0X3dpdGhfb3BlbihzZWxmKToKKyAgICAgICAgIyBHemlwRmlsZSBzdXBwb3J0cyB0aGUgY29udGV4dCBtYW5hZ2VtZW50IHByb3RvY29sCisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShiInh4eCIpCisgICAgICAgIGYgPSBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsICJyYiIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIGY6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiX19lbnRlcl9fIG9uIGEgY2xvc2VkIGZpbGUgZGlkbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIjEgLy8gMCBkaWRuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIikKKworICAgIGRlZiB0ZXN0X3plcm9fcGFkZGVkX2ZpbGUoc2VsZik6CisgICAgICAgIHdpdGggZ3ppcC5HemlwRmlsZShzZWxmLmZpbGVuYW1lLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShkYXRhMSAqIDUwKQorCisgICAgICAgICMgUGFkIHRoZSBmaWxlIHdpdGggemVyb2VzCisgICAgICAgIHdpdGggb3BlbihzZWxmLmZpbGVuYW1lLCAiYWIiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiXHgwMCIgKiA1MCkKKworICAgICAgICB3aXRoIGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSwgInJiIikgYXMgZjoKKyAgICAgICAgICAgIGQgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCBkYXRhMSAqIDUwLCAiSW5jb3JyZWN0IGRhdGEgaW4gZmlsZSIpCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX2Zyb21fZmRvcGVuKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMzc4MTogQ3JlYXRpbmcgYSBHemlwRmlsZSB1c2luZyBhIGZpbGVvYmogZnJvbSBvcy5mZG9wZW4oKQorICAgICAgICAjIHNob3VsZCBub3QgZW1iZWQgdGhlIGZha2UgZmlsZW5hbWUgIjxmZG9wZW4+IiBpbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgICAgIGZkID0gb3Mub3BlbihzZWxmLmZpbGVuYW1lLCBvcy5PX1dST05MWSB8IG9zLk9fQ1JFQVQpCisgICAgICAgIHdpdGggb3MuZmRvcGVuKGZkLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKGZpbGVvYmo9ZiwgbW9kZT0idyIpIGFzIGc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm5hbWUsICIiKQorCisgICAgZGVmIHRlc3RfcmVhZF93aXRoX2V4dHJhKHNlbGYpOgorICAgICAgICAjIEd6aXAgZGF0YSB3aXRoIGFuIGV4dHJhIGZpZWxkCisgICAgICAgIGd6ZGF0YSA9IChiJ1x4MWZceDhiXHgwOFx4MDRceGIyXHgxN2NRXHgwMlx4ZmYnCisgICAgICAgICAgICAgICAgICBiJ1x4MDVceDAwRXh0cmEnCisgICAgICAgICAgICAgICAgICBiJ1x4MGJJLS5ceDAxXHgwMDJceGQxTXhceDA0XHgwMFx4MDBceDAwJykKKyAgICAgICAgd2l0aCBnemlwLkd6aXBGaWxlKGZpbGVvYmo9aW8uQnl0ZXNJTyhnemRhdGEpKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYidUZXN0JykKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEd6aXApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2d6aXAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3ppcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1NDE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2d6aXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2d6aXAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfZ3ppcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1NDE5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2d6aXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2gucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzdkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5CkBAIC0wLDAgKzEsMjQ4IEBACisjIHRlc3QgdGhlIGludmFyaWFudCB0aGF0CisjICAgaWZmIGE9PWIgdGhlbiBoYXNoKGEpPT1oYXNoKGIpCisjCisjIEFsc28gdGVzdCB0aGF0IGhhc2ggaW1wbGVtZW50YXRpb25zIGFyZSBpbmhlcml0ZWQgYXMgZXhwZWN0ZWQKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgc3RydWN0CitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN1YnByb2Nlc3MKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gY29sbGVjdGlvbnMgaW1wb3J0IEhhc2hhYmxlCisKK0lTXzY0QklUID0gKHN0cnVjdC5jYWxjc2l6ZSgnbCcpID09IDgpCisKKworY2xhc3MgSGFzaEVxdWFsaXR5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNhbWVfaGFzaChzZWxmLCAqb2JqbGlzdCk6CisgICAgICAgICMgSGFzaCBlYWNoIG9iamVjdCBnaXZlbiBhbmQgZmFpbCBpZgorICAgICAgICAjIHRoZSBoYXNoIHZhbHVlcyBhcmUgbm90IGFsbCB0aGUgc2FtZS4KKyAgICAgICAgaGFzaGVkID0gbWFwKGhhc2gsIG9iamxpc3QpCisgICAgICAgIGZvciBoIGluIGhhc2hlZFsxOl06CisgICAgICAgICAgICBpZiBoICE9IGhhc2hlZFswXToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImhhc2hlZCB2YWx1ZXMgZGlmZmVyOiAlciIgJSAob2JqbGlzdCwpKQorCisgICAgZGVmIHRlc3RfbnVtZXJpY19saXRlcmFscyhzZWxmKToKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goMSwgMUwsIDEuMCwgMS4wKzAuMGopCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKDAsIDBMLCAwLjAsIDAuMCswLjBqKQorICAgICAgICBzZWxmLnNhbWVfaGFzaCgtMSwgLTFMLCAtMS4wLCAtMS4wKzAuMGopCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKC0yLCAtMkwsIC0yLjAsIC0yLjArMC4waikKKworICAgIGRlZiB0ZXN0X2NvZXJjZWRfaW50ZWdlcnMoc2VsZik6CisgICAgICAgIHNlbGYuc2FtZV9oYXNoKGludCgxKSwgbG9uZygxKSwgZmxvYXQoMSksIGNvbXBsZXgoMSksCisgICAgICAgICAgICAgICAgICAgICAgIGludCgnMScpLCBmbG9hdCgnMS4wJykpCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKGludCgtMioqMzEpLCBsb25nKC0yKiozMSksIGZsb2F0KC0yKiozMSkpCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKGludCgxLTIqKjMxKSwgbG9uZygxLTIqKjMxKSwgZmxvYXQoMS0yKiozMSkpCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKGludCgyKiozMS0xKSwgbG9uZygyKiozMS0xKSwgZmxvYXQoMioqMzEtMSkpCisgICAgICAgICMgZm9yIDY0LWJpdCBwbGF0Zm9ybXMKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goaW50KDIqKjMxKSwgbG9uZygyKiozMSksIGZsb2F0KDIqKjMxKSkKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goaW50KC0yKio2MyksIGxvbmcoLTIqKjYzKSwgZmxvYXQoLTIqKjYzKSkKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goaW50KDEtMioqNjMpLCBsb25nKDEtMioqNjMpKQorICAgICAgICBzZWxmLnNhbWVfaGFzaChpbnQoMioqNjMtMSksIGxvbmcoMioqNjMtMSkpCisgICAgICAgIHNlbGYuc2FtZV9oYXNoKGxvbmcoMioqNjMpLCBmbG9hdCgyKio2MykpCisKKyAgICBkZWYgdGVzdF9jb2VyY2VkX2Zsb2F0cyhzZWxmKToKKyAgICAgICAgc2VsZi5zYW1lX2hhc2gobG9uZygxLjIzZTMwMCksIGZsb2F0KDEuMjNlMzAwKSkKKyAgICAgICAgc2VsZi5zYW1lX2hhc2goZmxvYXQoMC41KSwgY29tcGxleCgwLjUsIDAuMCkpCisKKworX2RlZmF1bHRfaGFzaCA9IG9iamVjdC5fX2hhc2hfXworY2xhc3MgRGVmYXVsdEhhc2gob2JqZWN0KTogcGFzcworCitfRklYRURfSEFTSF9WQUxVRSA9IDQyCitjbGFzcyBGaXhlZEhhc2gob2JqZWN0KToKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBfRklYRURfSEFTSF9WQUxVRQorCitjbGFzcyBPbmx5RXF1YWxpdHkob2JqZWN0KToKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYgaXMgb3RoZXIKKyAgICAjIFRyaWNrIHRvIHN1cHByZXNzIFB5M2sgd2FybmluZyBpbiAyLngKKyAgICBfX2hhc2hfXyA9IE5vbmUKK2RlbCBPbmx5RXF1YWxpdHkuX19oYXNoX18KKworY2xhc3MgT25seUluZXF1YWxpdHkob2JqZWN0KToKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYgaXMgbm90IG90aGVyCisKK2NsYXNzIE9ubHlDbXAob2JqZWN0KToKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBjbXAoaWQoc2VsZiksIGlkKG90aGVyKSkKKyAgICAjIFRyaWNrIHRvIHN1cHByZXNzIFB5M2sgd2FybmluZyBpbiAyLngKKyAgICBfX2hhc2hfXyA9IE5vbmUKK2RlbCBPbmx5Q21wLl9faGFzaF9fCisKK2NsYXNzIEluaGVyaXRlZEhhc2hXaXRoRXF1YWxpdHkoRml4ZWRIYXNoLCBPbmx5RXF1YWxpdHkpOiBwYXNzCitjbGFzcyBJbmhlcml0ZWRIYXNoV2l0aEluZXF1YWxpdHkoRml4ZWRIYXNoLCBPbmx5SW5lcXVhbGl0eSk6IHBhc3MKK2NsYXNzIEluaGVyaXRlZEhhc2hXaXRoQ21wKEZpeGVkSGFzaCwgT25seUNtcCk6IHBhc3MKKworY2xhc3MgTm9IYXNoKG9iamVjdCk6CisgICAgX19oYXNoX18gPSBOb25lCisKK2NsYXNzIEhhc2hJbmhlcml0YW5jZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWZhdWx0X2V4cGVjdGVkID0gW29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdEhhc2goKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9ubHlFcXVhbGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgT25seUluZXF1YWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9ubHlDbXAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgXQorICAgIGZpeGVkX2V4cGVjdGVkID0gW0ZpeGVkSGFzaCgpLAorICAgICAgICAgICAgICAgICAgICAgIEluaGVyaXRlZEhhc2hXaXRoRXF1YWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICBJbmhlcml0ZWRIYXNoV2l0aEluZXF1YWxpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICBJbmhlcml0ZWRIYXNoV2l0aENtcCgpLAorICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICBlcnJvcl9leHBlY3RlZCA9IFtOb0hhc2goKV0KKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfaGFzaChzZWxmKToKKyAgICAgICAgZm9yIG9iaiBpbiBzZWxmLmRlZmF1bHRfZXhwZWN0ZWQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gob2JqKSwgX2RlZmF1bHRfaGFzaChvYmopKQorCisgICAgZGVmIHRlc3RfZml4ZWRfaGFzaChzZWxmKToKKyAgICAgICAgZm9yIG9iaiBpbiBzZWxmLmZpeGVkX2V4cGVjdGVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKG9iaiksIF9GSVhFRF9IQVNIX1ZBTFVFKQorCisgICAgZGVmIHRlc3RfZXJyb3JfaGFzaChzZWxmKToKKyAgICAgICAgZm9yIG9iaiBpbiBzZWxmLmVycm9yX2V4cGVjdGVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBvYmopCisKKyAgICBkZWYgdGVzdF9oYXNoYWJsZShzZWxmKToKKyAgICAgICAgb2JqZWN0cyA9IChzZWxmLmRlZmF1bHRfZXhwZWN0ZWQgKworICAgICAgICAgICAgICAgICAgIHNlbGYuZml4ZWRfZXhwZWN0ZWQpCisgICAgICAgIGZvciBvYmogaW4gb2JqZWN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvYmosIEhhc2hhYmxlKQorCisgICAgZGVmIHRlc3Rfbm90X2hhc2hhYmxlKHNlbGYpOgorICAgICAgICBmb3Igb2JqIGluIHNlbGYuZXJyb3JfZXhwZWN0ZWQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2Uob2JqLCBIYXNoYWJsZSkKKworCisjIElzc3VlICM0NzAxOiBDaGVjayB0aGF0IHNvbWUgYnVpbHRpbiB0eXBlcyBhcmUgY29ycmVjdGx5IGhhc2hhYmxlCisjICAoVGhpcyB0ZXN0IG9ubHkgdXNlZCB0byBmYWlsIGluIFB5dGhvbiAzLjAsIGJ1dCBoYXMgYmVlbiBpbmNsdWRlZAorIyAgIGluIDIueCBhbG9uZyB3aXRoIHRoZSBsYXp5IGNhbGwgdG8gUHlUeXBlX1JlYWR5IGluIFB5T2JqZWN0X0hhc2gpCitjbGFzcyBEZWZhdWx0SXRlclNlcShvYmplY3QpOgorICAgIHNlcSA9IHJhbmdlKDEwKQorICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuc2VxKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLnNlcVtpbmRleF0KKworY2xhc3MgSGFzaEJ1aWx0aW5zVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGhhc2hlc190b19jaGVjayA9IFt4cmFuZ2UoMTApLAorICAgICAgICAgICAgICAgICAgICAgICBlbnVtZXJhdGUoeHJhbmdlKDEwKSksCisgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIoRGVmYXVsdEl0ZXJTZXEoKSksCisgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIobGFtYmRhOiAwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgdGVzdF9oYXNoZXMoc2VsZik6CisgICAgICAgIF9kZWZhdWx0X2hhc2ggPSBvYmplY3QuX19oYXNoX18KKyAgICAgICAgZm9yIG9iaiBpbiBzZWxmLmhhc2hlc190b19jaGVjazoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChvYmopLCBfZGVmYXVsdF9oYXNoKG9iaikpCisKK2NsYXNzIEhhc2hSYW5kb21pemF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBFYWNoIHN1YmNsYXNzIHNob3VsZCBkZWZpbmUgYSBmaWVsZCAicmVwcl8iLCBjb250YWluaW5nIHRoZSByZXByKCkgb2YKKyAgICAjIGFuIG9iamVjdCB0byBiZSB0ZXN0ZWQKKworICAgIGRlZiBnZXRfaGFzaF9jb21tYW5kKHNlbGYsIHJlcHJfKToKKyAgICAgICAgcmV0dXJuICdwcmludChoYXNoKCVzKSknICUgcmVwcl8KKworICAgIGRlZiBnZXRfaGFzaChzZWxmLCByZXByXywgc2VlZD1Ob25lKToKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgaWYgc2VlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGVudlsnUFlUSE9OSEFTSFNFRUQnXSA9IHN0cihzZWVkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW52LnBvcCgnUFlUSE9OSEFTSFNFRUQnLCBOb25lKQorICAgICAgICBjbWRfbGluZSA9IFtzeXMuZXhlY3V0YWJsZSwgJy1jJywgc2VsZi5nZXRfaGFzaF9jb21tYW5kKHJlcHJfKV0KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kX2xpbmUsIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9ZW52KQorICAgICAgICBvdXQsIGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBvdXQgPSB0ZXN0X3N1cHBvcnQuc3RyaXBfcHl0aG9uX3N0ZGVycihvdXQpCisgICAgICAgIHJldHVybiBpbnQob3V0LnN0cmlwKCkpCisKKyAgICBkZWYgdGVzdF9yYW5kb21pemVkX2hhc2goc2VsZik6CisgICAgICAgICMgdHdvIHJ1bnMgc2hvdWxkIHJldHVybiBkaWZmZXJlbnQgaGFzaGVzCisgICAgICAgIHJ1bjEgPSBzZWxmLmdldF9oYXNoKHNlbGYucmVwcl8sIHNlZWQ9J3JhbmRvbScpCisgICAgICAgIHJ1bjIgPSBzZWxmLmdldF9oYXNoKHNlbGYucmVwcl8sIHNlZWQ9J3JhbmRvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocnVuMSwgcnVuMikKKworY2xhc3MgU3RyaW5nbGlrZUhhc2hSYW5kb21pemF0aW9uVGVzdHMoSGFzaFJhbmRvbWl6YXRpb25UZXN0cyk6CisgICAgZGVmIHRlc3RfbnVsbF9oYXNoKHNlbGYpOgorICAgICAgICAjIFBZVEhPTkhBU0hTRUVEPTAgZGlzYWJsZXMgdGhlIHJhbmRvbWl6ZWQgaGFzaAorICAgICAgICBpZiBJU182NEJJVDoKKyAgICAgICAgICAgIGtub3duX2hhc2hfb2Zfb2JqID0gMTQ1MzA3OTcyOTE4ODA5ODIxMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAga25vd25faGFzaF9vZl9vYmogPSAtMTYwMDkyNTUzMworCisgICAgICAgICMgUmFuZG9taXphdGlvbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0OgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXyksIGtub3duX2hhc2hfb2Zfb2JqKQorCisgICAgICAgICMgSXQgY2FuIGFsc28gYmUgZGlzYWJsZWQgYnkgc2V0dGluZyB0aGUgc2VlZCB0byAwOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXywgc2VlZD0wKSwga25vd25faGFzaF9vZl9vYmopCisKKyAgICBkZWYgdGVzdF9maXhlZF9oYXNoKHNlbGYpOgorICAgICAgICAjIHRlc3QgYSBmaXhlZCBzZWVkIGZvciB0aGUgcmFuZG9taXplZCBoYXNoCisgICAgICAgICMgTm90ZSB0aGF0IGFsbCB0eXBlcyBzaGFyZSB0aGUgc2FtZSB2YWx1ZXM6CisgICAgICAgIGlmIElTXzY0QklUOgorICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgICAgICBoID0gLTQ0MTA5MTE1MDIzMDM4Nzg1MDkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaCA9IC0zNTcwMTUwOTY5NDc5OTk0MTMwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICdsaXR0bGUnOgorICAgICAgICAgICAgICAgIGggPSAtMjA2MDc2Nzk5CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGggPSAtMTAyNDAxNDQ1NworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2V0X2hhc2goc2VsZi5yZXByXywgc2VlZD00MiksIGgpCisKK2NsYXNzIFN0ckhhc2hSYW5kb21pemF0aW9uVGVzdHMoU3RyaW5nbGlrZUhhc2hSYW5kb21pemF0aW9uVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcignYWJjJykKKworICAgIGRlZiB0ZXN0X2VtcHR5X3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKCIiKSwgMCkKKworY2xhc3MgVW5pY29kZUhhc2hSYW5kb21pemF0aW9uVGVzdHMoU3RyaW5nbGlrZUhhc2hSYW5kb21pemF0aW9uVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcih1J2FiYycpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh1IiIpLCAwKQorCitjbGFzcyBCdWZmZXJIYXNoUmFuZG9taXphdGlvblRlc3RzKFN0cmluZ2xpa2VIYXNoUmFuZG9taXphdGlvblRlc3RzKToKKyAgICByZXByXyA9ICdidWZmZXIoImFiYyIpJworCisgICAgZGVmIHRlc3RfZW1wdHlfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYnVmZmVyKCIiKSksIDApCisKK2NsYXNzIERhdGV0aW1lVGVzdHMoSGFzaFJhbmRvbWl6YXRpb25UZXN0cyk6CisgICAgZGVmIGdldF9oYXNoX2NvbW1hbmQoc2VsZiwgcmVwcl8pOgorICAgICAgICByZXR1cm4gJ2ltcG9ydCBkYXRldGltZTsgcHJpbnQoaGFzaCglcykpJyAlIHJlcHJfCisKK2NsYXNzIERhdGV0aW1lRGF0ZVRlc3RzKERhdGV0aW1lVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcihkYXRldGltZS5kYXRlKDEwNjYsIDEwLCAxNCkpCisKK2NsYXNzIERhdGV0aW1lRGF0ZXRpbWVUZXN0cyhEYXRldGltZVRlc3RzKToKKyAgICByZXByXyA9IHJlcHIoZGF0ZXRpbWUuZGF0ZXRpbWUoMSwgMiwgMywgNCwgNSwgNiwgNykpCisKK2NsYXNzIERhdGV0aW1lVGltZVRlc3RzKERhdGV0aW1lVGVzdHMpOgorICAgIHJlcHJfID0gcmVwcihkYXRldGltZS50aW1lKDApKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhhc2hFcXVhbGl0eVRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzaEluaGVyaXRhbmNlVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNoQnVpbHRpbnNUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ckhhc2hSYW5kb21pemF0aW9uVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlSGFzaFJhbmRvbWl6YXRpb25UZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckhhc2hSYW5kb21pemF0aW9uVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRldGltZURhdGVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGV0aW1lRGF0ZXRpbWVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGV0aW1lVGltZVRlc3RzKQorCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRiNGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9oYXNoLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRiNGVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2hsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzNjVjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2hsaWIucHkKQEAgLTAsMCArMSwzOTkgQEAKKyMgVGVzdCBoYXNobGliIG1vZHVsZQorIworIyAkSWQkCisjCisjICBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCAgIEdyZWdvcnkgUC4gU21pdGggKGdyZWdAa3J5cHRvLm9yZykKKyMgIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKyMKKworaW1wb3J0IGFycmF5CitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHN5cwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IF80RywgcHJlY2lzaW9uYmlnbWVtdGVzdAorCisjIFdlcmUgd2UgY29tcGlsZWQgLS13aXRoLXB5ZGVidWcgb3Igd2l0aCAjZGVmaW5lIFB5X0RFQlVHPworQ09NUElMRURfV0lUSF9QWURFQlVHID0gaGFzYXR0cihzeXMsICdnZXR0b3RhbHJlZmNvdW50JykKKworCitkZWYgaGV4c3RyKHMpOgorICAgIGltcG9ydCBzdHJpbmcKKyAgICBoID0gc3RyaW5nLmhleGRpZ2l0cworICAgIHIgPSAnJworICAgIGZvciBjIGluIHM6CisgICAgICAgIGkgPSBvcmQoYykKKyAgICAgICAgciA9IHIgKyBoWyhpID4+IDQpICYgMHhGXSArIGhbaSAmIDB4Rl0KKyAgICByZXR1cm4gcgorCisKK2NsYXNzIEhhc2hMaWJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc3VwcG9ydGVkX2hhc2hfbmFtZXMgPSAoICdtZDUnLCAnTUQ1JywgJ3NoYTEnLCAnU0hBMScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaGEyMjQnLCAnU0hBMjI0JywgJ3NoYTI1NicsICdTSEEyNTYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhMzg0JywgJ1NIQTM4NCcsICdzaGE1MTInLCAnU0hBNTEyJyApCisKKyAgICBfd2Fybl9vbl9leHRlbnNpb25faW1wb3J0ID0gQ09NUElMRURfV0lUSF9QWURFQlVHCisKKyAgICBkZWYgX2NvbmRpdGlvbmFsX2ltcG9ydF9tb2R1bGUoc2VsZiwgbW9kdWxlX25hbWUpOgorICAgICAgICAiIiJJbXBvcnQgYSBtb2R1bGUgYW5kIHJldHVybiBhIHJlZmVyZW5jZSB0byBpdCBvciBOb25lIG9uIGZhaWx1cmUuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMoJ2ltcG9ydCAnK21vZHVsZV9uYW1lKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGVycm9yOgorICAgICAgICAgICAgaWYgc2VsZi5fd2Fybl9vbl9leHRlbnNpb25faW1wb3J0OgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oJ0RpZCBhIEMgZXh0ZW5zaW9uIGZhaWwgdG8gY29tcGlsZT8gJXMnICUgZXJyb3IpCisgICAgICAgIHJldHVybiBsb2NhbHMoKS5nZXQobW9kdWxlX25hbWUpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgYWxnb3JpdGhtcyA9IHNldCgpCisgICAgICAgIGZvciBhbGdvcml0aG0gaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lczoKKyAgICAgICAgICAgIGFsZ29yaXRobXMuYWRkKGFsZ29yaXRobS5sb3dlcigpKQorICAgICAgICBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0ID0ge30KKyAgICAgICAgZm9yIGFsZ29yaXRobSBpbiBhbGdvcml0aG1zOgorICAgICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFthbGdvcml0aG1dID0gc2V0KCkKKworICAgICAgICAjIEZvciBlYWNoIGFsZ29yaXRobSwgdGVzdCB0aGUgZGlyZWN0IGNvbnN0cnVjdG9yIGFuZCB0aGUgdXNlCisgICAgICAgICMgb2YgaGFzaGxpYi5uZXcgZ2l2ZW4gdGhlIGFsZ29yaXRobSBuYW1lLgorICAgICAgICBmb3IgYWxnb3JpdGhtLCBjb25zdHJ1Y3RvcnMgaW4gc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdC5pdGVtcygpOgorICAgICAgICAgICAgY29uc3RydWN0b3JzLmFkZChnZXRhdHRyKGhhc2hsaWIsIGFsZ29yaXRobSkpCisgICAgICAgICAgICBkZWYgX3Rlc3RfYWxnb3JpdGhtX3ZpYV9oYXNobGliX25ldyhkYXRhPU5vbmUsIF9hbGc9YWxnb3JpdGhtKToKKyAgICAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNobGliLm5ldyhfYWxnKQorICAgICAgICAgICAgICAgIHJldHVybiBoYXNobGliLm5ldyhfYWxnLCBkYXRhKQorICAgICAgICAgICAgY29uc3RydWN0b3JzLmFkZChfdGVzdF9hbGdvcml0aG1fdmlhX2hhc2hsaWJfbmV3KQorCisgICAgICAgIF9oYXNobGliID0gc2VsZi5fY29uZGl0aW9uYWxfaW1wb3J0X21vZHVsZSgnX2hhc2hsaWInKQorICAgICAgICBpZiBfaGFzaGxpYjoKKyAgICAgICAgICAgICMgVGhlc2UgdHdvIGFsZ29yaXRobXMgc2hvdWxkIGFsd2F5cyBiZSBwcmVzZW50IHdoZW4gdGhpcyBtb2R1bGUKKyAgICAgICAgICAgICMgaXMgY29tcGlsZWQuICBJZiBub3QsIHNvbWV0aGluZyB3YXMgY29tcGlsZWQgd3JvbmcuCisgICAgICAgICAgICBhc3NlcnQgaGFzYXR0cihfaGFzaGxpYiwgJ29wZW5zc2xfbWQ1JykKKyAgICAgICAgICAgIGFzc2VydCBoYXNhdHRyKF9oYXNobGliLCAnb3BlbnNzbF9zaGExJykKKyAgICAgICAgICAgIGZvciBhbGdvcml0aG0sIGNvbnN0cnVjdG9ycyBpbiBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgY29uc3RydWN0b3IgPSBnZXRhdHRyKF9oYXNobGliLCAnb3BlbnNzbF8nK2FsZ29yaXRobSwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBjb25zdHJ1Y3RvcjoKKyAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3JzLmFkZChjb25zdHJ1Y3RvcikKKworICAgICAgICBfbWQ1ID0gc2VsZi5fY29uZGl0aW9uYWxfaW1wb3J0X21vZHVsZSgnX21kNScpCisgICAgICAgIGlmIF9tZDU6CisgICAgICAgICAgICBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0WydtZDUnXS5hZGQoX21kNS5uZXcpCisgICAgICAgIF9zaGEgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfc2hhJykKKyAgICAgICAgaWYgX3NoYToKKyAgICAgICAgICAgIHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3RbJ3NoYTEnXS5hZGQoX3NoYS5uZXcpCisgICAgICAgIF9zaGEyNTYgPSBzZWxmLl9jb25kaXRpb25hbF9pbXBvcnRfbW9kdWxlKCdfc2hhMjU2JykKKyAgICAgICAgaWYgX3NoYTI1NjoKKyAgICAgICAgICAgIHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3RbJ3NoYTIyNCddLmFkZChfc2hhMjU2LnNoYTIyNCkKKyAgICAgICAgICAgIHNlbGYuY29uc3RydWN0b3JzX3RvX3Rlc3RbJ3NoYTI1NiddLmFkZChfc2hhMjU2LnNoYTI1NikKKyAgICAgICAgX3NoYTUxMiA9IHNlbGYuX2NvbmRpdGlvbmFsX2ltcG9ydF9tb2R1bGUoJ19zaGE1MTInKQorICAgICAgICBpZiBfc2hhNTEyOgorICAgICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFsnc2hhMzg0J10uYWRkKF9zaGE1MTIuc2hhMzg0KQorICAgICAgICAgICAgc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFsnc2hhNTEyJ10uYWRkKF9zaGE1MTIuc2hhNTEyKQorCisgICAgICAgIHN1cGVyKEhhc2hMaWJUZXN0Q2FzZSwgc2VsZikuX19pbml0X18oKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfaGFzaF9hcnJheShzZWxmKToKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KCJiIiwgcmFuZ2UoMTApKQorICAgICAgICBjb25zdHJ1Y3RvcnMgPSBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0Lml0ZXJ2YWx1ZXMoKQorICAgICAgICBmb3IgY29ucyBpbiBpdGVydG9vbHMuY2hhaW4uZnJvbV9pdGVyYWJsZShjb25zdHJ1Y3RvcnMpOgorICAgICAgICAgICAgYyA9IGNvbnMoYSkKKyAgICAgICAgICAgIGMuaGV4ZGlnZXN0KCkKKworICAgIGRlZiB0ZXN0X2FsZ29yaXRobXNfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2hsaWIuYWxnb3JpdGhtcywKKyAgICAgICAgICAgIHR1cGxlKFtfYWxnbyBmb3IgX2FsZ28gaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lcyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FsZ28uaXNsb3dlcigpXSkpCisKKyAgICBkZWYgdGVzdF91bmtub3duX2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGhhc2hsaWIubmV3LCAnc3BhbSBzcGFtIHNwYW0gc3BhbSBzcGFtJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNobGliLm5ldywgMSkKKworICAgIGRlZiB0ZXN0X2dldF9idWlsdGluX2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBnZXRfYnVpbHRpbl9jb25zdHJ1Y3RvciA9IGhhc2hsaWIuX19kaWN0X19bCisgICAgICAgICAgICAgICAgJ19fZ2V0X2J1aWx0aW5fY29uc3RydWN0b3InXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRfYnVpbHRpbl9jb25zdHJ1Y3RvciwgJ3Rlc3QnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgX21kNQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgVGhpcyBmb3JjZXMgYW4gSW1wb3J0RXJyb3IgZm9yICJpbXBvcnQgX21kNSIgc3RhdGVtZW50cworICAgICAgICBzeXMubW9kdWxlc1snX21kNSddID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBnZXRfYnVpbHRpbl9jb25zdHJ1Y3RvciwgJ21kNScpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiAnX21kNScgaW4gbG9jYWxzKCk6CisgICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbJ19tZDUnXSA9IF9tZDUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydfbWQ1J10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRfYnVpbHRpbl9jb25zdHJ1Y3RvciwgMykKKworICAgIGRlZiB0ZXN0X2hleGRpZ2VzdChzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lczoKKyAgICAgICAgICAgIGggPSBoYXNobGliLm5ldyhuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhleHN0cihoLmRpZ2VzdCgpKSA9PSBoLmhleGRpZ2VzdCgpKQorCisgICAgZGVmIHRlc3RfbGFyZ2VfdXBkYXRlKHNlbGYpOgorICAgICAgICBhYXMgPSAnYScgKiAxMjgKKyAgICAgICAgYmVlcyA9ICdiJyAqIDEyNworICAgICAgICBjZWVzID0gJ2MnICogMTI2CisgICAgICAgIGFiY3MgPSBhYXMgKyBiZWVzICsgY2VlcworCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuc3VwcG9ydGVkX2hhc2hfbmFtZXM6CisgICAgICAgICAgICBtMSA9IGhhc2hsaWIubmV3KG5hbWUpCisgICAgICAgICAgICBtMS51cGRhdGUoYWFzKQorICAgICAgICAgICAgbTEudXBkYXRlKGJlZXMpCisgICAgICAgICAgICBtMS51cGRhdGUoY2VlcykKKworICAgICAgICAgICAgbTIgPSBoYXNobGliLm5ldyhuYW1lKQorICAgICAgICAgICAgbTIudXBkYXRlKGFiY3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xLmRpZ2VzdCgpLCBtMi5kaWdlc3QoKSwgbmFtZSsnIHVwZGF0ZSBwcm9ibGVtLicpCisKKyAgICAgICAgICAgIG0zID0gaGFzaGxpYi5uZXcobmFtZSwgYWJjcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEuZGlnZXN0KCksIG0zLmRpZ2VzdCgpLCBuYW1lKycgbmV3IHByb2JsZW0uJykKKworICAgIGRlZiBjaGVjayhzZWxmLCBuYW1lLCBkYXRhLCBkaWdlc3QpOgorICAgICAgICBjb25zdHJ1Y3RvcnMgPSBzZWxmLmNvbnN0cnVjdG9yc190b190ZXN0W25hbWVdCisgICAgICAgICMgMiBpcyBmb3IgaGFzaGxpYi5uYW1lKC4uLikgYW5kIGhhc2hsaWIubmV3KG5hbWUsIC4uLikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobGVuKGNvbnN0cnVjdG9ycyksIDIpCisgICAgICAgIGZvciBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciBpbiBjb25zdHJ1Y3RvcnM6CisgICAgICAgICAgICBjb21wdXRlZCA9IGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yKGRhdGEpLmhleGRpZ2VzdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICBjb21wdXRlZCwgZGlnZXN0LAorICAgICAgICAgICAgICAgICAgICAiSGFzaCBhbGdvcml0aG0gJXMgY29uc3RydWN0ZWQgdXNpbmcgJXMgcmV0dXJuZWQgaGV4ZGlnZXN0IgorICAgICAgICAgICAgICAgICAgICAiICVyIGZvciAlZCBieXRlIGlucHV0IGRhdGEgdGhhdCBzaG91bGQgaGF2ZSBoYXNoZWQgdG8gJXIuIgorICAgICAgICAgICAgICAgICAgICAlIChuYW1lLCBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQsIGxlbihkYXRhKSwgZGlnZXN0KSkKKworICAgIGRlZiBjaGVja191cGRhdGUoc2VsZiwgbmFtZSwgZGF0YSwgZGlnZXN0KToKKyAgICAgICAgY29uc3RydWN0b3JzID0gc2VsZi5jb25zdHJ1Y3RvcnNfdG9fdGVzdFtuYW1lXQorICAgICAgICAjIDIgaXMgZm9yIGhhc2hsaWIubmFtZSguLi4pIGFuZCBoYXNobGliLm5ldyhuYW1lLCAuLi4pCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGxlbihjb25zdHJ1Y3RvcnMpLCAyKQorICAgICAgICBmb3IgaGFzaF9vYmplY3RfY29uc3RydWN0b3IgaW4gY29uc3RydWN0b3JzOgorICAgICAgICAgICAgaCA9IGhhc2hfb2JqZWN0X2NvbnN0cnVjdG9yKCkKKyAgICAgICAgICAgIGgudXBkYXRlKGRhdGEpCisgICAgICAgICAgICBjb21wdXRlZCA9IGguaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkLCBkaWdlc3QsCisgICAgICAgICAgICAgICAgICAgICJIYXNoIGFsZ29yaXRobSAlcyB1c2luZyAlcyB3aGVuIHVwZGF0ZWQgcmV0dXJuZWQgaGV4ZGlnZXN0IgorICAgICAgICAgICAgICAgICAgICAiICVyIGZvciAlZCBieXRlIGlucHV0IGRhdGEgdGhhdCBzaG91bGQgaGF2ZSBoYXNoZWQgdG8gJXIuIgorICAgICAgICAgICAgICAgICAgICAlIChuYW1lLCBoYXNoX29iamVjdF9jb25zdHJ1Y3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWQsIGxlbihkYXRhKSwgZGlnZXN0KSkKKworICAgIGRlZiBjaGVja191bmljb2RlKHNlbGYsIGFsZ29yaXRobV9uYW1lKToKKyAgICAgICAgIyBVbmljb2RlIG9iamVjdHMgYXJlIG5vdCBhbGxvd2VkIGFzIGlucHV0LgorICAgICAgICBleHBlY3RlZCA9IGhhc2hsaWIubmV3KGFsZ29yaXRobV9uYW1lLCBzdHIodSdzcGFtJykpLmhleGRpZ2VzdCgpCisgICAgICAgIHNlbGYuY2hlY2soYWxnb3JpdGhtX25hbWUsIHUnc3BhbScsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgIyBJbiBweXRob24gMi54IHVuaWNvZGUgaXMgYXV0by1lbmNvZGVkIHRvIHRoZSBzeXN0ZW0gZGVmYXVsdCBlbmNvZGluZworICAgICAgICAjIHdoZW4gcGFzc2VkIHRvIGhhc2hsaWIgZnVuY3Rpb25zLgorICAgICAgICBzZWxmLmNoZWNrX3VuaWNvZGUoJ21kNScpCisgICAgICAgIHNlbGYuY2hlY2tfdW5pY29kZSgnc2hhMScpCisgICAgICAgIHNlbGYuY2hlY2tfdW5pY29kZSgnc2hhMjI0JykKKyAgICAgICAgc2VsZi5jaGVja191bmljb2RlKCdzaGEyNTYnKQorICAgICAgICBzZWxmLmNoZWNrX3VuaWNvZGUoJ3NoYTM4NCcpCisgICAgICAgIHNlbGYuY2hlY2tfdW5pY29kZSgnc2hhNTEyJykKKworICAgIGRlZiB0ZXN0X2Nhc2VfbWQ1XzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICcnLCAnZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UnKQorCisgICAgZGVmIHRlc3RfY2FzZV9tZDVfMShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnbWQ1JywgJ2FiYycsICc5MDAxNTA5ODNjZDI0ZmIwZDY5NjNmN2QyOGUxN2Y3MicpCisKKyAgICBkZWYgdGVzdF9jYXNlX21kNV8yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdtZDUnLCAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknLAorICAgICAgICAgICAgICAgICAgICdkMTc0YWI5OGQyNzdkOWY1YTU2MTFjMmM5ZjQxOWQ5ZicpCisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV80RyArIDUsIG1lbXVzZT0xKQorICAgIGRlZiB0ZXN0X2Nhc2VfbWQ1X2h1Z2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIGlmIHNpemUgPT0gXzRHICsgNToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrKCdtZDUnLCAnQScqc2l6ZSwgJ2M5YWYyZGZmMzc0NjhjZTVkZmVlOGYyY2ZjMGE5YzZkJykKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MgIyAzMi1iaXQgYXJjaAorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fNEcgKyA1LCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9jYXNlX21kNV9odWdlX3VwZGF0ZShzZWxmLCBzaXplKToKKyAgICAgICAgaWYgc2l6ZSA9PSBfNEcgKyA1OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdXBkYXRlKCdtZDUnLCAnQScqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICdjOWFmMmRmZjM3NDY4Y2U1ZGZlZThmMmNmYzBhOWM2ZCcpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzICMgMzItYml0IGFyY2gKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHIC0gMSwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfY2FzZV9tZDVfdWludG1heChzZWxmLCBzaXplKToKKyAgICAgICAgaWYgc2l6ZSA9PSBfNEcgLSAxOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soJ21kNScsICdBJypzaXplLCAnMjgxMzhkMzA2ZmYxYjgyODFmMWE5MDY3ZTFhMWEyYjMnKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcyAjIDMyLWJpdCBhcmNoCisKKyAgICAjIHVzZSB0aGUgdGhyZWUgZXhhbXBsZXMgZnJvbSBGZWRlcmFsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgU3RhbmRhcmRzCisgICAgIyBQdWJsaWNhdGlvbiAxODAtMSwgU2VjdXJlIEhhc2ggU3RhbmRhcmQsICAxOTk1IEFwcmlsIDE3CisgICAgIyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTcvcHVicy9maXAxODAtMS5odG0KKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMV8wKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGExJywgIiIsCisgICAgICAgICAgICAgICAgICAgImRhMzlhM2VlNWU2YjRiMGQzMjU1YmZlZjk1NjAxODkwYWZkODA3MDkiKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGExXzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTEnLCAiYWJjIiwKKyAgICAgICAgICAgICAgICAgICAiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTFfMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMScsICJhYmNkYmNkZWNkZWZkZWZnZWZnaGZnaGlnaGlqaGlqa2lqa2xqa2xta2xtbmxtbm9tbm9wbm9wcSIsCisgICAgICAgICAgICAgICAgICAgIjg0OTgzZTQ0MWMzYmQyNmViYWFlNGFhMWY5NTEyOWU1ZTU0NjcwZjEiKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGExXzMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTEnLCAiYSIgKiAxMDAwMDAwLAorICAgICAgICAgICAgICAgICAgICIzNGFhOTczY2Q0YzRkYWE0ZjYxZWViMmJkYmFkMjczMTY1MzQwMTZmIikKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHICsgNSwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfY2FzZV9zaGExX2h1Z2Uoc2VsZiwgc2l6ZSk6CisgICAgICAgIGlmIHNpemUgPT0gXzRHICsgNToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrKCdzaGExJywgJ0EnKnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAnODdkNzQ1YzUwZTZiMjg3OWZmYTBmYjJjOTMwZTlmYmZlMGRjOWE1YicpCisgICAgICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzICMgMzItYml0IGFyY2gKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzRHICsgNSwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfY2FzZV9zaGExX2h1Z2VfdXBkYXRlKHNlbGYsIHNpemUpOgorICAgICAgICBpZiBzaXplID09IF80RyArIDU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja191cGRhdGUoJ3NoYTEnLCAnQScqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICc4N2Q3NDVjNTBlNmIyODc5ZmZhMGZiMmM5MzBlOWZiZmUwZGM5YTViJykKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MgIyAzMi1iaXQgYXJjaAorCisgICAgIyB1c2UgdGhlIGV4YW1wbGVzIGZyb20gRmVkZXJhbCBJbmZvcm1hdGlvbiBQcm9jZXNzaW5nIFN0YW5kYXJkcworICAgICMgUHVibGljYXRpb24gMTgwLTIsIFNlY3VyZSBIYXNoIFN0YW5kYXJkLCAgMjAwMiBBdWd1c3QgMQorICAgICMgaHR0cDovL2NzcmMubmlzdC5nb3YvcHVibGljYXRpb25zL2ZpcHMvZmlwczE4MC0yL2ZpcHMxODAtMi5wZGYKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMjI0XzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTIyNCcsICIiLAorICAgICAgICAgICJkMTRhMDI4YzJhM2EyYmM5NDc2MTAyYmIyODgyMzRjNDE1YTJiMDFmODI4ZWE2MmFjNWIzZTQyZiIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTIyNF8xKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGEyMjQnLCAiYWJjIiwKKyAgICAgICAgICAiMjMwOTdkMjIzNDA1ZDgyMjg2NDJhNDc3YmRhMjU1YjMyYWFkYmNlNGJkYTBiM2Y3ZTM2YzlkYTciKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGEyMjRfMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMjI0JywKKyAgICAgICAgICAiYWJjZGJjZGVjZGVmZGVmZ2VmZ2hmZ2hpZ2hpamhpamtpamtsamtsbWtsbW5sbW5vbW5vcG5vcHEiLAorICAgICAgICAgICI3NTM4OGIxNjUxMjc3NmNjNWRiYTVkYTFmZDg5MDE1MGIwYzY0NTVjYjRmNThiMTk1MjUyMjUyNSIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTIyNF8zKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGEyMjQnLCAiYSIgKiAxMDAwMDAwLAorICAgICAgICAgICIyMDc5NDY1NTk4MGM5MWQ4YmJiNGMxZWE5NzYxOGE0YmYwM2Y0MjU4MTk0OGIyZWU0ZWU3YWQ2NyIpCisKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMjU2XzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTI1NicsICIiLAorICAgICAgICAgICJlM2IwYzQ0Mjk4ZmMxYzE0OWFmYmY0Yzg5OTZmYjkyNDI3YWU0MWU0NjQ5YjkzNGNhNDk1OTkxYjc4NTJiODU1IikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMjU2XzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTI1NicsICJhYmMiLAorICAgICAgICAgICJiYTc4MTZiZjhmMDFjZmVhNDE0MTQwZGU1ZGFlMjIyM2IwMDM2MWEzOTYxNzdhOWNiNDEwZmY2MWYyMDAxNWFkIikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMjU2XzIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTI1NicsCisgICAgICAgICAgImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKyAgICAgICAgICAiMjQ4ZDZhNjFkMjA2MzhiOGU1YzAyNjkzMGMzZTYwMzlhMzNjZTQ1OTY0ZmYyMTY3ZjZlY2VkZDQxOWRiMDZjMSIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTI1Nl8zKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGEyNTYnLCAiYSIgKiAxMDAwMDAwLAorICAgICAgICAgICJjZGM3NmU1Yzk5MTRmYjkyODFhMWM3ZTI4NGQ3M2U2N2YxODA5YTQ4YTQ5NzIwMGUwNDZkMzljY2M3MTEyY2QwIikKKworCisgICAgZGVmIHRlc3RfY2FzZV9zaGEzODRfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMzg0JywgIiIsCisgICAgICAgICAgIjM4YjA2MGE3NTFhYzk2Mzg0Y2Q5MzI3ZWIxYjFlMzZhMjFmZGI3MTExNGJlMDc0MzRjMGNjN2JmNjNmNmUxZGEiKworICAgICAgICAgICIyNzRlZGViZmU3NmY2NWZiZDUxYWQyZjE0ODk4Yjk1YiIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTM4NF8xKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGEzODQnLCAiYWJjIiwKKyAgICAgICAgICAiY2IwMDc1M2Y0NWEzNWU4YmI1YTAzZDY5OWFjNjUwMDcyNzJjMzJhYjBlZGVkMTYzMWE4YjYwNWE0M2ZmNWJlZCIrCisgICAgICAgICAgIjgwODYwNzJiYTFlN2NjMjM1OGJhZWNhMTM0YzgyNWE3IikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhMzg0XzIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTM4NCcsCisgICAgICAgICAgICAgICAgICAgImFiY2RlZmdoYmNkZWZnaGljZGVmZ2hpamRlZmdoaWprZWZnaGlqa2xmZ2hpamtsbWdoaWprbG1uIisKKyAgICAgICAgICAgICAgICAgICAiaGlqa2xtbm9pamtsbW5vcGprbG1ub3Bxa2xtbm9wcXJsbW5vcHFyc21ub3BxcnN0bm9wcXJzdHUiLAorICAgICAgICAgICIwOTMzMGMzM2Y3MTE0N2U4M2QxOTJmYzc4MmNkMWI0NzUzMTExYjE3M2IzYjA1ZDIyZmEwODA4NmUzYjBmNzEyIisKKyAgICAgICAgICAiZmNjN2M3MWE1NTdlMmRiOTY2YzNlOWZhOTE3NDYwMzkiKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGEzODRfMyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhMzg0JywgImEiICogMTAwMDAwMCwKKyAgICAgICAgICAiOWQwZTE4MDk3MTY0NzRjYjA4NmU4MzRlMzEwYTRhMWNlZDE0OWU5YzAwZjI0ODUyNzk3MmNlYzU3MDRjMmE1YiIrCisgICAgICAgICAgIjA3YjhiM2RjMzhlY2M0ZWJhZTk3ZGRkODdmM2Q4OTg1IikKKworCisgICAgZGVmIHRlc3RfY2FzZV9zaGE1MTJfMChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhNTEyJywgIiIsCisgICAgICAgICAgImNmODNlMTM1N2VlZmI4YmRmMTU0Mjg1MGQ2NmQ4MDA3ZDYyMGU0MDUwYjU3MTVkYzgzZjRhOTIxZDM2Y2U5Y2UiKworICAgICAgICAgICI0N2QwZDEzYzVkODVmMmIwZmY4MzE4ZDI4NzdlZWMyZjYzYjkzMWJkNDc0MTdhODFhNTM4MzI3YWY5MjdkYTNlIikKKworICAgIGRlZiB0ZXN0X2Nhc2Vfc2hhNTEyXzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soJ3NoYTUxMicsICJhYmMiLAorICAgICAgICAgICJkZGFmMzVhMTkzNjE3YWJhY2M0MTczNDlhZTIwNDEzMTEyZTZmYTRlODlhOTdlYTIwYTllZWVlNjRiNTVkMzlhIisKKyAgICAgICAgICAiMjE5Mjk5MmEyNzRmYzFhODM2YmEzYzIzYTNmZWViYmQ0NTRkNDQyMzY0M2NlODBlMmE5YWM5NGZhNTRjYTQ5ZiIpCisKKyAgICBkZWYgdGVzdF9jYXNlX3NoYTUxMl8yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKCdzaGE1MTInLAorICAgICAgICAgICAgICAgICAgICJhYmNkZWZnaGJjZGVmZ2hpY2RlZmdoaWpkZWZnaGlqa2VmZ2hpamtsZmdoaWprbG1naGlqa2xtbiIrCisgICAgICAgICAgICAgICAgICAgImhpamtsbW5vaWprbG1ub3Bqa2xtbm9wcWtsbW5vcHFybG1ub3BxcnNtbm9wcXJzdG5vcHFyc3R1IiwKKyAgICAgICAgICAiOGU5NTliNzVkYWUzMTNkYThjZjRmNzI4MTRmYzE0M2Y4Zjc3NzljNmViOWY3ZmExNzI5OWFlYWRiNjg4OTAxOCIrCisgICAgICAgICAgIjUwMWQyODllNDkwMGY3ZTQzMzFiOTlkZWM0YjU0MzNhYzdkMzI5ZWViNmRkMjY1NDVlOTZlNTViODc0YmU5MDkiKQorCisgICAgZGVmIHRlc3RfY2FzZV9zaGE1MTJfMyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygnc2hhNTEyJywgImEiICogMTAwMDAwMCwKKyAgICAgICAgICAiZTcxODQ4M2QwY2U3Njk2NDRlMmU0MmM3YmMxNWI0NjM4ZTFmOThiMTNiMjA0NDI4NTYzMmE4MDNhZmE5NzNlYiIrCisgICAgICAgICAgImRlMGZmMjQ0ODc3ZWE2MGE0Y2IwNDMyY2U1NzdjMzFiZWIwMDljNWMyYzQ5YWEyZTRlYWRiMjE3YWQ4Y2MwOWIiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBAdGVzdF9zdXBwb3J0LnJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X3RocmVhZGVkX2hhc2hpbmcoc2VsZik6CisgICAgICAgICMgVXBkYXRpbmcgdGhlIHNhbWUgaGFzaCBvYmplY3QgZnJvbSBzZXZlcmFsIHRocmVhZHMgYXQgb25jZQorICAgICAgICAjIHVzaW5nIGRhdGEgY2h1bmsgc2l6ZXMgY29udGFpbmluZyB0aGUgc2FtZSBieXRlIHNlcXVlbmNlcy4KKyAgICAgICAgIworICAgICAgICAjIElmIHRoZSBpbnRlcm5hbCBsb2NrcyBhcmUgd29ya2luZyB0byBwcmV2ZW50IG11bHRpcGxlCisgICAgICAgICMgdXBkYXRlcyBvbiB0aGUgc2FtZSBvYmplY3QgZnJvbSBydW5uaW5nIGF0IG9uY2UsIHRoZSByZXN1bHRpbmcKKyAgICAgICAgIyBoYXNoIHdpbGwgYmUgdGhlIHNhbWUgYXMgZG9pbmcgaXQgc2luZ2xlIHRocmVhZGVkIHVwZnJvbnQuCisgICAgICAgIGhhc2hlciA9IGhhc2hsaWIuc2hhMSgpCisgICAgICAgIG51bV90aHJlYWRzID0gNQorICAgICAgICBzbWFsbGVzdF9kYXRhID0gJ3N3aW5lZmx1JworICAgICAgICBkYXRhID0gc21hbGxlc3RfZGF0YSoyMDAwMDAKKyAgICAgICAgZXhwZWN0ZWRfaGFzaCA9IGhhc2hsaWIuc2hhMShkYXRhKm51bV90aHJlYWRzKS5oZXhkaWdlc3QoKQorCisgICAgICAgIGRlZiBoYXNoX2luX2NodW5rcyhjaHVua19zaXplLCBldmVudCk6CisgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgICAgIHdoaWxlIGluZGV4IDwgbGVuKGRhdGEpOgorICAgICAgICAgICAgICAgIGhhc2hlci51cGRhdGUoZGF0YVtpbmRleDppbmRleCtjaHVua19zaXplXSkKKyAgICAgICAgICAgICAgICBpbmRleCArPSBjaHVua19zaXplCisgICAgICAgICAgICBldmVudC5zZXQoKQorCisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIGZvciB0aHJlYWRudW0gaW4geHJhbmdlKG51bV90aHJlYWRzKToKKyAgICAgICAgICAgIGNodW5rX3NpemUgPSBsZW4oZGF0YSkgLy8gKDEwKip0aHJlYWRudW0pCisgICAgICAgICAgICBhc3NlcnQgY2h1bmtfc2l6ZSA+IDAKKyAgICAgICAgICAgIGFzc2VydCBjaHVua19zaXplICUgbGVuKHNtYWxsZXN0X2RhdGEpID09IDAKKyAgICAgICAgICAgIGV2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoZXZlbnQpCisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1oYXNoX2luX2NodW5rcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0oY2h1bmtfc2l6ZSwgZXZlbnQpKS5zdGFydCgpCisKKyAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKKyAgICAgICAgICAgIGV2ZW50LndhaXQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfaGFzaCwgaGFzaGVyLmhleGRpZ2VzdCgpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChIYXNoTGliVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2hsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU2ZmMyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2hsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2hsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGFzaGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE4ZmRlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hhc2hsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hlYXBxLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiODhmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hlYXBxLnB5CkBAIC0wLDAgKzEsNDE5IEBACisiIiJVbml0dGVzdHMgZm9yIGhlYXBxLiIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgcmFuZG9tCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZSwgc2tpcFVubGVzcworCitweV9oZWFwcSA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfZnJlc2hfbW9kdWxlKCdoZWFwcScsIGJsb2NrZWQ9WydfaGVhcHEnXSkKK2NfaGVhcHEgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X2ZyZXNoX21vZHVsZSgnaGVhcHEnLCBmcmVzaD1bJ19oZWFwcSddKQorCisjIF9oZWFwcS5ubGFyZ2VzdC9uc21hbGxlc3QgYXJlIHNhdmVkIGluIGhlYXBxLl9ubGFyZ2VzdC9fc21hbGxlc3Qgd2hlbgorIyBfaGVhcHEgaXMgaW1wb3J0ZWQsIHNvIGNoZWNrIHRoZW0gdGhlcmUKK2Z1bmNfbmFtZXMgPSBbJ2hlYXBpZnknLCAnaGVhcHBvcCcsICdoZWFwcHVzaCcsICdoZWFwcHVzaHBvcCcsCisgICAgICAgICAgICAgICdoZWFwcmVwbGFjZScsICdfbmxhcmdlc3QnLCAnX25zbWFsbGVzdCddCisKK2NsYXNzIFRlc3RNb2R1bGVzKFRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9weV9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGZvciBmbmFtZSBpbiBmdW5jX25hbWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKHB5X2hlYXBxLCBmbmFtZSkuX19tb2R1bGVfXywgJ2hlYXBxJykKKworICAgIEBza2lwVW5sZXNzKGNfaGVhcHEsICdyZXF1aXJlcyBfaGVhcHEnKQorICAgIGRlZiB0ZXN0X2NfZnVuY3Rpb25zKHNlbGYpOgorICAgICAgICBmb3IgZm5hbWUgaW4gZnVuY19uYW1lczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihjX2hlYXBxLCBmbmFtZSkuX19tb2R1bGVfXywgJ19oZWFwcScpCisKKworY2xhc3MgVGVzdEhlYXAoVGVzdENhc2UpOgorICAgIG1vZHVsZSA9IE5vbmUKKworICAgIGRlZiB0ZXN0X3B1c2hfcG9wKHNlbGYpOgorICAgICAgICAjIDEpIFB1c2ggMjU2IHJhbmRvbSBudW1iZXJzIGFuZCBwb3AgdGhlbSBvZmYsIHZlcmlmeWluZyBhbGwncyBPSy4KKyAgICAgICAgaGVhcCA9IFtdCisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBzZWxmLmNoZWNrX2ludmFyaWFudChoZWFwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgaXRlbSA9IHJhbmRvbS5yYW5kb20oKQorICAgICAgICAgICAgZGF0YS5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmhlYXBwdXNoKGhlYXAsIGl0ZW0pCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ludmFyaWFudChoZWFwKQorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgd2hpbGUgaGVhcDoKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLm1vZHVsZS5oZWFwcG9wKGhlYXApCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ludmFyaWFudChoZWFwKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoaXRlbSkKKyAgICAgICAgZGF0YV9zb3J0ZWQgPSBkYXRhWzpdCisgICAgICAgIGRhdGFfc29ydGVkLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGFfc29ydGVkLCByZXN1bHRzKQorICAgICAgICAjIDIpIENoZWNrIHRoYXQgdGhlIGludmFyaWFudCBob2xkcyBmb3IgYSBzb3J0ZWQgYXJyYXkKKyAgICAgICAgc2VsZi5jaGVja19pbnZhcmlhbnQocmVzdWx0cykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubW9kdWxlLmhlYXBwdXNoLCBbXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLm1vZHVsZS5oZWFwcHVzaCwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUuaGVhcHBvcCwgTm9uZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNoZWNrX2ludmFyaWFudChzZWxmLCBoZWFwKToKKyAgICAgICAgIyBDaGVjayB0aGUgaGVhcCBpbnZhcmlhbnQuCisgICAgICAgIGZvciBwb3MsIGl0ZW0gaW4gZW51bWVyYXRlKGhlYXApOgorICAgICAgICAgICAgaWYgcG9zOiAjIHBvcyAwIGhhcyBubyBwYXJlbnQKKyAgICAgICAgICAgICAgICBwYXJlbnRwb3MgPSAocG9zLTEpID4+IDEKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGVhcFtwYXJlbnRwb3NdIDw9IGl0ZW0pCisKKyAgICBkZWYgdGVzdF9oZWFwaWZ5KHNlbGYpOgorICAgICAgICBmb3Igc2l6ZSBpbiByYW5nZSgzMCk6CisgICAgICAgICAgICBoZWFwID0gW3JhbmRvbS5yYW5kb20oKSBmb3IgZHVtbXkgaW4gcmFuZ2Uoc2l6ZSldCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5oZWFwaWZ5KGhlYXApCisgICAgICAgICAgICBzZWxmLmNoZWNrX2ludmFyaWFudChoZWFwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUuaGVhcGlmeSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X25haXZlX25iZXN0KHNlbGYpOgorICAgICAgICBkYXRhID0gW3JhbmRvbS5yYW5kcmFuZ2UoMjAwMCkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldCisgICAgICAgIGhlYXAgPSBbXQorICAgICAgICBmb3IgaXRlbSBpbiBkYXRhOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHB1c2goaGVhcCwgaXRlbSkKKyAgICAgICAgICAgIGlmIGxlbihoZWFwKSA+IDEwOgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLmhlYXBwb3AoaGVhcCkKKyAgICAgICAgaGVhcC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFwLCBzb3J0ZWQoZGF0YSlbLTEwOl0pCisKKyAgICBkZWYgaGVhcGl0ZXIoc2VsZiwgaGVhcCk6CisgICAgICAgICMgQW4gaXRlcmF0b3IgcmV0dXJuaW5nIGEgaGVhcCdzIGVsZW1lbnRzLCBzbWFsbGVzdC1maXJzdC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLm1vZHVsZS5oZWFwcG9wKGhlYXApCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbmJlc3Qoc2VsZik6CisgICAgICAgICMgTGVzcy1uYWl2ZSAiTi1iZXN0IiBhbGdvcml0aG0sIG11Y2ggZmFzdGVyIChpZiBsZW4oZGF0YSkgaXMgYmlnCisgICAgICAgICMgZW5vdWdoIDx3aW5rPikgdGhhbiBzb3J0aW5nIGFsbCBvZiBkYXRhLiAgSG93ZXZlciwgaWYgd2UgaGFkIGEgbWF4CisgICAgICAgICMgaGVhcCBpbnN0ZWFkIG9mIGEgbWluIGhlYXAsIGl0IGNvdWxkIGdvIGZhc3RlciBzdGlsbCB2aWEKKyAgICAgICAgIyBoZWFwaWZ5J2luZyBhbGwgb2YgZGF0YSAobGluZWFyIHRpbWUpLCB0aGVuIGRvaW5nIDEwIGhlYXBwb3BzCisgICAgICAgICMgKDEwIGxvZy10aW1lIHN0ZXBzKS4KKyAgICAgICAgZGF0YSA9IFtyYW5kb20ucmFuZHJhbmdlKDIwMDApIGZvciBpIGluIHJhbmdlKDEwMDApXQorICAgICAgICBoZWFwID0gZGF0YVs6MTBdCisgICAgICAgIHNlbGYubW9kdWxlLmhlYXBpZnkoaGVhcCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gZGF0YVsxMDpdOgorICAgICAgICAgICAgaWYgaXRlbSA+IGhlYXBbMF06ICAjIHRoaXMgZ2V0cyByYXJlciB0aGUgbG9uZ2VyIHdlIHJ1bgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLmhlYXByZXBsYWNlKGhlYXAsIGl0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLmhlYXBpdGVyKGhlYXApKSwgc29ydGVkKGRhdGEpWy0xMDpdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUuaGVhcHJlcGxhY2UsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUuaGVhcHJlcGxhY2UsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNlbGYubW9kdWxlLmhlYXByZXBsYWNlLCBbXSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X25iZXN0X3dpdGhfcHVzaHBvcChzZWxmKToKKyAgICAgICAgZGF0YSA9IFtyYW5kb20ucmFuZHJhbmdlKDIwMDApIGZvciBpIGluIHJhbmdlKDEwMDApXQorICAgICAgICBoZWFwID0gZGF0YVs6MTBdCisgICAgICAgIHNlbGYubW9kdWxlLmhlYXBpZnkoaGVhcCkKKyAgICAgICAgZm9yIGl0ZW0gaW4gZGF0YVsxMDpdOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHB1c2hwb3AoaGVhcCwgaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHNlbGYuaGVhcGl0ZXIoaGVhcCkpLCBzb3J0ZWQoZGF0YSlbLTEwOl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tb2R1bGUuaGVhcHB1c2hwb3AoW10sICd4JyksICd4JykKKworICAgIGRlZiB0ZXN0X2hlYXBwdXNocG9wKHNlbGYpOgorICAgICAgICBoID0gW10KKyAgICAgICAgeCA9IHNlbGYubW9kdWxlLmhlYXBwdXNocG9wKGgsIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoLCB4KSwgKFtdLCAxMCkpCisKKyAgICAgICAgaCA9IFsxMF0KKyAgICAgICAgeCA9IHNlbGYubW9kdWxlLmhlYXBwdXNocG9wKGgsIDEwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGgsIHgpLCAoWzEwXSwgMTAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShoWzBdKSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeCksIGZsb2F0KQorCisgICAgICAgIGggPSBbMTBdOworICAgICAgICB4ID0gc2VsZi5tb2R1bGUuaGVhcHB1c2hwb3AoaCwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaCwgeCksIChbMTBdLCA5KSkKKworICAgICAgICBoID0gWzEwXTsKKyAgICAgICAgeCA9IHNlbGYubW9kdWxlLmhlYXBwdXNocG9wKGgsIDExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoLCB4KSwgKFsxMV0sIDEwKSkKKworICAgIGRlZiB0ZXN0X2hlYXBzb3J0KHNlbGYpOgorICAgICAgICAjIEV4ZXJjaXNlIGV2ZXJ5dGhpbmcgd2l0aCByZXBlYXRlZCBoZWFwc29ydCBjaGVja3MKKyAgICAgICAgZm9yIHRyaWFsIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgc2l6ZSA9IHJhbmRvbS5yYW5kcmFuZ2UoNTApCisgICAgICAgICAgICBkYXRhID0gW3JhbmRvbS5yYW5kcmFuZ2UoMjUpIGZvciBpIGluIHJhbmdlKHNpemUpXQorICAgICAgICAgICAgaWYgdHJpYWwgJiAxOiAgICAgIyBIYWxmIG9mIHRoZSB0aW1lLCB1c2UgaGVhcGlmeQorICAgICAgICAgICAgICAgIGhlYXAgPSBkYXRhWzpdCisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcGlmeShoZWFwKQorICAgICAgICAgICAgZWxzZTogICAgICAgICAgICAgIyBUaGUgcmVzdCBvZiB0aGUgdGltZSwgdXNlIGhlYXBwdXNoCisgICAgICAgICAgICAgICAgaGVhcCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gZGF0YToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHB1c2goaGVhcCwgaXRlbSkKKyAgICAgICAgICAgIGhlYXBfc29ydGVkID0gW3NlbGYubW9kdWxlLmhlYXBwb3AoaGVhcCkgZm9yIGkgaW4gcmFuZ2Uoc2l6ZSldCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhlYXBfc29ydGVkLCBzb3J0ZWQoZGF0YSkpCisKKyAgICBkZWYgdGVzdF9tZXJnZShzZWxmKToKKyAgICAgICAgaW5wdXRzID0gW10KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHJhbmRvbS5yYW5kcmFuZ2UoNSkpOgorICAgICAgICAgICAgcm93ID0gc29ydGVkKHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkgZm9yIGogaW4gcmFuZ2UocmFuZG9tLnJhbmRyYW5nZSgxMCkpKQorICAgICAgICAgICAgaW5wdXRzLmFwcGVuZChyb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGNoYWluKCppbnB1dHMpKSwgbGlzdChzZWxmLm1vZHVsZS5tZXJnZSgqaW5wdXRzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzZWxmLm1vZHVsZS5tZXJnZSgpKSwgW10pCisKKyAgICBkZWYgdGVzdF9tZXJnZV9zdGFiaWxpdHkoc2VsZik6CisgICAgICAgIGNsYXNzIEludChpbnQpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBpbnB1dHMgPSBbW10sIFtdLCBbXSwgW11dCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIwMDAwKToKKyAgICAgICAgICAgIHN0cmVhbSA9IHJhbmRvbS5yYW5kcmFuZ2UoNCkKKyAgICAgICAgICAgIHggPSByYW5kb20ucmFuZHJhbmdlKDUwMCkKKyAgICAgICAgICAgIG9iaiA9IEludCh4KQorICAgICAgICAgICAgb2JqLnBhaXIgPSAoeCwgc3RyZWFtKQorICAgICAgICAgICAgaW5wdXRzW3N0cmVhbV0uYXBwZW5kKG9iaikKKyAgICAgICAgZm9yIHN0cmVhbSBpbiBpbnB1dHM6CisgICAgICAgICAgICBzdHJlYW0uc29ydCgpCisgICAgICAgIHJlc3VsdCA9IFtpLnBhaXIgZm9yIGkgaW4gc2VsZi5tb2R1bGUubWVyZ2UoKmlucHV0cyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzb3J0ZWQocmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X25zbWFsbGVzdChzZWxmKToKKyAgICAgICAgZGF0YSA9IFsocmFuZG9tLnJhbmRyYW5nZSgyMDAwKSwgaSkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldCisgICAgICAgIGZvciBmIGluIChOb25lLCBsYW1iZGEgeDogIHhbMF0gKiA1NDcgJSAyMDAwKToKKyAgICAgICAgICAgIGZvciBuIGluICgwLCAxLCAyLCAxMCwgMTAwLCA0MDAsIDk5OSwgMTAwMCwgMTEwMCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5uc21hbGxlc3QobiwgZGF0YSksIHNvcnRlZChkYXRhKVs6bl0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5uc21hbGxlc3QobiwgZGF0YSwga2V5PWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKGRhdGEsIGtleT1mKVs6bl0pCisKKyAgICBkZWYgdGVzdF9ubGFyZ2VzdChzZWxmKToKKyAgICAgICAgZGF0YSA9IFsocmFuZG9tLnJhbmRyYW5nZSgyMDAwKSwgaSkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldCisgICAgICAgIGZvciBmIGluIChOb25lLCBsYW1iZGEgeDogIHhbMF0gKiA1NDcgJSAyMDAwKToKKyAgICAgICAgICAgIGZvciBuIGluICgwLCAxLCAyLCAxMCwgMTAwLCA0MDAsIDk5OSwgMTAwMCwgMTEwMCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1vZHVsZS5ubGFyZ2VzdChuLCBkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChkYXRhLCByZXZlcnNlPVRydWUpWzpuXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubW9kdWxlLm5sYXJnZXN0KG4sIGRhdGEsIGtleT1mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZChkYXRhLCBrZXk9ZiwgcmV2ZXJzZT1UcnVlKVs6bl0pCisKKyAgICBkZWYgdGVzdF9jb21wYXJpc29uX29wZXJhdG9yKHNlbGYpOgorICAgICAgICAjIElzc3VlIDMwNTE6IE1ha2Ugc3VyZSBoZWFwcSB3b3JrcyB3aXRoIGJvdGggX19sdF9fIGFuZCBfX2xlX18KKyAgICAgICAgZGVmIGhzb3J0KGRhdGEsIGNvbXApOgorICAgICAgICAgICAgZGF0YSA9IG1hcChjb21wLCBkYXRhKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcGlmeShkYXRhKQorICAgICAgICAgICAgcmV0dXJuIFtzZWxmLm1vZHVsZS5oZWFwcG9wKGRhdGEpLnggZm9yIGkgaW4gcmFuZ2UobGVuKGRhdGEpKV0KKyAgICAgICAgY2xhc3MgTFQ6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueCA+IG90aGVyLngKKyAgICAgICAgY2xhc3MgTEU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueCA+PSBvdGhlci54CisgICAgICAgIGRhdGEgPSBbcmFuZG9tLnJhbmRvbSgpIGZvciBpIGluIHJhbmdlKDEwMCldCisgICAgICAgIHRhcmdldCA9IHNvcnRlZChkYXRhLCByZXZlcnNlPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHNvcnQoZGF0YSwgTFQpLCB0YXJnZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHNvcnQoZGF0YSwgTEUpLCB0YXJnZXQpCisKKworY2xhc3MgVGVzdEhlYXBQeXRob24oVGVzdEhlYXApOgorICAgIG1vZHVsZSA9IHB5X2hlYXBxCisKKworQHNraXBVbmxlc3MoY19oZWFwcSwgJ3JlcXVpcmVzIF9oZWFwcScpCitjbGFzcyBUZXN0SGVhcEMoVGVzdEhlYXApOgorICAgIG1vZHVsZSA9IGNfaGVhcHEKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIExlbk9ubHk6CisgICAgIkR1bW15IHNlcXVlbmNlIGNsYXNzIGRlZmluaW5nIF9fbGVuX18gYnV0IG5vdCBfX2dldGl0ZW1fXy4iCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiAxMAorCitjbGFzcyBHZXRPbmx5OgorICAgICJEdW1teSBzZXF1ZW5jZSBjbGFzcyBkZWZpbmluZyBfX2dldGl0ZW1fXyBidXQgbm90IF9fbGVuX18uIgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuZHgpOgorICAgICAgICByZXR1cm4gMTAKKworY2xhc3MgQ21wRXJyOgorICAgICJEdW1teSBlbGVtZW50IHRoYXQgYWx3YXlzIHJhaXNlcyBhbiBlcnJvciBkdXJpbmcgY29tcGFyaXNvbiIKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJhaXNlIFplcm9EaXZpc2lvbkVycm9yCisKK2RlZiBSKHNlcW4pOgorICAgICdSZWd1bGFyIGdlbmVyYXRvcicKKyAgICBmb3IgaSBpbiBzZXFuOgorICAgICAgICB5aWVsZCBpCisKK2NsYXNzIEc6CisgICAgJ1NlcXVlbmNlIHVzaW5nIF9fZ2V0aXRlbV9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VxbltpXQorCitjbGFzcyBJOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pID49IGxlbihzZWxmLnNlcW4pOiByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHYgPSBzZWxmLnNlcW5bc2VsZi5pXQorICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICByZXR1cm4gdgorCitjbGFzcyBJZzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgaXRlcmF0b3IgcHJvdG9jb2wgZGVmaW5lZCB3aXRoIGEgZ2VuZXJhdG9yJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgdmFsIGluIHNlbGYuc2VxbjoKKyAgICAgICAgICAgIHlpZWxkIHZhbAorCitjbGFzcyBYOgorICAgICdNaXNzaW5nIF9fZ2V0aXRlbV9fIGFuZCBfX2l0ZXJfXycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmkgPj0gbGVuKHNlbGYuc2Vxbik6IHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgdiA9IHNlbGYuc2VxbltzZWxmLmldCisgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgIHJldHVybiB2CisKK2NsYXNzIE46CisgICAgJ0l0ZXJhdG9yIG1pc3NpbmcgbmV4dCgpJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBFOgorICAgICdUZXN0IHByb3BhZ2F0aW9uIG9mIGV4Y2VwdGlvbnMnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIDMgLy8gMAorCitjbGFzcyBTOgorICAgICdUZXN0IGltbWVkaWF0ZSBzdG9wJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgcGFzcworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4sIGltYXAKK2RlZiBMKHNlcW4pOgorICAgICdUZXN0IG11bHRpcGxlIHRpZXJzIG9mIGl0ZXJhdG9ycycKKyAgICByZXR1cm4gY2hhaW4oaW1hcChsYW1iZGEgeDp4LCBSKElnKEcoc2VxbikpKSkpCisKK2NsYXNzIFNpZGVFZmZlY3RMVDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUsIGhlYXApOgorICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgc2VsZi5oZWFwID0gaGVhcAorCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHNlbGYuaGVhcFs6XSA9IFtdCisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlIDwgb3RoZXIudmFsdWUKKworCitjbGFzcyBUZXN0RXJyb3JIYW5kbGluZyhUZXN0Q2FzZSk6CisgICAgbW9kdWxlID0gTm9uZQorCisgICAgZGVmIHRlc3Rfbm9uX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuaGVhcGlmeSwgc2VsZi5tb2R1bGUuaGVhcHBvcCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGYsIDEwKQorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuaGVhcHB1c2gsIHNlbGYubW9kdWxlLmhlYXByZXBsYWNlLAorICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUubmxhcmdlc3QsIHNlbGYubW9kdWxlLm5zbWFsbGVzdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGYsIDEwLCAxMCkKKworICAgIGRlZiB0ZXN0X2xlbl9vbmx5KHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuaGVhcGlmeSwgc2VsZi5tb2R1bGUuaGVhcHBvcCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGYsIExlbk9ubHkoKSkKKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLmhlYXBwdXNoLCBzZWxmLm1vZHVsZS5oZWFwcmVwbGFjZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGYsIExlbk9ubHkoKSwgMTApCisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5ubGFyZ2VzdCwgc2VsZi5tb2R1bGUubnNtYWxsZXN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgMiwgTGVuT25seSgpKQorCisgICAgZGVmIHRlc3RfZ2V0X29ubHkoc2VsZik6CisgICAgICAgIHNlcSA9IFtDbXBFcnIoKSwgQ21wRXJyKCksIENtcEVycigpXQorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuaGVhcGlmeSwgc2VsZi5tb2R1bGUuaGVhcHBvcCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZiwgc2VxKQorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUuaGVhcHB1c2gsIHNlbGYubW9kdWxlLmhlYXByZXBsYWNlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmLCBzZXEsIDEwKQorICAgICAgICBmb3IgZiBpbiAoc2VsZi5tb2R1bGUubmxhcmdlc3QsIHNlbGYubW9kdWxlLm5zbWFsbGVzdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgZiwgMiwgc2VxKQorCisgICAgZGVmIHRlc3RfYXJnX3BhcnNpbmcoc2VsZik6CisgICAgICAgIGZvciBmIGluIChzZWxmLm1vZHVsZS5oZWFwaWZ5LCBzZWxmLm1vZHVsZS5oZWFwcG9wLAorICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHB1c2gsIHNlbGYubW9kdWxlLmhlYXByZXBsYWNlLAorICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUubmxhcmdlc3QsIHNlbGYubW9kdWxlLm5zbWFsbGVzdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIGYsIDEwKQorCisgICAgZGVmIHRlc3RfaXRlcmFibGVfYXJncyhzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKHNlbGYubW9kdWxlLm5sYXJnZXN0LCBzZWxmLm1vZHVsZS5uc21hbGxlc3QpOgorICAgICAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIEwsIFIpOgorICAgICAgICAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiY29tcGFyaW5nIHVuZXF1YWwgdHlwZXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZyksIHF1aWV0PVRydWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDIsIGcocykpLCBmKDIscykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDIsIFMocykpLCBbXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIDIsIFgocykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCAyLCBOKHMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmLCAyLCBFKHMpKQorCisgICAgIyBJc3N1ZSAjMTcyNzg6IHRoZSBoZWFwIG1heSBjaGFuZ2Ugc2l6ZSB3aGlsZSBpdCdzIGJlaW5nIHdhbGtlZC4KKworICAgIGRlZiB0ZXN0X2hlYXBwdXNoX211dGF0aW5nX2hlYXAoc2VsZik6CisgICAgICAgIGhlYXAgPSBbXQorICAgICAgICBoZWFwLmV4dGVuZChTaWRlRWZmZWN0TFQoaSwgaGVhcCkgZm9yIGkgaW4gcmFuZ2UoMjAwKSkKKyAgICAgICAgIyBQeXRob24gdmVyc2lvbiByYWlzZXMgSW5kZXhFcnJvciwgQyB2ZXJzaW9uIFJ1bnRpbWVFcnJvcgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKChJbmRleEVycm9yLCBSdW50aW1lRXJyb3IpKToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmhlYXBwdXNoKGhlYXAsIFNpZGVFZmZlY3RMVCg1LCBoZWFwKSkKKworICAgIGRlZiB0ZXN0X2hlYXBwb3BfbXV0YXRpbmdfaGVhcChzZWxmKToKKyAgICAgICAgaGVhcCA9IFtdCisgICAgICAgIGhlYXAuZXh0ZW5kKFNpZGVFZmZlY3RMVChpLCBoZWFwKSBmb3IgaSBpbiByYW5nZSgyMDApKQorICAgICAgICAjIFB5dGhvbiB2ZXJzaW9uIHJhaXNlcyBJbmRleEVycm9yLCBDIHZlcnNpb24gUnVudGltZUVycm9yCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKEluZGV4RXJyb3IsIFJ1bnRpbWVFcnJvcikpOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuaGVhcHBvcChoZWFwKQorCisKK2NsYXNzIFRlc3RFcnJvckhhbmRsaW5nUHl0aG9uKFRlc3RFcnJvckhhbmRsaW5nKToKKyAgICBtb2R1bGUgPSBweV9oZWFwcQorCisKK0Bza2lwVW5sZXNzKGNfaGVhcHEsICdyZXF1aXJlcyBfaGVhcHEnKQorY2xhc3MgVGVzdEVycm9ySGFuZGxpbmdDKFRlc3RFcnJvckhhbmRsaW5nKToKKyAgICBtb2R1bGUgPSBjX2hlYXBxCisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X2NsYXNzZXMgPSBbVGVzdE1vZHVsZXMsIFRlc3RIZWFwUHl0aG9uLCBUZXN0SGVhcEMsCisgICAgICAgICAgICAgICAgICAgIFRlc3RFcnJvckhhbmRsaW5nUHl0aG9uLCBUZXN0RXJyb3JIYW5kbGluZ0NdCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQgY291bnRzCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hlYXBxLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hlYXBxLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTIyN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hlYXBxLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2hlYXBxLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTIyN2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaGVhcHEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9obWFjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMTQ4ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9obWFjLnB5CkBAIC0wLDAgKzEsMzE0IEBACitpbXBvcnQgaG1hYworaW1wb3J0IGhhc2hsaWIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBUZXN0VmVjdG9yc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X21kNV92ZWN0b3JzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIEhNQUMgbW9kdWxlIGFnYWluc3QgdGVzdCB2ZWN0b3JzIGZyb20gdGhlIFJGQy4KKworICAgICAgICBkZWYgbWQ1dGVzdChrZXksIGRhdGEsIGRpZ2VzdCk6CisgICAgICAgICAgICBoID0gaG1hYy5ITUFDKGtleSwgZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5oZXhkaWdlc3QoKS51cHBlcigpLCBkaWdlc3QudXBwZXIoKSkKKworICAgICAgICBtZDV0ZXN0KGNocigweDBiKSAqIDE2LAorICAgICAgICAgICAgICAgICJIaSBUaGVyZSIsCisgICAgICAgICAgICAgICAgIjkyOTQ3MjdBMzYzOEJCMUMxM0Y0OEVGODE1OEJGQzlEIikKKworICAgICAgICBtZDV0ZXN0KCJKZWZlIiwKKyAgICAgICAgICAgICAgICAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCisgICAgICAgICAgICAgICAgIjc1MGM3ODNlNmFiMGI1MDNlYWE4NmUzMTBhNWRiNzM4IikKKworICAgICAgICBtZDV0ZXN0KGNocigweEFBKSoxNiwKKyAgICAgICAgICAgICAgICBjaHIoMHhERCkqNTAsCisgICAgICAgICAgICAgICAgIjU2YmUzNDUyMWQxNDRjODhkYmI4YzczM2YwZThiM2Y2IikKKworICAgICAgICBtZDV0ZXN0KCIiLmpvaW4oW2NocihpKSBmb3IgaSBpbiByYW5nZSgxLCAyNildKSwKKyAgICAgICAgICAgICAgICBjaHIoMHhDRCkgKiA1MCwKKyAgICAgICAgICAgICAgICAiNjk3ZWFmMGFjYTNhM2FlYTNhNzUxNjQ3NDZmZmFhNzkiKQorCisgICAgICAgIG1kNXRlc3QoY2hyKDB4MEMpICogMTYsCisgICAgICAgICAgICAgICAgIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiNTY0NjFlZjIzNDJlZGMwMGY5YmFiOTk1NjkwZWZkNGMiKQorCisgICAgICAgIG1kNXRlc3QoY2hyKDB4QUEpICogODAsCisgICAgICAgICAgICAgICAgIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgLSBIYXNoIEtleSBGaXJzdCIsCisgICAgICAgICAgICAgICAgIjZiMWFiN2ZlNGJkN2JmOGYwYjYyZTZjZTYxYjlkMGNkIikKKworICAgICAgICBtZDV0ZXN0KGNocigweEFBKSAqIDgwLAorICAgICAgICAgICAgICAgICgiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAiCisgICAgICAgICAgICAgICAgICJhbmQgTGFyZ2VyIFRoYW4gT25lIEJsb2NrLVNpemUgRGF0YSIpLAorICAgICAgICAgICAgICAgICI2ZjYzMGZhZDY3Y2RhMGVlMWZiMWY1NjJkYjNhYTUzZSIpCisKKyAgICBkZWYgdGVzdF9zaGFfdmVjdG9ycyhzZWxmKToKKyAgICAgICAgZGVmIHNoYXRlc3Qoa2V5LCBkYXRhLCBkaWdlc3QpOgorICAgICAgICAgICAgaCA9IGhtYWMuSE1BQyhrZXksIGRhdGEsIGRpZ2VzdG1vZD1oYXNobGliLnNoYTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguaGV4ZGlnZXN0KCkudXBwZXIoKSwgZGlnZXN0LnVwcGVyKCkpCisKKyAgICAgICAgc2hhdGVzdChjaHIoMHgwYikgKiAyMCwKKyAgICAgICAgICAgICAgICAiSGkgVGhlcmUiLAorICAgICAgICAgICAgICAgICJiNjE3MzE4NjU1MDU3MjY0ZTI4YmMwYjZmYjM3OGM4ZWYxNDZiZTAwIikKKworICAgICAgICBzaGF0ZXN0KCJKZWZlIiwKKyAgICAgICAgICAgICAgICAid2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPyIsCisgICAgICAgICAgICAgICAgImVmZmNkZjZhZTVlYjJmYTJkMjc0MTZkNWYxODRkZjljMjU5YTdjNzkiKQorCisgICAgICAgIHNoYXRlc3QoY2hyKDB4QUEpKjIwLAorICAgICAgICAgICAgICAgIGNocigweEREKSo1MCwKKyAgICAgICAgICAgICAgICAiMTI1ZDczNDJiOWFjMTFjZDkxYTM5YWY0OGFhMTdiNGY2M2YxNzVkMyIpCisKKyAgICAgICAgc2hhdGVzdCgiIi5qb2luKFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMSwgMjYpXSksCisgICAgICAgICAgICAgICAgY2hyKDB4Q0QpICogNTAsCisgICAgICAgICAgICAgICAgIjRjOTAwN2Y0MDI2MjUwYzZiYzg0MTRmOWJmNTBjODZjMmQ3MjM1ZGEiKQorCisgICAgICAgIHNoYXRlc3QoY2hyKDB4MEMpICogMjAsCisgICAgICAgICAgICAgICAgIlRlc3QgV2l0aCBUcnVuY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAiNGMxYTAzNDI0YjU1ZTA3ZmU3ZjI3YmUxZDU4YmI5MzI0YTlhNWEwNCIpCisKKyAgICAgICAgc2hhdGVzdChjaHIoMHhBQSkgKiA4MCwKKyAgICAgICAgICAgICAgICAiVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXplIEtleSAtIEhhc2ggS2V5IEZpcnN0IiwKKyAgICAgICAgICAgICAgICAiYWE0YWU1ZTE1MjcyZDAwZTk1NzA1NjM3Y2U4YTNiNTVlZDQwMjExMiIpCisKKyAgICAgICAgc2hhdGVzdChjaHIoMHhBQSkgKiA4MCwKKyAgICAgICAgICAgICAgICAoIlRlc3QgVXNpbmcgTGFyZ2VyIFRoYW4gQmxvY2stU2l6ZSBLZXkgIgorICAgICAgICAgICAgICAgICAiYW5kIExhcmdlciBUaGFuIE9uZSBCbG9jay1TaXplIERhdGEiKSwKKyAgICAgICAgICAgICAgICAiZThlOTlkMGY0NTIzN2Q3ODZkNmJiYWE3OTY1Yzc4MDhiYmZmMWE5MSIpCisKKyAgICBkZWYgX3JmYzQyMzFfdGVzdF9jYXNlcyhzZWxmLCBoYXNoZnVuYyk6CisgICAgICAgIGRlZiBobWFjdGVzdChrZXksIGRhdGEsIGhleGRpZ2VzdHMpOgorICAgICAgICAgICAgaCA9IGhtYWMuSE1BQyhrZXksIGRhdGEsIGRpZ2VzdG1vZD1oYXNoZnVuYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5oZXhkaWdlc3QoKS5sb3dlcigpLCBoZXhkaWdlc3RzW2hhc2hmdW5jXSkKKworICAgICAgICAjIDQuMi4gIFRlc3QgQ2FzZSAxCisgICAgICAgIGhtYWN0ZXN0KGtleSA9ICdceDBiJyoyMCwKKyAgICAgICAgICAgICAgICAgZGF0YSA9ICdIaSBUaGVyZScsCisgICAgICAgICAgICAgICAgIGhleGRpZ2VzdHMgPSB7CisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyMjQ6ICc4OTZmYjExMjhhYmJkZjE5NjgzMjEwN2NkNDlkZjMzZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzQ3YjRiMTE2OTkxMmJhNGY1MzY4NGIyMicsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyNTY6ICdiMDM0NGM2MWQ4ZGIzODUzNWNhOGFmY2VhZjBiZjEyYicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzg4MWRjMjAwYzk4MzNkYTcyNmU5Mzc2YzJlMzJjZmY3JywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTM4NDogJ2FmZDAzOTQ0ZDg0ODk1NjI2YjA4MjVmNGFiNDY5MDdmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMTVmOWRhZGJlNDEwMWVjNjgyYWEwMzRjN2NlYmM1OWMnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWVhOWVhOTA3NmVkZTdmNGFmMTUyZThiMmZhOWNiNicsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGE1MTI6ICc4N2FhN2NkZWE1ZWY2MTlkNGZmMGI0MjQxYTFkNmNiMCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzIzNzlmNGUyY2U0ZWMyNzg3YWQwYjMwNTQ1ZTE3Y2RlJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGFhODMzYjdkNmI4YTcwMjAzOGIyNzRlYWVhM2Y0ZTQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiZTlkOTE0ZWViNjFmMTcwMmU2OTZjMjAzYTEyNjg1NCcsCisgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgIyA0LjMuICBUZXN0IENhc2UgMgorICAgICAgICBobWFjdGVzdChrZXkgPSAnSmVmZScsCisgICAgICAgICAgICAgICAgIGRhdGEgPSAnd2hhdCBkbyB5YSB3YW50IGZvciBub3RoaW5nPycsCisgICAgICAgICAgICAgICAgIGhleGRpZ2VzdHMgPSB7CisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyMjQ6ICdhMzBlMDEwOThiYzZkYmJmNDU2OTBmM2E3ZTllNmQwZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzhiYmVhMmEzOWU2MTQ4MDA4ZmQwNWU0NCcsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyNTY6ICc1YmRjYzE0NmJmNjA3NTRlNmEwNDI0MjYwODk1NzVjNycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzVhMDAzZjA4OWQyNzM5ODM5ZGVjNThiOTY0ZWMzODQzJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTM4NDogJ2FmNDVkMmUzNzY0ODQwMzE2MTdmNzhkMmI1OGE2YjFiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOWM3ZWY0NjRmNWEwMWI0N2U0MmVjMzczNjMyMjQ0NWUnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc4ZTIyNDBjYTVlNjllMmM3OGIzMjM5ZWNmYWIyMTY0OScsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGE1MTI6ICcxNjRiN2E3YmZjZjgxOWUyZTM5NWZiZTczYjU2ZTBhMycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzg3YmQ2NDIyMmU4MzFmZDYxMDI3MGNkN2VhMjUwNTU0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnOTc1OGJmNzVjMDVhOTk0YTZkMDM0ZjY1ZjhmMGU2ZmQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWVhYjFhMzRkNGE2YjRiNjM2ZTA3MGEzOGJjZTczNycsCisgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgIyA0LjQuICBUZXN0IENhc2UgMworICAgICAgICBobWFjdGVzdChrZXkgPSAnXHhhYScqMjAsCisgICAgICAgICAgICAgICAgIGRhdGEgPSAnXHhkZCcqNTAsCisgICAgICAgICAgICAgICAgIGhleGRpZ2VzdHMgPSB7CisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyMjQ6ICc3ZmIzY2IzNTg4YzZjMWY2ZmZhOTY5NGQ3ZDZhZDI2NCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzkzNjViMGMxZjY1ZDY5ZDFlYzgzMzNlYScsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyNTY6ICc3NzNlYTkxZTM2ODAwZTQ2ODU0ZGI4ZWJkMDkxODFhNycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzI5NTkwOThiM2VmOGMxMjJkOTYzNTUxNGNlZDU2NWZlJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTM4NDogJzg4MDYyNjA4ZDNlNmFkOGEwYWEyYWNlMDE0YzhhODZmJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnMGFhNjM1ZDk0N2FjOWZlYmU4M2VmNGU1NTk2NjE0NGInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcyYTVhYjM5ZGMxMzgxNGI5NGUzYWI2ZTEwMWEzNGYyNycsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGE1MTI6ICdmYTczYjAwODlkNTZhMjg0ZWZiMGYwNzU2Yzg5MGJlOScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2IxYjVkYmRkOGVlODFhMzY1NWY4M2UzM2IyMjc5ZDM5JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYmYzZTg0ODI3OWE3MjJjODA2YjQ4NWE0N2U2N2M4MDcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiOTQ2YTMzN2JlZTg5NDI2NzQyNzg4NTllMTMyOTJmYicsCisgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgIyA0LjUuICBUZXN0IENhc2UgNAorICAgICAgICBobWFjdGVzdChrZXkgPSAnJy5qb2luKFtjaHIoeCkgZm9yIHggaW4geHJhbmdlKDB4MDEsIDB4MTkrMSldKSwKKyAgICAgICAgICAgICAgICAgZGF0YSA9ICdceGNkJyo1MCwKKyAgICAgICAgICAgICAgICAgaGV4ZGlnZXN0cyA9IHsKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTIyNDogJzZjMTE1MDY4NzQwMTNjYWM2YTJhYmMxYmIzODI2MjdjJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWM2YTkwZDg2ZWZjMDEyZGU3YWZlYzVhJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTI1NjogJzgyNTU4YTM4OWE0NDNjMGVhNGNjODE5ODk5ZjIwODNhJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnODVmMGZhYTNlNTc4ZjgwNzdhMmUzZmY0NjcyOTY2NWInLAorICAgICAgICAgICAgICAgICAgIGhhc2hsaWIuc2hhMzg0OiAnM2U4YTY5Yjc3ODNjMjU4NTE5MzNhYjYyOTBhZjZjYTcnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc3YTk5ODE0ODA4NTAwMDljYzU1NzdjNmUxZjU3M2I0ZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzY4MDFkZDIzYzRhN2Q2NzljY2Y4YTM4NmM2NzRjZmZiJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTUxMjogJ2IwYmE0NjU2Mzc0NThjNjk5MGU1YThjNWY2MWQ0YWY3JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZTU3NmQ5N2ZmOTRiODcyZGU3NmY4MDUwMzYxZWUzZGInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhOTFjYTVjMTFhYTI1ZWI0ZDY3OTI3NWNjNTc4ODA2MycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2E1ZjE5NzQxMTIwYzRmMmRlMmFkZWJlYjEwYTI5OGRkJywKKyAgICAgICAgICAgICAgICAgfSkKKworICAgICAgICAjIDQuNy4gIFRlc3QgQ2FzZSA2CisgICAgICAgIGhtYWN0ZXN0KGtleSA9ICdceGFhJyoxMzEsCisgICAgICAgICAgICAgICAgIGRhdGEgPSAnVGVzdCBVc2luZyBMYXJnZXIgVGhhbiBCbG9jay1TaXonCisgICAgICAgICAgICAgICAgICAgICAgICAnZSBLZXkgLSBIYXNoIEtleSBGaXJzdCcsCisgICAgICAgICAgICAgICAgIGhleGRpZ2VzdHMgPSB7CisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyMjQ6ICc5NWU5YTBkYjk2MjA5NWFkYWViZTliMmQ2ZjBkYmNlMicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Q0OTlmMTEyZjJkMmI3MjczZmE2ODcwZScsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyNTY6ICc2MGU0MzE1OTFlZTBiNjdmMGQ4YTI2YWFjYmY1Yjc3ZicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzhlMGJjNjIxMzcyOGM1MTQwNTQ2MDQwZjBlZTM3ZjU0JywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTM4NDogJzRlY2UwODQ0ODU4MTNlOTA4OGQyYzYzYTA0MWJjNWI0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNGY5ZWYxMDEyYTJiNTg4ZjNjZDExZjA1MDMzYWM0YzYnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcwYzJlZjZhYjQwMzBmZTgyOTYyNDhkZjE2M2Y0NDk1MicsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGE1MTI6ICc4MGIyNDI2M2M3YzFhM2ViYjcxNDkzYzFkZDdiZThiNCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzliNDZkMWY0MWI0YWVlYzExMjFiMDEzNzgzZjhmMzUyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNmI1NmQwMzdlMDVmMjU5OGJkMGZkMjIxNWQ2YTFlNTInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc5NWU2NGY3M2Y2M2YwYWVjOGI5MTVhOTg1ZDc4NjU5OCcsCisgICAgICAgICAgICAgICAgIH0pCisKKyAgICAgICAgIyA0LjguICBUZXN0IENhc2UgNworICAgICAgICBobWFjdGVzdChrZXkgPSAnXHhhYScqMTMxLAorICAgICAgICAgICAgICAgICBkYXRhID0gJ1RoaXMgaXMgYSB0ZXN0IHVzaW5nIGEgbGFyZ2VyIHRoJworICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGJsb2NrLXNpemUga2V5IGFuZCBhIGxhcmdlciB0JworICAgICAgICAgICAgICAgICAgICAgICAgJ2hhbiBibG9jay1zaXplIGRhdGEuIFRoZSBrZXkgbmVlJworICAgICAgICAgICAgICAgICAgICAgICAgJ2RzIHRvIGJlIGhhc2hlZCBiZWZvcmUgYmVpbmcgdXNlJworICAgICAgICAgICAgICAgICAgICAgICAgJ2QgYnkgdGhlIEhNQUMgYWxnb3JpdGhtLicsCisgICAgICAgICAgICAgICAgIGhleGRpZ2VzdHMgPSB7CisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyMjQ6ICczYTg1NDE2NmFjNWQ5ZjAyM2Y1NGQ1MTdkMGIzOWRiZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzk0Njc3MGRiOWMyYjk1YzlmNmY1NjVkMScsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGEyNTY6ICc5YjA5ZmZhNzFiOTQyZmNiMjc2MzVmYmNkNWIwZTk0NCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JmZGM2MzY0NGYwNzEzOTM4YTdmNTE1MzVjM2EzNWUyJywKKyAgICAgICAgICAgICAgICAgICBoYXNobGliLnNoYTM4NDogJzY2MTcxNzhlOTQxZjAyMGQzNTFlMmYyNTRlOGZkMzJjJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnNjAyNDIwZmViMGI4ZmI5YWRjY2ViYjgyNDYxZTk5YzUnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhNjc4Y2MzMWU3OTkxNzZkMzg2MGU2MTEwYzQ2NTIzZScsCisgICAgICAgICAgICAgICAgICAgaGFzaGxpYi5zaGE1MTI6ICdlMzdiNmE3NzVkYzg3ZGJhYTRkZmE5Zjk2ZTVlM2ZmZCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlYmQ3MWY4ODY3Mjg5ODY1ZGY1YTMyZDIwY2RjOTQ0JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYjYwMjJjYWMzYzQ5ODJiMTBkNWVlYjU1YzNlNGRlMTUnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcxMzQ2NzZmYjZkZTA0NDYwNjVjOTc0NDBmYThjNmE1OCcsCisgICAgICAgICAgICAgICAgIH0pCisKKyAgICBkZWYgdGVzdF9zaGEyMjRfcmZjNDIzMShzZWxmKToKKyAgICAgICAgc2VsZi5fcmZjNDIzMV90ZXN0X2Nhc2VzKGhhc2hsaWIuc2hhMjI0KQorCisgICAgZGVmIHRlc3Rfc2hhMjU2X3JmYzQyMzEoc2VsZik6CisgICAgICAgIHNlbGYuX3JmYzQyMzFfdGVzdF9jYXNlcyhoYXNobGliLnNoYTI1NikKKworICAgIGRlZiB0ZXN0X3NoYTM4NF9yZmM0MjMxKHNlbGYpOgorICAgICAgICBzZWxmLl9yZmM0MjMxX3Rlc3RfY2FzZXMoaGFzaGxpYi5zaGEzODQpCisKKyAgICBkZWYgdGVzdF9zaGE1MTJfcmZjNDIzMShzZWxmKToKKyAgICAgICAgc2VsZi5fcmZjNDIzMV90ZXN0X2Nhc2VzKGhhc2hsaWIuc2hhNTEyKQorCisgICAgZGVmIHRlc3RfbGVnYWN5X2Jsb2NrX3NpemVfd2FybmluZ3Moc2VsZik6CisgICAgICAgIGNsYXNzIE1vY2tDcmF6eUhhc2gob2JqZWN0KToKKyAgICAgICAgICAgICIiIkFpbid0IG5vIGJsb2NrX3NpemUgYXR0cmlidXRlIGhlcmUuIiIiCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYuX3ggPSBoYXNobGliLnNoYTEoKmFyZ3MpCisgICAgICAgICAgICAgICAgc2VsZi5kaWdlc3Rfc2l6ZSA9IHNlbGYuX3guZGlnZXN0X3NpemUKKyAgICAgICAgICAgIGRlZiB1cGRhdGUoc2VsZiwgdik6CisgICAgICAgICAgICAgICAgc2VsZi5feC51cGRhdGUodikKKyAgICAgICAgICAgIGRlZiBkaWdlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3guZGlnZXN0KCkKKworICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5zaW1wbGVmaWx0ZXIoJ2Vycm9yJywgUnVudGltZVdhcm5pbmcpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVXYXJuaW5nKToKKyAgICAgICAgICAgICAgICBobWFjLkhNQUMoJ2EnLCAnYicsIGRpZ2VzdG1vZD1Nb2NrQ3JhenlIYXNoKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnRXhwZWN0ZWQgd2FybmluZyBhYm91dCBtaXNzaW5nIGJsb2NrX3NpemUnKQorCisgICAgICAgICAgICBNb2NrQ3JhenlIYXNoLmJsb2NrX3NpemUgPSAxCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVXYXJuaW5nKToKKyAgICAgICAgICAgICAgICBobWFjLkhNQUMoJ2EnLCAnYicsIGRpZ2VzdG1vZD1Nb2NrQ3JhenlIYXNoKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnRXhwZWN0ZWQgd2FybmluZyBhYm91dCBzbWFsbCBibG9ja19zaXplJykKKworCisKK2NsYXNzIENvbnN0cnVjdG9yVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfbm9ybWFsKHNlbGYpOgorICAgICAgICAjIFN0YW5kYXJkIGNvbnN0cnVjdG9yIGNhbGwuCisgICAgICAgIGZhaWxlZCA9IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaCA9IGhtYWMuSE1BQygia2V5IikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTdGFuZGFyZCBjb25zdHJ1Y3RvciBjYWxsIHJhaXNlZCBleGNlcHRpb24uIikKKworICAgIGRlZiB0ZXN0X3dpdGh0ZXh0KHNlbGYpOgorICAgICAgICAjIENvbnN0cnVjdG9yIGNhbGwgd2l0aCB0ZXh0LgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoID0gaG1hYy5ITUFDKCJrZXkiLCAiaGFzaCB0aGlzISIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQ29uc3RydWN0b3IgY2FsbCB3aXRoIHRleHQgYXJndW1lbnQgcmFpc2VkIGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIHRlc3Rfd2l0aG1vZHVsZShzZWxmKToKKyAgICAgICAgIyBDb25zdHJ1Y3RvciBjYWxsIHdpdGggdGV4dCBhbmQgZGlnZXN0IG1vZHVsZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaCA9IGhtYWMuSE1BQygia2V5IiwgIiIsIGhhc2hsaWIuc2hhMSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJDb25zdHJ1Y3RvciBjYWxsIHdpdGggaGFzaGxpYi5zaGExIHJhaXNlZCBleGNlcHRpb24uIikKKworY2xhc3MgU2FuaXR5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9pc19tZDUoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBpZiBITUFDIGRlZmF1bHRzIHRvIE1ENSBhbGdvcml0aG0uCisgICAgICAgICMgTk9URTogdGhpcyB3aGl0ZWJveCB0ZXN0IGRlcGVuZHMgb24gdGhlIGhtYWMgY2xhc3MgaW50ZXJuYWxzCisgICAgICAgIGggPSBobWFjLkhNQUMoImtleSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLmRpZ2VzdF9jb25zID09IGhhc2hsaWIubWQ1KQorCisgICAgZGVmIHRlc3RfZXhlcmNpc2VfYWxsX21ldGhvZHMoc2VsZik6CisgICAgICAgICMgRXhlcmNpc2luZyBhbGwgbWV0aG9kcyBvbmNlLgorICAgICAgICAjIFRoaXMgbXVzdCBub3QgcmFpc2UgYW55IGV4Y2VwdGlvbnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaCA9IGhtYWMuSE1BQygibXkgc2VjcmV0IGtleSIpCisgICAgICAgICAgICBoLnVwZGF0ZSgiY29tcHV0ZSB0aGUgaGFzaCBvZiB0aGlzIHRleHQhIikKKyAgICAgICAgICAgIGRpZyA9IGguZGlnZXN0KCkKKyAgICAgICAgICAgIGRpZyA9IGguaGV4ZGlnZXN0KCkKKyAgICAgICAgICAgIGgyID0gaC5jb3B5KCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeGNlcHRpb24gcmFpc2VkIGR1cmluZyBub3JtYWwgdXNhZ2Ugb2YgSE1BQyBjbGFzcy4iKQorCitjbGFzcyBDb3B5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGlmIGF0dHJpYnV0ZXMgYXJlIG9mIHNhbWUgdHlwZS4KKyAgICAgICAgaDEgPSBobWFjLkhNQUMoImtleSIpCisgICAgICAgIGgyID0gaDEuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoMS5kaWdlc3RfY29ucyA9PSBoMi5kaWdlc3RfY29ucywKKyAgICAgICAgICAgICJkaWdlc3QgY29uc3RydWN0b3JzIGRvbid0IG1hdGNoLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGgxLmlubmVyKSA9PSB0eXBlKGgyLmlubmVyKSwKKyAgICAgICAgICAgICJUeXBlcyBvZiBpbm5lciBkb24ndCBtYXRjaC4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShoMS5vdXRlcikgPT0gdHlwZShoMi5vdXRlciksCisgICAgICAgICAgICAiVHlwZXMgb2Ygb3V0ZXIgZG9uJ3QgbWF0Y2guIikKKworICAgIGRlZiB0ZXN0X3JlYWxjb3B5KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgaWYgdGhlIGNvcHkgbWV0aG9kIGNyZWF0ZWQgYSByZWFsIGNvcHkuCisgICAgICAgIGgxID0gaG1hYy5ITUFDKCJrZXkiKQorICAgICAgICBoMiA9IGgxLmNvcHkoKQorICAgICAgICAjIFVzaW5nIGlkKCkgaW4gY2FzZSBzb21lYm9keSBoYXMgb3ZlcnJpZGRlbiBfX2NtcF9fLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEpICE9IGlkKGgyKSwgIk5vIHJlYWwgY29weSBvZiB0aGUgSE1BQyBpbnN0YW5jZS4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEuaW5uZXIpICE9IGlkKGgyLmlubmVyKSwKKyAgICAgICAgICAgICJObyByZWFsIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZSAnaW5uZXInLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpZChoMS5vdXRlcikgIT0gaWQoaDIub3V0ZXIpLAorICAgICAgICAgICAgIk5vIHJlYWwgY29weSBvZiB0aGUgYXR0cmlidXRlICdvdXRlcicuIikKKworICAgIGRlZiB0ZXN0X2VxdWFsaXR5KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgaWYgdGhlIGNvcHkgaGFzIHRoZSBzYW1lIGRpZ2VzdHMuCisgICAgICAgIGgxID0gaG1hYy5ITUFDKCJrZXkiKQorICAgICAgICBoMS51cGRhdGUoInNvbWUgcmFuZG9tIHRleHQiKQorICAgICAgICBoMiA9IGgxLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaDEuZGlnZXN0KCkgPT0gaDIuZGlnZXN0KCksCisgICAgICAgICAgICAiRGlnZXN0IG9mIGNvcHkgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBkaWdlc3QuIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGgxLmhleGRpZ2VzdCgpID09IGgyLmhleGRpZ2VzdCgpLAorICAgICAgICAgICAgIkhleGRpZ2VzdCBvZiBjb3B5IGRvZXNuJ3QgbWF0Y2ggb3JpZ2luYWwgaGV4ZGlnZXN0LiIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBUZXN0VmVjdG9yc1Rlc3RDYXNlLAorICAgICAgICBDb25zdHJ1Y3RvclRlc3RDYXNlLAorICAgICAgICBTYW5pdHlUZXN0Q2FzZSwKKyAgICAgICAgQ29weVRlc3RDYXNlCisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9obWFjLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTZhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9obWFjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9obWFjLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2htYWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTZhZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9obWFjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG90c2hvdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGE5NzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG90c2hvdC5weQpAQCAtMCwwICsxLDE1OCBAQAoraW1wb3J0IG9zCitpbXBvcnQgcHByaW50CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IF9ob3RzaG90CitpbXBvcnQgZ2MKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBTaWxlbmNlIFB5M2sgd2FybmluZworaG90c2hvdCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdob3RzaG90JywgZGVwcmVjYXRlZD1UcnVlKQorZnJvbSBob3RzaG90LmxvZyBpbXBvcnQgRU5URVIsIEVYSVQsIExJTkUKK2Zyb20gaG90c2hvdCBpbXBvcnQgc3RhdHMKKworCitkZWYgc2hvcnRmaWxlbmFtZShmbik6CisgICAgIyBXZSB1c2UgYSByZWFsbHkgc2hvcnRlbmVkIGZpbGVuYW1lIHNpbmNlIGFuIGV4YWN0IG1hdGNoIGlzIG1hZGUsCisgICAgIyBhbmQgdGhlIHNvdXJjZSBtYXkgYmUgZWl0aGVyIGEgUHl0aG9uIHNvdXJjZSBmaWxlIG9yIGEKKyAgICAjIHByZS1jb21waWxlZCBieXRlY29kZSBmaWxlLgorICAgIGlmIGZuOgorICAgICAgICByZXR1cm4gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZuKSlbMF0KKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gZm4KKworCitjbGFzcyBVbmxpbmtpbmdMb2dSZWFkZXIoaG90c2hvdC5sb2cuTG9nUmVhZGVyKToKKyAgICAiIiJFeHRlbmQgdGhlIExvZ1JlYWRlciBzbyB0aGUgbG9nIGZpbGUgaXMgdW5saW5rZWQgd2hlbiB3ZSdyZQorICAgIGRvbmUgd2l0aCBpdC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dmbik6CisgICAgICAgIHNlbGYuX19sb2dmbiA9IGxvZ2ZuCisgICAgICAgIGhvdHNob3QubG9nLkxvZ1JlYWRlci5fX2luaXRfXyhzZWxmLCBsb2dmbikKKworICAgIGRlZiBuZXh0KHNlbGYsIGluZGV4PU5vbmUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gaG90c2hvdC5sb2cuTG9nUmVhZGVyLm5leHQoc2VsZikKKyAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhzZWxmLl9fbG9nZm4pCisgICAgICAgICAgICByYWlzZQorCisKK2NsYXNzIEhvdFNob3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5ld19wcm9maWxlcihzZWxmLCBsaW5lZXZlbnRzPTAsIGxpbmV0aW1pbmdzPTEpOgorICAgICAgICBzZWxmLmxvZ2ZuID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICByZXR1cm4gaG90c2hvdC5Qcm9maWxlKHNlbGYubG9nZm4sIGxpbmVldmVudHMsIGxpbmV0aW1pbmdzKQorCisgICAgZGVmIGdldF9sb2dyZWFkZXIoc2VsZik6CisgICAgICAgIHJldHVybiBVbmxpbmtpbmdMb2dSZWFkZXIoc2VsZi5sb2dmbikKKworICAgIGRlZiBnZXRfZXZlbnRzX3dvdGltZShzZWxmKToKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciBldmVudCBpbiBzZWxmLmdldF9sb2dyZWFkZXIoKToKKyAgICAgICAgICAgIHdoYXQsIChmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSksIHRkZWx0YSA9IGV2ZW50CisgICAgICAgICAgICBMLmFwcGVuZCgod2hhdCwgKHNob3J0ZmlsZW5hbWUoZmlsZW5hbWUpLCBsaW5lbm8sIGZ1bmNuYW1lKSkpCisgICAgICAgIHJldHVybiBMCisKKyAgICBkZWYgY2hlY2tfZXZlbnRzKHNlbGYsIGV4cGVjdGVkKToKKyAgICAgICAgZXZlbnRzID0gc2VsZi5nZXRfZXZlbnRzX3dvdGltZSgpCisgICAgICAgIGlmIGV2ZW50cyAhPSBleHBlY3RlZDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAiZXZlbnRzIGRpZCBub3QgbWF0Y2ggZXhwZWN0YXRpb247IGdvdDpcbiVzXG5leHBlY3RlZDpcbiVzIgorICAgICAgICAgICAgICAgICUgKHBwcmludC5wZm9ybWF0KGV2ZW50cyksIHBwcmludC5wZm9ybWF0KGV4cGVjdGVkKSkpCisKKyAgICBkZWYgcnVuX3Rlc3Qoc2VsZiwgY2FsbGFibGUsIGV2ZW50cywgcHJvZmlsZXI9Tm9uZSk6CisgICAgICAgIGlmIHByb2ZpbGVyIGlzIE5vbmU6CisgICAgICAgICAgICBwcm9maWxlciA9IHNlbGYubmV3X3Byb2ZpbGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm9maWxlci5fcHJvZi5jbG9zZWQpCisgICAgICAgIHByb2ZpbGVyLnJ1bmNhbGwoY2FsbGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvZmlsZXIuX3Byb2YuY2xvc2VkKQorICAgICAgICBwcm9maWxlci5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm9maWxlci5fcHJvZi5jbG9zZWQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGV2ZW50cykKKworICAgIGRlZiB0ZXN0X2FkZGluZm8oc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgcC5hZGRpbmZvKCJ0ZXN0LWtleSIsICJ0ZXN0LXZhbHVlIikKKyAgICAgICAgcHJvZmlsZXIgPSBzZWxmLm5ld19wcm9maWxlcigpCisgICAgICAgIHByb2ZpbGVyLnJ1bmNhbGwoZiwgcHJvZmlsZXIpCisgICAgICAgIHByb2ZpbGVyLmNsb3NlKCkKKyAgICAgICAgbG9nID0gc2VsZi5nZXRfbG9ncmVhZGVyKCkKKyAgICAgICAgaW5mbyA9IGxvZy5faW5mbworICAgICAgICBsaXN0KGxvZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluZm9bInRlc3Qta2V5Il0gPT0gWyJ0ZXN0LXZhbHVlIl0pCisKKyAgICBkZWYgdGVzdF9saW5lX251bWJlcnMoc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICB5ID0gMgorICAgICAgICAgICAgeCA9IDEKKyAgICAgICAgZGVmIGcoKToKKyAgICAgICAgICAgIGYoKQorICAgICAgICBmX2xpbmVubyA9IGYuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vCisgICAgICAgIGdfbGluZW5vID0gZy5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgZXZlbnRzID0gWyhFTlRFUiwgKCJ0ZXN0X2hvdHNob3QiLCBnX2xpbmVubywgImciKSksCisgICAgICAgICAgICAgICAgICAoTElORSwgICgidGVzdF9ob3RzaG90IiwgZ19saW5lbm8rMSwgImciKSksCisgICAgICAgICAgICAgICAgICAoRU5URVIsICgidGVzdF9ob3RzaG90IiwgZl9saW5lbm8sICJmIikpLAorICAgICAgICAgICAgICAgICAgKExJTkUsICAoInRlc3RfaG90c2hvdCIsIGZfbGluZW5vKzEsICJmIikpLAorICAgICAgICAgICAgICAgICAgKExJTkUsICAoInRlc3RfaG90c2hvdCIsIGZfbGluZW5vKzIsICJmIikpLAorICAgICAgICAgICAgICAgICAgKEVYSVQsICAoInRlc3RfaG90c2hvdCIsIGZfbGluZW5vLCAiZiIpKSwKKyAgICAgICAgICAgICAgICAgIChFWElULCAgKCJ0ZXN0X2hvdHNob3QiLCBnX2xpbmVubywgImciKSksCisgICAgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYucnVuX3Rlc3QoZywgZXZlbnRzLCBzZWxmLm5ld19wcm9maWxlcihsaW5lZXZlbnRzPTEpKQorCisgICAgZGVmIHRlc3Rfc3RhcnRfc3RvcChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgZG9uJ3QgcmV0dXJuIE5VTEwgaW4gdGhlIHN0YXJ0KCkgYW5kIHN0b3AoKQorICAgICAgICAjIG1ldGhvZHMgd2hlbiB0aGVyZSBpc24ndCBhbiBlcnJvci4gIEJ1ZyBpbiAyLjIgbm90ZWQgYnkKKyAgICAgICAgIyBBbnRob255IEJheHRlci4KKyAgICAgICAgcHJvZmlsZXIgPSBzZWxmLm5ld19wcm9maWxlcigpCisgICAgICAgIHByb2ZpbGVyLnN0YXJ0KCkKKyAgICAgICAgcHJvZmlsZXIuc3RvcCgpCisgICAgICAgIHByb2ZpbGVyLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKHNlbGYubG9nZm4pCisKKyAgICBkZWYgdGVzdF9iYWRfc3lzX3BhdGgoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIG9yaWdfcGF0aCA9IHN5cy5wYXRoCisgICAgICAgIGNvdmVyYWdlID0gaG90c2hvdC5faG90c2hvdC5jb3ZlcmFnZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHZlcmlmeSB3ZSByZXF1aXJlIGEgbGlzdCBmb3Igc3lzLnBhdGgKKyAgICAgICAgICAgIHN5cy5wYXRoID0gJ2FiYycKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY292ZXJhZ2UsIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICAjIHZlcmlmeSB0aGF0IHdlIHJlcXVpcmUgc3lzLnBhdGggZXhpc3RzCisgICAgICAgICAgICBkZWwgc3lzLnBhdGgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY292ZXJhZ2UsIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGF0aCA9IG9yaWdfcGF0aAorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9sb2dyZWFkZXJfZW9mX2Vycm9yKHNlbGYpOgorICAgICAgICBlbXB0eWZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoSU9FcnJvciwgRU9GRXJyb3IpLCBfaG90c2hvdC5sb2dyZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eWZpbGUubmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGVtcHR5ZmlsZS5jbG9zZSgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgZGVmIHRlc3RfbG9hZF9zdGF0cyhzZWxmKToKKyAgICAgICAgZGVmIHN0YXJ0KHByb2YpOgorICAgICAgICAgICAgcHJvZi5zdGFydCgpCisgICAgICAgICMgTWFrZSBzdXJlIHN0YXRzIGNhbiBiZSBsb2FkZWQgd2hlbiBzdGFydCBhbmQgc3RvcCBvZiBwcm9maWxlcgorICAgICAgICAjIGFyZSBub3QgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgc3RhY2sgZnJhbWUuCisgICAgICAgIHByb2ZpbGVyID0gc2VsZi5uZXdfcHJvZmlsZXIoKQorICAgICAgICBzdGFydChwcm9maWxlcikKKyAgICAgICAgcHJvZmlsZXIuc3RvcCgpCisgICAgICAgIHByb2ZpbGVyLmNsb3NlKCkKKyAgICAgICAgc3RhdHMubG9hZChzZWxmLmxvZ2ZuKQorICAgICAgICBvcy51bmxpbmsoc2VsZi5sb2dmbikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChIb3RTaG90VGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG90c2hvdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I4OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG90c2hvdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG90c2hvdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ob3RzaG90LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2I4OTk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaG90c2hvdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4MTNiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxsaWIucHkKQEAgLTAsMCArMSw2OSBAQAoraW1wb3J0IGZvcm1hdHRlcgoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitodG1sbGliID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2h0bWxsaWInLCBkZXByZWNhdGVkPVRydWUpCisKKworY2xhc3MgQW5jaG9yQ29sbGVjdG9yKGh0bWxsaWIuSFRNTFBhcnNlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5fX2FuY2hvcnMgPSBbXQorICAgICAgICBodG1sbGliLkhUTUxQYXJzZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICBkZWYgZ2V0X2FuY2hvcl9pbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2FuY2hvcnMKKworICAgIGRlZiBhbmNob3JfYmduKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fX2FuY2hvcnMuYXBwZW5kKGFyZ3MpCisKK2NsYXNzIERlY2xDb2xsZWN0b3IoaHRtbGxpYi5IVE1MUGFyc2VyKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICBzZWxmLl9fZGVjbHMgPSBbXQorICAgICAgICBodG1sbGliLkhUTUxQYXJzZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICBkZWYgZ2V0X2RlY2xfaW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kZWNscworCisgICAgZGVmIHVua25vd25fZGVjbChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fX2RlY2xzLmFwcGVuZChkYXRhKQorCisKK2NsYXNzIEhUTUxQYXJzZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYW5jaG9yX2NvbGxlY3Rpb24oc2VsZik6CisgICAgICAgICMgU2VlIFNGIGJ1ZyAjNDY3MDU5LgorICAgICAgICBwYXJzZXIgPSBBbmNob3JDb2xsZWN0b3IoZm9ybWF0dGVyLk51bGxGb3JtYXR0ZXIoKSwgdmVyYm9zZT0xKQorICAgICAgICBwYXJzZXIuZmVlZCgKKyAgICAgICAgICAgICIiIjxhIGhyZWY9J2h0dHA6Ly9mb28ub3JnLycgbmFtZT0nc3BsYXQnPiA8L2E+CisgICAgICAgICAgICA8YSBocmVmPSdodHRwOi8vd3d3LnB5dGhvbi5vcmcvJz4gPC9hPgorICAgICAgICAgICAgPGEgbmFtZT0nZnJvYic+IDwvYT4KKyAgICAgICAgICAgICIiIikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0X2FuY2hvcl9pbmZvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnaHR0cDovL2Zvby5vcmcvJywgJ3NwbGF0JywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nLCAnJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJycsICdmcm9iJywgJycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZGVjbF9jb2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIFNlZSBTRiBwYXRjaCAjNTQ1MzAwCisgICAgICAgIHBhcnNlciA9IERlY2xDb2xsZWN0b3IoZm9ybWF0dGVyLk51bGxGb3JtYXR0ZXIoKSwgdmVyYm9zZT0xKQorICAgICAgICBwYXJzZXIuZmVlZCgKKyAgICAgICAgICAgICIiIjxodG1sPgorICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICBoYWxsbworICAgICAgICAgICAgPCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+CisgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgICAgICA8L2h0bWw+CisgICAgICAgICAgICAiIiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldF9kZWNsX2luZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImlmICFzdXBwb3J0RW1wdHlQYXJhcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRpZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoSFRNTFBhcnNlclRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2Yzg4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2Yzg4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzQ2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odG1scGFyc2VyLnB5CkBAIC0wLDAgKzEsNjEwIEBACisiIiJUZXN0cyBmb3IgSFRNTFBhcnNlci5weS4iIiIKKworaW1wb3J0IEhUTUxQYXJzZXIKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBFdmVudENvbGxlY3RvcihIVE1MUGFyc2VyLkhUTUxQYXJzZXIpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmV2ZW50cyA9IFtdCisgICAgICAgIHNlbGYuYXBwZW5kID0gc2VsZi5ldmVudHMuYXBwZW5kCisgICAgICAgIEhUTUxQYXJzZXIuSFRNTFBhcnNlci5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIGdldF9ldmVudHMoc2VsZik6CisgICAgICAgICMgTm9ybWFsaXplIHRoZSBsaXN0IG9mIGV2ZW50cyBzbyB0aGF0IGJ1ZmZlciBhcnRlZmFjdHMgZG9uJ3QKKyAgICAgICAgIyBzZXBhcmF0ZSBydW5zIG9mIGNvbnRpZ3VvdXMgY2hhcmFjdGVycy4KKyAgICAgICAgTCA9IFtdCisgICAgICAgIHByZXZ0eXBlID0gTm9uZQorICAgICAgICBmb3IgZXZlbnQgaW4gc2VsZi5ldmVudHM6CisgICAgICAgICAgICB0eXBlID0gZXZlbnRbMF0KKyAgICAgICAgICAgIGlmIHR5cGUgPT0gcHJldnR5cGUgPT0gImRhdGEiOgorICAgICAgICAgICAgICAgIExbLTFdID0gKCJkYXRhIiwgTFstMV1bMV0gKyBldmVudFsxXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgTC5hcHBlbmQoZXZlbnQpCisgICAgICAgICAgICBwcmV2dHlwZSA9IHR5cGUKKyAgICAgICAgc2VsZi5ldmVudHMgPSBMCisgICAgICAgIHJldHVybiBMCisKKyAgICAjIHN0cnVjdHVyZSBtYXJrdXAKKworICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgic3RhcnR0YWciLCB0YWcsIGF0dHJzKSkKKworICAgIGRlZiBoYW5kbGVfc3RhcnRlbmR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgic3RhcnRlbmR0YWciLCB0YWcsIGF0dHJzKSkKKworICAgIGRlZiBoYW5kbGVfZW5kdGFnKHNlbGYsIHRhZyk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZW5kdGFnIiwgdGFnKSkKKworICAgICMgYWxsIG90aGVyIG1hcmt1cAorCisgICAgZGVmIGhhbmRsZV9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImNvbW1lbnQiLCBkYXRhKSkKKworICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjaGFycmVmIiwgZGF0YSkpCisKKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiZGF0YSIsIGRhdGEpKQorCisgICAgZGVmIGhhbmRsZV9kZWNsKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImRlY2wiLCBkYXRhKSkKKworICAgIGRlZiBoYW5kbGVfZW50aXR5cmVmKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImVudGl0eXJlZiIsIGRhdGEpKQorCisgICAgZGVmIGhhbmRsZV9waShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJwaSIsIGRhdGEpKQorCisgICAgZGVmIHVua25vd25fZGVjbChzZWxmLCBkZWNsKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJ1bmtub3duIGRlY2wiLCBkZWNsKSkKKworCitjbGFzcyBFdmVudENvbGxlY3RvckV4dHJhKEV2ZW50Q29sbGVjdG9yKToKKworICAgIGRlZiBoYW5kbGVfc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIEV2ZW50Q29sbGVjdG9yLmhhbmRsZV9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKQorICAgICAgICBzZWxmLmFwcGVuZCgoInN0YXJ0dGFnX3RleHQiLCBzZWxmLmdldF9zdGFydHRhZ190ZXh0KCkpKQorCisKK2NsYXNzIFRlc3RDYXNlQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX3J1bl9jaGVjayhzZWxmLCBzb3VyY2UsIGV4cGVjdGVkX2V2ZW50cywgY29sbGVjdG9yPUV2ZW50Q29sbGVjdG9yKToKKyAgICAgICAgcGFyc2VyID0gY29sbGVjdG9yKCkKKyAgICAgICAgZm9yIHMgaW4gc291cmNlOgorICAgICAgICAgICAgcGFyc2VyLmZlZWQocykKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKyAgICAgICAgZXZlbnRzID0gcGFyc2VyLmdldF9ldmVudHMoKQorICAgICAgICBpZiBldmVudHMgIT0gZXhwZWN0ZWRfZXZlbnRzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWNlaXZlZCBldmVudHMgZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBldmVudHNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQ6XG4iICsgcHByaW50LnBmb3JtYXQoZXhwZWN0ZWRfZXZlbnRzKSArCisgICAgICAgICAgICAgICAgICAgICAgIlxuUmVjZWl2ZWQ6XG4iICsgcHByaW50LnBmb3JtYXQoZXZlbnRzKSkKKworICAgIGRlZiBfcnVuX2NoZWNrX2V4dHJhKHNlbGYsIHNvdXJjZSwgZXZlbnRzKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKHNvdXJjZSwgZXZlbnRzLCBFdmVudENvbGxlY3RvckV4dHJhKQorCisgICAgZGVmIF9wYXJzZV9lcnJvcihzZWxmLCBzb3VyY2UpOgorICAgICAgICBkZWYgcGFyc2Uoc291cmNlPXNvdXJjZSk6CisgICAgICAgICAgICBwYXJzZXIgPSBIVE1MUGFyc2VyLkhUTUxQYXJzZXIoKQorICAgICAgICAgICAgcGFyc2VyLmZlZWQoc291cmNlKQorICAgICAgICAgICAgcGFyc2VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSFRNTFBhcnNlci5IVE1MUGFyc2VFcnJvciwgcGFyc2UpCisKKworY2xhc3MgSFRNTFBhcnNlclRlc3RDYXNlKFRlc3RDYXNlQmFzZSk6CisKKyAgICBkZWYgdGVzdF9wcm9jZXNzaW5nX2luc3RydWN0aW9uX29ubHkoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPD9wcm9jZXNzaW5nIGluc3RydWN0aW9uPiIsIFsKKyAgICAgICAgICAgICgicGkiLCAicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8P3Byb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gPz4iLCBbCisgICAgICAgICAgICAoInBpIiwgInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gPyIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9odG1sKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIiIiCis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgJ2Zvbyc+Cis8SFRNTD4mZW50aXR5OyYjMzI7Cis8IS0tY29tbWVudDFhCistPjwvZm9vPjxiYXI+Jmx0Ozw/cGk/PjwvZm9vPGJhcgorY29tbWVudDFiLS0+Cis8SW1nIHNSYz0nQmFyJyBpc01BUD5zYW1wbGUKK3RleHQKKyYjeDIwMUM7Cis8IS0tY29tbWVudDJhLS0gLS1jb21tZW50MmItLT4KKzwvSHRtbD4KKyIiIiwgWworICAgICgiZGF0YSIsICJcbiIpLAorICAgICgiZGVjbCIsICJET0NUWVBFIGh0bWwgUFVCTElDICdmb28nIiksCisgICAgKCJkYXRhIiwgIlxuIiksCisgICAgKCJzdGFydHRhZyIsICJodG1sIiwgW10pLAorICAgICgiZW50aXR5cmVmIiwgImVudGl0eSIpLAorICAgICgiY2hhcnJlZiIsICIzMiIpLAorICAgICgiZGF0YSIsICJcbiIpLAorICAgICgiY29tbWVudCIsICJjb21tZW50MWFcbi0+PC9mb28+PGJhcj4mbHQ7PD9waT8+PC9mb288YmFyXG5jb21tZW50MWIiKSwKKyAgICAoImRhdGEiLCAiXG4iKSwKKyAgICAoInN0YXJ0dGFnIiwgImltZyIsIFsoInNyYyIsICJCYXIiKSwgKCJpc21hcCIsIE5vbmUpXSksCisgICAgKCJkYXRhIiwgInNhbXBsZVxudGV4dFxuIiksCisgICAgKCJjaGFycmVmIiwgIngyMDFDIiksCisgICAgKCJkYXRhIiwgIlxuIiksCisgICAgKCJjb21tZW50IiwgImNvbW1lbnQyYS0tIC0tY29tbWVudDJiIiksCisgICAgKCJkYXRhIiwgIlxuIiksCisgICAgKCJlbmR0YWciLCAiaHRtbCIpLAorICAgICgiZGF0YSIsICJcbiIpLAorICAgIF0pCisKKyAgICBkZWYgdGVzdF91bmNsb3NlZF9lbnRpdHlyZWYoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiJmVudGl0eXJlZiBmb28iLCBbCisgICAgICAgICAgICAoImVudGl0eXJlZiIsICJlbnRpdHlyZWYiKSwKKyAgICAgICAgICAgICgiZGF0YSIsICIgZm9vIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYmFkX25lc3Rpbmcoc2VsZik6CisgICAgICAgICMgU3RyYW5nZWx5LCB0aGlzICppcyogc3VwcG9zZWQgdG8gdGVzdCB0aGF0IG92ZXJsYXBwaW5nCisgICAgICAgICMgZWxlbWVudHMgYXJlIGFsbG93ZWQuICBIVE1MUGFyc2VyIGlzIG1vcmUgZ2VhcmVkIHRvd2FyZAorICAgICAgICAjIGxleGluZyB0aGUgaW5wdXQgdGhhdCBwYXJzaW5nIHRoZSBzdHJ1Y3R1cmUuCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGE+PGI+PC9hPjwvYj4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbXSksCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImIiLCBbXSksCisgICAgICAgICAgICAoImVuZHRhZyIsICJhIiksCisgICAgICAgICAgICAoImVuZHRhZyIsICJiIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYmFyZV9hbXBlcnNhbmRzKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soInRoaXMgdGV4dCAmIGNvbnRhaW5zICYgYW1wZXJzYW5kcyAmIiwgWworICAgICAgICAgICAgKCJkYXRhIiwgInRoaXMgdGV4dCAmIGNvbnRhaW5zICYgYW1wZXJzYW5kcyAmIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYmFyZV9wb2ludHlfYnJhY2tldHMoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygidGhpcyA8IHRleHQgPiBjb250YWlucyA8IGJhcmU+cG9pbnR5PCBicmFja2V0cyIsIFsKKyAgICAgICAgICAgICgiZGF0YSIsICJ0aGlzIDwgdGV4dCA+IGNvbnRhaW5zIDwgYmFyZT5wb2ludHk8IGJyYWNrZXRzIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfaWxsZWdhbF9kZWNsYXJhdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygnPCFzcGFjZXIgdHlwZT0iYmxvY2siIGhlaWdodD0iMjUiPicsCisgICAgICAgICAgICAgICAgICAgICAgICBbKCdjb21tZW50JywgJ3NwYWNlciB0eXBlPSJibG9jayIgaGVpZ2h0PSIyNSInKV0pCisKKyAgICBkZWYgdGVzdF9zdGFydHRhZ19lbmRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiIiI8YSBiPSc8Jz4iIiIsIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKV0pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCIiIjxhIGI9Jz4nPiIiIiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPiIpXSldKQorCisgICAgZGVmIHRlc3RfYnVmZmVyX2FydGVmYWN0cyhzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpXSldCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhIGI9JzwnPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhICIsICJiPSc8Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8YSBiIiwgIj0nPCc+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgYj0iLCAiJzwnPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhIGI9JzwiLCAiJz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8YSBiPSc8JyIsICI+Il0sIG91dHB1dCkKKworICAgICAgICBvdXRwdXQgPSBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI+IildKV0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgYj0nPic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgIiwgImI9Jz4nPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhIGIiLCAiPSc+Jz4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8YSBiPSIsICInPic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPGEgYj0nPiIsICInPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjxhIGI9Jz4nIiwgIj4iXSwgb3V0cHV0KQorCisgICAgICAgIG91dHB1dCA9IFsoImNvbW1lbnQiLCAiYWJjIildCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIiIsICI8IS0tYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCIsICIhLS1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8ISIsICItLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLSIsICItYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLSIsICJhYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYSIsICJiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hYiIsICJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiYyIsICItLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjLSIsICItPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hYmMtLSIsICI+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiYy0tPiIsICIiXSwgb3V0cHV0KQorCisgICAgZGVmIHRlc3Rfc3RhcnR0YWdfanVua19jaGFycyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8Lz4iLCBbXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8LyQ+IiwgWygnY29tbWVudCcsICckJyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvIiwgWygnZGF0YScsICc8LycpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8L2EiLCBbKCdkYXRhJywgJzwvYScpXSkKKyAgICAgICAgIyBYWFggdGhpcyBtaWdodCBiZSB3cm9uZworICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhPGE+IiwgWygnZGF0YScsICc8YScpLCAoJ3N0YXJ0dGFnJywgJ2EnLCBbXSldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjwvYTxhPiIsIFsoJ2VuZHRhZycsICdhPGEnKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPCEiLCBbKCdkYXRhJywgJzwhJyldKQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhIiwgWygnZGF0YScsICc8YScpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSBmb289J2JhciciLCBbKCdkYXRhJywgIjxhIGZvbz0nYmFyJyIpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSBmb289J2JhciIsIFsoJ2RhdGEnLCAiPGEgZm9vPSdiYXIiKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgZm9vPSc+JyIsIFsoJ2RhdGEnLCAiPGEgZm9vPSc+JyIpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8YSBmb289Jz4iLCBbKCdkYXRhJywgIjxhIGZvbz0nPiIpXSkKKworICAgIGRlZiB0ZXN0X3ZhbGlkX2RvY3R5cGVzKHNlbGYpOgorICAgICAgICAjIGZyb20gaHR0cDovL3d3dy53My5vcmcvUUEvMjAwMi8wNC92YWxpZC1kdGQtbGlzdC5odG1sCisgICAgICAgIGR0ZHMgPSBbJ0hUTUwnLCAgIyBIVE1MNSBkb2N0eXBlCisgICAgICAgICAgICAgICAgKCdIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIgJworICAgICAgICAgICAgICAgICAnImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiJyksCisgICAgICAgICAgICAgICAgKCdIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICcKKyAgICAgICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiJyksCisgICAgICAgICAgICAgICAgKCdodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICcKKyAgICAgICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIicpLAorICAgICAgICAgICAgICAgICgnaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBGcmFtZXNldC8vRU4iICcKKyAgICAgICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1mcmFtZXNldC5kdGQiJyksCisgICAgICAgICAgICAgICAgKCdtYXRoIFBVQkxJQyAiLS8vVzNDLy9EVEQgTWF0aE1MIDIuMC8vRU4iICcKKyAgICAgICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy9NYXRoL0RURC9tYXRobWwyL21hdGhtbDIuZHRkIicpLAorICAgICAgICAgICAgICAgICgnaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREICcKKyAgICAgICAgICAgICAgICAgJ1hIVE1MIDEuMSBwbHVzIE1hdGhNTCAyLjAgcGx1cyBTVkcgMS4xLy9FTiIgJworICAgICAgICAgICAgICAgICAnImh0dHA6Ly93d3cudzMub3JnLzIwMDIvMDQveGh0bWwtbWF0aC1zdmcveGh0bWwtbWF0aC1zdmcuZHRkIicpLAorICAgICAgICAgICAgICAgICgnc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICcKKyAgICAgICAgICAgICAgICAgJyJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiJyksCisgICAgICAgICAgICAgICAgJ2h0bWwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTCAyLjAvL0VOIicsCisgICAgICAgICAgICAgICAgJ2h0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iJ10KKyAgICAgICAgZm9yIGR0ZCBpbiBkdGRzOgorICAgICAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8IURPQ1RZUEUgJXM+IiAlIGR0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCdkZWNsJywgJ0RPQ1RZUEUgJyArIGR0ZCldKQorCisgICAgZGVmIHRlc3Rfc2xhc2hlc19pbl9zdGFydHRhZyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCc8YSBmb289InZhciIvPicsIFsoJ3N0YXJ0ZW5kdGFnJywgJ2EnLCBbKCdmb28nLCAndmFyJyldKV0pCisgICAgICAgIGh0bWwgPSAoJzxpbWcgd2lkdGg9OTAyIGhlaWdodD0yNTBweCAnCisgICAgICAgICAgICAgICAgJ3NyYz0iL3NpdGVzL2RlZmF1bHQvZmlsZXMvaW1hZ2VzL2hvbWVwYWdlL2Zvby5qcGciICcKKyAgICAgICAgICAgICAgICAnLyp3aGF0IGFtIEkgZG9pbmcgaGVyZSovIC8+JykKKyAgICAgICAgZXhwZWN0ZWQgPSBbKAorICAgICAgICAgICAgJ3N0YXJ0ZW5kdGFnJywgJ2ltZycsCisgICAgICAgICAgICBbKCd3aWR0aCcsICc5MDInKSwgKCdoZWlnaHQnLCAnMjUwcHgnKSwKKyAgICAgICAgICAgICAoJ3NyYycsICcvc2l0ZXMvZGVmYXVsdC9maWxlcy9pbWFnZXMvaG9tZXBhZ2UvZm9vLmpwZycpLAorICAgICAgICAgICAgICgnKndoYXQnLCBOb25lKSwgKCdhbScsIE5vbmUpLCAoJ2knLCBOb25lKSwKKyAgICAgICAgICAgICAoJ2RvaW5nJywgTm9uZSksICgnaGVyZSonLCBOb25lKV0KKyAgICAgICAgKV0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorICAgICAgICBodG1sID0gKCc8YSAvIC9mb28vIC8gLz0vIC8gL2Jhci8gLyAvPicKKyAgICAgICAgICAgICAgICAnPGEgLyAvZm9vLyAvIC89LyAvIC9iYXIvIC8gPicpCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCdzdGFydGVuZHRhZycsICdhJywgWygnZm9vJywgTm9uZSksICgnPScsIE5vbmUpLCAoJ2JhcicsIE5vbmUpXSksCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2EnLCBbKCdmb28nLCBOb25lKSwgKCc9JywgTm9uZSksICgnYmFyJywgTm9uZSldKQorICAgICAgICBdCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKyAgICAgICAgI3NlZSBpc3N1ZSAjMTQ1MzgKKyAgICAgICAgaHRtbCA9ICgnPG1ldGE+PG1ldGEgLyA+PG1ldGEgLy8gPjxtZXRhIC8gLyA+JworICAgICAgICAgICAgICAgICc8bWV0YS8+PG1ldGEgLz48bWV0YSAvLz48bWV0YS8vPicpCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCdzdGFydHRhZycsICdtZXRhJywgW10pLCAoJ3N0YXJ0dGFnJywgJ21ldGEnLCBbXSksCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ21ldGEnLCBbXSksICgnc3RhcnR0YWcnLCAnbWV0YScsIFtdKSwKKyAgICAgICAgICAgICgnc3RhcnRlbmR0YWcnLCAnbWV0YScsIFtdKSwgKCdzdGFydGVuZHRhZycsICdtZXRhJywgW10pLAorICAgICAgICAgICAgKCdzdGFydGVuZHRhZycsICdtZXRhJywgW10pLCAoJ3N0YXJ0ZW5kdGFnJywgJ21ldGEnLCBbXSksCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZGVjbGFyYXRpb25fanVua19jaGFycyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8IURPQ1RZUEUgZm9vICQgPiIsIFsoJ2RlY2wnLCAnRE9DVFlQRSBmb28gJCAnKV0pCisKKyAgICBkZWYgdGVzdF9zdGFydGVuZHRhZyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8cC8+IiwgWworICAgICAgICAgICAgKCJzdGFydGVuZHRhZyIsICJwIiwgW10pLAorICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8cD48L3A+IiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJwIiwgW10pLAorICAgICAgICAgICAgKCJlbmR0YWciLCAicCIpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8cD48aW1nIHNyYz0nZm9vJyAvPjwvcD4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgInAiLCBbXSksCisgICAgICAgICAgICAoInN0YXJ0ZW5kdGFnIiwgImltZyIsIFsoInNyYyIsICJmb28iKV0pLAorICAgICAgICAgICAgKCJlbmR0YWciLCAicCIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZW5kX3RhZ3Moc2VsZik6CisgICAgICAgICMgQSBjb2xsZWN0aW9uIG9mIGJyb2tlbiBlbmQgdGFncy4gPGJyPiBpcyB1c2VkIGFzIHNlcGFyYXRvci4KKyAgICAgICAgIyBzZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvdG9rZW5pemF0aW9uLmh0bWwjZW5kLXRhZy1vcGVuLXN0YXRlCisgICAgICAgICMgYW5kICMxMzk5MworICAgICAgICBodG1sID0gKCc8YnI+PC9sYWJlbDwvcD48YnI+PC9kaXYgZW5kIHRtQWQtbGVhZGVyQm9hcmQ+PGJyPjwvPGg0Pjxicj4nCisgICAgICAgICAgICAgICAgJzwvbGkgY2xhc3M9InVuaXQiPjxicj48L2xpXHJcblx0XHRcdFx0XHRcdDwvdWw+PGJyPjwvPjxicj4nKQorICAgICAgICBleHBlY3RlZCA9IFsoJ3N0YXJ0dGFnJywgJ2JyJywgW10pLAorICAgICAgICAgICAgICAgICAgICAjIDwgaXMgcGFydCBvZiB0aGUgbmFtZSwgLyBpcyBkaXNjYXJkZWQsIHAgaXMgYW4gYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICgnZW5kdGFnJywgJ2xhYmVsPCcpLAorICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2JyJywgW10pLAorICAgICAgICAgICAgICAgICAgICAjIHRleHQgYW5kIGF0dHJpYnV0ZXMgYXJlIGRpc2NhcmRlZAorICAgICAgICAgICAgICAgICAgICAoJ2VuZHRhZycsICdkaXYnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzdGFydHRhZycsICdicicsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgIyBjb21tZW50IGJlY2F1c2UgdGhlIGZpcnN0IGNoYXIgYWZ0ZXIgPC8gaXMgbm90IGEtekEtWgorICAgICAgICAgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnPGg0JyksCisgICAgICAgICAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYnInLCBbXSksCisgICAgICAgICAgICAgICAgICAgICMgYXR0cmlidXRlcyBhcmUgZGlzY2FyZGVkCisgICAgICAgICAgICAgICAgICAgICgnZW5kdGFnJywgJ2xpJyksCisgICAgICAgICAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYnInLCBbXSksCisgICAgICAgICAgICAgICAgICAgICMgZXZlcnl0aGluZyB0aWxsIHVsIChpbmNsdWRlZCkgaXMgZGlzY2FyZGVkCisgICAgICAgICAgICAgICAgICAgICgnZW5kdGFnJywgJ2xpJyksCisgICAgICAgICAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYnInLCBbXSksCisgICAgICAgICAgICAgICAgICAgICMgPC8+IGlzIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgKCdzdGFydHRhZycsICdicicsIFtdKV0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfYnJva2VuX2ludmFsaWRfZW5kX3RhZyhzZWxmKToKKyAgICAgICAgIyBUaGlzIGlzIHRlY2huaWNhbGx5IHdyb25nICh0aGUgIj4gc2hvdWxkbid0IGJlIGluY2x1ZGVkIGluIHRoZSAnZGF0YScpCisgICAgICAgICMgYnV0IGlzIHByb2JhYmx5IG5vdCB3b3J0aCBmaXhpbmcgaXQgKGluIGFkZGl0aW9uIHRvIGFsbCB0aGUgY2FzZXMgb2YKKyAgICAgICAgIyB0aGUgcHJldmlvdXMgdGVzdCwgaXQgd291bGQgcmVxdWlyZSBhIGZ1bGwgYXR0cmlidXRlIHBhcnNpbmcpLgorICAgICAgICAjIHNlZSAjMTM5OTMKKyAgICAgICAgaHRtbCA9ICc8Yj5UaGlzPC9iIGF0dHI9Ij4iPiBjb25mdXNlcyB0aGUgcGFyc2VyJworICAgICAgICBleHBlY3RlZCA9IFsoJ3N0YXJ0dGFnJywgJ2InLCBbXSksCisgICAgICAgICAgICAgICAgICAgICgnZGF0YScsICdUaGlzJyksCisgICAgICAgICAgICAgICAgICAgICgnZW5kdGFnJywgJ2InKSwKKyAgICAgICAgICAgICAgICAgICAgKCdkYXRhJywgJyI+IGNvbmZ1c2VzIHRoZSBwYXJzZXInKV0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZ2V0X3N0YXJ0dGFnX3RleHQoc2VsZik6CisgICAgICAgIHMgPSAiIiI8Zm9vOmJhciAgIFxuICAgb25lPSIxIlx0dHdvPTIgICA+IiIiCisgICAgICAgIHNlbGYuX3J1bl9jaGVja19leHRyYShzLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImZvbzpiYXIiLCBbKCJvbmUiLCAiMSIpLCAoInR3byIsICIyIildKSwKKyAgICAgICAgICAgICgic3RhcnR0YWdfdGV4dCIsIHMpXSkKKworICAgIGRlZiB0ZXN0X2NkYXRhX2NvbnRlbnQoc2VsZik6CisgICAgICAgIGNvbnRlbnRzID0gWworICAgICAgICAgICAgJzwhLS0gbm90IGEgY29tbWVudCAtLT4gJm5vdC1hbi1lbnRpdHktcmVmOycsCisgICAgICAgICAgICAiPG5vdCBhPSdzdGFydCB0YWcnPiIsCisgICAgICAgICAgICAnPGEgaHJlZj0iIiAvPiA8cD4gPHNwYW4+PC9zcGFuPicsCisgICAgICAgICAgICAnZm9vID0gIjwvc2NyIiArICJpcHQ+IjsnLAorICAgICAgICAgICAgJ2ZvbyA9ICI8L1NDUklQVCIgKyAiPiI7JywKKyAgICAgICAgICAgICdmb28gPSA8XG4vc2NyaXB0PiAnLAorICAgICAgICAgICAgJzwhLS0gZG9jdW1lbnQud3JpdGUoIjwvc2NyIiArICJpcHQ+Iik7IC0tPicsCisgICAgICAgICAgICAoJ1xuLy88IVtDREFUQVtcbicKKyAgICAgICAgICAgICAnZG9jdW1lbnQud3JpdGUoXCc8c1wnK1wnY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAnCisgICAgICAgICAgICAgJ3NyYz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9yPVwnK25ldyAnCisgICAgICAgICAgICAgJ0RhdGUoKS5nZXRUaW1lKCkrXCciPjxcXC9zXCcrXCdjcmlwdD5cJyk7XG4vL11dPicpLAorICAgICAgICAgICAgJ1xuPCEtLSAvL1xudmFyIGZvbyA9IDMuMTQ7XG4vLyAtLT5cbicsCisgICAgICAgICAgICAnZm9vID0gIjwvc3R5IiArICJsZT4iOycsCisgICAgICAgICAgICB1JzwhLS0gXHUyNjAzIC0tPicsCisgICAgICAgICAgICAjIHRoZXNlIHR3byBzaG91bGQgYmUgaW52YWxpZCBhY2NvcmRpbmcgdG8gdGhlIEhUTUwgNSBzcGVjLAorICAgICAgICAgICAgIyBzZWN0aW9uIDguMS4yLjIKKyAgICAgICAgICAgICMnZm9vID0gPC9cbnNjcmlwdD4nLAorICAgICAgICAgICAgIydmb28gPSA8LyBzY3JpcHQ+JywKKyAgICAgICAgXQorICAgICAgICBlbGVtZW50cyA9IFsnc2NyaXB0JywgJ3N0eWxlJywgJ1NDUklQVCcsICdTVFlMRScsICdTY3JpcHQnLCAnU3R5bGUnXQorICAgICAgICBmb3IgY29udGVudCBpbiBjb250ZW50czoKKyAgICAgICAgICAgIGZvciBlbGVtZW50IGluIGVsZW1lbnRzOgorICAgICAgICAgICAgICAgIGVsZW1lbnRfbG93ZXIgPSBlbGVtZW50Lmxvd2VyKCkKKyAgICAgICAgICAgICAgICBzID0gdSc8e2VsZW1lbnR9Pntjb250ZW50fTwve2VsZW1lbnR9PicuZm9ybWF0KGVsZW1lbnQ9ZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ9Y29udGVudCkKKyAgICAgICAgICAgICAgICBzZWxmLl9ydW5fY2hlY2socywgWygic3RhcnR0YWciLCBlbGVtZW50X2xvd2VyLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImRhdGEiLCBjb250ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZW5kdGFnIiwgZWxlbWVudF9sb3dlcildKQorCisgICAgZGVmIHRlc3RfY2RhdGFfd2l0aF9jbG9zaW5nX3RhZ3Moc2VsZik6CisgICAgICAgICMgc2VlIGlzc3VlICMxMzM1OAorICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IEhUTUxQYXJzZXIgY2FsbHMgaGFuZGxlX2RhdGEgb25seSBvbmNlIGZvciBlYWNoIENEQVRBLgorICAgICAgICAjIFRoZSBub3JtYWwgZXZlbnQgY29sbGVjdG9yIG5vcm1hbGl6ZXMgdGhlIGV2ZW50cyBpbiBnZXRfZXZlbnRzLAorICAgICAgICAjIHNvIHdlIG92ZXJyaWRlIGl0IHRvIHJldHVybiB0aGUgb3JpZ2luYWwgbGlzdCBvZiBldmVudHMuCisgICAgICAgIGNsYXNzIENvbGxlY3RvcihFdmVudENvbGxlY3Rvcik6CisgICAgICAgICAgICBkZWYgZ2V0X2V2ZW50cyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5ldmVudHMKKworICAgICAgICBjb250ZW50ID0gIiIiPCEtLSBub3QgYSBjb21tZW50IC0tPiAmbm90LWFuLWVudGl0eS1yZWY7CisgICAgICAgICAgICAgICAgICA8YSBocmVmPSIiIC8+IDwvcD48cD4gJmFtcDsgPHNwYW4+PC9zcGFuPjwvc3R5bGU+CisgICAgICAgICAgICAgICAgICAnPC9zY3JpcHQnICsgJz4nIDwvaHRtbD4gPC9oZWFkPiA8L3NjcmlwdGVyPiEiIiIKKyAgICAgICAgZm9yIGVsZW1lbnQgaW4gWycgc2NyaXB0JywgJ3NjcmlwdCAnLCAnIHNjcmlwdCAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ1xuc2NyaXB0JywgJ3NjcmlwdFxuJywgJ1xuc2NyaXB0XG4nXToKKyAgICAgICAgICAgIHMgPSB1JzxzY3JpcHQ+e2NvbnRlbnR9PC97ZWxlbWVudH0+Jy5mb3JtYXQoZWxlbWVudD1lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50PWNvbnRlbnQpCisgICAgICAgICAgICBzZWxmLl9ydW5fY2hlY2socywgWygic3RhcnR0YWciLCAic2NyaXB0IiwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImRhdGEiLCBjb250ZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJlbmR0YWciLCAic2NyaXB0IildLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rvcj1Db2xsZWN0b3IpCisKKyAgICBkZWYgdGVzdF9tYWxmb3JtYXR0ZWRfY2hhcnJlZihzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8cD4mI2JhZDs8L3A+IiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJwIiwgW10pLAorICAgICAgICAgICAgKCJkYXRhIiwgIiYjYmFkOyIpLAorICAgICAgICAgICAgKCJlbmR0YWciLCAicCIpLAorICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfdW5lc2NhcGVfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIHBhcnNlciA9IEhUTUxQYXJzZXIuSFRNTFBhcnNlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLnVuZXNjYXBlKCcmI2JhZDsnKSwnJiNiYWQ7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIudW5lc2NhcGUoJyYjMDAzODsnKSwnJicpCisKKworCitjbGFzcyBBdHRyaWJ1dGVzVGVzdENhc2UoVGVzdENhc2VCYXNlKToKKworICAgIGRlZiB0ZXN0X2F0dHJfc3ludGF4KHNlbGYpOgorICAgICAgICBvdXRwdXQgPSBbCisgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICJ2IiksICgiYyIsICJ2IiksICgiZCIsICJ2IiksICgiZSIsIE5vbmUpXSkKKyAgICAgICAgXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soIiIiPGEgYj0ndicgYz0idiIgZD12IGU+IiIiLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiIiI8YSAgYiA9ICd2JyBjID0gInYiIGQgPSB2IGU+IiIiLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiIiI8YVxuYlxuPVxuJ3YnXG5jXG49XG4idiJcbmRcbj1cbnZcbmU+IiIiLCBvdXRwdXQpCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiIiI8YVx0Ylx0PVx0J3YnXHRjXHQ9XHQidiJcdGRcdD1cdHZcdGU+IiIiLCBvdXRwdXQpCisKKyAgICBkZWYgdGVzdF9hdHRyX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCIiIjxhIGI9J3h4eFxuXHR4eHgnIGM9Inl5eVx0XG55eXkiIGQ9J1x0eHl6XG4nPiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgInh4eFxuXHR4eHgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgInl5eVx0XG55eXkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgIlx0eHl6XG4iKV0pXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCIiIjxhIGI9JycgYz0iIj4iIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICIiKSwgKCJjIiwgIiIpXSldKQorICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgcGF0Y2ggIzY2OTY4My4KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCI8ZSBhPXJnYigxLDIsMyk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImUiLCBbKCJhIiwgInJnYigxLDIsMykiKV0pXSkKKyAgICAgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIGJ1ZyAjOTIxNjU3LgorICAgICAgICBzZWxmLl9ydW5fY2hlY2soCisgICAgICAgICAgICAiPGEgaHJlZj1tYWlsdG86eHl6QGV4YW1wbGUuY29tPiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygiaHJlZiIsICJtYWlsdG86eHl6QGV4YW1wbGUuY29tIildKV0pCisKKyAgICBkZWYgdGVzdF9hdHRyX25vbmFzY2lpKHNlbGYpOgorICAgICAgICAjIHNlZSBpc3N1ZSA3MzExCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygKKyAgICAgICAgICAgIHUiPGltZyBzcmM9L2Zvby9iYXIucG5nIGFsdD1cdTRlMmRcdTY1ODc+IiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImltZyIsIFsoInNyYyIsICIvZm9vL2Jhci5wbmciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImFsdCIsIHUiXHU0ZTJkXHU2NTg3IildKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygKKyAgICAgICAgICAgIHUiPGEgdGl0bGU9J1x1MzBjNlx1MzBiOVx1MzBjOCcgaHJlZj0nXHUzMGM2XHUzMGI5XHUzMGM4Lmh0bWwnPiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCB1Ilx1MzBjNlx1MzBiOVx1MzBjOCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhyZWYiLCB1Ilx1MzBjNlx1MzBiOVx1MzBjOC5odG1sIildKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygKKyAgICAgICAgICAgIHUnPGEgdGl0bGU9Ilx1MzBjNlx1MzBiOVx1MzBjOCIgaHJlZj0iXHUzMGM2XHUzMGI5XHUzMGM4Lmh0bWwiPicsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCB1Ilx1MzBjNlx1MzBiOVx1MzBjOCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImhyZWYiLCB1Ilx1MzBjNlx1MzBiOVx1MzBjOC5odG1sIildKV0pCisKKyAgICBkZWYgdGVzdF9hdHRyX2VudGl0eV9yZXBsYWNlbWVudChzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKAorICAgICAgICAgICAgIjxhIGI9JyZhbXA7Jmd0OyZsdDsmcXVvdDsmYXBvczsnPiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICImPjxcIiciKV0pXSkKKworICAgIGRlZiB0ZXN0X2F0dHJfZnVua3lfbmFtZXMoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygKKyAgICAgICAgICAgICI8YSBhLmI9J3YnIGM6ZD12IGUtZj12PiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygiYS5iIiwgInYiKSwgKCJjOmQiLCAidiIpLCAoImUtZiIsICJ2IildKV0pCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygKKyAgICAgICAgICAgICI8YSAkPjxiICQ9JT48YyBcPS8+IiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCIkIiwgTm9uZSldKSwKKyAgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImIiLCBbKCIkIiwgIiUiKV0pLAorICAgICAgICAgICAgICgic3RhcnR0YWciLCAiYyIsIFsoIlxcIiwgIi8iKV0pXSkKKworICAgIGRlZiB0ZXN0X2VudGl0eXJlZnNfaW5fYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKAorICAgICAgICAgICAgIjxodG1sIGZvbz0nJmV1cm87JmFtcDsmIzk3OyYjeDYxOyZ1bnN1cHBvcnRlZDsnPiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJodG1sIiwgWygiZm9vIiwgdSJcdTIwQUMmYWEmdW5zdXBwb3J0ZWQ7IildKV0pCisKKyAgICBkZWYgdGVzdF9lbnRpdGllc19pbl9hdHRyaWJ1dGVfdmFsdWUoc2VsZik6CisgICAgICAgICMgc2VlICMxMjAwMzEzCisgICAgICAgIGZvciBlbnRpdHkgaW4gWycmJywgJyZhbXA7JywgJyYjMzg7JywgJyYjeDI2OyddOgorICAgICAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCc8YSBocmVmPSIlcyI+JyAlIGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygiaHJlZiIsICImIildKV0pCisgICAgICAgICAgICBzZWxmLl9ydW5fY2hlY2soIjxhIGhyZWY9JyVzJz4iICUgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgIiYiKV0pXSkKKyAgICAgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgaHJlZj0lcz4iICUgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgIiYiKV0pXSkKKworICAgIGRlZiB0ZXN0X21hbGZvcm1lZF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHNlZSAjMTMzNTcKKyAgICAgICAgaHRtbCA9ICgKKyAgICAgICAgICAgICI8YSBocmVmPXRlc3Qnc3R5bGU9J2NvbG9yOnJlZDtiYWQxJz50ZXN0IC0gYmFkMTwvYT4iCisgICAgICAgICAgICAiPGEgaHJlZj10ZXN0JytzdHlsZT0nY29sb3I6cmVkO2JhMic+dGVzdCAtIGJhZDI8L2E+IgorICAgICAgICAgICAgIjxhIGhyZWY9dGVzdCcmbmJzcDtzdHlsZT0nY29sb3I6cmVkO2JhZDMnPnRlc3QgLSBiYWQzPC9hPiIKKyAgICAgICAgICAgICI8YSBocmVmID0gdGVzdCcmbmJzcDtzdHlsZT0nY29sb3I6cmVkO2JhZDQnICA+dGVzdCAtIGJhZDQ8L2E+IgorICAgICAgICApCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCdzdGFydHRhZycsICdhJywgWygnaHJlZicsICJ0ZXN0J3N0eWxlPSdjb2xvcjpyZWQ7YmFkMSciKV0pLAorICAgICAgICAgICAgKCdkYXRhJywgJ3Rlc3QgLSBiYWQxJyksICgnZW5kdGFnJywgJ2EnKSwKKyAgICAgICAgICAgICgnc3RhcnR0YWcnLCAnYScsIFsoJ2hyZWYnLCAidGVzdCcrc3R5bGU9J2NvbG9yOnJlZDtiYTInIildKSwKKyAgICAgICAgICAgICgnZGF0YScsICd0ZXN0IC0gYmFkMicpLCAoJ2VuZHRhZycsICdhJyksCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2EnLCBbKCdocmVmJywgdSJ0ZXN0J1x4YTBzdHlsZT0nY29sb3I6cmVkO2JhZDMnIildKSwKKyAgICAgICAgICAgICgnZGF0YScsICd0ZXN0IC0gYmFkMycpLCAoJ2VuZHRhZycsICdhJyksCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2EnLCBbKCdocmVmJywgdSJ0ZXN0J1x4YTBzdHlsZT0nY29sb3I6cmVkO2JhZDQnIildKSwKKyAgICAgICAgICAgICgnZGF0YScsICd0ZXN0IC0gYmFkNCcpLCAoJ2VuZHRhZycsICdhJykKKyAgICAgICAgXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9tYWxmb3JtZWRfYWRqYWNlbnRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgIyBzZWUgIzEyNjI5CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygnPHg+PHkgej0iIm8iIiAvPjwveD4nLAorICAgICAgICAgICAgICAgICAgICAgICAgWygnc3RhcnR0YWcnLCAneCcsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ3knLCBbKCd6JywgJycpLCAoJ28iIicsIE5vbmUpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdlbmR0YWcnLCAneCcpXSkKKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKCc8eD48eSB6PSIiIiIgLz48L3g+JywKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoJ3N0YXJ0dGFnJywgJ3gnLCBbXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdzdGFydGVuZHRhZycsICd5JywgWygneicsICcnKSwgKCciIicsIE5vbmUpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdlbmR0YWcnLCAneCcpXSkKKworICAgICMgc2VlICM3NTU2NzAgZm9yIHRoZSBmb2xsb3dpbmcgMyB0ZXN0cworICAgIGRlZiB0ZXN0X2FkamFjZW50X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygnPGEgd2lkdGg9IjEwMCUiY2VsbHNwYWNpbmc9MD4nLAorICAgICAgICAgICAgICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoIndpZHRoIiwgIjEwMCUiKSwgKCJjZWxsc3BhY2luZyIsIjAiKV0pXSkKKworICAgICAgICBzZWxmLl9ydW5fY2hlY2soJzxhIGlkPSJmb28iY2xhc3M9ImJhciI+JywKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJpZCIsICJmb28iKSwgKCJjbGFzcyIsImJhciIpXSldKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19hdHRyaWJ1dGVfdmFsdWUoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygnPGEgdj0+JywKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJ2IiwgIiIpXSldKQorCisgICAgZGVmIHRlc3RfamF2YXNjcmlwdF9hdHRyaWJ1dGVfdmFsdWUoc2VsZik6CisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgaHJlZj1qYXZhc2NyaXB0OnBvcHVwKCcvcG9wdXAvaGVscC5odG1sJyk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbKCJocmVmIiwgImphdmFzY3JpcHQ6cG9wdXAoJy9wb3B1cC9oZWxwLmh0bWwnKSIpXSldKQorCisgICAgZGVmIHRlc3RfZW5kX3RhZ19pbl9hdHRyaWJ1dGVfdmFsdWUoc2VsZik6CisgICAgICAgICMgc2VlICMxNzQ1NzYxCisgICAgICAgIHNlbGYuX3J1bl9jaGVjaygiPGEgaHJlZj0naHR0cDovL3d3dy5leGFtcGxlLm9yZy9cIj47Jz5zcGFtPC9hPiIsCisgICAgICAgICAgICAgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWygiaHJlZiIsICJodHRwOi8vd3d3LmV4YW1wbGUub3JnL1wiPjsiKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICgiZGF0YSIsICJzcGFtIiksICgiZW5kdGFnIiwgImEiKV0pCisKKyAgICBkZWYgdGVzdF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgaHRtbCA9ICgiPCEtLSBJJ20gYSB2YWxpZCBjb21tZW50IC0tPiIKKyAgICAgICAgICAgICAgICAnPCEtLW1lIHRvbyEtLT4nCisgICAgICAgICAgICAgICAgJzwhLS0tLS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLS0tPicKKyAgICAgICAgICAgICAgICAnPCEtLS0tSSBoYXZlIG1hbnkgaHlwaGVucy0tLS0+JworICAgICAgICAgICAgICAgICc8IS0tIEkgaGF2ZSBhID4gaW4gdGhlIG1pZGRsZSAtLT4nCisgICAgICAgICAgICAgICAgJzwhLS0gYW5kIEkgaGF2ZSAtLSBpbiB0aGUgbWlkZGxlISAtLT4nKQorICAgICAgICBleHBlY3RlZCA9IFsoJ2NvbW1lbnQnLCAiIEknbSBhIHZhbGlkIGNvbW1lbnQgIiksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICdtZSB0b28hJyksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICctLScpLAorICAgICAgICAgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnJyksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICctLUkgaGF2ZSBtYW55IGh5cGhlbnMtLScpLAorICAgICAgICAgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnIEkgaGF2ZSBhID4gaW4gdGhlIG1pZGRsZSAnKSwKKyAgICAgICAgICAgICAgICAgICAgKCdjb21tZW50JywgJyBhbmQgSSBoYXZlIC0tIGluIHRoZSBtaWRkbGUhICcpXQorICAgICAgICBzZWxmLl9ydW5fY2hlY2soaHRtbCwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9icm9rZW5fY29tbWVudHMoc2VsZik6CisgICAgICAgIGh0bWwgPSAoJzwhIG5vdCByZWFsbHkgYSBjb21tZW50ID4nCisgICAgICAgICAgICAgICAgJzwhIG5vdCBhIGNvbW1lbnQgZWl0aGVyIC0tPicKKyAgICAgICAgICAgICAgICAnPCEgLS0gY2xvc2UgZW5vdWdoIC0tPicKKyAgICAgICAgICAgICAgICAnPCE+PCE8LS0gdGhpcyB3YXMgYW4gZW1wdHkgY29tbWVudD4nCisgICAgICAgICAgICAgICAgJzwhISEgYW5vdGhlciBib2d1cyBjb21tZW50ICEhIT4nKQorICAgICAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgICgnY29tbWVudCcsICcgbm90IHJlYWxseSBhIGNvbW1lbnQgJyksCisgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnIG5vdCBhIGNvbW1lbnQgZWl0aGVyIC0tJyksCisgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnIC0tIGNsb3NlIGVub3VnaCAtLScpLAorICAgICAgICAgICAgKCdjb21tZW50JywgJycpLAorICAgICAgICAgICAgKCdjb21tZW50JywgJzwtLSB0aGlzIHdhcyBhbiBlbXB0eSBjb21tZW50JyksCisgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnISEgYW5vdGhlciBib2d1cyBjb21tZW50ICEhIScpLAorICAgICAgICBdCisgICAgICAgIHNlbGYuX3J1bl9jaGVjayhodG1sLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2NvbmRjb21zKHNlbGYpOgorICAgICAgICBodG1sID0gKCc8IS0tW2lmIElFICYgIShsdGUgSUUgOCldPmFyZW5cJ3Q8IVtlbmRpZl0tLT4nCisgICAgICAgICAgICAgICAgJzwhLS1baWYgSUUgOF0+Y29uZGNvbXM8IVtlbmRpZl0tLT4nCisgICAgICAgICAgICAgICAgJzwhLS1baWYgbHRlIElFIDddPnByZXR0eT88IVtlbmRpZl0tLT4nKQorICAgICAgICBleHBlY3RlZCA9IFsoJ2NvbW1lbnQnLCAiW2lmIElFICYgIShsdGUgSUUgOCldPmFyZW4ndDwhW2VuZGlmXSIpLAorICAgICAgICAgICAgICAgICAgICAoJ2NvbW1lbnQnLCAnW2lmIElFIDhdPmNvbmRjb21zPCFbZW5kaWZdJyksCisgICAgICAgICAgICAgICAgICAgICgnY29tbWVudCcsICdbaWYgbHRlIElFIDddPnByZXR0eT88IVtlbmRpZl0nKV0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfYnJva2VuX2NvbmRjb21zKHNlbGYpOgorICAgICAgICAjIHRoZXNlIGNvbmRjb21zIGFyZSBtaXNzaW5nIHRoZSAnLS0nIGFmdGVyICc8IScgYW5kIGJlZm9yZSB0aGUgJz4nCisgICAgICAgIGh0bWwgPSAoJzwhW2lmICEoSUUpXT5icm9rZW4gY29uZGNvbTwhW2VuZGlmXT4nCisgICAgICAgICAgICAgICAgJzwhW2lmICEgSUVdPjxsaW5rIGhyZWY9ImZhdmljb24udGlmZiIvPjwhW2VuZGlmXT4nCisgICAgICAgICAgICAgICAgJzwhW2lmICFJRSA2XT48aW1nIHNyYz0iZmlyZWZveC5wbmciIC8+PCFbZW5kaWZdPicKKyAgICAgICAgICAgICAgICAnPCFbaWYgIWllIDZdPjxiPmZvbzwvYj48IVtlbmRpZl0+JworICAgICAgICAgICAgICAgICc8IVtpZiAoIUlFKXwobHQgSUUgOSldPjxpbWcgc3JjPSJtYW1tb3RoLmJtcCIgLz48IVtlbmRpZl0+JykKKyAgICAgICAgIyBBY2NvcmRpbmcgdG8gdGhlIEhUTUw1IHNwZWNzIHNlY3Rpb25zICI4LjIuNC40NCBCb2d1cyBjb21tZW50IHN0YXRlIgorICAgICAgICAjIGFuZCAiOC4yLjQuNDUgTWFya3VwIGRlY2xhcmF0aW9uIG9wZW4gc3RhdGUiLCBjb21tZW50IHRva2VucyBzaG91bGQKKyAgICAgICAgIyBiZSBlbWl0dGVkIGluc3RlYWQgb2YgJ3Vua25vd24gZGVjbCcsIGJ1dCBjYWxsaW5nIHVua25vd25fZGVjbAorICAgICAgICAjIHByb3ZpZGVzIG1vcmUgZmxleGliaWxpdHkuCisgICAgICAgICMgU2VlIGFsc28gTGliL19tYXJrdXBiYXNlLnB5OnBhcnNlX2RlY2xhcmF0aW9uCisgICAgICAgIGV4cGVjdGVkID0gWworICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnaWYgIShJRSknKSwKKyAgICAgICAgICAgICgnZGF0YScsICdicm9rZW4gY29uZGNvbScpLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnZW5kaWYnKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2lmICEgSUUnKSwKKyAgICAgICAgICAgICgnc3RhcnRlbmR0YWcnLCAnbGluaycsIFsoJ2hyZWYnLCAnZmF2aWNvbi50aWZmJyldKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2VuZGlmJyksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdpZiAhSUUgNicpLAorICAgICAgICAgICAgKCdzdGFydGVuZHRhZycsICdpbWcnLCBbKCdzcmMnLCAnZmlyZWZveC5wbmcnKV0pLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnZW5kaWYnKSwKKyAgICAgICAgICAgICgndW5rbm93biBkZWNsJywgJ2lmICFpZSA2JyksCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2InLCBbXSksCisgICAgICAgICAgICAoJ2RhdGEnLCAnZm9vJyksCisgICAgICAgICAgICAoJ2VuZHRhZycsICdiJyksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdlbmRpZicpLAorICAgICAgICAgICAgKCd1bmtub3duIGRlY2wnLCAnaWYgKCFJRSl8KGx0IElFIDkpJyksCisgICAgICAgICAgICAoJ3N0YXJ0ZW5kdGFnJywgJ2ltZycsIFsoJ3NyYycsICdtYW1tb3RoLmJtcCcpXSksCisgICAgICAgICAgICAoJ3Vua25vd24gZGVjbCcsICdlbmRpZicpCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5fcnVuX2NoZWNrKGh0bWwsIGV4cGVjdGVkKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEhUTUxQYXJzZXJUZXN0Q2FzZSwgQXR0cmlidXRlc1Rlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0M2E4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHRtbHBhcnNlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0M2E4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0bWxwYXJzZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlODFhMmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5CkBAIC0wLDAgKzEsNTMyIEBACitpbXBvcnQgaHR0cGxpYgoraW1wb3J0IGFycmF5CitpbXBvcnQgaHR0cGxpYgoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgc29ja2V0CitpbXBvcnQgZXJybm8KKworaW1wb3J0IHVuaXR0ZXN0CitUZXN0Q2FzZSA9IHVuaXR0ZXN0LlRlc3RDYXNlCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK0hPU1QgPSB0ZXN0X3N1cHBvcnQuSE9TVAorCitjbGFzcyBGYWtlU29ja2V0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0LCBmaWxlY2xhc3M9U3RyaW5nSU8uU3RyaW5nSU8pOgorICAgICAgICBzZWxmLnRleHQgPSB0ZXh0CisgICAgICAgIHNlbGYuZmlsZWNsYXNzID0gZmlsZWNsYXNzCisgICAgICAgIHNlbGYuZGF0YSA9ICcnCisKKyAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhICs9ICcnLmpvaW4oZGF0YSkKKworICAgIGRlZiBtYWtlZmlsZShzZWxmLCBtb2RlLCBidWZzaXplPU5vbmUpOgorICAgICAgICBpZiBtb2RlICE9ICdyJyBhbmQgbW9kZSAhPSAncmInOgorICAgICAgICAgICAgcmFpc2UgaHR0cGxpYi5VbmltcGxlbWVudGVkRmlsZU1vZGUoKQorICAgICAgICByZXR1cm4gc2VsZi5maWxlY2xhc3Moc2VsZi50ZXh0KQorCitjbGFzcyBFUGlwZVNvY2tldChGYWtlU29ja2V0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0LCBwaXBlX3RyaWdnZXIpOgorICAgICAgICAjIFdoZW4gc2VuZGFsbCgpIGlzIGNhbGxlZCB3aXRoIHBpcGVfdHJpZ2dlciwgcmFpc2UgRVBJUEUuCisgICAgICAgIEZha2VTb2NrZXQuX19pbml0X18oc2VsZiwgdGV4dCkKKyAgICAgICAgc2VsZi5waXBlX3RyaWdnZXIgPSBwaXBlX3RyaWdnZXIKKworICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBzZWxmLnBpcGVfdHJpZ2dlciBpbiBkYXRhOgorICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yKGVycm5vLkVQSVBFLCAiZ290Y2hhIikKKyAgICAgICAgc2VsZi5kYXRhICs9IGRhdGEKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgcGFzcworCitjbGFzcyBOb0VPRlN0cmluZ0lPKFN0cmluZ0lPLlN0cmluZ0lPKToKKyAgICAiIiJMaWtlIFN0cmluZ0lPLCBidXQgcmFpc2VzIEFzc2VydGlvbkVycm9yIG9uIEVPRi4KKworICAgIFRoaXMgaXMgdXNlZCBiZWxvdyB0byB0ZXN0IHRoYXQgaHR0cGxpYiBkb2Vzbid0IHRyeSB0byByZWFkCisgICAgbW9yZSBmcm9tIHRoZSB1bmRlcmx5aW5nIGZpbGUgdGhhbiBpdCBzaG91bGQuCisgICAgIiIiCisgICAgZGVmIHJlYWQoc2VsZiwgbj0tMSk6CisgICAgICAgIGRhdGEgPSBTdHJpbmdJTy5TdHJpbmdJTy5yZWFkKHNlbGYsIG4pCisgICAgICAgIGlmIGRhdGEgPT0gJyc6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignY2FsbGVyIHRyaWVkIHRvIHJlYWQgcGFzdCBFT0YnKQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKToKKyAgICAgICAgZGF0YSA9IFN0cmluZ0lPLlN0cmluZ0lPLnJlYWRsaW5lKHNlbGYsIGxlbmd0aCkKKyAgICAgICAgaWYgZGF0YSA9PSAnJzoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdjYWxsZXIgdHJpZWQgdG8gcmVhZCBwYXN0IEVPRicpCisgICAgICAgIHJldHVybiBkYXRhCisKKworY2xhc3MgSGVhZGVyVGVzdHMoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2F1dG9faGVhZGVycyhzZWxmKToKKyAgICAgICAgIyBTb21lIGhlYWRlcnMgYXJlIGFkZGVkIGF1dG9tYXRpY2FsbHksIGJ1dCBzaG91bGQgbm90IGJlIGFkZGVkIGJ5CisgICAgICAgICMgLnJlcXVlc3QoKSBpZiB0aGV5IGFyZSBleHBsaWNpdGx5IHNldC4KKworICAgICAgICBjbGFzcyBIZWFkZXJDb3VudGluZ0J1ZmZlcihsaXN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmNvdW50ID0ge30KKyAgICAgICAgICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CisgICAgICAgICAgICAgICAga3YgPSBpdGVtLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICBpZiBsZW4oa3YpID4gMToKKyAgICAgICAgICAgICAgICAgICAgIyBpdGVtIGlzIGEgJ0tleTogVmFsdWUnIGhlYWRlciBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgbGNLZXkgPSBrdlswXS5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuY291bnQuc2V0ZGVmYXVsdChsY0tleSwgMCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb3VudFtsY0tleV0gKz0gMQorICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKHNlbGYsIGl0ZW0pCisKKyAgICAgICAgZm9yIGV4cGxpY2l0X2hlYWRlciBpbiBUcnVlLCBGYWxzZToKKyAgICAgICAgICAgIGZvciBoZWFkZXIgaW4gJ0NvbnRlbnQtbGVuZ3RoJywgJ0hvc3QnLCAnQWNjZXB0LWVuY29kaW5nJzoKKyAgICAgICAgICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICAgICAgICAgIGNvbm4uc29jayA9IEZha2VTb2NrZXQoJ2JsYWhibGFoYmxhaCcpCisgICAgICAgICAgICAgICAgY29ubi5fYnVmZmVyID0gSGVhZGVyQ291bnRpbmdCdWZmZXIoKQorCisgICAgICAgICAgICAgICAgYm9keSA9ICdzcGFtc3BhbXNwYW0nCisgICAgICAgICAgICAgICAgaGVhZGVycyA9IHt9CisgICAgICAgICAgICAgICAgaWYgZXhwbGljaXRfaGVhZGVyOgorICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2hlYWRlcl0gPSBzdHIobGVuKGJvZHkpKQorICAgICAgICAgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvJywgYm9keSwgaGVhZGVycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uX2J1ZmZlci5jb3VudFtoZWFkZXIubG93ZXIoKV0sIDEpCisKKyAgICBkZWYgdGVzdF9jb250ZW50X2xlbmd0aF8wKHNlbGYpOgorCisgICAgICAgIGNsYXNzIENvbnRlbnRMZW5ndGhDaGVja2VyKGxpc3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGxpc3QuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLmNvbnRlbnRfbGVuZ3RoID0gTm9uZQorICAgICAgICAgICAgZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKKyAgICAgICAgICAgICAgICBrdiA9IGl0ZW0uc3BsaXQoJzonLCAxKQorICAgICAgICAgICAgICAgIGlmIGxlbihrdikgPiAxIGFuZCBrdlswXS5sb3dlcigpID09ICdjb250ZW50LWxlbmd0aCc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29udGVudF9sZW5ndGggPSBrdlsxXS5zdHJpcCgpCisgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoc2VsZiwgaXRlbSkKKworICAgICAgICAjIFBPU1Qgd2l0aCBlbXB0eSBib2R5CisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIGNvbm4uc29jayA9IEZha2VTb2NrZXQoTm9uZSkKKyAgICAgICAgY29ubi5fYnVmZmVyID0gQ29udGVudExlbmd0aENoZWNrZXIoKQorICAgICAgICBjb25uLnJlcXVlc3QoJ1BPU1QnLCAnLycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uX2J1ZmZlci5jb250ZW50X2xlbmd0aCwgJzAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0hlYWRlciBDb250ZW50LUxlbmd0aCBub3Qgc2V0JykKKworICAgICAgICAjIFBVVCByZXF1ZXN0IHdpdGggZW1wdHkgYm9keQorICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICBjb25uLnNvY2sgPSBGYWtlU29ja2V0KE5vbmUpCisgICAgICAgIGNvbm4uX2J1ZmZlciA9IENvbnRlbnRMZW5ndGhDaGVja2VyKCkKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdQVVQnLCAnLycsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uX2J1ZmZlci5jb250ZW50X2xlbmd0aCwgJzAnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0hlYWRlciBDb250ZW50LUxlbmd0aCBub3Qgc2V0JykKKworICAgIGRlZiB0ZXN0X3B1dGhlYWRlcihzZWxmKToKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ2V4YW1wbGUuY29tJykKKyAgICAgICAgY29ubi5zb2NrID0gRmFrZVNvY2tldChOb25lKQorICAgICAgICBjb25uLnB1dHJlcXVlc3QoJ0dFVCcsJy8nKQorICAgICAgICBjb25uLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0NvbnRlbnQtbGVuZ3RoOiA0MicgaW4gY29ubi5fYnVmZmVyKQorCisgICAgZGVmIHRlc3RfaXB2Nmhvc3RfaGVhZGVyKHNlbGYpOgorICAgICAgICAjIERlZmF1bHQgaG9zdCBoZWFkZXIgb24gSVB2NiB0cmFuc2FjdGlvbiBzaG91bGQgd3JhcHBlZCBieSBbXSBpZgorICAgICAgICAjIGl0cyBhY3R1YWwgSVB2NiBhZGRyZXNzCisgICAgICAgIGV4cGVjdGVkID0gJ0dFVCAvZm9vIEhUVFAvMS4xXHJcbkhvc3Q6IFsyMDAxOjpdOjgxXHJcbicgXAorICAgICAgICAgICAgICAgICAgICdBY2NlcHQtRW5jb2Rpbmc6IGlkZW50aXR5XHJcblxyXG4nCisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdbMjAwMTo6XTo4MScpCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KCcnKQorICAgICAgICBjb25uLnNvY2sgPSBzb2NrCisgICAgICAgIGNvbm4ucmVxdWVzdCgnR0VUJywgJy9mb28nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29jay5kYXRhLnN0YXJ0c3dpdGgoZXhwZWN0ZWQpKQorCisgICAgICAgIGV4cGVjdGVkID0gJ0dFVCAvZm9vIEhUVFAvMS4xXHJcbkhvc3Q6IFsyMDAxOjEwMkE6Ol1cclxuJyBcCisgICAgICAgICAgICAgICAgICAgJ0FjY2VwdC1FbmNvZGluZzogaWRlbnRpdHlcclxuXHJcbicKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oJ1syMDAxOjEwMkE6Ol0nKQorICAgICAgICBzb2NrID0gRmFrZVNvY2tldCgnJykKKyAgICAgICAgY29ubi5zb2NrID0gc29jaworICAgICAgICBjb25uLnJlcXVlc3QoJ0dFVCcsICcvZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2suZGF0YS5zdGFydHN3aXRoKGV4cGVjdGVkKSkKKworCitjbGFzcyBCYXNpY1Rlc3QoVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3N0YXR1c19saW5lcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IEhUVFAgc3RhdHVzIGxpbmVzCisKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuXHJcblRleHQiCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoKSwgJ1RleHQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorCisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgNDAwLjEwMCBOb3QgT2tcclxuXHJcblRleHQiCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhodHRwbGliLkJhZFN0YXR1c0xpbmUsIHJlc3AuYmVnaW4pCisKKyAgICBkZWYgdGVzdF9iYWRfc3RhdHVzX3JlcHIoc2VsZik6CisgICAgICAgIGV4YyA9IGh0dHBsaWIuQmFkU3RhdHVzTGluZSgnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGV4YyksICcnJ0JhZFN0YXR1c0xpbmUoIlwnXCciLCknJycpCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsX3JlYWRzKHNlbGYpOgorICAgICAgICAjIGlmIHdlIGhhdmUgYSBsZW5ndGgsIHRoZSBzeXN0ZW0ga25vd3Mgd2hlbiB0byBjbG9zZSBpdHNlbGYKKyAgICAgICAgIyBzYW1lIGJlaGF2aW91ciB0aGFuIHdoZW4gd2UgcmVhZCB0aGUgd2hvbGUgdGhpbmcgd2l0aCByZWFkKCkKKyAgICAgICAgYm9keSA9ICJIVFRQLzEuMSAyMDAgT2tcclxuQ29udGVudC1MZW5ndGg6IDRcclxuXHJcblRleHQiCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMiksICdUZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzcC5pc2Nsb3NlZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgyKSwgJ3h0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKKworICAgIGRlZiB0ZXN0X3BhcnRpYWxfcmVhZHNfbm9fY29udGVudF9sZW5ndGgoc2VsZik6CisgICAgICAgICMgd2hlbiBubyBsZW5ndGggaXMgcHJlc2VudCwgdGhlIHNvY2tldCBzaG91bGQgYmUgZ3JhY2VmdWxseSBjbG9zZWQgd2hlbgorICAgICAgICAjIGFsbCBkYXRhIHdhcyByZWFkCisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgMjAwIE9rXHJcblxyXG5UZXh0IgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDIpLCAnVGUnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3AuaXNjbG9zZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoMiksICd4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDEpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKKworICAgIGRlZiB0ZXN0X3BhcnRpYWxfcmVhZHNfaW5jb21wbGV0ZV9ib2R5KHNlbGYpOgorICAgICAgICAjIGlmIHRoZSBzZXJ2ZXIgc2h1dHMgZG93biB0aGUgY29ubmVjdGlvbiBiZWZvcmUgdGhlIHdob2xlCisgICAgICAgICMgY29udGVudC1sZW5ndGggaXMgZGVsaXZlcmVkLCB0aGUgc29ja2V0IGlzIGdyYWNlZnVsbHkgY2xvc2VkCisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgMjAwIE9rXHJcbkNvbnRlbnQtTGVuZ3RoOiAxMFxyXG5cclxuVGV4dCIKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2spCisgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgyKSwgJ1RlJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXNwLmlzY2xvc2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKDIpLCAneHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgxKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwLmlzY2xvc2VkKCkpCisKKyAgICBkZWYgdGVzdF9ob3N0X3BvcnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgaW52YWxpZCBob3N0X3BvcnQKKworICAgICAgICAjIE5vdGUgdGhhdCBodHRwbGliIGRvZXMgbm90IGFjY2VwdCB1c2VyOnBhc3N3b3JkQCBpbiB0aGUgaG9zdC1wb3J0LgorICAgICAgICBmb3IgaHAgaW4gKCJ3d3cucHl0aG9uLm9yZzphYmMiLCAidXNlcjpwYXNzd29yZEB3d3cucHl0aG9uLm9yZyIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoaHR0cGxpYi5JbnZhbGlkVVJMLCBodHRwbGliLkhUVFAsIGhwKQorCisgICAgICAgIGZvciBocCwgaCwgcCBpbiAoKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl06ODAwMCIsICJmZTgwOjoyMDc6ZTlmZjpmZTliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJ3d3cucHl0aG9uLm9yZzo4MCIsICJ3d3cucHl0aG9uLm9yZyIsIDgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoInd3dy5weXRob24ub3JnIiwgInd3dy5weXRob24ub3JnIiwgODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgid3d3LnB5dGhvbi5vcmc6IiwgInd3dy5weXRob24ub3JnIiwgODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgiW2ZlODA6OjIwNzplOWZmOmZlOWJdIiwgImZlODA6OjIwNzplOWZmOmZlOWIiLCA4MCkpOgorICAgICAgICAgICAgaHR0cCA9IGh0dHBsaWIuSFRUUChocCkKKyAgICAgICAgICAgIGMgPSBodHRwLl9jb25uCisgICAgICAgICAgICBpZiBoICE9IGMuaG9zdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkhvc3QgaW5jb3JyZWN0bHkgcGFyc2VkOiAlcyAhPSAlcyIgJSAoaCwgYy5ob3N0KSkKKyAgICAgICAgICAgIGlmIHAgIT0gYy5wb3J0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUG9ydCBpbmNvcnJlY3RseSBwYXJzZWQ6ICVzICE9ICVzIiAlIChwLCBjLmhvc3QpKQorCisgICAgZGVmIHRlc3RfcmVzcG9uc2VfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHJlc3BvbnNlIHdpdGggbXVsdGlwbGUgbWVzc2FnZSBoZWFkZXJzIHdpdGggdGhlIHNhbWUgZmllbGQgbmFtZS4KKyAgICAgICAgdGV4dCA9ICgnSFRUUC8xLjEgMjAwIE9LXHJcbicKKyAgICAgICAgICAgICAgICAnU2V0LUNvb2tpZTogQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOycKKyAgICAgICAgICAgICAgICAnIFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSJcclxuJworICAgICAgICAgICAgICAgICdTZXQtQ29va2llOiBQYXJ0X051bWJlcj0iUm9ja2V0X0xhdW5jaGVyXzAwMDEiOyBWZXJzaW9uPSIxIjsnCisgICAgICAgICAgICAgICAgJyBQYXRoPSIvYWNtZSJcclxuJworICAgICAgICAgICAgICAgICdcclxuJworICAgICAgICAgICAgICAgICdObyBib2R5XHJcbicpCisgICAgICAgIGhkciA9ICgnQ3VzdG9tZXI9IldJTEVfRV9DT1lPVEUiOyBWZXJzaW9uPSIxIjsgUGF0aD0iL2FjbWUiJworICAgICAgICAgICAgICAgJywgJworICAgICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7IFZlcnNpb249IjEiOyBQYXRoPSIvYWNtZSInKQorICAgICAgICBzID0gRmFrZVNvY2tldCh0ZXh0KQorICAgICAgICByID0gaHR0cGxpYi5IVFRQUmVzcG9uc2UocykKKyAgICAgICAgci5iZWdpbigpCisgICAgICAgIGNvb2tpZXMgPSByLmdldGhlYWRlcigiU2V0LUNvb2tpZSIpCisgICAgICAgIGlmIGNvb2tpZXMgIT0gaGRyOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJtdWx0aXBsZSBoZWFkZXJzIG5vdCBjb21iaW5lZCBwcm9wZXJseSIpCisKKyAgICBkZWYgdGVzdF9yZWFkX2hlYWQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBsaWJyYXJ5IGRvZXNuJ3QgYXR0ZW1wdCB0byByZWFkIGFueSBkYXRhCisgICAgICAgICMgZnJvbSBhIEhFQUQgcmVxdWVzdC4gIChUaWNrbGVzIFNGIGJ1ZyAjNjIyMDQyLikKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoCisgICAgICAgICAgICAnSFRUUC8xLjEgMjAwIE9LXHJcbicKKyAgICAgICAgICAgICdDb250ZW50LUxlbmd0aDogMTQ0MzJcclxuJworICAgICAgICAgICAgJ1xyXG4nLAorICAgICAgICAgICAgTm9FT0ZTdHJpbmdJTykKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iSEVBRCIpCisgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICBpZiByZXNwLnJlYWQoKSAhPSAiIjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkIG5vdCBleHBlY3QgcmVzcG9uc2UgZnJvbSBIRUFEIHJlcXVlc3QiKQorCisgICAgZGVmIHRlc3Rfc2VuZF9maWxlKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICdHRVQgL2ZvbyBIVFRQLzEuMVxyXG5Ib3N0OiBleGFtcGxlLmNvbVxyXG4nIFwKKyAgICAgICAgICAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nOiBpZGVudGl0eVxyXG5Db250ZW50LUxlbmd0aDonCisKKyAgICAgICAgYm9keSA9IG9wZW4oX19maWxlX18sICdyYicpCisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdleGFtcGxlLmNvbScpCisgICAgICAgIHNvY2sgPSBGYWtlU29ja2V0KGJvZHkpCisgICAgICAgIGNvbm4uc29jayA9IHNvY2sKKyAgICAgICAgY29ubi5yZXF1ZXN0KCdHRVQnLCAnL2ZvbycsIGJvZHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrLmRhdGEuc3RhcnRzd2l0aChleHBlY3RlZCkpCisKKyAgICBkZWYgdGVzdF9zZW5kKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICd0aGlzIGlzIGEgdGVzdCB0aGlzIGlzIG9ubHkgYSB0ZXN0JworICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignZXhhbXBsZS5jb20nKQorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChOb25lKQorICAgICAgICBjb25uLnNvY2sgPSBzb2NrCisgICAgICAgIGNvbm4uc2VuZChleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgc29jay5kYXRhKQorICAgICAgICBzb2NrLmRhdGEgPSAnJworICAgICAgICBjb25uLnNlbmQoYXJyYXkuYXJyYXkoJ2MnLCBleHBlY3RlZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHNvY2suZGF0YSkKKyAgICAgICAgc29jay5kYXRhID0gJycKKyAgICAgICAgY29ubi5zZW5kKFN0cmluZ0lPLlN0cmluZ0lPKGV4cGVjdGVkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgc29jay5kYXRhKQorCisgICAgZGVmIHRlc3RfY2h1bmtlZChzZWxmKToKKyAgICAgICAgY2h1bmtlZF9zdGFydCA9ICgKKyAgICAgICAgICAgICdIVFRQLzEuMSAyMDAgT0tcclxuJworICAgICAgICAgICAgJ1RyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcblxyXG4nCisgICAgICAgICAgICAnYVxyXG4nCisgICAgICAgICAgICAnaGVsbG8gd29ybFxyXG4nCisgICAgICAgICAgICAnMVxyXG4nCisgICAgICAgICAgICAnZFxyXG4nCisgICAgICAgICkKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoY2h1bmtlZF9zdGFydCArICcwXHJcbicpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrLCBtZXRob2Q9IkdFVCIpCisgICAgICAgIHJlc3AuYmVnaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3AucmVhZCgpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICByZXNwLmNsb3NlKCkKKworICAgICAgICBmb3IgeCBpbiAoJycsICdmb29cclxuJyk6CisgICAgICAgICAgICBzb2NrID0gRmFrZVNvY2tldChjaHVua2VkX3N0YXJ0ICsgeCkKKyAgICAgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrLCBtZXRob2Q9IkdFVCIpCisgICAgICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXNwLnJlYWQoKQorICAgICAgICAgICAgZXhjZXB0IGh0dHBsaWIuSW5jb21wbGV0ZVJlYWQsIGk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLnBhcnRpYWwsICdoZWxsbyB3b3JsZCcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGkpLCdJbmNvbXBsZXRlUmVhZCgxMSBieXRlcyByZWFkKScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaSksJ0luY29tcGxldGVSZWFkKDExIGJ5dGVzIHJlYWQpJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdJbmNvbXBsZXRlUmVhZCBleHBlY3RlZCcpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlc3AuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfY2h1bmtlZF9oZWFkKHNlbGYpOgorICAgICAgICBjaHVua2VkX3N0YXJ0ID0gKAorICAgICAgICAgICAgJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCisgICAgICAgICAgICAnVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcclxuXHJcbicKKyAgICAgICAgICAgICdhXHJcbicKKyAgICAgICAgICAgICdoZWxsbyB3b3JsZFxyXG4nCisgICAgICAgICAgICAnMVxyXG4nCisgICAgICAgICAgICAnZFxyXG4nCisgICAgICAgICkKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoY2h1bmtlZF9zdGFydCArICcwXHJcbicpCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShzb2NrLCBtZXRob2Q9IkhFQUQiKQorICAgICAgICByZXNwLmJlZ2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYWQoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5zdGF0dXMsIDIwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwLnJlYXNvbiwgJ09LJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKKworICAgIGRlZiB0ZXN0X25lZ2F0aXZlX2NvbnRlbnRfbGVuZ3RoKHNlbGYpOgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldCgnSFRUUC8xLjEgMjAwIE9LXHJcbicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoOiAtMVxyXG5cclxuSGVsbG9cclxuJykKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iR0VUIikKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKCksICdIZWxsb1xyXG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorCisgICAgZGVmIHRlc3RfaW5jb21wbGV0ZV9yZWFkKHNlbGYpOgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldCgnSFRUUC8xLjEgMjAwIE9LXHJcbkNvbnRlbnQtTGVuZ3RoOiAxMFxyXG5cclxuSGVsbG9cclxuJykKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2ssIG1ldGhvZD0iR0VUIikKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3AucmVhZCgpCisgICAgICAgIGV4Y2VwdCBodHRwbGliLkluY29tcGxldGVSZWFkIGFzIGk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkucGFydGlhbCwgJ0hlbGxvXHJcbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBsZXRlUmVhZCg3IGJ5dGVzIHJlYWQsIDMgbW9yZSBleHBlY3RlZCkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvbXBsZXRlUmVhZCg3IGJ5dGVzIHJlYWQsIDMgbW9yZSBleHBlY3RlZCkiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3AuaXNjbG9zZWQoKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnSW5jb21wbGV0ZVJlYWQgZXhwZWN0ZWQnKQorCisgICAgZGVmIHRlc3RfZXBpcGUoc2VsZik6CisgICAgICAgIHNvY2sgPSBFUGlwZVNvY2tldCgKKyAgICAgICAgICAgICJIVFRQLzEuMCA0MDEgQXV0aG9yaXphdGlvbiBSZXF1aXJlZFxyXG4iCisgICAgICAgICAgICAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWxcclxuIgorICAgICAgICAgICAgIldXVy1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPVwiZXhhbXBsZVwiXHJcbiIsCisgICAgICAgICAgICBiIkNvbnRlbnQtTGVuZ3RoIikKKyAgICAgICAgY29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oImV4YW1wbGUuY29tIikKKyAgICAgICAgY29ubi5zb2NrID0gc29jaworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogY29ubi5yZXF1ZXN0KCJQVVQiLCAiL3VybCIsICJib2R5IikpCisgICAgICAgIHJlc3AgPSBjb25uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MDEsIHJlc3Auc3RhdHVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJCYXNpYyByZWFsbT1cImV4YW1wbGVcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5nZXRoZWFkZXIoInd3dy1hdXRoZW50aWNhdGUiKSkKKworICAgIGRlZiB0ZXN0X2ZpbGVub2F0dHIoc2VsZik6CisgICAgICAgICMgSnVzdCB0ZXN0IHRoZSBmaWxlbm8gYXR0cmlidXRlIGluIHRoZSBIVFRQUmVzcG9uc2UgT2JqZWN0LgorICAgICAgICBib2R5ID0gIkhUVFAvMS4xIDIwMCBPa1xyXG5cclxuVGV4dCIKKyAgICAgICAgc29jayA9IEZha2VTb2NrZXQoYm9keSkKKyAgICAgICAgcmVzcCA9IGh0dHBsaWIuSFRUUFJlc3BvbnNlKHNvY2spCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHJlc3AsJ2ZpbGVubycpLAorICAgICAgICAgICAgICAgICdIVFRQUmVzcG9uc2Ugc2hvdWxkIGV4cG9zZSBhIGZpbGVubyBhdHRyaWJ1dGUnKQorCisgICAgIyBUZXN0IGxpbmVzIG92ZXJmbG93aW5nIHRoZSBtYXggbGluZSBzaXplIChfTUFYTElORSBpbiBodHRwLmNsaWVudCkKKworICAgIGRlZiB0ZXN0X292ZXJmbG93aW5nX3N0YXR1c19saW5lKHNlbGYpOgorICAgICAgICBzZWxmLnNraXBUZXN0KCJkaXNhYmxlZCBmb3IgSFRUUCAwLjkgc3VwcG9ydCIpCisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgMjAwIE9rIiArICJrIiAqIDY1NTM2ICsgIlxyXG4iCisgICAgICAgIHJlc3AgPSBodHRwbGliLkhUVFBSZXNwb25zZShGYWtlU29ja2V0KGJvZHkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoaHR0cGxpYi5MaW5lVG9vTG9uZywgaHR0cGxpYi5CYWRTdGF0dXNMaW5lKSwgcmVzcC5iZWdpbikKKworICAgIGRlZiB0ZXN0X292ZXJmbG93aW5nX2hlYWRlcl9saW5lKHNlbGYpOgorICAgICAgICBib2R5ID0gKAorICAgICAgICAgICAgJ0hUVFAvMS4xIDIwMCBPS1xyXG4nCisgICAgICAgICAgICAnWC1Gb286IGJhcicgKyAncicgKiA2NTUzNiArICdcclxuXHJcbicKKyAgICAgICAgKQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2UoRmFrZVNvY2tldChib2R5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoaHR0cGxpYi5MaW5lVG9vTG9uZywgcmVzcC5iZWdpbikKKworICAgIGRlZiB0ZXN0X292ZXJmbG93aW5nX2NodW5rZWRfbGluZShzZWxmKToKKyAgICAgICAgYm9keSA9ICgKKyAgICAgICAgICAgICdIVFRQLzEuMSAyMDAgT0tcclxuJworICAgICAgICAgICAgJ1RyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcblxyXG4nCisgICAgICAgICAgICArICcwJyAqIDY1NTM2ICsgJ2FcclxuJworICAgICAgICAgICAgJ2hlbGxvIHdvcmxkXHJcbicKKyAgICAgICAgICAgICcwXHJcbicKKyAgICAgICAgKQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2UoRmFrZVNvY2tldChib2R5KSkKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGh0dHBsaWIuTGluZVRvb0xvbmcsIHJlc3AucmVhZCkKKworICAgIGRlZiB0ZXN0X2Vhcmx5X2VvZihzZWxmKToKKyAgICAgICAgIyBUZXN0IGh0dHByZXNwb25zZSB3aXRoIG5vIFxyXG4gdGVybWluYXRpb24sCisgICAgICAgIGJvZHkgPSAiSFRUUC8xLjEgMjAwIE9rIgorICAgICAgICBzb2NrID0gRmFrZVNvY2tldChib2R5KQorICAgICAgICByZXNwID0gaHR0cGxpYi5IVFRQUmVzcG9uc2Uoc29jaykKKyAgICAgICAgcmVzcC5iZWdpbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcC5yZWFkKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcC5pc2Nsb3NlZCgpKQorCitjbGFzcyBPZmZsaW5lVGVzdChUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVzcG9uc2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHBsaWIucmVzcG9uc2VzW2h0dHBsaWIuTk9UX0ZPVU5EXSwgIk5vdCBGb3VuZCIpCisKKworY2xhc3MgU291cmNlQWRkcmVzc1Rlc3QoVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc2VydikKKyAgICAgICAgc2VsZi5zb3VyY2VfcG9ydCA9IHRlc3Rfc3VwcG9ydC5maW5kX3VudXNlZF9wb3J0KCkKKyAgICAgICAgc2VsZi5zZXJ2Lmxpc3Rlbig1KQorICAgICAgICBzZWxmLmNvbm4gPSBOb25lCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuY29ubjoKKyAgICAgICAgICAgIHNlbGYuY29ubi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmNvbm4gPSBOb25lCisgICAgICAgIHNlbGYuc2Vydi5jbG9zZSgpCisgICAgICAgIHNlbGYuc2VydiA9IE5vbmUKKworICAgIGRlZiB0ZXN0SFRUUENvbm5lY3Rpb25Tb3VyY2VBZGRyZXNzKHNlbGYpOgorICAgICAgICBzZWxmLmNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEhPU1QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz0oJycsIHNlbGYuc291cmNlX3BvcnQpKQorICAgICAgICBzZWxmLmNvbm4uY29ubmVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jb25uLnNvY2suZ2V0c29ja25hbWUoKVsxXSwgc2VsZi5zb3VyY2VfcG9ydCkKKworICAgIEB1bml0dGVzdC5za2lwSWYobm90IGhhc2F0dHIoaHR0cGxpYiwgJ0hUVFBTQ29ubmVjdGlvbicpLAorICAgICAgICAgICAgICAgICAgICAgJ2h0dHBsaWIuSFRUUFNDb25uZWN0aW9uIG5vdCBkZWZpbmVkJykKKyAgICBkZWYgdGVzdEhUVFBTQ29ubmVjdGlvblNvdXJjZUFkZHJlc3Moc2VsZik6CisgICAgICAgIHNlbGYuY29ubiA9IGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKEhPU1QsIHNlbGYucG9ydCwKKyAgICAgICAgICAgICAgICBzb3VyY2VfYWRkcmVzcz0oJycsIHNlbGYuc291cmNlX3BvcnQpKQorICAgICAgICAjIFdlIGRvbid0IHRlc3QgYW55dGhpbmcgaGVyZSBvdGhlciB0aGUgY29uc3RydWN0b3Igbm90IGJhcmZpbmcgYXMKKyAgICAgICAgIyB0aGlzIGNvZGUgZG9lc24ndCBkZWFsIHdpdGggc2V0dGluZyB1cCBhbiBhY3RpdmUgcnVubmluZyBTU0wgc2VydmVyCisgICAgICAgICMgZm9yIGFuIHNzbF93cmFwcGVkIGNvbm5lY3QoKSB0byBhY3R1YWxseSByZXR1cm4gZnJvbS4KKworCitjbGFzcyBUaW1lb3V0VGVzdChUZXN0Q2FzZSk6CisgICAgUE9SVCA9IE5vbmUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBUaW1lb3V0VGVzdC5QT1JUID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNlcnYpCisgICAgICAgIHNlbGYuc2Vydi5saXN0ZW4oNSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ID0gTm9uZQorCisgICAgZGVmIHRlc3RUaW1lb3V0QXR0cmlidXRlKHNlbGYpOgorICAgICAgICAnJydUaGlzIHdpbGwgcHJvdmUgdGhhdCB0aGUgdGltZW91dCBnZXRzIHRocm91Z2gKKyAgICAgICAgSFRUUENvbm5lY3Rpb24gYW5kIGludG8gdGhlIHNvY2tldC4KKyAgICAgICAgJycnCisgICAgICAgICMgZGVmYXVsdCAtLSB1c2UgZ2xvYmFsIHNvY2tldCB0aW1lb3V0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGh0dHBDb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihIT1NULCBUaW1lb3V0VGVzdC5QT1JUKQorICAgICAgICAgICAgaHR0cENvbm4uY29ubmVjdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwQ29ubi5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIGh0dHBDb25uLmNsb3NlKCkKKworICAgICAgICAjIG5vIHRpbWVvdXQgLS0gZG8gbm90IHVzZSBnbG9iYWwgc29ja2V0IGRlZmF1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaHR0cENvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEhPU1QsIFRpbWVvdXRUZXN0LlBPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD1Ob25lKQorICAgICAgICAgICAgaHR0cENvbm4uY29ubmVjdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwQ29ubi5zb2NrLmdldHRpbWVvdXQoKSwgTm9uZSkKKyAgICAgICAgaHR0cENvbm4uY2xvc2UoKQorCisgICAgICAgICMgYSB2YWx1ZQorICAgICAgICBodHRwQ29ubiA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24oSE9TVCwgVGltZW91dFRlc3QuUE9SVCwgdGltZW91dD0zMCkKKyAgICAgICAgaHR0cENvbm4uY29ubmVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHR0cENvbm4uc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBodHRwQ29ubi5jbG9zZSgpCisKKworY2xhc3MgSFRUUFNUaW1lb3V0VGVzdChUZXN0Q2FzZSk6CisjIFhYWCBIZXJlIHNob3VsZCBiZSB0ZXN0cyBmb3IgSFRUUFMsIHRoZXJlIGlzbid0IGFueSByaWdodCBub3chCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICAjIHNpbXBsZSB0ZXN0IHRvIGNoZWNrIGl0J3Mgc3RvcmluZyBpdAorICAgICAgICBpZiBoYXNhdHRyKGh0dHBsaWIsICdIVFRQU0Nvbm5lY3Rpb24nKToKKyAgICAgICAgICAgIGggPSBodHRwbGliLkhUVFBTQ29ubmVjdGlvbihIT1NULCBUaW1lb3V0VGVzdC5QT1JULCB0aW1lb3V0PTMwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnRpbWVvdXQsIDMwKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3QgaGFzYXR0cihodHRwbGliLCAnSFRUUFMnKSwgJ2h0dHBsaWIuSFRUUFMgbm90IGF2YWlsYWJsZScpCisgICAgZGVmIHRlc3RfaG9zdF9wb3J0KHNlbGYpOgorICAgICAgICAjIENoZWNrIGludmFsaWQgaG9zdF9wb3J0CisKKyAgICAgICAgIyBOb3RlIHRoYXQgaHR0cGxpYiBkb2VzIG5vdCBhY2NlcHQgdXNlcjpwYXNzd29yZEAgaW4gdGhlIGhvc3QtcG9ydC4KKyAgICAgICAgZm9yIGhwIGluICgid3d3LnB5dGhvbi5vcmc6YWJjIiwgInVzZXI6cGFzc3dvcmRAd3d3LnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGh0dHBsaWIuSW52YWxpZFVSTCwgaHR0cGxpYi5IVFRQLCBocCkKKworICAgICAgICBmb3IgaHAsIGgsIHAgaW4gKCgiW2ZlODA6OjIwNzplOWZmOmZlOWJdOjgwMDAiLCAiZmU4MDo6MjA3OmU5ZmY6ZmU5YiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICgicHlwaS5weXRob24ub3JnOjQ0MyIsICJweXBpLnB5dGhvbi5vcmciLCA0NDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgicHlwaS5weXRob24ub3JnIiwgInB5cGkucHl0aG9uLm9yZyIsIDQ0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJweXBpLnB5dGhvbi5vcmc6IiwgInB5cGkucHl0aG9uLm9yZyIsIDQ0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCJbZmU4MDo6MjA3OmU5ZmY6ZmU5Yl0iLCAiZmU4MDo6MjA3OmU5ZmY6ZmU5YiIsIDQ0MykpOgorICAgICAgICAgICAgaHR0cCA9IGh0dHBsaWIuSFRUUFMoaHApCisgICAgICAgICAgICBjID0gaHR0cC5fY29ubgorICAgICAgICAgICAgaWYgaCAhPSBjLmhvc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJIb3N0IGluY29ycmVjdGx5IHBhcnNlZDogJXMgIT0gJXMiICUgKGgsIGMuaG9zdCkpCisgICAgICAgICAgICBpZiBwICE9IGMucG9ydDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlBvcnQgaW5jb3JyZWN0bHkgcGFyc2VkOiAlcyAhPSAlcyIgJSAocCwgYy5ob3N0KSkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChIZWFkZXJUZXN0cywgT2ZmbGluZVRlc3QsIEJhc2ljVGVzdCwgVGltZW91dFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQU1RpbWVvdXRUZXN0LCBTb3VyY2VBZGRyZXNzVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTZkNDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwbGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTZkNDBlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNlZGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKQEAgLTAsMCArMSw1MzcgQEAKKyIiIlVuaXR0ZXN0cyBmb3IgdGhlIHZhcmlvdXMgSFRUUFNlcnZlciBtb2R1bGVzLgorCitXcml0dGVuIGJ5IENvZHkgQS5XLiBTb21lcnZpbGxlIDxjb2R5LXNvbWVydmlsbGVAdWJ1bnR1LmNvbT4sCitKb3NpcCBEem9sb25nYSwgYW5kIE1pY2hhZWwgT3R0ZW5lZGVyIGZvciB0aGUgMjAwNy8wOCBHSE9QIGNvbnRlc3QuCisiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCBodHRwbGliCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IENHSUhUVFBTZXJ2ZXIKKworCitmcm9tIEJhc2VIVFRQU2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBIVFRQU2VydmVyCitmcm9tIFNpbXBsZUhUVFBTZXJ2ZXIgaW1wb3J0IFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcgorZnJvbSBDR0lIVFRQU2VydmVyIGltcG9ydCBDR0lIVFRQUmVxdWVzdEhhbmRsZXIKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK3RocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCisKK2NsYXNzIE5vTG9nUmVxdWVzdEhhbmRsZXI6CisgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsICphcmdzKToKKyAgICAgICAgIyBkb24ndCB3cml0ZSBsb2cgbWVzc2FnZXMgdG8gc3RkZXJyCisgICAgICAgIHBhc3MKKworY2xhc3MgU29ja2V0bGVzc1JlcXVlc3RIYW5kbGVyKFNpbXBsZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmdldF9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLnByb3RvY29sX3ZlcnNpb24gPSAiSFRUUC8xLjEiCisKKyAgICBkZWYgZG9fR0VUKHNlbGYpOgorICAgICAgICBzZWxmLmdldF9jYWxsZWQgPSBUcnVlCisgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDApCisgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKQorICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKyAgICAgICAgc2VsZi53ZmlsZS53cml0ZShiJzxodG1sPjxib2R5PkRhdGE8L2JvZHk+PC9odG1sPlxyXG4nKQorCisgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIGZtdCwgKmFyZ3MpOgorICAgICAgICBwYXNzCisKKworY2xhc3MgVGVzdFNlcnZlclRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdF9vYmplY3QsIHJlcXVlc3RfaGFuZGxlcik6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5yZXF1ZXN0X2hhbmRsZXIgPSByZXF1ZXN0X2hhbmRsZXIKKyAgICAgICAgc2VsZi50ZXN0X29iamVjdCA9IHRlc3Rfb2JqZWN0CisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlciA9IEhUVFBTZXJ2ZXIoKCcnLCAwKSwgc2VsZi5yZXF1ZXN0X2hhbmRsZXIpCisgICAgICAgIHNlbGYudGVzdF9vYmplY3QuUE9SVCA9IHNlbGYuc2VydmVyLnNvY2tldC5nZXRzb2NrbmFtZSgpWzFdCisgICAgICAgIHNlbGYudGVzdF9vYmplY3Quc2VydmVyX3N0YXJ0ZWQuc2V0KCkKKyAgICAgICAgc2VsZi50ZXN0X29iamVjdCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2VydmVfZm9yZXZlcigwLjA1KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2VydmVyX2Nsb3NlKCkKKworICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlci5zaHV0ZG93bigpCisKKworY2xhc3MgQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgb3MuZW52aXJvbiA9IHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkKKyAgICAgICAgc2VsZi5zZXJ2ZXJfc3RhcnRlZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYudGhyZWFkID0gVGVzdFNlcnZlclRocmVhZChzZWxmLCBzZWxmLnJlcXVlc3RfaGFuZGxlcikKKyAgICAgICAgc2VsZi50aHJlYWQuc3RhcnQoKQorICAgICAgICBzZWxmLnNlcnZlcl9zdGFydGVkLndhaXQoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRocmVhZC5zdG9wKCkKKyAgICAgICAgb3MuZW52aXJvbi5fX2V4aXRfXygpCisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKworICAgIGRlZiByZXF1ZXN0KHNlbGYsIHVyaSwgbWV0aG9kPSdHRVQnLCBib2R5PU5vbmUsIGhlYWRlcnM9e30pOgorICAgICAgICBzZWxmLmNvbm5lY3Rpb24gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKCdsb2NhbGhvc3QnLCBzZWxmLlBPUlQpCisgICAgICAgIHNlbGYuY29ubmVjdGlvbi5yZXF1ZXN0KG1ldGhvZCwgdXJpLCBib2R5LCBoZWFkZXJzKQorICAgICAgICByZXR1cm4gc2VsZi5jb25uZWN0aW9uLmdldHJlc3BvbnNlKCkKKworY2xhc3MgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBCYXNlSFRUUFNlcnZlciBmb2N1c3Npbmcgb24KKyAgICBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLgorICAgICIiIgorCisgICAgSFRUUFJlc3BvbnNlTWF0Y2ggPSByZS5jb21waWxlKCdIVFRQLzEuWzAtOV0rIDIwMCBPSycpCisKKyAgICBkZWYgc2V0VXAgKHNlbGYpOgorICAgICAgICBzZWxmLmhhbmRsZXIgPSBTb2NrZXRsZXNzUmVxdWVzdEhhbmRsZXIoKQorCisgICAgZGVmIHNlbmRfdHlwaWNhbF9yZXF1ZXN0KHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBpbnB1dF9tc2cgPSBTdHJpbmdJTyhtZXNzYWdlKQorICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTygpCisgICAgICAgIHNlbGYuaGFuZGxlci5yZmlsZSA9IGlucHV0X21zZworICAgICAgICBzZWxmLmhhbmRsZXIud2ZpbGUgPSBvdXRwdXQKKyAgICAgICAgc2VsZi5oYW5kbGVyLmhhbmRsZV9vbmVfcmVxdWVzdCgpCisgICAgICAgIG91dHB1dC5zZWVrKDApCisgICAgICAgIHJldHVybiBvdXRwdXQucmVhZGxpbmVzKCkKKworICAgIGRlZiB2ZXJpZnlfZ2V0X2NhbGxlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaGFuZGxlci5nZXRfY2FsbGVkKQorCisgICAgZGVmIHZlcmlmeV9leHBlY3RlZF9oZWFkZXJzKHNlbGYsIGhlYWRlcnMpOgorICAgICAgICBmb3IgZmllbGROYW1lIGluICdTZXJ2ZXI6ICcsICdEYXRlOiAnLCAnQ29udGVudC1UeXBlOiAnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oaC5zdGFydHN3aXRoKGZpZWxkTmFtZSkgZm9yIGggaW4gaGVhZGVycyksIDEpCisKKyAgICBkZWYgdmVyaWZ5X2h0dHBfc2VydmVyX3Jlc3BvbnNlKHNlbGYsIHJlc3BvbnNlKToKKyAgICAgICAgbWF0Y2ggPSBzZWxmLkhUVFBSZXNwb25zZU1hdGNoLnNlYXJjaChyZXNwb25zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGNoIGlzIG5vdCBOb25lKQorCisgICAgZGVmIHRlc3RfaHR0cF8xXzEoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2VuZF90eXBpY2FsX3JlcXVlc3QoJ0dFVCAvIEhUVFAvMS4xXHJcblxyXG4nKQorICAgICAgICBzZWxmLnZlcmlmeV9odHRwX3NlcnZlcl9yZXNwb25zZShyZXN1bHRbMF0pCisgICAgICAgIHNlbGYudmVyaWZ5X2V4cGVjdGVkX2hlYWRlcnMocmVzdWx0WzE6LTFdKQorICAgICAgICBzZWxmLnZlcmlmeV9nZXRfY2FsbGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbLTFdLCAnPGh0bWw+PGJvZHk+RGF0YTwvYm9keT48L2h0bWw+XHJcbicpCisKKyAgICBkZWYgdGVzdF9odHRwXzFfMChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgnR0VUIC8gSFRUUC8xLjBcclxuXHJcbicpCisgICAgICAgIHNlbGYudmVyaWZ5X2h0dHBfc2VydmVyX3Jlc3BvbnNlKHJlc3VsdFswXSkKKyAgICAgICAgc2VsZi52ZXJpZnlfZXhwZWN0ZWRfaGVhZGVycyhyZXN1bHRbMTotMV0pCisgICAgICAgIHNlbGYudmVyaWZ5X2dldF9jYWxsZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFstMV0sICc8aHRtbD48Ym9keT5EYXRhPC9ib2R5PjwvaHRtbD5cclxuJykKKworICAgIGRlZiB0ZXN0X2h0dHBfMF85KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNlbmRfdHlwaWNhbF9yZXF1ZXN0KCdHRVQgLyBIVFRQLzAuOVxyXG5cclxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbMF0sICc8aHRtbD48Ym9keT5EYXRhPC9ib2R5PjwvaHRtbD5cclxuJykKKyAgICAgICAgc2VsZi52ZXJpZnlfZ2V0X2NhbGxlZCgpCisKKyAgICBkZWYgdGVzdF93aXRoX2NvbnRpbnVlXzFfMChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdCgnR0VUIC8gSFRUUC8xLjBcclxuRXhwZWN0OiAxMDAtY29udGludWVcclxuXHJcbicpCisgICAgICAgIHNlbGYudmVyaWZ5X2h0dHBfc2VydmVyX3Jlc3BvbnNlKHJlc3VsdFswXSkKKyAgICAgICAgc2VsZi52ZXJpZnlfZXhwZWN0ZWRfaGVhZGVycyhyZXN1bHRbMTotMV0pCisgICAgICAgIHNlbGYudmVyaWZ5X2dldF9jYWxsZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFstMV0sICc8aHRtbD48Ym9keT5EYXRhPC9ib2R5PjwvaHRtbD5cclxuJykKKworICAgIGRlZiB0ZXN0X3JlcXVlc3RfbGVuZ3RoKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMDcxNDogaHVnZSByZXF1ZXN0IGxpbmVzIGFyZSBkaXNjYXJkZWQsIHRvIGF2b2lkIERlbmlhbAorICAgICAgICAjIG9mIFNlcnZpY2UgYXR0YWNrcy4KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZW5kX3R5cGljYWxfcmVxdWVzdChiJ0dFVCAnICsgYid4JyAqIDY1NTM3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXSwgYidIVFRQLzEuMSA0MTQgUmVxdWVzdC1VUkkgVG9vIExvbmdcclxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmhhbmRsZXIuZ2V0X2NhbGxlZCkKKworCitjbGFzcyBCYXNlSFRUUFNlcnZlclRlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgY2xhc3MgcmVxdWVzdF9oYW5kbGVyKE5vTG9nUmVxdWVzdEhhbmRsZXIsIEJhc2VIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICBwcm90b2NvbF92ZXJzaW9uID0gJ0hUVFAvMS4xJworICAgICAgICBkZWZhdWx0X3JlcXVlc3RfdmVyc2lvbiA9ICdIVFRQLzEuMScKKworICAgICAgICBkZWYgZG9fVEVTVChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDQpCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCAndGV4dC9odG1sJykKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0Nvbm5lY3Rpb24nLCAnY2xvc2UnKQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisKKyAgICAgICAgZGVmIGRvX0tFRVAoc2VsZik6CisgICAgICAgICAgICBzZWxmLnNlbmRfcmVzcG9uc2UoMjA0KQorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29udGVudC1UeXBlJywgJ3RleHQvaHRtbCcpCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb25uZWN0aW9uJywgJ2tlZXAtYWxpdmUnKQorICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisKKyAgICAgICAgZGVmIGRvX0tFWUVSUk9SKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zZW5kX2Vycm9yKDk5OSkKKworICAgICAgICBkZWYgZG9fQ1VTVE9NKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zZW5kX3Jlc3BvbnNlKDk5OSkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L2h0bWwnKQorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcignQ29ubmVjdGlvbicsICdjbG9zZScpCisgICAgICAgICAgICBzZWxmLmVuZF9oZWFkZXJzKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgQmFzZVRlc3RDYXNlLnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuY29uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbignbG9jYWxob3N0Jywgc2VsZi5QT1JUKQorICAgICAgICBzZWxmLmNvbi5jb25uZWN0KCkKKworICAgIGRlZiB0ZXN0X2NvbW1hbmQoc2VsZik6CisgICAgICAgIHNlbGYuY29uLnJlcXVlc3QoJ0dFVCcsICcvJykKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwMSkKKworICAgIGRlZiB0ZXN0X3JlcXVlc3RfbGluZV90cmltbWluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICdIVFRQLzEuMVxuJworICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCisgICAgICAgIHNlbGYuY29uLmVuZGhlYWRlcnMoKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNTAxKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbl9ib2d1cyhzZWxmKToKKyAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICdGVUJBUicKKyAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQorICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDQwMCkKKworICAgIGRlZiB0ZXN0X3ZlcnNpb25fZGlnaXRzKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJ0hUVFAvOS45LjknCisgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ0dFVCcsICcvJykKKyAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA0MDApCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uX25vbmVfZ2V0KHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJycKKyAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnR0VUJywgJy8nKQorICAgICAgICBzZWxmLmNvbi5lbmRoZWFkZXJzKCkKKyAgICAgICAgcmVzID0gc2VsZi5jb24uZ2V0cmVzcG9uc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5zdGF0dXMsIDUwMSkKKworICAgIGRlZiB0ZXN0X3ZlcnNpb25fbm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5jb24uX2h0dHBfdnNuX3N0ciA9ICcnCisgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ1BVVCcsICcvJykKKyAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA0MDApCisKKyAgICBkZWYgdGVzdF92ZXJzaW9uX2ludmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuY29uLl9odHRwX3ZzbiA9IDk5CisgICAgICAgIHNlbGYuY29uLl9odHRwX3Zzbl9zdHIgPSAnSFRUUC85LjknCisgICAgICAgIHNlbGYuY29uLnB1dHJlcXVlc3QoJ0dFVCcsICcvJykKKyAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA1MDUpCisKKyAgICBkZWYgdGVzdF9zZW5kX2JsYW5rKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJycKKyAgICAgICAgc2VsZi5jb24ucHV0cmVxdWVzdCgnJywgJycpCisgICAgICAgIHNlbGYuY29uLmVuZGhlYWRlcnMoKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNDAwKQorCisgICAgZGVmIHRlc3RfaGVhZGVyX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCisgICAgICAgIHNlbGYuY29uLnB1dGhlYWRlcignQ29ubmVjdGlvbicsICdjbG9zZScpCisgICAgICAgIHNlbGYuY29uLmVuZGhlYWRlcnMoKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgNTAxKQorCisgICAgZGVmIHRlc3RfaGVhZF9rZWVwX2FsaXZlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5faHR0cF92c25fc3RyID0gJ0hUVFAvMS4xJworICAgICAgICBzZWxmLmNvbi5wdXRyZXF1ZXN0KCdHRVQnLCAnLycpCisgICAgICAgIHNlbGYuY29uLnB1dGhlYWRlcignQ29ubmVjdGlvbicsICdrZWVwLWFsaXZlJykKKyAgICAgICAgc2VsZi5jb24uZW5kaGVhZGVycygpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA1MDEpCisKKyAgICBkZWYgdGVzdF9oYW5kbGVyKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yZXF1ZXN0KCdURVNUJywgJy8nKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgMjA0KQorCisgICAgZGVmIHRlc3RfcmV0dXJuX2hlYWRlcl9rZWVwX2FsaXZlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yZXF1ZXN0KCdLRUVQJywgJy8nKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLmdldGhlYWRlcignQ29ubmVjdGlvbicpLCAna2VlcC1hbGl2ZScpCisgICAgICAgIHNlbGYuY29uLnJlcXVlc3QoJ1RFU1QnLCAnLycpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLmNvbi5jbG9zZSkKKworICAgIGRlZiB0ZXN0X2ludGVybmFsX2tleV9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5jb24ucmVxdWVzdCgnS0VZRVJST1InLCAnLycpCisgICAgICAgIHJlcyA9IHNlbGYuY29uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA5OTkpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5fY3VzdG9tX3N0YXR1cyhzZWxmKToKKyAgICAgICAgc2VsZi5jb24ucmVxdWVzdCgnQ1VTVE9NJywgJy8nKQorICAgICAgICByZXMgPSBzZWxmLmNvbi5nZXRyZXNwb25zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLnN0YXR1cywgOTk5KQorCisKK2NsYXNzIFNpbXBsZUhUVFBTZXJ2ZXJUZXN0Q2FzZShCYXNlVGVzdENhc2UpOgorICAgIGNsYXNzIHJlcXVlc3RfaGFuZGxlcihOb0xvZ1JlcXVlc3RIYW5kbGVyLCBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEJhc2VUZXN0Q2FzZS5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLmN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIGJhc2V0ZW1wZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgIG9zLmNoZGlyKGJhc2V0ZW1wZGlyKQorICAgICAgICBzZWxmLmRhdGEgPSAnV2UgYXJlIHRoZSBrbmlnaHRzIHdobyBzYXkgTmkhJworICAgICAgICBzZWxmLnRlbXBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1iYXNldGVtcGRpcikKKyAgICAgICAgc2VsZi50ZW1wZGlyX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNlbGYudGVtcGRpcikKKyAgICAgICAgdGVtcCA9IG9wZW4ob3MucGF0aC5qb2luKHNlbGYudGVtcGRpciwgJ3Rlc3QnKSwgJ3diJykKKyAgICAgICAgdGVtcC53cml0ZShzZWxmLmRhdGEpCisgICAgICAgIHRlbXAuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jaGRpcihzZWxmLmN3ZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYudGVtcGRpcikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIEJhc2VUZXN0Q2FzZS50ZWFyRG93bihzZWxmKQorCisgICAgZGVmIGNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHNlbGYsIHJlc3BvbnNlLCBzdGF0dXMsIGRhdGE9Tm9uZSk6CisgICAgICAgIGJvZHkgPSByZXNwb25zZS5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3BvbnNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3BvbnNlLnN0YXR1cywgc3RhdHVzKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShyZXNwb25zZS5yZWFzb24pCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGJvZHkpCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgICNjb25zdHJ1Y3RzIHRoZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgSFRUUFNlcnZlcgorICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLnRlbXBkaXJfbmFtZSArICcvdGVzdCcpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDIwMCwgZGF0YT1zZWxmLmRhdGEpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYudGVtcGRpcl9uYW1lICsgJy8nKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCAyMDApCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KHNlbGYudGVtcGRpcl9uYW1lKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCAzMDEpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KCcvVGhpc0RvZXNOb3RFeGlzdCcpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDQwNCkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLnJlcXVlc3QoJy8nICsgJ1RoaXNEb2VzTm90RXhpc3QnICsgJy8nKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA0MDQpCisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLnRlbXBkaXJfbmFtZSwgJ2luZGV4Lmh0bWwnKSwgJ3cnKQorICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnLycgKyBzZWxmLnRlbXBkaXJfbmFtZSArICcvJykKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgMjAwKQorCisgICAgICAgICMgY2htb2QoKSBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQgb24gV2luZG93cywgYW5kIGZpbGVzeXN0ZW0KKyAgICAgICAgIyBwZXJtaXNzaW9ucyBhcmUgaWdub3JlZCBieSByb290IG9uIFVuaXguCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JyBhbmQgb3MuZ2V0ZXVpZCgpICE9IDA6CisgICAgICAgICAgICBvcy5jaG1vZChzZWxmLnRlbXBkaXIsIDApCisgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdChzZWxmLnRlbXBkaXJfbmFtZSArICcvJykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDQwNCkKKyAgICAgICAgICAgIG9zLmNobW9kKHNlbGYudGVtcGRpciwgMDc1NSkKKworICAgIGRlZiB0ZXN0X2hlYWQoc2VsZik6CisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KAorICAgICAgICAgICAgc2VsZi50ZW1wZGlyX25hbWUgKyAnL3Rlc3QnLCBtZXRob2Q9J0hFQUQnKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCAyMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2UuZ2V0aGVhZGVyKCdjb250ZW50LWxlbmd0aCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihsZW4oc2VsZi5kYXRhKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzcG9uc2UuZ2V0aGVhZGVyKCdjb250ZW50LXR5cGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfcmVxdWVzdHMoc2VsZik6CisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5yZXF1ZXN0KCcvJywgbWV0aG9kPSdGT08nKQorICAgICAgICBzZWxmLmNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHJlc3BvbnNlLCA1MDEpCisgICAgICAgICMgcmVxdWVzdHMgbXVzdCBiZSBjYXNlIHNlbnNpdGl2ZSxzbyB0aGlzIHNob3VsZCBmYWlsIHRvbworICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnLycsIG1ldGhvZD0nZ2V0JykKKyAgICAgICAgc2VsZi5jaGVja19zdGF0dXNfYW5kX3JlYXNvbihyZXNwb25zZSwgNTAxKQorICAgICAgICByZXNwb25zZSA9IHNlbGYucmVxdWVzdCgnLycsIG1ldGhvZD0nR0VUcycpCisgICAgICAgIHNlbGYuY2hlY2tfc3RhdHVzX2FuZF9yZWFzb24ocmVzcG9uc2UsIDUwMSkKKworCitjZ2lfZmlsZTEgPSAiIiJcCisjISVzCisKK3ByaW50ICJDb250ZW50LXR5cGU6IHRleHQvaHRtbCIKK3ByaW50CitwcmludCAiSGVsbG8gV29ybGQiCisiIiIKKworY2dpX2ZpbGUyID0gIiIiXAorIyElcworaW1wb3J0IGNnaQorCitwcmludCAiQ29udGVudC10eXBlOiB0ZXh0L2h0bWwiCitwcmludAorCitmb3JtID0gY2dpLkZpZWxkU3RvcmFnZSgpCitwcmludCAiJSVzLCAlJXMsICUlcyIgJSUgKGZvcm0uZ2V0Zmlyc3QoInNwYW0iKSwgZm9ybS5nZXRmaXJzdCgiZWdncyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLmdldGZpcnN0KCJiYWNvbiIpKQorIiIiCisKKworQHVuaXR0ZXN0LnNraXBJZihoYXNhdHRyKG9zLCAnZ2V0ZXVpZCcpIGFuZCBvcy5nZXRldWlkKCkgPT0gMCwKKyAgICAgICAgIlRoaXMgdGVzdCBjYW4ndCBiZSBydW4gcmVsaWFibHkgYXMgcm9vdCAoaXNzdWUgIzEzMzA4KS4iKQorY2xhc3MgQ0dJSFRUUFNlcnZlclRlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgY2xhc3MgcmVxdWVzdF9oYW5kbGVyKE5vTG9nUmVxdWVzdEhhbmRsZXIsIENHSUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgQmFzZVRlc3RDYXNlLnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYucGFyZW50X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLmNnaV9kaXIgPSBvcy5wYXRoLmpvaW4oc2VsZi5wYXJlbnRfZGlyLCAnY2dpLWJpbicpCisgICAgICAgIG9zLm1rZGlyKHNlbGYuY2dpX2RpcikKKworICAgICAgICAjIFRoZSBzaGViYW5nIGxpbmUgc2hvdWxkIGJlIHB1cmUgQVNDSUk6IHVzZSBzeW1saW5rIGlmIHBvc3NpYmxlLgorICAgICAgICAjIFNlZSBpc3N1ZSAjNzY2OC4KKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3N5bWxpbmsnKToKKyAgICAgICAgICAgIHNlbGYucHl0aG9uZXhlID0gb3MucGF0aC5qb2luKHNlbGYucGFyZW50X2RpciwgJ3B5dGhvbicpCisgICAgICAgICAgICBvcy5zeW1saW5rKHN5cy5leGVjdXRhYmxlLCBzZWxmLnB5dGhvbmV4ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHl0aG9uZXhlID0gc3lzLmV4ZWN1dGFibGUKKworICAgICAgICBzZWxmLmZpbGUxX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5jZ2lfZGlyLCAnZmlsZTEucHknKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlMV9wYXRoLCAndycpIGFzIGZpbGUxOgorICAgICAgICAgICAgZmlsZTEud3JpdGUoY2dpX2ZpbGUxICUgc2VsZi5weXRob25leGUpCisgICAgICAgIG9zLmNobW9kKHNlbGYuZmlsZTFfcGF0aCwgMDc3NykKKworICAgICAgICBzZWxmLmZpbGUyX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5jZ2lfZGlyLCAnZmlsZTIucHknKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5maWxlMl9wYXRoLCAndycpIGFzIGZpbGUyOgorICAgICAgICAgICAgZmlsZTIud3JpdGUoY2dpX2ZpbGUyICUgc2VsZi5weXRob25leGUpCisgICAgICAgIG9zLmNobW9kKHNlbGYuZmlsZTJfcGF0aCwgMDc3NykKKworICAgICAgICBzZWxmLmN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHNlbGYucGFyZW50X2RpcikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5jd2QpCisgICAgICAgICAgICBpZiBzZWxmLnB5dGhvbmV4ZSAhPSBzeXMuZXhlY3V0YWJsZToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5weXRob25leGUpCisgICAgICAgICAgICBvcy5yZW1vdmUoc2VsZi5maWxlMV9wYXRoKQorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYuZmlsZTJfcGF0aCkKKyAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYuY2dpX2RpcikKKyAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYucGFyZW50X2RpcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIEJhc2VUZXN0Q2FzZS50ZWFyRG93bihzZWxmKQorCisgICAgZGVmIHRlc3RfdXJsX2NvbGxhcHNlX3BhdGgoc2VsZik6CisgICAgICAgICMgdmVyaWZ5IHRhaWwgaXMgdGhlIGxhc3QgcG9ydGlvbiBhbmQgaGVhZCBpcyB0aGUgcmVzdCBvbiBwcm9wZXIgdXJscworICAgICAgICB0ZXN0X3ZlY3RvcnMgPSB7CisgICAgICAgICAgICAnJzogJy8vJywKKyAgICAgICAgICAgICcuLic6IEluZGV4RXJyb3IsCisgICAgICAgICAgICAnLy4vLy4uJzogSW5kZXhFcnJvciwKKyAgICAgICAgICAgICcvJzogJy8vJywKKyAgICAgICAgICAgICcvLyc6ICcvLycsCisgICAgICAgICAgICAnL1xcJzogJy8vXFwnLAorICAgICAgICAgICAgJy8uLy8nOiAnLy8nLAorICAgICAgICAgICAgJ2NnaS1iaW4vZmlsZTEucHknOiAnL2NnaS1iaW4vZmlsZTEucHknLAorICAgICAgICAgICAgJy9jZ2ktYmluL2ZpbGUxLnB5JzogJy9jZ2ktYmluL2ZpbGUxLnB5JywKKyAgICAgICAgICAgICdhJzogJy8vYScsCisgICAgICAgICAgICAnL2EnOiAnLy9hJywKKyAgICAgICAgICAgICcvL2EnOiAnLy9hJywKKyAgICAgICAgICAgICcuL2EnOiAnLy9hJywKKyAgICAgICAgICAgICcuL0M6Lyc6ICcvQzovJywKKyAgICAgICAgICAgICcvYS9iJzogJy9hL2InLAorICAgICAgICAgICAgJy9hL2IvJzogJy9hL2IvJywKKyAgICAgICAgICAgICcvYS9iLy4nOiAnL2EvYi8nLAorICAgICAgICAgICAgJy9hL2IvYy8uLic6ICcvYS9iLycsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QnOiAnL2EvYi9kJywKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uL2YnOiAnL2EvYi9kL2YnLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vLi4vZic6ICcvYS9iL2YnLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vLi8uLy4vLi4vL2YnOiAnL2EvYi9mJywKKyAgICAgICAgICAgICcuLi9hL2IvYy8uLi9kL2UvLi4vLi8uLy4vLi4vL2YnOiBJbmRleEVycm9yLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vLi4vLi4vZic6ICcvYS9mJywKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uLy4uLy4uLy4uL2YnOiAnLy9mJywKKyAgICAgICAgICAgICcvYS9iL2MvLi4vZC9lLy4uLy4uLy4uLy4uLy4uL2YnOiBJbmRleEVycm9yLAorICAgICAgICAgICAgJy9hL2IvYy8uLi9kL2UvLi4vLi4vLi4vLi4vZi8uLic6ICcvLycsCisgICAgICAgICAgICAnL2EvYi9jLy4uL2QvZS8uLi8uLi8uLi8uLi9mLy4uLy4nOiAnLy8nLAorICAgICAgICB9CisgICAgICAgIGZvciBwYXRoLCBleHBlY3RlZCBpbiB0ZXN0X3ZlY3RvcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhleHBlY3RlZCwgRXhjZXB0aW9uKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR0lIVFRQU2VydmVyLl91cmxfY29sbGFwc2VfcGF0aCwgcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYWN0dWFsID0gQ0dJSFRUUFNlcnZlci5fdXJsX2NvbGxhcHNlX3BhdGgocGF0aCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBhY3R1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J3BhdGggPSAlclxuR290OiAgICAlclxuV2FudGVkOiAlcicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGgsIGFjdHVhbCwgZXhwZWN0ZWQpKQorCisgICAgZGVmIHRlc3RfaGVhZGVyc19hbmRfY29udGVudChzZWxmKToKKyAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbi9maWxlMS5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCdIZWxsbyBXb3JsZFxuJywgJ3RleHQvaHRtbCcsIDIwMCksCisgICAgICAgICAgICAocmVzLnJlYWQoKSwgcmVzLmdldGhlYWRlcignQ29udGVudC10eXBlJyksIHJlcy5zdGF0dXMpKQorCisgICAgZGVmIHRlc3RfcG9zdChzZWxmKToKKyAgICAgICAgcGFyYW1zID0gdXJsbGliLnVybGVuY29kZSh7J3NwYW0nIDogMSwgJ2VnZ3MnIDogJ3B5dGhvbicsICdiYWNvbicgOiAxMjM0NTZ9KQorICAgICAgICBoZWFkZXJzID0geydDb250ZW50LXR5cGUnIDogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCd9CisgICAgICAgIHJlcyA9IHNlbGYucmVxdWVzdCgnL2NnaS1iaW4vZmlsZTIucHknLCAnUE9TVCcsIHBhcmFtcywgaGVhZGVycykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5yZWFkKCksICcxLCBweXRob24sIDEyMzQ1NlxuJykKKworICAgIGRlZiB0ZXN0X2ludmFsaWR1cmkoc2VsZik6CisgICAgICAgIHJlcyA9IHNlbGYucmVxdWVzdCgnL2NnaS1iaW4vaW52YWxpZCcpCisgICAgICAgIHJlcy5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuc3RhdHVzLCA0MDQpCisKKyAgICBkZWYgdGVzdF9hdXRob3JpemF0aW9uKHNlbGYpOgorICAgICAgICBoZWFkZXJzID0geydBdXRob3JpemF0aW9uJyA6ICdCYXNpYyAlcycgJQorICAgICAgICAgICAgICAgICAgIGJhc2U2NC5iNjRlbmNvZGUoJ3VzZXJuYW1lOnBhc3MnKX0KKyAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbi9maWxlMS5weScsICdHRVQnLCBoZWFkZXJzPWhlYWRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCdIZWxsbyBXb3JsZFxuJywgJ3RleHQvaHRtbCcsIDIwMCksCisgICAgICAgICAgICAgICAgKHJlcy5yZWFkKCksIHJlcy5nZXRoZWFkZXIoJ0NvbnRlbnQtdHlwZScpLCByZXMuc3RhdHVzKSkKKworICAgIGRlZiB0ZXN0X25vX2xlYWRpbmdfc2xhc2goc2VsZik6CisgICAgICAgICMgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTIyNTQKKyAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCdjZ2ktYmluL2ZpbGUxLnB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ0hlbGxvIFdvcmxkXG4nLCAndGV4dC9odG1sJywgMjAwKSwKKyAgICAgICAgICAgICAocmVzLnJlYWQoKSwgcmVzLmdldGhlYWRlcignQ29udGVudC10eXBlJyksIHJlcy5zdGF0dXMpKQorCisgICAgZGVmIHRlc3Rfb3NfZW52aXJvbl9pc19ub3RfYWx0ZXJlZChzZWxmKToKKyAgICAgICAgc2lnbmF0dXJlID0gIlRlc3QgQ0dJIFNlcnZlciIKKyAgICAgICAgb3MuZW52aXJvblsnU0VSVkVSX1NPRlRXQVJFJ10gPSBzaWduYXR1cmUKKyAgICAgICAgcmVzID0gc2VsZi5yZXF1ZXN0KCcvY2dpLWJpbi9maWxlMS5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGInSGVsbG8gV29ybGRcbicsICd0ZXh0L2h0bWwnLCAyMDApLAorICAgICAgICAgICAgICAgIChyZXMucmVhZCgpLCByZXMuZ2V0aGVhZGVyKCdDb250ZW50LXR5cGUnKSwgcmVzLnN0YXR1cykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuZW52aXJvblsnU0VSVkVSX1NPRlRXQVJFJ10sIHNpZ25hdHVyZSkKKworCitjbGFzcyBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiIFRlc3QgdXJsIHBhcnNpbmcgIiIiCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRyYW5zbGF0ZWQgPSBvcy5nZXRjd2QoKQorICAgICAgICBzZWxmLnRyYW5zbGF0ZWQgPSBvcy5wYXRoLmpvaW4oc2VsZi50cmFuc2xhdGVkLCAnZmlsZW5hbWUnKQorICAgICAgICBzZWxmLmhhbmRsZXIgPSBTb2NrZXRsZXNzUmVxdWVzdEhhbmRsZXIoKQorCisgICAgZGVmIHRlc3RfcXVlcnlfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICBwYXRoID0gc2VsZi5oYW5kbGVyLnRyYW5zbGF0ZV9wYXRoKCcvZmlsZW5hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCgnL2ZpbGVuYW1lP2Zvbz1iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCgnL2ZpbGVuYW1lP2E9YiZzcGFtPWVnZ3Mjem90JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXRoLCBzZWxmLnRyYW5zbGF0ZWQpCisKKyAgICBkZWYgdGVzdF9zdGFydF93aXRoX2RvdWJsZV9zbGFzaChzZWxmKToKKyAgICAgICAgcGF0aCA9IHNlbGYuaGFuZGxlci50cmFuc2xhdGVfcGF0aCgnLy9maWxlbmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0aCwgc2VsZi50cmFuc2xhdGVkKQorICAgICAgICBwYXRoID0gc2VsZi5oYW5kbGVyLnRyYW5zbGF0ZV9wYXRoKCcvL2ZpbGVuYW1lP2Zvbz1iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdGgsIHNlbGYudHJhbnNsYXRlZCkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdHJ5OgorICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KEJhc2VIVFRQUmVxdWVzdEhhbmRsZXJUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVIVFRQUmVxdWVzdEhhbmRsZXJUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlSFRUUFNlcnZlclRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZUhUVFBTZXJ2ZXJUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDR0lIVFRQU2VydmVyVGVzdENhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihjd2QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzcxOTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzcxOTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFnZW9wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MzIwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFnZW9wLnB5CkBAIC0wLDAgKzEsMjExIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlRlc3Qgc2NyaXB0IGZvciB0aGUgaW1hZ2VvcCBtb2R1bGUuICBUaGlzIGhhcyB0aGUgc2lkZQorICAgZWZmZWN0IG9mIHBhcnRpYWxseSB0ZXN0aW5nIHRoZSBpbWdmaWxlIG1vZHVsZSBhcyB3ZWxsLgorICAgUm9nZXIgRS4gTWFzc2UKKyIiIgorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCB1bmxpbmssIGltcG9ydF9tb2R1bGUsIHJ1bl91bml0dGVzdAorCitpbWFnZW9wID0gaW1wb3J0X21vZHVsZSgnaW1hZ2VvcCcsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2ltcG9ydCB1dSwgb3MsIHVuaXR0ZXN0CisKKworU0laRVMgPSAoMSwgMiwgMywgNCkKK19WQUxVRVMgPSAoMSwgMiwgMioqMTAsIDIqKjE1LTEsIDIqKjE1LCAyKioxNSsxLCAyKiozMS0yLCAyKiozMS0xKQorVkFMVUVTID0gdHVwbGUoIC14IGZvciB4IGluIHJldmVyc2VkKF9WQUxVRVMpICkgKyAoMCwpICsgX1ZBTFVFUworQUFBQUEgPSAiQSIgKiAxMDI0CitNQVhfTEVOID0gMioqMjAKKworCitjbGFzcyBJbnB1dFZhbGlkYXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgX2NoZWNrKHNlbGYsIG5hbWUsIHNpemU9Tm9uZSwgKmV4dHJhKToKKyAgICAgICAgZnVuYyA9IGdldGF0dHIoaW1hZ2VvcCwgbmFtZSkKKyAgICAgICAgZm9yIGhlaWdodCBpbiBWQUxVRVM6CisgICAgICAgICAgICBmb3Igd2lkdGggaW4gVkFMVUVTOgorICAgICAgICAgICAgICAgIHN0cmxlbiA9IGFicyh3aWR0aCAqIGhlaWdodCkKKyAgICAgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgICAgICBzdHJsZW4gKj0gc2l6ZQorICAgICAgICAgICAgICAgIGlmIHN0cmxlbiA8IE1BWF9MRU46CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSAiQSIgKiBzdHJsZW4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gQUFBQUEKKyAgICAgICAgICAgICAgICBpZiBzaXplOgorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMgPSAoZGF0YSwgc2l6ZSwgd2lkdGgsIGhlaWdodCkgKyBleHRyYQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50cyA9IChkYXRhLCB3aWR0aCwgaGVpZ2h0KSArIGV4dHJhCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmdW5jKCphcmd1bWVudHMpCisgICAgICAgICAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBpbWFnZW9wLmVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIGNoZWNrX3NpemUoc2VsZiwgbmFtZSwgKmV4dHJhKToKKyAgICAgICAgZm9yIHNpemUgaW4gU0laRVM6CisgICAgICAgICAgICBzZWxmLl9jaGVjayhuYW1lLCBzaXplLCAqZXh0cmEpCisKKyAgICBkZWYgY2hlY2soc2VsZiwgbmFtZSwgKmV4dHJhKToKKyAgICAgICAgc2VsZi5fY2hlY2sobmFtZSwgTm9uZSwgKmV4dHJhKQorCisgICAgZGVmIHRlc3RfaW5wdXRfdmFsaWRhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zaXplKCJjcm9wIiwgMCwgMCwgMCwgMCkKKyAgICAgICAgc2VsZi5jaGVja19zaXplKCJzY2FsZSIsIDEsIDApCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZSgic2NhbGUiLCAtMSwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZSgidG92aWRlbyIpCisgICAgICAgIHNlbGYuY2hlY2soImdyZXkybW9ubyIsIDEyOCkKKyAgICAgICAgc2VsZi5jaGVjaygiZ3JleTJncmV5NCIpCisgICAgICAgIHNlbGYuY2hlY2soImdyZXkyZ3JleTIiKQorICAgICAgICBzZWxmLmNoZWNrKCJkaXRoZXIybW9ubyIpCisgICAgICAgIHNlbGYuY2hlY2soImRpdGhlcjJncmV5MiIpCisgICAgICAgIHNlbGYuY2hlY2soIm1vbm8yZ3JleSIsIDAsIDApCisgICAgICAgIHNlbGYuY2hlY2soImdyZXkyMmdyZXkiKQorICAgICAgICBzZWxmLmNoZWNrKCJyZ2IycmdiOCIpICMgbmxlbio0ID09IGxlbgorICAgICAgICBzZWxmLmNoZWNrKCJyZ2I4MnJnYiIpCisgICAgICAgIHNlbGYuY2hlY2soInJnYjJncmV5IikKKyAgICAgICAgc2VsZi5jaGVjaygiZ3JleTJyZ2IiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKworICAgIHJ1bl91bml0dGVzdChJbnB1dFZhbGlkYXRpb25UZXN0cykKKworICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGltZ2ZpbGUKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHJldHVybgorCisgICAgIyBDcmVhdGUgYmluYXJ5IHRlc3QgZmlsZXMKKyAgICB1dS5kZWNvZGUoZ2V0X3F1YWxpZmllZF9wYXRoKCd0ZXN0cmdiJytvcy5leHRzZXArJ3V1ZScpLCAndGVzdCcrb3MuZXh0c2VwKydyZ2InKQorCisgICAgaW1hZ2UsIHdpZHRoLCBoZWlnaHQgPSBnZXRpbWFnZSgndGVzdCcrb3MuZXh0c2VwKydyZ2InKQorCisgICAgIyBSZXR1cm4gdGhlIHNlbGVjdGVkIHBhcnQgb2YgaW1hZ2UsIHdoaWNoIHNob3VsZCBieSB3aWR0aCBieSBoZWlnaHQKKyAgICAjIGluIHNpemUgYW5kIGNvbnNpc3Qgb2YgcGl4ZWxzIG9mIHBzaXplIGJ5dGVzLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdjcm9wJworICAgIG5ld2ltYWdlID0gaW1hZ2VvcC5jcm9wIChpbWFnZSwgNCwgd2lkdGgsIGhlaWdodCwgMCwgMCwgMSwgMSkKKworICAgICMgUmV0dXJuIGltYWdlIHNjYWxlZCB0byBzaXplIG5ld3dpZHRoIGJ5IG5ld2hlaWdodC4gTm8gaW50ZXJwb2xhdGlvbgorICAgICMgaXMgZG9uZSwgc2NhbGluZyBpcyBkb25lIGJ5IHNpbXBsZS1taW5kZWQgcGl4ZWwgZHVwbGljYXRpb24gb3IgcmVtb3ZhbC4KKyAgICAjIFRoZXJlZm9yZSwgY29tcHV0ZXItZ2VuZXJhdGVkIGltYWdlcyBvciBkaXRoZXJlZCBpbWFnZXMgd2lsbAorICAgICMgbm90IGxvb2sgbmljZSBhZnRlciBzY2FsaW5nLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdzY2FsZScKKyAgICBzY2FsZWltYWdlID0gaW1hZ2VvcC5zY2FsZShpbWFnZSwgNCwgd2lkdGgsIGhlaWdodCwgMSwgMSkKKworICAgICMgUnVuIGEgdmVydGljYWwgbG93LXBhc3MgZmlsdGVyIG92ZXIgYW4gaW1hZ2UuIEl0IGRvZXMgc28gYnkgY29tcHV0aW5nCisgICAgIyBlYWNoIGRlc3RpbmF0aW9uIHBpeGVsIGFzIHRoZSBhdmVyYWdlIG9mIHR3byB2ZXJ0aWNhbGx5LWFsaWduZWQgc291cmNlCisgICAgIyBwaXhlbHMuIFRoZSBtYWluIHVzZSBvZiB0aGlzIHJvdXRpbmUgaXMgdG8gZm9yZXN0YWxsIGV4Y2Vzc2l2ZSBmbGlja2VyCisgICAgIyBpZiB0aGUgaW1hZ2UgdHdvIHZlcnRpY2FsbHktYWxpZ25lZCBzb3VyY2UgcGl4ZWxzLCAgaGVuY2UgdGhlIG5hbWUuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3RvdmlkZW8nCisgICAgdmlkZW9pbWFnZSA9IGltYWdlb3AudG92aWRlbyAoaW1hZ2UsIDQsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYW4gcmdiIGltYWdlIHRvIGFuIDggYml0IHJnYgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdyZ2IycmdiOCcKKyAgICBncmV5aW1hZ2UgPSBpbWFnZW9wLnJnYjJyZ2I4KGltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDb252ZXJ0IGFuIDggYml0IHJnYiBpbWFnZSB0byBhIDI0IGJpdCByZ2IgaW1hZ2UKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAncmdiODJyZ2InCisgICAgaW1hZ2UgPSBpbWFnZW9wLnJnYjgycmdiKGdyZXlpbWFnZSwgd2lkdGgsIGhlaWdodCkKKworICAgICMgQ29udmVydCBhbiByZ2IgaW1hZ2UgdG8gYW4gOCBiaXQgZ3JleXNjYWxlIGltYWdlCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ3JnYjJncmV5JworICAgIGdyZXlpbWFnZSA9IGltYWdlb3AucmdiMmdyZXkoaW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYW4gOCBiaXQgZ3JleXNjYWxlIGltYWdlIHRvIGEgMjQgYml0IHJnYiBpbWFnZQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdncmV5MnJnYicKKyAgICBpbWFnZSA9IGltYWdlb3AuZ3JleTJyZ2IoZ3JleWltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDb252ZXJ0IGEgOC1iaXQgZGVlcCBncmV5c2NhbGUgaW1hZ2UgdG8gYSAxLWJpdCBkZWVwIGltYWdlIGJ5CisgICAgIyB0aHJlc2hvbGRpbmcgYWxsIHRoZSBwaXhlbHMuIFRoZSByZXN1bHRpbmcgaW1hZ2UgaXMgdGlnaHRseSBwYWNrZWQKKyAgICAjIGFuZCBpcyBwcm9iYWJseSBvbmx5IHVzZWZ1bCBhcyBhbiBhcmd1bWVudCB0byBtb25vMmdyZXkuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2dyZXkybW9ubycKKyAgICBtb25vaW1hZ2UgPSBpbWFnZW9wLmdyZXkybW9ubyAoZ3JleWltYWdlLCB3aWR0aCwgaGVpZ2h0LCAwKQorCisgICAgIyBtb25vaW1hZ2UsIHdpZHRoLCBoZWlnaHQgPSBnZXRpbWFnZSgnbW9ub3Rlc3QucmdiJykKKyAgICAjIENvbnZlcnQgYSAxLWJpdCBtb25vY2hyb21lIGltYWdlIHRvIGFuIDggYml0IGdyZXlzY2FsZSBvciBjb2xvciBpbWFnZS4KKyAgICAjIEFsbCBwaXhlbHMgdGhhdCBhcmUgemVyby12YWx1ZWQgb24gaW5wdXQgZ2V0IHZhbHVlIHAwIG9uIG91dHB1dCBhbmQKKyAgICAjIGFsbCBvbmUtdmFsdWUgaW5wdXQgcGl4ZWxzIGdldCB2YWx1ZSBwMSBvbiBvdXRwdXQuIFRvIGNvbnZlcnQgYQorICAgICMgbW9ub2Nocm9tZSAgYmxhY2stYW5kLXdoaXRlIGltYWdlIHRvIGdyZXlzY2FsZSBwYXNzIHRoZSB2YWx1ZXMgMCBhbmQKKyAgICAjIDI1NSByZXNwZWN0aXZlbHkuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ21vbm8yZ3JleScKKyAgICBncmV5aW1hZ2UgPSBpbWFnZW9wLm1vbm8yZ3JleSAobW9ub2ltYWdlLCB3aWR0aCwgaGVpZ2h0LCAwLCAyNTUpCisKKyAgICAjIENvbnZlcnQgYW4gOC1iaXQgZ3JleXNjYWxlIGltYWdlIHRvIGEgMS1iaXQgbW9ub2Nocm9tZSBpbWFnZSB1c2luZyBhCisgICAgIyAoc2ltcGxlLW1pbmRlZCkgZGl0aGVyaW5nIGFsZ29yaXRobS4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZGl0aGVyMm1vbm8nCisgICAgbW9ub2ltYWdlID0gaW1hZ2VvcC5kaXRoZXIybW9ubyAoZ3JleWltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDb252ZXJ0IGFuIDgtYml0IGdyZXlzY2FsZSBpbWFnZSB0byBhIDQtYml0IGdyZXlzY2FsZSBpbWFnZSB3aXRob3V0CisgICAgIyBkaXRoZXJpbmcuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2dyZXkyZ3JleTQnCisgICAgZ3JleTRpbWFnZSA9IGltYWdlb3AuZ3JleTJncmV5NCAoZ3JleWltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDb252ZXJ0IGFuIDgtYml0IGdyZXlzY2FsZSBpbWFnZSB0byBhIDItYml0IGdyZXlzY2FsZSBpbWFnZSB3aXRob3V0CisgICAgIyBkaXRoZXJpbmcuCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2dyZXkyZ3JleTInCisgICAgZ3JleTJpbWFnZSA9IGltYWdlb3AuZ3JleTJncmV5MiAoZ3JleWltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDb252ZXJ0IGFuIDgtYml0IGdyZXlzY2FsZSBpbWFnZSB0byBhIDItYml0IGdyZXlzY2FsZSBpbWFnZSB3aXRoCisgICAgIyBkaXRoZXJpbmcuIEFzIGZvciBkaXRoZXIybW9ubywgdGhlIGRpdGhlcmluZyBhbGdvcml0aG0gaXMgY3VycmVudGx5CisgICAgIyB2ZXJ5IHNpbXBsZS4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZGl0aGVyMmdyZXkyJworICAgIGdyZXkyaW1hZ2UgPSBpbWFnZW9wLmRpdGhlcjJncmV5MiAoZ3JleWltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDb252ZXJ0IGEgNC1iaXQgZ3JleXNjYWxlIGltYWdlIHRvIGFuIDgtYml0IGdyZXlzY2FsZSBpbWFnZS4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZ3JleTQyZ3JleScKKyAgICBncmV5aW1hZ2UgPSBpbWFnZW9wLmdyZXk0MmdyZXkgKGdyZXk0aW1hZ2UsIHdpZHRoLCBoZWlnaHQpCisKKyAgICAjIENvbnZlcnQgYSAyLWJpdCBncmV5c2NhbGUgaW1hZ2UgdG8gYW4gOC1iaXQgZ3JleXNjYWxlIGltYWdlLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdncmV5MjJncmV5JworICAgIGltYWdlID0gaW1hZ2VvcC5ncmV5MjJncmV5IChncmV5MmltYWdlLCB3aWR0aCwgaGVpZ2h0KQorCisgICAgIyBDbGVhbnVwCisgICAgdW5saW5rKCd0ZXN0Jytvcy5leHRzZXArJ3JnYicpCisKK2RlZiBnZXRpbWFnZShuYW1lKToKKyAgICAiIiJyZXR1cm4gYSB0dXBsZSBjb25zaXN0aW5nIG9mCisgICAgICAgaW1hZ2UgKGluICdpbWdmaWxlJyBmb3JtYXQpIHdpZHRoIGFuZCBoZWlnaHQKKyAgICAiIiIKKyAgICBpbXBvcnQgaW1nZmlsZQorICAgIHRyeToKKyAgICAgICAgc2l6ZXMgPSBpbWdmaWxlLmdldHNpemVzKG5hbWUpCisgICAgZXhjZXB0IGltZ2ZpbGUuZXJyb3I6CisgICAgICAgIG5hbWUgPSBnZXRfcXVhbGlmaWVkX3BhdGgobmFtZSkKKyAgICAgICAgc2l6ZXMgPSBpbWdmaWxlLmdldHNpemVzKG5hbWUpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2ltZ2ZpbGUgb3BlbmluZyB0ZXN0IGltYWdlOiAlcywgc2l6ZXM6ICVzJyAlIChuYW1lLCBzdHIoc2l6ZXMpKQorCisgICAgaW1hZ2UgPSBpbWdmaWxlLnJlYWQobmFtZSkKKyAgICByZXR1cm4gKGltYWdlLCBzaXplc1swXSwgc2l6ZXNbMV0pCisKK2RlZiBnZXRfcXVhbGlmaWVkX3BhdGgobmFtZSk6CisgICAgIiIiIHJldHVybiBhIG1vcmUgcXVhbGlmaWVkIHBhdGggdG8gbmFtZSIiIgorICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgb3MKKyAgICBwYXRoID0gc3lzLnBhdGgKKyAgICB0cnk6CisgICAgICAgIHBhdGggPSBbb3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKV0gKyBwYXRoCisgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGZvciBkaXIgaW4gcGF0aDoKKyAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmdWxsbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gZnVsbG5hbWUKKyAgICByZXR1cm4gbmFtZQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFnZW9wLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGUwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFnZW9wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFnZW9wLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYWdlb3AucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NGUwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFnZW9wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFwbGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1hcGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIyMTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1hcGxpYi5weQpAQCAtMCwwICsxLDI0MCBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorIyBJZiB3ZSBlbmQgdXAgd2l0aCBhIHNpZ25pZmljYW50IG51bWJlciBvZiB0ZXN0cyB0aGF0IGRvbid0IHJlcXVpcmUKKyMgdGhyZWFkaW5nLCB0aGlzIHRlc3QgbW9kdWxlIHNob3VsZCBiZSBzcGxpdC4gIFJpZ2h0IG5vdyB3ZSBza2lwCisjIHRoZW0gYWxsIGlmIHdlIGRvbid0IGhhdmUgdGhyZWFkaW5nLgordGhyZWFkaW5nID0gc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCitpbXBvcnQgaW1hcGxpYgoraW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBTb2NrZXRTZXJ2ZXIKK2ltcG9ydCB0aW1lCisKK2Zyb20gdGVzdF9zdXBwb3J0IGltcG9ydCByZWFwX3RocmVhZHMsIHZlcmJvc2UsIHRyYW5zaWVudF9pbnRlcm5ldAoraW1wb3J0IHVuaXR0ZXN0CisKK3RyeToKKyAgICBpbXBvcnQgc3NsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgc3NsID0gTm9uZQorCitDRVJURklMRSA9IE5vbmUKKworCitjbGFzcyBUZXN0SW1hcGxpYih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90aGF0X1RpbWUySW50ZXJuYWxkYXRlX3JldHVybnNfYV9yZXN1bHQoc2VsZik6CisgICAgICAgICMgV2UgY2FuIGNoZWNrIG9ubHkgdGhhdCBpdCBzdWNjZXNzZnVsbHkgcHJvZHVjZXMgYSByZXN1bHQsCisgICAgICAgICMgbm90IHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgcmVzdWx0IGl0c2VsZiwgc2luY2UgdGhlIHJlc3VsdAorICAgICAgICAjIGRlcGVuZHMgb24gdGhlIHRpbWV6b25lIHRoZSBtYWNoaW5lIGlzIGluLgorICAgICAgICB0aW1ldmFsdWVzID0gWzIwMDAwMDAwMDAsIDIwMDAwMDAwMDAuMCwgdGltZS5sb2NhbHRpbWUoMjAwMDAwMDAwMCksCisgICAgICAgICAgICAgICAgICAgICAgJyIxOC1NYXktMjAzMyAwNTozMzoyMCArMDIwMCInXQorCisgICAgICAgIGZvciB0IGluIHRpbWV2YWx1ZXM6CisgICAgICAgICAgICBpbWFwbGliLlRpbWUySW50ZXJuYWxkYXRlKHQpCisKKworaWYgc3NsOgorCisgICAgY2xhc3MgU2VjdXJlVENQU2VydmVyKFNvY2tldFNlcnZlci5UQ1BTZXJ2ZXIpOgorCisgICAgICAgIGRlZiBnZXRfcmVxdWVzdChzZWxmKToKKyAgICAgICAgICAgIG5ld3NvY2tldCwgZnJvbWFkZHIgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgY29ubnN0cmVhbSA9IHNzbC53cmFwX3NvY2tldChuZXdzb2NrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPUNFUlRGSUxFKQorICAgICAgICAgICAgcmV0dXJuIGNvbm5zdHJlYW0sIGZyb21hZGRyCisKKyAgICBJTUFQNF9TU0wgPSBpbWFwbGliLklNQVA0X1NTTAorCitlbHNlOgorCisgICAgY2xhc3MgU2VjdXJlVENQU2VydmVyOgorICAgICAgICBwYXNzCisKKyAgICBJTUFQNF9TU0wgPSBOb25lCisKKworY2xhc3MgU2ltcGxlSU1BUEhhbmRsZXIoU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKworICAgIHRpbWVvdXQgPSAxCisKKyAgICBkZWYgX3NlbmQoc2VsZiwgbWVzc2FnZSk6CisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJTRU5UOiIsIG1lc3NhZ2Uuc3RyaXAoKQorICAgICAgICBzZWxmLndmaWxlLndyaXRlKG1lc3NhZ2UpCisKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAjIFNlbmQgYSB3ZWxjb21lIG1lc3NhZ2UuCisgICAgICAgIHNlbGYuX3NlbmQoJyogT0sgSU1BUDRyZXYxXHJcbicpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIEdhdGhlciB1cCBpbnB1dCB1bnRpbCB3ZSByZWNlaXZlIGEgbGluZSB0ZXJtaW5hdG9yIG9yIHdlIHRpbWVvdXQuCisgICAgICAgICAgICAjIEFjY3VtdWxhdGUgcmVhZCgxKSBiZWNhdXNlIGl0J3Mgc2ltcGxlciB0byBoYW5kbGUgdGhlIGRpZmZlcmVuY2VzCisgICAgICAgICAgICAjIGJldHdlZW4gbmFrZWQgc29ja2V0cyBhbmQgU1NMIHNvY2tldHMuCisgICAgICAgICAgICBsaW5lID0gJycKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gc2VsZi5yZmlsZS5yZWFkKDEpCisgICAgICAgICAgICAgICAgICAgIGlmIHBhcnQgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICAjIE5ha2VkIHNvY2tldHMgcmV0dXJuIGVtcHR5IHN0cmluZ3MuLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgICAgIGxpbmUgKz0gcGFydAorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAjIC4uYnV0IFNTTFNvY2tldHMgcmFpc2UgZXhjZXB0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgaWYgbGluZS5lbmRzd2l0aCgnXHJcbicpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAnR09UOicsIGxpbmUuc3RyaXAoKQorICAgICAgICAgICAgc3BsaXRsaW5lID0gbGluZS5zcGxpdCgpCisgICAgICAgICAgICB0YWcgPSBzcGxpdGxpbmVbMF0KKyAgICAgICAgICAgIGNtZCA9IHNwbGl0bGluZVsxXQorICAgICAgICAgICAgYXJncyA9IHNwbGl0bGluZVsyOl0KKworICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnY21kXyVzJyAlIChjbWQsKSk6CisgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLCAnY21kXyVzJyAlIChjbWQsKSkodGFnLCBhcmdzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9zZW5kKCclcyBCQUQgJXMgdW5rbm93blxyXG4nICUgKHRhZywgY21kKSkKKworICAgIGRlZiBjbWRfQ0FQQUJJTElUWShzZWxmLCB0YWcsIGFyZ3MpOgorICAgICAgICBzZWxmLl9zZW5kKCcqIENBUEFCSUxJVFkgSU1BUDRyZXYxXHJcbicpCisgICAgICAgIHNlbGYuX3NlbmQoJyVzIE9LIENBUEFCSUxJVFkgY29tcGxldGVkXHJcbicgJSAodGFnLCkpCisKKworY2xhc3MgQmFzZVRocmVhZGVkTmV0d29ya2VkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIG1ha2Vfc2VydmVyKHNlbGYsIGFkZHIsIGhkbHIpOgorCisgICAgICAgIGNsYXNzIE15U2VydmVyKHNlbGYuc2VydmVyX2NsYXNzKToKKyAgICAgICAgICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgcmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpOgorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VfcmVxdWVzdChyZXF1ZXN0KQorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJjcmVhdGluZyBzZXJ2ZXIiCisgICAgICAgIHNlcnZlciA9IE15U2VydmVyKGFkZHIsIGhkbHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VydmVyLnNlcnZlcl9hZGRyZXNzLCBzZXJ2ZXIuc29ja2V0LmdldHNvY2tuYW1lKCkpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJzZXJ2ZXIgY3JlYXRlZCIKKyAgICAgICAgICAgIHByaW50ICJBRERSID0iLCBhZGRyCisgICAgICAgICAgICBwcmludCAiQ0xBU1MgPSIsIHNlbGYuc2VydmVyX2NsYXNzCisgICAgICAgICAgICBwcmludCAiSERMUiA9Iiwgc2VydmVyLlJlcXVlc3RIYW5kbGVyQ2xhc3MKKworICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCgKKyAgICAgICAgICAgIG5hbWU9JyVzIHNlcnZpbmcnICUgc2VsZi5zZXJ2ZXJfY2xhc3MsCisgICAgICAgICAgICB0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIsCisgICAgICAgICAgICAjIFNob3J0IHBvbGwgaW50ZXJ2YWwgdG8gbWFrZSB0aGUgdGVzdCBmaW5pc2ggcXVpY2tseS4KKyAgICAgICAgICAgICMgVGltZSBiZXR3ZWVuIHJlcXVlc3RzIGlzIHNob3J0IGVub3VnaCB0aGF0IHdlIHdvbid0IHdha2UKKyAgICAgICAgICAgICMgdXAgc3B1cmlvdXNseSB0b28gbWFueSB0aW1lcy4KKyAgICAgICAgICAgIGt3YXJncz17J3BvbGxfaW50ZXJ2YWwnOjAuMDF9KQorICAgICAgICB0LmRhZW1vbiA9IFRydWUgICMgSW4gY2FzZSB0aGlzIGZ1bmN0aW9uIHJhaXNlcy4KKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJzZXJ2ZXIgcnVubmluZyIKKyAgICAgICAgcmV0dXJuIHNlcnZlciwgdAorCisgICAgZGVmIHJlYXBfc2VydmVyKHNlbGYsIHNlcnZlciwgdGhyZWFkKToKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIndhaXRpbmcgZm9yIHNlcnZlciIKKyAgICAgICAgc2VydmVyLnNodXRkb3duKCkKKyAgICAgICAgdGhyZWFkLmpvaW4oKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiZG9uZSIKKworICAgIEBjb250ZXh0bWFuYWdlcgorICAgIGRlZiByZWFwZWRfc2VydmVyKHNlbGYsIGhkbHIpOgorICAgICAgICBzZXJ2ZXIsIHRocmVhZCA9IHNlbGYubWFrZV9zZXJ2ZXIoKHN1cHBvcnQuSE9TVCwgMCksIGhkbHIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlcnZlcgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZWFwX3NlcnZlcihzZXJ2ZXIsIHRocmVhZCkKKworICAgIEByZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF9jb25uZWN0KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYucmVhcGVkX3NlcnZlcihTaW1wbGVJTUFQSGFuZGxlcikgYXMgc2VydmVyOgorICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5pbWFwX2NsYXNzKCpzZXJ2ZXIuc2VydmVyX2FkZHJlc3MpCisgICAgICAgICAgICBjbGllbnQuc2h1dGRvd24oKQorCisgICAgQHJlYXBfdGhyZWFkcworICAgIGRlZiB0ZXN0X2lzc3VlNTk0OShzZWxmKToKKworICAgICAgICBjbGFzcyBFT0ZIYW5kbGVyKFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcik6CisgICAgICAgICAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAgICAgICAgICMgRU9GIHdpdGhvdXQgc2VuZGluZyBhIGNvbXBsZXRlIHdlbGNvbWUgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKCcqIE9LJykKKworICAgICAgICB3aXRoIHNlbGYucmVhcGVkX3NlcnZlcihFT0ZIYW5kbGVyKSBhcyBzZXJ2ZXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhpbWFwbGliLklNQVA0LmFib3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbWFwX2NsYXNzLCAqc2VydmVyLnNlcnZlcl9hZGRyZXNzKQorCisKK2NsYXNzIFRocmVhZGVkTmV0d29ya2VkVGVzdHMoQmFzZVRocmVhZGVkTmV0d29ya2VkVGVzdHMpOgorCisgICAgc2VydmVyX2NsYXNzID0gU29ja2V0U2VydmVyLlRDUFNlcnZlcgorICAgIGltYXBfY2xhc3MgPSBpbWFwbGliLklNQVA0CisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3NsLCAiU1NMIG5vdCBhdmFpbGFibGUiKQorY2xhc3MgVGhyZWFkZWROZXR3b3JrZWRUZXN0c1NTTChCYXNlVGhyZWFkZWROZXR3b3JrZWRUZXN0cyk6CisKKyAgICBzZXJ2ZXJfY2xhc3MgPSBTZWN1cmVUQ1BTZXJ2ZXIKKyAgICBpbWFwX2NsYXNzID0gSU1BUDRfU1NMCisKKworY2xhc3MgUmVtb3RlSU1BUFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGhvc3QgPSAnY3lydXMuYW5kcmV3LmNtdS5lZHUnCisgICAgcG9ydCA9IDE0MworICAgIHVzZXJuYW1lID0gJ2Fub255bW91cycKKyAgICBwYXNzd29yZCA9ICdwYXNzJworICAgIGltYXBfY2xhc3MgPSBpbWFwbGliLklNQVA0CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHdpdGggdHJhbnNpZW50X2ludGVybmV0KHNlbGYuaG9zdCk6CisgICAgICAgICAgICBzZWxmLnNlcnZlciA9IHNlbGYuaW1hcF9jbGFzcyhzZWxmLmhvc3QsIHNlbGYucG9ydCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5zZXJ2ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5sb2dvdXQoKQorCisgICAgZGVmIHRlc3RfbG9naW5jYXBhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0xPR0lORElTQUJMRUQnIGluIHNlbGYuc2VydmVyLmNhcGFiaWxpdGllcykKKworICAgIGRlZiB0ZXN0X2Fub25sb2dpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdBVVRIPUFOT05ZTU9VUycgaW4gc2VsZi5zZXJ2ZXIuY2FwYWJpbGl0aWVzKQorICAgICAgICBycyA9IHNlbGYuc2VydmVyLmxvZ2luKHNlbGYudXNlcm5hbWUsIHNlbGYucGFzc3dvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnNbMF0sICdPSycpCisKKyAgICBkZWYgdGVzdF9sb2dvdXQoc2VsZik6CisgICAgICAgIHJzID0gc2VsZi5zZXJ2ZXIubG9nb3V0KCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnNbMF0sICdCWUUnKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHNzbCwgIlNTTCBub3QgYXZhaWxhYmxlIikKK2NsYXNzIFJlbW90ZUlNQVBfU1NMVGVzdChSZW1vdGVJTUFQVGVzdCk6CisgICAgcG9ydCA9IDk5MworICAgIGltYXBfY2xhc3MgPSBJTUFQNF9TU0wKKworICAgIGRlZiB0ZXN0X2xvZ2luY2FwYShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgnTE9HSU5ESVNBQkxFRCcgaW4gc2VsZi5zZXJ2ZXIuY2FwYWJpbGl0aWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0FVVEg9UExBSU4nIGluIHNlbGYuc2VydmVyLmNhcGFiaWxpdGllcykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdHMgPSBbVGVzdEltYXBsaWJdCisKKyAgICBpZiBzdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoJ25ldHdvcmsnKToKKyAgICAgICAgaWYgc3NsOgorICAgICAgICAgICAgZ2xvYmFsIENFUlRGSUxFCisgICAgICAgICAgICBDRVJURklMRSA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXljZXJ0LnBlbSIpCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoQ0VSVEZJTEUpOgorICAgICAgICAgICAgICAgIHJhaXNlIHN1cHBvcnQuVGVzdEZhaWxlZCgiQ2FuJ3QgcmVhZCBjZXJ0aWZpY2F0ZSBmaWxlcyEiKQorICAgICAgICB0ZXN0cy5leHRlbmQoWworICAgICAgICAgICAgVGhyZWFkZWROZXR3b3JrZWRUZXN0cywgVGhyZWFkZWROZXR3b3JrZWRUZXN0c1NTTCwKKyAgICAgICAgICAgIFJlbW90ZUlNQVBUZXN0LCBSZW1vdGVJTUFQX1NTTFRlc3QsCisgICAgICAgIF0pCisKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzdXBwb3J0LnVzZV9yZXNvdXJjZXMgPSBbJ25ldHdvcmsnXQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFwbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYXBsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDg0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFwbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFwbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltYXBsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDg0YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWFwbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbWdmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOWU4OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weQpAQCAtMCwwICsxLDExOSBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJTaW1wbGUgdGVzdCBzY3JpcHQgZm9yIGltZ2ZpbGUuYworICAgUm9nZXIgRS4gTWFzc2UKKyIiIgorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCB1bmxpbmssIGZpbmRmaWxlLCBpbXBvcnRfbW9kdWxlCisKK2ltZ2ZpbGUgPSBpbXBvcnRfbW9kdWxlKCdpbWdmaWxlJywgZGVwcmVjYXRlZD1UcnVlKQoraW1wb3J0IHV1CisKKworZGVmIHRlc3RpbWFnZShuYW1lKToKKyAgICAiIiJSdW4gdGhyb3VnaCB0aGUgaW1nZmlsZSdzIGJhdHRlcnkgb2YgcG9zc2libGUgbWV0aG9kcworICAgICAgIG9uIHRoZSBpbWFnZSBwYXNzZWQgaW4gbmFtZS4KKyAgICAiIiIKKworICAgIGltcG9ydCBzeXMKKyAgICBpbXBvcnQgb3MKKworICAgIG91dHB1dGZpbGUgPSAnL3RtcC9kZWxldGVtZScKKworICAgICMgdHJ5IG9wZW5pbmcgdGhlIG5hbWUgZGlyZWN0bHkKKyAgICB0cnk6CisgICAgICAgICMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgdHVwbGUgKHgsIHksIHopIHdoZXJlIHggYW5kIHkgYXJlIHRoZSBzaXplCisgICAgICAgICMgb2YgdGhlIGltYWdlIGluIHBpeGVscyBhbmQgeiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbC4gT25seQorICAgICAgICAjIDMgYnl0ZSBSR0IgcGl4ZWxzIGFuZCAxIGJ5dGUgZ3JleXNjYWxlIHBpeGVscyBhcmUgc3VwcG9ydGVkLgorICAgICAgICBzaXplcyA9IGltZ2ZpbGUuZ2V0c2l6ZXMobmFtZSkKKyAgICBleGNlcHQgaW1nZmlsZS5lcnJvcjoKKyAgICAgICAgIyBnZXQgYSBtb3JlIHF1YWxpZmllZCBwYXRoIGNvbXBvbmVudCBvZiB0aGUgc2NyaXB0Li4uCisgICAgICAgIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgICAgICAgICBvdXJuYW1lID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgZWxzZTogIyAuLi5vciB0aGUgZnVsbCBwYXRoIG9mIHRoZSBtb2R1bGUKKyAgICAgICAgICAgIG91cm5hbWUgPSBzeXMubW9kdWxlc1tfX25hbWVfX10uX19maWxlX18KKworICAgICAgICBwYXJ0cyA9IG91cm5hbWUuc3BsaXQob3Muc2VwKQorICAgICAgICBwYXJ0c1stMV0gPSBuYW1lCisgICAgICAgIG5hbWUgPSBvcy5zZXAuam9pbihwYXJ0cykKKyAgICAgICAgc2l6ZXMgPSBpbWdmaWxlLmdldHNpemVzKG5hbWUpCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ09wZW5pbmcgdGVzdCBpbWFnZTogJXMsIHNpemVzOiAlcycgJSAobmFtZSwgc3RyKHNpemVzKSkKKyAgICAjIFRoaXMgZnVuY3Rpb24gcmVhZHMgYW5kIGRlY29kZXMgdGhlIGltYWdlIG9uIHRoZSBzcGVjaWZpZWQgZmlsZSwKKyAgICAjIGFuZCByZXR1cm5zIGl0IGFzIGEgcHl0aG9uIHN0cmluZy4gVGhlIHN0cmluZyBoYXMgZWl0aGVyIDEgYnl0ZQorICAgICMgZ3JleXNjYWxlIHBpeGVscyBvciA0IGJ5dGUgUkdCQSBwaXhlbHMuIFRoZSBib3R0b20gbGVmdCBwaXhlbAorICAgICMgaXMgdGhlIGZpcnN0IGluIHRoZSBzdHJpbmcuIFRoaXMgZm9ybWF0IGlzIHN1aXRhYmxlIHRvIHBhc3MKKyAgICAjIHRvIGdsLmxyZWN0d3JpdGUsIGZvciBpbnN0YW5jZS4KKyAgICBpbWFnZSA9IGltZ2ZpbGUucmVhZChuYW1lKQorCisgICAgIyBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgUkdCIG9yIGdyZXlzY2FsZSBkYXRhIGluIGRhdGEgdG8KKyAgICAjIGltYWdlIGZpbGUgZmlsZS4geCBhbmQgeSBnaXZlIHRoZSBzaXplIG9mIHRoZSBpbWFnZSwgeiBpcworICAgICMgMSBmb3IgMSBieXRlIGdyZXlzY2FsZSBpbWFnZXMgb3IgMyBmb3IgUkdCIGltYWdlcyAod2hpY2gKKyAgICAjIGFyZSBzdG9yZWQgYXMgNCBieXRlIHZhbHVlcyBvZiB3aGljaCBvbmx5IHRoZSBsb3dlciB0aHJlZQorICAgICMgYnl0ZXMgYXJlIHVzZWQpLiBUaGVzZSBhcmUgdGhlIGZvcm1hdHMgcmV0dXJuZWQgYnkgZ2wubHJlY3RyZWFkLgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdXcml0aW5nIG91dHB1dCBmaWxlJworICAgIGltZ2ZpbGUud3JpdGUgKG91dHB1dGZpbGUsIGltYWdlLCBzaXplc1swXSwgc2l6ZXNbMV0sIHNpemVzWzJdKQorCisKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnT3BlbmluZyBzY2FsZWQgdGVzdCBpbWFnZTogJXMsIHNpemVzOiAlcycgJSAobmFtZSwgc3RyKHNpemVzKSkKKyAgICAjIFRoaXMgZnVuY3Rpb24gaXMgaWRlbnRpY2FsIHRvIHJlYWQgYnV0IGl0IHJldHVybnMgYW4gaW1hZ2UgdGhhdAorICAgICMgaXMgc2NhbGVkIHRvIHRoZSBnaXZlbiB4IGFuZCB5IHNpemVzLiBJZiB0aGUgZmlsdGVyIGFuZCBibHVyCisgICAgIyBwYXJhbWV0ZXJzIGFyZSBvbWl0dGVkIHNjYWxpbmcgaXMgZG9uZSBieSBzaW1wbHkgZHJvcHBpbmcKKyAgICAjIG9yIGR1cGxpY2F0aW5nIHBpeGVscywgc28gdGhlIHJlc3VsdCB3aWxsIGJlIGxlc3MgdGhhbiBwZXJmZWN0LAorICAgICMgZXNwZWNpYWxseSBmb3IgY29tcHV0ZXItZ2VuZXJhdGVkIGltYWdlcy4gIEFsdGVybmF0aXZlbHksCisgICAgIyB5b3UgY2FuIHNwZWNpZnkgYSBmaWx0ZXIgdG8gdXNlIHRvIHNtb290aGVuIHRoZSBpbWFnZSBhZnRlcgorICAgICMgc2NhbGluZy4gVGhlIGZpbHRlciBmb3JtcyBzdXBwb3J0ZWQgYXJlICdpbXB1bHNlJywgJ2JveCcsCisgICAgIyAndHJpYW5nbGUnLCAncXVhZHJhdGljJyBhbmQgJ2dhdXNzaWFuJy4gSWYgYSBmaWx0ZXIgaXMKKyAgICAjIHNwZWNpZmllZCBibHVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciBzcGVjaWZ5aW5nIHRoZQorICAgICMgYmx1cnJpbmVzcyBvZiB0aGUgZmlsdGVyLiBJdCBkZWZhdWx0cyB0byAxLjAuICByZWFkc2NhbGVkCisgICAgIyBtYWtlcyBubyBhdHRlbXB0IHRvIGtlZXAgdGhlIGFzcGVjdCByYXRpbyBjb3JyZWN0LCBzbyB0aGF0CisgICAgIyBpcyB0aGUgdXNlcnMnIHJlc3BvbnNpYmlsaXR5LgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdGaWx0ZXJpbmcgd2l0aCAiaW1wdWxzZSInCisgICAgc2ltYWdlID0gaW1nZmlsZS5yZWFkc2NhbGVkIChuYW1lLCBzaXplc1swXS8yLCBzaXplc1sxXS8yLCAnaW1wdWxzZScsIDIuMCkKKworICAgICMgVGhpcyBmdW5jdGlvbiBzZXRzIGEgZ2xvYmFsIGZsYWcgd2hpY2ggZGVmaW5lcyB3aGV0aGVyIHRoZQorICAgICMgc2NhbiBsaW5lcyBvZiB0aGUgaW1hZ2UgYXJlIHJlYWQgb3Igd3JpdHRlbiBmcm9tIGJvdHRvbSB0bworICAgICMgdG9wIChmbGFnIGlzIHplcm8sIGNvbXBhdGlibGUgd2l0aCBTR0kgR0wpIG9yIGZyb20gdG9wIHRvCisgICAgIyBib3R0b20oZmxhZyBpcyBvbmUsIGNvbXBhdGlibGUgd2l0aCBYKS4gVGhlIGRlZmF1bHQgaXMgemVyby4KKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnU3dpdGNoaW5nIHRvIFggY29tcGF0aWJpbGl0eScKKyAgICBpbWdmaWxlLnR0b2IgKDEpCisKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnRmlsdGVyaW5nIHdpdGggInRyaWFuZ2xlIicKKyAgICBzaW1hZ2UgPSBpbWdmaWxlLnJlYWRzY2FsZWQgKG5hbWUsIHNpemVzWzBdLzIsIHNpemVzWzFdLzIsICd0cmlhbmdsZScsIDMuMCkKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnU3dpdGNoaW5nIGJhY2sgdG8gU0dJIGNvbXBhdGliaWxpdHknCisgICAgaW1nZmlsZS50dG9iICgwKQorCisgICAgaWYgdmVyYm9zZTogcHJpbnQgJ0ZpbHRlcmluZyB3aXRoICJxdWFkcmF0aWMiJworICAgIHNpbWFnZSA9IGltZ2ZpbGUucmVhZHNjYWxlZCAobmFtZSwgc2l6ZXNbMF0vMiwgc2l6ZXNbMV0vMiwgJ3F1YWRyYXRpYycpCisgICAgaWYgdmVyYm9zZTogcHJpbnQgJ0ZpbHRlcmluZyB3aXRoICJnYXVzc2lhbiInCisgICAgc2ltYWdlID0gaW1nZmlsZS5yZWFkc2NhbGVkIChuYW1lLCBzaXplc1swXS8yLCBzaXplc1sxXS8yLCAnZ2F1c3NpYW4nLCAxLjApCisKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnV3JpdGluZyBvdXRwdXQgZmlsZScKKyAgICBpbWdmaWxlLndyaXRlIChvdXRwdXRmaWxlLCBzaW1hZ2UsIHNpemVzWzBdLzIsIHNpemVzWzFdLzIsIHNpemVzWzJdKQorCisgICAgb3MudW5saW5rKG91dHB1dGZpbGUpCisKKworZGVmIHRlc3RfbWFpbigpOgorCisgICAgdXUuZGVjb2RlKGZpbmRmaWxlKCd0ZXN0cmdiLnV1ZScpLCAndGVzdC5yZ2InKQorICAgIHV1LmRlY29kZShmaW5kZmlsZSgnZ3JleXJnYi51dWUnKSwgJ2dyZXl0ZXN0LnJnYicpCisKKyAgICAjIFRlc3QgYSAzIGJ5dGUgY29sb3IgaW1hZ2UKKyAgICB0ZXN0aW1hZ2UoJ3Rlc3QucmdiJykKKworICAgICMgVGVzdCBhIDEgYnl0ZSBncmV5c2NhbGUgaW1hZ2UKKyAgICB0ZXN0aW1hZ2UoJ2dyZXl0ZXN0LnJnYicpCisKKyAgICB1bmxpbmsoJ3Rlc3QucmdiJykKKyAgICB1bmxpbmsoJ2dyZXl0ZXN0LnJnYicpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltZ2ZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNTIyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltZ2ZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltZ2ZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1nZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzNTIyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltZ2ZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U0NGJlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5CkBAIC0wLDAgKzEsODEgQEAKK2ltcG9ydCBpbXAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBMb2NrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVmVyeSBiYXNpYyB0ZXN0IG9mIGltcG9ydCBsb2NrIGZ1bmN0aW9ucy4iIiIKKworICAgIGRlZiB2ZXJpZnlfbG9ja19zdGF0ZShzZWxmLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW1wLmxvY2tfaGVsZCgpLCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGltcC5sb2NrX2hlbGQoKSB0byBiZSAlciIgJSBleHBlY3RlZCkKKyAgICBkZWYgdGVzdExvY2soc2VsZik6CisgICAgICAgIExPT1BTID0gNTAKKworICAgICAgICAjIFRoZSBpbXBvcnQgbG9jayBtYXkgYWxyZWFkeSBiZSBoZWxkLCBlLmcuIGlmIHRoZSB0ZXN0IHN1aXRlIGlzIHJ1bgorICAgICAgICAjIHZpYSAiaW1wb3J0IHRlc3QuYXV0b3Rlc3QiLgorICAgICAgICBsb2NrX2hlbGRfYXRfc3RhcnQgPSBpbXAubG9ja19oZWxkKCkKKyAgICAgICAgc2VsZi52ZXJpZnlfbG9ja19zdGF0ZShsb2NrX2hlbGRfYXRfc3RhcnQpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTE9PUFMpOgorICAgICAgICAgICAgaW1wLmFjcXVpcmVfbG9jaygpCisgICAgICAgICAgICBzZWxmLnZlcmlmeV9sb2NrX3N0YXRlKFRydWUpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTE9PUFMpOgorICAgICAgICAgICAgaW1wLnJlbGVhc2VfbG9jaygpCisKKyAgICAgICAgIyBUaGUgb3JpZ2luYWwgc3RhdGUgc2hvdWxkIGJlIHJlc3RvcmVkIG5vdy4KKyAgICAgICAgc2VsZi52ZXJpZnlfbG9ja19zdGF0ZShsb2NrX2hlbGRfYXRfc3RhcnQpCisKKyAgICAgICAgaWYgbm90IGxvY2tfaGVsZF9hdF9zdGFydDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInJlbGVhc2VfbG9jaygpIHdpdGhvdXQgbG9jayBzaG91bGQgcmFpc2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSdW50aW1lRXJyb3IiKQorCitjbGFzcyBSZWxvYWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJWZXJ5IGJhc2ljIHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGF0IGltcC5yZWxvYWQoKSBvcGVyYXRlcyBqdXN0IGxpa2UKKyAgICByZWxvYWQoKS4iIiIKKworICAgIGRlZiB0ZXN0X3NvdXJjZShzZWxmKToKKyAgICAgICAgIyBYWFggKG5jb2dobGFuKTogSXQgd291bGQgYmUgbmljZSB0byB1c2UgdGVzdF9zdXBwb3J0LkNsZWFuSW1wb3J0CisgICAgICAgICMgaGVyZSwgYnV0IHRoYXQgYnJlYWtzIGJlY2F1c2UgdGhlIG9zIG1vZHVsZSByZWdpc3RlcnMgc29tZQorICAgICAgICAjIGhhbmRsZXJzIGluIGNvcHlfcmVnIG9uIGltcG9ydC4gU2luY2UgQ2xlYW5JbXBvcnQgZG9lc24ndAorICAgICAgICAjIHJldmVydCB0aGF0IHJlZ2lzdHJhdGlvbiwgdGhlIG1vZHVsZSBpcyBsZWZ0IGluIGEgYnJva2VuCisgICAgICAgICMgc3RhdGUgYWZ0ZXIgcmV2ZXJzaW9uLiBSZWluaXRpYWxpc2luZyB0aGUgbW9kdWxlIGNvbnRlbnRzCisgICAgICAgICMgYW5kIGp1c3QgcmV2ZXJ0aW5nIG9zLmVudmlyb24gdG8gaXRzIHByZXZpb3VzIHN0YXRlIGlzIGFuIE9LCisgICAgICAgICMgd29ya2Fyb3VuZAorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCk6CisgICAgICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgICAgIGltcC5yZWxvYWQob3MpCisKKyAgICBkZWYgdGVzdF9leHRlbnNpb24oc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkNsZWFuSW1wb3J0KCd0aW1lJyk6CisgICAgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgICAgaW1wLnJlbG9hZCh0aW1lKQorCisgICAgZGVmIHRlc3RfYnVpbHRpbihzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuQ2xlYW5JbXBvcnQoJ21hcnNoYWwnKToKKyAgICAgICAgICAgIGltcG9ydCBtYXJzaGFsCisgICAgICAgICAgICBpbXAucmVsb2FkKG1hcnNoYWwpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gWworICAgICAgICBSZWxvYWRUZXN0cywKKyAgICBdCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgdGhyZWFkCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgdGVzdHMuYXBwZW5kKExvY2tUZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4YmJlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4YmJlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2RhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnQucHkKQEAgLTAsMCArMSw2NTAgQEAKK2ltcG9ydCBlcnJubworaW1wb3J0IGltcAoraW1wb3J0IG1hcnNoYWwKK2ltcG9ydCBvcworaW1wb3J0IHB5X2NvbXBpbGUKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzdGF0CitpbXBvcnQgc3RydWN0CitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IHNodXRpbAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAodW5saW5rLCBURVNURk4sIHVubG9hZCwgcnVuX3VuaXR0ZXN0LCBybXRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfanl0aG9uLCBjaGVja193YXJuaW5ncywgRW52aXJvbm1lbnRWYXJHdWFyZCkKK2Zyb20gdGVzdCBpbXBvcnQgc3ltbGlua19zdXBwb3J0Citmcm9tIHRlc3QgaW1wb3J0IHNjcmlwdF9oZWxwZXIKKworZGVmIF9maWxlcyhuYW1lKToKKyAgICByZXR1cm4gKG5hbWUgKyBvcy5leHRzZXAgKyAicHkiLAorICAgICAgICAgICAgbmFtZSArIG9zLmV4dHNlcCArICJweWMiLAorICAgICAgICAgICAgbmFtZSArIG9zLmV4dHNlcCArICJweW8iLAorICAgICAgICAgICAgbmFtZSArIG9zLmV4dHNlcCArICJweXciLAorICAgICAgICAgICAgbmFtZSArICIkcHkuY2xhc3MiKQorCitkZWYgY2htb2RfZmlsZXMobmFtZSk6CisgICAgZm9yIGYgaW4gX2ZpbGVzKG5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jaG1vZChmLCAwNjAwKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBleGM6CisgICAgICAgICAgICBpZiBleGMuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgIHJhaXNlCisKK2RlZiByZW1vdmVfZmlsZXMobmFtZSk6CisgICAgZm9yIGYgaW4gX2ZpbGVzKG5hbWUpOgorICAgICAgICB1bmxpbmsoZikKKworCitjbGFzcyBJbXBvcnRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHVubG9hZChURVNURk4pCisgICAgc2V0VXAgPSB0ZWFyRG93bgorCisgICAgZGVmIHRlc3RfY2FzZV9zZW5zaXRpdml0eShzZWxmKToKKyAgICAgICAgIyBCcmllZiBkaWdyZXNzaW9uIHRvIHRlc3QgdGhhdCBpbXBvcnQgaXMgY2FzZS1zZW5zaXRpdmU6ICBpZiB3ZSBnb3QKKyAgICAgICAgIyB0aGlzIGZhciwgd2Uga25vdyBmb3Igc3VyZSB0aGF0ICJyYW5kb20iIGV4aXN0cy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IFJBbkRvTQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImltcG9ydCBvZiBSQW5Eb00gc2hvdWxkIGhhdmUgZmFpbGVkIChjYXNlIG1pc21hdGNoKSIpCisKKyAgICBkZWYgdGVzdF9kb3VibGVfY29uc3Qoc2VsZik6CisgICAgICAgICMgQW5vdGhlciBicmllZiBkaWdyZXNzaW9uIHRvIHRlc3QgdGhlIGFjY3VyYWN5IG9mIG1hbmlmZXN0IGZsb2F0CisgICAgICAgICMgY29uc3RhbnRzLgorICAgICAgICBmcm9tIHRlc3QgaW1wb3J0IGRvdWJsZV9jb25zdCAgIyBkb24ndCBibGluayAtLSB0aGF0ICp3YXMqIHRoZSB0ZXN0CisKKyAgICBkZWYgdGVzdF9pbXBvcnQoc2VsZik6CisgICAgICAgIGRlZiB0ZXN0X3dpdGhfZXh0ZW5zaW9uKGV4dCk6CisgICAgICAgICAgICAjIFRoZSBleHRlbnNpb24gaXMgbm9ybWFsbHkgIi5weSIsIHBlcmhhcHMgIi5weXciLgorICAgICAgICAgICAgc291cmNlID0gVEVTVEZOICsgZXh0CisgICAgICAgICAgICBweW8gPSBURVNURk4gKyBvcy5leHRzZXAgKyAicHlvIgorICAgICAgICAgICAgaWYgaXNfanl0aG9uOgorICAgICAgICAgICAgICAgIHB5YyA9IFRFU1RGTiArICIkcHkuY2xhc3MiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHB5YyA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweWMiCisKKyAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2UsICJ3IikgYXMgZjoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBmLCAoIiMgVGhpcyB0ZXN0cyBQeXRob24ncyBhYmlsaXR5IHRvIGltcG9ydCBhIiwgZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS4iKQorICAgICAgICAgICAgICAgIGEgPSByYW5kb20ucmFuZHJhbmdlKDEwMDApCisgICAgICAgICAgICAgICAgYiA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwMCkKKyAgICAgICAgICAgICAgICBwcmludCA+PiBmLCAiYSA9IiwgYQorICAgICAgICAgICAgICAgIHByaW50ID4+IGYsICJiID0iLCBiCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiaW1wb3J0IGZyb20gJXMgZmFpbGVkOiAlcyIgJSAoZXh0LCBlcnIpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5hLCBhLAorICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGxvYWRlZCAoJXMpIGJ1dCBjb250ZW50cyBpbnZhbGlkIiAlIG1vZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iLCBiLAorICAgICAgICAgICAgICAgICAgICAibW9kdWxlIGxvYWRlZCAoJXMpIGJ1dCBjb250ZW50cyBpbnZhbGlkIiAlIG1vZCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdW5saW5rKHNvdXJjZSkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKKyAgICAgICAgICAgICAgICAgICAgaW1wLnJlbG9hZChtb2QpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImltcG9ydCBmcm9tIC5weWMvLnB5byBmYWlsZWQ6ICVzIiAlIGVycikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdW5saW5rKHB5YykKKyAgICAgICAgICAgICAgICB1bmxpbmsocHlvKQorICAgICAgICAgICAgICAgIHVubG9hZChURVNURk4pCisKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdF93aXRoX2V4dGVuc2lvbihvcy5leHRzZXAgKyAicHkiKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpOgorICAgICAgICAgICAgICAgIGZvciBleHQgaW4gWyIuUFkiLCAiLlB5IiwgIi5wWSIsICIucHl3IiwgIi5QWVciLCAiLnBZdyJdOgorICAgICAgICAgICAgICAgICAgICB0ZXN0X3dpdGhfZXh0ZW5zaW9uKGV4dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Mob3MubmFtZSA9PSAncG9zaXgnLAorICAgICAgICAidGVzdCBtZWFuaW5nZnVsIG9ubHkgb24gcG9zaXggc3lzdGVtcyIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZG9udF93cml0ZV9ieXRlY29kZSwKKyAgICAgICAgInRlc3QgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gd3JpdGluZyBieXRlY29kZSIpCisgICAgZGVmIHRlc3RfZXhlY3V0ZV9iaXRfbm90X2NvcGllZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA2MDcwOiB1bmRlciBwb3NpeCAucHljIGZpbGVzIGdvdCB0aGVpciBleGVjdXRlIGJpdCBzZXQgaWYKKyAgICAgICAgIyB0aGUgLnB5IGZpbGUgaGFkIHRoZSBleGVjdXRlIGJpdCBzZXQsIGJ1dCB0aGV5IGFyZW4ndCBleGVjdXRhYmxlLgorICAgICAgICBvbGRtYXNrID0gb3MudW1hc2soMDIyKQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmbmFtZSA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweSIKKyAgICAgICAgICAgIGYgPSBvcGVuKGZuYW1lLCAndycpLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLmNobW9kKGZuYW1lLCAoc3RhdC5TX0lSVVNSIHwgc3RhdC5TX0lSR1JQIHwgc3RhdC5TX0lST1RIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdC5TX0lYVVNSIHwgc3RhdC5TX0lYR1JQIHwgc3RhdC5TX0lYT1RIKSkKKyAgICAgICAgICAgIF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgZm4gPSBmbmFtZSArICdjJworICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgICAgICBmbiA9IGZuYW1lICsgJ28nCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJfX2ltcG9ydF9fIGRpZCBub3QgcmVzdWx0IGluIGNyZWF0aW9uIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlaXRoZXIgYSAucHljIG9yIC5weW8gZmlsZSIpCisgICAgICAgICAgICBzID0gb3Muc3RhdChmbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5TX0lNT0RFKHMuc3RfbW9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQuU19JUlVTUiB8IHN0YXQuU19JUkdSUCB8IHN0YXQuU19JUk9USCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVtYXNrKG9sZG1hc2spCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorICAgICAgICAgICAgdW5sb2FkKFRFU1RGTikKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZG9udF93cml0ZV9ieXRlY29kZSwKKyAgICAgICAgInRlc3QgbWVhbmluZ2Z1bCBvbmx5IHdoZW4gd3JpdGluZyBieXRlY29kZSIpCisgICAgZGVmIHRlc3RfcmV3cml0ZV9weWNfd2l0aF9yZWFkX29ubHlfc291cmNlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDYwNzQ6IGEgbG9uZyB0aW1lIGFnbyBvbiBwb3NpeCwgYW5kIG1vcmUgcmVjZW50bHkgb24gV2luZG93cywKKyAgICAgICAgIyBhIHJlYWQgb25seSBzb3VyY2UgZmlsZSByZXN1bHRlZCBpbiBhIHJlYWQgb25seSBweWMgZmlsZSwgd2hpY2gKKyAgICAgICAgIyBsZWQgdG8gcHJvYmxlbXMgd2l0aCB1cGRhdGluZyBpdCBsYXRlcgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICBmbmFtZSA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweSIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBXcml0ZSBhIFB5dGhvbiBmaWxlLCBtYWtlIGl0IHJlYWQtb25seSBhbmQgaW1wb3J0IGl0CisgICAgICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJ4ID0gJ29yaWdpbmFsJ1xuIikKKyAgICAgICAgICAgICMgVHdlYWsgdGhlIG10aW1lIG9mIHRoZSBzb3VyY2UgdG8gZW5zdXJlIHB5YyBnZXRzIHVwZGF0ZWQgbGF0ZXIKKyAgICAgICAgICAgIHMgPSBvcy5zdGF0KGZuYW1lKQorICAgICAgICAgICAgb3MudXRpbWUoZm5hbWUsIChzLnN0X2F0aW1lLCBzLnN0X210aW1lLTEwMDAwMDAwMCkpCisgICAgICAgICAgICBvcy5jaG1vZChmbmFtZSwgMDQwMCkKKyAgICAgICAgICAgIG0xID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xLngsICdvcmlnaW5hbCcpCisgICAgICAgICAgICAjIENoYW5nZSB0aGUgZmlsZSBhbmQgdGhlbiByZWltcG9ydCBpdAorICAgICAgICAgICAgb3MuY2htb2QoZm5hbWUsIDA2MDApCisgICAgICAgICAgICB3aXRoIG9wZW4oZm5hbWUsICd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJ4ID0gJ3Jld3JpdHRlbidcbiIpCisgICAgICAgICAgICB1bmxvYWQoVEVTVEZOKQorICAgICAgICAgICAgbTIgPSBfX2ltcG9ydF9fKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTIueCwgJ3Jld3JpdHRlbicpCisgICAgICAgICAgICAjIE5vdyBkZWxldGUgdGhlIHNvdXJjZSBmaWxlIGFuZCBjaGVjayB0aGUgcHljIHdhcyByZXdyaXR0ZW4KKyAgICAgICAgICAgIHVubGluayhmbmFtZSkKKyAgICAgICAgICAgIHVubG9hZChURVNURk4pCisgICAgICAgICAgICBtMyA9IF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMy54LCAncmV3cml0dGVuJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGNobW9kX2ZpbGVzKFRFU1RGTikKKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisgICAgICAgICAgICB1bmxvYWQoVEVTVEZOKQorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisKKyAgICBkZWYgdGVzdF9pbXBfbW9kdWxlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSBpbXAgbW9kdWxlIGNhbiBjb3JyZWN0bHkgbG9hZCBhbmQgZmluZCAucHkgZmlsZXMKKworICAgICAgICAjIFhYWCAobmNvZ2hsYW4pOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSB0ZXN0X3N1cHBvcnQuQ2xlYW5JbXBvcnQKKyAgICAgICAgIyBoZXJlLCBidXQgdGhhdCBicmVha3MgYmVjYXVzZSB0aGUgb3MgbW9kdWxlIHJlZ2lzdGVycyBzb21lCisgICAgICAgICMgaGFuZGxlcnMgaW4gY29weV9yZWcgb24gaW1wb3J0LiBTaW5jZSBDbGVhbkltcG9ydCBkb2Vzbid0CisgICAgICAgICMgcmV2ZXJ0IHRoYXQgcmVnaXN0cmF0aW9uLCB0aGUgbW9kdWxlIGlzIGxlZnQgaW4gYSBicm9rZW4KKyAgICAgICAgIyBzdGF0ZSBhZnRlciByZXZlcnNpb24uIFJlaW5pdGlhbGlzaW5nIHRoZSBtb2R1bGUgY29udGVudHMKKyAgICAgICAgIyBhbmQganVzdCByZXZlcnRpbmcgb3MuZW52aXJvbiB0byBpdHMgcHJldmlvdXMgc3RhdGUgaXMgYW4gT0sKKyAgICAgICAgIyB3b3JrYXJvdW5kCisgICAgICAgIG9yaWdfcGF0aCA9IG9zLnBhdGgKKyAgICAgICAgb3JpZ19nZXRlbnYgPSBvcy5nZXRlbnYKKyAgICAgICAgd2l0aCBFbnZpcm9ubWVudFZhckd1YXJkKCk6CisgICAgICAgICAgICB4ID0gaW1wLmZpbmRfbW9kdWxlKCJvcyIpCisgICAgICAgICAgICBuZXdfb3MgPSBpbXAubG9hZF9tb2R1bGUoIm9zIiwgKngpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKG9zLCBuZXdfb3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKG9yaWdfcGF0aCwgbmV3X29zLnBhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KG9yaWdfZ2V0ZW52LCBuZXdfb3MuZ2V0ZW52KQorCisgICAgZGVmIHRlc3RfbW9kdWxlX3dpdGhfbGFyZ2Vfc3RhY2soc2VsZiwgbW9kdWxlPSdsb25nbGlzdCcpOgorICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTU2MTg1OC4KKyAgICAgICAgZmlsZW5hbWUgPSBtb2R1bGUgKyBvcy5leHRzZXAgKyAncHknCisKKyAgICAgICAgIyBDcmVhdGUgYSBmaWxlIHdpdGggYSBsaXN0IG9mIDY1MDAwIGVsZW1lbnRzLgorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICd3KycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCdkID0gW1xuJykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDY1MDAwKToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCciIixcbicpCisgICAgICAgICAgICBmLndyaXRlKCddJykKKworICAgICAgICAjIENvbXBpbGUgJiByZW1vdmUgLnB5IGZpbGUsIHdlIG9ubHkgbmVlZCAucHljIChvciAucHlvKS4KKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGY6CisgICAgICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoZmlsZW5hbWUpCisgICAgICAgIHVubGluayhmaWxlbmFtZSkKKworICAgICAgICAjIE5lZWQgdG8gYmUgYWJsZSB0byBsb2FkIGZyb20gY3VycmVudCBkaXIuCisgICAgICAgIHN5cy5wYXRoLmFwcGVuZCgnJykKKworICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaC4KKyAgICAgICAgZXhlYyAnaW1wb3J0ICcgKyBtb2R1bGUKKworICAgICAgICAjIENsZWFudXAuCisgICAgICAgIGRlbCBzeXMucGF0aFstMV0KKyAgICAgICAgdW5saW5rKGZpbGVuYW1lICsgJ2MnKQorICAgICAgICB1bmxpbmsoZmlsZW5hbWUgKyAnbycpCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX2ltcG9ydF9zdGlja3Moc2VsZik6CisgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArIG9zLmV4dHNlcCArICJweSIKKyAgICAgICAgd2l0aCBvcGVuKHNvdXJjZSwgInciKSBhcyBmOgorICAgICAgICAgICAgcHJpbnQgPj4gZiwgImEgPSAxIC8vIDAiCisKKyAgICAgICAgIyBOZXcgaW4gMi40LCB3ZSBzaG91bGRuJ3QgYmUgYWJsZSB0byBpbXBvcnQgdGhhdCBubyBtYXR0ZXIgaG93IG9mdGVuCisgICAgICAgICMgd2UgdHJ5LgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiBbMSwgMiwgM106CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIF9faW1wb3J0X18sIFRFU1RGTikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKFRFU1RGTiwgc3lzLm1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGFtYWdlZCBtb2R1bGUgaW4gc3lzLm1vZHVsZXMgb24gJWkgdHJ5IiAlIGkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKyAgICAgICAgICAgIHJlbW92ZV9maWxlcyhURVNURk4pCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX3JlbG9hZChzZWxmKToKKyAgICAgICAgIyBBIGZhaWxpbmcgcmVsb2FkIHNob3VsZCBsZWF2ZSB0aGUgbW9kdWxlIG9iamVjdCBpbiBzeXMubW9kdWxlcy4KKyAgICAgICAgc291cmNlID0gVEVTVEZOICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICB3aXRoIG9wZW4oc291cmNlLCAidyIpIGFzIGY6CisgICAgICAgICAgICBwcmludCA+PiBmLCAiYSA9IDEiCisgICAgICAgICAgICBwcmludCA+PiBmLCAiYiA9IDIiCisKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kID0gX19pbXBvcnRfXyhURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKFRFU1RGTiwgc3lzLm1vZHVsZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5hLCAxLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmIsIDIsICJtb2R1bGUgaGFzIHdyb25nIGF0dHJpYnV0ZSB2YWx1ZXMiKQorCisgICAgICAgICAgICAjIE9uIFdpblhQLCBqdXN0IHJlcGxhY2luZyB0aGUgLnB5IGZpbGUgd2Fzbid0IGVub3VnaCB0bworICAgICAgICAgICAgIyBjb252aW5jZSByZWxvYWQoKSB0byByZXBhcnNlIGl0LiAgTWF5YmUgdGhlIHRpbWVzdGFtcCBkaWRuJ3QKKyAgICAgICAgICAgICMgbW92ZSBlbm91Z2guICBXZSBmb3JjZSBpdCB0byBnZXQgcmVwYXJzZWQgYnkgcmVtb3ZpbmcgdGhlCisgICAgICAgICAgICAjIGNvbXBpbGVkIGZpbGUgdG9vLgorICAgICAgICAgICAgcmVtb3ZlX2ZpbGVzKFRFU1RGTikKKworICAgICAgICAgICAgIyBOb3cgZGFtYWdlIHRoZSBtb2R1bGUuCisgICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlLCAidyIpIGFzIGY6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gZiwgImEgPSAxMCIKKyAgICAgICAgICAgICAgICBwcmludCA+PiBmLCAiYiA9IDIwLy8wIgorCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgaW1wLnJlbG9hZCwgbW9kKQorCisgICAgICAgICAgICAjIEJ1dCB3ZSBzdGlsbCBleHBlY3QgdGhlIG1vZHVsZSB0byBiZSBpbiBzeXMubW9kdWxlcy4KKyAgICAgICAgICAgIG1vZCA9IHN5cy5tb2R1bGVzLmdldChURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KG1vZCwgTm9uZSwgImV4cGVjdGVkIG1vZHVsZSB0byBiZSBpbiBzeXMubW9kdWxlcyIpCisKKyAgICAgICAgICAgICMgV2Ugc2hvdWxkIGhhdmUgcmVwbGFjZWQgYSB3LyAxMCwgYnV0IHRoZSBvbGQgYiB2YWx1ZSBzaG91bGQKKyAgICAgICAgICAgICMgc3RpY2suCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5hLCAxMCwgIm1vZHVsZSBoYXMgd3JvbmcgYXR0cmlidXRlIHZhbHVlcyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5iLCAyLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorICAgICAgICAgICAgdW5sb2FkKFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2luZmluaXRlX3JlbG9hZChzZWxmKToKKyAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNzQyMzQyIHJlcG9ydHMgdGhhdCBQeXRob24gc2VnZmF1bHRzCisgICAgICAgICMgKGluZmluaXRlIHJlY3Vyc2lvbiBpbiBDKSB3aGVuIGZhY2VkIHdpdGggc2VsZi1yZWN1cnNpdmUgcmVsb2FkKClpbmcuCisKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBpbmZpbml0ZV9yZWxvYWQKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgZGVmIHRlc3RfaW1wb3J0X25hbWVfYmluZGluZyhzZWxmKToKKyAgICAgICAgIyBpbXBvcnQgeC55LnogYmluZHMgeCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UuCisgICAgICAgIGltcG9ydCB0ZXN0IGFzIHgKKyAgICAgICAgaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0CisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeCwgdGVzdCwgeC5fX25hbWVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIodGVzdC50ZXN0X3N1cHBvcnQsICJfX2ZpbGVfXyIpKQorCisgICAgICAgICMgaW1wb3J0IHgueS56IGFzIHcgYmluZHMgeiBhcyB3LgorICAgICAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQgYXMgeQorICAgICAgICBzZWxmLmFzc2VydElzKHksIHRlc3QudGVzdF9zdXBwb3J0LCB5Ll9fbmFtZV9fKQorCisgICAgZGVmIHRlc3RfaW1wb3J0X2luaXRsZXNzX2RpcmVjdG9yeV93YXJuaW5nKHNlbGYpOgorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgnJywgSW1wb3J0V2FybmluZykpOgorICAgICAgICAgICAgIyBKdXN0IGEgcmFuZG9tIG5vbi1wYWNrYWdlIGRpcmVjdG9yeSB3ZSBhbHdheXMgZXhwZWN0IHRvIGJlCisgICAgICAgICAgICAjIHNvbWV3aGVyZSBpbiBzeXMucGF0aC4uLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIF9faW1wb3J0X18sICJzaXRlLXBhY2thZ2VzIikKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9ieV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguYWJzcGF0aChURVNURk4pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IpIGFzIGM6CisgICAgICAgICAgICBfX2ltcG9ydF9fKHBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkltcG9ydCBieSBmaWxlbmFtZSBpcyBub3Qgc3VwcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYy5leGNlcHRpb24uYXJnc1swXSkKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9pbl9kZWxfZG9lc19ub3RfY3Jhc2goc2VsZik6CisgICAgICAgICMgSXNzdWUgNDIzNgorICAgICAgICB0ZXN0Zm4gPSBzY3JpcHRfaGVscGVyLm1ha2Vfc2NyaXB0KCcnLCBURVNURk4sIHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgICBpbXBvcnQgaW1wCisgICAgICAgICAgICBzeXMuYXJndi5pbnNlcnQoMCwgQygpKQorICAgICAgICAgICAgIiIiKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKHRlc3RmbikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHVubGluayh0ZXN0Zm4pCisKKyAgICBkZWYgdGVzdF9idWc3NzMyKHNlbGYpOgorICAgICAgICBzb3VyY2UgPSBURVNURk4gKyAnLnB5JworICAgICAgICBvcy5ta2Rpcihzb3VyY2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChJbXBvcnRFcnJvciwgSU9FcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXAuZmluZF9tb2R1bGUsIFRFU1RGTiwgWyIuIl0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihzb3VyY2UpCisKKyAgICBkZWYgdGVzdF90aW1lc3RhbXBfb3ZlcmZsb3coc2VsZik6CisgICAgICAgICMgQSBtb2RpZmljYXRpb24gdGltZXN0YW1wIGxhcmdlciB0aGFuIDIqKjMyIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtCisgICAgICAgICMgd2hlbiBpbXBvcnRpbmcgYSBtb2R1bGUgKGlzc3VlICMxMTIzNSkuCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvdXJjZSA9IFRFU1RGTiArICIucHkiCisgICAgICAgICAgICBjb21waWxlZCA9IHNvdXJjZSArICgnYycgaWYgX19kZWJ1Z19fIGVsc2UgJ28nKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51dGltZShzb3VyY2UsICgyICoqIDMzIC0gNSwgMiAqKiAzMyAtIDUpKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IHNldCBtb2RpZmljYXRpb24gdGltZSB0byBsYXJnZSBpbnRlZ2VyIikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBnZXRhdHRyKGVycm5vLCAnRU9WRVJGTE9XJywgTm9uZSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IHNldCBtb2RpZmljYXRpb24gdGltZSB0byBsYXJnZSBpbnRlZ2VyICh7fSkiLmZvcm1hdChlKSkKKyAgICAgICAgICAgIF9faW1wb3J0X18oVEVTVEZOKQorICAgICAgICAgICAgIyBUaGUgcHljIGZpbGUgd2FzIGNyZWF0ZWQuCisgICAgICAgICAgICBvcy5zdGF0KGNvbXBpbGVkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisgICAgICAgICAgICByZW1vdmVfZmlsZXMoVEVTVEZOKQorCisgICAgZGVmIHRlc3RfcHljX210aW1lKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGlzc3VlICMxMzg2MzogLnB5YyB0aW1lc3RhbXAgc29tZXRpbWVzIGluY29ycmVjdCBvbiBXaW5kb3dzLgorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgb3MuY3VyZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIEphbiAxLCAyMDEyOyBKdWwgMSwgMjAxMi4KKyAgICAgICAgICAgIG10aW1lcyA9IDEzMjUzNzYwMDAsIDEzNDExMDA4MDAKKworICAgICAgICAgICAgIyBEaWZmZXJlbnQgbmFtZXMgdG8gYXZvaWQgcnVubmluZyBpbnRvIGltcG9ydCBjYWNoaW5nLgorICAgICAgICAgICAgdGFpbHMgPSAic3BhbSIsICJlZ2dzIgorICAgICAgICAgICAgZm9yIG10aW1lLCB0YWlsIGluIHppcChtdGltZXMsIHRhaWxzKToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBURVNURk4gKyB0YWlsCisgICAgICAgICAgICAgICAgc291cmNlID0gbW9kdWxlICsgIi5weSIKKyAgICAgICAgICAgICAgICBjb21waWxlZCA9IHNvdXJjZSArICgnYycgaWYgX19kZWJ1Z19fIGVsc2UgJ28nKQorCisgICAgICAgICAgICAgICAgIyBDcmVhdGUgYSBuZXcgUHl0aG9uIGZpbGUgd2l0aCB0aGUgZ2l2ZW4gbXRpbWUuCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCIjIEp1c3QgdGVzdGluZ1xueD0xLCAyLCAzXG4iKQorICAgICAgICAgICAgICAgIG9zLnV0aW1lKHNvdXJjZSwgKG10aW1lLCBtdGltZSkpCisKKyAgICAgICAgICAgICAgICAjIEdlbmVyYXRlIHRoZSAucHljL28gZmlsZTsgaWYgaXQgY291bGRuJ3QgYmUgY3JlYXRlZAorICAgICAgICAgICAgICAgICMgZm9yIHNvbWUgcmVhc29uLCBza2lwIHRoZSB0ZXN0LgorICAgICAgICAgICAgICAgIG0gPSBfX2ltcG9ydF9fKG1vZHVsZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoY29tcGlsZWQpOgorICAgICAgICAgICAgICAgICAgICB1bmxpbmsoc291cmNlKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJDb3VsZG4ndCBjcmVhdGUgLnB5Yy8ucHlvIGZpbGUuIikKKworICAgICAgICAgICAgICAgICMgQWN0dWFsIG1vZGlmaWNhdGlvbiB0aW1lIG9mIC5weSBmaWxlLgorICAgICAgICAgICAgICAgIG10aW1lMSA9IGludChvcy5zdGF0KHNvdXJjZSkuc3RfbXRpbWUpICYgMHhmZmZmZmZmZgorCisgICAgICAgICAgICAgICAgIyBtdGltZSB0aGF0IHdhcyBlbmNvZGVkIGluIHRoZSAucHljIGZpbGUuCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKGNvbXBpbGVkLCAncmInKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBtdGltZTIgPSBzdHJ1Y3QudW5wYWNrKCc8TCcsIGYucmVhZCg4KVs0Ol0pWzBdCisKKyAgICAgICAgICAgICAgICB1bmxpbmsoY29tcGlsZWQpCisgICAgICAgICAgICAgICAgdW5saW5rKHNvdXJjZSkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXRpbWUxLCBtdGltZTIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGF0aC5wb3AoMCkKKworCitjbGFzcyBQeWNSZXdyaXRpbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IHRoYXQgdGhlIGBjb19maWxlbmFtZWAgYXR0cmlidXRlIG9uIGNvZGUgb2JqZWN0cyBhbHdheXMgcG9pbnRzCisgICAgIyB0byB0aGUgcmlnaHQgZmlsZSwgZXZlbiB3aGVuIHZhcmlvdXMgdGhpbmdzIGhhcHBlbiAoZS5nLiBib3RoIHRoZSAucHkKKyAgICAjIGFuZCB0aGUgLnB5YyBmaWxlIGFyZSByZW5hbWVkKS4KKworICAgIG1vZHVsZV9uYW1lID0gInVubGlrZWx5X21vZHVsZV9uYW1lIgorICAgIG1vZHVsZV9zb3VyY2UgPSAiIiIKK2ltcG9ydCBzeXMKK2NvZGVfZmlsZW5hbWUgPSBzeXMuX2dldGZyYW1lKCkuZl9jb2RlLmNvX2ZpbGVuYW1lCittb2R1bGVfZmlsZW5hbWUgPSBfX2ZpbGVfXworY29uc3RhbnQgPSAxCitkZWYgZnVuYygpOgorICAgIHBhc3MKK2Z1bmNfZmlsZW5hbWUgPSBmdW5jLmZ1bmNfY29kZS5jb19maWxlbmFtZQorIiIiCisgICAgZGlyX25hbWUgPSBvcy5wYXRoLmFic3BhdGgoVEVTVEZOKQorICAgIGZpbGVfbmFtZSA9IG9zLnBhdGguam9pbihkaXJfbmFtZSwgbW9kdWxlX25hbWUpICsgb3MuZXh0c2VwICsgInB5IgorICAgIGNvbXBpbGVkX25hbWUgPSBmaWxlX25hbWUgKyAoImMiIGlmIF9fZGVidWdfXyBlbHNlICJvIikKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zeXNfcGF0aCA9IHN5cy5wYXRoWzpdCisgICAgICAgIHNlbGYub3JpZ19tb2R1bGUgPSBzeXMubW9kdWxlcy5wb3Aoc2VsZi5tb2R1bGVfbmFtZSwgTm9uZSkKKyAgICAgICAgb3MubWtkaXIoc2VsZi5kaXJfbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuZmlsZV9uYW1lLCAidyIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKHNlbGYubW9kdWxlX3NvdXJjZSkKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHNlbGYuZGlyX25hbWUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5zeXNfcGF0aAorICAgICAgICBpZiBzZWxmLm9yaWdfbW9kdWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3lzLm1vZHVsZXNbc2VsZi5tb2R1bGVfbmFtZV0gPSBzZWxmLm9yaWdfbW9kdWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB1bmxvYWQoc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgdW5saW5rKHNlbGYuZmlsZV9uYW1lKQorICAgICAgICB1bmxpbmsoc2VsZi5jb21waWxlZF9uYW1lKQorICAgICAgICBybXRyZWUoc2VsZi5kaXJfbmFtZSkKKworICAgIGRlZiBpbXBvcnRfbW9kdWxlKHNlbGYpOgorICAgICAgICBucyA9IGdsb2JhbHMoKQorICAgICAgICBfX2ltcG9ydF9fKHNlbGYubW9kdWxlX25hbWUsIG5zLCBucykKKyAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW3NlbGYubW9kdWxlX25hbWVdCisKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIG1vZCA9IHNlbGYuaW1wb3J0X21vZHVsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLm1vZHVsZV9maWxlbmFtZSwgc2VsZi5maWxlX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmNvZGVfZmlsZW5hbWUsIHNlbGYuZmlsZV9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5mdW5jX2ZpbGVuYW1lLCBzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzW3NlbGYubW9kdWxlX25hbWVdCisgICAgICAgIG1vZCA9IHNlbGYuaW1wb3J0X21vZHVsZSgpCisgICAgICAgIGlmIG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLm1vZHVsZV9maWxlbmFtZSwgc2VsZi5jb21waWxlZF9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5jb2RlX2ZpbGVuYW1lLCBzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuZnVuY19maWxlbmFtZSwgc2VsZi5maWxlX25hbWUpCisKKyAgICBkZWYgdGVzdF9pbmNvcnJlY3RfY29kZV9uYW1lKHNlbGYpOgorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoc2VsZi5maWxlX25hbWUsIGRmaWxlPSJhbm90aGVyX21vZHVsZS5weSIpCisgICAgICAgIG1vZCA9IHNlbGYuaW1wb3J0X21vZHVsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLm1vZHVsZV9maWxlbmFtZSwgc2VsZi5jb21waWxlZF9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5jb2RlX2ZpbGVuYW1lLCBzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuZnVuY19maWxlbmFtZSwgc2VsZi5maWxlX25hbWUpCisKKyAgICBkZWYgdGVzdF9tb2R1bGVfd2l0aG91dF9zb3VyY2Uoc2VsZik6CisgICAgICAgIHRhcmdldCA9ICJhbm90aGVyX21vZHVsZS5weSIKKyAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKHNlbGYuZmlsZV9uYW1lLCBkZmlsZT10YXJnZXQpCisgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGVfbmFtZSkKKyAgICAgICAgbW9kID0gc2VsZi5pbXBvcnRfbW9kdWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QubW9kdWxlX2ZpbGVuYW1lLCBzZWxmLmNvbXBpbGVkX25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLmNvZGVfZmlsZW5hbWUsIHRhcmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuZnVuY19maWxlbmFtZSwgdGFyZ2V0KQorCisgICAgZGVmIHRlc3RfZm9yZWlnbl9jb2RlKHNlbGYpOgorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoc2VsZi5maWxlX25hbWUpCisgICAgICAgIHdpdGggb3BlbihzZWxmLmNvbXBpbGVkX25hbWUsICJyYiIpIGFzIGY6CisgICAgICAgICAgICBoZWFkZXIgPSBmLnJlYWQoOCkKKyAgICAgICAgICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKKyAgICAgICAgY29uc3RhbnRzID0gbGlzdChjb2RlLmNvX2NvbnN0cykKKyAgICAgICAgZm9yZWlnbl9jb2RlID0gdGVzdF9tYWluLmZ1bmNfY29kZQorICAgICAgICBwb3MgPSBjb25zdGFudHMuaW5kZXgoMSkKKyAgICAgICAgY29uc3RhbnRzW3Bvc10gPSBmb3JlaWduX2NvZGUKKyAgICAgICAgY29kZSA9IHR5cGUoY29kZSkoY29kZS5jb19hcmdjb3VudCwgY29kZS5jb19ubG9jYWxzLCBjb2RlLmNvX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZS5jb19mbGFncywgY29kZS5jb19jb2RlLCB0dXBsZShjb25zdGFudHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmNvX25hbWVzLCBjb2RlLmNvX3Zhcm5hbWVzLCBjb2RlLmNvX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmNvX25hbWUsIGNvZGUuY29fZmlyc3RsaW5lbm8sIGNvZGUuY29fbG5vdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmNvX2ZyZWV2YXJzLCBjb2RlLmNvX2NlbGx2YXJzKQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5jb21waWxlZF9uYW1lLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShoZWFkZXIpCisgICAgICAgICAgICBtYXJzaGFsLmR1bXAoY29kZSwgZikKKyAgICAgICAgbW9kID0gc2VsZi5pbXBvcnRfbW9kdWxlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2QuY29uc3RhbnQuY29fZmlsZW5hbWUsIGZvcmVpZ25fY29kZS5jb19maWxlbmFtZSkKKworCitjbGFzcyBQYXRoc1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBwYXRoID0gVEVTVEZOCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKHNlbGYucGF0aCkKKyAgICAgICAgc2VsZi5zeXNwYXRoID0gc3lzLnBhdGhbOl0KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcm10cmVlKHNlbGYucGF0aCkKKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzZWxmLnN5c3BhdGgKKworICAgICMgUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTI5My4KKyAgICBkZWYgdGVzdF90cmFpbGluZ19zbGFzaChzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihzZWxmLnBhdGgsICd0ZXN0X3RyYWlsaW5nX3NsYXNoLnB5JyksICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoInRlc3RkYXRhID0gJ3Rlc3RfdHJhaWxpbmdfc2xhc2gnIikKKyAgICAgICAgc3lzLnBhdGguYXBwZW5kKHNlbGYucGF0aCsnLycpCisgICAgICAgIG1vZCA9IF9faW1wb3J0X18oInRlc3RfdHJhaWxpbmdfc2xhc2giKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC50ZXN0ZGF0YSwgJ3Rlc3RfdHJhaWxpbmdfc2xhc2gnKQorICAgICAgICB1bmxvYWQoInRlc3RfdHJhaWxpbmdfc2xhc2giKQorCisgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUzNjc3LgorICAgIGRlZiBfdGVzdF9VTkNfcGF0aChzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihzZWxmLnBhdGgsICd0ZXN0X3RyYWlsaW5nX3NsYXNoLnB5JyksICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoInRlc3RkYXRhID0gJ3Rlc3RfdHJhaWxpbmdfc2xhc2gnIikKKyAgICAgICAgIyBDcmVhdGUgdGhlIFVOQyBwYXRoLCBsaWtlIFxcbXlob3N0XGMkXGZvb1xiYXIuCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmFic3BhdGgoc2VsZi5wYXRoKQorICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgICAgIGhuID0gc29ja2V0LmdldGhvc3RuYW1lKCkKKyAgICAgICAgZHJpdmUgPSBwYXRoWzBdCisgICAgICAgIHVuYyA9ICJcXFxcJXNcXCVzJCIlKGhuLCBkcml2ZSkKKyAgICAgICAgdW5jICs9IHBhdGhbMjpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLmxpc3RkaXIodW5jKQorICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyBpbiAoZXJybm8uRVBFUk0sIGVycm5vLkVBQ0NFUyk6CisgICAgICAgICAgICAgICAgIyBTZWUgaXNzdWUgIzE1MzM4CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY2Fubm90IGFjY2VzcyBhZG1pbmlzdHJhdGl2ZSBzaGFyZSAlciIgJSAodW5jLCkpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBzeXMucGF0aC5hcHBlbmQocGF0aCkKKyAgICAgICAgbW9kID0gX19pbXBvcnRfXygidGVzdF90cmFpbGluZ19zbGFzaCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLnRlc3RkYXRhLCAndGVzdF90cmFpbGluZ19zbGFzaCcpCisgICAgICAgIHVubG9hZCgidGVzdF90cmFpbGluZ19zbGFzaCIpCisKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKKyAgICAgICAgdGVzdF9VTkNfcGF0aCA9IF90ZXN0X1VOQ19wYXRoCisKKworY2xhc3MgUmVsYXRpdmVJbXBvcnRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHVubG9hZCgidGVzdC5yZWxpbXBvcnQiKQorICAgIHNldFVwID0gdGVhckRvd24KKworICAgIGRlZiB0ZXN0X3JlbGltcG9ydF9zdGFyKHNlbGYpOgorICAgICAgICAjIFRoaXMgd2lsbCBpbXBvcnQgKiBmcm9tIC50ZXN0X2ltcG9ydC4KKyAgICAgICAgZnJvbSAuIGltcG9ydCByZWxpbXBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIocmVsaW1wb3J0LCAiUmVsYXRpdmVJbXBvcnRUZXN0cyIpKQorCisgICAgZGVmIHRlc3RfaXNzdWUzMjIxKHNlbGYpOgorICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTMyMjEuCisgICAgICAgIGRlZiBjaGVja19hYnNvbHV0ZSgpOgorICAgICAgICAgICAgZXhlYyAiZnJvbSBvcyBpbXBvcnQgcGF0aCIgaW4gbnMKKyAgICAgICAgZGVmIGNoZWNrX3JlbGF0aXZlKCk6CisgICAgICAgICAgICBleGVjICJmcm9tIC4gaW1wb3J0IHJlbGltcG9ydCIgaW4gbnMKKworICAgICAgICAjIENoZWNrIGJvdGggT0sgd2l0aCBfX3BhY2thZ2VfXyBhbmQgX19uYW1lX18gY29ycmVjdAorICAgICAgICBucyA9IGRpY3QoX19wYWNrYWdlX189J3Rlc3QnLCBfX25hbWVfXz0ndGVzdC5ub3RhcmVhbG1vZHVsZScpCisgICAgICAgIGNoZWNrX2Fic29sdXRlKCkKKyAgICAgICAgY2hlY2tfcmVsYXRpdmUoKQorCisgICAgICAgICMgQ2hlY2sgYm90aCBPSyB3aXRoIG9ubHkgX19uYW1lX18gd3JvbmcKKyAgICAgICAgbnMgPSBkaWN0KF9fcGFja2FnZV9fPSd0ZXN0JywgX19uYW1lX189J25vdGFyZWFscGtnLm5vdGFyZWFsbW9kdWxlJykKKyAgICAgICAgY2hlY2tfYWJzb2x1dGUoKQorICAgICAgICBjaGVja19yZWxhdGl2ZSgpCisKKyAgICAgICAgIyBDaGVjayByZWxhdGl2ZSBmYWlscyB3aXRoIG9ubHkgX19wYWNrYWdlX18gd3JvbmcKKyAgICAgICAgbnMgPSBkaWN0KF9fcGFja2FnZV9fPSdmb28nLCBfX25hbWVfXz0ndGVzdC5ub3RhcmVhbG1vZHVsZScpCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCcuK2ZvbycsIFJ1bnRpbWVXYXJuaW5nKSk6CisgICAgICAgICAgICBjaGVja19hYnNvbHV0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yLCBjaGVja19yZWxhdGl2ZSkKKworICAgICAgICAjIENoZWNrIHJlbGF0aXZlIGZhaWxzIHdpdGggX19wYWNrYWdlX18gYW5kIF9fbmFtZV9fIHdyb25nCisgICAgICAgIG5zID0gZGljdChfX3BhY2thZ2VfXz0nZm9vJywgX19uYW1lX189J25vdGFyZWFscGtnLm5vdGFyZWFsbW9kdWxlJykKKyAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygoJy4rZm9vJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgIGNoZWNrX2Fic29sdXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXJyb3IsIGNoZWNrX3JlbGF0aXZlKQorCisgICAgICAgICMgQ2hlY2sgYm90aCBmYWlsIHdpdGggcGFja2FnZSBzZXQgdG8gYSBub24tc3RyaW5nCisgICAgICAgIG5zID0gZGljdChfX3BhY2thZ2VfXz1vYmplY3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY2hlY2tfYWJzb2x1dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNoZWNrX3JlbGF0aXZlKQorCisgICAgZGVmIHRlc3RfYWJzb2x1dGVfaW1wb3J0X3dpdGhvdXRfZnV0dXJlKHNlbGYpOgorICAgICAgICAjIElmIGV4cGxpY2l0IHJlbGF0aXZlIGltcG9ydCBzeW50YXggaXMgdXNlZCwgdGhlbiBkbyBub3QgdHJ5CisgICAgICAgICMgdG8gcGVyZm9ybSBhbiBhYnNvbHV0ZSBpbXBvcnQgaW4gdGhlIGZhY2Ugb2YgZmFpbHVyZS4KKyAgICAgICAgIyBJc3N1ZSAjNzkwMi4KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CisgICAgICAgICAgICBmcm9tIC5vcyBpbXBvcnQgc2VwCisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGxpY2l0IHJlbGF0aXZlIGltcG9ydCB0cmlnZ2VyZWQgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICJpbXBsaWNpdCBhYnNvbHV0ZSBpbXBvcnQiKQorCisKK2NsYXNzIFRlc3RTeW1ib2xpY2FsbHlMaW5rZWRQYWNrYWdlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBwYWNrYWdlX25hbWUgPSAnc2FtcGxlJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhZ2dlZCk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYudGFnZ2VkKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnBhY2thZ2VfbmFtZSk6CisgICAgICAgICAgICBzeW1saW5rX3N1cHBvcnQucmVtb3ZlX3N5bWxpbmsoc2VsZi5wYWNrYWdlX25hbWUpCisgICAgICAgIHNlbGYub3JpZ19zeXNfcGF0aCA9IHN5cy5wYXRoWzpdCisKKyAgICAgICAgIyBjcmVhdGUgYSBzYW1wbGUgcGFja2FnZTsgaW1hZ2luZSB5b3UgaGF2ZSBhIHBhY2thZ2Ugd2l0aCBhIHRhZyBhbmQKKyAgICAgICAgIyAgeW91IHdhbnQgdG8gc3ltYm9saWNhbGx5IGxpbmsgaXQgZnJvbSBpdHMgdW50YWdnZWQgbmFtZS4KKyAgICAgICAgb3MubWtkaXIoc2VsZi50YWdnZWQpCisgICAgICAgIGluaXRfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnRhZ2dlZCwgJ19faW5pdF9fLnB5JykKKyAgICAgICAgb3Blbihpbml0X2ZpbGUsICd3JykuY2xvc2UoKQorICAgICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoaW5pdF9maWxlKQorCisgICAgICAgICMgbm93IGNyZWF0ZSBhIHN5bWxpbmsgdG8gdGhlIHRhZ2dlZCBwYWNrYWdlCisgICAgICAgICMgc2FtcGxlIC0+IHNhbXBsZS10YWdnZWQKKyAgICAgICAgc3ltbGlua19zdXBwb3J0LnN5bWxpbmsoc2VsZi50YWdnZWQsIHNlbGYucGFja2FnZV9uYW1lKQorCisgICAgICAgIGFzc2VydCBvcy5wYXRoLmlzZGlyKHNlbGYucGFja2FnZV9uYW1lKQorICAgICAgICBhc3NlcnQgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHNlbGYucGFja2FnZV9uYW1lLCAnX19pbml0X18ucHknKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB0YWdnZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnBhY2thZ2VfbmFtZSArICctdGFnZ2VkJworCisgICAgIyByZWdyZXNzaW9uIHRlc3QgZm9yIGlzc3VlNjcyNworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgICAgICBub3QgaGFzYXR0cihzeXMsICdnZXR3aW5kb3dzdmVyc2lvbicpCisgICAgICAgIG9yIHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpID49ICg2LCAwKSwKKyAgICAgICAgIldpbmRvd3MgVmlzdGEgb3IgbGF0ZXIgcmVxdWlyZWQiKQorICAgIEBzeW1saW5rX3N1cHBvcnQuc2tpcF91bmxlc3Nfc3ltbGluaworICAgIGRlZiB0ZXN0X3N5bWxpbmtlZF9kaXJfaW1wb3J0YWJsZShzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgc2FtcGxlIGNhbiBvbmx5IGJlIGltcG9ydGVkIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAgICBzeXMucGF0aFs6XSA9IFsnLiddCisKKyAgICAgICAgIyBhbmQgdHJ5IHRvIGltcG9ydCB0aGUgcGFja2FnZQorICAgICAgICBfX2ltcG9ydF9fKHNlbGYucGFja2FnZV9uYW1lKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIG5vdyBjbGVhbnVwCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYucGFja2FnZV9uYW1lKToKKyAgICAgICAgICAgIHN5bWxpbmtfc3VwcG9ydC5yZW1vdmVfc3ltbGluayhzZWxmLnBhY2thZ2VfbmFtZSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YWdnZWQpOgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLnRhZ2dlZCkKKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzZWxmLm9yaWdfc3lzX3BhdGgKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHJ1bl91bml0dGVzdChJbXBvcnRUZXN0cywgUHljUmV3cml0aW5nVGVzdHMsIFBhdGhzVGVzdHMsCisgICAgICAgIFJlbGF0aXZlSW1wb3J0VGVzdHMsIFRlc3RTeW1ib2xpY2FsbHlMaW5rZWRQYWNrYWdlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgICMgVGVzdCBuZWVkcyB0byBiZSBhIHBhY2thZ2UsIHNvIHdlIGNhbiBkbyByZWxhdGl2ZSBpbXBvcnRzLgorICAgIGZyb20gdGVzdC50ZXN0X2ltcG9ydCBpbXBvcnQgdGVzdF9tYWluCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTc3MmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYThkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhYjFmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5CkBAIC0wLDAgKzEsMjU1IEBACitpbXBvcnQgc3lzCitpbXBvcnQgaW1wCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCit0ZXN0X3NyYyA9ICIiIlwKK2RlZiBnZXRfbmFtZSgpOgorICAgIHJldHVybiBfX25hbWVfXworZGVmIGdldF9maWxlKCk6CisgICAgcmV0dXJuIF9fZmlsZV9fCisiIiIKKworYWJzaW1wID0gImltcG9ydCBzdWJcbiIKK3JlbGltcCA9ICJmcm9tIC4gaW1wb3J0IHN1YlxuIgorZGVlcHJlbGltcCA9ICJmcm9tIC4uLi4gaW1wb3J0IHN1YlxuIgorZnV0aW1wID0gImZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0XG4iCisKK3JlbG9hZF9zcmMgPSB0ZXN0X3NyYysiIiJcCityZWxvYWRlZCA9IFRydWUKKyIiIgorCit0ZXN0X2NvID0gY29tcGlsZSh0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQorcmVsb2FkX2NvID0gY29tcGlsZShyZWxvYWRfc3JjLCAiPD8/Pz4iLCAiZXhlYyIpCisKK3Rlc3QyX29sZGFic19jbyA9IGNvbXBpbGUoYWJzaW1wICsgdGVzdF9zcmMsICI8Pz8/PiIsICJleGVjIikKK3Rlc3QyX25ld2Fic19jbyA9IGNvbXBpbGUoZnV0aW1wICsgYWJzaW1wICsgdGVzdF9zcmMsICI8Pz8/PiIsICJleGVjIikKK3Rlc3QyX25ld3JlbF9jbyA9IGNvbXBpbGUocmVsaW1wICsgdGVzdF9zcmMsICI8Pz8/PiIsICJleGVjIikKK3Rlc3QyX2RlZXByZWxfY28gPSBjb21waWxlKGRlZXByZWxpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQordGVzdDJfZnV0cmVsX2NvID0gY29tcGlsZShmdXRpbXAgKyByZWxpbXAgKyB0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKQorCit0ZXN0X3BhdGggPSAiISEhX3Rlc3RfISEhIgorCisKK2NsYXNzIFRlc3RJbXBvcnRlcjoKKworICAgIG1vZHVsZXMgPSB7CisgICAgICAgICJob29rdGVzdG1vZHVsZSI6IChGYWxzZSwgdGVzdF9jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2UiOiAoVHJ1ZSwgdGVzdF9jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2Uuc3ViIjogKFRydWUsIHRlc3RfY28pLAorICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLnN1Yi5zdWJiZXIiOiAoVHJ1ZSwgdGVzdF9jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2Uub2xkYWJzIjogKEZhbHNlLCB0ZXN0Ml9vbGRhYnNfY28pLAorICAgICAgICAiaG9va3Rlc3RwYWNrYWdlLm5ld2FicyI6IChGYWxzZSwgdGVzdDJfbmV3YWJzX2NvKSwKKyAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5uZXdyZWwiOiAoRmFsc2UsIHRlc3QyX25ld3JlbF9jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2Uuc3ViLnN1YmJlci5zdWJlc3QiOiAoVHJ1ZSwgdGVzdDJfZGVlcHJlbF9jbyksCisgICAgICAgICJob29rdGVzdHBhY2thZ2UuZnV0cmVsIjogKEZhbHNlLCB0ZXN0Ml9mdXRyZWxfY28pLAorICAgICAgICAic3ViIjogKEZhbHNlLCB0ZXN0X2NvKSwKKyAgICAgICAgInJlbG9hZG1vZHVsZSI6IChGYWxzZSwgdGVzdF9jbyksCisgICAgfQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9dGVzdF9wYXRoKToKKyAgICAgICAgaWYgcGF0aCAhPSB0ZXN0X3BhdGg6CisgICAgICAgICAgICAjIGlmIG91dCBjbGFzcyBpcyBvbiBzeXMucGF0aF9ob29rcywgd2UgbXVzdCByYWlzZQorICAgICAgICAgICAgIyBJbXBvcnRFcnJvciBmb3IgYW55IHBhdGggaXRlbSB0aGF0IHdlIGNhbid0IGhhbmRsZS4KKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKworICAgIGRlZiBfZ2V0X19wYXRoX18oc2VsZik6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKKyAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5tb2R1bGVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBpc3BrZywgY29kZSA9IHNlbGYubW9kdWxlc1tmdWxsbmFtZV0KKyAgICAgICAgbW9kID0gc3lzLm1vZHVsZXMuc2V0ZGVmYXVsdChmdWxsbmFtZSxpbXAubmV3X21vZHVsZShmdWxsbmFtZSkpCisgICAgICAgIG1vZC5fX2ZpbGVfXyA9ICI8JXM+IiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZgorICAgICAgICBpZiBpc3BrZzoKKyAgICAgICAgICAgIG1vZC5fX3BhdGhfXyA9IHNlbGYuX2dldF9fcGF0aF9fKCkKKyAgICAgICAgZXhlYyBjb2RlIGluIG1vZC5fX2RpY3RfXworICAgICAgICByZXR1cm4gbW9kCisKKworY2xhc3MgTWV0YUltcG9ydGVyKFRlc3RJbXBvcnRlcik6CisgICAgZGVmIF9nZXRfX3BhdGhfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtdCisKK2NsYXNzIFBhdGhJbXBvcnRlcihUZXN0SW1wb3J0ZXIpOgorICAgIGRlZiBfZ2V0X19wYXRoX18oc2VsZik6CisgICAgICAgIHJldHVybiBbc2VsZi5wYXRoXQorCisKK2NsYXNzIEltcG9ydEJsb2NrZXI6CisgICAgIiIiUGxhY2UgYW4gSW1wb3J0QmxvY2tlciBpbnN0YW5jZSBvbiBzeXMubWV0YV9wYXRoIGFuZCB5b3UKKyAgICBjYW4gYmUgc3VyZSB0aGUgbW9kdWxlcyB5b3Ugc3BlY2lmaWVkIGNhbid0IGJlIGltcG9ydGVkLCBldmVuCisgICAgaWYgaXQncyBhIGJ1aWx0aW4uIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICpuYW1lc3RvYmxvY2spOgorICAgICAgICBzZWxmLm5hbWVzdG9ibG9jayA9IGRpY3QuZnJvbWtleXMobmFtZXN0b2Jsb2NrKQorICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKKyAgICAgICAgaWYgZnVsbG5hbWUgaW4gc2VsZi5uYW1lc3RvYmxvY2s6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiSSBkYXJlIHlvdSIKKworCitjbGFzcyBJbXBXcmFwcGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSk6CisgICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmUgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgorICAgICAgICBzdWJuYW1lID0gZnVsbG5hbWUuc3BsaXQoIi4iKVstMV0KKyAgICAgICAgaWYgc3VibmFtZSAhPSBmdWxsbmFtZSBhbmQgc2VsZi5wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiBzZWxmLnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gW3NlbGYucGF0aF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSwgZmlsZW5hbWUsIHN0dWZmID0gaW1wLmZpbmRfbW9kdWxlKHN1Ym5hbWUsIHBhdGgpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBJbXBMb2FkZXIoZmlsZSwgZmlsZW5hbWUsIHN0dWZmKQorCisKK2NsYXNzIEltcExvYWRlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBmaWxlbmFtZSwgc3R1ZmYpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLnN0dWZmID0gc3R1ZmYKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIG1vZCA9IGltcC5sb2FkX21vZHVsZShmdWxsbmFtZSwgc2VsZi5maWxlLCBzZWxmLmZpbGVuYW1lLCBzZWxmLnN0dWZmKQorICAgICAgICBpZiBzZWxmLmZpbGU6CisgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICBtb2QuX19sb2FkZXJfXyA9IHNlbGYgICMgZm9yIGludHJvc3BlY3Rpb24KKyAgICAgICAgcmV0dXJuIG1vZAorCisKK2NsYXNzIEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXRoID0gc3lzLnBhdGhbOl0KKyAgICAgICAgc2VsZi5tZXRhX3BhdGggPSBzeXMubWV0YV9wYXRoWzpdCisgICAgICAgIHNlbGYucGF0aF9ob29rcyA9IHN5cy5wYXRoX2hvb2tzWzpdCisgICAgICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLmNsZWFyKCkKKyAgICAgICAgc2VsZi5tb2R1bGVzX2JlZm9yZSA9IHN5cy5tb2R1bGVzLmNvcHkoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMucGF0aFs6XSA9IHNlbGYucGF0aAorICAgICAgICBzeXMubWV0YV9wYXRoWzpdID0gc2VsZi5tZXRhX3BhdGgKKyAgICAgICAgc3lzLnBhdGhfaG9va3NbOl0gPSBzZWxmLnBhdGhfaG9va3MKKyAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUuY2xlYXIoKQorICAgICAgICBzeXMubW9kdWxlcy5jbGVhcigpCisgICAgICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShzZWxmLm1vZHVsZXNfYmVmb3JlKQorCisKK2NsYXNzIEltcG9ydEhvb2tzVGVzdENhc2UoSW1wb3J0SG9va3NCYXNlVGVzdENhc2UpOgorCisgICAgZGVmIGRvVGVzdEltcG9ydHMoc2VsZiwgaW1wb3J0ZXI9Tm9uZSk6CisgICAgICAgIGltcG9ydCBob29rdGVzdG1vZHVsZQorICAgICAgICBpbXBvcnQgaG9va3Rlc3RwYWNrYWdlCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2Uuc3ViCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2Uuc3ViLnN1YmJlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0bW9kdWxlLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0bW9kdWxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UuZ2V0X25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG9va3Rlc3RwYWNrYWdlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2Uuc3ViLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyIikKKyAgICAgICAgaWYgaW1wb3J0ZXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0bW9kdWxlLl9fbG9hZGVyX18sIGltcG9ydGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UuX19sb2FkZXJfXywgaW1wb3J0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5zdWIuX19sb2FkZXJfXywgaW1wb3J0ZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyLl9fbG9hZGVyX18sIGltcG9ydGVyKQorCisgICAgICAgIFRlc3RJbXBvcnRlci5tb2R1bGVzWydyZWxvYWRtb2R1bGUnXSA9IChGYWxzZSwgdGVzdF9jbykKKyAgICAgICAgaW1wb3J0IHJlbG9hZG1vZHVsZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIocmVsb2FkbW9kdWxlLCdyZWxvYWRlZCcpKQorCisgICAgICAgIFRlc3RJbXBvcnRlci5tb2R1bGVzWydyZWxvYWRtb2R1bGUnXSA9IChGYWxzZSwgcmVsb2FkX2NvKQorICAgICAgICBpbXAucmVsb2FkKHJlbG9hZG1vZHVsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIocmVsb2FkbW9kdWxlLCdyZWxvYWRlZCcpKQorCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2Uub2xkYWJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLm9sZGFicy5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJob29rdGVzdHBhY2thZ2Uub2xkYWJzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2Uub2xkYWJzLnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob29rdGVzdHBhY2thZ2Uuc3ViKQorCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2UubmV3cmVsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLm5ld3JlbC5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJob29rdGVzdHBhY2thZ2UubmV3cmVsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UubmV3cmVsLnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob29rdGVzdHBhY2thZ2Uuc3ViKQorCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2Uuc3ViLnN1YmJlci5zdWJlc3QgYXMgc3ViZXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ViZXN0LmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5zdWIuc3ViYmVyLnN1YmVzdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ViZXN0LnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob29rdGVzdHBhY2thZ2Uuc3ViKQorCisgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2UuZnV0cmVsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLmZ1dHJlbC5nZXRfbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJob29rdGVzdHBhY2thZ2UuZnV0cmVsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UuZnV0cmVsLnN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBob29rdGVzdHBhY2thZ2Uuc3ViKQorCisgICAgICAgIGltcG9ydCBzdWIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWIuZ2V0X25hbWUoKSwgInN1YiIpCisKKyAgICAgICAgaW1wb3J0IGhvb2t0ZXN0cGFja2FnZS5uZXdhYnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChob29rdGVzdHBhY2thZ2UubmV3YWJzLmdldF9uYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImhvb2t0ZXN0cGFja2FnZS5uZXdhYnMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhvb2t0ZXN0cGFja2FnZS5uZXdhYnMuc3ViLCBzdWIpCisKKyAgICBkZWYgdGVzdE1ldGFQYXRoKHNlbGYpOgorICAgICAgICBpID0gTWV0YUltcG9ydGVyKCkKKyAgICAgICAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoaSkKKyAgICAgICAgc2VsZi5kb1Rlc3RJbXBvcnRzKGkpCisKKyAgICBkZWYgdGVzdFBhdGhIb29rKHNlbGYpOgorICAgICAgICBzeXMucGF0aF9ob29rcy5hcHBlbmQoUGF0aEltcG9ydGVyKQorICAgICAgICBzeXMucGF0aC5hcHBlbmQodGVzdF9wYXRoKQorICAgICAgICBzZWxmLmRvVGVzdEltcG9ydHMoKQorCisgICAgZGVmIHRlc3RCbG9ja2VyKHNlbGYpOgorICAgICAgICBtbmFtZSA9ICJleGNlcHRpb25zIiAgIyBhbiBhcmJpdHJhcnkgaGFybWxlc3MgYnVpbHRpbiBtb2R1bGUKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubG9hZChtbmFtZSkKKyAgICAgICAgc3lzLm1ldGFfcGF0aC5hcHBlbmQoSW1wb3J0QmxvY2tlcihtbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBfX2ltcG9ydF9fLCBtbmFtZSkKKworICAgIGRlZiB0ZXN0SW1wV3JhcHBlcihzZWxmKToKKyAgICAgICAgaSA9IEltcFdyYXBwZXIoKQorICAgICAgICBzeXMubWV0YV9wYXRoLmFwcGVuZChpKQorICAgICAgICBzeXMucGF0aF9ob29rcy5hcHBlbmQoSW1wV3JhcHBlcikKKyAgICAgICAgbW5hbWVzID0gKCJjb2xvcnN5cyIsICJ1cmxwYXJzZSIsICJkaXN0dXRpbHMuY29yZSIsICJjb21waWxlci5taXNjIikKKyAgICAgICAgZm9yIG1uYW1lIGluIG1uYW1lczoKKyAgICAgICAgICAgIHBhcmVudCA9IG1uYW1lLnNwbGl0KCIuIilbMF0KKyAgICAgICAgICAgIGZvciBuIGluIHN5cy5tb2R1bGVzLmtleXMoKToKKyAgICAgICAgICAgICAgICBpZiBuLnN0YXJ0c3dpdGgocGFyZW50KToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25dCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgiVGhlIGNvbXBpbGVyIHBhY2thZ2UgaXMgZGVwcmVjYXRlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIHJlbW92ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIGZvciBtbmFtZSBpbiBtbmFtZXM6CisgICAgICAgICAgICAgICAgbSA9IF9faW1wb3J0X18obW5hbWUsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsiX19kdW1teV9fIl0pCisgICAgICAgICAgICAgICAgbS5fX2xvYWRlcl9fICAjIHRvIG1ha2Ugc3VyZSB3ZSBhY3R1YWxseSBoYW5kbGVkIHRoZSBpbXBvcnQKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChJbXBvcnRIb29rc1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzZTA4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzZTA4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkOGRhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ltcG9ydGxpYi5weQpAQCAtMCwwICsxLDE3NiBAQAoraW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBpbXAKK2ltcG9ydCBpbXBvcnRsaWIKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCisKK0Bjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCitkZWYgdW5jYWNoZSgqbmFtZXMpOgorICAgICIiIlVuY2FjaGUgYSBtb2R1bGUgZnJvbSBzeXMubW9kdWxlcy4KKworICAgIEEgYmFzaWMgc2FuaXR5IGNoZWNrIGlzIHBlcmZvcm1lZCB0byBwcmV2ZW50IHVuY2FjaGluZyBtb2R1bGVzIHRoYXQgZWl0aGVyCisgICAgY2Fubm90L3Nob3VsZG4ndCBiZSB1bmNhY2hlZC4KKworICAgICIiIgorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBpZiBuYW1lIGluICgnc3lzJywgJ21hcnNoYWwnLCAnaW1wJyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICJjYW5ub3QgdW5jYWNoZSB7MH0gYXMgaXQgd2lsbCBicmVhayBfaW1wb3J0bGliIi5mb3JtYXQobmFtZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgICB5aWVsZAorICAgIGZpbmFsbHk6CisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lXQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIGltcG9ydF9zdGF0ZSgqKmt3YXJncyk6CisgICAgIiIiQ29udGV4dCBtYW5hZ2VyIHRvIG1hbmFnZSB0aGUgdmFyaW91cyBpbXBvcnRlcnMgYW5kIHN0b3JlZCBzdGF0ZSBpbiB0aGUKKyAgICBzeXMgbW9kdWxlLgorCisgICAgVGhlICdtb2R1bGVzJyBhdHRyaWJ1dGUgaXMgbm90IHN1cHBvcnRlZCBhcyB0aGUgaW50ZXJwcmV0ZXIgc3RhdGUgc3RvcmVzIGEKKyAgICBwb2ludGVyIHRvIHRoZSBkaWN0IHRoYXQgdGhlIGludGVycHJldGVyIHVzZXMgaW50ZXJuYWxseTsKKyAgICByZWFzc2lnbmluZyB0byBzeXMubW9kdWxlcyBkb2VzIG5vdCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdC4KKworICAgICIiIgorICAgIG9yaWdpbmFscyA9IHt9CisgICAgdHJ5OgorICAgICAgICBmb3IgYXR0ciwgZGVmYXVsdCBpbiAoKCdtZXRhX3BhdGgnLCBbXSksICgncGF0aCcsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncGF0aF9ob29rcycsIFtdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgncGF0aF9pbXBvcnRlcl9jYWNoZScsIHt9KSk6CisgICAgICAgICAgICBvcmlnaW5hbHNbYXR0cl0gPSBnZXRhdHRyKHN5cywgYXR0cikKKyAgICAgICAgICAgIGlmIGF0dHIgaW4ga3dhcmdzOgorICAgICAgICAgICAgICAgIG5ld192YWx1ZSA9IGt3YXJnc1thdHRyXQorICAgICAgICAgICAgICAgIGRlbCBrd2FyZ3NbYXR0cl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3X3ZhbHVlID0gZGVmYXVsdAorICAgICAgICAgICAgc2V0YXR0cihzeXMsIGF0dHIsIG5ld192YWx1ZSkKKyAgICAgICAgaWYgbGVuKGt3YXJncyk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAndW5yZWNvZ25pemVkIGFyZ3VtZW50czogezB9Jy5mb3JtYXQoa3dhcmdzLmtleXMoKSkpCisgICAgICAgIHlpZWxkCisgICAgZmluYWxseToKKyAgICAgICAgZm9yIGF0dHIsIHZhbHVlIGluIG9yaWdpbmFscy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzeXMsIGF0dHIsIHZhbHVlKQorCisKK2NsYXNzIG1vY2tfbW9kdWxlcyhvYmplY3QpOgorCisgICAgIiIiQSBtb2NrIGltcG9ydGVyL2xvYWRlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqbmFtZXMpOgorICAgICAgICBzZWxmLm1vZHVsZXMgPSB7fQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lLmVuZHN3aXRoKCcuX19pbml0X18nKToKKyAgICAgICAgICAgICAgICBpbXBvcnRfbmFtZSA9IG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW1wb3J0X25hbWUgPSBuYW1lWzotbGVuKCcuX19pbml0X18nKV0KKyAgICAgICAgICAgIGlmICcuJyBub3QgaW4gbmFtZToKKyAgICAgICAgICAgICAgICBwYWNrYWdlID0gTm9uZQorICAgICAgICAgICAgZWxpZiBpbXBvcnRfbmFtZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHBhY2thZ2UgPSBuYW1lLnJzcGxpdCgnLicsIDEpWzBdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhY2thZ2UgPSBpbXBvcnRfbmFtZQorICAgICAgICAgICAgbW9kdWxlID0gaW1wLm5ld19tb2R1bGUoaW1wb3J0X25hbWUpCisgICAgICAgICAgICBtb2R1bGUuX19sb2FkZXJfXyA9IHNlbGYKKyAgICAgICAgICAgIG1vZHVsZS5fX2ZpbGVfXyA9ICc8bW9jayBfX2ZpbGVfXz4nCisgICAgICAgICAgICBtb2R1bGUuX19wYWNrYWdlX18gPSBwYWNrYWdlCisgICAgICAgICAgICBtb2R1bGUuYXR0ciA9IG5hbWUKKyAgICAgICAgICAgIGlmIGltcG9ydF9uYW1lICE9IG5hbWU6CisgICAgICAgICAgICAgICAgbW9kdWxlLl9fcGF0aF9fID0gWyc8bW9jayBfX3BhdGhfXz4nXQorICAgICAgICAgICAgc2VsZi5tb2R1bGVzW2ltcG9ydF9uYW1lXSA9IG1vZHVsZQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzW25hbWVdCisKKyAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUsIHBhdGg9Tm9uZSk6CisgICAgICAgIGlmIGZ1bGxuYW1lIG5vdCBpbiBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIGlmIGZ1bGxuYW1lIG5vdCBpbiBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3lzLm1vZHVsZXNbZnVsbG5hbWVdID0gc2VsZi5tb2R1bGVzW2Z1bGxuYW1lXQorICAgICAgICAgICAgcmV0dXJuIHNlbGYubW9kdWxlc1tmdWxsbmFtZV0KKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHNlbGYuX3VuY2FjaGUgPSB1bmNhY2hlKCpzZWxmLm1vZHVsZXMua2V5cygpKQorICAgICAgICBzZWxmLl91bmNhY2hlLl9fZW50ZXJfXygpCisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgc2VsZi5fdW5jYWNoZS5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKQorCisKKworY2xhc3MgSW1wb3J0TW9kdWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdCBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZS4iIiIKKworICAgIGRlZiB0ZXN0X21vZHVsZV9pbXBvcnQoc2VsZik6CisgICAgICAgICMgVGVzdCBpbXBvcnRpbmcgYSB0b3AtbGV2ZWwgbW9kdWxlLgorICAgICAgICB3aXRoIG1vY2tfbW9kdWxlcygndG9wX2xldmVsJykgYXMgbW9jazoKKyAgICAgICAgICAgIHdpdGggaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1bbW9ja10pOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCd0b3BfbGV2ZWwnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAndG9wX2xldmVsJykKKworICAgIGRlZiB0ZXN0X2Fic29sdXRlX3BhY2thZ2VfaW1wb3J0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaW1wb3J0aW5nIGEgbW9kdWxlIGZyb20gYSBwYWNrYWdlIHdpdGggYW4gYWJzb2x1dGUgbmFtZS4KKyAgICAgICAgcGtnX25hbWUgPSAncGtnJworICAgICAgICBwa2dfbG9uZ19uYW1lID0gJ3swfS5fX2luaXRfXycuZm9ybWF0KHBrZ19uYW1lKQorICAgICAgICBuYW1lID0gJ3swfS5tb2QnLmZvcm1hdChwa2dfbmFtZSkKKyAgICAgICAgd2l0aCBtb2NrX21vZHVsZXMocGtnX2xvbmdfbmFtZSwgbmFtZSkgYXMgbW9jazoKKyAgICAgICAgICAgIHdpdGggaW1wb3J0X3N0YXRlKG1ldGFfcGF0aD1bbW9ja10pOgorICAgICAgICAgICAgICAgIG1vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sIG5hbWUpCisKKyAgICBkZWYgdGVzdF9zaGFsbG93X3JlbGF0aXZlX3BhY2thZ2VfaW1wb3J0KHNlbGYpOgorICAgICAgICBtb2R1bGVzID0gWydhLl9faW5pdF9fJywgJ2EuYi5fX2luaXRfXycsICdhLmIuYy5fX2luaXRfXycsICdhLmIuYy5kJ10KKyAgICAgICAgd2l0aCBtb2NrX21vZHVsZXMoKm1vZHVsZXMpIGFzIG1vY2s6CisgICAgICAgICAgICB3aXRoIGltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W21vY2tdKToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnLmQnLCAnYS5iLmMnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAnYS5iLmMuZCcpCisKKyAgICBkZWYgdGVzdF9kZWVwX3JlbGF0aXZlX3BhY2thZ2VfaW1wb3J0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaW1wb3J0aW5nIGEgbW9kdWxlIGZyb20gYSBwYWNrYWdlIHRocm91Z2ggYSByZWxhdHZlIGltcG9ydC4KKyAgICAgICAgbW9kdWxlcyA9IFsnYS5fX2luaXRfXycsICdhLmIuX19pbml0X18nLCAnYS5jJ10KKyAgICAgICAgd2l0aCBtb2NrX21vZHVsZXMoKm1vZHVsZXMpIGFzIG1vY2s6CisgICAgICAgICAgICB3aXRoIGltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W21vY2tdKToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZSgnLi5jJywgJ2EuYicpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2R1bGUuX19uYW1lX18sICdhLmMnKQorCisgICAgZGVmIHRlc3RfYWJzb2x1dGVfaW1wb3J0X3dpdGhfcGFja2FnZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGltcG9ydGluZyBhIG1vZHVsZSBmcm9tIGEgcGFja2FnZSB3aXRoIGFuIGFic29sdXRlIG5hbWUgd2l0aAorICAgICAgICAjIHRoZSAncGFja2FnZScgYXJndW1lbnQgZ2l2ZW4uCisgICAgICAgIHBrZ19uYW1lID0gJ3BrZycKKyAgICAgICAgcGtnX2xvbmdfbmFtZSA9ICd7MH0uX19pbml0X18nLmZvcm1hdChwa2dfbmFtZSkKKyAgICAgICAgbmFtZSA9ICd7MH0ubW9kJy5mb3JtYXQocGtnX25hbWUpCisgICAgICAgIHdpdGggbW9ja19tb2R1bGVzKHBrZ19sb25nX25hbWUsIG5hbWUpIGFzIG1vY2s6CisgICAgICAgICAgICB3aXRoIGltcG9ydF9zdGF0ZShtZXRhX3BhdGg9W21vY2tdKToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShuYW1lLCBwa2dfbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZHVsZS5fX25hbWVfXywgbmFtZSkKKworICAgIGRlZiB0ZXN0X3JlbGF0aXZlX2ltcG9ydF93b19wYWNrYWdlKHNlbGYpOgorICAgICAgICAjIFJlbGF0aXZlIGltcG9ydHMgY2Fubm90IGhhcHBlbiB3aXRob3V0IHRoZSAncGFja2FnZScgYXJndW1lbnQgYmVpbmcKKyAgICAgICAgIyBzZXQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW1wb3J0bGliLmltcG9ydF9tb2R1bGUsICcuc3VwcG9ydCcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorICAgIHJ1bl91bml0dGVzdChJbXBvcnRNb2R1bGVUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0bGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E4OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0bGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbXBvcnRsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0bGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2E4OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW1wb3J0bGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luZGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MmI0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weQpAQCAtMCwwICsxLDMyMyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IG9wZXJhdG9yCitmcm9tIHN5cyBpbXBvcnQgbWF4aW50CittYXhzaXplID0gdGVzdF9zdXBwb3J0Lk1BWF9QeV9zc2l6ZV90CittaW5zaXplID0gLW1heHNpemUtMQorCitjbGFzcyBvbGRzdHlsZToKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmQKKworY2xhc3MgbmV3c3R5bGUob2JqZWN0KToKKyAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pbmQKKworY2xhc3MgVHJhcEludChpbnQpOgorICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK2NsYXNzIFRyYXBMb25nKGxvbmcpOgorICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm8gPSBvbGRzdHlsZSgpCisgICAgICAgIHNlbGYubiA9IG5ld3N0eWxlKCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gLTIKKyAgICAgICAgc2VsZi5uLmluZCA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbmRleChzZWxmLm8pLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbmRleChzZWxmLm4pLCAyKQorCisgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAxCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIHNsYyA9IHNsaWNlKHNlbGYubywgc2VsZi5vLCBzZWxmLm8pCisgICAgICAgIGNoZWNrX3NsYyA9IHNsaWNlKDEsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xjLmluZGljZXMoc2VsZi5vKSwgY2hlY2tfc2xjLmluZGljZXMoMSkpCisgICAgICAgIHNsYyA9IHNsaWNlKHNlbGYubiwgc2VsZi5uLCBzZWxmLm4pCisgICAgICAgIGNoZWNrX3NsYyA9IHNsaWNlKDIsIDIsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xjLmluZGljZXMoc2VsZi5uKSwgY2hlY2tfc2xjLmluZGljZXMoMikpCisKKyAgICBkZWYgdGVzdF93cmFwcGVycyhzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IDQKKyAgICAgICAgc2VsZi5uLmluZCA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg2IC5fX2luZGV4X18oKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtN0wuX19pbmRleF9fKCksIC03KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuby5fX2luZGV4X18oKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm4uX19pbmRleF9fKCksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZS5fX2luZGV4X18oKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZS5fX2luZGV4X18oKSwgMCkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzZXMoc2VsZik6CisgICAgICAgIHIgPSByYW5nZSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyW1RyYXBJbnQoNSk6VHJhcEludCgxMCldLCByWzU6MTBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbVHJhcExvbmcoNSk6VHJhcExvbmcoMTApXSwgcls1OjEwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShUcmFwSW50KCkpLmluZGljZXMoMCksICgwLDAsMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoVHJhcExvbmcoMCkpLmluZGljZXMoMCksICgwLDAsMSkpCisKKyAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9ICdkdW1iJworICAgICAgICBzZWxmLm4uaW5kID0gJ2JhZCcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleCwgc2VsZi5vKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4LCBzZWxmLm4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2Uoc2VsZi5vKS5pbmRpY2VzLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNsaWNlKHNlbGYubikuaW5kaWNlcywgMCkKKworCitjbGFzcyBTZXFUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGlzIHRlc3QgY2FzZSBpc24ndCBydW4gZGlyZWN0bHkuIEl0IGp1c3QgZGVmaW5lcyBjb21tb24gdGVzdHMKKyAgICAjIHRvIHRoZSBkaWZmZXJlbnQgc2VxdWVuY2UgdHlwZXMgYmVsb3cKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubyA9IG9sZHN0eWxlKCkKKyAgICAgICAgc2VsZi5uID0gbmV3c3R5bGUoKQorICAgICAgICBzZWxmLm8yID0gb2xkc3R5bGUoKQorICAgICAgICBzZWxmLm4yID0gbmV3c3R5bGUoKQorCisgICAgZGVmIHRlc3RfaW5kZXgoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAtMgorICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW3NlbGYubl0sIHNlbGYuc2VxWzJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW3NlbGYub10sIHNlbGYuc2VxWy0yXSkKKworICAgIGRlZiB0ZXN0X3NsaWNlKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gMQorICAgICAgICBzZWxmLm8yLmluZCA9IDMKKyAgICAgICAgc2VsZi5uLmluZCA9IDIKKyAgICAgICAgc2VsZi5uMi5pbmQgPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5vOnNlbGYubzJdLCBzZWxmLnNlcVsxOjNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW3NlbGYubjpzZWxmLm4yXSwgc2VsZi5zZXFbMjo0XSkKKworICAgIGRlZiB0ZXN0X3NsaWNlX2J1Zzc1MzIoc2VsZik6CisgICAgICAgIHNlcWxlbiA9IGxlbihzZWxmLnNlcSkKKyAgICAgICAgc2VsZi5vLmluZCA9IGludChzZXFsZW4gKiAxLjUpCisgICAgICAgIHNlbGYubi5pbmQgPSBzZXFsZW4gKyAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5vOl0sIHNlbGYuc2VxWzA6MF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbOnNlbGYub10sIHNlbGYuc2VxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW3NlbGYubjpdLCBzZWxmLnNlcVswOjBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxWzpzZWxmLm5dLCBzZWxmLnNlcSkKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnNlcSwgQ2xhc3NpY1NlcSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBUaGVzZSB0ZXN0cyBmYWlsIGZvciBDbGFzc2ljU2VxIChzZWUgYnVnICM3NTMyKQorICAgICAgICBzZWxmLm8yLmluZCA9IC1zZXFsZW4gLSAyCisgICAgICAgIHNlbGYubjIuaW5kID0gLWludChzZXFsZW4gKiAxLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5vMjpdLCBzZWxmLnNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVs6c2VsZi5vMl0sIHNlbGYuc2VxWzA6MF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXFbc2VsZi5uMjpdLCBzZWxmLnNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcVs6c2VsZi5uMl0sIHNlbGYuc2VxWzA6MF0pCisKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAzCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXEgKiBzZWxmLm8sIHNlbGYuc2VxICogMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcSAqIHNlbGYubiwgc2VsZi5zZXEgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubyAqIHNlbGYuc2VxLCBzZWxmLnNlcSAqIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uICogc2VsZi5zZXEsIHNlbGYuc2VxICogMikKKworICAgIGRlZiB0ZXN0X3dyYXBwZXJzKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gNAorICAgICAgICBzZWxmLm4uaW5kID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxLl9fZ2V0aXRlbV9fKHNlbGYubyksIHNlbGYuc2VxWzRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxLl9fbXVsX18oc2VsZi5vKSwgc2VsZi5zZXEgKiA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxLl9fcm11bF9fKHNlbGYubyksIHNlbGYuc2VxICogNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcS5fX2dldGl0ZW1fXyhzZWxmLm4pLCBzZWxmLnNlcVs1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcS5fX211bF9fKHNlbGYubiksIHNlbGYuc2VxICogNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcS5fX3JtdWxfXyhzZWxmLm4pLCBzZWxmLnNlcSAqIDUpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW1RyYXBJbnQoKV0sIHNlbGYuc2VxWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VxW1RyYXBMb25nKCldLCBzZWxmLnNlcVswXSkKKworICAgIGRlZiB0ZXN0X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gJ2R1bWInCisgICAgICAgIHNlbGYubi5pbmQgPSAnYmFkJworICAgICAgICBpbmRleG9iaiA9IGxhbWJkYSB4LCBvYmo6IG9iai5zZXFbeF0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbmRleG9iaiwgc2VsZi5vLCBzZWxmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGluZGV4b2JqLCBzZWxmLm4sIHNlbGYpCisgICAgICAgIHNsaWNlb2JqID0gbGFtYmRhIHgsIG9iajogb2JqLnNlcVt4Ol0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbGljZW9iaiwgc2VsZi5vLCBzZWxmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNsaWNlb2JqLCBzZWxmLm4sIHNlbGYpCisKKworY2xhc3MgTGlzdFRlc3RDYXNlKFNlcVRlc3RDYXNlKToKKyAgICBzZXEgPSBbMCwxMCwyMCwzMCw0MCw1MF0KKworICAgIGRlZiB0ZXN0X3NldGRlbGl0ZW0oc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAtMgorICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBsc3QgPSBsaXN0KCdhYiFjZGVmZ2hpIWonKQorICAgICAgICBkZWwgbHN0W3NlbGYub10KKyAgICAgICAgZGVsIGxzdFtzZWxmLm5dCisgICAgICAgIGxzdFtzZWxmLm9dID0gJ1gnCisgICAgICAgIGxzdFtzZWxmLm5dID0gJ1knCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBsaXN0KCdhYllkZWZnaFhqJykpCisKKyAgICAgICAgbHN0ID0gWzUsIDYsIDcsIDgsIDksIDEwLCAxMV0KKyAgICAgICAgbHN0Ll9fc2V0aXRlbV9fKHNlbGYubiwgImhlcmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgWzUsIDYsICJoZXJlIiwgOCwgOSwgMTAsIDExXSkKKyAgICAgICAgbHN0Ll9fZGVsaXRlbV9fKHNlbGYubikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFs1LCA2LCA4LCA5LCAxMCwgMTFdKQorCisgICAgZGVmIHRlc3RfaW5wbGFjZV9yZXBlYXQoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAyCisgICAgICAgIHNlbGYubi5pbmQgPSAzCisgICAgICAgIGxzdCA9IFs2LCA0XQorICAgICAgICBsc3QgKj0gc2VsZi5vCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobHN0LCBbNiwgNCwgNiwgNF0pCisgICAgICAgIGxzdCAqPSBzZWxmLm4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFs2LCA0LCA2LCA0XSAqIDMpCisKKyAgICAgICAgbHN0ID0gWzUsIDYsIDcsIDgsIDksIDExXQorICAgICAgICBsMiA9IGxzdC5fX2ltdWxfXyhzZWxmLm4pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobDIsIGxzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFs1LCA2LCA3LCA4LCA5LCAxMV0gKiAzKQorCisKK2NsYXNzIF9CYXNlU2VxOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGl0ZXJhYmxlKToKKyAgICAgICAgc2VsZi5fbGlzdCA9IGxpc3QoaXRlcmFibGUpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiByZXByKHNlbGYuX2xpc3QpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3QgPT0gb3RoZXIKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2xpc3QpCisKKyAgICBkZWYgX19tdWxfXyhzZWxmLCBuKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuX2xpc3QqbikKKyAgICBfX3JtdWxfXyA9IF9fbXVsX18KKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpbmRleCk6CisgICAgICAgIHJldHVybiBzZWxmLl9saXN0W2luZGV4XQorCisKK2NsYXNzIF9HZXRTbGljZU1peGluOgorCisgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpc3QuX19nZXRzbGljZV9fKGksIGopCisKKworY2xhc3MgQ2xhc3NpY1NlcShfQmFzZVNlcSk6IHBhc3MKK2NsYXNzIE5ld1NlcShfQmFzZVNlcSwgb2JqZWN0KTogcGFzcworY2xhc3MgQ2xhc3NpY1NlcURlcHJlY2F0ZWQoX0dldFNsaWNlTWl4aW4sIENsYXNzaWNTZXEpOiBwYXNzCitjbGFzcyBOZXdTZXFEZXByZWNhdGVkKF9HZXRTbGljZU1peGluLCBOZXdTZXEpOiBwYXNzCisKKworY2xhc3MgVHVwbGVUZXN0Q2FzZShTZXFUZXN0Q2FzZSk6CisgICAgc2VxID0gKDAsMTAsMjAsMzAsNDAsNTApCisKK2NsYXNzIFN0cmluZ1Rlc3RDYXNlKFNlcVRlc3RDYXNlKToKKyAgICBzZXEgPSAidGhpcyBpcyBhIHRlc3QiCisKK2NsYXNzIEJ5dGVBcnJheVRlc3RDYXNlKFNlcVRlc3RDYXNlKToKKyAgICBzZXEgPSBieXRlYXJyYXkoInRoaXMgaXMgYSB0ZXN0IikKKworY2xhc3MgVW5pY29kZVRlc3RDYXNlKFNlcVRlc3RDYXNlKToKKyAgICBzZXEgPSB1InRoaXMgaXMgYSB0ZXN0IgorCitjbGFzcyBDbGFzc2ljU2VxVGVzdENhc2UoU2VxVGVzdENhc2UpOgorICAgIHNlcSA9IENsYXNzaWNTZXEoKDAsMTAsMjAsMzAsNDAsNTApKQorCitjbGFzcyBOZXdTZXFUZXN0Q2FzZShTZXFUZXN0Q2FzZSk6CisgICAgc2VxID0gTmV3U2VxKCgwLDEwLDIwLDMwLDQwLDUwKSkKKworY2xhc3MgQ2xhc3NpY1NlcURlcHJlY2F0ZWRUZXN0Q2FzZShTZXFUZXN0Q2FzZSk6CisgICAgc2VxID0gQ2xhc3NpY1NlcURlcHJlY2F0ZWQoKDAsMTAsMjAsMzAsNDAsNTApKQorCitjbGFzcyBOZXdTZXFEZXByZWNhdGVkVGVzdENhc2UoU2VxVGVzdENhc2UpOgorICAgIHNlcSA9IE5ld1NlcURlcHJlY2F0ZWQoKDAsMTAsMjAsMzAsNDAsNTApKQorCisKK2NsYXNzIFhSYW5nZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3hyYW5nZShzZWxmKToKKyAgICAgICAgbiA9IG5ld3N0eWxlKCkKKyAgICAgICAgbi5pbmQgPSA1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeHJhbmdlKDEsIDIwKVtuXSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4cmFuZ2UoMSwgMjApLl9fZ2V0aXRlbV9fKG4pLCA2KQorCitjbGFzcyBPdmVyZmxvd1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wb3MgPSAyKioxMDAKKyAgICAgICAgc2VsZi5uZWcgPSAtc2VsZi5wb3MKKworICAgIGRlZiB0ZXN0X2xhcmdlX2xvbmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucG9zLl9faW5kZXhfXygpLCBzZWxmLnBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5lZy5fX2luZGV4X18oKSwgc2VsZi5uZWcpCisKKyAgICBkZWYgX2dldGl0ZW1faGVscGVyKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBHZXRJdGVtKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1heGludCAjIGNhbm5vdCByZXR1cm4gbG9uZyBoZXJlCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5CisgICAgICAgIHggPSBHZXRJdGVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4W3NlbGYucG9zXSwgc2VsZi5wb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFtzZWxmLm5lZ10sIHNlbGYubmVnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbc2VsZi5uZWc6c2VsZi5wb3NdLmluZGljZXMobWF4c2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIG1heHNpemUsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbc2VsZi5uZWc6c2VsZi5wb3M6MV0uaW5kaWNlcyhtYXhzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbWF4c2l6ZSwgMSkpCisKKyAgICBkZWYgX2dldHNsaWNlX2hlbHBlcl9kZXByZWNhdGVkKHNlbGYsIGJhc2UpOgorICAgICAgICBjbGFzcyBHZXRJdGVtKGJhc2UpOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1heGludCAjIGNhbm5vdCByZXR1cm4gbG9uZyBoZXJlCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4ga2V5CisgICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOgorICAgICAgICAgICAgICAgIHJldHVybiBpLCBqCisgICAgICAgIHggPSBHZXRJdGVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4W3NlbGYucG9zXSwgc2VsZi5wb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFtzZWxmLm5lZ10sIHNlbGYubmVnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbc2VsZi5uZWc6c2VsZi5wb3NdLCAobWF4aW50K21pbnNpemUsIG1heHNpemUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhbc2VsZi5uZWc6c2VsZi5wb3M6MV0uaW5kaWNlcyhtYXhzaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMCwgbWF4c2l6ZSwgMSkpCisKKyAgICBkZWYgdGVzdF9nZXRpdGVtKHNlbGYpOgorICAgICAgICBzZWxmLl9nZXRpdGVtX2hlbHBlcihvYmplY3QpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuX2dldHNsaWNlX2hlbHBlcl9kZXByZWNhdGVkKG9iamVjdCkKKworICAgIGRlZiB0ZXN0X2dldGl0ZW1fY2xhc3NpYyhzZWxmKToKKyAgICAgICAgY2xhc3MgRW1wdHk6IHBhc3MKKyAgICAgICAgIyBYWFggVGhpcyB0ZXN0IGZhaWxzIChzZWUgYnVnICM3NTMyKQorICAgICAgICAjc2VsZi5fZ2V0aXRlbV9oZWxwZXIoRW1wdHkpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuX2dldHNsaWNlX2hlbHBlcl9kZXByZWNhdGVkKEVtcHR5KQorCisgICAgZGVmIHRlc3Rfc2VxdWVuY2VfcmVwZWF0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYucG9zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYubmVnKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBCYXNlVGVzdENhc2UsCisgICAgICAgIExpc3RUZXN0Q2FzZSwKKyAgICAgICAgVHVwbGVUZXN0Q2FzZSwKKyAgICAgICAgQnl0ZUFycmF5VGVzdENhc2UsCisgICAgICAgIFN0cmluZ1Rlc3RDYXNlLAorICAgICAgICBVbmljb2RlVGVzdENhc2UsCisgICAgICAgIENsYXNzaWNTZXFUZXN0Q2FzZSwKKyAgICAgICAgTmV3U2VxVGVzdENhc2UsCisgICAgICAgIFhSYW5nZVRlc3RDYXNlLAorICAgICAgICBPdmVyZmxvd1Rlc3RDYXNlLAorICAgICkKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgICAgICBDbGFzc2ljU2VxRGVwcmVjYXRlZFRlc3RDYXNlLAorICAgICAgICAgICAgTmV3U2VxRGVwcmVjYXRlZFRlc3RDYXNlLAorICAgICAgICApCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5kZXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5kZXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjgzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5kZXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5kZXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjgzNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbmRleC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luc3BlY3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkY2ZlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTAsMCArMSw4NDUgQEAKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgZGF0ZXRpbWUKK2Zyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0Citmcm9tIFVzZXJEaWN0IGltcG9ydCBVc2VyRGljdAorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3B5M2tfd2FybmluZ3MKKword2l0aCBjaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAoInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICBxdWlldD1UcnVlKToKKyAgICBmcm9tIHRlc3QgaW1wb3J0IGluc3BlY3RfZm9kZGVyIGFzIG1vZAorICAgIGZyb20gdGVzdCBpbXBvcnQgaW5zcGVjdF9mb2RkZXIyIGFzIG1vZDIKKworIyBDIG1vZHVsZSBmb3IgdGVzdF9maW5kc291cmNlX2JpbmFyeQoraW1wb3J0IHVuaWNvZGVkYXRhCisKKyMgRnVuY3Rpb25zIHRlc3RlZCBpbiB0aGlzIHN1aXRlOgorIyBpc21vZHVsZSwgaXNjbGFzcywgaXNtZXRob2QsIGlzZnVuY3Rpb24sIGlzdHJhY2ViYWNrLCBpc2ZyYW1lLCBpc2NvZGUsCisjIGlzYnVpbHRpbiwgaXNyb3V0aW5lLCBpc2dlbmVyYXRvciwgaXNnZW5lcmF0b3JmdW5jdGlvbiwgZ2V0bWVtYmVycywKKyMgZ2V0ZG9jLCBnZXRmaWxlLCBnZXRtb2R1bGUsIGdldHNvdXJjZWZpbGUsIGdldGNvbW1lbnRzLCBnZXRzb3VyY2UsCisjIGdldGNsYXNzdHJlZSwgZ2V0YXJnc3BlYywgZ2V0YXJndmFsdWVzLCBmb3JtYXRhcmdzcGVjLCBmb3JtYXRhcmd2YWx1ZXMsCisjIGN1cnJlbnRmcmFtZSwgc3RhY2ssIHRyYWNlLCBpc2RhdGFkZXNjcmlwdG9yCisKKyMgTk9URTogVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyByZWxhdGluZyB0byBpbnRlcmFjdGlvbiB3aXRoCisjICAgICAgIHppcGltcG9ydCBpbiB0aGUgdGVzdF96aXBpbXBvcnRfc3VwcG9ydCB0ZXN0IG1vZHVsZS4KKworbW9kZmlsZSA9IG1vZC5fX2ZpbGVfXworaWYgbW9kZmlsZS5lbmRzd2l0aCgoJ2MnLCAnbycpKToKKyAgICBtb2RmaWxlID0gbW9kZmlsZVs6LTFdCisKK2ltcG9ydCBfX2J1aWx0aW5fXworCit0cnk6CisgICAgMSAvLyAwCitleGNlcHQ6CisgICAgdGIgPSBzeXMuZXhjX3RyYWNlYmFjaworCitnaXQgPSBtb2QuU3R1cGlkR2l0KCkKKworY2xhc3MgSXNUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcHJlZGljYXRlcyA9IHNldChbaW5zcGVjdC5pc2J1aWx0aW4sIGluc3BlY3QuaXNjbGFzcywgaW5zcGVjdC5pc2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc2ZyYW1lLCBpbnNwZWN0LmlzZnVuY3Rpb24sIGluc3BlY3QuaXNtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgaW5zcGVjdC5pc21vZHVsZSwgaW5zcGVjdC5pc3RyYWNlYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzZ2VuZXJhdG9yLCBpbnNwZWN0LmlzZ2VuZXJhdG9yZnVuY3Rpb25dKQorCisgICAgZGVmIGlzdGVzdChzZWxmLCBwcmVkaWNhdGUsIGV4cCk6CisgICAgICAgIG9iaiA9IGV2YWwoZXhwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJlZGljYXRlKG9iaiksICclcyglcyknICUgKHByZWRpY2F0ZS5fX25hbWVfXywgZXhwKSkKKworICAgICAgICBmb3Igb3RoZXIgaW4gc2VsZi5wcmVkaWNhdGVzIC0gc2V0KFtwcmVkaWNhdGVdKToKKyAgICAgICAgICAgIGlmIHByZWRpY2F0ZSA9PSBpbnNwZWN0LmlzZ2VuZXJhdG9yZnVuY3Rpb24gYW5kXAorICAgICAgICAgICAgICAgb3RoZXIgPT0gaW5zcGVjdC5pc2Z1bmN0aW9uOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG90aGVyKG9iaiksICdub3QgJXMoJXMpJyAlIChvdGhlci5fX25hbWVfXywgZXhwKSkKKworZGVmIGdlbmVyYXRvcl9mdW5jdGlvbl9leGFtcGxlKHNlbGYpOgorICAgIGZvciBpIGluIHhyYW5nZSgyKToKKyAgICAgICAgeWllbGQgaQorCitjbGFzcyBUZXN0UHJlZGljYXRlcyhJc1Rlc3RCYXNlKToKKyAgICBkZWYgdGVzdF9zaXh0ZWVuKHNlbGYpOgorICAgICAgICBjb3VudCA9IGxlbihmaWx0ZXIobGFtYmRhIHg6eC5zdGFydHN3aXRoKCdpcycpLCBkaXIoaW5zcGVjdCkpKQorICAgICAgICAjIFRoaXMgdGVzdCBpcyBoZXJlIGZvciByZW1lbWJlciB5b3UgdG8gdXBkYXRlIERvYy9saWJyYXJ5L2luc3BlY3QucnN0CisgICAgICAgICMgd2hpY2ggY2xhaW1zIHRoZXJlIGFyZSAxNiBzdWNoIGZ1bmN0aW9ucworICAgICAgICBleHBlY3RlZCA9IDE2CisgICAgICAgIGVycl9tc2cgPSAiVGhlcmUgYXJlICVkIChub3QgJWQpIGlzKiBmdW5jdGlvbnMiICUgKGNvdW50LCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgZXhwZWN0ZWQsIGVycl9tc2cpCisKKworICAgIGRlZiB0ZXN0X2V4Y2x1ZGluZ19wcmVkaWNhdGVzKHNlbGYpOgorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzYnVpbHRpbiwgJ3N5cy5leGl0JykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2J1aWx0aW4sICdbXS5hcHBlbmQnKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzY29kZSwgJ21vZC5zcGFtLmZ1bmNfY29kZScpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNmcmFtZSwgJ3RiLnRiX2ZyYW1lJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2Z1bmN0aW9uLCAnbW9kLnNwYW0nKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzbWV0aG9kLCAnbW9kLlN0dXBpZEdpdC5hYnVzZScpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNtZXRob2QsICdnaXQuYXJndWUnKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzbW9kdWxlLCAnbW9kJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc3RyYWNlYmFjaywgJ3RiJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2RhdGFkZXNjcmlwdG9yLCAnX19idWlsdGluX18uZmlsZS5jbG9zZWQnKQorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZGF0YWRlc2NyaXB0b3IsICdfX2J1aWx0aW5fXy5maWxlLnNvZnRzcGFjZScpCisgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNnZW5lcmF0b3IsICcoeCBmb3IgeCBpbiB4cmFuZ2UoMikpJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2dlbmVyYXRvcmZ1bmN0aW9uLCAnZ2VuZXJhdG9yX2Z1bmN0aW9uX2V4YW1wbGUnKQorICAgICAgICBpZiBoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKToKKyAgICAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGUodGIudGJfZnJhbWUpLmZfbG9jYWxzJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3IodHlwZSh0Yi50Yl9mcmFtZSkuZl9sb2NhbHMpKQorICAgICAgICBpZiBoYXNhdHRyKHR5cGVzLCAnTWVtYmVyRGVzY3JpcHRvclR5cGUnKToKKyAgICAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yLCAnZGF0ZXRpbWUudGltZWRlbHRhLmRheXMnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvcihkYXRldGltZS50aW1lZGVsdGEuZGF5cykpCisKKyAgICBkZWYgdGVzdF9pc3JvdXRpbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnNwZWN0Lmlzcm91dGluZShtb2Quc3BhbSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnNwZWN0Lmlzcm91dGluZShbXS5jb3VudCkpCisKKyAgICBkZWYgdGVzdF9pc2NsYXNzKHNlbGYpOgorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzY2xhc3MsICdtb2QuU3R1cGlkR2l0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluc3BlY3QuaXNjbGFzcyhsaXN0KSkKKworICAgICAgICBjbGFzcyBuZXdzdHlsZShvYmplY3QpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnNwZWN0LmlzY2xhc3MobmV3c3R5bGUpKQorCisgICAgICAgIGNsYXNzIEN1c3RvbUdldGF0dHIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluc3BlY3QuaXNjbGFzcyhDdXN0b21HZXRhdHRyKCkpKQorCisgICAgZGVmIHRlc3RfZ2V0X3Nsb3RfbWVtYmVycyhzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgX19zbG90c19fID0gKCJhIiwgImIiKQorCisgICAgICAgIHggPSBDKCkKKyAgICAgICAgeC5hID0gNDIKKyAgICAgICAgbWVtYmVycyA9IGRpY3QoaW5zcGVjdC5nZXRtZW1iZXJzKHgpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgbWVtYmVycykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYicsIG1lbWJlcnMpCisKKyAgICBkZWYgdGVzdF9pc2Fic3RyYWN0KHNlbGYpOgorICAgICAgICBmcm9tIGFiYyBpbXBvcnQgQUJDTWV0YSwgYWJzdHJhY3RtZXRob2QKKworICAgICAgICBjbGFzcyBBYnN0cmFjdENsYXNzRXhhbXBsZShvYmplY3QpOgorICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IEFCQ01ldGEKKworICAgICAgICAgICAgQGFic3RyYWN0bWV0aG9kCisgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBDbGFzc0V4YW1wbGUoQWJzdHJhY3RDbGFzc0V4YW1wbGUpOgorICAgICAgICAgICAgZGVmIGZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYSA9IENsYXNzRXhhbXBsZSgpCisKKyAgICAgICAgIyBUZXN0IGdlbmVyYWwgYmVoYXZpb3VyLgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5zcGVjdC5pc2Fic3RyYWN0KEFic3RyYWN0Q2xhc3NFeGFtcGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbnNwZWN0LmlzYWJzdHJhY3QoQ2xhc3NFeGFtcGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbnNwZWN0LmlzYWJzdHJhY3QoYSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5zcGVjdC5pc2Fic3RyYWN0KGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5zcGVjdC5pc2Fic3RyYWN0KDUpKQorCisKK2NsYXNzIFRlc3RJbnRlcnByZXRlclN0YWNrKElzVGVzdEJhc2UpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgZ2l0LmFidXNlKDcsIDgsIDkpCisKKyAgICBkZWYgdGVzdF9hYnVzZV9kb25lKHNlbGYpOgorICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzdHJhY2ViYWNrLCAnZ2l0LmV4WzJdJykKKyAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2ZyYW1lLCAnbW9kLmZyJykKKworICAgIGRlZiB0ZXN0X3N0YWNrKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG1vZC5zdCkgPj0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2Quc3RbMF1bMTpdLAorICAgICAgICAgICAgIChtb2RmaWxlLCAxNiwgJ2VnZ3MnLCBbJyAgICBzdCA9IGluc3BlY3Quc3RhY2soKVxuJ10sIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5zdFsxXVsxOl0sCisgICAgICAgICAgICAgKG1vZGZpbGUsIDksICdzcGFtJywgWycgICAgZWdncyhiICsgZCwgYyArIGYpXG4nXSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLnN0WzJdWzE6XSwKKyAgICAgICAgICAgICAobW9kZmlsZSwgNDMsICdhcmd1ZScsIFsnICAgICAgICAgICAgc3BhbShhLCBiLCBjKVxuJ10sIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5zdFszXVsxOl0sCisgICAgICAgICAgICAgKG1vZGZpbGUsIDM5LCAnYWJ1c2UnLCBbJyAgICAgICAgc2VsZi5hcmd1ZShhLCBiLCBjKVxuJ10sIDApKQorCisgICAgZGVmIHRlc3RfdHJhY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdpdC50ciksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2l0LnRyWzBdWzE6XSwgKG1vZGZpbGUsIDQzLCAnYXJndWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJyAgICAgICAgICAgIHNwYW0oYSwgYiwgYylcbiddLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnaXQudHJbMV1bMTpdLCAobW9kZmlsZSwgOSwgJ3NwYW0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJyAgICBlZ2dzKGIgKyBkLCBjICsgZilcbiddLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnaXQudHJbMl1bMTpdLCAobW9kZmlsZSwgMTgsICdlZ2dzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWycgICAgcSA9IHkgLy8gMFxuJ10sIDApKQorCisgICAgZGVmIHRlc3RfZnJhbWUoc2VsZik6CisgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMgPSBpbnNwZWN0LmdldGFyZ3ZhbHVlcyhtb2QuZnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgWyd4JywgJ3knXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJhcmdzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcmt3LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2Fscywgeyd4JzogMTEsICdwJzogMTEsICd5JzogMTR9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZm9ybWF0YXJndmFsdWVzKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICcoeD0xMSwgeT0xNCknKQorCisgICAgZGVmIHRlc3RfcHJldmlvdXNfZnJhbWUoc2VsZik6CisgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBsb2NhbHMgPSBpbnNwZWN0LmdldGFyZ3ZhbHVlcyhtb2QuZnIuZl9iYWNrKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsnYScsICdiJywgJ2MnLCAnZCcsIFsnZScsIFsnZiddXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyYXJncywgJ2cnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcmt3LCAnaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5mb3JtYXRhcmd2YWx1ZXMoYXJncywgdmFyYXJncywgdmFya3csIGxvY2FscyksCisgICAgICAgICAgICAgJyhhPTcsIGI9OCwgYz05LCBkPTMsIChlPTQsIChmPTUsKSksICpnPSgpLCAqKmg9e30pJykKKworY2xhc3MgR2V0U291cmNlQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUuCisgICAgZm9kZGVyRmlsZSA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgd2l0aCBvcGVuKGluc3BlY3QuZ2V0c291cmNlZmlsZShzZWxmLmZvZGRlckZpbGUpKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuc291cmNlID0gZnAucmVhZCgpCisKKyAgICBkZWYgc291cmNlcmFuZ2Uoc2VsZiwgdG9wLCBib3R0b20pOgorICAgICAgICBsaW5lcyA9IHNlbGYuc291cmNlLnNwbGl0KCJcbiIpCisgICAgICAgIHJldHVybiAiXG4iLmpvaW4obGluZXNbdG9wLTE6Ym90dG9tXSkgKyAiXG4iCisKKyAgICBkZWYgYXNzZXJ0U291cmNlRXF1YWwoc2VsZiwgb2JqLCB0b3AsIGJvdHRvbSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2Uob2JqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZXJhbmdlKHRvcCwgYm90dG9tKSkKKworY2xhc3MgVGVzdFJldHJpZXZpbmdTb3VyY2VDb2RlKEdldFNvdXJjZUJhc2UpOgorICAgIGZvZGRlckZpbGUgPSBtb2QKKworICAgIGRlZiB0ZXN0X2dldGNsYXNzZXMoc2VsZik6CisgICAgICAgIGNsYXNzZXMgPSBpbnNwZWN0LmdldG1lbWJlcnMobW9kLCBpbnNwZWN0LmlzY2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdGZXN0ZXJpbmdHb2InLCBtb2QuRmVzdGVyaW5nR29iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdNYWxvZG9yb3VzUGVydmVydCcsIG1vZC5NYWxvZG9yb3VzUGVydmVydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnUGFycm90RHJvcHBpbmdzJywgbW9kLlBhcnJvdERyb3BwaW5ncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgnU3R1cGlkR2l0JywgbW9kLlN0dXBpZEdpdCldKQorICAgICAgICB0cmVlID0gaW5zcGVjdC5nZXRjbGFzc3RyZWUoW2Nsc1sxXSBmb3IgY2xzIGluIGNsYXNzZXNdLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyhtb2QuUGFycm90RHJvcHBpbmdzLCAoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChtb2QuU3R1cGlkR2l0LCAoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsobW9kLk1hbG9kb3JvdXNQZXJ2ZXJ0LCAobW9kLlN0dXBpZEdpdCwpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobW9kLkZlc3RlcmluZ0dvYiwgKG1vZC5NYWxvZG9yb3VzUGVydmVydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5QYXJyb3REcm9wcGluZ3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2dldGZ1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgZnVuY3Rpb25zID0gaW5zcGVjdC5nZXRtZW1iZXJzKG1vZCwgaW5zcGVjdC5pc2Z1bmN0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmN0aW9ucywgWygnZWdncycsIG1vZC5lZ2dzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3NwYW0nLCBtb2Quc3BhbSldKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfZ2V0ZG9jKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0ZG9jKG1vZCksICdBIG1vZHVsZSBkb2NzdHJpbmcuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldGRvYyhtb2QuU3R1cGlkR2l0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnQSBsb25nZXIsXG5cbmluZGVudGVkXG5cbmRvY3N0cmluZy4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0ZG9jKGdpdC5hYnVzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0Fub3RoZXJcblxuZG9jc3RyaW5nXG5cbmNvbnRhaW5pbmdcblxudGFicycpCisKKyAgICBkZWYgdGVzdF9jbGVhbmRvYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmNsZWFuZG9jKCdBblxuICAgIGluZGVudGVkXG4gICAgZG9jc3RyaW5nLicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdBblxuaW5kZW50ZWRcbmRvY3N0cmluZy4nKQorCisgICAgZGVmIHRlc3RfZ2V0Y29tbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRjb21tZW50cyhtb2QpLCAnIyBsaW5lIDFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRjb21tZW50cyhtb2QuU3R1cGlkR2l0KSwgJyMgbGluZSAyMFxuJykKKworICAgIGRlZiB0ZXN0X2dldG1vZHVsZShzZWxmKToKKyAgICAgICAgIyBDaGVjayBhY3R1YWwgbW9kdWxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUobW9kKSwgbW9kKQorICAgICAgICAjIENoZWNrIGNsYXNzICh1c2VzIF9fbW9kdWxlX18gYXR0cmlidXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKG1vZC5TdHVwaWRHaXQpLCBtb2QpCisgICAgICAgICMgQ2hlY2sgYSBtZXRob2QgKG5vIF9fbW9kdWxlX18gYXR0cmlidXRlLCBmYWxscyBiYWNrIHRvIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKG1vZC5TdHVwaWRHaXQuYWJ1c2UpLCBtb2QpCisgICAgICAgICMgRG8gaXQgYWdhaW4gKGNoZWNrIHRoZSBjYWNoaW5nIGlzbid0IGJyb2tlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldG1vZHVsZShtb2QuU3R1cGlkR2l0LmFidXNlKSwgbW9kKQorICAgICAgICAjIENoZWNrIGEgYnVpbHRpbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0bW9kdWxlKHN0ciksIHN5cy5tb2R1bGVzWyJfX2J1aWx0aW5fXyJdKQorICAgICAgICAjIENoZWNrIGZpbGVuYW1lIG92ZXJyaWRlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRtb2R1bGUoTm9uZSwgbW9kZmlsZSksIG1vZCkKKworICAgIGRlZiB0ZXN0X2dldHNvdXJjZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChnaXQuYWJ1c2UsIDI5LCAzOSkKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QuU3R1cGlkR2l0LCAyMSwgNDYpCisKKyAgICBkZWYgdGVzdF9nZXRzb3VyY2VmaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlZmlsZShtb2Quc3BhbSksIG1vZGZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2VmaWxlKGdpdC5hYnVzZSksIG1vZGZpbGUpCisgICAgICAgIGZuID0gIl9ub25fZXhpc3RpbmdfZmlsZW5hbWVfdXNlZF9mb3Jfc291cmNlZmlsZV90ZXN0LnB5IgorICAgICAgICBjbyA9IGNvbXBpbGUoIk5vbmUiLCBmbiwgImV4ZWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlZmlsZShjbyksIE5vbmUpCisgICAgICAgIGxpbmVjYWNoZS5jYWNoZVtjby5jb19maWxlbmFtZV0gPSAoMSwgTm9uZSwgIk5vbmUiLCBjby5jb19maWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZWZpbGUoY28pLCBmbikKKworICAgIGRlZiB0ZXN0X2dldGZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRmaWxlKG1vZC5TdHVwaWRHaXQpLCBtb2QuX19maWxlX18pCisKKyAgICBkZWYgdGVzdF9nZXRtb2R1bGVfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBmcm9tIHR5cGVzIGltcG9ydCBNb2R1bGVUeXBlCisgICAgICAgIG5hbWUgPSAnX19pbnNwZWN0X2R1bW15JworICAgICAgICBtID0gc3lzLm1vZHVsZXNbbmFtZV0gPSBNb2R1bGVUeXBlKG5hbWUpCisgICAgICAgIG0uX19maWxlX18gPSAiPHN0cmluZz4iICMgaG9wZWZ1bGx5IG5vdCBhIHJlYWwgZmlsZW5hbWUuLi4KKyAgICAgICAgbS5fX2xvYWRlcl9fID0gImR1bW15IiAgIyBwcmV0ZW5kIHRoZSBmaWxlbmFtZSBpcyB1bmRlcnN0b29kIGJ5IGEgbG9hZGVyCisgICAgICAgIGV4ZWMgImRlZiB4KCk6IHBhc3MiIGluIG0uX19kaWN0X18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZWZpbGUobS54LmZ1bmNfY29kZSksICc8c3RyaW5nPicpCisgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lXQorICAgICAgICBpbnNwZWN0LmdldG1vZHVsZShjb21waWxlKCdhPTEwJywnJywnc2luZ2xlJykpCisKKyAgICBkZWYgdGVzdF9wcm9jZWVkX3dpdGhfZmFrZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgJycnZG9jdGVzdCBtb25rZXlwYXRjaGVzIGxpbmVjYWNoZSB0byBlbmFibGUgaW5zcGVjdGlvbicnJworICAgICAgICBmbiwgc291cmNlID0gJzx0ZXN0PicsICdkZWYgeCgpOiBwYXNzXG4nCisgICAgICAgIGdldGxpbmVzID0gbGluZWNhY2hlLmdldGxpbmVzCisgICAgICAgIGRlZiBtb25rZXkoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gZm46CisgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zcGxpdGxpbmVzKFRydWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRsaW5lcyhmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCisgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lcyA9IG1vbmtleQorICAgICAgICB0cnk6CisgICAgICAgICAgICBucyA9IHt9CisgICAgICAgICAgICBleGVjIGNvbXBpbGUoc291cmNlLCBmbiwgJ3NpbmdsZScpIGluIG5zCisgICAgICAgICAgICBpbnNwZWN0LmdldHNvdXJjZShuc1sieCJdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmVzID0gZ2V0bGluZXMKKworY2xhc3MgVGVzdERlY29yYXRvcnMoR2V0U291cmNlQmFzZSk6CisgICAgZm9kZGVyRmlsZSA9IG1vZDIKKworICAgIGRlZiB0ZXN0X3dyYXBwZWRfZGVjb3JhdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIud3JhcHBlZCwgMTQsIDE3KQorCisgICAgZGVmIHRlc3RfcmVwbGFjaW5nX2RlY29yYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLmdvbmUsIDksIDEwKQorCitjbGFzcyBUZXN0T25lbGluZXJzKEdldFNvdXJjZUJhc2UpOgorICAgIGZvZGRlckZpbGUgPSBtb2QyCisgICAgZGVmIHRlc3Rfb25lbGluZV9sYW1iZGEoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnNwZWN0LmdldHNvdXJjZSB3aXRoIGEgb25lLWxpbmUgbGFtYmRhIGZ1bmN0aW9uLgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIub2xsLCAyNSwgMjUpCisKKyAgICBkZWYgdGVzdF90aHJlZWxpbmVfbGFtYmRhKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW5zcGVjdC5nZXRzb3VyY2Ugd2l0aCBhIHRocmVlLWxpbmUgbGFtYmRhIGZ1bmN0aW9uLAorICAgICAgICAjIHdoZXJlIHRoZSBzZWNvbmQgYW5kIHRoaXJkIGxpbmVzIGFyZSBfbm90XyBpbmRlbnRlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLnRsbCwgMjgsIDMwKQorCisgICAgZGVmIHRlc3RfdHdvbGluZV9pbmRlbnRlZF9sYW1iZGEoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnNwZWN0LmdldHNvdXJjZSB3aXRoIGEgdHdvLWxpbmUgbGFtYmRhIGZ1bmN0aW9uLAorICAgICAgICAjIHdoZXJlIHRoZSBzZWNvbmQgbGluZSBfaXNfIGluZGVudGVkLgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIudGxsaSwgMzMsIDM0KQorCisgICAgZGVmIHRlc3Rfb25lbGluZWZ1bmMoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnNwZWN0LmdldHNvdXJjZSB3aXRoIGEgcmVndWxhciBvbmUtbGluZSBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLm9uZWxpbmVmdW5jLCAzNywgMzcpCisKKyAgICBkZWYgdGVzdF9tYW55YXJncyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGluc3BlY3QuZ2V0c291cmNlIHdpdGggYSByZWd1bGFyIGZ1bmN0aW9uIHdoZXJlCisgICAgICAgICMgdGhlIGFyZ3VtZW50cyBhcmUgb24gdHdvIGxpbmVzIGFuZCBfbm90XyBpbmRlbnRlZCBhbmQKKyAgICAgICAgIyB0aGUgYm9keSBvbiB0aGUgc2Vjb25kIGxpbmUgd2l0aCB0aGUgbGFzdCBhcmd1bWVudHMuCisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5tYW55YXJncywgNDAsIDQxKQorCisgICAgZGVmIHRlc3RfdHdvbGluZWZ1bmMoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnNwZWN0LmdldHNvdXJjZSB3aXRoIGEgcmVndWxhciBmdW5jdGlvbiB3aGVyZQorICAgICAgICAjIHRoZSBib2R5IGlzIG9uIHR3byBsaW5lcywgZm9sbG93aW5nIHRoZSBhcmd1bWVudCBsaXN0IGFuZAorICAgICAgICAjIGNvbnRpbnVlZCBvbiB0aGUgbmV4dCBsaW5lIGJ5IGEgXFwuCisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi50d29saW5lZnVuYywgNDQsIDQ1KQorCisgICAgZGVmIHRlc3RfbGFtYmRhX2luX2xpc3Qoc2VsZik6CisgICAgICAgICMgVGVzdCBpbnNwZWN0LmdldHNvdXJjZSB3aXRoIGEgb25lLWxpbmUgbGFtYmRhIGZ1bmN0aW9uCisgICAgICAgICMgZGVmaW5lZCBpbiBhIGxpc3QsIGluZGVudGVkLgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIuYVsxXSwgNDksIDQ5KQorCisgICAgZGVmIHRlc3RfYW5vbnltb3VzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW5zcGVjdC5nZXRzb3VyY2Ugd2l0aCBhIGxhbWJkYSBmdW5jdGlvbiBkZWZpbmVkCisgICAgICAgICMgYXMgYXJndW1lbnQgdG8gYW5vdGhlciBmdW5jdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLmFub255bW91cywgNTUsIDU1KQorCitjbGFzcyBUZXN0QnVnZ3lDYXNlcyhHZXRTb3VyY2VCYXNlKToKKyAgICBmb2RkZXJGaWxlID0gbW9kMgorCisgICAgZGVmIHRlc3Rfd2l0aF9jb21tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIud2l0aF9jb21tZW50LCA1OCwgNTkpCisKKyAgICBkZWYgdGVzdF9tdWx0aWxpbmVfc2lnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIubXVsdGlsaW5lX3NpZ1swXSwgNjMsIDY0KQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2NsYXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFNvdXJjZUVxdWFsKG1vZDIuZnVuYzY5KCkuZnVuYzcxLCA3MSwgNzIpCisKKyAgICBkZWYgdGVzdF9vbmVfbGluZXJfZm9sbG93ZWRfYnlfbm9uX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5mdW5jNzcsIDc3LCA3NykKKworICAgIGRlZiB0ZXN0X29uZV9saW5lcl9kZWRlbnRfbm9uX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5jbHM4Mi5mdW5jODMsIDgzLCA4MykKKworICAgIGRlZiB0ZXN0X3dpdGhfY29tbWVudF9pbnN0ZWFkX29mX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRTb3VyY2VFcXVhbChtb2QyLmZ1bmM4OCwgODgsIDkwKQorCisgICAgZGVmIHRlc3RfbWV0aG9kX2luX2R5bmFtaWNfY2xhc3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0U291cmNlRXF1YWwobW9kMi5tZXRob2RfaW5fZHluYW1pY19jbGFzcywgOTUsIDk3KQorCisgICAgQHVuaXR0ZXN0LnNraXBJZigKKyAgICAgICAgbm90IGhhc2F0dHIodW5pY29kZWRhdGEsICdfX2ZpbGVfXycpIG9yCisgICAgICAgICAgICB1bmljb2RlZGF0YS5fX2ZpbGVfX1stNDpdIGluICgiLnB5YyIsICIucHlvIiksCisgICAgICAgICJ1bmljb2RlZGF0YSBpcyBub3QgYW4gZXh0ZXJuYWwgYmluYXJ5IG1vZHVsZSIpCisgICAgZGVmIHRlc3RfZmluZHNvdXJjZV9iaW5hcnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGluc3BlY3QuZ2V0c291cmNlLCB1bmljb2RlZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgaW5zcGVjdC5maW5kc291cmNlLCB1bmljb2RlZGF0YSkKKworICAgIGRlZiB0ZXN0X2ZpbmRzb3VyY2VfY29kZV9pbl9saW5lY2FjaGUoc2VsZik6CisgICAgICAgIGxpbmVzID0gWyJ4PTEiXQorICAgICAgICBjbyA9IGNvbXBpbGUobGluZXNbMF0sICJfZHluYW1pY2FsbHlfY3JlYXRlZF9maWxlIiwgImV4ZWMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBpbnNwZWN0LmZpbmRzb3VyY2UsIGNvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBpbnNwZWN0LmdldHNvdXJjZSwgY28pCisgICAgICAgIGxpbmVjYWNoZS5jYWNoZVtjby5jb19maWxlbmFtZV0gPSAoMSwgTm9uZSwgbGluZXMsIGNvLmNvX2ZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZmluZHNvdXJjZShjbyksIChsaW5lcywwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZShjbyksIGxpbmVzWzBdKQorCisgICAgZGVmIHRlc3RfZmluZHNvdXJjZV93aXRob3V0X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBmb3IgZm5hbWUgaW4gWycnLCAnPHN0cmluZz4nXToKKyAgICAgICAgICAgIGNvID0gY29tcGlsZSgneD0xJywgZm5hbWUsICJleGVjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGluc3BlY3QuZmluZHNvdXJjZSwgY28pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBpbnNwZWN0LmdldHNvdXJjZSwgY28pCisKKworY2xhc3MgX0Jyb2tlbkRhdGFEZXNjcmlwdG9yKG9iamVjdCk6CisgICAgIiIiCisgICAgQSBicm9rZW4gZGF0YSBkZXNjcmlwdG9yLiBTZWUgYnVnICMxNzg1LgorICAgICIiIgorICAgIGRlZiBfX2dldF9fKCphcmdzKToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInNob3VsZCBub3QgX19nZXRfXyBkYXRhIGRlc2NyaXB0b3JzIikKKworICAgIGRlZiBfX3NldF9fKCphcmdzKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisKKyAgICBkZWYgX19nZXRhdHRyX18oKmFyZ3MpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigic2hvdWxkIG5vdCBfX2dldGF0dHJfXyBkYXRhIGRlc2NyaXB0b3JzIikKKworCitjbGFzcyBfQnJva2VuTWV0aG9kRGVzY3JpcHRvcihvYmplY3QpOgorICAgICIiIgorICAgIEEgYnJva2VuIG1ldGhvZCBkZXNjcmlwdG9yLiBTZWUgYnVnICMxNzg1LgorICAgICIiIgorICAgIGRlZiBfX2dldF9fKCphcmdzKToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInNob3VsZCBub3QgX19nZXRfXyBtZXRob2QgZGVzY3JpcHRvcnMiKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKCphcmdzKToKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoInNob3VsZCBub3QgX19nZXRhdHRyX18gbWV0aG9kIGRlc2NyaXB0b3JzIikKKworCisjIEhlbHBlciBmb3IgdGVzdGluZyBjbGFzc2lmeV9jbGFzc19hdHRycy4KK2RlZiBhdHRyc193b19vYmpzKGNscyk6CisgICAgcmV0dXJuIFt0WzozXSBmb3IgdCBpbiBpbnNwZWN0LmNsYXNzaWZ5X2NsYXNzX2F0dHJzKGNscyldCisKKworY2xhc3MgVGVzdENsYXNzZXNBbmRGdW5jdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NsYXNzaWNfbXJvKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2xhc3NpYy1jbGFzcyBtZXRob2QgcmVzb2x1dGlvbiBvcmRlci4KKyAgICAgICAgY2xhc3MgQTogICAgcGFzcworICAgICAgICBjbGFzcyBCKEEpOiBwYXNzCisgICAgICAgIGNsYXNzIEMoQSk6IHBhc3MKKyAgICAgICAgY2xhc3MgRChCLCBDKTogcGFzcworCisgICAgICAgIGV4cGVjdGVkID0gKEQsIEIsIEEsIEMpCisgICAgICAgIGdvdCA9IGluc3BlY3QuZ2V0bXJvKEQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgIGRlZiB0ZXN0X25ld3N0eWxlX21ybyhzZWxmKToKKyAgICAgICAgIyBUaGUgc2FtZSB3LyBuZXctY2xhc3MgTVJPLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6ICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQihBKTogcGFzcworICAgICAgICBjbGFzcyBDKEEpOiBwYXNzCisgICAgICAgIGNsYXNzIEQoQiwgQyk6IHBhc3MKKworICAgICAgICBleHBlY3RlZCA9IChELCBCLCBDLCBBLCBvYmplY3QpCisgICAgICAgIGdvdCA9IGluc3BlY3QuZ2V0bXJvKEQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKworICAgIGRlZiBhc3NlcnRBcmdTcGVjRXF1YWxzKHNlbGYsIHJvdXRpbmUsIGFyZ3NfZSwgdmFyYXJnc19lID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJrd19lID0gTm9uZSwgZGVmYXVsdHNfZSA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkID0gTm9uZSk6CisgICAgICAgIGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cyA9IGluc3BlY3QuZ2V0YXJnc3BlYyhyb3V0aW5lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIGFyZ3NfZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJhcmdzLCB2YXJhcmdzX2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFya3csIHZhcmt3X2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVmYXVsdHMsIGRlZmF1bHRzX2UpCisgICAgICAgIGlmIGZvcm1hdHRlZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5mb3JtYXRhcmdzcGVjKGFyZ3MsIHZhcmFyZ3MsIHZhcmt3LCBkZWZhdWx0cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZCkKKworICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhtb2QuZWdncywgWyd4JywgJ3knXSwgZm9ybWF0dGVkID0gJyh4LCB5KScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKG1vZC5zcGFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywgJ2InLCAnYycsICdkJywgWydlJywgWydmJ11dXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnJywgJ2gnLCAoMywgKDQsICg1LCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoYSwgYiwgYywgZD0zLCAoZSwgKGYsKSk9KDQsICg1LCkpLCAqZywgKipoKScpCisKKyAgICBkZWYgdGVzdF9nZXRhcmdzcGVjX21ldGhvZChzZWxmKToKKyAgICAgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICAgICAgZGVmIG0oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEFyZ1NwZWNFcXVhbHMoQS5tLCBbJ3NlbGYnXSkKKworICAgIGRlZiB0ZXN0X2dldGFyZ3NwZWNfc3VibGlzdG9mb25lKHNlbGYpOgorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAgICAgKCJ0dXBsZSBwYXJhbWV0ZXIgdW5wYWNraW5nIGhhcyBiZWVuIHJlbW92ZWQiLCBTeW50YXhXYXJuaW5nKSwKKyAgICAgICAgICAgICAgICAoInBhcmVudGhlc2l6ZWQgYXJndW1lbnQgbmFtZXMgYXJlIGludmFsaWQiLCBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgICAgICBleGVjICdkZWYgc3VibGlzdE9mT25lKChmb28sKSk6IHJldHVybiAxJworICAgICAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKHN1Ymxpc3RPZk9uZSwgW1snZm9vJ11dKQorCisgICAgICAgICAgICBleGVjICdkZWYgZmFrZVN1Ymxpc3RPZk9uZSgoZm9vKSk6IHJldHVybiAxJworICAgICAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKGZha2VTdWJsaXN0T2ZPbmUsIFsnZm9vJ10pCisKKworICAgIGRlZiBfY2xhc3NpZnlfdGVzdChzZWxmLCBuZXdzdHlsZSk6CisgICAgICAgICIiIkhlbHBlciBmb3IgdGVzdGluZyB0aGF0IGNsYXNzaWZ5X2NsYXNzX2F0dHJzIGZpbmRzIGEgYnVuY2ggb2YKKyAgICAgICAgZGlmZmVyZW50IGtpbmRzIG9mIGF0dHJpYnV0ZXMgb24gYSBnaXZlbiBjbGFzcy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5ld3N0eWxlOgorICAgICAgICAgICAgYmFzZSA9IG9iamVjdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2xhc3MgYmFzZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgQShiYXNlKToKKyAgICAgICAgICAgIGRlZiBzKCk6IHBhc3MKKyAgICAgICAgICAgIHMgPSBzdGF0aWNtZXRob2QocykKKworICAgICAgICAgICAgZGVmIGMoY2xzKTogcGFzcworICAgICAgICAgICAgYyA9IGNsYXNzbWV0aG9kKGMpCisKKyAgICAgICAgICAgIGRlZiBnZXRwKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBwID0gcHJvcGVydHkoZ2V0cCkKKworICAgICAgICAgICAgZGVmIG0oc2VsZik6IHBhc3MKKworICAgICAgICAgICAgZGVmIG0xKHNlbGYpOiBwYXNzCisKKyAgICAgICAgICAgIGRhdGFibG9iID0gJzEnCisKKyAgICAgICAgICAgIGRkID0gX0Jyb2tlbkRhdGFEZXNjcmlwdG9yKCkKKyAgICAgICAgICAgIG1kID0gX0Jyb2tlbk1ldGhvZERlc2NyaXB0b3IoKQorCisgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhBKQorICAgICAgICBzZWxmLmFzc2VydEluKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgncCcsICdwcm9wZXJ0eScsIEEpLCBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbScsICdtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtMScsICdtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkYXRhYmxvYicsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ21kJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgbWV0aG9kIGRlc2NyaXB0b3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZGQnLCAnZGF0YScsIEEpLCBhdHRycywgJ21pc3NpbmcgZGF0YSBkZXNjcmlwdG9yJykKKworICAgICAgICBjbGFzcyBCKEEpOgorICAgICAgICAgICAgZGVmIG0oc2VsZik6IHBhc3MKKworICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoQikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpLCBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgY2xhc3MgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ3AnLCAncHJvcGVydHknLCBBKSwgYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20nLCAnbWV0aG9kJywgQiksIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbTEnLCAnbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpLCBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtZCcsICdtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIG1ldGhvZCBkZXNjcmlwdG9yJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RkJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEgZGVzY3JpcHRvcicpCisKKworICAgICAgICBjbGFzcyBDKEEpOgorICAgICAgICAgICAgZGVmIG0oc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiBjKHNlbGYpOiBwYXNzCisKKyAgICAgICAgYXR0cnMgPSBhdHRyc193b19vYmpzKEMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSwgYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnYycsICdtZXRob2QnLCBDKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdwJywgJ3Byb3BlcnR5JywgQSksIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtJywgJ21ldGhvZCcsIEMpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ20xJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSwgYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbWQnLCAnbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBtZXRob2QgZGVzY3JpcHRvcicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkZCcsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhIGRlc2NyaXB0b3InKQorCisgICAgICAgIGNsYXNzIEQoQiwgQyk6CisgICAgICAgICAgICBkZWYgbTEoc2VsZik6IHBhc3MKKworICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoRCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpLCBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCisgICAgICAgIGlmIG5ld3N0eWxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2MnLCAnbWV0aG9kJywgQyksIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSksIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCgncCcsICdwcm9wZXJ0eScsIEEpLCBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnbScsICdtZXRob2QnLCBCKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdtMScsICdtZXRob2QnLCBEKSwgYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdkYXRhYmxvYicsICdkYXRhJywgQSksIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ21kJywgJ21ldGhvZCcsIEEpLCBhdHRycywgJ21pc3NpbmcgbWV0aG9kIGRlc2NyaXB0b3InKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZGQnLCAnZGF0YScsIEEpLCBhdHRycywgJ21pc3NpbmcgZGF0YSBkZXNjcmlwdG9yJykKKworCisgICAgZGVmIHRlc3RfY2xhc3NpZnlfb2xkc3R5bGUoc2VsZik6CisgICAgICAgICIiImNsYXNzaWZ5X2NsYXNzX2F0dHJzIGZpbmRzIHN0YXRpYyBtZXRob2RzLCBjbGFzcyBtZXRob2RzLAorICAgICAgICBwcm9wZXJ0aWVzLCBub3JtYWwgbWV0aG9kcywgYW5kIGRhdGEgYXR0cmlidXRlcyBvbiBhbiBvbGQtc3R5bGUKKyAgICAgICAgY2xhc3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jbGFzc2lmeV90ZXN0KEZhbHNlKQorCisKKyAgICBkZWYgdGVzdF9jbGFzc2lmeV9uZXdzdHlsZShzZWxmKToKKyAgICAgICAgIiIiSnVzdCBsaWtlIHRlc3RfY2xhc3NpZnlfb2xkc3R5bGUsIGJ1dCBmb3IgYSBuZXctc3R5bGUgY2xhc3MuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl9jbGFzc2lmeV90ZXN0KFRydWUpCisKKyAgICBkZWYgdGVzdF9jbGFzc2lmeV9idWlsdGluX3R5cGVzKHNlbGYpOgorICAgICAgICAjIFNpbXBsZSBzYW5pdHkgY2hlY2sgdGhhdCBhbGwgYnVpbHQtaW4gdHlwZXMgY2FuIGhhdmUgdGhlaXIKKyAgICAgICAgIyBhdHRyaWJ1dGVzIGNsYXNzaWZpZWQuCisgICAgICAgIGZvciBuYW1lIGluIGRpcihfX2J1aWx0aW5fXyk6CisgICAgICAgICAgICBidWlsdGluID0gZ2V0YXR0cihfX2J1aWx0aW5fXywgbmFtZSkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoYnVpbHRpbiwgdHlwZSk6CisgICAgICAgICAgICAgICAgaW5zcGVjdC5jbGFzc2lmeV9jbGFzc19hdHRycyhidWlsdGluKQorCisgICAgZGVmIHRlc3RfZ2V0bWVtYmVyc19tZXRob2Qoc2VsZik6CisgICAgICAgICMgT2xkLXN0eWxlIGNsYXNzZXMKKyAgICAgICAgY2xhc3MgQjoKKyAgICAgICAgICAgIGRlZiBmKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIEIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhCKSkKKyAgICAgICAgIyBjb250cmFyeSB0byBzcGVjLCBpc21ldGhvZCgpIGlzIGFsc28gVHJ1ZSBmb3IgdW5ib3VuZCBtZXRob2RzCisgICAgICAgICMgKHNlZSAjMTc4NSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBCLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoQiwgaW5zcGVjdC5pc21ldGhvZCkpCisgICAgICAgIGIgPSBCKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBiLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgYi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKGIsIGluc3BlY3QuaXNtZXRob2QpKQorCisgICAgICAgICMgTmV3LXN0eWxlIGNsYXNzZXMKKyAgICAgICAgY2xhc3MgQihvYmplY3QpOgorICAgICAgICAgICAgZGVmIGYoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKCdmJywgQi5mKSwgaW5zcGVjdC5nZXRtZW1iZXJzKEIpKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIEIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhCLCBpbnNwZWN0LmlzbWV0aG9kKSkKKyAgICAgICAgYiA9IEIoKQorICAgICAgICBzZWxmLmFzc2VydEluKCgnZicsIGIuZiksIGluc3BlY3QuZ2V0bWVtYmVycyhiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoJ2YnLCBiLmYpLCBpbnNwZWN0LmdldG1lbWJlcnMoYiwgaW5zcGVjdC5pc21ldGhvZCkpCisKKworY2xhc3MgVGVzdEdldGNhbGxhcmdzRnVuY3Rpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgICMgdHVwbGUgcGFyYW1ldGVycyBhcmUgbmFtZWQgJy4xJywgJy4yJywgZXRjLgorICAgIGlzX3R1cGxlbmFtZSA9IHJlLmNvbXBpbGUocideXC5cZCskJykubWF0Y2gKKworICAgIGRlZiBhc3NlcnRFcXVhbENhbGxBcmdzKHNlbGYsIGZ1bmMsIGNhbGxfcGFyYW1zX3N0cmluZywgbG9jcz1Ob25lKToKKyAgICAgICAgbG9jcyA9IGRpY3QobG9jcyBvciB7fSwgZnVuYz1mdW5jKQorICAgICAgICByMSA9IGV2YWwoJ2Z1bmMoJXMpJyAlIGNhbGxfcGFyYW1zX3N0cmluZywgTm9uZSwgbG9jcykKKyAgICAgICAgcjIgPSBldmFsKCdpbnNwZWN0LmdldGNhbGxhcmdzKGZ1bmMsICVzKScgJSBjYWxsX3BhcmFtc19zdHJpbmcsIE5vbmUsCisgICAgICAgICAgICAgICAgICBsb2NzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLCByMikKKworICAgIGRlZiBhc3NlcnRFcXVhbEV4Y2VwdGlvbihzZWxmLCBmdW5jLCBjYWxsX3BhcmFtX3N0cmluZywgbG9jcz1Ob25lKToKKyAgICAgICAgbG9jcyA9IGRpY3QobG9jcyBvciB7fSwgZnVuYz1mdW5jKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBldmFsKCdmdW5jKCVzKScgJSBjYWxsX3BhcmFtX3N0cmluZywgTm9uZSwgbG9jcykKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZXgxOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdFeGNlcHRpb24gbm90IHJhaXNlZCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV2YWwoJ2luc3BlY3QuZ2V0Y2FsbGFyZ3MoZnVuYywgJXMpJyAlIGNhbGxfcGFyYW1fc3RyaW5nLCBOb25lLAorICAgICAgICAgICAgICAgICBsb2NzKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBleDI6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ0V4Y2VwdGlvbiBub3QgcmFpc2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0eXBlKGV4MSksIHR5cGUoZXgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXgxKSwgc3RyKGV4MikpCisKKyAgICBkZWYgbWFrZUNhbGxhYmxlKHNlbGYsIHNpZ25hdHVyZSk6CisgICAgICAgICIiIkNyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBpdHMgbG9jYWxzKCksIGV4Y2x1ZGluZyB0aGUKKyAgICAgICAgYXV0b2dlbmVyYXRlZCAnLjEnLCAnLjInLCBldGMuIHR1cGxlIHBhcmFtIG5hbWVzIChpZiBhbnkpLiIiIgorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoInR1cGxlIHBhcmFtZXRlciB1bnBhY2tpbmcgaGFzIGJlZW4gcmVtb3ZlZCIsIFN5bnRheFdhcm5pbmcpLAorICAgICAgICAgICAgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICBjb2RlID0gKCJsYW1iZGEgJXM6IGRpY3QoaSBmb3IgaSBpbiBsb2NhbHMoKS5pdGVtcygpICIKKyAgICAgICAgICAgICAgICAgICAgImlmIG5vdCBpc190dXBsZW5hbWUoaVswXSkpIikKKyAgICAgICAgICAgIHJldHVybiBldmFsKGNvZGUgJSBzaWduYXR1cmUsIHsnaXNfdHVwbGVuYW1lJyA6IHNlbGYuaXNfdHVwbGVuYW1lfSkKKworICAgIGRlZiB0ZXN0X3BsYWluKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlQ2FsbGFibGUoJ2EsIGI9MScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnYT0yJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdiPTMsIGE9MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgYj0zJykKKyAgICAgICAgIyBleHBhbmQgKml0ZXJhYmxlIC8gKiptYXBwaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKigyLCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJypbMl0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyooMiwgMyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJypbMiwgM10nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyoqeyJhIjoyfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnYj0zLCAqKnsiYSI6Mn0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsICoqeyJiIjozfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKip7ImIiOjMsICJhIjoyfScpCisgICAgICAgICMgZXhwYW5kIFVzZXJMaXN0IC8gVXNlckRpY3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcqVXNlckxpc3QoWzJdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKlVzZXJMaXN0KFsyLCAzXSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyoqVXNlckRpY3QoYT0yKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgKipVc2VyRGljdChiPTMpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdiPTIsICoqVXNlckRpY3QoYT0zKScpCisgICAgICAgICMgdW5pY29kZSBrZXl3b3JkIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcqKnt1ImEiOjJ9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdiPTMsICoqe3UiYSI6Mn0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsICoqe3UiYiI6M30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyoqe3UiYiI6MywgdSJhIjoyfScpCisKKyAgICBkZWYgdGVzdF92YXJhcmdzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlQ2FsbGFibGUoJ2EsIGI9MSwgKmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIDMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIDMsIDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyooMiwzLDQpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCAqWzMsNF0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIDMsICpVc2VyTGlzdChbNF0pJykKKworICAgIGRlZiB0ZXN0X3Zhcmt3KHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlQ2FsbGFibGUoJ2EsIGI9MSwgKipjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdhPTInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIGI9MywgYz00JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdiPTMsIGE9MiwgYz00JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdjPTQsICoqeyJhIjoyLCAiYiI6M30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIGM9NCwgKip7ImIiOjN9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdiPTIsICoqeyJhIjozLCAiYyI6NH0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyoqVXNlckRpY3QoYT0yLCBiPTMsIGM9NCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIGM9NCwgKipVc2VyRGljdChiPTMpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdiPTIsICoqVXNlckRpY3QoYT0zLCBjPTQpJykKKyAgICAgICAgIyB1bmljb2RlIGtleXdvcmQgYXJncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2M9NCwgKip7dSJhIjoyLCB1ImIiOjN9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCBjPTQsICoqe3UiYiI6M30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ2I9MiwgKip7dSJhIjozLCB1ImMiOjR9JykKKworICAgIGRlZiB0ZXN0X3Zhcmt3X29ubHkoc2VsZik6CisgICAgICAgICMgaXNzdWUxMTI1NjoKKyAgICAgICAgZiA9IHNlbGYubWFrZUNhbGxhYmxlKCcqKmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnYT0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdhPTEsIGI9MicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnYz0zLCAqKnsiYSI6IDEsICJiIjogMn0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJyoqVXNlckRpY3QoYT0xLCBiPTIpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdjPTMsICoqVXNlckRpY3QoYT0xLCBiPTIpJykKKworICAgIGRlZiB0ZXN0X3R1cGxlYXJncyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYubWFrZUNhbGxhYmxlKCcoYixjKSwgKGQsKGUsZikpPSgwLFsxLDJdKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnKDIsMyknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ1syLDNdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICdVc2VyTGlzdChbMiwzXSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJygyLDMpLCAoNCwoNSw2KSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJygyLDMpLCAoNCxbNSw2XSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJygyLDMpLCBbNCxVc2VyTGlzdChbNSw2XSldJykKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2ZlYXR1cmVzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5tYWtlQ2FsbGFibGUoJ2EsIGI9MiwgKGMsKGQsZSkpPSgzLFs0LDVdKSwgKmYsICoqZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgMywgKDQsWzUsNl0pLCA3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCAzLCAqWyg0LFs1LDZdKSwgN10sIHg9OCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxDYWxsQXJncyhmLCAnMiwgMywgeD04LCAqWyg0LFs1LDZdKSwgN10nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJzIsIHg9OCwgKlszLCAoNCxbNSw2XSksIDddLCB5PTknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ3g9OCwgKlsyLCAzLCAoNCxbNSw2XSldLCB5PTknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsQ2FsbEFyZ3MoZiwgJ3g9OCwgKlVzZXJMaXN0KFsyLCAzLCAoNCxbNSw2XSldKSwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyoqeyJ5Ijo5LCAieiI6MTB9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbENhbGxBcmdzKGYsICcyLCB4PTgsICpVc2VyTGlzdChbMywgKDQsWzUsNl0pXSksICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcqKlVzZXJEaWN0KHk9OSwgej0xMCknKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBmMCA9IHNlbGYubWFrZUNhbGxhYmxlKCcnKQorICAgICAgICBmMSA9IHNlbGYubWFrZUNhbGxhYmxlKCdhLCBiJykKKyAgICAgICAgZjIgPSBzZWxmLm1ha2VDYWxsYWJsZSgnYSwgYj0xJykKKyAgICAgICAgIyBmMCB0YWtlcyBubyBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmMCwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYwLCAneD0xJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmMCwgJzEseD0xJykKKyAgICAgICAgIyBmMSB0YWtlcyBleGFjdGx5IDIgYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjEsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYxLCAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjEsICdhPTInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYxLCAnYj0zJykKKyAgICAgICAgIyBmMiB0YWtlcyBhdCBsZWFzdCAxIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZjIsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYyLCAnYj0zJykKKyAgICAgICAgZm9yIGYgaW4gZjEsIGYyOgorICAgICAgICAgICAgIyBmMS9mMiB0YWtlcyBleGFjdGx5L2F0IG1vc3QgMiBhcmd1bWVudHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzIsIDMsIDQnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnMSwgMiwgMywgYT0xJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzIsIDMsIDQsIGM9NScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcyLCAzLCA0LCBhPTEsIGM9NScpCisgICAgICAgICAgICAjIGYgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnYz0yJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzIsIGM9MycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcyLCAzLCBjPTQnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnMiwgYz00LCBiPTMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnKip7dSJcdTAzYzBcdTAzYjkiOiA0fScpCisgICAgICAgICAgICAjIGYgZ290IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCBhcmd1bWVudAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnMSwgYT0yJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxFeGNlcHRpb24oZiwgJzEsICoqeyJhIjoyfScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcxLCAyLCBiPTMnKQorICAgICAgICAgICAgIyBYWFg6IFB5dGhvbiBpbmNvbnNpc3RlbmN5CisgICAgICAgICAgICAjIC0gZm9yIGZ1bmN0aW9ucyBhbmQgYm91bmQgbWV0aG9kczogdW5leHBlY3RlZCBrZXl3b3JkICdjJworICAgICAgICAgICAgIyAtIGZvciB1bmJvdW5kIG1ldGhvZHM6IG11bHRpcGxlIHZhbHVlcyBmb3Iga2V5d29yZCAnYScKKyAgICAgICAgICAgICNzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcxLCBjPTMsIGE9MicpCisgICAgICAgIGYgPSBzZWxmLm1ha2VDYWxsYWJsZSgnKGEsYik9KDAsMSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYsICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnWzFdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmLCAnKDEsMiwzKScpCisgICAgICAgICMgaXNzdWUxMTI1NjoKKyAgICAgICAgZjMgPSBzZWxmLm1ha2VDYWxsYWJsZSgnKipjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbEV4Y2VwdGlvbihmMywgJzEsIDInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsRXhjZXB0aW9uKGYzLCAnMSwgMiwgYT0xLCBiPTInKQorCitjbGFzcyBUZXN0R2V0Y2FsbGFyZ3NNZXRob2RzKFRlc3RHZXRjYWxsYXJnc0Z1bmN0aW9ucyk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmNscyA9IEZvbworICAgICAgICBzZWxmLmluc3QgPSBGb28oKQorCisgICAgZGVmIG1ha2VDYWxsYWJsZShzZWxmLCBzaWduYXR1cmUpOgorICAgICAgICBhc3NlcnQgJ3NlbGYnIG5vdCBpbiBzaWduYXR1cmUKKyAgICAgICAgbWsgPSBzdXBlcihUZXN0R2V0Y2FsbGFyZ3NNZXRob2RzLCBzZWxmKS5tYWtlQ2FsbGFibGUKKyAgICAgICAgc2VsZi5jbHMubWV0aG9kID0gbWsoJ3NlbGYsICcgKyBzaWduYXR1cmUpCisgICAgICAgIHJldHVybiBzZWxmLmluc3QubWV0aG9kCisKK2NsYXNzIFRlc3RHZXRjYWxsYXJnc1VuYm91bmRNZXRob2RzKFRlc3RHZXRjYWxsYXJnc01ldGhvZHMpOgorCisgICAgZGVmIG1ha2VDYWxsYWJsZShzZWxmLCBzaWduYXR1cmUpOgorICAgICAgICBzdXBlcihUZXN0R2V0Y2FsbGFyZ3NVbmJvdW5kTWV0aG9kcywgc2VsZikubWFrZUNhbGxhYmxlKHNpZ25hdHVyZSkKKyAgICAgICAgcmV0dXJuIHNlbGYuY2xzLm1ldGhvZAorCisgICAgZGVmIGFzc2VydEVxdWFsQ2FsbEFyZ3Moc2VsZiwgZnVuYywgY2FsbF9wYXJhbXNfc3RyaW5nLCBsb2NzPU5vbmUpOgorICAgICAgICByZXR1cm4gc3VwZXIoVGVzdEdldGNhbGxhcmdzVW5ib3VuZE1ldGhvZHMsIHNlbGYpLmFzc2VydEVxdWFsQ2FsbEFyZ3MoCisgICAgICAgICAgICAqc2VsZi5fZ2V0QXNzZXJ0RXF1YWxQYXJhbXMoZnVuYywgY2FsbF9wYXJhbXNfc3RyaW5nLCBsb2NzKSkKKworICAgIGRlZiBhc3NlcnRFcXVhbEV4Y2VwdGlvbihzZWxmLCBmdW5jLCBjYWxsX3BhcmFtc19zdHJpbmcsIGxvY3M9Tm9uZSk6CisgICAgICAgIHJldHVybiBzdXBlcihUZXN0R2V0Y2FsbGFyZ3NVbmJvdW5kTWV0aG9kcywgc2VsZikuYXNzZXJ0RXF1YWxFeGNlcHRpb24oCisgICAgICAgICAgICAqc2VsZi5fZ2V0QXNzZXJ0RXF1YWxQYXJhbXMoZnVuYywgY2FsbF9wYXJhbXNfc3RyaW5nLCBsb2NzKSkKKworICAgIGRlZiBfZ2V0QXNzZXJ0RXF1YWxQYXJhbXMoc2VsZiwgZnVuYywgY2FsbF9wYXJhbXNfc3RyaW5nLCBsb2NzPU5vbmUpOgorICAgICAgICBhc3NlcnQgJ2luc3QnIG5vdCBpbiBjYWxsX3BhcmFtc19zdHJpbmcKKyAgICAgICAgbG9jcyA9IGRpY3QobG9jcyBvciB7fSwgaW5zdD1zZWxmLmluc3QpCisgICAgICAgIHJldHVybiAoZnVuYywgJ2luc3QsJyArIGNhbGxfcGFyYW1zX3N0cmluZywgbG9jcykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdCgKKyAgICAgICAgVGVzdERlY29yYXRvcnMsIFRlc3RSZXRyaWV2aW5nU291cmNlQ29kZSwgVGVzdE9uZWxpbmVycywgVGVzdEJ1Z2d5Q2FzZXMsCisgICAgICAgIFRlc3RJbnRlcnByZXRlclN0YWNrLCBUZXN0Q2xhc3Nlc0FuZEZ1bmN0aW9ucywgVGVzdFByZWRpY2F0ZXMsCisgICAgICAgIFRlc3RHZXRjYWxsYXJnc0Z1bmN0aW9ucywgVGVzdEdldGNhbGxhcmdzTWV0aG9kcywKKyAgICAgICAgVGVzdEdldGNhbGxhcmdzVW5ib3VuZE1ldGhvZHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luc3BlY3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2ZWNlYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luc3BlY3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luc3BlY3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW5zcGVjdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxMTA5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2luc3BlY3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjVmOWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50LnB5CkBAIC0wLDAgKzEsNDY3IEBACitpbXBvcnQgc3lzCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaGF2ZV91bmljb2RlCitpbXBvcnQgbWF0aAorCitMID0gWworICAgICAgICAoJzAnLCAwKSwKKyAgICAgICAgKCcxJywgMSksCisgICAgICAgICgnOScsIDkpLAorICAgICAgICAoJzEwJywgMTApLAorICAgICAgICAoJzk5JywgOTkpLAorICAgICAgICAoJzEwMCcsIDEwMCksCisgICAgICAgICgnMzE0JywgMzE0KSwKKyAgICAgICAgKCcgMzE0JywgMzE0KSwKKyAgICAgICAgKCczMTQgJywgMzE0KSwKKyAgICAgICAgKCcgIFx0XHQgIDMxNCAgXHRcdCAgJywgMzE0KSwKKyAgICAgICAgKHJlcHIoc3lzLm1heGludCksIHN5cy5tYXhpbnQpLAorICAgICAgICAoJyAgMXgnLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKCcgIDEgICcsIDEpLAorICAgICAgICAoJyAgMVwwMiAgJywgVmFsdWVFcnJvciksCisgICAgICAgICgnJywgVmFsdWVFcnJvciksCisgICAgICAgICgnICcsIFZhbHVlRXJyb3IpLAorICAgICAgICAoJyAgXHRcdCAgJywgVmFsdWVFcnJvcikKK10KK2lmIGhhdmVfdW5pY29kZToKKyAgICBMICs9IFsKKyAgICAgICAgKHVuaWNvZGUoJzAnKSwgMCksCisgICAgICAgICh1bmljb2RlKCcxJyksIDEpLAorICAgICAgICAodW5pY29kZSgnOScpLCA5KSwKKyAgICAgICAgKHVuaWNvZGUoJzEwJyksIDEwKSwKKyAgICAgICAgKHVuaWNvZGUoJzk5JyksIDk5KSwKKyAgICAgICAgKHVuaWNvZGUoJzEwMCcpLCAxMDApLAorICAgICAgICAodW5pY29kZSgnMzE0JyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCcgMzE0JyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCdcdTA2NjNcdTA2NjFcdTA2NjQgJywncmF3LXVuaWNvZGUtZXNjYXBlJyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCcgIFx0XHQgIDMxNCAgXHRcdCAgJyksIDMxNCksCisgICAgICAgICh1bmljb2RlKCcgIDF4JyksIFZhbHVlRXJyb3IpLAorICAgICAgICAodW5pY29kZSgnICAxICAnKSwgMSksCisgICAgICAgICh1bmljb2RlKCcgIDFcMDIgICcpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNvZGUoJycpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNvZGUoJyAnKSwgVmFsdWVFcnJvciksCisgICAgICAgICh1bmljb2RlKCcgIFx0XHQgICcpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNocigweDIwMCksIFZhbHVlRXJyb3IpLAorXQorCitjbGFzcyBJbnRMb25nQ29tbW9uVGVzdHMob2JqZWN0KToKKworICAgICIiIk1peGluIG9mIHRlc3QgY2FzZXMgdG8gc2hhcmUgYmV0d2VlbiBib3RoIHRlc3RfaW50IGFuZCB0ZXN0X2xvbmcuIiIiCisKKyAgICAjIENoYW5nZSB0byBpbnQgb3IgbG9uZyBpbiB0aGUgVGVzdENhc2Ugc3ViY2xhc3MuCisgICAgbnR5cGUgPSBOb25lCisKKyAgICBkZWYgdGVzdF9ub19hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnR5cGUoKSwgMCkKKworICAgIGRlZiB0ZXN0X2tleXdvcmRfYXJncyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGludm9raW5nIGNvbnN0cnVjdG9yIHVzaW5nIGtleXdvcmQgYXJndW1lbnRzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnR5cGUoeD0xLjIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnR5cGUoJzEwMCcsIGJhc2U9MiksIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5udHlwZSh4PScxMDAnLCBiYXNlPTIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubnR5cGUsIGJhc2U9MTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5udHlwZSwgYmFzZT0wKQorCitjbGFzcyBJbnRUZXN0Q2FzZXMoSW50TG9uZ0NvbW1vblRlc3RzLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBudHlwZSA9IGludAorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KDMxNCksIDMxNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoMy4xNCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KDMxNEwpLCAzMTQpCisgICAgICAgICMgQ2hlY2sgdGhhdCBjb252ZXJzaW9uIGZyb20gZmxvYXQgdHJ1bmNhdGVzIHRvd2FyZHMgemVybworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgtMy4xNCksIC0zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgzLjkpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgtMy45KSwgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KDMuNSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KC0zLjUpLCAtMykKKyAgICAgICAgIyBEaWZmZXJlbnQgYmFzZToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoIjEwIiwxNiksIDE2TCkKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQodW5pY29kZSgiMTAiKSwxNiksIDE2TCkKKyAgICAgICAgIyBUZXN0IGNvbnZlcnNpb24gZnJvbSBzdHJpbmdzIGFuZCB2YXJpb3VzIGFub21hbGllcworICAgICAgICBmb3IgcywgdiBpbiBMOgorICAgICAgICAgICAgZm9yIHNpZ24gaW4gIiIsICIrIiwgIi0iOgorICAgICAgICAgICAgICAgIGZvciBwcmVmaXggaW4gIiIsICIgIiwgIlx0IiwgIiAgXHRcdCAgIjoKKyAgICAgICAgICAgICAgICAgICAgc3MgPSBwcmVmaXggKyBzaWduICsgcworICAgICAgICAgICAgICAgICAgICB2diA9IHYKKyAgICAgICAgICAgICAgICAgICAgaWYgc2lnbiA9PSAiLSIgYW5kIHYgaXMgbm90IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICB2diA9IC12CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHNzKSwgdnYpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCB2OgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHMgPSByZXByKC0xLXN5cy5tYXhpbnQpCisgICAgICAgIHggPSBpbnQocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4KzEsIC1zeXMubWF4aW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgaW50KQorICAgICAgICAjIHNob3VsZCByZXR1cm4gbG9uZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChzWzE6XSksIHN5cy5tYXhpbnQrMSkKKworICAgICAgICAjIHNob3VsZCByZXR1cm4gbG9uZworICAgICAgICB4ID0gaW50KDFlMTAwKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeCwgbG9uZykKKyAgICAgICAgeCA9IGludCgtMWUxMDApCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh4LCBsb25nKQorCisKKyAgICAgICAgIyBTRiBidWcgNDM0MTg2OiAgMHg4MDAwMDAwMC8yICE9IDB4ODAwMDAwMDA+PjEuCisgICAgICAgICMgV29ya2VkIGJ5IGFjY2lkZW50IGluIFdpbmRvd3MgcmVsZWFzZSBidWlsZCwgYnV0IGZhaWxlZCBpbiBkZWJ1ZyBidWlsZC4KKyAgICAgICAgIyBGYWlsZWQgaW4gYWxsIExpbnV4IGJ1aWxkcy4KKyAgICAgICAgeCA9IC0xLXN5cy5tYXhpbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4ID4+IDEsIHgvLzIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMTIzXDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICc1MycsIDQwKQorCisgICAgICAgICMgU0YgYnVnIDE1NDU0OTc6IGVtYmVkZGVkIE5VTHMgd2VyZSBub3QgZGV0ZWN0ZWQgd2l0aAorICAgICAgICAjIGV4cGxpY2l0IGJhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMTIzXDAnLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMTIzXHgwMCAyNDUnLCAyMCkKKworICAgICAgICB4ID0gaW50KCcxJyAqIDYwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIGxvbmcpCisKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgeCA9IGludCh1bmljaHIoMHg2NjEpICogNjAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIGxvbmcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQsIDEsIDEyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwMTIzJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMHgxMjMnLCAxNiksIDI5MSkKKworICAgICAgICAjIEJ1ZyAxNjc5OiAiMHgiIGlzIG5vdCBhIHZhbGlkIGhleCBsaXRlcmFsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgIjB4IiwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgIjB4IiwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICIwbyIsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgIjBvIiwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICIwYiIsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgIjBiIiwgMCkKKworCisgICAgICAgICMgU0YgYnVnIDEzMzQ2NjI6IGludChzdHJpbmcsIGJhc2UpIHdyb25nIGFuc3dlcnMKKyAgICAgICAgIyBWYXJpb3VzIHJlcHJlc2VudGF0aW9ucyBvZiAyKiozMiBldmFsdWF0ZWQgdG8gMAorICAgICAgICAjIHJhdGhlciB0aGFuIDIqKjMyIGluIHByZXZpb3VzIHZlcnNpb25zCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsIDIpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEwMjAwMjAyMjIwMTIyMTExMTIxMScsIDMpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEwMDAwMDAwMDAwMDAwMDAwJywgNCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMzIyNDQwMDI0MjMxNDEnLCA1KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxNTUwMTA0MDE1NTA0JywgNiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMjExMzAxNDIyMzU0JywgNyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNDAwMDAwMDAwMDAnLCA4KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMjA2ODY1NzQ1NCcsIDkpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzQyOTQ5NjcyOTYnLCAxMCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTkwNDQ0MDU1NCcsIDExKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc5YmE0NjE1OTQnLCAxMiksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNTM1YTc5ODg5JywgMTMpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzJjYTViNzQ2NCcsIDE0KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxYTIwZGNkODEnLCAxNSksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwJywgMTYpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2E3ZmZkYTkxJywgMTcpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzcwNGhlN2c0JywgMTgpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzRmNWFmZjY2JywgMTkpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzM3MjNhaTRnJywgMjApLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzI4MWQ1NWk0JywgMjEpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzFmajhiMTg0JywgMjIpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzE2MDZrN2ljJywgMjMpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ21iOTk0YWcnLCAyNCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnaGVrMm1nbCcsIDI1KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdkbmNoYm5tJywgMjYpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2IyOGpwZG0nLCAyNyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnOHBmZ2loNCcsIDI4KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc3NmJlaWdnJywgMjkpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzVxbWNwcWcnLCAzMCksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNHEwanRvNCcsIDMxKSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0MDAwMDAwJywgMzIpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzNhb2txOTQnLCAzMyksIDQyOTQ5NjcyOTZMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMnFoeGpsaScsIDM0KSwgNDI5NDk2NzI5NkwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcyYnI0NXFiJywgMzUpLCA0Mjk0OTY3Mjk2TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzF6MTQxejQnLCAzNiksIDQyOTQ5NjcyOTZMKQorCisgICAgICAgICMgdGVzdHMgd2l0aCBiYXNlIDAKKyAgICAgICAgIyB0aGlzIGZhaWxzIG9uIDMuMCwgYnV0IGluIDIueCB0aGUgb2xkIG9jdGFsIHN5bnRheCBpcyBhbGxvd2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcgMDEyMyAgJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnIDAxMjMgICcsIDApLCA4MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzAwMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMG8xMjMnLCAwKSwgODMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcweDEyMycsIDApLCAyOTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwYjEwMCcsIDApLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnIDBPMTIzICAgJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnIDBYMTIzICAnLCAwKSwgMjkxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnIDBCMTAwICcsIDApLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnKzAnLCAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJy0wJywgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcwOCcsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJy0wMTIzOTUnLCAwKQorCisgICAgICAgICMgd2l0aG91dCBiYXNlIHN0aWxsIGJhc2UgMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzAxMjMnKSwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMDEyMycsIDEwKSwgMTIzKQorCisgICAgICAgICMgdGVzdHMgd2l0aCBwcmVmaXggYW5kIGJhc2UgIT0gMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMHgxMjMnLCAxNiksIDI5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzBvMTIzJywgOCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMGIxMDAnLCAyKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzBYMTIzJywgMTYpLCAyOTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcwTzEyMycsIDgpLCA4MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzBCMTAwJywgMiksIDQpCisKKyAgICAgICAgIyB0aGUgY29kZSBoYXMgc3BlY2lhbCBjaGVja3MgZm9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYWZ0ZXIgdGhlCisgICAgICAgICMgIHR5cGUgcHJlZml4CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzBiMicsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzBiMDInLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcwQjInLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcwQjAyJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMG84JywgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMG8wOCcsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzBPOCcsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzBPMDgnLCA4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcweGcnLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMHgwZycsIDE2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbnQsICcwWGcnLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMFgwZycsIDE2KQorCisgICAgICAgICMgU0YgYnVnIDEzMzQ2NjI6IGludChzdHJpbmcsIGJhc2UpIHdyb25nIGFuc3dlcnMKKyAgICAgICAgIyBDaGVja3MgZm9yIHByb3BlciBldmFsdWF0aW9uIG9mIDIqKjMyICsgMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywgMiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAyMDAyMDIyMjAxMjIxMTExMjEyJywgMyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTAwMDAwMDAwMDAwMDAwMDEnLCA0KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCczMjI0NDAwMjQyMzE0MicsIDUpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzE1NTAxMDQwMTU1MDUnLCA2KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcyMTEzMDE0MjIzNTUnLCA3KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0MDAwMDAwMDAwMScsIDgpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzEyMDY4NjU3NDU1JywgOSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNDI5NDk2NzI5NycsIDEwKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxOTA0NDQwNTU1JywgMTEpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzliYTQ2MTU5NScsIDEyKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc1MzVhNzk4OGEnLCAxMyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMmNhNWI3NDY1JywgMTQpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzFhMjBkY2Q4MicsIDE1KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcxMDAwMDAwMDEnLCAxNiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnYTdmZmRhOTInLCAxNyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNzA0aGU3ZzUnLCAxOCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNGY1YWZmNjcnLCAxOSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMzcyM2FpNGgnLCAyMCksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMjgxZDU1aTUnLCAyMSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMWZqOGIxODUnLCAyMiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMTYwNms3aWQnLCAyMyksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnbWI5OTRhaCcsIDI0KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCdoZWsybWdtJywgMjUpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJ2RuY2hibm4nLCAyNiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnYjI4anBkbicsIDI3KSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc4cGZnaWg1JywgMjgpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzc2YmVpZ2gnLCAyOSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnNXFtY3BxaCcsIDMwKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCc0cTBqdG81JywgMzEpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzQwMDAwMDEnLCAzMiksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnM2Fva3E5NScsIDMzKSwgNDI5NDk2NzI5N0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KCcycWh4amxqJywgMzQpLCA0Mjk0OTY3Mjk3TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoJzJicjQ1cWMnLCAzNSksIDQyOTQ5NjcyOTdMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCgnMXoxNDF6NScsIDM2KSwgNDI5NDk2NzI5N0wpCisKKyAgICBkZWYgdGVzdF9iaXRfbGVuZ3RoKHNlbGYpOgorICAgICAgICB0aW55ID0gMWUtMTAKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKC02NTAwMCwgNjUwMDApOgorICAgICAgICAgICAgayA9IHguYml0X2xlbmd0aCgpCisgICAgICAgICAgICAjIENoZWNrIGVxdWl2YWxlbmNlIHdpdGggUHl0aG9uIHZlcnNpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbGVuKGJpbih4KS5sc3RyaXAoJy0wYicpKSkKKyAgICAgICAgICAgICMgQmVoYXZpb3VyIGFzIHNwZWNpZmllZCBpbiB0aGUgZG9jcworICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyKiooay0xKSA8PSBhYnMoeCkgPCAyKiprKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIDApCisgICAgICAgICAgICAjIEFsdGVybmF0aXZlIGRlZmluaXRpb246IHguYml0X2xlbmd0aCgpID09IDEgKyBmbG9vcihsb2dfMih4KSkKKyAgICAgICAgICAgIGlmIHggIT0gMDoKKyAgICAgICAgICAgICAgICAjIFdoZW4geCBpcyBhbiBleGFjdCBwb3dlciBvZiAyLCBudW1lcmljIGVycm9ycyBjYW4KKyAgICAgICAgICAgICAgICAjIGNhdXNlIGZsb29yKGxvZyh4KS9sb2coMikpIHRvIGJlIG9uZSB0b28gc21hbGw7IGZvcgorICAgICAgICAgICAgICAgICMgc21hbGwgeCB0aGlzIGNhbiBiZSBmaXhlZCBieSBhZGRpbmcgYSBzbWFsbCBxdWFudGl0eQorICAgICAgICAgICAgICAgICMgdG8gdGhlIHF1b3RpZW50IGJlZm9yZSB0YWtpbmcgdGhlIGZsb29yLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMSArIG1hdGguZmxvb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBtYXRoLmxvZyhhYnMoeCkpL21hdGgubG9nKDIpICsgdGlueSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMCkuYml0X2xlbmd0aCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxKS5iaXRfbGVuZ3RoKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0xKS5iaXRfbGVuZ3RoKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDIpLmJpdF9sZW5ndGgoKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTIpLmJpdF9sZW5ndGgoKSwgMikKKyAgICAgICAgZm9yIGkgaW4gWzIsIDMsIDE1LCAxNiwgMTcsIDMxLCAzMiwgMzMsIDYzLCA2NF06CisgICAgICAgICAgICBhID0gMioqaQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS0xKS5iaXRfbGVuZ3RoKCksIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgxLWEpLmJpdF9sZW5ndGgoKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEpLmJpdF9sZW5ndGgoKSwgaSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLWEpLmJpdF9sZW5ndGgoKSwgaSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSsxKS5iaXRfbGVuZ3RoKCksIGkrMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC1hLTEpLmJpdF9sZW5ndGgoKSwgaSsxKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQorICAgIGRlZiB0ZXN0X2Zsb2F0X2NvbnZlcnNpb24oc2VsZik6CisgICAgICAgICMgdmFsdWVzIGV4YWN0bHkgcmVwcmVzZW50YWJsZSBhcyBmbG9hdHMKKyAgICAgICAgZXhhY3RfdmFsdWVzID0gWy0yLCAtMSwgMCwgMSwgMiwgMioqNTIsIDIqKjUzLTEsIDIqKjUzLCAyKio1MysyLAorICAgICAgICAgICAgICAgICAgICAgICAgIDIqKjUzKzQsIDIqKjU0LTQsIDIqKjU0LTIsIDIqKjYzLCAtMioqNjMsIDIqKjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgIC0yKio2NCwgMTAqKjIwLCAxMCoqMjEsIDEwKioyMl0KKyAgICAgICAgZm9yIHZhbHVlIGluIGV4YWN0X3ZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KGludCh2YWx1ZSkpKSwgdmFsdWUpCisKKyAgICAgICAgIyB0ZXN0IHJvdW5kLWhhbGYtdG8tZXZlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgyKio1MysxKSksIDIqKjUzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgyKio1MysyKSksIDIqKjUzKzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjUzKzMpKSwgMioqNTMrNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTMrNSkpLCAyKio1Mys0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgyKio1Mys2KSksIDIqKjUzKzYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjUzKzcpKSwgMioqNTMrOCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgtMioqNTMtMSkpLCAtMioqNTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KC0yKio1My0yKSksIC0yKio1My0yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgtMioqNTMtMykpLCAtMioqNTMtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoLTIqKjUzLTUpKSwgLTIqKjUzLTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KC0yKio1My02KSksIC0yKio1My02KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgtMioqNTMtNykpLCAtMioqNTMtOCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgyKio1NC0yKSksIDIqKjU0LTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0LTEpKSwgMioqNTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0KzIpKSwgMioqNTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0KzMpKSwgMioqNTQrNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoZmxvYXQoMioqNTQrNSkpLCAyKio1NCs0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChmbG9hdCgyKio1NCs2KSksIDIqKjU0KzgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0KzEwKSksIDIqKjU0KzgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KGZsb2F0KDIqKjU0KzExKSksIDIqKjU0KzEyKQorCisgICAgZGVmIHRlc3RfdmFsaWRfbm9uX251bWVyaWNfaW5wdXRfdHlwZXNfZm9yX3goc2VsZik6CisgICAgICAgICMgVGVzdCBwb3NzaWJsZSB2YWxpZCBub24tbnVtZXJpYyB0eXBlcyBmb3IgeCwgaW5jbHVkaW5nIHN1YmNsYXNzZXMKKyAgICAgICAgIyBvZiB0aGUgYWxsb3dlZCBidWlsdC1pbiB0eXBlcy4KKyAgICAgICAgY2xhc3MgQ3VzdG9tU3RyKHN0cik6IHBhc3MKKyAgICAgICAgdmFsdWVzID0gWycxMDAnLCBDdXN0b21TdHIoJzEwMCcpXQorCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIGNsYXNzIEN1c3RvbVVuaWNvZGUodW5pY29kZSk6IHBhc3MKKyAgICAgICAgICAgIHZhbHVlcyArPSBbdW5pY29kZSgnMTAwJyksIEN1c3RvbVVuaWNvZGUodW5pY29kZSgnMTAwJykpXQorCisgICAgICAgIGZvciB4IGluIHZhbHVlczoKKyAgICAgICAgICAgIG1zZyA9ICd4IGhhcyB2YWx1ZSAlcyBhbmQgdHlwZSAlcycgJSAoeCwgdHlwZSh4KS5fX25hbWVfXykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludCh4KSwgMTAwLCBtc2c9bXNnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KHgsIDIpLCA0LCBtc2c9bXNnKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCdGb3IgJXMgZ290IFR5cGVFcnJvcjogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSh4KS5fX25hbWVfXywgZXJyKSkKKworICAgIGRlZiB0ZXN0X2Vycm9yX29uX3N0cmluZ19mbG9hdF9mb3JfeChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW50LCAnMS4yJykKKworICAgIGRlZiB0ZXN0X2Vycm9yX29uX2J5dGVhcnJheV9mb3JfeChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQsIGJ5dGVhcnJheSgnMTAwJyksIDIpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9vbl9pbnZhbGlkX2ludF9iYXNlcyhzZWxmKToKKyAgICAgICAgZm9yIGJhc2UgaW4gWy0xLCAxLCAxMDAwXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzEwMCcsIGJhc2UpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9vbl9zdHJpbmdfYmFzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbnQsIDEwMCwgYmFzZT0nZm9vJykKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc21hbGxfaW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhpbnQoJzEwJyksIDEwKQorICAgICAgICBzZWxmLmFzc2VydElzKGludCgnLTEnKSwgLTEpCisgICAgICAgIGlmIGhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoaW50KHUnMTAnKSwgMTApCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGludCh1Jy0xJyksIC0xKQorCisgICAgZGVmIHRlc3RfaW50Y29udmVyc2lvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IF9faW50X18oKQorICAgICAgICBjbGFzcyBDbGFzc2ljTWlzc2luZ01ldGhvZHM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBpbnQsIENsYXNzaWNNaXNzaW5nTWV0aG9kcygpKQorCisgICAgICAgIGNsYXNzIE1pc3NpbmdNZXRob2RzKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50LCBNaXNzaW5nTWV0aG9kcygpKQorCisgICAgICAgIGNsYXNzIEZvbzA6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICBjbGFzcyBGb28xKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICBjbGFzcyBGb28yKGludCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICBjbGFzcyBGb28zKGludCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGNsYXNzIEZvbzQoaW50KToKKyAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MkwKKworICAgICAgICBjbGFzcyBGb281KGludCk6CisgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIuCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoRm9vMCgpKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KEZvbzEoKSksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChGb28yKCkpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoRm9vMygpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoRm9vNCgpKSwgNDJMKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGludCwgRm9vNSgpKQorCisgICAgICAgIGNsYXNzIENsYXNzaWM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZvciBiYXNlIGluIChvYmplY3QsIENsYXNzaWMpOgorICAgICAgICAgICAgY2xhc3MgSW50T3ZlcnJpZGVzVHJ1bmMoYmFzZSk6CisgICAgICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICAgICAgICAgIGRlZiBfX3RydW5jX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KEludE92ZXJyaWRlc1RydW5jKCkpLCA0MikKKworICAgICAgICAgICAgY2xhc3MgSnVzdFRydW5jKGJhc2UpOgorICAgICAgICAgICAgICAgIGRlZiBfX3RydW5jX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoSnVzdFRydW5jKCkpLCA0MikKKworICAgICAgICAgICAgZm9yIHRydW5jX3Jlc3VsdF9iYXNlIGluIChvYmplY3QsIENsYXNzaWMpOgorICAgICAgICAgICAgICAgIGNsYXNzIEludGVncmFsKHRydW5jX3Jlc3VsdF9iYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICAgICAgICAgIGNsYXNzIFRydW5jUmV0dXJuc05vbkludChiYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ3JhbCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoVHJ1bmNSZXR1cm5zTm9uSW50KCkpLCA0MikKKworICAgICAgICAgICAgICAgIGNsYXNzIE5vbkludGVncmFsKHRydW5jX3Jlc3VsdF9iYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB3ZSBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uSW50ZWdyYWwoKQorCisgICAgICAgICAgICAgICAgY2xhc3MgVHJ1bmNSZXR1cm5zTm9uSW50ZWdyYWwoYmFzZSk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX3RydW5jX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uSW50ZWdyYWwoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW50KFRydW5jUmV0dXJuc05vbkludGVncmFsKCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKHR5cGUgTm9uSW50ZWdyYWwpIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkZhaWxlZCB0byByYWlzZSBUeXBlRXJyb3Igd2l0aCAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChiYXNlLCB0cnVuY19yZXN1bHRfYmFzZSksKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChJbnRUZXN0Q2FzZXMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2QyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2QyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludF9saXRlcmFsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50X2xpdGVyYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY1Y2M3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2ludF9saXRlcmFsLnB5CkBAIC0wLDAgKzEsMTg4IEBACisiIiJUZXN0IGNvcnJlY3QgdHJlYXRtZW50IG9mIGhleC9vY3QgY29uc3RhbnRzLgorCitUaGlzIGlzIGNvbXBsZXggYmVjYXVzZSBvZiBjaGFuZ2VzIGR1ZSB0byBQRVAgMjM3LgorIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBUZXN0SGV4T2N0QmluKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2hleF9iYXNlbGluZShzZWxmKToKKyAgICAgICAgIyBBIGZldyB1cHBlci9sb3dlcmNhc2UgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDAsIDBYMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDEsIDBYMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDEyMzQ1Njc4OWFiY2RlZiwgMFgxMjM0NTY3ODlhYmNkZWYpCisgICAgICAgICMgQmFzZWxpbmUgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHgxMCwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHg3ZmZmZmZmZiwgMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweDdmZmZmZmZmZmZmZmZmZmYsIDkyMjMzNzIwMzY4NTQ3NzU4MDcpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgweDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMHgxMCksIC0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDB4N2ZmZmZmZmYpLCAtMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDB4N2ZmZmZmZmZmZmZmZmZmZiksIC05MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0weDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4MTAsIC0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMHg3ZmZmZmZmZiwgLTIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4N2ZmZmZmZmZmZmZmZmZmZiwgLTkyMjMzNzIwMzY4NTQ3NzU4MDcpCisKKyAgICBkZWYgdGVzdF9oZXhfdW5zaWduZWQoc2VsZik6CisgICAgICAgICMgUG9zaXRpdmUgY29uc3RhbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHg4MDAwMDAwMCwgMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZiwgNDI5NDk2NzI5NUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgweDgwMDAwMDAwKSwgLTIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMHhmZmZmZmZmZiksIC00Mjk0OTY3Mjk1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgTk8gcGFyZW50aGVzZXMKKyAgICAgICAgIyBUaGlzIGZhaWxlZCBpbiBQeXRob24gMi4yIHRocm91Z2ggMi4yLjIgYW5kIGluIDIuM2ExCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4ODAwMDAwMDAsIC0yMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMHhmZmZmZmZmZiwgLTQyOTQ5NjcyOTVMKQorCisgICAgICAgICMgUG9zaXRpdmUgY29uc3RhbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHg4MDAwMDAwMDAwMDAwMDAwLCA5MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmYsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDB4ODAwMDAwMDAwMDAwMDAwMCksIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDB4ZmZmZmZmZmZmZmZmZmZmZiksIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgICMgVGhpcyBmYWlsZWQgaW4gUHl0aG9uIDIuMiB0aHJvdWdoIDIuMi4yIGFuZCBpbiAyLjNhMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0weDgwMDAwMDAwMDAwMDAwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMHhmZmZmZmZmZmZmZmZmZmZmLCAtMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorCisgICAgZGVmIHRlc3Rfb2N0X2Jhc2VsaW5lKHNlbGYpOgorICAgICAgICAjIEJhc2VsaW5lIHRlc3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMDIwLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwMTc3Nzc3Nzc3NzcsIDIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NywgOTIyMzM3MjAzNjg1NDc3NTgwNykKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDAyMCksIC0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDAxNzc3Nzc3Nzc3NyksIC0yMTQ3NDgzNjQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMDc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyksIC05MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMDIwLCAtMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTAxNzc3Nzc3Nzc3NywgLTIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTA3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcsIC05MjIzMzcyMDM2ODU0Nzc1ODA3KQorCisgICAgZGVmIHRlc3Rfb2N0X2Jhc2VsaW5lX25ldyhzZWxmKToKKyAgICAgICAgIyBBIGZldyB1cHBlci9sb3dlcmNhc2UgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwbzAsIDBPMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwbzEsIDBPMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwbzEyMzQ1NjcsIDBPMTIzNDU2NykKKyAgICAgICAgIyBCYXNlbGluZSB0ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwbzIwLCAxNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwbzE3Nzc3Nzc3Nzc3LCAyMTQ3NDgzNjQ3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3LCA5MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMG8wKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBvMjApLCAtMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwbzE3Nzc3Nzc3Nzc3KSwgLTIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwbzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NyksIC05MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wbzAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBvMjAsIC0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMG8xNzc3Nzc3Nzc3NywgLTIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBvNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3LCAtOTIyMzM3MjAzNjg1NDc3NTgwNykKKworICAgIGRlZiB0ZXN0X29jdF91bnNpZ25lZChzZWxmKToKKyAgICAgICAgIyBQb3NpdGl2ZSBjb25zdGFudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwMjAwMDAwMDAwMDAsIDIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAzNzc3Nzc3Nzc3NywgNDI5NDk2NzI5NUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwMjAwMDAwMDAwMDApLCAtMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwMzc3Nzc3Nzc3NzcpLCAtNDI5NDk2NzI5NUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgICMgVGhpcyBmYWlsZWQgaW4gUHl0aG9uIDIuMiB0aHJvdWdoIDIuMi4yIGFuZCBpbiAyLjNhMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wMjAwMDAwMDAwMDAsIC0yMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMDM3Nzc3Nzc3Nzc3LCAtNDI5NDk2NzI5NUwpCisKKyAgICAgICAgIyBQb3NpdGl2ZSBjb25zdGFudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwKSwgLTkyMjMzNzIwMzY4NTQ3NzU4MDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcpLCAtMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICAjIFRoaXMgZmFpbGVkIGluIFB5dGhvbiAyLjIgdGhyb3VnaCAyLjIuMiBhbmQgaW4gMi4zYTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIC05MjIzMzcyMDM2ODU0Nzc1ODA4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMDE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcsIC0xODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisKKyAgICBkZWYgdGVzdF9vY3RfdW5zaWduZWRfbmV3KHNlbGYpOgorICAgICAgICAjIFBvc2l0aXZlIGNvbnN0YW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMjAwMDAwMDAwMDAsIDIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMzc3Nzc3Nzc3NzcsIDQyOTQ5NjcyOTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMG8yMDAwMDAwMDAwMCksIC0yMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBvMzc3Nzc3Nzc3NzcpLCAtNDI5NDk2NzI5NUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgICMgVGhpcyBmYWlsZWQgaW4gUHl0aG9uIDIuMiB0aHJvdWdoIDIuMi4yIGFuZCBpbiAyLjNhMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wbzIwMDAwMDAwMDAwLCAtMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBvMzc3Nzc3Nzc3NzcsIC00Mjk0OTY3Mjk1TCkKKworICAgICAgICAjIFBvc2l0aXZlIGNvbnN0YW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBvMTAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMG8xNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3LCAxODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwbzEwMDAwMDAwMDAwMDAwMDAwMDAwMDApLCAtOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwbzE3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NzcpLCAtMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICAjIFRoaXMgZmFpbGVkIGluIFB5dGhvbiAyLjIgdGhyb3VnaCAyLjIuMiBhbmQgaW4gMi4zYTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMG8xMDAwMDAwMDAwMDAwMDAwMDAwMDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBvMTc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3NywgLTE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKworICAgIGRlZiB0ZXN0X2Jpbl9iYXNlbGluZShzZWxmKToKKyAgICAgICAgIyBBIGZldyB1cHBlci9sb3dlcmNhc2UgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwYjAsIDBCMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwYjEsIDBCMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwYjEwMTAxMDEwMTAxLCAwQjEwMTAxMDEwMTAxKQorICAgICAgICAjIEJhc2VsaW5lIHRlc3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMGIwLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMTAwMDAsIDE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSwgMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSwgOTIyMzM3MjAzNjg1NDc3NTgwNykKKyAgICAgICAgIyBEaXR0byB3aXRoIGEgbWludXMgc2lnbiBhbmQgcGFyZW50aGVzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBiMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwYjEwMDAwKSwgLTE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExKSwgLTIxNDc0ODM2NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSksIC05MjIzMzcyMDM2ODU0Nzc1ODA3KQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wYjAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBiMTAwMDAsIC0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExLCAtMjE0NzQ4MzY0NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsIC05MjIzMzcyMDM2ODU0Nzc1ODA3KQorCisgICAgZGVmIHRlc3RfYmluX3Vuc2lnbmVkKHNlbGYpOgorICAgICAgICAjIFBvc2l0aXZlIGNvbnN0YW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsIDIxNDc0ODM2NDhMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsIDQyOTQ5NjcyOTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBwYXJlbnRoZXNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0oMGIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCksIC0yMTQ3NDgzNjQ4TCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtKDBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEpLCAtNDI5NDk2NzI5NUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIE5PIHBhcmVudGhlc2VzCisgICAgICAgICMgVGhpcyBmYWlsZWQgaW4gUHl0aG9uIDIuMiB0aHJvdWdoIDIuMi4yIGFuZCBpbiAyLjNhMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0wYjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLCAtMjE0NzQ4MzY0OEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsIC00Mjk0OTY3Mjk1TCkKKworICAgICAgICAjIFBvc2l0aXZlIGNvbnN0YW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDBiMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwgOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMGIxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExLCAxODQ0Njc0NDA3MzcwOTU1MTYxNUwpCisgICAgICAgICMgRGl0dG8gd2l0aCBhIG1pbnVzIHNpZ24gYW5kIHBhcmVudGhlc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwYjEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDApLCAtOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLSgwYjExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEpLCAtMTg0NDY3NDQwNzM3MDk1NTE2MTVMKQorICAgICAgICAjIERpdHRvIHdpdGggYSBtaW51cyBzaWduIGFuZCBOTyBwYXJlbnRoZXNlcworICAgICAgICAjIFRoaXMgZmFpbGVkIGluIFB5dGhvbiAyLjIgdGhyb3VnaCAyLjIuMiBhbmQgaW4gMi4zYTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtMGIxMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLCAtOTIyMzM3MjAzNjg1NDc3NTgwOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTBiMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMSwgLTE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdEhleE9jdEJpbikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50X2xpdGVyYWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50X2xpdGVyYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDk0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnRfbGl0ZXJhbC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50X2xpdGVyYWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW50X2xpdGVyYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZDk0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pbnRfbGl0ZXJhbC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pby5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2EwNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHkKQEAgLTAsMCArMSwzMDgzIEBACisiIiJVbml0IHRlc3RzIGZvciB0aGUgaW8gbW9kdWxlLiIiIgorCisjIFRlc3RzIG9mIGlvIGFyZSBzY2F0dGVyZWQgb3ZlciB0aGUgdGVzdCBzdWl0ZToKKyMgKiB0ZXN0X2J1ZmlvIC0gdGVzdHMgZmlsZSBidWZmZXJpbmcKKyMgKiB0ZXN0X21lbW9yeWlvIC0gdGVzdHMgQnl0ZXNJTyBhbmQgU3RyaW5nSU8KKyMgKiB0ZXN0X2ZpbGVpbyAtIHRlc3RzIEZpbGVJTworIyAqIHRlc3RfZmlsZSAtIHRlc3RzIHRoZSBmaWxlIGludGVyZmFjZQorIyAqIHRlc3RfaW8gLSB0ZXN0cyBldmVyeXRoaW5nIGVsc2UgaW4gdGhlIGlvIG1vZHVsZQorIyAqIHRlc3RfdW5pdm5ld2xpbmVzIC0gdGVzdHMgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAorIyAqIHRlc3RfbGFyZ2VmaWxlIC0gdGVzdHMgb3BlcmF0aW9ucyBvbiBhIGZpbGUgZ3JlYXRlciB0aGFuIDIqKjMyIGJ5dGVzCisjICAgICAob25seSBlbmFibGVkIHdpdGggLXVsYXJnZWZpbGUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFUVEVOVElPTiBURVNUIFdSSVRFUlMhISEKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFdoZW4gd3JpdGluZyB0ZXN0cyBmb3IgaW8sIGl0J3MgaW1wb3J0YW50IHRvIHRlc3QgYm90aCB0aGUgQyBhbmQgUHl0aG9uCisjIGltcGxlbWVudGF0aW9ucy4gVGhpcyBpcyB1c3VhbGx5IGRvbmUgYnkgd3JpdGluZyBhIGJhc2UgdGVzdCB0aGF0IHJlZmVycyB0bworIyB0aGUgdHlwZSBpdCBpcyB0ZXN0aW5nIGFzIGEgYXR0cmlidXRlLiBUaGVuIGl0IHByb3ZpZGVzIGN1c3RvbSBzdWJjbGFzc2VzIHRvCisjIHRlc3QgYm90aCBpbXBsZW1lbnRhdGlvbnMuIFRoaXMgZmlsZSBoYXMgbG90cyBvZiBleGFtcGxlcy4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgYXJyYXkKK2ltcG9ydCByYW5kb20KK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdlYWtyZWYKK2ltcG9ydCBhYmMKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBlcnJubworZnJvbSBpdGVydG9vbHMgaW1wb3J0IGN5Y2xlLCBjb3VudAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKK2Zyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CitpbXBvcnQgY29udGV4dGxpYgorCitpbXBvcnQgY29kZWNzCitpbXBvcnQgaW8gICMgQyBpbXBsZW1lbnRhdGlvbiBvZiBpbworaW1wb3J0IF9weWlvIGFzIHB5aW8gIyBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgaW8KK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgdGhyZWFkaW5nID0gTm9uZQordHJ5OgorICAgIGltcG9ydCBmY250bAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZjbnRsID0gTm9uZQorCitfX21ldGFjbGFzc19fID0gdHlwZQorYnl0ZXMgPSBzdXBwb3J0LnB5M2tfYnl0ZXMKKworZGVmIF9kZWZhdWx0X2NodW5rX3NpemUoKToKKyAgICAiIiJHZXQgdGhlIGRlZmF1bHQgVGV4dElPV3JhcHBlciBjaHVuayBzaXplIiIiCisgICAgd2l0aCBpby5vcGVuKF9fZmlsZV9fLCAiciIsIGVuY29kaW5nPSJsYXRpbjEiKSBhcyBmOgorICAgICAgICByZXR1cm4gZi5fQ0hVTktfU0laRQorCisKK2NsYXNzIE1vY2tSYXdJT1dpdGhvdXRSZWFkOgorICAgICIiIkEgUmF3SU8gaW1wbGVtZW50YXRpb24gd2l0aG91dCByZWFkKCksIHNvIGFzIHRvIGV4ZXJjaXNlIHRoZSBkZWZhdWx0CisgICAgUmF3SU8ucmVhZCgpIHdoaWNoIGNhbGxzIHJlYWRpbnRvKCkuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVhZF9zdGFjaz0oKSk6CisgICAgICAgIHNlbGYuX3JlYWRfc3RhY2sgPSBsaXN0KHJlYWRfc3RhY2spCisgICAgICAgIHNlbGYuX3dyaXRlX3N0YWNrID0gW10KKyAgICAgICAgc2VsZi5fcmVhZHMgPSAwCisgICAgICAgIHNlbGYuX2V4dHJhbmVvdXNfcmVhZHMgPSAwCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgYik6CisgICAgICAgIHNlbGYuX3dyaXRlX3N0YWNrLmFwcGVuZChieXRlcyhiKSkKKyAgICAgICAgcmV0dXJuIGxlbihiKQorCisgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGZpbGVubyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDQyCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2Vla2FibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgc2VlayhzZWxmLCBwb3MsIHdoZW5jZSk6CisgICAgICAgIHJldHVybiAwICAgIyB3cm9uZyBidXQgd2UgZ290dGEgcmV0dXJuIHNvbWV0aGluZworCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiAwICAgIyBzYW1lIGNvbW1lbnQgYXMgYWJvdmUKKworICAgIGRlZiByZWFkaW50byhzZWxmLCBidWYpOgorICAgICAgICBzZWxmLl9yZWFkcyArPSAxCisgICAgICAgIG1heF9sZW4gPSBsZW4oYnVmKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkYXRhID0gc2VsZi5fcmVhZF9zdGFja1swXQorICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuX2V4dHJhbmVvdXNfcmVhZHMgKz0gMQorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgZGVsIHNlbGYuX3JlYWRfc3RhY2tbMF0KKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIG4gPSBsZW4oZGF0YSkKKyAgICAgICAgaWYgbGVuKGRhdGEpIDw9IG1heF9sZW46CisgICAgICAgICAgICBkZWwgc2VsZi5fcmVhZF9zdGFja1swXQorICAgICAgICAgICAgYnVmWzpuXSA9IGRhdGEKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWZbOl0gPSBkYXRhWzptYXhfbGVuXQorICAgICAgICAgICAgc2VsZi5fcmVhZF9zdGFja1swXSA9IGRhdGFbbWF4X2xlbjpdCisgICAgICAgICAgICByZXR1cm4gbWF4X2xlbgorCisgICAgZGVmIHRydW5jYXRlKHNlbGYsIHBvcz1Ob25lKToKKyAgICAgICAgcmV0dXJuIHBvcworCitjbGFzcyBDTW9ja1Jhd0lPV2l0aG91dFJlYWQoTW9ja1Jhd0lPV2l0aG91dFJlYWQsIGlvLlJhd0lPQmFzZSk6CisgICAgcGFzcworCitjbGFzcyBQeU1vY2tSYXdJT1dpdGhvdXRSZWFkKE1vY2tSYXdJT1dpdGhvdXRSZWFkLCBweWlvLlJhd0lPQmFzZSk6CisgICAgcGFzcworCisKK2NsYXNzIE1vY2tSYXdJTyhNb2NrUmF3SU9XaXRob3V0UmVhZCk6CisKKyAgICBkZWYgcmVhZChzZWxmLCBuPU5vbmUpOgorICAgICAgICBzZWxmLl9yZWFkcyArPSAxCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZWFkX3N0YWNrLnBvcCgwKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLl9leHRyYW5lb3VzX3JlYWRzICs9IDEKKyAgICAgICAgICAgIHJldHVybiBiIiIKKworY2xhc3MgQ01vY2tSYXdJTyhNb2NrUmF3SU8sIGlvLlJhd0lPQmFzZSk6CisgICAgcGFzcworCitjbGFzcyBQeU1vY2tSYXdJTyhNb2NrUmF3SU8sIHB5aW8uUmF3SU9CYXNlKToKKyAgICBwYXNzCisKKworY2xhc3MgTWlzYmVoYXZlZFJhd0lPKE1vY2tSYXdJTyk6CisgICAgZGVmIHdyaXRlKHNlbGYsIGIpOgorICAgICAgICByZXR1cm4gTW9ja1Jhd0lPLndyaXRlKHNlbGYsIGIpICogMgorCisgICAgZGVmIHJlYWQoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgcmV0dXJuIE1vY2tSYXdJTy5yZWFkKHNlbGYsIG4pICogMgorCisgICAgZGVmIHNlZWsoc2VsZiwgcG9zLCB3aGVuY2UpOgorICAgICAgICByZXR1cm4gLTEyMworCisgICAgZGVmIHRlbGwoc2VsZik6CisgICAgICAgIHJldHVybiAtNDU2CisKKyAgICBkZWYgcmVhZGludG8oc2VsZiwgYnVmKToKKyAgICAgICAgTW9ja1Jhd0lPLnJlYWRpbnRvKHNlbGYsIGJ1ZikKKyAgICAgICAgcmV0dXJuIGxlbihidWYpICogNQorCitjbGFzcyBDTWlzYmVoYXZlZFJhd0lPKE1pc2JlaGF2ZWRSYXdJTywgaW8uUmF3SU9CYXNlKToKKyAgICBwYXNzCisKK2NsYXNzIFB5TWlzYmVoYXZlZFJhd0lPKE1pc2JlaGF2ZWRSYXdJTywgcHlpby5SYXdJT0Jhc2UpOgorICAgIHBhc3MKKworCitjbGFzcyBDbG9zZUZhaWx1cmVJTyhNb2NrUmF3SU8pOgorICAgIGNsb3NlZCA9IDAKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSAxCisgICAgICAgICAgICByYWlzZSBJT0Vycm9yCisKK2NsYXNzIENDbG9zZUZhaWx1cmVJTyhDbG9zZUZhaWx1cmVJTywgaW8uUmF3SU9CYXNlKToKKyAgICBwYXNzCisKK2NsYXNzIFB5Q2xvc2VGYWlsdXJlSU8oQ2xvc2VGYWlsdXJlSU8sIHB5aW8uUmF3SU9CYXNlKToKKyAgICBwYXNzCisKKworY2xhc3MgTW9ja0ZpbGVJTzoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5yZWFkX2hpc3RvcnkgPSBbXQorICAgICAgICBzdXBlcihNb2NrRmlsZUlPLCBzZWxmKS5fX2luaXRfXyhkYXRhKQorCisgICAgZGVmIHJlYWQoc2VsZiwgbj1Ob25lKToKKyAgICAgICAgcmVzID0gc3VwZXIoTW9ja0ZpbGVJTywgc2VsZikucmVhZChuKQorICAgICAgICBzZWxmLnJlYWRfaGlzdG9yeS5hcHBlbmQoTm9uZSBpZiByZXMgaXMgTm9uZSBlbHNlIGxlbihyZXMpKQorICAgICAgICByZXR1cm4gcmVzCisKKyAgICBkZWYgcmVhZGludG8oc2VsZiwgYik6CisgICAgICAgIHJlcyA9IHN1cGVyKE1vY2tGaWxlSU8sIHNlbGYpLnJlYWRpbnRvKGIpCisgICAgICAgIHNlbGYucmVhZF9oaXN0b3J5LmFwcGVuZChyZXMpCisgICAgICAgIHJldHVybiByZXMKKworY2xhc3MgQ01vY2tGaWxlSU8oTW9ja0ZpbGVJTywgaW8uQnl0ZXNJTyk6CisgICAgcGFzcworCitjbGFzcyBQeU1vY2tGaWxlSU8oTW9ja0ZpbGVJTywgcHlpby5CeXRlc0lPKToKKyAgICBwYXNzCisKKworY2xhc3MgTW9ja05vbkJsb2NrV3JpdGVySU86CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3dyaXRlX3N0YWNrID0gW10KKyAgICAgICAgc2VsZi5fYmxvY2tlcl9jaGFyID0gTm9uZQorCisgICAgZGVmIHBvcF93cml0dGVuKHNlbGYpOgorICAgICAgICBzID0gYiIiLmpvaW4oc2VsZi5fd3JpdGVfc3RhY2spCisgICAgICAgIHNlbGYuX3dyaXRlX3N0YWNrWzpdID0gW10KKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBibG9ja19vbihzZWxmLCBjaGFyKToKKyAgICAgICAgIiIiQmxvY2sgd2hlbiBhIGdpdmVuIGNoYXIgaXMgZW5jb3VudGVyZWQuIiIiCisgICAgICAgIHNlbGYuX2Jsb2NrZXJfY2hhciA9IGNoYXIKKworICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiBzZWVrYWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBiKToKKyAgICAgICAgYiA9IGJ5dGVzKGIpCisgICAgICAgIG4gPSAtMQorICAgICAgICBpZiBzZWxmLl9ibG9ja2VyX2NoYXI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbiA9IGIuaW5kZXgoc2VsZi5fYmxvY2tlcl9jaGFyKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBuID4gMDoKKyAgICAgICAgICAgICAgICAgICAgIyB3cml0ZSBkYXRhIHVwIHRvIHRoZSBmaXJzdCBibG9ja2VyCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlX3N0YWNrLmFwcGVuZChiWzpuXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGNhbmNlbCBibG9ja2VyIGFuZCBpbmRpY2F0ZSB3b3VsZCBibG9jaworICAgICAgICAgICAgICAgICAgICBzZWxmLl9ibG9ja2VyX2NoYXIgPSBOb25lCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuX3dyaXRlX3N0YWNrLmFwcGVuZChiKQorICAgICAgICByZXR1cm4gbGVuKGIpCisKK2NsYXNzIENNb2NrTm9uQmxvY2tXcml0ZXJJTyhNb2NrTm9uQmxvY2tXcml0ZXJJTywgaW8uUmF3SU9CYXNlKToKKyAgICBCbG9ja2luZ0lPRXJyb3IgPSBpby5CbG9ja2luZ0lPRXJyb3IKKworY2xhc3MgUHlNb2NrTm9uQmxvY2tXcml0ZXJJTyhNb2NrTm9uQmxvY2tXcml0ZXJJTywgcHlpby5SYXdJT0Jhc2UpOgorICAgIEJsb2NraW5nSU9FcnJvciA9IHB5aW8uQmxvY2tpbmdJT0Vycm9yCisKKworY2xhc3MgSU9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHdyaXRlX29wcyhzZWxmLCBmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKGIiYmxhaC4iKSwgNSkKKyAgICAgICAgZi50cnVuY2F0ZSgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA1KQorICAgICAgICBmLnNlZWsoMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoYiJibGFoLiIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKGIiSGVsbG8uIiksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKC0xLCAxKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKGJ5dGVhcnJheShiIiB3b3JsZFxuXG5cbiIpKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0ZShiImgiKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoLTEsIDIpLCAxMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMTMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRydW5jYXRlKDEyKSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDEzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYuc2VlaywgMC4wKQorCisgICAgZGVmIHJlYWRfb3BzKHNlbGYsIGYsIGJ1ZmZlcmVkPUZhbHNlKToKKyAgICAgICAgZGF0YSA9IGYucmVhZCg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGIiaGVsbG8iKQorICAgICAgICBkYXRhID0gYnl0ZWFycmF5KGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkaW50byhkYXRhKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBiIiB3b3JsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRpbnRvKGRhdGEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkYXRhKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhWzoyXSwgYiJkXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMjApLCBiImhlbGxvIHdvcmxkXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgYiIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGludG8oYnl0ZWFycmF5KGIieCIpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoLTYsIDIpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCg1KSwgYiJ3b3JsZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDApLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkaW50byhieXRlYXJyYXkoKSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKC02LCAxKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoNSksIGIiIHdvcmwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLnNlZWssIDAuMCkKKyAgICAgICAgaWYgYnVmZmVyZWQ6CisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiaGVsbG8gd29ybGRcbiIpCisgICAgICAgICAgICBmLnNlZWsoNikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIid29ybGRcbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIiIpCisKKyAgICBMQVJHRSA9IDIqKjMxCisKKyAgICBkZWYgbGFyZ2VfZmlsZV9vcHMoc2VsZiwgZik6CisgICAgICAgIGFzc2VydCBmLnJlYWRhYmxlKCkKKyAgICAgICAgYXNzZXJ0IGYud3JpdGFibGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlayhzZWxmLkxBUkdFKSwgc2VsZi5MQVJHRSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgc2VsZi5MQVJHRSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKGIieHh4IiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHNlbGYuTEFSR0UgKyAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygtMSwgMSksIHNlbGYuTEFSR0UgKyAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudHJ1bmNhdGUoKSwgc2VsZi5MQVJHRSArIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHNlbGYuTEFSR0UgKyAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwLCAyKSwgc2VsZi5MQVJHRSArIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50cnVuY2F0ZShzZWxmLkxBUkdFICsgMSksIHNlbGYuTEFSR0UgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBzZWxmLkxBUkdFICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCwgMiksIHNlbGYuTEFSR0UgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygtMSwgMiksIHNlbGYuTEFSR0UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDIpLCBiIngiKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9vcGVyYXRpb25zKHNlbGYpOgorICAgICAgICAjIFRyeSB3cml0aW5nIG9uIGEgZmlsZSBvcGVuZWQgaW4gcmVhZCBtb2RlIGFuZCB2aWNlLXZlcnNhLgorICAgICAgICBmb3IgbW9kZSBpbiAoInciLCAid2IiKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBtb2RlKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBmcC5yZWFkKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGZwLnJlYWRsaW5lKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBmcC53cml0ZSwgYiJibGFoIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGZwLndyaXRlbGluZXMsIFtiImJsYWhcbiJdKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInIiKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGZwLndyaXRlLCAiYmxhaCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBmcC53cml0ZWxpbmVzLCBbImJsYWhcbiJdKQorCisgICAgZGVmIHRlc3RfcmF3X2ZpbGVfaW8oc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiLCBidWZmZXJpbmc9MCkgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkYWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWthYmxlKCksIFRydWUpCisgICAgICAgICAgICBzZWxmLndyaXRlX29wcyhmKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIiwgYnVmZmVyaW5nPTApIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGFibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5yZWFkX29wcyhmKQorCisgICAgZGVmIHRlc3RfYnVmZmVyZWRfZmlsZV9pbyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGFibGUoKSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGFibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi53cml0ZV9vcHMoZikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGFibGUoKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0YWJsZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrYWJsZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5yZWFkX29wcyhmLCBUcnVlKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShiImFiY1xuZGVmXG54eXp6eVxuZm9vXHgwMGJhclxuYW5vdGhlciBsaW5lIikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgYiJhYmNcbiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoMTApLCBiImRlZlxuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgyKSwgYiJ4eSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoNCksIGIienp5XG4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksIGIiZm9vXHgwMGJhclxuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZShOb25lKSwgYiJhbm90aGVyIGxpbmUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLnJlYWRsaW5lLCA1LjMpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiciIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYucmVhZGxpbmUsIDUuMykKKworICAgIGRlZiB0ZXN0X3Jhd19ieXRlc19pbyhzZWxmKToKKyAgICAgICAgZiA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgIHNlbGYud3JpdGVfb3BzKGYpCisgICAgICAgIGRhdGEgPSBmLmdldHZhbHVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBiImhlbGxvIHdvcmxkXG4iKQorICAgICAgICBmID0gc2VsZi5CeXRlc0lPKGRhdGEpCisgICAgICAgIHNlbGYucmVhZF9vcHMoZiwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2xhcmdlX2ZpbGVfb3BzKHNlbGYpOgorICAgICAgICAjIE9uIFdpbmRvd3MgYW5kIE1hYyBPU1ggdGhpcyB0ZXN0IGNvbXN1bWVzIGxhcmdlIHJlc291cmNlczsgSXQgdGFrZXMKKyAgICAgICAgIyBhIGxvbmcgdGltZSB0byBidWlsZCB0aGUgPjJHQiBmaWxlIGFuZCB0YWtlcyA+MkdCIG9mIGRpc2sgc3BhY2UKKyAgICAgICAgIyB0aGVyZWZvcmUgdGhlIHJlc291cmNlIG11c3QgYmUgZW5hYmxlZCB0byBydW4gdGhpcyB0ZXN0LgorICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nIG9yIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgIGlmIG5vdCBzdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoImxhcmdlZmlsZSIpOgorICAgICAgICAgICAgICAgIHByaW50KCJcblRlc3RpbmcgbGFyZ2UgZmlsZSBvcHMgc2tpcHBlZCBvbiAlcy4iICUgc3lzLnBsYXRmb3JtLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICBwcmludCgiSXQgcmVxdWlyZXMgJWQgYnl0ZXMgYW5kIGEgbG9uZyB0aW1lLiIgJSBzZWxmLkxBUkdFLAorICAgICAgICAgICAgICAgICAgICAgIGZpbGU9c3lzLnN0ZGVycikKKyAgICAgICAgICAgICAgICBwcmludCgiVXNlICdyZWdydGVzdC5weSAtdSBsYXJnZWZpbGUgdGVzdF9pbycgdG8gcnVuIGl0LiIsCisgICAgICAgICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIncrYiIsIDApIGFzIGY6CisgICAgICAgICAgICBzZWxmLmxhcmdlX2ZpbGVfb3BzKGYpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidytiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYubGFyZ2VfZmlsZV9vcHMoZikKKworICAgIGRlZiB0ZXN0X3dpdGhfb3BlbihzZWxmKToKKyAgICAgICAgZm9yIGJ1ZnNpemUgaW4gKDAsIDEsIDEwMCk6CisgICAgICAgICAgICBmID0gTm9uZQorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZnNpemUpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShiInh4eCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuY2xvc2VkLCBUcnVlKQorICAgICAgICAgICAgZiA9IE5vbmUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgYnVmc2l6ZSkgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmNsb3NlZCwgVHJ1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIxIC8vIDAgZGlkbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiIpCisKKyAgICAjIGlzc3VlIDUwMDgKKyAgICBkZWYgdGVzdF9hcHBlbmRfbW9kZV90ZWxsKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoYiJ4eHgiKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgImFiIiwgYnVmZmVyaW5nPTApIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAzKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgImFiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDMpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiYSIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi50ZWxsKCkgPiAwKQorCisgICAgZGVmIHRlc3RfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgY2xhc3MgTXlGaWxlSU8oc2VsZi5GaWxlSU8pOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgxKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZiA9IHN1cGVyKE15RmlsZUlPLCBzZWxmKS5fX2RlbF9fCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgyKQorICAgICAgICAgICAgICAgIHN1cGVyKE15RmlsZUlPLCBzZWxmKS5jbG9zZSgpCisgICAgICAgICAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgzKQorICAgICAgICAgICAgICAgIHN1cGVyKE15RmlsZUlPLCBzZWxmKS5mbHVzaCgpCisgICAgICAgIGYgPSBNeUZpbGVJTyhzdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgZi53cml0ZShiInh4eCIpCisgICAgICAgIGRlbCBmCisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLCBbMSwgMiwgM10pCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJ4eHgiKQorCisgICAgZGVmIF9jaGVja19iYXNlX2Rlc3RydWN0b3Ioc2VsZiwgYmFzZSk6CisgICAgICAgIHJlY29yZCA9IFtdCisgICAgICAgIGNsYXNzIE15SU8oYmFzZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgIyBUaGlzIGV4ZXJjaXNlcyB0aGUgYXZhaWxhYmlsaXR5IG9mIGF0dHJpYnV0ZXMgb24gb2JqZWN0CisgICAgICAgICAgICAgICAgIyBkZXN0cnVjdGlvbi4KKyAgICAgICAgICAgICAgICAjIChpbiB0aGUgQyB2ZXJzaW9uLCBjbG9zZSgpIGlzIGNhbGxlZCBieSB0aGUgdHBfZGVhbGxvYworICAgICAgICAgICAgICAgICMgZnVuY3Rpb24sIG5vdCBieSBfX2RlbF9fKQorICAgICAgICAgICAgICAgIHNlbGYub25fZGVsID0gMQorICAgICAgICAgICAgICAgIHNlbGYub25fY2xvc2UgPSAyCisgICAgICAgICAgICAgICAgc2VsZi5vbl9mbHVzaCA9IDMKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoc2VsZi5vbl9kZWwpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmID0gc3VwZXIoTXlJTywgc2VsZikuX19kZWxfXworICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGYoKQorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoc2VsZi5vbl9jbG9zZSkKKyAgICAgICAgICAgICAgICBzdXBlcihNeUlPLCBzZWxmKS5jbG9zZSgpCisgICAgICAgICAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZChzZWxmLm9uX2ZsdXNoKQorICAgICAgICAgICAgICAgIHN1cGVyKE15SU8sIHNlbGYpLmZsdXNoKCkKKyAgICAgICAgZiA9IE15SU8oKQorICAgICAgICBkZWwgZgorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlY29yZCwgWzEsIDIsIDNdKQorCisgICAgZGVmIHRlc3RfSU9CYXNlX2Rlc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Jhc2VfZGVzdHJ1Y3RvcihzZWxmLklPQmFzZSkKKworICAgIGRlZiB0ZXN0X1Jhd0lPQmFzZV9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19iYXNlX2Rlc3RydWN0b3Ioc2VsZi5SYXdJT0Jhc2UpCisKKyAgICBkZWYgdGVzdF9CdWZmZXJlZElPQmFzZV9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19iYXNlX2Rlc3RydWN0b3Ioc2VsZi5CdWZmZXJlZElPQmFzZSkKKworICAgIGRlZiB0ZXN0X1RleHRJT0Jhc2VfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzZV9kZXN0cnVjdG9yKHNlbGYuVGV4dElPQmFzZSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2ZsdXNoZXMoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShiInh4eCIpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJ4eHgiKQorCisgICAgZGVmIHRlc3RfYXJyYXlfd3JpdGVzKHNlbGYpOgorICAgICAgICBhID0gYXJyYXkuYXJyYXkoYidpJywgcmFuZ2UoMTApKQorICAgICAgICBuID0gbGVuKGEudG9zdHJpbmcoKSkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIDApIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUoYSksIG4pCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKGEpLCBuKQorCisgICAgZGVmIHRlc3RfY2xvc2VmZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5vcGVuLCBzdXBwb3J0LlRFU1RGTiwgJ3cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZWZkPUZhbHNlKQorCisgICAgZGVmIHRlc3RfcmVhZF9jbG9zZWQoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidyIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJlZ2dcbiIpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiciIpIGFzIGY6CisgICAgICAgICAgICBmaWxlID0gc2VsZi5vcGVuKGYuZmlsZW5vKCksICJyIiwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZS5yZWFkKCksICJlZ2dcbiIpCisgICAgICAgICAgICBmaWxlLnNlZWsoMCkKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmlsZS5yZWFkKQorCisgICAgZGVmIHRlc3Rfbm9fY2xvc2VmZF93aXRoX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICAjIGNhbid0IHVzZSBjbG9zZWZkIGluIGNvbWJpbmF0aW9uIHdpdGggYSBmaWxlIG5hbWUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5vcGVuLCBzdXBwb3J0LlRFU1RGTiwgInIiLCBjbG9zZWZkPUZhbHNlKQorCisgICAgZGVmIHRlc3RfY2xvc2VmZF9hdHRyKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoYiJlZ2dcbiIpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiciIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuYnVmZmVyLnJhdy5jbG9zZWZkLCBUcnVlKQorICAgICAgICAgICAgZmlsZSA9IHNlbGYub3BlbihmLmZpbGVubygpLCAiciIsIGNsb3NlZmQ9RmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGUuYnVmZmVyLnJhdy5jbG9zZWZkLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2dhcmJhZ2VfY29sbGVjdGlvbihzZWxmKToKKyAgICAgICAgIyBGaWxlSU8gb2JqZWN0cyBhcmUgY29sbGVjdGVkLCBhbmQgY29sbGVjdGluZyB0aGVtIGZsdXNoZXMKKyAgICAgICAgIyBhbGwgZGF0YSB0byBkaXNrLgorICAgICAgICBmID0gc2VsZi5GaWxlSU8oc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIGYud3JpdGUoYiJhYmN4eHgiKQorICAgICAgICBmLmYgPSBmCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoZikKKyAgICAgICAgZGVsIGYKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJhYmN4eHgiKQorCisgICAgZGVmIHRlc3RfdW5ib3VuZGVkX2ZpbGUoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzExNzQ2MDY6IHJlYWRpbmcgZnJvbSBhbiB1bmJvdW5kZWQgc3RyZWFtIHN1Y2ggYXMgL2Rldi96ZXJvLgorICAgICAgICB6ZXJvID0gIi9kZXYvemVybyIKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHplcm8pOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiezB9IGRvZXMgbm90IGV4aXN0Ii5mb3JtYXQoemVybykpCisgICAgICAgIGlmIHN5cy5tYXhzaXplID4gMHg3RkZGRkZGRjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInRlc3QgY2FuIG9ubHkgcnVuIGluIGEgMzItYml0IGFkZHJlc3Mgc3BhY2UiKQorICAgICAgICBpZiBzdXBwb3J0LnJlYWxfbWF4X21lbXVzZSA8IHN1cHBvcnQuXzJHOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGVzdCByZXF1aXJlcyBhdCBsZWFzdCAyR0Igb2YgbWVtb3J5IikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oemVybywgInJiIiwgYnVmZmVyaW5nPTApIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmLnJlYWQpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHplcm8sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmLnJlYWQpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHplcm8sICJyIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGYucmVhZCkKKworICAgIGRlZiB0ZXN0X2ZsdXNoX2Vycm9yX29uX2Nsb3NlKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiLCBidWZmZXJpbmc9MCkKKyAgICAgICAgZGVmIGJhZF9mbHVzaCgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigpCisgICAgICAgIGYuZmx1c2ggPSBiYWRfZmx1c2gKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZi5jbG9zZSkgIyBleGNlcHRpb24gbm90IHN3YWxsb3dlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9tdWx0aV9jbG9zZShzZWxmKToKKyAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIiwgYnVmZmVyaW5nPTApCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYuZmx1c2gpCisKKyAgICBkZWYgdGVzdF9SYXdJT0Jhc2VfcmVhZChzZWxmKToKKyAgICAgICAgIyBFeGVyY2lzZSB0aGUgZGVmYXVsdCBSYXdJT0Jhc2UucmVhZCgpIGltcGxlbWVudGF0aW9uICh3aGljaCBjYWxscworICAgICAgICAjIHJlYWRpbnRvKCkgaW50ZXJuYWxseSkuCisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU9XaXRob3V0UmVhZCgoYiJhYmMiLCBiImQiLCBOb25lLCBiImVmZyIsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWQoMiksIGIiYWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWQoMiksIGIiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8ucmVhZCgyKSwgYiJkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5yZWFkKDIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWQoMiksIGIiZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLnJlYWQoMiksIGIiZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8ucmVhZCgyKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5yZWFkKDIpLCBiIiIpCisKKyAgICBkZWYgdGVzdF9maWxlaW9fY2xvc2VmZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNDg0MQorICAgICAgICB3aXRoIHNlbGYub3BlbihfX2ZpbGVfXywgJ3JiJykgYXMgZjEsIFwKKyAgICAgICAgICAgICBzZWxmLm9wZW4oX19maWxlX18sICdyYicpIGFzIGYyOgorICAgICAgICAgICAgZmlsZWlvID0gc2VsZi5GaWxlSU8oZjEuZmlsZW5vKCksIGNsb3NlZmQ9RmFsc2UpCisgICAgICAgICAgICAjIC5fX2luaXRfXygpIG11c3Qgbm90IGNsb3NlIGYxCisgICAgICAgICAgICBmaWxlaW8uX19pbml0X18oZjIuZmlsZW5vKCksIGNsb3NlZmQ9RmFsc2UpCisgICAgICAgICAgICBmMS5yZWFkbGluZSgpCisgICAgICAgICAgICAjIC5jbG9zZSgpIG11c3Qgbm90IGNsb3NlIGYyCisgICAgICAgICAgICBmaWxlaW8uY2xvc2UoKQorICAgICAgICAgICAgZjIucmVhZGxpbmUoKQorCisKK2NsYXNzIENJT1Rlc3QoSU9UZXN0KToKKworICAgIGRlZiB0ZXN0X0lPQmFzZV9maW5hbGl6ZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTIxNDk6IHNlZ21lbnRhdGlvbiBmYXVsdCBvbiBfUHlJT0Jhc2VfZmluYWxpemUgd2hlbiBib3RoIGEKKyAgICAgICAgIyBjbGFzcyB3aGljaCBpbmhlcml0cyBJT0Jhc2UgYW5kIGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIGFyZSBjYXVnaHQKKyAgICAgICAgIyBpbiBhIHJlZmVyZW5jZSBjeWNsZSBhbmQgY2xvc2UoKSBpcyBhbHJlYWR5IGluIHRoZSBtZXRob2QgY2FjaGUuCisgICAgICAgIGNsYXNzIE15SU8oc2VsZi5JT0Jhc2UpOgorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIGNyZWF0ZSBhbiBpbnN0YW5jZSB0byBwb3B1bGF0ZSB0aGUgbWV0aG9kIGNhY2hlCisgICAgICAgIE15SU8oKQorICAgICAgICBvYmogPSBNeUlPKCkKKyAgICAgICAgb2JqLm9iaiA9IG9iagorICAgICAgICB3ciA9IHdlYWtyZWYucmVmKG9iaikKKyAgICAgICAgZGVsIE15SU8KKyAgICAgICAgZGVsIG9iagorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKKworY2xhc3MgUHlJT1Rlc3QoSU9UZXN0KToKKyAgICB0ZXN0X2FycmF5X3dyaXRlcyA9IHVuaXR0ZXN0LnNraXAoCisgICAgICAgICJsZW4oYXJyYXkuYXJyYXkpIHJldHVybnMgbnVtYmVyIG9mIGVsZW1lbnRzIHJhdGhlciB0aGFuIGJ5dGVsZW5ndGgiCisgICAgKShJT1Rlc3QudGVzdF9hcnJheV93cml0ZXMpCisKKworY2xhc3MgQ29tbW9uQnVmZmVyZWRUZXN0czoKKyAgICAjIFRlc3RzIGNvbW1vbiB0byBCdWZmZXJlZFJlYWRlciwgQnVmZmVyZWRXcml0ZXIgYW5kIEJ1ZmZlcmVkUmFuZG9tCisKKyAgICBkZWYgdGVzdF9kZXRhY2goc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmID0gc2VsZi50cChyYXcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoYnVmLmRldGFjaCgpLCByYXcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1Zi5kZXRhY2gpCisKKyAgICBkZWYgdGVzdF9maWxlbm8oc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgYnVmaW8uZmlsZW5vKCkpCisKKyAgICBkZWYgdGVzdF9ub19maWxlbm8oc2VsZik6CisgICAgICAgICMgWFhYIHdpbGwgd2UgYWx3YXlzIGhhdmUgZmlsZW5vKCkgZnVuY3Rpb24/IElmIHNvLCBraWxsCisgICAgICAgICMgdGhpcyB0ZXN0LiBFbHNlLCB3cml0ZSBpdC4KKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfaW52YWxpZF9hcmdzKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICAjIEludmFsaWQgd2hlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLnNlZWssIDAsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5zZWVrLCAwLCAzKQorCisgICAgZGVmIHRlc3Rfb3ZlcnJpZGVfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgdHAgPSBzZWxmLnRwCisgICAgICAgIHJlY29yZCA9IFtdCisgICAgICAgIGNsYXNzIE15QnVmZmVyZWRJTyh0cCk6CisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDEpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmID0gc3VwZXIoTXlCdWZmZXJlZElPLCBzZWxmKS5fX2RlbF9fCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZigpCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgyKQorICAgICAgICAgICAgICAgIHN1cGVyKE15QnVmZmVyZWRJTywgc2VsZikuY2xvc2UoKQorICAgICAgICAgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMykKKyAgICAgICAgICAgICAgICBzdXBlcihNeUJ1ZmZlcmVkSU8sIHNlbGYpLmZsdXNoKCkKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gTXlCdWZmZXJlZElPKHJhd2lvKQorICAgICAgICB3cml0YWJsZSA9IGJ1ZmlvLndyaXRhYmxlKCkKKyAgICAgICAgZGVsIGJ1ZmlvCisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIGlmIHdyaXRhYmxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFsxLCAyLCAzXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLCBbMSwgMl0pCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXIoc2VsZik6CisgICAgICAgICMgVGVzdCB1c2FiaWxpdHkgYXMgYSBjb250ZXh0IG1hbmFnZXIKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgZGVmIF93aXRoKCk6CisgICAgICAgICAgICB3aXRoIGJ1ZmlvOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgX3dpdGgoKQorICAgICAgICAjIGJ1ZmlvIHNob3VsZCBub3cgYmUgY2xvc2VkLCBhbmQgdXNpbmcgaXQgYSBzZWNvbmQgdGltZSBzaG91bGQgcmFpc2UKKyAgICAgICAgIyBhIFZhbHVlRXJyb3IuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIF93aXRoKQorCisgICAgZGVmIHRlc3RfZXJyb3JfdGhyb3VnaF9kZXN0cnVjdG9yKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB0aGUgZXhjZXB0aW9uIHN0YXRlIGlzIG5vdCBtb2RpZmllZCBieSBhIGRlc3RydWN0b3IsCisgICAgICAgICMgZXZlbiBpZiBjbG9zZSgpIGZhaWxzLgorICAgICAgICByYXdpbyA9IHNlbGYuQ2xvc2VGYWlsdXJlSU8oKQorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgc2VsZi50cChyYXdpbykueHl6enkKKyAgICAgICAgd2l0aCBzdXBwb3J0LmNhcHR1cmVkX291dHB1dCgic3RkZXJyIikgYXMgczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmKQorICAgICAgICBzID0gcy5nZXR2YWx1ZSgpLnN0cmlwKCkKKyAgICAgICAgaWYgczoKKyAgICAgICAgICAgICMgVGhlIGRlc3RydWN0b3IgKm1heSogaGF2ZSBwcmludGVkIGFuIHVucmFpc2FibGUgZXJyb3IsIGNoZWNrIGl0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzLnNwbGl0bGluZXMoKSksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCJFeGNlcHRpb24gSU9FcnJvcjogIiksIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aCgiIGlnbm9yZWQiKSwgcykKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYiA9IHNlbGYudHAocmF3KQorICAgICAgICBjbHNuYW1lID0gIiVzLiVzIiAlIChzZWxmLnRwLl9fbW9kdWxlX18sIHNlbGYudHAuX19uYW1lX18pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihiKSwgIjwlcz4iICUgY2xzbmFtZSkKKyAgICAgICAgcmF3Lm5hbWUgPSAiZHVtbXkiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihiKSwgIjwlcyBuYW1lPXUnZHVtbXknPiIgJSBjbHNuYW1lKQorICAgICAgICByYXcubmFtZSA9IGIiZHVtbXkiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihiKSwgIjwlcyBuYW1lPSdkdW1teSc+IiAlIGNsc25hbWUpCisKKyAgICBkZWYgdGVzdF9mbHVzaF9lcnJvcl9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBkZWYgYmFkX2ZsdXNoKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCkKKyAgICAgICAgcmF3LmZsdXNoID0gYmFkX2ZsdXNoCisgICAgICAgIGIgPSBzZWxmLnRwKHJhdykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgYi5jbG9zZSkgIyBleGNlcHRpb24gbm90IHN3YWxsb3dlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoYi5jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9jbG9zZV9lcnJvcl9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBkZWYgYmFkX2ZsdXNoKCk6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yKCdmbHVzaCcpCisgICAgICAgIGRlZiBiYWRfY2xvc2UoKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2Nsb3NlJykKKyAgICAgICAgcmF3LmNsb3NlID0gYmFkX2Nsb3NlCisgICAgICAgIGIgPSBzZWxmLnRwKHJhdykKKyAgICAgICAgYi5mbHVzaCA9IGJhZF9mbHVzaAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IpIGFzIGVycjogIyBleGNlcHRpb24gbm90IHN3YWxsb3dlZAorICAgICAgICAgICAgYi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmV4Y2VwdGlvbi5hcmdzLCAoJ2Nsb3NlJywpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIuY2xvc2VkKQorCisgICAgZGVmIHRlc3RfbXVsdGlfY2xvc2Uoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYiA9IHNlbGYudHAocmF3KQorICAgICAgICBiLmNsb3NlKCkKKyAgICAgICAgYi5jbG9zZSgpCisgICAgICAgIGIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBiLmZsdXNoKQorCisgICAgZGVmIHRlc3RfcmVhZG9ubHlfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWYgPSBzZWxmLnRwKHJhdykKKyAgICAgICAgeCA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcikpOgorICAgICAgICAgICAgYnVmLnJhdyA9IHgKKworCitjbGFzcyBTaXplb2ZUZXN0OgorCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mKHNlbGYpOgorICAgICAgICBidWZzaXplMSA9IDQwOTYKKyAgICAgICAgYnVmc2l6ZTIgPSA4MTkyCisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8sIGJ1ZmZlcl9zaXplPWJ1ZnNpemUxKQorICAgICAgICBzaXplID0gc3lzLmdldHNpemVvZihidWZpbykgLSBidWZzaXplMQorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvLCBidWZmZXJfc2l6ZT1idWZzaXplMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0c2l6ZW9mKGJ1ZmlvKSwgc2l6ZSArIGJ1ZnNpemUyKQorCisKK2NsYXNzIEJ1ZmZlcmVkUmVhZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgQ29tbW9uQnVmZmVyZWRUZXN0cyk6CisgICAgcmVhZF9tb2RlID0gInJiIgorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oW2IiYWJjIl0pCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgYnVmaW8uX19pbml0X18ocmF3aW8pCisgICAgICAgIGJ1ZmlvLl9faW5pdF9fKHJhd2lvLCBidWZmZXJfc2l6ZT0xMDI0KQorICAgICAgICBidWZpby5fX2luaXRfXyhyYXdpbywgYnVmZmVyX3NpemU9MTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmMiLCBidWZpby5yZWFkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uX19pbml0X18sIHJhd2lvLCBidWZmZXJfc2l6ZT0tMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9LTEpCisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oW2IiYWJjIl0pCisgICAgICAgIGJ1ZmlvLl9faW5pdF9fKHJhd2lvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiwgYnVmaW8ucmVhZCgpKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgZm9yIGFyZyBpbiAoTm9uZSwgNyk6CisgICAgICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKChiImFiYyIsIGIiZCIsIGIiZWZnIikpCisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjZGVmZyIsIGJ1ZmlvLnJlYWQoYXJnKSkKKyAgICAgICAgIyBJbnZhbGlkIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8ucmVhZCwgLTIpCisKKyAgICBkZWYgdGVzdF9yZWFkMShzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygoYiJhYmMiLCBiImQiLCBiImVmZyIpKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhIiwgYnVmaW8ucmVhZCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImIiLCBidWZpby5yZWFkMSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5fcmVhZHMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJjIiwgYnVmaW8ucmVhZDEoMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5fcmVhZHMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJkIiwgYnVmaW8ucmVhZDEoMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5fcmVhZHMsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJlZmciLCBidWZpby5yZWFkMSgxMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhd2lvLl9yZWFkcywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIiIsIGJ1ZmlvLnJlYWQxKDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3aW8uX3JlYWRzLCA0KQorICAgICAgICAjIEludmFsaWQgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5yZWFkMSwgLTEpCisKKyAgICBkZWYgdGVzdF9yZWFkaW50byhzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygoYiJhYmMiLCBiImQiLCBiImVmZyIpKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgIGIgPSBieXRlYXJyYXkoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby5yZWFkaW50byhiKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiImFiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby5yZWFkaW50byhiKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiImNkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby5yZWFkaW50byhiKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiImVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby5yZWFkaW50byhiKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiImdmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby5yZWFkaW50byhiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiImdmIikKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgZGVmIGJ1ZmlvKCk6CisgICAgICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKChiImFiY1xuIiwgYiJkXG4iLCBiImVmIikpCisgICAgICAgICAgICByZXR1cm4gc2VsZi50cChyYXdpbykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpbygpLnJlYWRsaW5lcygpLCBbYiJhYmNcbiIsIGIiZFxuIiwgYiJlZiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvKCkucmVhZGxpbmVzKDUpLCBbYiJhYmNcbiIsIGIiZFxuIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8oKS5yZWFkbGluZXMoTm9uZSksIFtiImFiY1xuIiwgYiJkXG4iLCBiImVmIl0pCisKKyAgICBkZWYgdGVzdF9idWZmZXJpbmcoc2VsZik6CisgICAgICAgIGRhdGEgPSBiImFiY2RlZmdoaSIKKyAgICAgICAgZGxlbiA9IGxlbihkYXRhKQorCisgICAgICAgIHRlc3RzID0gWworICAgICAgICAgICAgWyAxMDAsIFsgMywgMSwgNCwgOCBdLCBbIGRsZW4sIDAgXSBdLAorICAgICAgICAgICAgWyAxMDAsIFsgMywgMywgM10sICAgICBbIGRsZW4gXSAgICBdLAorICAgICAgICAgICAgWyAgIDQsIFsgMSwgMiwgNCwgMiBdLCBbIDQsIDQsIDEgXSBdLAorICAgICAgICBdCisKKyAgICAgICAgZm9yIGJ1ZnNpemUsIGJ1Zl9yZWFkX3NpemVzLCByYXdfcmVhZF9zaXplcyBpbiB0ZXN0czoKKyAgICAgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrRmlsZUlPKGRhdGEpCisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8sIGJ1ZmZlcl9zaXplPWJ1ZnNpemUpCisgICAgICAgICAgICBwb3MgPSAwCisgICAgICAgICAgICBmb3IgbmJ5dGVzIGluIGJ1Zl9yZWFkX3NpemVzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ucmVhZChuYnl0ZXMpLCBkYXRhW3Bvczpwb3MrbmJ5dGVzXSkKKyAgICAgICAgICAgICAgICBwb3MgKz0gbmJ5dGVzCisgICAgICAgICAgICAjIHRoaXMgaXMgbWlsZGx5IGltcGxlbWVudGF0aW9uLWRlcGVuZGVudAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5yZWFkX2hpc3RvcnksIHJhd19yZWFkX3NpemVzKQorCisgICAgZGVmIHRlc3RfcmVhZF9ub25fYmxvY2tpbmcoc2VsZik6CisgICAgICAgICMgSW5qZWN0IHNvbWUgTm9uZSdzIGluIHRoZXJlIHRvIHNpbXVsYXRlIEVXT1VMREJMT0NLCisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKGIiYWJjIiwgYiJkIiwgTm9uZSwgYiJlZmciLCBOb25lLCBOb25lLCBOb25lKSkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjZCIsIGJ1ZmlvLnJlYWQoNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJlIiwgYnVmaW8ucmVhZCgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImZnIiwgYnVmaW8ucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiIiwgYnVmaW8ucGVlaygxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoYnVmaW8ucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiIiwgYnVmaW8ucmVhZCgpKQorCisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKGIiYSIsIE5vbmUsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYSIsIHJhd2lvLnJlYWRhbGwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmF3aW8ucmVhZGFsbCgpKQorCisgICAgZGVmIHRlc3RfcmVhZF9wYXN0X2VvZihzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygoYiJhYmMiLCBiImQiLCBiImVmZyIpKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFiY2RlZmciLCBidWZpby5yZWFkKDkwMDApKQorCisgICAgZGVmIHRlc3RfcmVhZF9hbGwoc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKGIiYWJjIiwgYiJkIiwgYiJlZmciKSkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJhYmNkZWZnIiwgYnVmaW8ucmVhZCgpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBAc3VwcG9ydC5yZXF1aXJlc19yZXNvdXJjZSgnY3B1JykKKyAgICBkZWYgdGVzdF90aHJlYWRzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFdyaXRlIG91dCBtYW55IGJ5dGVzIHdpdGggZXhhY3RseSB0aGUgc2FtZSBudW1iZXIgb2YgMCdzLAorICAgICAgICAgICAgIyAxJ3MuLi4gMjU1J3MuIFRoaXMgd2lsbCBoZWxwIHVzIGNoZWNrIHRoYXQgY29uY3VycmVudCByZWFkaW5nCisgICAgICAgICAgICAjIGRvZXNuJ3QgZHVwbGljYXRlIG9yIGZvcmdldCBjb250ZW50cy4KKyAgICAgICAgICAgIE4gPSAxMDAwCisgICAgICAgICAgICBsID0gbGlzdChyYW5nZSgyNTYpKSAqIE4KKyAgICAgICAgICAgIHJhbmRvbS5zaHVmZmxlKGwpCisgICAgICAgICAgICBzID0gYnl0ZXMoYnl0ZWFycmF5KGwpKQorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZShzKQorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sIHNlbGYucmVhZF9tb2RlLCBidWZmZXJpbmc9MCkgYXMgcmF3OgorICAgICAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXcsIDgpCisgICAgICAgICAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEludHJhLWJ1ZmZlciByZWFkIHRoZW4gYnVmZmVyLWZsdXNoaW5nIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBuIGluIGN5Y2xlKFsxLCAxOV0pOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBidWZpby5yZWFkKG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsaXN0LmFwcGVuZCgpIGlzIGF0b21pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHMpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgdGhyZWFkcyA9IFt0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1mKSBmb3IgeCBpbiByYW5nZSgyMCldCisgICAgICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAyKSAjIHlpZWxkCisgICAgICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgInRoZSBmb2xsb3dpbmcgZXhjZXB0aW9ucyB3ZXJlIGNhdWdodDogJXIiICUgZXJyb3JzKQorICAgICAgICAgICAgICAgIHMgPSBiJycuam9pbihyZXN1bHRzKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICAgICAgICAgIGMgPSBieXRlcyhieXRlYXJyYXkoW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KGMpLCBOKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9taXNiZWhhdmVkX2lvKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTWlzYmVoYXZlZFJhd0lPKChiImFiYyIsIGIiZCIsIGIiZWZnIikpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgYnVmaW8uc2VlaywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgYnVmaW8udGVsbCkKKworICAgIGRlZiB0ZXN0X25vX2V4dHJhbmVvdXNfcmVhZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjOTU1MDsgd2hlbiB0aGUgcmF3IElPIG9iamVjdCBoYXMgc2F0aXNmaWVkIHRoZSByZWFkIHJlcXVlc3QsCisgICAgICAgICMgd2Ugc2hvdWxkIG5vdCBpc3N1ZSBhbnkgYWRkaXRpb25hbCByZWFkcywgb3RoZXJ3aXNlIGl0IG1heSBibG9jaworICAgICAgICAjIChlLmcuIHNvY2tldCkuCisgICAgICAgIGJ1ZnNpemUgPSAxNgorICAgICAgICBmb3IgbiBpbiAoMiwgYnVmc2l6ZSAtIDEsIGJ1ZnNpemUsIGJ1ZnNpemUgKyAxLCBidWZzaXplICogMik6CisgICAgICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKFtiIngiICogbl0pCisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8sIGJ1ZnNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWQobiksIGIieCIgKiBuKQorICAgICAgICAgICAgIyBTaW1wbGUgY2FzZTogb25lIHJhdyByZWFkIGlzIGVub3VnaCB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5fZXh0cmFuZW91c19yZWFkcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCBmb3Ige306IHt9ICE9IDAiLmZvcm1hdChuLCByYXdpby5fZXh0cmFuZW91c19yZWFkcykpCisgICAgICAgICAgICAjIEEgbW9yZSBjb21wbGV4IGNhc2Ugd2hlcmUgdHdvIHJhdyByZWFkcyBhcmUgbmVlZGVkIHRvIHNhdGlzZnkKKyAgICAgICAgICAgICMgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKFtiIngiICogKG4gLSAxKSwgYiJ4Il0pCisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8sIGJ1ZnNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWQobiksIGIieCIgKiBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXdpby5fZXh0cmFuZW91c19yZWFkcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCBmb3Ige306IHt9ICE9IDAiLmZvcm1hdChuLCByYXdpby5fZXh0cmFuZW91c19yZWFkcykpCisKKworY2xhc3MgQ0J1ZmZlcmVkUmVhZGVyVGVzdChCdWZmZXJlZFJlYWRlclRlc3QsIFNpemVvZlRlc3QpOgorICAgIHRwID0gaW8uQnVmZmVyZWRSZWFkZXIKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBCdWZmZXJlZFJlYWRlclRlc3QudGVzdF9jb25zdHJ1Y3RvcihzZWxmKQorICAgICAgICAjIFRoZSBhbGxvY2F0aW9uIGNhbiBzdWNjZWVkIG9uIDMyLWJpdCBidWlsZHMsIGUuZy4gd2l0aCBtb3JlCisgICAgICAgICMgdGhhbiAyR0IgUkFNIGFuZCBhIDY0LWJpdCBrZXJuZWwuCisgICAgICAgIGlmIHN5cy5tYXhzaXplID4gMHg3RkZGRkZGRjoKKyAgICAgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIE1lbW9yeUVycm9yLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgICAgICAgICBidWZpby5fX2luaXRfXywgcmF3aW8sIHN5cy5tYXhzaXplKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6YXRpb24oc2VsZik6CisgICAgICAgIHJhd2lvID0gc2VsZi5Nb2NrUmF3SU8oW2IiYWJjIl0pCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uX19pbml0X18sIHJhd2lvLCBidWZmZXJfc2l6ZT0wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5yZWFkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPS0xNikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8ucmVhZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8uX19pbml0X18sIHJhd2lvLCBidWZmZXJfc2l6ZT0tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYnVmaW8ucmVhZCkKKworICAgIGRlZiB0ZXN0X21pc2JlaGF2ZWRfaW9fcmVhZChzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1pc2JlaGF2ZWRSYXdJTygoYiJhYmMiLCBiImQiLCBiImVmZyIpKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgICMgX3B5aW8uQnVmZmVyZWRSZWFkZXIgc2VlbXMgdG8gaW1wbGVtZW50IHJlYWRpbmcgZGlmZmVyZW50LCBzbyB0aGF0CisgICAgICAgICMgY2hlY2tpbmcgdGhpcyBpcyBub3Qgc28gZWFzeS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgYnVmaW8ucmVhZCwgMTApCisKKyAgICBkZWYgdGVzdF9nYXJiYWdlX2NvbGxlY3Rpb24oc2VsZik6CisgICAgICAgICMgQyBCdWZmZXJlZFJlYWRlciBvYmplY3RzIGFyZSBjb2xsZWN0ZWQuCisgICAgICAgICMgVGhlIFB5dGhvbiB2ZXJzaW9uIGhhcyBfX2RlbF9fLCBzbyBpdCBlbmRzIGludG8gZ2MuZ2FyYmFnZSBpbnN0ZWFkCisgICAgICAgIHJhd2lvID0gc2VsZi5GaWxlSU8oc3VwcG9ydC5URVNURk4sICJ3K2IiKQorICAgICAgICBmID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgZi5mID0gZgorICAgICAgICB3ciA9IHdlYWtyZWYucmVmKGYpCisgICAgICAgIGRlbCBmCisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKQorCisgICAgZGVmIHRlc3RfYXJnc19lcnJvcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTcyNzUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsICJCdWZmZXJlZFJlYWRlciIpOgorICAgICAgICAgICAgc2VsZi50cChpby5CeXRlc0lPKCksIDEwMjQsIDEwMjQsIDEwMjQpCisKKworY2xhc3MgUHlCdWZmZXJlZFJlYWRlclRlc3QoQnVmZmVyZWRSZWFkZXJUZXN0KToKKyAgICB0cCA9IHB5aW8uQnVmZmVyZWRSZWFkZXIKKworCitjbGFzcyBCdWZmZXJlZFdyaXRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UsIENvbW1vbkJ1ZmZlcmVkVGVzdHMpOgorICAgIHdyaXRlX21vZGUgPSAid2IiCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgYnVmaW8uX19pbml0X18ocmF3aW8pCisgICAgICAgIGJ1ZmlvLl9faW5pdF9fKHJhd2lvLCBidWZmZXJfc2l6ZT0xMDI0KQorICAgICAgICBidWZpby5fX2luaXRfXyhyYXdpbywgYnVmZmVyX3NpemU9MTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgYnVmaW8ud3JpdGUoYiJhYmMiKSkKKyAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9LTE2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPS0xKQorICAgICAgICBidWZpby5fX2luaXRfXyhyYXdpbykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBidWZpby53cml0ZShiImdoaSIpKQorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiIiLmpvaW4ocmF3aW8uX3dyaXRlX3N0YWNrKSwgYiJhYmNnaGkiKQorCisgICAgZGVmIHRlc3RfZGV0YWNoX2ZsdXNoKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZiA9IHNlbGYudHAocmF3KQorICAgICAgICBidWYud3JpdGUoYiJob3dkeSEiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJhdy5fd3JpdGVfc3RhY2spCisgICAgICAgIGJ1Zi5kZXRhY2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhdy5fd3JpdGVfc3RhY2ssIFtiImhvd2R5ISJdKQorCisgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CisgICAgICAgICMgV3JpdGUgdG8gdGhlIGJ1ZmZlcmVkIElPIGJ1dCBkb24ndCBvdmVyZmxvdyB0aGUgYnVmZmVyLgorICAgICAgICB3cml0ZXIgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cCh3cml0ZXIsIDgpCisgICAgICAgIGJ1ZmlvLndyaXRlKGIiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh3cml0ZXIuX3dyaXRlX3N0YWNrKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfb3ZlcmZsb3coc2VsZik6CisgICAgICAgIHdyaXRlciA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHdyaXRlciwgOCkKKyAgICAgICAgY29udGVudHMgPSBiImFiY2RlZmdoaWprbG1ub3AiCisgICAgICAgIGZvciBuIGluIHJhbmdlKDAsIGxlbihjb250ZW50cyksIDMpOgorICAgICAgICAgICAgYnVmaW8ud3JpdGUoY29udGVudHNbbjpuKzNdKQorICAgICAgICBmbHVzaGVkID0gYiIiLmpvaW4od3JpdGVyLl93cml0ZV9zdGFjaykKKyAgICAgICAgIyBBdCBsZWFzdCAodG90YWwgLSA4KSBieXRlcyB3ZXJlIGltcGxpY2l0bHkgZmx1c2hlZCwgcGVyaGFwcyBtb3JlCisgICAgICAgICMgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsdXNoZWQuc3RhcnRzd2l0aChjb250ZW50c1s6LThdKSwgZmx1c2hlZCkKKworICAgIGRlZiBjaGVja193cml0ZXMoc2VsZiwgaW50ZXJtZWRpYXRlX2Z1bmMpOgorICAgICAgICAjIExvdHMgb2Ygd3JpdGVzLCB0ZXN0IHRoZSBmbHVzaGVkIG91dHB1dCBpcyBhcyBleHBlY3RlZC4KKyAgICAgICAgY29udGVudHMgPSBieXRlcyhyYW5nZSgyNTYpKSAqIDEwMDAKKyAgICAgICAgbiA9IDAKKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCAxMykKKyAgICAgICAgIyBHZW5lcmF0b3Igb2Ygd3JpdGUgc2l6ZXM6IHJlcGVhdCBlYWNoIE4gMTUgdGltZXMgdGhlbiBwcm9jZWVkIHRvIE4rMQorICAgICAgICBkZWYgZ2VuX3NpemVzKCk6CisgICAgICAgICAgICBmb3Igc2l6ZSBpbiBjb3VudCgxKToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxNSk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNpemUKKyAgICAgICAgc2l6ZXMgPSBnZW5fc2l6ZXMoKQorICAgICAgICB3aGlsZSBuIDwgbGVuKGNvbnRlbnRzKToKKyAgICAgICAgICAgIHNpemUgPSBtaW4obmV4dChzaXplcyksIGxlbihjb250ZW50cykgLSBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby53cml0ZShjb250ZW50c1tuOm4rc2l6ZV0pLCBzaXplKQorICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2Z1bmMoYnVmaW8pCisgICAgICAgICAgICBuICs9IHNpemUKKyAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLAorICAgICAgICAgICAgYiIiLmpvaW4od3JpdGVyLl93cml0ZV9zdGFjaykpCisKKyAgICBkZWYgdGVzdF93cml0ZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfd3JpdGVzKGxhbWJkYSBidWZpbzogTm9uZSkKKworICAgIGRlZiB0ZXN0X3dyaXRlc19hbmRfZmx1c2hlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMobGFtYmRhIGJ1ZmlvOiBidWZpby5mbHVzaCgpKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzX2FuZF9zZWVrcyhzZWxmKToKKyAgICAgICAgZGVmIF9zZWVrYWJzKGJ1ZmlvKToKKyAgICAgICAgICAgIHBvcyA9IGJ1ZmlvLnRlbGwoKQorICAgICAgICAgICAgYnVmaW8uc2Vlayhwb3MgKyAxLCAwKQorICAgICAgICAgICAgYnVmaW8uc2Vlayhwb3MgLSAxLCAwKQorICAgICAgICAgICAgYnVmaW8uc2Vlayhwb3MsIDApCisgICAgICAgIHNlbGYuY2hlY2tfd3JpdGVzKF9zZWVrYWJzKQorICAgICAgICBkZWYgX3NlZWtyZWwoYnVmaW8pOgorICAgICAgICAgICAgcG9zID0gYnVmaW8uc2VlaygwLCAxKQorICAgICAgICAgICAgYnVmaW8uc2VlaygrMSwgMSkKKyAgICAgICAgICAgIGJ1ZmlvLnNlZWsoLTEsIDEpCisgICAgICAgICAgICBidWZpby5zZWVrKHBvcywgMCkKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMoX3NlZWtyZWwpCisKKyAgICBkZWYgdGVzdF93cml0ZXNfYW5kX3RydW5jYXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMobGFtYmRhIGJ1ZmlvOiBidWZpby50cnVuY2F0ZShidWZpby50ZWxsKCkpKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfbm9uX2Jsb2NraW5nKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLk1vY2tOb25CbG9ja1dyaXRlcklPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdywgOCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGIiYWJjZCIpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGIiZWZnaGkiKSwgNSkKKyAgICAgICAgIyAxIGJ5dGUgd2lsbCBiZSB3cml0dGVuLCB0aGUgcmVzdCB3aWxsIGJlIGJ1ZmZlcmVkCisgICAgICAgIHJhdy5ibG9ja19vbihiImsiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGIiamtsbW4iKSwgNSkKKworICAgICAgICAjIDggYnl0ZXMgd2lsbCBiZSB3cml0dGVuLCA4IHdpbGwgYmUgYnVmZmVyZWQgYW5kIHRoZSByZXN0IHdpbGwgYmUgbG9zdAorICAgICAgICByYXcuYmxvY2tfb24oYiIwIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYnVmaW8ud3JpdGUoYiJvcHFyd3h5ejAxMjM0NTY3ODkiKQorICAgICAgICBleGNlcHQgc2VsZi5CbG9ja2luZ0lPRXJyb3IgYXMgZToKKyAgICAgICAgICAgIHdyaXR0ZW4gPSBlLmNoYXJhY3RlcnNfd3JpdHRlbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJCbG9ja2luZ0lPRXJyb3Igc2hvdWxkIGhhdmUgYmVlbiByYWlzZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXR0ZW4sIDE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhdy5wb3Bfd3JpdHRlbigpLAorICAgICAgICAgICAgYiJhYmNkZWZnaGlqa2xtbm9wcXJ3eHl6IikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGIiQUJDREVGR0hJIiksIDkpCisgICAgICAgIHMgPSByYXcucG9wX3dyaXR0ZW4oKQorICAgICAgICAjIFByZXZpb3VzbHkgYnVmZmVyZWQgYnl0ZXMgd2VyZSBmbHVzaGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoYiIwMTIzNDU2N0EiKSwgcykKKworICAgIGRlZiB0ZXN0X3dyaXRlX2FuZF9yZXdpbmQoc2VsZik6CisgICAgICAgIHJhdyA9IGlvLkJ5dGVzSU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3LCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLndyaXRlKGIiYWJjZGVmIiksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udGVsbCgpLCA2KQorICAgICAgICBidWZpby5zZWVrKDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ud3JpdGUoYiJYWSIpLCAyKQorICAgICAgICBidWZpby5zZWVrKDYsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmdldHZhbHVlKCksIGIiWFljZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZpby53cml0ZShiIjEyMzQ1NiIpLCA2KQorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmdldHZhbHVlKCksIGIiWFljZGVmMTIzNDU2IikKKworICAgIGRlZiB0ZXN0X2ZsdXNoKHNlbGYpOgorICAgICAgICB3cml0ZXIgPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cCh3cml0ZXIsIDgpCisgICAgICAgIGJ1ZmlvLndyaXRlKGIiYWJjIikKKyAgICAgICAgYnVmaW8uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiwgd3JpdGVyLl93cml0ZV9zdGFja1swXSkKKworICAgIGRlZiB0ZXN0X3dyaXRlbGluZXMoc2VsZik6CisgICAgICAgIGwgPSBbYidhYicsIGInY2QnLCBiJ2VmJ10KKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBidWZpby53cml0ZWxpbmVzKGwpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycuam9pbih3cml0ZXIuX3dyaXRlX3N0YWNrKSwgYidhYmNkZWYnKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lc191c2VybGlzdChzZWxmKToKKyAgICAgICAgbCA9IFVzZXJMaXN0KFtiJ2FiJywgYidjZCcsIGInZWYnXSkKKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBidWZpby53cml0ZWxpbmVzKGwpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiJycuam9pbih3cml0ZXIuX3dyaXRlX3N0YWNrKSwgYidhYmNkZWYnKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lc19lcnJvcihzZWxmKToKKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ1ZmlvLndyaXRlbGluZXMsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBidWZpby53cml0ZWxpbmVzLCBOb25lKQorCisgICAgZGVmIHRlc3RfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgd3JpdGVyID0gc2VsZi5Nb2NrUmF3SU8oKQorICAgICAgICBidWZpbyA9IHNlbGYudHAod3JpdGVyLCA4KQorICAgICAgICBidWZpby53cml0ZShiImFiYyIpCisgICAgICAgIGRlbCBidWZpbworICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWJjIiwgd3JpdGVyLl93cml0ZV9zdGFja1swXSkKKworICAgIGRlZiB0ZXN0X3RydW5jYXRlKHNlbGYpOgorICAgICAgICAjIFRydW5jYXRlIGltcGxpY2l0bHkgZmx1c2hlcyB0aGUgYnVmZmVyLgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi53cml0ZV9tb2RlLCBidWZmZXJpbmc9MCkgYXMgcmF3OgorICAgICAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdywgOCkKKyAgICAgICAgICAgIGJ1ZmlvLndyaXRlKGIiYWJjZGVmIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udHJ1bmNhdGUoMyksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnRlbGwoKSwgNikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIsIGJ1ZmZlcmluZz0wKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJhYmMiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBAc3VwcG9ydC5yZXF1aXJlc19yZXNvdXJjZSgnY3B1JykKKyAgICBkZWYgdGVzdF90aHJlYWRzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFdyaXRlIG91dCBtYW55IGJ5dGVzIGZyb20gbWFueSB0aHJlYWRzIGFuZCB0ZXN0IHRoZXkgd2VyZQorICAgICAgICAgICAgIyBhbGwgZmx1c2hlZC4KKyAgICAgICAgICAgIE4gPSAxMDAwCisgICAgICAgICAgICBjb250ZW50cyA9IGJ5dGVzKHJhbmdlKDI1NikpICogTgorICAgICAgICAgICAgc2l6ZXMgPSBjeWNsZShbMSwgMTldKQorICAgICAgICAgICAgbiA9IDAKKyAgICAgICAgICAgIHF1ZXVlID0gZGVxdWUoKQorICAgICAgICAgICAgd2hpbGUgbiA8IGxlbihjb250ZW50cyk6CisgICAgICAgICAgICAgICAgc2l6ZSA9IG5leHQoc2l6ZXMpCisgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKGNvbnRlbnRzW246bitzaXplXSkKKyAgICAgICAgICAgICAgICBuICs9IHNpemUKKyAgICAgICAgICAgIGRlbCBjb250ZW50cworICAgICAgICAgICAgIyBXZSB1c2UgYSByZWFsIGZpbGUgb2JqZWN0IGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvCisgICAgICAgICAgICAjIGV4ZXJjaXNlIHNpdHVhdGlvbnMgd2hlcmUgdGhlIEdJTCBpcyByZWxlYXNlZCBiZWZvcmUKKyAgICAgICAgICAgICMgd3JpdGluZyB0aGUgYnVmZmVyIHRvIHRoZSByYXcgc3RyZWFtcy4gVGhpcyBpcyBpbiBhZGRpdGlvbgorICAgICAgICAgICAgIyB0byBjb25jdXJyZW5jeSBpc3N1ZXMgZHVlIHRvIHN3aXRjaGluZyB0aHJlYWRzIGluIHRoZSBtaWRkbGUKKyAgICAgICAgICAgICMgb2YgUHl0aG9uIGNvZGUuCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi53cml0ZV9tb2RlLCBidWZmZXJpbmc9MCkgYXMgcmF3OgorICAgICAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXcsIDgpCisgICAgICAgICAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHF1ZXVlLnBvcGxlZnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZpby53cml0ZShzKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKGUpCisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHRocmVhZHMgPSBbdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZikgZm9yIHggaW4gcmFuZ2UoMjApXQorICAgICAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMikgIyB5aWVsZAorICAgICAgICAgICAgICAgIGZvciB0IGluIHRocmVhZHM6CisgICAgICAgICAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShlcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICJ0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbnMgd2VyZSBjYXVnaHQ6ICVyIiAlIGVycm9ycykKKyAgICAgICAgICAgICAgICBidWZpby5jbG9zZSgpCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBzID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmNvdW50KGJ5dGVzKFtpXSkpLCBOKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9taXNiZWhhdmVkX2lvKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTWlzYmVoYXZlZFJhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBidWZpby5zZWVrLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBidWZpby50ZWxsKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBidWZpby53cml0ZSwgYiJhYmNkZWYiKQorCisgICAgZGVmIHRlc3RfbWF4X2J1ZmZlcl9zaXplX2RlcHJlY2F0aW9uKHNlbGYpOgorICAgICAgICB3aXRoIHN1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJtYXhfYnVmZmVyX3NpemUgaXMgZGVwcmVjYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIDgsIDEyKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfZXJyb3Jfb25fY2xvc2Uoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgZGVmIGJhZF93cml0ZShiKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoKQorICAgICAgICByYXcud3JpdGUgPSBiYWRfd3JpdGUKKyAgICAgICAgYiA9IHNlbGYudHAocmF3KQorICAgICAgICBiLndyaXRlKGInc3BhbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIGIuY2xvc2UpICMgZXhjZXB0aW9uIG5vdCBzd2FsbG93ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIuY2xvc2VkKQorCisKK2NsYXNzIENCdWZmZXJlZFdyaXRlclRlc3QoQnVmZmVyZWRXcml0ZXJUZXN0LCBTaXplb2ZUZXN0KToKKyAgICB0cCA9IGlvLkJ1ZmZlcmVkV3JpdGVyCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgQnVmZmVyZWRXcml0ZXJUZXN0LnRlc3RfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgIyBUaGUgYWxsb2NhdGlvbiBjYW4gc3VjY2VlZCBvbiAzMi1iaXQgYnVpbGRzLCBlLmcuIHdpdGggbW9yZQorICAgICAgICAjIHRoYW4gMkdCIFJBTSBhbmQgYSA2NC1iaXQga2VybmVsLgorICAgICAgICBpZiBzeXMubWF4c2l6ZSA+IDB4N0ZGRkZGRkY6CisgICAgICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXdpbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChPdmVyZmxvd0Vycm9yLCBNZW1vcnlFcnJvciwgVmFsdWVFcnJvciksCisgICAgICAgICAgICAgICAgYnVmaW8uX19pbml0X18sIHJhd2lvLCBzeXMubWF4c2l6ZSkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemF0aW9uKHNlbGYpOgorICAgICAgICByYXdpbyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhd2lvKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLndyaXRlLCBiImRlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgYnVmZmVyX3NpemU9LTE2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby53cml0ZSwgYiJkZWYiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby5fX2luaXRfXywgcmF3aW8sIGJ1ZmZlcl9zaXplPS0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBidWZpby53cml0ZSwgYiJkZWYiKQorCisgICAgZGVmIHRlc3RfZ2FyYmFnZV9jb2xsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIEMgQnVmZmVyZWRXcml0ZXIgb2JqZWN0cyBhcmUgY29sbGVjdGVkLCBhbmQgY29sbGVjdGluZyB0aGVtIGZsdXNoZXMKKyAgICAgICAgIyBhbGwgZGF0YSB0byBkaXNrLgorICAgICAgICAjIFRoZSBQeXRob24gdmVyc2lvbiBoYXMgX19kZWxfXywgc28gaXQgZW5kcyBpbnRvIGdjLmdhcmJhZ2UgaW5zdGVhZAorICAgICAgICByYXdpbyA9IHNlbGYuRmlsZUlPKHN1cHBvcnQuVEVTVEZOLCAidytiIikKKyAgICAgICAgZiA9IHNlbGYudHAocmF3aW8pCisgICAgICAgIGYud3JpdGUoYiIxMjN4eHgiKQorICAgICAgICBmLnggPSBmCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoZikKKyAgICAgICAgZGVsIGYKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiIxMjN4eHgiKQorCisgICAgZGVmIHRlc3RfYXJnc19lcnJvcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTcyNzUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsICJCdWZmZXJlZFdyaXRlciIpOgorICAgICAgICAgICAgc2VsZi50cChpby5CeXRlc0lPKCksIDEwMjQsIDEwMjQsIDEwMjQpCisKKworY2xhc3MgUHlCdWZmZXJlZFdyaXRlclRlc3QoQnVmZmVyZWRXcml0ZXJUZXN0KToKKyAgICB0cCA9IHB5aW8uQnVmZmVyZWRXcml0ZXIKKworY2xhc3MgQnVmZmVyZWRSV1BhaXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLk1vY2tSYXdJTygpLCBzZWxmLk1vY2tSYXdJTygpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhaXIuY2xvc2VkKQorCisgICAgZGVmIHRlc3RfZGV0YWNoKHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLk1vY2tSYXdJTygpLCBzZWxmLk1vY2tSYXdJTygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLlVuc3VwcG9ydGVkT3BlcmF0aW9uLCBwYWlyLmRldGFjaCkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX21heF9idWZmZXJfc2l6ZV9kZXByZWNhdGlvbihzZWxmKToKKyAgICAgICAgd2l0aCBzdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgibWF4X2J1ZmZlcl9zaXplIGlzIGRlcHJlY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgc2VsZi50cChzZWxmLk1vY2tSYXdJTygpLCBzZWxmLk1vY2tSYXdJTygpLCA4LCAxMikKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX3dpdGhfbm90X3JlYWRhYmxlKHNlbGYpOgorICAgICAgICBjbGFzcyBOb3RSZWFkYWJsZShNb2NrUmF3SU8pOgorICAgICAgICAgICAgZGVmIHJlYWRhYmxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYudHAsIE5vdFJlYWRhYmxlKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcl93aXRoX25vdF93cml0ZWFibGUoc2VsZik6CisgICAgICAgIGNsYXNzIE5vdFdyaXRlYWJsZShNb2NrUmF3SU8pOgorICAgICAgICAgICAgZGVmIHdyaXRhYmxlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHNlbGYudHAsIHNlbGYuTW9ja1Jhd0lPKCksIE5vdFdyaXRlYWJsZSgpKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5CeXRlc0lPKGIiYWJjZGVmIiksIHNlbGYuTW9ja1Jhd0lPKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWlyLnJlYWQoMyksIGIiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWlyLnJlYWQoMSksIGIiZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFpci5yZWFkKCksIGIiZWYiKQorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLkJ5dGVzSU8oYiJhYmMiKSwgc2VsZi5Nb2NrUmF3SU8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWlyLnJlYWQoTm9uZSksIGIiYWJjIikKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgcGFpciA9IGxhbWJkYTogc2VsZi50cChzZWxmLkJ5dGVzSU8oYiJhYmNcbmRlZlxuaCIpLCBzZWxmLk1vY2tSYXdJTygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIoKS5yZWFkbGluZXMoKSwgW2IiYWJjXG4iLCBiImRlZlxuIiwgYiJoIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFpcigpLnJlYWRsaW5lcygpLCBbYiJhYmNcbiIsIGIiZGVmXG4iLCBiImgiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWlyKCkucmVhZGxpbmVzKDUpLCBbYiJhYmNcbiIsIGIiZGVmXG4iXSkKKworICAgIGRlZiB0ZXN0X3JlYWQxKHNlbGYpOgorICAgICAgICAjIC5yZWFkMSgpIGlzIGRlbGVnYXRlZCB0byB0aGUgdW5kZXJseWluZyByZWFkZXIgb2JqZWN0LCBzbyB0aGlzIHRlc3QKKyAgICAgICAgIyBjYW4gYmUgc2hhbGxvdy4KKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5CeXRlc0lPKGIiYWJjZGVmIiksIHNlbGYuTW9ja1Jhd0lPKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYWlyLnJlYWQxKDMpLCBiImFiYyIpCisKKyAgICBkZWYgdGVzdF9yZWFkaW50byhzZWxmKToKKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5CeXRlc0lPKGIiYWJjZGVmIiksIHNlbGYuTW9ja1Jhd0lPKCkpCisKKyAgICAgICAgZGF0YSA9IGJ5dGVhcnJheSg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIucmVhZGludG8oZGF0YSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYiJhYmNkZSIpCisKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgdyA9IHNlbGYuTW9ja1Jhd0lPKCkKKyAgICAgICAgcGFpciA9IHNlbGYudHAoc2VsZi5Nb2NrUmF3SU8oKSwgdykKKworICAgICAgICBwYWlyLndyaXRlKGIiYWJjIikKKyAgICAgICAgcGFpci5mbHVzaCgpCisgICAgICAgIHBhaXIud3JpdGUoYiJkZWYiKQorICAgICAgICBwYWlyLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Ll93cml0ZV9zdGFjaywgW2IiYWJjIiwgYiJkZWYiXSkKKworICAgIGRlZiB0ZXN0X3BlZWsoc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuQnl0ZXNJTyhiImFiY2RlZiIpLCBzZWxmLk1vY2tSYXdJTygpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYWlyLnBlZWsoMykuc3RhcnRzd2l0aChiImFiYyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhaXIucmVhZCgzKSwgYiJhYmMiKQorCisgICAgZGVmIHRlc3RfcmVhZGFibGUoc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYWlyLnJlYWRhYmxlKCkpCisKKyAgICBkZWYgdGVzdF93cml0ZWFibGUoc2VsZik6CisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYWlyLndyaXRhYmxlKCkpCisKKyAgICBkZWYgdGVzdF9zZWVrYWJsZShzZWxmKToKKyAgICAgICAgIyBCdWZmZXJlZFJXUGFpcnMgYXJlIG5ldmVyIHNlZWthYmxlLCBldmVuIGlmIHRoZWlyIHJlYWRlcnMgYW5kIHdyaXRlcnMKKyAgICAgICAgIyBhcmUuCisgICAgICAgIHBhaXIgPSBzZWxmLnRwKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocGFpci5zZWVrYWJsZSgpKQorCisgICAgIyAuZmx1c2goKSBpcyBkZWxlZ2F0ZWQgdG8gdGhlIHVuZGVybHlpbmcgd3JpdGVyIG9iamVjdCBhbmQgaGFzIGJlZW4KKyAgICAjIHRlc3RlZCBpbiB0aGUgdGVzdF93cml0ZSBtZXRob2QuCisKKyAgICBkZWYgdGVzdF9jbG9zZV9hbmRfY2xvc2VkKHNlbGYpOgorICAgICAgICBwYWlyID0gc2VsZi50cChzZWxmLk1vY2tSYXdJTygpLCBzZWxmLk1vY2tSYXdJTygpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhaXIuY2xvc2VkKQorICAgICAgICBwYWlyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhaXIuY2xvc2VkKQorCisgICAgZGVmIHRlc3RfaXNhdHR5KHNlbGYpOgorICAgICAgICBjbGFzcyBTZWxlY3RhYmxlSXNBdHR5KE1vY2tSYXdJTyk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaXNhdHR5KToKKyAgICAgICAgICAgICAgICBNb2NrUmF3SU8uX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLl9pc2F0dHkgPSBpc2F0dHkKKworICAgICAgICAgICAgZGVmIGlzYXR0eShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5faXNhdHR5CisKKyAgICAgICAgcGFpciA9IHNlbGYudHAoU2VsZWN0YWJsZUlzQXR0eShGYWxzZSksIFNlbGVjdGFibGVJc0F0dHkoRmFsc2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBhaXIuaXNhdHR5KCkpCisKKyAgICAgICAgcGFpciA9IHNlbGYudHAoU2VsZWN0YWJsZUlzQXR0eShUcnVlKSwgU2VsZWN0YWJsZUlzQXR0eShGYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYWlyLmlzYXR0eSgpKQorCisgICAgICAgIHBhaXIgPSBzZWxmLnRwKFNlbGVjdGFibGVJc0F0dHkoRmFsc2UpLCBTZWxlY3RhYmxlSXNBdHR5KFRydWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGFpci5pc2F0dHkoKSkKKworICAgICAgICBwYWlyID0gc2VsZi50cChTZWxlY3RhYmxlSXNBdHR5KFRydWUpLCBTZWxlY3RhYmxlSXNBdHR5KFRydWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocGFpci5pc2F0dHkoKSkKKworY2xhc3MgQ0J1ZmZlcmVkUldQYWlyVGVzdChCdWZmZXJlZFJXUGFpclRlc3QpOgorICAgIHRwID0gaW8uQnVmZmVyZWRSV1BhaXIKKworY2xhc3MgUHlCdWZmZXJlZFJXUGFpclRlc3QoQnVmZmVyZWRSV1BhaXJUZXN0KToKKyAgICB0cCA9IHB5aW8uQnVmZmVyZWRSV1BhaXIKKworCitjbGFzcyBCdWZmZXJlZFJhbmRvbVRlc3QoQnVmZmVyZWRSZWFkZXJUZXN0LCBCdWZmZXJlZFdyaXRlclRlc3QpOgorICAgIHJlYWRfbW9kZSA9ICJyYisiCisgICAgd3JpdGVfbW9kZSA9ICJ3YisiCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgQnVmZmVyZWRSZWFkZXJUZXN0LnRlc3RfY29uc3RydWN0b3Ioc2VsZikKKyAgICAgICAgQnVmZmVyZWRXcml0ZXJUZXN0LnRlc3RfY29uc3RydWN0b3Ioc2VsZikKKworICAgIGRlZiB0ZXN0X3JlYWRfYW5kX3dyaXRlKHNlbGYpOgorICAgICAgICByYXcgPSBzZWxmLk1vY2tSYXdJTygoYiJhc2RmIiwgYiJnaGprIikpCisgICAgICAgIHJ3ID0gc2VsZi50cChyYXcsIDgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFzIiwgcncucmVhZCgyKSkKKyAgICAgICAgcncud3JpdGUoYiJkZGQiKQorICAgICAgICBydy53cml0ZShiImVlZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmF3Ll93cml0ZV9zdGFjaykgIyBCdWZmZXIgd3JpdGVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJnaGprIiwgcncucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiZGRkZWVlIiwgcmF3Ll93cml0ZV9zdGFja1swXSkKKworICAgIGRlZiB0ZXN0X3NlZWtfYW5kX3RlbGwoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuQnl0ZXNJTyhiImFzZGZnaGprbCIpCisgICAgICAgIHJ3ID0gc2VsZi50cChyYXcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFzIiwgcncucmVhZCgyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBydy50ZWxsKCkpCisgICAgICAgIHJ3LnNlZWsoMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFzZGYiLCBydy5yZWFkKDQpKQorCisgICAgICAgIHJ3LndyaXRlKGIiMTIzZiIpCisgICAgICAgIHJ3LnNlZWsoMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImFzZGYxMjNmbCIsIHJ3LnJlYWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBydy50ZWxsKCkpCisgICAgICAgIHJ3LnNlZWsoLTQsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcncudGVsbCgpKQorICAgICAgICBydy5zZWVrKDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgcncudGVsbCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiZmwiLCBydy5yZWFkKDExKSkKKyAgICAgICAgcncuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYXNkZjEyM2ZsIiwgcmF3LmdldHZhbHVlKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBydy5zZWVrLCAwLjApCisKKyAgICBkZWYgY2hlY2tfZmx1c2hfYW5kX3JlYWQoc2VsZiwgcmVhZF9mdW5jKToKKyAgICAgICAgcmF3ID0gc2VsZi5CeXRlc0lPKGIiYWJjZGVmZ2hpIikKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiYWIiLCByZWFkX2Z1bmMoYnVmaW8sIDIpKQorICAgICAgICBidWZpby53cml0ZShiIjEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiImVmIiwgcmVhZF9mdW5jKGJ1ZmlvLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBidWZpby50ZWxsKCkpCisgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBidWZpby50ZWxsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiJnaGkiLCByZWFkX2Z1bmMoYnVmaW8pKQorICAgICAgICByYXcuc2VlaygwLCAwKQorICAgICAgICByYXcud3JpdGUoYiJYWVoiKQorICAgICAgICAjIGZsdXNoKCkgcmVzZXRzIHRoZSByZWFkIGJ1ZmZlcgorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIGJ1ZmlvLnNlZWsoMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIlhZWiIsIHJlYWRfZnVuYyhidWZpbywgMykpCisKKyAgICBkZWYgdGVzdF9mbHVzaF9hbmRfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mbHVzaF9hbmRfcmVhZChsYW1iZGEgYnVmaW8sICphcmdzOiBidWZpby5yZWFkKCphcmdzKSkKKworICAgIGRlZiB0ZXN0X2ZsdXNoX2FuZF9yZWFkaW50byhzZWxmKToKKyAgICAgICAgZGVmIF9yZWFkaW50byhidWZpbywgbj0tMSk6CisgICAgICAgICAgICBiID0gYnl0ZWFycmF5KG4gaWYgbiA+PSAwIGVsc2UgOTk5OSkKKyAgICAgICAgICAgIG4gPSBidWZpby5yZWFkaW50byhiKQorICAgICAgICAgICAgcmV0dXJuIGJ5dGVzKGJbOm5dKQorICAgICAgICBzZWxmLmNoZWNrX2ZsdXNoX2FuZF9yZWFkKF9yZWFkaW50bykKKworICAgIGRlZiB0ZXN0X2ZsdXNoX2FuZF9wZWVrKHNlbGYpOgorICAgICAgICBkZWYgX3BlZWsoYnVmaW8sIG49LTEpOgorICAgICAgICAgICAgIyBUaGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IHRoZSBidWZmZXIgY2FuIGNvbnRhaW4gdGhlIHdob2xlCisgICAgICAgICAgICAjIHJhdyBzdHJlYW0sIG90aGVyd2lzZSBwZWVrKCkgY2FuIHJldHVybiBsZXNzLgorICAgICAgICAgICAgYiA9IGJ1ZmlvLnBlZWsobikKKyAgICAgICAgICAgIGlmIG4gIT0gLTE6CisgICAgICAgICAgICAgICAgYiA9IGJbOm5dCisgICAgICAgICAgICBidWZpby5zZWVrKGxlbihiKSwgMSkKKyAgICAgICAgICAgIHJldHVybiBiCisgICAgICAgIHNlbGYuY2hlY2tfZmx1c2hfYW5kX3JlYWQoX3BlZWspCisKKyAgICBkZWYgdGVzdF9mbHVzaF9hbmRfd3JpdGUoc2VsZik6CisgICAgICAgIHJhdyA9IHNlbGYuQnl0ZXNJTyhiImFiY2RlZmdoaSIpCisgICAgICAgIGJ1ZmlvID0gc2VsZi50cChyYXcpCisKKyAgICAgICAgYnVmaW8ud3JpdGUoYiIxMjMiKQorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIGJ1ZmlvLndyaXRlKGIiNDUiKQorICAgICAgICBidWZpby5mbHVzaCgpCisgICAgICAgIGJ1ZmlvLnNlZWsoMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiIjEyMzQ1ZmdoaSIsIHJhdy5nZXR2YWx1ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIiMTIzNDVmZ2hpIiwgYnVmaW8ucmVhZCgpKQorCisgICAgZGVmIHRlc3RfdGhyZWFkcyhzZWxmKToKKyAgICAgICAgQnVmZmVyZWRSZWFkZXJUZXN0LnRlc3RfdGhyZWFkcyhzZWxmKQorICAgICAgICBCdWZmZXJlZFdyaXRlclRlc3QudGVzdF90aHJlYWRzKHNlbGYpCisKKyAgICBkZWYgdGVzdF93cml0ZXNfYW5kX3BlZWsoc2VsZik6CisgICAgICAgIGRlZiBfcGVlayhidWZpbyk6CisgICAgICAgICAgICBidWZpby5wZWVrKDEpCisgICAgICAgIHNlbGYuY2hlY2tfd3JpdGVzKF9wZWVrKQorICAgICAgICBkZWYgX3BlZWsoYnVmaW8pOgorICAgICAgICAgICAgcG9zID0gYnVmaW8udGVsbCgpCisgICAgICAgICAgICBidWZpby5zZWVrKC0xLCAxKQorICAgICAgICAgICAgYnVmaW8ucGVlaygxKQorICAgICAgICAgICAgYnVmaW8uc2Vlayhwb3MsIDApCisgICAgICAgIHNlbGYuY2hlY2tfd3JpdGVzKF9wZWVrKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzX2FuZF9yZWFkcyhzZWxmKToKKyAgICAgICAgZGVmIF9yZWFkKGJ1ZmlvKToKKyAgICAgICAgICAgIGJ1ZmlvLnNlZWsoLTEsIDEpCisgICAgICAgICAgICBidWZpby5yZWFkKDEpCisgICAgICAgIHNlbGYuY2hlY2tfd3JpdGVzKF9yZWFkKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzX2FuZF9yZWFkMXMoc2VsZik6CisgICAgICAgIGRlZiBfcmVhZDEoYnVmaW8pOgorICAgICAgICAgICAgYnVmaW8uc2VlaygtMSwgMSkKKyAgICAgICAgICAgIGJ1ZmlvLnJlYWQxKDEpCisgICAgICAgIHNlbGYuY2hlY2tfd3JpdGVzKF9yZWFkMSkKKworICAgIGRlZiB0ZXN0X3dyaXRlc19hbmRfcmVhZGludG9zKHNlbGYpOgorICAgICAgICBkZWYgX3JlYWQoYnVmaW8pOgorICAgICAgICAgICAgYnVmaW8uc2VlaygtMSwgMSkKKyAgICAgICAgICAgIGJ1ZmlvLnJlYWRpbnRvKGJ5dGVhcnJheSgxKSkKKyAgICAgICAgc2VsZi5jaGVja193cml0ZXMoX3JlYWQpCisKKyAgICBkZWYgdGVzdF93cml0ZV9hZnRlcl9yZWFkYWhlYWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzY2Mjk6IHdyaXRpbmcgYWZ0ZXIgdGhlIGJ1ZmZlciB3YXMgZmlsbGVkIGJ5IHJlYWRhaGVhZCBzaG91bGQKKyAgICAgICAgIyBmaXJzdCByZXdpbmQgdGhlIHJhdyBzdHJlYW0uCisgICAgICAgIGZvciBvdmVyd3JpdGVfc2l6ZSBpbiBbMSwgNV06CisgICAgICAgICAgICByYXcgPSBzZWxmLkJ5dGVzSU8oYiJBIiAqIDEwKQorICAgICAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdywgNCkKKyAgICAgICAgICAgICMgVHJpZ2dlciByZWFkYWhlYWQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ucmVhZCgxKSwgYiJBIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udGVsbCgpLCAxKQorICAgICAgICAgICAgIyBPdmVyd3JpdGluZyBzaG91bGQgcmV3aW5kIHRoZSByYXcgc3RyZWFtIGlmIGl0IG5lZWRzIHNvCisgICAgICAgICAgICBidWZpby53cml0ZShiIkIiICogb3ZlcndyaXRlX3NpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnRlbGwoKSwgb3ZlcndyaXRlX3NpemUgKyAxKQorICAgICAgICAgICAgIyBJZiB0aGUgd3JpdGUgc2l6ZSB3YXMgc21hbGxlciB0aGFuIHRoZSBidWZmZXIgc2l6ZSwgZmx1c2goKSBhbmQKKyAgICAgICAgICAgICMgY2hlY2sgdGhhdCByZXdpbmQgaGFwcGVucy4KKyAgICAgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udGVsbCgpLCBvdmVyd3JpdGVfc2l6ZSArIDEpCisgICAgICAgICAgICBzID0gcmF3LmdldHZhbHVlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywKKyAgICAgICAgICAgICAgICBiIkEiICsgYiJCIiAqIG92ZXJ3cml0ZV9zaXplICsgYiJBIiAqICg5IC0gb3ZlcndyaXRlX3NpemUpKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfcmV3aW5kX3dyaXRlKHNlbGYpOgorICAgICAgICAjIFZhcmlvdXMgY29tYmluYXRpb25zIG9mIHJlYWRpbmcgLyB3cml0aW5nIC8gc2Vla2luZyBiYWNrd2FyZHMgLyB3cml0aW5nIGFnYWluCisgICAgICAgIGRlZiBtdXRhdGUoYnVmaW8sIHBvczEsIHBvczIpOgorICAgICAgICAgICAgYXNzZXJ0IHBvczIgPj0gcG9zMQorICAgICAgICAgICAgIyBGaWxsIHRoZSBidWZmZXIKKyAgICAgICAgICAgIGJ1ZmlvLnNlZWsocG9zMSkKKyAgICAgICAgICAgIGJ1ZmlvLnJlYWQocG9zMiAtIHBvczEpCisgICAgICAgICAgICBidWZpby53cml0ZShiJ1x4MDInKQorICAgICAgICAgICAgIyBUaGlzIHdyaXRlcyBlYXJsaWVyIHRoYW4gdGhlIHByZXZpb3VzIHdyaXRlLCBidXQgc3RpbGwgaW5zaWRlCisgICAgICAgICAgICAjIHRoZSBidWZmZXIuCisgICAgICAgICAgICBidWZpby5zZWVrKHBvczEpCisgICAgICAgICAgICBidWZpby53cml0ZShiJ1x4MDEnKQorCisgICAgICAgIGIgPSBiIlx4ODBceDgxXHg4Mlx4ODNceDg0IgorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oYikpOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSwgbGVuKGIpKToKKyAgICAgICAgICAgICAgICByYXcgPSBzZWxmLkJ5dGVzSU8oYikKKyAgICAgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3LCAxMDApCisgICAgICAgICAgICAgICAgbXV0YXRlKGJ1ZmlvLCBpLCBqKQorICAgICAgICAgICAgICAgIGJ1ZmlvLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGJ5dGVhcnJheShiKQorICAgICAgICAgICAgICAgIGV4cGVjdGVkW2pdID0gMgorICAgICAgICAgICAgICAgIGV4cGVjdGVkW2ldID0gMQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmdldHZhbHVlKCksIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCByZXN1bHQgZm9yIGk9JWQsIGo9JWQiICUgKGksIGopKQorCisgICAgZGVmIHRlc3RfdHJ1bmNhdGVfYWZ0ZXJfcmVhZF9vcl93cml0ZShzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5CeXRlc0lPKGIiQSIgKiAxMCkKKyAgICAgICAgYnVmaW8gPSBzZWxmLnRwKHJhdywgMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnJlYWQoMiksIGIiQUEiKSAjIHRoZSByZWFkIGJ1ZmZlciBnZXRzIGZpbGxlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmlvLnRydW5jYXRlKCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8ud3JpdGUoYiJCQiIpLCAyKSAjIHRoZSB3cml0ZSBidWZmZXIgaW5jcmVhc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmaW8udHJ1bmNhdGUoKSwgNCkKKworICAgIGRlZiB0ZXN0X21pc2JlaGF2ZWRfaW8oc2VsZik6CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyVGVzdC50ZXN0X21pc2JlaGF2ZWRfaW8oc2VsZikKKyAgICAgICAgQnVmZmVyZWRXcml0ZXJUZXN0LnRlc3RfbWlzYmVoYXZlZF9pbyhzZWxmKQorCisgICAgZGVmIHRlc3RfaW50ZXJsZWF2ZWRfcmVhZF93cml0ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBpc3N1ZSAjMTIyMTMKKyAgICAgICAgd2l0aCBzZWxmLkJ5dGVzSU8oYidhYmNkZWZnaCcpIGFzIHJhdzoKKyAgICAgICAgICAgIHdpdGggc2VsZi50cChyYXcsIDEwMCkgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKGIiMSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMSksIGInYicpCisgICAgICAgICAgICAgICAgZi53cml0ZShiJzInKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkMSgxKSwgYidkJykKKyAgICAgICAgICAgICAgICBmLndyaXRlKGInMycpCisgICAgICAgICAgICAgICAgYnVmID0gYnl0ZWFycmF5KDEpCisgICAgICAgICAgICAgICAgZi5yZWFkaW50byhidWYpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGInZicpCisgICAgICAgICAgICAgICAgZi53cml0ZShiJzQnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5wZWVrKDEpLCBiJ2gnKQorICAgICAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3LmdldHZhbHVlKCksIGInMWIyZDNmNGgnKQorCisgICAgICAgIHdpdGggc2VsZi5CeXRlc0lPKGInYWJjJykgYXMgcmF3OgorICAgICAgICAgICAgd2l0aCBzZWxmLnRwKHJhdywgMTAwKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDEpLCBiJ2EnKQorICAgICAgICAgICAgICAgIGYud3JpdGUoYiIyIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgYidjJykKKyAgICAgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhdy5nZXR2YWx1ZSgpLCBiJ2EyYycpCisKKyAgICBkZWYgdGVzdF9pbnRlcmxlYXZlZF9yZWFkbGluZV93cml0ZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLkJ5dGVzSU8oYidhYlxuY2RlZlxuZ1xuJykgYXMgcmF3OgorICAgICAgICAgICAgd2l0aCBzZWxmLnRwKHJhdykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKGInMScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksIGInYlxuJykKKyAgICAgICAgICAgICAgICBmLndyaXRlKGInMicpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksIGInZGVmXG4nKQorICAgICAgICAgICAgICAgIGYud3JpdGUoYiczJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZGxpbmUoKSwgYidcbicpCisgICAgICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuZ2V0dmFsdWUoKSwgYicxYlxuMmRlZlxuM1xuJykKKworCitjbGFzcyBDQnVmZmVyZWRSYW5kb21UZXN0KENCdWZmZXJlZFJlYWRlclRlc3QsIENCdWZmZXJlZFdyaXRlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmFuZG9tVGVzdCwgU2l6ZW9mVGVzdCk6CisgICAgdHAgPSBpby5CdWZmZXJlZFJhbmRvbQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIEJ1ZmZlcmVkUmFuZG9tVGVzdC50ZXN0X2NvbnN0cnVjdG9yKHNlbGYpCisgICAgICAgICMgVGhlIGFsbG9jYXRpb24gY2FuIHN1Y2NlZWQgb24gMzItYml0IGJ1aWxkcywgZS5nLiB3aXRoIG1vcmUKKyAgICAgICAgIyB0aGFuIDJHQiBSQU0gYW5kIGEgNjQtYml0IGtlcm5lbC4KKyAgICAgICAgaWYgc3lzLm1heHNpemUgPiAweDdGRkZGRkZGOgorICAgICAgICAgICAgcmF3aW8gPSBzZWxmLk1vY2tSYXdJTygpCisgICAgICAgICAgICBidWZpbyA9IHNlbGYudHAocmF3aW8pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoT3ZlcmZsb3dFcnJvciwgTWVtb3J5RXJyb3IsIFZhbHVlRXJyb3IpLAorICAgICAgICAgICAgICAgIGJ1ZmlvLl9faW5pdF9fLCByYXdpbywgc3lzLm1heHNpemUpCisKKyAgICBkZWYgdGVzdF9nYXJiYWdlX2NvbGxlY3Rpb24oc2VsZik6CisgICAgICAgIENCdWZmZXJlZFJlYWRlclRlc3QudGVzdF9nYXJiYWdlX2NvbGxlY3Rpb24oc2VsZikKKyAgICAgICAgQ0J1ZmZlcmVkV3JpdGVyVGVzdC50ZXN0X2dhcmJhZ2VfY29sbGVjdGlvbihzZWxmKQorCisgICAgZGVmIHRlc3RfYXJnc19lcnJvcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTcyNzUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsICJCdWZmZXJlZFJhbmRvbSIpOgorICAgICAgICAgICAgc2VsZi50cChpby5CeXRlc0lPKCksIDEwMjQsIDEwMjQsIDEwMjQpCisKKworY2xhc3MgUHlCdWZmZXJlZFJhbmRvbVRlc3QoQnVmZmVyZWRSYW5kb21UZXN0KToKKyAgICB0cCA9IHB5aW8uQnVmZmVyZWRSYW5kb20KKworCisjIFRvIGZ1bGx5IGV4ZXJjaXNlIHNlZWsvdGVsbCwgdGhlIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyIGhhcyB0aGVzZQorIyBwcm9wZXJ0aWVzOgorIyAgIC0gQSBzaW5nbGUgb3V0cHV0IGNoYXJhY3RlciBjYW4gY29ycmVzcG9uZCB0byBtYW55IGJ5dGVzIG9mIGlucHV0LgorIyAgIC0gVGhlIG51bWJlciBvZiBpbnB1dCBieXRlcyB0byBjb21wbGV0ZSB0aGUgY2hhcmFjdGVyIGNhbiBiZQorIyAgICAgdW5kZXRlcm1pbmVkIHVudGlsIHRoZSBsYXN0IGlucHV0IGJ5dGUgaXMgcmVjZWl2ZWQuCisjICAgLSBUaGUgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiBwcmV2aW91cyBpbnB1dC4KKyMgICAtIEEgc2luZ2xlIGlucHV0IGJ5dGUgY2FuIGNvcnJlc3BvbmQgdG8gbWFueSBjaGFyYWN0ZXJzIG9mIG91dHB1dC4KKyMgICAtIFRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYXJhY3RlcnMgY2FuIGJlIHVuZGV0ZXJtaW5lZCB1bnRpbCB0aGUKKyMgICAgIGxhc3QgaW5wdXQgYnl0ZSBpcyByZWNlaXZlZC4KKyMgICAtIFRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYXJhY3RlcnMgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHByZXZpb3VzIGlucHV0LgorCitjbGFzcyBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICAiIiIKKyAgICBGb3IgdGVzdGluZyBzZWVrL3RlbGwgYmVoYXZpb3Igd2l0aCBhIHN0YXRlZnVsLCBidWZmZXJpbmcgZGVjb2Rlci4KKworICAgIElucHV0IGlzIGEgc2VxdWVuY2Ugb2Ygd29yZHMuICBXb3JkcyBtYXkgYmUgZml4ZWQtbGVuZ3RoIChsZW5ndGggc2V0CisgICAgYnkgaW5wdXQpIG9yIHZhcmlhYmxlLWxlbmd0aCAocGVyaW9kLXRlcm1pbmF0ZWQpLiAgSW4gdmFyaWFibGUtbGVuZ3RoCisgICAgbW9kZSwgZXh0cmEgcGVyaW9kcyBhcmUgaWdub3JlZC4gIFBvc3NpYmxlIHdvcmRzIGFyZToKKyAgICAgIC0gJ2knIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIHNldHMgdGhlIGlucHV0IGxlbmd0aCwgSSAobWF4aW11bSA5OSkuCisgICAgICAgIFdoZW4gSSBpcyBzZXQgdG8gMCwgd29yZHMgYXJlIHNwYWNlLXRlcm1pbmF0ZWQuCisgICAgICAtICdvJyBmb2xsb3dlZCBieSBhIG51bWJlciBzZXRzIHRoZSBvdXRwdXQgbGVuZ3RoLCBPIChtYXhpbXVtIDk5KS4KKyAgICAgIC0gQW55IG90aGVyIHdvcmQgaXMgY29udmVydGVkIGludG8gYSB3b3JkIGZvbGxvd2VkIGJ5IGEgcGVyaW9kIG9uCisgICAgICAgIHRoZSBvdXRwdXQuICBUaGUgb3V0cHV0IHdvcmQgY29uc2lzdHMgb2YgdGhlIGlucHV0IHdvcmQgdHJ1bmNhdGVkCisgICAgICAgIG9yIHBhZGRlZCBvdXQgd2l0aCBoeXBoZW5zIHRvIG1ha2UgaXRzIGxlbmd0aCBlcXVhbCB0byBPLiAgSWYgTworICAgICAgICBpcyAwLCB0aGUgd29yZCBpcyBvdXRwdXQgdmVyYmF0aW0gd2l0aG91dCB0cnVuY2F0aW5nIG9yIHBhZGRpbmcuCisgICAgSSBhbmQgTyBhcmUgaW5pdGlhbGx5IHNldCB0byAxLiAgV2hlbiBJIGNoYW5nZXMsIGFueSBidWZmZXJlZCBpbnB1dCBpcworICAgIHJlLXNjYW5uZWQgYWNjb3JkaW5nIHRvIHRoZSBuZXcgSS4gIEVPRiBhbHNvIHRlcm1pbmF0ZXMgdGhlIGxhc3Qgd29yZC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyLl9faW5pdF9fKHNlbGYsIGVycm9ycykKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPFNJRCAleD4nICUgaWQoc2VsZikKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgc2VsZi5pID0gMQorICAgICAgICBzZWxmLm8gPSAxCisgICAgICAgIHNlbGYuYnVmZmVyID0gYnl0ZWFycmF5KCkKKworICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKKyAgICAgICAgaSwgbyA9IHNlbGYuaSBeIDEsIHNlbGYubyBeIDEgIyBzbyB0aGF0IGZsYWdzID0gMCBhZnRlciByZXNldCgpCisgICAgICAgIHJldHVybiBieXRlcyhzZWxmLmJ1ZmZlciksIGkqMTAwICsgbworCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgYnVmZmVyLCBpbyA9IHN0YXRlCisgICAgICAgIHNlbGYuYnVmZmVyID0gYnl0ZWFycmF5KGJ1ZmZlcikKKyAgICAgICAgaSwgbyA9IGRpdm1vZChpbywgMTAwKQorICAgICAgICBzZWxmLmksIHNlbGYubyA9IGkgXiAxLCBvIF4gMQorCisgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgorICAgICAgICBvdXRwdXQgPSAnJworICAgICAgICBmb3IgYiBpbiBpbnB1dDoKKyAgICAgICAgICAgIGlmIHNlbGYuaSA9PSAwOiAjIHZhcmlhYmxlLWxlbmd0aCwgdGVybWluYXRlZCB3aXRoIHBlcmlvZAorICAgICAgICAgICAgICAgIGlmIGIgPT0gJy4nOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBzZWxmLnByb2Nlc3Nfd29yZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIuYXBwZW5kKGIpCisgICAgICAgICAgICBlbHNlOiAjIGZpeGVkLWxlbmd0aCwgdGVybWluYXRlIGFmdGVyIHNlbGYuaSBieXRlcworICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVyLmFwcGVuZChiKQorICAgICAgICAgICAgICAgIGlmIGxlbihzZWxmLmJ1ZmZlcikgPT0gc2VsZi5pOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gc2VsZi5wcm9jZXNzX3dvcmQoKQorICAgICAgICBpZiBmaW5hbCBhbmQgc2VsZi5idWZmZXI6ICMgRU9GIHRlcm1pbmF0ZXMgdGhlIGxhc3Qgd29yZAorICAgICAgICAgICAgb3V0cHV0ICs9IHNlbGYucHJvY2Vzc193b3JkKCkKKyAgICAgICAgcmV0dXJuIG91dHB1dAorCisgICAgZGVmIHByb2Nlc3Nfd29yZChzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gJycKKyAgICAgICAgaWYgc2VsZi5idWZmZXJbMF0gPT0gb3JkKCdpJyk6CisgICAgICAgICAgICBzZWxmLmkgPSBtaW4oOTksIGludChzZWxmLmJ1ZmZlclsxOl0gb3IgMCkpICMgc2V0IGlucHV0IGxlbmd0aAorICAgICAgICBlbGlmIHNlbGYuYnVmZmVyWzBdID09IG9yZCgnbycpOgorICAgICAgICAgICAgc2VsZi5vID0gbWluKDk5LCBpbnQoc2VsZi5idWZmZXJbMTpdIG9yIDApKSAjIHNldCBvdXRwdXQgbGVuZ3RoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXRwdXQgPSBzZWxmLmJ1ZmZlci5kZWNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgIGlmIGxlbihvdXRwdXQpIDwgc2VsZi5vOgorICAgICAgICAgICAgICAgIG91dHB1dCArPSAnLScqc2VsZi5vICMgcGFkIG91dCB3aXRoIGh5cGhlbnMKKyAgICAgICAgICAgIGlmIHNlbGYubzoKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBvdXRwdXRbOnNlbGYub10gIyB0cnVuY2F0ZSB0byBvdXRwdXQgbGVuZ3RoCisgICAgICAgICAgICBvdXRwdXQgKz0gJy4nCisgICAgICAgIHNlbGYuYnVmZmVyID0gYnl0ZWFycmF5KCkKKyAgICAgICAgcmV0dXJuIG91dHB1dAorCisgICAgY29kZWNFbmFibGVkID0gRmFsc2UKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBsb29rdXBUZXN0RGVjb2RlcihjbHMsIG5hbWUpOgorICAgICAgICBpZiBjbHMuY29kZWNFbmFibGVkIGFuZCBuYW1lID09ICd0ZXN0X2RlY29kZXInOgorICAgICAgICAgICAgbGF0aW4xID0gY29kZWNzLmxvb2t1cCgnbGF0aW4tMScpCisgICAgICAgICAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgICAgICAgICBuYW1lPSd0ZXN0X2RlY29kZXInLCBlbmNvZGU9bGF0aW4xLmVuY29kZSwgZGVjb2RlPU5vbmUsCisgICAgICAgICAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPU5vbmUsCisgICAgICAgICAgICAgICAgc3RyZWFtcmVhZGVyPU5vbmUsIHN0cmVhbXdyaXRlcj1Ob25lLAorICAgICAgICAgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1jbHMpCisKKyMgUmVnaXN0ZXIgdGhlIHByZXZpb3VzIGRlY29kZXIgZm9yIHRlc3RpbmcuCisjIERpc2FibGVkIGJ5IGRlZmF1bHQsIHRlc3RzIHdpbGwgZW5hYmxlIGl0LgorY29kZWNzLnJlZ2lzdGVyKFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyLmxvb2t1cFRlc3REZWNvZGVyKQorCisKK2NsYXNzIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgTWFrZSBzdXJlIHRoZSBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2RlciBhY3R1YWxseSB3b3Jrcy4KKyAgICAiIiIKKworICAgIHRlc3RfY2FzZXMgPSBbCisgICAgICAgICMgST0xLCBPPTEgKGZpeGVkLWxlbmd0aCBpbnB1dCA9PSBmaXhlZC1sZW5ndGggb3V0cHV0KQorICAgICAgICAoYidhYmNkJywgRmFsc2UsICdhLmIuYy5kLicpLAorICAgICAgICAjIEk9MCwgTz0wICh2YXJpYWJsZS1sZW5ndGggaW5wdXQsIHZhcmlhYmxlLWxlbmd0aCBvdXRwdXQpCisgICAgICAgIChiJ29pYWJjZCcsIFRydWUsICdhYmNkLicpLAorICAgICAgICAjIEk9MCwgTz0wIChzaG91bGQgaWdub3JlIGV4dHJhIHBlcmlvZHMpCisgICAgICAgIChiJ29pLi4uYWJjZC4uLicsIFRydWUsICdhYmNkLicpLAorICAgICAgICAjIEk9MCwgTz02ICh2YXJpYWJsZS1sZW5ndGggaW5wdXQsIGZpeGVkLWxlbmd0aCBvdXRwdXQpCisgICAgICAgIChiJ2kubzYueC54eXoudG9vbG9uZ3RvZml0LicsIEZhbHNlLCAneC0tLS0tLnh5ei0tLS50b29sb24uJyksCisgICAgICAgICMgST0yLCBPPTYgKGZpeGVkLWxlbmd0aCBpbnB1dCA8IGZpeGVkLWxlbmd0aCBvdXRwdXQpCisgICAgICAgIChiJ2kuaTIubzZ4eXonLCBUcnVlLCAneHktLS0tLnotLS0tLS4nKSwKKyAgICAgICAgIyBJPTYsIE89MyAoZml4ZWQtbGVuZ3RoIGlucHV0ID4gZml4ZWQtbGVuZ3RoIG91dHB1dCkKKyAgICAgICAgKGInaS5vMy5pNi5hYmNkZWZnaGlqa2xtbm9wJywgVHJ1ZSwgJ2FiYy5naGkubW5vLicpLAorICAgICAgICAjIEk9MCwgdGhlbiAzOyBPPTI5LCB0aGVuIDE1ICh3aXRoIGxvbmdlciBvdXRwdXQpCisgICAgICAgIChiJ2kubzI5LmEuYi5jZGUubzE1LmFiY2RlZmdoaWphYmNkZWZnaGlqLmkzLmEuYi5jLmQuZWkwMGsubC5tJywgVHJ1ZSwKKyAgICAgICAgICdhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4nICsKKyAgICAgICAgICdiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4nICsKKyAgICAgICAgICdjZGUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4nICsKKyAgICAgICAgICdhYmNkZWZnaGlqYWJjZGUuJyArCisgICAgICAgICAnYS5iLS0tLS0tLS0tLS0tLicgKworICAgICAgICAgJy5jLi0tLS0tLS0tLS0tLS4nICsKKyAgICAgICAgICdkLmUtLS0tLS0tLS0tLS0uJyArCisgICAgICAgICAnay0tLS0tLS0tLS0tLS0tLicgKworICAgICAgICAgJ2wtLS0tLS0tLS0tLS0tLS4nICsKKyAgICAgICAgICdtLS0tLS0tLS0tLS0tLS0uJykKKyAgICBdCisKKyAgICBkZWYgdGVzdF9kZWNvZGVyKHNlbGYpOgorICAgICAgICAjIFRyeSBhIGZldyBvbmUtc2hvdCB0ZXN0IGNhc2VzLgorICAgICAgICBmb3IgaW5wdXQsIGVvZiwgb3V0cHV0IGluIHNlbGYudGVzdF9jYXNlczoKKyAgICAgICAgICAgIGQgPSBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2RlcigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGVjb2RlKGlucHV0LCBlb2YpLCBvdXRwdXQpCisKKyAgICAgICAgIyBBbHNvIHRlc3QgYW4gdW5maW5pc2hlZCBkZWNvZGUsIGZvbGxvd2VkIGJ5IGZvcmNpbmcgRU9GLgorICAgICAgICBkID0gU3RhdGVmdWxJbmNyZW1lbnRhbERlY29kZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGVjb2RlKGInb2lhYmNkJyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZGVjb2RlKGInJywgMSksICdhYmNkLicpCisKK2NsYXNzIFRleHRJT1dyYXBwZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0ZGF0YSA9IGIiQUFBXHJcbkJCQlxyQ0NDXHJcbkRERFxuRUVFXHJcbiIKKyAgICAgICAgc2VsZi5ub3JtYWxpemVkID0gYiJBQUFcbkJCQlxuQ0NDXG5ERERcbkVFRVxuIi5kZWNvZGUoImFzY2lpIikKKyAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHIgPSBzZWxmLkJ5dGVzSU8oYiJceGMzXHhhOVxuXG4iKQorICAgICAgICBiID0gc2VsZi5CdWZmZXJlZFJlYWRlcihyLCAxMDAwKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIpCisgICAgICAgIHQuX19pbml0X18oYiwgZW5jb2Rpbmc9ImxhdGluMSIsIG5ld2xpbmU9IlxyXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZW5jb2RpbmcsICJsYXRpbjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubGluZV9idWZmZXJpbmcsIEZhbHNlKQorICAgICAgICB0Ll9faW5pdF9fKGIsIGVuY29kaW5nPSJ1dGY4IiwgbGluZV9idWZmZXJpbmc9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmVuY29kaW5nLCAidXRmOCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5saW5lX2J1ZmZlcmluZywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiXHhlOVxuIiwgdC5yZWFkbGluZSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuX19pbml0X18sIGIsIG5ld2xpbmU9NDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuX19pbml0X18sIGIsIG5ld2xpbmU9J3h5enp5JykKKworICAgIGRlZiB0ZXN0X2RldGFjaChzZWxmKToKKyAgICAgICAgciA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgIGIgPSBzZWxmLkJ1ZmZlcmVkV3JpdGVyKHIpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh0LmRldGFjaCgpLCBiKQorCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYiwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgdC53cml0ZSgiaG93ZHkiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHIuZ2V0dmFsdWUoKSkKKyAgICAgICAgdC5kZXRhY2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuZ2V0dmFsdWUoKSwgYiJob3dkeSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuZGV0YWNoKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgcmF3ID0gc2VsZi5CeXRlc0lPKCJoZWxsbyIuZW5jb2RlKCJ1dGYtOCIpKQorICAgICAgICBiID0gc2VsZi5CdWZmZXJlZFJlYWRlcihyYXcpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYiwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAgICAgbW9kbmFtZSA9IHNlbGYuVGV4dElPV3JhcHBlci5fX21vZHVsZV9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPCVzLlRleHRJT1dyYXBwZXIgZW5jb2Rpbmc9J3V0Zi04Jz4iICUgbW9kbmFtZSkKKyAgICAgICAgcmF3Lm5hbWUgPSAiZHVtbXkiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPCVzLlRleHRJT1dyYXBwZXIgbmFtZT11J2R1bW15JyBlbmNvZGluZz0ndXRmLTgnPiIgJSBtb2RuYW1lKQorICAgICAgICByYXcubmFtZSA9IGIiZHVtbXkiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPCVzLlRleHRJT1dyYXBwZXIgbmFtZT0nZHVtbXknIGVuY29kaW5nPSd1dGYtOCc+IiAlIG1vZG5hbWUpCisKKyAgICBkZWYgdGVzdF9saW5lX2J1ZmZlcmluZyhzZWxmKToKKyAgICAgICAgciA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgIGIgPSBzZWxmLkJ1ZmZlcmVkV3JpdGVyKHIsIDEwMDApCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYiwgbmV3bGluZT0iXG4iLCBsaW5lX2J1ZmZlcmluZz1UcnVlKQorICAgICAgICB0LndyaXRlKCJYIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmdldHZhbHVlKCksIGIiIikgICMgTm8gZmx1c2ggaGFwcGVuZWQKKyAgICAgICAgdC53cml0ZSgiWVxuWiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5nZXR2YWx1ZSgpLCBiIlhZXG5aIikgICMgQWxsIGdvdCBmbHVzaGVkCisgICAgICAgIHQud3JpdGUoIkFcckIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuZ2V0dmFsdWUoKSwgYiJYWVxuWkFcckIiKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBpcyBhbHdheXMgc2V0LCBhbmQgdmFsaWQKKyAgICAgICAgYiA9IHNlbGYuQnl0ZXNJTygpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYiwgZW5jb2Rpbmc9InV0ZjgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZW5jb2RpbmcsICJ1dGY4IikKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC5lbmNvZGluZyBpcyBub3QgTm9uZSkKKyAgICAgICAgY29kZWNzLmxvb2t1cCh0LmVuY29kaW5nKQorCisgICAgZGVmIHRlc3RfZW5jb2RpbmdfZXJyb3JzX3JlYWRpbmcoc2VsZik6CisgICAgICAgICMgKDEpIGRlZmF1bHQKKyAgICAgICAgYiA9IHNlbGYuQnl0ZXNJTyhiImFiY1xuXHhmZlxuIikKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHQucmVhZCkKKyAgICAgICAgIyAoMikgZXhwbGljaXQgc3RyaWN0CisgICAgICAgIGIgPSBzZWxmLkJ5dGVzSU8oYiJhYmNcblx4ZmZcbiIpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYiwgZW5jb2Rpbmc9ImFzY2lpIiwgZXJyb3JzPSJzdHJpY3QiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHQucmVhZCkKKyAgICAgICAgIyAoMykgaWdub3JlCisgICAgICAgIGIgPSBzZWxmLkJ5dGVzSU8oYiJhYmNcblx4ZmZcbiIpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYiwgZW5jb2Rpbmc9ImFzY2lpIiwgZXJyb3JzPSJpZ25vcmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQucmVhZCgpLCAiYWJjXG5cbiIpCisgICAgICAgICMgKDQpIHJlcGxhY2UKKyAgICAgICAgYiA9IHNlbGYuQnl0ZXNJTyhiImFiY1xuXHhmZlxuIikKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InJlcGxhY2UiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQucmVhZCgpLCAiYWJjXG5cdWZmZmRcbiIpCisKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19lcnJvcnNfd3JpdGluZyhzZWxmKToKKyAgICAgICAgIyAoMSkgZGVmYXVsdAorICAgICAgICBiID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHQud3JpdGUsICJceGZmIikKKyAgICAgICAgIyAoMikgZXhwbGljaXQgc3RyaWN0CisgICAgICAgIGIgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIsIGVuY29kaW5nPSJhc2NpaSIsIGVycm9ycz0ic3RyaWN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0LndyaXRlLCAiXHhmZiIpCisgICAgICAgICMgKDMpIGlnbm9yZQorICAgICAgICBiID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9Imlnbm9yZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmU9IlxuIikKKyAgICAgICAgdC53cml0ZSgiYWJjXHhmZmRlZlxuIikKKyAgICAgICAgdC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5nZXR2YWx1ZSgpLCBiImFiY2RlZlxuIikKKyAgICAgICAgIyAoNCkgcmVwbGFjZQorICAgICAgICBiID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InJlcGxhY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lPSJcbiIpCisgICAgICAgIHQud3JpdGUoImFiY1x4ZmZkZWZcbiIpCisgICAgICAgIHQuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIuZ2V0dmFsdWUoKSwgYiJhYmM/ZGVmXG4iKQorCisgICAgZGVmIHRlc3RfbmV3bGluZXMoc2VsZik6CisgICAgICAgIGlucHV0X2xpbmVzID0gWyAidW5peFxuIiwgIndpbmRvd3NcclxuIiwgIm9zOVxyIiwgImxhc3RcbiIsICJub25sIiBdCisKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICBbIE5vbmUsIFsgJ3VuaXhcbicsICd3aW5kb3dzXG4nLCAnb3M5XG4nLCAnbGFzdFxuJywgJ25vbmwnIF0gXSwKKyAgICAgICAgICAgIFsgJycsIGlucHV0X2xpbmVzIF0sCisgICAgICAgICAgICBbICdcbicsIFsgInVuaXhcbiIsICJ3aW5kb3dzXHJcbiIsICJvczlccmxhc3RcbiIsICJub25sIiBdIF0sCisgICAgICAgICAgICBbICdcclxuJywgWyAidW5peFxud2luZG93c1xyXG4iLCAib3M5XHJsYXN0XG5ub25sIiBdIF0sCisgICAgICAgICAgICBbICdccicsIFsgInVuaXhcbndpbmRvd3NcciIsICJcbm9zOVxyIiwgImxhc3Rcbm5vbmwiIF0gXSwKKyAgICAgICAgXQorICAgICAgICBlbmNvZGluZ3MgPSAoCisgICAgICAgICAgICAndXRmLTgnLCAnbGF0aW4tMScsCisgICAgICAgICAgICAndXRmLTE2JywgJ3V0Zi0xNi1sZScsICd1dGYtMTYtYmUnLAorICAgICAgICAgICAgJ3V0Zi0zMicsICd1dGYtMzItbGUnLCAndXRmLTMyLWJlJywKKyAgICAgICAgKQorCisgICAgICAgICMgVHJ5IGEgcmFuZ2Ugb2YgYnVmZmVyIHNpemVzIHRvIHRlc3QgdGhlIGNhc2Ugd2hlcmUgXHIgaXMgdGhlIGxhc3QKKyAgICAgICAgIyBjaGFyYWN0ZXIgaW4gVGV4dElPV3JhcHBlci5fcGVuZGluZ19saW5lLgorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gZW5jb2RpbmdzOgorICAgICAgICAgICAgIyBYWFg6IHN0ci5lbmNvZGUoKSBzaG91bGQgcmV0dXJuIGJ5dGVzCisgICAgICAgICAgICBkYXRhID0gYnl0ZXMoJycuam9pbihpbnB1dF9saW5lcykuZW5jb2RlKGVuY29kaW5nKSkKKyAgICAgICAgICAgIGZvciBkb19yZWFkcyBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgICAgIGZvciBidWZzaXplIGluIHJhbmdlKDEsIDEwKToKKyAgICAgICAgICAgICAgICAgICAgZm9yIG5ld2xpbmUsIGV4cF9saW5lcyBpbiB0ZXN0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmlvID0gc2VsZi5CdWZmZXJlZFJlYWRlcihzZWxmLkJ5dGVzSU8oZGF0YSksIGJ1ZnNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0aW8gPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmaW8sIG5ld2xpbmU9bmV3bGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkb19yZWFkczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RfbGluZXMgPSBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyID0gdGV4dGlvLnJlYWQoMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYzIgPT0gJyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjMiksIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdF9saW5lcy5hcHBlbmQoYzIgKyB0ZXh0aW8ucmVhZGxpbmUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290X2xpbmVzID0gbGlzdCh0ZXh0aW8pCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBnb3RfbGluZSwgZXhwX2xpbmUgaW4gemlwKGdvdF9saW5lcywgZXhwX2xpbmVzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdF9saW5lLCBleHBfbGluZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdvdF9saW5lcyksIGxlbihleHBfbGluZXMpKQorCisgICAgZGVmIHRlc3RfbmV3bGluZXNfaW5wdXQoc2VsZik6CisgICAgICAgIHRlc3RkYXRhID0gYiJBQUFcbkJCXHgwMEJcbkNDQ1xyREREXHJFRUVcclxuRkZGXHJcbkdHRyIKKyAgICAgICAgbm9ybWFsaXplZCA9IHRlc3RkYXRhLnJlcGxhY2UoYiJcclxuIiwgYiJcbiIpLnJlcGxhY2UoYiJcciIsIGIiXG4iKQorICAgICAgICBmb3IgbmV3bGluZSwgZXhwZWN0ZWQgaW4gWworICAgICAgICAgICAgKE5vbmUsIG5vcm1hbGl6ZWQuZGVjb2RlKCJhc2NpaSIpLnNwbGl0bGluZXMoVHJ1ZSkpLAorICAgICAgICAgICAgKCIiLCB0ZXN0ZGF0YS5kZWNvZGUoImFzY2lpIikuc3BsaXRsaW5lcyhUcnVlKSksCisgICAgICAgICAgICAoIlxuIiwgWyJBQUFcbiIsICJCQlx4MDBCXG4iLCAiQ0NDXHJERERcckVFRVxyXG4iLCAiRkZGXHJcbiIsICJHR0ciXSksCisgICAgICAgICAgICAoIlxyXG4iLCBbIkFBQVxuQkJceDAwQlxuQ0NDXHJERERcckVFRVxyXG4iLCAiRkZGXHJcbiIsICJHR0ciXSksCisgICAgICAgICAgICAoIlxyIiwgIFsiQUFBXG5CQlx4MDBCXG5DQ0NcciIsICJERERcciIsICJFRUVcciIsICJcbkZGRlxyIiwgIlxuR0dHIl0pLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGJ1ZiA9IHNlbGYuQnl0ZXNJTyh0ZXN0ZGF0YSkKKyAgICAgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihidWYsIGVuY29kaW5nPSJhc2NpaSIsIG5ld2xpbmU9bmV3bGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHh0LnJlYWRsaW5lcygpLCBleHBlY3RlZCkKKyAgICAgICAgICAgIHR4dC5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4dC5yZWFkKCksICIiLmpvaW4oZXhwZWN0ZWQpKQorCisgICAgZGVmIHRlc3RfbmV3bGluZXNfb3V0cHV0KHNlbGYpOgorICAgICAgICB0ZXN0ZGljdCA9IHsKKyAgICAgICAgICAgICIiOiBiIkFBQVxuQkJCXG5DQ0NcblhccllcclxuWiIsCisgICAgICAgICAgICAiXG4iOiBiIkFBQVxuQkJCXG5DQ0NcblhccllcclxuWiIsCisgICAgICAgICAgICAiXHIiOiBiIkFBQVxyQkJCXHJDQ0NcclhccllcclxyWiIsCisgICAgICAgICAgICAiXHJcbiI6IGIiQUFBXHJcbkJCQlxyXG5DQ0NcclxuWFxyWVxyXHJcbloiLAorICAgICAgICAgICAgfQorICAgICAgICB0ZXN0cyA9IFsoTm9uZSwgdGVzdGRpY3Rbb3MubGluZXNlcF0pXSArIHNvcnRlZCh0ZXN0ZGljdC5pdGVtcygpKQorICAgICAgICBmb3IgbmV3bGluZSwgZXhwZWN0ZWQgaW4gdGVzdHM6CisgICAgICAgICAgICBidWYgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGJ1ZiwgZW5jb2Rpbmc9ImFzY2lpIiwgbmV3bGluZT1uZXdsaW5lKQorICAgICAgICAgICAgdHh0LndyaXRlKCJBQUFcbkIiKQorICAgICAgICAgICAgdHh0LndyaXRlKCJCQlxuQ0NDXG4iKQorICAgICAgICAgICAgdHh0LndyaXRlKCJYXHJZXHJcbloiKQorICAgICAgICAgICAgdHh0LmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLmNsb3NlZCwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5nZXR2YWx1ZSgpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2Rlc3RydWN0b3Ioc2VsZik6CisgICAgICAgIGwgPSBbXQorICAgICAgICBiYXNlID0gc2VsZi5CeXRlc0lPCisgICAgICAgIGNsYXNzIE15Qnl0ZXNJTyhiYXNlKToKKyAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICBsLmFwcGVuZChzZWxmLmdldHZhbHVlKCkpCisgICAgICAgICAgICAgICAgYmFzZS5jbG9zZShzZWxmKQorICAgICAgICBiID0gTXlCeXRlc0lPKCkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICB0LndyaXRlKCJhYmMiKQorICAgICAgICBkZWwgdAorICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtiImFiYyJdLCBsKQorCisgICAgZGVmIHRlc3Rfb3ZlcnJpZGVfZGVzdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgY2xhc3MgTXlUZXh0SU8oc2VsZi5UZXh0SU9XcmFwcGVyKToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBzdXBlcihNeVRleHRJTywgc2VsZikuX19kZWxfXworICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGYoKQorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMikKKyAgICAgICAgICAgICAgICBzdXBlcihNeVRleHRJTywgc2VsZikuY2xvc2UoKQorICAgICAgICAgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMykKKyAgICAgICAgICAgICAgICBzdXBlcihNeVRleHRJTywgc2VsZikuZmx1c2goKQorICAgICAgICBiID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgdCA9IE15VGV4dElPKGIsIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIGRlbCB0CisgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLCBbMSwgMiwgM10pCisKKyAgICBkZWYgdGVzdF9lcnJvcl90aHJvdWdoX2Rlc3RydWN0b3Ioc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBleGNlcHRpb24gc3RhdGUgaXMgbm90IG1vZGlmaWVkIGJ5IGEgZGVzdHJ1Y3RvciwKKyAgICAgICAgIyBldmVuIGlmIGNsb3NlKCkgZmFpbHMuCisgICAgICAgIHJhd2lvID0gc2VsZi5DbG9zZUZhaWx1cmVJTygpCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBzZWxmLlRleHRJT1dyYXBwZXIocmF3aW8pLnh5enp5CisgICAgICAgIHdpdGggc3VwcG9ydC5jYXB0dXJlZF9vdXRwdXQoInN0ZGVyciIpIGFzIHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZikKKyAgICAgICAgcyA9IHMuZ2V0dmFsdWUoKS5zdHJpcCgpCisgICAgICAgIGlmIHM6CisgICAgICAgICAgICAjIFRoZSBkZXN0cnVjdG9yICptYXkqIGhhdmUgcHJpbnRlZCBhbiB1bnJhaXNhYmxlIGVycm9yLCBjaGVjayBpdAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocy5zcGxpdGxpbmVzKCkpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiRXhjZXB0aW9uIElPRXJyb3I6ICIpLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoIiBpZ25vcmVkIiksIHMpCisKKyAgICAjIFN5c3RlbWF0aWMgdGVzdHMgb2YgdGhlIHRleHQgSS9PIEFQSQorCisgICAgZGVmIHRlc3RfYmFzaWNfaW8oc2VsZik6CisgICAgICAgIGZvciBjaHVua3NpemUgaW4gKDEsIDIsIDMsIDQsIDUsIDE1LCAxNiwgMTcsIDMxLCAzMiwgMzMsIDYzLCA2NCwgNjUpOgorICAgICAgICAgICAgZm9yIGVuYyBpbiAiYXNjaWkiLCAibGF0aW4xIiwgInV0ZjgiIDojICwgInV0Zi0xNi1iZSIsICJ1dGYtMTYtbGUiOgorICAgICAgICAgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3KyIsIGVuY29kaW5nPWVuYykKKyAgICAgICAgICAgICAgICBmLl9DSFVOS19TSVpFID0gY2h1bmtzaXplCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKCJhYmMiKSwgMykKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicisiLCBlbmNvZGluZz1lbmMpCisgICAgICAgICAgICAgICAgZi5fQ0hVTktfU0laRSA9IGNodW5rc2l6ZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgImFiYyIpCisgICAgICAgICAgICAgICAgY29va2llID0gZi50ZWxsKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2VlaygwKSwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZChOb25lKSwgImFiYyIpCisgICAgICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMiksICJhYiIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMSksICJjIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgIiIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgIiIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgY29va2llKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDApLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDAsIDIpLCBjb29raWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKCJkZWYiKSwgMykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2Vlayhjb29raWUpLCBjb29raWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgImRlZiIpCisgICAgICAgICAgICAgICAgaWYgZW5jLnN0YXJ0c3dpdGgoInV0ZiIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm11bHRpX2xpbmVfdGVzdChmLCBlbmMpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgbXVsdGlfbGluZV90ZXN0KHNlbGYsIGYsIGVuYyk6CisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBmLnRydW5jYXRlKCkKKyAgICAgICAgc2FtcGxlID0gInNceGZmXHUwZmZmXHVmZmZmIgorICAgICAgICB3bGluZXMgPSBbXQorICAgICAgICBmb3Igc2l6ZSBpbiAoMCwgMSwgMiwgMywgNCwgNSwgMzAsIDMxLCAzMiwgMzMsIDYyLCA2MywgNjQsIDY1LCAxMDAwKToKKyAgICAgICAgICAgIGNoYXJzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpemUpOgorICAgICAgICAgICAgICAgIGNoYXJzLmFwcGVuZChzYW1wbGVbaSAlIGxlbihzYW1wbGUpXSkKKyAgICAgICAgICAgIGxpbmUgPSAiIi5qb2luKGNoYXJzKSArICJcbiIKKyAgICAgICAgICAgIHdsaW5lcy5hcHBlbmQoKGYudGVsbCgpLCBsaW5lKSkKKyAgICAgICAgICAgIGYud3JpdGUobGluZSkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHJsaW5lcyA9IFtdCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBwb3MgPSBmLnRlbGwoKQorICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHJsaW5lcy5hcHBlbmQoKHBvcywgbGluZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmxpbmVzLCB3bGluZXMpCisKKyAgICBkZWYgdGVzdF90ZWxsaW5nKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidysiLCBlbmNvZGluZz0idXRmOCIpCisgICAgICAgIHAwID0gZi50ZWxsKCkKKyAgICAgICAgZi53cml0ZSgiXHhmZlxuIikKKyAgICAgICAgcDEgPSBmLnRlbGwoKQorICAgICAgICBmLndyaXRlKCJceGZmXG4iKQorICAgICAgICBwMiA9IGYudGVsbCgpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksICJceGZmXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWRsaW5lKCksICJceGZmXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBwMikKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsICJceGZmXG4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgZi50ZWxsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCBwMikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9zZWVraW5nKHNlbGYpOgorICAgICAgICBjaHVua19zaXplID0gX2RlZmF1bHRfY2h1bmtfc2l6ZSgpCisgICAgICAgIHByZWZpeF9zaXplID0gY2h1bmtfc2l6ZSAtIDIKKyAgICAgICAgdV9wcmVmaXggPSAiYSIgKiBwcmVmaXhfc2l6ZQorICAgICAgICBwcmVmaXggPSBieXRlcyh1X3ByZWZpeC5lbmNvZGUoInV0Zi04IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHVfcHJlZml4KSwgbGVuKHByZWZpeCkpCisgICAgICAgIHVfc3VmZml4ID0gIlx1ODg4OFxuIgorICAgICAgICBzdWZmaXggPSBieXRlcyh1X3N1ZmZpeC5lbmNvZGUoInV0Zi04IikpCisgICAgICAgIGxpbmUgPSBwcmVmaXggKyBzdWZmaXgKKyAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgZi53cml0ZShsaW5lKjIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiciIsIGVuY29kaW5nPSJ1dGYtOCIpCisgICAgICAgIHMgPSBmLnJlYWQocHJlZml4X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcHJlZml4LmRlY29kZSgiYXNjaWkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgcHJlZml4X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkbGluZSgpLCB1X3N1ZmZpeCkKKworICAgIGRlZiB0ZXN0X3NlZWtpbmdfdG9vKHNlbGYpOgorICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYSBzcGVjaWZpYyBidWcKKyAgICAgICAgZGF0YSA9IGInXHhlMFx4YmZceGJmXG4nCisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyIiwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAgICAgZi5fQ0hVTktfU0laRSAgIyBKdXN0IHRlc3QgdGhhdCBpdCBleGlzdHMKKyAgICAgICAgZi5fQ0hVTktfU0laRSA9IDIKKyAgICAgICAgZi5yZWFkbGluZSgpCisgICAgICAgIGYudGVsbCgpCisKKyAgICBkZWYgdGVzdF9zZWVrX2FuZF90ZWxsKHNlbGYpOgorICAgICAgICAjVGVzdCBzZWVrL3RlbGwgdXNpbmcgdGhlIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyLgorICAgICAgICAjIE1ha2UgdGVzdCBmYXN0ZXIgYnkgZG9pbmcgc21hbGxlciBzZWVrcworICAgICAgICBDSFVOS19TSVpFID0gMTI4CisKKyAgICAgICAgZGVmIHRlc3Rfc2Vla19hbmRfdGVsbF93aXRoX2RhdGEoZGF0YSwgbWluX3Bvcz0wKToKKyAgICAgICAgICAgICIiIlRlbGwvc2VlayB0byB2YXJpb3VzIHBvaW50cyB3aXRoaW4gYSBkYXRhIHN0cmVhbSBhbmQgZW5zdXJlCisgICAgICAgICAgICB0aGF0IHRoZSBkZWNvZGVkIGRhdGEgcmV0dXJuZWQgYnkgcmVhZCgpIGlzIGNvbnNpc3RlbnQuIiIiCisgICAgICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAnd2InKQorICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCBlbmNvZGluZz0ndGVzdF9kZWNvZGVyJykKKyAgICAgICAgICAgIGYuX0NIVU5LX1NJWkUgPSBDSFVOS19TSVpFCisgICAgICAgICAgICBkZWNvZGVkID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtaW5fcG9zLCBsZW4oZGVjb2RlZCkgKyAxKTogIyBzZWVrIHBvc2l0aW9ucworICAgICAgICAgICAgICAgIGZvciBqIGluIFsxLCA1LCBsZW4oZGVjb2RlZCkgLSBpXTogIyByZWFkIGxlbmd0aHMKKyAgICAgICAgICAgICAgICAgICAgZiA9IHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgZW5jb2Rpbmc9J3Rlc3RfZGVjb2RlcicpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKGkpLCBkZWNvZGVkWzppXSkKKyAgICAgICAgICAgICAgICAgICAgY29va2llID0gZi50ZWxsKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoaiksIGRlY29kZWRbaTppICsgal0pCisgICAgICAgICAgICAgICAgICAgIGYuc2Vlayhjb29raWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGRlY29kZWRbaTpdKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAjIEVuYWJsZSB0aGUgdGVzdCBkZWNvZGVyLgorICAgICAgICBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2Rlci5jb2RlY0VuYWJsZWQgPSAxCisKKyAgICAgICAgIyBSdW4gdGhlIHRlc3RzLgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFRyeSBlYWNoIHRlc3QgY2FzZS4KKyAgICAgICAgICAgIGZvciBpbnB1dCwgXywgXyBpbiBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2RlclRlc3QudGVzdF9jYXNlczoKKyAgICAgICAgICAgICAgICB0ZXN0X3NlZWtfYW5kX3RlbGxfd2l0aF9kYXRhKGlucHV0KQorCisgICAgICAgICAgICAjIFBvc2l0aW9uIGVhY2ggdGVzdCBjYXNlIHNvIHRoYXQgaXQgY3Jvc3NlcyBhIGNodW5rIGJvdW5kYXJ5LgorICAgICAgICAgICAgZm9yIGlucHV0LCBfLCBfIGluIFN0YXRlZnVsSW5jcmVtZW50YWxEZWNvZGVyVGVzdC50ZXN0X2Nhc2VzOgorICAgICAgICAgICAgICAgIG9mZnNldCA9IENIVU5LX1NJWkUgLSBsZW4oaW5wdXQpLy8yCisgICAgICAgICAgICAgICAgcHJlZml4ID0gYicuJypvZmZzZXQKKyAgICAgICAgICAgICAgICAjIERvbid0IGJvdGhlciBzZWVraW5nIGludG8gdGhlIHByZWZpeCAodGFrZXMgdG9vIGxvbmcpLgorICAgICAgICAgICAgICAgIG1pbl9wb3MgPSBvZmZzZXQqMgorICAgICAgICAgICAgICAgIHRlc3Rfc2Vla19hbmRfdGVsbF93aXRoX2RhdGEocHJlZml4ICsgaW5wdXQsIG1pbl9wb3MpCisKKyAgICAgICAgIyBFbnN1cmUgb3VyIHRlc3QgZGVjb2RlciB3b24ndCBpbnRlcmZlcmUgd2l0aCBzdWJzZXF1ZW50IHRlc3RzLgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgU3RhdGVmdWxJbmNyZW1lbnRhbERlY29kZXIuY29kZWNFbmFibGVkID0gMAorCisgICAgZGVmIHRlc3RfZW5jb2RlZF93cml0ZXMoc2VsZik6CisgICAgICAgIGRhdGEgPSAiMTIzNDU2Nzg5MCIKKyAgICAgICAgdGVzdHMgPSAoInV0Zi0xNiIsCisgICAgICAgICAgICAgICAgICJ1dGYtMTYtbGUiLAorICAgICAgICAgICAgICAgICAidXRmLTE2LWJlIiwKKyAgICAgICAgICAgICAgICAgInV0Zi0zMiIsCisgICAgICAgICAgICAgICAgICJ1dGYtMzItbGUiLAorICAgICAgICAgICAgICAgICAidXRmLTMyLWJlIikKKyAgICAgICAgZm9yIGVuY29kaW5nIGluIHRlc3RzOgorICAgICAgICAgICAgYnVmID0gc2VsZi5CeXRlc0lPKCkKKyAgICAgICAgICAgIGYgPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmLCBlbmNvZGluZz1lbmNvZGluZykKKyAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIEJPTSBpcyB3cml0dGVuIG9ubHkgb25jZSAoc2VlIGlzc3VlMTc1MykuCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGRhdGEgKiAyKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkYXRhICogMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLmdldHZhbHVlKCksIChkYXRhICogMikuZW5jb2RlKGVuY29kaW5nKSkKKworICAgIGRlZiB0ZXN0X3VucmVhZGFibGUoc2VsZik6CisgICAgICAgIGNsYXNzIFVuUmVhZGFibGUoc2VsZi5CeXRlc0lPKToKKyAgICAgICAgICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKFVuUmVhZGFibGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgdHh0LnJlYWQpCisKKyAgICBkZWYgdGVzdF9yZWFkX29uZV9ieV9vbmUoc2VsZik6CisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oYiJBQVxyXG5CQiIpKQorICAgICAgICByZWFkcyA9ICIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjID0gdHh0LnJlYWQoMSkKKyAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZWFkcyArPSBjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZHMsICJBQVxuQkIiKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKGIiQUFcbkJCXG5DQyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4dC5yZWFkbGluZXMoKSwgWyJBQVxuIiwgIkJCXG4iLCAiQ0MiXSkKKyAgICAgICAgdHh0LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eHQucmVhZGxpbmVzKE5vbmUpLCBbIkFBXG4iLCAiQkJcbiIsICJDQyJdKQorICAgICAgICB0eHQuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4dC5yZWFkbGluZXMoNSksIFsiQUFcbiIsICJCQlxuIl0pCisKKyAgICAjIHJlYWQgaW4gYW1vdW50cyBlcXVhbCB0byBUZXh0SU9XcmFwcGVyLl9DSFVOS19TSVpFIHdoaWNoIGlzIDEyOC4KKyAgICBkZWYgdGVzdF9yZWFkX2J5X2NodW5rKHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSAiXHJcbiIgc3RyYWRkbGVzIDEyOCBjaGFyIGJvdW5kYXJ5LgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKGIiQSIgKiAxMjcgKyBiIlxyXG5CIikpCisgICAgICAgIHJlYWRzID0gIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGMgPSB0eHQucmVhZCgxMjgpCisgICAgICAgICAgICBpZiBub3QgYzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmVhZHMgKz0gYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRzLCAiQSIqMTI3KyJcbkIiKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lcyhzZWxmKToKKyAgICAgICAgbCA9IFsnYWInLCAnY2QnLCAnZWYnXQorICAgICAgICBidWYgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmKQorICAgICAgICB0eHQud3JpdGVsaW5lcyhsKQorICAgICAgICB0eHQuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5nZXR2YWx1ZSgpLCBiJ2FiY2RlZicpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX3VzZXJsaXN0KHNlbGYpOgorICAgICAgICBsID0gVXNlckxpc3QoWydhYicsICdjZCcsICdlZiddKQorICAgICAgICBidWYgPSBzZWxmLkJ5dGVzSU8oKQorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoYnVmKQorICAgICAgICB0eHQud3JpdGVsaW5lcyhsKQorICAgICAgICB0eHQuZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5nZXR2YWx1ZSgpLCBiJ2FiY2RlZicpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX2Vycm9yKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHh0LndyaXRlbGluZXMsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eHQud3JpdGVsaW5lcywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eHQud3JpdGVsaW5lcywgYidhYmMnKQorCisgICAgZGVmIHRlc3RfaXNzdWUxMzk1XzEoc2VsZik6CisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oc2VsZi50ZXN0ZGF0YSksIGVuY29kaW5nPSJhc2NpaSIpCisKKyAgICAgICAgIyByZWFkIG9uZSBjaGFyIGF0IGEgdGltZQorICAgICAgICByZWFkcyA9ICIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjID0gdHh0LnJlYWQoMSkKKyAgICAgICAgICAgIGlmIG5vdCBjOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZWFkcyArPSBjCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZHMsIHNlbGYubm9ybWFsaXplZCkKKworICAgIGRlZiB0ZXN0X2lzc3VlMTM5NV8yKHNlbGYpOgorICAgICAgICB0eHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICB0eHQuX0NIVU5LX1NJWkUgPSA0CisKKyAgICAgICAgcmVhZHMgPSAiIgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgYyA9IHR4dC5yZWFkKDQpCisgICAgICAgICAgICBpZiBub3QgYzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmVhZHMgKz0gYworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRzLCBzZWxmLm5vcm1hbGl6ZWQpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEzOTVfMyhzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKSwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgdHh0Ll9DSFVOS19TSVpFID0gNAorCisgICAgICAgIHJlYWRzID0gdHh0LnJlYWQoNCkKKyAgICAgICAgcmVhZHMgKz0gdHh0LnJlYWQoNCkKKyAgICAgICAgcmVhZHMgKz0gdHh0LnJlYWRsaW5lKCkKKyAgICAgICAgcmVhZHMgKz0gdHh0LnJlYWRsaW5lKCkKKyAgICAgICAgcmVhZHMgKz0gdHh0LnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkcywgc2VsZi5ub3JtYWxpemVkKQorCisgICAgZGVmIHRlc3RfaXNzdWUxMzk1XzQoc2VsZik6CisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oc2VsZi50ZXN0ZGF0YSksIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIHR4dC5fQ0hVTktfU0laRSA9IDQKKworICAgICAgICByZWFkcyA9IHR4dC5yZWFkKDQpCisgICAgICAgIHJlYWRzICs9IHR4dC5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkcywgc2VsZi5ub3JtYWxpemVkKQorCisgICAgZGVmIHRlc3RfaXNzdWUxMzk1XzUoc2VsZik6CisgICAgICAgIHR4dCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oc2VsZi50ZXN0ZGF0YSksIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgIHR4dC5fQ0hVTktfU0laRSA9IDQKKworICAgICAgICByZWFkcyA9IHR4dC5yZWFkKDQpCisgICAgICAgIHBvcyA9IHR4dC50ZWxsKCkKKyAgICAgICAgdHh0LnNlZWsoMCkKKyAgICAgICAgdHh0LnNlZWsocG9zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4dC5yZWFkKDQpLCAiQkJCXG4iKQorCisgICAgZGVmIHRlc3RfaXNzdWUyMjgyKHNlbGYpOgorICAgICAgICBidWZmZXIgPSBzZWxmLkJ5dGVzSU8oc2VsZi50ZXN0ZGF0YSkKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGJ1ZmZlciwgZW5jb2Rpbmc9ImFzY2lpIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmZlci5zZWVrYWJsZSgpLCB0eHQuc2Vla2FibGUoKSkKKworICAgIGRlZiB0ZXN0X2FwcGVuZF9ib20oc2VsZik6CisgICAgICAgICMgVGhlIEJPTSBpcyBub3Qgd3JpdHRlbiBhZ2FpbiB3aGVuIGFwcGVuZGluZyB0byBhIG5vbi1lbXB0eSBmaWxlCisgICAgICAgIGZpbGVuYW1lID0gc3VwcG9ydC5URVNURk4KKyAgICAgICAgZm9yIGNoYXJzZXQgaW4gKCd1dGYtOC1zaWcnLCAndXRmLTE2JywgJ3V0Zi0zMicpOgorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oZmlsZW5hbWUsICd3JywgZW5jb2Rpbmc9Y2hhcnNldCkgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdhYWEnKQorICAgICAgICAgICAgICAgIHBvcyA9IGYudGVsbCgpCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnYWFhJy5lbmNvZGUoY2hhcnNldCkpCisKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKGZpbGVuYW1lLCAnYScsIGVuY29kaW5nPWNoYXJzZXQpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgneHh4JykKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKGZpbGVuYW1lLCAncmInKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdhYWF4eHgnLmVuY29kZShjaGFyc2V0KSkKKworICAgIGRlZiB0ZXN0X3NlZWtfYm9tKHNlbGYpOgorICAgICAgICAjIFNhbWUgdGVzdCwgYnV0IHdoZW4gc2Vla2luZyBtYW51YWxseQorICAgICAgICBmaWxlbmFtZSA9IHN1cHBvcnQuVEVTVEZOCisgICAgICAgIGZvciBjaGFyc2V0IGluICgndXRmLTgtc2lnJywgJ3V0Zi0xNicsICd1dGYtMzInKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKGZpbGVuYW1lLCAndycsIGVuY29kaW5nPWNoYXJzZXQpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgnYWFhJykKKyAgICAgICAgICAgICAgICBwb3MgPSBmLnRlbGwoKQorICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oZmlsZW5hbWUsICdyKycsIGVuY29kaW5nPWNoYXJzZXQpIGFzIGY6CisgICAgICAgICAgICAgICAgZi5zZWVrKHBvcykKKyAgICAgICAgICAgICAgICBmLndyaXRlKCd6enonKQorICAgICAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgICAgIGYud3JpdGUoJ2JiYicpCisgICAgICAgICAgICB3aXRoIHNlbGYub3BlbihmaWxlbmFtZSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnYmJienp6Jy5lbmNvZGUoY2hhcnNldCkpCisKKyAgICBkZWYgdGVzdF9lcnJvcnNfcHJvcGVydHkoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidyIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuZXJyb3JzLCAic3RyaWN0IikKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3IiwgZXJyb3JzPSJyZXBsYWNlIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5lcnJvcnMsICJyZXBsYWNlIikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgZGVmIHRlc3RfdGhyZWFkc193cml0ZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZTY3NTA6IGNvbmN1cnJlbnQgd3JpdGVzIGNvdWxkIGR1cGxpY2F0ZSBkYXRhCisgICAgICAgIGV2ZW50ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3IiwgYnVmZmVyaW5nPTEpIGFzIGY6CisgICAgICAgICAgICBkZWYgcnVuKG4pOgorICAgICAgICAgICAgICAgIHRleHQgPSAiVGhyZWFkJTAzZFxuIiAlIG4KKyAgICAgICAgICAgICAgICBldmVudC53YWl0KCkKKyAgICAgICAgICAgICAgICBmLndyaXRlKHRleHQpCisgICAgICAgICAgICB0aHJlYWRzID0gW3RocmVhZGluZy5UaHJlYWQodGFyZ2V0PWxhbWJkYSBuPXg6IHJ1bihuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2UoMjApXQorICAgICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMikKKyAgICAgICAgICAgIGV2ZW50LnNldCgpCisgICAgICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOKSBhcyBmOgorICAgICAgICAgICAgY29udGVudCA9IGYucmVhZCgpCisgICAgICAgICAgICBmb3IgbiBpbiByYW5nZSgyMCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb250ZW50LmNvdW50KCJUaHJlYWQlMDNkXG4iICUgbiksIDEpCisKKyAgICBkZWYgdGVzdF9mbHVzaF9lcnJvcl9vbl9jbG9zZShzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKSwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgZGVmIGJhZF9mbHVzaCgpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvcigpCisgICAgICAgIHR4dC5mbHVzaCA9IGJhZF9mbHVzaAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB0eHQuY2xvc2UpICMgZXhjZXB0aW9uIG5vdCBzd2FsbG93ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR4dC5jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9tdWx0aV9jbG9zZShzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKSwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgdHh0LmNsb3NlKCkKKyAgICAgICAgdHh0LmNsb3NlKCkKKyAgICAgICAgdHh0LmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHh0LmZsdXNoKQorCisgICAgZGVmIHRlc3RfcmVhZG9ubHlfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgdHh0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhzZWxmLnRlc3RkYXRhKSwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgYnVmID0gc2VsZi5CeXRlc0lPKHNlbGYudGVzdGRhdGEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpKToKKyAgICAgICAgICAgIHR4dC5idWZmZXIgPSBidWYKKworICAgIGRlZiB0ZXN0X3JlYWRfbm9uYnl0ZXMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE3MTA2CisgICAgICAgICMgQ3Jhc2ggd2hlbiB1bmRlcmx5aW5nIHJlYWQoKSByZXR1cm5zIG5vbi1ieXRlcworICAgICAgICBjbGFzcyBOb25ieXRlc1N0cmVhbShzZWxmLlN0cmluZ0lPKToKKyAgICAgICAgICAgIHJlYWQxID0gc2VsZi5TdHJpbmdJTy5yZWFkCisgICAgICAgIGNsYXNzIE5vbmJ5dGVzU3RyZWFtKHNlbGYuU3RyaW5nSU8pOgorICAgICAgICAgICAgcmVhZDEgPSBzZWxmLlN0cmluZ0lPLnJlYWQKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihOb25ieXRlc1N0cmVhbSgnYScpKQorICAgICAgICB3aXRoIHNlbGYubWF5YmVSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHQucmVhZCgxKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKE5vbmJ5dGVzU3RyZWFtKCdhJykpCisgICAgICAgIHdpdGggc2VsZi5tYXliZVJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdC5yZWFkbGluZSgpCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoTm9uYnl0ZXNTdHJlYW0oJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnJlYWQoKSwgdSdhJykKKworICAgIGRlZiB0ZXN0X2lsbGVnYWxfZGVjb2RlcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTcxMDYKKyAgICAgICAgIyBDcmFzaCB3aGVuIGRlY29kZXIgcmV0dXJucyBub24tc3RyaW5nCisgICAgICAgIHQgPSBzZWxmLlRleHRJT1dyYXBwZXIoc2VsZi5CeXRlc0lPKGInYWFhYWFhJyksIG5ld2xpbmU9J1xuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZz0ncXVvcHJpX2NvZGVjJykKKyAgICAgICAgd2l0aCBzZWxmLm1heWJlUmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICB0LnJlYWQoMSkKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihzZWxmLkJ5dGVzSU8oYidhYWFhYWEnKSwgbmV3bGluZT0nXG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kaW5nPSdxdW9wcmlfY29kZWMnKQorICAgICAgICB3aXRoIHNlbGYubWF5YmVSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgIHQucmVhZGxpbmUoKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKHNlbGYuQnl0ZXNJTyhiJ2FhYWFhYScpLCBuZXdsaW5lPSdcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc9J3F1b3ByaV9jb2RlYycpCisgICAgICAgIHdpdGggc2VsZi5tYXliZVJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgICAgICAgdC5yZWFkKCkKKworCitjbGFzcyBDVGV4dElPV3JhcHBlclRlc3QoVGV4dElPV3JhcHBlclRlc3QpOgorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6YXRpb24oc2VsZik6CisgICAgICAgIHIgPSBzZWxmLkJ5dGVzSU8oYiJceGMzXHhhOVxuXG4iKQorICAgICAgICBiID0gc2VsZi5CdWZmZXJlZFJlYWRlcihyLCAxMDAwKQorICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5fX2luaXRfXywgYiwgbmV3bGluZT00MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5yZWFkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0Ll9faW5pdF9fLCBiLCBuZXdsaW5lPSd4eXp6eScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQucmVhZCkKKworICAgIGRlZiB0ZXN0X2dhcmJhZ2VfY29sbGVjdGlvbihzZWxmKToKKyAgICAgICAgIyBDIFRleHRJT1dyYXBwZXIgb2JqZWN0cyBhcmUgY29sbGVjdGVkLCBhbmQgY29sbGVjdGluZyB0aGVtIGZsdXNoZXMKKyAgICAgICAgIyBhbGwgZGF0YSB0byBkaXNrLgorICAgICAgICAjIFRoZSBQeXRob24gdmVyc2lvbiBoYXMgX19kZWxfXywgc28gaXQgZW5kcyBpbiBnYy5nYXJiYWdlIGluc3RlYWQuCisgICAgICAgIHJhd2lvID0gaW8uRmlsZUlPKHN1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICBiID0gc2VsZi5CdWZmZXJlZFdyaXRlcihyYXdpbykKKyAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0iYXNjaWkiKQorICAgICAgICB0LndyaXRlKCI0NTZkZWYiKQorICAgICAgICB0LnggPSB0CisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYodCkKKyAgICAgICAgZGVsIHQKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiI0NTZkZWYiKQorCisgICAgZGVmIHRlc3RfcndwYWlyX2NsZWFyZWRfYmVmb3JlX3RleHRpbyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMzA3MDogVGV4dElPV3JhcHBlcidzIGZpbmFsaXphdGlvbiB3b3VsZCBjcmFzaCB3aGVuIGNhbGxlZAorICAgICAgICAjIGFmdGVyIHRoZSByZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgQnVmZmVyZWRSV1BhaXIncyB3cml0ZXIgZ290CisgICAgICAgICMgY2xlYXJlZCBieSB0aGUgR0MuCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDApOgorICAgICAgICAgICAgYjEgPSBzZWxmLkJ1ZmZlcmVkUldQYWlyKHNlbGYuTW9ja1Jhd0lPKCksIHNlbGYuTW9ja1Jhd0lPKCkpCisgICAgICAgICAgICB0MSA9IHNlbGYuVGV4dElPV3JhcHBlcihiMSwgZW5jb2Rpbmc9ImFzY2lpIikKKyAgICAgICAgICAgIGIyID0gc2VsZi5CdWZmZXJlZFJXUGFpcihzZWxmLk1vY2tSYXdJTygpLCBzZWxmLk1vY2tSYXdJTygpKQorICAgICAgICAgICAgdDIgPSBzZWxmLlRleHRJT1dyYXBwZXIoYjIsIGVuY29kaW5nPSJhc2NpaSIpCisgICAgICAgICAgICAjIGNpcmN1bGFyIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIHQxLmJ1ZGR5ID0gdDIKKyAgICAgICAgICAgIHQyLmJ1ZGR5ID0gdDEKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKworICAgIG1heWJlUmFpc2VzID0gdW5pdHRlc3QuVGVzdENhc2UuYXNzZXJ0UmFpc2VzCisKKworY2xhc3MgUHlUZXh0SU9XcmFwcGVyVGVzdChUZXh0SU9XcmFwcGVyVGVzdCk6CisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgbWF5YmVSYWlzZXMoc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHlpZWxkCisKKworY2xhc3MgSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX25ld2xpbmVfZGVjb2RpbmdfdXRmOChzZWxmLCBkZWNvZGVyKToKKyAgICAgICAgIyBVVEYtOCBzcGVjaWZpYyB0ZXN0cyBmb3IgYSBuZXdsaW5lIGRlY29kZXIKKyAgICAgICAgZGVmIF9jaGVja19kZWNvZGUoYiwgcywgKiprd2FyZ3MpOgorICAgICAgICAgICAgIyBXZSBleGVyY2lzZSBnZXRzdGF0ZSgpIC8gc2V0c3RhdGUoKSBhcyB3ZWxsIGFzIGRlY29kZSgpCisgICAgICAgICAgICBzdGF0ZSA9IGRlY29kZXIuZ2V0c3RhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZShiLCAqKmt3YXJncyksIHMpCisgICAgICAgICAgICBkZWNvZGVyLnNldHN0YXRlKHN0YXRlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZShiLCAqKmt3YXJncyksIHMpCisKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4ZThceGEyXHg4OCcsICJcdTg4ODgiKQorCisgICAgICAgIF9jaGVja19kZWNvZGUoYidceGU4JywgIiIpCisgICAgICAgIF9jaGVja19kZWNvZGUoYidceGEyJywgIiIpCisgICAgICAgIF9jaGVja19kZWNvZGUoYidceDg4JywgIlx1ODg4OCIpCisKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4ZTgnLCAiIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4YTInLCAiIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4ODgnLCAiXHU4ODg4IikKKworICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHhlOCcsICIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZXIuZGVjb2RlLCBiJycsIGZpbmFsPVRydWUpCisKKyAgICAgICAgZGVjb2Rlci5yZXNldCgpCisgICAgICAgIF9jaGVja19kZWNvZGUoYidcbicsICJcbiIpCisgICAgICAgIF9jaGVja19kZWNvZGUoYidccicsICIiKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInJywgIlxuIiwgZmluYWw9VHJ1ZSkKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1xyJywgIlxuIiwgZmluYWw9VHJ1ZSkKKworICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHInLCAiIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ2EnLCAiXG5hIikKKworICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHJcclxuJywgIlxuXG4iKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHInLCAiIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1xyJywgIlxuIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1xuYScsICJcbmEiKQorCisgICAgICAgIF9jaGVja19kZWNvZGUoYidceGU4XHhhMlx4ODhcclxuJywgIlx1ODg4OFxuIikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1x4ZThceGEyXHg4OCcsICJcdTg4ODgiKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXG4nLCAiXG4iKQorICAgICAgICBfY2hlY2tfZGVjb2RlKGInXHhlOFx4YTJceDg4XHInLCAiXHU4ODg4IikKKyAgICAgICAgX2NoZWNrX2RlY29kZShiJ1xuJywgIlxuIikKKworICAgIGRlZiBjaGVja19uZXdsaW5lX2RlY29kaW5nKHNlbGYsIGRlY29kZXIsIGVuY29kaW5nKToKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykoKQorICAgICAgICAgICAgZGVmIF9kZWNvZGVfYnl0ZXdpc2Uocyk6CisgICAgICAgICAgICAgICAgIyBEZWNvZGUgb25lIGJ5dGUgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgZm9yIGIgaW4gZW5jb2Rlci5lbmNvZGUocyk6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGVjb2Rlci5kZWNvZGUoYikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGVyID0gTm9uZQorICAgICAgICAgICAgZGVmIF9kZWNvZGVfYnl0ZXdpc2Uocyk6CisgICAgICAgICAgICAgICAgIyBEZWNvZGUgb25lIGNoYXIgYXQgYSB0aW1lCisgICAgICAgICAgICAgICAgZm9yIGMgaW4gczoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkZWNvZGVyLmRlY29kZShjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLm5ld2xpbmVzLCBOb25lKQorICAgICAgICBfZGVjb2RlX2J5dGV3aXNlKCJhYmNcblxyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLm5ld2xpbmVzLCAnXG4nKQorICAgICAgICBfZGVjb2RlX2J5dGV3aXNlKCJcbmFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5uZXdsaW5lcywgKCdcbicsICdcclxuJykpCisgICAgICAgIF9kZWNvZGVfYnl0ZXdpc2UoImFiY1xyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLm5ld2xpbmVzLCAoJ1xuJywgJ1xyXG4nKSkKKyAgICAgICAgX2RlY29kZV9ieXRld2lzZSgiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLm5ld2xpbmVzLCAoJ1xyJywgJ1xuJywgJ1xyXG4nKSkKKyAgICAgICAgX2RlY29kZV9ieXRld2lzZSgiYWJjXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIiLmpvaW4ocmVzdWx0KSwgImFiY1xuXG5hYmNhYmNcbmFiY2FiYyIpCisgICAgICAgIGRlY29kZXIucmVzZXQoKQorICAgICAgICBpbnB1dCA9ICJhYmMiCisgICAgICAgIGlmIGVuY29kZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBlbmNvZGVyLnJlc2V0KCkKKyAgICAgICAgICAgIGlucHV0ID0gZW5jb2Rlci5lbmNvZGUoaW5wdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoaW5wdXQpLCAiYWJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLm5ld2xpbmVzLCBOb25lKQorCisgICAgZGVmIHRlc3RfbmV3bGluZV9kZWNvZGVyKHNlbGYpOgorICAgICAgICBlbmNvZGluZ3MgPSAoCisgICAgICAgICAgICAjIE5vbmUgbWVhbmluZyB0aGUgSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlciB0YWtlcyB1bmljb2RlIGlucHV0CisgICAgICAgICAgICAjIHJhdGhlciB0aGFuIGJ5dGVzIGlucHV0CisgICAgICAgICAgICBOb25lLCAndXRmLTgnLCAnbGF0aW4tMScsCisgICAgICAgICAgICAndXRmLTE2JywgJ3V0Zi0xNi1sZScsICd1dGYtMTYtYmUnLAorICAgICAgICAgICAgJ3V0Zi0zMicsICd1dGYtMzItbGUnLCAndXRmLTMyLWJlJywKKyAgICAgICAgKQorICAgICAgICBmb3IgZW5jIGluIGVuY29kaW5nczoKKyAgICAgICAgICAgIGRlY29kZXIgPSBlbmMgYW5kIGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoZW5jKSgpCisgICAgICAgICAgICBkZWNvZGVyID0gc2VsZi5JbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyKGRlY29kZXIsIHRyYW5zbGF0ZT1UcnVlKQorICAgICAgICAgICAgc2VsZi5jaGVja19uZXdsaW5lX2RlY29kaW5nKGRlY29kZXIsIGVuYykKKyAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoInV0Zi04IikoKQorICAgICAgICBkZWNvZGVyID0gc2VsZi5JbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyKGRlY29kZXIsIHRyYW5zbGF0ZT1UcnVlKQorICAgICAgICBzZWxmLmNoZWNrX25ld2xpbmVfZGVjb2RpbmdfdXRmOChkZWNvZGVyKQorCisgICAgZGVmIHRlc3RfbmV3bGluZV9ieXRlcyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA1NDMzOiBFeGNlc3NpdmUgb3B0aW1pemF0aW9uIGluIEluY3JlbWVudGFsTmV3bGluZURlY29kZXIKKyAgICAgICAgZGVmIF9jaGVjayhkZWMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWMubmV3bGluZXMsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlYy5kZWNvZGUoIlx1MEQwMCIpLCAiXHUwRDAwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjLm5ld2xpbmVzLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWMuZGVjb2RlKCJcdTBBMDAiKSwgIlx1MEEwMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlYy5uZXdsaW5lcywgTm9uZSkKKyAgICAgICAgZGVjID0gc2VsZi5JbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyKE5vbmUsIHRyYW5zbGF0ZT1GYWxzZSkKKyAgICAgICAgX2NoZWNrKGRlYykKKyAgICAgICAgZGVjID0gc2VsZi5JbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyKE5vbmUsIHRyYW5zbGF0ZT1UcnVlKQorICAgICAgICBfY2hlY2soZGVjKQorCitjbGFzcyBDSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlclRlc3QoSW5jcmVtZW50YWxOZXdsaW5lRGVjb2RlclRlc3QpOgorICAgIHBhc3MKKworY2xhc3MgUHlJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyVGVzdChJbmNyZW1lbnRhbE5ld2xpbmVEZWNvZGVyVGVzdCk6CisgICAgcGFzcworCisKKyMgWFhYIFRlc3RzIGZvciBvcGVuKCkKKworY2xhc3MgTWlzY0lPVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN1cHBvcnQudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfX19hbGxfXyhzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5pby5fX2FsbF9fOgorICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihzZWxmLmlvLCBuYW1lLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iaiBpcyBub3QgTm9uZSwgbmFtZSkKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gIm9wZW4iOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmICJlcnJvciIgaW4gbmFtZS5sb3dlcigpIG9yIG5hbWUgPT0gIlVuc3VwcG9ydGVkT3BlcmF0aW9uIjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhvYmosIEV4Y2VwdGlvbiksIG5hbWUpCisgICAgICAgICAgICBlbGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoIlNFRUtfIik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Mob2JqLCBzZWxmLklPQmFzZSkpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzKHNlbGYpOgorICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiLCBidWZmZXJpbmc9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm1vZGUsICJ3YiIpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGYgPSBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJVIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm5hbWUsICAgICAgICAgICAgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5idWZmZXIubmFtZSwgICAgIHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuYnVmZmVyLnJhdy5uYW1lLCBzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm1vZGUsICAgICAgICAgICAgIlUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuYnVmZmVyLm1vZGUsICAgICAicmIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuYnVmZmVyLnJhdy5tb2RlLCAicmIiKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidysiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubW9kZSwgICAgICAgICAgICAidysiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuYnVmZmVyLm1vZGUsICAgICAicmIrIikgIyBEb2VzIGl0IHJlYWxseSBtYXR0ZXI/CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5idWZmZXIucmF3Lm1vZGUsICJyYisiKQorCisgICAgICAgIGcgPSBzZWxmLm9wZW4oZi5maWxlbm8oKSwgIndiIiwgY2xvc2VmZD1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLm1vZGUsICAgICAid2IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcucmF3Lm1vZGUsICJ3YiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZy5uYW1lLCAgICAgZi5maWxlbm8oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnLnJhdy5uYW1lLCBmLmZpbGVubygpKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9pb19hZnRlcl9jbG9zZShzZWxmKToKKyAgICAgICAgZm9yIGt3YXJncyBpbiBbCisgICAgICAgICAgICAgICAgeyJtb2RlIjogIncifSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAid2IifSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAidyIsICJidWZmZXJpbmciOiAxfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAidyIsICJidWZmZXJpbmciOiAyfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAid2IiLCAiYnVmZmVyaW5nIjogMH0sCisgICAgICAgICAgICAgICAgeyJtb2RlIjogInIifSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAicmIifSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAiciIsICJidWZmZXJpbmciOiAxfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAiciIsICJidWZmZXJpbmciOiAyfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAicmIiLCAiYnVmZmVyaW5nIjogMH0sCisgICAgICAgICAgICAgICAgeyJtb2RlIjogIncrIn0sCisgICAgICAgICAgICAgICAgeyJtb2RlIjogIncrYiJ9LAorICAgICAgICAgICAgICAgIHsibW9kZSI6ICJ3KyIsICJidWZmZXJpbmciOiAxfSwKKyAgICAgICAgICAgICAgICB7Im1vZGUiOiAidysiLCAiYnVmZmVyaW5nIjogMn0sCisgICAgICAgICAgICAgICAgeyJtb2RlIjogIncrYiIsICJidWZmZXJpbmciOiAwfSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICBmID0gc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAqKmt3YXJncykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5mbHVzaCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYuZmlsZW5vKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5pc2F0dHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLl9faXRlcl9fKQorICAgICAgICAgICAgaWYgaGFzYXR0cihmLCAicGVlayIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucGVlaywgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZCkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZiwgInJlYWQxIik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi5yZWFkMSwgMTAyNCkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoZiwgInJlYWRhbGwiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWRhbGwpCisgICAgICAgICAgICBpZiBoYXNhdHRyKGYsICJyZWFkaW50byIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZGludG8sIGJ5dGVhcnJheSgxMDI0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLnJlYWRsaW5lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYuc2VlaywgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYudGVsbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYudHJ1bmNhdGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmLndyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiIiIGlmICJiIiBpbiBrd2FyZ3NbJ21vZGUnXSBlbHNlICIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZi53cml0ZWxpbmVzLCBbXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5leHQsIGYpCisKKyAgICBkZWYgdGVzdF9ibG9ja2luZ2lvZXJyb3Ioc2VsZik6CisgICAgICAgICMgVmFyaW91cyBCbG9ja2luZ0lPRXJyb3IgaXNzdWVzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5CbG9ja2luZ0lPRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5CbG9ja2luZ0lPRXJyb3IsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5CbG9ja2luZ0lPRXJyb3IsIDEsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5CbG9ja2luZ0lPRXJyb3IsIDEsICIiLCBOb25lKQorICAgICAgICBiID0gc2VsZi5CbG9ja2luZ0lPRXJyb3IoMSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5jaGFyYWN0ZXJzX3dyaXR0ZW4sIDApCisgICAgICAgIGNsYXNzIEModW5pY29kZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGMgPSBDKCIiKQorICAgICAgICBiID0gc2VsZi5CbG9ja2luZ0lPRXJyb3IoMSwgYykKKyAgICAgICAgYy5iID0gYgorICAgICAgICBiLmMgPSBjCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoYykKKyAgICAgICAgZGVsIGMsIGIKKyAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCisKKyAgICBkZWYgdGVzdF9hYmNzKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIHZpc2libGUgYmFzZSBjbGFzc2VzIGFyZSBBQkNzLgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5JT0Jhc2UsIGFiYy5BQkNNZXRhKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5SYXdJT0Jhc2UsIGFiYy5BQkNNZXRhKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc2VsZi5CdWZmZXJlZElPQmFzZSwgYWJjLkFCQ01ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLlRleHRJT0Jhc2UsIGFiYy5BQkNNZXRhKQorCisgICAgZGVmIF9jaGVja19hYmNfaW5oZXJpdGFuY2Uoc2VsZiwgYWJjbW9kdWxlKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJ3YiIsIGJ1ZmZlcmluZz0wKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGYsIGFiY21vZHVsZS5JT0Jhc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLlJhd0lPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuQnVmZmVyZWRJT0Jhc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLlRleHRJT0Jhc2UpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGYsIGFiY21vZHVsZS5JT0Jhc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLlJhd0lPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuQnVmZmVyZWRJT0Jhc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLlRleHRJT0Jhc2UpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAidyIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZiwgYWJjbW9kdWxlLklPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuUmF3SU9CYXNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJc0luc3RhbmNlKGYsIGFiY21vZHVsZS5CdWZmZXJlZElPQmFzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmLCBhYmNtb2R1bGUuVGV4dElPQmFzZSkKKworICAgIGRlZiB0ZXN0X2FiY19pbmhlcml0YW5jZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGltcGxlbWVudGF0aW9ucyBpbmhlcml0IGZyb20gdGhlaXIgcmVzcGVjdGl2ZSBBQkNzCisgICAgICAgIHNlbGYuX2NoZWNrX2FiY19pbmhlcml0YW5jZShzZWxmKQorCisgICAgZGVmIHRlc3RfYWJjX2luaGVyaXRhbmNlX29mZmljaWFsKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW1wbGVtZW50YXRpb25zIGluaGVyaXQgZnJvbSB0aGUgb2ZmaWNpYWwgQUJDcyBvZiB0aGUKKyAgICAgICAgIyBiYXNlbGluZSAiaW8iIG1vZHVsZS4KKyAgICAgICAgc2VsZi5fY2hlY2tfYWJjX2luaGVyaXRhbmNlKGlvKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmNudGwsICdmY250bCByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0JykKKyAgICBkZWYgdGVzdF9ub25ibG9ja19waXBlX3dyaXRlX2JpZ2J1ZihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9ub25ibG9ja19waXBlX3dyaXRlKDE2KjEwMjQpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhmY250bCwgJ2ZjbnRsIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QnKQorICAgIGRlZiB0ZXN0X25vbmJsb2NrX3BpcGVfd3JpdGVfc21hbGxidWYoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfbm9uYmxvY2tfcGlwZV93cml0ZSgxMDI0KQorCisgICAgZGVmIF9zZXRfbm9uX2Jsb2NraW5nKHNlbGYsIGZkKToKKyAgICAgICAgZmxhZ3MgPSBmY250bC5mY250bChmZCwgZmNudGwuRl9HRVRGTCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmbGFncywgLTEpCisgICAgICAgIHJlcyA9IGZjbnRsLmZjbnRsKGZkLCBmY250bC5GX1NFVEZMLCBmbGFncyB8IG9zLk9fTk9OQkxPQ0spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCAwKQorCisgICAgZGVmIF90ZXN0X25vbmJsb2NrX3BpcGVfd3JpdGUoc2VsZiwgYnVmc2l6ZSk6CisgICAgICAgIHNlbnQgPSBbXQorICAgICAgICByZWNlaXZlZCA9IFtdCisgICAgICAgIHIsIHcgPSBvcy5waXBlKCkKKyAgICAgICAgc2VsZi5fc2V0X25vbl9ibG9ja2luZyhyKQorICAgICAgICBzZWxmLl9zZXRfbm9uX2Jsb2NraW5nKHcpCisKKyAgICAgICAgIyBUbyBleGVyY2lzZSBhbGwgY29kZSBwYXRocyBpbiB0aGUgQyBpbXBsZW1lbnRhdGlvbiB3ZSBuZWVkCisgICAgICAgICMgdG8gcGxheSB3aXRoIGJ1ZmZlciBzaXplcy4gIEZvciBpbnN0YW5jZSwgaWYgd2UgY2hvb3NlIGEKKyAgICAgICAgIyBidWZmZXIgc2l6ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gX1BJUEVfQlVGICg0MDk2IG9uIExpbnV4KQorICAgICAgICAjIHRoZW4gd2Ugd2lsbCBuZXZlciBnZXQgYSBwYXJ0aWFsIHdyaXRlIG9mIHRoZSBidWZmZXIuCisgICAgICAgIHJmID0gc2VsZi5vcGVuKHIsIG1vZGU9J3JiJywgY2xvc2VmZD1UcnVlLCBidWZmZXJpbmc9YnVmc2l6ZSkKKyAgICAgICAgd2YgPSBzZWxmLm9wZW4odywgbW9kZT0nd2InLCBjbG9zZWZkPVRydWUsIGJ1ZmZlcmluZz1idWZzaXplKQorCisgICAgICAgIHdpdGggcmYsIHdmOgorICAgICAgICAgICAgZm9yIE4gaW4gOTk5OSwgNzMsIDc1NzQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpID0gMAorICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgbXNnID0gYnl0ZXMoW2kgJSAyNiArIDk3XSkgKiBOCisgICAgICAgICAgICAgICAgICAgICAgICBzZW50LmFwcGVuZChtc2cpCisgICAgICAgICAgICAgICAgICAgICAgICB3Zi53cml0ZShtc2cpCisgICAgICAgICAgICAgICAgICAgICAgICBpICs9IDEKKworICAgICAgICAgICAgICAgIGV4Y2VwdCBzZWxmLkJsb2NraW5nSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJnc1swXSwgZXJybm8uRUFHQUlOKQorICAgICAgICAgICAgICAgICAgICBzZW50Wy0xXSA9IHNlbnRbLTFdWzplLmNoYXJhY3RlcnNfd3JpdHRlbl0KKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuYXBwZW5kKHJmLnJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgbXNnID0gYidCTE9DS0VEJworICAgICAgICAgICAgICAgICAgICB3Zi53cml0ZShtc2cpCisgICAgICAgICAgICAgICAgICAgIHNlbnQuYXBwZW5kKG1zZykKKworICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdmLmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZi5CbG9ja2luZ0lPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sIGVycm5vLkVBR0FJTikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmNoYXJhY3RlcnNfd3JpdHRlbiwgMCkKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuYXBwZW5kKHJmLnJlYWQoKSkKKworICAgICAgICAgICAgcmVjZWl2ZWQgKz0gaXRlcihyZi5yZWFkLCBOb25lKQorCisgICAgICAgIHNlbnQsIHJlY2VpdmVkID0gYicnLmpvaW4oc2VudCksIGInJy5qb2luKHJlY2VpdmVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VudCA9PSByZWNlaXZlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJmLmNsb3NlZCkKKworY2xhc3MgQ01pc2NJT1Rlc3QoTWlzY0lPVGVzdCk6CisgICAgaW8gPSBpbworCitjbGFzcyBQeU1pc2NJT1Rlc3QoTWlzY0lPVGVzdCk6CisgICAgaW8gPSBweWlvCisKKworQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICdudCcsICdQT1NJWCBzaWduYWxzIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIFNpZ25hbHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vbGRhbHJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2VsZi5hbGFybV9pbnRlcnJ1cHQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHNlbGYub2xkYWxybSkKKworICAgIGRlZiBhbGFybV9pbnRlcnJ1cHQoc2VsZiwgc2lnLCBmcmFtZSk6CisgICAgICAgIDEgLy8gMAorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSBpbiAoJ2ZyZWVic2Q1JywgJ2ZyZWVic2Q2JywgJ2ZyZWVic2Q3JyksCisgICAgICAgICAgICAgICAgICAgICAnaXNzdWUgIzEyNDI5OiBza2lwIHRlc3Qgb24gRnJlZUJTRCA8PSA3JykKKyAgICBkZWYgY2hlY2tfaW50ZXJydXB0ZWRfd3JpdGUoc2VsZiwgaXRlbSwgYnl0ZXMsICoqZmRvcGVuX2t3YXJncyk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgYSBwYXJ0aWFsIHdyaXRlLCB3aGVuIGl0IGdldHMgaW50ZXJydXB0ZWQsIHByb3Blcmx5CisgICAgICAgIGludm9rZXMgdGhlIHNpZ25hbCBoYW5kbGVyLCBhbmQgYnViYmxlcyB1cCB0aGUgZXhjZXB0aW9uIHJhaXNlZAorICAgICAgICBpbiB0aGUgbGF0dGVyLiIiIgorICAgICAgICByZWFkX3Jlc3VsdHMgPSBbXQorICAgICAgICBkZWYgX3JlYWQoKToKKyAgICAgICAgICAgIHMgPSBvcy5yZWFkKHIsIDEpCisgICAgICAgICAgICByZWFkX3Jlc3VsdHMuYXBwZW5kKHMpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1fcmVhZCkKKyAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgIHIsIHcgPSBvcy5waXBlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2lvID0gc2VsZi5pby5vcGVuKHcsICoqZmRvcGVuX2t3YXJncykKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAjIEZpbGwgdGhlIHBpcGUgZW5vdWdoIHRoYXQgdGhlIHdyaXRlIHdpbGwgYmUgYmxvY2tpbmcuCisgICAgICAgICAgICAjIEl0IHdpbGwgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIHRpbWVyIGFybWVkIGFib3ZlLiAgU2luY2UgdGhlCisgICAgICAgICAgICAjIG90aGVyIHRocmVhZCBoYXMgcmVhZCBvbmUgYnl0ZSwgdGhlIGxvdy1sZXZlbCB3cml0ZSB3aWxsCisgICAgICAgICAgICAjIHJldHVybiB3aXRoIGEgc3VjY2Vzc2Z1bCAocGFydGlhbCkgcmVzdWx0IHJhdGhlciB0aGFuIGFuIEVJTlRSLgorICAgICAgICAgICAgIyBUaGUgYnVmZmVyZWQgSU8gbGF5ZXIgbXVzdCBjaGVjayBmb3IgcGVuZGluZyBzaWduYWwKKyAgICAgICAgICAgICMgaGFuZGxlcnMsIHdoaWNoIGluIHRoaXMgY2FzZSB3aWxsIGludm9rZSBhbGFybV9pbnRlcnJ1cHQoKS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgd2lvLndyaXRlLCBpdGVtICogKHN1cHBvcnQuUElQRV9NQVhfU0laRSAvLyBsZW4oaXRlbSkgKyAxKSkKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgICAgICAjIFdlIGdvdCBvbmUgYnl0ZSwgZ2V0IGFub3RoZXIgb25lIGFuZCBjaGVjayB0aGF0IGl0IGlzbid0IGEKKyAgICAgICAgICAgICMgcmVwZWF0IG9mIHRoZSBmaXJzdCBvbmUuCisgICAgICAgICAgICByZWFkX3Jlc3VsdHMuYXBwZW5kKG9zLnJlYWQociwgMSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRfcmVzdWx0cywgW2J5dGVzWzA6MV0sIGJ5dGVzWzE6Ml1dKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2xvc2UodykKKyAgICAgICAgICAgIG9zLmNsb3NlKHIpCisgICAgICAgICAgICAjIFRoaXMgaXMgZGVsaWJlcmF0ZS4gSWYgd2UgZGlkbid0IGNsb3NlIHRoZSBmaWxlIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICMgYmVmb3JlIGNsb3Npbmcgd2lvLCB3aW8gd291bGQgdHJ5IHRvIGZsdXNoIGl0cyBpbnRlcm5hbAorICAgICAgICAgICAgIyBidWZmZXIsIGFuZCBibG9jayBhZ2Fpbi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aW8uY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVCQURGOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0ZWRfd3JpdGVfdW5idWZmZXJlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pbnRlcnJ1cHRlZF93cml0ZShiInh5IiwgYiJ4eSIsIG1vZGU9IndiIiwgYnVmZmVyaW5nPTApCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRlZF93cml0ZV9idWZmZXJlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pbnRlcnJ1cHRlZF93cml0ZShiInh5IiwgYiJ4eSIsIG1vZGU9IndiIikKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdGVkX3dyaXRlX3RleHQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaW50ZXJydXB0ZWRfd3JpdGUoInh5IiwgYiJ4eSIsIG1vZGU9InciLCBlbmNvZGluZz0iYXNjaWkiKQorCisgICAgZGVmIGNoZWNrX3JlZW50cmFudF93cml0ZShzZWxmLCBkYXRhLCAqKmZkb3Blbl9rd2FyZ3MpOgorICAgICAgICBkZWYgb25fYWxhcm0oKmFyZ3MpOgorICAgICAgICAgICAgIyBXaWxsIGJlIGNhbGxlZCByZWVudHJhbnRseSBmcm9tIHRoZSBzYW1lIHRocmVhZAorICAgICAgICAgICAgd2lvLndyaXRlKGRhdGEpCisgICAgICAgICAgICAxLy8wCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIG9uX2FsYXJtKQorICAgICAgICByLCB3ID0gb3MucGlwZSgpCisgICAgICAgIHdpbyA9IHNlbGYuaW8ub3Blbih3LCAqKmZkb3Blbl9rd2FyZ3MpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSgxKQorICAgICAgICAgICAgIyBFaXRoZXIgdGhlIHJlZW50cmFudCBjYWxsIHRvIHdpby53cml0ZSgpIGZhaWxzIHdpdGggUnVudGltZUVycm9yLAorICAgICAgICAgICAgIyBvciB0aGUgc2lnbmFsIGhhbmRsZXIgcmFpc2VzIFplcm9EaXZpc2lvbkVycm9yLgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoWmVyb0RpdmlzaW9uRXJyb3IsIFJ1bnRpbWVFcnJvcikpIGFzIGNtOgorICAgICAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICAgICAgICAgICAgICB3aW8ud3JpdGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpby5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHRoZSBidWZmZXIgZG9lc24ndCBmaWxsIHVwIGFuZCBibG9jayBmdXJ0aGVyIHdyaXRlcworICAgICAgICAgICAgICAgICAgICBvcy5yZWFkKHIsIGxlbihkYXRhKSAqIDEwMCkKKyAgICAgICAgICAgIGV4YyA9IGNtLmV4Y2VwdGlvbgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleGMsIFJ1bnRpbWVFcnJvcik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihleGMpLnN0YXJ0c3dpdGgoInJlZW50cmFudCBjYWxsIiksIHN0cihleGMpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd2lvLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLmNsb3NlKHIpCisKKyAgICBkZWYgdGVzdF9yZWVudHJhbnRfd3JpdGVfYnVmZmVyZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcmVlbnRyYW50X3dyaXRlKGIieHkiLCBtb2RlPSJ3YiIpCisKKyAgICBkZWYgdGVzdF9yZWVudHJhbnRfd3JpdGVfdGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19yZWVudHJhbnRfd3JpdGUoInh5IiwgbW9kZT0idyIsIGVuY29kaW5nPSJhc2NpaSIpCisKKyAgICBkZWYgY2hlY2tfaW50ZXJydXB0ZWRfcmVhZF9yZXRyeShzZWxmLCBkZWNvZGUsICoqZmRvcGVuX2t3YXJncyk6CisgICAgICAgICIiIkNoZWNrIHRoYXQgYSBidWZmZXJlZCByZWFkLCB3aGVuIGl0IGdldHMgaW50ZXJydXB0ZWQgKGVpdGhlcgorICAgICAgICByZXR1cm5pbmcgYSBwYXJ0aWFsIHJlc3VsdCBvciBFSU5UUiksIHByb3Blcmx5IGludm9rZXMgdGhlIHNpZ25hbAorICAgICAgICBoYW5kbGVyIGFuZCByZXRyaWVzIGlmIHRoZSBsYXR0ZXIgcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5LiIiIgorICAgICAgICByLCB3ID0gb3MucGlwZSgpCisgICAgICAgIGZkb3Blbl9rd2FyZ3NbImNsb3NlZmQiXSA9IEZhbHNlCisgICAgICAgIGRlZiBhbGFybV9oYW5kbGVyKHNpZywgZnJhbWUpOgorICAgICAgICAgICAgb3Mud3JpdGUodywgYiJiYXIiKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBhbGFybV9oYW5kbGVyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByaW8gPSBzZWxmLmlvLm9wZW4ociwgKipmZG9wZW5fa3dhcmdzKQorICAgICAgICAgICAgb3Mud3JpdGUodywgYiJmb28iKQorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAjIEV4cGVjdGVkIGJlaGF2aW91cjoKKyAgICAgICAgICAgICMgLSBmaXJzdCByYXcgcmVhZCgpIHJldHVybnMgcGFydGlhbCBiImZvbyIKKyAgICAgICAgICAgICMgLSBzZWNvbmQgcmF3IHJlYWQoKSByZXR1cm5zIEVJTlRSCisgICAgICAgICAgICAjIC0gdGhpcmQgcmF3IHJlYWQoKSByZXR1cm5zIGIiYmFyIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGUocmlvLnJlYWQoNikpLCAiZm9vYmFyIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHJpby5jbG9zZSgpCisgICAgICAgICAgICBvcy5jbG9zZSh3KQorICAgICAgICAgICAgb3MuY2xvc2UocikKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdGVyZF9yZWFkX3JldHJ5X2J1ZmZlcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2ludGVycnVwdGVkX3JlYWRfcmV0cnkobGFtYmRhIHg6IHguZGVjb2RlKCdsYXRpbjEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9InJiIikKKworICAgIGRlZiB0ZXN0X2ludGVycnVwdGVyZF9yZWFkX3JldHJ5X3RleHQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaW50ZXJydXB0ZWRfcmVhZF9yZXRyeShsYW1iZGEgeDogeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGU9InIiKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgY2hlY2tfaW50ZXJydXB0ZWRfd3JpdGVfcmV0cnkoc2VsZiwgaXRlbSwgKipmZG9wZW5fa3dhcmdzKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBhIGJ1ZmZlcmVkIHdyaXRlLCB3aGVuIGl0IGdldHMgaW50ZXJydXB0ZWQgKGVpdGhlcgorICAgICAgICByZXR1cm5pbmcgYSBwYXJ0aWFsIHJlc3VsdCBvciBFSU5UUiksIHByb3Blcmx5IGludm9rZXMgdGhlIHNpZ25hbAorICAgICAgICBoYW5kbGVyIGFuZCByZXRyaWVzIGlmIHRoZSBsYXR0ZXIgcmV0dXJuZWQgc3VjY2Vzc2Z1bGx5LiIiIgorICAgICAgICBzZWxlY3QgPSBzdXBwb3J0LmltcG9ydF9tb2R1bGUoInNlbGVjdCIpCisgICAgICAgICMgQSBxdWFudGl0eSB0aGF0IGV4Y2VlZHMgdGhlIGJ1ZmZlciBzaXplIG9mIGFuIGFub255bW91cyBwaXBlJ3MKKyAgICAgICAgIyB3cml0ZSBlbmQuCisgICAgICAgIE4gPSBzdXBwb3J0LlBJUEVfTUFYX1NJWkUKKyAgICAgICAgciwgdyA9IG9zLnBpcGUoKQorICAgICAgICBmZG9wZW5fa3dhcmdzWyJjbG9zZWZkIl0gPSBGYWxzZQorICAgICAgICAjIFdlIG5lZWQgYSBzZXBhcmF0ZSB0aHJlYWQgdG8gcmVhZCBmcm9tIHRoZSBwaXBlIGFuZCBhbGxvdyB0aGUKKyAgICAgICAgIyB3cml0ZSgpIHRvIGZpbmlzaC4gIFRoaXMgdGhyZWFkIGlzIHN0YXJ0ZWQgYWZ0ZXIgdGhlIFNJR0FMUk0gaXMKKyAgICAgICAgIyByZWNlaXZlZCAoZm9yY2luZyBhIGZpcnN0IEVJTlRSIGluIHdyaXRlKCkpLgorICAgICAgICByZWFkX3Jlc3VsdHMgPSBbXQorICAgICAgICB3cml0ZV9maW5pc2hlZCA9IEZhbHNlCisgICAgICAgIGRlZiBfcmVhZCgpOgorICAgICAgICAgICAgd2hpbGUgbm90IHdyaXRlX2ZpbmlzaGVkOgorICAgICAgICAgICAgICAgIHdoaWxlIHIgaW4gc2VsZWN0LnNlbGVjdChbcl0sIFtdLCBbXSwgMS4wKVswXToKKyAgICAgICAgICAgICAgICAgICAgcyA9IG9zLnJlYWQociwgMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgcmVhZF9yZXN1bHRzLmFwcGVuZChzKQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3JlYWQpCisgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICBkZWYgYWxhcm0xKHNpZywgZnJhbWUpOgorICAgICAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgYWxhcm0yKQorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgIGRlZiBhbGFybTIoc2lnLCBmcmFtZSk6CisgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgYWxhcm0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aW8gPSBzZWxmLmlvLm9wZW4odywgKipmZG9wZW5fa3dhcmdzKQorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAjIEV4cGVjdGVkIGJlaGF2aW91cjoKKyAgICAgICAgICAgICMgLSBmaXJzdCByYXcgd3JpdGUoKSBpcyBwYXJ0aWFsIChiZWNhdXNlIG9mIHRoZSBsaW1pdGVkIHBpcGUgYnVmZmVyCisgICAgICAgICAgICAjICAgYW5kIHRoZSBmaXJzdCBhbGFybSkKKyAgICAgICAgICAgICMgLSBzZWNvbmQgcmF3IHdyaXRlKCkgcmV0dXJucyBFSU5UUiAoYmVjYXVzZSBvZiB0aGUgc2Vjb25kIGFsYXJtKQorICAgICAgICAgICAgIyAtIHN1YnNlcXVlbnQgd3JpdGUoKXMgYXJlIHN1Y2Nlc3NmdWwgKGVpdGhlciBwYXJ0aWFsIG9yIGNvbXBsZXRlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOLCB3aW8ud3JpdGUoaXRlbSAqIE4pKQorICAgICAgICAgICAgd2lvLmZsdXNoKCkKKyAgICAgICAgICAgIHdyaXRlX2ZpbmlzaGVkID0gVHJ1ZQorICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTiwgc3VtKGxlbih4KSBmb3IgeCBpbiByZWFkX3Jlc3VsdHMpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd3JpdGVfZmluaXNoZWQgPSBUcnVlCisgICAgICAgICAgICBvcy5jbG9zZSh3KQorICAgICAgICAgICAgb3MuY2xvc2UocikKKyAgICAgICAgICAgICMgVGhpcyBpcyBkZWxpYmVyYXRlLiBJZiB3ZSBkaWRuJ3QgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICAgICAgIyBiZWZvcmUgY2xvc2luZyB3aW8sIHdpbyB3b3VsZCB0cnkgdG8gZmx1c2ggaXRzIGludGVybmFsCisgICAgICAgICAgICAjIGJ1ZmZlciwgYW5kIGNvdWxkIGJsb2NrIChpbiBjYXNlIG9mIGZhaWx1cmUpLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpby5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUJBREY6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgdGVzdF9pbnRlcnJ1cHRlcmRfd3JpdGVfcmV0cnlfYnVmZmVyZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaW50ZXJydXB0ZWRfd3JpdGVfcmV0cnkoYiJ4IiwgbW9kZT0id2IiKQorCisgICAgZGVmIHRlc3RfaW50ZXJydXB0ZXJkX3dyaXRlX3JldHJ5X3RleHQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaW50ZXJydXB0ZWRfd3JpdGVfcmV0cnkoIngiLCBtb2RlPSJ3IiwgZW5jb2Rpbmc9ImxhdGluMSIpCisKKworY2xhc3MgQ1NpZ25hbHNUZXN0KFNpZ25hbHNUZXN0KToKKyAgICBpbyA9IGlvCisKK2NsYXNzIFB5U2lnbmFsc1Rlc3QoU2lnbmFsc1Rlc3QpOgorICAgIGlvID0gcHlpbworCisgICAgIyBIYW5kbGluZyByZWVudHJhbmN5IGlzc3VlcyB3b3VsZCBzbG93IGRvd24gX3B5aW8gZXZlbiBtb3JlLCBzbyB0aGUKKyAgICAjIHRlc3RzIGFyZSBkaXNhYmxlZC4KKyAgICB0ZXN0X3JlZW50cmFudF93cml0ZV9idWZmZXJlZCA9IE5vbmUKKyAgICB0ZXN0X3JlZW50cmFudF93cml0ZV90ZXh0ID0gTm9uZQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0cyA9IChDSU9UZXN0LCBQeUlPVGVzdCwKKyAgICAgICAgICAgICBDQnVmZmVyZWRSZWFkZXJUZXN0LCBQeUJ1ZmZlcmVkUmVhZGVyVGVzdCwKKyAgICAgICAgICAgICBDQnVmZmVyZWRXcml0ZXJUZXN0LCBQeUJ1ZmZlcmVkV3JpdGVyVGVzdCwKKyAgICAgICAgICAgICBDQnVmZmVyZWRSV1BhaXJUZXN0LCBQeUJ1ZmZlcmVkUldQYWlyVGVzdCwKKyAgICAgICAgICAgICBDQnVmZmVyZWRSYW5kb21UZXN0LCBQeUJ1ZmZlcmVkUmFuZG9tVGVzdCwKKyAgICAgICAgICAgICBTdGF0ZWZ1bEluY3JlbWVudGFsRGVjb2RlclRlc3QsCisgICAgICAgICAgICAgQ0luY3JlbWVudGFsTmV3bGluZURlY29kZXJUZXN0LCBQeUluY3JlbWVudGFsTmV3bGluZURlY29kZXJUZXN0LAorICAgICAgICAgICAgIENUZXh0SU9XcmFwcGVyVGVzdCwgUHlUZXh0SU9XcmFwcGVyVGVzdCwKKyAgICAgICAgICAgICBDTWlzY0lPVGVzdCwgUHlNaXNjSU9UZXN0LAorICAgICAgICAgICAgIENTaWduYWxzVGVzdCwgUHlTaWduYWxzVGVzdCwKKyAgICAgICAgICAgICApCisKKyAgICAjIFB1dCB0aGUgbmFtZXNwYWNlcyBvZiB0aGUgSU8gbW9kdWxlIHdlIGFyZSB0ZXN0aW5nIGFuZCBzb21lIHVzZWZ1bCBtb2NrCisgICAgIyBjbGFzc2VzIGluIHRoZSBfX2RpY3RfXyBvZiBlYWNoIHRlc3QuCisgICAgbW9ja3MgPSAoTW9ja1Jhd0lPLCBNaXNiZWhhdmVkUmF3SU8sIE1vY2tGaWxlSU8sIENsb3NlRmFpbHVyZUlPLAorICAgICAgICAgICAgIE1vY2tOb25CbG9ja1dyaXRlcklPLCBNb2NrUmF3SU9XaXRob3V0UmVhZCkKKyAgICBhbGxfbWVtYmVycyA9IGlvLl9fYWxsX18gKyBbIkluY3JlbWVudGFsTmV3bGluZURlY29kZXIiXQorICAgIGNfaW9fbnMgPSBkaWN0KChuYW1lLCBnZXRhdHRyKGlvLCBuYW1lKSkgZm9yIG5hbWUgaW4gYWxsX21lbWJlcnMpCisgICAgcHlfaW9fbnMgPSBkaWN0KChuYW1lLCBnZXRhdHRyKHB5aW8sIG5hbWUpKSBmb3IgbmFtZSBpbiBhbGxfbWVtYmVycykKKyAgICBnbG9icyA9IGdsb2JhbHMoKQorICAgIGNfaW9fbnMudXBkYXRlKCh4Ll9fbmFtZV9fLCBnbG9ic1siQyIgKyB4Ll9fbmFtZV9fXSkgZm9yIHggaW4gbW9ja3MpCisgICAgcHlfaW9fbnMudXBkYXRlKCh4Ll9fbmFtZV9fLCBnbG9ic1siUHkiICsgeC5fX25hbWVfX10pIGZvciB4IGluIG1vY2tzKQorICAgICMgQXZvaWQgdHVybmluZyBvcGVuIGludG8gYSBib3VuZCBtZXRob2QuCisgICAgcHlfaW9fbnNbIm9wZW4iXSA9IHB5aW8uT3BlbldyYXBwZXIKKyAgICBmb3IgdGVzdCBpbiB0ZXN0czoKKyAgICAgICAgaWYgdGVzdC5fX25hbWVfXy5zdGFydHN3aXRoKCJDIik6CisgICAgICAgICAgICBmb3IgbmFtZSwgb2JqIGluIGNfaW9fbnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzZXRhdHRyKHRlc3QsIG5hbWUsIG9iaikKKyAgICAgICAgZWxpZiB0ZXN0Ll9fbmFtZV9fLnN0YXJ0c3dpdGgoIlB5Iik6CisgICAgICAgICAgICBmb3IgbmFtZSwgb2JqIGluIHB5X2lvX25zLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgc2V0YXR0cih0ZXN0LCBuYW1lLCBvYmopCisKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI2NzhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGI2ZThmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW8ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvY3RsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW9jdGwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5NjVkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lvY3RsLnB5CkBAIC0wLDAgKzEsOTMgQEAKK2ltcG9ydCBhcnJheQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUsIGdldF9hdHRyaWJ1dGUKK2ltcG9ydCBvcywgc3RydWN0CitmY250bCA9IGltcG9ydF9tb2R1bGUoJ2ZjbnRsJykKK3Rlcm1pb3MgPSBpbXBvcnRfbW9kdWxlKCd0ZXJtaW9zJykKK2dldF9hdHRyaWJ1dGUodGVybWlvcywgJ1RJT0NHUEdSUCcpICNDYW4ndCBydW4gdGVzdHMgd2l0aG91dCB0aGlzIGZlYXR1cmUKKwordHJ5OgorICAgIHR0eSA9IG9wZW4oIi9kZXYvdHR5IiwgInIiKQorZXhjZXB0IElPRXJyb3I6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlVuYWJsZSB0byBvcGVuIC9kZXYvdHR5IikKK2Vsc2U6CisgICAgIyBTa2lwIGlmIGFub3RoZXIgcHJvY2VzcyBpcyBpbiBmb3JlZ3JvdW5kCisgICAgciA9IGZjbnRsLmlvY3RsKHR0eSwgdGVybWlvcy5USU9DR1BHUlAsICIgICAgIikKKyAgICB0dHkuY2xvc2UoKQorICAgIHJwZ3JwID0gc3RydWN0LnVucGFjaygiaSIsIHIpWzBdCisgICAgaWYgcnBncnAgbm90IGluIChvcy5nZXRwZ3JwKCksIG9zLmdldHNpZCgwKSk6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJOZWl0aGVyIHRoZSBwcm9jZXNzIGdyb3VwIG5vciB0aGUgc2Vzc2lvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcmUgYXR0YWNoZWQgdG8gL2Rldi90dHkiKQorICAgIGRlbCB0dHksIHIsIHJwZ3JwCisKK3RyeToKKyAgICBpbXBvcnQgcHR5CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcHR5ID0gTm9uZQorCitjbGFzcyBJb2N0bFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9pb2N0bChzZWxmKToKKyAgICAgICAgIyBJZiB0aGlzIHByb2Nlc3MgaGFzIGJlZW4gcHV0IGludG8gdGhlIGJhY2tncm91bmQsIFRJT0NHUEdSUCByZXR1cm5zCisgICAgICAgICMgdGhlIHNlc3Npb24gSUQgaW5zdGVhZCBvZiB0aGUgcHJvY2VzcyBncm91cCBpZC4KKyAgICAgICAgaWRzID0gKG9zLmdldHBncnAoKSwgb3MuZ2V0c2lkKDApKQorICAgICAgICB0dHkgPSBvcGVuKCIvZGV2L3R0eSIsICJyIikKKyAgICAgICAgciA9IGZjbnRsLmlvY3RsKHR0eSwgdGVybWlvcy5USU9DR1BHUlAsICIgICAgIikKKyAgICAgICAgcnBncnAgPSBzdHJ1Y3QudW5wYWNrKCJpIiwgcilbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRJbihycGdycCwgaWRzKQorCisgICAgZGVmIF9jaGVja19pb2N0bF9tdXRhdGVfbGVuKHNlbGYsIG5ieXRlcz1Ob25lKToKKyAgICAgICAgYnVmID0gYXJyYXkuYXJyYXkoJ2knKQorICAgICAgICBpbnRzaXplID0gYnVmLml0ZW1zaXplCisgICAgICAgIGlkcyA9IChvcy5nZXRwZ3JwKCksIG9zLmdldHNpZCgwKSkKKyAgICAgICAgIyBBIGZpbGwgdmFsdWUgdW5saWtlbHkgdG8gYmUgaW4gYGlkc2AKKyAgICAgICAgZmlsbCA9IC0xMjM0NQorICAgICAgICBpZiBuYnl0ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIEV4dGVuZCB0aGUgYnVmZmVyIHNvIHRoYXQgaXQgaXMgZXhhY3RseSBgbmJ5dGVzYCBieXRlcyBsb25nCisgICAgICAgICAgICBidWYuZXh0ZW5kKFtmaWxsXSAqIChuYnl0ZXMgLy8gaW50c2l6ZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpICogaW50c2l6ZSwgbmJ5dGVzKSAgICMgc2FuaXR5IGNoZWNrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBidWYuYXBwZW5kKGZpbGwpCisgICAgICAgIHdpdGggb3BlbigiL2Rldi90dHkiLCAiciIpIGFzIHR0eToKKyAgICAgICAgICAgIHIgPSBmY250bC5pb2N0bCh0dHksIHRlcm1pb3MuVElPQ0dQR1JQLCBidWYsIDEpCisgICAgICAgIHJwZ3JwID0gYnVmWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihycGdycCwgaWRzKQorCisgICAgZGVmIHRlc3RfaW9jdGxfbXV0YXRlKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19pb2N0bF9tdXRhdGVfbGVuKCkKKworICAgIGRlZiB0ZXN0X2lvY3RsX211dGF0ZV8xMDI0KHNlbGYpOgorICAgICAgICAjIElzc3VlICM5NzU4OiBhIG11dGFibGUgYnVmZmVyIG9mIGV4YWN0bHkgMTAyNCBieXRlcyB3b3VsZG4ndCBiZQorICAgICAgICAjIGNvcGllZCBiYWNrIGFmdGVyIHRoZSBzeXN0ZW0gY2FsbC4KKyAgICAgICAgc2VsZi5fY2hlY2tfaW9jdGxfbXV0YXRlX2xlbigxMDI0KQorCisgICAgZGVmIHRlc3RfaW9jdGxfbXV0YXRlXzIwNDgoc2VsZik6CisgICAgICAgICMgVGVzdCB3aXRoIGEgbGFyZ2VyIGJ1ZmZlciwganVzdCBmb3IgdGhlIHJlY29yZC4KKyAgICAgICAgc2VsZi5fY2hlY2tfaW9jdGxfbXV0YXRlX2xlbigyMDQ4KQorCisgICAgZGVmIHRlc3RfaW9jdGxfc2lnbmVkX3Vuc2lnbmVkX2NvZGVfcGFyYW0oc2VsZik6CisgICAgICAgIGlmIG5vdCBwdHk6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgncHR5IG1vZHVsZSByZXF1aXJlZCcpCisgICAgICAgIG1mZCwgc2ZkID0gcHR5Lm9wZW5wdHkoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB0ZXJtaW9zLlRJT0NTV0lOU1ogPCAwOgorICAgICAgICAgICAgICAgIHNldF93aW5zel9vcGNvZGVfbWF5YmVfbmVnID0gdGVybWlvcy5USU9DU1dJTlNaCisgICAgICAgICAgICAgICAgc2V0X3dpbnN6X29wY29kZV9wb3MgPSB0ZXJtaW9zLlRJT0NTV0lOU1ogJiAweGZmZmZmZmZmTAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZXRfd2luc3pfb3Bjb2RlX3BvcyA9IHRlcm1pb3MuVElPQ1NXSU5TWgorICAgICAgICAgICAgICAgIHNldF93aW5zel9vcGNvZGVfbWF5YmVfbmVnLCA9IHN0cnVjdC51bnBhY2soImkiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2soIkkiLCB0ZXJtaW9zLlRJT0NTV0lOU1opKQorCisgICAgICAgICAgICBvdXJfd2luc3ogPSBzdHJ1Y3QucGFjaygiSEhISCIsODAsMjUsMCwwKQorICAgICAgICAgICAgIyB0ZXN0IGJvdGggd2l0aCBhIHBvc2l0aXZlIGFuZCBwb3RlbnRpYWxseSBuZWdhdGl2ZSBpb2N0bCBjb2RlCisgICAgICAgICAgICBuZXdfd2luc3ogPSBmY250bC5pb2N0bChtZmQsIHNldF93aW5zel9vcGNvZGVfcG9zLCBvdXJfd2luc3opCisgICAgICAgICAgICBuZXdfd2luc3ogPSBmY250bC5pb2N0bChtZmQsIHNldF93aW5zel9vcGNvZGVfbWF5YmVfbmVnLCBvdXJfd2luc3opCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5jbG9zZShtZmQpCisgICAgICAgICAgICBvcy5jbG9zZShzZmQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoSW9jdGxUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW9jdGwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW9jdGwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTJhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pb2N0bC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW9jdGwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaW9jdGwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZTJhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pb2N0bC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lzaW5zdGFuY2UucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViMDgxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lzaW5zdGFuY2UucHkKQEAgLTAsMCArMSwyNzcgQEAKKyMgVGVzdHMgc29tZSBjb3JuZXIgY2FzZXMgd2l0aCBpc2luc3RhbmNlKCkgYW5kIGlzc3ViY2xhc3MoKS4gIFdoaWxlIHRoZXNlCisjIHRlc3RzIHVzZSBuZXcgc3R5bGUgY2xhc3NlcyBhbmQgcHJvcGVydGllcywgdGhleSBhY3R1YWxseSBkbyB3aGl0ZWJveAorIyB0ZXN0aW5nIG9mIGVycm9yIGNvbmRpdGlvbnMgdW5jb3ZlcmVkIHdoZW4gdXNpbmcgZXh0ZW5zaW9uIHR5cGVzLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgc3lzCisKKworDAorY2xhc3MgVGVzdElzSW5zdGFuY2VFeGNlcHRpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgYW4gQXR0cmlidXRlRXJyb3Igd2hlbiBhY2Nlc3NpbmcgdGhlIGluc3RhbmNlJ3MKKyAgICAjIGNsYXNzJ3MgYmFzZXMgaXMgbWFza2VkLiAgVGhpcyB3YXMgYWN0dWFsbHkgYSBidWcgaW4gUHl0aG9uIDIuMiBhbmQKKyAgICAjIDIuMi4xIHdoZXJlIHRoZSBleGNlcHRpb24gd2Fzbid0IGNhdWdodCBidXQgaXQgYWxzbyB3YXNuJ3QgYmVpbmcgY2xlYXJlZAorICAgICMgKGxlYWRpbmcgdG8gYW4gInVuZGV0ZWN0ZWQgZXJyb3IiIGluIHRoZSBkZWJ1ZyBidWlsZCkuICBTZXQgdXAgaXMsCisgICAgIyBpc2luc3RhbmNlKGluc3QsIGNscykgd2hlcmU6CisgICAgIworICAgICMgLSBpbnN0IGlzbid0IGFuIEluc3RhbmNlVHlwZQorICAgICMgLSBjbHMgaXNuJ3QgYSBDbGFzc1R5cGUsIGEgVHlwZVR5cGUsIG9yIGEgVHVwbGVUeXBlCisgICAgIyAtIGNscyBoYXMgYSBfX2Jhc2VzX18gYXR0cmlidXRlCisgICAgIyAtIGluc3QgaGFzIGEgX19jbGFzc19fIGF0dHJpYnV0ZQorICAgICMgLSBpbnN0Ll9fY2xhc3NfXyBhcyBubyBfX2Jhc2VzX18gYXR0cmlidXRlCisgICAgIworICAgICMgU291bmRzIGNvbXBsaWNhdGVkLCBJIGtub3csIGJ1dCB0aGlzIG1pbWljcyBhIHNpdHVhdGlvbiB3aGVyZSBhbgorICAgICMgZXh0ZW5zaW9uIHR5cGUgcmFpc2VzIGFuIEF0dHJpYnV0ZUVycm9yIHdoZW4gaXRzIF9fYmFzZXNfXyBhdHRyaWJ1dGUgaXMKKyAgICAjIGdvdHRlbi4gIEluIHRoYXQgY2FzZSwgaXNpbnN0YW5jZSgpIHNob3VsZCByZXR1cm4gRmFsc2UuCisgICAgZGVmIHRlc3RfY2xhc3NfaGFzX25vX2Jhc2VzKHNlbGYpOgorICAgICAgICBjbGFzcyBJKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0Y2xhc3Moc2VsZik6CisgICAgICAgICAgICAgICAgIyBUaGlzIG11c3QgcmV0dXJuIGFuIG9iamVjdCB0aGF0IGhhcyBubyBfX2Jhc2VzX18gYXR0cmlidXRlCisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIF9fY2xhc3NfXyA9IHByb3BlcnR5KGdldGNsYXNzKQorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXRiYXNlcyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCkKKyAgICAgICAgICAgIF9fYmFzZXNfXyA9IHByb3BlcnR5KGdldGJhc2VzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzaW5zdGFuY2UoSSgpLCBDKCkpKQorCisgICAgIyBMaWtlIGFib3ZlIGV4Y2VwdCB0aGF0IGluc3QuX19jbGFzc19fLl9fYmFzZXNfXyByYWlzZXMgYW4gZXhjZXB0aW9uCisgICAgIyBvdGhlciB0aGFuIEF0dHJpYnV0ZUVycm9yCisgICAgZGVmIHRlc3RfYmFzZXNfcmFpc2VzX290aGVyX3RoYW5fYXR0cmlidXRlX2Vycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBFKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBjbGFzcyBJKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0Y2xhc3Moc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIEUoKQorICAgICAgICAgICAgX19jbGFzc19fID0gcHJvcGVydHkoZ2V0Y2xhc3MpCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldGJhc2VzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoKQorICAgICAgICAgICAgX19iYXNlc19fID0gcHJvcGVydHkoZ2V0YmFzZXMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBpc2luc3RhbmNlLCBJKCksIEMoKSkKKworICAgICMgSGVyZSdzIGEgc2l0dWF0aW9uIHdoZXJlIGdldGF0dHIoY2xzLCAnX19iYXNlc19fJykgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KKyAgICAjIElmIHRoYXQgZXhjZXB0aW9uIGlzIG5vdCBBdHRyaWJ1dGVFcnJvciwgaXQgc2hvdWxkIG5vdCBnZXQgbWFza2VkCisgICAgZGVmIHRlc3RfZG9udF9tYXNrX25vbl9hdHRyaWJ1dGVfZXJyb3Ioc2VsZik6CisgICAgICAgIGNsYXNzIEk6IHBhc3MKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGlzaW5zdGFuY2UsIEkoKSwgQygpKQorCisgICAgIyBMaWtlIGFib3ZlLCBleGNlcHQgdGhhdCBnZXRhdHRyKGNscywgJ19fYmFzZXNfXycpIHJhaXNlcyBhbgorICAgICMgQXR0cmlidXRlRXJyb3IsIHdoaWNoIC9zaG91bGQvIGdldCBtYXNrZWQgYXMgYSBUeXBlRXJyb3IKKyAgICBkZWYgdGVzdF9tYXNrX2F0dHJpYnV0ZV9lcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgSTogcGFzcworCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBnZXRiYXNlcyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcgorICAgICAgICAgICAgX19iYXNlc19fID0gcHJvcGVydHkoZ2V0YmFzZXMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc2luc3RhbmNlLCBJKCksIEMoKSkKKworCisMCisjIFRoZXNlIHRlc3RzIGFyZSBzaW1pbGFyIHRvIGFib3ZlLCBidXQgdGlja2xlIGNlcnRhaW4gY29kZSBwYXRocyBpbgorIyBpc3N1YmNsYXNzKCkgaW5zdGVhZCBvZiBpc2luc3RhbmNlKCkgLS0gcmVhbGx5IFB5T2JqZWN0X0lzU3ViY2xhc3MoKQorIyB2cy4gUHlPYmplY3RfSXNJbnN0YW5jZSgpLgorY2xhc3MgVGVzdElzU3ViY2xhc3NFeGNlcHRpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9kb250X21hc2tfbm9uX2F0dHJpYnV0ZV9lcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldGJhc2VzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgX19iYXNlc19fID0gcHJvcGVydHkoZ2V0YmFzZXMpCisKKyAgICAgICAgY2xhc3MgUyhDKTogcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgaXNzdWJjbGFzcywgQygpLCBTKCkpCisKKyAgICBkZWYgdGVzdF9tYXNrX2F0dHJpYnV0ZV9lcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldGJhc2VzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBjbGFzcyBTKEMpOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzLCBDKCksIFMoKSkKKworICAgICMgTGlrZSBhYm92ZSwgYnV0IHRlc3QgdGhlIHNlY29uZCBicmFuY2gsIHdoZXJlIHRoZSBfX2Jhc2VzX18gb2YgdGhlCisgICAgIyBzZWNvbmQgYXJnICh0aGUgY2xzIGFyZykgaXMgdGVzdGVkLiAgVGhpcyBtZWFucyB0aGUgZmlyc3QgYXJnIG11c3QKKyAgICAjIHJldHVybiBhIHZhbGlkIF9fYmFzZXNfXywgYW5kIGl0J3Mgb2theSBmb3IgaXQgdG8gYmUgYSBub3JtYWwgLS0KKyAgICAjIHVucmVsYXRlZCBieSBpbmhlcml0YW5jZSAtLSBjbGFzcy4KKyAgICBkZWYgdGVzdF9kb250X21hc2tfbm9uX2F0dHJpYnV0ZV9lcnJvcl9pbl9jbHNfYXJnKHNlbGYpOgorICAgICAgICBjbGFzcyBCOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldGJhc2VzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgX19iYXNlc19fID0gcHJvcGVydHkoZ2V0YmFzZXMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBpc3N1YmNsYXNzLCBCLCBDKCkpCisKKyAgICBkZWYgdGVzdF9tYXNrX2F0dHJpYnV0ZV9lcnJvcl9pbl9jbHNfYXJnKHNlbGYpOgorICAgICAgICBjbGFzcyBCOiBwYXNzCisKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldGJhc2VzKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yCisgICAgICAgICAgICBfX2Jhc2VzX18gPSBwcm9wZXJ0eShnZXRiYXNlcykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzc3ViY2xhc3MsIEIsIEMoKSkKKworCisMCisjIG1ldGEgY2xhc3NlcyBmb3IgY3JlYXRpbmcgYWJzdHJhY3QgY2xhc3NlcyBhbmQgaW5zdGFuY2VzCitjbGFzcyBBYnN0cmFjdENsYXNzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJhc2VzKToKKyAgICAgICAgc2VsZi5iYXNlcyA9IGJhc2VzCisKKyAgICBkZWYgZ2V0YmFzZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2VzCisgICAgX19iYXNlc19fID0gcHJvcGVydHkoZ2V0YmFzZXMpCisKKyAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgIHJldHVybiBBYnN0cmFjdEluc3RhbmNlKHNlbGYpCisKK2NsYXNzIEFic3RyYWN0SW5zdGFuY2Uob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwga2xhc3MpOgorICAgICAgICBzZWxmLmtsYXNzID0ga2xhc3MKKworICAgIGRlZiBnZXRjbGFzcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYua2xhc3MKKyAgICBfX2NsYXNzX18gPSBwcm9wZXJ0eShnZXRjbGFzcykKKworIyBhYnN0cmFjdCBjbGFzc2VzCitBYnN0cmFjdFN1cGVyID0gQWJzdHJhY3RDbGFzcyhiYXNlcz0oKSkKKworQWJzdHJhY3RDaGlsZCA9IEFic3RyYWN0Q2xhc3MoYmFzZXM9KEFic3RyYWN0U3VwZXIsKSkKKworIyBub3JtYWwgY2xhc3NlcworY2xhc3MgU3VwZXI6CisgICAgcGFzcworCitjbGFzcyBDaGlsZChTdXBlcik6CisgICAgcGFzcworCisjIG5ldy1zdHlsZSBjbGFzc2VzCitjbGFzcyBOZXdTdXBlcihvYmplY3QpOgorICAgIHBhc3MKKworY2xhc3MgTmV3Q2hpbGQoTmV3U3VwZXIpOgorICAgIHBhc3MKKworCisMCitjbGFzcyBUZXN0SXNJbnN0YW5jZUlzU3ViY2xhc3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdHMgdG8gZW5zdXJlIHRoYXQgaXNpbnN0YW5jZSBhbmQgaXNzdWJjbGFzcyB3b3JrIG9uIGFic3RyYWN0CisgICAgIyBjbGFzc2VzIGFuZCBpbnN0YW5jZXMuICBCZWZvcmUgdGhlIDIuMiByZWxlYXNlLCBUeXBlRXJyb3JzIHdlcmUKKyAgICAjIHJhaXNlZCB3aGVuIGJvb2xlYW4gdmFsdWVzIHNob3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQuICBUaGUgYnVnIHdhcworICAgICMgdHJpZ2dlcmVkIGJ5IG1peGluZyAnbm9ybWFsJyBjbGFzc2VzIGFuZCBpbnN0YW5jZXMgd2VyZSB3aXRoCisgICAgIyAnYWJzdHJhY3QnIGNsYXNzZXMgYW5kIGluc3RhbmNlcy4gIFRoaXMgY2FzZSB0cmllcyB0byB0ZXN0IGFsbAorICAgICMgY29tYmluYXRpb25zLgorCisgICAgZGVmIHRlc3RfaXNpbnN0YW5jZV9ub3JtYWwoc2VsZik6CisgICAgICAgICMgbm9ybWFsIGluc3RhbmNlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzaW5zdGFuY2UoU3VwZXIoKSwgU3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc2luc3RhbmNlKFN1cGVyKCksIENoaWxkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShTdXBlcigpLCBBYnN0cmFjdFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShTdXBlcigpLCBBYnN0cmFjdENoaWxkKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzaW5zdGFuY2UoQ2hpbGQoKSwgU3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc2luc3RhbmNlKENoaWxkKCksIEFic3RyYWN0U3VwZXIpKQorCisgICAgZGVmIHRlc3RfaXNpbnN0YW5jZV9hYnN0cmFjdChzZWxmKToKKyAgICAgICAgIyBhYnN0cmFjdCBpbnN0YW5jZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc2luc3RhbmNlKEFic3RyYWN0U3VwZXIoKSwgQWJzdHJhY3RTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzaW5zdGFuY2UoQWJzdHJhY3RTdXBlcigpLCBBYnN0cmFjdENoaWxkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShBYnN0cmFjdFN1cGVyKCksIFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNpbnN0YW5jZShBYnN0cmFjdFN1cGVyKCksIENoaWxkKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzaW5zdGFuY2UoQWJzdHJhY3RDaGlsZCgpLCBBYnN0cmFjdENoaWxkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc2luc3RhbmNlKEFic3RyYWN0Q2hpbGQoKSwgQWJzdHJhY3RTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzaW5zdGFuY2UoQWJzdHJhY3RDaGlsZCgpLCBTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzaW5zdGFuY2UoQWJzdHJhY3RDaGlsZCgpLCBDaGlsZCkpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19ub3JtYWwoc2VsZik6CisgICAgICAgICMgbm9ybWFsIGNsYXNzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKFN1cGVyLCBTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoU3VwZXIsIEFic3RyYWN0U3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc3N1YmNsYXNzKFN1cGVyLCBDaGlsZCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKENoaWxkLCBDaGlsZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhDaGlsZCwgU3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc3N1YmNsYXNzKENoaWxkLCBBYnN0cmFjdFN1cGVyKSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX2Fic3RyYWN0KHNlbGYpOgorICAgICAgICAjIGFic3RyYWN0IGNsYXNzZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKEFic3RyYWN0U3VwZXIsIEFic3RyYWN0U3VwZXIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc3N1YmNsYXNzKEFic3RyYWN0U3VwZXIsIEFic3RyYWN0Q2hpbGQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBpc3N1YmNsYXNzKEFic3RyYWN0U3VwZXIsIENoaWxkKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoQWJzdHJhY3RDaGlsZCwgQWJzdHJhY3RDaGlsZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhBYnN0cmFjdENoaWxkLCBBYnN0cmFjdFN1cGVyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNzdWJjbGFzcyhBYnN0cmFjdENoaWxkLCBTdXBlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoQWJzdHJhY3RDaGlsZCwgQ2hpbGQpKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfdHVwbGUoc2VsZik6CisgICAgICAgICMgdGVzdCB3aXRoIGEgdHVwbGUgYXMgdGhlIHNlY29uZCBhcmd1bWVudCBjbGFzc2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgaXNzdWJjbGFzcyhDaGlsZCwgKENoaWxkLCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoQ2hpbGQsIChTdXBlciwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNzdWJjbGFzcyhTdXBlciwgKENoaWxkLCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoU3VwZXIsIChDaGlsZCwgU3VwZXIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgaXNzdWJjbGFzcyhDaGlsZCwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoU3VwZXIsIChDaGlsZCwgKFN1cGVyLCkpKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGlzc3ViY2xhc3MoTmV3Q2hpbGQsIChOZXdDaGlsZCwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKE5ld0NoaWxkLCAoTmV3U3VwZXIsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoTmV3U3VwZXIsIChOZXdDaGlsZCwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKE5ld1N1cGVyLCAoTmV3Q2hpbGQsIE5ld1N1cGVyKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGlzc3ViY2xhc3MoTmV3Q2hpbGQsICgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKE5ld1N1cGVyLCAoTmV3Q2hpbGQsIChOZXdTdXBlciwpKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKGludCwgKGxvbmcsIChmbG9hdCwgaW50KSkpKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBpc3N1YmNsYXNzKHN0ciwgKHVuaWNvZGUsIChDaGlsZCwgTmV3Q2hpbGQsIGJhc2VzdHJpbmcpKSkpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWN1cnNpb25fbGltaXQoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgaXNzdWJjbGFzcyByYWlzZXMgUnVudGltZUVycm9yIGJlZm9yZSB0aGUgQyBzdGFjayBpcworICAgICAgICAjIGJsb3duCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgYmxvd3N0YWNrLCBpc3N1YmNsYXNzLCBzdHIsIHN0cikKKworICAgIGRlZiB0ZXN0X2lzaW5zdGFuY2VfcmVjdXJzaW9uX2xpbWl0KHNlbGYpOgorICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGlzc3ViY2xhc3MgcmFpc2VzIFJ1bnRpbWVFcnJvciBiZWZvcmUgdGhlIEMgc3RhY2sgaXMKKyAgICAgICAgIyBibG93bgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGJsb3dzdGFjaywgaXNpbnN0YW5jZSwgJycsIHN0cikKKworZGVmIGJsb3dzdGFjayhmeG4sIGFyZywgY29tcGFyZV90byk6CisgICAgIyBNYWtlIHN1cmUgdGhhdCBjYWxsaW5nIGlzaW5zdGFuY2Ugd2l0aCBhIGRlZXBseSBuZXN0ZWQgdHVwbGUgZm9yIGl0cworICAgICMgYXJndW1lbnQgd2lsbCByYWlzZSBSdW50aW1lRXJyb3IgZXZlbnR1YWxseS4KKyAgICB0dXBsZV9hcmcgPSAoY29tcGFyZV90bywpCisgICAgZm9yIGNudCBpbiB4cmFuZ2Uoc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCkrNSk6CisgICAgICAgIHR1cGxlX2FyZyA9ICh0dXBsZV9hcmcsKQorICAgICAgICBmeG4oYXJnLCB0dXBsZV9hcmcpCisKKwwKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBUZXN0SXNJbnN0YW5jZUV4Y2VwdGlvbnMsCisgICAgICAgIFRlc3RJc1N1YmNsYXNzRXhjZXB0aW9ucywKKyAgICAgICAgVGVzdElzSW5zdGFuY2VJc1N1YmNsYXNzCisgICAgKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lzaW5zdGFuY2UucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZTg2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lzaW5zdGFuY2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lzaW5zdGFuY2UucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXNpbnN0YW5jZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhZTg2NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2lzaW5zdGFuY2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzM5ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5CkBAIC0wLDAgKzEsOTMyIEBACisjIFRlc3QgaXRlcmF0b3JzLgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVEVTVEZOLCB1bmxpbmssIGhhdmVfdW5pY29kZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfcHkza193YXJuaW5ncywgY3B5dGhvbl9vbmx5CisKKyMgVGVzdCByZXN1bHQgb2YgdHJpcGxlIGxvb3AgKHRvbyBiaWcgdG8gaW5saW5lKQorVFJJUExFVFMgPSBbKDAsIDAsIDApLCAoMCwgMCwgMSksICgwLCAwLCAyKSwKKyAgICAgICAgICAgICgwLCAxLCAwKSwgKDAsIDEsIDEpLCAoMCwgMSwgMiksCisgICAgICAgICAgICAoMCwgMiwgMCksICgwLCAyLCAxKSwgKDAsIDIsIDIpLAorCisgICAgICAgICAgICAoMSwgMCwgMCksICgxLCAwLCAxKSwgKDEsIDAsIDIpLAorICAgICAgICAgICAgKDEsIDEsIDApLCAoMSwgMSwgMSksICgxLCAxLCAyKSwKKyAgICAgICAgICAgICgxLCAyLCAwKSwgKDEsIDIsIDEpLCAoMSwgMiwgMiksCisKKyAgICAgICAgICAgICgyLCAwLCAwKSwgKDIsIDAsIDEpLCAoMiwgMCwgMiksCisgICAgICAgICAgICAoMiwgMSwgMCksICgyLCAxLCAxKSwgKDIsIDEsIDIpLAorICAgICAgICAgICAgKDIsIDIsIDApLCAoMiwgMiwgMSksICgyLCAyLCAyKV0KKworIyBIZWxwZXIgY2xhc3NlcworCitjbGFzcyBCYXNpY0l0ZXJDbGFzczoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbik6CisgICAgICAgIHNlbGYubiA9IG4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByZXMgPSBzZWxmLmkKKyAgICAgICAgaWYgcmVzID49IHNlbGYubjoKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgc2VsZi5pID0gcmVzICsgMQorICAgICAgICByZXR1cm4gcmVzCisKK2NsYXNzIEl0ZXJhdGluZ1NlcXVlbmNlQ2xhc3M6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG4pOgorICAgICAgICBzZWxmLm4gPSBuCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gQmFzaWNJdGVyQ2xhc3Moc2VsZi5uKQorCitjbGFzcyBTZXF1ZW5jZUNsYXNzOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuKToKKyAgICAgICAgc2VsZi5uID0gbgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgaWYgMCA8PSBpIDwgc2VsZi5uOgorICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKworIyBNYWluIHRlc3Qgc3VpdGUKKworY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBIZWxwZXIgdG8gY2hlY2sgdGhhdCBhbiBpdGVyYXRvciByZXR1cm5zIGEgZ2l2ZW4gc2VxdWVuY2UKKyAgICBkZWYgY2hlY2tfaXRlcmF0b3Ioc2VsZiwgaXQsIHNlcSk6CisgICAgICAgIHJlcyA9IFtdCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsID0gaXQubmV4dCgpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgcmVzLmFwcGVuZCh2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzZXEpCisKKyAgICAjIEhlbHBlciB0byBjaGVjayB0aGF0IGEgZm9yIGxvb3AgZ2VuZXJhdGVzIGEgZ2l2ZW4gc2VxdWVuY2UKKyAgICBkZWYgY2hlY2tfZm9yX2xvb3Aoc2VsZiwgZXhwciwgc2VxKToKKyAgICAgICAgcmVzID0gW10KKyAgICAgICAgZm9yIHZhbCBpbiBleHByOgorICAgICAgICAgICAgcmVzLmFwcGVuZCh2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzZXEpCisKKyAgICAjIFRlc3QgYmFzaWMgdXNlIG9mIGl0ZXIoKSBmdW5jdGlvbgorICAgIGRlZiB0ZXN0X2l0ZXJfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaXRlcmF0b3IoaXRlcihyYW5nZSgxMCkpLCByYW5nZSgxMCkpCisKKyAgICAjIFRlc3QgdGhhdCBpdGVyKGl0ZXIoeCkpIGlzIHRoZSBzYW1lIGFzIGl0ZXIoeCkKKyAgICBkZWYgdGVzdF9pdGVyX2lkZW1wb3RlbmN5KHNlbGYpOgorICAgICAgICBzZXEgPSByYW5nZSgxMCkKKyAgICAgICAgaXQgPSBpdGVyKHNlcSkKKyAgICAgICAgaXQyID0gaXRlcihpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0IGlzIGl0MikKKworICAgICMgVGVzdCB0aGF0IGZvciBsb29wcyBvdmVyIGl0ZXJhdG9ycyB3b3JrCisgICAgZGVmIHRlc3RfaXRlcl9mb3JfbG9vcChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChpdGVyKHJhbmdlKDEwKSksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCBzZXZlcmFsIGluZGVwZW5kZW50IGl0ZXJhdG9ycyBvdmVyIHRoZSBzYW1lIGxpc3QKKyAgICBkZWYgdGVzdF9pdGVyX2luZGVwZW5kZW5jZShzZWxmKToKKyAgICAgICAgc2VxID0gcmFuZ2UoMykKKyAgICAgICAgcmVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gaXRlcihzZXEpOgorICAgICAgICAgICAgZm9yIGogaW4gaXRlcihzZXEpOgorICAgICAgICAgICAgICAgIGZvciBrIGluIGl0ZXIoc2VxKToKKyAgICAgICAgICAgICAgICAgICAgcmVzLmFwcGVuZCgoaSwgaiwgaykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBUUklQTEVUUykKKworICAgICMgVGVzdCB0cmlwbGUgbGlzdCBjb21wcmVoZW5zaW9uIHVzaW5nIGl0ZXJhdG9ycworICAgIGRlZiB0ZXN0X25lc3RlZF9jb21wcmVoZW5zaW9uc19pdGVyKHNlbGYpOgorICAgICAgICBzZXEgPSByYW5nZSgzKQorICAgICAgICByZXMgPSBbKGksIGosIGspCisgICAgICAgICAgICAgICBmb3IgaSBpbiBpdGVyKHNlcSkgZm9yIGogaW4gaXRlcihzZXEpIGZvciBrIGluIGl0ZXIoc2VxKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIFRSSVBMRVRTKQorCisgICAgIyBUZXN0IHRyaXBsZSBsaXN0IGNvbXByZWhlbnNpb24gd2l0aG91dCBpdGVyYXRvcnMKKyAgICBkZWYgdGVzdF9uZXN0ZWRfY29tcHJlaGVuc2lvbnNfZm9yKHNlbGYpOgorICAgICAgICBzZXEgPSByYW5nZSgzKQorICAgICAgICByZXMgPSBbKGksIGosIGspIGZvciBpIGluIHNlcSBmb3IgaiBpbiBzZXEgZm9yIGsgaW4gc2VxXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgVFJJUExFVFMpCisKKyAgICAjIFRlc3QgYSBjbGFzcyB3aXRoIF9faXRlcl9fIGluIGEgZm9yIGxvb3AKKyAgICBkZWYgdGVzdF9pdGVyX2NsYXNzX2ZvcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDEwKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IGEgY2xhc3Mgd2l0aCBfX2l0ZXJfXyB3aXRoIGV4cGxpY2l0IGl0ZXIoKQorICAgIGRlZiB0ZXN0X2l0ZXJfY2xhc3NfaXRlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pdGVyYXRvcihpdGVyKEl0ZXJhdGluZ1NlcXVlbmNlQ2xhc3MoMTApKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IGZvciBsb29wIG9uIGEgc2VxdWVuY2UgY2xhc3Mgd2l0aG91dCBfX2l0ZXJfXworICAgIGRlZiB0ZXN0X3NlcV9jbGFzc19mb3Ioc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZm9yX2xvb3AoU2VxdWVuY2VDbGFzcygxMCksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCBpdGVyKCkgb24gYSBzZXF1ZW5jZSBjbGFzcyB3aXRob3V0IF9faXRlcl9fCisgICAgZGVmIHRlc3Rfc2VxX2NsYXNzX2l0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfaXRlcmF0b3IoaXRlcihTZXF1ZW5jZUNsYXNzKDEwKSksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCBhIG5ld19zdHlsZSBjbGFzcyB3aXRoIF9faXRlcl9fIGJ1dCBubyBuZXh0KCkgbWV0aG9kCisgICAgZGVmIHRlc3RfbmV3X3N0eWxlX2l0ZXJfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIEl0ZXJDbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXRlciwgSXRlckNsYXNzKCkpCisKKyAgICAjIFRlc3QgdHdvLWFyZ3VtZW50IGl0ZXIoKSB3aXRoIGNhbGxhYmxlIGluc3RhbmNlCisgICAgZGVmIHRlc3RfaXRlcl9jYWxsYWJsZShzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmkgPSAwCisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgaSA9IHNlbGYuaQorICAgICAgICAgICAgICAgIHNlbGYuaSA9IGkgKyAxCisgICAgICAgICAgICAgICAgaWYgaSA+IDEwMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvciAjIEVtZXJnZW5jeSBzdG9wCisgICAgICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgc2VsZi5jaGVja19pdGVyYXRvcihpdGVyKEMoKSwgMTApLCByYW5nZSgxMCkpCisKKyAgICAjIFRlc3QgdHdvLWFyZ3VtZW50IGl0ZXIoKSB3aXRoIGZ1bmN0aW9uCisgICAgZGVmIHRlc3RfaXRlcl9mdW5jdGlvbihzZWxmKToKKyAgICAgICAgZGVmIHNwYW0oc3RhdGU9WzBdKToKKyAgICAgICAgICAgIGkgPSBzdGF0ZVswXQorICAgICAgICAgICAgc3RhdGVbMF0gPSBpKzEKKyAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgIHNlbGYuY2hlY2tfaXRlcmF0b3IoaXRlcihzcGFtLCAxMCksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCB0d28tYXJndW1lbnQgaXRlcigpIHdpdGggZnVuY3Rpb24gdGhhdCByYWlzZXMgU3RvcEl0ZXJhdGlvbgorICAgIGRlZiB0ZXN0X2l0ZXJfZnVuY3Rpb25fc3RvcChzZWxmKToKKyAgICAgICAgZGVmIHNwYW0oc3RhdGU9WzBdKToKKyAgICAgICAgICAgIGkgPSBzdGF0ZVswXQorICAgICAgICAgICAgaWYgaSA9PSAxMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBzdGF0ZVswXSA9IGkrMQorICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAgICAgc2VsZi5jaGVja19pdGVyYXRvcihpdGVyKHNwYW0sIDIwKSwgcmFuZ2UoMTApKQorCisgICAgIyBUZXN0IGV4Y2VwdGlvbiBwcm9wYWdhdGlvbiB0aHJvdWdoIGZ1bmN0aW9uIGl0ZXJhdG9yCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBkZWYgc3BhbShzdGF0ZT1bMF0pOgorICAgICAgICAgICAgaSA9IHN0YXRlWzBdCisgICAgICAgICAgICBzdGF0ZVswXSA9IGkrMQorICAgICAgICAgICAgaWYgaSA9PSAxMDoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgIHJldHVybiBpCisgICAgICAgIHJlcyA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciB4IGluIGl0ZXIoc3BhbSwgMjApOgorICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoeCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCByYW5nZSgxMCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBSdW50aW1lRXJyb3IiKQorCisgICAgIyBUZXN0IGV4Y2VwdGlvbiBwcm9wYWdhdGlvbiB0aHJvdWdoIHNlcXVlbmNlIGl0ZXJhdG9yCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVNlcXVlbmNlQ2xhc3MoU2VxdWVuY2VDbGFzcyk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgaWYgaSA9PSAxMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICAgICAgcmV0dXJuIFNlcXVlbmNlQ2xhc3MuX19nZXRpdGVtX18oc2VsZiwgaSkKKyAgICAgICAgcmVzID0gW10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHggaW4gTXlTZXF1ZW5jZUNsYXNzKDIwKToKKyAgICAgICAgICAgICAgICByZXMuYXBwZW5kKHgpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgcmFuZ2UoMTApKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUnVudGltZUVycm9yIikKKworICAgICMgVGVzdCBmb3IgU3RvcEl0ZXJhdGlvbiBmcm9tIF9fZ2V0aXRlbV9fCisgICAgZGVmIHRlc3Rfc3RvcF9zZXF1ZW5jZShzZWxmKToKKyAgICAgICAgY2xhc3MgTXlTZXF1ZW5jZUNsYXNzKFNlcXVlbmNlQ2xhc3MpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIGlmIGkgPT0gMTA6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gU2VxdWVuY2VDbGFzcy5fX2dldGl0ZW1fXyhzZWxmLCBpKQorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKE15U2VxdWVuY2VDbGFzcygyMCksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCBhIGJpZyByYW5nZQorICAgIGRlZiB0ZXN0X2l0ZXJfYmlnX3JhbmdlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGl0ZXIocmFuZ2UoMTAwMDApKSwgcmFuZ2UoMTAwMDApKQorCisgICAgIyBUZXN0IGFuIGVtcHR5IGxpc3QKKyAgICBkZWYgdGVzdF9pdGVyX2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGl0ZXIoW10pLCBbXSkKKworICAgICMgVGVzdCBhIHR1cGxlCisgICAgZGVmIHRlc3RfaXRlcl90dXBsZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChpdGVyKCgwLDEsMiwzLDQsNSw2LDcsOCw5KSksIHJhbmdlKDEwKSkKKworICAgICMgVGVzdCBhbiB4cmFuZ2UKKyAgICBkZWYgdGVzdF9pdGVyX3hyYW5nZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChpdGVyKHhyYW5nZSgxMCkpLCByYW5nZSgxMCkpCisKKyAgICAjIFRlc3QgYSBzdHJpbmcKKyAgICBkZWYgdGVzdF9pdGVyX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChpdGVyKCJhYmNkZSIpLCBbImEiLCAiYiIsICJjIiwgImQiLCAiZSJdKQorCisgICAgIyBUZXN0IGEgVW5pY29kZSBzdHJpbmcKKyAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgIGRlZiB0ZXN0X2l0ZXJfdW5pY29kZShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm9yX2xvb3AoaXRlcih1bmljb2RlKCJhYmNkZSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VuaWNvZGUoImEiKSwgdW5pY29kZSgiYiIpLCB1bmljb2RlKCJjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlKCJkIiksIHVuaWNvZGUoImUiKV0pCisKKyAgICAjIFRlc3QgYSBkaXJlY3RvcnkKKyAgICBkZWYgdGVzdF9pdGVyX2RpY3Qoc2VsZik6CisgICAgICAgIGRpY3QgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBkaWN0W2ldID0gTm9uZQorICAgICAgICBzZWxmLmNoZWNrX2Zvcl9sb29wKGRpY3QsIGRpY3Qua2V5cygpKQorCisgICAgIyBUZXN0IGEgZmlsZQorICAgIGRlZiB0ZXN0X2l0ZXJfZmlsZShzZWxmKToKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIGYud3JpdGUoIiVkXG4iICUgaSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jaGVja19mb3JfbG9vcChmLCBbIjBcbiIsICIxXG4iLCAiMlxuIiwgIjNcbiIsICI0XG4iXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZm9yX2xvb3AoZiwgW10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgIyBUZXN0IGxpc3QoKSdzIHVzZSBvZiBpdGVyYXRvcnMuCisgICAgZGVmIHRlc3RfYnVpbHRpbl9saXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoU2VxdWVuY2VDbGFzcyg1KSksIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoU2VxdWVuY2VDbGFzcygwKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoKCkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJhbmdlKDEwLCAtMSwgLTEpKSwgcmFuZ2UoMTAsIC0xLCAtMSkpCisKKyAgICAgICAgZCA9IHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkKSwgZC5rZXlzKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIDQyKQorCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCIlZFxuIiAlIGkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChmKSwgWyIwXG4iLCAiMVxuIiwgIjJcbiIsICIzXG4iLCAiNFxuIl0pCisgICAgICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIwXG4iLCAiMVxuIiwgIjJcbiIsICIzXG4iLCAiNFxuIl0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgIyBUZXN0IHR1cGxlcygpJ3MgdXNlIG9mIGl0ZXJhdG9ycy4KKyAgICBkZWYgdGVzdF9idWlsdGluX3R1cGxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKFNlcXVlbmNlQ2xhc3MoNSkpLCAoMCwgMSwgMiwgMywgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoU2VxdWVuY2VDbGFzcygwKSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKFtdKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoKCkpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSgiYWJjIiksICgiYSIsICJiIiwgImMiKSkKKworICAgICAgICBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShkKSwgdHVwbGUoZC5rZXlzKCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHVwbGUsIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHVwbGUsIDQyKQorCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCIlZFxuIiAlIGkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoZiksICgiMFxuIiwgIjFcbiIsICIyXG4iLCAiM1xuIiwgIjRcbiIpKQorICAgICAgICAgICAgZi5zZWVrKDAsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKGYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIjBcbiIsICIxXG4iLCAiMlxuIiwgIjNcbiIsICI0XG4iKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAjIFRlc3QgZmlsdGVyKCkncyB1c2Ugb2YgaXRlcmF0b3JzLgorICAgIGRlZiB0ZXN0X2J1aWx0aW5fZmlsdGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihOb25lLCBTZXF1ZW5jZUNsYXNzKDUpKSwgcmFuZ2UoMSwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsdGVyKE5vbmUsIFNlcXVlbmNlQ2xhc3MoMCkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIoTm9uZSwgKCkpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIoTm9uZSwgImFiYyIpLCAiYWJjIikKKworICAgICAgICBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaWx0ZXIoTm9uZSwgZCksIGQua2V5cygpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZmlsdGVyLCBOb25lLCBsaXN0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZpbHRlciwgTm9uZSwgNDIpCisKKyAgICAgICAgY2xhc3MgQm9vbGVhbjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0cnV0aCk6CisgICAgICAgICAgICAgICAgc2VsZi50cnV0aCA9IHRydXRoCisgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJ1dGgKKyAgICAgICAgYlRydWUgPSBCb29sZWFuKDEpCisgICAgICAgIGJGYWxzZSA9IEJvb2xlYW4oMCkKKworICAgICAgICBjbGFzcyBTZXE6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgICAgIHNlbGYudmFscyA9IGFyZ3MKKyAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBjbGFzcyBTZXFJdGVyOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFscyk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbHMgPSB2YWxzCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmkgPSAwCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgaSA9IHNlbGYuaQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pID0gaSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGkgPCBsZW4oc2VsZi52YWxzKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWxzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICByZXR1cm4gU2VxSXRlcihzZWxmLnZhbHMpCisKKyAgICAgICAgc2VxID0gU2VxKCooW2JUcnVlLCBiRmFsc2VdICogMjUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihsYW1iZGEgeDogbm90IHgsIHNlcSksIFtiRmFsc2VdKjI1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbHRlcihsYW1iZGEgeDogbm90IHgsIGl0ZXIoc2VxKSksIFtiRmFsc2VdKjI1KQorCisgICAgIyBUZXN0IG1heCgpIGFuZCBtaW4oKSdzIHVzZSBvZiBpdGVyYXRvcnMuCisgICAgZGVmIHRlc3RfYnVpbHRpbl9tYXhfbWluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heChTZXF1ZW5jZUNsYXNzKDUpKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oU2VxdWVuY2VDbGFzcyg1KSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KDgsIC0xKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oOCwgLTEpLCAtMSkKKworICAgICAgICBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXgoZCksICJ0d28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1pbihkKSwgIm9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KGQuaXRlcnZhbHVlcygpKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oaXRlcihkLml0ZXJ2YWx1ZXMoKSkpLCAxKQorCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJtZWRpdW0gbGluZVxuIikKKyAgICAgICAgICAgIGYud3JpdGUoInh0cmEgbGFyZ2UgbGluZVxuIikKKyAgICAgICAgICAgIGYud3JpdGUoIml0dHktYml0dHkgbGluZVxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oZiksICJpdHR5LWJpdHR5IGxpbmVcbiIpCisgICAgICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF4KGYpLCAieHRyYSBsYXJnZSBsaW5lXG4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICMgVGVzdCBtYXAoKSdzIHVzZSBvZiBpdGVyYXRvcnMuCisgICAgZGVmIHRlc3RfYnVpbHRpbl9tYXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKGxhbWJkYSB4OiB4KzEsIFNlcXVlbmNlQ2xhc3MoNSkpLCByYW5nZSgxLCA2KSkKKworICAgICAgICBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXAobGFtYmRhIGssIGQ9ZDogKGssIGRba10pLCBkKSwgZC5pdGVtcygpKQorICAgICAgICBka2V5cyA9IGQua2V5cygpCisgICAgICAgIGV4cGVjdGVkID0gWyhpIDwgbGVuKGQpIGFuZCBka2V5c1tpXSBvciBOb25lLAorICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgIGkgPCBsZW4oZCkgYW5kIGRrZXlzW2ldIG9yIE5vbmUpCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpXQorCisgICAgICAgICMgRGVwcmVjYXRlZCBtYXAoTm9uZSwgLi4uKQorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKE5vbmUsIFNlcXVlbmNlQ2xhc3MoNSkpLCByYW5nZSg1KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKE5vbmUsIGQpLCBkLmtleXMoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKE5vbmUsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZUNsYXNzKDUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcihkLml0ZXJrZXlzKCkpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJ4eSIgKiBpICsgIlxuIikgIyBsaW5lIGkgaGFzIGxlbiAyKmkrMQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChsZW4sIGYpLCByYW5nZSgxLCAyMSwgMikpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgIyBUZXN0IHppcCgpJ3MgdXNlIG9mIGl0ZXJhdG9ycy4KKyAgICBkZWYgdGVzdF9idWlsdGluX3ppcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKCpbXSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgqWygxLCAyKSwgJ2FiJ10pLCBbKDEsICdhJyksICgyLCAnYicpXSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHppcCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB6aXAsIHJhbmdlKDEwKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgemlwLCByYW5nZSgxMCksIHppcCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcChJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKDAsKSwgKDEsKSwgKDIsKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKFNlcXVlbmNlQ2xhc3MoMykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwpLCAoMSwpLCAoMiwpXSkKKworICAgICAgICBkID0geyJvbmUiOiAxLCAidHdvIjogMiwgInRocmVlIjogM30KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLml0ZW1zKCksIHppcChkLCBkLml0ZXJ2YWx1ZXMoKSkpCisKKyAgICAgICAgIyBHZW5lcmF0ZSBhbGwgaW50cyBzdGFydGluZyBhdCBjb25zdHJ1Y3RvciBhcmcuCisgICAgICAgIGNsYXNzIEludHNGcm9tOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgICAgICAgICBzZWxmLmkgPSBzdGFydAorCisgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgaSA9IHNlbGYuaQorICAgICAgICAgICAgICAgIHNlbGYuaSA9IGkrMQorICAgICAgICAgICAgICAgIHJldHVybiBpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImFcbiIgImJiYlxuIiAiY2NcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKEludHNGcm9tKDApLCBmLCBJbnRzRnJvbSgtMTAwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwgImFcbiIsIC0xMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICJiYmJcbiIsIC05OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgImNjXG4iLCAtOTgpXSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoeHJhbmdlKDUpKSwgWyhpLCkgZm9yIGkgaW4gcmFuZ2UoNSldKQorCisgICAgICAgICMgQ2xhc3NlcyB0aGF0IGxpZSBhYm91dCB0aGVpciBsZW5ndGhzLgorICAgICAgICBjbGFzcyBOb0d1ZXNzTGVuNToKKyAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBpZiBpID49IDU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgICAgICAgICByZXR1cm4gaQorCisgICAgICAgIGNsYXNzIEd1ZXNzM0xlbjUoTm9HdWVzc0xlbjUpOgorICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDMKKworICAgICAgICBjbGFzcyBHdWVzczMwTGVuNShOb0d1ZXNzTGVuNSk6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMzAKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihHdWVzczNMZW41KCkpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihHdWVzczMwTGVuNSgpKSwgMzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKE5vR3Vlc3NMZW41KCkpLCB6aXAocmFuZ2UoNSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcChHdWVzczNMZW41KCkpLCB6aXAocmFuZ2UoNSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcChHdWVzczMwTGVuNSgpKSwgemlwKHJhbmdlKDUpKSkKKworICAgICAgICBleHBlY3RlZCA9IFsoaSwgaSkgZm9yIGkgaW4gcmFuZ2UoNSldCisgICAgICAgIGZvciB4IGluIE5vR3Vlc3NMZW41KCksIEd1ZXNzM0xlbjUoKSwgR3Vlc3MzMExlbjUoKToKKyAgICAgICAgICAgIGZvciB5IGluIE5vR3Vlc3NMZW41KCksIEd1ZXNzM0xlbjUoKSwgR3Vlc3MzMExlbjUoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCh4LCB5KSwgZXhwZWN0ZWQpCisKKyAgICAjIFRlc3QgcmVkdWNlcygpJ3MgdXNlIG9mIGl0ZXJhdG9ycy4KKyAgICBkZWYgdGVzdF9kZXByZWNhdGVkX2J1aWx0aW5fcmVkdWNlKHNlbGYpOgorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfYnVpbHRpbl9yZWR1Y2UoKQorCisgICAgZGVmIF90ZXN0X2J1aWx0aW5fcmVkdWNlKHNlbGYpOgorICAgICAgICBmcm9tIG9wZXJhdG9yIGltcG9ydCBhZGQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBTZXF1ZW5jZUNsYXNzKDUpKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgU2VxdWVuY2VDbGFzcyg1KSwgNDIpLCA1MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWR1Y2UsIGFkZCwgU2VxdWVuY2VDbGFzcygwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWR1Y2UoYWRkLCBTZXF1ZW5jZUNsYXNzKDApLCA0MiksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNlcXVlbmNlQ2xhc3MoMSkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZHVjZShhZGQsIFNlcXVlbmNlQ2xhc3MoMSksIDQyKSwgNDIpCisKKyAgICAgICAgZCA9IHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDN9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVkdWNlKGFkZCwgZCksICIiLmpvaW4oZC5rZXlzKCkpKQorCisgICAgIyBUaGlzIHRlc3QgY2FzZSB3aWxsIGJlIHJlbW92ZWQgaWYgd2UgZG9uJ3QgaGF2ZSBVbmljb2RlCisgICAgZGVmIHRlc3RfdW5pY29kZV9qb2luX2VuZGNhc2Uoc2VsZik6CisKKyAgICAgICAgIyBUaGlzIGNsYXNzIGluc2VydHMgYSBVbmljb2RlIG9iamVjdCBpbnRvIGl0cyBhcmd1bWVudCdzIG5hdHVyYWwKKyAgICAgICAgIyBpdGVyYXRpb24sIGluIHRoZSAzcmQgcG9zaXRpb24uCisgICAgICAgIGNsYXNzIE9oUGhvb2V5OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcSk6CisgICAgICAgICAgICAgICAgc2VsZi5pdCA9IGl0ZXIoc2VxKQorICAgICAgICAgICAgICAgIHNlbGYuaSA9IDAKKworICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgIGkgPSBzZWxmLmkKKyAgICAgICAgICAgICAgICBzZWxmLmkgPSBpKzEKKyAgICAgICAgICAgICAgICBpZiBpID09IDI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmljb2RlKCJmb29sZWQgeW91ISIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaXQubmV4dCgpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImFcbiIgKyAiYlxuIiArICJjXG4iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgICMgTmFzdHk6ICBzdHJpbmcuam9pbihzKSBjYW4ndCBrbm93IHdoZXRoZXIgdW5pY29kZS5qb2luKCkgaXMgbmVlZGVkCisgICAgICAgICMgdW50aWwgaXQncyBzZWVuIGFsbCBvZiBzJ3MgZWxlbWVudHMuICBCdXQgaW4gdGhpcyBjYXNlLCBmJ3MKKyAgICAgICAgIyBpdGVyYXRvciBjYW5ub3QgYmUgcmVzdGFydGVkLiAgU28gd2hhdCB3ZSdyZSB0ZXN0aW5nIGhlcmUgaXMKKyAgICAgICAgIyB3aGV0aGVyIHN0cmluZy5qb2luKCkgY2FuIG1hbmFnZSB0byByZW1lbWJlciBldmVyeXRoaW5nIGl0J3Mgc2VlbgorICAgICAgICAjIGFuZCBwYXNzIHRoYXQgb24gdG8gdW5pY29kZS5qb2luKCkuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdvdCA9ICIgLSAiLmpvaW4oT2hQaG9vZXkoZikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgdW5pY29kZSgiYVxuIC0gYlxuIC0gZm9vbGVkIHlvdSEgLSBjXG4iKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgaWYgbm90IGhhdmVfdW5pY29kZToKKyAgICAgICAgZGVmIHRlc3RfdW5pY29kZV9qb2luX2VuZGNhc2Uoc2VsZik6IHBhc3MKKworICAgICMgVGVzdCBpdGVyYXRvcnMgd2l0aCAneCBpbiB5JyBhbmQgJ3ggbm90IGluIHknLgorICAgIGRlZiB0ZXN0X2luX2FuZF9ub3RfaW4oc2VsZik6CisgICAgICAgIGZvciBzYzUgaW4gSXRlcmF0aW5nU2VxdWVuY2VDbGFzcyg1KSwgU2VxdWVuY2VDbGFzcyg1KToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgc2M1KQorICAgICAgICAgICAgZm9yIGkgaW4gImFiYyIsIC0xLCA1LCA0Mi40MiwgKDMsIDQpLCBbXSwgezE6IDF9LCAzLTEyaiwgc2M1OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaSwgc2M1KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAzIGluIDEyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogMyBub3QgaW4gbWFwKQorCisgICAgICAgIGQgPSB7Im9uZSI6IDEsICJ0d28iOiAyLCAidGhyZWUiOiAzLCAxajogMmp9CisgICAgICAgIGZvciBrIGluIGQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGssIGQpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGssIGQuaXRlcnZhbHVlcygpKQorICAgICAgICBmb3IgdiBpbiBkLnZhbHVlcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih2LCBkLml0ZXJ2YWx1ZXMoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4odiwgZCkKKyAgICAgICAgZm9yIGssIHYgaW4gZC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKGssIHYpLCBkLml0ZXJpdGVtcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbigodiwgayksIGQuaXRlcml0ZW1zKCkpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImFcbiIgImJcbiIgImNcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBjaHVuayBpbiAiYWJjIjoKKyAgICAgICAgICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGNodW5rLCBmKQorICAgICAgICAgICAgICAgIGYuc2VlaygwLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oKGNodW5rICsgIlxuIiksIGYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgIyBUZXN0IGl0ZXJhdG9ycyB3aXRoIG9wZXJhdG9yLmNvdW50T2YgKFB5U2VxdWVuY2VfQ291bnQpLgorICAgIGRlZiB0ZXN0X2NvdW50T2Yoc2VsZik6CisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGNvdW50T2YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudE9mKFsxLDIsMiwzLDIsNV0sIDIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50T2YoKDEsMiwyLDMsMiw1KSwgMiksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRPZigiMTIyMzI1IiwgIjIiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudE9mKCIxMjIzMjUiLCAiNiIpLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY291bnRPZiwgNDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY291bnRPZiwgY291bnRPZiwgY291bnRPZikKKworICAgICAgICBkID0geyJvbmUiOiAzLCAidHdvIjogMywgInRocmVlIjogMywgMWo6IDJqfQorICAgICAgICBmb3IgayBpbiBkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudE9mKGQsIGspLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50T2YoZC5pdGVydmFsdWVzKCksIDMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50T2YoZC5pdGVydmFsdWVzKCksIDJqKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudE9mKGQuaXRlcnZhbHVlcygpLCAxaiksIDApCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImFcbiIgImJcbiIgImNcbiIgImJcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAiciIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBsZXR0ZXIsIGNvdW50IGluICgiYSIsIDEpLCAoImIiLCAyKSwgKCJjIiwgMSksICgiZCIsIDApOgorICAgICAgICAgICAgICAgIGYuc2VlaygwLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRPZihmLCBsZXR0ZXIgKyAiXG4iKSwgY291bnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgIyBUZXN0IGl0ZXJhdG9ycyB3aXRoIG9wZXJhdG9yLmluZGV4T2YgKFB5U2VxdWVuY2VfSW5kZXgpLgorICAgIGRlZiB0ZXN0X2luZGV4T2Yoc2VsZik6CisgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGluZGV4T2YKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleE9mKFsxLDIsMiwzLDIsNV0sIDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4T2YoKDEsMiwyLDMsMiw1KSwgMiksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXhPZigoMSwyLDIsMywyLDUpLCAzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleE9mKCgxLDIsMiwzLDIsNSksIDUpLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbmRleE9mLCAoMSwyLDIsMywyLDUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbmRleE9mLCAoMSwyLDIsMywyLDUpLCA2KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXhPZigiMTIyMzI1IiwgIjIiKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleE9mKCIxMjIzMjUiLCAiNSIpLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbmRleE9mLCAiMTIyMzI1IiwgIjYiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW5kZXhPZiwgNDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW5kZXhPZiwgaW5kZXhPZiwgaW5kZXhPZikKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgiYVxuIiAiYlxuIiAiY1xuIiAiZFxuIiAiZVxuIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZml0ZXIgPSBpdGVyKGYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4T2YoZml0ZXIsICJiXG4iKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXhPZihmaXRlciwgImRcbiIpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleE9mKGZpdGVyLCAiZVxuIiksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbmRleE9mLCBmaXRlciwgImFcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGljbGFzcyA9IEl0ZXJhdGluZ1NlcXVlbmNlQ2xhc3MoMykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGV4T2YoaWNsYXNzLCBpKSwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaW5kZXhPZiwgaWNsYXNzLCAtMSkKKworICAgICMgVGVzdCBpdGVyYXRvcnMgd2l0aCBmaWxlLndyaXRlbGluZXMoKS4KKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzKHNlbGYpOgorICAgICAgICBmID0gZmlsZShURVNURk4sICJ3IikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYud3JpdGVsaW5lcywgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZi53cml0ZWxpbmVzLCA0MikKKworICAgICAgICAgICAgZi53cml0ZWxpbmVzKFsiMVxuIiwgIjJcbiJdKQorICAgICAgICAgICAgZi53cml0ZWxpbmVzKCgiM1xuIiwgIjRcbiIpKQorICAgICAgICAgICAgZi53cml0ZWxpbmVzKHsnNVxuJzogTm9uZX0pCisgICAgICAgICAgICBmLndyaXRlbGluZXMoe30pCisKKyAgICAgICAgICAgICMgVHJ5IGEgYmlnIGNodW5rIHRvby4KKyAgICAgICAgICAgIGNsYXNzIEl0ZXJhdG9yOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZmluaXNoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGFydCA9IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaSA9IHNlbGYuc3RhcnQKKworICAgICAgICAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmkgPj0gc2VsZi5maW5pc2g6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cihzZWxmLmkpICsgJ1xuJworICAgICAgICAgICAgICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGNsYXNzIFdoYXRldmVyOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydCwgZmluaXNoKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGFydCA9IHN0YXJ0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoCisKKyAgICAgICAgICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcihzZWxmLnN0YXJ0LCBzZWxmLmZpbmlzaCkKKworICAgICAgICAgICAgZi53cml0ZWxpbmVzKFdoYXRldmVyKDYsIDYrMjAwMCkpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IGZpbGUoVEVTVEZOKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBbc3RyKGkpICsgIlxuIiBmb3IgaSBpbiByYW5nZSgxLCAyMDA2KV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChmKSwgZXhwZWN0ZWQpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKworICAgICMgVGVzdCBpdGVyYXRvcnMgb24gUkhTIG9mIHVucGFja2luZyBhc3NpZ25tZW50cy4KKyAgICBkZWYgdGVzdF91bnBhY2tfaXRlcihzZWxmKToKKyAgICAgICAgYSwgYiA9IDEsIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSwgYiksICgxLCAyKSkKKworICAgICAgICBhLCBiLCBjID0gSXRlcmF0aW5nU2VxdWVuY2VDbGFzcygzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLCBiLCBjKSwgKDAsIDEsIDIpKQorCisgICAgICAgIHRyeTogICAgIyB0b28gbWFueSB2YWx1ZXMKKyAgICAgICAgICAgIGEsIGIgPSBJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDMpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgVmFsdWVFcnJvciIpCisKKyAgICAgICAgdHJ5OiAgICAjIG5vdCBlbm91Z2ggdmFsdWVzCisgICAgICAgICAgICBhLCBiLCBjID0gSXRlcmF0aW5nU2VxdWVuY2VDbGFzcygyKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFZhbHVlRXJyb3IiKQorCisgICAgICAgIHRyeTogICAgIyBub3QgaXRlcmFibGUKKyAgICAgICAgICAgIGEsIGIsIGMgPSBsZW4KKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFR5cGVFcnJvciIpCisKKyAgICAgICAgYSwgYiwgYyA9IHsxOiA0MiwgMjogNDIsIDM6IDQyfS5pdGVydmFsdWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSwgYiwgYyksICg0MiwgNDIsIDQyKSkKKworICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKKyAgICAgICAgbGluZXMgPSAoImFcbiIsICJiYlxuIiwgImNjY1xuIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICAgICAgZi53cml0ZShsaW5lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhLCBiLCBjID0gZgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSwgYiwgYyksIGxpbmVzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAoYSwgYiksIChjLCkgPSBJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDIpLCB7NDI6IDI0fQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLCBiLCBjKSwgKDAsIDEsIDQyKSkKKworCisgICAgQGNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3JlZl9jb3VudGluZ19iZWhhdmlvcihzZWxmKToKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgY291bnQgPSAwCisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMpOgorICAgICAgICAgICAgICAgIGNscy5jb3VudCArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX25ld19fKGNscykKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGNscyA9IHNlbGYuX19jbGFzc19fCisgICAgICAgICAgICAgICAgYXNzZXJ0IGNscy5jb3VudCA+IDAKKyAgICAgICAgICAgICAgICBjbHMuY291bnQgLT0gMQorICAgICAgICB4ID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5jb3VudCwgMSkKKyAgICAgICAgZGVsIHgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmNvdW50LCAwKQorICAgICAgICBsID0gW0MoKSwgQygpLCBDKCldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5jb3VudCwgMykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYSwgYiA9IGl0ZXIobCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlbCBsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5jb3VudCwgMCkKKworCisgICAgIyBNYWtlIHN1cmUgU3RvcEl0ZXJhdGlvbiBpcyBhICJzaW5rIHN0YXRlIi4KKyAgICAjIFRoaXMgdGVzdHMgdmFyaW91cyB0aGluZ3MgdGhhdCB3ZXJlbid0IHNpbmsgc3RhdGVzIGluIFB5dGhvbiAyLjIuMSwKKyAgICAjIHBsdXMgdmFyaW91cyB0aGluZ3MgdGhhdCBhbHdheXMgd2VyZSBmaW5lLgorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX2xpc3Qoc2VsZik6CisgICAgICAgICMgVGhpcyB1c2VkIHRvIGZhaWwKKyAgICAgICAgYSA9IHJhbmdlKDUpCisgICAgICAgIGIgPSBpdGVyKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgcmFuZ2UoNSkpCisgICAgICAgIGEuZXh0ZW5kKHJhbmdlKDUsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbXSkKKworICAgIGRlZiB0ZXN0X3NpbmtzdGF0ZV90dXBsZShzZWxmKToKKyAgICAgICAgYSA9ICgwLCAxLCAyLCAzLCA0KQorICAgICAgICBiID0gaXRlcihhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX3N0cmluZyhzZWxmKToKKyAgICAgICAgYSA9ICJhYmNkZSIKKyAgICAgICAgYiA9IGl0ZXIoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICAjIFRoaXMgdXNlZCB0byBmYWlsCisgICAgICAgIGEgPSBTZXF1ZW5jZUNsYXNzKDUpCisgICAgICAgIGIgPSBpdGVyKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgcmFuZ2UoNSkpCisgICAgICAgIGEubiA9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgW10pCisKKyAgICBkZWYgdGVzdF9zaW5rc3RhdGVfY2FsbGFibGUoc2VsZik6CisgICAgICAgICMgVGhpcyB1c2VkIHRvIGZhaWwKKyAgICAgICAgZGVmIHNwYW0oc3RhdGU9WzBdKToKKyAgICAgICAgICAgIGkgPSBzdGF0ZVswXQorICAgICAgICAgICAgc3RhdGVbMF0gPSBpKzEKKyAgICAgICAgICAgIGlmIGkgPT0gMTA6CisgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IsICJzaG91bGRuJ3QgaGF2ZSBnb3R0ZW4gdGhpcyBmYXIiCisgICAgICAgICAgICByZXR1cm4gaQorICAgICAgICBiID0gaXRlcihzcGFtLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX2RpY3Qoc2VsZik6CisgICAgICAgICMgWFhYIEZvciBhIG1vcmUgdGhvcm91Z2ggdGVzdCwgc2VlIHRvd2FyZHMgdGhlIGVuZCBvZjoKKyAgICAgICAgIyBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDItSnVseS8wMjY1MTIuaHRtbAorICAgICAgICBhID0gezE6MSwgMjoyLCAwOjAsIDQ6NCwgMzozfQorICAgICAgICBmb3IgYiBpbiBpdGVyKGEpLCBhLml0ZXJrZXlzKCksIGEuaXRlcml0ZW1zKCksIGEuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgYiA9IGl0ZXIoYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoYikpLCA1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbXSkKKworICAgIGRlZiB0ZXN0X3NpbmtzdGF0ZV95aWVsZChzZWxmKToKKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICAgICAgeWllbGQgaQorICAgICAgICBiID0gZ2VuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCByYW5nZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbXSkKKworICAgIGRlZiB0ZXN0X3NpbmtzdGF0ZV9yYW5nZShzZWxmKToKKyAgICAgICAgYSA9IHhyYW5nZSg1KQorICAgICAgICBiID0gaXRlcihhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHJhbmdlKDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIFtdKQorCisgICAgZGVmIHRlc3Rfc2lua3N0YXRlX2VudW1lcmF0ZShzZWxmKToKKyAgICAgICAgYSA9IHJhbmdlKDUpCisgICAgICAgIGUgPSBlbnVtZXJhdGUoYSkKKyAgICAgICAgYiA9IGl0ZXIoZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCB6aXAocmFuZ2UoNSksIHJhbmdlKDUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCBbXSkKKworICAgIGRlZiB0ZXN0XzM3MjAoc2VsZik6CisgICAgICAgICMgQXZvaWQgYSBjcmFzaCwgd2hlbiBhbiBpdGVyYXRvciBkZWxldGVzIGl0cyBuZXh0KCkgbWV0aG9kLgorICAgICAgICBjbGFzcyBCYWRJdGVyYXRvcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICBkZWwgQmFkSXRlcmF0b3IubmV4dAorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4gQmFkSXRlcmF0b3IoKSA6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfZXh0ZW5kaW5nX2xpc3Rfd2l0aF9pdGVyYXRvcl9kb2VzX25vdF9zZWdmYXVsdChzZWxmKToKKyAgICAgICAgIyBUaGUgY29kZSB0byBleHRlbmQgYSBsaXN0IHdpdGggYW4gaXRlcmF0b3IgaGFzIGEgZmFpcgorICAgICAgICAjIGFtb3VudCBvZiBub250cml2aWFsIGxvZ2ljIGluIHRlcm1zIG9mIGd1ZXNzaW5nIGhvdworICAgICAgICAjIG11Y2ggbWVtb3J5IHRvIGFsbG9jYXRlIGluIGFkdmFuY2UsICJzdGVhbGluZyIgcmVmcywKKyAgICAgICAgIyBhbmQgdGhlbiBzaHJpbmtpbmcgYXQgdGhlIGVuZC4gIFRoaXMgaXMgYSBiYXNpYyBzbW9rZQorICAgICAgICAjIHRlc3QgZm9yIHRoYXQgc2NlbmFyaW8uCisgICAgICAgIGRlZiBnZW4oKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUwMCk6CisgICAgICAgICAgICAgICAgeWllbGQgaQorICAgICAgICBsc3QgPSBbMF0gKiA1MDAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjQwKToKKyAgICAgICAgICAgIGxzdC5wb3AoMCkKKyAgICAgICAgbHN0LmV4dGVuZChnZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obHN0KSwgNzYwKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODc5ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ2Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhmNDNjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKQEAgLTAsMCArMSwyNTcgQEAKKyIiIiBUZXN0IEl0ZXJhdG9yIExlbmd0aCBUcmFuc3BhcmVuY3kKKworU29tZSBmdW5jdGlvbnMgb3IgbWV0aG9kcyB3aGljaCBhY2NlcHQgZ2VuZXJhbCBpdGVyYWJsZSBhcmd1bWVudHMgaGF2ZQorb3B0aW9uYWwsIG1vcmUgZWZmaWNpZW50IGNvZGUgcGF0aHMgaWYgdGhleSBrbm93IGhvdyBtYW55IGl0ZW1zIHRvIGV4cGVjdC4KK0ZvciBpbnN0YW5jZSwgbWFwKGZ1bmMsIGl0ZXJhYmxlKSwgd2lsbCBwcmUtYWxsb2NhdGUgdGhlIGV4YWN0IGFtb3VudCBvZgorc3BhY2UgcmVxdWlyZWQgd2hlbmV2ZXIgdGhlIGl0ZXJhYmxlIGNhbiByZXBvcnQgaXRzIGxlbmd0aC4KKworVGhlIGRlc2lyZWQgaW52YXJpYW50IGlzOiAgbGVuKGl0KT09bGVuKGxpc3QoaXQpKS4KKworQSBjb21wbGljYXRpb24gaXMgdGhhdCBhbiBpdGVyYWJsZSBhbmQgaXRlcmF0b3IgY2FuIGJlIHRoZSBzYW1lIG9iamVjdC4gVG8KK21haW50YWluIHRoZSBpbnZhcmlhbnQsIGFuIGl0ZXJhdG9yIG5lZWRzIHRvIGR5bmFtaWNhbGx5IHVwZGF0ZSBpdHMgbGVuZ3RoLgorRm9yIGluc3RhbmNlLCBhbiBpdGVyYWJsZSBzdWNoIGFzIHhyYW5nZSgxMCkgYWx3YXlzIHJlcG9ydHMgaXRzIGxlbmd0aCBhcyB0ZW4sCitidXQgaXQ9aXRlcih4cmFuZ2UoMTApKSBzdGFydHMgYXQgdGVuLCBhbmQgdGhlbiBnb2VzIHRvIG5pbmUgYWZ0ZXIgaXQubmV4dCgpLgorSGF2aW5nIHRoaXMgY2FwYWJpbGl0eSBtZWFucyB0aGF0IG1hcCgpIGNhbiBpZ25vcmUgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4KK21hcChmdW5jLCBpdGVyYWJsZSkgYW5kIG1hcChmdW5jLCBpdGVyKGl0ZXJhYmxlKSkuCisKK1doZW4gdGhlIGl0ZXJhYmxlIGlzIGltbXV0YWJsZSwgdGhlIGltcGxlbWVudGF0aW9uIGNhbiBzdHJhaWdodC1mb3J3YXJkbHkKK3JlcG9ydCB0aGUgb3JpZ2luYWwgbGVuZ3RoIG1pbnVzIHRoZSBjdW11bGF0aXZlIG51bWJlciBvZiBjYWxscyB0byBuZXh0KCkuCitUaGlzIGlzIHRoZSBjYXNlIGZvciB0dXBsZXMsIHhyYW5nZSBvYmplY3RzLCBhbmQgaXRlcnRvb2xzLnJlcGVhdCgpLgorCitTb21lIGNvbnRhaW5lcnMgYmVjb21lIHRlbXBvcmFyaWx5IGltbXV0YWJsZSBkdXJpbmcgaXRlcmF0aW9uLiAgVGhpcyBpbmNsdWRlcworZGljdHMsIHNldHMsIGFuZCBjb2xsZWN0aW9ucy5kZXF1ZS4gIFRoZWlyIGltcGxlbWVudGF0aW9uIGlzIGVxdWFsbHkgc2ltcGxlCit0aG91Z2ggdGhleSBuZWVkIHRvIHBlcm1hbmVudGx5IHNldCB0aGVpciBsZW5ndGggdG8gemVybyB3aGVuZXZlciB0aGVyZSBpcworYW4gYXR0ZW1wdCB0byBpdGVyYXRlIGFmdGVyIGEgbGVuZ3RoIG11dGF0aW9uLgorCitUaGUgc2l0dWF0aW9uIHNsaWdodGx5IG1vcmUgaW52b2x2ZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IGFsbG93cyBsZW5ndGggbXV0YXRpb24KK2R1cmluZyBpdGVyYXRpb24uICBMaXN0cyBhbmQgc2VxdWVuY2UgaXRlcmF0b3JzIGFyZSBkeW5hbWljYWxseSB1cGRhdGFibGUuCitTbywgaWYgYSBsaXN0IGlzIGV4dGVuZGVkIGR1cmluZyBpdGVyYXRpb24sIHRoZSBpdGVyYXRvciB3aWxsIGNvbnRpbnVlIHRocm91Z2gKK3RoZSBuZXcgaXRlbXMuICBJZiBpdCBzaHJpbmtzIHRvIGEgcG9pbnQgYmVmb3JlIHRoZSBtb3N0IHJlY2VudCBpdGVyYXRpb24sCit0aGVuIG5vIGZ1cnRoZXIgaXRlbXMgYXJlIGF2YWlsYWJsZSBhbmQgdGhlIGxlbmd0aCBpcyByZXBvcnRlZCBhdCB6ZXJvLgorCitSZXZlcnNlZCBvYmplY3RzIGNhbiBhbHNvIGJlIHdyYXBwZWQgYXJvdW5kIG11dGFibGUgb2JqZWN0czsgaG93ZXZlciwgYW55CithcHBlbmRzIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uIGFyZSBpZ25vcmVkLiAgQW55IG90aGVyIGFwcHJvYWNoIGxlYWRzCit0byBjb25mdXNpb24gYW5kIHBvc3NpYmx5IHJldHVybmluZyB0aGUgc2FtZSBpdGVtIG1vcmUgdGhhbiBvbmNlLgorCitUaGUgaXRlcmF0b3JzIG5vdCBsaXN0ZWQgYWJvdmUsIHN1Y2ggYXMgZW51bWVyYXRlIGFuZCB0aGUgb3RoZXIgaXRlcnRvb2xzLAorYXJlIG5vdCBsZW5ndGggdHJhbnNwYXJlbnQgYmVjYXVzZSB0aGV5IGhhdmUgbm8gd2F5IHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KK2l0ZXJhYmxlcyB0aGF0IHJlcG9ydCBzdGF0aWMgbGVuZ3RoIGFuZCBpdGVyYXRvcnMgd2hvc2UgbGVuZ3RoIGNoYW5nZXMgd2l0aAorZWFjaCBjYWxsIChpLmUuIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZW51bWVyYXRlKCdhYmMnKSBhbmQKK2VudW1lcmF0ZShpdGVyKCdhYmMnKSkuCisKKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIGl0ZXJ0b29scyBpbXBvcnQgcmVwZWF0Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBfX2J1aWx0aW5fXyBpbXBvcnQgbGVuIGFzIF9sZW4KKworbiA9IDEwCisKK2RlZiBsZW4ob2JqKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBfbGVuKG9iaikKKyAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIG5vdGU6IHRoaXMgaXMgYW4gaW50ZXJuYWwgdW5kb2N1bWVudGVkIEFQSSwKKyAgICAgICAgICAgICMgZG9uJ3QgcmVseSBvbiBpdCBpbiB5b3VyIG93biBwcm9ncmFtcworICAgICAgICAgICAgcmV0dXJuIG9iai5fX2xlbmd0aF9oaW50X18oKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IKKworY2xhc3MgVGVzdEludmFyaWFudFdpdGhvdXRNdXRhdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfaW52YXJpYW50KHNlbGYpOgorICAgICAgICBpdCA9IHNlbGYuaXQKKyAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQoeHJhbmdlKDEsIG4rMSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCBpKQorICAgICAgICAgICAgaXQubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgaXQubmV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaXQpLCAwKQorCitjbGFzcyBUZXN0VGVtcG9yYXJpbHlJbW11dGFibGUoVGVzdEludmFyaWFudFdpdGhvdXRNdXRhdGlvbnMpOgorCisgICAgZGVmIHRlc3RfaW1tdXRhYmxlX2R1cmluZ19pdGVyYXRpb24oc2VsZik6CisgICAgICAgICMgb2JqZWN0cyBzdWNoIGFzIGRlcXVlcywgc2V0cywgYW5kIGRpY3Rpb25hcmllcyBlbmZvcmNlCisgICAgICAgICMgbGVuZ3RoIGltbXV0YWJpbGl0eSAgZHVyaW5nIGl0ZXJhdGlvbgorCisgICAgICAgIGl0ID0gc2VsZi5pdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdCksIG4pCisgICAgICAgIGl0Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdCksIG4tMSkKKyAgICAgICAgc2VsZi5tdXRhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGl0Lm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgMCkKKworIyMgLS0tLS0tLSBDb25jcmV0ZSBUeXBlIFRlc3RzIC0tLS0tLS0KKworY2xhc3MgVGVzdFJlcGVhdChUZXN0SW52YXJpYW50V2l0aG91dE11dGF0aW9ucyk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaXQgPSByZXBlYXQoTm9uZSwgbikKKworICAgIGRlZiB0ZXN0X25vX2xlbl9mb3JfaW5maW5pdGVfcmVwZWF0KHNlbGYpOgorICAgICAgICAjIFRoZSByZXBlYXQoKSBvYmplY3QgY2FuIGFsc28gYmUgaW5maW5pdGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsZW4sIHJlcGVhdChOb25lKSkKKworY2xhc3MgVGVzdFhyYW5nZShUZXN0SW52YXJpYW50V2l0aG91dE11dGF0aW9ucyk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaXQgPSBpdGVyKHhyYW5nZShuKSkKKworY2xhc3MgVGVzdFhyYW5nZUN1c3RvbVJldmVyc2VkKFRlc3RJbnZhcmlhbnRXaXRob3V0TXV0YXRpb25zKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pdCA9IHJldmVyc2VkKHhyYW5nZShuKSkKKworY2xhc3MgVGVzdFR1cGxlKFRlc3RJbnZhcmlhbnRXaXRob3V0TXV0YXRpb25zKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIodHVwbGUoeHJhbmdlKG4pKSkKKworIyMgLS0tLS0tLSBUeXBlcyB0aGF0IHNob3VsZCBub3QgYmUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIC0tLS0tLS0KKworY2xhc3MgVGVzdERlcXVlKFRlc3RUZW1wb3JhcmlseUltbXV0YWJsZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGQgPSBkZXF1ZSh4cmFuZ2UobikpCisgICAgICAgIHNlbGYuaXQgPSBpdGVyKGQpCisgICAgICAgIHNlbGYubXV0YXRlID0gZC5wb3AKKworY2xhc3MgVGVzdERlcXVlUmV2ZXJzZWQoVGVzdFRlbXBvcmFyaWx5SW1tdXRhYmxlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZCA9IGRlcXVlKHhyYW5nZShuKSkKKyAgICAgICAgc2VsZi5pdCA9IHJldmVyc2VkKGQpCisgICAgICAgIHNlbGYubXV0YXRlID0gZC5wb3AKKworY2xhc3MgVGVzdERpY3RLZXlzKFRlc3RUZW1wb3JhcmlseUltbXV0YWJsZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGQgPSBkaWN0LmZyb21rZXlzKHhyYW5nZShuKSkKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIoZCkKKyAgICAgICAgc2VsZi5tdXRhdGUgPSBkLnBvcGl0ZW0KKworY2xhc3MgVGVzdERpY3RJdGVtcyhUZXN0VGVtcG9yYXJpbHlJbW11dGFibGUpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBkID0gZGljdC5mcm9ta2V5cyh4cmFuZ2UobikpCisgICAgICAgIHNlbGYuaXQgPSBkLml0ZXJpdGVtcygpCisgICAgICAgIHNlbGYubXV0YXRlID0gZC5wb3BpdGVtCisKK2NsYXNzIFRlc3REaWN0VmFsdWVzKFRlc3RUZW1wb3JhcmlseUltbXV0YWJsZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGQgPSBkaWN0LmZyb21rZXlzKHhyYW5nZShuKSkKKyAgICAgICAgc2VsZi5pdCA9IGQuaXRlcnZhbHVlcygpCisgICAgICAgIHNlbGYubXV0YXRlID0gZC5wb3BpdGVtCisKK2NsYXNzIFRlc3RTZXQoVGVzdFRlbXBvcmFyaWx5SW1tdXRhYmxlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZCA9IHNldCh4cmFuZ2UobikpCisgICAgICAgIHNlbGYuaXQgPSBpdGVyKGQpCisgICAgICAgIHNlbGYubXV0YXRlID0gZC5wb3AKKworIyMgLS0tLS0tLSBUeXBlcyB0aGF0IGNhbiBtdXRhdGUgZHVyaW5nIGl0ZXJhdGlvbiAtLS0tLS0tCisKK2NsYXNzIFRlc3RMaXN0KFRlc3RJbnZhcmlhbnRXaXRob3V0TXV0YXRpb25zKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5pdCA9IGl0ZXIocmFuZ2UobikpCisKKyAgICBkZWYgdGVzdF9tdXRhdGlvbihzZWxmKToKKyAgICAgICAgZCA9IHJhbmdlKG4pCisgICAgICAgIGl0ID0gaXRlcihkKQorICAgICAgICBpdC5uZXh0KCkKKyAgICAgICAgaXQubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgbi0yKQorICAgICAgICBkLmFwcGVuZChuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdCksIG4tMSkgICMgZ3JvdyB3aXRoIGFwcGVuZAorICAgICAgICBkWzE6XSA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgW10pCisgICAgICAgIGQuZXh0ZW5kKHhyYW5nZSgyMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgMCkKKworY2xhc3MgVGVzdExpc3RSZXZlcnNlZChUZXN0SW52YXJpYW50V2l0aG91dE11dGF0aW9ucyk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaXQgPSByZXZlcnNlZChyYW5nZShuKSkKKworICAgIGRlZiB0ZXN0X211dGF0aW9uKHNlbGYpOgorICAgICAgICBkID0gcmFuZ2UobikKKyAgICAgICAgaXQgPSByZXZlcnNlZChkKQorICAgICAgICBpdC5uZXh0KCkKKyAgICAgICAgaXQubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgbi0yKQorICAgICAgICBkLmFwcGVuZChuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdCksIG4tMikgICMgaWdub3JlIGFwcGVuZAorICAgICAgICBkWzE6XSA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl0KSwgW10pICAjIGNvbmZpcm0gaW52YXJpYW50CisgICAgICAgIGQuZXh0ZW5kKHhyYW5nZSgyMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGl0KSwgMCkKKworIyMgLS0gQ2hlY2sgdG8gbWFrZSBzdXJlIGV4Y2VwdGlvbnMgYXJlIG5vdCBzdXBwcmVzc2VkIGJ5IF9fbGVuZ3RoX2hpbnRfXygpCisKKworY2xhc3MgQmFkTGVuKG9iamVjdCk6CisgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihyYW5nZSgxMCkpCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignaGVsbG8nKQorCitjbGFzcyBCYWRMZW5ndGhIaW50KG9iamVjdCk6CisgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihyYW5nZSgxMCkpCisgICAgZGVmIF9fbGVuZ3RoX2hpbnRfXyhzZWxmKToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdoZWxsbycpCisKK2NsYXNzIE5vbmVMZW5ndGhIaW50KG9iamVjdCk6CisgICAgZGVmIF9faXRlcl9fKHNlbGYpOiByZXR1cm4gaXRlcihyYW5nZSgxMCkpCisgICAgZGVmIF9fbGVuZ3RoX2hpbnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgVGVzdExlbmd0aEhpbnRFeGNlcHRpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2lzc3VlMTI0MjY1NyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBsaXN0LCBCYWRMZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBsaXN0LCBCYWRMZW5ndGhIaW50KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgW10uZXh0ZW5kLCBCYWRMZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBbXS5leHRlbmQsIEJhZExlbmd0aEhpbnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXAsIEJhZExlbigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcCwgQmFkTGVuZ3RoSGludCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGZpbHRlciwgTm9uZSwgQmFkTGVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZmlsdGVyLCBOb25lLCBCYWRMZW5ndGhIaW50KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgbWFwLCBjaHIsIEJhZExlbigpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG1hcCwgY2hyLCBCYWRMZW5ndGhIaW50KCkpCisgICAgICAgIGIgPSBieXRlYXJyYXkocmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGIuZXh0ZW5kLCBCYWRMZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBiLmV4dGVuZCwgQmFkTGVuZ3RoSGludCgpKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9oaW50KHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBhbiBpbnZhbGlkIHJlc3VsdCBkb2Vzbid0IG11Y2stdXAgdGhlIHdvcmtzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChOb25lTGVuZ3RoSGludCgpKSwgbGlzdChyYW5nZSgxMCkpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB1bml0dGVzdHMgPSBbCisgICAgICAgIFRlc3RSZXBlYXQsCisgICAgICAgIFRlc3RYcmFuZ2UsCisgICAgICAgIFRlc3RYcmFuZ2VDdXN0b21SZXZlcnNlZCwKKyAgICAgICAgVGVzdFR1cGxlLAorICAgICAgICBUZXN0RGVxdWUsCisgICAgICAgIFRlc3REZXF1ZVJldmVyc2VkLAorICAgICAgICBUZXN0RGljdEtleXMsCisgICAgICAgIFRlc3REaWN0SXRlbXMsCisgICAgICAgIFRlc3REaWN0VmFsdWVzLAorICAgICAgICBUZXN0U2V0LAorICAgICAgICBUZXN0TGlzdCwKKyAgICAgICAgVGVzdExpc3RSZXZlcnNlZCwKKyAgICAgICAgVGVzdExlbmd0aEhpbnRFeGNlcHRpb25zLAorICAgIF0KKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp1bml0dGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJsZW4ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmYzVjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJsZW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJsZW4ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcmxlbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmYzVjOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJsZW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJ0b29scy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2l0ZXJ0b29scy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjlmNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CkBAIC0wLDAgKzEsMTY2NSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBpdGVydG9vbHMgaW1wb3J0ICoKK2Zyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKK2Zyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAorZnJvbSBmcmFjdGlvbnMgaW1wb3J0IEZyYWN0aW9uCitpbXBvcnQgc3lzCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBjb3B5CitpbXBvcnQgcGlja2xlCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgcmVkdWNlCittYXhzaXplID0gdGVzdF9zdXBwb3J0Lk1BWF9QeV9zc2l6ZV90CittaW5zaXplID0gLW1heHNpemUtMQorCitkZWYgb25lYXJnKHgpOgorICAgICdUZXN0IGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCcKKyAgICByZXR1cm4gMip4CisKK2RlZiBlcnJmdW5jKCphcmdzKToKKyAgICAnVGVzdCBmdW5jdGlvbiB0aGF0IHJhaXNlcyBhbiBlcnJvcicKKyAgICByYWlzZSBWYWx1ZUVycm9yCisKK2RlZiBnZW4zKCk6CisgICAgJ05vbi1yZXN0YXJ0YWJsZSBzb3VyY2Ugc2VxdWVuY2UnCisgICAgZm9yIGkgaW4gKDAsIDEsIDIpOgorICAgICAgICB5aWVsZCBpCisKK2RlZiBpc0V2ZW4oeCk6CisgICAgJ1Rlc3QgcHJlZGljYXRlJworICAgIHJldHVybiB4JTI9PTAKKworZGVmIGlzT2RkKHgpOgorICAgICdUZXN0IHByZWRpY2F0ZScKKyAgICByZXR1cm4geCUyPT0xCisKK2NsYXNzIFN0b3BOb3c6CisgICAgJ0NsYXNzIGVtdWxhdGluZyBhbiBlbXB0eSBpdGVyYWJsZS4nCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKK2RlZiB0YWtlKG4sIHNlcSk6CisgICAgJ0NvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBwYXJ0aWFsbHkgY29uc3VtaW5nIGEgbG9uZyBvZiBpbmZpbml0ZSBpdGVyYWJsZScKKyAgICByZXR1cm4gbGlzdChpc2xpY2Uoc2VxLCBuKSkKKworZGVmIHByb2QoaXRlcmFibGUpOgorICAgIHJldHVybiByZWR1Y2Uob3BlcmF0b3IubXVsLCBpdGVyYWJsZSwgMSkKKworZGVmIGZhY3Qobik6CisgICAgJ0ZhY3RvcmlhbCcKKyAgICByZXR1cm4gcHJvZChyYW5nZSgxLCBuKzEpKQorCitjbGFzcyBUZXN0QmFzaWNPcHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NoYWluKHNlbGYpOgorCisgICAgICAgIGRlZiBjaGFpbjIoKml0ZXJhYmxlcyk6CisgICAgICAgICAgICAnUHVyZSBweXRob24gdmVyc2lvbiBpbiB0aGUgZG9jcycKKyAgICAgICAgICAgIGZvciBpdCBpbiBpdGVyYWJsZXM6CisgICAgICAgICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXQ6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKKworICAgICAgICBmb3IgYyBpbiAoY2hhaW4sIGNoYWluMik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYygnYWJjJywgJ2RlZicpKSwgbGlzdCgnYWJjZGVmJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYygnYWJjJykpLCBsaXN0KCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjKCcnKSksIFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDQsIGMoJ2FiYycsICdkZWYnKSksIGxpc3QoJ2FiY2QnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCxjKDIsIDMpKQorCisgICAgZGVmIHRlc3RfY2hhaW5fZnJvbV9pdGVyYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNoYWluLmZyb21faXRlcmFibGUoWydhYmMnLCAnZGVmJ10pKSwgbGlzdCgnYWJjZGVmJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjaGFpbi5mcm9tX2l0ZXJhYmxlKFsnYWJjJ10pKSwgbGlzdCgnYWJjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjaGFpbi5mcm9tX2l0ZXJhYmxlKFsnJ10pKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSg0LCBjaGFpbi5mcm9tX2l0ZXJhYmxlKFsnYWJjJywgJ2RlZiddKSksIGxpc3QoJ2FiY2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBjaGFpbi5mcm9tX2l0ZXJhYmxlKFsyLCAzXSkpCisKKyAgICBkZWYgdGVzdF9jb21iaW5hdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tYmluYXRpb25zLCAnYWJjJykgICAgICAgIyBtaXNzaW5nIHIgYXJndW1lbnQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21iaW5hdGlvbnMsICdhYmMnLCAyLCAxKSAjIHRvbyBtYW55IGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbWJpbmF0aW9ucywgTm9uZSkgICAgICAgICMgcG9vbCBpcyBub3QgaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgY29tYmluYXRpb25zLCAnYWJjJywgLTIpICAjIHIgaXMgbmVnYXRpdmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbWJpbmF0aW9ucygnYWJjJywgMzIpKSwgW10pICAgICAjIHIgPiBuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21iaW5hdGlvbnMocmFuZ2UoNCksIDMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKDAsMSwyKSwgKDAsMSwzKSwgKDAsMiwzKSwgKDEsMiwzKV0pCisKKyAgICAgICAgZGVmIGNvbWJpbmF0aW9uczEoaXRlcmFibGUsIHIpOgorICAgICAgICAgICAgJ1B1cmUgcHl0aG9uIHZlcnNpb24gc2hvd24gaW4gdGhlIGRvY3MnCisgICAgICAgICAgICBwb29sID0gdHVwbGUoaXRlcmFibGUpCisgICAgICAgICAgICBuID0gbGVuKHBvb2wpCisgICAgICAgICAgICBpZiByID4gbjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGluZGljZXMgPSByYW5nZShyKQorICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShyKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGluZGljZXNbaV0gIT0gaSArIG4gLSByOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpbmRpY2VzW2ldICs9IDEKKyAgICAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpKzEsIHIpOgorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2pdID0gaW5kaWNlc1tqLTFdICsgMQorICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKKworICAgICAgICBkZWYgY29tYmluYXRpb25zMihpdGVyYWJsZSwgcik6CisgICAgICAgICAgICAnUHVyZSBweXRob24gdmVyc2lvbiBzaG93biBpbiB0aGUgZG9jcycKKyAgICAgICAgICAgIHBvb2wgPSB0dXBsZShpdGVyYWJsZSkKKyAgICAgICAgICAgIG4gPSBsZW4ocG9vbCkKKyAgICAgICAgICAgIGZvciBpbmRpY2VzIGluIHBlcm11dGF0aW9ucyhyYW5nZShuKSwgcik6CisgICAgICAgICAgICAgICAgaWYgc29ydGVkKGluZGljZXMpID09IGxpc3QoaW5kaWNlcyk6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKKworICAgICAgICBkZWYgY29tYmluYXRpb25zMyhpdGVyYWJsZSwgcik6CisgICAgICAgICAgICAnUHVyZSBweXRob24gdmVyc2lvbiBmcm9tIGN3cigpJworICAgICAgICAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQorICAgICAgICAgICAgbiA9IGxlbihwb29sKQorICAgICAgICAgICAgZm9yIGluZGljZXMgaW4gY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQocmFuZ2UobiksIHIpOgorICAgICAgICAgICAgICAgIGlmIGxlbihzZXQoaW5kaWNlcykpID09IHI6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKKworICAgICAgICBmb3IgbiBpbiByYW5nZSg3KToKKyAgICAgICAgICAgIHZhbHVlcyA9IFs1KngtMTIgZm9yIHggaW4gcmFuZ2UobildCisgICAgICAgICAgICBmb3IgciBpbiByYW5nZShuKzIpOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3QoY29tYmluYXRpb25zKHZhbHVlcywgcikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgMCBpZiByPm4gZWxzZSBmYWN0KG4pIC8vIGZhY3QocikgLy8gZmFjdChuLXIpKSAjIHJpZ2h0IG51bWJlciBvZiBjb21icworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIGxlbihzZXQocmVzdWx0KSkpICAgICAgICAgIyBubyByZXBlYXRzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNvcnRlZChyZXN1bHQpKSAgICAgICAgICAgICAgICAjIGxleGljb2dyYXBoaWMgb3JkZXIKKyAgICAgICAgICAgICAgICBmb3IgYyBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGMpLCByKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHItbGVuZ3RoIGNvbWJpbmF0aW9ucworICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQoYykpLCByKSAgICAgICAgICAgICAgICAgICAgIyBubyBkdXBsaWNhdGUgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGMpLCBzb3J0ZWQoYykpICAgICAgICAgICAgICAgICMga2VlcCBvcmlnaW5hbCBvcmRlcmluZworICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKGUgaW4gdmFsdWVzIGZvciBlIGluIGMpKSAgICAgICAgICAgIyBlbGVtZW50cyB0YWtlbiBmcm9tIGlucHV0IGl0ZXJhYmxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZSBmb3IgZSBpbiB2YWx1ZXMgaWYgZSBpbiBjXSkgICAgICAjIGNvbWIgaXMgYSBzdWJzZXF1ZW5jZSBvZiB0aGUgaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChjb21iaW5hdGlvbnMxKHZhbHVlcywgcikpKSAjIG1hdGNoZXMgZmlyc3QgcHVyZSBweXRob24gdmVyc2lvbgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBsaXN0KGNvbWJpbmF0aW9uczIodmFsdWVzLCByKSkpICMgbWF0Y2hlcyBzZWNvbmQgcHVyZSBweXRob24gdmVyc2lvbgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBsaXN0KGNvbWJpbmF0aW9uczModmFsdWVzLCByKSkpICMgbWF0Y2hlcyBzZWNvbmQgcHVyZSBweXRob24gdmVyc2lvbgorCisgICAgQHRlc3Rfc3VwcG9ydC5pbXBsX2RldGFpbCgidHVwbGUgcmV1c2UgaXMgc3BlY2lmaWMgdG8gQ1B5dGhvbiIpCisgICAgZGVmIHRlc3RfY29tYmluYXRpb25zX3R1cGxlX3JldXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQobWFwKGlkLCBjb21iaW5hdGlvbnMoJ2FiY2RlJywgMykpKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobGVuKHNldChtYXAoaWQsIGxpc3QoY29tYmluYXRpb25zKCdhYmNkZScsIDMpKSkpKSwgMSkKKworICAgIGRlZiB0ZXN0X2NvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KHNlbGYpOgorICAgICAgICBjd3IgPSBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGN3ciwgJ2FiYycpICAgICAgICMgbWlzc2luZyByIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3dyLCAnYWJjJywgMiwgMSkgIyB0b28gbWFueSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjd3IsIE5vbmUpICAgICAgICAjIHBvb2wgaXMgbm90IGl0ZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGN3ciwgJ2FiYycsIC0yKSAgIyByIGlzIG5lZ2F0aXZlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjd3IoJ0FCQycsIDIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdBJywnQScpLCAoJ0EnLCdCJyksICgnQScsJ0MnKSwgKCdCJywnQicpLCAoJ0InLCdDJyksICgnQycsJ0MnKV0pCisKKyAgICAgICAgZGVmIGN3cjEoaXRlcmFibGUsIHIpOgorICAgICAgICAgICAgJ1B1cmUgcHl0aG9uIHZlcnNpb24gc2hvd24gaW4gdGhlIGRvY3MnCisgICAgICAgICAgICAjIG51bWJlciBpdGVtcyByZXR1cm5lZDogIChuK3ItMSkhIC8gciEgLyAobi0xKSEgd2hlbiBuPjAKKyAgICAgICAgICAgIHBvb2wgPSB0dXBsZShpdGVyYWJsZSkKKyAgICAgICAgICAgIG4gPSBsZW4ocG9vbCkKKyAgICAgICAgICAgIGlmIG5vdCBuIGFuZCByOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaW5kaWNlcyA9IFswXSAqIHIKKyAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UocikpOgorICAgICAgICAgICAgICAgICAgICBpZiBpbmRpY2VzW2ldICE9IG4gLSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBpbmRpY2VzW2k6XSA9IFtpbmRpY2VzW2ldICsgMV0gKiAociAtIGkpCisgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocG9vbFtpXSBmb3IgaSBpbiBpbmRpY2VzKQorCisgICAgICAgIGRlZiBjd3IyKGl0ZXJhYmxlLCByKToKKyAgICAgICAgICAgICdQdXJlIHB5dGhvbiB2ZXJzaW9uIHNob3duIGluIHRoZSBkb2NzJworICAgICAgICAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQorICAgICAgICAgICAgbiA9IGxlbihwb29sKQorICAgICAgICAgICAgZm9yIGluZGljZXMgaW4gcHJvZHVjdChyYW5nZShuKSwgcmVwZWF0PXIpOgorICAgICAgICAgICAgICAgIGlmIHNvcnRlZChpbmRpY2VzKSA9PSBsaXN0KGluZGljZXMpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXMpCisKKyAgICAgICAgZGVmIG51bWNvbWJzKG4sIHIpOgorICAgICAgICAgICAgaWYgbm90IG46CisgICAgICAgICAgICAgICAgcmV0dXJuIDAgaWYgciBlbHNlIDEKKyAgICAgICAgICAgIHJldHVybiBmYWN0KG4rci0xKSAvLyBmYWN0KHIpIC8vIGZhY3Qobi0xKQorCisgICAgICAgIGZvciBuIGluIHJhbmdlKDcpOgorICAgICAgICAgICAgdmFsdWVzID0gWzUqeC0xMiBmb3IgeCBpbiByYW5nZShuKV0KKyAgICAgICAgICAgIGZvciByIGluIHJhbmdlKG4rMik6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdChjd3IodmFsdWVzLCByKSkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIG51bWNvbWJzKG4sIHIpKSAgICAgICAgICAgIyByaWdodCBudW1iZXIgb2YgY29tYnMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCBsZW4oc2V0KHJlc3VsdCkpKSAgICAgICAgICMgbm8gcmVwZWF0cworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzb3J0ZWQocmVzdWx0KSkgICAgICAgICAgICAgICAgIyBsZXhpY29ncmFwaGljIG9yZGVyCisKKyAgICAgICAgICAgICAgICByZWd1bGFyX2NvbWJzID0gbGlzdChjb21iaW5hdGlvbnModmFsdWVzLCByKSkgICAgICAgICAgICMgY29tcGFyZSB0byBjb21icyB3aXRob3V0IHJlcGxhY2VtZW50CisgICAgICAgICAgICAgICAgaWYgbiA9PSAwIG9yIHIgPD0gMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHJlZ3VsYXJfY29tYnMpICAgICAgICAgICAgIyBjYXNlcyB0aGF0IHNob3VsZCBiZSBpZGVudGljYWwKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHJlc3VsdCkgPj0gc2V0KHJlZ3VsYXJfY29tYnMpKSAgICAgIyByZXN0IHNob3VsZCBiZSBzdXBlcnNldHMgb2YgcmVndWxhciBjb21icworCisgICAgICAgICAgICAgICAgZm9yIGMgaW4gcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgcikgICAgICAgICAgICAgICAgICAgICAgICAgIyByLWxlbmd0aCBjb21iaW5hdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgbm9ydW5zID0gW2sgZm9yIGssdiBpbiBncm91cGJ5KGMpXSAgICAgICAgICAgICAgICAgICMgY29tYm8gd2l0aG91dCBjb25zZWN1dGl2ZSByZXBlYXRzCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5vcnVucyksIGxlbihzZXQobm9ydW5zKSkpICAgICAjIG5vIHJlcGVhdHMgb3RoZXIgdGhhbiBjb25zZWN1dGl2ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYyksIHNvcnRlZChjKSkgICAgICAgICAgICAgICAgIyBrZWVwIG9yaWdpbmFsIG9yZGVyaW5nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoZSBpbiB2YWx1ZXMgZm9yIGUgaW4gYykpICAgICAgICAgICAjIGVsZW1lbnRzIHRha2VuIGZyb20gaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3J1bnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2UgZm9yIGUgaW4gdmFsdWVzIGlmIGUgaW4gY10pICAgICAjIGNvbWIgaXMgYSBzdWJzZXF1ZW5jZSBvZiB0aGUgaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChjd3IxKHZhbHVlcywgcikpKSAgICAgICAgICMgbWF0Y2hlcyBmaXJzdCBwdXJlIHB5dGhvbiB2ZXJzaW9uCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QoY3dyMih2YWx1ZXMsIHIpKSkgICAgICAgICAjIG1hdGNoZXMgc2Vjb25kIHB1cmUgcHl0aG9uIHZlcnNpb24KKworICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInR1cGxlIHJldXNlIGlzIHNwZWNpZmljIHRvIENQeXRob24iKQorICAgIGRlZiB0ZXN0X2NvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50X3R1cGxlX3JldXNlKHNlbGYpOgorICAgICAgICBjd3IgPSBjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQobWFwKGlkLCBjd3IoJ2FiY2RlJywgMykpKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobGVuKHNldChtYXAoaWQsIGxpc3QoY3dyKCdhYmNkZScsIDMpKSkpKSwgMSkKKworICAgIGRlZiB0ZXN0X3Blcm11dGF0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwZXJtdXRhdGlvbnMpICAgICAgICAgICAgICAjIHRvbyBmZXcgYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcGVybXV0YXRpb25zLCAnYWJjJywgMiwgMSkgIyB0b28gbWFueSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwZXJtdXRhdGlvbnMsIE5vbmUpICAgICAgICAjIHBvb2wgaXMgbm90IGl0ZXJhYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBlcm11dGF0aW9ucywgJ2FiYycsIC0yKSAgIyByIGlzIG5lZ2F0aXZlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwZXJtdXRhdGlvbnMoJ2FiYycsIDMyKSksIFtdKSAgICAgIyByID4gbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBlcm11dGF0aW9ucywgJ2FiYycsICdzJykgICMgciBpcyBub3QgYW4gaW50IG9yIE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHBlcm11dGF0aW9ucyhyYW5nZSgzKSwgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwxKSwgKDAsMiksICgxLDApLCAoMSwyKSwgKDIsMCksICgyLDEpXSkKKworICAgICAgICBkZWYgcGVybXV0YXRpb25zMShpdGVyYWJsZSwgcj1Ob25lKToKKyAgICAgICAgICAgICdQdXJlIHB5dGhvbiB2ZXJzaW9uIHNob3duIGluIHRoZSBkb2NzJworICAgICAgICAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQorICAgICAgICAgICAgbiA9IGxlbihwb29sKQorICAgICAgICAgICAgciA9IG4gaWYgciBpcyBOb25lIGVsc2UgcgorICAgICAgICAgICAgaWYgciA+IG46CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpbmRpY2VzID0gcmFuZ2UobikKKyAgICAgICAgICAgIGN5Y2xlcyA9IHJhbmdlKG4sIG4tciwgLTEpCisgICAgICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXNbOnJdKQorICAgICAgICAgICAgd2hpbGUgbjoKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShyKSk6CisgICAgICAgICAgICAgICAgICAgIGN5Y2xlc1tpXSAtPSAxCisgICAgICAgICAgICAgICAgICAgIGlmIGN5Y2xlc1tpXSA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tpOl0gPSBpbmRpY2VzW2krMTpdICsgaW5kaWNlc1tpOmkrMV0KKyAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlc1tpXSA9IG4gLSBpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gY3ljbGVzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2ldLCBpbmRpY2VzWy1qXSA9IGluZGljZXNbLWpdLCBpbmRpY2VzW2ldCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBpIGluIGluZGljZXNbOnJdKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBkZWYgcGVybXV0YXRpb25zMihpdGVyYWJsZSwgcj1Ob25lKToKKyAgICAgICAgICAgICdQdXJlIHB5dGhvbiB2ZXJzaW9uIHNob3duIGluIHRoZSBkb2NzJworICAgICAgICAgICAgcG9vbCA9IHR1cGxlKGl0ZXJhYmxlKQorICAgICAgICAgICAgbiA9IGxlbihwb29sKQorICAgICAgICAgICAgciA9IG4gaWYgciBpcyBOb25lIGVsc2UgcgorICAgICAgICAgICAgZm9yIGluZGljZXMgaW4gcHJvZHVjdChyYW5nZShuKSwgcmVwZWF0PXIpOgorICAgICAgICAgICAgICAgIGlmIGxlbihzZXQoaW5kaWNlcykpID09IHI6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHR1cGxlKHBvb2xbaV0gZm9yIGkgaW4gaW5kaWNlcykKKworICAgICAgICBmb3IgbiBpbiByYW5nZSg3KToKKyAgICAgICAgICAgIHZhbHVlcyA9IFs1KngtMTIgZm9yIHggaW4gcmFuZ2UobildCisgICAgICAgICAgICBmb3IgciBpbiByYW5nZShuKzIpOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3QocGVybXV0YXRpb25zKHZhbHVlcywgcikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgMCBpZiByPm4gZWxzZSBmYWN0KG4pIC8vIGZhY3Qobi1yKSkgICAgICAjIHJpZ2h0IG51bWJlciBvZiBwZXJtcworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIGxlbihzZXQocmVzdWx0KSkpICAgICAgICAgIyBubyByZXBlYXRzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNvcnRlZChyZXN1bHQpKSAgICAgICAgICAgICAgICAjIGxleGljb2dyYXBoaWMgb3JkZXIKKyAgICAgICAgICAgICAgICBmb3IgcCBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCByKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHItbGVuZ3RoIHBlcm11dGF0aW9ucworICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQocCkpLCByKSAgICAgICAgICAgICAgICAgICAgIyBubyBkdXBsaWNhdGUgZWxlbWVudHMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChlIGluIHZhbHVlcyBmb3IgZSBpbiBwKSkgICAgICAgICAgICMgZWxlbWVudHMgdGFrZW4gZnJvbSBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBsaXN0KHBlcm11dGF0aW9uczEodmFsdWVzLCByKSkpICMgbWF0Y2hlcyBmaXJzdCBwdXJlIHB5dGhvbiB2ZXJzaW9uCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QocGVybXV0YXRpb25zMih2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIHNlY29uZCBwdXJlIHB5dGhvbiB2ZXJzaW9uCisgICAgICAgICAgICAgICAgaWYgciA9PSBuOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChwZXJtdXRhdGlvbnModmFsdWVzLCBOb25lKSkpICMgdGVzdCByIGFzIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QocGVybXV0YXRpb25zKHZhbHVlcykpKSAgICAgICAjIHRlc3QgZGVmYXVsdCByCisKKyAgICBAdGVzdF9zdXBwb3J0LmltcGxfZGV0YWlsKCJ0dXBsZSByZXN1c2UgaXMgQ1B5dGhvbiBzcGVjaWZpYyIpCisgICAgZGVmIHRlc3RfcGVybXV0YXRpb25zX3R1cGxlX3JldXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQobWFwKGlkLCBwZXJtdXRhdGlvbnMoJ2FiY2RlJywgMykpKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobGVuKHNldChtYXAoaWQsIGxpc3QocGVybXV0YXRpb25zKCdhYmNkZScsIDMpKSkpKSwgMSkKKworICAgIGRlZiB0ZXN0X2NvbWJpbmF0b3JpY3Moc2VsZik6CisgICAgICAgICMgVGVzdCByZWxhdGlvbnNoaXBzIGJldHdlZW4gcHJvZHVjdCgpLCBwZXJtdXRhdGlvbnMoKSwKKyAgICAgICAgIyBjb21iaW5hdGlvbnMoKSBhbmQgY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoKS4KKworICAgICAgICBmb3IgbiBpbiByYW5nZSg2KToKKyAgICAgICAgICAgIHMgPSAnQUJDREVGRydbOm5dCisgICAgICAgICAgICBmb3IgciBpbiByYW5nZSg4KToKKyAgICAgICAgICAgICAgICBwcm9kID0gbGlzdChwcm9kdWN0KHMsIHJlcGVhdD1yKSkKKyAgICAgICAgICAgICAgICBjd3IgPSBsaXN0KGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KHMsIHIpKQorICAgICAgICAgICAgICAgIHBlcm0gPSBsaXN0KHBlcm11dGF0aW9ucyhzLCByKSkKKyAgICAgICAgICAgICAgICBjb21iID0gbGlzdChjb21iaW5hdGlvbnMocywgcikpCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIHNpemUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwcm9kKSwgbioqcikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjd3IpLCAoZmFjdChuK3ItMSkgLy8gZmFjdChyKSAvLyBmYWN0KG4tMSkpIGlmIG4gZWxzZSAobm90IHIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBlcm0pLCAwIGlmIHI+biBlbHNlIGZhY3QobikgLy8gZmFjdChuLXIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNvbWIpLCAwIGlmIHI+biBlbHNlIGZhY3QobikgLy8gZmFjdChyKSAvLyBmYWN0KG4tcikpCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIGxleGljb2dyYXBoaWMgb3JkZXIgd2l0aG91dCByZXBlYXRlZCB0dXBsZXMKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2QsIHNvcnRlZChzZXQocHJvZCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3dyLCBzb3J0ZWQoc2V0KGN3cikpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGVybSwgc29ydGVkKHNldChwZXJtKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21iLCBzb3J0ZWQoc2V0KGNvbWIpKSkKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgaW50ZXJyZWxhdGlvbnNoaXBzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjd3IsIFt0IGZvciB0IGluIHByb2QgaWYgc29ydGVkKHQpPT1saXN0KHQpXSkgIyBjd3I6IHByb2RzIHdoaWNoIGFyZSBzb3J0ZWQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBlcm0sIFt0IGZvciB0IGluIHByb2QgaWYgbGVuKHNldCh0KSk9PXJdKSAgICAjIHBlcm06IHByb2RzIHdpdGggbm8gZHVwcworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tYiwgW3QgZm9yIHQgaW4gcGVybSBpZiBzb3J0ZWQodCk9PWxpc3QodCldKSAjIGNvbWI6IHBlcm1zIHRoYXQgYXJlIHNvcnRlZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tYiwgW3QgZm9yIHQgaW4gY3dyIGlmIGxlbihzZXQodCkpPT1yXSkgICAgICAjIGNvbWI6IGN3cnMgd2l0aG91dCBkdXBzCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21iLCBmaWx0ZXIoc2V0KGN3cikuX19jb250YWluc19fLCBwZXJtKSkgICAgICMgY29tYjogcGVybSB0aGF0IGlzIGEgY3dyCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21iLCBmaWx0ZXIoc2V0KHBlcm0pLl9fY29udGFpbnNfXywgY3dyKSkgICAgICMgY29tYjogY3dyIHRoYXQgaXMgYSBwZXJtCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21iLCBzb3J0ZWQoc2V0KGN3cikgJiBzZXQocGVybSkpKSAgICAgICAgICAgICMgY29tYjogYm90aCBhIGN3ciBhbmQgYSBwZXJtCisKKyAgICBkZWYgdGVzdF9jb21wcmVzcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbXByZXNzKGRhdGE9J0FCQ0RFRicsIHNlbGVjdG9ycz1bMSwwLDEsMCwxLDFdKSksIGxpc3QoJ0FDRUYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbXByZXNzKCdBQkNERUYnLCBbMSwwLDEsMCwxLDFdKSksIGxpc3QoJ0FDRUYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbXByZXNzKCdBQkNERUYnLCBbMCwwLDAsMCwwLDBdKSksIGxpc3QoJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcHJlc3MoJ0FCQ0RFRicsIFsxLDEsMSwxLDEsMV0pKSwgbGlzdCgnQUJDREVGJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21wcmVzcygnQUJDREVGJywgWzEsMCwxXSkpLCBsaXN0KCdBQycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcHJlc3MoJ0FCQycsIFswLDEsMSwxLDEsMV0pKSwgbGlzdCgnQkMnKSkKKyAgICAgICAgbiA9IDEwMDAwCisgICAgICAgIGRhdGEgPSBjaGFpbi5mcm9tX2l0ZXJhYmxlKHJlcGVhdChyYW5nZSg2KSwgbikpCisgICAgICAgIHNlbGVjdG9ycyA9IGNoYWluLmZyb21faXRlcmFibGUocmVwZWF0KCgwLCAxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21wcmVzcyhkYXRhLCBzZWxlY3RvcnMpKSwgWzEsMyw1XSAqIG4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcHJlc3MsIE5vbmUsIHJhbmdlKDYpKSAgICAgICMgMXN0IGFyZyBub3QgaXRlcmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wcmVzcywgcmFuZ2UoNiksIE5vbmUpICAgICAgIyAybmQgYXJnIG5vdCBpdGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXByZXNzLCByYW5nZSg2KSkgICAgICAgICAgICAjIHRvbyBmZXcgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbXByZXNzLCByYW5nZSg2KSwgTm9uZSkgICAgICAjIHRvbyBtYW55IGFyZ3MKKworICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgnYWJjJyxjb3VudCgpKSwgWygnYScsIDApLCAoJ2InLCAxKSwgKCdjJywgMildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCgnYWJjJyxjb3VudCgzKSksIFsoJ2EnLCAzKSwgKCdiJywgNCksICgnYycsIDUpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIsIHppcCgnYWJjJyxjb3VudCgzKSkpLCBbKCdhJywgMyksICgnYicsIDQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIsIHppcCgnYWJjJyxjb3VudCgtMSkpKSwgWygnYScsIC0xKSwgKCdiJywgMCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMiwgemlwKCdhYmMnLGNvdW50KC0zKSkpLCBbKCdhJywgLTMpLCAoJ2InLCAtMildKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvdW50LCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvdW50LCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoY291bnQobWF4c2l6ZS01KSwgMTApKSwgcmFuZ2UobWF4c2l6ZS01LCBtYXhzaXplKzUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKGNvdW50KC1tYXhzaXplLTUpLCAxMCkpLCByYW5nZSgtbWF4c2l6ZS01LCAtbWF4c2l6ZSs1KSkKKyAgICAgICAgYyA9IGNvdW50KDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KDMpJykKKyAgICAgICAgYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoNCknKQorICAgICAgICBjID0gY291bnQoLTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KC05KScpCisgICAgICAgIGMubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjb3VudCgxMC4yNSkpLCAnY291bnQoMTAuMjUpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLm5leHQoKSwgLTgpCisgICAgICAgIGZvciBpIGluICgtc3lzLm1heGludC01LCAtc3lzLm1heGludCs1ICwtMTAsIC0xLCAwLCAxMCwgc3lzLm1heGludC01LCBzeXMubWF4aW50KzUpOgorICAgICAgICAgICAgIyBUZXN0IHJlcHIgKGlnbm9yaW5nIHRoZSBMIGluIGxvbmdzKQorICAgICAgICAgICAgcjEgPSByZXByKGNvdW50KGkpKS5yZXBsYWNlKCdMJywgJycpCisgICAgICAgICAgICByMiA9ICdjb3VudCglciknLl9fbW9kX18oaSkucmVwbGFjZSgnTCcsICcnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSwgcjIpCisKKyAgICAgICAgIyBjaGVjayBjb3B5LCBkZWVwY29weSwgcGlja2xlCisgICAgICAgIGZvciB2YWx1ZSBpbiAtMywgMywgc3lzLm1heGludC01LCBzeXMubWF4aW50KzU6CisgICAgICAgICAgICBjID0gY291bnQodmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoY29weS5jb3B5KGMpKSwgdmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoY29weS5kZWVwY29weShjKSksIHZhbHVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMoYykpKSwgdmFsdWUpCisKKyAgICBkZWYgdGVzdF9jb3VudF93aXRoX3N0cmlkZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoJ2FiYycsY291bnQoMiwzKSksIFsoJ2EnLCAyKSwgKCdiJywgNSksICgnYycsIDgpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoJ2FiYycsY291bnQoc3RhcnQ9MixzdGVwPTMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdhJywgMiksICgnYicsIDUpLCAoJ2MnLCA4KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKCdhYmMnLGNvdW50KHN0ZXA9LTEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKCdhJywgMCksICgnYicsIC0xKSwgKCdjJywgLTIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoJ2FiYycsY291bnQoMiwwKSksIFsoJ2EnLCAyKSwgKCdiJywgMiksICgnYycsIDIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXAoJ2FiYycsY291bnQoMiwxKSksIFsoJ2EnLCAyKSwgKCdiJywgMyksICgnYycsIDQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIwLCBjb3VudChtYXhzaXplLTE1LCAzKSksIHRha2UoMjAsIHJhbmdlKG1heHNpemUtMTUsIG1heHNpemUrMTAwLCAzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgyMCwgY291bnQoLW1heHNpemUtMTUsIDMpKSwgdGFrZSgyMCwgcmFuZ2UoLW1heHNpemUtMTUsLW1heHNpemUrMTAwLCAzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgzLCBjb3VudCgyLCAzLjI1LTRqKSksIFsyLCA1LjI1LTRqLCA4LjUtOGpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMywgY291bnQoRGVjaW1hbCgnMS4xJyksIERlY2ltYWwoJy4xJykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbRGVjaW1hbCgnMS4xJyksIERlY2ltYWwoJzEuMicpLCBEZWNpbWFsKCcxLjMnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgzLCBjb3VudChGcmFjdGlvbigyLDMpLCBGcmFjdGlvbigxLDcpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgW0ZyYWN0aW9uKDIsMyksIEZyYWN0aW9uKDE3LDIxKSwgRnJhY3Rpb24oMjAsMjEpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHRha2UoMywgY291bnQoMTAsIDIuNSkpKSwgcmVwcihbMTAsIDEyLjUsIDE1LjBdKSkKKyAgICAgICAgYyA9IGNvdW50KDMsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KDMsIDUpJykKKyAgICAgICAgYy5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGMpLCAnY291bnQoOCwgNSknKQorICAgICAgICBjID0gY291bnQoLTksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KC05LCAwKScpCisgICAgICAgIGMubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KC05LCAwKScpCisgICAgICAgIGMgPSBjb3VudCgtOSwgLTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KC05LCAtMyknKQorICAgICAgICBjLm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoYyksICdjb3VudCgtMTIsIC0zKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihjKSwgJ2NvdW50KC0xMiwgLTMpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvdW50KDEwLjUsIDEuMjUpKSwgJ2NvdW50KDEwLjUsIDEuMjUpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvdW50KDEwLjUsIDEpKSwgJ2NvdW50KDEwLjUpJykgICAgICAgICAgICMgc3VwcHJlc3Mgc3RlcD0xIHdoZW4gaXQncyBhbiBpbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGNvdW50KDEwLjUsIDEuMDApKSwgJ2NvdW50KDEwLjUsIDEuMCknKSAgICMgZG8gc2hvdyBmbG9hdCB2YWx1ZXMgbGlsa2UgMS4wCisgICAgICAgIGZvciBpIGluICgtc3lzLm1heGludC01LCAtc3lzLm1heGludCs1ICwtMTAsIC0xLCAwLCAxMCwgc3lzLm1heGludC01LCBzeXMubWF4aW50KzUpOgorICAgICAgICAgICAgZm9yIGogaW4gICgtc3lzLm1heGludC01LCAtc3lzLm1heGludCs1ICwtMTAsIC0xLCAwLCAxLCAxMCwgc3lzLm1heGludC01LCBzeXMubWF4aW50KzUpOgorICAgICAgICAgICAgICAgICMgVGVzdCByZXByIChpZ25vcmluZyB0aGUgTCBpbiBsb25ncykKKyAgICAgICAgICAgICAgICByMSA9IHJlcHIoY291bnQoaSwgaikpLnJlcGxhY2UoJ0wnLCAnJykKKyAgICAgICAgICAgICAgICBpZiBqID09IDE6CisgICAgICAgICAgICAgICAgICAgIHIyID0gKCdjb3VudCglciknICUgaSkucmVwbGFjZSgnTCcsICcnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHIyID0gKCdjb3VudCglciwgJXIpJyAlIChpLCBqKSkucmVwbGFjZSgnTCcsICcnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyKQorCisgICAgZGVmIHRlc3RfY3ljbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSgxMCwgY3ljbGUoJ2FiYycpKSwgbGlzdCgnYWJjYWJjYWJjYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY3ljbGUoJycpKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3ljbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY3ljbGUsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoY3ljbGUoZ2VuMygpKSwxMCkpLCBbMCwxLDIsMCwxLDIsMCwxLDIsMF0pCisKKyAgICBkZWYgdGVzdF9ncm91cGJ5KHNlbGYpOgorICAgICAgICAjIENoZWNrIHdoZXRoZXIgaXQgYWNjZXB0cyBhcmd1bWVudHMgY29ycmVjdGx5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIGxpc3QoZ3JvdXBieShbXSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBsaXN0KGdyb3VwYnkoW10sIGtleT1pZCkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGdyb3VwYnkoJ2FiYycsIFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBncm91cGJ5LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdyb3VwYnksICdhYmMnLCBsYW1iZGEgeDp4LCAxMCkKKworICAgICAgICAjIENoZWNrIG5vcm1hbCBpbnB1dAorICAgICAgICBzID0gWygwLCAxMCwgMjApLCAoMCwgMTEsMjEpLCAoMCwxMiwyMSksICgxLDEzLDIxKSwgKDEsMTQsMjIpLAorICAgICAgICAgICAgICgyLDE1LDIyKSwgKDMsMTYsMjMpLCAoMywxNywyMyldCisgICAgICAgIGR1cCA9IFtdCisgICAgICAgIGZvciBrLCBnIGluIGdyb3VwYnkocywgbGFtYmRhIHI6clswXSk6CisgICAgICAgICAgICBmb3IgZWxlbSBpbiBnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgZWxlbVswXSkKKyAgICAgICAgICAgICAgICBkdXAuYXBwZW5kKGVsZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgZHVwKQorCisgICAgICAgICMgQ2hlY2sgbmVzdGVkIGNhc2UKKyAgICAgICAgZHVwID0gW10KKyAgICAgICAgZm9yIGssIGcgaW4gZ3JvdXBieShzLCBsYW1iZGEgcjpyWzBdKToKKyAgICAgICAgICAgIGZvciBpaywgaWcgaW4gZ3JvdXBieShnLCBsYW1iZGEgcjpyWzJdKToKKyAgICAgICAgICAgICAgICBmb3IgZWxlbSBpbiBpZzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBlbGVtWzBdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlrLCBlbGVtWzJdKQorICAgICAgICAgICAgICAgICAgICBkdXAuYXBwZW5kKGVsZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgZHVwKQorCisgICAgICAgICMgQ2hlY2sgY2FzZSB3aGVyZSBpbm5lciBpdGVyYXRvciBpcyBub3QgdXNlZAorICAgICAgICBrZXlzID0gW2sgZm9yIGssIGcgaW4gZ3JvdXBieShzLCBsYW1iZGEgcjpyWzBdKV0KKyAgICAgICAgZXhwZWN0ZWRrZXlzID0gc2V0KFtyWzBdIGZvciByIGluIHNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChrZXlzKSwgZXhwZWN0ZWRrZXlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzKSwgbGVuKGV4cGVjdGVka2V5cykpCisKKyAgICAgICAgIyBFeGVyY2lzZSBwaXBlcyBhbmQgZmlsdGVycyBzdHlsZQorICAgICAgICBzID0gJ2FicmFjYWRhYnJhJworICAgICAgICAjIHNvcnQgcyB8IHVuaXEKKyAgICAgICAgciA9IFtrIGZvciBrLCBnIGluIGdyb3VwYnkoc29ydGVkKHMpKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCBbJ2EnLCAnYicsICdjJywgJ2QnLCAnciddKQorICAgICAgICAjIHNvcnQgcyB8IHVuaXEgLWQKKyAgICAgICAgciA9IFtrIGZvciBrLCBnIGluIGdyb3VwYnkoc29ydGVkKHMpKSBpZiBsaXN0KGlzbGljZShnLDEsMikpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIFsnYScsICdiJywgJ3InXSkKKyAgICAgICAgIyBzb3J0IHMgfCB1bmlxIC1jCisgICAgICAgIHIgPSBbKGxlbihsaXN0KGcpKSwgaykgZm9yIGssIGcgaW4gZ3JvdXBieShzb3J0ZWQocykpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIFsoNSwgJ2EnKSwgKDIsICdiJyksICgxLCAnYycpLCAoMSwgJ2QnKSwgKDIsICdyJyldKQorICAgICAgICAjIHNvcnQgcyB8IHVuaXEgLWMgfCBzb3J0IC1ybiB8IGhlYWQgLTMKKyAgICAgICAgciA9IHNvcnRlZChbKGxlbihsaXN0KGcpKSAsIGspIGZvciBrLCBnIGluIGdyb3VwYnkoc29ydGVkKHMpKV0sIHJldmVyc2U9VHJ1ZSlbOjNdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgWyg1LCAnYScpLCAoMiwgJ3InKSwgKDIsICdiJyldKQorCisgICAgICAgICMgaXRlci5uZXh0IGZhaWx1cmUKKyAgICAgICAgY2xhc3MgRXhwZWN0ZWRFcnJvcihFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkZWYgZGVsYXllZF9yYWlzZShuPTApOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICAgICAgeWllbGQgJ3lvJworICAgICAgICAgICAgcmFpc2UgRXhwZWN0ZWRFcnJvcgorICAgICAgICBkZWYgZ3VscChpdGVyYWJsZSwga2V5cD1Ob25lLCBmdW5jPWxpc3QpOgorICAgICAgICAgICAgcmV0dXJuIFtmdW5jKGcpIGZvciBrLCBnIGluIGdyb3VwYnkoaXRlcmFibGUsIGtleXApXQorCisgICAgICAgICMgaXRlci5uZXh0IGZhaWx1cmUgb24gb3V0ZXIgb2JqZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4cGVjdGVkRXJyb3IsIGd1bHAsIGRlbGF5ZWRfcmFpc2UoMCkpCisgICAgICAgICMgaXRlci5uZXh0IGZhaWx1cmUgb24gaW5uZXIgb2JqZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4cGVjdGVkRXJyb3IsIGd1bHAsIGRlbGF5ZWRfcmFpc2UoMSkpCisKKyAgICAgICAgIyBfX2NtcF9fIGZhaWx1cmUKKyAgICAgICAgY2xhc3MgRHVtbXlDbXA6CisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBkc3QpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4cGVjdGVkRXJyb3IKKyAgICAgICAgcyA9IFtEdW1teUNtcCgpLCBEdW1teUNtcCgpLCBOb25lXQorCisgICAgICAgICMgX19jbXBfXyBmYWlsdXJlIG9uIG91dGVyIG9iamVjdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeHBlY3RlZEVycm9yLCBndWxwLCBzLCBmdW5jPWlkKQorICAgICAgICAjIF9fY21wX18gZmFpbHVyZSBvbiBpbm5lciBvYmplY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhwZWN0ZWRFcnJvciwgZ3VscCwgcykKKworICAgICAgICAjIGtleWZ1bmMgZmFpbHVyZQorICAgICAgICBkZWYga2V5ZnVuYyhvYmopOgorICAgICAgICAgICAgaWYga2V5ZnVuYy5za2lwID4gMDoKKyAgICAgICAgICAgICAgICBrZXlmdW5jLnNraXAgLT0gMQorICAgICAgICAgICAgICAgIHJldHVybiBvYmoKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhwZWN0ZWRFcnJvcgorCisgICAgICAgICMga2V5ZnVuYyBmYWlsdXJlIG9uIG91dGVyIG9iamVjdAorICAgICAgICBrZXlmdW5jLnNraXAgPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4cGVjdGVkRXJyb3IsIGd1bHAsIFtOb25lXSwga2V5ZnVuYykKKyAgICAgICAga2V5ZnVuYy5za2lwID0gMQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeHBlY3RlZEVycm9yLCBndWxwLCBbTm9uZSwgTm9uZV0sIGtleWZ1bmMpCisKKyAgICBkZWYgdGVzdF9pZmlsdGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaWZpbHRlcihpc0V2ZW4sIHJhbmdlKDYpKSksIFswLDIsNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyKE5vbmUsIFswLDEsMCwyLDBdKSksIFsxLDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaWZpbHRlcihib29sLCBbMCwxLDAsMiwwXSkpLCBbMSwyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDQsIGlmaWx0ZXIoaXNFdmVuLCBjb3VudCgpKSksIFswLDIsNCw2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlmaWx0ZXIsIGxhbWJkYSB4OngpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlciwgbGFtYmRhIHg6eCwgcmFuZ2UoNiksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlciwgaXNFdmVuLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlmaWx0ZXIocmFuZ2UoNiksIHJhbmdlKDYpKS5uZXh0KQorCisgICAgZGVmIHRlc3RfaWZpbHRlcmZhbHNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaWZpbHRlcmZhbHNlKGlzRXZlbiwgcmFuZ2UoNikpKSwgWzEsMyw1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlmaWx0ZXJmYWxzZShOb25lLCBbMCwxLDAsMiwwXSkpLCBbMCwwLDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaWZpbHRlcmZhbHNlKGJvb2wsIFswLDEsMCwyLDBdKSksIFswLDAsMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFrZSg0LCBpZmlsdGVyZmFsc2UoaXNFdmVuLCBjb3VudCgpKSksIFsxLDMsNSw3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpZmlsdGVyZmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlcmZhbHNlLCBsYW1iZGEgeDp4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlmaWx0ZXJmYWxzZSwgbGFtYmRhIHg6eCwgcmFuZ2UoNiksIDcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlcmZhbHNlLCBpc0V2ZW4sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlcmZhbHNlKHJhbmdlKDYpLCByYW5nZSg2KSkubmV4dCkKKworICAgIGRlZiB0ZXN0X2l6aXAoc2VsZik6CisgICAgICAgIGFucyA9IFsoeCx5KSBmb3IgeCwgeSBpbiBpemlwKCdhYmMnLGNvdW50KCkpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFucywgWygnYScsIDApLCAoJ2InLCAxKSwgKCdjJywgMildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcCgnYWJjJywgcmFuZ2UoNikpKSwgemlwKCdhYmMnLCByYW5nZSg2KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwKCdhYmNkZWYnLCByYW5nZSgzKSkpLCB6aXAoJ2FiY2RlZicsIHJhbmdlKDMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDMsaXppcCgnYWJjZGVmJywgY291bnQoKSkpLCB6aXAoJ2FiY2RlZicsIHJhbmdlKDMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXAoJ2FiY2RlZicpKSwgemlwKCdhYmNkZWYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXAoKSksIHppcCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGl6aXAsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXppcCwgcmFuZ2UoMyksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3R1cGxlKGxpc3QocGFpcikpIGZvciBwYWlyIGluIGl6aXAoJ2FiYycsICdkZWYnKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgemlwKCdhYmMnLCAnZGVmJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3BhaXIgZm9yIHBhaXIgaW4gaXppcCgnYWJjJywgJ2RlZicpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6aXAoJ2FiYycsICdkZWYnKSkKKworICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInR1cGxlIHJldXNlIGlzIHNwZWNpZmljIHRvIENQeXRob24iKQorICAgIGRlZiB0ZXN0X2l6aXBfdHVwbGVfcmVzdXNlKHNlbGYpOgorICAgICAgICBpZHMgPSBtYXAoaWQsIGl6aXAoJ2FiYycsICdkZWYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oaWRzKSwgbWF4KGlkcykpCisgICAgICAgIGlkcyA9IG1hcChpZCwgbGlzdChpemlwKCdhYmMnLCAnZGVmJykpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaWN0LmZyb21rZXlzKGlkcykpLCBsZW4oaWRzKSkKKworICAgIGRlZiB0ZXN0X2l6aXBsb25nZXN0KHNlbGYpOgorICAgICAgICBmb3IgYXJncyBpbiBbCisgICAgICAgICAgICAgICAgWydhYmMnLCByYW5nZSg2KV0sCisgICAgICAgICAgICAgICAgW3JhbmdlKDYpLCAnYWJjJ10sCisgICAgICAgICAgICAgICAgW3JhbmdlKDEwMDApLCByYW5nZSgyMDAwLDIxMDApLCByYW5nZSgzMDAwLDMwNTApXSwKKyAgICAgICAgICAgICAgICBbcmFuZ2UoMTAwMCksIHJhbmdlKDApLCByYW5nZSgzMDAwLDMwNTApLCByYW5nZSgxMjAwKSwgcmFuZ2UoMTUwMCldLAorICAgICAgICAgICAgICAgIFtyYW5nZSgxMDAwKSwgcmFuZ2UoMCksIHJhbmdlKDMwMDAsMzA1MCksIHJhbmdlKDEyMDApLCByYW5nZSgxNTAwKSwgcmFuZ2UoMCldLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgICMgdGFyZ2V0ID0gbWFwKE5vbmUsICphcmdzKSA8LSB0aGlzIHJhaXNlcyBhIHB5M2sgd2FybmluZworICAgICAgICAgICAgIyB0aGlzIGlzIHRoZSByZXBsYWNlbWVudDoKKyAgICAgICAgICAgIHRhcmdldCA9IFt0dXBsZShbYXJnW2ldIGlmIGkgPCBsZW4oYXJnKSBlbHNlIE5vbmUgZm9yIGFyZyBpbiBhcmdzXSkKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtYXgobWFwKGxlbiwgYXJncykpKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwX2xvbmdlc3QoKmFyZ3MpKSwgdGFyZ2V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgqYXJncywgKip7fSkpLCB0YXJnZXQpCisgICAgICAgICAgICB0YXJnZXQgPSBbdHVwbGUoKGUgaXMgTm9uZSBhbmQgJ1gnIG9yIGUpIGZvciBlIGluIHQpIGZvciB0IGluIHRhcmdldF0gICAjIFJlcGxhY2UgTm9uZSBmaWxscyB3aXRoICdYJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgqYXJncywgKipkaWN0KGZpbGx2YWx1ZT0nWCcpKSksIHRhcmdldCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMyxpemlwX2xvbmdlc3QoJ2FiY2RlZicsIGNvdW50KCkpKSwgemlwKCdhYmNkZWYnLCByYW5nZSgzKSkpICMgdGFrZSAzIGZyb20gaW5maW5pdGUgaW5wdXQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KCkpLCB6aXAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdChbXSkpLCB6aXAoW10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KCdhYmNkZWYnKSksIHppcCgnYWJjZGVmJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdCgnYWJjJywgJ2RlZmcnLCAqKnt9KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgemlwKGxpc3QoJ2FiYycpICsgW05vbmVdLCAnZGVmZycpKSAgIyBlbXB0eSBrZXl3b3JkIGRpY3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpemlwX2xvbmdlc3QsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXppcF9sb25nZXN0LCByYW5nZSgzKSwgMykKKworICAgICAgICBmb3Igc3RtdCBpbiBbCisgICAgICAgICAgICAiaXppcF9sb25nZXN0KCdhYmMnLCBmdj0xKSIsCisgICAgICAgICAgICAiaXppcF9sb25nZXN0KCdhYmMnLCBmaWxsdmFsdWU9MSwgYm9ndXNfa2V5d29yZD1Ob25lKSIsCisgICAgICAgIF06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXZhbChzdG10LCBnbG9iYWxzKCksIGxvY2FscygpKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnRGlkIG5vdCByYWlzZSBUeXBlIGluOiAgJyArIHN0bXQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbdHVwbGUobGlzdChwYWlyKSkgZm9yIHBhaXIgaW4gaXppcF9sb25nZXN0KCdhYmMnLCAnZGVmJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgIHppcCgnYWJjJywgJ2RlZicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwYWlyIGZvciBwYWlyIGluIGl6aXBfbG9uZ2VzdCgnYWJjJywgJ2RlZicpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6aXAoJ2FiYycsICdkZWYnKSkKKworICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInR1cGxlIHJldXNlIGlzIHNwZWNpZmljIHRvIENQeXRob24iKQorICAgIGRlZiB0ZXN0X2l6aXBfbG9uZ2VzdF90dXBsZV9yZXVzZShzZWxmKToKKyAgICAgICAgaWRzID0gbWFwKGlkLCBpemlwX2xvbmdlc3QoJ2FiYycsICdkZWYnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaW4oaWRzKSwgbWF4KGlkcykpCisgICAgICAgIGlkcyA9IG1hcChpZCwgbGlzdChpemlwX2xvbmdlc3QoJ2FiYycsICdkZWYnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpY3QuZnJvbWtleXMoaWRzKSksIGxlbihpZHMpKQorCisgICAgZGVmIHRlc3RfYnVnXzcyNDQoc2VsZik6CisKKyAgICAgICAgY2xhc3MgUmVwZWF0ZXIob2JqZWN0KToKKyAgICAgICAgICAgICMgdGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIGl0ZXJ0b29scy5yZXBlYXQKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvLCB0LCBlKToKKyAgICAgICAgICAgICAgICBzZWxmLm8gPSBvCisgICAgICAgICAgICAgICAgc2VsZi50ID0gaW50KHQpCisgICAgICAgICAgICAgICAgc2VsZi5lID0gZQorICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOiAjIGl0cyBpdGVyYXRvciBpcyBpdHNlbGYKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi50ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50IC09IDEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYuZQorCisgICAgICAgICMgRm9ybWVybHkgdGhpcyBjb2RlIGluIHdvdWxkIGZhaWwgaW4gZGVidWcgbW9kZQorICAgICAgICAjIHdpdGggVW5kZXRlY3RlZCBFcnJvciBhbmQgU3RvcCBJdGVyYXRpb24KKyAgICAgICAgcjEgPSBSZXBlYXRlcigxLCAzLCBTdG9wSXRlcmF0aW9uKQorICAgICAgICByMiA9IFJlcGVhdGVyKDIsIDQsIFN0b3BJdGVyYXRpb24pCisgICAgICAgIGRlZiBydW4ocjEsIHIyKToKKyAgICAgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgICAgICBmb3IgaSwgaiBpbiBpemlwX2xvbmdlc3QocjEsIHIyLCBmaWxsdmFsdWU9MCk6CisgICAgICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRvdXQnKToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgKGksIGopCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoaSwgaikpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocnVuKHIxLCByMiksIFsoMSwyKSwgKDEsMiksICgxLDIpLCAoMCwyKV0pCisKKyAgICAgICAgIyBGb3JtZXJseSwgdGhlIFJ1bnRpbWVFcnJvciB3b3VsZCBiZSBsb3N0CisgICAgICAgICMgYW5kIFN0b3BJdGVyYXRpb24gd291bGQgc3RvcCBhcyBleHBlY3RlZAorICAgICAgICByMSA9IFJlcGVhdGVyKDEsIDMsIFJ1bnRpbWVFcnJvcikKKyAgICAgICAgcjIgPSBSZXBlYXRlcigyLCA0LCBTdG9wSXRlcmF0aW9uKQorICAgICAgICBpdCA9IGl6aXBfbG9uZ2VzdChyMSwgcjIsIGZpbGx2YWx1ZT0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5leHQoaXQpLCAoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV4dChpdCksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0KSwgKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG5leHQsIGl0KQorCisgICAgZGVmIHRlc3RfcHJvZHVjdChzZWxmKToKKyAgICAgICAgZm9yIGFyZ3MsIHJlc3VsdCBpbiBbCisgICAgICAgICAgICAoW10sIFsoKV0pLCAgICAgICAgICAgICAgICAgICAgICMgemVybyBpdGVyYWJsZXMKKyAgICAgICAgICAgIChbJ2FiJ10sIFsoJ2EnLCksICgnYicsKV0pLCAgICAgIyBvbmUgaXRlcmFibGUKKyAgICAgICAgICAgIChbcmFuZ2UoMiksIHJhbmdlKDMpXSwgWygwLDApLCAoMCwxKSwgKDAsMiksICgxLDApLCAoMSwxKSwgKDEsMildKSwgICAgICMgdHdvIGl0ZXJhYmxlcworICAgICAgICAgICAgKFtyYW5nZSgwKSwgcmFuZ2UoMiksIHJhbmdlKDMpXSwgW10pLCAgICAgICAgICAgIyBmaXJzdCBpdGVyYWJsZSB3aXRoIHplcm8gbGVuZ3RoCisgICAgICAgICAgICAoW3JhbmdlKDIpLCByYW5nZSgwKSwgcmFuZ2UoMyldLCBbXSksICAgICAgICAgICAjIG1pZGRsZSBpdGVyYWJsZSB3aXRoIHplcm8gbGVuZ3RoCisgICAgICAgICAgICAoW3JhbmdlKDIpLCByYW5nZSgzKSwgcmFuZ2UoMCldLCBbXSksICAgICAgICAgICAjIGxhc3QgaXRlcmFibGUgd2l0aCB6ZXJvIGxlbmd0aAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwcm9kdWN0KCphcmdzKSksIHJlc3VsdCkKKyAgICAgICAgICAgIGZvciByIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwcm9kdWN0KCooYXJncypyKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdChwcm9kdWN0KCphcmdzLCAqKmRpY3QocmVwZWF0PXIpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QocHJvZHVjdCgqW3JhbmdlKDcpXSo2KSkpLCA3Kio2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb2R1Y3QsIHJhbmdlKDYpLCBOb25lKQorCisgICAgICAgIGRlZiBwcm9kdWN0MSgqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgIHBvb2xzID0gbWFwKHR1cGxlLCBhcmdzKSAqIGt3ZHMuZ2V0KCdyZXBlYXQnLCAxKQorICAgICAgICAgICAgbiA9IGxlbihwb29scykKKyAgICAgICAgICAgIGlmIG4gPT0gMDoKKyAgICAgICAgICAgICAgICB5aWVsZCAoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgYW55KGxlbihwb29sKSA9PSAwIGZvciBwb29sIGluIHBvb2xzKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGluZGljZXMgPSBbMF0gKiBuCisgICAgICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBwb29sLCBpIGluIHppcChwb29scywgaW5kaWNlcykpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKG4pKTogICMgcmlnaHQgdG8gbGVmdAorICAgICAgICAgICAgICAgICAgICBpZiBpbmRpY2VzW2ldID09IGxlbihwb29sc1tpXSkgLSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlc1tpXSArPSAxCisgICAgICAgICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGkrMSwgbik6CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzW2pdID0gMAorICAgICAgICAgICAgICAgICAgICB5aWVsZCB0dXBsZShwb29sW2ldIGZvciBwb29sLCBpIGluIHppcChwb29scywgaW5kaWNlcykpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZGVmIHByb2R1Y3QyKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgJ1B1cmUgcHl0aG9uIHZlcnNpb24gdXNlZCBpbiBkb2NzJworICAgICAgICAgICAgcG9vbHMgPSBtYXAodHVwbGUsIGFyZ3MpICoga3dkcy5nZXQoJ3JlcGVhdCcsIDEpCisgICAgICAgICAgICByZXN1bHQgPSBbW11dCisgICAgICAgICAgICBmb3IgcG9vbCBpbiBwb29sczoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBbeCtbeV0gZm9yIHggaW4gcmVzdWx0IGZvciB5IGluIHBvb2xdCisgICAgICAgICAgICBmb3IgcHJvZCBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgeWllbGQgdHVwbGUocHJvZCkKKworICAgICAgICBhcmd0eXBlcyA9IFsnJywgJ2FiYycsICcnLCB4cmFuZ2UoMCksIHhyYW5nZSg0KSwgZGljdChhPTEsIGI9MiwgYz0zKSwKKyAgICAgICAgICAgICAgICAgICAgc2V0KCdhYmNkZWZnJyksIHJhbmdlKDExKSwgdHVwbGUocmFuZ2UoMTMpKV0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGFyZ3MgPSBbcmFuZG9tLmNob2ljZShhcmd0eXBlcykgZm9yIGogaW4gcmFuZ2UocmFuZG9tLnJhbmRyYW5nZSg1KSldCisgICAgICAgICAgICBleHBlY3RlZF9sZW4gPSBwcm9kKG1hcChsZW4sIGFyZ3MpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGlzdChwcm9kdWN0KCphcmdzKSkpLCBleHBlY3RlZF9sZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocHJvZHVjdCgqYXJncykpLCBsaXN0KHByb2R1Y3QxKCphcmdzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocHJvZHVjdCgqYXJncykpLCBsaXN0KHByb2R1Y3QyKCphcmdzKSkpCisgICAgICAgICAgICBhcmdzID0gbWFwKGl0ZXIsIGFyZ3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KHByb2R1Y3QoKmFyZ3MpKSksIGV4cGVjdGVkX2xlbikKKworICAgIEB0ZXN0X3N1cHBvcnQuaW1wbF9kZXRhaWwoInR1cGxlIHJldXNlIGlzIHNwZWNpZmljIHRvIENQeXRob24iKQorICAgIGRlZiB0ZXN0X3Byb2R1Y3RfdHVwbGVfcmV1c2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChtYXAoaWQsIHByb2R1Y3QoJ2FiYycsICdkZWYnKSkpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChsZW4oc2V0KG1hcChpZCwgbGlzdChwcm9kdWN0KCdhYmMnLCAnZGVmJykpKSkpLCAxKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmVwZWF0KG9iamVjdD0nYScsIHRpbWVzPTMpKSwgWydhJywgJ2EnLCAnYSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcCh4cmFuZ2UoMykscmVwZWF0KCdhJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwgJ2EnKSwgKDEsICdhJyksICgyLCAnYScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlcGVhdCgnYScsIDMpKSwgWydhJywgJ2EnLCAnYSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRha2UoMywgcmVwZWF0KCdhJykpLCBbJ2EnLCAnYScsICdhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChyZXBlYXQoJ2EnLCAwKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocmVwZWF0KCdhJywgLTMpKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVwZWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlcGVhdCwgTm9uZSwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXBlYXQsIE5vbmUsICdhJykKKyAgICAgICAgciA9IHJlcGVhdCgxKzBqKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIociksICdyZXBlYXQoKDErMGopKScpCisgICAgICAgIHIgPSByZXBlYXQoMSswaiwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHIpLCAncmVwZWF0KCgxKzBqKSwgNSknKQorICAgICAgICBsaXN0KHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihyKSwgJ3JlcGVhdCgoMSswaiksIDApJykKKworICAgIGRlZiB0ZXN0X2ltYXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpbWFwKG9wZXJhdG9yLnBvdywgcmFuZ2UoMyksIHJhbmdlKDEsNykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbMCoqMSwgMSoqMiwgMioqM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpbWFwKE5vbmUsICdhYmMnLCByYW5nZSg1KSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2EnLDApLCgnYicsMSksKCdjJywyKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpbWFwKE5vbmUsICdhYmMnLCBjb3VudCgpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnYScsMCksKCdiJywxKSwoJ2MnLDIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDIsaW1hcChOb25lLCAnYWJjJywgY291bnQoKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ2EnLDApLCgnYicsMSldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaW1hcChvcGVyYXRvci5wb3csIFtdKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGltYXApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW1hcCwgb3BlcmF0b3IubmVnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGltYXAoMTAsIHJhbmdlKDUpKS5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpbWFwKGVycmZ1bmMsIFs0XSwgWzVdKS5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGltYXAob25lYXJnLCBbNF0sIFs1XSkubmV4dCkKKworICAgIGRlZiB0ZXN0X3N0YXJtYXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdGFybWFwKG9wZXJhdG9yLnBvdywgemlwKHJhbmdlKDMpLCByYW5nZSgxLDcpKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFswKioxLCAxKioyLCAyKiozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWtlKDMsIHN0YXJtYXAob3BlcmF0b3IucG93LCBpemlwKGNvdW50KCksIGNvdW50KDEpKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFswKioxLCAxKioyLCAyKiozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN0YXJtYXAob3BlcmF0b3IucG93LCBbXSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN0YXJtYXAob3BlcmF0b3IucG93LCBbaXRlcihbNCw1XSldKSksIFs0Kio1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBzdGFybWFwKG9wZXJhdG9yLnBvdywgW05vbmVdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdGFybWFwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0YXJtYXAsIG9wZXJhdG9yLnBvdywgWyg0LDUpXSwgJ2V4dHJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdGFybWFwKDEwLCBbKDQsNSldKS5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdGFybWFwKGVycmZ1bmMsIFsoNCw1KV0pLm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3Rhcm1hcChvbmVhcmcsIFsoNCw1KV0pLm5leHQpCisKKyAgICBkZWYgdGVzdF9pc2xpY2Uoc2VsZik6CisgICAgICAgIGZvciBhcmdzIGluIFsgICAgICAgICAgIyBpc2xpY2UoYXJncykgc2hvdWxkIGFncmVlIHdpdGggcmFuZ2UoYXJncykKKyAgICAgICAgICAgICAgICAoMTAsIDIwLCAzKSwKKyAgICAgICAgICAgICAgICAoMTAsIDMsIDIwKSwKKyAgICAgICAgICAgICAgICAoMTAsIDIwKSwKKyAgICAgICAgICAgICAgICAoMTAsIDMpLAorICAgICAgICAgICAgICAgICgyMCwpCisgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoeHJhbmdlKDEwMCksICphcmdzKSksIHJhbmdlKCphcmdzKSkKKworICAgICAgICBmb3IgYXJncywgdGd0YXJncyBpbiBbICAjIFN0b3Agd2hlbiBzZXFuIGlzIGV4aGF1c3RlZAorICAgICAgICAgICAgICAgICgoMTAsIDExMCwgMyksICgoMTAsIDEwMCwgMykpKSwKKyAgICAgICAgICAgICAgICAoKDEwLCAxMTApLCAoKDEwLCAxMDApKSksCisgICAgICAgICAgICAgICAgKCgxMTAsKSwgKDEwMCwpKQorICAgICAgICAgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKHhyYW5nZSgxMDApLCAqYXJncykpLCByYW5nZSgqdGd0YXJncykpCisKKyAgICAgICAgIyBUZXN0IHN0b3A9Tm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKHhyYW5nZSgxMCksIE5vbmUpKSwgcmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKHhyYW5nZSgxMCksIE5vbmUsIE5vbmUpKSwgcmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKHhyYW5nZSgxMCksIE5vbmUsIE5vbmUsIE5vbmUpKSwgcmFuZ2UoMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKHhyYW5nZSgxMCksIDIsIE5vbmUpKSwgcmFuZ2UoMiwgMTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKHhyYW5nZSgxMCksIDEsIE5vbmUsIDIpKSwgcmFuZ2UoMSwgMTAsIDIpKQorCisgICAgICAgICMgVGVzdCBudW1iZXIgb2YgaXRlbXMgY29uc3VtZWQgICAgIFNGICMxMTcxNDE3CisgICAgICAgIGl0ID0gaXRlcihyYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoaXQsIDMpKSwgcmFuZ2UoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdCksIHJhbmdlKDMsIDEwKSkKKworICAgICAgICAjIFRlc3QgaW52YWxpZCBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNsaWNlLCB4cmFuZ2UoMTApLCAxLCAyLCAzLCA0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksIC01LCAxMCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaXNsaWNlLCB4cmFuZ2UoMTApLCAxLCAtNSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGlzbGljZSwgeHJhbmdlKDEwKSwgMSwgMTAsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksIDEsIDEwLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaXNsaWNlLCB4cmFuZ2UoMTApLCAnYScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGlzbGljZSwgeHJhbmdlKDEwKSwgMSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBpc2xpY2UsIHhyYW5nZSgxMCksICdhJywgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgaXNsaWNlLCB4cmFuZ2UoMTApLCAxLCAnYScsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoaXNsaWNlKGNvdW50KCksIDEsIDEwLCBtYXhzaXplKSkpLCAxKQorCisgICAgICAgICMgSXNzdWUgIzEwMzIzOiAgTGVzcyBpc2xpY2UgaW4gYSBwcmVkaWN0YWJsZSBzdGF0ZQorICAgICAgICBjID0gY291bnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXNsaWNlKGMsIDEsIDMsIDUwKSksIFsxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGMpLCAzKQorCisgICAgZGVmIHRlc3RfdGFrZXdoaWxlKHNlbGYpOgorICAgICAgICBkYXRhID0gWzEsIDMsIDUsIDIwLCAyLCA0LCA2LCA4XQorICAgICAgICB1bmRlcnRlbiA9IGxhbWJkYSB4OiB4PDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh0YWtld2hpbGUodW5kZXJ0ZW4sIGRhdGEpKSwgWzEsIDMsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QodGFrZXdoaWxlKHVuZGVydGVuLCBbXSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0YWtld2hpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGFrZXdoaWxlLCBvcGVyYXRvci5wb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGFrZXdoaWxlLCBvcGVyYXRvci5wb3csIFsoNCw1KV0sICdleHRyYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGFrZXdoaWxlKDEwLCBbKDQsNSldKS5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YWtld2hpbGUoZXJyZnVuYywgWyg0LDUpXSkubmV4dCkKKyAgICAgICAgdCA9IHRha2V3aGlsZShib29sLCBbMSwgMSwgMSwgMCwgMCwgMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh0KSwgWzEsIDEsIDFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCB0Lm5leHQpCisKKyAgICBkZWYgdGVzdF9kcm9wd2hpbGUoc2VsZik6CisgICAgICAgIGRhdGEgPSBbMSwgMywgNSwgMjAsIDIsIDQsIDYsIDhdCisgICAgICAgIHVuZGVydGVuID0gbGFtYmRhIHg6IHg8MTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGRyb3B3aGlsZSh1bmRlcnRlbiwgZGF0YSkpLCBbMjAsIDIsIDQsIDYsIDhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZHJvcHdoaWxlKHVuZGVydGVuLCBbXSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkcm9wd2hpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZHJvcHdoaWxlLCBvcGVyYXRvci5wb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZHJvcHdoaWxlLCBvcGVyYXRvci5wb3csIFsoNCw1KV0sICdleHRyYScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZHJvcHdoaWxlKDEwLCBbKDQsNSldKS5uZXh0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkcm9wd2hpbGUoZXJyZnVuYywgWyg0LDUpXSkubmV4dCkKKworICAgIGRlZiB0ZXN0X3RlZShzZWxmKToKKyAgICAgICAgbiA9IDIwMAorICAgICAgICBkZWYgaXJhbmdlKG4pOgorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKG4pOgorICAgICAgICAgICAgICAgIHlpZWxkIGkKKworICAgICAgICBhLCBiID0gdGVlKFtdKSAgICAgICAgIyB0ZXN0IGVtcHR5IGl0ZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChiKSwgW10pCisKKyAgICAgICAgYSwgYiA9IHRlZShpcmFuZ2UobikpICMgdGVzdCAxMDAlIGludGVybGVhdmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwKGEsYiksIHppcChyYW5nZShuKSxyYW5nZShuKSkpCisKKyAgICAgICAgYSwgYiA9IHRlZShpcmFuZ2UobikpICMgdGVzdCAwJSBpbnRlcmxlYXZlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYSksIHJhbmdlKG4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYiksIHJhbmdlKG4pKQorCisgICAgICAgIGEsIGIgPSB0ZWUoaXJhbmdlKG4pKSAjIHRlc3QgZGVhbGxvYyBvZiBsZWFkaW5nIGl0ZXJhdG9yCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm5leHQoKSwgaSkKKyAgICAgICAgZGVsIGEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCByYW5nZShuKSkKKworICAgICAgICBhLCBiID0gdGVlKGlyYW5nZShuKSkgIyB0ZXN0IGRlYWxsb2Mgb2YgdHJhaWxpbmcgaXRlcmF0b3IKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEubmV4dCgpLCBpKQorICAgICAgICBkZWwgYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYSksIHJhbmdlKDEwMCwgbikpCisKKyAgICAgICAgZm9yIGogaW4geHJhbmdlKDUpOiAgICMgdGVzdCByYW5kb21seSBpbnRlcmxlYXZlZAorICAgICAgICAgICAgb3JkZXIgPSBbMF0qbiArIFsxXSpuCisgICAgICAgICAgICByYW5kb20uc2h1ZmZsZShvcmRlcikKKyAgICAgICAgICAgIGxpc3RzID0gKFtdLCBbXSkKKyAgICAgICAgICAgIGl0cyA9IHRlZShpcmFuZ2UobikpCisgICAgICAgICAgICBmb3IgaSBpbiBvcmRlcjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGl0c1tpXS5uZXh0KCkKKyAgICAgICAgICAgICAgICBsaXN0c1tpXS5hcHBlbmQodmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3RzWzBdLCByYW5nZShuKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdHNbMV0sIHJhbmdlKG4pKQorCisgICAgICAgICMgdGVzdCBhcmd1bWVudCBmb3JtYXQgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0ZWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGVlLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRlZSwgWzEsMl0sICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0ZWUsIFsxLDJdLCAzLCAneCcpCisKKyAgICAgICAgIyB0ZWUgb2JqZWN0IHNob3VsZCBiZSBpbnN0YW50aWFibGUKKyAgICAgICAgYSwgYiA9IHRlZSgnYWJjJykKKyAgICAgICAgYyA9IHR5cGUoYSkoJ2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjKSwgbGlzdCgnZGVmJykpCisKKyAgICAgICAgIyB0ZXN0IGxvbmctbGFnZ2VkIGFuZCBtdWx0aS13YXkgc3BsaXQKKyAgICAgICAgYSwgYiwgYyA9IHRlZSh4cmFuZ2UoMjAwMCksIDMpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLm5leHQoKSwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGIpLCByYW5nZSgyMDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbYy5uZXh0KCksIGMubmV4dCgpXSwgcmFuZ2UoMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhKSwgcmFuZ2UoMTAwLDIwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYyksIHJhbmdlKDIsMjAwMCkpCisKKyAgICAgICAgIyB0ZXN0IHZhbHVlcyBvZiBuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGVlLCAnYWJjJywgJ2ludmFsaWQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0ZWUsIFtdLCAtMSkKKyAgICAgICAgZm9yIG4gaW4geHJhbmdlKDUpOgorICAgICAgICAgICAgcmVzdWx0ID0gdGVlKCdhYmMnLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIHR1cGxlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFwKGxpc3QsIHJlc3VsdCksIFtsaXN0KCdhYmMnKV0qbikKKworICAgICAgICAjIHRlZSBwYXNzLXRocm91Z2ggdG8gY29weWFibGUgaXRlcmF0b3IKKyAgICAgICAgYSwgYiA9IHRlZSgnYWJjJykKKyAgICAgICAgYywgZCA9IHRlZShhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBjKQorCisgICAgICAgICMgdGVzdCB0ZWVfbmV3CisgICAgICAgIHQxLCB0MiA9IHRlZSgnYWJjJykKKyAgICAgICAgdG5ldyA9IHR5cGUodDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdG5ldykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0bmV3LCAxMCkKKyAgICAgICAgdDMgPSB0bmV3KHQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGlzdCh0MSkgPT0gbGlzdCh0MikgPT0gbGlzdCh0MykgPT0gbGlzdCgnYWJjJykpCisKKyAgICAgICAgIyB0ZXN0IHRoYXQgdGVlIG9iamVjdHMgYXJlIHdlYWsgcmVmZXJlbmNhYmxlCisgICAgICAgIGEsIGIgPSB0ZWUoeHJhbmdlKDEwKSkKKyAgICAgICAgcCA9IHByb3h5KGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihwLCAnX19jbGFzc19fJyksIHR5cGUoYikpCisgICAgICAgIGRlbCBhCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBnZXRhdHRyLCBwLCAnX19jbGFzc19fJykKKworICAgICMgSXNzdWUgMTM0NTQ6IENyYXNoIHdoZW4gZGVsZXRpbmcgYmFja3dhcmQgaXRlcmF0b3IgZnJvbSB0ZWUoKQorICAgIGRlZiB0ZXN0X3RlZV9kZWxfYmFja3dhcmQoc2VsZik6CisgICAgICAgIGZvcndhcmQsIGJhY2t3YXJkID0gdGVlKHJlcGVhdChOb25lLCAyMDAwMDAwMCkpCisgICAgICAgIGFueShmb3J3YXJkKSAgIyBleGhhdXN0IHRoZSBpdGVyYXRvcgorICAgICAgICBkZWwgYmFja3dhcmQKKworICAgIGRlZiB0ZXN0X1N0b3BJdGVyYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGl6aXAoKS5uZXh0KQorCisgICAgICAgIGZvciBmIGluIChjaGFpbiwgY3ljbGUsIGl6aXAsIGdyb3VwYnkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgZihbXSkubmV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGYoU3RvcE5vdygpKS5uZXh0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGlzbGljZShbXSwgTm9uZSkubmV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgaXNsaWNlKFN0b3BOb3coKSwgTm9uZSkubmV4dCkKKworICAgICAgICBwLCBxID0gdGVlKFtdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBwLm5leHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHEubmV4dCkKKyAgICAgICAgcCwgcSA9IHRlZShTdG9wTm93KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHAubmV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgcS5uZXh0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHJlcGVhdChOb25lLCAwKS5uZXh0KQorCisgICAgICAgIGZvciBmIGluIChpZmlsdGVyLCBpZmlsdGVyZmFsc2UsIGltYXAsIHRha2V3aGlsZSwgZHJvcHdoaWxlLCBzdGFybWFwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIGYobGFtYmRhIHg6eCwgW10pLm5leHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBmKGxhbWJkYSB4OngsIFN0b3BOb3coKSkubmV4dCkKKworY2xhc3MgVGVzdEV4YW1wbGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NoYWluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4oY2hhaW4oJ0FCQycsICdERUYnKSksICdBQkNERUYnKQorCisgICAgZGVmIHRlc3RfY2hhaW5fZnJvbV9pdGVyYWJsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5qb2luKGNoYWluLmZyb21faXRlcmFibGUoWydBQkMnLCAnREVGJ10pKSwgJ0FCQ0RFRicpCisKKyAgICBkZWYgdGVzdF9jb21iaW5hdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21iaW5hdGlvbnMoJ0FCQ0QnLCAyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnQScsJ0InKSwgKCdBJywnQycpLCAoJ0EnLCdEJyksICgnQicsJ0MnKSwgKCdCJywnRCcpLCAoJ0MnLCdEJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tYmluYXRpb25zKHJhbmdlKDQpLCAzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygwLDEsMiksICgwLDEsMyksICgwLDIsMyksICgxLDIsMyldKQorCisgICAgZGVmIHRlc3RfY29tYmluYXRpb25zX3dpdGhfcmVwbGFjZW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudCgnQUJDJywgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoJ0EnLCdBJyksICgnQScsJ0InKSwgKCdBJywnQycpLCAoJ0InLCdCJyksICgnQicsJ0MnKSwgKCdDJywnQycpXSkKKworICAgIGRlZiB0ZXN0X2NvbXByZXNzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoY29tcHJlc3MoJ0FCQ0RFRicsIFsxLDAsMSwwLDEsMV0pKSwgbGlzdCgnQUNFRicpKQorCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoY291bnQoMTApLCA1KSksIFsxMCwgMTEsIDEyLCAxMywgMTRdKQorCisgICAgZGVmIHRlc3RfY3ljbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoY3ljbGUoJ0FCQ0QnKSwgMTIpKSwgbGlzdCgnQUJDREFCQ0RBQkNEJykpCisKKyAgICBkZWYgdGVzdF9kcm9wd2hpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChkcm9wd2hpbGUobGFtYmRhIHg6IHg8NSwgWzEsNCw2LDQsMV0pKSwgWzYsNCwxXSkKKworICAgIGRlZiB0ZXN0X2dyb3VwYnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2sgZm9yIGssIGcgaW4gZ3JvdXBieSgnQUFBQUJCQkNDREFBQkJCJyldLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QoJ0FCQ0RBQicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsobGlzdChnKSkgZm9yIGssIGcgaW4gZ3JvdXBieSgnQUFBQUJCQkNDRCcpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbbGlzdCgnQUFBQScpLCBsaXN0KCdCQkInKSwgbGlzdCgnQ0MnKSwgbGlzdCgnRCcpXSkKKworICAgIGRlZiB0ZXN0X2lmaWx0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyKGxhbWJkYSB4OiB4JTIsIHJhbmdlKDEwKSkpLCBbMSwzLDUsNyw5XSkKKworICAgIGRlZiB0ZXN0X2lmaWx0ZXJmYWxzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlmaWx0ZXJmYWxzZShsYW1iZGEgeDogeCUyLCByYW5nZSgxMCkpKSwgWzAsMiw0LDYsOF0pCisKKyAgICBkZWYgdGVzdF9pbWFwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaW1hcChwb3csICgyLDMsMTApLCAoNSwyLDMpKSksIFszMiwgOSwgMTAwMF0pCisKKyAgICBkZWYgdGVzdF9pc2xpY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoJ0FCQ0RFRkcnLCAyKSksIGxpc3QoJ0FCJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoJ0FCQ0RFRkcnLCAyLCA0KSksIGxpc3QoJ0NEJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoJ0FCQ0RFRkcnLCAyLCBOb25lKSksIGxpc3QoJ0NERUZHJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpc2xpY2UoJ0FCQ0RFRkcnLCAwLCBOb25lLCAyKSksIGxpc3QoJ0FDRUcnKSkKKworICAgIGRlZiB0ZXN0X2l6aXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwKCdBQkNEJywgJ3h5JykpLCBbKCdBJywgJ3gnKSwgKCdCJywgJ3knKV0pCisKKyAgICBkZWYgdGVzdF9pemlwX2xvbmdlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwX2xvbmdlc3QoJ0FCQ0QnLCAneHknLCBmaWxsdmFsdWU9Jy0nKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygnQScsICd4JyksICgnQicsICd5JyksICgnQycsICctJyksICgnRCcsICctJyldKQorCisgICAgZGVmIHRlc3RfcGVybXV0YXRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGVybXV0YXRpb25zKCdBQkNEJywgMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCh0dXBsZSwgJ0FCIEFDIEFEIEJBIEJDIEJEIENBIENCIENEIERBIERCIERDJy5zcGxpdCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHBlcm11dGF0aW9ucyhyYW5nZSgzKSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoMCwxLDIpLCAoMCwyLDEpLCAoMSwwLDIpLCAoMSwyLDApLCAoMiwwLDEpLCAoMiwxLDApXSkKKworICAgIGRlZiB0ZXN0X3Byb2R1Y3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwcm9kdWN0KCdBQkNEJywgJ3h5JykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCh0dXBsZSwgJ0F4IEF5IEJ4IEJ5IEN4IEN5IER4IER5Jy5zcGxpdCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHByb2R1Y3QocmFuZ2UoMiksIHJlcGVhdD0zKSksCisgICAgICAgICAgICAgICAgICAgICAgICBbKDAsMCwwKSwgKDAsMCwxKSwgKDAsMSwwKSwgKDAsMSwxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSwwLDApLCAoMSwwLDEpLCAoMSwxLDApLCAoMSwxLDEpXSkKKworICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJlcGVhdCgxMCwgMykpLCBbMTAsIDEwLCAxMF0pCisKKyAgICBkZWYgdGVzdF9zdGFwbWFwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3Rhcm1hcChwb3csIFsoMiw1KSwgKDMsMiksICgxMCwzKV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbMzIsIDksIDEwMDBdKQorCisgICAgZGVmIHRlc3RfdGFrZXdoaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QodGFrZXdoaWxlKGxhbWJkYSB4OiB4PDUsIFsxLDQsNiw0LDFdKSksIFsxLDRdKQorCisKK2NsYXNzIFRlc3RHQyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgbWFrZWN5Y2xlKHNlbGYsIGl0ZXJhdG9yLCBjb250YWluZXIpOgorICAgICAgICBjb250YWluZXIuYXBwZW5kKGl0ZXJhdG9yKQorICAgICAgICBpdGVyYXRvci5uZXh0KCkKKyAgICAgICAgZGVsIGNvbnRhaW5lciwgaXRlcmF0b3IKKworICAgIGRlZiB0ZXN0X2NoYWluKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoY2hhaW4oYSksIGEpCisKKyAgICBkZWYgdGVzdF9jaGFpbl9mcm9tX2l0ZXJhYmxlKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoY2hhaW4uZnJvbV9pdGVyYWJsZShbYV0pLCBhKQorCisgICAgZGVmIHRlc3RfY29tYmluYXRpb25zKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoY29tYmluYXRpb25zKFsxLDIsYSwzXSwgMyksIGEpCisKKyAgICBkZWYgdGVzdF9jb21iaW5hdGlvbnNfd2l0aF9yZXBsYWNlbWVudChzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKGNvbWJpbmF0aW9uc193aXRoX3JlcGxhY2VtZW50KFsxLDIsYSwzXSwgMyksIGEpCisKKyAgICBkZWYgdGVzdF9jb21wcmVzcyhzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKGNvbXByZXNzKCdBQkNERUYnLCBbMSwwLDEsMCwxLDBdKSwgYSkKKworICAgIGRlZiB0ZXN0X2NvdW50KHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgSW50ID0gdHlwZSgnSW50JywgKGludCwpLCBkaWN0KHg9YSkpCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKGNvdW50KEludCgwKSwgSW50KDEpKSwgYSkKKworICAgIGRlZiB0ZXN0X2N5Y2xlKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoY3ljbGUoW2FdKjIpLCBhKQorCisgICAgZGVmIHRlc3RfZHJvcHdoaWxlKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoZHJvcHdoaWxlKGJvb2wsIFswLCBhLCBhXSksIGEpCisKKyAgICBkZWYgdGVzdF9ncm91cGJ5KHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoZ3JvdXBieShbYV0qMiwgbGFtYmRhIHg6eCksIGEpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTIyNDYoc2VsZik6CisgICAgICAgICMgSXNzdWUgMjI0NiAtLSB0aGUgX2dyb3VwZXIgaXRlcmF0b3Igd2FzIG5vdCBpbmNsdWRlZCBpbiBHQworICAgICAgICBuID0gMTAKKyAgICAgICAga2V5ZnVuYyA9IGxhbWJkYSB4OiB4CisgICAgICAgIGZvciBpLCBqIGluIGdyb3VwYnkoeHJhbmdlKG4pLCBrZXk9a2V5ZnVuYyk6CisgICAgICAgICAgICBrZXlmdW5jLl9fZGljdF9fLnNldGRlZmF1bHQoJ3gnLFtdKS5hcHBlbmQoaikKKworICAgIGRlZiB0ZXN0X2lmaWx0ZXIoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShpZmlsdGVyKGxhbWJkYSB4OlRydWUsIFthXSoyKSwgYSkKKworICAgIGRlZiB0ZXN0X2lmaWx0ZXJmYWxzZShzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKGlmaWx0ZXJmYWxzZShsYW1iZGEgeDpGYWxzZSwgYSksIGEpCisKKyAgICBkZWYgdGVzdF9pemlwKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoaXppcChbYV0qMiwgW2FdKjMpLCBhKQorCisgICAgZGVmIHRlc3RfaXppcF9sb25nZXN0KHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoaXppcF9sb25nZXN0KFthXSoyLCBbYV0qMyksIGEpCisgICAgICAgIGIgPSBbYSwgTm9uZV0KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoaXppcF9sb25nZXN0KFthXSoyLCBbYV0qMywgZmlsbHZhbHVlPWIpLCBhKQorCisgICAgZGVmIHRlc3RfaW1hcChzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKGltYXAobGFtYmRhIHg6eCwgW2FdKjIpLCBhKQorCisgICAgZGVmIHRlc3RfaXNsaWNlKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoaXNsaWNlKFthXSoyLCBOb25lKSwgYSkKKworICAgIGRlZiB0ZXN0X3Blcm11dGF0aW9ucyhzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKHBlcm11dGF0aW9ucyhbMSwyLGEsM10sIDMpLCBhKQorCisgICAgZGVmIHRlc3RfcHJvZHVjdChzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIHNlbGYubWFrZWN5Y2xlKHByb2R1Y3QoWzEsMixhLDNdLCByZXBlYXQ9MyksIGEpCisKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZShyZXBlYXQoYSksIGEpCisKKyAgICBkZWYgdGVzdF9zdGFybWFwKHNlbGYpOgorICAgICAgICBhID0gW10KKyAgICAgICAgc2VsZi5tYWtlY3ljbGUoc3Rhcm1hcChsYW1iZGEgKnQ6IHQsIFsoYSxhKV0qMiksIGEpCisKKyAgICBkZWYgdGVzdF90YWtld2hpbGUoc2VsZik6CisgICAgICAgIGEgPSBbXQorICAgICAgICBzZWxmLm1ha2VjeWNsZSh0YWtld2hpbGUoYm9vbCwgWzEsIDAsIGEsIGFdKSwgYSkKKworZGVmIFIoc2Vxbik6CisgICAgJ1JlZ3VsYXIgZ2VuZXJhdG9yJworICAgIGZvciBpIGluIHNlcW46CisgICAgICAgIHlpZWxkIGkKKworY2xhc3MgRzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgX19nZXRpdGVtX18nCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5zZXFuW2ldCisKK2NsYXNzIEk6CisgICAgJ1NlcXVlbmNlIHVzaW5nIGl0ZXJhdG9yIHByb3RvY29sJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmkgPj0gbGVuKHNlbGYuc2Vxbik6IHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgdiA9IHNlbGYuc2VxbltzZWxmLmldCisgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgIHJldHVybiB2CisKK2NsYXNzIElnOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCBkZWZpbmVkIHdpdGggYSBnZW5lcmF0b3InCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIGZvciB2YWwgaW4gc2VsZi5zZXFuOgorICAgICAgICAgICAgeWllbGQgdmFsCisKK2NsYXNzIFg6CisgICAgJ01pc3NpbmcgX19nZXRpdGVtX18gYW5kIF9faXRlcl9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaSA+PSBsZW4oc2VsZi5zZXFuKTogcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICB2ID0gc2VsZi5zZXFuW3NlbGYuaV0KKyAgICAgICAgc2VsZi5pICs9IDEKKyAgICAgICAgcmV0dXJuIHYKKworY2xhc3MgTjoKKyAgICAnSXRlcmF0b3IgbWlzc2luZyBuZXh0KCknCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKK2NsYXNzIEU6CisgICAgJ1Rlc3QgcHJvcGFnYXRpb24gb2YgZXhjZXB0aW9ucycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgMyAvLyAwCisKK2NsYXNzIFM6CisgICAgJ1Rlc3QgaW1tZWRpYXRlIHN0b3AnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBwYXNzCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKK2RlZiBMKHNlcW4pOgorICAgICdUZXN0IG11bHRpcGxlIHRpZXJzIG9mIGl0ZXJhdG9ycycKKyAgICByZXR1cm4gY2hhaW4oaW1hcChsYW1iZGEgeDp4LCBSKElnKEcoc2VxbikpKSkpCisKKworY2xhc3MgVGVzdFZhcmlvdXNJdGVyYXRvckFyZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY2hhaW4oc2VsZik6CisgICAgICAgIGZvciBzIGluICgiMTIzIiwgIiIsIHJhbmdlKDEwMDApLCAoJ2RvJywgMS4yKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChjaGFpbihnKHMpKSksIGxpc3QoZyhzKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNoYWluKGcocyksIGcocykpKSwgbGlzdChnKHMpKStsaXN0KGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBjaGFpbihYKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgY2hhaW4oTihzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgY2hhaW4oRShzKSkpCisKKyAgICBkZWYgdGVzdF9jb21wcmVzcyhzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIG4gPSBsZW4ocykKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGNvbXByZXNzKGcocyksIHJlcGVhdCgxKSkpLCBsaXN0KGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb21wcmVzcywgWChzKSwgcmVwZWF0KDEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBjb21wcmVzcyhOKHMpLCByZXBlYXQoMSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIGNvbXByZXNzKEUocyksIHJlcGVhdCgxKSkpCisKKyAgICBkZWYgdGVzdF9wcm9kdWN0KHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm9kdWN0LCBYKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm9kdWN0LCBOKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIHByb2R1Y3QsIEUocykpCisKKyAgICBkZWYgdGVzdF9jeWNsZShzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgdGd0bGVuID0gbGVuKHMpICogMworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbGlzdChnKHMpKSozCisgICAgICAgICAgICAgICAgYWN0dWFsID0gbGlzdChpc2xpY2UoY3ljbGUoZyhzKSksIHRndGxlbikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjeWNsZSwgWChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgY3ljbGUoTihzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgY3ljbGUoRShzKSkpCisKKyAgICBkZWYgdGVzdF9ncm91cGJ5KHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAocmFuZ2UoMTApLCByYW5nZSgwKSwgcmFuZ2UoMTAwMCksICg3LDExKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2sgZm9yIGssIHNiIGluIGdyb3VwYnkoZyhzKSldLCBsaXN0KGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBncm91cGJ5LCBYKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBncm91cGJ5KE4ocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIGdyb3VwYnkoRShzKSkpCisKKyAgICBkZWYgdGVzdF9pZmlsdGVyKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAocmFuZ2UoMTApLCByYW5nZSgwKSwgcmFuZ2UoMTAwMCksICg3LDExKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyKGlzRXZlbiwgZyhzKSkpLCBmaWx0ZXIoaXNFdmVuLCBnKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaWZpbHRlciwgaXNFdmVuLCBYKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBpZmlsdGVyKGlzRXZlbiwgTihzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgaWZpbHRlcihpc0V2ZW4sIEUocykpKQorCisgICAgZGVmIHRlc3RfaWZpbHRlcmZhbHNlKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAocmFuZ2UoMTApLCByYW5nZSgwKSwgcmFuZ2UoMTAwMCksICg3LDExKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpZmlsdGVyZmFsc2UoaXNFdmVuLCBnKHMpKSksIGZpbHRlcihpc09kZCwgZyhzKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlmaWx0ZXJmYWxzZSwgaXNFdmVuLCBYKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBpZmlsdGVyZmFsc2UoaXNFdmVuLCBOKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBpZmlsdGVyZmFsc2UoaXNFdmVuLCBFKHMpKSkKKworICAgIGRlZiB0ZXN0X2l6aXAoc2VsZik6CisgICAgICAgIGZvciBzIGluICgiMTIzIiwgIiIsIHJhbmdlKDEwMDApLCAoJ2RvJywgMS4yKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwKGcocykpKSwgemlwKGcocykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpemlwKGcocyksIGcocykpKSwgemlwKGcocyksIGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpemlwLCBYKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsaXN0LCBpemlwKE4ocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIGl6aXAoRShzKSkpCisKKyAgICBkZWYgdGVzdF9pemlwbG9uZ2VzdChzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGl6aXBfbG9uZ2VzdChnKHMpKSksIHppcChnKHMpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXppcF9sb25nZXN0KGcocyksIGcocykpKSwgemlwKGcocyksIGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpemlwX2xvbmdlc3QsIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGl6aXBfbG9uZ2VzdChOKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBpemlwX2xvbmdlc3QoRShzKSkpCisKKyAgICBkZWYgdGVzdF9pbWFwKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAocmFuZ2UoMTApLCByYW5nZSgwKSwgcmFuZ2UoMTAwKSwgKDcsMTEpLCB4cmFuZ2UoMjAsNTAsNSkpOgorICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBTLCBMLCBSKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaW1hcChvbmVhcmcsIGcocykpKSwgbWFwKG9uZWFyZywgZyhzKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGltYXAob3BlcmF0b3IucG93LCBnKHMpLCBnKHMpKSksIG1hcChvcGVyYXRvci5wb3csIGcocyksIGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbWFwLCBvbmVhcmcsIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGltYXAob25lYXJnLCBOKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBpbWFwKG9uZWFyZywgRShzKSkpCisKKyAgICBkZWYgdGVzdF9pc2xpY2Uoc2VsZik6CisgICAgICAgIGZvciBzIGluICgiMTIzNDUiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgUywgTCwgUik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGlzbGljZShnKHMpLDEsTm9uZSwyKSksIGxpc3QoZyhzKSlbMTo6Ml0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGlzbGljZSwgWChzKSwgMTApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIGlzbGljZShOKHMpLCAxMCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgbGlzdCwgaXNsaWNlKEUocyksIDEwKSkKKworICAgIGRlZiB0ZXN0X3N0YXJtYXAoc2VsZik6CisgICAgICAgIGZvciBzIGluIChyYW5nZSgxMCksIHJhbmdlKDApLCByYW5nZSgxMDApLCAoNywxMSksIHhyYW5nZSgyMCw1MCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHNzID0gemlwKHMsIHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN0YXJtYXAob3BlcmF0b3IucG93LCBnKHNzKSkpLCBtYXAob3BlcmF0b3IucG93LCBnKHMpLCBnKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3Rhcm1hcCwgb3BlcmF0b3IucG93LCBYKHNzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgc3Rhcm1hcChvcGVyYXRvci5wb3csIE4oc3MpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBzdGFybWFwKG9wZXJhdG9yLnBvdywgRShzcykpKQorCisgICAgZGVmIHRlc3RfdGFrZXdoaWxlKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAocmFuZ2UoMTApLCByYW5nZSgwKSwgcmFuZ2UoMTAwMCksICg3LDExKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHRndCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gZyhzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGlzRXZlbihlbGVtKTogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgdGd0LmFwcGVuZChlbGVtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh0YWtld2hpbGUoaXNFdmVuLCBnKHMpKSksIHRndCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdGFrZXdoaWxlLCBpc0V2ZW4sIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIHRha2V3aGlsZShpc0V2ZW4sIE4ocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGxpc3QsIHRha2V3aGlsZShpc0V2ZW4sIEUocykpKQorCisgICAgZGVmIHRlc3RfZHJvcHdoaWxlKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAocmFuZ2UoMTApLCByYW5nZSgwKSwgcmFuZ2UoMTAwMCksICg3LDExKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSk6CisgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgIHRndCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGVsZW0gaW4gZyhzKToKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHRndCBhbmQgaXNPZGQoZWxlbSk6IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIHRndC5hcHBlbmQoZWxlbSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoZHJvcHdoaWxlKGlzT2RkLCBnKHMpKSksIHRndCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZHJvcHdoaWxlLCBpc09kZCwgWChzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGlzdCwgZHJvcHdoaWxlKGlzT2RkLCBOKHMpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCBkcm9wd2hpbGUoaXNPZGQsIEUocykpKQorCisgICAgZGVmIHRlc3RfdGVlKHNlbGYpOgorICAgICAgICBmb3IgcyBpbiAoIjEyMyIsICIiLCByYW5nZSgxMDAwKSwgKCdkbycsIDEuMiksIHhyYW5nZSgyMDAwLDIyMDAsNSkpOgorICAgICAgICAgICAgZm9yIGcgaW4gKEcsIEksIElnLCBTLCBMLCBSKToKKyAgICAgICAgICAgICAgICBpdDEsIGl0MiA9IHRlZShnKHMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdDEpLCBsaXN0KGcocykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdDIpLCBsaXN0KGcocykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0ZWUsIFgocykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxpc3QsIHRlZShOKHMpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBsaXN0LCB0ZWUoRShzKSlbMF0pCisKK2NsYXNzIExlbmd0aFRyYW5zcGFyZW5jeSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CisgICAgICAgIGZyb20gdGVzdC50ZXN0X2l0ZXJsZW4gaW1wb3J0IGxlbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXBlYXQoTm9uZSwgNTApKSwgNTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCByZXBlYXQoTm9uZSkpCisKK2NsYXNzIFJlZ3Jlc3Npb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zZl83OTM4MjYoc2VsZik6CisgICAgICAgICMgRml4IEFybWluIFJpZ28ncyBzdWNjZXNzZnVsIGVmZm9ydHMgdG8gd3JlYWsgaGF2b2MKKworICAgICAgICBkZWYgbXV0YXRpbmd0dXBsZSh0dXBsZTEsIGYsIHR1cGxlMik6CisgICAgICAgICAgICAjIHRoaXMgYnVpbGRzIGEgdHVwbGUgdCB3aGljaCBpcyBhIGNvcHkgb2YgdHVwbGUxLAorICAgICAgICAgICAgIyB0aGVuIGNhbGxzIGYodCksIHRoZW4gbXV0YXRlcyB0IHRvIGJlIGVxdWFsIHRvIHR1cGxlMgorICAgICAgICAgICAgIyAobmVlZHMgbGVuKHR1cGxlMSkgPT0gbGVuKHR1cGxlMikpLgorICAgICAgICAgICAgZGVmIGcodmFsdWUsIGZpcnN0PVsxXSk6CisgICAgICAgICAgICAgICAgaWYgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgIGRlbCBmaXJzdFs6XQorICAgICAgICAgICAgICAgICAgICBmKHoubmV4dCgpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICAgICAgaXRlbXMgPSBsaXN0KHR1cGxlMikKKyAgICAgICAgICAgIGl0ZW1zWzE6MV0gPSBsaXN0KHR1cGxlMSkKKyAgICAgICAgICAgIGdlbiA9IGltYXAoZywgaXRlbXMpCisgICAgICAgICAgICB6ID0gaXppcCgqW2dlbl0qbGVuKHR1cGxlMSkpCisgICAgICAgICAgICB6Lm5leHQoKQorCisgICAgICAgIGRlZiBmKHQpOgorICAgICAgICAgICAgZ2xvYmFsIFQKKyAgICAgICAgICAgIFQgPSB0CisgICAgICAgICAgICBmaXJzdFs6XSA9IGxpc3QoVCkKKworICAgICAgICBmaXJzdCA9IFtdCisgICAgICAgIG11dGF0aW5ndHVwbGUoKDEsMiwzKSwgZiwgKDQsNSw2KSkKKyAgICAgICAgc2Vjb25kID0gbGlzdChUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0LCBzZWNvbmQpCisKKworICAgIGRlZiB0ZXN0X3NmXzk1MDA1NyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBjaGFpbigpIGFuZCBjeWNsZSgpIGNhdGNoIGV4Y2VwdGlvbnMgaW1tZWRpYXRlbHkKKyAgICAgICAgIyByYXRoZXIgdGhhbiB3aGVuIHNoaWZ0aW5nIGJldHdlZW4gaW5wdXQgc291cmNlcworCisgICAgICAgIGRlZiBnZW4xKCk6CisgICAgICAgICAgICBoaXN0LmFwcGVuZCgwKQorICAgICAgICAgICAgeWllbGQgMQorICAgICAgICAgICAgaGlzdC5hcHBlbmQoMSkKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgICAgICAgICBoaXN0LmFwcGVuZCgyKQorCisgICAgICAgIGRlZiBnZW4yKHgpOgorICAgICAgICAgICAgaGlzdC5hcHBlbmQoMykKKyAgICAgICAgICAgIHlpZWxkIDIKKyAgICAgICAgICAgIGhpc3QuYXBwZW5kKDQpCisgICAgICAgICAgICBpZiB4OgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICBoaXN0ID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIGxpc3QsIGNoYWluKGdlbjEoKSwgZ2VuMihGYWxzZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhpc3QsIFswLDFdKQorCisgICAgICAgIGhpc3QgPSBbXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgbGlzdCwgY2hhaW4oZ2VuMSgpLCBnZW4yKFRydWUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoaXN0LCBbMCwxXSkKKworICAgICAgICBoaXN0ID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IsIGxpc3QsIGN5Y2xlKGdlbjEoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGlzdCwgWzAsMV0pCisKK2NsYXNzIFN1YmNsYXNzV2l0aEt3YXJnc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2tleXdvcmRzX2luX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICAjIGNvdW50IGlzIG5vdCBzdWJjbGFzc2FibGUuLi4KKyAgICAgICAgZm9yIGNscyBpbiAocmVwZWF0LCBpemlwLCBpZmlsdGVyLCBpZmlsdGVyZmFsc2UsIGNoYWluLCBpbWFwLAorICAgICAgICAgICAgICAgICAgICBzdGFybWFwLCBpc2xpY2UsIHRha2V3aGlsZSwgZHJvcHdoaWxlLCBjeWNsZSwgY29tcHJlc3MpOgorICAgICAgICAgICAgY2xhc3MgU3ViY2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmV3YXJnPU5vbmUsICphcmdzKToKKyAgICAgICAgICAgICAgICAgICAgY2xzLl9faW5pdF9fKHNlbGYsICphcmdzKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIFN1YmNsYXNzKG5ld2FyZz0xKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgorICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHR5cGUgZXJyb3JzIGJlY2F1c2Ugb2Ygd3JvbmcgYXJndW1lbnQgY291bnQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJkb2VzIG5vdCB0YWtlIGtleXdvcmQgYXJndW1lbnRzIiwgZXJyLmFyZ3NbMF0pCisKKworbGlicmVmdGVzdCA9ICIiIiBEb2N0ZXN0IGZvciBleGFtcGxlcyBpbiB0aGUgbGlicmFyeSByZWZlcmVuY2U6IGxpYml0ZXJ0b29scy50ZXgKKworCis+Pj4gYW1vdW50cyA9IFsxMjAuMTUsIDc2NC4wNSwgODIzLjE0XQorPj4+IGZvciBjaGVja251bSwgYW1vdW50IGluIGl6aXAoY291bnQoMTIwMCksIGFtb3VudHMpOgorLi4uICAgICBwcmludCAnQ2hlY2sgJWQgaXMgZm9yICQlLjJmJyAlIChjaGVja251bSwgYW1vdW50KQorLi4uCitDaGVjayAxMjAwIGlzIGZvciAkMTIwLjE1CitDaGVjayAxMjAxIGlzIGZvciAkNzY0LjA1CitDaGVjayAxMjAyIGlzIGZvciAkODIzLjE0CisKKz4+PiBpbXBvcnQgb3BlcmF0b3IKKz4+PiBmb3IgY3ViZSBpbiBpbWFwKG9wZXJhdG9yLnBvdywgeHJhbmdlKDEsNCksIHJlcGVhdCgzKSk6CisuLi4gICAgcHJpbnQgY3ViZQorLi4uCisxCis4CisyNworCis+Pj4gcmVwb3J0bGluZXMgPSBbJ0V1cm9QeXRob24nLCAnUm9zdGVyJywgJycsICdhbGV4JywgJycsICdsYXVyYScsICcnLCAnbWFydGluJywgJycsICd3YWx0ZXInLCAnJywgJ3NhbXVlbGUnXQorPj4+IGZvciBuYW1lIGluIGlzbGljZShyZXBvcnRsaW5lcywgMywgTm9uZSwgMik6CisuLi4gICAgcHJpbnQgbmFtZS50aXRsZSgpCisuLi4KK0FsZXgKK0xhdXJhCitNYXJ0aW4KK1dhbHRlcgorU2FtdWVsZQorCis+Pj4gZnJvbSBvcGVyYXRvciBpbXBvcnQgaXRlbWdldHRlcgorPj4+IGQgPSBkaWN0KGE9MSwgYj0yLCBjPTEsIGQ9MiwgZT0xLCBmPTIsIGc9MykKKz4+PiBkaSA9IHNvcnRlZChzb3J0ZWQoZC5pdGVyaXRlbXMoKSksIGtleT1pdGVtZ2V0dGVyKDEpKQorPj4+IGZvciBrLCBnIGluIGdyb3VwYnkoZGksIGl0ZW1nZXR0ZXIoMSkpOgorLi4uICAgICBwcmludCBrLCBtYXAoaXRlbWdldHRlcigwKSwgZykKKy4uLgorMSBbJ2EnLCAnYycsICdlJ10KKzIgWydiJywgJ2QnLCAnZiddCiszIFsnZyddCisKKyMgRmluZCBydW5zIG9mIGNvbnNlY3V0aXZlIG51bWJlcnMgdXNpbmcgZ3JvdXBieS4gIFRoZSBrZXkgdG8gdGhlIHNvbHV0aW9uCisjIGlzIGRpZmZlcmVuY2luZyB3aXRoIGEgcmFuZ2Ugc28gdGhhdCBjb25zZWN1dGl2ZSBudW1iZXJzIGFsbCBhcHBlYXIgaW4KKyMgc2FtZSBncm91cC4KKz4+PiBkYXRhID0gWyAxLCAgNCw1LDYsIDEwLCAxNSwxNiwxNywxOCwgMjIsIDI1LDI2LDI3LDI4XQorPj4+IGZvciBrLCBnIGluIGdyb3VwYnkoZW51bWVyYXRlKGRhdGEpLCBsYW1iZGEgdDp0WzBdLXRbMV0pOgorLi4uICAgICBwcmludCBtYXAob3BlcmF0b3IuaXRlbWdldHRlcigxKSwgZykKKy4uLgorWzFdCitbNCwgNSwgNl0KK1sxMF0KK1sxNSwgMTYsIDE3LCAxOF0KK1syMl0KK1syNSwgMjYsIDI3LCAyOF0KKworPj4+IGRlZiB0YWtlKG4sIGl0ZXJhYmxlKToKKy4uLiAgICAgIlJldHVybiBmaXJzdCBuIGl0ZW1zIG9mIHRoZSBpdGVyYWJsZSBhcyBhIGxpc3QiCisuLi4gICAgIHJldHVybiBsaXN0KGlzbGljZShpdGVyYWJsZSwgbikpCisKKz4+PiBkZWYgZW51bWVyYXRlKGl0ZXJhYmxlLCBzdGFydD0wKToKKy4uLiAgICAgcmV0dXJuIGl6aXAoY291bnQoc3RhcnQpLCBpdGVyYWJsZSkKKworPj4+IGRlZiB0YWJ1bGF0ZShmdW5jdGlvbiwgc3RhcnQ9MCk6CisuLi4gICAgICJSZXR1cm4gZnVuY3Rpb24oMCksIGZ1bmN0aW9uKDEpLCAuLi4iCisuLi4gICAgIHJldHVybiBpbWFwKGZ1bmN0aW9uLCBjb3VudChzdGFydCkpCisKKz4+PiBkZWYgbnRoKGl0ZXJhYmxlLCBuLCBkZWZhdWx0PU5vbmUpOgorLi4uICAgICAiUmV0dXJucyB0aGUgbnRoIGl0ZW0gb3IgYSBkZWZhdWx0IHZhbHVlIgorLi4uICAgICByZXR1cm4gbmV4dChpc2xpY2UoaXRlcmFibGUsIG4sIE5vbmUpLCBkZWZhdWx0KQorCis+Pj4gZGVmIHF1YW50aWZ5KGl0ZXJhYmxlLCBwcmVkPWJvb2wpOgorLi4uICAgICAiQ291bnQgaG93IG1hbnkgdGltZXMgdGhlIHByZWRpY2F0ZSBpcyB0cnVlIgorLi4uICAgICByZXR1cm4gc3VtKGltYXAocHJlZCwgaXRlcmFibGUpKQorCis+Pj4gZGVmIHBhZG5vbmUoaXRlcmFibGUpOgorLi4uICAgICAiUmV0dXJucyB0aGUgc2VxdWVuY2UgZWxlbWVudHMgYW5kIHRoZW4gcmV0dXJucyBOb25lIGluZGVmaW5pdGVseSIKKy4uLiAgICAgcmV0dXJuIGNoYWluKGl0ZXJhYmxlLCByZXBlYXQoTm9uZSkpCisKKz4+PiBkZWYgbmN5Y2xlcyhpdGVyYWJsZSwgbik6CisuLi4gICAgICJSZXR1cm5zIHRoZSBzZXF1ZW5jZSBlbGVtZW50cyBuIHRpbWVzIgorLi4uICAgICByZXR1cm4gY2hhaW4oKnJlcGVhdChpdGVyYWJsZSwgbikpCisKKz4+PiBkZWYgZG90cHJvZHVjdCh2ZWMxLCB2ZWMyKToKKy4uLiAgICAgcmV0dXJuIHN1bShpbWFwKG9wZXJhdG9yLm11bCwgdmVjMSwgdmVjMikpCisKKz4+PiBkZWYgZmxhdHRlbihsaXN0T2ZMaXN0cyk6CisuLi4gICAgIHJldHVybiBsaXN0KGNoYWluLmZyb21faXRlcmFibGUobGlzdE9mTGlzdHMpKQorCis+Pj4gZGVmIHJlcGVhdGZ1bmMoZnVuYywgdGltZXM9Tm9uZSwgKmFyZ3MpOgorLi4uICAgICAiUmVwZWF0IGNhbGxzIHRvIGZ1bmMgd2l0aCBzcGVjaWZpZWQgYXJndW1lbnRzLiIKKy4uLiAgICAgIiAgIEV4YW1wbGU6ICByZXBlYXRmdW5jKHJhbmRvbS5yYW5kb20pIgorLi4uICAgICBpZiB0aW1lcyBpcyBOb25lOgorLi4uICAgICAgICAgcmV0dXJuIHN0YXJtYXAoZnVuYywgcmVwZWF0KGFyZ3MpKQorLi4uICAgICBlbHNlOgorLi4uICAgICAgICAgcmV0dXJuIHN0YXJtYXAoZnVuYywgcmVwZWF0KGFyZ3MsIHRpbWVzKSkKKworPj4+IGRlZiBwYWlyd2lzZShpdGVyYWJsZSk6CisuLi4gICAgICJzIC0+IChzMCxzMSksIChzMSxzMiksIChzMiwgczMpLCAuLi4iCisuLi4gICAgIGEsIGIgPSB0ZWUoaXRlcmFibGUpCisuLi4gICAgIGZvciBlbGVtIGluIGI6CisuLi4gICAgICAgICBicmVhaworLi4uICAgICByZXR1cm4gaXppcChhLCBiKQorCis+Pj4gZGVmIGdyb3VwZXIobiwgaXRlcmFibGUsIGZpbGx2YWx1ZT1Ob25lKToKKy4uLiAgICAgImdyb3VwZXIoMywgJ0FCQ0RFRkcnLCAneCcpIC0tPiBBQkMgREVGIEd4eCIKKy4uLiAgICAgYXJncyA9IFtpdGVyKGl0ZXJhYmxlKV0gKiBuCisuLi4gICAgIHJldHVybiBpemlwX2xvbmdlc3QoZmlsbHZhbHVlPWZpbGx2YWx1ZSwgKmFyZ3MpCisKKz4+PiBkZWYgcm91bmRyb2JpbigqaXRlcmFibGVzKToKKy4uLiAgICAgInJvdW5kcm9iaW4oJ0FCQycsICdEJywgJ0VGJykgLS0+IEEgRCBFIEIgRiBDIgorLi4uICAgICAjIFJlY2lwZSBjcmVkaXRlZCB0byBHZW9yZ2UgU2Fra2lzCisuLi4gICAgIHBlbmRpbmcgPSBsZW4oaXRlcmFibGVzKQorLi4uICAgICBuZXh0cyA9IGN5Y2xlKGl0ZXIoaXQpLm5leHQgZm9yIGl0IGluIGl0ZXJhYmxlcykKKy4uLiAgICAgd2hpbGUgcGVuZGluZzoKKy4uLiAgICAgICAgIHRyeToKKy4uLiAgICAgICAgICAgICBmb3IgbmV4dCBpbiBuZXh0czoKKy4uLiAgICAgICAgICAgICAgICAgeWllbGQgbmV4dCgpCisuLi4gICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKy4uLiAgICAgICAgICAgICBwZW5kaW5nIC09IDEKKy4uLiAgICAgICAgICAgICBuZXh0cyA9IGN5Y2xlKGlzbGljZShuZXh0cywgcGVuZGluZykpCisKKz4+PiBkZWYgcG93ZXJzZXQoaXRlcmFibGUpOgorLi4uICAgICAicG93ZXJzZXQoWzEsMiwzXSkgLS0+ICgpICgxLCkgKDIsKSAoMywpICgxLDIpICgxLDMpICgyLDMpICgxLDIsMykiCisuLi4gICAgIHMgPSBsaXN0KGl0ZXJhYmxlKQorLi4uICAgICByZXR1cm4gY2hhaW4uZnJvbV9pdGVyYWJsZShjb21iaW5hdGlvbnMocywgcikgZm9yIHIgaW4gcmFuZ2UobGVuKHMpKzEpKQorCis+Pj4gZGVmIHVuaXF1ZV9ldmVyc2VlbihpdGVyYWJsZSwga2V5PU5vbmUpOgorLi4uICAgICAiTGlzdCB1bmlxdWUgZWxlbWVudHMsIHByZXNlcnZpbmcgb3JkZXIuIFJlbWVtYmVyIGFsbCBlbGVtZW50cyBldmVyIHNlZW4uIgorLi4uICAgICAjIHVuaXF1ZV9ldmVyc2VlbignQUFBQUJCQkNDREFBQkJCJykgLS0+IEEgQiBDIEQKKy4uLiAgICAgIyB1bmlxdWVfZXZlcnNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBECisuLi4gICAgIHNlZW4gPSBzZXQoKQorLi4uICAgICBzZWVuX2FkZCA9IHNlZW4uYWRkCisuLi4gICAgIGlmIGtleSBpcyBOb25lOgorLi4uICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CisuLi4gICAgICAgICAgICAgaWYgZWxlbWVudCBub3QgaW4gc2VlbjoKKy4uLiAgICAgICAgICAgICAgICAgc2Vlbl9hZGQoZWxlbWVudCkKKy4uLiAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudAorLi4uICAgICBlbHNlOgorLi4uICAgICAgICAgZm9yIGVsZW1lbnQgaW4gaXRlcmFibGU6CisuLi4gICAgICAgICAgICAgayA9IGtleShlbGVtZW50KQorLi4uICAgICAgICAgICAgIGlmIGsgbm90IGluIHNlZW46CisuLi4gICAgICAgICAgICAgICAgIHNlZW5fYWRkKGspCisuLi4gICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQKKworPj4+IGRlZiB1bmlxdWVfanVzdHNlZW4oaXRlcmFibGUsIGtleT1Ob25lKToKKy4uLiAgICAgIkxpc3QgdW5pcXVlIGVsZW1lbnRzLCBwcmVzZXJ2aW5nIG9yZGVyLiBSZW1lbWJlciBvbmx5IHRoZSBlbGVtZW50IGp1c3Qgc2Vlbi4iCisuLi4gICAgICMgdW5pcXVlX2p1c3RzZWVuKCdBQUFBQkJCQ0NEQUFCQkInKSAtLT4gQSBCIEMgRCBBIEIKKy4uLiAgICAgIyB1bmlxdWVfanVzdHNlZW4oJ0FCQkNjQUQnLCBzdHIubG93ZXIpIC0tPiBBIEIgQyBBIEQKKy4uLiAgICAgcmV0dXJuIGltYXAobmV4dCwgaW1hcChpdGVtZ2V0dGVyKDEpLCBncm91cGJ5KGl0ZXJhYmxlLCBrZXkpKSkKKworVGhpcyBpcyBub3QgcGFydCBvZiB0aGUgZXhhbXBsZXMgYnV0IGl0IHRlc3RzIHRvIG1ha2Ugc3VyZSB0aGUgZGVmaW5pdGlvbnMKK3BlcmZvcm0gYXMgcHVycG9ydGVkLgorCis+Pj4gdGFrZSgxMCwgY291bnQoKSkKK1swLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorCis+Pj4gbGlzdChlbnVtZXJhdGUoJ2FiYycpKQorWygwLCAnYScpLCAoMSwgJ2InKSwgKDIsICdjJyldCisKKz4+PiBsaXN0KGlzbGljZSh0YWJ1bGF0ZShsYW1iZGEgeDogMip4KSwgNCkpCitbMCwgMiwgNCwgNl0KKworPj4+IG50aCgnYWJjZGUnLCAzKQorJ2QnCisKKz4+PiBudGgoJ2FiY2RlJywgOSkgaXMgTm9uZQorVHJ1ZQorCis+Pj4gcXVhbnRpZnkoeHJhbmdlKDk5KSwgbGFtYmRhIHg6IHglMj09MCkKKzUwCisKKz4+PiBhID0gW1sxLCAyLCAzXSwgWzQsIDUsIDZdXQorPj4+IGZsYXR0ZW4oYSkKK1sxLCAyLCAzLCA0LCA1LCA2XQorCis+Pj4gbGlzdChyZXBlYXRmdW5jKHBvdywgNSwgMiwgMykpCitbOCwgOCwgOCwgOCwgOF0KKworPj4+IGltcG9ydCByYW5kb20KKz4+PiB0YWtlKDUsIGltYXAoaW50LCByZXBlYXRmdW5jKHJhbmRvbS5yYW5kb20pKSkKK1swLCAwLCAwLCAwLCAwXQorCis+Pj4gbGlzdChwYWlyd2lzZSgnYWJjZCcpKQorWygnYScsICdiJyksICgnYicsICdjJyksICgnYycsICdkJyldCisKKz4+PiBsaXN0KHBhaXJ3aXNlKFtdKSkKK1tdCisKKz4+PiBsaXN0KHBhaXJ3aXNlKCdhJykpCitbXQorCis+Pj4gbGlzdChpc2xpY2UocGFkbm9uZSgnYWJjJyksIDAsIDYpKQorWydhJywgJ2InLCAnYycsIE5vbmUsIE5vbmUsIE5vbmVdCisKKz4+PiBsaXN0KG5jeWNsZXMoJ2FiYycsIDMpKQorWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddCisKKz4+PiBkb3Rwcm9kdWN0KFsxLDIsM10sIFs0LDUsNl0pCiszMgorCis+Pj4gbGlzdChncm91cGVyKDMsICdhYmNkZWZnJywgJ3gnKSkKK1soJ2EnLCAnYicsICdjJyksICgnZCcsICdlJywgJ2YnKSwgKCdnJywgJ3gnLCAneCcpXQorCis+Pj4gbGlzdChyb3VuZHJvYmluKCdhYmMnLCAnZCcsICdlZicpKQorWydhJywgJ2QnLCAnZScsICdiJywgJ2YnLCAnYyddCisKKz4+PiBsaXN0KHBvd2Vyc2V0KFsxLDIsM10pKQorWygpLCAoMSwpLCAoMiwpLCAoMywpLCAoMSwgMiksICgxLCAzKSwgKDIsIDMpLCAoMSwgMiwgMyldCisKKz4+PiBhbGwobGVuKGxpc3QocG93ZXJzZXQocmFuZ2UobikpKSkgPT0gMioqbiBmb3IgbiBpbiByYW5nZSgxOCkpCitUcnVlCisKKz4+PiBsaXN0KHBvd2Vyc2V0KCdhYmNkZScpKSA9PSBzb3J0ZWQoc29ydGVkKHNldChwb3dlcnNldCgnYWJjZGUnKSkpLCBrZXk9bGVuKQorVHJ1ZQorCis+Pj4gbGlzdCh1bmlxdWVfZXZlcnNlZW4oJ0FBQUFCQkJDQ0RBQUJCQicpKQorWydBJywgJ0InLCAnQycsICdEJ10KKworPj4+IGxpc3QodW5pcXVlX2V2ZXJzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSkKK1snQScsICdCJywgJ0MnLCAnRCddCisKKz4+PiBsaXN0KHVuaXF1ZV9qdXN0c2VlbignQUFBQUJCQkNDREFBQkJCJykpCitbJ0EnLCAnQicsICdDJywgJ0QnLCAnQScsICdCJ10KKworPj4+IGxpc3QodW5pcXVlX2p1c3RzZWVuKCdBQkJDY0FEJywgc3RyLmxvd2VyKSkKK1snQScsICdCJywgJ0MnLCAnQScsICdEJ10KKworIiIiCisKK19fdGVzdF9fID0geydsaWJyZWZ0ZXN0JyA6IGxpYnJlZnRlc3R9CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X2NsYXNzZXMgPSAoVGVzdEJhc2ljT3BzLCBUZXN0VmFyaW91c0l0ZXJhdG9yQXJncywgVGVzdEdDLAorICAgICAgICAgICAgICAgICAgICBSZWdyZXNzaW9uVGVzdHMsIExlbmd0aFRyYW5zcGFyZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgU3ViY2xhc3NXaXRoS3dhcmdzVGVzdCwgVGVzdEV4YW1wbGVzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCisgICAgIyBkb2N0ZXN0IHRoZSBleGFtcGxlcyBpbiB0aGUgbGlicmFyeSByZWZlcmVuY2UKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3Qoc3lzLm1vZHVsZXNbX19uYW1lX19dLCB2ZXJib3NlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVydG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQwNzJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9pdGVydG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTQwNzJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9qc29uLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjhmM2RlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weQpAQCAtMCwwICsxLDE3IEBACisiIiJUZXN0cyBmb3IganNvbi4KKworVGhlIHRlc3RzIGZvciBqc29uIGFyZSBkZWZpbmVkIGluIHRoZSBqc29uLnRlc3RzIHBhY2thZ2U7Cit0aGUgdGVzdF9zdWl0ZSgpIGZ1bmN0aW9uIHRoZXJlIHJldHVybnMgYSB0ZXN0IHN1aXRlIHRoYXQncyByZWFkeSB0bworYmUgcnVuLgorIiIiCisKK2ltcG9ydCBqc29uLnRlc3RzCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KGpzb24udGVzdHMudGVzdF9zdWl0ZSgpKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2pzb24ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwMjhkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2pzb24ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2pzb24ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfanNvbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwMjhkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2pzb24ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjhmZjJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfa3F1ZXVlLnB5CkBAIC0wLDAgKzEsMTg3IEBACisiIiIKK1Rlc3RzIGZvciBrcXVldWUgd3JhcHBlci4KKyIiIgoraW1wb3J0IHNvY2tldAoraW1wb3J0IGVycm5vCitpbXBvcnQgdGltZQoraW1wb3J0IHNlbGVjdAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpZiBub3QgaGFzYXR0cihzZWxlY3QsICJrcXVldWUiKToKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgidGVzdCB3b3JrcyBvbmx5IG9uIEJTRCIpCisKK2NsYXNzIFRlc3RLUXVldWUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2NyZWF0ZV9xdWV1ZShzZWxmKToKKyAgICAgICAga3EgPSBzZWxlY3Qua3F1ZXVlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtxLmZpbGVubygpID4gMCwga3EuZmlsZW5vKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qga3EuY2xvc2VkKQorICAgICAgICBrcS5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrcS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGtxLmZpbGVubykKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9ldmVudChzZWxmKToKKyAgICAgICAgZmQgPSBzeXMuc3RkZXJyLmZpbGVubygpCisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChmZCkKKyAgICAgICAgb3RoZXIgPSBzZWxlY3Qua2V2ZW50KDEwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuaWRlbnQsIGZkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZpbHRlciwgc2VsZWN0LktRX0ZJTFRFUl9SRUFEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZsYWdzLCBzZWxlY3QuS1FfRVZfQUREKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZmbGFncywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5kYXRhLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LnVkYXRhLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LCBldikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChldiwgb3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGV2LCBvdGhlciksIC0xKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXYgPCBvdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG90aGVyID49IGV2KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgZXYsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBldiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGV2LCAiZXYiKQorCisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChmZCwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5pZGVudCwgZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmlsdGVyLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZsYWdzLCBzZWxlY3QuS1FfRVZfQUREKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZmbGFncywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5kYXRhLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LnVkYXRhLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LCBldikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChldiwgb3RoZXIpCisKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGZkLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFLCBzZWxlY3QuS1FfRVZfT05FU0hPVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5pZGVudCwgZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZmlsdGVyLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZsYWdzLCBzZWxlY3QuS1FfRVZfT05FU0hPVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5mZmxhZ3MsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZGF0YSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi51ZGF0YSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldiwgZXYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXYsIG90aGVyKQorCisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudCgxLCAyLCAzLCA0LCA1LCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmlkZW50LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZpbHRlciwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5mbGFncywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5mZmxhZ3MsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZGF0YSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi51ZGF0YSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldiwgZXYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXYsIG90aGVyKQorCisgICAgICAgIGJpZ251bSA9IHN5cy5tYXhzaXplICogMiArIDEKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGJpZ251bSwgMSwgMiwgMywgc3lzLm1heHNpemUsIGJpZ251bSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5pZGVudCwgYmlnbnVtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2LmZpbHRlciwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5mbGFncywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldi5mZmxhZ3MsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYuZGF0YSwgc3lzLm1heHNpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYudWRhdGEsIGJpZ251bSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldiwgZXYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZXYsIG90aGVyKQorCisgICAgZGVmIHRlc3RfcXVldWVfZXZlbnQoc2VsZik6CisgICAgICAgIHNlcnZlclNvY2tldCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzZXJ2ZXJTb2NrZXQuYmluZCgoJzEyNy4wLjAuMScsIDApKQorICAgICAgICBzZXJ2ZXJTb2NrZXQubGlzdGVuKDEpCisgICAgICAgIGNsaWVudCA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBjbGllbnQuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KCgnMTI3LjAuMC4xJywgc2VydmVyU29ja2V0LmdldHNvY2tuYW1lKClbMV0pKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sIGVycm5vLkVJTlBST0dSRVNTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgI3JhaXNlIEFzc2VydGlvbkVycm9yKCJDb25uZWN0IHNob3VsZCBoYXZlIHJhaXNlZCBFSU5QUk9HUkVTUyIpCisgICAgICAgICAgICBwYXNzICMgRnJlZUJTRCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBoZXJlCisgICAgICAgIHNlcnZlciwgYWRkciA9IHNlcnZlclNvY2tldC5hY2NlcHQoKQorCisgICAgICAgIGtxID0gc2VsZWN0LmtxdWV1ZSgpCisgICAgICAgIGtxMiA9IHNlbGVjdC5rcXVldWUuZnJvbWZkKGtxLmZpbGVubygpKQorCisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChzZXJ2ZXIuZmlsZW5vKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0FERCB8IHNlbGVjdC5LUV9FVl9FTkFCTEUpCisgICAgICAgIGtxLmNvbnRyb2woW2V2XSwgMCkKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KHNlcnZlci5maWxlbm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9BREQgfCBzZWxlY3QuS1FfRVZfRU5BQkxFKQorICAgICAgICBrcS5jb250cm9sKFtldl0sIDApCisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChjbGllbnQuZmlsZW5vKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1dSSVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0VWX0FERCB8IHNlbGVjdC5LUV9FVl9FTkFCTEUpCisgICAgICAgIGtxMi5jb250cm9sKFtldl0sIDApCisgICAgICAgIGV2ID0gc2VsZWN0LmtldmVudChjbGllbnQuZmlsZW5vKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRklMVEVSX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3QuS1FfRVZfQUREIHwgc2VsZWN0LktRX0VWX0VOQUJMRSkKKyAgICAgICAga3EyLmNvbnRyb2woW2V2XSwgMCkKKworICAgICAgICBldmVudHMgPSBrcS5jb250cm9sKE5vbmUsIDQsIDEpCisgICAgICAgIGV2ZW50cyA9IHNldCgoZS5pZGVudCwgZS5maWx0ZXIpIGZvciBlIGluIGV2ZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIHNldChbCisgICAgICAgICAgICAoY2xpZW50LmZpbGVubygpLCBzZWxlY3QuS1FfRklMVEVSX1dSSVRFKSwKKyAgICAgICAgICAgIChzZXJ2ZXIuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUpXSkpCisKKyAgICAgICAgY2xpZW50LnNlbmQoIkhlbGxvISIpCisgICAgICAgIHNlcnZlci5zZW5kKCJ3b3JsZCEhISIpCisKKyAgICAgICAgIyBXZSBtYXkgbmVlZCB0byBjYWxsIGl0IHNldmVyYWwgdGltZXMKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgZXZlbnRzID0ga3EuY29udHJvbChOb25lLCA0LCAxKQorICAgICAgICAgICAgaWYgbGVuKGV2ZW50cykgPT0gNDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgxLjApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3RpbWVvdXQgd2FpdGluZyBmb3IgZXZlbnQgbm90aWZpY2F0aW9ucycpCisKKyAgICAgICAgZXZlbnRzID0gc2V0KChlLmlkZW50LCBlLmZpbHRlcikgZm9yIGUgaW4gZXZlbnRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgc2V0KFsKKyAgICAgICAgICAgIChjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUpLAorICAgICAgICAgICAgKGNsaWVudC5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9SRUFEKSwKKyAgICAgICAgICAgIChzZXJ2ZXIuZmlsZW5vKCksIHNlbGVjdC5LUV9GSUxURVJfV1JJVEUpLAorICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9SRUFEKV0pKQorCisgICAgICAgICMgUmVtb3ZlIGNvbXBsZXRlbHkgY2xpZW50LCBhbmQgc2VydmVyIHJlYWQgcGFydAorICAgICAgICBldiA9IHNlbGVjdC5rZXZlbnQoY2xpZW50LmZpbGVubygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LktRX0ZJTFRFUl9XUklURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9ERUxFVEUpCisgICAgICAgIGtxLmNvbnRyb2woW2V2XSwgMCkKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KGNsaWVudC5maWxlbm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9ERUxFVEUpCisgICAgICAgIGtxLmNvbnRyb2woW2V2XSwgMCkKKyAgICAgICAgZXYgPSBzZWxlY3Qua2V2ZW50KHNlcnZlci5maWxlbm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9GSUxURVJfUkVBRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5LUV9FVl9ERUxFVEUpCisgICAgICAgIGtxLmNvbnRyb2woW2V2XSwgMCwgMCkKKworICAgICAgICBldmVudHMgPSBrcS5jb250cm9sKFtdLCA0LCAwLjk5KQorICAgICAgICBldmVudHMgPSBzZXQoKGUuaWRlbnQsIGUuZmlsdGVyKSBmb3IgZSBpbiBldmVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBzZXQoWworICAgICAgICAgICAgKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LktRX0ZJTFRFUl9XUklURSldKSkKKworICAgICAgICBjbGllbnQuY2xvc2UoKQorICAgICAgICBzZXJ2ZXIuY2xvc2UoKQorICAgICAgICBzZXJ2ZXJTb2NrZXQuY2xvc2UoKQorCisgICAgZGVmIHRlc3RQYWlyKHNlbGYpOgorICAgICAgICBrcSA9IHNlbGVjdC5rcXVldWUoKQorICAgICAgICBhLCBiID0gc29ja2V0LnNvY2tldHBhaXIoKQorCisgICAgICAgIGEuc2VuZChiJ2ZvbycpCisgICAgICAgIGV2ZW50MSA9IHNlbGVjdC5rZXZlbnQoYSwgc2VsZWN0LktRX0ZJTFRFUl9SRUFELCBzZWxlY3QuS1FfRVZfQUREIHwgc2VsZWN0LktRX0VWX0VOQUJMRSkKKyAgICAgICAgZXZlbnQyID0gc2VsZWN0LmtldmVudChiLCBzZWxlY3QuS1FfRklMVEVSX1JFQUQsIHNlbGVjdC5LUV9FVl9BREQgfCBzZWxlY3QuS1FfRVZfRU5BQkxFKQorICAgICAgICByID0ga3EuY29udHJvbChbZXZlbnQxLCBldmVudDJdLCAxLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyWzBdLmZsYWdzICYgc2VsZWN0LktRX0VWX0VSUk9SKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmVjdihyWzBdLmRhdGEpLCBiJ2ZvbycpCisKKyAgICAgICAgYS5jbG9zZSgpCisgICAgICAgIGIuY2xvc2UoKQorICAgICAgICBrcS5jbG9zZSgpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RLUXVldWUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9rcXVldWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9rcXVldWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2txdWV1ZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9rcXVldWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMDExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9rcXVldWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xhcmdlZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xhcmdlZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmRhOGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5CkBAIC0wLDAgKzEsMjAwIEBACisiIiJUZXN0IGxhcmdlZmlsZSBzdXBwb3J0IG9uIHN5c3RlbSB3aGVyZSB0aGlzIG1ha2VzIHNlbnNlLgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IG9zCitpbXBvcnQgc3RhdAoraW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRFU1RGTiwgdmVyYm9zZSwgcmVxdWlyZXMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVubGluaworaW1wb3J0IGlvICAjIEMgaW1wbGVtZW50YXRpb24gb2YgaW8KK2ltcG9ydCBfcHlpbyBhcyBweWlvICMgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIGlvCisKK3RyeToKKyAgICBpbXBvcnQgc2lnbmFsCisgICAgIyBUaGUgZGVmYXVsdCBoYW5kbGVyIGZvciBTSUdYRlNaIGlzIHRvIGFib3J0IHRoZSBwcm9jZXNzLgorICAgICMgQnkgaWdub3JpbmcgaXQsIHN5c3RlbSBjYWxscyBleGNlZWRpbmcgdGhlIGZpbGUgc2l6ZSByZXNvdXJjZQorICAgICMgbGltaXQgd2lsbCByYWlzZSBJT0Vycm9yIGluc3RlYWQgb2YgY3Jhc2hpbmcgdGhlIGludGVycHJldGVyLgorICAgIG9sZGhhbmRsZXIgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdYRlNaLCBzaWduYWwuU0lHX0lHTikKK2V4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICBwYXNzCisKKyMgY3JlYXRlID4yR0IgZmlsZSAoMkdCID0gMjE0NzQ4MzY0OCBieXRlcykKK3NpemUgPSAyNTAwMDAwMDAwCisKKworY2xhc3MgTGFyZ2VGaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IGVhY2ggZmlsZSBmdW5jdGlvbiB3b3JrcyBhcyBleHBlY3RlZCBmb3IgYSBsYXJnZQorICAgIChpLmUuID4gMkdCLCBkbyAgd2UgaGF2ZSB0byBjaGVjayA+IDRHQikgZmlsZXMuCisKKyAgICBOT1RFOiB0aGUgb3JkZXIgb2YgZXhlY3V0aW9uIG9mIHRoZSB0ZXN0IG1ldGhvZHMgaXMgaW1wb3J0YW50ISB0ZXN0X3NlZWsKKyAgICBtdXN0IHJ1biBmaXJzdCB0byBjcmVhdGUgdGhlIHRlc3QgZmlsZS4gRmlsZSBjbGVhbnVwIG11c3QgYWxzbyBiZSBoYW5kbGVkCisgICAgb3V0c2lkZSB0aGUgdGVzdCBpbnN0YW5jZXMgYmVjYXVzZSBvZiB0aGlzLgorCisgICAgIiIiCisKKyAgICBkZWYgdGVzdF9zZWVrKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoJ2NyZWF0ZSBsYXJnZSBmaWxlIHZpYSBzZWVrIChtYXkgYmUgc3BhcnNlIGZpbGUpIC4uLicpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKFRFU1RGTiwgJ3diJykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoYid6JykKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgZi5zZWVrKHNpemUpCisgICAgICAgICAgICBmLndyaXRlKGInYScpCisgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoJ2NoZWNrIGZpbGUgc2l6ZSB3aXRoIG9zLmZzdGF0JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MuZnN0YXQoZi5maWxlbm8oKSlbc3RhdC5TVF9TSVpFXSwgc2l6ZSsxKQorCisgICAgZGVmIHRlc3Rfb3NzdGF0KHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoJ2NoZWNrIGZpbGUgc2l6ZSB3aXRoIG9zLnN0YXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoVEVTVEZOKVtzdGF0LlNUX1NJWkVdLCBzaXplKzEpCisKKyAgICBkZWYgdGVzdF9zZWVrX3JlYWQoc2VsZik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgncGxheSBhcm91bmQgd2l0aCBzZWVrKCkgYW5kIHJlYWQoKSB3aXRoIHRoZSBidWlsdCBsYXJnZWZpbGUnKQorICAgICAgICB3aXRoIHNlbGYub3BlbihURVNURk4sICdyYicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoMSksIGIneicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAxKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAwKQorICAgICAgICAgICAgZi5zZWVrKDAsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCAwKQorICAgICAgICAgICAgZi5zZWVrKDQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgNDIpCisgICAgICAgICAgICBmLnNlZWsoNDIsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA0MikKKyAgICAgICAgICAgIGYuc2Vlayg0MiwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDg0KQorICAgICAgICAgICAgZi5zZWVrKDAsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA4NCkKKyAgICAgICAgICAgIGYuc2VlaygwLCAyKSAgIyBzZWVrIGZyb20gdGhlIGVuZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgc2l6ZSArIDEgKyAwKQorICAgICAgICAgICAgZi5zZWVrKC0xMCwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHNpemUgKyAxIC0gMTApCisgICAgICAgICAgICBmLnNlZWsoLXNpemUtMSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApCisgICAgICAgICAgICBmLnNlZWsoc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIHNpemUpCisgICAgICAgICAgICAjIHRoZSAnYScgdGhhdCB3YXMgd3JpdHRlbiBhdCB0aGUgZW5kIG9mIGZpbGUgYWJvdmUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDEpLCBiJ2EnKQorICAgICAgICAgICAgZi5zZWVrKC1zaXplLTEsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgYid6JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDEpCisKKyAgICBkZWYgdGVzdF9sc2VlayhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50KCdwbGF5IGFyb3VuZCB3aXRoIG9zLmxzZWVrKCkgd2l0aCB0aGUgYnVpbHQgbGFyZ2VmaWxlJykKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oVEVTVEZOLCAncmInKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5sc2VlayhmLmZpbGVubygpLCAwLCAwKSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHNlZWsoZi5maWxlbm8oKSwgNDIsIDApLCA0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHNlZWsoZi5maWxlbm8oKSwgNDIsIDEpLCA4NCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHNlZWsoZi5maWxlbm8oKSwgMCwgMSksIDg0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5sc2VlayhmLmZpbGVubygpLCAwLCAyKSwgc2l6ZSsxKzApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxzZWVrKGYuZmlsZW5vKCksIC0xMCwgMiksIHNpemUrMS0xMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHNlZWsoZi5maWxlbm8oKSwgLXNpemUtMSwgMiksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxzZWVrKGYuZmlsZW5vKCksIHNpemUsIDApLCBzaXplKQorICAgICAgICAgICAgIyB0aGUgJ2EnIHRoYXQgd2FzIHdyaXR0ZW4gYXQgdGhlIGVuZCBvZiBmaWxlIGFib3ZlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgxKSwgYidhJykKKworICAgIGRlZiB0ZXN0X3RydW5jYXRlKHNlbGYpOgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoJ3RyeSB0cnVuY2F0ZScpCisgICAgICAgIHdpdGggc2VsZi5vcGVuKFRFU1RGTiwgJ3IrYicpIGFzIGY6CisgICAgICAgICAgICAjIHRoaXMgaXMgYWxyZWFkeSBkZWNpZGVkIGJlZm9yZSBzdGFydCBydW5uaW5nIHRoZSB0ZXN0IHN1aXRlCisgICAgICAgICAgICAjIGJ1dCB3ZSBkbyBpdCBhbnl3YXkgZm9yIGV4dHJhIHByb3RlY3Rpb24KKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGYsICd0cnVuY2F0ZScpOgorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJvcGVuKCkudHJ1bmNhdGUoKSBub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtIikKKyAgICAgICAgICAgIGYuc2VlaygwLCAyKQorICAgICAgICAgICAgIyBlbHNlIHdlJ3ZlIGxvc3QgdHJhY2sgb2YgdGhlIHRydWUgc2l6ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgc2l6ZSsxKQorICAgICAgICAgICAgIyBDdXQgaXQgYmFjayB2aWEgc2VlayArIHRydW5jYXRlIHdpdGggbm8gYXJndW1lbnQuCisgICAgICAgICAgICBuZXdzaXplID0gc2l6ZSAtIDEwCisgICAgICAgICAgICBmLnNlZWsobmV3c2l6ZSkKKyAgICAgICAgICAgIGYudHJ1bmNhdGUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgbmV3c2l6ZSkgICMgZWxzZSBwb2ludGVyIG1vdmVkCisgICAgICAgICAgICBmLnNlZWsoMCwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIG5ld3NpemUpICAjIGVsc2Ugd2Fzbid0IHRydW5jYXRlZAorICAgICAgICAgICAgIyBFbnN1cmUgdGhhdCB0cnVuY2F0ZShzbWFsbGVyIHRoYW4gdHJ1ZSBzaXplKSBzaHJpbmtzCisgICAgICAgICAgICAjIHRoZSBmaWxlLgorICAgICAgICAgICAgbmV3c2l6ZSAtPSAxCisgICAgICAgICAgICBmLnNlZWsoNDIpCisgICAgICAgICAgICBmLnRydW5jYXRlKG5ld3NpemUpCisgICAgICAgICAgICBpZiBzZWxmLm5ld19pbzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA0MikKKyAgICAgICAgICAgIGYuc2VlaygwLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgbmV3c2l6ZSkKKyAgICAgICAgICAgICMgWFhYIHRydW5jYXRlKGxhcmdlciB0aGFuIHRydWUgc2l6ZSkgaXMgaWxsLWRlZmluZWQKKyAgICAgICAgICAgICMgYWNyb3NzIHBsYXRmb3JtOyBjdXQgaXQgd2FhYWFheSBiYWNrCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIGYudHJ1bmNhdGUoMSkKKyAgICAgICAgICAgIGlmIHNlbGYubmV3X2lvOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDApICAgICAgICMgZWxzZSBwb2ludGVyIG1vdmVkCisgICAgICAgICAgICBmLnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYucmVhZCgpKSwgMSkgICMgZWxzZSB3YXNuJ3QgdHJ1bmNhdGVkCisKKyAgICBkZWYgdGVzdF9zZWVrYWJsZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNTAxNjsgc2Vla2FibGUoKSBjYW4gcmV0dXJuIEZhbHNlIHdoZW4gdGhlIGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgIyBpcyBuZWdhdGl2ZSB3aGVuIHRydW5jYXRlZCB0byBhbiBpbnQuCisgICAgICAgIGlmIG5vdCBzZWxmLm5ld19pbzoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImJ1aWx0aW4gZmlsZSBkb2Vzbid0IGhhdmUgc2Vla2FibGUoKSIpCisgICAgICAgIGZvciBwb3MgaW4gKDIqKjMxLTEsIDIqKjMxLCAyKiozMSsxKToKKyAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKFRFU1RGTiwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLnNlZWsocG9zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLnNlZWthYmxlKCkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgICMgT24gV2luZG93cyBhbmQgTWFjIE9TWCB0aGlzIHRlc3QgY29tc3VtZXMgbGFyZ2UgcmVzb3VyY2VzOyBJdAorICAgICMgdGFrZXMgYSBsb25nIHRpbWUgdG8gYnVpbGQgdGhlID4yR0IgZmlsZSBhbmQgdGFrZXMgPjJHQiBvZiBkaXNrCisgICAgIyBzcGFjZSB0aGVyZWZvcmUgdGhlIHJlc291cmNlIG11c3QgYmUgZW5hYmxlZCB0byBydW4gdGhpcyB0ZXN0LgorICAgICMgSWYgbm90LCBub3RoaW5nIGFmdGVyIHRoaXMgbGluZSBzdGFuemEgd2lsbCBiZSBleGVjdXRlZC4KKyAgICBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nIG9yIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgcmVxdWlyZXMoJ2xhcmdlZmlsZScsCisgICAgICAgICAgICAgICAgICd0ZXN0IHJlcXVpcmVzICVzIGJ5dGVzIGFuZCBhIGxvbmcgdGltZSB0byBydW4nICUgc3RyKHNpemUpKQorICAgIGVsc2U6CisgICAgICAgICMgT25seSBydW4gaWYgdGhlIGN1cnJlbnQgZmlsZXN5c3RlbSBzdXBwb3J0cyBsYXJnZSBmaWxlcy4KKyAgICAgICAgIyAoU2tpcCB0aGlzIHRlc3Qgb24gV2luZG93cywgc2luY2Ugd2Ugbm93IGFsd2F5cyBzdXBwb3J0CisgICAgICAgICMgbGFyZ2UgZmlsZXMuKQorICAgICAgICBmID0gb3BlbihURVNURk4sICd3YicsIGJ1ZmZlcmluZz0wKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIDIqKjMxID09IDIxNDc0ODM2NDgKKyAgICAgICAgICAgIGYuc2VlaygyMTQ3NDgzNjQ5KQorICAgICAgICAgICAgIyBTZWVraW5nIGlzIG5vdCBlbm91Z2ggb2YgYSB0ZXN0OiB5b3UgbXVzdCB3cml0ZSBhbmQKKyAgICAgICAgICAgICMgZmx1c2gsIHRvbyEKKyAgICAgICAgICAgIGYud3JpdGUoYid4JykKKyAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICBleGNlcHQgKElPRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoImZpbGVzeXN0ZW0gZG9lcyBub3QgaGF2ZSBsYXJnZWZpbGUgc3VwcG9ydCIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgZm9yIF9vcGVuLCBwcmVmaXggaW4gWyhpby5vcGVuLCAnQycpLCAocHlpby5vcGVuLCAnUHknKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW4sICdCdWlsdGluJyldOgorICAgICAgICBjbGFzcyBUZXN0Q2FzZShMYXJnZUZpbGVUZXN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgVGVzdENhc2Uub3BlbiA9IHN0YXRpY21ldGhvZChfb3BlbikKKyAgICAgICAgVGVzdENhc2UubmV3X2lvID0gX29wZW4gaXMgbm90IG9wZW4KKyAgICAgICAgVGVzdENhc2UuX19uYW1lX18gPSBwcmVmaXggKyBMYXJnZUZpbGVUZXN0Ll9fbmFtZV9fCisgICAgICAgIHN1aXRlLmFkZFRlc3QoVGVzdENhc2UoJ3Rlc3Rfc2VlaycpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KFRlc3RDYXNlKCd0ZXN0X29zc3RhdCcpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KFRlc3RDYXNlKCd0ZXN0X3NlZWtfcmVhZCcpKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KFRlc3RDYXNlKCd0ZXN0X2xzZWVrJykpCisgICAgICAgIHdpdGggX29wZW4oVEVTVEZOLCAnd2InKSBhcyBmOgorICAgICAgICAgICAgaWYgaGFzYXR0cihmLCAndHJ1bmNhdGUnKToKKyAgICAgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KFRlc3RDYXNlKCd0ZXN0X3RydW5jYXRlJykpCisgICAgICAgIHN1aXRlLmFkZFRlc3QoVGVzdENhc2UoJ3Rlc3Rfc2Vla2FibGUnKSkKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICB0cnk6CisgICAgICAgIHJ1bl91bml0dGVzdChzdWl0ZSkKKyAgICBmaW5hbGx5OgorICAgICAgICB1bmxpbmsoVEVTVEZOKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sYXJnZWZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWY5NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sYXJnZWZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWY5NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saWIydG8zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDlhMjZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weQpAQCAtMCwwICsxLDIxIEBACisjIFNraXBwaW5nIHRlc3RfcGFyc2VyIGFuZCB0ZXN0X2FsbF9maXhlcnMKKyMgYmVjYXVzZSBvZiBydW5uaW5nCitmcm9tIGxpYjJ0bzMudGVzdHMgaW1wb3J0ICh0ZXN0X2ZpeGVycywgdGVzdF9weXRyZWUsIHRlc3RfdXRpbCwgdGVzdF9yZWZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcGFyc2VyLCB0ZXN0X21haW4gYXMgdGVzdF9tYWluXykKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2RlZiBzdWl0ZSgpOgorICAgIHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICBmb3IgbSBpbiAodGVzdF9maXhlcnMsIHRlc3RfcHl0cmVlLHRlc3RfdXRpbCwgdGVzdF9yZWZhY3RvciwgdGVzdF9wYXJzZXIsCisgICAgICAgICAgICAgIHRlc3RfbWFpbl8pOgorICAgICAgICB0ZXN0cy5hZGRUZXN0cyhsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtKSkKKyAgICByZXR1cm4gdGVzdHMKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChzdWl0ZSgpKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpYjJ0bzMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMGQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpYjJ0bzMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpYjJ0bzMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGliMnRvMy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllMGQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpYjJ0bzMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbmVjYWNoZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbmVjYWNoZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY4MGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5CkBAIC0wLDAgKzEsMTMxIEBACisiIiIgVGVzdHMgZm9yIHRoZSBsaW5lY2FjaGUgbW9kdWxlICIiIgorCitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcy5wYXRoCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisKKworRklMRU5BTUUgPSBsaW5lY2FjaGUuX19maWxlX18KK0lOVkFMSURfTkFNRSA9ICchQCQpKCFAI18xJworRU1QVFkgPSAnJworVEVTVFMgPSAnaW5zcGVjdF9mb2RkZXIgaW5zcGVjdF9mb2RkZXIyIG1hcHBpbmdfdGVzdHMnCitURVNUUyA9IFRFU1RTLnNwbGl0KCkKK1RFU1RfUEFUSCA9IG9zLnBhdGguZGlybmFtZShzdXBwb3J0Ll9fZmlsZV9fKQorTU9EVUxFUyA9ICJsaW5lY2FjaGUgYWJjIi5zcGxpdCgpCitNT0RVTEVfUEFUSCA9IG9zLnBhdGguZGlybmFtZShGSUxFTkFNRSkKKworU09VUkNFXzEgPSAnJycKKyIgRG9jc3RyaW5nICIKKworZGVmIGZ1bmN0aW9uKCk6CisgICAgcmV0dXJuIHJlc3VsdAorCisnJycKKworU09VUkNFXzIgPSAnJycKK2RlZiBmKCk6CisgICAgcmV0dXJuIDEgKyAxCisKK2EgPSBmKCkKKworJycnCisKK1NPVVJDRV8zID0gJycnCitkZWYgZigpOgorICAgIHJldHVybiAzJycnICMgTm8gZW5kaW5nIG5ld2xpbmUKKworCitjbGFzcyBMaW5lQ2FjaGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9nZXRsaW5lKHNlbGYpOgorICAgICAgICBnZXRsaW5lID0gbGluZWNhY2hlLmdldGxpbmUKKworICAgICAgICAjIEJhZCB2YWx1ZXMgZm9yIGxpbmUgbnVtYmVyIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0bGluZShGSUxFTkFNRSwgMioqMTUpLCBFTVBUWSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKEZJTEVOQU1FLCAtMSksIEVNUFRZKQorCisgICAgICAgICMgRmxvYXQgdmFsdWVzIGN1cnJlbnRseSByYWlzZSBUeXBlRXJyb3IsIHNob3VsZCBpdD8KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRsaW5lLCBGSUxFTkFNRSwgMS4xKQorCisgICAgICAgICMgQmFkIGZpbGVuYW1lcyBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IHN0cmluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGxpbmUoRU1QVFksIDEpLCBFTVBUWSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRsaW5lKElOVkFMSURfTkFNRSwgMSksIEVNUFRZKQorCisgICAgICAgICMgQ2hlY2sgd2hldGhlciBsaW5lcyBjb3JyZXNwb25kIHRvIHRob3NlIGZyb20gZmlsZSBpdGVyYXRpb24KKyAgICAgICAgZm9yIGVudHJ5IGluIFRFU1RTOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oVEVTVF9QQVRILCBlbnRyeSkgKyAnLnB5JworICAgICAgICAgICAgZm9yIGluZGV4LCBsaW5lIGluIGVudW1lcmF0ZShvcGVuKGZpbGVuYW1lKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBnZXRsaW5lKGZpbGVuYW1lLCBpbmRleCArIDEpKQorCisgICAgICAgICMgQ2hlY2sgbW9kdWxlIGxvYWRpbmcKKyAgICAgICAgZm9yIGVudHJ5IGluIE1PRFVMRVM6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihNT0RVTEVfUEFUSCwgZW50cnkpICsgJy5weScKKyAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUob3BlbihmaWxlbmFtZSkpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZ2V0bGluZShmaWxlbmFtZSwgaW5kZXggKyAxKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgYm9ndXMgZGF0YSBpc24ndCByZXR1cm5lZCAoaXNzdWUgIzEzMDk1NjcpCisgICAgICAgIGVtcHR5ID0gbGluZWNhY2hlLmdldGxpbmVzKCdhL2IvYy9fX2luaXRfXy5weScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW1wdHksIFtdKQorCisgICAgZGVmIHRlc3Rfbm9fZW5kaW5nX25ld2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc3VwcG9ydC5URVNURk4pCisgICAgICAgIHdpdGggb3BlbihzdXBwb3J0LlRFU1RGTiwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKFNPVVJDRV8zKQorICAgICAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhzdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lcywgWyJcbiIsICJkZWYgZigpOlxuIiwgIiAgICByZXR1cm4gM1xuIl0pCisKKyAgICBkZWYgdGVzdF9jbGVhcmNhY2hlKHNlbGYpOgorICAgICAgICBjYWNoZWQgPSBbXQorICAgICAgICBmb3IgZW50cnkgaW4gVEVTVFM6CisgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihURVNUX1BBVEgsIGVudHJ5KSArICcucHknCisgICAgICAgICAgICBjYWNoZWQuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIDEpCisKKyAgICAgICAgIyBBcmUgYWxsIGZpbGVzIGNhY2hlZD8KKyAgICAgICAgY2FjaGVkX2VtcHR5ID0gW2ZuIGZvciBmbiBpbiBjYWNoZWQgaWYgZm4gbm90IGluIGxpbmVjYWNoZS5jYWNoZV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWNoZWRfZW1wdHksIFtdKQorCisgICAgICAgICMgQ2FuIHdlIGNsZWFyIHRoZSBjYWNoZT8KKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICBjYWNoZWRfZW1wdHkgPSBbZm4gZm9yIGZuIGluIGNhY2hlZCBpZiBmbiBpbiBsaW5lY2FjaGUuY2FjaGVdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FjaGVkX2VtcHR5LCBbXSkKKworICAgIGRlZiB0ZXN0X2NoZWNrY2FjaGUoc2VsZik6CisgICAgICAgIGdldGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZQorICAgICAgICAjIENyZWF0ZSBhIHNvdXJjZSBmaWxlIGFuZCBjYWNoZSBpdHMgY29udGVudHMKKyAgICAgICAgc291cmNlX25hbWUgPSBzdXBwb3J0LlRFU1RGTiArICcucHknCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgc291cmNlX25hbWUpCisgICAgICAgIHdpdGggb3Blbihzb3VyY2VfbmFtZSwgJ3cnKSBhcyBzb3VyY2U6CisgICAgICAgICAgICBzb3VyY2Uud3JpdGUoU09VUkNFXzEpCisgICAgICAgIGdldGxpbmUoc291cmNlX25hbWUsIDEpCisKKyAgICAgICAgIyBLZWVwIGEgY29weSBvZiB0aGUgb2xkIGNvbnRlbnRzCisgICAgICAgIHNvdXJjZV9saXN0ID0gW10KKyAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9uYW1lKSBhcyBzb3VyY2U6CisgICAgICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKHNvdXJjZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBnZXRsaW5lKHNvdXJjZV9uYW1lLCBpbmRleCArIDEpKQorICAgICAgICAgICAgICAgIHNvdXJjZV9saXN0LmFwcGVuZChsaW5lKQorCisgICAgICAgIHdpdGggb3Blbihzb3VyY2VfbmFtZSwgJ3cnKSBhcyBzb3VyY2U6CisgICAgICAgICAgICBzb3VyY2Uud3JpdGUoU09VUkNFXzIpCisKKyAgICAgICAgIyBUcnkgdG8gdXBkYXRlIGEgYm9ndXMgY2FjaGUgZW50cnkKKyAgICAgICAgbGluZWNhY2hlLmNoZWNrY2FjaGUoJ2R1bW15JykKKworICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGNhY2hlIG1hdGNoZXMgdGhlIG9sZCBjb250ZW50cworICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKHNvdXJjZV9saXN0KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgZ2V0bGluZShzb3VyY2VfbmFtZSwgaW5kZXggKyAxKSkKKworICAgICAgICAjIFVwZGF0ZSB0aGUgY2FjaGUgYW5kIGNoZWNrIHdoZXRoZXIgaXQgbWF0Y2hlcyB0aGUgbmV3IHNvdXJjZSBmaWxlCisgICAgICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKHNvdXJjZV9uYW1lKQorICAgICAgICB3aXRoIG9wZW4oc291cmNlX25hbWUpIGFzIHNvdXJjZToKKyAgICAgICAgICAgIGZvciBpbmRleCwgbGluZSBpbiBlbnVtZXJhdGUoc291cmNlKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGdldGxpbmUoc291cmNlX25hbWUsIGluZGV4ICsgMSkpCisgICAgICAgICAgICAgICAgc291cmNlX2xpc3QuYXBwZW5kKGxpbmUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChMaW5lQ2FjaGVUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbmVjYWNoZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwODBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbmVjYWNoZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGluZWNhY2hlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbmVjYWNoZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwODBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbmVjYWNoZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGludXhhdWRpb2Rldi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmNDZiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHkKQEAgLTAsMCArMSw5OSBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygnYXVkaW8nKQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgcnVuX3VuaXR0ZXN0CisKK2ltcG9ydCBlcnJubworaW1wb3J0IHN5cworaW1wb3J0IGF1ZGlvb3AKK2ltcG9ydCB1bml0dGVzdAorCitsaW51eGF1ZGlvZGV2ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2xpbnV4YXVkaW9kZXYnLCBkZXByZWNhdGVkPVRydWUpCitzdW5hdWRpbyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdzdW5hdWRpbycsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworU05EX0ZPUk1BVF9NVUxBV184ID0gMQorCitjbGFzcyBMaW51eEF1ZGlvRGV2VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRldiA9IGxpbnV4YXVkaW9kZXYub3BlbigndycpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZGV2LmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X21ldGhvZHMoc2VsZik6CisgICAgICAgICMgYXQgbGVhc3QgY2hlY2sgdGhhdCB0aGVzZSBtZXRob2RzIGNhbiBiZSBpbnZva2VkCisgICAgICAgIHNlbGYuZGV2LmJ1ZnNpemUoKQorICAgICAgICBzZWxmLmRldi5vYnVmY291bnQoKQorICAgICAgICBzZWxmLmRldi5vYnVmZnJlZSgpCisgICAgICAgIHNlbGYuZGV2LmdldHB0cigpCisgICAgICAgIHNlbGYuZGV2LmZpbGVubygpCisKKyAgICBkZWYgdGVzdF9wbGF5X3NvdW5kX2ZpbGUoc2VsZik6CisgICAgICAgIHBhdGggPSBmaW5kZmlsZSgiYXVkaW90ZXN0LmF1IikKKyAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyJykKKyAgICAgICAgc2l6ZSwgZW5jLCByYXRlLCBuY2hhbm5lbHMsIGV4dHJhID0gc3VuYXVkaW8uZ2V0aGRyKGZwKQorICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICBpZiBlbmMgIT0gU05EX0ZPUk1BVF9NVUxBV184OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3QgLmF1IGZpbGUgd2l0aCA4LWJpdCBtdS1sYXcgc2FtcGxlcyIpCisKKyAgICAgICAgIyBjb252ZXJ0IHRoZSBkYXRhIHRvIDE2LWJpdCBzaWduZWQKKyAgICAgICAgZGF0YSA9IGF1ZGlvb3AudWxhdzJsaW4oZGF0YSwgMikKKworICAgICAgICAjIHNldCB0aGUgZGF0YSBmb3JtYXQKKyAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnbGl0dGxlJzoKKyAgICAgICAgICAgIGZtdCA9IGxpbnV4YXVkaW9kZXYuQUZNVF9TMTZfTEUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZtdCA9IGxpbnV4YXVkaW9kZXYuQUZNVF9TMTZfQkUKKworICAgICAgICAjIHNldCBwYXJhbWV0ZXJzIGJhc2VkIG9uIC5hdSBmaWxlIGhlYWRlcnMKKyAgICAgICAgc2VsZi5kZXYuc2V0cGFyYW1ldGVycyhyYXRlLCAxNiwgbmNoYW5uZWxzLCBmbXQpCisgICAgICAgIHNlbGYuZGV2LndyaXRlKGRhdGEpCisgICAgICAgIHNlbGYuZGV2LmZsdXNoKCkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2l6ZSA9IDgKKyAgICAgICAgZm10ID0gbGludXhhdWRpb2Rldi5BRk1UX1U4CisgICAgICAgIHJhdGUgPSA4MDAwCisgICAgICAgIG5jaGFubmVscyA9IDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kZXYuc2V0cGFyYW1ldGVycygtMSwgc2l6ZSwgbmNoYW5uZWxzLCBmbXQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlcnI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyci5hcmdzWzBdLCAiZXhwZWN0ZWQgcmF0ZSA+PSAwLCBub3QgLTEiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRldi5zZXRwYXJhbWV0ZXJzKHJhdGUsIC0yLCBuY2hhbm5lbHMsIGZtdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3NbMF0sICJleHBlY3RlZCBzYW1wbGUgc2l6ZSA+PSAwLCBub3QgLTIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRldi5zZXRwYXJhbWV0ZXJzKHJhdGUsIHNpemUsIDMsIGZtdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3NbMF0sICJuY2hhbm5lbHMgbXVzdCBiZSAxIG9yIDIsIG5vdCAzIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kZXYuc2V0cGFyYW1ldGVycyhyYXRlLCBzaXplLCBuY2hhbm5lbHMsIDE3NykKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3NbMF0sICJ1bmtub3duIGF1ZGlvIGVuY29kaW5nOiAxNzciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRldi5zZXRwYXJhbWV0ZXJzKHJhdGUsIHNpemUsIG5jaGFubmVscywgbGludXhhdWRpb2Rldi5BRk1UX1UxNl9MRSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3NbMF0sICJmb3IgbGluZWFyIHVuc2lnbmVkIDE2LWJpdCBsaXR0bGUtZW5kaWFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImF1ZGlvLCBleHBlY3RlZCBzYW1wbGUgc2l6ZSAxNiwgbm90IDgiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRldi5zZXRwYXJhbWV0ZXJzKHJhdGUsIDE2LCBuY2hhbm5lbHMsIGZtdCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3NbMF0sICJmb3IgbGluZWFyIHVuc2lnbmVkIDgtYml0IGF1ZGlvLCBleHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGUgc2l6ZSA4LCBub3QgMTYiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdHJ5OgorICAgICAgICBkc3AgPSBsaW51eGF1ZGlvZGV2Lm9wZW4oJ3cnKQorICAgIGV4Y2VwdCBsaW51eGF1ZGlvZGV2LmVycm9yLCBtc2c6CisgICAgICAgIGlmIG1zZy5hcmdzWzBdIGluIChlcnJuby5FQUNDRVMsIGVycm5vLkVOT0VOVCwgZXJybm8uRU5PREVWLCBlcnJuby5FQlVTWSk6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdChtc2cpCisgICAgICAgIHJhaXNlCisgICAgZHNwLmNsb3NlKCkKKyAgICBydW5fdW5pdHRlc3QoTGludXhBdWRpb0RldlRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW51eGF1ZGlvZGV2LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjkyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW51eGF1ZGlvZGV2LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW51eGF1ZGlvZGV2LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpbnV4YXVkaW9kZXYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjkyNWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saW51eGF1ZGlvZGV2LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9saXN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTA4MGRjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weQpAQCAtMCwwICsxLDc4IEBACitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgbGlzdF90ZXN0cworCitjbGFzcyBMaXN0VGVzdChsaXN0X3Rlc3RzLkNvbW1vblRlc3QpOgorICAgIHR5cGUydGVzdCA9IGxpc3QKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoW10pLCBbXSkKKyAgICAgICAgbDBfMyA9IFswLCAxLCAyLCAzXQorICAgICAgICBsMF8zX2JpcyA9IGxpc3QobDBfMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsMF8zLCBsMF8zX2JpcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwwXzMgaXMgbm90IGwwXzNfYmlzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoKCkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCgwLCAxLCAyLCAzKSksIFswLCAxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCcnKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgnc3BhbScpLCBbJ3MnLCAncCcsICdhJywgJ20nXSkKKworICAgICAgICBpZiBzeXMubWF4c2l6ZSA9PSAweDdmZmZmZmZmOgorICAgICAgICAgICAgIyBUaGlzIHRlc3QgY2FuIGN1cnJlbnRseSBvbmx5IHdvcmsgb24gMzItYml0IG1hY2hpbmVzLgorICAgICAgICAgICAgIyBYWFggSWYvd2hlbiBQeVNlcXVlbmNlX0xlbmd0aCgpIHJldHVybnMgYSBzc2l6ZV90LCBpdCBzaG91bGQgYmUKKyAgICAgICAgICAgICMgWFhYIHJlLWVuYWJsZWQuCisgICAgICAgICAgICAjIFZlcmlmeSBjbGVhcmluZyBvZiBidWcgIzU1NjAyNS4KKyAgICAgICAgICAgICMgVGhpcyBhc3N1bWVzIHRoYXQgdGhlIG1heCBkYXRhIHNpemUgKHN5cy5tYXhpbnQpID09IG1heAorICAgICAgICAgICAgIyBhZGRyZXNzIHNpemUgdGhpcyBhbHNvIGFzc3VtZXMgdGhhdCB0aGUgYWRkcmVzcyBzaXplIGlzIGF0CisgICAgICAgICAgICAjIGxlYXN0IDQgYnl0ZXMgd2l0aCA4IGJ5dGUgYWRkcmVzc2VzLCB0aGUgYnVnIGlzIG5vdCB3ZWxsCisgICAgICAgICAgICAjIHRlc3RlZAorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBOb3RlOiBUaGlzIHRlc3QgaXMgZXhwZWN0ZWQgdG8gU0VHViB1bmRlciBDeWd3aW4gMS4zLjEyIG9yCisgICAgICAgICAgICAjIGVhcmxpZXIgZHVlIHRvIGEgbmV3bGliIGJ1Zy4gIFNlZSB0aGUgZm9sbG93aW5nIG1haWxpbmcgbGlzdAorICAgICAgICAgICAgIyB0aHJlYWQgZm9yIHRoZSBkZXRhaWxzOgorCisgICAgICAgICAgICAjICAgICBodHRwOi8vc291cmNlcy5yZWRoYXQuY29tL21sL25ld2xpYi8yMDAyL21zZzAwMzY5Lmh0bWwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE1lbW9yeUVycm9yLCBsaXN0LCB4cmFuZ2Uoc3lzLm1heGludCAvLyAyKSkKKworICAgICAgICAjIFRoaXMgY29kZSB1c2VkIHRvIHNlZ2ZhdWx0IGluIFB5Mi40YTMKKyAgICAgICAgeCA9IFtdCisgICAgICAgIHguZXh0ZW5kKC15IGZvciB5IGluIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgW10pCisKKyAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKKyAgICAgICAgc3VwZXIoTGlzdFRlc3QsIHNlbGYpLnRlc3RfdHJ1dGgoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoWzQyXSkKKworICAgIGRlZiB0ZXN0X2lkZW50aXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoW10gaXMgbm90IFtdKQorCisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBzdXBlcihMaXN0VGVzdCwgc2VsZikudGVzdF9sZW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihbXSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFswXSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKFswLCAxLCAyXSksIDMpCisKKyAgICBkZWYgdGVzdF9vdmVyZmxvdyhzZWxmKToKKyAgICAgICAgbHN0ID0gWzQsIDUsIDYsIDddCisgICAgICAgIG4gPSBpbnQoKHN5cy5tYXhpbnQqMisyKSAvLyBsZW4obHN0KSkKKyAgICAgICAgZGVmIG11bChhLCBiKTogcmV0dXJuIGEgKiBiCisgICAgICAgIGRlZiBpbXVsKGEsIGIpOiBhICo9IGIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE1lbW9yeUVycm9yLCBPdmVyZmxvd0Vycm9yKSwgbXVsLCBsc3QsIG4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChNZW1vcnlFcnJvciwgT3ZlcmZsb3dFcnJvciksIGltdWwsIGxzdCwgbikKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTGlzdFRlc3QpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGltcG9ydCBnYworICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KExpc3RUZXN0KQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpc3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2Yjc5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpc3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpc3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2Yjc5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xpc3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc1NTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9jYWxlLnB5CkBAIC0wLDAgKzEsNDM4IEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHZlcmJvc2UKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGxvY2FsZQoraW1wb3J0IHN5cworaW1wb3J0IGNvZGVjcworCisKK2VuVVNfbG9jYWxlID0gTm9uZQorCitkZWYgZ2V0X2VuVVNfbG9jYWxlKCk6CisgICAgZ2xvYmFsIGVuVVNfbG9jYWxlCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgdGxvY3MgPSAoImVuX1VTLlVURi04IiwgImVuX1VTLklTTzg4NTktMSIsICJlbl9VUyIpCisgICAgICAgIGlmIGludChvcy51bmFtZSgpWzJdLnNwbGl0KCcuJylbMF0pIDwgMTA6CisgICAgICAgICAgICAjIFRoZSBsb2NhbGUgdGVzdCB3b3JrIGZpbmUgb24gT1NYIDEwLjYsIEkgKHJvbmFsZG91c3NvcmVuKQorICAgICAgICAgICAgIyBoYXZlbid0IGhhZCB0aW1lIHlldCB0byB2ZXJpZnkgaWYgdGVzdHMgd29yayBvbiBPU1ggMTAuNQorICAgICAgICAgICAgIyAoMTAuNCBpcyBrbm93biB0byBiZSBiYWQpCisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiTG9jYWxlIHN1cHBvcnQgb24gTWFjT1NYIGlzIG1pbmltYWwiKQorICAgIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKToKKyAgICAgICAgdGxvY3MgPSAoIkVuIiwgIkVuZ2xpc2giKQorICAgIGVsc2U6CisgICAgICAgIHRsb2NzID0gKCJlbl9VUy5VVEYtOCIsICJlbl9VUy5VUy1BU0NJSSIsICJlbl9VUyIpCisgICAgb2xkbG9jYWxlID0gbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfTlVNRVJJQykKKyAgICBmb3IgdGxvYyBpbiB0bG9jczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfTlVNRVJJQywgdGxvYykKKyAgICAgICAgZXhjZXB0IGxvY2FsZS5FcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoCisgICAgICAgICAgICAiVGVzdCBsb2NhbGUgbm90IHN1cHBvcnRlZCAodHJpZWQgJXMpIiAlICgnLCAnLmpvaW4odGxvY3MpKSkKKyAgICBlblVTX2xvY2FsZSA9IHRsb2MKKyAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19OVU1FUklDLCBvbGRsb2NhbGUpCisKKworY2xhc3MgQmFzZUxvY2FsaXplZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMKKyAgICAjIEJhc2UgY2xhc3MgZm9yIHRlc3RzIHVzaW5nIGEgcmVhbCBsb2NhbGUKKyAgICAjCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYub2xkbG9jYWxlID0gbG9jYWxlLnNldGxvY2FsZShzZWxmLmxvY2FsZV90eXBlKQorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKHNlbGYubG9jYWxlX3R5cGUsIGVuVVNfbG9jYWxlKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgInRlc3Rpbmcgd2l0aCBcIiVzXCIuLi4iICUgZW5VU19sb2NhbGUsCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUoc2VsZi5sb2NhbGVfdHlwZSwgc2VsZi5vbGRsb2NhbGUpCisKKworY2xhc3MgQmFzZUNvb2tlZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMKKyAgICAjIEJhc2UgY2xhc3MgZm9yIHRlc3RzIHVzaW5nIGNvb2tlZCBsb2NhbGVjb252KCkgdmFsdWVzCisgICAgIworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBsb2NhbGUuX292ZXJyaWRlX2xvY2FsZWNvbnYgPSBzZWxmLmNvb2tlZF92YWx1ZXMKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgbG9jYWxlLl9vdmVycmlkZV9sb2NhbGVjb252ID0ge30KKworCitjbGFzcyBDQ29va2VkVGVzdChCYXNlQ29va2VkVGVzdCk6CisgICAgIyBBIGNvb2tlZCAiQyIgbG9jYWxlCisKKyAgICBjb29rZWRfdmFsdWVzID0geworICAgICAgICAnY3VycmVuY3lfc3ltYm9sJzogJycsCisgICAgICAgICdkZWNpbWFsX3BvaW50JzogJy4nLAorICAgICAgICAnZnJhY19kaWdpdHMnOiAxMjcsCisgICAgICAgICdncm91cGluZyc6IFtdLAorICAgICAgICAnaW50X2N1cnJfc3ltYm9sJzogJycsCisgICAgICAgICdpbnRfZnJhY19kaWdpdHMnOiAxMjcsCisgICAgICAgICdtb25fZGVjaW1hbF9wb2ludCc6ICcnLAorICAgICAgICAnbW9uX2dyb3VwaW5nJzogW10sCisgICAgICAgICdtb25fdGhvdXNhbmRzX3NlcCc6ICcnLAorICAgICAgICAnbl9jc19wcmVjZWRlcyc6IDEyNywKKyAgICAgICAgJ25fc2VwX2J5X3NwYWNlJzogMTI3LAorICAgICAgICAnbl9zaWduX3Bvc24nOiAxMjcsCisgICAgICAgICduZWdhdGl2ZV9zaWduJzogJycsCisgICAgICAgICdwX2NzX3ByZWNlZGVzJzogMTI3LAorICAgICAgICAncF9zZXBfYnlfc3BhY2UnOiAxMjcsCisgICAgICAgICdwX3NpZ25fcG9zbic6IDEyNywKKyAgICAgICAgJ3Bvc2l0aXZlX3NpZ24nOiAnJywKKyAgICAgICAgJ3Rob3VzYW5kc19zZXAnOiAnJworICAgIH0KKworY2xhc3MgRW5VU0Nvb2tlZFRlc3QoQmFzZUNvb2tlZFRlc3QpOgorICAgICMgQSBjb29rZWQgImVuX1VTIiBsb2NhbGUKKworICAgIGNvb2tlZF92YWx1ZXMgPSB7CisgICAgICAgICdjdXJyZW5jeV9zeW1ib2wnOiAnJCcsCisgICAgICAgICdkZWNpbWFsX3BvaW50JzogJy4nLAorICAgICAgICAnZnJhY19kaWdpdHMnOiAyLAorICAgICAgICAnZ3JvdXBpbmcnOiBbMywgMywgMF0sCisgICAgICAgICdpbnRfY3Vycl9zeW1ib2wnOiAnVVNEICcsCisgICAgICAgICdpbnRfZnJhY19kaWdpdHMnOiAyLAorICAgICAgICAnbW9uX2RlY2ltYWxfcG9pbnQnOiAnLicsCisgICAgICAgICdtb25fZ3JvdXBpbmcnOiBbMywgMywgMF0sCisgICAgICAgICdtb25fdGhvdXNhbmRzX3NlcCc6ICcsJywKKyAgICAgICAgJ25fY3NfcHJlY2VkZXMnOiAxLAorICAgICAgICAnbl9zZXBfYnlfc3BhY2UnOiAwLAorICAgICAgICAnbl9zaWduX3Bvc24nOiAxLAorICAgICAgICAnbmVnYXRpdmVfc2lnbic6ICctJywKKyAgICAgICAgJ3BfY3NfcHJlY2VkZXMnOiAxLAorICAgICAgICAncF9zZXBfYnlfc3BhY2UnOiAwLAorICAgICAgICAncF9zaWduX3Bvc24nOiAxLAorICAgICAgICAncG9zaXRpdmVfc2lnbic6ICcnLAorICAgICAgICAndGhvdXNhbmRzX3NlcCc6ICcsJworICAgIH0KKworCitjbGFzcyBGckZSQ29va2VkVGVzdChCYXNlQ29va2VkVGVzdCk6CisgICAgIyBBIGNvb2tlZCAiZnJfRlIiIGxvY2FsZSB3aXRoIGEgc3BhY2UgY2hhcmFjdGVyIGFzIGRlY2ltYWwgc2VwYXJhdG9yCisgICAgIyBhbmQgYSBub24tQVNDSUkgY3VycmVuY3kgc3ltYm9sLgorCisgICAgY29va2VkX3ZhbHVlcyA9IHsKKyAgICAgICAgJ2N1cnJlbmN5X3N5bWJvbCc6ICdceGUyXHg4Mlx4YWMnLAorICAgICAgICAnZGVjaW1hbF9wb2ludCc6ICcsJywKKyAgICAgICAgJ2ZyYWNfZGlnaXRzJzogMiwKKyAgICAgICAgJ2dyb3VwaW5nJzogWzMsIDMsIDBdLAorICAgICAgICAnaW50X2N1cnJfc3ltYm9sJzogJ0VVUiAnLAorICAgICAgICAnaW50X2ZyYWNfZGlnaXRzJzogMiwKKyAgICAgICAgJ21vbl9kZWNpbWFsX3BvaW50JzogJywnLAorICAgICAgICAnbW9uX2dyb3VwaW5nJzogWzMsIDMsIDBdLAorICAgICAgICAnbW9uX3Rob3VzYW5kc19zZXAnOiAnICcsCisgICAgICAgICduX2NzX3ByZWNlZGVzJzogMCwKKyAgICAgICAgJ25fc2VwX2J5X3NwYWNlJzogMSwKKyAgICAgICAgJ25fc2lnbl9wb3NuJzogMSwKKyAgICAgICAgJ25lZ2F0aXZlX3NpZ24nOiAnLScsCisgICAgICAgICdwX2NzX3ByZWNlZGVzJzogMCwKKyAgICAgICAgJ3Bfc2VwX2J5X3NwYWNlJzogMSwKKyAgICAgICAgJ3Bfc2lnbl9wb3NuJzogMSwKKyAgICAgICAgJ3Bvc2l0aXZlX3NpZ24nOiAnJywKKyAgICAgICAgJ3Rob3VzYW5kc19zZXAnOiAnICcKKyAgICB9CisKKworY2xhc3MgQmFzZUZvcm1hdHRpbmdUZXN0KG9iamVjdCk6CisgICAgIworICAgICMgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIGZvcm1hdHRpbmcgdGVzdHMKKyAgICAjCisKKyAgICBkZWYgX3Rlc3RfZm9ybWF0ZnVuYyhzZWxmLCBmb3JtYXQsIHZhbHVlLCBvdXQsIGZ1bmMsICoqZm9ybWF0X29wdHMpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZnVuYyhmb3JtYXQsIHZhbHVlLCAqKmZvcm1hdF9vcHRzKSwgb3V0KQorCisgICAgZGVmIF90ZXN0X2Zvcm1hdChzZWxmLCBmb3JtYXQsIHZhbHVlLCBvdXQsICoqZm9ybWF0X29wdHMpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdGZ1bmMoZm9ybWF0LCB2YWx1ZSwgb3V0LAorICAgICAgICAgICAgZnVuYz1sb2NhbGUuZm9ybWF0LCAqKmZvcm1hdF9vcHRzKQorCisgICAgZGVmIF90ZXN0X2Zvcm1hdF9zdHJpbmcoc2VsZiwgZm9ybWF0LCB2YWx1ZSwgb3V0LCAqKmZvcm1hdF9vcHRzKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXRmdW5jKGZvcm1hdCwgdmFsdWUsIG91dCwKKyAgICAgICAgICAgIGZ1bmM9bG9jYWxlLmZvcm1hdF9zdHJpbmcsICoqZm9ybWF0X29wdHMpCisKKyAgICBkZWYgX3Rlc3RfY3VycmVuY3koc2VsZiwgdmFsdWUsIG91dCwgKipmb3JtYXRfb3B0cyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLmN1cnJlbmN5KHZhbHVlLCAqKmZvcm1hdF9vcHRzKSwgb3V0KQorCisKK2NsYXNzIEVuVVNOdW1iZXJGb3JtYXR0aW5nKEJhc2VGb3JtYXR0aW5nVGVzdCk6CisgICAgIyBYWFggdGhlcmUgaXMgYSBncm91cGluZyArIHBhZGRpbmcgYnVnIHdoZW4gdGhlIHRob3VzYW5kcyBzZXBhcmF0b3IKKyAgICAjIGlzIGVtcHR5IGJ1dCB0aGUgZ3JvdXBpbmcgYXJyYXkgY29udGFpbnMgdmFsdWVzIChlLmcuIFNvbGFyaXMgMTApCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2VwID0gbG9jYWxlLmxvY2FsZWNvbnYoKVsndGhvdXNhbmRzX3NlcCddCisKKyAgICBkZWYgdGVzdF9ncm91cGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiVmIiwgMTAyNCwgZ3JvdXBpbmc9MSwgb3V0PScxJXMwMjQuMDAwMDAwJyAlIHNlbGYuc2VwKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJWYiLCAxMDIsIGdyb3VwaW5nPTEsIG91dD0nMTAyLjAwMDAwMCcpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZiIsIC00MiwgZ3JvdXBpbmc9MSwgb3V0PSctNDIuMDAwMDAwJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUrZiIsIC00MiwgZ3JvdXBpbmc9MSwgb3V0PSctNDIuMDAwMDAwJykKKworICAgIGRlZiB0ZXN0X2dyb3VwaW5nX2FuZF9wYWRkaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTIwLmYiLCAtNDIsIGdyb3VwaW5nPTEsIG91dD0nLTQyJy5yanVzdCgyMCkpCisgICAgICAgIGlmIHNlbGYuc2VwOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUrMTAuZiIsIC00MjAwLCBncm91cGluZz0xLAorICAgICAgICAgICAgICAgIG91dD0oJy00JXMyMDAnICUgc2VsZi5zZXApLnJqdXN0KDEwKSkKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLTEwLmYiLCAtNDIwMCwgZ3JvdXBpbmc9MSwKKyAgICAgICAgICAgICAgICBvdXQ9KCctNCVzMjAwJyAlIHNlbGYuc2VwKS5sanVzdCgxMCkpCisKKyAgICBkZWYgdGVzdF9pbnRlZ2VyX2dyb3VwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJWQiLCA0MjAwLCBncm91cGluZz1UcnVlLCBvdXQ9JzQlczIwMCcgJSBzZWxmLnNlcCkKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUrZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nKzQlczIwMCcgJSBzZWxmLnNlcCkKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUrZCIsIC00MjAwLCBncm91cGluZz1UcnVlLCBvdXQ9Jy00JXMyMDAnICUgc2VsZi5zZXApCisKKyAgICBkZWYgdGVzdF9pbnRlZ2VyX2dyb3VwaW5nX2FuZF9wYWRkaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTEwZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsCisgICAgICAgICAgICBvdXQ9KCc0JXMyMDAnICUgc2VsZi5zZXApLnJqdXN0KDEwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtMTBkIiwgLTQyMDAsIGdyb3VwaW5nPVRydWUsCisgICAgICAgICAgICBvdXQ9KCctNCVzMjAwJyAlIHNlbGYuc2VwKS5sanVzdCgxMCkpCisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZiIsIDEwMjQsIGdyb3VwaW5nPTAsIG91dD0nMTAyNC4wMDAwMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJWYiLCAxMDIsIGdyb3VwaW5nPTAsIG91dD0nMTAyLjAwMDAwMCcpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZiIsIC00MiwgZ3JvdXBpbmc9MCwgb3V0PSctNDIuMDAwMDAwJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUrZiIsIC00MiwgZ3JvdXBpbmc9MCwgb3V0PSctNDIuMDAwMDAwJykKKworICAgIGRlZiB0ZXN0X3BhZGRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlMjAuZiIsIC00MiwgZ3JvdXBpbmc9MCwgb3V0PSctNDInLnJqdXN0KDIwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUrMTAuZiIsIC00MjAwLCBncm91cGluZz0wLCBvdXQ9Jy00MjAwJy5yanVzdCgxMCkpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLTEwLmYiLCA0MjAwLCBncm91cGluZz0wLCBvdXQ9JzQyMDAnLmxqdXN0KDEwKSkKKworICAgIGRlZiB0ZXN0X2NvbXBsZXhfZm9ybWF0dGluZyhzZWxmKToKKyAgICAgICAgIyBTcGFjZXMgaW4gZm9ybWF0dGluZyBzdHJpbmcKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXRfc3RyaW5nKCJPbmUgbWlsbGlvbiBpcyAlaSIsIDEwMDAwMDAsIGdyb3VwaW5nPTEsCisgICAgICAgICAgICBvdXQ9J09uZSBtaWxsaW9uIGlzIDElczAwMCVzMDAwJyAlIChzZWxmLnNlcCwgc2VsZi5zZXApKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdF9zdHJpbmcoIk9uZSAgbWlsbGlvbiBpcyAlaSIsIDEwMDAwMDAsIGdyb3VwaW5nPTEsCisgICAgICAgICAgICBvdXQ9J09uZSAgbWlsbGlvbiBpcyAxJXMwMDAlczAwMCcgJSAoc2VsZi5zZXAsIHNlbGYuc2VwKSkKKyAgICAgICAgIyBEb3RzIGluIGZvcm1hdHRpbmcgc3RyaW5nCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0X3N0cmluZygiLiVmLiIsIDEwMDAuMCwgb3V0PScuMTAwMC4wMDAwMDAuJykKKyAgICAgICAgIyBQYWRkaW5nCisgICAgICAgIGlmIHNlbGYuc2VwOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXRfc3RyaW5nKCItLT4gICUxMC4yZiIsIDQyMDAsIGdyb3VwaW5nPTEsCisgICAgICAgICAgICAgICAgb3V0PSctLT4gICcgKyAoJzQlczIwMC4wMCcgJSBzZWxmLnNlcCkucmp1c3QoMTApKQorICAgICAgICAjIEFzdGVyaXNrIGZvcm1hdHMKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXRfc3RyaW5nKCIlMTAuKmYiLCAoMiwgMTAwMCksIGdyb3VwaW5nPTAsCisgICAgICAgICAgICBvdXQ9JzEwMDAuMDAnLnJqdXN0KDEwKSkKKyAgICAgICAgaWYgc2VsZi5zZXA6CisgICAgICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdF9zdHJpbmcoIiUqLipmIiwgKDEwLCAyLCAxMDAwKSwgZ3JvdXBpbmc9MSwKKyAgICAgICAgICAgICAgICBvdXQ9KCcxJXMwMDAuMDAnICUgc2VsZi5zZXApLnJqdXN0KDEwKSkKKyAgICAgICAgIyBUZXN0IG1vcmUtaW4tb25lCisgICAgICAgIGlmIHNlbGYuc2VwOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXRfc3RyaW5nKCJpbnQgJWkgZmxvYXQgJS4yZiBzdHIgJXMiLAorICAgICAgICAgICAgICAgICgxMDAwLCAxMDAwLjAsICdzdHInKSwgZ3JvdXBpbmc9MSwKKyAgICAgICAgICAgICAgICBvdXQ9J2ludCAxJXMwMDAgZmxvYXQgMSVzMDAwLjAwIHN0ciBzdHInICUKKyAgICAgICAgICAgICAgICAoc2VsZi5zZXAsIHNlbGYuc2VwKSkKKworCitjbGFzcyBUZXN0Rm9ybWF0UGF0dGVybkFyZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IGhhbmRsaW5nIG9mIHBhdHRlcm4gYXJndW1lbnQgb2YgZm9ybWF0CisKKyAgICBkZWYgdGVzdF9vbmx5T25lUGF0dGVybihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAyNTIyOiBhY2NlcHQgZXhhY3RseSBvbmUgJSBwYXR0ZXJuLCBhbmQgbm8gZXh0cmEgY2hhcnMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvY2FsZS5mb3JtYXQsICIlZlxuIiwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvY2FsZS5mb3JtYXQsICIlZlxyIiwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvY2FsZS5mb3JtYXQsICIlZlxyXG4iLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9jYWxlLmZvcm1hdCwgIiAlZiIsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb2NhbGUuZm9ybWF0LCAiJWZnIiwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvY2FsZS5mb3JtYXQsICIlXmciLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9jYWxlLmZvcm1hdCwgIiVmJSUiLCAnZm9vJykKKworCitjbGFzcyBUZXN0TG9jYWxlRm9ybWF0U3RyaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJHZW5lcmFsIHRlc3RzIG9uIGxvY2FsZS5mb3JtYXRfc3RyaW5nIiIiCisKKyAgICBkZWYgdGVzdF9wZXJjZW50X2VzY2FwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbGUuZm9ybWF0X3N0cmluZygnJWYlJScsIDEuMCksICclZiUlJyAlIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbGUuZm9ybWF0X3N0cmluZygnJWQgJWYlJWQnLCAoMSwgMS4wKSksCisgICAgICAgICAgICAnJWQgJWYlJWQnICUgKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLmZvcm1hdF9zdHJpbmcoJyUoZm9vKXMgJSVkJywgeydmb28nOiAnYmFyJ30pLAorICAgICAgICAgICAgKCclKGZvbylzICUlZCcgJSB7J2Zvbyc6ICdiYXInfSkpCisKKyAgICBkZWYgdGVzdF9tYXBwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2FsZS5mb3JtYXRfc3RyaW5nKCclKGZvbylzIGJpbmcuJywgeydmb28nOiAnYmFyJ30pLAorICAgICAgICAgICAgKCclKGZvbylzIGJpbmcuJyAlIHsnZm9vJzogJ2Jhcid9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NhbGUuZm9ybWF0X3N0cmluZygnJShmb28pcycsIHsnZm9vJzogJ2Jhcid9KSwKKyAgICAgICAgICAgICgnJShmb28pcycgJSB7J2Zvbyc6ICdiYXInfSkpCisKKworCitjbGFzcyBUZXN0TnVtYmVyRm9ybWF0dGluZyhCYXNlTG9jYWxpemVkVGVzdCwgRW5VU051bWJlckZvcm1hdHRpbmcpOgorICAgICMgVGVzdCBudW1iZXIgZm9ybWF0dGluZyB3aXRoIGEgcmVhbCBFbmdsaXNoIGxvY2FsZS4KKworICAgIGxvY2FsZV90eXBlID0gbG9jYWxlLkxDX05VTUVSSUMKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgQmFzZUxvY2FsaXplZFRlc3Quc2V0VXAoc2VsZikKKyAgICAgICAgRW5VU051bWJlckZvcm1hdHRpbmcuc2V0VXAoc2VsZikKKworCitjbGFzcyBUZXN0RW5VU051bWJlckZvcm1hdHRpbmcoRW5VU0Nvb2tlZFRlc3QsIEVuVVNOdW1iZXJGb3JtYXR0aW5nKToKKyAgICAjIFRlc3QgbnVtYmVyIGZvcm1hdHRpbmcgd2l0aCBhIGNvb2tlZCAiZW5fVVMiIGxvY2FsZS4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgRW5VU0Nvb2tlZFRlc3Quc2V0VXAoc2VsZikKKyAgICAgICAgRW5VU051bWJlckZvcm1hdHRpbmcuc2V0VXAoc2VsZikKKworICAgIGRlZiB0ZXN0X2N1cnJlbmN5KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2N1cnJlbmN5KDUwMDAwLCAiJDUwMDAwLjAwIikKKyAgICAgICAgc2VsZi5fdGVzdF9jdXJyZW5jeSg1MDAwMCwgIiQ1MCwwMDAuMDAiLCBncm91cGluZz1UcnVlKQorICAgICAgICBzZWxmLl90ZXN0X2N1cnJlbmN5KDUwMDAwLCAiVVNEIDUwLDAwMC4wMCIsCisgICAgICAgICAgICBncm91cGluZz1UcnVlLCBpbnRlcm5hdGlvbmFsPVRydWUpCisKKworY2xhc3MgVGVzdENOdW1iZXJGb3JtYXR0aW5nKENDb29rZWRUZXN0LCBCYXNlRm9ybWF0dGluZ1Rlc3QpOgorICAgICMgVGVzdCBudW1iZXIgZm9ybWF0dGluZyB3aXRoIGEgY29va2VkICJDIiBsb2NhbGUuCisKKyAgICBkZWYgdGVzdF9ncm91cGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUuMmYiLCAxMjM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScxMjM0NS42NycpCisKKyAgICBkZWYgdGVzdF9ncm91cGluZ19hbmRfcGFkZGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiU5LjJmIiwgMTIzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nIDEyMzQ1LjY3JykKKworCitjbGFzcyBUZXN0RnJGUk51bWJlckZvcm1hdHRpbmcoRnJGUkNvb2tlZFRlc3QsIEJhc2VGb3JtYXR0aW5nVGVzdCk6CisgICAgIyBUZXN0IG51bWJlciBmb3JtYXR0aW5nIHdpdGggYSBjb29rZWQgImZyX0ZSIiBsb2NhbGUuCisKKyAgICBkZWYgdGVzdF9kZWNpbWFsX3BvaW50KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS4yZiIsIDEyMzQ1LjY3LCBvdXQ9JzEyMzQ1LDY3JykKKworICAgIGRlZiB0ZXN0X2dyb3VwaW5nKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS4yZiIsIDM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PSczNDUsNjcnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS4yZiIsIDEyMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JzEyIDM0NSw2NycpCisKKyAgICBkZWYgdGVzdF9ncm91cGluZ19hbmRfcGFkZGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiU2LjJmIiwgMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JzM0NSw2NycpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlNy4yZiIsIDM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScgMzQ1LDY3JykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiU4LjJmIiwgMTIzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nMTIgMzQ1LDY3JykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiU5LjJmIiwgMTIzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nMTIgMzQ1LDY3JykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUxMC4yZiIsIDEyMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JyAxMiAzNDUsNjcnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS02LjJmIiwgMzQ1LjY3LCBncm91cGluZz1UcnVlLCBvdXQ9JzM0NSw2NycpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLTcuMmYiLCAzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nMzQ1LDY3ICcpCisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlLTguMmYiLCAxMjM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScxMiAzNDUsNjcnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJS05LjJmIiwgMTIzNDUuNjcsIGdyb3VwaW5nPVRydWUsIG91dD0nMTIgMzQ1LDY3JykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtMTAuMmYiLCAxMjM0NS42NywgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScxMiAzNDUsNjcgJykKKworICAgIGRlZiB0ZXN0X2ludGVnZXJfZ3JvdXBpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlZCIsIDIwMCwgZ3JvdXBpbmc9VHJ1ZSwgb3V0PScyMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJWQiLCA0MjAwLCBncm91cGluZz1UcnVlLCBvdXQ9JzQgMjAwJykKKworICAgIGRlZiB0ZXN0X2ludGVnZXJfZ3JvdXBpbmdfYW5kX3BhZGRpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZm9ybWF0KCIlNGQiLCA0MjAwLCBncm91cGluZz1UcnVlLCBvdXQ9JzQgMjAwJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiU1ZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nNCAyMDAnKQorICAgICAgICBzZWxmLl90ZXN0X2Zvcm1hdCgiJTEwZCIsIDQyMDAsIGdyb3VwaW5nPVRydWUsIG91dD0nNCAyMDAnLnJqdXN0KDEwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtNGQiLCA0MjAwLCBncm91cGluZz1UcnVlLCBvdXQ9JzQgMjAwJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtNWQiLCA0MjAwLCBncm91cGluZz1UcnVlLCBvdXQ9JzQgMjAwJykKKyAgICAgICAgc2VsZi5fdGVzdF9mb3JtYXQoIiUtMTBkIiwgNDIwMCwgZ3JvdXBpbmc9VHJ1ZSwgb3V0PSc0IDIwMCcubGp1c3QoMTApKQorCisgICAgZGVmIHRlc3RfY3VycmVuY3koc2VsZik6CisgICAgICAgIGV1cm8gPSB1J1x1MjBhYycuZW5jb2RlKCd1dGYtOCcpCisgICAgICAgIHNlbGYuX3Rlc3RfY3VycmVuY3koNTAwMDAsICI1MDAwMCwwMCAiICsgZXVybykKKyAgICAgICAgc2VsZi5fdGVzdF9jdXJyZW5jeSg1MDAwMCwgIjUwIDAwMCwwMCAiICsgZXVybywgZ3JvdXBpbmc9VHJ1ZSkKKyAgICAgICAgIyBYWFggaXMgdGhlIHRyYWlsaW5nIHNwYWNlIGEgYnVnPworICAgICAgICBzZWxmLl90ZXN0X2N1cnJlbmN5KDUwMDAwLCAiNTAgMDAwLDAwIEVVUiAiLAorICAgICAgICAgICAgZ3JvdXBpbmc9VHJ1ZSwgaW50ZXJuYXRpb25hbD1UcnVlKQorCisKK2NsYXNzIFRlc3RTdHJpbmdNZXRob2RzKEJhc2VMb2NhbGl6ZWRUZXN0KToKKyAgICBsb2NhbGVfdHlwZSA9IGxvY2FsZS5MQ19DVFlQRQorCisgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdzdW5vczUnIGFuZCBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoIndpbiIpOgorICAgICAgICAjIFRlc3QgQlNEIFJ1bmUgbG9jYWxlJ3MgYnVnIGZvciBpc2N0eXBlIGZ1bmN0aW9ucy4KKworICAgICAgICBkZWYgdGVzdF9pc3NwYWNlKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgyMCcuaXNzcGFjZSgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhhMCcuaXNzcGFjZSgpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4YTEnLmlzc3BhY2UoKSwgRmFsc2UpCisKKyAgICAgICAgZGVmIHRlc3RfaXNhbHBoYShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4YzAnLmlzYWxwaGEoKSwgRmFsc2UpCisKKyAgICAgICAgZGVmIHRlc3RfaXNhbG51bShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4YzAnLmlzYWxudW0oKSwgRmFsc2UpCisKKyAgICAgICAgZGVmIHRlc3RfaXN1cHBlcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4YzAnLmlzdXBwZXIoKSwgRmFsc2UpCisKKyAgICAgICAgZGVmIHRlc3RfaXNsb3dlcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4YzAnLmlzbG93ZXIoKSwgRmFsc2UpCisKKyAgICAgICAgZGVmIHRlc3RfbG93ZXIoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGNjXHg4NScubG93ZXIoKSwgJ1x4Y2NceDg1JykKKworICAgICAgICBkZWYgdGVzdF91cHBlcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4ZWRceDk1XHhhMCcudXBwZXIoKSwgJ1x4ZWRceDk1XHhhMCcpCisKKyAgICAgICAgZGVmIHRlc3Rfc3RyaXAoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGVkXHg5NVx4YTAnLnN0cmlwKCksICdceGVkXHg5NVx4YTAnKQorCisgICAgICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhlY1x4YTBceGJjJy5zcGxpdCgpLCBbJ1x4ZWNceGEwXHhiYyddKQorCisKK2NsYXNzIFRlc3RNaXNjZWxsYW5lb3VzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9nZXRwcmVmZXJyZWRlbmNvZGluZyhzZWxmKToKKyAgICAgICAgIyBJbnZva2UgZ2V0cHJlZmVycmVkZW5jb2RpbmcgdG8gbWFrZSBzdXJlIGl0IGRvZXMgbm90IGNhdXNlIGV4Y2VwdGlvbnMuCisgICAgICAgIGVuYyA9IGxvY2FsZS5nZXRwcmVmZXJyZWRlbmNvZGluZygpCisgICAgICAgIGlmIGVuYzoKKyAgICAgICAgICAgICMgSWYgZW5jb2Rpbmcgbm9uLWVtcHR5LCBtYWtlIHN1cmUgaXQgaXMgdmFsaWQKKyAgICAgICAgICAgIGNvZGVjcy5sb29rdXAoZW5jKQorCisgICAgaWYgaGFzYXR0cihsb2NhbGUsICJzdHJjb2xsIik6CisgICAgICAgIGRlZiB0ZXN0X3N0cmNvbGxfMzMwMyhzZWxmKToKKyAgICAgICAgICAgICMgdGVzdCBjcmFzaGVyIGZyb20gYnVnICMzMzAzCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxvY2FsZS5zdHJjb2xsLCB1ImEiLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc2V0bG9jYWxlX2NhdGVnb3J5KHNlbGYpOgorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19BTEwpCisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUpCisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFKQorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19DT0xMQVRFKQorICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19NT05FVEFSWSkKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfTlVNRVJJQykKKworICAgICAgICAjIGNyYXNoZXIgZnJvbSBidWcgIzc0MTkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMobG9jYWxlLkVycm9yLCBsb2NhbGUuc2V0bG9jYWxlLCAxMjM0NSkKKworICAgIGRlZiB0ZXN0X2dldHNldGxvY2FsZV9pc3N1ZTE4MTMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE4MTM6IHNldHRpbmcgYW5kIGdldHRpbmcgdGhlIGxvY2FsZSB1bmRlciBhIFR1cmtpc2ggbG9jYWxlCisgICAgICAgIG9sZGxvY2FsZSA9IGxvY2FsZS5nZXRsb2NhbGUoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAobG9jYWxlLnNldGxvY2FsZSwgbG9jYWxlLkxDX0NUWVBFLCBvbGRsb2NhbGUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX0NUWVBFLCAndHJfVFInKQorICAgICAgICBleGNlcHQgbG9jYWxlLkVycm9yOgorICAgICAgICAgICAgIyBVbnN1cHBvcnRlZCBsb2NhbGUgb24gdGhpcyBzeXN0ZW0KKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3Rlc3QgbmVlZHMgVHVya2lzaCBsb2NhbGUnKQorICAgICAgICBsb2MgPSBsb2NhbGUuZ2V0bG9jYWxlKCkKKyAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfQ1RZUEUsIGxvYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2MsIGxvY2FsZS5nZXRsb2NhbGUoKSkKKworICAgIGRlZiB0ZXN0X25vcm1hbGl6ZV9pc3N1ZTEyNzUyKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxODEzIGNhdXNlZCBhIHJlZ3Jlc3Npb24gd2hlcmUgbG9jYWxlLm5vcm1hbGl6ZSgpIHdvdWxkIG5vCisgICAgICAgICMgbG9uZ2VyIGFjY2VwdCB1bmljb2RlIHN0cmluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLm5vcm1hbGl6ZSh1J2VuX1VTJyksICdlbl9VUy5JU084ODU5LTEnKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0cyA9IFsKKyAgICAgICAgVGVzdE1pc2NlbGxhbmVvdXMsCisgICAgICAgIFRlc3RGb3JtYXRQYXR0ZXJuQXJnLAorICAgICAgICBUZXN0TG9jYWxlRm9ybWF0U3RyaW5nLAorICAgICAgICBUZXN0RW5VU051bWJlckZvcm1hdHRpbmcsCisgICAgICAgIFRlc3RDTnVtYmVyRm9ybWF0dGluZywKKyAgICAgICAgVGVzdEZyRlJOdW1iZXJGb3JtYXR0aW5nLAorICAgIF0KKyAgICAjIFNraXBUZXN0IGNhbid0IGJlIHJhaXNlZCBpbnNpZGUgdW5pdHRlc3RzLCBoYW5kbGUgaXQgbWFudWFsbHkgaW5zdGVhZAorICAgIHRyeToKKyAgICAgICAgZ2V0X2VuVVNfbG9jYWxlKCkKKyAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3QgYXMgZToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJTb21lIHRlc3RzIHdpbGwgYmUgZGlzYWJsZWQ6ICVzIiAlIGUKKyAgICBlbHNlOgorICAgICAgICB0ZXN0cyArPSBbVGVzdE51bWJlckZvcm1hdHRpbmcsIFRlc3RTdHJpbmdNZXRob2RzXQorICAgIHJ1bl91bml0dGVzdCgqdGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2NhbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2NhbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvY2FsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2NhbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTE2YjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2NhbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2dnaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmM0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2dnaW5nLnB5CkBAIC0wLDAgKzEsMTk5NSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjCisjIENvcHlyaWdodCAyMDAxLTIwMTMgYnkgVmluYXkgU2FqaXAuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cworIyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsCisjIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKKyMgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisjIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgVmluYXkgU2FqaXAKKyMgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uCisjIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCisjIFZJTkFZIFNBSklQIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKKyMgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMCisjIFZJTkFZIFNBSklQIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgorIyBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIKKyMgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyMgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKworIiIiVGVzdCBoYXJuZXNzIGZvciB0aGUgbG9nZ2luZyBtb2R1bGUuIFJ1biBhbGwgdGVzdHMuCisKK0NvcHlyaWdodCAoQykgMjAwMS0yMDEzIFZpbmF5IFNhamlwLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIiIiCisKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbG9nZ2luZy5oYW5kbGVycworaW1wb3J0IGxvZ2dpbmcuY29uZmlnCisKK2ltcG9ydCBjb2RlY3MKK2ltcG9ydCBjUGlja2xlCitpbXBvcnQgY1N0cmluZ0lPCitpbXBvcnQgZ2MKK2ltcG9ydCBqc29uCitpbXBvcnQgb3MKK2ltcG9ydCByYW5kb20KK2ltcG9ydCByZQoraW1wb3J0IHNlbGVjdAoraW1wb3J0IHNvY2tldAorZnJvbSBTb2NrZXRTZXJ2ZXIgaW1wb3J0IFRocmVhZGluZ1RDUFNlcnZlciwgU3RyZWFtUmVxdWVzdEhhbmRsZXIKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2FwdHVyZWRfc3Rkb3V0LCBydW5fd2l0aF9sb2NhbGUsIHJ1bl91bml0dGVzdAoraW1wb3J0IHRleHR3cmFwCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCB3ZWFrcmVmCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKworY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiQmFzZSBjbGFzcyBmb3IgbG9nZ2luZyB0ZXN0cy4iIiIKKworICAgIGxvZ19mb3JtYXQgPSAiJShuYW1lKXMgLT4gJShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMiCisgICAgZXhwZWN0ZWRfbG9nX3BhdCA9IHIiXihbXHcuXSspIC0+IChbXHddKyk6IChbXGRdKykkIgorICAgIG1lc3NhZ2VfbnVtID0gMAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJTZXR1cCB0aGUgZGVmYXVsdCBsb2dnaW5nIHN0cmVhbSB0byBhbiBpbnRlcm5hbCBTdHJpbmdJTyBpbnN0YW5jZSwKKyAgICAgICAgc28gdGhhdCB3ZSBjYW4gZXhhbWluZSBsb2cgb3V0cHV0IGFzIHdlIHdhbnQuIiIiCisgICAgICAgIGxvZ2dlcl9kaWN0ID0gbG9nZ2luZy5nZXRMb2dnZXIoKS5tYW5hZ2VyLmxvZ2dlckRpY3QKKyAgICAgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNhdmVkX2hhbmRsZXJzID0gbG9nZ2luZy5faGFuZGxlcnMuY29weSgpCisgICAgICAgICAgICBzZWxmLnNhdmVkX2hhbmRsZXJfbGlzdCA9IGxvZ2dpbmcuX2hhbmRsZXJMaXN0WzpdCisgICAgICAgICAgICBzZWxmLnNhdmVkX2xvZ2dlcnMgPSBsb2dnZXJfZGljdC5jb3B5KCkKKyAgICAgICAgICAgIHNlbGYuc2F2ZWRfbGV2ZWxfbmFtZXMgPSBsb2dnaW5nLl9sZXZlbE5hbWVzLmNvcHkoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nZ2luZy5fcmVsZWFzZUxvY2soKQorCisgICAgICAgICMgU2V0IHR3byB1bnVzZWQgbG9nZ2Vyczogb25lIG5vbi1BU0NJSSBhbmQgb25lIFVuaWNvZGUuCisgICAgICAgICMgVGhpcyBpcyB0byB0ZXN0IGNvcnJlY3Qgb3BlcmF0aW9uIHdoZW4gc29ydGluZyBleGlzdGluZworICAgICAgICAjIGxvZ2dlcnMgaW4gdGhlIGNvbmZpZ3VyYXRpb24gY29kZS4gU2VlIGlzc3VlIDgyMDEuCisgICAgICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCJceGFiXHhkN1x4YmIiKQorICAgICAgICBsb2dnaW5nLmdldExvZ2dlcih1Ilx1MDEzZlx1MDBkNlx1MDA0NyIpCisKKyAgICAgICAgc2VsZi5yb290X2xvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCIiKQorICAgICAgICBzZWxmLm9yaWdpbmFsX2xvZ2dpbmdfbGV2ZWwgPSBzZWxmLnJvb3RfbG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkKKworICAgICAgICBzZWxmLnN0cmVhbSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5ERUJVRykKKyAgICAgICAgc2VsZi5yb290X2hkbHIgPSBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoc2VsZi5zdHJlYW0pCisgICAgICAgIHNlbGYucm9vdF9mb3JtYXR0ZXIgPSBsb2dnaW5nLkZvcm1hdHRlcihzZWxmLmxvZ19mb3JtYXQpCisgICAgICAgIHNlbGYucm9vdF9oZGxyLnNldEZvcm1hdHRlcihzZWxmLnJvb3RfZm9ybWF0dGVyKQorICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLmFkZEhhbmRsZXIoc2VsZi5yb290X2hkbHIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICIiIlJlbW92ZSBvdXIgbG9nZ2luZyBzdHJlYW0sIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBsb2dnaW5nCisgICAgICAgIGxldmVsLiIiIgorICAgICAgICBzZWxmLnN0cmVhbS5jbG9zZSgpCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIucmVtb3ZlSGFuZGxlcihzZWxmLnJvb3RfaGRscikKKyAgICAgICAgd2hpbGUgc2VsZi5yb290X2xvZ2dlci5oYW5kbGVyczoKKyAgICAgICAgICAgIGggPSBzZWxmLnJvb3RfbG9nZ2VyLmhhbmRsZXJzWzBdCisgICAgICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaCkKKyAgICAgICAgICAgIGguY2xvc2UoKQorICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLnNldExldmVsKHNlbGYub3JpZ2luYWxfbG9nZ2luZ19sZXZlbCkKKyAgICAgICAgbG9nZ2luZy5fYWNxdWlyZUxvY2soKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2dnaW5nLl9sZXZlbE5hbWVzLmNsZWFyKCkKKyAgICAgICAgICAgIGxvZ2dpbmcuX2xldmVsTmFtZXMudXBkYXRlKHNlbGYuc2F2ZWRfbGV2ZWxfbmFtZXMpCisgICAgICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy5jbGVhcigpCisgICAgICAgICAgICBsb2dnaW5nLl9oYW5kbGVycy51cGRhdGUoc2VsZi5zYXZlZF9oYW5kbGVycykKKyAgICAgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJMaXN0WzpdID0gc2VsZi5zYXZlZF9oYW5kbGVyX2xpc3QKKyAgICAgICAgICAgIGxvZ2dlckRpY3QgPSBsb2dnaW5nLmdldExvZ2dlcigpLm1hbmFnZXIubG9nZ2VyRGljdAorICAgICAgICAgICAgbG9nZ2VyRGljdC5jbGVhcigpCisgICAgICAgICAgICBsb2dnZXJEaWN0LnVwZGF0ZShzZWxmLnNhdmVkX2xvZ2dlcnMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCisKKyAgICBkZWYgYXNzZXJ0X2xvZ19saW5lcyhzZWxmLCBleHBlY3RlZF92YWx1ZXMsIHN0cmVhbT1Ob25lKToKKyAgICAgICAgIiIiTWF0Y2ggdGhlIGNvbGxlY3RlZCBsb2cgbGluZXMgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uCisgICAgICAgIHNlbGYuZXhwZWN0ZWRfbG9nX3BhdCwgYW5kIGNvbXBhcmUgdGhlIGV4dHJhY3RlZCBncm91cCB2YWx1ZXMgdG8KKyAgICAgICAgdGhlIGV4cGVjdGVkX3ZhbHVlcyBsaXN0IG9mIHR1cGxlcy4iIiIKKyAgICAgICAgc3RyZWFtID0gc3RyZWFtIG9yIHNlbGYuc3RyZWFtCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoc2VsZi5leHBlY3RlZF9sb2dfcGF0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdHJlYW0ucmVzZXQoKQorICAgICAgICAgICAgYWN0dWFsX2xpbmVzID0gc3RyZWFtLnJlYWRsaW5lcygpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICMgU3RyaW5nSU8uU3RyaW5nSU8gbGFja3MgYSByZXNldCgpIG1ldGhvZC4KKyAgICAgICAgICAgIGFjdHVhbF9saW5lcyA9IHN0cmVhbS5nZXR2YWx1ZSgpLnNwbGl0bGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhY3R1YWxfbGluZXMpLCBsZW4oZXhwZWN0ZWRfdmFsdWVzKSkKKyAgICAgICAgZm9yIGFjdHVhbCwgZXhwZWN0ZWQgaW4gemlwKGFjdHVhbF9saW5lcywgZXhwZWN0ZWRfdmFsdWVzKToKKyAgICAgICAgICAgIG1hdGNoID0gcGF0LnNlYXJjaChhY3R1YWwpCisgICAgICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJMb2cgbGluZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBwYXR0ZXJuOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShtYXRjaC5ncm91cHMoKSksIGV4cGVjdGVkKQorICAgICAgICBzID0gc3RyZWFtLnJlYWQoKQorICAgICAgICBpZiBzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJSZW1haW5pbmcgb3V0cHV0IGF0IGVuZCBvZiBsb2cgc3RyZWFtOlxuIiArIHMpCisKKyAgICBkZWYgbmV4dF9tZXNzYWdlKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBhIG1lc3NhZ2UgY29uc2lzdGluZyBzb2xlbHkgb2YgYW4gYXV0by1pbmNyZW1lbnRpbmcKKyAgICAgICAgaW50ZWdlci4iIiIKKyAgICAgICAgc2VsZi5tZXNzYWdlX251bSArPSAxCisgICAgICAgIHJldHVybiAiJWQiICUgc2VsZi5tZXNzYWdlX251bQorCisKK2NsYXNzIEJ1aWx0aW5MZXZlbHNUZXN0KEJhc2VUZXN0KToKKyAgICAiIiJUZXN0IGJ1aWx0aW4gbGV2ZWxzIGFuZCB0aGVpciBpbmhlcml0YW5jZS4iIiIKKworICAgIGRlZiB0ZXN0X2ZsYXQoc2VsZik6CisgICAgICAgICNMb2dnaW5nIGxldmVscyBpbiBhIGZsYXQgbG9nZ2VyIG5hbWVzcGFjZS4KKyAgICAgICAgbSA9IHNlbGYubmV4dF9tZXNzYWdlCisKKyAgICAgICAgRVJSID0gbG9nZ2luZy5nZXRMb2dnZXIoIkVSUiIpCisgICAgICAgIEVSUi5zZXRMZXZlbChsb2dnaW5nLkVSUk9SKQorICAgICAgICBJTkYgPSBsb2dnaW5nLmdldExvZ2dlcigiSU5GIikKKyAgICAgICAgSU5GLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICAgICAgREVCID0gbG9nZ2luZy5nZXRMb2dnZXIoIkRFQiIpCisgICAgICAgIERFQi5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorCisgICAgICAgICMgVGhlc2Ugc2hvdWxkIGxvZy4KKyAgICAgICAgRVJSLmxvZyhsb2dnaW5nLkNSSVRJQ0FMLCBtKCkpCisgICAgICAgIEVSUi5lcnJvcihtKCkpCisKKyAgICAgICAgSU5GLmxvZyhsb2dnaW5nLkNSSVRJQ0FMLCBtKCkpCisgICAgICAgIElORi5lcnJvcihtKCkpCisgICAgICAgIElORi53YXJuKG0oKSkKKyAgICAgICAgSU5GLmluZm8obSgpKQorCisgICAgICAgIERFQi5sb2cobG9nZ2luZy5DUklUSUNBTCwgbSgpKQorICAgICAgICBERUIuZXJyb3IobSgpKQorICAgICAgICBERUIud2FybiAobSgpKQorICAgICAgICBERUIuaW5mbyAobSgpKQorICAgICAgICBERUIuZGVidWcobSgpKQorCisgICAgICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBsb2cuCisgICAgICAgIEVSUi53YXJuKG0oKSkKKyAgICAgICAgRVJSLmluZm8obSgpKQorICAgICAgICBFUlIuZGVidWcobSgpKQorCisgICAgICAgIElORi5kZWJ1ZyhtKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICgnRVJSJywgJ0NSSVRJQ0FMJywgJzEnKSwKKyAgICAgICAgICAgICgnRVJSJywgJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgICgnSU5GJywgJ0NSSVRJQ0FMJywgJzMnKSwKKyAgICAgICAgICAgICgnSU5GJywgJ0VSUk9SJywgJzQnKSwKKyAgICAgICAgICAgICgnSU5GJywgJ1dBUk5JTkcnLCAnNScpLAorICAgICAgICAgICAgKCdJTkYnLCAnSU5GTycsICc2JyksCisgICAgICAgICAgICAoJ0RFQicsICdDUklUSUNBTCcsICc3JyksCisgICAgICAgICAgICAoJ0RFQicsICdFUlJPUicsICc4JyksCisgICAgICAgICAgICAoJ0RFQicsICdXQVJOSU5HJywgJzknKSwKKyAgICAgICAgICAgICgnREVCJywgJ0lORk8nLCAnMTAnKSwKKyAgICAgICAgICAgICgnREVCJywgJ0RFQlVHJywgJzExJyksCisgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfZXhwbGljaXQoc2VsZik6CisgICAgICAgICMgTG9nZ2luZyBsZXZlbHMgaW4gYSBuZXN0ZWQgbmFtZXNwYWNlLCBhbGwgZXhwbGljaXRseSBzZXQuCisgICAgICAgIG0gPSBzZWxmLm5leHRfbWVzc2FnZQorCisgICAgICAgIElORiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJJTkYiKQorICAgICAgICBJTkYuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgICAgICBJTkZfRVJSICA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJJTkYuRVJSIikKKyAgICAgICAgSU5GX0VSUi5zZXRMZXZlbChsb2dnaW5nLkVSUk9SKQorCisgICAgICAgICMgVGhlc2Ugc2hvdWxkIGxvZy4KKyAgICAgICAgSU5GX0VSUi5sb2cobG9nZ2luZy5DUklUSUNBTCwgbSgpKQorICAgICAgICBJTkZfRVJSLmVycm9yKG0oKSkKKworICAgICAgICAjIFRoZXNlIHNob3VsZCBub3QgbG9nLgorICAgICAgICBJTkZfRVJSLndhcm4obSgpKQorICAgICAgICBJTkZfRVJSLmluZm8obSgpKQorICAgICAgICBJTkZfRVJSLmRlYnVnKG0oKSkKKworICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgKCdJTkYuRVJSJywgJ0NSSVRJQ0FMJywgJzEnKSwKKyAgICAgICAgICAgICgnSU5GLkVSUicsICdFUlJPUicsICcyJyksCisgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfaW5oZXJpdGVkKHNlbGYpOgorICAgICAgICAjTG9nZ2luZyBsZXZlbHMgaW4gYSBuZXN0ZWQgbmFtZXNwYWNlLCBpbmhlcml0ZWQgZnJvbSBwYXJlbnQgbG9nZ2Vycy4KKyAgICAgICAgbSA9IHNlbGYubmV4dF9tZXNzYWdlCisKKyAgICAgICAgSU5GID0gbG9nZ2luZy5nZXRMb2dnZXIoIklORiIpCisgICAgICAgIElORi5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgICAgIElORl9FUlIgID0gbG9nZ2luZy5nZXRMb2dnZXIoIklORi5FUlIiKQorICAgICAgICBJTkZfRVJSLnNldExldmVsKGxvZ2dpbmcuRVJST1IpCisgICAgICAgIElORl9VTkRFRiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJJTkYuVU5ERUYiKQorICAgICAgICBJTkZfRVJSX1VOREVGID0gbG9nZ2luZy5nZXRMb2dnZXIoIklORi5FUlIuVU5ERUYiKQorICAgICAgICBVTkRFRiA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJVTkRFRiIpCisKKyAgICAgICAgIyBUaGVzZSBzaG91bGQgbG9nLgorICAgICAgICBJTkZfVU5ERUYubG9nKGxvZ2dpbmcuQ1JJVElDQUwsIG0oKSkKKyAgICAgICAgSU5GX1VOREVGLmVycm9yKG0oKSkKKyAgICAgICAgSU5GX1VOREVGLndhcm4obSgpKQorICAgICAgICBJTkZfVU5ERUYuaW5mbyhtKCkpCisgICAgICAgIElORl9FUlJfVU5ERUYubG9nKGxvZ2dpbmcuQ1JJVElDQUwsIG0oKSkKKyAgICAgICAgSU5GX0VSUl9VTkRFRi5lcnJvcihtKCkpCisKKyAgICAgICAgIyBUaGVzZSBzaG91bGQgbm90IGxvZy4KKyAgICAgICAgSU5GX1VOREVGLmRlYnVnKG0oKSkKKyAgICAgICAgSU5GX0VSUl9VTkRFRi53YXJuKG0oKSkKKyAgICAgICAgSU5GX0VSUl9VTkRFRi5pbmZvKG0oKSkKKyAgICAgICAgSU5GX0VSUl9VTkRFRi5kZWJ1ZyhtKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ0NSSVRJQ0FMJywgJzEnKSwKKyAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ1dBUk5JTkcnLCAnMycpLAorICAgICAgICAgICAgKCdJTkYuVU5ERUYnLCAnSU5GTycsICc0JyksCisgICAgICAgICAgICAoJ0lORi5FUlIuVU5ERUYnLCAnQ1JJVElDQUwnLCAnNScpLAorICAgICAgICAgICAgKCdJTkYuRVJSLlVOREVGJywgJ0VSUk9SJywgJzYnKSwKKyAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X25lc3RlZF93aXRoX3ZpcnR1YWxfcGFyZW50KHNlbGYpOgorICAgICAgICAjIExvZ2dpbmcgbGV2ZWxzIHdoZW4gc29tZSBwYXJlbnQgZG9lcyBub3QgZXhpc3QgeWV0LgorICAgICAgICBtID0gc2VsZi5uZXh0X21lc3NhZ2UKKworICAgICAgICBJTkYgPSBsb2dnaW5nLmdldExvZ2dlcigiSU5GIikKKyAgICAgICAgR1JBTkRDSElMRCA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJJTkYuQkFEUEFSRU5ULlVOREVGIikKKyAgICAgICAgQ0hJTEQgPSBsb2dnaW5nLmdldExvZ2dlcigiSU5GLkJBRFBBUkVOVCIpCisgICAgICAgIElORi5zZXRMZXZlbChsb2dnaW5nLklORk8pCisKKyAgICAgICAgIyBUaGVzZSBzaG91bGQgbG9nLgorICAgICAgICBHUkFORENISUxELmxvZyhsb2dnaW5nLkZBVEFMLCBtKCkpCisgICAgICAgIEdSQU5EQ0hJTEQuaW5mbyhtKCkpCisgICAgICAgIENISUxELmxvZyhsb2dnaW5nLkZBVEFMLCBtKCkpCisgICAgICAgIENISUxELmluZm8obSgpKQorCisgICAgICAgICMgVGhlc2Ugc2hvdWxkIG5vdCBsb2cuCisgICAgICAgIEdSQU5EQ0hJTEQuZGVidWcobSgpKQorICAgICAgICBDSElMRC5kZWJ1ZyhtKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICgnSU5GLkJBRFBBUkVOVC5VTkRFRicsICdDUklUSUNBTCcsICcxJyksCisgICAgICAgICAgICAoJ0lORi5CQURQQVJFTlQuVU5ERUYnLCAnSU5GTycsICcyJyksCisgICAgICAgICAgICAoJ0lORi5CQURQQVJFTlQnLCAnQ1JJVElDQUwnLCAnMycpLAorICAgICAgICAgICAgKCdJTkYuQkFEUEFSRU5UJywgJ0lORk8nLCAnNCcpLAorICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9uYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxvZ2dpbmcuZ2V0TG9nZ2VyLCBhbnkpCisKK2NsYXNzIEJhc2ljRmlsdGVyVGVzdChCYXNlVGVzdCk6CisKKyAgICAiIiJUZXN0IHRoZSBidW5kbGVkIEZpbHRlciBjbGFzcy4iIiIKKworICAgIGRlZiB0ZXN0X2ZpbHRlcihzZWxmKToKKyAgICAgICAgIyBPbmx5IG1lc3NhZ2VzIHNhdGlzZnlpbmcgdGhlIHNwZWNpZmllZCBjcml0ZXJpYSBwYXNzIHRocm91Z2ggdGhlCisgICAgICAgICMgIGZpbHRlci4KKyAgICAgICAgZmlsdGVyXyA9IGxvZ2dpbmcuRmlsdGVyKCJzcGFtLmVnZ3MiKQorICAgICAgICBoYW5kbGVyID0gc2VsZi5yb290X2xvZ2dlci5oYW5kbGVyc1swXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYW5kbGVyLmFkZEZpbHRlcihmaWx0ZXJfKQorICAgICAgICAgICAgc3BhbSA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJzcGFtIikKKyAgICAgICAgICAgIHNwYW1fZWdncyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJzcGFtLmVnZ3MiKQorICAgICAgICAgICAgc3BhbV9lZ2dzX2Zpc2ggPSBsb2dnaW5nLmdldExvZ2dlcigic3BhbS5lZ2dzLmZpc2giKQorICAgICAgICAgICAgc3BhbV9iYWtlZGJlYW5zID0gbG9nZ2luZy5nZXRMb2dnZXIoInNwYW0uYmFrZWRiZWFucyIpCisKKyAgICAgICAgICAgIHNwYW0uaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc3BhbV9lZ2dzLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkgICMgR29vZC4KKyAgICAgICAgICAgIHNwYW1fZWdnc19maXNoLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkgICMgR29vZC4KKyAgICAgICAgICAgIHNwYW1fYmFrZWRiZWFucy5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdzcGFtLmVnZ3MnLCAnSU5GTycsICcyJyksCisgICAgICAgICAgICAgICAgKCdzcGFtLmVnZ3MuZmlzaCcsICdJTkZPJywgJzMnKSwKKyAgICAgICAgICAgIF0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBoYW5kbGVyLnJlbW92ZUZpbHRlcihmaWx0ZXJfKQorCisKKyMKKyMgICBGaXJzdCwgd2UgZGVmaW5lIG91ciBsZXZlbHMuIFRoZXJlIGNhbiBiZSBhcyBtYW55IGFzIHlvdSB3YW50IC0gdGhlIG9ubHkKKyMgICAgIGxpbWl0YXRpb25zIGFyZSB0aGF0IHRoZXkgc2hvdWxkIGJlIGludGVnZXJzLCB0aGUgbG93ZXN0IHNob3VsZCBiZSA+IDAgYW5kCisjICAgbGFyZ2VyIHZhbHVlcyBtZWFuIGxlc3MgaW5mb3JtYXRpb24gYmVpbmcgbG9nZ2VkLiBJZiB5b3UgbmVlZCBzcGVjaWZpYworIyAgIGxldmVsIHZhbHVlcyB3aGljaCBkbyBub3QgZml0IGludG8gdGhlc2UgbGltaXRhdGlvbnMsIHlvdSBjYW4gdXNlIGEKKyMgICBtYXBwaW5nIGRpY3Rpb25hcnkgdG8gY29udmVydCBiZXR3ZWVuIHlvdXIgYXBwbGljYXRpb24gbGV2ZWxzIGFuZCB0aGUKKyMgICBsb2dnaW5nIHN5c3RlbS4KKyMKK1NJTEVOVCAgICAgID0gMTIwCitUQUNJVFVSTiAgICA9IDExOQorVEVSU0UgICAgICAgPSAxMTgKK0VGRlVTSVZFICAgID0gMTE3CitTT0NJQUJMRSAgICA9IDExNgorVkVSQk9TRSAgICAgPSAxMTUKK1RBTEtBVElWRSAgID0gMTE0CitHQVJSVUxPVVMgICA9IDExMworQ0hBVFRFUkJPWCAgPSAxMTIKK0JPUklORyAgICAgID0gMTExCisKK0xFVkVMX1JBTkdFID0gcmFuZ2UoQk9SSU5HLCBTSUxFTlQgKyAxKQorCisjCisjICAgTmV4dCwgd2UgZGVmaW5lIG5hbWVzIGZvciBvdXIgbGV2ZWxzLiBZb3UgZG9uJ3QgbmVlZCB0byBkbyB0aGlzIC0gaW4gd2hpY2gKKyMgICBjYXNlIHRoZSBzeXN0ZW0gd2lsbCB1c2UgIkxldmVsIG4iIHRvIGRlbm90ZSB0aGUgdGV4dCBmb3IgdGhlIGxldmVsLgorIworbXlfbG9nZ2luZ19sZXZlbHMgPSB7CisgICAgU0lMRU5UICAgICAgOiAnU2lsZW50JywKKyAgICBUQUNJVFVSTiAgICA6ICdUYWNpdHVybicsCisgICAgVEVSU0UgICAgICAgOiAnVGVyc2UnLAorICAgIEVGRlVTSVZFICAgIDogJ0VmZnVzaXZlJywKKyAgICBTT0NJQUJMRSAgICA6ICdTb2NpYWJsZScsCisgICAgVkVSQk9TRSAgICAgOiAnVmVyYm9zZScsCisgICAgVEFMS0FUSVZFICAgOiAnVGFsa2F0aXZlJywKKyAgICBHQVJSVUxPVVMgICA6ICdHYXJydWxvdXMnLAorICAgIENIQVRURVJCT1ggIDogJ0NoYXR0ZXJib3gnLAorICAgIEJPUklORyAgICAgIDogJ0JvcmluZycsCit9CisKK2NsYXNzIEdhcnJ1bG91c0ZpbHRlcihsb2dnaW5nLkZpbHRlcik6CisKKyAgICAiIiJBIGZpbHRlciB3aGljaCBibG9ja3MgZ2FycnVsb3VzIG1lc3NhZ2VzLiIiIgorCisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICByZXR1cm4gcmVjb3JkLmxldmVsbm8gIT0gR0FSUlVMT1VTCisKK2NsYXNzIFZlcnlTcGVjaWZpY0ZpbHRlcihsb2dnaW5nLkZpbHRlcik6CisKKyAgICAiIiJBIGZpbHRlciB3aGljaCBibG9ja3Mgc29jaWFibGUgYW5kIHRhY2l0dXJuIG1lc3NhZ2VzLiIiIgorCisgICAgZGVmIGZpbHRlcihzZWxmLCByZWNvcmQpOgorICAgICAgICByZXR1cm4gcmVjb3JkLmxldmVsbm8gbm90IGluIFtTT0NJQUJMRSwgVEFDSVRVUk5dCisKKworY2xhc3MgQ3VzdG9tTGV2ZWxzQW5kRmlsdGVyc1Rlc3QoQmFzZVRlc3QpOgorCisgICAgIiIiVGVzdCB2YXJpb3VzIGZpbHRlcmluZyBwb3NzaWJpbGl0aWVzIHdpdGggY3VzdG9tIGxvZ2dpbmcgbGV2ZWxzLiIiIgorCisgICAgIyBTa2lwIHRoZSBsb2dnZXIgbmFtZSBncm91cC4KKyAgICBleHBlY3RlZF9sb2dfcGF0ID0gciJeW1x3Ll0rIC0+IChbXHddKyk6IChbXGRdKykkIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBCYXNlVGVzdC5zZXRVcChzZWxmKQorICAgICAgICBmb3IgaywgdiBpbiBteV9sb2dnaW5nX2xldmVscy5pdGVtcygpOgorICAgICAgICAgICAgbG9nZ2luZy5hZGRMZXZlbE5hbWUoaywgdikKKworICAgIGRlZiBsb2dfYXRfYWxsX2xldmVscyhzZWxmLCBsb2dnZXIpOgorICAgICAgICBmb3IgbHZsIGluIExFVkVMX1JBTkdFOgorICAgICAgICAgICAgbG9nZ2VyLmxvZyhsdmwsIHNlbGYubmV4dF9tZXNzYWdlKCkpCisKKyAgICBkZWYgdGVzdF9sb2dnZXJfZmlsdGVyKHNlbGYpOgorICAgICAgICAjIEZpbHRlciBhdCBsb2dnZXIgbGV2ZWwuCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuc2V0TGV2ZWwoVkVSQk9TRSkKKyAgICAgICAgIyBMZXZlbHMgPj0gJ1ZlcmJvc2UnIGFyZSBnb29kLgorICAgICAgICBzZWxmLmxvZ19hdF9hbGxfbGV2ZWxzKHNlbGYucm9vdF9sb2dnZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAoJ1ZlcmJvc2UnLCAnNScpLAorICAgICAgICAgICAgKCdTb2NpYWJsZScsICc2JyksCisgICAgICAgICAgICAoJ0VmZnVzaXZlJywgJzcnKSwKKyAgICAgICAgICAgICgnVGVyc2UnLCAnOCcpLAorICAgICAgICAgICAgKCdUYWNpdHVybicsICc5JyksCisgICAgICAgICAgICAoJ1NpbGVudCcsICcxMCcpLAorICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfaGFuZGxlcl9maWx0ZXIoc2VsZik6CisgICAgICAgICMgRmlsdGVyIGF0IGhhbmRsZXIgbGV2ZWwuCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuaGFuZGxlcnNbMF0uc2V0TGV2ZWwoU09DSUFCTEUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgTGV2ZWxzID49ICdTb2NpYWJsZScgYXJlIGdvb2QuCisgICAgICAgICAgICBzZWxmLmxvZ19hdF9hbGxfbGV2ZWxzKHNlbGYucm9vdF9sb2dnZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnU29jaWFibGUnLCAnNicpLAorICAgICAgICAgICAgICAgICgnRWZmdXNpdmUnLCAnNycpLAorICAgICAgICAgICAgICAgICgnVGVyc2UnLCAnOCcpLAorICAgICAgICAgICAgICAgICgnVGFjaXR1cm4nLCAnOScpLAorICAgICAgICAgICAgICAgICgnU2lsZW50JywgJzEwJyksCisgICAgICAgICAgICBdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yb290X2xvZ2dlci5oYW5kbGVyc1swXS5zZXRMZXZlbChsb2dnaW5nLk5PVFNFVCkKKworICAgIGRlZiB0ZXN0X3NwZWNpZmljX2ZpbHRlcnMoc2VsZik6CisgICAgICAgICMgU2V0IGEgc3BlY2lmaWMgZmlsdGVyIG9iamVjdCBvbiB0aGUgaGFuZGxlciwgYW5kIHRoZW4gYWRkIGFub3RoZXIKKyAgICAgICAgIyAgZmlsdGVyIG9iamVjdCBvbiB0aGUgbG9nZ2VyIGl0c2VsZi4KKyAgICAgICAgaGFuZGxlciA9IHNlbGYucm9vdF9sb2dnZXIuaGFuZGxlcnNbMF0KKyAgICAgICAgc3BlY2lmaWNfZmlsdGVyID0gTm9uZQorICAgICAgICBnYXJyID0gR2FycnVsb3VzRmlsdGVyKCkKKyAgICAgICAgaGFuZGxlci5hZGRGaWx0ZXIoZ2FycikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5sb2dfYXRfYWxsX2xldmVscyhzZWxmLnJvb3RfbG9nZ2VyKQorICAgICAgICAgICAgZmlyc3RfbGluZXMgPSBbCisgICAgICAgICAgICAgICAgIyBOb3RpY2UgaG93ICdHYXJydWxvdXMnIGlzIG1pc3NpbmcKKyAgICAgICAgICAgICAgICAoJ0JvcmluZycsICcxJyksCisgICAgICAgICAgICAgICAgKCdDaGF0dGVyYm94JywgJzInKSwKKyAgICAgICAgICAgICAgICAoJ1RhbGthdGl2ZScsICc0JyksCisgICAgICAgICAgICAgICAgKCdWZXJib3NlJywgJzUnKSwKKyAgICAgICAgICAgICAgICAoJ1NvY2lhYmxlJywgJzYnKSwKKyAgICAgICAgICAgICAgICAoJ0VmZnVzaXZlJywgJzcnKSwKKyAgICAgICAgICAgICAgICAoJ1RlcnNlJywgJzgnKSwKKyAgICAgICAgICAgICAgICAoJ1RhY2l0dXJuJywgJzknKSwKKyAgICAgICAgICAgICAgICAoJ1NpbGVudCcsICcxMCcpLAorICAgICAgICAgICAgXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGZpcnN0X2xpbmVzKQorCisgICAgICAgICAgICBzcGVjaWZpY19maWx0ZXIgPSBWZXJ5U3BlY2lmaWNGaWx0ZXIoKQorICAgICAgICAgICAgc2VsZi5yb290X2xvZ2dlci5hZGRGaWx0ZXIoc3BlY2lmaWNfZmlsdGVyKQorICAgICAgICAgICAgc2VsZi5sb2dfYXRfYWxsX2xldmVscyhzZWxmLnJvb3RfbG9nZ2VyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGZpcnN0X2xpbmVzICsgWworICAgICAgICAgICAgICAgICMgTm90IG9ubHkgJ0dhcnJ1bG91cycgaXMgc3RpbGwgbWlzc2luZywgYnV0IGFsc28gJ1NvY2lhYmxlJworICAgICAgICAgICAgICAgICMgYW5kICdUYWNpdHVybicKKyAgICAgICAgICAgICAgICAoJ0JvcmluZycsICcxMScpLAorICAgICAgICAgICAgICAgICgnQ2hhdHRlcmJveCcsICcxMicpLAorICAgICAgICAgICAgICAgICgnVGFsa2F0aXZlJywgJzE0JyksCisgICAgICAgICAgICAgICAgKCdWZXJib3NlJywgJzE1JyksCisgICAgICAgICAgICAgICAgKCdFZmZ1c2l2ZScsICcxNycpLAorICAgICAgICAgICAgICAgICgnVGVyc2UnLCAnMTgnKSwKKyAgICAgICAgICAgICAgICAoJ1NpbGVudCcsICcyMCcpLAorICAgICAgICBdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgc3BlY2lmaWNfZmlsdGVyOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdF9sb2dnZXIucmVtb3ZlRmlsdGVyKHNwZWNpZmljX2ZpbHRlcikKKyAgICAgICAgICAgIGhhbmRsZXIucmVtb3ZlRmlsdGVyKGdhcnIpCisKKworY2xhc3MgTWVtb3J5SGFuZGxlclRlc3QoQmFzZVRlc3QpOgorCisgICAgIiIiVGVzdHMgZm9yIHRoZSBNZW1vcnlIYW5kbGVyLiIiIgorCisgICAgIyBEbyBub3QgYm90aGVyIHdpdGggYSBsb2dnZXIgbmFtZSBncm91cC4KKyAgICBleHBlY3RlZF9sb2dfcGF0ID0gciJeW1x3Ll0rIC0+IChbXHddKyk6IChbXGRdKykkIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBCYXNlVGVzdC5zZXRVcChzZWxmKQorICAgICAgICBzZWxmLm1lbV9oZGxyID0gbG9nZ2luZy5oYW5kbGVycy5NZW1vcnlIYW5kbGVyKDEwLCBsb2dnaW5nLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucm9vdF9oZGxyKQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcignbWVtJykKKyAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLnByb3BhZ2F0ZSA9IDAKKyAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmFkZEhhbmRsZXIoc2VsZi5tZW1faGRscikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5tZW1faGRsci5jbG9zZSgpCisgICAgICAgIEJhc2VUZXN0LnRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgdGVzdF9mbHVzaChzZWxmKToKKyAgICAgICAgIyBUaGUgbWVtb3J5IGhhbmRsZXIgZmx1c2hlcyB0byBpdHMgdGFyZ2V0IGhhbmRsZXIgYmFzZWQgb24gc3BlY2lmaWMKKyAgICAgICAgIyAgY3JpdGVyaWEgKG1lc3NhZ2UgY291bnQgYW5kIG1lc3NhZ2UgbGV2ZWwpLgorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICBzZWxmLm1lbV9sb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgICMgVGhpcyB3aWxsIGZsdXNoIGJlY2F1c2UgdGhlIGxldmVsIGlzID49IGxvZ2dpbmcuV0FSTklORworICAgICAgICBzZWxmLm1lbV9sb2dnZXIud2FybihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBsaW5lcyA9IFsKKyAgICAgICAgICAgICgnREVCVUcnLCAnMScpLAorICAgICAgICAgICAgKCdJTkZPJywgJzInKSwKKyAgICAgICAgICAgICgnV0FSTklORycsICczJyksCisgICAgICAgIF0KKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKQorICAgICAgICBmb3IgbiBpbiAoNCwgMTQpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOSk6CisgICAgICAgICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpCisgICAgICAgICAgICAjIFRoaXMgd2lsbCBmbHVzaCBiZWNhdXNlIGl0J3MgdGhlIDEwdGggbWVzc2FnZSBzaW5jZSB0aGUgbGFzdAorICAgICAgICAgICAgIyAgZmx1c2guCisgICAgICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxpbmVzID0gbGluZXMgKyBbKCdERUJVRycsIHN0cihpKSkgZm9yIGkgaW4gcmFuZ2UobiwgbiArIDEwKV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykKKworICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKQorCisKK2NsYXNzIEV4Y2VwdGlvbkZvcm1hdHRlcihsb2dnaW5nLkZvcm1hdHRlcik6CisgICAgIiIiQSBzcGVjaWFsIGV4Y2VwdGlvbiBmb3JtYXR0ZXIuIiIiCisgICAgZGVmIGZvcm1hdEV4Y2VwdGlvbihzZWxmLCBlaSk6CisgICAgICAgIHJldHVybiAiR290IGEgWyVzXSIgJSBlaVswXS5fX25hbWVfXworCisKK2NsYXNzIENvbmZpZ0ZpbGVUZXN0KEJhc2VUZXN0KToKKworICAgICIiIlJlYWRpbmcgbG9nZ2luZyBjb25maWcgZnJvbSBhIC5pbmktc3R5bGUgY29uZmlnIGZpbGUuIiIiCisKKyAgICBleHBlY3RlZF9sb2dfcGF0ID0gciJeKFtcd10rKSBcK1wrIChbXHddKykkIgorCisgICAgIyBjb25maWcwIGlzIGEgc3RhbmRhcmQgY29uZmlndXJhdGlvbi4KKyAgICBjb25maWcwID0gIiIiCisgICAgW2xvZ2dlcnNdCisgICAga2V5cz1yb290CisKKyAgICBbaGFuZGxlcnNdCisgICAga2V5cz1oYW5kMQorCisgICAgW2Zvcm1hdHRlcnNdCisgICAga2V5cz1mb3JtMQorCisgICAgW2xvZ2dlcl9yb290XQorICAgIGxldmVsPVdBUk5JTkcKKyAgICBoYW5kbGVycz1oYW5kMQorCisgICAgW2hhbmRsZXJfaGFuZDFdCisgICAgY2xhc3M9U3RyZWFtSGFuZGxlcgorICAgIGxldmVsPU5PVFNFVAorICAgIGZvcm1hdHRlcj1mb3JtMQorICAgIGFyZ3M9KHN5cy5zdGRvdXQsKQorCisgICAgW2Zvcm1hdHRlcl9mb3JtMV0KKyAgICBmb3JtYXQ9JShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcworICAgIGRhdGVmbXQ9CisgICAgIiIiCisKKyAgICAjIGNvbmZpZzEgYWRkcyBhIGxpdHRsZSB0byB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbi4KKyAgICBjb25maWcxID0gIiIiCisgICAgW2xvZ2dlcnNdCisgICAga2V5cz1yb290LHBhcnNlcgorCisgICAgW2hhbmRsZXJzXQorICAgIGtleXM9aGFuZDEKKworICAgIFtmb3JtYXR0ZXJzXQorICAgIGtleXM9Zm9ybTEKKworICAgIFtsb2dnZXJfcm9vdF0KKyAgICBsZXZlbD1XQVJOSU5HCisgICAgaGFuZGxlcnM9CisKKyAgICBbbG9nZ2VyX3BhcnNlcl0KKyAgICBsZXZlbD1ERUJVRworICAgIGhhbmRsZXJzPWhhbmQxCisgICAgcHJvcGFnYXRlPTEKKyAgICBxdWFsbmFtZT1jb21waWxlci5wYXJzZXIKKworICAgIFtoYW5kbGVyX2hhbmQxXQorICAgIGNsYXNzPVN0cmVhbUhhbmRsZXIKKyAgICBsZXZlbD1OT1RTRVQKKyAgICBmb3JtYXR0ZXI9Zm9ybTEKKyAgICBhcmdzPShzeXMuc3Rkb3V0LCkKKworICAgIFtmb3JtYXR0ZXJfZm9ybTFdCisgICAgZm9ybWF0PSUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMKKyAgICBkYXRlZm10PQorICAgICIiIgorCisgICAgIyBjb25maWcxYSBtb3ZlcyB0aGUgaGFuZGxlciB0byB0aGUgcm9vdC4KKyAgICBjb25maWcxYSA9ICIiIgorICAgIFtsb2dnZXJzXQorICAgIGtleXM9cm9vdCxwYXJzZXIKKworICAgIFtoYW5kbGVyc10KKyAgICBrZXlzPWhhbmQxCisKKyAgICBbZm9ybWF0dGVyc10KKyAgICBrZXlzPWZvcm0xCisKKyAgICBbbG9nZ2VyX3Jvb3RdCisgICAgbGV2ZWw9V0FSTklORworICAgIGhhbmRsZXJzPWhhbmQxCisKKyAgICBbbG9nZ2VyX3BhcnNlcl0KKyAgICBsZXZlbD1ERUJVRworICAgIGhhbmRsZXJzPQorICAgIHByb3BhZ2F0ZT0xCisgICAgcXVhbG5hbWU9Y29tcGlsZXIucGFyc2VyCisKKyAgICBbaGFuZGxlcl9oYW5kMV0KKyAgICBjbGFzcz1TdHJlYW1IYW5kbGVyCisgICAgbGV2ZWw9Tk9UU0VUCisgICAgZm9ybWF0dGVyPWZvcm0xCisgICAgYXJncz0oc3lzLnN0ZG91dCwpCisKKyAgICBbZm9ybWF0dGVyX2Zvcm0xXQorICAgIGZvcm1hdD0lKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzCisgICAgZGF0ZWZtdD0KKyAgICAiIiIKKworICAgICMgY29uZmlnMiBoYXMgYSBzdWJ0bGUgY29uZmlndXJhdGlvbiBlcnJvciB0aGF0IHNob3VsZCBiZSByZXBvcnRlZAorICAgIGNvbmZpZzIgPSBjb25maWcxLnJlcGxhY2UoInN5cy5zdGRvdXQiLCAic3lzLnN0Ym91dCIpCisKKyAgICAjIGNvbmZpZzMgaGFzIGEgbGVzcyBzdWJ0bGUgY29uZmlndXJhdGlvbiBlcnJvcgorICAgIGNvbmZpZzMgPSBjb25maWcxLnJlcGxhY2UoImZvcm1hdHRlcj1mb3JtMSIsICJmb3JtYXR0ZXI9bWlzc3BlbGxlZF9uYW1lIikKKworICAgICMgY29uZmlnNCBzcGVjaWZpZXMgYSBjdXN0b20gZm9ybWF0dGVyIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgIGNvbmZpZzQgPSAiIiIKKyAgICBbbG9nZ2Vyc10KKyAgICBrZXlzPXJvb3QKKworICAgIFtoYW5kbGVyc10KKyAgICBrZXlzPWhhbmQxCisKKyAgICBbZm9ybWF0dGVyc10KKyAgICBrZXlzPWZvcm0xCisKKyAgICBbbG9nZ2VyX3Jvb3RdCisgICAgbGV2ZWw9Tk9UU0VUCisgICAgaGFuZGxlcnM9aGFuZDEKKworICAgIFtoYW5kbGVyX2hhbmQxXQorICAgIGNsYXNzPVN0cmVhbUhhbmRsZXIKKyAgICBsZXZlbD1OT1RTRVQKKyAgICBmb3JtYXR0ZXI9Zm9ybTEKKyAgICBhcmdzPShzeXMuc3Rkb3V0LCkKKworICAgIFtmb3JtYXR0ZXJfZm9ybTFdCisgICAgY2xhc3M9IiIiICsgX19uYW1lX18gKyAiIiIuRXhjZXB0aW9uRm9ybWF0dGVyCisgICAgZm9ybWF0PSUobGV2ZWxuYW1lKXM6JShuYW1lKXM6JShtZXNzYWdlKXMKKyAgICBkYXRlZm10PQorICAgICIiIgorCisgICAgIyBjb25maWc1IHNwZWNpZmllcyBhIGN1c3RvbSBoYW5kbGVyIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgIGNvbmZpZzUgPSBjb25maWcxLnJlcGxhY2UoJ2NsYXNzPVN0cmVhbUhhbmRsZXInLCAnY2xhc3M9bG9nZ2luZy5TdHJlYW1IYW5kbGVyJykKKworICAgICMgY29uZmlnNiB1c2VzICcsICcgZGVsaW1pdGVycyBpbiB0aGUgaGFuZGxlcnMgYW5kIGZvcm1hdHRlcnMgc2VjdGlvbnMKKyAgICBjb25maWc2ID0gIiIiCisgICAgW2xvZ2dlcnNdCisgICAga2V5cz1yb290LHBhcnNlcgorCisgICAgW2hhbmRsZXJzXQorICAgIGtleXM9aGFuZDEsIGhhbmQyCisKKyAgICBbZm9ybWF0dGVyc10KKyAgICBrZXlzPWZvcm0xLCBmb3JtMgorCisgICAgW2xvZ2dlcl9yb290XQorICAgIGxldmVsPVdBUk5JTkcKKyAgICBoYW5kbGVycz0KKworICAgIFtsb2dnZXJfcGFyc2VyXQorICAgIGxldmVsPURFQlVHCisgICAgaGFuZGxlcnM9aGFuZDEKKyAgICBwcm9wYWdhdGU9MQorICAgIHF1YWxuYW1lPWNvbXBpbGVyLnBhcnNlcgorCisgICAgW2hhbmRsZXJfaGFuZDFdCisgICAgY2xhc3M9U3RyZWFtSGFuZGxlcgorICAgIGxldmVsPU5PVFNFVAorICAgIGZvcm1hdHRlcj1mb3JtMQorICAgIGFyZ3M9KHN5cy5zdGRvdXQsKQorCisgICAgW2hhbmRsZXJfaGFuZDJdCisgICAgY2xhc3M9U3RyZWFtSGFuZGxlcgorICAgIGxldmVsPU5PVFNFVAorICAgIGZvcm1hdHRlcj1mb3JtMQorICAgIGFyZ3M9KHN5cy5zdGRlcnIsKQorCisgICAgW2Zvcm1hdHRlcl9mb3JtMV0KKyAgICBmb3JtYXQ9JShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcworICAgIGRhdGVmbXQ9CisKKyAgICBbZm9ybWF0dGVyX2Zvcm0yXQorICAgIGZvcm1hdD0lKG1lc3NhZ2UpcworICAgIGRhdGVmbXQ9CisgICAgIiIiCisKKyAgICAjIGNvbmZpZzcgYWRkcyBhIGNvbXBpbGVyIGxvZ2dlci4KKyAgICBjb25maWc3ID0gIiIiCisgICAgW2xvZ2dlcnNdCisgICAga2V5cz1yb290LHBhcnNlcixjb21waWxlcgorCisgICAgW2hhbmRsZXJzXQorICAgIGtleXM9aGFuZDEKKworICAgIFtmb3JtYXR0ZXJzXQorICAgIGtleXM9Zm9ybTEKKworICAgIFtsb2dnZXJfcm9vdF0KKyAgICBsZXZlbD1XQVJOSU5HCisgICAgaGFuZGxlcnM9aGFuZDEKKworICAgIFtsb2dnZXJfY29tcGlsZXJdCisgICAgbGV2ZWw9REVCVUcKKyAgICBoYW5kbGVycz0KKyAgICBwcm9wYWdhdGU9MQorICAgIHF1YWxuYW1lPWNvbXBpbGVyCisKKyAgICBbbG9nZ2VyX3BhcnNlcl0KKyAgICBsZXZlbD1ERUJVRworICAgIGhhbmRsZXJzPQorICAgIHByb3BhZ2F0ZT0xCisgICAgcXVhbG5hbWU9Y29tcGlsZXIucGFyc2VyCisKKyAgICBbaGFuZGxlcl9oYW5kMV0KKyAgICBjbGFzcz1TdHJlYW1IYW5kbGVyCisgICAgbGV2ZWw9Tk9UU0VUCisgICAgZm9ybWF0dGVyPWZvcm0xCisgICAgYXJncz0oc3lzLnN0ZG91dCwpCisKKyAgICBbZm9ybWF0dGVyX2Zvcm0xXQorICAgIGZvcm1hdD0lKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzCisgICAgZGF0ZWZtdD0KKyAgICAiIiIKKworICAgIGRpc2FibGVfdGVzdCA9ICIiIgorICAgIFtsb2dnZXJzXQorICAgIGtleXM9cm9vdAorCisgICAgW2hhbmRsZXJzXQorICAgIGtleXM9c2NyZWVuCisKKyAgICBbZm9ybWF0dGVyc10KKyAgICBrZXlzPQorCisgICAgW2xvZ2dlcl9yb290XQorICAgIGxldmVsPURFQlVHCisgICAgaGFuZGxlcnM9c2NyZWVuCisKKyAgICBbaGFuZGxlcl9zY3JlZW5dCisgICAgbGV2ZWw9REVCVUcKKyAgICBjbGFzcz1TdHJlYW1IYW5kbGVyCisgICAgYXJncz0oc3lzLnN0ZG91dCwpCisgICAgZm9ybWF0dGVyPQorICAgICIiIgorCisgICAgZGVmIGFwcGx5X2NvbmZpZyhzZWxmLCBjb25mLCAqKmt3YXJncyk6CisgICAgICAgIGZpbGUgPSBjU3RyaW5nSU8uU3RyaW5nSU8odGV4dHdyYXAuZGVkZW50KGNvbmYpKQorICAgICAgICBsb2dnaW5nLmNvbmZpZy5maWxlQ29uZmlnKGZpbGUsICoqa3dhcmdzKQorCisgICAgZGVmIHRlc3RfY29uZmlnMF9vayhzZWxmKToKKyAgICAgICAgIyBBIHNpbXBsZSBjb25maWcgZmlsZSB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWcwKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorICAgICAgICAgICAgIyBXb24ndCBvdXRwdXQgYW55dGhpbmcKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICAjIE91dHB1dHMgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICcyJyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfY29uZmlnMV9vayhzZWxmLCBjb25maWc9Y29uZmlnMSk6CisgICAgICAgICMgQSBjb25maWcgZmlsZSBkZWZpbmluZyBhIHN1Yi1wYXJzZXIgYXMgd2VsbC4KKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhjb25maWcpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdJTkZPJywgJzEnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9jb25maWcyX2ZhaWx1cmUoc2VsZik6CisgICAgICAgICMgQSBzaW1wbGUgY29uZmlnIGZpbGUgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNldHRpbmdzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdGFuZGFyZEVycm9yLCBzZWxmLmFwcGx5X2NvbmZpZywgc2VsZi5jb25maWcyKQorCisgICAgZGVmIHRlc3RfY29uZmlnM19mYWlsdXJlKHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyBmaWxlIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RhbmRhcmRFcnJvciwgc2VsZi5hcHBseV9jb25maWcsIHNlbGYuY29uZmlnMykKKworICAgIGRlZiB0ZXN0X2NvbmZpZzRfb2soc2VsZik6CisgICAgICAgICMgQSBjb25maWcgZmlsZSBzcGVjaWZ5aW5nIGEgY3VzdG9tIGZvcm1hdHRlciBjbGFzcy4KKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzQpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oImp1c3QgdGVzdGluZyIpCisgICAgICAgICAgICBzeXMuc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0cHV0LmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgIkVSUk9SOnJvb3Q6anVzdCB0ZXN0aW5nXG5Hb3QgYSBbUnVudGltZUVycm9yXVxuIikKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfY29uZmlnNV9vayhzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2NvbmZpZzFfb2soY29uZmlnPXNlbGYuY29uZmlnNSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZzZfb2soc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9jb25maWcxX29rKGNvbmZpZz1zZWxmLmNvbmZpZzYpCisKKyAgICBkZWYgdGVzdF9jb25maWc3X29rKHNlbGYpOgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnMWEpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgICMgU2VlIGlzc3VlICMxMTQyNC4gY29tcGlsZXItaHlwaGVuYXRlZCBzb3J0cworICAgICAgICAgICAgIyBiZXR3ZWVuIGNvbXBpbGVyIGFuZCBjb21waWxlci54eXogYW5kIHRoaXMKKyAgICAgICAgICAgICMgd2FzIHByZXZlbnRpbmcgY29tcGlsZXIueHl6IGZyb20gYmVpbmcgaW5jbHVkZWQKKyAgICAgICAgICAgICMgaW4gdGhlIGNoaWxkIGxvZ2dlcnMgb2YgY29tcGlsZXIgYmVjYXVzZSBvZiBhbgorICAgICAgICAgICAgIyBvdmVyemVhbG91cyBsb29wIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIGh5cGhlbmF0ZWQgPSBsb2dnaW5nLmdldExvZ2dlcignY29tcGlsZXItaHlwaGVuYXRlZCcpCisgICAgICAgICAgICAjIEFsbCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGh5cGhlbmF0ZWQuY3JpdGljYWwoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdJTkZPJywgJzEnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgICAgICAoJ0NSSVRJQ0FMJywgJzMnKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWc3KQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvZ2dlci5kaXNhYmxlZCkKKyAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5sZXhlciIpCisgICAgICAgICAgICAjIEJvdGggd2lsbCBvdXRwdXQgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICAjIFdpbGwgbm90IGFwcGVhcgorICAgICAgICAgICAgaHlwaGVuYXRlZC5jcml0aWNhbChzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnNCcpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnNScpLAorICAgICAgICAgICAgICAgICgnSU5GTycsICc2JyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICc3JyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfbG9nZ2VyX2Rpc2FibGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5kaXNhYmxlX3Rlc3QpCisgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxvZ2dlci5kaXNhYmxlZCkKKyAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5kaXNhYmxlX3Rlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2dnZXIuZGlzYWJsZWQpCisgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuZGlzYWJsZV90ZXN0LCBkaXNhYmxlX2V4aXN0aW5nX2xvZ2dlcnM9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9nZ2VyLmRpc2FibGVkKQorCitjbGFzcyBMb2dSZWNvcmRTdHJlYW1IYW5kbGVyKFN0cmVhbVJlcXVlc3RIYW5kbGVyKToKKworICAgICIiIkhhbmRsZXIgZm9yIGEgc3RyZWFtaW5nIGxvZ2dpbmcgcmVxdWVzdC4gSXQgc2F2ZXMgdGhlIGxvZyBtZXNzYWdlIGluIHRoZQorICAgIFRDUCBzZXJ2ZXIncyAnbG9nX291dHB1dCcgYXR0cmlidXRlLiIiIgorCisgICAgVENQX0xPR19FTkQgPSAiISEhRU5EISEhIgorCisgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgIiIiSGFuZGxlIG11bHRpcGxlIHJlcXVlc3RzIC0gZWFjaCBleHBlY3RlZCB0byBiZSBvZiA0LWJ5dGUgbGVuZ3RoLAorICAgICAgICBmb2xsb3dlZCBieSB0aGUgTG9nUmVjb3JkIGluIHBpY2tsZSBmb3JtYXQuIExvZ3MgdGhlIHJlY29yZAorICAgICAgICBhY2NvcmRpbmcgdG8gd2hhdGV2ZXIgcG9saWN5IGlzIGNvbmZpZ3VyZWQgbG9jYWxseS4iIiIKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNodW5rID0gc2VsZi5jb25uZWN0aW9uLnJlY3YoNCkKKyAgICAgICAgICAgIGlmIGxlbihjaHVuaykgPCA0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBzbGVuID0gc3RydWN0LnVucGFjaygiPkwiLCBjaHVuaylbMF0KKyAgICAgICAgICAgIGNodW5rID0gc2VsZi5jb25uZWN0aW9uLnJlY3Yoc2xlbikKKyAgICAgICAgICAgIHdoaWxlIGxlbihjaHVuaykgPCBzbGVuOgorICAgICAgICAgICAgICAgIGNodW5rID0gY2h1bmsgKyBzZWxmLmNvbm5lY3Rpb24ucmVjdihzbGVuIC0gbGVuKGNodW5rKSkKKyAgICAgICAgICAgIG9iaiA9IHNlbGYudW5waWNrbGUoY2h1bmspCisgICAgICAgICAgICByZWNvcmQgPSBsb2dnaW5nLm1ha2VMb2dSZWNvcmQob2JqKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVfbG9nX3JlY29yZChyZWNvcmQpCisKKyAgICBkZWYgdW5waWNrbGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiBjUGlja2xlLmxvYWRzKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX2xvZ19yZWNvcmQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgIyBJZiB0aGUgZW5kLW9mLW1lc3NhZ2VzIHNlbnRpbmVsIGlzIHNlZW4sIHRlbGwgdGhlIHNlcnZlciB0bworICAgICAgICAjICB0ZXJtaW5hdGUuCisgICAgICAgIGlmIHNlbGYuVENQX0xPR19FTkQgaW4gcmVjb3JkLm1zZzoKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLmFib3J0ID0gMQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuc2VydmVyLmxvZ19vdXRwdXQgKz0gcmVjb3JkLm1zZyArICJcbiIKKworCitjbGFzcyBMb2dSZWNvcmRTb2NrZXRSZWNlaXZlcihUaHJlYWRpbmdUQ1BTZXJ2ZXIpOgorCisgICAgIiIiQSBzaW1wbGUtbWluZGVkIFRDUCBzb2NrZXQtYmFzZWQgbG9nZ2luZyByZWNlaXZlciBzdWl0YWJsZSBmb3IgdGVzdAorICAgIHB1cnBvc2VzLiIiIgorCisgICAgYWxsb3dfcmV1c2VfYWRkcmVzcyA9IDEKKyAgICBsb2dfb3V0cHV0ID0gIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBob3N0PSdsb2NhbGhvc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0PWxvZ2dpbmcuaGFuZGxlcnMuREVGQVVMVF9UQ1BfTE9HR0lOR19QT1JULAorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcj1Mb2dSZWNvcmRTdHJlYW1IYW5kbGVyKToKKyAgICAgICAgVGhyZWFkaW5nVENQU2VydmVyLl9faW5pdF9fKHNlbGYsIChob3N0LCBwb3J0KSwgaGFuZGxlcikKKyAgICAgICAgc2VsZi5hYm9ydCA9IEZhbHNlCisgICAgICAgIHNlbGYudGltZW91dCA9IDAuMQorICAgICAgICBzZWxmLmZpbmlzaGVkID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgIGRlZiBzZXJ2ZV91bnRpbF9zdG9wcGVkKHNlbGYpOgorICAgICAgICB3aGlsZSBub3Qgc2VsZi5hYm9ydDoKKyAgICAgICAgICAgIHJkLCB3ciwgZXggPSBzZWxlY3Quc2VsZWN0KFtzZWxmLnNvY2tldC5maWxlbm8oKV0sIFtdLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGltZW91dCkKKyAgICAgICAgICAgIGlmIHJkOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICAjIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSdyZSBhYm91dCB0byBleGl0CisgICAgICAgIHNlbGYuZmluaXNoZWQuc2V0KCkKKyAgICAgICAgIyBjbG9zZSB0aGUgbGlzdGVuIHNvY2tldAorICAgICAgICBzZWxmLnNlcnZlcl9jbG9zZSgpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIFNvY2tldEhhbmRsZXJUZXN0KEJhc2VUZXN0KToKKworICAgICIiIlRlc3QgZm9yIFNvY2tldEhhbmRsZXIgb2JqZWN0cy4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIiIiU2V0IHVwIGEgVENQIHNlcnZlciB0byByZWNlaXZlIGxvZyBtZXNzYWdlcywgYW5kIGEgU29ja2V0SGFuZGxlcgorICAgICAgICBwb2ludGluZyB0byB0aGF0IHNlcnZlcidzIGFkZHJlc3MgYW5kIHBvcnQuIiIiCisgICAgICAgIEJhc2VUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYudGNwc2VydmVyID0gTG9nUmVjb3JkU29ja2V0UmVjZWl2ZXIocG9ydD0wKQorICAgICAgICBzZWxmLnBvcnQgPSBzZWxmLnRjcHNlcnZlci5zb2NrZXQuZ2V0c29ja25hbWUoKVsxXQorICAgICAgICBzZWxmLnRocmVhZHMgPSBbCisgICAgICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi50Y3BzZXJ2ZXIuc2VydmVfdW50aWxfc3RvcHBlZCldCisgICAgICAgIGZvciB0aHJlYWQgaW4gc2VsZi50aHJlYWRzOgorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCkKKworICAgICAgICBzZWxmLnNvY2tfaGRsciA9IGxvZ2dpbmcuaGFuZGxlcnMuU29ja2V0SGFuZGxlcignbG9jYWxob3N0Jywgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLnNvY2tfaGRsci5zZXRGb3JtYXR0ZXIoc2VsZi5yb290X2Zvcm1hdHRlcikKKyAgICAgICAgc2VsZi5yb290X2xvZ2dlci5yZW1vdmVIYW5kbGVyKHNlbGYucm9vdF9sb2dnZXIuaGFuZGxlcnNbMF0pCisgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuYWRkSGFuZGxlcihzZWxmLnNvY2tfaGRscikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIiIiU2h1dGRvd24gdGhlIFRDUCBzZXJ2ZXIuIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYudGNwc2VydmVyLmFib3J0ID0gVHJ1ZQorICAgICAgICAgICAgZGVsIHNlbGYudGNwc2VydmVyCisgICAgICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLnJlbW92ZUhhbmRsZXIoc2VsZi5zb2NrX2hkbHIpCisgICAgICAgICAgICBzZWxmLnNvY2tfaGRsci5jbG9zZSgpCisgICAgICAgICAgICBmb3IgdGhyZWFkIGluIHNlbGYudGhyZWFkczoKKyAgICAgICAgICAgICAgICB0aHJlYWQuam9pbigyLjApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBCYXNlVGVzdC50ZWFyRG93bihzZWxmKQorCisgICAgZGVmIGdldF9vdXRwdXQoc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgbG9nIG91dHB1dCBhcyByZWNlaXZlZCBieSB0aGUgVENQIHNlcnZlci4iIiIKKyAgICAgICAgIyBTaWduYWwgdGhlIFRDUCByZWNlaXZlciBhbmQgd2FpdCBmb3IgaXQgdG8gdGVybWluYXRlLgorICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLmNyaXRpY2FsKExvZ1JlY29yZFN0cmVhbUhhbmRsZXIuVENQX0xPR19FTkQpCisgICAgICAgIHNlbGYudGNwc2VydmVyLmZpbmlzaGVkLndhaXQoMi4wKQorICAgICAgICByZXR1cm4gc2VsZi50Y3BzZXJ2ZXIubG9nX291dHB1dAorCisgICAgZGVmIHRlc3Rfb3V0cHV0KHNlbGYpOgorICAgICAgICAjIFRoZSBsb2cgbWVzc2FnZSBzZW50IHRvIHRoZSBTb2NrZXRIYW5kbGVyIGlzIHByb3Blcmx5IHJlY2VpdmVkLgorICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigidGNwIikKKyAgICAgICAgbG9nZ2VyLmVycm9yKCJzcGFtIikKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCJlZ2dzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdldF9vdXRwdXQoKSwgInNwYW1cbmVnZ3NcbiIpCisKKworY2xhc3MgTWVtb3J5VGVzdChCYXNlVGVzdCk6CisKKyAgICAiIiJUZXN0IG1lbW9yeSBwZXJzaXN0ZW5jZSBvZiBsb2dnZXIgb2JqZWN0cy4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgZGljdCB0byByZW1lbWJlciBwb3RlbnRpYWxseSBkZXN0cm95ZWQgb2JqZWN0cy4iIiIKKyAgICAgICAgQmFzZVRlc3Quc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5fc3Vydml2b3JzID0ge30KKworICAgIGRlZiBfd2F0Y2hfZm9yX3N1cnZpdmFsKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiV2F0Y2ggdGhlIGdpdmVuIG9iamVjdHMgZm9yIHN1cnZpdmFsLCBieSBjcmVhdGluZyB3ZWFrcmVmcyB0bworICAgICAgICB0aGVtLiIiIgorICAgICAgICBmb3Igb2JqIGluIGFyZ3M6CisgICAgICAgICAgICBrZXkgPSBpZChvYmopLCByZXByKG9iaikKKyAgICAgICAgICAgIHNlbGYuX3N1cnZpdm9yc1trZXldID0gd2Vha3JlZi5yZWYob2JqKQorCisgICAgZGVmIF9hc3NlcnRUcnVlc3Vydml2YWwoc2VsZik6CisgICAgICAgICIiIkFzc2VydCB0aGF0IGFsbCBvYmplY3RzIHdhdGNoZWQgZm9yIHN1cnZpdmFsIGhhdmUgc3Vydml2ZWQuIiIiCisgICAgICAgICMgVHJpZ2dlciBjeWNsZSBicmVha2luZy4KKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlYWQgPSBbXQorICAgICAgICBmb3IgKGlkXywgcmVwcl8pLCByZWYgaW4gc2VsZi5fc3Vydml2b3JzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiByZWYoKSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGRlYWQuYXBwZW5kKHJlcHJfKQorICAgICAgICBpZiBkZWFkOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIlZCBvYmplY3RzIHNob3VsZCBoYXZlIHN1cnZpdmVkICIKKyAgICAgICAgICAgICAgICAiYnV0IGhhdmUgYmVlbiBkZXN0cm95ZWQ6ICVzIiAlIChsZW4oZGVhZCksICIsICIuam9pbihkZWFkKSkpCisKKyAgICBkZWYgdGVzdF9wZXJzaXN0ZW50X2xvZ2dlcnMoc2VsZik6CisgICAgICAgICMgTG9nZ2VyIG9iamVjdHMgYXJlIHBlcnNpc3RlbnQgYW5kIHJldGFpbiB0aGVpciBjb25maWd1cmF0aW9uLCBldmVuCisgICAgICAgICMgIGlmIHZpc2libGUgcmVmZXJlbmNlcyBhcmUgZGVzdHJveWVkLgorICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICAgICAgZm9vID0gbG9nZ2luZy5nZXRMb2dnZXIoImZvbyIpCisgICAgICAgIHNlbGYuX3dhdGNoX2Zvcl9zdXJ2aXZhbChmb28pCisgICAgICAgIGZvby5zZXRMZXZlbChsb2dnaW5nLkRFQlVHKQorICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgIGZvby5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgKCdmb28nLCAnREVCVUcnLCAnMicpLAorICAgICAgICBdKQorICAgICAgICBkZWwgZm9vCisgICAgICAgICMgZm9vIGhhcyBzdXJ2aXZlZC4KKyAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZXN1cnZpdmFsKCkKKyAgICAgICAgIyBmb28gaGFzIHJldGFpbmVkIGl0cyBzZXR0aW5ncy4KKyAgICAgICAgYmFyID0gbG9nZ2luZy5nZXRMb2dnZXIoImZvbyIpCisgICAgICAgIGJhci5kZWJ1ZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgKCdmb28nLCAnREVCVUcnLCAnMicpLAorICAgICAgICAgICAgKCdmb28nLCAnREVCVUcnLCAnMycpLAorICAgICAgICBdKQorCisKK2NsYXNzIEVuY29kaW5nVGVzdChCYXNlVGVzdCk6CisgICAgZGVmIHRlc3RfZW5jb2RpbmdfcGxhaW5fZmlsZShzZWxmKToKKyAgICAgICAgIyBJbiBQeXRob24gMi54LCBhIHBsYWluIGZpbGUgb2JqZWN0IGlzIHRyZWF0ZWQgYXMgaGF2aW5nIG5vIGVuY29kaW5nLgorICAgICAgICBsb2cgPSBsb2dnaW5nLmdldExvZ2dlcigidGVzdCIpCisgICAgICAgIGZuID0gdGVtcGZpbGUubWt0ZW1wKCIubG9nIikKKyAgICAgICAgIyB0aGUgbm9uLWFzY2lpIGRhdGEgd2Ugd3JpdGUgdG8gdGhlIGxvZy4KKyAgICAgICAgZGF0YSA9ICJmb29ceDgwIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYW5kbGVyID0gbG9nZ2luZy5GaWxlSGFuZGxlcihmbikKKyAgICAgICAgICAgIGxvZy5hZGRIYW5kbGVyKGhhbmRsZXIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyB3cml0ZSBub24tYXNjaWkgZGF0YSB0byB0aGUgbG9nLgorICAgICAgICAgICAgICAgIGxvZy53YXJuaW5nKGRhdGEpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGxvZy5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpCisgICAgICAgICAgICAgICAgaGFuZGxlci5jbG9zZSgpCisgICAgICAgICAgICAjIGNoZWNrIHdlIHdyb3RlIGV4YWN0bHkgdGhvc2UgYnl0ZXMsIGlnbm9yaW5nIHRyYWlsaW5nIFxuIGV0YworICAgICAgICAgICAgZiA9IG9wZW4oZm4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKS5yc3RyaXAoKSwgZGF0YSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShmbik6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZuKQorCisgICAgZGVmIHRlc3RfZW5jb2RpbmdfY3lyaWxsaWNfdW5pY29kZShzZWxmKToKKyAgICAgICAgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoInRlc3QiKQorICAgICAgICAjR2V0IGEgbWVzc2FnZSBpbiBVbmljb2RlOiBEbyBzdmlkYW55YSBpbiBDeXJpbGxpYyAobWVhbmluZyBnb29kYnllKQorICAgICAgICBtZXNzYWdlID0gdSdcdTA0MzRcdTA0M2UgXHUwNDQxXHUwNDMyXHUwNDM4XHUwNDM0XHUwNDMwXHUwNDNkXHUwNDM4XHUwNDRmJworICAgICAgICAjRW5zdXJlIGl0J3Mgd3JpdHRlbiBpbiBhIEN5cmlsbGljIGVuY29kaW5nCisgICAgICAgIHdyaXRlcl9jbGFzcyA9IGNvZGVjcy5nZXR3cml0ZXIoJ2NwMTI1MScpCisgICAgICAgIHdyaXRlcl9jbGFzcy5lbmNvZGluZyA9ICdjcDEyNTEnCisgICAgICAgIHN0cmVhbSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHdyaXRlciA9IHdyaXRlcl9jbGFzcyhzdHJlYW0sICdzdHJpY3QnKQorICAgICAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHdyaXRlcikKKyAgICAgICAgbG9nLmFkZEhhbmRsZXIoaGFuZGxlcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9nLndhcm5pbmcobWVzc2FnZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZy5yZW1vdmVIYW5kbGVyKGhhbmRsZXIpCisgICAgICAgICAgICBoYW5kbGVyLmNsb3NlKCkKKyAgICAgICAgIyBjaGVjayB3ZSB3cm90ZSBleGFjdGx5IHRob3NlIGJ5dGVzLCBpZ25vcmluZyB0cmFpbGluZyBcbiBldGMKKyAgICAgICAgcyA9IHN0cmVhbS5nZXR2YWx1ZSgpCisgICAgICAgICNDb21wYXJlIGFnYWluc3Qgd2hhdCB0aGUgZGF0YSBzaG91bGQgYmUgd2hlbiBlbmNvZGVkIGluIENQLTEyNTEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAnXHhlNFx4ZWUgXHhmMVx4ZTJceGU4XHhlNFx4ZTBceGVkXHhlOFx4ZmZcbicpCisKKworY2xhc3MgV2FybmluZ3NUZXN0KEJhc2VUZXN0KToKKworICAgIGRlZiB0ZXN0X3dhcm5pbmdzKHNlbGYpOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBsb2dnaW5nLmNhcHR1cmVXYXJuaW5ncyhUcnVlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJhbHdheXMiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgICAgICBmaWxlID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgICAgICBoID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKGZpbGUpCisgICAgICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInB5Lndhcm5pbmdzIikKKyAgICAgICAgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihoKQorICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkknbSB3YXJuaW5nIHlvdS4uLiIpCisgICAgICAgICAgICAgICAgbG9nZ2VyLnJlbW92ZUhhbmRsZXIoaCkKKyAgICAgICAgICAgICAgICBzID0gZmlsZS5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgaC5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZmluZCgiVXNlcldhcm5pbmc6IEknbSB3YXJuaW5nIHlvdS4uLlxuIikgPiAwKQorCisgICAgICAgICAgICAgICAgI1NlZSBpZiBhbiBleHBsaWNpdCBmaWxlIHVzZXMgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICAgICAgZmlsZSA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICAgICAgd2FybmluZ3Muc2hvd3dhcm5pbmcoIkV4cGxpY2l0IiwgVXNlcldhcm5pbmcsICJkdW1teS5weSIsIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsICJEdW1teSBsaW5lIikKKyAgICAgICAgICAgICAgICBzID0gZmlsZS5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLAorICAgICAgICAgICAgICAgICAgICAgICAgImR1bW15LnB5OjQyOiBVc2VyV2FybmluZzogRXhwbGljaXRcbiAgRHVtbXkgbGluZVxuIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5jYXB0dXJlV2FybmluZ3MoRmFsc2UpCisKKworZGVmIGZvcm1hdEZ1bmMoZm9ybWF0LCBkYXRlZm10PU5vbmUpOgorICAgIHJldHVybiBsb2dnaW5nLkZvcm1hdHRlcihmb3JtYXQsIGRhdGVmbXQpCisKK2RlZiBoYW5kbGVyRnVuYygpOgorICAgIHJldHVybiBsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKQorCitjbGFzcyBDdXN0b21IYW5kbGVyKGxvZ2dpbmcuU3RyZWFtSGFuZGxlcik6CisgICAgcGFzcworCitjbGFzcyBDb25maWdEaWN0VGVzdChCYXNlVGVzdCk6CisKKyAgICAiIiJSZWFkaW5nIGxvZ2dpbmcgY29uZmlnIGZyb20gYSBkaWN0aW9uYXJ5LiIiIgorCisgICAgZXhwZWN0ZWRfbG9nX3BhdCA9IHIiXihbXHddKykgXCtcKyAoW1x3XSspJCIKKworICAgICMgY29uZmlnMCBpcyBhIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24uCisgICAgY29uZmlnMCA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjIGNvbmZpZzEgYWRkcyBhIGxpdHRsZSB0byB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbi4KKyAgICBjb25maWcxID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogeworICAgICAgICAgICAgICAgICdjbGFzcycgOiAnbG9nZ2luZy5TdHJlYW1IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdmb3JtMScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgICMgY29uZmlnMiBoYXMgYSBzdWJ0bGUgY29uZmlndXJhdGlvbiBlcnJvciB0aGF0IHNob3VsZCBiZSByZXBvcnRlZAorICAgIGNvbmZpZzIgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRib3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgICNBcyBjb25maWcxIGJ1dCB3aXRoIGEgbWlzc3BlbHQgbGV2ZWwgb24gYSBoYW5kbGVyCisgICAgY29uZmlnMmEgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05UT1NFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgIH0sCisgICAgfQorCisKKyAgICAjQXMgY29uZmlnMSBidXQgd2l0aCBhIG1pc3NwZWx0IGxldmVsIG9uIGEgbG9nZ2VyCisgICAgY29uZmlnMmIgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV1JBTklORycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgIyBjb25maWczIGhhcyBhIGxlc3Mgc3VidGxlIGNvbmZpZ3VyYXRpb24gZXJyb3IKKyAgICBjb25maWczID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogeworICAgICAgICAgICAgICAgICdjbGFzcycgOiAnbG9nZ2luZy5TdHJlYW1IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdtaXNzcGVsbGVkX25hbWUnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjIGNvbmZpZzQgc3BlY2lmaWVzIGEgY3VzdG9tIGZvcm1hdHRlciBjbGFzcyB0byBiZSBsb2FkZWQKKyAgICBjb25maWc0ID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnKCknIDogX19uYW1lX18gKyAnLkV4Y2VwdGlvbkZvcm1hdHRlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpczolKG5hbWUpczolKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjIEFzIGNvbmZpZzQgYnV0IHVzaW5nIGFuIGFjdHVhbCBjYWxsYWJsZSByYXRoZXIgdGhhbiBhIHN0cmluZworICAgIGNvbmZpZzRhID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdmb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnKCknIDogRXhjZXB0aW9uRm9ybWF0dGVyLAorICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXM6JShuYW1lKXM6JShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICdmb3JtMicgOiB7CisgICAgICAgICAgICAgICAgJygpJyA6IF9fbmFtZV9fICsgJy5mb3JtYXRGdW5jJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzOiUobmFtZSlzOiUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICAnZm9ybTMnIDogeworICAgICAgICAgICAgICAgICcoKScgOiBmb3JtYXRGdW5jLAorICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXM6JShuYW1lKXM6JShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICdoYW5kMicgOiB7CisgICAgICAgICAgICAgICAgJygpJyA6IGhhbmRsZXJGdW5jLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgIH0sCisgICAgfQorCisgICAgIyBjb25maWc1IHNwZWNpZmllcyBhIGN1c3RvbSBoYW5kbGVyIGNsYXNzIHRvIGJlIGxvYWRlZAorICAgIGNvbmZpZzUgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6IF9fbmFtZV9fICsgJy5DdXN0b21IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdmb3JtMScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgICMgY29uZmlnNiBzcGVjaWZpZXMgYSBjdXN0b20gaGFuZGxlciBjbGFzcyB0byBiZSBsb2FkZWQKKyAgICAjIGJ1dCBoYXMgYmFkIGFyZ3VtZW50cworICAgIGNvbmZpZzYgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6IF9fbmFtZV9fICsgJy5DdXN0b21IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdmb3JtMScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgICAgICAnOScgOiAnaW52YWxpZCBwYXJhbWV0ZXIgbmFtZScsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjY29uZmlnIDcgZG9lcyBub3QgZGVmaW5lIGNvbXBpbGVyLnBhcnNlciBidXQgZGVmaW5lcyBjb21waWxlci5sZXhlcgorICAgICNzbyBjb21waWxlci5wYXJzZXIgc2hvdWxkIGJlIGRpc2FibGVkIGFmdGVyIGFwcGx5aW5nIGl0CisgICAgY29uZmlnNyA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnY2xhc3MnIDogJ2xvZ2dpbmcuU3RyZWFtSGFuZGxlcicsCisgICAgICAgICAgICAgICAgJ2Zvcm1hdHRlcicgOiAnZm9ybTEnLAorICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgICAgICAgICAnc3RyZWFtJyAgOiAnZXh0Oi8vc3lzLnN0ZG91dCcsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIubGV4ZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdoYW5kbGVycycgOiBbJ2hhbmQxJ10sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgIGNvbmZpZzggPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Rpc2FibGVfZXhpc3RpbmdfbG9nZ2VycycgOiBGYWxzZSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICdjb21waWxlci5sZXhlcicgOiB7CisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAncm9vdCcgOiB7CisgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICB9LAorICAgIH0KKworICAgIGNvbmZpZzkgPSB7CisgICAgICAgICd2ZXJzaW9uJzogMSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ1dBUk5JTkcnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnTk9UU0VUJywKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICBjb25maWc5YSA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnaW5jcmVtZW50YWwnIDogVHJ1ZSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnSU5GTycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0KKworICAgIGNvbmZpZzliID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICdpbmNyZW1lbnRhbCcgOiBUcnVlLAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0lORk8nLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdJTkZPJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgfQorCisgICAgI0FzIGNvbmZpZzEgYnV0IHdpdGggYSBmaWx0ZXIgYWRkZWQKKyAgICBjb25maWcxMCA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAxLAorICAgICAgICAnZm9ybWF0dGVycyc6IHsKKyAgICAgICAgICAgICdmb3JtMScgOiB7CisgICAgICAgICAgICAgICAgJ2Zvcm1hdCcgOiAnJShsZXZlbG5hbWUpcyArKyAlKG1lc3NhZ2UpcycsCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgICAgICAnZmlsdGVycycgOiB7CisgICAgICAgICAgICAnZmlsdDEnIDogeworICAgICAgICAgICAgICAgICduYW1lJyA6ICdjb21waWxlci5wYXJzZXInLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJzJyA6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgICAgICdmaWx0ZXJzJyA6IFsnZmlsdDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdsb2dnZXJzJyA6IHsKKyAgICAgICAgICAgICdjb21waWxlci5wYXJzZXInIDogeworICAgICAgICAgICAgICAgICdsZXZlbCcgOiAnREVCVUcnLAorICAgICAgICAgICAgICAgICdmaWx0ZXJzJyA6IFsnZmlsdDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICB9LAorICAgIH0KKworICAgICNBcyBjb25maWcxIGJ1dCB1c2luZyBjZmc6Ly8gcmVmZXJlbmNlcworICAgIGNvbmZpZzExID0geworICAgICAgICAndmVyc2lvbic6IDEsCisgICAgICAgICd0cnVlX2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJfY29uZmlncyc6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnIDogJ2NmZzovL3RydWVfZm9ybWF0dGVycycsCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogJ2NmZzovL2hhbmRsZXJfY29uZmlnc1toYW5kMV0nLAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjQXMgY29uZmlnMTEgYnV0IG1pc3NpbmcgdGhlIHZlcnNpb24ga2V5CisgICAgY29uZmlnMTIgPSB7CisgICAgICAgICd0cnVlX2Zvcm1hdHRlcnMnOiB7CisgICAgICAgICAgICAnZm9ybTEnIDogeworICAgICAgICAgICAgICAgICdmb3JtYXQnIDogJyUobGV2ZWxuYW1lKXMgKysgJShtZXNzYWdlKXMnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2hhbmRsZXJfY29uZmlncyc6IHsKKyAgICAgICAgICAgICdoYW5kMScgOiB7CisgICAgICAgICAgICAgICAgJ2NsYXNzJyA6ICdsb2dnaW5nLlN0cmVhbUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdmb3JtYXR0ZXInIDogJ2Zvcm0xJywKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ05PVFNFVCcsCisgICAgICAgICAgICAgICAgJ3N0cmVhbScgIDogJ2V4dDovL3N5cy5zdGRvdXQnLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ2Zvcm1hdHRlcnMnIDogJ2NmZzovL3RydWVfZm9ybWF0dGVycycsCisgICAgICAgICdoYW5kbGVycycgOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogJ2NmZzovL2hhbmRsZXJfY29uZmlnc1toYW5kMV0nLAorICAgICAgICB9LAorICAgICAgICAnbG9nZ2VycycgOiB7CisgICAgICAgICAgICAnY29tcGlsZXIucGFyc2VyJyA6IHsKKyAgICAgICAgICAgICAgICAnbGV2ZWwnIDogJ0RFQlVHJywKKyAgICAgICAgICAgICAgICAnaGFuZGxlcnMnIDogWydoYW5kMSddLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgJ3Jvb3QnIDogeworICAgICAgICAgICAgJ2xldmVsJyA6ICdXQVJOSU5HJywKKyAgICAgICAgfSwKKyAgICB9CisKKyAgICAjQXMgY29uZmlnMTEgYnV0IHVzaW5nIGFuIHVuc3VwcG9ydGVkIHZlcnNpb24KKyAgICBjb25maWcxMyA9IHsKKyAgICAgICAgJ3ZlcnNpb24nOiAyLAorICAgICAgICAndHJ1ZV9mb3JtYXR0ZXJzJzogeworICAgICAgICAgICAgJ2Zvcm0xJyA6IHsKKyAgICAgICAgICAgICAgICAnZm9ybWF0JyA6ICclKGxldmVsbmFtZSlzICsrICUobWVzc2FnZSlzJywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdoYW5kbGVyX2NvbmZpZ3MnOiB7CisgICAgICAgICAgICAnaGFuZDEnIDogeworICAgICAgICAgICAgICAgICdjbGFzcycgOiAnbG9nZ2luZy5TdHJlYW1IYW5kbGVyJywKKyAgICAgICAgICAgICAgICAnZm9ybWF0dGVyJyA6ICdmb3JtMScsCisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdOT1RTRVQnLAorICAgICAgICAgICAgICAgICdzdHJlYW0nICA6ICdleHQ6Ly9zeXMuc3Rkb3V0JywKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdmb3JtYXR0ZXJzJyA6ICdjZmc6Ly90cnVlX2Zvcm1hdHRlcnMnLAorICAgICAgICAnaGFuZGxlcnMnIDogeworICAgICAgICAgICAgJ2hhbmQxJyA6ICdjZmc6Ly9oYW5kbGVyX2NvbmZpZ3NbaGFuZDFdJywKKyAgICAgICAgfSwKKyAgICAgICAgJ2xvZ2dlcnMnIDogeworICAgICAgICAgICAgJ2NvbXBpbGVyLnBhcnNlcicgOiB7CisgICAgICAgICAgICAgICAgJ2xldmVsJyA6ICdERUJVRycsCisgICAgICAgICAgICAgICAgJ2hhbmRsZXJzJyA6IFsnaGFuZDEnXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgICAgICdyb290JyA6IHsKKyAgICAgICAgICAgICdsZXZlbCcgOiAnV0FSTklORycsCisgICAgICAgIH0sCisgICAgfQorCisgICAgb3V0X29mX29yZGVyID0geworICAgICAgICAidmVyc2lvbiI6IDEsCisgICAgICAgICJmb3JtYXR0ZXJzIjogeworICAgICAgICAgICAgIm15U2ltcGxlRm9ybWF0dGVyIjogeworICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiJShhc2N0aW1lKXMgKCUobmFtZSlzKSAlKGxldmVsbmFtZSlzOiAlKG1lc3NhZ2UpcyIKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgImhhbmRsZXJzIjogeworICAgICAgICAgICAgImZpbGVHbG9iYWwiOiB7CisgICAgICAgICAgICAgICAgImNsYXNzIjogImxvZ2dpbmcuU3RyZWFtSGFuZGxlciIsCisgICAgICAgICAgICAgICAgImxldmVsIjogIkRFQlVHIiwKKyAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogIm15U2ltcGxlRm9ybWF0dGVyIgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICJidWZmZXJHbG9iYWwiOiB7CisgICAgICAgICAgICAgICAgImNsYXNzIjogImxvZ2dpbmcuaGFuZGxlcnMuTWVtb3J5SGFuZGxlciIsCisgICAgICAgICAgICAgICAgImNhcGFjaXR5IjogNSwKKyAgICAgICAgICAgICAgICAiZm9ybWF0dGVyIjogIm15U2ltcGxlRm9ybWF0dGVyIiwKKyAgICAgICAgICAgICAgICAidGFyZ2V0IjogImZpbGVHbG9iYWwiLAorICAgICAgICAgICAgICAgICJsZXZlbCI6ICJERUJVRyIKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgICJsb2dnZXJzIjogeworICAgICAgICAgICAgIm15bW9kdWxlIjogeworICAgICAgICAgICAgICAgICJsZXZlbCI6ICJERUJVRyIsCisgICAgICAgICAgICAgICAgImhhbmRsZXJzIjogWyJidWZmZXJHbG9iYWwiXSwKKyAgICAgICAgICAgICAgICAicHJvcGFnYXRlIjogInRydWUiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWYgYXBwbHlfY29uZmlnKHNlbGYsIGNvbmYpOgorICAgICAgICBsb2dnaW5nLmNvbmZpZy5kaWN0Q29uZmlnKGNvbmYpCisKKyAgICBkZWYgdGVzdF9jb25maWcwX29rKHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWcwKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorICAgICAgICAgICAgIyBXb24ndCBvdXRwdXQgYW55dGhpbmcKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICAjIE91dHB1dHMgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICcyJyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfY29uZmlnMV9vayhzZWxmLCBjb25maWc9Y29uZmlnMSk6CisgICAgICAgICMgQSBjb25maWcgZGVmaW5pbmcgYSBzdWItcGFyc2VyIGFzIHdlbGwuCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoY29uZmlnKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICAjIEJvdGggd2lsbCBvdXRwdXQgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnSU5GTycsICcxJyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICcyJyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfY29uZmlnMl9mYWlsdXJlKHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzIpCisKKyAgICBkZWYgdGVzdF9jb25maWcyYV9mYWlsdXJlKHNlbGYpOgorICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyB3aGljaCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgc2V0dGluZ3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzJhKQorCisgICAgZGVmIHRlc3RfY29uZmlnMmJfZmFpbHVyZShzZWxmKToKKyAgICAgICAgIyBBIHNpbXBsZSBjb25maWcgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNldHRpbmdzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdGFuZGFyZEVycm9yLCBzZWxmLmFwcGx5X2NvbmZpZywgc2VsZi5jb25maWcyYikKKworICAgIGRlZiB0ZXN0X2NvbmZpZzNfZmFpbHVyZShzZWxmKToKKyAgICAgICAgIyBBIHNpbXBsZSBjb25maWcgd2hpY2ggb3ZlcnJpZGVzIHRoZSBkZWZhdWx0IHNldHRpbmdzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdGFuZGFyZEVycm9yLCBzZWxmLmFwcGx5X2NvbmZpZywgc2VsZi5jb25maWczKQorCisgICAgZGVmIHRlc3RfY29uZmlnNF9vayhzZWxmKToKKyAgICAgICAgIyBBIGNvbmZpZyBzcGVjaWZ5aW5nIGEgY3VzdG9tIGZvcm1hdHRlciBjbGFzcy4KKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzQpCisgICAgICAgICAgICAjbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigpCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJqdXN0IHRlc3RpbmciKQorICAgICAgICAgICAgc3lzLnN0ZG91dC5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICJFUlJPUjpyb290Omp1c3QgdGVzdGluZ1xuR290IGEgW1J1bnRpbWVFcnJvcl1cbiIpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZzRhX29rKHNlbGYpOgorICAgICAgICAjIEEgY29uZmlnIHNwZWNpZnlpbmcgYSBjdXN0b20gZm9ybWF0dGVyIGNsYXNzLgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnNGEpCisgICAgICAgICAgICAjbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigpCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJqdXN0IHRlc3RpbmciKQorICAgICAgICAgICAgc3lzLnN0ZG91dC5zZWVrKDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICJFUlJPUjpyb290Omp1c3QgdGVzdGluZ1xuR290IGEgW1J1bnRpbWVFcnJvcl1cbiIpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKworICAgIGRlZiB0ZXN0X2NvbmZpZzVfb2soc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9jb25maWcxX29rKGNvbmZpZz1zZWxmLmNvbmZpZzUpCisKKyAgICBkZWYgdGVzdF9jb25maWc2X2ZhaWx1cmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzYpCisKKyAgICBkZWYgdGVzdF9jb25maWc3X29rKHNlbGYpOgorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnMSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIiKQorICAgICAgICAgICAgIyBCb3RoIHdpbGwgb3V0cHV0IGEgbWVzc2FnZQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnMScpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnMicpLAorICAgICAgICAgICAgXSwgc3RyZWFtPW91dHB1dCkKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzcpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2dnZXIuZGlzYWJsZWQpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIubGV4ZXIiKQorICAgICAgICAgICAgIyBCb3RoIHdpbGwgb3V0cHV0IGEgbWVzc2FnZQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnMycpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnNCcpLAorICAgICAgICAgICAgXSwgc3RyZWFtPW91dHB1dCkKKyAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKworICAgICNTYW1lIGFzIHRlc3RfY29uZmlnXzdfb2sgYnV0IGRvbid0IGRpc2FibGUgb2xkIGxvZ2dlcnMuCisgICAgZGVmIHRlc3RfY29uZmlnXzhfb2soc2VsZik6CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWcxKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICAjIEJvdGggd2lsbCBvdXRwdXQgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnSU5GTycsICcxJyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICcyJyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIG91dHB1dDoKKyAgICAgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYuY29uZmlnOCkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsb2dnZXIuZGlzYWJsZWQpCisgICAgICAgICAgICAjIEJvdGggd2lsbCBvdXRwdXQgYSBtZXNzYWdlCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIubGV4ZXIiKQorICAgICAgICAgICAgIyBCb3RoIHdpbGwgb3V0cHV0IGEgbWVzc2FnZQorICAgICAgICAgICAgbG9nZ2VyLmluZm8oc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnMycpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnNCcpLAorICAgICAgICAgICAgICAgICgnSU5GTycsICc1JyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICc2JyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorCisgICAgZGVmIHRlc3RfY29uZmlnXzlfb2soc2VsZik6CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWc5KQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICAjTm90aGluZyB3aWxsIGJlIG91dHB1dCBzaW5jZSBib3RoIGhhbmRsZXIgYW5kIGxvZ2dlciBhcmUgc2V0IHRvIFdBUk5JTkcKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzlhKQorICAgICAgICAgICAgI05vdGhpbmcgd2lsbCBiZSBvdXRwdXQgc2luY2UgYm90aCBoYW5kbGVyIGlzIHN0aWxsIHNldCB0byBXQVJOSU5HCisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdLCBzdHJlYW09b3V0cHV0KQorICAgICAgICAgICAgc2VsZi5hcHBseV9jb25maWcoc2VsZi5jb25maWc5YikKKyAgICAgICAgICAgICNNZXNzYWdlIHNob3VsZCBub3cgYmUgb3V0cHV0CisgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ0lORk8nLCAnMycpLAorICAgICAgICAgICAgXSwgc3RyZWFtPW91dHB1dCkKKworICAgIGRlZiB0ZXN0X2NvbmZpZ18xMF9vayhzZWxmKToKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLmFwcGx5X2NvbmZpZyhzZWxmLmNvbmZpZzEwKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlciIpCisgICAgICAgICAgICBsb2dnZXIud2FybmluZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2NvbXBpbGVyJykKKyAgICAgICAgICAgICNOb3Qgb3V0cHV0LCBiZWNhdXNlIGZpbHRlcmVkCisgICAgICAgICAgICBsb2dnZXIud2FybmluZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2NvbXBpbGVyLmxleGVyJykKKyAgICAgICAgICAgICNOb3Qgb3V0cHV0LCBiZWNhdXNlIGZpbHRlcmVkCisgICAgICAgICAgICBsb2dnZXIud2FybmluZyhzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoImNvbXBpbGVyLnBhcnNlci5jb2RlZ2VuIikKKyAgICAgICAgICAgICNPdXRwdXQsIGFzIG5vdCBmaWx0ZXJlZAorICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgICAgICgnV0FSTklORycsICcxJyksCisgICAgICAgICAgICAgICAgKCdFUlJPUicsICc0JyksCisgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQorCisgICAgZGVmIHRlc3RfY29uZmlnMTFfb2soc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9jb25maWcxX29rKHNlbGYuY29uZmlnMTEpCisKKyAgICBkZWYgdGVzdF9jb25maWcxMl9mYWlsdXJlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdGFuZGFyZEVycm9yLCBzZWxmLmFwcGx5X2NvbmZpZywgc2VsZi5jb25maWcxMikKKworICAgIGRlZiB0ZXN0X2NvbmZpZzEzX2ZhaWx1cmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0YW5kYXJkRXJyb3IsIHNlbGYuYXBwbHlfY29uZmlnLCBzZWxmLmNvbmZpZzEzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnbGlzdGVuKCkgbmVlZHMgdGhyZWFkaW5nIHRvIHdvcmsnKQorICAgIGRlZiBzZXR1cF92aWFfbGlzdGVuZXIoc2VsZiwgdGV4dCk6CisgICAgICAgICMgQXNrIGZvciBhIHJhbmRvbWx5IGFzc2lnbmVkIHBvcnQgKGJ5IHVzaW5nIHBvcnQgMCkKKyAgICAgICAgdCA9IGxvZ2dpbmcuY29uZmlnLmxpc3RlbigwKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5yZWFkeS53YWl0KCkKKyAgICAgICAgIyBOb3cgZ2V0IHRoZSBwb3J0IGFsbG9jYXRlZAorICAgICAgICBwb3J0ID0gdC5wb3J0CisgICAgICAgIHQucmVhZHkuY2xlYXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICAgICAgc29jay5zZXR0aW1lb3V0KDIuMCkKKyAgICAgICAgICAgIHNvY2suY29ubmVjdCgoJ2xvY2FsaG9zdCcsIHBvcnQpKQorCisgICAgICAgICAgICBzbGVuID0gc3RydWN0LnBhY2soJz5MJywgbGVuKHRleHQpKQorICAgICAgICAgICAgcyA9IHNsZW4gKyB0ZXh0CisgICAgICAgICAgICBzZW50c29mYXIgPSAwCisgICAgICAgICAgICBsZWZ0ID0gbGVuKHMpCisgICAgICAgICAgICB3aGlsZSBsZWZ0ID4gMDoKKyAgICAgICAgICAgICAgICBzZW50ID0gc29jay5zZW5kKHNbc2VudHNvZmFyOl0pCisgICAgICAgICAgICAgICAgc2VudHNvZmFyICs9IHNlbnQKKyAgICAgICAgICAgICAgICBsZWZ0IC09IHNlbnQKKyAgICAgICAgICAgIHNvY2suY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdC5yZWFkeS53YWl0KDIuMCkKKyAgICAgICAgICAgIGxvZ2dpbmcuY29uZmlnLnN0b3BMaXN0ZW5pbmcoKQorICAgICAgICAgICAgdC5qb2luKDIuMCkKKworICAgIGRlZiB0ZXN0X2xpc3Rlbl9jb25maWdfMTBfb2soc2VsZik6CisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgb3V0cHV0OgorICAgICAgICAgICAgc2VsZi5zZXR1cF92aWFfbGlzdGVuZXIoanNvbi5kdW1wcyhzZWxmLmNvbmZpZzEwKSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIiKQorICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdjb21waWxlcicpCisgICAgICAgICAgICAjTm90IG91dHB1dCwgYmVjYXVzZSBmaWx0ZXJlZAorICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdjb21waWxlci5sZXhlcicpCisgICAgICAgICAgICAjTm90IG91dHB1dCwgYmVjYXVzZSBmaWx0ZXJlZAorICAgICAgICAgICAgbG9nZ2VyLndhcm5pbmcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJjb21waWxlci5wYXJzZXIuY29kZWdlbiIpCisgICAgICAgICAgICAjT3V0cHV0LCBhcyBub3QgZmlsdGVyZWQKKyAgICAgICAgICAgIGxvZ2dlci5lcnJvcihzZWxmLm5leHRfbWVzc2FnZSgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgICAgICAgICAoJ1dBUk5JTkcnLCAnMScpLAorICAgICAgICAgICAgICAgICgnRVJST1InLCAnNCcpLAorICAgICAgICAgICAgXSwgc3RyZWFtPW91dHB1dCkKKworICAgIGRlZiB0ZXN0X2xpc3Rlbl9jb25maWdfMV9vayhzZWxmKToKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBvdXRwdXQ6CisgICAgICAgICAgICBzZWxmLnNldHVwX3ZpYV9saXN0ZW5lcih0ZXh0d3JhcC5kZWRlbnQoQ29uZmlnRmlsZVRlc3QuY29uZmlnMSkpCisgICAgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlcigiY29tcGlsZXIucGFyc2VyIikKKyAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCisgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICAgICAgKCdJTkZPJywgJzEnKSwKKyAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKKyAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCisgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCisgICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisKKyAgICBkZWYgdGVzdF9vdXRfb2Zfb3JkZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXBwbHlfY29uZmlnKHNlbGYub3V0X29mX29yZGVyKQorICAgICAgICBoYW5kbGVyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ215bW9kdWxlJykuaGFuZGxlcnNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGhhbmRsZXIudGFyZ2V0LCBsb2dnaW5nLkhhbmRsZXIpCisKK2NsYXNzIE1hbmFnZXJUZXN0KEJhc2VUZXN0KToKKyAgICBkZWYgdGVzdF9tYW5hZ2VyX2xvZ2dlcmNsYXNzKHNlbGYpOgorICAgICAgICBsb2dnZWQgPSBbXQorCisgICAgICAgIGNsYXNzIE15TG9nZ2VyKGxvZ2dpbmcuTG9nZ2VyKToKKyAgICAgICAgICAgIGRlZiBfbG9nKHNlbGYsIGxldmVsLCBtc2csIGFyZ3MsIGV4Y19pbmZvPU5vbmUsIGV4dHJhPU5vbmUpOgorICAgICAgICAgICAgICAgIGxvZ2dlZC5hcHBlbmQobXNnKQorCisgICAgICAgIG1hbiA9IGxvZ2dpbmcuTWFuYWdlcihOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hbi5zZXRMb2dnZXJDbGFzcywgaW50KQorICAgICAgICBtYW4uc2V0TG9nZ2VyQ2xhc3MoTXlMb2dnZXIpCisgICAgICAgIGxvZ2dlciA9IG1hbi5nZXRMb2dnZXIoJ3Rlc3QnKQorICAgICAgICBsb2dnZXIud2FybmluZygnc2hvdWxkIGFwcGVhciBpbiBsb2dnZWQnKQorICAgICAgICBsb2dnaW5nLndhcm5pbmcoJ3Nob3VsZCBub3QgYXBwZWFyIGluIGxvZ2dlZCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2dnZWQsIFsnc2hvdWxkIGFwcGVhciBpbiBsb2dnZWQnXSkKKworCitjbGFzcyBDaGlsZExvZ2dlclRlc3QoQmFzZVRlc3QpOgorICAgIGRlZiB0ZXN0X2NoaWxkX2xvZ2dlcnMoc2VsZik6CisgICAgICAgIHIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgIGwxID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2FiYycpCisgICAgICAgIGwyID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2RlZi5naGknKQorICAgICAgICBjMSA9IHIuZ2V0Q2hpbGQoJ3h5eicpCisgICAgICAgIGMyID0gci5nZXRDaGlsZCgndXZ3Lnh5eicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMSBpcyBsb2dnaW5nLmdldExvZ2dlcigneHl6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMiBpcyBsb2dnaW5nLmdldExvZ2dlcigndXZ3Lnh5eicpKQorICAgICAgICBjMSA9IGwxLmdldENoaWxkKCdkZWYnKQorICAgICAgICBjMiA9IGMxLmdldENoaWxkKCdnaGknKQorICAgICAgICBjMyA9IGwxLmdldENoaWxkKCdkZWYuZ2hpJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMxIGlzIGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhYmMuZGVmJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMiBpcyBsb2dnaW5nLmdldExvZ2dlcignYWJjLmRlZi5naGknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMyIGlzIGMzKQorCisKK2NsYXNzIEhhbmRsZXJUZXN0KEJhc2VUZXN0KToKKworICAgIEB1bml0dGVzdC5za2lwSWYob3MubmFtZSA9PSAnbnQnLCAnV2F0Y2hlZEZpbGVIYW5kbGVyIG5vdCBhcHByb3ByaWF0ZSBmb3IgV2luZG93cy4nKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCisgICAgZGVmIHRlc3RfcmFjZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTQ2MzIgcmVmZXJzLgorICAgICAgICBkZWYgcmVtb3ZlX2xvb3AoZm5hbWUsIHRyaWVzKToKKyAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKHRyaWVzKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMDQgKiByYW5kb20ucmFuZGludCgwLCA0KSkKKworICAgICAgICBkZWxfY291bnQgPSA1MDAKKyAgICAgICAgbG9nX2NvdW50ID0gNTAwCisKKyAgICAgICAgZm9yIGRlbGF5IGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICBmZCwgZm4gPSB0ZW1wZmlsZS5ta3N0ZW1wKCcubG9nJywgJ3Rlc3RfbG9nZ2luZy0zLScpCisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIHJlbW92ZXIgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1yZW1vdmVfbG9vcCwgYXJncz0oZm4sIGRlbF9jb3VudCkpCisgICAgICAgICAgICByZW1vdmVyLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHJlbW92ZXIuc3RhcnQoKQorICAgICAgICAgICAgaCA9IGxvZ2dpbmcuaGFuZGxlcnMuV2F0Y2hlZEZpbGVIYW5kbGVyKGZuLCBkZWxheT1kZWxheSkKKyAgICAgICAgICAgIGYgPSBsb2dnaW5nLkZvcm1hdHRlcignJShhc2N0aW1lKXM6ICUobGV2ZWxuYW1lKXM6ICUobWVzc2FnZSlzJykKKyAgICAgICAgICAgIGguc2V0Rm9ybWF0dGVyKGYpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9yIF8gaW4gcmFuZ2UobG9nX2NvdW50KToKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAwNSkKKyAgICAgICAgICAgICAgICAgICAgciA9IGxvZ2dpbmcubWFrZUxvZ1JlY29yZCh7J21zZyc6ICd0ZXN0aW5nJyB9KQorICAgICAgICAgICAgICAgICAgICBoLmhhbmRsZShyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICByZW1vdmVyLmpvaW4oKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaC5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKKworCisjIFNldCB0aGUgbG9jYWxlIHRvIHRoZSBwbGF0Zm9ybS1kZXBlbmRlbnQgZGVmYXVsdC4gIEkgaGF2ZSBubyBpZGVhCisjIHdoeSB0aGUgdGVzdCBkb2VzIHRoaXMsIGJ1dCBpbiBhbnkgY2FzZSB3ZSBzYXZlIHRoZSBjdXJyZW50IGxvY2FsZQorIyBmaXJzdCBhbmQgcmVzdG9yZSBpdCBhdCB0aGUgZW5kLgorQHJ1bl93aXRoX2xvY2FsZSgnTENfQUxMJywgJycpCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEJ1aWx0aW5MZXZlbHNUZXN0LCBCYXNpY0ZpbHRlclRlc3QsCisgICAgICAgICAgICAgICAgIEN1c3RvbUxldmVsc0FuZEZpbHRlcnNUZXN0LCBNZW1vcnlIYW5kbGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgQ29uZmlnRmlsZVRlc3QsIFNvY2tldEhhbmRsZXJUZXN0LCBNZW1vcnlUZXN0LAorICAgICAgICAgICAgICAgICBFbmNvZGluZ1Rlc3QsIFdhcm5pbmdzVGVzdCwgQ29uZmlnRGljdFRlc3QsIE1hbmFnZXJUZXN0LAorICAgICAgICAgICAgICAgICBDaGlsZExvZ2dlclRlc3QsIEhhbmRsZXJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2dnaW5nLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWQxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2dnaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2dnaW5nLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvZ2dpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZWQxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb2dnaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg0N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weQpAQCAtMCwwICsxLDkxNiBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBtYXRoCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9pbnQsIHRlc3Rfc3VwcG9ydAorCisjIFVzZWQgZm9yIGxhenkgZm9ybWF0dGluZyBvZiBmYWlsdXJlIG1lc3NhZ2VzCitjbGFzcyBGcm0ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0LCAqYXJncyk6CisgICAgICAgIHNlbGYuZm9ybWF0ID0gZm9ybWF0CisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5mb3JtYXQgJSBzZWxmLmFyZ3MKKworIyBTSElGVCBzaG91bGQgbWF0Y2ggdGhlIHZhbHVlIGluIGxvbmdpbnRyZXByLmggZm9yIGJlc3QgdGVzdGluZy4KK1NISUZUID0gc3lzLmxvbmdfaW5mby5iaXRzX3Blcl9kaWdpdAorQkFTRSA9IDIgKiogU0hJRlQKK01BU0sgPSBCQVNFIC0gMQorS0FSQVRTVUJBX0NVVE9GRiA9IDcwICAgIyBmcm9tIGxvbmdvYmplY3QuYworCisjIE1heCBudW1iZXIgb2YgYmFzZSBCQVNFIGRpZ2l0cyB0byB1c2UgaW4gdGVzdCBjYXNlcy4gIERvdWJsaW5nCisjIHRoaXMgd2lsbCBtb3JlIHRoYW4gZG91YmxlIHRoZSBydW50aW1lLgorTUFYRElHSVRTID0gMTUKKworIyBidWlsZCBzb21lIHNwZWNpYWwgdmFsdWVzCitzcGVjaWFsID0gbWFwKGxvbmcsIFswLCAxLCAyLCBCQVNFLCBCQVNFID4+IDFdKQorc3BlY2lhbC5hcHBlbmQoMHg1NTU1NTU1NTU1NTU1NTU1TCkKK3NwZWNpYWwuYXBwZW5kKDB4YWFhYWFhYWFhYWFhYWFhYUwpCisjICBzb21lIHNvbGlkIHN0cmluZ3Mgb2Ygb25lIGJpdHMKK3AyID0gNEwgICMgMCBhbmQgMSBhbHJlYWR5IGFkZGVkCitmb3IgaSBpbiByYW5nZSgyKlNISUZUKToKKyAgICBzcGVjaWFsLmFwcGVuZChwMiAtIDEpCisgICAgcDIgPSBwMiA8PCAxCitkZWwgcDIKKyMgYWRkIGNvbXBsZW1lbnRzICYgbmVnYXRpb25zCitzcGVjaWFsID0gc3BlY2lhbCArIG1hcChsYW1iZGEgeDogfngsIHNwZWNpYWwpICsgXAorICAgICAgICAgICAgICAgICAgICBtYXAobGFtYmRhIHg6IC14LCBzcGVjaWFsKQorCitMID0gWworICAgICAgICAoJzAnLCAwKSwKKyAgICAgICAgKCcxJywgMSksCisgICAgICAgICgnOScsIDkpLAorICAgICAgICAoJzEwJywgMTApLAorICAgICAgICAoJzk5JywgOTkpLAorICAgICAgICAoJzEwMCcsIDEwMCksCisgICAgICAgICgnMzE0JywgMzE0KSwKKyAgICAgICAgKCcgMzE0JywgMzE0KSwKKyAgICAgICAgKCczMTQgJywgMzE0KSwKKyAgICAgICAgKCcgIFx0XHQgIDMxNCAgXHRcdCAgJywgMzE0KSwKKyAgICAgICAgKHJlcHIoc3lzLm1heGludCksIHN5cy5tYXhpbnQpLAorICAgICAgICAoJyAgMXgnLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKCcgIDEgICcsIDEpLAorICAgICAgICAoJyAgMVwwMiAgJywgVmFsdWVFcnJvciksCisgICAgICAgICgnJywgVmFsdWVFcnJvciksCisgICAgICAgICgnICcsIFZhbHVlRXJyb3IpLAorICAgICAgICAoJyAgXHRcdCAgJywgVmFsdWVFcnJvcikKK10KK2lmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgTCArPSBbCisgICAgICAgICh1bmljb2RlKCcwJyksIDApLAorICAgICAgICAodW5pY29kZSgnMScpLCAxKSwKKyAgICAgICAgKHVuaWNvZGUoJzknKSwgOSksCisgICAgICAgICh1bmljb2RlKCcxMCcpLCAxMCksCisgICAgICAgICh1bmljb2RlKCc5OScpLCA5OSksCisgICAgICAgICh1bmljb2RlKCcxMDAnKSwgMTAwKSwKKyAgICAgICAgKHVuaWNvZGUoJzMxNCcpLCAzMTQpLAorICAgICAgICAodW5pY29kZSgnIDMxNCcpLCAzMTQpLAorICAgICAgICAodW5pY29kZSgnXHUwNjYzXHUwNjYxXHUwNjY0ICcsJ3Jhdy11bmljb2RlLWVzY2FwZScpLCAzMTQpLAorICAgICAgICAodW5pY29kZSgnICBcdFx0ICAzMTQgIFx0XHQgICcpLCAzMTQpLAorICAgICAgICAodW5pY29kZSgnICAxeCcpLCBWYWx1ZUVycm9yKSwKKyAgICAgICAgKHVuaWNvZGUoJyAgMSAgJyksIDEpLAorICAgICAgICAodW5pY29kZSgnICAxXDAyICAnKSwgVmFsdWVFcnJvciksCisgICAgICAgICh1bmljb2RlKCcnKSwgVmFsdWVFcnJvciksCisgICAgICAgICh1bmljb2RlKCcgJyksIFZhbHVlRXJyb3IpLAorICAgICAgICAodW5pY29kZSgnICBcdFx0ICAnKSwgVmFsdWVFcnJvciksCisgICAgICAgICh1bmljaHIoMHgyMDApLCBWYWx1ZUVycm9yKSwKK10KKworY2xhc3MgTG9uZ1Rlc3QodGVzdF9pbnQuSW50TG9uZ0NvbW1vblRlc3RzLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBudHlwZSA9IGxvbmcKKworICAgICMgR2V0IHF1YXNpLXJhbmRvbSBsb25nIGNvbnNpc3Rpbmcgb2YgbmRpZ2l0cyBkaWdpdHMgKGluIGJhc2UgQkFTRSkuCisgICAgIyBxdWFzaSA9PSB0aGUgbW9zdC1zaWduaWZpY2FudCBkaWdpdCB3aWxsIG5vdCBiZSAwLCBhbmQgdGhlIG51bWJlcgorICAgICMgaXMgY29uc3RydWN0ZWQgdG8gY29udGFpbiBsb25nIHN0cmluZ3Mgb2YgMCBhbmQgMSBiaXRzLiAgVGhlc2UgYXJlCisgICAgIyBtb3JlIGxpa2VseSB0aGFuIHJhbmRvbSBiaXRzIHRvIHByb3Zva2UgZGlnaXQtYm91bmRhcnkgZXJyb3JzLgorICAgICMgVGhlIHNpZ24gb2YgdGhlIG51bWJlciBpcyBhbHNvIHJhbmRvbS4KKworICAgIGRlZiBnZXRyYW4oc2VsZiwgbmRpZ2l0cyk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZGlnaXRzID4gMCkKKyAgICAgICAgbmJpdHNfaGkgPSBuZGlnaXRzICogU0hJRlQKKyAgICAgICAgbmJpdHNfbG8gPSBuYml0c19oaSAtIFNISUZUICsgMQorICAgICAgICBhbnN3ZXIgPSAwTAorICAgICAgICBuYml0cyA9IDAKKyAgICAgICAgciA9IGludChyYW5kb20ucmFuZG9tKCkgKiAoU0hJRlQgKiAyKSkgfCAxICAjIGZvcmNlIDEgYml0cyB0byBzdGFydAorICAgICAgICB3aGlsZSBuYml0cyA8IG5iaXRzX2xvOgorICAgICAgICAgICAgYml0cyA9IChyID4+IDEpICsgMQorICAgICAgICAgICAgYml0cyA9IG1pbihiaXRzLCBuYml0c19oaSAtIG5iaXRzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEgPD0gYml0cyA8PSBTSElGVCkKKyAgICAgICAgICAgIG5iaXRzID0gbmJpdHMgKyBiaXRzCisgICAgICAgICAgICBhbnN3ZXIgPSBhbnN3ZXIgPDwgYml0cworICAgICAgICAgICAgaWYgciAmIDE6CisgICAgICAgICAgICAgICAgYW5zd2VyID0gYW5zd2VyIHwgKCgxIDw8IGJpdHMpIC0gMSkKKyAgICAgICAgICAgIHIgPSBpbnQocmFuZG9tLnJhbmRvbSgpICogKFNISUZUICogMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYml0c19sbyA8PSBuYml0cyA8PSBuYml0c19oaSkKKyAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgorICAgICAgICAgICAgYW5zd2VyID0gLWFuc3dlcgorICAgICAgICByZXR1cm4gYW5zd2VyCisKKyAgICAjIEdldCByYW5kb20gbG9uZyBjb25zaXN0aW5nIG9mIG5kaWdpdHMgcmFuZG9tIGRpZ2l0cyAocmVsYXRpdmUgdG8gYmFzZQorICAgICMgQkFTRSkuICBUaGUgc2lnbiBiaXQgaXMgYWxzbyByYW5kb20uCisKKyAgICBkZWYgZ2V0cmFuMihuZGlnaXRzKToKKyAgICAgICAgYW5zd2VyID0gMEwKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKG5kaWdpdHMpOgorICAgICAgICAgICAgYW5zd2VyID0gKGFuc3dlciA8PCBTSElGVCkgfCByYW5kb20ucmFuZGludCgwLCBNQVNLKQorICAgICAgICBpZiByYW5kb20ucmFuZG9tKCkgPCAwLjU6CisgICAgICAgICAgICBhbnN3ZXIgPSAtYW5zd2VyCisgICAgICAgIHJldHVybiBhbnN3ZXIKKworICAgIGRlZiBjaGVja19kaXZpc2lvbihzZWxmLCB4LCB5KToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHEsIHIgPSBkaXZtb2QoeCwgeSkKKyAgICAgICAgcTIsIHIyID0geC8veSwgeCV5CisgICAgICAgIHBhYiwgcGJhID0geCp5LCB5KngKKyAgICAgICAgZXEocGFiLCBwYmEsIEZybSgibXVsdGlwbGljYXRpb24gZG9lcyBub3QgY29tbXV0ZSBmb3IgJXIgYW5kICVyIiwgeCwgeSkpCisgICAgICAgIGVxKHEsIHEyLCBGcm0oImRpdm1vZCByZXR1cm5zIGRpZmZlcmVudCBxdW90aWVudCB0aGFuIC8gZm9yICVyIGFuZCAlciIsIHgsIHkpKQorICAgICAgICBlcShyLCByMiwgRnJtKCJkaXZtb2QgcmV0dXJucyBkaWZmZXJlbnQgbW9kIHRoYW4gJSUgZm9yICVyIGFuZCAlciIsIHgsIHkpKQorICAgICAgICBlcSh4LCBxKnkgKyByLCBGcm0oInggIT0gcSp5ICsgciBhZnRlciBkaXZtb2Qgb24geD0lciwgeT0lciIsIHgsIHkpKQorICAgICAgICBpZiB5ID4gMDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IHIgPCB5LCBGcm0oImJhZCBtb2QgZnJvbSBkaXZtb2Qgb24gJXIgYW5kICVyIiwgeCwgeSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeSA8IHIgPD0gMCwgRnJtKCJiYWQgbW9kIGZyb20gZGl2bW9kIG9uICVyIGFuZCAlciIsIHgsIHkpKQorCisgICAgZGVmIHRlc3RfZGl2aXNpb24oc2VsZik6CisgICAgICAgIGRpZ2l0cyA9IHJhbmdlKDEsIE1BWERJR0lUUysxKSArIHJhbmdlKEtBUkFUU1VCQV9DVVRPRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtBUkFUU1VCQV9DVVRPRkYgKyAxNCkKKyAgICAgICAgZGlnaXRzLmFwcGVuZChLQVJBVFNVQkFfQ1VUT0ZGICogMykKKyAgICAgICAgZm9yIGxlbnggaW4gZGlnaXRzOgorICAgICAgICAgICAgeCA9IHNlbGYuZ2V0cmFuKGxlbngpCisgICAgICAgICAgICBmb3IgbGVueSBpbiBkaWdpdHM6CisgICAgICAgICAgICAgICAgeSA9IHNlbGYuZ2V0cmFuKGxlbnkpIG9yIDFMCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19kaXZpc2lvbih4LCB5KQorCisgICAgICAgICMgc3BlY2lmaWMgbnVtYmVycyBjaG9zZW4gdG8gZXhlcmNpc2UgY29ybmVyIGNhc2VzIG9mIHRoZQorICAgICAgICAjIGN1cnJlbnQgbG9uZyBkaXZpc2lvbiBpbXBsZW1lbnRhdGlvbgorCisgICAgICAgICMgMzAtYml0IGNhc2VzIGludm9sdmluZyBhIHF1b3RpZW50IGRpZ2l0IGVzdGltYXRlIG9mIEJBU0UrMQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDEyMzE5NDg0MTIyOTA4NzkzOTU5NjY3MDI4ODFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExNDczNDEzNjcxMzE0Mjg2OThMKQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDgxNTQyNzc1NjQ4MTI3NTQzMDM0MjMxMjAyMTUxNTU4Nzg4M0wsCisgICAgICAgICAgICAgICAgICAgICAgIDcwNzI3MDgzNjA2OTAyNzc0NUwpCisgICAgICAgIHNlbGYuY2hlY2tfZGl2aXNpb24oNjI3OTc2MDczNjk3MDEyODIwODQ5NDQzMzYzNTYzNTk5MDQxTCwKKyAgICAgICAgICAgICAgICAgICAgICAgNjQzNTg4Nzk4NDk2MDU3MDIwTCkKKyAgICAgICAgc2VsZi5jaGVja19kaXZpc2lvbigxMTE1MTQxMzczNjUzNzUyMzAzNzEwOTMyNzU2MzI1NTc4MDY1TCwKKyAgICAgICAgICAgICAgICAgICAgICAgMTAzODU1NjMzNTE3MTQ1MzkzNzcyNjg4MjYyN0wpCisgICAgICAgICMgMzAtYml0IGNhc2VzIHRoYXQgcmVxdWlyZSB0aGUgcG9zdC1zdWJ0cmFjdGlvbiBjb3JyZWN0aW9uIHN0ZXAKKyAgICAgICAgc2VsZi5jaGVja19kaXZpc2lvbig5MjI0OTg5MDU0MDU0MzY3NTE5NDA5ODkzMjA5MzAzNjg0OTRMLAorICAgICAgICAgICAgICAgICAgICAgICA5NDk5ODU4NzA2ODY3ODYxMzU2MjY5NDMzOTZMKQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDc2ODIzNTg1MzMyODA5MTE2NzIwNDAwOTY1MjE3NDAzMTg0NEwsCisgICAgICAgICAgICAgICAgICAgICAgIDEwOTE1NTU1NDExODAzNzE1NTQ0MjY1NDUyNjZMKQorCisgICAgICAgICMgMTUtYml0IGNhc2VzIGludm9sdmluZyBhIHF1b3RpZW50IGRpZ2l0IGVzdGltYXRlIG9mIEJBU0UrMQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDIwMTcyMTg4OTQ3NDQzTCwgNjE1NjExMzk3TCkKKyAgICAgICAgc2VsZi5jaGVja19kaXZpc2lvbigxMDIwOTA4NTMwMjcwMTU1MDI1TCwgOTUwNzk1NzEwTCkKKyAgICAgICAgc2VsZi5jaGVja19kaXZpc2lvbigxMjg1ODk1NjU3MjMxMTI0MDhMLCA3MzYzOTM3MThMKQorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDYwOTkxOTc4MDI4NTc2MTU3NUwsIDE4NjEzMjc0NTQ2Nzg0TCkKKyAgICAgICAgIyAxNS1iaXQgY2FzZXMgdGhhdCByZXF1aXJlIHRoZSBwb3N0LXN1YnRyYWN0aW9uIGNvcnJlY3Rpb24gc3RlcAorICAgICAgICBzZWxmLmNoZWNrX2RpdmlzaW9uKDcxMDAzMTY4MTU3NjM4ODAzMkwsIDI2NzY5NDA0MzkxMzA4TCkKKyAgICAgICAgc2VsZi5jaGVja19kaXZpc2lvbigxOTMzNjIyNjE0MjY4MjIxTCwgMzAyMTI4NTMzNDg4MzZMKQorCisKKworICAgIGRlZiB0ZXN0X2thcmF0c3ViYShzZWxmKToKKyAgICAgICAgZGlnaXRzID0gcmFuZ2UoMSwgNSkgKyByYW5nZShLQVJBVFNVQkFfQ1VUT0ZGLCBLQVJBVFNVQkFfQ1VUT0ZGICsgMTApCisgICAgICAgIGRpZ2l0cy5leHRlbmQoW0tBUkFUU1VCQV9DVVRPRkYgKiAxMCwgS0FSQVRTVUJBX0NVVE9GRiAqIDEwMF0pCisKKyAgICAgICAgYml0cyA9IFtkaWdpdCAqIFNISUZUIGZvciBkaWdpdCBpbiBkaWdpdHNdCisKKyAgICAgICAgIyBUZXN0IHByb2R1Y3RzIG9mIGxvbmcgc3RyaW5ncyBvZiAxIGJpdHMgLS0gKDIqKngtMSkqKDIqKnktMSkgPT0KKyAgICAgICAgIyAyKiooeCt5KSAtIDIqKnggLSAyKip5ICsgMSwgc28gdGhlIHByb3BlciByZXN1bHQgaXMgZWFzeSB0byBjaGVjay4KKyAgICAgICAgZm9yIGFiaXRzIGluIGJpdHM6CisgICAgICAgICAgICBhID0gKDFMIDw8IGFiaXRzKSAtIDEKKyAgICAgICAgICAgIGZvciBiYml0cyBpbiBiaXRzOgorICAgICAgICAgICAgICAgIGlmIGJiaXRzIDwgYWJpdHM6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgYiA9ICgxTCA8PCBiYml0cykgLSAxCisgICAgICAgICAgICAgICAgeCA9IGEgKiBiCisgICAgICAgICAgICAgICAgeSA9ICgoMUwgPDwgKGFiaXRzICsgYmJpdHMpKSAtCisgICAgICAgICAgICAgICAgICAgICAoMUwgPDwgYWJpdHMpIC0KKyAgICAgICAgICAgICAgICAgICAgICgxTCA8PCBiYml0cykgKworICAgICAgICAgICAgICAgICAgICAgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHksCisgICAgICAgICAgICAgICAgICAgIEZybSgiYmFkIHJlc3VsdCBmb3IgYSpiOiBhPSVyLCBiPSVyLCB4PSVyLCB5PSVyIiwgYSwgYiwgeCwgeSkpCisKKyAgICBkZWYgY2hlY2tfYml0b3BfaWRlbnRpdGllc18xKHNlbGYsIHgpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoeCAmIDAsIDAsIEZybSgieCAmIDAgIT0gMCBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSh4IHwgMCwgeCwgRnJtKCJ4IHwgMCAhPSB4IGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHggXiAwLCB4LCBGcm0oInggXiAwICE9IHggZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCAmIC0xLCB4LCBGcm0oInggJiAtMSAhPSB4IGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHggfCAtMSwgLTEsIEZybSgieCB8IC0xICE9IC0xIGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHggXiAtMSwgfngsIEZybSgieCBeIC0xICE9IH54IGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHgsIH5+eCwgRnJtKCJ4ICE9IH5+eCBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSh4ICYgeCwgeCwgRnJtKCJ4ICYgeCAhPSB4IGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKHggfCB4LCB4LCBGcm0oInggfCB4ICE9IHggZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCBeIHgsIDAsIEZybSgieCBeIHggIT0gMCBmb3IgeD0lciIsIHgpKQorICAgICAgICBlcSh4ICYgfngsIDAsIEZybSgieCAmIH54ICE9IDAgZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCB8IH54LCAtMSwgRnJtKCJ4IHwgfnggIT0gLTEgZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoeCBeIH54LCAtMSwgRnJtKCJ4IF4gfnggIT0gLTEgZm9yIHg9JXIiLCB4KSkKKyAgICAgICAgZXEoLXgsIDEgKyB+eCwgRnJtKCJub3QgLXggPT0gMSArIH54IGZvciB4PSVyIiwgeCkpCisgICAgICAgIGVxKC14LCB+KHgtMSksIEZybSgibm90IC14ID09IH4oeC0xKSBmb3J4ID0lciIsIHgpKQorICAgICAgICBmb3IgbiBpbiB4cmFuZ2UoMipTSElGVCk6CisgICAgICAgICAgICBwMiA9IDJMICoqIG4KKyAgICAgICAgICAgIGVxKHggPDwgbiA+PiBuLCB4LAorICAgICAgICAgICAgICAgIEZybSgieCA8PCBuID4+IG4gIT0geCBmb3IgeD0lciwgbj0lciIsICh4LCBuKSkpCisgICAgICAgICAgICBlcSh4IC8vIHAyLCB4ID4+IG4sCisgICAgICAgICAgICAgICAgRnJtKCJ4IC8vIHAyICE9IHggPj4gbiBmb3IgeD0lciBuPSVyIHAyPSVyIiwgKHgsIG4sIHAyKSkpCisgICAgICAgICAgICBlcSh4ICogcDIsIHggPDwgbiwKKyAgICAgICAgICAgICAgICBGcm0oInggKiBwMiAhPSB4IDw8IG4gZm9yIHg9JXIgbj0lciBwMj0lciIsICh4LCBuLCBwMikpKQorICAgICAgICAgICAgZXEoeCAmIC1wMiwgeCA+PiBuIDw8IG4sCisgICAgICAgICAgICAgICAgRnJtKCJub3QgeCAmIC1wMiA9PSB4ID4+IG4gPDwgbiBmb3IgeD0lciBuPSVyIHAyPSVyIiwgKHgsIG4sIHAyKSkpCisgICAgICAgICAgICBlcSh4ICYgLXAyLCB4ICYgfihwMiAtIDEpLAorICAgICAgICAgICAgICAgIEZybSgibm90IHggJiAtcDIgPT0geCAmIH4ocDIgLSAxKSBmb3IgeD0lciBuPSVyIHAyPSVyIiwgKHgsIG4sIHAyKSkpCisKKyAgICBkZWYgY2hlY2tfYml0b3BfaWRlbnRpdGllc18yKHNlbGYsIHgsIHkpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoeCAmIHksIHkgJiB4LCBGcm0oInggJiB5ICE9IHkgJiB4IGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKyAgICAgICAgZXEoeCB8IHksIHkgfCB4LCBGcm0oInggfCB5ICE9IHkgfCB4IGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKyAgICAgICAgZXEoeCBeIHksIHkgXiB4LCBGcm0oInggXiB5ICE9IHkgXiB4IGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKyAgICAgICAgZXEoeCBeIHkgXiB4LCB5LCBGcm0oInggXiB5IF4geCAhPSB5IGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKyAgICAgICAgZXEoeCAmIHksIH4ofnggfCB+eSksIEZybSgieCAmIHkgIT0gfih+eCB8IH55KSBmb3IgeD0lciwgeT0lciIsICh4LCB5KSkpCisgICAgICAgIGVxKHggfCB5LCB+KH54ICYgfnkpLCBGcm0oInggfCB5ICE9IH4ofnggJiB+eSkgZm9yIHg9JXIsIHk9JXIiLCAoeCwgeSkpKQorICAgICAgICBlcSh4IF4geSwgKHggfCB5KSAmIH4oeCAmIHkpLAorICAgICAgICAgICAgIEZybSgieCBeIHkgIT0gKHggfCB5KSAmIH4oeCAmIHkpIGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKyAgICAgICAgZXEoeCBeIHksICh4ICYgfnkpIHwgKH54ICYgeSksCisgICAgICAgICAgICAgRnJtKCJ4IF4geSA9PSAoeCAmIH55KSB8ICh+eCAmIHkpIGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKyAgICAgICAgZXEoeCBeIHksICh4IHwgeSkgJiAofnggfCB+eSksCisgICAgICAgICAgICAgRnJtKCJ4IF4geSA9PSAoeCB8IHkpICYgKH54IHwgfnkpIGZvciB4PSVyLCB5PSVyIiwgKHgsIHkpKSkKKworICAgIGRlZiBjaGVja19iaXRvcF9pZGVudGl0aWVzXzMoc2VsZiwgeCwgeSwgeik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSgoeCAmIHkpICYgeiwgeCAmICh5ICYgeiksCisgICAgICAgICAgICAgRnJtKCIoeCAmIHkpICYgeiAhPSB4ICYgKHkgJiB6KSBmb3IgeD0lciwgeT0lciwgej0lciIsICh4LCB5LCB6KSkpCisgICAgICAgIGVxKCh4IHwgeSkgfCB6LCB4IHwgKHkgfCB6KSwKKyAgICAgICAgICAgICBGcm0oIih4IHwgeSkgfCB6ICE9IHggfCAoeSB8IHopIGZvciB4PSVyLCB5PSVyLCB6PSVyIiwgKHgsIHksIHopKSkKKyAgICAgICAgZXEoKHggXiB5KSBeIHosIHggXiAoeSBeIHopLAorICAgICAgICAgICAgIEZybSgiKHggXiB5KSBeIHogIT0geCBeICh5IF4geikgZm9yIHg9JXIsIHk9JXIsIHo9JXIiLCAoeCwgeSwgeikpKQorICAgICAgICBlcSh4ICYgKHkgfCB6KSwgKHggJiB5KSB8ICh4ICYgeiksCisgICAgICAgICAgICAgRnJtKCJ4ICYgKHkgfCB6KSAhPSAoeCAmIHkpIHwgKHggJiB6KSBmb3IgeD0lciwgeT0lciwgej0lciIsICh4LCB5LCB6KSkpCisgICAgICAgIGVxKHggfCAoeSAmIHopLCAoeCB8IHkpICYgKHggfCB6KSwKKyAgICAgICAgICAgICBGcm0oInggfCAoeSAmIHopICE9ICh4IHwgeSkgJiAoeCB8IHopIGZvciB4PSVyLCB5PSVyLCB6PSVyIiwgKHgsIHksIHopKSkKKworICAgIGRlZiB0ZXN0X2JpdG9wX2lkZW50aXRpZXMoc2VsZik6CisgICAgICAgIGZvciB4IGluIHNwZWNpYWw6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2JpdG9wX2lkZW50aXRpZXNfMSh4KQorICAgICAgICBkaWdpdHMgPSB4cmFuZ2UoMSwgTUFYRElHSVRTKzEpCisgICAgICAgIGZvciBsZW54IGluIGRpZ2l0czoKKyAgICAgICAgICAgIHggPSBzZWxmLmdldHJhbihsZW54KQorICAgICAgICAgICAgc2VsZi5jaGVja19iaXRvcF9pZGVudGl0aWVzXzEoeCkKKyAgICAgICAgICAgIGZvciBsZW55IGluIGRpZ2l0czoKKyAgICAgICAgICAgICAgICB5ID0gc2VsZi5nZXRyYW4obGVueSkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX2JpdG9wX2lkZW50aXRpZXNfMih4LCB5KQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfYml0b3BfaWRlbnRpdGllc18zKHgsIHksIHNlbGYuZ2V0cmFuKChsZW54ICsgbGVueSkvLzIpKQorCisgICAgZGVmIHNsb3dfZm9ybWF0KHNlbGYsIHgsIGJhc2UpOgorICAgICAgICBpZiAoeCwgYmFzZSkgPT0gKDAsIDgpOgorICAgICAgICAgICAgIyB0aGlzIGlzIGFuIG9kZGJhbGwhCisgICAgICAgICAgICByZXR1cm4gIjBMIgorICAgICAgICBkaWdpdHMgPSBbXQorICAgICAgICBzaWduID0gMAorICAgICAgICBpZiB4IDwgMDoKKyAgICAgICAgICAgIHNpZ24sIHggPSAxLCAteAorICAgICAgICB3aGlsZSB4OgorICAgICAgICAgICAgeCwgciA9IGRpdm1vZCh4LCBiYXNlKQorICAgICAgICAgICAgZGlnaXRzLmFwcGVuZChpbnQocikpCisgICAgICAgIGRpZ2l0cy5yZXZlcnNlKCkKKyAgICAgICAgZGlnaXRzID0gZGlnaXRzIG9yIFswXQorICAgICAgICByZXR1cm4gJy0nWzpzaWduXSArIFwKKyAgICAgICAgICAgICAgIHs4OiAnMCcsIDEwOiAnJywgMTY6ICcweCd9W2Jhc2VdICsgXAorICAgICAgICAgICAgICAgIiIuam9pbihtYXAobGFtYmRhIGk6ICIwMTIzNDU2Nzg5YWJjZGVmIltpXSwgZGlnaXRzKSkgKyAiTCIKKworICAgIGRlZiBjaGVja19mb3JtYXRfMShzZWxmLCB4KToKKyAgICAgICAgZm9yIGJhc2UsIG1hcHBlciBpbiAoOCwgb2N0KSwgKDEwLCByZXByKSwgKDE2LCBoZXgpOgorICAgICAgICAgICAgZ290ID0gbWFwcGVyKHgpCisgICAgICAgICAgICBleHBlY3RlZCA9IHNlbGYuc2xvd19mb3JtYXQoeCwgYmFzZSkKKyAgICAgICAgICAgIG1zZyA9IEZybSgiJXMgcmV0dXJuZWQgJXIgYnV0IGV4cGVjdGVkICVyIGZvciAlciIsCisgICAgICAgICAgICAgICAgbWFwcGVyLl9fbmFtZV9fLCBnb3QsIGV4cGVjdGVkLCB4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkLCBtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoZ290LCAwKSwgeCwgRnJtKCdsb25nKCIlcyIsIDApICE9ICVyJywgZ290LCB4KSkKKyAgICAgICAgIyBzdHIoKSBoYXMgdG8gYmUgY2hlY2tlZCBhIGxpdHRsZSBkaWZmZXJlbnRseSBzaW5jZSB0aGVyZSdzIG5vCisgICAgICAgICMgdHJhaWxpbmcgIkwiCisgICAgICAgIGdvdCA9IHN0cih4KQorICAgICAgICBleHBlY3RlZCA9IHNlbGYuc2xvd19mb3JtYXQoeCwgMTApWzotMV0KKyAgICAgICAgbXNnID0gRnJtKCIlcyByZXR1cm5lZCAlciBidXQgZXhwZWN0ZWQgJXIgZm9yICVyIiwKKyAgICAgICAgICAgIG1hcHBlci5fX25hbWVfXywgZ290LCBleHBlY3RlZCwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkLCBtc2cpCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIGZvciB4IGluIHNwZWNpYWw6CisgICAgICAgICAgICBzZWxmLmNoZWNrX2Zvcm1hdF8xKHgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CisgICAgICAgICAgICBmb3IgbGVueCBpbiB4cmFuZ2UoMSwgTUFYRElHSVRTKzEpOgorICAgICAgICAgICAgICAgIHggPSBzZWxmLmdldHJhbihsZW54KQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfZm9ybWF0XzEoeCkKKworICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygzMTQpLCAzMTRMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoMy4xNCksIDNMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoMzE0TCksIDMxNEwpCisgICAgICAgICMgQ2hlY2sgdGhhdCBsb25nKCkgb2YgYmFzaWMgdHlwZXMgYWN0dWFsbHkgcmV0dXJucyBhIGxvbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGxvbmcoMzE0KSksIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShsb25nKDMuMTQpKSwgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGxvbmcoMzE0TCkpLCBsb25nKQorICAgICAgICAjIENoZWNrIHRoYXQgY29udmVyc2lvbiBmcm9tIGZsb2F0IHRydW5jYXRlcyB0b3dhcmRzIHplcm8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKC0zLjE0KSwgLTNMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoMy45KSwgM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygtMy45KSwgLTNMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoMy41KSwgM0wpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygtMy41KSwgLTNMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoIi0zIiksIC0zTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCIwYjEwIiwgMiksIDJMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoIjBvMTAiLCA4KSwgOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygiMHgxMCIsIDE2KSwgMTZMKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKHVuaWNvZGUoIi0zIikpLCAtM0wpCisgICAgICAgICMgRGlmZmVyZW50IGJhc2U6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygiMTAiLDE2KSwgMTZMKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKHVuaWNvZGUoIjEwIiksMTYpLCAxNkwpCisgICAgICAgICMgQ2hlY2sgY29udmVyc2lvbnMgZnJvbSBzdHJpbmcgKHNhbWUgdGVzdCBzZXQgYXMgZm9yIGludCgpLCBhbmQgdGhlbiBzb21lKQorICAgICAgICBMTCA9IFsKKyAgICAgICAgICAgICAgICAoJzEnICsgJzAnKjIwLCAxMEwqKjIwKSwKKyAgICAgICAgICAgICAgICAoJzEnICsgJzAnKjEwMCwgMTBMKioxMDApCisgICAgICAgIF0KKyAgICAgICAgTDIgPSBMWzpdCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBMMiArPSBbCisgICAgICAgICAgICAgICAgKHVuaWNvZGUoJzEnKSArIHVuaWNvZGUoJzAnKSoyMCwgMTBMKioyMCksCisgICAgICAgICAgICAgICAgKHVuaWNvZGUoJzEnKSArIHVuaWNvZGUoJzAnKSoxMDAsIDEwTCoqMTAwKSwKKyAgICAgICAgXQorICAgICAgICBmb3IgcywgdiBpbiBMMiArIExMOgorICAgICAgICAgICAgZm9yIHNpZ24gaW4gIiIsICIrIiwgIi0iOgorICAgICAgICAgICAgICAgIGZvciBwcmVmaXggaW4gIiIsICIgIiwgIlx0IiwgIiAgXHRcdCAgIjoKKyAgICAgICAgICAgICAgICAgICAgc3MgPSBwcmVmaXggKyBzaWduICsgcworICAgICAgICAgICAgICAgICAgICB2diA9IHYKKyAgICAgICAgICAgICAgICAgICAgaWYgc2lnbiA9PSAiLSIgYW5kIHYgaXMgbm90IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICB2diA9IC12CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhzcyksIGxvbmcodnYpKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgdjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb25nLCAnMTIzXDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsb25nLCAnNTMnLCA0MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsb25nLCAxLCAxMikKKworICAgICAgICAjIHRlc3RzIHdpdGggYmFzZSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnIDAxMjMgICcsIDApLCA4MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcgMDEyMyAgJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzAwMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzBvMTIzJywgMCksIDgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzB4MTIzJywgMCksIDI5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcwYjEwMCcsIDApLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJyAwTzEyMyAgICcsIDApLCA4MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcgMFgxMjMgICcsIDApLCAyOTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnIDBCMTAwICcsIDApLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzAnLCAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcrMCcsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJy0wJywgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMDAnLCAwKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgJzA4JywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgJy0wMTIzOTUnLCAwKQorCisgICAgICAgICMgU0YgcGF0Y2ggIzE2Mzg4Nzk6IGVtYmVkZGVkIE5VTHMgd2VyZSBub3QgZGV0ZWN0ZWQgd2l0aAorICAgICAgICAjIGV4cGxpY2l0IGJhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbG9uZywgJzEyM1wwJywgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvbmcsICcxMjNceDAwIDI0NScsIDIwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJywgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDIwMDIwMjIyMDEyMjExMTEyMTEnLCAzKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDAwMDAwMDAwMDAwMDAwMCcsIDQpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzMyMjQ0MDAyNDIzMTQxJywgNSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTU1MDEwNDAxNTUwNCcsIDYpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzIxMTMwMTQyMjM1NCcsIDcpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzQwMDAwMDAwMDAwJywgOCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTIwNjg2NTc0NTQnLCA5KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0Mjk0OTY3Mjk2JywgMTApLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzE5MDQ0NDA1NTQnLCAxMSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnOWJhNDYxNTk0JywgMTIpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzUzNWE3OTg4OScsIDEzKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyY2E1Yjc0NjQnLCAxNCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMWEyMGRjZDgxJywgMTUpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMDAwMDAwMCcsIDE2KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdhN2ZmZGE5MScsIDE3KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc3MDRoZTdnNCcsIDE4KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0ZjVhZmY2NicsIDE5KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczNzIzYWk0ZycsIDIwKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyODFkNTVpNCcsIDIxKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxZmo4YjE4NCcsIDIyKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxNjA2azdpYycsIDIzKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdtYjk5NGFnJywgMjQpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2hlazJtZ2wnLCAyNSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnZG5jaGJubScsIDI2KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdiMjhqcGRtJywgMjcpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzhwZmdpaDQnLCAyOCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNzZiZWlnZycsIDI5KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc1cW1jcHFnJywgMzApLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzRxMGp0bzQnLCAzMSksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNDAwMDAwMCcsIDMyKSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczYW9rcTk0JywgMzMpLCA0Mjk0OTY3Mjk2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzJxaHhqbGknLCAzNCksIDQyOTQ5NjcyOTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMmJyNDVxYicsIDM1KSwgNDI5NDk2NzI5NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxejE0MXo0JywgMzYpLCA0Mjk0OTY3Mjk2KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAxJywgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDIwMDIwMjIyMDEyMjExMTEyMTInLCAzKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxMDAwMDAwMDAwMDAwMDAwMScsIDQpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzMyMjQ0MDAyNDIzMTQyJywgNSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTU1MDEwNDAxNTUwNScsIDYpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzIxMTMwMTQyMjM1NScsIDcpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzQwMDAwMDAwMDAxJywgOCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMTIwNjg2NTc0NTUnLCA5KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0Mjk0OTY3Mjk3JywgMTApLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzE5MDQ0NDA1NTUnLCAxMSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnOWJhNDYxNTk1JywgMTIpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzUzNWE3OTg4YScsIDEzKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyY2E1Yjc0NjUnLCAxNCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMWEyMGRjZDgyJywgMTUpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzEwMDAwMDAwMScsIDE2KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdhN2ZmZGE5MicsIDE3KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc3MDRoZTdnNScsIDE4KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc0ZjVhZmY2NycsIDE5KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczNzIzYWk0aCcsIDIwKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcyODFkNTVpNScsIDIxKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxZmo4YjE4NScsIDIyKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxNjA2azdpZCcsIDIzKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdtYjk5NGFoJywgMjQpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJ2hlazJtZ20nLCAyNSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnZG5jaGJubicsIDI2KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCdiMjhqcGRuJywgMjcpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzhwZmdpaDUnLCAyOCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNzZiZWlnaCcsIDI5KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCc1cW1jcHFoJywgMzApLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzRxMGp0bzUnLCAzMSksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnNDAwMDAwMScsIDMyKSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCczYW9rcTk1JywgMzMpLCA0Mjk0OTY3Mjk3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoJzJxaHhqbGonLCAzNCksIDQyOTQ5NjcyOTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZygnMmJyNDVxYycsIDM1KSwgNDI5NDk2NzI5NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKCcxejE0MXo1JywgMzYpLCA0Mjk0OTY3Mjk3KQorCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgX19sb25nX18oKQorICAgICAgICBjbGFzcyBDbGFzc2ljTWlzc2luZ01ldGhvZHM6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBsb25nLCBDbGFzc2ljTWlzc2luZ01ldGhvZHMoKSkKKworICAgICAgICBjbGFzcyBNaXNzaW5nTWV0aG9kcyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxvbmcsIE1pc3NpbmdNZXRob2RzKCkpCisKKyAgICAgICAgY2xhc3MgRm9vMDoKKyAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDJMCisKKyAgICAgICAgY2xhc3MgRm9vMShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MkwKKworICAgICAgICBjbGFzcyBGb28yKGxvbmcpOgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MkwKKworICAgICAgICBjbGFzcyBGb28zKGxvbmcpOgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgY2xhc3MgRm9vNChsb25nKToKKyAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICBjbGFzcyBGb281KGxvbmcpOgorICAgICAgICAgICAgZGVmIF9fbG9uZ19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiA0Mi4KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoRm9vMCgpKSwgNDJMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoRm9vMSgpKSwgNDJMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoRm9vMigpKSwgNDJMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoRm9vMygpKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKEZvbzQoKSksIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxvbmcsIEZvbzUoKSkKKworICAgICAgICBjbGFzcyBDbGFzc2ljOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgYmFzZSBpbiAob2JqZWN0LCBDbGFzc2ljKToKKyAgICAgICAgICAgIGNsYXNzIExvbmdPdmVycmlkZXNUcnVuYyhiYXNlKToKKyAgICAgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICAgICAgICAgIGRlZiBfX3RydW5jX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhMb25nT3ZlcnJpZGVzVHJ1bmMoKSksIDQyKQorCisgICAgICAgICAgICBjbGFzcyBKdXN0VHJ1bmMoYmFzZSk6CisgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoSnVzdFRydW5jKCkpLCA0MikKKworICAgICAgICAgICAgZm9yIHRydW5jX3Jlc3VsdF9iYXNlIGluIChvYmplY3QsIENsYXNzaWMpOgorICAgICAgICAgICAgICAgIGNsYXNzIEludGVncmFsKHRydW5jX3Jlc3VsdF9iYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDIKKworICAgICAgICAgICAgICAgIGNsYXNzIFRydW5jUmV0dXJuc05vbkxvbmcoYmFzZSk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX3RydW5jX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdyYWwoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhUcnVuY1JldHVybnNOb25Mb25nKCkpLCA0MikKKworICAgICAgICAgICAgICAgIGNsYXNzIE5vbkludGVncmFsKHRydW5jX3Jlc3VsdF9iYXNlKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fdHJ1bmNfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB3ZSBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uSW50ZWdyYWwoKQorCisgICAgICAgICAgICAgICAgY2xhc3MgVHJ1bmNSZXR1cm5zTm9uSW50ZWdyYWwoYmFzZSk6CisgICAgICAgICAgICAgICAgICAgIGRlZiBfX3RydW5jX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uSW50ZWdyYWwoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbG9uZyhUcnVuY1JldHVybnNOb25JbnRlZ3JhbCgpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fdHJ1bmNfXyByZXR1cm5lZCBub24tSW50ZWdyYWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAodHlwZSBOb25JbnRlZ3JhbCkiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRmFpbGVkIHRvIHJhaXNlIFR5cGVFcnJvciB3aXRoICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJhc2UsIHRydW5jX3Jlc3VsdF9iYXNlKSwpKQorCisgICAgZGVmIHRlc3RfbWlzYyhzZWxmKToKKworICAgICAgICAjIGNoZWNrIHRoZSBleHRyZW1lcyBpbiBpbnQ8LT5sb25nIGNvbnZlcnNpb24KKyAgICAgICAgaHVnZXBvcyA9IHN5cy5tYXhpbnQKKyAgICAgICAgaHVnZW5lZyA9IC1odWdlcG9zIC0gMQorICAgICAgICBodWdlcG9zX2FzbG9uZyA9IGxvbmcoaHVnZXBvcykKKyAgICAgICAgaHVnZW5lZ19hc2xvbmcgPSBsb25nKGh1Z2VuZWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHVnZXBvcywgaHVnZXBvc19hc2xvbmcsICJsb25nKHN5cy5tYXhpbnQpICE9IHN5cy5tYXhpbnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh1Z2VuZWcsIGh1Z2VuZWdfYXNsb25nLAorICAgICAgICAgICAgImxvbmcoLXN5cy5tYXhpbnQtMSkgIT0gLXN5cy5tYXhpbnQtMSIpCisKKyAgICAgICAgIyBsb25nIC0+IGludCBzaG91bGQgbm90IGZhaWwgZm9yIGh1Z2Vwb3NfYXNsb25nIG9yIGh1Z2VuZWdfYXNsb25nCisgICAgICAgIHggPSBpbnQoaHVnZXBvc19hc2xvbmcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaHVnZXBvcywKKyAgICAgICAgICAgICAgICAgICJjb252ZXJ0aW5nIHN5cy5tYXhpbnQgdG8gbG9uZyBhbmQgYmFjayB0byBpbnQgZmFpbHMiKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW50KGxvbmcoc3lzLm1heGludCkpIG92ZXJmbG93ZWQhIikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeCwgaW50KToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW50KGxvbmcoc3lzLm1heGludCkpIHNob3VsZCBoYXZlIHJldHVybmVkIGludCIpCisgICAgICAgIHggPSBpbnQoaHVnZW5lZ19hc2xvbmcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgaHVnZW5lZywKKyAgICAgICAgICAgICAgICAgICJjb252ZXJ0aW5nIC1zeXMubWF4aW50LTEgdG8gbG9uZyBhbmQgYmFjayB0byBpbnQgZmFpbHMiKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkpIG92ZXJmbG93ZWQhIikKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeCwgaW50KToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkpIHNob3VsZCBoYXZlIHJldHVybmVkIGludCIpCisgICAgICAgICMgYnV0IGxvbmcgLT4gaW50IHNob3VsZCBvdmVyZmxvdyBmb3IgaHVnZXBvcysxIGFuZCBodWdlbmVnLTEKKyAgICAgICAgeCA9IGh1Z2Vwb3NfYXNsb25nICsgMQorICAgICAgICB0cnk6CisgICAgICAgICAgICB5ID0gaW50KHgpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZyhzeXMubWF4aW50KSArIDEpIG11c3RuJ3Qgb3ZlcmZsb3ciKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoeSwgbG9uZywKKyAgICAgICAgICAgICJpbnQobG9uZyhzeXMubWF4aW50KSArIDEpIHNob3VsZCBoYXZlIHJldHVybmVkIGxvbmciKQorCisgICAgICAgIHggPSBodWdlbmVnX2FzbG9uZyAtIDEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgeSA9IGludCh4KQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkgLSAxKSBtdXN0bid0IG92ZXJmbG93IikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHksIGxvbmcsCisgICAgICAgICAgICAgICAiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkgLSAxKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBsb25nIikKKworICAgICAgICBjbGFzcyBsb25nMihsb25nKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgeCA9IGxvbmcyKDFMPDwxMDApCisgICAgICAgIHkgPSBpbnQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoeSkgaXMgbG9uZywKKyAgICAgICAgICAgICJvdmVyZmxvd2luZyBpbnQgY29udmVyc2lvbiBtdXN0IHJldHVybiBsb25nIG5vdCBsb25nIHN1YnR5cGUiKQorCisgICAgICAgICMgbG9uZyAtPiBQeV9zc2l6ZV90IGNvbnZlcnNpb24KKyAgICAgICAgY2xhc3MgWChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBpLCBqKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaSwgagorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpWy01TDo3TF0sICgtNSwgNykpCisgICAgICAgICAgICAjIHVzZSB0aGUgY2xhbXBpbmcgZWZmZWN0IHRvIHRlc3QgdGhlIHNtYWxsZXN0IGFuZCBsYXJnZXN0IGxvbmdzCisgICAgICAgICAgICAjIHRoYXQgZml0IGEgUHlfc3NpemVfdAorICAgICAgICAgICAgc2xpY2VtaW4sIHNsaWNlbWF4ID0gWCgpWy0yTCoqMTAwOjJMKioxMDBdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgoKVtzbGljZW1pbjpzbGljZW1heF0sIChzbGljZW1pbiwgc2xpY2VtYXgpKQorCisgICAgZGVmIHRlc3RfaXNzdWU5ODY5KHNlbGYpOgorICAgICAgICAjIElzc3VlIDk4Njk6IEludGVycHJldGVyIGNyYXNoIHdoZW4gaW5pdGlhbGl6aW5nIGFuIGluc3RhbmNlCisgICAgICAgICMgb2YgYSBsb25nIHN1YmNsYXNzIGZyb20gYW4gb2JqZWN0IHdob3NlIF9fbG9uZ19fIG1ldGhvZCByZXR1cm5zCisgICAgICAgICMgYSBwbGFpbiBpbnQuCisgICAgICAgIGNsYXNzIEJhZExvbmcob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAwMDAwMAorCisgICAgICAgIGNsYXNzIE15TG9uZyhsb25nKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB4ID0gTXlMb25nKEJhZExvbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHgsIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgMTAwMDAwMCkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRlc3RzIG9mIGF1dG8gaW50LT5sb25nIGNvbnZlcnNpb24KKworICAgIGRlZiB0ZXN0X2F1dG9fb3ZlcmZsb3coc2VsZik6CisgICAgICAgIHNwZWNpYWwgPSBbMCwgMSwgMiwgMywgc3lzLm1heGludC0xLCBzeXMubWF4aW50LCBzeXMubWF4aW50KzFdCisgICAgICAgIHNxcnQgPSBpbnQobWF0aC5zcXJ0KHN5cy5tYXhpbnQpKQorICAgICAgICBzcGVjaWFsLmV4dGVuZChbc3FydC0xLCBzcXJ0LCBzcXJ0KzFdKQorICAgICAgICBzcGVjaWFsLmV4dGVuZChbLWkgZm9yIGkgaW4gc3BlY2lhbF0pCisKKyAgICAgICAgZGVmIGNoZWNraXQoKmFyZ3MpOgorICAgICAgICAgICAgIyBIZWF2eSB1c2Ugb2YgbmVzdGVkIHNjb3BlcyBoZXJlIQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgIEZybSgiZm9yICVyIGV4cGVjdGVkICVyIGdvdCAlciIsIGFyZ3MsIGV4cGVjdGVkLCBnb3QpKQorCisgICAgICAgIGZvciB4IGluIHNwZWNpYWw6CisgICAgICAgICAgICBsb25neCA9IGxvbmcoeCkKKworICAgICAgICAgICAgZXhwZWN0ZWQgPSAtbG9uZ3gKKyAgICAgICAgICAgIGdvdCA9IC14CisgICAgICAgICAgICBjaGVja2l0KCctJywgeCkKKworICAgICAgICAgICAgZm9yIHkgaW4gc3BlY2lhbDoKKyAgICAgICAgICAgICAgICBsb25neSA9IGxvbmcoeSkKKworICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbG9uZ3ggKyBsb25neQorICAgICAgICAgICAgICAgIGdvdCA9IHggKyB5CisgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnKycsIHkpCisKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGxvbmd4IC0gbG9uZ3kKKyAgICAgICAgICAgICAgICBnb3QgPSB4IC0geQorICAgICAgICAgICAgICAgIGNoZWNraXQoeCwgJy0nLCB5KQorCisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAqIGxvbmd5CisgICAgICAgICAgICAgICAgZ290ID0geCAqIHkKKyAgICAgICAgICAgICAgICBjaGVja2l0KHgsICcqJywgeSkKKworICAgICAgICAgICAgICAgIGlmIHk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbG9uZ3ggLyBsb25neQorICAgICAgICAgICAgICAgICAgICAgICAgZ290ID0geCAvIHkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnLycsIHkpCisKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25neCAvLyBsb25neQorICAgICAgICAgICAgICAgICAgICBnb3QgPSB4IC8vIHkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnLy8nLCB5KQorCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZGl2bW9kKGxvbmd4LCBsb25neSkKKyAgICAgICAgICAgICAgICAgICAgZ290ID0gZGl2bW9kKGxvbmd4LCBsb25neSkKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tpdCh4LCAnZGl2bW9kJywgeSkKKworICAgICAgICAgICAgICAgIGlmIGFicyh5KSA8IDUgYW5kIG5vdCAoeCA9PSAwIGFuZCB5IDwgMCk6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbG9uZ3ggKiogbG9uZ3kKKyAgICAgICAgICAgICAgICAgICAgZ290ID0geCAqKiB5CisgICAgICAgICAgICAgICAgICAgIGNoZWNraXQoeCwgJyoqJywgeSkKKworICAgICAgICAgICAgICAgICAgICBmb3IgeiBpbiBzcGVjaWFsOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgeiAhPSAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB5ID49IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gcG93KGxvbmd4LCBsb25neSwgbG9uZyh6KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290ID0gcG93KHgsIHksIHopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNraXQoJ3BvdycsIHgsIHksICclJywgeikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvdyxsb25neCwgbG9uZ3ksIGxvbmcoeikpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgcmVxdWlyZXMgSUVFRSA3NTQgZG91YmxlcyIpCisgICAgZGVmIHRlc3RfZmxvYXRfY29udmVyc2lvbihzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBEQkxfTUFYID0gc3lzLmZsb2F0X2luZm8ubWF4CisgICAgICAgIERCTF9NQVhfRVhQID0gc3lzLmZsb2F0X2luZm8ubWF4X2V4cAorICAgICAgICBEQkxfTUFOVF9ESUcgPSBzeXMuZmxvYXRfaW5mby5tYW50X2RpZworCisgICAgICAgIGV4YWN0X3ZhbHVlcyA9IFswTCwgMUwsIDJMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcoMioqNTMtMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZygyKio1My0yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKDIqKjUzLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcoMioqNTMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcoMioqNTMrMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZygyKio1NC00KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb25nKDIqKjU0LTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcoMioqNTQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcoMioqNTQrNCldCisgICAgICAgIGZvciB4IGluIGV4YWN0X3ZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhmbG9hdCh4KSksIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoZmxvYXQoLXgpKSwgLXgpCisKKyAgICAgICAgIyB0ZXN0IHJvdW5kLWhhbGYtZXZlbgorICAgICAgICBmb3IgeCwgeSBpbiBbKDEsIDApLCAoMiwgMiksICgzLCA0KSwgKDQsIDQpLCAoNSwgNCksICg2LCA2KSwgKDcsIDgpXToKKyAgICAgICAgICAgIGZvciBwIGluIHhyYW5nZSgxNSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGZsb2F0KDJMKipwKigyKio1Myt4KSkpLCAyTCoqcCooMioqNTMreSkpCisKKyAgICAgICAgZm9yIHgsIHkgaW4gWygwLCAwKSwgKDEsIDApLCAoMiwgMCksICgzLCA0KSwgKDQsIDQpLCAoNSwgNCksICg2LCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICg3LCA4KSwgKDgsIDgpLCAoOSwgOCksICgxMCwgOCksICgxMSwgMTIpLCAoMTIsIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICgxMywgMTIpLCAoMTQsIDE2KSwgKDE1LCAxNildOgorICAgICAgICAgICAgZm9yIHAgaW4geHJhbmdlKDE1KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoZmxvYXQoMkwqKnAqKDIqKjU0K3gpKSksIDJMKipwKigyKio1NCt5KSkKKworICAgICAgICAjIGJlaGF2aW91ciBuZWFyIGV4dHJlbWVzIG9mIGZsb2F0aW5nLXBvaW50IHJhbmdlCisgICAgICAgIGxvbmdfZGJsX21heCA9IGxvbmcoREJMX01BWCkKKyAgICAgICAgdG9wX3Bvd2VyID0gMioqREJMX01BWF9FWFAKKyAgICAgICAgaGFsZndheSA9IChsb25nX2RibF9tYXggKyB0b3BfcG93ZXIpLy8yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQobG9uZ19kYmxfbWF4KSwgREJMX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChsb25nX2RibF9tYXgrMSksIERCTF9NQVgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoaGFsZndheS0xKSwgREJMX01BWCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZmxvYXQsIGhhbGZ3YXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoMS1oYWxmd2F5KSwgLURCTF9NQVgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0LCAtaGFsZndheSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZmxvYXQsIHRvcF9wb3dlci0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmbG9hdCwgdG9wX3Bvd2VyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmbG9hdCwgdG9wX3Bvd2VyKzEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0LCAyKnRvcF9wb3dlci0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmbG9hdCwgMip0b3BfcG93ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGZsb2F0LCB0b3BfcG93ZXIqdG9wX3Bvd2VyKQorCisgICAgICAgIGZvciBwIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgeCA9IGxvbmcoMioqcCAqICgyKio1MyArIDEpICsgMSkKKyAgICAgICAgICAgIHkgPSBsb25nKDIqKnAgKiAoMioqNTMrIDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGZsb2F0KHgpKSwgeSkKKworICAgICAgICAgICAgeCA9IGxvbmcoMioqcCAqICgyKio1MyArIDEpKQorICAgICAgICAgICAgeSA9IGxvbmcoMioqcCAqIDIqKjUzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGZsb2F0KHgpKSwgeSkKKworICAgIGRlZiB0ZXN0X2Zsb2F0X292ZXJmbG93KHNlbGYpOgorICAgICAgICBmb3IgeCBpbiAtMi4wLCAtMS4wLCAwLjAsIDEuMCwgMi4wOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChsb25nKHgpKSwgeCkKKworICAgICAgICBzaHVnZSA9ICcxMjM0NScgKiAxMjAKKyAgICAgICAgaHVnZSA9IDFMIDw8IDMwMDAwCisgICAgICAgIG1odWdlID0gLWh1Z2UKKyAgICAgICAgbmFtZXNwYWNlID0geydodWdlJzogaHVnZSwgJ21odWdlJzogbWh1Z2UsICdzaHVnZSc6IHNodWdlLCAnbWF0aCc6IG1hdGh9CisgICAgICAgIGZvciB0ZXN0IGluIFsiZmxvYXQoaHVnZSkiLCAiZmxvYXQobWh1Z2UpIiwKKyAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KGh1Z2UpIiwgImNvbXBsZXgobWh1Z2UpIiwKKyAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KGh1Z2UsIDEpIiwgImNvbXBsZXgobWh1Z2UsIDEpIiwKKyAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4KDEsIGh1Z2UpIiwgImNvbXBsZXgoMSwgbWh1Z2UpIiwKKyAgICAgICAgICAgICAgICAgICAgICIxLiArIGh1Z2UiLCAiaHVnZSArIDEuIiwgIjEuICsgbWh1Z2UiLCAibWh1Z2UgKyAxLiIsCisgICAgICAgICAgICAgICAgICAgICAiMS4gLSBodWdlIiwgImh1Z2UgLSAxLiIsICIxLiAtIG1odWdlIiwgIm1odWdlIC0gMS4iLAorICAgICAgICAgICAgICAgICAgICAgIjEuICogaHVnZSIsICJodWdlICogMS4iLCAiMS4gKiBtaHVnZSIsICJtaHVnZSAqIDEuIiwKKyAgICAgICAgICAgICAgICAgICAgICIxLiAvLyBodWdlIiwgImh1Z2UgLy8gMS4iLCAiMS4gLy8gbWh1Z2UiLCAibWh1Z2UgLy8gMS4iLAorICAgICAgICAgICAgICAgICAgICAgIjEuIC8gaHVnZSIsICJodWdlIC8gMS4iLCAiMS4gLyBtaHVnZSIsICJtaHVnZSAvIDEuIiwKKyAgICAgICAgICAgICAgICAgICAgICIxLiAqKiBodWdlIiwgImh1Z2UgKiogMS4iLCAiMS4gKiogbWh1Z2UiLCAibWh1Z2UgKiogMS4iLAorICAgICAgICAgICAgICAgICAgICAgIm1hdGguc2luKGh1Z2UpIiwgIm1hdGguc2luKG1odWdlKSIsCisgICAgICAgICAgICAgICAgICAgICAibWF0aC5zcXJ0KGh1Z2UpIiwgIm1hdGguc3FydChtaHVnZSkiLCAjIHNob3VsZCBkbyBiZXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgICJtYXRoLmZsb29yKGh1Z2UpIiwgIm1hdGguZmxvb3IobWh1Z2UpIl06CisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGV2YWwsIHRlc3QsIG5hbWVzcGFjZSkKKworICAgICAgICAgICAgIyBYWFggUGVyaGFwcyBmbG9hdChzaHVnZSkgY2FuIHJhaXNlIE92ZXJmbG93RXJyb3Igb24gc29tZSBib3g/CisgICAgICAgICAgICAjIFRoZSBjb21wYXJpc29uIHNob3VsZCBub3QuCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZsb2F0KHNodWdlKSwgaW50KHNodWdlKSwKKyAgICAgICAgICAgICAgICAiZmxvYXQoc2h1Z2UpIHNob3VsZCBub3QgZXF1YWwgaW50KHNodWdlKSIpCisKKyAgICBkZWYgdGVzdF9sb2dzKHNlbGYpOgorICAgICAgICBMT0cxMEUgPSBtYXRoLmxvZzEwKG1hdGguZSkKKworICAgICAgICBmb3IgZXhwIGluIHJhbmdlKDEwKSArIFsxMDAsIDEwMDAsIDEwMDAwXToKKyAgICAgICAgICAgIHZhbHVlID0gMTAgKiogZXhwCisgICAgICAgICAgICBsb2cxMCA9IG1hdGgubG9nMTAodmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGxvZzEwLCBleHApCisKKyAgICAgICAgICAgICMgbG9nMTAodmFsdWUpID09IGV4cCwgc28gbG9nKHZhbHVlKSA9PSBsb2cxMCh2YWx1ZSkvbG9nMTAoZSkgPT0KKyAgICAgICAgICAgICMgZXhwL0xPRzEwRQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHAgLyBMT0cxMEUKKyAgICAgICAgICAgIGxvZyA9IG1hdGgubG9nKHZhbHVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChsb2csIGV4cGVjdGVkKQorCisgICAgICAgIGZvciBiYWQgaW4gLSgxTCA8PCAxMDAwMCksIC0yTCwgMEw6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmxvZywgYmFkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2cxMCwgYmFkKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfY29tcGFyZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgV2UncmUgbW9zdGx5IGNvbmNlcm5lZCB3aXRoIHRoYXQgbWl4aW5nIGZsb2F0cyBhbmQgbG9uZ3MgZG9lcyB0aGUKKyAgICAgICAgIyByaWdodCBzdHVmZiwgZXZlbiB3aGVuIGxvbmdzIGFyZSB0b28gbGFyZ2UgdG8gZml0IGluIGEgZmxvYXQuCisgICAgICAgICMgVGhlIHNhZmVzdCB3YXkgdG8gY2hlY2sgdGhlIHJlc3VsdHMgaXMgdG8gdXNlIGFuIGVudGlyZWx5IGRpZmZlcmVudAorICAgICAgICAjIG1ldGhvZCwgd2hpY2ggd2UgZG8gaGVyZSB2aWEgYSBza2VsZXRhbCByYXRpb25hbCBjbGFzcyAod2hpY2gKKyAgICAgICAgIyByZXByZXNlbnRzIGFsbCBQeXRob24gaW50cywgbG9uZ3MgYW5kIGZsb2F0cyBleGFjdGx5KS4KKyAgICAgICAgY2xhc3MgUmF0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubiA9IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZCA9IDEKKyAgICAgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKKyAgICAgICAgICAgICAgICAgICAgIyBDb252ZXJ0IHRvIGV4YWN0IHJhdGlvbmFsIGVxdWl2YWxlbnQuCisgICAgICAgICAgICAgICAgICAgIGYsIGUgPSBtYXRoLmZyZXhwKGFicyh2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCBmID09IDAgb3IgMC41IDw9IGYgPCAxLjAKKyAgICAgICAgICAgICAgICAgICAgIyB8dmFsdWV8ID0gZiAqIDIqKmUgZXhhY3RseQorCisgICAgICAgICAgICAgICAgICAgICMgU3VjayB1cCBDSFVOSyBiaXRzIGF0IGEgdGltZTsgMjggaXMgZW5vdWdoIHNvIHRoYXQgd2Ugc3VjaworICAgICAgICAgICAgICAgICAgICAjIHVwIGFsbCBiaXRzIGluIDIgaXRlcmF0aW9ucyBmb3IgYWxsIGtub3duIGJpbmFyeSBkb3VibGUtCisgICAgICAgICAgICAgICAgICAgICMgcHJlY2lzaW9uIGZvcm1hdHMsIGFuZCBzbWFsbCBlbm91Z2ggdG8gZml0IGluIGFuIGludC4KKyAgICAgICAgICAgICAgICAgICAgQ0hVTksgPSAyOAorICAgICAgICAgICAgICAgICAgICB0b3AgPSAwCisgICAgICAgICAgICAgICAgICAgICMgaW52YXJpYW50OiB8dmFsdWV8ID0gKHRvcCArIGYpICogMioqZSBleGFjdGx5CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGY6CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gbWF0aC5sZGV4cChmLCBDSFVOSykKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0ID0gaW50KGYpCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZGlnaXQgPj4gQ0hVTksgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgdG9wID0gKHRvcCA8PCBDSFVOSykgfCBkaWdpdAorICAgICAgICAgICAgICAgICAgICAgICAgZiAtPSBkaWdpdAorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IDAuMCA8PSBmIDwgMS4wCisgICAgICAgICAgICAgICAgICAgICAgICBlIC09IENIVU5LCisKKyAgICAgICAgICAgICAgICAgICAgIyBOb3cgfHZhbHVlfCA9IHRvcCAqIDIqKmUgZXhhY3RseS4KKyAgICAgICAgICAgICAgICAgICAgaWYgZSA+PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHRvcCA8PCBlCisgICAgICAgICAgICAgICAgICAgICAgICBkID0gMQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbiA9IHRvcAorICAgICAgICAgICAgICAgICAgICAgICAgZCA9IDEgPDwgLWUKKyAgICAgICAgICAgICAgICAgICAgaWYgdmFsdWUgPCAwOgorICAgICAgICAgICAgICAgICAgICAgICAgbiA9IC1uCisgICAgICAgICAgICAgICAgICAgIHNlbGYubiA9IG4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kID0gZAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgZmxvYXQobikgLyBmbG9hdChkKSA9PSB2YWx1ZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiY2FuJ3QgZGVhbCB3aXRoICVyIiAlIHZhbHVlKQorCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIFJhdCk6CisgICAgICAgICAgICAgICAgICAgIG90aGVyID0gUmF0KG90aGVyKQorICAgICAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5uICogb3RoZXIuZCwgc2VsZi5kICogb3RoZXIubikKKworICAgICAgICBjYXNlcyA9IFswLCAwLjAwMSwgMC45OSwgMS4wLCAxLjUsIDFlMjAsIDFlMjAwXQorICAgICAgICAjIDIqKjQ4IGlzIGFuIGltcG9ydGFudCBib3VuZGFyeSBpbiB0aGUgaW50ZXJuYWxzLiAgMioqNTMgaXMgYW4KKyAgICAgICAgIyBpbXBvcnRhbnQgYm91bmRhcnkgZm9yIElFRUUgZG91YmxlIHByZWNpc2lvbi4KKyAgICAgICAgZm9yIHQgaW4gMi4wKio0OCwgMi4wKio1MCwgMi4wKio1MzoKKyAgICAgICAgICAgIGNhc2VzLmV4dGVuZChbdCAtIDEuMCwgdCAtIDAuMywgdCwgdCArIDAuMywgdCArIDEuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyh0LTEpLCBsb25nKHQpLCBsb25nKHQrMSldKQorICAgICAgICBjYXNlcy5leHRlbmQoWzAsIDEsIDIsIHN5cy5tYXhpbnQsIGZsb2F0KHN5cy5tYXhpbnQpXSkKKyAgICAgICAgIyAxTDw8MjAwMDAgc2hvdWxkIGV4Y2VlZCBhbGwgZG91YmxlIGZvcm1hdHMuICBsb25nKDFlMjAwKSBpcyB0bworICAgICAgICAjIGNoZWNrIHRoYXQgd2UgZ2V0IGVxdWFsaXR5IHdpdGggMWUyMDAgYWJvdmUuCisgICAgICAgIHQgPSBsb25nKDFlMjAwKQorICAgICAgICBjYXNlcy5leHRlbmQoWzBMLCAxTCwgMkwsIDFMIDw8IDIwMDAwLCB0LTEsIHQsIHQrMV0pCisgICAgICAgIGNhc2VzLmV4dGVuZChbLXggZm9yIHggaW4gY2FzZXNdKQorICAgICAgICBmb3IgeCBpbiBjYXNlczoKKyAgICAgICAgICAgIFJ4ID0gUmF0KHgpCisgICAgICAgICAgICBmb3IgeSBpbiBjYXNlczoKKyAgICAgICAgICAgICAgICBSeSA9IFJhdCh5KQorICAgICAgICAgICAgICAgIFJjbXAgPSBjbXAoUngsIFJ5KQorICAgICAgICAgICAgICAgIHh5Y21wID0gY21wKHgsIHkpCisgICAgICAgICAgICAgICAgZXEoUmNtcCwgeHljbXAsIEZybSgiJXIgJXIgJWQgJWQiLCB4LCB5LCBSY21wLCB4eWNtcCkpCisgICAgICAgICAgICAgICAgZXEoeCA9PSB5LCBSY21wID09IDAsIEZybSgiJXIgPT0gJXIgJWQiLCB4LCB5LCBSY21wKSkKKyAgICAgICAgICAgICAgICBlcSh4ICE9IHksIFJjbXAgIT0gMCwgRnJtKCIlciAhPSAlciAlZCIsIHgsIHksIFJjbXApKQorICAgICAgICAgICAgICAgIGVxKHggPCB5LCBSY21wIDwgMCwgRnJtKCIlciA8ICVyICVkIiwgeCwgeSwgUmNtcCkpCisgICAgICAgICAgICAgICAgZXEoeCA8PSB5LCBSY21wIDw9IDAsIEZybSgiJXIgPD0gJXIgJWQiLCB4LCB5LCBSY21wKSkKKyAgICAgICAgICAgICAgICBlcSh4ID4geSwgUmNtcCA+IDAsIEZybSgiJXIgPiAlciAlZCIsIHgsIHksIFJjbXApKQorICAgICAgICAgICAgICAgIGVxKHggPj0geSwgUmNtcCA+PSAwLCBGcm0oIiVyID49ICVyICVkIiwgeCwgeSwgUmNtcCkpCisKKyAgICBkZWYgdGVzdF9uYW5faW5mKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsb25nLCBmbG9hdCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGxvbmcsIGZsb2F0KCctaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxvbmcsIGZsb2F0KCduYW4nKSkKKworICAgIGRlZiB0ZXN0X2JpdF9sZW5ndGgoc2VsZik6CisgICAgICAgIHRpbnkgPSAxZS0xMAorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoLTY1MDAwLCA2NTAwMCk6CisgICAgICAgICAgICB4ID0gbG9uZyh4KQorICAgICAgICAgICAgayA9IHguYml0X2xlbmd0aCgpCisgICAgICAgICAgICAjIENoZWNrIGVxdWl2YWxlbmNlIHdpdGggUHl0aG9uIHZlcnNpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbGVuKGJpbih4KS5sc3RyaXAoJy0wYicpKSkKKyAgICAgICAgICAgICMgQmVoYXZpb3VyIGFzIHNwZWNpZmllZCBpbiB0aGUgZG9jcworICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyKiooay0xKSA8PSBhYnMoeCkgPCAyKiprKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIDApCisgICAgICAgICAgICAjIEFsdGVybmF0aXZlIGRlZmluaXRpb246IHguYml0X2xlbmd0aCgpID09IDEgKyBmbG9vcihsb2dfMih4KSkKKyAgICAgICAgICAgIGlmIHggIT0gMDoKKyAgICAgICAgICAgICAgICAjIFdoZW4geCBpcyBhbiBleGFjdCBwb3dlciBvZiAyLCBudW1lcmljIGVycm9ycyBjYW4KKyAgICAgICAgICAgICAgICAjIGNhdXNlIGZsb29yKGxvZyh4KS9sb2coMikpIHRvIGJlIG9uZSB0b28gc21hbGw7IGZvcgorICAgICAgICAgICAgICAgICMgc21hbGwgeCB0aGlzIGNhbiBiZSBmaXhlZCBieSBhZGRpbmcgYSBzbWFsbCBxdWFudGl0eQorICAgICAgICAgICAgICAgICMgdG8gdGhlIHF1b3RpZW50IGJlZm9yZSB0YWtpbmcgdGhlIGZsb29yLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMSArIG1hdGguZmxvb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBtYXRoLmxvZyhhYnMoeCkpL21hdGgubG9nKDIpICsgdGlueSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMEwpLmJpdF9sZW5ndGgoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoMUwpLmJpdF9sZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLTFMKS5iaXRfbGVuZ3RoKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDJMKS5iaXRfbGVuZ3RoKCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKC0yTCkuYml0X2xlbmd0aCgpLCAyKQorICAgICAgICBmb3IgaSBpbiBbMiwgMywgMTUsIDE2LCAxNywgMzEsIDMyLCAzMywgNjMsIDY0LCAyMzRdOgorICAgICAgICAgICAgYSA9IDJMKippCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLTEpLmJpdF9sZW5ndGgoKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEtYSkuYml0X2xlbmd0aCgpLCBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtYSkuYml0X2xlbmd0aCgpLCBpKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhKzEpLmJpdF9sZW5ndGgoKSwgaSsxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoLWEtMSkuYml0X2xlbmd0aCgpLCBpKzEpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTG9uZ1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0MzQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQwNWQzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdfZnV0dXJlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjM2JmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdfZnV0dXJlLnB5CkBAIC0wLDAgKzEsMjIxIEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCisjIFdoZW4gdHJ1ZSBkaXZpc2lvbiBpcyB0aGUgZGVmYXVsdCwgZ2V0IHJpZCBvZiB0aGlzIGFuZCBhZGQgaXQgdG8KKyMgdGVzdF9sb25nLnB5IGluc3RlYWQuICBJbiB0aGUgbWVhbnRpbWUsIGl0J3MgdG9vIG9ic2N1cmUgdG8gdHJ5IHRvCisjIHRyaWNrIGp1c3QgcGFydCBvZiB0ZXN0X2xvbmcgaW50byB1c2luZyBmdXR1cmUgZGl2aXNpb24uCisKK2ltcG9ydCBzeXMKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBtYXRoCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisjIGRlY29yYXRvciBmb3Igc2tpcHBpbmcgdGVzdHMgb24gbm9uLUlFRUUgNzU0IHBsYXRmb3JtcworcmVxdWlyZXNfSUVFRV83NTQgPSB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgIGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKworREJMX01BWCA9IHN5cy5mbG9hdF9pbmZvLm1heAorREJMX01BWF9FWFAgPSBzeXMuZmxvYXRfaW5mby5tYXhfZXhwCitEQkxfTUlOX0VYUCA9IHN5cy5mbG9hdF9pbmZvLm1pbl9leHAKK0RCTF9NQU5UX0RJRyA9IHN5cy5mbG9hdF9pbmZvLm1hbnRfZGlnCitEQkxfTUlOX09WRVJGTE9XID0gMioqREJMX01BWF9FWFAgLSAyKiooREJMX01BWF9FWFAgLSBEQkxfTUFOVF9ESUcgLSAxKQorCisjIHB1cmUgUHl0aG9uIHZlcnNpb24gb2YgY29ycmVjdGx5LXJvdW5kZWQgdHJ1ZSBkaXZpc2lvbgorZGVmIHRydWVkaXYoYSwgYik6CisgICAgIiIiQ29ycmVjdGx5LXJvdW5kZWQgdHJ1ZSBkaXZpc2lvbiBmb3IgaW50ZWdlcnMuIiIiCisgICAgbmVnYXRpdmUgPSBhXmIgPCAwCisgICAgYSwgYiA9IGFicyhhKSwgYWJzKGIpCisKKyAgICAjIGV4Y2VwdGlvbnM6ICBkaXZpc2lvbiBieSB6ZXJvLCBvdmVyZmxvdworICAgIGlmIG5vdCBiOgorICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcigiZGl2aXNpb24gYnkgemVybyIpCisgICAgaWYgYSA+PSBEQkxfTUlOX09WRVJGTE9XICogYjoKKyAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvcigiaW50L2ludCB0b28gbGFyZ2UgdG8gcmVwcmVzZW50IGFzIGEgZmxvYXQiKQorCisgICAjIGZpbmQgaW50ZWdlciBkIHNhdGlzZnlpbmcgMioqKGQgLSAxKSA8PSBhL2IgPCAyKipkCisgICAgZCA9IGEuYml0X2xlbmd0aCgpIC0gYi5iaXRfbGVuZ3RoKCkKKyAgICBpZiBkID49IDAgYW5kIGEgPj0gMioqZCAqIGIgb3IgZCA8IDAgYW5kIGEgKiAyKiotZCA+PSBiOgorICAgICAgICBkICs9IDEKKworICAgICMgY29tcHV0ZSAyKiotZXhwICogYSAvIGIgZm9yIHN1aXRhYmxlIGV4cAorICAgIGV4cCA9IG1heChkLCBEQkxfTUlOX0VYUCkgLSBEQkxfTUFOVF9ESUcKKyAgICBhLCBiID0gYSA8PCBtYXgoLWV4cCwgMCksIGIgPDwgbWF4KGV4cCwgMCkKKyAgICBxLCByID0gZGl2bW9kKGEsIGIpCisKKyAgICAjIHJvdW5kLWhhbGYtdG8tZXZlbjogZnJhY3Rpb25hbCBwYXJ0IGlzIHIvYiwgd2hpY2ggaXMgPiAwLjUgaWZmCisgICAgIyAyKnIgPiBiLCBhbmQgPT0gMC41IGlmZiAyKnIgPT0gYi4KKyAgICBpZiAyKnIgPiBiIG9yIDIqciA9PSBiIGFuZCBxICUgMiA9PSAxOgorICAgICAgICBxICs9IDEKKworICAgIHJlc3VsdCA9IG1hdGgubGRleHAoZmxvYXQocSksIGV4cCkKKyAgICByZXR1cm4gLXJlc3VsdCBpZiBuZWdhdGl2ZSBlbHNlIHJlc3VsdAorCitjbGFzcyBUcnVlRGl2aXNpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIGh1Z2UgPSAxTCA8PCA0MDAwMAorICAgICAgICBtaHVnZSA9IC1odWdlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHVnZSAvIGh1Z2UsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtaHVnZSAvIG1odWdlLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHVnZSAvIG1odWdlLCAtMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1odWdlIC8gaHVnZSwgLTEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxIC8gaHVnZSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDFMIC8gaHVnZSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEgLyBtaHVnZSwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDFMIC8gbWh1Z2UsIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNjY2ICogaHVnZSArIChodWdlID4+IDEpKSAvIGh1Z2UsIDY2Ni41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2NjYgKiBtaHVnZSArIChtaHVnZSA+PiAxKSkgLyBtaHVnZSwgNjY2LjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDY2NiAqIGh1Z2UgKyAoaHVnZSA+PiAxKSkgLyBtaHVnZSwgLTY2Ni41KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg2NjYgKiBtaHVnZSArIChtaHVnZSA+PiAxKSkgLyBodWdlLCAtNjY2LjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHVnZSAvIChodWdlIDw8IDEpLCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEwMDAwMDAgKiBodWdlKSAvIGh1Z2UsIDEwMDAwMDApCisKKyAgICAgICAgbmFtZXNwYWNlID0geydodWdlJzogaHVnZSwgJ21odWdlJzogbWh1Z2V9CisKKyAgICAgICAgZm9yIG92ZXJmbG93IGluIFsiZmxvYXQoaHVnZSkiLCAiZmxvYXQobWh1Z2UpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaHVnZSAvIDEiLCAiaHVnZSAvIDJMIiwgImh1Z2UgLyAtMSIsICJodWdlIC8gLTJMIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAibWh1Z2UgLyAxMDAiLCAibWh1Z2UgLyAxMDBMIl06CisgICAgICAgICAgICAjIElmIHRoZSAiZXZhbCIgZG9lcyBub3QgaGFwcGVuIGluIHRoaXMgbW9kdWxlLAorICAgICAgICAgICAgIyB0cnVlIGRpdmlzaW9uIGlzIG5vdCBlbmFibGVkCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgICAgIGV2YWwob3ZlcmZsb3csIG5hbWVzcGFjZSkKKworICAgICAgICBmb3IgdW5kZXJmbG93IGluIFsiMSAvIGh1Z2UiLCAiMkwgLyBodWdlIiwgIi0xIC8gaHVnZSIsICItMkwgLyBodWdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwIC8gbWh1Z2UiLCAiMTAwTCAvIG1odWdlIl06CisgICAgICAgICAgICByZXN1bHQgPSBldmFsKHVuZGVyZmxvdywgbmFtZXNwYWNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDAuMCwgJ2V4cGVjdGVkIHVuZGVyZmxvdyB0byAwICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20geyFyfScuZm9ybWF0KHVuZGVyZmxvdykpCisKKyAgICAgICAgZm9yIHplcm8gaW4gWyJodWdlIC8gMCIsICJodWdlIC8gMEwiLCAibWh1Z2UgLyAwIiwgIm1odWdlIC8gMEwiXToKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgICAgIGV2YWwoemVybywgbmFtZXNwYWNlKQorCisgICAgZGVmIGNoZWNrX3RydWVkaXYoc2VsZiwgYSwgYiwgc2tpcF9zbWFsbD1UcnVlKToKKyAgICAgICAgIiIiVmVyaWZ5IHRoYXQgdGhlIHJlc3VsdCBvZiBhL2IgaXMgY29ycmVjdGx5IHJvdW5kZWQsIGJ5CisgICAgICAgIGNvbXBhcmluZyBpdCB3aXRoIGEgcHVyZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgY29ycmVjdGx5CisgICAgICAgIHJvdW5kZWQgZGl2aXNpb24uICBiIHNob3VsZCBiZSBub256ZXJvLiIiIgorCisgICAgICAgIGEsIGIgPSBsb25nKGEpLCBsb25nKGIpCisKKyAgICAgICAgIyBza2lwIGNoZWNrIGZvciBzbWFsbCBhIGFuZCBiOiBpbiB0aGlzIGNhc2UsIHRoZSBjdXJyZW50CisgICAgICAgICMgaW1wbGVtZW50YXRpb24gY29udmVydHMgdGhlIGFyZ3VtZW50cyB0byBmbG9hdCBkaXJlY3RseSBhbmQKKyAgICAgICAgIyB0aGVuIGFwcGxpZXMgYSBmbG9hdCBkaXZpc2lvbi4gIFRoaXMgY2FuIGdpdmUgZG91Ymx5LXJvdW5kZWQKKyAgICAgICAgIyByZXN1bHRzIG9uIHg4Ny11c2luZyBtYWNoaW5lcyAocGFydGljdWxhcmx5IDMyLWJpdCBMaW51eCkuCisgICAgICAgIGlmIHNraXBfc21hbGwgYW5kIG1heChhYnMoYSksIGFicyhiKSkgPCAyKipEQkxfTUFOVF9ESUc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHVzZSByZXByIHNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4gLTAuMCBhbmQgMC4wCisgICAgICAgICAgICBleHBlY3RlZCA9IHJlcHIodHJ1ZWRpdihhLCBiKSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBleHBlY3RlZCA9ICdvdmVyZmxvdycKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSAnemVyb2RpdmlzaW9uJworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGdvdCA9IHJlcHIoYSAvIGIpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgZ290ID0gJ292ZXJmbG93JworICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6CisgICAgICAgICAgICBnb3QgPSAnemVyb2RpdmlzaW9uJworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCwgIkluY29ycmVjdGx5IHJvdW5kZWQgZGl2aXNpb24ge30ve306ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQge30sIGdvdCB7fSIuZm9ybWF0KGEsIGIsIGV4cGVjdGVkLCBnb3QpKQorCisgICAgQHJlcXVpcmVzX0lFRUVfNzU0CisgICAgZGVmIHRlc3RfY29ycmVjdGx5X3JvdW5kZWRfdHJ1ZV9kaXZpc2lvbihzZWxmKToKKyAgICAgICAgIyBtb3JlIHN0cmluZ2VudCB0ZXN0cyB0aGFuIHRob3NlIGFib3ZlLCBjaGVja2luZyB0aGF0IHRoZQorICAgICAgICAjIHJlc3VsdCBvZiB0cnVlIGRpdmlzaW9uIG9mIGludHMgaXMgYWx3YXlzIGNvcnJlY3RseSByb3VuZGVkLgorICAgICAgICAjIFRoaXMgdGVzdCBzaG91bGQgcHJvYmFibHkgYmUgY29uc2lkZXJlZCBDUHl0aG9uLXNwZWNpZmljLgorCisgICAgICAgICMgRXhlcmNpc2UgYWxsIHRoZSBjb2RlIHBhdGhzIG5vdCBpbnZvbHZpbmcgR2Itc2l6ZWQgaW50cy4KKyAgICAgICAgIyAuLi4gZGl2aXNpb25zIGludm9sdmluZyB6ZXJvCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigxMjMsIDApCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigtNDU2LCAwKQorICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMCwgMykKKyAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KDAsIC0zKQorICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMCwgMCkKKyAgICAgICAgIyAuLi4gb3ZlcmZsb3cgb3IgdW5kZXJmbG93IGJ5IGxhcmdlIG1hcmdpbgorICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoNjcxICogMTIzNDUgKiAyKipEQkxfTUFYX0VYUCwgMTIzNDUpCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigxMjM0NSwgMzQ1Njc4ICogMioqKERCTF9NQU5UX0RJRyAtIERCTF9NSU5fRVhQKSkKKyAgICAgICAgIyAuLi4gYSBtdWNoIGxhcmdlciBvciBzbWFsbGVyIHRoYW4gYgorICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMTIzNDUqMioqMTAwLCA5ODc2NSkKKyAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KDEyMzQ1KjIqKjMwLCA5ODc2NSo3Kio4MSkKKyAgICAgICAgIyAuLi4gYSAvIGIgbmVhciBhIGJvdW5kYXJ5OiBvbmUgb2YgMSwgMioqREJMX01BTlRfRElHLCAyKipEQkxfTUlOX0VYUCwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgMioqREJMX01BWF9FWFAsIDIqKihEQkxfTUlOX0VYUC1EQkxfTUFOVF9ESUcpCisgICAgICAgIGJhc2VzID0gKDAsIERCTF9NQU5UX0RJRywgREJMX01JTl9FWFAsCisgICAgICAgICAgICAgICAgIERCTF9NQVhfRVhQLCBEQkxfTUlOX0VYUCAtIERCTF9NQU5UX0RJRykKKyAgICAgICAgZm9yIGJhc2UgaW4gYmFzZXM6CisgICAgICAgICAgICBmb3IgZXhwIGluIHJhbmdlKGJhc2UgLSAxNSwgYmFzZSArIDE1KToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoNzUzMTIqMioqbWF4KGV4cCwgMCksIDY5MTg3KjIqKm1heCgtZXhwLCAwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoNjkxODcqMioqbWF4KGV4cCwgMCksIDc1MzEyKjIqKm1heCgtZXhwLCAwKSkKKworICAgICAgICAjIG92ZXJmbG93IGNvcm5lciBjYXNlCisgICAgICAgIGZvciBtIGluIFsxLCAyLCA3LCAxNywgMTIzNDUsIDcqKjEwMCwKKyAgICAgICAgICAgICAgICAgIC0xLCAtMiwgLTUsIC0yMywgLTY3ODkxLCAtNDEqKjUwXToKKyAgICAgICAgICAgIGZvciBuIGluIHJhbmdlKC0xMCwgMTApOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdihtKkRCTF9NSU5fT1ZFUkZMT1cgKyBuLCBtKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdihtKkRCTF9NSU5fT1ZFUkZMT1cgKyBuLCAtbSkKKworICAgICAgICAjIGNoZWNrIGRldGVjdGlvbiBvZiBpbmV4YWN0bmVzcyBpbiBzaGlmdGluZyBzdGFnZQorICAgICAgICBmb3IgbiBpbiByYW5nZSgyNTApOgorICAgICAgICAgICAgIyAoMioqREJMX01BTlRfRElHKzEpLygyKipEQkxfTUFOVF9ESUcpIGxpZXMgaGFsZndheQorICAgICAgICAgICAgIyBiZXR3ZWVuIHR3byByZXByZXNlbnRhYmxlIGZsb2F0cywgYW5kIHdvdWxkIHVzdWFsbHkgYmUKKyAgICAgICAgICAgICMgcm91bmRlZCBkb3duIHVuZGVyIHJvdW5kLWhhbGYtdG8tZXZlbi4gIFRoZSB0aW5pZXN0IG9mCisgICAgICAgICAgICAjIGFkZGl0aW9ucyB0byB0aGUgbnVtZXJhdG9yIHNob3VsZCBjYXVzZSBpdCB0byBiZSByb3VuZGVkCisgICAgICAgICAgICAjIHVwIGluc3RlYWQuCisgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoKDIqKkRCTF9NQU5UX0RJRyArIDEpKjEyMzQ1KjIqKjIwMCArIDIqKm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAyKipEQkxfTUFOVF9ESUcqMTIzNDUpCisKKyAgICAgICAgIyAxLzI3MzEgaXMgb25lIG9mIHRoZSBzbWFsbGVzdCBkaXZpc2lvbiBjYXNlcyB0aGF0J3Mgc3ViamVjdAorICAgICAgICAjIHRvIGRvdWJsZSByb3VuZGluZyBvbiBJRUVFIDc1NCBtYWNoaW5lcyB3b3JraW5nIGludGVybmFsbHkgd2l0aAorICAgICAgICAjIDY0LWJpdCBwcmVjaXNpb24uICBPbiBzdWNoIG1hY2hpbmVzLCB0aGUgbmV4dCBjaGVjayB3b3VsZCBmYWlsLAorICAgICAgICAjIHdlcmUgaXQgbm90IGV4cGxpY2l0bHkgc2tpcHBlZCBpbiBjaGVja190cnVlZGl2LgorICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMSwgMjczMSkKKworICAgICAgICAjIGEgcGFydGljdWxhcmx5IGJhZCBjYXNlIGZvciB0aGUgb2xkIGFsZ29yaXRobTogIGdpdmVzIGFuCisgICAgICAgICMgZXJyb3Igb2YgY2xvc2UgdG8gMy41IHVscHMuCisgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigyOTUxNDc5MzEzNzI1ODIyNzMwMjMsIDI5NTE0NzkzMjI2NTExNjMwMzM2MCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoMTAqKihpKzEpLCAxMCoqaSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigxMCoqaSwgMTAqKihpKzEpKQorCisgICAgICAgICMgdGVzdCByb3VuZC1oYWxmLXRvLWV2ZW4gYmVoYXZpb3VyLCBub3JtYWwgcmVzdWx0CisgICAgICAgIGZvciBtIGluIFsxLCAyLCA0LCA3LCA4LCAxNiwgMTcsIDMyLCAxMjM0NSwgNyoqMTAwLAorICAgICAgICAgICAgICAgICAgLTEsIC0yLCAtNSwgLTIzLCAtNjc4OTEsIC00MSoqNTBdOgorICAgICAgICAgICAgZm9yIG4gaW4gcmFuZ2UoLTEwLCAxMCk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KDIqKkRCTF9NQU5UX0RJRyptICsgbiwgbSkKKworICAgICAgICAjIHRlc3Qgcm91bmQtaGFsZi10by1ldmVuLCBzdWJub3JtYWwgcmVzdWx0CisgICAgICAgIGZvciBuIGluIHJhbmdlKC0yMCwgMjApOgorICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KG4sIDIqKjEwNzYpCisKKyAgICAgICAgIyBsYXJnZWlzaCByYW5kb20gZGl2aXNpb25zOiBhL2Igd2hlcmUgfGF8IDw9IHxifCA8PQorICAgICAgICAjIDIqfGF8OyB8YW5zfCBpcyBiZXR3ZWVuIDAuNSBhbmQgMS4wLCBzbyBlcnJvciBzaG91bGQKKyAgICAgICAgIyBhbHdheXMgYmUgYm91bmRlZCBieSAyKiotNTQgd2l0aCBlcXVhbGl0eSBwb3NzaWJsZSBvbmx5CisgICAgICAgICMgaWYgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCBvZiBxPWFucyoyKio1MyBpcyB6ZXJvLgorICAgICAgICBmb3IgTSBpbiBbMTAqKjEwLCAxMCoqMTAwLCAxMCoqMTAwMF06CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgICAgICBhID0gcmFuZG9tLnJhbmRyYW5nZSgxLCBNKQorICAgICAgICAgICAgICAgIGIgPSByYW5kb20ucmFuZHJhbmdlKGEsIDIqYSsxKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdihhLCBiKQorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigtYSwgYikKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoYSwgLWIpCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja190cnVlZGl2KC1hLCAtYikKKworICAgICAgICAjIGFuZCBzb21lIChnZW51aW5lbHkpIHJhbmRvbSB0ZXN0cworICAgICAgICBmb3IgXyBpbiByYW5nZSgxMDAwMCk6CisgICAgICAgICAgICBhX2JpdHMgPSByYW5kb20ucmFuZHJhbmdlKDEwMDApCisgICAgICAgICAgICBiX2JpdHMgPSByYW5kb20ucmFuZHJhbmdlKDEsIDEwMDApCisgICAgICAgICAgICB4ID0gcmFuZG9tLnJhbmRyYW5nZSgyKiphX2JpdHMpCisgICAgICAgICAgICB5ID0gcmFuZG9tLnJhbmRyYW5nZSgxLCAyKipiX2JpdHMpCisgICAgICAgICAgICBzZWxmLmNoZWNrX3RydWVkaXYoeCwgeSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdih4LCAteSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigteCwgeSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdHJ1ZWRpdigteCwgLXkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUcnVlRGl2aXNpb25UZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWEwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ19mdXR1cmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OWEwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nX2Z1dHVyZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbG9uZ2V4cC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQyMjJhMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHkKQEAgLTAsMCArMSwxNCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBMb25nRXhwVGV4dCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbG9uZ2V4cChzZWxmKToKKyAgICAgICAgUkVQUyA9IDY1NTgwCisgICAgICAgIGwgPSBldmFsKCJbIiArICIyLCIgKiBSRVBTICsgIl0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsKSwgUkVQUykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTG9uZ0V4cFRleHQpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nZXhwLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDQ5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nZXhwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nZXhwLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X2xvbmdleHAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDQ5YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9sb25nZXhwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZjUxMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvcy5weQpAQCAtMCwwICsxLDk4IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKK01hY09TID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ01hY09TJykKKworVEVTVEZOMiA9IHRlc3Rfc3VwcG9ydC5URVNURk4gKyAnMicKKworY2xhc3MgVGVzdE1hY09TKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0R2V0Q3JlYXRvckFuZFR5cGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cygnL0RldmVsb3Blci9Ub29scy9TZXRGaWxlJyk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKQorICAgICAgICAgICAgZnAud3JpdGUoJ1xuJykKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICAgICAgc3VicHJvY2Vzcy5jYWxsKAorICAgICAgICAgICAgICAgICAgICBbJy9EZXZlbG9wZXIvVG9vbHMvU2V0RmlsZScsICctdCcsICdBQkNEJywgJy1jJywgJ0VGR0gnLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTl0pCisKKyAgICAgICAgICAgIGNyLCB0cCA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRwLCAnQUJDRCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNyLCAnRUZHSCcpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RTZXRDcmVhdG9yQW5kVHlwZShzZWxmKToKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKCcvRGV2ZWxvcGVyL1Rvb2xzL0dldEZpbGVJbmZvJyk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKQorICAgICAgICAgICAgZnAud3JpdGUoJ1xuJykKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICAgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUodGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgJ0FCQ0QnLCAnRUZHSCcpCisKKyAgICAgICAgICAgIGNyLCB0cCA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNyLCAnQUJDRCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRwLCAnRUZHSCcpCisKKyAgICAgICAgICAgIGRhdGEgPSBzdWJwcm9jZXNzLlBvcGVuKFsiL0RldmVsb3Blci9Ub29scy9HZXRGaWxlSW5mbyIsIHRlc3Rfc3VwcG9ydC5URVNURk5dLAorICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKS5jb21tdW5pY2F0ZSgpWzBdCisKKyAgICAgICAgICAgIHRwID0gTm9uZQorICAgICAgICAgICAgY3IgPSBOb25lCisgICAgICAgICAgICBmb3IgIGxuIGluIGRhdGEuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgICAgIGlmIGxuLnN0YXJ0c3dpdGgoJ3R5cGU6Jyk6CisgICAgICAgICAgICAgICAgICAgIHRwID0gbG4uc3BsaXQoKVstMV1bMTotMV0KKyAgICAgICAgICAgICAgICBpZiBsbi5zdGFydHN3aXRoKCdjcmVhdG9yOicpOgorICAgICAgICAgICAgICAgICAgICBjciA9IGxuLnNwbGl0KClbLTFdWzE6LTFdCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3IsICdBQkNEJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHAsICdFRkdIJykKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKworICAgIGRlZiB0ZXN0T3BlblJGKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3cnKQorICAgICAgICAgICAgZnAud3JpdGUoJ2hlbGxvIHdvcmxkXG4nKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICAgICByZnAgPSBNYWNPUy5vcGVucmYodGVzdF9zdXBwb3J0LlRFU1RGTiwgJyp3YicpCisgICAgICAgICAgICByZnAud3JpdGUoJ2dvb2RieWUgd29ybGRcbicpCisgICAgICAgICAgICByZnAuY2xvc2UoKQorCisKKyAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAncicpCisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICdoZWxsbyB3b3JsZFxuJykKKworICAgICAgICAgICAgcmZwID0gTWFjT1Mub3BlbnJmKHRlc3Rfc3VwcG9ydC5URVNURk4sICcqcmInKQorICAgICAgICAgICAgZGF0YSA9IHJmcC5yZWFkKDEwMCkKKyAgICAgICAgICAgIGRhdGEyID0gcmZwLnJlYWQoMTAwKQorICAgICAgICAgICAgcmZwLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJ2dvb2RieWUgd29ybGRcbicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEyLCAnJykKKworCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdE1hY09TKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTUxZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTUxZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY29zdG9vbHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMTU5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5CkBAIC0wLDAgKzEsODggQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitNYWNPUyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdNYWNPUycpCisjVGhlIGZvbGxvd2luZyBtb2R1bGVzIHNob3VsZCBleGlzdCBpZiBNYWNPUyBleGlzdHMuCitpbXBvcnQgQ2FyYm9uLkZpbGUKK2ltcG9ydCBtYWNvc3Rvb2xzCisKK1RFU1RGTjIgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgJzInCisKK2NsYXNzIFRlc3RNYWNvc3Rvb2xzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3JykKKyAgICAgICAgZnAud3JpdGUoJ2hlbGxvIHdvcmxkXG4nKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHJmcCA9IE1hY09TLm9wZW5yZih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnKndiJykKKyAgICAgICAgcmZwLndyaXRlKCdnb29kYnllIHdvcmxkXG4nKQorICAgICAgICByZnAuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVEZOMikKKworICAgIGRlZiBjb21wYXJlRGF0YShzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICdyJykKKyAgICAgICAgZGF0YTEgPSBmcC5yZWFkKCkKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBmcCA9IG9wZW4oVEVTVEZOMiwgJ3InKQorICAgICAgICBkYXRhMiA9IGZwLnJlYWQoKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGlmIGRhdGExICE9IGRhdGEyOgorICAgICAgICAgICAgcmV0dXJuICdEYXRhIGZvcmtzIGRpZmZlcicKKyAgICAgICAgcmZwID0gTWFjT1Mub3BlbnJmKHRlc3Rfc3VwcG9ydC5URVNURk4sICcqcmInKQorICAgICAgICBkYXRhMSA9IHJmcC5yZWFkKDEwMDApCisgICAgICAgIHJmcC5jbG9zZSgpCisgICAgICAgIHJmcCA9IE1hY09TLm9wZW5yZihURVNURk4yLCAnKnJiJykKKyAgICAgICAgZGF0YTIgPSByZnAucmVhZCgxMDAwKQorICAgICAgICByZnAuY2xvc2UoKQorICAgICAgICBpZiBkYXRhMSAhPSBkYXRhMjoKKyAgICAgICAgICAgIHJldHVybiAnUmVzb3VyY2UgZm9ya3MgZGlmZmVyJworICAgICAgICByZXR1cm4gJycKKworICAgIGRlZiB0ZXN0X3RvdWNoZWQoc2VsZik6CisgICAgICAgICMgVGhpcyByZWFsbHkgb25seSB0ZXN0cyB0aGF0IG5vdGhpbmcgdW5mb3Jlc2VlbiBoYXBwZW5zLgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoJ21hY29zdG9vbHMudG91Y2hlZConLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSwgcXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICBtYWNvc3Rvb2xzLnRvdWNoZWQodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGlmIHN5cy5tYXhpbnQgPCAyKiozMjoKKyAgICAgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVEZOMikKKyAgICAgICAgICAgIG1hY29zdG9vbHMuY29weSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBURVNURk4yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBhcmVEYXRhKCksICcnKQorCisgICAgaWYgc3lzLm1heGludCA8IDIqKjMyOgorICAgICAgICBkZWYgdGVzdF9ta2FsaWFzKHNlbGYpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQorICAgICAgICAgICAgbWFjb3N0b29scy5ta2FsaWFzKHRlc3Rfc3VwcG9ydC5URVNURk4sIFRFU1RGTjIpCisgICAgICAgICAgICBmc3MsIF8sIF8gPSBDYXJib24uRmlsZS5SZXNvbHZlQWxpYXNGaWxlKFRFU1RGTjIsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZzcy5hc19wYXRobmFtZSgpLCBvcy5wYXRoLnJlYWxwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pKQorCisgICAgICAgIGRlZiB0ZXN0X21rYWxpYXNfcmVsYXRpdmUoc2VsZik6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RGTjIpCisgICAgICAgICAgICAjIElmIHRoZSBkaXJlY3RvcnkgZG9lc24ndCBleGlzdCwgdGhlbiBjaGFuY2VzIGFyZSB0aGlzIGlzIGEgbmV3CisgICAgICAgICAgICAjIGluc3RhbGwgb2YgUHl0aG9uIHNvIGRvbid0IGNyZWF0ZSBpdCBzaW5jZSB0aGUgdXNlciBtaWdodCBlbmQgdXAKKyAgICAgICAgICAgICMgcnVubmluZyBgYHN1ZG8gbWFrZSBpbnN0YWxsYGAgYW5kIGNyZWF0aW5nIHRoZSBkaXJlY3RvcnkgaGVyZSB3b24ndAorICAgICAgICAgICAgIyBsZWF2ZSBpdCB3aXRoIHRoZSBwcm9wZXIgcGVybWlzc2lvbnMuCisgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc3lzLnByZWZpeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBtYWNvc3Rvb2xzLm1rYWxpYXModGVzdF9zdXBwb3J0LlRFU1RGTiwgVEVTVEZOMiwgc3lzLnByZWZpeCkKKyAgICAgICAgICAgIGZzcywgXywgXyA9IENhcmJvbi5GaWxlLlJlc29sdmVBbGlhc0ZpbGUoVEVTVEZOMiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnNzLmFzX3BhdGhuYW1lKCksIG9zLnBhdGgucmVhbHBhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgICMgU2tpcCBvbiB3aWRlIHVuaWNvZGUKKyAgICBpZiBsZW4odSdcMCcuZW5jb2RlKCd1bmljb2RlLWludGVybmFsJykpID09IDQ6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJ0ZXN0X21hY29zdG9vbHMgaXMgYnJva2VuIGluIFVTQzQiKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdE1hY29zdG9vbHMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3N0b29scy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTI5YWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3N0b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3N0b29scy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNvc3Rvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTI5YWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjb3N0b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFjcGF0aC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4NmM1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHkKQEAgLTAsMCArMSw1NyBAQAoraW1wb3J0IG1hY3BhdGgKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCB0ZXN0X2dlbmVyaWNwYXRoCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBNYWNQYXRoVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYWJzcGF0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWNwYXRoLmFic3BhdGgoInh4Onl5IiksICJ4eDp5eSIpCisKKyAgICBkZWYgdGVzdF9pc2FicyhzZWxmKToKKyAgICAgICAgaXNhYnMgPSBtYWNwYXRoLmlzYWJzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2FicygieHg6eXkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzKCJ4eDp5eToiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzKCJ4eDoiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNhYnMoIjpmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiOmZvbzpiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiOmZvbzpiYXI6IikpCisKKyAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKKyAgICAgICAgc3BsaXQgPSBtYWNwYXRoLnNwbGl0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXQoImZvbzpiYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdmb286JywgJ2JhcicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0KCJjb25reTptb3VudHBvaW50OmZvbzpiYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdjb25reTptb3VudHBvaW50OmZvbycsICdiYXInKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0KCI6IiksICgnJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0KCI6Y29ua3k6bW91bnRwb2ludDoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCc6Y29ua3k6bW91bnRwb2ludCcsICcnKSkKKworICAgIGRlZiB0ZXN0X3NwbGl0ZXh0KHNlbGYpOgorICAgICAgICBzcGxpdGV4dCA9IG1hY3BhdGguc3BsaXRleHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGV4dCgiOmZvby5leHQiKSwgKCc6Zm9vJywgJy5leHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGV4dCgiZm9vOmZvby5leHQiKSwgKCdmb286Zm9vJywgJy5leHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGV4dCgiLmV4dCIpLCAoJy5leHQnLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRleHQoImZvby5leHQ6Zm9vIiksICgnZm9vLmV4dDpmb28nLCAnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BsaXRleHQoIjpmb28uZXh0OiIpLCAoJzpmb28uZXh0OicsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGxpdGV4dCgiIiksICgnJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0ZXh0KCJmb28uYmFyLmV4dCIpLCAoJ2Zvby5iYXInLCAnLmV4dCcpKQorCisgICAgZGVmIHRlc3Rfbm9ybXBhdGgoc2VsZik6CisgICAgICAgICMgSXNzdWUgNTgyNzogTWFrZSBzdXJlIG5vcm1wYXRoIHByZXNlcnZlcyB1bmljb2RlCisgICAgICAgIGZvciBwYXRoIGluICh1JycsIHUnLicsIHUnLycsIHUnXFwnLCB1JzonLCB1Jy8vL2Zvby8uLy9iYXIvLycpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1hY3BhdGgubm9ybXBhdGgocGF0aCksIHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vcm1wYXRoKCkgcmV0dXJuZWQgc3RyIGluc3RlYWQgb2YgdW5pY29kZScpCisKK2NsYXNzIE1hY0NvbW1vblRlc3QodGVzdF9nZW5lcmljcGF0aC5Db21tb25UZXN0KToKKyAgICBwYXRobW9kdWxlID0gbWFjcGF0aAorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE1hY1BhdGhUZXN0Q2FzZSwgTWFjQ29tbW9uVGVzdCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNwYXRoLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzVmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNwYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNwYXRoLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hY3BhdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YzVmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWNwYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYWlsYm94LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZThlM2MxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weQpAQCAtMCwwICsxLDIxMjIgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBzdGF0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgZW1haWwKK2ltcG9ydCBlbWFpbC5tZXNzYWdlCitpbXBvcnQgcmUKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IHRlbXBmaWxlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgbWFpbGJveAoraW1wb3J0IGdsb2IKK3RyeToKKyAgICBpbXBvcnQgZmNudGwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKKyMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKK3JmYzgyMiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdyZmM4MjInLCBkZXByZWNhdGVkPVRydWUpCisKK2NsYXNzIFRlc3RCYXNlOgorCisgICAgZGVmIF9jaGVja19zYW1wbGUoc2VsZiwgbXNnKToKKyAgICAgICAgIyBJbnNwZWN0IGEgbWFpbGJveC5NZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzYW1wbGUgbWVzc2FnZQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2csIG1haWxib3guTWVzc2FnZSkKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gX3NhbXBsZV9oZWFkZXJzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih2YWx1ZSwgbXNnLmdldF9hbGwoa2V5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmdldF9wYXlsb2FkKCkpLCBsZW4oX3NhbXBsZV9wYXlsb2FkcykpCisgICAgICAgIGZvciBpLCBwYXlsb2FkIGluIGVudW1lcmF0ZShfc2FtcGxlX3BheWxvYWRzKToKKyAgICAgICAgICAgIHBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwYXJ0LCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UocGFydCwgbWFpbGJveC5NZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJ0LmdldF9wYXlsb2FkKCksIHBheWxvYWQpCisKKyAgICBkZWYgX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLCB0YXJnZXQpOgorICAgICAgICAjIERlbGV0ZSBhIGZpbGUgb3IgZGVsZXRlIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodGFyZ2V0KToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUodGFyZ2V0KQorICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldCk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRhcmdldCkKKworCitjbGFzcyBUZXN0TWFpbGJveChUZXN0QmFzZSk6CisKKyAgICBfZmFjdG9yeSA9IE5vbmUgICAgICMgT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIHJldXNlIHRlc3RzCisgICAgX3RlbXBsYXRlID0gJ0Zyb206IGZvb1xuXG4lc1xuJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9wYXRoID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLl9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLl9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZi5fcGF0aCkKKworICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKKyAgICAgICAgIyBBZGQgY29waWVzIG9mIGEgc2FtcGxlIG1lc3NhZ2UKKyAgICAgICAga2V5cyA9IFtdCisgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMSkKKyAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDIpCisgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhfc2FtcGxlX21lc3NhZ2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMykKKyAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChTdHJpbmdJTy5TdHJpbmdJTyhfc2FtcGxlX21lc3NhZ2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgNCkKKyAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleXNbMF0pLCBzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGZvciBpIGluICgxLCAyLCAzLCA0KToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5c1tpXV0pCisKKyAgICBkZWYgdGVzdF9hZGRfZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCd3KycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkuc3BsaXQoJ1xuJyksCisgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2Uuc3BsaXQoJ1xuJykpCisKKyAgICBkZWYgdGVzdF9hZGRfU3RyaW5nSU8oc2VsZik6CisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQoU3RyaW5nSU8uU3RyaW5nSU8oc2VsZi5fdGVtcGxhdGUgJSAiMCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSksIHNlbGYuX3RlbXBsYXRlICUgIjAiKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICAjIFJlbW92ZSBtZXNzYWdlcyB1c2luZyByZW1vdmUoKQorICAgICAgICBzZWxmLl90ZXN0X3JlbW92ZV9vcl9kZWxpdGVtKHNlbGYuX2JveC5yZW1vdmUpCisKKyAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgorICAgICAgICAjIFJlbW92ZSBtZXNzYWdlcyB1c2luZyBfX2RlbGl0ZW1fXygpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVtb3ZlX29yX2RlbGl0ZW0oc2VsZi5fYm94Ll9fZGVsaXRlbV9fKQorCisgICAgZGVmIF90ZXN0X3JlbW92ZV9vcl9kZWxpdGVtKHNlbGYsIG1ldGhvZCk6CisgICAgICAgICMgKFVzZWQgYnkgdGVzdF9yZW1vdmUoKSBhbmQgdGVzdF9kZWxpdGVtKCkuKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMikKKyAgICAgICAgbWV0aG9kKGtleTApCisgICAgICAgIGwgPSBsZW4oc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogbWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpLCBzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMikKKyAgICAgICAgbWV0aG9kKGtleTIpCisgICAgICAgIGwgPSBsZW4oc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogbWV0aG9kKGtleTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpLCBzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIG1ldGhvZChrZXkxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IG1ldGhvZChrZXkxKSkKKworICAgIGRlZiB0ZXN0X2Rpc2NhcmQoc2VsZiwgcmVwZXRpdGlvbnM9MTApOgorICAgICAgICAjIERpc2NhcmQgbWVzc2FnZXMKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDIpCisgICAgICAgIHNlbGYuX2JveC5kaXNjYXJkKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkwXSkKKyAgICAgICAgc2VsZi5fYm94LmRpc2NhcmQoa2V5MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTBdKQorCisgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgorICAgICAgICAjIFJldHJpZXZlIG1lc3NhZ2VzIHVzaW5nIGdldCgpCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnID0gc2VsZi5fYm94LmdldChrZXkwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snZnJvbSddLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoKSwgJzBcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5fYm94LmdldCgnZm9vJyksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5fYm94LmdldCgnZm9vJywgRmFsc2UpKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgsIGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgbXNnID0gc2VsZi5fYm94LmdldChrZXkxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ1snZnJvbSddLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZnAucmVhZCgpLCAnMScgKyBvcy5saW5lc2VwKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgIyBSZXRyaWV2ZSBtZXNzYWdlIHVzaW5nIF9fZ2V0aXRlbV9fKCkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cgPSBzZWxmLl9ib3hba2V5MF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ2Zyb20nXSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKCksICcwXG4nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hbJ2ZvbyddKQorICAgICAgICBzZWxmLl9ib3guZGlzY2FyZChrZXkwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCisKKyAgICBkZWYgdGVzdF9nZXRfbWVzc2FnZShzZWxmKToKKyAgICAgICAgIyBHZXQgTWVzc2FnZSByZXByZXNlbnRhdGlvbnMgb2YgbWVzc2FnZXMKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZzAgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzAsIG1haWxib3guTWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cwWydmcm9tJ10sICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzAuZ2V0X3BheWxvYWQoKSwgJzBcbicpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MSkpCisKKyAgICBkZWYgdGVzdF9nZXRfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApLCBzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSksIF9zYW1wbGVfbWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2dldF9maWxlKHNlbGYpOgorICAgICAgICAjIEdldCBmaWxlIHJlcHJlc2VudGF0aW9ucyBvZiBtZXNzYWdlcworICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnMCA9IHNlbGYuX2JveC5nZXRfZmlsZShrZXkwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzAucmVhZCgpLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cxID0gc2VsZi5fYm94LmdldF9maWxlKGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMS5yZWFkKCkucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZzAuY2xvc2UoKQorICAgICAgICBtc2cxLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2dldF9maWxlX2Nhbl9iZV9jbG9zZWRfdHdpY2Uoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTE3MDAKKyAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIGYgPSBzZWxmLl9ib3guZ2V0X2ZpbGUoa2V5KQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9pdGVya2V5cyhzZWxmKToKKyAgICAgICAgIyBHZXQga2V5cyB1c2luZyBpdGVya2V5cygpCisgICAgICAgIHNlbGYuX2NoZWNrX2l0ZXJhdGlvbihzZWxmLl9ib3guaXRlcmtleXMsIGRvX2tleXM9VHJ1ZSwgZG9fdmFsdWVzPUZhbHNlKQorCisgICAgZGVmIHRlc3Rfa2V5cyhzZWxmKToKKyAgICAgICAgIyBHZXQga2V5cyB1c2luZyBrZXlzKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmF0aW9uKHNlbGYuX2JveC5rZXlzLCBkb19rZXlzPVRydWUsIGRvX3ZhbHVlcz1GYWxzZSkKKworICAgIGRlZiB0ZXN0X2l0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgICMgR2V0IHZhbHVlcyB1c2luZyBpdGVydmFsdWVzKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmF0aW9uKHNlbGYuX2JveC5pdGVydmFsdWVzLCBkb19rZXlzPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fdmFsdWVzPVRydWUpCisKKyAgICBkZWYgdGVzdF9pdGVyKHNlbGYpOgorICAgICAgICAjIEdldCB2YWx1ZXMgdXNpbmcgX19pdGVyX18oKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94Ll9faXRlcl9fLCBkb19rZXlzPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fdmFsdWVzPVRydWUpCisKKyAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CisgICAgICAgICMgR2V0IHZhbHVlcyB1c2luZyB2YWx1ZXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94LnZhbHVlcywgZG9fa2V5cz1GYWxzZSwgZG9fdmFsdWVzPVRydWUpCisKKyAgICBkZWYgdGVzdF9pdGVyaXRlbXMoc2VsZik6CisgICAgICAgICMgR2V0IGtleXMgYW5kIHZhbHVlcyB1c2luZyBpdGVyaXRlbXMoKQorICAgICAgICBzZWxmLl9jaGVja19pdGVyYXRpb24oc2VsZi5fYm94Lml0ZXJpdGVtcywgZG9fa2V5cz1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fdmFsdWVzPVRydWUpCisKKyAgICBkZWYgdGVzdF9pdGVtcyhzZWxmKToKKyAgICAgICAgIyBHZXQga2V5cyBhbmQgdmFsdWVzIHVzaW5nIGl0ZW1zKCkKKyAgICAgICAgc2VsZi5fY2hlY2tfaXRlcmF0aW9uKHNlbGYuX2JveC5pdGVtcywgZG9fa2V5cz1UcnVlLCBkb192YWx1ZXM9VHJ1ZSkKKworICAgIGRlZiBfY2hlY2tfaXRlcmF0aW9uKHNlbGYsIG1ldGhvZCwgZG9fa2V5cywgZG9fdmFsdWVzLCByZXBldGl0aW9ucz0xMCk6CisgICAgICAgIGZvciB2YWx1ZSBpbiBtZXRob2QoKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm90IGVtcHR5IikKKyAgICAgICAga2V5cywgdmFsdWVzID0gW10sIFtdCisgICAgICAgIGZvciBpIGluIHhyYW5nZShyZXBldGl0aW9ucyk6CisgICAgICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgaSkpCisgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHNlbGYuX3RlbXBsYXRlICUgaSkKKyAgICAgICAgaWYgZG9fa2V5cyBhbmQgbm90IGRvX3ZhbHVlczoKKyAgICAgICAgICAgIHJldHVybmVkX2tleXMgPSBsaXN0KG1ldGhvZCgpKQorICAgICAgICBlbGlmIGRvX3ZhbHVlcyBhbmQgbm90IGRvX2tleXM6CisgICAgICAgICAgICByZXR1cm5lZF92YWx1ZXMgPSBsaXN0KG1ldGhvZCgpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuZWRfa2V5cywgcmV0dXJuZWRfdmFsdWVzID0gW10sIFtdCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBtZXRob2QoKToKKyAgICAgICAgICAgICAgICByZXR1cm5lZF9rZXlzLmFwcGVuZChrZXkpCisgICAgICAgICAgICAgICAgcmV0dXJuZWRfdmFsdWVzLmFwcGVuZCh2YWx1ZSkKKyAgICAgICAgaWYgZG9fa2V5czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGtleXMpLCBsZW4ocmV0dXJuZWRfa2V5cykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChrZXlzKSwgc2V0KHJldHVybmVkX2tleXMpKQorICAgICAgICBpZiBkb192YWx1ZXM6CisgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiByZXR1cm5lZF92YWx1ZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZVsnZnJvbSddLCAnZm9vJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHZhbHVlLmdldF9wYXlsb2FkKCkpIDwgcmVwZXRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZS5nZXRfcGF5bG9hZCgpLCByZXBldGl0aW9ucykpCisgICAgICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmFsdWVzKSwgY291bnQpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICAjIENoZWNrIGV4aXN0ZW5jZSBvZiBrZXlzIHVzaW5nIGhhc19rZXkoKQorICAgICAgICBzZWxmLl90ZXN0X2hhc19rZXlfb3JfY29udGFpbnMoc2VsZi5fYm94Lmhhc19rZXkpCisKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgIyBDaGVjayBleGlzdGVuY2Ugb2Yga2V5cyB1c2luZyBfX2NvbnRhaW5zX18oKQorICAgICAgICBzZWxmLl90ZXN0X2hhc19rZXlfb3JfY29udGFpbnMoc2VsZi5fYm94Ll9fY29udGFpbnNfXykKKworICAgIGRlZiBfdGVzdF9oYXNfa2V5X29yX2NvbnRhaW5zKHNlbGYsIG1ldGhvZCk6CisgICAgICAgICMgKFVzZWQgYnkgdGVzdF9oYXNfa2V5KCkgYW5kIHRlc3RfY29udGFpbnMoKS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aG9kKCdmb28nKSkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1ldGhvZCgnZm9vJykpCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ldGhvZChrZXkxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ldGhvZChrZXkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZXRob2QoJ2ZvbycpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWV0aG9kKGtleTEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZXRob2Qoa2V5MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWV0aG9kKGtleTApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1ldGhvZCgnZm9vJykpCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZiwgcmVwZXRpdGlvbnM9MTApOgorICAgICAgICAjIEdldCBtZXNzYWdlIGNvdW50CisgICAgICAgIGtleXMgPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocmVwZXRpdGlvbnMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgaSkKKyAgICAgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSBpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksICBpICsgMSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKHJlcGV0aXRpb25zKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIHJlcGV0aXRpb25zIC0gaSkKKyAgICAgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5c1tpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIHJlcGV0aXRpb25zIC0gaSAtIDEpCisKKyAgICBkZWYgdGVzdF9zZXRfaXRlbShzZWxmKToKKyAgICAgICAgIyBNb2RpZnkgbWVzc2FnZXMgdXNpbmcgX19zZXRpdGVtX18oKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCisgICAgICAgIHNlbGYuX2JveFtrZXkwXSA9IHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDAnKQorICAgICAgICBzZWxmLl9ib3hba2V5MV0gPSBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDEnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJykKKyAgICAgICAgc2VsZi5fYm94W2tleTBdID0gX3NhbXBsZV9tZXNzYWdlCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5MF0pCisgICAgICAgIHNlbGYuX2JveFtrZXkxXSA9IHNlbGYuX2JveFtrZXkwXQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUoc2VsZi5fYm94W2tleTFdKQorICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUoc2VsZi5fYm94W2tleTFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzZWxmLl9ib3guX19zZXRpdGVtX18oJ2ZvbycsICdiYXInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94Wydmb28nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMikKKworICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgorICAgICAgICAjIFJlbW92ZSBhbGwgbWVzc2FnZXMgdXNpbmcgY2xlYXIoKQorICAgICAgICBrZXlzID0gW10KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgorICAgICAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpCisgICAgICAgIGZvciBpLCBrZXkgaW4gZW51bWVyYXRlKGtleXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkpLCBzZWxmLl90ZW1wbGF0ZSAlIGkpCisgICAgICAgIHNlbGYuX2JveC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDApCisgICAgICAgIGZvciBpLCBrZXkgaW4gZW51bWVyYXRlKGtleXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KSkKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgIyBHZXQgYW5kIHJlbW92ZSBhIG1lc3NhZ2UgdXNpbmcgcG9wKCkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLmFzc2VydEluKGtleTAsIHNlbGYuX2JveCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBzZWxmLmFzc2VydEluKGtleTEsIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3gucG9wKGtleTApLmdldF9wYXlsb2FkKCksICcwXG4nKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGtleTAsIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihrZXkxLCBzZWxmLl9ib3gpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihrZXkyLCBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LnBvcChrZXkyKS5nZXRfcGF5bG9hZCgpLCAnMlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihrZXkyLCBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5MSwgc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5wb3Aoa2V5MSkuZ2V0X3BheWxvYWQoKSwgJzFcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oa2V5MSwgc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAwKQorCisgICAgZGVmIHRlc3RfcG9waXRlbShzZWxmLCBpdGVyYXRpb25zPTEwKToKKyAgICAgICAgIyBHZXQgYW5kIHJlbW92ZSBhbiBhcmJpdHJhcnkgKGtleSwgbWVzc2FnZSkgdXNpbmcgcG9waXRlbSgpCisgICAgICAgIGtleXMgPSBbXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTApOgorICAgICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpKQorICAgICAgICBzZWVuID0gW10KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwKToKKyAgICAgICAgICAgIGtleSwgbXNnID0gc2VsZi5fYm94LnBvcGl0ZW0oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrZXksIGtleXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGtleSwgc2VlbikKKyAgICAgICAgICAgIHNlZW4uYXBwZW5kKGtleSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KG1zZy5nZXRfcGF5bG9hZCgpKSwga2V5cy5pbmRleChrZXkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAwKQorICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5XSkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgIyBNb2RpZnkgbXVsdGlwbGUgbWVzc2FnZXMgdXNpbmcgdXBkYXRlKCkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDEnKQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAyJykKKyAgICAgICAgc2VsZi5fYm94LnVwZGF0ZSh7a2V5MDogc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MjogX3NhbXBsZV9tZXNzYWdlfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDEnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUoc2VsZi5fYm94W2tleTJdKQorICAgICAgICBzZWxmLl9ib3gudXBkYXRlKFsoa2V5Miwgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAyJyksCisgICAgICAgICAgICAgICAgICAgIChrZXkxLCBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDEnKSwKKyAgICAgICAgICAgICAgICAgICAgKGtleTAsIHNlbGYuX3RlbXBsYXRlICUgJ29yaWdpbmFsIDAnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiBzZWxmLl9ib3gudXBkYXRlKHsnZm9vJzogJ2JhcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkwOiBzZWxmLl90ZW1wbGF0ZSAlICJjaGFuZ2VkIDAifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAiY2hhbmdlZCAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICJjaGFuZ2VkIDEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMiIpCisKKyAgICBkZWYgdGVzdF9mbHVzaChzZWxmKToKKyAgICAgICAgIyBXcml0ZSBjaGFuZ2VzIHRvIGRpc2sKKyAgICAgICAgc2VsZi5fdGVzdF9mbHVzaF9vcl9jbG9zZShzZWxmLl9ib3guZmx1c2gsIFRydWUpCisKKyAgICBkZWYgdGVzdF9wb3BpdGVtX2FuZF9mbHVzaF90d2ljZShzZWxmKToKKyAgICAgICAgIyBTZWUgIzE1MDM2LgorICAgICAgICBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisKKyAgICAgICAgc2VsZi5fYm94LnBvcGl0ZW0oKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorICAgICAgICBzZWxmLl9ib3gucG9waXRlbSgpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisKKyAgICBkZWYgdGVzdF9sb2NrX3VubG9jayhzZWxmKToKKyAgICAgICAgIyBMb2NrIGFuZCB1bmxvY2sgdGhlIG1haWxib3gKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQorICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQorICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQorCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgICMgQ2xvc2UgbWFpbGJveCBhbmQgZmx1c2ggY2hhbmdlcyB0byBkaXNrCisgICAgICAgIHNlbGYuX3Rlc3RfZmx1c2hfb3JfY2xvc2Uoc2VsZi5fYm94LmNsb3NlLCBGYWxzZSkKKworICAgIGRlZiBfdGVzdF9mbHVzaF9vcl9jbG9zZShzZWxmLCBtZXRob2QsIHNob3VsZF9jYWxsX2Nsb3NlKToKKyAgICAgICAgY29udGVudHMgPSBbc2VsZi5fdGVtcGxhdGUgJSBpIGZvciBpIGluIHhyYW5nZSgzKV0KKyAgICAgICAgc2VsZi5fYm94LmFkZChjb250ZW50c1swXSkKKyAgICAgICAgc2VsZi5fYm94LmFkZChjb250ZW50c1sxXSkKKyAgICAgICAgc2VsZi5fYm94LmFkZChjb250ZW50c1syXSkKKyAgICAgICAgb2xkYm94ID0gc2VsZi5fYm94CisgICAgICAgIG1ldGhvZCgpCisgICAgICAgIGlmIHNob3VsZF9jYWxsX2Nsb3NlOgorICAgICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorICAgICAgICBrZXlzID0gc2VsZi5fYm94LmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihrZXlzKSwgMykKKyAgICAgICAgZm9yIGtleSBpbiBrZXlzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkpLCBjb250ZW50cykKKyAgICAgICAgb2xkYm94LmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2R1bXBfbWVzc2FnZShzZWxmKToKKyAgICAgICAgIyBXcml0ZSBtZXNzYWdlIHJlcHJlc2VudGF0aW9ucyB0byBkaXNrCisgICAgICAgIGZvciBpbnB1dCBpbiAoZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhfc2FtcGxlX21lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgIF9zYW1wbGVfbWVzc2FnZSwgU3RyaW5nSU8uU3RyaW5nSU8oX3NhbXBsZV9tZXNzYWdlKSk6CisgICAgICAgICAgICBvdXRwdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBzZWxmLl9ib3guX2R1bXBfbWVzc2FnZShpbnB1dCwgb3V0cHV0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhbXBsZV9tZXNzYWdlLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCisgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHNlbGYuX2JveC5fZHVtcF9tZXNzYWdlKE5vbmUsIG91dHB1dCkpCisKKyAgICBkZWYgX2dldF9sb2NrX3BhdGgoc2VsZik6CisgICAgICAgICMgUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSBkb3QgbG9jayBmaWxlLiBNYXkgYmUgb3ZlcnJpZGRlbi4KKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhdGggKyAnLmxvY2snCisKKworY2xhc3MgVGVzdE1haWxib3hTdXBlcmNsYXNzKFRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9ub3RpbXBsZW1lbnRlZChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgYWxsIE1haWxib3ggbWV0aG9kcyByYWlzZSBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbi4KKyAgICAgICAgYm94ID0gbWFpbGJveC5NYWlsYm94KCdwYXRoJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guYWRkKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gucmVtb3ZlKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guX19kZWxpdGVtX18oJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5kaXNjYXJkKCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guX19zZXRpdGVtX18oJycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guaXRlcmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5pdGVydmFsdWVzKCkubmV4dCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2l0ZXJfXygpLm5leHQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gudmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Lml0ZXJpdGVtcygpLm5leHQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guaXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guZ2V0KCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guX19nZXRpdGVtX18oJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5nZXRfbWVzc2FnZSgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LmdldF9zdHJpbmcoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5nZXRfZmlsZSgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94Lmhhc19rZXkoJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2NvbnRhaW5zX18oJycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC5fX2xlbl9fKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LmNsZWFyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LnBvcCgnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGxhbWJkYTogYm94LnBvcGl0ZW0oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gudXBkYXRlKCgoJycsICcnKSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guZmx1c2goKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3gubG9jaygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBsYW1iZGE6IGJveC51bmxvY2soKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgbGFtYmRhOiBib3guY2xvc2UoKSkKKworCitjbGFzcyBUZXN0TWFpbGRpcihUZXN0TWFpbGJveCwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgX2ZhY3RvcnkgPSBsYW1iZGEgc2VsZiwgcGF0aCwgZmFjdG9yeT1Ob25lOiBtYWlsYm94Lk1haWxkaXIocGF0aCwgZmFjdG9yeSkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgVGVzdE1haWxib3guc2V0VXAoc2VsZikKKyAgICAgICAgaWYgb3MubmFtZSBpbiAoJ250JywgJ29zMicpIG9yIHN5cy5wbGF0Zm9ybSA9PSAnY3lnd2luJzoKKyAgICAgICAgICAgIHNlbGYuX2JveC5jb2xvbiA9ICchJworCisgICAgZGVmIHRlc3RfYWRkX01NKHNlbGYpOgorICAgICAgICAjIEFkZCBhIE1haWxkaXJNZXNzYWdlIGluc3RhbmNlCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgbXNnLnNldF9pbmZvKCdmb28nKQorICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnY3VyJywgJyVzJXNmb28nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5LCBzZWxmLl9ib3guY29sb24pKSkpCisKKyAgICBkZWYgdGVzdF9nZXRfTU0oc2VsZik6CisgICAgICAgICMgR2V0IGEgTWFpbGRpck1lc3NhZ2UgaW5zdGFuY2UKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICBtc2cuc2V0X2ZsYWdzKCdSRicpCisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQorICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnX3JldHVybmVkLCBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCksICdjdXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSwgJ0ZSJykKKworICAgIGRlZiB0ZXN0X3NldF9NTShzZWxmKToKKyAgICAgICAgIyBTZXQgd2l0aCBhIE1haWxkaXJNZXNzYWdlIGluc3RhbmNlCisgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnMC5zZXRfZmxhZ3MoJ1RQJykKKyAgICAgICAga2V5ID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSwgJ1BUJykKKyAgICAgICAgbXNnMSA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBzZWxmLl9ib3hba2V5XSA9IG1zZzEKKyAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X3N1YmRpcigpLCAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZ19yZXR1cm5lZC5nZXRfcGF5bG9hZCgpLCAnMVxuJykKKyAgICAgICAgbXNnMiA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAyKQorICAgICAgICBtc2cyLnNldF9pbmZvKCcyLFMnKQorICAgICAgICBzZWxmLl9ib3hba2V5XSA9IG1zZzIKKyAgICAgICAgc2VsZi5fYm94W2tleV0gPSBzZWxmLl90ZW1wbGF0ZSAlIDMKKyAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X3N1YmRpcigpLCAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCksICdTJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dfcmV0dXJuZWQuZ2V0X3BheWxvYWQoKSwgJzNcbicpCisKKyAgICBkZWYgdGVzdF9jb25zaXN0ZW50X2ZhY3Rvcnkoc2VsZik6CisgICAgICAgICMgQWRkIGEgbWVzc2FnZS4KKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQorICAgICAgICBtc2cuc2V0X2ZsYWdzKCdSRicpCisgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQorCisgICAgICAgICMgQ3JlYXRlIG5ldyBtYWlsYm94IHdpdGgKKyAgICAgICAgY2xhc3MgRmFrZU1lc3NhZ2UobWFpbGJveC5NYWlsZGlyTWVzc2FnZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGJveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoLCBmYWN0b3J5PUZha2VNZXNzYWdlKQorICAgICAgICBib3guY29sb24gPSBzZWxmLl9ib3guY29sb24KKyAgICAgICAgbXNnMiA9IGJveC5nZXRfbWVzc2FnZShrZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cyLCBGYWtlTWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfbmV3KHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgYSBub24tZXhpc3RlbnQgbWFpbGJveAorICAgICAgICBzZWxmLnRlYXJEb3duKCkKKyAgICAgICAgc2VsZi5fYm94ID0gbWFpbGJveC5NYWlsZGlyKHNlbGYuX3BhdGgpCisgICAgICAgIHNlbGYuX2NoZWNrX2Jhc2ljcyhmYWN0b3J5PXJmYzgyMi5NZXNzYWdlKQorICAgICAgICBzZWxmLl9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoLCBmYWN0b3J5PU5vbmUpCisgICAgICAgIHNlbGYuX2NoZWNrX2Jhc2ljcygpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplX2V4aXN0aW5nKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgYW4gZXhpc3RpbmcgbWFpbGJveAorICAgICAgICBzZWxmLnRlYXJEb3duKCkKKyAgICAgICAgZm9yIHN1YmRpciBpbiAnJywgJ3RtcCcsICduZXcnLCAnY3VyJzoKKyAgICAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN1YmRpcikpKQorICAgICAgICBzZWxmLl9ib3ggPSBtYWlsYm94Lk1haWxkaXIoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fY2hlY2tfYmFzaWNzKGZhY3Rvcnk9cmZjODIyLk1lc3NhZ2UpCisgICAgICAgIHNlbGYuX2JveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoLCBmYWN0b3J5PU5vbmUpCisgICAgICAgIHNlbGYuX2NoZWNrX2Jhc2ljcygpCisKKyAgICBkZWYgX2NoZWNrX2Jhc2ljcyhzZWxmLCBmYWN0b3J5PU5vbmUpOgorICAgICAgICAjIChVc2VkIGJ5IHRlc3Rfb3Blbl9uZXcoKSBhbmQgdGVzdF9vcGVuX2V4aXN0aW5nKCkuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5fcGF0aCwgb3MucGF0aC5hYnNwYXRoKHNlbGYuX3BhdGgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5fZmFjdG9yeSwgZmFjdG9yeSkKKyAgICAgICAgZm9yIHN1YmRpciBpbiAnJywgJ3RtcCcsICduZXcnLCAnY3VyJzoKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyKQorICAgICAgICAgICAgbW9kZSA9IG9zLnN0YXQocGF0aClbc3RhdC5TVF9NT0RFXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0YXQuU19JU0RJUihtb2RlKSwgIk5vdCBhIGRpcmVjdG9yeTogJyVzJyIgJSBwYXRoKQorCisgICAgZGVmIHRlc3RfbGlzdF9mb2xkZXJzKHNlbGYpOgorICAgICAgICAjIExpc3QgZm9sZGVycworICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignb25lJykKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3R3bycpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KCgnb25lJywgJ3R3bycsICd0aHJlZScpKSkKKworICAgIGRlZiB0ZXN0X2dldF9mb2xkZXIoc2VsZik6CisgICAgICAgICMgT3BlbiBmb2xkZXJzCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuZm9vLmJhcicpKSkKKyAgICAgICAgZm9sZGVyMSA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb2xkZXIxLmdldF9zdHJpbmcoZm9sZGVyMS5rZXlzKClbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgJ2JhcicpCisKKyAgICBkZWYgdGVzdF9hZGRfYW5kX3JlbW92ZV9mb2xkZXJzKHNlbGYpOgorICAgICAgICAjIERlbGV0ZSBmb2xkZXJzCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdvbmUnKQorICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndHdvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgc2V0KCgnb25lJywgJ3R3bycpKSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ29uZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIHNldCgoJ3R3bycsKSkpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIHNldCgoJ3R3bycsICd0aHJlZScpKSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ3RocmVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgc2V0KCgndHdvJywpKSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ3R3bycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpLCBbXSkKKworICAgIGRlZiB0ZXN0X2NsZWFuKHNlbGYpOgorICAgICAgICAjIFJlbW92ZSBvbGQgZmlsZXMgZnJvbSAndG1wJworICAgICAgICBmb29fcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAndG1wJywgJ2ZvbycpCisgICAgICAgIGJhcl9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICd0bXAnLCAnYmFyJykKKyAgICAgICAgd2l0aCBvcGVuKGZvb19wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJAIikKKyAgICAgICAgd2l0aCBvcGVuKGJhcl9wYXRoLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJAIikKKyAgICAgICAgc2VsZi5fYm94LmNsZWFuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKKyAgICAgICAgZm9vX3N0YXQgPSBvcy5zdGF0KGZvb19wYXRoKQorICAgICAgICBvcy51dGltZShmb29fcGF0aCwgKHRpbWUudGltZSgpIC0gMTI5NjAwIC0gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb29fc3RhdC5zdF9tdGltZSkpCisgICAgICAgIHNlbGYuX2JveC5jbGVhbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZm9vX3BhdGgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoYmFyX3BhdGgpKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX3RtcChzZWxmLCByZXBldGl0aW9ucz0xMCk6CisgICAgICAgICMgQ3JlYXRlIGZpbGVzIGluIHRtcCBkaXJlY3RvcnkKKyAgICAgICAgaG9zdG5hbWUgPSBzb2NrZXQuZ2V0aG9zdG5hbWUoKQorICAgICAgICBpZiAnLycgaW4gaG9zdG5hbWU6CisgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoJy8nLCByJ1wwNTcnKQorICAgICAgICBpZiAnOicgaW4gaG9zdG5hbWU6CisgICAgICAgICAgICBob3N0bmFtZSA9IGhvc3RuYW1lLnJlcGxhY2UoJzonLCByJ1wwNzInKQorICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZShyIig/UDx0aW1lPlxkKylcLk0oP1A8TT5cZHsxLDZ9KVAoP1A8UD5cZCspIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIlEoP1A8UT5cZCspXC4oP1A8aG9zdD5bXjovXSspIikKKyAgICAgICAgcHJldmlvdXNfZ3JvdXBzID0gTm9uZQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UocmVwZXRpdGlvbnMpOgorICAgICAgICAgICAgdG1wX2ZpbGUgPSBzZWxmLl9ib3guX2NyZWF0ZV90bXAoKQorICAgICAgICAgICAgaGVhZCwgdGFpbCA9IG9zLnBhdGguc3BsaXQodG1wX2ZpbGUubmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGVhZCwgb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlIGluIHdyb25nIGxvY2F0aW9uOiAnJXMnIiAlIGhlYWQpCisgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm4ubWF0Y2godGFpbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRjaCBpcyBub3QgTm9uZSwgIkludmFsaWQgZmlsZSBuYW1lOiAnJXMnIiAlIHRhaWwpCisgICAgICAgICAgICBncm91cHMgPSBtYXRjaC5ncm91cHMoKQorICAgICAgICAgICAgaWYgcHJldmlvdXNfZ3JvdXBzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGludChncm91cHNbMF0pLCBpbnQocHJldmlvdXNfZ3JvdXBzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1tb25vdG9uaWMgc2Vjb25kczogJyVzJyBiZWZvcmUgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzBdLCBncm91cHNbMF0pKQorICAgICAgICAgICAgICAgIGlmIGludChncm91cHNbMF0pID09IGludChwcmV2aW91c19ncm91cHNbMF0pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChpbnQoZ3JvdXBzWzFdKSwgaW50KHByZXZpb3VzX2dyb3Vwc1sxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb24tbW9ub3RvbmljIG1pbGxpc2Vjb25kczogJyVzJyBiZWZvcmUgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzFdLCBncm91cHNbMV0pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoZ3JvdXBzWzJdKSA9PSBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzIElEIG1pc21hdGNoOiAnJXMnIHNob3VsZCBiZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cHNbMl0sIHBpZCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChncm91cHNbM10pID09IGludChwcmV2aW91c19ncm91cHNbM10pICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbi1zZXF1ZW50aWFsIGNvdW50ZXI6ICclcycgYmVmb3JlICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX2dyb3Vwc1szXSwgZ3JvdXBzWzNdKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JvdXBzWzRdID09IGhvc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSG9zdCBuYW1lIG1pc21hdGNoOiAnJXMnIHNob3VsZCBiZSAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cHNbNF0sIGhvc3RuYW1lKSkKKyAgICAgICAgICAgIHByZXZpb3VzX2dyb3VwcyA9IGdyb3VwcworICAgICAgICAgICAgdG1wX2ZpbGUud3JpdGUoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgdG1wX2ZpbGUuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRtcF9maWxlLnJlYWQoKSA9PSBfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICB0bXBfZmlsZS5jbG9zZSgpCisgICAgICAgIGZpbGVfY291bnQgPSBsZW4ob3MubGlzdGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgInRtcCIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVfY291bnQgPT0gcmVwZXRpdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAiV3JvbmcgZmlsZSBjb3VudDogJyVzJyBzaG91bGQgYmUgJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICAgKGZpbGVfY291bnQsIHJlcGV0aXRpb25zKSkKKworICAgIGRlZiB0ZXN0X3JlZnJlc2goc2VsZik6CisgICAgICAgICMgVXBkYXRlIHRoZSB0YWJsZSBvZiBjb250ZW50cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5fdG9jLCB7fSkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll90b2MsIHt9KQorICAgICAgICBzZWxmLl9ib3guX3JlZnJlc2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5fdG9jLCB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTE6IG9zLnBhdGguam9pbignbmV3Jywga2V5MSl9KQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll90b2MsIHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MTogb3MucGF0aC5qb2luKCduZXcnLCBrZXkxKX0pCisgICAgICAgIHNlbGYuX2JveC5fcmVmcmVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll90b2MsIHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MTogb3MucGF0aC5qb2luKCduZXcnLCBrZXkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTI6IG9zLnBhdGguam9pbignbmV3Jywga2V5Mil9KQorCisgICAgZGVmIHRlc3RfcmVmcmVzaF9hZnRlcl9zYWZldHlfcGVyaW9kKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMzI1NDogQ2FsbCBfcmVmcmVzaCBhZnRlciB0aGUgImZpbGUgc3lzdGVtIHNhZmV0eQorICAgICAgICAjIHBlcmlvZCIgb2YgMiBzZWNvbmRzIGhhcyBwYXNzZWQ7IF90b2Mgc2hvdWxkIHN0aWxsIGJlCisgICAgICAgICMgdXBkYXRlZCBiZWNhdXNlIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwgdG8gX3JlZnJlc2guCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guX3RvYywge30pCisKKyAgICAgICAgIyBFbXVsYXRlIHNsZWVwaW5nLiBJbnN0ZWFkIG9mIHNsZWVwaW5nIGZvciAyIHNlY29uZHMsIHVzZSB0aGUKKyAgICAgICAgIyBza2V3IGZhY3RvciB0byBtYWtlIF9yZWZyZXNoIHRoaW5rIHRoYXQgdGhlIGZpbGVzeXN0ZW0KKyAgICAgICAgIyBzYWZldHkgcGVyaW9kIGhhcyBwYXNzZWQgYW5kIHJlLXJlYWRpbmcgdGhlIF90b2MgaXMgb25seQorICAgICAgICAjIHJlcXVpcmVkIGlmIG10aW1lcyBkaWZmZXIuCisgICAgICAgIHNlbGYuX2JveC5fc2tld2ZhY3RvciA9IC0zCisKKyAgICAgICAgc2VsZi5fYm94Ll9yZWZyZXNoKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQoc2VsZi5fYm94Ll90b2Mua2V5cygpKSwgc29ydGVkKFtrZXkwLCBrZXkxXSkpCisKKyAgICBkZWYgdGVzdF9sb29rdXAoc2VsZik6CisgICAgICAgICMgTG9vayB1cCBtZXNzYWdlIHN1YnBhdGhzIGluIHRoZSBUT0MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94Ll9sb29rdXAoJ2ZvbycpKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94Ll9sb29rdXAoa2V5MCksIG9zLnBhdGguam9pbignbmV3Jywga2V5MCkpCisgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ25ldycsIGtleTApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5fdG9jLCB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKX0pCisgICAgICAgICMgQmUgc3VyZSB0aGF0IHRoZSBUT0MgaXMgcmVhZCBiYWNrIGZyb20gZGlzayAoc2VlIGlzc3VlICM2ODk2CisgICAgICAgICMgYWJvdXQgYmFkIG10aW1lIGJlaGF2aW91ciBvbiBzb21lIHN5c3RlbXMpLgorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3guX2xvb2t1cChrZXkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guX3RvYywge30pCisKKyAgICBkZWYgdGVzdF9sb2NrX3VubG9jayhzZWxmKToKKyAgICAgICAgIyBMb2NrIGFuZCB1bmxvY2sgdGhlIG1haWxib3guIEZvciBNYWlsZGlyLCB0aGlzIGRvZXMgbm90aGluZy4KKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKKworICAgIGRlZiB0ZXN0X2ZvbGRlciAoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgYnVnICMxNTY5NzkwOiB2ZXJpZnkgdGhhdCBmb2xkZXJzIHJldHVybmVkIGJ5IC5nZXRfZm9sZGVyKCkKKyAgICAgICAgIyB1c2UgdGhlIHNhbWUgZmFjdG9yeSBmdW5jdGlvbi4KKyAgICAgICAgZGVmIGR1bW15X2ZhY3RvcnkgKHMpOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoLCBmYWN0b3J5PWR1bW15X2ZhY3RvcnkpCisgICAgICAgIGZvbGRlciA9IGJveC5hZGRfZm9sZGVyKCdmb2xkZXIxJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhmb2xkZXIuX2ZhY3RvcnksIGR1bW15X2ZhY3RvcnkpCisKKyAgICAgICAgZm9sZGVyMV9hbGlhcyA9IGJveC5nZXRfZm9sZGVyKCdmb2xkZXIxJykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhmb2xkZXIxX2FsaWFzLl9mYWN0b3J5LCBkdW1teV9mYWN0b3J5KQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3J5X2luX2ZvbGRlciAoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IG1haWxib3hlcyBzdGlsbCB3b3JrIGlmIHRoZXJlJ3MgYSBzdHJheSBleHRyYSBkaXJlY3RvcnkKKyAgICAgICAgIyBpbiBhIGZvbGRlci4KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5fYm94LmFkZChtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKSkKKworICAgICAgICAjIENyZWF0ZSBhIHN0cmF5IGRpcmVjdG9yeQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2N1cicsICdzdHJheS1kaXInKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgbG9vcGluZyBzdGlsbCB3b3JrcyB3aXRoIHRoZSBkaXJlY3RvcnkgcHJlc2VudC4KKyAgICAgICAgZm9yIG1zZyBpbiBzZWxmLl9ib3g6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9maWxlX3Blcm1pc3Npb25zKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IG1lc3NhZ2UgZmlsZXMgYXJlIGNyZWF0ZWQgd2l0aG91dCBleGVjdXRlIHBlcm1pc3Npb25zCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAic3RhdCIpIG9yIG5vdCBoYXNhdHRyKG9zLCAidW1hc2siKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgb3JpZ191bWFzayA9IG9zLnVtYXNrKDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW1hc2sob3JpZ191bWFzaykKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzZWxmLl9ib3guX2xvb2t1cChrZXkpKQorICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKS5zdF9tb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kZSAmIDAxMTEsIDApCisKKyAgICBkZWYgdGVzdF9mb2xkZXJfZmlsZV9wZXJtcyhzZWxmKToKKyAgICAgICAgIyBGcm9tIGJ1ZyAjMzIyOCwgd2Ugd2FudCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBjcmVhdGVkIGluc2lkZSBhIE1haWxkaXIKKyAgICAgICAgIyBzdWJmb2xkZXIgaXNuJ3QgbWFya2VkIGFzIGV4ZWN1dGFibGUuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAic3RhdCIpIG9yIG5vdCBoYXNhdHRyKG9zLCAidW1hc2siKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG9yaWdfdW1hc2sgPSBvcy51bWFzaygwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWJmb2xkZXIgPSBzZWxmLl9ib3guYWRkX2ZvbGRlcignc3ViZm9sZGVyJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVtYXNrKG9yaWdfdW1hc2spCisKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzdWJmb2xkZXIuX3BhdGgsICdtYWlsZGlyZm9sZGVyJykKKyAgICAgICAgc3QgPSBvcy5zdGF0KHBhdGgpCisgICAgICAgIHBlcm1zID0gc3Quc3RfbW9kZQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKChwZXJtcyAmIDAxMTEpKSAjIEV4ZWN1dGUgYml0cyBzaG91bGQgYWxsIGJlIG9mZi4KKworICAgIGRlZiB0ZXN0X3JlcmVhZChzZWxmKToKKyAgICAgICAgIyBEbyBhbiBpbml0aWFsIHVuY29uZGl0aW9uYWwgcmVmcmVzaAorICAgICAgICBzZWxmLl9ib3guX3JlZnJlc2goKQorCisgICAgICAgICMgUHV0IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWVzIG1vcmUgdGhhbiB0d28gc2Vjb25kcyBpbnRvIHRoZSBwYXN0CisgICAgICAgICMgKGJlY2F1c2UgbXRpbWUgbWF5IGhhdmUgb25seSBhIHR3byBzZWNvbmQgZ3JhbnVsYXJpdHkpLgorICAgICAgICBmb3Igc3ViZGlyIGluICgnY3VyJywgJ25ldycpOgorICAgICAgICAgICAgb3MudXRpbWUob3MucGF0aC5qb2luKHNlbGYuX2JveC5fcGF0aCwgc3ViZGlyKSwKKyAgICAgICAgICAgICAgICAgICAgICh0aW1lLnRpbWUoKS01LCkqMikKKworICAgICAgICAjIEJlY2F1c2UgbXRpbWUgaGFzIGEgdHdvIHNlY29uZCBncmFudWxhcml0eSBpbiB3b3JzdCBjYXNlIChGQVQpLCBhCisgICAgICAgICMgcmVmcmVzaCBpcyBkb25lIHVuY29uZGl0aW9uYWxseSBpZiBjYWxsZWQgZm9yIHdpdGhpbgorICAgICAgICAjIHR3by1zZWNvbmQtcGx1cy1hLWJpdCBvZiB0aGUgbGFzdCBvbmUsIGp1c3QgaW4gY2FzZSB0aGUgbWJveCBoYXMKKyAgICAgICAgIyBjaGFuZ2VkOyBzbyBub3cgd2UgaGF2ZSB0byB3YWl0IGZvciB0aGF0IGludGVydmFsIHRvIGV4cGlyZS4KKyAgICAgICAgIworICAgICAgICAjIEJlY2F1c2UgdGhpcyBpcyBhIHRlc3QsIGVtdWxhdGUgc2xlZXBpbmcuIEluc3RlYWQgb2YKKyAgICAgICAgIyBzbGVlcGluZyBmb3IgMiBzZWNvbmRzLCB1c2UgdGhlIHNrZXcgZmFjdG9yIHRvIG1ha2UgX3JlZnJlc2gKKyAgICAgICAgIyB0aGluayB0aGF0IDIgc2Vjb25kcyBoYXZlIHBhc3NlZCBhbmQgcmUtcmVhZGluZyB0aGUgX3RvYyBpcworICAgICAgICAjIG9ubHkgcmVxdWlyZWQgaWYgbXRpbWVzIGRpZmZlci4KKyAgICAgICAgc2VsZi5fYm94Ll9za2V3ZmFjdG9yID0gLTMKKworICAgICAgICAjIFJlLXJlYWRpbmcgY2F1c2VzIHRoZSAuX3RvYyBhdHRyaWJ1dGUgdG8gYmUgYXNzaWduZWQgYSBuZXcgZGljdGlvbmFyeQorICAgICAgICAjIG9iamVjdCwgc28gd2UnbGwgY2hlY2sgdGhhdCB0aGUgLl90b2MgYXR0cmlidXRlIGlzbid0IGEgZGlmZmVyZW50CisgICAgICAgICMgb2JqZWN0LgorICAgICAgICBvcmlnX3RvYyA9IHNlbGYuX2JveC5fdG9jCisgICAgICAgIGRlZiByZWZyZXNoZWQoKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9ib3guX3RvYyBpcyBub3Qgb3JpZ190b2MKKworICAgICAgICBzZWxmLl9ib3guX3JlZnJlc2goKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlZnJlc2hlZCgpKQorCisgICAgICAgICMgTm93LCB3cml0ZSBzb21ldGhpbmcgaW50byBjdXIgYW5kIHJlbW92ZSBpdC4gIFRoaXMgY2hhbmdlcworICAgICAgICAjIHRoZSBtdGltZSBhbmQgc2hvdWxkIGNhdXNlIGEgcmUtcmVhZC4gTm90ZSB0aGF0ICJzbGVlcAorICAgICAgICAjIGVtdWxhdGlvbiIgaXMgc3RpbGwgaW4gZWZmZWN0LCBhcyBza2V3ZmFjdG9yIGlzIC0zLgorICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnY3VyJywgJ3N0cmF5LWZpbGUnKQorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3cnKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICBzZWxmLl9ib3guX3JlZnJlc2goKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmcmVzaGVkKCkpCisKKworY2xhc3MgX1Rlc3RTaW5nbGVGaWxlKFRlc3RNYWlsYm94KToKKyAgICAnJydDb21tb24gdGVzdHMgZm9yIHNpbmdsZS1maWxlIG1haWxib3hlcycnJworCisgICAgZGVmIHRlc3RfYWRkX2RvZXNudF9yZXdyaXRlKHNlbGYpOgorICAgICAgICAjIFdoZW4gb25seSBhZGRpbmcgbWVzc2FnZXMsIGZsdXNoKCkgc2hvdWxkIG5vdCByZXdyaXRlIHRoZQorICAgICAgICAjIG1haWxib3ggZmlsZS4gU2VlIGlzc3VlICM5NTU5LgorCisgICAgICAgICMgSW5vZGUgbnVtYmVyIGNoYW5nZXMgaWYgdGhlIGNvbnRlbnRzIGFyZSB3cml0dGVuIHRvIGFub3RoZXIKKyAgICAgICAgIyBmaWxlIHdoaWNoIGlzIHRoZW4gcmVuYW1lZCBvdmVyIHRoZSBvcmlnaW5hbCBmaWxlLiBTbyB3ZQorICAgICAgICAjIG11c3QgY2hlY2sgdGhhdCB0aGUgaW5vZGUgbnVtYmVyIGRvZXNuJ3QgY2hhbmdlLgorICAgICAgICBpbm9kZV9iZWZvcmUgPSBvcy5zdGF0KHNlbGYuX3BhdGgpLnN0X2lubworCisgICAgICAgIHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorCisgICAgICAgIGlub2RlX2FmdGVyID0gb3Muc3RhdChzZWxmLl9wYXRoKS5zdF9pbm8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbm9kZV9iZWZvcmUsIGlub2RlX2FmdGVyKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBtZXNzYWdlIHdhcyByZWFsbHkgYWRkZWQKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gpLCAxKQorCisgICAgZGVmIHRlc3RfcGVybWlzc2lvbnNfYWZ0ZXJfZmx1c2goc2VsZik6CisgICAgICAgICMgU2VlIGlzc3VlICM1MzQ2CisKKyAgICAgICAgIyBNYWtlIHRoZSBtYWlsYm94IHdvcmxkIHdyaXRhYmxlLiBJdCdzIHVubGlrZWx5IHRoYXQgdGhlIG5ldworICAgICAgICAjIG1haWxib3ggZmlsZSB3b3VsZCBoYXZlIHRoZXNlIHBlcm1pc3Npb25zIGFmdGVyIGZsdXNoKCksCisgICAgICAgICMgYmVjYXVzZSB1bWFzayB1c3VhbGx5IHByZXZlbnRzIGl0LgorICAgICAgICBtb2RlID0gb3Muc3RhdChzZWxmLl9wYXRoKS5zdF9tb2RlIHwgMG82NjYKKyAgICAgICAgb3MuY2htb2Qoc2VsZi5fcGF0aCwgbW9kZSkKKworICAgICAgICBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgaSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICAjIE5lZWQgdG8gcmVtb3ZlIG9uZSBtZXNzYWdlIHRvIG1ha2UgZmx1c2goKSBjcmVhdGUgYSBuZXcgZmlsZQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGkpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5zdGF0KHNlbGYuX3BhdGgpLnN0X21vZGUsIG1vZGUpCisKKworY2xhc3MgX1Rlc3RNYm94TU1ERihfVGVzdFNpbmdsZUZpbGUpOgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLl9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZi5fcGF0aCkKKyAgICAgICAgZm9yIGxvY2tfcmVtbmFudCBpbiBnbG9iLmdsb2Ioc2VsZi5fcGF0aCArICcuKicpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhsb2NrX3JlbW5hbnQpCisKKyAgICBkZWYgdGVzdF9hZGRfZnJvbV9zdHJpbmcoc2VsZik6CisgICAgICAgICMgQWRkIGEgc3RyaW5nIHN0YXJ0aW5nIHdpdGggJ0Zyb20gJyB0byB0aGUgbWFpbGJveAorICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKCdGcm9tIGZvb0BiYXIgYmxhaFxuRnJvbTogZm9vXG5cbjBcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94W2tleV0uZ2V0X2Zyb20oKSwgJ2Zvb0BiYXIgYmxhaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94W2tleV0uZ2V0X3BheWxvYWQoKSwgJzBcbicpCisKKyAgICBkZWYgdGVzdF9hZGRfbWJveF9vcl9tbWRmX21lc3NhZ2Uoc2VsZik6CisgICAgICAgICMgQWRkIGFuIG1ib3hNZXNzYWdlIG9yIE1NREZNZXNzYWdlCisgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgbXNnID0gY2xhc3NfKCdGcm9tIGZvb0BiYXIgYmxhaFxuRnJvbTogZm9vXG5cbjBcbicpCisgICAgICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKG1zZykKKworICAgIGRlZiB0ZXN0X29wZW5fY2xvc2Vfb3BlbihzZWxmKToKKyAgICAgICAgIyBPcGVuIGFuZCBpbnNwZWN0IHByZXZpb3VzbHktY3JlYXRlZCBtYWlsYm94CisgICAgICAgIHZhbHVlcyA9IFtzZWxmLl90ZW1wbGF0ZSAlIGkgZm9yIGkgaW4geHJhbmdlKDMpXQorICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzOgorICAgICAgICAgICAgc2VsZi5fYm94LmFkZCh2YWx1ZSkKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgbXRpbWUgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYuX3BhdGgpCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94KSwgMykKKyAgICAgICAgZm9yIGtleSBpbiBzZWxmLl9ib3guaXRlcmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KSwgdmFsdWVzKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG10aW1lLCBvcy5wYXRoLmdldG10aW1lKHNlbGYuX3BhdGgpKQorCisgICAgZGVmIHRlc3RfYWRkX2FuZF9jbG9zZShzZWxmKToKKyAgICAgICAgIyBWZXJpZnlpbmcgdGhhdCBjbG9zaW5nIGEgbWFpbGJveCBkb2Vzbid0IGNoYW5nZSBhZGRlZCBpdGVtcworICAgICAgICBzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDMpOgorICAgICAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpCisgICAgICAgIHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLl9ib3guX2ZpbGUuZmx1c2goKQorICAgICAgICBzZWxmLl9ib3guX2ZpbGUuc2VlaygwKQorICAgICAgICBjb250ZW50cyA9IHNlbGYuX2JveC5fZmlsZS5yZWFkKCkKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuX3BhdGgsICdyYicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCBmLnJlYWQoKSkKKyAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgIlRlc3QgbmVlZHMgZm9yaygpLiIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzb2NrZXQsICdzb2NrZXRwYWlyJyksICJUZXN0IG5lZWRzIHNvY2tldHBhaXIoKS4iKQorICAgIGRlZiB0ZXN0X2xvY2tfY29uZmxpY3Qoc2VsZik6CisgICAgICAgICMgRm9yayBvZmYgYSBjaGlsZCBwcm9jZXNzIHRoYXQgd2lsbCBsb2NrIHRoZSBtYWlsYm94IHRlbXBvcmFyaWx5LAorICAgICAgICAjIHVubG9jayBpdCBhbmQgZXhpdC4KKyAgICAgICAgYywgcCA9IHNvY2tldC5zb2NrZXRwYWlyKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGMuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLmNsb3NlKQorCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgICMgY2hpbGQKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIGxvY2sgdGhlIG1haWxib3gsIGFuZCBzaWduYWwgdGhlIHBhcmVudCBpdCBjYW4gcHJvY2VlZAorICAgICAgICAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKKyAgICAgICAgICAgICAgICBjLnNlbmQoYidjJykKKworICAgICAgICAgICAgICAgICMgd2FpdCB1bnRpbCB0aGUgcGFyZW50IGlzIGRvbmUsIGFuZCB1bmxvY2sgdGhlIG1haWxib3gKKyAgICAgICAgICAgICAgICBjLnJlY3YoMSkKKyAgICAgICAgICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKKworICAgICAgICAjIEluIHRoZSBwYXJlbnQsIHdhaXQgdW50aWwgdGhlIGNoaWxkIHNpZ25hbHMgaXQgbG9ja2VkIHRoZSBtYWlsYm94LgorICAgICAgICBwLnJlY3YoMSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMobWFpbGJveC5FeHRlcm5hbENsYXNoRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ib3gubG9jaykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgU2lnbmFsIHRoZSBjaGlsZCBpdCBjYW4gbm93IHJlbGVhc2UgdGhlIGxvY2sgYW5kIGV4aXQuCisgICAgICAgICAgICBwLnNlbmQoYidwJykKKyAgICAgICAgICAgICMgV2FpdCBmb3IgY2hpbGQgdG8gZXhpdC4gIExvY2tpbmcgc2hvdWxkIG5vdyBzdWNjZWVkLgorICAgICAgICAgICAgZXhpdGVkX3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChwaWQsIDApCisKKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKKworICAgIGRlZiB0ZXN0X3JlbG9jayhzZWxmKToKKyAgICAgICAgIyBUZXN0IGNhc2UgZm9yIGJ1ZyAjMTU3NTUwNjogdGhlIG1haWxib3ggY2xhc3Mgd2FzIGxvY2tpbmcgdGhlCisgICAgICAgICMgd3JvbmcgZmlsZSBvYmplY3QgaW4gaXRzIGZsdXNoKCkgbWV0aG9kLgorICAgICAgICBtc2cgPSAiU3ViamVjdDogc3ViXG5cbmJvZHlcbiIKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnKQorICAgICAgICBzZWxmLl9ib3guZmx1c2goKQorICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorCisgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCkKKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChtc2cpCisgICAgICAgIHNlbGYuX2JveC5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX2xvY2tlZCkKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKworCitjbGFzcyBUZXN0TWJveChfVGVzdE1ib3hNTURGLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZmFjdG9yeSA9IGxhbWJkYSBzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmU6IG1haWxib3gubWJveChwYXRoLCBmYWN0b3J5KQorCisgICAgZGVmIHRlc3RfZmlsZV9wZXJtcyhzZWxmKToKKyAgICAgICAgIyBGcm9tIGJ1ZyAjMzIyOCwgd2Ugd2FudCB0byB2ZXJpZnkgdGhhdCB0aGUgbWFpbGJveCBmaWxlIGlzbid0IGV4ZWN1dGFibGUsCisgICAgICAgICMgZXZlbiBpZiB0aGUgdW1hc2sgaXMgc2V0IHRvIHNvbWV0aGluZyB0aGF0IHdvdWxkIGxlYXZlIGV4ZWN1dGFibGUgYml0cyBzZXQuCisgICAgICAgICMgV2Ugb25seSBydW4gdGhpcyB0ZXN0IG9uIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgdW1hc2suCisgICAgICAgIGlmIGhhc2F0dHIob3MsICd1bWFzaycpIGFuZCBoYXNhdHRyKG9zLCAnc3RhdCcpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9sZF91bWFzayA9IG9zLnVtYXNrKDAwNzcpCisgICAgICAgICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoc2VsZi5fcGF0aCkKKyAgICAgICAgICAgICAgICBzZWxmLl9ib3ggPSBtYWlsYm94Lm1ib3goc2VsZi5fcGF0aCwgY3JlYXRlPVRydWUpCisgICAgICAgICAgICAgICAgc2VsZi5fYm94LmFkZCgnJykKKyAgICAgICAgICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy51bWFzayhvbGRfdW1hc2spCisKKyAgICAgICAgICAgIHN0ID0gb3Muc3RhdChzZWxmLl9wYXRoKQorICAgICAgICAgICAgcGVybXMgPSBzdC5zdF9tb2RlCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKChwZXJtcyAmIDAxMTEpKSAjIEV4ZWN1dGUgYml0cyBzaG91bGQgYWxsIGJlIG9mZi4KKworICAgIGRlZiB0ZXN0X3Rlcm1pbmF0aW5nX25ld2xpbmUoc2VsZik6CisgICAgICAgIG1lc3NhZ2UgPSBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UoKQorICAgICAgICBtZXNzYWdlWydGcm9tJ10gPSAnam9obkBleGFtcGxlLmNvbScKKyAgICAgICAgbWVzc2FnZS5zZXRfcGF5bG9hZCgnTm8gbmV3bGluZSBhdCB0aGUgZW5kJykKKyAgICAgICAgaSA9IHNlbGYuX2JveC5hZGQobWVzc2FnZSkKKworICAgICAgICAjIEEgbmV3bGluZSBzaG91bGQgaGF2ZSBiZWVuIGFwcGVuZGVkIHRvIHRoZSBwYXlsb2FkCisgICAgICAgIG1lc3NhZ2UgPSBzZWxmLl9ib3guZ2V0KGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5nZXRfcGF5bG9hZCgpLCAnTm8gbmV3bGluZSBhdCB0aGUgZW5kXG4nKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9zZXBhcmF0b3Ioc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhlcmUncyBhbHdheXMgYSBzaW5nbGUgYmxhbmsgbGluZSBhZnRlciBlYWNoIG1lc3NhZ2UKKyAgICAgICAgc2VsZi5fYm94LmFkZCgnRnJvbTogZm9vXG5cbjAnKSAgIyBObyBuZXdsaW5lIGF0IHRoZSBlbmQKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuX3BhdGgpIGFzIGY6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YVstMzpdLCAnMFxuXG4nKQorCisgICAgICAgIHNlbGYuX2JveC5hZGQoJ0Zyb206IGZvb1xuXG4wXG4nKSAgIyBOZXdsaW5lIGF0IHRoZSBlbmQKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuX3BhdGgpIGFzIGY6CisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YVstMzpdLCAnMFxuXG4nKQorCisKK2NsYXNzIFRlc3RNTURGKF9UZXN0TWJveE1NREYsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbGFtYmRhIHNlbGYsIHBhdGgsIGZhY3Rvcnk9Tm9uZTogbWFpbGJveC5NTURGKHBhdGgsIGZhY3RvcnkpCisKKworY2xhc3MgVGVzdE1IKFRlc3RNYWlsYm94LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZmFjdG9yeSA9IGxhbWJkYSBzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmU6IG1haWxib3guTUgocGF0aCwgZmFjdG9yeSkKKworICAgIGRlZiB0ZXN0X2xpc3RfZm9sZGVycyhzZWxmKToKKyAgICAgICAgIyBMaXN0IGZvbGRlcnMKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndGhyZWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNldCgoJ29uZScsICd0d28nLCAndGhyZWUnKSkpCisKKyAgICBkZWYgdGVzdF9nZXRfZm9sZGVyKHNlbGYpOgorICAgICAgICAjIE9wZW4gZm9sZGVycworICAgICAgICBkZWYgZHVtbXlfZmFjdG9yeSAocyk6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgsIGR1bW15X2ZhY3RvcnkpCisKKyAgICAgICAgbmV3X2ZvbGRlciA9IHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKKyAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdmb28uYmFyJykpKQorICAgICAgICBmb2xkZXIxID0gc2VsZi5fYm94LmdldF9mb2xkZXIoJ2Zvby5iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKKworICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU2OTc5MDogdmVyaWZ5IHRoYXQgZm9sZGVycyByZXR1cm5lZCBieSAuZ2V0X2ZvbGRlcigpCisgICAgICAgICMgdXNlIHRoZSBzYW1lIGZhY3RvcnkgZnVuY3Rpb24uCisgICAgICAgIHNlbGYuYXNzZXJ0SXMobmV3X2ZvbGRlci5fZmFjdG9yeSwgc2VsZi5fYm94Ll9mYWN0b3J5KQorICAgICAgICBzZWxmLmFzc2VydElzKGZvbGRlcjAuX2ZhY3RvcnksIHNlbGYuX2JveC5fZmFjdG9yeSkKKworICAgIGRlZiB0ZXN0X2FkZF9hbmRfcmVtb3ZlX2ZvbGRlcnMoc2VsZik6CisgICAgICAgICMgRGVsZXRlIGZvbGRlcnMKKyAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCBzZXQoKCdvbmUnLCAndHdvJykpKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcignb25lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgc2V0KCgndHdvJywgKSkpCisgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSksIHNldCgoJ3R3bycsICd0aHJlZScpKSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ3RocmVlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSwgc2V0KCgndHdvJywgKSkpCisgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCd0d28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSwgW10pCisKKyAgICBkZWYgdGVzdF9zZXF1ZW5jZXMoc2VsZik6CisgICAgICAgICMgR2V0IGFuZCBzZXQgc2VxdWVuY2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSwge30pCisgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCisgICAgICAgIG1zZzAuYWRkX3NlcXVlbmNlKCdmb28nKQorICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksIHsnZm9vJzpba2V5MF19KQorICAgICAgICBtc2cxID0gbWFpbGJveC5NSE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBtc2cxLnNldF9zZXF1ZW5jZXMoWydiYXInLCAncmVwbGllZCcsICdmb28nXSkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpba2V5MCwga2V5MV0sICdiYXInOltrZXkxXSwgJ3JlcGxpZWQnOltrZXkxXX0pCisgICAgICAgIG1zZzAuc2V0X3NlcXVlbmNlcyhbJ2ZsYWdnZWQnXSkKKyAgICAgICAgc2VsZi5fYm94W2tleTBdID0gbXNnMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkxXSwgJ2Jhcic6W2tleTFdLCAncmVwbGllZCc6W2tleTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnZmxhZ2dlZCc6W2tleTBdfSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksIHsnZmxhZ2dlZCc6W2tleTBdfSkKKworICAgIGRlZiB0ZXN0X2lzc3VlMjYyNShzZWxmKToKKyAgICAgICAgbXNnMCA9IG1haWxib3guTUhNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgbXNnMC5hZGRfc2VxdWVuY2UoJ2ZvbycpCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKG1zZzApCisgICAgICAgIHJlZm1zZzAgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MCkKKworICAgIGRlZiB0ZXN0X2lzc3VlNzYyNyhzZWxmKToKKyAgICAgICAgbXNnMCA9IG1haWxib3guTUhNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMCkKKyAgICAgICAgc2VsZi5fYm94LmxvY2soKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTApCisgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQorCisgICAgZGVmIHRlc3RfcGFjayhzZWxmKToKKyAgICAgICAgIyBQYWNrIHRoZSBjb250ZW50cyBvZiB0aGUgbWFpbGJveAorICAgICAgICBtc2cwID0gbWFpbGJveC5NSE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cxID0gbWFpbGJveC5NSE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBtc2cyID0gbWFpbGJveC5NSE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAyKQorICAgICAgICBtc2czID0gbWFpbGJveC5NSE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAzKQorICAgICAgICBtc2cwLnNldF9zZXF1ZW5jZXMoWydmb28nLCAndW5zZWVuJ10pCisgICAgICAgIG1zZzEuc2V0X3NlcXVlbmNlcyhbJ2ZvbyddKQorICAgICAgICBtc2cyLnNldF9zZXF1ZW5jZXMoWydmb28nLCAnZmxhZ2dlZCddKQorICAgICAgICBtc2czLnNldF9zZXF1ZW5jZXMoWydmb28nLCAnYmFyJywgJ3JlcGxpZWQnXSkKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMCkKKyAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQobXNnMSkKKyAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQobXNnMikKKyAgICAgICAga2V5MyA9IHNlbGYuX2JveC5hZGQobXNnMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpba2V5MCxrZXkxLGtleTIsa2V5M10sICd1bnNlZW4nOltrZXkwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZsYWdnZWQnOltrZXkyXSwgJ2Jhcic6W2tleTNdLCAncmVwbGllZCc6W2tleTNdfSkKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLGtleTEsa2V5M10sICd1bnNlZW4nOltrZXkwXSwgJ2Jhcic6W2tleTNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAncmVwbGllZCc6W2tleTNdfSkKKyAgICAgICAgc2VsZi5fYm94LnBhY2soKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5rZXlzKCksIFsxLCAyLCAzXSkKKyAgICAgICAga2V5MCA9IGtleTAKKyAgICAgICAga2V5MSA9IGtleTAgKyAxCisgICAgICAgIGtleTIgPSBrZXkxICsgMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6WzEsIDIsIDNdLCAndW5zZWVuJzpbMV0sICdiYXInOlszXSwgJ3JlcGxpZWQnOlszXX0pCisKKyAgICAgICAgIyBUZXN0IGNhc2UgZm9yIHBhY2tpbmcgd2hpbGUgaG9sZGluZyB0aGUgbWFpbGJveCBsb2NrZWQuCisgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIGtleTMgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisKKyAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkwKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTIpCisgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKKyAgICAgICAgc2VsZi5fYm94LnBhY2soKQorICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpbMSwgMiwgMywgNCwgNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICd1bnNlZW4nOlsxXSwgJ2Jhcic6WzNdLCAncmVwbGllZCc6WzNdfSkKKworICAgIGRlZiBfZ2V0X2xvY2tfcGF0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnLm1oX3NlcXVlbmNlcy5sb2NrJykKKworCitjbGFzcyBUZXN0QmFieWwoX1Rlc3RTaW5nbGVGaWxlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZmFjdG9yeSA9IGxhbWJkYSBzZWxmLCBwYXRoLCBmYWN0b3J5PU5vbmU6IG1haWxib3guQmFieWwocGF0aCwgZmFjdG9yeSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKKyAgICAgICAgc2VsZi5fZGVsZXRlX3JlY3Vyc2l2ZWx5KHNlbGYuX3BhdGgpCisgICAgICAgIGZvciBsb2NrX3JlbW5hbnQgaW4gZ2xvYi5nbG9iKHNlbGYuX3BhdGggKyAnLionKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsobG9ja19yZW1uYW50KQorCisgICAgZGVmIHRlc3RfbGFiZWxzKHNlbGYpOgorICAgICAgICAjIEdldCBsYWJlbHMgZnJvbSB0aGUgbWFpbGJveAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2JveC5nZXRfbGFiZWxzKCksIFtdKQorICAgICAgICBtc2cwID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBtc2cwLmFkZF9sYWJlbCgnZm9vJykKKyAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9ib3guZ2V0X2xhYmVscygpLCBbJ2ZvbyddKQorICAgICAgICBtc2cxID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAxKQorICAgICAgICBtc2cxLnNldF9sYWJlbHMoWydiYXInLCAnYW5zd2VyZWQnLCAnZm9vJ10pCisgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKG1zZzEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5nZXRfbGFiZWxzKCkpLCBzZXQoWydmb28nLCAnYmFyJ10pKQorICAgICAgICBtc2cwLnNldF9sYWJlbHMoWydibGFoJywgJ2ZpbGVkJ10pCisgICAgICAgIHNlbGYuX2JveFtrZXkwXSA9IG1zZzAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KFsnZm9vJywgJ2JhcicsICdibGFoJ10pKQorICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHNlbGYuX2JveC5nZXRfbGFiZWxzKCkpLCBzZXQoWydibGFoJ10pKQorCisKK2NsYXNzIFRlc3RNZXNzYWdlKFRlc3RCYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZmFjdG9yeSA9IG1haWxib3guTWVzc2FnZSAgICAgICMgT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRvIHJldXNlIHRlc3RzCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3BhdGggPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV93aXRoX2VNTShzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIGJhc2VkIG9uIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSBpbnN0YW5jZQorICAgICAgICBlTU0gPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeShlTU0pCisgICAgICAgIHNlbGYuX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKG1zZykKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfd2l0aF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBiYXNlZCBvbiBzdHJpbmcKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKG1zZykKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfd2l0aF9maWxlKHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgYmFzZWQgb24gY29udGVudHMgb2YgZmlsZQorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCwgJ3crJykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgZi5zZWVrKDApCisgICAgICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KGYpCisgICAgICAgICAgICBzZWxmLl9wb3N0X2luaXRpYWxpemVfaG9vayhtc2cpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV93aXRoX25vdGhpbmcoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRob3V0IGFyZ3VtZW50cworICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KCkKKyAgICAgICAgc2VsZi5fcG9zdF9pbml0aWFsaXplX2hvb2sobXNnKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2csIG1haWxib3guTWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZywgc2VsZi5fZmFjdG9yeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cua2V5cygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9pbml0aWFsaXplX2luY29ycmVjdGx5KHNlbGYpOgorICAgICAgICAjIEluaXRpYWxpemUgd2l0aCBpbnZhbGlkIGFyZ3VtZW50CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLl9mYWN0b3J5KG9iamVjdCgpKSkKKworICAgIGRlZiB0ZXN0X2JlY29tZV9tZXNzYWdlKHNlbGYpOgorICAgICAgICAjIFRha2Ugb24gdGhlIHN0YXRlIG9mIGFub3RoZXIgbWVzc2FnZQorICAgICAgICBlTU0gPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnID0gc2VsZi5fZmFjdG9yeSgpCisgICAgICAgIG1zZy5fYmVjb21lX21lc3NhZ2UoZU1NKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfZXhwbGFpbl90byhzZWxmKToKKyAgICAgICAgIyBDb3B5IHNlbGYncyBmb3JtYXQtc3BlY2lmaWMgZGF0YSB0byBvdGhlciBtZXNzYWdlIGZvcm1hdHMuCisgICAgICAgICMgVGhpcyB0ZXN0IGlzIHN1cGVyZmljaWFsOyBiZXR0ZXIgb25lcyBhcmUgaW4gVGVzdE1lc3NhZ2VDb252ZXJzaW9uLgorICAgICAgICBtc2cgPSBzZWxmLl9mYWN0b3J5KCkKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5NZXNzYWdlLCBtYWlsYm94Lk1haWxkaXJNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1ITWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveC5CYWJ5bE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgb3RoZXJfbXNnID0gY2xhc3NfKCkKKyAgICAgICAgICAgIG1zZy5fZXhwbGFpbl90byhvdGhlcl9tc2cpCisgICAgICAgIG90aGVyX21zZyA9IGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtc2cuX2V4cGxhaW5fdG8ob3RoZXJfbXNnKSkKKworICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKKyAgICAgICAgIyBPdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gY2hlY2sgZXh0cmEgdGhpbmdzIGFmdGVyIGluaXRpYWxpemF0aW9uCisgICAgICAgIHBhc3MKKworCitjbGFzcyBUZXN0TWFpbGRpck1lc3NhZ2UoVGVzdE1lc3NhZ2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZQorCisgICAgZGVmIF9wb3N0X2luaXRpYWxpemVfaG9vayhzZWxmLCBtc2cpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5fc3ViZGlyLCAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuX2luZm8sJycpCisKKyAgICBkZWYgdGVzdF9zdWJkaXIoc2VsZik6CisgICAgICAgICMgVXNlIGdldF9zdWJkaXIoKSBhbmQgc2V0X3N1YmRpcigpCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBtc2cuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3N1YmRpcigpLCAnY3VyJykKKyAgICAgICAgbXNnLnNldF9zdWJkaXIoJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zdWJkaXIoKSwgJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogbXNnLnNldF9zdWJkaXIoJ3RtcCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBtc2cuc2V0X3N1YmRpcignbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3N1YmRpcigpLCAnbmV3JykKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworICAgIGRlZiB0ZXN0X2ZsYWdzKHNlbGYpOgorICAgICAgICAjIFVzZSBnZXRfZmxhZ3MoKSwgc2V0X2ZsYWdzKCksIGFkZF9mbGFnKCksIHJlbW92ZV9mbGFnKCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3N1YmRpcigpLCAnbmV3JykKKyAgICAgICAgbXNnLnNldF9mbGFncygnRicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9zdWJkaXIoKSwgJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnRicpCisgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ1NEVFAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJ0RQU1QnKQorICAgICAgICBtc2cuYWRkX2ZsYWcoJ0ZUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdERlBTVCcpCisgICAgICAgIG1zZy5yZW1vdmVfZmxhZygnVERSUCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnRlMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc3ViZGlyKCksICduZXcnKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfZGF0ZShzZWxmKToKKyAgICAgICAgIyBVc2UgZ2V0X2RhdGUoKSBhbmQgc2V0X2RhdGUoKQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgZGlmZiA9IG1zZy5nZXRfZGF0ZSgpIC0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicyhkaWZmKSA8IDYwLCBkaWZmKQorICAgICAgICBtc2cuc2V0X2RhdGUoMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZGF0ZSgpLCAwLjApCisKKyAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgorICAgICAgICAjIFVzZSBnZXRfaW5mbygpIGFuZCBzZXRfaW5mbygpCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfaW5mbygpLCAnJykKKyAgICAgICAgbXNnLnNldF9pbmZvKCcxLGZvbz1iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfaW5mbygpLCAnMSxmb289YmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1zZy5zZXRfaW5mbyhOb25lKSkKKyAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKKworICAgIGRlZiB0ZXN0X2luZm9fYW5kX2ZsYWdzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaW50ZXJhY3Rpb24gb2YgaW5mbyBhbmQgZmxhZyBtZXRob2RzCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfaW5mbygpLCAnJykKKyAgICAgICAgbXNnLnNldF9mbGFncygnU0YnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJ0ZTJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2luZm8oKSwgJzIsRlMnKQorICAgICAgICBtc2cuc2V0X2luZm8oJzEsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfaW5mbygpLCAnMSwnKQorICAgICAgICBtc2cucmVtb3ZlX2ZsYWcoJ1JQVCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2luZm8oKSwgJzEsJykKKyAgICAgICAgbXNnLmFkZF9mbGFnKCdEJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdEJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2luZm8oKSwgJzIsRCcpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisKKworY2xhc3MgX1Rlc3RNYm94TU1ERk1lc3NhZ2U6CisKKyAgICBfZmFjdG9yeSA9IG1haWxib3guX21ib3hNTURGTWVzc2FnZQorCisgICAgZGVmIF9wb3N0X2luaXRpYWxpemVfaG9vayhzZWxmLCBtc2cpOgorICAgICAgICBzZWxmLl9jaGVja19mcm9tKG1zZykKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfd2l0aF91bml4ZnJvbShzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIHdpdGggYSBtZXNzYWdlIHRoYXQgYWxyZWFkeSBoYXMgYSBfdW5peGZyb20gYXR0cmlidXRlCisgICAgICAgIG1zZyA9IG1haWxib3guTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZy5zZXRfdW5peGZyb20oJ0Zyb20gZm9vQGJhciBibGFoJykKKyAgICAgICAgbXNnID0gbWFpbGJveC5tYm94TWVzc2FnZShtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mcm9tKCksICdmb29AYmFyIGJsYWgnKQorCisgICAgZGVmIHRlc3RfZnJvbShzZWxmKToKKyAgICAgICAgIyBHZXQgYW5kIHNldCAiRnJvbSAiIGxpbmUKKyAgICAgICAgbXNnID0gbWFpbGJveC5tYm94TWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHNlbGYuX2NoZWNrX2Zyb20obXNnKQorICAgICAgICBtc2cuc2V0X2Zyb20oJ2ZvbyBiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZnJvbSgpLCAnZm9vIGJhcicpCisgICAgICAgIG1zZy5zZXRfZnJvbSgnZm9vQGJhcicsIFRydWUpCisgICAgICAgIHNlbGYuX2NoZWNrX2Zyb20obXNnLCAnZm9vQGJhcicpCisgICAgICAgIG1zZy5zZXRfZnJvbSgnYmxhaEB0ZW1wJywgdGltZS5sb2NhbHRpbWUoKSkKKyAgICAgICAgc2VsZi5fY2hlY2tfZnJvbShtc2csICdibGFoQHRlbXAnKQorCisgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZik6CisgICAgICAgICMgVXNlIGdldF9mbGFncygpLCBzZXRfZmxhZ3MoKSwgYWRkX2ZsYWcoKSwgcmVtb3ZlX2ZsYWcoKQorICAgICAgICBtc2cgPSBtYWlsYm94Lm1ib3hNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICcnKQorICAgICAgICBtc2cuc2V0X2ZsYWdzKCdGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksICdGJykKKyAgICAgICAgbXNnLnNldF9mbGFncygnWE9EUicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnUk9EWCcpCisgICAgICAgIG1zZy5hZGRfZmxhZygnRkEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmxhZ3MoKSwgJ1JPREZBWCcpCisgICAgICAgIG1zZy5yZW1vdmVfZmxhZygnRkRYQScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnUk8nKQorICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIF9jaGVja19mcm9tKHNlbGYsIG1zZywgc2VuZGVyPU5vbmUpOgorICAgICAgICAjIENoZWNrIGNvbnRlbnRzIG9mICJGcm9tICIgbGluZQorICAgICAgICBpZiBzZW5kZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbmRlciA9ICJNQUlMRVItREFFTU9OIgorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2goc2VuZGVyICsgciIgXHd7M30gXHd7M30gW1xkIF1cZCBbXGQgXVxkOlxkezJ9OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXGR7Mn0gXGR7NH0iLCBtc2cuZ2V0X2Zyb20oKSkpCisKKworY2xhc3MgVGVzdE1ib3hNZXNzYWdlKF9UZXN0TWJveE1NREZNZXNzYWdlLCBUZXN0TWVzc2FnZSk6CisKKyAgICBfZmFjdG9yeSA9IG1haWxib3gubWJveE1lc3NhZ2UKKworCitjbGFzcyBUZXN0TUhNZXNzYWdlKFRlc3RNZXNzYWdlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZmFjdG9yeSA9IG1haWxib3guTUhNZXNzYWdlCisKKyAgICBkZWYgX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLl9zZXF1ZW5jZXMsIFtdKQorCisgICAgZGVmIHRlc3Rfc2VxdWVuY2VzKHNlbGYpOgorICAgICAgICAjIEdldCwgc2V0LCBqb2luLCBhbmQgbGVhdmUgc2VxdWVuY2VzCisgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3NlcXVlbmNlcygpLCBbXSkKKyAgICAgICAgbXNnLnNldF9zZXF1ZW5jZXMoWydmb29iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3NlcXVlbmNlcygpLCBbJ2Zvb2JhciddKQorICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3NlcXVlbmNlcygpLCBbXSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3NlcXVlbmNlcygpLCBbJ3Vuc2VlbiddKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3NlcXVlbmNlcygpLCBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsndW5zZWVuJywgJ2ZsYWdnZWQnXSkKKyAgICAgICAgbXNnLnJlbW92ZV9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3NlcXVlbmNlcygpLCBbJ2ZsYWdnZWQnXSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZm9vYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3NlcXVlbmNlcygpLCBbJ2ZsYWdnZWQnLCAnZm9vYmFyJ10pCisgICAgICAgIG1zZy5yZW1vdmVfc2VxdWVuY2UoJ3JlcGxpZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsnZmxhZ2dlZCcsICdmb29iYXInXSkKKyAgICAgICAgbXNnLnNldF9zZXF1ZW5jZXMoWydmb29iYXInLCAncmVwbGllZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfc2VxdWVuY2VzKCksIFsnZm9vYmFyJywgJ3JlcGxpZWQnXSkKKworCitjbGFzcyBUZXN0QmFieWxNZXNzYWdlKFRlc3RNZXNzYWdlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBfZmFjdG9yeSA9IG1haWxib3guQmFieWxNZXNzYWdlCisKKyAgICBkZWYgX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLl9sYWJlbHMsIFtdKQorCisgICAgZGVmIHRlc3RfbGFiZWxzKHNlbGYpOgorICAgICAgICAjIEdldCwgc2V0LCBqb2luLCBhbmQgbGVhdmUgbGFiZWxzCisgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2xhYmVscygpLCBbXSkKKyAgICAgICAgbXNnLnNldF9sYWJlbHMoWydmb29iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2xhYmVscygpLCBbJ2Zvb2JhciddKQorICAgICAgICBtc2cuc2V0X2xhYmVscyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2xhYmVscygpLCBbXSkKKyAgICAgICAgbXNnLmFkZF9sYWJlbCgnZmlsZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsnZmlsZWQnXSkKKyAgICAgICAgbXNnLmFkZF9sYWJlbCgncmVzZW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2xhYmVscygpLCBbJ2ZpbGVkJywgJ3Jlc2VudCddKQorICAgICAgICBtc2cuYWRkX2xhYmVsKCdyZXNlbnQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIG1zZy5yZW1vdmVfbGFiZWwoJ2ZpbGVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2xhYmVscygpLCBbJ3Jlc2VudCddKQorICAgICAgICBtc2cuYWRkX2xhYmVsKCdmb29iYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsncmVzZW50JywgJ2Zvb2JhciddKQorICAgICAgICBtc2cucmVtb3ZlX2xhYmVsKCd1bnNlZW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsncmVzZW50JywgJ2Zvb2JhciddKQorICAgICAgICBtc2cuc2V0X2xhYmVscyhbJ2Zvb2JhcicsICdhbnN3ZXJlZCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfbGFiZWxzKCksIFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCisKKyAgICBkZWYgdGVzdF92aXNpYmxlKHNlbGYpOgorICAgICAgICAjIEdldCwgc2V0LCBhbmQgdXBkYXRlIHZpc2libGUgaGVhZGVycworICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIHZpc2libGUgPSBtc2cuZ2V0X3Zpc2libGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpc2libGUua2V5cygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh2aXNpYmxlLmdldF9wYXlsb2FkKCksIE5vbmUpCisgICAgICAgIHZpc2libGVbJ1VzZXItQWdlbnQnXSA9ICdGb29CYXIgMS4wJworICAgICAgICB2aXNpYmxlWydYLVdoYXRldmVyJ10gPSAnQmxhaCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3Zpc2libGUoKS5rZXlzKCksIFtdKQorICAgICAgICBtc2cuc2V0X3Zpc2libGUodmlzaWJsZSkKKyAgICAgICAgdmlzaWJsZSA9IG1zZy5nZXRfdmlzaWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlzaWJsZS5rZXlzKCksIFsnVXNlci1BZ2VudCcsICdYLVdoYXRldmVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlzaWJsZVsnVXNlci1BZ2VudCddLCAnRm9vQmFyIDEuMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlzaWJsZVsnWC1XaGF0ZXZlciddLCAnQmxhaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModmlzaWJsZS5nZXRfcGF5bG9hZCgpLCBOb25lKQorICAgICAgICBtc2cudXBkYXRlX3Zpc2libGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpc2libGUua2V5cygpLCBbJ1VzZXItQWdlbnQnLCAnWC1XaGF0ZXZlciddKQorICAgICAgICBzZWxmLmFzc2VydElzKHZpc2libGUuZ2V0X3BheWxvYWQoKSwgTm9uZSkKKyAgICAgICAgdmlzaWJsZSA9IG1zZy5nZXRfdmlzaWJsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlzaWJsZS5rZXlzKCksIFsnVXNlci1BZ2VudCcsICdEYXRlJywgJ0Zyb20nLCAnVG8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1N1YmplY3QnXSkKKyAgICAgICAgZm9yIGhlYWRlciBpbiAoJ1VzZXItQWdlbnQnLCAnRGF0ZScsICdGcm9tJywgJ1RvJywgJ1N1YmplY3QnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlzaWJsZVtoZWFkZXJdLCBtc2dbaGVhZGVyXSkKKworCitjbGFzcyBUZXN0TU1ERk1lc3NhZ2UoX1Rlc3RNYm94TU1ERk1lc3NhZ2UsIFRlc3RNZXNzYWdlKToKKworICAgIF9mYWN0b3J5ID0gbWFpbGJveC5NTURGTWVzc2FnZQorCisKK2NsYXNzIFRlc3RNZXNzYWdlQ29udmVyc2lvbihUZXN0QmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcGxhaW5fdG9feChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1lc3NhZ2UgdG8gYWxsIGZvcm1hdHMKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5NZXNzYWdlLCBtYWlsYm94Lk1haWxkaXJNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1ITWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveC5CYWJ5bE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgbXNnX3BsYWluID0gbWFpbGJveC5NZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIG1zZyA9IGNsYXNzXyhtc2dfcGxhaW4pCisgICAgICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQorCisgICAgZGVmIHRlc3RfeF90b19wbGFpbihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IGFsbCBmb3JtYXRzIHRvIE1lc3NhZ2UKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5NZXNzYWdlLCBtYWlsYm94Lk1haWxkaXJNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1ITWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveC5CYWJ5bE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgbXNnID0gY2xhc3NfKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIG1zZ19wbGFpbiA9IG1haWxib3guTWVzc2FnZShtc2cpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnX3BsYWluKQorCisgICAgZGVmIHRlc3RfeF90b19pbnZhbGlkKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgYWxsIGZvcm1hdHMgdG8gYW4gaW52YWxpZCBmb3JtYXQKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5NZXNzYWdlLCBtYWlsYm94Lk1haWxkaXJNZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1ITWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWFpbGJveC5CYWJ5bE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGNsYXNzXyhGYWxzZSkpCisKKyAgICBkZWYgdGVzdF9tYWlsZGlyX3RvX21haWxkaXIoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNYWlsZGlyTWVzc2FnZSB0byBNYWlsZGlyTWVzc2FnZQorICAgICAgICBtc2dfbWFpbGRpciA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBtc2dfbWFpbGRpci5zZXRfZmxhZ3MoJ0RGUFJTVCcpCisgICAgICAgIG1zZ19tYWlsZGlyLnNldF9zdWJkaXIoJ2N1cicpCisgICAgICAgIGRhdGUgPSBtc2dfbWFpbGRpci5nZXRfZGF0ZSgpCisgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnX21haWxkaXIpCisgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9mbGFncygpLCAnREZQUlNUJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3N1YmRpcigpLCAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2RhdGUoKSwgZGF0ZSkKKworICAgIGRlZiB0ZXN0X21haWxkaXJfdG9fbWJveG1tZGYoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNYWlsZGlyTWVzc2FnZSB0byBtYm94bWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKKyAgICAgICAgcGFpcnMgPSAoKCdEJywgJycpLCAoJ0YnLCAnRicpLCAoJ1AnLCAnJyksICgnUicsICdBJyksICgnUycsICdSJyksCisgICAgICAgICAgICAgICAgICgnVCcsICdEJyksICgnREZQUlNUJywgJ1JERkEnKSkKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2dfbWFpbGRpciA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X2RhdGUoMC4wKQorICAgICAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfZmxhZ3Moc2V0dGluZykKKyAgICAgICAgICAgICAgICBtc2cgPSBjbGFzc18obXNnX21haWxkaXIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZnJvbSgpLCAnTUFJTEVSLURBRU1PTiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5hc2N0aW1lKHRpbWUuZ210aW1lKDAuMCkpKQorICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X3N1YmRpcignY3VyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xhc3NfKG1zZ19tYWlsZGlyKS5nZXRfZmxhZ3MoKSwgJ1JPREZBJykKKworICAgIGRlZiB0ZXN0X21haWxkaXJfdG9fbWgoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNYWlsZGlyTWVzc2FnZSB0byBNSE1lc3NhZ2UKKyAgICAgICAgbXNnX21haWxkaXIgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgcGFpcnMgPSAoKCdEJywgWyd1bnNlZW4nXSksICgnRicsIFsndW5zZWVuJywgJ2ZsYWdnZWQnXSksCisgICAgICAgICAgICAgICAgICgnUCcsIFsndW5zZWVuJ10pLCAoJ1InLCBbJ3Vuc2VlbicsICdyZXBsaWVkJ10pLCAoJ1MnLCBbXSksCisgICAgICAgICAgICAgICAgICgnVCcsIFsndW5zZWVuJ10pLCAoJ0RGUFJTVCcsIFsncmVwbGllZCcsICdmbGFnZ2VkJ10pKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X2ZsYWdzKHNldHRpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTUhNZXNzYWdlKG1zZ19tYWlsZGlyKS5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X21haWxkaXJfdG9fYmFieWwoc2VsZik6CisgICAgICAgICMgQ29udmVydCBNYWlsZGlyTWVzc2FnZSB0byBCYWJ5bAorICAgICAgICBtc2dfbWFpbGRpciA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBwYWlycyA9ICgoJ0QnLCBbJ3Vuc2VlbiddKSwgKCdGJywgWyd1bnNlZW4nXSksCisgICAgICAgICAgICAgICAgICgnUCcsIFsndW5zZWVuJywgJ2ZvcndhcmRlZCddKSwgKCdSJywgWyd1bnNlZW4nLCAnYW5zd2VyZWQnXSksCisgICAgICAgICAgICAgICAgICgnUycsIFtdKSwgKCdUJywgWyd1bnNlZW4nLCAnZGVsZXRlZCddKSwKKyAgICAgICAgICAgICAgICAgKCdERlBSU1QnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJ10pKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X2ZsYWdzKHNldHRpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guQmFieWxNZXNzYWdlKG1zZ19tYWlsZGlyKS5nZXRfbGFiZWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X21ib3htbWRmX3RvX21haWxkaXIoc2VsZik6CisgICAgICAgICMgQ29udmVydCBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UgdG8gTWFpbGRpck1lc3NhZ2UKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2dfbWJveE1NREYgPSBjbGFzc18oX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mcm9tKCdmb29AYmFyJywgdGltZS5nbXRpbWUoMC4wKSkKKyAgICAgICAgICAgIHBhaXJzID0gKCgnUicsICdTJyksICgnTycsICcnKSwgKCdEJywgJ1QnKSwgKCdGJywgJ0YnKSwgKCdBJywgJ1InKSwKKyAgICAgICAgICAgICAgICAgICAgICgnUk9ERkEnLCAnRlJTVCcpKQorICAgICAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2ZsYWdzKHNldHRpbmcpCisgICAgICAgICAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWJveE1NREYpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZsYWdzKCksIHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZGF0ZSgpLCAwLjApCisgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2ZsYWdzKCdPJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zdWJkaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cicpCisKKyAgICBkZWYgdGVzdF9tYm94bW1kZl90b19tYm94bW1kZihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2dfbWJveE1NREYgPSBjbGFzc18oX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mbGFncygnUk9ERkEnKQorICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mcm9tKCdmb29AYmFyJykKKyAgICAgICAgICAgIGZvciBjbGFzczJfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgICAgICBtc2cyID0gY2xhc3MyXyhtc2dfbWJveE1NREYpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLmdldF9mbGFncygpLCAnUk9ERkEnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMi5nZXRfZnJvbSgpLCAnZm9vQGJhcicpCisKKyAgICBkZWYgdGVzdF9tYm94bW1kZl90b19taChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBNSE1lc3NhZ2UKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2dfbWJveE1NREYgPSBjbGFzc18oX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgcGFpcnMgPSAoKCdSJywgW10pLCAoJ08nLCBbJ3Vuc2VlbiddKSwgKCdEJywgWyd1bnNlZW4nXSksCisgICAgICAgICAgICAgICAgICAgICAoJ0YnLCBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pLAorICAgICAgICAgICAgICAgICAgICAgKCdBJywgWyd1bnNlZW4nLCAncmVwbGllZCddKSwKKyAgICAgICAgICAgICAgICAgICAgICgnUk9ERkEnLCBbJ3JlcGxpZWQnLCAnZmxhZ2dlZCddKSkKKyAgICAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mbGFncyhzZXR0aW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NSE1lc3NhZ2UobXNnX21ib3hNTURGKS5nZXRfc2VxdWVuY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9tYm94bW1kZl90b19iYWJ5bChzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBCYWJ5bE1lc3NhZ2UKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBtc2cgPSBjbGFzc18oX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgcGFpcnMgPSAoKCdSJywgW10pLCAoJ08nLCBbJ3Vuc2VlbiddKSwKKyAgICAgICAgICAgICAgICAgICAgICgnRCcsIFsndW5zZWVuJywgJ2RlbGV0ZWQnXSksICgnRicsIFsndW5zZWVuJ10pLAorICAgICAgICAgICAgICAgICAgICAgKCdBJywgWyd1bnNlZW4nLCAnYW5zd2VyZWQnXSksCisgICAgICAgICAgICAgICAgICAgICAoJ1JPREZBJywgWydkZWxldGVkJywgJ2Fuc3dlcmVkJ10pKQorICAgICAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgICAgICBtc2cuc2V0X2ZsYWdzKHNldHRpbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpLmdldF9sYWJlbHMoKSwgcmVzdWx0KQorCisgICAgZGVmIHRlc3RfbWhfdG9fbWFpbGRpcihzZWxmKToKKyAgICAgICAgIyBDb252ZXJ0IE1ITWVzc2FnZSB0byBNYWlsZGlyTWVzc2FnZQorICAgICAgICBwYWlycyA9ICgoJ3Vuc2VlbicsICcnKSwgKCdyZXBsaWVkJywgJ1JTJyksICgnZmxhZ2dlZCcsICdGUycpKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZShzZXR0aW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCksIHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSwgJ2N1cicpCisgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSwgJ0ZSJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpLCAnY3VyJykKKworICAgIGRlZiB0ZXN0X21oX3RvX21ib3htbWRmKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTUhNZXNzYWdlIHRvIG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZQorICAgICAgICBwYWlycyA9ICgoJ3Vuc2VlbicsICdPJyksICgncmVwbGllZCcsICdST0EnKSwgKCdmbGFnZ2VkJywgJ1JPRicpKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZShzZXR0aW5nKQorICAgICAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSwgcmVzdWx0KQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ3Vuc2VlbicpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ3JlcGxpZWQnKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKKyAgICAgICAgZm9yIGNsYXNzXyBpbiAobWFpbGJveC5tYm94TWVzc2FnZSwgbWFpbGJveC5NTURGTWVzc2FnZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNsYXNzXyhtc2cpLmdldF9mbGFncygpLCAnT0ZBJykKKworICAgIGRlZiB0ZXN0X21oX3RvX21oKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTUhNZXNzYWdlIHRvIE1ITWVzc2FnZQorICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ3Vuc2VlbicpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ3JlcGxpZWQnKQorICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1ITWVzc2FnZShtc2cpLmdldF9zZXF1ZW5jZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ3Vuc2VlbicsICdyZXBsaWVkJywgJ2ZsYWdnZWQnXSkKKworICAgIGRlZiB0ZXN0X21oX3RvX2JhYnlsKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgTUhNZXNzYWdlIHRvIEJhYnlsTWVzc2FnZQorICAgICAgICBwYWlycyA9ICgoJ3Vuc2VlbicsIFsndW5zZWVuJ10pLCAoJ3JlcGxpZWQnLCBbJ2Fuc3dlcmVkJ10pLAorICAgICAgICAgICAgICAgICAoJ2ZsYWdnZWQnLCBbXSkpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKHNldHRpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guQmFieWxNZXNzYWdlKG1zZykuZ2V0X2xhYmVscygpLCByZXN1bHQpCisgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKKyAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCisgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guQmFieWxNZXNzYWdlKG1zZykuZ2V0X2xhYmVscygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsndW5zZWVuJywgJ2Fuc3dlcmVkJ10pCisKKyAgICBkZWYgdGVzdF9iYWJ5bF90b19tYWlsZGlyKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgQmFieWxNZXNzYWdlIHRvIE1haWxkaXJNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgJycpLCAoJ2RlbGV0ZWQnLCAnU1QnKSwgKCdmaWxlZCcsICdTJyksCisgICAgICAgICAgICAgICAgICgnYW5zd2VyZWQnLCAnUlMnKSwgKCdmb3J3YXJkZWQnLCAnUFMnKSwgKCdlZGl0ZWQnLCAnUycpLAorICAgICAgICAgICAgICAgICAoJ3Jlc2VudCcsICdQUycpKQorICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgorICAgICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChzZXR0aW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCksIHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSwgJ2N1cicpCisgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgZm9yIGxhYmVsIGluICgndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAnZWRpdGVkJywgJ3Jlc2VudCcpOgorICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChsYWJlbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCksICdQUlQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCksICdjdXInKQorCisgICAgZGVmIHRlc3RfYmFieWxfdG9fbWJveG1tZGYoc2VsZik6CisgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gbWJveE1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgJ08nKSwgKCdkZWxldGVkJywgJ1JPRCcpLCAoJ2ZpbGVkJywgJ1JPJyksCisgICAgICAgICAgICAgICAgICgnYW5zd2VyZWQnLCAnUk9BJyksICgnZm9yd2FyZGVkJywgJ1JPJyksICgnZWRpdGVkJywgJ1JPJyksCisgICAgICAgICAgICAgICAgICgncmVzZW50JywgJ1JPJykpCisgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CisgICAgICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgICAgICAgICAgbXNnLmFkZF9sYWJlbChzZXR0aW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xhc3NfKG1zZykuZ2V0X2ZsYWdzKCksIHJlc3VsdCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAorICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CisgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQorICAgICAgICBmb3IgY2xhc3NfIGluIChtYWlsYm94Lm1ib3hNZXNzYWdlLCBtYWlsYm94Lk1NREZNZXNzYWdlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xhc3NfKG1zZykuZ2V0X2ZsYWdzKCksICdPREEnKQorCisgICAgZGVmIHRlc3RfYmFieWxfdG9fbWgoc2VsZik6CisgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gTUhNZXNzYWdlCisgICAgICAgIHBhaXJzID0gKCgndW5zZWVuJywgWyd1bnNlZW4nXSksICgnZGVsZXRlZCcsIFtdKSwgKCdmaWxlZCcsIFtdKSwKKyAgICAgICAgICAgICAgICAgKCdhbnN3ZXJlZCcsIFsncmVwbGllZCddKSwgKCdmb3J3YXJkZWQnLCBbXSksICgnZWRpdGVkJywgW10pLAorICAgICAgICAgICAgICAgICAoJ3Jlc2VudCcsIFtdKSkKKyAgICAgICAgZm9yIHNldHRpbmcsIHJlc3VsdCBpbiBwYWlyczoKKyAgICAgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKKyAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwoc2V0dGluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCksIHJlc3VsdCkKKyAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAorICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CisgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1haWxib3guTUhNZXNzYWdlKG1zZykuZ2V0X3NlcXVlbmNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsndW5zZWVuJywgJ3JlcGxpZWQnXSkKKworICAgIGRlZiB0ZXN0X2JhYnlsX3RvX2JhYnlsKHNlbGYpOgorICAgICAgICAjIENvbnZlcnQgQmFieWxNZXNzYWdlIHRvIEJhYnlsTWVzc2FnZQorICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCisgICAgICAgIG1zZy51cGRhdGVfdmlzaWJsZSgpCisgICAgICAgIGZvciBsYWJlbCBpbiAoJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywgJ2Fuc3dlcmVkJywgJ2ZvcndhcmRlZCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKKyAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCisgICAgICAgIG1zZzIgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMi5nZXRfbGFiZWxzKCksIFsndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Fuc3dlcmVkJywgJ2ZvcndhcmRlZCcsICdlZGl0ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Jlc2VudCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSwgbXNnMi5nZXRfdmlzaWJsZSgpLmtleXMoKSkKKyAgICAgICAgZm9yIGtleSBpbiBtc2cuZ2V0X3Zpc2libGUoKS5rZXlzKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfdmlzaWJsZSgpW2tleV0sIG1zZzIuZ2V0X3Zpc2libGUoKVtrZXldKQorCisKK2NsYXNzIFRlc3RQcm94eUZpbGVCYXNlKFRlc3RCYXNlKToKKworICAgIGRlZiBfdGVzdF9yZWFkKHNlbGYsIHByb3h5KToKKyAgICAgICAgIyBSZWFkIGJ5IGJ5dGUKKyAgICAgICAgcHJveHkuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQoKSwgJ2JhcicpCisgICAgICAgIHByb3h5LnNlZWsoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkKCksICdhcicpCisgICAgICAgIHByb3h5LnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkKDIpLCAnYmEnKQorICAgICAgICBwcm94eS5zZWVrKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZCgtMSksICdhcicpCisgICAgICAgIHByb3h5LnNlZWsoMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkKDEwMDApLCAncicpCisKKyAgICBkZWYgX3Rlc3RfcmVhZGxpbmUoc2VsZiwgcHJveHkpOgorICAgICAgICAjIFJlYWQgYnkgbGluZQorICAgICAgICBwcm94eS5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmUoKSwgJ2ZvbycgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lKCksICdiYXInICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkbGluZSgpLCAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lKCksICdib2InKQorICAgICAgICBwcm94eS5zZWVrKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmUoKSwgJ28nICsgb3MubGluZXNlcCkKKyAgICAgICAgcHJveHkuc2Vlayg2ICsgMiAqIGxlbihvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkbGluZSgpLCAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lKDIpLCAnZnInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lKC0xMCksICdlZCcgKyBvcy5saW5lc2VwKQorCisgICAgZGVmIF90ZXN0X3JlYWRsaW5lcyhzZWxmLCBwcm94eSk6CisgICAgICAgICMgUmVhZCBtdWx0aXBsZSBsaW5lcworICAgICAgICBwcm94eS5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmVzKCksIFsnZm9vJyArIG9zLmxpbmVzZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiYXInICsgb3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZyZWQnICsgb3MubGluZXNlcCwgJ2JvYiddKQorICAgICAgICBwcm94eS5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZGxpbmVzKDIpLCBbJ2ZvbycgKyBvcy5saW5lc2VwXSkKKyAgICAgICAgcHJveHkuc2VlaygzICsgbGVuKG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lcyg0ICsgbGVuKG9zLmxpbmVzZXApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2JhcicgKyBvcy5saW5lc2VwLCAnZnJlZCcgKyBvcy5saW5lc2VwXSkKKyAgICAgICAgcHJveHkuc2VlaygzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWRsaW5lcygxMDAwKSwgW29zLmxpbmVzZXAsICdiYXInICsgb3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnJlZCcgKyBvcy5saW5lc2VwLCAnYm9iJ10pCisKKyAgICBkZWYgX3Rlc3RfaXRlcmF0aW9uKHNlbGYsIHByb3h5KToKKyAgICAgICAgIyBJdGVyYXRlIGJ5IGxpbmUKKyAgICAgICAgcHJveHkuc2VlaygwKQorICAgICAgICBpdGVyYXRvciA9IGl0ZXIocHJveHkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdGVyYXRvciksCisgICAgICAgICAgICBbJ2ZvbycgKyBvcy5saW5lc2VwLCAnYmFyJyArIG9zLmxpbmVzZXAsICdmcmVkJyArIG9zLmxpbmVzZXAsICdib2InXSkKKworICAgIGRlZiBfdGVzdF9zZWVrX2FuZF90ZWxsKHNlbGYsIHByb3h5KToKKyAgICAgICAgIyBTZWVrIGFuZCB1c2UgdGVsbCB0byBjaGVjayBwb3NpdGlvbgorICAgICAgICBwcm94eS5zZWVrKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkudGVsbCgpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQobGVuKG9zLmxpbmVzZXApKSwgb3MubGluZXNlcCkKKyAgICAgICAgcHJveHkuc2VlaygyLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQoMSArIGxlbihvcy5saW5lc2VwKSksICdyJyArIG9zLmxpbmVzZXApCisgICAgICAgIHByb3h5LnNlZWsoLTMgLSBsZW4ob3MubGluZXNlcCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkucmVhZCgzKSwgJ2JhcicpCisgICAgICAgIHByb3h5LnNlZWsoMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm94eS5yZWFkKCksICdvJyArIG9zLmxpbmVzZXAgKyAnYmFyJyArIG9zLmxpbmVzZXApCisgICAgICAgIHByb3h5LnNlZWsoMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5LnJlYWQoKSwgJycpCisKKyAgICBkZWYgX3Rlc3RfY2xvc2Uoc2VsZiwgcHJveHkpOgorICAgICAgICAjIENsb3NlIGEgZmlsZQorICAgICAgICBwcm94eS5jbG9zZSgpCisgICAgICAgICMgSXNzdWUgMTE3MDAgc3Vic2VxdWVudCBjbG9zZXMgc2hvdWxkIGJlIGEgbm8tb3AsIG5vdCBhbiBlcnJvci4KKyAgICAgICAgcHJveHkuY2xvc2UoKQorCisKK2NsYXNzIFRlc3RQcm94eUZpbGUoVGVzdFByb3h5RmlsZUJhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fcGF0aCA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5fZmlsZSA9IG9wZW4oc2VsZi5fcGF0aCwgJ3diKycpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUuY2xvc2UoKQorICAgICAgICBzZWxmLl9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZi5fcGF0aCkKKworICAgIGRlZiB0ZXN0X2luaXRpYWxpemUoc2VsZik6CisgICAgICAgICMgSW5pdGlhbGl6ZSBhbmQgY2hlY2sgcG9zaXRpb24KKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJykKKyAgICAgICAgcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgcHJveHkwID0gbWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkwLnRlbGwoKSwgcG9zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2ZpbGUudGVsbCgpLCBwb3MpCisgICAgICAgIHByb3h5MSA9IG1haWxib3guX1Byb3h5RmlsZShzZWxmLl9maWxlLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb3h5MS50ZWxsKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZmlsZS50ZWxsKCksIHBvcykKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2JhcicpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZChtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJXNiYXIlc2ZyZWQlc2JvYicgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmUobWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzZnJlZCVzYm9iJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZXMobWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisgICAgZGVmIHRlc3RfaXRlcmF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzZnJlZCVzYm9iJyAlIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9pdGVyYXRpb24obWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisgICAgZGVmIHRlc3Rfc2Vla19hbmRfdGVsbChzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJXNiYXIlcycgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3Rfc2Vla19hbmRfdGVsbChtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSkpCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJXNiYXIlcycgJSAob3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfY2xvc2UobWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpKQorCisKK2NsYXNzIFRlc3RQYXJ0aWFsRmlsZShUZXN0UHJveHlGaWxlQmFzZSwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl9wYXRoID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLl9maWxlID0gb3BlbihzZWxmLl9wYXRoLCAnd2IrJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYuX2RlbGV0ZV9yZWN1cnNpdmVseShzZWxmLl9wYXRoKQorCisgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZShzZWxmKToKKyAgICAgICAgIyBJbml0aWFsaXplIGFuZCBjaGVjayBwb3NpdGlvbgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28nICsgb3MubGluZXNlcCArICdiYXInKQorICAgICAgICBwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBwcm94eSA9IG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDIsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJveHkudGVsbCgpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2ZpbGUudGVsbCgpLCBwb3MpCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcqKipiYXIqKionKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWQobWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgMywgNikpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnISEhISFmb28lc2JhciVzZnJlZCVzYm9iISEhISEnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAob3MubGluZXNlcCwgb3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmUobWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOCArIDMgKiBsZW4ob3MubGluZXNlcCkpKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28lc2JhciVzZnJlZCVzYm9iPz8/Pz8nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAob3MubGluZXNlcCwgb3MubGluZXNlcCwgb3MubGluZXNlcCkpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmVzKG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzICsgMyAqIGxlbihvcy5saW5lc2VwKSkpCisKKyAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ19fX19mb28lc2JhciVzZnJlZCVzYm9iIyMjIycgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChvcy5saW5lc2VwLCBvcy5saW5lc2VwLCBvcy5saW5lc2VwKSkKKyAgICAgICAgc2VsZi5fdGVzdF9pdGVyYXRpb24obWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcgKyAzICogbGVuKG9zLmxpbmVzZXApKSkKKworICAgIGRlZiB0ZXN0X3NlZWtfYW5kX3RlbGwoc2VsZik6CisgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJygoKGZvbyVzYmFyJXMkJCQnICUgKG9zLmxpbmVzZXAsIG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLl90ZXN0X3NlZWtfYW5kX3RlbGwobWFpbGJveC5fUGFydGlhbEZpbGUoc2VsZi5fZmlsZSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkgKyAyICogbGVuKG9zLmxpbmVzZXApKSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9maWxlLndyaXRlKCcmZm9vJXNiYXIlc14nICUgKG9zLmxpbmVzZXAsIG9zLmxpbmVzZXApKQorICAgICAgICBzZWxmLl90ZXN0X2Nsb3NlKG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiArIDMgKiBsZW4ob3MubGluZXNlcCkpKQorCisKKyMjIFN0YXJ0OiB0ZXN0cyBmcm9tIHRoZSBvcmlnaW5hbCBtb2R1bGUgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KS4KKworRlJPTV8gPSAiRnJvbSBzb21lLmJvZHlAZHVtbXkuZG9tYWluICBTYXQgSnVsIDI0IDEzOjQzOjM1IDIwMDRcbiIKK0RVTU1ZX01FU1NBR0UgPSAiIiJcCitGcm9tOiBzb21lLmJvZHlAZHVtbXkuZG9tYWluCitUbzogbWVAbXkuZG9tYWluCitTdWJqZWN0OiBTaW1wbGUgVGVzdAorCitUaGlzIGlzIGEgZHVtbXkgbWVzc2FnZS4KKyIiIgorCitjbGFzcyBNYWlsZGlyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIGNyZWF0ZSBhIG5ldyBtYWlsZGlyIG1haWxib3ggdG8gd29yayB3aXRoOgorICAgICAgICBzZWxmLl9kaXIgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc2VsZi5fZGlyKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ybXRyZWUoc2VsZi5fZGlyKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLl9kaXIpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLl9kaXIpCisgICAgICAgIG9zLm1rZGlyKHNlbGYuX2RpcikKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgImN1ciIpKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAidG1wIikpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJuZXciKSkKKyAgICAgICAgc2VsZi5fY291bnRlciA9IDEKKyAgICAgICAgc2VsZi5fbXNnZmlsZXMgPSBbXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBtYXAob3MudW5saW5rLCBzZWxmLl9tc2dmaWxlcykKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJjdXIiKSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJ0bXAiKSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJuZXciKSkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJtZGlyKHNlbGYuX2RpcikKKworICAgIGRlZiBjcmVhdGVNZXNzYWdlKHNlbGYsIGRpciwgbWJveD1GYWxzZSk6CisgICAgICAgIHQgPSBpbnQodGltZS50aW1lKCkgJSAxMDAwMDAwKQorICAgICAgICBwaWQgPSBzZWxmLl9jb3VudGVyCisgICAgICAgIHNlbGYuX2NvdW50ZXIgKz0gMQorICAgICAgICBmaWxlbmFtZSA9IG9zLmV4dHNlcC5qb2luKChzdHIodCksIHN0cihwaWQpLCAibXlob3N0bmFtZSIsICJteWRvbWFpbiIpKQorICAgICAgICB0bXBuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RpciwgInRtcCIsIGZpbGVuYW1lKQorICAgICAgICBuZXduYW1lID0gb3MucGF0aC5qb2luKHNlbGYuX2RpciwgZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgd2l0aCBvcGVuKHRtcG5hbWUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICBzZWxmLl9tc2dmaWxlcy5hcHBlbmQodG1wbmFtZSkKKyAgICAgICAgICAgIGlmIG1ib3g6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoRlJPTV8pCisgICAgICAgICAgICBmcC53cml0ZShEVU1NWV9NRVNTQUdFKQorICAgICAgICBpZiBoYXNhdHRyKG9zLCAibGluayIpOgorICAgICAgICAgICAgb3MubGluayh0bXBuYW1lLCBuZXduYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd2l0aCBvcGVuKG5ld25hbWUsICJ3IikgYXMgZnA6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoRFVNTVlfTUVTU0FHRSkKKyAgICAgICAgc2VsZi5fbXNnZmlsZXMuYXBwZW5kKG5ld25hbWUpCisgICAgICAgIHJldHVybiB0bXBuYW1lCisKKyAgICBkZWYgdGVzdF9lbXB0eV9tYWlsZGlyKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGFuIGVtcHR5IG1haWxkaXIgbWFpbGJveCIiIgorICAgICAgICAjIFRlc3QgZm9yIHJlZ3Jlc3Npb24gb24gYnVnICMxMTc0OTA6CisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBib3hlcyBhdHRyaWJ1dGUgYWN0dWFsbHkgZ2V0cyBzZXQuCisgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc2VsZi5tYm94LCAiYm94ZXMiKSkKKyAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94LmJveGVzKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfY3VyKHNlbGYpOgorICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIpCisgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDEpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChtc2csIE5vbmUpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLm1ib3gubmV4dCgpLCBOb25lKQorCisgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9uZXcoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKKyAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKKyAgICAgICAgbXNnID0gc2VsZi5tYm94Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KG1zZywgTm9uZSkKKyAgICAgICAgbXNnLmZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhzZWxmLm1ib3gubmV4dCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX2JvdGgoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIikKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJuZXciKQorICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94LmJveGVzKSA9PSAyKQorICAgICAgICBtc2cgPSBzZWxmLm1ib3gubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QobXNnLCBOb25lKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBzZWxmLm1ib3gubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QobXNnLCBOb25lKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydElzKHNlbGYubWJveC5uZXh0KCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2VsZi5tYm94Lm5leHQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3VuaXhfbWJveChzZWxmKToKKyAgICAgICAgIyMjIHNob3VsZCBiZSBiZXR0ZXIhCisgICAgICAgIGltcG9ydCBlbWFpbC5wYXJzZXIKKyAgICAgICAgZm5hbWUgPSBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIsIFRydWUpCisgICAgICAgIG4gPSAwCisgICAgICAgIGZpZCA9IG9wZW4oZm5hbWUpCisgICAgICAgIGZvciBtc2cgaW4gbWFpbGJveC5Qb3J0YWJsZVVuaXhNYWlsYm94KGZpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWwucGFyc2VyLlBhcnNlcigpLnBhcnNlKToKKyAgICAgICAgICAgIG4gKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbInN1YmplY3QiXSwgIlNpbXBsZSBUZXN0IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN0cihtc2cpKSwgbGVuKEZST01fKStsZW4oRFVNTVlfTUVTU0FHRSkpCisgICAgICAgIGZpZC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgMSkKKworIyMgRW5kOiBjbGFzc2VzIGZyb20gdGhlIG9yaWdpbmFsIG1vZHVsZSAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLgorCisKK19zYW1wbGVfbWVzc2FnZSA9ICIiIlwKK1JldHVybi1QYXRoOiA8Z2tqQGdyZWdvcnlram9obnNvbi5jb20+CitYLU9yaWdpbmFsLVRvOiBna2orcGVyc29uQGxvY2FsaG9zdAorRGVsaXZlcmVkLVRvOiBna2orcGVyc29uQGxvY2FsaG9zdAorUmVjZWl2ZWQ6IGZyb20gbG9jYWxob3N0IChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pCisgICAgICAgIGJ5IGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCAzNTZFRDlERDE3CisgICAgICAgIGZvciA8Z2tqK3BlcnNvbkBsb2NhbGhvc3Q+OyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjE2IC0wNDAwIChFRFQpCitEZWxpdmVyZWQtVG86IGdrakBzdW5kYW5jZS5ncmVnb3J5a2pvaG5zb24uY29tCitSZWNlaXZlZDogZnJvbSBsb2NhbGhvc3QgWzEyNy4wLjAuMV0KKyAgICAgICAgYnkgbG9jYWxob3N0IHdpdGggUE9QMyAoZmV0Y2htYWlsLTYuMi41KQorICAgICAgICBmb3IgZ2tqK3BlcnNvbkBsb2NhbGhvc3QgKHNpbmdsZS1kcm9wKTsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxNiAtMDQwMCAoRURUKQorUmVjZWl2ZWQ6IGZyb20gYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIChhbmR5LmdyZWdvcnlram9obnNvbi5jb20gWzY0LjMyLjIzNS4yMjhdKQorICAgICAgICBieSBzdW5kYW5jZS5ncmVnb3J5a2pvaG5zb24uY29tIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIDVCMDU2MzE2NzQ2CisgICAgICAgIGZvciA8Z2tqQGdyZWdvcnlram9obnNvbi5jb20+OyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjExIC0wNDAwIChFRFQpCitSZWNlaXZlZDogYnkgYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIChQb3N0Zml4LCBmcm9tIHVzZXJpZCAxMDAwKQorICAgICAgICBpZCA0OTBDRDlERDE3OyBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjExIC0wNDAwIChFRFQpCitEYXRlOiBXZWQsIDEzIEp1bCAyMDA1IDE3OjIzOjExIC0wNDAwCitGcm9tOiAiR3JlZ29yeSBLLiBKb2huc29uIiA8Z2tqQGdyZWdvcnlram9obnNvbi5jb20+CitUbzogZ2tqQGdyZWdvcnlram9obnNvbi5jb20KK1N1YmplY3Q6IFNhbXBsZSBtZXNzYWdlCitNZXNzYWdlLUlEOiA8MjAwNTA3MTMyMTIzMTEuR0M0NzAxQGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbT4KK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ik5NdU16OW50MDV3ODBkNCsiCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmUKK1VzZXItQWdlbnQ6IE11dHQvMS41LjlpCisKKworLS1OTXVNejludDA1dzgwZDQrCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZQorCitUaGlzIGlzIGEgc2FtcGxlIG1lc3NhZ2UuCisKKy0tCitHcmVnb3J5IEsuIEpvaG5zb24KKworLS1OTXVNejludDA1dzgwZDQrCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9InRleHQuZ3oiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworSDRzSUNNMkQxVUlBQTNSbGVIUUFDOG5JTEZZQW9rU0ZrdFNLRW9XMHpKeFVQYTd3ekpJTWhaTHlmSVdjekx6VVlqMHVBSFRzCiszRllsQUFBQQorCistLU5NdU16OW50MDV3ODBkNCstLQorIiIiCisKK19zYW1wbGVfaGVhZGVycyA9IHsKKyAgICAiUmV0dXJuLVBhdGgiOiI8Z2tqQGdyZWdvcnlram9obnNvbi5jb20+IiwKKyAgICAiWC1PcmlnaW5hbC1UbyI6ImdraitwZXJzb25AbG9jYWxob3N0IiwKKyAgICAiRGVsaXZlcmVkLVRvIjoiZ2tqK3BlcnNvbkBsb2NhbGhvc3QiLAorICAgICJSZWNlaXZlZCI6IiIiZnJvbSBsb2NhbGhvc3QgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSkKKyAgICAgICAgYnkgYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIDM1NkVEOUREMTcKKyAgICAgICAgZm9yIDxna2orcGVyc29uQGxvY2FsaG9zdD47IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTYgLTA0MDAgKEVEVCkiIiIsCisgICAgIkRlbGl2ZXJlZC1UbyI6ImdrakBzdW5kYW5jZS5ncmVnb3J5a2pvaG5zb24uY29tIiwKKyAgICAiUmVjZWl2ZWQiOiIiImZyb20gbG9jYWxob3N0IFsxMjcuMC4wLjFdCisgICAgICAgIGJ5IGxvY2FsaG9zdCB3aXRoIFBPUDMgKGZldGNobWFpbC02LjIuNSkKKyAgICAgICAgZm9yIGdraitwZXJzb25AbG9jYWxob3N0IChzaW5nbGUtZHJvcCk7IFdlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTYgLTA0MDAgKEVEVCkiIiIsCisgICAgIlJlY2VpdmVkIjoiIiJmcm9tIGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSAoYW5keS5ncmVnb3J5a2pvaG5zb24uY29tIFs2NC4zMi4yMzUuMjI4XSkKKyAgICAgICAgYnkgc3VuZGFuY2UuZ3JlZ29yeWtqb2huc29uLmNvbSAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCA1QjA1NjMxNjc0NgorICAgICAgICBmb3IgPGdrakBncmVnb3J5a2pvaG5zb24uY29tPjsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxMSAtMDQwMCAoRURUKSIiIiwKKyAgICAiUmVjZWl2ZWQiOiIiImJ5IGFuZHkuZ3JlZ29yeWtqb2huc29uLmNvbSAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgMTAwMCkKKyAgICAgICAgaWQgNDkwQ0Q5REQxNzsgV2VkLCAxMyBKdWwgMjAwNSAxNzoyMzoxMSAtMDQwMCAoRURUKSIiIiwKKyAgICAiRGF0ZSI6IldlZCwgMTMgSnVsIDIwMDUgMTc6MjM6MTEgLTA0MDAiLAorICAgICJGcm9tIjoiIiIiR3JlZ29yeSBLLiBKb2huc29uIiA8Z2tqQGdyZWdvcnlram9obnNvbi5jb20+IiIiLAorICAgICJUbyI6ImdrakBncmVnb3J5a2pvaG5zb24uY29tIiwKKyAgICAiU3ViamVjdCI6IlNhbXBsZSBtZXNzYWdlIiwKKyAgICAiTWltZS1WZXJzaW9uIjoiMS4wIiwKKyAgICAiQ29udGVudC1UeXBlIjoiIiJtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJOTXVNejludDA1dzgwZDQrXCIiIiIsCisgICAgIkNvbnRlbnQtRGlzcG9zaXRpb24iOiJpbmxpbmUiLAorICAgICJVc2VyLUFnZW50IjogIk11dHQvMS41LjlpIiB9CisKK19zYW1wbGVfcGF5bG9hZHMgPSAoIiIiVGhpcyBpcyBhIHNhbXBsZSBtZXNzYWdlLgorCistLQorR3JlZ29yeSBLLiBKb2huc29uCisiIiIsCisiIiJINHNJQ00yRDFVSUFBM1JsZUhRQUM4bklMRllBb2tTRmt0U0tFb1cwekp4VVBhN3d6SklNaFpMeWZJV2N6THpVWWowdUFIVHMKKzNGWWxBQUFBCisiIiIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gKFRlc3RNYWlsYm94U3VwZXJjbGFzcywgVGVzdE1haWxkaXIsIFRlc3RNYm94LCBUZXN0TU1ERiwgVGVzdE1ILAorICAgICAgICAgICAgIFRlc3RCYWJ5bCwgVGVzdE1lc3NhZ2UsIFRlc3RNYWlsZGlyTWVzc2FnZSwgVGVzdE1ib3hNZXNzYWdlLAorICAgICAgICAgICAgIFRlc3RNSE1lc3NhZ2UsIFRlc3RCYWJ5bE1lc3NhZ2UsIFRlc3RNTURGTWVzc2FnZSwKKyAgICAgICAgICAgICBUZXN0TWVzc2FnZUNvbnZlcnNpb24sIFRlc3RQcm94eUZpbGUsIFRlc3RQYXJ0aWFsRmlsZSwKKyAgICAgICAgICAgICBNYWlsZGlyVGVzdENhc2UpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21haWxib3gucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNTM2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21haWxib3gucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21haWxib3gucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFpbGJveC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFjNTM2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21haWxib3gucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hcnNoYWwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXJzaGFsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZThlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXJzaGFsLnB5CkBAIC0wLDAgKzEsMzMyIEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworCitjbGFzcyBJbnRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSBmdWxsIHJhbmdlIG9mIFB5dGhvbiBpbnRzLgorICAgICAgICBuID0gc3lzLm1heGludAorICAgICAgICB3aGlsZSBuOgorICAgICAgICAgICAgZm9yIGV4cGVjdGVkIGluICgtbiwgbik6CisgICAgICAgICAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgICAgICBtYXJzaGFsLmR1bXAoZXhwZWN0ZWQsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgZ290KQorICAgICAgICAgICAgbiA9IG4gPj4gMQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2ludDY0KHNlbGYpOgorICAgICAgICAjIFNpbXVsYXRlIGludCBtYXJzaGFsaW5nIG9uIGEgNjQtYml0IGJveC4gIFRoaXMgaXMgbW9zdCBpbnRlcmVzdGluZyBpZgorICAgICAgICAjIHdlJ3JlIHJ1bm5pbmcgdGhlIHRlc3Qgb24gYSAzMi1iaXQgYm94LCBvZiBjb3Vyc2UuCisKKyAgICAgICAgZGVmIHRvX2xpdHRsZV9lbmRpYW5fc3RyaW5nKHZhbHVlLCBuYnl0ZXMpOgorICAgICAgICAgICAgYnl0ZXMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobmJ5dGVzKToKKyAgICAgICAgICAgICAgICBieXRlcy5hcHBlbmQoY2hyKHZhbHVlICYgMHhmZikpCisgICAgICAgICAgICAgICAgdmFsdWUgPj49IDgKKyAgICAgICAgICAgIHJldHVybiAnJy5qb2luKGJ5dGVzKQorCisgICAgICAgIG1heGludDY0ID0gKDFMIDw8IDYzKSAtIDEKKyAgICAgICAgbWluaW50NjQgPSAtbWF4aW50NjQtMQorCisgICAgICAgIGZvciBiYXNlIGluIG1heGludDY0LCBtaW5pbnQ2NCwgLW1heGludDY0LCAtKG1pbmludDY0ID4+IDEpOgorICAgICAgICAgICAgd2hpbGUgYmFzZToKKyAgICAgICAgICAgICAgICBzID0gJ0knICsgdG9fbGl0dGxlX2VuZGlhbl9zdHJpbmcoYmFzZSwgOCkKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCBnb3QpCisgICAgICAgICAgICAgICAgaWYgYmFzZSA9PSAtMTogICMgYSBmaXhlZC1wb2ludCBmb3Igc2hpZnRpbmcgcmlnaHQgMQorICAgICAgICAgICAgICAgICAgICBiYXNlID0gMAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJhc2UgPj49IDEKKworICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CisgICAgICAgIGZvciBiIGluIChUcnVlLCBGYWxzZSk6CisgICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIG5ldykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShiKSwgdHlwZShuZXcpKQorICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGIsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgbmV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGIpLCB0eXBlKG5ldykpCisKK2NsYXNzIEZsb2F0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2Zsb2F0cyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGEgZmV3IGZsb2F0cworICAgICAgICBzbWFsbCA9IDFlLTI1CisgICAgICAgIG4gPSBzeXMubWF4aW50ICogMy43ZTI1MAorICAgICAgICB3aGlsZSBuID4gc21hbGw6CisgICAgICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gKC1uLCBuKToKKyAgICAgICAgICAgICAgICBmID0gZmxvYXQoZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZikKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCisgICAgICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGYsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCisgICAgICAgICAgICBuIC89IDEyMy40NTY3CisKKyAgICAgICAgZiA9IDAuMAorICAgICAgICBzID0gbWFyc2hhbC5kdW1wcyhmLCAyKQorICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorICAgICAgICAjIGFuZCB3aXRoIHZlcnNpb24gPD0gMSAoZmxvYXRzIG1hcnNoYWxsZWQgZGlmZmVyZW50bHkgdGhlbikKKyAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZiwgMSkKKyAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKKworICAgICAgICBuID0gc3lzLm1heGludCAqIDMuN2UtMjUwCisgICAgICAgIHdoaWxlIG4gPCBzbWFsbDoKKyAgICAgICAgICAgIGZvciBleHBlY3RlZCBpbiAoLW4sIG4pOgorICAgICAgICAgICAgICAgIGYgPSBmbG9hdChleHBlY3RlZCkKKworICAgICAgICAgICAgICAgIHMgPSBtYXJzaGFsLmR1bXBzKGYpCisgICAgICAgICAgICAgICAgZ290ID0gbWFyc2hhbC5sb2FkcyhzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorCisgICAgICAgICAgICAgICAgcyA9IG1hcnNoYWwuZHVtcHMoZiwgMSkKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWRzKHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLCBnb3QpCisKKyAgICAgICAgICAgICAgICBtYXJzaGFsLmR1bXAoZiwgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgICAgICAgICBnb3QgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYsIGdvdCkKKworICAgICAgICAgICAgICAgIG1hcnNoYWwuZHVtcChmLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpLCAxKQorICAgICAgICAgICAgICAgIGdvdCA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZiwgZ290KQorICAgICAgICAgICAgbiAqPSAxMjMuNDU2NworICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgIGZvciBzIGluIFt1IiIsIHUiQW5kcuggUHJldmluIiwgdSJhYmMiLCB1IiAiKjEwMDAwXToKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHMpLCB0eXBlKG5ldykpCisgICAgICAgICAgICBtYXJzaGFsLmR1bXAocywgZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSkKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKKyAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgIGZvciBzIGluIFsiIiwgIkFuZHLoIFByZXZpbiIsICJhYmMiLCAiICIqMTAwMDBdOgorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBuZXcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocyksIHR5cGUobmV3KSkKKyAgICAgICAgICAgIG1hcnNoYWwuZHVtcChzLCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIG5ldykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzKSwgdHlwZShuZXcpKQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2J1ZmZlcihzZWxmKToKKyAgICAgICAgZm9yIHMgaW4gWyIiLCAiQW5kcuggUHJldmluIiwgImFiYyIsICIgIioxMDAwMF06CisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgICAgIGIgPSBidWZmZXIocykKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQorICAgICAgICAgICAgbWFyc2hhbC5kdW1wKGIsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgbmV3KQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworY2xhc3MgRXhjZXB0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhTdG9wSXRlcmF0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTdG9wSXRlcmF0aW9uLCBuZXcpCisKK2NsYXNzIENvZGVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfY29kZShzZWxmKToKKyAgICAgICAgY28gPSBFeGNlcHRpb25UZXN0Q2FzZS50ZXN0X2V4Y2VwdGlvbnMuZnVuY19jb2RlCisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhjbykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28sIG5ldykKKworY2xhc3MgQ29udGFpbmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGQgPSB7J2FzdHJpbmcnOiAnZm9vQGJhci5iYXouc3BhbScsCisgICAgICAgICAnYWZsb2F0JzogNzI4My40MywKKyAgICAgICAgICdhbmludCc6IDIqKjIwLAorICAgICAgICAgJ2FzaG9ydGxvbmcnOiAyTCwKKyAgICAgICAgICdhbGlzdCc6IFsnLnp5eC40MSddLAorICAgICAgICAgJ2F0dXBsZSc6ICgnLnp5eC40MScsKSoxMCwKKyAgICAgICAgICdhYm9vbGVhbic6IEZhbHNlLAorICAgICAgICAgJ2F1bmljb2RlJzogdSJBbmRy6CBQcmV2aW4iCisgICAgICAgICB9CisgICAgZGVmIHRlc3RfZGljdChzZWxmKToKKyAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kLCBuZXcpCisgICAgICAgIG1hcnNoYWwuZHVtcChzZWxmLmQsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZChmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZCwgbmV3KQorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2xpc3Qoc2VsZik6CisgICAgICAgIGxzdCA9IHNlbGYuZC5pdGVtcygpCisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyhsc3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgbmV3KQorICAgICAgICBtYXJzaGFsLmR1bXAobHN0LCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIG5ldykKKyAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgdCA9IHR1cGxlKHNlbGYuZC5rZXlzKCkpCisgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyh0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCisgICAgICAgIG1hcnNoYWwuZHVtcCh0LCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQorICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCisgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3Rfc2V0cyhzZWxmKToKKyAgICAgICAgZm9yIGNvbnN0cnVjdG9yIGluIChzZXQsIGZyb3plbnNldCk6CisgICAgICAgICAgICB0ID0gY29uc3RydWN0b3Ioc2VsZi5kLmtleXMoKSkKKyAgICAgICAgICAgIG5ldyA9IG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyh0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgbmV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobmV3LCBjb25zdHJ1Y3RvcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHQpLCBpZChuZXcpKQorICAgICAgICAgICAgbWFyc2hhbC5kdW1wKHQsIGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikpCisgICAgICAgICAgICBuZXcgPSBtYXJzaGFsLmxvYWQoZmlsZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgbmV3KQorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKK2NsYXNzIEJ1Z3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYnVnXzU4ODg0NTIoc2VsZik6CisgICAgICAgICMgU2ltcGxlLW1pbmRlZCBjaGVjayBmb3IgU0YgNTg4NDUyOiBEZWJ1ZyBidWlsZCBjcmFzaGVzCisgICAgICAgIG1hcnNoYWwuZHVtcHMoWzEyOF0gKiAxMDAwKQorCisgICAgZGVmIHRlc3RfcGF0Y2hfODczMjI0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIG1hcnNoYWwubG9hZHMsICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uLCBtYXJzaGFsLmxvYWRzLCAnZicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbiwgbWFyc2hhbC5sb2FkcywgbWFyc2hhbC5kdW1wcyg1TClbOi0xXSkKKworICAgIGRlZiB0ZXN0X3ZlcnNpb25fYXJndW1lbnQoc2VsZik6CisgICAgICAgICMgUHl0aG9uIDIuNC4wIGNyYXNoZXMgZm9yIGFueSBjYWxsIHRvIG1hcnNoYWwuZHVtcHMoeCwgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXJzaGFsLmxvYWRzKG1hcnNoYWwuZHVtcHMoNSwgMCkpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcnNoYWwubG9hZHMobWFyc2hhbC5kdW1wcyg1LCAxKSksIDUpCisKKyAgICBkZWYgdGVzdF9mdXp6KHNlbGYpOgorICAgICAgICAjIHNpbXBsZSB0ZXN0IHRoYXQgaXQncyBhdCBsZWFzdCBub3QgKnRvdGFsbHkqIHRyaXZpYWwgdG8KKyAgICAgICAgIyBjcmFzaCBmcm9tIGJhZCBtYXJzaGFsIGRhdGEKKyAgICAgICAgZm9yIGMgaW4gW2NocihpKSBmb3IgaSBpbiByYW5nZSgyNTYpXToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtYXJzaGFsLmxvYWRzKGMpCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2xvYWRzX3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgcyA9ICdjJyArICgnWCcgKiA0KjQpICsgJ3snICogMioqMjAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5sb2FkcywgcykKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2lvbl9saW1pdChzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBkZWVwbHkgbmVzdGVkIHN0cnVjdHVyZS4KKyAgICAgICAgaGVhZCA9IGxhc3QgPSBbXQorICAgICAgICAjIFRoZSBtYXggc3RhY2sgZGVwdGggc2hvdWxkIG1hdGNoIHRoZSB2YWx1ZSBpbiBQeXRob24vbWFyc2hhbC5jLgorICAgICAgICBNQVhfTUFSU0hBTF9TVEFDS19ERVBUSCA9IDIwMDAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTUFYX01BUlNIQUxfU1RBQ0tfREVQVEggLSAyKToKKyAgICAgICAgICAgIGxhc3QuYXBwZW5kKFswXSkKKyAgICAgICAgICAgIGxhc3QgPSBsYXN0Wy0xXQorCisgICAgICAgICMgVmVyaWZ5IHdlIGRvbid0IGJsb3cgb3V0IHRoZSBzdGFjayB3aXRoIGR1bXBzL2xvYWQuCisgICAgICAgIGRhdGEgPSBtYXJzaGFsLmR1bXBzKGhlYWQpCisgICAgICAgIG5ld19oZWFkID0gbWFyc2hhbC5sb2FkcyhkYXRhKQorICAgICAgICAjIERvbid0IHVzZSA9PSB0byBjb21wYXJlIG9iamVjdHMsIGl0IGNhbiBleGNlZWQgdGhlIHJlY3Vyc2lvbiBsaW1pdC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmV3X2hlYWQpLCBsZW4oaGVhZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG5ld19oZWFkWzBdKSwgbGVuKGhlYWRbMF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuZXdfaGVhZFstMV0pLCBsZW4oaGVhZFstMV0pKQorCisgICAgICAgIGxhc3QuYXBwZW5kKFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5kdW1wcywgaGVhZCkKKworICAgIGRlZiB0ZXN0X2V4YWN0X3R5cGVfbWF0Y2goc2VsZik6CisgICAgICAgICMgRm9ybWVyIGJ1ZzoKKyAgICAgICAgIyAgID4+PiBjbGFzcyBJbnQoaW50KTogcGFzcworICAgICAgICAjICAgPj4+IHR5cGUobG9hZHMoZHVtcHMoSW50KCkpKSkKKyAgICAgICAgIyAgIDx0eXBlICdpbnQnPgorICAgICAgICBmb3IgdHlwIGluIChpbnQsIGxvbmcsIGZsb2F0LCBjb21wbGV4LCB0dXBsZSwgbGlzdCwgZGljdCwgc2V0LCBmcm96ZW5zZXQpOgorICAgICAgICAgICAgIyBOb3RlOiBzdHIgYW5kIHVuaWNvZGUgc3ViY2xhc3NlcyBhcmUgbm90IHRlc3RlZCBiZWNhdXNlIHRoZXkgZ2V0IGhhbmRsZWQKKyAgICAgICAgICAgICMgYnkgbWFyc2hhbCdzIHJvdXRpbmVzIGZvciBvYmplY3RzIHN1cHBvcnRpbmcgdGhlIGJ1ZmZlciBBUEkuCisgICAgICAgICAgICBzdWJ0eXAgPSB0eXBlKCdzdWJ0eXAnLCAodHlwLCksIHt9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWFyc2hhbC5kdW1wcywgc3VidHlwKCkpCisKKyAgICAjIElzc3VlICMxNzkyIGludHJvZHVjZWQgYSBjaGFuZ2UgaW4gaG93IG1hcnNoYWwgaW5jcmVhc2VzIHRoZSBzaXplIG9mIGl0cworICAgICMgaW50ZXJuYWwgYnVmZmVyOyB0aGlzIHRlc3QgZW5zdXJlcyB0aGF0IHRoZSBuZXcgY29kZSBpcyBleGVyY2lzZWQuCisgICAgZGVmIHRlc3RfbGFyZ2VfbWFyc2hhbChzZWxmKToKKyAgICAgICAgc2l6ZSA9IGludCgxZTYpCisgICAgICAgIHRlc3RTdHJpbmcgPSAnYWJjJyAqIHNpemUKKyAgICAgICAgbWFyc2hhbC5kdW1wcyh0ZXN0U3RyaW5nKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9sb25ncyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjNzAxOTogbWFyc2hhbC5sb2FkcyBzaG91bGRuJ3QgcHJvZHVjZSB1bm5vcm1hbGl6ZWQgUHlMb25ncworICAgICAgICBpbnZhbGlkX3N0cmluZyA9ICdsXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hcnNoYWwubG9hZHMsIGludmFsaWRfc3RyaW5nKQorCitMQVJHRV9TSVpFID0gMioqMzEKK2NoYXJhY3Rlcl9zaXplID0gNCBpZiBzeXMubWF4dW5pY29kZSA+IDB4RkZGRiBlbHNlIDIKK3BvaW50ZXJfc2l6ZSA9IDggaWYgc3lzLm1heHNpemUgPiAweEZGRkZGRkZGIGVsc2UgNAorCitAdW5pdHRlc3Quc2tpcElmKExBUkdFX1NJWkUgPiBzeXMubWF4c2l6ZSwgInRlc3QgY2Fubm90IHJ1biBvbiAzMi1iaXQgc3lzdGVtcyIpCitjbGFzcyBMYXJnZVZhbHVlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY2hlY2tfdW5tYXJzaGFsbGFibGUoc2VsZiwgZGF0YSk6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3YicpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X3N1cHBvcnQudW5saW5rLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICB3aXRoIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXJzaGFsLmR1bXAsIGRhdGEsIGYpCisKKyAgICBAdGVzdF9zdXBwb3J0LnByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1MQVJHRV9TSVpFLCBtZW11c2U9MSwgZHJ5X3J1bj1GYWxzZSkKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuY2hlY2tfdW5tYXJzaGFsbGFibGUoJ3gnICogc2l6ZSkKKworICAgIEB0ZXN0X3N1cHBvcnQucHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPUxBUkdFX1NJWkUsCisgICAgICAgICAgICBtZW11c2U9Y2hhcmFjdGVyX3NpemUsIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5jaGVja191bm1hcnNoYWxsYWJsZSh1J3gnICogc2l6ZSkKKworICAgIEB0ZXN0X3N1cHBvcnQucHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPUxBUkdFX1NJWkUsCisgICAgICAgICAgICBtZW11c2U9cG9pbnRlcl9zaXplLCBkcnlfcnVuPUZhbHNlKQorICAgIGRlZiB0ZXN0X3R1cGxlKHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKChOb25lLCkgKiBzaXplKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwKKyAgICAgICAgICAgIG1lbXVzZT1wb2ludGVyX3NpemUsIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfbGlzdChzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5jaGVja191bm1hcnNoYWxsYWJsZShbTm9uZV0gKiBzaXplKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwKKyAgICAgICAgICAgIG1lbXVzZT1wb2ludGVyX3NpemUqMTIgKyBzeXMuZ2V0c2l6ZW9mKExBUkdFX1NJWkUtMSksCisgICAgICAgICAgICBkcnlfcnVuPUZhbHNlKQorICAgIGRlZiB0ZXN0X3NldChzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5jaGVja191bm1hcnNoYWxsYWJsZShzZXQocmFuZ2Uoc2l6ZSkpKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwKKyAgICAgICAgICAgIG1lbXVzZT1wb2ludGVyX3NpemUqMTIgKyBzeXMuZ2V0c2l6ZW9mKExBUkdFX1NJWkUtMSksCisgICAgICAgICAgICBkcnlfcnVuPUZhbHNlKQorICAgIGRlZiB0ZXN0X2Zyb3plbnNldChzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5jaGVja191bm1hcnNoYWxsYWJsZShmcm96ZW5zZXQocmFuZ2Uoc2l6ZSkpKQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9TEFSR0VfU0laRSwgbWVtdXNlPTEsIGRyeV9ydW49RmFsc2UpCisgICAgZGVmIHRlc3RfYnl0ZWFycmF5KHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLmNoZWNrX3VubWFyc2hhbGxhYmxlKGJ5dGVhcnJheShzaXplKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChJbnRUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0VGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lclRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWdzVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXJnZVZhbHVlc1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hcnNoYWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFyc2hhbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3MmQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hcnNoYWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hcnNoYWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWFyc2hhbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU3MmQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hcnNoYWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hdGgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjNDQ3NWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tYXRoLnB5CkBAIC0wLDAgKzEsMTAzMCBAQAorIyBQeXRob24gdGVzdCBzZXQgLS0gbWF0aCBtb2R1bGUKKyMgWFhYWCBTaG91bGQgbm90IGRvIHRlc3RzIGFyb3VuZCB6ZXJvIG9ubHkKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCB2ZXJib3NlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBtYXRoCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByYW5kb20KK2ltcG9ydCBzdHJ1Y3QKKworZXBzID0gMUUtMDUKK05BTiA9IGZsb2F0KCduYW4nKQorSU5GID0gZmxvYXQoJ2luZicpCitOSU5GID0gZmxvYXQoJy1pbmYnKQorCisjIGRlY29yYXRvciBmb3Igc2tpcHBpbmcgdGVzdHMgb24gbm9uLUlFRUUgNzU0IHBsYXRmb3JtcworcmVxdWlyZXNfSUVFRV83NTQgPSB1bml0dGVzdC5za2lwVW5sZXNzKAorICAgIGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKSwKKyAgICAidGVzdCByZXF1aXJlcyBJRUVFIDc1NCBkb3VibGVzIikKKworIyBkZXRlY3QgZXZpZGVuY2Ugb2YgZG91YmxlLXJvdW5kaW5nOiBmc3VtIGlzIG5vdCBhbHdheXMgY29ycmVjdGx5CisjIHJvdW5kZWQgb24gbWFjaGluZXMgdGhhdCBzdWZmZXIgZnJvbSBkb3VibGUgcm91bmRpbmcuCit4LCB5ID0gMWUxNiwgMi45OTk5ICMgdXNlIHRlbXBvcmFyeSB2YWx1ZXMgdG8gZGVmZWF0IHBlZXBob2xlIG9wdGltaXplcgorSEFWRV9ET1VCTEVfUk9VTkRJTkcgPSAoeCArIHkgPT0gMWUxNiArIDQpCisKKyMgbG9jYXRlIGZpbGUgd2l0aCB0ZXN0IHZhbHVlcworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBmaWxlID0gc3lzLmFyZ3ZbMF0KK2Vsc2U6CisgICAgZmlsZSA9IF9fZmlsZV9fCit0ZXN0X2RpciA9IG9zLnBhdGguZGlybmFtZShmaWxlKSBvciBvcy5jdXJkaXIKK21hdGhfdGVzdGNhc2VzID0gb3MucGF0aC5qb2luKHRlc3RfZGlyLCAnbWF0aF90ZXN0Y2FzZXMudHh0JykKK3Rlc3RfZmlsZSA9IG9zLnBhdGguam9pbih0ZXN0X2RpciwgJ2NtYXRoX3Rlc3RjYXNlcy50eHQnKQorCitkZWYgdG9fdWxwcyh4KToKKyAgICAiIiJDb252ZXJ0IGEgbm9uLU5hTiBmbG9hdCB4IHRvIGFuIGludGVnZXIsIGluIHN1Y2ggYSB3YXkgdGhhdAorICAgIGFkamFjZW50IGZsb2F0cyBhcmUgY29udmVydGVkIHRvIGFkamFjZW50IGludGVnZXJzLiAgVGhlbgorICAgIGFicyh1bHBzKHgpIC0gdWxwcyh5KSkgZ2l2ZXMgdGhlIGRpZmZlcmVuY2UgaW4gdWxwcyBiZXR3ZWVuIHR3bworICAgIGZsb2F0cy4KKworICAgIFRoZSByZXN1bHRzIGZyb20gdGhpcyBmdW5jdGlvbiB3aWxsIG9ubHkgbWFrZSBzZW5zZSBvbiBwbGF0Zm9ybXMKKyAgICB3aGVyZSBDIGRvdWJsZXMgYXJlIHJlcHJlc2VudGVkIGluIElFRUUgNzU0IGJpbmFyeTY0IGZvcm1hdC4KKworICAgICIiIgorICAgIG4gPSBzdHJ1Y3QudW5wYWNrKCc8cScsIHN0cnVjdC5wYWNrKCc8ZCcsIHgpKVswXQorICAgIGlmIG4gPCAwOgorICAgICAgICBuID0gfihuKzIqKjYzKQorICAgIHJldHVybiBuCisKK2RlZiB1bHBzX2NoZWNrKGV4cGVjdGVkLCBnb3QsIHVscHM9MjApOgorICAgICIiIkdpdmVuIG5vbi1OYU4gZmxvYXRzIGBleHBlY3RlZGAgYW5kIGBnb3RgLAorICAgIGNoZWNrIHRoYXQgdGhleSdyZSBlcXVhbCB0byB3aXRoaW4gdGhlIGdpdmVuIG51bWJlciBvZiB1bHBzLgorCisgICAgUmV0dXJucyBOb25lIG9uIHN1Y2Nlc3MgYW5kIGFuIGVycm9yIG1lc3NhZ2Ugb24gZmFpbHVyZS4iIiIKKworICAgIHVscHNfZXJyb3IgPSB0b191bHBzKGdvdCkgLSB0b191bHBzKGV4cGVjdGVkKQorICAgIGlmIGFicyh1bHBzX2Vycm9yKSA8PSB1bHBzOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiAiZXJyb3IgPSB7fSB1bHBzOyBwZXJtaXR0ZWQgZXJyb3IgPSB7fSB1bHBzIi5mb3JtYXQodWxwc19lcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVscHMpCisKK2RlZiBhY2NfY2hlY2soZXhwZWN0ZWQsIGdvdCwgcmVsX2Vycj0yZS0xNSwgYWJzX2VyciA9IDVlLTMyMyk6CisgICAgIiIiRGV0ZXJtaW5lIHdoZXRoZXIgbm9uLU5hTiBmbG9hdHMgYSBhbmQgYiBhcmUgZXF1YWwgdG8gd2l0aGluIGEKKyAgICAoc21hbGwpIHJvdW5kaW5nIGVycm9yLiAgVGhlIGRlZmF1bHQgdmFsdWVzIGZvciByZWxfZXJyIGFuZAorICAgIGFic19lcnIgYXJlIGNob3NlbiB0byBiZSBzdWl0YWJsZSBmb3IgcGxhdGZvcm1zIHdoZXJlIGEgZmxvYXQgaXMKKyAgICByZXByZXNlbnRlZCBieSBhbiBJRUVFIDc1NCBkb3VibGUuICBUaGV5IGFsbG93IGFuIGVycm9yIG9mIGJldHdlZW4KKyAgICA5IGFuZCAxOSB1bHBzLiIiIgorCisgICAgIyBuZWVkIHRvIHNwZWNpYWwgY2FzZSBpbmZpbml0aWVzLCBzaW5jZSBpbmYgLSBpbmYgZ2l2ZXMgbmFuCisgICAgaWYgbWF0aC5pc2luZihleHBlY3RlZCkgYW5kIGdvdCA9PSBleHBlY3RlZDoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGVycm9yID0gZ290IC0gZXhwZWN0ZWQKKworICAgIHBlcm1pdHRlZF9lcnJvciA9IG1heChhYnNfZXJyLCByZWxfZXJyICogYWJzKGV4cGVjdGVkKSkKKyAgICBpZiBhYnMoZXJyb3IpIDwgcGVybWl0dGVkX2Vycm9yOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIHJldHVybiAiZXJyb3IgPSB7fTsgcGVybWl0dGVkIGVycm9yID0ge30iLmZvcm1hdChlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybWl0dGVkX2Vycm9yKQorCitkZWYgcGFyc2VfbXRlc3RmaWxlKGZuYW1lKToKKyAgICAiIiJQYXJzZSBhIGZpbGUgd2l0aCB0ZXN0IHZhbHVlcworCisgICAgLS0gc3RhcnRzIGEgY29tbWVudAorICAgIGJsYW5rIGxpbmVzLCBvciBsaW5lcyBjb250YWluaW5nIG9ubHkgYSBjb21tZW50LCBhcmUgaWdub3JlZAorICAgIG90aGVyIGxpbmVzIGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBmb3JtCisgICAgICBpZCBmbiBhcmcgLT4gZXhwZWN0ZWQgW2ZsYWddKgorCisgICAgIiIiCisgICAgd2l0aCBvcGVuKGZuYW1lKSBhcyBmcDoKKyAgICAgICAgZm9yIGxpbmUgaW4gZnA6CisgICAgICAgICAgICAjIHN0cmlwIGNvbW1lbnRzLCBhbmQgc2tpcCBibGFuayBsaW5lcworICAgICAgICAgICAgaWYgJy0tJyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzpsaW5lLmluZGV4KCctLScpXQorICAgICAgICAgICAgaWYgbm90IGxpbmUuc3RyaXAoKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBsaHMsIHJocyA9IGxpbmUuc3BsaXQoJy0+JykKKyAgICAgICAgICAgIGlkLCBmbiwgYXJnID0gbGhzLnNwbGl0KCkKKyAgICAgICAgICAgIHJoc19waWVjZXMgPSByaHMuc3BsaXQoKQorICAgICAgICAgICAgZXhwID0gcmhzX3BpZWNlc1swXQorICAgICAgICAgICAgZmxhZ3MgPSByaHNfcGllY2VzWzE6XQorCisgICAgICAgICAgICB5aWVsZCAoaWQsIGZuLCBmbG9hdChhcmcpLCBmbG9hdChleHApLCBmbGFncykKKworZGVmIHBhcnNlX3Rlc3RmaWxlKGZuYW1lKToKKyAgICAiIiJQYXJzZSBhIGZpbGUgd2l0aCB0ZXN0IHZhbHVlcworCisgICAgRW1wdHkgbGluZXMgb3IgbGluZXMgc3RhcnRpbmcgd2l0aCAtLSBhcmUgaWdub3JlZAorICAgIHlpZWxkcyBpZCwgZm4sIGFyZ19yZWFsLCBhcmdfaW1hZywgZXhwX3JlYWwsIGV4cF9pbWFnCisgICAgIiIiCisgICAgd2l0aCBvcGVuKGZuYW1lKSBhcyBmcDoKKyAgICAgICAgZm9yIGxpbmUgaW4gZnA6CisgICAgICAgICAgICAjIHNraXAgY29tbWVudCBsaW5lcyBhbmQgYmxhbmsgbGluZXMKKyAgICAgICAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnLS0nKSBvciBub3QgbGluZS5zdHJpcCgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGxocywgcmhzID0gbGluZS5zcGxpdCgnLT4nKQorICAgICAgICAgICAgaWQsIGZuLCBhcmdfcmVhbCwgYXJnX2ltYWcgPSBsaHMuc3BsaXQoKQorICAgICAgICAgICAgcmhzX3BpZWNlcyA9IHJocy5zcGxpdCgpCisgICAgICAgICAgICBleHBfcmVhbCwgZXhwX2ltYWcgPSByaHNfcGllY2VzWzBdLCByaHNfcGllY2VzWzFdCisgICAgICAgICAgICBmbGFncyA9IHJoc19waWVjZXNbMjpdCisKKyAgICAgICAgICAgIHlpZWxkIChpZCwgZm4sCisgICAgICAgICAgICAgICAgICAgZmxvYXQoYXJnX3JlYWwpLCBmbG9hdChhcmdfaW1hZyksCisgICAgICAgICAgICAgICAgICAgZmxvYXQoZXhwX3JlYWwpLCBmbG9hdChleHBfaW1hZyksCisgICAgICAgICAgICAgICAgICAgZmxhZ3MKKyAgICAgICAgICAgICAgICAgICkKKworY2xhc3MgTWF0aFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBmdGVzdChzZWxmLCBuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpOgorICAgICAgICBpZiBhYnModmFsdWUtZXhwZWN0ZWQpID4gZXBzOgorICAgICAgICAgICAgIyBVc2UgJXIgaW5zdGVhZCBvZiAlZiBzbyB0aGUgZXJyb3IgbWVzc2FnZQorICAgICAgICAgICAgIyBkaXNwbGF5cyBmdWxsIHByZWNpc2lvbi4gT3RoZXJ3aXNlIGRpc2NyZXBhbmNpZXMKKyAgICAgICAgICAgICMgaW4gdGhlIGxhc3QgZmV3IGJpdHMgd2lsbCBsZWFkIHRvIHZlcnkgY29uZnVzaW5nCisgICAgICAgICAgICAjIGVycm9yIG1lc3NhZ2VzCisgICAgICAgICAgICBzZWxmLmZhaWwoJyVzIHJldHVybmVkICVyLCBleHBlY3RlZCAlcicgJQorICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCB2YWx1ZSwgZXhwZWN0ZWQpKQorCisgICAgZGVmIHRlc3RDb25zdGFudHMoc2VsZik6CisgICAgICAgIHNlbGYuZnRlc3QoJ3BpJywgbWF0aC5waSwgMy4xNDE1OTI2KQorICAgICAgICBzZWxmLmZ0ZXN0KCdlJywgbWF0aC5lLCAyLjcxODI4MTgpCisKKyAgICBkZWYgdGVzdEFjb3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hY29zKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKC0xKScsIG1hdGguYWNvcygtMSksIG1hdGgucGkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Fjb3MoMCknLCBtYXRoLmFjb3MoMCksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYWNvcygxKScsIG1hdGguYWNvcygxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYWNvcywgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hY29zKE5BTikpKQorCisgICAgZGVmIHRlc3RBY29zaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmFjb3NoKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zaCgxKScsIG1hdGguYWNvc2goMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2Fjb3NoKDIpJywgbWF0aC5hY29zaCgyKSwgMS4zMTY5NTc4OTY5MjQ4MTY4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3NoLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3NoLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmFjb3NoKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zaCwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hY29zaChOQU4pKSkKKworICAgIGRlZiB0ZXN0QXNpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmFzaW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ2FzaW4oLTEpJywgbWF0aC5hc2luKC0xKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigwKScsIG1hdGguYXNpbigwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigxKScsIG1hdGguYXNpbigxKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFzaW4sIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hc2luLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFzaW4oTkFOKSkpCisKKyAgICBkZWYgdGVzdEFzaW5oKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXNpbmgpCisgICAgICAgIHNlbGYuZnRlc3QoJ2FzaW5oKDApJywgbWF0aC5hc2luaCgwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXNpbmgoMSknLCBtYXRoLmFzaW5oKDEpLCAwLjg4MTM3MzU4NzAxOTU0MzA1KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luaCgtMSknLCBtYXRoLmFzaW5oKC0xKSwgLTAuODgxMzczNTg3MDE5NTQzMDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hc2luaChJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hc2luaChOSU5GKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hc2luaChOQU4pKSkKKworICAgIGRlZiB0ZXN0QXRhbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmF0YW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oLTEpJywgbWF0aC5hdGFuKC0xKSwgLW1hdGgucGkvNCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbigwKScsIG1hdGguYXRhbigwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbigxKScsIG1hdGguYXRhbigxKSwgbWF0aC5waS80KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKGluZiknLCBtYXRoLmF0YW4oSU5GKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKC1pbmYpJywgbWF0aC5hdGFuKE5JTkYpLCAtbWF0aC5waS8yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4oTkFOKSkpCisKKyAgICBkZWYgdGVzdEF0YW5oKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXRhbikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbmgoMCknLCBtYXRoLmF0YW5oKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuaCgwLjUpJywgbWF0aC5hdGFuaCgwLjUpLCAwLjU0OTMwNjE0NDMzNDA1NDg5KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuaCgtMC41KScsIG1hdGguYXRhbmgoLTAuNSksIC0wLjU0OTMwNjE0NDMzNDA1NDg5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmF0YW5oLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmF0YW5oLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hdGFuaCwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmF0YW5oLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW5oKE5BTikpKQorCisgICAgZGVmIHRlc3RBdGFuMihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmF0YW4yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMSwgMCknLCBtYXRoLmF0YW4yKC0xLCAwKSwgLW1hdGgucGkvMikKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTEsIDEpJywgbWF0aC5hdGFuMigtMSwgMSksIC1tYXRoLnBpLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDAsIDEpJywgbWF0aC5hdGFuMigwLCAxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMSwgMSknLCBtYXRoLmF0YW4yKDEsIDEpLCBtYXRoLnBpLzQpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDEsIDApJywgbWF0aC5hdGFuMigxLCAwKSwgbWF0aC5waS8yKQorCisgICAgICAgICMgbWF0aC5hdGFuMigwLCB4KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigwLiwgLWluZiknLCBtYXRoLmF0YW4yKDAuLCBOSU5GKSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoMC4sIC0yLjMpJywgbWF0aC5hdGFuMigwLiwgLTIuMyksIG1hdGgucGkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDAuLCAtMC4pJywgbWF0aC5hdGFuMigwLiwgLTAuKSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKDAuLCAwLiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMC4sIDIuMyksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMC4sIElORiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKDAuLCBOQU4pKSkKKyAgICAgICAgIyBtYXRoLmF0YW4yKC0wLCB4KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMC4sIC1pbmYpJywgbWF0aC5hdGFuMigtMC4sIE5JTkYpLCAtbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTAuLCAtMi4zKScsIG1hdGguYXRhbjIoLTAuLCAtMi4zKSwgLW1hdGgucGkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0wLiwgLTAuKScsIG1hdGguYXRhbjIoLTAuLCAtMC4pLCAtbWF0aC5waSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0wLiwgMC4pLCAtMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigtMC4sIDIuMyksIC0wLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0wLiwgSU5GKSwgLTAuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKC0wLiwgTkFOKSkpCisgICAgICAgICMgbWF0aC5hdGFuMihJTkYsIHgpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgLWluZiknLCBtYXRoLmF0YW4yKElORiwgTklORiksIG1hdGgucGkqMy80KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMihpbmYsIC0yLjMpJywgbWF0aC5hdGFuMihJTkYsIC0yLjMpLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgLTAuKScsIG1hdGguYXRhbjIoSU5GLCAtMC4wKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMihpbmYsIDAuKScsIG1hdGguYXRhbjIoSU5GLCAwLjApLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgMi4zKScsIG1hdGguYXRhbjIoSU5GLCAyLjMpLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgaW5mKScsIG1hdGguYXRhbjIoSU5GLCBJTkYpLCBtYXRoLnBpLzQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoSU5GLCBOQU4pKSkKKyAgICAgICAgIyBtYXRoLmF0YW4yKE5JTkYsIHgpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIC1pbmYpJywgbWF0aC5hdGFuMihOSU5GLCBOSU5GKSwgLW1hdGgucGkqMy80KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtaW5mLCAtMi4zKScsIG1hdGguYXRhbjIoTklORiwgLTIuMyksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIC0wLiknLCBtYXRoLmF0YW4yKE5JTkYsIC0wLjApLCAtbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtaW5mLCAwLiknLCBtYXRoLmF0YW4yKE5JTkYsIDAuMCksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIDIuMyknLCBtYXRoLmF0YW4yKE5JTkYsIDIuMyksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIGluZiknLCBtYXRoLmF0YW4yKE5JTkYsIElORiksIC1tYXRoLnBpLzQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTklORiwgTkFOKSkpCisgICAgICAgICMgbWF0aC5hdGFuMigrZmluaXRlLCB4KQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigyLjMsIC1pbmYpJywgbWF0aC5hdGFuMigyLjMsIE5JTkYpLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigyLjMsIC0wLiknLCBtYXRoLmF0YW4yKDIuMywgLTAuKSwgbWF0aC5waS8yKQorICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigyLjMsIDAuKScsIG1hdGguYXRhbjIoMi4zLCAwLiksIG1hdGgucGkvMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKDIuMywgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoMi4zLCBOQU4pKSkKKyAgICAgICAgIyBtYXRoLmF0YW4yKC1maW5pdGUsIHgpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0yLjMsIC1pbmYpJywgbWF0aC5hdGFuMigtMi4zLCBOSU5GKSwgLW1hdGgucGkpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0yLjMsIC0wLiknLCBtYXRoLmF0YW4yKC0yLjMsIC0wLiksIC1tYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC0yLjMsIDAuKScsIG1hdGguYXRhbjIoLTIuMywgMC4pLCAtbWF0aC5waS8yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoLTIuMywgSU5GKSwgLTAuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKC0yLjMsIE5BTikpKQorICAgICAgICAjIG1hdGguYXRhbjIoTkFOLCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgTklORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgLTIuMykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgLTAuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCAwLikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgMi4zKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCBJTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIE5BTikpKQorCisgICAgZGVmIHRlc3RDZWlsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY2VpbCkKKyAgICAgICAgIyBUaGVzZSB0eXBlcyB3aWxsIGJlIGludCBpbiBweTNrLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0LCB0eXBlKG1hdGguY2VpbCgxKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQsIHR5cGUobWF0aC5jZWlsKDFMKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQsIHR5cGUobWF0aC5jZWlsKDEuMCkpKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKDAuNSknLCBtYXRoLmNlaWwoMC41KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgxLjApJywgbWF0aC5jZWlsKDEuMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoMS41KScsIG1hdGguY2VpbCgxLjUpLCAyKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKC0wLjUpJywgbWF0aC5jZWlsKC0wLjUpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjZWlsKC0xLjApJywgbWF0aC5jZWlsKC0xLjApLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgtMS41KScsIG1hdGguY2VpbCgtMS41KSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jZWlsKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNlaWwoTklORiksIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY2VpbChOQU4pKSkKKworICAgICAgICBjbGFzcyBUZXN0Q2VpbChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZmxvYXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDEuMworICAgICAgICBjbGFzcyBUZXN0Tm9DZWlsKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuZnRlc3QoJ2NlaWwoVGVzdENlaWwoKSknLCBtYXRoLmNlaWwoVGVzdENlaWwoKSksIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY2VpbCwgVGVzdE5vQ2VpbCgpKQorCisgICAgICAgIHQgPSBUZXN0Tm9DZWlsKCkKKyAgICAgICAgdC5fX2NlaWxfXyA9IGxhbWJkYSAqYXJnczogYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguY2VpbCwgdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNlaWwsIHQsIDApCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBkZWYgdGVzdENvcHlzaWduKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oMSwgNDIpLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbigwLiwgNDIpLCAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbigxLiwgLTQyKSwgLTEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDMsIDAuKSwgMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oNC4sIC0wLiksIC00LjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvcHlzaWduKQorICAgICAgICAjIGNvcHlzaWduIHNob3VsZCBsZXQgdXMgZGlzdGluZ3Vpc2ggc2lnbnMgb2YgemVyb3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDEuLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oMS4sIC0wLiksIC0xLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKElORiwgMC4pLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbihJTkYsIC0wLiksIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbihOSU5GLCAwLiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKE5JTkYsIC0wLiksIE5JTkYpCisgICAgICAgICMgYW5kIG9mIGluZmluaXRpZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDEuLCBJTkYpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDEuLCBOSU5GKSwgLTEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oSU5GLCBJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbihJTkYsIE5JTkYpLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oTklORiwgSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29weXNpZ24oTklORiwgTklORiksIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29weXNpZ24oTkFOLCAxLikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcHlzaWduKE5BTiwgSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29weXNpZ24oTkFOLCBOSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29weXNpZ24oTkFOLCBOQU4pKSkKKyAgICAgICAgIyBjb3B5c2lnbihJTkYsIE5BTikgbWF5IGJlIElORiBvciBpdCBtYXkgYmUgTklORiwgc2luY2UKKyAgICAgICAgIyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHNpZ24gYml0IG9mIE5BTiBpcyBzZXQgb24gYW55CisgICAgICAgICMgZ2l2ZW4gcGxhdGZvcm0uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKG1hdGguY29weXNpZ24oSU5GLCBOQU4pKSkKKyAgICAgICAgIyBzaW1pbGFybHksIGNvcHlzaWduKDIuLCBOQU4pIGNvdWxkIGJlIDIuIG9yIC0yLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhtYXRoLmNvcHlzaWduKDIuLCBOQU4pKSwgMi4pCisKKyAgICBkZWYgdGVzdENvcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvcykKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKC1waS8yKScsIG1hdGguY29zKC1tYXRoLnBpLzIpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdjb3MoMCknLCBtYXRoLmNvcygwKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpLzIpJywgbWF0aC5jb3MobWF0aC5waS8yKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpKScsIG1hdGguY29zKG1hdGgucGkpLCAtMSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5jb3MoSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcyhOSU5GKSkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5jb3MsIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguY29zLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcyhOQU4pKSkKKworICAgIGRlZiB0ZXN0Q29zaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvc2gpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Nvc2goMCknLCBtYXRoLmNvc2goMCksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Nvc2goMiktMipjb3NoKDEpKioyJywgbWF0aC5jb3NoKDIpLTIqbWF0aC5jb3NoKDEpKioyLCAtMSkgIyBUaGFua3MgdG8gTGFtYmVydAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY29zaChJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3NoKE5JTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zaChOQU4pKSkKKworICAgIGRlZiB0ZXN0RGVncmVlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmRlZ3JlZXMpCisgICAgICAgIHNlbGYuZnRlc3QoJ2RlZ3JlZXMocGkpJywgbWF0aC5kZWdyZWVzKG1hdGgucGkpLCAxODAuMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZGVncmVlcyhwaS8yKScsIG1hdGguZGVncmVlcyhtYXRoLnBpLzIpLCA5MC4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCdkZWdyZWVzKC1waS80KScsIG1hdGguZGVncmVlcygtbWF0aC5waS80KSwgLTQ1LjApCisKKyAgICBkZWYgdGVzdEV4cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmV4cCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZXhwKC0xKScsIG1hdGguZXhwKC0xKSwgMS9tYXRoLmUpCisgICAgICAgIHNlbGYuZnRlc3QoJ2V4cCgwKScsIG1hdGguZXhwKDApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdleHAoMSknLCBtYXRoLmV4cCgxKSwgbWF0aC5lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZXhwKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmV4cChOSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZXhwKE5BTikpKQorCisgICAgZGVmIHRlc3RGYWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmFicykKKyAgICAgICAgc2VsZi5mdGVzdCgnZmFicygtMSknLCBtYXRoLmZhYnMoLTEpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmYWJzKDApJywgbWF0aC5mYWJzKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmYWJzKDEpJywgbWF0aC5mYWJzKDEpLCAxKQorCisgICAgZGVmIHRlc3RGYWN0b3JpYWwoc2VsZik6CisgICAgICAgIGRlZiBmYWN0KG4pOgorICAgICAgICAgICAgcmVzdWx0ID0gMQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgaW50KG4pKzEpOgorICAgICAgICAgICAgICAgIHJlc3VsdCAqPSBpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgICAgIHZhbHVlcyA9IHJhbmdlKDEwKSArIFs1MCwgMTAwLCA1MDBdCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKHZhbHVlcykKKyAgICAgICAgZm9yIHggaW4gdmFsdWVzOgorICAgICAgICAgICAgZm9yIGNhc3QgaW4gKGludCwgbG9uZywgZmxvYXQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mYWN0b3JpYWwoY2FzdCh4KSksIGZhY3QoeCksICh4LCBmYWN0KHgpLCBtYXRoLmZhY3RvcmlhbCh4KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguZmFjdG9yaWFsLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5mYWN0b3JpYWwsIG1hdGgucGkpCisKKyAgICBkZWYgdGVzdEZsb29yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmxvb3IpCisgICAgICAgICMgVGhlc2UgdHlwZXMgd2lsbCBiZSBpbnQgaW4gcHkzay4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCwgdHlwZShtYXRoLmZsb29yKDEpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCwgdHlwZShtYXRoLmZsb29yKDFMKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQsIHR5cGUobWF0aC5mbG9vcigxLjApKSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoMC41KScsIG1hdGguZmxvb3IoMC41KSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoMS4wKScsIG1hdGguZmxvb3IoMS4wKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoMS41KScsIG1hdGguZmxvb3IoMS41KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTAuNSknLCBtYXRoLmZsb29yKC0wLjUpLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTEuMCknLCBtYXRoLmZsb29yKC0xLjApLCAtMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTEuNSknLCBtYXRoLmZsb29yKC0xLjUpLCAtMikKKyAgICAgICAgIyBwb3coKSByZWxpZXMgb24gZmxvb3IoKSB0byBjaGVjayBmb3IgaW50ZWdlcnMKKyAgICAgICAgIyBUaGlzIGZhaWxzIG9uIHNvbWUgcGxhdGZvcm1zIC0gc28gY2hlY2sgaXQgaGVyZQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbG9vcigxLjIzZTE2NyknLCBtYXRoLmZsb29yKDEuMjNlMTY3KSwgMS4yM2UxNjcpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Zsb29yKC0xLjIzZTE2NyknLCBtYXRoLmZsb29yKC0xLjIzZTE2NyksIC0xLjIzZTE2NykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNlaWwoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguY2VpbChOSU5GKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5mbG9vcihOQU4pKSkKKworICAgICAgICBjbGFzcyBUZXN0Rmxvb3Iob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDQyLjMKKyAgICAgICAgY2xhc3MgVGVzdE5vRmxvb3Iob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoVGVzdEZsb29yKCkpJywgbWF0aC5mbG9vcihUZXN0Rmxvb3IoKSksIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmxvb3IsIFRlc3ROb0Zsb29yKCkpCisKKyAgICAgICAgdCA9IFRlc3ROb0Zsb29yKCkKKyAgICAgICAgdC5fX2Zsb29yX18gPSBsYW1iZGEgKmFyZ3M6IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZsb29yLCB0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguZmxvb3IsIHQsIDApCisKKyAgICBkZWYgdGVzdEZtb2Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5mbW9kKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKDEwLDEpJywgbWF0aC5mbW9kKDEwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdmbW9kKDEwLDAuNSknLCBtYXRoLmZtb2QoMTAsMC41KSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgxMCwxLjUpJywgbWF0aC5mbW9kKDEwLDEuNSksIDEpCisgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoLTEwLDEpJywgbWF0aC5mbW9kKC0xMCwxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMC41KScsIG1hdGguZm1vZCgtMTAsMC41KSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMS41KScsIG1hdGguZm1vZCgtMTAsMS41KSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZm1vZChOQU4sIDEuKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZm1vZCgxLiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZm1vZChOQU4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmZtb2QsIDEuLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5mbW9kLCBJTkYsIDEuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmZtb2QsIE5JTkYsIDEuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmZtb2QsIElORiwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mbW9kKDMuMCwgSU5GKSwgMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZm1vZCgtMy4wLCBJTkYpLCAtMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZm1vZCgzLjAsIE5JTkYpLCAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5mbW9kKC0zLjAsIE5JTkYpLCAtMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZm1vZCgwLjAsIDMuMCksIDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmZtb2QoMC4wLCBOSU5GKSwgMC4wKQorCisgICAgZGVmIHRlc3RGcmV4cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZyZXhwKQorCisgICAgICAgIGRlZiB0ZXN0ZnJleHAobmFtZSwgcmVzdWx0LCBleHBlY3RlZCk6CisgICAgICAgICAgICAobWFudCwgZXhwKSwgKGVtYW50LCBlZXhwKSA9IHJlc3VsdCwgZXhwZWN0ZWQKKyAgICAgICAgICAgIGlmIGFicyhtYW50LWVtYW50KSA+IGVwcyBvciBleHAgIT0gZWV4cDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJyVzIHJldHVybmVkICVyLCBleHBlY3RlZCAlciclXAorICAgICAgICAgICAgICAgICAgICAgICAgICAobmFtZSwgKG1hbnQsIGV4cCksIChlbWFudCxlZXhwKSkpCisKKyAgICAgICAgdGVzdGZyZXhwKCdmcmV4cCgtMSknLCBtYXRoLmZyZXhwKC0xKSwgKC0wLjUsIDEpKQorICAgICAgICB0ZXN0ZnJleHAoJ2ZyZXhwKDApJywgbWF0aC5mcmV4cCgwKSwgKDAsIDApKQorICAgICAgICB0ZXN0ZnJleHAoJ2ZyZXhwKDEpJywgbWF0aC5mcmV4cCgxKSwgKDAuNSwgMSkpCisgICAgICAgIHRlc3RmcmV4cCgnZnJleHAoMiknLCBtYXRoLmZyZXhwKDIpLCAoMC41LCAyKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZnJleHAoSU5GKVswXSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguZnJleHAoTklORilbMF0sIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZnJleHAoTkFOKVswXSkpCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBAdW5pdHRlc3Quc2tpcElmKEhBVkVfRE9VQkxFX1JPVU5ESU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICJmc3VtIGlzIG5vdCBleGFjdCBvbiBtYWNoaW5lcyB3aXRoIGRvdWJsZSByb3VuZGluZyIpCisgICAgZGVmIHRlc3RGc3VtKHNlbGYpOgorICAgICAgICAjIG1hdGguZnN1bSByZWxpZXMgb24gZXhhY3Qgcm91bmRpbmcgZm9yIGNvcnJlY3Qgb3BlcmF0aW9uLgorICAgICAgICAjIFRoZXJlJ3MgYSBrbm93biBwcm9ibGVtIHdpdGggSUEzMiBmbG9hdGluZy1wb2ludCB0aGF0IGNhdXNlcworICAgICAgICAjIGluZXhhY3Qgcm91bmRpbmcgaW4gc29tZSBzaXR1YXRpb25zLCBhbmQgd2lsbCBjYXVzZSB0aGUKKyAgICAgICAgIyBtYXRoLmZzdW0gdGVzdHMgYmVsb3cgdG8gZmFpbDsgc2VlIGlzc3VlICMyOTM3LiAgT24gbm9uIElFRUUKKyAgICAgICAgIyA3NTQgcGxhdGZvcm1zLCBhbmQgb24gSUVFRSA3NTQgcGxhdGZvcm1zIHRoYXQgZXhoaWJpdCB0aGUKKyAgICAgICAgIyBwcm9ibGVtIGRlc2NyaWJlZCBpbiBpc3N1ZSAjMjkzNywgd2Ugc2ltcGx5IHNraXAgdGhlIHdob2xlCisgICAgICAgICMgdGVzdC4KKworICAgICAgICAjIFB5dGhvbiB2ZXJzaW9uIG9mIG1hdGguZnN1bSwgZm9yIGNvbXBhcmlzb24uICBVc2VzIGEKKyAgICAgICAgIyBkaWZmZXJlbnQgYWxnb3JpdGhtIGJhc2VkIG9uIGZyZXhwLCBsZGV4cCBhbmQgaW50ZWdlcgorICAgICAgICAjIGFyaXRobWV0aWMuCisgICAgICAgIGZyb20gc3lzIGltcG9ydCBmbG9hdF9pbmZvCisgICAgICAgIG1hbnRfZGlnID0gZmxvYXRfaW5mby5tYW50X2RpZworICAgICAgICBldGlueSA9IGZsb2F0X2luZm8ubWluX2V4cCAtIG1hbnRfZGlnCisKKyAgICAgICAgZGVmIG1zdW0oaXRlcmFibGUpOgorICAgICAgICAgICAgIiIiRnVsbCBwcmVjaXNpb24gc3VtbWF0aW9uLiAgQ29tcHV0ZSBzdW0oaXRlcmFibGUpIHdpdGhvdXQgYW55CisgICAgICAgICAgICBpbnRlcm1lZGlhdGUgYWNjdW11bGF0aW9uIG9mIGVycm9yLiAgQmFzZWQgb24gdGhlICdsc3VtJyBmdW5jdGlvbgorICAgICAgICAgICAgYXQgaHR0cDovL2NvZGUuYWN0aXZlc3RhdGUuY29tL3JlY2lwZXMvMzkzMDkwLworCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHRtYW50LCB0ZXhwID0gMCwgMAorICAgICAgICAgICAgZm9yIHggaW4gaXRlcmFibGU6CisgICAgICAgICAgICAgICAgbWFudCwgZXhwID0gbWF0aC5mcmV4cCh4KQorICAgICAgICAgICAgICAgIG1hbnQsIGV4cCA9IGludChtYXRoLmxkZXhwKG1hbnQsIG1hbnRfZGlnKSksIGV4cCAtIG1hbnRfZGlnCisgICAgICAgICAgICAgICAgaWYgdGV4cCA+IGV4cDoKKyAgICAgICAgICAgICAgICAgICAgdG1hbnQgPDw9IHRleHAtZXhwCisgICAgICAgICAgICAgICAgICAgIHRleHAgPSBleHAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtYW50IDw8PSBleHAtdGV4cAorICAgICAgICAgICAgICAgIHRtYW50ICs9IG1hbnQKKyAgICAgICAgICAgICMgUm91bmQgdG1hbnQgKiAyKip0ZXhwIHRvIGEgZmxvYXQuICBUaGUgb3JpZ2luYWwgcmVjaXBlCisgICAgICAgICAgICAjIHVzZWQgZmxvYXQoc3RyKHRtYW50KSkgKiAyLjAqKnRleHAgZm9yIHRoaXMsIGJ1dCB0aGF0J3MKKyAgICAgICAgICAgICMgYSBsaXR0bGUgdW5zYWZlIGJlY2F1c2Ugc3RyIC0+IGZsb2F0IGNvbnZlcnNpb24gY2FuJ3QgYmUKKyAgICAgICAgICAgICMgcmVsaWVkIHVwb24gdG8gZG8gY29ycmVjdCByb3VuZGluZyBvbiBhbGwgcGxhdGZvcm1zLgorICAgICAgICAgICAgdGFpbCA9IG1heChsZW4oYmluKGFicyh0bWFudCkpKS0yIC0gbWFudF9kaWcsIGV0aW55IC0gdGV4cCkKKyAgICAgICAgICAgIGlmIHRhaWwgPiAwOgorICAgICAgICAgICAgICAgIGggPSAxIDw8ICh0YWlsLTEpCisgICAgICAgICAgICAgICAgdG1hbnQgPSB0bWFudCAvLyAoMipoKSArIGJvb2wodG1hbnQgJiBoIGFuZCB0bWFudCAmIDMqaC0xKQorICAgICAgICAgICAgICAgIHRleHAgKz0gdGFpbAorICAgICAgICAgICAgcmV0dXJuIG1hdGgubGRleHAodG1hbnQsIHRleHApCisKKyAgICAgICAgdGVzdF92YWx1ZXMgPSBbCisgICAgICAgICAgICAoW10sIDAuMCksCisgICAgICAgICAgICAoWzAuMF0sIDAuMCksCisgICAgICAgICAgICAoWzFlMTAwLCAxLjAsIC0xZTEwMCwgMWUtMTAwLCAxZTUwLCAtMS4wLCAtMWU1MF0sIDFlLTEwMCksCisgICAgICAgICAgICAoWzIuMCoqNTMsIC0wLjUsIC0yLjAqKi01NF0sIDIuMCoqNTMtMS4wKSwKKyAgICAgICAgICAgIChbMi4wKio1MywgMS4wLCAyLjAqKi0xMDBdLCAyLjAqKjUzKzIuMCksCisgICAgICAgICAgICAoWzIuMCoqNTMrMTAuMCwgMS4wLCAyLjAqKi0xMDBdLCAyLjAqKjUzKzEyLjApLAorICAgICAgICAgICAgKFsyLjAqKjUzLTQuMCwgMC41LCAyLjAqKi01NF0sIDIuMCoqNTMtMy4wKSwKKyAgICAgICAgICAgIChbMS4vbiBmb3IgbiBpbiByYW5nZSgxLCAxMDAxKV0sCisgICAgICAgICAgICAgZmxvYXQuZnJvbWhleCgnMHgxLmRmMTFmNDVmNGU2MWFwKzInKSksCisgICAgICAgICAgICAoWygtMS4pKipuL24gZm9yIG4gaW4gcmFuZ2UoMSwgMTAwMSldLAorICAgICAgICAgICAgIGZsb2F0LmZyb21oZXgoJy0weDEuNjJhMmFmMWJkMzYyNHAtMScpKSwKKyAgICAgICAgICAgIChbMS43KiooaSsxKS0xLjcqKmkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldICsgWy0xLjcqKjEwMDBdLCAtMS4wKSwKKyAgICAgICAgICAgIChbMWUxNiwgMS4sIDFlLTE2XSwgMTAwMDAwMDAwMDAwMDAwMDIuMCksCisgICAgICAgICAgICAoWzFlMTYtMi4sIDEuLTIuKiotNTMsIC0oMWUxNi0yLiksIC0oMS4tMi4qKi01MyldLCAwLjApLAorICAgICAgICAgICAgIyBleGVyY2lzZSBjb2RlIGZvciByZXNpemluZyBwYXJ0aWFscyBhcnJheQorICAgICAgICAgICAgKFsyLioqbiAtIDIuKioobis1MCkgKyAyLioqKG4rNTIpIGZvciBuIGluIHJhbmdlKC0xMDc0LCA5NzIsIDIpXSArCisgICAgICAgICAgICAgWy0yLioqMTAyMl0sCisgICAgICAgICAgICAgZmxvYXQuZnJvbWhleCgnMHgxLjU1NTU1NTU1NTU1NTVwKzk3MCcpKSwKKyAgICAgICAgICAgIF0KKworICAgICAgICBmb3IgaSwgKHZhbHMsIGV4cGVjdGVkKSBpbiBlbnVtZXJhdGUodGVzdF92YWx1ZXMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGFjdHVhbCA9IG1hdGguZnN1bSh2YWxzKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ0ZXN0ICVkIGZhaWxlZDogZ290IE92ZXJmbG93RXJyb3IsIGV4cGVjdGVkICVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBtYXRoLmZzdW0oJS4xMDByKSIgJSAoaSwgZXhwZWN0ZWQsIHZhbHMpKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ0ZXN0ICVkIGZhaWxlZDogZ290IFZhbHVlRXJyb3IsIGV4cGVjdGVkICVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBtYXRoLmZzdW0oJS4xMDByKSIgJSAoaSwgZXhwZWN0ZWQsIHZhbHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorCisgICAgICAgIGZyb20gcmFuZG9tIGltcG9ydCByYW5kb20sIGdhdXNzLCBzaHVmZmxlCisgICAgICAgIGZvciBqIGluIHhyYW5nZSgxMDAwKToKKyAgICAgICAgICAgIHZhbHMgPSBbNywgMWUxMDAsIC03LCAtMWUxMDAsIC05ZS0yMCwgOGUtMjBdICogMTAKKyAgICAgICAgICAgIHMgPSAwCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMjAwKToKKyAgICAgICAgICAgICAgICB2ID0gZ2F1c3MoMCwgcmFuZG9tKCkpICoqIDcgLSBzCisgICAgICAgICAgICAgICAgcyArPSB2CisgICAgICAgICAgICAgICAgdmFscy5hcHBlbmQodikKKyAgICAgICAgICAgIHNodWZmbGUodmFscykKKworICAgICAgICAgICAgcyA9IG1zdW0odmFscykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXN1bSh2YWxzKSwgbWF0aC5mc3VtKHZhbHMpKQorCisgICAgZGVmIHRlc3RIeXBvdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmh5cG90KQorICAgICAgICBzZWxmLmZ0ZXN0KCdoeXBvdCgwLDApJywgbWF0aC5oeXBvdCgwLDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdoeXBvdCgzLDQpJywgbWF0aC5oeXBvdCgzLDQpLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguaHlwb3QoTkFOLCBJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5oeXBvdChJTkYsIE5BTiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KE5BTiwgTklORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KE5JTkYsIE5BTiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5oeXBvdCgxLjAsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmh5cG90KE5BTiwgLTIuMCkpKQorCisgICAgZGVmIHRlc3RMZGV4cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxkZXhwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgwLDEpJywgbWF0aC5sZGV4cCgwLDEpLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgxLDEpJywgbWF0aC5sZGV4cCgxLDEpLCAyKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsZGV4cCgxLC0xKScsIG1hdGgubGRleHAoMSwtMSksIDAuNSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbGRleHAoLTEsMSknLCBtYXRoLmxkZXhwKC0xLDEpLCAtMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbWF0aC5sZGV4cCwgMS4sIDEwMDAwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG1hdGgubGRleHAsIC0xLiwgMTAwMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKDEuLCAtMTAwMDAwMCksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoLTEuLCAtMTAwMDAwMCksIC0wLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKElORiwgMzApLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cChOSU5GLCAtMjEzKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sZGV4cChOQU4sIDApKSkKKworICAgICAgICAjIGxhcmdlIHNlY29uZCBhcmd1bWVudAorICAgICAgICBmb3IgbiBpbiBbMTAqKjUsIDEwTCoqNSwgMTAqKjEwLCAxMEwqKjEwLCAxMCoqMjAsIDEwKio0MF06CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoSU5GLCAtbiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cChOSU5GLCAtbiksIE5JTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoMS4sIC1uKSwgMC4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoLTEuLCAtbiksIC0wLikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cCgwLiwgLW4pLCAwLikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cCgtMC4sIC1uKSwgLTAuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sZGV4cChOQU4sIC1uKSkpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG1hdGgubGRleHAsIDEuLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbWF0aC5sZGV4cCwgLTEuLCBuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKDAuLCBuKSwgMC4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubGRleHAoLTAuLCBuKSwgLTAuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxkZXhwKElORiwgbiksIElORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5sZGV4cChOSU5GLCBuKSwgTklORikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubGRleHAoTkFOLCBuKSkpCisKKyAgICBkZWYgdGVzdExvZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxvZykKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDEvZSknLCBtYXRoLmxvZygxL21hdGguZSksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMSknLCBtYXRoLmxvZygxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKGUpJywgbWF0aC5sb2cobWF0aC5lKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDMyLDIpJywgbWF0aC5sb2coMzIsMiksIDUpCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZygxMCoqNDAsIDEwKScsIG1hdGgubG9nKDEwKio0MCwgMTApLCA0MCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nKDEwKio0MCwgMTAqKjIwKScsIG1hdGgubG9nKDEwKio0MCwgMTAqKjIwKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxvZyhJTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgubG9nLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmxvZyhOQU4pKSkKKworICAgIGRlZiB0ZXN0TG9nMXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5sb2cxcCkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMXAoMS9lIC0xKScsIG1hdGgubG9nMXAoMS9tYXRoLmUtMSksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2cxcCgwKScsIG1hdGgubG9nMXAoMCksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzFwKGUtMSknLCBtYXRoLmxvZzFwKG1hdGguZS0xKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnbG9nMXAoMSknLCBtYXRoLmxvZzFwKDEpLCBtYXRoLmxvZygyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmxvZzFwKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2cxcCwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2cxcChOQU4pKSkKKyAgICAgICAgbj0gMioqOTAKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChtYXRoLmxvZzFwKG4pLCA2Mi4zODMyNDYyNTAzOTUwNzUpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWF0aC5sb2cxcChuKSwgbWF0aC5sb2cxcChmbG9hdChuKSkpCisKKyAgICBkZWYgdGVzdExvZzEwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubG9nMTApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzEwKDAuMSknLCBtYXRoLmxvZzEwKDAuMSksIC0xKQorICAgICAgICBzZWxmLmZ0ZXN0KCdsb2cxMCgxKScsIG1hdGgubG9nMTAoMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ2xvZzEwKDEwKScsIG1hdGgubG9nMTAoMTApLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgubG9nKElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2cxMCwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2cxMChOQU4pKSkKKworICAgIGRlZiB0ZXN0TW9kZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLm1vZGYpCisKKyAgICAgICAgZGVmIHRlc3Rtb2RmKG5hbWUsIHJlc3VsdCwgZXhwZWN0ZWQpOgorICAgICAgICAgICAgKHYxLCB2MiksIChlMSwgZTIpID0gcmVzdWx0LCBleHBlY3RlZAorICAgICAgICAgICAgaWYgYWJzKHYxLWUxKSA+IGVwcyBvciBhYnModjItZTIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnJXMgcmV0dXJuZWQgJXIsIGV4cGVjdGVkICVyJyVcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCAodjEsdjIpLCAoZTEsZTIpKSkKKworICAgICAgICB0ZXN0bW9kZignbW9kZigxLjUpJywgbWF0aC5tb2RmKDEuNSksICgwLjUsIDEuMCkpCisgICAgICAgIHRlc3Rtb2RmKCdtb2RmKC0xLjUpJywgbWF0aC5tb2RmKC0xLjUpLCAoLTAuNSwgLTEuMCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLm1vZGYoSU5GKSwgKDAuMCwgSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLm1vZGYoTklORiksICgtMC4wLCBOSU5GKSkKKworICAgICAgICBtb2RmX25hbiA9IG1hdGgubW9kZihOQU4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1vZGZfbmFuWzBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obW9kZl9uYW5bMV0pKQorCisgICAgZGVmIHRlc3RQb3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5wb3cpCisgICAgICAgIHNlbGYuZnRlc3QoJ3BvdygwLDEpJywgbWF0aC5wb3coMCwxKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgncG93KDEsMCknLCBtYXRoLnBvdygxLDApLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdwb3coMiwxKScsIG1hdGgucG93KDIsMSksIDIpCisgICAgICAgIHNlbGYuZnRlc3QoJ3BvdygyLC0xKScsIG1hdGgucG93KDIsLTEpLCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCAxKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIDEpLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChtYXRoLnBvdygxLCBJTkYpKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG1hdGgucG93KDEsIE5JTkYpKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KE5BTiwgMSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygyLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coMCwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMSwgTkFOKSwgMSkKKworICAgICAgICAjIHBvdygwLiwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygwLiwgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMC4sIDMuKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMC4sIDIuMyksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDAuLCAyLiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDAuLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDAuLCAtMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIDAuLCAtMi4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAwLiwgLTIuMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIDAuLCAtMy4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAwLiwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coMC4sIE5BTikpKQorCisgICAgICAgICMgcG93KElORiwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIDMuKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgMi4zKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgMi4pLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgLTAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCAtMi4pLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIC0yLjMpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIC0zLiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgTklORiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdyhJTkYsIE5BTikpKQorCisgICAgICAgICMgcG93KC0wLiwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMC4sIElORiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0wLiwgMy4pLCAtMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuLCAyLjMpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMC4sIDIuKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0wLiwgLTAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMC4sIC0yLikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0wLiwgLTIuMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0wLiwgLTMuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTAuLCBOSU5GKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygtMC4sIE5BTikpKQorCisgICAgICAgICMgcG93KE5JTkYsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIDMuKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCAyLjMpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgMi4pLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCAtMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCAtMi4pLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCAtMi4zKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgLTMuKSwgLTAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIE5JTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coTklORiwgTkFOKSkpCisKKyAgICAgICAgIyBwb3coLTEsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCBJTkYpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIDMuKSwgLTEuKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTEuLCAyLjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCAyLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0xLiwgMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIC0wLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0xLiwgLTIuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMS4sIC0yLjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCAtMy4pLCAtMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCBOSU5GKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KC0xLiwgTkFOKSkpCisKKyAgICAgICAgIyBwb3coMSwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgSU5GKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMS4sIDMuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMS4sIDIuMyksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuLCAyLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDEuLCAtMC4pLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgLTIuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMS4sIC0yLjMpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgLTMuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMS4sIE5JTkYpLCAxLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgTkFOKSwgMS4pCisKKyAgICAgICAgIyBwb3coeCwgMCkgc2hvdWxkIGJlIDEgZm9yIGFueSB4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMi4zLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0yLjMsIDAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTkFOLCAwLiksIDEuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDIuMywgLTAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTIuMywgLTAuKSwgMS4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTkFOLCAtMC4pLCAxLikKKworICAgICAgICAjIHBvdyh4LCB5KSBpcyBpbnZhbGlkIGlmIHggaXMgbmVnYXRpdmUgYW5kIHkgaXMgbm90IGludGVncmFsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMS4sIDIuMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0xNS4sIC0zLjEpCisKKyAgICAgICAgIyBwb3coeCwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLjksIE5JTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLjEsIE5JTkYpLCAwLikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygwLjksIE5JTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMC4xLCBOSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0wLjEsIE5JTkYpLCBJTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuOSwgTklORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4xLCBOSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuOSwgTklORiksIDAuKQorCisgICAgICAgICMgcG93KHgsIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLjksIElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLjEsIElORiksIElORikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygwLjksIElORiksIDAuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KDAuMSwgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuMSwgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTAuOSwgSU5GKSwgMC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuMSwgSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0xLjksIElORiksIElORikKKworICAgICAgICAjIHBvdyh4LCB5KSBzaG91bGQgd29yayBmb3IgeCBuZWdhdGl2ZSwgeSBhbiBpbnRlZ2VyCisgICAgICAgIHNlbGYuZnRlc3QoJygtMi4pKiozLicsIG1hdGgucG93KC0yLjAsIDMuMCksIC04LjApCisgICAgICAgIHNlbGYuZnRlc3QoJygtMi4pKioyLicsIG1hdGgucG93KC0yLjAsIDIuMCksIDQuMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnKC0yLikqKjEuJywgbWF0aC5wb3coLTIuMCwgMS4wKSwgLTIuMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnKC0yLikqKjAuJywgbWF0aC5wb3coLTIuMCwgMC4wKSwgMS4wKQorICAgICAgICBzZWxmLmZ0ZXN0KCcoLTIuKSoqLTAuJywgbWF0aC5wb3coLTIuMCwgLTAuMCksIDEuMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnKC0yLikqKi0xLicsIG1hdGgucG93KC0yLjAsIC0xLjApLCAtMC41KQorICAgICAgICBzZWxmLmZ0ZXN0KCcoLTIuKSoqLTIuJywgbWF0aC5wb3coLTIuMCwgLTIuMCksIDAuMjUpCisgICAgICAgIHNlbGYuZnRlc3QoJygtMi4pKiotMy4nLCBtYXRoLnBvdygtMi4wLCAtMy4wKSwgLTAuMTI1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTIuMCwgLTAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0yLjAsIDAuNSkKKworICAgICAgICAjIHRoZSBmb2xsb3dpbmcgdGVzdHMgaGF2ZSBiZWVuIGNvbW1lbnRlZCBvdXQgc2luY2UgdGhleSBkb24ndAorICAgICAgICAjIHJlYWxseSBiZWxvbmcgaGVyZTogIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAqKiBmb3IgZmxvYXRzIGlzCisgICAgICAgICMgaW5kZXBlbmRlbnQgb2YgdGhlIGltcGxlbWVudGF0aW9uIG9mIG1hdGgucG93CisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKDEqKk5BTiwgMSkKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoMSoqSU5GLCAxKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgxKipOSU5GLCAxKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgxKiowLCAxKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgxLioqTkFOLCAxKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgxLioqSU5GLCAxKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgxLioqTklORiwgMSkKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoMS4qKjAsIDEpCisKKyAgICBkZWYgdGVzdFJhZGlhbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5yYWRpYW5zKQorICAgICAgICBzZWxmLmZ0ZXN0KCdyYWRpYW5zKDE4MCknLCBtYXRoLnJhZGlhbnMoMTgwKSwgbWF0aC5waSkKKyAgICAgICAgc2VsZi5mdGVzdCgncmFkaWFucyg5MCknLCBtYXRoLnJhZGlhbnMoOTApLCBtYXRoLnBpLzIpCisgICAgICAgIHNlbGYuZnRlc3QoJ3JhZGlhbnMoLTQ1KScsIG1hdGgucmFkaWFucygtNDUpLCAtbWF0aC5waS80KQorCisgICAgZGVmIHRlc3RTaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zaW4pCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbigwKScsIG1hdGguc2luKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4ocGkvMiknLCBtYXRoLnNpbihtYXRoLnBpLzIpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4oLXBpLzIpJywgbWF0aC5zaW4oLW1hdGgucGkvMiksIC0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnNpbihJTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc2luKE5JTkYpKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnNpbiwgSU5GKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5zaW4sIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc2luKE5BTikpKQorCisgICAgZGVmIHRlc3RTaW5oKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc2luaCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luaCgwKScsIG1hdGguc2luaCgwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc2luaCgxKSoqMi1jb3NoKDEpKioyJywgbWF0aC5zaW5oKDEpKioyLW1hdGguY29zaCgxKSoqMiwgLTEpCisgICAgICAgIHNlbGYuZnRlc3QoJ3NpbmgoMSkrc2luaCgtMSknLCBtYXRoLnNpbmgoMSkrbWF0aC5zaW5oKC0xKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnNpbmgoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguc2luaChOSU5GKSwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5zaW5oKE5BTikpKQorCisgICAgZGVmIHRlc3RTcXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc3FydCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc3FydCgwKScsIG1hdGguc3FydCgwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgnc3FydCgxKScsIG1hdGguc3FydCgxKSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgnc3FydCg0KScsIG1hdGguc3FydCg0KSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnNxcnQoSU5GKSwgSU5GKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnNxcnQsIE5JTkYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc3FydChOQU4pKSkKKworICAgIGRlZiB0ZXN0VGFuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudGFuKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW4oMCknLCBtYXRoLnRhbigwKSwgMCkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuKHBpLzQpJywgbWF0aC50YW4obWF0aC5waS80KSwgMSkKKyAgICAgICAgc2VsZi5mdGVzdCgndGFuKC1waS80KScsIG1hdGgudGFuKC1tYXRoLnBpLzQpLCAtMSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC50YW4oSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbihOSU5GKSkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgudGFuLCBJTkYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnRhbiwgTklORikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC50YW4oTkFOKSkpCisKKyAgICBkZWYgdGVzdFRhbmgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC50YW5oKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKDApJywgbWF0aC50YW5oKDApLCAwKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKDEpK3RhbmgoLTEpJywgbWF0aC50YW5oKDEpK21hdGgudGFuaCgtMSksIDApCisgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoaW5mKScsIG1hdGgudGFuaChJTkYpLCAxKQorICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKC1pbmYpJywgbWF0aC50YW5oKE5JTkYpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC50YW5oKE5BTikpKQorICAgICAgICAjIGNoZWNrIHRoYXQgdGFuaCgtMC4pID09IC0wLiBvbiBJRUVFIDc1NCBzeXN0ZW1zCisgICAgICAgIGlmIGZsb2F0Ll9fZ2V0Zm9ybWF0X18oImRvdWJsZSIpLnN0YXJ0c3dpdGgoIklFRUUiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC50YW5oKC0wLiksIC0wLikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5jb3B5c2lnbigxLiwgbWF0aC50YW5oKC0wLikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRoLmNvcHlzaWduKDEuLCAtMC4pKQorCisgICAgZGVmIHRlc3RfdHJ1bmMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC50cnVuYygxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRydW5jKC0xKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtYXRoLnRydW5jKDEpKSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobWF0aC50cnVuYygxLjUpKSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgudHJ1bmMoMS41KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRydW5jKC0xLjUpLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRydW5jKDEuOTk5OTk5KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRydW5jKC0xLjk5OTk5OSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgudHJ1bmMoLTAuOTk5OTk5KSwgLTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC50cnVuYygtMTAwLjk5OSksIC0xMDApCisKKyAgICAgICAgY2xhc3MgVGVzdFRydW5jKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX190cnVuY19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAyMworCisgICAgICAgIGNsYXNzIFRlc3ROb1RydW5jKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRydW5jKFRlc3RUcnVuYygpKSwgMjMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnRydW5jKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudHJ1bmMsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKSwgbWF0aC50cnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdE5vVHJ1bmMoKSkKKworICAgIGRlZiB0ZXN0SXNuYW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGZsb2F0KCJuYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGZsb2F0KCJpbmYiKSogMC4pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1hdGguaXNuYW4oZmxvYXQoImluZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzbmFuKDAuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzbmFuKDEuKSkKKworICAgIGRlZiB0ZXN0SXNpbmYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKGZsb2F0KCJpbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKGZsb2F0KCItaW5mIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc2luZigxRTQwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKC0xRTQwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc2luZihmbG9hdCgibmFuIikpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1hdGguaXNpbmYoMC4pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1hdGguaXNpbmYoMS4pKQorCisgICAgIyBSRURfRkxBRyAxNi1PY3QtMjAwMCBUaW0KKyAgICAjIFdoaWxlIDIuMCBpcyBtb3JlIGNvbnNpc3RlbnQgYWJvdXQgZXhjZXB0aW9ucyB0aGFuIHByZXZpb3VzIHJlbGVhc2VzLCBpdAorICAgICMgc3RpbGwgZmFpbHMgdGhpcyBwYXJ0IG9mIHRoZSB0ZXN0IG9uIHNvbWUgcGxhdGZvcm1zLiAgRm9yIG5vdywgd2Ugb25seQorICAgICMgKnJ1biogdGVzdF9leGNlcHRpb25zKCkgaW4gdmVyYm9zZSBtb2RlLCBzbyB0aGF0IHRoaXMgaXNuJ3Qgbm9ybWFsbHkKKyAgICAjIHRlc3RlZC4KKworICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgeCA9IG1hdGguZXhwKC0xMDAwMDAwMDAwKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgbWF0aG1vZHVsZS5jIGlzIGZhaWxpbmcgdG8gd2VlZCBvdXQgdW5kZXJmbG93cyBmcm9tIGxpYm0sIG9yCisgICAgICAgICAgICAgICAgIyB3ZSd2ZSBnb3QgYW4gZnAgZm9ybWF0IHdpdGggaHVnZSBkeW5hbWljIHJhbmdlCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmRlcmZsb3dpbmcgZXhwKCkgc2hvdWxkIG5vdCBoYXZlIHJhaXNlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbiBleGNlcHRpb24iKQorICAgICAgICAgICAgaWYgeCAhPSAwOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidW5kZXJmbG93aW5nIGV4cCgpIHNob3VsZCBoYXZlIHJldHVybmVkIDAiKQorCisgICAgICAgICAgICAjIElmIHRoaXMgZmFpbHMsIHByb2JhYmx5IHVzaW5nIGEgc3RyaWN0IElFRUUtNzU0IGNvbmZvcm1pbmcgbGlibSwgYW5kIHgKKyAgICAgICAgICAgICMgaXMgK0luZiBhZnRlcndhcmRzLiAgQnV0IFB5dGhvbiB3YW50cyBvdmVyZmxvd3MgZGV0ZWN0ZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gbWF0aC5leHAoMTAwMDAwMDAwMCkKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJvdmVyZmxvd2luZyBleHAoKSBkaWRuJ3QgdHJpZ2dlciBPdmVyZmxvd0Vycm9yIikKKworICAgICAgICAgICAgIyBJZiB0aGlzIGZhaWxzLCBpdCBjb3VsZCBiZSBhIHB1enpsZS4gIE9uZSBvZGQgcG9zc2liaWxpdHkgaXMgdGhhdAorICAgICAgICAgICAgIyBtYXRobW9kdWxlLmMncyBtYWNyb3MgYXJlIGdldHRpbmcgY29uZnVzZWQgd2hpbGUgY29tcGFyaW5nCisgICAgICAgICAgICAjIEluZiAoSFVHRV9WQUwpIHRvIGEgTmFOLCBhbmQgYXJ0aWZpY2lhbGx5IHNldHRpbmcgZXJybm8gdG8gRVJBTkdFCisgICAgICAgICAgICAjIGFzIGEgcmVzdWx0IChhbmQgc28gcmFpc2luZyBPdmVyZmxvd0Vycm9yIGluc3RlYWQpLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHggPSBtYXRoLnNxcnQoLTEuMCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzcXJ0KC0xKSBkaWRuJ3QgcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICBAcmVxdWlyZXNfSUVFRV83NTQKKyAgICBkZWYgdGVzdF90ZXN0ZmlsZShzZWxmKToKKyAgICAgICAgZm9yIGlkLCBmbiwgYXIsIGFpLCBlciwgZWksIGZsYWdzIGluIHBhcnNlX3Rlc3RmaWxlKHRlc3RfZmlsZSk6CisgICAgICAgICAgICAjIFNraXAgaWYgZWl0aGVyIHRoZSBpbnB1dCBvciByZXN1bHQgaXMgY29tcGxleCwgb3IgaWYKKyAgICAgICAgICAgICMgZmxhZ3MgaXMgbm9uZW1wdHkKKyAgICAgICAgICAgIGlmIGFpICE9IDAuIG9yIGVpICE9IDAuIG9yIGZsYWdzOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBmbiBpbiBbJ3JlY3QnLCAncG9sYXInXToKKyAgICAgICAgICAgICAgICAjIG5vIHJlYWwgdmVyc2lvbnMgb2YgcmVjdCwgcG9sYXIKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIobWF0aCwgZm4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyhhcikKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAoIlVuZXhwZWN0ZWQgVmFsdWVFcnJvciBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ICVzOiVzKCVyKVxuIiAlIChpZCwgZm4sIGFyKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwobWVzc2FnZSkKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAoIlVuZXhwZWN0ZWQgT3ZlcmZsb3dFcnJvciBpbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0ICVzOiVzKCVyKVxuIiAlIChpZCwgZm4sIGFyKSkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwobWVzc2FnZSkKKyAgICAgICAgICAgIHNlbGYuZnRlc3QoIiVzOiVzKCVyKSIgJSAoaWQsIGZuLCBhciksIHJlc3VsdCwgZXIpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgcmVxdWlyZXMgSUVFRSA3NTQgZG91YmxlcyIpCisgICAgZGVmIHRlc3RfbXRlc3RmaWxlKHNlbGYpOgorICAgICAgICBBTExPV0VEX0VSUk9SID0gMjAgICMgcGVybWl0dGVkIGVycm9yLCBpbiB1bHBzCisgICAgICAgIGZhaWxfZm10ID0gInt9Ont9KHshcn0pOiBleHBlY3RlZCB7IXJ9LCBnb3QgeyFyfSIKKworICAgICAgICBmYWlsdXJlcyA9IFtdCisgICAgICAgIGZvciBpZCwgZm4sIGFyZywgZXhwZWN0ZWQsIGZsYWdzIGluIHBhcnNlX210ZXN0ZmlsZShtYXRoX3Rlc3RjYXNlcyk6CisgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihtYXRoLCBmbikKKworICAgICAgICAgICAgaWYgJ2ludmFsaWQnIGluIGZsYWdzIG9yICdkaXZpZGUtYnktemVybycgaW4gZmxhZ3M6CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAnVmFsdWVFcnJvcicKKyAgICAgICAgICAgIGVsaWYgJ292ZXJmbG93JyBpbiBmbGFnczoKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9ICdPdmVyZmxvd0Vycm9yJworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZ290ID0gZnVuYyhhcmcpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBnb3QgPSAnVmFsdWVFcnJvcicKKyAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgIGdvdCA9ICdPdmVyZmxvd0Vycm9yJworCisgICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShnb3QsIGZsb2F0KSBhbmQgaXNpbnN0YW5jZShleHBlY3RlZCwgZmxvYXQpOgorICAgICAgICAgICAgICAgIGlmIG1hdGguaXNuYW4oZXhwZWN0ZWQpIGFuZCBtYXRoLmlzbmFuKGdvdCk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgbm90IG1hdGguaXNuYW4oZXhwZWN0ZWQpIGFuZCBub3QgbWF0aC5pc25hbihnb3QpOgorICAgICAgICAgICAgICAgICAgICBpZiBmbiA9PSAnbGdhbW1hJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgd2UgdXNlIGEgd2Vha2VyIGFjY3VyYWN5IHRlc3QgZm9yIGxnYW1tYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICMgbGdhbW1hIG9ubHkgYWNoaWV2ZXMgYW4gYWJzb2x1dGUgZXJyb3Igb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYSBmZXcgbXVsdGlwbGVzIG9mIHRoZSBtYWNoaW5lIGFjY3VyYWN5LCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmFsLgorICAgICAgICAgICAgICAgICAgICAgICAgYWNjdXJhY3lfZmFpbHVyZSA9IGFjY19jaGVjayhleHBlY3RlZCwgZ290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxfZXJyID0gNWUtMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFic19lcnIgPSA1ZS0xNSkKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBmbiA9PSAnZXJmYyc6CisgICAgICAgICAgICAgICAgICAgICAgICAjIGVyZmMgaGFzIGxlc3MtdGhhbi1pZGVhbCBhY2N1cmFjeSBmb3IgbGFyZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICMgYXJndW1lbnRzICh4IH4gMjUgb3Igc28pLCBtYWlubHkgZHVlIHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBlcnJvciBpbnZvbHZlZCBpbiBjb21wdXRpbmcgZXhwKC14KngpLgorICAgICAgICAgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICAgICAgICAgIyBYWFggV291bGQgYmUgYmV0dGVyIHRvIHdlYWtlbiB0aGlzIHRlc3Qgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgbGFyZ2UgeCwgaW5zdGVhZCBvZiBmb3IgYWxsIHguCisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gdWxwc19jaGVjayhleHBlY3RlZCwgZ290LCAyMDAwKQorCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhY2N1cmFjeV9mYWlsdXJlID0gdWxwc19jaGVjayhleHBlY3RlZCwgZ290LCAyMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgYWNjdXJhY3lfZmFpbHVyZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShnb3QsIHN0cikgYW5kIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIHN0cik6CisgICAgICAgICAgICAgICAgaWYgZ290ID09IGV4cGVjdGVkOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBmYWlsX21zZyA9IGZhaWxfZm10LmZvcm1hdChpZCwgZm4sIGFyZywgZXhwZWN0ZWQsIGdvdCkKKyAgICAgICAgICAgIGlmIGFjY3VyYWN5X2ZhaWx1cmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZmFpbF9tc2cgKz0gJyAoe30pJy5mb3JtYXQoYWNjdXJhY3lfZmFpbHVyZSkKKyAgICAgICAgICAgIGZhaWx1cmVzLmFwcGVuZChmYWlsX21zZykKKworICAgICAgICBpZiBmYWlsdXJlczoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnRmFpbHVyZXMgaW4gdGVzdF9tdGVzdGZpbGU6XG4gICcgKworICAgICAgICAgICAgICAgICAgICAgICdcbiAgJy5qb2luKGZhaWx1cmVzKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZnJvbSBkb2N0ZXN0IGltcG9ydCBEb2NGaWxlU3VpdGUKKyAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoTWF0aFRlc3RzKSkKKyAgICBzdWl0ZS5hZGRUZXN0KERvY0ZpbGVTdWl0ZSgiaWVlZTc1NC50eHQiKSkKKyAgICBydW5fdW5pdHRlc3Qoc3VpdGUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hdGgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzOTM0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hdGgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzOTM0NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21hdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzBlOGUyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWQ1LnB5CkBAIC0wLDAgKzEsNjEgQEAKKyMgVGVzdGluZyBtZDUgbW9kdWxlCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGhlIG1kNSBtb2R1bGUgaXMgZGVwcmVjYXRlZC4qIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIG1kNSBpbXBvcnQgbWQ1Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitkZWYgaGV4c3RyKHMpOgorICAgIGltcG9ydCBzdHJpbmcKKyAgICBoID0gc3RyaW5nLmhleGRpZ2l0cworICAgIHIgPSAnJworICAgIGZvciBjIGluIHM6CisgICAgICAgIGkgPSBvcmQoYykKKyAgICAgICAgciA9IHIgKyBoWyhpID4+IDQpICYgMHhGXSArIGhbaSAmIDB4Rl0KKyAgICByZXR1cm4gcgorCitjbGFzcyBNRDVfVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgbWQ1dGVzdChzZWxmLCBzLCBleHBlY3RlZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4c3RyKG1kNShzKS5kaWdlc3QoKSksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNShzKS5oZXhkaWdlc3QoKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9iYXNpY3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5tZDV0ZXN0CisgICAgICAgIGVxKCcnLCAnZDQxZDhjZDk4ZjAwYjIwNGU5ODAwOTk4ZWNmODQyN2UnKQorICAgICAgICBlcSgnYScsICcwY2MxNzViOWMwZjFiNmE4MzFjMzk5ZTI2OTc3MjY2MScpCisgICAgICAgIGVxKCdhYmMnLCAnOTAwMTUwOTgzY2QyNGZiMGQ2OTYzZjdkMjhlMTdmNzInKQorICAgICAgICBlcSgnbWVzc2FnZSBkaWdlc3QnLCAnZjk2YjY5N2Q3Y2I3OTM4ZDUyNWEyZjMxYWFmMTYxZDAnKQorICAgICAgICBlcSgnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonLCAnYzNmY2QzZDc2MTkyZTQwMDdkZmI0OTZjY2E2N2UxM2InKQorICAgICAgICBlcSgnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODknLAorICAgICAgICAgICAnZDE3NGFiOThkMjc3ZDlmNWE1NjExYzJjOWY0MTlkOWYnKQorICAgICAgICBlcSgnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnLAorICAgICAgICAgICAnNTdlZGY0YTIyYmUzYzk1NWFjNDlkYTJlMjEwN2I2N2EnKQorCisgICAgZGVmIHRlc3RfaGV4ZGlnZXN0KHNlbGYpOgorICAgICAgICAjIGhleGRpZ2VzdCBpcyBuZXcgd2l0aCBQeXRob24gMi4wCisgICAgICAgIG0gPSBtZDUoJ3Rlc3RpbmcgdGhlIGhleGRpZ2VzdCBtZXRob2QnKQorICAgICAgICBoID0gbS5oZXhkaWdlc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleHN0cihtLmRpZ2VzdCgpKSwgaCkKKworICAgIGRlZiB0ZXN0X2xhcmdlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgYWFzID0gJ2EnICogNjQKKyAgICAgICAgYmVlcyA9ICdiJyAqIDY0CisgICAgICAgIGNlZXMgPSAnYycgKiA2NAorCisgICAgICAgIG0xID0gbWQ1KCkKKyAgICAgICAgbTEudXBkYXRlKGFhcykKKyAgICAgICAgbTEudXBkYXRlKGJlZXMpCisgICAgICAgIG0xLnVwZGF0ZShjZWVzKQorCisgICAgICAgIG0yID0gbWQ1KCkKKyAgICAgICAgbTIudXBkYXRlKGFhcyArIGJlZXMgKyBjZWVzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xLmRpZ2VzdCgpLCBtMi5kaWdlc3QoKSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTUQ1X1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZDUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTMyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZDUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21kNS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZDUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYTMyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZDUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5aW8ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkNTU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5CkBAIC0wLDAgKzEsNzE3IEBACisiIiJVbml0IHRlc3RzIGZvciBtZW1vcnktYmFzZWQgZmlsZS1saWtlIG9iamVjdHMuCitTdHJpbmdJTyAtLSBmb3IgdW5pY29kZSBzdHJpbmdzCitCeXRlc0lPIC0tIGZvciBieXRlcworIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgdW5pY29kZV9saXRlcmFscworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKKworaW1wb3J0IGlvCitpbXBvcnQgX3B5aW8gYXMgcHlpbworaW1wb3J0IHBpY2tsZQorCitjbGFzcyBNZW1vcnlTZWVrVGVzdE1peGluOgorCisgICAgZGVmIHRlc3RJbml0KHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBieXRlc0lvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgIGRlZiB0ZXN0UmVhZChzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgYnl0ZXNJbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjFdLCBieXRlc0lvLnJlYWQoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzE6NV0sIGJ5dGVzSW8ucmVhZCg0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNTpdLCBieXRlc0lvLnJlYWQoOTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLkVPRiwgYnl0ZXNJby5yZWFkKCkpCisKKyAgICBkZWYgdGVzdFJlYWROb0FyZ3Moc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIGJ5dGVzSW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBieXRlc0lvLnJlYWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLkVPRiwgYnl0ZXNJby5yZWFkKCkpCisKKyAgICBkZWYgdGVzdFNlZWsoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIGJ5dGVzSW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIGJ5dGVzSW8ucmVhZCg1KQorICAgICAgICBieXRlc0lvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYsIGJ5dGVzSW8ucmVhZCgpKQorCisgICAgICAgIGJ5dGVzSW8uc2VlaygzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZlszOl0sIGJ5dGVzSW8ucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGJ5dGVzSW8uc2VlaywgMC4wKQorCisgICAgZGVmIHRlc3RUZWxsKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBieXRlc0lvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGJ5dGVzSW8udGVsbCgpKQorICAgICAgICBieXRlc0lvLnNlZWsoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBieXRlc0lvLnRlbGwoKSkKKyAgICAgICAgYnl0ZXNJby5zZWVrKDEwMDAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDAwLCBieXRlc0lvLnRlbGwoKSkKKworCitjbGFzcyBNZW1vcnlUZXN0TWl4aW46CisKKyAgICBkZWYgdGVzdF9kZXRhY2goc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuVW5zdXBwb3J0ZWRPcGVyYXRpb24sIGJ1Zi5kZXRhY2gpCisKKyAgICBkZWYgd3JpdGVfb3BzKHNlbGYsIGYsIHQpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUodCgiYmxhaC4iKSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5zZWVrKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYud3JpdGUodCgiSGVsbG8uIikpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudGVsbCgpLCA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuc2Vlayg1KSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLndyaXRlKHQoIiB3b3JsZFxuXG5cbiIpKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnNlZWsoMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi53cml0ZSh0KCJoIikpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYudHJ1bmNhdGUoMTIpLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgMSkKKworICAgIGRlZiB0ZXN0X3dyaXRlKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoImhlbGxvIHdvcmxkXG4iKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi53cml0ZV9vcHMobWVtaW8sIHNlbGYuYnVmdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgc2VsZi53cml0ZV9vcHMobWVtaW8sIHNlbGYuYnVmdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ud3JpdGUsIE5vbmUpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8ud3JpdGUsIHNlbGYuYnVmdHlwZSgiIikpCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby53cml0ZWxpbmVzKFtidWZdICogMTAwKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYgKiAxMDApCisgICAgICAgIG1lbWlvLndyaXRlbGluZXMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmICogMTAwKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ud3JpdGVsaW5lcywgW2J1Zl0gKyBbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLndyaXRlbGluZXMsIE5vbmUpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8ud3JpdGVsaW5lcywgW10pCisKKyAgICBkZWYgdGVzdF93cml0ZWxpbmVzX2Vycm9yKHNlbGYpOgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGRlZiBlcnJvcl9nZW4oKToKKyAgICAgICAgICAgIHlpZWxkIHNlbGYuYnVmdHlwZSgnc3BhbScpCisgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleWJvYXJkSW50ZXJydXB0LCBtZW1pby53cml0ZWxpbmVzLCBlcnJvcl9nZW4oKSkKKworICAgIGRlZiB0ZXN0X3RydW5jYXRlKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8udHJ1bmNhdGUsIC0xKQorICAgICAgICBtZW1pby5zZWVrKDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udHJ1bmNhdGUoKSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWZbOjZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRydW5jYXRlKDQpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1Zls6NF0pCisgICAgICAgICMgdHJ1bmNhdGUoKSBhY2NlcHRzIGxvbmcgb2JqZWN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRydW5jYXRlKDRMKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWZbOjRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgNikKKyAgICAgICAgbWVtaW8uc2VlaygwLCAyKQorICAgICAgICBtZW1pby53cml0ZShidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmWzo0XSArIGJ1ZikKKyAgICAgICAgcG9zID0gbWVtaW8udGVsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udHJ1bmNhdGUoTm9uZSksIHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby50ZWxsKCksIHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby50cnVuY2F0ZSwgJzAnKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnRydW5jYXRlLCAwKQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBzZWxmLkVPRikKKyAgICAgICAgbWVtaW8uX19pbml0X18oYnVmICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYgKiAyKQorICAgICAgICBtZW1pby5fX2luaXRfXyhidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgwKSwgc2VsZi5FT0YpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgxKSwgYnVmWzoxXSkKKyAgICAgICAgIyByZWFkKCkgYWNjZXB0cyBsb25nIG9iamVjdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDRMKSwgYnVmWzE6NV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCg5MDApLCBidWZbNTpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgc2VsZi5FT0YpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIHNlbGYuRU9GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgMTApCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKC0xKSwgYnVmKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtZW1pby5yZWFkKCkpLCB0eXBlKGJ1ZikpCisgICAgICAgIG1lbWlvLnNlZWsoMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobWVtaW8ucmVhZCgpKSwgdHlwZShidWYpKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZChOb25lKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLnJlYWQsICcnKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnJlYWQpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZShzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwXG4iKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYgKiAyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoMCksIHNlbGYuRU9GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoKSwgc2VsZi5FT0YpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSg1KSwgYnVmWzo1XSkKKyAgICAgICAgIyByZWFkbGluZSgpIGFjY2VwdHMgbG9uZyBvYmplY3RzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoNUwpLCBidWZbNToxMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoNSksIGJ1ZlsxMDoxNV0pCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgtMSksIGJ1ZikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lKDApLCBzZWxmLkVPRikKKworICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTBcbiIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKChidWYgKiAzKVs6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lKCksIGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoKSwgYnVmWzotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoKSwgc2VsZi5FT0YpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG1lbWlvLnJlYWRsaW5lKCkpLCB0eXBlKGJ1ZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmUoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLnJlYWRsaW5lLCAnJykKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAgbWVtaW8ucmVhZGxpbmUpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MFxuIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmICogMTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZXMoKSwgW2J1Zl0gKiAxMCkKKyAgICAgICAgbWVtaW8uc2Vlayg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lcygpLCBbYnVmWzU6XV0gKyBbYnVmXSAqIDkpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgIyByZWFkbGluZXMoKSBhY2NlcHRzIGxvbmcgb2JqZWN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lcygxNUwpLCBbYnVmXSAqIDIpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkbGluZXMoLTEpLCBbYnVmXSAqIDEwKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZGxpbmVzKDApLCBbYnVmXSAqIDEwKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtZW1pby5yZWFkbGluZXMoKVswXSksIHR5cGUoYnVmKSkKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRsaW5lcyhOb25lKSwgW2J1Zl0gKiAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5yZWFkbGluZXMsICcnKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnJlYWRsaW5lcykKKworICAgIGRlZiB0ZXN0X2l0ZXJhdG9yKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTBcbiIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZiAqIDEwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlcihtZW1pbyksIG1lbWlvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihtZW1pbywgJ19faXRlcl9fJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG1lbWlvLCAnbmV4dCcpKQorICAgICAgICBpID0gMAorICAgICAgICBmb3IgbGluZSBpbiBtZW1pbzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgYnVmKQorICAgICAgICAgICAgaSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSwgMTApCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgaSA9IDAKKyAgICAgICAgZm9yIGxpbmUgaW4gbWVtaW86CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGJ1ZikKKyAgICAgICAgICAgIGkgKz0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIDEwKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYgKiAyKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5leHQsIG1lbWlvKQorCisgICAgZGVmIHRlc3RfZ2V0dmFsdWUoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZikKKyAgICAgICAgbWVtaW8ucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUobWVtaW8uZ2V0dmFsdWUoKSksIHR5cGUoYnVmKSkKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmICogMTAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpWy0zOl0sIHNlbGYuYnVmdHlwZSgiODkwIikpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5nZXR2YWx1ZSkKKworICAgIGRlZiB0ZXN0X3NlZWsoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBtZW1pby5yZWFkKDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnNlZWssIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5zZWVrLCAxLCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uc2VlaywgMSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoMCwgMCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2VlaygzKSwgMykKKyAgICAgICAgIyBzZWVrKCkgYWNjZXB0cyBsb25nIG9iamVjdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKDNMKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKDAsIDEpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgYnVmWzM6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKGxlbihidWYpKSwgbGVuKGJ1ZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCBzZWxmLkVPRikKKyAgICAgICAgbWVtaW8uc2VlayhsZW4oYnVmKSArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCBzZWxmLkVPRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKDAsIDIpLCBsZW4oYnVmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIHNlbGYuRU9GKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnNlZWssIDApCisKKyAgICBkZWYgdGVzdF9vdmVyc2VlayhzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uc2VlayhsZW4oYnVmKSArIDEpLCAxMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIHNlbGYuRU9GKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorICAgICAgICBtZW1pby53cml0ZShzZWxmLkVPRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIG1lbWlvLndyaXRlKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYgKyBzZWxmLmJ1ZnR5cGUoJ1wwJykgKyBidWYpCisKKyAgICBkZWYgdGVzdF90ZWxsKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby50ZWxsKCksIDApCisgICAgICAgIG1lbWlvLnNlZWsoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby50ZWxsKCksIDUpCisgICAgICAgIG1lbWlvLnNlZWsoMTAwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8udGVsbCgpLCAxMDAwMCkKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby50ZWxsKQorCisgICAgZGVmIHRlc3RfZmx1c2goc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmZsdXNoKCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ud3JpdGFibGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkYWJsZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWthYmxlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uaXNhdHR5KCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmNsb3NlZCwgRmFsc2UpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8ud3JpdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLnJlYWRhYmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5zZWVrYWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uaXNhdHR5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmNsb3NlZCwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzaW5nKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBkZWYgdGVzdDEoKToKKyAgICAgICAgICAgIGNsYXNzIE1lbUlPKHNlbGYuaW9jbGFzcyk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbSA9IE1lbUlPKGJ1ZikKKyAgICAgICAgICAgIHJldHVybiBtLmdldHZhbHVlKCkKKyAgICAgICAgZGVmIHRlc3QyKCk6CisgICAgICAgICAgICBjbGFzcyBNZW1JTyhzZWxmLmlvY2xhc3MpOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhtZSwgYSwgYik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaW9jbGFzcy5fX2luaXRfXyhtZSwgYSkKKyAgICAgICAgICAgIG0gPSBNZW1JTyhidWYsIE5vbmUpCisgICAgICAgICAgICByZXR1cm4gbS5nZXR2YWx1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdDEoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3QyKCksIGJ1ZikKKworICAgIGRlZiB0ZXN0X2luc3RhbmNlX2RpY3RfbGVhayhzZWxmKToKKyAgICAgICAgIyBUZXN0IGNhc2UgZm9yIGlzc3VlICM2MjQyLgorICAgICAgICAjIFRoaXMgd2lsbCBiZSBjYXVnaHQgYnkgcmVncnRlc3QucHkgLVIgaWYgdGhpcyBsZWFrLgorICAgICAgICBmb3IgXyBpbiByYW5nZSgxMDApOgorICAgICAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICAgICAgbWVtaW8uZm9vID0gMQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIGJ1ZiA9IHNlbGYuYnVmdHlwZSgiMTIzNDU2Nzg5MCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKGJ1ZikKKyAgICAgICAgbWVtaW8uZm9vID0gNDIKKyAgICAgICAgbWVtaW8uc2VlaygyKQorCisgICAgICAgIGNsYXNzIFBpY2tsZVRlc3RNZW1JTyhzZWxmLmlvY2xhc3MpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKG1lLCBpbml0dmFsdWUsIGZvbyk6CisgICAgICAgICAgICAgICAgc2VsZi5pb2NsYXNzLl9faW5pdF9fKG1lLCBpbml0dmFsdWUpCisgICAgICAgICAgICAgICAgbWUuZm9vID0gZm9vCisgICAgICAgICAgICAjIF9fZ2V0bmV3YXJnc19fIGlzIHVuZGVmaW5lZCBvbiBwdXJwb3NlLiBUaGlzIGNoZWNrcyB0aGF0IFBFUCAzMDcKKyAgICAgICAgICAgICMgaXMgdXNlZCB0byBwcm92aWRlIHBpY2tsaW5nIHN1cHBvcnQuCisKKyAgICAgICAgIyBQaWNrbGUgZXhwZWN0cyB0aGUgY2xhc3MgdG8gYmUgb24gdGhlIG1vZHVsZSBsZXZlbC4gSGVyZSB3ZSB1c2UgYQorICAgICAgICAjIGxpdHRsZSBoYWNrIHRvIGFsbG93IHRoZSBQaWNrbGVUZXN0TWVtSU8gY2xhc3MgdG8gZGVyaXZlIGZyb20KKyAgICAgICAgIyBzZWxmLmlvY2xhc3Mgd2l0aG91dCBoYXZpbmcgdG8gZGVmaW5lIGFsbCBjb21iaW5hdGlvbnMgZXhwbGljaXRseSBvbgorICAgICAgICAjIHRoZSBtb2R1bGUtbGV2ZWwuCisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBQaWNrbGVUZXN0TWVtSU8uX19tb2R1bGVfXyA9ICdfX21haW5fXycKKyAgICAgICAgX19tYWluX18uUGlja2xlVGVzdE1lbUlPID0gUGlja2xlVGVzdE1lbUlPCisgICAgICAgIHN1Ym1lbWlvID0gUGlja2xlVGVzdE1lbUlPKGJ1ZiwgODApCisgICAgICAgIHN1Ym1lbWlvLnNlZWsoMikKKworICAgICAgICAjIFdlIG9ubHkgc3VwcG9ydCBwaWNrbGUgcHJvdG9jb2wgMiBhbmQgb253YXJkIHNpbmNlIHdlIHVzZSBleHRlbmRlZAorICAgICAgICAjIF9fcmVkdWNlX18gQVBJIG9mIFBFUCAzMDcgdG8gcHJvdmlkZSBwaWNrbGluZyBzdXBwb3J0LgorICAgICAgICBmb3IgcHJvdG8gaW4gcmFuZ2UoMiwgcGlja2xlLkhJR0hFU1RfUFJPVE9DT0wpOgorICAgICAgICAgICAgZm9yIG9iaiBpbiAobWVtaW8sIHN1Ym1lbWlvKToKKyAgICAgICAgICAgICAgICBvYmoyID0gcGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhvYmosIHByb3RvY29sPXByb3RvKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5nZXR2YWx1ZSgpLCBvYmoyLmdldHZhbHVlKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmouX19jbGFzc19fLCBvYmoyLl9fY2xhc3NfXykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5mb28sIG9iajIuZm9vKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLnRlbGwoKSwgb2JqMi50ZWxsKCkpCisgICAgICAgICAgICAgICAgb2JqLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwaWNrbGUuZHVtcHMsIG9iaiwgcHJvdG8pCisgICAgICAgIGRlbCBfX21haW5fXy5QaWNrbGVUZXN0TWVtSU8KKworCitjbGFzcyBQeUJ5dGVzSU9UZXN0KE1lbW9yeVRlc3RNaXhpbiwgTWVtb3J5U2Vla1Rlc3RNaXhpbiwgdW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb24gPSBweWlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGJ1ZnR5cGUocyk6CisgICAgICAgIHJldHVybiBzLmVuY29kZSgiYXNjaWkiKQorICAgIGlvY2xhc3MgPSBweWlvLkJ5dGVzSU8KKyAgICBFT0YgPSBiIiIKKworICAgIGRlZiB0ZXN0X3JlYWQxKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5yZWFkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKCksIGJ1ZikKKworICAgIGRlZiB0ZXN0X3JlYWRpbnRvKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiImhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkaW50byhiKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIjEyMzQ1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkaW50byhiKSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIjY3ODkwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkaW50byhiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIjY3ODkwIikKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiImhlbGxvIHdvcmxkIikKKyAgICAgICAgbWVtaW8uc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWRpbnRvKGIpLCAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIjEyMzQ1Njc4OTBkIikKKyAgICAgICAgYiA9IGJ5dGVhcnJheShiIiIpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkaW50byhiKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ucmVhZGludG8sICcnKQorICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KGInYicsIGIiaGVsbG8gd29ybGQiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisgICAgICAgIG1lbWlvLnJlYWRpbnRvKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS50b3N0cmluZygpLCBiIjEyMzQ1Njc4OTBkIikKKyAgICAgICAgbWVtaW8uY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5yZWFkaW50bywgYikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYiIxMjMiKQorICAgICAgICBiID0gYnl0ZWFycmF5KCkKKyAgICAgICAgbWVtaW8uc2Vlayg0MikKKyAgICAgICAgbWVtaW8ucmVhZGludG8oYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIiIpCisKKyAgICBkZWYgdGVzdF9yZWxhdGl2ZV9zZWVrKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIjEyMzQ1Njc4OTAiKQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKC0xLCAxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5zZWVrKDMsIDEpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoLTQsIDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoLTEsIDIpLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoMSwgMSksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnNlZWsoMSwgMiksIDExKQorICAgICAgICBtZW1pby5zZWVrKC0zLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgYnVmWy0zOl0pCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgbWVtaW8uc2VlaygxLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgYnVmWzE6XSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuaW9jbGFzcywgIjEyMzQ1Njc4OTAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLndyaXRlLCAiMTIzNDU2Nzg5MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8ud3JpdGVsaW5lcywgWyIxMjM0NTY3ODkwIl0pCisKKyAgICBkZWYgdGVzdF9ieXRlc19hcnJheShzZWxmKToKKyAgICAgICAgYnVmID0gYiIxMjM0NTY3ODkwIgorICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICAgICAgYSA9IGFycmF5LmFycmF5KGInYicsIGJ1ZikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5nZXR2YWx1ZSgpLCBidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ud3JpdGUoYSksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZikKKworICAgIGRlZiB0ZXN0X2lzc3VlNTQ0OShzZWxmKToKKyAgICAgICAgYnVmID0gc2VsZi5idWZ0eXBlKCIxMjM0NTY3ODkwIikKKyAgICAgICAgc2VsZi5pb2NsYXNzKGluaXRpYWxfYnl0ZXM9YnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuaW9jbGFzcywgYnVmLCBmb289Tm9uZSkKKworCitjbGFzcyBUZXh0SU9UZXN0TWl4aW46CisKKyAgICBkZWYgdGVzdF9uZXdsaW5lc19wcm9wZXJ0eShzZWxmKToKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MobmV3bGluZT1Ob25lKQorICAgICAgICAjIFRoZSBDIFN0cmluZ0lPIGRlY29kZXMgbmV3bGluZXMgaW4gd3JpdGUoKSBjYWxscywgYnV0IHRoZSBQeXRob24KKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBvbmx5IGRvZXMgd2hlbiByZWFkaW5nLiAgVGhpcyBmdW5jdGlvbiBmb3JjZXMgdGhlbSB0bworICAgICAgICAjIGJlIGRlY29kZWQgZm9yIHRlc3RpbmcuCisgICAgICAgIGRlZiBmb3JjZV9kZWNvZGUoKToKKyAgICAgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgICAgIG1lbWlvLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLm5ld2xpbmVzLCBOb25lKQorICAgICAgICBtZW1pby53cml0ZSgiYVxuIikKKyAgICAgICAgZm9yY2VfZGVjb2RlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5uZXdsaW5lcywgIlxuIikKKyAgICAgICAgbWVtaW8ud3JpdGUoImJcclxuIikKKyAgICAgICAgZm9yY2VfZGVjb2RlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5uZXdsaW5lcywgKCJcbiIsICJcclxuIikpCisgICAgICAgIG1lbWlvLndyaXRlKCJjXHJkIikKKyAgICAgICAgZm9yY2VfZGVjb2RlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5uZXdsaW5lcywgKCJcciIsICJcbiIsICJcclxuIikpCisKKyAgICBkZWYgdGVzdF9yZWxhdGl2ZV9zZWVrKHNlbGYpOgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgbWVtaW8uc2VlaywgLTEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIG1lbWlvLnNlZWssIDMsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIG1lbWlvLnNlZWssIC0zLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBtZW1pby5zZWVrLCAtMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgbWVtaW8uc2VlaywgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgbWVtaW8uc2VlaywgMSwgMikKKworICAgIGRlZiB0ZXN0X3RleHRpb19wcm9wZXJ0aWVzKHNlbGYpOgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisKKyAgICAgICAgIyBUaGVzZSBhcmUganVzdCBkdW1teSB2YWx1ZXMgYnV0IHdlIG5ldmVydGhlbGVzcyBjaGVjayB0aGVtIGZvciBmZWFyCisgICAgICAgICMgb2YgdW5leHBlY3RlZCBicmVha2FnZS4KKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUobWVtaW8uZW5jb2RpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKG1lbWlvLmVycm9ycykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZW1pby5saW5lX2J1ZmZlcmluZykKKworICAgIGRlZiB0ZXN0X25ld2xpbmVfbm9uZShzZWxmKToKKyAgICAgICAgIyBuZXdsaW5lPU5vbmUKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoImFcbmJcclxuY1xyZCIsIG5ld2xpbmU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lbWlvKSwgWyJhXG4iLCAiYlxuIiwgImNcbiIsICJkIl0pCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgyKSwgIlxuYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgyKSwgIlxuYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgxKSwgIlxuIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MobmV3bGluZT1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lbWlvLndyaXRlKCJhXG4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBtZW1pby53cml0ZSgiYlxyXG4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBtZW1pby53cml0ZSgiY1xyZCIpKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgpLCAiYVxuYlxuY1xuZCIpCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXHJcbmIiLCBuZXdsaW5lPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgzKSwgImFcbmIiKQorCisgICAgZGVmIHRlc3RfbmV3bGluZV9lbXB0eShzZWxmKToKKyAgICAgICAgIyBuZXdsaW5lPSIiCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXG5iXHJcbmNccmQiLCBuZXdsaW5lPSIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcbiIsICJiXHJcbiIsICJjXHIiLCAiZCJdKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCg0KSwgImFcbmJcciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgyKSwgIlxuYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8ucmVhZCgxKSwgIlxyIikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MobmV3bGluZT0iIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZW1pby53cml0ZSgiYVxuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVtaW8ud3JpdGUoImJcciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lbWlvLndyaXRlKCJcbmMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZW1pby53cml0ZSgiXHJkIikpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lbWlvKSwgWyJhXG4iLCAiYlxyXG4iLCAiY1xyIiwgImQiXSkKKworICAgIGRlZiB0ZXN0X25ld2xpbmVfbGYoc2VsZik6CisgICAgICAgICMgbmV3bGluZT0iXG4iCisgICAgICAgIG1lbWlvID0gc2VsZi5pb2NsYXNzKCJhXG5iXHJcbmNccmQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVtaW8pLCBbImFcbiIsICJiXHJcbiIsICJjXHJkIl0pCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lX2NyKHNlbGYpOgorICAgICAgICAjIG5ld2xpbmU9IlxyIgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygiYVxuYlxyXG5jXHJkIiwgbmV3bGluZT0iXHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgImFccmJcclxyY1xyZCIpCisgICAgICAgIG1lbWlvLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lbWlvKSwgWyJhXHIiLCAiYlxyIiwgIlxyIiwgImNcciIsICJkIl0pCisKKyAgICBkZWYgdGVzdF9uZXdsaW5lX2NybGYoc2VsZik6CisgICAgICAgICMgbmV3bGluZT0iXHJcbiIKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoImFcbmJcclxuY1xyZCIsIG5ld2xpbmU9IlxyXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnJlYWQoKSwgImFcclxuYlxyXHJcbmNccmQiKQorICAgICAgICBtZW1pby5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZW1pbyksIFsiYVxyXG4iLCAiYlxyXHJcbiIsICJjXHJkIl0pCisKKyAgICBkZWYgdGVzdF9pc3N1ZTUyNjUoc2VsZik6CisgICAgICAgICMgU3RyaW5nSU8gY2FuIGR1cGxpY2F0ZSBuZXdsaW5lcyBpbiB1bml2ZXJzYWwgbmV3bGluZXMgbW9kZQorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygiYVxyXG5iXHJcbiIsIG5ld2xpbmU9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZW1pby5yZWFkKDUpLCAiYVxuYlxuIikKKworCitjbGFzcyBQeVN0cmluZ0lPVGVzdChNZW1vcnlUZXN0TWl4aW4sIE1lbW9yeVNlZWtUZXN0TWl4aW4sCisgICAgICAgICAgICAgICAgICAgICBUZXh0SU9UZXN0TWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBidWZ0eXBlID0gdW5pY29kZQorICAgIGlvY2xhc3MgPSBweWlvLlN0cmluZ0lPCisgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb24gPSBweWlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uCisgICAgRU9GID0gIiIKKworCitjbGFzcyBQeVN0cmluZ0lPUGlja2xlVGVzdChUZXh0SU9UZXN0TWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGlmIHBpY2tsZSByZXN0b3JlcyBwcm9wZXJseSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgU3RyaW5nSU8uCisgICAgIiIiCisgICAgYnVmdHlwZSA9IHVuaWNvZGUKKyAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbiA9IHB5aW8uVW5zdXBwb3J0ZWRPcGVyYXRpb24KKyAgICBFT0YgPSAiIgorCisgICAgY2xhc3MgaW9jbGFzcyhweWlvLlN0cmluZ0lPKToKKyAgICAgICAgZGVmIF9fbmV3X18oY2xzLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMocHlpby5TdHJpbmdJTygqYXJncywgKiprd2FyZ3MpKSkKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBwYXNzCisKKworY2xhc3MgQ0J5dGVzSU9UZXN0KFB5Qnl0ZXNJT1Rlc3QpOgorICAgIGlvY2xhc3MgPSBpby5CeXRlc0lPCisgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb24gPSBpby5VbnN1cHBvcnRlZE9wZXJhdGlvbgorCisgICAgdGVzdF9ieXRlc19hcnJheSA9IHVuaXR0ZXN0LnNraXAoCisgICAgICAgICJhcnJheS5hcnJheSgpIGRvZXMgbm90IGhhdmUgdGhlIG5ldyBidWZmZXIgQVBJIgorICAgICkoUHlCeXRlc0lPVGVzdC50ZXN0X2J5dGVzX2FycmF5KQorCisKKyAgICBkZWYgdGVzdF9nZXRzdGF0ZShzZWxmKToKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBzdGF0ZSA9IG1lbWlvLl9fZ2V0c3RhdGVfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN0YXRlKSwgMykKKyAgICAgICAgYnl0ZWFycmF5KHN0YXRlWzBdKSAjIENoZWNrIGlmIHN0YXRlWzBdIHN1cHBvcnRzIHRoZSBidWZmZXIgaW50ZXJmYWNlLgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3RhdGVbMV0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3RhdGVbMl0sIGRpY3QpIG9yIHN0YXRlWzJdIGlzIE5vbmUpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uX19nZXRzdGF0ZV9fKQorCisgICAgZGVmIHRlc3Rfc2V0c3RhdGUoc2VsZik6CisgICAgICAgICMgVGhpcyBjaGVja3Mgd2hldGhlciBfX3NldHN0YXRlX18gZG9lcyBwcm9wZXIgaW5wdXQgdmFsaWRhdGlvbi4KKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBtZW1pby5fX3NldHN0YXRlX18oKGIibm8gZXJyb3IiLCAwLCBOb25lKSkKKyAgICAgICAgbWVtaW8uX19zZXRzdGF0ZV9fKChieXRlYXJyYXkoYiJubyBlcnJvciIpLCAwLCBOb25lKSkKKyAgICAgICAgbWVtaW8uX19zZXRzdGF0ZV9fKChiIm5vIGVycm9yIiwgMCwgeydzcGFtJzogM30pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sIChiIiIsIC0xLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sICgidW5pY29kZSIsIDAsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKGIiIiwgMC4wLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sIChiIiIsIDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKGIibGVuLXRlc3QiLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAwKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKGIiY2xvc2VkIiwgMCwgTm9uZSkpCisKKyAgICBjaGVja19zaXplb2YgPSBzdXBwb3J0LmNoZWNrX3NpemVvZgorCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3Rfc2l6ZW9mKHNlbGYpOgorICAgICAgICBiYXNlc2l6ZSA9IHN1cHBvcnQuY2FsY29ianNpemUoYidQMlBQMlAnKQorICAgICAgICBjaGVjayA9IHNlbGYuY2hlY2tfc2l6ZW9mCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqZWN0Ll9fc2l6ZW9mX18oaW8uQnl0ZXNJTygpKSwgYmFzZXNpemUpCisgICAgICAgIGNoZWNrKGlvLkJ5dGVzSU8oKSwgYmFzZXNpemUgKQorICAgICAgICBjaGVjayhpby5CeXRlc0lPKGInYScpLCBiYXNlc2l6ZSArIDEgKyAxICkKKyAgICAgICAgY2hlY2soaW8uQnl0ZXNJTyhiJ2EnICogMTAwMCksIGJhc2VzaXplICsgMTAwMCArIDEgKQorCitjbGFzcyBDU3RyaW5nSU9UZXN0KFB5U3RyaW5nSU9UZXN0KToKKyAgICBpb2NsYXNzID0gaW8uU3RyaW5nSU8KKyAgICBVbnN1cHBvcnRlZE9wZXJhdGlvbiA9IGlvLlVuc3VwcG9ydGVkT3BlcmF0aW9uCisKKyAgICAjIFhYWDogRm9yIHRoZSBQeXRob24gdmVyc2lvbiBvZiBpby5TdHJpbmdJTywgdGhpcyBpcyBoaWdobHkKKyAgICAjIGRlcGVuZGVudCBvbiB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorICAgIGRlZiB0ZXN0X3dpZGVjaGFyKHNlbGYpOgorICAgICAgICBidWYgPSBzZWxmLmJ1ZnR5cGUoIlxVMDAwMjAzMGFcVTAwMDIwMzQ3IikKKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoYnVmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLndyaXRlKGJ1ZiksIGxlbihidWYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgbGVuKGJ1ZikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtaW8uZ2V0dmFsdWUoKSwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLndyaXRlKGJ1ZiksIGxlbihidWYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLnRlbGwoKSwgbGVuKGJ1ZikgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWlvLmdldHZhbHVlKCksIGJ1ZiArIGJ1ZikKKworICAgIGRlZiB0ZXN0X2dldHN0YXRlKHNlbGYpOgorICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIHN0YXRlID0gbWVtaW8uX19nZXRzdGF0ZV9fKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3RhdGUpLCA0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3RhdGVbMF0sIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdGF0ZVsxXSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3RhdGVbMl0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3RhdGVbM10sIGRpY3QpIG9yIHN0YXRlWzNdIGlzIE5vbmUpCisgICAgICAgIG1lbWlvLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWVtaW8uX19nZXRzdGF0ZV9fKQorCisgICAgZGVmIHRlc3Rfc2V0c3RhdGUoc2VsZik6CisgICAgICAgICMgVGhpcyBjaGVja3Mgd2hldGhlciBfX3NldHN0YXRlX18gZG9lcyBwcm9wZXIgaW5wdXQgdmFsaWRhdGlvbi4KKyAgICAgICAgbWVtaW8gPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBtZW1pby5fX3NldHN0YXRlX18oKCJubyBlcnJvciIsICJcbiIsIDAsIE5vbmUpKQorICAgICAgICBtZW1pby5fX3NldHN0YXRlX18oKCJubyBlcnJvciIsICIiLCAwLCB7J3NwYW0nOiAzfSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKCIiLCAiZiIsIDAsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sICgiIiwgIiIsIC0xLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sIChiIiIsICIiLCAwLCBOb25lKSkKKyAgICAgICAgIyB0cnVuayBpcyBtb3JlIHRvbGVyYW50IHRoYW4gcHkzayBvbiB0aGUgdHlwZSBvZiB0aGUgbmV3bGluZSBwYXJhbQorICAgICAgICAjc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sICgiIiwgYiIiLCAwLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sICgiIiwgIiIsIDAuMCwgTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAoIiIsICIiLCAwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18sICgibGVuLXRlc3QiLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1pby5fX3NldHN0YXRlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtaW8uX19zZXRzdGF0ZV9fLCAwKQorICAgICAgICBtZW1pby5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1lbWlvLl9fc2V0c3RhdGVfXywgKCJjbG9zZWQiLCAiIiwgMCwgTm9uZSkpCisKKworY2xhc3MgQ1N0cmluZ0lPUGlja2xlVGVzdChQeVN0cmluZ0lPUGlja2xlVGVzdCk6CisgICAgVW5zdXBwb3J0ZWRPcGVyYXRpb24gPSBpby5VbnN1cHBvcnRlZE9wZXJhdGlvbgorCisgICAgY2xhc3MgaW9jbGFzcyhpby5TdHJpbmdJTyk6CisgICAgICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJldHVybiBwaWNrbGUubG9hZHMocGlja2xlLmR1bXBzKGlvLlN0cmluZ0lPKCphcmdzLCAqKmt3YXJncyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbD0yKSkKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RzID0gW1B5Qnl0ZXNJT1Rlc3QsIFB5U3RyaW5nSU9UZXN0LCBDQnl0ZXNJT1Rlc3QsIENTdHJpbmdJT1Rlc3QsCisgICAgICAgICAgICAgUHlTdHJpbmdJT1BpY2tsZVRlc3QsIENTdHJpbmdJT1BpY2tsZVRlc3RdCisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnlpby5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnlpby5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkNWM1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnlpby5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnlpby5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkNWM1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeWlvLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjVkZGVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weQpAQCAtMCwwICsxLDM2MSBAQAorIiIiVW5pdCB0ZXN0cyBmb3IgdGhlIG1lbW9yeXZpZXcKKworWFhYIFdlIG5lZWQgbW9yZSB0ZXN0cyEgU29tZSB0ZXN0cyBhcmUgaW4gdGVzdF9ieXRlcworIiIiCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IGdjCitpbXBvcnQgd2Vha3JlZgoraW1wb3J0IGFycmF5Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IGlvCisKKworY2xhc3MgQWJzdHJhY3RNZW1vcnlUZXN0czoKKyAgICBzb3VyY2VfYnl0ZXMgPSBiImFiY2RlZiIKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfc291cmNlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2VfYnl0ZXMKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBfdHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBmaWx0ZXIoTm9uZSwgW3NlbGYucm9fdHlwZSwgc2VsZi5yd190eXBlXSkKKworICAgIGRlZiBjaGVja19nZXRpdGVtX3dpdGhfdHlwZShzZWxmLCB0cCk6CisgICAgICAgIGl0ZW0gPSBzZWxmLmdldGl0ZW1fdHlwZQorICAgICAgICBiID0gdHAoc2VsZi5fc291cmNlKQorICAgICAgICBvbGRyZWZjb3VudCA9IHN5cy5nZXRyZWZjb3VudChiKQorICAgICAgICBtID0gc2VsZi5fdmlldyhiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMF0sIGl0ZW0oYiJhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtWzBdLCBieXRlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzVdLCBpdGVtKGIiZiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bLTFdLCBpdGVtKGIiZiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bLTZdLCBpdGVtKGIiYSIpKQorICAgICAgICAjIEJvdW5kcyBjaGVja2luZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IG1bNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogbVstN10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogbVtzeXMubWF4c2l6ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGxhbWJkYTogbVstc3lzLm1heHNpemVdKQorICAgICAgICAjIFR5cGUgY2hlY2tpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1bTm9uZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtWzAuMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBtWyJhIl0pCisgICAgICAgIG0gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KGIpLCBvbGRyZWZjb3VudCkKKworICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZ2V0aXRlbV93aXRoX3R5cGUodHApCisKKyAgICBkZWYgdGVzdF9pdGVyKHNlbGYpOgorICAgICAgICBmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICBiID0gdHAoc2VsZi5fc291cmNlKQorICAgICAgICAgICAgbSA9IHNlbGYuX3ZpZXcoYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtKSwgW21baV0gZm9yIGkgaW4gcmFuZ2UobGVuKG0pKV0pCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICBiID0gdHAoc2VsZi5fc291cmNlKQorICAgICAgICAgICAgbSA9IHNlbGYuX3ZpZXcoYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLl9fcmVwcl9fKCksIHN0cikKKworICAgIGRlZiB0ZXN0X3NldGl0ZW1fcmVhZG9ubHkoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnJvX3R5cGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYiA9IHNlbGYucm9fdHlwZShzZWxmLl9zb3VyY2UpCisgICAgICAgIG9sZHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGIpCisgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCisgICAgICAgIGRlZiBzZXRpdGVtKHZhbHVlKToKKyAgICAgICAgICAgIG1bMF0gPSB2YWx1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGl0ZW0sIGIiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0aXRlbSwgNjUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0aXRlbSwgbWVtb3J5dmlldyhiImEiKSkKKyAgICAgICAgbSA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoYiksIG9sZHJlZmNvdW50KQorCisgICAgZGVmIHRlc3Rfc2V0aXRlbV93cml0YWJsZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucndfdHlwZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cCA9IHNlbGYucndfdHlwZQorICAgICAgICBiID0gc2VsZi5yd190eXBlKHNlbGYuX3NvdXJjZSkKKyAgICAgICAgb2xkcmVmY291bnQgPSBzeXMuZ2V0cmVmY291bnQoYikKKyAgICAgICAgbSA9IHNlbGYuX3ZpZXcoYikKKyAgICAgICAgbVswXSA9IHRwKGIiMCIpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRlbnRzKHRwLCBiLCBiIjBiY2RlZiIpCisgICAgICAgIG1bMTozXSA9IHRwKGIiMTIiKQorICAgICAgICBzZWxmLl9jaGVja19jb250ZW50cyh0cCwgYiwgYiIwMTJkZWYiKQorICAgICAgICBtWzE6MV0gPSB0cChiIiIpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRlbnRzKHRwLCBiLCBiIjAxMmRlZiIpCisgICAgICAgIG1bOl0gPSB0cChiImFiY2RlZiIpCisgICAgICAgIHNlbGYuX2NoZWNrX2NvbnRlbnRzKHRwLCBiLCBiImFiY2RlZiIpCisKKyAgICAgICAgIyBPdmVybGFwcGluZyBjb3BpZXMgb2YgYSB2aWV3IGludG8gaXRzZWxmCisgICAgICAgIG1bMDozXSA9IG1bMjo1XQorICAgICAgICBzZWxmLl9jaGVja19jb250ZW50cyh0cCwgYiwgYiJjZGVkZWYiKQorICAgICAgICBtWzpdID0gdHAoYiJhYmNkZWYiKQorICAgICAgICBtWzI6NV0gPSBtWzA6M10KKyAgICAgICAgc2VsZi5fY2hlY2tfY29udGVudHModHAsIGIsIGIiYWJhYmNmIikKKworICAgICAgICBkZWYgc2V0aXRlbShrZXksIHZhbHVlKToKKyAgICAgICAgICAgIG1ba2V5XSA9IHRwKHZhbHVlKQorICAgICAgICAjIEJvdW5kcyBjaGVja2luZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzZXRpdGVtLCA2LCBiImEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzZXRpdGVtLCAtNywgYiJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgc2V0aXRlbSwgc3lzLm1heHNpemUsIGIiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHNldGl0ZW0sIC1zeXMubWF4c2l6ZSwgYiJhIikKKyAgICAgICAgIyBXcm9uZyBpbmRleC9zbGljZSB0eXBlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGl0ZW0sIDAuMCwgYiJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRpdGVtLCAoMCwpLCBiImEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGl0ZW0sICJhIiwgYiJhIikKKyAgICAgICAgIyBUcnlpbmcgdG8gcmVzaXplIHRoZSBtZW1vcnkgb2JqZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGl0ZW0sIDAsIGIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0aXRlbSwgMCwgYiJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGl0ZW0sIHNsaWNlKDEsMSksIGIiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNldGl0ZW0sIHNsaWNlKDAsMiksIGIiYSIpCisKKyAgICAgICAgbSA9IE5vbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoYiksIG9sZHJlZmNvdW50KQorCisgICAgZGVmIHRlc3RfZGVsaXRlbShzZWxmKToKKyAgICAgICAgZm9yIHRwIGluIHNlbGYuX3R5cGVzOgorICAgICAgICAgICAgYiA9IHRwKHNlbGYuX3NvdXJjZSkKKyAgICAgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICAgICAgZGVsIG1bMV0KKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKKyAgICAgICAgICAgICAgICBkZWwgbVsxOjRdCisKKyAgICBkZWYgdGVzdF90b2J5dGVzKHNlbGYpOgorICAgICAgICBmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICBtID0gc2VsZi5fdmlldyh0cChzZWxmLl9zb3VyY2UpKQorICAgICAgICAgICAgYiA9IG0udG9ieXRlcygpCisgICAgICAgICAgICAjIFRoaXMgY2FsbHMgc2VsZi5nZXRpdGVtX3R5cGUoKSBvbiBlYWNoIHNlcGFyYXRlIGJ5dGUgb2YgYiJhYmNkZWYiCisgICAgICAgICAgICBleHBlY3RlZCA9IGIiIi5qb2luKAorICAgICAgICAgICAgICAgIHNlbGYuZ2V0aXRlbV90eXBlKGMpIGZvciBjIGluIGIiYWJjZGVmIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYiwgYnl0ZXMpCisKKyAgICBkZWYgdGVzdF90b2xpc3Qoc2VsZik6CisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIG0gPSBzZWxmLl92aWV3KHRwKHNlbGYuX3NvdXJjZSkpCisgICAgICAgICAgICBsID0gbS50b2xpc3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLCBtYXAob3JkLCBiImFiY2RlZiIpKQorCisgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKKyAgICAgICAgIyBtZW1vcnl2aWV3cyBjYW4gY29tcGFyZSBmb3IgZXF1YWxpdHkgd2l0aCBvdGhlciBvYmplY3RzCisgICAgICAgICMgaGF2aW5nIHRoZSBidWZmZXIgaW50ZXJmYWNlLgorICAgICAgICBmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICBtID0gc2VsZi5fdmlldyh0cChzZWxmLl9zb3VyY2UpKQorICAgICAgICAgICAgZm9yIHRwX2NvbXAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0gPT0gdHBfY29tcChiImFiY2RlZiIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobSAhPSB0cF9jb21wKGIiYWJjZGVmIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtID09IHRwX2NvbXAoYiJhYmNkZSIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtICE9IHRwX2NvbXAoYiJhYmNkZSIpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobSA9PSB0cF9jb21wKGIiYWJjZGUxIikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0gIT0gdHBfY29tcChiImFiY2RlMSIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0gPT0gbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtID09IG1bOl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobVswOjZdID09IG1bOl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1bMDo1XSA9PSBtKQorCisgICAgICAgICAgICAjIENvbXBhcmlzb24gd2l0aCBvYmplY3RzIHdoaWNoIGRvbid0IHN1cHBvcnQgdGhlIGJ1ZmZlciBBUEkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobSA9PSB1ImFiY2RlZiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSAhPSB1ImFiY2RlZiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUiYWJjZGVmIiA9PSBtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUiYWJjZGVmIiAhPSBtKQorCisgICAgICAgICAgICAjIFVub3JkZXJlZCBjb21wYXJpc29ucyBhcmUgdW5pbXBsZW1lbnRlZCwgYW5kIHRoZXJlZm9yZSBnaXZlCisgICAgICAgICAgICAjIGFyYml0cmFyeSByZXN1bHRzICh0aGV5IHJhaXNlIGEgVHlwZUVycm9yIGluIHB5M2spCisKKyAgICBkZWYgY2hlY2tfYXR0cmlidXRlc193aXRoX3R5cGUoc2VsZiwgdHApOgorICAgICAgICBtID0gc2VsZi5fdmlldyh0cChzZWxmLl9zb3VyY2UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZm9ybWF0LCBzZWxmLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG0uZm9ybWF0LCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5pdGVtc2l6ZSwgc2VsZi5pdGVtc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLm5kaW0sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zaGFwZSwgKDYsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obSksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zdHJpZGVzLCAoc2VsZi5pdGVtc2l6ZSwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uc3Vib2Zmc2V0cywgTm9uZSkKKyAgICAgICAgcmV0dXJuIG0KKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfcmVhZG9ubHkoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnJvX3R5cGU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbSA9IHNlbGYuY2hlY2tfYXR0cmlidXRlc193aXRoX3R5cGUoc2VsZi5yb190eXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmVhZG9ubHksIFRydWUpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX3dyaXRhYmxlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5yd190eXBlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG0gPSBzZWxmLmNoZWNrX2F0dHJpYnV0ZXNfd2l0aF90eXBlKHNlbGYucndfdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJlYWRvbmx5LCBGYWxzZSkKKworICAgICMgRGlzYWJsZWQ6IHVuaWNvZGUgdXNlcyB0aGUgb2xkIGJ1ZmZlciBBUEkgaW4gMi54CisKKyAgICAjZGVmIHRlc3RfZ2V0YnVmZmVyKHNlbGYpOgorICAgICAgICAjIyBUZXN0IFB5T2JqZWN0X0dldEJ1ZmZlcigpIG9uIGEgbWVtb3J5dmlldyBvYmplY3QuCisgICAgICAgICNmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICAjYiA9IHRwKHNlbGYuX3NvdXJjZSkKKyAgICAgICAgICAgICNvbGRyZWZjb3VudCA9IHN5cy5nZXRyZWZjb3VudChiKQorICAgICAgICAgICAgI20gPSBzZWxmLl92aWV3KGIpCisgICAgICAgICAgICAjb2xkdmlld3JlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KG0pCisgICAgICAgICAgICAjcyA9IHVuaWNvZGUobSwgInV0Zi04IikKKyAgICAgICAgICAgICNzZWxmLl9jaGVja19jb250ZW50cyh0cCwgYiwgcy5lbmNvZGUoInV0Zi04IikpCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQobSksIG9sZHZpZXdyZWZjb3VudCkKKyAgICAgICAgICAgICNtID0gTm9uZQorICAgICAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlZmNvdW50KGIpLCBvbGRyZWZjb3VudCkKKworICAgIGRlZiB0ZXN0X2djKHNlbGYpOgorICAgICAgICBmb3IgdHAgaW4gc2VsZi5fdHlwZXM6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0cCwgdHlwZSk6CisgICAgICAgICAgICAgICAgIyBJZiB0cCBpcyBhIGZhY3RvcnkgcmF0aGVyIHRoYW4gYSBwbGFpbiB0eXBlLCBza2lwCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgY2xhc3MgTXlTb3VyY2UodHApOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGNsYXNzIE15T2JqZWN0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgIyBDcmVhdGUgYSByZWZlcmVuY2UgY3ljbGUgdGhyb3VnaCBhIG1lbW9yeXZpZXcgb2JqZWN0CisgICAgICAgICAgICBiID0gTXlTb3VyY2UodHAoYidhYmMnKSkKKyAgICAgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCisgICAgICAgICAgICBvID0gTXlPYmplY3QoKQorICAgICAgICAgICAgYi5tID0gbQorICAgICAgICAgICAgYi5vID0gbworICAgICAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihvKQorICAgICAgICAgICAgYiA9IG0gPSBvID0gTm9uZQorICAgICAgICAgICAgIyBUaGUgY3ljbGUgbXVzdCBiZSBicm9rZW4KKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IoKSkKKworICAgIGRlZiB0ZXN0X3dyaXRhYmxlX3JlYWRvbmx5KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMDQ1MTogbWVtb3J5dmlldyBpbmNvcnJlY3RseSBleHBvc2VzIGEgcmVhZG9ubHkKKyAgICAgICAgIyBidWZmZXIgYXMgd3JpdGFibGUgY2F1c2luZyBhIHNlZ2ZhdWx0IGlmIHVzaW5nIG1tYXAKKyAgICAgICAgdHAgPSBzZWxmLnJvX3R5cGUKKyAgICAgICAgaWYgdHAgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBiID0gdHAoc2VsZi5fc291cmNlKQorICAgICAgICBtID0gc2VsZi5fdmlldyhiKQorICAgICAgICBpID0gaW8uQnl0ZXNJTyhiJ1paWlonKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGkucmVhZGludG8sIG0pCisKKyMgVmFyaWF0aW9ucyBvbiBzb3VyY2Ugb2JqZWN0cyBmb3IgdGhlIGJ1ZmZlcjogYnl0ZXMtbGlrZSBvYmplY3RzLCB0aGVuIGFycmF5cworIyB3aXRoIGl0ZW1zaXplID4gMS4KKyMgTk9URTogc3VwcG9ydCBmb3IgbXVsdGktZGltZW5zaW9uYWwgb2JqZWN0cyBpcyB1bmltcGxlbWVudGVkLgorCitjbGFzcyBCYXNlQnl0ZXNNZW1vcnlUZXN0cyhBYnN0cmFjdE1lbW9yeVRlc3RzKToKKyAgICByb190eXBlID0gYnl0ZXMKKyAgICByd190eXBlID0gYnl0ZWFycmF5CisgICAgZ2V0aXRlbV90eXBlID0gYnl0ZXMKKyAgICBpdGVtc2l6ZSA9IDEKKyAgICBmb3JtYXQgPSAnQicKKworIyBEaXNhYmxlZDogYXJyYXkuYXJyYXkoKSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBuZXcgYnVmZmVyIEFQSSBpbiAyLngKKworI2NsYXNzIEJhc2VBcnJheU1lbW9yeVRlc3RzKEFic3RyYWN0TWVtb3J5VGVzdHMpOgorICAgICNyb190eXBlID0gTm9uZQorICAgICNyd190eXBlID0gbGFtYmRhIHNlbGYsIGI6IGFycmF5LmFycmF5KCdpJywgbWFwKG9yZCwgYikpCisgICAgI2dldGl0ZW1fdHlwZSA9IGxhbWJkYSBzZWxmLCBiOiBhcnJheS5hcnJheSgnaScsIG1hcChvcmQsIGIpKS50b3N0cmluZygpCisgICAgI2l0ZW1zaXplID0gYXJyYXkuYXJyYXkoJ2knKS5pdGVtc2l6ZQorICAgICNmb3JtYXQgPSAnaScKKworICAgICNkZWYgdGVzdF9nZXRidWZmZXIoc2VsZik6CisgICAgICAgICMjIFhYWCBUZXN0IHNob3VsZCBiZSBhZGFwdGVkIGZvciBub24tYnl0ZSBidWZmZXJzCisgICAgICAgICNwYXNzCisKKyAgICAjZGVmIHRlc3RfdG9saXN0KHNlbGYpOgorICAgICAgICAjIyBYWFggTm90SW1wbGVtZW50ZWRFcnJvcjogdG9saXN0KCkgb25seSBzdXBwb3J0cyBieXRlIHZpZXdzCisgICAgICAgICNwYXNzCisKKworIyBWYXJpYXRpb25zIG9uIGluZGlyZWN0aW9uIGxldmVsczogbWVtb3J5dmlldywgc2xpY2Ugb2YgbWVtb3J5dmlldywKKyMgc2xpY2Ugb2Ygc2xpY2Ugb2YgbWVtb3J5dmlldy4KKyMgVGhpcyBpcyBpbXBvcnRhbnQgdG8gdGVzdCBhbGxvY2F0aW9uIHN1YnRsZXRpZXMuCisKK2NsYXNzIEJhc2VNZW1vcnl2aWV3VGVzdHM6CisgICAgZGVmIF92aWV3KHNlbGYsIG9iaik6CisgICAgICAgIHJldHVybiBtZW1vcnl2aWV3KG9iaikKKworICAgIGRlZiBfY2hlY2tfY29udGVudHMoc2VsZiwgdHAsIG9iaiwgY29udGVudHMpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iaiwgdHAoY29udGVudHMpKQorCitjbGFzcyBCYXNlTWVtb3J5U2xpY2VUZXN0czoKKyAgICBzb3VyY2VfYnl0ZXMgPSBiIlhhYmNkZWZZIgorCisgICAgZGVmIF92aWV3KHNlbGYsIG9iaik6CisgICAgICAgIG0gPSBtZW1vcnl2aWV3KG9iaikKKyAgICAgICAgcmV0dXJuIG1bMTo3XQorCisgICAgZGVmIF9jaGVja19jb250ZW50cyhzZWxmLCB0cCwgb2JqLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqWzE6N10sIHRwKGNvbnRlbnRzKSkKKworICAgIGRlZiB0ZXN0X3JlZnMoc2VsZik6CisgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKKyAgICAgICAgICAgIG0gPSBtZW1vcnl2aWV3KHRwKHNlbGYuX3NvdXJjZSkpCisgICAgICAgICAgICBvbGRyZWZjb3VudCA9IHN5cy5nZXRyZWZjb3VudChtKQorICAgICAgICAgICAgbVsxOjJdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChtKSwgb2xkcmVmY291bnQpCisKK2NsYXNzIEJhc2VNZW1vcnlTbGljZVNsaWNlVGVzdHM6CisgICAgc291cmNlX2J5dGVzID0gYiJYYWJjZGVmWSIKKworICAgIGRlZiBfdmlldyhzZWxmLCBvYmopOgorICAgICAgICBtID0gbWVtb3J5dmlldyhvYmopCisgICAgICAgIHJldHVybiBtWzo3XVsxOl0KKworICAgIGRlZiBfY2hlY2tfY29udGVudHMoc2VsZiwgdHAsIG9iaiwgY29udGVudHMpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9ialsxOjddLCB0cChjb250ZW50cykpCisKKworIyBDb25jcmV0ZSB0ZXN0IGNsYXNzZXMKKworY2xhc3MgQnl0ZXNNZW1vcnl2aWV3VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwKKyAgICBCYXNlTWVtb3J5dmlld1Rlc3RzLCBCYXNlQnl0ZXNNZW1vcnlUZXN0cyk6CisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgZm9yIHRwIGluIHNlbGYuX3R5cGVzOgorICAgICAgICAgICAgb2IgPSB0cChzZWxmLl9zb3VyY2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWVtb3J5dmlldyhvYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWVtb3J5dmlldyhvYmplY3Q9b2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1vcnl2aWV3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1vcnl2aWV3LCBvYiwgb2IpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1lbW9yeXZpZXcsIGFyZ3VtZW50PW9iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1vcnl2aWV3LCBvYiwgYXJndW1lbnQ9VHJ1ZSkKKworI2NsYXNzIEFycmF5TWVtb3J5dmlld1Rlc3QodW5pdHRlc3QuVGVzdENhc2UsCisgICAgI0Jhc2VNZW1vcnl2aWV3VGVzdHMsIEJhc2VBcnJheU1lbW9yeVRlc3RzKToKKworICAgICNkZWYgdGVzdF9hcnJheV9hc3NpZ24oc2VsZik6CisgICAgICAgICMjIElzc3VlICM0NTY5OiBzZWdmYXVsdCB3aGVuIG11dGF0aW5nIGEgbWVtb3J5dmlldyB3aXRoIGl0ZW1zaXplICE9IDEKKyAgICAgICAgI2EgPSBhcnJheS5hcnJheSgnaScsIHJhbmdlKDEwKSkKKyAgICAgICAgI20gPSBtZW1vcnl2aWV3KGEpCisgICAgICAgICNuZXdfYSA9IGFycmF5LmFycmF5KCdpJywgcmFuZ2UoOSwgLTEsIC0xKSkKKyAgICAgICAgI21bOl0gPSBuZXdfYQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChhLCBuZXdfYSkKKworCitjbGFzcyBCeXRlc01lbW9yeVNsaWNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwKKyAgICBCYXNlTWVtb3J5U2xpY2VUZXN0cywgQmFzZUJ5dGVzTWVtb3J5VGVzdHMpOgorICAgIHBhc3MKKworI2NsYXNzIEFycmF5TWVtb3J5U2xpY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLAorICAgICNCYXNlTWVtb3J5U2xpY2VUZXN0cywgQmFzZUFycmF5TWVtb3J5VGVzdHMpOgorICAgICNwYXNzCisKK2NsYXNzIEJ5dGVzTWVtb3J5U2xpY2VTbGljZVRlc3QodW5pdHRlc3QuVGVzdENhc2UsCisgICAgQmFzZU1lbW9yeVNsaWNlU2xpY2VUZXN0cywgQmFzZUJ5dGVzTWVtb3J5VGVzdHMpOgorICAgIHBhc3MKKworI2NsYXNzIEFycmF5TWVtb3J5U2xpY2VTbGljZVRlc3QodW5pdHRlc3QuVGVzdENhc2UsCisgICAgI0Jhc2VNZW1vcnlTbGljZVNsaWNlVGVzdHMsIEJhc2VBcnJheU1lbW9yeVRlc3RzKToKKyAgICAjcGFzcworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeXZpZXcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGI3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21lbW9yeXZpZXcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGI3ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21obGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5NmRmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weQpAQCAtMCwwICsxLDM0OCBAQAorIiIiCisgICBUZXN0cyBmb3IgdGhlIG1obGliIG1vZHVsZQorICAgTmljayBNYXRoZXdzb24KKyIiIgorCisjIyMgQlVHOiBUaGlzIHN1aXRlIGRvZXNuJ3QgY3VycmVudGx5IHRlc3QgdGhlIG1pbWUgZnVuY3Rpb25hbGl0eSBvZgorIyMjICAgICAgbWhsaWIuICBJdCBzaG91bGQuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIGltcG9ydF9tb2R1bGUKK2ltcG9ydCBvcywgU3RyaW5nSU8KK2ltcG9ydCBzeXMKK21obGliID0gaW1wb3J0X21vZHVsZSgnbWhsaWInLCBkZXByZWNhdGVkPVRydWUpCisKK2lmIChzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgid2luIikgb3Igc3lzLnBsYXRmb3JtPT0icmlzY29zIiBvcgorICAgICAgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoImF0aGVvcyIpKToKKyAgICAjIG1obGliLnVwZGF0ZWxpbmUoKSByZW5hbWVzIGEgZmlsZSB0byB0aGUgbmFtZSBvZiBhIGZpbGUgdGhhdCBhbHJlYWR5CisgICAgIyBleGlzdHMuICBUaGF0IGNhdXNlcyBhIHJlYXNvbmFibGUgT1MgPHdpbms+IHRvIGNvbXBsYWluIGluIHRlc3Rfc2VxdWVuY2UKKyAgICAjIGhlcmUsIGxpa2UgdGhlICJPU0Vycm9yOiBbRXJybm8gMTddIEZpbGUgZXhpc3RzIiByYWlzZWQgb24gV2luZG93cy4KKyAgICAjIG1obGliJ3MgbGlzdHN1YmZvbGRlcnMoKSBhbmQgbGlzdGFsbGZvbGRlcnMoKSBkbyBzb21ldGhpbmcgd2l0aAorICAgICMgbGluayBjb3VudHMsIGFuZCB0aGF0IGNhdXNlcyB0ZXN0X2xpc3Rmb2xkZXJzKCkgaGVyZSB0byBnZXQgYmFjaworICAgICMgYW4gZW1wdHkgbGlzdCBmcm9tIGl0cyBjYWxsIG9mIGxpc3RhbGxmb2xkZXJzKCkuCisgICAgIyBUaGUgb3RoZXIgdGVzdHMgaGVyZSBwYXNzIG9uIFdpbmRvd3MuCisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInNraXBwZWQgb24gJXMgLS0gIiAlIHN5cy5wbGF0Zm9ybSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvbyBtYW55IFVuaXggYXNzdW1wdGlvbnMiKQorCitfbWhyb290ID0gVEVTVEZOKyJfTUgiCitfbWhwYXRoID0gb3MucGF0aC5qb2luKF9taHJvb3QsICJNSCIpCitfbWhwcm9maWxlID0gb3MucGF0aC5qb2luKF9taHJvb3QsICIubWhfcHJvZmlsZSIpCisKK2RlZiBub3JtRihmKToKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKCpmLnNwbGl0KCcvJykpCisKK2RlZiB3cml0ZUZpbGUoZm5hbWUsIGNvbnRlbnRzKToKKyAgICBkaXIgPSBvcy5wYXRoLnNwbGl0KGZuYW1lKVswXQorICAgIGlmIGRpciBhbmQgbm90IG9zLnBhdGguZXhpc3RzKGRpcik6CisgICAgICAgIG1rZGlycyhkaXIpCisgICAgZiA9IG9wZW4oZm5hbWUsICd3JykKKyAgICBmLndyaXRlKGNvbnRlbnRzKQorICAgIGYuY2xvc2UoKQorCitkZWYgcmVhZEZpbGUoZm5hbWUpOgorICAgIGYgPSBvcGVuKGZuYW1lKQorICAgIHIgPSBmLnJlYWQoKQorICAgIGYuY2xvc2UoKQorICAgIHJldHVybiByCisKK2RlZiB3cml0ZVByb2ZpbGUoZGljdCk6CisgICAgY29udGVudHMgPSBbICIlczogJXNcbiIgJSAoaywgdikgZm9yIGssIHYgaW4gZGljdC5pdGVyaXRlbXMoKSBdCisgICAgd3JpdGVGaWxlKF9taHByb2ZpbGUsICIiLmpvaW4oY29udGVudHMpKQorCitkZWYgd3JpdGVDb250ZXh0KGZvbGRlcik6CisgICAgZm9sZGVyID0gbm9ybUYoZm9sZGVyKQorICAgIHdyaXRlRmlsZShvcy5wYXRoLmpvaW4oX21ocGF0aCwgImNvbnRleHQiKSwKKyAgICAgICAgICAgICAgIkN1cnJlbnQtRm9sZGVyOiAlc1xuIiAlIGZvbGRlcikKKworZGVmIHdyaXRlQ3VyTWVzc2FnZShmb2xkZXIsIGN1cik6CisgICAgZm9sZGVyID0gbm9ybUYoZm9sZGVyKQorICAgIHdyaXRlRmlsZShvcy5wYXRoLmpvaW4oX21ocGF0aCwgZm9sZGVyLCAiLm1oX3NlcXVlbmNlcyIpLAorICAgICAgICAgICAgICAiY3VyOiAlc1xuIiVjdXIpCisKK2RlZiB3cml0ZU1lc3NhZ2UoZm9sZGVyLCBuLCBoZWFkZXJzLCBib2R5KToKKyAgICBmb2xkZXIgPSBub3JtRihmb2xkZXIpCisgICAgaGVhZGVycyA9ICIiLmpvaW4oWyAiJXM6ICVzXG4iICUgKGssIHYpIGZvciBrLCB2IGluIGhlYWRlcnMuaXRlcml0ZW1zKCkgXSkKKyAgICBjb250ZW50cyA9ICIlc1xuJXNcbiIgJSAoaGVhZGVycyxib2R5KQorICAgIG1rZGlycyhvcy5wYXRoLmpvaW4oX21ocGF0aCwgZm9sZGVyKSkKKyAgICB3cml0ZUZpbGUob3MucGF0aC5qb2luKF9taHBhdGgsIGZvbGRlciwgc3RyKG4pKSwgY29udGVudHMpCisKK2RlZiBnZXRNSCgpOgorICAgIHJldHVybiBtaGxpYi5NSChvcy5wYXRoLmFic3BhdGgoX21ocGF0aCksIF9taHByb2ZpbGUpCisKK2RlZiBzb3J0TGluZXMocyk6CisgICAgbGluZXMgPSBzLnNwbGl0KCJcbiIpCisgICAgbGluZXMgPSBbIGxpbmUuc3RyaXAoKSBmb3IgbGluZSBpbiBsaW5lcyBpZiBsZW4obGluZSkgPj0gMiBdCisgICAgbGluZXMuc29ydCgpCisgICAgcmV0dXJuIGxpbmVzCisKKyMgVGhlc2UgbmV4dCAyIGZ1bmN0aW9ucyBhcmUgY29waWVkIGZyb20gdGVzdF9nbG9iLnB5LgorZGVmIG1rZGlycyhmbmFtZSk6CisgICAgaWYgb3MucGF0aC5leGlzdHMoZm5hbWUpIG9yIGZuYW1lID09ICcnOgorICAgICAgICByZXR1cm4KKyAgICBiYXNlLCBmaWxlID0gb3MucGF0aC5zcGxpdChmbmFtZSkKKyAgICBta2RpcnMoYmFzZSkKKyAgICBvcy5ta2RpcihmbmFtZSkKKworZGVmIGRlbHRyZWUoZm5hbWUpOgorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmbmFtZSk6CisgICAgICAgIHJldHVybgorICAgIGZvciBmIGluIG9zLmxpc3RkaXIoZm5hbWUpOgorICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihmbmFtZSwgZikKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSk6CisgICAgICAgICAgICBkZWx0cmVlKGZ1bGxuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmdWxsbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgICBvcy5ybWRpcihmbmFtZSkKKyAgICBleGNlcHQ6CisgICAgICAgIHBhc3MKKworY2xhc3MgTWhsaWJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBkZWx0cmVlKF9taHJvb3QpCisgICAgICAgIG1rZGlycyhfbWhwYXRoKQorICAgICAgICB3cml0ZVByb2ZpbGUoeydQYXRoJyA6IG9zLnBhdGguYWJzcGF0aChfbWhwYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAnRWRpdG9yJzogJ2VtYWNzJywKKyAgICAgICAgICAgICAgICAgICAgICAnaWdub3JlZC1hdHRyaWJ1dGUnOiAnY2FtcGluZyBob2xpZGF5J30pCisgICAgICAgICMgTm90ZTogVGhlc2UgaGVhZGVycyBhcmVuJ3QgcmVhbGx5IGNvbmZvcm1hbnQgdG8gUkZDODIyLCBidXQKKyAgICAgICAgIyAgbWhsaWIgc2hvdWxkbid0IGNhcmUgYWJvdXQgdGhhdC4KKworICAgICAgICAjIEFuIGluYm94IHdpdGggYSBjb3VwbGUgb2YgbWVzc2FnZXMuCisgICAgICAgIHdyaXRlTWVzc2FnZSgnaW5ib3gnLCAxLAorICAgICAgICAgICAgICAgICAgICAgeydGcm9tJzogJ01ycy4gUHJlbWlzZScsCisgICAgICAgICAgICAgICAgICAgICAgJ1RvJzogJ01ycy4gQ29uY2x1c2lvbicsCisgICAgICAgICAgICAgICAgICAgICAgJ0RhdGUnOiAnMTggSnVseSAyMDAxJ30sICJIdWxsbywgTXJzLiBDb25jbHVzaW9uIVxuIikKKyAgICAgICAgd3JpdGVNZXNzYWdlKCdpbmJveCcsIDIsCisgICAgICAgICAgICAgICAgICAgICB7J0Zyb20nOiAnTXJzLiBDb25jbHVzaW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAnVG8nOiAnTXJzLiBQcmVtaXNlJywKKyAgICAgICAgICAgICAgICAgICAgICAnRGF0ZSc6ICcyOSBKdWx5IDIwMDEnfSwgIkh1bGxvLCBNcnMuIFByZW1pc2UhXG4iKQorCisgICAgICAgICMgQSBmb2xkZXIgd2l0aCBtYW55IG1lc3NhZ2VzCisgICAgICAgIGZvciBpIGluIHJhbmdlKDUsIDEwMSkrcmFuZ2UoMTAxLCAyMDEsIDIpOgorICAgICAgICAgICAgd3JpdGVNZXNzYWdlKCd3aWRlJywgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB7J0Zyb20nOiAnbm93aGVyZScsICdTdWJqZWN0JzogJ21lc3NhZ2UgIyVzJyAlIGl9LAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIG1lc3NhZ2UgbnVtYmVyICVzXG4iICUgaSkKKworICAgICAgICAjIEEgZGVlcGx5IG5lc3RlZCBmb2xkZXIKKyAgICAgICAgZGVmIGRlZXAoZm9sZGVyLCBuKToKKyAgICAgICAgICAgIHdyaXRlTWVzc2FnZShmb2xkZXIsIG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgeydTdWJqZWN0JzogJ01lc3NhZ2UgJXMvJXMnICUgKGZvbGRlciwgbikgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBtZXNzYWdlIG51bWJlciAlcyBpbiAlc1xuIiAlIChuLCBmb2xkZXIpICkKKyAgICAgICAgZGVlcCgnZGVlcC9mMScsIDEpCisgICAgICAgIGRlZXAoJ2RlZXAvZjEnLCAyKQorICAgICAgICBkZWVwKCdkZWVwL2YxJywgMykKKyAgICAgICAgZGVlcCgnZGVlcC9mMicsIDQpCisgICAgICAgIGRlZXAoJ2RlZXAvZjInLCA2KQorICAgICAgICBkZWVwKCdkZWVwJywgMykKKyAgICAgICAgZGVlcCgnZGVlcC9mMi9mMycsIDEpCisgICAgICAgIGRlZXAoJ2RlZXAvZjIvZjMnLCAyKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBkZWx0cmVlKF9taHJvb3QpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgd3JpdGVDb250ZXh0KCdpbmJveCcpCisgICAgICAgIHdyaXRlQ3VyTWVzc2FnZSgnaW5ib3gnLCAyKQorICAgICAgICBtaCA9IGdldE1IKCkKKworICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEobWguZ2V0cHJvZmlsZSgnRWRpdG9yJyksICdlbWFjcycpCisgICAgICAgIGVxKG1oLmdldHByb2ZpbGUoJ25vdC1zZXQnKSwgTm9uZSkKKyAgICAgICAgZXEobWguZ2V0cGF0aCgpLCBvcy5wYXRoLmFic3BhdGgoX21ocGF0aCkpCisgICAgICAgIGVxKG1oLmdldGNvbnRleHQoKSwgJ2luYm94JykKKworICAgICAgICBtaC5zZXRjb250ZXh0KCd3aWRlJykKKyAgICAgICAgZXEobWguZ2V0Y29udGV4dCgpLCAnd2lkZScpCisgICAgICAgIGVxKHJlYWRGaWxlKG9zLnBhdGguam9pbihfbWhwYXRoLCAnY29udGV4dCcpKSwKKyAgICAgICAgICAgIkN1cnJlbnQtRm9sZGVyOiB3aWRlXG4iKQorCisgICAgICAgIG1oLnNldGNvbnRleHQoJ2luYm94JykKKworICAgICAgICBpbmJveCA9IG1oLm9wZW5mb2xkZXIoJ2luYm94JykKKyAgICAgICAgZXEoaW5ib3guZ2V0ZnVsbG5hbWUoKSwKKyAgICAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChfbWhwYXRoKSwgJ2luYm94JykpCisgICAgICAgIGVxKGluYm94LmdldHNlcXVlbmNlc2ZpbGVuYW1lKCksCisgICAgICAgICAgIG9zLnBhdGguam9pbihvcy5wYXRoLmFic3BhdGgoX21ocGF0aCksICdpbmJveCcsICcubWhfc2VxdWVuY2VzJykpCisgICAgICAgIGVxKGluYm94LmdldG1lc3NhZ2VmaWxlbmFtZSgxKSwKKyAgICAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguYWJzcGF0aChfbWhwYXRoKSwgJ2luYm94JywgJzEnKSkKKworICAgIGRlZiB0ZXN0X2xpc3Rmb2xkZXJzKHNlbGYpOgorICAgICAgICBtaCA9IGdldE1IKCkKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgZm9sZGVycyA9IG1oLmxpc3Rmb2xkZXJzKCkKKyAgICAgICAgZm9sZGVycy5zb3J0KCkKKyAgICAgICAgZXEoZm9sZGVycywgWydkZWVwJywgJ2luYm94JywgJ3dpZGUnXSkKKworICAgICAgICBmb2xkZXJzID0gbWgubGlzdGFsbGZvbGRlcnMoKQorICAgICAgICBmb2xkZXJzLnNvcnQoKQorICAgICAgICB0Zm9sZGVycyA9IG1hcChub3JtRiwgWydkZWVwJywgJ2RlZXAvZjEnLCAnZGVlcC9mMicsICdkZWVwL2YyL2YzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luYm94JywgJ3dpZGUnXSkKKyAgICAgICAgdGZvbGRlcnMuc29ydCgpCisgICAgICAgIGVxKGZvbGRlcnMsIHRmb2xkZXJzKQorCisgICAgICAgIGZvbGRlcnMgPSBtaC5saXN0c3ViZm9sZGVycygnZGVlcCcpCisgICAgICAgIGZvbGRlcnMuc29ydCgpCisgICAgICAgIGVxKGZvbGRlcnMsIG1hcChub3JtRiwgWydkZWVwL2YxJywgJ2RlZXAvZjInXSkpCisKKyAgICAgICAgZm9sZGVycyA9IG1oLmxpc3RhbGxzdWJmb2xkZXJzKCdkZWVwJykKKyAgICAgICAgZm9sZGVycy5zb3J0KCkKKyAgICAgICAgZXEoZm9sZGVycywgbWFwKG5vcm1GLCBbJ2RlZXAvZjEnLCAnZGVlcC9mMicsICdkZWVwL2YyL2YzJ10pKQorICAgICAgICBlcShtaC5saXN0c3ViZm9sZGVycyhub3JtRignZGVlcC9mMicpKSwgW25vcm1GKCdkZWVwL2YyL2YzJyldKQorCisgICAgICAgIGVxKG1oLmxpc3RzdWJmb2xkZXJzKCdpbmJveCcpLCBbXSkKKyAgICAgICAgZXEobWgubGlzdGFsbHN1YmZvbGRlcnMoJ2luYm94JyksIFtdKQorCisgICAgZGVmIHRlc3Rfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgIG1oID0gZ2V0TUgoKQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgd3JpdGVDdXJNZXNzYWdlKCd3aWRlJywgNTUpCisKKyAgICAgICAgZiA9IG1oLm9wZW5mb2xkZXIoJ3dpZGUnKQorICAgICAgICBhbGwgPSBmLmxpc3RtZXNzYWdlcygpCisgICAgICAgIGVxKGFsbCwgcmFuZ2UoNSwgMTAxKStyYW5nZSgxMDEsIDIwMSwgMikpCisgICAgICAgIGVxKGYuZ2V0Y3VycmVudCgpLCA1NSkKKyAgICAgICAgZi5zZXRjdXJyZW50KDk5KQorICAgICAgICBlcShyZWFkRmlsZShvcy5wYXRoLmpvaW4oX21ocGF0aCwgJ3dpZGUnLCAnLm1oX3NlcXVlbmNlcycpKSwKKyAgICAgICAgICAgJ2N1cjogOTlcbicpCisKKyAgICAgICAgZGVmIHNlcWVxKHNlcSwgdmFsKToKKyAgICAgICAgICAgIGVxKGYucGFyc2VzZXF1ZW5jZShzZXEpLCB2YWwpCisKKyAgICAgICAgc2VxZXEoJzUtNTUnLCByYW5nZSg1LCA1NikpCisgICAgICAgIHNlcWVxKCc5MC0xMDgnLCByYW5nZSg5MCwgMTAxKStyYW5nZSgxMDEsIDEwOSwgMikpCisgICAgICAgIHNlcWVxKCc5MC0xMDgnLCByYW5nZSg5MCwgMTAxKStyYW5nZSgxMDEsIDEwOSwgMikpCisKKyAgICAgICAgc2VxZXEoJzEwOjEwJywgcmFuZ2UoMTAsIDIwKSkKKyAgICAgICAgc2VxZXEoJzEwOisxMCcsIHJhbmdlKDEwLCAyMCkpCisgICAgICAgIHNlcWVxKCcxMDE6MTAnLCByYW5nZSgxMDEsIDEyMSwgMikpCisKKyAgICAgICAgc2VxZXEoJ2N1cicsIFs5OV0pCisgICAgICAgIHNlcWVxKCcuJywgWzk5XSkKKyAgICAgICAgc2VxZXEoJ3ByZXYnLCBbOThdKQorICAgICAgICBzZXFlcSgnbmV4dCcsIFsxMDBdKQorICAgICAgICBzZXFlcSgnY3VyOi0zJywgWzk3LCA5OCwgOTldKQorICAgICAgICBzZXFlcSgnZmlyc3QtY3VyJywgcmFuZ2UoNSwgMTAwKSkKKyAgICAgICAgc2VxZXEoJzE1MC1sYXN0JywgcmFuZ2UoMTUxLCAyMDEsIDIpKQorICAgICAgICBzZXFlcSgncHJldi1uZXh0JywgWzk4LCA5OSwgMTAwXSkKKworICAgICAgICBsb3dwcmltZXMgPSBbNSwgNywgMTEsIDEzLCAxNywgMTksIDIzLCAyOV0KKyAgICAgICAgbG93Y29tcG9zID0gW3ggZm9yIHggaW4gcmFuZ2UoNSwgMzEpIGlmIG5vdCB4IGluIGxvd3ByaW1lcyBdCisgICAgICAgIGYucHV0c2VxdWVuY2VzKHsnY3VyJzogWzVdLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2xvd3ByaW1lJzogbG93cHJpbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2xvd2NvbXBvcyc6IGxvd2NvbXBvc30pCisgICAgICAgIHNlcXMgPSByZWFkRmlsZShvcy5wYXRoLmpvaW4oX21ocGF0aCwgJ3dpZGUnLCAnLm1oX3NlcXVlbmNlcycpKQorICAgICAgICBzZXFzID0gc29ydExpbmVzKHNlcXMpCisgICAgICAgIGVxKHNlcXMsIFsiY3VyOiA1IiwKKyAgICAgICAgICAgICAgICAgICJsb3djb21wb3M6IDYgOC0xMCAxMiAxNC0xNiAxOCAyMC0yMiAyNC0yOCAzMCIsCisgICAgICAgICAgICAgICAgICAibG93cHJpbWU6IDUgNyAxMSAxMyAxNyAxOSAyMyAyOSJdKQorCisgICAgICAgIHNlcWVxKCdsb3dwcmltZScsIGxvd3ByaW1lcykKKyAgICAgICAgc2VxZXEoJ2xvd3ByaW1lOjEnLCBbNV0pCisgICAgICAgIHNlcWVxKCdsb3dwcmltZToyJywgWzUsIDddKQorICAgICAgICBzZXFlcSgnbG93cHJpbWU6LTInLCBbMjMsIDI5XSkKKworICAgICAgICAjIyBOb3Qgc3VwcG9ydGVkCisgICAgICAgICNzZXFlcSgnbG93cHJpbWU6Zmlyc3QnLCBbNV0pCisgICAgICAgICNzZXFlcSgnbG93cHJpbWU6bGFzdCcsIFsyOV0pCisgICAgICAgICNzZXFlcSgnbG93cHJpbWU6cHJldicsIFsyOV0pCisgICAgICAgICNzZXFlcSgnbG93cHJpbWU6bmV4dCcsIFsyOV0pCisKKyAgICBkZWYgdGVzdF9tb2RpZnkoc2VsZik6CisgICAgICAgIG1oID0gZ2V0TUgoKQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBtaC5tYWtlZm9sZGVyKCJkdW1teTEiKQorICAgICAgICBzZWxmLmFzc2VydEluKCJkdW1teTEiLCBtaC5saXN0Zm9sZGVycygpKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKF9taHBhdGgsICJkdW1teTEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMocGF0aCkpCisKKyAgICAgICAgZiA9IG1oLm9wZW5mb2xkZXIoJ2R1bW15MScpCisgICAgICAgIGRlZiBjcmVhdGUobik6CisgICAgICAgICAgICBtc2cgPSAiRnJvbTogZm9vXG5TdWJqZWN0OiAlc1xuXG5EdW1teSBNZXNzYWdlICVzXG4iICUgKG4sbikKKyAgICAgICAgICAgIGYuY3JlYXRlbWVzc2FnZShuLCBTdHJpbmdJTy5TdHJpbmdJTyhtc2cpKQorCisgICAgICAgIGNyZWF0ZSg3KQorICAgICAgICBjcmVhdGUoOCkKKyAgICAgICAgY3JlYXRlKDkpCisKKyAgICAgICAgZXEocmVhZEZpbGUoZi5nZXRtZXNzYWdlZmlsZW5hbWUoOSkpLAorICAgICAgICAgICAiRnJvbTogZm9vXG5TdWJqZWN0OiA5XG5cbkR1bW15IE1lc3NhZ2UgOVxuIikKKworICAgICAgICBlcShmLmxpc3RtZXNzYWdlcygpLCBbNywgOCwgOV0pCisgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihwYXRoKQorICAgICAgICBmaWxlcy5zb3J0KCkKKyAgICAgICAgZXEoZmlsZXMsIFsnNycsICc4JywgJzknXSkKKworICAgICAgICBmLnJlbW92ZW1lc3NhZ2VzKFsnNycsICc4J10pCisgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihwYXRoKQorICAgICAgICBmaWxlcy5zb3J0KCkKKyAgICAgICAgZXEoZmlsZXMsIFsnLDcnLCAnLDgnLCAnOSddKQorICAgICAgICBlcShmLmxpc3RtZXNzYWdlcygpLCBbOV0pCisgICAgICAgIGNyZWF0ZSgxMCkKKyAgICAgICAgY3JlYXRlKDExKQorICAgICAgICBjcmVhdGUoMTIpCisKKyAgICAgICAgbWgubWFrZWZvbGRlcigiZHVtbXkyIikKKyAgICAgICAgZjIgPSBtaC5vcGVuZm9sZGVyKCJkdW1teTIiKQorICAgICAgICBlcShmMi5saXN0bWVzc2FnZXMoKSwgW10pCisgICAgICAgIGYubW92ZW1lc3NhZ2UoMTAsIGYyLCAzKQorICAgICAgICBmLm1vdmVtZXNzYWdlKDExLCBmMiwgNSkKKyAgICAgICAgZXEoZi5saXN0bWVzc2FnZXMoKSwgWzksIDEyXSkKKyAgICAgICAgZXEoZjIubGlzdG1lc3NhZ2VzKCksIFszLCA1XSkKKyAgICAgICAgZXEocmVhZEZpbGUoZjIuZ2V0bWVzc2FnZWZpbGVuYW1lKDMpKSwKKyAgICAgICAgICAgIkZyb206IGZvb1xuU3ViamVjdDogMTBcblxuRHVtbXkgTWVzc2FnZSAxMFxuIikKKworICAgICAgICBmLmNvcHltZXNzYWdlKDksIGYyLCA0KQorICAgICAgICBlcShmLmxpc3RtZXNzYWdlcygpLCBbOSwgMTJdKQorICAgICAgICBlcShyZWFkRmlsZShmMi5nZXRtZXNzYWdlZmlsZW5hbWUoNCkpLAorICAgICAgICAgICAiRnJvbTogZm9vXG5TdWJqZWN0OiA5XG5cbkR1bW15IE1lc3NhZ2UgOVxuIikKKworICAgICAgICBmLnJlZmlsZW1lc3NhZ2VzKFs5LCAxMl0sIGYyKQorICAgICAgICBlcShmLmxpc3RtZXNzYWdlcygpLCBbXSkKKyAgICAgICAgZXEoZjIubGlzdG1lc3NhZ2VzKCksIFszLCA0LCA1LCA2LCA3XSkKKyAgICAgICAgZXEocmVhZEZpbGUoZjIuZ2V0bWVzc2FnZWZpbGVuYW1lKDcpKSwKKyAgICAgICAgICAgIkZyb206IGZvb1xuU3ViamVjdDogMTJcblxuRHVtbXkgTWVzc2FnZSAxMlxuIikKKyAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgY2hlY2sgdGhhdCBfY29weXNlcXVlbmNlcyBkb2VzIHRoZSByaWdodCB0aGluZy4KKworICAgICAgICBtaC5kZWxldGVmb2xkZXIoJ2R1bW15MScpCisgICAgICAgIG1oLmRlbGV0ZWZvbGRlcignZHVtbXkyJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignZHVtbXkxJywgbWgubGlzdGZvbGRlcnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSkKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIG1oID0gZ2V0TUgoKQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICBmID0gbWgub3BlbmZvbGRlcignaW5ib3gnKQorICAgICAgICBtc2cgPSBmLm9wZW5tZXNzYWdlKDEpCisgICAgICAgICMgQ2hlY2sgc29tZSBiYXNpYyBzdHVmZiBmcm9tIHJmYzgyMgorICAgICAgICBlcShtc2cuZ2V0aGVhZGVyKCdGcm9tJyksICJNcnMuIFByZW1pc2UiKQorICAgICAgICBlcShtc2cuZ2V0aGVhZGVyKCdUbycpLCAiTXJzLiBDb25jbHVzaW9uIikKKworICAgICAgICAjIE9rYXksIHdlIGhhdmUgdGhlIHJpZ2h0IG1lc3NhZ2UuICBMZXQncyBjaGVjayB0aGUgc3R1ZmYgZnJvbQorICAgICAgICAjIG1obGliLgorICAgICAgICBsaW5lcyA9IHNvcnRMaW5lcyhtc2cuZ2V0aGVhZGVydGV4dCgpKQorICAgICAgICBlcShsaW5lcywgWyJEYXRlOiAxOCBKdWx5IDIwMDEiLAorICAgICAgICAgICAgICAgICAgICJGcm9tOiBNcnMuIFByZW1pc2UiLAorICAgICAgICAgICAgICAgICAgICJUbzogTXJzLiBDb25jbHVzaW9uIl0pCisgICAgICAgIGxpbmVzID0gc29ydExpbmVzKG1zZy5nZXRoZWFkZXJ0ZXh0KGxhbWJkYSBoOiBsZW4oaCk9PTQpKQorICAgICAgICBlcShsaW5lcywgWyJEYXRlOiAxOCBKdWx5IDIwMDEiLAorICAgICAgICAgICAgICAgICAgICJGcm9tOiBNcnMuIFByZW1pc2UiXSkKKyAgICAgICAgZXEobXNnLmdldGJvZHl0ZXh0KCksICJIdWxsbywgTXJzLiBDb25jbHVzaW9uIVxuXG4iKQorICAgICAgICBlcShtc2cuZ2V0Ym9keXRleHQoMCksICJIdWxsbywgTXJzLiBDb25jbHVzaW9uIVxuXG4iKQorCisgICAgICAgICMgWFhYWCB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IHRvIHJlY2xhaW0gdGhlIGZpbGUgaGFuZGxlCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIGRlbCBtc2cKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE1obGliVGVzdHMpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWhsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWhsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTEyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWhsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWhsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTEyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YTI2ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldG9vbHMucHkKQEAgLTAsMCArMSw1MyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgU3RyaW5nSU8KKworbWltZXRvb2xzID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoIm1pbWV0b29scyIsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworbXNndGV4dDEgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTy5TdHJpbmdJTygKKyIiIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1pc28tODg1OS0xOyBmb3JtYXQ9Zmxvd2VkCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CisKK0ZvbyEKKyIiIikpCisKK2NsYXNzIE1pbWVUb29sc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZGVjb2RlZW5jb2RlKHNlbGYpOgorICAgICAgICBzdGFydCA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgIj0iICsgc3RyaW5nLmRpZ2l0cyArICJcbiIKKyAgICAgICAgZm9yIGVuYyBpbiBbJzdiaXQnLCc4Yml0JywnYmFzZTY0JywncXVvdGVkLXByaW50YWJsZScsCisgICAgICAgICAgICAgICAgICAgICd1dWVuY29kZScsICd4LXV1ZW5jb2RlJywgJ3V1ZScsICd4LXV1ZSddOgorICAgICAgICAgICAgaSA9IFN0cmluZ0lPLlN0cmluZ0lPKHN0YXJ0KQorICAgICAgICAgICAgbyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIG1pbWV0b29scy5lbmNvZGUoaSwgbywgZW5jKQorICAgICAgICAgICAgaSA9IFN0cmluZ0lPLlN0cmluZ0lPKG8uZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgIG8gPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBtaW1ldG9vbHMuZGVjb2RlKGksIG8sIGVuYykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5nZXR2YWx1ZSgpLCBzdGFydCkKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBzID0gc2V0KFsiIl0pCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgbmIgPSBtaW1ldG9vbHMuY2hvb3NlX2JvdW5kYXJ5KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4obmIsIHMpCisgICAgICAgICAgICBzLmFkZChuYikKKworICAgIGRlZiB0ZXN0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgIG1zZyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPLlN0cmluZ0lPKG1zZ3RleHQxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0dHlwZSgpLCAidGV4dC9wbGFpbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldG1haW50eXBlKCksICJ0ZXh0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0c3VidHlwZSgpLCAicGxhaW4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRwbGlzdCgpLCBbImNoYXJzZXQ9aXNvLTg4NTktMSIsICJmb3JtYXQ9Zmxvd2VkIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldHBhcmFtbmFtZXMoKSwgWyJjaGFyc2V0IiwgImZvcm1hdCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRwYXJhbSgiY2hhcnNldCIpLCAiaXNvLTg4NTktMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldHBhcmFtKCJmb3JtYXQiKSwgImZsb3dlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldHBhcmFtKCJzcGFtIiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldGVuY29kaW5nKCksICI4Yml0IikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTWltZVRvb2xzVGVzdCkKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0b29scy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjlmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldG9vbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0b29scy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNjlmYjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldG9vbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0eXBlcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODhkN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CkBAIC0wLDAgKzEsOTYgQEAKK2ltcG9ydCBtaW1ldHlwZXMKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgVGVsbCBpdCB3ZSBkb24ndCBrbm93IGFib3V0IGV4dGVybmFsIGZpbGVzOgorbWltZXR5cGVzLmtub3duZmlsZXMgPSBbXQorbWltZXR5cGVzLmluaXRlZCA9IEZhbHNlCittaW1ldHlwZXMuX2RlZmF1bHRfbWltZV90eXBlcygpCisKKworY2xhc3MgTWltZVR5cGVzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kYiA9IG1pbWV0eXBlcy5NaW1lVHlwZXMoKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9kYXRhKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJmb28uaHRtbCIpLCAoInRleHQvaHRtbCIsIE5vbmUpKQorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby50Z3oiKSwgKCJhcHBsaWNhdGlvbi94LXRhciIsICJnemlwIikpCisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfdHlwZSgiZm9vLnRhci5neiIpLCAoImFwcGxpY2F0aW9uL3gtdGFyIiwgImd6aXAiKSkKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJmb28udGFyLloiKSwgKCJhcHBsaWNhdGlvbi94LXRhciIsICJjb21wcmVzcyIpKQorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby50YXIuYnoyIiksICgiYXBwbGljYXRpb24veC10YXIiLCAiYnppcDIiKSkKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCJmb28udGFyLnh6IiksICgiYXBwbGljYXRpb24veC10YXIiLCAieHoiKSkKKworICAgIGRlZiB0ZXN0X2RhdGFfdXJscyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGd1ZXNzX3R5cGUgPSBzZWxmLmRiLmd1ZXNzX3R5cGUKKyAgICAgICAgZXEoZ3Vlc3NfdHlwZSgiZGF0YTosdGhpc0lzVGV4dFBsYWluIiksICgidGV4dC9wbGFpbiIsIE5vbmUpKQorICAgICAgICBlcShndWVzc190eXBlKCJkYXRhOjtiYXNlNjQsdGhpc0lzVGV4dFBsYWluIiksICgidGV4dC9wbGFpbiIsIE5vbmUpKQorICAgICAgICBlcShndWVzc190eXBlKCJkYXRhOnRleHQveC1mb28sdGhpc0lzVGV4dFhGb28iKSwgKCJ0ZXh0L3gtZm9vIiwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9maWxlX3BhcnNpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzaW8gPSBTdHJpbmdJTy5TdHJpbmdJTygieC1hcHBsaWNhdGlvbi94LXVuaXR0ZXN0IHB5dW5pdFxuIikKKyAgICAgICAgc2VsZi5kYi5yZWFkZnAoc2lvKQorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby5weXVuaXQiKSwKKyAgICAgICAgICAgKCJ4LWFwcGxpY2F0aW9uL3gtdW5pdHRlc3QiLCBOb25lKSkKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc19leHRlbnNpb24oIngtYXBwbGljYXRpb24veC11bml0dGVzdCIpLCAiLnB5dW5pdCIpCisKKyAgICBkZWYgdGVzdF9ub25fc3RhbmRhcmRfdHlwZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIEZpcnN0IHRyeSBzdHJpY3QKKyAgICAgICAgZXEoc2VsZi5kYi5ndWVzc190eXBlKCdmb28ueHVsJywgc3RyaWN0PVRydWUpLCAoTm9uZSwgTm9uZSkpCisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfZXh0ZW5zaW9uKCdpbWFnZS9qcGcnLCBzdHJpY3Q9VHJ1ZSksIE5vbmUpCisgICAgICAgICMgQW5kIHRoZW4gbm9uLXN0cmljdAorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoJ2Zvby54dWwnLCBzdHJpY3Q9RmFsc2UpLCAoJ3RleHQveHVsJywgTm9uZSkpCisgICAgICAgIGVxKHNlbGYuZGIuZ3Vlc3NfZXh0ZW5zaW9uKCdpbWFnZS9qcGcnLCBzdHJpY3Q9RmFsc2UpLCAnLmpwZycpCisKKyAgICBkZWYgdGVzdF9ndWVzc19hbGxfdHlwZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKKyAgICAgICAgIyBGaXJzdCB0cnkgc3RyaWN0LiAgVXNlIGEgc2V0IGhlcmUgZm9yIHRlc3RpbmcgdGhlIHJlc3VsdHMgYmVjYXVzZSBpZgorICAgICAgICAjIHRlc3RfdXJsbGliMiBpcyBydW4gYmVmb3JlIHRlc3RfbWltZXR5cGVzLCBnbG9iYWwgc3RhdGUgaXMgbW9kaWZpZWQKKyAgICAgICAgIyBzdWNoIHRoYXQgdGhlICdhbGwnIHNldCB3aWxsIGhhdmUgbW9yZSBpdGVtcyBpbiBpdC4KKyAgICAgICAgYWxsID0gc2V0KHNlbGYuZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoJ3RleHQvcGxhaW4nLCBzdHJpY3Q9VHJ1ZSkpCisgICAgICAgIHVubGVzcyhhbGwgPj0gc2V0KFsnLmJhdCcsICcuYycsICcuaCcsICcua3NoJywgJy5wbCcsICcudHh0J10pKQorICAgICAgICAjIEFuZCBub3cgbm9uLXN0cmljdAorICAgICAgICBhbGwgPSBzZWxmLmRiLmd1ZXNzX2FsbF9leHRlbnNpb25zKCdpbWFnZS9qcGcnLCBzdHJpY3Q9RmFsc2UpCisgICAgICAgIGFsbC5zb3J0KCkKKyAgICAgICAgZXEoYWxsLCBbJy5qcGcnXSkKKyAgICAgICAgIyBBbmQgbm93IGZvciBubyBoaXRzCisgICAgICAgIGFsbCA9IHNlbGYuZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoJ2ltYWdlL2pwZycsIHN0cmljdD1UcnVlKQorICAgICAgICBlcShhbGwsIFtdKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKSwgIldpbmRvd3Mgb25seSIpCitjbGFzcyBXaW4zMk1pbWVUeXBlc1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgZW5zdXJlIGFsbCBlbnRyaWVzIGFjdHVhbGx5IGNvbWUgZnJvbSB0aGUgV2luZG93cyByZWdpc3RyeQorICAgICAgICBzZWxmLm9yaWdpbmFsX3R5cGVzX21hcCA9IG1pbWV0eXBlcy50eXBlc19tYXAuY29weSgpCisgICAgICAgIG1pbWV0eXBlcy50eXBlc19tYXAuY2xlYXIoKQorICAgICAgICBtaW1ldHlwZXMuaW5pdCgpCisgICAgICAgIHNlbGYuZGIgPSBtaW1ldHlwZXMuTWltZVR5cGVzKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyByZXN0b3JlIGRlZmF1bHQgc2V0dGluZ3MKKyAgICAgICAgbWltZXR5cGVzLnR5cGVzX21hcC5jbGVhcigpCisgICAgICAgIG1pbWV0eXBlcy50eXBlc19tYXAudXBkYXRlKHNlbGYub3JpZ2luYWxfdHlwZXNfbWFwKQorCisgICAgZGVmIHRlc3RfcmVnaXN0cnlfcGFyc2luZyhzZWxmKToKKyAgICAgICAgIyB0aGUgb3JpZ2luYWwsIG1pbmltdW0gY29udGVudHMgb2YgdGhlIE1JTUUgZGF0YWJhc2UgaW4gdGhlCisgICAgICAgICMgV2luZG93cyByZWdpc3RyeSBpcyB1bmRvY3VtZW50ZWQgQUZBSUsuCisgICAgICAgICMgVXNlIGZpbGUgdHlwZXMgdGhhdCBzaG91bGQgKmFsd2F5cyogZXhpc3Q6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShzZWxmLmRiLmd1ZXNzX3R5cGUoImZvby50eHQiKSwgKCJ0ZXh0L3BsYWluIiwgTm9uZSkpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE1pbWVUeXBlc1Rlc3RDYXNlLAorICAgICAgICBXaW4zMk1pbWVUeXBlc1Rlc3RDYXNlCisgICAgICAgICkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzEzOGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW1ldHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzEzOGZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9taW5pZG9tLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTBmMGY3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weQpAQCAtMCwwICsxLDE1MTEgQEAKKyMgdGVzdCBmb3IgeG1sLmRvbS5taW5pZG9tCisKK2ltcG9ydCBwaWNrbGUKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBydW5fdW5pdHRlc3QsIGZpbmRmaWxlCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHhtbC5kb20KK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20KK2ltcG9ydCB4bWwucGFyc2Vycy5leHBhdAorCitmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgcGFyc2UsIE5vZGUsIERvY3VtZW50LCBwYXJzZVN0cmluZworZnJvbSB4bWwuZG9tLm1pbmlkb20gaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uCisKKwordHN0ZmlsZSA9IGZpbmRmaWxlKCJ0ZXN0LnhtbCIsIHN1YmRpcj0ieG1sdGVzdGRhdGEiKQorCisKKyMgVGhlIHRlc3RzIG9mIERvY3VtZW50VHlwZSBpbXBvcnRpbmcgdXNlIHRoZXNlIGhlbHBlcnMgdG8gY29uc3RydWN0CisjIHRoZSBkb2N1bWVudHMgdG8gd29yayB3aXRoLCBzaW5jZSBub3QgYWxsIERPTSBidWlsZGVycyBhY3R1YWxseQorIyBjcmVhdGUgdGhlIERvY3VtZW50VHlwZSBub2Rlcy4KK2RlZiBjcmVhdGVfZG9jX3dpdGhvdXRfZG9jdHlwZShkb2N0eXBlPU5vbmUpOgorICAgIHJldHVybiBnZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KE5vbmUsICJkb2MiLCBkb2N0eXBlKQorCitkZWYgY3JlYXRlX25vbmVtcHR5X2RvY3R5cGUoKToKKyAgICBkb2N0eXBlID0gZ2V0RE9NSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudFR5cGUoImRvYyIsIE5vbmUsIE5vbmUpCisgICAgZG9jdHlwZS5lbnRpdGllcy5fc2VxID0gW10KKyAgICBkb2N0eXBlLm5vdGF0aW9ucy5fc2VxID0gW10KKyAgICBub3RhdGlvbiA9IHhtbC5kb20ubWluaWRvbS5Ob3RhdGlvbigibXktbm90YXRpb24iLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbm90YXRpb25zL215IikKKyAgICBkb2N0eXBlLm5vdGF0aW9ucy5fc2VxLmFwcGVuZChub3RhdGlvbikKKyAgICBlbnRpdHkgPSB4bWwuZG9tLm1pbmlkb20uRW50aXR5KCJteS1lbnRpdHkiLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9lbnRpdGllcy9teSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXktbm90YXRpb24iKQorICAgIGVudGl0eS52ZXJzaW9uID0gIjEuMCIKKyAgICBlbnRpdHkuZW5jb2RpbmcgPSAidXRmLTgiCisgICAgZW50aXR5LmFjdHVhbEVuY29kaW5nID0gInVzLWFzY2lpIgorICAgIGRvY3R5cGUuZW50aXRpZXMuX3NlcS5hcHBlbmQoZW50aXR5KQorICAgIHJldHVybiBkb2N0eXBlCisKK2RlZiBjcmVhdGVfZG9jX3dpdGhfZG9jdHlwZSgpOgorICAgIGRvY3R5cGUgPSBjcmVhdGVfbm9uZW1wdHlfZG9jdHlwZSgpCisgICAgZG9jID0gY3JlYXRlX2RvY193aXRob3V0X2RvY3R5cGUoZG9jdHlwZSkKKyAgICBkb2N0eXBlLmVudGl0aWVzLml0ZW0oMCkub3duZXJEb2N1bWVudCA9IGRvYworICAgIGRvY3R5cGUubm90YXRpb25zLml0ZW0oMCkub3duZXJEb2N1bWVudCA9IGRvYworICAgIHJldHVybiBkb2MKKworY2xhc3MgTWluaWRvbVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjb25maXJtKHNlbGYsIHRlc3QsIHRlc3RuYW1lID0gIlRlc3QiKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3QsIHRlc3RuYW1lKQorCisgICAgZGVmIGNoZWNrV2hvbGVUZXh0KHNlbGYsIG5vZGUsIHMpOgorICAgICAgICB0ID0gbm9kZS53aG9sZVRleHQKKyAgICAgICAgc2VsZi5jb25maXJtKHQgPT0gcywgImxvb2tpbmcgZm9yICVzLCBmb3VuZCAlcyIgJSAocmVwcihzKSwgcmVwcih0KSkpCisKKyAgICBkZWYgdGVzdFBhcnNlRnJvbUZpbGUoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlKFN0cmluZ0lPKG9wZW4odHN0ZmlsZSkucmVhZCgpKSkKKyAgICAgICAgZG9tLnVubGluaygpCisgICAgICAgIHNlbGYuY29uZmlybShpc2luc3RhbmNlKGRvbSxEb2N1bWVudCkpCisKKyAgICBkZWYgdGVzdEdldEVsZW1lbnRzQnlUYWdOYW1lKHNlbGYpOgorICAgICAgICBkb20gPSBwYXJzZSh0c3RmaWxlKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9tLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMSSIpID09IFwKKyAgICAgICAgICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJMSSIpKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0SW5zZXJ0QmVmb3JlKHNlbGYpOgorICAgICAgICBkb20gPSBwYXJzZVN0cmluZygiPGRvYz48Zm9vLz48L2RvYz4iKQorICAgICAgICByb290ID0gZG9tLmRvY3VtZW50RWxlbWVudAorICAgICAgICBlbGVtID0gcm9vdC5jaGlsZE5vZGVzWzBdCisgICAgICAgIG5lbGVtID0gZG9tLmNyZWF0ZUVsZW1lbnQoImVsZW1lbnQiKQorICAgICAgICByb290Lmluc2VydEJlZm9yZShuZWxlbSwgZWxlbSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1swXSBpcyBuZWxlbQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMuaXRlbSgwKSBpcyBuZWxlbQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMV0gaXMgZWxlbQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMuaXRlbSgxKSBpcyBlbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZCBpcyBuZWxlbQorICAgICAgICAgICAgICAgIGFuZCByb290Lmxhc3RDaGlsZCBpcyBlbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QudG94bWwoKSA9PSAiPGRvYz48ZWxlbWVudC8+PGZvby8+PC9kb2M+IgorICAgICAgICAgICAgICAgICwgInRlc3RJbnNlcnRCZWZvcmUgLS0gbm9kZSBwcm9wZXJseSBwbGFjZWQgaW4gdHJlZSIpCisgICAgICAgIG5lbGVtID0gZG9tLmNyZWF0ZUVsZW1lbnQoImVsZW1lbnQiKQorICAgICAgICByb290Lmluc2VydEJlZm9yZShuZWxlbSwgTm9uZSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDMKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAzCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1sxXSBpcyBlbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5pdGVtKDEpIGlzIGVsZW0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzJdIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5pdGVtKDIpIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QubGFzdENoaWxkIGlzIG5lbGVtCisgICAgICAgICAgICAgICAgYW5kIG5lbGVtLnByZXZpb3VzU2libGluZyBpcyBlbGVtCisgICAgICAgICAgICAgICAgYW5kIHJvb3QudG94bWwoKSA9PSAiPGRvYz48ZWxlbWVudC8+PGZvby8+PGVsZW1lbnQvPjwvZG9jPiIKKyAgICAgICAgICAgICAgICAsICJ0ZXN0SW5zZXJ0QmVmb3JlIC0tIG5vZGUgcHJvcGVybHkgcGxhY2VkIGluIHRyZWUiKQorICAgICAgICBuZWxlbTIgPSBkb20uY3JlYXRlRWxlbWVudCgiYmFyIikKKyAgICAgICAgcm9vdC5pbnNlcnRCZWZvcmUobmVsZW0yLCBuZWxlbSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSA0CisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1syXSBpcyBuZWxlbTIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLml0ZW0oMikgaXMgbmVsZW0yCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1szXSBpcyBuZWxlbQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMuaXRlbSgzKSBpcyBuZWxlbQorICAgICAgICAgICAgICAgIGFuZCBuZWxlbTIubmV4dFNpYmxpbmcgaXMgbmVsZW0KKyAgICAgICAgICAgICAgICBhbmQgbmVsZW0ucHJldmlvdXNTaWJsaW5nIGlzIG5lbGVtMgorICAgICAgICAgICAgICAgIGFuZCByb290LnRveG1sKCkgPT0KKyAgICAgICAgICAgICAgICAiPGRvYz48ZWxlbWVudC8+PGZvby8+PGJhci8+PGVsZW1lbnQvPjwvZG9jPiIKKyAgICAgICAgICAgICAgICAsICJ0ZXN0SW5zZXJ0QmVmb3JlIC0tIG5vZGUgcHJvcGVybHkgcGxhY2VkIGluIHRyZWUiKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiBfY3JlYXRlX2ZyYWdtZW50X3Rlc3Rfbm9kZXMoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICBvcmlnID0gZG9tLmNyZWF0ZVRleHROb2RlKCJvcmlnaW5hbCIpCisgICAgICAgIGMxID0gZG9tLmNyZWF0ZVRleHROb2RlKCJmb28iKQorICAgICAgICBjMiA9IGRvbS5jcmVhdGVUZXh0Tm9kZSgiYmFyIikKKyAgICAgICAgYzMgPSBkb20uY3JlYXRlVGV4dE5vZGUoImJhdCIpCisgICAgICAgIGRvbS5kb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQob3JpZykKKyAgICAgICAgZnJhZyA9IGRvbS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKKyAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChjMSkKKyAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChjMikKKyAgICAgICAgZnJhZy5hcHBlbmRDaGlsZChjMykKKyAgICAgICAgcmV0dXJuIGRvbSwgb3JpZywgYzEsIGMyLCBjMywgZnJhZworCisgICAgZGVmIHRlc3RJbnNlcnRCZWZvcmVGcmFnbWVudChzZWxmKToKKyAgICAgICAgZG9tLCBvcmlnLCBjMSwgYzIsIGMzLCBmcmFnID0gc2VsZi5fY3JlYXRlX2ZyYWdtZW50X3Rlc3Rfbm9kZXMoKQorICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50Lmluc2VydEJlZm9yZShmcmFnLCBOb25lKQorICAgICAgICBzZWxmLmNvbmZpcm0odHVwbGUoZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKSA9PQorICAgICAgICAgICAgICAgICAgICAgKG9yaWcsIGMxLCBjMiwgYzMpLAorICAgICAgICAgICAgICAgICAgICAgImluc2VydEJlZm9yZSg8ZnJhZ21lbnQ+LCBOb25lKSIpCisgICAgICAgIGZyYWcudW5saW5rKCkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICAgICAgZG9tLCBvcmlnLCBjMSwgYzIsIGMzLCBmcmFnID0gc2VsZi5fY3JlYXRlX2ZyYWdtZW50X3Rlc3Rfbm9kZXMoKQorICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50Lmluc2VydEJlZm9yZShmcmFnLCBvcmlnKQorICAgICAgICBzZWxmLmNvbmZpcm0odHVwbGUoZG9tLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKSA9PQorICAgICAgICAgICAgICAgICAgICAgKGMxLCBjMiwgYzMsIG9yaWcpLAorICAgICAgICAgICAgICAgICAgICAgImluc2VydEJlZm9yZSg8ZnJhZ21lbnQ+LCBvcmlnKSIpCisgICAgICAgIGZyYWcudW5saW5rKCkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEFwcGVuZENoaWxkKHNlbGYpOgorICAgICAgICBkb20gPSBwYXJzZSh0c3RmaWxlKQorICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGRvbS5jcmVhdGVDb21tZW50KHUiSGVsbG8iKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGRvbS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2Rlc1stMV0ubm9kZU5hbWUgPT0gIiNjb21tZW50IikKKyAgICAgICAgc2VsZi5jb25maXJtKGRvbS5kb2N1bWVudEVsZW1lbnQuY2hpbGROb2Rlc1stMV0uZGF0YSA9PSAiSGVsbG8iKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0QXBwZW5kQ2hpbGRGcmFnbWVudChzZWxmKToKKyAgICAgICAgZG9tLCBvcmlnLCBjMSwgYzIsIGMzLCBmcmFnID0gc2VsZi5fY3JlYXRlX2ZyYWdtZW50X3Rlc3Rfbm9kZXMoKQorICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50LmFwcGVuZENoaWxkKGZyYWcpCisgICAgICAgIHNlbGYuY29uZmlybSh0dXBsZShkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpID09CisgICAgICAgICAgICAgICAgICAgICAob3JpZywgYzEsIGMyLCBjMyksCisgICAgICAgICAgICAgICAgICAgICAiYXBwZW5kQ2hpbGQoPGZyYWdtZW50PikiKQorICAgICAgICBmcmFnLnVubGluaygpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RSZXBsYWNlQ2hpbGRGcmFnbWVudChzZWxmKToKKyAgICAgICAgZG9tLCBvcmlnLCBjMSwgYzIsIGMzLCBmcmFnID0gc2VsZi5fY3JlYXRlX2ZyYWdtZW50X3Rlc3Rfbm9kZXMoKQorICAgICAgICBkb20uZG9jdW1lbnRFbGVtZW50LnJlcGxhY2VDaGlsZChmcmFnLCBvcmlnKQorICAgICAgICBvcmlnLnVubGluaygpCisgICAgICAgIHNlbGYuY29uZmlybSh0dXBsZShkb20uZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpID09IChjMSwgYzIsIGMzKSwKKyAgICAgICAgICAgICAgICAicmVwbGFjZUNoaWxkKDxmcmFnbWVudD4pIikKKyAgICAgICAgZnJhZy51bmxpbmsoKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0TGVnYWxDaGlsZHJlbihzZWxmKToKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBlbGVtID0gZG9tLmNyZWF0ZUVsZW1lbnQoJ2VsZW1lbnQnKQorICAgICAgICB0ZXh0ID0gZG9tLmNyZWF0ZVRleHROb2RlKCd0ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBkb20uYXBwZW5kQ2hpbGQsIHRleHQpCisKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVyciwgZG9tLmluc2VydEJlZm9yZSwgdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBkb20ucmVwbGFjZUNoaWxkLCB0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtKQorCisgICAgICAgIG5vZGVtYXAgPSBlbGVtLmF0dHJpYnV0ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBub2RlbWFwLnNldE5hbWVkSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyLCBub2RlbWFwLnNldE5hbWVkSXRlbU5TLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0KQorCisgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQodGV4dCkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdE5hbWVkTm9kZU1hcFNldEl0ZW0oc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgZWxlbSA9IGRvbS5jcmVhdGVFbGVtZW50KCdlbGVtZW50JykKKyAgICAgICAgYXR0cnMgPSBlbGVtLmF0dHJpYnV0ZXMKKyAgICAgICAgYXR0cnNbImZvbyJdID0gImJhciIKKyAgICAgICAgYSA9IGF0dHJzLml0ZW0oMCkKKyAgICAgICAgc2VsZi5jb25maXJtKGEub3duZXJEb2N1bWVudCBpcyBkb20sCisgICAgICAgICAgICAgICAgIk5hbWVkTm9kZU1hcC5fX3NldGl0ZW1fXygpIHNldHMgb3duZXJEb2N1bWVudCIpCisgICAgICAgIHNlbGYuY29uZmlybShhLm93bmVyRWxlbWVudCBpcyBlbGVtLAorICAgICAgICAgICAgICAgICJOYW1lZE5vZGVNYXAuX19zZXRpdGVtX18oKSBzZXRzIG93bmVyRWxlbWVudCIpCisgICAgICAgIHNlbGYuY29uZmlybShhLnZhbHVlID09ICJiYXIiLAorICAgICAgICAgICAgICAgICJOYW1lZE5vZGVNYXAuX19zZXRpdGVtX18oKSBzZXRzIHZhbHVlIikKKyAgICAgICAgc2VsZi5jb25maXJtKGEubm9kZVZhbHVlID09ICJiYXIiLAorICAgICAgICAgICAgICAgICJOYW1lZE5vZGVNYXAuX19zZXRpdGVtX18oKSBzZXRzIG5vZGVWYWx1ZSIpCisgICAgICAgIGVsZW0udW5saW5rKCkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdE5vblplcm8oc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlKHRzdGZpbGUpCisgICAgICAgIHNlbGYuY29uZmlybShkb20pIyBzaG91bGQgbm90IGJlIHplcm8KKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVDb21tZW50KCJmb28iKSkKKyAgICAgICAgc2VsZi5jb25maXJtKG5vdCBkb20uY2hpbGROb2Rlc1stMV0uY2hpbGROb2RlcykKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdFVubGluayhzZWxmKToKKyAgICAgICAgZG9tID0gcGFyc2UodHN0ZmlsZSkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEVsZW1lbnQoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCJhYmMiKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGRvbS5kb2N1bWVudEVsZW1lbnQpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RBQUEoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8YWJjLz4iKQorICAgICAgICBlbCA9IGRvbS5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgZWwuc2V0QXR0cmlidXRlKCJzcGFtIiwgImphbTIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZWwudG94bWwoKSA9PSAnPGFiYyBzcGFtPSJqYW0yIi8+JywgInRlc3RBQUEiKQorICAgICAgICBhID0gZWwuZ2V0QXR0cmlidXRlTm9kZSgic3BhbSIpCisgICAgICAgIHNlbGYuY29uZmlybShhLm93bmVyRG9jdW1lbnQgaXMgZG9tLAorICAgICAgICAgICAgICAgICJzZXRBdHRyaWJ1dGUoKSBzZXRzIG93bmVyRG9jdW1lbnQiKQorICAgICAgICBzZWxmLmNvbmZpcm0oYS5vd25lckVsZW1lbnQgaXMgZG9tLmRvY3VtZW50RWxlbWVudCwKKyAgICAgICAgICAgICAgICAic2V0QXR0cmlidXRlKCkgc2V0cyBvd25lckVsZW1lbnQiKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0QUFCKHNlbGYpOgorICAgICAgICBkb20gPSBwYXJzZVN0cmluZygiPGFiYy8+IikKKyAgICAgICAgZWwgPSBkb20uZG9jdW1lbnRFbGVtZW50CisgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgic3BhbSIsICJqYW0iKQorICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoInNwYW0iLCAiamFtMiIpCisgICAgICAgIHNlbGYuY29uZmlybShlbC50b3htbCgpID09ICc8YWJjIHNwYW09ImphbTIiLz4nLCAidGVzdEFBQiIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RBZGRBdHRyKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGNoaWxkID0gZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCJhYmMiKSkKKworICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoImRlZiIsICJnaGkiKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2hpbGQuZ2V0QXR0cmlidXRlKCJkZWYiKSA9PSAiZ2hpIikKKyAgICAgICAgc2VsZi5jb25maXJtKGNoaWxkLmF0dHJpYnV0ZXNbImRlZiJdLnZhbHVlID09ICJnaGkiKQorCisgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiamtsIiwgIm1ubyIpCisgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5nZXRBdHRyaWJ1dGUoImprbCIpID09ICJtbm8iKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2hpbGQuYXR0cmlidXRlc1siamtsIl0udmFsdWUgPT0gIm1ubyIpCisKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAyKQorCisgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZSgiZGVmIiwgIm5ld3ZhbCIpCisgICAgICAgIHNlbGYuY29uZmlybShjaGlsZC5nZXRBdHRyaWJ1dGUoImRlZiIpID09ICJuZXd2YWwiKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2hpbGQuYXR0cmlidXRlc1siZGVmIl0udmFsdWUgPT0gIm5ld3ZhbCIpCisKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAyKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0RGVsZXRlQXR0cihzZWxmKToKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBjaGlsZCA9IGRvbS5hcHBlbmRDaGlsZChkb20uY3JlYXRlRWxlbWVudCgiYWJjIikpCisKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAwKQorICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoImRlZiIsICJnaGkiKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDEpCisgICAgICAgIGRlbCBjaGlsZC5hdHRyaWJ1dGVzWyJkZWYiXQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDApCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RSZW1vdmVBdHRyKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGNoaWxkID0gZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCJhYmMiKSkKKworICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoImRlZiIsICJnaGkiKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDEpCisgICAgICAgIGNoaWxkLnJlbW92ZUF0dHJpYnV0ZSgiZGVmIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAwKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiB0ZXN0UmVtb3ZlQXR0ck5TKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGNoaWxkID0gZG9tLmFwcGVuZENoaWxkKAorICAgICAgICAgICAgICAgIGRvbS5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cucHl0aG9uLm9yZyIsICJweXRob246YWJjIikpCisgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnczLm9yZyIsICJ4bWxuczpweXRob24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cucHl0aG9uLm9yZyIpCisgICAgICAgIGNoaWxkLnNldEF0dHJpYnV0ZU5TKCJodHRwOi8vd3d3LnB5dGhvbi5vcmciLCAicHl0aG9uOmFiY2F0dHIiLCAiZm9vIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjaGlsZC5hdHRyaWJ1dGVzKSA9PSAyKQorICAgICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGVOUygiaHR0cDovL3d3dy5weXRob24ub3JnIiwgImFiY2F0dHIiKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNoaWxkLmF0dHJpYnV0ZXMpID09IDEpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RSZW1vdmVBdHRyaWJ1dGVOb2RlKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGNoaWxkID0gZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCJmb28iKSkKKyAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCJzcGFtIiwgImphbSIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMSkKKyAgICAgICAgbm9kZSA9IGNoaWxkLmdldEF0dHJpYnV0ZU5vZGUoInNwYW0iKQorICAgICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGVOb2RlKG5vZGUpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oY2hpbGQuYXR0cmlidXRlcykgPT0gMAorICAgICAgICAgICAgICAgIGFuZCBjaGlsZC5nZXRBdHRyaWJ1dGVOb2RlKCJzcGFtIikgaXMgTm9uZSkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdENoYW5nZUF0dHIoc2VsZik6CisgICAgICAgIGRvbSA9IHBhcnNlU3RyaW5nKCI8YWJjLz4iKQorICAgICAgICBlbCA9IGRvbS5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgZWwuc2V0QXR0cmlidXRlKCJzcGFtIiwgImphbSIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oZWwuYXR0cmlidXRlcykgPT0gMSkKKyAgICAgICAgZWwuc2V0QXR0cmlidXRlKCJzcGFtIiwgImJhbSIpCisgICAgICAgICMgU2V0IHRoaXMgYXR0cmlidXRlIHRvIGJlIGFuIElEIGFuZCBtYWtlIHN1cmUgdGhhdCBkb2Vzbid0IGNoYW5nZQorICAgICAgICAjIHdoZW4gY2hhbmdpbmcgdGhlIHZhbHVlOgorICAgICAgICBlbC5zZXRJZEF0dHJpYnV0ZSgic3BhbSIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oZWwuYXR0cmlidXRlcykgPT0gMQorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtIl0udmFsdWUgPT0gImJhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbSJdLm5vZGVWYWx1ZSA9PSAiYmFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5nZXRBdHRyaWJ1dGUoInNwYW0iKSA9PSAiYmFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5nZXRBdHRyaWJ1dGVOb2RlKCJzcGFtIikuaXNJZCkKKyAgICAgICAgZWwuYXR0cmlidXRlc1sic3BhbSJdID0gImhhbSIKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbC5hdHRyaWJ1dGVzKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0iXS52YWx1ZSA9PSAiaGFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtIl0ubm9kZVZhbHVlID09ICJoYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZSgic3BhbSIpID09ICJoYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0iXS5pc0lkKQorICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoInNwYW0yIiwgImJhbSIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oZWwuYXR0cmlidXRlcykgPT0gMgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtIl0udmFsdWUgPT0gImhhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbSJdLm5vZGVWYWx1ZSA9PSAiaGFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5nZXRBdHRyaWJ1dGUoInNwYW0iKSA9PSAiaGFtIgorICAgICAgICAgICAgICAgIGFuZCBlbC5hdHRyaWJ1dGVzWyJzcGFtMiJdLnZhbHVlID09ICJiYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0yIl0ubm9kZVZhbHVlID09ICJiYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZSgic3BhbTIiKSA9PSAiYmFtIikKKyAgICAgICAgZWwuYXR0cmlidXRlc1sic3BhbTIiXSA9ICJiYW0yIgorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGVsLmF0dHJpYnV0ZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbSJdLnZhbHVlID09ICJoYW0iCisgICAgICAgICAgICAgICAgYW5kIGVsLmF0dHJpYnV0ZXNbInNwYW0iXS5ub2RlVmFsdWUgPT0gImhhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuZ2V0QXR0cmlidXRlKCJzcGFtIikgPT0gImhhbSIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbTIiXS52YWx1ZSA9PSAiYmFtMiIKKyAgICAgICAgICAgICAgICBhbmQgZWwuYXR0cmlidXRlc1sic3BhbTIiXS5ub2RlVmFsdWUgPT0gImJhbTIiCisgICAgICAgICAgICAgICAgYW5kIGVsLmdldEF0dHJpYnV0ZSgic3BhbTIiKSA9PSAiYmFtMiIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RHZXRBdHRyTGlzdChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RHZXRBdHRyVmFsdWVzKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEdldEF0dHJMZW5ndGgoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0R2V0QXR0cmlidXRlKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEdldEF0dHJpYnV0ZU5TKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEdldEF0dHJpYnV0ZU5vZGUoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0R2V0RWxlbWVudHNCeVRhZ05hbWVOUyhzZWxmKToKKyAgICAgICAgZD0iIiI8Zm9vIHhtbG5zOm1pbmlkb209J2h0dHA6Ly9weXhtbC5zZi5uZXQvbWluaWRvbSc+CisgICAgICAgIDxtaW5pZG9tOm15ZWxlbS8+CisgICAgICAgIDwvZm9vPiIiIgorICAgICAgICBkb20gPSBwYXJzZVN0cmluZyhkKQorICAgICAgICBlbGVtcyA9IGRvbS5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJodHRwOi8vcHl4bWwuc2YubmV0L21pbmlkb20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteWVsZW0iKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGVsZW1zKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIGVsZW1zWzBdLm5hbWVzcGFjZVVSSSA9PSAiaHR0cDovL3B5eG1sLnNmLm5ldC9taW5pZG9tIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtc1swXS5sb2NhbE5hbWUgPT0gIm15ZWxlbSIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbXNbMF0ucHJlZml4ID09ICJtaW5pZG9tIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtc1swXS50YWdOYW1lID09ICJtaW5pZG9tOm15ZWxlbSIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbXNbMF0ubm9kZU5hbWUgPT0gIm1pbmlkb206bXllbGVtIikKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgZ2V0X2VtcHR5X25vZGVsaXN0X2Zyb21fZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIoc2VsZiwgZG9jLCBuc3VyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG5hbWUpOgorICAgICAgICBub2RlbGlzdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKG5zdXJpLCBsbmFtZSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihub2RlbGlzdCkgPT0gMCkKKworICAgIGRlZiB0ZXN0R2V0RW1wdHlOb2RlTGlzdEZyb21FbGVtZW50c0J5VGFnTmFtZU5TKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygnPGRvYy8+JykKKyAgICAgICAgc2VsZi5nZXRfZW1wdHlfbm9kZWxpc3RfZnJvbV9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcigKKyAgICAgICAgICAgIGRvYywgJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy9uYW1lc3BhY2VzL2EnLCAnbG9jYWxuYW1lJykKKyAgICAgICAgc2VsZi5nZXRfZW1wdHlfbm9kZWxpc3RfZnJvbV9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcigKKyAgICAgICAgICAgIGRvYywgJyonLCAnc3BsYXQnKQorICAgICAgICBzZWxmLmdldF9lbXB0eV9ub2RlbGlzdF9mcm9tX2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgZG9jLCAnaHR0cDovL3htbC5weXRob24ub3JnL25hbWVzcGFjZXMvYScsICcqJykKKworICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygnPGRvYyB4bWxucz0iaHR0cDovL3htbC5weXRob24ub3JnL3NwbGF0Ij48ZS8+PC9kb2M+JykKKyAgICAgICAgc2VsZi5nZXRfZW1wdHlfbm9kZWxpc3RfZnJvbV9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcigKKyAgICAgICAgICAgIGRvYywgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9zcGxhdCIsICJub3QtdGhlcmUiKQorICAgICAgICBzZWxmLmdldF9lbXB0eV9ub2RlbGlzdF9mcm9tX2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgZG9jLCAiKiIsICJub3QtdGhlcmUiKQorICAgICAgICBzZWxmLmdldF9lbXB0eV9ub2RlbGlzdF9mcm9tX2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgZG9jLCAiaHR0cDovL3NvbWV3aGVyZS5lbHNlLm5ldC9ub3QtdGhlcmUiLCAiZSIpCisKKyAgICBkZWYgdGVzdEVsZW1lbnRSZXByQW5kU3RyKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIGVsID0gZG9tLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVFbGVtZW50KCJhYmMiKSkKKyAgICAgICAgc3RyaW5nMSA9IHJlcHIoZWwpCisgICAgICAgIHN0cmluZzIgPSBzdHIoZWwpCisgICAgICAgIHNlbGYuY29uZmlybShzdHJpbmcxID09IHN0cmluZzIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RFbGVtZW50UmVwckFuZFN0clVuaWNvZGUoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgZWwgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQodSJhYmMiKSkKKyAgICAgICAgc3RyaW5nMSA9IHJlcHIoZWwpCisgICAgICAgIHN0cmluZzIgPSBzdHIoZWwpCisgICAgICAgIHNlbGYuY29uZmlybShzdHJpbmcxID09IHN0cmluZzIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RFbGVtZW50UmVwckFuZFN0clVuaWNvZGVOUyhzZWxmKToKKyAgICAgICAgZG9tID0gRG9jdW1lbnQoKQorICAgICAgICBlbCA9IGRvbS5hcHBlbmRDaGlsZCgKKyAgICAgICAgICAgIGRvbS5jcmVhdGVFbGVtZW50TlModSJodHRwOi8vd3d3LnNsYXNoZG90Lm9yZyIsIHUic2xhc2g6YWJjIikpCisgICAgICAgIHN0cmluZzEgPSByZXByKGVsKQorICAgICAgICBzdHJpbmcyID0gc3RyKGVsKQorICAgICAgICBzZWxmLmNvbmZpcm0oc3RyaW5nMSA9PSBzdHJpbmcyKQorICAgICAgICBzZWxmLmNvbmZpcm0oInNsYXNoOmFiYyIgaW4gc3RyaW5nMSkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdEF0dHJpYnV0ZVJlcHIoc2VsZik6CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgZWwgPSBkb20uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZUVsZW1lbnQodSJhYmMiKSkKKyAgICAgICAgbm9kZSA9IGVsLnNldEF0dHJpYnV0ZSgiYWJjIiwgImRlZiIpCisgICAgICAgIHNlbGYuY29uZmlybShzdHIobm9kZSkgPT0gcmVwcihub2RlKSkKKyAgICAgICAgZG9tLnVubGluaygpCisKKyAgICBkZWYgdGVzdFRleHROb2RlUmVwcihzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RXcml0ZVhNTChzZWxmKToKKyAgICAgICAgc3RyID0gJzw/eG1sIHZlcnNpb249IjEuMCIgPz48YSBiPSJjIi8+JworICAgICAgICBkb20gPSBwYXJzZVN0cmluZyhzdHIpCisgICAgICAgIGRvbXN0ciA9IGRvbS50b3htbCgpCisgICAgICAgIGRvbS51bmxpbmsoKQorICAgICAgICBzZWxmLmNvbmZpcm0oc3RyID09IGRvbXN0cikKKworICAgIGRlZiB0ZXN0QWx0TmV3bGluZShzZWxmKToKKyAgICAgICAgc3RyID0gJzw/eG1sIHZlcnNpb249IjEuMCIgPz5cbjxhIGI9ImMiLz5cbicKKyAgICAgICAgZG9tID0gcGFyc2VTdHJpbmcoc3RyKQorICAgICAgICBkb21zdHIgPSBkb20udG9wcmV0dHl4bWwobmV3bD0iXHJcbiIpCisgICAgICAgIGRvbS51bmxpbmsoKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9tc3RyID09IHN0ci5yZXBsYWNlKCJcbiIsICJcclxuIikpCisKKyAgICBkZWYgdGVzdF90b3ByZXR0eXhtbF93aXRoX3RleHRfbm9kZXMoc2VsZik6CisgICAgICAgICMgc2VlIGlzc3VlICM0MTQ3LCB0ZXh0IG5vZGVzIGFyZSBub3QgaW5kZW50ZWQKKyAgICAgICAgZGVjbCA9ICc8P3htbCB2ZXJzaW9uPSIxLjAiID8+XG4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VTdHJpbmcoJzxCPkE8L0I+JykudG9wcmV0dHl4bWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsgJzxCPkE8L0I+XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlU3RyaW5nKCc8Qz5BPEI+QTwvQj48L0M+JykudG9wcmV0dHl4bWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsgJzxDPlxuXHRBXG5cdDxCPkE8L0I+XG48L0M+XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlU3RyaW5nKCc8Qz48Qj5BPC9CPkE8L0M+JykudG9wcmV0dHl4bWwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsICsgJzxDPlxuXHQ8Qj5BPC9CPlxuXHRBXG48L0M+XG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlU3RyaW5nKCc8Qz48Qj5BPC9CPjxCPkE8L0I+PC9DPicpLnRvcHJldHR5eG1sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArICc8Qz5cblx0PEI+QTwvQj5cblx0PEI+QTwvQj5cbjwvQz5cbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VTdHJpbmcoJzxDPjxCPkE8L0I+QTxCPkE8L0I+PC9DPicpLnRvcHJldHR5eG1sKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbCArICc8Qz5cblx0PEI+QTwvQj5cblx0QVxuXHQ8Qj5BPC9CPlxuPC9DPlxuJykKKworICAgIGRlZiB0ZXN0X3RvcHJldHR5eG1sX3dpdGhfYWRqYWNlbnRfdGV4dF9ub2RlcyhzZWxmKToKKyAgICAgICAgIyBzZWUgaXNzdWUgIzQxNDcsIGFkamFjZW50IHRleHQgbm9kZXMgYXJlIGluZGVudGVkIG5vcm1hbGx5CisgICAgICAgIGRvbSA9IERvY3VtZW50KCkKKyAgICAgICAgZWxlbSA9IGRvbS5jcmVhdGVFbGVtZW50KHUnZWxlbScpCisgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoZG9tLmNyZWF0ZVRleHROb2RlKHUnVEVYVCcpKQorICAgICAgICBlbGVtLmFwcGVuZENoaWxkKGRvbS5jcmVhdGVUZXh0Tm9kZSh1J1RFWFQnKSkKKyAgICAgICAgZG9tLmFwcGVuZENoaWxkKGVsZW0pCisgICAgICAgIGRlY2wgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiA/PlxuJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvbS50b3ByZXR0eXhtbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2wgKyAnPGVsZW0+XG5cdFRFWFRcblx0VEVYVFxuPC9lbGVtPlxuJykKKworICAgIGRlZiB0ZXN0X3RvcHJldHR5eG1sX3ByZXNlcnZlc19jb250ZW50X29mX3RleHRfbm9kZShzZWxmKToKKyAgICAgICAgIyBzZWUgaXNzdWUgIzQxNDcKKyAgICAgICAgZm9yIHN0ciBpbiAoJzxCPkE8L0I+JywgJzxBPjxCPkM8L0I+PC9BPicpOgorICAgICAgICAgICAgZG9tID0gcGFyc2VTdHJpbmcoc3RyKQorICAgICAgICAgICAgZG9tMiA9IHBhcnNlU3RyaW5nKGRvbS50b3ByZXR0eXhtbCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBkb20uZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ0InKVswXS5jaGlsZE5vZGVzWzBdLnRveG1sKCksCisgICAgICAgICAgICAgICAgZG9tMi5nZXRFbGVtZW50c0J5VGFnTmFtZSgnQicpWzBdLmNoaWxkTm9kZXNbMF0udG94bWwoKSkKKworICAgIGRlZiB0ZXN0UHJvY2Vzc2luZ0luc3RydWN0aW9uKHNlbGYpOgorICAgICAgICBkb20gPSBwYXJzZVN0cmluZygnPGU+PD9teXBpIFx0XG4gZGF0YSBcdFxuID8+PC9lPicpCisgICAgICAgIHBpID0gZG9tLmRvY3VtZW50RWxlbWVudC5maXJzdENoaWxkCisgICAgICAgIHNlbGYuY29uZmlybShwaS50YXJnZXQgPT0gIm15cGkiCisgICAgICAgICAgICAgICAgYW5kIHBpLmRhdGEgPT0gImRhdGEgXHRcbiAiCisgICAgICAgICAgICAgICAgYW5kIHBpLm5vZGVOYW1lID09ICJteXBpIgorICAgICAgICAgICAgICAgIGFuZCBwaS5ub2RlVHlwZSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERQorICAgICAgICAgICAgICAgIGFuZCBwaS5hdHRyaWJ1dGVzIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgbm90IHBpLmhhc0NoaWxkTm9kZXMoKQorICAgICAgICAgICAgICAgIGFuZCBsZW4ocGkuY2hpbGROb2RlcykgPT0gMAorICAgICAgICAgICAgICAgIGFuZCBwaS5maXJzdENoaWxkIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcGkubGFzdENoaWxkIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcGkubG9jYWxOYW1lIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcGkubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFKQorCisgICAgZGVmIHRlc3RQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25SZXByKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFRleHRSZXByKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFdyaXRlVGV4dChzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3REb2N1bWVudEVsZW1lbnQoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0VG9vTWFueURvY3VtZW50RWxlbWVudHMoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICBlbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnQoImV4dHJhIikKKyAgICAgICAgIyBTaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gYWRkaW5nIGFuIGV4dHJhIGRvY3VtZW50IGVsZW1lbnQuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVyciwgZG9jLmFwcGVuZENoaWxkLCBlbGVtKQorICAgICAgICBlbGVtLnVubGluaygpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3RDcmVhdGVFbGVtZW50TlMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0Q3JlYXRlQXR0cmlidXRlTlMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0UGFyc2Uoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0UGFyc2VTdHJpbmcoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0Q29tbWVudChzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RBdHRyTGlzdEl0ZW0oc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0QXR0ckxpc3RJdGVtcyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RBdHRyTGlzdEl0ZW1OUyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RBdHRyTGlzdEtleXMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0QXR0ckxpc3RLZXlzTlMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0UmVtb3ZlTmFtZWRJdGVtKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyBhPScnLz4iKQorICAgICAgICBlID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBhdHRycyA9IGUuYXR0cmlidXRlcworICAgICAgICBhMSA9IGUuZ2V0QXR0cmlidXRlTm9kZSgiYSIpCisgICAgICAgIGEyID0gYXR0cnMucmVtb3ZlTmFtZWRJdGVtKCJhIikKKyAgICAgICAgc2VsZi5jb25maXJtKGExLmlzU2FtZU5vZGUoYTIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdEZvdW5kRXJyLCBhdHRycy5yZW1vdmVOYW1lZEl0ZW0sICJhIikKKworICAgIGRlZiB0ZXN0UmVtb3ZlTmFtZWRJdGVtTlMoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIHhtbG5zOmE9J2h0dHA6Ly94bWwucHl0aG9uLm9yZy8nIGE6Yj0nJy8+IikKKyAgICAgICAgZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgYXR0cnMgPSBlLmF0dHJpYnV0ZXMKKyAgICAgICAgYTEgPSBlLmdldEF0dHJpYnV0ZU5vZGVOUygiaHR0cDovL3htbC5weXRob24ub3JnLyIsICJiIikKKyAgICAgICAgYTIgPSBhdHRycy5yZW1vdmVOYW1lZEl0ZW1OUygiaHR0cDovL3htbC5weXRob24ub3JnLyIsICJiIikKKyAgICAgICAgc2VsZi5jb25maXJtKGExLmlzU2FtZU5vZGUoYTIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdEZvdW5kRXJyLCBhdHRycy5yZW1vdmVOYW1lZEl0ZW1OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy8iLCAiYiIpCisKKyAgICBkZWYgdGVzdEF0dHJMaXN0VmFsdWVzKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEF0dHJMaXN0TGVuZ3RoKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEF0dHJMaXN0X19nZXRpdGVtX18oc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0QXR0ckxpc3RfX3NldGl0ZW1fXyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RTZXRBdHRyVmFsdWVhbmROb2RlVmFsdWUoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0UGFyc2VFbGVtZW50KHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFBhcnNlQXR0cmlidXRlcyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RQYXJzZUVsZW1lbnROYW1lc3BhY2VzKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdFBhcnNlQXR0cmlidXRlTmFtZXNwYWNlcyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RQYXJzZVByb2Nlc3NpbmdJbnN0cnVjdGlvbnMoc2VsZik6IHBhc3MKKworICAgIGRlZiB0ZXN0Q2hpbGROb2RlcyhzZWxmKTogcGFzcworCisgICAgZGVmIHRlc3RGaXJzdENoaWxkKHNlbGYpOiBwYXNzCisKKyAgICBkZWYgdGVzdEhhc0NoaWxkTm9kZXMoc2VsZik6IHBhc3MKKworICAgIGRlZiBfdGVzdENsb25lRWxlbWVudENvcGllc0F0dHJpYnV0ZXMoc2VsZiwgZTEsIGUyLCB0ZXN0KToKKyAgICAgICAgYXR0cnMxID0gZTEuYXR0cmlidXRlcworICAgICAgICBhdHRyczIgPSBlMi5hdHRyaWJ1dGVzCisgICAgICAgIGtleXMxID0gYXR0cnMxLmtleXMoKQorICAgICAgICBrZXlzMiA9IGF0dHJzMi5rZXlzKCkKKyAgICAgICAga2V5czEuc29ydCgpCisgICAgICAgIGtleXMyLnNvcnQoKQorICAgICAgICBzZWxmLmNvbmZpcm0oa2V5czEgPT0ga2V5czIsICJjbG9uZSBvZiBlbGVtZW50IGhhcyBzYW1lIGF0dHJpYnV0ZSBrZXlzIikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGtleXMxKSk6CisgICAgICAgICAgICBhMSA9IGF0dHJzMS5pdGVtKGkpCisgICAgICAgICAgICBhMiA9IGF0dHJzMi5pdGVtKGkpCisgICAgICAgICAgICBzZWxmLmNvbmZpcm0oYTEgaXMgbm90IGEyCisgICAgICAgICAgICAgICAgICAgIGFuZCBhMS52YWx1ZSA9PSBhMi52YWx1ZQorICAgICAgICAgICAgICAgICAgICBhbmQgYTEubm9kZVZhbHVlID09IGEyLm5vZGVWYWx1ZQorICAgICAgICAgICAgICAgICAgICBhbmQgYTEubmFtZXNwYWNlVVJJID09IGEyLm5hbWVzcGFjZVVSSQorICAgICAgICAgICAgICAgICAgICBhbmQgYTEubG9jYWxOYW1lID09IGEyLmxvY2FsTmFtZQorICAgICAgICAgICAgICAgICAgICAsICJjbG9uZSBvZiBhdHRyaWJ1dGUgbm9kZSBoYXMgcHJvcGVyIGF0dHJpYnV0ZSB2YWx1ZXMiKQorICAgICAgICAgICAgc2VsZi5jb25maXJtKGEyLm93bmVyRWxlbWVudCBpcyBlMiwKKyAgICAgICAgICAgICAgICAgICAgImNsb25lIG9mIGF0dHJpYnV0ZSBub2RlIGNvcnJlY3RseSBvd25lZCIpCisKKyAgICBkZWYgX3NldHVwQ2xvbmVFbGVtZW50KHNlbGYsIGRlZXApOgorICAgICAgICBkb20gPSBwYXJzZVN0cmluZygiPGRvYyBhdHRyPSd2YWx1ZSc+PGZvby8+PC9kb2M+IikKKyAgICAgICAgcm9vdCA9IGRvbS5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgY2xvbmUgPSByb290LmNsb25lTm9kZShkZWVwKQorICAgICAgICBzZWxmLl90ZXN0Q2xvbmVFbGVtZW50Q29waWVzQXR0cmlidXRlcygKKyAgICAgICAgICAgIHJvb3QsIGNsb25lLCAidGVzdENsb25lRWxlbWVudCIgKyAoZGVlcCBhbmQgIkRlZXAiIG9yICJTaGFsbG93IikpCisgICAgICAgICMgbXV0aWxhdGUgdGhlIG9yaWdpbmFsIHNvIHNoYXJlZCBkYXRhIGlzIGRldGVjdGVkCisgICAgICAgIHJvb3QudGFnTmFtZSA9IHJvb3Qubm9kZU5hbWUgPSAiTU9ESUZJRUQiCisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJhdHRyIiwgIk5FVyBWQUxVRSIpCisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlKCJhZGRlZCIsICJWQUxVRSIpCisgICAgICAgIHJldHVybiBkb20sIGNsb25lCisKKyAgICBkZWYgdGVzdENsb25lRWxlbWVudFNoYWxsb3coc2VsZik6CisgICAgICAgIGRvbSwgY2xvbmUgPSBzZWxmLl9zZXR1cENsb25lRWxlbWVudCgwKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGNsb25lLmNoaWxkTm9kZXMpID09IDAKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMAorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5wYXJlbnROb2RlIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUudG94bWwoKSA9PSAnPGRvYyBhdHRyPSJ2YWx1ZSIvPicKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Q2xvbmVFbGVtZW50U2hhbGxvdyIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RDbG9uZUVsZW1lbnREZWVwKHNlbGYpOgorICAgICAgICBkb20sIGNsb25lID0gc2VsZi5fc2V0dXBDbG9uZUVsZW1lbnQoMSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihjbG9uZS5jaGlsZE5vZGVzKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLmNoaWxkTm9kZXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUucGFyZW50Tm9kZSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLnRveG1sKCkgPT0gJzxkb2MgYXR0cj0idmFsdWUiPjxmb28vPjwvZG9jPicKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Q2xvbmVFbGVtZW50RGVlcCIpCisgICAgICAgIGRvbS51bmxpbmsoKQorCisgICAgZGVmIHRlc3RDbG9uZURvY3VtZW50U2hhbGxvdyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjw/eG1sIHZlcnNpb249JzEuMCc/PlxuIgorICAgICAgICAgICAgICAgICAgICAiPCEtLSBjb21tZW50IC0tPiIKKyAgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgorICAgICAgICAgICAgICAgICAgICAiPCFOT1RBVElPTiBub3RhdGlvbiBTWVNURU0gJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy8nPlxuIgorICAgICAgICAgICAgICAgICAgICAiXT5cbiIKKyAgICAgICAgICAgICAgICAgICAgIjxkb2MgYXR0cj0ndmFsdWUnLz4iKQorICAgICAgICBkb2MyID0gZG9jLmNsb25lTm9kZSgwKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jMiBpcyBOb25lLAorICAgICAgICAgICAgICAgICJ0ZXN0Q2xvbmVEb2N1bWVudFNoYWxsb3c6IgorICAgICAgICAgICAgICAgICIgc2hhbGxvdyBjbG9uaW5nIG9mIGRvY3VtZW50cyBtYWtlcyBubyBzZW5zZSEiKQorCisgICAgZGVmIHRlc3RDbG9uZURvY3VtZW50RGVlcChzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjw/eG1sIHZlcnNpb249JzEuMCc/PlxuIgorICAgICAgICAgICAgICAgICAgICAiPCEtLSBjb21tZW50IC0tPiIKKyAgICAgICAgICAgICAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgorICAgICAgICAgICAgICAgICAgICAiPCFOT1RBVElPTiBub3RhdGlvbiBTWVNURU0gJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy8nPlxuIgorICAgICAgICAgICAgICAgICAgICAiXT5cbiIKKyAgICAgICAgICAgICAgICAgICAgIjxkb2MgYXR0cj0ndmFsdWUnLz4iKQorICAgICAgICBkb2MyID0gZG9jLmNsb25lTm9kZSgxKQorICAgICAgICBzZWxmLmNvbmZpcm0obm90IChkb2MuaXNTYW1lTm9kZShkb2MyKSBvciBkb2MyLmlzU2FtZU5vZGUoZG9jKSksCisgICAgICAgICAgICAgICAgInRlc3RDbG9uZURvY3VtZW50RGVlcDogZG9jdW1lbnQgb2JqZWN0cyBub3QgZGlzdGluY3QiKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKGRvYy5jaGlsZE5vZGVzKSA9PSBsZW4oZG9jMi5jaGlsZE5vZGVzKSwKKyAgICAgICAgICAgICAgICAidGVzdENsb25lRG9jdW1lbnREZWVwOiB3cm9uZyBudW1iZXIgb2YgRG9jdW1lbnQgY2hpbGRyZW4iKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jMi5kb2N1bWVudEVsZW1lbnQubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUsCisgICAgICAgICAgICAgICAgInRlc3RDbG9uZURvY3VtZW50RGVlcDogZG9jdW1lbnRFbGVtZW50IG5vdCBhbiBFTEVNRU5UX05PREUiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jMi5kb2N1bWVudEVsZW1lbnQub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYzIpLAorICAgICAgICAgICAgInRlc3RDbG9uZURvY3VtZW50RGVlcDogZG9jdW1lbnRFbGVtZW50IG93bmVyIGlzIG5vdCBuZXcgZG9jdW1lbnQiKQorICAgICAgICBzZWxmLmNvbmZpcm0obm90IGRvYy5kb2N1bWVudEVsZW1lbnQuaXNTYW1lTm9kZShkb2MyLmRvY3VtZW50RWxlbWVudCksCisgICAgICAgICAgICAgICAgInRlc3RDbG9uZURvY3VtZW50RGVlcDogZG9jdW1lbnRFbGVtZW50IHNob3VsZCBub3QgYmUgc2hhcmVkIikKKyAgICAgICAgaWYgZG9jLmRvY3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIGNoZWNrIHRoZSBkb2N0eXBlIGlmZiB0aGUgb3JpZ2luYWwgRE9NIG1haW50YWluZWQgaXQKKyAgICAgICAgICAgIHNlbGYuY29uZmlybShkb2MyLmRvY3R5cGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUsCisgICAgICAgICAgICAgICAgICAgICJ0ZXN0Q2xvbmVEb2N1bWVudERlZXA6IGRvY3R5cGUgbm90IGEgRE9DVU1FTlRfVFlQRV9OT0RFIikKKyAgICAgICAgICAgIHNlbGYuY29uZmlybShkb2MyLmRvY3R5cGUub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYzIpKQorICAgICAgICAgICAgc2VsZi5jb25maXJtKG5vdCBkb2MuZG9jdHlwZS5pc1NhbWVOb2RlKGRvYzIuZG9jdHlwZSkpCisKKyAgICBkZWYgdGVzdENsb25lRG9jdW1lbnRUeXBlRGVlcE9rKHNlbGYpOgorICAgICAgICBkb2N0eXBlID0gY3JlYXRlX25vbmVtcHR5X2RvY3R5cGUoKQorICAgICAgICBjbG9uZSA9IGRvY3R5cGUuY2xvbmVOb2RlKDEpCisgICAgICAgIHNlbGYuY29uZmlybShjbG9uZSBpcyBub3QgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5ub2RlTmFtZSA9PSBkb2N0eXBlLm5vZGVOYW1lCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLm5hbWUgPT0gZG9jdHlwZS5uYW1lCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLnB1YmxpY0lkID09IGRvY3R5cGUucHVibGljSWQKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUuc3lzdGVtSWQgPT0gZG9jdHlwZS5zeXN0ZW1JZAorICAgICAgICAgICAgICAgIGFuZCBsZW4oY2xvbmUuZW50aXRpZXMpID09IGxlbihkb2N0eXBlLmVudGl0aWVzKQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5lbnRpdGllcy5pdGVtKGxlbihjbG9uZS5lbnRpdGllcykpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgbGVuKGNsb25lLm5vdGF0aW9ucykgPT0gbGVuKGRvY3R5cGUubm90YXRpb25zKQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5ub3RhdGlvbnMuaXRlbShsZW4oY2xvbmUubm90YXRpb25zKSkgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBsZW4oY2xvbmUuY2hpbGROb2RlcykgPT0gMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRvY3R5cGUuZW50aXRpZXMpKToKKyAgICAgICAgICAgIHNlID0gZG9jdHlwZS5lbnRpdGllcy5pdGVtKGkpCisgICAgICAgICAgICBjZSA9IGNsb25lLmVudGl0aWVzLml0ZW0oaSkKKyAgICAgICAgICAgIHNlbGYuY29uZmlybSgobm90IHNlLmlzU2FtZU5vZGUoY2UpKQorICAgICAgICAgICAgICAgICAgICBhbmQgKG5vdCBjZS5pc1NhbWVOb2RlKHNlKSkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNlLm5vZGVOYW1lID09IHNlLm5vZGVOYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBjZS5ub3RhdGlvbk5hbWUgPT0gc2Uubm90YXRpb25OYW1lCisgICAgICAgICAgICAgICAgICAgIGFuZCBjZS5wdWJsaWNJZCA9PSBzZS5wdWJsaWNJZAorICAgICAgICAgICAgICAgICAgICBhbmQgY2Uuc3lzdGVtSWQgPT0gc2Uuc3lzdGVtSWQKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNlLmVuY29kaW5nID09IHNlLmVuY29kaW5nCisgICAgICAgICAgICAgICAgICAgIGFuZCBjZS5hY3R1YWxFbmNvZGluZyA9PSBzZS5hY3R1YWxFbmNvZGluZworICAgICAgICAgICAgICAgICAgICBhbmQgY2UudmVyc2lvbiA9PSBzZS52ZXJzaW9uKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZG9jdHlwZS5ub3RhdGlvbnMpKToKKyAgICAgICAgICAgIHNuID0gZG9jdHlwZS5ub3RhdGlvbnMuaXRlbShpKQorICAgICAgICAgICAgY24gPSBjbG9uZS5ub3RhdGlvbnMuaXRlbShpKQorICAgICAgICAgICAgc2VsZi5jb25maXJtKChub3Qgc24uaXNTYW1lTm9kZShjbikpCisgICAgICAgICAgICAgICAgICAgIGFuZCAobm90IGNuLmlzU2FtZU5vZGUoc24pKQorICAgICAgICAgICAgICAgICAgICBhbmQgY24ubm9kZU5hbWUgPT0gc24ubm9kZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNuLnB1YmxpY0lkID09IHNuLnB1YmxpY0lkCisgICAgICAgICAgICAgICAgICAgIGFuZCBjbi5zeXN0ZW1JZCA9PSBzbi5zeXN0ZW1JZCkKKworICAgIGRlZiB0ZXN0Q2xvbmVEb2N1bWVudFR5cGVEZWVwTm90T2soc2VsZik6CisgICAgICAgIGRvYyA9IGNyZWF0ZV9kb2Nfd2l0aF9kb2N0eXBlKCkKKyAgICAgICAgY2xvbmUgPSBkb2MuZG9jdHlwZS5jbG9uZU5vZGUoMSkKKyAgICAgICAgc2VsZi5jb25maXJtKGNsb25lIGlzIE5vbmUsICJ0ZXN0Q2xvbmVEb2N1bWVudFR5cGVEZWVwTm90T2siKQorCisgICAgZGVmIHRlc3RDbG9uZURvY3VtZW50VHlwZVNoYWxsb3dPayhzZWxmKToKKyAgICAgICAgZG9jdHlwZSA9IGNyZWF0ZV9ub25lbXB0eV9kb2N0eXBlKCkKKyAgICAgICAgY2xvbmUgPSBkb2N0eXBlLmNsb25lTm9kZSgwKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2xvbmUgaXMgbm90IE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUubm9kZU5hbWUgPT0gZG9jdHlwZS5ub2RlTmFtZQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5uYW1lID09IGRvY3R5cGUubmFtZQorICAgICAgICAgICAgICAgIGFuZCBjbG9uZS5wdWJsaWNJZCA9PSBkb2N0eXBlLnB1YmxpY0lkCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLnN5c3RlbUlkID09IGRvY3R5cGUuc3lzdGVtSWQKKyAgICAgICAgICAgICAgICBhbmQgbGVuKGNsb25lLmVudGl0aWVzKSA9PSAwCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLmVudGl0aWVzLml0ZW0oMCkgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBsZW4oY2xvbmUubm90YXRpb25zKSA9PSAwCisgICAgICAgICAgICAgICAgYW5kIGNsb25lLm5vdGF0aW9ucy5pdGVtKDApIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgbGVuKGNsb25lLmNoaWxkTm9kZXMpID09IDApCisKKyAgICBkZWYgdGVzdENsb25lRG9jdW1lbnRUeXBlU2hhbGxvd05vdE9rKHNlbGYpOgorICAgICAgICBkb2MgPSBjcmVhdGVfZG9jX3dpdGhfZG9jdHlwZSgpCisgICAgICAgIGNsb25lID0gZG9jLmRvY3R5cGUuY2xvbmVOb2RlKDApCisgICAgICAgIHNlbGYuY29uZmlybShjbG9uZSBpcyBOb25lLCAidGVzdENsb25lRG9jdW1lbnRUeXBlU2hhbGxvd05vdE9rIikKKworICAgIGRlZiBjaGVja19pbXBvcnRfZG9jdW1lbnQoc2VsZiwgZGVlcCwgdGVzdE5hbWUpOgorICAgICAgICBkb2MxID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIGRvYzIgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIsIGRvYzEuaW1wb3J0Tm9kZSwgZG9jMiwgZGVlcCkKKworICAgIGRlZiB0ZXN0SW1wb3J0RG9jdW1lbnRTaGFsbG93KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2ltcG9ydF9kb2N1bWVudCgwLCAidGVzdEltcG9ydERvY3VtZW50U2hhbGxvdyIpCisKKyAgICBkZWYgdGVzdEltcG9ydERvY3VtZW50RGVlcChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19pbXBvcnRfZG9jdW1lbnQoMSwgInRlc3RJbXBvcnREb2N1bWVudERlZXAiKQorCisgICAgZGVmIHRlc3RJbXBvcnREb2N1bWVudFR5cGVTaGFsbG93KHNlbGYpOgorICAgICAgICBzcmMgPSBjcmVhdGVfZG9jX3dpdGhfZG9jdHlwZSgpCisgICAgICAgIHRhcmdldCA9IGNyZWF0ZV9kb2Nfd2l0aG91dF9kb2N0eXBlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIsIHRhcmdldC5pbXBvcnROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMuZG9jdHlwZSwgMCkKKworICAgIGRlZiB0ZXN0SW1wb3J0RG9jdW1lbnRUeXBlRGVlcChzZWxmKToKKyAgICAgICAgc3JjID0gY3JlYXRlX2RvY193aXRoX2RvY3R5cGUoKQorICAgICAgICB0YXJnZXQgPSBjcmVhdGVfZG9jX3dpdGhvdXRfZG9jdHlwZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHhtbC5kb20uTm90U3VwcG9ydGVkRXJyLCB0YXJnZXQuaW1wb3J0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLmRvY3R5cGUsIDEpCisKKyAgICAjIFRlc3RpbmcgYXR0cmlidXRlIGNsb25lcyB1c2VzIGEgaGVscGVyLCBhbmQgc2hvdWxkIGFsd2F5cyBiZSBkZWVwLAorICAgICMgZXZlbiBpZiB0aGUgYXJndW1lbnQgdG8gY2xvbmVOb2RlIGlzIGZhbHNlLgorICAgIGRlZiBjaGVja19jbG9uZV9hdHRyaWJ1dGUoc2VsZiwgZGVlcCwgdGVzdE5hbWUpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyBhdHRyPSd2YWx1ZScvPiIpCisgICAgICAgIGF0dHIgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGF0dHIsIE5vbmUpCisgICAgICAgIGNsb25lID0gYXR0ci5jbG9uZU5vZGUoZGVlcCkKKyAgICAgICAgc2VsZi5jb25maXJtKG5vdCBjbG9uZS5pc1NhbWVOb2RlKGF0dHIpKQorICAgICAgICBzZWxmLmNvbmZpcm0obm90IGF0dHIuaXNTYW1lTm9kZShjbG9uZSkpCisgICAgICAgIHNlbGYuY29uZmlybShjbG9uZS5vd25lckVsZW1lbnQgaXMgTm9uZSwKKyAgICAgICAgICAgICAgICB0ZXN0TmFtZSArICI6IG93bmVyRWxlbWVudCBzaG91bGQgYmUgTm9uZSIpCisgICAgICAgIHNlbGYuY29uZmlybShjbG9uZS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoYXR0ci5vd25lckRvY3VtZW50KSwKKyAgICAgICAgICAgICAgICB0ZXN0TmFtZSArICI6IG93bmVyRG9jdW1lbnQgZG9lcyBub3QgbWF0Y2giKQorICAgICAgICBzZWxmLmNvbmZpcm0oY2xvbmUuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgIHRlc3ROYW1lICsgIjogY2xvbmVkIGF0dHJpYnV0ZSBtdXN0IGhhdmUgc3BlY2lmaWVkID09IFRydWUiKQorCisgICAgZGVmIHRlc3RDbG9uZUF0dHJpYnV0ZVNoYWxsb3coc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY2xvbmVfYXR0cmlidXRlKDAsICJ0ZXN0Q2xvbmVBdHRyaWJ1dGVTaGFsbG93IikKKworICAgIGRlZiB0ZXN0Q2xvbmVBdHRyaWJ1dGVEZWVwKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Nsb25lX2F0dHJpYnV0ZSgxLCAidGVzdENsb25lQXR0cmlidXRlRGVlcCIpCisKKyAgICBkZWYgY2hlY2tfY2xvbmVfcGkoc2VsZiwgZGVlcCwgdGVzdE5hbWUpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPD90YXJnZXQgZGF0YT8+PGRvYy8+IikKKyAgICAgICAgcGkgPSBkb2MuZmlyc3RDaGlsZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpLm5vZGVUeXBlLCBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKKyAgICAgICAgY2xvbmUgPSBwaS5jbG9uZU5vZGUoZGVlcCkKKyAgICAgICAgc2VsZi5jb25maXJtKGNsb25lLnRhcmdldCA9PSBwaS50YXJnZXQKKyAgICAgICAgICAgICAgICBhbmQgY2xvbmUuZGF0YSA9PSBwaS5kYXRhKQorCisgICAgZGVmIHRlc3RDbG9uZVBJU2hhbGxvdyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jbG9uZV9waSgwLCAidGVzdENsb25lUElTaGFsbG93IikKKworICAgIGRlZiB0ZXN0Q2xvbmVQSURlZXAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY2xvbmVfcGkoMSwgInRlc3RDbG9uZVBJRGVlcCIpCisKKyAgICBkZWYgdGVzdE5vcm1hbGl6ZShzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJmaXJzdCIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgic2Vjb25kIikpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMiwKKyAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZSAtLSBwcmVwYXJhdGlvbiIpCisgICAgICAgIGRvYy5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkIGlzIHJvb3QubGFzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5kYXRhID09ICJmaXJzdHNlY29uZCIKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplIC0tIHJlc3VsdCIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpCisgICAgICAgIGRvYy5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMAorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDAsCisgICAgICAgICAgICAgICAgInRlc3ROb3JtYWxpemUgLS0gc2luZ2xlIGVtcHR5IG5vZGUgcmVtb3ZlZCIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3ROb3JtYWxpemVDb21iaW5lQW5kTmV4dFNpYmxpbmcoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiZmlyc3QiKSkKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoInNlY29uZCIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVFbGVtZW50KCJpIikpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAzCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMywKKyAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZUNvbWJpbmVBbmROZXh0U2libGluZyAtLSBwcmVwYXJhdGlvbiIpCisgICAgICAgIGRvYy5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMgorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLmRhdGEgPT0gImZpcnN0c2Vjb25kIgorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQgaXMgbm90IHJvb3QubGFzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5uZXh0U2libGluZyBpcyByb290Lmxhc3RDaGlsZAorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5sYXN0Q2hpbGQucHJldmlvdXNTaWJsaW5nIGlzIHJvb3QuZmlyc3RDaGlsZAorICAgICAgICAgICAgICAgIGFuZCByb290Lmxhc3RDaGlsZC5uZXh0U2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgLCAidGVzdE5vcm1hbGl6ZUNvbWJpbmVkQW5kTmV4dFNpYmxpbmcgLS0gcmVzdWx0IikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdE5vcm1hbGl6ZURlbGV0ZVdpdGhQcmV2U2libGluZyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCisgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJmaXJzdCIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMiwKKyAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZURlbGV0ZVdpdGhQcmV2U2libGluZyAtLSBwcmVwYXJhdGlvbiIpCisgICAgICAgIGRvYy5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLmRhdGEgPT0gImZpcnN0IgorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQgaXMgcm9vdC5sYXN0Q2hpbGQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLm5leHRTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLnByZXZpb3VzU2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgLCAidGVzdE5vcm1hbGl6ZURlbGV0ZVdpdGhQcmV2U2libGluZyAtLSByZXN1bHQiKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0Tm9ybWFsaXplRGVsZXRlV2l0aE5leHRTaWJsaW5nKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKKyAgICAgICAgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIiIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgic2Vjb25kIikpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMiwKKyAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZURlbGV0ZVdpdGhOZXh0U2libGluZyAtLSBwcmVwYXJhdGlvbiIpCisgICAgICAgIGRvYy5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLmRhdGEgPT0gInNlY29uZCIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkIGlzIHJvb3QubGFzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5uZXh0U2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgICwgInRlc3ROb3JtYWxpemVEZWxldGVXaXRoTmV4dFNpYmxpbmcgLS0gcmVzdWx0IikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdE5vcm1hbGl6ZURlbGV0ZVdpdGhUd29Ob25UZXh0U2libGluZ3Moc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVFbGVtZW50KCJpIikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlRWxlbWVudCgiaSIpKQorICAgICAgICBzZWxmLmNvbmZpcm0obGVuKHJvb3QuY2hpbGROb2RlcykgPT0gMworICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXMubGVuZ3RoID09IDMsCisgICAgICAgICAgICAgICAgInRlc3ROb3JtYWxpemVEZWxldGVXaXRoVHdvU2libGluZ3MgLS0gcHJlcGFyYXRpb24iKQorICAgICAgICBkb2Mubm9ybWFsaXplKCkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZCBpcyBub3Qgcm9vdC5sYXN0Q2hpbGQKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLm5leHRTaWJsaW5nIGlzIHJvb3QubGFzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCByb290Lmxhc3RDaGlsZC5wcmV2aW91c1NpYmxpbmcgaXMgcm9vdC5maXJzdENoaWxkCisgICAgICAgICAgICAgICAgYW5kIHJvb3QubGFzdENoaWxkLm5leHRTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplRGVsZXRlV2l0aFR3b1NpYmxpbmdzIC0tIHJlc3VsdCIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3ROb3JtYWxpemVEZWxldGVBbmRDb21iaW5lKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKKyAgICAgICAgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIiIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgic2Vjb25kIikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImZvdXJ0aCIpKQorICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiIikpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSA1CisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gNSwKKyAgICAgICAgICAgICAgICAidGVzdE5vcm1hbGl6ZURlbGV0ZUFuZENvbWJpbmUgLS0gcHJlcGFyYXRpb24iKQorICAgICAgICBkb2Mubm9ybWFsaXplKCkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDEKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuZmlyc3RDaGlsZCBpcyByb290Lmxhc3RDaGlsZAorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQuZGF0YSA9PSAic2Vjb25kZm91cnRoIgorICAgICAgICAgICAgICAgIGFuZCByb290LmZpcnN0Q2hpbGQucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5maXJzdENoaWxkLm5leHRTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplRGVsZXRlQW5kQ29tYmluZSAtLSByZXN1bHQiKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0Tm9ybWFsaXplUmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxvPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8aS8+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L28+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8bz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPG8+IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidDIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICN4MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjwvbz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidDMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjeDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPC9vPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAgICI8L2RvYz4iKQorICAgICAgICByb290ID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICByb290LmNoaWxkTm9kZXNbMF0uYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkKKyAgICAgICAgcm9vdC5jaGlsZE5vZGVzWzBdLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgieCIpKQorICAgICAgICByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIngyIikpCisgICAgICAgIHJvb3QuY2hpbGROb2Rlc1sxXS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIngzIikpCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCIiKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihyb290LmNoaWxkTm9kZXMpID09IDMKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzLmxlbmd0aCA9PSAzCisgICAgICAgICAgICAgICAgYW5kIGxlbihyb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2RlcykgPT0gNAorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGggPT0gNAorICAgICAgICAgICAgICAgIGFuZCBsZW4ocm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXMpID09IDMKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXMubGVuZ3RoID09IDMKKyAgICAgICAgICAgICAgICBhbmQgbGVuKHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlcy5sZW5ndGggPT0gMgorICAgICAgICAgICAgICAgICwgInRlc3ROb3JtYWxpemUyIC0tIHByZXBhcmF0aW9uIikKKyAgICAgICAgZG9jLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4ocm9vdC5jaGlsZE5vZGVzKSA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlcy5sZW5ndGggPT0gMgorICAgICAgICAgICAgICAgIGFuZCBsZW4ocm9vdC5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMpID09IDIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMubGVuZ3RoID09IDIKKyAgICAgICAgICAgICAgICBhbmQgbGVuKHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzKSA9PSAyCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzLmxlbmd0aCA9PSAyCisgICAgICAgICAgICAgICAgYW5kIGxlbihyb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzKSA9PSAxCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplMiAtLSBjaGlsZE5vZGVzIGxlbmd0aHMiKQorICAgICAgICBzZWxmLmNvbmZpcm0ocm9vdC5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0uZGF0YSA9PSAidHgiCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMF0uZGF0YSA9PSAidDJ4MiIKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMV0uZGF0YSA9PSAidDN4MyIKKyAgICAgICAgICAgICAgICAsICJ0ZXN0Tm9ybWFsaXplMiAtLSBqb2luZWQgdGV4dCBmaWVsZHMiKQorICAgICAgICBzZWxmLmNvbmZpcm0ocm9vdC5jaGlsZE5vZGVzWzBdLmNoaWxkTm9kZXNbMV0ubmV4dFNpYmxpbmcgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXS5wcmV2aW91c1NpYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJvb3QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLnByZXZpb3VzU2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1swXS5jaGlsZE5vZGVzWzBdLm5leHRTaWJsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBpcyByb290LmNoaWxkTm9kZXNbMF0uY2hpbGROb2Rlc1sxXQorICAgICAgICAgICAgICAgIGFuZCByb290LmNoaWxkTm9kZXNbMV0uY2hpbGROb2Rlc1sxXS5uZXh0U2libGluZyBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzFdLnByZXZpb3VzU2libGluZworICAgICAgICAgICAgICAgICAgICAgICAgaXMgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0KKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0ucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgcm9vdC5jaGlsZE5vZGVzWzFdLmNoaWxkTm9kZXNbMF0ubmV4dFNpYmxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIHJvb3QuY2hpbGROb2Rlc1sxXS5jaGlsZE5vZGVzWzFdCisgICAgICAgICAgICAgICAgLCAidGVzdE5vcm1hbGl6ZTIgLS0gc2libGluZyBwb2ludGVycyIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisKKyAgICBkZWYgdGVzdEJ1ZzA3Nzc4ODQoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8bz50ZXh0PC9vPiIpCisgICAgICAgIHRleHQgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0Lm5vZGVUeXBlLCBOb2RlLlRFWFRfTk9ERSkKKyAgICAgICAgIyBTaG91bGQgcnVuIHF1aWV0bHksIGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHRleHQubm9ybWFsaXplKCkKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdEJ1ZzE0MzM2OTQoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8bz48aS8+dDwvbz4iKQorICAgICAgICBub2RlID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBub2RlLmNoaWxkTm9kZXNbMV0ubm9kZVZhbHVlID0gIiIKKyAgICAgICAgbm9kZS5ub3JtYWxpemUoKQorICAgICAgICBzZWxmLmNvbmZpcm0obm9kZS5jaGlsZE5vZGVzWy0xXS5uZXh0U2libGluZyBpcyBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIkZpbmFsIGNoaWxkJ3MgLm5leHRTaWJsaW5nIHNob3VsZCBiZSBOb25lIikKKworICAgIGRlZiB0ZXN0U2libGluZ3Moc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jPjw/cGk/PnRleHQ/PGVsbS8+PC9kb2M+IikKKyAgICAgICAgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgKHBpLCB0ZXh0LCBlbG0pID0gcm9vdC5jaGlsZE5vZGVzCisKKyAgICAgICAgc2VsZi5jb25maXJtKHBpLm5leHRTaWJsaW5nIGlzIHRleHQgYW5kCisgICAgICAgICAgICAgICAgcGkucHJldmlvdXNTaWJsaW5nIGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgdGV4dC5uZXh0U2libGluZyBpcyBlbG0gYW5kCisgICAgICAgICAgICAgICAgdGV4dC5wcmV2aW91c1NpYmxpbmcgaXMgcGkgYW5kCisgICAgICAgICAgICAgICAgZWxtLm5leHRTaWJsaW5nIGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgZWxtLnByZXZpb3VzU2libGluZyBpcyB0ZXh0LCAidGVzdFNpYmxpbmdzIikKKworICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0UGFyZW50cyhzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoCisgICAgICAgICAgICAiPGRvYz48ZWxtMT48ZWxtMi8+PGVsbTI+PGVsbTMvPjwvZWxtMj48L2VsbTE+PC9kb2M+IikKKyAgICAgICAgcm9vdCA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgZWxtMSA9IHJvb3QuY2hpbGROb2Rlc1swXQorICAgICAgICAoZWxtMmEsIGVsbTJiKSA9IGVsbTEuY2hpbGROb2RlcworICAgICAgICBlbG0zID0gZWxtMmIuY2hpbGROb2Rlc1swXQorCisgICAgICAgIHNlbGYuY29uZmlybShyb290LnBhcmVudE5vZGUgaXMgZG9jIGFuZAorICAgICAgICAgICAgICAgIGVsbTEucGFyZW50Tm9kZSBpcyByb290IGFuZAorICAgICAgICAgICAgICAgIGVsbTJhLnBhcmVudE5vZGUgaXMgZWxtMSBhbmQKKyAgICAgICAgICAgICAgICBlbG0yYi5wYXJlbnROb2RlIGlzIGVsbTEgYW5kCisgICAgICAgICAgICAgICAgZWxtMy5wYXJlbnROb2RlIGlzIGVsbTJiLCAidGVzdFBhcmVudHMiKQorICAgICAgICBkb2MudW5saW5rKCkKKworICAgIGRlZiB0ZXN0Tm9kZUxpc3RJdGVtKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYz48ZS8+PGUvPjwvZG9jPiIpCisgICAgICAgIGNoaWxkcmVuID0gZG9jLmNoaWxkTm9kZXMKKyAgICAgICAgZG9jZWxlbSA9IGNoaWxkcmVuWzBdCisgICAgICAgIHNlbGYuY29uZmlybShjaGlsZHJlblswXSBpcyBjaGlsZHJlbi5pdGVtKDApCisgICAgICAgICAgICAgICAgYW5kIGNoaWxkcmVuLml0ZW0oMSkgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBkb2NlbGVtLmNoaWxkTm9kZXMuaXRlbSgwKSBpcyBkb2NlbGVtLmNoaWxkTm9kZXNbMF0KKyAgICAgICAgICAgICAgICBhbmQgZG9jZWxlbS5jaGlsZE5vZGVzLml0ZW0oMSkgaXMgZG9jZWxlbS5jaGlsZE5vZGVzWzFdCisgICAgICAgICAgICAgICAgYW5kIGRvY2VsZW0uY2hpbGROb2Rlcy5pdGVtKDApLmNoaWxkTm9kZXMuaXRlbSgwKSBpcyBOb25lLAorICAgICAgICAgICAgICAgICJ0ZXN0IE5vZGVMaXN0Lml0ZW0oKSIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3RTQVgyRE9NKHNlbGYpOgorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IHB1bGxkb20KKworICAgICAgICBzYXgyZG9tID0gcHVsbGRvbS5TQVgyRE9NKCkKKyAgICAgICAgc2F4MmRvbS5zdGFydERvY3VtZW50KCkKKyAgICAgICAgc2F4MmRvbS5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQorICAgICAgICBzYXgyZG9tLmNoYXJhY3RlcnMoInRleHQiKQorICAgICAgICBzYXgyZG9tLnN0YXJ0RWxlbWVudCgic3ViZWxtIiwge30pCisgICAgICAgIHNheDJkb20uY2hhcmFjdGVycygidGV4dCIpCisgICAgICAgIHNheDJkb20uZW5kRWxlbWVudCgic3ViZWxtIikKKyAgICAgICAgc2F4MmRvbS5jaGFyYWN0ZXJzKCJ0ZXh0IikKKyAgICAgICAgc2F4MmRvbS5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBzYXgyZG9tLmVuZERvY3VtZW50KCkKKworICAgICAgICBkb2MgPSBzYXgyZG9tLmRvY3VtZW50CisgICAgICAgIHJvb3QgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgICh0ZXh0MSwgZWxtMSwgdGV4dDIpID0gcm9vdC5jaGlsZE5vZGVzCisgICAgICAgIHRleHQzID0gZWxtMS5jaGlsZE5vZGVzWzBdCisKKyAgICAgICAgc2VsZi5jb25maXJtKHRleHQxLnByZXZpb3VzU2libGluZyBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgIHRleHQxLm5leHRTaWJsaW5nIGlzIGVsbTEgYW5kCisgICAgICAgICAgICAgICAgZWxtMS5wcmV2aW91c1NpYmxpbmcgaXMgdGV4dDEgYW5kCisgICAgICAgICAgICAgICAgZWxtMS5uZXh0U2libGluZyBpcyB0ZXh0MiBhbmQKKyAgICAgICAgICAgICAgICB0ZXh0Mi5wcmV2aW91c1NpYmxpbmcgaXMgZWxtMSBhbmQKKyAgICAgICAgICAgICAgICB0ZXh0Mi5uZXh0U2libGluZyBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgIHRleHQzLnByZXZpb3VzU2libGluZyBpcyBOb25lIGFuZAorICAgICAgICAgICAgICAgIHRleHQzLm5leHRTaWJsaW5nIGlzIE5vbmUsICJ0ZXN0U0FYMkRPTSAtIHNpYmxpbmdzIikKKworICAgICAgICBzZWxmLmNvbmZpcm0ocm9vdC5wYXJlbnROb2RlIGlzIGRvYyBhbmQKKyAgICAgICAgICAgICAgICB0ZXh0MS5wYXJlbnROb2RlIGlzIHJvb3QgYW5kCisgICAgICAgICAgICAgICAgZWxtMS5wYXJlbnROb2RlIGlzIHJvb3QgYW5kCisgICAgICAgICAgICAgICAgdGV4dDIucGFyZW50Tm9kZSBpcyByb290IGFuZAorICAgICAgICAgICAgICAgIHRleHQzLnBhcmVudE5vZGUgaXMgZWxtMSwgInRlc3RTQVgyRE9NIC0gcGFyZW50cyIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3RFbmNvZGluZ3Moc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCc8Zm9vPiYjeDIwYWM7PC9mb28+JykKKyAgICAgICAgc2VsZi5jb25maXJtKGRvYy50b3htbCgpID09IHUnPD94bWwgdmVyc2lvbj0iMS4wIiA/Pjxmb28+XHUyMGFjPC9mb28+JworICAgICAgICAgICAgICAgIGFuZCBkb2MudG94bWwoJ3V0Zi04JykgPT0KKyAgICAgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48Zm9vPlx4ZTJceDgyXHhhYzwvZm9vPicKKyAgICAgICAgICAgICAgICBhbmQgZG9jLnRveG1sKCdpc28tODg1OS0xNScpID09CisgICAgICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTE1Ij8+PGZvbz5ceGE0PC9mb28+JywKKyAgICAgICAgICAgICAgICAidGVzdEVuY29kaW5ncyAtIGVuY29kaW5nIEVVUk8gU0lHTiIpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBjaGFyYWN0ZXIgZGVjb2RpbmcgZXJyb3JzIHJhaXNlIGV4Y2VwdGlvbnMgaW5zdGVhZAorICAgICAgICAjIG9mIGNyYXNoaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgcGFyc2VTdHJpbmcsCisgICAgICAgICAgICAgICAgJzxmcmFuXHhlN2Fpcz5Db21tZW50IFx4ZTdhIHZhID8gVHJceGU4cyBiaWVuID88L2ZyYW5ceGU3YWlzPicpCisKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBjbGFzcyBVc2VyRGF0YUhhbmRsZXI6CisgICAgICAgIGNhbGxlZCA9IDAKKyAgICAgICAgZGVmIGhhbmRsZShzZWxmLCBvcGVyYXRpb24sIGtleSwgZGF0YSwgc3JjLCBkc3QpOgorICAgICAgICAgICAgZHN0LnNldFVzZXJEYXRhKGtleSwgZGF0YSArIDEsIHNlbGYpCisgICAgICAgICAgICBzcmMuc2V0VXNlckRhdGEoa2V5LCBOb25lLCBOb25lKQorICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSAxCisKKyAgICBkZWYgdGVzdFVzZXJEYXRhKHNlbGYpOgorICAgICAgICBkb20gPSBEb2N1bWVudCgpCisgICAgICAgIG4gPSBkb20uY3JlYXRlRWxlbWVudCgnZScpCisgICAgICAgIHNlbGYuY29uZmlybShuLmdldFVzZXJEYXRhKCJmb28iKSBpcyBOb25lKQorICAgICAgICBuLnNldFVzZXJEYXRhKCJmb28iLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmNvbmZpcm0obi5nZXRVc2VyRGF0YSgiZm9vIikgaXMgTm9uZSkKKyAgICAgICAgbi5zZXRVc2VyRGF0YSgiZm9vIiwgMTIsIDEyKQorICAgICAgICBuLnNldFVzZXJEYXRhKCJiYXIiLCAxMywgMTMpCisgICAgICAgIHNlbGYuY29uZmlybShuLmdldFVzZXJEYXRhKCJmb28iKSA9PSAxMikKKyAgICAgICAgc2VsZi5jb25maXJtKG4uZ2V0VXNlckRhdGEoImJhciIpID09IDEzKQorICAgICAgICBuLnNldFVzZXJEYXRhKCJmb28iLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmNvbmZpcm0obi5nZXRVc2VyRGF0YSgiZm9vIikgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5jb25maXJtKG4uZ2V0VXNlckRhdGEoImJhciIpID09IDEzKQorCisgICAgICAgIGhhbmRsZXIgPSBzZWxmLlVzZXJEYXRhSGFuZGxlcigpCisgICAgICAgIG4uc2V0VXNlckRhdGEoImJhciIsIDEyLCBoYW5kbGVyKQorICAgICAgICBjID0gbi5jbG9uZU5vZGUoMSkKKyAgICAgICAgc2VsZi5jb25maXJtKGhhbmRsZXIuY2FsbGVkCisgICAgICAgICAgICAgICAgYW5kIG4uZ2V0VXNlckRhdGEoImJhciIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgYy5nZXRVc2VyRGF0YSgiYmFyIikgPT0gMTMpCisgICAgICAgIG4udW5saW5rKCkKKyAgICAgICAgYy51bmxpbmsoKQorICAgICAgICBkb20udW5saW5rKCkKKworICAgIGRlZiBjaGVja1JlbmFtZU5vZGVTaGFyZWRDb25zdHJhaW50cyhzZWxmLCBkb2MsIG5vZGUpOgorICAgICAgICAjIE1ha2Ugc3VyZSBpbGxlZ2FsIE5TIHVzYWdlIGlzIGRldGVjdGVkOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5hbWVzcGFjZUVyciwgZG9jLnJlbmFtZU5vZGUsIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAieG1sbnM6Zm9vIikKKyAgICAgICAgZG9jMiA9IHBhcnNlU3RyaW5nKCI8ZG9jLz4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIsIGRvYzIucmVuYW1lTm9kZSwgbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJmb28iKQorCisgICAgZGVmIHRlc3RSZW5hbWVBdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIGE9J3YnLz4iKQorICAgICAgICBlbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBhdHRybWFwID0gZWxlbS5hdHRyaWJ1dGVzCisgICAgICAgIGF0dHIgPSBlbGVtLmF0dHJpYnV0ZXNbJ2EnXQorCisgICAgICAgICMgU2ltcGxlIHJlbmFtaW5nCisgICAgICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oYXR0ci5uYW1lID09ICJiIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLm5vZGVOYW1lID09ICJiIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLmxvY2FsTmFtZSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICAgICAgYW5kIGF0dHIucHJlZml4IGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci52YWx1ZSA9PSAidiIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImIiKS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbImIiXS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGF0dHIub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYykKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5vd25lckVsZW1lbnQuaXNTYW1lTm9kZShlbGVtKSkKKworICAgICAgICAjIFJlbmFtZSB0byBoYXZlIGEgbmFtZXNwYWNlLCBubyBwcmVmaXgKKyAgICAgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAiYyIpCisgICAgICAgIHNlbGYuY29uZmlybShhdHRyLm5hbWUgPT0gImMiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gImMiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubG9jYWxOYW1lID09ICJjIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLm5hbWVzcGFjZVVSSSA9PSAiaHR0cDovL3htbC5weXRob24ub3JnL25zIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLnByZWZpeCBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGF0dHIudmFsdWUgPT0gInYiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiYSIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJiIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImMiKS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZU5TKAorICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgImMiKS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbImMiXS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbKCJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAiYyIpXS5pc1NhbWVOb2RlKGF0dHIpKQorCisgICAgICAgICMgUmVuYW1lIHRvIGhhdmUgYSBuYW1lc3BhY2UsIHdpdGggcHJlZml4CisgICAgICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIsICJwOmQiKQorICAgICAgICBzZWxmLmNvbmZpcm0oYXR0ci5uYW1lID09ICJwOmQiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubm9kZU5hbWUgPT0gInA6ZCIKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci5sb2NhbE5hbWUgPT0gImQiCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09ICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLnByZWZpeCA9PSAicCIKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci52YWx1ZSA9PSAidiIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImIiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiYyIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlTlMoCisgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAiYyIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJwOmQiKS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZU5TKAorICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIsICJkIikuaXNTYW1lTm9kZShhdHRyKQorICAgICAgICAgICAgICAgIGFuZCBhdHRybWFwWyJwOmQiXS5pc1NhbWVOb2RlKGF0dHIpCisgICAgICAgICAgICAgICAgYW5kIGF0dHJtYXBbKCJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIiwgImQiKV0uaXNTYW1lTm9kZShhdHRyKSkKKworICAgICAgICAjIFJlbmFtZSBiYWNrIHRvIGEgc2ltcGxlIG5vbi1OUyBub2RlCisgICAgICAgIGF0dHIgPSBkb2MucmVuYW1lTm9kZShhdHRyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiKQorICAgICAgICBzZWxmLmNvbmZpcm0oYXR0ci5uYW1lID09ICJlIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLm5vZGVOYW1lID09ICJlIgorICAgICAgICAgICAgICAgIGFuZCBhdHRyLmxvY2FsTmFtZSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGF0dHIubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICAgICAgYW5kIGF0dHIucHJlZml4IGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgYXR0ci52YWx1ZSA9PSAidiIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJhIikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImIiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiYyIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCJwOmQiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZU5TKAorICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgImMiKSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0uZ2V0QXR0cmlidXRlTm9kZSgiZSIpLmlzU2FtZU5vZGUoYXR0cikKKyAgICAgICAgICAgICAgICBhbmQgYXR0cm1hcFsiZSJdLmlzU2FtZU5vZGUoYXR0cikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1sLmRvbS5OYW1lc3BhY2VFcnIsIGRvYy5yZW5hbWVOb2RlLCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgInhtbG5zIikKKyAgICAgICAgc2VsZi5jaGVja1JlbmFtZU5vZGVTaGFyZWRDb25zdHJhaW50cyhkb2MsIGF0dHIpCisgICAgICAgIGRvYy51bmxpbmsoKQorCisgICAgZGVmIHRlc3RSZW5hbWVFbGVtZW50KHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYy8+IikKKyAgICAgICAgZWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKworICAgICAgICAjIFNpbXBsZSByZW5hbWluZworICAgICAgICBlbGVtID0gZG9jLnJlbmFtZU5vZGUoZWxlbSwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhIikKKyAgICAgICAgc2VsZi5jb25maXJtKGVsZW0udGFnTmFtZSA9PSAiYSIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5ub2RlTmFtZSA9PSAiYSIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5sb2NhbE5hbWUgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLnByZWZpeCBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYykpCisKKyAgICAgICAgIyBSZW5hbWUgdG8gaGF2ZSBhIG5hbWVzcGFjZSwgbm8gcHJlZml4CisgICAgICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgImIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZWxlbS50YWdOYW1lID09ICJiIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm5vZGVOYW1lID09ICJiIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmxvY2FsTmFtZSA9PSAiYiIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5uYW1lc3BhY2VVUkkgPT0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ucyIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5wcmVmaXggaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQorCisgICAgICAgICMgUmVuYW1lIHRvIGhhdmUgYSBuYW1lc3BhY2UsIHdpdGggcHJlZml4CisgICAgICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zMiIsICJwOmMiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZWxlbS50YWdOYW1lID09ICJwOmMiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubm9kZU5hbWUgPT0gInA6YyIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5sb2NhbE5hbWUgPT0gImMiCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubmFtZXNwYWNlVVJJID09ICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLnByZWZpeCA9PSAicCIKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKSkKKworICAgICAgICAjIFJlbmFtZSBiYWNrIHRvIGEgc2ltcGxlIG5vbi1OUyBub2RlCisgICAgICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImQiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZWxlbS50YWdOYW1lID09ICJkIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLm5vZGVOYW1lID09ICJkIgorICAgICAgICAgICAgICAgIGFuZCBlbGVtLmxvY2FsTmFtZSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICAgICAgYW5kIGVsZW0ucHJlZml4IGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZWxlbS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKSkKKworICAgICAgICBzZWxmLmNoZWNrUmVuYW1lTm9kZVNoYXJlZENvbnN0cmFpbnRzKGRvYywgZWxlbSkKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdFJlbmFtZU90aGVyKHNlbGYpOgorICAgICAgICAjIFdlIGhhdmUgdG8gY3JlYXRlIGEgY29tbWVudCBub2RlIGV4cGxpY2l0bHkgc2luY2Ugbm90IGFsbCBET00KKyAgICAgICAgIyBidWlsZGVycyB1c2VkIHdpdGggbWluaWRvbSBhZGQgY29tbWVudHMgdG8gdGhlIERPTS4KKyAgICAgICAgZG9jID0geG1sLmRvbS5taW5pZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoCisgICAgICAgICAgICB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiLCBOb25lKQorICAgICAgICBub2RlID0gZG9jLmNyZWF0ZUNvbW1lbnQoImNvbW1lbnQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWwuZG9tLk5vdFN1cHBvcnRlZEVyciwgZG9jLnJlbmFtZU5vZGUsIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZm9vIikKKyAgICAgICAgZG9jLnVubGluaygpCisKKyAgICBkZWYgdGVzdFdob2xlVGV4dChzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjxkb2M+YTwvZG9jPiIpCisgICAgICAgIGVsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIHRleHQgPSBlbGVtLmNoaWxkTm9kZXNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0Lm5vZGVUeXBlLCBOb2RlLlRFWFRfTk9ERSkKKworICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJhIikKKyAgICAgICAgZWxlbS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImIiKSkKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiYWIiKQorICAgICAgICBlbGVtLmluc2VydEJlZm9yZShkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKCJjIiksIHRleHQpCisgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dCwgImNhYiIpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgd2UgZG9uJ3QgY3Jvc3Mgb3RoZXIgbm9kZXMKKyAgICAgICAgc3BsaXR0ZXIgPSBkb2MuY3JlYXRlQ29tbWVudCgiY29tbWVudCIpCisgICAgICAgIGVsZW0uYXBwZW5kQ2hpbGQoc3BsaXR0ZXIpCisgICAgICAgIHRleHQyID0gZG9jLmNyZWF0ZVRleHROb2RlKCJkIikKKyAgICAgICAgZWxlbS5hcHBlbmRDaGlsZCh0ZXh0MikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiY2FiIikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImQiKQorCisgICAgICAgIHggPSBkb2MuY3JlYXRlRWxlbWVudCgieCIpCisgICAgICAgIGVsZW0ucmVwbGFjZUNoaWxkKHgsIHNwbGl0dGVyKQorICAgICAgICBzcGxpdHRlciA9IHgKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAiY2FiIikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImQiKQorCisgICAgICAgIHggPSBkb2MuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ5IiwgInoiKQorICAgICAgICBlbGVtLnJlcGxhY2VDaGlsZCh4LCBzcGxpdHRlcikKKyAgICAgICAgc3BsaXR0ZXIgPSB4CisgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dCwgImNhYiIpCisgICAgICAgIHNlbGYuY2hlY2tXaG9sZVRleHQodGV4dDIsICJkIikKKworICAgICAgICBlbGVtLnJlbW92ZUNoaWxkKHNwbGl0dGVyKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQsICJjYWJkIikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImNhYmQiKQorCisgICAgZGVmIHRlc3RQYXRjaDEwOTQxNjQoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jPjxlLz48L2RvYz4iKQorICAgICAgICBlbGVtID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBlID0gZWxlbS5maXJzdENoaWxkCisgICAgICAgIHNlbGYuY29uZmlybShlLnBhcmVudE5vZGUgaXMgZWxlbSwgIkJlZm9yZSByZXBsYWNlQ2hpbGQoKSIpCisgICAgICAgICMgQ2hlY2sgdGhhdCByZXBsYWNpbmcgYSBjaGlsZCB3aXRoIGl0c2VsZiBsZWF2ZXMgdGhlIHRyZWUgdW5jaGFuZ2VkCisgICAgICAgIGVsZW0ucmVwbGFjZUNoaWxkKGUsIGUpCisgICAgICAgIHNlbGYuY29uZmlybShlLnBhcmVudE5vZGUgaXMgZWxlbSwgIkFmdGVyIHJlcGxhY2VDaGlsZCgpIikKKworICAgIGRlZiB0ZXN0UmVwbGFjZVdob2xlVGV4dChzZWxmKToKKyAgICAgICAgZGVmIHNldHVwKCk6CisgICAgICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYz5hPGUvPmQ8L2RvYz4iKQorICAgICAgICAgICAgZWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgICAgIHRleHQxID0gZWxlbS5maXJzdENoaWxkCisgICAgICAgICAgICB0ZXh0MiA9IGVsZW0ubGFzdENoaWxkCisgICAgICAgICAgICBzcGxpdHRlciA9IHRleHQxLm5leHRTaWJsaW5nCisgICAgICAgICAgICBlbGVtLmluc2VydEJlZm9yZShkb2MuY3JlYXRlVGV4dE5vZGUoImIiKSwgc3BsaXR0ZXIpCisgICAgICAgICAgICBlbGVtLmluc2VydEJlZm9yZShkb2MuY3JlYXRlQ0RBVEFTZWN0aW9uKCJjIiksIHRleHQxKQorICAgICAgICAgICAgcmV0dXJuIGRvYywgZWxlbSwgdGV4dDEsIHNwbGl0dGVyLCB0ZXh0MgorCisgICAgICAgIGRvYywgZWxlbSwgdGV4dDEsIHNwbGl0dGVyLCB0ZXh0MiA9IHNldHVwKCkKKyAgICAgICAgdGV4dCA9IHRleHQxLnJlcGxhY2VXaG9sZVRleHQoIm5ldyBjb250ZW50IikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAibmV3IGNvbnRlbnQiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQyLCAiZCIpCisgICAgICAgIHNlbGYuY29uZmlybShsZW4oZWxlbS5jaGlsZE5vZGVzKSA9PSAzKQorCisgICAgICAgIGRvYywgZWxlbSwgdGV4dDEsIHNwbGl0dGVyLCB0ZXh0MiA9IHNldHVwKCkKKyAgICAgICAgdGV4dCA9IHRleHQyLnJlcGxhY2VXaG9sZVRleHQoIm5ldyBjb250ZW50IikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0LCAibmV3IGNvbnRlbnQiKQorICAgICAgICBzZWxmLmNoZWNrV2hvbGVUZXh0KHRleHQxLCAiY2FiIikKKyAgICAgICAgc2VsZi5jb25maXJtKGxlbihlbGVtLmNoaWxkTm9kZXMpID09IDUpCisKKyAgICAgICAgZG9jLCBlbGVtLCB0ZXh0MSwgc3BsaXR0ZXIsIHRleHQyID0gc2V0dXAoKQorICAgICAgICB0ZXh0ID0gdGV4dDEucmVwbGFjZVdob2xlVGV4dCgiIikKKyAgICAgICAgc2VsZi5jaGVja1dob2xlVGV4dCh0ZXh0MiwgImQiKQorICAgICAgICBzZWxmLmNvbmZpcm0odGV4dCBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIGxlbihlbGVtLmNoaWxkTm9kZXMpID09IDIpCisKKyAgICBkZWYgdGVzdFNjaGVtYVR5cGUoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKAorICAgICAgICAgICAgIjwhRE9DVFlQRSBkb2MgW1xuIgorICAgICAgICAgICAgIiAgPCFFTlRJVFkgZTEgU1lTVEVNICdodHRwOi8veG1sLnB5dGhvbi5vcmcvZTEnPlxuIgorICAgICAgICAgICAgIiAgPCFFTlRJVFkgZTIgU1lTVEVNICdodHRwOi8veG1sLnB5dGhvbi5vcmcvZTInPlxuIgorICAgICAgICAgICAgIiAgPCFBVFRMSVNUIGRvYyBpZCAgIElEICAgICAgICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICByZWYgIElEUkVGICAgICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICByZWZzIElEUkVGUyAgICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBlbnVtIChhfGIpICAgICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBlbnQgIEVOVElUWSAgICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBlbnRzIEVOVElUSUVTICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBubSAgIE5NVE9LRU4gICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICBubXMgIE5NVE9LRU5TICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICB0ZXh0IENEQVRBICAgICNJTVBMSUVEIFxuIgorICAgICAgICAgICAgIiAgICA+XG4iCisgICAgICAgICAgICAiXT48ZG9jIGlkPSduYW1lJyBub3RpZD0nbmFtZScgdGV4dD0nc3BsYXQhJyBlbnVtPSdiJyIKKyAgICAgICAgICAgICIgICAgICAgcmVmPSduYW1lJyByZWZzPSduYW1lIG5hbWUnIGVudD0nZTEnIGVudHM9J2UxIGUyJyIKKyAgICAgICAgICAgICIgICAgICAgbm09JzEyMycgbm1zPScxMjMgYWJjJyAvPiIpCisgICAgICAgIGVsZW0gPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgICMgV2UgZG9uJ3Qgd2FudCB0byByZWx5IG9uIGFueSBzcGVjaWZpYyBsb2FkZXIgYXQgdGhpcyBwb2ludCwgc28KKyAgICAgICAgIyBqdXN0IG1ha2Ugc3VyZSB3ZSBjYW4gZ2V0IHRvIGFsbCB0aGUgbmFtZXMsIGFuZCB0aGF0IHRoZQorICAgICAgICAjIERURC1iYXNlZCBuYW1lc3BhY2UgaXMgcmlnaHQuICBUaGUgbmFtZXMgY2FuIHZhcnkgYnkgbG9hZGVyCisgICAgICAgICMgc2luY2UgZWFjaCBzdXBwb3J0cyBhIGRpZmZlcmVudCBsZXZlbCBvZiBEVEQgaW5mb3JtYXRpb24uCisgICAgICAgIHQgPSBlbGVtLnNjaGVtYVR5cGUKKyAgICAgICAgc2VsZi5jb25maXJtKHQubmFtZSBpcyBOb25lCisgICAgICAgICAgICAgICAgYW5kIHQubmFtZXNwYWNlID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFKQorICAgICAgICBuYW1lcyA9ICJpZCBub3RpZCB0ZXh0IGVudW0gcmVmIHJlZnMgZW50IGVudHMgbm0gbm1zIi5zcGxpdCgpCisgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgYSA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKQorICAgICAgICAgICAgdCA9IGEuc2NoZW1hVHlwZQorICAgICAgICAgICAgc2VsZi5jb25maXJtKGhhc2F0dHIodCwgIm5hbWUiKQorICAgICAgICAgICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCisKKyAgICBkZWYgdGVzdFNldElkQXR0cmlidXRlKHNlbGYpOgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyBhMT0ndicgYTI9J3cnLz4iKQorICAgICAgICBlID0gZG9jLmRvY3VtZW50RWxlbWVudAorICAgICAgICBhMSA9IGUuZ2V0QXR0cmlidXRlTm9kZSgiYTEiKQorICAgICAgICBhMiA9IGUuZ2V0QXR0cmlidXRlTm9kZSgiYTIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBub3QgYTEuaXNJZAorICAgICAgICAgICAgICAgIGFuZCBub3QgYTIuaXNJZCkKKyAgICAgICAgZS5zZXRJZEF0dHJpYnV0ZSgiYTEiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpKQorICAgICAgICAgICAgICAgIGFuZCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMi5pc0lkKQorICAgICAgICBlLnNldElkQXR0cmlidXRlKCJhMiIpCisgICAgICAgIHNlbGYuY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikpCisgICAgICAgICAgICAgICAgYW5kIGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkKKyAgICAgICAgICAgICAgICBhbmQgYTEuaXNJZAorICAgICAgICAgICAgICAgIGFuZCBhMi5pc0lkKQorICAgICAgICAjIHJlcGxhY2UgdGhlIGExIG5vZGU7IHRoZSBuZXcgbm9kZSBzaG91bGQgKm5vdCogYmUgYW4gSUQKKyAgICAgICAgYTMgPSBkb2MuY3JlYXRlQXR0cmlidXRlKCJhMSIpCisgICAgICAgIGEzLnZhbHVlID0gInYiCisgICAgICAgIGUuc2V0QXR0cmlidXRlTm9kZShhMykKKyAgICAgICAgc2VsZi5jb25maXJtKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQorICAgICAgICAgICAgICAgIGFuZCBub3QgYTEuaXNJZAorICAgICAgICAgICAgICAgIGFuZCBhMi5pc0lkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMy5pc0lkKQorICAgICAgICAjIHJlbmFtaW5nIGFuIGF0dHJpYnV0ZSBzaG91bGQgbm90IGFmZmVjdCBpdHMgSUQtbmVzczoKKyAgICAgICAgZG9jLnJlbmFtZU5vZGUoYTIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYW4iKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQorICAgICAgICAgICAgICAgIGFuZCBhMi5pc0lkKQorCisgICAgZGVmIHRlc3RTZXRJZEF0dHJpYnV0ZU5TKHNlbGYpOgorICAgICAgICBOUzEgPSAiaHR0cDovL3htbC5weXRob24ub3JnL25zMSIKKyAgICAgICAgTlMyID0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczIiCisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIHhtbG5zOm5zMT0nIiArIE5TMSArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIHhtbG5zOm5zMj0nIiArIE5TMiArICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiIG5zMTphMT0ndicgbnMyOmEyPSd3Jy8+IikKKyAgICAgICAgZSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKKyAgICAgICAgYTEgPSBlLmdldEF0dHJpYnV0ZU5vZGVOUyhOUzEsICJhMSIpCisgICAgICAgIGEyID0gZS5nZXRBdHRyaWJ1dGVOb2RlTlMoTlMyLCAiYTIiKQorICAgICAgICBzZWxmLmNvbmZpcm0oZG9jLmdldEVsZW1lbnRCeUlkKCJ2IikgaXMgTm9uZQorICAgICAgICAgICAgICAgIGFuZCBub3QgYTEuaXNJZAorICAgICAgICAgICAgICAgIGFuZCBub3QgYTIuaXNJZCkKKyAgICAgICAgZS5zZXRJZEF0dHJpYnV0ZU5TKE5TMSwgImExIikKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSkKKyAgICAgICAgICAgICAgICBhbmQgYTEuaXNJZAorICAgICAgICAgICAgICAgIGFuZCBub3QgYTIuaXNJZCkKKyAgICAgICAgZS5zZXRJZEF0dHJpYnV0ZU5TKE5TMiwgImEyIikKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSkKKyAgICAgICAgICAgICAgICBhbmQgZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQorICAgICAgICAgICAgICAgIGFuZCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIGEyLmlzSWQpCisgICAgICAgICMgcmVwbGFjZSB0aGUgYTEgbm9kZTsgdGhlIG5ldyBub2RlIHNob3VsZCAqbm90KiBiZSBhbiBJRAorICAgICAgICBhMyA9IGRvYy5jcmVhdGVBdHRyaWJ1dGVOUyhOUzEsICJhMSIpCisgICAgICAgIGEzLnZhbHVlID0gInYiCisgICAgICAgIGUuc2V0QXR0cmlidXRlTm9kZShhMykKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkpCisgICAgICAgIHNlbGYuY29uZmlybShub3QgYTEuaXNJZCkKKyAgICAgICAgc2VsZi5jb25maXJtKGEyLmlzSWQpCisgICAgICAgIHNlbGYuY29uZmlybShub3QgYTMuaXNJZCkKKyAgICAgICAgc2VsZi5jb25maXJtKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpIGlzIE5vbmUpCisgICAgICAgICMgcmVuYW1pbmcgYW4gYXR0cmlidXRlIHNob3VsZCBub3QgYWZmZWN0IGl0cyBJRC1uZXNzOgorICAgICAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCisgICAgICAgIHNlbGYuY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCisgICAgICAgICAgICAgICAgYW5kIGEyLmlzSWQpCisKKyAgICBkZWYgdGVzdFNldElkQXR0cmlidXRlTm9kZShzZWxmKToKKyAgICAgICAgTlMxID0gImh0dHA6Ly94bWwucHl0aG9uLm9yZy9uczEiCisgICAgICAgIE5TMiA9ICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIgorICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiB4bWxuczpuczE9JyIgKyBOUzEgKyAiJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiB4bWxuczpuczI9JyIgKyBOUzIgKyAiJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBuczE6YTE9J3YnIG5zMjphMj0ndycvPiIpCisgICAgICAgIGUgPSBkb2MuZG9jdW1lbnRFbGVtZW50CisgICAgICAgIGExID0gZS5nZXRBdHRyaWJ1dGVOb2RlTlMoTlMxLCAiYTEiKQorICAgICAgICBhMiA9IGUuZ2V0QXR0cmlidXRlTm9kZU5TKE5TMiwgImEyIikKKyAgICAgICAgc2VsZi5jb25maXJtKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpIGlzIE5vbmUKKyAgICAgICAgICAgICAgICBhbmQgbm90IGExLmlzSWQKKyAgICAgICAgICAgICAgICBhbmQgbm90IGEyLmlzSWQpCisgICAgICAgIGUuc2V0SWRBdHRyaWJ1dGVOb2RlKGExKQorICAgICAgICBzZWxmLmNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpKQorICAgICAgICAgICAgICAgIGFuZCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIG5vdCBhMi5pc0lkKQorICAgICAgICBlLnNldElkQXR0cmlidXRlTm9kZShhMikKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSkKKyAgICAgICAgICAgICAgICBhbmQgZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQorICAgICAgICAgICAgICAgIGFuZCBhMS5pc0lkCisgICAgICAgICAgICAgICAgYW5kIGEyLmlzSWQpCisgICAgICAgICMgcmVwbGFjZSB0aGUgYTEgbm9kZTsgdGhlIG5ldyBub2RlIHNob3VsZCAqbm90KiBiZSBhbiBJRAorICAgICAgICBhMyA9IGRvYy5jcmVhdGVBdHRyaWJ1dGVOUyhOUzEsICJhMSIpCisgICAgICAgIGEzLnZhbHVlID0gInYiCisgICAgICAgIGUuc2V0QXR0cmlidXRlTm9kZShhMykKKyAgICAgICAgc2VsZi5jb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkpCisgICAgICAgIHNlbGYuY29uZmlybShub3QgYTEuaXNJZCkKKyAgICAgICAgc2VsZi5jb25maXJtKGEyLmlzSWQpCisgICAgICAgIHNlbGYuY29uZmlybShub3QgYTMuaXNJZCkKKyAgICAgICAgc2VsZi5jb25maXJtKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpIGlzIE5vbmUpCisgICAgICAgICMgcmVuYW1pbmcgYW4gYXR0cmlidXRlIHNob3VsZCBub3QgYWZmZWN0IGl0cyBJRC1uZXNzOgorICAgICAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCisgICAgICAgIHNlbGYuY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCisgICAgICAgICAgICAgICAgYW5kIGEyLmlzSWQpCisKKyAgICBkZWYgdGVzdFBpY2tsZWREb2N1bWVudChzZWxmKToKKyAgICAgICAgZG9jID0gcGFyc2VTdHJpbmcoIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J3VzLWFzY2lpJz8+XG4iCisgICAgICAgICAgICAgICAgICAgICI8IURPQ1RZUEUgZG9jIFBVQkxJQyAnaHR0cDovL3htbC5weXRob24ub3JnL3B1YmxpYyciCisgICAgICAgICAgICAgICAgICAgICIgJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy9zeXN0ZW0nIFtcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAgPCFFTEVNRU5UIGUgRU1QVFk+XG4iCisgICAgICAgICAgICAgICAgICAgICIgIDwhRU5USVRZIGVudCBTWVNURU0gJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy9lbnRpdHknPlxuIgorICAgICAgICAgICAgICAgICAgICAiXT48ZG9jIGF0dHI9J3ZhbHVlJz4gdGV4dFxuIgorICAgICAgICAgICAgICAgICAgICAiPD9waSBzYW1wbGU/PiA8IS0tIGNvbW1lbnQgLS0+IDxlLz4gPC9kb2M+IikKKyAgICAgICAgcyA9IHBpY2tsZS5kdW1wcyhkb2MpCisgICAgICAgIGRvYzIgPSBwaWNrbGUubG9hZHMocykKKyAgICAgICAgc3RhY2sgPSBbKGRvYywgZG9jMildCisgICAgICAgIHdoaWxlIHN0YWNrOgorICAgICAgICAgICAgbjEsIG4yID0gc3RhY2sucG9wKCkKKyAgICAgICAgICAgIHNlbGYuY29uZmlybShuMS5ub2RlVHlwZSA9PSBuMi5ub2RlVHlwZQorICAgICAgICAgICAgICAgICAgICBhbmQgbGVuKG4xLmNoaWxkTm9kZXMpID09IGxlbihuMi5jaGlsZE5vZGVzKQorICAgICAgICAgICAgICAgICAgICBhbmQgbjEubm9kZU5hbWUgPT0gbjIubm9kZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBuMS5pc1NhbWVOb2RlKG4yKQorICAgICAgICAgICAgICAgICAgICBhbmQgbm90IG4yLmlzU2FtZU5vZGUobjEpKQorICAgICAgICAgICAgaWYgbjEubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CisgICAgICAgICAgICAgICAgbGVuKG4xLmVudGl0aWVzKQorICAgICAgICAgICAgICAgIGxlbihuMi5lbnRpdGllcykKKyAgICAgICAgICAgICAgICBsZW4objEubm90YXRpb25zKQorICAgICAgICAgICAgICAgIGxlbihuMi5ub3RhdGlvbnMpCisgICAgICAgICAgICAgICAgc2VsZi5jb25maXJtKGxlbihuMS5lbnRpdGllcykgPT0gbGVuKG4yLmVudGl0aWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxlbihuMS5ub3RhdGlvbnMpID09IGxlbihuMi5ub3RhdGlvbnMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihuMS5ub3RhdGlvbnMpKToKKyAgICAgICAgICAgICAgICAgICAgIyBYWFggdGhpcyBsb29wIGJvZHkgZG9lc24ndCBzZWVtIHRvIGJlIGV4ZWN1dGVkPworICAgICAgICAgICAgICAgICAgICBubzEgPSBuMS5ub3RhdGlvbnMuaXRlbShpKQorICAgICAgICAgICAgICAgICAgICBubzIgPSBuMS5ub3RhdGlvbnMuaXRlbShpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpcm0obm8xLm5hbWUgPT0gbm8yLm5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm8xLnB1YmxpY0lkID09IG5vMi5wdWJsaWNJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBubzEuc3lzdGVtSWQgPT0gbm8yLnN5c3RlbUlkKQorICAgICAgICAgICAgICAgICAgICBzdGFjay5hcHBlbmQoKG5vMSwgbm8yKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4objEuZW50aXRpZXMpKToKKyAgICAgICAgICAgICAgICAgICAgZTEgPSBuMS5lbnRpdGllcy5pdGVtKGkpCisgICAgICAgICAgICAgICAgICAgIGUyID0gbjIuZW50aXRpZXMuaXRlbShpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbmZpcm0oZTEubm90YXRpb25OYW1lID09IGUyLm5vdGF0aW9uTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlMS5wdWJsaWNJZCA9PSBlMi5wdWJsaWNJZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBlMS5zeXN0ZW1JZCA9PSBlMi5zeXN0ZW1JZCkKKyAgICAgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKChlMSwgZTIpKQorICAgICAgICAgICAgaWYgbjEubm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgICAgIHNlbGYuY29uZmlybShuMS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUoZG9jKQorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG4yLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MyKSkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihuMS5jaGlsZE5vZGVzKSk6CisgICAgICAgICAgICAgICAgc3RhY2suYXBwZW5kKChuMS5jaGlsZE5vZGVzW2ldLCBuMi5jaGlsZE5vZGVzW2ldKSkKKworICAgIGRlZiB0ZXN0U2VyaWFsaXplQ29tbWVudE5vZGVXaXRoRG91YmxlSHlwaGVuKHNlbGYpOgorICAgICAgICBkb2MgPSBjcmVhdGVfZG9jX3dpdGhvdXRfZG9jdHlwZSgpCisgICAgICAgIGRvYy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ29tbWVudCgiZm9vLS1iYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZG9jLnRveG1sKQorCisgICAgZGVmIHRlc3RFbXB0eVhNTE5TVmFsdWUoc2VsZik6CisgICAgICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZWxlbWVudCB4bWxucz0nJz5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIjxmb28vPlxuPC9lbGVtZW50PiIpCisgICAgICAgIGRvYzIgPSBwYXJzZVN0cmluZyhkb2MudG94bWwoKSkKKyAgICAgICAgc2VsZi5jb25maXJtKGRvYzIubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTWluaWRvbVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbmlkb20ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmMDkyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbmlkb20ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbmlkb20ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbWluaWRvbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmMDkyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21pbmlkb20ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21tYXAucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tbWFwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGIyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tbWFwLnB5CkBAIC0wLDAgKzEsNzI0IEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAoVEVTVEZOLCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUsIHVubGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlcywgXzJHLCBfNEcpCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcywgcmUsIGl0ZXJ0b29scywgc29ja2V0LCBzeXMKKworbW1hcCA9IGltcG9ydF9tb2R1bGUoJ21tYXAnKQorCitQQUdFU0laRSA9IG1tYXAuUEFHRVNJWkUKKworY2xhc3MgTW1hcFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgVGVzdCBtbWFwIG1vZHVsZSBvbiBVbml4IHN5c3RlbXMgYW5kIFdpbmRvd3MKKworICAgICAgICAjIENyZWF0ZSBhIGZpbGUgdG8gYmUgbW1hcCdlZC4KKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFdyaXRlIDIgcGFnZXMgd29ydGggb2YgZGF0YSB0byB0aGUgZmlsZQorICAgICAgICAgICAgZi53cml0ZSgnXDAnKiBQQUdFU0laRSkKKyAgICAgICAgICAgIGYud3JpdGUoJ2ZvbycpCisgICAgICAgICAgICBmLndyaXRlKCdcMCcqIChQQUdFU0laRS0zKSApCisgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMiAqIFBBR0VTSVpFKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgICMgU2ltcGxlIHNhbml0eSBjaGVja3MKKworICAgICAgICAgICAgdHAgPSBzdHIodHlwZShtKSkgICMgU0YgYnVnIDEyODcxMzogIHNlZ2ZhdWx0ZWQgb24gTGludXgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKCdmb28nKSwgUEFHRVNJWkUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0pLCAyKlBBR0VTSVpFKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMF0sICdcMCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMDozXSwgJ1wwXDBcMCcpCisKKyAgICAgICAgICAgICMgU2hvdWxkbid0IGNyYXNoIG9uIGJvdW5kYXJ5IChJc3N1ZSAjNTI5MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uX19nZXRpdGVtX18sIGxlbihtKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG0uX19zZXRpdGVtX18sIGxlbihtKSwgJ1wwJykKKworICAgICAgICAgICAgIyBNb2RpZnkgdGhlIGZpbGUncyBjb250ZW50CisgICAgICAgICAgICBtWzBdID0gJzMnCisgICAgICAgICAgICBtW1BBR0VTSVpFICszOiBQQUdFU0laRSArMyszXSA9ICdiYXInCisKKyAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgbW9kaWZpY2F0aW9uIHdvcmtlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzBdLCAnMycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMDozXSwgJzNcMFwwJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVtQQUdFU0laRS0xIDogUEFHRVNJWkUgKyA3XSwgJ1wwZm9vYmFyXDAnKQorCisgICAgICAgICAgICBtLmZsdXNoKCkKKworICAgICAgICAgICAgIyBUZXN0IGRvaW5nIGEgcmVndWxhciBleHByZXNzaW9uIG1hdGNoIGluIGFuIG1tYXAnZWQgZmlsZQorICAgICAgICAgICAgbWF0Y2ggPSByZS5zZWFyY2goJ1tBLVphLXpdKycsIG0pCisgICAgICAgICAgICBpZiBtYXRjaCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgncmVnZXggbWF0Y2ggb24gbW1hcCBmYWlsZWQhJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG1hdGNoLnNwYW4oMCkKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydAorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydCwgUEFHRVNJWkUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmQsIFBBR0VTSVpFICsgNikKKworICAgICAgICAgICAgIyB0ZXN0IHNlZWtpbmcgYXJvdW5kICh0cnkgdG8gb3ZlcmZsb3cgdGhlIHNlZWsgaW1wbGVtZW50YXRpb24pCisgICAgICAgICAgICBtLnNlZWsoMCwwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgMCkKKyAgICAgICAgICAgIG0uc2Vlayg0MiwxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgNDIpCisgICAgICAgICAgICBtLnNlZWsoMCwyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgbGVuKG0pKQorCisgICAgICAgICAgICAjIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIC0xKQorCisgICAgICAgICAgICAjIFRyeSB0byBzZWVrIGJleW9uZCBlbmQgb2YgbW1hcC4uLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5zZWVrLCAxLCAyKQorCisgICAgICAgICAgICAjIFRyeSB0byBzZWVrIHRvIG5lZ2F0aXZlIHBvc2l0aW9uLi4uCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIC1sZW4obSktMSwgMikKKworICAgICAgICAgICAgIyBUcnkgcmVzaXppbmcgbWFwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbS5yZXNpemUoNTEyKQorICAgICAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOgorICAgICAgICAgICAgICAgICMgcmVzaXplKCkgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICMgTm8gbWVzc2FnZXMgYXJlIHByaW50ZWQsIHNpbmNlIHRoZSBvdXRwdXQgb2YgdGhpcyB0ZXN0IHN1aXRlCisgICAgICAgICAgICAgICAgIyB3b3VsZCB0aGVuIGJlIGRpZmZlcmVudCBhY3Jvc3MgcGxhdGZvcm1zLgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyByZXNpemUoKSBpcyBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtKSwgNTEyKQorICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIHNlZWsgYmV5b25kIHRoZSBuZXcgc2l6ZS4KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLnNlZWssIDUxMywgMCkKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGlzIHRydW5jYXRlZCB0b28KKyAgICAgICAgICAgICAgICAjIChidWcgIzcyODUxNSkKKyAgICAgICAgICAgICAgICBmID0gb3BlbihURVNURk4pCisgICAgICAgICAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgNTEyKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zaXplKCksIDUxMikKKworICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2FjY2Vzc19wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgImFjY2VzcyIga2V5d29yZCBwYXJhbWV0ZXIKKyAgICAgICAgbWFwc2l6ZSA9IDEwCisgICAgICAgIG9wZW4oVEVTVEZOLCAid2IiKS53cml0ZSgiYSIqbWFwc2l6ZSkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicmIiKQorICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bOl0sICdhJyptYXBzaXplLCAiUmVhZG9ubHkgbWVtb3J5IG1hcCBkYXRhIGluY29ycmVjdC4iKQorCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHNsaWNlIGFzc2lnbmVkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1bOl0gPSAnYicqbWFwc2l6ZQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIGl0ZW0gYXNzaWduZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbVswXSA9ICdiJworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHdyaXRlKCkgdG8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbS5zZWVrKDAsMCkKKyAgICAgICAgICAgIG0ud3JpdGUoJ2FiYycpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkFibGUgdG8gd3JpdGUgdG8gcmVhZG9ubHkgbWVtb3J5IG1hcCIpCisKKyAgICAgICAgIyBFbnN1cmluZyB0aGF0IHJlYWRvbmx5IG1tYXAgY2FuJ3QgYmUgd3JpdGVfYnl0ZSgpIHRvCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG0uc2VlaygwLDApCisgICAgICAgICAgICBtLndyaXRlX2J5dGUoJ2QnKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHdyaXRlIHRvIHJlYWRvbmx5IG1lbW9yeSBtYXAiKQorCisgICAgICAgICMgRW5zdXJpbmcgdGhhdCByZWFkb25seSBtbWFwIGNhbid0IGJlIHJlc2l6ZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbS5yZXNpemUoMiptYXBzaXplKQorICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6ICAgIyByZXNpemUgaXMgbm90IHVuaXZlcnNhbGx5IHN1cHBvcnRlZAorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJBYmxlIHRvIHJlc2l6ZSByZWFkb25seSBtZW1vcnkgbWFwIikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGRlbCBtLCBmCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlbihURVNURk4sICJyYiIpLnJlYWQoKSwgJ2EnKm1hcHNpemUsCisgICAgICAgICAgICAgICAiUmVhZG9ubHkgbWVtb3J5IG1hcCBkYXRhIGZpbGUgd2FzIG1vZGlmaWVkIikKKworICAgICAgICAjIE9wZW5pbmcgbW1hcCB3aXRoIHNpemUgdG9vIGJpZworICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSsxKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICMgd2UgZG8gbm90IGV4cGVjdCBhIFZhbHVlRXJyb3Igb24gV2luZG93cworICAgICAgICAgICAgIyBDQVVUSU9OOiAgVGhpcyBhbHNvIGNoYW5nZXMgdGhlIHNpemUgb2YgdGhlIGZpbGUgb24gZGlzaywgYW5kCisgICAgICAgICAgICAjIGxhdGVyIHRlc3RzIGFzc3VtZSB0aGF0IHRoZSBsZW5ndGggaGFzbid0IGNoYW5nZWQuICBXZSBuZWVkIHRvCisgICAgICAgICAgICAjIHJlcGFpciB0aGF0LgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3BlbmluZyBtbWFwIHdpdGggc2l6ZSsxIHNob3VsZCB3b3JrIG9uIFdpbmRvd3MuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgd2UgZXhwZWN0IGEgVmFsdWVFcnJvciBvbiBVbml4LCBidXQgbm90IG9uIFdpbmRvd3MKKyAgICAgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJPcGVuaW5nIG1tYXAgd2l0aCBzaXplKzEgc2hvdWxkIHJhaXNlIFZhbHVlRXJyb3IuIikKKyAgICAgICAgICAgIG0uY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgorICAgICAgICAgICAgIyBSZXBhaXIgZGFtYWdlIGZyb20gdGhlIHJlc2l6aW5nIHRlc3QuCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICdyK2InKQorICAgICAgICAgICAgZi50cnVuY2F0ZShtYXBzaXplKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBPcGVuaW5nIG1tYXAgd2l0aCBhY2Nlc3M9QUNDRVNTX1dSSVRFCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgInIrYiIpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgYWNjZXNzPW1tYXAuQUNDRVNTX1dSSVRFKQorICAgICAgICAjIE1vZGlmeWluZyB3cml0ZS10aHJvdWdoIG1lbW9yeSBtYXAKKyAgICAgICAgbVs6XSA9ICdjJyptYXBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgJ2MnKm1hcHNpemUsCisgICAgICAgICAgICAgICAiV3JpdGUtdGhyb3VnaCBtZW1vcnkgbWFwIG1lbW9yeSBub3QgdXBkYXRlZCBwcm9wZXJseS4iKQorICAgICAgICBtLmZsdXNoKCkKKyAgICAgICAgbS5jbG9zZSgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmID0gb3BlbihURVNURk4sICdyYicpCisgICAgICAgIHN0dWZmID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R1ZmYsICdjJyptYXBzaXplLAorICAgICAgICAgICAgICAgIldyaXRlLXRocm91Z2ggbWVtb3J5IG1hcCBkYXRhIGZpbGUgbm90IHVwZGF0ZWQgcHJvcGVybHkuIikKKworICAgICAgICAjIE9wZW5pbmcgbW1hcCB3aXRoIGFjY2Vzcz1BQ0NFU1NfQ09QWQorICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz1tbWFwLkFDQ0VTU19DT1BZKQorICAgICAgICAjIE1vZGlmeWluZyBjb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAKKyAgICAgICAgbVs6XSA9ICdkJyptYXBzaXplCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgJ2QnICogbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICJDb3B5LW9uLXdyaXRlIG1lbW9yeSBtYXAgZGF0YSBub3Qgd3JpdHRlbiBjb3JyZWN0bHkuIikKKyAgICAgICAgbS5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlbihURVNURk4sICJyYiIpLnJlYWQoKSwgJ2MnKm1hcHNpemUsCisgICAgICAgICAgICAgICAiQ29weS1vbi13cml0ZSB0ZXN0IGRhdGEgZmlsZSBzaG91bGQgbm90IGJlIG1vZGlmaWVkLiIpCisgICAgICAgICMgRW5zdXJpbmcgY29weS1vbi13cml0ZSBtYXBzIGNhbm5vdCBiZSByZXNpemVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbS5yZXNpemUsIDIqbWFwc2l6ZSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGRlbCBtLCBmCisKKyAgICAgICAgIyBFbnN1cmluZyBpbnZhbGlkIGFjY2VzcyBwYXJhbWV0ZXIgcmFpc2VzIGV4Y2VwdGlvbgorICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtbWFwLm1tYXAsIGYuZmlsZW5vKCksIG1hcHNpemUsIGFjY2Vzcz00KQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBpZiBvcy5uYW1lID09ICJwb3NpeCI6CisgICAgICAgICAgICAjIFRyeSBpbmNvbXBhdGlibGUgZmxhZ3MsIHByb3QgYW5kIGFjY2VzcyBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1tYXAubW1hcCwgZi5maWxlbm8oKSwgbWFwc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPW1tYXAuTUFQX1BSSVZBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90PW1tYXAuUFJPVF9SRUFELCBhY2Nlc3M9bW1hcC5BQ0NFU1NfV1JJVEUpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgIyBUcnkgd3JpdGluZyB3aXRoIFBST1RfRVhFQyBhbmQgd2l0aG91dCBQUk9UX1dSSVRFCisgICAgICAgICAgICBwcm90ID0gbW1hcC5QUk9UX1JFQUQgfCBnZXRhdHRyKG1tYXAsICdQUk9UX0VYRUMnLCAwKQorICAgICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInIrYiIpIGFzIGY6CisgICAgICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplLCBwcm90PXByb3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtLndyaXRlLCBiImFiY2RlZiIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtLndyaXRlX2J5dGUsIDApCisgICAgICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9iYWRfZmlsZV9kZXNjKHNlbGYpOgorICAgICAgICAjIFRyeSBvcGVuaW5nIGEgYmFkIGZpbGUgZGVzY3JpcHRvci4uLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtbWFwLmVycm9yLCBtbWFwLm1tYXAsIC0yLCA0MDk2KQorCisgICAgZGVmIHRlc3RfdG91Z2hlcl9maW5kKHNlbGYpOgorICAgICAgICAjIERvIGEgdG91Z2hlciAuZmluZCgpIHRlc3QuICBTRiBidWcgNTE1OTQzIHBvaW50ZWQgb3V0IHRoYXQsIGluIDIuMiwKKyAgICAgICAgIyBzZWFyY2hpbmcgZm9yIGRhdGEgd2l0aCBlbWJlZGRlZCBcMCBieXRlcyBkaWRuJ3Qgd29yay4KKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndysnKQorCisgICAgICAgIGRhdGEgPSAnYWFiYWFjXHgwMGRlZWZceDAwXHgwMGFhXHgwMCcKKyAgICAgICAgbiA9IGxlbihkYXRhKQorICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgIGYuZmx1c2goKQorICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG4pCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgIGZvciBzdGFydCBpbiByYW5nZShuKzEpOgorICAgICAgICAgICAgZm9yIGZpbmlzaCBpbiByYW5nZShzdGFydCwgbisxKToKKyAgICAgICAgICAgICAgICBzbGljZSA9IGRhdGFbc3RhcnQgOiBmaW5pc2hdCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoc2xpY2UpLCBkYXRhLmZpbmQoc2xpY2UpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKHNsaWNlICsgJ3gnKSwgLTEpCisgICAgICAgIG0uY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZmluZF9lbmQoc2VsZik6CisgICAgICAgICMgdGVzdCB0aGUgbmV3ICdlbmQnIHBhcmFtZXRlciB3b3JrcyBhcyBleHBlY3RlZAorICAgICAgICBmID0gb3BlbihURVNURk4sICd3KycpCisgICAgICAgIGRhdGEgPSAnb25lIHR3byBvbmVzJworICAgICAgICBuID0gbGVuKGRhdGEpCisgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgZi5mbHVzaCgpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbikKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmZpbmQoJ29uZScpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZCgnb25lcycpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZCgnb25lJywgMCwgLTEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZmluZCgnb25lJywgMSksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKCdvbmUnLCAxLCAtMSksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5maW5kKCdvbmUnLCAxLCAtMiksIC0xKQorCisKKyAgICBkZWYgdGVzdF9yZmluZChzZWxmKToKKyAgICAgICAgIyB0ZXN0IHRoZSBuZXcgJ2VuZCcgcGFyYW1ldGVyIHdvcmtzIGFzIGV4cGVjdGVkCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKKyAgICAgICAgZGF0YSA9ICdvbmUgdHdvIG9uZXMnCisgICAgICAgIG4gPSBsZW4oZGF0YSkKKyAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBuKQorICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmZpbmQoJ29uZScpLCA4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmZpbmQoJ29uZSAnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJmaW5kKCdvbmUnLCAwLCAtMSksIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZmluZCgnb25lJywgMCwgLTIpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ucmZpbmQoJ29uZScsIDEsIC0xKSwgOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnJmaW5kKCdvbmUnLCAxLCAtMiksIC0xKQorCisKKyAgICBkZWYgdGVzdF9kb3VibGVfY2xvc2Uoc2VsZik6CisgICAgICAgICMgbWFrZSBzdXJlIGEgZG91YmxlIGNsb3NlIGRvZXNuJ3QgY3Jhc2ggb24gU29sYXJpcyAoQnVnIyA2NjU5MTMpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKKworICAgICAgICBmLndyaXRlKDIqKjE2ICogJ2EnKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOKQorICAgICAgICBtZiA9IG1tYXAubW1hcChmLmZpbGVubygpLCAyKioxNiwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCisgICAgICAgIG1mLmNsb3NlKCkKKyAgICAgICAgbWYuY2xvc2UoKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2VudGlyZV9maWxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgbWFwcGluZyBvZiBlbnRpcmUgZmlsZSBieSBwYXNzaW5nIDAgZm9yIG1hcCBsZW5ndGgKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInN0YXQiKToKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgIncrIikKKworICAgICAgICAgICAgZi53cml0ZSgyKioxNiAqICdtJykgIyBBcmJpdHJhcnkgY2hhcmFjdGVyCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicmIrIikKKyAgICAgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtZiksIDIqKjE2LCAiTWFwIHNpemUgc2hvdWxkIGVxdWFsIGZpbGUgc2l6ZS4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZi5yZWFkKDIqKjE2KSwgMioqMTYgKiAibSIpCisgICAgICAgICAgICBtZi5jbG9zZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2xlbmd0aF8wX29mZnNldChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTA5MTY6IHRlc3QgbWFwcGluZyBvZiByZW1haW5kZXIgb2YgZmlsZSBieSBwYXNzaW5nIDAgZm9yCisgICAgICAgICMgbWFwIGxlbmd0aCB3aXRoIGFuIG9mZnNldCBkb2Vzbid0IGNhdXNlIGEgc2VnZmF1bHQuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAic3RhdCIpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgibmVlZHMgb3Muc3RhdCIpCisgICAgICAgICMgTk9URTogYWxsb2NhdGlvbiBncmFudWxhcml0eSBpcyBjdXJyZW50bHkgNjU1MzYgdW5kZXIgV2luNjQsCisgICAgICAgICMgYW5kIHRoZXJlZm9yZSB0aGUgbWluaW11bSBvZmZzZXQgYWxpZ25tZW50LgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgoNjU1MzYgKiAyKSAqIGInbScpICMgQXJiaXRyYXJ5IGNoYXJhY3RlcgorCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBtZiA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwLCBvZmZzZXQ9NjU1MzYsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG1mLl9fZ2V0aXRlbV9fLCA4MDAwMCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbWYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbGVuZ3RoXzBfbGFyZ2Vfb2Zmc2V0KHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMDk1OTogdGVzdCBtYXBwaW5nIG9mIGEgZmlsZSBieSBwYXNzaW5nIDAgZm9yCisgICAgICAgICMgbWFwIGxlbmd0aCB3aXRoIGEgbGFyZ2Ugb2Zmc2V0IGRvZXNuJ3QgY2F1c2UgYSBzZWdmYXVsdC4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJzdGF0Iik6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJuZWVkcyBvcy5zdGF0IikKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgxMTU2OTkgKiBiJ20nKSAjIEFyYml0cmFyeSBjaGFyYWN0ZXIKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAidytiIikgYXMgZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1tYXAubW1hcCwgZi5maWxlbm8oKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0yMTQ3NDE4MTEyKQorCisgICAgZGVmIHRlc3RfbW92ZShzZWxmKToKKyAgICAgICAgIyBtYWtlIG1vdmUgd29ya3MgZXZlcnl3aGVyZSAoNjQtYml0IGZvcm1hdCBwcm9ibGVtIGVhcmxpZXIpCisgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgJ3crJykKKworICAgICAgICBmLndyaXRlKCJBQkNERWFiY2RlIikgIyBBcmJpdHJhcnkgY2hhcmFjdGVyCisgICAgICAgIGYuZmx1c2goKQorCisgICAgICAgIG1mID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIDEwKQorICAgICAgICBtZi5tb3ZlKDUsIDAsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWZbOl0sICJBQkNERUFCQ0RFIiwgIk1hcCBtb3ZlIHNob3VsZCBoYXZlIGR1cGxpY2F0ZWQgZnJvbnQgNSIpCisgICAgICAgIG1mLmNsb3NlKCkKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBtb3JlIGV4Y2Vzc2l2ZSB0ZXN0CisgICAgICAgIGRhdGEgPSAiMDEyMzQ1Njc4OSIKKyAgICAgICAgZm9yIGRlc3QgaW4gcmFuZ2UobGVuKGRhdGEpKToKKyAgICAgICAgICAgIGZvciBzcmMgaW4gcmFuZ2UobGVuKGRhdGEpKToKKyAgICAgICAgICAgICAgICBmb3IgY291bnQgaW4gcmFuZ2UobGVuKGRhdGEpIC0gbWF4KGRlc3QsIHNyYykpOgorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGRhdGFbOmRlc3RdICsgZGF0YVtzcmM6c3JjK2NvdW50XSArIGRhdGFbZGVzdCtjb3VudDpdCisgICAgICAgICAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoLTEsIGxlbihkYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgbVs6XSA9IGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbS5tb3ZlKGRlc3QsIHNyYywgY291bnQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgIG0uY2xvc2UoKQorCisgICAgICAgICMgc2VnZmF1bHQgdGVzdCAoSXNzdWUgNTM4NykKKyAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgMTAwKQorICAgICAgICBvZmZzZXRzID0gWy0xMDAsIC0xLCAwLCAxLCAxMDBdCisgICAgICAgIGZvciBzb3VyY2UsIGRlc3QsIHNpemUgaW4gaXRlcnRvb2xzLnByb2R1Y3Qob2Zmc2V0cywgb2Zmc2V0cywgb2Zmc2V0cyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbS5tb3ZlKHNvdXJjZSwgZGVzdCwgc2l6ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBvZmZzZXRzID0gWygtMSwgLTEsIC0xKSwgKC0xLCAtMSwgMCksICgtMSwgMCwgLTEpLCAoMCwgLTEsIC0xKSwKKyAgICAgICAgICAgICAgICAgICAoLTEsIDAsIDApLCAoMCwgLTEsIDApLCAoMCwgMCwgLTEpXQorICAgICAgICBmb3Igc291cmNlLCBkZXN0LCBzaXplIGluIG9mZnNldHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLm1vdmUsIHNvdXJjZSwgZGVzdCwgc2l6ZSkKKworICAgICAgICBtLmNsb3NlKCkKKworICAgICAgICBtID0gbW1hcC5tbWFwKC0xLCAxKSAjIHNpbmdsZSBieXRlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0ubW92ZSwgMCwgMCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5tb3ZlLCAxLCAwLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLm1vdmUsIDAsIDEsIDEpCisgICAgICAgIG0ubW92ZSgwLCAwLCAxKQorICAgICAgICBtLm1vdmUoMCwgMCwgMCkKKworCisgICAgZGVmIHRlc3RfYW5vbnltb3VzKHNlbGYpOgorICAgICAgICAjIGFub255bW91cyBtbWFwLm1tYXAoLTEsIFBBR0UpCisgICAgICAgIG0gPSBtbWFwLm1tYXAoLTEsIFBBR0VTSVpFKQorICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoUEFHRVNJWkUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtW3hdLCAnXDAnLCAiYW5vbnltb3VzbHkgbW1hcCdlZCBjb250ZW50cyBzaG91bGQgYmUgemVybyIpCisKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKFBBR0VTSVpFKToKKyAgICAgICAgICAgIG1beF0gPSBjaCA9IGNocih4ICYgMjU1KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtW3hdLCBjaCkKKworICAgIGRlZiB0ZXN0X2V4dGVuZGVkX2dldHNsaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXh0ZW5kZWQgc2xpY2luZyBieSBjb21wYXJpbmcgd2l0aCBsaXN0IHNsaWNpbmcuCisgICAgICAgIHMgPSAiIi5qb2luKGNocihjKSBmb3IgYyBpbiByZXZlcnNlZChyYW5nZSgyNTYpKSkKKyAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgbGVuKHMpKQorICAgICAgICBtWzpdID0gcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bOl0sIHMpCisgICAgICAgIGluZGljZXMgPSAoMCwgTm9uZSwgMSwgMywgMTksIDMwMCwgLTEsIC0yLCAtMzEsIC0zMDApCisgICAgICAgIGZvciBzdGFydCBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZm9yIHN0b3AgaW4gaW5kaWNlczoKKyAgICAgICAgICAgICAgICAjIFNraXAgc3RlcCAwIChpbnZhbGlkKQorICAgICAgICAgICAgICAgIGZvciBzdGVwIGluIGluZGljZXNbMTpdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bc3RhcnQ6c3RvcDpzdGVwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW3N0YXJ0OnN0b3A6c3RlcF0pCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9zZXRfZGVsX3NsaWNlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZXh0ZW5kZWQgc2xpY2luZyBieSBjb21wYXJpbmcgd2l0aCBsaXN0IHNsaWNpbmcuCisgICAgICAgIHMgPSAiIi5qb2luKGNocihjKSBmb3IgYyBpbiByZXZlcnNlZChyYW5nZSgyNTYpKSkKKyAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgbGVuKHMpKQorICAgICAgICBpbmRpY2VzID0gKDAsIE5vbmUsIDEsIDMsIDE5LCAzMDAsIC0xLCAtMiwgLTMxLCAtMzAwKQorICAgICAgICBmb3Igc3RhcnQgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIGZvciBzdG9wIGluIGluZGljZXM6CisgICAgICAgICAgICAgICAgIyBTa2lwIGludmFsaWQgc3RlcCAwCisgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gaW5kaWNlc1sxOl06CisgICAgICAgICAgICAgICAgICAgIG1bOl0gPSBzCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgcykKKyAgICAgICAgICAgICAgICAgICAgTCA9IGxpc3QocykKKyAgICAgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhIHNsaWNlIG9mIGV4YWN0bHkgdGhlIHJpZ2h0IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgIyBidXQgd2l0aCBkaWZmZXJlbnQgZGF0YS4KKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IExbc3RhcnQ6c3RvcDpzdGVwXQorICAgICAgICAgICAgICAgICAgICBkYXRhID0gIiIuam9pbihyZXZlcnNlZChkYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgTFtzdGFydDpzdG9wOnN0ZXBdID0gZGF0YQorICAgICAgICAgICAgICAgICAgICBtW3N0YXJ0OnN0b3A6c3RlcF0gPSBkYXRhCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgIiIuam9pbihMKSkKKworICAgIGRlZiBtYWtlX21tYXBfZmlsZSAoc2VsZiwgZiwgaGFsZnNpemUpOgorICAgICAgICAjIFdyaXRlIDIgcGFnZXMgd29ydGggb2YgZGF0YSB0byB0aGUgZmlsZQorICAgICAgICBmLndyaXRlICgnXDAnICogaGFsZnNpemUpCisgICAgICAgIGYud3JpdGUgKCdmb28nKQorICAgICAgICBmLndyaXRlICgnXDAnICogKGhhbGZzaXplIC0gMykpCisgICAgICAgIGYuZmx1c2ggKCkKKyAgICAgICAgcmV0dXJuIG1tYXAubW1hcCAoZi5maWxlbm8oKSwgMCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2ZpbGUgKHNlbGYpOgorICAgICAgICBmID0gb3BlbiAoVEVTVEZOLCAndytiJykKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGYgOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMCwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCisgICAgICAgICAgICAgICAgbS5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgbm90IGhhdmUgYmVlbiBhYmxlIHRvIG1tYXAgZW1wdHkgZmlsZSIpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tZXNzYWdlLCAiY2Fubm90IG1tYXAgYW4gZW1wdHkgZmlsZSIpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmV4cGVjdGVkIGV4Y2VwdGlvbjogIiArIHN0cihlKSkKKworICAgIGRlZiB0ZXN0X29mZnNldCAoc2VsZik6CisgICAgICAgIGYgPSBvcGVuIChURVNURk4sICd3K2InKQorCisgICAgICAgIHRyeTogIyB1bmxpbmsgVEVTVEZOIG5vIG1hdHRlciB3aGF0CisgICAgICAgICAgICBoYWxmc2l6ZSA9IG1tYXAuQUxMT0NBVElPTkdSQU5VTEFSSVRZCisgICAgICAgICAgICBtID0gc2VsZi5tYWtlX21tYXBfZmlsZSAoZiwgaGFsZnNpemUpCisgICAgICAgICAgICBtLmNsb3NlICgpCisgICAgICAgICAgICBmLmNsb3NlICgpCisKKyAgICAgICAgICAgIG1hcHNpemUgPSBoYWxmc2l6ZSAqIDIKKyAgICAgICAgICAgICMgVHJ5IGludmFsaWQgb2Zmc2V0CisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICAgICAgZm9yIG9mZnNldCBpbiBbLTIsIC0xLCBOb25lXToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgbWFwc2l6ZSwgb2Zmc2V0PW9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCAxKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgVHlwZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgMCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFRyeSB2YWxpZCBvZmZzZXQsIGhvcGVmdWxseSA4MTkyIHdvcmtzIG9uIGFsbCBPU2VzCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBtYXBzaXplIC0gaGFsZnNpemUsIG9mZnNldD1oYWxmc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswOjNdLCAnZm9vJykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAjIFRyeSByZXNpemluZyBtYXAKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtLnJlc2l6ZSg1MTIpCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIHJlc2l6ZSgpIGlzIHN1cHBvcnRlZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG0pLCA1MTIpCisgICAgICAgICAgICAgICAgIyBDaGVjayB0aGF0IHdlIGNhbiBubyBsb25nZXIgc2VlayBiZXlvbmQgdGhlIG5ldyBzaXplLgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0uc2VlaywgNTEzLCAwKQorICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgY29udGVudCBpcyBub3QgY2hhbmdlZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVswOjNdLCAnZm9vJykKKworICAgICAgICAgICAgICAgICMgQ2hlY2sgdGhhdCB0aGUgdW5kZXJseWluZyBmaWxlIGlzIHRydW5jYXRlZCB0b28KKyAgICAgICAgICAgICAgICBmID0gb3BlbihURVNURk4pCisgICAgICAgICAgICAgICAgZi5zZWVrKDAsIDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnRlbGwoKSwgaGFsZnNpemUgKyA1MTIpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnNpemUoKSwgaGFsZnNpemUgKyA1MTIpCisKKyAgICAgICAgICAgIG0uY2xvc2UoKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIGFub25fbW1hcChtbWFwLm1tYXApOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oa2xhc3MsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIG1tYXAubW1hcC5fX25ld19fKGtsYXNzLCAtMSwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBhbm9uX21tYXAoUEFHRVNJWkUpCisKKyAgICBkZWYgdGVzdF9wcm90X3JlYWRvbmx5KHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihtbWFwLCAnUFJPVF9SRUFEJyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbWFwc2l6ZSA9IDEwCisgICAgICAgIG9wZW4oVEVTVEZOLCAid2IiKS53cml0ZSgiYSIqbWFwc2l6ZSkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicmIiKQorICAgICAgICBtID0gbW1hcC5tbWFwKGYuZmlsZW5vKCksIG1hcHNpemUsIHByb3Q9bW1hcC5QUk9UX1JFQUQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbS53cml0ZSwgImZvbyIpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKG1tYXAuZXJyb3IsIEVudmlyb25tZW50RXJyb3IpKQorICAgICAgICBzZWxmLmFzc2VydEluKCJtbWFwLmVycm9yIiwgc3RyKG1tYXAuZXJyb3IpKQorCisgICAgZGVmIHRlc3RfaW9fbWV0aG9kcyhzZWxmKToKKyAgICAgICAgZGF0YSA9ICIwMTIzNDU2Nzg5IgorICAgICAgICBvcGVuKFRFU1RGTiwgIndiIikud3JpdGUoIngiKmxlbihkYXRhKSkKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAicitiIikKKyAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCBsZW4oZGF0YSkpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAjIFRlc3Qgd3JpdGVfYnl0ZSgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oZGF0YSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgaSkKKyAgICAgICAgICAgIG0ud3JpdGVfYnl0ZShkYXRhW2ldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgaSsxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLndyaXRlX2J5dGUsICJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzpdLCBkYXRhKQorICAgICAgICAjIFRlc3QgcmVhZF9ieXRlKCkKKyAgICAgICAgbS5zZWVrKDApCisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oZGF0YSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZWFkX2J5dGUoKSwgZGF0YVtpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS50ZWxsKCksIGkrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS5yZWFkX2J5dGUpCisgICAgICAgICMgVGVzdCByZWFkKCkKKyAgICAgICAgbS5zZWVrKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5yZWFkKDMpLCAiMzQ1IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLnRlbGwoKSwgNikKKyAgICAgICAgIyBUZXN0IHdyaXRlKCkKKyAgICAgICAgbS5zZWVrKDMpCisgICAgICAgIG0ud3JpdGUoImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS50ZWxsKCksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobVs6XSwgIjAxMmJhcjY3ODkiKQorICAgICAgICBtLnNlZWsoOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbS53cml0ZSwgImJhciIpCisKKyAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgIGRlZiB0ZXN0X3RhZ25hbWUoc2VsZik6CisgICAgICAgICAgICBkYXRhMSA9ICIwMTIzNDU2Nzg5IgorICAgICAgICAgICAgZGF0YTIgPSAiYWJjZGVmZ2hpaiIKKyAgICAgICAgICAgIGFzc2VydCBsZW4oZGF0YTEpID09IGxlbihkYXRhMikKKworICAgICAgICAgICAgIyBUZXN0IHNhbWUgdGFnCisgICAgICAgICAgICBtMSA9IG1tYXAubW1hcCgtMSwgbGVuKGRhdGExKSwgdGFnbmFtZT0iZm9vIikKKyAgICAgICAgICAgIG0xWzpdID0gZGF0YTEKKyAgICAgICAgICAgIG0yID0gbW1hcC5tbWFwKC0xLCBsZW4oZGF0YTIpLCB0YWduYW1lPSJmb28iKQorICAgICAgICAgICAgbTJbOl0gPSBkYXRhMgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMVs6XSwgZGF0YTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0yWzpdLCBkYXRhMikKKyAgICAgICAgICAgIG0yLmNsb3NlKCkKKyAgICAgICAgICAgIG0xLmNsb3NlKCkKKworICAgICAgICAgICAgIyBUZXN0IGRpZmZlcmVudCB0YWcKKyAgICAgICAgICAgIG0xID0gbW1hcC5tbWFwKC0xLCBsZW4oZGF0YTEpLCB0YWduYW1lPSJmb28iKQorICAgICAgICAgICAgbTFbOl0gPSBkYXRhMQorICAgICAgICAgICAgbTIgPSBtbWFwLm1tYXAoLTEsIGxlbihkYXRhMiksIHRhZ25hbWU9ImJvbyIpCisgICAgICAgICAgICBtMls6XSA9IGRhdGEyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0xWzpdLCBkYXRhMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTJbOl0sIGRhdGEyKQorICAgICAgICAgICAgbTIuY2xvc2UoKQorICAgICAgICAgICAgbTEuY2xvc2UoKQorCisgICAgICAgIGRlZiB0ZXN0X2NyYXNoZXJfb25fd2luZG93cyhzZWxmKToKKyAgICAgICAgICAgICMgU2hvdWxkIG5vdCBjcmFzaCAoSXNzdWUgMTczMzk4NikKKyAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoLTEsIDEwMDAsIHRhZ25hbWU9ImZvbyIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbW1hcC5tbWFwKC0xLCA1MDAwLCB0YWduYW1lPSJmb28iKVs6XSAjIHNhbWUgdGFnbmFtZSwgYnV0IGxhcmdlciBzaXplCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICAgICAgICAgICMgU2hvdWxkIG5vdCBjcmFzaCAoSXNzdWUgNTM4NSkKKyAgICAgICAgICAgIG9wZW4oVEVTVEZOLCAid2IiKS53cml0ZSgieCIqMTApCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICJyK2IiKQorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbS5yZXNpemUoMCkgIyB3aWxsIHJhaXNlIFdpbmRvd3NFcnJvcgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtWzpdCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICAgICAgZGVmIHRlc3RfaW52YWxpZF9kZXNjcmlwdG9yKHNlbGYpOgorICAgICAgICAgICAgIyBzb2NrZXQgZmlsZSBkZXNjcmlwdG9ycyBhcmUgdmFsaWQsIGJ1dCBvdXQgb2YgcmFuZ2UKKyAgICAgICAgICAgICMgZm9yIF9nZXRfb3NmaGFuZGxlLCBjYXVzaW5nIGEgY3Jhc2ggd2hlbiB2YWxpZGF0aW5nIHRoZQorICAgICAgICAgICAgIyBwYXJhbWV0ZXJzIHRvIF9nZXRfb3NmaGFuZGxlLgorICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMobW1hcC5lcnJvcik6CisgICAgICAgICAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAocy5maWxlbm8oKSwgMTApCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisKK2NsYXNzIExhcmdlTW1hcFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKworICAgIGRlZiBfbWFrZV90ZXN0X2ZpbGUoc2VsZiwgbnVtX3plcm9lcywgdGFpbCk6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbicgb3Igc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgcmVxdWlyZXMoJ2xhcmdlZmlsZScsCisgICAgICAgICAgICAgICAgJ3Rlc3QgcmVxdWlyZXMgJXMgYnl0ZXMgYW5kIGEgbG9uZyB0aW1lIHRvIHJ1bicgJSBzdHIoMHgxODAwMDAwMDApKQorICAgICAgICBmID0gb3BlbihURVNURk4sICd3K2InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLnNlZWsobnVtX3plcm9lcykKKyAgICAgICAgICAgIGYud3JpdGUodGFpbCkKKyAgICAgICAgICAgIGYuZmx1c2goKQorICAgICAgICBleGNlcHQgKElPRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiZmlsZXN5c3RlbSBkb2VzIG5vdCBoYXZlIGxhcmdlZmlsZSBzdXBwb3J0IikKKyAgICAgICAgcmV0dXJuIGYKKworICAgIGRlZiB0ZXN0X2xhcmdlX29mZnNldChzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLl9tYWtlX3Rlc3RfZmlsZSgweDE0RkZGRkZGRiwgYiIgIikgYXMgZjoKKyAgICAgICAgICAgIG0gPSBtbWFwLm1tYXAoZi5maWxlbm8oKSwgMCwgb2Zmc2V0PTB4MTQwMDAwMDAwLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMHhGRkZGRkZGXSwgYiIgIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9sYXJnZV9maWxlc2l6ZShzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLl9tYWtlX3Rlc3RfZmlsZSgweDE3RkZGRkZGRiwgYiIgIikgYXMgZjoKKyAgICAgICAgICAgIGlmIHN5cy5tYXhzaXplIDwgMHgxODAwMDAwMDA6CisgICAgICAgICAgICAgICAgIyBPbiAzMiBiaXQgcGxhdGZvcm1zIHRoZSBmaWxlIGlzIGxhcmdlciB0aGFuIHN5cy5tYXhzaXplIHNvCisgICAgICAgICAgICAgICAgIyBtYXBwaW5nIHRoZSB3aG9sZSBmaWxlIHNob3VsZCBmYWlsIC0tIElzc3VlICMxNjc0MworICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIG1tYXAubW1hcChmLmZpbGVubygpLCAweDE4MDAwMDAwMCwgYWNjZXNzPW1tYXAuQUNDRVNTX1JFQUQpCisgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgbW1hcC5tbWFwKGYuZmlsZW5vKCksIDAsIGFjY2Vzcz1tbWFwLkFDQ0VTU19SRUFEKQorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAweDEwMDAwLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uc2l6ZSgpLCAweDE4MDAwMDAwMCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICAjIElzc3VlIDExMjc3OiBtbWFwKCkgd2l0aCBsYXJnZSAofjRHQikgc3BhcnNlIGZpbGVzIGNyYXNoZXMgb24gT1MgWC4KKworICAgIGRlZiBfdGVzdF9hcm91bmRfYm91bmRhcnkoc2VsZiwgYm91bmRhcnkpOgorICAgICAgICB0YWlsID0gYicgIERFQVJkZWFyICAnCisgICAgICAgIHN0YXJ0ID0gYm91bmRhcnkgLSBsZW4odGFpbCkgLy8gMgorICAgICAgICBlbmQgPSBzdGFydCArIGxlbih0YWlsKQorICAgICAgICB3aXRoIHNlbGYuX21ha2VfdGVzdF9maWxlKHN0YXJ0LCB0YWlsKSBhcyBmOgorICAgICAgICAgICAgbSA9IG1tYXAubW1hcChmLmZpbGVubygpLCAwLCBhY2Nlc3M9bW1hcC5BQ0NFU1NfUkVBRCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bc3RhcnQ6ZW5kXSwgdGFpbCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgbS5jbG9zZSgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMubWF4c2l6ZSA+IF80RywgInRlc3QgY2Fubm90IHJ1biBvbiAzMi1iaXQgc3lzdGVtcyIpCisgICAgZGVmIHRlc3RfYXJvdW5kXzJHQihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9hcm91bmRfYm91bmRhcnkoXzJHKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLm1heHNpemUgPiBfNEcsICJ0ZXN0IGNhbm5vdCBydW4gb24gMzItYml0IHN5c3RlbXMiKQorICAgIGRlZiB0ZXN0X2Fyb3VuZF80R0Ioc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfYXJvdW5kX2JvdW5kYXJ5KF80RykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE1tYXBUZXN0cywgTGFyZ2VNbWFwVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21tYXAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW1hcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwNWUwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21tYXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21tYXAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW1hcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkNTMzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21tYXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWVhZjNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlLnB5CkBAIC0wLDAgKzEsODUgQEAKKyMgVGVzdCB0aGUgbW9kdWxlIHR5cGUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBnY19jb2xsZWN0CisKK2ltcG9ydCBzeXMKK01vZHVsZVR5cGUgPSB0eXBlKHN5cykKKworY2xhc3MgTW9kdWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3VuaW5pdGlhbGl6ZWQoc2VsZik6CisgICAgICAgICMgQW4gdW5pbml0aWFsaXplZCBtb2R1bGUgaGFzIG5vIF9fZGljdF9fIG9yIF9fbmFtZV9fLAorICAgICAgICAjIGFuZCBfX2RvY19fIGlzIE5vbmUKKyAgICAgICAgZm9vID0gTW9kdWxlVHlwZS5fX25ld19fKE1vZHVsZVR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb28uX19kaWN0X18gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXJyb3IsIGRpciwgZm9vKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gZm9vLl9fbmFtZV9fCisgICAgICAgICAgICBzZWxmLmZhaWwoIl9fbmFtZV9fID0gJXMiICUgcmVwcihzKSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX2RvY19fLCBNb2R1bGVUeXBlLl9fZG9jX18pCisKKyAgICBkZWYgdGVzdF9ub19kb2NzdHJpbmcoc2VsZik6CisgICAgICAgICMgUmVndWxhcmx5IGluaXRpYWxpemVkIG1vZHVsZSwgbm8gZG9jc3RyaW5nCisgICAgICAgIGZvbyA9IE1vZHVsZVR5cGUoImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fbmFtZV9fLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kb2NfXywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kaWN0X18sIHsiX19uYW1lX18iOiAiZm9vIiwgIl9fZG9jX18iOiBOb25lfSkKKworICAgIGRlZiB0ZXN0X2FzY2lpX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBBU0NJSSBkb2NzdHJpbmcKKyAgICAgICAgZm9vID0gTW9kdWxlVHlwZSgiZm9vIiwgImZvb2RvYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fbmFtZV9fLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kb2NfXywgImZvb2RvYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fZGljdF9fLAorICAgICAgICAgICAgICAgICAgICAgICAgIHsiX19uYW1lX18iOiAiZm9vIiwgIl9fZG9jX18iOiAiZm9vZG9jIn0pCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2RvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBVbmljb2RlIGRvY3N0cmluZworICAgICAgICBmb28gPSBNb2R1bGVUeXBlKCJmb28iLCB1ImZvb2RvY1x1MTIzNCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fbmFtZV9fLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kb2NfXywgdSJmb29kb2NcdTEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX2RpY3RfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICB7Il9fbmFtZV9fIjogImZvbyIsICJfX2RvY19fIjogdSJmb29kb2NcdTEyMzQifSkKKworICAgIGRlZiB0ZXN0X3JlaW5pdChzZWxmKToKKyAgICAgICAgIyBSZWluaXRpYWxpemF0aW9uIHNob3VsZCBub3QgcmVwbGFjZSB0aGUgX19kaWN0X18KKyAgICAgICAgZm9vID0gTW9kdWxlVHlwZSgiZm9vIiwgdSJmb29kb2NcdTEyMzQiKQorICAgICAgICBmb28uYmFyID0gNDIKKyAgICAgICAgZCA9IGZvby5fX2RpY3RfXworICAgICAgICBmb28uX19pbml0X18oImZvbyIsICJmb29kb2MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX25hbWVfXywgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9fZG9jX18sICJmb29kb2MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5iYXIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5fX2RpY3RfXywKKyAgICAgICAgICAgICAgeyJfX25hbWVfXyI6ICJmb28iLCAiX19kb2NfXyI6ICJmb29kb2MiLCAiYmFyIjogNDJ9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9vLl9fZGljdF9fIGlzIGQpCisKKyAgICBAdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCisgICAgZGVmIHRlc3RfZG9udF9jbGVhcl9kaWN0KHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSA3MTQwLgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgZm9vID0gTW9kdWxlVHlwZSgiZm9vIikKKyAgICAgICAgICAgIGZvby5iYXIgPSA0CisgICAgICAgICAgICByZXR1cm4gZm9vCisgICAgICAgIGdjX2NvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoKS5fX2RpY3RfX1siYmFyIl0sIDQpCisKKyAgICBkZWYgdGVzdF9jbGVhcl9kaWN0X2luX3JlZl9jeWNsZShzZWxmKToKKyAgICAgICAgZGVzdHJveWVkID0gW10KKyAgICAgICAgbSA9IE1vZHVsZVR5cGUoImZvbyIpCisgICAgICAgIG0uZGVzdHJveWVkID0gZGVzdHJveWVkCisgICAgICAgIHMgPSAiIiJjbGFzcyBBOgorICAgIGRlZiBfX2RlbF9fKHNlbGYsIGRlc3Ryb3llZD1kZXN0cm95ZWQpOgorICAgICAgICBkZXN0cm95ZWQuYXBwZW5kKDEpCithID0gQSgpIiIiCisgICAgICAgIGV4ZWMocywgbS5fX2RpY3RfXykKKyAgICAgICAgZGVsIG0KKyAgICAgICAgZ2NfY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVzdHJveWVkLCBbMV0pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoTW9kdWxlVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjhlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YjhlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzFkMWUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CkBAIC0wLDAgKzEsMjg2IEBACitpbXBvcnQgX19mdXR1cmVfXworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBkaXN0dXRpbHMuZGlyX3V0aWwKK2ltcG9ydCB0ZW1wZmlsZQorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0cnk6IHNldAorZXhjZXB0IE5hbWVFcnJvcjogZnJvbSBzZXRzIGltcG9ydCBTZXQgYXMgc2V0CisKK2ltcG9ydCBtb2R1bGVmaW5kZXIKKworIyBOb3RlOiBUbyB0ZXN0IG1vZHVsZWZpbmRlciB3aXRoIFB5dGhvbiAyLjIsIHNldHMucHkgYW5kCisjIG1vZHVsZWZpbmRlci5weSBtdXN0IGJlIGF2YWlsYWJsZSAtIHRoZXkgYXJlIG5vdCBpbiB0aGUgc3RhbmRhcmQKKyMgbGlicmFyeS4KKworVEVTVF9ESVIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKK1RFU1RfUEFUSCA9IFtURVNUX0RJUiwgb3MucGF0aC5kaXJuYW1lKF9fZnV0dXJlX18uX19maWxlX18pXQorCisjIEVhY2ggdGVzdCBkZXNjcmlwdGlvbiBpcyBhIGxpc3Qgb2YgNSBpdGVtczoKKyMKKyMgMS4gYSBtb2R1bGUgbmFtZSB0aGF0IHdpbGwgYmUgaW1wb3J0ZWQgYnkgbW9kdWxlZmluZGVyCisjIDIuIGEgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdGhhdCBtb2R1bGVmaW5kZXIgaXMgcmVxdWlyZWQgdG8gZmluZAorIyAzLiBhIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRoYXQgbW9kdWxlZmluZGVyIHNob3VsZCBjb21wbGFpbgorIyAgICBhYm91dCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBmb3VuZAorIyA0LiBhIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRoYXQgbW9kdWxlZmluZGVyIHNob3VsZCBjb21wbGFpbgorIyAgICBhYm91dCBiZWNhdXNlIHRoZXkgTUFZIGJlIG5vdCBmb3VuZAorIyA1LiBhIHN0cmluZyBzcGVjaWZ5aW5nIHBhY2thZ2VzIHRvIGNyZWF0ZTsgdGhlIGZvcm1hdCBpcyBvYnZpb3VzIGltby4KKyMKKyMgRWFjaCBwYWNrYWdlIHdpbGwgYmUgY3JlYXRlZCBpbiBURVNUX0RJUiwgYW5kIFRFU1RfRElSIHdpbGwgYmUKKyMgcmVtb3ZlZCBhZnRlciB0aGUgdGVzdHMgYWdhaW4uCisjIE1vZHVsZWZpbmRlciBzZWFyY2hlcyBpbiBhIHBhdGggdGhhdCBjb250YWlucyBURVNUX0RJUiwgcGx1cworIyB0aGUgc3RhbmRhcmQgTGliIGRpcmVjdG9yeS4KKworbWF5YmVfdGVzdCA9IFsKKyAgICAiYS5tb2R1bGUiLAorICAgIFsiYSIsICJhLm1vZHVsZSIsICJzeXMiLAorICAgICAiYiJdLAorICAgIFsiYyJdLCBbImIuc29tZXRoaW5nIl0sCisgICAgIiIiXAorYS9fX2luaXRfXy5weQorYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiIGltcG9ydCBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBjIGltcG9ydCBzb21ldGhpbmcKK2IvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBzeXMgaW1wb3J0ICoKKyIiIl0KKworbWF5YmVfdGVzdF9uZXcgPSBbCisgICAgImEubW9kdWxlIiwKKyAgICBbImEiLCAiYS5tb2R1bGUiLCAic3lzIiwKKyAgICAgImIiLCAiX19mdXR1cmVfXyJdLAorICAgIFsiYyJdLCBbImIuc29tZXRoaW5nIl0sCisgICAgIiIiXAorYS9fX2luaXRfXy5weQorYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiIGltcG9ydCBzb21ldGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBjIGltcG9ydCBzb21ldGhpbmcKK2IvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBzeXMgaW1wb3J0ICoKKyIiIl0KKworcGFja2FnZV90ZXN0ID0gWworICAgICJhLm1vZHVsZSIsCisgICAgWyJhIiwgImEuYiIsICJhLmMiLCAiYS5tb2R1bGUiLCAibXltb2R1bGUiLCAic3lzIl0sCisgICAgWyJibGFoYmxhaCJdLCBbXSwKKyAgICAiIiJcCitteW1vZHVsZS5weQorYS9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgYmxhaGJsYWgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIGltcG9ydCBiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBjCithL21vZHVsZS5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYSBpbXBvcnQgYiBhcyB4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYS5jIGltcG9ydCBzaWxseW5hbWUKK2EvYi5weQorYS9jLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYS5tb2R1bGUgaW1wb3J0IHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG15bW9kdWxlIGFzIHNpbGx5bmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN5cyBpbXBvcnQgdmVyc2lvbl9pbmZvCisiIiJdCisKK2Fic29sdXRlX2ltcG9ydF90ZXN0ID0gWworICAgICJhLm1vZHVsZSIsCisgICAgWyJhIiwgImEubW9kdWxlIiwKKyAgICAgImIiLCAiYi54IiwgImIueSIsICJiLnoiLAorICAgICAiX19mdXR1cmVfXyIsICJzeXMiLCAiZXhjZXB0aW9ucyJdLAorICAgIFsiYmxhaGJsYWgiXSwgW10sCisgICAgIiIiXAorbXltb2R1bGUucHkKK2EvX19pbml0X18ucHkKK2EvbW9kdWxlLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMgIyBzeXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGJsYWhibGFoICMgZmFpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGV4Y2VwdGlvbnMgIyBleGNlcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBiLnggIyBiLngKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiIGltcG9ydCB5ICMgYi55CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYi56IGltcG9ydCAqICMgYi56LioKK2EvZXhjZXB0aW9ucy5weQorYS9zeXMucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG15bW9kdWxlCithL2IvX19pbml0X18ucHkKK2EvYi94LnB5CithL2IveS5weQorYS9iL3oucHkKK2IvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHoKK2IvdW51c2VkLnB5CitiL3gucHkKK2IveS5weQorYi96LnB5CisiIiJdCisKK3JlbGF0aXZlX2ltcG9ydF90ZXN0ID0gWworICAgICJhLm1vZHVsZSIsCisgICAgWyJfX2Z1dHVyZV9fIiwKKyAgICAgImEiLCAiYS5tb2R1bGUiLAorICAgICAiYS5iIiwgImEuYi55IiwgImEuYi56IiwKKyAgICAgImEuYi5jIiwgImEuYi5jLm1vZHVsZUMiLAorICAgICAiYS5iLmMuZCIsICJhLmIuYy5lIiwKKyAgICAgImEuYi54IiwKKyAgICAgImV4Y2VwdGlvbnMiXSwKKyAgICBbXSwgW10sCisgICAgIiIiXAorbXltb2R1bGUucHkKK2EvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuYiBpbXBvcnQgeSwgeiAjIGEuYi55LCBhLmIuegorYS9tb2R1bGUucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQgIyBfX2Z1dHVyZV9fCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBleGNlcHRpb25zICMgZXhjZXB0aW9ucworYS9leGNlcHRpb25zLnB5CithL3N5cy5weQorYS9iL19faW5pdF9fLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLi5iIGltcG9ydCB4ICMgYS5iLngKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2Zyb20gYS5iLmMgaW1wb3J0IG1vZHVsZUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuYyBpbXBvcnQgbW9kdWxlQyAjIGEuYi5tb2R1bGVDCithL2IveC5weQorYS9iL3kucHkKK2EvYi96LnB5CithL2IvZy5weQorYS9iL2MvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuLmMgaW1wb3J0IGUgIyBhLmIuYy5lCithL2IvYy9tb2R1bGVDLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLi5jIGltcG9ydCBkICMgYS5iLmMuZAorYS9iL2MvZC5weQorYS9iL2MvZS5weQorYS9iL2MveC5weQorIiIiXQorCityZWxhdGl2ZV9pbXBvcnRfdGVzdF8yID0gWworICAgICJhLm1vZHVsZSIsCisgICAgWyJhIiwgImEubW9kdWxlIiwKKyAgICAgImEuc3lzIiwKKyAgICAgImEuYiIsICJhLmIueSIsICJhLmIueiIsCisgICAgICJhLmIuYyIsICJhLmIuYy5kIiwKKyAgICAgImEuYi5jLmUiLAorICAgICAiYS5iLmMubW9kdWxlQyIsCisgICAgICJhLmIuYy5mIiwKKyAgICAgImEuYi54IiwKKyAgICAgImEuYW5vdGhlciJdLAorICAgIFtdLCBbXSwKKyAgICAiIiJcCitteW1vZHVsZS5weQorYS9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC4gaW1wb3J0IHN5cyAjIGEuc3lzCithL2Fub3RoZXIucHkKK2EvbW9kdWxlLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLmIgaW1wb3J0IHksIHogIyBhLmIueSwgYS5iLnoKK2EvZXhjZXB0aW9ucy5weQorYS9zeXMucHkKK2EvYi9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC5jIGltcG9ydCBtb2R1bGVDICMgYS5iLmMubW9kdWxlQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC5jIGltcG9ydCBkICMgYS5iLmMuZAorYS9iL3gucHkKK2EvYi95LnB5CithL2Ivei5weQorYS9iL2MvX19pbml0X18ucHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAuIGltcG9ydCBlICMgYS5iLmMuZQorYS9iL2MvbW9kdWxlQy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZiAgICMgYS5iLmMuZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIC4uIGltcG9ydCB4ICAjIGEuYi54CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLi4uIGltcG9ydCBhbm90aGVyICMgYS5hbm90aGVyCithL2IvYy9kLnB5CithL2IvYy9lLnB5CithL2IvYy9mLnB5CisiIiJdCisKK3JlbGF0aXZlX2ltcG9ydF90ZXN0XzMgPSBbCisgICAgImEubW9kdWxlIiwKKyAgICBbImEiLCAiYS5tb2R1bGUiXSwKKyAgICBbImEuYmFyIl0sCisgICAgW10sCisgICAgIiIiXAorYS9fX2luaXRfXy5weQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYgZm9vKCk6IHBhc3MKK2EvbW9kdWxlLnB5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgZm9vCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gLiBpbXBvcnQgYmFyCisiIiJdCisKK2RlZiBvcGVuX2ZpbGUocGF0aCk6CisgICAgIyNwcmludCAiIyIsIG9zLnBhdGguYWJzcGF0aChwYXRoKQorICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKKyAgICBkaXN0dXRpbHMuZGlyX3V0aWwubWtwYXRoKGRpcm5hbWUpCisgICAgcmV0dXJuIG9wZW4ocGF0aCwgInciKQorCitkZWYgY3JlYXRlX3BhY2thZ2Uoc291cmNlKToKKyAgICBvZmkgPSBOb25lCisgICAgdHJ5OgorICAgICAgICBmb3IgbGluZSBpbiBzb3VyY2Uuc3BsaXRsaW5lcygpOgorICAgICAgICAgICAgaWYgbGluZS5zdGFydHN3aXRoKCIgIikgb3IgbGluZS5zdGFydHN3aXRoKCJcdCIpOgorICAgICAgICAgICAgICAgIG9maS53cml0ZShsaW5lLnN0cmlwKCkgKyAiXG4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBvZmk6CisgICAgICAgICAgICAgICAgICAgIG9maS5jbG9zZSgpCisgICAgICAgICAgICAgICAgb2ZpID0gb3Blbl9maWxlKG9zLnBhdGguam9pbihURVNUX0RJUiwgbGluZS5zdHJpcCgpKSkKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvZmk6CisgICAgICAgICAgICBvZmkuY2xvc2UoKQorCitjbGFzcyBNb2R1bGVGaW5kZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2RvX3Rlc3Qoc2VsZiwgaW5mbywgcmVwb3J0PUZhbHNlKToKKyAgICAgICAgaW1wb3J0X3RoaXMsIG1vZHVsZXMsIG1pc3NpbmcsIG1heWJlX21pc3NpbmcsIHNvdXJjZSA9IGluZm8KKyAgICAgICAgY3JlYXRlX3BhY2thZ2Uoc291cmNlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtZiA9IG1vZHVsZWZpbmRlci5Nb2R1bGVGaW5kZXIocGF0aD1URVNUX1BBVEgpCisgICAgICAgICAgICBtZi5pbXBvcnRfaG9vayhpbXBvcnRfdGhpcykKKyAgICAgICAgICAgIGlmIHJlcG9ydDoKKyAgICAgICAgICAgICAgICBtZi5yZXBvcnQoKQorIyMgICAgICAgICAgICAgICAgIyBUaGlzIHdvdWxkbid0IHdvcmsgaW4gZ2VuZXJhbCB3aGVuIGV4ZWN1dGVkIHNldmVyYWwgdGltZXM6CisjIyAgICAgICAgICAgICAgICBvcGF0aCA9IHN5cy5wYXRoWzpdCisjIyAgICAgICAgICAgICAgICBzeXMucGF0aCA9IFRFU1RfUEFUSAorIyMgICAgICAgICAgICAgICAgdHJ5OgorIyMgICAgICAgICAgICAgICAgICAgIF9faW1wb3J0X18oaW1wb3J0X3RoaXMpCisjIyAgICAgICAgICAgICAgICBleGNlcHQ6CisjIyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHRyYWNlYmFjazsgdHJhY2ViYWNrLnByaW50X2V4YygpCisjIyAgICAgICAgICAgICAgICBzeXMucGF0aCA9IG9wYXRoCisjIyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG1vZHVsZXMgPSBzZXQobW9kdWxlcykKKyAgICAgICAgICAgIGZvdW5kID0gc2V0KG1mLm1vZHVsZXMua2V5cygpKQorICAgICAgICAgICAgbW9yZSA9IGxpc3QoZm91bmQgLSBtb2R1bGVzKQorICAgICAgICAgICAgbGVzcyA9IGxpc3QobW9kdWxlcyAtIGZvdW5kKQorICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBmb3VuZCB3aGF0IHdlIGV4cGVjdGVkLCBub3QgbW9yZSwgbm90IGxlc3MKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG1vcmUsIGxlc3MpLCAoW10sIFtdKSkKKworICAgICAgICAgICAgIyBjaGVjayBmb3IgbWlzc2luZyBhbmQgbWF5YmUgbWlzc2luZyBtb2R1bGVzCisgICAgICAgICAgICBiYWQsIG1heWJlID0gbWYuYW55X21pc3NpbmdfbWF5YmUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWQsIG1pc3NpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heWJlLCBtYXliZV9taXNzaW5nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGlzdHV0aWxzLmRpcl91dGlsLnJlbW92ZV90cmVlKFRFU1RfRElSKQorCisgICAgZGVmIHRlc3RfcGFja2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5fZG9fdGVzdChwYWNrYWdlX3Rlc3QpCisKKyAgICBkZWYgdGVzdF9tYXliZShzZWxmKToKKyAgICAgICAgc2VsZi5fZG9fdGVzdChtYXliZV90ZXN0KQorCisgICAgaWYgZ2V0YXR0cihfX2Z1dHVyZV9fLCAiYWJzb2x1dGVfaW1wb3J0IiwgTm9uZSk6CisKKyAgICAgICAgZGVmIHRlc3RfbWF5YmVfbmV3KHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fZG9fdGVzdChtYXliZV90ZXN0X25ldykKKworICAgICAgICBkZWYgdGVzdF9hYnNvbHV0ZV9pbXBvcnRzKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fZG9fdGVzdChhYnNvbHV0ZV9pbXBvcnRfdGVzdCkKKworICAgICAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRzKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fZG9fdGVzdChyZWxhdGl2ZV9pbXBvcnRfdGVzdCkKKworICAgICAgICBkZWYgdGVzdF9yZWxhdGl2ZV9pbXBvcnRzXzIoc2VsZik6CisgICAgICAgICAgICBzZWxmLl9kb190ZXN0KHJlbGF0aXZlX2ltcG9ydF90ZXN0XzIpCisKKyAgICAgICAgZGVmIHRlc3RfcmVsYXRpdmVfaW1wb3J0c18zKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fZG9fdGVzdChyZWxhdGl2ZV9pbXBvcnRfdGVzdF8zKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgZGlzdHV0aWxzLmxvZy5zZXRfdGhyZXNob2xkKGRpc3R1dGlscy5sb2cuV0FSTikKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE1vZHVsZUZpbmRlclRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIwZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tb2R1bGVmaW5kZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTIwZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tc2lsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tc2lsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1YjBjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weQpAQCAtMCwwICsxLDQ2IEBACisiIiIgVGVzdCBzdWl0ZSBmb3IgdGhlIGNvZGUgaW4gbXNpbGliICIiIgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2Zyb20gdGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKK21zaWxpYiA9IGltcG9ydF9tb2R1bGUoJ21zaWxpYicpCisKK2NsYXNzIFRlc3RfbWFrZV9pZCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgI2h0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9hYTM2OTIxMih2PXZzLjg1KS5hc3B4CisgICAgIiIiVGhlIElkZW50aWZpZXIgZGF0YSB0eXBlIGlzIGEgdGV4dCBzdHJpbmcuIElkZW50aWZpZXJzIG1heSBjb250YWluIHRoZQorICAgIEFTQ0lJIGNoYXJhY3RlcnMgQS1aIChhLXopLCBkaWdpdHMsIHVuZGVyc2NvcmVzIChfKSwgb3IgcGVyaW9kcyAoLikuCisgICAgSG93ZXZlciwgZXZlcnkgaWRlbnRpZmllciBtdXN0IGJlZ2luIHdpdGggZWl0aGVyIGEgbGV0dGVyIG9yIGFuCisgICAgdW5kZXJzY29yZS4KKyAgICAiIiIKKworICAgIGRlZiB0ZXN0X2lzX25vX2NoYW5nZV9yZXF1aXJlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zaWxpYi5tYWtlX2lkKCJzaG9ydCIpLCAic2hvcnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoIm5vY2hhbmdlcmVxdWlyZWQiKSwgIm5vY2hhbmdlcmVxdWlyZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoIm9uZS5kb3QiKSwgIm9uZS5kb3QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoIl8iKSwgIl8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoImEiKSwgImEiKQorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgIyAgICBtc2lsaWIubWFrZV9pZCgiIiksICIiKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9maXJzdF9jaGFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNpbGliLm1ha2VfaWQoIjkuc2hvcnQiKSwgIl85LnNob3J0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zaWxpYi5tYWtlX2lkKCIuc2hvcnQiKSwgIl8uc2hvcnQiKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hbnlfY2hhcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zaWxpYi5tYWtlX2lkKCIuc1x4ODJvcnQiKSwgIl8uc19vcnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsICAgICgKKyAgICAgICAgICAgIG1zaWxpYi5tYWtlX2lkKCIuc1x4ODJvPyorcnQiKSwgIl8uc19vX19fcnQiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tc2lsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjA0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tc2lsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X21zaWxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tc2lsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjA0NDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tc2lsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4NmNhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CkBAIC0wLDAgKzEsMjc0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQorIyAgIFVuaXQgdGVzdCBmb3IgbXVsdGlieXRlY29kZWMgaXRzZWxmCisjCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4KK2ltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIGNvZGVjcywgc3lzLCBvcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYworCitBTExfQ0pLRU5DT0RJTkdTID0gWworIyBfY29kZWNzX2NuCisgICAgJ2diMjMxMicsICdnYmsnLCAnZ2IxODAzMCcsICdoeicsCisjIF9jb2RlY3NfaGsKKyAgICAnYmlnNWhrc2NzJywKKyMgX2NvZGVjc19qcAorICAgICdjcDkzMicsICdzaGlmdF9qaXMnLCAnZXVjX2pwJywgJ2V1Y19qaXN4MDIxMycsICdzaGlmdF9qaXN4MDIxMycsCisgICAgJ2V1Y19qaXNfMjAwNCcsICdzaGlmdF9qaXNfMjAwNCcsCisjIF9jb2RlY3Nfa3IKKyAgICAnY3A5NDknLCAnZXVjX2tyJywgJ2pvaGFiJywKKyMgX2NvZGVjc190dworICAgICdiaWc1JywgJ2NwOTUwJywKKyMgX2NvZGVjc19pc28yMDIyCisgICAgJ2lzbzIwMjJfanAnLCAnaXNvMjAyMl9qcF8xJywgJ2lzbzIwMjJfanBfMicsICdpc28yMDIyX2pwXzIwMDQnLAorICAgICdpc28yMDIyX2pwXzMnLCAnaXNvMjAyMl9qcF9leHQnLCAnaXNvMjAyMl9rcicsCitdCisKK2NsYXNzIFRlc3RfTXVsdGlieXRlQ29kZWModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbnVsbGNvZGluZyhzZWxmKToKKyAgICAgICAgZm9yIGVuYyBpbiBBTExfQ0pLRU5DT0RJTkdTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJy5kZWNvZGUoZW5jKSwgdScnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCcnLCBlbmMpLCB1JycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJy5lbmNvZGUoZW5jKSwgJycpCisKKyAgICBkZWYgdGVzdF9zdHJfZGVjb2RlKHNlbGYpOgorICAgICAgICBmb3IgZW5jIGluIEFMTF9DSktFTkNPRElOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmNkJy5lbmNvZGUoZW5jKSwgJ2FiY2QnKQorCisgICAgZGVmIHRlc3RfZXJyb3JjYWxsYmFja19sb25naW5kZXgoc2VsZik6CisgICAgICAgIGRlYyA9IGNvZGVjcy5nZXRkZWNvZGVyKCdldWMta3InKQorICAgICAgICBteXJlcGxhY2UgID0gbGFtYmRhIGV4YzogKHUnJywgc3lzLm1heGludCsxKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoJ3Rlc3QuY2prdGVzdCcsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGVceDkyaGFtXHg5M3NwYW0nLCAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2NvZGluZ3NwZWMoc2VsZik6CisgICAgICAgIGZvciBlbmMgaW4gQUxMX0NKS0VOQ09ESU5HUzoKKyAgICAgICAgICAgIGNvZGUgPSAnIyBjb2Rpbmc6IHt9XG4nLmZvcm1hdChlbmMpCisgICAgICAgICAgICBleGVjIGNvZGUKKworICAgIGRlZiB0ZXN0X2luaXRfc2VnZmF1bHQoc2VsZik6CisgICAgICAgICMgYnVnICMzMzA1OiB0aGlzIHVzZWQgdG8gc2VnZmF1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9tdWx0aWJ5dGVjb2RlYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfbXVsdGlieXRlY29kZWMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBOb25lKQorCisKK2NsYXNzIFRlc3RfSW5jcmVtZW50YWxFbmNvZGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3N0YXRlbGVzcyhzZWxmKToKKyAgICAgICAgIyBjcDk0OSBlbmNvZGVyIGlzbid0IHN0YXRlZnVsIGF0IGFsbC4KKyAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoJ2NwOTQ5JykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHVkMzBjXHVjNzc0XHVjMzZjIFx1YjljOFx1Yzc0NCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdceGM2XHhjNFx4YzBceGNjXHhiZFx4ZTMgXHhiOFx4YjZceGMwXHhiYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5yZXNldCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUyNjA2XHUyMjNjXHUyNjA2JywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4YTFceGQ5XHhhMVx4YWRceGExXHhkOScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5yZXNldCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnJywgVHJ1ZSksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnJywgRmFsc2UpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLnJlc2V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9zdGF0ZWZ1bChzZWxmKToKKyAgICAgICAgIyBqaXN4MDIxMyBlbmNvZGVyIGlzIHN0YXRlZnVsIGZvciBhIGZldyBjb2RlcG9pbnRzLiBlZykKKyAgICAgICAgIyAgIFUrMDBFNiA9PiBBOURDCisgICAgICAgICMgICBVKzAwRTYgVSswMzAwID0+IEFCQzQKKyAgICAgICAgIyAgIFUrMDMwMCA9PiBBQkRDCisKKyAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoJ2ppc3gwMjEzJykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2XHUwMzAwJyksICdceGFiXHhjNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTYnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDAnKSwgJ1x4YWJceGM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicsIFRydWUpLCAnXHhhOVx4ZGMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5yZXNldCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMzAwJyksICdceGFiXHhkYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNicpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSgnJywgVHJ1ZSksICdceGE5XHhkYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUoJycsIFRydWUpLCAnJykKKworICAgIGRlZiB0ZXN0X3N0YXRlZnVsX2tlZXBfYnVmZmVyKHNlbGYpOgorICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2RlcignamlzeDAyMTMnKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTYnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgZW5jb2Rlci5lbmNvZGUsIHUnXHUwMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDMwMFx1MDBlNicpLCAnXHhhYlx4YzQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIGVuY29kZXIuZW5jb2RlLCB1J1x1MDEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5yZXNldCgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMzAwJyksICdceGFiXHhkYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTYnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgZW5jb2Rlci5lbmNvZGUsIHUnXHUwMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1JycsIFRydWUpLCAnXHhhOVx4ZGMnKQorCisgICAgZGVmIHRlc3RfaXNzdWU1NjQwKHNlbGYpOgorICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZW5jb2Rlcignc2hpZnQtamlzJykoJ2JhY2tzbGFzaHJlcGxhY2UnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHhmZicpLCBiJ1xceGZmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1xuJyksIGInXG4nKQorCitjbGFzcyBUZXN0X0luY3JlbWVudGFsRGVjb2Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kYmNzKHNlbGYpOgorICAgICAgICAjIGNwOTQ5IGRlY29kZXIgaXMgc2ltcGxlIHdpdGggb25seSAxIG9yIDIgYnl0ZXMgc2VxdWVuY2VzLgorICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcignY3A5NDknKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4YzZceGM0XHhjMFx4Y2NceGJkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcdWQzMGNcdWM3NzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGUzIFx4YjhceGI2XHhjMFx4YmInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1x1YzM2YyBcdWI5YzhcdWM3NDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCcnKSwgdScnKQorCisgICAgZGVmIHRlc3RfZGJjc19rZWVwX2J1ZmZlcihzZWxmKToKKyAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoJ2NwOTQ5JykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGM2XHhjNFx4YzAnKSwgdSdcdWQzMGMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZXIuZGVjb2RlLCAnJywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjYycpLCB1J1x1Yzc3NCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjNlx4YzRceGMwJyksIHUnXHVkMzBjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGVyLmRlY29kZSwgJ1x4Y2NceGJkJywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjYycpLCB1J1x1Yzc3NCcpCisKKyAgICBkZWYgdGVzdF9pc28yMDIyKHNlbGYpOgorICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcignaXNvMjAyMi1qcCcpKCkKKyAgICAgICAgRVNDID0gJ1x4MWInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoRVNDICsgJygnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdCJywgVHJ1ZSksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZShFU0MgKyAnJCcpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0JAJCcpLCB1J1x1NGUxNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0AkQCcpLCB1J1x1NGUxNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJyQnLCBUcnVlKSwgdSdcdTRlMTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIucmVzZXQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQCQnKSwgdSdAJCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoRVNDICsgJyQnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZXIuZGVjb2RlLCAnJywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQkAkJyksIHUnXHU0ZTE2JykKKworY2xhc3MgVGVzdF9TdHJlYW1SZWFkZXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2J1ZzE3Mjg0MDMoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wZW4oVEVTVEZOLCAndycpLndyaXRlKCdceGExJykKKyAgICAgICAgICAgIGYgPSBjb2RlY3Mub3BlbihURVNURk4sIGVuY29kaW5nPSdjcDk0OScpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGYucmVhZCwgMikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeTogZi5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgICAgIG9zLnVubGluayhURVNURk4pCisKK2NsYXNzIFRlc3RfU3RyZWFtV3JpdGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpZiBsZW4odSdcVTAwMDEyMzQ1JykgPT0gMjogIyBVQ1MyCisgICAgICAgIGRlZiB0ZXN0X2diMTgwMzAoc2VsZik6CisgICAgICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgYyA9IGNvZGVjcy5nZXR3cml0ZXIoJ2diMTgwMzAnKShzKQorICAgICAgICAgICAgYy53cml0ZSh1JzEyMycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyMycpCisgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4OTA3XHg5NTknKQorICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceDkwN1x4OTU5JykKKyAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1sxXSArIHUnXFUwMDAxMjM0NScgKyB1J1x1YWMwMFx1MDBhYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgJzEyM1x4OTA3XHg5NTlceDkwN1x4OTU5XHg5MDdceDk1OVx4ODI3XHhjZjVceDgxMFx4ODUxJykKKyAgICAgICAgICAgIGMud3JpdGUodSdcVTAwMDEyMzQ1J1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAnMTIzXHg5MDdceDk1OVx4OTA3XHg5NTlceDkwN1x4OTU5XHg4MjdceGNmNVx4ODEwXHg4NTEnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBjLnJlc2V0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICcxMjNceDkwN1x4OTU5XHg5MDdceDk1OVx4OTA3XHg5NTlceDgyN1x4Y2Y1XHg4MTBceDg1MScpCisKKyAgICAgICAgZGVmIHRlc3RfdXRmXzgoc2VsZik6CisgICAgICAgICAgICBzPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBjID0gY29kZWNzLmdldHdyaXRlcigndXRmLTgnKShzKQorICAgICAgICAgICAgYy53cml0ZSh1JzEyMycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyMycpCisgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4ZjBceDkyXHg4ZFx4ODUnKQorCisgICAgICAgICAgICAjIFB5dGhvbiB1dGYtOCBjb2RlYyBjYW4ndCBidWZmZXIgc3Vycm9nYXRlIHBhaXJzIHlldC4KKyAgICAgICAgICAgIGlmIDA6CisgICAgICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHhmMFx4OTJceDhkXHg4NScpCisgICAgICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzFdICsgdSdcVTAwMDEyMzQ1JyArIHUnXHVhYzAwXHUwMGFjJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgJzEyM1x4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NScKKyAgICAgICAgICAgICAgICAgICAgJ1x4ZWFceGIwXHg4MFx4YzJceGFjJykKKyAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NSdbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICcxMjNceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODUnCisgICAgICAgICAgICAgICAgICAgICdceGVhXHhiMFx4ODBceGMyXHhhYycpCisgICAgICAgICAgICAgICAgYy5yZXNldCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICcxMjNceGYwXHg5Mlx4OGRceDg1XHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODUnCisgICAgICAgICAgICAgICAgICAgICdceGVhXHhiMFx4ODBceGMyXHhhY1x4ZWRceGEwXHg4OCcpCisgICAgICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzFdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAnMTIzXHhmMFx4OTJceDhkXHg4NVx4ZjBceDkyXHg4ZFx4ODVceGYwXHg5Mlx4OGRceDg1JworICAgICAgICAgICAgICAgICAgICAnXHhlYVx4YjBceDgwXHhjMlx4YWNceGVkXHhhMFx4ODhceGVkXHhiZFx4ODUnKQorCisgICAgZWxzZTogIyBVQ1M0CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3N0cmVhbXdyaXRlcl9zdHJ3cml0ZShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgd3IgPSBjb2RlY3MuZ2V0d3JpdGVyKCdnYjE4MDMwJykocykKKyAgICAgICAgd3Iud3JpdGUoJ2FiY2QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJ2FiY2QnKQorCitjbGFzcyBUZXN0X0lTTzIwMjIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2cyKHNlbGYpOgorICAgICAgICBpc28yMDIyanAyID0gJ1x4MWIoQjpodTQ6dW5pdFx4MWIuQVx4MWJOaSBkZSBmYW1pbGxlJworICAgICAgICB1bmkgPSB1JzpodTQ6dW5pdFx4ZTkgZGUgZmFtaWxsZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc28yMDIyanAyLmRlY29kZSgnaXNvMjAyMi1qcC0yJyksIHVuaSkKKworICAgIGRlZiB0ZXN0X2lzbzIwMjJfanBfZzAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ1x4MGUnLCB1J1xOe1NPRlQgSFlQSEVOfScuZW5jb2RlKCdpc28tMjAyMi1qcC0yJykpCisgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ2lzby0yMDIyLWpwLTIwMDQnLCAnaXNvLTIwMjItanAtMycpOgorICAgICAgICAgICAgZSA9IHUnXHUzNDA2Jy5lbmNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpbHRlcihsYW1iZGEgeDogeCA+PSAnXHg4MCcsIGUpKQorCisgICAgZGVmIHRlc3RfYnVnMTU3MjgzMihzZWxmKToKKyAgICAgICAgaWYgc3lzLm1heHVuaWNvZGUgPj0gMHgxMDAwMDoKKyAgICAgICAgICAgIG15dW5pY2hyID0gdW5pY2hyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBteXVuaWNociA9IGxhbWJkYSB4OiB1bmljaHIoMHhEN0MwKyh4Pj4xMCkpICsgdW5pY2hyKDB4REMwMCsoeCYweDNGRikpCisKKyAgICAgICAgZm9yIHggaW4geHJhbmdlKDB4MTAwMDAsIDB4MTEwMDAwKToKKyAgICAgICAgICAgICMgQW55IElTTyAyMDIyIGNvZGVjIHdpbGwgY2F1c2UgdGhlIHNlZ2ZhdWx0CisgICAgICAgICAgICBteXVuaWNocih4KS5lbmNvZGUoJ2lzb18yMDIyX2pwJywgJ2lnbm9yZScpCisKK2NsYXNzIFRlc3RTdGF0ZWZ1bCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgdGV4dCA9IHUnXHU0RTE2XHU0RTE2JworICAgIGVuY29kaW5nID0gJ2lzby0yMDIyLWpwJworICAgIGV4cGVjdGVkID0gYidceDFiJEJAJEAkJworICAgIGV4cGVjdGVkX3Jlc2V0ID0gYidceDFiJEJAJEAkXHgxYihCJworCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dC5lbmNvZGUoc2VsZi5lbmNvZGluZyksIHNlbGYuZXhwZWN0ZWRfcmVzZXQpCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGVuY29kZXIoc2VsZik6CisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKHNlbGYuZW5jb2RpbmcpKCkKKyAgICAgICAgb3V0cHV0ID0gYicnLmpvaW4oCisgICAgICAgICAgICBlbmNvZGVyLmVuY29kZShjaGFyKQorICAgICAgICAgICAgZm9yIGNoYXIgaW4gc2VsZi50ZXh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHB1dCwgc2VsZi5leHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsZW5jb2Rlcl9maW5hbChzZWxmKToKKyAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoc2VsZi5lbmNvZGluZykoKQorICAgICAgICBsYXN0X2luZGV4ID0gbGVuKHNlbGYudGV4dCkgLSAxCisgICAgICAgIG91dHB1dCA9IGInJy5qb2luKAorICAgICAgICAgICAgZW5jb2Rlci5lbmNvZGUoY2hhciwgaW5kZXggPT0gbGFzdF9pbmRleCkKKyAgICAgICAgICAgIGZvciBpbmRleCwgY2hhciBpbiBlbnVtZXJhdGUoc2VsZi50ZXh0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRwdXQsIHNlbGYuZXhwZWN0ZWRfcmVzZXQpCisKK2NsYXNzIFRlc3RIWlN0YXRlZnVsKFRlc3RTdGF0ZWZ1bCk6CisgICAgdGV4dCA9IHUnXHU4MDRhXHU4MDRhJworICAgIGVuY29kaW5nID0gJ2h6JworICAgIGV4cGVjdGVkID0gYid+e0FEQUQnCisgICAgZXhwZWN0ZWRfcmVzZXQgPSBiJ357QURBRH59JworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChfX25hbWVfXykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2RkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3Y2RkZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhMmU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKQEAgLTAsMCArMSwzNzQgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIworIyB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKKyMgICBDb21tb24gVW5pdHRlc3QgUm91dGluZXMgZm9yIENKSyBjb2RlY3MKKyMKKworaW1wb3J0IGNvZGVjcworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBodHRwbGliIGltcG9ydCBIVFRQRXhjZXB0aW9uCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworY2xhc3MgVGVzdEJhc2U6CisgICAgZW5jb2RpbmcgICAgICAgID0gJycgICAjIGNvZGVjIG5hbWUKKyAgICBjb2RlYyAgICAgICAgICAgPSBOb25lICMgY29kZWMgdHVwbGUgKHdpdGggNCBlbGVtZW50cykKKyAgICB0c3RyaW5nICAgICAgICAgPSAnJyAgICMgc3RyaW5nIHRvIHRlc3QgU3RyZWFtUmVhZGVyCisKKyAgICBjb2RlY3Rlc3RzICAgICAgPSBOb25lICMgbXVzdCBzZXQuIGNvZGVjIHRlc3QgdHVwbGUKKyAgICByb3VuZHRyaXB0ZXN0ICAgPSAxICAgICMgc2V0IGlmIHJvdW5kdHJpcCBpcyBwb3NzaWJsZSB3aXRoIHVuaWNvZGUKKyAgICBoYXNfaXNvMTA2NDYgICAgPSAwICAgICMgc2V0IGlmIHRoaXMgZW5jb2RpbmcgY29udGFpbnMgd2hvbGUgaXNvMTA2NDYgbWFwCisgICAgeG1sY2hhcm5hbWV0ZXN0ID0gTm9uZSAjIHN0cmluZyB0byB0ZXN0IHhtbGNoYXJyZWZyZXBsYWNlCisgICAgdW5tYXBwZWR1bmljb2RlID0gdSdcdWRlZWUnICMgYSB1bmljb2RlIGNvZGVwb2ludCB0aGF0IGlzIG5vdCBtYXBwZWQuCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY29kZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY29kZWMgPSBjb2RlY3MubG9va3VwKHNlbGYuZW5jb2RpbmcpCisgICAgICAgIHNlbGYuZW5jb2RlID0gc2VsZi5jb2RlYy5lbmNvZGUKKyAgICAgICAgc2VsZi5kZWNvZGUgPSBzZWxmLmNvZGVjLmRlY29kZQorICAgICAgICBzZWxmLnJlYWRlciA9IHNlbGYuY29kZWMuc3RyZWFtcmVhZGVyCisgICAgICAgIHNlbGYud3JpdGVyID0gc2VsZi5jb2RlYy5zdHJlYW13cml0ZXIKKyAgICAgICAgc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIgPSBzZWxmLmNvZGVjLmluY3JlbWVudGFsZW5jb2RlcgorICAgICAgICBzZWxmLmluY3JlbWVudGFsZGVjb2RlciA9IHNlbGYuY29kZWMuaW5jcmVtZW50YWxkZWNvZGVyCisKKyAgICBkZWYgdGVzdF9jaHVua2NvZGluZyhzZWxmKToKKyAgICAgICAgZm9yIG5hdGl2ZSwgdXRmOCBpbiB6aXAoKltTdHJpbmdJTyhmKS5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBmIGluIHNlbGYudHN0cmluZ10pOgorICAgICAgICAgICAgdSA9IHNlbGYuZGVjb2RlKG5hdGl2ZSlbMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSwgdXRmOC5kZWNvZGUoJ3V0Zi04JykpCisgICAgICAgICAgICBpZiBzZWxmLnJvdW5kdHJpcHRlc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYXRpdmUsIHNlbGYuZW5jb2RlKHUpWzBdKQorCisgICAgZGVmIHRlc3RfZXJyb3JoYW5kbGUoc2VsZik6CisgICAgICAgIGZvciBzb3VyY2UsIHNjaGVtZSwgZXhwZWN0ZWQgaW4gc2VsZi5jb2RlY3Rlc3RzOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzb3VyY2UsIGJ5dGVzKToKKyAgICAgICAgICAgICAgICBmdW5jID0gc2VsZi5kZWNvZGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZnVuYyA9IHNlbGYuZW5jb2RlCisgICAgICAgICAgICBpZiBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKHNvdXJjZSwgc2NoZW1lKVswXQorICAgICAgICAgICAgICAgIGlmIGZ1bmMgaXMgc2VsZi5kZWNvZGU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlc3VsdCkgaXMgdW5pY29kZSwgdHlwZShyZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVyLmRlY29kZSglciwgJXIpPSVyICE9ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNvdXJjZSwgc2VsZi5lbmNvZGluZywgc2NoZW1lLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlc3VsdCkgaXMgYnl0ZXMsIHR5cGUocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclci5lbmNvZGUoJXIsICVyKT0lciAhPSAlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzb3VyY2UsIHNlbGYuZW5jb2RpbmcsIHNjaGVtZSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBmdW5jLCBzb3VyY2UsIHNjaGVtZSkKKworICAgIGRlZiB0ZXN0X3htbGNoYXJyZWZyZXBsYWNlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHMgPSB1Ilx1MGIxM1x1MGIyM1x1MGI2MCBuZCBlZ2dzIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2VsZi5lbmNvZGUocywgInhtbGNoYXJyZWZyZXBsYWNlIilbMF0sCisgICAgICAgICAgICAiJiMyODM1OyYjMjg1MTsmIzI5MTI7IG5kIGVnZ3MiCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2N1c3RvbXJlcGxhY2VfZW5jb2RlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGZyb20gaHRtbGVudGl0eWRlZnMgaW1wb3J0IGNvZGVwb2ludDJuYW1lCisKKyAgICAgICAgZGVmIHhtbGNoYXJuYW1lcmVwbGFjZShleGMpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZXhjLCBVbmljb2RlRW5jb2RlRXJyb3IpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiZG9uJ3Qga25vdyBob3cgdG8gaGFuZGxlICVyIiAlIGV4YykKKyAgICAgICAgICAgIGwgPSBbXQorICAgICAgICAgICAgZm9yIGMgaW4gZXhjLm9iamVjdFtleGMuc3RhcnQ6ZXhjLmVuZF06CisgICAgICAgICAgICAgICAgaWYgb3JkKGMpIGluIGNvZGVwb2ludDJuYW1lOgorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYlczsiICUgY29kZXBvaW50Mm5hbWVbb3JkKGMpXSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYjJWQ7IiAlIG9yZChjKSkKKyAgICAgICAgICAgIHJldHVybiAodSIiLmpvaW4obCksIGV4Yy5lbmQpCisKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LnhtbGNoYXJuYW1lcmVwbGFjZSIsIHhtbGNoYXJuYW1lcmVwbGFjZSkKKworICAgICAgICBpZiBzZWxmLnhtbGNoYXJuYW1ldGVzdDoKKyAgICAgICAgICAgIHNpbiwgc291dCA9IHNlbGYueG1sY2hhcm5hbWV0ZXN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaW4gPSB1Ilx4YWJcdTIxMWNceGJiID0gXHUyMzI5XHUxMjM0XHUyMzJhIgorICAgICAgICAgICAgc291dCA9ICImbGFxdW87JnJlYWw7JnJhcXVvOyA9ICZsYW5nOyYjNDY2MDsmcmFuZzsiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUoc2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QueG1sY2hhcm5hbWVyZXBsYWNlIilbMF0sIHNvdXQpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja193cm9uZ19vYmplY3RzKHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHJldCwgZXhjLmVuZCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisKKyAgICAgICAgZm9yIHJldCBpbiAoWzEsIDIsIDNdLCBbXSwgTm9uZSwgb2JqZWN0KCksICdzdHJpbmcnLCAnJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfbG9uZ19pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J3gnLCBsb25nKGV4Yy5lbmQpKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuY29kZSh1J2FiY2QnICsgc2VsZi51bm1hcHBlZHVuaWNvZGUgKyB1J2VmZ2gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKSwgKCdhYmNkeGVmZ2gnLCA5KSkKKworICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUneCcsIHN5cy5tYXhpbnQgKyAxKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgc2VsZi5lbmNvZGUsIHNlbGYudW5tYXBwZWR1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX05vbmVfaW5kZXgoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSd4JywgTm9uZSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5lbmNvZGUsIHNlbGYudW5tYXBwZWR1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2JhY2t3YXJkX2luZGV4KHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICBpZiBteXJlcGxhY2UubGltaXQgPiAwOgorICAgICAgICAgICAgICAgIG15cmVwbGFjZS5saW1pdCAtPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuICh1J1JFUExBQ0VEJywgMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuICh1J1RFUk1JTkFMJywgZXhjLmVuZCkKKyAgICAgICAgbXlyZXBsYWNlLmxpbWl0ID0gMworICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuY29kZSh1J2FiY2QnICsgc2VsZi51bm1hcHBlZHVuaWNvZGUgKyB1J2VmZ2gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKSwKKyAgICAgICAgICAgICAgICAoJ2FiY2RSRVBMQUNFRGFiY2RSRVBMQUNFRGFiY2RSRVBMQUNFRGFiY2RURVJNSU5BTGVmZ2gnLCA5KSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2ZvcndhcmRfaW5kZXgoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSdSRVBMQUNFRCcsIGV4Yy5lbmQgKyAyKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuY29kZSh1J2FiY2QnICsgc2VsZi51bm1hcHBlZHVuaWNvZGUgKyB1J2VmZ2gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKSwgKCdhYmNkUkVQTEFDRURnaCcsIDkpKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfaW5kZXhfb3V0b2Zib3VuZChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J1RFUk0nLCAxMDApCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC5jamt0ZXN0IiwgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzZWxmLmVuY29kZSwgc2VsZi51bm1hcHBlZHVuaWNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKQorCisgICAgZGVmIHRlc3RfaW5jcmVtZW50YWxlbmNvZGVyKHNlbGYpOgorICAgICAgICBVVEY4UmVhZGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQorICAgICAgICBmb3Igc2l6ZWhpbnQgaW4gW05vbmVdICsgcmFuZ2UoMSwgMzMpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWzY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0XToKKyAgICAgICAgICAgIGlzdHJlYW0gPSBVVEY4UmVhZGVyKFN0cmluZ0lPKHNlbGYudHN0cmluZ1sxXSkpCisgICAgICAgICAgICBvc3RyZWFtID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgZW5jb2RlciA9IHNlbGYuaW5jcmVtZW50YWxlbmNvZGVyKCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgaWYgc2l6ZWhpbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpc3RyZWFtLnJlYWQoc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZCgpCisKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlID0gZW5jb2Rlci5lbmNvZGUoZGF0YSkKKyAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3N0cmVhbS5nZXR2YWx1ZSgpLCBzZWxmLnRzdHJpbmdbMF0pCisKKyAgICBkZWYgdGVzdF9pbmNyZW1lbnRhbGRlY29kZXIoc2VsZik6CisgICAgICAgIFVURjhXcml0ZXIgPSBjb2RlY3MuZ2V0d3JpdGVyKCd1dGYtOCcpCisgICAgICAgIGZvciBzaXplaGludCBpbiBbTm9uZSwgLTFdICsgcmFuZ2UoMSwgMzMpICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgWzY0LCAxMjgsIDI1NiwgNTEyLCAxMDI0XToKKyAgICAgICAgICAgIGlzdHJlYW0gPSBTdHJpbmdJTyhzZWxmLnRzdHJpbmdbMF0pCisgICAgICAgICAgICBvc3RyZWFtID0gVVRGOFdyaXRlcihTdHJpbmdJTygpKQorICAgICAgICAgICAgZGVjb2RlciA9IHNlbGYuaW5jcmVtZW50YWxkZWNvZGVyKCkKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgZGF0YSA9IGlzdHJlYW0ucmVhZChzaXplaGludCkKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB1ID0gZGVjb2Rlci5kZWNvZGUoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZSh1KQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zdHJlYW0uZ2V0dmFsdWUoKSwgc2VsZi50c3RyaW5nWzFdKQorCisgICAgZGVmIHRlc3RfaW5jcmVtZW50YWxlbmNvZGVyX2Vycm9yX2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBpbnYgPSBzZWxmLnVubWFwcGVkdW5pY29kZQorCisgICAgICAgIGUgPSBzZWxmLmluY3JlbWVudGFsZW5jb2RlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvciwgZS5lbmNvZGUsIGludiwgVHJ1ZSkKKworICAgICAgICBlLmVycm9ycyA9ICdpZ25vcmUnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lbmNvZGUoaW52LCBUcnVlKSwgJycpCisKKyAgICAgICAgZS5yZXNldCgpCisgICAgICAgIGRlZiB0ZW1wcmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J2NhbGxlZCcsIGV4Yy5lbmQpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigndGVzdC5pbmNyZW1lbnRhbF9lcnJvcl9jYWxsYmFjaycsIHRlbXByZXBsYWNlKQorICAgICAgICBlLmVycm9ycyA9ICd0ZXN0LmluY3JlbWVudGFsX2Vycm9yX2NhbGxiYWNrJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZW5jb2RlKGludiwgVHJ1ZSksICdjYWxsZWQnKQorCisgICAgICAgICMgYWdhaW4KKyAgICAgICAgZS5lcnJvcnMgPSAnaWdub3JlJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZW5jb2RlKGludiwgVHJ1ZSksICcnKQorCisgICAgZGVmIHRlc3Rfc3RyZWFtcmVhZGVyKHNlbGYpOgorICAgICAgICBVVEY4V3JpdGVyID0gY29kZWNzLmdldHdyaXRlcigndXRmLTgnKQorICAgICAgICBmb3IgbmFtZSBpbiBbInJlYWQiLCAicmVhZGxpbmUiLCAicmVhZGxpbmVzIl06CisgICAgICAgICAgICBmb3Igc2l6ZWhpbnQgaW4gW05vbmUsIC0xXSArIHJhbmdlKDEsIDMzKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgICAgIGlzdHJlYW0gPSBzZWxmLnJlYWRlcihTdHJpbmdJTyhzZWxmLnRzdHJpbmdbMF0pKQorICAgICAgICAgICAgICAgIG9zdHJlYW0gPSBVVEY4V3JpdGVyKFN0cmluZ0lPKCkpCisgICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoaXN0cmVhbSwgbmFtZSkKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gZnVuYyhzaXplaGludCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBpZiBuYW1lID09ICJyZWFkbGluZXMiOgorICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZWxpbmVzKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBvc3RyZWFtLndyaXRlKGRhdGEpCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zdHJlYW0uZ2V0dmFsdWUoKSwgc2VsZi50c3RyaW5nWzFdKQorCisgICAgZGVmIHRlc3Rfc3RyZWFtd3JpdGVyKHNlbGYpOgorICAgICAgICByZWFkZnVuY3MgPSAoJ3JlYWQnLCAncmVhZGxpbmUnLCAncmVhZGxpbmVzJykKKyAgICAgICAgVVRGOFJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKKyAgICAgICAgZm9yIG5hbWUgaW4gcmVhZGZ1bmNzOgorICAgICAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lXSArIHJhbmdlKDEsIDMzKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNjQsIDEyOCwgMjU2LCA1MTIsIDEwMjRdOgorICAgICAgICAgICAgICAgIGlzdHJlYW0gPSBVVEY4UmVhZGVyKFN0cmluZ0lPKHNlbGYudHN0cmluZ1sxXSkpCisgICAgICAgICAgICAgICAgb3N0cmVhbSA9IHNlbGYud3JpdGVyKFN0cmluZ0lPKCkpCisgICAgICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoaXN0cmVhbSwgbmFtZSkKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBpZiBzaXplaGludCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmdW5jKHNpemVoaW50KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGZ1bmMoKQorCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBkYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSA9PSAicmVhZGxpbmVzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGVsaW5lcyhkYXRhKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShkYXRhKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc3RyZWFtLmdldHZhbHVlKCksIHNlbGYudHN0cmluZ1swXSkKKworY2xhc3MgVGVzdEJhc2VfTWFwcGluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgcGFzc19lbmN0ZXN0ID0gW10KKyAgICBwYXNzX2RlY3Rlc3QgPSBbXQorICAgIHN1cG1hcHMgPSBbXQorICAgIGNvZGVjdGVzdHMgPSBbXQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYub3Blbl9tYXBwaW5nX2ZpbGUoKS5jbG9zZSgpICMgdGVzdCBpdCB0byByZXBvcnQgdGhlIGVycm9yIGVhcmx5CisgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgSFRUUEV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJDb3VsZCBub3QgcmV0cmlldmUgIitzZWxmLm1hcGZpbGV1cmwpCisKKyAgICBkZWYgb3Blbl9tYXBwaW5nX2ZpbGUoc2VsZik6CisgICAgICAgIHJldHVybiB0ZXN0X3N1cHBvcnQub3Blbl91cmxyZXNvdXJjZShzZWxmLm1hcGZpbGV1cmwpCisKKyAgICBkZWYgdGVzdF9tYXBwaW5nX2ZpbGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYubWFwZmlsZXVybC5lbmRzd2l0aCgnLnhtbCcpOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9tYXBwaW5nX2ZpbGVfdWNtKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfbWFwcGluZ19maWxlX3BsYWluKCkKKworICAgIGRlZiBfdGVzdF9tYXBwaW5nX2ZpbGVfcGxhaW4oc2VsZik6CisgICAgICAgIF91bmljaHIgPSBsYW1iZGEgYzogZXZhbCgidSdcXFUlMDh4JyIgJSBpbnQoYywgMTYpKQorICAgICAgICB1bmljaHJzID0gbGFtYmRhIHM6IHUnJy5qb2luKF91bmljaHIoYykgZm9yIGMgaW4gcy5zcGxpdCgnKycpKQorICAgICAgICB1cnRfd2EgPSB7fQorCisgICAgICAgIHdpdGggc2VsZi5vcGVuX21hcHBpbmdfZmlsZSgpIGFzIGY6CisgICAgICAgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGRhdGEgPSBsaW5lLnNwbGl0KCcjJylbMF0uc3RyaXAoKS5zcGxpdCgpCisgICAgICAgICAgICAgICAgaWYgbGVuKGRhdGEpICE9IDI6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBjc2V0dmFsID0gZXZhbChkYXRhWzBdKQorICAgICAgICAgICAgICAgIGlmIGNzZXR2YWwgPD0gMHg3RjoKKyAgICAgICAgICAgICAgICAgICAgY3NldGNoID0gY2hyKGNzZXR2YWwgJiAweGZmKQorICAgICAgICAgICAgICAgIGVsaWYgY3NldHZhbCA+PSAweDEwMDAwMDA6CisgICAgICAgICAgICAgICAgICAgIGNzZXRjaCA9IGNocihjc2V0dmFsID4+IDI0KSArIGNocigoY3NldHZhbCA+PiAxNikgJiAweGZmKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyKChjc2V0dmFsID4+IDgpICYgMHhmZikgKyBjaHIoY3NldHZhbCAmIDB4ZmYpCisgICAgICAgICAgICAgICAgZWxpZiBjc2V0dmFsID49IDB4MTAwMDA6CisgICAgICAgICAgICAgICAgICAgIGNzZXRjaCA9IGNocihjc2V0dmFsID4+IDE2KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hyKChjc2V0dmFsID4+IDgpICYgMHhmZikgKyBjaHIoY3NldHZhbCAmIDB4ZmYpCisgICAgICAgICAgICAgICAgZWxpZiBjc2V0dmFsID49IDB4MTAwOgorICAgICAgICAgICAgICAgICAgICBjc2V0Y2ggPSBjaHIoY3NldHZhbCA+PiA4KSArIGNocihjc2V0dmFsICYgMHhmZikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgdW5pY2ggPSB1bmljaHJzKGRhdGFbMV0pCisgICAgICAgICAgICAgICAgaWYgdW5pY2ggPT0gdSdcdWZmZmQnIG9yIHVuaWNoIGluIHVydF93YToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICB1cnRfd2FbdW5pY2hdID0gY3NldGNoCisKKyAgICAgICAgICAgICAgICBzZWxmLl90ZXN0cG9pbnQoY3NldGNoLCB1bmljaCkKKworICAgIGRlZiBfdGVzdF9tYXBwaW5nX2ZpbGVfdWNtKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3Blbl9tYXBwaW5nX2ZpbGUoKSBhcyBmOgorICAgICAgICAgICAgdWNtZGF0YSA9IGYucmVhZCgpCisgICAgICAgIHVjID0gcmUuZmluZGFsbCgnPGEgdT0iKFtBLUYwLTldezR9KSIgYj0iKFswLTlBLUYgXSspIi8+JywgdWNtZGF0YSkKKyAgICAgICAgZm9yIHVuaSwgY29kZWQgaW4gdWM6CisgICAgICAgICAgICB1bmljaCA9IHVuaWNocihpbnQodW5pLCAxNikpCisgICAgICAgICAgICBjb2RlY2ggPSAnJy5qb2luKGNocihpbnQoYywgMTYpKSBmb3IgYyBpbiBjb2RlZC5zcGxpdCgpKQorICAgICAgICAgICAgc2VsZi5fdGVzdHBvaW50KGNvZGVjaCwgdW5pY2gpCisKKyAgICBkZWYgdGVzdF9tYXBwaW5nX3N1cHBsZW1lbnRhbChzZWxmKToKKyAgICAgICAgZm9yIG1hcHBpbmcgaW4gc2VsZi5zdXBtYXBzOgorICAgICAgICAgICAgc2VsZi5fdGVzdHBvaW50KCptYXBwaW5nKQorCisgICAgZGVmIF90ZXN0cG9pbnQoc2VsZiwgY3NldGNoLCB1bmljaCk6CisgICAgICAgIGlmIChjc2V0Y2gsIHVuaWNoKSBub3QgaW4gc2VsZi5wYXNzX2VuY3Rlc3Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljaC5lbmNvZGUoc2VsZi5lbmNvZGluZyksIGNzZXRjaCkKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ0VuY29kaW5nIGZhaWxlZCB3aGlsZSB0ZXN0aW5nICVzIC0+ICVzOiAlcycgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcih1bmljaCksIHJlcHIoY3NldGNoKSwgZXhjLnJlYXNvbikpCisgICAgICAgIGlmIChjc2V0Y2gsIHVuaWNoKSBub3QgaW4gc2VsZi5wYXNzX2RlY3Rlc3Q6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjc2V0Y2guZGVjb2RlKHNlbGYuZW5jb2RpbmcpLCB1bmljaCkKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3IsIGV4YzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ0RlY29kaW5nIGZhaWxlZCB3aGlsZSB0ZXN0aW5nICVzIC0+ICVzOiAlcycgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcihjc2V0Y2gpLCByZXByKHVuaWNoKSwgZXhjLnJlYXNvbikpCisKKyAgICBkZWYgdGVzdF9lcnJvcmhhbmRsZShzZWxmKToKKyAgICAgICAgZm9yIHNvdXJjZSwgc2NoZW1lLCBleHBlY3RlZCBpbiBzZWxmLmNvZGVjdGVzdHM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNvdXJjZSwgYnl0ZXMpOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBzb3VyY2UuZGVjb2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZ1bmMgPSBzb3VyY2UuZW5jb2RlCisgICAgICAgICAgICBpZiBleHBlY3RlZDoKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNvdXJjZSwgYnl0ZXMpOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jKHNlbGYuZW5jb2RpbmcsIHNjaGVtZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVzdWx0KSBpcyB1bmljb2RlLCB0eXBlKHJlc3VsdCkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIuZGVjb2RlKCVyLCAlcik9JXIgIT0gJXInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoc291cmNlLCBzZWxmLmVuY29kaW5nLCBzY2hlbWUsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZnVuYyhzZWxmLmVuY29kaW5nLCBzY2hlbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlc3VsdCkgaXMgYnl0ZXMsIHR5cGUocmVzdWx0KSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICclci5lbmNvZGUoJXIsICVyKT0lciAhPSAlcicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChzb3VyY2UsIHNlbGYuZW5jb2RpbmcsIHNjaGVtZSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCBmdW5jLCBzZWxmLmVuY29kaW5nLCBzY2hlbWUpCisKK2RlZiBsb2FkX3Rlc3RzdHJpbmcobmFtZSk6CisgICAgZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICdjamtlbmNvZGluZ3MnKQorICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oZGlyLCBuYW1lICsgJy50eHQnKSwgJ3JiJykgYXMgZjoKKyAgICAgICAgZW5jb2RlZCA9IGYucmVhZCgpCisgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihkaXIsIG5hbWUgKyAnLXV0ZjgudHh0JyksICdyYicpIGFzIGY6CisgICAgICAgIHV0ZjggPSBmLnJlYWQoKQorICAgIHJldHVybiBlbmNvZGVkLCB1dGY4CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Y2Q4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Y2Q4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzMDc1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weQpAQCAtMCwwICsxLDY3IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorbWltZXRvb2xzID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ21pbWV0b29scycsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK211bHRpZmlsZSA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdtdWx0aWZpbGUnLCBkZXByZWNhdGVkPVRydWUpCitpbXBvcnQgY1N0cmluZ0lPCisKK21zZyA9ICIiIk1pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsKKyAgICAgICAgYm91bmRhcnk9Ij09PT09PT09PT09PT09PT09PT09PV81OTA0NTM2Njc9PV8iCitYLU9yaWdpbmFsQXJyaXZhbFRpbWU6IDA1IEZlYiAyMDAyIDAzOjQzOjIzLjAzMTAgKFVUQykgRklMRVRJTUU9WzQyRDg4Q0UwOjAxQzFBREY3XQorCistLT09PT09PT09PT09PT09PT09PT09PV81OTA0NTM2Njc9PV8KK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2FsdGVybmF0aXZlOworICAgICAgICBib3VuZGFyeT0iPT09PT09PT09PT09PT09PT09PT09XzU5MDQ1MzY3Nz09Xy5BTFQiCisKKy0tPT09PT09PT09PT09PT09PT09PT09XzU5MDQ1MzY3Nz09Xy5BTFQKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiOyBmb3JtYXQ9Zmxvd2VkCisKK3Rlc3QgQQorLS09PT09PT09PT09PT09PT09PT09PT1fNTkwNDUzNjc3PT1fLkFMVAorQ29udGVudC1UeXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9InVzLWFzY2lpIgorCis8aHRtbD4KKzxiPnRlc3QgQjwvZm9udD48L2I+PC9odG1sPgorCistLT09PT09PT09PT09PT09PT09PT09PV81OTA0NTM2Nzc9PV8uQUxULS0KKworLS09PT09PT09PT09PT09PT09PT09PT1fNTkwNDUzNjY3PT1fCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorQ29udGVudC1EaXNwb3NpdGlvbjogYXR0YWNobWVudDsgZmlsZW5hbWU9ImF0dC50eHQiCisKK0F0dGFjaGVkIENvbnRlbnQuCitBdHRhY2hlZCBDb250ZW50LgorQXR0YWNoZWQgQ29udGVudC4KK0F0dGFjaGVkIENvbnRlbnQuCisKKy0tPT09PT09PT09PT09PT09PT09PT09XzU5MDQ1MzY2Nz09Xy0tCisKKyIiIgorCitkZWYgZ2V0TUlNRU1zZyhtZik6CisgICAgZ2xvYmFsIGJvdW5kYXJpZXMsIGxpbmVjb3VudAorICAgIG1zZyA9IG1pbWV0b29scy5NZXNzYWdlKG1mKQorCisgICAgI3ByaW50ICJUWVBFOiAlcyIgJSBtc2cuZ2V0dHlwZSgpCisgICAgaWYgbXNnLmdldG1haW50eXBlKCkgPT0gJ211bHRpcGFydCc6CisgICAgICAgIGJvdW5kYXJ5ID0gbXNnLmdldHBhcmFtKCJib3VuZGFyeSIpCisgICAgICAgIGJvdW5kYXJpZXMgKz0gMQorCisgICAgICAgIG1mLnB1c2goYm91bmRhcnkpCisgICAgICAgIHdoaWxlIG1mLm5leHQoKToKKyAgICAgICAgICAgIGdldE1JTUVNc2cobWYpCisgICAgICAgIG1mLnBvcCgpCisgICAgZWxzZToKKyAgICAgICAgbGluZXMgPSBtZi5yZWFkbGluZXMoKQorICAgICAgICBsaW5lY291bnQgKz0gbGVuKGxpbmVzKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgZ2xvYmFsIGJvdW5kYXJpZXMsIGxpbmVjb3VudAorICAgIGJvdW5kYXJpZXMgPSAwCisgICAgbGluZWNvdW50ID0gMAorICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8obXNnKQorICAgIGdldE1JTUVNc2cobXVsdGlmaWxlLk11bHRpRmlsZShmKSkKKyAgICBhc3NlcnQgYm91bmRhcmllcyA9PSAyCisgICAgYXNzZXJ0IGxpbmVjb3VudCA9PSA5CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOGE4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NTkxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdWx0aWZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODY2M2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5CkBAIC0wLDAgKzEsMjUyNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgVW5pdCB0ZXN0cyBmb3IgdGhlIG11bHRpcHJvY2Vzc2luZyBwYWNrYWdlCisjCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFF1ZXVlCitpbXBvcnQgdGltZQoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgZ2MKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBhcnJheQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHJhbmRvbQoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBlcnJubworaW1wb3J0IHRlc3Quc2NyaXB0X2hlbHBlcgorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitfbXVsdGlwcm9jZXNzaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ19tdWx0aXByb2Nlc3NpbmcnKQorIyBpbXBvcnQgdGhyZWFkaW5nIGFmdGVyIF9tdWx0aXByb2Nlc3NpbmcgdG8gcmFpc2UgYSBtb3JlIHJlbGV2YW50IGVycm9yCisjIG1lc3NhZ2U6ICJObyBtb2R1bGUgbmFtZWQgX211bHRpcHJvY2Vzc2luZyIuIF9tdWx0aXByb2Nlc3NpbmcgaXMgbm90IGNvbXBpbGVkCisjIHdpdGhvdXQgdGhyZWFkIHN1cHBvcnQuCitpbXBvcnQgdGhyZWFkaW5nCisKKyMgV29yayBhcm91bmQgYnJva2VuIHNlbV9vcGVuIGltcGxlbWVudGF0aW9ucwordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ211bHRpcHJvY2Vzc2luZy5zeW5jaHJvbml6ZScpCisKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcuZHVtbXkKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcuY29ubmVjdGlvbgoraW1wb3J0IG11bHRpcHJvY2Vzc2luZy5tYW5hZ2VycworaW1wb3J0IG11bHRpcHJvY2Vzc2luZy5oZWFwCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nLnBvb2wKKworZnJvbSBtdWx0aXByb2Nlc3NpbmcgaW1wb3J0IHV0aWwKKwordHJ5OgorICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCByZWR1Y3Rpb24KKyAgICBIQVNfUkVEVUNUSU9OID0gVHJ1ZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIEhBU19SRURVQ1RJT04gPSBGYWxzZQorCit0cnk6CisgICAgZnJvbSBtdWx0aXByb2Nlc3Npbmcuc2hhcmVkY3R5cGVzIGltcG9ydCBWYWx1ZSwgY29weQorICAgIEhBU19TSEFSRURDVFlQRVMgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgSEFTX1NIQVJFRENUWVBFUyA9IEZhbHNlCisKK3RyeToKKyAgICBpbXBvcnQgbXN2Y3J0CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgbXN2Y3J0ID0gTm9uZQorCisjCisjCisjCisKK2xhdGluID0gc3RyCisKKyMKKyMgQ29uc3RhbnRzCisjCisKK0xPR19MRVZFTCA9IHV0aWwuU1VCV0FSTklORworI0xPR19MRVZFTCA9IGxvZ2dpbmcuREVCVUcKKworREVMVEEgPSAwLjEKK0NIRUNLX1RJTUlOR1MgPSBGYWxzZSAgICAgIyBtYWtpbmcgdHJ1ZSBtYWtlcyB0ZXN0cyB0YWtlIGEgbG90IGxvbmdlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFuZCBjYW4gc29tZXRpbWVzIGNhdXNlIHNvbWUgbm9uLXNlcmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmYWlsdXJlcyBiZWNhdXNlIHNvbWUgY2FsbHMgYmxvY2sgYSBiaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb25nZXIgdGhhbiBleHBlY3RlZAoraWYgQ0hFQ0tfVElNSU5HUzoKKyAgICBUSU1FT1VUMSwgVElNRU9VVDIsIFRJTUVPVVQzID0gMC44MiwgMC4zNSwgMS40CitlbHNlOgorICAgIFRJTUVPVVQxLCBUSU1FT1VUMiwgVElNRU9VVDMgPSAwLjEsIDAuMSwgMC4xCisKK0hBVkVfR0VUVkFMVUUgPSBub3QgZ2V0YXR0cihfbXVsdGlwcm9jZXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdIQVZFX0JST0tFTl9TRU1fR0VUVkFMVUUnLCBGYWxzZSkKKworV0lOMzIgPSAoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIpCisKK3RyeToKKyAgICBNQVhGRCA9IG9zLnN5c2NvbmYoIlNDX09QRU5fTUFYIikKK2V4Y2VwdDoKKyAgICBNQVhGRCA9IDI1NgorCisjCisjIFNvbWUgdGVzdHMgcmVxdWlyZSBjdHlwZXMKKyMKKwordHJ5OgorICAgIGZyb20gY3R5cGVzIGltcG9ydCBTdHJ1Y3R1cmUsIGNfaW50LCBjX2RvdWJsZQorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIFN0cnVjdHVyZSA9IG9iamVjdAorICAgIGNfaW50ID0gY19kb3VibGUgPSBOb25lCisKKworZGVmIGNoZWNrX2Vub3VnaF9zZW1hcGhvcmVzKCk6CisgICAgIiIiQ2hlY2sgdGhhdCB0aGUgc3lzdGVtIHN1cHBvcnRzIGVub3VnaCBzZW1hcGhvcmVzIHRvIHJ1biB0aGUgdGVzdC4iIiIKKyAgICAjIG1pbmltdW0gbnVtYmVyIG9mIHNlbWFwaG9yZXMgYXZhaWxhYmxlIGFjY29yZGluZyB0byBQT1NJWAorICAgIG5zZW1zX21pbiA9IDI1NgorICAgIHRyeToKKyAgICAgICAgbnNlbXMgPSBvcy5zeXNjb25mKCJTQ19TRU1fTlNFTVNfTUFYIikKKyAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgIyBzeXNjb25mIG5vdCBhdmFpbGFibGUgb3Igc2V0dGluZyBub3QgYXZhaWxhYmxlCisgICAgICAgIHJldHVybgorICAgIGlmIG5zZW1zID09IC0xIG9yIG5zZW1zID49IG5zZW1zX21pbjoKKyAgICAgICAgcmV0dXJuCisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlRoZSBPUyBkb2Vzbid0IHN1cHBvcnQgZW5vdWdoIHNlbWFwaG9yZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0byBydW4gdGhlIHRlc3QgKHJlcXVpcmVkOiAlZCkuIiAlIG5zZW1zX21pbikKKworCisjCisjIENyZWF0ZXMgYSB3cmFwcGVyIGZvciBhIGZ1bmN0aW9uIHdoaWNoIHJlY29yZHMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gZmluaXNoCisjCisKK2NsYXNzIFRpbWluZ1dyYXBwZXIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jKToKKyAgICAgICAgc2VsZi5mdW5jID0gZnVuYworICAgICAgICBzZWxmLmVsYXBzZWQgPSBOb25lCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHQgPSB0aW1lLnRpbWUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5mdW5jKCphcmdzLCAqKmt3ZHMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmVsYXBzZWQgPSB0aW1lLnRpbWUoKSAtIHQKKworIworIyBCYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzCisjCisKK2NsYXNzIEJhc2VUZXN0Q2FzZShvYmplY3QpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywgJ21hbmFnZXInLCAndGhyZWFkcycpCisKKyAgICBkZWYgYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoc2VsZiwgYSwgYik6CisgICAgICAgIGlmIENIRUNLX1RJTUlOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGEsIGIsIDEpCisKKyAgICBkZWYgYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoc2VsZiwgdmFsdWUsIGZ1bmMsICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gZnVuYygqYXJncykKKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgcmVzKQorCisgICAgIyBGb3IgdGhlIHNhbml0eSBvZiBXaW5kb3dzIHVzZXJzLCByYXRoZXIgdGhhbiBjcmFzaGluZyBvciBmcmVlemluZyBpbgorICAgICMgbXVsdGlwbGUgd2F5cy4KKyAgICBkZWYgX19yZWR1Y2VfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoInNob3VsZG4ndCB0cnkgdG8gcGlja2xlIGEgdGVzdCBjYXNlIikKKworICAgIF9fcmVkdWNlX2V4X18gPSBfX3JlZHVjZV9fCisKKyMKKyMgUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNlbWFwaG9yZQorIworCitkZWYgZ2V0X3ZhbHVlKHNlbGYpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X3ZhbHVlKCkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9TZW1hcGhvcmVfX3ZhbHVlCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyMKKyMgVGVzdGNhc2VzCisjCisKK2NsYXNzIF9UZXN0UHJvY2VzcyhCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywgJ3RocmVhZHMnKQorCisgICAgZGVmIHRlc3RfY3VycmVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICd0aHJlYWRzJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGN1cnJlbnQgPSBzZWxmLmN1cnJlbnRfcHJvY2VzcygpCisgICAgICAgIGF1dGhrZXkgPSBjdXJyZW50LmF1dGhrZXkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoY3VycmVudC5pc19hbGl2ZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGN1cnJlbnQuZGFlbW9uKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYXV0aGtleSwgYnl0ZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oYXV0aGtleSkgPiAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJlbnQuaWRlbnQsIG9zLmdldHBpZCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJlbnQuZXhpdGNvZGUsIE5vbmUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3QoY2xzLCBxLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgY3VycmVudCA9IGNscy5jdXJyZW50X3Byb2Nlc3MoKQorICAgICAgICBxLnB1dChhcmdzKQorICAgICAgICBxLnB1dChrd2RzKQorICAgICAgICBxLnB1dChjdXJyZW50Lm5hbWUpCisgICAgICAgIGlmIGNscy5UWVBFICE9ICd0aHJlYWRzJzoKKyAgICAgICAgICAgIHEucHV0KGJ5dGVzKGN1cnJlbnQuYXV0aGtleSkpCisgICAgICAgICAgICBxLnB1dChjdXJyZW50LnBpZCkKKworICAgIGRlZiB0ZXN0X3Byb2Nlc3Moc2VsZik6CisgICAgICAgIHEgPSBzZWxmLlF1ZXVlKDEpCisgICAgICAgIGUgPSBzZWxmLkV2ZW50KCkKKyAgICAgICAgYXJncyA9IChxLCAxLCAyKQorICAgICAgICBrd2FyZ3MgPSB7J2hlbGxvJzoyMywgJ2J5ZSc6Mi41NH0KKyAgICAgICAgbmFtZSA9ICdTb21lUHJvY2VzcycKKyAgICAgICAgcCA9IHNlbGYuUHJvY2VzcygKKyAgICAgICAgICAgIHRhcmdldD1zZWxmLl90ZXN0LCBhcmdzPWFyZ3MsIGt3YXJncz1rd2FyZ3MsIG5hbWU9bmFtZQorICAgICAgICAgICAgKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgY3VycmVudCA9IHNlbGYuY3VycmVudF9wcm9jZXNzKCkKKworICAgICAgICBpZiBzZWxmLlRZUEUgIT0gJ3RocmVhZHMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmF1dGhrZXksIGN1cnJlbnQuYXV0aGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmlzX2FsaXZlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZGFlbW9uLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHAsIHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpIGlzIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5leGl0Y29kZSwgTm9uZSkKKworICAgICAgICBwLnN0YXJ0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5pc19hbGl2ZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEluKHAsIHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLmdldCgpLCBhcmdzWzE6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLmdldCgpLCBrd2FyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocS5nZXQoKSwgcC5uYW1lKQorICAgICAgICBpZiBzZWxmLlRZUEUgIT0gJ3RocmVhZHMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLmdldCgpLCBjdXJyZW50LmF1dGhrZXkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEuZ2V0KCksIHAucGlkKQorCisgICAgICAgIHAuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmV4aXRjb2RlLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaXNfYWxpdmUoKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocCwgc2VsZi5hY3RpdmVfY2hpbGRyZW4oKSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF90ZXJtaW5hdGUoY2xzKToKKyAgICAgICAgdGltZS5zbGVlcCgxMDAwKQorCisgICAgZGVmIHRlc3RfdGVybWluYXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ3RocmVhZHMnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdF90ZXJtaW5hdGUpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaXNfYWxpdmUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihwLCBzZWxmLmFjdGl2ZV9jaGlsZHJlbigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIE5vbmUpCisKKyAgICAgICAgcC50ZXJtaW5hdGUoKQorCisgICAgICAgIGpvaW4gPSBUaW1pbmdXcmFwcGVyKHAuam9pbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChqb2luKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoam9pbi5lbGFwc2VkLCAwLjApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmlzX2FsaXZlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHAsIHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpCisKKyAgICAgICAgcC5qb2luKCkKKworICAgICAgICAjIFhYWCBzb21ldGltZXMgZ2V0IHAuZXhpdGNvZGUgPT0gMCBvbiBXaW5kb3dzIC4uLgorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChwLmV4aXRjb2RlLCAtc2lnbmFsLlNJR1RFUk0pCisKKyAgICBkZWYgdGVzdF9jcHVfY291bnQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNwdXMgPSBtdWx0aXByb2Nlc3NpbmcuY3B1X2NvdW50KCkKKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICBjcHVzID0gMQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShjcHVzKSBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcHVzID49IDEpCisKKyAgICBkZWYgdGVzdF9hY3RpdmVfY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzZWxmLmFjdGl2ZV9jaGlsZHJlbigpKSwgbGlzdCkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD10aW1lLnNsZWVwLCBhcmdzPShERUxUQSwpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHAsIHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpCisKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICBzZWxmLmFzc2VydEluKHAsIHNlbGYuYWN0aXZlX2NoaWxkcmVuKCkpCisKKyAgICAgICAgcC5qb2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihwLCBzZWxmLmFjdGl2ZV9jaGlsZHJlbigpKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X3JlY3Vyc2lvbihjbHMsIHdjb25uLCBpZCk6CisgICAgICAgIGZyb20gbXVsdGlwcm9jZXNzaW5nIGltcG9ydCBmb3JraW5nCisgICAgICAgIHdjb25uLnNlbmQoaWQpCisgICAgICAgIGlmIGxlbihpZCkgPCAyOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMik6CisgICAgICAgICAgICAgICAgcCA9IGNscy5Qcm9jZXNzKAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9Y2xzLl90ZXN0X3JlY3Vyc2lvbiwgYXJncz0od2Nvbm4sIGlkK1tpXSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgICAgIHAuam9pbigpCisKKyAgICBkZWYgdGVzdF9yZWN1cnNpb24oc2VsZik6CisgICAgICAgIHJjb25uLCB3Y29ubiA9IHNlbGYuUGlwZShkdXBsZXg9RmFsc2UpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVjdXJzaW9uKHdjb25uLCBbXSkKKworICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICB3aGlsZSByY29ubi5wb2xsKCk6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHJjb25uLnJlY3YoKSkKKworICAgICAgICBleHBlY3RlZCA9IFsKKyAgICAgICAgICAgIFtdLAorICAgICAgICAgICAgICBbMF0sCisgICAgICAgICAgICAgICAgWzAsIDBdLAorICAgICAgICAgICAgICAgIFswLCAxXSwKKyAgICAgICAgICAgICAgWzFdLAorICAgICAgICAgICAgICAgIFsxLCAwXSwKKyAgICAgICAgICAgICAgICBbMSwgMV0KKyAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X3N5c19leGl0KGNscywgcmVhc29uLCB0ZXN0Zm4pOgorICAgICAgICBzeXMuc3RkZXJyID0gb3Blbih0ZXN0Zm4sICd3JykKKyAgICAgICAgc3lzLmV4aXQocmVhc29uKQorCisgICAgZGVmIHRlc3Rfc3lzX2V4aXQoc2VsZik6CisgICAgICAgICMgU2VlIElzc3VlIDEzODU0CisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAndGhyZWFkcyc6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0ZXN0Zm4gPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X3N1cHBvcnQudW5saW5rLCB0ZXN0Zm4pCisKKyAgICAgICAgZm9yIHJlYXNvbiwgY29kZSBpbiAoKFsxLCAyLCAzXSwgMSksICgnaWdub3JlIHRoaXMnLCAwKSk6CisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X3N5c19leGl0LCBhcmdzPShyZWFzb24sIHRlc3RmbikpCisgICAgICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgcC5qb2luKDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIGNvZGUpCisKKyAgICAgICAgICAgIHdpdGggb3Blbih0ZXN0Zm4sICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLnJzdHJpcCgpLCBzdHIocmVhc29uKSkKKworICAgICAgICBmb3IgcmVhc29uIGluIChUcnVlLCBGYWxzZSwgOCk6CisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zeXMuZXhpdCwgYXJncz0ocmVhc29uLCkpCisgICAgICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgcC5qb2luKDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZXhpdGNvZGUsIHJlYXNvbikKKworIworIworIworCitjbGFzcyBfVXBwZXJDYXNlcihtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY2hpbGRfY29ubiwgc2VsZi5wYXJlbnRfY29ubiA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKCkKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYucGFyZW50X2Nvbm4uY2xvc2UoKQorICAgICAgICBmb3IgcyBpbiBpdGVyKHNlbGYuY2hpbGRfY29ubi5yZWN2LCBOb25lKToKKyAgICAgICAgICAgIHNlbGYuY2hpbGRfY29ubi5zZW5kKHMudXBwZXIoKSkKKyAgICAgICAgc2VsZi5jaGlsZF9jb25uLmNsb3NlKCkKKworICAgIGRlZiBzdWJtaXQoc2VsZiwgcyk6CisgICAgICAgIGFzc2VydCB0eXBlKHMpIGlzIHN0cgorICAgICAgICBzZWxmLnBhcmVudF9jb25uLnNlbmQocykKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50X2Nvbm4ucmVjdigpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJlbnRfY29ubi5zZW5kKE5vbmUpCisgICAgICAgIHNlbGYucGFyZW50X2Nvbm4uY2xvc2UoKQorICAgICAgICBzZWxmLmNoaWxkX2Nvbm4uY2xvc2UoKQorCitjbGFzcyBfVGVzdFN1YmNsYXNzaW5nUHJvY2VzcyhCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc2luZyhzZWxmKToKKyAgICAgICAgdXBwZXJjYXNlciA9IF9VcHBlckNhc2VyKCkKKyAgICAgICAgdXBwZXJjYXNlci5kYWVtb24gPSBUcnVlCisgICAgICAgIHVwcGVyY2FzZXIuc3RhcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwcGVyY2FzZXIuc3VibWl0KCdoZWxsbycpLCAnSEVMTE8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwcGVyY2FzZXIuc3VibWl0KCd3b3JsZCcpLCAnV09STEQnKQorICAgICAgICB1cHBlcmNhc2VyLnN0b3AoKQorICAgICAgICB1cHBlcmNhc2VyLmpvaW4oKQorCisjCisjCisjCisKK2RlZiBxdWV1ZV9lbXB0eShxKToKKyAgICBpZiBoYXNhdHRyKHEsICdlbXB0eScpOgorICAgICAgICByZXR1cm4gcS5lbXB0eSgpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHEucXNpemUoKSA9PSAwCisKK2RlZiBxdWV1ZV9mdWxsKHEsIG1heHNpemUpOgorICAgIGlmIGhhc2F0dHIocSwgJ2Z1bGwnKToKKyAgICAgICAgcmV0dXJuIHEuZnVsbCgpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHEucXNpemUoKSA9PSBtYXhzaXplCisKKworY2xhc3MgX1Rlc3RRdWV1ZShCYXNlVGVzdENhc2UpOgorCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfcHV0KGNscywgcXVldWUsIGNoaWxkX2Nhbl9zdGFydCwgcGFyZW50X2Nhbl9jb250aW51ZSk6CisgICAgICAgIGNoaWxkX2Nhbl9zdGFydC53YWl0KCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNik6CisgICAgICAgICAgICBxdWV1ZS5nZXQoKQorICAgICAgICBwYXJlbnRfY2FuX2NvbnRpbnVlLnNldCgpCisKKyAgICBkZWYgdGVzdF9wdXQoc2VsZik6CisgICAgICAgIE1BWFNJWkUgPSA2CisgICAgICAgIHF1ZXVlID0gc2VsZi5RdWV1ZShtYXhzaXplPU1BWFNJWkUpCisgICAgICAgIGNoaWxkX2Nhbl9zdGFydCA9IHNlbGYuRXZlbnQoKQorICAgICAgICBwYXJlbnRfY2FuX2NvbnRpbnVlID0gc2VsZi5FdmVudCgpCisKKyAgICAgICAgcHJvYyA9IHNlbGYuUHJvY2VzcygKKyAgICAgICAgICAgIHRhcmdldD1zZWxmLl90ZXN0X3B1dCwKKyAgICAgICAgICAgIGFyZ3M9KHF1ZXVlLCBjaGlsZF9jYW5fc3RhcnQsIHBhcmVudF9jYW5fY29udGludWUpCisgICAgICAgICAgICApCisgICAgICAgIHByb2MuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwcm9jLnN0YXJ0KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlX2VtcHR5KHF1ZXVlKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZV9mdWxsKHF1ZXVlLCBNQVhTSVpFKSwgRmFsc2UpCisKKyAgICAgICAgcXVldWUucHV0KDEpCisgICAgICAgIHF1ZXVlLnB1dCgyLCBUcnVlKQorICAgICAgICBxdWV1ZS5wdXQoMywgVHJ1ZSwgTm9uZSkKKyAgICAgICAgcXVldWUucHV0KDQsIEZhbHNlKQorICAgICAgICBxdWV1ZS5wdXQoNSwgRmFsc2UsIE5vbmUpCisgICAgICAgIHF1ZXVlLnB1dF9ub3dhaXQoNikKKworICAgICAgICAjIHRoZSB2YWx1ZXMgbWF5IGJlIGluIGJ1ZmZlciBidXQgbm90IHlldCBpbiBwaXBlIHNvIHNsZWVwIGEgYml0CisgICAgICAgIHRpbWUuc2xlZXAoREVMVEEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZV9lbXB0eShxdWV1ZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlX2Z1bGwocXVldWUsIE1BWFNJWkUpLCBUcnVlKQorCisgICAgICAgIHB1dCA9IFRpbWluZ1dyYXBwZXIocXVldWUucHV0KQorICAgICAgICBwdXRfbm93YWl0ID0gVGltaW5nV3JhcHBlcihxdWV1ZS5wdXRfbm93YWl0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFF1ZXVlLkZ1bGwsIHB1dCwgNywgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwocHV0LmVsYXBzZWQsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRnVsbCwgcHV0LCA3LCBGYWxzZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChwdXQuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5GdWxsLCBwdXRfbm93YWl0LCA3KQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHB1dF9ub3dhaXQuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5GdWxsLCBwdXQsIDcsIFRydWUsIFRJTUVPVVQxKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHB1dC5lbGFwc2VkLCBUSU1FT1VUMSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5GdWxsLCBwdXQsIDcsIEZhbHNlLCBUSU1FT1VUMikKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChwdXQuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5GdWxsLCBwdXQsIDcsIFRydWUsIHRpbWVvdXQ9VElNRU9VVDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwocHV0LmVsYXBzZWQsIFRJTUVPVVQzKQorCisgICAgICAgIGNoaWxkX2Nhbl9zdGFydC5zZXQoKQorICAgICAgICBwYXJlbnRfY2FuX2NvbnRpbnVlLndhaXQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWVfZW1wdHkocXVldWUpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlX2Z1bGwocXVldWUsIE1BWFNJWkUpLCBGYWxzZSkKKworICAgICAgICBwcm9jLmpvaW4oKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X2dldChjbHMsIHF1ZXVlLCBjaGlsZF9jYW5fc3RhcnQsIHBhcmVudF9jYW5fY29udGludWUpOgorICAgICAgICBjaGlsZF9jYW5fc3RhcnQud2FpdCgpCisgICAgICAgICNxdWV1ZS5wdXQoMSkKKyAgICAgICAgcXVldWUucHV0KDIpCisgICAgICAgIHF1ZXVlLnB1dCgzKQorICAgICAgICBxdWV1ZS5wdXQoNCkKKyAgICAgICAgcXVldWUucHV0KDUpCisgICAgICAgIHBhcmVudF9jYW5fY29udGludWUuc2V0KCkKKworICAgIGRlZiB0ZXN0X2dldChzZWxmKToKKyAgICAgICAgcXVldWUgPSBzZWxmLlF1ZXVlKCkKKyAgICAgICAgY2hpbGRfY2FuX3N0YXJ0ID0gc2VsZi5FdmVudCgpCisgICAgICAgIHBhcmVudF9jYW5fY29udGludWUgPSBzZWxmLkV2ZW50KCkKKworICAgICAgICBwcm9jID0gc2VsZi5Qcm9jZXNzKAorICAgICAgICAgICAgdGFyZ2V0PXNlbGYuX3Rlc3RfZ2V0LAorICAgICAgICAgICAgYXJncz0ocXVldWUsIGNoaWxkX2Nhbl9zdGFydCwgcGFyZW50X2Nhbl9jb250aW51ZSkKKyAgICAgICAgICAgICkKKyAgICAgICAgcHJvYy5kYWVtb24gPSBUcnVlCisgICAgICAgIHByb2Muc3RhcnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWVfZW1wdHkocXVldWUpLCBUcnVlKQorCisgICAgICAgIGNoaWxkX2Nhbl9zdGFydC5zZXQoKQorICAgICAgICBwYXJlbnRfY2FuX2NvbnRpbnVlLndhaXQoKQorCisgICAgICAgIHRpbWUuc2xlZXAoREVMVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWVfZW1wdHkocXVldWUpLCBGYWxzZSkKKworICAgICAgICAjIEhhbmdzIHVuZXhwZWN0ZWRseSwgcmVtb3ZlIGZvciBub3cKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwocXVldWUuZ2V0KCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWUuZ2V0KFRydWUsIE5vbmUpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlLmdldChUcnVlKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZS5nZXQodGltZW91dD0xKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZS5nZXRfbm93YWl0KCksIDUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZV9lbXB0eShxdWV1ZSksIFRydWUpCisKKyAgICAgICAgZ2V0ID0gVGltaW5nV3JhcHBlcihxdWV1ZS5nZXQpCisgICAgICAgIGdldF9ub3dhaXQgPSBUaW1pbmdXcmFwcGVyKHF1ZXVlLmdldF9ub3dhaXQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRW1wdHksIGdldCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRW1wdHksIGdldCwgRmFsc2UsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRW1wdHksIGdldF9ub3dhaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0X25vd2FpdC5lbGFwc2VkLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFF1ZXVlLkVtcHR5LCBnZXQsIFRydWUsIFRJTUVPVVQxKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGdldC5lbGFwc2VkLCBUSU1FT1VUMSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhRdWV1ZS5FbXB0eSwgZ2V0LCBGYWxzZSwgVElNRU9VVDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoZ2V0LmVsYXBzZWQsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRW1wdHksIGdldCwgdGltZW91dD1USU1FT1VUMykKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChnZXQuZWxhcHNlZCwgVElNRU9VVDMpCisKKyAgICAgICAgcHJvYy5qb2luKCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF9mb3JrKGNscywgcXVldWUpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCwgMjApOgorICAgICAgICAgICAgcXVldWUucHV0KGkpCisgICAgICAgICMgbm90ZSB0aGF0IGF0IHRoaXMgcG9pbnQgdGhlIGl0ZW1zIG1heSBvbmx5IGJlIGJ1ZmZlcmVkLCBzbyB0aGUKKyAgICAgICAgIyBwcm9jZXNzIGNhbm5vdCBzaHV0ZG93biB1bnRpbCB0aGUgZmVlZGVyIHRocmVhZCBoYXMgZmluaXNoZWQKKyAgICAgICAgIyBwdXNoaW5nIGl0ZW1zIG9udG8gdGhlIHBpcGUuCisKKyAgICBkZWYgdGVzdF9mb3JrKHNlbGYpOgorICAgICAgICAjIE9sZCB2ZXJzaW9ucyBvZiBRdWV1ZSB3b3VsZCBmYWlsIHRvIGNyZWF0ZSBhIG5ldyBmZWVkZXIKKyAgICAgICAgIyB0aHJlYWQgZm9yIGEgZm9ya2VkIHByb2Nlc3MgaWYgdGhlIG9yaWdpbmFsIHByb2Nlc3MgaGFkIGl0cworICAgICAgICAjIG93biBmZWVkZXIgdGhyZWFkLiAgVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IHRoaXMgbm8gbG9uZ2VyCisgICAgICAgICMgaGFwcGVucy4KKworICAgICAgICBxdWV1ZSA9IHNlbGYuUXVldWUoKQorCisgICAgICAgICMgcHV0IGl0ZW1zIG9uIHF1ZXVlIHNvIHRoYXQgbWFpbiBwcm9jZXNzIHN0YXJ0cyBhIGZlZWRlciB0aHJlYWQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgcXVldWUucHV0KGkpCisKKyAgICAgICAgIyB3YWl0IHRvIG1ha2Ugc3VyZSB0aHJlYWQgc3RhcnRzIGJlZm9yZSB3ZSBmb3JrIGEgbmV3IHByb2Nlc3MKKyAgICAgICAgdGltZS5zbGVlcChERUxUQSkKKworICAgICAgICAjIGZvcmsgcHJvY2VzcworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X2ZvcmssIGFyZ3M9KHF1ZXVlLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKworICAgICAgICAjIGNoZWNrIHRoYXQgYWxsIGV4cGVjdGVkIGl0ZW1zIGFyZSBpbiB0aGUgcXVldWUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdWV1ZS5nZXQoKSwgaSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUXVldWUuRW1wdHksIHF1ZXVlLmdldCwgRmFsc2UpCisKKyAgICAgICAgcC5qb2luKCkKKworICAgIGRlZiB0ZXN0X3FzaXplKHNlbGYpOgorICAgICAgICBxID0gc2VsZi5RdWV1ZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocS5xc2l6ZSgpLCAwKQorICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBxLnB1dCgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHEucXNpemUoKSwgMSkKKyAgICAgICAgcS5wdXQoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLnFzaXplKCksIDIpCisgICAgICAgIHEuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLnFzaXplKCksIDEpCisgICAgICAgIHEuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxLnFzaXplKCksIDApCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfdGFza19kb25lKGNscywgcSk6CisgICAgICAgIGZvciBvYmogaW4gaXRlcihxLmdldCwgTm9uZSk6CisgICAgICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorICAgICAgICAgICAgcS50YXNrX2RvbmUoKQorCisgICAgZGVmIHRlc3RfdGFza19kb25lKHNlbGYpOgorICAgICAgICBxdWV1ZSA9IHNlbGYuSm9pbmFibGVRdWV1ZSgpCisKKyAgICAgICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA1KSBhbmQgbm90IGhhc2F0dHIocXVldWUsICd0YXNrX2RvbmUnKToKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoInJlcXVpcmVzICdxdWV1ZS50YXNrX2RvbmUoKScgbWV0aG9kIikKKworICAgICAgICB3b3JrZXJzID0gW3NlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdF90YXNrX2RvbmUsIGFyZ3M9KHF1ZXVlLCkpCisgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDQpXQorCisgICAgICAgIGZvciBwIGluIHdvcmtlcnM6CisgICAgICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHAuc3RhcnQoKQorCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CisgICAgICAgICAgICBxdWV1ZS5wdXQoaSkKKworICAgICAgICBxdWV1ZS5qb2luKCkKKworICAgICAgICBmb3IgcCBpbiB3b3JrZXJzOgorICAgICAgICAgICAgcXVldWUucHV0KE5vbmUpCisKKyAgICAgICAgZm9yIHAgaW4gd29ya2VyczoKKyAgICAgICAgICAgIHAuam9pbigpCisKKyMKKyMKKyMKKworY2xhc3MgX1Rlc3RMb2NrKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9sb2NrKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5Mb2NrKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLmFjcXVpcmUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLmFjcXVpcmUoRmFsc2UpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLnJlbGVhc2UoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIHRocmVhZGluZy5UaHJlYWRFcnJvciksIGxvY2sucmVsZWFzZSkKKworICAgIGRlZiB0ZXN0X3Jsb2NrKHNlbGYpOgorICAgICAgICBsb2NrID0gc2VsZi5STG9jaygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jay5hY3F1aXJlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jay5hY3F1aXJlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jay5hY3F1aXJlKCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jay5yZWxlYXNlKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jay5yZWxlYXNlKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jay5yZWxlYXNlKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChBc3NlcnRpb25FcnJvciwgUnVudGltZUVycm9yKSwgbG9jay5yZWxlYXNlKQorCisgICAgZGVmIHRlc3RfbG9ja19jb250ZXh0KHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuTG9jaygpOgorICAgICAgICAgICAgcGFzcworCisKK2NsYXNzIF9UZXN0U2VtYXBob3JlKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBkZWYgX3Rlc3Rfc2VtYXBob3JlKHNlbGYsIHNlbSk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoMiwgZ2V0X3ZhbHVlLCBzZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VtLmFjcXVpcmUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgxLCBnZXRfdmFsdWUsIHNlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZW0uYWNxdWlyZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDAsIGdldF92YWx1ZSwgc2VtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbS5hY3F1aXJlKEZhbHNlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoMCwgZ2V0X3ZhbHVlLCBzZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VtLnJlbGVhc2UoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgxLCBnZXRfdmFsdWUsIHNlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZW0ucmVsZWFzZSgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDIsIGdldF92YWx1ZSwgc2VtKQorCisgICAgZGVmIHRlc3Rfc2VtYXBob3JlKHNlbGYpOgorICAgICAgICBzZW0gPSBzZWxmLlNlbWFwaG9yZSgyKQorICAgICAgICBzZWxmLl90ZXN0X3NlbWFwaG9yZShzZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VtLnJlbGVhc2UoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgzLCBnZXRfdmFsdWUsIHNlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZW0ucmVsZWFzZSgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDQsIGdldF92YWx1ZSwgc2VtKQorCisgICAgZGVmIHRlc3RfYm91bmRlZF9zZW1hcGhvcmUoc2VsZik6CisgICAgICAgIHNlbSA9IHNlbGYuQm91bmRlZFNlbWFwaG9yZSgyKQorICAgICAgICBzZWxmLl90ZXN0X3NlbWFwaG9yZShzZW0pCisgICAgICAgICMgQ3VycmVudGx5IGZhaWxzIG9uIE9TL1gKKyAgICAgICAgI2lmIEhBVkVfR0VUVkFMVUU6CisgICAgICAgICMgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VtLnJlbGVhc2UpCisgICAgICAgICMgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgyLCBnZXRfdmFsdWUsIHNlbSkKKworICAgIGRlZiB0ZXN0X3RpbWVvdXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuVFlQRSAhPSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbSA9IHNlbGYuU2VtYXBob3JlKDApCisgICAgICAgIGFjcXVpcmUgPSBUaW1pbmdXcmFwcGVyKHNlbS5hY3F1aXJlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWNxdWlyZShGYWxzZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGFjcXVpcmUuZWxhcHNlZCwgMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWNxdWlyZShGYWxzZSwgTm9uZSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGFjcXVpcmUuZWxhcHNlZCwgMC4wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWNxdWlyZShGYWxzZSwgVElNRU9VVDEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChhY3F1aXJlLmVsYXBzZWQsIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3F1aXJlKFRydWUsIFRJTUVPVVQyKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwoYWNxdWlyZS5lbGFwc2VkLCBUSU1FT1VUMikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjcXVpcmUodGltZW91dD1USU1FT1VUMyksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGFjcXVpcmUuZWxhcHNlZCwgVElNRU9VVDMpCisKKworY2xhc3MgX1Rlc3RDb25kaXRpb24oQmFzZVRlc3RDYXNlKToKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBmKGNscywgY29uZCwgc2xlZXBpbmcsIHdva2VuLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBzbGVlcGluZy5yZWxlYXNlKCkKKyAgICAgICAgY29uZC53YWl0KHRpbWVvdXQpCisgICAgICAgIHdva2VuLnJlbGVhc2UoKQorICAgICAgICBjb25kLnJlbGVhc2UoKQorCisgICAgZGVmIGNoZWNrX2ludmFyaWFudChzZWxmLCBjb25kKToKKyAgICAgICAgIyB0aGlzIGlzIG9ubHkgc3VwcG9zZWQgdG8gc3VjY2VlZCB3aGVuIHRoZXJlIGFyZSBubyBzbGVlcGVycworICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ3Byb2Nlc3Nlcyc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2xlZXBlcnMgPSAoY29uZC5fc2xlZXBpbmdfY291bnQuZ2V0X3ZhbHVlKCkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmQuX3dva2VuX2NvdW50LmdldF92YWx1ZSgpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xlZXBlcnMsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25kLl93YWl0X3NlbWFwaG9yZS5nZXRfdmFsdWUoKSwgMCkKKyAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X25vdGlmeShzZWxmKToKKyAgICAgICAgY29uZCA9IHNlbGYuQ29uZGl0aW9uKCkKKyAgICAgICAgc2xlZXBpbmcgPSBzZWxmLlNlbWFwaG9yZSgwKQorICAgICAgICB3b2tlbiA9IHNlbGYuU2VtYXBob3JlKDApCisKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5mLCBhcmdzPShjb25kLCBzbGVlcGluZywgd29rZW4pKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisKKyAgICAgICAgcCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuZiwgYXJncz0oY29uZCwgc2xlZXBpbmcsIHdva2VuKSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorCisgICAgICAgICMgd2FpdCBmb3IgYm90aCBjaGlsZHJlbiB0byBzdGFydCBzbGVlcGluZworICAgICAgICBzbGVlcGluZy5hY3F1aXJlKCkKKyAgICAgICAgc2xlZXBpbmcuYWNxdWlyZSgpCisKKyAgICAgICAgIyBjaGVjayBubyBwcm9jZXNzL3RocmVhZCBoYXMgd29rZW4gdXAKKyAgICAgICAgdGltZS5zbGVlcChERUxUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgwLCBnZXRfdmFsdWUsIHdva2VuKQorCisgICAgICAgICMgd2FrZSB1cCBvbmUgcHJvY2Vzcy90aHJlYWQKKyAgICAgICAgY29uZC5hY3F1aXJlKCkKKyAgICAgICAgY29uZC5ub3RpZnkoKQorICAgICAgICBjb25kLnJlbGVhc2UoKQorCisgICAgICAgICMgY2hlY2sgb25lIHByb2Nlc3MvdGhyZWFkIGhhcyB3b2tlbiB1cAorICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDEsIGdldF92YWx1ZSwgd29rZW4pCisKKyAgICAgICAgIyB3YWtlIHVwIGFub3RoZXIKKyAgICAgICAgY29uZC5hY3F1aXJlKCkKKyAgICAgICAgY29uZC5ub3RpZnkoKQorICAgICAgICBjb25kLnJlbGVhc2UoKQorCisgICAgICAgICMgY2hlY2sgb3RoZXIgaGFzIHdva2VuIHVwCisgICAgICAgIHRpbWUuc2xlZXAoREVMVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoMiwgZ2V0X3ZhbHVlLCB3b2tlbikKKworICAgICAgICAjIGNoZWNrIHN0YXRlIGlzIG5vdCBtdWNrZWQgdXAKKyAgICAgICAgc2VsZi5jaGVja19pbnZhcmlhbnQoY29uZCkKKyAgICAgICAgcC5qb2luKCkKKworICAgIGRlZiB0ZXN0X25vdGlmeV9hbGwoc2VsZik6CisgICAgICAgIGNvbmQgPSBzZWxmLkNvbmRpdGlvbigpCisgICAgICAgIHNsZWVwaW5nID0gc2VsZi5TZW1hcGhvcmUoMCkKKyAgICAgICAgd29rZW4gPSBzZWxmLlNlbWFwaG9yZSgwKQorCisgICAgICAgICMgc3RhcnQgc29tZSB0aHJlYWRzL3Byb2Nlc3NlcyB3aGljaCB3aWxsIHRpbWVvdXQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGNvbmQsIHNsZWVwaW5nLCB3b2tlbiwgVElNRU9VVDEpKQorICAgICAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICBwLnN0YXJ0KCkKKworICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlbGYuZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3M9KGNvbmQsIHNsZWVwaW5nLCB3b2tlbiwgVElNRU9VVDEpKQorICAgICAgICAgICAgdC5kYWVtb24gPSBUcnVlCisgICAgICAgICAgICB0LnN0YXJ0KCkKKworICAgICAgICAjIHdhaXQgZm9yIHRoZW0gYWxsIHRvIHNsZWVwCisgICAgICAgIGZvciBpIGluIHhyYW5nZSg2KToKKyAgICAgICAgICAgIHNsZWVwaW5nLmFjcXVpcmUoKQorCisgICAgICAgICMgY2hlY2sgdGhleSBoYXZlIGFsbCB0aW1lZCBvdXQKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDYpOgorICAgICAgICAgICAgd29rZW4uYWNxdWlyZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmV0dXJuc0lmSW1wbGVtZW50ZWQoMCwgZ2V0X3ZhbHVlLCB3b2tlbikKKworICAgICAgICAjIGNoZWNrIHN0YXRlIGlzIG5vdCBtdWNrZWQgdXAKKyAgICAgICAgc2VsZi5jaGVja19pbnZhcmlhbnQoY29uZCkKKworICAgICAgICAjIHN0YXJ0IHNvbWUgbW9yZSB0aHJlYWRzL3Byb2Nlc3NlcworICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuZiwgYXJncz0oY29uZCwgc2xlZXBpbmcsIHdva2VuKSkKKyAgICAgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgcC5zdGFydCgpCisKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLmYsIGFyZ3M9KGNvbmQsIHNsZWVwaW5nLCB3b2tlbikpCisgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgICAgICMgd2FpdCBmb3IgdGhlbSB0byBhbGwgc2xlZXAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDYpOgorICAgICAgICAgICAgc2xlZXBpbmcuYWNxdWlyZSgpCisKKyAgICAgICAgIyBjaGVjayBubyBwcm9jZXNzL3RocmVhZCBoYXMgd29rZW4gdXAKKyAgICAgICAgdGltZS5zbGVlcChERUxUQSkKKyAgICAgICAgc2VsZi5hc3NlcnRSZXR1cm5zSWZJbXBsZW1lbnRlZCgwLCBnZXRfdmFsdWUsIHdva2VuKQorCisgICAgICAgICMgd2FrZSB0aGVtIGFsbCB1cAorICAgICAgICBjb25kLmFjcXVpcmUoKQorICAgICAgICBjb25kLm5vdGlmeV9hbGwoKQorICAgICAgICBjb25kLnJlbGVhc2UoKQorCisgICAgICAgICMgY2hlY2sgdGhleSBoYXZlIGFsbCB3b2tlbgorICAgICAgICB0aW1lLnNsZWVwKERFTFRBKQorICAgICAgICBzZWxmLmFzc2VydFJldHVybnNJZkltcGxlbWVudGVkKDYsIGdldF92YWx1ZSwgd29rZW4pCisKKyAgICAgICAgIyBjaGVjayBzdGF0ZSBpcyBub3QgbXVja2VkIHVwCisgICAgICAgIHNlbGYuY2hlY2tfaW52YXJpYW50KGNvbmQpCisKKyAgICBkZWYgdGVzdF90aW1lb3V0KHNlbGYpOgorICAgICAgICBjb25kID0gc2VsZi5Db25kaXRpb24oKQorICAgICAgICB3YWl0ID0gVGltaW5nV3JhcHBlcihjb25kLndhaXQpCisgICAgICAgIGNvbmQuYWNxdWlyZSgpCisgICAgICAgIHJlcyA9IHdhaXQoVElNRU9VVDEpCisgICAgICAgIGNvbmQucmVsZWFzZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHdhaXQuZWxhcHNlZCwgVElNRU9VVDEpCisKKworY2xhc3MgX1Rlc3RFdmVudChCYXNlVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF90ZXN0X2V2ZW50KGNscywgZXZlbnQpOgorICAgICAgICB0aW1lLnNsZWVwKFRJTUVPVVQyKQorICAgICAgICBldmVudC5zZXQoKQorCisgICAgZGVmIHRlc3RfZXZlbnQoc2VsZik6CisgICAgICAgIGV2ZW50ID0gc2VsZi5FdmVudCgpCisgICAgICAgIHdhaXQgPSBUaW1pbmdXcmFwcGVyKGV2ZW50LndhaXQpCisKKyAgICAgICAgIyBSZW1vdmVkIHRlbXBvcmFyaWx5LCBkdWUgdG8gQVBJIHNoZWFyLCB0aGlzIGRvZXMgbm90CisgICAgICAgICMgd29yayB3aXRoIHRocmVhZGluZy5fRXZlbnQgb2JqZWN0cy4gaXNfc2V0ID09IGlzU2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnQuaXNfc2V0KCksIEZhbHNlKQorCisgICAgICAgICMgUmVtb3ZlZCwgdGhyZWFkaW5nLkV2ZW50LndhaXQoKSB3aWxsIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIF9fZmxhZworICAgICAgICAjIGluc3RlYWQgb2YgTm9uZS4gQVBJIFNoZWFyIHdpdGggdGhlIHNlbWFwaG9yZSBiYWNrZWQgbXAuRXZlbnQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3YWl0KDAuMCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHdhaXQuZWxhcHNlZCwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhaXQoVElNRU9VVDEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbCh3YWl0LmVsYXBzZWQsIFRJTUVPVVQxKQorCisgICAgICAgIGV2ZW50LnNldCgpCisKKyAgICAgICAgIyBTZWUgbm90ZSBhYm92ZSBvbiB0aGUgQVBJIGRpZmZlcmVuY2VzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnQuaXNfc2V0KCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FpdCgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHdhaXQuZWxhcHNlZCwgMC4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhaXQoVElNRU9VVDEpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHdhaXQuZWxhcHNlZCwgMC4wKQorICAgICAgICAjIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnQuaXNfc2V0KCksIFRydWUpCisKKyAgICAgICAgZXZlbnQuY2xlYXIoKQorCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKGV2ZW50LmlzX3NldCgpLCBGYWxzZSkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X2V2ZW50LCBhcmdzPShldmVudCwpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2FpdCgpLCBUcnVlKQorCisjCisjCisjCisKK2NsYXNzIF9UZXN0VmFsdWUoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgY29kZXNfdmFsdWVzID0gWworICAgICAgICAoJ2knLCA0MzQzLCAyNDIzNCksCisgICAgICAgICgnZCcsIDMuNjI1LCAtNC4yNSksCisgICAgICAgICgnaCcsIC0yMzIsIDIzNCksCisgICAgICAgICgnYycsIGxhdGluKCd4JyksIGxhdGluKCd5JykpCisgICAgICAgIF0KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgbm90IEhBU19TSEFSRURDVFlQRVM6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJyZXF1aXJlcyBtdWx0aXByb2Nlc3Npbmcuc2hhcmVkY3R5cGVzIikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdChjbHMsIHZhbHVlcyk6CisgICAgICAgIGZvciBzdiwgY3YgaW4gemlwKHZhbHVlcywgY2xzLmNvZGVzX3ZhbHVlcyk6CisgICAgICAgICAgICBzdi52YWx1ZSA9IGN2WzJdCisKKworICAgIGRlZiB0ZXN0X3ZhbHVlKHNlbGYsIHJhdz1GYWxzZSk6CisgICAgICAgIGlmIHJhdzoKKyAgICAgICAgICAgIHZhbHVlcyA9IFtzZWxmLlJhd1ZhbHVlKGNvZGUsIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgIGZvciBjb2RlLCB2YWx1ZSwgXyBpbiBzZWxmLmNvZGVzX3ZhbHVlc10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHZhbHVlcyA9IFtzZWxmLlZhbHVlKGNvZGUsIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgIGZvciBjb2RlLCB2YWx1ZSwgXyBpbiBzZWxmLmNvZGVzX3ZhbHVlc10KKworICAgICAgICBmb3Igc3YsIGN2IGluIHppcCh2YWx1ZXMsIHNlbGYuY29kZXNfdmFsdWVzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3YudmFsdWUsIGN2WzFdKQorCisgICAgICAgIHByb2MgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3QsIGFyZ3M9KHZhbHVlcywpKQorICAgICAgICBwcm9jLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcHJvYy5zdGFydCgpCisgICAgICAgIHByb2Muam9pbigpCisKKyAgICAgICAgZm9yIHN2LCBjdiBpbiB6aXAodmFsdWVzLCBzZWxmLmNvZGVzX3ZhbHVlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN2LnZhbHVlLCBjdlsyXSkKKworICAgIGRlZiB0ZXN0X3Jhd3ZhbHVlKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfdmFsdWUocmF3PVRydWUpCisKKyAgICBkZWYgdGVzdF9nZXRvYmpfZ2V0bG9jayhzZWxmKToKKyAgICAgICAgdmFsMSA9IHNlbGYuVmFsdWUoJ2knLCA1KQorICAgICAgICBsb2NrMSA9IHZhbDEuZ2V0X2xvY2soKQorICAgICAgICBvYmoxID0gdmFsMS5nZXRfb2JqKCkKKworICAgICAgICB2YWwyID0gc2VsZi5WYWx1ZSgnaScsIDUsIGxvY2s9Tm9uZSkKKyAgICAgICAgbG9jazIgPSB2YWwyLmdldF9sb2NrKCkKKyAgICAgICAgb2JqMiA9IHZhbDIuZ2V0X29iaigpCisKKyAgICAgICAgbG9jayA9IHNlbGYuTG9jaygpCisgICAgICAgIHZhbDMgPSBzZWxmLlZhbHVlKCdpJywgNSwgbG9jaz1sb2NrKQorICAgICAgICBsb2NrMyA9IHZhbDMuZ2V0X2xvY2soKQorICAgICAgICBvYmozID0gdmFsMy5nZXRfb2JqKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLCBsb2NrMykKKworICAgICAgICBhcnI0ID0gc2VsZi5WYWx1ZSgnaScsIDUsIGxvY2s9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhcnI0LCAnZ2V0X2xvY2snKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGFycjQsICdnZXRfb2JqJykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNlbGYuVmFsdWUsICdpJywgNSwgbG9jaz0nbmF2YWx1ZScpCisKKyAgICAgICAgYXJyNSA9IHNlbGYuUmF3VmFsdWUoJ2knLCA1KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYXJyNSwgJ2dldF9sb2NrJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhcnI1LCAnZ2V0X29iaicpKQorCisKK2NsYXNzIF9UZXN0QXJyYXkoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGYoY2xzLCBzZXEpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oc2VxKSk6CisgICAgICAgICAgICBzZXFbaV0gKz0gc2VxW2ktMV0KKworICAgIEB1bml0dGVzdC5za2lwSWYoY19pbnQgaXMgTm9uZSwgInJlcXVpcmVzIF9jdHlwZXMiKQorICAgIGRlZiB0ZXN0X2FycmF5KHNlbGYsIHJhdz1GYWxzZSk6CisgICAgICAgIHNlcSA9IFs2ODAsIDYyNiwgOTM0LCA4MjEsIDE1MCwgMjMzLCA1NDgsIDk4MiwgNzE0LCA4MzFdCisgICAgICAgIGlmIHJhdzoKKyAgICAgICAgICAgIGFyciA9IHNlbGYuUmF3QXJyYXkoJ2knLCBzZXEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcnIgPSBzZWxmLkFycmF5KCdpJywgc2VxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFyciksIGxlbihzZXEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyclszXSwgc2VxWzNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYXJyWzI6N10pLCBsaXN0KHNlcVsyOjddKSkKKworICAgICAgICBhcnJbNDo4XSA9IHNlcVs0OjhdID0gYXJyYXkuYXJyYXkoJ2knLCBbMSwgMiwgMywgNF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFycls6XSksIHNlcSkKKworICAgICAgICBzZWxmLmYoc2VxKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuZiwgYXJncz0oYXJyLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgcC5qb2luKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYXJyWzpdKSwgc2VxKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihjX2ludCBpcyBOb25lLCAicmVxdWlyZXMgX2N0eXBlcyIpCisgICAgZGVmIHRlc3RfYXJyYXlfZnJvbV9zaXplKHNlbGYpOgorICAgICAgICBzaXplID0gMTAKKyAgICAgICAgIyBUZXN0IGZvciB6ZXJvaW5nIChzZWUgaXNzdWUgIzExNjc1KS4KKyAgICAgICAgIyBUaGUgcmVwZXRpdGlvbiBiZWxvdyBzdHJlbmd0aGVucyB0aGUgdGVzdCBieSBpbmNyZWFzaW5nIHRoZSBjaGFuY2VzCisgICAgICAgICMgb2YgcHJldmlvdXNseSBhbGxvY2F0ZWQgbm9uLXplcm8gbWVtb3J5IGJlaW5nIHVzZWQgZm9yIHRoZSBuZXcgYXJyYXkKKyAgICAgICAgIyBvbiB0aGUgMm5kIGFuZCAzcmQgbG9vcHMuCisgICAgICAgIGZvciBfIGluIHJhbmdlKDMpOgorICAgICAgICAgICAgYXJyID0gc2VsZi5BcnJheSgnaScsIHNpemUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcnIpLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGFyciksIFswXSAqIHNpemUpCisgICAgICAgICAgICBhcnJbOl0gPSByYW5nZSgxMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChhcnIpLCByYW5nZSgxMCkpCisgICAgICAgICAgICBkZWwgYXJyCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKGNfaW50IGlzIE5vbmUsICJyZXF1aXJlcyBfY3R5cGVzIikKKyAgICBkZWYgdGVzdF9yYXdhcnJheShzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2FycmF5KHJhdz1UcnVlKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihjX2ludCBpcyBOb25lLCAicmVxdWlyZXMgX2N0eXBlcyIpCisgICAgZGVmIHRlc3RfYXJyYXlfYWNjZXB0c19sb25nKHNlbGYpOgorICAgICAgICBhcnIgPSBzZWxmLkFycmF5KCdpJywgMTBMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcnIpLCAxMCkKKyAgICAgICAgcmF3X2FyciA9IHNlbGYuUmF3QXJyYXkoJ2knLCAxMEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJhd19hcnIpLCAxMCkKKworICAgIEB1bml0dGVzdC5za2lwSWYoY19pbnQgaXMgTm9uZSwgInJlcXVpcmVzIF9jdHlwZXMiKQorICAgIGRlZiB0ZXN0X2dldG9ial9nZXRsb2NrX29iaihzZWxmKToKKyAgICAgICAgYXJyMSA9IHNlbGYuQXJyYXkoJ2knLCByYW5nZSgxMCkpCisgICAgICAgIGxvY2sxID0gYXJyMS5nZXRfbG9jaygpCisgICAgICAgIG9iajEgPSBhcnIxLmdldF9vYmooKQorCisgICAgICAgIGFycjIgPSBzZWxmLkFycmF5KCdpJywgcmFuZ2UoMTApLCBsb2NrPU5vbmUpCisgICAgICAgIGxvY2syID0gYXJyMi5nZXRfbG9jaygpCisgICAgICAgIG9iajIgPSBhcnIyLmdldF9vYmooKQorCisgICAgICAgIGxvY2sgPSBzZWxmLkxvY2soKQorICAgICAgICBhcnIzID0gc2VsZi5BcnJheSgnaScsIHJhbmdlKDEwKSwgbG9jaz1sb2NrKQorICAgICAgICBsb2NrMyA9IGFycjMuZ2V0X2xvY2soKQorICAgICAgICBvYmozID0gYXJyMy5nZXRfb2JqKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2NrLCBsb2NrMykKKworICAgICAgICBhcnI0ID0gc2VsZi5BcnJheSgnaScsIHJhbmdlKDEwKSwgbG9jaz1GYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGFycjQsICdnZXRfbG9jaycpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoYXJyNCwgJ2dldF9vYmonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuQXJyYXksICdpJywgcmFuZ2UoMTApLCBsb2NrPSdub3RhbG9jaycpCisKKyAgICAgICAgYXJyNSA9IHNlbGYuUmF3QXJyYXkoJ2knLCByYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhcnI1LCAnZ2V0X2xvY2snKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGFycjUsICdnZXRfb2JqJykpCisKKyMKKyMKKyMKKworY2xhc3MgX1Rlc3RDb250YWluZXJzKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdtYW5hZ2VyJywpCisKKyAgICBkZWYgdGVzdF9saXN0KHNlbGYpOgorICAgICAgICBhID0gc2VsZi5saXN0KHJhbmdlKDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCByYW5nZSgxMCkpCisKKyAgICAgICAgYiA9IHNlbGYubGlzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgW10pCisKKyAgICAgICAgYi5leHRlbmQocmFuZ2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgcmFuZ2UoNSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzJdLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMjoxMF0sIFsyLDMsNF0pCisKKyAgICAgICAgYiAqPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgWzAsIDEsIDIsIDMsIDQsIDAsIDEsIDIsIDMsIDRdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYiArIFs1LCA2XSwgWzAsIDEsIDIsIDMsIDQsIDAsIDEsIDIsIDMsIDQsIDUsIDZdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6XSwgcmFuZ2UoMTApKQorCisgICAgICAgIGQgPSBbYSwgYl0KKyAgICAgICAgZSA9IHNlbGYubGlzdChkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgZVs6XSwKKyAgICAgICAgICAgIFtbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0sIFswLCAxLCAyLCAzLCA0LCAwLCAxLCAyLCAzLCA0XV0KKyAgICAgICAgICAgICkKKworICAgICAgICBmID0gc2VsZi5saXN0KFthXSkKKyAgICAgICAgYS5hcHBlbmQoJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmWzpdLCBbWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksICdoZWxsbyddXSkKKworICAgIGRlZiB0ZXN0X2RpY3Qoc2VsZik6CisgICAgICAgIGQgPSBzZWxmLmRpY3QoKQorICAgICAgICBpbmRpY2VzID0gcmFuZ2UoNjUsIDcwKQorICAgICAgICBmb3IgaSBpbiBpbmRpY2VzOgorICAgICAgICAgICAgZFtpXSA9IGNocihpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuY29weSgpLCBkaWN0KChpLCBjaHIoaSkpIGZvciBpIGluIGluZGljZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChkLmtleXMoKSksIGluZGljZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGQudmFsdWVzKCkpLCBbY2hyKGkpIGZvciBpIGluIGluZGljZXNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChkLml0ZW1zKCkpLCBbKGksIGNocihpKSkgZm9yIGkgaW4gaW5kaWNlc10pCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIG4gPSBzZWxmLk5hbWVzcGFjZSgpCisgICAgICAgIG4ubmFtZSA9ICdCb2InCisgICAgICAgIG4uam9iID0gJ0J1aWxkZXInCisgICAgICAgIG4uX2hpZGRlbiA9ICdoaWRkZW4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG4ubmFtZSwgbi5qb2IpLCAoJ0JvYicsICdCdWlsZGVyJykpCisgICAgICAgIGRlbCBuLmpvYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihuKSwgIk5hbWVzcGFjZShuYW1lPSdCb2InKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG4sICduYW1lJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihuLCAnam9iJykpCisKKyMKKyMKKyMKKworZGVmIHNxcih4LCB3YWl0PTAuMCk6CisgICAgdGltZS5zbGVlcCh3YWl0KQorICAgIHJldHVybiB4KngKK2NsYXNzIF9UZXN0UG9vbChCYXNlVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYXBwbHkoc2VsZik6CisgICAgICAgIHBhcHBseSA9IHNlbGYucG9vbC5hcHBseQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcHBseShzcXIsICg1LCkpLCBzcXIoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFwcGx5KHNxciwgKCksIHsneCc6M30pLCBzcXIoeD0zKSkKKworICAgIGRlZiB0ZXN0X21hcChzZWxmKToKKyAgICAgICAgcG1hcCA9IHNlbGYucG9vbC5tYXAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbWFwKHNxciwgcmFuZ2UoMTApKSwgbWFwKHNxciwgcmFuZ2UoMTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbWFwKHNxciwgcmFuZ2UoMTAwKSwgY2h1bmtzaXplPTIwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXAoc3FyLCByYW5nZSgxMDApKSkKKworICAgIGRlZiB0ZXN0X21hcF9jaHVua3NpemUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucG9vbC5tYXBfYXN5bmMoc3FyLCBbXSwgY2h1bmtzaXplPTEpLmdldCh0aW1lb3V0PVRJTUVPVVQxKQorICAgICAgICBleGNlcHQgbXVsdGlwcm9jZXNzaW5nLlRpbWVvdXRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicG9vbC5tYXBfYXN5bmMgd2l0aCBjaHVua3NpemUgc3RhbGxlZCBvbiBudWxsIGxpc3QiKQorCisgICAgZGVmIHRlc3RfYXN5bmMoc2VsZik6CisgICAgICAgIHJlcyA9IHNlbGYucG9vbC5hcHBseV9hc3luYyhzcXIsICg3LCBUSU1FT1VUMSwpKQorICAgICAgICBnZXQgPSBUaW1pbmdXcmFwcGVyKHJlcy5nZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0KCksIDQ5KQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGdldC5lbGFwc2VkLCBUSU1FT1VUMSkKKworICAgIGRlZiB0ZXN0X2FzeW5jX3RpbWVvdXQoc2VsZik6CisgICAgICAgIHJlcyA9IHNlbGYucG9vbC5hcHBseV9hc3luYyhzcXIsICg2LCBUSU1FT1VUMiArIDAuMikpCisgICAgICAgIGdldCA9IFRpbWluZ1dyYXBwZXIocmVzLmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMobXVsdGlwcm9jZXNzaW5nLlRpbWVvdXRFcnJvciwgZ2V0LCB0aW1lb3V0PVRJTUVPVVQyKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKGdldC5lbGFwc2VkLCBUSU1FT1VUMikKKworICAgIGRlZiB0ZXN0X2ltYXAoc2VsZik6CisgICAgICAgIGl0ID0gc2VsZi5wb29sLmltYXAoc3FyLCByYW5nZSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChpdCksIG1hcChzcXIsIHJhbmdlKDEwKSkpCisKKyAgICAgICAgaXQgPSBzZWxmLnBvb2wuaW1hcChzcXIsIHJhbmdlKDEwKSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdC5uZXh0KCksIGkqaSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgaXQubmV4dCkKKworICAgICAgICBpdCA9IHNlbGYucG9vbC5pbWFwKHNxciwgcmFuZ2UoMTAwMCksIGNodW5rc2l6ZT0xMDApCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMDApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdC5uZXh0KCksIGkqaSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgaXQubmV4dCkKKworICAgIGRlZiB0ZXN0X2ltYXBfdW5vcmRlcmVkKHNlbGYpOgorICAgICAgICBpdCA9IHNlbGYucG9vbC5pbWFwX3Vub3JkZXJlZChzcXIsIHJhbmdlKDEwMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChpdCksIG1hcChzcXIsIHJhbmdlKDEwMDApKSkKKworICAgICAgICBpdCA9IHNlbGYucG9vbC5pbWFwX3Vub3JkZXJlZChzcXIsIHJhbmdlKDEwMDApLCBjaHVua3NpemU9NTMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGl0KSwgbWFwKHNxciwgcmFuZ2UoMTAwMCkpKQorCisgICAgZGVmIHRlc3RfbWFrZV9wb29sKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtdWx0aXByb2Nlc3NpbmcuUG9vbCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG11bHRpcHJvY2Vzc2luZy5Qb29sLCAwKQorCisgICAgICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbCgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwLl9wb29sKSkKKyAgICAgICAgcC5jbG9zZSgpCisgICAgICAgIHAuam9pbigpCisKKyAgICBkZWYgdGVzdF90ZXJtaW5hdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAnbWFuYWdlcic6CisgICAgICAgICAgICAjIE9uIFVuaXggYSBmb3JrZWQgcHJvY2VzcyBpbmNyZWZzIGVhY2ggc2hhcmVkIG9iamVjdCB0bworICAgICAgICAgICAgIyB3aGljaCBpdHMgcGFyZW50IHByb2Nlc3MgaGVsZCBhIHJlZmVyZW5jZS4gIElmIHRoZQorICAgICAgICAgICAgIyBmb3JrZWQgcHJvY2VzcyBnZXRzIHRlcm1pbmF0ZWQgdGhlbiB0aGVyZSBpcyBsaWtlbHkgdG8KKyAgICAgICAgICAgICMgYmUgYSByZWZlcmVuY2UgbGVhay4gIFNvIHRvIHByZXZlbnQKKyAgICAgICAgICAgICMgX1Rlc3RaWlpOdW1iZXJPZk9iamVjdHMgZnJvbSBmYWlsaW5nIHdlIHNraXAgdGhpcyB0ZXN0CisgICAgICAgICAgICAjIHdoZW4gdXNpbmcgYSBtYW5hZ2VyLgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5wb29sLm1hcF9hc3luYygKKyAgICAgICAgICAgIHRpbWUuc2xlZXAsIFswLjEgZm9yIGkgaW4gcmFuZ2UoMTAwMDApXSwgY2h1bmtzaXplPTEKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5wb29sLnRlcm1pbmF0ZSgpCisgICAgICAgIGpvaW4gPSBUaW1pbmdXcmFwcGVyKHNlbGYucG9vbC5qb2luKQorICAgICAgICBqb2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGpvaW4uZWxhcHNlZCA8IDAuMikKKworICAgIGRlZiB0ZXN0X2VtcHR5X2l0ZXJhYmxlKHNlbGYpOgorICAgICAgICAjIFNlZSBJc3N1ZSAxMjE1NworICAgICAgICBwID0gc2VsZi5Qb29sKDEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm1hcChzcXIsIFtdKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwLmltYXAoc3FyLCBbXSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHAuaW1hcF91bm9yZGVyZWQoc3FyLCBbXSkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm1hcF9hc3luYyhzcXIsIFtdKS5nZXQoKSwgW10pCisKKyAgICAgICAgcC5jbG9zZSgpCisgICAgICAgIHAuam9pbigpCisKK2RlZiB1bnBpY2tsZWFibGVfcmVzdWx0KCk6CisgICAgcmV0dXJuIGxhbWJkYTogNDIKKworY2xhc3MgX1Rlc3RQb29sV29ya2VyRXJyb3JzKEJhc2VUZXN0Q2FzZSk6CisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywgKQorCisgICAgZGVmIHRlc3RfdW5waWNrbGVhYmxlX3Jlc3VsdChzZWxmKToKKyAgICAgICAgZnJvbSBtdWx0aXByb2Nlc3NpbmcucG9vbCBpbXBvcnQgTWF5YmVFbmNvZGluZ0Vycm9yCisgICAgICAgIHAgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbCgyKQorCisgICAgICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IGxvc2UgcG9vbCBwcm9jZXNzZXMgYmVjYXVzZSBvZiBlbmNvZGluZyBlcnJvcnMuCisgICAgICAgIGZvciBpdGVyYXRpb24gaW4gcmFuZ2UoMjApOgorICAgICAgICAgICAgcmVzID0gcC5hcHBseV9hc3luYyh1bnBpY2tsZWFibGVfcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWF5YmVFbmNvZGluZ0Vycm9yLCByZXMuZ2V0KQorCisgICAgICAgIHAuY2xvc2UoKQorICAgICAgICBwLmpvaW4oKQorCitjbGFzcyBfVGVzdFBvb2xXb3JrZXJMaWZldGltZShCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywgKQorICAgIGRlZiB0ZXN0X3Bvb2xfd29ya2VyX2xpZmV0aW1lKHNlbGYpOgorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlBvb2woMywgbWF4dGFza3NwZXJjaGlsZD0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ocC5fcG9vbCkpCisgICAgICAgIG9yaWd3b3JrZXJwaWRzID0gW3cucGlkIGZvciB3IGluIHAuX3Bvb2xdCisgICAgICAgICMgUnVuIG1hbnkgdGFza3Mgc28gZWFjaCB3b3JrZXIgZ2V0cyByZXBsYWNlZCAoaG9wZWZ1bGx5KQorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwKToKKyAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKHAuYXBwbHlfYXN5bmMoc3FyLCAoaSwgKSkpCisgICAgICAgICMgRmV0Y2ggdGhlIHJlc3VsdHMgYW5kIHZlcmlmeSB3ZSBnb3QgdGhlIHJpZ2h0IGFuc3dlcnMsCisgICAgICAgICMgYWxzbyBlbnN1cmluZyBhbGwgdGhlIHRhc2tzIGhhdmUgY29tcGxldGVkLgorICAgICAgICBmb3IgKGosIHJlcykgaW4gZW51bWVyYXRlKHJlc3VsdHMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuZ2V0KCksIHNxcihqKSkKKyAgICAgICAgIyBSZWZpbGwgdGhlIHBvb2wKKyAgICAgICAgcC5fcmVwb3B1bGF0ZV9wb29sKCkKKyAgICAgICAgIyBXYWl0IHVudGlsIGFsbCB3b3JrZXJzIGFyZSBhbGl2ZQorICAgICAgICAjIChjb3VudGRvd24gKiBERUxUQSA9IDUgc2Vjb25kcyBtYXggc3RhcnR1cCBwcm9jZXNzIHRpbWUpCisgICAgICAgIGNvdW50ZG93biA9IDUwCisgICAgICAgIHdoaWxlIGNvdW50ZG93biBhbmQgbm90IGFsbCh3LmlzX2FsaXZlKCkgZm9yIHcgaW4gcC5fcG9vbCk6CisgICAgICAgICAgICBjb3VudGRvd24gLT0gMQorICAgICAgICAgICAgdGltZS5zbGVlcChERUxUQSkKKyAgICAgICAgZmluYWx3b3JrZXJwaWRzID0gW3cucGlkIGZvciB3IGluIHAuX3Bvb2xdCisgICAgICAgICMgQWxsIHBpZHMgc2hvdWxkIGJlIGFzc2lnbmVkLiAgU2VlIGlzc3VlICM3ODA1LgorICAgICAgICBzZWxmLmFzc2VydE5vdEluKE5vbmUsIG9yaWd3b3JrZXJwaWRzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKE5vbmUsIGZpbmFsd29ya2VycGlkcykKKyAgICAgICAgIyBGaW5hbGx5LCBjaGVjayB0aGF0IHRoZSB3b3JrZXIgcGlkcyBoYXZlIGNoYW5nZWQKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzb3J0ZWQob3JpZ3dvcmtlcnBpZHMpLCBzb3J0ZWQoZmluYWx3b3JrZXJwaWRzKSkKKyAgICAgICAgcC5jbG9zZSgpCisgICAgICAgIHAuam9pbigpCisKKyAgICBkZWYgdGVzdF9wb29sX3dvcmtlcl9saWZldGltZV9lYXJseV9jbG9zZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTAzMzI6IGNsb3NpbmcgYSBwb29sIHdob3NlIHdvcmtlcnMgaGF2ZSBsaW1pdGVkIGxpZmV0aW1lcworICAgICAgICAjIGJlZm9yZSBhbGwgdGhlIHRhc2tzIGNvbXBsZXRlZCB3b3VsZCBtYWtlIGpvaW4oKSBoYW5nLgorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlBvb2woMywgbWF4dGFza3NwZXJjaGlsZD0xKQorICAgICAgICByZXN1bHRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNik6CisgICAgICAgICAgICByZXN1bHRzLmFwcGVuZChwLmFwcGx5X2FzeW5jKHNxciwgKGksIDAuMykpKQorICAgICAgICBwLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKyAgICAgICAgIyBjaGVjayB0aGUgcmVzdWx0cworICAgICAgICBmb3IgKGosIHJlcykgaW4gZW51bWVyYXRlKHJlc3VsdHMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuZ2V0KCksIHNxcihqKSkKKworCisjCisjIFRlc3QgdGhhdCBtYW5hZ2VyIGhhcyBleHBlY3RlZCBudW1iZXIgb2Ygc2hhcmVkIG9iamVjdHMgbGVmdAorIworCitjbGFzcyBfVGVzdFpaWk51bWJlck9mT2JqZWN0cyhCYXNlVGVzdENhc2UpOgorICAgICMgQmVjYXVzZSB0ZXN0IGNhc2VzIGFyZSBzb3J0ZWQgYWxwaGFiZXRpY2FsbHksIHRoaXMgb25lIHdpbGwgZ2V0CisgICAgIyBydW4gYWZ0ZXIgYWxsIHRoZSBvdGhlciB0ZXN0cyBmb3IgdGhlIG1hbmFnZXIuICBJdCB0ZXN0cyB0aGF0CisgICAgIyB0aGVyZSBoYXZlIGJlZW4gbm8gInJlZmVyZW5jZSBsZWFrcyIgZm9yIHRoZSBtYW5hZ2VyJ3Mgc2hhcmVkCisgICAgIyBvYmplY3RzLiAgTm90ZSB0aGUgY29tbWVudCBpbiBfVGVzdFBvb2wudGVzdF90ZXJtaW5hdGUoKS4KKyAgICBBTExPV0VEX1RZUEVTID0gKCdtYW5hZ2VyJywpCisKKyAgICBkZWYgdGVzdF9udW1iZXJfb2Zfb2JqZWN0cyhzZWxmKToKKyAgICAgICAgRVhQRUNURURfTlVNQkVSID0gMSAgICAgICAgICAgICAgICAjIHRoZSBwb29sIG9iamVjdCBpcyBzdGlsbCBhbGl2ZQorICAgICAgICBtdWx0aXByb2Nlc3NpbmcuYWN0aXZlX2NoaWxkcmVuKCkgICMgZGlzY2FyZCBkZWFkIHByb2Nlc3Mgb2JqcworICAgICAgICBnYy5jb2xsZWN0KCkgICAgICAgICAgICAgICAgICAgICAgICMgZG8gZ2FyYmFnZSBjb2xsZWN0aW9uCisgICAgICAgIHJlZnMgPSBzZWxmLm1hbmFnZXIuX251bWJlcl9vZl9vYmplY3RzKCkKKyAgICAgICAgZGVidWdfaW5mbyA9IHNlbGYubWFuYWdlci5fZGVidWdfaW5mbygpCisgICAgICAgIGlmIHJlZnMgIT0gRVhQRUNURURfTlVNQkVSOgorICAgICAgICAgICAgcHJpbnQgc2VsZi5tYW5hZ2VyLl9kZWJ1Z19pbmZvKCkKKyAgICAgICAgICAgIHByaW50IGRlYnVnX2luZm8KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZnMsIEVYUEVDVEVEX05VTUJFUikKKworIworIyBUZXN0IG9mIGNyZWF0aW5nIGEgY3VzdG9taXplZCBtYW5hZ2VyIGNsYXNzCisjCisKK2Zyb20gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzIGltcG9ydCBCYXNlTWFuYWdlciwgQmFzZVByb3h5LCBSZW1vdGVFcnJvcgorCitjbGFzcyBGb29CYXIob2JqZWN0KToKKyAgICBkZWYgZihzZWxmKToKKyAgICAgICAgcmV0dXJuICdmKCknCisgICAgZGVmIGcoc2VsZik6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICBkZWYgX2goc2VsZik6CisgICAgICAgIHJldHVybiAnX2goKScKKworZGVmIGJheigpOgorICAgIGZvciBpIGluIHhyYW5nZSgxMCk6CisgICAgICAgIHlpZWxkIGkqaQorCitjbGFzcyBJdGVyYXRvclByb3h5KEJhc2VQcm94eSk6CisgICAgX2V4cG9zZWRfID0gKCduZXh0JywgJ19fbmV4dF9fJykKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCduZXh0JykKKyAgICBkZWYgX19uZXh0X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jYWxsbWV0aG9kKCdfX25leHRfXycpCisKK2NsYXNzIE15TWFuYWdlcihCYXNlTWFuYWdlcik6CisgICAgcGFzcworCitNeU1hbmFnZXIucmVnaXN0ZXIoJ0ZvbycsIGNhbGxhYmxlPUZvb0JhcikKK015TWFuYWdlci5yZWdpc3RlcignQmFyJywgY2FsbGFibGU9Rm9vQmFyLCBleHBvc2VkPSgnZicsICdfaCcpKQorTXlNYW5hZ2VyLnJlZ2lzdGVyKCdiYXonLCBjYWxsYWJsZT1iYXosIHByb3h5dHlwZT1JdGVyYXRvclByb3h5KQorCisKK2NsYXNzIF9UZXN0TXlNYW5hZ2VyKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdtYW5hZ2VyJywpCisKKyAgICBkZWYgdGVzdF9teW1hbmFnZXIoc2VsZik6CisgICAgICAgIG1hbmFnZXIgPSBNeU1hbmFnZXIoKQorICAgICAgICBtYW5hZ2VyLnN0YXJ0KCkKKworICAgICAgICBmb28gPSBtYW5hZ2VyLkZvbygpCisgICAgICAgIGJhciA9IG1hbmFnZXIuQmFyKCkKKyAgICAgICAgYmF6ID0gbWFuYWdlci5iYXooKQorCisgICAgICAgIGZvb19tZXRob2RzID0gW25hbWUgZm9yIG5hbWUgaW4gKCdmJywgJ2cnLCAnX2gnKSBpZiBoYXNhdHRyKGZvbywgbmFtZSldCisgICAgICAgIGJhcl9tZXRob2RzID0gW25hbWUgZm9yIG5hbWUgaW4gKCdmJywgJ2cnLCAnX2gnKSBpZiBoYXNhdHRyKGJhciwgbmFtZSldCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb29fbWV0aG9kcywgWydmJywgJ2cnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXJfbWV0aG9kcywgWydmJywgJ19oJ10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uZigpLCAnZigpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9vLmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLl9jYWxsbWV0aG9kKCdmJyksICdmKCknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSZW1vdGVFcnJvciwgZm9vLl9jYWxsbWV0aG9kLCAnX2gnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFyLmYoKSwgJ2YoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFyLl9oKCksICdfaCgpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXIuX2NhbGxtZXRob2QoJ2YnKSwgJ2YoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFyLl9jYWxsbWV0aG9kKCdfaCcpLCAnX2goKScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGJheiksIFtpKmkgZm9yIGkgaW4gcmFuZ2UoMTApXSkKKworICAgICAgICBtYW5hZ2VyLnNodXRkb3duKCkKKworIworIyBUZXN0IG9mIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgc2VydmVyIGFuZCB1c2luZyB4bWxycGNsaWIgZm9yIHNlcmlhbGl6YXRpb24KKyMKKworX3F1ZXVlID0gUXVldWUuUXVldWUoKQorZGVmIGdldF9xdWV1ZSgpOgorICAgIHJldHVybiBfcXVldWUKKworY2xhc3MgUXVldWVNYW5hZ2VyKEJhc2VNYW5hZ2VyKToKKyAgICAnJydtYW5hZ2VyIGNsYXNzIHVzZWQgYnkgc2VydmVyIHByb2Nlc3MnJycKK1F1ZXVlTWFuYWdlci5yZWdpc3RlcignZ2V0X3F1ZXVlJywgY2FsbGFibGU9Z2V0X3F1ZXVlKQorCitjbGFzcyBRdWV1ZU1hbmFnZXIyKEJhc2VNYW5hZ2VyKToKKyAgICAnJydtYW5hZ2VyIGNsYXNzIHdoaWNoIHNwZWNpZmllcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgUXVldWVNYW5hZ2VyJycnCitRdWV1ZU1hbmFnZXIyLnJlZ2lzdGVyKCdnZXRfcXVldWUnKQorCisKK1NFUklBTElaRVIgPSAneG1scnBjbGliJworCitjbGFzcyBfVGVzdFJlbW90ZU1hbmFnZXIoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ21hbmFnZXInLCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfcHV0dGVyKGNscywgYWRkcmVzcywgYXV0aGtleSk6CisgICAgICAgIG1hbmFnZXIgPSBRdWV1ZU1hbmFnZXIyKAorICAgICAgICAgICAgYWRkcmVzcz1hZGRyZXNzLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUgorICAgICAgICAgICAgKQorICAgICAgICBtYW5hZ2VyLmNvbm5lY3QoKQorICAgICAgICBxdWV1ZSA9IG1hbmFnZXIuZ2V0X3F1ZXVlKCkKKyAgICAgICAgcXVldWUucHV0KCgnaGVsbG8gd29ybGQnLCBOb25lLCBUcnVlLCAyLjI1KSkKKworICAgIGRlZiB0ZXN0X3JlbW90ZShzZWxmKToKKyAgICAgICAgYXV0aGtleSA9IG9zLnVyYW5kb20oMzIpCisKKyAgICAgICAgbWFuYWdlciA9IFF1ZXVlTWFuYWdlcigKKyAgICAgICAgICAgIGFkZHJlc3M9KCdsb2NhbGhvc3QnLCAwKSwgYXV0aGtleT1hdXRoa2V5LCBzZXJpYWxpemVyPVNFUklBTElaRVIKKyAgICAgICAgICAgICkKKyAgICAgICAgbWFuYWdlci5zdGFydCgpCisKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fcHV0dGVyLCBhcmdzPShtYW5hZ2VyLmFkZHJlc3MsIGF1dGhrZXkpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisKKyAgICAgICAgbWFuYWdlcjIgPSBRdWV1ZU1hbmFnZXIyKAorICAgICAgICAgICAgYWRkcmVzcz1tYW5hZ2VyLmFkZHJlc3MsIGF1dGhrZXk9YXV0aGtleSwgc2VyaWFsaXplcj1TRVJJQUxJWkVSCisgICAgICAgICAgICApCisgICAgICAgIG1hbmFnZXIyLmNvbm5lY3QoKQorICAgICAgICBxdWV1ZSA9IG1hbmFnZXIyLmdldF9xdWV1ZSgpCisKKyAgICAgICAgIyBOb3RlIHRoYXQgeG1scnBjbGliIHdpbGwgZGVzZXJpYWxpemUgb2JqZWN0IGFzIGEgbGlzdCBub3QgYSB0dXBsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1ZXVlLmdldCgpLCBbJ2hlbGxvIHdvcmxkJywgTm9uZSwgVHJ1ZSwgMi4yNV0pCisKKyAgICAgICAgIyBCZWNhdXNlIHdlIGFyZSB1c2luZyB4bWxycGNsaWIgZm9yIHNlcmlhbGl6YXRpb24gaW5zdGVhZCBvZgorICAgICAgICAjIHBpY2tsZSB0aGlzIHdpbGwgY2F1c2UgYSBzZXJpYWxpemF0aW9uIGVycm9yLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIHF1ZXVlLnB1dCwgdGltZS5zbGVlcCkKKworICAgICAgICAjIE1ha2UgcXVldWUgZmluYWxpemVyIHJ1biBiZWZvcmUgdGhlIHNlcnZlciBpcyBzdG9wcGVkCisgICAgICAgIGRlbCBxdWV1ZQorICAgICAgICBtYW5hZ2VyLnNodXRkb3duKCkKKworY2xhc3MgX1Rlc3RNYW5hZ2VyUmVzdGFydChCYXNlVGVzdENhc2UpOgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9wdXR0ZXIoY2xzLCBhZGRyZXNzLCBhdXRoa2V5KToKKyAgICAgICAgbWFuYWdlciA9IFF1ZXVlTWFuYWdlcigKKyAgICAgICAgICAgIGFkZHJlc3M9YWRkcmVzcywgYXV0aGtleT1hdXRoa2V5LCBzZXJpYWxpemVyPVNFUklBTElaRVIpCisgICAgICAgIG1hbmFnZXIuY29ubmVjdCgpCisgICAgICAgIHF1ZXVlID0gbWFuYWdlci5nZXRfcXVldWUoKQorICAgICAgICBxdWV1ZS5wdXQoJ2hlbGxvIHdvcmxkJykKKworICAgIGRlZiB0ZXN0X3JhcGlkX3Jlc3RhcnQoc2VsZik6CisgICAgICAgIGF1dGhrZXkgPSBvcy51cmFuZG9tKDMyKQorICAgICAgICBtYW5hZ2VyID0gUXVldWVNYW5hZ2VyKAorICAgICAgICAgICAgYWRkcmVzcz0oJ2xvY2FsaG9zdCcsIDApLCBhdXRoa2V5PWF1dGhrZXksIHNlcmlhbGl6ZXI9U0VSSUFMSVpFUikKKyAgICAgICAgc3J2ciA9IG1hbmFnZXIuZ2V0X3NlcnZlcigpCisgICAgICAgIGFkZHIgPSBzcnZyLmFkZHJlc3MKKyAgICAgICAgIyBDbG9zZSB0aGUgY29ubmVjdGlvbi5MaXN0ZW5lciBzb2NrZXQgd2hpY2ggZ2V0cyBvcGVuZWQgYXMgYSBwYXJ0CisgICAgICAgICMgb2YgbWFuYWdlci5nZXRfc2VydmVyKCkuIEl0J3Mgbm90IG5lZWRlZCBmb3IgdGhlIHRlc3QuCisgICAgICAgIHNydnIubGlzdGVuZXIuY2xvc2UoKQorICAgICAgICBtYW5hZ2VyLnN0YXJ0KCkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl9wdXR0ZXIsIGFyZ3M9KG1hbmFnZXIuYWRkcmVzcywgYXV0aGtleSkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgcXVldWUgPSBtYW5hZ2VyLmdldF9xdWV1ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVldWUuZ2V0KCksICdoZWxsbyB3b3JsZCcpCisgICAgICAgIGRlbCBxdWV1ZQorICAgICAgICBtYW5hZ2VyLnNodXRkb3duKCkKKyAgICAgICAgbWFuYWdlciA9IFF1ZXVlTWFuYWdlcigKKyAgICAgICAgICAgIGFkZHJlc3M9YWRkciwgYXV0aGtleT1hdXRoa2V5LCBzZXJpYWxpemVyPVNFUklBTElaRVIpCisgICAgICAgIG1hbmFnZXIuc3RhcnQoKQorICAgICAgICBtYW5hZ2VyLnNodXRkb3duKCkKKworIworIworIworCitTRU5USU5FTCA9IGxhdGluKCcnKQorCitjbGFzcyBfVGVzdENvbm5lY3Rpb24oQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsICd0aHJlYWRzJykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZWNobyhjbHMsIGNvbm4pOgorICAgICAgICBmb3IgbXNnIGluIGl0ZXIoY29ubi5yZWN2X2J5dGVzLCBTRU5USU5FTCk6CisgICAgICAgICAgICBjb25uLnNlbmRfYnl0ZXMobXNnKQorICAgICAgICBjb25uLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2Nvbm5lY3Rpb24oc2VsZik6CisgICAgICAgIGNvbm4sIGNoaWxkX2Nvbm4gPSBzZWxmLlBpcGUoKQorCisgICAgICAgIHAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX2VjaG8sIGFyZ3M9KGNoaWxkX2Nvbm4sKSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorCisgICAgICAgIHNlcSA9IFsxLCAyLjI1LCBOb25lXQorICAgICAgICBtc2cgPSBsYXRpbignaGVsbG8gd29ybGQnKQorICAgICAgICBsb25nbXNnID0gbXNnICogMTAKKyAgICAgICAgYXJyID0gYXJyYXkuYXJyYXkoJ2knLCByYW5nZSg0KSkKKworICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ3Byb2Nlc3Nlcyc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoY29ubi5maWxlbm8oKSksIGludCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4uc2VuZChzZXEpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdigpLCBzZXEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnNlbmRfYnl0ZXMobXNnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlY3ZfYnl0ZXMoKSwgbXNnKQorCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIGJ1ZmZlciA9IGFycmF5LmFycmF5KCdpJywgWzBdKjEwKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBsaXN0KGFycikgKyBbMF0gKiAoMTAgLSBsZW4oYXJyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5zZW5kX2J5dGVzKGFyciksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdl9ieXRlc19pbnRvKGJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcnIpICogYnVmZmVyLml0ZW1zaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGJ1ZmZlciksIGV4cGVjdGVkKQorCisgICAgICAgICAgICBidWZmZXIgPSBhcnJheS5hcnJheSgnaScsIFswXSoxMCkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gWzBdICogMyArIGxpc3QoYXJyKSArIFswXSAqICgxMCAtIDMgLSBsZW4oYXJyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5zZW5kX2J5dGVzKGFyciksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdl9ieXRlc19pbnRvKGJ1ZmZlciwgMyAqIGJ1ZmZlci5pdGVtc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihhcnIpICogYnVmZmVyLml0ZW1zaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGJ1ZmZlciksIGV4cGVjdGVkKQorCisgICAgICAgICAgICBidWZmZXIgPSBieXRlYXJyYXkobGF0aW4oJyAnICogNDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnNlbmRfYnl0ZXMobG9uZ21zZyksIE5vbmUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzID0gY29ubi5yZWN2X2J5dGVzX2ludG8oYnVmZmVyKQorICAgICAgICAgICAgZXhjZXB0IG11bHRpcHJvY2Vzc2luZy5CdWZmZXJUb29TaG9ydCwgZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuYXJncywgKGxvbmdtc2csKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdleHBlY3RlZCBCdWZmZXJUb29TaG9ydCwgZ290ICVzJyAlIHJlcykKKworICAgICAgICBwb2xsID0gVGltaW5nV3JhcHBlcihjb25uLnBvbGwpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb2xsKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRpbWluZ0FsbW9zdEVxdWFsKHBvbGwuZWxhcHNlZCwgMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvbGwoVElNRU9VVDEpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUaW1pbmdBbG1vc3RFcXVhbChwb2xsLmVsYXBzZWQsIFRJTUVPVVQxKQorCisgICAgICAgIGNvbm4uc2VuZChOb25lKQorICAgICAgICB0aW1lLnNsZWVwKC4xKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9sbChUSU1FT1VUMSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VGltaW5nQWxtb3N0RXF1YWwocG9sbC5lbGFwc2VkLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksIE5vbmUpCisKKyAgICAgICAgcmVhbGx5X2JpZ19tc2cgPSBsYXRpbignWCcpICogKDEwMjQgKiAxMDI0ICogMTYpICAgIyAxNk1iCisgICAgICAgIGNvbm4uc2VuZF9ieXRlcyhyZWFsbHlfYmlnX21zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlY3ZfYnl0ZXMoKSwgcmVhbGx5X2JpZ19tc2cpCisKKyAgICAgICAgY29ubi5zZW5kX2J5dGVzKFNFTlRJTkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZWxsIGNoaWxkIHRvIHF1aXQKKyAgICAgICAgY2hpbGRfY29ubi5jbG9zZSgpCisKKyAgICAgICAgaWYgc2VsZi5UWVBFID09ICdwcm9jZXNzZXMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlYWRhYmxlLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLndyaXRhYmxlLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRU9GRXJyb3IsIGNvbm4ucmVjdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBjb25uLnJlY3ZfYnl0ZXMpCisKKyAgICAgICAgcC5qb2luKCkKKworICAgIGRlZiB0ZXN0X2R1cGxleF9mYWxzZShzZWxmKToKKyAgICAgICAgcmVhZGVyLCB3cml0ZXIgPSBzZWxmLlBpcGUoZHVwbGV4PUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXRlci5zZW5kKDEpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRlci5yZWN2KCksIDEpCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGVyLnJlYWRhYmxlLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkZXIud3JpdGFibGUsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cml0ZXIucmVhZGFibGUsIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cml0ZXIud3JpdGFibGUsIFRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCByZWFkZXIuc2VuZCwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIHdyaXRlci5yZWN2KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgd3JpdGVyLnBvbGwpCisKKyAgICBkZWYgdGVzdF9zcGF3bl9jbG9zZShzZWxmKToKKyAgICAgICAgIyBXZSB0ZXN0IHRoYXQgYSBwaXBlIGNvbm5lY3Rpb24gY2FuIGJlIGNsb3NlZCBieSBwYXJlbnQKKyAgICAgICAgIyBwcm9jZXNzIGltbWVkaWF0ZWx5IGFmdGVyIGNoaWxkIGlzIHNwYXduZWQuICBPbiBXaW5kb3dzIHRoaXMKKyAgICAgICAgIyB3b3VsZCBoYXZlIHNvbWV0aW1lcyBmYWlsZWQgb24gb2xkIHZlcnNpb25zIGJlY2F1c2UKKyAgICAgICAgIyBjaGlsZF9jb25uIHdvdWxkIGJlIGNsb3NlZCBiZWZvcmUgdGhlIGNoaWxkIGdvdCBhIGNoYW5jZSB0bworICAgICAgICAjIGR1cGxpY2F0ZSBpdC4KKyAgICAgICAgY29ubiwgY2hpbGRfY29ubiA9IHNlbGYuUGlwZSgpCisKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fZWNobywgYXJncz0oY2hpbGRfY29ubiwpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIGNoaWxkX2Nvbm4uY2xvc2UoKSAgICAjIHRoaXMgbWlnaHQgY29tcGxldGUgYmVmb3JlIGNoaWxkIGluaXRpYWxpemVzCisKKyAgICAgICAgbXNnID0gbGF0aW4oJ2hlbGxvJykKKyAgICAgICAgY29ubi5zZW5kX2J5dGVzKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb25uLnJlY3ZfYnl0ZXMoKSwgbXNnKQorCisgICAgICAgIGNvbm4uc2VuZF9ieXRlcyhTRU5USU5FTCkKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIHAuam9pbigpCisKKyAgICBkZWYgdGVzdF9zZW5kYnl0ZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuVFlQRSAhPSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIG1zZyA9IGxhdGluKCdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eicpCisgICAgICAgIGEsIGIgPSBzZWxmLlBpcGUoKQorCisgICAgICAgIGEuc2VuZF9ieXRlcyhtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yZWN2X2J5dGVzKCksIG1zZykKKworICAgICAgICBhLnNlbmRfYnl0ZXMobXNnLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIucmVjdl9ieXRlcygpLCBtc2dbNTpdKQorCisgICAgICAgIGEuc2VuZF9ieXRlcyhtc2csIDcsIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yZWN2X2J5dGVzKCksIG1zZ1s3OjcrOF0pCisKKyAgICAgICAgYS5zZW5kX2J5dGVzKG1zZywgMjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5yZWN2X2J5dGVzKCksIGxhdGluKCcnKSkKKworICAgICAgICBhLnNlbmRfYnl0ZXMobXNnLCAyNiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLnJlY3ZfYnl0ZXMoKSwgbGF0aW4oJycpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuc2VuZF9ieXRlcywgbXNnLCAyNykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLnNlbmRfYnl0ZXMsIG1zZywgMjIsIDUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYS5zZW5kX2J5dGVzLCBtc2csIDI2LCAxKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGEuc2VuZF9ieXRlcywgbXNnLCAtMSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBhLnNlbmRfYnl0ZXMsIG1zZywgNCwgLTEpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX2lzX2ZkX2Fzc2lnbmVkKGNscywgZmQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5mc3RhdChmZCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUJBREY6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICByYWlzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfd3JpdGVmZChjbHMsIGNvbm4sIGRhdGEsIGNyZWF0ZV9kdW1teV9mZHM9RmFsc2UpOgorICAgICAgICBpZiBjcmVhdGVfZHVtbXlfZmRzOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgMjU2KToKKyAgICAgICAgICAgICAgICBpZiBub3QgY2xzLl9pc19mZF9hc3NpZ25lZChpKToKKyAgICAgICAgICAgICAgICAgICAgb3MuZHVwMihjb25uLmZpbGVubygpLCBpKQorICAgICAgICBmZCA9IHJlZHVjdGlvbi5yZWN2X2hhbmRsZShjb25uKQorICAgICAgICBpZiBtc3ZjcnQ6CisgICAgICAgICAgICBmZCA9IG1zdmNydC5vcGVuX29zZmhhbmRsZShmZCwgb3MuT19XUk9OTFkpCisgICAgICAgIG9zLndyaXRlKGZkLCBkYXRhKQorICAgICAgICBvcy5jbG9zZShmZCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19SRURVQ1RJT04sICJ0ZXN0IG5lZWRzIG11bHRpcHJvY2Vzc2luZy5yZWR1Y3Rpb24iKQorICAgIGRlZiB0ZXN0X2ZkX3RyYW5zZmVyKHNlbGYpOgorICAgICAgICBpZiBzZWxmLlRZUEUgIT0gJ3Byb2Nlc3Nlcyc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJvbmx5IG1ha2VzIHNlbnNlIHdpdGggcHJvY2Vzc2VzIikKKyAgICAgICAgY29ubiwgY2hpbGRfY29ubiA9IHNlbGYuUGlwZShkdXBsZXg9VHJ1ZSkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl93cml0ZWZkLCBhcmdzPShjaGlsZF9jb25uLCBiImZvbyIpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZmQgPSBmLmZpbGVubygpCisgICAgICAgICAgICBpZiBtc3ZjcnQ6CisgICAgICAgICAgICAgICAgZmQgPSBtc3ZjcnQuZ2V0X29zZmhhbmRsZShmZCkKKyAgICAgICAgICAgIHJlZHVjdGlvbi5zZW5kX2hhbmRsZShjb25uLCBmZCwgcC5waWQpCisgICAgICAgIHAuam9pbigpCisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJmb28iKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFTX1JFRFVDVElPTiwgInRlc3QgbmVlZHMgbXVsdGlwcm9jZXNzaW5nLnJlZHVjdGlvbiIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwKKyAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IHNlbWFudGljcyBkb24ndCBtYWtlIHNlbnNlIG9uIFdpbmRvd3MiKQorICAgIEB1bml0dGVzdC5za2lwSWYoTUFYRkQgPD0gMjU2LAorICAgICAgICAgICAgICAgICAgICAgImxhcmdlc3QgYXNzaWduYWJsZSBmZCBudW1iZXIgaXMgdG9vIHNtYWxsIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAiZHVwMiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IG5lZWRzIG9zLmR1cDIoKSIpCisgICAgZGVmIHRlc3RfbGFyZ2VfZmRfdHJhbnNmZXIoc2VsZik6CisgICAgICAgICMgV2l0aCBmZCA+IDI1NiAoaXNzdWUgIzExNjU3KQorICAgICAgICBpZiBzZWxmLlRZUEUgIT0gJ3Byb2Nlc3Nlcyc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJvbmx5IG1ha2VzIHNlbnNlIHdpdGggcHJvY2Vzc2VzIikKKyAgICAgICAgY29ubiwgY2hpbGRfY29ubiA9IHNlbGYuUGlwZShkdXBsZXg9VHJ1ZSkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl93cml0ZWZkLCBhcmdzPShjaGlsZF9jb25uLCBiImJhciIsIFRydWUpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmOgorICAgICAgICAgICAgZmQgPSBmLmZpbGVubygpCisgICAgICAgICAgICBmb3IgbmV3ZmQgaW4gcmFuZ2UoMjU2LCBNQVhGRCk6CisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuX2lzX2ZkX2Fzc2lnbmVkKG5ld2ZkKToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjb3VsZCBub3QgZmluZCBhbiB1bmFzc2lnbmVkIGxhcmdlIGZpbGUgZGVzY3JpcHRvciIpCisgICAgICAgICAgICBvcy5kdXAyKGZkLCBuZXdmZCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZWR1Y3Rpb24uc2VuZF9oYW5kbGUoY29ubiwgbmV3ZmQsIHAucGlkKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShuZXdmZCkKKyAgICAgICAgcC5qb2luKCkKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiImJhciIpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3NlbmRfZGF0YV93aXRob3V0X2ZkKHNlbGYsIGNvbm4pOgorICAgICAgICBvcy53cml0ZShjb25uLmZpbGVubygpLCBiIlwwIikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKEhBU19SRURVQ1RJT04sICJ0ZXN0IG5lZWRzIG11bHRpcHJvY2Vzc2luZy5yZWR1Y3Rpb24iKQorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJkb2Vzbid0IG1ha2Ugc2Vuc2Ugb24gV2luZG93cyIpCisgICAgZGVmIHRlc3RfbWlzc2luZ19mZF90cmFuc2ZlcihzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiByZWNlaXZlZCBkYXRhIGlzIG5vdAorICAgICAgICAjIGFjY29tcGFuaWVkIGJ5IGEgZmlsZSBkZXNjcmlwdG9yIGluIGFuY2lsbGFyeSBkYXRhLgorICAgICAgICBpZiBzZWxmLlRZUEUgIT0gJ3Byb2Nlc3Nlcyc6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJvbmx5IG1ha2VzIHNlbnNlIHdpdGggcHJvY2Vzc2VzIikKKyAgICAgICAgY29ubiwgY2hpbGRfY29ubiA9IHNlbGYuUGlwZShkdXBsZXg9VHJ1ZSkKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl9zZW5kX2RhdGFfd2l0aG91dF9mZCwgYXJncz0oY2hpbGRfY29ubiwpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcmVkdWN0aW9uLnJlY3ZfaGFuZGxlLCBjb25uKQorICAgICAgICBwLmpvaW4oKQorCitjbGFzcyBfVGVzdExpc3RlbmVyQ2xpZW50KEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCAndGhyZWFkcycpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3QoY2xzLCBhZGRyZXNzKToKKyAgICAgICAgY29ubiA9IGNscy5jb25uZWN0aW9uLkNsaWVudChhZGRyZXNzKQorICAgICAgICBjb25uLnNlbmQoJ2hlbGxvJykKKyAgICAgICAgY29ubi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9saXN0ZW5lcl9jbGllbnQoc2VsZik6CisgICAgICAgIGZvciBmYW1pbHkgaW4gc2VsZi5jb25uZWN0aW9uLmZhbWlsaWVzOgorICAgICAgICAgICAgbCA9IHNlbGYuY29ubmVjdGlvbi5MaXN0ZW5lcihmYW1pbHk9ZmFtaWx5KQorICAgICAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdCwgYXJncz0obC5hZGRyZXNzLCkpCisgICAgICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgY29ubiA9IGwuYWNjZXB0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksICdoZWxsbycpCisgICAgICAgICAgICBwLmpvaW4oKQorICAgICAgICAgICAgbC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTE0NzI1KHNlbGYpOgorICAgICAgICBsID0gc2VsZi5jb25uZWN0aW9uLkxpc3RlbmVyKCkKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdCwgYXJncz0obC5hZGRyZXNzLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICAjIE9uIFdpbmRvd3MgdGhlIGNsaWVudCBwcm9jZXNzIHNob3VsZCBieSBub3cgaGF2ZSBjb25uZWN0ZWQsCisgICAgICAgICMgd3JpdHRlbiBkYXRhIGFuZCBjbG9zZWQgdGhlIHBpcGUgaGFuZGxlIGJ5IG5vdy4gIFRoaXMgY2F1c2VzCisgICAgICAgICMgQ29ubmVjdE5hbWRlZFBpcGUoKSB0byBmYWlsIHdpdGggRVJST1JfTk9fREFUQS4gIFNlZSBJc3N1ZQorICAgICAgICAjIDE0NzI1LgorICAgICAgICBjb25uID0gbC5hY2NlcHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbm4ucmVjdigpLCAnaGVsbG8nKQorICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgcC5qb2luKCkKKyAgICAgICAgbC5jbG9zZSgpCisKKyMKKyMgVGVzdCBvZiBzZW5kaW5nIGNvbm5lY3Rpb24gYW5kIHNvY2tldCBvYmplY3RzIGJldHdlZW4gcHJvY2Vzc2VzCisjCisiIiIKK2NsYXNzIF9UZXN0UGlja2xpbmdDb25uZWN0aW9ucyhCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywpCisKKyAgICBkZWYgX2xpc3RlbmVyKHNlbGYsIGNvbm4sIGZhbWlsaWVzKToKKyAgICAgICAgZm9yIGZhbSBpbiBmYW1pbGllczoKKyAgICAgICAgICAgIGwgPSBzZWxmLmNvbm5lY3Rpb24uTGlzdGVuZXIoZmFtaWx5PWZhbSkKKyAgICAgICAgICAgIGNvbm4uc2VuZChsLmFkZHJlc3MpCisgICAgICAgICAgICBuZXdfY29ubiA9IGwuYWNjZXB0KCkKKyAgICAgICAgICAgIGNvbm4uc2VuZChuZXdfY29ubikKKworICAgICAgICBpZiBzZWxmLlRZUEUgPT0gJ3Byb2Nlc3Nlcyc6CisgICAgICAgICAgICBsID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICBsLmJpbmQoKCdsb2NhbGhvc3QnLCAwKSkKKyAgICAgICAgICAgIGNvbm4uc2VuZChsLmdldHNvY2tuYW1lKCkpCisgICAgICAgICAgICBsLmxpc3RlbigxKQorICAgICAgICAgICAgbmV3X2Nvbm4sIGFkZHIgPSBsLmFjY2VwdCgpCisgICAgICAgICAgICBjb25uLnNlbmQobmV3X2Nvbm4pCisKKyAgICAgICAgY29ubi5yZWN2KCkKKworICAgIGRlZiBfcmVtb3RlKHNlbGYsIGNvbm4pOgorICAgICAgICBmb3IgKGFkZHJlc3MsIG1zZykgaW4gaXRlcihjb25uLnJlY3YsIE5vbmUpOgorICAgICAgICAgICAgY2xpZW50ID0gc2VsZi5jb25uZWN0aW9uLkNsaWVudChhZGRyZXNzKQorICAgICAgICAgICAgY2xpZW50LnNlbmQobXNnLnVwcGVyKCkpCisgICAgICAgICAgICBjbGllbnQuY2xvc2UoKQorCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIGFkZHJlc3MsIG1zZyA9IGNvbm4ucmVjdigpCisgICAgICAgICAgICBjbGllbnQgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgIGNsaWVudC5jb25uZWN0KGFkZHJlc3MpCisgICAgICAgICAgICBjbGllbnQuc2VuZGFsbChtc2cudXBwZXIoKSkKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpCisKKyAgICAgICAgY29ubi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXVsdGlwcm9jZXNzaW5nLmFsbG93X2Nvbm5lY3Rpb25fcGlja2xpbmcoKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmYW1pbGllcyA9IHNlbGYuY29ubmVjdGlvbi5mYW1pbGllcworCisgICAgICAgIGxjb25uLCBsY29ubjAgPSBzZWxmLlBpcGUoKQorICAgICAgICBscCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fbGlzdGVuZXIsIGFyZ3M9KGxjb25uMCwgZmFtaWxpZXMpKQorICAgICAgICBscC5kYWVtb24gPSBUcnVlCisgICAgICAgIGxwLnN0YXJ0KCkKKyAgICAgICAgbGNvbm4wLmNsb3NlKCkKKworICAgICAgICByY29ubiwgcmNvbm4wID0gc2VsZi5QaXBlKCkKKyAgICAgICAgcnAgPSBzZWxmLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3JlbW90ZSwgYXJncz0ocmNvbm4wLCkpCisgICAgICAgIHJwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcnAuc3RhcnQoKQorICAgICAgICByY29ubjAuY2xvc2UoKQorCisgICAgICAgIGZvciBmYW0gaW4gZmFtaWxpZXM6CisgICAgICAgICAgICBtc2cgPSAoJ1RoaXMgY29ubmVjdGlvbiB1c2VzIGZhbWlseSAlcycgJSBmYW0pLmVuY29kZSgnYXNjaWknKQorICAgICAgICAgICAgYWRkcmVzcyA9IGxjb25uLnJlY3YoKQorICAgICAgICAgICAgcmNvbm4uc2VuZCgoYWRkcmVzcywgbXNnKSkKKyAgICAgICAgICAgIG5ld19jb25uID0gbGNvbm4ucmVjdigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19jb25uLnJlY3YoKSwgbXNnLnVwcGVyKCkpCisKKyAgICAgICAgcmNvbm4uc2VuZChOb25lKQorCisgICAgICAgIGlmIHNlbGYuVFlQRSA9PSAncHJvY2Vzc2VzJzoKKyAgICAgICAgICAgIG1zZyA9IGxhdGluKCdUaGlzIGNvbm5lY3Rpb24gdXNlcyBhIG5vcm1hbCBzb2NrZXQnKQorICAgICAgICAgICAgYWRkcmVzcyA9IGxjb25uLnJlY3YoKQorICAgICAgICAgICAgcmNvbm4uc2VuZCgoYWRkcmVzcywgbXNnKSkKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc29ja2V0LCAnZnJvbWZkJyk6CisgICAgICAgICAgICAgICAgbmV3X2Nvbm4gPSBsY29ubi5yZWN2KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19jb25uLnJlY3YoMTAwKSwgbXNnLnVwcGVyKCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgWFhYIE9uIFdpbmRvd3Mgd2l0aCBQeTIuNiBuZWVkIHRvIGJhY2twb3J0IGZyb21mZCgpCisgICAgICAgICAgICAgICAgZGlzY2FyZCA9IGxjb25uLnJlY3ZfYnl0ZXMoKQorCisgICAgICAgIGxjb25uLnNlbmQoTm9uZSkKKworICAgICAgICByY29ubi5jbG9zZSgpCisgICAgICAgIGxjb25uLmNsb3NlKCkKKworICAgICAgICBscC5qb2luKCkKKyAgICAgICAgcnAuam9pbigpCisiIiIKKyMKKyMKKyMKKworY2xhc3MgX1Rlc3RIZWFwKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCkKKworICAgIGRlZiB0ZXN0X2hlYXAoc2VsZik6CisgICAgICAgIGl0ZXJhdGlvbnMgPSA1MDAwCisgICAgICAgIG1heGJsb2NrcyA9IDUwCisgICAgICAgIGJsb2NrcyA9IFtdCisKKyAgICAgICAgIyBjcmVhdGUgYW5kIGRlc3Ryb3kgbG90cyBvZiBibG9ja3Mgb2YgZGlmZmVyZW50IHNpemVzCisgICAgICAgIGZvciBpIGluIHhyYW5nZShpdGVyYXRpb25zKToKKyAgICAgICAgICAgIHNpemUgPSBpbnQocmFuZG9tLmxvZ25vcm12YXJpYXRlKDAsIDEpICogMTAwMCkKKyAgICAgICAgICAgIGIgPSBtdWx0aXByb2Nlc3NpbmcuaGVhcC5CdWZmZXJXcmFwcGVyKHNpemUpCisgICAgICAgICAgICBibG9ja3MuYXBwZW5kKGIpCisgICAgICAgICAgICBpZiBsZW4oYmxvY2tzKSA+IG1heGJsb2NrczoKKyAgICAgICAgICAgICAgICBpID0gcmFuZG9tLnJhbmRyYW5nZShtYXhibG9ja3MpCisgICAgICAgICAgICAgICAgZGVsIGJsb2Nrc1tpXQorCisgICAgICAgICMgZ2V0IHRoZSBoZWFwIG9iamVjdAorICAgICAgICBoZWFwID0gbXVsdGlwcm9jZXNzaW5nLmhlYXAuQnVmZmVyV3JhcHBlci5faGVhcAorCisgICAgICAgICMgdmVyaWZ5IHRoZSBzdGF0ZSBvZiB0aGUgaGVhcAorICAgICAgICBhbGwgPSBbXQorICAgICAgICBvY2N1cGllZCA9IDAKKyAgICAgICAgaGVhcC5fbG9jay5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGhlYXAuX2xvY2sucmVsZWFzZSkKKyAgICAgICAgZm9yIEwgaW4gaGVhcC5fbGVuX3RvX3NlcS52YWx1ZXMoKToKKyAgICAgICAgICAgIGZvciBhcmVuYSwgc3RhcnQsIHN0b3AgaW4gTDoKKyAgICAgICAgICAgICAgICBhbGwuYXBwZW5kKChoZWFwLl9hcmVuYXMuaW5kZXgoYXJlbmEpLCBzdGFydCwgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9wLXN0YXJ0LCAnZnJlZScpKQorICAgICAgICBmb3IgYXJlbmEsIHN0YXJ0LCBzdG9wIGluIGhlYXAuX2FsbG9jYXRlZF9ibG9ja3M6CisgICAgICAgICAgICBhbGwuYXBwZW5kKChoZWFwLl9hcmVuYXMuaW5kZXgoYXJlbmEpLCBzdGFydCwgc3RvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0b3Atc3RhcnQsICdvY2N1cGllZCcpKQorICAgICAgICAgICAgb2NjdXBpZWQgKz0gKHN0b3Atc3RhcnQpCisKKyAgICAgICAgYWxsLnNvcnQoKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhbGwpLTEpOgorICAgICAgICAgICAgKGFyZW5hLCBzdGFydCwgc3RvcCkgPSBhbGxbaV1bOjNdCisgICAgICAgICAgICAobmFyZW5hLCBuc3RhcnQsIG5zdG9wKSA9IGFsbFtpKzFdWzozXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhcmVuYSAhPSBuYXJlbmEgYW5kIG5zdGFydCA9PSAwKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdG9wID09IG5zdGFydCkpCisKKyAgICBkZWYgdGVzdF9mcmVlX2Zyb21fZ2Moc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBmcmVlaW5nIG9mIGJsb2NrcyBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgZG9lc24ndCBkZWFkbG9jaworICAgICAgICAjIChpc3N1ZSAjMTIzNTIpLgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgR0MgaXMgZW5hYmxlZCwgYW5kIHNldCBsb3dlciBjb2xsZWN0aW9uIHRocmVzaG9sZHMgdG8KKyAgICAgICAgIyBtYWtlIGNvbGxlY3Rpb25zIG1vcmUgZnJlcXVlbnQgKGFuZCBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgb2YKKyAgICAgICAgIyBkZWFkbG9jaykuCisgICAgICAgIGlmIG5vdCBnYy5pc2VuYWJsZWQoKToKKyAgICAgICAgICAgIGdjLmVuYWJsZSgpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAoZ2MuZGlzYWJsZSkKKyAgICAgICAgdGhyZXNob2xkcyA9IGdjLmdldF90aHJlc2hvbGQoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoZ2Muc2V0X3RocmVzaG9sZCwgKnRocmVzaG9sZHMpCisgICAgICAgIGdjLnNldF90aHJlc2hvbGQoMTApCisKKyAgICAgICAgIyBwZXJmb3JtIG51bWVyb3VzIGJsb2NrIGFsbG9jYXRpb25zLCB3aXRoIGN5Y2xpYyByZWZlcmVuY2VzIHRvIG1ha2UKKyAgICAgICAgIyBzdXJlIG9iamVjdHMgYXJlIGNvbGxlY3RlZCBhc3luY2hyb25vdXNseSBieSB0aGUgZ2MKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNTAwMCk6CisgICAgICAgICAgICBhID0gbXVsdGlwcm9jZXNzaW5nLmhlYXAuQnVmZmVyV3JhcHBlcigxKQorICAgICAgICAgICAgYiA9IG11bHRpcHJvY2Vzc2luZy5oZWFwLkJ1ZmZlcldyYXBwZXIoMSkKKyAgICAgICAgICAgICMgY2lyY3VsYXIgcmVmZXJlbmNlcworICAgICAgICAgICAgYS5idWRkeSA9IGIKKyAgICAgICAgICAgIGIuYnVkZHkgPSBhCisKKyMKKyMKKyMKKworY2xhc3MgX0ZvbyhTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWworICAgICAgICAoJ3gnLCBjX2ludCksCisgICAgICAgICgneScsIGNfZG91YmxlKQorICAgICAgICBdCisKK2NsYXNzIF9UZXN0U2hhcmVkQ1R5cGVzKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgbm90IEhBU19TSEFSRURDVFlQRVM6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJyZXF1aXJlcyBtdWx0aXByb2Nlc3Npbmcuc2hhcmVkY3R5cGVzIikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfZG91YmxlKGNscywgeCwgeSwgZm9vLCBhcnIsIHN0cmluZyk6CisgICAgICAgIHgudmFsdWUgKj0gMgorICAgICAgICB5LnZhbHVlICo9IDIKKyAgICAgICAgZm9vLnggKj0gMgorICAgICAgICBmb28ueSAqPSAyCisgICAgICAgIHN0cmluZy52YWx1ZSAqPSAyCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihhcnIpKToKKyAgICAgICAgICAgIGFycltpXSAqPSAyCisKKyAgICBkZWYgdGVzdF9zaGFyZWRjdHlwZXMoc2VsZiwgbG9jaz1GYWxzZSk6CisgICAgICAgIHggPSBWYWx1ZSgnaScsIDcsIGxvY2s9bG9jaykKKyAgICAgICAgeSA9IFZhbHVlKGNfZG91YmxlLCAxLjAvMy4wLCBsb2NrPWxvY2spCisgICAgICAgIGZvbyA9IFZhbHVlKF9Gb28sIDMsIDIsIGxvY2s9bG9jaykKKyAgICAgICAgYXJyID0gc2VsZi5BcnJheSgnZCcsIHJhbmdlKDEwKSwgbG9jaz1sb2NrKQorICAgICAgICBzdHJpbmcgPSBzZWxmLkFycmF5KCdjJywgMjAsIGxvY2s9bG9jaykKKyAgICAgICAgc3RyaW5nLnZhbHVlID0gbGF0aW4oJ2hlbGxvJykKKworICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl9kb3VibGUsIGFyZ3M9KHgsIHksIGZvbywgYXJyLCBzdHJpbmcpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHAuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbHVlLCAxNCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCh5LnZhbHVlLCAyLjAvMy4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby54LCA2KQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKGZvby55LCA0LjApCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoYXJyW2ldLCBpKjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLnZhbHVlLCBsYXRpbignaGVsbG9oZWxsbycpKQorCisgICAgZGVmIHRlc3Rfc3luY2hyb25pemUoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9zaGFyZWRjdHlwZXMobG9jaz1UcnVlKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZm9vID0gX0ZvbygyLCA1LjApCisgICAgICAgIGJhciA9IGNvcHkoZm9vKQorICAgICAgICBmb28ueCA9IDAKKyAgICAgICAgZm9vLnkgPSAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFyLngsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoYmFyLnksIDUuMCkKKworIworIworIworCitjbGFzcyBfVGVzdEZpbmFsaXplKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBBTExPV0VEX1RZUEVTID0gKCdwcm9jZXNzZXMnLCkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBfdGVzdF9maW5hbGl6ZShjbHMsIGNvbm4pOgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBhID0gRm9vKCkKKyAgICAgICAgdXRpbC5GaW5hbGl6ZShhLCBjb25uLnNlbmQsIGFyZ3M9KCdhJywpKQorICAgICAgICBkZWwgYSAgICAgICAgICAgIyB0cmlnZ2VycyBjYWxsYmFjayBmb3IgYQorCisgICAgICAgIGIgPSBGb28oKQorICAgICAgICBjbG9zZV9iID0gdXRpbC5GaW5hbGl6ZShiLCBjb25uLnNlbmQsIGFyZ3M9KCdiJywpKQorICAgICAgICBjbG9zZV9iKCkgICAgICAgIyB0cmlnZ2VycyBjYWxsYmFjayBmb3IgYgorICAgICAgICBjbG9zZV9iKCkgICAgICAgIyBkb2VzIG5vdGhpbmcgYmVjYXVzZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAorICAgICAgICBkZWwgYiAgICAgICAgICAgIyBkb2VzIG5vdGhpbmcgYmVjYXVzZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZAorCisgICAgICAgIGMgPSBGb28oKQorICAgICAgICB1dGlsLkZpbmFsaXplKGMsIGNvbm4uc2VuZCwgYXJncz0oJ2MnLCkpCisKKyAgICAgICAgZDEwID0gRm9vKCkKKyAgICAgICAgdXRpbC5GaW5hbGl6ZShkMTAsIGNvbm4uc2VuZCwgYXJncz0oJ2QxMCcsKSwgZXhpdHByaW9yaXR5PTEpCisKKyAgICAgICAgZDAxID0gRm9vKCkKKyAgICAgICAgdXRpbC5GaW5hbGl6ZShkMDEsIGNvbm4uc2VuZCwgYXJncz0oJ2QwMScsKSwgZXhpdHByaW9yaXR5PTApCisgICAgICAgIGQwMiA9IEZvbygpCisgICAgICAgIHV0aWwuRmluYWxpemUoZDAyLCBjb25uLnNlbmQsIGFyZ3M9KCdkMDInLCksIGV4aXRwcmlvcml0eT0wKQorICAgICAgICBkMDMgPSBGb28oKQorICAgICAgICB1dGlsLkZpbmFsaXplKGQwMywgY29ubi5zZW5kLCBhcmdzPSgnZDAzJywpLCBleGl0cHJpb3JpdHk9MCkKKworICAgICAgICB1dGlsLkZpbmFsaXplKE5vbmUsIGNvbm4uc2VuZCwgYXJncz0oJ2UnLCksIGV4aXRwcmlvcml0eT0tMTApCisKKyAgICAgICAgdXRpbC5GaW5hbGl6ZShOb25lLCBjb25uLnNlbmQsIGFyZ3M9KCdTVE9QJywpLCBleGl0cHJpb3JpdHk9LTEwMCkKKworICAgICAgICAjIGNhbGwgbXVsdGlwcm9jZXNzaW5nJ3MgY2xlYW51cCBmdW5jdGlvbiB0aGVuIGV4aXQgcHJvY2VzcyB3aXRob3V0CisgICAgICAgICMgZ2FyYmFnZSBjb2xsZWN0aW5nIGxvY2FscworICAgICAgICB1dGlsLl9leGl0X2Z1bmN0aW9uKCkKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIG9zLl9leGl0KDApCisKKyAgICBkZWYgdGVzdF9maW5hbGl6ZShzZWxmKToKKyAgICAgICAgY29ubiwgY2hpbGRfY29ubiA9IHNlbGYuUGlwZSgpCisKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdF9maW5hbGl6ZSwgYXJncz0oY2hpbGRfY29ubiwpKQorICAgICAgICBwLmRhZW1vbiA9IFRydWUKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHAuam9pbigpCisKKyAgICAgICAgcmVzdWx0ID0gW29iaiBmb3Igb2JqIGluIGl0ZXIoY29ubi5yZWN2LCAnU1RPUCcpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgWydhJywgJ2InLCAnZDEwJywgJ2QwMycsICdkMDInLCAnZDAxJywgJ2UnXSkKKworIworIyBUZXN0IHRoYXQgZnJvbSAuLi4gaW1wb3J0ICogd29ya3MgZm9yIGVhY2ggbW9kdWxlCisjCisKK2NsYXNzIF9UZXN0SW1wb3J0U3RhcihCYXNlVGVzdENhc2UpOgorCisgICAgQUxMT1dFRF9UWVBFUyA9ICgncHJvY2Vzc2VzJywpCisKKyAgICBkZWYgdGVzdF9pbXBvcnQoc2VsZik6CisgICAgICAgIG1vZHVsZXMgPSBbCisgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nJywgJ211bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uJywKKyAgICAgICAgICAgICdtdWx0aXByb2Nlc3NpbmcuaGVhcCcsICdtdWx0aXByb2Nlc3NpbmcubWFuYWdlcnMnLAorICAgICAgICAgICAgJ211bHRpcHJvY2Vzc2luZy5wb29sJywgJ211bHRpcHJvY2Vzc2luZy5wcm9jZXNzJywKKyAgICAgICAgICAgICdtdWx0aXByb2Nlc3Npbmcuc3luY2hyb25pemUnLCAnbXVsdGlwcm9jZXNzaW5nLnV0aWwnCisgICAgICAgICAgICBdCisKKyAgICAgICAgaWYgSEFTX1JFRFVDVElPTjoKKyAgICAgICAgICAgIG1vZHVsZXMuYXBwZW5kKCdtdWx0aXByb2Nlc3NpbmcucmVkdWN0aW9uJykKKworICAgICAgICBpZiBjX2ludCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgVGhpcyBtb2R1bGUgcmVxdWlyZXMgX2N0eXBlcworICAgICAgICAgICAgbW9kdWxlcy5hcHBlbmQoJ211bHRpcHJvY2Vzc2luZy5zaGFyZWRjdHlwZXMnKQorCisgICAgICAgIGZvciBuYW1lIGluIG1vZHVsZXM6CisgICAgICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1tuYW1lXQorCisgICAgICAgICAgICBmb3IgYXR0ciBpbiBnZXRhdHRyKG1vZCwgJ19fYWxsX18nLCAoKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICBoYXNhdHRyKG1vZCwgYXR0ciksCisgICAgICAgICAgICAgICAgICAgICclciBkb2VzIG5vdCBoYXZlIGF0dHJpYnV0ZSAlcicgJSAobW9kLCBhdHRyKQorICAgICAgICAgICAgICAgICAgICApCisKKyMKKyMgUXVpY2sgdGVzdCB0aGF0IGxvZ2dpbmcgd29ya3MgLS0gZG9lcyBub3QgdGVzdCBsb2dnaW5nIG91dHB1dAorIworCitjbGFzcyBfVGVzdExvZ2dpbmcoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgZGVmIHRlc3RfZW5hYmxlX2xvZ2dpbmcoc2VsZik6CisgICAgICAgIGxvZ2dlciA9IG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKHV0aWwuU1VCV0FSTklORykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvZ2dlciBpcyBub3QgTm9uZSkKKyAgICAgICAgbG9nZ2VyLmRlYnVnKCd0aGlzIHdpbGwgbm90IGJlIHByaW50ZWQnKQorICAgICAgICBsb2dnZXIuaW5mbygnbm9yIHdpbGwgdGhpcycpCisgICAgICAgIGxvZ2dlci5zZXRMZXZlbChMT0dfTEVWRUwpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfbGV2ZWwoY2xzLCBjb25uKToKKyAgICAgICAgbG9nZ2VyID0gbXVsdGlwcm9jZXNzaW5nLmdldF9sb2dnZXIoKQorICAgICAgICBjb25uLnNlbmQobG9nZ2VyLmdldEVmZmVjdGl2ZUxldmVsKCkpCisKKyAgICBkZWYgdGVzdF9sZXZlbChzZWxmKToKKyAgICAgICAgTEVWRUwxID0gMzIKKyAgICAgICAgTEVWRUwyID0gMzcKKworICAgICAgICBsb2dnZXIgPSBtdWx0aXByb2Nlc3NpbmcuZ2V0X2xvZ2dlcigpCisgICAgICAgIHJvb3RfbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoKQorICAgICAgICByb290X2xldmVsID0gcm9vdF9sb2dnZXIubGV2ZWwKKworICAgICAgICByZWFkZXIsIHdyaXRlciA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKGR1cGxleD1GYWxzZSkKKworICAgICAgICBsb2dnZXIuc2V0TGV2ZWwoTEVWRUwxKQorICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD1zZWxmLl90ZXN0X2xldmVsLCBhcmdzPSh3cml0ZXIsKSkKKyAgICAgICAgcC5kYWVtb24gPSBUcnVlCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExFVkVMMSwgcmVhZGVyLnJlY3YoKSkKKworICAgICAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5OT1RTRVQpCisgICAgICAgIHJvb3RfbG9nZ2VyLnNldExldmVsKExFVkVMMikKKyAgICAgICAgcCA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fdGVzdF9sZXZlbCwgYXJncz0od3JpdGVyLCkpCisgICAgICAgIHAuZGFlbW9uID0gVHJ1ZQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMRVZFTDIsIHJlYWRlci5yZWN2KCkpCisKKyAgICAgICAgcm9vdF9sb2dnZXIuc2V0TGV2ZWwocm9vdF9sZXZlbCkKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKGxldmVsPUxPR19MRVZFTCkKKworCisjIGNsYXNzIF9UZXN0TG9nZ2luZ1Byb2Nlc3NOYW1lKEJhc2VUZXN0Q2FzZSk6CisjCisjICAgICBkZWYgaGFuZGxlKHNlbGYsIHJlY29yZCk6CisjICAgICAgICAgYXNzZXJ0IHJlY29yZC5wcm9jZXNzTmFtZSA9PSBtdWx0aXByb2Nlc3NpbmcuY3VycmVudF9wcm9jZXNzKCkubmFtZQorIyAgICAgICAgIHNlbGYuX19oYW5kbGVkID0gVHJ1ZQorIworIyAgICAgZGVmIHRlc3RfbG9nZ2luZyhzZWxmKToKKyMgICAgICAgICBoYW5kbGVyID0gbG9nZ2luZy5IYW5kbGVyKCkKKyMgICAgICAgICBoYW5kbGVyLmhhbmRsZSA9IHNlbGYuaGFuZGxlCisjICAgICAgICAgc2VsZi5fX2hhbmRsZWQgPSBGYWxzZQorIyAgICAgICAgICMgQnlwYXNzIGdldExvZ2dlcigpIGFuZCBzaWRlLWVmZmVjdHMKKyMgICAgICAgICBsb2dnZXIgPSBsb2dnaW5nLmdldExvZ2dlckNsYXNzKCkoCisjICAgICAgICAgICAgICAgICAnbXVsdGlwcm9jZXNzaW5nLnRlc3QuVGVzdExvZ2dpbmdQcm9jZXNzTmFtZScpCisjICAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKKyMgICAgICAgICBsb2dnZXIucHJvcGFnYXRlID0gRmFsc2UKKyMKKyMgICAgICAgICBsb2dnZXIud2FybignZm9vJykKKyMgICAgICAgICBhc3NlcnQgc2VsZi5fX2hhbmRsZWQKKworIworIyBDaGVjayB0aGF0IFByb2Nlc3Muam9pbigpIHJldHJpZXMgaWYgb3Mud2FpdHBpZCgpIGZhaWxzIHdpdGggRUlOVFIKKyMKKworY2xhc3MgX1Rlc3RQb2xsRWludHIoQmFzZVRlc3RDYXNlKToKKworICAgIEFMTE9XRURfVFlQRVMgPSAoJ3Byb2Nlc3NlcycsKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIF9raWxsZXIoY2xzLCBwaWQpOgorICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdVU1IxKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihzaWduYWwsICdTSUdVU1IxJyksICdyZXF1aXJlcyBTSUdVU1IxJykKKyAgICBkZWYgdGVzdF9wb2xsX2VpbnRyKHNlbGYpOgorICAgICAgICBnb3Rfc2lnbmFsID0gW0ZhbHNlXQorICAgICAgICBkZWYgcmVjb3JkKCphcmdzKToKKyAgICAgICAgICAgIGdvdF9zaWduYWxbMF0gPSBUcnVlCisgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIG9sZGhhbmRsZXIgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCByZWNvcmQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGtpbGxlciA9IHNlbGYuUHJvY2Vzcyh0YXJnZXQ9c2VsZi5fa2lsbGVyLCBhcmdzPShwaWQsKSkKKyAgICAgICAgICAgIGtpbGxlci5zdGFydCgpCisgICAgICAgICAgICBwID0gc2VsZi5Qcm9jZXNzKHRhcmdldD10aW1lLnNsZWVwLCBhcmdzPSgxLCkpCisgICAgICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgICAgIHAuam9pbigpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ290X3NpZ25hbFswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5leGl0Y29kZSwgMCkKKyAgICAgICAgICAgIGtpbGxlci5qb2luKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIG9sZGhhbmRsZXIpCisKKyMKKyMgVGVzdCB0byB2ZXJpZnkgaGFuZGxlIHZlcmlmaWNhdGlvbiwgc2VlIGlzc3VlIDMzMjEKKyMKKworY2xhc3MgVGVzdEludmFsaWRIYW5kbGUodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHVuaXR0ZXN0LnNraXBJZihXSU4zMiwgInNraXBwZWQgb24gV2luZG93cyIpCisgICAgZGVmIHRlc3RfaW52YWxpZF9oYW5kbGVzKHNlbGYpOgorICAgICAgICBjb25uID0gX211bHRpcHJvY2Vzc2luZy5Db25uZWN0aW9uKDQ0OTc3NjA4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBjb25uLnBvbGwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsIF9tdWx0aXByb2Nlc3NpbmcuQ29ubmVjdGlvbiwgLTEpCisKKyMKKyMgRnVuY3Rpb25zIHVzZWQgdG8gY3JlYXRlIHRlc3QgY2FzZXMgZnJvbSB0aGUgYmFzZSBvbmVzIGluIHRoaXMgbW9kdWxlCisjCisKK2RlZiBnZXRfYXR0cmlidXRlcyhTb3VyY2UsIG5hbWVzKToKKyAgICBkID0ge30KKyAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgb2JqID0gZ2V0YXR0cihTb3VyY2UsIG5hbWUpCisgICAgICAgIGlmIHR5cGUob2JqKSA9PSB0eXBlKGdldF9hdHRyaWJ1dGVzKToKKyAgICAgICAgICAgIG9iaiA9IHN0YXRpY21ldGhvZChvYmopCisgICAgICAgIGRbbmFtZV0gPSBvYmoKKyAgICByZXR1cm4gZAorCitkZWYgY3JlYXRlX3Rlc3RfY2FzZXMoTWl4aW4sIHR5cGUpOgorICAgIHJlc3VsdCA9IHt9CisgICAgZ2xvYiA9IGdsb2JhbHMoKQorICAgIFR5cGUgPSB0eXBlLmNhcGl0YWxpemUoKQorCisgICAgZm9yIG5hbWUgaW4gZ2xvYi5rZXlzKCk6CisgICAgICAgIGlmIG5hbWUuc3RhcnRzd2l0aCgnX1Rlc3QnKToKKyAgICAgICAgICAgIGJhc2UgPSBnbG9iW25hbWVdCisgICAgICAgICAgICBpZiB0eXBlIGluIGJhc2UuQUxMT1dFRF9UWVBFUzoKKyAgICAgICAgICAgICAgICBuZXduYW1lID0gJ1dpdGgnICsgVHlwZSArIG5hbWVbMTpdCisgICAgICAgICAgICAgICAgY2xhc3MgVGVtcChiYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSwgTWl4aW4pOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgcmVzdWx0W25ld25hbWVdID0gVGVtcAorICAgICAgICAgICAgICAgIFRlbXAuX19uYW1lX18gPSBuZXduYW1lCisgICAgICAgICAgICAgICAgVGVtcC5fX21vZHVsZV9fID0gTWl4aW4uX19tb2R1bGVfXworICAgIHJldHVybiByZXN1bHQKKworIworIyBDcmVhdGUgdGVzdCBjYXNlcworIworCitjbGFzcyBQcm9jZXNzZXNNaXhpbihvYmplY3QpOgorICAgIFRZUEUgPSAncHJvY2Vzc2VzJworICAgIFByb2Nlc3MgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzcworICAgIGxvY2FscygpLnVwZGF0ZShnZXRfYXR0cmlidXRlcyhtdWx0aXByb2Nlc3NpbmcsICgKKyAgICAgICAgJ1F1ZXVlJywgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLAorICAgICAgICAnQ29uZGl0aW9uJywgJ0V2ZW50JywgJ1ZhbHVlJywgJ0FycmF5JywgJ1Jhd1ZhbHVlJywKKyAgICAgICAgJ1Jhd0FycmF5JywgJ2N1cnJlbnRfcHJvY2VzcycsICdhY3RpdmVfY2hpbGRyZW4nLCAnUGlwZScsCisgICAgICAgICdjb25uZWN0aW9uJywgJ0pvaW5hYmxlUXVldWUnLCAnUG9vbCcKKyAgICAgICAgKSkpCisKK3Rlc3RjYXNlc19wcm9jZXNzZXMgPSBjcmVhdGVfdGVzdF9jYXNlcyhQcm9jZXNzZXNNaXhpbiwgdHlwZT0ncHJvY2Vzc2VzJykKK2dsb2JhbHMoKS51cGRhdGUodGVzdGNhc2VzX3Byb2Nlc3NlcykKKworCitjbGFzcyBNYW5hZ2VyTWl4aW4ob2JqZWN0KToKKyAgICBUWVBFID0gJ21hbmFnZXInCisgICAgUHJvY2VzcyA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzCisgICAgbWFuYWdlciA9IG9iamVjdC5fX25ld19fKG11bHRpcHJvY2Vzc2luZy5tYW5hZ2Vycy5TeW5jTWFuYWdlcikKKyAgICBsb2NhbHMoKS51cGRhdGUoZ2V0X2F0dHJpYnV0ZXMobWFuYWdlciwgKAorICAgICAgICAnUXVldWUnLCAnTG9jaycsICdSTG9jaycsICdTZW1hcGhvcmUnLCAnQm91bmRlZFNlbWFwaG9yZScsCisgICAgICAgJ0NvbmRpdGlvbicsICdFdmVudCcsICdWYWx1ZScsICdBcnJheScsICdsaXN0JywgJ2RpY3QnLAorICAgICAgICAnTmFtZXNwYWNlJywgJ0pvaW5hYmxlUXVldWUnLCAnUG9vbCcKKyAgICAgICAgKSkpCisKK3Rlc3RjYXNlc19tYW5hZ2VyID0gY3JlYXRlX3Rlc3RfY2FzZXMoTWFuYWdlck1peGluLCB0eXBlPSdtYW5hZ2VyJykKK2dsb2JhbHMoKS51cGRhdGUodGVzdGNhc2VzX21hbmFnZXIpCisKKworY2xhc3MgVGhyZWFkc01peGluKG9iamVjdCk6CisgICAgVFlQRSA9ICd0aHJlYWRzJworICAgIFByb2Nlc3MgPSBtdWx0aXByb2Nlc3NpbmcuZHVtbXkuUHJvY2VzcworICAgIGxvY2FscygpLnVwZGF0ZShnZXRfYXR0cmlidXRlcyhtdWx0aXByb2Nlc3NpbmcuZHVtbXksICgKKyAgICAgICAgJ1F1ZXVlJywgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLAorICAgICAgICAnQ29uZGl0aW9uJywgJ0V2ZW50JywgJ1ZhbHVlJywgJ0FycmF5JywgJ2N1cnJlbnRfcHJvY2VzcycsCisgICAgICAgICdhY3RpdmVfY2hpbGRyZW4nLCAnUGlwZScsICdjb25uZWN0aW9uJywgJ2RpY3QnLCAnbGlzdCcsCisgICAgICAgICdOYW1lc3BhY2UnLCAnSm9pbmFibGVRdWV1ZScsICdQb29sJworICAgICAgICApKSkKKwordGVzdGNhc2VzX3RocmVhZHMgPSBjcmVhdGVfdGVzdF9jYXNlcyhUaHJlYWRzTWl4aW4sIHR5cGU9J3RocmVhZHMnKQorZ2xvYmFscygpLnVwZGF0ZSh0ZXN0Y2FzZXNfdGhyZWFkcykKKworY2xhc3MgT3RoZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRPRE86IGFkZCBtb3JlIHRlc3RzIGZvciBkZWxpdmVyL2Fuc3dlciBjaGFsbGVuZ2UuCisgICAgZGVmIHRlc3RfZGVsaXZlcl9jaGFsbGVuZ2VfYXV0aF9mYWlsdXJlKHNlbGYpOgorICAgICAgICBjbGFzcyBfRmFrZUNvbm5lY3Rpb24ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiByZWN2X2J5dGVzKHNlbGYsIHNpemUpOgorICAgICAgICAgICAgICAgIHJldHVybiBiJ3NvbWV0aGluZyBib2d1cycKKyAgICAgICAgICAgIGRlZiBzZW5kX2J5dGVzKHNlbGYsIGRhdGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMobXVsdGlwcm9jZXNzaW5nLkF1dGhlbnRpY2F0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uLmRlbGl2ZXJfY2hhbGxlbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfRmFrZUNvbm5lY3Rpb24oKSwgYidhYmMnKQorCisgICAgZGVmIHRlc3RfYW5zd2VyX2NoYWxsZW5nZV9hdXRoX2ZhaWx1cmUoc2VsZik6CisgICAgICAgIGNsYXNzIF9GYWtlQ29ubmVjdGlvbihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisgICAgICAgICAgICBkZWYgcmVjdl9ieXRlcyhzZWxmLCBzaXplKToKKyAgICAgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvdW50ID09IDE6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtdWx0aXByb2Nlc3NpbmcuY29ubmVjdGlvbi5DSEFMTEVOR0UKKyAgICAgICAgICAgICAgICBlbGlmIHNlbGYuY291bnQgPT0gMjoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGInc29tZXRoaW5nIGJvZ3VzJworICAgICAgICAgICAgICAgIHJldHVybiBiJycKKyAgICAgICAgICAgIGRlZiBzZW5kX2J5dGVzKHNlbGYsIGRhdGEpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMobXVsdGlwcm9jZXNzaW5nLkF1dGhlbnRpY2F0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uLmFuc3dlcl9jaGFsbGVuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9GYWtlQ29ubmVjdGlvbigpLCBiJ2FiYycpCisKKyMKKyMgVGVzdCBNYW5hZ2VyLnN0YXJ0KCkvUG9vbC5fX2luaXRfXygpIGluaXRpYWxpemVyIGZlYXR1cmUgLSBzZWUgaXNzdWUgNTU4NQorIworCitkZWYgaW5pdGlhbGl6ZXIobnMpOgorICAgIG5zLnRlc3QgKz0gMQorCitjbGFzcyBUZXN0SW5pdGlhbGl6ZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubWdyID0gbXVsdGlwcm9jZXNzaW5nLk1hbmFnZXIoKQorICAgICAgICBzZWxmLm5zID0gc2VsZi5tZ3IuTmFtZXNwYWNlKCkKKyAgICAgICAgc2VsZi5ucy50ZXN0ID0gMAorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLm1nci5zaHV0ZG93bigpCisKKyAgICBkZWYgdGVzdF9tYW5hZ2VyX2luaXRpYWxpemVyKHNlbGYpOgorICAgICAgICBtID0gbXVsdGlwcm9jZXNzaW5nLm1hbmFnZXJzLlN5bmNNYW5hZ2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtLnN0YXJ0LCAxKQorICAgICAgICBtLnN0YXJ0KGluaXRpYWxpemVyLCAoc2VsZi5ucywpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnMudGVzdCwgMSkKKyAgICAgICAgbS5zaHV0ZG93bigpCisKKyAgICBkZWYgdGVzdF9wb29sX2luaXRpYWxpemVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG11bHRpcHJvY2Vzc2luZy5Qb29sLCBpbml0aWFsaXplcj0xKQorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlBvb2woMSwgaW5pdGlhbGl6ZXIsIChzZWxmLm5zLCkpCisgICAgICAgIHAuY2xvc2UoKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubnMudGVzdCwgMSkKKworIworIyBJc3N1ZSA1MTU1LCA1MzEzLCA1MzMxOiBUZXN0IHByb2Nlc3MgaW4gcHJvY2Vzc2VzCisjIFZlcmlmaWVzIG9zLmNsb3NlKHN5cy5zdGRpbi5maWxlbm8pIHZzLiBzeXMuc3RkaW4uY2xvc2UoKSBiZWhhdmlvcgorIworCitkZWYgX1RoaXNTdWJQcm9jZXNzKHEpOgorICAgIHRyeToKKyAgICAgICAgaXRlbSA9IHEuZ2V0KGJsb2NrPUZhbHNlKQorICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgcGFzcworCitkZWYgX1Rlc3RQcm9jZXNzKHEpOgorICAgIHF1ZXVlID0gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKKyAgICBzdWJQcm9jID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PV9UaGlzU3ViUHJvY2VzcywgYXJncz0ocXVldWUsKSkKKyAgICBzdWJQcm9jLmRhZW1vbiA9IFRydWUKKyAgICBzdWJQcm9jLnN0YXJ0KCkKKyAgICBzdWJQcm9jLmpvaW4oKQorCitkZWYgX2FmdW5jKHgpOgorICAgIHJldHVybiB4KngKKworZGVmIHBvb2xfaW5fcHJvY2VzcygpOgorICAgIHBvb2wgPSBtdWx0aXByb2Nlc3NpbmcuUG9vbChwcm9jZXNzZXM9NCkKKyAgICB4ID0gcG9vbC5tYXAoX2FmdW5jLCBbMSwgMiwgMywgNCwgNSwgNiwgN10pCisKK2NsYXNzIF9maWxlX2xpa2Uob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVsZWdhdGUpOgorICAgICAgICBzZWxmLl9kZWxlZ2F0ZSA9IGRlbGVnYXRlCisgICAgICAgIHNlbGYuX3BpZCA9IE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjYWNoZShzZWxmKToKKyAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgIyBUaGVyZSBhcmUgbm8gcmFjZSBjb25kaXRpb25zIHNpbmNlIGZvcmsga2VlcHMgb25seSB0aGUgcnVubmluZyB0aHJlYWQKKyAgICAgICAgaWYgcGlkICE9IHNlbGYuX3BpZDoKKyAgICAgICAgICAgIHNlbGYuX3BpZCA9IHBpZAorICAgICAgICAgICAgc2VsZi5fY2FjaGUgPSBbXQorICAgICAgICByZXR1cm4gc2VsZi5fY2FjaGUKKworICAgIGRlZiB3cml0ZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5jYWNoZS5hcHBlbmQoZGF0YSkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5fZGVsZWdhdGUud3JpdGUoJycuam9pbihzZWxmLmNhY2hlKSkKKyAgICAgICAgc2VsZi5fY2FjaGUgPSBbXQorCitjbGFzcyBUZXN0U3RkaW5CYWRmaWxlZGVzY3JpcHRvcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9xdWV1ZV9pbl9wcm9jZXNzKHNlbGYpOgorICAgICAgICBxdWV1ZSA9IG11bHRpcHJvY2Vzc2luZy5RdWV1ZSgpCisgICAgICAgIHByb2MgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9X1Rlc3RQcm9jZXNzLCBhcmdzPShxdWV1ZSwpKQorICAgICAgICBwcm9jLnN0YXJ0KCkKKyAgICAgICAgcHJvYy5qb2luKCkKKworICAgIGRlZiB0ZXN0X3Bvb2xfaW5fcHJvY2VzcyhzZWxmKToKKyAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1wb29sX2luX3Byb2Nlc3MpCisgICAgICAgIHAuc3RhcnQoKQorICAgICAgICBwLmpvaW4oKQorCisgICAgZGVmIHRlc3RfZmx1c2hpbmcoc2VsZik6CisgICAgICAgIHNpbyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZmxpa2UgPSBfZmlsZV9saWtlKHNpbykKKyAgICAgICAgZmxpa2Uud3JpdGUoJ2ZvbycpCisgICAgICAgIHByb2MgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9bGFtYmRhOiBmbGlrZS5mbHVzaCgpKQorICAgICAgICBmbGlrZS5mbHVzaCgpCisgICAgICAgIGFzc2VydCBzaW8uZ2V0dmFsdWUoKSA9PSAnZm9vJworCisjCisjIFRlc3QgaW50ZXJhY3Rpb24gd2l0aCBzb2NrZXQgdGltZW91dHMgLSBzZWUgSXNzdWUgIzYwNTYKKyMKKworY2xhc3MgVGVzdFRpbWVvdXRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgX3Rlc3RfdGltZW91dChjbHMsIGNoaWxkLCBhZGRyZXNzKToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorICAgICAgICBjaGlsZC5zZW5kKDEyMykKKyAgICAgICAgY2hpbGQuY2xvc2UoKQorICAgICAgICBjb25uID0gbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uQ2xpZW50KGFkZHJlc3MpCisgICAgICAgIGNvbm4uc2VuZCg0NTYpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIHRlc3RfdGltZW91dChzZWxmKToKKyAgICAgICAgb2xkX3RpbWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMC4xKQorICAgICAgICAgICAgcGFyZW50LCBjaGlsZCA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKGR1cGxleD1UcnVlKQorICAgICAgICAgICAgbCA9IG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uLkxpc3RlbmVyKGZhbWlseT0nQUZfSU5FVCcpCisgICAgICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXNlbGYuX3Rlc3RfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShjaGlsZCwgbC5hZGRyZXNzKSkKKyAgICAgICAgICAgIHAuc3RhcnQoKQorICAgICAgICAgICAgY2hpbGQuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJlbnQucmVjdigpLCAxMjMpCisgICAgICAgICAgICBwYXJlbnQuY2xvc2UoKQorICAgICAgICAgICAgY29ubiA9IGwuYWNjZXB0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29ubi5yZWN2KCksIDQ1NikKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgbC5jbG9zZSgpCisgICAgICAgICAgICBwLmpvaW4oMTApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQob2xkX3RpbWVvdXQpCisKKyMKKyMgVGVzdCB3aGF0IGhhcHBlbnMgd2l0aCBubyAiaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJyIKKyMKKworY2xhc3MgVGVzdE5vRm9ya0JvbWIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X25vZm9ya2JvbWIoc2VsZik6CisgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgJ21wX2ZvcmtfYm9tYi5weScpCisgICAgICAgIGlmIFdJTjMyOgorICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gdGVzdC5zY3JpcHRfaGVscGVyLmFzc2VydF9weXRob25fZmFpbHVyZShuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgb3V0LmRlY29kZSgnYXNjaWknKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1J1bnRpbWVFcnJvcicsIGVyci5kZWNvZGUoJ2FzY2lpJykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSB0ZXN0LnNjcmlwdF9oZWxwZXIuYXNzZXJ0X3B5dGhvbl9vayhuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTIzJywgb3V0LmRlY29kZSgnYXNjaWknKS5yc3RyaXAoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIGVyci5kZWNvZGUoJ2FzY2lpJykpCisKKyMKKyMgSXNzdWUgMTIwOTg6IGNoZWNrIHN5cy5mbGFncyBvZiBjaGlsZCBtYXRjaGVzIHRoYXQgZm9yIHBhcmVudAorIworCitjbGFzcyBUZXN0RmxhZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBydW5faW5fZ3JhbmRjaGlsZChjbHMsIGNvbm4pOgorICAgICAgICBjb25uLnNlbmQodHVwbGUoc3lzLmZsYWdzKSkKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBydW5faW5fY2hpbGQoY2xzKToKKyAgICAgICAgaW1wb3J0IGpzb24KKyAgICAgICAgciwgdyA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKGR1cGxleD1GYWxzZSkKKyAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1jbHMucnVuX2luX2dyYW5kY2hpbGQsIGFyZ3M9KHcsKSkKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIGdyYW5kY2hpbGRfZmxhZ3MgPSByLnJlY3YoKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICByLmNsb3NlKCkKKyAgICAgICAgdy5jbG9zZSgpCisgICAgICAgIGZsYWdzID0gKHR1cGxlKHN5cy5mbGFncyksIGdyYW5kY2hpbGRfZmxhZ3MpCisgICAgICAgIHByaW50KGpzb24uZHVtcHMoZmxhZ3MpKQorCisgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZik6CisgICAgICAgIGltcG9ydCBqc29uLCBzdWJwcm9jZXNzCisgICAgICAgICMgc3RhcnQgY2hpbGQgcHJvY2VzcyB1c2luZyB1bnVzdWFsIGZsYWdzCisgICAgICAgIHByb2cgPSAoJ2Zyb20gdGVzdC50ZXN0X211bHRpcHJvY2Vzc2luZyBpbXBvcnQgVGVzdEZsYWdzOyAnICsKKyAgICAgICAgICAgICAgICAnVGVzdEZsYWdzLnJ1bl9pbl9jaGlsZCgpJykKKyAgICAgICAgZGF0YSA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAnLUUnLCAnLUInLCAnLU8nLCAnLWMnLCBwcm9nXSkKKyAgICAgICAgY2hpbGRfZmxhZ3MsIGdyYW5kY2hpbGRfZmxhZ3MgPSBqc29uLmxvYWRzKGRhdGEuZGVjb2RlKCdhc2NpaScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNoaWxkX2ZsYWdzLCBncmFuZGNoaWxkX2ZsYWdzKQorCisjCisjIElzc3VlICMxNzU1NTogRm9ya0F3YXJlVGhyZWFkTG9jaworIworCitjbGFzcyBUZXN0Rm9ya0F3YXJlVGhyZWFkTG9jayh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBXZSByZWN1cmlzdmVseSBzdGFydCBwcm9jZXNzZXMuICBJc3N1ZSAjMTc1NTUgbWVhbnQgdGhhdCB0aGUKKyAgICAjIGFmdGVyIGZvcmsgcmVnaXN0cnkgd291bGQgZ2V0IGR1cGxpY2F0ZSBlbnRyaWVzIGZvciB0aGUgc2FtZQorICAgICMgbG9jay4gIFRoZSBzaXplIG9mIHRoZSByZWdpc3RyeSBhdCBnZW5lcmF0aW9uIG4gd2FzIH4yKipuLgorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIGNoaWxkKGNscywgbiwgY29ubik6CisgICAgICAgIGlmIG4gPiAxOgorICAgICAgICAgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1jbHMuY2hpbGQsIGFyZ3M9KG4tMSwgY29ubikpCisgICAgICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgICAgIHAuam9pbigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb25uLnNlbmQobGVuKHV0aWwuX2FmdGVyZm9ya19yZWdpc3RyeSkpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgZGVmIHRlc3RfbG9jayhzZWxmKToKKyAgICAgICAgciwgdyA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKEZhbHNlKQorICAgICAgICBsID0gdXRpbC5Gb3JrQXdhcmVUaHJlYWRMb2NrKCkKKyAgICAgICAgb2xkX3NpemUgPSBsZW4odXRpbC5fYWZ0ZXJmb3JrX3JlZ2lzdHJ5KQorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXNlbGYuY2hpbGQsIGFyZ3M9KDUsIHcpKQorICAgICAgICBwLnN0YXJ0KCkKKyAgICAgICAgbmV3X3NpemUgPSByLnJlY3YoKQorICAgICAgICBwLmpvaW4oKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChuZXdfc2l6ZSwgb2xkX3NpemUpCisKKyMKKyMKKyMKKwordGVzdGNhc2VzX290aGVyID0gW090aGVyVGVzdCwgVGVzdEludmFsaWRIYW5kbGUsIFRlc3RJbml0aWFsaXplcnMsCisgICAgICAgICAgICAgICAgICAgVGVzdFN0ZGluQmFkZmlsZWRlc2NyaXB0b3IsIFRlc3RUaW1lb3V0cywgVGVzdE5vRm9ya0JvbWIsCisgICAgICAgICAgICAgICAgICAgVGVzdEZsYWdzLCBUZXN0Rm9ya0F3YXJlVGhyZWFkTG9ja10KKworIworIworIworCitkZWYgdGVzdF9tYWluKHJ1bj1Ob25lKToKKyAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgibGludXgiKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9jayA9IG11bHRpcHJvY2Vzc2luZy5STG9jaygpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIk9TRXJyb3IgcmFpc2VzIG9uIFJMb2NrIGNyZWF0aW9uLCBzZWUgaXNzdWUgMzExMSEiKQorCisgICAgY2hlY2tfZW5vdWdoX3NlbWFwaG9yZXMoKQorCisgICAgaWYgcnVuIGlzIE5vbmU6CisgICAgICAgIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCBhcyBydW4KKworICAgIHV0aWwuZ2V0X3RlbXBfZGlyKCkgICAgICMgY3JlYXRlcyB0ZW1wIGRpcmVjdG9yeSBmb3IgdXNlIGJ5IGFsbCBwcm9jZXNzZXMKKworICAgIG11bHRpcHJvY2Vzc2luZy5nZXRfbG9nZ2VyKCkuc2V0TGV2ZWwoTE9HX0xFVkVMKQorCisgICAgUHJvY2Vzc2VzTWl4aW4ucG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKDQpCisgICAgVGhyZWFkc01peGluLnBvb2wgPSBtdWx0aXByb2Nlc3NpbmcuZHVtbXkuUG9vbCg0KQorICAgIE1hbmFnZXJNaXhpbi5tYW5hZ2VyLl9faW5pdF9fKCkKKyAgICBNYW5hZ2VyTWl4aW4ubWFuYWdlci5zdGFydCgpCisgICAgTWFuYWdlck1peGluLnBvb2wgPSBNYW5hZ2VyTWl4aW4ubWFuYWdlci5Qb29sKDQpCisKKyAgICB0ZXN0Y2FzZXMgPSAoCisgICAgICAgIHNvcnRlZCh0ZXN0Y2FzZXNfcHJvY2Vzc2VzLnZhbHVlcygpLCBrZXk9bGFtYmRhIHRjOnRjLl9fbmFtZV9fKSArCisgICAgICAgIHNvcnRlZCh0ZXN0Y2FzZXNfdGhyZWFkcy52YWx1ZXMoKSwga2V5PWxhbWJkYSB0Yzp0Yy5fX25hbWVfXykgKworICAgICAgICBzb3J0ZWQodGVzdGNhc2VzX21hbmFnZXIudmFsdWVzKCksIGtleT1sYW1iZGEgdGM6dGMuX19uYW1lX18pICsKKyAgICAgICAgdGVzdGNhc2VzX290aGVyCisgICAgICAgICkKKworICAgIGxvYWRUZXN0c0Zyb21UZXN0Q2FzZSA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKGxvYWRUZXN0c0Zyb21UZXN0Q2FzZSh0YykgZm9yIHRjIGluIHRlc3RjYXNlcykKKyAgICAjIChuY29naGxhbik6IFdoZXRoZXIgb3Igbm90IHN5cy5leGNfY2xlYXIgaXMgZXhlY3V0ZWQgYnkgdGhlIHRocmVhZGluZworICAgICMgbW9kdWxlIGR1cmluZyB0aGVzZSB0ZXN0cyBpcyBhdCBsZWFzdCBwbGF0Zm9ybSBkZXBlbmRlbnQgYW5kIHBvc3NpYmx5CisgICAgIyBub24tZGV0ZXJtaW5pc3RpYyBvbiBhbnkgZ2l2ZW4gcGxhdGZvcm0uIFNvIHdlIGRvbid0IG1pbmQgaWYgdGhlIGxpc3RlZAorICAgICMgd2FybmluZ3MgYXJlbid0IGFjdHVhbGx5IHJhaXNlZC4KKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCIuK19fKGdldHxzZXQpc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgIChyInN5cy5leGNfY2xlYXJcKFwpIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpLAorICAgICAgICAgICAgcXVpZXQ9VHJ1ZSk6CisgICAgICAgIHJ1bihzdWl0ZSkKKworICAgIFRocmVhZHNNaXhpbi5wb29sLnRlcm1pbmF0ZSgpCisgICAgUHJvY2Vzc2VzTWl4aW4ucG9vbC50ZXJtaW5hdGUoKQorICAgIE1hbmFnZXJNaXhpbi5wb29sLnRlcm1pbmF0ZSgpCisgICAgTWFuYWdlck1peGluLm1hbmFnZXIuc2h1dGRvd24oKQorCisgICAgZGVsIFByb2Nlc3Nlc01peGluLnBvb2wsIFRocmVhZHNNaXhpbi5wb29sLCBNYW5hZ2VyTWl4aW4ucG9vbAorCitkZWYgbWFpbigpOgorICAgIHRlc3RfbWFpbih1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikucnVuKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5NWJkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXVsdGlwcm9jZXNzaW5nLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiNTQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0YW50cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljMzgxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHkKQEAgLTAsMCArMSwyOTIgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIFRFU1RGTgoraW1wb3J0IHJhbmRvbQoraW1wb3J0IG9zCisKKyMgRnJvbSBTRiBidWcgIzQyMjEyMTogIEluc2VjdXJpdGllcyBpbiBkaWN0IGNvbXBhcmlzb24uCisKKyMgU2FmZXR5IG9mIGNvZGUgZG9pbmcgY29tcGFyaXNvbnMgaGFzIGJlZW4gYW4gaGlzdG9yaWNhbCBQeXRob24gd2VhayBzcG90LgorIyBUaGUgcHJvYmxlbSBpcyB0aGF0IGNvbXBhcmlzb24gb2Ygc3RydWN0dXJlcyB3cml0dGVuIGluIEMgKm5hdHVyYWxseSoKKyMgd2FudHMgdG8gaG9sZCBvbiB0byB0aGluZ3MgbGlrZSB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyLCBvciAidGhlCisjIGJpZ2dlc3QiIGNvbnRhaW5lZSBzbyBmYXIsIGFjcm9zcyBhIHRyYXZlcnNhbCBvZiB0aGUgY29udGFpbmVyOyBidXQKKyMgY29kZSB0byBkbyBjb250YWluZWUgY29tcGFyaXNvbnMgY2FuIGNhbGwgYmFjayBpbnRvIFB5dGhvbiBhbmQgbXV0YXRlCisjIHRoZSBjb250YWluZXIgaW4gYXJiaXRyYXJ5IHdheXMgd2hpbGUgdGhlIEMgbG9vcCBpcyBpbiBtaWRzdHJlYW0uICBJZiB0aGUKKyMgQyBjb2RlIGlzbid0IGV4dHJlbWVseSBwYXJhbm9pZCBhYm91dCBkaWdnaW5nIHRoaW5ncyBvdXQgb2YgbWVtb3J5IG9uCisjIGVhY2ggdHJpcCwgYW5kIGFydGlmaWNpYWxseSBib29zdGluZyByZWZjb3VudHMgZm9yIHRoZSBkdXJhdGlvbiwgYW55dGhpbmcKKyMgZnJvbSBpbmZpbml0ZSBsb29wcyB0byBPUyBjcmFzaGVzIGNhbiByZXN1bHQgKHllcywgSSB1c2UgV2luZG93cyA8d2luaz4pLgorIworIyBUaGUgb3RoZXIgcHJvYmxlbSBpcyB0aGF0IGNvZGUgZGVzaWduZWQgdG8gcHJvdm9rZSBhIHdlYWtuZXNzIGlzIHVzdWFsbHkKKyMgd2hpdGUtYm94IGNvZGUsIGFuZCBzbyBjYXRjaGVzIG9ubHkgdGhlIHBhcnRpY3VsYXIgdnVsbmVyYWJpbGl0aWVzIHRoZQorIyBhdXRob3Iga25ldyB0byBwcm90ZWN0IGFnYWluc3QuICBGb3IgZXhhbXBsZSwgUHl0aG9uJ3MgbGlzdC5zb3J0KCkgY29kZQorIyB3ZW50IHRocnUgbWFueSBpdGVyYXRpb25zIGFzIG9uZSAibmV3IiB2dWxuZXJhYmlsaXR5IGFmdGVyIGFub3RoZXIgd2FzCisjIGRpc2NvdmVyZWQuCisjCisjIFNvIHRoZSBkaWN0IGNvbXBhcmlzb24gdGVzdCBoZXJlIHVzZXMgYSBibGFjay1ib3ggYXBwcm9hY2ggaW5zdGVhZCwKKyMgZ2VuZXJhdGluZyBkaWN0cyBvZiB2YXJpb3VzIHNpemVzIGF0IHJhbmRvbSwgYW5kIHBlcmZvcm1pbmcgcmFuZG9tCisjIG11dGF0aW9ucyBvbiB0aGVtIGF0IHJhbmRvbSB0aW1lcy4gIFRoaXMgcHJvdmVkIHZlcnkgZWZmZWN0aXZlLAorIyB0cmlnZ2VyaW5nIGF0IGxlYXN0IHNpeCBkaXN0aW5jdCBmYWlsdXJlIG1vZGVzIHRoZSBmaXJzdCAyMCB0aW1lcyBJCisjIHJhbiBpdC4gIEluZGVlZCwgYXQgdGhlIHN0YXJ0LCB0aGUgZHJpdmVyIG5ldmVyIGdvdCBiZXlvbmQgNiBpdGVyYXRpb25zCisjIGJlZm9yZSB0aGUgdGVzdCBkaWVkLgorCisjIFRoZSBkaWN0cyBhcmUgZ2xvYmFsIHRvIG1ha2UgaXQgZWFzeSB0byBtdXRhdGUgdGhhbSBmcm9tIHdpdGhpbiBmdW5jdGlvbnMuCitkaWN0MSA9IHt9CitkaWN0MiA9IHt9CisKKyMgVGhlIGN1cnJlbnQgc2V0IG9mIGtleXMgaW4gZGljdDEgYW5kIGRpY3QyLiAgVGhlc2UgYXJlIG1hdGVyaWFsaXplZCBhcworIyBsaXN0cyB0byBtYWtlIGl0IGVhc3kgdG8gcGljayBhIGRpY3Qga2V5IGF0IHJhbmRvbS4KK2RpY3Qxa2V5cyA9IFtdCitkaWN0MmtleXMgPSBbXQorCisjIEdsb2JhbCBmbGFnIHRlbGxpbmcgbWF5YmVfbXV0YXRlKCkgd2hldGhlciB0byAqY29uc2lkZXIqIG11dGF0aW5nLgorbXV0YXRlID0gMAorCisjIElmIGdsb2JhbCBtdXRhdGUgaXMgdHJ1ZSwgY29uc2lkZXIgbXV0YXRpbmcgYSBkaWN0LiAgTWF5IG9yIG1heSBub3QKKyMgbXV0YXRlIGEgZGljdCBldmVuIGlmIG11dGF0ZSBpcyB0cnVlLiAgSWYgaXQgZG9lcyBkZWNpZGUgdG8gbXV0YXRlIGEKKyMgZGljdCwgaXQgcGlja3Mgb25lIG9mIHtkaWN0MSwgZGljdDJ9IGF0IHJhbmRvbSwgYW5kIGRlbGV0ZXMgYSByYW5kb20KKyMgZW50cnkgZnJvbSBpdDsgb3IsIG1vcmUgcmFyZWx5LCBhZGRzIGEgcmFuZG9tIGVsZW1lbnQuCisKK2RlZiBtYXliZV9tdXRhdGUoKToKKyAgICBnbG9iYWwgbXV0YXRlCisgICAgaWYgbm90IG11dGF0ZToKKyAgICAgICAgcmV0dXJuCisgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgorICAgICAgICByZXR1cm4KKworICAgIGlmIHJhbmRvbS5yYW5kb20oKSA8IDAuNToKKyAgICAgICAgdGFyZ2V0LCBrZXlzID0gZGljdDEsIGRpY3Qxa2V5cworICAgIGVsc2U6CisgICAgICAgIHRhcmdldCwga2V5cyA9IGRpY3QyLCBkaWN0MmtleXMKKworICAgIGlmIHJhbmRvbS5yYW5kb20oKSA8IDAuMjoKKyAgICAgICAgIyBJbnNlcnQgYSBuZXcga2V5LgorICAgICAgICBtdXRhdGUgPSAwICAgIyBkaXNhYmxlIG11dGF0aW9uIHVudGlsIGtleSBpbnNlcnRlZAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbmV3a2V5ID0gSG9ycmlkKHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSkKKyAgICAgICAgICAgIGlmIG5ld2tleSBub3QgaW4gdGFyZ2V0OgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHRhcmdldFtuZXdrZXldID0gSG9ycmlkKHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSkKKyAgICAgICAga2V5cy5hcHBlbmQobmV3a2V5KQorICAgICAgICBtdXRhdGUgPSAxCisKKyAgICBlbGlmIGtleXM6CisgICAgICAgICMgRGVsZXRlIGEga2V5IGF0IHJhbmRvbS4KKyAgICAgICAgbXV0YXRlID0gMCAgICMgZGlzYWJsZSBtdXRhdGlvbiB1bnRpbCBrZXkgZGVsZXRlZAorICAgICAgICBpID0gcmFuZG9tLnJhbmRyYW5nZShsZW4oa2V5cykpCisgICAgICAgIGtleSA9IGtleXNbaV0KKyAgICAgICAgZGVsIHRhcmdldFtrZXldCisgICAgICAgIGRlbCBrZXlzW2ldCisgICAgICAgIG11dGF0ZSA9IDEKKworIyBBIGhvcnJpZCBjbGFzcyB0aGF0IHRyaWdnZXJzIHJhbmRvbSBtdXRhdGlvbnMgb2YgZGljdDEgYW5kIGRpY3QyIHdoZW4KKyMgaW5zdGFuY2VzIGFyZSBjb21wYXJlZC4KKworY2xhc3MgSG9ycmlkOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpKToKKyAgICAgICAgIyBDb21wYXJpc29uIG91dGNvbWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB2YWx1ZSBvZiBpLgorICAgICAgICBzZWxmLmkgPSBpCisKKyAgICAgICAgIyBBbiBhcnRpZmljaWFsIGhhc2hjb2RlIGlzIHNlbGVjdGVkIGF0IHJhbmRvbSBzbyB0aGF0IHdlIGRvbid0CisgICAgICAgICMgaGF2ZSBhbnkgc3lzdGVtYXRpYyByZWxhdGlvbnNoaXAgYmV0d2VlbiBjb21wYXJpc29uIG91dGNvbWVzCisgICAgICAgICMgKGJhc2VkIG9uIHNlbGYuaSBhbmQgb3RoZXIuaSkgYW5kIHJlbGF0aXZlIHBvc2l0aW9uIHdpdGhpbiB0aGUKKyAgICAgICAgIyBoYXNoIHZlY3RvciAoYmFzZWQgb24gaGFzaGNvZGUpLgorICAgICAgICBzZWxmLmhhc2hjb2RlID0gcmFuZG9tLnJhbmRyYW5nZSgxMDAwMDAwMDAwKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFzaGNvZGUKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgbWF5YmVfbXV0YXRlKCkgICAjIFRoZSBwb2ludCBvZiB0aGUgdGVzdC4KKyAgICAgICAgcmV0dXJuIGNtcChzZWxmLmksIG90aGVyLmkpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgbWF5YmVfbXV0YXRlKCkgICAjIFRoZSBwb2ludCBvZiB0aGUgdGVzdC4KKyAgICAgICAgcmV0dXJuIHNlbGYuaSA9PSBvdGhlci5pCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiSG9ycmlkKCVkKSIgJSBzZWxmLmkKKworIyBGaWxsIGRpY3QgZCB3aXRoIG51bWVudHJpZXMgKEhvcnJpZChpKSwgSG9ycmlkKGopKSBrZXktdmFsdWUgcGFpcnMsCisjIHdoZXJlIGkgYW5kIGogYXJlIHNlbGVjdGVkIGF0IHJhbmRvbSBmcm9tIHRoZSBjYW5kaWRhdGVzIGxpc3QuCisjIFJldHVybiBkLmtleXMoKSBhZnRlciBmaWxsaW5nLgorCitkZWYgZmlsbF9kaWN0KGQsIGNhbmRpZGF0ZXMsIG51bWVudHJpZXMpOgorICAgIGQuY2xlYXIoKQorICAgIGZvciBpIGluIHhyYW5nZShudW1lbnRyaWVzKToKKyAgICAgICAgZFtIb3JyaWQocmFuZG9tLmNob2ljZShjYW5kaWRhdGVzKSldID0gXAorICAgICAgICAgICAgSG9ycmlkKHJhbmRvbS5jaG9pY2UoY2FuZGlkYXRlcykpCisgICAgcmV0dXJuIGQua2V5cygpCisKKyMgVGVzdCBvbmUgcGFpciBvZiByYW5kb21seSBnZW5lcmF0ZWQgZGljdHMsIGVhY2ggd2l0aCBuIGVudHJpZXMuCisjIE5vdGUgdGhhdCBkaWN0IGNvbXBhcmlzb24gaXMgdHJpdmlhbCBpZiB0aGV5IGRvbid0IGhhdmUgdGhlIHNhbWUgbnVtYmVyCisjIG9mIGVudGlyZXMgKHRoZW4gdGhlICJzaG9ydGVyIiBkaWN0IGlzIGluc3RhbnRseSBjb25zaWRlcmVkIHRvIGJlIHRoZQorIyBzbWFsbGVyIG9uZSwgd2l0aG91dCBldmVuIGxvb2tpbmcgYXQgdGhlIGVudHJpZXMpLgorCitkZWYgdGVzdF9vbmUobik6CisgICAgZ2xvYmFsIG11dGF0ZSwgZGljdDEsIGRpY3QyLCBkaWN0MWtleXMsIGRpY3Qya2V5cworCisgICAgIyBGaWxsIHRoZSBkaWN0cyB3aXRob3V0IG11dGF0aW5nIHRoZW0uCisgICAgbXV0YXRlID0gMAorICAgIGRpY3Qxa2V5cyA9IGZpbGxfZGljdChkaWN0MSwgcmFuZ2UobiksIG4pCisgICAgZGljdDJrZXlzID0gZmlsbF9kaWN0KGRpY3QyLCByYW5nZShuKSwgbikKKworICAgICMgRW5hYmxlIG11dGF0aW9uLCB0aGVuIGNvbXBhcmUgdGhlIGRpY3RzIHNvIGxvbmcgYXMgdGhleSBoYXZlIHRoZQorICAgICMgc2FtZSBzaXplLgorICAgIG11dGF0ZSA9IDEKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAidHJ5aW5nIHcvIGxlbmd0aHMiLCBsZW4oZGljdDEpLCBsZW4oZGljdDIpLAorICAgIHdoaWxlIGRpY3QxIGFuZCBsZW4oZGljdDEpID09IGxlbihkaWN0Mik6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiLiIsCisgICAgICAgIGlmIHJhbmRvbS5yYW5kb20oKSA8IDAuNToKKyAgICAgICAgICAgIGMgPSBjbXAoZGljdDEsIGRpY3QyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYyA9IGRpY3QxID09IGRpY3QyCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQKKworIyBSdW4gdGVzdF9vbmUgbiB0aW1lcy4gIEF0IHRoZSBzdGFydCAoYmVmb3JlIHRoZSBidWdzIHdlcmUgZml4ZWQpLCAyMAorIyBjb25zZWN1dGl2ZSBydW5zIG9mIHRoaXMgdGVzdCBlYWNoIGJsZXcgdXAgb24gb3IgYmVmb3JlIHRoZSBzaXh0aCB0aW1lCisjIHRlc3Rfb25lIHdhcyBydW4uICBTbyBuIGRvZXNuJ3QgaGF2ZSB0byBiZSBsYXJnZSB0byBnZXQgYW4gaW50ZXJlc3RpbmcKKyMgdGVzdC4KKyMgT1RPSCwgY2FsbGluZyB3aXRoIGxhcmdlIG4gaXMgYWxzbyBpbnRlcmVzdGluZywgdG8gZW5zdXJlIHRoYXQgdGhlIGZpeGVkCisjIGNvZGUgZG9lc24ndCBob2xkIG9uIHRvIHJlZmNvdW50cyAqdG9vKiBsb25nIChpbiB3aGljaCBjYXNlIG1lbW9yeSB3b3VsZAorIyBsZWFrKS4KKworZGVmIHRlc3Qobik6CisgICAgZm9yIGkgaW4geHJhbmdlKG4pOgorICAgICAgICB0ZXN0X29uZShyYW5kb20ucmFuZHJhbmdlKDEsIDEwMCkpCisKKyMgU2VlIGxhc3QgY29tbWVudCBibG9jayBmb3IgY2x1ZXMgYWJvdXQgZ29vZCB2YWx1ZXMgZm9yIG4uCit0ZXN0KDEwMCkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQW5vdGhlciBzZWdmYXVsdCBidWcsIGRpc3RpbGxlZCBieSBNaWNoYWVsIEh1ZHNvbiBmcm9tIGEgYy5sLnB5IHBvc3QuCisKK2NsYXNzIENoaWxkOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgorICAgICAgICBzZWxmLl9fZGljdF9fWydwYXJlbnQnXSA9IHBhcmVudAorICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgc2VsZi5wYXJlbnQuYSA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuYiA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuYyA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuZCA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuZSA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuZiA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuZyA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuaCA9IDEKKyAgICAgICAgc2VsZi5wYXJlbnQuaSA9IDEKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5wYXJlbnQsIGF0dHIpCisKK2NsYXNzIFBhcmVudDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYSA9IENoaWxkKHNlbGYpCisKKyMgSGFyZCB0byBzYXkgd2hhdCB0aGlzIHdpbGwgcHJpbnQhICBNYXkgdmFyeSBmcm9tIHRpbWUgdG8gdGltZS4gIEJ1dAorIyB3ZSdyZSBzcGVjaWZpY2FsbHkgdHJ5aW5nIHRvIHRlc3QgdGhlIHRwX3ByaW50IHNsb3QgaGVyZSwgYW5kIHRoaXMgaXMKKyMgdGhlIGNsZWFyZXN0IHdheSB0byBkbyBpdC4gIFdlIHByaW50IHRoZSByZXN1bHQgdG8gYSB0ZW1wIGZpbGUgc28gdGhhdAorIyB0aGUgZXhwZWN0ZWQtb3V0cHV0IGZpbGUgZG9lc24ndCBuZWVkIHRvIGNoYW5nZS4KKworZiA9IG9wZW4oVEVTVEZOLCAidyIpCitwcmludCA+PiBmLCBQYXJlbnQoKS5fX2RpY3RfXworZi5jbG9zZSgpCitvcy51bmxpbmsoVEVTVEZOKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBBbmQgYW5vdGhlciBjb3JlLWR1bXBlciBmcm9tIE1pY2hhZWwgSHVkc29uLgorCitkaWN0ID0ge30KKworIyBGb3JjZSBkaWN0IHRvIG1hbGxvYyBpdHMgdGFibGUuCitmb3IgaSBpbiByYW5nZSgxLCAxMCk6CisgICAgZGljdFtpXSA9IGkKKworZiA9IG9wZW4oVEVTVEZOLCAidyIpCisKK2NsYXNzIE1hY2hpYXZlbGxpOgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgZGljdC5jbGVhcigpCisKKyAgICAgICAgIyBNaWNoYWVsIHNlejogICJkb2Vzbid0IGNyYXNoIHdpdGhvdXQgdGhpcy4gIGRvbid0IGtub3cgd2h5LiIKKyAgICAgICAgIyBUaW0gc2V6OiAgImx1Y2sgb2YgdGhlIGRyYXc7IGNyYXNoZXMgd2l0aCBvciB3aXRob3V0IGZvciBtZS4iCisgICAgICAgIHByaW50ID4+IGYKKworICAgICAgICByZXR1cm4gcmVwcigibWFjaGlhdmVsbGkiKQorCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gMAorCitkaWN0W01hY2hpYXZlbGxpKCldID0gTWFjaGlhdmVsbGkoKQorCitwcmludCA+PiBmLCBzdHIoZGljdCkKK2YuY2xvc2UoKQorb3MudW5saW5rKFRFU1RGTikKK2RlbCBmLCBkaWN0CisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQW5kIGFub3RoZXIgY29yZS1kdW1wZXIgZnJvbSBNaWNoYWVsIEh1ZHNvbi4KKworZGljdCA9IHt9CisKKyMgbGV0J3MgZm9yY2UgZGljdCB0byBtYWxsb2MgaXRzIHRhYmxlCitmb3IgaSBpbiByYW5nZSgxLCAxMCk6CisgICAgZGljdFtpXSA9IGkKKworY2xhc3MgTWFjaGlhdmVsbGkyOgorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBkaWN0LmNsZWFyKCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworZGljdFtNYWNoaWF2ZWxsaTIoKV0gPSBNYWNoaWF2ZWxsaTIoKQorCit0cnk6CisgICAgZGljdFtNYWNoaWF2ZWxsaTIoKV0KK2V4Y2VwdCBLZXlFcnJvcjoKKyAgICBwYXNzCisKK2RlbCBkaWN0CisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFuZCBhbm90aGVyIGNvcmUtZHVtcGVyIGZyb20gTWljaGFlbCBIdWRzb24uCisKK2RpY3QgPSB7fQorCisjIGxldCdzIGZvcmNlIGRpY3QgdG8gbWFsbG9jIGl0cyB0YWJsZQorZm9yIGkgaW4gcmFuZ2UoMSwgMTApOgorICAgIGRpY3RbaV0gPSBpCisKK2NsYXNzIE1hY2hpYXZlbGxpMzoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaWQpOgorICAgICAgICBzZWxmLmlkID0gaWQKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBzZWxmLmlkID09IG90aGVyLmlkOgorICAgICAgICAgICAgZGljdC5jbGVhcigpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyglcykiJShzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5pZCkKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworZGljdFtNYWNoaWF2ZWxsaTMoMSldID0gTWFjaGlhdmVsbGkzKDApCitkaWN0W01hY2hpYXZlbGxpMygyKV0gPSBNYWNoaWF2ZWxsaTMoMCkKKworZiA9IG9wZW4oVEVTVEZOLCAidyIpCit0cnk6CisgICAgdHJ5OgorICAgICAgICBwcmludCA+PiBmLCBkaWN0W01hY2hpYXZlbGxpMygyKV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHBhc3MKK2ZpbmFsbHk6CisgICAgZi5jbG9zZSgpCisgICAgb3MudW5saW5rKFRFU1RGTikKKworZGVsIGRpY3QKK2RlbCBkaWN0MSwgZGljdDIsIGRpY3Qxa2V5cywgZGljdDJrZXlzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRhbnRzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzQwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRhbnRzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRhbnRzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGFudHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzQwYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRhbnRzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRleC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGV4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDA4MGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9tdXRleC5weQpAQCAtMCwwICsxLDM1IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorCittdXRleCA9IHRlc3QudGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoIm11dGV4IiwgZGVwcmVjYXRlZD1UcnVlKQorCitjbGFzcyBNdXRleFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfbG9ja19hbmRfdW5sb2NrKHNlbGYpOgorCisgICAgICAgIGRlZiBjYWxsZWRfYnlfbXV0ZXgoc29tZV9kYXRhKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29tZV9kYXRhLCAic3BhbSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobS50ZXN0KCksICJtdXRleCBub3QgaGVsZCIpCisgICAgICAgICAgICAjIE5lc3RlZCBsb2NraW5nCisgICAgICAgICAgICBtLmxvY2soY2FsbGVkX2J5X211dGV4MiwgImVnZ3MiKQorCisgICAgICAgIGRlZiBjYWxsZWRfYnlfbXV0ZXgyKHNvbWVfZGF0YSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvbWVfZGF0YSwgImVnZ3MiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0udGVzdCgpLCAibXV0ZXggbm90IGhlbGQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlYWR5X2Zvcl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsZWRfYnlfbXV0ZXgyIGNhbGxlZCB0b28gc29vbiIpCisKKyAgICAgICAgbSA9IG11dGV4Lm11dGV4KCkKKyAgICAgICAgcmVhZF9mb3JfMiA9IEZhbHNlCisgICAgICAgIG0ubG9jayhjYWxsZWRfYnlfbXV0ZXgsICJzcGFtIikKKyAgICAgICAgcmVhZHlfZm9yXzIgPSBUcnVlCisgICAgICAgICMgdW5sb2NrIGJvdGggbG9ja3MKKyAgICAgICAgbS51bmxvY2soKQorICAgICAgICBtLnVubG9jaygpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobS50ZXN0KCksICJtdXRleCBzdGlsbCBoZWxkIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChNdXRleFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGV4LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGV4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg2YjFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0ZXgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGV4LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X211dGV4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg2YjFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbXV0ZXgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV0cmMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5CkBAIC0wLDAgKzEsMTEwIEBACitpbXBvcnQgbmV0cmMsIG9zLCB1bml0dGVzdCwgc3lzLCB0ZXh0d3JhcAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKwordGVtcF9maWxlbmFtZSA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKworY2xhc3MgTmV0cmNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIG9zLnVubGluayh0ZW1wX2ZpbGVuYW1lKQorCisgICAgZGVmIG1ha2VfbnJjKHNlbGYsIHRlc3RfZGF0YSk6CisgICAgICAgIHRlc3RfZGF0YSA9IHRleHR3cmFwLmRlZGVudCh0ZXN0X2RhdGEpCisgICAgICAgIG1vZGUgPSAndycKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtICE9ICdjeWd3aW4nOgorICAgICAgICAgICAgbW9kZSArPSAndCcKKyAgICAgICAgd2l0aCBvcGVuKHRlbXBfZmlsZW5hbWUsIG1vZGUpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUodGVzdF9kYXRhKQorICAgICAgICByZXR1cm4gbmV0cmMubmV0cmModGVtcF9maWxlbmFtZSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIG5yYyA9IHNlbGYubWFrZV9ucmMoIiIiXAorICAgICAgICAgICAgbWFjaGluZSBob3N0MS5kb21haW4uY29tIGxvZ2luIGxvZzEgcGFzc3dvcmQgcGFzczEgYWNjb3VudCBhY2N0MQorICAgICAgICAgICAgZGVmYXVsdCBsb2dpbiBsb2cyIHBhc3N3b3JkIHBhc3MyCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnJjLmhvc3RzWydob3N0MS5kb21haW4uY29tJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdsb2cxJywgJ2FjY3QxJywgJ3Bhc3MxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnJjLmhvc3RzWydkZWZhdWx0J10sICgnbG9nMicsIE5vbmUsICdwYXNzMicpKQorCisgICAgZGVmIHRlc3RfbWFjcm9zKHNlbGYpOgorICAgICAgICBucmMgPSBzZWxmLm1ha2VfbnJjKCIiIlwKKyAgICAgICAgICAgIG1hY2RlZiBtYWNybzEKKyAgICAgICAgICAgIGxpbmUxCisgICAgICAgICAgICBsaW5lMgorCisgICAgICAgICAgICBtYWNkZWYgbWFjcm8yCisgICAgICAgICAgICBsaW5lMworICAgICAgICAgICAgbGluZTQKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucmMubWFjcm9zLCB7J21hY3JvMSc6IFsnbGluZTFcbicsICdsaW5lMlxuJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdtYWNybzInOiBbJ2xpbmUzXG4nLCAnbGluZTRcbiddfSkKKworICAgIGRlZiBfdGVzdF9wYXNzd29yZHMoc2VsZiwgbnJjLCBwYXNzd2QpOgorICAgICAgICBucmMgPSBzZWxmLm1ha2VfbnJjKG5yYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucmMuaG9zdHNbJ2hvc3QuZG9tYWluLmNvbSddLCAoJ2xvZycsICdhY2N0JywgcGFzc3dkKSkKKworICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX3dpdGhfbGVhZGluZ19oYXNoKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3Bhc3N3b3JkcygiIiJcCisgICAgICAgICAgICBtYWNoaW5lIGhvc3QuZG9tYWluLmNvbSBsb2dpbiBsb2cgcGFzc3dvcmQgI3Bhc3MgYWNjb3VudCBhY2N0CisgICAgICAgICAgICAiIiIsICcjcGFzcycpCisKKyAgICBkZWYgdGVzdF9wYXNzd29yZF93aXRoX3RyYWlsaW5nX2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcGFzc3dvcmRzKCIiIlwKKyAgICAgICAgICAgIG1hY2hpbmUgaG9zdC5kb21haW4uY29tIGxvZ2luIGxvZyBwYXNzd29yZCBwYXNzIyBhY2NvdW50IGFjY3QKKyAgICAgICAgICAgICIiIiwgJ3Bhc3MjJykKKworICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX3dpdGhfaW50ZXJuYWxfaGFzaChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9wYXNzd29yZHMoIiIiXAorICAgICAgICAgICAgbWFjaGluZSBob3N0LmRvbWFpbi5jb20gbG9naW4gbG9nIHBhc3N3b3JkIHBhI3NzIGFjY291bnQgYWNjdAorICAgICAgICAgICAgIiIiLCAncGEjc3MnKQorCisgICAgZGVmIF90ZXN0X2NvbW1lbnQoc2VsZiwgbnJjLCBwYXNzd2Q9J3Bhc3MnKToKKyAgICAgICAgbnJjID0gc2VsZi5tYWtlX25yYyhucmMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnJjLmhvc3RzWydmb28uZG9tYWluLmNvbSddLCAoJ2JhcicsIE5vbmUsIHBhc3N3ZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnJjLmhvc3RzWydiYXIuZG9tYWluLmNvbSddLCAoJ2ZvbycsIE5vbmUsICdwYXNzJykpCisKKyAgICBkZWYgdGVzdF9jb21tZW50X2JlZm9yZV9tYWNoaW5lX2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfY29tbWVudCgiIiJcCisgICAgICAgICAgICAjIGNvbW1lbnQKKyAgICAgICAgICAgIG1hY2hpbmUgZm9vLmRvbWFpbi5jb20gbG9naW4gYmFyIHBhc3N3b3JkIHBhc3MKKyAgICAgICAgICAgIG1hY2hpbmUgYmFyLmRvbWFpbi5jb20gbG9naW4gZm9vIHBhc3N3b3JkIHBhc3MKKyAgICAgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRfYmVmb3JlX21hY2hpbmVfbGluZV9ub19zcGFjZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9jb21tZW50KCIiIlwKKyAgICAgICAgICAgICNjb21tZW50CisgICAgICAgICAgICBtYWNoaW5lIGZvby5kb21haW4uY29tIGxvZ2luIGJhciBwYXNzd29yZCBwYXNzCisgICAgICAgICAgICBtYWNoaW5lIGJhci5kb21haW4uY29tIGxvZ2luIGZvbyBwYXNzd29yZCBwYXNzCisgICAgICAgICAgICAiIiIpCisKKyAgICBkZWYgdGVzdF9jb21tZW50X2JlZm9yZV9tYWNoaW5lX2xpbmVfaGFzaF9vbmx5KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2NvbW1lbnQoIiIiXAorICAgICAgICAgICAgIworICAgICAgICAgICAgbWFjaGluZSBmb28uZG9tYWluLmNvbSBsb2dpbiBiYXIgcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgbWFjaGluZSBiYXIuZG9tYWluLmNvbSBsb2dpbiBmb28gcGFzc3dvcmQgcGFzcworICAgICAgICAgICAgIiIiKQorCisgICAgZGVmIHRlc3RfY29tbWVudF9hdF9lbmRfb2ZfbWFjaGluZV9saW5lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2NvbW1lbnQoIiIiXAorICAgICAgICAgICAgbWFjaGluZSBmb28uZG9tYWluLmNvbSBsb2dpbiBiYXIgcGFzc3dvcmQgcGFzcyAjIGNvbW1lbnQKKyAgICAgICAgICAgIG1hY2hpbmUgYmFyLmRvbWFpbi5jb20gbG9naW4gZm9vIHBhc3N3b3JkIHBhc3MKKyAgICAgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRfYXRfZW5kX29mX21hY2hpbmVfbGluZV9ub19zcGFjZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9jb21tZW50KCIiIlwKKyAgICAgICAgICAgIG1hY2hpbmUgZm9vLmRvbWFpbi5jb20gbG9naW4gYmFyIHBhc3N3b3JkIHBhc3MgI2NvbW1lbnQKKyAgICAgICAgICAgIG1hY2hpbmUgYmFyLmRvbWFpbi5jb20gbG9naW4gZm9vIHBhc3N3b3JkIHBhc3MKKyAgICAgICAgICAgICIiIikKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRfYXRfZW5kX29mX21hY2hpbmVfbGluZV9wYXNzX2hhc19oYXNoKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2NvbW1lbnQoIiIiXAorICAgICAgICAgICAgbWFjaGluZSBmb28uZG9tYWluLmNvbSBsb2dpbiBiYXIgcGFzc3dvcmQgI3Bhc3MgI2NvbW1lbnQKKyAgICAgICAgICAgIG1hY2hpbmUgYmFyLmRvbWFpbi5jb20gbG9naW4gZm9vIHBhc3N3b3JkIHBhc3MKKyAgICAgICAgICAgICIiIiwgJyNwYXNzJykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChOZXRyY1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXRyYy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXRyYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1MGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXRyYy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXRyYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1MGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldHJjLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0YjNkMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25ldy5weQpAQCAtMCwwICsxLDE2MyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHN5cworbmV3ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ25ldycsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworY2xhc3MgTmV3VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc3BhbShzZWxmKToKKyAgICAgICAgY2xhc3MgRWdnczoKKyAgICAgICAgICAgIGRlZiBnZXRfeW9sa3Moc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueW9sa3MKKworICAgICAgICBtID0gbmV3Lm1vZHVsZSgnU3BhbScpCisgICAgICAgIG0uRWdncyA9IEVnZ3MKKyAgICAgICAgc3lzLm1vZHVsZXNbJ1NwYW0nXSA9IG0KKyAgICAgICAgaW1wb3J0IFNwYW0KKworICAgICAgICBkZWYgZ2V0X21vcmVfeW9sa3Moc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi55b2xrcyArIDMKKworICAgICAgICAjIG5ldy5jbGFzc29iaigpCisgICAgICAgIEMgPSBuZXcuY2xhc3NvYmooJ1NwYW0nLCAoU3BhbS5FZ2dzLCksIHsnZ2V0X21vcmVfeW9sa3MnOiBnZXRfbW9yZV95b2xrc30pCisKKyAgICAgICAgIyBuZXcuaW5zdGFuY2UoKQorICAgICAgICBjID0gbmV3Lmluc3RhbmNlKEMsIHsneW9sa3MnOiAzfSkKKworICAgICAgICBvID0gbmV3Lmluc3RhbmNlKEMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5fX2RpY3RfXywge30sICJuZXcgX19kaWN0X18gc2hvdWxkIGJlIGVtcHR5IikKKyAgICAgICAgZGVsIG8KKyAgICAgICAgbyA9IG5ldy5pbnN0YW5jZShDLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uX19kaWN0X18sIHt9LCAibmV3IF9fZGljdF9fIHNob3VsZCBiZSBlbXB0eSIpCisgICAgICAgIGRlbCBvCisKKyAgICAgICAgZGVmIGJyZWFrX3lvbGtzKHNlbGYpOgorICAgICAgICAgICAgc2VsZi55b2xrcyA9IHNlbGYueW9sa3MgLSAyCisKKyAgICAgICAgIyBuZXcuaW5zdGFuY2VtZXRob2QoKQorICAgICAgICBpbSA9IG5ldy5pbnN0YW5jZW1ldGhvZChicmVha195b2xrcywgYywgQykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZ2V0X3lvbGtzKCksIDMsCisgICAgICAgICAgICAnQnJva2VuIGNhbGwgb2YgaGFuZC1jcmFmdGVkIGNsYXNzIGluc3RhbmNlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldF9tb3JlX3lvbGtzKCksIDYsCisgICAgICAgICAgICAnQnJva2VuIGNhbGwgb2YgaGFuZC1jcmFmdGVkIGNsYXNzIGluc3RhbmNlJykKKworICAgICAgICBpbSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5nZXRfeW9sa3MoKSwgMSwKKyAgICAgICAgICAgICdCcm9rZW4gY2FsbCBvZiBoYW5kLWNyYWZ0ZWQgaW5zdGFuY2UgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldF9tb3JlX3lvbGtzKCksIDQsCisgICAgICAgICAgICAnQnJva2VuIGNhbGwgb2YgaGFuZC1jcmFmdGVkIGluc3RhbmNlIG1ldGhvZCcpCisKKyAgICAgICAgaW0gPSBuZXcuaW5zdGFuY2VtZXRob2QoYnJlYWtfeW9sa3MsIGMpCisgICAgICAgIGltKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmdldF95b2xrcygpLCAtMSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGRhbmdlcm91cyBpbnN0YW5jZSBtZXRob2QgY3JlYXRpb24gaXMgZm9yYmlkZGVuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbmV3Lmluc3RhbmNlbWV0aG9kLCBicmVha195b2xrcywgTm9uZSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGluc3RhbmNlbWV0aG9kKCkgZG9lc24ndCBhbGxvdyBrZXl3b3JkIGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBuZXcuaW5zdGFuY2VtZXRob2QsIGJyZWFrX3lvbGtzLCBjLCBrdz0xKQorCisgICAgZGVmIHRlc3Rfc2NvcGUoc2VsZik6CisgICAgICAgICMgSXQncyB1bmNsZWFyIHdoYXQgdGhlIHNlbWFudGljcyBzaG91bGQgYmUgZm9yIGEgY29kZSBvYmplY3QgY29tcGlsZWQKKyAgICAgICAgIyBhdCBtb2R1bGUgc2NvcGUsIGJ1dCBib3VuZCBhbmQgcnVuIGluIGEgZnVuY3Rpb24uICBJbiBDUHl0aG9uLCBgYycgaXMKKyAgICAgICAgIyBnbG9iYWwgKGJ5IGFjY2lkZW50Pykgd2hpbGUgaW4gSnl0aG9uLCBgYycgaXMgbG9jYWwuICBUaGUgaW50ZW50IG9mCisgICAgICAgICMgdGhlIHRlc3QgY2xlYXJseSBpcyB0byBtYWtlIGBjJyBnbG9iYWwsIHNvIGxldCdzIGJlIGV4cGxpY2l0IGFib3V0IGl0LgorICAgICAgICBjb2Rlc3RyID0gJycnCisgICAgICAgIGdsb2JhbCBjCisgICAgICAgIGEgPSAxCisgICAgICAgIGIgPSAyCisgICAgICAgIGMgPSBhICsgYgorICAgICAgICAnJycKKworICAgICAgICBjb2Rlc3RyID0gIlxuIi5qb2luKGwuc3RyaXAoKSBmb3IgbCBpbiBjb2Rlc3RyLnNwbGl0bGluZXMoKSkKKworICAgICAgICBjY29kZSA9IGNvbXBpbGUoY29kZXN0ciwgJzxzdHJpbmc+JywgJ2V4ZWMnKQorICAgICAgICAjIEp5dGhvbiBkb2Vzbid0IGhhdmUgYSBfX2J1aWx0aW5zX18sIHNvIHVzZSBhIHBvcnRhYmxlIGFsdGVybmF0aXZlCisgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICBnID0geydjJzogMCwgJ19fYnVpbHRpbnNfXyc6IF9fYnVpbHRpbl9ffQorCisgICAgICAgICMgdGhpcyB0ZXN0IGNvdWxkIGJlIG1vcmUgcm9idXN0CisgICAgICAgIGZ1bmMgPSBuZXcuZnVuY3Rpb24oY2NvZGUsIGcpCisgICAgICAgIGZ1bmMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdbJ2MnXSwgMywgJ0NvdWxkIG5vdCBjcmVhdGUgYSBwcm9wZXIgZnVuY3Rpb24gb2JqZWN0JykKKworICAgIGRlZiB0ZXN0X2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhlIHZhcmlvdXMgZXh0ZW5kZWQgZmxhdm9ycyBvZiBmdW5jdGlvbi5uZXcKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZyh5KToKKyAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgIHJldHVybiBnCisgICAgICAgIGcgPSBmKDQpCisgICAgICAgIG5ldy5mdW5jdGlvbihmLmZ1bmNfY29kZSwge30sICJibGFoIikKKyAgICAgICAgZzIgPSBuZXcuZnVuY3Rpb24oZy5mdW5jX2NvZGUsIHt9LCAiYmxhaCIsICgyLCksIGcuZnVuY19jbG9zdXJlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGcyKCksIDYpCisgICAgICAgIGczID0gbmV3LmZ1bmN0aW9uKGcuZnVuY19jb2RlLCB7fSwgImJsYWgiLCBOb25lLCBnLmZ1bmNfY2xvc3VyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnMyg1KSwgOSkKKyAgICAgICAgZGVmIHRlc3RfY2xvc3VyZShmdW5jLCBjbG9zdXJlLCBleGMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXhjLCBuZXcuZnVuY3Rpb24sIGZ1bmMuZnVuY19jb2RlLCB7fSwgIiIsIE5vbmUsIGNsb3N1cmUpCisKKyAgICAgICAgdGVzdF9jbG9zdXJlKGcsIE5vbmUsIFR5cGVFcnJvcikgIyBpbnZhbGlkIGNsb3N1cmUKKyAgICAgICAgdGVzdF9jbG9zdXJlKGcsICgxLCksIFR5cGVFcnJvcikgIyBub24tY2VsbCBpbiBjbG9zdXJlCisgICAgICAgIHRlc3RfY2xvc3VyZShnLCAoMSwgMSksIFZhbHVlRXJyb3IpICMgY2xvc3VyZSBpcyB3cm9uZyBzaXplCisgICAgICAgIHRlc3RfY2xvc3VyZShmLCBnLmZ1bmNfY2xvc3VyZSwgVmFsdWVFcnJvcikgIyBubyBjbG9zdXJlIG5lZWRlZAorCisgICAgIyBOb3RlOiBKeXRob24gd2lsbCBuZXZlciBoYXZlIG5ldy5jb2RlKCkKKyAgICBpZiBoYXNhdHRyKG5ldywgJ2NvZGUnKToKKyAgICAgICAgZGVmIHRlc3RfY29kZShzZWxmKToKKyAgICAgICAgICAgICMgYm9ndXMgdGVzdCBvZiBuZXcuY29kZSgpCisgICAgICAgICAgICBkZWYgZihhKTogcGFzcworCisgICAgICAgICAgICBjID0gZi5mdW5jX2NvZGUKKyAgICAgICAgICAgIGFyZ2NvdW50ID0gYy5jb19hcmdjb3VudAorICAgICAgICAgICAgbmxvY2FscyA9IGMuY29fbmxvY2FscworICAgICAgICAgICAgc3RhY2tzaXplID0gYy5jb19zdGFja3NpemUKKyAgICAgICAgICAgIGZsYWdzID0gYy5jb19mbGFncworICAgICAgICAgICAgY29kZXN0cmluZyA9IGMuY29fY29kZQorICAgICAgICAgICAgY29uc3RhbnRzID0gYy5jb19jb25zdHMKKyAgICAgICAgICAgIG5hbWVzID0gYy5jb19uYW1lcworICAgICAgICAgICAgdmFybmFtZXMgPSBjLmNvX3Zhcm5hbWVzCisgICAgICAgICAgICBmaWxlbmFtZSA9IGMuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIG5hbWUgPSBjLmNvX25hbWUKKyAgICAgICAgICAgIGZpcnN0bGluZW5vID0gYy5jb19maXJzdGxpbmVubworICAgICAgICAgICAgbG5vdGFiID0gYy5jb19sbm90YWIKKyAgICAgICAgICAgIGZyZWV2YXJzID0gYy5jb19mcmVldmFycworICAgICAgICAgICAgY2VsbHZhcnMgPSBjLmNvX2NlbGx2YXJzCisKKyAgICAgICAgICAgIGQgPSBuZXcuY29kZShhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMsIG5hbWVzLCB2YXJuYW1lcywgZmlsZW5hbWUsIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RsaW5lbm8sIGxub3RhYiwgZnJlZXZhcnMsIGNlbGx2YXJzKQorCisgICAgICAgICAgICAjIHRlc3QgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgdmVyc2lvbiB3aXRoIG5vIGZyZWV2YXJzIG9yIGNlbGx2YXJzCisgICAgICAgICAgICBkID0gbmV3LmNvZGUoYXJnY291bnQsIG5sb2NhbHMsIHN0YWNrc2l6ZSwgZmxhZ3MsIGNvZGVzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RhbnRzLCBuYW1lcywgdmFybmFtZXMsIGZpbGVuYW1lLCBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0bGluZW5vLCBsbm90YWIpCisKKyAgICAgICAgICAgICMgbmVnYXRpdmUgY29fYXJnY291bnQgdXNlZCB0byB0cmlnZ2VyIGEgU3lzdGVtRXJyb3IKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG5ldy5jb2RlLAorICAgICAgICAgICAgICAgIC1hcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKKyAgICAgICAgICAgICAgICBjb25zdGFudHMsIG5hbWVzLCB2YXJuYW1lcywgZmlsZW5hbWUsIG5hbWUsIGZpcnN0bGluZW5vLCBsbm90YWIpCisKKyAgICAgICAgICAgICMgbmVnYXRpdmUgY29fbmxvY2FscyB1c2VkIHRvIHRyaWdnZXIgYSBTeXN0ZW1FcnJvcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbmV3LmNvZGUsCisgICAgICAgICAgICAgICAgYXJnY291bnQsIC1ubG9jYWxzLCBzdGFja3NpemUsIGZsYWdzLCBjb2Rlc3RyaW5nLAorICAgICAgICAgICAgICAgIGNvbnN0YW50cywgbmFtZXMsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwgZmlyc3RsaW5lbm8sIGxub3RhYikKKworICAgICAgICAgICAgIyBub24tc3RyaW5nIGNvX25hbWUgdXNlZCB0byB0cmlnZ2VyIGEgUHlfRmF0YWxFcnJvcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBuZXcuY29kZSwKKyAgICAgICAgICAgICAgICBhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKKyAgICAgICAgICAgICAgICBjb25zdGFudHMsICg1LCksIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwgZmlyc3RsaW5lbm8sIGxub3RhYikKKworICAgICAgICAgICAgIyBuZXcuY29kZSB1c2VkIHRvIGJlIGEgd2F5IHRvIG11dGF0ZSBhIHR1cGxlLi4uCisgICAgICAgICAgICBjbGFzcyBTKHN0cik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdCA9IChTKCJhYiIpLCkKKyAgICAgICAgICAgIGQgPSBuZXcuY29kZShhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMsIHQsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdGxpbmVubywgbG5vdGFiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodFswXSkgaXMgUywgImVlaywgdHVwbGUgY2hhbmdlZCB1bmRlciB1cyEiKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChOZXdUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV3LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYzOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV3LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uZXcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV3LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYzOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbmV3LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uaXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uaXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0OTU1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weQpAQCAtMCwwICsxLDQ0IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK25pcyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCduaXMnKQorCitjbGFzcyBOaXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbWFwcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbWFwcyA9IG5pcy5tYXBzKCkKKyAgICAgICAgZXhjZXB0IG5pcy5lcnJvciwgbXNnOgorICAgICAgICAgICAgIyBOSVMgaXMgcHJvYmFibHkgbm90IGFjdGl2ZSwgc28gdGhpcyB0ZXN0IGlzbid0IHVzZWZ1bAorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIlRlc3QgU2tpcHBlZDoiLCBtc2cKKyAgICAgICAgICAgICMgQ2FuJ3QgcmFpc2UgU2tpcFRlc3QgYXMgcmVncnRlc3Qgb25seSByZWNvZ25pemVzIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICMgICBpbXBvcnQgdGltZS4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIE9uIHNvbWUgc3lzdGVtcywgdGhpcyBtYXAgaXMgb25seSBhY2Nlc3NpYmxlIHRvIHRoZQorICAgICAgICAgICAgIyBzdXBlciB1c2VyCisgICAgICAgICAgICBtYXBzLnJlbW92ZSgicGFzc3dkLmFkanVuY3QuYnluYW1lIikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZG9uZSA9IDAKKyAgICAgICAgZm9yIG5pc21hcCBpbiBtYXBzOgorICAgICAgICAgICAgbWFwcGluZyA9IG5pcy5jYXQobmlzbWFwKQorICAgICAgICAgICAgZm9yIGssIHYgaW4gbWFwcGluZy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBrOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIG5pcy5tYXRjaChrLCBuaXNtYXApICE9IHY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTklTIG1hdGNoIGZhaWxlZCBmb3Iga2V5IGAlcycgaW4gbWFwIGAlcyciICUgKGssIG5pc21hcCkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBqdXN0IHRlc3QgdGhlIG9uZSBrZXksIG90aGVyd2lzZSB0aGlzIHRlc3QgY291bGQgdGFrZSBhCisgICAgICAgICAgICAgICAgICAgICMgdmVyeSBsb25nIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDEKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGRvbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTmlzVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uaXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTdiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uaXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25pcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uaXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZTdiZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9uaXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNDBhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CkBAIC0wLDAgKzEsMTAyIEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIG9wZW5fdXJscmVzb3VyY2UKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGh0dHBsaWIgaW1wb3J0IEhUVFBFeGNlcHRpb24KK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworZnJvbSB1bmljb2RlZGF0YSBpbXBvcnQgbm9ybWFsaXplLCB1bmlkYXRhX3ZlcnNpb24KKworVEVTVERBVEFGSUxFID0gIk5vcm1hbGl6YXRpb25UZXN0LnR4dCIKK1RFU1REQVRBVVJMID0gImh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLyIgKyB1bmlkYXRhX3ZlcnNpb24gKyAiL3VjZC8iICsgVEVTVERBVEFGSUxFCisKK2RlZiBjaGVja192ZXJzaW9uKHRlc3RmaWxlKToKKyAgICBoZHIgPSB0ZXN0ZmlsZS5yZWFkbGluZSgpCisgICAgcmV0dXJuIHVuaWRhdGFfdmVyc2lvbiBpbiBoZHIKKworY2xhc3MgUmFuZ2VFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIE5GQyhzdHIpOgorICAgIHJldHVybiBub3JtYWxpemUoIk5GQyIsIHN0cikKKworZGVmIE5GS0Moc3RyKToKKyAgICByZXR1cm4gbm9ybWFsaXplKCJORktDIiwgc3RyKQorCitkZWYgTkZEKHN0cik6CisgICAgcmV0dXJuIG5vcm1hbGl6ZSgiTkZEIiwgc3RyKQorCitkZWYgTkZLRChzdHIpOgorICAgIHJldHVybiBub3JtYWxpemUoIk5GS0QiLCBzdHIpCisKK2RlZiB1bmlzdHIoZGF0YSk6CisgICAgZGF0YSA9IFtpbnQoeCwgMTYpIGZvciB4IGluIGRhdGEuc3BsaXQoIiAiKV0KKyAgICBmb3IgeCBpbiBkYXRhOgorICAgICAgICBpZiB4ID4gc3lzLm1heHVuaWNvZGU6CisgICAgICAgICAgICByYWlzZSBSYW5nZUVycm9yCisgICAgcmV0dXJuIHUiIi5qb2luKFt1bmljaHIoeCkgZm9yIHggaW4gZGF0YV0pCisKK2NsYXNzIE5vcm1hbGl6YXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9tYWluKHNlbGYpOgorICAgICAgICBwYXJ0ID0gTm9uZQorICAgICAgICBwYXJ0MV9kYXRhID0ge30KKyAgICAgICAgIyBIaXQgdGhlIGV4Y2VwdGlvbiBlYXJseQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0ZGF0YSA9IG9wZW5fdXJscmVzb3VyY2UoVEVTVERBVEFVUkwsIGNoZWNrX3ZlcnNpb24pCisgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgSFRUUEV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJDb3VsZCBub3QgcmV0cmlldmUgIiArIFRFU1REQVRBVVJMKQorICAgICAgICBmb3IgbGluZSBpbiB0ZXN0ZGF0YToKKyAgICAgICAgICAgIGlmICcjJyBpbiBsaW5lOgorICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnNwbGl0KCcjJylbMF0KKyAgICAgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIkBQYXJ0Iik6CisgICAgICAgICAgICAgICAgcGFydCA9IGxpbmUuc3BsaXQoKVswXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYzEsYzIsYzMsYzQsYzUgPSBbdW5pc3RyKHgpIGZvciB4IGluIGxpbmUuc3BsaXQoJzsnKVs6LTFdXQorICAgICAgICAgICAgZXhjZXB0IFJhbmdlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBTa2lwIHVuc3VwcG9ydGVkIGNoYXJhY3RlcnM7CisgICAgICAgICAgICAgICAgIyB0cnkgYXRsZWFzdCBhZGRpbmcgYzEgaWYgd2UgYXJlIGluIHBhcnQxCisgICAgICAgICAgICAgICAgaWYgcGFydCA9PSAiQFBhcnQxIjoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgYzEgPSB1bmlzdHIobGluZS5zcGxpdCgnOycpWzBdKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgUmFuZ2VFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQxX2RhdGFbYzFdID0gMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICMgUGVyZm9ybSB0ZXN0cworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMyID09ICBORkMoYzEpID09ICBORkMoYzIpID09ICBORkMoYzMpLCBsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGM0ID09ICBORkMoYzQpID09ICBORkMoYzUpLCBsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMzID09ICBORkQoYzEpID09ICBORkQoYzIpID09ICBORkQoYzMpLCBsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGM1ID09ICBORkQoYzQpID09ICBORkQoYzUpLCBsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGM0ID09IE5GS0MoYzEpID09IE5GS0MoYzIpID09IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBORktDKGMzKSA9PSBORktDKGM0KSA9PSBORktDKGM1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGM1ID09IE5GS0QoYzEpID09IE5GS0QoYzIpID09IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBORktEKGMzKSA9PSBORktEKGM0KSA9PSBORktEKGM1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKQorCisgICAgICAgICAgICAjIFJlY29yZCBwYXJ0IDEgZGF0YQorICAgICAgICAgICAgaWYgcGFydCA9PSAiQFBhcnQxIjoKKyAgICAgICAgICAgICAgICBwYXJ0MV9kYXRhW2MxXSA9IDEKKworICAgICAgICAjIFBlcmZvcm0gdGVzdHMgZm9yIGFsbCBvdGhlciBkYXRhCisgICAgICAgIGZvciBjIGluIHJhbmdlKHN5cy5tYXh1bmljb2RlKzEpOgorICAgICAgICAgICAgWCA9IHVuaWNocihjKQorICAgICAgICAgICAgaWYgWCBpbiBwYXJ0MV9kYXRhOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoWCA9PSBORkMoWCkgPT0gTkZEKFgpID09IE5GS0MoWCkgPT0gTkZLRChYKSwgYykKKworICAgIGRlZiB0ZXN0X2J1Z184MzQ2NzYoc2VsZik6CisgICAgICAgICMgQ2hlY2sgZm9yIGJ1ZyA4MzQ2NzYKKyAgICAgICAgbm9ybWFsaXplKCdORkMnLCB1J1x1ZDU1Y1x1YWUwMCcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChOb3JtYWxpemF0aW9uVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNlZmRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNlZmRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbnRwYXRoLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfbnRwYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODUyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9udHBhdGgucHkKQEAgLTAsMCArMSwyMDMgQEAKK2ltcG9ydCBudHBhdGgKK2ltcG9ydCBvcworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIHRlc3RfZ2VuZXJpY3BhdGgKK2ltcG9ydCB1bml0dGVzdAorCisKK2RlZiB0ZXN0ZXIoZm4sIHdhbnRSZXN1bHQpOgorICAgIGZuID0gZm4ucmVwbGFjZSgiXFwiLCAiXFxcXCIpCisgICAgZ290UmVzdWx0ID0gZXZhbChmbikKKyAgICBpZiB3YW50UmVzdWx0ICE9IGdvdFJlc3VsdDoKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVzIHNob3VsZCByZXR1cm46ICVzIGJ1dCByZXR1cm5lZDogJXMiIFwKKyAgICAgICAgICAgICAgJShzdHIoZm4pLCBzdHIod2FudFJlc3VsdCksIHN0cihnb3RSZXN1bHQpKQorCisKK2NsYXNzIFRlc3ROdHBhdGgodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3NwbGl0ZXh0KHNlbGYpOgorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgiZm9vLmV4dCIpJywgKCdmb28nLCAnLmV4dCcpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgiL2Zvby9mb28uZXh0IiknLCAoJy9mb28vZm9vJywgJy5leHQnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRleHQoIi5leHQiKScsICgnLmV4dCcsICcnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRleHQoIlxcZm9vLmV4dFxcZm9vIiknLCAoJ1xcZm9vLmV4dFxcZm9vJywgJycpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgiZm9vLmV4dFxcIiknLCAoJ2Zvby5leHRcXCcsICcnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRleHQoIiIpJywgKCcnLCAnJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZXh0KCJmb28uYmFyLmV4dCIpJywgKCdmb28uYmFyJywgJy5leHQnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRleHQoInh4L2Zvby5iYXIuZXh0IiknLCAoJ3h4L2Zvby5iYXInLCAnLmV4dCcpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGV4dCgieHhcXGZvby5iYXIuZXh0IiknLCAoJ3h4XFxmb28uYmFyJywgJy5leHQnKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXRleHQoImM6YS9iXFxjLmQiKScsICgnYzphL2JcXGMnLCAnLmQnKSkKKworICAgIGRlZiB0ZXN0X3NwbGl0ZHJpdmUoc2VsZik6CisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0ZHJpdmUoImM6XFxmb29cXGJhciIpJywKKyAgICAgICAgICAgICAgICgnYzonLCAnXFxmb29cXGJhcicpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdGRyaXZlKCJjOi9mb28vYmFyIiknLAorICAgICAgICAgICAgICAgKCdjOicsICcvZm9vL2JhcicpKQorCisgICAgZGVmIHRlc3Rfc3BsaXR1bmMoc2VsZik6CisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0dW5jKCJcXFxcY29ua3lcXG1vdW50cG9pbnRcXGZvb1xcYmFyIiknLAorICAgICAgICAgICAgICAgKCdcXFxcY29ua3lcXG1vdW50cG9pbnQnLCAnXFxmb29cXGJhcicpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdHVuYygiLy9jb25reS9tb3VudHBvaW50L2Zvby9iYXIiKScsCisgICAgICAgICAgICAgICAoJy8vY29ua3kvbW91bnRwb2ludCcsICcvZm9vL2JhcicpKQorCisgICAgZGVmIHRlc3Rfc3BsaXQoc2VsZik6CisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0KCJjOlxcZm9vXFxiYXIiKScsICgnYzpcXGZvbycsICdiYXInKSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguc3BsaXQoIlxcXFxjb25reVxcbW91bnRwb2ludFxcZm9vXFxiYXIiKScsCisgICAgICAgICAgICAgICAoJ1xcXFxjb25reVxcbW91bnRwb2ludFxcZm9vJywgJ2JhcicpKQorCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0KCJjOlxcIiknLCAoJ2M6XFwnLCAnJykpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0KCJcXFxcY29ua3lcXG1vdW50cG9pbnRcXCIpJywKKyAgICAgICAgICAgICAgICgnXFxcXGNvbmt5XFxtb3VudHBvaW50JywgJycpKQorCisgICAgICAgIHRlc3RlcignbnRwYXRoLnNwbGl0KCJjOi8iKScsICgnYzovJywgJycpKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5zcGxpdCgiLy9jb25reS9tb3VudHBvaW50LyIpJywgKCcvL2Nvbmt5L21vdW50cG9pbnQnLCAnJykpCisKKyAgICBkZWYgdGVzdF9pc2FicyhzZWxmKToKKyAgICAgICAgdGVzdGVyKCdudHBhdGguaXNhYnMoImM6XFwiKScsIDEpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmlzYWJzKCJcXFxcY29ua3lcXG1vdW50cG9pbnRcXCIpJywgMSkKKyAgICAgICAgdGVzdGVyKCdudHBhdGguaXNhYnMoIlxcZm9vIiknLCAxKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5pc2FicygiXFxmb29cXGJhciIpJywgMSkKKworICAgIGRlZiB0ZXN0X2NvbW1vbnByZWZpeChzZWxmKToKKyAgICAgICAgdGVzdGVyKCdudHBhdGguY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbnNvbi9zcGFtIiwgIi9ob21lL3N3ZW4vc3BhbSJdKScsCisgICAgICAgICAgICAgICAiL2hvbWUvc3dlbiIpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmNvbW1vbnByZWZpeChbIlxcaG9tZVxcc3dlblxcc3BhbSIsICJcXGhvbWVcXHN3ZW5cXGVnZ3MiXSknLAorICAgICAgICAgICAgICAgIlxcaG9tZVxcc3dlblxcIikKKyAgICAgICAgdGVzdGVyKCdudHBhdGguY29tbW9ucHJlZml4KFsiL2hvbWUvc3dlbi9zcGFtIiwgIi9ob21lL3N3ZW4vc3BhbSJdKScsCisgICAgICAgICAgICAgICAiL2hvbWUvc3dlbi9zcGFtIikKKworICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oIiIpJywgJycpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oIiIsICIiLCAiIiknLCAnJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYSIpJywgJ2EnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCIvYSIpJywgJy9hJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiXFxhIiknLCAnXFxhJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYToiKScsICdhOicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImE6IiwgImIiKScsICdhOmInKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhOiIsICIvYiIpJywgJ2E6L2InKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhOiIsICJcXGIiKScsICdhOlxcYicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImEiLCAiL2IiKScsICcvYicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImEiLCAiXFxiIiknLCAnXFxiJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYSIsICJiIiwgImMiKScsICdhXFxiXFxjJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGguam9pbigiYVxcIiwgImIiLCAiYyIpJywgJ2FcXGJcXGMnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJhIiwgImJcXCIsICJjIiknLCAnYVxcYlxcYycpCisgICAgICAgIHRlc3RlcignbnRwYXRoLmpvaW4oImEiLCAiYiIsICJcXGMiKScsICdcXGMnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJkOlxcIiwgIlxccGxlZXAiKScsICdkOlxccGxlZXAnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5qb2luKCJkOlxcIiwgImEiLCAiYiIpJywgJ2Q6XFxhXFxiJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzonLCAnL2EnKSIsICdjOi9hJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYzovJywgJy9hJykiLCAnYzovYScpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6L2EnLCAnL2InKSIsICcvYicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6JywgJ2Q6LycpIiwgJ2Q6LycpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2M6LycsICdkOi8nKSIsICdkOi8nKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdjOi8nLCAnZDovYS9iJykiLCAnZDovYS9iJykKKworICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcnKSIsICcnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcnLCAnJywgJycsICcnLCAnJykiLCAnJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYScpIiwgJ2EnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcnLCAnYScpIiwgJ2EnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCcnLCAnJywgJycsICcnLCAnYScpIiwgJ2EnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5qb2luKCdhJywgJycpIiwgJ2FcXCcpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2EnLCAnJywgJycsICcnLCAnJykiLCAnYVxcJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGguam9pbignYVxcJywgJycpIiwgJ2FcXCcpCisgICAgICAgIHRlc3RlcigibnRwYXRoLmpvaW4oJ2FcXCcsICcnLCAnJywgJycsICcnKSIsICdhXFwnKQorCisgICAgZGVmIHRlc3Rfbm9ybXBhdGgoc2VsZik6CisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCdBLy8vLy8vLi8uLy8vLi8vQicpIiwgcidBXEInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnQS8uL0InKSIsIHInQVxCJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0EvZm9vLy4uL0InKSIsIHInQVxCJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0M6QS8vQicpIiwgcidDOkFcQicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCdEOkEvLi9CJykiLCByJ0Q6QVxCJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ2U6QS9mb28vLi4vQicpIiwgcidlOkFcQicpCisKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0M6Ly8vQS8vQicpIiwgcidDOlxBXEInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnRDovLy9BLy4vQicpIiwgcidEOlxBXEInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnZTovLy9BL2Zvby8uLi9CJykiLCByJ2U6XEFcQicpCisKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJy4uJykiLCByJy4uJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJy4nKSIsIHInLicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCcnKSIsIHInLicpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCcvJykiLCAnXFwnKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnYzovJykiLCAnYzpcXCcpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCcvLi4vLi4vLi8uLicpIiwgJ1xcJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ2M6Ly4uLy4uLy4uJykiLCAnYzpcXCcpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCcuLi8uLi8uLy4uJykiLCByJy4uXC4uXC4uJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0s6Li4vLi4vLi8uLicpIiwgcidLOi4uXC4uXC4uJykKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ0M6Ly8vL2EvYicpIiwgcidDOlxhXGInKQorICAgICAgICB0ZXN0ZXIoIm50cGF0aC5ub3JtcGF0aCgnLy9tYWNoaW5lL3NoYXJlLy9hL2InKSIsIHInXFxtYWNoaW5lXHNoYXJlXGFcYicpCisKKyAgICAgICAgdGVzdGVyKCJudHBhdGgubm9ybXBhdGgoJ1xcXFwuXFxOVUwnKSIsIHInXFwuXE5VTCcpCisgICAgICAgIHRlc3RlcigibnRwYXRoLm5vcm1wYXRoKCdcXFxcP1xcRDovWFlcXFonKSIsIHInXFw/XEQ6L1hZXFonKQorCisgICAgZGVmIHRlc3RfZXhwYW5kdmFycyhzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgIGVudi5jbGVhcigpCisgICAgICAgICAgICBlbnZbImZvbyJdID0gImJhciIKKyAgICAgICAgICAgIGVudlsie2ZvbyJdID0gImJhejEiCisgICAgICAgICAgICBlbnZbIntmb299Il0gPSAiYmF6MiIKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoImZvbyIpJywgImZvbyIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIkZm9vIGJhciIpJywgImJhciBiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJHtmb299YmFyIiknLCAiYmFyYmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiRbZm9vXWJhciIpJywgIiRbZm9vXWJhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIkYmFyIGJhciIpJywgIiRiYXIgYmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiQ/YmFyIiknLCAiJD9iYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJHtmb299YmFyIiknLCAiYmFyYmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiRmb299YmFyIiknLCAiYmFyfWJhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIke2ZvbyIpJywgIiR7Zm9vIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiR7e2Zvb319IiknLCAiYmF6MX0iKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJGZvbyRmb28iKScsICJiYXJiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJGJhciRiYXIiKScsICIkYmFyJGJhciIpCisgICAgICAgICAgICB0ZXN0ZXIoJ250cGF0aC5leHBhbmR2YXJzKCIlZm9vJSBiYXIiKScsICJiYXIgYmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiVmb28lYmFyIiknLCAiYmFyYmFyIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiVmb28lJWZvbyUiKScsICJiYXJiYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJSVmb28lJWZvbyVmb28lIiknLCAiJWZvbyVmb29iYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiJT9iYXIlIiknLCAiJT9iYXIlIikKKyAgICAgICAgICAgIHRlc3RlcignbnRwYXRoLmV4cGFuZHZhcnMoIiVmb28lJWJhciIpJywgImJhciViYXIiKQorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguZXhwYW5kdmFycygiXCclZm9vJVwnJWJhciIpJywgIlwnJWZvbyVcJyViYXIiKQorCisgICAgZGVmIHRlc3RfYWJzcGF0aChzZWxmKToKKyAgICAgICAgIyBudHBhdGguYWJzcGF0aCgpIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBzeXN0ZW0gd2l0aCB0aGUgIm50IiBtb2R1bGUKKyAgICAgICAgIyAocmVhc29uYWJseSksIHNvIHdlIHByb3RlY3QgdGhpcyB0ZXN0IHdpdGggImltcG9ydCBudCIuICBUaGlzIGFsbG93cworICAgICAgICAjIHRoZSByZXN0IG9mIHRoZSB0ZXN0cyBmb3IgdGhlIG50cGF0aCBtb2R1bGUgdG8gYmUgcnVuIHRvIGNvbXBsZXRpb24KKyAgICAgICAgIyBvbiBhbnkgcGxhdGZvcm0sIHNpbmNlIG1vc3Qgb2YgdGhlIG1vZHVsZSBpcyBpbnRlbmRlZCB0byBiZSB1c2FibGUKKyAgICAgICAgIyBmcm9tIGFueSBwbGF0Zm9ybS4KKyAgICAgICAgIyBYWFggdGhpcyBuZWVkcyBtb3JlIHRlc3RzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBudAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAjIGNoZWNrIHRoYXQgdGhlIGZ1bmN0aW9uIGlzIHRoZXJlIGV2ZW4gaWYgd2UgYXJlIG5vdCBvbiBXaW5kb3dzCisgICAgICAgICAgICBudHBhdGguYWJzcGF0aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGVzdGVyKCdudHBhdGguYWJzcGF0aCgiQzpcXCIpJywgIkM6XFwiKQorCisgICAgZGVmIHRlc3RfcmVscGF0aChzZWxmKToKKyAgICAgICAgY3VycmVudGRpciA9IG9zLnBhdGguc3BsaXQob3MuZ2V0Y3dkKCkpWy0xXQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCJhIiknLCAnYScpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgob3MucGF0aC5hYnNwYXRoKCJhIikpJywgJ2EnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCJhL2IiKScsICdhXFxiJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiLi4vYS9iIiknLCAnLi5cXGFcXGInKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCJhIiwgIi4uL2IiKScsICcuLlxcJytjdXJyZW50ZGlyKydcXGEnKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCJhL2IiLCAiLi4vYyIpJywgJy4uXFwnK2N1cnJlbnRkaXIrJ1xcYVxcYicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoImEiLCAiYi9jIiknLCAnLi5cXC4uXFxhJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiLy9jb25reS9tb3VudHBvaW50L2EiLCAiLy9jb25reS9tb3VudHBvaW50L2IvYyIpJywgJy4uXFwuLlxcYScpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoImEiLCAiYSIpJywgJy4nKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCIvZm9vL2Jhci9iYXQiLCAiL3gveS96IiknLCAnLi5cXC4uXFwuLlxcZm9vXFxiYXJcXGJhdCcpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIvZm9vL2JhciIpJywgJ2JhdCcpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIvIiknLCAnZm9vXFxiYXJcXGJhdCcpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi8iLCAiL2Zvby9iYXIvYmF0IiknLCAnLi5cXC4uXFwuLicpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIveCIpJywgJy4uXFxmb29cXGJhclxcYmF0JykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiL3giLCAiL2Zvby9iYXIvYmF0IiknLCAnLi5cXC4uXFwuLlxceCcpCisgICAgICAgIHRlc3RlcignbnRwYXRoLnJlbHBhdGgoIi8iLCAiLyIpJywgJy4nKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCIvYSIsICIvYSIpJywgJy4nKQorICAgICAgICB0ZXN0ZXIoJ250cGF0aC5yZWxwYXRoKCIvYS9iIiwgIi9hL2IiKScsICcuJykKKyAgICAgICAgdGVzdGVyKCdudHBhdGgucmVscGF0aCgiYzovZm9vIiwgIkM6L0ZPTyIpJywgJy4nKQorCisKK2NsYXNzIE50Q29tbW9uVGVzdCh0ZXN0X2dlbmVyaWNwYXRoLkNvbW1vblRlc3QpOgorICAgIHBhdGhtb2R1bGUgPSBudHBhdGgKKyAgICBhdHRyaWJ1dGVzID0gWydyZWxwYXRoJywgJ3NwbGl0dW5jJ10KKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0TnRwYXRoLCBOdENvbW1vblRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X250cGF0aC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9udHBhdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWVhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9udHBhdGgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X250cGF0aC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9udHBhdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OWVhM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9udHBhdGgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRiYTljMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5CkBAIC0wLDAgKzEsMTYwIEBACisjIFRoaXMgc2V0IG9mIHRlc3RzIGV4ZXJjaXNlcyB0aGUgYmFja3dhcmQtY29tcGF0aWJpbGl0eSBjbGFzcworIyBpbiBtYWlsYm94LnB5ICh0aGUgb25lcyB3aXRob3V0IHdyaXRlIHN1cHBvcnQpLgorCitpbXBvcnQgbWFpbGJveAoraW1wb3J0IG9zCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIGNsZWFudXAgZWFybGllciB0ZXN0cwordHJ5OgorICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorZXhjZXB0IG9zLmVycm9yOgorICAgIHBhc3MKKworRlJPTV8gPSAiRnJvbSBzb21lLmJvZHlAZHVtbXkuZG9tYWluICBTYXQgSnVsIDI0IDEzOjQzOjM1IDIwMDRcbiIKK0RVTU1ZX01FU1NBR0UgPSAiIiJcCitGcm9tOiBzb21lLmJvZHlAZHVtbXkuZG9tYWluCitUbzogbWVAbXkuZG9tYWluCitTdWJqZWN0OiBTaW1wbGUgVGVzdAorCitUaGlzIGlzIGEgZHVtbXkgbWVzc2FnZS4KKyIiIgorCitjbGFzcyBNYWlsZGlyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIGNyZWF0ZSBhIG5ldyBtYWlsZGlyIG1haWxib3ggdG8gd29yayB3aXRoOgorICAgICAgICBzZWxmLl9kaXIgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIG9zLm1rZGlyKHNlbGYuX2RpcikKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgImN1ciIpKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAidG1wIikpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJuZXciKSkKKyAgICAgICAgc2VsZi5fY291bnRlciA9IDEKKyAgICAgICAgc2VsZi5fbXNnZmlsZXMgPSBbXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBtYXAob3MudW5saW5rLCBzZWxmLl9tc2dmaWxlcykKKyAgICAgICAgb3Mucm1kaXIob3MucGF0aC5qb2luKHNlbGYuX2RpciwgImN1ciIpKQorICAgICAgICBvcy5ybWRpcihvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAidG1wIikpCisgICAgICAgIG9zLnJtZGlyKG9zLnBhdGguam9pbihzZWxmLl9kaXIsICJuZXciKSkKKyAgICAgICAgb3Mucm1kaXIoc2VsZi5fZGlyKQorCisgICAgZGVmIGNyZWF0ZU1lc3NhZ2Uoc2VsZiwgZGlyLCBtYm94PUZhbHNlKToKKyAgICAgICAgdCA9IGludCh0aW1lLnRpbWUoKSAlIDEwMDAwMDApCisgICAgICAgIHBpZCA9IHNlbGYuX2NvdW50ZXIKKyAgICAgICAgc2VsZi5fY291bnRlciArPSAxCisgICAgICAgIGZpbGVuYW1lID0gb3MuZXh0c2VwLmpvaW4oKHN0cih0KSwgc3RyKHBpZCksICJteWhvc3RuYW1lIiwgIm15ZG9tYWluIikpCisgICAgICAgIHRtcG5hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCAidG1wIiwgZmlsZW5hbWUpCisgICAgICAgIG5ld25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5fZGlyLCBkaXIsIGZpbGVuYW1lKQorICAgICAgICB3aXRoIG9wZW4odG1wbmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIHNlbGYuX21zZ2ZpbGVzLmFwcGVuZCh0bXBuYW1lKQorICAgICAgICAgICAgaWYgbWJveDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZShGUk9NXykKKyAgICAgICAgICAgIGZwLndyaXRlKERVTU1ZX01FU1NBR0UpCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6CisgICAgICAgICAgICBvcy5saW5rKHRtcG5hbWUsIG5ld25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aXRoIG9wZW4obmV3bmFtZSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZShEVU1NWV9NRVNTQUdFKQorICAgICAgICBzZWxmLl9tc2dmaWxlcy5hcHBlbmQobmV3bmFtZSkKKyAgICAgICAgcmV0dXJuIHRtcG5hbWUKKworICAgIGRlZiB0ZXN0X2VtcHR5X21haWxkaXIoc2VsZik6CisgICAgICAgICIiIlRlc3QgYW4gZW1wdHkgbWFpbGRpciBtYWlsYm94IiIiCisgICAgICAgICMgVGVzdCBmb3IgcmVncmVzc2lvbiBvbiBidWcgIzExNzQ5MDoKKyAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorCisgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9jdXIoc2VsZik6CisgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIikKKyAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAxKQorICAgICAgICBtc2cgPSBzZWxmLm1ib3gubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cgaXMgbm90IE5vbmUpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX25ldyhzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJuZXciKQorICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3gpID09IDEpCisgICAgICAgIG1zZyA9IHNlbGYubWJveC5uZXh0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZyBpcyBub3QgTm9uZSkKKyAgICAgICAgbXNnLmZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKworICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfYm90aChzZWxmKToKKyAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQorICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCisgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveCkgPT0gMikKKyAgICAgICAgbXNnID0gc2VsZi5tYm94Lm5leHQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnIGlzIG5vdCBOb25lKQorICAgICAgICBtc2cuZnAuY2xvc2UoKQorICAgICAgICBtc2cgPSBzZWxmLm1ib3gubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cgaXMgbm90IE5vbmUpCisgICAgICAgIG1zZy5mcC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF91bml4X21ib3goc2VsZik6CisgICAgICAgICMjIyBzaG91bGQgYmUgYmV0dGVyIQorICAgICAgICBpbXBvcnQgZW1haWwucGFyc2VyCisgICAgICAgIGZuYW1lID0gc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiLCBUcnVlKQorICAgICAgICBuID0gMAorICAgICAgICB3aXRoIG9wZW4oZm5hbWUpIGFzIGY6CisgICAgICAgICAgICBmb3IgbXNnIGluIG1haWxib3guUG9ydGFibGVVbml4TWFpbGJveChmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbC5wYXJzZXIuUGFyc2VyKCkucGFyc2UpOgorICAgICAgICAgICAgICAgIG4gKz0gMQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWyJzdWJqZWN0Il0sICJTaW1wbGUgVGVzdCIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3RyKG1zZykpLCBsZW4oRlJPTV8pK2xlbihEVU1NWV9NRVNTQUdFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuLCAxKQorCitjbGFzcyBNYm94VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBjcmVhdGUgYSBuZXcgbWFpbGRpciBtYWlsYm94IHRvIHdvcmsgd2l0aDoKKyAgICAgICAgc2VsZi5fcGF0aCA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MudW5saW5rKHNlbGYuX3BhdGgpCisKKyAgICBkZWYgdGVzdF9mcm9tX3JlZ2V4IChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIG5ldyByZWdleCBmcm9tIGJ1ZyAjMTYzMzY3OAorICAgICAgICB3aXRoIG9wZW4oc2VsZi5fcGF0aCwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiIiJGcm9tIGZyZWRAZXhhbXBsZS5jb20gTW9uIE1heSAzMSAxMzoyNDo1MCAyMDA0ICswMjAwCitTdWJqZWN0OiBtZXNzYWdlIDEKKworYm9keTEKK0Zyb20gZnJlZEBleGFtcGxlLmNvbSBNb24gTWF5IDMxIDEzOjI0OjUwIDIwMDQgLTAyMDAKK1N1YmplY3Q6IG1lc3NhZ2UgMgorCitib2R5MgorRnJvbSBmcmVkQGV4YW1wbGUuY29tIE1vbiBNYXkgMzEgMTM6MjQ6NTAgMjAwNAorU3ViamVjdDogbWVzc2FnZSAzCisKK2JvZHkzCitGcm9tIGZyZWRAZXhhbXBsZS5jb20gTW9uIE1heSAzMSAxMzoyNDo1MCAyMDA0CitTdWJqZWN0OiBtZXNzYWdlIDQKKworYm9keTQKKyIiIikKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuX3BhdGgsICdyJykgYXMgZjoKKyAgICAgICAgICAgIGJveCA9IG1haWxib3guVW5peE1haWxib3goZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obGlzdChpdGVyKGJveCkpKSA9PSA0KQorCisKKyAgICAjIFhYWCBXZSBzdGlsbCBuZWVkIG1vcmUgdGVzdHMhCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTWFpbGRpclRlc3RDYXNlLCBNYm94VGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzMxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNzMxNjYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wY29kZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxMTdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wY29kZXMucHkKQEAgLTAsMCArMSwxMjEgQEAKKyMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgMiwgb3Bjb2RlcworCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGNoZWNrX3B5M2tfd2FybmluZ3MKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBPcGNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3RyeV9pbnNpZGVfZm9yX2xvb3Aoc2VsZik6CisgICAgICAgIG4gPSAwCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgIG4gPSBuK2kKKyAgICAgICAgICAgIHRyeTogMSAvLyAwCisgICAgICAgICAgICBleGNlcHQgTmFtZUVycm9yOiBwYXNzCisgICAgICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIHRyeTogcGFzcworICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgICAgICB0cnk6IHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6IHBhc3MKKyAgICAgICAgICAgIG4gPSBuK2kKKyAgICAgICAgaWYgbiAhPSA5MDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgndHJ5IGluc2lkZSBmb3InKQorCisgICAgZGVmIHRlc3RfcmFpc2VfY2xhc3NfZXhjZXB0aW9ucyhzZWxmKToKKworICAgICAgICBjbGFzcyBBQ2xhc3M6IHBhc3MKKyAgICAgICAgY2xhc3MgQkNsYXNzKEFDbGFzcyk6IHBhc3MKKyAgICAgICAgY2xhc3MgQ0NsYXNzOiBwYXNzCisgICAgICAgIGNsYXNzIERDbGFzcyhBQ2xhc3MpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlnbm9yZSk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeTogcmFpc2UgQUNsYXNzKCkKKyAgICAgICAgZXhjZXB0OiBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBBQ2xhc3MoKQorICAgICAgICBleGNlcHQgQUNsYXNzOiBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBCQ2xhc3MoKQorICAgICAgICBleGNlcHQgQUNsYXNzOiBwYXNzCisKKyAgICAgICAgdHJ5OiByYWlzZSBCQ2xhc3MoKQorICAgICAgICBleGNlcHQgQ0NsYXNzOiBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQ6IHBhc3MKKworICAgICAgICBhID0gQUNsYXNzKCkKKyAgICAgICAgYiA9IEJDbGFzcygpCisKKyAgICAgICAgdHJ5OiByYWlzZSBBQ2xhc3MsIGIKKyAgICAgICAgZXhjZXB0IEJDbGFzcywgdjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgYikKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgIHRyeTogcmFpc2UgYgorICAgICAgICBleGNlcHQgQUNsYXNzLCB2OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgICMgbm90IGVub3VnaCBhcmd1bWVudHMKKyAgICAgICAgdHJ5OiAgcmFpc2UgQkNsYXNzLCBhCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQorCisgICAgICAgIHRyeTogIHJhaXNlIERDbGFzcywgYQorICAgICAgICBleGNlcHQgRENsYXNzLCB2OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYsIERDbGFzcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfZnVuY3Rpb25fb2JqZWN0cyhzZWxmKToKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYTogTm9uZScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZiwgZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE6IGEnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE6IGEnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGYsIGcpCisKKyAgICAgICAgZiA9IGV2YWwoJ2xhbWJkYSBhPTE6IGEnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE9MTogYScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZiwgZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhOiAwJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYTogMScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZiwgZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhOiBOb25lJykKKyAgICAgICAgZyA9IGV2YWwoJ2xhbWJkYSBhOiBOb25lJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBnKQorCisgICAgICAgIGYgPSBldmFsKCdsYW1iZGEgYTogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYjogTm9uZScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZiwgZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE6IE5vbmUnKQorICAgICAgICBnID0gZXZhbCgnbGFtYmRhIGE9Tm9uZTogTm9uZScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZiwgZykKKworICAgICAgICBmID0gZXZhbCgnbGFtYmRhIGE9MDogTm9uZScpCisgICAgICAgIGcgPSBldmFsKCdsYW1iZGEgYT0xOiBOb25lJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChmLCBnKQorCisgICAgZGVmIHRlc3RfbW9kdWxvX29mX3N0cmluZ19zdWJjbGFzc2VzKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVN0cmluZyhzdHIpOgorICAgICAgICAgICAgZGVmIF9fbW9kX18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE15U3RyaW5nKCkgJSAzLCA0MikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCgiZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjYXRjaGluZyBjbGFzc2VzIHRoYXQgZG9uJ3QgaW5oZXJpdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBCYXNlRXhjZXB0aW9uIGlzIG5vdCBhbGxvd2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBydW5fdW5pdHRlc3QoT3Bjb2RlVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGNvZGVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y3ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGNvZGVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y3ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlbnB0eS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wZW5wdHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNGZlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wZW5wdHkucHkKQEAgLTAsMCArMSwyMyBAQAorIyBUZXN0IHRvIHNlZSBpZiBvcGVucHR5IHdvcmtzLiAoQnV0IGRvbid0IHdvcnJ5IGlmIGl0IGlzbid0IGF2YWlsYWJsZS4pCisKK2ltcG9ydCBvcywgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCitpZiBub3QgaGFzYXR0cihvcywgIm9wZW5wdHkiKToKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIk5vIG9wZW5wdHkoKSBhdmFpbGFibGUuIgorCisKK2NsYXNzIE9wZW5wdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgbWFzdGVyLCBzbGF2ZSA9IG9zLm9wZW5wdHkoKQorICAgICAgICBpZiBub3Qgb3MuaXNhdHR5KHNsYXZlKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2xhdmUtZW5kIG9mIHB0eSBpcyBub3QgYSB0ZXJtaW5hbC4iKQorCisgICAgICAgIG9zLndyaXRlKHNsYXZlLCAnUGluZyEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQobWFzdGVyLCAxMDI0KSwgJ1BpbmchJykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChPcGVucHR5VGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlbnB0eS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVucHR5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTkzMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlbnB0eS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlbnB0eS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVucHR5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTkzMDFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlbnB0eS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE4MDIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKQEAgLTAsMCArMSw1MzIgQEAKK2ltcG9ydCBvcGVyYXRvcgoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFNlcTE6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxzdCk6CisgICAgICAgIHNlbGYubHN0ID0gbHN0CisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5sc3QpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5sc3RbaV0KKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmxzdCArIG90aGVyLmxzdAorICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubHN0ICogb3RoZXIKKyAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgKiBzZWxmLmxzdAorCitjbGFzcyBTZXEyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxzdCk6CisgICAgICAgIHNlbGYubHN0ID0gbHN0CisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5sc3QpCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICByZXR1cm4gc2VsZi5sc3RbaV0KKyAgICBkZWYgX19hZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmxzdCArIG90aGVyLmxzdAorICAgIGRlZiBfX211bF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYubHN0ICogb3RoZXIKKyAgICBkZWYgX19ybXVsX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgKiBzZWxmLmxzdAorCisKK2NsYXNzIE9wZXJhdG9yVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2x0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmx0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmx0LCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubHQoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubHQoMSwgMC4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAxLjApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHQoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sdCgxLCAyLjApKQorCisgICAgZGVmIHRlc3RfbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubGUsIDFqLCAyaikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sZSgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sZSgxLCAwLjApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubGUoMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAxLjApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubGUoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAyLjApKQorCisgICAgZGVmIHRlc3RfZXEoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmVxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuZXEsIEMoKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmVxKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmVxKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5lcSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmVxKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMi4wKSkKKworICAgIGRlZiB0ZXN0X25lKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IubmUsIEMoKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmUoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZSgxLCAwLjApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLm5lKDEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLm5lKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lKDEsIDIuMCkpCisKKyAgICBkZWYgdGVzdF9nZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZSwgMWosIDJqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZ2UoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAwLjApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZ2UoMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAxLjApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmdlKDEsIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmdlKDEsIDIuMCkpCisKKyAgICBkZWYgdGVzdF9ndChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5ndCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5ndCwgMWosIDJqKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZ3QoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5ndCgxLCAwLjApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmd0KDEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmd0KDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMi4wKSkKKworICAgIGRlZiB0ZXN0X2FicyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hYnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWJzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYWJzKC0xKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYWJzKDEpID09IDEpCisKKyAgICBkZWYgdGVzdF9hZGQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFkZCwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmFkZCgzLCA0KSA9PSA3KQorCisgICAgZGVmIHRlc3RfYml0d2lzZV9hbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hbmRfLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYW5kXygweGYsIDB4YSkgPT0gMHhhKQorCisgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoJ3B5JywgJ3Rob24nKSA9PSAncHl0aG9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChbMSwgMl0sIFszLCA0XSkgPT0gWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFNlcTEoWzUsIDZdKSwgU2VxMShbN10pKSA9PSBbNSwgNiwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMihbNSwgNl0pLCBTZXEyKFs3XSkpID09IFs1LCA2LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIDEzLCAyOSkKKworICAgIGRlZiB0ZXN0X2NvdW50T2Yoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY291bnRPZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb3VudE9mLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDMpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgNSkgPT0gMCkKKworICAgIGRlZiB0ZXN0X2RlbGl0ZW0oc2VsZik6CisgICAgICAgIGEgPSBbNCwgMywgMiwgMV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxpdGVtLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFs0LCAyLCAxXSkKKworICAgIGRlZiB0ZXN0X2RlbHNsaWNlKHNlbGYpOgorICAgICAgICBhID0gcmFuZ2UoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGVsc2xpY2UsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGVsc2xpY2UsIGEsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5kZWxzbGljZShhLCAyLCA4KSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMCwgMSwgOCwgOV0pCisgICAgICAgIG9wZXJhdG9yLmRlbHNsaWNlKGEsIDAsIHRlc3Rfc3VwcG9ydC5NQVhfUHlfc3NpemVfdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gW10pCisKKyAgICBkZWYgdGVzdF9kaXYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGl2LCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRpdiwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmZsb29yZGl2KDUsIDIpID09IDIpCisKKyAgICBkZWYgdGVzdF9mbG9vcmRpdihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5mbG9vcmRpdiwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5mbG9vcmRpdiwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmZsb29yZGl2KDUsIDIpID09IDIpCisKKyAgICBkZWYgdGVzdF90cnVlZGl2KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IudHJ1ZWRpdiwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnRydWVkaXYoNSwgMikgPT0gMi41KQorCisgICAgZGVmIHRlc3RfZ2V0aXRlbShzZWxmKToKKyAgICAgICAgYSA9IHJhbmdlKDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgYSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdldGl0ZW0oYSwgMikgPT0gMikKKworICAgIGRlZiB0ZXN0X2dldHNsaWNlKHNlbGYpOgorICAgICAgICBhID0gcmFuZ2UoMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UsIGEsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRzbGljZShhLCA0LCA2KSA9PSBbNCwgNV0pCisgICAgICAgIGIgPSBvcGVyYXRvci5nZXRzbGljZShhLCAwLCB0ZXN0X3N1cHBvcnQuTUFYX1B5X3NzaXplX3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiID09IGEpCisKKyAgICBkZWYgdGVzdF9pbmRleE9mKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZiwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmluZGV4T2YoWzQsIDMsIDIsIDFdLCAzKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBbNCwgMywgMiwgMV0sIDApCisKKyAgICBkZWYgdGVzdF9pbnZlcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW52ZXJ0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmludmVydCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmludig0KSA9PSAtNSkKKworICAgIGRlZiB0ZXN0X2lzQ2FsbGFibGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNDYWxsYWJsZSkKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIGNoZWNrKHNlbGYsIG8sIHYpOgorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXNDYWxsYWJsZShvKSwgdikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhbGxhYmxlKG8pLCB2KQorICAgICAgICBjaGVjayhzZWxmLCA0LCAwKQorICAgICAgICBjaGVjayhzZWxmLCBvcGVyYXRvci5pc0NhbGxhYmxlLCAxKQorICAgICAgICBjaGVjayhzZWxmLCBDLCAxKQorICAgICAgICBjaGVjayhzZWxmLCBDKCksIDApCisKKyAgICBkZWYgdGVzdF9pc01hcHBpbmdUeXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNNYXBwaW5nVHlwZShvcGVyYXRvci5fX2RpY3RfXykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKHt9KSkKKworICAgIGRlZiB0ZXN0X2lzTnVtYmVyVHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc051bWJlclR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc051bWJlclR5cGUoOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc051bWJlclR5cGUoOGopKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDhMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSg4LjMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZShkaXIoKSkpCisKKyAgICBkZWYgdGVzdF9pc1NlcXVlbmNlVHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKGRpcigpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKHhyYW5nZSgxMCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoJ3llYWhidWRkeScpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKDMpKQorICAgICAgICBjbGFzcyBEaWN0KGRpY3QpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoRGljdCgpKSkKKworICAgIGRlZiB0ZXN0X2xzaGlmdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHNoaWZ0LCBOb25lLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSA9PSAxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIDIsIC0xKQorCisgICAgZGVmIHRlc3RfbW9kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tb2QsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubW9kKDUsIDIpID09IDEpCisKKyAgICBkZWYgdGVzdF9tdWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm11bCg1LCAyKSA9PSAxMCkKKworICAgIGRlZiB0ZXN0X25lZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5uZWcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubmVnLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmVnKDUpID09IC01KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmVnKC01KSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmVnKDApID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZWcoLTApID09IDApCisKKyAgICBkZWYgdGVzdF9iaXR3aXNlX29yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm9yXykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8sIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5vcl8oMHhhLCAweDUpID09IDB4ZikKKworICAgIGRlZiB0ZXN0X3BvcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG9zLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG9zKDUpID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5wb3MoLTUpID09IC01KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG9zKDApID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5wb3MoLTApID09IDApCisKKyAgICBkZWYgdGVzdF9wb3coc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG93KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvdywgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnBvdygzLDUpID09IDMqKjUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5fX3Bvd19fKDMsNSkgPT0gMyoqNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3csIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG93LCAxLCAyLCAzKQorCisgICAgZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICAgICBhID0gcmFuZ2UoMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yZXBlYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCBhLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09IFtdKQorICAgICAgICBhID0gKDEsIDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gYSthKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gKCkpCisgICAgICAgIGEgPSAnMTIzJworICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09ICcnKQorICAgICAgICBhID0gU2VxMShbNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gWzQsIDUsIDYsIDQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IFs0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKKyAgICAgICAgYSA9IFNlcTIoWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IFs0LCA1LCA2LCA0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBbNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCA2LCA3KQorCisgICAgZGVmIHRlc3RfcnNoaWZ0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDEpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yc2hpZnQoNSwgMCkgPT0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCAyLCAtMSkKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbnRhaW5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbnRhaW5zLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29udGFpbnMocmFuZ2UoNCksIDIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCA1KSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCA1KSkKKworICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CisgICAgICAgIGEgPSByYW5nZSgzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnNldGl0ZW0oYSwgMCwgMikgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gWzIsIDEsIDJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCA0LCAyKQorCisgICAgZGVmIHRlc3Rfc2V0c2xpY2Uoc2VsZik6CisgICAgICAgIGEgPSByYW5nZSg0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhLCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0c2xpY2UoYSwgMSwgMywgWzIsIDFdKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMCwgMiwgMSwgM10pCisgICAgICAgIG9wZXJhdG9yLnNldHNsaWNlKGEsIDAsIHRlc3Rfc3VwcG9ydC5NQVhfUHlfc3NpemVfdCwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFtdKQorCisgICAgZGVmIHRlc3Rfc3ViKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnN1YikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zdWIoNSwgMikgPT0gMykKKworICAgIGRlZiB0ZXN0X3RydXRoKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnV0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIG9wZXJhdG9yLnRydXRoLCBDKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnV0aCg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnRydXRoKFswXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IudHJ1dGgoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IudHJ1dGgoW10pKQorCisgICAgZGVmIHRlc3RfYml0d2lzZV94b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IueG9yKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvciwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnhvcigweGIsIDB4YykgPT0gMHg3KQorCisgICAgZGVmIHRlc3RfaXMoc2VsZik6CisgICAgICAgIGEgPSBiID0gJ3h5enBkcScKKyAgICAgICAgYyA9IGFbOjNdICsgYlszOl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc18oYSwgYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNfKGEsYykpCisKKyAgICBkZWYgdGVzdF9pc19ub3Qoc2VsZik6CisgICAgICAgIGEgPSBiID0gJ3h5enBkcScKKyAgICAgICAgYyA9IGFbOjNdICsgYlszOl0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc19ub3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNfbm90KGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNfbm90KGEsYykpCisKKyAgICBkZWYgdGVzdF9hdHRyZ2V0dGVyKHNlbGYpOgorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhID0gQSgpCisgICAgICAgIGEubmFtZSA9ICdhcnRodXInCisgICAgICAgIGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCAnYXJ0aHVyJykKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ3JhbmsnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZiwgYSkKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmF0dHJnZXR0ZXIpCisKKyAgICAgICAgIyBtdWx0aXBsZSBnZXRzCisgICAgICAgIHJlY29yZCA9IEEoKQorICAgICAgICByZWNvcmQueCA9ICdYJworICAgICAgICByZWNvcmQueSA9ICdZJworICAgICAgICByZWNvcmQueiA9ICdaJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ3gnLCd6JywneScpKHJlY29yZCksICgnWCcsICdaJywgJ1knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hdHRyZ2V0dGVyKCd4JywgKCksICd5JyksIHJlY29yZCkKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2ZvbycpLCBDKCkpCisKKyAgICAgICAgIyByZWN1cnNpdmUgZ2V0cworICAgICAgICBhID0gQSgpCisgICAgICAgIGEubmFtZSA9ICdhcnRodXInCisgICAgICAgIGEuY2hpbGQgPSBBKCkKKyAgICAgICAgYS5jaGlsZC5uYW1lID0gJ3Rob21hcycKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2NoaWxkLm5hbWUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoYSksICd0aG9tYXMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZiwgYS5jaGlsZCkKKyAgICAgICAgZiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ25hbWUnLCAnY2hpbGQubmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihhKSwgKCdhcnRodXInLCAndGhvbWFzJykpCisgICAgICAgIGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJywgJ2NoaWxkLm5hbWUnLCAnY2hpbGQuY2hpbGQubmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBmLCBhKQorCisgICAgICAgIGEuY2hpbGQuY2hpbGQgPSBBKCkKKyAgICAgICAgYS5jaGlsZC5jaGlsZC5uYW1lID0gJ2pvaG5zb24nCisgICAgICAgIGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKCdjaGlsZC5jaGlsZC5uYW1lJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCAnam9obnNvbicpCisgICAgICAgIGYgPSBvcGVyYXRvci5hdHRyZ2V0dGVyKCduYW1lJywgJ2NoaWxkLm5hbWUnLCAnY2hpbGQuY2hpbGQubmFtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihhKSwgKCdhcnRodXInLCAndGhvbWFzJywgJ2pvaG5zb24nKSkKKworICAgIGRlZiB0ZXN0X2l0ZW1nZXR0ZXIoc2VsZik6CisgICAgICAgIGEgPSAnQUJDREUnCisgICAgICAgIGYgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihhKSwgJ0MnKQorICAgICAgICBmID0gb3BlcmF0b3IuaXRlbWdldHRlcigxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgZiwgYSkKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIG9wZXJhdG9yLml0ZW1nZXR0ZXIoNDIpLCBDKCkpCisKKyAgICAgICAgZiA9IG9wZXJhdG9yLml0ZW1nZXR0ZXIoJ25hbWUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXRlbWdldHRlcikKKworICAgICAgICBkID0gZGljdChrZXk9J3ZhbCcpCisgICAgICAgIGYgPSBvcGVyYXRvci5pdGVtZ2V0dGVyKCdrZXknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoZCksICd2YWwnKQorICAgICAgICBmID0gb3BlcmF0b3IuaXRlbWdldHRlcignbm9ua2V5JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGYsIGQpCisKKyAgICAgICAgIyBleGFtcGxlIHVzZWQgaW4gdGhlIGRvY3MKKyAgICAgICAgaW52ZW50b3J5ID0gWygnYXBwbGUnLCAzKSwgKCdiYW5hbmEnLCAyKSwgKCdwZWFyJywgNSksICgnb3JhbmdlJywgMSldCisgICAgICAgIGdldGNvdW50ID0gb3BlcmF0b3IuaXRlbWdldHRlcigxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hcChnZXRjb3VudCwgaW52ZW50b3J5KSwgWzMsIDIsIDUsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChpbnZlbnRvcnksIGtleT1nZXRjb3VudCksCisgICAgICAgICAgICBbKCdvcmFuZ2UnLCAxKSwgKCdiYW5hbmEnLCAyKSwgKCdhcHBsZScsIDMpLCAoJ3BlYXInLCA1KV0pCisKKyAgICAgICAgIyBtdWx0aXBsZSBnZXRzCisgICAgICAgIGRhdGEgPSBtYXAoc3RyLCByYW5nZSgyMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaXRlbWdldHRlcigyLDEwLDUpKGRhdGEpLCAoJzInLCAnMTAnLCAnNScpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLml0ZW1nZXR0ZXIoMiwgJ3gnLCA1KSwgZGF0YSkKKworICAgIGRlZiB0ZXN0X21ldGhvZGNhbGxlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tZXRob2RjYWxsZXIpCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBkZWYgZm9vKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgICAgIHJldHVybiBhcmdzWzBdICsgYXJnc1sxXQorICAgICAgICAgICAgZGVmIGJhcihzZWxmLCBmPTQyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZgorICAgICAgICBhID0gQSgpCisgICAgICAgIGYgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGYsIGEpCisgICAgICAgIGYgPSBvcGVyYXRvci5tZXRob2RjYWxsZXIoJ2ZvbycsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihhKSwgMykKKyAgICAgICAgZiA9IG9wZXJhdG9yLm1ldGhvZGNhbGxlcignYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKGEpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLCBhLCBhKQorICAgICAgICBmID0gb3BlcmF0b3IubWV0aG9kY2FsbGVyKCdiYXInLCBmPTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZihhKSwgNSkKKworICAgIGRlZiB0ZXN0X2lucGxhY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2lhZGRfXyAgICAgKHNlbGYsIG90aGVyKTogcmV0dXJuICJpYWRkIgorICAgICAgICAgICAgZGVmIF9faWFuZF9fICAgICAoc2VsZiwgb3RoZXIpOiByZXR1cm4gImlhbmQiCisgICAgICAgICAgICBkZWYgX19pZGl2X18gICAgIChzZWxmLCBvdGhlcik6IHJldHVybiAiaWRpdiIKKyAgICAgICAgICAgIGRlZiBfX2lmbG9vcmRpdl9fKHNlbGYsIG90aGVyKTogcmV0dXJuICJpZmxvb3JkaXYiCisgICAgICAgICAgICBkZWYgX19pbHNoaWZ0X18gIChzZWxmLCBvdGhlcik6IHJldHVybiAiaWxzaGlmdCIKKyAgICAgICAgICAgIGRlZiBfX2ltb2RfXyAgICAgKHNlbGYsIG90aGVyKTogcmV0dXJuICJpbW9kIgorICAgICAgICAgICAgZGVmIF9faW11bF9fICAgICAoc2VsZiwgb3RoZXIpOiByZXR1cm4gImltdWwiCisgICAgICAgICAgICBkZWYgX19pb3JfXyAgICAgIChzZWxmLCBvdGhlcik6IHJldHVybiAiaW9yIgorICAgICAgICAgICAgZGVmIF9faXBvd19fICAgICAoc2VsZiwgb3RoZXIpOiByZXR1cm4gImlwb3ciCisgICAgICAgICAgICBkZWYgX19pcnNoaWZ0X18gIChzZWxmLCBvdGhlcik6IHJldHVybiAiaXJzaGlmdCIKKyAgICAgICAgICAgIGRlZiBfX2lzdWJfXyAgICAgKHNlbGYsIG90aGVyKTogcmV0dXJuICJpc3ViIgorICAgICAgICAgICAgZGVmIF9faXRydWVkaXZfXyAoc2VsZiwgb3RoZXIpOiByZXR1cm4gIml0cnVlZGl2IgorICAgICAgICAgICAgZGVmIF9faXhvcl9fICAgICAoc2VsZiwgb3RoZXIpOiByZXR1cm4gIml4b3IiCisgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgb3RoZXIpOiByZXR1cm4gNSAgIyBzbyB0aGF0IEMgaXMgYSBzZXF1ZW5jZQorICAgICAgICBjID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaWFkZCAgICAgKGMsIDUpLCAiaWFkZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaWFuZCAgICAgKGMsIDUpLCAiaWFuZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaWRpdiAgICAgKGMsIDUpLCAiaWRpdiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuaWZsb29yZGl2KGMsIDUpLCAiaWZsb29yZGl2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbHNoaWZ0ICAoYywgNSksICJpbHNoaWZ0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbW9kICAgICAoYywgNSksICJpbW9kIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pbXVsICAgICAoYywgNSksICJpbXVsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pb3IgICAgICAoYywgNSksICJpb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmlwb3cgICAgIChjLCA1KSwgImlwb3ciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmlyc2hpZnQgIChjLCA1KSwgImlyc2hpZnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmlzdWIgICAgIChjLCA1KSwgImlzdWIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLml0cnVlZGl2IChjLCA1KSwgIml0cnVlZGl2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5peG9yICAgICAoYywgNSksICJpeG9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pY29uY2F0ICAoYywgYyksICJpYWRkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5pcmVwZWF0ICAoYywgNSksICJpbXVsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lhZGRfXyAgICAgKGMsIDUpLCAiaWFkZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19pYW5kX18gICAgIChjLCA1KSwgImlhbmQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faWRpdl9fICAgICAoYywgNSksICJpZGl2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lmbG9vcmRpdl9fKGMsIDUpLCAiaWZsb29yZGl2IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lsc2hpZnRfXyAgKGMsIDUpLCAiaWxzaGlmdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19pbW9kX18gICAgIChjLCA1KSwgImltb2QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faW11bF9fICAgICAoYywgNSksICJpbXVsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lvcl9fICAgICAgKGMsIDUpLCAiaW9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2lwb3dfXyAgICAgKGMsIDUpLCAiaXBvdyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19pcnNoaWZ0X18gIChjLCA1KSwgImlyc2hpZnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faXN1Yl9fICAgICAoYywgNSksICJpc3ViIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2l0cnVlZGl2X18gKGMsIDUpLCAiaXRydWVkaXYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLl9faXhvcl9fICAgICAoYywgNSksICJpeG9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVyYXRvci5fX2ljb25jYXRfXyAgKGMsIGMpLCAiaWFkZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BlcmF0b3IuX19pcmVwZWF0X18gIChjLCA1KSwgImltdWwiKQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgaW1wb3J0IHN5cworICAgIHRlc3RfY2xhc3NlcyA9ICgKKyAgICAgICAgT3BlcmF0b3JUZXN0Q2FzZSwKKyAgICApCisKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlcmF0b3IucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlcmF0b3IucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDBlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlcmF0b3IucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3BlcmF0b3IucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDBlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcGVyYXRvci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU1YmI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKQEAgLTAsMCArMSwxNjI2IEBACisjCisjIFRlc3Qgc3VpdGUgZm9yIE9wdGlrLiAgU3VwcGxpZWQgYnkgSm9oYW5uZXMgR2lqc2JlcnMKKyMgKHRhcmFkaW5vQHNvZnRob21lLm5ldCkgLS0gdHJhbnNsYXRlZCBmcm9tIHRoZSBvcmlnaW5hbCBPcHRpaworIyB0ZXN0IHN1aXRlIHRvIHRoaXMgUHlVbml0LWJhc2VkIHZlcnNpb24uCisjCisjICRJZCQKKyMKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBjb3B5CitpbXBvcnQgdHlwZXMKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitmcm9tIG9wdHBhcnNlIGltcG9ydCBtYWtlX29wdGlvbiwgT3B0aW9uLCBcCisgICAgIFRpdGxlZEhlbHBGb3JtYXR0ZXIsIE9wdGlvblBhcnNlciwgT3B0aW9uR3JvdXAsIFwKKyAgICAgU1VQUFJFU1NfVVNBR0UsIE9wdGlvbkVycm9yLCBPcHRpb25Db25mbGljdEVycm9yLCBcCisgICAgIEJhZE9wdGlvbkVycm9yLCBPcHRpb25WYWx1ZUVycm9yLCBWYWx1ZXMKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IF9tYXRjaF9hYmJyZXYKK2Zyb20gb3B0cGFyc2UgaW1wb3J0IF9wYXJzZV9udW0KKworcmV0eXBlID0gdHlwZShyZS5jb21waWxlKCcnKSkKKworY2xhc3MgSW50ZXJjZXB0ZWRFcnJvcihFeGNlcHRpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlPU5vbmUsCisgICAgICAgICAgICAgICAgIGV4aXRfc3RhdHVzPU5vbmUsCisgICAgICAgICAgICAgICAgIGV4aXRfbWVzc2FnZT1Ob25lKToKKyAgICAgICAgc2VsZi5lcnJvcl9tZXNzYWdlID0gZXJyb3JfbWVzc2FnZQorICAgICAgICBzZWxmLmV4aXRfc3RhdHVzID0gZXhpdF9zdGF0dXMKKyAgICAgICAgc2VsZi5leGl0X21lc3NhZ2UgPSBleGl0X21lc3NhZ2UKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lcnJvcl9tZXNzYWdlIG9yIHNlbGYuZXhpdF9tZXNzYWdlIG9yICJpbnRlcmNlcHRlZCBlcnJvciIKKworY2xhc3MgSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKE9wdGlvblBhcnNlcik6CisgICAgZGVmIGV4aXQoc2VsZiwgc3RhdHVzPTAsIG1zZz1Ob25lKToKKyAgICAgICAgcmFpc2UgSW50ZXJjZXB0ZWRFcnJvcihleGl0X3N0YXR1cz1zdGF0dXMsIGV4aXRfbWVzc2FnZT1tc2cpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgbXNnKToKKyAgICAgICAgcmFpc2UgSW50ZXJjZXB0ZWRFcnJvcihlcnJvcl9tZXNzYWdlPW1zZykKKworCitjbGFzcyBCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGFzc2VydFBhcnNlT0soc2VsZiwgYXJncywgZXhwZWN0ZWRfb3B0cywgZXhwZWN0ZWRfcG9zaXRpb25hbF9hcmdzKToKKyAgICAgICAgIiIiQXNzZXJ0IHRoZSBvcHRpb25zIGFyZSB3aGF0IHdlIGV4cGVjdGVkIHdoZW4gcGFyc2luZyBhcmd1bWVudHMuCisKKyAgICAgICAgT3RoZXJ3aXNlLCBmYWlsIHdpdGggYSBuaWNlbHkgZm9ybWF0dGVkIG1lc3NhZ2UuCisKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudHM6CisgICAgICAgIGFyZ3MgLS0gQSBsaXN0IG9mIGFyZ3VtZW50cyB0byBwYXJzZSB3aXRoIE9wdGlvblBhcnNlci4KKyAgICAgICAgZXhwZWN0ZWRfb3B0cyAtLSBUaGUgb3B0aW9ucyBleHBlY3RlZC4KKyAgICAgICAgZXhwZWN0ZWRfcG9zaXRpb25hbF9hcmdzIC0tIFRoZSBwb3NpdGlvbmFsIGFyZ3VtZW50cyBleHBlY3RlZC4KKworICAgICAgICBSZXR1cm5zIHRoZSBvcHRpb25zIGFuZCBwb3NpdGlvbmFsIGFyZ3MgZm9yIGZ1cnRoZXIgdGVzdGluZy4KKyAgICAgICAgIiIiCisKKyAgICAgICAgKG9wdGlvbnMsIHBvc2l0aW9uYWxfYXJncykgPSBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCisgICAgICAgIG9wdGRpY3QgPSB2YXJzKG9wdGlvbnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRkaWN0LCBleHBlY3RlZF9vcHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICIiIgorT3B0aW9ucyBhcmUgJShvcHRkaWN0KXMuCitTaG91bGQgYmUgJShleHBlY3RlZF9vcHRzKXMuCitBcmdzIHdlcmUgJShhcmdzKXMuIiIiICUgbG9jYWxzKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpdGlvbmFsX2FyZ3MsIGV4cGVjdGVkX3Bvc2l0aW9uYWxfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIiIKK1Bvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSAlKHBvc2l0aW9uYWxfYXJncylzLgorU2hvdWxkIGJlICUoZXhwZWN0ZWRfcG9zaXRpb25hbF9hcmdzKXMuCitBcmdzIHdlcmUgJShhcmdzKXMuIiIiICUgbG9jYWxzICgpKQorCisgICAgICAgIHJldHVybiAob3B0aW9ucywgcG9zaXRpb25hbF9hcmdzKQorCisgICAgZGVmIGFzc2VydFJhaXNlcyhzZWxmLAorICAgICAgICAgICAgICAgICAgICAgZnVuYywKKyAgICAgICAgICAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICBrd2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9leGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9tZXNzYWdlKToKKyAgICAgICAgIiIiCisgICAgICAgIEFzc2VydCB0aGF0IHRoZSBleHBlY3RlZCBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gY2FsbGluZyBhCisgICAgICAgIGZ1bmN0aW9uLCBhbmQgdGhhdCB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSBpcyBpbmNsdWRlZCB3aXRoCisgICAgICAgIHRoYXQgZXhjZXB0aW9uLgorCisgICAgICAgIEFyZ3VtZW50czoKKyAgICAgICAgICBmdW5jIC0tIHRoZSBmdW5jdGlvbiB0byBjYWxsCisgICAgICAgICAgYXJncyAtLSBwb3NpdGlvbmFsIGFyZ3VtZW50cyB0byBgZnVuY2AKKyAgICAgICAgICBrd2FyZ3MgLS0ga2V5d29yZCBhcmd1bWVudHMgdG8gYGZ1bmNgCisgICAgICAgICAgZXhwZWN0ZWRfZXhjZXB0aW9uIC0tIGV4Y2VwdGlvbiB0aGF0IHNob3VsZCBiZSByYWlzZWQKKyAgICAgICAgICBleHBlY3RlZF9tZXNzYWdlIC0tIGV4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlIChvciBwYXR0ZXJuCisgICAgICAgICAgICBpZiBhIGNvbXBpbGVkIHJlZ2V4IG9iamVjdCkKKworICAgICAgICBSZXR1cm5zIHRoZSBleGNlcHRpb24gcmFpc2VkIGZvciBmdXJ0aGVyIHRlc3RpbmcuCisgICAgICAgICIiIgorICAgICAgICBpZiBhcmdzIGlzIE5vbmU6CisgICAgICAgICAgICBhcmdzID0gKCkKKyAgICAgICAgaWYga3dhcmdzIGlzIE5vbmU6CisgICAgICAgICAgICBrd2FyZ3MgPSB7fQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBleGNlcHQgZXhwZWN0ZWRfZXhjZXB0aW9uLCBlcnI6CisgICAgICAgICAgICBhY3R1YWxfbWVzc2FnZSA9IHN0cihlcnIpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4cGVjdGVkX21lc3NhZ2UsIHJldHlwZSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkX21lc3NhZ2Uuc2VhcmNoKGFjdHVhbF9tZXNzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiXAorZXhwZWN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2UgcGF0dGVybjoKKy8lcy8KK2FjdHVhbCBleGNlcHRpb24gbWVzc2FnZToKKycnJyVzJycnCisiIiIgJSAoZXhwZWN0ZWRfbWVzc2FnZS5wYXR0ZXJuLCBhY3R1YWxfbWVzc2FnZSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiXAorZXhwZWN0ZWQgZXhjZXB0aW9uIG1lc3NhZ2U6CisnJyclcycnJworYWN0dWFsIGV4Y2VwdGlvbiBtZXNzYWdlOgorJycnJXMnJycKKyIiIiAlIChleHBlY3RlZF9tZXNzYWdlLCBhY3R1YWxfbWVzc2FnZSkpCisKKyAgICAgICAgICAgIHJldHVybiBlcnIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiIiJleHBlY3RlZCBleGNlcHRpb24gJShleHBlY3RlZF9leGNlcHRpb24pcyBub3QgcmFpc2VkCitjYWxsZWQgJShmdW5jKXIKK3dpdGggYXJncyAlKGFyZ3MpcgorYW5kIGt3YXJncyAlKGt3YXJncylyCisiIiIgJSBsb2NhbHMgKCkpCisKKworICAgICMgLS0gQXNzZXJ0aW9ucyB1c2VkIGluIG1vcmUgdGhhbiBvbmUgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiBhc3NlcnRQYXJzZUZhaWwoc2VsZiwgY21kbGluZV9hcmdzLCBleHBlY3RlZF9vdXRwdXQpOgorICAgICAgICAiIiIKKyAgICAgICAgQXNzZXJ0IHRoZSBwYXJzZXIgZmFpbHMgd2l0aCB0aGUgZXhwZWN0ZWQgbWVzc2FnZS4gIENhbGxlcgorICAgICAgICBtdXN0IGVuc3VyZSB0aGF0IHNlbGYucGFyc2VyIGlzIGFuIEludGVyY2VwdGluZ09wdGlvblBhcnNlci4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoY21kbGluZV9hcmdzKQorICAgICAgICBleGNlcHQgSW50ZXJjZXB0ZWRFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZXJyb3JfbWVzc2FnZSwgZXhwZWN0ZWRfb3V0cHV0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgiZXhwZWN0ZWQgcGFyc2UgZmFpbHVyZSIpCisKKyAgICBkZWYgYXNzZXJ0T3V0cHV0KHNlbGYsCisgICAgICAgICAgICAgICAgICAgICBjbWRsaW5lX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9zdGF0dXM9MCwKKyAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2Vycm9yPU5vbmUpOgorICAgICAgICAiIiJBc3NlcnQgdGhlIHBhcnNlciBwcmludHMgdGhlIGV4cGVjdGVkIG91dHB1dCBvbiBzdGRvdXQuIiIiCisgICAgICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBlbmNvZGluZyA9IGdldGF0dHIoc2F2ZV9zdGRvdXQsICdlbmNvZGluZycsIE5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKGNtZGxpbmVfYXJncykKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gc3lzLnN0ZG91dC5nZXR2YWx1ZSgpCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNhdmVfc3Rkb3V0CisKKyAgICAgICAgZXhjZXB0IEludGVyY2VwdGVkRXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICB0eXBlKG91dHB1dCkgaXMgdHlwZXMuU3RyaW5nVHlwZSwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgb3V0cHV0IHRvIGJlIGFuIG9yZGluYXJ5IHN0cmluZywgbm90ICVyIgorICAgICAgICAgICAgICAgICUgdHlwZShvdXRwdXQpKQorCisgICAgICAgICAgICBpZiBvdXRwdXQgIT0gZXhwZWN0ZWRfb3V0cHV0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQ6IFxuJycnXG4iICsgZXhwZWN0ZWRfb3V0cHV0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIicnJ1xuYnV0IGdvdCBcbicnJ1xuIiArIG91dHB1dCArICInJyciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuZXhpdF9zdGF0dXMsIGV4cGVjdGVkX3N0YXR1cykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmV4aXRfbWVzc2FnZSwgZXhwZWN0ZWRfZXJyb3IpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCJleHBlY3RlZCBwYXJzZXIuZXhpdCgpIikKKworICAgIGRlZiBhc3NlcnRUeXBlRXJyb3Ioc2VsZiwgZnVuYywgZXhwZWN0ZWRfbWVzc2FnZSwgKmFyZ3MpOgorICAgICAgICAiIiJBc3NlcnQgdGhhdCBUeXBlRXJyb3IgaXMgcmFpc2VkIHdoZW4gZXhlY3V0aW5nIGZ1bmMuIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGZ1bmMsIGFyZ3MsIE5vbmUsIFR5cGVFcnJvciwgZXhwZWN0ZWRfbWVzc2FnZSkKKworICAgIGRlZiBhc3NlcnRIZWxwKHNlbGYsIHBhcnNlciwgZXhwZWN0ZWRfaGVscCk6CisgICAgICAgIGFjdHVhbF9oZWxwID0gcGFyc2VyLmZvcm1hdF9oZWxwKCkKKyAgICAgICAgaWYgYWN0dWFsX2hlbHAgIT0gZXhwZWN0ZWRfaGVscDoKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAnaGVscCB0ZXh0IGZhaWx1cmU7IGV4cGVjdGVkOlxuIicgKworICAgICAgICAgICAgICAgIGV4cGVjdGVkX2hlbHAgKyAnIjsgZ290OlxuIicgKworICAgICAgICAgICAgICAgIGFjdHVhbF9oZWxwICsgJyJcbicpCisKKyMgLS0gVGVzdCBtYWtlX29wdGlvbigpIGFrYSBPcHRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEl0J3Mgbm90IG5lY2Vzc2FyeSB0byB0ZXN0IGNvcnJlY3Qgb3B0aW9ucyBoZXJlLiAgQWxsIHRoZSB0ZXN0cyBpbiB0aGUKKyMgcGFyc2VyLnBhcnNlX2FyZ3MoKSBzZWN0aW9uIGRlYWwgd2l0aCB0aG9zZSwgYmVjYXVzZSB0aGV5J3JlIG5lZWRlZAorIyB0aGVyZS4KKworY2xhc3MgVGVzdE9wdGlvbkNoZWNrcyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKworICAgIGRlZiBhc3NlcnRPcHRpb25FcnJvcihzZWxmLCBleHBlY3RlZF9tZXNzYWdlLCBhcmdzPVtdLCBrd2FyZ3M9e30pOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtYWtlX29wdGlvbiwgYXJncywga3dhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25FcnJvciwgZXhwZWN0ZWRfbWVzc2FnZSkKKworICAgIGRlZiB0ZXN0X29wdF9zdHJpbmdfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKG1ha2Vfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXQgbGVhc3Qgb25lIG9wdGlvbiBzdHJpbmcgbXVzdCBiZSBzdXBwbGllZCIpCisKKyAgICBkZWYgdGVzdF9vcHRfc3RyaW5nX3Rvb19zaG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJpbnZhbGlkIG9wdGlvbiBzdHJpbmcgJ2InOiBtdXN0IGJlIGF0IGxlYXN0IHR3byBjaGFyYWN0ZXJzIGxvbmciLAorICAgICAgICAgICAgWyJiIl0pCisKKyAgICBkZWYgdGVzdF9vcHRfc3RyaW5nX3Nob3J0X2ludmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAiaW52YWxpZCBzaG9ydCBvcHRpb24gc3RyaW5nICctLSc6IG11c3QgYmUgIgorICAgICAgICAgICAgIm9mIHRoZSBmb3JtIC14LCAoeCBhbnkgbm9uLWRhc2ggY2hhcikiLAorICAgICAgICAgICAgWyItLSJdKQorCisgICAgZGVmIHRlc3Rfb3B0X3N0cmluZ19sb25nX2ludmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAiaW52YWxpZCBsb25nIG9wdGlvbiBzdHJpbmcgJy0tLSc6ICIKKyAgICAgICAgICAgICJtdXN0IHN0YXJ0IHdpdGggLS0sIGZvbGxvd2VkIGJ5IG5vbi1kYXNoIiwKKyAgICAgICAgICAgIFsiLS0tIl0pCisKKyAgICBkZWYgdGVzdF9hdHRyX2ludmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBpbnZhbGlkIGtleXdvcmQgYXJndW1lbnRzOiBiYXIsIGZvbyIsCisgICAgICAgICAgICBbIi1iIl0sIHsnZm9vJzogTm9uZSwgJ2Jhcic6IE5vbmV9KQorCisgICAgZGVmIHRlc3RfYWN0aW9uX2ludmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBpbnZhbGlkIGFjdGlvbjogJ2ZvbyciLAorICAgICAgICAgICAgWyItYiJdLCB7J2FjdGlvbic6ICdmb28nfSkKKworICAgIGRlZiB0ZXN0X3R5cGVfaW52YWxpZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IGludmFsaWQgb3B0aW9uIHR5cGU6ICdmb28nIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeyd0eXBlJzogJ2Zvbyd9KQorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYjogaW52YWxpZCBvcHRpb24gdHlwZTogJ3R1cGxlJyIsCisgICAgICAgICAgICBbIi1iIl0sIHsndHlwZSc6IHR1cGxlfSkKKworICAgIGRlZiB0ZXN0X25vX3R5cGVfZm9yX2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6IG11c3Qgbm90IHN1cHBseSBhIHR5cGUgZm9yIGFjdGlvbiAnY291bnQnIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydhY3Rpb24nOiAnY291bnQnLCAndHlwZSc6ICdpbnQnfSkKKworICAgIGRlZiB0ZXN0X25vX2Nob2ljZXNfbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWIvLS1iYWQ6IG11c3Qgc3VwcGx5IGEgbGlzdCBvZiAiCisgICAgICAgICAgICAiY2hvaWNlcyBmb3IgdHlwZSAnY2hvaWNlJyIsCisgICAgICAgICAgICBbIi1iIiwgIi0tYmFkIl0sIHsndHlwZSc6ICJjaG9pY2UifSkKKworICAgIGRlZiB0ZXN0X2JhZF9jaG9pY2VzX2xpc3Qoc2VsZik6CisgICAgICAgIHR5cGVuYW1lID0gdHlwZSgnJykuX19uYW1lX18KKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWIvLS1iYWQ6IGNob2ljZXMgbXVzdCBiZSBhIGxpc3Qgb2YgIgorICAgICAgICAgICAgInN0cmluZ3MgKCclcycgc3VwcGxpZWQpIiAlIHR5cGVuYW1lLAorICAgICAgICAgICAgWyItYiIsICItLWJhZCJdLAorICAgICAgICAgICAgeyd0eXBlJzogImNob2ljZSIsICdjaG9pY2VzJzoiYmFkIGNob2ljZXMifSkKKworICAgIGRlZiB0ZXN0X25vX2Nob2ljZXNfZm9yX3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBtdXN0IG5vdCBzdXBwbHkgY2hvaWNlcyBmb3IgdHlwZSAnaW50JyIsCisgICAgICAgICAgICBbIi1iIl0sIHsndHlwZSc6ICdpbnQnLCAnY2hvaWNlcyc6ImJhZCJ9KQorCisgICAgZGVmIHRlc3Rfbm9fY29uc3RfZm9yX2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPcHRpb25FcnJvcigKKyAgICAgICAgICAgICJvcHRpb24gLWI6ICdjb25zdCcgbXVzdCBub3QgYmUgc3VwcGxpZWQgZm9yIGFjdGlvbiAnc3RvcmUnIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydhY3Rpb24nOiAnc3RvcmUnLCAnY29uc3QnOiAxfSkKKworICAgIGRlZiB0ZXN0X25vX25hcmdzX2Zvcl9hY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiAnbmFyZ3MnIG11c3Qgbm90IGJlIHN1cHBsaWVkIGZvciBhY3Rpb24gJ2NvdW50JyIsCisgICAgICAgICAgICBbIi1iIl0sIHsnYWN0aW9uJzogJ2NvdW50JywgJ25hcmdzJzogMn0pCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19ub3RfY2FsbGFibGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBjYWxsYmFjayBub3QgY2FsbGFibGU6ICdmb28nIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydhY3Rpb24nOiAnY2FsbGJhY2snLAorICAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrJzogJ2Zvbyd9KQorCisgICAgZGVmIGR1bW15KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19hcmdzX25vX3R1cGxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYjogY2FsbGJhY2tfYXJncywgaWYgc3VwcGxpZWQsICIKKyAgICAgICAgICAgICJtdXN0IGJlIGEgdHVwbGU6IG5vdCAnZm9vJyIsCisgICAgICAgICAgICBbIi1iIl0sIHsnYWN0aW9uJzogJ2NhbGxiYWNrJywKKyAgICAgICAgICAgICAgICAgICAgICdjYWxsYmFjayc6IHNlbGYuZHVtbXksCisgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2tfYXJncyc6ICdmb28nfSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2t3YXJnc19ub19kaWN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYjogY2FsbGJhY2tfa3dhcmdzLCBpZiBzdXBwbGllZCwgIgorICAgICAgICAgICAgIm11c3QgYmUgYSBkaWN0OiBub3QgJ2ZvbyciLAorICAgICAgICAgICAgWyItYiJdLCB7J2FjdGlvbic6ICdjYWxsYmFjaycsCisgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2snOiBzZWxmLmR1bW15LAorICAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrX2t3YXJncyc6ICdmb28nfSkKKworICAgIGRlZiB0ZXN0X25vX2NhbGxiYWNrX2Zvcl9hY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBjYWxsYmFjayBzdXBwbGllZCAoJ2ZvbycpIGZvciBub24tY2FsbGJhY2sgb3B0aW9uIiwKKyAgICAgICAgICAgIFsiLWIiXSwgeydhY3Rpb24nOiAnc3RvcmUnLAorICAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrJzogJ2Zvbyd9KQorCisgICAgZGVmIHRlc3Rfbm9fY2FsbGJhY2tfYXJnc19mb3JfYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9wdGlvbkVycm9yKAorICAgICAgICAgICAgIm9wdGlvbiAtYjogY2FsbGJhY2tfYXJncyBzdXBwbGllZCBmb3Igbm9uLWNhbGxiYWNrIG9wdGlvbiIsCisgICAgICAgICAgICBbIi1iIl0sIHsnYWN0aW9uJzogJ3N0b3JlJywKKyAgICAgICAgICAgICAgICAgICAgICdjYWxsYmFja19hcmdzJzogJ2Zvbyd9KQorCisgICAgZGVmIHRlc3Rfbm9fY2FsbGJhY2tfa3dhcmdzX2Zvcl9hY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3B0aW9uRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uIC1iOiBjYWxsYmFja19rd2FyZ3Mgc3VwcGxpZWQgZm9yIG5vbi1jYWxsYmFjayBvcHRpb24iLAorICAgICAgICAgICAgWyItYiJdLCB7J2FjdGlvbic6ICdzdG9yZScsCisgICAgICAgICAgICAgICAgICAgICAnY2FsbGJhY2tfa3dhcmdzJzogJ2Zvbyd9KQorCitjbGFzcyBUZXN0T3B0aW9uUGFyc2VyKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXYiLCAiLS12ZXJib3NlIiwgIi1uIiwgIi0tbm9pc3kiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ2ZXJib3NlIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXEiLCAiLS1xdWlldCIsICItLXNpbGVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIikKKworICAgIGRlZiB0ZXN0X2FkZF9vcHRpb25fbm9fT3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90IGFuIE9wdGlvbiBpbnN0YW5jZTogTm9uZSIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9hZGRfb3B0aW9uX2ludmFsaWRfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhcmd1bWVudHMiLCBOb25lLCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0X29wdGlvbihzZWxmKToKKyAgICAgICAgb3B0MSA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi12IikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9wdDEsIE9wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQxLl9zaG9ydF9vcHRzLCBbIi12IiwgIi1uIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0MS5fbG9uZ19vcHRzLCBbIi0tdmVyYm9zZSIsICItLW5vaXN5Il0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0MS5hY3Rpb24sICJzdG9yZV90cnVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQxLmRlc3QsICJ2ZXJib3NlIikKKworICAgIGRlZiB0ZXN0X2dldF9vcHRpb25fZXF1YWxzKHNlbGYpOgorICAgICAgICBvcHQxID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXYiKQorICAgICAgICBvcHQyID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJib3NlIikKKyAgICAgICAgb3B0MyA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi1uIikKKyAgICAgICAgb3B0NCA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tbm9pc3kiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0MSBpcyBvcHQyIGlzIG9wdDMgaXMgb3B0NCkKKworICAgIGRlZiB0ZXN0X2hhc19vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItdiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS12ZXJib3NlIikpCisKKyAgICBkZWYgYXNzZXJ0VHJ1ZXJlbW92ZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItdiIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItLXZlcmJvc2UiKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLW4iKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS1ub2lzeSIpIGlzIE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItdiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi0tdmVyYm9zZSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi1uIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS1ub2lzeSIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItcSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS1zaWxlbnQiKSkKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9zaG9ydF9vcHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLnJlbW92ZV9vcHRpb24oIi1uIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlcmVtb3ZlZCgpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfbG9uZ19vcHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLnJlbW92ZV9vcHRpb24oIi0tdmVyYm9zZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZXJlbW92ZWQoKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX25vbmV4aXN0ZW50KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLnBhcnNlci5yZW1vdmVfb3B0aW9uLCAoJ2ZvbycsKSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVFcnJvciwgIm5vIHN1Y2ggb3B0aW9uICdmb28nIikKKworICAgIGRlZiB0ZXN0X3JlZmxlYWsoc2VsZik6CisgICAgICAgICMgSWYgYW4gT3B0aW9uUGFyc2VyIGlzIGNhcnJ5aW5nIGFyb3VuZCBhIHJlZmVyZW5jZSB0byBhIGxhcmdlCisgICAgICAgICMgb2JqZWN0LCB2YXJpb3VzIGN5Y2xlcyBjYW4gcHJldmVudCBpdCBmcm9tIGJlaW5nIEdDJ2QgaW4KKyAgICAgICAgIyBhIHRpbWVseSBmYXNoaW9uLiAgZGVzdHJveSgpIGJyZWFrcyB0aGUgY3ljbGVzIHRvIGVuc3VyZSBzdHVmZgorICAgICAgICAjIGNhbiBiZSBjbGVhbmVkIHVwLgorICAgICAgICBiaWdfdGhpbmcgPSBbNDJdCisgICAgICAgIHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGJpZ190aGluZykKKyAgICAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi1hIiwgIi0tYWFhcmdnaCIpCisgICAgICAgIHBhcnNlci5iaWdfdGhpbmcgPSBiaWdfdGhpbmcKKworICAgICAgICBwYXJzZXIuZGVzdHJveSgpCisgICAgICAgICNzZWxmLmFzc2VydEVxdWFsKHJlZmNvdW50LCBzeXMuZ2V0cmVmY291bnQoYmlnX3RoaW5nKSkKKyAgICAgICAgZGVsIHBhcnNlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZmNvdW50LCBzeXMuZ2V0cmVmY291bnQoYmlnX3RoaW5nKSkKKworCitjbGFzcyBUZXN0T3B0aW9uVmFsdWVzKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKKyAgICAgICAgdmFsdWVzID0gVmFsdWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJzKHZhbHVlcyksIHt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywge30pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodmFsdWVzLCB7ImZvbyI6ICJiYXIifSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2YWx1ZXMsICIiKQorCisgICAgICAgIGRpY3QgPSB7ImZvbyI6ICJiYXIiLCAiYmF6IjogNDJ9CisgICAgICAgIHZhbHVlcyA9IFZhbHVlcyhkZWZhdWx0cz1kaWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcnModmFsdWVzKSwgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodmFsdWVzLCB7ImZvbyI6ICJiYXIifSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh2YWx1ZXMsIHt9KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHZhbHVlcywgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodmFsdWVzLCBbXSkKKworCitjbGFzcyBUZXN0VHlwZUFsaWFzZXMoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorCisgICAgZGVmIHRlc3Rfc3RyX2FsaWFzZXNfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcyIsIHR5cGU9InN0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXMiKS50eXBlLCAic3RyaW5nIikKKworICAgIGRlZiB0ZXN0X25ld190eXBlX29iamVjdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXMiLCB0eXBlPXN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItcyIpLnR5cGUsICJzdHJpbmciKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCIteCIsIHR5cGU9aW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi14IikudHlwZSwgImludCIpCisKKyAgICBkZWYgdGVzdF9vbGRfdHlwZV9vYmplY3Qoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1zIiwgdHlwZT10eXBlcy5TdHJpbmdUeXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi1zIikudHlwZSwgInN0cmluZyIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi14IiwgdHlwZT10eXBlcy5JbnRUeXBlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi14IikudHlwZSwgImludCIpCisKKworIyBDdXN0b20gdHlwZSBmb3IgdGVzdGluZyBwcm9jZXNzaW5nIG9mIGRlZmF1bHQgdmFsdWVzLgorX3RpbWVfdW5pdHMgPSB7ICdzJyA6IDEsICdtJyA6IDYwLCAnaCcgOiA2MCo2MCwgJ2QnIDogNjAqNjAqMjQgfQorCitkZWYgX2NoZWNrX2R1cmF0aW9uKG9wdGlvbiwgb3B0LCB2YWx1ZSk6CisgICAgdHJ5OgorICAgICAgICBpZiB2YWx1ZVstMV0uaXNkaWdpdCgpOgorICAgICAgICAgICAgcmV0dXJuIGludCh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpbnQodmFsdWVbOi0xXSkgKiBfdGltZV91bml0c1t2YWx1ZVstMV1dCisgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBJbmRleEVycm9yKToKKyAgICAgICAgcmFpc2UgT3B0aW9uVmFsdWVFcnJvcigKKyAgICAgICAgICAgICdvcHRpb24gJXM6IGludmFsaWQgZHVyYXRpb246ICVyJyAlIChvcHQsIHZhbHVlKSkKKworY2xhc3MgRHVyYXRpb25PcHRpb24oT3B0aW9uKToKKyAgICBUWVBFUyA9IE9wdGlvbi5UWVBFUyArICgnZHVyYXRpb24nLCkKKyAgICBUWVBFX0NIRUNLRVIgPSBjb3B5LmNvcHkoT3B0aW9uLlRZUEVfQ0hFQ0tFUikKKyAgICBUWVBFX0NIRUNLRVJbJ2R1cmF0aW9uJ10gPSBfY2hlY2tfZHVyYXRpb24KKworY2xhc3MgVGVzdERlZmF1bHRWYWx1ZXMoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItdiIsICItLXZlcmJvc2UiLCBkZWZhdWx0PVRydWUpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLCBkZXN0PSd2ZXJib3NlJykKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLW4iLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTM3KQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItbSIsIHR5cGU9ImludCIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1zIiwgZGVmYXVsdD0iZm9vIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLXQiKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItdSIsIGRlZmF1bHQ9Tm9uZSkKKyAgICAgICAgc2VsZi5leHBlY3RlZCA9IHsgJ3ZlcmJvc2UnOiBUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnbic6IDM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAnbSc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzJzogImZvbyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICd0JzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3UnOiBOb25lIH0KKworICAgIGRlZiB0ZXN0X2Jhc2ljX2RlZmF1bHRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpLCBzZWxmLmV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfZGVmYXVsdHNfcG9zdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2RlZmF1bHRzKG49NDIsIG09LTEwMCkKKyAgICAgICAgc2VsZi5leHBlY3RlZC51cGRhdGUoeyduJzogNDIsICdtJzogLTEwMH0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZ2V0X2RlZmF1bHRfdmFsdWVzKCksIHNlbGYuZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9taXhlZF9kZWZhdWx0c19wcmUoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZWZhdWx0cyh4PSJiYXJmIiwgeT0iYmxhaCIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi14IiwgZGVmYXVsdD0iZnJvYiIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi15IikKKworICAgICAgICBzZWxmLmV4cGVjdGVkLnVwZGF0ZSh7J3gnOiAiZnJvYiIsICd5JzogImJsYWgifSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5nZXRfZGVmYXVsdF92YWx1ZXMoKSwgc2VsZi5leHBlY3RlZCkKKworICAgICAgICBzZWxmLnBhcnNlci5yZW1vdmVfb3B0aW9uKCIteSIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi15IiwgZGVmYXVsdD1Ob25lKQorICAgICAgICBzZWxmLmV4cGVjdGVkLnVwZGF0ZSh7J3knOiBOb25lfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5nZXRfZGVmYXVsdF92YWx1ZXMoKSwgc2VsZi5leHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3Byb2Nlc3NfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIub3B0aW9uX2NsYXNzID0gRHVyYXRpb25PcHRpb24KKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWQiLCB0eXBlPSJkdXJhdGlvbiIsIGRlZmF1bHQ9MzAwKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZSIsIHR5cGU9ImR1cmF0aW9uIiwgZGVmYXVsdD0iNm0iKQorICAgICAgICBzZWxmLnBhcnNlci5zZXRfZGVmYXVsdHMobj0iNDIiKQorICAgICAgICBzZWxmLmV4cGVjdGVkLnVwZGF0ZSh7J2QnOiAzMDAsICdlJzogMzYwLCAnbic6IDQyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5nZXRfZGVmYXVsdF92YWx1ZXMoKSwgc2VsZi5leHBlY3RlZCkKKworICAgICAgICBzZWxmLnBhcnNlci5zZXRfcHJvY2Vzc19kZWZhdWx0X3ZhbHVlcyhGYWxzZSkKKyAgICAgICAgc2VsZi5leHBlY3RlZC51cGRhdGUoeydkJzogMzAwLCAnZSc6ICI2bSIsICduJzogIjQyIn0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIuZ2V0X2RlZmF1bHRfdmFsdWVzKCksIHNlbGYuZXhwZWN0ZWQpCisKKworY2xhc3MgVGVzdFByb2dOYW1lKEJhc2VUZXN0KToKKyAgICAiIiIKKyAgICBUZXN0IHRoYXQgJXByb2cgZXhwYW5kcyB0byB0aGUgcmlnaHQgdGhpbmcgaW4gdXNhZ2UsIHZlcnNpb24sCisgICAgYW5kIGhlbHAgc3RyaW5ncy4KKyAgICAiIiIKKworICAgIGRlZiBhc3NlcnRVc2FnZShzZWxmLCBwYXJzZXIsIGV4cGVjdGVkX3VzYWdlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0X3VzYWdlKCksIGV4cGVjdGVkX3VzYWdlKQorCisgICAgZGVmIGFzc2VydFZlcnNpb24oc2VsZiwgcGFyc2VyLCBleHBlY3RlZF92ZXJzaW9uKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0X3ZlcnNpb24oKSwgZXhwZWN0ZWRfdmVyc2lvbikKKworCisgICAgZGVmIHRlc3RfZGVmYXVsdF9wcm9nbmFtZShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBwcm9ncmFtIG5hbWUgdGFrZW4gZnJvbSBzeXMuYXJndlswXSBieSBkZWZhdWx0LgorICAgICAgICBzYXZlX2FyZ3YgPSBzeXMuYXJndls6XQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuYXJndlswXSA9IG9zLnBhdGguam9pbigiZm9vIiwgImJhciIsICJiYXoucHkiKQorICAgICAgICAgICAgcGFyc2VyID0gT3B0aW9uUGFyc2VyKCIlcHJvZyAuLi4iLCB2ZXJzaW9uPSIlcHJvZyAxLjIiKQorICAgICAgICAgICAgZXhwZWN0ZWRfdXNhZ2UgPSAiVXNhZ2U6IGJhei5weSAuLi5cbiIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VXNhZ2UocGFyc2VyLCBleHBlY3RlZF91c2FnZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VmVyc2lvbihwYXJzZXIsICJiYXoucHkgMS4yIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SGVscChwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdXNhZ2UgKyAiXG4iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAtLXZlcnNpb24gICBzaG93IHByb2dyYW0ncyB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXRcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVfYXJndgorCisgICAgZGVmIHRlc3RfY3VzdG9tX3Byb2duYW1lKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBPcHRpb25QYXJzZXIocHJvZz0idGhpbmd5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249IiVwcm9nIDAuMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZT0iJXByb2cgYXJnIGFyZyIpCisgICAgICAgIHBhcnNlci5yZW1vdmVfb3B0aW9uKCItaCIpCisgICAgICAgIHBhcnNlci5yZW1vdmVfb3B0aW9uKCItLXZlcnNpb24iKQorICAgICAgICBleHBlY3RlZF91c2FnZSA9ICJVc2FnZTogdGhpbmd5IGFyZyBhcmdcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRVc2FnZShwYXJzZXIsIGV4cGVjdGVkX3VzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFZlcnNpb24ocGFyc2VyLCAidGhpbmd5IDAuMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChwYXJzZXIsIGV4cGVjdGVkX3VzYWdlICsgIlxuIikKKworCitjbGFzcyBUZXN0RXhwYW5kRGVmYXVsdHMoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIocHJvZz0idGVzdCIpCisgICAgICAgIHNlbGYuaGVscF9wcmVmaXggPSAiIiJcCitVc2FnZTogdGVzdCBbb3B0aW9uc10KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyIiIgorICAgICAgICBzZWxmLmZpbGVfaGVscCA9ICJyZWFkIGZyb20gRklMRSBbZGVmYXVsdDogJWRlZmF1bHRdIgorICAgICAgICBzZWxmLmV4cGVjdGVkX2hlbHBfZmlsZSA9IHNlbGYuaGVscF9wcmVmaXggKyBcCisgICAgICAgICAgICAiICAtZiBGSUxFLCAtLWZpbGU9RklMRSAgcmVhZCBmcm9tIEZJTEUgW2RlZmF1bHQ6IGZvby50eHRdXG4iCisgICAgICAgIHNlbGYuZXhwZWN0ZWRfaGVscF9ub25lID0gc2VsZi5oZWxwX3ByZWZpeCArIFwKKyAgICAgICAgICAgICIgIC1mIEZJTEUsIC0tZmlsZT1GSUxFICByZWFkIGZyb20gRklMRSBbZGVmYXVsdDogbm9uZV1cbiIKKworICAgIGRlZiB0ZXN0X29wdGlvbl9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZvby50eHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9c2VsZi5maWxlX2hlbHApCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgc2VsZi5leHBlY3RlZF9oZWxwX2ZpbGUpCisKKyAgICBkZWYgdGVzdF9wYXJzZXJfZGVmYXVsdF8xKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9c2VsZi5maWxlX2hlbHApCisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZWZhdWx0KCdmaWxlJywgImZvby50eHQiKQorICAgICAgICBzZWxmLmFzc2VydEhlbHAoc2VsZi5wYXJzZXIsIHNlbGYuZXhwZWN0ZWRfaGVscF9maWxlKQorCisgICAgZGVmIHRlc3RfcGFyc2VyX2RlZmF1bHRfMihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPXNlbGYuZmlsZV9oZWxwKQorICAgICAgICBzZWxmLnBhcnNlci5zZXRfZGVmYXVsdHMoZmlsZT0iZm9vLnR4dCIpCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgc2VsZi5leHBlY3RlZF9oZWxwX2ZpbGUpCisKKyAgICBkZWYgdGVzdF9ub19kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9c2VsZi5maWxlX2hlbHApCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgc2VsZi5leHBlY3RlZF9oZWxwX25vbmUpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X25vbmVfMShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWYiLCAiLS1maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD1zZWxmLmZpbGVfaGVscCkKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwKHNlbGYucGFyc2VyLCBzZWxmLmV4cGVjdGVkX2hlbHBfbm9uZSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfbm9uZV8yKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9c2VsZi5maWxlX2hlbHApCisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZWZhdWx0cyhmaWxlPU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgc2VsZi5leHBlY3RlZF9oZWxwX25vbmUpCisKKyAgICBkZWYgdGVzdF9mbG9hdF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAgICAgIi1wIiwgIi0tcHJvYiIsCisgICAgICAgICAgICBoZWxwPSJibG93IHVwIHdpdGggcHJvYmFiaWxpdHkgUFJPQiBbZGVmYXVsdDogJWRlZmF1bHRdIikKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2RlZmF1bHRzKHByb2I9MC40MykKKyAgICAgICAgZXhwZWN0ZWRfaGVscCA9IHNlbGYuaGVscF9wcmVmaXggKyBcCisgICAgICAgICAgICAiICAtcCBQUk9CLCAtLXByb2I9UFJPQiAgYmxvdyB1cCB3aXRoIHByb2JhYmlsaXR5IFBST0IgW2RlZmF1bHQ6IDAuNDNdXG4iCisgICAgICAgIHNlbGYuYXNzZXJ0SGVscChzZWxmLnBhcnNlciwgZXhwZWN0ZWRfaGVscCkKKworICAgIGRlZiB0ZXN0X2FsdF9leHBhbmQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iZm9vLnR4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0icmVhZCBmcm9tIEZJTEUgW2RlZmF1bHQ6ICpERUZBVUxUKl0iKQorICAgICAgICBzZWxmLnBhcnNlci5mb3JtYXR0ZXIuZGVmYXVsdF90YWcgPSAiKkRFRkFVTFQqIgorICAgICAgICBzZWxmLmFzc2VydEhlbHAoc2VsZi5wYXJzZXIsIHNlbGYuZXhwZWN0ZWRfaGVscF9maWxlKQorCisgICAgZGVmIHRlc3Rfbm9fZXhwYW5kKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9ImZvby50eHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9InJlYWQgZnJvbSAlZGVmYXVsdCBmaWxlIikKKyAgICAgICAgc2VsZi5wYXJzZXIuZm9ybWF0dGVyLmRlZmF1bHRfdGFnID0gTm9uZQorICAgICAgICBleHBlY3RlZF9oZWxwID0gc2VsZi5oZWxwX3ByZWZpeCArIFwKKyAgICAgICAgICAgICIgIC1mIEZJTEUsIC0tZmlsZT1GSUxFICByZWFkIGZyb20gJWRlZmF1bHQgZmlsZVxuIgorICAgICAgICBzZWxmLmFzc2VydEhlbHAoc2VsZi5wYXJzZXIsIGV4cGVjdGVkX2hlbHApCisKKworIyAtLSBUZXN0IHBhcnNlci5wYXJzZV9hcmdzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdGFuZGFyZChCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKCItYSIsIHR5cGU9InN0cmluZyIpLAorICAgICAgICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItYiIsICItLWJvbyIsIHR5cGU9ImludCIsIGRlc3Q9J2JvbycpLAorICAgICAgICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItLWZvbyIsIGFjdGlvbj0iYXBwZW5kIildCisKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9saXN0PW9wdGlvbnMpCisKKyAgICBkZWYgdGVzdF9yZXF1aXJlZF92YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItYSJdLCAiLWEgb3B0aW9uIHJlcXVpcmVzIGFuIGFyZ3VtZW50IikKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfaW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItYiIsICI1eCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1iOiBpbnZhbGlkIGludGVnZXIgdmFsdWU6ICc1eCciKQorCisgICAgZGVmIHRlc3Rfbm9fc3VjaF9vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1ib28xMyJdLCAibm8gc3VjaCBvcHRpb246IC0tYm9vMTMiKQorCisgICAgZGVmIHRlc3RfbG9uZ19pbnZhbGlkX2ludGVnZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1ib289eDUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtLWJvbzogaW52YWxpZCBpbnRlZ2VyIHZhbHVlOiAneDUnIikKKworICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soW10sIHsnYSc6IE5vbmUsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sIFtdKQorCisgICAgZGVmIHRlc3Rfc2hvcnRvcHRfZW1wdHlfbG9uZ29wdF9hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hIiwgIiIsICItLWZvbz1ibGFoIiwgIi0tZm9vPSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogIiIsICdib28nOiBOb25lLCAnZm9vJzogWyJibGFoIiwgIiJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfbG9uZ19vcHRpb25fYXBwZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLWZvbyIsICJiYXIiLCAiLS1mb28iLCAiIiwgIi0tZm9vPXgiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvbyc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbyc6IFsiYmFyIiwgIiIsICJ4Il19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9vcHRpb25fYXJndW1lbnRfam9pbmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYWJjIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiYmMiLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9vcHRpb25fYXJndW1lbnRfc3BsaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hIiwgIjM0Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiMzQiLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9vcHRpb25fYXJndW1lbnRfam9pbmVkX2ludGVnZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1iMzQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsICdib28nOiAzNCwgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9vcHRpb25fYXJndW1lbnRfc3BsaXRfbmVnYXRpdmVfaW50ZWdlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWIiLCAiLTUiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsICdib28nOiAtNSwgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9sb25nX29wdGlvbl9hcmd1bWVudF9qb2luZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tYm9vPTEzIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLCAnYm9vJzogMTMsICdmb28nOiBOb25lfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfbG9uZ19vcHRpb25fYXJndW1lbnRfc3BsaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tYm9vIiwgIjExMSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogTm9uZSwgJ2Jvbyc6IDExMSwgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9sb25nX29wdGlvbl9zaG9ydF9vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tZm9vPWJhciIsICItYXh5eiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogJ3h5eicsICdib28nOiBOb25lLCAnZm9vJzogWyJiYXIiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2FiYnJldl9sb25nX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1mPWJhciIsICItYXh5eiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogJ3h5eicsICdib28nOiBOb25lLCAnZm9vJzogWyJiYXIiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRzKHNlbGYpOgorICAgICAgICAob3B0aW9ucywgYXJncykgPSBzZWxmLnBhcnNlci5wYXJzZV9hcmdzKFtdKQorICAgICAgICBkZWZhdWx0cyA9IHNlbGYucGFyc2VyLmdldF9kZWZhdWx0X3ZhbHVlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFycyhkZWZhdWx0cyksIHZhcnMob3B0aW9ucykpCisKKyAgICBkZWYgdGVzdF9hbWJpZ3VvdXNfb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItLWZveiIsIGFjdGlvbj0ic3RvcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InN0cmluZyIsIGRlc3Q9ImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1mPWJhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW1iaWd1b3VzIG9wdGlvbjogLS1mICgtLWZvbywgLS1mb3o/KSIpCisKKworICAgIGRlZiB0ZXN0X3Nob3J0X2FuZF9sb25nX29wdGlvbl9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAieHl6IiwgIi0tZm9vIiwgImJhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogJ3h5eicsICdib28nOiBOb25lLCAnZm9vJzogWyJiYXIiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSksCisKKyAgICBkZWYgdGVzdF9zaG9ydF9vcHRpb25fc3BsaXRfbG9uZ19vcHRpb25fYXBwZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLWZvbz1iYXIiLCAiLWIiLCAiMTIzIiwgIi0tZm9vIiwgImJheiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogTm9uZSwgJ2Jvbyc6IDEyMywgJ2Zvbyc6IFsiYmFyIiwgImJheiJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3Rfc2hvcnRfb3B0aW9uX3NwbGl0X29uZV9wb3NpdGlvbmFsX2FyZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWEiLCAiZm9vIiwgImJhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogImZvbyIsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbImJhciJdKSwKKworICAgIGRlZiB0ZXN0X3Nob3J0X29wdGlvbl9jb25zdW1lc19zZXBhcmF0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hIiwgIi0tIiwgImZvbyIsICJiYXIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICItLSIsICdib28nOiBOb25lLCAnZm9vJzogTm9uZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbImZvbyIsICJiYXIiXSksCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hIiwgIi0tIiwgIi0tZm9vIiwgImJhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogIi0tIiwgJ2Jvbyc6IE5vbmUsICdmb28nOiBbImJhciJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKSwKKworICAgIGRlZiB0ZXN0X3Nob3J0X29wdGlvbl9qb2luZWRfYW5kX3NlcGFyYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWFiIiwgIi0tIiwgIi0tZm9vIiwgImJhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhJzogImIiLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyItLWZvbyIsICJiYXIiXSksCisKKyAgICBkZWYgdGVzdF9oeXBoZW5fYmVjb21lc19wb3NpdGlvbmFsX2FyZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWFiIiwgIi0iLCAiLS1mb28iLCAiYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiAiYiIsICdib28nOiBOb25lLCAnZm9vJzogWyJiYXIiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi0iXSkKKworICAgIGRlZiB0ZXN0X25vX2FwcGVuZF92ZXJzdXNfYXBwZW5kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYjMiLCAiLWIiLCAiNSIsICItLWZvbz1iYXIiLCAiLS1mb28iLCAiYmF6Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLCAnYm9vJzogNSwgJ2Zvbyc6IFsiYmFyIiwgImJheiJdfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3Rfb3B0aW9uX2NvbnN1bWVzX29wdGlvbmxpa2Vfc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYSIsICItYjMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICItYjMiLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IE5vbmV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9jb21iaW5lZF9zaW5nbGVfaW52YWxpZF9vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi10IiwgYWN0aW9uPSJzdG9yZV90cnVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItdGVzdCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gc3VjaCBvcHRpb246IC1lIikKKworICAgIGRlZiB0ZXN0X2FkZF9vcHRpb25fYWNjZXB0c191bmljb2RlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKHUiLXUiLCB1Ii0tdW5pY29kZSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi11Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLCAnYm9vJzogTm9uZSwgJ2Zvbyc6IE5vbmUsICd1bmljb2RlJzogVHJ1ZX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworCitjbGFzcyBUZXN0Qm9vbChCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKCItdiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tdmVyYm9zZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV90cnVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PScnKSwKKyAgICAgICAgICAgICAgICAgICBtYWtlX29wdGlvbigiLXEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLXF1aWV0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX2ZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJ2ZXJib3NlIildCisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0ID0gb3B0aW9ucykKKworICAgIGRlZiB0ZXN0X2Jvb2xfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd2ZXJib3NlJzogJyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9ib29sX2ZhbHNlKHNlbGYpOgorICAgICAgICAob3B0aW9ucywgYXJncykgPSBzZWxmLmFzc2VydFBhcnNlT0soWyItcSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd2ZXJib3NlJzogMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbnMudmVyYm9zZSBpcyBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2Jvb2xfdHJ1ZShzZWxmKToKKyAgICAgICAgKG9wdGlvbnMsIGFyZ3MpID0gc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDF9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcHRpb25zLnZlcmJvc2UgaXMgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2Jvb2xfZmxpY2tlcl9vbl9hbmRfb2ZmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItcXZxIiwgIi1xIiwgIi12Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCitjbGFzcyBUZXN0Q2hvaWNlKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItYyIsIGFjdGlvbj0ic3RvcmUiLCB0eXBlPSJjaG9pY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9ImNob2ljZSIsIGNob2ljZXM9WyJvbmUiLCAidHdvIiwgInRocmVlIl0pCisKKyAgICBkZWYgdGVzdF92YWxpZF9jaG9pY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1jIiwgIm9uZSIsICJ4eXoiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnY2hvaWNlJzogJ29uZSd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJ4eXoiXSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfY2hvaWNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi1jIiwgImZvdXIiLCAiYWJjIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gLWM6IGludmFsaWQgY2hvaWNlOiAnZm91cicgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKGNob29zZSBmcm9tICdvbmUnLCAndHdvJywgJ3RocmVlJykiKQorCisgICAgZGVmIHRlc3RfYWRkX2Nob2ljZV9vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1kIiwgIi0tZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlcz1bImZvdXIiLCAiZml2ZSIsICJzaXgiXSkKKyAgICAgICAgb3B0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdC50eXBlLCAiY2hvaWNlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQuYWN0aW9uLCAic3RvcmUiKQorCitjbGFzcyBUZXN0Q291bnQoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYudl9vcHQgPSBtYWtlX29wdGlvbigiLXYiLCBhY3Rpb249ImNvdW50IiwgZGVzdD0idmVyYm9zZSIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oc2VsZi52X29wdCkKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLS12ZXJib3NlIiwgdHlwZT0iaW50IiwgZGVzdD0idmVyYm9zZSIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1xIiwgIi0tcXVpZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0ic3RvcmVfY29uc3QiLCBkZXN0PSJ2ZXJib3NlIiwgY29uc3Q9MCkKKworICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soW10sIHsndmVyYm9zZSc6IE5vbmV9LCBbXSkKKworICAgIGRlZiB0ZXN0X2NvdW50X29uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXYiXSwgeyd2ZXJib3NlJzogMX0sIFtdKQorCisgICAgZGVmIHRlc3RfY291bnRfdGhyZWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi12dnYiXSwgeyd2ZXJib3NlJzogM30sIFtdKQorCisgICAgZGVmIHRlc3RfY291bnRfdGhyZWVfYXBhcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi12IiwgIi12IiwgIi12Il0sIHsndmVyYm9zZSc6IDN9LCBbXSkKKworICAgIGRlZiB0ZXN0X2NvdW50X292ZXJyaWRlX2Ftb3VudChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXZ2diIsICItLXZlcmJvc2U9MiJdLCB7J3ZlcmJvc2UnOiAyfSwgW10pCisKKyAgICBkZWYgdGVzdF9jb3VudF9vdmVycmlkZV9xdWlldChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXZ2diIsICItLXZlcmJvc2U9MiIsICItcSJdLCB7J3ZlcmJvc2UnOiAwfSwgW10pCisKKyAgICBkZWYgdGVzdF9jb3VudF9vdmVycmlkaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItdnZ2IiwgIi0tdmVyYm9zZT0yIiwgIi1xIiwgIi12Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAxfSwgW10pCisKKyAgICBkZWYgdGVzdF9jb3VudF9pbnRlcnNwZXJzZWRfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLS1xdWlldCIsICIzIiwgIi12Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAxfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiMyJdKQorCisgICAgZGVmIHRlc3RfY291bnRfbm9faW50ZXJzcGVyc2VkX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmRpc2FibGVfaW50ZXJzcGVyc2VkX2FyZ3MoKQorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLXF1aWV0IiwgIjMiLCAiLXYiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWyIzIiwgIi12Il0pCisKKyAgICBkZWYgdGVzdF9jb3VudF9ub19zdWNoX29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItcTMiLCAiLXYiXSwgIm5vIHN1Y2ggb3B0aW9uOiAtMyIpCisKKyAgICBkZWYgdGVzdF9jb3VudF9vcHRpb25fbm9fdmFsdWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1xdWlldD0zIiwgIi12Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLXF1aWV0IG9wdGlvbiBkb2VzIG5vdCB0YWtlIGEgdmFsdWUiKQorCisgICAgZGVmIHRlc3RfY291bnRfd2l0aF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5zZXRfZGVmYXVsdCgndmVyYm9zZScsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbXSwgeyd2ZXJib3NlJzowfSwgW10pCisKKyAgICBkZWYgdGVzdF9jb3VudF9vdmVycmlkaW5nX2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLnNldF9kZWZhdWx0KCd2ZXJib3NlJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXZ2diIsICItLXZlcmJvc2U9MiIsICItcSIsICItdiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd2ZXJib3NlJzogMX0sIFtdKQorCitjbGFzcyBUZXN0TXVsdGlwbGVBcmdzKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcCIsICItLXBvaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlIiwgbmFyZ3M9MywgdHlwZT0iZmxvYXQiLCBkZXN0PSJwb2ludCIpCisKKyAgICBkZWYgdGVzdF9uYXJnc193aXRoX3Bvc2l0aW9uYWxfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiZm9vIiwgIi1wIiwgIjEiLCAiMi41IiwgIi00LjMiLCAieHl6Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3BvaW50JzogKDEuMCwgMi41LCAtNC4zKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbImZvbyIsICJ4eXoiXSkKKworICAgIGRlZiB0ZXN0X25hcmdzX2xvbmdfb3B0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLXBvaW50IiwgIi0xIiwgIjIuNSIsICItMCIsICJ4eXoiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsncG9pbnQnOiAoLTEuMCwgMi41LCAtMC4wKX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbInh5eiJdKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfaW52YWxpZF9mbG9hdF92YWx1ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItcCIsICIxLjAiLCAiMngiLCAiMy41Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gLXA6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgZmxvYXRpbmctcG9pbnQgdmFsdWU6ICcyeCciKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfcmVxdWlyZWRfdmFsdWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi0tcG9pbnQiLCAiMS4wIiwgIjMuNSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1wb2ludCBvcHRpb24gcmVxdWlyZXMgMyBhcmd1bWVudHMiKQorCitjbGFzcyBUZXN0TXVsdGlwbGVBcmdzQXBwZW5kKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcCIsICItLXBvaW50IiwgYWN0aW9uPSJzdG9yZSIsIG5hcmdzPTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0iZmxvYXQiLCBkZXN0PSJwb2ludCIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi1mIiwgIi0tZm9vIiwgYWN0aW9uPSJhcHBlbmQiLCBuYXJncz0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9ImludCIsIGRlc3Q9ImZvbyIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi16IiwgIi0temVybyIsIGFjdGlvbj0iYXBwZW5kX2NvbnN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJmb28iLCBjb25zdD0oMCwgMCkpCisKKyAgICBkZWYgdGVzdF9uYXJnc19hcHBlbmQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1mIiwgIjQiLCAiLTMiLCAiYmxhaCIsICItLWZvbyIsICIxIiwgIjY2NiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydwb2ludCc6IE5vbmUsICdmb28nOiBbKDQsIC0zKSwgKDEsIDY2NildfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiYmxhaCJdKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfYXBwZW5kX3JlcXVpcmVkX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItZjQsMyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWYgb3B0aW9uIHJlcXVpcmVzIDIgYXJndW1lbnRzIikKKworICAgIGRlZiB0ZXN0X25hcmdzX2FwcGVuZF9zaW1wbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tZm9vPTMiLCAiNCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydwb2ludCc6IE5vbmUsICdmb28nOlsoMywgNCldfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfbmFyZ3NfYXBwZW5kX2NvbnN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLXplcm8iLCAiLS1mb28iLCAiMyIsICI0IiwgIi16Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3BvaW50JzogTm9uZSwgJ2Zvbyc6WygwLCAwKSwgKDMsIDQpLCAoMCwgMCldfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCitjbGFzcyBUZXN0VmVyc2lvbihCYXNlVGVzdCk6CisgICAgZGVmIHRlc3RfdmVyc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb249IiVwcm9nIDAuMSIpCisgICAgICAgIHNhdmVfYXJndiA9IHN5cy5hcmd2WzpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5hcmd2WzBdID0gb3MucGF0aC5qb2luKG9zLmN1cmRpciwgImZvbyIsICJiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRPdXRwdXQoWyItLXZlcnNpb24iXSwgImJhciAwLjFcbiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuYXJndls6XSA9IHNhdmVfYXJndgorCisgICAgZGVmIHRlc3Rfbm9fdmVyc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS12ZXJzaW9uIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJubyBzdWNoIG9wdGlvbjogLS12ZXJzaW9uIikKKworIyAtLSBUZXN0IGNvbmZsaWN0aW5nIGRlZmF1bHQgdmFsdWVzIGFuZCBwYXJzZXIucGFyc2VfYXJncygpIC0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb25mbGljdGluZ0RlZmF1bHRzKEJhc2VUZXN0KToKKyAgICAiIiJDb25mbGljdGluZyBkZWZhdWx0IHZhbHVlczogdGhlIGxhc3Qgb25lIHNob3VsZCB3aW4uIiIiCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1bCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLXYiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJ2ZXJib3NlIiwgZGVmYXVsdD0xKV0pCisKKyAgICBkZWYgdGVzdF9jb25mbGljdF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTApCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbXSwgeyd2ZXJib3NlJzogMH0sIFtdKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfZGVmYXVsdF9ub25lKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItcSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBkZXN0PSJ2ZXJib3NlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbXSwgeyd2ZXJib3NlJzogTm9uZX0sIFtdKQorCitjbGFzcyBUZXN0T3B0aW9uR3JvdXAoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisKKyAgICBkZWYgdGVzdF9vcHRpb25fZ3JvdXBfY3JlYXRlX2luc3RhbmNlKHNlbGYpOgorICAgICAgICBncm91cCA9IE9wdGlvbkdyb3VwKHNlbGYucGFyc2VyLCAiU3BhbSIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAoZ3JvdXApCisgICAgICAgIGdyb3VwLmFkZF9vcHRpb24oIi0tc3BhbSIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ic3BhbSBzcGFtIHNwYW0gc3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tc3BhbSJdLCB7J3NwYW0nOiAxfSwgW10pCisKKyAgICBkZWYgdGVzdF9hZGRfZ3JvdXBfbm9fZ3JvdXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHlwZUVycm9yKHNlbGYucGFyc2VyLmFkZF9vcHRpb25fZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3QgYW4gT3B0aW9uR3JvdXAgaW5zdGFuY2U6IE5vbmUiLCBOb25lKQorCisgICAgZGVmIHRlc3RfYWRkX2dyb3VwX2ludmFsaWRfYXJndW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFR5cGVFcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uX2dyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCBhcmd1bWVudHMiLCBOb25lLCBOb25lKQorCisgICAgZGVmIHRlc3RfYWRkX2dyb3VwX3dyb25nX3BhcnNlcihzZWxmKToKKyAgICAgICAgZ3JvdXAgPSBPcHRpb25Hcm91cChzZWxmLnBhcnNlciwgIlNwYW0iKQorICAgICAgICBncm91cC5wYXJzZXIgPSBPcHRpb25QYXJzZXIoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLnBhcnNlci5hZGRfb3B0aW9uX2dyb3VwLCAoZ3JvdXAsKSwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVFcnJvciwgImludmFsaWQgT3B0aW9uR3JvdXAgKHdyb25nIHBhcnNlcikiKQorCisgICAgZGVmIHRlc3RfZ3JvdXBfbWFuaXB1bGF0ZShzZWxmKToKKyAgICAgICAgZ3JvdXAgPSBzZWxmLnBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKCJHcm91cCAyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJTb21lIG1vcmUgb3B0aW9ucyIpCisgICAgICAgIGdyb3VwLnNldF90aXRsZSgiQmFjb24iKQorICAgICAgICBncm91cC5hZGRfb3B0aW9uKCItLWJhY29uIiwgdHlwZT0iaW50IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmdldF9vcHRpb25fZ3JvdXAoIi0tYmFjb24iKSwgZ3JvdXApCisKKyMgLS0gVGVzdCBleHRlbmRpbmcgYW5kIHBhcnNlci5wYXJzZV9hcmdzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0RXh0ZW5kQWRkVHlwZXMoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9jbGFzcz1zZWxmLk15T3B0aW9uKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItYSIsIE5vbmUsIHR5cGU9InN0cmluZyIsIGRlc3Q9ImEiKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItZiIsICItLWZpbGUiLCB0eXBlPSJmaWxlIiwgZGVzdD0iZmlsZSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIodGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICBvcy5ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBlbGlmIG9zLnBhdGguaXNmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBjbGFzcyBNeU9wdGlvbiAoT3B0aW9uKToKKyAgICAgICAgZGVmIGNoZWNrX2ZpbGUob3B0aW9uLCBvcHQsIHZhbHVlKToKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uVmFsdWVFcnJvcigiJXM6IGZpbGUgZG9lcyBub3QgZXhpc3QiICUgdmFsdWUpCisgICAgICAgICAgICBlbGlmIG5vdCBvcy5wYXRoLmlzZmlsZSh2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmFpc2UgT3B0aW9uVmFsdWVFcnJvcigiJXM6IG5vdCBhIHJlZ3VsYXIgZmlsZSIgJSB2YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorCisgICAgICAgIFRZUEVTID0gT3B0aW9uLlRZUEVTICsgKCJmaWxlIiwpCisgICAgICAgIFRZUEVfQ0hFQ0tFUiA9IGNvcHkuY29weShPcHRpb24uVFlQRV9DSEVDS0VSKQorICAgICAgICBUWVBFX0NIRUNLRVJbImZpbGUiXSA9IGNoZWNrX2ZpbGUKKworICAgIGRlZiB0ZXN0X2ZpbGV0eXBlX29rKHNlbGYpOgorICAgICAgICBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3IikuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLWZpbGUiLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiLWFmb28iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnZmlsZSc6IHRlc3Rfc3VwcG9ydC5URVNURk4sICdhJzogJ2Zvbyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9maWxldHlwZV9ub2V4aXN0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlRmFpbChbIi0tZmlsZSIsIHRlc3Rfc3VwcG9ydC5URVNURk4sICItYWZvbyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGZpbGUgZG9lcyBub3QgZXhpc3QiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2ZpbGV0eXBlX25vdGZpbGUoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLS1maWxlIiwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgIi1hZm9vIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogbm90IGEgcmVndWxhciBmaWxlIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKworY2xhc3MgVGVzdEV4dGVuZEFkZEFjdGlvbnMoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgb3B0aW9ucyA9IFtzZWxmLk15T3B0aW9uKCItYSIsICItLWFwcGxlIiwgYWN0aW9uPSJleHRlbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiwgZGVzdD0iYXBwbGUiKV0KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9ucykKKworICAgIGNsYXNzIE15T3B0aW9uIChPcHRpb24pOgorICAgICAgICBBQ1RJT05TID0gT3B0aW9uLkFDVElPTlMgKyAoImV4dGVuZCIsKQorICAgICAgICBTVE9SRV9BQ1RJT05TID0gT3B0aW9uLlNUT1JFX0FDVElPTlMgKyAoImV4dGVuZCIsKQorICAgICAgICBUWVBFRF9BQ1RJT05TID0gT3B0aW9uLlRZUEVEX0FDVElPTlMgKyAoImV4dGVuZCIsKQorCisgICAgICAgIGRlZiB0YWtlX2FjdGlvbihzZWxmLCBhY3Rpb24sIGRlc3QsIG9wdCwgdmFsdWUsIHZhbHVlcywgcGFyc2VyKToKKyAgICAgICAgICAgIGlmIGFjdGlvbiA9PSAiZXh0ZW5kIjoKKyAgICAgICAgICAgICAgICBsdmFsdWUgPSB2YWx1ZS5zcGxpdCgiLCIpCisgICAgICAgICAgICAgICAgdmFsdWVzLmVuc3VyZV92YWx1ZShkZXN0LCBbXSkuZXh0ZW5kKGx2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgT3B0aW9uLnRha2VfYWN0aW9uKHNlbGYsIGFjdGlvbiwgZGVzdCwgb3B0LCBwYXJzZXIsIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMpCisKKyAgICBkZWYgdGVzdF9leHRlbmRfYWRkX2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWFmb28sYmFyIiwgIi0tYXBwbGU9YmxhaCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhcHBsZSc6IFsiZm9vIiwgImJhciIsICJibGFoIl19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCisKKyAgICBkZWYgdGVzdF9leHRlbmRfYWRkX2FjdGlvbl9ub3JtYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hIiwgImZvbyIsICItYWJhciIsICItLWFwcGxlPXgseSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydhcHBsZSc6IFsiZm9vIiwgImJhciIsICJ4IiwgInkiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworIyAtLSBUZXN0IGNhbGxiYWNrcyBhbmQgcGFyc2VyLnBhcnNlX2FyZ3MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDYWxsYmFjayhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKCIteCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249ImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1zZWxmLnByb2Nlc3Nfb3B0KSwKKyAgICAgICAgICAgICAgICAgICBtYWtlX29wdGlvbigiLWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0iY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPXNlbGYucHJvY2Vzc19vcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ic3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSJmaWxlbmFtZSIpXQorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25zKQorCisgICAgZGVmIHByb2Nlc3Nfb3B0KHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyXyk6CisgICAgICAgIGlmIG9wdCA9PSAiLXgiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX3Nob3J0X29wdHMsIFsiLXgiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLl9sb25nX29wdHMsIFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlcl8gaXMgc2VsZi5wYXJzZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFycyhwYXJzZXJfLnZhbHVlcyksIHsnZmlsZW5hbWUnOiBOb25lfSkKKworICAgICAgICAgICAgcGFyc2VyXy52YWx1ZXMueCA9IDQyCisgICAgICAgIGVsaWYgb3B0ID09ICItLWZpbGUiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX3Nob3J0X29wdHMsIFsiLWYiXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLl9sb25nX29wdHMsIFsiLS1maWxlIl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocGFyc2VyXyBpcyBzZWxmLnBhcnNlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YXJzKHBhcnNlcl8udmFsdWVzKSwgeydmaWxlbmFtZSc6IE5vbmUsICd4JzogNDJ9KQorCisgICAgICAgICAgICBzZXRhdHRyKHBhcnNlcl8udmFsdWVzLCBvcHRpb24uZGVzdCwgdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlVua25vd24gb3B0aW9uICVyIGluIHByb2Nlc3Nfb3B0LiIgJSBvcHQpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXgiLCAiLS1maWxlPWZvbyJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeydmaWxlbmFtZSc6ICJmb28iLCAneCc6IDQyfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfaGVscChzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3Qgd2FzIHByb21wdGVkIGJ5IFNGIGJ1ZyAjOTYwNTE1IC0tIHRoZSBwb2ludCBpcworICAgICAgICAjIG5vdCB0byBpbnNwZWN0IHRoZSBoZWxwIHRleHQsIGp1c3QgdG8gbWFrZSBzdXJlIHRoYXQKKyAgICAgICAgIyBmb3JtYXRfaGVscCgpIGRvZXNuJ3QgY3Jhc2guCisgICAgICAgIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKyAgICAgICAgcGFyc2VyLnJlbW92ZV9vcHRpb24oIi1oIikKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oIi10IiwgIi0tdGVzdCIsIGFjdGlvbj0iY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1sYW1iZGE6IE5vbmUsIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9ImZvbyIpCisKKyAgICAgICAgZXhwZWN0ZWRfaGVscCA9ICgiT3B0aW9uczpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiICAtdCBURVNULCAtLXRlc3Q9VEVTVCAgZm9vXG4iKQorICAgICAgICBzZWxmLmFzc2VydEhlbHAocGFyc2VyLCBleHBlY3RlZF9oZWxwKQorCisKK2NsYXNzIFRlc3RDYWxsYmFja0V4dHJhQXJncyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKCItcCIsICItLXBvaW50IiwgYWN0aW9uPSJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s9c2VsZi5wcm9jZXNzX3R1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrX2FyZ3M9KDMsIGludCksIHR5cGU9InN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0icG9pbnRzIiwgZGVmYXVsdD1bXSldCisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbnMpCisKKyAgICBkZWYgcHJvY2Vzc190dXBsZShzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcl8sIGxlbiwgdHlwZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuLCAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSBpcyBpbnQpCisKKyAgICAgICAgaWYgb3B0ID09ICItcCI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAiMSwyLDMiKQorICAgICAgICBlbGlmIG9wdCA9PSAiLS1wb2ludCI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAiNCw1LDYiKQorCisgICAgICAgIHZhbHVlID0gdHVwbGUobWFwKHR5cGUsIHZhbHVlLnNwbGl0KCIsIikpKQorICAgICAgICBnZXRhdHRyKHBhcnNlcl8udmFsdWVzLCBvcHRpb24uZGVzdCkuYXBwZW5kKHZhbHVlKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfZXh0cmFfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXAxLDIsMyIsICItLXBvaW50IiwgIjQsNSw2Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3BvaW50cyc6IFsoMSwyLDMpLCAoNCw1LDYpXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworY2xhc3MgVGVzdENhbGxiYWNrTWVkZGxlQXJncyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKHN0cih4KSwgYWN0aW9uPSJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s9c2VsZi5wcm9jZXNzX24sIGRlc3Q9J3RoaW5ncycpCisgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2UoLTEsIC02LCAtMSldCisgICAgICAgIHNlbGYucGFyc2VyID0gT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbnMpCisKKyAgICAjIENhbGxiYWNrIHRoYXQgbWVkZGxlcyBpbiByYXJncywgbGFyZ3MKKyAgICBkZWYgcHJvY2Vzc19uKHNlbGYsIG9wdGlvbiwgb3B0LCB2YWx1ZSwgcGFyc2VyXyk6CisgICAgICAgICMgb3B0aW9uIGlzIC0zLCAtNSwgZXRjLgorICAgICAgICBuYXJncyA9IGludChvcHRbMTpdKQorICAgICAgICByYXJncyA9IHBhcnNlcl8ucmFyZ3MKKyAgICAgICAgaWYgbGVuKHJhcmdzKSA8IG5hcmdzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCAlZCBhcmd1bWVudHMgZm9yICVzIG9wdGlvbi4iICUgKG5hcmdzLCBvcHQpKQorICAgICAgICBkZXN0ID0gcGFyc2VyXy52YWx1ZXMuZW5zdXJlX3ZhbHVlKG9wdGlvbi5kZXN0LCBbXSkKKyAgICAgICAgZGVzdC5hcHBlbmQodHVwbGUocmFyZ3NbMDpuYXJnc10pKQorICAgICAgICBwYXJzZXJfLmxhcmdzLmFwcGVuZChuYXJncykKKyAgICAgICAgZGVsIHJhcmdzWzA6bmFyZ3NdCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19tZWRkbGVfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLTEiLCAiZm9vIiwgIi0zIiwgImJhciIsICJiYXoiLCAicXV4Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3RoaW5ncyc6IFsoImZvbyIsKSwgKCJiYXIiLCAiYmF6IiwgInF1eCIpXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbMSwgM10pCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19tZWRkbGVfYXJnc19zZXBhcmF0b3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0yIiwgImZvbyIsICItLSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd0aGluZ3MnOiBbKCdmb28nLCAnLS0nKV19LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgWzJdKQorCitjbGFzcyBUZXN0Q2FsbGJhY2tNYW55QXJncyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKCItYSIsICItLWFwcGxlIiwgYWN0aW9uPSJjYWxsYmFjayIsIG5hcmdzPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2s9c2VsZi5wcm9jZXNzX21hbnksIHR5cGU9InN0cmluZyIpLAorICAgICAgICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItYiIsICItLWJvYiIsIGFjdGlvbj0iY2FsbGJhY2siLCBuYXJncz0zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPXNlbGYucHJvY2Vzc19tYW55LCB0eXBlPSJpbnQiKV0KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9ucykKKworICAgIGRlZiBwcm9jZXNzX21hbnkoc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXJfKToKKyAgICAgICAgaWYgb3B0ID09ICItYSI6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAoImZvbyIsICJiYXIiKSkKKyAgICAgICAgZWxpZiBvcHQgPT0gIi0tYXBwbGUiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgKCJkaW5nIiwgImRvbmciKSkKKyAgICAgICAgZWxpZiBvcHQgPT0gIi1iIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICgxLCAyLCAzKSkKKyAgICAgICAgZWxpZiBvcHQgPT0gIi0tYm9iIjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICgtNjY2LCA0MiwgMCkpCisKKyAgICBkZWYgdGVzdF9tYW55X2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hIiwgImZvbyIsICJiYXIiLCAiLS1hcHBsZSIsICJkaW5nIiwgImRvbmciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICItYiIsICIxIiwgIjIiLCAiMyIsICItLWJvYiIsICItNjY2IiwgIjQyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJhcHBsZSI6IE5vbmUsICJib2IiOiBOb25lfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQorCitjbGFzcyBUZXN0Q2FsbGJhY2tDaGVja0FiYnJldihCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IE9wdGlvblBhcnNlcigpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi0tZm9vLWJhciIsIGFjdGlvbj0iY2FsbGJhY2siLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPXNlbGYuY2hlY2tfYWJicmV2KQorCisgICAgZGVmIGNoZWNrX2FiYnJldihzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAiLS1mb28tYmFyIikKKworICAgIGRlZiB0ZXN0X2FiYnJldl9jYWxsYmFja19leHBhbnNpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tZm9vIl0sIHt9LCBbXSkKKworY2xhc3MgVGVzdENhbGxiYWNrVmFyQXJncyhCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBvcHRpb25zID0gW21ha2Vfb3B0aW9uKCItYSIsIHR5cGU9ImludCIsIG5hcmdzPTIsIGRlc3Q9ImEiKSwKKyAgICAgICAgICAgICAgICAgICBtYWtlX29wdGlvbigiLWIiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJiIiksCisgICAgICAgICAgICAgICAgICAgbWFrZV9vcHRpb24oIi1jIiwgIi0tY2FsbGJhY2siLCBhY3Rpb249ImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1zZWxmLnZhcmlhYmxlX2FyZ3MsIGRlc3Q9ImMiKV0KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9saXN0PW9wdGlvbnMpCisKKyAgICBkZWYgdmFyaWFibGVfYXJncyhzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWx1ZSBpcyBOb25lKQorICAgICAgICB2YWx1ZSA9IFtdCisgICAgICAgIHJhcmdzID0gcGFyc2VyLnJhcmdzCisgICAgICAgIHdoaWxlIHJhcmdzOgorICAgICAgICAgICAgYXJnID0gcmFyZ3NbMF0KKyAgICAgICAgICAgIGlmICgoYXJnWzoyXSA9PSAiLS0iIGFuZCBsZW4oYXJnKSA+IDIpIG9yCisgICAgICAgICAgICAgICAgKGFyZ1s6MV0gPT0gIi0iIGFuZCBsZW4oYXJnKSA+IDEgYW5kIGFyZ1sxXSAhPSAiLSIpKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoYXJnKQorICAgICAgICAgICAgICAgIGRlbCByYXJnc1swXQorICAgICAgICBzZXRhdHRyKHBhcnNlci52YWx1ZXMsIG9wdGlvbi5kZXN0LCB2YWx1ZSkKKworICAgIGRlZiB0ZXN0X3ZhcmlhYmxlX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1hMyIsICItNSIsICItLWNhbGxiYWNrIiwgImZvbyIsICJiYXIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6ICgzLCAtNSksICdiJzogTm9uZSwgJ2MnOiBbImZvbyIsICJiYXIiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2NvbnN1bWVfc2VwYXJhdG9yX3N0b3BfYXRfb3B0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItYyIsICIzNyIsICItLSIsICJ4eHgiLCAiLWIiLCAiaGVsbG8iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnYSc6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2InOiBUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjJzogWyIzNyIsICItLSIsICJ4eHgiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbGxvIl0pCisKKyAgICBkZWYgdGVzdF9wb3NpdGlvbmFsX2FyZ19hbmRfdmFyaWFibGVfYXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiaGVsbG8iLCAiLWMiLCAiZm9vIiwgIi0iLCAiYmFyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdiJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYyc6WyJmb28iLCAiLSIsICJiYXIiXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbGxvIl0pCisKKyAgICBkZWYgdGVzdF9zdG9wX2F0X29wdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZU9LKFsiLWMiLCAiZm9vIiwgIi1iIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiBOb25lLCAnYic6IFRydWUsICdjJzogWyJmb28iXX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X3N0b3BfYXRfaW52YWxpZF9vcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLWMiLCAiMyIsICItNSIsICItYSJdLCAibm8gc3VjaCBvcHRpb246IC01IikKKworCisjIC0tIFRlc3QgY29uZmxpY3QgaGFuZGxpbmcgYW5kIHBhcnNlci5wYXJzZV9hcmdzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQ29uZmxpY3RCYXNlKEJhc2VUZXN0KToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbbWFrZV9vcHRpb24oIi12IiwgIi0tdmVyYm9zZSIsIGFjdGlvbj0iY291bnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3Q9InZlcmJvc2UiLCBoZWxwPSJpbmNyZW1lbnQgdmVyYm9zaXR5IildCisgICAgICAgIHNlbGYucGFyc2VyID0gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKHVzYWdlPVNVUFBSRVNTX1VTQUdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fbGlzdD1vcHRpb25zKQorCisgICAgZGVmIHNob3dfdmVyc2lvbihzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcik6CisgICAgICAgIHBhcnNlci52YWx1ZXMuc2hvd192ZXJzaW9uID0gMQorCitjbGFzcyBUZXN0Q29uZmxpY3QoQ29uZmxpY3RCYXNlKToKKyAgICAiIiJVc2UgdGhlIGRlZmF1bHQgY29uZmxpY3QgcmVzb2x1dGlvbiBmb3IgT3B0aWsgMS4yOiBlcnJvci4iIiIKKyAgICBkZWYgYXNzZXJ0VHJ1ZWNvbmZsaWN0X2Vycm9yKHNlbGYsIGZ1bmMpOgorICAgICAgICBlcnIgPSBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIGZ1bmMsICgiLXYiLCAiLS12ZXJzaW9uIiksIHsnYWN0aW9uJyA6ICJjYWxsYmFjayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbGxiYWNrJyA6IHNlbGYuc2hvd192ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWxwJyA6ICJzaG93IHZlcnNpb24ifSwKKyAgICAgICAgICAgIE9wdGlvbkNvbmZsaWN0RXJyb3IsCisgICAgICAgICAgICAib3B0aW9uIC12Ly0tdmVyc2lvbjogY29uZmxpY3Rpbmcgb3B0aW9uIHN0cmluZyhzKTogLXYiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLm1zZywgImNvbmZsaWN0aW5nIG9wdGlvbiBzdHJpbmcocyk6IC12IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIub3B0aW9uX2lkLCAiLXYvLS12ZXJzaW9uIikKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X2Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWVjb25mbGljdF9lcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfZXJyb3JfZ3JvdXAoc2VsZik6CisgICAgICAgIGdyb3VwID0gT3B0aW9uR3JvdXAoc2VsZi5wYXJzZXIsICJHcm91cCAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlY29uZmxpY3RfZXJyb3IoZ3JvdXAuYWRkX29wdGlvbikKKworICAgIGRlZiB0ZXN0X25vX3N1Y2hfY29uZmxpY3RfaGFuZGxlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBzZWxmLnBhcnNlci5zZXRfY29uZmxpY3RfaGFuZGxlciwgKCdmb28nLCksIE5vbmUsCisgICAgICAgICAgICBWYWx1ZUVycm9yLCAiaW52YWxpZCBjb25mbGljdF9yZXNvbHV0aW9uIHZhbHVlICdmb28nIikKKworCitjbGFzcyBUZXN0Q29uZmxpY3RSZXNvbHZlKENvbmZsaWN0QmFzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBDb25mbGljdEJhc2Uuc2V0VXAoc2VsZikKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X2NvbmZsaWN0X2hhbmRsZXIoInJlc29sdmUiKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItdiIsICItLXZlcnNpb24iLCBhY3Rpb249ImNhbGxiYWNrIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaz1zZWxmLnNob3dfdmVyc2lvbiwgaGVscD0ic2hvdyB2ZXJzaW9uIikKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X3Jlc29sdmUoc2VsZik6CisgICAgICAgIHZfb3B0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXYiKQorICAgICAgICB2ZXJib3NlX29wdCA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tdmVyYm9zZSIpCisgICAgICAgIHZlcnNpb25fb3B0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJzaW9uIikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUodl9vcHQgaXMgdmVyc2lvbl9vcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2X29wdCBpcyBub3QgdmVyYm9zZV9vcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodl9vcHQuX2xvbmdfb3B0cywgWyItLXZlcnNpb24iXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2ZXJzaW9uX29wdC5fc2hvcnRfb3B0cywgWyItdiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcnNpb25fb3B0Ll9sb25nX29wdHMsIFsiLS12ZXJzaW9uIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyYm9zZV9vcHQuX3Nob3J0X29wdHMsIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcmJvc2Vfb3B0Ll9sb25nX29wdHMsIFsiLS12ZXJib3NlIl0pCisKKyAgICBkZWYgdGVzdF9jb25mbGljdF9yZXNvbHZlX2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3V0cHV0KFsiLWgiXSwgIiIiXAorT3B0aW9uczoKKyAgLS12ZXJib3NlICAgICAgaW5jcmVtZW50IHZlcmJvc2l0eQorICAtaCwgLS1oZWxwICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisgIC12LCAtLXZlcnNpb24gIHNob3cgdmVyc2lvbgorIiIiKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3RfcmVzb2x2ZV9zaG9ydF9vcHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi12Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiBOb25lLCAnc2hvd192ZXJzaW9uJzogMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X3Jlc29sdmVfbG9uZ19vcHQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi0tdmVyYm9zZSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyd2ZXJib3NlJzogMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X3Jlc29sdmVfbG9uZ19vcHRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItLXZlcmJvc2UiLCAiLS12ZXJzaW9uIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAxLCAnc2hvd192ZXJzaW9uJzogMX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworY2xhc3MgVGVzdENvbmZsaWN0T3ZlcnJpZGUoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UpCisgICAgICAgIHNlbGYucGFyc2VyLnNldF9jb25mbGljdF9oYW5kbGVyKCJyZXNvbHZlIikKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLW4iLCAiLS1kcnktcnVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249InN0b3JlX3RydWUiLCBkZXN0PSJkcnlfcnVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkb24ndCBkbyBhbnl0aGluZyIpCisgICAgICAgIHNlbGYucGFyc2VyLmFkZF9vcHRpb24oIi0tZHJ5LXJ1biIsICItbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSJzdG9yZV9jb25zdCIsIGNvbnN0PTQyLCBkZXN0PSJkcnlfcnVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJkcnkgcnVuIG1vZGUiKQorCisgICAgZGVmIHRlc3RfY29uZmxpY3Rfb3ZlcnJpZGVfb3B0cyhzZWxmKToKKyAgICAgICAgb3B0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS1kcnktcnVuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQuX3Nob3J0X29wdHMsIFsiLW4iXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQuX2xvbmdfb3B0cywgWyItLWRyeS1ydW4iXSkKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X292ZXJyaWRlX2hlbHAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0T3V0cHV0KFsiLWgiXSwgIiIiXAorT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorICAtbiwgLS1kcnktcnVuICBkcnkgcnVuIG1vZGUKKyIiIikKKworICAgIGRlZiB0ZXN0X2NvbmZsaWN0X292ZXJyaWRlX2FyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1uIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7J2RyeV9ydW4nOiA0Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkKKworIyAtLSBPdGhlciB0ZXN0aW5nLiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK19leHBlY3RlZF9oZWxwX2Jhc2ljID0gIiIiXAorVXNhZ2U6IGJhci5weSBbb3B0aW9uc10KKworT3B0aW9uczoKKyAgLWEgQVBQTEUgICAgICAgICAgIHRocm93IEFQUExFcyBhdCBiYXNrZXQKKyAgLWIgTlVNLCAtLWJvbz1OVU0gIHNob3V0ICJib28hIiBOVU0gdGltZXMgKGluIG9yZGVyIHRvIGZyaWdodGVuIGF3YXkgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAgZXZpbCBzcGlyaXRzIHRoYXQgY2F1c2UgdHJvdWJsZSBhbmQgbWF5aGVtKQorICAtLWZvbz1GT08gICAgICAgICAgc3RvcmUgRk9PIGluIHRoZSBmb28gbGlzdCBmb3IgbGF0ZXIgZm9vaW5nCisgIC1oLCAtLWhlbHAgICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisiIiIKKworX2V4cGVjdGVkX2hlbHBfbG9uZ19vcHRzX2ZpcnN0ID0gIiIiXAorVXNhZ2U6IGJhci5weSBbb3B0aW9uc10KKworT3B0aW9uczoKKyAgLWEgQVBQTEUgICAgICAgICAgIHRocm93IEFQUExFcyBhdCBiYXNrZXQKKyAgLS1ib289TlVNLCAtYiBOVU0gIHNob3V0ICJib28hIiBOVU0gdGltZXMgKGluIG9yZGVyIHRvIGZyaWdodGVuIGF3YXkgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAgZXZpbCBzcGlyaXRzIHRoYXQgY2F1c2UgdHJvdWJsZSBhbmQgbWF5aGVtKQorICAtLWZvbz1GT08gICAgICAgICAgc3RvcmUgRk9PIGluIHRoZSBmb28gbGlzdCBmb3IgbGF0ZXIgZm9vaW5nCisgIC0taGVscCwgLWggICAgICAgICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisiIiIKKworX2V4cGVjdGVkX2hlbHBfdGl0bGVfZm9ybWF0dGVyID0gIiIiXAorVXNhZ2UKKz09PT09CisgIGJhci5weSBbb3B0aW9uc10KKworT3B0aW9ucworPT09PT09PQorLWEgQVBQTEUgICAgICAgICAgIHRocm93IEFQUExFcyBhdCBiYXNrZXQKKy0tYm9vPU5VTSwgLWIgTlVNICBzaG91dCAiYm9vISIgTlVNIHRpbWVzIChpbiBvcmRlciB0byBmcmlnaHRlbiBhd2F5IGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICBldmlsIHNwaXJpdHMgdGhhdCBjYXVzZSB0cm91YmxlIGFuZCBtYXloZW0pCistLWZvbz1GT08gICAgICAgICAgc3RvcmUgRk9PIGluIHRoZSBmb28gbGlzdCBmb3IgbGF0ZXIgZm9vaW5nCistLWhlbHAsIC1oICAgICAgICAgc2hvdyB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdAorIiIiCisKK19leHBlY3RlZF9oZWxwX3Nob3J0X2xpbmVzID0gIiIiXAorVXNhZ2U6IGJhci5weSBbb3B0aW9uc10KKworT3B0aW9uczoKKyAgLWEgQVBQTEUgICAgICAgICAgIHRocm93IEFQUExFcyBhdCBiYXNrZXQKKyAgLWIgTlVNLCAtLWJvbz1OVU0gIHNob3V0ICJib28hIiBOVU0gdGltZXMgKGluIG9yZGVyIHRvCisgICAgICAgICAgICAgICAgICAgICBmcmlnaHRlbiBhd2F5IGFsbCB0aGUgZXZpbCBzcGlyaXRzCisgICAgICAgICAgICAgICAgICAgICB0aGF0IGNhdXNlIHRyb3VibGUgYW5kIG1heWhlbSkKKyAgLS1mb289Rk9PICAgICAgICAgIHN0b3JlIEZPTyBpbiB0aGUgZm9vIGxpc3QgZm9yIGxhdGVyCisgICAgICAgICAgICAgICAgICAgICBmb29pbmcKKyAgLWgsIC0taGVscCAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyIiIgorCitjbGFzcyBUZXN0SGVscChCYXNlVGVzdCk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYubWFrZV9wYXJzZXIoODApCisKKyAgICBkZWYgbWFrZV9wYXJzZXIoc2VsZiwgY29sdW1ucyk6CisgICAgICAgIG9wdGlvbnMgPSBbCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLWEiLCB0eXBlPSJzdHJpbmciLCBkZXN0PSdhJywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkFQUExFIiwgaGVscD0idGhyb3cgQVBQTEVzIGF0IGJhc2tldCIpLAorICAgICAgICAgICAgbWFrZV9vcHRpb24oIi1iIiwgIi0tYm9vIiwgdHlwZT0iaW50IiwgZGVzdD0nYm9vJywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9Ik5VTSIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPQorICAgICAgICAgICAgICAgICAgICAgICAgInNob3V0IFwiYm9vIVwiIE5VTSB0aW1lcyAoaW4gb3JkZXIgdG8gZnJpZ2h0ZW4gYXdheSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIHRoZSBldmlsIHNwaXJpdHMgdGhhdCBjYXVzZSB0cm91YmxlIGFuZCBtYXloZW0pIiksCisgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1mb28iLCBhY3Rpb249ImFwcGVuZCIsIHR5cGU9InN0cmluZyIsIGRlc3Q9J2ZvbycsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJzdG9yZSBGT08gaW4gdGhlIGZvbyBsaXN0IGZvciBsYXRlciBmb29pbmciKSwKKyAgICAgICAgICAgIF0KKworICAgICAgICAjIFdlIG5lZWQgdG8gc2V0IENPTFVNTlMgZm9yIHRoZSBPcHRpb25QYXJzZXIgY29uc3RydWN0b3IsIGJ1dAorICAgICAgICAjIHdlIG11c3QgcmVzdG9yZSBpdHMgb3JpZ2luYWwgdmFsdWUgLS0gb3RoZXJ3aXNlLCB0aGlzIHRlc3QKKyAgICAgICAgIyBzY3Jld3MgdGhpbmdzIHVwIGZvciBvdGhlciB0ZXN0cyB3aGVuIGl0J3MgcGFydCBvZiB0aGUgUHl0aG9uCisgICAgICAgICMgdGVzdCBzdWl0ZS4KKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgIGVudlsnQ09MVU1OUyddID0gc3RyKGNvbHVtbnMpCisgICAgICAgICAgICByZXR1cm4gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbnMpCisKKyAgICBkZWYgYXNzZXJ0SGVscEVxdWFscyhzZWxmLCBleHBlY3RlZF9vdXRwdXQpOgorICAgICAgICBpZiB0eXBlKGV4cGVjdGVkX291dHB1dCkgaXMgdHlwZXMuVW5pY29kZVR5cGU6CisgICAgICAgICAgICBlbmNvZGluZyA9IHNlbGYucGFyc2VyLl9nZXRfZW5jb2Rpbmcoc3lzLnN0ZG91dCkKKyAgICAgICAgICAgIGV4cGVjdGVkX291dHB1dCA9IGV4cGVjdGVkX291dHB1dC5lbmNvZGUoZW5jb2RpbmcsICJyZXBsYWNlIikKKworICAgICAgICBzYXZlX2FyZ3YgPSBzeXMuYXJndls6XQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIE1ha2Ugb3B0cGFyc2UgYmVsaWV2ZSBiYXIucHkgaXMgYmVpbmcgZXhlY3V0ZWQuCisgICAgICAgICAgICBzeXMuYXJndlswXSA9IG9zLnBhdGguam9pbigiZm9vIiwgImJhci5weSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydE91dHB1dChbIi1oIl0sIGV4cGVjdGVkX291dHB1dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5hcmd2WzpdID0gc2F2ZV9hcmd2CisKKyAgICBkZWYgdGVzdF9oZWxwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoX2V4cGVjdGVkX2hlbHBfYmFzaWMpCisKKyAgICBkZWYgdGVzdF9oZWxwX29sZF91c2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0X3VzYWdlKCJVc2FnZTogJXByb2cgW29wdGlvbnNdIikKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF9oZWxwX2Jhc2ljKQorCisgICAgZGVmIHRlc3RfaGVscF9sb25nX29wdHNfZmlyc3Qoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLmZvcm1hdHRlci5zaG9ydF9maXJzdCA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF9oZWxwX2xvbmdfb3B0c19maXJzdCkKKworICAgIGRlZiB0ZXN0X2hlbHBfdGl0bGVfZm9ybWF0dGVyKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgorICAgICAgICAgICAgZW52WyJDT0xVTU5TIl0gPSAiODAiCisgICAgICAgICAgICBzZWxmLnBhcnNlci5mb3JtYXR0ZXIgPSBUaXRsZWRIZWxwRm9ybWF0dGVyKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SGVscEVxdWFscyhfZXhwZWN0ZWRfaGVscF90aXRsZV9mb3JtYXR0ZXIpCisKKyAgICBkZWYgdGVzdF93cmFwX2NvbHVtbnMoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgd3JhcHBpbmcgcmVzcGVjdHMgJENPTFVNTlMgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgICAgICMgTmVlZCB0byByZWNvbnN0cnVjdCB0aGUgcGFyc2VyLCBzaW5jZSB0aGF0J3MgdGhlIG9ubHkgdGltZQorICAgICAgICAjIHdlIGxvb2sgYXQgJENPTFVNTlMuCisgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5tYWtlX3BhcnNlcig2MCkKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF9oZWxwX3Nob3J0X2xpbmVzKQorCisgICAgZGVmIHRlc3RfaGVscF91bmljb2RlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWEiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPXUib2xcdTAwRTkhIikKKyAgICAgICAgZXhwZWN0ID0gdSIiIlwKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLWEgICAgICAgICAgb2xcdTAwRTkhCisiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X2hlbHBfdW5pY29kZV9kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXUib2xcdTAwRTkhIikKKyAgICAgICAgZXhwZWN0ID0gdSIiIlwKK29sXHUwMEU5IQorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X2hlbHBfZGVzY3JpcHRpb25fZ3JvdXBzKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlci5zZXRfZGVzY3JpcHRpb24oCisgICAgICAgICAgICAiVGhpcyBpcyB0aGUgcHJvZ3JhbSBkZXNjcmlwdGlvbiBmb3IgJXByb2cuICAlcHJvZyBoYXMgIgorICAgICAgICAgICAgImFuIG9wdGlvbiBncm91cCBhcyB3ZWxsIGFzIHNpbmdsZSBvcHRpb25zLiIpCisKKyAgICAgICAgZ3JvdXAgPSBPcHRpb25Hcm91cCgKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLCAiRGFuZ2Vyb3VzIE9wdGlvbnMiLAorICAgICAgICAgICAgIkNhdXRpb246IHVzZSBvZiB0aGVzZSBvcHRpb25zIGlzIGF0IHlvdXIgb3duIHJpc2suICAiCisgICAgICAgICAgICAiSXQgaXMgYmVsaWV2ZWQgdGhhdCBzb21lIG9mIHRoZW0gYml0ZS4iKQorICAgICAgICBncm91cC5hZGRfb3B0aW9uKCItZyIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGhlbHA9Ikdyb3VwIG9wdGlvbi4iKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uX2dyb3VwKGdyb3VwKQorCisgICAgICAgIGV4cGVjdCA9ICIiIlwKK1VzYWdlOiBiYXIucHkgW29wdGlvbnNdCisKK1RoaXMgaXMgdGhlIHByb2dyYW0gZGVzY3JpcHRpb24gZm9yIGJhci5weS4gIGJhci5weSBoYXMgYW4gb3B0aW9uIGdyb3VwIGFzCit3ZWxsIGFzIHNpbmdsZSBvcHRpb25zLgorCitPcHRpb25zOgorICAtYSBBUFBMRSAgICAgICAgICAgdGhyb3cgQVBQTEVzIGF0IGJhc2tldAorICAtYiBOVU0sIC0tYm9vPU5VTSAgc2hvdXQgImJvbyEiIE5VTSB0aW1lcyAoaW4gb3JkZXIgdG8gZnJpZ2h0ZW4gYXdheSBhbGwgdGhlCisgICAgICAgICAgICAgICAgICAgICBldmlsIHNwaXJpdHMgdGhhdCBjYXVzZSB0cm91YmxlIGFuZCBtYXloZW0pCisgIC0tZm9vPUZPTyAgICAgICAgICBzdG9yZSBGT08gaW4gdGhlIGZvbyBsaXN0IGZvciBsYXRlciBmb29pbmcKKyAgLWgsIC0taGVscCAgICAgICAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKworICBEYW5nZXJvdXMgT3B0aW9uczoKKyAgICBDYXV0aW9uOiB1c2Ugb2YgdGhlc2Ugb3B0aW9ucyBpcyBhdCB5b3VyIG93biByaXNrLiAgSXQgaXMgYmVsaWV2ZWQKKyAgICB0aGF0IHNvbWUgb2YgdGhlbSBiaXRlLgorCisgICAgLWcgICAgICAgICAgICAgICBHcm91cCBvcHRpb24uCisiIiIKKworICAgICAgICBzZWxmLmFzc2VydEhlbHBFcXVhbHMoZXhwZWN0KQorCisgICAgICAgIHNlbGYucGFyc2VyLmVwaWxvZyA9ICJQbGVhc2UgcmVwb3J0IGJ1Z3MgdG8gL2Rldi9udWxsLiIKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKGV4cGVjdCArICJcblBsZWFzZSByZXBvcnQgYnVncyB0byAvZGV2L251bGwuXG4iKQorCisKK2NsYXNzIFRlc3RNYXRjaEFiYnJldihCYXNlVGVzdCk6CisgICAgZGVmIHRlc3RfbWF0Y2hfYWJicmV2KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9tYXRjaF9hYmJyZXYoIi0tZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ii0tZm96IjogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLS1mb28iOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItLWZpZSI6IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi0tZiI6IE5vbmV9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiLS1mIikKKworICAgIGRlZiB0ZXN0X21hdGNoX2FiYnJldl9lcnJvcihzZWxmKToKKyAgICAgICAgcyA9ICItLWYiCisgICAgICAgIHdvcmRtYXAgPSB7Ii0tZm96IjogTm9uZSwgIi0tZm9vIjogTm9uZSwgIi0tZmllIjogTm9uZX0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBfbWF0Y2hfYWJicmV2LCAocywgd29yZG1hcCksIE5vbmUsCisgICAgICAgICAgICBCYWRPcHRpb25FcnJvciwgImFtYmlndW91cyBvcHRpb246IC0tZiAoLS1maWUsIC0tZm9vLCAtLWZvej8pIikKKworCitjbGFzcyBUZXN0UGFyc2VOdW1iZXIoQmFzZVRlc3QpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIoKQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItbiIsIHR5cGU9aW50KQorICAgICAgICBzZWxmLnBhcnNlci5hZGRfb3B0aW9uKCItbCIsIHR5cGU9bG9uZykKKworICAgIGRlZiB0ZXN0X3BhcnNlX251bV9mYWlsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIF9wYXJzZV9udW0sICgiIiwgaW50KSwge30sCisgICAgICAgICAgICBWYWx1ZUVycm9yLAorICAgICAgICAgICAgcmUuY29tcGlsZShyImludmFsaWQgbGl0ZXJhbCBmb3IgaW50KCkuKjogJz8nPyIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIF9wYXJzZV9udW0sICgiMHhPb29wcyIsIGxvbmcpLCB7fSwKKyAgICAgICAgICAgIFZhbHVlRXJyb3IsCisgICAgICAgICAgICByZS5jb21waWxlKHIiaW52YWxpZCBsaXRlcmFsIGZvciBsb25nKCkuKjogJz8weE9vb3BzJz8iKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlX251bV9vayhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIwIiwgaW50KSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIweDEwIiwgaW50KSwgMTYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3BhcnNlX251bSgiMFhBIiwgbG9uZyksIDEwTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfcGFyc2VfbnVtKCIwMTAiLCBsb25nKSwgOEwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3BhcnNlX251bSgiMGIxMSIsIGludCksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3BhcnNlX251bSgiMGIiLCBsb25nKSwgMEwpCisKKyAgICBkZWYgdGVzdF9udW1lcmljX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1uIiwgIjQyIiwgIi1sIiwgIjB4MjAiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIm4iOiA0MiwgImwiOiAweDIwIH0sIFtdKQorICAgICAgICBzZWxmLmFzc2VydFBhcnNlT0soWyItbiIsICIwYjAxMDEiLCAiLWwwMTAiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIm4iOiA1LCAibCI6IDggfSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLW4wMDgiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtbjogaW52YWxpZCBpbnRlZ2VyIHZhbHVlOiAnMDA4JyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VGYWlsKFsiLWwwYjAxMjMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiAtbDogaW52YWxpZCBsb25nIGludGVnZXIgdmFsdWU6ICcwYjAxMjMnIikKKyAgICAgICAgc2VsZi5hc3NlcnRQYXJzZUZhaWwoWyItbCIsICIweDEyeCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIC1sOiBpbnZhbGlkIGxvbmcgaW50ZWdlciB2YWx1ZTogJzB4MTJ4JyIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wdHBhcnNlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wdHBhcnNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNjYmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wdHBhcnNlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29wdHBhcnNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGNjYmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3B0cGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDcxZjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5CkBAIC0wLDAgKzEsODY2IEBACisjIEFzIGEgdGVzdCBzdWl0ZSBmb3IgdGhlIG9zIG1vZHVsZSwgdGhpcyBpcyB3b2VmdWxseSBpbmFkZXF1YXRlLCBidXQgdGhpcworIyBkb2VzIGFkZCB0ZXN0cyBmb3IgYSBmZXcgZnVuY3Rpb25zIHdoaWNoIGhhdmUgYmVlbiBkZXRlcm1pbmVkIHRvIGJlIG1vcmUKKyMgcG9ydGFibGUgdGhhbiB0aGV5IGhhZCBiZWVuIHRob3VnaHQgdG8gYmUuCisKK2ltcG9ydCBvcworaW1wb3J0IGVycm5vCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3YXJuaW5ncworaW1wb3J0IHN5cworaW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0aW1lCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgbW1hcAoraW1wb3J0IHV1aWQKKword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0ZW1wbmFtIiwgUnVudGltZVdhcm5pbmcsIF9fbmFtZV9fKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0bXBuYW0iLCBSdW50aW1lV2FybmluZywgX19uYW1lX18pCisKKyMgVGVzdHMgY3JlYXRpbmcgVEVTVEZOCitjbGFzcyBGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICB0ZWFyRG93biA9IHNldFVwCisKKyAgICBkZWYgdGVzdF9hY2Nlc3Moc2VsZik6CisgICAgICAgIGYgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLk9fQ1JFQVR8b3MuT19SRFdSKQorICAgICAgICBvcy5jbG9zZShmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MuYWNjZXNzKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLldfT0spKQorCisgICAgZGVmIHRlc3RfY2xvc2VyYW5nZShzZWxmKToKKyAgICAgICAgZmlyc3QgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLk9fQ1JFQVR8b3MuT19SRFdSKQorICAgICAgICAjIFdlIG11c3QgYWxsb2NhdGUgdHdvIGNvbnNlY3V0aXZlIGZpbGUgZGVzY3JpcHRvcnMsIG90aGVyd2lzZQorICAgICAgICAjIGl0IHdpbGwgbWVzcyB1cCBvdGhlciBmaWxlIGRlc2NyaXB0b3JzIChwZXJoYXBzIGV2ZW4gdGhlIHRocmVlCisgICAgICAgICMgc3RhbmRhcmQgb25lcykuCisgICAgICAgIHNlY29uZCA9IG9zLmR1cChmaXJzdCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0cmllcyA9IDAKKyAgICAgICAgICAgIHdoaWxlIHNlY29uZCAhPSBmaXJzdCArIDE6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmlyc3QpCisgICAgICAgICAgICAgICAgcmV0cmllcyArPSAxCisgICAgICAgICAgICAgICAgaWYgcmV0cmllcyA+IDEwOgorICAgICAgICAgICAgICAgICAgICAjIFhYWCB0ZXN0IHNraXBwZWQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiY291bGRuJ3QgYWxsb2NhdGUgdHdvIGNvbnNlY3V0aXZlIGZkcyIpCisgICAgICAgICAgICAgICAgZmlyc3QsIHNlY29uZCA9IHNlY29uZCwgb3MuZHVwKHNlY29uZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNsb3NlKHNlY29uZCkKKyAgICAgICAgIyBjbG9zZSBhIGZkIHRoYXQgaXMgb3BlbiwgYW5kIG9uZSB0aGF0IGlzbid0CisgICAgICAgIG9zLmNsb3NlcmFuZ2UoZmlyc3QsIGZpcnN0ICsgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3Mud3JpdGUsIGZpcnN0LCAiYSIpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3JlbmFtZShzZWxmKToKKyAgICAgICAgcGF0aCA9IHVuaWNvZGUodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgb2xkID0gc3lzLmdldHJlZmNvdW50KHBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3MucmVuYW1lLCBwYXRoLCAwKQorICAgICAgICBuZXcgPSBzeXMuZ2V0cmVmY291bnQocGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGQsIG5ldykKKworCitjbGFzcyBUZW1wb3JhcnlGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5maWxlcyA9IFtdCisgICAgICAgIG9zLm1rZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuZmlsZXM6CisgICAgICAgICAgICBvcy51bmxpbmsobmFtZSkKKyAgICAgICAgb3Mucm1kaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiBjaGVja190ZW1wZmlsZShzZWxmLCBuYW1lKToKKyAgICAgICAgIyBtYWtlIHN1cmUgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0OgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAiZmlsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGVtcG9yYXJ5IGZpbGUiKQorICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBjYW4gY3JlYXRlIHRoZSBmaWxlCisgICAgICAgIG9wZW4obmFtZSwgInciKQorICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZChuYW1lKQorCisgICAgZGVmIHRlc3RfdGVtcG5hbShzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICJ0ZW1wbmFtIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0ZW1wbmFtIiwgUnVudGltZVdhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByInRlc3Rfb3MkIikKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidGVtcG5hbSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdGVtcGZpbGUob3MudGVtcG5hbSgpKQorCisgICAgICAgICAgICBuYW1lID0gb3MudGVtcG5hbSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5jaGVja190ZW1wZmlsZShuYW1lKQorCisgICAgICAgICAgICBuYW1lID0gb3MudGVtcG5hbSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicGZ4IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmJhc2VuYW1lKG5hbWUpWzozXSA9PSAicGZ4IikKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfdGVtcGZpbGUobmFtZSkKKworICAgIGRlZiB0ZXN0X3RtcGZpbGUoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAidG1wZmlsZSIpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgQXMgd2l0aCB0ZXN0X3RtcG5hbSgpIGJlbG93LCB0aGUgV2luZG93cyBpbXBsZW1lbnRhdGlvbiBvZiB0bXBmaWxlKCkKKyAgICAgICAgIyBhdHRlbXB0cyB0byBjcmVhdGUgYSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBkcml2ZS4KKyAgICAgICAgIyBPbiBWaXN0YSBhbmQgU2VydmVyIDIwMDgsIHRoaXMgdGVzdCB3aWxsIGFsd2F5cyBmYWlsIGZvciBub3JtYWwgdXNlcnMKKyAgICAgICAgIyBhcyB3cml0aW5nIHRvIHRoZSByb290IGRpcmVjdG9yeSByZXF1aXJlcyBlbGV2YXRlZCBwcml2aWxlZ2VzLiAgV2l0aAorICAgICAgICAjIFhQIGFuZCBiZWxvdywgdGhlIHNlbWFudGljcyBvZiB0bXBmaWxlKCkgYXJlIHRoZSBzYW1lLCBidXQgdGhlIHVzZXIKKyAgICAgICAgIyBydW5uaW5nIHRoZSB0ZXN0IGlzIG1vcmUgbGlrZWx5IHRvIGhhdmUgYWRtaW5pc3RyYXRpdmUgcHJpdmlsZWdlcyBvbgorICAgICAgICAjIHRoZWlyIGFjY291bnQgYWxyZWFkeS4gIElmIHRoYXQncyB0aGUgY2FzZSwgdGhlbiBvcy50bXBmaWxlKCkgc2hvdWxkCisgICAgICAgICMgd29yay4gIEluIG9yZGVyIHRvIG1ha2UgdGhpcyB0ZXN0IGFzIHVzZWZ1bCBhcyBwb3NzaWJsZSwgcmF0aGVyIHRoYW4KKyAgICAgICAgIyB0cnlpbmcgdG8gZGV0ZWN0IFdpbmRvd3MgdmVyc2lvbnMgb3Igd2hldGhlciBvciBub3QgdGhlIHVzZXIgaGFzIHRoZQorICAgICAgICAjIHJpZ2h0IHBlcm1pc3Npb25zLCBqdXN0IHRyeSBhbmQgY3JlYXRlIGEgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3RvcnkKKyAgICAgICAgIyBhbmQgc2VlIGlmIGl0IHJhaXNlcyBhICdQZXJtaXNzaW9uIGRlbmllZCcgT1NFcnJvci4gIElmIGl0IGRvZXMsIHRoZW4KKyAgICAgICAgIyB0ZXN0IHRoYXQgYSBzdWJzZXF1ZW50IGNhbGwgdG8gb3MudG1wZmlsZSgpIHJhaXNlcyB0aGUgc2FtZSBlcnJvci4gSWYKKyAgICAgICAgIyBpdCBkb2Vzbid0LCBhc3N1bWUgd2UncmUgb24gWFAgb3IgYmVsb3cgYW5kIHRoZSB1c2VyIHJ1bm5pbmcgdGhlIHRlc3QKKyAgICAgICAgIyBoYXMgYWRtaW5pc3RyYXRpdmUgcHJpdmlsZWdlcywgYW5kIHByb2NlZWQgd2l0aCB0aGUgdGVzdCBhcyBub3JtYWwuCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidG1wZmlsZSIsIERlcHJlY2F0aW9uV2FybmluZykKKworICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICAgICAgbmFtZSA9ICdcXHB5dGhvbl90ZXN0X29zX3Rlc3RfdG1wZmlsZS50eHQnCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMobmFtZSk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShuYW1lKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnAgPSBvcGVuKG5hbWUsICd3JykKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZmlyc3Q6CisgICAgICAgICAgICAgICAgICAgICMgb3BlbigpIGZhaWxlZCwgYXNzZXJ0IHRtcGZpbGUoKSBmYWlscyBpbiB0aGUgc2FtZSB3YXkuCisgICAgICAgICAgICAgICAgICAgICMgQWx0aG91Z2ggb3BlbigpIHJhaXNlcyBhbiBJT0Vycm9yIGFuZCBvcy50bXBmaWxlKCkgcmFpc2VzIGFuCisgICAgICAgICAgICAgICAgICAgICMgT1NFcnJvcigpLCAnYXJncycgd2lsbCBiZSAoMTMsICdQZXJtaXNzaW9uIGRlbmllZCcpIGluIGJvdGgKKyAgICAgICAgICAgICAgICAgICAgIyBjYXNlcy4KKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZnAgPSBvcy50bXBmaWxlKCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIHNlY29uZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3QuYXJncywgc2Vjb25kLmFyZ3MpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIG9zLnRtcGZpbGUoKSB0byByYWlzZSBPU0Vycm9yIikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBvcGVuKCkgd29ya2VkLCB0aGVyZWZvcmUsIHRtcGZpbGUoKSBzaG91bGQgd29yay4gIENsb3NlIG91cgorICAgICAgICAgICAgICAgICAgICAjIGR1bW15IGZpbGUgYW5kIHByb2NlZWQgd2l0aCB0aGUgdGVzdCBhcyBub3JtYWwuCisgICAgICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKG5hbWUpCisKKyAgICAgICAgICAgIGZwID0gb3MudG1wZmlsZSgpCisgICAgICAgICAgICBmcC53cml0ZSgiZm9vYmFyIikKKyAgICAgICAgICAgIGZwLnNlZWsoMCwwKQorICAgICAgICAgICAgcyA9IGZwLnJlYWQoKQorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gImZvb2JhciIpCisKKyAgICBkZWYgdGVzdF90bXBuYW0oc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAidG1wbmFtIik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0bXBuYW0iLCBSdW50aW1lV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIidGVzdF9vcyQiKQorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0bXBuYW0iLCBEZXByZWNhdGlvbldhcm5pbmcpCisKKyAgICAgICAgICAgIG5hbWUgPSBvcy50bXBuYW0oKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgid2luMzIiLCk6CisgICAgICAgICAgICAgICAgIyBUaGUgV2luZG93cyB0bXBuYW0oKSBzZWVtcyB1c2VsZXNzLiAgRnJvbSB0aGUgTVMgZG9jczoKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgIyAgICAgVGhlIGNoYXJhY3RlciBzdHJpbmcgdGhhdCB0bXBuYW0gY3JlYXRlcyBjb25zaXN0cyBvZgorICAgICAgICAgICAgICAgICMgICAgIHRoZSBwYXRoIHByZWZpeCwgZGVmaW5lZCBieSB0aGUgZW50cnkgUF90bXBkaXIgaW4gdGhlCisgICAgICAgICAgICAgICAgIyAgICAgZmlsZSBTVERJTy5ILCBmb2xsb3dlZCBieSBhIHNlcXVlbmNlIGNvbnNpc3Rpbmcgb2YgdGhlCisgICAgICAgICAgICAgICAgIyAgICAgZGlnaXQgY2hhcmFjdGVycyAnMCcgdGhyb3VnaCAnOSc7IHRoZSBudW1lcmljYWwgdmFsdWUKKyAgICAgICAgICAgICAgICAjICAgICBvZiB0aGlzIHN0cmluZyBpcyBpbiB0aGUgcmFuZ2UgMSAtIDY1LDUzNS4gIENoYW5naW5nIHRoZQorICAgICAgICAgICAgICAgICMgICAgIGRlZmluaXRpb25zIG9mIExfdG1wbmFtIG9yIFBfdG1wZGlyIGluIFNURElPLkggZG9lcyBub3QKKyAgICAgICAgICAgICAgICAjICAgICBjaGFuZ2UgdGhlIG9wZXJhdGlvbiBvZiB0bXBuYW0uCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgICMgVGhlIHJlYWxseSBiaXphcnJlIHBhcnQgaXMgdGhhdCwgYXQgbGVhc3QgdW5kZXIgTVNWQzYsCisgICAgICAgICAgICAgICAgIyBQX3RtcGRpciBpcyAiXFwiLiAgVGhhdCBpcywgdGhlIHBhdGggcmV0dXJuZWQgcmVmZXJzIHRvCisgICAgICAgICAgICAgICAgIyB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBkcml2ZS4gIFRoYXQncyBhIHRlcnJpYmxlIHBsYWNlIHRvCisgICAgICAgICAgICAgICAgIyBwdXQgdGVtcCBmaWxlcywgYW5kLCBkZXBlbmRpbmcgb24gcHJpdmlsZWdlcywgdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAjIG1heSBub3QgZXZlbiBiZSBhYmxlIHRvIG9wZW4gYSBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIGFscmVhZHkgZXhpc3RzIGZvciB0ZW1wb3JhcnkgZmlsZSIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfdGVtcGZpbGUobmFtZSkKKworIyBUZXN0IGF0dHJpYnV0ZXMgb24gcmV0dXJuIHZhbHVlcyBmcm9tIG9zLipzdGF0KiBmYW1pbHkuCitjbGFzcyBTdGF0QXR0cmlidXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgb3MubWtkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5mbmFtZSA9IG9zLnBhdGguam9pbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiZjEiKQorICAgICAgICBmID0gb3BlbihzZWxmLmZuYW1lLCAnd2InKQorICAgICAgICBmLndyaXRlKCJBQkMiKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MudW5saW5rKHNlbGYuZm5hbWUpCisgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9zdGF0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAic3RhdCIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW1wb3J0IHN0YXQKKyAgICAgICAgcmVzdWx0ID0gb3Muc3RhdChzZWxmLmZuYW1lKQorCisgICAgICAgICMgTWFrZSBzdXJlIGRpcmVjdCBhY2Nlc3Mgd29ya3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbc3RhdC5TVF9TSVpFXSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc3Rfc2l6ZSwgMykKKworICAgICAgICAjIE1ha2Ugc3VyZSBhbGwgdGhlIGF0dHJpYnV0ZXMgYXJlIHRoZXJlCisgICAgICAgIG1lbWJlcnMgPSBkaXIocmVzdWx0KQorICAgICAgICBmb3IgbmFtZSBpbiBkaXIoc3RhdCk6CisgICAgICAgICAgICBpZiBuYW1lWzozXSA9PSAnU1RfJzoKKyAgICAgICAgICAgICAgICBhdHRyID0gbmFtZS5sb3dlcigpCisgICAgICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgiVElNRSIpOgorICAgICAgICAgICAgICAgICAgICBkZWYgdHJ1bmMoeCk6IHJldHVybiBpbnQoeCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkZWYgdHJ1bmMoeCk6IHJldHVybiB4CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cnVuYyhnZXRhdHRyKHJlc3VsdCwgYXR0cikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2dldGF0dHIoc3RhdCwgbmFtZSldKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYXR0ciwgbWVtYmVycykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHRbMjAwXQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBhc3NpZ25tZW50IGZhaWxzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdC5zdF9tb2RlID0gMQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQuc3RfcmRldiA9IDEKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCIpCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0LnBhcnJvdCA9IDEKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gZXhjZXB0aW9uIHJhaXNlZCIpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFVzZSB0aGUgc3RhdF9yZXN1bHQgY29uc3RydWN0b3Igd2l0aCBhIHRvby1zaG9ydCB0dXBsZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0MiA9IG9zLnN0YXRfcmVzdWx0KCgxMCwpKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFVzZSB0aGUgY29uc3RydWN0b3Igd2l0aCBhIHRvby1sb25nIHR1cGxlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQyID0gb3Muc3RhdF9yZXN1bHQoKDAsMSwyLDMsNCw1LDYsNyw4LDksMTAsMTEsMTIsMTMsMTQpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisKKyAgICBkZWYgdGVzdF9zdGF0dmZzX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKG9zLCAic3RhdHZmcyIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gb3Muc3RhdHZmcyhzZWxmLmZuYW1lKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgICMgT24gQXRoZU9TLCBnbGliYyBhbHdheXMgcmV0dXJucyBFTk9TWVMKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRU5PU1lTOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgTWFrZSBzdXJlIGRpcmVjdCBhY2Nlc3Mgd29ya3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZl9iZnJlZSwgcmVzdWx0WzNdKQorCisgICAgICAgICMgTWFrZSBzdXJlIGFsbCB0aGUgYXR0cmlidXRlcyBhcmUgdGhlcmUuCisgICAgICAgIG1lbWJlcnMgPSAoJ2JzaXplJywgJ2Zyc2l6ZScsICdibG9ja3MnLCAnYmZyZWUnLCAnYmF2YWlsJywgJ2ZpbGVzJywKKyAgICAgICAgICAgICAgICAgICAgJ2ZmcmVlJywgJ2ZhdmFpbCcsICdmbGFnJywgJ25hbWVtYXgnKQorICAgICAgICBmb3IgdmFsdWUsIG1lbWJlciBpbiBlbnVtZXJhdGUobWVtYmVycyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIocmVzdWx0LCAnZl8nICsgbWVtYmVyKSwgcmVzdWx0W3ZhbHVlXSkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGFzc2lnbm1lbnQgcmVhbGx5IGZhaWxzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdC5mX2JmcmVlID0gMQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQucGFycm90ID0gMQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVXNlIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGEgdG9vLXNob3J0IHR1cGxlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQyID0gb3Muc3RhdHZmc19yZXN1bHQoKDEwLCkpCisgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiByYWlzZWQiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVXNlIHRoZSBjb25zdHJ1Y3RvciB3aXRoIGEgdG9vLWxvbmcgdHVwbGUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdDIgPSBvcy5zdGF0dmZzX3Jlc3VsdCgoMCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF91dGltZV9kaXIoc2VsZik6CisgICAgICAgIGRlbHRhID0gMTAwMDAwMAorICAgICAgICBzdCA9IG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgIyByb3VuZCB0byBpbnQsIGJlY2F1c2Ugc29tZSBzeXN0ZW1zIG1heSBzdXBwb3J0IHN1Yi1zZWNvbmQKKyAgICAgICAgIyB0aW1lIHN0YW1wcyBpbiBzdGF0LCBidXQgbm90IGluIHV0aW1lLgorICAgICAgICBvcy51dGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAoc3Quc3RfYXRpbWUsIGludChzdC5zdF9tdGltZS1kZWx0YSkpKQorICAgICAgICBzdDIgPSBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3QyLnN0X210aW1lLCBpbnQoc3Quc3RfbXRpbWUtZGVsdGEpKQorCisgICAgIyBSZXN0cmljdCB0ZXN0IHRvIFdpbjMyLCBzaW5jZSB0aGVyZSBpcyBubyBndWFyYW50ZWUgb3RoZXIKKyAgICAjIHN5c3RlbXMgc3VwcG9ydCBjZW50aXNlY29uZHMKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgZGVmIGdldF9maWxlX3N5c3RlbShwYXRoKToKKyAgICAgICAgICAgIHJvb3QgPSBvcy5wYXRoLnNwbGl0ZHJpdmUob3MucGF0aC5hYnNwYXRoKHBhdGgpKVswXSArICdcXCcKKyAgICAgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICAgICAgICAgIGtlcm5lbDMyID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMgorICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKCIiLCAxMDApCisgICAgICAgICAgICBpZiBrZXJuZWwzMi5HZXRWb2x1bWVJbmZvcm1hdGlvbkEocm9vdCwgTm9uZSwgMCwgTm9uZSwgTm9uZSwgTm9uZSwgYnVmLCBsZW4oYnVmKSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1Zi52YWx1ZQorCisgICAgICAgIGlmIGdldF9maWxlX3N5c3RlbSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSA9PSAiTlRGUyI6CisgICAgICAgICAgICBkZWYgdGVzdF8xNTY1MTUwKHNlbGYpOgorICAgICAgICAgICAgICAgIHQxID0gMTE1OTE5NTAzOS4yNQorICAgICAgICAgICAgICAgIG9zLnV0aW1lKHNlbGYuZm5hbWUsICh0MSwgdDEpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChzZWxmLmZuYW1lKS5zdF9tdGltZSwgdDEpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0X2xhcmdlX3RpbWUoc2VsZik6CisgICAgICAgICAgICAgICAgdDEgPSA1MDAwMDAwMDAwICMgc29tZSBkYXkgaW4gMjEyOAorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgI05vdGUgZmFpbCBpZiB0aW1lX3QgaXMgMzIgYml0CisgICAgICAgICAgICAgICAgICAgIG9zLnV0aW1lKHNlbGYuZm5hbWUsICh0MSwgdDEpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJyZXF1aXJlcyBhdCBsZWFzdCA2NC1iaXQgdGltZV90IikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnN0YXQoc2VsZi5mbmFtZSkuc3RfbXRpbWUsIHQxKQorCisgICAgICAgIGRlZiB0ZXN0XzE2ODY0NzUoc2VsZik6CisgICAgICAgICAgICAjIFZlcmlmeSB0aGF0IGFuIG9wZW4gZmlsZSBjYW4gYmUgc3RhdCdlZAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnN0YXQociJjOlxwYWdlZmlsZS5zeXMiKQorICAgICAgICAgICAgZXhjZXB0IFdpbmRvd3NFcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IDI6ICMgZmlsZSBkb2VzIG5vdCBleGlzdDsgY2Fubm90IHJ1biB0ZXN0CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiQ291bGQgbm90IHN0YXQgcGFnZWZpbGUuc3lzIikKKworZnJvbSB0ZXN0IGltcG9ydCBtYXBwaW5nX3Rlc3RzCisKK2NsYXNzIEVudmlyb25UZXN0cyhtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgIiIiY2hlY2sgdGhhdCBvcy5lbnZpcm9uIG9iamVjdCBjb25mb3JtIHRvIG1hcHBpbmcgcHJvdG9jb2wiIiIKKyAgICB0eXBlMnRlc3QgPSBOb25lCisgICAgZGVmIF9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHJldHVybiB7IktFWTEiOiJWQUxVRTEiLCAiS0VZMiI6IlZBTFVFMiIsICJLRVkzIjoiVkFMVUUzIn0KKyAgICBkZWYgX2VtcHR5X21hcHBpbmcoc2VsZik6CisgICAgICAgIG9zLmVudmlyb24uY2xlYXIoKQorICAgICAgICByZXR1cm4gb3MuZW52aXJvbgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fX3NhdmUgPSBkaWN0KG9zLmVudmlyb24pCisgICAgICAgIG9zLmVudmlyb24uY2xlYXIoKQorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgb3MuZW52aXJvbi5jbGVhcigpCisgICAgICAgIG9zLmVudmlyb24udXBkYXRlKHNlbGYuX19zYXZlKQorCisgICAgIyBCdWcgMTExMDQ3OAorICAgIGRlZiB0ZXN0X3VwZGF0ZTIoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCIvYmluL3NoIik6CisgICAgICAgICAgICBvcy5lbnZpcm9uLnVwZGF0ZShIRUxMTz0iV29ybGQiKQorICAgICAgICAgICAgd2l0aCBvcy5wb3BlbigiL2Jpbi9zaCAtYyAnZWNobyAkSEVMTE8nIikgYXMgcG9wZW46CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwb3Blbi5yZWFkKCkuc3RyaXAoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICJXb3JsZCIpCisKKyAgICAjIE9uIEZyZWVCU0QgPCA3IGFuZCBPUyBYIDwgMTAuNiwgdW5zZXRlbnYoKSBkb2Vzbid0IHJldHVybiBhIHZhbHVlIChpc3N1ZQorICAgICMgIzEzNDE1KS4KKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCgnZnJlZWJzZCcsICdkYXJ3aW4nKSksCisgICAgICAgICAgICAgICAgICAgICAiZHVlIHRvIGtub3duIE9TIGJ1Zzogc2VlIGlzc3VlICMxMzQxNSIpCisgICAgZGVmIHRlc3RfdW5zZXRfZXJyb3Ioc2VsZik6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICAgICAgICAgIyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyBsaW1pdGVkIHRvIDMyLDc2NyBjaGFyYWN0ZXJzCisgICAgICAgICAgICBrZXkgPSAneCcgKiA1MDAwMAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3MuZW52aXJvbi5fX2RlbGl0ZW1fXywga2V5KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyAiPSIgaXMgbm90IGFsbG93ZWQgaW4gYSB2YXJpYWJsZSBuYW1lCisgICAgICAgICAgICBrZXkgPSAna2V5PScKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIG9zLmVudmlyb24uX19kZWxpdGVtX18sIGtleSkKKworY2xhc3MgV2Fsa1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3Igb3Mud2FsaygpLiIiIgorCisgICAgZGVmIHRlc3RfdHJhdmVyc2FsKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBqb2luCisKKyAgICAgICAgIyBCdWlsZDoKKyAgICAgICAgIyAgICAgVEVTVEZOLworICAgICAgICAjICAgICAgIFRFU1QxLyAgICAgICAgICAgICAgYSBmaWxlIGtpZCBhbmQgdHdvIGRpcmVjdG9yeSBraWRzCisgICAgICAgICMgICAgICAgICB0bXAxCisgICAgICAgICMgICAgICAgICBTVUIxLyAgICAgICAgICAgICBhIGZpbGUga2lkIGFuZCBhIGRpcmVjdG9yeSBraWQKKyAgICAgICAgIyAgICAgICAgICAgdG1wMgorICAgICAgICAjICAgICAgICAgICBTVUIxMS8gICAgICAgICAgbm8ga2lkcworICAgICAgICAjICAgICAgICAgU1VCMi8gICAgICAgICAgICAgYSBmaWxlIGtpZCBhbmQgYSBkaXJzeW1saW5rIGtpZAorICAgICAgICAjICAgICAgICAgICB0bXAzCisgICAgICAgICMgICAgICAgICAgIGxpbmsvICAgICAgICAgICBhIHN5bWxpbmsgdG8gVEVTVEZOLjIKKyAgICAgICAgIyAgICAgICBURVNUMi8KKyAgICAgICAgIyAgICAgICAgIHRtcDQgICAgICAgICAgICAgIGEgbG9uZSBmaWxlCisgICAgICAgIHdhbGtfcGF0aCA9IGpvaW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIlRFU1QxIikKKyAgICAgICAgc3ViMV9wYXRoID0gam9pbih3YWxrX3BhdGgsICJTVUIxIikKKyAgICAgICAgc3ViMTFfcGF0aCA9IGpvaW4oc3ViMV9wYXRoLCAiU1VCMTEiKQorICAgICAgICBzdWIyX3BhdGggPSBqb2luKHdhbGtfcGF0aCwgIlNVQjIiKQorICAgICAgICB0bXAxX3BhdGggPSBqb2luKHdhbGtfcGF0aCwgInRtcDEiKQorICAgICAgICB0bXAyX3BhdGggPSBqb2luKHN1YjFfcGF0aCwgInRtcDIiKQorICAgICAgICB0bXAzX3BhdGggPSBqb2luKHN1YjJfcGF0aCwgInRtcDMiKQorICAgICAgICBsaW5rX3BhdGggPSBqb2luKHN1YjJfcGF0aCwgImxpbmsiKQorICAgICAgICB0Ml9wYXRoID0gam9pbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAiVEVTVDIiKQorICAgICAgICB0bXA0X3BhdGggPSBqb2luKHRlc3Rfc3VwcG9ydC5URVNURk4sICJURVNUMiIsICJ0bXA0IikKKworICAgICAgICAjIENyZWF0ZSBzdHVmZi4KKyAgICAgICAgb3MubWFrZWRpcnMoc3ViMTFfcGF0aCkKKyAgICAgICAgb3MubWFrZWRpcnMoc3ViMl9wYXRoKQorICAgICAgICBvcy5tYWtlZGlycyh0Ml9wYXRoKQorICAgICAgICBmb3IgcGF0aCBpbiB0bXAxX3BhdGgsIHRtcDJfcGF0aCwgdG1wM19wYXRoLCB0bXA0X3BhdGg6CisgICAgICAgICAgICBmID0gZmlsZShwYXRoLCAidyIpCisgICAgICAgICAgICBmLndyaXRlKCJJJ20gIiArIHBhdGggKyAiIGFuZCBwcm91ZCBvZiBpdC4gIEJsYW1lIHRlc3Rfb3MuXG4iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CisgICAgICAgICAgICBvcy5zeW1saW5rKG9zLnBhdGguYWJzcGF0aCh0Ml9wYXRoKSwgbGlua19wYXRoKQorICAgICAgICAgICAgc3ViMl90cmVlID0gKHN1YjJfcGF0aCwgWyJsaW5rIl0sIFsidG1wMyJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ViMl90cmVlID0gKHN1YjJfcGF0aCwgW10sIFsidG1wMyJdKQorCisgICAgICAgICMgV2FsayB0b3AtZG93bi4KKyAgICAgICAgYWxsID0gbGlzdChvcy53YWxrKHdhbGtfcGF0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFsbCksIDQpCisgICAgICAgICMgV2UgY2FuJ3Qga25vdyB3aGljaCBvcmRlciBTVUIxIGFuZCBTVUIyIHdpbGwgYXBwZWFyIGluLgorICAgICAgICAjIE5vdCBmbGlwcGVkOiAgVEVTVEZOLCBTVUIxLCBTVUIxMSwgU1VCMgorICAgICAgICAjICAgICBmbGlwcGVkOiAgVEVTVEZOLCBTVUIyLCBTVUIxLCBTVUIxMQorICAgICAgICBmbGlwcGVkID0gYWxsWzBdWzFdWzBdICE9ICJTVUIxIgorICAgICAgICBhbGxbMF1bMV0uc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzBdLCAod2Fsa19wYXRoLCBbIlNVQjEiLCAiU1VCMiJdLCBbInRtcDEiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzEgKyBmbGlwcGVkXSwgKHN1YjFfcGF0aCwgWyJTVUIxMSJdLCBbInRtcDIiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzIgKyBmbGlwcGVkXSwgKHN1YjExX3BhdGgsIFtdLCBbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzMgLSAyICogZmxpcHBlZF0sIHN1YjJfdHJlZSkKKworICAgICAgICAjIFBydW5lIHRoZSBzZWFyY2guCisgICAgICAgIGFsbCA9IFtdCisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHdhbGtfcGF0aCk6CisgICAgICAgICAgICBhbGwuYXBwZW5kKChyb290LCBkaXJzLCBmaWxlcykpCisgICAgICAgICAgICAjIERvbid0IGRlc2NlbmQgaW50byBTVUIxLgorICAgICAgICAgICAgaWYgJ1NVQjEnIGluIGRpcnM6CisgICAgICAgICAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBhbHNvIG11dGF0ZXMgdGhlIGRpcnMgd2UgYXBwZW5kZWQgdG8gYWxsIQorICAgICAgICAgICAgICAgIGRpcnMucmVtb3ZlKCdTVUIxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYWxsKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMF0sICh3YWxrX3BhdGgsIFsiU1VCMiJdLCBbInRtcDEiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzFdLCBzdWIyX3RyZWUpCisKKyAgICAgICAgIyBXYWxrIGJvdHRvbS11cC4KKyAgICAgICAgYWxsID0gbGlzdChvcy53YWxrKHdhbGtfcGF0aCwgdG9wZG93bj1GYWxzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFsbCksIDQpCisgICAgICAgICMgV2UgY2FuJ3Qga25vdyB3aGljaCBvcmRlciBTVUIxIGFuZCBTVUIyIHdpbGwgYXBwZWFyIGluLgorICAgICAgICAjIE5vdCBmbGlwcGVkOiAgU1VCMTEsIFNVQjEsIFNVQjIsIFRFU1RGTgorICAgICAgICAjICAgICBmbGlwcGVkOiAgU1VCMiwgU1VCMTEsIFNVQjEsIFRFU1RGTgorICAgICAgICBmbGlwcGVkID0gYWxsWzNdWzFdWzBdICE9ICJTVUIxIgorICAgICAgICBhbGxbM11bMV0uc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsWzNdLCAod2Fsa19wYXRoLCBbIlNVQjEiLCAiU1VCMiJdLCBbInRtcDEiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsW2ZsaXBwZWRdLCAoc3ViMTFfcGF0aCwgW10sIFtdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbZmxpcHBlZCArIDFdLCAoc3ViMV9wYXRoLCBbIlNVQjExIl0sIFsidG1wMiJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGxbMiAtIDIgKiBmbGlwcGVkXSwgc3ViMl90cmVlKQorCisgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CisgICAgICAgICAgICAjIFdhbGssIGZvbGxvd2luZyBzeW1saW5rcy4KKyAgICAgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHdhbGtfcGF0aCwgZm9sbG93bGlua3M9VHJ1ZSk6CisgICAgICAgICAgICAgICAgaWYgcm9vdCA9PSBsaW5rX3BhdGg6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlycywgW10pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZXMsIFsidG1wNCJdKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCBmb2xsb3cgc3ltbGluayB3aXRoIGZvbGxvd2xpbmtzPVRydWUiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIFRlYXIgZXZlcnl0aGluZyBkb3duLiAgVGhpcyBpcyBhIGRlY2VudCB1c2UgZm9yIGJvdHRvbS11cCBvbgorICAgICAgICAjIFdpbmRvd3MsIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhIHJlY3Vyc2l2ZSBkZWxldGUgY29tbWFuZC4gIFRoZQorICAgICAgICAjIChub3Qgc28pIHN1YnRsZXR5IGlzIHRoYXQgcm1kaXIgd2lsbCBmYWlsIHVubGVzcyB0aGUgZGlyJ3MKKyAgICAgICAgIyBraWRzIGFyZSByZW1vdmVkIGZpcnN0LCBzbyBib3R0b20gdXAgaXMgZXNzZW50aWFsLgorICAgICAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2Fsayh0ZXN0X3N1cHBvcnQuVEVTVEZOLCB0b3Bkb3duPUZhbHNlKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpCisgICAgICAgICAgICBmb3IgbmFtZSBpbiBkaXJzOgorICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2xpbmsoZGlybmFtZSk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJtZGlyKGRpcm5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGRpcm5hbWUpCisgICAgICAgIG9zLnJtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKK2NsYXNzIE1ha2VkaXJUZXN0cyAodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgb3MubWtkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X21ha2VkaXIoc2VsZik6CisgICAgICAgIGJhc2UgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oYmFzZSwgJ2RpcjEnLCAnZGlyMicsICdkaXIzJykKKyAgICAgICAgb3MubWFrZWRpcnMocGF0aCkgICAgICAgICAgICAgIyBTaG91bGQgd29yaworICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsICdkaXIxJywgJ2RpcjInLCAnZGlyMycsICdkaXI0JykKKyAgICAgICAgb3MubWFrZWRpcnMocGF0aCkKKworICAgICAgICAjIFRyeSBwYXRocyB3aXRoIGEgJy4nIGluIHRoZW0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MubWFrZWRpcnMsIG9zLmN1cmRpcikKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCAnZGlyMScsICdkaXIyJywgJ2RpcjMnLCAnZGlyNCcsICdkaXI1Jywgb3MuY3VyZGlyKQorICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsICdkaXIxJywgb3MuY3VyZGlyLCAnZGlyMicsICdkaXIzJywgJ2RpcjQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXI1JywgJ2RpcjYnKQorICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorCisKKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHRlc3Rfc3VwcG9ydC5URVNURk4sICdkaXIxJywgJ2RpcjInLCAnZGlyMycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RpcjQnLCAnZGlyNScsICdkaXI2JykKKyAgICAgICAgIyBJZiB0aGUgdGVzdHMgZmFpbGVkLCB0aGUgYm90dG9tLW1vc3QgZGlyZWN0b3J5ICgnLi4vZGlyNicpCisgICAgICAgICMgbWF5IG5vdCBoYXZlIGJlZW4gY3JlYXRlZCwgc28gd2UgbG9vayBmb3IgdGhlIG91dGVybW9zdCBkaXJlY3RvcnkKKyAgICAgICAgIyB0aGF0IGV4aXN0cy4KKyAgICAgICAgd2hpbGUgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpIGFuZCBwYXRoICE9IHRlc3Rfc3VwcG9ydC5URVNURk46CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5kaXJuYW1lKHBhdGgpCisKKyAgICAgICAgb3MucmVtb3ZlZGlycyhwYXRoKQorCitjbGFzcyBEZXZOdWxsVGVzdHMgKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9kZXZudWxsKHNlbGYpOgorICAgICAgICBmID0gZmlsZShvcy5kZXZudWxsLCAndycpCisgICAgICAgIGYud3JpdGUoJ2hlbGxvJykKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGYgPSBmaWxlKG9zLmRldm51bGwsICdyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJycpCisgICAgICAgIGYuY2xvc2UoKQorCitjbGFzcyBVUmFuZG9tVGVzdHMgKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3VyYW5kb21fbGVuZ3RoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihvcy51cmFuZG9tKDApKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxKSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9zLnVyYW5kb20oMTApKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9zLnVyYW5kb20oMTAwKSksIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob3MudXJhbmRvbSgxMDAwKSksIDEwMDApCisKKyAgICBkZWYgdGVzdF91cmFuZG9tX3ZhbHVlKHNlbGYpOgorICAgICAgICBkYXRhMSA9IG9zLnVyYW5kb20oMTYpCisgICAgICAgIGRhdGEyID0gb3MudXJhbmRvbSgxNikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkYXRhMSwgZGF0YTIpCisKKyAgICBkZWYgZ2V0X3VyYW5kb21fc3VicHJvY2VzcyhzZWxmLCBjb3VudCk6CisgICAgICAgICMgV2UgbmVlZCB0byB1c2UgcmVwcigpIGFuZCBldmFsKCkgdG8gYXZvaWQgbGluZSBlbmRpbmcgY29udmVyc2lvbnMKKyAgICAgICAgIyB1bmRlciBXaW5kb3dzLgorICAgICAgICBjb2RlID0gJ1xuJy5qb2luKCgKKyAgICAgICAgICAgICdpbXBvcnQgb3MsIHN5cycsCisgICAgICAgICAgICAnZGF0YSA9IG9zLnVyYW5kb20oJXMpJyAlIGNvdW50LAorICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUocmVwcihkYXRhKSknLAorICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKScsCisgICAgICAgICAgICAncHJpbnQgPj4gc3lzLnN0ZGVyciwgKGxlbihkYXRhKSwgZGF0YSknKSkKKyAgICAgICAgY21kX2xpbmUgPSBbc3lzLmV4ZWN1dGFibGUsICctYycsIGNvZGVdCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZF9saW5lLCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIG91dCwgZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIDAsIChwLndhaXQoKSwgZXJyKSkKKyAgICAgICAgb3V0ID0gZXZhbChvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG91dCksIGNvdW50LCBlcnIpCisgICAgICAgIHJldHVybiBvdXQKKworICAgIGRlZiB0ZXN0X3VyYW5kb21fc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgZGF0YTEgPSBzZWxmLmdldF91cmFuZG9tX3N1YnByb2Nlc3MoMTYpCisgICAgICAgIGRhdGEyID0gc2VsZi5nZXRfdXJhbmRvbV9zdWJwcm9jZXNzKDE2KQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGRhdGExLCBkYXRhMikKKworICAgIGRlZiB0ZXN0X2V4ZWN2cGVfd2l0aF9iYWRfYXJnbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3MuZXhlY3ZwZSwgJ25vdGVwYWQnLCBbXSwgTm9uZSkKKworY2xhc3MgV2luMzJFcnJvclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZW5hbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgb3MucmVuYW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKyIuYmFrIikKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy5yZW1vdmUsIHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgdGVzdF9jaGRpcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy5jaGRpciwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X21rZGlyKHNlbGYpOgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAidyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgb3MubWtkaXIsIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfdXRpbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgb3MudXRpbWUsIHRlc3Rfc3VwcG9ydC5URVNURk4sIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jaG1vZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcy5jaG1vZCwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgMCkKKworY2xhc3MgVGVzdEludmFsaWRGRCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc2luZ2xlcyA9IFsiZmNoZGlyIiwgImZkb3BlbiIsICJkdXAiLCAiZmRhdGFzeW5jIiwgImZzdGF0IiwKKyAgICAgICAgICAgICAgICJmc3RhdHZmcyIsICJmc3luYyIsICJ0Y2dldHBncnAiLCAidHR5bmFtZSJdCisgICAgI3NpbmdsZXMuYXBwZW5kKCJjbG9zZSIpCisgICAgI1dlIG9taXQgY2xvc2UgYmVjYXVzZSBpdCBkb2VzbidyIHJhaXNlIGFuIGV4Y2VwdGlvbiBvbiBzb21lIHBsYXRmb3JtcworICAgIGRlZiBnZXRfc2luZ2xlKGYpOgorICAgICAgICBkZWYgaGVscGVyKHNlbGYpOgorICAgICAgICAgICAgaWYgIGhhc2F0dHIob3MsIGYpOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2soZ2V0YXR0cihvcywgZikpCisgICAgICAgIHJldHVybiBoZWxwZXIKKyAgICBmb3IgZiBpbiBzaW5nbGVzOgorICAgICAgICBsb2NhbHMoKVsidGVzdF8iK2ZdID0gZ2V0X3NpbmdsZShmKQorCisgICAgZGVmIGNoZWNrKHNlbGYsIGYsICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZih0ZXN0X3N1cHBvcnQubWFrZV9iYWRfZmQoKSwgKmFyZ3MpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXJybm8sIGVycm5vLkVCQURGKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCIlciBkaWRuJ3QgcmFpc2UgYSBPU0Vycm9yIHdpdGggYSBiYWQgZmlsZSBkZXNjcmlwdG9yIgorICAgICAgICAgICAgICAgICAgICAgICUgZikKKworICAgIGRlZiB0ZXN0X2lzYXR0eShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImlzYXR0eSIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5pc2F0dHkodGVzdF9zdXBwb3J0Lm1ha2VfYmFkX2ZkKCkpLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlcmFuZ2Uoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJjbG9zZXJhbmdlIik6CisgICAgICAgICAgICBmZCA9IHRlc3Rfc3VwcG9ydC5tYWtlX2JhZF9mZCgpCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSBub25lIG9mIHRoZSBkZXNjcmlwdG9ycyB3ZSBhcmUgYWJvdXQgdG8gY2xvc2UgYXJlCisgICAgICAgICAgICAjIGN1cnJlbnRseSB2YWxpZCAoaXNzdWUgNjU0MikuCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAgICAgdHJ5OiBvcy5mc3RhdChmZCtpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGkgPCAyOgorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KAorICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGFjcXVpcmUgYSByYW5nZSBvZiBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvcnMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5jbG9zZXJhbmdlKGZkLCBmZCArIGktMSksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9kdXAyKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAiZHVwMiIpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhvcy5kdXAyLCAyMCkKKworICAgIGRlZiB0ZXN0X2ZjaG1vZChzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgImZjaG1vZCIpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhvcy5mY2htb2QsIDApCisKKyAgICBkZWYgdGVzdF9mY2hvd24oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJmY2hvd24iKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2sob3MuZmNob3duLCAtMSwgLTEpCisKKyAgICBkZWYgdGVzdF9mcGF0aGNvbmYoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJmcGF0aGNvbmYiKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2sob3MuZnBhdGhjb25mLCAiUENfTkFNRV9NQVgiKQorCisgICAgZGVmIHRlc3RfZnRydW5jYXRlKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAiZnRydW5jYXRlIik6CisgICAgICAgICAgICBzZWxmLmNoZWNrKG9zLmZ0cnVuY2F0ZSwgMCkKKworICAgIGRlZiB0ZXN0X2xzZWVrKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAibHNlZWsiKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2sob3MubHNlZWssIDAsIDApCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAicmVhZCIpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhvcy5yZWFkLCAxKQorCisgICAgZGVmIHRlc3RfdGNzZXRwZ3JwdChzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInRjc2V0cGdycCIpOgorICAgICAgICAgICAgc2VsZi5jaGVjayhvcy50Y3NldHBncnAsIDApCisKKyAgICBkZWYgdGVzdF93cml0ZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgIndyaXRlIik6CisgICAgICAgICAgICBzZWxmLmNoZWNrKG9zLndyaXRlLCAiICIpCisKK2lmIHN5cy5wbGF0Zm9ybSAhPSAnd2luMzInOgorICAgIGNsYXNzIFdpbjMyRXJyb3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIFBvc2l4VWlkR2lkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc2V0dWlkJyk6CisgICAgICAgICAgICBkZWYgdGVzdF9zZXR1aWQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMob3MuZXJyb3IsIG9zLnNldHVpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXR1aWQsIDE8PDMyKQorCisgICAgICAgIGlmIGhhc2F0dHIob3MsICdzZXRnaWQnKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NldGdpZChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0Z2lkLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldGdpZCwgMTw8MzIpCisKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3NldGV1aWQnKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NldGV1aWQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMob3MuZXJyb3IsIG9zLnNldGV1aWQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0ZXVpZCwgMTw8MzIpCisKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3NldGVnaWQnKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NldGVnaWQoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgb3MuZ2V0dWlkKCkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMob3MuZXJyb3IsIG9zLnNldGVnaWQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0ZWdpZCwgMTw8MzIpCisKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3NldHJldWlkJyk6CisgICAgICAgICAgICBkZWYgdGVzdF9zZXRyZXVpZChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBvcy5nZXR1aWQoKSAhPSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhvcy5lcnJvciwgb3Muc2V0cmV1aWQsIDAsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0cmV1aWQsIDE8PDMyLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9zLnNldHJldWlkLCAwLCAxPDwzMikKKworICAgICAgICAgICAgZGVmIHRlc3Rfc2V0cmV1aWRfbmVnMShzZWxmKToKKyAgICAgICAgICAgICAgICAjIE5lZWRzIHRvIGFjY2VwdCAtMS4gIFdlIHJ1biB0aGlzIGluIGEgc3VicHJvY2VzcyB0byBhdm9pZAorICAgICAgICAgICAgICAgICMgYWx0ZXJpbmcgdGhlIHRlc3QgcnVubmVyJ3MgcHJvY2VzcyBzdGF0ZSAoaXNzdWU4MDQ1KS4KKyAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoWworICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICctYycsCisgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IG9zLHN5cztvcy5zZXRyZXVpZCgtMSwtMSk7c3lzLmV4aXQoMCknXSkKKworICAgICAgICBpZiBoYXNhdHRyKG9zLCAnc2V0cmVnaWQnKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NldHJlZ2lkKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG9zLmVycm9yLCBvcy5zZXRyZWdpZCwgMCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBvcy5zZXRyZWdpZCwgMTw8MzIsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3Muc2V0cmVnaWQsIDAsIDE8PDMyKQorCisgICAgICAgICAgICBkZWYgdGVzdF9zZXRyZWdpZF9uZWcxKHNlbGYpOgorICAgICAgICAgICAgICAgICMgTmVlZHMgdG8gYWNjZXB0IC0xLiAgV2UgcnVuIHRoaXMgaW4gYSBzdWJwcm9jZXNzIHRvIGF2b2lkCisgICAgICAgICAgICAgICAgIyBhbHRlcmluZyB0aGUgdGVzdCBydW5uZXIncyBwcm9jZXNzIHN0YXRlIChpc3N1ZTgwNDUpLgorICAgICAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbCisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgb3Msc3lzO29zLnNldHJlZ2lkKC0xLC0xKTtzeXMuZXhpdCgwKSddKQorZWxzZToKKyAgICBjbGFzcyBQb3NpeFVpZEdpZFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgcGFzcworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbjMyIHNwZWNpZmljIHRlc3RzIikKK2NsYXNzIFdpbjMyS2lsbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgX2tpbGwoc2VsZiwgc2lnKToKKyAgICAgICAgIyBTdGFydCBzeXMuZXhlY3V0YWJsZSBhcyBhIHN1YnByb2Nlc3MgYW5kIGNvbW11bmljYXRlIGZyb20gdGhlCisgICAgICAgICMgc3VicHJvY2VzcyB0byB0aGUgcGFyZW50IHRoYXQgdGhlIGludGVycHJldGVyIGlzIHJlYWR5LiBXaGVuIGl0CisgICAgICAgICMgYmVjb21lcyByZWFkeSwgc2VuZCAqc2lnKiB2aWEgb3Mua2lsbCB0byB0aGUgc3VicHJvY2VzcyBhbmQgY2hlY2sKKyAgICAgICAgIyB0aGF0IHRoZSByZXR1cm4gY29kZSBpcyBlcXVhbCB0byAqc2lnKi4KKyAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKKyAgICAgICAgaW1wb3J0IG1zdmNydAorCisgICAgICAgICMgU2luY2Ugd2UgY2FuJ3QgYWNjZXNzIHRoZSBjb250ZW50cyBvZiB0aGUgcHJvY2Vzcycgc3Rkb3V0IHVudGlsIHRoZQorICAgICAgICAjIHByb2Nlc3MgaGFzIGV4aXRlZCwgdXNlIFBlZWtOYW1lZFBpcGUgdG8gc2VlIHdoYXQncyBpbnNpZGUgc3Rkb3V0CisgICAgICAgICMgd2l0aG91dCB3YWl0aW5nLiBUaGlzIGlzIGRvbmUgc28gd2UgY2FuIHRlbGwgdGhhdCB0aGUgaW50ZXJwcmV0ZXIKKyAgICAgICAgIyBpcyBzdGFydGVkIGFuZCBydW5uaW5nIGF0IGEgcG9pbnQgd2hlcmUgaXQgY291bGQgaGFuZGxlIGEgc2lnbmFsLgorICAgICAgICBQZWVrTmFtZWRQaXBlID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5QZWVrTmFtZWRQaXBlCisgICAgICAgIFBlZWtOYW1lZFBpcGUucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKKyAgICAgICAgUGVla05hbWVkUGlwZS5hcmd0eXBlcyA9ICh3aW50eXBlcy5IQU5ETEUsICMgUGlwZSBoYW5kbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY19jaGFyKSwgIyBzdGRvdXQgYnVmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2ludHlwZXMuRFdPUkQsICMgQnVmZmVyIHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZXMuUE9JTlRFUih3aW50eXBlcy5EV09SRCksICMgYnl0ZXMgcmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5QT0lOVEVSKHdpbnR5cGVzLkRXT1JEKSwgIyBieXRlcyBhdmFpbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlcy5QT0lOVEVSKHdpbnR5cGVzLkRXT1JEKSkgIyBieXRlcyBsZWZ0CisgICAgICAgIG1zZyA9ICJydW5uaW5nIgorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnN0ZG91dC53cml0ZSgne30nKTsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzLnN0ZG91dC5mbHVzaCgpOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnB1dCgpIi5mb3JtYXQobXNnKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHByb2Muc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocHJvYy5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwcm9jLnN0ZGluLmNsb3NlKQorCisgICAgICAgIGNvdW50LCBtYXggPSAwLCAxMDAKKyAgICAgICAgd2hpbGUgY291bnQgPCBtYXggYW5kIHByb2MucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICAjIENyZWF0ZSBhIHN0cmluZyBidWZmZXIgdG8gc3RvcmUgdGhlIHJlc3VsdCBvZiBzdGRvdXQgZnJvbSB0aGUgcGlwZQorICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKGxlbihtc2cpKQorICAgICAgICAgICAgIyBPYnRhaW4gdGhlIHRleHQgY3VycmVudGx5IGluIHByb2Muc3Rkb3V0CisgICAgICAgICAgICAjIEJ5dGVzIHJlYWQvYXZhaWwvbGVmdCBhcmUgbGVmdCBhcyBOVUxMIGFuZCB1bnVzZWQKKyAgICAgICAgICAgIHJzbHQgPSBQZWVrTmFtZWRQaXBlKG1zdmNydC5nZXRfb3NmaGFuZGxlKHByb2Muc3Rkb3V0LmZpbGVubygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiwgY3R5cGVzLnNpemVvZihidWYpLCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyc2x0LCAwLCAiUGVla05hbWVkUGlwZSBmYWlsZWQiKQorICAgICAgICAgICAgaWYgYnVmLnZhbHVlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBidWYudmFsdWUpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICAgICAgY291bnQgKz0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IHJlY2VpdmUgY29tbXVuaWNhdGlvbiBmcm9tIHRoZSBzdWJwcm9jZXNzIikKKworICAgICAgICBvcy5raWxsKHByb2MucGlkLCBzaWcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvYy53YWl0KCksIHNpZykKKworICAgIGRlZiB0ZXN0X2tpbGxfc2lndGVybShzZWxmKToKKyAgICAgICAgIyBTSUdURVJNIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyBzcGVjaWFsLCBidXQgbWFrZSBzdXJlIGl0IHdvcmtzCisgICAgICAgIHNlbGYuX2tpbGwoc2lnbmFsLlNJR1RFUk0pCisKKyAgICBkZWYgdGVzdF9raWxsX2ludChzZWxmKToKKyAgICAgICAgIyBvcy5raWxsIG9uIFdpbmRvd3MgY2FuIHRha2UgYW4gaW50IHdoaWNoIGdldHMgc2V0IGFzIHRoZSBleGl0IGNvZGUKKyAgICAgICAgc2VsZi5fa2lsbCgxMDApCisKKyAgICBkZWYgX2tpbGxfd2l0aF9ldmVudChzZWxmLCBldmVudCwgbmFtZSk6CisgICAgICAgIHRhZ25hbWUgPSAidGVzdF9vc18lcyIgJSB1dWlkLnV1aWQxKCkKKyAgICAgICAgbSA9IG1tYXAubW1hcCgtMSwgMSwgdGFnbmFtZSkKKyAgICAgICAgbVswXSA9ICcwJworICAgICAgICAjIFJ1biBhIHNjcmlwdCB3aGljaCBoYXMgY29uc29sZSBjb250cm9sIGhhbmRsaW5nIGVuYWJsZWQuCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpbl9jb25zb2xlX2hhbmRsZXIucHkiKSwgdGFnbmFtZV0sCisgICAgICAgICAgICAgICAgICAgY3JlYXRpb25mbGFncz1zdWJwcm9jZXNzLkNSRUFURV9ORVdfUFJPQ0VTU19HUk9VUCkKKyAgICAgICAgIyBMZXQgdGhlIGludGVycHJldGVyIHN0YXJ0dXAgYmVmb3JlIHdlIHNlbmQgc2lnbmFscy4gU2VlICMzMTM3LgorICAgICAgICBjb3VudCwgbWF4ID0gMCwgMjAKKyAgICAgICAgd2hpbGUgY291bnQgPCBtYXggYW5kIHByb2MucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBtWzBdID09ICcxJzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgwLjUpCisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlN1YnByb2Nlc3MgZGlkbid0IGZpbmlzaCBpbml0aWFsaXphdGlvbiIpCisgICAgICAgIG9zLmtpbGwocHJvYy5waWQsIGV2ZW50KQorICAgICAgICAjIHByb2Muc2VuZF9zaWduYWwoZXZlbnQpIGNvdWxkIGFsc28gYmUgZG9uZSBoZXJlLgorICAgICAgICAjIEFsbG93IHRpbWUgZm9yIHRoZSBzaWduYWwgdG8gYmUgcGFzc2VkIGFuZCB0aGUgcHJvY2VzcyB0byBleGl0LgorICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgaWYgbm90IHByb2MucG9sbCgpOgorICAgICAgICAgICAgIyBGb3JjZWZ1bGx5IGtpbGwgdGhlIHByb2Nlc3MgaWYgd2Ugd2VyZW4ndCBhYmxlIHRvIHNpZ25hbCBpdC4KKyAgICAgICAgICAgIG9zLmtpbGwocHJvYy5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgICAgICAgICBzZWxmLmZhaWwoInN1YnByb2Nlc3MgZGlkIG5vdCBzdG9wIG9uIHt9Ii5mb3JtYXQobmFtZSkpCisKKyAgICBAdW5pdHRlc3Quc2tpcCgic3VicHJvY2Vzc2VzIGFyZW4ndCBpbmhlcml0aW5nIENUUkwrQyBwcm9wZXJ0eSIpCisgICAgZGVmIHRlc3RfQ1RSTF9DX0VWRU5UKHNlbGYpOgorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKKyAgICAgICAgaW1wb3J0IGN0eXBlcworCisgICAgICAgICMgTWFrZSBhIE5VTEwgdmFsdWUgYnkgY3JlYXRpbmcgYSBwb2ludGVyIHdpdGggbm8gYXJndW1lbnQuCisgICAgICAgIE5VTEwgPSBjdHlwZXMuUE9JTlRFUihjdHlwZXMuY19pbnQpKCkKKyAgICAgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5TZXRDb25zb2xlQ3RybEhhbmRsZXIKKyAgICAgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyLmFyZ3R5cGVzID0gKGN0eXBlcy5QT0lOVEVSKGN0eXBlcy5jX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW50eXBlcy5CT09MKQorICAgICAgICBTZXRDb25zb2xlQ3RybEhhbmRsZXIucmVzdHlwZSA9IHdpbnR5cGVzLkJPT0wKKworICAgICAgICAjIENhbGxpbmcgdGhpcyB3aXRoIE5VTEwgYW5kIEZBTFNFIGNhdXNlcyB0aGUgY2FsbGluZyBwcm9jZXNzIHRvCisgICAgICAgICMgaGFuZGxlIENUUkwrQywgcmF0aGVyIHRoYW4gaWdub3JlIGl0LiBUaGlzIHByb3BlcnR5IGlzIGluaGVyaXRlZAorICAgICAgICAjIGJ5IHN1YnByb2Nlc3Nlcy4KKyAgICAgICAgU2V0Q29uc29sZUN0cmxIYW5kbGVyKE5VTEwsIDApCisKKyAgICAgICAgc2VsZi5fa2lsbF93aXRoX2V2ZW50KHNpZ25hbC5DVFJMX0NfRVZFTlQsICJDVFJMX0NfRVZFTlQiKQorCisgICAgZGVmIHRlc3RfQ1RSTF9CUkVBS19FVkVOVChzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF93aXRoX2V2ZW50KHNpZ25hbC5DVFJMX0JSRUFLX0VWRU5ULCAiQ1RSTF9CUkVBS19FVkVOVCIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIEZpbGVUZXN0cywKKyAgICAgICAgVGVtcG9yYXJ5RmlsZVRlc3RzLAorICAgICAgICBTdGF0QXR0cmlidXRlVGVzdHMsCisgICAgICAgIEVudmlyb25UZXN0cywKKyAgICAgICAgV2Fsa1Rlc3RzLAorICAgICAgICBNYWtlZGlyVGVzdHMsCisgICAgICAgIERldk51bGxUZXN0cywKKyAgICAgICAgVVJhbmRvbVRlc3RzLAorICAgICAgICBXaW4zMkVycm9yVGVzdHMsCisgICAgICAgIFRlc3RJbnZhbGlkRkQsCisgICAgICAgIFBvc2l4VWlkR2lkVGVzdHMsCisgICAgICAgIFdpbjMyS2lsbFRlc3RzCisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2Y2Q4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2Y2Q4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzU3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weQpAQCAtMCwwICsxLDE3NCBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygnYXVkaW8nKQorCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZQorCitvc3NhdWRpb2RldiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdvc3NhdWRpb2RldicpCisKK2ltcG9ydCBlcnJubworaW1wb3J0IHN5cworaW1wb3J0IHN1bmF1CitpbXBvcnQgdGltZQoraW1wb3J0IGF1ZGlvb3AKK2ltcG9ydCB1bml0dGVzdAorCisjIEFyZ2doLCBBRk1UX1MxNl9ORSBub3QgZGVmaW5lZCBvbiBhbGwgcGxhdGZvcm1zIC0tIHNlZW1zIHRvIGJlIGEKKyMgZmFpcmx5IHJlY2VudCBhZGRpdGlvbiB0byBPU1MuCit0cnk6CisgICAgZnJvbSBvc3NhdWRpb2RldiBpbXBvcnQgQUZNVF9TMTZfTkUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICBBRk1UX1MxNl9ORSA9IG9zc2F1ZGlvZGV2LkFGTVRfUzE2X0xFCisgICAgZWxzZToKKyAgICAgICAgQUZNVF9TMTZfTkUgPSBvc3NhdWRpb2Rldi5BRk1UX1MxNl9CRQorCisKK2RlZiByZWFkX3NvdW5kX2ZpbGUocGF0aCk6CisgICAgd2l0aCBvcGVuKHBhdGgsICdyYicpIGFzIGZwOgorICAgICAgICBhdSA9IHN1bmF1Lm9wZW4oZnApCisgICAgICAgIHJhdGUgPSBhdS5nZXRmcmFtZXJhdGUoKQorICAgICAgICBuY2hhbm5lbHMgPSBhdS5nZXRuY2hhbm5lbHMoKQorICAgICAgICBlbmNvZGluZyA9IGF1Ll9lbmNvZGluZworICAgICAgICBmcC5zZWVrKDApCisgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKworICAgIGlmIGVuY29kaW5nICE9IHN1bmF1LkFVRElPX0ZJTEVfRU5DT0RJTkdfTVVMQVdfODoKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJFeHBlY3QgLmF1IGZpbGUgd2l0aCA4LWJpdCBtdS1sYXcgc2FtcGxlcyIpCisKKyAgICAjIENvbnZlcnQgdGhlIGRhdGEgdG8gMTYtYml0IHNpZ25lZC4KKyAgICBkYXRhID0gYXVkaW9vcC51bGF3MmxpbihkYXRhLCAyKQorICAgIHJldHVybiAoZGF0YSwgcmF0ZSwgMTYsIG5jaGFubmVscykKKworY2xhc3MgT1NTQXVkaW9EZXZUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgcGxheV9zb3VuZF9maWxlKHNlbGYsIGRhdGEsIHJhdGUsIHNzaXplLCBuY2hhbm5lbHMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkc3AgPSBvc3NhdWRpb2Rldi5vcGVuKCd3JykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIG1zZzoKKyAgICAgICAgICAgIGlmIG1zZy5hcmdzWzBdIGluIChlcnJuby5FQUNDRVMsIGVycm5vLkVOT0VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJuby5FTk9ERVYsIGVycm5vLkVCVVNZKToKKyAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdChtc2cpCisgICAgICAgICAgICByYWlzZQorCisgICAgICAgICMgYXQgbGVhc3QgY2hlY2sgdGhhdCB0aGVzZSBtZXRob2RzIGNhbiBiZSBpbnZva2VkCisgICAgICAgIGRzcC5idWZzaXplKCkKKyAgICAgICAgZHNwLm9idWZjb3VudCgpCisgICAgICAgIGRzcC5vYnVmZnJlZSgpCisgICAgICAgIGRzcC5nZXRwdHIoKQorICAgICAgICBkc3AuZmlsZW5vKCkKKworICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgcmVhZC1vbmx5IGF0dHJpYnV0ZXMgd29yay4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkc3AuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRzcC5uYW1lLCAiL2Rldi9kc3AiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRzcC5tb2RlLCAidyIsICJiYWQgZHNwLm1vZGU6ICVyIiAlIGRzcC5tb2RlKQorCisgICAgICAgICMgQW5kIG1ha2Ugc3VyZSB0aGV5J3JlIHJlYWxseSByZWFkLW9ubHkuCisgICAgICAgIGZvciBhdHRyIGluICgnY2xvc2VkJywgJ25hbWUnLCAnbW9kZScpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNldGF0dHIoZHNwLCBhdHRyLCA0MikKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImRzcC4lcyBub3QgcmVhZC1vbmx5IiAlIGF0dHIpCisKKyAgICAgICAgIyBDb21wdXRlIGV4cGVjdGVkIHJ1bm5pbmcgdGltZSBvZiBzb3VuZCBzYW1wbGUgKGluIHNlY29uZHMpLgorICAgICAgICBleHBlY3RlZF90aW1lID0gZmxvYXQobGVuKGRhdGEpKSAvIChzc2l6ZS8vOCkgLyBuY2hhbm5lbHMgLyByYXRlCisKKyAgICAgICAgIyBzZXQgcGFyYW1ldGVycyBiYXNlZCBvbiAuYXUgZmlsZSBoZWFkZXJzCisgICAgICAgIGRzcC5zZXRwYXJhbWV0ZXJzKEFGTVRfUzE2X05FLCBuY2hhbm5lbHMsIHJhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoZXhwZWN0ZWRfdGltZSAtIDMuNTEpIDwgMWUtMiwgZXhwZWN0ZWRfdGltZSkKKyAgICAgICAgdDEgPSB0aW1lLnRpbWUoKQorICAgICAgICBkc3Aud3JpdGUoZGF0YSkKKyAgICAgICAgZHNwLmNsb3NlKCkKKyAgICAgICAgdDIgPSB0aW1lLnRpbWUoKQorICAgICAgICBlbGFwc2VkX3RpbWUgPSB0MiAtIHQxCisKKyAgICAgICAgcGVyY2VudF9kaWZmID0gKGFicyhlbGFwc2VkX3RpbWUgLSBleHBlY3RlZF90aW1lKSAvIGV4cGVjdGVkX3RpbWUpICogMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwZXJjZW50X2RpZmYgPD0gMTAuMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJlbGFwc2VkIHRpbWUgPiAxMCUgb2ZmIG9mIGV4cGVjdGVkIHRpbWUiKQorCisgICAgZGVmIHNldF9wYXJhbWV0ZXJzKHNlbGYsIGRzcCk6CisgICAgICAgICMgVHdvIGNvbmZpZ3VyYXRpb25zIGZvciB0ZXN0aW5nOgorICAgICAgICAjICAgY29uZmlnMSAoOC1iaXQsIG1vbm8sIDgga0h6KSBzaG91bGQgd29yayBvbiBldmVuIHRoZSBtb3N0CisgICAgICAgICMgICAgICBhbmNpZW50IGFuZCBjcnVmdHkgc291bmQgY2FyZCwgYnV0IG1heWJlIG5vdCBvbiBzcGVjaWFsLQorICAgICAgICAjICAgICAgcHVycG9zZSBoaWdoLWVuZCBoYXJkd2FyZQorICAgICAgICAjICAgY29uZmlnMiAoMTYtYml0LCBzdGVyZW8sIDQ0LjFrSHopIHNob3VsZCB3b3JrIG9uIGFsbCBidXQgdGhlCisgICAgICAgICMgICAgICBtb3N0IGFuY2llbnQgYW5kIGNydWZ0eSBoYXJkd2FyZQorICAgICAgICBjb25maWcxID0gKG9zc2F1ZGlvZGV2LkFGTVRfVTgsIDEsIDgwMDApCisgICAgICAgIGNvbmZpZzIgPSAoQUZNVF9TMTZfTkUsIDIsIDQ0MTAwKQorCisgICAgICAgIGZvciBjb25maWcgaW4gW2NvbmZpZzEsIGNvbmZpZzJdOgorICAgICAgICAgICAgKGZtdCwgY2hhbm5lbHMsIHJhdGUpID0gY29uZmlnCisgICAgICAgICAgICBpZiAoZHNwLnNldGZtdChmbXQpID09IGZtdCBhbmQKKyAgICAgICAgICAgICAgICBkc3AuY2hhbm5lbHMoY2hhbm5lbHMpID09IGNoYW5uZWxzIGFuZAorICAgICAgICAgICAgICAgIGRzcC5zcGVlZChyYXRlKSA9PSByYXRlKToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ1bmFibGUgdG8gc2V0IGF1ZGlvIHNhbXBsaW5nIHBhcmFtZXRlcnM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IG11c3QgaGF2ZSByZWFsbHkgd2VpcmQgYXVkaW8gaGFyZHdhcmUiKQorCisgICAgICAgICMgc2V0cGFyYW1ldGVycygpIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGlzIGNvbmZpZ3VyYXRpb24gaW4KKyAgICAgICAgIyBlaXRoZXIgc3RyaWN0IG9yIG5vbi1zdHJpY3QgbW9kZS4KKyAgICAgICAgcmVzdWx0ID0gZHNwLnNldHBhcmFtZXRlcnMoZm10LCBjaGFubmVscywgcmF0ZSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoZm10LCBjaGFubmVscywgcmF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgInNldHBhcmFtZXRlcnMlcjogcmV0dXJuZWQgJXIiICUgKGNvbmZpZywgcmVzdWx0KSkKKworICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKGZtdCwgY2hhbm5lbHMsIHJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJzZXRwYXJhbWV0ZXJzJXI6IHJldHVybmVkICVyIiAlIChjb25maWcsIHJlc3VsdCkpCisKKyAgICBkZWYgc2V0X2JhZF9wYXJhbWV0ZXJzKHNlbGYsIGRzcCk6CisgICAgICAgICMgTm93IHRyeSBzb21lIGNvbmZpZ3VyYXRpb25zIHRoYXQgYXJlIHByZXN1bWFibHkgYm9ndXM6IGVnLiAzMDAKKyAgICAgICAgIyBjaGFubmVscyBjdXJyZW50bHkgZXhjZWVkcyBldmVuIEhvbGx5d29vZCdzIGFtYml0aW9ucywgYW5kCisgICAgICAgICMgbmVnYXRpdmUgc2FtcGxpbmcgcmF0ZSBpcyB1dHRlciBub25zZW5zZS4gIHNldHBhcmFtZXRlcnMoKSBzaG91bGQKKyAgICAgICAgIyBhY2NlcHQgdGhlc2UgaW4gbm9uLXN0cmljdCBtb2RlLCByZXR1cm5pbmcgc29tZXRoaW5nIG90aGVyIHRoYW4KKyAgICAgICAgIyB3YXMgcmVxdWVzdGVkLCBidXQgc2hvdWxkIGJhcmYgaW4gc3RyaWN0IG1vZGUuCisgICAgICAgIGZtdCA9IEFGTVRfUzE2X05FCisgICAgICAgIHJhdGUgPSA0NDEwMAorICAgICAgICBjaGFubmVscyA9IDIKKyAgICAgICAgZm9yIGNvbmZpZyBpbiBbKGZtdCwgMzAwLCByYXRlKSwgICAgICAgIyByaWRpY3Vsb3VzIG5jaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAoZm10LCAtNSwgcmF0ZSksICAgICAgICAjIGltcG9zc2libGUgbmNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgIChmbXQsIGNoYW5uZWxzLCAtNTApLCAgICMgaW1wb3NzaWJsZSByYXRlCisgICAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIChmbXQsIGNoYW5uZWxzLCByYXRlKSA9IGNvbmZpZworICAgICAgICAgICAgcmVzdWx0ID0gZHNwLnNldHBhcmFtZXRlcnMoZm10LCBjaGFubmVscywgcmF0ZSwgRmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlc3VsdCwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZGx5IGdvdCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiIpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBUcnVlKQorICAgICAgICAgICAgZXhjZXB0IG9zc2F1ZGlvZGV2Lk9TU0F1ZGlvRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgT1NTQXVkaW9FcnJvciIpCisKKyAgICBkZWYgdGVzdF9wbGF5YmFjayhzZWxmKToKKyAgICAgICAgc291bmRfaW5mbyA9IHJlYWRfc291bmRfZmlsZShmaW5kZmlsZSgnYXVkaW90ZXN0LmF1JykpCisgICAgICAgIHNlbGYucGxheV9zb3VuZF9maWxlKCpzb3VuZF9pbmZvKQorCisgICAgZGVmIHRlc3Rfc2V0X3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgIGRzcCA9IG9zc2F1ZGlvZGV2Lm9wZW4oInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldF9wYXJhbWV0ZXJzKGRzcCkKKworICAgICAgICAgICAgIyBEaXNhYmxlZCBiZWNhdXNlIGl0IGZhaWxzIHVuZGVyIExpbnV4IDIuNiB3aXRoIEFMU0EncyBPU1MKKyAgICAgICAgICAgICMgZW11bGF0aW9uIGxheWVyLgorICAgICAgICAgICAgI3NlbGYuc2V0X2JhZF9wYXJhbWV0ZXJzKGRzcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRzcC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZHNwLmNsb3NlZCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdHJ5OgorICAgICAgICBkc3AgPSBvc3NhdWRpb2Rldi5vcGVuKCd3JykKKyAgICBleGNlcHQgKG9zc2F1ZGlvZGV2LmVycm9yLCBJT0Vycm9yKSwgbXNnOgorICAgICAgICBpZiBtc2cuYXJnc1swXSBpbiAoZXJybm8uRUFDQ0VTLCBlcnJuby5FTk9FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJuby5FTk9ERVYsIGVycm5vLkVCVVNZKToKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KG1zZykKKyAgICAgICAgcmFpc2UKKyAgICBkc3AuY2xvc2UoKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFiN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjFiN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BhcnNlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWE3NjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGFyc2VyLnB5CkBAIC0wLDAgKzEsNjU3IEBACitpbXBvcnQgcGFyc2VyCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJ1Y3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUKKworIworIyAgRmlyc3QsIHdlIHRlc3QgdGhhdCB3ZSBjYW4gZ2VuZXJhdGUgdHJlZXMgZnJvbSB2YWxpZCBzb3VyY2UgZnJhZ21lbnRzLAorIyAgYW5kIHRoYXQgdGhlc2UgdmFsaWQgdHJlZXMgYXJlIGluZGVlZCBhbGxvd2VkIGJ5IHRoZSB0cmVlLWxvYWRpbmcgc2lkZQorIyAgb2YgdGhlIHBhcnNlciBtb2R1bGUuCisjCisKK2NsYXNzIFJvdW5kdHJpcExlZ2FsU3ludGF4VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHJvdW5kdHJpcChzZWxmLCBmLCBzKToKKyAgICAgICAgc3QxID0gZihzKQorICAgICAgICB0ID0gc3QxLnRvdHVwbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdDIgPSBwYXJzZXIuc2VxdWVuY2Uyc3QodCkKKyAgICAgICAgZXhjZXB0IHBhcnNlci5QYXJzZXJFcnJvciwgd2h5OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjb3VsZCBub3Qgcm91bmR0cmlwICVyOiAlcyIgJSAocywgd2h5KSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHN0Mi50b3R1cGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCByZS1nZW5lcmF0ZSBzeW50YXggdHJlZSIpCisKKyAgICBkZWYgY2hlY2tfZXhwcihzZWxmLCBzKToKKyAgICAgICAgc2VsZi5yb3VuZHRyaXAocGFyc2VyLmV4cHIsIHMpCisKKyAgICBkZWYgdGVzdF9mbGFnc19wYXNzZWQoc2VsZik6CisgICAgICAgICMgVGhlIHVuaWNvZGUgbGl0ZXJhbHMgZmxhZ3MgaGFzIHRvIGJlIHBhc3NlZCBmcm9tIHRoZSBwYXNlciB0byBBU1QKKyAgICAgICAgIyBnZW5lcmF0aW9uLgorICAgICAgICBzdWl0ZSA9IHBhcnNlci5zdWl0ZSgiZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzOyB4ID0gJyciKQorICAgICAgICBjb2RlID0gc3VpdGUuY29tcGlsZSgpCisgICAgICAgIHNjb3BlID0ge30KKyAgICAgICAgZXhlYyBjb2RlIGluIHNjb3BlCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzY29wZVsieCJdLCB1bmljb2RlKQorCisgICAgZGVmIGNoZWNrX3N1aXRlKHNlbGYsIHMpOgorICAgICAgICBzZWxmLnJvdW5kdHJpcChwYXJzZXIuc3VpdGUsIHMpCisKKyAgICBkZWYgdGVzdF95aWVsZF9zdGF0ZW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHlpZWxkIDEiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOiB5aWVsZCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHggKz0geWllbGQiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOiB4ID0geWllbGQgMSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHggPSB5ID0geWllbGQgMSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHggPSB5aWVsZCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6IHggPSB5ID0geWllbGQiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOiAxICsgKHlpZWxkKSoyIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTogKHlpZWxkIDEpKjIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOiByZXR1cm47IHlpZWxkIDEiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOiB5aWVsZCAxOyByZXR1cm4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZigpOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZm9yIHggaW4gcmFuZ2UoMzApOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHlpZWxkIHhcbiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCk6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpZiAoeWllbGQpOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIHlpZWxkIHhcbiIpCisKKyAgICBkZWYgdGVzdF9leHByZXNzaW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oMSkiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInsxOjF9IikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJ7MToxLCAyOjIsIDM6M30iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInsxOjEsIDI6MiwgMzozLH0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInsxfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiezEsIDIsIDN9IikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJ7MSwgMiwgMyx9IikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJbXSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiWzFdIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJbMSwgMiwgM10iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlsxLCAyLCAzLF0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIigpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCIoMSwpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCIoMSwgMiwgMykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIigxLCAyLCAzLCkiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlt4KiozIGZvciB4IGluIHJhbmdlKDIwKV0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlt4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgM10iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlt4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgMiBpZiB4ICUgM10iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlt4K3kgZm9yIHggaW4gcmFuZ2UoMzApIGZvciB5IGluIHJhbmdlKDIwKSBpZiB4ICUgMiBpZiB5ICUgM10iKQorICAgICAgICAjc2VsZi5jaGVja19leHByKCJbeCBmb3IgeCBpbiBsYW1iZGE6IFRydWUsIGxhbWJkYTogRmFsc2UgaWYgeCgpXSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGlzdCh4KiozIGZvciB4IGluIHJhbmdlKDIwKSkiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxpc3QoeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkgaWYgeCAlIDMpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsaXN0KHgqKjMgZm9yIHggaW4gcmFuZ2UoMjApIGlmIHggJSAyIGlmIHggJSAzKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGlzdCh4K3kgZm9yIHggaW4gcmFuZ2UoMzApIGZvciB5IGluIHJhbmdlKDIwKSBpZiB4ICUgMiBpZiB5ICUgMykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInt4KiozIGZvciB4IGluIHJhbmdlKDMwKX0iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInt4KiozIGZvciB4IGluIHJhbmdlKDMwKSBpZiB4ICUgM30iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInt4KiozIGZvciB4IGluIHJhbmdlKDMwKSBpZiB4ICUgMiBpZiB4ICUgM30iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInt4K3kgZm9yIHggaW4gcmFuZ2UoMzApIGZvciB5IGluIHJhbmdlKDIwKSBpZiB4ICUgMiBpZiB5ICUgM30iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInt4KiozOiB5KioyIGZvciB4LCB5IGluIHppcChyYW5nZSgzMCksIHJhbmdlKDMwKSl9IikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJ7eCoqMzogeSoqMiBmb3IgeCwgeSBpbiB6aXAocmFuZ2UoMzApLCByYW5nZSgzMCkpIGlmIHggJSAzfSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigie3gqKjM6IHkqKjIgZm9yIHgsIHkgaW4gemlwKHJhbmdlKDMwKSwgcmFuZ2UoMzApKSBpZiB4ICUgMyBpZiB5ICUgM30iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoInt4OnkgZm9yIHggaW4gcmFuZ2UoMzApIGZvciB5IGluIHJhbmdlKDIwKSBpZiB4ICUgMiBpZiB5ICUgM30iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbygqYXJncykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbygqYXJncywgKiprdykiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbygqKmt3KSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKGtleT12YWx1ZSkiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyhrZXk9dmFsdWUsICphcmdzKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKGtleT12YWx1ZSwgKmFyZ3MsICoqa3cpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oa2V5PXZhbHVlLCAqKmt3KSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKGEsIGIsIGMsICphcmdzKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKGEsIGIsIGMsICphcmdzLCAqKmt3KSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vKGEsIGIsIGMsICoqa3cpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oYSwgKmFyZ3MsIGtleXdvcmQ9MjMpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28gKyBiYXIiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyAtIGJhciIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigiZm9vICogYmFyIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28gLyBiYXIiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbyAvLyBiYXIiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxhbWJkYTogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIHg6IDAiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxhbWJkYSAqeTogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhICp5LCAqKno6IDAiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxhbWJkYSAqKno6IDAiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxhbWJkYSB4LCB5OiAwIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsYW1iZGEgZm9vPWJhcjogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIGZvbz1iYXIsIHNwYXo9bmlmdHkrc3BpdDogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIGZvbz1iYXIsICoqejogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIGZvbz1iYXIsIGJsYXo9YmxhdCsyLCAqKno6IDAiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxhbWJkYSBmb289YmFyLCBibGF6PWJsYXQrMiwgKnksICoqejogMCIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGFtYmRhIHgsICp5LCAqKno6IDAiKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxhbWJkYSB4OiA1IGlmIHggZWxzZSAyIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCIoeCBmb3IgeCBpbiByYW5nZSgxMCkpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJmb28oeCBmb3IgeCBpbiByYW5nZSgxMCkpIikKKworICAgIGRlZiB0ZXN0X3ByaW50KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJwcmludCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInByaW50IDEiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJwcmludCAxLCIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInByaW50ID4+ZnAiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJwcmludCA+PmZwLCAxIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgicHJpbnQgPj5mcCwgMSwiKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2V4cHJlc3Npb24oc2VsZik6CisgICAgICAgICMgZXhwcl9zdG10CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEiKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX2Fzc2lnbm1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhID0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgPSBiID0gYyA9IGQgPSBlIikKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9hdWdtZW50ZWRfYXNzaWdubWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgKz0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgLT0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgKj0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgLz0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgLy89IGIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhICU9IGIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhICY9IGIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhIHw9IGIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhIF49IGIiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJhIDw8PSBiIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiYSA+Pj0gYiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImEgKio9IGIiKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25fZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoKTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCphcmdzKTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCphcmdzLCAqKmt3KTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKCoqa3cpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoZm9vPWJhcik6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihmb289YmFyLCAqYXJncyk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihmb289YmFyLCAqYXJncywgKiprdyk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihmb289YmFyLCAqKmt3KTogcGFzcyIpCisKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoYSwgYik6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihhLCBiLCAqYXJncyk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihhLCBiLCAqYXJncywgKiprdyk6IHBhc3MiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJkZWYgZihhLCBiLCAqKmt3KTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImRlZiBmKGEsIGIsIGZvbz1iYXIpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoYSwgYiwgZm9vPWJhciwgKmFyZ3MpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoYSwgYiwgZm9vPWJhciwgKmFyZ3MsICoqa3cpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZGVmIGYoYSwgYiwgZm9vPWJhciwgKiprdyk6IHBhc3MiKQorCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIkBzdGF0aWNtZXRob2RcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmIGYoKTogcGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIkBzdGF0aWNtZXRob2RcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQGZ1bmNhdHRycyh4LCB5KVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJkZWYgZigpOiBwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiQGZ1bmNhdHRycygpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgImRlZiBmKCk6IHBhc3MiKQorCisgICAgZGVmIHRlc3RfY2xhc3NfZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiY2xhc3MgZm9vKCk6cGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIkBjbGFzc19kZWNvcmF0b3JcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgZm9vKCk6cGFzcyIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIkBjbGFzc19kZWNvcmF0b3IoYXJnKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjbGFzcyBmb28oKTpwYXNzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiQGRlY29yYXRvcjFcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQGRlY29yYXRvcjJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3MgZm9vKCk6cGFzcyIpCisKKworICAgIGRlZiB0ZXN0X2ltcG9ydF9mcm9tX3N0YXRlbWVudChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSBzeXMucGF0aCBpbXBvcnQgKiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gc3lzLnBhdGggaW1wb3J0IGRpcm5hbWUiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSwpIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSBzeXMucGF0aCBpbXBvcnQgZGlybmFtZSBhcyBteV9kaXJuYW1lIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSBzeXMucGF0aCBpbXBvcnQgKGRpcm5hbWUgYXMgbXlfZGlybmFtZSkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSBhcyBteV9kaXJuYW1lLCkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCBkaXJuYW1lLCBiYXNlbmFtZSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gc3lzLnBhdGggaW1wb3J0IChkaXJuYW1lLCBiYXNlbmFtZSkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSwgYmFzZW5hbWUsKSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoCisgICAgICAgICAgICAiZnJvbSBzeXMucGF0aCBpbXBvcnQgZGlybmFtZSBhcyBteV9kaXJuYW1lLCBiYXNlbmFtZSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoCisgICAgICAgICAgICAiZnJvbSBzeXMucGF0aCBpbXBvcnQgKGRpcm5hbWUgYXMgbXlfZGlybmFtZSwgYmFzZW5hbWUpIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgKKyAgICAgICAgICAgICJmcm9tIHN5cy5wYXRoIGltcG9ydCAoZGlybmFtZSBhcyBteV9kaXJuYW1lLCBiYXNlbmFtZSwpIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgKKyAgICAgICAgICAgICJmcm9tIHN5cy5wYXRoIGltcG9ydCBkaXJuYW1lLCBiYXNlbmFtZSBhcyBteV9iYXNlbmFtZSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoCisgICAgICAgICAgICAiZnJvbSBzeXMucGF0aCBpbXBvcnQgKGRpcm5hbWUsIGJhc2VuYW1lIGFzIG15X2Jhc2VuYW1lKSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoCisgICAgICAgICAgICAiZnJvbSBzeXMucGF0aCBpbXBvcnQgKGRpcm5hbWUsIGJhc2VuYW1lIGFzIG15X2Jhc2VuYW1lLCkiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJmcm9tIC5ib2d1cyBpbXBvcnQgeCIpCisKKyAgICBkZWYgdGVzdF9iYXNpY19pbXBvcnRfc3RhdGVtZW50KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJpbXBvcnQgc3lzIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiaW1wb3J0IHN5cyBhcyBzeXN0ZW0iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJpbXBvcnQgc3lzLCBtYXRoIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiaW1wb3J0IHN5cyBhcyBzeXN0ZW0sIG1hdGgiKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJpbXBvcnQgc3lzLCBtYXRoIGFzIG15X21hdGgiKQorCisgICAgZGVmIHRlc3RfcmVsYXRpdmVfaW1wb3J0cyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSAuIGltcG9ydCBuYW1lIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgiZnJvbSAuLiBpbXBvcnQgbmFtZSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gLnBrZyBpbXBvcnQgbmFtZSIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImZyb20gLi5wa2cgaW1wb3J0IG5hbWUiKQorCisgICAgZGVmIHRlc3RfcGVwMjYzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCIjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhc3NcbiIpCisKKyAgICBkZWYgdGVzdF9hc3NlcnQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoImFzc2VydCBhbG8gPCBhaGkgYW5kIGJsbyA8IGJoaVxuIikKKworICAgIGRlZiB0ZXN0X3dpdGgoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoIndpdGggb3BlbigneCcpOiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ3aXRoIG9wZW4oJ3gnKSBhcyBmOiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ3aXRoIG9wZW4oJ3gnKSBhcyBmLCBvcGVuKCd5JykgYXMgZzogcGFzc1xuIikKKworICAgIGRlZiB0ZXN0X3RyeV9zdG10KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdDogcGFzc1xuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgidHJ5OiBwYXNzXG5maW5hbGx5OiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdCBBOiBwYXNzXG5maW5hbGx5OiBwYXNzXG4iKQorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdCBBOiBwYXNzXG5leGNlcHQ6IHBhc3NcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmluYWxseTogcGFzc1xuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgidHJ5OiBwYXNzXG5leGNlcHQ6IHBhc3NcbmVsc2U6IHBhc3NcbiIpCisgICAgICAgIHNlbGYuY2hlY2tfc3VpdGUoInRyeTogcGFzc1xuZXhjZXB0OiBwYXNzXG5lbHNlOiBwYXNzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmFsbHk6IHBhc3NcbiIpCisKKyAgICBkZWYgdGVzdF9leGNlcHRfY2xhdXNlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3N1aXRlKCJ0cnk6IHBhc3NcbmV4Y2VwdDogcGFzc1xuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgidHJ5OiBwYXNzXG5leGNlcHQgQTogcGFzc1xuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgidHJ5OiBwYXNzXG5leGNlcHQgQSwgZTogcGFzc1xuIikKKyAgICAgICAgc2VsZi5jaGVja19zdWl0ZSgidHJ5OiBwYXNzXG5leGNlcHQgQSBhcyBlOiBwYXNzXG4iKQorCisgICAgZGVmIHRlc3RfcG9zaXRpb24oc2VsZik6CisgICAgICAgICMgQW4gYWJzb2x1dGVseSBtaW5pbWFsIHRlc3Qgb2YgcG9zaXRpb24gaW5mb3JtYXRpb24uICBCZXR0ZXIKKyAgICAgICAgIyB0ZXN0cyB3b3VsZCBiZSBhIGJpZyBwcm9qZWN0LgorICAgICAgICBjb2RlID0gImRlZiBmKHgpOlxuICAgIHJldHVybiB4ICsgMSIKKyAgICAgICAgc3QxID0gcGFyc2VyLnN1aXRlKGNvZGUpCisgICAgICAgIHN0MiA9IHN0MS50b3R1cGxlKGxpbmVfaW5mbz0xLCBjb2xfaW5mbz0xKQorCisgICAgICAgIGRlZiB3YWxrKHRyZWUpOgorICAgICAgICAgICAgbm9kZV90eXBlID0gdHJlZVswXQorICAgICAgICAgICAgbmV4dCA9IHRyZWVbMV0KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmV4dCwgdHVwbGUpOgorICAgICAgICAgICAgICAgIGZvciBlbHQgaW4gdHJlZVsxOl06CisgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIHdhbGsoZWx0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHgKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgdHJlZQorCisgICAgICAgIHRlcm1pbmFscyA9IGxpc3Qod2FsayhzdDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsKKyAgICAgICAgICAgICgxLCAnZGVmJywgMSwgMCksCisgICAgICAgICAgICAoMSwgJ2YnLCAxLCA0KSwKKyAgICAgICAgICAgICg3LCAnKCcsIDEsIDUpLAorICAgICAgICAgICAgKDEsICd4JywgMSwgNiksCisgICAgICAgICAgICAoOCwgJyknLCAxLCA3KSwKKyAgICAgICAgICAgICgxMSwgJzonLCAxLCA4KSwKKyAgICAgICAgICAgICg0LCAnJywgMSwgOSksCisgICAgICAgICAgICAoNSwgJycsIDIsIC0xKSwKKyAgICAgICAgICAgICgxLCAncmV0dXJuJywgMiwgNCksCisgICAgICAgICAgICAoMSwgJ3gnLCAyLCAxMSksCisgICAgICAgICAgICAoMTQsICcrJywgMiwgMTMpLAorICAgICAgICAgICAgKDIsICcxJywgMiwgMTUpLAorICAgICAgICAgICAgKDQsICcnLCAyLCAxNiksCisgICAgICAgICAgICAoNiwgJycsIDIsIC0xKSwKKyAgICAgICAgICAgICg0LCAnJywgMiwgLTEpLAorICAgICAgICAgICAgKDAsICcnLCAyLCAtMSldLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFscykKKworCisjCisjICBTZWNvbmQsIHdlIHRha2UgKmludmFsaWQqIHRyZWVzIGFuZCBtYWtlIHN1cmUgd2UgZ2V0IFBhcnNlckVycm9yCisjICByZWplY3Rpb25zIGZvciB0aGVtLgorIworCitjbGFzcyBJbGxlZ2FsU3ludGF4VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX2JhZF90cmVlKHNlbGYsIHRyZWUsIGxhYmVsKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGFyc2VyLnNlcXVlbmNlMnN0KHRyZWUpCisgICAgICAgIGV4Y2VwdCBwYXJzZXIuUGFyc2VyRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImRpZCBub3QgZGV0ZWN0IGludmFsaWQgdHJlZSBmb3IgJXIiICUgbGFiZWwpCisKKyAgICBkZWYgdGVzdF9qdW5rKHNlbGYpOgorICAgICAgICAjIG5vdCBldmVuIHJlbW90ZWx5IHZhbGlkOgorICAgICAgICBzZWxmLmNoZWNrX2JhZF90cmVlKCgxLCAyLCAzKSwgIjxqdW5rPiIpCisKKyAgICBkZWYgdGVzdF9pbGxlZ2FsX3lpZWxkXzEoc2VsZik6CisgICAgICAgICMgSWxsZWdhbCB5aWVsZCBzdGF0ZW1lbnQ6IGRlZiBmKCk6IHJldHVybiAxOyB5aWVsZCAxCisgICAgICAgIHRyZWUgPSBcCisgICAgICAgICgyNTcsCisgICAgICAgICAoMjY0LAorICAgICAgICAgICgyODUsCisgICAgICAgICAgICgyNTksCisgICAgICAgICAgICAoMSwgJ2RlZicpLAorICAgICAgICAgICAgKDEsICdmJyksCisgICAgICAgICAgICAoMjYwLCAoNywgJygnKSwgKDgsICcpJykpLAorICAgICAgICAgICAgKDExLCAnOicpLAorICAgICAgICAgICAgKDI5MSwKKyAgICAgICAgICAgICAoNCwgJycpLAorICAgICAgICAgICAgICg1LCAnJyksCisgICAgICAgICAgICAgKDI2NCwKKyAgICAgICAgICAgICAgKDI2NSwKKyAgICAgICAgICAgICAgICgyNjYsCisgICAgICAgICAgICAgICAgKDI3MiwKKyAgICAgICAgICAgICAgICAgKDI3NSwKKyAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJyksCisgICAgICAgICAgICAgICAgICAoMzEzLAorICAgICAgICAgICAgICAgICAgICgyOTIsCisgICAgICAgICAgICAgICAgICAgICgyOTMsCisgICAgICAgICAgICAgICAgICAgICAoMjk0LAorICAgICAgICAgICAgICAgICAgICAgICgyOTUsCisgICAgICAgICAgICAgICAgICAgICAgICgyOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAoMjk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICgyOTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDIsICgzMDMsICgzMDQsICgzMDUsICgyLCAnMScpKSkpKSkpKSkpKSkpKSkpKSksCisgICAgICAgICAgICAgICAoMjY0LAorICAgICAgICAgICAgICAgICgyNjUsCisgICAgICAgICAgICAgICAgICgyNjYsCisgICAgICAgICAgICAgICAgICAoMjcyLAorICAgICAgICAgICAgICAgICAgICgyNzYsCisgICAgICAgICAgICAgICAgICAgICgxLCAneWllbGQnKSwKKyAgICAgICAgICAgICAgICAgICAgKDMxMywKKyAgICAgICAgICAgICAgICAgICAgICgyOTIsCisgICAgICAgICAgICAgICAgICAgICAgKDI5MywKKyAgICAgICAgICAgICAgICAgICAgICAgKDI5NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICgyOTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgKDI5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDI5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgyOTksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMywgKDMwNCwgKDMwNSwgKDIsICcxJykpKSkpKSkpKSkpKSkpKSkpKSwKKyAgICAgICAgICAgICAgICAgKDQsICcnKSkpLAorICAgICAgICAgICAgICAgKDYsICcnKSkpKSksCisgICAgICAgICAgICg0LCAnJyksCisgICAgICAgICAgICgwLCAnJykpKSkKKyAgICAgICAgc2VsZi5jaGVja19iYWRfdHJlZSh0cmVlLCAiZGVmIGYoKTpcbiAgcmV0dXJuIDFcbiAgeWllbGQgMSIpCisKKyAgICBkZWYgdGVzdF9pbGxlZ2FsX3lpZWxkXzIoc2VsZik6CisgICAgICAgICMgSWxsZWdhbCByZXR1cm4gaW4gZ2VuZXJhdG9yOiBkZWYgZigpOiByZXR1cm4gMTsgeWllbGQgMQorICAgICAgICB0cmVlID0gXAorICAgICAgICAoMjU3LAorICAgICAgICAgKDI2NCwKKyAgICAgICAgICAoMjY1LAorICAgICAgICAgICAoMjY2LAorICAgICAgICAgICAgKDI3OCwKKyAgICAgICAgICAgICAoMSwgJ2Zyb20nKSwKKyAgICAgICAgICAgICAoMjgxLCAoMSwgJ19fZnV0dXJlX18nKSksCisgICAgICAgICAgICAgKDEsICdpbXBvcnQnKSwKKyAgICAgICAgICAgICAoMjc5LCAoMSwgJ2dlbmVyYXRvcnMnKSkpKSwKKyAgICAgICAgICAgKDQsICcnKSkpLAorICAgICAgICAgKDI2NCwKKyAgICAgICAgICAoMjg1LAorICAgICAgICAgICAoMjU5LAorICAgICAgICAgICAgKDEsICdkZWYnKSwKKyAgICAgICAgICAgICgxLCAnZicpLAorICAgICAgICAgICAgKDI2MCwgKDcsICcoJyksICg4LCAnKScpKSwKKyAgICAgICAgICAgICgxMSwgJzonKSwKKyAgICAgICAgICAgICgyOTEsCisgICAgICAgICAgICAgKDQsICcnKSwKKyAgICAgICAgICAgICAoNSwgJycpLAorICAgICAgICAgICAgICgyNjQsCisgICAgICAgICAgICAgICgyNjUsCisgICAgICAgICAgICAgICAoMjY2LAorICAgICAgICAgICAgICAgICgyNzIsCisgICAgICAgICAgICAgICAgICgyNzUsCisgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicpLAorICAgICAgICAgICAgICAgICAgKDMxMywKKyAgICAgICAgICAgICAgICAgICAoMjkyLAorICAgICAgICAgICAgICAgICAgICAoMjkzLAorICAgICAgICAgICAgICAgICAgICAgKDI5NCwKKyAgICAgICAgICAgICAgICAgICAgICAoMjk1LAorICAgICAgICAgICAgICAgICAgICAgICAoMjk3LAorICAgICAgICAgICAgICAgICAgICAgICAgKDI5OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMjk5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAyLCAoMzAzLCAoMzA0LCAoMzA1LCAoMiwgJzEnKSkpKSkpKSkpKSkpKSkpKSkpLAorICAgICAgICAgICAgICAgKDI2NCwKKyAgICAgICAgICAgICAgICAoMjY1LAorICAgICAgICAgICAgICAgICAoMjY2LAorICAgICAgICAgICAgICAgICAgKDI3MiwKKyAgICAgICAgICAgICAgICAgICAoMjc2LAorICAgICAgICAgICAgICAgICAgICAoMSwgJ3lpZWxkJyksCisgICAgICAgICAgICAgICAgICAgICgzMTMsCisgICAgICAgICAgICAgICAgICAgICAoMjkyLAorICAgICAgICAgICAgICAgICAgICAgICgyOTMsCisgICAgICAgICAgICAgICAgICAgICAgICgyOTQsCisgICAgICAgICAgICAgICAgICAgICAgICAoMjk1LAorICAgICAgICAgICAgICAgICAgICAgICAgICgyOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICgyOTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoMjk5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMzAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzMDMsICgzMDQsICgzMDUsICgyLCAnMScpKSkpKSkpKSkpKSkpKSkpKSksCisgICAgICAgICAgICAgICAgICg0LCAnJykpKSwKKyAgICAgICAgICAgICAgICg2LCAnJykpKSkpLAorICAgICAgICAgICAoNCwgJycpLAorICAgICAgICAgICAoMCwgJycpKSkpCisgICAgICAgIHNlbGYuY2hlY2tfYmFkX3RyZWUodHJlZSwgImRlZiBmKCk6XG4gIHJldHVybiAxXG4gIHlpZWxkIDEiKQorCisgICAgZGVmIHRlc3RfcHJpbnRfY2hldnJvbl9jb21tYShzZWxmKToKKyAgICAgICAgIyBJbGxlZ2FsIGlucHV0OiBwcmludCA+PmZwLAorICAgICAgICB0cmVlID0gXAorICAgICAgICAoMjU3LAorICAgICAgICAgKDI2NCwKKyAgICAgICAgICAoMjY1LAorICAgICAgICAgICAoMjY2LAorICAgICAgICAgICAgKDI2OCwKKyAgICAgICAgICAgICAoMSwgJ3ByaW50JyksCisgICAgICAgICAgICAgKDM1LCAnPj4nKSwKKyAgICAgICAgICAgICAoMjkwLAorICAgICAgICAgICAgICAoMjkxLAorICAgICAgICAgICAgICAgKDI5MiwKKyAgICAgICAgICAgICAgICAoMjkzLAorICAgICAgICAgICAgICAgICAoMjk1LAorICAgICAgICAgICAgICAgICAgKDI5NiwKKyAgICAgICAgICAgICAgICAgICAoMjk3LAorICAgICAgICAgICAgICAgICAgICAoMjk4LCAoMjk5LCAoMzAwLCAoMzAxLCAoMzAyLCAoMzAzLCAoMSwgJ2ZwJykpKSkpKSkpKSkpKSkpLAorICAgICAgICAgICAgICgxMiwgJywnKSkpLAorICAgICAgICAgICAoNCwgJycpKSksCisgICAgICAgICAoMCwgJycpKQorICAgICAgICBzZWxmLmNoZWNrX2JhZF90cmVlKHRyZWUsICJwcmludCA+PmZwLCIpCisKKyAgICBkZWYgdGVzdF9hX2NvbW1hX2NvbW1hX2Moc2VsZik6CisgICAgICAgICMgSWxsZWdhbCBpbnB1dDogYSwsYworICAgICAgICB0cmVlID0gXAorICAgICAgICAoMjU4LAorICAgICAgICAgKDMxMSwKKyAgICAgICAgICAoMjkwLAorICAgICAgICAgICAoMjkxLAorICAgICAgICAgICAgKDI5MiwKKyAgICAgICAgICAgICAoMjkzLAorICAgICAgICAgICAgICAoMjk1LAorICAgICAgICAgICAgICAgKDI5NiwKKyAgICAgICAgICAgICAgICAoMjk3LAorICAgICAgICAgICAgICAgICAoMjk4LCAoMjk5LCAoMzAwLCAoMzAxLCAoMzAyLCAoMzAzLCAoMSwgJ2EnKSkpKSkpKSkpKSkpKSksCisgICAgICAgICAgKDEyLCAnLCcpLAorICAgICAgICAgICgxMiwgJywnKSwKKyAgICAgICAgICAoMjkwLAorICAgICAgICAgICAoMjkxLAorICAgICAgICAgICAgKDI5MiwKKyAgICAgICAgICAgICAoMjkzLAorICAgICAgICAgICAgICAoMjk1LAorICAgICAgICAgICAgICAgKDI5NiwKKyAgICAgICAgICAgICAgICAoMjk3LAorICAgICAgICAgICAgICAgICAoMjk4LCAoMjk5LCAoMzAwLCAoMzAxLCAoMzAyLCAoMzAzLCAoMSwgJ2MnKSkpKSkpKSkpKSkpKSkpLAorICAgICAgICAgKDQsICcnKSwKKyAgICAgICAgICgwLCAnJykpCisgICAgICAgIHNlbGYuY2hlY2tfYmFkX3RyZWUodHJlZSwgImEsLGMiKQorCisgICAgZGVmIHRlc3RfaWxsZWdhbF9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgIyBJbGxlZ2FsIGlucHV0OiBhICQ9IGIKKyAgICAgICAgdHJlZSA9IFwKKyAgICAgICAgKDI1NywKKyAgICAgICAgICgyNjQsCisgICAgICAgICAgKDI2NSwKKyAgICAgICAgICAgKDI2NiwKKyAgICAgICAgICAgICgyNjcsCisgICAgICAgICAgICAgKDMxMiwKKyAgICAgICAgICAgICAgKDI5MSwKKyAgICAgICAgICAgICAgICgyOTIsCisgICAgICAgICAgICAgICAgKDI5MywKKyAgICAgICAgICAgICAgICAgKDI5NCwKKyAgICAgICAgICAgICAgICAgICgyOTYsCisgICAgICAgICAgICAgICAgICAgKDI5NywKKyAgICAgICAgICAgICAgICAgICAgKDI5OCwKKyAgICAgICAgICAgICAgICAgICAgICgyOTksCisgICAgICAgICAgICAgICAgICAgICAgKDMwMCwgKDMwMSwgKDMwMiwgKDMwMywgKDMwNCwgKDEsICdhJykpKSkpKSkpKSkpKSkpKSwKKyAgICAgICAgICAgICAoMjY4LCAoMzcsICckPScpKSwKKyAgICAgICAgICAgICAoMzEyLAorICAgICAgICAgICAgICAoMjkxLAorICAgICAgICAgICAgICAgKDI5MiwKKyAgICAgICAgICAgICAgICAoMjkzLAorICAgICAgICAgICAgICAgICAoMjk0LAorICAgICAgICAgICAgICAgICAgKDI5NiwKKyAgICAgICAgICAgICAgICAgICAoMjk3LAorICAgICAgICAgICAgICAgICAgICAoMjk4LAorICAgICAgICAgICAgICAgICAgICAgKDI5OSwKKyAgICAgICAgICAgICAgICAgICAgICAoMzAwLCAoMzAxLCAoMzAyLCAoMzAzLCAoMzA0LCAoMSwgJ2InKSkpKSkpKSkpKSkpKSkpKSksCisgICAgICAgICAgICg0LCAnJykpKSwKKyAgICAgICAgICgwLCAnJykpCisgICAgICAgIHNlbGYuY2hlY2tfYmFkX3RyZWUodHJlZSwgImEgJD0gYiIpCisKKyAgICBkZWYgdGVzdF9tYWxmb3JtZWRfZ2xvYmFsKHNlbGYpOgorICAgICAgICAjZG9lc24ndCBoYXZlIGdsb2JhbCBrZXl3b3JkIGluIGFzdAorICAgICAgICB0cmVlID0gKDI1NywKKyAgICAgICAgICAgICAgICAoMjY0LAorICAgICAgICAgICAgICAgICAoMjY1LAorICAgICAgICAgICAgICAgICAgKDI2NiwKKyAgICAgICAgICAgICAgICAgICAoMjgyLCAoMSwgJ2ZvbycpKSksICg0LCAnJykpKSwKKyAgICAgICAgICAgICAgICAoNCwgJycpLAorICAgICAgICAgICAgICAgICgwLCAnJykpCisgICAgICAgIHNlbGYuY2hlY2tfYmFkX3RyZWUodHJlZSwgIm1hbGZvcm1lZCBnbG9iYWwgYXN0IikKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfaW1wb3J0X3NvdXJjZShzZWxmKToKKyAgICAgICAgIyBmcm9tIGltcG9ydCBhCisgICAgICAgIHRyZWUgPSBcCisgICAgICAgICAgICAoMjU3LAorICAgICAgICAgICAgICgyNjcsCisgICAgICAgICAgICAgICgyNjgsCisgICAgICAgICAgICAgICAoMjY5LAorICAgICAgICAgICAgICAgICgyODEsCisgICAgICAgICAgICAgICAgICgyODMsICgxLCAnZnJvbScpLCAoMSwgJ2ltcG9ydCcpLAorICAgICAgICAgICAgICAgICAgKDI4NiwgKDI4NCwgKDEsICdmcmVkJykpKSkpKSwKKyAgICAgICAgICAgICAgICg0LCAnJykpKSwKKyAgICAgICAgICAgICAoNCwgJycpLCAoMCwgJycpKQorICAgICAgICBzZWxmLmNoZWNrX2JhZF90cmVlKHRyZWUsICJmcm9tIGltcG9ydCBhIikKKworCitjbGFzcyBDb21waWxlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBUaGVzZSB0ZXN0cyBhcmUgdmVyeSBtaW5pbWFsLiA6LSgKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfZXhwcihzZWxmKToKKyAgICAgICAgc3QgPSBwYXJzZXIuZXhwcignMiArIDMnKQorICAgICAgICBjb2RlID0gcGFyc2VyLmNvbXBpbGVzdChzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGNvZGUpLCA1KQorCisgICAgZGVmIHRlc3RfY29tcGlsZV9zdWl0ZShzZWxmKToKKyAgICAgICAgc3QgPSBwYXJzZXIuc3VpdGUoJ3ggPSAyOyB5ID0geCArIDMnKQorICAgICAgICBjb2RlID0gcGFyc2VyLmNvbXBpbGVzdChzdCkKKyAgICAgICAgZ2xvYnMgPSB7fQorICAgICAgICBleGVjIGNvZGUgaW4gZ2xvYnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnbG9ic1sneSddLCA1KQorCisgICAgZGVmIHRlc3RfY29tcGlsZV9lcnJvcihzZWxmKToKKyAgICAgICAgc3QgPSBwYXJzZXIuc3VpdGUoJzEgPSAzICsgNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBwYXJzZXIuY29tcGlsZXN0LCBzdCkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVfYmFkdW5pY29kZShzZWxmKToKKyAgICAgICAgc3QgPSBwYXJzZXIuc3VpdGUoJ2EgPSB1IlxVMTIzNDU2NzgiJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIHBhcnNlci5jb21waWxlc3QsIHN0KQorICAgICAgICBzdCA9IHBhcnNlci5zdWl0ZSgnYSA9IHUiXHUxIicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBwYXJzZXIuY29tcGlsZXN0LCBzdCkKKworICAgIGRlZiB0ZXN0X2lzc3VlXzkwMTEoc2VsZik6CisgICAgICAgICMgSXNzdWUgOTAxMTogY29tcGlsYXRpb24gb2YgYW4gdW5hcnkgbWludXMgZXhwcmVzc2lvbiBjaGFuZ2VkCisgICAgICAgICMgdGhlIG1lYW5pbmcgb2YgdGhlIFNULCBzbyB0aGF0IGEgc2Vjb25kIGNvbXBpbGF0aW9uIHByb2R1Y2VkCisgICAgICAgICMgaW5jb3JyZWN0IHJlc3VsdHMuCisgICAgICAgIHN0ID0gcGFyc2VyLmV4cHIoJy0zJykKKyAgICAgICAgY29kZTEgPSBwYXJzZXIuY29tcGlsZXN0KHN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoY29kZTEpLCAtMykKKyAgICAgICAgY29kZTIgPSBwYXJzZXIuY29tcGlsZXN0KHN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoY29kZTIpLCAtMykKKworCitjbGFzcyBQYXJzZXJTdGFja0xpbWl0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiInRyeSB0byBwdXNoIHRoZSBwYXJzZXIgdG8vb3ZlciBpdHMgbGltaXRzLgorICAgIHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTg4MSBmb3IgYSBkaXNjdXNzaW9uCisgICAgIiIiCisgICAgZGVmIF9uZXN0ZWRfZXhwcmVzc2lvbihzZWxmLCBsZXZlbCk6CisgICAgICAgIHJldHVybiAiWyIqbGV2ZWwrIl0iKmxldmVsCisKKyAgICBkZWYgdGVzdF9kZWVwbHlfbmVzdGVkX2xpc3Qoc2VsZik6CisgICAgICAgIGUgPSBzZWxmLl9uZXN0ZWRfZXhwcmVzc2lvbig5OSkKKyAgICAgICAgc3QgPSBwYXJzZXIuZXhwcihlKQorICAgICAgICBzdC5jb21waWxlKCkKKworICAgIGRlZiB0ZXN0X3RyaWdnZXJfbWVtb3J5X2Vycm9yKHNlbGYpOgorICAgICAgICBlID0gc2VsZi5fbmVzdGVkX2V4cHJlc3Npb24oMTAwKQorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX2ZhaWx1cmUoJy1jJywgZSkKKyAgICAgICAgIyBwYXJzaW5nIHRoZSBleHByZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgIyBmb2xsb3dlZCBieSBhIE1lbW9yeUVycm9yIChzZWUgIzExOTYzKQorICAgICAgICBzZWxmLmFzc2VydEluKGInc19wdXNoOiBwYXJzZXIgc3RhY2sgb3ZlcmZsb3cnLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYidNZW1vcnlFcnJvcicsIGVycikKKworY2xhc3MgU1RPYmplY3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBvcGVyYXRpb25zIG9uIFNUIG9iamVjdHMgdGhlbXNlbHZlcyIiIgorCisgICAgY2hlY2tfc2l6ZW9mID0gc3VwcG9ydC5jaGVja19zaXplb2YKKworICAgIEBzdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3NpemVvZihzZWxmKToKKyAgICAgICAgZGVmIFhYWFJPVU5EVVAobik6CisgICAgICAgICAgICBpZiBuIDw9IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgICAgIGlmIG4gPD0gMTI4OgorICAgICAgICAgICAgICAgIHJldHVybiAobiArIDMpICYgfjMKKyAgICAgICAgICAgIHJldHVybiAxIDw8IChuIC0gMSkuYml0X2xlbmd0aCgpCisKKyAgICAgICAgYmFzZXNpemUgPSBzdXBwb3J0LmNhbGNvYmpzaXplKCdQaWknKQorICAgICAgICBub2Rlc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZSgnaFAzaVAwaCcpCisgICAgICAgIGRlZiBzaXplb2ZjaGlsZHJlbihub2RlKToKKyAgICAgICAgICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgcmVzID0gMAorICAgICAgICAgICAgaGFzc3RyID0gbGVuKG5vZGUpID4gMSBhbmQgaXNpbnN0YW5jZShub2RlWy0xXSwgc3RyKQorICAgICAgICAgICAgaWYgaGFzc3RyOgorICAgICAgICAgICAgICAgIHJlcyArPSBsZW4obm9kZVstMV0pICsgMQorICAgICAgICAgICAgY2hpbGRyZW4gPSBub2RlWzE6LTFdIGlmIGhhc3N0ciBlbHNlIG5vZGVbMTpdCisgICAgICAgICAgICBpZiBjaGlsZHJlbjoKKyAgICAgICAgICAgICAgICByZXMgKz0gWFhYUk9VTkRVUChsZW4oY2hpbGRyZW4pKSAqIG5vZGVzaXplCisgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIGNoaWxkcmVuOgorICAgICAgICAgICAgICAgICAgICByZXMgKz0gc2l6ZW9mY2hpbGRyZW4oY2hpbGQpCisgICAgICAgICAgICByZXR1cm4gcmVzCisKKyAgICAgICAgZGVmIGNoZWNrX3N0X3NpemVvZihzdCk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX3NpemVvZihzdCwgYmFzZXNpemUgKyBub2Rlc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mY2hpbGRyZW4oc3QudG90dXBsZSgpKSkKKworICAgICAgICBjaGVja19zdF9zaXplb2YocGFyc2VyLmV4cHIoJzIgKyAzJykpCisgICAgICAgIGNoZWNrX3N0X3NpemVvZihwYXJzZXIuZXhwcignMiArIDMgKyA0JykpCisgICAgICAgIGNoZWNrX3N0X3NpemVvZihwYXJzZXIuc3VpdGUoJ3ggPSAyICsgMycpKQorICAgICAgICBjaGVja19zdF9zaXplb2YocGFyc2VyLnN1aXRlKCcnKSkKKyAgICAgICAgY2hlY2tfc3Rfc2l6ZW9mKHBhcnNlci5zdWl0ZSgnIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0nKSkKKyAgICAgICAgY2hlY2tfc3Rfc2l6ZW9mKHBhcnNlci5leHByKCdbJyArICcyLCcgKiAxMDAwICsgJ10nKSkKKworCisgICAgIyBYWFggdGVzdHMgZm9yIHBpY2tsaW5nIGFuZCB1bnBpY2tsaW5nIG9mIFNUIG9iamVjdHMgc2hvdWxkIGdvIGhlcmUKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHN1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBSb3VuZHRyaXBMZWdhbFN5bnRheFRlc3RDYXNlLAorICAgICAgICBJbGxlZ2FsU3ludGF4VGVzdENhc2UsCisgICAgICAgIENvbXBpbGVUZXN0Q2FzZSwKKyAgICAgICAgUGFyc2VyU3RhY2tMaW1pdFRlc3RDYXNlLAorICAgICAgICBTVE9iamVjdFRlc3RDYXNlLAorICAgICkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGFyc2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUwMjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGFyc2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGFyc2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjUwMjIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGFyc2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZGIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU5Zjc1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weQpAQCAtMCwwICsxLDM3NCBAQAorIyBBIHRlc3Qgc3VpdGUgZm9yIHBkYjsgYXQgdGhlIG1vbWVudCwgdGhpcyBvbmx5IHZhbGlkYXRlcyBza2lwcGluZyBvZgorIyBzcGVjaWZpZWQgdGVzdCBtb2R1bGVzIChSRkUgIzUxNDIpLgorCitpbXBvcnQgaW1wCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0ZXh0d3JhcAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorIyBUaGlzIGxpdHRsZSBoZWxwZXIgY2xhc3MgaXMgZXNzZW50aWFsIGZvciB0ZXN0aW5nIHBkYiB1bmRlciBkb2N0ZXN0LgorZnJvbSB0ZXN0X2RvY3Rlc3QgaW1wb3J0IF9GYWtlSW5wdXQKKworCitjbGFzcyBQZGJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgcnVuX3BkYihzZWxmLCBzY3JpcHQsIGNvbW1hbmRzKToKKyAgICAgICAgIiIiUnVuICdzY3JpcHQnIGxpbmVzIHdpdGggcGRiIGFuZCB0aGUgcGRiICdjb21tYW5kcycuIiIiCisgICAgICAgIGZpbGVuYW1lID0gJ21haW4ucHknCisgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSh0ZXh0d3JhcC5kZWRlbnQoc2NyaXB0KSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssIGZpbGVuYW1lKQorICAgICAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsICctbScsICdwZGInLCBmaWxlbmFtZV0KKyAgICAgICAgc3Rkb3V0ID0gc3RkZXJyID0gTm9uZQorICAgICAgICBwcm9jID0gc3VicHJvY2Vzcy5Qb3BlbihjbWQsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvYy5jb21tdW5pY2F0ZShjb21tYW5kcykKKyAgICAgICAgcHJvYy5zdGRvdXQuY2xvc2UoKQorICAgICAgICBwcm9jLnN0ZGluLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHN0ZG91dCwgc3RkZXJyCisKKyAgICBkZWYgdGVzdF9pc3N1ZTEzMTgzKHNlbGYpOgorICAgICAgICBzY3JpcHQgPSAiIiIKKyAgICAgICAgICAgIGZyb20gYmFyIGltcG9ydCBiYXIKKworICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIGJhcigpCisKKyAgICAgICAgICAgIGRlZiBub3BlKCk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgZm9vYmFyKCk6CisgICAgICAgICAgICAgICAgZm9vKCkKKyAgICAgICAgICAgICAgICBub3BlKCkKKworICAgICAgICAgICAgZm9vYmFyKCkKKyAgICAgICAgIiIiCisgICAgICAgIGNvbW1hbmRzID0gIiIiCisgICAgICAgICAgICBmcm9tIGJhciBpbXBvcnQgYmFyCisgICAgICAgICAgICBicmVhayBiYXIKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzdGVwCisgICAgICAgICAgICBzdGVwCisgICAgICAgICAgICBxdWl0CisgICAgICAgICIiIgorICAgICAgICBiYXIgPSAiIiIKKyAgICAgICAgICAgIGRlZiBiYXIoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICIiIgorICAgICAgICB3aXRoIG9wZW4oJ2Jhci5weScsICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUodGV4dHdyYXAuZGVkZW50KGJhcikpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X3N1cHBvcnQudW5saW5rLCAnYmFyLnB5JykKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBzZWxmLnJ1bl9wZGIoc2NyaXB0LCBjb21tYW5kcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgYW55KCdtYWluLnB5KDUpZm9vKCktPk5vbmUnIGluIGwgZm9yIGwgaW4gc3Rkb3V0LnNwbGl0bGluZXMoKSksCisgICAgICAgICAgICAnRmFpbCB0byBzdGVwIGludG8gdGhlIGNhbGxlciBhZnRlciBhIHJldHVybicpCisKKworY2xhc3MgUGRiVGVzdElucHV0KG9iamVjdCk6CisgICAgIiIiQ29udGV4dCBtYW5hZ2VyIHRoYXQgbWFrZXMgdGVzdGluZyBQZGIgaW4gZG9jdGVzdHMgZWFzaWVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0KToKKyAgICAgICAgc2VsZi5pbnB1dCA9IGlucHV0CisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWxfc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgc3lzLnN0ZGluID0gX0Zha2VJbnB1dChzZWxmLmlucHV0KQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGMpOgorICAgICAgICBzeXMuc3RkaW4gPSBzZWxmLnJlYWxfc3RkaW4KKworCitkZWYgd3JpdGUoeCk6CisgICAgcHJpbnQgeAorCitkZWYgdGVzdF9wZGJfZGlzcGxheWhvb2soKToKKyAgICAiIiJUaGlzIHRlc3RzIHRoZSBjdXN0b20gZGlzcGxheWhvb2sgZm9yIHBkYi4KKworICAgID4+PiBkZWYgdGVzdF9mdW5jdGlvbihmb28sIGJhcik6CisgICAgLi4uICAgICBpbXBvcnQgcGRiOyBwZGIuUGRiKCkuc2V0X3RyYWNlKCkKKyAgICAuLi4gICAgIHBhc3MKKworICAgID4+PiB3aXRoIFBkYlRlc3RJbnB1dChbCisgICAgLi4uICAgICAnZm9vJywKKyAgICAuLi4gICAgICdiYXInLAorICAgIC4uLiAgICAgJ2ZvciBpIGluIHJhbmdlKDUpOiB3cml0ZShpKScsCisgICAgLi4uICAgICAnY29udGludWUnLAorICAgIC4uLiBdKToKKyAgICAuLi4gICAgIHRlc3RfZnVuY3Rpb24oMSwgTm9uZSkKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfZGlzcGxheWhvb2tbMF0+KDMpdGVzdF9mdW5jdGlvbigpCisgICAgLT4gcGFzcworICAgIChQZGIpIGZvbworICAgIDEKKyAgICAoUGRiKSBiYXIKKyAgICAoUGRiKSBmb3IgaSBpbiByYW5nZSg1KTogd3JpdGUoaSkKKyAgICAwCisgICAgMQorICAgIDIKKyAgICAzCisgICAgNAorICAgIChQZGIpIGNvbnRpbnVlCisgICAgIiIiCisKK2RlZiB0ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzKCk6CisgICAgIiIiVGVzdCBiYXNpYyBjb21tYW5kcyByZWxhdGVkIHRvIGJyZWFrcG9pbnRzLgorCisgICAgPj4+IGRlZiB0ZXN0X2Z1bmN0aW9uKCk6CisgICAgLi4uICAgICBpbXBvcnQgcGRiOyBwZGIuUGRiKCkuc2V0X3RyYWNlKCkKKyAgICAuLi4gICAgIHByaW50KDEpCisgICAgLi4uICAgICBwcmludCgyKQorICAgIC4uLiAgICAgcHJpbnQoMykKKyAgICAuLi4gICAgIHByaW50KDQpCisKKyAgICBGaXJzdCwgbmVlZCB0byBjbGVhciBiZGIgc3RhdGUgdGhhdCBtaWdodCBiZSBsZWZ0IG92ZXIgZnJvbSBwcmV2aW91cyB0ZXN0cy4KKyAgICBPdGhlcndpc2UsIHRoZSBuZXcgYnJlYWtwb2ludHMgbWlnaHQgZ2V0IGFzc2lnbmVkIGRpZmZlcmVudCBudW1iZXJzLgorCisgICAgPj4+IGZyb20gYmRiIGltcG9ydCBCcmVha3BvaW50CisgICAgPj4+IEJyZWFrcG9pbnQubmV4dCA9IDEKKyAgICA+Pj4gQnJlYWtwb2ludC5icGxpc3QgPSB7fQorICAgID4+PiBCcmVha3BvaW50LmJwYnludW1iZXIgPSBbTm9uZV0KKworICAgIE5vdyB0ZXN0IHRoZSBicmVha3BvaW50IGNvbW1hbmRzLiAgTk9STUFMSVpFX1dISVRFU1BBQ0UgaXMgbmVlZGVkIGJlY2F1c2UKKyAgICB0aGUgYnJlYWtwb2ludCBsaXN0IG91dHB1dHMgYSB0YWIgZm9yIHRoZSAic3RvcCBvbmx5IiBhbmQgImlnbm9yZSBuZXh0IgorICAgIGxpbmVzLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIHB1dCBpbiBoZXJlLgorCisgICAgPj4+IHdpdGggUGRiVGVzdElucHV0KFsgICMgZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgLi4uICAgICAnYnJlYWsgMycsCisgICAgLi4uICAgICAnZGlzYWJsZSAxJywKKyAgICAuLi4gICAgICdpZ25vcmUgMSAxMCcsCisgICAgLi4uICAgICAnY29uZGl0aW9uIDEgMSA8IDInLAorICAgIC4uLiAgICAgJ2JyZWFrIDQnLAorICAgIC4uLiAgICAgJ2JyZWFrIDQnLAorICAgIC4uLiAgICAgJ2JyZWFrJywKKyAgICAuLi4gICAgICdjbGVhciAzJywKKyAgICAuLi4gICAgICdicmVhaycsCisgICAgLi4uICAgICAnY29uZGl0aW9uIDEnLAorICAgIC4uLiAgICAgJ2VuYWJsZSAxJywKKyAgICAuLi4gICAgICdjbGVhciAxJywKKyAgICAuLi4gICAgICdjb21tYW5kcyAyJywKKyAgICAuLi4gICAgICdwcmludCA0MicsCisgICAgLi4uICAgICAnZW5kJywKKyAgICAuLi4gICAgICdjb250aW51ZScsICAjIHdpbGwgc3RvcCBhdCBicmVha3BvaW50IDIgKGxpbmUgNCkKKyAgICAuLi4gICAgICdjbGVhcicsICAgICAjIGNsZWFyIGFsbCEKKyAgICAuLi4gICAgICd5JywKKyAgICAuLi4gICAgICd0YnJlYWsgNScsCisgICAgLi4uICAgICAnY29udGludWUnLCAgIyB3aWxsIHN0b3AgYXQgdGVtcG9yYXJ5IGJyZWFrcG9pbnQKKyAgICAuLi4gICAgICdicmVhaycsICAgICAjIG1ha2Ugc3VyZSBicmVha3BvaW50IGlzIGdvbmUKKyAgICAuLi4gICAgICdjb250aW51ZScsCisgICAgLi4uIF0pOgorICAgIC4uLiAgICB0ZXN0X2Z1bmN0aW9uKCkKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT4oMyl0ZXN0X2Z1bmN0aW9uKCkKKyAgICAtPiBwcmludCgxKQorICAgIChQZGIpIGJyZWFrIDMKKyAgICBCcmVha3BvaW50IDEgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjozCisgICAgKFBkYikgZGlzYWJsZSAxCisgICAgKFBkYikgaWdub3JlIDEgMTAKKyAgICBXaWxsIGlnbm9yZSBuZXh0IDEwIGNyb3NzaW5ncyBvZiBicmVha3BvaW50IDEuCisgICAgKFBkYikgY29uZGl0aW9uIDEgMSA8IDIKKyAgICAoUGRiKSBicmVhayA0CisgICAgQnJlYWtwb2ludCAyIGF0IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT46NAorICAgIChQZGIpIGJyZWFrIDQKKyAgICBCcmVha3BvaW50IDMgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjo0CisgICAgKFBkYikgYnJlYWsKKyAgICBOdW0gVHlwZSAgICAgICAgIERpc3AgRW5iICAgV2hlcmUKKyAgICAxICAgYnJlYWtwb2ludCAgIGtlZXAgbm8gICAgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjozCisgICAgICAgICAgICBzdG9wIG9ubHkgaWYgMSA8IDIKKyAgICAgICAgICAgIGlnbm9yZSBuZXh0IDEwIGhpdHMKKyAgICAyICAgYnJlYWtwb2ludCAgIGtlZXAgeWVzICAgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9icmVha3BvaW50X2NvbW1hbmRzWzBdPjo0CisgICAgMyAgIGJyZWFrcG9pbnQgICBrZWVwIHllcyAgIGF0IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT46NAorICAgIChQZGIpIGNsZWFyIDMKKyAgICBEZWxldGVkIGJyZWFrcG9pbnQgMworICAgIChQZGIpIGJyZWFrCisgICAgTnVtIFR5cGUgICAgICAgICBEaXNwIEVuYiAgIFdoZXJlCisgICAgMSAgIGJyZWFrcG9pbnQgICBrZWVwIG5vICAgIGF0IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT46MworICAgICAgICAgICAgc3RvcCBvbmx5IGlmIDEgPCAyCisgICAgICAgICAgICBpZ25vcmUgbmV4dCAxMCBoaXRzCisgICAgMiAgIGJyZWFrcG9pbnQgICBrZWVwIHllcyAgIGF0IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT46NAorICAgIChQZGIpIGNvbmRpdGlvbiAxCisgICAgQnJlYWtwb2ludCAxIGlzIG5vdyB1bmNvbmRpdGlvbmFsLgorICAgIChQZGIpIGVuYWJsZSAxCisgICAgKFBkYikgY2xlYXIgMQorICAgIERlbGV0ZWQgYnJlYWtwb2ludCAxCisgICAgKFBkYikgY29tbWFuZHMgMgorICAgIChjb20pIHByaW50IDQyCisgICAgKGNvbSkgZW5kCisgICAgKFBkYikgY29udGludWUKKyAgICAxCisgICAgNDIKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT4oNCl0ZXN0X2Z1bmN0aW9uKCkKKyAgICAtPiBwcmludCgyKQorICAgIChQZGIpIGNsZWFyCisgICAgQ2xlYXIgYWxsIGJyZWFrcz8geQorICAgIChQZGIpIHRicmVhayA1CisgICAgQnJlYWtwb2ludCA0IGF0IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfYnJlYWtwb2ludF9jb21tYW5kc1swXT46NQorICAgIChQZGIpIGNvbnRpbnVlCisgICAgMgorICAgIERlbGV0ZWQgYnJlYWtwb2ludCA0CisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2JyZWFrcG9pbnRfY29tbWFuZHNbMF0+KDUpdGVzdF9mdW5jdGlvbigpCisgICAgLT4gcHJpbnQoMykKKyAgICAoUGRiKSBicmVhaworICAgIChQZGIpIGNvbnRpbnVlCisgICAgMworICAgIDQKKyAgICAiIiIKKworCitkZWYgdGVzdF9wZGJfc2tpcF9tb2R1bGVzKCk6CisgICAgIiIiVGhpcyBpbGx1c3RyYXRlcyB0aGUgc2ltcGxlIGNhc2Ugb2YgbW9kdWxlIHNraXBwaW5nLgorCisgICAgPj4+IGRlZiBza2lwX21vZHVsZSgpOgorICAgIC4uLiAgICAgaW1wb3J0IHN0cmluZworICAgIC4uLiAgICAgaW1wb3J0IHBkYjsgcGRiLlBkYihza2lwPVsnc3RyaW5nKiddKS5zZXRfdHJhY2UoKQorICAgIC4uLiAgICAgc3RyaW5nLmxvd2VyKCdGT08nKQorCisgICAgPj4+IHdpdGggUGRiVGVzdElucHV0KFsKKyAgICAuLi4gICAgICdzdGVwJywKKyAgICAuLi4gICAgICdjb250aW51ZScsCisgICAgLi4uIF0pOgorICAgIC4uLiAgICAgc2tpcF9tb2R1bGUoKQorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9za2lwX21vZHVsZXNbMF0+KDQpc2tpcF9tb2R1bGUoKQorICAgIC0+IHN0cmluZy5sb3dlcignRk9PJykKKyAgICAoUGRiKSBzdGVwCisgICAgLS1SZXR1cm4tLQorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9za2lwX21vZHVsZXNbMF0+KDQpc2tpcF9tb2R1bGUoKS0+Tm9uZQorICAgIC0+IHN0cmluZy5sb3dlcignRk9PJykKKyAgICAoUGRiKSBjb250aW51ZQorICAgICIiIgorCisKKyMgTW9kdWxlIGZvciB0ZXN0aW5nIHNraXBwaW5nIG9mIG1vZHVsZSB0aGF0IG1ha2VzIGEgY2FsbGJhY2sKK21vZCA9IGltcC5uZXdfbW9kdWxlKCdtb2R1bGVfdG9fc2tpcCcpCitleGVjICdkZWYgZm9vX3BvbnkoY2FsbGJhY2spOiB4ID0gMTsgY2FsbGJhY2soKTsgcmV0dXJuIE5vbmUnIGluIG1vZC5fX2RpY3RfXworCisKK2RlZiB0ZXN0X3BkYl9za2lwX21vZHVsZXNfd2l0aF9jYWxsYmFjaygpOgorICAgICIiIlRoaXMgaWxsdXN0cmF0ZXMgc2tpcHBpbmcgb2YgbW9kdWxlcyB0aGF0IGNhbGwgaW50byBvdGhlciBjb2RlLgorCisgICAgPj4+IGRlZiBza2lwX21vZHVsZSgpOgorICAgIC4uLiAgICAgZGVmIGNhbGxiYWNrKCk6CisgICAgLi4uICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAuLi4gICAgIGltcG9ydCBwZGI7IHBkYi5QZGIoc2tpcD1bJ21vZHVsZV90b19za2lwKiddKS5zZXRfdHJhY2UoKQorICAgIC4uLiAgICAgbW9kLmZvb19wb255KGNhbGxiYWNrKQorCisgICAgPj4+IHdpdGggUGRiVGVzdElucHV0KFsKKyAgICAuLi4gICAgICdzdGVwJywKKyAgICAuLi4gICAgICdzdGVwJywKKyAgICAuLi4gICAgICdzdGVwJywKKyAgICAuLi4gICAgICdzdGVwJywKKyAgICAuLi4gICAgICdzdGVwJywKKyAgICAuLi4gICAgICdjb250aW51ZScsCisgICAgLi4uIF0pOgorICAgIC4uLiAgICAgc2tpcF9tb2R1bGUoKQorICAgIC4uLiAgICAgcGFzcyAgIyBwcm92aWRlcyBzb21ldGhpbmcgdG8gInN0ZXAiIHRvCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc193aXRoX2NhbGxiYWNrWzBdPig1KXNraXBfbW9kdWxlKCkKKyAgICAtPiBtb2QuZm9vX3BvbnkoY2FsbGJhY2spCisgICAgKFBkYikgc3RlcAorICAgIC0tQ2FsbC0tCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc193aXRoX2NhbGxiYWNrWzBdPigyKWNhbGxiYWNrKCkKKyAgICAtPiBkZWYgY2FsbGJhY2soKToKKyAgICAoUGRiKSBzdGVwCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc193aXRoX2NhbGxiYWNrWzBdPigzKWNhbGxiYWNrKCkKKyAgICAtPiByZXR1cm4gTm9uZQorICAgIChQZGIpIHN0ZXAKKyAgICAtLVJldHVybi0tCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc193aXRoX2NhbGxiYWNrWzBdPigzKWNhbGxiYWNrKCktPk5vbmUKKyAgICAtPiByZXR1cm4gTm9uZQorICAgIChQZGIpIHN0ZXAKKyAgICAtLVJldHVybi0tCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX3NraXBfbW9kdWxlc193aXRoX2NhbGxiYWNrWzBdPig1KXNraXBfbW9kdWxlKCktPk5vbmUKKyAgICAtPiBtb2QuZm9vX3BvbnkoY2FsbGJhY2spCisgICAgKFBkYikgc3RlcAorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9za2lwX21vZHVsZXNfd2l0aF9jYWxsYmFja1sxXT4oMTApPG1vZHVsZT4oKQorICAgIC0+IHBhc3MgICMgcHJvdmlkZXMgc29tZXRoaW5nIHRvICJzdGVwIiB0bworICAgIChQZGIpIGNvbnRpbnVlCisgICAgIiIiCisKKworZGVmIHRlc3RfcGRiX2NvbnRpbnVlX2luX2JvdHRvbWZyYW1lKCk6CisgICAgIiIiVGVzdCB0aGF0ICJjb250aW51ZSIgYW5kICJuZXh0IiB3b3JrIHByb3Blcmx5IGluIGJvdHRvbSBmcmFtZSAoaXNzdWUgIzUyOTQpLgorCisgICAgPj4+IGRlZiB0ZXN0X2Z1bmN0aW9uKCk6CisgICAgLi4uICAgICBpbXBvcnQgcGRiLCBzeXM7IGluc3QgPSBwZGIuUGRiKCkKKyAgICAuLi4gICAgIGluc3Quc2V0X3RyYWNlKCkKKyAgICAuLi4gICAgIGluc3QuYm90ZnJhbWUgPSBzeXMuX2dldGZyYW1lKCkgICMgaGFja2VyeSB0byBnZXQgdGhlIHJpZ2h0IGJvdGZyYW1lCisgICAgLi4uICAgICBwcmludCgxKQorICAgIC4uLiAgICAgcHJpbnQoMikKKyAgICAuLi4gICAgIHByaW50KDMpCisgICAgLi4uICAgICBwcmludCg0KQorCisgICAgRmlyc3QsIG5lZWQgdG8gY2xlYXIgYmRiIHN0YXRlIHRoYXQgbWlnaHQgYmUgbGVmdCBvdmVyIGZyb20gcHJldmlvdXMgdGVzdHMuCisgICAgT3RoZXJ3aXNlLCB0aGUgbmV3IGJyZWFrcG9pbnRzIG1pZ2h0IGdldCBhc3NpZ25lZCBkaWZmZXJlbnQgbnVtYmVycy4KKworICAgID4+PiBmcm9tIGJkYiBpbXBvcnQgQnJlYWtwb2ludAorICAgID4+PiBCcmVha3BvaW50Lm5leHQgPSAxCisgICAgPj4+IEJyZWFrcG9pbnQuYnBsaXN0ID0ge30KKyAgICA+Pj4gQnJlYWtwb2ludC5icGJ5bnVtYmVyID0gW05vbmVdCisKKyAgICA+Pj4gd2l0aCBQZGJUZXN0SW5wdXQoWworICAgIC4uLiAgICAgJ25leHQnLAorICAgIC4uLiAgICAgJ2JyZWFrIDcnLAorICAgIC4uLiAgICAgJ2NvbnRpbnVlJywKKyAgICAuLi4gICAgICduZXh0JywKKyAgICAuLi4gICAgICdjb250aW51ZScsCisgICAgLi4uICAgICAnY29udGludWUnLAorICAgIC4uLiBdKToKKyAgICAuLi4gICAgdGVzdF9mdW5jdGlvbigpCisgICAgPiA8ZG9jdGVzdCB0ZXN0LnRlc3RfcGRiLnRlc3RfcGRiX2NvbnRpbnVlX2luX2JvdHRvbWZyYW1lWzBdPig0KXRlc3RfZnVuY3Rpb24oKQorICAgIC0+IGluc3QuYm90ZnJhbWUgPSBzeXMuX2dldGZyYW1lKCkgICMgaGFja2VyeSB0byBnZXQgdGhlIHJpZ2h0IGJvdGZyYW1lCisgICAgKFBkYikgbmV4dAorICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9jb250aW51ZV9pbl9ib3R0b21mcmFtZVswXT4oNSl0ZXN0X2Z1bmN0aW9uKCkKKyAgICAtPiBwcmludCgxKQorICAgIChQZGIpIGJyZWFrIDcKKyAgICBCcmVha3BvaW50IDEgYXQgPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9jb250aW51ZV9pbl9ib3R0b21mcmFtZVswXT46NworICAgIChQZGIpIGNvbnRpbnVlCisgICAgMQorICAgIDIKKyAgICA+IDxkb2N0ZXN0IHRlc3QudGVzdF9wZGIudGVzdF9wZGJfY29udGludWVfaW5fYm90dG9tZnJhbWVbMF0+KDcpdGVzdF9mdW5jdGlvbigpCisgICAgLT4gcHJpbnQoMykKKyAgICAoUGRiKSBuZXh0CisgICAgMworICAgID4gPGRvY3Rlc3QgdGVzdC50ZXN0X3BkYi50ZXN0X3BkYl9jb250aW51ZV9pbl9ib3R0b21mcmFtZVswXT4oOCl0ZXN0X2Z1bmN0aW9uKCkKKyAgICAtPiBwcmludCg0KQorICAgIChQZGIpIGNvbnRpbnVlCisgICAgNAorICAgICIiIgorCitjbGFzcyBNb2R1bGVJbml0VGVzdGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ZpbGVuYW1lX2NvcnJlY3Qoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJbiBpc3N1ZSA3NzUwLCBpdCB3YXMgZm91bmQgdGhhdCBpZiB0aGUgZmlsZW5hbWUgaGFzIGEgc2VxdWVuY2UgdGhhdAorICAgICAgICByZXNvbHZlcyB0byBhbiBlc2NhcGUgY2hhcmFjdGVyIGluIGEgUHl0aG9uIHN0cmluZyAoc3VjaCBhcyBcdCksIGl0CisgICAgICAgIHdpbGwgYmUgdHJlYXRlZCBhcyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuCisgICAgICAgICIiIgorICAgICAgICAjIHRoZSB0ZXN0X2ZuIG11c3QgY29udGFpbiBzb21ldGhpbmcgbGlrZSBcdAorICAgICAgICAjIG9uIFdpbmRvd3MsIHRoaXMgd2lsbCBjcmVhdGUgJ3Rlc3RfbW9kLnB5JyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCisgICAgICAgICMgb24gVW5peCwgdGhpcyB3aWxsIGNyZWF0ZSAnLlx0ZXN0X21vZC5weScgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorICAgICAgICB0ZXN0X2ZuID0gJy5cXHRlc3RfbW9kLnB5JworICAgICAgICBjb2RlID0gJ3ByaW50KCJ0ZXN0aW5nIHBkYiIpJworICAgICAgICB3aXRoIG9wZW4odGVzdF9mbiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShjb2RlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCB0ZXN0X2ZuKQorICAgICAgICBjbWQgPSBbc3lzLmV4ZWN1dGFibGUsICctbScsICdwZGInLCB0ZXN0X2ZuLF0KKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oY21kLAorICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCwKKyAgICAgICAgICAgICkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwcm9jLmNvbW11bmljYXRlKCdxdWl0XG4nKQorICAgICAgICBzZWxmLmFzc2VydEluKGNvZGUsIHN0ZG91dCwgInBkYiBtdW5nZWQgdGhlIGZpbGVuYW1lIikKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3BkYgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X3BkYiwgdmVyYm9zaXR5PVRydWUpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgUGRiVGVzdENhc2UsCisgICAgICAgIE1vZHVsZUluaXRUZXN0ZXIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZGIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTA1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BkYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZGIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTA1NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlZXBob2xlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlZXBob2xlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA1ZjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5CkBAIC0wLDAgKzEsMjQ0IEBACitpbXBvcnQgZGlzCitpbXBvcnQgc3lzCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCB1bml0dGVzdAorCitkZWYgZGlzYXNzZW1ibGUoZnVuYyk6CisgICAgZiA9IFN0cmluZ0lPKCkKKyAgICB0bXAgPSBzeXMuc3Rkb3V0CisgICAgc3lzLnN0ZG91dCA9IGYKKyAgICBkaXMuZGlzKGZ1bmMpCisgICAgc3lzLnN0ZG91dCA9IHRtcAorICAgIHJlc3VsdCA9IGYuZ2V0dmFsdWUoKQorICAgIGYuY2xvc2UoKQorICAgIHJldHVybiByZXN1bHQKKworZGVmIGRpc19zaW5nbGUobGluZSk6CisgICAgcmV0dXJuIGRpc2Fzc2VtYmxlKGNvbXBpbGUobGluZSwgJycsICdzaW5nbGUnKSkKKworY2xhc3MgVGVzdFRyYW5mb3Jtcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF91bm90KHNlbGYpOgorICAgICAgICAjIFVOQVJZX05PVCBQT1BfSlVNUF9JRl9GQUxTRSAgLS0+ICBQT1BfSlVNUF9JRl9UUlVFCisgICAgICAgIGRlZiB1bm90KHgpOgorICAgICAgICAgICAgaWYgbm90IHggPT0gMjoKKyAgICAgICAgICAgICAgICBkZWwgeAorICAgICAgICBhc20gPSBkaXNhc3NlbWJsZSh1bm90KQorICAgICAgICBmb3IgZWxlbSBpbiAoJ1VOQVJZX05PVCcsICdQT1BfSlVNUF9JRl9GQUxTRScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihlbGVtLCBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1BPUF9KVU1QX0lGX1RSVUUnLCBhc20pCisKKyAgICBkZWYgdGVzdF9lbGltX2ludmVyc2lvbl9vZl9pc19vcl9pbihzZWxmKToKKyAgICAgICAgZm9yIGxpbmUsIGVsZW0gaW4gKAorICAgICAgICAgICAgKCdub3QgYSBpcyBiJywgJyhpcyBub3QpJywpLAorICAgICAgICAgICAgKCdub3QgYSBpbiBiJywgJyhub3QgaW4pJywpLAorICAgICAgICAgICAgKCdub3QgYSBpcyBub3QgYicsICcoaXMpJywpLAorICAgICAgICAgICAgKCdub3QgYSBub3QgaW4gYicsICcoaW4pJywpLAorICAgICAgICAgICAgKToKKyAgICAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUobGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZWxlbSwgYXNtKQorCisgICAgZGVmIHRlc3Rfbm9uZV9hc19jb25zdGFudChzZWxmKToKKyAgICAgICAgIyBMT0FEX0dMT0JBTCBOb25lICAtLT4gIExPQURfQ09OU1QgTm9uZQorICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIGZvciBlbGVtIGluICgnTE9BRF9HTE9CQUwnLCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGVsZW0sIGFzbSkKKyAgICAgICAgZm9yIGVsZW0gaW4gKCdMT0FEX0NPTlNUJywgJyhOb25lKScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbGVtLCBhc20pCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAnQWRkaW5nIGEgZG9jc3RyaW5nIG1hZGUgdGhpcyB0ZXN0IGZhaWwgaW4gUHkyLjUuMCcKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0xPQURfQ09OU1QnLCBkaXNhc3NlbWJsZShmKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignTE9BRF9HTE9CQUwnLCBkaXNhc3NlbWJsZShmKSkKKworICAgIGRlZiB0ZXN0X3doaWxlX29uZShzZWxmKToKKyAgICAgICAgIyBTa2lwIG92ZXI6ICBMT0FEX0NPTlNUIHRydWVjb25zdCAgUE9QX0pVTVBfSUZfRkFMU0UgeHgKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmV0dXJuIGxpc3QKKyAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKKyAgICAgICAgZm9yIGVsZW0gaW4gKCdMT0FEX0NPTlNUJywgJ1BPUF9KVU1QX0lGX0ZBTFNFJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGVsZW0sIGFzbSkKKyAgICAgICAgZm9yIGVsZW0gaW4gKCdKVU1QX0FCU09MVVRFJywpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbGVtLCBhc20pCisKKyAgICBkZWYgdGVzdF9wYWNrX3VucGFjayhzZWxmKToKKyAgICAgICAgZm9yIGxpbmUsIGVsZW0gaW4gKAorICAgICAgICAgICAgKCdhLCA9IGEsJywgJ0xPQURfQ09OU1QnLCksCisgICAgICAgICAgICAoJ2EsIGIgPSBhLCBiJywgJ1JPVF9UV08nLCksCisgICAgICAgICAgICAoJ2EsIGIsIGMgPSBhLCBiLCBjJywgJ1JPVF9USFJFRScsKSwKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0JVSUxEX1RVUExFJywgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignVU5QQUNLX1RVUExFJywgYXNtKQorCisgICAgZGVmIHRlc3RfZm9sZGluZ19vZl90dXBsZXNfb2ZfY29uc3RhbnRzKHNlbGYpOgorICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCisgICAgICAgICAgICAoJ2EgPSAxLDIsMycsICcoKDEsIDIsIDMpKScpLAorICAgICAgICAgICAgKCcoImEiLCJiIiwiYyIpJywgIigoJ2EnLCAnYicsICdjJykpIiksCisgICAgICAgICAgICAoJ2EsYixjID0gMSwyLDMnLCAnKCgxLCAyLCAzKSknKSwKKyAgICAgICAgICAgICgnKE5vbmUsIDEsIE5vbmUpJywgJygoTm9uZSwgMSwgTm9uZSkpJyksCisgICAgICAgICAgICAoJygoMSwgMiksIDMsIDQpJywgJygoKDEsIDIpLCAzLCA0KSknKSwKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0JVSUxEX1RVUExFJywgYXNtKQorCisgICAgICAgICMgQnVnIDEwNTM4MTk6ICBUdXBsZSBvZiBjb25zdGFudHMgbWlzaWRlbnRpZmllZCB3aGVuIHByZXNlbnRlZCB3aXRoOgorICAgICAgICAjIC4gLiAuIG9wY29kZV93aXRoX2FyZyAxMDAgICB1bmFyeV9vcGNvZGUgICBCVUlMRF9UVVBMRSAxICAuIC4gLgorICAgICAgICAjIFRoZSBmb2xsb3dpbmcgd291bGQgc2VnZmF1bHQgdXBvbiBjb21waWxhdGlvbgorICAgICAgICBkZWYgY3JhdGVyKCk6CisgICAgICAgICAgICAoflsKKyAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCisgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwKKyAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCisgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwKKyAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksCisgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwKKyAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LAorICAgICAgICAgICAgXSwpCisKKyAgICBkZWYgdGVzdF9mb2xkaW5nX29mX2Jpbm9wc19vbl9jb25zdGFudHMoc2VsZik6CisgICAgICAgIGZvciBsaW5lLCBlbGVtIGluICgKKyAgICAgICAgICAgICgnYSA9IDIrMys0JywgJyg5KScpLCAgICAgICAgICAgICAgICAgICAjIGNoYWluZWQgZm9sZAorICAgICAgICAgICAgKCciQCIqNCcsICIoJ0BAQEAnKSIpLCAgICAgICAgICAgICAgICAgICMgY2hlY2sgc3RyaW5nIG9wcworICAgICAgICAgICAgKCdhPSJhYmMiICsgImRlZiInLCAiKCdhYmNkZWYnKSIpLCAgICAgICMgY2hlY2sgc3RyaW5nIG9wcworICAgICAgICAgICAgKCdhID0gMyoqNCcsICcoODEpJyksICAgICAgICAgICAgICAgICAgICMgYmluYXJ5IHBvd2VyCisgICAgICAgICAgICAoJ2EgPSAzKjQnLCAnKDEyKScpLCAgICAgICAgICAgICAgICAgICAgIyBiaW5hcnkgbXVsdGlwbHkKKyAgICAgICAgICAgICgnYSA9IDEzLy80JywgJygzKScpLCAgICAgICAgICAgICAgICAgICAjIGJpbmFyeSBmbG9vciBkaXZpZGUKKyAgICAgICAgICAgICgnYSA9IDE0JTQnLCAnKDIpJyksICAgICAgICAgICAgICAgICAgICAjIGJpbmFyeSBtb2R1bG8KKyAgICAgICAgICAgICgnYSA9IDIrMycsICcoNSknKSwgICAgICAgICAgICAgICAgICAgICAjIGJpbmFyeSBhZGQKKyAgICAgICAgICAgICgnYSA9IDEzLTQnLCAnKDkpJyksICAgICAgICAgICAgICAgICAgICAjIGJpbmFyeSBzdWJ0cmFjdAorICAgICAgICAgICAgKCdhID0gKDEyLDEzKVsxXScsICcoMTMpJyksICAgICAgICAgICAgICMgYmluYXJ5IHN1YnNjcgorICAgICAgICAgICAgKCdhID0gMTMgPDwgMicsICcoNTIpJyksICAgICAgICAgICAgICAgICMgYmluYXJ5IGxzaGlmdAorICAgICAgICAgICAgKCdhID0gMTMgPj4gMicsICcoMyknKSwgICAgICAgICAgICAgICAgICMgYmluYXJ5IHJzaGlmdAorICAgICAgICAgICAgKCdhID0gMTMgJiA3JywgJyg1KScpLCAgICAgICAgICAgICAgICAgICMgYmluYXJ5IGFuZAorICAgICAgICAgICAgKCdhID0gMTMgXiA3JywgJygxMCknKSwgICAgICAgICAgICAgICAgICMgYmluYXJ5IHhvcgorICAgICAgICAgICAgKCdhID0gMTMgfCA3JywgJygxNSknKSwgICAgICAgICAgICAgICAgICMgYmluYXJ5IG9yCisgICAgICAgICAgICApOgorICAgICAgICAgICAgYXNtID0gZGlzX3NpbmdsZShsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbGVtLCBhc20sIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0JJTkFSWV8nLCBhc20pCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB1bmZvbGRhYmxlcyBhcmUgc2tpcHBlZAorICAgICAgICBhc20gPSBkaXNfc2luZ2xlKCdhPTIrImIiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignKDIpJywgYXNtKQorICAgICAgICBzZWxmLmFzc2VydEluKCIoJ2InKSIsIGFzbSkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGxhcmdlIHNlcXVlbmNlcyBkbyBub3QgcmVzdWx0IGZyb20gZm9sZGluZworICAgICAgICBhc20gPSBkaXNfc2luZ2xlKCdhPSJ4IioxMDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignKDEwMDApJywgYXNtKQorCisgICAgZGVmIHRlc3RfYmluYXJ5X3N1YnNjcl9vbl91bmljb2RlKHNlbGYpOgorICAgICAgICAjIHVuaWNvZGUgc3RyaW5ncyBkb24ndCBnZXQgb3B0aW1pemVkCisgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ3UiZm9vIlswXScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIih1J2YnKSIsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQklOQVJZX1NVQlNDUicsIGFzbSkKKyAgICAgICAgYXNtID0gZGlzX3NpbmdsZSgndSJcdTAwNjFcdWZmZmYiWzFdJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiKHUnXFx1ZmZmZicpIiwgYXNtKQorICAgICAgICBzZWxmLmFzc2VydEluKCdCSU5BUllfU1VCU0NSJywgYXNtKQorCisgICAgICAgICMgb3V0IG9mIHJhbmdlCisgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ3UiZnV1IlsxMF0nKQorICAgICAgICBzZWxmLmFzc2VydEluKCdCSU5BUllfU1VCU0NSJywgYXNtKQorICAgICAgICAjIG5vbi1CTVAgY2hhciAoc2VlICM1MDU3KQorICAgICAgICBhc20gPSBkaXNfc2luZ2xlKCd1IlxVMDAwMTIzNDUiWzBdJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQklOQVJZX1NVQlNDUicsIGFzbSkKKyAgICAgICAgYXNtID0gZGlzX3NpbmdsZSgndSJcVTAwMDEyMzQ1YWJjZGVmIlszXScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0JJTkFSWV9TVUJTQ1InLCBhc20pCisKKworICAgIGRlZiB0ZXN0X2ZvbGRpbmdfb2ZfdW5hcnlvcHNfb25fY29uc3RhbnRzKHNlbGYpOgorICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCisgICAgICAgICAgICAoJ2AxYCcsICIoJzEnKSIpLCAgICAgICAgICAgICAgICAgICAgICAgIyB1bmFyeSBjb252ZXJ0CisgICAgICAgICAgICAoJy0wLjUnLCAnKC0wLjUpJyksICAgICAgICAgICAgICAgICAgICAgIyB1bmFyeSBuZWdhdGl2ZQorICAgICAgICAgICAgKCd+LTInLCAnKDEpJyksICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5hcnkgaW52ZXJ0CisgICAgICAgICk6CisgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGVsZW0sIGFzbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbignVU5BUllfJywgYXNtKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgdW5mb2xkYWJsZXMgYXJlIHNraXBwZWQKKyAgICAgICAgZm9yIGxpbmUsIGVsZW0gaW4gKAorICAgICAgICAgICAgKCctImFiYyInLCAiKCdhYmMnKSIpLCAgICAgICAgICAgICAgICAgICMgdW5hcnkgbmVnYXRpdmUKKyAgICAgICAgICAgICgnfiJhYmMiJywgIignYWJjJykiKSwgICAgICAgICAgICAgICAgICAjIHVuYXJ5IGludmVydAorICAgICAgICApOgorICAgICAgICAgICAgYXNtID0gZGlzX3NpbmdsZShsaW5lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihlbGVtLCBhc20sIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1VOQVJZXycsIGFzbSkKKworICAgIGRlZiB0ZXN0X2VsaW1fZXh0cmFfcmV0dXJuKHNlbGYpOgorICAgICAgICAjIFJFVFVSTiBMT0FEX0NPTlNUIE5vbmUgUkVUVVJOICAtLT4gIFJFVFVSTgorICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0xPQURfQ09OU1QnLCBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJyhOb25lKScsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDEpCisKKyAgICBkZWYgdGVzdF9lbGltX2p1bXBfdG9fcmV0dXJuKHNlbGYpOgorICAgICAgICAjIEpVTVBfRk9SV0FSRCB0byBSRVRVUk4gLS0+ICBSRVRVUk4KKyAgICAgICAgZGVmIGYoY29uZCwgdHJ1ZV92YWx1ZSwgZmFsc2VfdmFsdWUpOgorICAgICAgICAgICAgcmV0dXJuIHRydWVfdmFsdWUgaWYgY29uZCBlbHNlIGZhbHNlX3ZhbHVlCisgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0pVTVBfRk9SV0FSRCcsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignSlVNUF9BQlNPTFVURScsIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDIpCisKKyAgICBkZWYgdGVzdF9lbGltX2p1bXBfYWZ0ZXJfcmV0dXJuMShzZWxmKToKKyAgICAgICAgIyBFbGltaW5hdGUgZGVhZCBjb2RlOiBqdW1wcyBpbW1lZGlhdGVseSBhZnRlciByZXR1cm5zIGNhbid0IGJlIHJlYWNoZWQKKyAgICAgICAgZGVmIGYoY29uZDEsIGNvbmQyKToKKyAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gMQorICAgICAgICAgICAgaWYgY29uZDI6IHJldHVybiAyCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiAzCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gNAorICAgICAgICAgICAgICAgIHJldHVybiA1CisgICAgICAgICAgICByZXR1cm4gNgorICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdKVU1QX0ZPUldBUkQnLCBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ0pVTVBfQUJTT0xVVEUnLCBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCA2KQorCisgICAgZGVmIHRlc3RfZWxpbV9qdW1wX2FmdGVyX3JldHVybjIoc2VsZik6CisgICAgICAgICMgRWxpbWluYXRlIGRlYWQgY29kZToganVtcHMgaW1tZWRpYXRlbHkgYWZ0ZXIgcmV0dXJucyBjYW4ndCBiZSByZWFjaGVkCisgICAgICAgIGRlZiBmKGNvbmQxLCBjb25kMik6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gNAorICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdKVU1QX0ZPUldBUkQnLCBhc20pCisgICAgICAgICMgVGhlcmUgc2hvdWxkIGJlIG9uZSBqdW1wIGZvciB0aGUgd2hpbGUgbG9vcC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnSlVNUF9BQlNPTFVURScpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMikKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgaW1wb3J0IHN5cworICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisgICAgdGVzdF9jbGFzc2VzID0gKFRlc3RUcmFuZm9ybXMsKQorCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLCBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICAgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY291bnRzKSk6CisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgICAgIHByaW50IGNvdW50cworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZWVwaG9sZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI0YmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZWVwaG9sZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzI0YmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNDcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNDcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIzZDMzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI0Ny5weQpAQCAtMCwwICsxLDc0IEBACisiIiIKK1Rlc3Qgc3VpdGUgdG8gY2hlY2sgY29tcGlsYW5jZSB3aXRoIFBFUCAyNDcsIHRoZSBzdGFuZGFyZCBBUEkKK2ZvciBoYXNoaW5nIGFsZ29yaXRobXMKKyIiIgorCitpbXBvcnQgd2FybmluZ3MKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLCAndGhlIG1kNSBtb2R1bGUgaXMgZGVwcmVjYXRlZC4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKK3dhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCdpZ25vcmUnLCAndGhlIHNoYSBtb2R1bGUgaXMgZGVwcmVjYXRlZC4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKworaW1wb3J0IGhtYWMKK2ltcG9ydCBtZDUKK2ltcG9ydCBzaGEKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBQZXAyNDdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBjaGVja19tb2R1bGUoc2VsZiwgbW9kdWxlLCBrZXk9Tm9uZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG1vZHVsZSwgJ2RpZ2VzdF9zaXplJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2R1bGUuZGlnZXN0X3NpemUgaXMgTm9uZSBvciBtb2R1bGUuZGlnZXN0X3NpemUgPiAwKQorCisgICAgICAgIGlmIG5vdCBrZXkgaXMgTm9uZToKKyAgICAgICAgICAgIG9iajEgPSBtb2R1bGUubmV3KGtleSkKKyAgICAgICAgICAgIG9iajIgPSBtb2R1bGUubmV3KGtleSwgJ3N0cmluZycpCisKKyAgICAgICAgICAgIGgxID0gbW9kdWxlLm5ldyhrZXksICdzdHJpbmcnKS5kaWdlc3QoKQorICAgICAgICAgICAgb2JqMyA9IG1vZHVsZS5uZXcoa2V5KQorICAgICAgICAgICAgb2JqMy51cGRhdGUoJ3N0cmluZycpCisgICAgICAgICAgICBoMiA9IG9iajMuZGlnZXN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9iajEgPSBtb2R1bGUubmV3KCkKKyAgICAgICAgICAgIG9iajIgPSBtb2R1bGUubmV3KCdzdHJpbmcnKQorCisgICAgICAgICAgICBoMSA9IG1vZHVsZS5uZXcoJ3N0cmluZycpLmRpZ2VzdCgpCisgICAgICAgICAgICBvYmozID0gbW9kdWxlLm5ldygpCisgICAgICAgICAgICBvYmozLnVwZGF0ZSgnc3RyaW5nJykKKyAgICAgICAgICAgIGgyID0gb2JqMy5kaWdlc3QoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaDEsIGgyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9iajEsICdkaWdlc3Rfc2l6ZScpKQorCisgICAgICAgIGlmIG5vdCBtb2R1bGUuZGlnZXN0X3NpemUgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqMS5kaWdlc3Rfc2l6ZSwgbW9kdWxlLmRpZ2VzdF9zaXplKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqMS5kaWdlc3Rfc2l6ZSwgbGVuKGgxKSkKKyAgICAgICAgb2JqMS51cGRhdGUoJ3N0cmluZycpCisgICAgICAgIG9ial9jb3B5ID0gb2JqMS5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoxLmRpZ2VzdCgpLCBvYmpfY29weS5kaWdlc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmoxLmhleGRpZ2VzdCgpLCBvYmpfY29weS5oZXhkaWdlc3QoKSkKKworICAgICAgICBkaWdlc3QsIGhleGRpZ2VzdCA9IG9iajEuZGlnZXN0KCksIG9iajEuaGV4ZGlnZXN0KCkKKyAgICAgICAgaGQyID0gIiIKKyAgICAgICAgZm9yIGJ5dGUgaW4gZGlnZXN0OgorICAgICAgICAgICAgaGQyICs9ICclMDJ4JyAlIG9yZChieXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhkMiwgaGV4ZGlnZXN0KQorCisgICAgZGVmIHRlc3RfbWQ1KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX21vZHVsZShtZDUpCisKKyAgICBkZWYgdGVzdF9zaGEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbW9kdWxlKHNoYSkKKworICAgIGRlZiB0ZXN0X2htYWMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbW9kdWxlKGhtYWMsIGtleT0nYWJjJykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUGVwMjQ3VGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjQ3LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI0Ny5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwYTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI0Ny5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjQ3LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI0Ny5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAwYTUwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI0Ny5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjYzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjYzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODY0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHkKQEAgLTAsMCArMSw0OCBAQAorIyAtKi0gY29kaW5nOiBrb2k4LXIgLSotCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgUEVQMjYzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9wZXAyNjMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1IvDJ1M/OIi5lbmNvZGUoInV0Zi04IiksCisgICAgICAgICAgICAnXHhkMFx4OWZceGQwXHhiOFx4ZDFceDgyXHhkMFx4YmVceGQwXHhiZCcKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSJc8CIuZW5jb2RlKCJ1dGYtOCIpLAorICAgICAgICAgICAgJ1xcXHhkMFx4OWYnCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGVzdHJpbmcoc2VsZik6CisgICAgICAgICMgc2VlICMxODgyCisgICAgICAgIGMgPSBjb21waWxlKCJcbiMgY29kaW5nOiB1dGYtOFxudSA9IHUnXHhjM1x4YjMnXG4iLCAiZHVtbXkiLCAiZXhlYyIpCisgICAgICAgIGQgPSB7fQorICAgICAgICBleGVjIGMgaW4gZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ3UnXSwgdSdceGYzJykKKworCisgICAgZGVmIHRlc3RfaXNzdWUzMjk3KHNlbGYpOgorICAgICAgICBjID0gY29tcGlsZSgiYSwgYiA9ICdcVTAwMDEwMTBGJywgJ1xcVTAwMDEwMTBGJyIsICJkdW1teSIsICJleGVjIikKKyAgICAgICAgZCA9IHt9CisgICAgICAgIGV4ZWMoYywgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydhJ10sIGRbJ2InXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZFsnYSddKSwgbGVuKGRbJ2InXSkpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTc4MjAoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgY2hlY2tfYm9tKCkgcmVzdG9yZXMgYWxsIGJ5dGVzIGluIHRoZSByaWdodCBvcmRlciBpZgorICAgICAgICAjIGNoZWNrX2JvbSgpIGZhaWxzIGluIHB5ZGVidWcgbW9kZTogYSBidWZmZXIgc3RhcnRzIHdpdGggdGhlIGZpcnN0CisgICAgICAgICMgYnl0ZSBvZiBhIHZhbGlkIEJPTSwgYnV0IG5leHQgYnl0ZXMgYXJlIGRpZmZlcmVudAorCisgICAgICAgICMgb25lIGJ5dGUgaW4gY29tbW9uIHdpdGggdGhlIFVURi0xNi1MRSBCT00KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsICdceGZmXHgyMCcpCisKKyAgICAgICAgIyB0d28gYnl0ZXMgaW4gY29tbW9uIHdpdGggdGhlIFVURi04IEJPTQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgJ1x4ZWZceGJiXHgyMCcpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBFUDI2M1Rlc3QpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjYzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU3MDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjYzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNjMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjYzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjU3MDFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjYzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNzcucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyNzcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiODJkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI3Ny5weQpAQCAtMCwwICsxLDIxMCBAQAorIyBUZXN0IHRoZSBVbmljb2RlIHZlcnNpb25zIG9mIG5vcm1hbCBmaWxlIGZ1bmN0aW9ucworIyBvcGVuLCBvcy5vcGVuLCBvcy5zdGF0LiBvcy5saXN0ZGlyLCBvcy5yZW5hbWUsIG9zLnJlbW92ZSwgb3MubWtkaXIsIG9zLmNoZGlyLCBvcy5ybWRpcgoraW1wb3J0IHN5cywgb3MsIHVuaXR0ZXN0Citmcm9tIHVuaWNvZGVkYXRhIGltcG9ydCBub3JtYWxpemUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ZpbGVuYW1lcyA9IFsKKyAgICAnMV9hYmMnLAorICAgIHUnMl9hc2NpaScsCisgICAgdSczX0dyXHhmY1x4ZGYtR290dCcsCisgICAgdSc0X1x1MDM5M1x1MDNiNVx1MDNiOVx1MDNhYy1cdTAzYzNcdTAzYjFcdTAzYzInLAorICAgIHUnNV9cdTA0MTdcdTA0MzRcdTA0NDBcdTA0MzBcdTA0MzJcdTA0NDFcdTA0NDJcdTA0MzJcdTA0NDNcdTA0MzlcdTA0NDJcdTA0MzUnLAorICAgIHUnNl9cdTMwNmJcdTMwN2RcdTMwOTMnLAorICAgIHUnN19cdTA1ZDRcdTA1ZTlcdTA1ZTdcdTA1ZTZcdTA1ZTVcdTA1ZTEnLAorICAgIHUnOF9cdTY2ZThcdTY2ZTlcdTY2ZWInLAorICAgIHUnOV9cdTY2ZThcdTA1ZTlcdTMwOTNcdTA0MzRcdTAzOTNceGRmJywKKyAgICAjIFNwZWNpZmljIGNvZGUgcG9pbnRzOiBmbiwgTkZDKGZuKSBhbmQgTkZLQyhmbikgYWxsIGRpZmZlcmVudHMKKyAgICB1JzEwX1x1MWZlZVx1MWZmZCcsCisgICAgXQorCisjIE1hYyBPUyBYIGRlY29tcG9zZXMgVW5pY29kZSBuYW1lcywgdXNpbmcgTm9ybWFsIEZvcm0gRC4KKyMgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vbWFjL2xpYnJhcnkvcWEvcWEyMDAxL3FhMTE3My5odG1sCisjICJIb3dldmVyLCBtb3N0IHZvbHVtZSBmb3JtYXRzIGRvIG5vdCBmb2xsb3cgdGhlIGV4YWN0IHNwZWNpZmljYXRpb24gZm9yCisjIHRoZXNlIG5vcm1hbCBmb3Jtcy4gIEZvciBleGFtcGxlLCBIRlMgUGx1cyB1c2VzIGEgdmFyaWFudCBvZiBOb3JtYWwgRm9ybSBECisjIGluIHdoaWNoIFUrMjAwMCB0aHJvdWdoIFUrMkZGRiwgVStGOTAwIHRocm91Z2ggVStGQUZGLCBhbmQgVSsyRjgwMCB0aHJvdWdoCisjIFUrMkZBRkYgYXJlIG5vdCBkZWNvbXBvc2VkLiIKK2lmIHN5cy5wbGF0Zm9ybSAhPSAnZGFyd2luJzoKKyAgICBmaWxlbmFtZXMuZXh0ZW5kKFsKKyAgICAgICAgIyBTcGVjaWZpYyBjb2RlIHBvaW50czogTkZDKGZuKSwgTkZEKGZuKSwgTkZLQyhmbikgYW5kIE5GS0QoZm4pIGFsbCBkaWZmZXJlbnRzCisgICAgICAgIHUnMTFfXHUwMzg1XHUwM2QzXHUwM2Q0JywKKyAgICAgICAgdScxMl9cdTAwYThcdTAzMDFcdTAzZDJcdTAzMDFcdTAzZDJcdTAzMDgnLCAgICAjID09IE5GRCh1J1x1MDM4NVx1MDNkM1x1MDNkNCcpCisgICAgICAgIHUnMTNfXHUwMDIwXHUwMzA4XHUwMzAxXHUwMzhlXHUwM2FiJywgICAgICAgICAgIyA9PSBORktDKHUnXHUwMzg1XHUwM2QzXHUwM2Q0JykKKyAgICAgICAgdScxNF9cdTFlOWJcdTFmYzFcdTFmY2RcdTFmY2VcdTFmY2ZcdTFmZGRcdTFmZGVcdTFmZGZcdTFmZWQnLAorCisgICAgICAgICMgU3BlY2lmaWMgY29kZSBwb2ludHM6IGZuLCBORkMoZm4pIGFuZCBORktDKGZuKSBhbGwgZGlmZmVyZW50cworICAgICAgICB1JzE1X1x1MWZlZVx1MWZmZFx1ZmFkMScsCisgICAgICAgIHUnMTZfXHUyMDAwXHUyMDAwXHUyMDAwQScsCisgICAgICAgIHUnMTdfXHUyMDAxXHUyMDAxXHUyMDAxQScsCisgICAgICAgIHUnMThfXHUyMDAzXHUyMDAzXHUyMDAzQScsICMgPT0gTkZDKHUnXHUyMDAxXHUyMDAxXHUyMDAxQScpCisgICAgICAgIHUnMTlfXHUwMDIwXHUwMDIwXHUwMDIwQScsICMgdSdcdTAwMjAnID09IHUnICcgPT0gTkZLQyh1J1x1MjAwMCcpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICBORktDKHUnXHUyMDAxJykgPT0gTkZLQyh1J1x1MjAwMycpCitdKQorCisKKyMgSXMgaXQgVW5pY29kZS1mcmllbmRseT8KK2lmIG5vdCBvcy5wYXRoLnN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzOgorICAgIGZzZW5jb2RpbmcgPSBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkgb3Igc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgdHJ5OgorICAgICAgICBmb3IgbmFtZSBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICBuYW1lLmVuY29kZShmc2VuY29kaW5nKQorICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJvbmx5IE5UKyBhbmQgc3lzdGVtcyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuaWNvZGUtZnJpZW5kbHkgZmlsZXN5c3RlbSBlbmNvZGluZyIpCisKKworIyBEZXN0cm95IGRpcmVjdG9yeSBkaXJuYW1lIGFuZCBhbGwgZmlsZXMgdW5kZXIgaXQsIHRvIG9uZSBsZXZlbC4KK2RlZiBkZWx0cmVlKGRpcm5hbWUpOgorICAgICMgRG9uJ3QgaGlkZSBsZWdpdGltYXRlIGVycm9yczogIGlmIG9uZSBvZiB0aGVzZSBzdWNrZXJzIGV4aXN0cywgaXQncworICAgICMgYW4gZXJyb3IgaWYgd2UgY2FuJ3QgcmVtb3ZlIGl0LgorICAgIGlmIG9zLnBhdGguZXhpc3RzKGRpcm5hbWUpOgorICAgICAgICAjIG11c3QgcGFzcyB1bmljb2RlIHRvIG9zLmxpc3RkaXIoKSBzbyB3ZSBnZXQgYmFjayB1bmljb2RlIHJlc3VsdHMuCisgICAgICAgIGZvciBmbmFtZSBpbiBvcy5saXN0ZGlyKHVuaWNvZGUoZGlybmFtZSkpOgorICAgICAgICAgICAgb3MudW5saW5rKG9zLnBhdGguam9pbihkaXJuYW1lLCBmbmFtZSkpCisgICAgICAgIG9zLnJtZGlyKGRpcm5hbWUpCisKKworY2xhc3MgVW5pY29kZUZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZmlsZXMgPSBzZXQoZmlsZW5hbWVzKQorICAgIG5vcm1hbF9mb3JtID0gTm9uZQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5ta2Rpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmlsZXMgPSBzZXQoKQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmZpbGVzOgorICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguam9pbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBzZWxmLm5vcm0obmFtZSkpCisgICAgICAgICAgICB3aXRoIG9wZW4obmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoKG5hbWUrJ1xuJykuZW5jb2RlKCJ1dGYtOCIpKQorICAgICAgICAgICAgb3Muc3RhdChuYW1lKQorICAgICAgICAgICAgZmlsZXMuYWRkKG5hbWUpCisgICAgICAgIHNlbGYuZmlsZXMgPSBmaWxlcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBkZWx0cmVlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICBkZWYgbm9ybShzZWxmLCBzKToKKyAgICAgICAgaWYgc2VsZi5ub3JtYWxfZm9ybSBhbmQgaXNpbnN0YW5jZShzLCB1bmljb2RlKToKKyAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUoc2VsZi5ub3JtYWxfZm9ybSwgcykKKyAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfYXBwbHlfZmFpbHVyZShzZWxmLCBmbiwgZmlsZW5hbWUsIGV4cGVjdGVkX2V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfZm5faW5fZXhjZXB0aW9uID0gVHJ1ZSk6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoZXhwZWN0ZWRfZXhjZXB0aW9uKSBhcyBjOgorICAgICAgICAgICAgZm4oZmlsZW5hbWUpCisgICAgICAgIGV4Y19maWxlbmFtZSA9IGMuZXhjZXB0aW9uLmZpbGVuYW1lCisgICAgICAgICMgdGhlICJmaWxlbmFtZSIgZXhjZXB0aW9uIGF0dHJpYnV0ZSBtYXkgYmUgZW5jb2RlZAorICAgICAgICBpZiBpc2luc3RhbmNlKGV4Y19maWxlbmFtZSwgc3RyKToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUuZW5jb2RlKHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkKKyAgICAgICAgaWYgY2hlY2tfZm5faW5fZXhjZXB0aW9uOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNfZmlsZW5hbWUsIGZpbGVuYW1lLCAiRnVuY3Rpb24gJyVzKCVyKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBiYWQgZmlsZW5hbWUgaW4gdGhlIGV4Y2VwdGlvbjogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZuLl9fbmFtZV9fLCBmaWxlbmFtZSwgZXhjX2ZpbGVuYW1lKSkKKworICAgIGRlZiB0ZXN0X2ZhaWx1cmVzKHNlbGYpOgorICAgICAgICAjIFBhc3Mgbm9uLWV4aXN0aW5nIFVuaWNvZGUgZmlsZW5hbWVzIGFsbCBvdmVyIHRoZSBwbGFjZS4KKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5maWxlczoKKyAgICAgICAgICAgIG5hbWUgPSAibm90XyIgKyBuYW1lCisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9wZW4sIG5hbWUsIElPRXJyb3IpCisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9zLnN0YXQsIG5hbWUsIE9TRXJyb3IpCisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9zLmNoZGlyLCBuYW1lLCBPU0Vycm9yKQorICAgICAgICAgICAgc2VsZi5fYXBwbHlfZmFpbHVyZShvcy5ybWRpciwgbmFtZSwgT1NFcnJvcikKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3MucmVtb3ZlLCBuYW1lLCBPU0Vycm9yKQorICAgICAgICAgICAgIyBsaXN0ZGlyIG1heSBhcHBlbmQgYSB3aWxkY2FyZCB0byB0aGUgZmlsZW5hbWUsIHNvIGRvbnQgY2hlY2sKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3MubGlzdGRpciwgbmFtZSwgT1NFcnJvciwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9vcGVuKHNlbGYpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmZpbGVzOgorICAgICAgICAgICAgZiA9IG9wZW4obmFtZSwgJ3cnKQorICAgICAgICAgICAgZi53cml0ZSgobmFtZSsnXG4nKS5lbmNvZGUoInV0Zi04IikpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnN0YXQobmFtZSkKKworICAgICMgU2tpcCB0aGUgdGVzdCBvbiBkYXJ3aW4sIGJlY2F1c2UgZGFyd2luIGRvZXMgbm9ybWFsaXplIHRoZSBmaWxlbmFtZSB0bworICAgICMgTkZEIChhIHZhcmlhbnQgb2YgVW5pY29kZSBORkQgZm9ybSkuIE5vcm1hbGl6ZSB0aGUgZmlsZW5hbWUgdG8gTkZDLCBORktDLAorICAgICMgTkZLRCBpbiBQeXRob24gaXMgdXNlbGVzcywgYmVjYXVzZSBkYXJ3aW4gd2lsbCBub3JtYWxpemUgaXQgbGF0ZXIgYW5kIHNvCisgICAgIyBvcGVuKCksIG9zLnN0YXQoKSwgZXRjLiBkb24ndCByYWlzZSBhbnkgZXhjZXB0aW9uLgorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLCAnaXJyZWxldmFudCB0ZXN0IG9uIE1hYyBPUyBYJykKKyAgICBkZWYgdGVzdF9ub3JtYWxpemUoc2VsZik6CisgICAgICAgIGZpbGVzID0gc2V0KGYgZm9yIGYgaW4gc2VsZi5maWxlcyBpZiBpc2luc3RhbmNlKGYsIHVuaWNvZGUpKQorICAgICAgICBvdGhlcnMgPSBzZXQoKQorICAgICAgICBmb3IgbmYgaW4gc2V0KFsnTkZDJywgJ05GRCcsICdORktDJywgJ05GS0QnXSk6CisgICAgICAgICAgICBvdGhlcnMgfD0gc2V0KG5vcm1hbGl6ZShuZiwgZmlsZSkgZm9yIGZpbGUgaW4gZmlsZXMpCisgICAgICAgIG90aGVycyAtPSBmaWxlcworICAgICAgICBmb3IgbmFtZSBpbiBvdGhlcnM6CisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9wZW4sIG5hbWUsIElPRXJyb3IpCisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9zLnN0YXQsIG5hbWUsIE9TRXJyb3IpCisgICAgICAgICAgICBzZWxmLl9hcHBseV9mYWlsdXJlKG9zLmNoZGlyLCBuYW1lLCBPU0Vycm9yKQorICAgICAgICAgICAgc2VsZi5fYXBwbHlfZmFpbHVyZShvcy5ybWRpciwgbmFtZSwgT1NFcnJvcikKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3MucmVtb3ZlLCBuYW1lLCBPU0Vycm9yKQorICAgICAgICAgICAgIyBsaXN0ZGlyIG1heSBhcHBlbmQgYSB3aWxkY2FyZCB0byB0aGUgZmlsZW5hbWUsIHNvIGRvbnQgY2hlY2sKKyAgICAgICAgICAgIHNlbGYuX2FwcGx5X2ZhaWx1cmUob3MubGlzdGRpciwgbmFtZSwgT1NFcnJvciwgRmFsc2UpCisKKyAgICAjIFNraXAgdGhlIHRlc3Qgb24gZGFyd2luLCBiZWNhdXNlIGRhcndpbiB1c2VzIGEgbm9ybWFsaXphdGlvbiBkaWZmZXJlbnQKKyAgICAjIHRoYW4gUHl0aG9uIE5GRCBub3JtYWxpemF0aW9uOiBmaWxlbmFtZXMgYXJlIGRpZmZlcmVudCBldmVuIGlmIHdlIHVzZQorICAgICMgUHl0aG9uIE5GRCBub3JtYWxpemF0aW9uLgorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLCAnaXJyZWxldmFudCB0ZXN0IG9uIE1hYyBPUyBYJykKKyAgICBkZWYgdGVzdF9saXN0ZGlyKHNlbGYpOgorICAgICAgICBzZjAgPSBzZXQoc2VsZi5maWxlcykKKyAgICAgICAgZjEgPSBvcy5saXN0ZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGYyID0gb3MubGlzdGRpcih1bmljb2RlKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKSkpCisgICAgICAgIHNmMiA9IHNldChvcy5wYXRoLmpvaW4odW5pY29kZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgZikgZm9yIGYgaW4gZjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2YwLCBzZjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYxKSwgbGVuKGYyKSkKKworICAgIGRlZiB0ZXN0X3JlbmFtZShzZWxmKToKKyAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5maWxlczoKKyAgICAgICAgICAgIG9zLnJlbmFtZShuYW1lLCAidG1wIikKKyAgICAgICAgICAgIG9zLnJlbmFtZSgidG1wIiwgbmFtZSkKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguam9pbih0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUnR3JceGZjXHhkZi1cdTY2ZThcdTY2ZTlcdTY2ZWInKQorICAgICAgICBmaWxlbmFtZSA9IHUnXHhkZi1cdTY2ZThcdTY2ZTlcdTY2ZWInCisgICAgICAgIG9sZHdkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MubWtkaXIoZGlybmFtZSkKKyAgICAgICAgb3MuY2hkaXIoZGlybmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgoZmlsZW5hbWUgKyAnXG4nKS5lbmNvZGUoInV0Zi04IikpCisgICAgICAgICAgICBvcy5hY2Nlc3MoZmlsZW5hbWUsb3MuUl9PSykKKyAgICAgICAgICAgIG9zLnJlbW92ZShmaWxlbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZHdkKQorICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKKworCitjbGFzcyBVbmljb2RlTkZDRmlsZVRlc3RzKFVuaWNvZGVGaWxlVGVzdHMpOgorICAgIG5vcm1hbF9mb3JtID0gJ05GQycKKworCitjbGFzcyBVbmljb2RlTkZERmlsZVRlc3RzKFVuaWNvZGVGaWxlVGVzdHMpOgorICAgIG5vcm1hbF9mb3JtID0gJ05GRCcKKworCitjbGFzcyBVbmljb2RlTkZLQ0ZpbGVUZXN0cyhVbmljb2RlRmlsZVRlc3RzKToKKyAgICBub3JtYWxfZm9ybSA9ICdORktDJworCisKK2NsYXNzIFVuaWNvZGVORktERmlsZVRlc3RzKFVuaWNvZGVGaWxlVGVzdHMpOgorICAgIG5vcm1hbF9mb3JtID0gJ05GS0QnCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRyeToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgICAgIFVuaWNvZGVGaWxlVGVzdHMsCisgICAgICAgICAgICBVbmljb2RlTkZDRmlsZVRlc3RzLAorICAgICAgICAgICAgVW5pY29kZU5GREZpbGVUZXN0cywKKyAgICAgICAgICAgIFVuaWNvZGVORktDRmlsZVRlc3RzLAorICAgICAgICAgICAgVW5pY29kZU5GS0RGaWxlVGVzdHMsCisgICAgICAgICkKKyAgICBmaW5hbGx5OgorICAgICAgICBkZWx0cmVlKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjc3LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI3Ny5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI3Ny5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjc3LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI3Ny5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1YTU3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI3Ny5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjkyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMjkyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiOGEyNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyOTIucHkKQEAgLTAsMCArMSwxOTMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIEF1dGhvcjogYmFycnlAcHl0aG9uLm9yZyAoQmFycnkgV2Fyc2F3KQorIyBMaWNlbnNlOiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL1B5dGhvblNvZnRGb3VuZGF0aW9uLnBocAorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gc3RyaW5nIGltcG9ydCBUZW1wbGF0ZQorCisKK2NsYXNzIEJhZzoKKyAgICBwYXNzCisKK2NsYXNzIE1hcHBpbmc6CisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWUpOgorICAgICAgICBvYmogPSBzZWxmCisgICAgICAgIGZvciBwYXJ0IGluIG5hbWUuc3BsaXQoJy4nKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvYmogPSBnZXRhdHRyKG9iaiwgcGFydCkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihuYW1lKQorICAgICAgICByZXR1cm4gb2JqCisKKworY2xhc3MgVGVzdFRlbXBsYXRlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZWd1bGFyX3RlbXBsYXRlcyhzZWxmKToKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiAkd2hhdCB3b3J0aCAkJDEwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdWJzdGl0dXRlKGRpY3Qod2hvPSd0aW0nLCB3aGF0PSdoYW0nKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbSBsaWtlcyB0byBlYXQgYSBiYWcgb2YgaGFtIHdvcnRoICQxMDAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcy5zdWJzdGl0dXRlLCBkaWN0KHdobz0ndGltJykpCisKKyAgICBkZWYgdGVzdF9yZWd1bGFyX3RlbXBsYXRlc193aXRoX2JyYWNlcyhzZWxmKToKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzICR7d2hhdH0gZm9yICR7bWVhbH0nKQorICAgICAgICBkID0gZGljdCh3aG89J3RpbScsIHdoYXQ9J2hhbScsIG1lYWw9J2Rpbm5lcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdWJzdGl0dXRlKGQpLCAndGltIGxpa2VzIGhhbSBmb3IgZGlubmVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHMuc3Vic3RpdHV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdCh3aG89J3RpbScsIHdoYXQ9J2hhbScpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyB0byBlYXQgYSBiYWcgb2YgJCR3aGF0IHdvcnRoICQkMTAwJykKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKGRpY3Qod2hvPSd0aW0nLCB3aGF0PSdoYW0nKSksCisgICAgICAgICAgICd0aW0gbGlrZXMgdG8gZWF0IGEgYmFnIG9mICR3aGF0IHdvcnRoICQxMDAnKQorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJCQnKQorICAgICAgICBlcShzLnN1YnN0aXR1dGUoZGljdCh3aG89J3RpbScsIHdoYXQ9J2hhbScpKSwgJ3RpbSBsaWtlcyAkJykKKworICAgIGRlZiB0ZXN0X3BlcmNlbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFRlbXBsYXRlKCclKGZvbylzICRmb28gJHtmb299JykKKyAgICAgICAgZCA9IGRpY3QoZm9vPSdiYXonKQorICAgICAgICBlcShzLnN1YnN0aXR1dGUoZCksICclKGZvbylzIGJheiBiYXonKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZShkKSwgJyUoZm9vKXMgYmF6IGJheicpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdpZmljYXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gVGVtcGxhdGUoJ3RpbSBoYXMgZWF0ZW4gJGNvdW50IGJhZ3Mgb2YgaGFtIHRvZGF5JykKKyAgICAgICAgZCA9IGRpY3QoY291bnQ9NykKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKGQpLCAndGltIGhhcyBlYXRlbiA3IGJhZ3Mgb2YgaGFtIHRvZGF5JykKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZCksICd0aW0gaGFzIGVhdGVuIDcgYmFncyBvZiBoYW0gdG9kYXknKQorICAgICAgICBzID0gVGVtcGxhdGUoJ3RpbSBoYXMgZWF0ZW4gJHtjb3VudH0gYmFncyBvZiBoYW0gdG9kYXknKQorICAgICAgICBlcShzLnN1YnN0aXR1dGUoZCksICd0aW0gaGFzIGVhdGVuIDcgYmFncyBvZiBoYW0gdG9kYXknKQorCisgICAgZGVmIHRlc3RfdHVwbGVhcmdzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGF0ZSAke21lYWx9JykKKyAgICAgICAgZCA9IGRpY3Qod2hvPSgndGltJywgJ2ZyZWQnKSwgbWVhbD0oJ2hhbScsICdrdW5nIHBhbycpKQorICAgICAgICBlcShzLnN1YnN0aXR1dGUoZCksICIoJ3RpbScsICdmcmVkJykgYXRlICgnaGFtJywgJ2t1bmcgcGFvJykiKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZShkKSwgIigndGltJywgJ2ZyZWQnKSBhdGUgKCdoYW0nLCAna3VuZyBwYW8nKSIpCisKKyAgICBkZWYgdGVzdF9TYWZlVGVtcGxhdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJHt3aGF0fSBmb3IgJHttZWFsfScpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3Qod2hvPSd0aW0nKSksICd0aW0gbGlrZXMgJHt3aGF0fSBmb3IgJHttZWFsfScpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3Qod2hhdD0naGFtJykpLCAnJHdobyBsaWtlcyBoYW0gZm9yICR7bWVhbH0nKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZShkaWN0KHdoYXQ9J2hhbScsIG1lYWw9J2Rpbm5lcicpKSwKKyAgICAgICAgICAgJyR3aG8gbGlrZXMgaGFtIGZvciBkaW5uZXInKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZShkaWN0KHdobz0ndGltJywgd2hhdD0naGFtJykpLAorICAgICAgICAgICAndGltIGxpa2VzIGhhbSBmb3IgJHttZWFsfScpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3Qod2hvPSd0aW0nLCB3aGF0PSdoYW0nLCBtZWFsPSdkaW5uZXInKSksCisgICAgICAgICAgICd0aW0gbGlrZXMgaGFtIGZvciBkaW5uZXInKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9wbGFjZWhvbGRlcnMoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAkJykKKyAgICAgICAgcmFpc2VzKFZhbHVlRXJyb3IsIHMuc3Vic3RpdHV0ZSwgZGljdCh3aG89J3RpbScpKQorICAgICAgICBzID0gVGVtcGxhdGUoJyR3aG8gbGlrZXMgJHt3aGF0KScpCisgICAgICAgIHJhaXNlcyhWYWx1ZUVycm9yLCBzLnN1YnN0aXR1dGUsIGRpY3Qod2hvPSd0aW0nKSkKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzICQxMDAnKQorICAgICAgICByYWlzZXMoVmFsdWVFcnJvciwgcy5zdWJzdGl0dXRlLCBkaWN0KHdobz0ndGltJykpCisKKyAgICBkZWYgdGVzdF9pZHBhdHRlcm5fb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIGNsYXNzIFBhdGhQYXR0ZXJuKFRlbXBsYXRlKToKKyAgICAgICAgICAgIGlkcGF0dGVybiA9IHInW19hLXpdWy5fYS16MC05XSonCisgICAgICAgIG0gPSBNYXBwaW5nKCkKKyAgICAgICAgbS5iYWcgPSBCYWcoKQorICAgICAgICBtLmJhZy5mb28gPSBCYWcoKQorICAgICAgICBtLmJhZy5mb28ud2hvID0gJ3RpbScKKyAgICAgICAgbS5iYWcud2hhdCA9ICdoYW0nCisgICAgICAgIHMgPSBQYXRoUGF0dGVybignJGJhZy5mb28ud2hvIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiAkYmFnLndoYXQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3Vic3RpdHV0ZShtKSwgJ3RpbSBsaWtlcyB0byBlYXQgYSBiYWcgb2YgaGFtJykKKworICAgIGRlZiB0ZXN0X3BhdHRlcm5fb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIGNsYXNzIE15UGF0dGVybihUZW1wbGF0ZSk6CisgICAgICAgICAgICBwYXR0ZXJuID0gciIiIgorICAgICAgICAgICAgKD9QPGVzY2FwZWQ+QHsyfSkgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgQCg/UDxuYW1lZD5bX2Etel1bLl9hLXowLTldKikgICAgICAgfAorICAgICAgICAgICAgQHsoP1A8YnJhY2VkPltfYS16XVsuX2EtejAtOV0qKX0gICAgfAorICAgICAgICAgICAgKD9QPGludmFsaWQ+QCkKKyAgICAgICAgICAgICIiIgorICAgICAgICBtID0gTWFwcGluZygpCisgICAgICAgIG0uYmFnID0gQmFnKCkKKyAgICAgICAgbS5iYWcuZm9vID0gQmFnKCkKKyAgICAgICAgbS5iYWcuZm9vLndobyA9ICd0aW0nCisgICAgICAgIG0uYmFnLndoYXQgPSAnaGFtJworICAgICAgICBzID0gTXlQYXR0ZXJuKCdAYmFnLmZvby53aG8gbGlrZXMgdG8gZWF0IGEgYmFnIG9mIEBiYWcud2hhdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdWJzdGl0dXRlKG0pLCAndGltIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiBoYW0nKQorCisgICAgICAgIGNsYXNzIEJhZFBhdHRlcm4oVGVtcGxhdGUpOgorICAgICAgICAgICAgcGF0dGVybiA9IHIiIiIKKyAgICAgICAgICAgICg/UDxiYWRuYW1lPi4qKSAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICg/UDxlc2NhcGVkPkB7Mn0pICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgIEAoP1A8bmFtZWQ+W19hLXpdWy5fYS16MC05XSopICAgICAgIHwKKyAgICAgICAgICAgIEB7KD9QPGJyYWNlZD5bX2Etel1bLl9hLXowLTldKil9ICAgIHwKKyAgICAgICAgICAgICg/UDxpbnZhbGlkPkApICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgICAgICIiIgorICAgICAgICBzID0gQmFkUGF0dGVybignQGJhZy5mb28ud2hvIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiBAYmFnLndoYXQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzLnN1YnN0aXR1dGUsIHt9KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzLnNhZmVfc3Vic3RpdHV0ZSwge30pCisKKyAgICBkZWYgdGVzdF91bmljb2RlX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzICR3aGF0JykKKyAgICAgICAgZCA9IGRpY3Qod2hvPXUndFx4ZmZtJywgd2hhdD11J2ZceGZlXGZlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdWJzdGl0dXRlKGQpLCB1J3RceGZmbSBsaWtlcyBmXHhmZVx4MGNlZCcpCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3VtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBsaWtlcyAkd2hhdCcpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZSh3aG89J3RpbScsIHdoYXQ9J2hhbScpLCAndGltIGxpa2VzIGhhbScpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkaWN0KHdobz0ndGltJyksIHdoYXQ9J2hhbScpLCAndGltIGxpa2VzIGhhbScpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkaWN0KHdobz0nZnJlZCcsIHdoYXQ9J2t1bmcgcGFvJyksCisgICAgICAgICAgICAgICAgICAgICAgICB3aG89J3RpbScsIHdoYXQ9J2hhbScpLAorICAgICAgICAgICAndGltIGxpa2VzIGhhbScpCisgICAgICAgIHMgPSBUZW1wbGF0ZSgndGhlIG1hcHBpbmcgaXMgJG1hcHBpbmcnKQorICAgICAgICBlcShzLnN1YnN0aXR1dGUoZGljdChmb289J25vbmUnKSwgbWFwcGluZz0nYm96bycpLAorICAgICAgICAgICAndGhlIG1hcHBpbmcgaXMgYm96bycpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShkaWN0KG1hcHBpbmc9J29uZScpLCBtYXBwaW5nPSd0d28nKSwKKyAgICAgICAgICAgJ3RoZSBtYXBwaW5nIGlzIHR3bycpCisKKyAgICBkZWYgdGVzdF9rZXl3b3JkX2FyZ3VtZW50c19zYWZlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKKyAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzICR3aGF0JykKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUod2hvPSd0aW0nLCB3aGF0PSdoYW0nKSwgJ3RpbSBsaWtlcyBoYW0nKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZShkaWN0KHdobz0ndGltJyksIHdoYXQ9J2hhbScpLCAndGltIGxpa2VzIGhhbScpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3Qod2hvPSdmcmVkJywgd2hhdD0na3VuZyBwYW8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdobz0ndGltJywgd2hhdD0naGFtJyksCisgICAgICAgICAgICd0aW0gbGlrZXMgaGFtJykKKyAgICAgICAgcyA9IFRlbXBsYXRlKCd0aGUgbWFwcGluZyBpcyAkbWFwcGluZycpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGRpY3QoZm9vPSdub25lJyksIG1hcHBpbmc9J2Jvem8nKSwKKyAgICAgICAgICAgJ3RoZSBtYXBwaW5nIGlzIGJvem8nKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZShkaWN0KG1hcHBpbmc9J29uZScpLCBtYXBwaW5nPSd0d28nKSwKKyAgICAgICAgICAgJ3RoZSBtYXBwaW5nIGlzIHR3bycpCisgICAgICAgIGQgPSBkaWN0KG1hcHBpbmc9J29uZScpCisgICAgICAgIHJhaXNlcyhUeXBlRXJyb3IsIHMuc3Vic3RpdHV0ZSwgZCwge30pCisgICAgICAgIHJhaXNlcyhUeXBlRXJyb3IsIHMuc2FmZV9zdWJzdGl0dXRlLCBkLCB7fSkKKworICAgIGRlZiB0ZXN0X2RlbGltaXRlcl9vdmVycmlkZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIGNsYXNzIEFtcGVyc2FuZFRlbXBsYXRlKFRlbXBsYXRlKToKKyAgICAgICAgICAgIGRlbGltaXRlciA9ICcmJworICAgICAgICBzID0gQW1wZXJzYW5kVGVtcGxhdGUoJ3RoaXMgJmdpZnQgaXMgZm9yICZ7d2hvfSAmJicpCisgICAgICAgIGVxKHMuc3Vic3RpdHV0ZShnaWZ0PSdidWQnLCB3aG89J3lvdScpLCAndGhpcyBidWQgaXMgZm9yIHlvdSAmJykKKyAgICAgICAgcmFpc2VzKEtleUVycm9yLCBzLnN1YnN0aXR1dGUpCisgICAgICAgIGVxKHMuc2FmZV9zdWJzdGl0dXRlKGdpZnQ9J2J1ZCcsIHdobz0neW91JyksICd0aGlzIGJ1ZCBpcyBmb3IgeW91ICYnKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZSgpLCAndGhpcyAmZ2lmdCBpcyBmb3IgJnt3aG99ICYnKQorICAgICAgICBzID0gQW1wZXJzYW5kVGVtcGxhdGUoJ3RoaXMgJmdpZnQgaXMgZm9yICZ7d2hvfSAmJykKKyAgICAgICAgcmFpc2VzKFZhbHVlRXJyb3IsIHMuc3Vic3RpdHV0ZSwgZGljdChnaWZ0PSdidWQnLCB3aG89J3lvdScpKQorICAgICAgICBlcShzLnNhZmVfc3Vic3RpdHV0ZSgpLCAndGhpcyAmZ2lmdCBpcyBmb3IgJnt3aG99ICYnKQorCisgICAgICAgIGNsYXNzIFBpZURlbGltcyhUZW1wbGF0ZSk6CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSAnQCcKKyAgICAgICAgcyA9IFBpZURlbGltcygnQHdobyBsaWtlcyB0byBlYXQgYSBiYWcgb2YgQHt3aGF0fSB3b3J0aCAkMTAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN1YnN0aXR1dGUoZGljdCh3aG89J3RpbScsIHdoYXQ9J2hhbScpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGltIGxpa2VzIHRvIGVhdCBhIGJhZyBvZiBoYW0gd29ydGggJDEwMCcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisgICAgdGVzdF9jbGFzc2VzID0gW1Rlc3RUZW1wbGF0ZSxdCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI5Mi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyOTIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYWVmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyOTIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDI5Mi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyOTIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYWVmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wZXAyOTIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDM1Mi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDM1Mi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGIzMTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5CkBAIC0wLDAgKzEsMjM5IEBACitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IGV4Y2VwdGlvbnMKK2ltcG9ydCB3YXJuaW5ncworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja193YXJuaW5ncworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHBsYXRmb3JtIGltcG9ydCBzeXN0ZW0gYXMgcGxhdGZvcm1fc3lzdGVtCisKK0RFUFJFQ0FUSU9OX1dBUk5JTkdTID0gWyJCYXNlRXhjZXB0aW9uLm1lc3NhZ2UgaGFzIGJlZW4gZGVwcmVjYXRlZCJdCisKK2lmIHN5cy5weTNrd2FybmluZzoKKyAgICBERVBSRUNBVElPTl9XQVJOSU5HUy5leHRlbmQoCisgICAgICAgIFsiZXhjZXB0aW9ucyBtdXN0IGRlcml2ZSBmcm9tIEJhc2VFeGNlcHRpb24iLAorICAgICAgICAgImNhdGNoaW5nIGNsYXNzZXMgdGhhdCBkb24ndCBpbmhlcml0IGZyb20gQmFzZUV4Y2VwdGlvbiBpcyBub3QgYWxsb3dlZCIsCisgICAgICAgICAiX19nZXQoaXRlbXxzbGljZSlfXyBub3Qgc3VwcG9ydGVkIGZvciBleGNlcHRpb24gY2xhc3NlcyJdKQorCitfZGVwcmVjYXRpb25zID0gWyhtc2csIERlcHJlY2F0aW9uV2FybmluZykgZm9yIG1zZyBpbiBERVBSRUNBVElPTl9XQVJOSU5HU10KKworIyBTaWxlbmNlIFB5M2sgYW5kIG90aGVyIGRlcHJlY2F0aW9uIHdhcm5pbmdzCitkZWYgaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzKGZ1bmMpOgorICAgICIiIklnbm9yZSB0aGUga25vd24gRGVwcmVjYXRpb25XYXJuaW5ncy4iIiIKKyAgICBkZWYgd3JhcHBlcigqYXJncywgKiprdyk6CisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKl9kZXByZWNhdGlvbnMsIHF1aWV0PVRydWUpOgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa3cpCisgICAgcmV0dXJuIHdyYXBwZXIKKworY2xhc3MgRXhjZXB0aW9uQ2xhc3NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAiIiJUZXN0cyBmb3IgYW55dGhpbmcgcmVsYXRpbmcgdG8gZXhjZXB0aW9uIG9iamVjdHMgdGhlbXNlbHZlcyAoZS5nLiwKKyAgICBpbmhlcml0YW5jZSBoaWVyYXJjaHkpIiIiCisKKyAgICBkZWYgdGVzdF9idWlsdGluc19uZXdfc3R5bGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEV4Y2VwdGlvbiwgb2JqZWN0KSkKKworICAgIEBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MKKyAgICBkZWYgdmVyaWZ5X2luc3RhbmNlX2ludGVyZmFjZShzZWxmLCBpbnMpOgorICAgICAgICBmb3IgYXR0ciBpbiAoImFyZ3MiLCAibWVzc2FnZSIsICJfX3N0cl9fIiwgIl9fcmVwcl9fIiwgIl9fZ2V0aXRlbV9fIik6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihpbnMsIGF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBtaXNzaW5nICVzIGF0dHJpYnV0ZSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnMuX19jbGFzc19fLl9fbmFtZV9fLCBhdHRyKSkKKworICAgIGRlZiB0ZXN0X2luaGVyaXRhbmNlKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG1hdGNoZXMgdGhlIGRvY3VtZW50YXRpb24KKyAgICAgICAgZXhjX3NldCA9IHNldCh4IGZvciB4IGluIGRpcihleGNlcHRpb25zKSBpZiBub3QgeC5zdGFydHN3aXRoKCdfJykpCisgICAgICAgIGluaGVyaXRhbmNlX3RyZWUgPSBvcGVuKG9zLnBhdGguam9pbihvcy5wYXRoLnNwbGl0KF9fZmlsZV9fKVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleGNlcHRpb25faGllcmFyY2h5LnR4dCcpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdXBlcmNsYXNzX25hbWUgPSBpbmhlcml0YW5jZV90cmVlLnJlYWRsaW5lKCkucnN0cmlwKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBsYXN0X2V4YyA9IGdldGF0dHIoX19idWlsdGluX18sIHN1cGVyY2xhc3NfbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImJhc2UgY2xhc3MgJXMgbm90IGEgYnVpbHQtaW4iICUgc3VwZXJjbGFzc19uYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihzdXBlcmNsYXNzX25hbWUsIGV4Y19zZXQpCisgICAgICAgICAgICBleGNfc2V0LmRpc2NhcmQoc3VwZXJjbGFzc19uYW1lKQorICAgICAgICAgICAgc3VwZXJjbGFzc2VzID0gW10gICMgTG9vcCB3aWxsIGluc2VydCBiYXNlIGV4Y2VwdGlvbgorICAgICAgICAgICAgbGFzdF9kZXB0aCA9IDAKKyAgICAgICAgICAgIGZvciBleGNfbGluZSBpbiBpbmhlcml0YW5jZV90cmVlOgorICAgICAgICAgICAgICAgIGV4Y19saW5lID0gZXhjX2xpbmUucnN0cmlwKCkKKyAgICAgICAgICAgICAgICBkZXB0aCA9IGV4Y19saW5lLnJpbmRleCgnLScpCisgICAgICAgICAgICAgICAgZXhjX25hbWUgPSBleGNfbGluZVtkZXB0aCsyOl0gICMgU2xpY2UgcGFzdCBzcGFjZQorICAgICAgICAgICAgICAgIGlmICcoJyBpbiBleGNfbmFtZToKKyAgICAgICAgICAgICAgICAgICAgcGFyZW5faW5kZXggPSBleGNfbmFtZS5pbmRleCgnKCcpCisgICAgICAgICAgICAgICAgICAgIHBsYXRmb3JtX25hbWUgPSBleGNfbmFtZVtwYXJlbl9pbmRleCsxOi0xXQorICAgICAgICAgICAgICAgICAgICBleGNfbmFtZSA9IGV4Y19uYW1lWzpwYXJlbl9pbmRleC0xXSAgIyBTbGljZSBvZmYgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgaWYgcGxhdGZvcm1fc3lzdGVtKCkgIT0gcGxhdGZvcm1fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y19zZXQuZGlzY2FyZChleGNfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgJ1snIGluIGV4Y19uYW1lOgorICAgICAgICAgICAgICAgICAgICBsZWZ0X2JyYWNrZXQgPSBleGNfbmFtZS5pbmRleCgnWycpCisgICAgICAgICAgICAgICAgICAgIGV4Y19uYW1lID0gZXhjX25hbWVbOmxlZnRfYnJhY2tldC0xXSAgIyBjb3ZlciBzcGFjZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZXhjID0gZ2V0YXR0cihfX2J1aWx0aW5fXywgZXhjX25hbWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzIG5vdCBhIGJ1aWx0LWluIGV4Y2VwdGlvbiIgJSBleGNfbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBsYXN0X2RlcHRoIDwgZGVwdGg6CisgICAgICAgICAgICAgICAgICAgIHN1cGVyY2xhc3Nlcy5hcHBlbmQoKGxhc3RfZGVwdGgsIGxhc3RfZXhjKSkKKyAgICAgICAgICAgICAgICBlbGlmIGxhc3RfZGVwdGggPiBkZXB0aDoKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgc3VwZXJjbGFzc2VzWy0xXVswXSA+PSBkZXB0aDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyY2xhc3Nlcy5wb3AoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGV4Yywgc3VwZXJjbGFzc2VzWy0xXVsxXSksCisgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YmNsYXNzIG9mICVzIiAlIChleGMuX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgIHN1cGVyY2xhc3Nlc1stMV1bMV0uX19uYW1lX18pKQorICAgICAgICAgICAgICAgIHRyeTogICMgU29tZSBleGNlcHRpb25zIHJlcXVpcmUgYXJndW1lbnRzOyBqdXN0IHNraXAgdGhlbQorICAgICAgICAgICAgICAgICAgICBzZWxmLnZlcmlmeV9pbnN0YW5jZV9pbnRlcmZhY2UoZXhjKCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXhjX25hbWUsIGV4Y19zZXQpCisgICAgICAgICAgICAgICAgZXhjX3NldC5kaXNjYXJkKGV4Y19uYW1lKQorICAgICAgICAgICAgICAgIGxhc3RfZXhjID0gZXhjCisgICAgICAgICAgICAgICAgbGFzdF9kZXB0aCA9IGRlcHRoCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpbmhlcml0YW5jZV90cmVlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXhjX3NldCksIDAsICIlcyBub3QgYWNjb3VudGVkIGZvciIgJSBleGNfc2V0KQorCisgICAgaW50ZXJmYWNlX3Rlc3RzID0gKCJsZW5ndGgiLCAiYXJncyIsICJtZXNzYWdlIiwgInN0ciIsICJ1bmljb2RlIiwgInJlcHIiLAorICAgICAgICAgICAgImluZGV4aW5nIikKKworICAgIGRlZiBpbnRlcmZhY2VfdGVzdF9kcml2ZXIoc2VsZiwgcmVzdWx0cyk6CisgICAgICAgIGZvciB0ZXN0X25hbWUsIChnaXZlbiwgZXhwZWN0ZWQpIGluIHppcChzZWxmLmludGVyZmFjZV90ZXN0cywgcmVzdWx0cyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdpdmVuLCBleHBlY3RlZCwgIiVzOiAlcyAhPSAlcyIgJSAodGVzdF9uYW1lLAorICAgICAgICAgICAgICAgIGdpdmVuLCBleHBlY3RlZCkpCisKKyAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCisgICAgZGVmIHRlc3RfaW50ZXJmYWNlX3NpbmdsZV9hcmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGludGVyZmFjZSB3b3JrcyBwcm9wZXJseSB3aGVuIGdpdmVuIGEgc2luZ2xlIGFyZ3VtZW50CisgICAgICAgIGFyZyA9ICJzcGFtIgorICAgICAgICBleGMgPSBFeGNlcHRpb24oYXJnKQorICAgICAgICByZXN1bHRzID0gKFtsZW4oZXhjLmFyZ3MpLCAxXSwgW2V4Yy5hcmdzWzBdLCBhcmddLCBbZXhjLm1lc3NhZ2UsIGFyZ10sCisgICAgICAgICAgICAgICAgICAgW3N0cihleGMpLCBzdHIoYXJnKV0sIFt1bmljb2RlKGV4YyksIHVuaWNvZGUoYXJnKV0sCisgICAgICAgICAgICAgICAgICAgW3JlcHIoZXhjKSwgZXhjLl9fY2xhc3NfXy5fX25hbWVfXyArIHJlcHIoZXhjLmFyZ3MpXSwKKyAgICAgICAgICAgICAgICAgICBbZXhjWzBdLCBhcmddKQorICAgICAgICBzZWxmLmludGVyZmFjZV90ZXN0X2RyaXZlcihyZXN1bHRzKQorCisgICAgQGlnbm9yZV9kZXByZWNhdGlvbl93YXJuaW5ncworICAgIGRlZiB0ZXN0X2ludGVyZmFjZV9tdWx0aV9hcmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGludGVyZmFjZSBjb3JyZWN0IHdoZW4gbXVsdGlwbGUgYXJndW1lbnRzIGdpdmVuCisgICAgICAgIGFyZ19jb3VudCA9IDMKKyAgICAgICAgYXJncyA9IHR1cGxlKHJhbmdlKGFyZ19jb3VudCkpCisgICAgICAgIGV4YyA9IEV4Y2VwdGlvbigqYXJncykKKyAgICAgICAgcmVzdWx0cyA9IChbbGVuKGV4Yy5hcmdzKSwgYXJnX2NvdW50XSwgW2V4Yy5hcmdzLCBhcmdzXSwKKyAgICAgICAgICAgICAgICAgICBbZXhjLm1lc3NhZ2UsICcnXSwgW3N0cihleGMpLCBzdHIoYXJncyldLAorICAgICAgICAgICAgICAgICAgIFt1bmljb2RlKGV4YyksIHVuaWNvZGUoYXJncyldLAorICAgICAgICAgICAgICAgICAgIFtyZXByKGV4YyksIGV4Yy5fX2NsYXNzX18uX19uYW1lX18gKyByZXByKGV4Yy5hcmdzKV0sCisgICAgICAgICAgICAgICAgICAgW2V4Y1stMV0sIGFyZ3NbLTFdXSkKKyAgICAgICAgc2VsZi5pbnRlcmZhY2VfdGVzdF9kcml2ZXIocmVzdWx0cykKKworICAgIEBpZ25vcmVfZGVwcmVjYXRpb25fd2FybmluZ3MKKyAgICBkZWYgdGVzdF9pbnRlcmZhY2Vfbm9fYXJnKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHdpdGggbm8gYXJncyB0aGF0IGludGVyZmFjZSBpcyBjb3JyZWN0CisgICAgICAgIGV4YyA9IEV4Y2VwdGlvbigpCisgICAgICAgIHJlc3VsdHMgPSAoW2xlbihleGMuYXJncyksIDBdLCBbZXhjLmFyZ3MsIHR1cGxlKCldLAorICAgICAgICAgICAgICAgICAgIFtleGMubWVzc2FnZSwgJyddLAorICAgICAgICAgICAgICAgICAgIFtzdHIoZXhjKSwgJyddLCBbdW5pY29kZShleGMpLCB1JyddLAorICAgICAgICAgICAgICAgICAgIFtyZXByKGV4YyksIGV4Yy5fX2NsYXNzX18uX19uYW1lX18gKyAnKCknXSwgW1RydWUsIFRydWVdKQorICAgICAgICBzZWxmLmludGVyZmFjZV90ZXN0X2RyaXZlcihyZXN1bHRzKQorCisKKyAgICBkZWYgdGVzdF9tZXNzYWdlX2RlcHJlY2F0aW9uKHNlbGYpOgorICAgICAgICAjIEFzIG9mIFB5dGhvbiAyLjYsIEJhc2VFeGNlcHRpb24ubWVzc2FnZSBpcyBkZXByZWNhdGVkLgorICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgiIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICBCYXNlRXhjZXB0aW9uKCkubWVzc2FnZQorCisKK2NsYXNzIFVzYWdlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdCB1c2FnZSBvZiBleGNlcHRpb25zIiIiCisKKyAgICBkZWYgcmFpc2VfZmFpbHMoc2VsZiwgb2JqZWN0Xyk6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGF0IHJhaXNpbmcgJ29iamVjdF8nIHRyaWdnZXJzIGEgVHlwZUVycm9yLiIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBvYmplY3RfCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gICMgV2hhdCBpcyBleHBlY3RlZC4KKyAgICAgICAgc2VsZi5mYWlsKCJUeXBlRXJyb3IgZXhwZWN0ZWQgZm9yIHJhaXNpbmcgJXMiICUgdHlwZShvYmplY3RfKSkKKworICAgIGRlZiBjYXRjaF9mYWlscyhzZWxmLCBvYmplY3RfKToKKyAgICAgICAgIiIiQ2F0Y2hpbmcgJ29iamVjdF8nIHNob3VsZCByYWlzZSBhIFR5cGVFcnJvci4iIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIFN0YW5kYXJkRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBvYmplY3RfOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFN0YW5kYXJkRXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlR5cGVFcnJvciBleHBlY3RlZCB3aGVuIGNhdGNoaW5nICVzIiAlIHR5cGUob2JqZWN0XykpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIFN0YW5kYXJkRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCAob2JqZWN0XywpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQgU3RhbmRhcmRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVHlwZUVycm9yIGV4cGVjdGVkIHdoZW4gY2F0Y2hpbmcgJXMgYXMgc3BlY2lmaWVkIGluIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgInR1cGxlIiAlIHR5cGUob2JqZWN0XykpCisKKyAgICBAaWdub3JlX2RlcHJlY2F0aW9uX3dhcm5pbmdzCisgICAgZGVmIHRlc3RfcmFpc2VfY2xhc3NpYyhzZWxmKToKKyAgICAgICAgIyBSYWlzaW5nIGEgY2xhc3NpYyBjbGFzcyBpcyBva2F5IChmb3Igbm93KS4KKyAgICAgICAgY2xhc3MgQ2xhc3NpY0NsYXNzOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBDbGFzc2ljQ2xhc3MKKyAgICAgICAgZXhjZXB0IENsYXNzaWNDbGFzczoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ1bmFibGUgdG8gcmFpc2UgY2xhc3NpYyBjbGFzcyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIENsYXNzaWNDbGFzcygpCisgICAgICAgIGV4Y2VwdCBDbGFzc2ljQ2xhc3M6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidW5hYmxlIHRvIHJhaXNlIGNsYXNzaWMgY2xhc3MgaW5zdGFuY2UiKQorCisgICAgZGVmIHRlc3RfcmFpc2VfbmV3X3N0eWxlX25vbl9leGNlcHRpb24oc2VsZik6CisgICAgICAgICMgWW91IGNhbm5vdCByYWlzZSBhIG5ldy1zdHlsZSBjbGFzcyB0aGF0IGRvZXMgbm90IGluaGVyaXQgZnJvbQorICAgICAgICAjIEJhc2VFeGNlcHRpb247IHRoZSBhYmlsaXR5IHdhcyBub3QgcG9zc2libGUgdW50aWwgQmFzZUV4Y2VwdGlvbidzCisgICAgICAgICMgaW50cm9kdWN0aW9uIHNvIG5vIG5lZWQgdG8gc3VwcG9ydCBuZXctc3R5bGUgb2JqZWN0cyB0aGF0IGRvIG5vdAorICAgICAgICAjIGluaGVyaXQgZnJvbSBpdC4KKyAgICAgICAgY2xhc3MgTmV3U3R5bGVDbGFzcyhvYmplY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLnJhaXNlX2ZhaWxzKE5ld1N0eWxlQ2xhc3MpCisgICAgICAgIHNlbGYucmFpc2VfZmFpbHMoTmV3U3R5bGVDbGFzcygpKQorCisgICAgZGVmIHRlc3RfcmFpc2Vfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIFJhaXNpbmcgYSBzdHJpbmcgcmFpc2VzIFR5cGVFcnJvci4KKyAgICAgICAgc2VsZi5yYWlzZV9mYWlscygic3BhbSIpCisKKyAgICBkZWYgdGVzdF9jYXRjaF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgQ2F0Y2hpbmcgYSBzdHJpbmcgc2hvdWxkIHRyaWdnZXIgYSBEZXByZWNhdGlvbldhcm5pbmcuCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIikKKyAgICAgICAgICAgIHN0cl9leGMgPSAic3BhbSIKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRGVwcmVjYXRpb25XYXJuaW5nKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0YW5kYXJkRXJyb3IKKyAgICAgICAgICAgICAgICBleGNlcHQgc3RyX2V4YzoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGV2ZW4gaWYgdGhlIHN0cmluZyBleGNlcHRpb24gaXMgbGlzdGVkIGluIGEgdHVwbGUKKyAgICAgICAgICAgICMgdGhhdCBhIHdhcm5pbmcgaXMgcmFpc2VkLgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RhbmRhcmRFcnJvcgorICAgICAgICAgICAgICAgIGV4Y2VwdCAoQXNzZXJ0aW9uRXJyb3IsIHN0cl9leGMpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChFeGNlcHRpb25DbGFzc1Rlc3RzLCBVc2FnZVRlc3RzKQorCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDM1Mi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNWJmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDM1Mi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGVwMzUyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDM1Mi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNWJmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BlcDM1Mi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMTI2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHkKQEAgLTAsMCArMSw5MiBAQAoraW1wb3J0IHBpY2tsZQorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2Zyb20gdGVzdC5waWNrbGV0ZXN0ZXIgaW1wb3J0IChBYnN0cmFjdFBpY2tsZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWJzdHJhY3RQZXJzaXN0ZW50UGlja2xlclRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFic3RyYWN0UGlja2xlclVucGlja2xlck9iamVjdFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpZ21lbVBpY2tsZVRlc3RzKQorCitjbGFzcyBQaWNrbGVUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzLCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzKToKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9MCk6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5kdW1wcyhhcmcsIHByb3RvKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhidWYpCisKKyAgICBtb2R1bGUgPSBwaWNrbGUKKyAgICBlcnJvciA9IEtleUVycm9yCisKK2NsYXNzIFBpY2tsZXJUZXN0cyhBYnN0cmFjdFBpY2tsZVRlc3RzKToKKworICAgIGVycm9yID0gS2V5RXJyb3IKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9MCk6CisgICAgICAgIGYgPSBTdHJpbmdJTygpCisgICAgICAgIHAgPSBwaWNrbGUuUGlja2xlcihmLCBwcm90bykKKyAgICAgICAgaWYgZmFzdDoKKyAgICAgICAgICAgIHAuZmFzdCA9IGZhc3QKKyAgICAgICAgcC5kdW1wKGFyZykKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHJldHVybiBmLnJlYWQoKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgIGYgPSBTdHJpbmdJTyhidWYpCisgICAgICAgIHUgPSBwaWNrbGUuVW5waWNrbGVyKGYpCisgICAgICAgIHJldHVybiB1LmxvYWQoKQorCitjbGFzcyBQZXJzUGlja2xlclRlc3RzKEFic3RyYWN0UGVyc2lzdGVudFBpY2tsZXJUZXN0cyk6CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wLCBmYXN0PTApOgorICAgICAgICBjbGFzcyBQZXJzUGlja2xlcihwaWNrbGUuUGlja2xlcik6CisgICAgICAgICAgICBkZWYgcGVyc2lzdGVudF9pZChzdWJzZWxmLCBvYmopOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBlcnNpc3RlbnRfaWQob2JqKQorICAgICAgICBmID0gU3RyaW5nSU8oKQorICAgICAgICBwID0gUGVyc1BpY2tsZXIoZiwgcHJvdG8pCisgICAgICAgIGlmIGZhc3Q6CisgICAgICAgICAgICBwLmZhc3QgPSBmYXN0CisgICAgICAgIHAuZHVtcChhcmcpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICByZXR1cm4gZi5yZWFkKCkKKworICAgIGRlZiBsb2FkcyhzZWxmLCBidWYpOgorICAgICAgICBjbGFzcyBQZXJzVW5waWNrbGVyKHBpY2tsZS5VbnBpY2tsZXIpOgorICAgICAgICAgICAgZGVmIHBlcnNpc3RlbnRfbG9hZChzdWJzZWxmLCBvYmopOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnBlcnNpc3RlbnRfbG9hZChvYmopCisgICAgICAgIGYgPSBTdHJpbmdJTyhidWYpCisgICAgICAgIHUgPSBQZXJzVW5waWNrbGVyKGYpCisgICAgICAgIHJldHVybiB1LmxvYWQoKQorCitjbGFzcyBQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMoQWJzdHJhY3RQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMpOgorCisgICAgcGlja2xlcl9jbGFzcyA9IHBpY2tsZS5QaWNrbGVyCisgICAgdW5waWNrbGVyX2NsYXNzID0gcGlja2xlLlVucGlja2xlcgorCitjbGFzcyBQaWNrbGVCaWdtZW1QaWNrbGVUZXN0cyhCaWdtZW1QaWNrbGVUZXN0cyk6CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wLCBmYXN0PTApOgorICAgICAgICAjIElnbm9yZSBmYXN0CisgICAgICAgIHJldHVybiBwaWNrbGUuZHVtcHMoYXJnLCBwcm90bykKKworICAgIGRlZiBsb2FkcyhzZWxmLCBidWYpOgorICAgICAgICAjIElnbm9yZSBmYXN0CisgICAgICAgIHJldHVybiBwaWNrbGUubG9hZHMoYnVmKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBQaWNrbGVUZXN0cywKKyAgICAgICAgUGlja2xlclRlc3RzLAorICAgICAgICBQZXJzUGlja2xlclRlc3RzLAorICAgICAgICBQaWNrbGVyVW5waWNrbGVyT2JqZWN0VGVzdHMsCisgICAgICAgIFBpY2tsZUJpZ21lbVBpY2tsZVRlc3RzLAorICAgICkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QocGlja2xlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTIyMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTIyMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGV0b29scy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNWIzNWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waWNrbGV0b29scy5weQpAQCAtMCwwICsxLDI0IEBACitpbXBvcnQgcGlja2xlCitpbXBvcnQgcGlja2xldG9vbHMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZVRlc3RzCitmcm9tIHRlc3QucGlja2xldGVzdGVyIGltcG9ydCBBYnN0cmFjdFBpY2tsZU1vZHVsZVRlc3RzCisKK2NsYXNzIE9wdGltaXplZFBpY2tsZVRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMsIEFic3RyYWN0UGlja2xlTW9kdWxlVGVzdHMpOgorCisgICAgZGVmIGR1bXBzKHNlbGYsIGFyZywgcHJvdG89MCwgZmFzdD0wKToKKyAgICAgICAgcmV0dXJuIHBpY2tsZXRvb2xzLm9wdGltaXplKHBpY2tsZS5kdW1wcyhhcmcsIHByb3RvKSkKKworICAgIGRlZiBsb2FkcyhzZWxmLCBidWYpOgorICAgICAgICByZXR1cm4gcGlja2xlLmxvYWRzKGJ1ZikKKworICAgIG1vZHVsZSA9IHBpY2tsZQorICAgIGVycm9yID0gS2V5RXJyb3IKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoT3B0aW1pemVkUGlja2xlVGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHBpY2tsZXRvb2xzKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpY2tsZXRvb2xzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRiMTk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlja2xldG9vbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhiOGJlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5CkBAIC0wLDAgKzEsMjA0IEBACitpbXBvcnQgcGlwZXMKK2ltcG9ydCBvcworaW1wb3J0IHN0cmluZworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIHJ1bl91bml0dGVzdCwgdW5saW5rLCByZWFwX2NoaWxkcmVuCisKK2lmIG9zLm5hbWUgIT0gJ3Bvc2l4JzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgncGlwZXMgbW9kdWxlIG9ubHkgd29ya3Mgb24gcG9zaXgnKQorCitURVNURk4yID0gVEVTVEZOICsgIjIiCisKKyMgdHIgYS16IEEtWiBpcyBub3QgcG9ydGFibGUsIHNvIG1ha2UgdGhlIHJhbmdlcyBleHBsaWNpdAorc19jb21tYW5kID0gJ3RyICVzICVzJyAlIChzdHJpbmcuYXNjaWlfbG93ZXJjYXNlLCBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlKQorCitjbGFzcyBTaW1wbGVQaXBlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTiwgVEVTVEZOMik6CisgICAgICAgICAgICB1bmxpbmsoZikKKworICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTEoc2VsZik6CisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQuYXBwZW5kKHNfY29tbWFuZCwgcGlwZXMuU1RESU5fU1RET1VUKQorICAgICAgICBmID0gdC5vcGVuKFRFU1RGTiwgJ3cnKQorICAgICAgICBmLndyaXRlKCdoZWxsbyB3b3JsZCAjMScpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJ0hFTExPIFdPUkxEICMxJykKKworICAgIGRlZiB0ZXN0U2ltcGxlUGlwZTIoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoJ2hlbGxvIHdvcmxkICMyJykKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgdC5hcHBlbmQoc19jb21tYW5kICsgJyA8ICRJTiA+ICRPVVQnLCBwaXBlcy5GSUxFSU5fRklMRU9VVCkKKyAgICAgICAgdC5jb3B5KFRFU1RGTiwgVEVTVEZOMikKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnSEVMTE8gV09STEQgIzInKQorCisgICAgZGVmIHRlc3RTaW1wbGVQaXBlMyhzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgnaGVsbG8gd29ybGQgIzInKQorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICB0LmFwcGVuZChzX2NvbW1hbmQgKyAnIDwgJElOJywgcGlwZXMuRklMRUlOX1NURE9VVCkKKyAgICAgICAgd2l0aCB0Lm9wZW4oVEVTVEZOLCAncicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCAnSEVMTE8gV09STEQgIzInKQorCisgICAgZGVmIHRlc3RFbXB0eVBpcGVsaW5lMShzZWxmKToKKyAgICAgICAgIyBjb3B5IHRocm91Z2ggZW1wdHkgcGlwZQorICAgICAgICBkID0gJ2VtcHR5IHBpcGVsaW5lIHRlc3QgQ09QWScKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShkKQorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgnJykKKyAgICAgICAgdD1waXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQuY29weShURVNURk4sIFRFU1RGTjIpCisgICAgICAgIHdpdGggb3BlbihURVNURk4yKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZCkKKworICAgIGRlZiB0ZXN0RW1wdHlQaXBlbGluZTIoc2VsZik6CisgICAgICAgICMgcmVhZCB0aHJvdWdoIGVtcHR5IHBpcGUKKyAgICAgICAgZCA9ICdlbXB0eSBwaXBlbGluZSB0ZXN0IFJFQUQnCisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoZCkKKyAgICAgICAgdD1waXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHdpdGggdC5vcGVuKFRFU1RGTiwgJ3InKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgZCkKKworICAgIGRlZiB0ZXN0RW1wdHlQaXBlbGluZTMoc2VsZik6CisgICAgICAgICMgd3JpdGUgdGhyb3VnaCBlbXB0eSBwaXBlCisgICAgICAgIGQgPSAnZW1wdHkgcGlwZWxpbmUgdGVzdCBXUklURScKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgd2l0aCB0Lm9wZW4oVEVTVEZOLCAndycpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKGQpCisgICAgICAgIHdpdGggb3BlbihURVNURk4pIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBkKQorCisgICAgZGVmIHRlc3RRdW90aW5nKHNlbGYpOgorICAgICAgICBzYWZldW5xdW90ZWQgPSBzdHJpbmcuYXNjaWlfbGV0dGVycyArIHN0cmluZy5kaWdpdHMgKyAnQCVfLSs9OiwuLycKKyAgICAgICAgdW5zYWZlID0gJyJgJFxcIScKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBpcGVzLnF1b3RlKCcnKSwgIicnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlcy5xdW90ZShzYWZldW5xdW90ZWQpLCBzYWZldW5xdW90ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGlwZXMucXVvdGUoJ3Rlc3QgZmlsZSBuYW1lJyksICIndGVzdCBmaWxlIG5hbWUnIikKKyAgICAgICAgZm9yIHUgaW4gdW5zYWZlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlcy5xdW90ZSgndGVzdCVzbmFtZScgJSB1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIndGVzdCVzbmFtZSciICUgdSkKKyAgICAgICAgZm9yIHUgaW4gdW5zYWZlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwaXBlcy5xdW90ZSgidGVzdCVzJ25hbWUnIiAlIHUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3Rlc3QlcydcIidcIiduYW1lJ1wiJ1wiJyciICUgdSkKKworICAgIGRlZiB0ZXN0UmVwcihzZWxmKToKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLCAiPFRlbXBsYXRlIGluc3RhbmNlLCBzdGVwcz1bXT4iKQorICAgICAgICB0LmFwcGVuZCgndHIgYS16IEEtWicsIHBpcGVzLlNURElOX1NURE9VVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHQpLAorICAgICAgICAgICAgICAgICAgICAiPFRlbXBsYXRlIGluc3RhbmNlLCBzdGVwcz1bKCd0ciBhLXogQS1aJywgJy0tJyldPiIpCisKKyAgICBkZWYgdGVzdFNldERlYnVnKHNlbGYpOgorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICB0LmRlYnVnKEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZGVidWdnaW5nLCBGYWxzZSkKKyAgICAgICAgdC5kZWJ1ZyhUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZGVidWdnaW5nLCBUcnVlKQorCisgICAgZGVmIHRlc3RSZWFkT3BlblNpbmsoc2VsZik6CisgICAgICAgICMgY2hlY2sgY2FsbGluZyBvcGVuKCdyJykgb24gYSBwaXBlIGVuZGluZyB3aXRoCisgICAgICAgICMgYSBzaW5rIHJhaXNlcyBWYWx1ZUVycm9yCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQuYXBwZW5kKCdib2d1c2NtZCcsIHBpcGVzLlNJTkspCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQub3BlbiwgJ2JvZ3VzZmlsZScsICdyJykKKworICAgIGRlZiB0ZXN0V3JpdGVPcGVuU291cmNlKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGNhbGxpbmcgb3BlbigndycpIG9uIGEgcGlwZSBlbmRpbmcgd2l0aAorICAgICAgICAjIGEgc291cmNlIHJhaXNlcyBWYWx1ZUVycm9yCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHQucHJlcGVuZCgnYm9ndXNjbWQnLCBwaXBlcy5TT1VSQ0UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQub3BlbiwgJ2JvZ3VzZmlsZScsICd3JykKKworICAgIGRlZiB0ZXN0QmFkQXBwZW5kT3B0aW9ucyhzZWxmKToKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKworICAgICAgICAjIHRyeSBhIG5vbi1zdHJpbmcgY29tbWFuZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQuYXBwZW5kLCA3LCBwaXBlcy5TVERJTl9TVERPVVQpCisKKyAgICAgICAgIyB0cnkgYSB0eXBlIHRoYXQgaXNuJ3QgcmVjb2duaXplZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LmFwcGVuZCwgJ2JvZ3VzY21kJywgJ3h4JykKKworICAgICAgICAjIHNob3VsZG4ndCBiZSBhYmxlIHRvIGFwcGVuZCBhIHNvdXJjZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LmFwcGVuZCwgJ2JvZ3VzY21kJywgcGlwZXMuU09VUkNFKQorCisgICAgICAgICMgY2hlY2sgYXBwZW5kaW5nIHR3byBzaW5rcworICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICB0LmFwcGVuZCgnYm9ndXNjbWQnLCBwaXBlcy5TSU5LKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LmFwcGVuZCwgJ2JvZ3VzY21kJywgcGlwZXMuU0lOSykKKworICAgICAgICAjIGNvbW1hbmQgbmVlZGluZyBmaWxlIGlucHV0IGJ1dCB3aXRoIG5vICRJTgorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LmFwcGVuZCwgJ2JvZ3VzY21kICRPVVQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXMuRklMRUlOX0ZJTEVPVVQpCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuYXBwZW5kLCAnYm9ndXNjbWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZXMuRklMRUlOX1NURE9VVCkKKworICAgICAgICAjIGNvbW1hbmQgbmVlZGluZyBmaWxlIG91dHB1dCBidXQgd2l0aCBubyAkT1VUCisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQuYXBwZW5kLCAnYm9ndXNjbWQgJElOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzLkZJTEVJTl9GSUxFT1VUKQorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LmFwcGVuZCwgJ2JvZ3VzY21kJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzLlNURElOX0ZJTEVPVVQpCisKKworICAgIGRlZiB0ZXN0QmFkUHJlcGVuZE9wdGlvbnMoc2VsZik6CisgICAgICAgIHQgPSBwaXBlcy5UZW1wbGF0ZSgpCisKKyAgICAgICAgIyB0cnkgYSBub24tc3RyaW5nIGNvbW1hbmQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0LnByZXBlbmQsIDcsIHBpcGVzLlNURElOX1NURE9VVCkKKworICAgICAgICAjIHRyeSBhIHR5cGUgdGhhdCBpc24ndCByZWNvZ25pemVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQucHJlcGVuZCwgJ3RyIGEteiBBLVonLCAneHgnKQorCisgICAgICAgICMgc2hvdWxkbid0IGJlIGFibGUgdG8gcHJlcGVuZCBhIHNpbmsKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5wcmVwZW5kLCAnYm9ndXNjbWQnLCBwaXBlcy5TSU5LKQorCisgICAgICAgICMgY2hlY2sgcHJlcGVuZGluZyB0d28gc291cmNlcworICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICB0LnByZXBlbmQoJ2JvZ3VzY21kJywgcGlwZXMuU09VUkNFKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnByZXBlbmQsICdib2d1c2NtZCcsIHBpcGVzLlNPVVJDRSkKKworICAgICAgICAjIGNvbW1hbmQgbmVlZGluZyBmaWxlIGlucHV0IGJ1dCB3aXRoIG5vICRJTgorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnByZXBlbmQsICdib2d1c2NtZCAkT1VUJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzLkZJTEVJTl9GSUxFT1VUKQorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnByZXBlbmQsICdib2d1c2NtZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlcy5GSUxFSU5fU1RET1VUKQorCisgICAgICAgICMgY29tbWFuZCBuZWVkaW5nIGZpbGUgb3V0cHV0IGJ1dCB3aXRoIG5vICRPVVQKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5wcmVwZW5kLCAnYm9ndXNjbWQgJElOJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVzLkZJTEVJTl9GSUxFT1VUKQorICAgICAgICB0ID0gcGlwZXMuVGVtcGxhdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0LnByZXBlbmQsICdib2d1c2NtZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXBlcy5TVERJTl9GSUxFT1VUKQorCisgICAgZGVmIHRlc3RCYWRPcGVuTW9kZShzZWxmKToKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdC5vcGVuLCAnYm9ndXNmaWxlJywgJ3gnKQorCisgICAgZGVmIHRlc3RDbG9uZShzZWxmKToKKyAgICAgICAgdCA9IHBpcGVzLlRlbXBsYXRlKCkKKyAgICAgICAgdC5hcHBlbmQoJ3RyIGEteiBBLVonLCBwaXBlcy5TVERJTl9TVERPVVQpCisKKyAgICAgICAgdSA9IHQuY2xvbmUoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHQpLCBpZCh1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnN0ZXBzLCB1LnN0ZXBzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHQuc3RlcHMpLCBpZCh1LnN0ZXBzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmRlYnVnZ2luZywgdS5kZWJ1Z2dpbmcpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoU2ltcGxlUGlwZVRlc3RzKQorICAgIHJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waXBlcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waXBlcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkNTA0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waXBlcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9waXBlcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkNTA0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BpcGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2cucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2cucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxNjU5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZy5weQpAQCAtMCwwICsxLDI5MiBAQAorIyBUZXN0IHBhY2thZ2VzIChkb3R0ZWQtbmFtZSBpbXBvcnQpCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCisjIEhlbHBlcnMgdG8gY3JlYXRlIGFuZCBkZXN0cm95IGhpZXJhcmNoaWVzLgorCitkZWYgY2xlYW5vdXQocm9vdCk6CisgICAgbmFtZXMgPSBvcy5saXN0ZGlyKHJvb3QpCisgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5qb2luKHJvb3QsIG5hbWUpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZnVsbG5hbWUpOgorICAgICAgICAgICAgY2xlYW5vdXQoZnVsbG5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvcy5yZW1vdmUoZnVsbG5hbWUpCisgICAgb3Mucm1kaXIocm9vdCkKKworZGVmIGZpeGRpcihsc3QpOgorICAgIGlmICJfX2J1aWx0aW5zX18iIGluIGxzdDoKKyAgICAgICAgbHN0LnJlbW92ZSgiX19idWlsdGluc19fIikKKyAgICByZXR1cm4gbHN0CisKKworIyBYWFggVGhpbmdzIHRvIHRlc3QKKyMKKyMgaW1wb3J0IHBhY2thZ2Ugd2l0aG91dCBfX2luaXRfXworIyBpbXBvcnQgcGFja2FnZSB3aXRoIF9faW5pdF9fCisjIF9faW5pdF9fIGltcG9ydGluZyBzdWJtb2R1bGUKKyMgX19pbml0X18gaW1wb3J0aW5nIGdsb2JhbCBtb2R1bGUKKyMgX19pbml0X18gZGVmaW5pbmcgdmFyaWFibGVzCisjIHN1Ym1vZHVsZSBpbXBvcnRpbmcgb3RoZXIgc3VibW9kdWxlCisjIHN1Ym1vZHVsZSBpbXBvcnRpbmcgZ2xvYmFsIG1vZHVsZQorIyBzdWJtb2R1bGUgaW1wb3J0IHN1Ym1vZHVsZSB2aWEgZ2xvYmFsIG5hbWUKKyMgZnJvbSBwYWNrYWdlIGltcG9ydCBzdWJtb2R1bGUKKyMgZnJvbSBwYWNrYWdlIGltcG9ydCBzdWJwYWNrYWdlCisjIGZyb20gcGFja2FnZSBpbXBvcnQgdmFyaWFibGUgKGRlZmluZWQgaW4gX19pbml0X18pCisjIGZyb20gcGFja2FnZSBpbXBvcnQgKiAoZGVmaW5lZCBpbiBfX2luaXRfXykKKworCitjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5yb290ID0gTm9uZQorICAgICAgICBzZWxmLnBrZ25hbWUgPSBOb25lCisgICAgICAgIHNlbGYuc3lzcGF0aCA9IGxpc3Qoc3lzLnBhdGgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5zeXNwYXRoCisgICAgICAgIGlmIHNlbGYucm9vdDogIyBPbmx5IGNsZWFuIGlmIHRoZSB0ZXN0IHdhcyBhY3R1YWxseSBydW4KKyAgICAgICAgICAgIGNsZWFub3V0KHNlbGYucm9vdCkKKworICAgICAgICAjIGRlbGV0ZSBhbGwgbW9kdWxlcyBjb25jZXJuaW5nIHRoZSB0ZXN0ZWQgaGllcmFyY2h5CisgICAgICAgIGlmIHNlbGYucGtnbmFtZToKKyAgICAgICAgICAgIG1vZHVsZXMgPSBbbmFtZSBmb3IgbmFtZSBpbiBzeXMubW9kdWxlcworICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnBrZ25hbWUgaW4gbmFtZS5zcGxpdCgnLicpXQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gbW9kdWxlczoKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbmFtZV0KKworICAgIGRlZiBydW5fY29kZShzZWxmLCBjb2RlKToKKyAgICAgICAgZXhlYyh0ZXh0d3JhcC5kZWRlbnQoY29kZSksIGdsb2JhbHMoKSwgeyJzZWxmIjogc2VsZn0pCisKKyAgICBkZWYgbWtoaWVyKHNlbGYsIGRlc2NyKToKKyAgICAgICAgcm9vdCA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgcm9vdCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIocm9vdCk6CisgICAgICAgICAgICBvcy5ta2Rpcihyb290KQorICAgICAgICBmb3IgbmFtZSwgY29udGVudHMgaW4gZGVzY3I6CisgICAgICAgICAgICBjb21wcyA9IG5hbWUuc3BsaXQoKQorICAgICAgICAgICAgZnVsbG5hbWUgPSByb290CisgICAgICAgICAgICBmb3IgYyBpbiBjb21wczoKKyAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihmdWxsbmFtZSwgYykKKyAgICAgICAgICAgIGlmIGNvbnRlbnRzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgb3MubWtkaXIoZnVsbG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZ1bGxuYW1lLCAidyIpCisgICAgICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKKyAgICAgICAgICAgICAgICBpZiBjb250ZW50cyBhbmQgY29udGVudHNbLTFdICE9ICdcbic6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJ1xuJykKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5yb290ID0gcm9vdAorICAgICAgICAjIHBhY2thZ2UgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgaXRlbQorICAgICAgICBzZWxmLnBrZ25hbWUgPSBkZXNjclswXVswXQorCisgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgaGllciA9IFsoInQxIiwgTm9uZSksICgidDEgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiIildCisgICAgICAgIHNlbGYubWtoaWVyKGhpZXIpCisgICAgICAgIGltcG9ydCB0MQorCisgICAgZGVmIHRlc3RfMihzZWxmKToKKyAgICAgICAgaGllciA9IFsKKyAgICAgICAgICgidDIiLCBOb25lKSwKKyAgICAgICAgICgidDIgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiJ2RvYyBmb3IgdDInIiksCisgICAgICAgICAoInQyIHN1YiIsIE5vbmUpLAorICAgICAgICAgKCJ0MiBzdWIgX19pbml0X18iK29zLmV4dHNlcCsicHkiLCAiIiksCisgICAgICAgICAoInQyIHN1YiBzdWJzdWIiLCBOb25lKSwKKyAgICAgICAgICgidDIgc3ViIHN1YnN1YiBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICJzcGFtID0gMSIpLAorICAgICAgICBdCisgICAgICAgIHNlbGYubWtoaWVyKGhpZXIpCisKKyAgICAgICAgaW1wb3J0IHQyLnN1YgorICAgICAgICBpbXBvcnQgdDIuc3ViLnN1YnN1YgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLl9fbmFtZV9fLCAidDIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLnN1Yi5fX25hbWVfXywgInQyLnN1YiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuc3ViLnN1YnN1Yi5fX25hbWVfXywgInQyLnN1Yi5zdWJzdWIiKQorCisgICAgICAgICMgVGhpcyBleGVjIGNyYXAgaXMgbmVlZGVkIGJlY2F1c2UgUHkzayBmb3JiaWRzICdpbXBvcnQgKicgb3V0c2lkZQorICAgICAgICAjIG9mIG1vZHVsZS1zY29wZSBhbmQgX19pbXBvcnRfXygpIGlzIGluc3VmZmljaWVudCBmb3Igd2hhdCB3ZSBuZWVkLgorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBpbXBvcnQgdDIKKyAgICAgICAgICAgIGZyb20gdDIgaW1wb3J0ICoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKCksIFsnc2VsZicsICdzdWInLCAndDInXSkKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLnJ1bl9jb2RlKHMpCisKKyAgICAgICAgZnJvbSB0MiBpbXBvcnQgc3ViCisgICAgICAgIGZyb20gdDIuc3ViIGltcG9ydCBzdWJzdWIKKyAgICAgICAgZnJvbSB0Mi5zdWIuc3Vic3ViIGltcG9ydCBzcGFtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3ViLl9fbmFtZV9fLCAidDIuc3ViIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJzdWIuX19uYW1lX18sICJ0Mi5zdWIuc3Vic3ViIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWIuc3Vic3ViLl9fbmFtZV9fLCAidDIuc3ViLnN1YnN1YiIpCisgICAgICAgIGZvciBuYW1lIGluIFsnc3BhbScsICdzdWInLCAnc3Vic3ViJywgJ3QyJ106CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG9jYWxzKClbIm5hbWUiXSwgIkZhaWxlZCB0byBpbXBvcnQgJXMiICUgbmFtZSkKKworICAgICAgICBpbXBvcnQgdDIuc3ViCisgICAgICAgIGltcG9ydCB0Mi5zdWIuc3Vic3ViCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuX19uYW1lX18sICJ0MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuc3ViLl9fbmFtZV9fLCAidDIuc3ViIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi5zdWIuc3Vic3ViLl9fbmFtZV9fLCAidDIuc3ViLnN1YnN1YiIpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZnJvbSB0MiBpbXBvcnQgKgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcigpLCBbJ3NlbGYnLCAnc3ViJ10pCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ydW5fY29kZShzKQorCisgICAgZGVmIHRlc3RfMyhzZWxmKToKKyAgICAgICAgaGllciA9IFsKKyAgICAgICAgICAgICAgICAoInQzIiwgTm9uZSksCisgICAgICAgICAgICAgICAgKCJ0MyBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICIiKSwKKyAgICAgICAgICAgICAgICAoInQzIHN1YiIsIE5vbmUpLAorICAgICAgICAgICAgICAgICgidDMgc3ViIF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAgICAgICAgICgidDMgc3ViIHN1YnN1YiIsIE5vbmUpLAorICAgICAgICAgICAgICAgICgidDMgc3ViIHN1YnN1YiBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICJzcGFtID0gMSIpLAorICAgICAgICAgICAgICAgXQorICAgICAgICBzZWxmLm1raGllcihoaWVyKQorCisgICAgICAgIGltcG9ydCB0My5zdWIuc3Vic3ViCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMuX19uYW1lX18sICJ0MyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMuc3ViLl9fbmFtZV9fLCAidDMuc3ViIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5zdWIuc3Vic3ViLl9fbmFtZV9fLCAidDMuc3ViLnN1YnN1YiIpCisKKyAgICBkZWYgdGVzdF80KHNlbGYpOgorICAgICAgICBoaWVyID0gWworICAgICAgICAoInQ0LnB5IiwgInJhaXNlIFJ1bnRpbWVFcnJvcignU2hvdWxkbnQgbG9hZCB0NC5weScpIiksCisgICAgICAgICgidDQiLCBOb25lKSwKKyAgICAgICAgKCJ0NCBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICIiKSwKKyAgICAgICAgKCJ0NCBzdWIucHkiLCAicmFpc2UgUnVudGltZUVycm9yKCdTaG91bGRudCBsb2FkIHN1Yi5weScpIiksCisgICAgICAgICgidDQgc3ViIiwgTm9uZSksCisgICAgICAgICgidDQgc3ViIF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAoInQ0IHN1YiBzdWJzdWIiK29zLmV4dHNlcCsicHkiLAorICAgICAgICAgInJhaXNlIFJ1bnRpbWVFcnJvcignU2hvdWxkbnQgbG9hZCBzdWJzdWIucHknKSIpLAorICAgICAgICAoInQ0IHN1YiBzdWJzdWIiLCBOb25lKSwKKyAgICAgICAgKCJ0NCBzdWIgc3Vic3ViIF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgInNwYW0gPSAxIiksCisgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYubWtoaWVyKGhpZXIpCisKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgZnJvbSB0NC5zdWIuc3Vic3ViIGltcG9ydCAqCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwYW0sIDEpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ydW5fY29kZShzKQorCisgICAgZGVmIHRlc3RfNShzZWxmKToKKyAgICAgICAgaGllciA9IFsKKyAgICAgICAgKCJ0NSIsIE5vbmUpLAorICAgICAgICAoInQ1IF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgImltcG9ydCB0NS5mb28iKSwKKyAgICAgICAgKCJ0NSBzdHJpbmciK29zLmV4dHNlcCsicHkiLCAic3BhbSA9IDEiKSwKKyAgICAgICAgKCJ0NSBmb28iK29zLmV4dHNlcCsicHkiLAorICAgICAgICAgImZyb20gLiBpbXBvcnQgc3RyaW5nOyBhc3NlcnQgc3RyaW5nLnNwYW0gPT0gMSIpLAorICAgICAgICAgXQorICAgICAgICBzZWxmLm1raGllcihoaWVyKQorCisgICAgICAgIGltcG9ydCB0NQorICAgICAgICBzID0gIiIiCisgICAgICAgICAgICBmcm9tIHQ1IGltcG9ydCAqCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcigpLCBbJ2ZvbycsICdzZWxmJywgJ3N0cmluZycsICd0NSddKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYucnVuX2NvZGUocykKKworICAgICAgICBpbXBvcnQgdDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXhkaXIoZGlyKHQ1KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJywgJ19fcGF0aF9fJywgJ2ZvbycsICdzdHJpbmcnLCAndDUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXhkaXIoZGlyKHQ1LmZvbykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnX19kb2NfXycsICdfX2ZpbGVfXycsICdfX25hbWVfXycsICdfX3BhY2thZ2VfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXhkaXIoZGlyKHQ1LnN0cmluZykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnX19kb2NfXycsICdfX2ZpbGVfXycsICdfX25hbWVfXycsJ19fcGFja2FnZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NwYW0nXSkKKworICAgIGRlZiB0ZXN0XzYoc2VsZik6CisgICAgICAgIGhpZXIgPSBbCisgICAgICAgICAgICAgICAgKCJ0NiIsIE5vbmUpLAorICAgICAgICAgICAgICAgICgidDYgX19pbml0X18iK29zLmV4dHNlcCsicHkiLAorICAgICAgICAgICAgICAgICAiX19hbGxfXyA9IFsnc3BhbScsICdoYW0nLCAnZWdncyddIiksCisgICAgICAgICAgICAgICAgKCJ0NiBzcGFtIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAgICAgICAgICgidDYgaGFtIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAgICAgICAgICgidDYgZWdncyIrb3MuZXh0c2VwKyJweSIsICIiKSwKKyAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5ta2hpZXIoaGllcikKKworICAgICAgICBpbXBvcnQgdDYKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXhkaXIoZGlyKHQ2KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2FsbF9fJywgJ19fZG9jX18nLCAnX19maWxlX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnX19uYW1lX18nLCAnX19wYWNrYWdlX18nLCAnX19wYXRoX18nXSkKKyAgICAgICAgcyA9ICIiIgorICAgICAgICAgICAgaW1wb3J0IHQ2CisgICAgICAgICAgICBmcm9tIHQ2IGltcG9ydCAqCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodDYpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2FsbF9fJywgJ19fZG9jX18nLCAnX19maWxlX18nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fbmFtZV9fJywgJ19fcGFja2FnZV9fJywgJ19fcGF0aF9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlZ2dzJywgJ2hhbScsICdzcGFtJ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcigpLCBbJ2VnZ3MnLCAnaGFtJywgJ3NlbGYnLCAnc3BhbScsICd0NiddKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYucnVuX2NvZGUocykKKworICAgIGRlZiB0ZXN0Xzcoc2VsZik6CisgICAgICAgIGhpZXIgPSBbCisgICAgICAgICAgICAgICAgKCJ0NyIsIE5vbmUpLAorICAgICAgICAgICAgICAgICgidDciK29zLmV4dHNlcCsicHkiLCAiIiksCisgICAgICAgICAgICAgICAgKCJ0NyBfX2luaXRfXyIrb3MuZXh0c2VwKyJweSIsICIiKSwKKyAgICAgICAgICAgICAgICAoInQ3IHN1YiIrb3MuZXh0c2VwKyJweSIsCisgICAgICAgICAgICAgICAgICJyYWlzZSBSdW50aW1lRXJyb3IoJ1Nob3VsZG50IGxvYWQgc3ViLnB5JykiKSwKKyAgICAgICAgICAgICAgICAoInQ3IHN1YiIsIE5vbmUpLAorICAgICAgICAgICAgICAgICgidDcgc3ViIF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgIiIpLAorICAgICAgICAgICAgICAgICgidDcgc3ViICIrb3MuZXh0c2VwKyJweSIsCisgICAgICAgICAgICAgICAgICJyYWlzZSBSdW50aW1lRXJyb3IoJ1Nob3VsZG50IGxvYWQgc3Vic3ViLnB5JykiKSwKKyAgICAgICAgICAgICAgICAoInQ3IHN1YiBzdWJzdWIiLCBOb25lKSwKKyAgICAgICAgICAgICAgICAoInQ3IHN1YiBzdWJzdWIgX19pbml0X18iK29zLmV4dHNlcCsicHkiLAorICAgICAgICAgICAgICAgICAic3BhbSA9IDEiKSwKKyAgICAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5ta2hpZXIoaGllcikKKworCisgICAgICAgIHQ3LCBzdWIsIHN1YnN1YiA9IE5vbmUsIE5vbmUsIE5vbmUKKyAgICAgICAgaW1wb3J0IHQ3IGFzIHRhcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodGFzKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJywgJ19fcGF0aF9fJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDcpCisgICAgICAgIGZyb20gdDcgaW1wb3J0IHN1YiBhcyBzdWJwYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXhkaXIoZGlyKHN1YnBhcikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnX19kb2NfXycsICdfX2ZpbGVfXycsICdfX25hbWVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3BhY2thZ2VfXycsICdfX3BhdGhfXyddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQ3KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN1YikKKyAgICAgICAgZnJvbSB0Ny5zdWIgaW1wb3J0IHN1YnN1YiBhcyBzdWJzdWJzdWIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaXhkaXIoZGlyKHN1YnN1YnN1YikpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnX19kb2NfXycsICdfX2ZpbGVfXycsICdfX25hbWVfXycsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJywgJ19fcGF0aF9fJywgJ3NwYW0nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0NykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3Vic3ViKQorICAgICAgICBmcm9tIHQ3LnN1Yi5zdWJzdWIgaW1wb3J0IHNwYW0gYXMgaGFtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFtLCAxKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQ3KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN1YikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWJzdWIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF84KHNlbGYpOgorICAgICAgICBoaWVyID0gWworICAgICAgICAgICAgICAgICgidDgiLCBOb25lKSwKKyAgICAgICAgICAgICAgICAoInQ4IF9faW5pdF9fIitvcy5leHRzZXArInB5IiwgIidkb2MgZm9yIHQ4JyIpLAorICAgICAgICAgICAgICAgXQorICAgICAgICBzZWxmLm1raGllcihoaWVyKQorCisgICAgICAgIGltcG9ydCB0OAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQ4Ll9fZG9jX18sICJkb2MgZm9yIHQ4IikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlN2QxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlN2QxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZDQ4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2dpbXBvcnQucHkKQEAgLTAsMCArMSw4MyBAQAoraW1wb3J0IG9zLCBzeXMsIHN0cmluZywgcmFuZG9tLCB0ZW1wZmlsZSwgdW5pdHRlc3QKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIFRlc3RJbXBvcnQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgc2VsZi5wYWNrYWdlX25hbWUgPSAnUEFDS0FHRV8nCisgICAgICAgIHdoaWxlIHNlbGYucGFja2FnZV9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX25hbWUgKz0gcmFuZG9tLmNob29zZShzdHJpbmcubGV0dGVycykKKyAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IHNlbGYucGFja2FnZV9uYW1lICsgJy5mb28nCisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQorCisgICAgZGVmIHJlbW92ZV9tb2R1bGVzKHNlbGYpOgorICAgICAgICBmb3IgbW9kdWxlX25hbWUgaW4gKHNlbGYucGFja2FnZV9uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKToKKyAgICAgICAgICAgIGlmIG1vZHVsZV9uYW1lIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzeXMucGF0aC5hcHBlbmQoc2VsZi50ZXN0X2RpcikKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RpciA9IG9zLnBhdGguam9pbihzZWxmLnRlc3RfZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZV9uYW1lKQorICAgICAgICBvcy5ta2RpcihzZWxmLnBhY2thZ2VfZGlyKQorICAgICAgICBvcGVuKG9zLnBhdGguam9pbigKKyAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfZGlyLCAnX19pbml0X18nK29zLmV4dHNlcCsncHknKSwgJ3cnKS5jbG9zZSgpCisgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5wYWNrYWdlX2RpciwgJ2Zvbycrb3MuZXh0c2VwKydweScpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBmaWxlIGluIG9zLmxpc3RkaXIoc2VsZi5wYWNrYWdlX2Rpcik6CisgICAgICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHNlbGYucGFja2FnZV9kaXIsIGZpbGUpKQorICAgICAgICBvcy5ybWRpcihzZWxmLnBhY2thZ2VfZGlyKQorICAgICAgICBvcy5ybWRpcihzZWxmLnRlc3RfZGlyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN5cy5wYXRoLmNvdW50KHNlbGYudGVzdF9kaXIpLCAwKQorICAgICAgICBzeXMucGF0aC5yZW1vdmUoc2VsZi50ZXN0X2RpcikKKyAgICAgICAgc2VsZi5yZW1vdmVfbW9kdWxlcygpCisKKyAgICBkZWYgcmV3cml0ZV9maWxlKHNlbGYsIGNvbnRlbnRzKToKKyAgICAgICAgZm9yIGV4dGVuc2lvbiBpbiAiY28iOgorICAgICAgICAgICAgY29tcGlsZWRfcGF0aCA9IHNlbGYubW9kdWxlX3BhdGggKyBleHRlbnNpb24KKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGNvbXBpbGVkX3BhdGgpOgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShjb21waWxlZF9wYXRoKQorICAgICAgICBmID0gb3BlbihzZWxmLm1vZHVsZV9wYXRoLCAndycpCisgICAgICAgIGYud3JpdGUoY29udGVudHMpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfcGFja2FnZV9pbXBvcnRfX3NlbWFudGljcyhzZWxmKToKKworICAgICAgICAjIEdlbmVyYXRlIGEgY291cGxlIG9mIGJyb2tlbiBtb2R1bGVzIHRvIHRyeSBpbXBvcnRpbmcuCisKKyAgICAgICAgIyAuLi50cnkgbG9hZGluZyB0aGUgbW9kdWxlIHdoZW4gdGhlcmUncyBhIFN5bnRheEVycm9yCisgICAgICAgIHNlbGYucmV3cml0ZV9maWxlKCdmb3InKQorICAgICAgICB0cnk6IF9faW1wb3J0X18oc2VsZi5tb2R1bGVfbmFtZSkKKyAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHJhaXNlIFJ1bnRpbWVFcnJvciwgJ0ZhaWxlZCB0byBpbmR1Y2UgU3ludGF4RXJyb3InCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oc2VsZi5tb2R1bGVfbmFtZSwgc3lzLm1vZHVsZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihzeXMubW9kdWxlc1tzZWxmLnBhY2thZ2VfbmFtZV0sICdmb28nKSkKKworICAgICAgICAjIC4uLm1ha2UgdXAgYSB2YXJpYWJsZSBuYW1lIHRoYXQgaXNuJ3QgYm91bmQgaW4gX19idWlsdGluc19fCisgICAgICAgIHZhciA9ICdhJworICAgICAgICB3aGlsZSB2YXIgaW4gZGlyKF9fYnVpbHRpbnNfXyk6CisgICAgICAgICAgICB2YXIgKz0gcmFuZG9tLmNob29zZShzdHJpbmcubGV0dGVycykKKworICAgICAgICAjIC4uLm1ha2UgYSBtb2R1bGUgdGhhdCBqdXN0IGNvbnRhaW5zIHRoYXQKKyAgICAgICAgc2VsZi5yZXdyaXRlX2ZpbGUodmFyKQorCisgICAgICAgIHRyeTogX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lKQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHJhaXNlIFJ1bnRpbWVFcnJvciwgJ0ZhaWxlZCB0byBpbmR1Y2UgTmFtZUVycm9yLicKKworICAgICAgICAjIC4uLm5vdyAgY2hhbmdlICB0aGUgbW9kdWxlICBzbyAgdGhhdCAgdGhlIE5hbWVFcnJvciAgZG9lc24ndAorICAgICAgICAjIGhhcHBlbgorICAgICAgICBzZWxmLnJld3JpdGVfZmlsZSgnJXMgPSAxJyAlIHZhcikKKyAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lKS5mb28KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRhdHRyKG1vZHVsZSwgdmFyKSwgMSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RJbXBvcnQpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3N2U4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3N2U4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGtndXRpbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY2NWU5NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHkKQEAgLTAsMCArMSwxNDEgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgaW1wCitpbXBvcnQgcGtndXRpbAoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgemlwZmlsZQorCisKKworY2xhc3MgUGtndXRpbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5kaXJuYW1lID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzaHV0aWwucm10cmVlLCBzZWxmLmRpcm5hbWUpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzZWxmLmRpcm5hbWUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgZGVmIHRlc3RfZ2V0ZGF0YV9maWxlc3lzKHNlbGYpOgorICAgICAgICBwa2cgPSAndGVzdF9nZXRkYXRhX2ZpbGVzeXMnCisKKyAgICAgICAgIyBJbmNsdWRlIGEgTEYgYW5kIGEgQ1JMRiwgdG8gdGVzdCB0aGF0IGJpbmFyeSBkYXRhIGlzIHJlYWQgYmFjaworICAgICAgICBSRVNPVVJDRV9EQVRBID0gJ0hlbGxvLCB3b3JsZCFcblNlY29uZCBsaW5lXHJcblRoaXJkIGxpbmUnCisKKyAgICAgICAgIyBNYWtlIGEgcGFja2FnZSB3aXRoIHNvbWUgcmVzb3VyY2VzCisgICAgICAgIHBhY2thZ2VfZGlyID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgcGtnKQorICAgICAgICBvcy5ta2RpcihwYWNrYWdlX2RpcikKKyAgICAgICAgIyBFbXB0eSBpbml0LnB5CisgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgJ19faW5pdF9fLnB5JyksICJ3YiIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAjIFJlc291cmNlIGZpbGVzLCByZXMudHh0LCBzdWIvcmVzLnR4dAorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICdyZXMudHh0JyksICJ3YiIpCisgICAgICAgIGYud3JpdGUoUkVTT1VSQ0VfREFUQSkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihwYWNrYWdlX2RpciwgJ3N1YicpKQorICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4ocGFja2FnZV9kaXIsICdzdWInLCAncmVzLnR4dCcpLCAid2IiKQorICAgICAgICBmLndyaXRlKFJFU09VUkNFX0RBVEEpCisgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICMgQ2hlY2sgd2UgY2FuIHJlYWQgdGhlIHJlc291cmNlcworICAgICAgICByZXMxID0gcGtndXRpbC5nZXRfZGF0YShwa2csICdyZXMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMxLCBSRVNPVVJDRV9EQVRBKQorICAgICAgICByZXMyID0gcGtndXRpbC5nZXRfZGF0YShwa2csICdzdWIvcmVzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzMiwgUkVTT1VSQ0VfREFUQSkKKworICAgICAgICBkZWwgc3lzLm1vZHVsZXNbcGtnXQorCisgICAgZGVmIHRlc3RfZ2V0ZGF0YV96aXBmaWxlKHNlbGYpOgorICAgICAgICB6aXAgPSAndGVzdF9nZXRkYXRhX3ppcGZpbGUuemlwJworICAgICAgICBwa2cgPSAndGVzdF9nZXRkYXRhX3ppcGZpbGUnCisKKyAgICAgICAgIyBJbmNsdWRlIGEgTEYgYW5kIGEgQ1JMRiwgdG8gdGVzdCB0aGF0IGJpbmFyeSBkYXRhIGlzIHJlYWQgYmFjaworICAgICAgICBSRVNPVVJDRV9EQVRBID0gJ0hlbGxvLCB3b3JsZCFcblNlY29uZCBsaW5lXHJcblRoaXJkIGxpbmUnCisKKyAgICAgICAgIyBNYWtlIGEgcGFja2FnZSB3aXRoIHNvbWUgcmVzb3VyY2VzCisgICAgICAgIHppcF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgemlwKQorICAgICAgICB6ID0gemlwZmlsZS5aaXBGaWxlKHppcF9maWxlLCAndycpCisKKyAgICAgICAgIyBFbXB0eSBpbml0LnB5CisgICAgICAgIHoud3JpdGVzdHIocGtnICsgJy9fX2luaXRfXy5weScsICIiKQorICAgICAgICAjIFJlc291cmNlIGZpbGVzLCByZXMudHh0LCBzdWIvcmVzLnR4dAorICAgICAgICB6LndyaXRlc3RyKHBrZyArICcvcmVzLnR4dCcsIFJFU09VUkNFX0RBVEEpCisgICAgICAgIHoud3JpdGVzdHIocGtnICsgJy9zdWIvcmVzLnR4dCcsIFJFU09VUkNFX0RBVEEpCisgICAgICAgIHouY2xvc2UoKQorCisgICAgICAgICMgQ2hlY2sgd2UgY2FuIHJlYWQgdGhlIHJlc291cmNlcworICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgemlwX2ZpbGUpCisgICAgICAgIHJlczEgPSBwa2d1dGlsLmdldF9kYXRhKHBrZywgJ3Jlcy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlczEsIFJFU09VUkNFX0RBVEEpCisgICAgICAgIHJlczIgPSBwa2d1dGlsLmdldF9kYXRhKHBrZywgJ3N1Yi9yZXMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMyLCBSRVNPVVJDRV9EQVRBKQorICAgICAgICBkZWwgc3lzLnBhdGhbMF0KKworICAgICAgICBkZWwgc3lzLm1vZHVsZXNbcGtnXQorCisgICAgZGVmIHRlc3RfdW5yZWFkYWJsZV9kaXJfb25fc3lzcGF0aChzZWxmKToKKyAgICAgICAgIyBpc3N1ZTczNjcgLSB3YWxrX3BhY2thZ2VzIGZhaWxlZCBpZiB1bnJlYWRhYmxlIGRpciBvbiBzeXMucGF0aAorICAgICAgICBwYWNrYWdlX25hbWUgPSAidW5yZWFkYWJsZV9wYWNrYWdlIgorICAgICAgICBkID0gb3MucGF0aC5qb2luKHNlbGYuZGlybmFtZSwgcGFja2FnZV9uYW1lKQorICAgICAgICAjIHRoaXMgZG9lcyBub3QgYXBwZWFyIHRvIGNyZWF0ZSBhbiB1bnJlYWRhYmxlIGRpciBvbiBXaW5kb3dzCisgICAgICAgICMgICBidXQgdGhlIHRlc3Qgc2hvdWxkIG5vdCBmYWlsIGFueXdheQorICAgICAgICBvcy5ta2RpcihkLCAwKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3Mucm1kaXIsIGQpCisgICAgICAgIGZvciB0IGluIHBrZ3V0aWwud2Fsa19wYWNrYWdlcyhwYXRoPVtzZWxmLmRpcm5hbWVdKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidW5leHBlY3RlZCBwYWNrYWdlIGZvdW5kIikKKworY2xhc3MgUGtndXRpbFBFUDMwMlRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGNsYXNzIE15VGVzdExvYWRlcihvYmplY3QpOgorICAgICAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICAgICAgIyBDcmVhdGUgYW4gZW1wdHkgbW9kdWxlCisgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlcy5zZXRkZWZhdWx0KGZ1bGxuYW1lLCBpbXAubmV3X21vZHVsZShmdWxsbmFtZSkpCisgICAgICAgICAgICBtb2QuX19maWxlX18gPSAiPCVzPiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICAgICAgbW9kLl9fbG9hZGVyX18gPSBzZWxmCisgICAgICAgICAgICAjIE1ha2UgaXQgYSBwYWNrYWdlCisgICAgICAgICAgICBtb2QuX19wYXRoX18gPSBbXQorICAgICAgICAgICAgIyBDb3VudCBob3cgbWFueSB0aW1lcyB0aGUgbW9kdWxlIGlzIHJlbG9hZGVkCisgICAgICAgICAgICBtb2QuX19kaWN0X19bJ2xvYWRzJ10gPSBtb2QuX19kaWN0X18uZ2V0KCdsb2FkcycsMCkgKyAxCisgICAgICAgICAgICByZXR1cm4gbW9kCisKKyAgICAgICAgZGVmIGdldF9kYXRhKHNlbGYsIHBhdGgpOgorICAgICAgICAgICAgcmV0dXJuICJIZWxsbywgd29ybGQhIgorCisgICAgY2xhc3MgTXlUZXN0SW1wb3J0ZXIob2JqZWN0KToKKyAgICAgICAgZGVmIGZpbmRfbW9kdWxlKHNlbGYsIGZ1bGxuYW1lLCBwYXRoPU5vbmUpOgorICAgICAgICAgICAgcmV0dXJuIFBrZ3V0aWxQRVAzMDJUZXN0cy5NeVRlc3RMb2FkZXIoKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzeXMubWV0YV9wYXRoLmluc2VydCgwLCBzZWxmLk15VGVzdEltcG9ydGVyKCkpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGRlbCBzeXMubWV0YV9wYXRoWzBdCisKKyAgICBkZWYgdGVzdF9nZXRkYXRhX3BlcDMwMihzZWxmKToKKyAgICAgICAgIyBVc2UgYSBkdW1teSBpbXBvcnRlci9sb2FkZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwa2d1dGlsLmdldF9kYXRhKCdmb28nLCAnZHVtbXknKSwgIkhlbGxvLCB3b3JsZCEiKQorICAgICAgICBkZWwgc3lzLm1vZHVsZXNbJ2ZvbyddCisKKyAgICBkZWYgdGVzdF9hbHJlYWR5bG9hZGVkKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IGdldF9kYXRhIHdvcmtzIHdpdGhvdXQgcmVsb2FkaW5nIC0gdGhlICJsb2FkcyIgbW9kdWxlCisgICAgICAgICMgdmFyaWFibGUgaW4gdGhlIGV4YW1wbGUgbG9hZGVyIHNob3VsZCBjb3VudCBob3cgbWFueSB0aW1lcyBhIHJlbG9hZAorICAgICAgICAjIG9jY3Vycy4KKyAgICAgICAgaW1wb3J0IGZvbworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5sb2FkcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwa2d1dGlsLmdldF9kYXRhKCdmb28nLCAnZHVtbXknKSwgIkhlbGxvLCB3b3JsZCEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvby5sb2FkcywgMSkKKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzWydmb28nXQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFBrZ3V0aWxUZXN0cywgUGtndXRpbFBFUDMwMlRlc3RzKQorICAgICMgdGhpcyBpcyBuZWNlc3NhcnkgaWYgdGVzdCBpcyBydW4gcmVwZWF0ZWQgKGxpa2Ugd2hlbiBmaW5kaW5nIGxlYWtzKQorICAgIGltcG9ydCB6aXBpbXBvcnQKKyAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2d1dGlsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTk1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2d1dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2d1dGlsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BrZ3V0aWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNTk1MzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wa2d1dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wbGF0Zm9ybS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsYXRmb3JtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWQ0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQpAQCAtMCwwICsxLDI1NCBAQAoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IHN1YnByb2Nlc3MKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgUGxhdGZvcm1UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9hcmNoaXRlY3R1cmUoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpCisKKyAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgorICAgICAgICBkZWYgdGVzdF9hcmNoaXRlY3R1cmVfdmlhX3N5bWxpbmsoc2VsZik6ICMgaXNzdWUzNzYyCisgICAgICAgICAgICBkZWYgZ2V0KHB5dGhvbik6CisgICAgICAgICAgICAgICAgY21kID0gW3B5dGhvbiwgJy1jJywKKyAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBwbGF0Zm9ybTsgcHJpbnQgcGxhdGZvcm0uYXJjaGl0ZWN0dXJlKCknXQorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgICAgICByZXR1cm4gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICByZWFsID0gb3MucGF0aC5yZWFscGF0aChzeXMuZXhlY3V0YWJsZSkKKyAgICAgICAgICAgIGxpbmsgPSBvcy5wYXRoLmFic3BhdGgodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIG9zLnN5bWxpbmsocmVhbCwgbGluaykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldChyZWFsKSwgZ2V0KGxpbmspKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUobGluaykKKworICAgIGRlZiB0ZXN0X3BsYXRmb3JtKHNlbGYpOgorICAgICAgICBmb3IgYWxpYXNlZCBpbiAoRmFsc2UsIFRydWUpOgorICAgICAgICAgICAgZm9yIHRlcnNlIGluIChGYWxzZSwgVHJ1ZSk6CisgICAgICAgICAgICAgICAgcmVzID0gcGxhdGZvcm0ucGxhdGZvcm0oYWxpYXNlZCwgdGVyc2UpCisKKyAgICBkZWYgdGVzdF9zeXN0ZW0oc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLnN5c3RlbSgpCisKKyAgICBkZWYgdGVzdF9ub2RlKHNlbGYpOgorICAgICAgICByZXMgPSBwbGF0Zm9ybS5ub2RlKCkKKworICAgIGRlZiB0ZXN0X3JlbGVhc2Uoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLnJlbGVhc2UoKQorCisgICAgZGVmIHRlc3RfdmVyc2lvbihzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0udmVyc2lvbigpCisKKyAgICBkZWYgdGVzdF9tYWNoaW5lKHNlbGYpOgorICAgICAgICByZXMgPSBwbGF0Zm9ybS5tYWNoaW5lKCkKKworICAgIGRlZiB0ZXN0X3Byb2Nlc3NvcihzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0ucHJvY2Vzc29yKCkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zYXZlX3ZlcnNpb24gPSBzeXMudmVyc2lvbgorICAgICAgICBzZWxmLnNhdmVfc3VidmVyc2lvbiA9IHN5cy5zdWJ2ZXJzaW9uCisgICAgICAgIHNlbGYuc2F2ZV9wbGF0Zm9ybSA9IHN5cy5wbGF0Zm9ybQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMudmVyc2lvbiA9IHNlbGYuc2F2ZV92ZXJzaW9uCisgICAgICAgIHN5cy5zdWJ2ZXJzaW9uID0gc2VsZi5zYXZlX3N1YnZlcnNpb24KKyAgICAgICAgc3lzLnBsYXRmb3JtID0gc2VsZi5zYXZlX3BsYXRmb3JtCisKKyAgICBkZWYgdGVzdF9zeXNfdmVyc2lvbihzZWxmKToKKyAgICAgICAgIyBPbGQgdGVzdC4KKyAgICAgICAgZm9yIGlucHV0LCBvdXRwdXQgaW4gKAorICAgICAgICAgICAgKCcyLjQuMyAoIzEsIEp1biAyMSAyMDA2LCAxMzo1NDoyMSkgXG5bR0NDIDMuMy40IChwcmUgMy4zLjUgMjAwNDA4MDkpXScsCisgICAgICAgICAgICAgKCdDUHl0aG9uJywgJzIuNC4zJywgJycsICcnLCAnMScsICdKdW4gMjEgMjAwNiAxMzo1NDoyMScsICdHQ0MgMy4zLjQgKHByZSAzLjMuNSAyMDA0MDgwOSknKSksCisgICAgICAgICAgICAoJ0lyb25QeXRob24gMS4wLjYwODE2IG9uIC5ORVQgMi4wLjUwNzI3LjQyJywKKyAgICAgICAgICAgICAoJ0lyb25QeXRob24nLCAnMS4wLjYwODE2JywgJycsICcnLCAnJywgJycsICcuTkVUIDIuMC41MDcyNy40MicpKSwKKyAgICAgICAgICAgICgnSXJvblB5dGhvbiAxLjAgKDEuMC42MTAwNS4xOTc3KSBvbiAuTkVUIDIuMC41MDcyNy40MicsCisgICAgICAgICAgICAgKCdJcm9uUHl0aG9uJywgJzEuMC4wJywgJycsICcnLCAnJywgJycsICcuTkVUIDIuMC41MDcyNy40MicpKSwKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAjIGJyYW5jaCBhbmQgcmV2aXNpb24gYXJlIG5vdCAicGFyc2VkIiwgYnV0IGZldGNoZWQKKyAgICAgICAgICAgICMgZnJvbSBzeXMuc3VidmVyc2lvbi4gIElnbm9yZSB0aGVtCisgICAgICAgICAgICAobmFtZSwgdmVyc2lvbiwgYnJhbmNoLCByZXZpc2lvbiwgYnVpbGRubywgYnVpbGRkYXRlLCBjb21waWxlcikgXAorICAgICAgICAgICAgICAgICAgID0gcGxhdGZvcm0uX3N5c192ZXJzaW9uKGlucHV0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAobmFtZSwgdmVyc2lvbiwgJycsICcnLCBidWlsZG5vLCBidWlsZGRhdGUsIGNvbXBpbGVyKSwgb3V0cHV0KQorCisgICAgICAgICMgVGVzdHMgZm9yIHB5dGhvbl9pbXBsZW1lbnRhdGlvbigpLCBweXRob25fdmVyc2lvbigpLCBweXRob25fYnJhbmNoKCksCisgICAgICAgICMgcHl0aG9uX3JldmlzaW9uKCksIHB5dGhvbl9idWlsZCgpLCBhbmQgcHl0aG9uX2NvbXBpbGVyKCkuCisgICAgICAgIHN5c192ZXJzaW9ucyA9IHsKKyAgICAgICAgICAgICgiMi42LjEgKHIyNjE6Njc1MTUsIERlYyAgNiAyMDA4LCAxNToyNjowMCkgXG5bR0NDIDQuMC4xIChBcHBsZSBDb21wdXRlciwgSW5jLiBidWlsZCA1MzcwKV0iLAorICAgICAgICAgICAgICgnQ1B5dGhvbicsICd0YWdzL3IyNjEnLCAnNjc1MTUnKSwgc2VsZi5zYXZlX3BsYXRmb3JtKQorICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICgiQ1B5dGhvbiIsICIyLjYuMSIsICJ0YWdzL3IyNjEiLCAiNjc1MTUiLAorICAgICAgICAgICAgICAgICAoJ3IyNjE6Njc1MTUnLCAnRGVjICA2IDIwMDggMTU6MjY6MDAnKSwKKyAgICAgICAgICAgICAgICAgJ0dDQyA0LjAuMSAoQXBwbGUgQ29tcHV0ZXIsIEluYy4gYnVpbGQgNTM3MCknKSwKKyAgICAgICAgICAgICgiSXJvblB5dGhvbiAyLjAgKDIuMC4wLjApIG9uIC5ORVQgMi4wLjUwNzI3LjMwNTMiLCBOb25lLCAiY2xpIikKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgICAgICAoIklyb25QeXRob24iLCAiMi4wLjAiLCAiIiwgIiIsICgiIiwgIiIpLAorICAgICAgICAgICAgICAgICAiLk5FVCAyLjAuNTA3MjcuMzA1MyIpLAorICAgICAgICAgICAgKCIyLjUgKHRydW5rOjYxMDcsIE1hciAyNiAyMDA5LCAxMzowMjoxOCkgXG5bSmF2YSBIb3RTcG90KFRNKSBDbGllbnQgVk0gKFwiQXBwbGUgQ29tcHV0ZXIsIEluYy5cIildIiwKKyAgICAgICAgICAgICgnSnl0aG9uJywgJ3RydW5rJywgJzYxMDcnKSwgImphdmExLjUuMF8xNiIpCisgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgKCJKeXRob24iLCAiMi41LjAiLCAidHJ1bmsiLCAiNjEwNyIsCisgICAgICAgICAgICAgICAgICgndHJ1bms6NjEwNycsICdNYXIgMjYgMjAwOScpLCAiamF2YTEuNS4wXzE2IiksCisgICAgICAgICAgICAoIjIuNS4yICg2MzM3OCwgTWFyIDI2IDIwMDksIDE4OjAzOjI5KVxuW1B5UHkgMS4wLjBdIiwKKyAgICAgICAgICAgICAoJ1B5UHknLCAndHJ1bmsnLCAnNjMzNzgnKSwgc2VsZi5zYXZlX3BsYXRmb3JtKQorICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICgiUHlQeSIsICIyLjUuMiIsICJ0cnVuayIsICI2MzM3OCIsICgnNjMzNzgnLCAnTWFyIDI2IDIwMDknKSwKKyAgICAgICAgICAgICAgICAgIiIpCisgICAgICAgICAgICB9CisgICAgICAgIGZvciAodmVyc2lvbl90YWcsIHN1YnZlcnNpb24sIHN5c19wbGF0Zm9ybSksIGluZm8gaW4gXAorICAgICAgICAgICAgICAgIHN5c192ZXJzaW9ucy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHN5cy52ZXJzaW9uID0gdmVyc2lvbl90YWcKKyAgICAgICAgICAgIGlmIHN1YnZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHN5cywgInN1YnZlcnNpb24iKToKKyAgICAgICAgICAgICAgICAgICAgZGVsIHN5cy5zdWJ2ZXJzaW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHN5cy5zdWJ2ZXJzaW9uID0gc3VidmVyc2lvbgorICAgICAgICAgICAgaWYgc3lzX3BsYXRmb3JtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN5cy5wbGF0Zm9ybSA9IHN5c19wbGF0Zm9ybQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKSwgaW5mb1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwgaW5mb1sxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhdGZvcm0ucHl0aG9uX2JyYW5jaCgpLCBpbmZvWzJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGF0Zm9ybS5weXRob25fcmV2aXNpb24oKSwgaW5mb1szXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxhdGZvcm0ucHl0aG9uX2J1aWxkKCksIGluZm9bNF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsYXRmb3JtLnB5dGhvbl9jb21waWxlcigpLCBpbmZvWzVdKQorCisgICAgZGVmIHRlc3Rfc3lzdGVtX2FsaWFzKHNlbGYpOgorICAgICAgICByZXMgPSBwbGF0Zm9ybS5zeXN0ZW1fYWxpYXMoCisgICAgICAgICAgICBwbGF0Zm9ybS5zeXN0ZW0oKSwKKyAgICAgICAgICAgIHBsYXRmb3JtLnJlbGVhc2UoKSwKKyAgICAgICAgICAgIHBsYXRmb3JtLnZlcnNpb24oKSwKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfdW5hbWUoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLnVuYW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFueShyZXMpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpLCAid2luZG93cyBvbmx5IHRlc3QiKQorICAgIGRlZiB0ZXN0X3VuYW1lX3dpbjMyX0FSQ0hJVEVXNjQzMihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA3ODYwOiBtYWtlIHN1cmUgd2UgZ2V0IGFyY2hpdGVjdHVyZSBmcm9tIHRoZSBjb3JyZWN0IHZhcmlhYmxlCisgICAgICAgICMgb24gNjQgYml0IFdpbmRvd3M6IGlmIFBST0NFU1NPUl9BUkNISVRFVzY0MzIgZXhpc3RzIHdlIHNob3VsZCBiZQorICAgICAgICAjIHVzaW5nIGl0LCBwZXIKKyAgICAgICAgIyBodHRwOi8vYmxvZ3MubXNkbi5jb20vZGF2aWQud2FuZy9hcmNoaXZlLzIwMDYvMDMvMjYvSE9XVE8tRGV0ZWN0LVByb2Nlc3MtQml0bmVzcy5hc3B4CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnZpcm9uOgorICAgICAgICAgICAgICAgIGlmICdQUk9DRVNTT1JfQVJDSElURVc2NDMyJyBpbiBlbnZpcm9uOgorICAgICAgICAgICAgICAgICAgICBkZWwgZW52aXJvblsnUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiddCisgICAgICAgICAgICAgICAgZW52aXJvblsnUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSddID0gJ2ZvbycKKyAgICAgICAgICAgICAgICBwbGF0Zm9ybS5fdW5hbWVfY2FjaGUgPSBOb25lCisgICAgICAgICAgICAgICAgc3lzdGVtLCBub2RlLCByZWxlYXNlLCB2ZXJzaW9uLCBtYWNoaW5lLCBwcm9jZXNzb3IgPSBwbGF0Zm9ybS51bmFtZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWNoaW5lLCAnZm9vJykKKyAgICAgICAgICAgICAgICBlbnZpcm9uWydQUk9DRVNTT1JfQVJDSElURVc2NDMyJ10gPSAnYmFyJworICAgICAgICAgICAgICAgIHBsYXRmb3JtLl91bmFtZV9jYWNoZSA9IE5vbmUKKyAgICAgICAgICAgICAgICBzeXN0ZW0sIG5vZGUsIHJlbGVhc2UsIHZlcnNpb24sIG1hY2hpbmUsIHByb2Nlc3NvciA9IHBsYXRmb3JtLnVuYW1lKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hY2hpbmUsICdiYXInKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcGxhdGZvcm0uX3VuYW1lX2NhY2hlID0gTm9uZQorCisgICAgZGVmIHRlc3RfamF2YV92ZXIoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLmphdmFfdmVyKCkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdqYXZhJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwocmVzKSkKKworICAgIGRlZiB0ZXN0X3dpbjMyX3ZlcihzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0ud2luMzJfdmVyKCkKKworICAgIGRlZiB0ZXN0X21hY192ZXIoc2VsZik6CisgICAgICAgIHJlcyA9IHBsYXRmb3JtLm1hY192ZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBnZXN0YWx0CisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGhhdmVfdG9vbGJveF9nbHVlID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhhdmVfdG9vbGJveF9nbHVlID0gVHJ1ZQorCisgICAgICAgIGlmIGhhdmVfdG9vbGJveF9nbHVlIGFuZCBwbGF0Zm9ybS51bmFtZSgpWzBdID09ICdEYXJ3aW4nOgorICAgICAgICAgICAgIyBXZSdyZSBvbiBhIE1hY09TWCBzeXN0ZW0sIGNoZWNrIHRoYXQKKyAgICAgICAgICAgICMgdGhlIHJpZ2h0IHZlcnNpb24gaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQKKyAgICAgICAgICAgIGZkID0gb3MucG9wZW4oJ3N3X3ZlcnMnLCAncicpCisgICAgICAgICAgICByZWFsX3ZlciA9IE5vbmUKKyAgICAgICAgICAgIGZvciBsbiBpbiBmZDoKKyAgICAgICAgICAgICAgICBpZiBsbi5zdGFydHN3aXRoKCdQcm9kdWN0VmVyc2lvbjonKToKKyAgICAgICAgICAgICAgICAgICAgcmVhbF92ZXIgPSBsbi5zdHJpcCgpLnNwbGl0KClbLTFdCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmZC5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlYWxfdmVyIGlzIE5vbmUpCisgICAgICAgICAgICByZXN1bHRfbGlzdCA9IHJlc1swXS5zcGxpdCgnLicpCisgICAgICAgICAgICBleHBlY3RfbGlzdCA9IHJlYWxfdmVyLnNwbGl0KCcuJykKKyAgICAgICAgICAgIGxlbl9kaWZmID0gbGVuKHJlc3VsdF9saXN0KSAtIGxlbihleHBlY3RfbGlzdCkKKyAgICAgICAgICAgICMgT24gU25vdyBMZW9wYXJkLCBzd192ZXJzIHJlcG9ydHMgMTAuNi4wIGFzIDEwLjYKKyAgICAgICAgICAgIGlmIGxlbl9kaWZmID4gMDoKKyAgICAgICAgICAgICAgICBleHBlY3RfbGlzdC5leHRlbmQoWycwJ10gKiBsZW5fZGlmZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0X2xpc3QsIGV4cGVjdF9saXN0KQorCisgICAgICAgICAgICAjIHJlc1sxXSBjbGFpbXMgdG8gY29udGFpbgorICAgICAgICAgICAgIyAodmVyc2lvbiwgZGV2X3N0YWdlLCBub25fcmVsZWFzZV92ZXJzaW9uKQorICAgICAgICAgICAgIyBUaGF0IGluZm9ybWF0aW9uIGlzIG5vIGxvbmdlciBhdmFpbGFibGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzFdLCAoJycsICcnLCAnJykpCisKKyAgICAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihyZXNbMl0sICgnaTM4NicsICd4ODZfNjQnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMl0sICdQb3dlclBDJykKKworCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nLCAiT1NYIG9ubHkgdGVzdCIpCisgICAgZGVmIHRlc3RfbWFjX3Zlcl93aXRoX2Zvcmsoc2VsZik6CisgICAgICAgICMgSXNzdWU3ODk1OiBwbGF0Zm9ybS5tYWNfdmVyKCkgY3Jhc2hlcyB3aGVuIHVzaW5nIGZvcmsgd2l0aG91dCBleGVjCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhlIGZpeCBmb3IgdGhhdCBpc3N1ZSB3b3Jrcy4KKyAgICAgICAgIworICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgaWYgcGlkID09IDA6CisgICAgICAgICAgICAjIGNoaWxkCisgICAgICAgICAgICBpbmZvID0gcGxhdGZvcm0ubWFjX3ZlcigpCisgICAgICAgICAgICBvcy5fZXhpdCgwKQorCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHBhcmVudAorICAgICAgICAgICAgY3BpZCwgc3RzID0gb3Mud2FpdHBpZChwaWQsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNwaWQsIHBpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RzLCAwKQorCisgICAgZGVmIHRlc3RfZGlzdChzZWxmKToKKyAgICAgICAgcmVzID0gcGxhdGZvcm0uZGlzdCgpCisKKyAgICBkZWYgdGVzdF9saWJjX3ZlcihzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoc3lzLmV4ZWN1dGFibGUpIGFuZCBcCisgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKHN5cy5leGVjdXRhYmxlKycuZXhlJyk6CisgICAgICAgICAgICAjIEN5Z3dpbiBob3Jyb3IKKyAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBzeXMuZXhlY3V0YWJsZSArICcuZXhlJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhlY3V0YWJsZSA9IHN5cy5leGVjdXRhYmxlCisgICAgICAgIHJlcyA9IHBsYXRmb3JtLmxpYmNfdmVyKGV4ZWN1dGFibGUpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9yZWxlYXNlX2ZpbGUoc2VsZik6CisKKyAgICAgICAgZm9yIGlucHV0LCBvdXRwdXQgaW4gKAorICAgICAgICAgICAgIyBFeGFtcGxlcyBvZiByZWxlYXNlIGZpbGUgY29udGVudHM6CisgICAgICAgICAgICAoJ1N1U0UgTGludXggOS4zICh4ODYtNjQpJywgKCdTdVNFIExpbnV4ICcsICc5LjMnLCAneDg2LTY0JykpLAorICAgICAgICAgICAgKCdTVVNFIExJTlVYIDEwLjEgKFg4Ni02NCknLCAoJ1NVU0UgTElOVVggJywgJzEwLjEnLCAnWDg2LTY0JykpLAorICAgICAgICAgICAgKCdTVVNFIExJTlVYIDEwLjEgKGk1ODYpJywgKCdTVVNFIExJTlVYICcsICcxMC4xJywgJ2k1ODYnKSksCisgICAgICAgICAgICAoJ0ZlZG9yYSBDb3JlIHJlbGVhc2UgNSAoQm9yZGVhdXgpJywgKCdGZWRvcmEgQ29yZScsICc1JywgJ0JvcmRlYXV4JykpLAorICAgICAgICAgICAgKCdSZWQgSGF0IExpbnV4IHJlbGVhc2UgOC4wIChQc3ljaGUpJywgKCdSZWQgSGF0IExpbnV4JywgJzguMCcsICdQc3ljaGUnKSksCisgICAgICAgICAgICAoJ1JlZCBIYXQgTGludXggcmVsZWFzZSA5IChTaHJpa2UpJywgKCdSZWQgSGF0IExpbnV4JywgJzknLCAnU2hyaWtlJykpLAorICAgICAgICAgICAgKCdSZWQgSGF0IEVudGVycHJpc2UgTGludXggcmVsZWFzZSA0IChOYWhhbnQpJywgKCdSZWQgSGF0IEVudGVycHJpc2UgTGludXgnLCAnNCcsICdOYWhhbnQnKSksCisgICAgICAgICAgICAoJ0NlbnRPUyByZWxlYXNlIDQnLCAoJ0NlbnRPUycsICc0JywgTm9uZSkpLAorICAgICAgICAgICAgKCdSb2NrcyByZWxlYXNlIDQuMi4xIChDeWRvbmlhKScsICgnUm9ja3MnLCAnNC4yLjEnLCAnQ3lkb25pYScpKSwKKyAgICAgICAgICAgICgnJywgKCcnLCAnJywgJycpKSwgIyBJZiB0aGVyZSdzIG5vdGhpbmcgdGhlcmUuCisgICAgICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGF0Zm9ybS5fcGFyc2VfcmVsZWFzZV9maWxlKGlucHV0KSwgb3V0cHV0KQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBQbGF0Zm9ybVRlc3QKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsYXRmb3JtLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsYXRmb3JtLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmM3YTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxhdGZvcm0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsYXRmb3JtLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsYXRmb3JtLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmM3YTBhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxhdGZvcm0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsaXN0bGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg1OWFkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsaXN0bGliLnB5CkBAIC0wLDAgKzEsMjA0IEBACisjIENvcHlyaWdodCAoQykgMjAwMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBwbGlzdGxpYgoraW1wb3J0IG9zCitpbXBvcnQgZGF0ZXRpbWUKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworIyBUaGlzIHRlc3QgZGF0YSB3YXMgZ2VuZXJhdGVkIHRocm91Z2ggQ29jb2EncyBOU0RpY3Rpb25hcnkgY2xhc3MKK1RFU1REQVRBID0gIiIiPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBwbGlzdCBQVUJMSUMgIi0vL0FwcGxlLy9EVEQgUExJU1QgMS4wLy9FTiIgXAorImh0dHA6Ly93d3cuYXBwbGUuY29tL0RURHMvUHJvcGVydHlMaXN0LTEuMC5kdGQiPgorPHBsaXN0IHZlcnNpb249IjEuMCI+Cis8ZGljdD4KKyAgICAgICAgPGtleT5hRGF0ZTwva2V5PgorICAgICAgICA8ZGF0ZT4yMDA0LTEwLTI2VDEwOjMzOjMzWjwvZGF0ZT4KKyAgICAgICAgPGtleT5hRGljdDwva2V5PgorICAgICAgICA8ZGljdD4KKyAgICAgICAgICAgICAgICA8a2V5PmFGYWxzZVZhbHVlPC9rZXk+CisgICAgICAgICAgICAgICAgPGZhbHNlLz4KKyAgICAgICAgICAgICAgICA8a2V5PmFUcnVlVmFsdWU8L2tleT4KKyAgICAgICAgICAgICAgICA8dHJ1ZS8+CisgICAgICAgICAgICAgICAgPGtleT5hVW5pY29kZVZhbHVlPC9rZXk+CisgICAgICAgICAgICAgICAgPHN0cmluZz5NXHhjM1x4YTRzc2lnLCBNYVx4YzNceDlmPC9zdHJpbmc+CisgICAgICAgICAgICAgICAgPGtleT5hbm90aGVyU3RyaW5nPC9rZXk+CisgICAgICAgICAgICAgICAgPHN0cmluZz4mbHQ7aGVsbG8gJmFtcDsgJ2hpJyB0aGVyZSEmZ3Q7PC9zdHJpbmc+CisgICAgICAgICAgICAgICAgPGtleT5kZWVwZXJEaWN0PC9rZXk+CisgICAgICAgICAgICAgICAgPGRpY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8a2V5PmE8L2tleT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnRlZ2VyPjE3PC9pbnRlZ2VyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGtleT5iPC9rZXk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVhbD4zMi41PC9yZWFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPGtleT5jPC9rZXk+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJyYXk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnRlZ2VyPjE8L2ludGVnZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnRlZ2VyPjI8L2ludGVnZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpbmc+dGV4dDwvc3RyaW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnJheT4KKyAgICAgICAgICAgICAgICA8L2RpY3Q+CisgICAgICAgIDwvZGljdD4KKyAgICAgICAgPGtleT5hRmxvYXQ8L2tleT4KKyAgICAgICAgPHJlYWw+MC41PC9yZWFsPgorICAgICAgICA8a2V5PmFMaXN0PC9rZXk+CisgICAgICAgIDxhcnJheT4KKyAgICAgICAgICAgICAgICA8c3RyaW5nPkE8L3N0cmluZz4KKyAgICAgICAgICAgICAgICA8c3RyaW5nPkI8L3N0cmluZz4KKyAgICAgICAgICAgICAgICA8aW50ZWdlcj4xMjwvaW50ZWdlcj4KKyAgICAgICAgICAgICAgICA8cmVhbD4zMi41PC9yZWFsPgorICAgICAgICAgICAgICAgIDxhcnJheT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpbnRlZ2VyPjE8L2ludGVnZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW50ZWdlcj4yPC9pbnRlZ2VyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGludGVnZXI+MzwvaW50ZWdlcj4KKyAgICAgICAgICAgICAgICA8L2FycmF5PgorICAgICAgICA8L2FycmF5PgorICAgICAgICA8a2V5PmFTdHJpbmc8L2tleT4KKyAgICAgICAgPHN0cmluZz5Eb29kYWg8L3N0cmluZz4KKyAgICAgICAgPGtleT5hbkludDwva2V5PgorICAgICAgICA8aW50ZWdlcj43Mjg8L2ludGVnZXI+CisgICAgICAgIDxrZXk+bmVzdGVkRGF0YTwva2V5PgorICAgICAgICA8YXJyYXk+CisgICAgICAgICAgICAgICAgPGRhdGE+CisgICAgICAgICAgICAgICAgUEd4dmRITWdiMllnWW1sdVlYSjVJR2QxYm1zK0FBRUNBenhzYjNSeklHOW1JR0pwYm1GeWVTQm5kVzVyCisgICAgICAgICAgICAgICAgUGdBQkFnTThiRzkwY3lCdlppQmlhVzVoY25rZ1ozVnVhejRBQVFJRFBHeHZkSE1nYjJZZ1ltbHVZWEo1CisgICAgICAgICAgICAgICAgSUdkMWJtcytBQUVDQXp4c2IzUnpJRzltSUdKcGJtRnllU0JuZFc1clBnQUJBZ004Ykc5MGN5QnZaaUJpCisgICAgICAgICAgICAgICAgYVc1aGNua2daM1Z1YXo0QUFRSURQR3h2ZEhNZ2IyWWdZbWx1WVhKNUlHZDFibXMrQUFFQ0F6eHNiM1J6CisgICAgICAgICAgICAgICAgSUc5bUlHSnBibUZ5ZVNCbmRXNXJQZ0FCQWdNOGJHOTBjeUJ2WmlCaWFXNWhjbmtnWjNWdWF6NEFBUUlECisgICAgICAgICAgICAgICAgUEd4dmRITWdiMllnWW1sdVlYSjVJR2QxYm1zK0FBRUNBdz09CisgICAgICAgICAgICAgICAgPC9kYXRhPgorICAgICAgICA8L2FycmF5PgorICAgICAgICA8a2V5PnNvbWVEYXRhPC9rZXk+CisgICAgICAgIDxkYXRhPgorICAgICAgICBQR0pwYm1GeWVTQm5kVzVyUGc9PQorICAgICAgICA8L2RhdGE+CisgICAgICAgIDxrZXk+c29tZU1vcmVEYXRhPC9rZXk+CisgICAgICAgIDxkYXRhPgorICAgICAgICBQR3h2ZEhNZ2IyWWdZbWx1WVhKNUlHZDFibXMrQUFFQ0F6eHNiM1J6SUc5bUlHSnBibUZ5ZVNCbmRXNXJQZ0FCQWdNOAorICAgICAgICBiRzkwY3lCdlppQmlhVzVoY25rZ1ozVnVhejRBQVFJRFBHeHZkSE1nYjJZZ1ltbHVZWEo1SUdkMWJtcytBQUVDQXp4cworICAgICAgICBiM1J6SUc5bUlHSnBibUZ5ZVNCbmRXNXJQZ0FCQWdNOGJHOTBjeUJ2WmlCaWFXNWhjbmtnWjNWdWF6NEFBUUlEUEd4dgorICAgICAgICBkSE1nYjJZZ1ltbHVZWEo1SUdkMWJtcytBQUVDQXp4c2IzUnpJRzltSUdKcGJtRnllU0JuZFc1clBnQUJBZ004Ykc5MAorICAgICAgICBjeUJ2WmlCaWFXNWhjbmtnWjNWdWF6NEFBUUlEUEd4dmRITWdiMllnWW1sdVlYSjVJR2QxYm1zK0FBRUNBdz09CisgICAgICAgIDwvZGF0YT4KKyAgICAgICAgPGtleT5ceGMzXHg4NWJlbnJhYTwva2V5PgorICAgICAgICA8c3RyaW5nPlRoYXQgd2FzIGEgdW5pY29kZSBrZXkuPC9zdHJpbmc+Cis8L2RpY3Q+Cis8L3BsaXN0PgorIiIiLnJlcGxhY2UoIiAiICogOCwgIlx0IikgICMgQXBwbGUgYXMgd2VsbCBhcyBwbGlzdGxpYi5weSBvdXRwdXQgaGFyZCB0YWJzCisKKworY2xhc3MgVGVzdFBsaXN0bGliKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfY3JlYXRlKHNlbGYpOgorICAgICAgICBwbCA9IGRpY3QoCisgICAgICAgICAgICBhU3RyaW5nPSJEb29kYWgiLAorICAgICAgICAgICAgYUxpc3Q9WyJBIiwgIkIiLCAxMiwgMzIuNSwgWzEsIDIsIDNdXSwKKyAgICAgICAgICAgIGFGbG9hdCA9IDAuNSwKKyAgICAgICAgICAgIGFuSW50ID0gNzI4LAorICAgICAgICAgICAgYURpY3Q9ZGljdCgKKyAgICAgICAgICAgICAgICBhbm90aGVyU3RyaW5nPSI8aGVsbG8gJiAnaGknIHRoZXJlIT4iLAorICAgICAgICAgICAgICAgIGFVbmljb2RlVmFsdWU9dSdNXHhlNHNzaWcsIE1hXHhkZicsCisgICAgICAgICAgICAgICAgYVRydWVWYWx1ZT1UcnVlLAorICAgICAgICAgICAgICAgIGFGYWxzZVZhbHVlPUZhbHNlLAorICAgICAgICAgICAgICAgIGRlZXBlckRpY3Q9ZGljdChhPTE3LCBiPTMyLjUsIGM9WzEsIDIsICJ0ZXh0Il0pLAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIHNvbWVEYXRhID0gcGxpc3RsaWIuRGF0YSgiPGJpbmFyeSBndW5rPiIpLAorICAgICAgICAgICAgc29tZU1vcmVEYXRhID0gcGxpc3RsaWIuRGF0YSgiPGxvdHMgb2YgYmluYXJ5IGd1bms+XDBcMVwyXDMiICogMTApLAorICAgICAgICAgICAgbmVzdGVkRGF0YSA9IFtwbGlzdGxpYi5EYXRhKCI8bG90cyBvZiBiaW5hcnkgZ3Vuaz5cMFwxXDJcMyIgKiAxMCldLAorICAgICAgICAgICAgYURhdGUgPSBkYXRldGltZS5kYXRldGltZSgyMDA0LCAxMCwgMjYsIDEwLCAzMywgMzMpLAorICAgICAgICApCisgICAgICAgIHBsW3UnXHhjNWJlbnJhYSddID0gIlRoYXQgd2FzIGEgdW5pY29kZSBrZXkuIgorICAgICAgICByZXR1cm4gcGwKKworICAgIGRlZiB0ZXN0X2NyZWF0ZShzZWxmKToKKyAgICAgICAgcGwgPSBzZWxmLl9jcmVhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsWyJhU3RyaW5nIl0sICJEb29kYWgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsWyJhRGljdCJdWyJhRmFsc2VWYWx1ZSJdLCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2lvKHNlbGYpOgorICAgICAgICBwbCA9IHNlbGYuX2NyZWF0ZSgpCisgICAgICAgIHBsaXN0bGliLndyaXRlUGxpc3QocGwsIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHBsMiA9IHBsaXN0bGliLnJlYWRQbGlzdCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QocGwpLCBkaWN0KHBsMikpCisKKyAgICBkZWYgdGVzdF9zdHJpbmcoc2VsZik6CisgICAgICAgIHBsID0gc2VsZi5fY3JlYXRlKCkKKyAgICAgICAgZGF0YSA9IHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyhwbCkKKyAgICAgICAgcGwyID0gcGxpc3RsaWIucmVhZFBsaXN0RnJvbVN0cmluZyhkYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QocGwpLCBkaWN0KHBsMikpCisgICAgICAgIGRhdGEyID0gcGxpc3RsaWIud3JpdGVQbGlzdFRvU3RyaW5nKHBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBkYXRhMikKKworICAgIGRlZiB0ZXN0X2luZGVudGF0aW9uX2FycmF5KHNlbGYpOgorICAgICAgICBkYXRhID0gW1tbW1tbW1t7J3Rlc3QnOiBwbGlzdGxpYi5EYXRhKGInYWFhYWFhJyl9XV1dXV1dXV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbGlzdGxpYi5yZWFkUGxpc3RGcm9tU3RyaW5nKHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyhkYXRhKSksIGRhdGEpCisKKyAgICBkZWYgdGVzdF9pbmRlbnRhdGlvbl9kaWN0KHNlbGYpOgorICAgICAgICBkYXRhID0geycxJzogeycyJzogeyczJzogeyc0Jzogeyc1Jzogeyc2Jzogeyc3Jzogeyc4Jzogeyc5JzogcGxpc3RsaWIuRGF0YShiJ2FhYWFhYScpfX19fX19fX19CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxpc3RsaWIucmVhZFBsaXN0RnJvbVN0cmluZyhwbGlzdGxpYi53cml0ZVBsaXN0VG9TdHJpbmcoZGF0YSkpLCBkYXRhKQorCisgICAgZGVmIHRlc3RfaW5kZW50YXRpb25fZGljdF9taXgoc2VsZik6CisgICAgICAgIGRhdGEgPSB7JzEnOiB7JzInOiBbeyczJzogW1tbW1t7J3Rlc3QnOiBwbGlzdGxpYi5EYXRhKGInYWFhYWFhJyl9XV1dXV19XX19CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGxpc3RsaWIucmVhZFBsaXN0RnJvbVN0cmluZyhwbGlzdGxpYi53cml0ZVBsaXN0VG9TdHJpbmcoZGF0YSkpLCBkYXRhKQorCisgICAgZGVmIHRlc3RfYXBwbGVmb3JtYXR0aW5nKHNlbGYpOgorICAgICAgICBwbCA9IHBsaXN0bGliLnJlYWRQbGlzdEZyb21TdHJpbmcoVEVTVERBVEEpCisgICAgICAgIGRhdGEgPSBwbGlzdGxpYi53cml0ZVBsaXN0VG9TdHJpbmcocGwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgVEVTVERBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgImdlbmVyYXRlZCBkYXRhIHdhcyBub3QgaWRlbnRpY2FsIHRvIEFwcGxlJ3Mgb3V0cHV0IikKKworICAgIGRlZiB0ZXN0X2FwcGxlZm9ybWF0dGluZ2Zyb21saXRlcmFsKHNlbGYpOgorICAgICAgICBwbCA9IHNlbGYuX2NyZWF0ZSgpCisgICAgICAgIHBsMiA9IHBsaXN0bGliLnJlYWRQbGlzdEZyb21TdHJpbmcoVEVTVERBVEEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwbCksIGRpY3QocGwyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGVkIGRhdGEgd2FzIG5vdCBpZGVudGljYWwgdG8gQXBwbGUncyBvdXRwdXQiKQorCisgICAgZGVmIHRlc3Rfc3RyaW5naW8oc2VsZik6CisgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGYgPSBTdHJpbmdJTygpCisgICAgICAgIHBsID0gc2VsZi5fY3JlYXRlKCkKKyAgICAgICAgcGxpc3RsaWIud3JpdGVQbGlzdChwbCwgZikKKyAgICAgICAgcGwyID0gcGxpc3RsaWIucmVhZFBsaXN0KFN0cmluZ0lPKGYuZ2V0dmFsdWUoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwbCksIGRpY3QocGwyKSkKKworICAgIGRlZiB0ZXN0X2NzdHJpbmdpbyhzZWxmKToKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGYgPSBTdHJpbmdJTygpCisgICAgICAgIHBsID0gc2VsZi5fY3JlYXRlKCkKKyAgICAgICAgcGxpc3RsaWIud3JpdGVQbGlzdChwbCwgZikKKyAgICAgICAgcGwyID0gcGxpc3RsaWIucmVhZFBsaXN0KFN0cmluZ0lPKGYuZ2V0dmFsdWUoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdChwbCksIGRpY3QocGwyKSkKKworICAgIGRlZiB0ZXN0X2NvbnRyb2xjaGFyYWN0ZXJzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMjgpOgorICAgICAgICAgICAgYyA9IGNocihpKQorICAgICAgICAgICAgdGVzdFN0cmluZyA9ICJzdHJpbmcgY29udGFpbmluZyAlcyIgJSBjCisgICAgICAgICAgICBpZiBpID49IDMyIG9yIGMgaW4gIlxyXG5cdCI6CisgICAgICAgICAgICAgICAgIyBcciwgXG4gYW5kIFx0IGFyZSB0aGUgb25seSBsZWdhbCBjb250cm9sIGNoYXJzIGluIFhNTAorICAgICAgICAgICAgICAgIHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyh0ZXN0U3RyaW5nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0U3RyaW5nKQorCisgICAgZGVmIHRlc3Rfbm9uZGljdHJvb3Qoc2VsZik6CisgICAgICAgIHRlc3QxID0gImFiYyIKKyAgICAgICAgdGVzdDIgPSBbMSwgMiwgMywgImFiYyJdCisgICAgICAgIHJlc3VsdDEgPSBwbGlzdGxpYi5yZWFkUGxpc3RGcm9tU3RyaW5nKHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyh0ZXN0MSkpCisgICAgICAgIHJlc3VsdDIgPSBwbGlzdGxpYi5yZWFkUGxpc3RGcm9tU3RyaW5nKHBsaXN0bGliLndyaXRlUGxpc3RUb1N0cmluZyh0ZXN0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdDEsIHJlc3VsdDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdDIsIHJlc3VsdDIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFBsaXN0bGliKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsaXN0bGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsaXN0bGliLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWE0OGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsaXN0bGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BsaXN0bGliLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWE0OGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcGxpc3RsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvbGwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb2xsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1Mjk0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb2xsLnB5CkBAIC0wLDAgKzEsMTY3IEBACisjIFRlc3QgY2FzZSBmb3IgdGhlIG9zLnBvbGwoKSBmdW5jdGlvbgorCitpbXBvcnQgb3MsIHNlbGVjdCwgcmFuZG9tLCB1bml0dGVzdAoraW1wb3J0IF90ZXN0Y2FwaQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKKwordHJ5OgorICAgIHNlbGVjdC5wb2xsCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QsICJzZWxlY3QucG9sbCBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X3BvbGwiCisKKworZGVmIGZpbmRfcmVhZHlfbWF0Y2hpbmcocmVhZHksIGZsYWcpOgorICAgIG1hdGNoID0gW10KKyAgICBmb3IgZmQsIG1vZGUgaW4gcmVhZHk6CisgICAgICAgIGlmIG1vZGUgJiBmbGFnOgorICAgICAgICAgICAgbWF0Y2guYXBwZW5kKGZkKQorICAgIHJldHVybiBtYXRjaAorCitjbGFzcyBQb2xsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcG9sbDEoc2VsZik6CisgICAgICAgICMgQmFzaWMgZnVuY3Rpb25hbCB0ZXN0IG9mIHBvbGwgb2JqZWN0CisgICAgICAgICMgQ3JlYXRlIGEgYnVuY2ggb2YgcGlwZSBhbmQgdGVzdCB0aGF0IHBvbGwgd29ya3Mgd2l0aCB0aGVtLgorCisgICAgICAgIHAgPSBzZWxlY3QucG9sbCgpCisKKyAgICAgICAgTlVNX1BJUEVTID0gMTIKKyAgICAgICAgTVNHID0gIiBUaGlzIGlzIGEgdGVzdC4iCisgICAgICAgIE1TR19MRU4gPSBsZW4oTVNHKQorICAgICAgICByZWFkZXJzID0gW10KKyAgICAgICAgd3JpdGVycyA9IFtdCisgICAgICAgIHIydyA9IHt9CisgICAgICAgIHcyciA9IHt9CisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNX1BJUEVTKToKKyAgICAgICAgICAgIHJkLCB3ciA9IG9zLnBpcGUoKQorICAgICAgICAgICAgcC5yZWdpc3RlcihyZCkKKyAgICAgICAgICAgIHAubW9kaWZ5KHJkLCBzZWxlY3QuUE9MTElOKQorICAgICAgICAgICAgcC5yZWdpc3Rlcih3ciwgc2VsZWN0LlBPTExPVVQpCisgICAgICAgICAgICByZWFkZXJzLmFwcGVuZChyZCkKKyAgICAgICAgICAgIHdyaXRlcnMuYXBwZW5kKHdyKQorICAgICAgICAgICAgcjJ3W3JkXSA9IHdyCisgICAgICAgICAgICB3MnJbd3JdID0gcmQKKworICAgICAgICBidWZzID0gW10KKworICAgICAgICB3aGlsZSB3cml0ZXJzOgorICAgICAgICAgICAgcmVhZHkgPSBwLnBvbGwoKQorICAgICAgICAgICAgcmVhZHlfd3JpdGVycyA9IGZpbmRfcmVhZHlfbWF0Y2hpbmcocmVhZHksIHNlbGVjdC5QT0xMT1VUKQorICAgICAgICAgICAgaWYgbm90IHJlYWR5X3dyaXRlcnM6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gcGlwZXMgcmVhZHkgZm9yIHdyaXRpbmciCisgICAgICAgICAgICB3ciA9IHJhbmRvbS5jaG9pY2UocmVhZHlfd3JpdGVycykKKyAgICAgICAgICAgIG9zLndyaXRlKHdyLCBNU0cpCisKKyAgICAgICAgICAgIHJlYWR5ID0gcC5wb2xsKCkKKyAgICAgICAgICAgIHJlYWR5X3JlYWRlcnMgPSBmaW5kX3JlYWR5X21hdGNoaW5nKHJlYWR5LCBzZWxlY3QuUE9MTElOKQorICAgICAgICAgICAgaWYgbm90IHJlYWR5X3JlYWRlcnM6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAibm8gcGlwZXMgcmVhZHkgZm9yIHJlYWRpbmciCisgICAgICAgICAgICByZCA9IHJhbmRvbS5jaG9pY2UocmVhZHlfcmVhZGVycykKKyAgICAgICAgICAgIGJ1ZiA9IG9zLnJlYWQocmQsIE1TR19MRU4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCBNU0dfTEVOKQorICAgICAgICAgICAgYnVmcy5hcHBlbmQoYnVmKQorICAgICAgICAgICAgb3MuY2xvc2UocjJ3W3JkXSkgOyBvcy5jbG9zZSggcmQgKQorICAgICAgICAgICAgcC51bnJlZ2lzdGVyKCByMndbcmRdICkKKyAgICAgICAgICAgIHAudW5yZWdpc3RlciggcmQgKQorICAgICAgICAgICAgd3JpdGVycy5yZW1vdmUocjJ3W3JkXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZnMsIFtNU0ddICogTlVNX1BJUEVTKQorCisgICAgZGVmIHBvbGxfdW5pdF90ZXN0cyhzZWxmKToKKyAgICAgICAgIyByZXR1cm5zIE5WQUwgZm9yIGludmFsaWQgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIEZEID0gNDIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2xvc2UoRkQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwLnJlZ2lzdGVyKEZEKQorICAgICAgICByID0gcC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyWzBdLCAoRkQsIHNlbGVjdC5QT0xMTlZBTCkpCisKKyAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAndycpCisgICAgICAgIGZkID0gZi5maWxlbm8oKQorICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBwLnJlZ2lzdGVyKGYpCisgICAgICAgIHIgPSBwLnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJbMF1bMF0sIGZkKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgciA9IHAucG9sbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoclswXSwgKGZkLCBzZWxlY3QuUE9MTE5WQUwpKQorICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorCisgICAgICAgICMgdHlwZSBlcnJvciBmb3IgaW52YWxpZCBhcmd1bWVudHMKKyAgICAgICAgcCA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwLnJlZ2lzdGVyLCBwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHAudW5yZWdpc3RlciwgcCkKKworICAgICAgICAjIGNhbid0IHVucmVnaXN0ZXIgbm9uLWV4aXN0ZW50IG9iamVjdAorICAgICAgICBwID0gc2VsZWN0LnBvbGwoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcC51bnJlZ2lzdGVyLCAzKQorCisgICAgICAgICMgVGVzdCBlcnJvciBjYXNlcworICAgICAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgY2xhc3MgTm9wZToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBBbG1vc3Q6CisgICAgICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAnZmlsZW5vJworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9sbHN0ZXIucmVnaXN0ZXIsIE5vcGUoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb2xsc3Rlci5yZWdpc3RlciwgQWxtb3N0KCksIDApCisKKyAgICAjIEFub3RoZXIgdGVzdCBjYXNlIGZvciBwb2xsKCkuICBUaGlzIGlzIGNvcGllZCBmcm9tIHRoZSB0ZXN0IGNhc2UgZm9yCisgICAgIyBzZWxlY3QoKSwgbW9kaWZpZWQgdG8gdXNlIHBvbGwoKSBpbnN0ZWFkLgorCisgICAgZGVmIHRlc3RfcG9sbDIoc2VsZik6CisgICAgICAgIGNtZCA9ICdmb3IgaSBpbiAwIDEgMiAzIDQgNSA2IDcgOCA5OyBkbyBlY2hvIHRlc3RpbmcuLi47IHNsZWVwIDE7IGRvbmUnCisgICAgICAgIHAgPSBvcy5wb3BlbihjbWQsICdyJykKKyAgICAgICAgcG9sbHN0ZXIgPSBzZWxlY3QucG9sbCgpCisgICAgICAgIHBvbGxzdGVyLnJlZ2lzdGVyKCBwLCBzZWxlY3QuUE9MTElOICkKKyAgICAgICAgZm9yIHRvdXQgaW4gKDAsIDEwMDAsIDIwMDAsIDQwMDAsIDgwMDAsIDE2MDAwKSArICgtMSwpKjEwOgorICAgICAgICAgICAgZmRsaXN0ID0gcG9sbHN0ZXIucG9sbCh0b3V0KQorICAgICAgICAgICAgaWYgKGZkbGlzdCA9PSBbXSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGZkLCBmbGFncyA9IGZkbGlzdFswXQorICAgICAgICAgICAgaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTEhVUDoKKyAgICAgICAgICAgICAgICBsaW5lID0gcC5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgaWYgbGluZSAhPSAiIjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdlcnJvcjogcGlwZSBzZWVtcyB0byBiZSBjbG9zZWQsIGJ1dCBzdGlsbCByZXR1cm5zIGRhdGEnKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGVsaWYgZmxhZ3MgJiBzZWxlY3QuUE9MTElOOgorICAgICAgICAgICAgICAgIGxpbmUgPSBwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGZyb20gc2VsZWN0LnBvbGw6ICVzJyAlIGZkbGlzdCkKKyAgICAgICAgcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9wb2xsMyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IGludCBvdmVyZmxvdworICAgICAgICBwb2xsc3RlciA9IHNlbGVjdC5wb2xsKCkKKyAgICAgICAgcG9sbHN0ZXIucmVnaXN0ZXIoMSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb2xsc3Rlci5wb2xsLCAxTCA8PCA2NCkKKworICAgICAgICB4ID0gMiArIDMKKyAgICAgICAgaWYgeCAhPSA1OgorICAgICAgICAgICAgc2VsZi5mYWlsKCdPdmVyZmxvdyBtdXN0IGhhdmUgb2NjdXJyZWQnKQorCisgICAgICAgIHBvbGxzdGVyID0gc2VsZWN0LnBvbGwoKQorICAgICAgICAjIElzc3VlIDE1OTg5CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBvbGxzdGVyLnJlZ2lzdGVyLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfdGVzdGNhcGkuU0hSVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwb2xsc3Rlci5yZWdpc3RlciwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3RjYXBpLlVTSFJUX01BWCArIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHBvbGxzdGVyLnBvbGwsIF90ZXN0Y2FwaS5JTlRfTUFYICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcG9sbHN0ZXIucG9sbCwgX3Rlc3RjYXBpLlVJTlRfTUFYICsgMSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChQb2xsVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvbGwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9sbC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiOGRmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvbGwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9sbC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiOGRmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGVuLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNWU5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGVuLnB5CkBAIC0wLDAgKzEsNTIgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIkJhc2ljIHRlc3RzIGZvciBvcy5wb3BlbigpCisKKyAgUGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgcGxhdGZvcm1zIHRoYXQgZmFrZSBwb3Blbi4KKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgb3MsIHN5cworCisjIFRlc3QgdGhhdCBjb21tYW5kLWxpbmVzIGdldCBkb3duIGFzIHdlIGV4cGVjdC4KKyMgVG8gZG8gdGhpcyB3ZSBleGVjdXRlOgorIyAgICBweXRob24gLWMgImltcG9ydCBzeXM7cHJpbnQgc3lzLmFyZ3YiIHtyZXN0X29mX2NvbW1hbmRsaW5lfQorIyBUaGlzIHJlc3VsdHMgaW4gUHl0aG9uIGJlaW5nIHNwYXduZWQgYW5kIHByaW50aW5nIHRoZSBzeXMuYXJndiBsaXN0LgorIyBXZSBjYW4gdGhlbiBldmFsKCkgdGhlIHJlc3VsdCBvZiB0aGlzLCBhbmQgc2VlIHdoYXQgZWFjaCBhcmd2IHdhcy4KK3B5dGhvbiA9IHN5cy5leGVjdXRhYmxlCisKK2NsYXNzIFBvcGVuVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9kb190ZXN0X2NvbW1hbmRsaW5lKHNlbGYsIGNtZGxpbmUsIGV4cGVjdGVkKToKKyAgICAgICAgY21kID0gJyVzIC1jICJpbXBvcnQgc3lzO3ByaW50IHN5cy5hcmd2IiAlcycgJSAocHl0aG9uLCBjbWRsaW5lKQorICAgICAgICBkYXRhID0gb3MucG9wZW4oY21kKS5yZWFkKCkgKyAnXG4nCisgICAgICAgIGdvdCA9IGV2YWwoZGF0YSlbMTpdICMgc3RyaXAgb2ZmIGFyZ3ZbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfcG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3MucG9wZW4pCisgICAgICAgIHNlbGYuX2RvX3Rlc3RfY29tbWFuZGxpbmUoCisgICAgICAgICAgICAiZm9vIGJhciIsCisgICAgICAgICAgICBbImZvbyIsICJiYXIiXQorICAgICAgICApCisgICAgICAgIHNlbGYuX2RvX3Rlc3RfY29tbWFuZGxpbmUoCisgICAgICAgICAgICAnZm9vICJzcGFtIGFuZCBlZ2dzIiAic2lsbHkgd2FsayInLAorICAgICAgICAgICAgWyJmb28iLCAic3BhbSBhbmQgZWdncyIsICJzaWxseSB3YWxrIl0KKyAgICAgICAgKQorICAgICAgICBzZWxmLl9kb190ZXN0X2NvbW1hbmRsaW5lKAorICAgICAgICAgICAgJ2ZvbyAiYSBcXCJxdW90ZWRcXCIgYXJnIiBiYXInLAorICAgICAgICAgICAgWyJmb28iLCAnYSAicXVvdGVkIiBhcmcnLCAiYmFyIl0KKyAgICAgICAgKQorICAgICAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5fY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wb3BlbigiZXhpdCAwIikuY2xvc2UoKSwgTm9uZSkKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wb3BlbigiZXhpdCA0MiIpLmNsb3NlKCksIDQyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wb3BlbigiZXhpdCA0MiIpLmNsb3NlKCksIDQyIDw8IDgpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBvcGVuVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWQxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3Blbi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiZWQxY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3Blbi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4yLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDEwNzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHkKQEAgLTAsMCArMSwxMzAgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKyIiIlRlc3Qgc2NyaXB0IGZvciBwb3BlbjIucHkiIiIKKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4qcG9wZW4yIG1vZHVsZSBpcyBkZXByZWNhdGVkLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQord2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJvc1wucG9wZW4uIGlzIGRlcHJlY2F0ZWQuKiIsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcG9wZW4yCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgcmVhcF9jaGlsZHJlbgorCitpZiBzeXMucGxhdGZvcm1bOjRdID09ICdiZW9zJyBvciBzeXMucGxhdGZvcm1bOjZdID09ICdhdGhlb3MnOgorICAgICMgIExvY2tzIGdldCBtZXNzZWQgdXAgb3Igc29tZXRoaW5nLiAgR2VuZXJhbGx5IHdlJ3JlIHN1cHBvc2VkCisgICAgIyAgdG8gYXZvaWQgbWl4aW5nICJwb3NpeCIgZm9yayAmIGV4ZWMgd2l0aCBuYXRpdmUgdGhyZWFkcywgYW5kCisgICAgIyAgdGhleSBtYXkgYmUgcmlnaHQgYWJvdXQgdGhhdCBhZnRlciBhbGwuCisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInBvcGVuMigpIGRvZXNuJ3Qgd29yayBvbiAiICsgc3lzLnBsYXRmb3JtKQorCisjIGlmIHdlIGRvbid0IGhhdmUgb3MucG9wZW4sIGNoZWNrIHRoYXQKKyMgd2UgaGF2ZSBvcy5mb3JrLiAgaWYgbm90LCBza2lwIHRoZSB0ZXN0CisjIChieSByYWlzaW5nIGFuIEltcG9ydEVycm9yKQordHJ5OgorICAgIGZyb20gb3MgaW1wb3J0IHBvcGVuCisgICAgZGVsIHBvcGVuCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBvcyBpbXBvcnQgZm9yaworICAgIGRlbCBmb3JrCisKK2NsYXNzIFBvcGVuMlRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNtZCA9ICJjYXQiCisgICAgaWYgb3MubmFtZSA9PSAibnQiOgorICAgICAgICBjbWQgPSAibW9yZSIKKyAgICB0ZXN0c3RyID0gImFiIGNkXG4iCisgICAgIyAibW9yZSIgZG9lc24ndCBhY3QgdGhlIHNhbWUgd2F5IGFjcm9zcyBXaW5kb3dzIGZsYXZvcnMsCisgICAgIyBzb21ldGltZXMgYWRkaW5nIGFuIGV4dHJhIG5ld2xpbmUgYXQgdGhlIHN0YXJ0IG9yIHRoZQorICAgICMgZW5kLiAgU28gd2Ugc3RyaXAgd2hpdGVzcGFjZSBvZmYgYm90aCBlbmRzIGZvciBjb21wYXJpc29uLgorICAgIGV4cGVjdGVkID0gdGVzdHN0ci5zdHJpcCgpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHBvcGVuMi5fY2xlYW51cCgpCisgICAgICAgICMgV2hlbiB0aGUgdGVzdCBydW5zLCB0aGVyZSBzaG91bGRuJ3QgYmUgYW55IG9wZW4gcGlwZXMKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwb3BlbjIuX2FjdGl2ZSwgIkFjdGl2ZSBwaXBlcyB3aGVuIHRlc3Qgc3RhcnRzIiArCisgICAgICAgICAgICByZXByKFtjLmNtZCBmb3IgYyBpbiBwb3BlbjIuX2FjdGl2ZV0pKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3IgaW5zdCBpbiBwb3BlbjIuX2FjdGl2ZToKKyAgICAgICAgICAgIGluc3Qud2FpdCgpCisgICAgICAgIHBvcGVuMi5fY2xlYW51cCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocG9wZW4yLl9hY3RpdmUsICJwb3BlbjIuX2FjdGl2ZSBub3QgZW1wdHkiKQorICAgICAgICAjIFRoZSBvcy5wb3BlbiooKSBBUEkgZGVsZWdhdGVzIHRvIHRoZSBzdWJwcm9jZXNzIG1vZHVsZSAob24gVW5peCkKKyAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgZm9yIGluc3QgaW4gc3VicHJvY2Vzcy5fYWN0aXZlOgorICAgICAgICAgICAgaW5zdC53YWl0KCkKKyAgICAgICAgc3VicHJvY2Vzcy5fY2xlYW51cCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3VicHJvY2Vzcy5fYWN0aXZlLCAic3VicHJvY2Vzcy5fYWN0aXZlIG5vdCBlbXB0eSIpCisgICAgICAgIHJlYXBfY2hpbGRyZW4oKQorCisgICAgZGVmIHZhbGlkYXRlX291dHB1dChzZWxmLCB0ZXN0c3RyLCBleHBlY3RlZF9vdXQsIHIsIHcsIGU9Tm9uZSk6CisgICAgICAgIHcud3JpdGUodGVzdHN0cikKKyAgICAgICAgdy5jbG9zZSgpCisgICAgICAgIGdvdCA9IHIucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfb3V0LCBnb3Quc3RyaXAoKSwgIndyb3RlICVyIHJlYWQgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAodGVzdHN0ciwgZ290KSkKKworICAgICAgICBpZiBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZ290ID0gZS5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZ290LCAidW5leHBlY3RlZCAlciBvbiBzdGRlcnIiICUgZ290KQorCisgICAgZGVmIHRlc3RfcG9wZW4yKHNlbGYpOgorICAgICAgICByLCB3ID0gcG9wZW4yLnBvcGVuMihzZWxmLmNtZCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9vdXRwdXQoc2VsZi50ZXN0c3RyLCBzZWxmLmV4cGVjdGVkLCByLCB3KQorCisgICAgZGVmIHRlc3RfcG9wZW4zKHNlbGYpOgorICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICByLCB3LCBlID0gcG9wZW4yLnBvcGVuMyhbc2VsZi5jbWRdKQorICAgICAgICAgICAgc2VsZi52YWxpZGF0ZV9vdXRwdXQoc2VsZi50ZXN0c3RyLCBzZWxmLmV4cGVjdGVkLCByLCB3LCBlKQorCisgICAgICAgIHIsIHcsIGUgPSBwb3BlbjIucG9wZW4zKHNlbGYuY21kKQorICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcsIGUpCisKKyAgICBkZWYgdGVzdF9vc19wb3BlbjIoc2VsZik6CisgICAgICAgICMgc2FtZSB0ZXN0IGFzIHRlc3RfcG9wZW4yKCksIGJ1dCB1c2luZyB0aGUgb3MucG9wZW4qKCkgQVBJCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHcsIHIgPSBvcy5wb3BlbjIoW3NlbGYuY21kXSkKKyAgICAgICAgICAgIHNlbGYudmFsaWRhdGVfb3V0cHV0KHNlbGYudGVzdHN0ciwgc2VsZi5leHBlY3RlZCwgciwgdykKKworICAgICAgICAgICAgdywgciA9IG9zLnBvcGVuMihbImVjaG8iLCBzZWxmLnRlc3RzdHJdKQorICAgICAgICAgICAgZ290ID0gci5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBzZWxmLnRlc3RzdHIgKyAiXG4iKQorCisgICAgICAgIHcsIHIgPSBvcy5wb3BlbjIoc2VsZi5jbWQpCisgICAgICAgIHNlbGYudmFsaWRhdGVfb3V0cHV0KHNlbGYudGVzdHN0ciwgc2VsZi5leHBlY3RlZCwgciwgdykKKworICAgIGRlZiB0ZXN0X29zX3BvcGVuMyhzZWxmKToKKyAgICAgICAgIyBzYW1lIHRlc3QgYXMgdGVzdF9wb3BlbjMoKSwgYnV0IHVzaW5nIHRoZSBvcy5wb3BlbiooKSBBUEkKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgdywgciwgZSA9IG9zLnBvcGVuMyhbc2VsZi5jbWRdKQorICAgICAgICAgICAgc2VsZi52YWxpZGF0ZV9vdXRwdXQoc2VsZi50ZXN0c3RyLCBzZWxmLmV4cGVjdGVkLCByLCB3LCBlKQorCisgICAgICAgICAgICB3LCByLCBlID0gb3MucG9wZW4zKFsiZWNobyIsIHNlbGYudGVzdHN0cl0pCisgICAgICAgICAgICBnb3QgPSByLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIHNlbGYudGVzdHN0ciArICJcbiIpCisgICAgICAgICAgICBnb3QgPSBlLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnb3QsICJ1bmV4cGVjdGVkICVyIG9uIHN0ZGVyciIgJSBnb3QpCisKKyAgICAgICAgdywgciwgZSA9IG9zLnBvcGVuMyhzZWxmLmNtZCkKKyAgICAgICAgc2VsZi52YWxpZGF0ZV9vdXRwdXQoc2VsZi50ZXN0c3RyLCBzZWxmLmV4cGVjdGVkLCByLCB3LCBlKQorCisgICAgZGVmIHRlc3Rfb3NfcG9wZW40KHNlbGYpOgorICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICB3LCByID0gb3MucG9wZW40KFtzZWxmLmNtZF0pCisgICAgICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcpCisKKyAgICAgICAgICAgIHcsIHIgPSBvcy5wb3BlbjQoWyJlY2hvIiwgc2VsZi50ZXN0c3RyXSkKKyAgICAgICAgICAgIGdvdCA9IHIucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgc2VsZi50ZXN0c3RyICsgIlxuIikKKworICAgICAgICB3LCByID0gb3MucG9wZW40KHNlbGYuY21kKQorICAgICAgICBzZWxmLnZhbGlkYXRlX291dHB1dChzZWxmLnRlc3RzdHIsIHNlbGYuZXhwZWN0ZWQsIHIsIHcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChQb3BlbjJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4yLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzRlNzEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4yLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BlbjIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4yLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzRlNzEzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wZW4yLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3BsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUwNWMyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGxpYi5weQpAQCAtMCwwICsxLDM0NSBAQAorIiIiVGVzdCBzY3JpcHQgZm9yIHBvcGxpYiBtb2R1bGUuIiIiCisKKyMgTW9kaWZpZWQgYnkgR2lhbXBhb2xvIFJvZG9sYScgdG8gZ2l2ZSBwb3BsaWIuUE9QMyBhbmQgcG9wbGliLlBPUDNfU1NMCisjIGEgcmVhbCB0ZXN0IHN1aXRlCisKK2ltcG9ydCBwb3BsaWIKK2ltcG9ydCBhc3luY29yZQoraW1wb3J0IGFzeW5jaGF0CitpbXBvcnQgc29ja2V0CitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitpbXBvcnQgZXJybm8KKworZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBIT1NUCit0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKKworCisjIHRoZSBkdW1teSBkYXRhIHJldHVybmVkIGJ5IHNlcnZlciB3aGVuIExJU1QgYW5kIFJFVFIgY29tbWFuZHMgYXJlIGlzc3VlZAorTElTVF9SRVNQID0gJzEgMVxyXG4yIDJcclxuMyAzXHJcbjQgNFxyXG41IDVcclxuLlxyXG4nCitSRVRSX1JFU1AgPSAiIiJGcm9tOiBwb3N0bWFzdGVyQHB5dGhvbi5vcmdcCitcclxuQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcblwKK01JTUUtVmVyc2lvbjogMS4wXHJcblwKK1N1YmplY3Q6IER1bW15XHJcblwKK1xyXG5cCitsaW5lMVxyXG5cCitsaW5lMlxyXG5cCitsaW5lM1xyXG5cCisuXHJcbiIiIgorCisKK2NsYXNzIER1bW15UE9QM0hhbmRsZXIoYXN5bmNoYXQuYXN5bmNfY2hhdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQuX19pbml0X18oc2VsZiwgY29ubikKKyAgICAgICAgc2VsZi5zZXRfdGVybWluYXRvcigiXHJcbiIpCisgICAgICAgIHNlbGYuaW5fYnVmZmVyID0gW10KKyAgICAgICAgc2VsZi5wdXNoKCcrT0sgZHVtbXkgcG9wMyBzZXJ2ZXIgcmVhZHkuJykKKworICAgIGRlZiBjb2xsZWN0X2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuaW5fYnVmZmVyLmFwcGVuZChkYXRhKQorCisgICAgZGVmIGZvdW5kX3Rlcm1pbmF0b3Ioc2VsZik6CisgICAgICAgIGxpbmUgPSAnJy5qb2luKHNlbGYuaW5fYnVmZmVyKQorICAgICAgICBzZWxmLmluX2J1ZmZlciA9IFtdCisgICAgICAgIGNtZCA9IGxpbmUuc3BsaXQoJyAnKVswXS5sb3dlcigpCisgICAgICAgIHNwYWNlID0gbGluZS5maW5kKCcgJykKKyAgICAgICAgaWYgc3BhY2UgIT0gLTE6CisgICAgICAgICAgICBhcmcgPSBsaW5lW3NwYWNlICsgMTpdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmcgPSAiIgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdjbWRfJyArIGNtZCk6CisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsICdjbWRfJyArIGNtZCkKKyAgICAgICAgICAgIG1ldGhvZChhcmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB1c2goJy1FUlIgdW5yZWNvZ25pemVkIFBPUDMgY29tbWFuZCAiJXMiLicgJWNtZCkKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlCisKKyAgICBkZWYgcHVzaChzZWxmLCBkYXRhKToKKyAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5wdXNoKHNlbGYsIGRhdGEgKyAnXHJcbicpCisKKyAgICBkZWYgY21kX2VjaG8oc2VsZiwgYXJnKToKKyAgICAgICAgIyBzZW5kcyBiYWNrIHRoZSByZWNlaXZlZCBzdHJpbmcgKHVzZWQgYnkgdGhlIHRlc3Qgc3VpdGUpCisgICAgICAgIHNlbGYucHVzaChhcmcpCisKKyAgICBkZWYgY21kX3VzZXIoc2VsZiwgYXJnKToKKyAgICAgICAgaWYgYXJnICE9ICJndWlkbyI6CisgICAgICAgICAgICBzZWxmLnB1c2goIi1FUlIgbm8gc3VjaCB1c2VyIikKKyAgICAgICAgc2VsZi5wdXNoKCcrT0sgcGFzc3dvcmQgcmVxdWlyZWQnKQorCisgICAgZGVmIGNtZF9wYXNzKHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGFyZyAhPSAicHl0aG9uIjoKKyAgICAgICAgICAgIHNlbGYucHVzaCgiLUVSUiB3cm9uZyBwYXNzd29yZCIpCisgICAgICAgIHNlbGYucHVzaCgnK09LIDEwIG1lc3NhZ2VzJykKKworICAgIGRlZiBjbWRfc3RhdChzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLnB1c2goJytPSyAxMCAxMDAnKQorCisgICAgZGVmIGNtZF9saXN0KHNlbGYsIGFyZyk6CisgICAgICAgIGlmIGFyZzoKKyAgICAgICAgICAgIHNlbGYucHVzaCgnK09LICVzICVzJyAlKGFyZywgYXJnKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnK09LJykKKyAgICAgICAgICAgIGFzeW5jaGF0LmFzeW5jX2NoYXQucHVzaChzZWxmLCBMSVNUX1JFU1ApCisKKyAgICBjbWRfdWlkbCA9IGNtZF9saXN0CisKKyAgICBkZWYgY21kX3JldHIoc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5wdXNoKCcrT0sgJXMgYnl0ZXMnICVsZW4oUkVUUl9SRVNQKSkKKyAgICAgICAgYXN5bmNoYXQuYXN5bmNfY2hhdC5wdXNoKHNlbGYsIFJFVFJfUkVTUCkKKworICAgIGNtZF90b3AgPSBjbWRfcmV0cgorCisgICAgZGVmIGNtZF9kZWxlKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnK09LIG1lc3NhZ2UgbWFya2VkIGZvciBkZWxldGlvbi4nKQorCisgICAgZGVmIGNtZF9ub29wKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnK09LIGRvbmUgbm90aGluZy4nKQorCisgICAgZGVmIGNtZF9ycG9wKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYucHVzaCgnK09LIGRvbmUgbm90aGluZy4nKQorCisKK2NsYXNzIER1bW15UE9QM1NlcnZlcihhc3luY29yZS5kaXNwYXRjaGVyLCB0aHJlYWRpbmcuVGhyZWFkKToKKworICAgIGhhbmRsZXIgPSBEdW1teVBPUDNIYW5kbGVyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYWRkcmVzcywgYWY9c29ja2V0LkFGX0lORVQpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5jcmVhdGVfc29ja2V0KGFmLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYmluZChhZGRyZXNzKQorICAgICAgICBzZWxmLmxpc3Rlbig1KQorICAgICAgICBzZWxmLmFjdGl2ZSA9IEZhbHNlCisgICAgICAgIHNlbGYuYWN0aXZlX2xvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0ID0gc2VsZi5zb2NrZXQuZ2V0c29ja25hbWUoKVs6Ml0KKworICAgIGRlZiBzdGFydChzZWxmKToKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLmFjdGl2ZQorICAgICAgICBzZWxmLl9fZmxhZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuc3RhcnQoc2VsZikKKyAgICAgICAgc2VsZi5fX2ZsYWcud2FpdCgpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmFjdGl2ZSA9IFRydWUKKyAgICAgICAgc2VsZi5fX2ZsYWcuc2V0KCkKKyAgICAgICAgd2hpbGUgc2VsZi5hY3RpdmUgYW5kIGFzeW5jb3JlLnNvY2tldF9tYXA6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZV9sb2NrLmFjcXVpcmUoKQorICAgICAgICAgICAgYXN5bmNvcmUubG9vcCh0aW1lb3V0PTAuMSwgY291bnQ9MSkKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlX2xvY2sucmVsZWFzZSgpCisgICAgICAgIGFzeW5jb3JlLmNsb3NlX2FsbChpZ25vcmVfYWxsPVRydWUpCisKKyAgICBkZWYgc3RvcChzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuYWN0aXZlCisgICAgICAgIHNlbGYuYWN0aXZlID0gRmFsc2UKKyAgICAgICAgc2VsZi5qb2luKCkKKworICAgIGRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5hY2NlcHQoKQorICAgICAgICBzZWxmLmhhbmRsZXIgPSBzZWxmLmhhbmRsZXIoY29ubikKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorICAgIGhhbmRsZV9yZWFkID0gaGFuZGxlX2Nvbm5lY3QKKworICAgIGRlZiB3cml0YWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlCisKKworY2xhc3MgVGVzdFBPUDNDbGFzcyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0T0soc2VsZiwgcmVzcCk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwLnN0YXJ0c3dpdGgoIitPSyIpKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15UE9QM1NlcnZlcigoSE9TVCwgMCkpCisgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5jbGllbnQgPSBwb3BsaWIuUE9QMyhzZWxmLnNlcnZlci5ob3N0LCBzZWxmLnNlcnZlci5wb3J0KQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsaWVudC5xdWl0KCkKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF9nZXR3ZWxjb21lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LmdldHdlbGNvbWUoKSwgJytPSyBkdW1teSBwb3AzIHNlcnZlciByZWFkeS4nKQorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocG9wbGliLmVycm9yX3Byb3RvLCBzZWxmLmNsaWVudC5fc2hvcnRjbWQsICdlY2hvIC1lcnInKQorCisgICAgZGVmIHRlc3RfdXNlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPSyhzZWxmLmNsaWVudC51c2VyKCdndWlkbycpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhwb3BsaWIuZXJyb3JfcHJvdG8sIHNlbGYuY2xpZW50LnVzZXIsICdpbnZhbGlkJykKKworICAgIGRlZiB0ZXN0X3Bhc3NfKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9LKHNlbGYuY2xpZW50LnBhc3NfKCdweXRob24nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocG9wbGliLmVycm9yX3Byb3RvLCBzZWxmLmNsaWVudC51c2VyLCAnaW52YWxpZCcpCisKKyAgICBkZWYgdGVzdF9zdGF0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpZW50LnN0YXQoKSwgKDEwLCAxMDApKQorCisgICAgZGVmIHRlc3RfbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC5saXN0KClbMTpdLAorICAgICAgICAgICAgICAgICAgICAgICAgIChbJzEgMScsICcyIDInLCAnMyAzJywgJzQgNCcsICc1IDUnXSwgMjUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jbGllbnQubGlzdCgnMScpLmVuZHN3aXRoKCJPSyAxIDEiKSkKKworICAgIGRlZiB0ZXN0X3JldHIoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gKCcrT0sgMTE2IGJ5dGVzJywKKyAgICAgICAgICAgICAgICAgICAgWydGcm9tOiBwb3N0bWFzdGVyQHB5dGhvbi5vcmcnLCAnQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJywKKyAgICAgICAgICAgICAgICAgICAgICdNSU1FLVZlcnNpb246IDEuMCcsICdTdWJqZWN0OiBEdW1teScsCisgICAgICAgICAgICAgICAgICAgICAnJywgJ2xpbmUxJywgJ2xpbmUyJywgJ2xpbmUzJ10sCisgICAgICAgICAgICAgICAgICAgIDExMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC5yZXRyKCdmb28nKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9kZWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9LKHNlbGYuY2xpZW50LmRlbGUoJ2ZvbycpKQorCisgICAgZGVmIHRlc3Rfbm9vcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRPSyhzZWxmLmNsaWVudC5ub29wKCkpCisKKyAgICBkZWYgdGVzdF9ycG9wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE9LKHNlbGYuY2xpZW50LnJwb3AoJ2ZvbycpKQorCisgICAgZGVmIHRlc3RfdG9wKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICAoJytPSyAxMTYgYnl0ZXMnLAorICAgICAgICAgICAgICAgICAgICAgWydGcm9tOiBwb3N0bWFzdGVyQHB5dGhvbi5vcmcnLCAnQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluJywKKyAgICAgICAgICAgICAgICAgICAgICAnTUlNRS1WZXJzaW9uOiAxLjAnLCAnU3ViamVjdDogRHVtbXknLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAnbGluZTEnLCAnbGluZTInLCAnbGluZTMnXSwKKyAgICAgICAgICAgICAgICAgICAgIDExMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaWVudC50b3AoMSwgMSksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfdWlkbChzZWxmKToKKyAgICAgICAgc2VsZi5jbGllbnQudWlkbCgpCisgICAgICAgIHNlbGYuY2xpZW50LnVpZGwoJ2ZvbycpCisKKworU1VQUE9SVFNfU1NMID0gRmFsc2UKK2lmIGhhc2F0dHIocG9wbGliLCAnUE9QM19TU0wnKToKKyAgICBpbXBvcnQgc3NsCisKKyAgICBTVVBQT1JUU19TU0wgPSBUcnVlCisgICAgQ0VSVEZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIsICJrZXljZXJ0LnBlbSIpCisKKyAgICBjbGFzcyBEdW1teVBPUDNfU1NMSGFuZGxlcihEdW1teVBPUDNIYW5kbGVyKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY29ubik6CisgICAgICAgICAgICBhc3luY2hhdC5hc3luY19jaGF0Ll9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgICAgICBzZWxmLnNvY2tldCA9IHNzbC53cmFwX3NvY2tldChzZWxmLnNvY2tldCwgY2VydGZpbGU9Q0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfc2lkZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCisgICAgICAgICAgICAjIE11c3QgdHJ5IGhhbmRzaGFrZSBiZWZvcmUgY2FsbGluZyBwdXNoKCkKKyAgICAgICAgICAgIHNlbGYuX3NzbF9hY2NlcHRpbmcgPSBUcnVlCisgICAgICAgICAgICBzZWxmLl9kb19zc2xfaGFuZHNoYWtlKCkKKyAgICAgICAgICAgIHNlbGYuc2V0X3Rlcm1pbmF0b3IoIlxyXG4iKQorICAgICAgICAgICAgc2VsZi5pbl9idWZmZXIgPSBbXQorICAgICAgICAgICAgc2VsZi5wdXNoKCcrT0sgZHVtbXkgcG9wMyBzZXJ2ZXIgcmVhZHkuJykKKworICAgICAgICBkZWYgX2RvX3NzbF9oYW5kc2hha2Uoc2VsZik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrZXQuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSBpbiAoc3NsLlNTTF9FUlJPUl9XQU5UX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbC5TU0xfRVJST1JfV0FOVF9XUklURSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGVsaWYgZXJyLmFyZ3NbMF0gPT0gc3NsLlNTTF9FUlJPUl9FT0Y6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSA9PSBlcnJuby5FQ09OTkFCT1JURUQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZV9jbG9zZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX3NzbF9hY2NlcHRpbmcgPSBGYWxzZQorCisgICAgICAgIGRlZiBoYW5kbGVfcmVhZChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuX3NzbF9hY2NlcHRpbmc6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9fc3NsX2hhbmRzaGFrZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIER1bW15UE9QM0hhbmRsZXIuaGFuZGxlX3JlYWQoc2VsZikKKworICAgIGNsYXNzIFRlc3RQT1AzX1NTTENsYXNzKFRlc3RQT1AzQ2xhc3MpOgorICAgICAgICAjIHJlcGVhdCBwcmV2aW91cyB0ZXN0cyBieSB1c2luZyBwb3BsaWIuUE9QM19TU0wKKworICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICBzZWxmLnNlcnZlciA9IER1bW15UE9QM1NlcnZlcigoSE9TVCwgMCkpCisgICAgICAgICAgICBzZWxmLnNlcnZlci5oYW5kbGVyID0gRHVtbXlQT1AzX1NTTEhhbmRsZXIKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0YXJ0KCkKKyAgICAgICAgICAgIHNlbGYuY2xpZW50ID0gcG9wbGliLlBPUDNfU1NMKHNlbGYuc2VydmVyLmhvc3QsIHNlbGYuc2VydmVyLnBvcnQpCisKKyAgICAgICAgZGVmIHRlc3RfX2FsbF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignUE9QM19TU0wnLCBwb3BsaWIuX19hbGxfXykKKworCitjbGFzcyBUZXN0VGltZW91dHMoVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoNjApICAjIFNhZmV0eSBuZXQuIExvb2sgaXNzdWUgMTE4MTIKKyAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCisgICAgICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaykpCisgICAgICAgIHNlbGYudGhyZWFkLnNldERhZW1vbihUcnVlKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRocmVhZC5qb2luKCkKKyAgICAgICAgZGVsIHNlbGYudGhyZWFkICAjIENsZWFyIG91dCBhbnkgZGFuZ2xpbmcgVGhyZWFkIG9iamVjdHMuCisKKyAgICBkZWYgc2VydmVyKHNlbGYsIGV2dCwgc2Vydik6CisgICAgICAgIHNlcnYubGlzdGVuKDUpCisgICAgICAgIGV2dC5zZXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb25uLCBhZGRyID0gc2Vydi5hY2NlcHQoKQorICAgICAgICAgICAgY29ubi5zZW5kKCIrIEhvbGEgbXVuZG9cbiIpCisgICAgICAgICAgICBjb25uLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2Vydi5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwb3AgPSBwb3BsaWIuUE9QMyhIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3Auc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBwb3Auc29jay5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwb3AgPSBwb3BsaWIuUE9QMyhIT1NULCBzZWxmLnBvcnQsIHRpbWVvdXQ9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocG9wLnNvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHBvcC5zb2NrLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dFZhbHVlKHNlbGYpOgorICAgICAgICBwb3AgPSBwb3BsaWIuUE9QMyhIT1NULCBzZWxmLnBvcnQsIHRpbWVvdXQ9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9wLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyAgICAgICAgcG9wLnNvY2suY2xvc2UoKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0cyA9IFtUZXN0UE9QM0NsYXNzLCBUZXN0VGltZW91dHNdCisgICAgaWYgU1VQUE9SVFNfU1NMOgorICAgICAgICB0ZXN0cy5hcHBlbmQoVGVzdFBPUDNfU1NMQ2xhc3MpCisgICAgdGhyZWFkX2luZm8gPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICB0cnk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorICAgIGZpbmFsbHk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wbGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3ZjEyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9wbGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IyYjA4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BvcGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3NpeC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE4Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHkKQEAgLTAsMCArMSw1NDYgQEAKKyJUZXN0IHBvc2l4IGZ1bmN0aW9ucyIKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBTa2lwIHRoZXNlIHRlc3RzIGlmIHRoZXJlIGlzIG5vIHBvc2l4IG1vZHVsZS4KK3Bvc2l4ID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3Bvc2l4JykKKworaW1wb3J0IGVycm5vCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IG9zCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBwd2QKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzdGF0CitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCisKK19EVU1NWV9TWU1MSU5LID0gb3MucGF0aC5qb2luKHRlbXBmaWxlLmdldHRlbXBkaXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAnLWR1bW15LXN5bWxpbmsnKQorCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgJy4qIHBvdGVudGlhbCBzZWN1cml0eSByaXNrIC4qJywKKyAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVXYXJuaW5nKQorCitjbGFzcyBQb3NpeFRlc3Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgY3JlYXRlIGVtcHR5IGZpbGUKKyAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3KycpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi50ZWFyZG93bl9maWxlcyA9IFsgdGVzdF9zdXBwb3J0LlRFU1RGTiBdCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciB0ZWFyZG93bl9maWxlIGluIHNlbGYudGVhcmRvd25fZmlsZXM6CisgICAgICAgICAgICBvcy51bmxpbmsodGVhcmRvd25fZmlsZSkKKworICAgIGRlZiB0ZXN0Tm9BcmdGdW5jdGlvbnMoc2VsZik6CisgICAgICAgICMgdGVzdCBwb3NpeCBmdW5jdGlvbnMgd2hpY2ggdGFrZSBubyBhcmd1bWVudHMgYW5kIGhhdmUKKyAgICAgICAgIyBubyBzaWRlLWVmZmVjdHMgd2hpY2ggd2UgbmVlZCB0byBjbGVhbnVwIChlLmcuLCBmb3JrLCB3YWl0LCBhYm9ydCkKKyAgICAgICAgTk9fQVJHX0ZVTkNUSU9OUyA9IFsgImN0ZXJtaWQiLCAiZ2V0Y3dkIiwgImdldGN3ZHUiLCAidW5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXMiLCAiZ2V0bG9hZGF2ZyIsICJ0bXBuYW0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0ZWdpZCIsICJnZXRldWlkIiwgImdldGdpZCIsICJnZXRncm91cHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0cGlkIiwgImdldHBncnAiLCAiZ2V0cHBpZCIsICJnZXR1aWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgXQorCisgICAgICAgIHdpdGggd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gTk9fQVJHX0ZVTkNUSU9OUzoKKyAgICAgICAgICAgICAgICBwb3NpeF9mdW5jID0gZ2V0YXR0cihwb3NpeCwgbmFtZSwgTm9uZSkKKyAgICAgICAgICAgICAgICBpZiBwb3NpeF9mdW5jIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBwb3NpeF9mdW5jKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3NpeF9mdW5jLCAxKQorCisgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2dldHJlc3VpZCcpOgorICAgICAgICBkZWYgdGVzdF9nZXRyZXN1aWQoc2VsZik6CisgICAgICAgICAgICB1c2VyX2lkcyA9IHBvc2l4LmdldHJlc3VpZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih1c2VyX2lkcyksIDMpCisgICAgICAgICAgICBmb3IgdmFsIGluIHVzZXJfaWRzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKHZhbCwgMCkKKworICAgIGlmIGhhc2F0dHIocG9zaXgsICdnZXRyZXNnaWQnKToKKyAgICAgICAgZGVmIHRlc3RfZ2V0cmVzZ2lkKHNlbGYpOgorICAgICAgICAgICAgZ3JvdXBfaWRzID0gcG9zaXguZ2V0cmVzZ2lkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGdyb3VwX2lkcyksIDMpCisgICAgICAgICAgICBmb3IgdmFsIGluIGdyb3VwX2lkczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCh2YWwsIDApCisKKyAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc2V0cmVzdWlkJyk6CisgICAgICAgIGRlZiB0ZXN0X3NldHJlc3VpZChzZWxmKToKKyAgICAgICAgICAgIGN1cnJlbnRfdXNlcl9pZHMgPSBwb3NpeC5nZXRyZXN1aWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocG9zaXguc2V0cmVzdWlkKCpjdXJyZW50X3VzZXJfaWRzKSkKKyAgICAgICAgICAgICMgLTEgbWVhbnMgZG9uJ3QgY2hhbmdlIHRoYXQgdmFsdWUuCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm9uZShwb3NpeC5zZXRyZXN1aWQoLTEsIC0xLCAtMSkpCisKKyAgICAgICAgZGVmIHRlc3Rfc2V0cmVzdWlkX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgICAgICMgRG9uJ3QgZG8gdGhpcyB0ZXN0IGlmIHNvbWVvbmUgaXMgc2lsbHkgZW5vdWdoIHRvIHJ1biB1cyBhcyByb290LgorICAgICAgICAgICAgY3VycmVudF91c2VyX2lkcyA9IHBvc2l4LmdldHJlc3VpZCgpCisgICAgICAgICAgICBpZiAwIG5vdCBpbiBjdXJyZW50X3VzZXJfaWRzOgorICAgICAgICAgICAgICAgIG5ld191c2VyX2lkcyA9IChjdXJyZW50X3VzZXJfaWRzWzBdKzEsIC0xLCAtMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5zZXRyZXN1aWQsICpuZXdfdXNlcl9pZHMpCisKKyAgICBpZiBoYXNhdHRyKHBvc2l4LCAnc2V0cmVzZ2lkJyk6CisgICAgICAgIGRlZiB0ZXN0X3NldHJlc2dpZChzZWxmKToKKyAgICAgICAgICAgIGN1cnJlbnRfZ3JvdXBfaWRzID0gcG9zaXguZ2V0cmVzZ2lkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBvc2l4LnNldHJlc2dpZCgqY3VycmVudF9ncm91cF9pZHMpKQorICAgICAgICAgICAgIyAtMSBtZWFucyBkb24ndCBjaGFuZ2UgdGhhdCB2YWx1ZS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHBvc2l4LnNldHJlc2dpZCgtMSwgLTEsIC0xKSkKKworICAgICAgICBkZWYgdGVzdF9zZXRyZXNnaWRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAgICAgIyBEb24ndCBkbyB0aGlzIHRlc3QgaWYgc29tZW9uZSBpcyBzaWxseSBlbm91Z2ggdG8gcnVuIHVzIGFzIHJvb3QuCisgICAgICAgICAgICBjdXJyZW50X2dyb3VwX2lkcyA9IHBvc2l4LmdldHJlc2dpZCgpCisgICAgICAgICAgICBpZiAwIG5vdCBpbiBjdXJyZW50X2dyb3VwX2lkczoKKyAgICAgICAgICAgICAgICBuZXdfZ3JvdXBfaWRzID0gKGN1cnJlbnRfZ3JvdXBfaWRzWzBdKzEsIC0xLCAtMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5zZXRyZXNnaWQsICpuZXdfZ3JvdXBfaWRzKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2luaXRncm91cHMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCBuZWVkcyBvcy5pbml0Z3JvdXBzKCkiKQorICAgIGRlZiB0ZXN0X2luaXRncm91cHMoc2VsZik6CisgICAgICAgICMgSXQgdGFrZXMgYSBzdHJpbmcgYW5kIGFuIGludGVnZXI7IGNoZWNrIHRoYXQgaXQgcmFpc2VzIGEgVHlwZUVycm9yCisgICAgICAgICMgZm9yIG90aGVyIGFyZ3VtZW50IGxpc3RzLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LmluaXRncm91cHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXguaW5pdGdyb3VwcywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3NpeC5pbml0Z3JvdXBzLCAzLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3NpeC5pbml0Z3JvdXBzLCAiZm9vIiwgMywgb2JqZWN0KCkpCisKKyAgICAgICAgIyBJZiBhIG5vbi1wcml2aWxlZ2VkIHVzZXIgaW52b2tlcyBpdCwgaXQgc2hvdWxkIGZhaWwgd2l0aCBPU0Vycm9yCisgICAgICAgICMgRVBFUk0uCisgICAgICAgIGlmIG9zLmdldHVpZCgpICE9IDA6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbmFtZSA9IHB3ZC5nZXRwd3VpZChwb3NpeC5nZXR1aWQoKSkucHdfbmFtZQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICMgdGhlIGN1cnJlbnQgVUlEIG1heSBub3QgaGF2ZSBhIHB3ZCBlbnRyeQorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJuZWVkIGEgcHdkIGVudHJ5IikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwb3NpeC5pbml0Z3JvdXBzKG5hbWUsIDEzKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZXJybm8sIGVycm5vLkVQRVJNKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIE9TRXJyb3IgdG8gYmUgcmFpc2VkIGJ5IGluaXRncm91cHMiKQorCisgICAgZGVmIHRlc3Rfc3RhdHZmcyhzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3N0YXR2ZnMnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0dmZzKG9zLmN1cmRpcikpCisKKyAgICBkZWYgdGVzdF9mc3RhdHZmcyhzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2ZzdGF0dmZzJyk6CisgICAgICAgICAgICBmcCA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguZnN0YXR2ZnMoZnAuZmlsZW5vKCkpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9mdHJ1bmNhdGUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdmdHJ1bmNhdGUnKToKKyAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAndysnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgd2UgbmVlZCB0byBoYXZlIHNvbWUgZGF0YSB0byB0cnVuY2F0ZQorICAgICAgICAgICAgICAgIGZwLndyaXRlKCd0ZXN0JykKKyAgICAgICAgICAgICAgICBmcC5mbHVzaCgpCisgICAgICAgICAgICAgICAgcG9zaXguZnRydW5jYXRlKGZwLmZpbGVubygpLCAwKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9kdXAoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdkdXAnKToKKyAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZkID0gcG9zaXguZHVwKGZwLmZpbGVubygpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmZCwgaW50KQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9jb25mc3RyKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnY29uZnN0cicpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG9zaXguY29uZnN0ciwgIkNTX2dhcmJhZ2UiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocG9zaXguY29uZnN0cigiQ1NfUEFUSCIpKSA+IDAsIFRydWUpCisKKyAgICBkZWYgdGVzdF9kdXAyKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZHVwMicpOgorICAgICAgICAgICAgZnAxID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgZnAyID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBvc2l4LmR1cDIoZnAxLmZpbGVubygpLCBmcDIuZmlsZW5vKCkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZwMS5jbG9zZSgpCisgICAgICAgICAgICAgICAgZnAyLmNsb3NlKCkKKworICAgIGRlZiBmZG9wZW5faGVscGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgZmQgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLk9fUkRPTkxZKQorICAgICAgICBmcDIgPSBwb3NpeC5mZG9wZW4oZmQsICphcmdzKQorICAgICAgICBmcDIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZmRvcGVuKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZmRvcGVuJyk6CisgICAgICAgICAgICBzZWxmLmZkb3Blbl9oZWxwZXIoKQorICAgICAgICAgICAgc2VsZi5mZG9wZW5faGVscGVyKCdyJykKKyAgICAgICAgICAgIHNlbGYuZmRvcGVuX2hlbHBlcigncicsIDEwMCkKKworICAgIGRlZiB0ZXN0X29zZXhsb2NrKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAiT19FWExPQ0siKToKKyAgICAgICAgICAgIGZkID0gb3Mub3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fV1JPTkxZfG9zLk9fRVhMT0NLfG9zLk9fQ1JFQVQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5vcGVuLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19FWExPQ0t8b3MuT19OT05CTE9DSykKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorCisgICAgICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAiT19TSExPQ0siKToKKyAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19TSExPQ0t8b3MuT19DUkVBVCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBvcy5vcGVuLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fV1JPTkxZfG9zLk9fRVhMT0NLfG9zLk9fTk9OQkxPQ0spCisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisKKyAgICBkZWYgdGVzdF9vc3NobG9jayhzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgIk9fU0hMT0NLIik6CisgICAgICAgICAgICBmZDEgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19TSExPQ0t8b3MuT19DUkVBVCkKKyAgICAgICAgICAgIGZkMiA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFl8b3MuT19TSExPQ0t8b3MuT19DUkVBVCkKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkMikKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkMSkKKworICAgICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgIk9fRVhMT0NLIik6CisgICAgICAgICAgICAgICAgZmQgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLk9fV1JPTkxZfG9zLk9fU0hMT0NLfG9zLk9fQ1JFQVQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3Mub3BlbiwgdGVzdF9zdXBwb3J0LlRFU1RGTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5PX1JET05MWXxvcy5PX0VYTE9DS3xvcy5PX05PTkJMT0NLKQorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorCisgICAgZGVmIHRlc3RfZnN0YXQoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdmc3RhdCcpOgorICAgICAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmZzdGF0KGZwLmZpbGVubygpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfc3RhdChzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3N0YXQnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pKQorCisgICAgZGVmIF90ZXN0X2FsbF9jaG93bl9jb21tb24oc2VsZiwgY2hvd25fZnVuYywgZmlyc3RfcGFyYW0sIHN0YXRfZnVuYyk6CisgICAgICAgICIiIkNvbW1vbiBjb2RlIGZvciBjaG93biwgZmNob3duIGFuZCBsY2hvd24gdGVzdHMuIiIiCisgICAgICAgIGRlZiBjaGVja19zdGF0KHVpZCwgZ2lkKToKKyAgICAgICAgICAgIGlmIHN0YXRfZnVuYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzdGF0ID0gc3RhdF9mdW5jKGZpcnN0X3BhcmFtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdC5zdF91aWQsIHVpZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXQuc3RfZ2lkLCBnaWQpCisgICAgICAgIHVpZCA9IG9zLmdldHVpZCgpCisgICAgICAgIGdpZCA9IG9zLmdldGdpZCgpCisgICAgICAgICMgdGVzdCBhIHN1Y2Nlc3NmdWwgY2hvd24gY2FsbAorICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCB1aWQsIGdpZCkKKyAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgY2hvd25fZnVuYyhmaXJzdF9wYXJhbSwgLTEsIGdpZCkKKyAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKyAgICAgICAgY2hvd25fZnVuYyhmaXJzdF9wYXJhbSwgdWlkLCAtMSkKKyAgICAgICAgY2hlY2tfc3RhdCh1aWQsIGdpZCkKKworICAgICAgICBpZiB1aWQgPT0gMDoKKyAgICAgICAgICAgICMgVHJ5IGFuIGFtdXNpbmdseSBsYXJnZSB1aWQvZ2lkIHRvIG1ha2Ugc3VyZSB3ZSBoYW5kbGUKKyAgICAgICAgICAgICMgbGFyZ2UgdW5zaWduZWQgdmFsdWVzLiAgKGNob3duIGxldHMgeW91IHVzZSBhbnkKKyAgICAgICAgICAgICMgdWlkL2dpZCB5b3UgbGlrZSwgZXZlbiBpZiB0aGV5IGFyZW4ndCBkZWZpbmVkLikKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgVGhpcyBwcm9ibGVtIGtlZXBzIGNvbWluZyB1cDoKKyAgICAgICAgICAgICMgICBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTc0Nzg1OAorICAgICAgICAgICAgIyAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU0NTkxCisgICAgICAgICAgICAjICAgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTE1MzAxCisgICAgICAgICAgICAjIEhvcGVmdWxseSB0aGUgZml4IGluIDQ1OTEgZml4ZXMgaXQgZm9yIGdvb2QhCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoaXMgcGFydCBvZiB0aGUgdGVzdCBvbmx5IHJ1bnMgd2hlbiBydW4gYXMgcm9vdC4KKyAgICAgICAgICAgICMgT25seSBzY2FyeSBwZW9wbGUgcnVuIHRoZWlyIHRlc3RzIGFzIHJvb3QuCisKKyAgICAgICAgICAgIGJpZ192YWx1ZSA9IDIqKjMxCisgICAgICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCBiaWdfdmFsdWUsIGJpZ192YWx1ZSkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQoYmlnX3ZhbHVlLCBiaWdfdmFsdWUpCisgICAgICAgICAgICBjaG93bl9mdW5jKGZpcnN0X3BhcmFtLCAtMSwgLTEpCisgICAgICAgICAgICBjaGVja19zdGF0KGJpZ192YWx1ZSwgYmlnX3ZhbHVlKQorICAgICAgICAgICAgY2hvd25fZnVuYyhmaXJzdF9wYXJhbSwgdWlkLCBnaWQpCisgICAgICAgICAgICBjaGVja19zdGF0KHVpZCwgZ2lkKQorICAgICAgICBlbGlmIHBsYXRmb3JtLnN5c3RlbSgpIGluICgnSFAtVVgnLCAnU3VuT1MnKToKKyAgICAgICAgICAgICMgSFAtVVggYW5kIFNvbGFyaXMgY2FuIGFsbG93IGEgbm9uLXJvb3QgdXNlciB0byBjaG93bigpIHRvIHJvb3QKKyAgICAgICAgICAgICMgKGlzc3VlICM1MTEzKQorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlNraXBwaW5nIGJlY2F1c2Ugb2Ygbm9uLXN0YW5kYXJkIGNob3duKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlaGF2aW9yIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbm9uLXJvb3QgY2Fubm90IGNob3duIHRvIHJvb3QsIHJhaXNlcyBPU0Vycm9yCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjaG93bl9mdW5jLCBmaXJzdF9wYXJhbSwgMCwgMCkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQodWlkLCBnaWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjaG93bl9mdW5jLCBmaXJzdF9wYXJhbSwgMCwgLTEpCisgICAgICAgICAgICBjaGVja19zdGF0KHVpZCwgZ2lkKQorICAgICAgICAgICAgaWYgMCBub3QgaW4gb3MuZ2V0Z3JvdXBzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2hvd25fZnVuYywgZmlyc3RfcGFyYW0sIC0xLCAwKQorICAgICAgICAgICAgICAgIGNoZWNrX3N0YXQodWlkLCBnaWQpCisgICAgICAgICMgdGVzdCBpbGxlZ2FsIHR5cGVzCisgICAgICAgIGZvciB0IGluIHN0ciwgZmxvYXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNob3duX2Z1bmMsIGZpcnN0X3BhcmFtLCB0KHVpZCksIGdpZCkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQodWlkLCBnaWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNob3duX2Z1bmMsIGZpcnN0X3BhcmFtLCB1aWQsIHQoZ2lkKSkKKyAgICAgICAgICAgIGNoZWNrX3N0YXQodWlkLCBnaWQpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHBvc2l4LCAnY2hvd24nKSwgInRlc3QgbmVlZHMgb3MuY2hvd24oKSIpCisgICAgZGVmIHRlc3RfY2hvd24oc2VsZik6CisgICAgICAgICMgcmFpc2UgYW4gT1NFcnJvciBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdAorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgcG9zaXguY2hvd24sIHRlc3Rfc3VwcG9ydC5URVNURk4sIC0xLCAtMSkKKworICAgICAgICAjIHJlLWNyZWF0ZSB0aGUgZmlsZQorICAgICAgICBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3JykuY2xvc2UoKQorICAgICAgICBzZWxmLl90ZXN0X2FsbF9jaG93bl9jb21tb24ocG9zaXguY2hvd24sIHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHBvc2l4LCAnc3RhdCcsIE5vbmUpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2ZjaG93bicpLCAidGVzdCBuZWVkcyBvcy5mY2hvd24oKSIpCisgICAgZGVmIHRlc3RfZmNob3duKHNlbGYpOgorICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgICAgICAjIHJlLWNyZWF0ZSB0aGUgZmlsZQorICAgICAgICB0ZXN0X2ZpbGUgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmQgPSB0ZXN0X2ZpbGUuZmlsZW5vKCkKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfYWxsX2Nob3duX2NvbW1vbihwb3NpeC5mY2hvd24sIGZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIocG9zaXgsICdmc3RhdCcsIE5vbmUpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGVzdF9maWxlLmNsb3NlKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdsY2hvd24nKSwgInRlc3QgbmVlZHMgb3MubGNob3duKCkiKQorICAgIGRlZiB0ZXN0X2xjaG93bihzZWxmKToKKyAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICMgY3JlYXRlIGEgc3ltbGluaworICAgICAgICBvcy5zeW1saW5rKF9EVU1NWV9TWU1MSU5LLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLl90ZXN0X2FsbF9jaG93bl9jb21tb24ocG9zaXgubGNob3duLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihwb3NpeCwgJ2xzdGF0JywgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9jaGRpcihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2NoZGlyJyk6CisgICAgICAgICAgICBwb3NpeC5jaGRpcihvcy5jdXJkaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBwb3NpeC5jaGRpciwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2xzZGlyKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnbHNkaXInKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgcG9zaXgubHNkaXIob3MuY3VyZGlyKSkKKworICAgIGRlZiB0ZXN0X2FjY2VzcyhzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ2FjY2VzcycpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmFjY2Vzcyh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBvcy5SX09LKSkKKworICAgIGRlZiB0ZXN0X3VtYXNrKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAndW1hc2snKToKKyAgICAgICAgICAgIG9sZF9tYXNrID0gcG9zaXgudW1hc2soMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvbGRfbWFzaywgaW50KQorICAgICAgICAgICAgcG9zaXgudW1hc2sob2xkX21hc2spCisKKyAgICBkZWYgdGVzdF9zdHJlcnJvcihzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3N0cmVycm9yJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguc3RyZXJyb3IoMCkpCisKKyAgICBkZWYgdGVzdF9waXBlKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAncGlwZScpOgorICAgICAgICAgICAgcmVhZGVyLCB3cml0ZXIgPSBwb3NpeC5waXBlKCkKKyAgICAgICAgICAgIG9zLmNsb3NlKHJlYWRlcikKKyAgICAgICAgICAgIG9zLmNsb3NlKHdyaXRlcikKKworICAgIGRlZiB0ZXN0X3RlbXBuYW0oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICd0ZW1wbmFtJyk6CisgICAgICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0ZW1wbmFtIiwgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC50ZW1wbmFtKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnRlbXBuYW0ob3MuY3VyZGlyKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXgudGVtcG5hbShvcy5jdXJkaXIsICdibGFoJykpCisKKyAgICBkZWYgdGVzdF90bXBmaWxlKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAndG1wZmlsZScpOgorICAgICAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAidG1wZmlsZSIsIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgICAgICBmcCA9IHBvc2l4LnRtcGZpbGUoKQorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3V0aW1lKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAndXRpbWUnKToKKyAgICAgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBwb3NpeC51dGltZSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3NpeC51dGltZSwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwb3NpeC51dGltZSwgdGVzdF9zdXBwb3J0LlRFU1RGTiwgKG5vdywgTm9uZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4LnV0aW1lLCB0ZXN0X3N1cHBvcnQuVEVTVEZOLCAoTm9uZSwgbm93KSkKKyAgICAgICAgICAgIHBvc2l4LnV0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4sIChpbnQobm93KSwgaW50KG5vdykpKQorICAgICAgICAgICAgcG9zaXgudXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTiwgKG5vdywgbm93KSkKKworICAgIGRlZiBfdGVzdF9jaGZsYWdzX3JlZ3VsYXJfZmlsZShzZWxmLCBjaGZsYWdzX2Z1bmMsIHRhcmdldF9maWxlKToKKyAgICAgICAgc3QgPSBvcy5zdGF0KHRhcmdldF9maWxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzdCwgJ3N0X2ZsYWdzJykpCisKKyAgICAgICAgIyBaRlMgcmV0dXJucyBFT1BOT1RTVVBQIHdoZW4gYXR0ZW1wdGluZyB0byBzZXQgZmxhZyBVRl9JTU1VVEFCTEUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoZmxhZ3NfZnVuYyh0YXJnZXRfZmlsZSwgc3Quc3RfZmxhZ3MgfCBzdGF0LlVGX0lNTVVUQUJMRSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgZXJyLmVycm5vICE9IGVycm5vLkVPUE5PVFNVUFA6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIG1zZyA9ICdjaGZsYWcgVUZfSU1NVVRBQkxFIG5vdCBzdXBwb3J0ZWQgYnkgdW5kZXJseWluZyBmcycKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QobXNnKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5ld19zdCA9IG9zLnN0YXQodGFyZ2V0X2ZpbGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0LnN0X2ZsYWdzIHwgc3RhdC5VRl9JTU1VVEFCTEUsIG5ld19zdC5zdF9mbGFncykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmZCA9IG9wZW4odGFyZ2V0X2ZpbGUsICd3KycpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lcnJubywgZXJybm8uRVBFUk0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBwb3NpeC5jaGZsYWdzKHRhcmdldF9maWxlLCBzdC5zdF9mbGFncykKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdjaGZsYWdzJyksICd0ZXN0IG5lZWRzIG9zLmNoZmxhZ3MoKScpCisgICAgZGVmIHRlc3RfY2hmbGFncyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9jaGZsYWdzX3JlZ3VsYXJfZmlsZShwb3NpeC5jaGZsYWdzLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihwb3NpeCwgJ2xjaGZsYWdzJyksICd0ZXN0IG5lZWRzIG9zLmxjaGZsYWdzKCknKQorICAgIGRlZiB0ZXN0X2xjaGZsYWdzX3JlZ3VsYXJfZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9jaGZsYWdzX3JlZ3VsYXJfZmlsZShwb3NpeC5sY2hmbGFncywgdGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdsY2hmbGFncycpLCAndGVzdCBuZWVkcyBvcy5sY2hmbGFncygpJykKKyAgICBkZWYgdGVzdF9sY2hmbGFnc19zeW1saW5rKHNlbGYpOgorICAgICAgICB0ZXN0Zm5fc3QgPSBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIodGVzdGZuX3N0LCAnc3RfZmxhZ3MnKSkKKworICAgICAgICBvcy5zeW1saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4sIF9EVU1NWV9TWU1MSU5LKQorICAgICAgICBzZWxmLnRlYXJkb3duX2ZpbGVzLmFwcGVuZChfRFVNTVlfU1lNTElOSykKKyAgICAgICAgZHVtbXlfc3ltbGlua19zdCA9IG9zLmxzdGF0KF9EVU1NWV9TWU1MSU5LKQorCisgICAgICAgICMgWkZTIHJldHVybnMgRU9QTk9UU1VQUCB3aGVuIGF0dGVtcHRpbmcgdG8gc2V0IGZsYWcgVUZfSU1NVVRBQkxFLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwb3NpeC5sY2hmbGFncyhfRFVNTVlfU1lNTElOSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bW15X3N5bWxpbmtfc3Quc3RfZmxhZ3MgfCBzdGF0LlVGX0lNTVVUQUJMRSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgZXJyLmVycm5vICE9IGVycm5vLkVPUE5PVFNVUFA6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIG1zZyA9ICdjaGZsYWcgVUZfSU1NVVRBQkxFIG5vdCBzdXBwb3J0ZWQgYnkgdW5kZXJseWluZyBmcycKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QobXNnKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5ld190ZXN0Zm5fc3QgPSBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgICAgICBuZXdfZHVtbXlfc3ltbGlua19zdCA9IG9zLmxzdGF0KF9EVU1NWV9TWU1MSU5LKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3Rmbl9zdC5zdF9mbGFncywgbmV3X3Rlc3Rmbl9zdC5zdF9mbGFncykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHVtbXlfc3ltbGlua19zdC5zdF9mbGFncyB8IHN0YXQuVUZfSU1NVVRBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfZHVtbXlfc3ltbGlua19zdC5zdF9mbGFncykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHBvc2l4LmxjaGZsYWdzKF9EVU1NWV9TWU1MSU5LLCBkdW1teV9zeW1saW5rX3N0LnN0X2ZsYWdzKQorCisgICAgZGVmIHRlc3RfZ2V0Y3dkX2xvbmdfcGF0aG5hbWVzKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZ2V0Y3dkJyk6CisgICAgICAgICAgICBkaXJuYW1lID0gJ2dldGN3ZC10ZXN0LWRpcmVjdG9yeS0wMTIzNDU2Nzg5YWJjZGVmLTAxMjM0NTY3ODkwYWJjZGVmJworICAgICAgICAgICAgY3VyZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgIGJhc2VfcGF0aCA9IG9zLnBhdGguYWJzcGF0aCh0ZXN0X3N1cHBvcnQuVEVTVEZOKSArICcuZ2V0Y3dkJworCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MubWtkaXIoYmFzZV9wYXRoKQorICAgICAgICAgICAgICAgIG9zLmNoZGlyKGJhc2VfcGF0aCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyMgICAgICAgICAgICAgICBKdXN0IHJldHVybmluZyBub3RoaW5nIGluc3RlYWQgb2YgdGhlIFNraXBUZXN0IGV4Y2VwdGlvbiwKKyMgICAgICAgICAgICAgICBiZWNhdXNlIHRoZSB0ZXN0IHJlc3VsdHMgaW4gRXJyb3IgaW4gdGhhdCBjYXNlLgorIyAgICAgICAgICAgICAgIElzIHRoYXQgb2s/CisjICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0LCAiY2Fubm90IGNyZWF0ZSBkaXJlY3RvcnkgZm9yIHRlc3RpbmciCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZWYgX2NyZWF0ZV9hbmRfZG9fZ2V0Y3dkKGRpcm5hbWUsIGN1cnJlbnRfcGF0aF9sZW5ndGggPSAwKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgb3MubWtkaXIoZGlybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QsICJta2RpciBjYW5ub3QgY3JlYXRlIGRpcmVjdG9yeSBzdWZmaWNpZW50bHkgZGVlcCBmb3IgZ2V0Y3dkIHRlc3QiCisKKyAgICAgICAgICAgICAgICAgICAgb3MuY2hkaXIoZGlybmFtZSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGN1cnJlbnRfcGF0aF9sZW5ndGggPCA0MDk5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jcmVhdGVfYW5kX2RvX2dldGN3ZChkaXJuYW1lLCBjdXJyZW50X3BhdGhfbGVuZ3RoICsgbGVuKGRpcm5hbWUpICsgMSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2Vycm5vID0gZXJybm8uRU5BTUVUT09MT05HCisgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgcGxhdGZvcm1zIGhhdmUgcXVpcmt5IGdldGN3ZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGJlaGF2aW91ciAtLSBzZWUgaXNzdWUgOTE4NSBhbmQgMTU3NjUgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAjIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBxdWlya3lfcGxhdGZvcm0gPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N1bm9zJyBpbiBzeXMucGxhdGZvcm0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmV0YnNkJyBpbiBzeXMucGxhdGZvcm0gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3BlbmJzZCcgaW4gc3lzLnBsYXRmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBxdWlya3lfcGxhdGZvcm06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXJybm8gPSBlcnJuby5FUkFOR0UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lcnJubywgZXhwZWN0ZWRfZXJybm8pCisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcignLi4nKQorICAgICAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKKworICAgICAgICAgICAgICAgIF9jcmVhdGVfYW5kX2RvX2dldGN3ZChkaXJuYW1lKQorCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKGN1cmRpcikKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGJhc2VfcGF0aCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdnZXRlZ2lkJyksICJ0ZXN0IG5lZWRzIG9zLmdldGVnaWQoKSIpCisgICAgZGVmIHRlc3RfZ2V0Z3JvdXBzKHNlbGYpOgorICAgICAgICB3aXRoIG9zLnBvcGVuKCdpZCAtRycpIGFzIGlkZzoKKyAgICAgICAgICAgIGdyb3VwcyA9IGlkZy5yZWFkKCkuc3RyaXAoKQorICAgICAgICAgICAgcmV0ID0gaWRnLmNsb3NlKCkKKworICAgICAgICBpZiByZXQgIT0gTm9uZSBvciBub3QgZ3JvdXBzOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm5lZWQgd29ya2luZyAnaWQgLUcnIikKKworICAgICAgICAjIElzc3VlcyAxNjY5ODogT1MgWCBBQklzIHByaW9yIHRvIDEwLjYgaGF2ZSBsaW1pdHMgb24gZ2V0Z3JvdXBzKCkKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgICAgICAgICAgaW1wb3J0IHN5c2NvbmZpZworICAgICAgICAgICAgZHQgPSBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcpIG9yICcxMC4wJworICAgICAgICAgICAgaWYgZmxvYXQoZHQpIDwgMTAuNjoKKyAgICAgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiZ2V0Z3JvdXBzKDIpIGlzIGJyb2tlbiBwcmlvciB0byAxMC42IikKKworICAgICAgICAjICdpZCAtRycgYW5kICdvcy5nZXRncm91cHMoKScgc2hvdWxkIHJldHVybiB0aGUgc2FtZQorICAgICAgICAjIGdyb3VwcywgaWdub3Jpbmcgb3JkZXIgYW5kIGR1cGxpY2F0ZXMuCisgICAgICAgICMgIzEwODIyIC0gaXQgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCB3aGV0aGVyIHBvc2l4LmdldGdyb3VwcygpCisgICAgICAgICMgaW5jbHVkZXMgdGhlIGVmZmVjdGl2ZSBnaWQgc28gd2UgaW5jbHVkZSBpdCBhbnl3YXksIHNpbmNlIGlkIC1HIGRvZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICBzZXQoW2ludCh4KSBmb3IgeCBpbiBncm91cHMuc3BsaXQoKV0pLAorICAgICAgICAgICAgICAgIHNldChwb3NpeC5nZXRncm91cHMoKSArIFtwb3NpeC5nZXRlZ2lkKCldKSkKKworY2xhc3MgUG9zaXhHcm91cHNUZXN0ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBwb3NpeC5nZXR1aWQoKSAhPSAwOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIm5vdCBlbm91Z2ggcHJpdmlsZWdlcyIpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHBvc2l4LCAnZ2V0Z3JvdXBzJyk6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgibmVlZCBwb3NpeC5nZXRncm91cHMiKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiZ2V0Z3JvdXBzKDIpIGlzIGJyb2tlbiBvbiBPU1giKQorICAgICAgICBzZWxmLnNhdmVkX2dyb3VwcyA9IHBvc2l4LmdldGdyb3VwcygpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdzZXRncm91cHMnKToKKyAgICAgICAgICAgIHBvc2l4LnNldGdyb3VwcyhzZWxmLnNhdmVkX2dyb3VwcykKKyAgICAgICAgZWxpZiBoYXNhdHRyKHBvc2l4LCAnaW5pdGdyb3VwcycpOgorICAgICAgICAgICAgbmFtZSA9IHB3ZC5nZXRwd3VpZChwb3NpeC5nZXR1aWQoKSkucHdfbmFtZQorICAgICAgICAgICAgcG9zaXguaW5pdGdyb3VwcyhuYW1lLCBzZWxmLnNhdmVkX2dyb3Vwc1swXSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdpbml0Z3JvdXBzJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgbmVlZHMgcG9zaXguaW5pdGdyb3VwcygpIikKKyAgICBkZWYgdGVzdF9pbml0Z3JvdXBzKHNlbGYpOgorICAgICAgICAjIGZpbmQgbWlzc2luZyBncm91cAorCisgICAgICAgIGcgPSBtYXgoc2VsZi5zYXZlZF9ncm91cHMpICsgMQorICAgICAgICBuYW1lID0gcHdkLmdldHB3dWlkKHBvc2l4LmdldHVpZCgpKS5wd19uYW1lCisgICAgICAgIHBvc2l4LmluaXRncm91cHMobmFtZSwgZykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihnLCBwb3NpeC5nZXRncm91cHMoKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIocG9zaXgsICdzZXRncm91cHMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCBuZWVkcyBwb3NpeC5zZXRncm91cHMoKSIpCisgICAgZGVmIHRlc3Rfc2V0Z3JvdXBzKHNlbGYpOgorICAgICAgICBmb3IgZ3JvdXBzIGluIFtbMF0sIHJhbmdlKDE2KV06CisgICAgICAgICAgICBwb3NpeC5zZXRncm91cHMoZ3JvdXBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoZ3JvdXBzLCBwb3NpeC5nZXRncm91cHMoKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQb3NpeFRlc3RlciwgUG9zaXhHcm91cHNUZXN0ZXIpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmMzZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmMzZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXgucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzRkYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5CkBAIC0wLDAgKzEsNDIzIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCB0ZXN0X2dlbmVyaWNwYXRoCisKK2ltcG9ydCBwb3NpeHBhdGgsIG9zCitmcm9tIHBvc2l4cGF0aCBpbXBvcnQgcmVhbHBhdGgsIGFic3BhdGgsIGRpcm5hbWUsIGJhc2VuYW1lCisKKyMgQW4gYWJzb2x1dGUgcGF0aCB0byBhIHRlbXBvcmFyeSBmaWxlbmFtZSBmb3IgdGVzdGluZy4gV2UgY2FuJ3QgcmVseSBvbiBURVNURk4KKyMgYmVpbmcgYW4gYWJzb2x1dGUgcGF0aCwgc28gd2UgbmVlZCB0aGlzLgorCitBQlNURk4gPSBhYnNwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pCisKK2RlZiBza2lwX2lmX0FCU1RGTl9jb250YWluc19iYWNrc2xhc2godGVzdCk6CisgICAgIiIiCisgICAgT24gV2luZG93cywgcG9zaXhwYXRoLmFic3BhdGggc3RpbGwgcmV0dXJucyBwYXRocyB3aXRoIGJhY2tzbGFzaGVzCisgICAgaW5zdGVhZCBvZiBwb3NpeCBmb3J3YXJkIHNsYXNoZXMuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHNldmVyYWwgdGVzdHMKKyAgICBmYWlsLCBzbyBza2lwIHRoZW0uCisgICAgIiIiCisgICAgZm91bmRfYmFja3NsYXNoID0gJ1xcJyBpbiBBQlNURk4KKyAgICBtc2cgPSAiQUJTVEZOIGlzIG5vdCBhIHBvc2l4IHBhdGggLSB0ZXN0cyBmYWlsIgorICAgIHJldHVybiBbdGVzdCwgdW5pdHRlc3Quc2tpcChtc2cpKHRlc3QpXVtmb3VuZF9iYWNrc2xhc2hdCisKK2RlZiBzYWZlX3JtZGlyKGRpcm5hbWUpOgorICAgIHRyeToKKyAgICAgICAgb3Mucm1kaXIoZGlybmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcGFzcworCitjbGFzcyBQb3NpeFBhdGhUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ZWFyRG93bigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBzdWZmaXggaW4gWyIiLCAiMSIsICIyIl06CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4gKyBzdWZmaXgpCisgICAgICAgICAgICBzYWZlX3JtZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4gKyBzdWZmaXgpCisKKyAgICBkZWYgdGVzdF9qb2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5qb2luKCIvZm9vIiwgImJhciIsICIvYmFyIiwgImJheiIpLCAiL2Jhci9iYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5qb2luKCIvZm9vIiwgImJhciIsICJiYXoiKSwgIi9mb28vYmFyL2JheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmpvaW4oIi9mb28vIiwgImJhci8iLCAiYmF6LyIpLCAiL2Zvby9iYXIvYmF6LyIpCisKKyAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguc3BsaXQoIi9mb28vYmFyIiksICgiL2ZvbyIsICJiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguc3BsaXQoIi8iKSwgKCIvIiwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdCgiZm9vIiksICgiIiwgImZvbyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdCgiLy8vL2ZvbyIpLCAoIi8vLy8iLCAiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0KCIvL2Zvby8vYmFyIiksICgiLy9mb28iLCAiYmFyIikpCisKKyAgICBkZWYgc3BsaXRleHRUZXN0KHNlbGYsIHBhdGgsIGZpbGVuYW1lLCBleHQpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdGV4dChwYXRoKSwgKGZpbGVuYW1lLCBleHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdGV4dCgiLyIgKyBwYXRoKSwgKCIvIiArIGZpbGVuYW1lLCBleHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdGV4dCgiYWJjLyIgKyBwYXRoKSwgKCJhYmMvIiArIGZpbGVuYW1lLCBleHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdGV4dCgiYWJjLmRlZi8iICsgcGF0aCksICgiYWJjLmRlZi8iICsgZmlsZW5hbWUsIGV4dCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnNwbGl0ZXh0KCIvYWJjLmRlZi8iICsgcGF0aCksICgiL2FiYy5kZWYvIiArIGZpbGVuYW1lLCBleHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5zcGxpdGV4dChwYXRoICsgIi8iKSwgKGZpbGVuYW1lICsgZXh0ICsgIi8iLCAiIikpCisKKyAgICBkZWYgdGVzdF9zcGxpdGV4dChzZWxmKToKKyAgICAgICAgc2VsZi5zcGxpdGV4dFRlc3QoImZvby5iYXIiLCAiZm9vIiwgIi5iYXIiKQorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiZm9vLmJvby5iYXIiLCAiZm9vLmJvbyIsICIuYmFyIikKKyAgICAgICAgc2VsZi5zcGxpdGV4dFRlc3QoImZvby5ib28uYmlmZi5iYXIiLCAiZm9vLmJvby5iaWZmIiwgIi5iYXIiKQorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiLmNzaC5yYyIsICIuY3NoIiwgIi5yYyIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCJub2RvdHMiLCAibm9kb3RzIiwgIiIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCIuY3NocmMiLCAiLmNzaHJjIiwgIiIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCIuLi5tYW55ZG90cyIsICIuLi5tYW55ZG90cyIsICIiKQorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiLi4ubWFueWRvdHMuZXh0IiwgIi4uLm1hbnlkb3RzIiwgIi5leHQiKQorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiLiIsICIuIiwgIiIpCisgICAgICAgIHNlbGYuc3BsaXRleHRUZXN0KCIuLiIsICIuLiIsICIiKQorICAgICAgICBzZWxmLnNwbGl0ZXh0VGVzdCgiLi4uLi4uLi4iLCAiLi4uLi4uLi4iLCAiIikKKyAgICAgICAgc2VsZi5zcGxpdGV4dFRlc3QoIiIsICIiLCAiIikKKworICAgIGRlZiB0ZXN0X2lzYWJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2FicygiIiksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2FicygiLyIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2FicygiL2ZvbyIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2FicygiL2Zvby9iYXIiKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwb3NpeHBhdGguaXNhYnMoImZvby9iYXIiKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9iYXNlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguYmFzZW5hbWUoIi9mb28vYmFyIiksICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5iYXNlbmFtZSgiLyIpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguYmFzZW5hbWUoImZvbyIpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguYmFzZW5hbWUoIi8vLy9mb28iKSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmJhc2VuYW1lKCIvL2Zvby8vYmFyIiksICJiYXIiKQorCisgICAgZGVmIHRlc3RfZGlybmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZGlybmFtZSgiL2Zvby9iYXIiKSwgIi9mb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5kaXJuYW1lKCIvIiksICIvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZGlybmFtZSgiZm9vIiksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5kaXJuYW1lKCIvLy8vZm9vIiksICIvLy8vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGguZGlybmFtZSgiLy9mb28vL2JhciIpLCAiLy9mb28iKQorCisgICAgZGVmIHRlc3RfaXNsaW5rKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2xpbmsodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiksIEZhbHNlKQorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5pc2xpbmsodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiksIEZhbHNlKQorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhwb3NpeHBhdGguaXNsaW5rKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpLCBUcnVlKQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzbGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiKSwgVHJ1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzKHBvc2l4cGF0aC5leGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIiksIEZhbHNlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmxleGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIiksIFRydWUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBub3QgZi5jbG9zZSgpOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfc2FtZWZpbGUoc2VsZik6CisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYud3JpdGUoImZvbyIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgcG9zaXhwYXRoLnNhbWVmaWxlKAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBUcnVlCisgICAgICAgICAgICApCisKKyAgICAgICAgICAgICMgSWYgd2UgZG9uJ3QgaGF2ZSBsaW5rcywgYXNzdW1lIHRoYXQgb3Muc3RhdCBkb2Vzbid0IHJldHVybgorICAgICAgICAgICAgIyByZWFzb25hYmxlIGlub2RlIGluZm9ybWF0aW9uIGFuZCB0aHVzLCB0aGF0IHNhbWVmaWxlKCkgZG9lc24ndAorICAgICAgICAgICAgIyB3b3JrLgorICAgICAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLAorICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5zYW1lZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIFRydWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIiwgIndiIikKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJiYXIiKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5zYW1lZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIEZhbHNlCisgICAgICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3NhbWVzdGF0KHNlbGYpOgorICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKCJmb28iKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKAorICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5zYW1lc3RhdCgKKyAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKSwKKyAgICAgICAgICAgICAgICAgICAgb3Muc3RhdCh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgVHJ1ZQorICAgICAgICAgICAgKQorICAgICAgICAgICAgIyBJZiB3ZSBkb24ndCBoYXZlIGxpbmtzLCBhc3N1bWUgdGhhdCBvcy5zdGF0KCkgZG9lc24ndCByZXR1cm4KKyAgICAgICAgICAgICMgcmVhc29uYWJsZSBpbm9kZSBpbmZvcm1hdGlvbiBhbmQgdGh1cywgdGhhdCBzYW1lc3RhdCgpIGRvZXNuJ3QKKyAgICAgICAgICAgICMgd29yay4KKyAgICAgICAgICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CisgICAgICAgICAgICAgICAgb3Muc3ltbGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjEiLCB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgIjIiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5zYW1lc3RhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiksCisgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIFRydWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiArICIyIiwgIndiIikKKyAgICAgICAgICAgICAgICBmLndyaXRlKCJiYXIiKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoCisgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5zYW1lc3RhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zLnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTiArICIxIiksCisgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4gKyAiMiIpCisgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICAgIEZhbHNlCisgICAgICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IGYuY2xvc2UoKToKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2lzbW91bnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXMocG9zaXhwYXRoLmlzbW91bnQoIi8iKSwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2V4cGFuZHVzZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmV4cGFuZHVzZXIoImZvbyIpLCAiZm9vIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHB3ZAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4vIiksIGJhc2VzdHJpbmcpCisgICAgICAgICAgICAjIGlmIGhvbWUgZGlyZWN0b3J5ID09IHJvb3QgZGlyZWN0b3J5LCB0aGlzIHRlc3QgbWFrZXMgbm8gc2Vuc2UKKyAgICAgICAgICAgIGlmIHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+IikgIT0gJy8nOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+IikgKyAiLyIsCisgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+LyIpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+cm9vdC8iKSwgYmFzZXN0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwb3NpeHBhdGguZXhwYW5kdXNlcigifmZvby8iKSwgYmFzZXN0cmluZykKKworICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudjoKKyAgICAgICAgICAgICAgICBlbnZbJ0hPTUUnXSA9ICcvJworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4iKSwgIi8iKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn4vZm9vIiksICIvZm9vIikKKworICAgIGRlZiB0ZXN0X25vcm1wYXRoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiIiksICIuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgubm9ybXBhdGgoIi8iKSwgIi8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5ub3JtcGF0aCgiLy8iKSwgIi8vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgubm9ybXBhdGgoIi8vLyIpLCAiLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLm5vcm1wYXRoKCIvLy9mb28vLi8vYmFyLy8iKSwgIi9mb28vYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgubm9ybXBhdGgoIi8vL2Zvby8uLy9iYXIvLy4vLy4uLy8uLy9iYXoiKSwgIi9mb28vYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgubm9ybXBhdGgoIi8vLy4uLy8uL2Zvby8uLy9iYXIiKSwgIi9mb28vYmFyIikKKworICAgIEBza2lwX2lmX0FCU1RGTl9jb250YWluc19iYWNrc2xhc2gKKyAgICBkZWYgdGVzdF9yZWFscGF0aF9jdXJkaXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoJy4nKSwgb3MuZ2V0Y3dkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoJy4vLicpLCBvcy5nZXRjd2QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLycuam9pbihbJy4nXSAqIDEwMCkpLCBvcy5nZXRjd2QoKSkKKworICAgIEBza2lwX2lmX0FCU1RGTl9jb250YWluc19iYWNrc2xhc2gKKyAgICBkZWYgdGVzdF9yZWFscGF0aF9wYXJkaXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoJy4uJyksIGRpcm5hbWUob3MuZ2V0Y3dkKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCcuLi8uLicpLCBkaXJuYW1lKGRpcm5hbWUob3MuZ2V0Y3dkKCkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnLycuam9pbihbJy4uJ10gKiAxMDApKSwgJy8nKQorCisgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgZGVmIHRlc3RfcmVhbHBhdGhfYmFzaWMoc2VsZik6CisgICAgICAgICAgICAjIEJhc2ljIG9wZXJhdGlvbi4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKEFCU1RGTisiMSIsIEFCU1RGTikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTiksIEFCU1RGTisiMSIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWxwYXRoX3N5bWxpbmtfbG9vcHMoc2VsZik6CisgICAgICAgICAgICAjIEJ1ZyAjOTMwMDI0LCByZXR1cm4gdGhlIHBhdGggdW5jaGFuZ2VkIGlmIHdlIGdldCBpbnRvIGFuIGluZmluaXRlCisgICAgICAgICAgICAjIHN5bWxpbmsgbG9vcC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvbGRfcGF0aCA9IGFic3BhdGgoJy4nKQorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoQUJTVEZOLCBBQlNURk4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4pLCBBQlNURk4pCisKKyAgICAgICAgICAgICAgICBvcy5zeW1saW5rKEFCU1RGTisiMSIsIEFCU1RGTisiMiIpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhBQlNURk4rIjIiLCBBQlNURk4rIjEiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxIiksIEFCU1RGTisiMSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rIjIiKSwgQUJTVEZOKyIyIikKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxL3giKSwgQUJTVEZOKyIxL3giKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxLy4uIiksIGRpcm5hbWUoQUJTVEZOKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTisiMS8uLi94IiksIGRpcm5hbWUoQUJTVEZOKSArICIveCIpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhBQlNURk4rIngiLCBBQlNURk4rInkiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxLy4uLyIgKyBiYXNlbmFtZShBQlNURk4pICsgInkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTVEZOICsgInkiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOKyIxLy4uLyIgKyBiYXNlbmFtZShBQlNURk4pICsgIjEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUJTVEZOICsgIjEiKQorCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhiYXNlbmFtZShBQlNURk4pICsgImEvYiIsIEFCU1RGTisiYSIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4rImEiKSwgQUJTVEZOKyJhL2IiKQorCisgICAgICAgICAgICAgICAgb3Muc3ltbGluaygiLi4vIiArIGJhc2VuYW1lKGRpcm5hbWUoQUJTVEZOKSkgKyAiLyIgKworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUoQUJTVEZOKSArICJjIiwgQUJTVEZOKyJjIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKEFCU1RGTisiYyIpLCBBQlNURk4rImMiKQorCisgICAgICAgICAgICAgICAgIyBUZXN0IHVzaW5nIHJlbGF0aXZlIHBhdGggYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBvcy5jaGRpcihkaXJuYW1lKEFCU1RGTikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChiYXNlbmFtZShBQlNURk4pKSwgQUJTVEZOKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihvbGRfcGF0aCkKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTikKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTisiMSIpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4rIjIiKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOKyJ5IikKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTisiYyIpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4rImEiKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWxwYXRoX3JlcGVhdGVkX2luZGlyZWN0X3N5bWxpbmtzKHNlbGYpOgorICAgICAgICAgICAgIyBJc3N1ZSAjNjk3NS4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihBQlNURk4pCisgICAgICAgICAgICAgICAgb3Muc3ltbGluaygnLi4vJyArIGJhc2VuYW1lKEFCU1RGTiksIEFCU1RGTiArICcvc2VsZicpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluaygnc2VsZi9zZWxmL3NlbGYnLCBBQlNURk4gKyAnL2xpbmsnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHBhdGgoQUJTVEZOICsgJy9saW5rJyksIEFCU1RGTikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4gKyAnL3NlbGYnKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOICsgJy9saW5rJykKKyAgICAgICAgICAgICAgICBzYWZlX3JtZGlyKEFCU1RGTikKKworICAgICAgICBkZWYgdGVzdF9yZWFscGF0aF9kZWVwX3JlY3Vyc2lvbihzZWxmKToKKyAgICAgICAgICAgIGRlcHRoID0gMTAKKyAgICAgICAgICAgIG9sZF9wYXRoID0gYWJzcGF0aCgnLicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MubWtkaXIoQUJTVEZOKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGRlcHRoKToKKyAgICAgICAgICAgICAgICAgICAgb3Muc3ltbGluaygnLycuam9pbihbJyVkJyAlIGldICogMTApLCBBQlNURk4gKyAnLyVkJyAlIChpICsgMSkpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluaygnLicsIEFCU1RGTiArICcvMCcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4gKyAnLyVkJyAlIGRlcHRoKSwgQUJTVEZOKQorCisgICAgICAgICAgICAgICAgIyBUZXN0IHVzaW5nIHJlbGF0aXZlIHBhdGggYXMgd2VsbC4KKyAgICAgICAgICAgICAgICBvcy5jaGRpcihBQlNURk4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aCgnJWQnICUgZGVwdGgpLCBBQlNURk4pCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9wYXRoKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGRlcHRoICsgMSk6CisgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOICsgJy8lZCcgJSBpKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOKQorCisgICAgICAgIGRlZiB0ZXN0X3JlYWxwYXRoX3Jlc29sdmVfcGFyZW50cyhzZWxmKToKKyAgICAgICAgICAgICMgV2UgYWxzbyBuZWVkIHRvIHJlc29sdmUgYW55IHN5bWxpbmtzIGluIHRoZSBwYXJlbnRzIG9mIGEgcmVsYXRpdmUKKyAgICAgICAgICAgICMgcGF0aCBwYXNzZWQgdG8gcmVhbHBhdGguIEUuZy46IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMKKyAgICAgICAgICAgICMgL3Vzci9kb2Mgd2l0aCAnZG9jJyBiZWluZyBhIHN5bWxpbmsgdG8gL3Vzci9zaGFyZS9kb2MuIFdlIGNhbGwKKyAgICAgICAgICAgICMgcmVhbHBhdGgoImEiKS4gVGhpcyBzaG91bGQgcmV0dXJuIC91c3Ivc2hhcmUvZG9jL2EvLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9sZF9wYXRoID0gYWJzcGF0aCgnLicpCisgICAgICAgICAgICAgICAgb3MubWtkaXIoQUJTVEZOKQorICAgICAgICAgICAgICAgIG9zLm1rZGlyKEFCU1RGTiArICIveSIpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhBQlNURk4gKyAiL3kiLCBBQlNURk4gKyAiL2siKQorCisgICAgICAgICAgICAgICAgb3MuY2hkaXIoQUJTVEZOICsgIi9rIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKCJhIiksIEFCU1RGTiArICIveS9hIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIob2xkX3BhdGgpCisgICAgICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhBQlNURk4gKyAiL2siKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOICsgIi95IikKKyAgICAgICAgICAgICAgICBzYWZlX3JtZGlyKEFCU1RGTikKKworICAgICAgICBkZWYgdGVzdF9yZWFscGF0aF9yZXNvbHZlX2JlZm9yZV9ub3JtYWxpemluZyhzZWxmKToKKyAgICAgICAgICAgICMgQnVnICM5OTA2Njk6IFN5bWJvbGljIGxpbmtzIHNob3VsZCBiZSByZXNvbHZlZCBiZWZvcmUgd2UKKyAgICAgICAgICAgICMgbm9ybWFsaXplIHRoZSBwYXRoLiBFLmcuOiBpZiB3ZSBoYXZlIGRpcmVjdG9yaWVzICdhJywgJ2snIGFuZCAneScKKyAgICAgICAgICAgICMgaW4gdGhlIGZvbGxvd2luZyBoaWVyYXJjaHk6CisgICAgICAgICAgICAjIGEvay95CisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIGFuZCBhIHN5bWJvbGljIGxpbmsgJ2xpbmsteScgcG9pbnRpbmcgdG8gJ3knIGluIGRpcmVjdG9yeSAnYScsCisgICAgICAgICAgICAjIHRoZW4gcmVhbHBhdGgoImxpbmsteS8uLiIpIHNob3VsZCByZXR1cm4gJ2snLCBub3QgJ2EnLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9sZF9wYXRoID0gYWJzcGF0aCgnLicpCisgICAgICAgICAgICAgICAgb3MubWtkaXIoQUJTVEZOKQorICAgICAgICAgICAgICAgIG9zLm1rZGlyKEFCU1RGTiArICIvayIpCisgICAgICAgICAgICAgICAgb3MubWtkaXIoQUJTVEZOICsgIi9rL3kiKQorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoQUJTVEZOICsgIi9rL3kiLCBBQlNURk4gKyAiL2xpbmsteSIpCisKKyAgICAgICAgICAgICAgICAjIEFic29sdXRlIHBhdGguCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChBQlNURk4gKyAiL2xpbmsteS8uLiIpLCBBQlNURk4gKyAiL2siKQorICAgICAgICAgICAgICAgICMgUmVsYXRpdmUgcGF0aC4KKyAgICAgICAgICAgICAgICBvcy5jaGRpcihkaXJuYW1lKEFCU1RGTikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChiYXNlbmFtZShBQlNURk4pICsgIi9saW5rLXkvLi4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCU1RGTiArICIvayIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9wYXRoKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoQUJTVEZOICsgIi9saW5rLXkiKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOICsgIi9rL3kiKQorICAgICAgICAgICAgICAgIHNhZmVfcm1kaXIoQUJTVEZOICsgIi9rIikKKyAgICAgICAgICAgICAgICBzYWZlX3JtZGlyKEFCU1RGTikKKworICAgICAgICBkZWYgdGVzdF9yZWFscGF0aF9yZXNvbHZlX2ZpcnN0KHNlbGYpOgorICAgICAgICAgICAgIyBCdWcgIzEyMTM4OTQ6IFRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHBhdGgsIGlmIG5vdCBhYnNvbHV0ZSwKKyAgICAgICAgICAgICMgbXVzdCBiZSByZXNvbHZlZCB0b28uCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBvbGRfcGF0aCA9IGFic3BhdGgoJy4nKQorICAgICAgICAgICAgICAgIG9zLm1rZGlyKEFCU1RGTikKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihBQlNURk4gKyAiL2siKQorICAgICAgICAgICAgICAgIG9zLnN5bWxpbmsoQUJTVEZOLCBBQlNURk4gKyAibGluayIpCisgICAgICAgICAgICAgICAgb3MuY2hkaXIoZGlybmFtZShBQlNURk4pKQorCisgICAgICAgICAgICAgICAgYmFzZSA9IGJhc2VuYW1lKEFCU1RGTikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxwYXRoKGJhc2UgKyAibGluayIpLCBBQlNURk4pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscGF0aChiYXNlICsgImxpbmsvayIpLCBBQlNURk4gKyAiL2siKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihvbGRfcGF0aCkKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKEFCU1RGTiArICJsaW5rIikKKyAgICAgICAgICAgICAgICBzYWZlX3JtZGlyKEFCU1RGTiArICIvayIpCisgICAgICAgICAgICAgICAgc2FmZV9ybWRpcihBQlNURk4pCisKKyAgICBkZWYgdGVzdF9yZWxwYXRoKHNlbGYpOgorICAgICAgICAocmVhbF9nZXRjd2QsIG9zLmdldGN3ZCkgPSAob3MuZ2V0Y3dkLCBsYW1iZGE6IHIiL2hvbWUvdXNlci9iYXIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXJkaXIgPSBvcy5wYXRoLnNwbGl0KG9zLmdldGN3ZCgpKVstMV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHBvc2l4cGF0aC5yZWxwYXRoLCAiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoImEiKSwgImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aChwb3NpeHBhdGguYWJzcGF0aCgiYSIpKSwgImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiYS9iIiksICJhL2IiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiLi4vYS9iIiksICIuLi9hL2IiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiYSIsICIuLi9iIiksICIuLi8iK2N1cmRpcisiL2EiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiYS9iIiwgIi4uL2MiKSwgIi4uLyIrY3VyZGlyKyIvYS9iIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoImEiLCAiYi9jIiksICIuLi8uLi9hIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoImEiLCAiYSIpLCAiLiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIvZm9vL2Jhci9iYXQiLCAiL3gveS96IiksICcuLi8uLi8uLi9mb28vYmFyL2JhdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIvZm9vL2Jhci9iYXQiLCAiL2Zvby9iYXIiKSwgJ2JhdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIvZm9vL2Jhci9iYXQiLCAiLyIpLCAnZm9vL2Jhci9iYXQnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiLyIsICIvZm9vL2Jhci9iYXQiKSwgJy4uLy4uLy4uJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoIi9mb28vYmFyL2JhdCIsICIveCIpLCAnLi4vZm9vL2Jhci9iYXQnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpeHBhdGgucmVscGF0aCgiL3giLCAiL2Zvby9iYXIvYmF0IiksICcuLi8uLi8uLi94JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9zaXhwYXRoLnJlbHBhdGgoIi8iLCAiLyIpLCAnLicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIvYSIsICIvYSIpLCAnLicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvc2l4cGF0aC5yZWxwYXRoKCIvYS9iIiwgIi9hL2IiKSwgJy4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuZ2V0Y3dkID0gcmVhbF9nZXRjd2QKKworCitjbGFzcyBQb3NpeENvbW1vblRlc3QodGVzdF9nZW5lcmljcGF0aC5Db21tb25UZXN0KToKKyAgICBwYXRobW9kdWxlID0gcG9zaXhwYXRoCisgICAgYXR0cmlidXRlcyA9IFsncmVscGF0aCcsICdzYW1lZmlsZScsICdzYW1lb3BlbmZpbGUnLCAnc2FtZXN0YXQnXQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBvc2l4UGF0aFRlc3QsIFBvc2l4Q29tbW9uVGVzdCkKKworCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNjEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG9zaXhwYXRoLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUzNjEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG93LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcG93LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZTY3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3cucHkKQEAgLTAsMCArMSwxMjkgQEAKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydCwgdW5pdHRlc3QKKworY2xhc3MgUG93VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgcG93dGVzdChzZWxmLCB0eXBlKToKKyAgICAgICAgaWYgdHlwZSAhPSBmbG9hdDoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKC0xMDAwLCAxMDAwKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdyh0eXBlKGkpLCAwKSwgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdyh0eXBlKGkpLCAxKSwgdHlwZShpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdyh0eXBlKDApLCAxKSwgdHlwZSgwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdyh0eXBlKDEpLCAxKSwgdHlwZSgxKSkKKworICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTEwMCwgMTAwKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdyh0eXBlKGkpLCAzKSwgaSppKmkpCisKKyAgICAgICAgICAgIHBvdzIgPSAxCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLDMxKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygyLCBpKSwgcG93MikKKyAgICAgICAgICAgICAgICBpZiBpICE9IDMwIDogcG93MiA9IHBvdzIqMgorCisgICAgICAgICAgICBmb3Igb3RoZXJ0eXBlIGluIGludCwgbG9uZzoKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgtMTAsIDApICsgcmFuZ2UoMSwgMTApOgorICAgICAgICAgICAgICAgICAgICBpaSA9IHR5cGUoaSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoMSwgMTEpOgorICAgICAgICAgICAgICAgICAgICAgICAgamogPSAtb3RoZXJ0eXBlKGopCisgICAgICAgICAgICAgICAgICAgICAgICBwb3coaWksIGpqKQorCisgICAgICAgIGZvciBvdGhlcnR5cGUgaW4gaW50LCBsb25nLCBmbG9hdDoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDEwMCk6CisgICAgICAgICAgICAgICAgemVybyA9IHR5cGUoMCkKKyAgICAgICAgICAgICAgICBleHAgPSAtb3RoZXJ0eXBlKGkvMTAuMCkKKyAgICAgICAgICAgICAgICBpZiBleHAgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgcG93LCB6ZXJvLCBleHApCisKKyAgICAgICAgaWwsIGloID0gLTIwLCAyMAorICAgICAgICBqbCwgamggPSAtNSwgICA1CisgICAgICAgIGtsLCBraCA9IC0xMCwgMTAKKyAgICAgICAgYXNzZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGlmIHR5cGUgPT0gZmxvYXQ6CisgICAgICAgICAgICBpbCA9IDEKKyAgICAgICAgICAgIGFzc2VxID0gc2VsZi5hc3NlcnRBbG1vc3RFcXVhbAorICAgICAgICBlbGlmIHR5cGUgPT0gaW50OgorICAgICAgICAgICAgamwgPSAwCisgICAgICAgIGVsaWYgdHlwZSA9PSBsb25nOgorICAgICAgICAgICAgamwsIGpoID0gMCwgMTUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoaWwsIGloKzEpOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoamwsIGpoKzEpOgorICAgICAgICAgICAgICAgIGZvciBrIGluIHJhbmdlKGtsLCBraCsxKToKKyAgICAgICAgICAgICAgICAgICAgaWYgayAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSBmbG9hdCBvciBqIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvdywgdHlwZShpKSwgaiwgaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93KHR5cGUoaSksaixrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3codHlwZShpKSxqKSUgdHlwZShrKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfcG93aW50KHNlbGYpOgorICAgICAgICBzZWxmLnBvd3Rlc3QoaW50KQorCisgICAgZGVmIHRlc3RfcG93bG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5wb3d0ZXN0KGxvbmcpCisKKyAgICBkZWYgdGVzdF9wb3dmbG9hdChzZWxmKToKKyAgICAgICAgc2VsZi5wb3d0ZXN0KGZsb2F0KQorCisgICAgZGVmIHRlc3Rfb3RoZXIoc2VsZik6CisgICAgICAgICMgT3RoZXIgdGVzdHMtLSBub3QgdmVyeSBzeXN0ZW1hdGljCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDMsMykgJSA4LCBwb3coMywzLDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygzLDMpICUgLTgsIHBvdygzLDMsLTgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygzLDIpICUgLTIsIHBvdygzLDIsLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMywzKSAlIDgsIHBvdygtMywzLDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtMywzKSAlIC04LCBwb3coLTMsMywtOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG93KDUsMikgJSAtOCwgcG93KDUsMiwtOCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coM0wsM0wpICUgOCwgcG93KDNMLDNMLDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygzTCwzTCkgJSAtOCwgcG93KDNMLDNMLC04KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coM0wsMikgJSAtMiwgcG93KDNMLDIsLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvdygtM0wsM0wpICUgOCwgcG93KC0zTCwzTCw4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coLTNMLDNMKSAlIC04LCBwb3coLTNMLDNMLC04KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3coNUwsMikgJSAtOCwgcG93KDVMLDIsLTgpKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKC0xMCwgMTEpOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UoMCwgNik6CisgICAgICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2UoLTcsIDExKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaiA+PSAwIGFuZCBrICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdyhpLGopICUgaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3coaSxqLGspCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIGlmIGogPj0gMCBhbmQgayAhPSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3cobG9uZyhpKSxqKSAlIGssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93KGxvbmcoaSksaixrKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYnVnNjQzMjYwKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0UnBvdzoKKyAgICAgICAgICAgIGRlZiBfX3Jwb3dfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgTm9uZSAqKiBUZXN0UnBvdygpICMgV29uJ3QgZmFpbCB3aGVuIF9fcnBvd19fIGludm9rZWQuICBTRiBidWcgIzY0MzI2MC4KKworICAgIGRlZiB0ZXN0X2J1ZzcwNTIzMShzZWxmKToKKyAgICAgICAgIyAtMS4wIHJhaXNlZCB0byBhbiBpbnRlZ2VyIHNob3VsZCBuZXZlciBibG93IHVwLiAgSXQgZGlkIGlmIHRoZQorICAgICAgICAjIHBsYXRmb3JtIHBvdygpIHdhcyBidWdneSwgYW5kIFB5dGhvbiBkaWRuJ3Qgd29ybSBhcm91bmQgaXQuCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBhID0gLTEuMAorICAgICAgICAjIFRoZSBuZXh0IHR3byB0ZXN0cyBjYW4gc3RpbGwgZmFpbCBpZiB0aGUgcGxhdGZvcm0gZmxvb3IoKQorICAgICAgICAjIGZ1bmN0aW9uIGRvZXNuJ3QgdHJlYXQgYWxsIGxhcmdlIGlucHV0cyBhcyBpbnRlZ2VycworICAgICAgICAjIHRlc3RfbWF0aCBzaG91bGQgYWxzbyBmYWlsIGlmIHRoYXQgaXMgaGFwcGVuaW5nCisgICAgICAgIGVxKHBvdyhhLCAxLjIzZTE2NyksIDEuMCkKKyAgICAgICAgZXEocG93KGEsIC0xLjIzZTE2NyksIDEuMCkKKyAgICAgICAgZm9yIGIgaW4gcmFuZ2UoLTEwLCAxMSk6CisgICAgICAgICAgICBlcShwb3coYSwgZmxvYXQoYikpLCBiICYgMSBhbmQgLTEuMCBvciAxLjApCisgICAgICAgIGZvciBuIGluIHJhbmdlKDAsIDEwMCk6CisgICAgICAgICAgICBmaXZldG8gPSBmbG9hdCg1ICoqIG4pCisgICAgICAgICAgICAjIEZvciBzbWFsbCBuLCBmaXZldG8gd2lsbCBiZSBvZGQuICBFdmVudHVhbGx5IHdlIHJ1biBvdXQgb2YKKyAgICAgICAgICAgICMgbWFudGlzc2EgYml0cywgdGhvdWdoLCBhbmQgdGhlcmVhZmVyIGZpdmV0byB3aWxsIGJlIGV2ZW4uCisgICAgICAgICAgICBleHBlY3RlZCA9IGZpdmV0byAlIDIuMCBhbmQgLTEuMCBvciAxLjAKKyAgICAgICAgICAgIGVxKHBvdyhhLCBmaXZldG8pLCBleHBlY3RlZCkKKyAgICAgICAgICAgIGVxKHBvdyhhLCAtZml2ZXRvKSwgZXhwZWN0ZWQpCisgICAgICAgIGVxKGV4cGVjdGVkLCAxLjApICAgIyBlbHNlIHdlIGRpZG4ndCBwdXNoIGZpdmV0byB0byBldmVubmVzcworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFBvd1Rlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvdy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3cucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OGZlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3cucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Bvdy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3cucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4OGZlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wb3cucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BwcmludC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BwcmludC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDEzN2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHByaW50LnB5CkBAIC0wLDAgKzEsNDMyIEBACitpbXBvcnQgcHByaW50CitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHRlc3QudGVzdF9zZXQKKwordHJ5OgorICAgIHVuaSA9IHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIHVuaSh4KToKKyAgICAgICAgcmV0dXJuIHgKKworIyBsaXN0LCB0dXBsZSBhbmQgZGljdCBzdWJjbGFzc2VzIHRoYXQgZG8gb3IgZG9uJ3Qgb3ZlcndyaXRlIF9fcmVwcl9fCitjbGFzcyBsaXN0MihsaXN0KToKKyAgICBwYXNzCisKK2NsYXNzIGxpc3QzKGxpc3QpOgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3QuX19yZXByX18oc2VsZikKKworY2xhc3MgdHVwbGUyKHR1cGxlKToKKyAgICBwYXNzCisKK2NsYXNzIHR1cGxlMyh0dXBsZSk6CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gdHVwbGUuX19yZXByX18oc2VsZikKKworY2xhc3MgZGljdDIoZGljdCk6CisgICAgcGFzcworCitjbGFzcyBkaWN0MyhkaWN0KToKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiBkaWN0Ll9fcmVwcl9fKHNlbGYpCisKK2NsYXNzIFF1ZXJ5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmEgPSByYW5nZSgxMDApCisgICAgICAgIHNlbGYuYiA9IHJhbmdlKDIwMCkKKyAgICAgICAgc2VsZi5hWy0xMl0gPSBzZWxmLmIKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSAuaXNyZWN1cnNpdmUoKSBhbmQgLmlzcmVhZGFibGUoKSB3L28gcmVjdXJzaW9uCisgICAgICAgIHBwID0gcHByaW50LlByZXR0eVByaW50ZXIoKQorICAgICAgICBmb3Igc2FmZSBpbiAoMiwgMi4wLCAyaiwgImFiYyIsIFszXSwgKDIsMiksIHszOiAzfSwgdW5pKCJ5YWRkYXlhZGRhIiksCisgICAgICAgICAgICAgICAgICAgICBzZWxmLmEsIHNlbGYuYik6CisgICAgICAgICAgICAjIG1vZHVsZS1sZXZlbCBjb252ZW5pZW5jZSBmdW5jdGlvbnMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHByaW50LmlzcmVjdXJzaXZlKHNhZmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm90IGlzcmVjdXJzaXZlIGZvciAlciIgJSAoc2FmZSwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBwcmludC5pc3JlYWRhYmxlKHNhZmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBpc3JlYWRhYmxlIGZvciAlciIgJSAoc2FmZSwpKQorICAgICAgICAgICAgIyBQcmV0dHlQcmludGVyIG1ldGhvZHMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHAuaXNyZWN1cnNpdmUoc2FmZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub3QgaXNyZWN1cnNpdmUgZm9yICVyIiAlIChzYWZlLCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHAuaXNyZWFkYWJsZShzYWZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaXNyZWFkYWJsZSBmb3IgJXIiICUgKHNhZmUsKSkKKworICAgIGRlZiB0ZXN0X2tub3R0ZWQoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IC5pc3JlY3Vyc2l2ZSgpIGFuZCAuaXNyZWFkYWJsZSgpIHcvIHJlY3Vyc2lvbgorICAgICAgICAjIFRpZSBhIGtub3QuCisgICAgICAgIHNlbGYuYls2N10gPSBzZWxmLmEKKyAgICAgICAgIyBNZXNzeSBkaWN0LgorICAgICAgICBzZWxmLmQgPSB7fQorICAgICAgICBzZWxmLmRbMF0gPSBzZWxmLmRbMV0gPSBzZWxmLmRbMl0gPSBzZWxmLmQKKworICAgICAgICBwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKCkKKworICAgICAgICBmb3IgaWNreSBpbiBzZWxmLmEsIHNlbGYuYiwgc2VsZi5kLCAoc2VsZi5kLCBzZWxmLmQpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBwcmludC5pc3JlY3Vyc2l2ZShpY2t5KSwgImV4cGVjdGVkIGlzcmVjdXJzaXZlIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHByaW50LmlzcmVhZGFibGUoaWNreSksICJleHBlY3RlZCBub3QgaXNyZWFkYWJsZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHAuaXNyZWN1cnNpdmUoaWNreSksICJleHBlY3RlZCBpc3JlY3Vyc2l2ZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBwLmlzcmVhZGFibGUoaWNreSksICJleHBlY3RlZCBub3QgaXNyZWFkYWJsZSIpCisKKyAgICAgICAgIyBCcmVhayB0aGUgY3ljbGVzLgorICAgICAgICBzZWxmLmQuY2xlYXIoKQorICAgICAgICBkZWwgc2VsZi5hWzpdCisgICAgICAgIGRlbCBzZWxmLmJbOl0KKworICAgICAgICBmb3Igc2FmZSBpbiBzZWxmLmEsIHNlbGYuYiwgc2VsZi5kLCAoc2VsZi5kLCBzZWxmLmQpOgorICAgICAgICAgICAgIyBtb2R1bGUtbGV2ZWwgY29udmVuaWVuY2UgZnVuY3Rpb25zCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBwcmludC5pc3JlY3Vyc2l2ZShzYWZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIG5vdCBpc3JlY3Vyc2l2ZSBmb3IgJXIiICUgKHNhZmUsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcHJpbnQuaXNyZWFkYWJsZShzYWZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaXNyZWFkYWJsZSBmb3IgJXIiICUgKHNhZmUsKSkKKyAgICAgICAgICAgICMgUHJldHR5UHJpbnRlciBtZXRob2RzCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBwLmlzcmVjdXJzaXZlKHNhZmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm90IGlzcmVjdXJzaXZlIGZvciAlciIgJSAoc2FmZSwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBwLmlzcmVhZGFibGUoc2FmZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIGlzcmVhZGFibGUgZm9yICVyIiAlIChzYWZlLCkpCisKKyAgICBkZWYgdGVzdF91bnJlYWRhYmxlKHNlbGYpOgorICAgICAgICAjIE5vdCByZWN1cnNpdmUgYnV0IG5vdCByZWFkYWJsZSBhbnl3YXkKKyAgICAgICAgcHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcigpCisgICAgICAgIGZvciB1bnJlYWRhYmxlIGluIHR5cGUoMyksIHBwcmludCwgcHByaW50LmlzcmVjdXJzaXZlOgorICAgICAgICAgICAgIyBtb2R1bGUtbGV2ZWwgY29udmVuaWVuY2UgZnVuY3Rpb25zCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBwcmludC5pc3JlY3Vyc2l2ZSh1bnJlYWRhYmxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIG5vdCBpc3JlY3Vyc2l2ZSBmb3IgJXIiICUgKHVucmVhZGFibGUsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHByaW50LmlzcmVhZGFibGUodW5yZWFkYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBub3QgaXNyZWFkYWJsZSBmb3IgJXIiICUgKHVucmVhZGFibGUsKSkKKyAgICAgICAgICAgICMgUHJldHR5UHJpbnRlciBtZXRob2RzCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHBwLmlzcmVjdXJzaXZlKHVucmVhZGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm90IGlzcmVjdXJzaXZlIGZvciAlciIgJSAodW5yZWFkYWJsZSwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwcC5pc3JlYWRhYmxlKHVucmVhZGFibGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm90IGlzcmVhZGFibGUgZm9yICVyIiAlICh1bnJlYWRhYmxlLCkpCisKKyAgICBkZWYgdGVzdF9zYW1lX2FzX3JlcHIoc2VsZik6CisgICAgICAgICMgU2ltcGxlIG9iamVjdHMsIHNtYWxsIGNvbnRhaW5lcnMgYW5kIGNsYXNzZXMgdGhhdCBvdmVyd3JpdGUgX19yZXByX18KKyAgICAgICAgIyBGb3IgdGhvc2UgdGhlIHJlc3VsdCBzaG91bGQgYmUgdGhlIHNhbWUgYXMgcmVwcigpLgorICAgICAgICAjIEFoZW0uICBUaGUgZG9jcyBkb24ndCBzYXkgYW55dGhpbmcgYWJvdXQgdGhhdCAtLSB0aGlzIGFwcGVhcnMgdG8KKyAgICAgICAgIyBiZSB0ZXN0aW5nIGFuIGltcGxlbWVudGF0aW9uIHF1aXJrLiAgU3RhcnRpbmcgaW4gUHl0aG9uIDIuNSwgaXQncworICAgICAgICAjIG5vdCB0cnVlIGZvciBkaWN0czogIHBwcmludCBhbHdheXMgc29ydHMgZGljdHMgYnkga2V5IG5vdzsgYmVmb3JlLAorICAgICAgICAjIGl0IHNvcnRlZCBhIGRpY3QgZGlzcGxheSBpZiBhbmQgb25seSBpZiB0aGUgZGlzcGxheSByZXF1aXJlZAorICAgICAgICAjIG11bHRpcGxlIGxpbmVzLiAgRm9yIHRoYXQgcmVhc29uLCBkaWN0cyB3aXRoIG1vcmUgdGhhbiBvbmUgZWxlbWVudAorICAgICAgICAjIGFyZW4ndCB0ZXN0ZWQgaGVyZS4KKyAgICAgICAgZm9yIHNpbXBsZSBpbiAoMCwgMEwsIDArMGosIDAuMCwgIiIsIHVuaSgiIiksCisgICAgICAgICAgICAgICAgICAgICAgICgpLCB0dXBsZTIoKSwgdHVwbGUzKCksCisgICAgICAgICAgICAgICAgICAgICAgIFtdLCBsaXN0MigpLCBsaXN0MygpLAorICAgICAgICAgICAgICAgICAgICAgICB7fSwgZGljdDIoKSwgZGljdDMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlLCBwcHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgIC02LCAtNkwsIC02LTZqLCAtMS41LCAieCIsIHVuaSgieCIpLCAoMywpLCBbM10sIHszOiA2fSwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEsMiksIFszLDRdLCB7NTogNn0sCisgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlMigoMSwyKSksIHR1cGxlMygoMSwyKSksIHR1cGxlMyhyYW5nZSgxMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgWzMsNF0sIGxpc3QyKFszLDRdKSwgbGlzdDMoWzMsNF0pLCBsaXN0MyhyYW5nZSgxMDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGljdDIoezU6IDZ9KSwgZGljdDMoezU6IDZ9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UoMTAsIC0xMSwgLTEpCisgICAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgIG5hdGl2ZSA9IHJlcHIoc2ltcGxlKQorICAgICAgICAgICAgZm9yIGZ1bmN0aW9uIGluICJwZm9ybWF0IiwgInNhZmVyZXByIjoKKyAgICAgICAgICAgICAgICBmID0gZ2V0YXR0cihwcHJpbnQsIGZ1bmN0aW9uKQorICAgICAgICAgICAgICAgIGdvdCA9IGYoc2ltcGxlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmF0aXZlLCBnb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXMgZ290ICVzIGZyb20gcHByaW50LiVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmF0aXZlLCBnb3QsIGZ1bmN0aW9uKSkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2xpbmVfd3JhcChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgYmFzaWMgbGluZS13cmFwcGluZyBvcGVyYXRpb24KKyAgICAgICAgbyA9IHsnUlBNX2NhbCc6IDAsCisgICAgICAgICAgICAgJ1JQTV9jYWwyJzogNDgwNTksCisgICAgICAgICAgICAgJ1NwZWVkX2NhbCc6IDAsCisgICAgICAgICAgICAgJ2NvbnRyb2xkZXNrX3J1bnRpbWVfdXMnOiAwLAorICAgICAgICAgICAgICdtYWluX2NvZGVfcnVudGltZV91cyc6IDAsCisgICAgICAgICAgICAgJ3JlYWRfaW9fcnVudGltZV91cyc6IDAsCisgICAgICAgICAgICAgJ3dyaXRlX2lvX3J1bnRpbWVfdXMnOiA0MzY5MH0KKyAgICAgICAgZXhwID0gIiIiXAoreydSUE1fY2FsJzogMCwKKyAnUlBNX2NhbDInOiA0ODA1OSwKKyAnU3BlZWRfY2FsJzogMCwKKyAnY29udHJvbGRlc2tfcnVudGltZV91cyc6IDAsCisgJ21haW5fY29kZV9ydW50aW1lX3VzJzogMCwKKyAncmVhZF9pb19ydW50aW1lX3VzJzogMCwKKyAnd3JpdGVfaW9fcnVudGltZV91cyc6IDQzNjkwfSIiIgorICAgICAgICBmb3IgdHlwZSBpbiBbZGljdCwgZGljdDJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdCh0eXBlKG8pKSwgZXhwKQorCisgICAgICAgIG8gPSByYW5nZSgxMDApCisgICAgICAgIGV4cCA9ICdbJXNdJyAlICcsXG4gJy5qb2luKG1hcChzdHIsIG8pKQorICAgICAgICBmb3IgdHlwZSBpbiBbbGlzdCwgbGlzdDJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdCh0eXBlKG8pKSwgZXhwKQorCisgICAgICAgIG8gPSB0dXBsZShyYW5nZSgxMDApKQorICAgICAgICBleHAgPSAnKCVzKScgJSAnLFxuICcuam9pbihtYXAoc3RyLCBvKSkKKyAgICAgICAgZm9yIHR5cGUgaW4gW3R1cGxlLCB0dXBsZTJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdCh0eXBlKG8pKSwgZXhwKQorCisgICAgICAgICMgaW5kZW50IHBhcmFtZXRlcgorICAgICAgICBvID0gcmFuZ2UoMTAwKQorICAgICAgICBleHAgPSAnWyAgICVzXScgJSAnLFxuICAgICcuam9pbihtYXAoc3RyLCBvKSkKKyAgICAgICAgZm9yIHR5cGUgaW4gW2xpc3QsIGxpc3QyXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQodHlwZShvKSwgaW5kZW50PTQpLCBleHApCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfaW5kZW50YXRpb25zKHNlbGYpOgorICAgICAgICBvMSA9IGxpc3QocmFuZ2UoMTApKQorICAgICAgICBvMiA9IGRpY3QoZmlyc3Q9MSwgc2Vjb25kPTIsIHRoaXJkPTMpCisgICAgICAgIG8gPSBbbzEsIG8yXQorICAgICAgICBleHBlY3RlZCA9ICIiIlwKK1sgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0sCisgICAgeyAgICdmaXJzdCc6IDEsCisgICAgICAgICdzZWNvbmQnOiAyLAorICAgICAgICAndGhpcmQnOiAzfV0iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChvLCBpbmRlbnQ9NCwgd2lkdGg9NDIpLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3NvcnRlZF9kaWN0KHNlbGYpOgorICAgICAgICAjIFN0YXJ0aW5nIGluIFB5dGhvbiAyLjUsIHBwcmludCBzb3J0cyBkaWN0IGRpc3BsYXlzIGJ5IGtleSByZWdhcmRsZXNzCisgICAgICAgICMgb2YgaG93IHNtYWxsIHRoZSBkaWN0aW9uYXJ5IG1heSBiZS4KKyAgICAgICAgIyBCZWZvcmUgdGhlIGNoYW5nZSwgb24gMzItYml0IFdpbmRvd3MgcGZvcm1hdCgpIGdhdmUgb3JkZXIKKyAgICAgICAgIyAnYScsICdjJywgJ2InIGhlcmUsIHNvIHRoaXMgdGVzdCBmYWlsZWQuCisgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDEsICdjJzogMX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChkKSwgInsnYSc6IDEsICdiJzogMSwgJ2MnOiAxfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoW2QsIGRdKSwKKyAgICAgICAgICAgICJbeydhJzogMSwgJ2InOiAxLCAnYyc6IDF9LCB7J2EnOiAxLCAnYic6IDEsICdjJzogMX1dIikKKworICAgICAgICAjIFRoZSBuZXh0IG9uZSBpcyBraW5kIG9mIGdvb2Z5LiAgVGhlIHNvcnRlZCBvcmRlciBkZXBlbmRzIG9uIHRoZQorICAgICAgICAjIGFscGhhYmV0aWMgb3JkZXIgb2YgdHlwZSBuYW1lczogICJpbnQiIDwgInN0ciIgPCAidHVwbGUiLiAgQmVmb3JlCisgICAgICAgICMgUHl0aG9uIDIuNSwgdGhpcyB3YXMgaW4gdGhlIHRlc3Rfc2FtZV9hc19yZXByKCkgdGVzdC4gIEl0J3Mgd29ydGgKKyAgICAgICAgIyBrZWVwaW5nIGFyb3VuZCBmb3Igbm93IGJlY2F1c2UgaXQncyBvbmUgb2YgZmV3IHRlc3RzIG9mIHBwcmludAorICAgICAgICAjIGFnYWluc3QgYSBjcmF6eSBtaXggb2YgdHlwZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoeyJ4eVx0YWJcbiI6ICgzLCksIDU6IFtbXV0sICgpOiB7fX0pLAorICAgICAgICAgICAgciJ7NTogW1tdXSwgJ3h5XHRhYlxuJzogKDMsKSwgKCk6IHt9fSIpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc2luZyhzZWxmKToKKyAgICAgICAgbyA9IHsnbmFtZXMgd2l0aCBzcGFjZXMnOiAnc2hvdWxkIGJlIHByZXNlbnRlZCB1c2luZyByZXByKCknLAorICAgICAgICAgICAgICdvdGhlcnMuc2hvdWxkLm5vdC5iZSc6ICdsaWtlLnRoaXMnfQorICAgICAgICBleHAgPSAiIiJcCit7J25hbWVzIHdpdGggc3BhY2VzJzogJ3Nob3VsZCBiZSBwcmVzZW50ZWQgdXNpbmcgcmVwcigpJywKKyBvdGhlcnMuc2hvdWxkLm5vdC5iZTogbGlrZS50aGlzfSIiIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKERvdHRlZFByZXR0eVByaW50ZXIoKS5wZm9ybWF0KG8pLCBleHApCisKKyAgICBkZWYgdGVzdF9zZXRfcmVwcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoc2V0KCkpLCAnc2V0KCknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KHNldChyYW5nZSgzKSkpLCAnc2V0KFswLCAxLCAyXSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KGZyb3plbnNldCgpKSwgJ2Zyb3plbnNldCgpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChmcm96ZW5zZXQocmFuZ2UoMykpKSwgJ2Zyb3plbnNldChbMCwgMSwgMl0pJykKKyAgICAgICAgY3ViZV9yZXByX3RndCA9ICIiIlwKK3tmcm96ZW5zZXQoW10pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLCBmcm96ZW5zZXQoWzBdKSwgZnJvemVuc2V0KFsxXSldKSwKKyBmcm96ZW5zZXQoWzBdKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDFdKV0pLAorIGZyb3plbnNldChbMV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMSwgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMV0pXSksCisgZnJvemVuc2V0KFsyXSk6IGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLCAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLCAyXSldKSwKKyBmcm96ZW5zZXQoWzEsIDJdKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDEsIDJdKV0pLAorIGZyb3plbnNldChbMCwgMl0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwgMSwgMl0pXSksCisgZnJvemVuc2V0KFswLCAxXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLCAxLCAyXSldKSwKKyBmcm96ZW5zZXQoWzAsIDEsIDJdKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoWzEsIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsIDFdKV0pfSIiIgorICAgICAgICBjdWJlID0gdGVzdC50ZXN0X3NldC5jdWJlKDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoY3ViZSksIGN1YmVfcmVwcl90Z3QpCisgICAgICAgIGN1Ym9fcmVwcl90Z3QgPSAiIiJcCit7ZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsIDJdKSwgZnJvemVuc2V0KFswXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFswLCAxXSksIGZyb3plbnNldChbMV0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMV0pXSldKSwKKyBmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwgMl0pLCBmcm96ZW5zZXQoWzFdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzFdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzEsIDJdKSwgZnJvemVuc2V0KFsyXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsyXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFtdKSwgZnJvemVuc2V0KFswXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMV0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsyXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFtdKSwgZnJvemVuc2V0KFsxXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMF0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFsyXSksIGZyb3plbnNldChbXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMF0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFswLCAxLCAyXSksIGZyb3plbnNldChbMCwgMV0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMV0pXSldKSwKKyBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLCBmcm96ZW5zZXQoWzAsIDFdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMF0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKV0pXSksCisgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwgZnJvemVuc2V0KFswLCAyXSldKTogZnJvemVuc2V0KFtmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsyXSldKV0pLAorIGZyb3plbnNldChbZnJvemVuc2V0KFswLCAxLCAyXSksIGZyb3plbnNldChbMCwgMl0pXSk6IGZyb3plbnNldChbZnJvemVuc2V0KFtmcm96ZW5zZXQoWzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyXSldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoWzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSldKSwKKyBmcm96ZW5zZXQoW2Zyb3plbnNldChbMSwgMl0pLCBmcm96ZW5zZXQoWzAsIDEsIDJdKV0pOiBmcm96ZW5zZXQoW2Zyb3plbnNldChbZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFswLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMl0pXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm96ZW5zZXQoW2Zyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldChbMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFtmcm96ZW5zZXQoWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KFsxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDJdKV0pXSl9IiIiCisKKyAgICAgICAgY3VibyA9IHRlc3QudGVzdF9zZXQubGluZWdyYXBoKGN1YmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQoY3VibyksIGN1Ym9fcmVwcl90Z3QpCisKKyAgICBkZWYgdGVzdF9kZXB0aChzZWxmKToKKyAgICAgICAgbmVzdGVkX3R1cGxlID0gKDEsICgyLCAoMywgKDQsICg1LCA2KSkpKSkKKyAgICAgICAgbmVzdGVkX2RpY3QgPSB7MTogezI6IHszOiB7NDogezU6IHs2OiA2fX19fX19CisgICAgICAgIG5lc3RlZF9saXN0ID0gWzEsIFsyLCBbMywgWzQsIFs1LCBbNiwgW11dXV1dXV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChuZXN0ZWRfdHVwbGUpLCByZXByKG5lc3RlZF90dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHByaW50LnBmb3JtYXQobmVzdGVkX2RpY3QpLCByZXByKG5lc3RlZF9kaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChuZXN0ZWRfbGlzdCksIHJlcHIobmVzdGVkX2xpc3QpKQorCisgICAgICAgIGx2MV90dXBsZSA9ICcoMSwgKC4uLikpJworICAgICAgICBsdjFfZGljdCA9ICd7MTogey4uLn19JworICAgICAgICBsdjFfbGlzdCA9ICdbMSwgWy4uLl1dJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG5lc3RlZF90dXBsZSwgZGVwdGg9MSksIGx2MV90dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcHJpbnQucGZvcm1hdChuZXN0ZWRfZGljdCwgZGVwdGg9MSksIGx2MV9kaWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBwcmludC5wZm9ybWF0KG5lc3RlZF9saXN0LCBkZXB0aD0xKSwgbHYxX2xpc3QpCisKKworY2xhc3MgRG90dGVkUHJldHR5UHJpbnRlcihwcHJpbnQuUHJldHR5UHJpbnRlcik6CisKKyAgICBkZWYgZm9ybWF0KHNlbGYsIG9iamVjdCwgY29udGV4dCwgbWF4bGV2ZWxzLCBsZXZlbCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqZWN0LCBzdHIpOgorICAgICAgICAgICAgaWYgJyAnIGluIG9iamVjdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwcihvYmplY3QpLCAxLCAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QsIDAsIDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBwcHJpbnQuUHJldHR5UHJpbnRlci5mb3JtYXQoCisgICAgICAgICAgICAgICAgc2VsZiwgb2JqZWN0LCBjb250ZXh0LCBtYXhsZXZlbHMsIGxldmVsKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoUXVlcnlUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcHJpbnQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHByaW50LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjUzNWZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHByaW50LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcHJpbnQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHByaW50LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjUzNWZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHByaW50LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcmludC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjYzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcmludC5weQpAQCAtMCwwICsxLDE0MSBAQAorIiIiVGVzdCBjb3JyZWN0IG9wZXJhdGlvbiBvZiB0aGUgcHJpbnQgZnVuY3Rpb24uCisiIiIKKworIyBJbiAyLjYsIHRoaXMgZ2l2ZXMgdXMgdGhlIGJlaGF2aW9yIHdlIHdhbnQuICBJbiAzLjAsIGl0IGhhcworIyAgbm8gZnVuY3Rpb24sIGJ1dCBpdCBzdGlsbCBtdXN0IHBhcnNlIGNvcnJlY3RseS4KK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitOb3REZWZpbmVkID0gb2JqZWN0KCkKKworIyBBIGRpc3BhdGNoIHRhYmxlIGFsbCA4IGNvbWJpbmF0aW9ucyBvZiBwcm92aWRpbmcKKyMgIHNlcCwgZW5kLCBhbmQgZmlsZQorIyBJIHVzZSB0aGlzIG1hY2hpbmVyeSBzbyB0aGF0IEknbSBub3QganVzdCBwYXNzaW5nIGRlZmF1bHQKKyMgIHZhbHVlcyB0byBwcmludCwgSSdtIGVpdGhlciBwYXNzaW5nIG9yIG5vdCBwYXNzaW5nIGluIHRoZQorIyAgYXJndW1lbnRzCitkaXNwYXRjaCA9IHsKKyAgICAoRmFsc2UsIEZhbHNlLCBGYWxzZSk6CisgICAgIGxhbWJkYSBhcmdzLCBzZXAsIGVuZCwgZmlsZTogcHJpbnQoKmFyZ3MpLAorICAgIChGYWxzZSwgRmFsc2UsIFRydWUpOgorICAgICBsYW1iZGEgYXJncywgc2VwLCBlbmQsIGZpbGU6IHByaW50KGZpbGU9ZmlsZSwgKmFyZ3MpLAorICAgIChGYWxzZSwgVHJ1ZSwgIEZhbHNlKToKKyAgICAgbGFtYmRhIGFyZ3MsIHNlcCwgZW5kLCBmaWxlOiBwcmludChlbmQ9ZW5kLCAqYXJncyksCisgICAgKEZhbHNlLCBUcnVlLCAgVHJ1ZSk6CisgICAgIGxhbWJkYSBhcmdzLCBzZXAsIGVuZCwgZmlsZTogcHJpbnQoZW5kPWVuZCwgZmlsZT1maWxlLCAqYXJncyksCisgICAgKFRydWUsICBGYWxzZSwgRmFsc2UpOgorICAgICBsYW1iZGEgYXJncywgc2VwLCBlbmQsIGZpbGU6IHByaW50KHNlcD1zZXAsICphcmdzKSwKKyAgICAoVHJ1ZSwgIEZhbHNlLCBUcnVlKToKKyAgICAgbGFtYmRhIGFyZ3MsIHNlcCwgZW5kLCBmaWxlOiBwcmludChzZXA9c2VwLCBmaWxlPWZpbGUsICphcmdzKSwKKyAgICAoVHJ1ZSwgIFRydWUsICBGYWxzZSk6CisgICAgIGxhbWJkYSBhcmdzLCBzZXAsIGVuZCwgZmlsZTogcHJpbnQoc2VwPXNlcCwgZW5kPWVuZCwgKmFyZ3MpLAorICAgIChUcnVlLCAgVHJ1ZSwgIFRydWUpOgorICAgICBsYW1iZGEgYXJncywgc2VwLCBlbmQsIGZpbGU6IHByaW50KHNlcD1zZXAsIGVuZD1lbmQsIGZpbGU9ZmlsZSwgKmFyZ3MpLAorICAgIH0KKworIyBDbGFzcyB1c2VkIHRvIHRlc3QgX19zdHJfXyBhbmQgcHJpbnQKK2NsYXNzIENsYXNzV2l0aF9fc3RyX186CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICBzZWxmLnggPSB4CisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLngKKworY2xhc3MgVGVzdFByaW50KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY2hlY2soc2VsZiwgZXhwZWN0ZWQsIGFyZ3MsCisgICAgICAgICAgICBzZXA9Tm90RGVmaW5lZCwgZW5kPU5vdERlZmluZWQsIGZpbGU9Tm90RGVmaW5lZCk6CisgICAgICAgICMgQ2FwdHVyZSBzeXMuc3Rkb3V0IGluIGEgU3RyaW5nSU8uICBDYWxsIHByaW50IHdpdGggYXJncywKKyAgICAgICAgIyAgYW5kIHdpdGggc2VwLCBlbmQsIGFuZCBmaWxlLCBpZiB0aGV5J3JlIGRlZmluZWQuICBSZXN1bHQKKyAgICAgICAgIyAgbXVzdCBtYXRjaCBleHBlY3RlZC4KKworICAgICAgICAjIExvb2sgdXAgdGhlIGFjdHVhbCBmdW5jdGlvbiB0byBjYWxsLCBiYXNlZCBvbiBpZiBzZXAsIGVuZCwgYW5kIGZpbGUKKyAgICAgICAgIyAgYXJlIGRlZmluZWQKKyAgICAgICAgZm4gPSBkaXNwYXRjaFsoc2VwIGlzIG5vdCBOb3REZWZpbmVkLAorICAgICAgICAgICAgICAgICAgICAgICBlbmQgaXMgbm90IE5vdERlZmluZWQsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaXMgbm90IE5vdERlZmluZWQpXQorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNhcHR1cmVkX3N0ZG91dCgpIGFzIHQ6CisgICAgICAgICAgICBmbihhcmdzLCBzZXAsIGVuZCwgZmlsZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuZ2V0dmFsdWUoKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9wcmludChzZWxmKToKKyAgICAgICAgZGVmIHgoZXhwZWN0ZWQsIGFyZ3MsIHNlcD1Ob3REZWZpbmVkLCBlbmQ9Tm90RGVmaW5lZCk6CisgICAgICAgICAgICAjIFJ1biB0aGUgdGVzdCAyIHdheXM6IG5vdCB1c2luZyBmaWxlLCBhbmQgdXNpbmcKKyAgICAgICAgICAgICMgIGZpbGUgZGlyZWN0ZWQgdG8gYSBTdHJpbmdJTworCisgICAgICAgICAgICBzZWxmLmNoZWNrKGV4cGVjdGVkLCBhcmdzLCBzZXA9c2VwLCBlbmQ9ZW5kKQorCisgICAgICAgICAgICAjIFdoZW4gd3JpdGluZyB0byBhIGZpbGUsIHN0ZG91dCBpcyBleHBlY3RlZCB0byBiZSBlbXB0eQorICAgICAgICAgICAgbyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2soJycsIGFyZ3MsIHNlcD1zZXAsIGVuZD1lbmQsIGZpbGU9bykKKworICAgICAgICAgICAgIyBBbmQgbyB3aWxsIGNvbnRhaW4gdGhlIGV4cGVjdGVkIG91dHB1dAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmdldHZhbHVlKCksIGV4cGVjdGVkKQorCisgICAgICAgIHgoJ1xuJywgKCkpCisgICAgICAgIHgoJ2FcbicsICgnYScsKSkKKyAgICAgICAgeCgnTm9uZVxuJywgKE5vbmUsKSkKKyAgICAgICAgeCgnMSAyXG4nLCAoMSwgMikpCisgICAgICAgIHgoJzEgICAyXG4nLCAoMSwgJyAnLCAyKSkKKyAgICAgICAgeCgnMSoyXG4nLCAoMSwgMiksIHNlcD0nKicpCisgICAgICAgIHgoJzEgcycsICgxLCAncycpLCBlbmQ9JycpCisgICAgICAgIHgoJ2FcbmJcbicsICgnYScsICdiJyksIHNlcD0nXG4nKQorICAgICAgICB4KCcxLjAxJywgKDEuMCwgMSksIHNlcD0nJywgZW5kPScnKQorICAgICAgICB4KCcxKmEqMS4zKycsICgxLCAnYScsIDEuMyksIHNlcD0nKicsIGVuZD0nKycpCisgICAgICAgIHgoJ2FcblxuYlxuJywgKCdhXG4nLCAnYicpLCBzZXA9J1xuJykKKyAgICAgICAgeCgnXDArICtcMFxuJywgKCdcMCcsICcgJywgJ1wwJyksIHNlcD0nKycpCisKKyAgICAgICAgeCgnYVxuIGJcbicsICgnYVxuJywgJ2InKSkKKyAgICAgICAgeCgnYVxuIGJcbicsICgnYVxuJywgJ2InKSwgc2VwPU5vbmUpCisgICAgICAgIHgoJ2FcbiBiXG4nLCAoJ2FcbicsICdiJyksIGVuZD1Ob25lKQorICAgICAgICB4KCdhXG4gYlxuJywgKCdhXG4nLCAnYicpLCBzZXA9Tm9uZSwgZW5kPU5vbmUpCisKKyAgICAgICAgeCgnKlxuJywgKENsYXNzV2l0aF9fc3RyX18oJyonKSwpKQorICAgICAgICB4KCdhYmMgMVxuJywgKENsYXNzV2l0aF9fc3RyX18oJ2FiYycpLCAxKSkKKworICAgICAgICAjIDIueCB1bmljb2RlIHRlc3RzCisgICAgICAgIHgodScxIDJcbicsICgnMScsIHUnMicpKQorICAgICAgICB4KHUndVwxMjM0XG4nLCAodSd1XDEyMzQnLCkpCisgICAgICAgIHgodScgIGFiYyAxXG4nLCAoJyAnLCBDbGFzc1dpdGhfX3N0cl9fKHUnYWJjJyksIDEpKQorCisgICAgICAgICMgZXJyb3JzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJpbnQsICcnLCBzZXA9MykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcmludCwgJycsIGVuZD0zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgcHJpbnQsICcnLCBmaWxlPScnKQorCisgICAgZGVmIHRlc3RfbWl4ZWRfYXJncyhzZWxmKToKKyAgICAgICAgIyBJZiBhbiB1bmljb2RlIGFyZyBpcyBwYXNzZWQsIHNlcCBhbmQgZW5kIHNob3VsZCBiZSB1bmljb2RlLCB0b28uCisgICAgICAgIGNsYXNzIFJlY29yZGVyKG9iamVjdCk6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtdXN0X2JlX3VuaWNvZGUpOgorICAgICAgICAgICAgICAgIHNlbGYuYnVmID0gW10KKyAgICAgICAgICAgICAgICBzZWxmLmZvcmNlX3VuaWNvZGUgPSBtdXN0X2JlX3VuaWNvZGUKKworICAgICAgICAgICAgZGVmIHdyaXRlKHNlbGYsIHdoYXQpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuZm9yY2VfdW5pY29kZSBhbmQgbm90IGlzaW5zdGFuY2Uod2hhdCwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ7MCFyfSBpcyBub3QgdW5pY29kZSIuZm9ybWF0KHdoYXQpKQorICAgICAgICAgICAgICAgIHNlbGYuYnVmLmFwcGVuZCh3aGF0KQorCisgICAgICAgIGJ1ZiA9IFJlY29yZGVyKFRydWUpCisgICAgICAgIHByaW50KHUnaGknLCBmaWxlPWJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Jycuam9pbihidWYuYnVmKSwgJ2hpXG4nKQorICAgICAgICBkZWwgYnVmLmJ1Zls6XQorICAgICAgICBwcmludCh1J2hpJywgdSdub3RoaW5nJywgZmlsZT1idWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScnLmpvaW4oYnVmLmJ1ZiksICdoaSBub3RoaW5nXG4nKQorICAgICAgICBidWYgPSBSZWNvcmRlcihGYWxzZSkKKyAgICAgICAgcHJpbnQoJ2hpJywgJ2J5ZScsIGVuZD11J1xuJywgZmlsZT1idWYpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShidWYuYnVmWzFdLCB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYnVmLmJ1ZlszXSwgdW5pY29kZSkKKyAgICAgICAgZGVsIGJ1Zi5idWZbOl0KKyAgICAgICAgcHJpbnQoc2VwPXUneCcsIGZpbGU9YnVmKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYnVmLmJ1ZlstMV0sIHVuaWNvZGUpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFByaW50KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcmludC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcmludC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhMzk1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcmludC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcmludC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhMzk1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ByaW50LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTkzZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvZmlsZS5weQpAQCAtMCwwICsxLDE4NiBAQAorIiIiVGVzdCBzdWl0ZSBmb3IgdGhlIHByb2ZpbGUgbW9kdWxlLiIiIgorCitpbXBvcnQgc3lzCitpbXBvcnQgcHN0YXRzCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKKworaW1wb3J0IHByb2ZpbGUKK2Zyb20gdGVzdC5wcm9maWxlZSBpbXBvcnQgdGVzdGZ1bmMsIHRpbWVyCisKKworY2xhc3MgUHJvZmlsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgcHJvZmlsZXJjbGFzcyA9IHByb2ZpbGUuUHJvZmlsZQorICAgIG1ldGhvZG5hbWVzID0gWydwcmludF9zdGF0cycsICdwcmludF9jYWxsZXJzJywgJ3ByaW50X2NhbGxlZXMnXQorICAgIGV4cGVjdGVkX291dHB1dCA9IHt9CisgICAgZXhwZWN0ZWRfbGlzdF9zb3J0X291dHB1dCA9ICc6MChzb3J0KScKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBkb19wcm9maWxpbmcoY2xzKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisgICAgICAgIHByb2YgPSBjbHMucHJvZmlsZXJjbGFzcyh0aW1lciwgMC4wMDEpCisgICAgICAgIHN0YXJ0X3RpbWVyID0gdGltZXIoKQorICAgICAgICBwcm9mLnJ1bmN0eCgidGVzdGZ1bmMoKSIsIGdsb2JhbHMoKSwgbG9jYWxzKCkpCisgICAgICAgIHJlc3VsdHMuYXBwZW5kKHRpbWVyKCkgLSBzdGFydF90aW1lcikKKyAgICAgICAgZm9yIG1ldGhvZG5hbWUgaW4gY2xzLm1ldGhvZG5hbWVzOgorICAgICAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHN0YXRzID0gcHN0YXRzLlN0YXRzKHByb2YsIHN0cmVhbT1zKQorICAgICAgICAgICAgc3RhdHMuc3RyaXBfZGlycygpLnNvcnRfc3RhdHMoInN0ZG5hbWUiKQorICAgICAgICAgICAgZ2V0YXR0cihzdGF0cywgbWV0aG9kbmFtZSkoKQorICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQocy5nZXR2YWx1ZSgpKQorICAgICAgICByZXR1cm4gcmVzdWx0cworCisgICAgZGVmIHRlc3RfY3Byb2ZpbGUoc2VsZik6CisgICAgICAgIHJlc3VsdHMgPSBzZWxmLmRvX3Byb2ZpbGluZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0c1swXSwgMTAwMCkKKyAgICAgICAgZm9yIGksIG1ldGhvZCBpbiBlbnVtZXJhdGUoc2VsZi5tZXRob2RuYW1lcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdHNbaSsxXSwgc2VsZi5leHBlY3RlZF9vdXRwdXRbbWV0aG9kXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXRzLiVzIG91dHB1dCBmb3IgJXMgZG9lc24ndCBmaXQgZXhwZWN0YXRpb24hIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXRob2QsIHNlbGYucHJvZmlsZXJjbGFzcy5fX25hbWVfXykpCisKKyAgICBkZWYgdGVzdF9jYWxsaW5nX2NvbnZlbnRpb25zKHNlbGYpOgorICAgICAgICAjIElzc3VlICM1MzMwOiBwcm9maWxlIGFuZCBjUHJvZmlsZSB3b3VsZG4ndCByZXBvcnQgQyBmdW5jdGlvbnMgY2FsbGVkCisgICAgICAgICMgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cy4gV2UgdGVzdCBhbGwgY2FsbGluZyBjb252ZW50aW9ucy4KKyAgICAgICAgc3RtdHMgPSBbCisgICAgICAgICAgICAiW10uc29ydCgpIiwKKyAgICAgICAgICAgICJbXS5zb3J0KHJldmVyc2U9VHJ1ZSkiLAorICAgICAgICAgICAgIltdLnNvcnQoKihOb25lLCBOb25lLCBUcnVlKSkiLAorICAgICAgICAgICAgIltdLnNvcnQoKipkaWN0KHJldmVyc2U9VHJ1ZSkpIiwKKyAgICAgICAgXQorICAgICAgICBmb3Igc3RtdCBpbiBzdG10czoKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgICAgICBwcm9mID0gc2VsZi5wcm9maWxlcmNsYXNzKHRpbWVyLCAwLjAwMSkKKyAgICAgICAgICAgIHByb2YucnVuY3R4KHN0bXQsIGdsb2JhbHMoKSwgbG9jYWxzKCkpCisgICAgICAgICAgICBzdGF0cyA9IHBzdGF0cy5TdGF0cyhwcm9mLCBzdHJlYW09cykKKyAgICAgICAgICAgIHN0YXRzLnByaW50X3N0YXRzKCkKKyAgICAgICAgICAgIHJlcyA9IHMuZ2V0dmFsdWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLmV4cGVjdGVkX2xpc3Rfc29ydF9vdXRwdXQsIHJlcywKKyAgICAgICAgICAgICAgICAiUHJvZmlsaW5nIHswIXJ9IGRpZG4ndCByZXBvcnQgbGlzdC5zb3J0OlxuezF9Ii5mb3JtYXQoc3RtdCwgcmVzKSkKKworCitkZWYgcmVnZW5lcmF0ZV9leHBlY3RlZF9vdXRwdXQoZmlsZW5hbWUsIGNscyk6CisgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5yc3RyaXAoJ2NvJykKKyAgICBwcmludCAnUmVnZW5lcmF0aW5nICVzLi4uJyAlIGZpbGVuYW1lCisgICAgcmVzdWx0cyA9IGNscy5kb19wcm9maWxpbmcoKQorCisgICAgbmV3ZmlsZSA9IFtdCisgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAncicpIGFzIGY6CisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBuZXdmaWxlLmFwcGVuZChsaW5lKQorICAgICAgICAgICAgaWYgbGluZVs6Nl0gPT0gJyMtLWN1dCc6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3cnKSBhcyBmOgorICAgICAgICBmLndyaXRlbGluZXMobmV3ZmlsZSkKKyAgICAgICAgZm9yIGksIG1ldGhvZCBpbiBlbnVtZXJhdGUoY2xzLm1ldGhvZG5hbWVzKToKKyAgICAgICAgICAgIGYud3JpdGUoJyVzLmV4cGVjdGVkX291dHB1dFslcl0gPSAiIiJcXFxuJXMiIiJcbicgJSAoCisgICAgICAgICAgICAgICAgY2xzLl9fbmFtZV9fLCBtZXRob2QsIHJlc3VsdHNbaSsxXSkpCisgICAgICAgIGYud3JpdGUoJ1xuaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjpcbiAgICBtYWluKClcbicpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChQcm9maWxlVGVzdCkKKworZGVmIG1haW4oKToKKyAgICBpZiAnLXInIG5vdCBpbiBzeXMuYXJndjoKKyAgICAgICAgdGVzdF9tYWluKCkKKyAgICBlbHNlOgorICAgICAgICByZWdlbmVyYXRlX2V4cGVjdGVkX291dHB1dChfX2ZpbGVfXywgUHJvZmlsZVRlc3QpCisKKworIyBEb24ndCByZW1vdmUgdGhpcyBjb21tZW50LiBFdmVyeXRoaW5nIGJlbG93IGl0IGlzIGF1dG8tZ2VuZXJhdGVkLgorIy0tY3V0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1Byb2ZpbGVUZXN0LmV4cGVjdGVkX291dHB1dFsncHJpbnRfc3RhdHMnXSA9ICIiIlwKKyAgICAgICAgIDEyNyBmdW5jdGlvbiBjYWxscyAoMTA3IHByaW1pdGl2ZSBjYWxscykgaW4gOTk5Ljc0OSBzZWNvbmRzCisKKyAgIE9yZGVyZWQgYnk6IHN0YW5kYXJkIG5hbWUKKworICAgbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsIGZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbikKKyAgICAgICAgNCAgIC0wLjAwNCAgIC0wLjAwMSAgIC0wLjAwNCAgIC0wLjAwMSA6MChhcHBlbmQpCisgICAgICAgIDQgICAtMC4wMDQgICAtMC4wMDEgICAtMC4wMDQgICAtMC4wMDEgOjAoZXhjX2luZm8pCisgICAgICAgMTIgICAtMC4wMjQgICAtMC4wMDIgICAxMS45NjQgICAgMC45OTcgOjAoaGFzYXR0cikKKyAgICAgICAgOCAgIC0wLjAwOCAgIC0wLjAwMSAgIC0wLjAwOCAgIC0wLjAwMSA6MChyYW5nZSkKKyAgICAgICAgMSAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCAgICAwLjAwMCA6MChzZXRwcm9maWxlKQorICAgICAgICAxICAgLTAuMDAyICAgLTAuMDAyICA5OTkuNzUxICA5OTkuNzUxIDxzdHJpbmc+OjEoPG1vZHVsZT4pCisgICAgICAgIDAgICAgMC4wMDAgICAgICAgICAgICAgMC4wMDAgICAgICAgICAgcHJvZmlsZTowKHByb2ZpbGVyKQorICAgICAgICAxICAgLTAuMDAyICAgLTAuMDAyICA5OTkuNzQ5ICA5OTkuNzQ5IHByb2ZpbGU6MCh0ZXN0ZnVuYygpKQorICAgICAgIDI4ICAgMjcuOTcyICAgIDAuOTk5ICAgMjcuOTcyICAgIDAuOTk5IHByb2ZpbGVlLnB5OjExMChfX2dldGF0dHJfXykKKyAgICAgICAgMSAgMjY5Ljk5NiAgMjY5Ljk5NiAgOTk5Ljc1MyAgOTk5Ljc1MyBwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykKKyAgICAgMjMvMyAgMTQ5LjkzNyAgICA2LjUxOSAgMTY5LjkxNyAgIDU2LjYzOSBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpCisgICAgICAgMjAgICAxOS45ODAgICAgMC45OTkgICAxOS45ODAgICAgMC45OTkgcHJvZmlsZWUucHk6NDgobXVsKQorICAgICAgICAyICAgMzkuOTg2ICAgMTkuOTkzICA1OTkuODE0ICAyOTkuOTA3IHByb2ZpbGVlLnB5OjU1KGhlbHBlcikKKyAgICAgICAgNCAgMTE1Ljk4NCAgIDI4Ljk5NiAgMTE5Ljk2NCAgIDI5Ljk5MSBwcm9maWxlZS5weTo3MyhoZWxwZXIxKQorICAgICAgICAyICAgLTAuMDA2ICAgLTAuMDAzICAxMzkuOTQyICAgNjkuOTcxIHByb2ZpbGVlLnB5Ojg0KGhlbHBlcjJfaW5kaXJlY3QpCisgICAgICAgIDggIDMxMS45NzYgICAzOC45OTcgIDM5OS44OTYgICA0OS45ODcgcHJvZmlsZWUucHk6ODgoaGVscGVyMikKKyAgICAgICAgOCAgIDYzLjk2OCAgICA3Ljk5NiAgIDc5Ljk0NCAgICA5Ljk5MyBwcm9maWxlZS5weTo5OChzdWJoZWxwZXIpCisKKworIiIiCitQcm9maWxlVGVzdC5leHBlY3RlZF9vdXRwdXRbJ3ByaW50X2NhbGxlcnMnXSA9ICIiIlwKKyAgIE9yZGVyZWQgYnk6IHN0YW5kYXJkIG5hbWUKKworRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHdhcyBjYWxsZWQgYnkuLi4KKzowKGFwcGVuZCkgICAgICAgICAgICAgICAgICAgICAgICA8LSBwcm9maWxlZS5weTo3MyhoZWxwZXIxKSg0KSAgMTE5Ljk2NAorOjAoZXhjX2luZm8pICAgICAgICAgICAgICAgICAgICAgIDwtIHByb2ZpbGVlLnB5OjczKGhlbHBlcjEpKDQpICAxMTkuOTY0Cis6MChoYXNhdHRyKSAgICAgICAgICAgICAgICAgICAgICAgPC0gcHJvZmlsZWUucHk6NzMoaGVscGVyMSkoNCkgIDExOS45NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weTo4OChoZWxwZXIyKSg4KSAgMzk5Ljg5NgorOjAocmFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgIDwtIHByb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikoOCkgICA3OS45NDQKKzowKHNldHByb2ZpbGUpICAgICAgICAgICAgICAgICAgICA8LSBwcm9maWxlOjAodGVzdGZ1bmMoKSkoMSkgIDk5OS43NDkKKzxzdHJpbmc+OjEoPG1vZHVsZT4pICAgICAgICAgICAgICA8LSBwcm9maWxlOjAodGVzdGZ1bmMoKSkoMSkgIDk5OS43NDkKK3Byb2ZpbGU6MChwcm9maWxlcikgICAgICAgICAgICAgICA8LQorcHJvZmlsZTowKHRlc3RmdW5jKCkpICAgICAgICAgICAgIDwtIHByb2ZpbGU6MChwcm9maWxlcikoMSkgICAgMC4wMDAKK3Byb2ZpbGVlLnB5OjExMChfX2dldGF0dHJfXykgICAgICA8LSA6MChoYXNhdHRyKSgxMikgICAxMS45NjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weTo5OChzdWJoZWxwZXIpKDE2KSAgIDc5Ljk0NAorcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpICAgICAgICAgIDwtIDxzdHJpbmc+OjEoPG1vZHVsZT4pKDEpICA5OTkuNzUxCitwcm9maWxlZS5weTozNShmYWN0b3JpYWwpICAgICAgICAgPC0gcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpKDEpICA5OTkuNzUzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKSgyMCkgIDE2OS45MTcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weTo4NChoZWxwZXIyX2luZGlyZWN0KSgyKSAgMTM5Ljk0MgorcHJvZmlsZWUucHk6NDgobXVsKSAgICAgICAgICAgICAgIDwtIHByb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkoMjApICAxNjkuOTE3Citwcm9maWxlZS5weTo1NShoZWxwZXIpICAgICAgICAgICAgPC0gcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpKDIpICA5OTkuNzUzCitwcm9maWxlZS5weTo3MyhoZWxwZXIxKSAgICAgICAgICAgPC0gcHJvZmlsZWUucHk6NTUoaGVscGVyKSg0KSAgNTk5LjgxNAorcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkgIDwtIHByb2ZpbGVlLnB5OjU1KGhlbHBlcikoMikgIDU5OS44MTQKK3Byb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpICAgICAgICAgICA8LSBwcm9maWxlZS5weTo1NShoZWxwZXIpKDYpICA1OTkuODE0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6ODQoaGVscGVyMl9pbmRpcmVjdCkoMikgIDEzOS45NDIKK3Byb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikgICAgICAgICA8LSBwcm9maWxlZS5weTo4OChoZWxwZXIyKSg4KSAgMzk5Ljg5NgorCisKKyIiIgorUHJvZmlsZVRlc3QuZXhwZWN0ZWRfb3V0cHV0WydwcmludF9jYWxsZWVzJ10gPSAiIiJcCisgICBPcmRlcmVkIGJ5OiBzdGFuZGFyZCBuYW1lCisKK0Z1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsZWQuLi4KKzowKGFwcGVuZCkgICAgICAgICAgICAgICAgICAgICAgICAtPgorOjAoZXhjX2luZm8pICAgICAgICAgICAgICAgICAgICAgIC0+Cis6MChoYXNhdHRyKSAgICAgICAgICAgICAgICAgICAgICAgLT4gcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKSgxMikgICAyNy45NzIKKzowKHJhbmdlKSAgICAgICAgICAgICAgICAgICAgICAgICAtPgorOjAoc2V0cHJvZmlsZSkgICAgICAgICAgICAgICAgICAgIC0+Cis8c3RyaW5nPjoxKDxtb2R1bGU+KSAgICAgICAgICAgICAgLT4gcHJvZmlsZWUucHk6MjUodGVzdGZ1bmMpKDEpICA5OTkuNzUzCitwcm9maWxlOjAocHJvZmlsZXIpICAgICAgICAgICAgICAgLT4gcHJvZmlsZTowKHRlc3RmdW5jKCkpKDEpICA5OTkuNzQ5Citwcm9maWxlOjAodGVzdGZ1bmMoKSkgICAgICAgICAgICAgLT4gOjAoc2V0cHJvZmlsZSkoMSkgICAgMC4wMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaW5nPjoxKDxtb2R1bGU+KSgxKSAgOTk5Ljc1MQorcHJvZmlsZWUucHk6MTEwKF9fZ2V0YXR0cl9fKSAgICAgIC0+Citwcm9maWxlZS5weToyNSh0ZXN0ZnVuYykgICAgICAgICAgLT4gcHJvZmlsZWUucHk6MzUoZmFjdG9yaWFsKSgxKSAgMTY5LjkxNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5OjU1KGhlbHBlcikoMikgIDU5OS44MTQKK3Byb2ZpbGVlLnB5OjM1KGZhY3RvcmlhbCkgICAgICAgICAtPiBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpKDIwKSAgMTY5LjkxNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5OjQ4KG11bCkoMjApICAgMTkuOTgwCitwcm9maWxlZS5weTo0OChtdWwpICAgICAgICAgICAgICAgLT4KK3Byb2ZpbGVlLnB5OjU1KGhlbHBlcikgICAgICAgICAgICAtPiBwcm9maWxlZS5weTo3MyhoZWxwZXIxKSg0KSAgMTE5Ljk2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5Ojg0KGhlbHBlcjJfaW5kaXJlY3QpKDIpICAxMzkuOTQyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6ODgoaGVscGVyMikoNikgIDM5OS44OTYKK3Byb2ZpbGVlLnB5OjczKGhlbHBlcjEpICAgICAgICAgICAtPiA6MChhcHBlbmQpKDQpICAgLTAuMDA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjAoZXhjX2luZm8pKDQpICAgLTAuMDA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjAoaGFzYXR0cikoNCkgICAxMS45NjQKK3Byb2ZpbGVlLnB5Ojg0KGhlbHBlcjJfaW5kaXJlY3QpICAtPiBwcm9maWxlZS5weTozNShmYWN0b3JpYWwpKDIpICAxNjkuOTE3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZWUucHk6ODgoaGVscGVyMikoMikgIDM5OS44OTYKK3Byb2ZpbGVlLnB5Ojg4KGhlbHBlcjIpICAgICAgICAgICAtPiA6MChoYXNhdHRyKSg4KSAgIDExLjk2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikoOCkgICA3OS45NDQKK3Byb2ZpbGVlLnB5Ojk4KHN1YmhlbHBlcikgICAgICAgICAtPiA6MChyYW5nZSkoOCkgICAtMC4wMDgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlZS5weToxMTAoX19nZXRhdHRyX18pKDE2KSAgIDI3Ljk3MgorCisKKyIiIgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjNjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjNjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvcGVydHkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9wZXJ0eS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWEwMjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHJvcGVydHkucHkKQEAgLTAsMCArMSwyMzEgQEAKKyMgVGVzdCBjYXNlIGZvciBwcm9wZXJ0eQorIyBtb3JlIHRlc3RzIGFyZSBpbiB0ZXN0X2Rlc2NyCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CisKK2NsYXNzIFByb3BlcnR5QmFzZShFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgUHJvcGVydHlHZXQoUHJvcGVydHlCYXNlKToKKyAgICBwYXNzCisKK2NsYXNzIFByb3BlcnR5U2V0KFByb3BlcnR5QmFzZSk6CisgICAgcGFzcworCitjbGFzcyBQcm9wZXJ0eURlbChQcm9wZXJ0eUJhc2UpOgorICAgIHBhc3MKKworY2xhc3MgQmFzZUNsYXNzKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9zcGFtID0gNQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICIiIkJhc2VDbGFzcy5nZXR0ZXIiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NwYW0KKworICAgIEBzcGFtLnNldHRlcgorICAgIGRlZiBzcGFtKHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fc3BhbSA9IHZhbHVlCisKKyAgICBAc3BhbS5kZWxldGVyCisgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgIGRlbCBzZWxmLl9zcGFtCisKK2NsYXNzIFN1YkNsYXNzKEJhc2VDbGFzcyk6CisKKyAgICBAQmFzZUNsYXNzLnNwYW0uZ2V0dGVyCisgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICIiIlN1YkNsYXNzLmdldHRlciIiIgorICAgICAgICByYWlzZSBQcm9wZXJ0eUdldChzZWxmLl9zcGFtKQorCisgICAgQHNwYW0uc2V0dGVyCisgICAgZGVmIHNwYW0oc2VsZiwgdmFsdWUpOgorICAgICAgICByYWlzZSBQcm9wZXJ0eVNldChzZWxmLl9zcGFtKQorCisgICAgQHNwYW0uZGVsZXRlcgorICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICByYWlzZSBQcm9wZXJ0eURlbChzZWxmLl9zcGFtKQorCitjbGFzcyBQcm9wZXJ0eURvY0Jhc2Uob2JqZWN0KToKKyAgICBfc3BhbSA9IDEKKyAgICBkZWYgX2dldF9zcGFtKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc3BhbQorICAgIHNwYW0gPSBwcm9wZXJ0eShfZ2V0X3NwYW0sIGRvYz0ic3BhbSBzcGFtIHNwYW0iKQorCitjbGFzcyBQcm9wZXJ0eURvY1N1YihQcm9wZXJ0eURvY0Jhc2UpOgorICAgIEBQcm9wZXJ0eURvY0Jhc2Uuc3BhbS5nZXR0ZXIKKyAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgIiIiVGhlIGRlY29yYXRvciBkb2VzIG5vdCB1c2UgdGhpcyBkb2Mgc3RyaW5nIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9zcGFtCisKK2NsYXNzIFByb3BlcnR5U3ViTmV3R2V0dGVyKEJhc2VDbGFzcyk6CisgICAgQEJhc2VDbGFzcy5zcGFtLmdldHRlcgorICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICAiIiJuZXcgZG9jc3RyaW5nIiIiCisgICAgICAgIHJldHVybiA1CisKK2NsYXNzIFByb3BlcnR5TmV3R2V0dGVyKG9iamVjdCk6CisgICAgQHByb3BlcnR5CisgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICIiIm9yaWdpbmFsIGRvY3N0cmluZyIiIgorICAgICAgICByZXR1cm4gMQorICAgIEBzcGFtLmdldHRlcgorICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICAiIiJuZXcgZG9jc3RyaW5nIiIiCisgICAgICAgIHJldHVybiA4CisKK2NsYXNzIFByb3BlcnR5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3Byb3BlcnR5X2RlY29yYXRvcl9iYXNlY2xhc3Moc2VsZik6CisgICAgICAgICMgc2VlICMxNjIwCisgICAgICAgIGJhc2UgPSBCYXNlQ2xhc3MoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2Uuc3BhbSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLl9zcGFtLCA1KQorICAgICAgICBiYXNlLnNwYW0gPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2Uuc3BhbSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5fc3BhbSwgMTApCisgICAgICAgIGRlbGF0dHIoYmFzZSwgInNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYmFzZSwgInNwYW0iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKGJhc2UsICJfc3BhbSIpKQorICAgICAgICBiYXNlLnNwYW0gPSAyMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2Uuc3BhbSwgMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5fc3BhbSwgMjApCisKKyAgICBkZWYgdGVzdF9wcm9wZXJ0eV9kZWNvcmF0b3Jfc3ViY2xhc3Moc2VsZik6CisgICAgICAgICMgc2VlICMxNjIwCisgICAgICAgIHN1YiA9IFN1YkNsYXNzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUHJvcGVydHlHZXQsIGdldGF0dHIsIHN1YiwgInNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQcm9wZXJ0eVNldCwgc2V0YXR0ciwgc3ViLCAic3BhbSIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFByb3BlcnR5RGVsLCBkZWxhdHRyLCBzdWIsICJzcGFtIikKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X3Byb3BlcnR5X2RlY29yYXRvcl9zdWJjbGFzc19kb2Moc2VsZik6CisgICAgICAgIHN1YiA9IFN1YkNsYXNzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWIuX19jbGFzc19fLnNwYW0uX19kb2NfXywgIlN1YkNsYXNzLmdldHRlciIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9wcm9wZXJ0eV9kZWNvcmF0b3JfYmFzZWNsYXNzX2RvYyhzZWxmKToKKyAgICAgICAgYmFzZSA9IEJhc2VDbGFzcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5fX2NsYXNzX18uc3BhbS5fX2RvY19fLCAiQmFzZUNsYXNzLmdldHRlciIpCisKKyAgICBkZWYgdGVzdF9wcm9wZXJ0eV9kZWNvcmF0b3JfZG9jKHNlbGYpOgorICAgICAgICBiYXNlID0gUHJvcGVydHlEb2NCYXNlKCkKKyAgICAgICAgc3ViID0gUHJvcGVydHlEb2NTdWIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2UuX19jbGFzc19fLnNwYW0uX19kb2NfXywgInNwYW0gc3BhbSBzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWIuX19jbGFzc19fLnNwYW0uX19kb2NfXywgInNwYW0gc3BhbSBzcGFtIikKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X3Byb3BlcnR5X2dldHRlcl9kb2Nfb3ZlcnJpZGUoc2VsZik6CisgICAgICAgIG5ld2dldHRlcnN1YiA9IFByb3BlcnR5U3ViTmV3R2V0dGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdnZXR0ZXJzdWIuc3BhbSwgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdnZXR0ZXJzdWIuX19jbGFzc19fLnNwYW0uX19kb2NfXywgIm5ldyBkb2NzdHJpbmciKQorICAgICAgICBuZXdnZXR0ZXIgPSBQcm9wZXJ0eU5ld0dldHRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3Z2V0dGVyLnNwYW0sIDgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3Z2V0dGVyLl9fY2xhc3NfXy5zcGFtLl9fZG9jX18sICJuZXcgZG9jc3RyaW5nIikKKworCisjIElzc3VlIDU4OTA6IHN1YmNsYXNzZXMgb2YgcHJvcGVydHkgZG8gbm90IHByZXNlcnZlIG1ldGhvZCBfX2RvY19fIHN0cmluZ3MKK2NsYXNzIFByb3BlcnR5U3ViKHByb3BlcnR5KToKKyAgICAiIiJUaGlzIGlzIGEgc3ViY2xhc3Mgb2YgcHJvcGVydHkiIiIKKworY2xhc3MgUHJvcGVydHlTdWJTbG90cyhwcm9wZXJ0eSk6CisgICAgIiIiVGhpcyBpcyBhIHN1YmNsYXNzIG9mIHByb3BlcnR5IHRoYXQgZGVmaW5lcyBfX3Nsb3RzX18iIiIKKyAgICBfX3Nsb3RzX18gPSAoKQorCitjbGFzcyBQcm9wZXJ0eVN1YmNsYXNzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc2xvdHNfZG9jc3RyaW5nX2NvcHlfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgICAgICBAUHJvcGVydHlTdWJTbG90cworICAgICAgICAgICAgICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAiIiJUcnlpbmcgdG8gY29weSB0aGlzIGRvY3N0cmluZyB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiIiIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oIkF0dHJpYnV0ZUVycm9yIG5vdCByYWlzZWQiKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfZG9jc3RyaW5nX2NvcHkoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgorICAgICAgICAgICAgQFByb3BlcnR5U3ViCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgICAgICAgICAiIiJzcGFtIHdyYXBwZWQgaW4gcHJvcGVydHkgc3ViY2xhc3MiIiIKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgRm9vLnNwYW0uX19kb2NfXywKKyAgICAgICAgICAgICJzcGFtIHdyYXBwZWQgaW4gcHJvcGVydHkgc3ViY2xhc3MiKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfcHJvcGVydHlfc2V0dGVyX2NvcGllc19nZXR0ZXJfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5fc3BhbSA9IDEKKyAgICAgICAgICAgIEBQcm9wZXJ0eVN1YgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICAgICAgICAgIiIic3BhbSB3cmFwcGVkIGluIHByb3BlcnR5IHN1YmNsYXNzIiIiCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NwYW0KKyAgICAgICAgICAgIEBzcGFtLnNldHRlcgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgICIiInRoaXMgZG9jc3RyaW5nIGlzIGlnbm9yZWQiIiIKKyAgICAgICAgICAgICAgICBzZWxmLl9zcGFtID0gdmFsdWUKKyAgICAgICAgZm9vID0gRm9vKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uc3BhbSwgMSkKKyAgICAgICAgZm9vLnNwYW0gPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vLnNwYW0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBGb28uc3BhbS5fX2RvY19fLAorICAgICAgICAgICAgInNwYW0gd3JhcHBlZCBpbiBwcm9wZXJ0eSBzdWJjbGFzcyIpCisgICAgICAgIGNsYXNzIEZvb1N1YihGb28pOgorICAgICAgICAgICAgQEZvby5zcGFtLnNldHRlcgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgICIiImFub3RoZXIgaWdub3JlZCBkb2NzdHJpbmciIiIKKyAgICAgICAgICAgICAgICBzZWxmLl9zcGFtID0gJ2VnZ3MnCisgICAgICAgIGZvb3N1YiA9IEZvb1N1YigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9vc3ViLnNwYW0sIDEpCisgICAgICAgIGZvb3N1Yi5zcGFtID0gNworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvb3N1Yi5zcGFtLCAnZWdncycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBGb29TdWIuc3BhbS5fX2RvY19fLAorICAgICAgICAgICAgInNwYW0gd3JhcHBlZCBpbiBwcm9wZXJ0eSBzdWJjbGFzcyIpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdF9wcm9wZXJ0eV9uZXdfZ2V0dGVyX25ld19kb2NzdHJpbmcoc2VsZik6CisKKyAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CisgICAgICAgICAgICBAUHJvcGVydHlTdWIKKyAgICAgICAgICAgIGRlZiBzcGFtKHNlbGYpOgorICAgICAgICAgICAgICAgICIiImEgZG9jc3RyaW5nIiIiCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIEBzcGFtLmdldHRlcgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICAgICAgICAgIiIiYSBuZXcgZG9jc3RyaW5nIiIiCisgICAgICAgICAgICAgICAgcmV0dXJuIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGb28uc3BhbS5fX2RvY19fLCAiYSBuZXcgZG9jc3RyaW5nIikKKyAgICAgICAgY2xhc3MgRm9vQmFzZShvYmplY3QpOgorICAgICAgICAgICAgQFByb3BlcnR5U3ViCisgICAgICAgICAgICBkZWYgc3BhbShzZWxmKToKKyAgICAgICAgICAgICAgICAiIiJhIGRvY3N0cmluZyIiIgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIGNsYXNzIEZvbzIoRm9vQmFzZSk6CisgICAgICAgICAgICBARm9vQmFzZS5zcGFtLmdldHRlcgorICAgICAgICAgICAgZGVmIHNwYW0oc2VsZik6CisgICAgICAgICAgICAgICAgIiIiYSBuZXcgZG9jc3RyaW5nIiIiCisgICAgICAgICAgICAgICAgcmV0dXJuIDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGb28uc3BhbS5fX2RvY19fLCAiYSBuZXcgZG9jc3RyaW5nIikKKworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoUHJvcGVydHlUZXN0cywgUHJvcGVydHlTdWJjbGFzc1Rlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9wZXJ0eS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9wZXJ0eS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzYjk4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb3BlcnR5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9wZXJ0eS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wcm9wZXJ0eS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzYjk4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Byb3BlcnR5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wc3RhdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wc3RhdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFkOTQxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BzdGF0cy5weQpAQCAtMCwwICsxLDMyIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgcHN0YXRzCisKKworCitjbGFzcyBBZGRDYWxsZXJzVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBwc3RhdHMuYWRkX2NhbGxlcnMgaGVscGVyLiIiIgorCisgICAgZGVmIHRlc3RfY29tYmluZV9yZXN1bHRzKHNlbGYpOgorICAgICAgICAiIiJwc3RhdHMuYWRkX2NhbGxlcnMgc2hvdWxkIGNvbWJpbmUgdGhlIGNhbGwgcmVzdWx0cyBvZiBib3RoIHRhcmdldAorICAgICAgICBhbmQgc291cmNlIGJ5IGFkZGluZyB0aGUgY2FsbCB0aW1lLiBTZWUgaXNzdWUxMjY5LiIiIgorICAgICAgICAjIG5ldyBmb3JtYXQ6IHVzZWQgYnkgdGhlIGNQcm9maWxlIG1vZHVsZQorICAgICAgICB0YXJnZXQgPSB7ImEiOiAoMSwgMiwgMywgNCl9CisgICAgICAgIHNvdXJjZSA9IHsiYSI6ICgxLCAyLCAzLCA0KSwgImIiOiAoNSwgNiwgNywgOCl9CisgICAgICAgIG5ld19jYWxsZXJzID0gcHN0YXRzLmFkZF9jYWxsZXJzKHRhcmdldCwgc291cmNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19jYWxsZXJzLCB7J2EnOiAoMiwgNCwgNiwgOCksICdiJzogKDUsIDYsIDcsIDgpfSkKKyAgICAgICAgIyBvbGQgZm9ybWF0OiB1c2VkIGJ5IHRoZSBwcm9maWxlIG1vZHVsZQorICAgICAgICB0YXJnZXQgPSB7ImEiOiAxfQorICAgICAgICBzb3VyY2UgPSB7ImEiOiAxLCAiYiI6IDV9CisgICAgICAgIG5ld19jYWxsZXJzID0gcHN0YXRzLmFkZF9jYWxsZXJzKHRhcmdldCwgc291cmNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld19jYWxsZXJzLCB7J2EnOiAyLCAnYic6IDV9KQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBBZGRDYWxsZXJzVGVzdENhc2UKKyAgICApCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHN0YXRzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BzdGF0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYmRjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BzdGF0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHN0YXRzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BzdGF0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEyYmRjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3BzdGF0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYzM4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wdHkucHkKQEAgLTAsMCArMSwyODkgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorCisjU2tpcCB0aGVzZSB0ZXN0cyBpZiBlaXRoZXIgZmNudGwgb3IgdGVybWlvcyBpcyBub3QgYXZhaWxhYmxlCitmY250bCA9IGltcG9ydF9tb2R1bGUoJ2ZjbnRsJykKK2ltcG9ydF9tb2R1bGUoJ3Rlcm1pb3MnKQorCitpbXBvcnQgZXJybm8KK2ltcG9ydCBwdHkKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHNlbGVjdAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHNvY2tldAoraW1wb3J0IHVuaXR0ZXN0CisKK1RFU1RfU1RSSU5HXzEgPSAiSSB3aXNoIHRvIGJ1eSBhIGZpc2ggbGljZW5zZS5cbiIKK1RFU1RfU1RSSU5HXzIgPSAiRm9yIG15IHBldCBmaXNoLCBFcmljLlxuIgorCitpZiB2ZXJib3NlOgorICAgIGRlZiBkZWJ1Zyhtc2cpOgorICAgICAgICBwcmludCBtc2cKK2Vsc2U6CisgICAgZGVmIGRlYnVnKG1zZyk6CisgICAgICAgIHBhc3MKKworCitkZWYgbm9ybWFsaXplX291dHB1dChkYXRhKToKKyAgICAjIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgZG8gY29udmVyc2lvbnMgb24gbmV3bGluZS4gIFdlIGNvdWxkIHBvc3NpYmx5CisgICAgIyBmaXggdGhhdCBieSBkb2luZyB0aGUgYXBwcm9wcmlhdGUgdGVybWlvcy50Y3NldGF0dHIoKXMuICBJIGNvdWxkbid0CisgICAgIyBmaWd1cmUgb3V0IHRoZSByaWdodCBjb21ibyBvbiBUcnU2NCBhbmQgSSBkb24ndCBoYXZlIGFuIElSSVggYm94LgorICAgICMgU28ganVzdCBub3JtYWxpemUgdGhlIG91dHB1dCBhbmQgZG9jIHRoZSBwcm9ibGVtIE8vU2VzIGJ5IGFsbG93aW5nCisgICAgIyBjZXJ0YWluIGNvbWJpbmF0aW9ucyBmb3Igc29tZSBwbGF0Zm9ybXMsIGJ1dCBhdm9pZCBhbGxvd2luZyBvdGhlcgorICAgICMgZGlmZmVyZW5jZXMgKGxpa2UgZXh0cmEgd2hpdGVzcGFjZSwgdHJhaWxpbmcgZ2FyYmFnZSwgZXRjLikKKworICAgICMgVGhpcyBpcyBhYm91dCB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCBnZXR0aW5nIHNvbWUgZmVlZGJhY2sKKyAgICAjIGZyb20gc29tZW9uZSBtb3JlIGtub3dsZWRnYWJsZS4KKworICAgICMgT1NGLzEgKFRydTY0KSBhcHBhcmVudGx5IHR1cm5zIFxuIGludG8gXHJcclxuLgorICAgIGlmIGRhdGEuZW5kc3dpdGgoJ1xyXHJcbicpOgorICAgICAgICByZXR1cm4gZGF0YS5yZXBsYWNlKCdcclxyXG4nLCAnXG4nKQorCisgICAgIyBJUklYIGFwcGFyZW50bHkgdHVybnMgXG4gaW50byBcclxuLgorICAgIGlmIGRhdGEuZW5kc3dpdGgoJ1xyXG4nKToKKyAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgnXHJcbicsICdcbicpCisKKyAgICByZXR1cm4gZGF0YQorCisKKyMgTWFyZ2luYWwgdGVzdGluZyBvZiBwdHkgc3VpdGUuIENhbm5vdCBkbyBleHRlbnNpdmUgJ2RvIG9yIGZhaWwnIHRlc3RpbmcKKyMgYmVjYXVzZSBwdHkgY29kZSBpcyBub3QgdG9vIHBvcnRhYmxlLgorIyBYWFgobm5vcndpdHopOiAgdGhlc2UgdGVzdHMgbGVhayBmZHMgd2hlbiB0aGVyZSBpcyBhbiBlcnJvci4KK2NsYXNzIFB0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBpc2F0dHkoKSBhbmQgY2xvc2UoKSBjYW4gaGFuZyBvbiBzb21lIHBsYXRmb3Jtcy4gIFNldCBhbiBhbGFybQorICAgICAgICAjIGJlZm9yZSBydW5uaW5nIHRoZSB0ZXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYW5nIGZvcmV2ZXIuCisgICAgICAgIHNlbGYub2xkX2FsYXJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2VsZi5oYW5kbGVfc2lnKQorICAgICAgICBzaWduYWwuYWxhcm0oMTApCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICMgcmVtb3ZlIGFsYXJtLCByZXN0b3JlIG9sZCBhbGFybSBoYW5kbGVyCisgICAgICAgIHNpZ25hbC5hbGFybSgwKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCBzZWxmLm9sZF9hbGFybSkKKworICAgIGRlZiBoYW5kbGVfc2lnKHNlbGYsIHNpZywgZnJhbWUpOgorICAgICAgICBzZWxmLmZhaWwoImlzYXR0eSBodW5nIikKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWJ1ZygiQ2FsbGluZyBtYXN0ZXJfb3BlbigpIikKKyAgICAgICAgICAgIG1hc3Rlcl9mZCwgc2xhdmVfbmFtZSA9IHB0eS5tYXN0ZXJfb3BlbigpCisgICAgICAgICAgICBkZWJ1ZygiR290IG1hc3Rlcl9mZCAnJWQnLCBzbGF2ZV9uYW1lICclcyciICUKKyAgICAgICAgICAgICAgICAgIChtYXN0ZXJfZmQsIHNsYXZlX25hbWUpKQorICAgICAgICAgICAgZGVidWcoIkNhbGxpbmcgc2xhdmVfb3BlbiglcikiICUgKHNsYXZlX25hbWUsKSkKKyAgICAgICAgICAgIHNsYXZlX2ZkID0gcHR5LnNsYXZlX29wZW4oc2xhdmVfbmFtZSkKKyAgICAgICAgICAgIGRlYnVnKCJHb3Qgc2xhdmVfZmQgJyVkJyIgJSBzbGF2ZV9mZCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAjICIgQW4gb3B0aW9uYWwgZmVhdHVyZSBjb3VsZCBub3QgYmUgaW1wb3J0ZWQgIiAuLi4gPworICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QsICJQc2V1ZG8tdGVybWluYWxzIChzZWVtaW5nbHkpIG5vdCBmdW5jdGlvbmFsLiIKKworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MuaXNhdHR5KHNsYXZlX2ZkKSwgJ3NsYXZlX2ZkIGlzIG5vdCBhIHR0eScpCisKKyAgICAgICAgIyBTb2xhcmlzIHJlcXVpcmVzIHJlYWRpbmcgdGhlIGZkIGJlZm9yZSBhbnl0aGluZyBpcyByZXR1cm5lZC4KKyAgICAgICAgIyBNeSBndWVzcyBpcyB0aGF0IHNpbmNlIHdlIG9wZW4gYW5kIGNsb3NlIHRoZSBzbGF2ZSBmZAorICAgICAgICAjIGluIG1hc3Rlcl9vcGVuKCksIHdlIG5lZWQgdG8gcmVhZCB0aGUgRU9GLgorCisgICAgICAgICMgRW5zdXJlIHRoZSBmZCBpcyBub24tYmxvY2tpbmcgaW4gY2FzZSB0aGVyZSdzIG5vdGhpbmcgdG8gcmVhZC4KKyAgICAgICAgb3JpZ19mbGFncyA9IGZjbnRsLmZjbnRsKG1hc3Rlcl9mZCwgZmNudGwuRl9HRVRGTCkKKyAgICAgICAgZmNudGwuZmNudGwobWFzdGVyX2ZkLCBmY250bC5GX1NFVEZMLCBvcmlnX2ZsYWdzIHwgb3MuT19OT05CTE9DSykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgczEgPSBvcy5yZWFkKG1hc3Rlcl9mZCwgMTAyNCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHMxKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUFHQUlOOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICMgUmVzdG9yZSB0aGUgb3JpZ2luYWwgZmxhZ3MuCisgICAgICAgIGZjbnRsLmZjbnRsKG1hc3Rlcl9mZCwgZmNudGwuRl9TRVRGTCwgb3JpZ19mbGFncykKKworICAgICAgICBkZWJ1ZygiV3JpdGluZyB0byBzbGF2ZV9mZCIpCisgICAgICAgIG9zLndyaXRlKHNsYXZlX2ZkLCBURVNUX1NUUklOR18xKQorICAgICAgICBzMSA9IG9zLnJlYWQobWFzdGVyX2ZkLCAxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdJIHdpc2ggdG8gYnV5IGEgZmlzaCBsaWNlbnNlLlxuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVfb3V0cHV0KHMxKSkKKworICAgICAgICBkZWJ1ZygiV3JpdGluZyBjaHVua2VkIG91dHB1dCIpCisgICAgICAgIG9zLndyaXRlKHNsYXZlX2ZkLCBURVNUX1NUUklOR18yWzo1XSkKKyAgICAgICAgb3Mud3JpdGUoc2xhdmVfZmQsIFRFU1RfU1RSSU5HXzJbNTpdKQorICAgICAgICBzMiA9IG9zLnJlYWQobWFzdGVyX2ZkLCAxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdGb3IgbXkgcGV0IGZpc2gsIEVyaWMuXG4nLCBub3JtYWxpemVfb3V0cHV0KHMyKSkKKworICAgICAgICBvcy5jbG9zZShzbGF2ZV9mZCkKKyAgICAgICAgb3MuY2xvc2UobWFzdGVyX2ZkKQorCisKKyAgICBkZWYgdGVzdF9mb3JrKHNlbGYpOgorICAgICAgICBkZWJ1ZygiY2FsbGluZyBwdHkuZm9yaygpIikKKyAgICAgICAgcGlkLCBtYXN0ZXJfZmQgPSBwdHkuZm9yaygpCisgICAgICAgIGlmIHBpZCA9PSBwdHkuQ0hJTEQ6CisgICAgICAgICAgICAjIHN0ZG91dCBzaG91bGQgYmUgY29ubmVjdGVkIHRvIGEgdHR5LgorICAgICAgICAgICAgaWYgbm90IG9zLmlzYXR0eSgxKToKKyAgICAgICAgICAgICAgICBkZWJ1ZygiQ2hpbGQncyBmZCAxIGlzIG5vdCBhIHR0eT8hIikKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgzKQorCisgICAgICAgICAgICAjIEFmdGVyIHB0eS5mb3JrKCksIHRoZSBjaGlsZCBzaG91bGQgYWxyZWFkeSBiZSBhIHNlc3Npb24gbGVhZGVyLgorICAgICAgICAgICAgIyAob24gdGhvc2Ugc3lzdGVtcyB0aGF0IGhhdmUgdGhhdCBjb25jZXB0LikKKyAgICAgICAgICAgIGRlYnVnKCJJbiBjaGlsZCwgY2FsbGluZyBvcy5zZXRzaWQoKSIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Muc2V0c2lkKCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICMgR29vZCwgd2UgYWxyZWFkeSB3ZXJlIHNlc3Npb24gbGVhZGVyCisgICAgICAgICAgICAgICAgZGVidWcoIkdvb2Q6IE9TRXJyb3Igd2FzIHJhaXNlZC4iKQorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIEhhdmUgcHR5LCBidXQgbm90IHNldHNpZCgpPworICAgICAgICAgICAgICAgIGRlYnVnKCJObyBzZXRzaWQoKSBhdmFpbGFibGU/IikKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBXZSBkb24ndCB3YW50IHRoaXMgZXJyb3IgdG8gcHJvcGFnYXRlLCBlc2NhcGluZyB0aGUgY2FsbCB0bworICAgICAgICAgICAgICAgICMgb3MuX2V4aXQoKSBhbmQgY2F1c2luZyB2ZXJ5IHBlY3VsaWFyIGJlaGF2aW9yIGluIHRoZSBjYWxsaW5nCisgICAgICAgICAgICAgICAgIyByZWdydGVzdC5weSAhCisgICAgICAgICAgICAgICAgIyBOb3RlOiBjb3VsZCBhZGQgdHJhY2ViYWNrIHByaW50aW5nIGhlcmUuCisgICAgICAgICAgICAgICAgZGVidWcoIkFuIHVuZXhwZWN0ZWQgZXJyb3Igd2FzIHJhaXNlZC4iKQorICAgICAgICAgICAgICAgIG9zLl9leGl0KDEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGRlYnVnKCJvcy5zZXRzaWQoKSBzdWNjZWVkZWQhIChiYWQhKSIpCisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMikKKyAgICAgICAgICAgIG9zLl9leGl0KDQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWJ1ZygiV2FpdGluZyBmb3IgY2hpbGQgKCVkKSB0byBmaW5pc2guIiAlIHBpZCkKKyAgICAgICAgICAgICMgSW4gdmVyYm9zZSBtb2RlLCB3ZSBoYXZlIHRvIGNvbnN1bWUgdGhlIGRlYnVnIG91dHB1dCBmcm9tIHRoZQorICAgICAgICAgICAgIyBjaGlsZCBvciB0aGUgY2hpbGQgd2lsbCBibG9jaywgY2F1c2luZyB0aGlzIHRlc3QgdG8gaGFuZyBpbiB0aGUKKyAgICAgICAgICAgICMgcGFyZW50J3Mgd2FpdHBpZCgpIGNhbGwuICBUaGUgY2hpbGQgYmxvY2tzIGFmdGVyIGEKKyAgICAgICAgICAgICMgcGxhdGZvcm0tZGVwZW5kZW50IGFtb3VudCBvZiBkYXRhIGlzIHdyaXR0ZW4gdG8gaXRzIGZkLiAgT24KKyAgICAgICAgICAgICMgTGludXggMi42LCBpdCdzIDQwMDAgYnl0ZXMgYW5kIHRoZSBjaGlsZCB3b24ndCBibG9jaywgYnV0IG9uIE9TCisgICAgICAgICAgICAjIFggZXZlbiB0aGUgc21hbGwgd3JpdGVzIGluIHRoZSBjaGlsZCBhYm92ZSB3aWxsIGJsb2NrIGl0LiAgQWxzbworICAgICAgICAgICAgIyBvbiBMaW51eCwgdGhlIHJlYWQoKSB3aWxsIHJhaXNlIGFuIE9TRXJyb3IgKGlucHV0L291dHB1dCBlcnJvcikKKyAgICAgICAgICAgICMgd2hlbiBpdCB0cmllcyB0byByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIGJ1dCB0aGUgY2hpbGQncworICAgICAgICAgICAgIyBhbHJlYWR5IGV4aXRlZCwgc28gY2F0Y2ggYW5kIGRpc2NhcmQgdGhvc2UgZXhjZXB0aW9ucy4gIEl0J3Mgbm90CisgICAgICAgICAgICAjIHdvcnRoIGNoZWNraW5nIGZvciBFSU8uCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG9zLnJlYWQobWFzdGVyX2ZkLCA4MCkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKGRhdGEucmVwbGFjZSgnXHJcbicsICdcbicpKQorCisgICAgICAgICAgICAjI2xpbmUgPSBvcy5yZWFkKG1hc3Rlcl9mZCwgODApCisgICAgICAgICAgICAjI2xpbmVzID0gbGluZS5yZXBsYWNlKCdcclxuJywgJ1xuJykuc3BsaXQoJ1xuJykKKyAgICAgICAgICAgICMjaWYgRmFsc2UgYW5kIGxpbmVzICE9IFsnSW4gY2hpbGQsIGNhbGxpbmcgb3Muc2V0c2lkKCknLAorICAgICAgICAgICAgIyMgICAgICAgICAgICAgJ0dvb2Q6IE9TRXJyb3Igd2FzIHJhaXNlZC4nLCAnJ106CisgICAgICAgICAgICAjIyAgICByYWlzZSBUZXN0RmFpbGVkKCJVbmV4cGVjdGVkIG91dHB1dCBmcm9tIGNoaWxkOiAlciIgJSBsaW5lKQorCisgICAgICAgICAgICAocGlkLCBzdGF0dXMpID0gb3Mud2FpdHBpZChwaWQsIDApCisgICAgICAgICAgICByZXMgPSBzdGF0dXMgPj4gOAorICAgICAgICAgICAgZGVidWcoIkNoaWxkICglZCkgZXhpdGVkIHdpdGggc3RhdHVzICVkICglZCkuIiAlIChwaWQsIHJlcywgc3RhdHVzKSkKKyAgICAgICAgICAgIGlmIHJlcyA9PSAxOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiQ2hpbGQgcmFpc2VkIGFuIHVuZXhwZWN0ZWQgZXhjZXB0aW9uIGluIG9zLnNldHNpZCgpIikKKyAgICAgICAgICAgIGVsaWYgcmVzID09IDI6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJwdHkuZm9yaygpIGZhaWxlZCB0byBtYWtlIGNoaWxkIGEgc2Vzc2lvbiBsZWFkZXIuIikKKyAgICAgICAgICAgIGVsaWYgcmVzID09IDM6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJDaGlsZCBzcGF3bmVkIGJ5IHB0eS5mb3JrKCkgZGlkIG5vdCBoYXZlIGEgdHR5IGFzIHN0ZG91dCIpCisgICAgICAgICAgICBlbGlmIHJlcyAhPSA0OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgicHR5LmZvcmsoKSBmYWlsZWQgZm9yIHVua25vd24gcmVhc29ucy4iKQorCisgICAgICAgICAgICAjI2RlYnVnKCJSZWFkaW5nIGZyb20gbWFzdGVyX2ZkIG5vdyB0aGF0IHRoZSBjaGlsZCBoYXMgZXhpdGVkIikKKyAgICAgICAgICAgICMjdHJ5OgorICAgICAgICAgICAgIyMgICAgczEgPSBvcy5yZWFkKG1hc3Rlcl9mZCwgMTAyNCkKKyAgICAgICAgICAgICMjZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgIyMgICAgcGFzcworICAgICAgICAgICAgIyNlbHNlOgorICAgICAgICAgICAgIyMgICAgcmFpc2UgVGVzdEZhaWxlZCgiUmVhZCBmcm9tIG1hc3Rlcl9mZCBkaWQgbm90IHJhaXNlIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgb3MuY2xvc2UobWFzdGVyX2ZkKQorCisgICAgICAgICMgcHR5LmZvcmsoKSBwYXNzZWQuCisKKworY2xhc3MgU21hbGxQdHlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGhlc2UgdGVzdHMgZG9uJ3Qgc3Bhd24gY2hpbGRyZW4gb3IgaGFuZy4iIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vcmlnX3N0ZGluX2ZpbGVubyA9IHB0eS5TVERJTl9GSUxFTk8KKyAgICAgICAgc2VsZi5vcmlnX3N0ZG91dF9maWxlbm8gPSBwdHkuU1RET1VUX0ZJTEVOTworICAgICAgICBzZWxmLm9yaWdfcHR5X3NlbGVjdCA9IHB0eS5zZWxlY3QKKyAgICAgICAgc2VsZi5mZHMgPSBbXSAgIyBBIGxpc3Qgb2YgZmlsZSBkZXNjcmlwdG9ycyB0byBjbG9zZS4KKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19sZW5ndGhzID0gW10KKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19yZXN1bHRzID0gW10KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcHR5LlNURElOX0ZJTEVOTyA9IHNlbGYub3JpZ19zdGRpbl9maWxlbm8KKyAgICAgICAgcHR5LlNURE9VVF9GSUxFTk8gPSBzZWxmLm9yaWdfc3Rkb3V0X2ZpbGVubworICAgICAgICBwdHkuc2VsZWN0ID0gc2VsZi5vcmlnX3B0eV9zZWxlY3QKKyAgICAgICAgZm9yIGZkIGluIHNlbGYuZmRzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfcGlwZShzZWxmKToKKyAgICAgICAgcGlwZV9mZHMgPSBvcy5waXBlKCkKKyAgICAgICAgc2VsZi5mZHMuZXh0ZW5kKHBpcGVfZmRzKQorICAgICAgICByZXR1cm4gcGlwZV9mZHMKKworICAgIGRlZiBfbW9ja19zZWxlY3Qoc2VsZiwgcmZkcywgd2ZkcywgeGZkcyk6CisgICAgICAgICMgVGhpcyB3aWxsIHJhaXNlIEluZGV4RXJyb3Igd2hlbiBubyBtb3JlIGV4cGVjdGVkIGNhbGxzIGV4aXN0LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2VsZWN0X3JmZHNfbGVuZ3Rocy5wb3AoMCksIGxlbihyZmRzKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VsZWN0X3JmZHNfcmVzdWx0cy5wb3AoMCksIFtdLCBbXQorCisgICAgZGVmIHRlc3RfX2NvcHlfdG9fZWFjaChzZWxmKToKKyAgICAgICAgIiIiVGVzdCB0aGUgbm9ybWFsIGRhdGEgY2FzZSBvbiBib3RoIG1hc3Rlcl9mZCBhbmQgc3RkaW4uIiIiCisgICAgICAgIHJlYWRfZnJvbV9zdGRvdXRfZmQsIG1vY2tfc3Rkb3V0X2ZkID0gc2VsZi5fcGlwZSgpCisgICAgICAgIHB0eS5TVERPVVRfRklMRU5PID0gbW9ja19zdGRvdXRfZmQKKyAgICAgICAgbW9ja19zdGRpbl9mZCwgd3JpdGVfdG9fc3RkaW5fZmQgPSBzZWxmLl9waXBlKCkKKyAgICAgICAgcHR5LlNURElOX0ZJTEVOTyA9IG1vY2tfc3RkaW5fZmQKKyAgICAgICAgc29ja2V0cGFpciA9IHNvY2tldC5zb2NrZXRwYWlyKCkKKyAgICAgICAgbWFzdGVycyA9IFtzLmZpbGVubygpIGZvciBzIGluIHNvY2tldHBhaXJdCisgICAgICAgIHNlbGYuZmRzLmV4dGVuZChtYXN0ZXJzKQorCisgICAgICAgICMgRmVlZCBkYXRhLiAgU21hbGxlciB0aGFuIFBJUEVCVUYuICBUaGVzZSB3cml0ZXMgd2lsbCBub3QgYmxvY2suCisgICAgICAgIG9zLndyaXRlKG1hc3RlcnNbMV0sIGInZnJvbSBtYXN0ZXInKQorICAgICAgICBvcy53cml0ZSh3cml0ZV90b19zdGRpbl9mZCwgYidmcm9tIHN0ZGluJykKKworICAgICAgICAjIEV4cGVjdCB0d28gc2VsZWN0IGNhbGxzLCB0aGUgbGFzdCBvbmUgd2lsbCBjYXVzZSBJbmRleEVycm9yCisgICAgICAgIHB0eS5zZWxlY3QgPSBzZWxmLl9tb2NrX3NlbGVjdAorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX2xlbmd0aHMuYXBwZW5kKDIpCisgICAgICAgIHNlbGYuc2VsZWN0X3JmZHNfcmVzdWx0cy5hcHBlbmQoW21vY2tfc3RkaW5fZmQsIG1hc3RlcnNbMF1dKQorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX2xlbmd0aHMuYXBwZW5kKDIpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKKyAgICAgICAgICAgIHB0eS5fY29weShtYXN0ZXJzWzBdKQorCisgICAgICAgICMgVGVzdCB0aGF0IHRoZSByaWdodCBkYXRhIHdlbnQgdG8gdGhlIHJpZ2h0IHBsYWNlcy4KKyAgICAgICAgcmZkcyA9IHNlbGVjdC5zZWxlY3QoW3JlYWRfZnJvbV9zdGRvdXRfZmQsIG1hc3RlcnNbMV1dLCBbXSwgW10sIDApWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3JlYWRfZnJvbV9zdGRvdXRfZmQsIG1hc3RlcnNbMV1dLCByZmRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQocmVhZF9mcm9tX3N0ZG91dF9mZCwgMjApLCBiJ2Zyb20gbWFzdGVyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5yZWFkKG1hc3RlcnNbMV0sIDIwKSwgYidmcm9tIHN0ZGluJykKKworICAgIGRlZiB0ZXN0X19jb3B5X2VvZl9vbl9hbGwoc2VsZik6CisgICAgICAgICIiIlRlc3QgdGhlIGVtcHR5IHJlYWQgRU9GIGNhc2Ugb24gYm90aCBtYXN0ZXJfZmQgYW5kIHN0ZGluLiIiIgorICAgICAgICByZWFkX2Zyb21fc3Rkb3V0X2ZkLCBtb2NrX3N0ZG91dF9mZCA9IHNlbGYuX3BpcGUoKQorICAgICAgICBwdHkuU1RET1VUX0ZJTEVOTyA9IG1vY2tfc3Rkb3V0X2ZkCisgICAgICAgIG1vY2tfc3RkaW5fZmQsIHdyaXRlX3RvX3N0ZGluX2ZkID0gc2VsZi5fcGlwZSgpCisgICAgICAgIHB0eS5TVERJTl9GSUxFTk8gPSBtb2NrX3N0ZGluX2ZkCisgICAgICAgIHNvY2tldHBhaXIgPSBzb2NrZXQuc29ja2V0cGFpcigpCisgICAgICAgIG1hc3RlcnMgPSBbcy5maWxlbm8oKSBmb3IgcyBpbiBzb2NrZXRwYWlyXQorICAgICAgICBzZWxmLmZkcy5leHRlbmQobWFzdGVycykKKworICAgICAgICBvcy5jbG9zZShtYXN0ZXJzWzFdKQorICAgICAgICBzb2NrZXRwYWlyWzFdLmNsb3NlKCkKKyAgICAgICAgb3MuY2xvc2Uod3JpdGVfdG9fc3RkaW5fZmQpCisKKyAgICAgICAgIyBFeHBlY3QgdHdvIHNlbGVjdCBjYWxscywgdGhlIGxhc3Qgb25lIHdpbGwgY2F1c2UgSW5kZXhFcnJvcgorICAgICAgICBwdHkuc2VsZWN0ID0gc2VsZi5fbW9ja19zZWxlY3QKKyAgICAgICAgc2VsZi5zZWxlY3RfcmZkc19sZW5ndGhzLmFwcGVuZCgyKQorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX3Jlc3VsdHMuYXBwZW5kKFttb2NrX3N0ZGluX2ZkLCBtYXN0ZXJzWzBdXSkKKyAgICAgICAgIyBXZSBleHBlY3QgdGhhdCBib3RoIGZkcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgZmRzIGxpc3QgYXMgdGhleQorICAgICAgICAjIGJvdGggZW5jb3VudGVyZWQgYW4gRU9GIGJlZm9yZSB0aGUgc2Vjb25kIHNlbGVjdCBjYWxsLgorICAgICAgICBzZWxmLnNlbGVjdF9yZmRzX2xlbmd0aHMuYXBwZW5kKDApCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKToKKyAgICAgICAgICAgIHB0eS5fY29weShtYXN0ZXJzWzBdKQorCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICBydW5fdW5pdHRlc3QoU21hbGxQdHlUZXN0cywgUHR5VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B0eS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4YjJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B0eS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHR5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B0eS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4YjJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B0eS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHdkLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHdkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5NjE2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHkKQEAgLTAsMCArMSwxMDkgQEAKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworcHdkID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3B3ZCcpCisKK2NsYXNzIFB3ZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICBlbnRyaWVzID0gcHdkLmdldHB3YWxsKCkKKyAgICAgICAgZW50cmllc2J5bmFtZSA9IHt9CisgICAgICAgIGVudHJpZXNieXVpZCA9IHt9CisKKyAgICAgICAgZm9yIGUgaW4gZW50cmllczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGUpLCA3KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzBdLCBlLnB3X25hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZS5wd19uYW1lLCBiYXNlc3RyaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzFdLCBlLnB3X3Bhc3N3ZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X3Bhc3N3ZCwgYmFzZXN0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVsyXSwgZS5wd191aWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZS5wd191aWQsIChpbnQsIGxvbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzNdLCBlLnB3X2dpZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlLnB3X2dpZCwgKGludCwgbG9uZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbNF0sIGUucHdfZ2Vjb3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZS5wd19nZWNvcywgYmFzZXN0cmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVs1XSwgZS5wd19kaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZS5wd19kaXIsIGJhc2VzdHJpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbNl0sIGUucHdfc2hlbGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZS5wd19zaGVsbCwgYmFzZXN0cmluZykKKworICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIHdvbid0IHdvcmssIGJlY2F1c2Ugb2YgZHVwbGljYXRlIGVudHJpZXMKKyAgICAgICAgICAgICMgZm9yIG9uZSB1aWQKKyAgICAgICAgICAgICMgICAgc2VsZi5hc3NlcnRFcXVhbChwd2QuZ2V0cHd1aWQoZS5wd191aWQpLCBlKQorICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIHRoaXMgY29sbGVjdCBhbGwgZW50cmllcyBmb3Igb25lIHVpZAorICAgICAgICAgICAgIyBhbmQgY2hlY2sgYWZ0ZXJ3YXJkcworICAgICAgICAgICAgZW50cmllc2J5bmFtZS5zZXRkZWZhdWx0KGUucHdfbmFtZSwgW10pLmFwcGVuZChlKQorICAgICAgICAgICAgZW50cmllc2J5dWlkLnNldGRlZmF1bHQoZS5wd191aWQsIFtdKS5hcHBlbmQoZSkKKworICAgICAgICBpZiBsZW4oZW50cmllcykgPiAxMDAwOiAgIyBIdWdlIHBhc3N3ZCBmaWxlIChOSVM/KSAtLSBza2lwIHRoZSByZXN0CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlIGVudHJ5IHJldHVybmVkIGJ5IGdldHB3dWlkKCkKKyAgICAgICAgIyBmb3IgZWFjaCB1aWQgaXMgYW1vbmcgdGhvc2UgZnJvbSBnZXRwd2FsbCgpIGZvciB0aGlzIHVpZAorICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgorICAgICAgICAgICAgaWYgbm90IGVbMF0gb3IgZVswXSA9PSAnKyc6CisgICAgICAgICAgICAgICAgY29udGludWUgIyBza2lwIE5JUyBlbnRyaWVzIGV0Yy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHdkLmdldHB3bmFtKGUucHdfbmFtZSksIGVudHJpZXNieW5hbWVbZS5wd19uYW1lXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHdkLmdldHB3dWlkKGUucHdfdWlkKSwgZW50cmllc2J5dWlkW2UucHdfdWlkXSkKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwd2QuZ2V0cHd1aWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHdkLmdldHB3dWlkLCAzLjE0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHB3ZC5nZXRwd25hbSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwd2QuZ2V0cHduYW0sIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHB3ZC5nZXRwd2FsbCwgNDIpCisKKyAgICAgICAgIyB0cnkgdG8gZ2V0IHNvbWUgZXJyb3JzCisgICAgICAgIGJ5bmFtZXMgPSB7fQorICAgICAgICBieXVpZHMgPSB7fQorICAgICAgICBmb3IgKG4sIHAsIHUsIGcsIGdlY29zLCBkLCBzKSBpbiBwd2QuZ2V0cHdhbGwoKToKKyAgICAgICAgICAgIGJ5bmFtZXNbbl0gPSB1CisgICAgICAgICAgICBieXVpZHNbdV0gPSBuCisKKyAgICAgICAgYWxsbmFtZXMgPSBieW5hbWVzLmtleXMoKQorICAgICAgICBuYW1laSA9IDAKKyAgICAgICAgZmFrZW5hbWUgPSBhbGxuYW1lc1tuYW1laV0KKyAgICAgICAgd2hpbGUgZmFrZW5hbWUgaW4gYnluYW1lczoKKyAgICAgICAgICAgIGNoYXJzID0gbGlzdChmYWtlbmFtZSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4oY2hhcnMpKToKKyAgICAgICAgICAgICAgICBpZiBjaGFyc1tpXSA9PSAneic6CisgICAgICAgICAgICAgICAgICAgIGNoYXJzW2ldID0gJ0EnCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxpZiBjaGFyc1tpXSA9PSAnWic6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY2hhcnNbaV0gPSBjaHIob3JkKGNoYXJzW2ldKSArIDEpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5hbWVpID0gbmFtZWkgKyAxCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmYWtlbmFtZSA9IGFsbG5hbWVzW25hbWVpXQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAjIHNob3VsZCBuZXZlciBoYXBwZW4uLi4gaWYgc28sIGp1c3QgZm9yZ2V0IGl0CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBmYWtlbmFtZSA9ICcnLmpvaW4oY2hhcnMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHB3ZC5nZXRwd25hbSwgZmFrZW5hbWUpCisKKyAgICAgICAgIyBJbiBzb21lIGNhc2VzLCBieXVpZHMgaXNuJ3QgYSBjb21wbGV0ZSBsaXN0IG9mIGFsbCB1c2VycyBpbiB0aGUKKyAgICAgICAgIyBzeXN0ZW0sIHNvIGlmIHdlIHRyeSB0byBwaWNrIGEgdmFsdWUgbm90IGluIGJ5dWlkcyAodmlhIGEgcGVydHVyYmluZworICAgICAgICAjIGxvb3AsIHNheSksIHB3ZC5nZXRwd3VpZCgpIG1pZ2h0IHN0aWxsIGJlIGFibGUgdG8gZmluZCBkYXRhIGZvciB0aGF0CisgICAgICAgICMgdWlkLiBVc2luZyBzeXMubWF4aW50IG1heSBwcm92b2tlIHRoZSBzYW1lIHByb2JsZW1zLCBidXQgaG9wZWZ1bGx5CisgICAgICAgICMgaXQgd2lsbCBiZSBhIG1vcmUgcmVwZWF0YWJsZSBmYWlsdXJlLgorICAgICAgICBmYWtldWlkID0gc3lzLm1heGludAorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGZha2V1aWQsIGJ5dWlkcykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHB3ZC5nZXRwd3VpZCwgZmFrZXVpZCkKKworICAgICAgICAjIC0xIHNob3VsZG4ndCBiZSBhIHZhbGlkIHVpZCBiZWNhdXNlIGl0IGhhcyBhIHNwZWNpYWwgbWVhbmluZyBpbiBtYW55CisgICAgICAgICMgdWlkLXJlbGF0ZWQgZnVuY3Rpb25zCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBwd2QuZ2V0cHd1aWQsIC0xKQorICAgICAgICAjIHNob3VsZCBiZSBvdXQgb2YgdWlkX3QgcmFuZ2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHB3ZC5nZXRwd3VpZCwgMioqMTI4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgcHdkLmdldHB3dWlkLCAtMioqMTI4KQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQd2RUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHdkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM4ODZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHdkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9wd2QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHdkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjM4ODZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHdkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weTNrd2Fybi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZmQ4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weTNrd2Fybi5weQpAQCAtMCwwICsxLDQyNiBAQAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjaGVja19weTNrX3dhcm5pbmdzLCBDbGVhbkltcG9ydCwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKKworaWYgbm90IHN5cy5weTNrd2FybmluZzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgnJXMgbXVzdCBiZSBydW4gd2l0aCB0aGUgLTMgZmxhZycgJSBfX25hbWVfXykKKwordHJ5OgorICAgIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IF9fd2FybmluZ3JlZ2lzdHJ5X18gYXMgX3JlZ2lzdHJ5CitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZGVmIGNoZWNrX2RlcHJlY2F0ZWRfbW9kdWxlKG1vZHVsZV9uYW1lKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCitlbHNlOgorICAgIHBhc3Rfd2FybmluZ3MgPSBfcmVnaXN0cnkua2V5cygpCisgICAgZGVsIF9yZWdpc3RyeQorICAgIGRlZiBjaGVja19kZXByZWNhdGVkX21vZHVsZShtb2R1bGVfbmFtZSk6CisgICAgICAgICIiIkxvb2t1cCB0aGUgcGFzdCB3YXJuaW5ncyBmb3IgbW9kdWxlIGFscmVhZHkgbG9hZGVkIHVzaW5nCisgICAgICAgIHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKC4uLiwgZGVwcmVjYXRlZD1UcnVlKQorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGFueShtb2R1bGVfbmFtZSBpbiBtc2cgYW5kICcgcmVtb3ZlZCcgaW4gbXNnCisgICAgICAgICAgICAgICAgICAgYW5kIGlzc3ViY2xhc3MoY2xzLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgICAgYW5kICgnIG1vZHVsZScgaW4gbXNnIG9yICcgcGFja2FnZScgaW4gbXNnKQorICAgICAgICAgICAgICAgICAgIGZvciAobXNnLCBjbHMsIGxpbmUpIGluIHBhc3Rfd2FybmluZ3MpCisKK2RlZiByZXNldF9tb2R1bGVfcmVnaXN0cnkobW9kdWxlKToKKyAgICB0cnk6CisgICAgICAgIHJlZ2lzdHJ5ID0gbW9kdWxlLl9fd2FybmluZ3JlZ2lzdHJ5X18KKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByZWdpc3RyeS5jbGVhcigpCisKK2NsYXNzIFRlc3RQeTNLV2FybmluZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydFdhcm5pbmcoc2VsZiwgXywgd2FybmluZywgZXhwZWN0ZWRfbWVzc2FnZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHdhcm5pbmcubWVzc2FnZSksIGV4cGVjdGVkX21lc3NhZ2UpCisKKyAgICBkZWYgYXNzZXJ0Tm9XYXJuaW5nKHNlbGYsIF8sIHJlY29yZGVyKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVjb3JkZXIud2FybmluZ3MpLCAwKQorCisgICAgZGVmIHRlc3RfYmFja3F1b3RlKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICdiYWNrcXVvdGUgbm90IHN1cHBvcnRlZCBpbiAzLng7IHVzZSByZXByKCknCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygoZXhwZWN0ZWQsIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgICAgIGV4ZWMgImAyYCIgaW4ge30KKworICAgIGRlZiB0ZXN0X3BhcmVuX2FyZ19uYW1lcyhzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAncGFyZW50aGVzaXplZCBhcmd1bWVudCBuYW1lcyBhcmUgaW52YWxpZCBpbiAzLngnCisgICAgICAgIGRlZiBjaGVjayhzKToKKyAgICAgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygoZXhwZWN0ZWQsIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgICAgICAgICBleGVjIHMgaW4ge30KKyAgICAgICAgY2hlY2soImRlZiBmKCh4KSk6IHBhc3MiKQorICAgICAgICBjaGVjaygiZGVmIGYoKCgoeCkpKSwgKHkpKTogcGFzcyIpCisgICAgICAgIGNoZWNrKCJkZWYgZigoeCksICgoKHkpKSksIG09MzIpOiBwYXNzIikKKyAgICAgICAgIyBTb21ldGhpbmcgbGlrZSBkZWYgZigoYSwgKGIpKSk6IHBhc3Mgd2lsbCByYWlzZSB0aGUgdHVwbGUKKyAgICAgICAgIyB1bnBhY2tpbmcgd2FybmluZy4KKworICAgIGRlZiB0ZXN0X2ZvcmJpZGRlbl9uYW1lcyhzZWxmKToKKyAgICAgICAgIyBTbyB3ZSBkb24ndCBzY3JldyB1cCBvdXIgZ2xvYmFscworICAgICAgICBkZWYgc2FmZV9leGVjKGV4cHIpOgorICAgICAgICAgICAgZGVmIGYoKiprd2FyZ3MpOiBwYXNzCisgICAgICAgICAgICBleGVjIGV4cHIgaW4geydmJyA6IGZ9CisKKyAgICAgICAgdGVzdHMgPSBbKCJUcnVlIiwgImFzc2lnbm1lbnQgdG8gVHJ1ZSBvciBGYWxzZSBpcyBmb3JiaWRkZW4gaW4gMy54IiksCisgICAgICAgICAgICAgICAgICgiRmFsc2UiLCAiYXNzaWdubWVudCB0byBUcnVlIG9yIEZhbHNlIGlzIGZvcmJpZGRlbiBpbiAzLngiKSwKKyAgICAgICAgICAgICAgICAgKCJub25sb2NhbCIsICJub25sb2NhbCBpcyBhIGtleXdvcmQgaW4gMy54IildCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygoJycsIFN5bnRheFdhcm5pbmcpKSBhcyB3OgorICAgICAgICAgICAgZm9yIGtleXdvcmQsIGV4cGVjdGVkIGluIHRlc3RzOgorICAgICAgICAgICAgICAgIHNhZmVfZXhlYygiezB9ID0gRmFsc2UiLmZvcm1hdChrZXl3b3JkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoTm9uZSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzYWZlX2V4ZWMoIm9iai57MH0gPSBUcnVlIi5mb3JtYXQoa2V5d29yZCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgICAgICBzYWZlX2V4ZWMoImRlZiB7MH0oKTogcGFzcyIuZm9ybWF0KGtleXdvcmQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgICAgICBzYWZlX2V4ZWMoImNsYXNzIHswfTogcGFzcyIuZm9ybWF0KGtleXdvcmQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgICAgICBzYWZlX2V4ZWMoImRlZiBmKHswfT00Myk6IHBhc3MiLmZvcm1hdChrZXl3b3JkKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoTm9uZSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgdy5yZXNldCgpCisKKworICAgIGRlZiB0ZXN0X3R5cGVfaW5lcXVhbGl0eV9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAndHlwZSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54JworICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKGludCA8IHN0ciwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyh0eXBlIDwgb2JqZWN0LCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X29iamVjdF9pbmVxdWFsaXR5X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICdjb21wYXJpbmcgdW5lcXVhbCB0eXBlcyBub3Qgc3VwcG9ydGVkIGluIDMueCcKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhzdHIgPCBbXSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhvYmplY3QoKSA8ICgxLCAyKSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9kaWN0X2luZXF1YWxpdHlfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ2RpY3QgaW5lcXVhbGl0eSBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkIGluIDMueCcKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyh7fSA8IHsyOjN9LCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHt9IDw9IHt9LCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHt9ID4gezI6M30sIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoezI6M30gPj0ge30sIHcsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfY2VsbF9pbmVxdWFsaXR5X2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICdjZWxsIGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54JworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgIHJldHVybiBnCisgICAgICAgIGNlbGwwLCA9IGYoMCkuZnVuY19jbG9zdXJlCisgICAgICAgIGNlbGwxLCA9IGYoMSkuZnVuY19jbG9zdXJlCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoY2VsbDAgPT0gY2VsbDEsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoY2VsbDAgPCBjZWxsMSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9jb2RlX2luZXF1YWxpdHlfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ2NvZGUgaW5lcXVhbGl0eSBjb21wYXJpc29ucyBub3Qgc3VwcG9ydGVkIGluIDMueCcKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBnKHgpOgorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKGYuZnVuY19jb2RlIDwgZy5mdW5jX2NvZGUsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZi5mdW5jX2NvZGUgPD0gZy5mdW5jX2NvZGUsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZi5mdW5jX2NvZGUgPj0gZy5mdW5jX2NvZGUsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZi5mdW5jX2NvZGUgPiBnLmZ1bmNfY29kZSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZF9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAoJ2J1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kICcKKyAgICAgICAgICAgICAgICAgICAgJ29yZGVyIGNvbXBhcmlzb25zIG5vdCBzdXBwb3J0ZWQgaW4gMy54JykKKyAgICAgICAgZnVuYyA9IGV2YWwKKyAgICAgICAgbWV0aCA9IHt9LmdldAorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKGZ1bmMgPCBtZXRoLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKGZ1bmMgPiBtZXRoLCB3LCBleHBlY3RlZCkKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKG1ldGggPD0gZnVuYywgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhtZXRoID49IGZ1bmMsIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZyhtZXRoID09IGZ1bmMsIHcpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZyhtZXRoICE9IGZ1bmMsIHcpCisgICAgICAgICAgICBsYW0gPSBsYW1iZGEgeDogeAorICAgICAgICAgICAgc2VsZi5hc3NlcnROb1dhcm5pbmcobGFtID09IGZ1bmMsIHcpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vV2FybmluZyhsYW0gIT0gZnVuYywgdykKKworICAgIGRlZiB0ZXN0X2ZyYW1lX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHRlbXBsYXRlID0gIiVzIGhhcyBiZWVuIHJlbW92ZWQgaW4gMy54IgorICAgICAgICBmID0gc3lzLl9nZXRmcmFtZSgwKQorICAgICAgICBmb3IgYXR0ciBpbiAoImZfZXhjX3RyYWNlYmFjayIsICJmX2V4Y192YWx1ZSIsICJmX2V4Y190eXBlIik6CisgICAgICAgICAgICBleHBlY3RlZCA9IHRlbXBsYXRlICUgYXR0cgorICAgICAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoZ2V0YXR0cihmLCBhdHRyKSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHNldGF0dHIoZiwgYXR0ciwgTm9uZSksIHcsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfc29ydF9jbXBfYXJnKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICJ0aGUgY21wIGFyZ3VtZW50IGlzIG5vdCBzdXBwb3J0ZWQgaW4gMy54IgorICAgICAgICBsc3QgPSByYW5nZSg1KQorICAgICAgICBjbXAgPSBsYW1iZGEgeCx5OiAtMQorCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcobHN0LnNvcnQoY21wPWNtcCksIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoc29ydGVkKGxzdCwgY21wPWNtcCksIHcsIGV4cGVjdGVkKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcobHN0LnNvcnQoY21wKSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhzb3J0ZWQobHN0LCBjbXApLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3N5c19leGNfY2xlYXIoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ3N5cy5leGNfY2xlYXIoKSBub3Qgc3VwcG9ydGVkIGluIDMueDsgdXNlIGV4Y2VwdCBjbGF1c2VzJworICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHN5cy5leGNfY2xlYXIoKSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9tZXRob2RzX21lbWJlcnMoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ19fbWVtYmVyc19fIGFuZCBfX21ldGhvZHNfXyBub3Qgc3VwcG9ydGVkIGluIDMueCcKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIF9fbWV0aG9kc19fID0gWydhJ10KKyAgICAgICAgICAgIF9fbWVtYmVyc19fID0gWydiJ10KKyAgICAgICAgYyA9IEMoKQorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKGRpcihjKSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9zb2Z0c3BhY2Uoc2VsZik6CisgICAgICAgIGV4cGVjdGVkID0gJ2ZpbGUuc29mdHNwYWNlIG5vdCBzdXBwb3J0ZWQgaW4gMy54JworICAgICAgICB3aXRoIGZpbGUoX19maWxlX18pIGFzIGY6CisgICAgICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhmLnNvZnRzcGFjZSwgdywgZXhwZWN0ZWQpCisgICAgICAgICAgICBkZWYgc2V0KCk6CisgICAgICAgICAgICAgICAgZi5zb2Z0c3BhY2UgPSAwCisgICAgICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhzZXQoKSwgdywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9zbGljZV9tZXRob2RzKHNlbGYpOgorICAgICAgICBjbGFzcyBTcGFtKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIGksIGopOiBwYXNzCisgICAgICAgICAgICBkZWYgX19zZXRzbGljZV9fKHNlbGYsIGksIGosIHdoYXQpOiBwYXNzCisgICAgICAgICAgICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIGksIGopOiBwYXNzCisgICAgICAgIGNsYXNzIEVnZzoKKyAgICAgICAgICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaCk6IHBhc3MKKyAgICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgd2hhdCk6IHBhc3MKKyAgICAgICAgICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgaSwgaik6IHBhc3MKKworICAgICAgICBleHBlY3RlZCA9ICJpbiAzLngsIF9fezB9c2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkOyB1c2UgX197MH1pdGVtX18iCisKKyAgICAgICAgZm9yIG9iaiBpbiAoU3BhbSgpLCBFZ2coKSk6CisgICAgICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKSBhcyB3OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhvYmpbMToyXSwgdywgZXhwZWN0ZWQuZm9ybWF0KCdnZXQnKSkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgICAgICBkZWwgb2JqWzM6NF0KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoTm9uZSwgdywgZXhwZWN0ZWQuZm9ybWF0KCdkZWwnKSkKKyAgICAgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgICAgICBvYmpbNDo1XSA9ICJlZ2dzIgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0V2FybmluZyhOb25lLCB3LCBleHBlY3RlZC5mb3JtYXQoJ3NldCcpKQorCisgICAgZGVmIHRlc3RfdHVwbGVfcGFyYW1ldGVyX3VucGFja2luZyhzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIGluIDMueCIKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKChleHBlY3RlZCwgU3ludGF4V2FybmluZykpOgorICAgICAgICAgICAgZXhlYyAiZGVmIGYoKGEsIGIpKTogcGFzcyIKKworICAgIGRlZiB0ZXN0X2J1ZmZlcihzZWxmKToKKyAgICAgICAgZXhwZWN0ZWQgPSAnYnVmZmVyKCkgbm90IHN1cHBvcnRlZCBpbiAzLngnCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoYnVmZmVyKCdhJyksIHcsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfZmlsZV94cmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBleHBlY3RlZCA9ICgiZi54cmVhZGxpbmVzKCkgbm90IHN1cHBvcnRlZCBpbiAzLngsICIKKyAgICAgICAgICAgICAgICAgICAgInRyeSAnZm9yIGxpbmUgaW4gZicgaW5zdGVhZCIpCisgICAgICAgIHdpdGggZmlsZShfX2ZpbGVfXykgYXMgZjoKKyAgICAgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKGYueHJlYWRsaW5lcygpLCB3LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2hhc2hfaW5oZXJpdGFuY2Uoc2VsZik6CisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICAjIFdpdGggb2JqZWN0IGFzIHRoZSBiYXNlIGNsYXNzCisgICAgICAgICAgICBjbGFzcyBXYXJuT25seUNtcChvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDApCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIGNsYXNzIFdhcm5Pbmx5RXEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoTm9uZSwgdywKKyAgICAgICAgICAgICAgICAgIk92ZXJyaWRpbmcgX19lcV9fIGJsb2NrcyBpbmhlcml0YW5jZSBvZiBfX2hhc2hfXyBpbiAzLngiKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBjbGFzcyBXYXJuQ21wQW5kRXEob2JqZWN0KToKKyAgICAgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6IHBhc3MKKyAgICAgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoTm9uZSwgdywKKyAgICAgICAgICAgICAgICAgIk92ZXJyaWRpbmcgX19lcV9fIGJsb2NrcyBpbmhlcml0YW5jZSBvZiBfX2hhc2hfXyBpbiAzLngiKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBjbGFzcyBOb1dhcm5pbmdPbmx5SGFzaChvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDApCisgICAgICAgICAgICAjIFdpdGggYW4gaW50ZXJtZWRpYXRlIGNsYXNzIGluIHRoZSBoZWlyYXJjaHkKKyAgICAgICAgICAgIGNsYXNzIERlZmluZXNBbGxUaHJlZShvYmplY3QpOgorICAgICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOiBwYXNzCisgICAgICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBjbGFzcyBXYXJuT25seUNtcChEZWZpbmVzQWxsVGhyZWUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDApCisgICAgICAgICAgICB3LnJlc2V0KCkKKyAgICAgICAgICAgIGNsYXNzIFdhcm5Pbmx5RXEoRGVmaW5lc0FsbFRocmVlKToKKyAgICAgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoTm9uZSwgdywKKyAgICAgICAgICAgICAgICAgIk92ZXJyaWRpbmcgX19lcV9fIGJsb2NrcyBpbmhlcml0YW5jZSBvZiBfX2hhc2hfXyBpbiAzLngiKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBjbGFzcyBXYXJuQ21wQW5kRXEoRGVmaW5lc0FsbFRocmVlKToKKyAgICAgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6IHBhc3MKKyAgICAgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoTm9uZSwgdywKKyAgICAgICAgICAgICAgICAgIk92ZXJyaWRpbmcgX19lcV9fIGJsb2NrcyBpbmhlcml0YW5jZSBvZiBfX2hhc2hfXyBpbiAzLngiKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBjbGFzcyBOb1dhcm5pbmdPbmx5SGFzaChEZWZpbmVzQWxsVGhyZWUpOgorICAgICAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKTogcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDApCisKKyAgICBkZWYgdGVzdF9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgaXNDYWxsYWJsZSwgc2VxdWVuY2VJbmNsdWRlcworCisgICAgICAgIGNhbGxhYmxlX3dhcm4gPSAoIm9wZXJhdG9yLmlzQ2FsbGFibGUoKSBpcyBub3Qgc3VwcG9ydGVkIGluIDMueC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgaGFzYXR0cihvYmosICdfX2NhbGxfXycpLiIpCisgICAgICAgIHNlcV93YXJuID0gKCJvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKCkgaXMgbm90IHN1cHBvcnRlZCAiCisgICAgICAgICAgICAgICAgICAgICJpbiAzLnguIFVzZSBvcGVyYXRvci5jb250YWlucygpLiIpCisgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydFdhcm5pbmcoaXNDYWxsYWJsZShzZWxmKSwgdywgY2FsbGFibGVfd2FybikKKyAgICAgICAgICAgIHcucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRXYXJuaW5nKHNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoMyksIDIpLCB3LCBzZXFfd2FybikKKworCitjbGFzcyBUZXN0U3RkbGliUmVtb3ZhbHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyB0ZXN0LnRlc3RhbGwgbm90IHRlc3RlZCBhcyBpdCBleGVjdXRlcyBhbGwgdW5pdCB0ZXN0cyBhcyBhbgorICAgICMgaW1wb3J0IHNpZGUtZWZmZWN0LgorICAgIGFsbF9wbGF0Zm9ybXMgPSAoJ2F1ZGlvZGV2JywgJ2ltcHV0aWwnLCAnbXV0ZXgnLCAndXNlcicsICduZXcnLCAncmV4ZWMnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ0Jhc3Rpb24nLCAnY29tcGlsZXInLCAnZGlyY2FjaGUnLCAnbWltZXRvb2xzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdmcGZvcm1hdCcsICdpaG9va3MnLCAnbWhsaWInLCAnc3RhdHZmcycsICdodG1sbGliJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzZ21sbGliJywgJ3JmYzgyMicsICdzdW5hdWRpbycpCisgICAgaW5jbHVzaXZlX3BsYXRmb3JtcyA9IHsnaXJpeCcgOiAoJ3B1cmUnLCAnQUwnLCAnYWwnLCAnQ0QnLCAnY2QnLCAnY2RkYicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NkcGxheWVyJywgJ0NMJywgJ2NsJywgJ0RFVklDRScsICdHTCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dsJywgJ0VSUk5PJywgJ0ZJTEUnLCAnRkwnLCAnZmxwJywgJ2ZsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm0nLCAnR0VUJywgJ0dMV1MnLCAnaW1nZmlsZScsICdJTicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lPQ1RMJywgJ2pwZWcnLCAncGFuZWwnLCAncGFuZWxwYXJzZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZWFkY2QnLCAnU1YnLCAndG9yZ2InLCAnV0FJVCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnZGFyd2luJyA6ICgnYXV0b0dJTCcsICdDYXJib24nLCAnT1NBVGVybWlub2xvZ3knLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaWNnbHVlJywgJ05hdicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgTWFjT1Mgc2hvdWxkIChhbmQgZG9lcykgZ2l2ZSBhIFB5M2tXYXJuaW5nLCBidXQgb25lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGVhcmxpZXIgdGVzdHMgYWxyZWFkeSBpbXBvcnRzIHRoZSBNYWNPUyBleHRlbnNpb24gd2hpY2ggY2F1c2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhpcyB0ZXN0IHRvIGZhaWwuIERpc2FibGluZyB0aGUgdGVzdCBmb3IgJ01hY09TJyBhdm9pZHMgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNwdXJpb3VzIHRlc3QgZmFpbHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIydNYWNPUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZXBhY2snLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWV0b29scycsICdhZXR5cGVzJywgJ2FwcGxlc2luZ2xlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxldHJhd21haW4nLCAnYXBwbGV0cnVubmVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZ3ZlbXVsYXRvcicsICdiZ2VubG9jYXRpb25zJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vhc3lEaWFsb2dzJywgJ21hY2Vycm9ycycsICdtYWNvc3Rvb2xzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZpbmRlcnRvb2xzJywgJ0ZyYW1lV29yaycsICdpYycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZW5zdWl0ZW1vZHVsZScsICdpY29wZW4nLCAnbWFjcmVzb3VyY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTWluaUFFRnJhbWUnLCAncGltcCcsICdQaXhNYXBXcmFwcGVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlcm1pbmFsY29tbWFuZCcsICd2aWRlb3JlYWRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfYnVpbHRpblN1aXRlcycsICdDb2RlV2FycmlvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFeHBsb3JlcicsICdGaW5kZXInLCAnTmV0c2NhcGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3RkU3VpdGVzJywgJ1N5c3RlbUV2ZW50cycsICdUZXJtaW5hbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjZm1maWxlJywgJ2J1bmRsZWJ1aWxkZXInLCAnYnVpbGR0b29scycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb2xvclBpY2tlcicsICdBdWRpb19tYWMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdW5vczUnIDogKCdzdW5hdWRpb2RldicsICdTVU5BVURJT0RFVicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgb3B0aW9uYWxfbW9kdWxlcyA9ICgnYnNkZGIxODUnLCAnQ2FudmFzJywgJ2RsJywgJ2xpbnV4YXVkaW9kZXYnLCAnaW1hZ2VvcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAnc3YnLCAnYnNkZGInLCAnZGJoYXNoJykKKworICAgIGRlZiBjaGVja19yZW1vdmFsKHNlbGYsIG1vZHVsZV9uYW1lLCBvcHRpb25hbD1GYWxzZSk6CisgICAgICAgICIiIk1ha2Ugc3VyZSB0aGUgc3BlY2lmaWVkIG1vZHVsZSwgd2hlbiBpbXBvcnRlZCwgcmFpc2VzIGEKKyAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nIGFuZCBzcGVjaWZpZXMgaXRzZWxmIGluIHRoZSBtZXNzYWdlLiIiIgorICAgICAgICB3aXRoIENsZWFuSW1wb3J0KG1vZHVsZV9uYW1lKSwgd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsICIuKyAobW9kdWxlfHBhY2thZ2UpIC4rIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBfX25hbWVfXykKKyAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsICIuKyByZW1vdmVkIC4rIChtb2R1bGV8cGFja2FnZSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCBfX25hbWVfXykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZHVsZV9uYW1lLCBsZXZlbD0wKQorICAgICAgICAgICAgZXhjZXB0IERlcHJlY2F0aW9uV2FybmluZyBhcyBleGM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGVfbmFtZSwgZXhjLmFyZ3NbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgd2FybmluZyBkaWRuJ3QgY29udGFpbiBtb2R1bGUgbmFtZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbW9kdWxlX25hbWUpCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgbm90IG9wdGlvbmFsOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vbi1vcHRpb25hbCBtb2R1bGUgezB9IHJhaXNlZCBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSW1wb3J0RXJyb3IuIi5mb3JtYXQobW9kdWxlX25hbWUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEZvciBleHRlbnNpb24gbW9kdWxlcywgY2hlY2sgdGhlIF9fd2FybmluZ3JlZ2lzdHJ5X18uCisgICAgICAgICAgICAgICAgIyBUaGV5IHdvbid0IHJlcnVuIHRoZWlyIGluaXQgY29kZSBldmVuIHdpdGggQ2xlYW5JbXBvcnQuCisgICAgICAgICAgICAgICAgaWYgbm90IGNoZWNrX2RlcHJlY2F0ZWRfbW9kdWxlKG1vZHVsZV9uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJEZXByZWNhdGlvbldhcm5pbmcgbm90IHJhaXNlZCBmb3IgezB9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZvcm1hdChtb2R1bGVfbmFtZSkpCisKKyAgICBkZWYgdGVzdF9wbGF0Zm9ybV9pbmRlcGVuZGVudF9yZW1vdmFscyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgbW9kdWxlcyB0aGF0IGFyZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3JtcyByYWlzZQorICAgICAgICAjIHRoZSBwcm9wZXIgRGVwcmVjYXRpb25XYXJuaW5nLgorICAgICAgICBmb3IgbW9kdWxlX25hbWUgaW4gc2VsZi5hbGxfcGxhdGZvcm1zOgorICAgICAgICAgICAgc2VsZi5jaGVja19yZW1vdmFsKG1vZHVsZV9uYW1lKQorCisgICAgZGVmIHRlc3RfcGxhdGZvcm1fc3BlY2lmaWNfcmVtb3ZhbHMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGUgcmVtb3ZhbCBvZiBwbGF0Zm9ybS1zcGVjaWZpYyBtb2R1bGVzLgorICAgICAgICBmb3IgbW9kdWxlX25hbWUgaW4gc2VsZi5pbmNsdXNpdmVfcGxhdGZvcm1zLmdldChzeXMucGxhdGZvcm0sIFtdKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcmVtb3ZhbChtb2R1bGVfbmFtZSwgb3B0aW9uYWw9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X29wdGlvbmFsX21vZHVsZV9yZW1vdmFscyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSByZW1vdmFsIG9mIG1vZHVsZXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBidWlsdC4KKyAgICAgICAgZm9yIG1vZHVsZV9uYW1lIGluIHNlbGYub3B0aW9uYWxfbW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcmVtb3ZhbChtb2R1bGVfbmFtZSwgb3B0aW9uYWw9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X29zX3BhdGhfd2FsayhzZWxmKToKKyAgICAgICAgbXNnID0gIkluIDMueCwgb3MucGF0aC53YWxrIGlzIHJlbW92ZWQgaW4gZmF2b3Igb2Ygb3Mud2Fsay4iCisgICAgICAgIGRlZiBkdW1ibyh3aGVyZSwgbmFtZXMsIGFyZ3MpOiBwYXNzCisgICAgICAgIGZvciBwYXRoX21vZCBpbiAoIm50cGF0aCIsICJtYWNwYXRoIiwgIm9zMmVteHBhdGgiLCAicG9zaXhwYXRoIik6CisgICAgICAgICAgICBtb2QgPSBfX2ltcG9ydF9fKHBhdGhfbW9kKQorICAgICAgICAgICAgcmVzZXRfbW9kdWxlX3JlZ2lzdHJ5KG1vZCkKKyAgICAgICAgICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygpIGFzIHc6CisgICAgICAgICAgICAgICAgbW9kLndhbGsoImNyYXNoZXJzIiwgZHVtYm8sIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Lm1lc3NhZ2UpLCBtc2cpCisKKyAgICBkZWYgdGVzdF9yZWR1Y2VfbW92ZShzZWxmKToKKyAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgYWRkCisgICAgICAgICMgcmVkdWNlIHRlc3RzIG1heSBoYXZlIGFscmVhZHkgdHJpZ2dlcmVkIHRoaXMgd2FybmluZworICAgICAgICByZXNldF9tb2R1bGVfcmVnaXN0cnkodW5pdHRlc3QuY2FzZSkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgInJlZHVjZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEZXByZWNhdGlvbldhcm5pbmcsIHJlZHVjZSwgYWRkLCByYW5nZSgxMCkpCisKKyAgICBkZWYgdGVzdF9tdXRhYmxlc3RyaW5nX3JlbW92YWwoc2VsZik6CisgICAgICAgICMgVXNlclN0cmluZy5NdXRhYmxlU3RyaW5nIGhhcyBiZWVuIHJlbW92ZWQgaW4gMy4wLgorICAgICAgICBpbXBvcnQgVXNlclN0cmluZworICAgICAgICAjIFVzZXJTdHJpbmcgdGVzdHMgbWF5IGhhdmUgYWxyZWFkeSB0cmlnZ2VyZWQgdGhpcyB3YXJuaW5nCisgICAgICAgIHJlc2V0X21vZHVsZV9yZWdpc3RyeShVc2VyU3RyaW5nKQorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCAiLipNdXRhYmxlU3RyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERlcHJlY2F0aW9uV2FybmluZywgVXNlclN0cmluZy5NdXRhYmxlU3RyaW5nKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdFB5M0tXYXJuaW5ncywKKyAgICAgICAgICAgICAgICAgVGVzdFN0ZGxpYlJlbW92YWxzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weTNrd2Fybi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weTNrd2Fybi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0MjBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weTNrd2Fybi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weTNrd2Fybi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0MjBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5M2t3YXJuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlfY29tcGlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE5ZGEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlfY29tcGlsZS5weQpAQCAtMCwwICsxLDU0IEBACitpbXBvcnQgaW1wCitpbXBvcnQgb3MKK2ltcG9ydCBweV9jb21waWxlCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBQeUNvbXBpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGlyZWN0b3J5ID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHNlbGYuc291cmNlX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5kaXJlY3RvcnksICdfdGVzdC5weScpCisgICAgICAgIHNlbGYucHljX3BhdGggPSBzZWxmLnNvdXJjZV9wYXRoICsgJ2MnCisgICAgICAgIHNlbGYuY3dkX2RyaXZlID0gb3MucGF0aC5zcGxpdGRyaXZlKG9zLmdldGN3ZCgpKVswXQorICAgICAgICAjIEluIHRoZXNlIHRlc3RzIHdlIGNvbXB1dGUgcmVsYXRpdmUgcGF0aHMuICBXaGVuIHVzaW5nIFdpbmRvd3MsIHRoZQorICAgICAgICAjIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgcGF0aCBhbmQgdGhlICdzZWxmLnNvdXJjZV9wYXRoJyBtaWdodCBiZQorICAgICAgICAjIG9uIGRpZmZlcmVudCBkcml2ZXMuICBUaGVyZWZvcmUgd2UgbmVlZCB0byBzd2l0Y2ggdG8gdGhlIGRyaXZlIHdoZXJlCisgICAgICAgICMgdGhlIHRlbXBvcmFyeSBzb3VyY2UgZmlsZSBsaXZlcy4KKyAgICAgICAgZHJpdmUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUoc2VsZi5zb3VyY2VfcGF0aClbMF0KKyAgICAgICAgaWYgZHJpdmU6CisgICAgICAgICAgICBvcy5jaGRpcihkcml2ZSkKKworICAgICAgICB3aXRoIG9wZW4oc2VsZi5zb3VyY2VfcGF0aCwgJ3cnKSBhcyBmaWxlOgorICAgICAgICAgICAgZmlsZS53cml0ZSgneCA9IDEyM1xuJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2h1dGlsLnJtdHJlZShzZWxmLmRpcmVjdG9yeSkKKyAgICAgICAgaWYgc2VsZi5jd2RfZHJpdmU6CisgICAgICAgICAgICBvcy5jaGRpcihzZWxmLmN3ZF9kcml2ZSkKKworICAgIGRlZiB0ZXN0X2Fic29sdXRlX3BhdGgoc2VsZik6CisgICAgICAgIHB5X2NvbXBpbGUuY29tcGlsZShzZWxmLnNvdXJjZV9wYXRoLCBzZWxmLnB5Y19wYXRoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi5weWNfcGF0aCkpCisKKyAgICBkZWYgdGVzdF9jd2Qoc2VsZik6CisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHNlbGYuZGlyZWN0b3J5KQorICAgICAgICBweV9jb21waWxlLmNvbXBpbGUob3MucGF0aC5iYXNlbmFtZShzZWxmLnNvdXJjZV9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5weWNfcGF0aCkpCisgICAgICAgIG9zLmNoZGlyKGN3ZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYucHljX3BhdGgpKQorCisgICAgZGVmIHRlc3RfcmVsYXRpdmVfcGF0aChzZWxmKToKKyAgICAgICAgcHlfY29tcGlsZS5jb21waWxlKG9zLnBhdGgucmVscGF0aChzZWxmLnNvdXJjZV9wYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGgucmVscGF0aChzZWxmLnB5Y19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNlbGYucHljX3BhdGgpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChQeUNvbXBpbGVUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlfY29tcGlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM5MDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlfY29tcGlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlfY29tcGlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weV9jb21waWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzM5MDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlfY29tcGlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHljbGJyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZGM1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTAsMCArMSwyMDIgQEAKKycnJworICAgVGVzdCBjYXNlcyBmb3IgcHljbGJyLnB5CisgICBOaWNrIE1hdGhld3NvbgorJycnCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKK2ltcG9ydCBzeXMKK2Zyb20gdHlwZXMgaW1wb3J0IENsYXNzVHlwZSwgRnVuY3Rpb25UeXBlLCBNZXRob2RUeXBlLCBCdWlsdGluRnVuY3Rpb25UeXBlCitpbXBvcnQgcHljbGJyCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0Q2FzZQorCitTdGF0aWNNZXRob2RUeXBlID0gdHlwZShzdGF0aWNtZXRob2QobGFtYmRhOiBOb25lKSkKK0NsYXNzTWV0aG9kVHlwZSA9IHR5cGUoY2xhc3NtZXRob2QobGFtYmRhIGM6IE5vbmUpKQorCisjIFNpbGVuY2UgUHkzayB3YXJuaW5nCitpbXBvcnRfbW9kdWxlKCdjb21tYW5kcycsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworIyBUaGlzIG5leHQgbGluZSB0cmlnZ2VycyBhbiBlcnJvciBvbiBvbGQgdmVyc2lvbnMgb2YgcHljbGJyLgorZnJvbSBjb21tYW5kcyBpbXBvcnQgZ2V0c3RhdHVzCisKKyMgSGVyZSB3ZSB0ZXN0IHRoZSBweXRob24gY2xhc3MgYnJvd3NlciBjb2RlLgorIworIyBUaGUgbWFpbiBmdW5jdGlvbiBpbiB0aGlzIHN1aXRlLCAndGVzdE1vZHVsZScsIGNvbXBhcmVzIHRoZSBvdXRwdXQKKyMgb2YgcHljbGJyIHdpdGggdGhlIGludHJvc3BlY3RlZCBtZW1iZXJzIG9mIGEgbW9kdWxlLiAgQmVjYXVzZSBweWNsYnIKKyMgaXMgaW1wZXJmZWN0IChhcyBkZXNpZ25lZCksIHRlc3RNb2R1bGUgaXMgY2FsbGVkIHdpdGggYSBzZXQgb2YKKyMgbWVtYmVycyB0byBpZ25vcmUuCisKK2NsYXNzIFB5Y2xiclRlc3QoVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydExpc3RFcShzZWxmLCBsMSwgbDIsIGlnbm9yZSk6CisgICAgICAgICcnJyBzdWNjZWVkIGlmZiB7bDF9IC0ge2lnbm9yZX0gPT0ge2wyfSAtIHtpZ25vcmV9ICcnJworICAgICAgICBtaXNzaW5nID0gKHNldChsMSkgXiBzZXQobDIpKSAtIHNldChpZ25vcmUpCisgICAgICAgIGlmIG1pc3Npbmc6CisgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJsMT0lclxubDI9JXJcbmlnbm9yZT0lciIgJSAobDEsIGwyLCBpZ25vcmUpCisgICAgICAgICAgICBzZWxmLmZhaWwoIiVyIG1pc3NpbmciICUgbWlzc2luZy5wb3AoKSkKKworICAgIGRlZiBhc3NlcnRIYXNhdHRyKHNlbGYsIG9iaiwgYXR0ciwgaWdub3JlKToKKyAgICAgICAgJycnIHN1Y2NlZWQgaWZmIGhhc2F0dHIob2JqLGF0dHIpIG9yIGF0dHIgaW4gaWdub3JlLiAnJycKKyAgICAgICAgaWYgYXR0ciBpbiBpZ25vcmU6IHJldHVybgorICAgICAgICBpZiBub3QgaGFzYXR0cihvYmosIGF0dHIpOiBwcmludCAiPz8/IiwgYXR0cgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihvYmosIGF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkIGhhc2F0dHIoJXIsICVyKScgJSAob2JqLCBhdHRyKSkKKworCisgICAgZGVmIGFzc2VydEhhc2tleShzZWxmLCBvYmosIGtleSwgaWdub3JlKToKKyAgICAgICAgJycnIHN1Y2NlZWQgaWZmIGtleSBpbiBvYmogb3Iga2V5IGluIGlnbm9yZS4gJycnCisgICAgICAgIGlmIGtleSBpbiBpZ25vcmU6IHJldHVybgorICAgICAgICBpZiBrZXkgbm90IGluIG9iajoKKyAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIioqKiIsIGtleQorICAgICAgICBzZWxmLmFzc2VydEluKGtleSwgb2JqKQorCisgICAgZGVmIGFzc2VydEVxdWFsc09ySWdub3JlZChzZWxmLCBhLCBiLCBpZ25vcmUpOgorICAgICAgICAnJycgc3VjY2VlZCBpZmYgYSA9PSBiIG9yIGEgaW4gaWdub3JlIG9yIGIgaW4gaWdub3JlICcnJworICAgICAgICBpZiBhIG5vdCBpbiBpZ25vcmUgYW5kIGIgbm90IGluIGlnbm9yZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYikKKworICAgIGRlZiBjaGVja01vZHVsZShzZWxmLCBtb2R1bGVOYW1lLCBtb2R1bGU9Tm9uZSwgaWdub3JlPSgpKToKKyAgICAgICAgJycnIHN1Y2NlZWQgaWZmIHB5Y2xici5yZWFkbW9kdWxlX2V4KG1vZHVsZW5hbWUpIGNvcnJlc3BvbmRzCisgICAgICAgICAgICB0byB0aGUgYWN0dWFsIG1vZHVsZSBvYmplY3QsIG1vZHVsZS4gIEFueSBpZGVudGlmaWVycyBpbgorICAgICAgICAgICAgaWdub3JlIGFyZSBpZ25vcmVkLiAgIElmIG5vIG1vZHVsZSBpcyBwcm92aWRlZCwgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICBtb2R1bGUgaXMgbG9hZGVkIHdpdGggX19pbXBvcnRfXy4nJycKKworICAgICAgICBpZiBtb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgICMgSW1wb3J0IGl0LgorICAgICAgICAgICAgIyAoJzxzaWxseT4nIGlzIHRvIHdvcmsgYXJvdW5kIGFuIEFQSSBzaWxsaW5lc3MgaW4gX19pbXBvcnRfXykKKyAgICAgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18obW9kdWxlTmFtZSwgZ2xvYmFscygpLCB7fSwgWyc8c2lsbHk+J10pCisKKyAgICAgICAgZGljdCA9IHB5Y2xici5yZWFkbW9kdWxlX2V4KG1vZHVsZU5hbWUpCisKKyAgICAgICAgZGVmIGlzbWV0aG9kKG9jbGFzcywgb2JqLCBuYW1lKToKKyAgICAgICAgICAgIGNsYXNzZGljdCA9IG9jbGFzcy5fX2RpY3RfXworICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIEZ1bmN0aW9uVHlwZSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoY2xhc3NkaWN0W25hbWVdLCBTdGF0aWNNZXRob2RUeXBlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIG5vdCAgaXNpbnN0YW5jZShvYmosIE1ldGhvZFR5cGUpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBvYmouaW1fc2VsZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdCBpc2luc3RhbmNlKGNsYXNzZGljdFtuYW1lXSwgQ2xhc3NNZXRob2RUeXBlKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgb2JqLmltX3NlbGYgaXMgbm90IG9jbGFzcyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjbGFzc2RpY3RbbmFtZV0sIEZ1bmN0aW9uVHlwZSk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAgICAgb2JqbmFtZSA9IG9iai5fX25hbWVfXworICAgICAgICAgICAgaWYgb2JqbmFtZS5zdGFydHN3aXRoKCJfXyIpIGFuZCBub3Qgb2JqbmFtZS5lbmRzd2l0aCgiX18iKToKKyAgICAgICAgICAgICAgICBvYmpuYW1lID0gIl8lcyVzIiAlIChvYmouaW1fY2xhc3MuX19uYW1lX18sIG9iam5hbWUpCisgICAgICAgICAgICByZXR1cm4gb2JqbmFtZSA9PSBuYW1lCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHRvcGxldmVsIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBhcmUgdGhlIHNhbWUuCisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiBuYW1lIGluIGlnbm9yZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRIYXNhdHRyKG1vZHVsZSwgbmFtZSwgaWdub3JlKQorICAgICAgICAgICAgcHlfaXRlbSA9IGdldGF0dHIobW9kdWxlLCBuYW1lKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgcHljbGJyLkZ1bmN0aW9uKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocHlfaXRlbSwgKEZ1bmN0aW9uVHlwZSwgQnVpbHRpbkZ1bmN0aW9uVHlwZSkpCisgICAgICAgICAgICAgICAgaWYgcHlfaXRlbS5fX21vZHVsZV9fICE9IG1vZHVsZU5hbWU6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgIyBza2lwIGZ1bmN0aW9ucyB0aGF0IGNhbWUgZnJvbSBzb21ld2hlcmUgZWxzZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlfaXRlbS5fX21vZHVsZV9fLCB2YWx1ZS5tb2R1bGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShweV9pdGVtLCAoQ2xhc3NUeXBlLCB0eXBlKSkKKyAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIHNraXAgY2xhc3NlcyB0aGF0IGNhbWUgZnJvbSBzb21ld2hlcmUgZWxzZQorCisgICAgICAgICAgICAgICAgcmVhbF9iYXNlcyA9IFtiYXNlLl9fbmFtZV9fIGZvciBiYXNlIGluIHB5X2l0ZW0uX19iYXNlc19fXQorICAgICAgICAgICAgICAgIHB5Y2xicl9iYXNlcyA9IFsgZ2V0YXR0cihiYXNlLCAnbmFtZScsIGJhc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYmFzZSBpbiB2YWx1ZS5zdXBlciBdCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGlzdEVxKHJlYWxfYmFzZXMsIHB5Y2xicl9iYXNlcywgaWdub3JlKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiY2xhc3M9JXMiICUgcHlfaXRlbQorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgICAgICAgICAgYWN0dWFsTWV0aG9kcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIG0gaW4gcHlfaXRlbS5fX2RpY3RfXy5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGlzbWV0aG9kKHB5X2l0ZW0sIGdldGF0dHIocHlfaXRlbSwgbSksIG0pOgorICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsTWV0aG9kcy5hcHBlbmQobSkKKyAgICAgICAgICAgICAgICBmb3VuZE1ldGhvZHMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBtIGluIHZhbHVlLm1ldGhvZHMua2V5cygpOgorICAgICAgICAgICAgICAgICAgICBpZiBtWzoyXSA9PSAnX18nIGFuZCBtWy0yOl0gIT0gJ19fJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTWV0aG9kcy5hcHBlbmQoJ18nK25hbWUrbSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kTWV0aG9kcy5hcHBlbmQobSkKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXEoZm91bmRNZXRob2RzLCBhY3R1YWxNZXRob2RzLCBpZ25vcmUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlfaXRlbS5fX21vZHVsZV9fLCB2YWx1ZS5tb2R1bGUpCisKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHNPcklnbm9yZWQocHlfaXRlbS5fX25hbWVfXywgdmFsdWUubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlKQorICAgICAgICAgICAgICAgICAgICAjIGNhbid0IGNoZWNrIGZpbGUgb3IgbGluZW5vCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICJjbGFzcz0lcyIgJSBweV9pdGVtCisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICAgICAgIyBOb3cgY2hlY2sgZm9yIG1pc3Npbmcgc3R1ZmYuCisgICAgICAgIGRlZiBkZWZpbmVkX2luKGl0ZW0sIG1vZHVsZSk6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sIENsYXNzVHlwZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uX19tb2R1bGVfXyA9PSBtb2R1bGUuX19uYW1lX18KKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSwgRnVuY3Rpb25UeXBlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5mdW5jX2dsb2JhbHMgaXMgbW9kdWxlLl9fZGljdF9fCisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZm9yIG5hbWUgaW4gZGlyKG1vZHVsZSk6CisgICAgICAgICAgICBpdGVtID0gZ2V0YXR0cihtb2R1bGUsIG5hbWUpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sICAoQ2xhc3NUeXBlLCBGdW5jdGlvblR5cGUpKToKKyAgICAgICAgICAgICAgICBpZiBkZWZpbmVkX2luKGl0ZW0sIG1vZHVsZSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SGFza2V5KGRpY3QsIG5hbWUsIGlnbm9yZSkKKworICAgIGRlZiB0ZXN0X2Vhc3koc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tNb2R1bGUoJ3B5Y2xicicpCisgICAgICAgIHNlbGYuY2hlY2tNb2R1bGUoJ2RvY3Rlc3QnLCBpZ25vcmU9KCJEb2NUZXN0Q2FzZSIsKSkKKyAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICByZmM4MjIgPSBpbXBvcnRfbW9kdWxlKCdyZmM4MjInLCBkZXByZWNhdGVkPVRydWUpCisgICAgICAgIHNlbGYuY2hlY2tNb2R1bGUoJ3JmYzgyMicsIHJmYzgyMikKKyAgICAgICAgc2VsZi5jaGVja01vZHVsZSgnZGlmZmxpYicpCisKKyAgICBkZWYgdGVzdF9kZWNvcmF0b3JzKHNlbGYpOgorICAgICAgICAjIFhYWDogU2VlIGNvbW1lbnQgaW4gcHljbGJyX2lucHV0LnB5IGZvciBhIHRlc3QgdGhhdCB3b3VsZCBmYWlsCisgICAgICAgICMgICAgICBpZiBpdCB3ZXJlIG5vdCBjb21tZW50ZWQgb3V0LgorICAgICAgICAjCisgICAgICAgIHNlbGYuY2hlY2tNb2R1bGUoJ3Rlc3QucHljbGJyX2lucHV0JykKKworICAgIGRlZiB0ZXN0X290aGVycyhzZWxmKToKKyAgICAgICAgY20gPSBzZWxmLmNoZWNrTW9kdWxlCisKKyAgICAgICAgIyBUaGVzZSB3ZXJlIG9uY2UgYWJvdXQgdGhlIDEwIGxvbmdlc3QgbW9kdWxlcworICAgICAgICBjbSgncmFuZG9tJywgaWdub3JlPSgnUmFuZG9tJywpKSAgIyBmcm9tIF9yYW5kb20gaW1wb3J0IFJhbmRvbSBhcyBDb3JlR2VuZXJhdG9yCisgICAgICAgIGNtKCdjZ2knLCBpZ25vcmU9KCdsb2cnLCkpICAgICAgIyBzZXQgd2l0aCA9IGluIG1vZHVsZQorICAgICAgICBjbSgndXJsbGliJywgaWdub3JlPSgnX0NGTnVtYmVyVG9JbnQzMicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ1N0cmluZ0Zyb21DRlN0cmluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfQ0ZTZXR1cCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRwcm94aWVzX3JlZ2lzdHJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Byb3h5X2J5cGFzc19yZWdpc3RyeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwcm94eV9ieXBhc3NfbWFjb3N4X3N5c2NvbmYnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3Blbl9odHRwcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRwcm94aWVzX21hY29zeF9zeXNjb25mJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dldHByb3hpZXNfaW50ZXJuZXRjb25maWcnLCkpICMgbm90IG9uIGFsbCBwbGF0Zm9ybXMKKyAgICAgICAgY20oJ3BpY2tsZScpCisgICAgICAgIGNtKCdhaWZjJywgaWdub3JlPSgnb3BlbmZwJywpKSAgIyBzZXQgd2l0aCA9IGluIG1vZHVsZQorICAgICAgICBjbSgnQ29va2llJykKKyAgICAgICAgY20oJ3NyZV9wYXJzZScsIGlnbm9yZT0oJ2R1bXAnLCkpICMgZnJvbSBzcmVfY29uc3RhbnRzIGltcG9ydCAqCisgICAgICAgIGNtKCdwZGInKQorICAgICAgICBjbSgncHlkb2MnKQorCisgICAgICAgICMgVGVzdHMgZm9yIG1vZHVsZXMgaW5zaWRlIHBhY2thZ2VzCisgICAgICAgIGNtKCdlbWFpbC5wYXJzZXInKQorICAgICAgICBjbSgndGVzdC50ZXN0X3B5Y2xicicpCisKKyAgICBkZWYgdGVzdF9pc3N1ZV8xNDc5OChzZWxmKToKKyAgICAgICAgIyB0ZXN0IEltcG9ydEVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZSBmaXJzdCBwYXJ0IG9mIGEgZG90dGVkIG5hbWUgaXMKKyAgICAgICAgIyBub3QgYSBwYWNrYWdlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBweWNsYnIucmVhZG1vZHVsZV9leCwgJ2FzeW5jb3JlLmZvbycpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChQeWNsYnJUZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5Y2xici5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWNsYnIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDI2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWNsYnIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5Y2xici5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWNsYnIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDI2MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWNsYnIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlkb2MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyZDZkYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5CkBAIC0wLDAgKzEsNDIzIEBACitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBkaWZmbGliCitpbXBvcnQgX19idWlsdGluX18KK2ltcG9ydCByZQoraW1wb3J0IHB5ZG9jCitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IGtleXdvcmQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHhtbC5ldHJlZQoraW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCitmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKAorICAgIFRFU1RGTiwgcm10cmVlLCByZWFwX2NoaWxkcmVuLCBjYXB0dXJlZF9zdGRvdXQpCisKK2Zyb20gdGVzdCBpbXBvcnQgcHlkb2NfbW9kCisKK2lmIHRlc3QudGVzdF9zdXBwb3J0LkhBVkVfRE9DU1RSSU5HUzoKKyAgICBleHBlY3RlZF9kYXRhX2RvY3N0cmluZ3MgPSAoCisgICAgICAgICdkaWN0aW9uYXJ5IGZvciBpbnN0YW5jZSB2YXJpYWJsZXMgKGlmIGRlZmluZWQpJywKKyAgICAgICAgJ2xpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSBvYmplY3QgKGlmIGRlZmluZWQpJywKKyAgICAgICAgKQorZWxzZToKKyAgICBleHBlY3RlZF9kYXRhX2RvY3N0cmluZ3MgPSAoJycsICcnKQorCitleHBlY3RlZF90ZXh0X3BhdHRlcm4gPSBcCisiIiIKK05BTUUKKyAgICB0ZXN0LnB5ZG9jX21vZCAtIFRoaXMgaXMgYSB0ZXN0IG1vZHVsZSBmb3IgdGVzdF9weWRvYworCitGSUxFCisgICAgJXMKKyVzCitDTEFTU0VTCisgICAgX19idWlsdGluX18ub2JqZWN0CisgICAgICAgIEIKKyAgICBBCitceDIwXHgyMFx4MjBceDIwCisgICAgY2xhc3MgQQorICAgICB8ICBIZWxsbyBhbmQgZ29vZGJ5ZQorICAgICB8XHgyMFx4MjAKKyAgICAgfCAgTWV0aG9kcyBkZWZpbmVkIGhlcmU6CisgICAgIHxceDIwXHgyMAorICAgICB8ICBfX2luaXRfXygpCisgICAgIHwgICAgICBXb3csIEkgaGF2ZSBubyBmdW5jdGlvbiEKK1x4MjBceDIwXHgyMFx4MjAKKyAgICBjbGFzcyBCKF9fYnVpbHRpbl9fLm9iamVjdCkKKyAgICAgfCAgRGF0YSBkZXNjcmlwdG9ycyBkZWZpbmVkIGhlcmU6CisgICAgIHxceDIwXHgyMAorICAgICB8ICBfX2RpY3RfXyVzCisgICAgIHxceDIwXHgyMAorICAgICB8ICBfX3dlYWtyZWZfXyVzCisgICAgIHxceDIwXHgyMAorICAgICB8ICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgIHwgIERhdGEgYW5kIG90aGVyIGF0dHJpYnV0ZXMgZGVmaW5lZCBoZXJlOgorICAgICB8XHgyMFx4MjAKKyAgICAgfCAgTk9fTUVBTklORyA9ICdlZ2dzJworCitGVU5DVElPTlMKKyAgICBkb2NfZnVuYygpCisgICAgICAgIFRoaXMgZnVuY3Rpb24gc29sdmVzIGFsbCBvZiB0aGUgd29ybGQncyBwcm9ibGVtczoKKyAgICAgICAgaHVuZ2VyCisgICAgICAgIGxhY2sgb2YgUHl0aG9uCisgICAgICAgIHdhcgorXHgyMFx4MjBceDIwXHgyMAorICAgIG5vZG9jX2Z1bmMoKQorCitEQVRBCisgICAgX19hdXRob3JfXyA9ICdCZW5qYW1pbiBQZXRlcnNvbicKKyAgICBfX2NyZWRpdHNfXyA9ICdOb2JvZHknCisgICAgX192ZXJzaW9uX18gPSAnMS4yLjMuNCcKKworVkVSU0lPTgorICAgIDEuMi4zLjQKKworQVVUSE9SCisgICAgQmVuamFtaW4gUGV0ZXJzb24KKworQ1JFRElUUworICAgIE5vYm9keQorIiIiLnN0cmlwKCkKKworZXhwZWN0ZWRfdGV4dF9kYXRhX2RvY3N0cmluZ3MgPSB0dXBsZSgnXG4gICAgIHwgICAgICAnICsgcyBpZiBzIGVsc2UgJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gZXhwZWN0ZWRfZGF0YV9kb2NzdHJpbmdzKQorCitleHBlY3RlZF9odG1sX3BhdHRlcm4gPSBcCisiIiIKKzx0YWJsZSB3aWR0aD0iMTAwJSUiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MiBib3JkZXI9MCBzdW1tYXJ5PSJoZWFkaW5nIj4KKzx0ciBiZ2NvbG9yPSIjNzc5OWVlIj4KKzx0ZCB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj4mbmJzcDs8YnI+PGJpZz48YmlnPjxzdHJvbmc+PGEgaHJlZj0idGVzdC5odG1sIj48Zm9udCBjb2xvcj0iI2ZmZmZmZiI+dGVzdDwvZm9udD48L2E+LnB5ZG9jX21vZDwvc3Ryb25nPjwvYmlnPjwvYmlnPiAodmVyc2lvbiAxLjIuMy40KTwvZm9udD48L3RkCis+PHRkIGFsaWduPXJpZ2h0IHZhbGlnbj1ib3R0b20KKz48Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+PGEgaHJlZj0iLiI+aW5kZXg8L2E+PGJyPjxhIGhyZWY9ImZpbGU6JXMiPiVzPC9hPiVzPC9mb250PjwvdGQ+PC90cj48L3RhYmxlPgorICAgIDxwPjx0dD5UaGlzJm5ic3A7aXMmbmJzcDthJm5ic3A7dGVzdCZuYnNwO21vZHVsZSZuYnNwO2ZvciZuYnNwO3Rlc3RfcHlkb2M8L3R0PjwvcD4KKzxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiNlZTc3YWEiPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YmlnPjxzdHJvbmc+Q2xhc3Nlczwvc3Ryb25nPjwvYmlnPjwvZm9udD48L3RkPjwvdHI+CitceDIwXHgyMFx4MjBceDIwCis8dHI+PHRkIGJnY29sb3I9IiNlZTc3YWEiPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3R0PjwvdGQ+PHRkPiZuYnNwOzwvdGQ+Cis8dGQgd2lkdGg9IjEwMCUlIj48ZGw+Cis8ZHQ+PGZvbnQgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+PGEgaHJlZj0iX19idWlsdGluX18uaHRtbCNvYmplY3QiPl9fYnVpbHRpbl9fLm9iamVjdDwvYT4KKzwvZm9udD48L2R0PjxkZD4KKzxkbD4KKzxkdD48Zm9udCBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YSBocmVmPSJ0ZXN0LnB5ZG9jX21vZC5odG1sI0IiPkI8L2E+Cis8L2ZvbnQ+PC9kdD48L2RsPgorPC9kZD4KKzxkdD48Zm9udCBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YSBocmVmPSJ0ZXN0LnB5ZG9jX21vZC5odG1sI0EiPkE8L2E+Cis8L2ZvbnQ+PC9kdD48L2RsPgorIDxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiNmZmM4ZDgiPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjMDAwMDAwIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YSBuYW1lPSJBIj5jbGFzcyA8c3Ryb25nPkE8L3N0cm9uZz48L2E+PC9mb250PjwvdGQ+PC90cj4KK1x4MjBceDIwXHgyMFx4MjAKKzx0ciBiZ2NvbG9yPSIjZmZjOGQ4Ij48dGQgcm93c3Bhbj0yPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDs8L3R0PjwvdGQ+Cis8dGQgY29sc3Bhbj0yPjx0dD5IZWxsbyZuYnNwO2FuZCZuYnNwO2dvb2RieWU8YnI+Jm5ic3A7PC90dD48L3RkPjwvdHI+Cis8dHI+PHRkPiZuYnNwOzwvdGQ+Cis8dGQgd2lkdGg9IjEwMCUlIj5NZXRob2RzIGRlZmluZWQgaGVyZTo8YnI+Cis8ZGw+PGR0PjxhIG5hbWU9IkEtX19pbml0X18iPjxzdHJvbmc+X19pbml0X188L3N0cm9uZz48L2E+KCk8L2R0PjxkZD48dHQ+V293LCZuYnNwO0kmbmJzcDtoYXZlJm5ic3A7bm8mbmJzcDtmdW5jdGlvbiE8L3R0PjwvZGQ+PC9kbD4KKworPC90ZD48L3RyPjwvdGFibGU+IDxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiNmZmM4ZDgiPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjMDAwMDAwIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YSBuYW1lPSJCIj5jbGFzcyA8c3Ryb25nPkI8L3N0cm9uZz48L2E+KDxhIGhyZWY9Il9fYnVpbHRpbl9fLmh0bWwjb2JqZWN0Ij5fX2J1aWx0aW5fXy5vYmplY3Q8L2E+KTwvZm9udD48L3RkPjwvdHI+CitceDIwXHgyMFx4MjBceDIwCis8dHI+PHRkIGJnY29sb3I9IiNmZmM4ZDgiPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDs8L3R0PjwvdGQ+PHRkPiZuYnNwOzwvdGQ+Cis8dGQgd2lkdGg9IjEwMCUlIj5EYXRhIGRlc2NyaXB0b3JzIGRlZmluZWQgaGVyZTo8YnI+Cis8ZGw+PGR0PjxzdHJvbmc+X19kaWN0X188L3N0cm9uZz48L2R0PgorPGRkPjx0dD4lczwvdHQ+PC9kZD4KKzwvZGw+Cis8ZGw+PGR0PjxzdHJvbmc+X193ZWFrcmVmX188L3N0cm9uZz48L2R0PgorPGRkPjx0dD4lczwvdHQ+PC9kZD4KKzwvZGw+Cis8aHI+CitEYXRhIGFuZCBvdGhlciBhdHRyaWJ1dGVzIGRlZmluZWQgaGVyZTo8YnI+Cis8ZGw+PGR0PjxzdHJvbmc+Tk9fTUVBTklORzwvc3Ryb25nPiA9ICdlZ2dzJzwvZGw+CisKKzwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+PC90cj48L3RhYmxlPjxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiNlZWFhNzciPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YmlnPjxzdHJvbmc+RnVuY3Rpb25zPC9zdHJvbmc+PC9iaWc+PC9mb250PjwvdGQ+PC90cj4KK1x4MjBceDIwXHgyMFx4MjAKKzx0cj48dGQgYmdjb2xvcj0iI2VlYWE3NyI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdHQ+PC90ZD48dGQ+Jm5ic3A7PC90ZD4KKzx0ZCB3aWR0aD0iMTAwJSUiPjxkbD48ZHQ+PGEgbmFtZT0iLWRvY19mdW5jIj48c3Ryb25nPmRvY19mdW5jPC9zdHJvbmc+PC9hPigpPC9kdD48ZGQ+PHR0PlRoaXMmbmJzcDtmdW5jdGlvbiZuYnNwO3NvbHZlcyZuYnNwO2FsbCZuYnNwO29mJm5ic3A7dGhlJm5ic3A7d29ybGQncyZuYnNwO3Byb2JsZW1zOjxicj4KK2h1bmdlcjxicj4KK2xhY2smbmJzcDtvZiZuYnNwO1B5dGhvbjxicj4KK3dhcjwvdHQ+PC9kZD48L2RsPgorIDxkbD48ZHQ+PGEgbmFtZT0iLW5vZG9jX2Z1bmMiPjxzdHJvbmc+bm9kb2NfZnVuYzwvc3Ryb25nPjwvYT4oKTwvZHQ+PC9kbD4KKzwvdGQ+PC90cj48L3RhYmxlPjxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiM1NWFhNTUiPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YmlnPjxzdHJvbmc+RGF0YTwvc3Ryb25nPjwvYmlnPjwvZm9udD48L3RkPjwvdHI+CitceDIwXHgyMFx4MjBceDIwCis8dHI+PHRkIGJnY29sb3I9IiM1NWFhNTUiPjx0dD4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8L3R0PjwvdGQ+PHRkPiZuYnNwOzwvdGQ+Cis8dGQgd2lkdGg9IjEwMCUlIj48c3Ryb25nPl9fYXV0aG9yX188L3N0cm9uZz4gPSAnQmVuamFtaW4gUGV0ZXJzb24nPGJyPgorPHN0cm9uZz5fX2NyZWRpdHNfXzwvc3Ryb25nPiA9ICdOb2JvZHknPGJyPgorPHN0cm9uZz5fX3ZlcnNpb25fXzwvc3Ryb25nPiA9ICcxLjIuMy40JzwvdGQ+PC90cj48L3RhYmxlPjxwPgorPHRhYmxlIHdpZHRoPSIxMDAlJSIgY2VsbHNwYWNpbmc9MCBjZWxscGFkZGluZz0yIGJvcmRlcj0wIHN1bW1hcnk9InNlY3Rpb24iPgorPHRyIGJnY29sb3I9IiM3Nzk5ZWUiPgorPHRkIGNvbHNwYW49MyB2YWxpZ249Ym90dG9tPiZuYnNwOzxicj4KKzxmb250IGNvbG9yPSIjZmZmZmZmIiBmYWNlPSJoZWx2ZXRpY2EsIGFyaWFsIj48YmlnPjxzdHJvbmc+QXV0aG9yPC9zdHJvbmc+PC9iaWc+PC9mb250PjwvdGQ+PC90cj4KK1x4MjBceDIwXHgyMFx4MjAKKzx0cj48dGQgYmdjb2xvcj0iIzc3OTllZSI+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzwvdHQ+PC90ZD48dGQ+Jm5ic3A7PC90ZD4KKzx0ZCB3aWR0aD0iMTAwJSUiPkJlbmphbWluJm5ic3A7UGV0ZXJzb248L3RkPjwvdHI+PC90YWJsZT48cD4KKzx0YWJsZSB3aWR0aD0iMTAwJSUiIGNlbGxzcGFjaW5nPTAgY2VsbHBhZGRpbmc9MiBib3JkZXI9MCBzdW1tYXJ5PSJzZWN0aW9uIj4KKzx0ciBiZ2NvbG9yPSIjNzc5OWVlIj4KKzx0ZCBjb2xzcGFuPTMgdmFsaWduPWJvdHRvbT4mbmJzcDs8YnI+Cis8Zm9udCBjb2xvcj0iI2ZmZmZmZiIgZmFjZT0iaGVsdmV0aWNhLCBhcmlhbCI+PGJpZz48c3Ryb25nPkNyZWRpdHM8L3N0cm9uZz48L2JpZz48L2ZvbnQ+PC90ZD48L3RyPgorXHgyMFx4MjBceDIwXHgyMAorPHRyPjx0ZCBiZ2NvbG9yPSIjNzc5OWVlIj48dHQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90dD48L3RkPjx0ZD4mbmJzcDs8L3RkPgorPHRkIHdpZHRoPSIxMDAlJSI+Tm9ib2R5PC90ZD48L3RyPjwvdGFibGU+CisiIiIuc3RyaXAoKQorCitleHBlY3RlZF9odG1sX2RhdGFfZG9jc3RyaW5ncyA9IHR1cGxlKHMucmVwbGFjZSgnICcsICcmbmJzcDsnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcyBpbiBleHBlY3RlZF9kYXRhX2RvY3N0cmluZ3MpCisKKyMgb3V0cHV0IHBhdHRlcm4gZm9yIG1pc3NpbmcgbW9kdWxlCittaXNzaW5nX3BhdHRlcm4gPSAibm8gUHl0aG9uIGRvY3VtZW50YXRpb24gZm91bmQgZm9yICclcyciCisKKyMgb3V0cHV0IHBhdHRlcm4gZm9yIG1vZHVsZSB3aXRoIGJhZCBpbXBvcnRzCitiYWRpbXBvcnRfcGF0dGVybiA9ICJwcm9ibGVtIGluICVzIC0gPHR5cGUgJ2V4Y2VwdGlvbnMuSW1wb3J0RXJyb3InPjogTm8gbW9kdWxlIG5hbWVkICVzIgorCitkZWYgcnVuX3B5ZG9jKG1vZHVsZV9uYW1lLCAqYXJncywgKiplbnYpOgorICAgICIiIgorICAgIFJ1bnMgcHlkb2Mgb24gdGhlIHNwZWNpZmllZCBtb2R1bGUuIFJldHVybnMgdGhlIHN0cmlwcGVkCisgICAgb3V0cHV0IG9mIHB5ZG9jLgorICAgICIiIgorICAgIGFyZ3MgPSBhcmdzICsgKG1vZHVsZV9uYW1lLCkKKyAgICAjIGRvIG5vdCB3cml0ZSBieXRlY29kZSBmaWxlcyB0byBhdm9pZCBjYWNoaW5nIGVycm9ycworICAgIHJjLCBvdXQsIGVyciA9IGFzc2VydF9weXRob25fb2soJy1CJywgcHlkb2MuX19maWxlX18sICphcmdzLCAqKmVudikKKyAgICByZXR1cm4gb3V0LnN0cmlwKCkKKworZGVmIGdldF9weWRvY19odG1sKG1vZHVsZSk6CisgICAgIlJldHVybnMgcHlkb2MgZ2VuZXJhdGVkIG91dHB1dCBhcyBodG1sIgorICAgIGRvYyA9IHB5ZG9jLkhUTUxEb2MoKQorICAgIG91dHB1dCA9IGRvYy5kb2Ntb2R1bGUobW9kdWxlKQorICAgIGxvYyA9IGRvYy5nZXRkb2Nsb2MocHlkb2NfbW9kKSBvciAiIgorICAgIGlmIGxvYzoKKyAgICAgICAgbG9jID0gIjxicj48YSBocmVmPVwiIiArIGxvYyArICJcIj5Nb2R1bGUgRG9jczwvYT4iCisgICAgcmV0dXJuIG91dHB1dC5zdHJpcCgpLCBsb2MKKworZGVmIGdldF9weWRvY190ZXh0KG1vZHVsZSk6CisgICAgIlJldHVybnMgcHlkb2MgZ2VuZXJhdGVkIG91dHB1dCBhcyB0ZXh0IgorICAgIGRvYyA9IHB5ZG9jLlRleHREb2MoKQorICAgIGxvYyA9IGRvYy5nZXRkb2Nsb2MocHlkb2NfbW9kKSBvciAiIgorICAgIGlmIGxvYzoKKyAgICAgICAgbG9jID0gIlxuTU9EVUxFIERPQ1NcbiAgICAiICsgbG9jICsgIlxuIgorCisgICAgb3V0cHV0ID0gZG9jLmRvY21vZHVsZShtb2R1bGUpCisKKyAgICAjIGNsZWFudXAgdGhlIGV4dHJhIHRleHQgZm9ybWF0dGluZyB0aGF0IHB5ZG9jIHByZWZvcm1zCisgICAgcGF0dCA9IHJlLmNvbXBpbGUoJ1xiLicpCisgICAgb3V0cHV0ID0gcGF0dC5zdWIoJycsIG91dHB1dCkKKyAgICByZXR1cm4gb3V0cHV0LnN0cmlwKCksIGxvYworCitkZWYgcHJpbnRfZGlmZnModGV4dDEsIHRleHQyKToKKyAgICAiUHJpbnRzIHVuaWZpZWQgZGlmZnMgZm9yIHR3byB0ZXh0cyIKKyAgICBsaW5lczEgPSB0ZXh0MS5zcGxpdGxpbmVzKFRydWUpCisgICAgbGluZXMyID0gdGV4dDIuc3BsaXRsaW5lcyhUcnVlKQorICAgIGRpZmZzID0gZGlmZmxpYi51bmlmaWVkX2RpZmYobGluZXMxLCBsaW5lczIsIG49MCwgZnJvbWZpbGU9J2V4cGVjdGVkJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvZmlsZT0nZ290JykKKyAgICBwcmludCAnXG4nICsgJycuam9pbihkaWZmcykKKworCitjbGFzcyBQeURvY0RvY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RfaHRtbF9kb2Moc2VsZik6CisgICAgICAgIHJlc3VsdCwgZG9jX2xvYyA9IGdldF9weWRvY19odG1sKHB5ZG9jX21vZCkKKyAgICAgICAgbW9kX2ZpbGUgPSBpbnNwZWN0LmdldGFic2ZpbGUocHlkb2NfbW9kKQorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIGltcG9ydCBudHVybDJwYXRoCisgICAgICAgICAgICBtb2RfdXJsID0gbnR1cmwycGF0aC5wYXRobmFtZTJ1cmwobW9kX2ZpbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RfdXJsID0gbW9kX2ZpbGUKKyAgICAgICAgZXhwZWN0ZWRfaHRtbCA9IGV4cGVjdGVkX2h0bWxfcGF0dGVybiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIChtb2RfdXJsLCBtb2RfZmlsZSwgZG9jX2xvYykgKworICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfaHRtbF9kYXRhX2RvY3N0cmluZ3MpCisgICAgICAgIGlmIHJlc3VsdCAhPSBleHBlY3RlZF9odG1sOgorICAgICAgICAgICAgcHJpbnRfZGlmZnMoZXhwZWN0ZWRfaHRtbCwgcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJvdXRwdXRzIGFyZSBub3QgZXF1YWwsIHNlZSBkaWZmIGFib3ZlIikKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X3RleHRfZG9jKHNlbGYpOgorICAgICAgICByZXN1bHQsIGRvY19sb2MgPSBnZXRfcHlkb2NfdGV4dChweWRvY19tb2QpCisgICAgICAgIGV4cGVjdGVkX3RleHQgPSBleHBlY3RlZF90ZXh0X3BhdHRlcm4gJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAoaW5zcGVjdC5nZXRhYnNmaWxlKHB5ZG9jX21vZCksIGRvY19sb2MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3RleHRfZGF0YV9kb2NzdHJpbmdzKQorICAgICAgICBpZiByZXN1bHQgIT0gZXhwZWN0ZWRfdGV4dDoKKyAgICAgICAgICAgIHByaW50X2RpZmZzKGV4cGVjdGVkX3RleHQsIHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgib3V0cHV0cyBhcmUgbm90IGVxdWFsLCBzZWUgZGlmZiBhYm92ZSIpCisKKyAgICBkZWYgdGVzdF9pc3N1ZTgyMjUoc2VsZik6CisgICAgICAgICMgVGVzdCBpc3N1ZTgyMjUgdG8gZW5zdXJlIG5vIGRvYyBsaW5rIGFwcGVhcnMgZm9yIHhtbC5ldHJlZQorICAgICAgICByZXN1bHQsIGRvY19sb2MgPSBnZXRfcHlkb2NfdGV4dCh4bWwuZXRyZWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZG9jX2xvYywgIiIsICJNT0RVTEUgRE9DUyBpbmNvcnJlY3RseSBpbmNsdWRlcyBhIGxpbmsiKQorCisgICAgZGVmIHRlc3Rfbm9uX3N0cl9uYW1lKHNlbGYpOgorICAgICAgICAjIGlzc3VlMTQ2MzgKKyAgICAgICAgIyBUcmVhdCBpbGxlZ2FsIChub24tc3RyKSBuYW1lIGxpa2Ugbm8gbmFtZQorICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgX19uYW1lX18gPSA0MgorICAgICAgICBjbGFzcyBCOgorICAgICAgICAgICAgcGFzcworICAgICAgICBhZG9jID0gcHlkb2MucmVuZGVyX2RvYyhBKCkpCisgICAgICAgIGJkb2MgPSBweWRvYy5yZW5kZXJfZG9jKEIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZG9jLnJlcGxhY2UoIkEiLCAiQiIpLCBiZG9jKQorCisgICAgZGVmIHRlc3Rfbm90X2hlcmUoc2VsZik6CisgICAgICAgIG1pc3NpbmdfbW9kdWxlID0gInRlc3QuaV9hbV9ub3RfaGVyZSIKKyAgICAgICAgcmVzdWx0ID0gcnVuX3B5ZG9jKG1pc3NpbmdfbW9kdWxlKQorICAgICAgICBleHBlY3RlZCA9IG1pc3NpbmdfcGF0dGVybiAlIG1pc3NpbmdfbW9kdWxlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCwKKyAgICAgICAgICAgICJkb2N1bWVudGF0aW9uIGZvciBtaXNzaW5nIG1vZHVsZSBmb3VuZCIpCisKKyAgICBkZWYgdGVzdF9pbnB1dF9zdHJpcChzZWxmKToKKyAgICAgICAgbWlzc2luZ19tb2R1bGUgPSAiIHRlc3QuaV9hbV9ub3RfaGVyZSAiCisgICAgICAgIHJlc3VsdCA9IHJ1bl9weWRvYyhtaXNzaW5nX21vZHVsZSkKKyAgICAgICAgZXhwZWN0ZWQgPSBtaXNzaW5nX3BhdHRlcm4gJSBtaXNzaW5nX21vZHVsZS5zdHJpcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCwKKyAgICAgICAgICAgICJ3aGl0ZSBzcGFjZSB3YXMgbm90IHN0cmlwcGVkIGZyb20gbW9kdWxlIG5hbWUgIgorICAgICAgICAgICAgIm9yIG90aGVyIGVycm9yIG91dHB1dCBtaXNtYXRjaCIpCisKKyAgICBkZWYgdGVzdF9zdHJpcGlkKHNlbGYpOgorICAgICAgICAjIHRlc3Qgd2l0aCBzdHJpbmdzLCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgaGF2ZSBkaWZmZXJlbnQgcmVwcigpCisgICAgICAgIHN0cmlwaWQgPSBweWRvYy5zdHJpcGlkCisgICAgICAgICMgc3RyaXAgdGhlIGlkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaXBpZCgnPGZ1bmN0aW9uIHN0cmlwaWQgYXQgMHg4OGRjZWU0PicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICc8ZnVuY3Rpb24gc3RyaXBpZD4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmlwaWQoJzxmdW5jdGlvbiBzdHJpcGlkIGF0IDB4MDFGNjUzOTA+JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJzxmdW5jdGlvbiBzdHJpcGlkPicpCisgICAgICAgICMgbm90aGluZyB0byBzdHJpcCwgcmV0dXJuIHRoZSBzYW1lIHRleHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpcGlkKCc0MicpLCAnNDInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmlwaWQoIjx0eXBlICdleGNlcHRpb25zLkV4Y2VwdGlvbic+IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIjx0eXBlICdleGNlcHRpb25zLkV4Y2VwdGlvbic+IikKKworCitjbGFzcyBQeWRvY0ltcG9ydFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRlc3RfZGlyID0gb3MubWtkaXIoVEVTVEZOKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocm10cmVlLCBURVNURk4pCisKKyAgICBkZWYgdGVzdF9iYWRpbXBvcnQoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0cyB0aGUgZml4IGZvciBpc3N1ZSA1MjMwLCB3aGVyZSBpZiBweWRvYyBmb3VuZCB0aGUgbW9kdWxlCisgICAgICAgICMgYnV0IHRoZSBtb2R1bGUgaGFkIGFuIGludGVybmFsIGltcG9ydCBlcnJvciBweWRvYyB3b3VsZCByZXBvcnQgbm8gZG9jCisgICAgICAgICMgZm91bmQuCisgICAgICAgIG1vZG5hbWUgPSAndGVzdG1vZF94eXp6eScKKyAgICAgICAgdGVzdHBhaXJzID0gKAorICAgICAgICAgICAgKCdpX2FtX25vdF9oZXJlJywgJ2lfYW1fbm90X2hlcmUnKSwKKyAgICAgICAgICAgICgndGVzdC5pX2FtX25vdF9oZXJlX2VpdGhlcicsICdpX2FtX25vdF9oZXJlX2VpdGhlcicpLAorICAgICAgICAgICAgKCd0ZXN0LmlfYW1fbm90X2hlcmUubmVpdGhlcl9hbV9pJywgJ2lfYW1fbm90X2hlcmUubmVpdGhlcl9hbV9pJyksCisgICAgICAgICAgICAoJ2lfYW1fbm90X2hlcmUue30nLmZvcm1hdChtb2RuYW1lKSwKKyAgICAgICAgICAgICAnaV9hbV9ub3RfaGVyZS57fScuZm9ybWF0KG1vZG5hbWUpKSwKKyAgICAgICAgICAgICgndGVzdC57fScuZm9ybWF0KG1vZG5hbWUpLCBtb2RuYW1lKSwKKyAgICAgICAgICAgICkKKworICAgICAgICBzb3VyY2VmbiA9IG9zLnBhdGguam9pbihURVNURk4sIG1vZG5hbWUpICsgb3MuZXh0c2VwICsgInB5IgorICAgICAgICBmb3IgaW1wb3J0c3RyaW5nLCBleHBlY3RlZGlubXNnIGluIHRlc3RwYWlyczoKKyAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2VmbiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoImltcG9ydCB7fVxuIi5mb3JtYXQoaW1wb3J0c3RyaW5nKSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHJ1bl9weWRvYyhtb2RuYW1lLCBQWVRIT05QQVRIPVRFU1RGTikKKyAgICAgICAgICAgIGV4cGVjdGVkID0gYmFkaW1wb3J0X3BhdHRlcm4gJSAobW9kbmFtZSwgZXhwZWN0ZWRpbm1zZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X2Fwcm9wb3Nfd2l0aF9iYWRfcGFja2FnZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA3NDI1IC0gcHlkb2MgLWsgZmFpbGVkIHdoZW4gYmFkIHBhY2thZ2Ugb24gcGF0aAorICAgICAgICBwa2dkaXIgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCAic3ludGF4ZXJyIikKKyAgICAgICAgb3MubWtkaXIocGtnZGlyKQorICAgICAgICBiYWRzeW50YXggPSBvcy5wYXRoLmpvaW4ocGtnZGlyLCAiX19pbml0X18iKSArIG9zLmV4dHNlcCArICJweSIKKyAgICAgICAgd2l0aCBvcGVuKGJhZHN5bnRheCwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiaW52YWxpZCBweXRob24gc3ludGF4ID0gJDFcbiIpCisgICAgICAgIHJlc3VsdCA9IHJ1bl9weWRvYygnenF3eWtqdicsICctaycsIFBZVEhPTlBBVEg9VEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9hcHJvcG9zX3dpdGhfdW5yZWFkYWJsZV9kaXIoc2VsZik6CisgICAgICAgICMgSXNzdWUgNzM2NyAtIHB5ZG9jIC1rIGZhaWxlZCB3aGVuIHVucmVhZGFibGUgZGlyIG9uIHBhdGgKKyAgICAgICAgc2VsZi51bnJlYWRhYmxlX2RpciA9IG9zLnBhdGguam9pbihURVNURk4sICJ1bnJlYWRhYmxlIikKKyAgICAgICAgb3MubWtkaXIoc2VsZi51bnJlYWRhYmxlX2RpciwgMCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJtZGlyLCBzZWxmLnVucmVhZGFibGVfZGlyKQorICAgICAgICAjIE5vdGUsIG9uIFdpbmRvd3MgdGhlIGRpcmVjdG9yeSBhcHBlYXJzIHRvIGJlIHN0aWxsCisgICAgICAgICMgICByZWFkYWJsZSBzbyB0aGlzIGlzIG5vdCByZWFsbHkgdGVzdGluZyB0aGUgaXNzdWUgdGhlcmUKKyAgICAgICAgcmVzdWx0ID0gcnVuX3B5ZG9jKCd6cXd5a2p2JywgJy1rJywgUFlUSE9OUEFUSD1URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHJlc3VsdCkKKworCitjbGFzcyBUZXN0RGVzY3JpcHRpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X21vZHVsZShzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHB5ZG9jZm9kZGVyIG1vZHVsZSBjYW4gYmUgZGVzY3JpYmVkCisgICAgICAgIGZyb20gdGVzdCBpbXBvcnQgcHlkb2Nmb2RkZXIKKyAgICAgICAgZG9jID0gcHlkb2MucmVuZGVyX2RvYyhweWRvY2ZvZGRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigicHlkb2Nmb2RkZXIiLCBkb2MpCisKKyAgICBkZWYgdGVzdF9jbGFzc2ljX2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBDOiAiQ2xhc3NpYyBjbGFzcyIKKyAgICAgICAgYyA9IEMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5ZG9jLmRlc2NyaWJlKEMpLCAnY2xhc3MgQycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoYyksICdpbnN0YW5jZSBvZiBDJykKKyAgICAgICAgZXhwZWN0ZWQgPSAnaW5zdGFuY2Ugb2YgQyBpbiBtb2R1bGUgJXMnICUgX19uYW1lX18KKyAgICAgICAgc2VsZi5hc3NlcnRJbihleHBlY3RlZCwgcHlkb2MucmVuZGVyX2RvYyhjKSkKKworICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBDKG9iamVjdCk6ICJOZXctc3R5bGUgY2xhc3MiCisgICAgICAgIGMgPSBDKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB5ZG9jLmRlc2NyaWJlKEMpLCAnY2xhc3MgQycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoYyksICdDJykKKyAgICAgICAgZXhwZWN0ZWQgPSAnQyBpbiBtb2R1bGUgJXMgb2JqZWN0JyAlIF9fbmFtZV9fCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXhwZWN0ZWQsIHB5ZG9jLnJlbmRlcl9kb2MoYykpCisKKyAgICBkZWYgdGVzdF9uYW1lZHR1cGxlX3B1YmxpY191bmRlcnNjb3JlKHNlbGYpOgorICAgICAgICBOVCA9IG5hbWVkdHVwbGUoJ05UJywgWydhYmMnLCAnZGVmJ10sIHJlbmFtZT1UcnVlKQorICAgICAgICB3aXRoIGNhcHR1cmVkX3N0ZG91dCgpIGFzIGhlbHBfaW86CisgICAgICAgICAgICBoZWxwKE5UKQorICAgICAgICBoZWxwdGV4dCA9IGhlbHBfaW8uZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEluKCdfMScsIGhlbHB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydEluKCdfcmVwbGFjZScsIGhlbHB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydEluKCdfYXNkaWN0JywgaGVscHRleHQpCisKKworY2xhc3MgVGVzdEhlbHBlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfa2V5d29yZHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHB5ZG9jLkhlbHBlci5rZXl3b3JkcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkKGtleXdvcmQua3dsaXN0KSkKKworICAgIGRlZiB0ZXN0X2J1aWx0aW4oc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluICgnc3RyJywgJ3N0ci50cmFuc2xhdGUnLCAnX19idWlsdGluX18uc3RyJywKKyAgICAgICAgICAgICAgICAgICAgICdfX2J1aWx0aW5fXy5zdHIudHJhbnNsYXRlJyk6CisgICAgICAgICAgICAjIHRlc3QgbG93LWxldmVsIGZ1bmN0aW9uCisgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShweWRvYy5sb2NhdGUobmFtZSkpCisgICAgICAgICAgICAjIHRlc3QgaGlnaC1sZXZlbCBmdW5jdGlvbgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHB5ZG9jLnJlbmRlcl9kb2MobmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2ZpbmRpbmcgdGhlIGRvYyBvZiB7IXJ9IGZhaWxlZCcuZm9ybWF0KG8pKQorCisgICAgICAgIGZvciBuYW1lIGluICgnbm90X19idWlsdGluX18nLCAnc3RycnInLCAnc3Ryci50cmFuc2xhdGUnLAorICAgICAgICAgICAgICAgICAgICAgJ3N0ci50cnJycmFuc2xhdGUnLCAnX19idWlsdGluX18uc3RycnInLAorICAgICAgICAgICAgICAgICAgICAgJ19fYnVpbHRpbl9fLnN0ci50cnJyYW5zbGF0ZScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocHlkb2MubG9jYXRlKG5hbWUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW1wb3J0RXJyb3IsIHB5ZG9jLnJlbmRlcl9kb2MsIG5hbWUpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRyeToKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFB5RG9jRG9jVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5ZG9jSW1wb3J0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3REZXNjcmlwdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0SGVscGVyKQorICAgIGZpbmFsbHk6CisgICAgICAgIHJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWRvYy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWRvYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0MjkzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWRvYy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWRvYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0MjkzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZG9jLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9weWV4cGF0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTExYTIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weQpAQCAtMCwwICsxLDY1NyBAQAorIyBYWFggVHlwZUVycm9ycyBvbiBjYWxsaW5nIGhhbmRsZXJzLCBvciBvbiBiYWQgcmV0dXJuIHZhbHVlcyBmcm9tIGEKKyMgaGFuZGxlciwgYXJlIG9ic2N1cmUgYW5kIHVuaGVscGZ1bC4KKworaW1wb3J0IFN0cmluZ0lPLCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgc29ydGRpY3QsIHJ1bl91bml0dGVzdAorCisKK2NsYXNzIFNldEF0dHJpYnV0ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0nIScpCisgICAgICAgIHNlbGYuc2V0X2dldF9wYWlycyA9IFsKKyAgICAgICAgICAgIFswLCAwXSwKKyAgICAgICAgICAgIFsxLCAxXSwKKyAgICAgICAgICAgIFsyLCAxXSwKKyAgICAgICAgICAgIFswLCAwXSwKKyAgICAgICAgICAgIF0KKworICAgIGRlZiB0ZXN0X3JldHVybnNfdW5pY29kZShzZWxmKToKKyAgICAgICAgZm9yIHgsIHkgaW4gc2VsZi5zZXRfZ2V0X3BhaXJzOgorICAgICAgICAgICAgc2VsZi5wYXJzZXIucmV0dXJuc191bmljb2RlID0geAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5yZXR1cm5zX3VuaWNvZGUsIHkpCisKKyAgICBkZWYgdGVzdF9vcmRlcmVkX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGZvciB4LCB5IGluIHNlbGYuc2V0X2dldF9wYWlyczoKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLm9yZGVyZWRfYXR0cmlidXRlcyA9IHgKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYXJzZXIub3JkZXJlZF9hdHRyaWJ1dGVzLCB5KQorCisgICAgZGVmIHRlc3Rfc3BlY2lmaWVkX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIGZvciB4LCB5IGluIHNlbGYuc2V0X2dldF9wYWlyczoKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLnNwZWNpZmllZF9hdHRyaWJ1dGVzID0geAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhcnNlci5zcGVjaWZpZWRfYXR0cmlidXRlcywgeSkKKworCitkYXRhID0gJycnXAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgc3RhbmRhbG9uZT0ibm8iPz4KKzw/eG1sLXN0eWxlc2hlZXQgaHJlZj0ic3R5bGVzaGVldC5jc3MiPz4KKzwhLS0gY29tbWVudCBkYXRhIC0tPgorPCFET0NUWVBFIHF1b3RhdGlvbnMgU1lTVEVNICJxdW90YXRpb25zLmR0ZCIgWworPCFFTEVNRU5UIHJvb3QgQU5ZPgorPCFOT1RBVElPTiBub3RhdGlvbiBTWVNURU0gIm5vdGF0aW9uLmpwZWciPgorPCFFTlRJVFkgYWNpcmMgIiYjMjI2OyI+Cis8IUVOVElUWSBleHRlcm5hbF9lbnRpdHkgU1lTVEVNICJlbnRpdHkuZmlsZSI+Cis8IUVOVElUWSB1bnBhcnNlZF9lbnRpdHkgU1lTVEVNICJlbnRpdHkuZmlsZSIgTkRBVEEgbm90YXRpb24+CisldW5wYXJzZWRfZW50aXR5OworXT4KKworPHJvb3QgYXR0cjE9InZhbHVlMSIgYXR0cjI9InZhbHVlMiYjODAwMDsiPgorPG15bnM6c3ViZWxlbWVudCB4bWxuczpteW5zPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlIj4KKyAgICAgQ29udGVudHMgb2Ygc3ViZWxlbWVudHMKKzwvbXluczpzdWJlbGVtZW50PgorPHN1YjI+PCFbQ0RBVEFbY29udGVudHMgb2YgQ0RBVEEgc2VjdGlvbl1dPjwvc3ViMj4KKyZleHRlcm5hbF9lbnRpdHk7Cis8L3Jvb3Q+CisnJycKKworCisjIFByb2R1Y2UgVVRGLTggb3V0cHV0CitjbGFzcyBQYXJzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNsYXNzIE91dHB1dHRlcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5vdXQgPSBbXQorCisgICAgICAgIGRlZiBTdGFydEVsZW1lbnRIYW5kbGVyKHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnU3RhcnQgZWxlbWVudDogJyArIHJlcHIobmFtZSkgKyAnICcgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRkaWN0KGF0dHJzKSkKKworICAgICAgICBkZWYgRW5kRWxlbWVudEhhbmRsZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ0VuZCBlbGVtZW50OiAnICsgcmVwcihuYW1lKSkKKworICAgICAgICBkZWYgQ2hhcmFjdGVyRGF0YUhhbmRsZXIoc2VsZiwgZGF0YSk6CisgICAgICAgICAgICBkYXRhID0gZGF0YS5zdHJpcCgpCisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnQ2hhcmFjdGVyIGRhdGE6ICcgKyByZXByKGRhdGEpKQorCisgICAgICAgIGRlZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyKHNlbGYsIHRhcmdldCwgZGF0YSk6CisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ1BJOiAnICsgcmVwcih0YXJnZXQpICsgJyAnICsgcmVwcihkYXRhKSkKKworICAgICAgICBkZWYgU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcihzZWxmLCBwcmVmaXgsIHVyaSk6CisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ05TIGRlY2w6ICcgKyByZXByKHByZWZpeCkgKyAnICcgKyByZXByKHVyaSkpCisKKyAgICAgICAgZGVmIEVuZE5hbWVzcGFjZURlY2xIYW5kbGVyKHNlbGYsIHByZWZpeCk6CisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ0VuZCBvZiBOUyBkZWNsOiAnICsgcmVwcihwcmVmaXgpKQorCisgICAgICAgIGRlZiBTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIoc2VsZik6CisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ1N0YXJ0IG9mIENEQVRBIHNlY3Rpb24nKQorCisgICAgICAgIGRlZiBFbmRDZGF0YVNlY3Rpb25IYW5kbGVyKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdFbmQgb2YgQ0RBVEEgc2VjdGlvbicpCisKKyAgICAgICAgZGVmIENvbW1lbnRIYW5kbGVyKHNlbGYsIHRleHQpOgorICAgICAgICAgICAgc2VsZi5vdXQuYXBwZW5kKCdDb21tZW50OiAnICsgcmVwcih0ZXh0KSkKKworICAgICAgICBkZWYgTm90YXRpb25EZWNsSGFuZGxlcihzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBuYW1lLCBiYXNlLCBzeXNpZCwgcHViaWQgPSBhcmdzCisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ05vdGF0aW9uIGRlY2xhcmVkOiAlcycgJShhcmdzLCkpCisKKyAgICAgICAgZGVmIFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgZW50aXR5TmFtZSwgYmFzZSwgc3lzdGVtSWQsIHB1YmxpY0lkLCBub3RhdGlvbk5hbWUgPSBhcmdzCisgICAgICAgICAgICBzZWxmLm91dC5hcHBlbmQoJ1VucGFyc2VkIGVudGl0eSBkZWNsOiAlcycgJShhcmdzLCkpCisKKyAgICAgICAgZGVmIE5vdFN0YW5kYWxvbmVIYW5kbGVyKHNlbGYsIHVzZXJEYXRhKToKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnTm90IHN0YW5kYWxvbmUnKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgICAgICBkZWYgRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIGNvbnRleHQsIGJhc2UsIHN5c0lkLCBwdWJJZCA9IGFyZ3MKKyAgICAgICAgICAgIHNlbGYub3V0LmFwcGVuZCgnRXh0ZXJuYWwgZW50aXR5IHJlZjogJXMnICUoYXJnc1sxOl0sKSkKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgZGVmIERlZmF1bHRIYW5kbGVyKHNlbGYsIHVzZXJEYXRhKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgRGVmYXVsdEhhbmRsZXJFeHBhbmQoc2VsZiwgdXNlckRhdGEpOgorICAgICAgICAgICAgcGFzcworCisgICAgaGFuZGxlcl9uYW1lcyA9IFsKKyAgICAgICAgJ1N0YXJ0RWxlbWVudEhhbmRsZXInLCAnRW5kRWxlbWVudEhhbmRsZXInLAorICAgICAgICAnQ2hhcmFjdGVyRGF0YUhhbmRsZXInLCAnUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlcicsCisgICAgICAgICdVbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyJywgJ05vdGF0aW9uRGVjbEhhbmRsZXInLAorICAgICAgICAnU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcicsICdFbmROYW1lc3BhY2VEZWNsSGFuZGxlcicsCisgICAgICAgICdDb21tZW50SGFuZGxlcicsICdTdGFydENkYXRhU2VjdGlvbkhhbmRsZXInLAorICAgICAgICAnRW5kQ2RhdGFTZWN0aW9uSGFuZGxlcicsCisgICAgICAgICdEZWZhdWx0SGFuZGxlcicsICdEZWZhdWx0SGFuZGxlckV4cGFuZCcsCisgICAgICAgICMnTm90U3RhbmRhbG9uZUhhbmRsZXInLAorICAgICAgICAnRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyJworICAgICAgICBdCisKKyAgICBkZWYgdGVzdF91dGY4KHNlbGYpOgorCisgICAgICAgIG91dCA9IHNlbGYuT3V0cHV0dGVyKCkKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9JyEnKQorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmhhbmRsZXJfbmFtZXM6CisgICAgICAgICAgICBzZXRhdHRyKHBhcnNlciwgbmFtZSwgZ2V0YXR0cihvdXQsIG5hbWUpKQorICAgICAgICBwYXJzZXIucmV0dXJuc191bmljb2RlID0gMAorICAgICAgICBwYXJzZXIuUGFyc2UoZGF0YSwgMSkKKworICAgICAgICAjIFZlcmlmeSBvdXRwdXQKKyAgICAgICAgb3AgPSBvdXQub3V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMF0sICdQSTogXCd4bWwtc3R5bGVzaGVldFwnIFwnaHJlZj0ic3R5bGVzaGVldC5jc3MiXCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzFdLCAiQ29tbWVudDogJyBjb21tZW50IGRhdGEgJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMl0sICJOb3RhdGlvbiBkZWNsYXJlZDogKCdub3RhdGlvbicsIE5vbmUsICdub3RhdGlvbi5qcGVnJywgTm9uZSkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzNdLCAiVW5wYXJzZWQgZW50aXR5IGRlY2w6ICgndW5wYXJzZWRfZW50aXR5JywgTm9uZSwgJ2VudGl0eS5maWxlJywgTm9uZSwgJ25vdGF0aW9uJykiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzRdLCAiU3RhcnQgZWxlbWVudDogJ3Jvb3QnIHsnYXR0cjEnOiAndmFsdWUxJywgJ2F0dHIyJzogJ3ZhbHVlMlxceGUxXFx4YmRcXHg4MCd9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs1XSwgIk5TIGRlY2w6ICdteW5zJyAnaHR0cDovL3d3dy5weXRob24ub3JnL25hbWVzcGFjZSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzZdLCAiU3RhcnQgZWxlbWVudDogJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9uYW1lc3BhY2Uhc3ViZWxlbWVudCcge30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzddLCAiQ2hhcmFjdGVyIGRhdGE6ICdDb250ZW50cyBvZiBzdWJlbGVtZW50cyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzhdLCAiRW5kIGVsZW1lbnQ6ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlIXN1YmVsZW1lbnQnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs5XSwgIkVuZCBvZiBOUyBkZWNsOiAnbXlucyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzEwXSwgIlN0YXJ0IGVsZW1lbnQ6ICdzdWIyJyB7fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTFdLCAnU3RhcnQgb2YgQ0RBVEEgc2VjdGlvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTJdLCAiQ2hhcmFjdGVyIGRhdGE6ICdjb250ZW50cyBvZiBDREFUQSBzZWN0aW9uJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTNdLCAnRW5kIG9mIENEQVRBIHNlY3Rpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzE0XSwgIkVuZCBlbGVtZW50OiAnc3ViMiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzE1XSwgIkV4dGVybmFsIGVudGl0eSByZWY6IChOb25lLCAnZW50aXR5LmZpbGUnLCBOb25lKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTZdLCAiRW5kIGVsZW1lbnQ6ICdyb290JyIpCisKKyAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorICAgICAgICAjIFRyeSB0aGUgcGFyc2UgYWdhaW4sIHRoaXMgdGltZSBwcm9kdWNpbmcgVW5pY29kZSBvdXRwdXQKKyAgICAgICAgb3V0ID0gc2VsZi5PdXRwdXR0ZXIoKQorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0nIScpCisgICAgICAgIHBhcnNlci5yZXR1cm5zX3VuaWNvZGUgPSAxCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuaGFuZGxlcl9uYW1lczoKKyAgICAgICAgICAgIHNldGF0dHIocGFyc2VyLCBuYW1lLCBnZXRhdHRyKG91dCwgbmFtZSkpCisKKyAgICAgICAgcGFyc2VyLlBhcnNlKGRhdGEsIDEpCisKKyAgICAgICAgb3AgPSBvdXQub3V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMF0sICdQSTogdVwneG1sLXN0eWxlc2hlZXRcJyB1XCdocmVmPSJzdHlsZXNoZWV0LmNzcyJcJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMV0sICJDb21tZW50OiB1JyBjb21tZW50IGRhdGEgJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMl0sICJOb3RhdGlvbiBkZWNsYXJlZDogKHUnbm90YXRpb24nLCBOb25lLCB1J25vdGF0aW9uLmpwZWcnLCBOb25lKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbM10sICJVbnBhcnNlZCBlbnRpdHkgZGVjbDogKHUndW5wYXJzZWRfZW50aXR5JywgTm9uZSwgdSdlbnRpdHkuZmlsZScsIE5vbmUsIHUnbm90YXRpb24nKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbNF0sICJTdGFydCBlbGVtZW50OiB1J3Jvb3QnIHt1J2F0dHIxJzogdSd2YWx1ZTEnLCB1J2F0dHIyJzogdSd2YWx1ZTJcXHUxZjQwJ30iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzVdLCAiTlMgZGVjbDogdSdteW5zJyB1J2h0dHA6Ly93d3cucHl0aG9uLm9yZy9uYW1lc3BhY2UnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs2XSwgIlN0YXJ0IGVsZW1lbnQ6IHUnaHR0cDovL3d3dy5weXRob24ub3JnL25hbWVzcGFjZSFzdWJlbGVtZW50JyB7fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbN10sICJDaGFyYWN0ZXIgZGF0YTogdSdDb250ZW50cyBvZiBzdWJlbGVtZW50cyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzhdLCAiRW5kIGVsZW1lbnQ6IHUnaHR0cDovL3d3dy5weXRob24ub3JnL25hbWVzcGFjZSFzdWJlbGVtZW50JyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbOV0sICJFbmQgb2YgTlMgZGVjbDogdSdteW5zJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTBdLCAiU3RhcnQgZWxlbWVudDogdSdzdWIyJyB7fSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTFdLCAnU3RhcnQgb2YgQ0RBVEEgc2VjdGlvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTJdLCAiQ2hhcmFjdGVyIGRhdGE6IHUnY29udGVudHMgb2YgQ0RBVEEgc2VjdGlvbiciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzEzXSwgJ0VuZCBvZiBDREFUQSBzZWN0aW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxNF0sICJFbmQgZWxlbWVudDogdSdzdWIyJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTVdLCAiRXh0ZXJuYWwgZW50aXR5IHJlZjogKE5vbmUsIHUnZW50aXR5LmZpbGUnLCBOb25lKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTZdLCAiRW5kIGVsZW1lbnQ6IHUncm9vdCciKQorCisgICAgZGVmIHRlc3RfcGFyc2VfZmlsZShzZWxmKToKKyAgICAgICAgIyBUcnkgcGFyc2luZyBhIGZpbGUKKyAgICAgICAgb3V0ID0gc2VsZi5PdXRwdXR0ZXIoKQorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0nIScpCisgICAgICAgIHBhcnNlci5yZXR1cm5zX3VuaWNvZGUgPSAxCisgICAgICAgIGZvciBuYW1lIGluIHNlbGYuaGFuZGxlcl9uYW1lczoKKyAgICAgICAgICAgIHNldGF0dHIocGFyc2VyLCBuYW1lLCBnZXRhdHRyKG91dCwgbmFtZSkpCisgICAgICAgIGZpbGUgPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorCisgICAgICAgIHBhcnNlci5QYXJzZUZpbGUoZmlsZSkKKworICAgICAgICBvcCA9IG91dC5vdXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFswXSwgJ1BJOiB1XCd4bWwtc3R5bGVzaGVldFwnIHVcJ2hyZWY9InN0eWxlc2hlZXQuY3NzIlwnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxXSwgIkNvbW1lbnQ6IHUnIGNvbW1lbnQgZGF0YSAnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsyXSwgIk5vdGF0aW9uIGRlY2xhcmVkOiAodSdub3RhdGlvbicsIE5vbmUsIHUnbm90YXRpb24uanBlZycsIE5vbmUpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFszXSwgIlVucGFyc2VkIGVudGl0eSBkZWNsOiAodSd1bnBhcnNlZF9lbnRpdHknLCBOb25lLCB1J2VudGl0eS5maWxlJywgTm9uZSwgdSdub3RhdGlvbicpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs0XSwgIlN0YXJ0IGVsZW1lbnQ6IHUncm9vdCcge3UnYXR0cjEnOiB1J3ZhbHVlMScsIHUnYXR0cjInOiB1J3ZhbHVlMlxcdTFmNDAnfSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbNV0sICJOUyBkZWNsOiB1J215bnMnIHUnaHR0cDovL3d3dy5weXRob24ub3JnL25hbWVzcGFjZSciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzZdLCAiU3RhcnQgZWxlbWVudDogdSdodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlIXN1YmVsZW1lbnQnIHt9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs3XSwgIkNoYXJhY3RlciBkYXRhOiB1J0NvbnRlbnRzIG9mIHN1YmVsZW1lbnRzJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbOF0sICJFbmQgZWxlbWVudDogdSdodHRwOi8vd3d3LnB5dGhvbi5vcmcvbmFtZXNwYWNlIXN1YmVsZW1lbnQnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFs5XSwgIkVuZCBvZiBOUyBkZWNsOiB1J215bnMnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMF0sICJTdGFydCBlbGVtZW50OiB1J3N1YjInIHt9IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMV0sICdTdGFydCBvZiBDREFUQSBzZWN0aW9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxMl0sICJDaGFyYWN0ZXIgZGF0YTogdSdjb250ZW50cyBvZiBDREFUQSBzZWN0aW9uJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3BbMTNdLCAnRW5kIG9mIENEQVRBIHNlY3Rpb24nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wWzE0XSwgIkVuZCBlbGVtZW50OiB1J3N1YjInIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxNV0sICJFeHRlcm5hbCBlbnRpdHkgcmVmOiAoTm9uZSwgdSdlbnRpdHkuZmlsZScsIE5vbmUpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcFsxNl0sICJFbmQgZWxlbWVudDogdSdyb290JyIpCisKKyAgICAgICAgIyBJc3N1ZSA0ODc3OiBleHBhdC5QYXJzZUZpbGUgY2F1c2VzIHNlZ2ZhdWx0IG9uIGEgY2xvc2VkIGZpbGUuCisgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAnd2InKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXJzZXIuUGFyc2VGaWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisKK2NsYXNzIE5hbWVzcGFjZVNlcGFyYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2xlZ2FsKHNlbGYpOgorICAgICAgICAjIFRlc3RzIHRoYXQgbWFrZSBzdXJlIHdlIGdldCBlcnJvcnMgd2hlbiB0aGUgbmFtZXNwYWNlX3NlcGFyYXRvciB2YWx1ZQorICAgICAgICAjIGlzIGlsbGVnYWwsIGFuZCB0aGF0IHdlIGRvbid0IGZvciBnb29kIHZhbHVlczoKKyAgICAgICAgZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9Tm9uZSkKKyAgICAgICAgZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9JyAnKQorCisgICAgZGVmIHRlc3RfaWxsZWdhbChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9NDIpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksCisgICAgICAgICAgICAgICAgJ1BhcnNlckNyZWF0ZSgpIGFyZ3VtZW50IDIgbXVzdCBiZSBzdHJpbmcgb3IgTm9uZSwgbm90IGludCcpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXhwYXQuUGFyc2VyQ3JlYXRlKG5hbWVzcGFjZV9zZXBhcmF0b3I9J3RvbyBsb25nJykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksCisgICAgICAgICAgICAgICAgJ25hbWVzcGFjZV9zZXBhcmF0b3IgbXVzdCBiZSBhdCBtb3N0IG9uZSBjaGFyYWN0ZXIsIG9taXR0ZWQsIG9yIE5vbmUnKQorCisgICAgZGVmIHRlc3RfemVyb19sZW5ndGgoc2VsZik6CisgICAgICAgICMgUGFyc2VyQ3JlYXRlKCkgbmVlZHMgdG8gYWNjZXB0IGEgbmFtZXNwYWNlX3NlcGFyYXRvciBvZiB6ZXJvIGxlbmd0aAorICAgICAgICAjIHRvIHNhdGlzZnkgdGhlIHJlcXVpcmVtZW50cyBvZiBSREYgYXBwbGljYXRpb25zIHRoYXQgYXJlIHJlcXVpcmVkCisgICAgICAgICMgdG8gc2ltcGx5IGdsdWUgdG9nZXRoZXIgdGhlIG5hbWVzcGFjZSBVUkkgYW5kIHRoZSBsb2NhbG5hbWUuICBUaG91Z2gKKyAgICAgICAgIyBjb25zaWRlcmVkIGEgd2FydCBvZiB0aGUgUkRGIHNwZWNpZmljYXRpb25zLCBpdCBuZWVkcyB0byBiZSBzdXBwb3J0ZWQuCisgICAgICAgICMKKyAgICAgICAgIyBTZWUgWE1MLVNJRyBtYWlsaW5nIGxpc3QgdGhyZWFkIHN0YXJ0aW5nIHdpdGgKKyAgICAgICAgIyBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC94bWwtc2lnLzIwMDEtQXByaWwvMDA1MjAyLmh0bWwKKyAgICAgICAgIworICAgICAgICBleHBhdC5QYXJzZXJDcmVhdGUobmFtZXNwYWNlX3NlcGFyYXRvcj0nJykgIyB0b28gc2hvcnQKKworCitjbGFzcyBJbnRlcm5pbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSBpbnRlcm5pbmcgbWFjaGluZXJ5LgorICAgICAgICBwID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGRlZiBjb2xsZWN0b3IobmFtZSwgKmFyZ3MpOgorICAgICAgICAgICAgTC5hcHBlbmQobmFtZSkKKyAgICAgICAgcC5TdGFydEVsZW1lbnRIYW5kbGVyID0gY29sbGVjdG9yCisgICAgICAgIHAuRW5kRWxlbWVudEhhbmRsZXIgPSBjb2xsZWN0b3IKKyAgICAgICAgcC5QYXJzZSgiPGU+IDxlLz4gPGU+PC9lPiA8L2U+IiwgMSkKKyAgICAgICAgdGFnID0gTFswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihMKSwgNikKKyAgICAgICAgZm9yIGVudHJ5IGluIEw6CisgICAgICAgICAgICAjIEwgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc3RyaW5nIHJlcGVhdGVkIG92ZXIgYW5kIG92ZXIuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGFnIGlzIGVudHJ5KQorCisKK2NsYXNzIEJ1ZmZlclRleHRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc3R1ZmYgPSBbXQorICAgICAgICBzZWxmLnBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHNlbGYucGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMQorICAgICAgICBzZWxmLnBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuQ2hhcmFjdGVyRGF0YUhhbmRsZXIKKworICAgIGRlZiBjaGVjayhzZWxmLCBleHBlY3RlZCwgbGFiZWwpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICIlc1xuc3R1ZmYgICAgPSAlclxuZXhwZWN0ZWQgPSAlciIKKyAgICAgICAgICAgICAgICAlIChsYWJlbCwgc2VsZi5zdHVmZiwgbWFwKHVuaWNvZGUsIGV4cGVjdGVkKSkpCisKKyAgICBkZWYgQ2hhcmFjdGVyRGF0YUhhbmRsZXIoc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYuc3R1ZmYuYXBwZW5kKHRleHQpCisKKyAgICBkZWYgU3RhcnRFbGVtZW50SGFuZGxlcihzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIHNlbGYuc3R1ZmYuYXBwZW5kKCI8JXM+IiAlIG5hbWUpCisgICAgICAgIGJ0ID0gYXR0cnMuZ2V0KCJidWZmZXItdGV4dCIpCisgICAgICAgIGlmIGJ0ID09ICJ5ZXMiOgorICAgICAgICAgICAgc2VsZi5wYXJzZXIuYnVmZmVyX3RleHQgPSAxCisgICAgICAgIGVsaWYgYnQgPT0gIm5vIjoKKyAgICAgICAgICAgIHNlbGYucGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMAorCisgICAgZGVmIEVuZEVsZW1lbnRIYW5kbGVyKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnN0dWZmLmFwcGVuZCgiPC8lcz4iICUgbmFtZSkKKworICAgIGRlZiBDb21tZW50SGFuZGxlcihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5zdHVmZi5hcHBlbmQoIjwhLS0lcy0tPiIgJSBkYXRhKQorCisgICAgZGVmIHNldEhhbmRsZXJzKHNlbGYsIGhhbmRsZXJzPVtdKToKKyAgICAgICAgZm9yIG5hbWUgaW4gaGFuZGxlcnM6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYucGFyc2VyLCBuYW1lLCBnZXRhdHRyKHNlbGYsIG5hbWUpKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF90b19kaXNhYmxlZChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZXIuYnVmZmVyX3RleHQpCisKKyAgICBkZWYgdGVzdF9idWZmZXJpbmdfZW5hYmxlZChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYnVmZmVyaW5nIGlzIHR1cm5lZCBvbgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuYnVmZmVyX3RleHQpCisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIvPjI8Yy8+MzwvYT4iLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsIFsnMTIzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcmVkIHRleHQgbm90IHByb3Blcmx5IGNvbGxhcHNlZCIpCisKKyAgICBkZWYgdGVzdDEoc2VsZik6CisgICAgICAgICMgWFhYIFRoaXMgdGVzdCBleHBvc2VzIG1vcmUgZGV0YWlsIG9mIEV4cGF0J3MgdGV4dCBjaHVua2luZyB0aGFuIHdlCisgICAgICAgICMgWFhYIGxpa2UsIGJ1dCBpdCB0ZXN0cyB3aGF0IHdlIG5lZWQgdG8gY29uY2lzZWx5LgorICAgICAgICBzZWxmLnNldEhhbmRsZXJzKFsiU3RhcnRFbGVtZW50SGFuZGxlciJdKQorICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSgiPGE+MTxiIGJ1ZmZlci10ZXh0PSdubycvPjJcbjM8YyBidWZmZXItdGV4dD0neWVzJy8+NFxuNTwvYT4iLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyI8YT4iLCAiMSIsICI8Yj4iLCAiMiIsICJcbiIsICIzIiwgIjxjPiIsICI0XG41Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcmluZyBjb250cm9sIG5vdCByZWFjdGluZyBhcyBleHBlY3RlZCIpCisKKyAgICBkZWYgdGVzdDIoc2VsZik6CisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIvPiZsdDsyJmd0OzxjLz4mIzMyO1xuJiN4MjA7MzwvYT4iLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsIFsiMTwyPiBcbiAzIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcmVkIHRleHQgbm90IHByb3Blcmx5IGNvbGxhcHNlZCIpCisKKyAgICBkZWYgdGVzdDMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0SGFuZGxlcnMoWyJTdGFydEVsZW1lbnRIYW5kbGVyIl0pCisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIvPjI8Yy8+MzwvYT4iLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsIFsiPGE+IiwgIjEiLCAiPGI+IiwgIjIiLCAiPGM+IiwgIjMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcmVkIHRleHQgbm90IHByb3Blcmx5IHNwbGl0IikKKworICAgIGRlZiB0ZXN0NChzZWxmKToKKyAgICAgICAgc2VsZi5zZXRIYW5kbGVycyhbIlN0YXJ0RWxlbWVudEhhbmRsZXIiLCAiRW5kRWxlbWVudEhhbmRsZXIiXSkKKyAgICAgICAgc2VsZi5wYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBOb25lCisgICAgICAgIHNlbGYucGFyc2VyLlBhcnNlKCI8YT4xPGIvPjI8Yy8+MzwvYT4iLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyI8YT4iLCAiPGI+IiwgIjwvYj4iLCAiPGM+IiwgIjwvYz4iLCAiPC9hPiJdKQorCisgICAgZGVmIHRlc3Q1KHNlbGYpOgorICAgICAgICBzZWxmLnNldEhhbmRsZXJzKFsiU3RhcnRFbGVtZW50SGFuZGxlciIsICJFbmRFbGVtZW50SGFuZGxlciJdKQorICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSgiPGE+MTxiPjwvYj4yPGMvPjM8L2E+IiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0dWZmLAorICAgICAgICAgICAgWyI8YT4iLCAiMSIsICI8Yj4iLCAiPC9iPiIsICIyIiwgIjxjPiIsICI8L2M+IiwgIjMiLCAiPC9hPiJdKQorCisgICAgZGVmIHRlc3Q2KHNlbGYpOgorICAgICAgICBzZWxmLnNldEhhbmRsZXJzKFsiQ29tbWVudEhhbmRsZXIiLCAiRW5kRWxlbWVudEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAiU3RhcnRFbGVtZW50SGFuZGxlciJdKQorICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSgiPGE+MTxiLz4yPGM+PC9jPjM0NTwvYT4gIiwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0dWZmLAorICAgICAgICAgICAgWyI8YT4iLCAiMSIsICI8Yj4iLCAiPC9iPiIsICIyIiwgIjxjPiIsICI8L2M+IiwgIjM0NSIsICI8L2E+Il0sCisgICAgICAgICAgICAiYnVmZmVyZWQgdGV4dCBub3QgcHJvcGVybHkgc3BsaXQiKQorCisgICAgZGVmIHRlc3Q3KHNlbGYpOgorICAgICAgICBzZWxmLnNldEhhbmRsZXJzKFsiQ29tbWVudEhhbmRsZXIiLCAiRW5kRWxlbWVudEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAiU3RhcnRFbGVtZW50SGFuZGxlciJdKQorICAgICAgICBzZWxmLnBhcnNlci5QYXJzZSgiPGE+MTxiLz4yPGM+PC9jPjM8IS0tYWJjLS0+NDwhLS1kZWYtLT41PC9hPiAiLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3R1ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyI8YT4iLCAiMSIsICI8Yj4iLCAiPC9iPiIsICIyIiwgIjxjPiIsICI8L2M+IiwgIjMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiPCEtLWFiYy0tPiIsICI0IiwgIjwhLS1kZWYtLT4iLCAiNSIsICI8L2E+Il0sCisgICAgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcmVkIHRleHQgbm90IHByb3Blcmx5IHNwbGl0IikKKworCisjIFRlc3QgaGFuZGxpbmcgb2YgZXhjZXB0aW9uIGZyb20gY2FsbGJhY2s6CitjbGFzcyBIYW5kbGVyRXhjZXB0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIFN0YXJ0RWxlbWVudEhhbmRsZXIoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IobmFtZSkKKworICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuU3RhcnRFbGVtZW50SGFuZGxlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIuUGFyc2UoIjxhPjxiPjxjLz48L2I+PC9hPiIsIDEpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sICdhJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIFJ1bnRpbWVFcnJvciBmb3IgZWxlbWVudCAnYScsIGJ1dCIgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZm91bmQgJXIiICUgZS5hcmdzWzBdKQorCisKKyMgVGVzdCBDdXJyZW50KiBtZW1iZXJzOgorY2xhc3MgUG9zaXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgU3RhcnRFbGVtZW50SGFuZGxlcihzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIHNlbGYuY2hlY2tfcG9zKCdzJykKKworICAgIGRlZiBFbmRFbGVtZW50SGFuZGxlcihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5jaGVja19wb3MoJ2UnKQorCisgICAgZGVmIGNoZWNrX3BvcyhzZWxmLCBldmVudCk6CisgICAgICAgIHBvcyA9IChldmVudCwKKyAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLkN1cnJlbnRCeXRlSW5kZXgsCisgICAgICAgICAgICAgICBzZWxmLnBhcnNlci5DdXJyZW50TGluZU51bWJlciwKKyAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLkN1cnJlbnRDb2x1bW5OdW1iZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnVwdG8gPCBsZW4oc2VsZi5leHBlY3RlZF9saXN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICd0b28gbWFueSBwYXJzZXIgZXZlbnRzJykKKyAgICAgICAgZXhwZWN0ZWQgPSBzZWxmLmV4cGVjdGVkX2xpc3Rbc2VsZi51cHRvXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvcywgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgJ0V4cGVjdGVkIHBvc2l0aW9uICVzLCBnb3QgcG9zaXRpb24gJXMnICUocG9zLCBleHBlY3RlZCkpCisgICAgICAgIHNlbGYudXB0byArPSAxCisKKyAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBzZWxmLnBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5TdGFydEVsZW1lbnRIYW5kbGVyCisgICAgICAgIHNlbGYucGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5FbmRFbGVtZW50SGFuZGxlcgorICAgICAgICBzZWxmLnVwdG8gPSAwCisgICAgICAgIHNlbGYuZXhwZWN0ZWRfbGlzdCA9IFsoJ3MnLCAwLCAxLCAwKSwgKCdzJywgNSwgMiwgMSksICgncycsIDExLCAzLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnZScsIDE1LCAzLCA2KSwgKCdlJywgMTcsIDQsIDEpLCAoJ2UnLCAyMiwgNSwgMCldCisKKyAgICAgICAgeG1sID0gJzxhPlxuIDxiPlxuICA8Yy8+XG4gPC9iPlxuPC9hPicKKyAgICAgICAgc2VsZi5wYXJzZXIuUGFyc2UoeG1sLCAxKQorCisKK2NsYXNzIHNmMTI5NjQzM1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3BhcnNlX29ubHlfeG1sX2RhdGEoc2VsZik6CisgICAgICAgICMgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTI5NjQzMworICAgICAgICAjCisgICAgICAgIHhtbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc284ODU5Jz8+PHM+JXM8L3M+IiAlICgnYScgKiAxMDI1KQorICAgICAgICAjIHRoaXMgb25lIGRvZXNuJ3QgY3Jhc2gKKyAgICAgICAgI3htbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMDAwKQorCisgICAgICAgIGNsYXNzIFNwZWNpZmljRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIGhhbmRsZXIodGV4dCk6CisgICAgICAgICAgICByYWlzZSBTcGVjaWZpY0V4Y2VwdGlvbgorCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IGhhbmRsZXIKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb24sIHBhcnNlci5QYXJzZSwgeG1sKQorCitjbGFzcyBDaGFyZGF0YUJ1ZmZlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIgorICAgIHRlc3Qgc2V0dGluZyBvZiBjaGFyZGF0YSBidWZmZXIgc2l6ZQorICAgICIiIgorCisgICAgZGVmIHRlc3RfMTAyNV9ieXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNtYWxsX2J1ZmZlcl90ZXN0KDEwMjUpLCAyKQorCisgICAgZGVmIHRlc3RfMTAwMF9ieXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNtYWxsX2J1ZmZlcl90ZXN0KDEwMDApLCAxKQorCisgICAgZGVmIHRlc3Rfd3Jvbmdfc2l6ZShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMQorICAgICAgICBkZWYgZihzaXplKToKKyAgICAgICAgICAgIHBhcnNlci5idWZmZXJfc2l6ZSA9IHNpemUKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYsIHN5cy5tYXhpbnQrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZiwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYsIDApCisKKyAgICBkZWYgdGVzdF91bmNoYW5nZWRfc2l6ZShzZWxmKToKKyAgICAgICAgeG1sMSA9ICgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvODg1OSc/PjxzPiVzIiAlICgnYScgKiA1MTIpKQorICAgICAgICB4bWwyID0gJ2EnKjUxMiArICc8L3M+JworICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLmNvdW50aW5nX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl9zaXplID0gNTEyCisgICAgICAgIHBhcnNlci5idWZmZXJfdGV4dCA9IDEKKworICAgICAgICAjIEZlZWQgNTEyIGJ5dGVzIG9mIGNoYXJhY3RlciBkYXRhOiB0aGUgaGFuZGxlciBzaG91bGQgYmUgY2FsbGVkCisgICAgICAgICMgb25jZS4KKyAgICAgICAgc2VsZi5uID0gMAorICAgICAgICBwYXJzZXIuUGFyc2UoeG1sMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm4sIDEpCisKKyAgICAgICAgIyBSZWFzc2lnbiB0byBidWZmZXJfc2l6ZSwgYnV0IGFzc2lnbiB0aGUgc2FtZSBzaXplLgorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgPSBwYXJzZXIuYnVmZmVyX3NpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm4sIDEpCisKKyAgICAgICAgIyBUcnkgcGFyc2luZyByZXN0IG9mIHRoZSBkb2N1bWVudAorICAgICAgICBwYXJzZXIuUGFyc2UoeG1sMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm4sIDIpCisKKworICAgIGRlZiB0ZXN0X2Rpc2FibGluZ19idWZmZXIoc2VsZik6CisgICAgICAgIHhtbDEgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvODg1OSc/PjxhPiVzIiAlICgnYScgKiA1MTIpCisgICAgICAgIHhtbDIgPSAoJ2InICogMTAyNCkKKyAgICAgICAgeG1sMyA9ICIlczwvYT4iICUgKCdjJyAqIDEwMjQpCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuY291bnRpbmdfaGFuZGxlcgorICAgICAgICBwYXJzZXIuYnVmZmVyX3RleHQgPSAxCisgICAgICAgIHBhcnNlci5idWZmZXJfc2l6ZSA9IDEwMjQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuYnVmZmVyX3NpemUsIDEwMjQpCisKKyAgICAgICAgIyBQYXJzZSBvbmUgY2h1bmsgb2YgWE1MCisgICAgICAgIHNlbGYubiA9IDAKKyAgICAgICAgcGFyc2VyLlBhcnNlKHhtbDEsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmJ1ZmZlcl9zaXplLCAxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubiwgMSkKKworICAgICAgICAjIFR1cm4gb2ZmIGJ1ZmZlcmluZyBhbmQgcGFyc2UgdGhlIG5leHQgY2h1bmsuCisgICAgICAgIHBhcnNlci5idWZmZXJfdGV4dCA9IDAKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwYXJzZXIuYnVmZmVyX3RleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmJ1ZmZlcl9zaXplLCAxMDI0KQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICBwYXJzZXIuUGFyc2UoeG1sMiwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm4sIDExKQorCisgICAgICAgIHBhcnNlci5idWZmZXJfdGV4dCA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlci5idWZmZXJfdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuYnVmZmVyX3NpemUsIDEwMjQpCisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwzLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubiwgMTIpCisKKworCisgICAgZGVmIG1ha2VfZG9jdW1lbnQoc2VsZiwgYnl0ZXMpOgorICAgICAgICByZXR1cm4gKCI8P3htbCB2ZXJzaW9uPScxLjAnPz48dGFnPiIgKyBieXRlcyAqICdhJyArICc8L3RhZz4nKQorCisgICAgZGVmIGNvdW50aW5nX2hhbmRsZXIoc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYubiArPSAxCisKKyAgICBkZWYgc21hbGxfYnVmZmVyX3Rlc3Qoc2VsZiwgYnVmZmVyX2xlbik6CisgICAgICAgIHhtbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc284ODU5Jz8+PHM+JXM8L3M+IiAlICgnYScgKiBidWZmZXJfbGVuKQorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLmNvdW50aW5nX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl9zaXplID0gMTAyNAorICAgICAgICBwYXJzZXIuYnVmZmVyX3RleHQgPSAxCisKKyAgICAgICAgc2VsZi5uID0gMAorICAgICAgICBwYXJzZXIuUGFyc2UoeG1sKQorICAgICAgICByZXR1cm4gc2VsZi5uCisKKyAgICBkZWYgdGVzdF9jaGFuZ2Vfc2l6ZV8xKHNlbGYpOgorICAgICAgICB4bWwxID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzbzg4NTknPz48YT48cz4lcyIgJSAoJ2EnICogMTAyNCkKKyAgICAgICAgeG1sMiA9ICJhYWE8L3M+PHM+JXM8L3M+PC9hPiIgJSAoJ2EnICogMTAyNSkKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gc2VsZi5jb3VudGluZ19oYW5kbGVyCisgICAgICAgIHBhcnNlci5idWZmZXJfdGV4dCA9IDEKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl9zaXplID0gMTAyNAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5idWZmZXJfc2l6ZSwgMTAyNCkKKworICAgICAgICBzZWxmLm4gPSAwCisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwxLCAwKQorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgKj0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5idWZmZXJfc2l6ZSwgMjA0OCkKKyAgICAgICAgcGFyc2VyLlBhcnNlKHhtbDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uLCAyKQorCisgICAgZGVmIHRlc3RfY2hhbmdlX3NpemVfMihzZWxmKToKKyAgICAgICAgeG1sMSA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc284ODU5Jz8+PGE+YTxzPiVzIiAlICgnYScgKiAxMDIzKQorICAgICAgICB4bWwyID0gImFhYTwvcz48cz4lczwvcz48L2E+IiAlICgnYScgKiAxMDI1KQorICAgICAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQorICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLmNvdW50aW5nX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMQorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgPSAyMDQ4CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmJ1ZmZlcl9zaXplLCAyMDQ4KQorCisgICAgICAgIHNlbGYubj0wCisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwxLCAwKQorICAgICAgICBwYXJzZXIuYnVmZmVyX3NpemUgLy89IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuYnVmZmVyX3NpemUsIDEwMjQpCisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwyLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubiwgNCkKKworY2xhc3MgTWFsZm9ybWVkSW5wdXRUZXh0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdDEoc2VsZik6CisgICAgICAgIHhtbCA9ICJcMFxyXG4iCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZSh4bWwsIFRydWUpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgZXhwYXQuRXhwYXRFcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICd1bmNsb3NlZCB0b2tlbjogbGluZSAyLCBjb2x1bW4gMCcpCisKKyAgICBkZWYgdGVzdDIoc2VsZik6CisgICAgICAgIHhtbCA9ICI8P3htbCB2ZXJzaW9uXHhjMlx4ODU9JzEuMCc/PlxyXG4iCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZSh4bWwsIFRydWUpCisgICAgICAgICAgICBzZWxmLmZhaWwoKQorICAgICAgICBleGNlcHQgZXhwYXQuRXhwYXRFcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICdYTUwgZGVjbGFyYXRpb24gbm90IHdlbGwtZm9ybWVkOiBsaW5lIDEsIGNvbHVtbiAxNCcpCisKK2NsYXNzIEZvcmVpZ25EVERUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiCisgICAgVGVzdHMgZm9yIHRoZSBVc2VGb3JlaWduRFREIG1ldGhvZCBvZiBleHBhdCBwYXJzZXIgb2JqZWN0cy4KKyAgICAiIiIKKyAgICBkZWYgdGVzdF91c2VfZm9yZWlnbl9kdGQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJZiBVc2VGb3JlaWduRFREIGlzIHBhc3NlZCBUcnVlIGFuZCBhIGRvY3VtZW50IHdpdGhvdXQgYW4gZXh0ZXJuYWwKKyAgICAgICAgZW50aXR5IHJlZmVyZW5jZSBpcyBwYXJzZWQsIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciBpcyBmaXJzdCBjYWxsZWQKKyAgICAgICAgd2l0aCBOb25lIGZvciB0aGUgcHVibGljIGFuZCBzeXN0ZW0gaWRzLgorICAgICAgICAiIiIKKyAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MgPSBbXQorICAgICAgICBkZWYgcmVzb2x2ZV9lbnRpdHkoY29udGV4dCwgYmFzZSwgc3lzdGVtX2lkLCBwdWJsaWNfaWQpOgorICAgICAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MuYXBwZW5kKChwdWJsaWNfaWQsIHN5c3RlbV9pZCkpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5Vc2VGb3JlaWduRFREKFRydWUpCisgICAgICAgIHBhcnNlci5TZXRQYXJhbUVudGl0eVBhcnNpbmcoZXhwYXQuWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUykKKyAgICAgICAgcGFyc2VyLkV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IHJlc29sdmVfZW50aXR5CisgICAgICAgIHBhcnNlci5QYXJzZSgiPD94bWwgdmVyc2lvbj0nMS4wJz8+PGVsZW1lbnQvPiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlcl9jYWxsX2FyZ3MsIFsoTm9uZSwgTm9uZSldKQorCisgICAgICAgICMgdGVzdCBVc2VGb3JlaWduRFREKCkgaXMgZXF1YWwgdG8gVXNlRm9yZWlnbkRURChUcnVlKQorICAgICAgICBoYW5kbGVyX2NhbGxfYXJnc1s6XSA9IFtdCisKKyAgICAgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICAgICAgcGFyc2VyLlVzZUZvcmVpZ25EVEQoKQorICAgICAgICBwYXJzZXIuU2V0UGFyYW1FbnRpdHlQYXJzaW5nKGV4cGF0LlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19BTFdBWVMpCisgICAgICAgIHBhcnNlci5FeHRlcm5hbEVudGl0eVJlZkhhbmRsZXIgPSByZXNvbHZlX2VudGl0eQorICAgICAgICBwYXJzZXIuUGFyc2UoIjw/eG1sIHZlcnNpb249JzEuMCc/PjxlbGVtZW50Lz4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXJfY2FsbF9hcmdzLCBbKE5vbmUsIE5vbmUpXSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZV91c2VfZm9yZWlnbl9kdGQoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJZiBVc2VGb3JlaWduRFREIGlzIHBhc3NlZCBUcnVlIGFuZCBhIGRvY3VtZW50IHdpdGggYW4gZXh0ZXJuYWwKKyAgICAgICAgZW50aXR5IHJlZmVyZW5jZSBpcyBwYXJzZWQsIEV4dGVybmFsRW50aXR5UmVmSGFuZGxlciBpcyBjYWxsZWQgd2l0aAorICAgICAgICB0aGUgcHVibGljIGFuZCBzeXN0ZW0gaWRzIGZyb20gdGhlIGRvY3VtZW50LgorICAgICAgICAiIiIKKyAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MgPSBbXQorICAgICAgICBkZWYgcmVzb2x2ZV9lbnRpdHkoY29udGV4dCwgYmFzZSwgc3lzdGVtX2lkLCBwdWJsaWNfaWQpOgorICAgICAgICAgICAgaGFuZGxlcl9jYWxsX2FyZ3MuYXBwZW5kKChwdWJsaWNfaWQsIHN5c3RlbV9pZCkpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZSgpCisgICAgICAgIHBhcnNlci5Vc2VGb3JlaWduRFREKFRydWUpCisgICAgICAgIHBhcnNlci5TZXRQYXJhbUVudGl0eVBhcnNpbmcoZXhwYXQuWE1MX1BBUkFNX0VOVElUWV9QQVJTSU5HX0FMV0FZUykKKyAgICAgICAgcGFyc2VyLkV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IHJlc29sdmVfZW50aXR5CisgICAgICAgIHBhcnNlci5QYXJzZSgKKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPScxLjAnPz48IURPQ1RZUEUgZm9vIFBVQkxJQyAnYmFyJyAnYmF6Jz48ZWxlbWVudC8+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyX2NhbGxfYXJncywgWygiYmFyIiwgImJheiIpXSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFNldEF0dHJpYnV0ZVRlc3QsCisgICAgICAgICAgICAgICAgIFBhcnNlVGVzdCwKKyAgICAgICAgICAgICAgICAgTmFtZXNwYWNlU2VwYXJhdG9yVGVzdCwKKyAgICAgICAgICAgICAgICAgSW50ZXJuaW5nVGVzdCwKKyAgICAgICAgICAgICAgICAgQnVmZmVyVGV4dFRlc3QsCisgICAgICAgICAgICAgICAgIEhhbmRsZXJFeGNlcHRpb25UZXN0LAorICAgICAgICAgICAgICAgICBQb3NpdGlvblRlc3QsCisgICAgICAgICAgICAgICAgIHNmMTI5NjQzM1Rlc3QsCisgICAgICAgICAgICAgICAgIENoYXJkYXRhQnVmZmVyVGVzdCwKKyAgICAgICAgICAgICAgICAgTWFsZm9ybWVkSW5wdXRUZXh0LAorICAgICAgICAgICAgICAgICBGb3JlaWduRFREVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZXhwYXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhZTliNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZXhwYXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZXhwYXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcHlleHBhdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhZTliNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3B5ZXhwYXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVldWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRhNGFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5CkBAIC0wLDAgKzEsMzI1IEBACisjIFNvbWUgc2ltcGxlIHF1ZXVlIG1vZHVsZSB0ZXN0cywgcGx1cyBzb21lIGZhaWx1cmUgY29uZGl0aW9ucworIyB0byBlbnN1cmUgdGhlIFF1ZXVlIGxvY2tzIHJlbWFpbiBzdGFibGUuCitpbXBvcnQgUXVldWUKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKKworUVVFVUVfU0laRSA9IDUKKworIyBBIHRocmVhZCB0byBydW4gYSBmdW5jdGlvbiB0aGF0IHVuY2xvZ3MgYSBibG9ja2VkIFF1ZXVlLgorY2xhc3MgX1RyaWdnZXJUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZuLCBhcmdzKToKKyAgICAgICAgc2VsZi5mbiA9IGZuCisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKyAgICAgICAgc2VsZi5zdGFydGVkRXZlbnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjIFRoZSBzbGVlcCBpc24ndCBuZWNlc3NhcnksIGJ1dCBpcyBpbnRlbmRlZCB0byBnaXZlIHRoZSBibG9ja2luZworICAgICAgICAjIGZ1bmN0aW9uIGluIHRoZSBtYWluIHRocmVhZCBhIGNoYW5jZSBhdCBhY3R1YWxseSBibG9ja2luZyBiZWZvcmUKKyAgICAgICAgIyB3ZSB1bmNsb2cgaXQuICBCdXQgaWYgdGhlIHNsZWVwIGlzIGxvbmdlciB0aGFuIHRoZSB0aW1lb3V0LWJhc2VkCisgICAgICAgICMgdGVzdHMgd2FpdCBpbiB0aGVpciBibG9ja2luZyBmdW5jdGlvbnMsIHRob3NlIHRlc3RzIHdpbGwgZmFpbC4KKyAgICAgICAgIyBTbyB3ZSBnaXZlIHRoZW0gbXVjaCBsb25nZXIgdGltZW91dCB2YWx1ZXMgY29tcGFyZWQgdG8gdGhlCisgICAgICAgICMgc2xlZXAgaGVyZSAoSSBhaW1lZCBhdCAxMCBzZWNvbmRzIGZvciBibG9ja2luZyBmdW5jdGlvbnMgLS0KKyAgICAgICAgIyB0aGV5IHNob3VsZCBuZXZlciBhY3R1YWxseSB3YWl0IHRoYXQgbG9uZyAtIHRoZXkgc2hvdWxkIG1ha2UKKyAgICAgICAgIyBwcm9ncmVzcyBhcyBzb29uIGFzIHdlIGNhbGwgc2VsZi5mbigpKS4KKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIHNlbGYuc3RhcnRlZEV2ZW50LnNldCgpCisgICAgICAgIHNlbGYuZm4oKnNlbGYuYXJncykKKworCisjIEV4ZWN1dGUgYSBmdW5jdGlvbiB0aGF0IGJsb2NrcywgYW5kIGluIGEgc2VwYXJhdGUgdGhyZWFkLCBhIGZ1bmN0aW9uIHRoYXQKKyMgdHJpZ2dlcnMgdGhlIHJlbGVhc2UuICBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIGJsb2NraW5nIGZ1bmN0aW9uLiAgQ2F1dGlvbjoKKyMgYmxvY2tfZnVuYyBtdXN0IGd1YXJhbnRlZSB0byBibG9jayB1bnRpbCB0cmlnZ2VyX2Z1bmMgaXMgY2FsbGVkLCBhbmQKKyMgdHJpZ2dlcl9mdW5jIG11c3QgZ3VhcmFudGVlIHRvIGNoYW5nZSBxdWV1ZSBzdGF0ZSBzbyB0aGF0IGJsb2NrX2Z1bmMgY2FuIG1ha2UKKyMgZW5vdWdoIHByb2dyZXNzIHRvIHJldHVybi4gIEluIHBhcnRpY3VsYXIsIGEgYmxvY2tfZnVuYyB0aGF0IGp1c3QgcmFpc2VzIGFuCisjIGV4Y2VwdGlvbiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdHJpZ2dlcl9mdW5jIGlzIGNhbGxlZCB3aWxsIGxlYWQgdG8KKyMgdGltaW5nLWRlcGVuZGVudCBzcG9yYWRpYyBmYWlsdXJlcywgYW5kIG9uZSBvZiB0aG9zZSB3ZW50IHJhcmVseSBzZWVuIGJ1dAorIyB1bmRpYWdub3NlZCBmb3IgeWVhcnMuICBOb3cgYmxvY2tfZnVuYyBtdXN0IGJlIHVuZXhjZXB0aW9uYWwuICBJZiBibG9ja19mdW5jCisjIGlzIHN1cHBvc2VkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiwgY2FsbCBkb19leGNlcHRpb25hbF9ibG9ja2luZ190ZXN0KCkKKyMgaW5zdGVhZC4KKworY2xhc3MgQmxvY2tpbmdUZXN0TWl4aW46CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYudCA9IE5vbmUKKworICAgIGRlZiBkb19ibG9ja2luZ190ZXN0KHNlbGYsIGJsb2NrX2Z1bmMsIGJsb2NrX2FyZ3MsIHRyaWdnZXJfZnVuYywgdHJpZ2dlcl9hcmdzKToKKyAgICAgICAgc2VsZi50ID0gX1RyaWdnZXJUaHJlYWQodHJpZ2dlcl9mdW5jLCB0cmlnZ2VyX2FyZ3MpCisgICAgICAgIHNlbGYudC5zdGFydCgpCisgICAgICAgIHNlbGYucmVzdWx0ID0gYmxvY2tfZnVuYygqYmxvY2tfYXJncykKKyAgICAgICAgIyBJZiBibG9ja19mdW5jIHJldHVybmVkIGJlZm9yZSBvdXIgdGhyZWFkIG1hZGUgdGhlIGNhbGwsIHdlIGZhaWxlZCEKKyAgICAgICAgaWYgbm90IHNlbGYudC5zdGFydGVkRXZlbnQuaXNfc2V0KCk6CisgICAgICAgICAgICBzZWxmLmZhaWwoImJsb2NraW5nIGZ1bmN0aW9uICclcicgYXBwZWFyZWQgbm90IHRvIGJsb2NrIiAlCisgICAgICAgICAgICAgICAgICAgICAgYmxvY2tfZnVuYykKKyAgICAgICAgc2VsZi50LmpvaW4oMTApICMgbWFrZSBzdXJlIHRoZSB0aHJlYWQgdGVybWluYXRlcworICAgICAgICBpZiBzZWxmLnQuaXNfYWxpdmUoKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgidHJpZ2dlciBmdW5jdGlvbiAnJXInIGFwcGVhcmVkIHRvIG5vdCByZXR1cm4iICUKKyAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyX2Z1bmMpCisgICAgICAgIHJldHVybiBzZWxmLnJlc3VsdAorCisgICAgIyBDYWxsIHRoaXMgaW5zdGVhZCBpZiBibG9ja19mdW5jIGlzIHN1cHBvc2VkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KKyAgICBkZWYgZG9fZXhjZXB0aW9uYWxfYmxvY2tpbmdfdGVzdChzZWxmLGJsb2NrX2Z1bmMsIGJsb2NrX2FyZ3MsIHRyaWdnZXJfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcl9hcmdzLCBleHBlY3RlZF9leGNlcHRpb25fY2xhc3MpOgorICAgICAgICBzZWxmLnQgPSBfVHJpZ2dlclRocmVhZCh0cmlnZ2VyX2Z1bmMsIHRyaWdnZXJfYXJncykKKyAgICAgICAgc2VsZi50LnN0YXJ0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJsb2NrX2Z1bmMoKmJsb2NrX2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgZXhwZWN0ZWRfZXhjZXB0aW9uX2NsYXNzOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgZXhjZXB0aW9uIG9mIGtpbmQgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2V4Y2VwdGlvbl9jbGFzcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudC5qb2luKDEwKSAjIG1ha2Ugc3VyZSB0aGUgdGhyZWFkIHRlcm1pbmF0ZXMKKyAgICAgICAgICAgIGlmIHNlbGYudC5pc19hbGl2ZSgpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidHJpZ2dlciBmdW5jdGlvbiAnJXInIGFwcGVhcmVkIHRvIG5vdCByZXR1cm4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJfZnVuYykKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnQuc3RhcnRlZEV2ZW50LmlzX3NldCgpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgidHJpZ2dlciB0aHJlYWQgZW5kZWQgYnV0IGV2ZW50IG5ldmVyIHNldCIpCisKKworY2xhc3MgQmFzZVF1ZXVlVGVzdChCbG9ja2luZ1Rlc3RNaXhpbik6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmN1bSA9IDAKKyAgICAgICAgc2VsZi5jdW1sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorCisgICAgZGVmIHNpbXBsZV9xdWV1ZV90ZXN0KHNlbGYsIHEpOgorICAgICAgICBpZiBub3QgcS5lbXB0eSgpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiQ2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggYW4gZW1wdHkgcXVldWUiCisgICAgICAgICMgSSBndWVzcyB3ZSBiZXR0ZXIgY2hlY2sgdGhpbmdzIGFjdHVhbGx5IHF1ZXVlIGNvcnJlY3RseSBhIGxpdHRsZSA6KQorICAgICAgICBxLnB1dCgxMTEpCisgICAgICAgIHEucHV0KDMzMykKKyAgICAgICAgcS5wdXQoMjIyKQorICAgICAgICB0YXJnZXRfb3JkZXIgPSBkaWN0KFF1ZXVlID0gWzExMSwgMzMzLCAyMjJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpZm9RdWV1ZSA9IFsyMjIsIDMzMywgMTExXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eVF1ZXVlID0gWzExMSwgMjIyLCAzMzNdKQorICAgICAgICBhY3R1YWxfb3JkZXIgPSBbcS5nZXQoKSwgcS5nZXQoKSwgcS5nZXQoKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWxfb3JkZXIsIHRhcmdldF9vcmRlcltxLl9fY2xhc3NfXy5fX25hbWVfX10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZG4ndCBzZWVtIHRvIHF1ZXVlIHRoZSBjb3JyZWN0IGRhdGEhIikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoUVVFVUVfU0laRS0xKToKKyAgICAgICAgICAgIHEucHV0KGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBmdWxsIikKKyAgICAgICAgbGFzdCA9IDIgKiBRVUVVRV9TSVpFCisgICAgICAgIGZ1bGwgPSAzICogMiAqIFFVRVVFX1NJWkUKKyAgICAgICAgcS5wdXQobGFzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBxLnB1dChmdWxsLCBibG9jaz0wKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgYXBwZWFyIHRvIGJsb2NrIHdpdGggYSBmdWxsIHF1ZXVlIikKKyAgICAgICAgZXhjZXB0IFF1ZXVlLkZ1bGw6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEucHV0KGZ1bGwsIHRpbWVvdXQ9MC4wMSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGFwcGVhciB0byB0aW1lLW91dCB3aXRoIGEgZnVsbCBxdWV1ZSIpCisgICAgICAgIGV4Y2VwdCBRdWV1ZS5GdWxsOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRlc3QgYSBibG9ja2luZyBwdXQKKyAgICAgICAgc2VsZi5kb19ibG9ja2luZ190ZXN0KHEucHV0LCAoZnVsbCwpLCBxLmdldCwgKCkpCisgICAgICAgIHNlbGYuZG9fYmxvY2tpbmdfdGVzdChxLnB1dCwgKGZ1bGwsIFRydWUsIDEwKSwgcS5nZXQsICgpKQorICAgICAgICAjIEVtcHR5IGl0CisgICAgICAgIGZvciBpIGluIHJhbmdlKFFVRVVFX1NJWkUpOgorICAgICAgICAgICAgcS5nZXQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcS5nZXQoYmxvY2s9MCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGFwcGVhciB0byBibG9jayB3aXRoIGFuIGVtcHR5IHF1ZXVlIikKKyAgICAgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBxLmdldCh0aW1lb3V0PTAuMDEpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCBhcHBlYXIgdG8gdGltZS1vdXQgd2l0aCBhbiBlbXB0eSBxdWV1ZSIpCisgICAgICAgIGV4Y2VwdCBRdWV1ZS5FbXB0eToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBUZXN0IGEgYmxvY2tpbmcgZ2V0CisgICAgICAgIHNlbGYuZG9fYmxvY2tpbmdfdGVzdChxLmdldCwgKCksIHEucHV0LCAoJ2VtcHR5JywpKQorICAgICAgICBzZWxmLmRvX2Jsb2NraW5nX3Rlc3QocS5nZXQsIChUcnVlLCAxMCksIHEucHV0LCAoJ2VtcHR5JywpKQorCisKKyAgICBkZWYgd29ya2VyKHNlbGYsIHEpOgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeCA9IHEuZ2V0KCkKKyAgICAgICAgICAgIGlmIHggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBxLnRhc2tfZG9uZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB3aXRoIHNlbGYuY3VtbG9jazoKKyAgICAgICAgICAgICAgICBzZWxmLmN1bSArPSB4CisgICAgICAgICAgICBxLnRhc2tfZG9uZSgpCisKKyAgICBkZWYgcXVldWVfam9pbl90ZXN0KHNlbGYsIHEpOgorICAgICAgICBzZWxmLmN1bSA9IDAKKyAgICAgICAgZm9yIGkgaW4gKDAsMSk6CisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLndvcmtlciwgYXJncz0ocSwpKS5zdGFydCgpCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgcS5wdXQoaSkKKyAgICAgICAgcS5qb2luKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmN1bSwgc3VtKHJhbmdlKDEwMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJxLmpvaW4oKSBkaWQgbm90IGJsb2NrIHVudGlsIGFsbCB0YXNrcyB3ZXJlIGRvbmUiKQorICAgICAgICBmb3IgaSBpbiAoMCwxKToKKyAgICAgICAgICAgIHEucHV0KE5vbmUpICAgICAgICAgIyBpbnN0cnVjdCB0aGUgdGhyZWFkcyB0byBjbG9zZQorICAgICAgICBxLmpvaW4oKSAgICAgICAgICAgICAgICAjIHZlcmlmeSB0aGF0IHlvdSBjYW4gam9pbiB0d2ljZQorCisgICAgZGVmIHRlc3RfcXVldWVfdGFza19kb25lKHNlbGYpOgorICAgICAgICAjIFRlc3QgdG8gbWFrZSBzdXJlIGEgcXVldWUgdGFzayBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAgICBxID0gc2VsZi50eXBlMnRlc3QoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBxLnRhc2tfZG9uZSgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IGRldGVjdCB0YXNrIGNvdW50IGdvaW5nIG5lZ2F0aXZlIikKKworICAgIGRlZiB0ZXN0X3F1ZXVlX2pvaW4oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGEgcXVldWUgam9pbigpcyBzdWNjZXNzZnVsbHksIGFuZCBiZWZvcmUgYW55dGhpbmcgZWxzZQorICAgICAgICAjIChkb25lIHR3aWNlIGZvciBpbnN1cmFuY2UpLgorICAgICAgICBxID0gc2VsZi50eXBlMnRlc3QoKQorICAgICAgICBzZWxmLnF1ZXVlX2pvaW5fdGVzdChxKQorICAgICAgICBzZWxmLnF1ZXVlX2pvaW5fdGVzdChxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBxLnRhc2tfZG9uZSgpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWQgbm90IGRldGVjdCB0YXNrIGNvdW50IGdvaW5nIG5lZ2F0aXZlIikKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9xdWV1ZShzZWxmKToKKyAgICAgICAgIyBEbyBpdCBhIGNvdXBsZSBvZiB0aW1lcyBvbiB0aGUgc2FtZSBxdWV1ZS4KKyAgICAgICAgIyBEb25lIHR3aWNlIHRvIG1ha2Ugc3VyZSB3b3JrcyB3aXRoIHNhbWUgaW5zdGFuY2UgcmV1c2VkLgorICAgICAgICBxID0gc2VsZi50eXBlMnRlc3QoUVVFVUVfU0laRSkKKyAgICAgICAgc2VsZi5zaW1wbGVfcXVldWVfdGVzdChxKQorICAgICAgICBzZWxmLnNpbXBsZV9xdWV1ZV90ZXN0KHEpCisKKworY2xhc3MgUXVldWVUZXN0KEJhc2VRdWV1ZVRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0eXBlMnRlc3QgPSBRdWV1ZS5RdWV1ZQorCitjbGFzcyBMaWZvUXVldWVUZXN0KEJhc2VRdWV1ZVRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICB0eXBlMnRlc3QgPSBRdWV1ZS5MaWZvUXVldWUKKworY2xhc3MgUHJpb3JpdHlRdWV1ZVRlc3QoQmFzZVF1ZXVlVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHR5cGUydGVzdCA9IFF1ZXVlLlByaW9yaXR5UXVldWUKKworCisKKyMgQSBRdWV1ZSBzdWJjbGFzcyB0aGF0IGNhbiBwcm92b2tlIGZhaWx1cmUgYXQgYSBtb21lbnQncyBub3RpY2UgOikKK2NsYXNzIEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworY2xhc3MgRmFpbGluZ1F1ZXVlKFF1ZXVlLlF1ZXVlKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmZhaWxfbmV4dF9wdXQgPSBGYWxzZQorICAgICAgICBzZWxmLmZhaWxfbmV4dF9nZXQgPSBGYWxzZQorICAgICAgICBRdWV1ZS5RdWV1ZS5fX2luaXRfXyhzZWxmLCAqYXJncykKKyAgICBkZWYgX3B1dChzZWxmLCBpdGVtKToKKyAgICAgICAgaWYgc2VsZi5mYWlsX25leHRfcHV0OgorICAgICAgICAgICAgc2VsZi5mYWlsX25leHRfcHV0ID0gRmFsc2UKKyAgICAgICAgICAgIHJhaXNlIEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbiwgIllvdSBMb3NlIgorICAgICAgICByZXR1cm4gUXVldWUuUXVldWUuX3B1dChzZWxmLCBpdGVtKQorICAgIGRlZiBfZ2V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZhaWxfbmV4dF9nZXQ6CisgICAgICAgICAgICBzZWxmLmZhaWxfbmV4dF9nZXQgPSBGYWxzZQorICAgICAgICAgICAgcmFpc2UgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uLCAiWW91IExvc2UiCisgICAgICAgIHJldHVybiBRdWV1ZS5RdWV1ZS5fZ2V0KHNlbGYpCisKK2NsYXNzIEZhaWxpbmdRdWV1ZVRlc3QoQmxvY2tpbmdUZXN0TWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBmYWlsaW5nX3F1ZXVlX3Rlc3Qoc2VsZiwgcSk6CisgICAgICAgIGlmIG5vdCBxLmVtcHR5KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJDYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBhbiBlbXB0eSBxdWV1ZSIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoUVVFVUVfU0laRS0xKToKKyAgICAgICAgICAgIHEucHV0KGkpCisgICAgICAgICMgVGVzdCBhIGZhaWxpbmcgbm9uLWJsb2NraW5nIHB1dC4KKyAgICAgICAgcS5mYWlsX25leHRfcHV0ID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBxLnB1dCgib29wcyIsIGJsb2NrPTApCisgICAgICAgICAgICBzZWxmLmZhaWwoIlRoZSBxdWV1ZSBkaWRuJ3QgZmFpbCB3aGVuIGl0IHNob3VsZCBoYXZlIikKKyAgICAgICAgZXhjZXB0IEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcS5mYWlsX25leHRfcHV0ID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBxLnB1dCgib29wcyIsIHRpbWVvdXQ9MC4xKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgcXVldWUgZGlkbid0IGZhaWwgd2hlbiBpdCBzaG91bGQgaGF2ZSIpCisgICAgICAgIGV4Y2VwdCBGYWlsaW5nUXVldWVFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHEucHV0KCJsYXN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQorICAgICAgICAjIFRlc3QgYSBmYWlsaW5nIGJsb2NraW5nIHB1dAorICAgICAgICBxLmZhaWxfbmV4dF9wdXQgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZG9fYmxvY2tpbmdfdGVzdChxLnB1dCwgKCJmdWxsIiwpLCBxLmdldCwgKCkpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlRoZSBxdWV1ZSBkaWRuJ3QgZmFpbCB3aGVuIGl0IHNob3VsZCBoYXZlIikKKyAgICAgICAgZXhjZXB0IEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgIyBDaGVjayB0aGUgUXVldWUgaXNuJ3QgZGFtYWdlZC4KKyAgICAgICAgIyBwdXQgZmFpbGVkLCBidXQgZ2V0IHN1Y2NlZWRlZCAtIHJlLWFkZAorICAgICAgICBxLnB1dCgibGFzdCIpCisgICAgICAgICMgVGVzdCBhIGZhaWxpbmcgdGltZW91dCBwdXQKKyAgICAgICAgcS5mYWlsX25leHRfcHV0ID0gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRvX2V4Y2VwdGlvbmFsX2Jsb2NraW5nX3Rlc3QocS5wdXQsICgiZnVsbCIsIFRydWUsIDEwKSwgcS5nZXQsICgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhaWxpbmdRdWV1ZUV4Y2VwdGlvbikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIHF1ZXVlIGRpZG4ndCBmYWlsIHdoZW4gaXQgc2hvdWxkIGhhdmUiKQorICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIENoZWNrIHRoZSBRdWV1ZSBpc24ndCBkYW1hZ2VkLgorICAgICAgICAjIHB1dCBmYWlsZWQsIGJ1dCBnZXQgc3VjY2VlZGVkIC0gcmUtYWRkCisgICAgICAgIHEucHV0KCJsYXN0IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQorICAgICAgICBxLmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5mdWxsKCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGZ1bGwiKQorICAgICAgICBxLnB1dCgibGFzdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKKyAgICAgICAgIyBUZXN0IGEgYmxvY2tpbmcgcHV0CisgICAgICAgIHNlbGYuZG9fYmxvY2tpbmdfdGVzdChxLnB1dCwgKCJmdWxsIiwpLCBxLmdldCwgKCkpCisgICAgICAgICMgRW1wdHkgaXQKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoUVVFVUVfU0laRSk6CisgICAgICAgICAgICBxLmdldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQorICAgICAgICBxLnB1dCgiZmlyc3QiKQorICAgICAgICBxLmZhaWxfbmV4dF9nZXQgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEuZ2V0KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIHF1ZXVlIGRpZG4ndCBmYWlsIHdoZW4gaXQgc2hvdWxkIGhhdmUiKQorICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQorICAgICAgICBxLmZhaWxfbmV4dF9nZXQgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHEuZ2V0KHRpbWVvdXQ9MC4xKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgcXVldWUgZGlkbid0IGZhaWwgd2hlbiBpdCBzaG91bGQgaGF2ZSIpCisgICAgICAgIGV4Y2VwdCBGYWlsaW5nUXVldWVFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCisgICAgICAgIHEuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCisgICAgICAgIHEuZmFpbF9uZXh0X2dldCA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kb19leGNlcHRpb25hbF9ibG9ja2luZ190ZXN0KHEuZ2V0LCAoKSwgcS5wdXQsICgnZW1wdHknLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgcXVldWUgZGlkbid0IGZhaWwgd2hlbiBpdCBzaG91bGQgaGF2ZSIpCisgICAgICAgIGV4Y2VwdCBGYWlsaW5nUXVldWVFeGNlcHRpb246CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgcHV0IHN1Y2NlZWRlZCwgYnV0IGdldCBmYWlsZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCisgICAgICAgIHEuZ2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCisKKyAgICBkZWYgdGVzdF9mYWlsaW5nX3F1ZXVlKHNlbGYpOgorICAgICAgICAjIFRlc3QgdG8gbWFrZSBzdXJlIGEgcXVldWUgaXMgZnVuY3Rpb25pbmcgY29ycmVjdGx5LgorICAgICAgICAjIERvbmUgdHdpY2UgdG8gdGhlIHNhbWUgaW5zdGFuY2UuCisgICAgICAgIHEgPSBGYWlsaW5nUXVldWUoUVVFVUVfU0laRSkKKyAgICAgICAgc2VsZi5mYWlsaW5nX3F1ZXVlX3Rlc3QocSkKKyAgICAgICAgc2VsZi5mYWlsaW5nX3F1ZXVlX3Rlc3QocSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChRdWV1ZVRlc3QsIExpZm9RdWV1ZVRlc3QsIFByaW9yaXR5UXVldWVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFpbGluZ1F1ZXVlVGVzdCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdWV1ZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdWV1ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2NTY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdWV1ZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdWV1ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2NTY2ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1ZXVlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjNGQxNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3F1b3ByaS5weQpAQCAtMCwwICsxLDIwMSBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAorCitpbXBvcnQgc3lzLCBjU3RyaW5nSU8sIHN1YnByb2Nlc3MKK2ltcG9ydCBxdW9wcmkKKworCisKK0VOQ1NBTVBMRSA9ICIiIlwKK0hlcmUncyBhIGJ1bmNoIG9mIHNwZWNpYWw9MjAKKworPUExPUEyPUEzPUE0PUE1PUE2PUE3PUE4PUE5Cis9QUE9QUI9QUM9QUQ9QUU9QUY9QjA9QjE9QjI9QjMKKz1CND1CNT1CNj1CNz1COD1COT1CQT1CQj1CQz1CRD1CRQorPUJGPUMwPUMxPUMyPUMzPUM0PUM1PUM2Cis9Qzc9Qzg9Qzk9Q0E9Q0I9Q0M9Q0Q9Q0U9Q0YKKz1EMD1EMT1EMj1EMz1END1ENT1ENj1ENworPUQ4PUQ5PURBPURCPURDPUREPURFPURGCis9RTA9RTE9RTI9RTM9RTQ9RTU9RTY9RTcKKz1FOD1FOT1FQT1FQj1FQz1FRD1FRT1FRgorPUYwPUYxPUYyPUYzPUY0PUY1PUY2PUY3Cis9Rjg9Rjk9RkE9RkI9RkM9RkQ9RkU9RkYKKworY2hhcmFjdGVycy4uLiBoYXZlIGZ1biEKKyIiIgorCisjIEZpcnN0IGxpbmUgZW5kcyB3aXRoIGEgc3BhY2UKK0RFQ1NBTVBMRSA9ICJIZXJlJ3MgYSBidW5jaCBvZiBzcGVjaWFsIFxuIiArIFwKKyIiIlwKKworXHhhMVx4YTJceGEzXHhhNFx4YTVceGE2XHhhN1x4YThceGE5CitceGFhXHhhYlx4YWNceGFkXHhhZVx4YWZceGIwXHhiMVx4YjJceGIzCitceGI0XHhiNVx4YjZceGI3XHhiOFx4YjlceGJhXHhiYlx4YmNceGJkXHhiZQorXHhiZlx4YzBceGMxXHhjMlx4YzNceGM0XHhjNVx4YzYKK1x4YzdceGM4XHhjOVx4Y2FceGNiXHhjY1x4Y2RceGNlXHhjZgorXHhkMFx4ZDFceGQyXHhkM1x4ZDRceGQ1XHhkNlx4ZDcKK1x4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmCitceGUwXHhlMVx4ZTJceGUzXHhlNFx4ZTVceGU2XHhlNworXHhlOFx4ZTlceGVhXHhlYlx4ZWNceGVkXHhlZVx4ZWYKK1x4ZjBceGYxXHhmMlx4ZjNceGY0XHhmNVx4ZjZceGY3CitceGY4XHhmOVx4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZgorCitjaGFyYWN0ZXJzLi4uIGhhdmUgZnVuIQorIiIiCisKKworZGVmIHdpdGhweXRob25pbXBsZW1lbnRhdGlvbih0ZXN0ZnVuYyk6CisgICAgZGVmIG5ld3Rlc3Qoc2VsZik6CisgICAgICAgICMgVGVzdCBkZWZhdWx0IGltcGxlbWVudGF0aW9uCisgICAgICAgIHRlc3RmdW5jKHNlbGYpCisgICAgICAgICMgVGVzdCBQeXRob24gaW1wbGVtZW50YXRpb24KKyAgICAgICAgaWYgcXVvcHJpLmIyYV9xcCBpcyBub3QgTm9uZSBvciBxdW9wcmkuYTJiX3FwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb2xkZW5jb2RlID0gcXVvcHJpLmIyYV9xcAorICAgICAgICAgICAgb2xkZGVjb2RlID0gcXVvcHJpLmEyYl9xcAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHF1b3ByaS5iMmFfcXAgPSBOb25lCisgICAgICAgICAgICAgICAgcXVvcHJpLmEyYl9xcCA9IE5vbmUKKyAgICAgICAgICAgICAgICB0ZXN0ZnVuYyhzZWxmKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBxdW9wcmkuYjJhX3FwID0gb2xkZW5jb2RlCisgICAgICAgICAgICAgICAgcXVvcHJpLmEyYl9xcCA9IG9sZGRlY29kZQorICAgIG5ld3Rlc3QuX19uYW1lX18gPSB0ZXN0ZnVuYy5fX25hbWVfXworICAgIHJldHVybiBuZXd0ZXN0CisKK2NsYXNzIFF1b3ByaVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEVhY2ggZW50cnkgaXMgYSB0dXBsZSBvZiAocGxhaW50ZXh0LCBlbmNvZGVkIHN0cmluZykuICBUaGVzZSBzdHJpbmdzIGFyZQorICAgICMgdXNlZCBpbiB0aGUgInF1b3RldGFicz0wIiB0ZXN0cy4KKyAgICBTVFJJTkdTID0gKAorICAgICAgICAjIFNvbWUgbm9ybWFsIHN0cmluZ3MKKyAgICAgICAgKCdoZWxsbycsICdoZWxsbycpLAorICAgICAgICAoJycnaGVsbG8KKyAgICAgICAgdGhlcmUKKyAgICAgICAgd29ybGQnJycsICcnJ2hlbGxvCisgICAgICAgIHRoZXJlCisgICAgICAgIHdvcmxkJycnKSwKKyAgICAgICAgKCcnJ2hlbGxvCisgICAgICAgIHRoZXJlCisgICAgICAgIHdvcmxkCisnJycsICcnJ2hlbGxvCisgICAgICAgIHRoZXJlCisgICAgICAgIHdvcmxkCisnJycpLAorICAgICAgICAoJ1wyMDFcMjAyXDIwMycsICc9ODE9ODI9ODMnKSwKKyAgICAgICAgIyBBZGQgc29tZSB0cmFpbGluZyBNVVNUIFFVT1RFIHN0cmluZ3MKKyAgICAgICAgKCdoZWxsbyAnLCAnaGVsbG89MjAnKSwKKyAgICAgICAgKCdoZWxsb1x0JywgJ2hlbGxvPTA5JyksCisgICAgICAgICMgU29tZSBsb25nIGxpbmVzLiAgRmlyc3QsIGEgc2luZ2xlIGxpbmUgb2YgMTA4IGNoYXJhY3RlcnMKKyAgICAgICAgKCd4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eFx4ZDhceGQ5XHhkYVx4ZGJceGRjXHhkZFx4ZGVceGRmeHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHgnLAorICAgICAgICAgJycneHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHg9RDg9RDk9REE9REI9REM9REQ9REU9REZ4PQoreHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eCcnJyksCisgICAgICAgICMgQSBsaW5lIG9mIGV4YWN0bHkgNzYgY2hhcmFjdGVycywgbm8gc29mdCBsaW5lIGJyZWFrIHNob3VsZCBiZSBuZWVkZWQKKyAgICAgICAgKCd5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5JywKKyAgICAgICAgJ3l5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXknKSwKKyAgICAgICAgIyBBIGxpbmUgb2YgNzcgY2hhcmFjdGVycywgZm9yY2luZyBhIHNvZnQgbGluZSBicmVhayBhdCBwb3NpdGlvbiA3NSwKKyAgICAgICAgIyBhbmQgYSBzZWNvbmQgbGluZSBvZiBleGFjdGx5IDIgY2hhcmFjdGVycyAoYmVjYXVzZSB0aGUgc29mdCBsaW5lCisgICAgICAgICMgYnJlYWsgYD0nIHNpZ24gY291bnRzIGFnYWluc3QgdGhlIGxpbmUgbGVuZ3RoIGxpbWl0KS4KKyAgICAgICAgKCd6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6eicsCisgICAgICAgICAnJyd6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6eno9Cit6eicnJyksCisgICAgICAgICMgQSBsaW5lIG9mIDE1MSBjaGFyYWN0ZXJzLCBmb3JjaW5nIGEgc29mdCBsaW5lIGJyZWFrIGF0IHBvc2l0aW9uIDc1LAorICAgICAgICAjIHdpdGggYSBzZWNvbmQgbGluZSBvZiBleGFjdGx5IDc2IGNoYXJhY3RlcnMgYW5kIG5vIHRyYWlsaW5nID0KKyAgICAgICAgKCd6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6JywKKyAgICAgICAgICcnJ3p6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6ej0KK3p6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enonJycpLAorICAgICAgICAjIEEgc3RyaW5nIGNvbnRhaW5pbmcgYSBoYXJkIGxpbmUgYnJlYWssIGJ1dCB3aGljaCB0aGUgZmlyc3QgbGluZSBpcworICAgICAgICAjIDE1MSBjaGFyYWN0ZXJzIGFuZCB0aGUgc2Vjb25kIGxpbmUgaXMgZXhhY3RseSA3NiBjaGFyYWN0ZXJzLiAgVGhpcworICAgICAgICAjIHNob3VsZCBsZWF2ZSB1cyB3aXRoIHRocmVlIGxpbmVzLCB0aGUgZmlyc3Qgd2hpY2ggaGFzIGEgc29mdCBsaW5lCisgICAgICAgICMgYnJlYWssIGFuZCB3aGljaCB0aGUgc2Vjb25kIGFuZCB0aGlyZCBkbyBub3QuCisgICAgICAgICgnJyd5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5Cit6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6JycnLAorICAgICAgICAgJycneXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5PQoreXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eQorenp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6enp6eicnJyksCisgICAgICAgICMgTm93IHNvbWUgcmVhbGx5IGNvbXBsZXggc3R1ZmYgOykKKyAgICAgICAgKERFQ1NBTVBMRSwgRU5DU0FNUExFKSwKKyAgICAgICAgKQorCisgICAgIyBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgInF1b3RldGFicz0xIiB0ZXN0cy4KKyAgICBFU1RSSU5HUyA9ICgKKyAgICAgICAgKCdoZWxsbyB3b3JsZCcsICdoZWxsbz0yMHdvcmxkJyksCisgICAgICAgICgnaGVsbG9cdHdvcmxkJywgJ2hlbGxvPTA5d29ybGQnKSwKKyAgICAgICAgKQorCisgICAgIyBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgImhlYWRlcj0xIiB0ZXN0cy4KKyAgICBIU1RSSU5HUyA9ICgKKyAgICAgICAgKCdoZWxsbyB3b3JsZCcsICdoZWxsb193b3JsZCcpLAorICAgICAgICAoJ2hlbGxvX3dvcmxkJywgJ2hlbGxvPTVGd29ybGQnKSwKKyAgICAgICAgKQorCisgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgorICAgIGRlZiB0ZXN0X2VuY29kZXN0cmluZyhzZWxmKToKKyAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5TVFJJTkdTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5lbmNvZGVzdHJpbmcocCkgPT0gZSkKKworICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9kZWNvZGVzdHJpbmcoc2VsZik6CisgICAgICAgIGZvciBwLCBlIGluIHNlbGYuU1RSSU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZGVjb2Rlc3RyaW5nKGUpID09IHApCisKKyAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfaWRlbXBvdGVudF9zdHJpbmcoc2VsZik6CisgICAgICAgIGZvciBwLCBlIGluIHNlbGYuU1RSSU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZGVjb2Rlc3RyaW5nKHF1b3ByaS5lbmNvZGVzdHJpbmcoZSkpID09IGUpCisKKyAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLlNUUklOR1M6CisgICAgICAgICAgICBpbmZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKHApCisgICAgICAgICAgICBvdXRmcCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBxdW9wcmkuZW5jb2RlKGluZnAsIG91dGZwLCBxdW90ZXRhYnM9RmFsc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3V0ZnAuZ2V0dmFsdWUoKSA9PSBlKQorCisgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgorICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5TVFJJTkdTOgorICAgICAgICAgICAgaW5mcCA9IGNTdHJpbmdJTy5TdHJpbmdJTyhlKQorICAgICAgICAgICAgb3V0ZnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgcXVvcHJpLmRlY29kZShpbmZwLCBvdXRmcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdXRmcC5nZXR2YWx1ZSgpID09IHApCisKKyAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfZW1iZWRkZWRfd3Moc2VsZik6CisgICAgICAgIGZvciBwLCBlIGluIHNlbGYuRVNUUklOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmVuY29kZXN0cmluZyhwLCBxdW90ZXRhYnM9VHJ1ZSkgPT0gZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZGVjb2Rlc3RyaW5nKGUpID09IHApCisKKyAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfZW5jb2RlX2hlYWRlcihzZWxmKToKKyAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5IU1RSSU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZW5jb2Rlc3RyaW5nKHAsIGhlYWRlcj1UcnVlKSA9PSBlKQorCisgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgorICAgIGRlZiB0ZXN0X2RlY29kZV9oZWFkZXIoc2VsZik6CisgICAgICAgIGZvciBwLCBlIGluIHNlbGYuSFNUUklOR1M6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmRlY29kZXN0cmluZyhlLCBoZWFkZXI9VHJ1ZSkgPT0gcCkKKworICAgIGRlZiB0ZXN0X3NjcmlwdGVuY29kZShzZWxmKToKKyAgICAgICAgKHAsIGUpID0gc2VsZi5TVFJJTkdTWy0xXQorICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItbXF1b3ByaSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwcm9jZXNzLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgY291dCwgY2VyciA9IHByb2Nlc3MuY29tbXVuaWNhdGUocCkKKyAgICAgICAgIyBPbiBXaW5kb3dzLCBQeXRob24gd2lsbCBvdXRwdXQgdGhlIHJlc3VsdCB0byBzdGRvdXQgdXNpbmcKKyAgICAgICAgIyBDUkxGLCBhcyB0aGUgbW9kZSBvZiBzdGRvdXQgaXMgdGV4dCBtb2RlLiBUbyBjb21wYXJlIHRoaXMKKyAgICAgICAgIyB3aXRoIHRoZSBleHBlY3RlZCByZXN1bHQsIHdlIG5lZWQgdG8gZG8gYSBsaW5lLWJ5LWxpbmUgY29tcGFyaXNvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3V0LnNwbGl0bGluZXMoKSwgZS5zcGxpdGxpbmVzKCkpCisKKyAgICBkZWYgdGVzdF9zY3JpcHRkZWNvZGUoc2VsZik6CisgICAgICAgIChwLCBlKSA9IHNlbGYuU1RSSU5HU1stMV0KKyAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLW1xdW9wcmkiLCAiLWQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocHJvY2Vzcy5zdGRvdXQuY2xvc2UpCisgICAgICAgIGNvdXQsIGNlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291dC5zcGxpdGxpbmVzKCksIHAuc3BsaXRsaW5lcygpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChRdW9wcmlUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVvcHJpLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE3ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVvcHJpLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9xdW9wcmkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVvcHJpLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGE3ZGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcXVvcHJpLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yYW5kb20ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yYW5kb20ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNjQxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JhbmRvbS5weQpAQCAtMCwwICsxLDYyNCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHJhbmRvbQoraW1wb3J0IHRpbWUKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCB3YXJuaW5ncworZnJvbSBtYXRoIGltcG9ydCBsb2csIGV4cCwgcGksIGZzdW0sIHNpbgorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHJlZHVjZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworY2xhc3MgVGVzdEJhc2ljT3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFN1cGVyY2xhc3Mgd2l0aCB0ZXN0cyBjb21tb24gdG8gYWxsIGdlbmVyYXRvcnMuCisgICAgIyBTdWJjbGFzc2VzIG11c3QgYXJyYW5nZSBmb3Igc2VsZi5nZW4gdG8gcmV0cmlldmUgdGhlIFJhbmRvbSBpbnN0YW5jZQorICAgICMgdG8gYmUgdGVzdGVkLgorCisgICAgZGVmIHJhbmRvbWxpc3Qoc2VsZiwgbik6CisgICAgICAgICIiIkhlbHBlciBmdW5jdGlvbiB0byBtYWtlIGEgbGlzdCBvZiByYW5kb20gbnVtYmVycyIiIgorICAgICAgICByZXR1cm4gW3NlbGYuZ2VuLnJhbmRvbSgpIGZvciBpIGluIHhyYW5nZShuKV0KKworICAgIGRlZiB0ZXN0X2F1dG9zZWVkKHNlbGYpOgorICAgICAgICBzZWxmLmdlbi5zZWVkKCkKKyAgICAgICAgc3RhdGUxID0gc2VsZi5nZW4uZ2V0c3RhdGUoKQorICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgc2VsZi5nZW4uc2VlZCgpICAgICAgIyBkaWZmZW50IHNlZWRzIGF0IGRpZmZlcmVudCB0aW1lcworICAgICAgICBzdGF0ZTIgPSBzZWxmLmdlbi5nZXRzdGF0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3RhdGUxLCBzdGF0ZTIpCisKKyAgICBkZWYgdGVzdF9zYXZlcmVzdG9yZShzZWxmKToKKyAgICAgICAgTiA9IDEwMDAKKyAgICAgICAgc2VsZi5nZW4uc2VlZCgpCisgICAgICAgIHN0YXRlID0gc2VsZi5nZW4uZ2V0c3RhdGUoKQorICAgICAgICByYW5kc2VxID0gc2VsZi5yYW5kb21saXN0KE4pCisgICAgICAgIHNlbGYuZ2VuLnNldHN0YXRlKHN0YXRlKSAgICAjIHNob3VsZCByZWdlbmVyYXRlIHRoZSBzYW1lIHNlcXVlbmNlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZHNlcSwgc2VsZi5yYW5kb21saXN0KE4pKQorCisgICAgZGVmIHRlc3Rfc2VlZGFyZ3Moc2VsZik6CisgICAgICAgIGZvciBhcmcgaW4gW05vbmUsIDAsIDBMLCAxLCAxTCwgLTEsIC0xTCwgMTAqKjIwLCAtKDEwKioyMCksCisgICAgICAgICAgICAgICAgICAgIDMuMTQsIDErMmosICdhJywgdHVwbGUoJ2FiYycpXToKKyAgICAgICAgICAgIHNlbGYuZ2VuLnNlZWQoYXJnKQorICAgICAgICBmb3IgYXJnIGluIFtyYW5nZSgzKSwgZGljdChvbmU9MSldOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5zZWVkLCBhcmcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uc2VlZCwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0eXBlKHNlbGYuZ2VuKSwgW10pCisKKyAgICBkZWYgdGVzdF9qdW1wYWhlYWQoc2VsZik6CisgICAgICAgIHNlbGYuZ2VuLnNlZWQoKQorICAgICAgICBzdGF0ZTEgPSBzZWxmLmdlbi5nZXRzdGF0ZSgpCisgICAgICAgIHNlbGYuZ2VuLmp1bXBhaGVhZCgxMDApCisgICAgICAgIHN0YXRlMiA9IHNlbGYuZ2VuLmdldHN0YXRlKCkgICAgIyBzL2IgZGlzdGluY3QgZnJvbSBzdGF0ZTEKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzdGF0ZTEsIHN0YXRlMikKKyAgICAgICAgc2VsZi5nZW4uanVtcGFoZWFkKDEwMCkKKyAgICAgICAgc3RhdGUzID0gc2VsZi5nZW4uZ2V0c3RhdGUoKSAgICAjIHMvYiBkaXN0aW5jdCBmcm9tIHN0YXRlMgorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHN0YXRlMiwgc3RhdGUzKQorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MocXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZ2VuLmp1bXBhaGVhZCkgICMgbmVlZHMgYW4gYXJnCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZ2VuLmp1bXBhaGVhZCwgMiwgMykgICMgdG9vIG1hbnkKKworICAgIGRlZiB0ZXN0X2p1bXBhaGVhZF9wcm9kdWNlc192YWxpZF9zdGF0ZShzZWxmKToKKyAgICAgICAgIyBGcm9tIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNDU5MS4KKyAgICAgICAgc2VsZi5nZW4uc2VlZCgxOTkyMTAzNjgpCisgICAgICAgIHNlbGYuZ2VuLmp1bXBhaGVhZCgxMzU1MDY3NDIzMjU1NDY0NTkwMCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNTAwKToKKyAgICAgICAgICAgIHZhbCA9IHNlbGYuZ2VuLnJhbmRvbSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3ModmFsLCAxLjApCisKKyAgICBkZWYgdGVzdF9zYW1wbGUoc2VsZik6CisgICAgICAgICMgRm9yIHRoZSBlbnRpcmUgYWxsb3dhYmxlIHJhbmdlIG9mIDAgPD0gayA8PSBOLCB2YWxpZGF0ZSB0aGF0CisgICAgICAgICMgdGhlIHNhbXBsZSBpcyBvZiB0aGUgY29ycmVjdCBsZW5ndGggYW5kIGNvbnRhaW5zIG9ubHkgdW5pcXVlIGl0ZW1zCisgICAgICAgIE4gPSAxMDAKKyAgICAgICAgcG9wdWxhdGlvbiA9IHhyYW5nZShOKQorICAgICAgICBmb3IgayBpbiB4cmFuZ2UoTisxKToKKyAgICAgICAgICAgIHMgPSBzZWxmLmdlbi5zYW1wbGUocG9wdWxhdGlvbiwgaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBrKQorICAgICAgICAgICAgdW5pcSA9IHNldChzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odW5pcSksIGspCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pcSA8PSBzZXQocG9wdWxhdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZW4uc2FtcGxlKFtdLCAwKSwgW10pICAjIHRlc3QgZWRnZSBjYXNlIE49PWs9PTAKKworICAgIGRlZiB0ZXN0X3NhbXBsZV9kaXN0cmlidXRpb24oc2VsZik6CisgICAgICAgICMgRm9yIHRoZSBlbnRpcmUgYWxsb3dhYmxlIHJhbmdlIG9mIDAgPD0gayA8PSBOLCB2YWxpZGF0ZSB0aGF0CisgICAgICAgICMgc2FtcGxlIGdlbmVyYXRlcyBhbGwgcG9zc2libGUgcGVybXV0YXRpb25zCisgICAgICAgIG4gPSA1CisgICAgICAgIHBvcCA9IHJhbmdlKG4pCisgICAgICAgIHRyaWFscyA9IDEwMDAwICAjIGxhcmdlIG51bSBwcmV2ZW50cyBmYWxzZSBuZWdhdGl2ZXMgd2l0aG91dCBzbG93aW5nIG5vcm1hbCBjYXNlCisgICAgICAgIGRlZiBmYWN0b3JpYWwobik6CisgICAgICAgICAgICByZXR1cm4gcmVkdWNlKGludC5fX211bF9fLCB4cmFuZ2UoMSwgbiksIDEpCisgICAgICAgIGZvciBrIGluIHhyYW5nZShuKToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gZmFjdG9yaWFsKG4pIC8vIGZhY3RvcmlhbChuLWspCisgICAgICAgICAgICBwZXJtcyA9IHt9CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UodHJpYWxzKToKKyAgICAgICAgICAgICAgICBwZXJtc1t0dXBsZShzZWxmLmdlbi5zYW1wbGUocG9wLCBrKSldID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIGxlbihwZXJtcykgPT0gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKKyAgICBkZWYgdGVzdF9zYW1wbGVfaW5wdXRzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAjODAxMzQyIC0tIHBvcHVsYXRpb24gY2FuIGJlIGFueSBpdGVyYWJsZSBkZWZpbmluZyBfX2xlbl9fKCkKKyAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHNldChyYW5nZSgyMCkpLCAyKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUocmFuZ2UoMjApLCAyKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoeHJhbmdlKDIwKSwgMikKKyAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHN0cignYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKKyAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHR1cGxlKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQorCisgICAgZGVmIHRlc3Rfc2FtcGxlX29uX2RpY3RzKHNlbGYpOgorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoZGljdC5mcm9ta2V5cygnYWJjZGVmZ2hpamtsbW5vcHFyc3QnKSwgMikKKworICAgICAgICAjIFNGIGJ1ZyAjMTQ2MDM0MCAtLSByYW5kb20uc2FtcGxlIGNhbiByYWlzZSBLZXlFcnJvcgorICAgICAgICBhID0gZGljdC5mcm9ta2V5cyhyYW5nZSgxMCkrcmFuZ2UoMTAsMTAwLDIpK3JhbmdlKDEwMCwxMTApKQorICAgICAgICBzZWxmLmdlbi5zYW1wbGUoYSwgMykKKworICAgICAgICAjIEEgZm9sbG93dXAgdG8gYnVnICMxNDYwMzQwOiAgc2FtcGxpbmcgZnJvbSBhIGRpY3QgY291bGQgcmV0dXJuCisgICAgICAgICMgYSBzdWJzZXQgb2YgaXRzIGtleXMgb3Igb2YgaXRzIHZhbHVlcywgZGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mCisgICAgICAgICMgdGhlIHN1YnNldCByZXF1ZXN0ZWQuCisgICAgICAgIE4gPSAzMAorICAgICAgICBkID0gZGljdCgoaSwgY29tcGxleChpLCBpKSkgZm9yIGkgaW4geHJhbmdlKE4pKQorICAgICAgICBmb3IgayBpbiB4cmFuZ2UoTisxKToKKyAgICAgICAgICAgIHNhbXAgPSBzZWxmLmdlbi5zYW1wbGUoZCwgaykKKyAgICAgICAgICAgICMgVmVyaWZ5IHRoYXQgd2UgZ290IGludHMgYmFjayAoa2V5cyk7IHRoZSB2YWx1ZXMgYXJlIGNvbXBsZXguCisgICAgICAgICAgICBmb3IgeCBpbiBzYW1wOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHgpIGlzIGludCkKKyAgICAgICAgc2FtcC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wLCByYW5nZShOKSkKKworICAgIGRlZiB0ZXN0X2dhdXNzKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBzZWVkKCkgbWV0aG9kIGluaXRpYWxpemVzIGFsbCB0aGUgaGlkZGVuIHN0YXRlLiAgSW4KKyAgICAgICAgIyBwYXJ0aWN1bGFyLCB0aHJvdWdoIDIuMi4xIGl0IGZhaWxlZCB0byByZXNldCBhIHBpZWNlIG9mIHN0YXRlIHVzZWQKKyAgICAgICAgIyBieSAoYW5kIG9ubHkgYnkpIHRoZSAuZ2F1c3MoKSBtZXRob2QuCisKKyAgICAgICAgZm9yIHNlZWQgaW4gMSwgMTIsIDEyMywgMTIzNCwgMTIzNDUsIDEyMzQ1NiwgNjU0MzIxOgorICAgICAgICAgICAgc2VsZi5nZW4uc2VlZChzZWVkKQorICAgICAgICAgICAgeDEgPSBzZWxmLmdlbi5yYW5kb20oKQorICAgICAgICAgICAgeTEgPSBzZWxmLmdlbi5nYXVzcygwLCAxKQorCisgICAgICAgICAgICBzZWxmLmdlbi5zZWVkKHNlZWQpCisgICAgICAgICAgICB4MiA9IHNlbGYuZ2VuLnJhbmRvbSgpCisgICAgICAgICAgICB5MiA9IHNlbGYuZ2VuLmdhdXNzKDAsIDEpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDEsIHgyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5MSwgeTIpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgc3RhdGUgPSBwaWNrbGUuZHVtcHMoc2VsZi5nZW4pCisgICAgICAgIG9yaWdzZXEgPSBbc2VsZi5nZW4ucmFuZG9tKCkgZm9yIGkgaW4geHJhbmdlKDEwKV0KKyAgICAgICAgbmV3Z2VuID0gcGlja2xlLmxvYWRzKHN0YXRlKQorICAgICAgICByZXN0b3JlZHNlcSA9IFtuZXdnZW4ucmFuZG9tKCkgZm9yIGkgaW4geHJhbmdlKDEwKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnc2VxLCByZXN0b3JlZHNlcSkKKworICAgIGRlZiB0ZXN0X2J1Z18xNzI3NzgwKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSB0aGF0IHZlcnNpb24tMi1waWNrbGVzIGNhbiBiZSBsb2FkZWQKKyAgICAgICAgIyBmaW5lLCB3aGV0aGVyIHRoZXkgYXJlIGNyZWF0ZWQgb24gMzItYml0IG9yIDY0LWJpdAorICAgICAgICAjIHBsYXRmb3JtcywgYW5kIHRoYXQgdmVyc2lvbi0zLXBpY2tsZXMgbG9hZCBmaW5lLgorICAgICAgICBmaWxlcyA9IFsoInJhbmR2Ml8zMi5wY2siLCA3ODApLAorICAgICAgICAgICAgICAgICAoInJhbmR2Ml82NC5wY2siLCA4NjYpLAorICAgICAgICAgICAgICAgICAoInJhbmR2My5wY2siLCAzNDMpXQorICAgICAgICBmb3IgZmlsZSwgdmFsdWUgaW4gZmlsZXM6CisgICAgICAgICAgICBmID0gb3Blbih0ZXN0X3N1cHBvcnQuZmluZGZpbGUoZmlsZSksInJiIikKKyAgICAgICAgICAgIHIgPSBwaWNrbGUubG9hZChmKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIucmFuZHJhbmdlKDEwMDApLCB2YWx1ZSkKKworY2xhc3MgV2ljaG1hbm5IaWxsX1Rlc3RCYXNpY09wcyhUZXN0QmFzaWNPcHMpOgorICAgIGdlbiA9IHJhbmRvbS5XaWNobWFubkhpbGwoKQorCisgICAgZGVmIHRlc3Rfc2V0c3RhdGVfZmlyc3RfYXJnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmdlbi5zZXRzdGF0ZSwgKDIsIE5vbmUsIE5vbmUpKQorCisgICAgZGVmIHRlc3Rfc3Ryb25nX2p1bXBhaGVhZChzZWxmKToKKyAgICAgICAgIyB0ZXN0cyB0aGF0IGp1bXBhaGVhZChuKSBzZW1hbnRpY3MgY29ycmVzcG9uZCB0byBuIGNhbGxzIHRvIHJhbmRvbSgpCisgICAgICAgIE4gPSAxMDAwCisgICAgICAgIHMgPSBzZWxmLmdlbi5nZXRzdGF0ZSgpCisgICAgICAgIHNlbGYuZ2VuLmp1bXBhaGVhZChOKQorICAgICAgICByMSA9IHNlbGYuZ2VuLnJhbmRvbSgpCisgICAgICAgICMgbm93IGRvIGl0IHRoZSBzbG93IHdheQorICAgICAgICBzZWxmLmdlbi5zZXRzdGF0ZShzKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoTik6CisgICAgICAgICAgICBzZWxmLmdlbi5yYW5kb20oKQorICAgICAgICByMiA9IHNlbGYuZ2VuLnJhbmRvbSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEsIHIyKQorCisgICAgZGVmIHRlc3RfZ2F1c3Nfd2l0aF93aHNlZWQoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHNlZWQoKSBtZXRob2QgaW5pdGlhbGl6ZXMgYWxsIHRoZSBoaWRkZW4gc3RhdGUuICBJbgorICAgICAgICAjIHBhcnRpY3VsYXIsIHRocm91Z2ggMi4yLjEgaXQgZmFpbGVkIHRvIHJlc2V0IGEgcGllY2Ugb2Ygc3RhdGUgdXNlZAorICAgICAgICAjIGJ5IChhbmQgb25seSBieSkgdGhlIC5nYXVzcygpIG1ldGhvZC4KKworICAgICAgICBmb3Igc2VlZCBpbiAxLCAxMiwgMTIzLCAxMjM0LCAxMjM0NSwgMTIzNDU2LCA2NTQzMjE6CisgICAgICAgICAgICBzZWxmLmdlbi53aHNlZWQoc2VlZCkKKyAgICAgICAgICAgIHgxID0gc2VsZi5nZW4ucmFuZG9tKCkKKyAgICAgICAgICAgIHkxID0gc2VsZi5nZW4uZ2F1c3MoMCwgMSkKKworICAgICAgICAgICAgc2VsZi5nZW4ud2hzZWVkKHNlZWQpCisgICAgICAgICAgICB4MiA9IHNlbGYuZ2VuLnJhbmRvbSgpCisgICAgICAgICAgICB5MiA9IHNlbGYuZ2VuLmdhdXNzKDAsIDEpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeDEsIHgyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5MSwgeTIpCisKKyAgICBkZWYgdGVzdF9iaWdyYW5kKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB3YXJuaW5ncyBhcmUgcmFpc2VkIHdoZW4gcmFuZHJhbmdlIGlzIHRvbyBsYXJnZSBmb3IgcmFuZG9tKCkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgIlVuZGVybHlpbmcgcmFuZG9tIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCBzZWxmLmdlbi5yYW5kcmFuZ2UsIDIqKjYwKQorCitjbGFzcyBTeXN0ZW1SYW5kb21fVGVzdEJhc2ljT3BzKFRlc3RCYXNpY09wcyk6CisgICAgZ2VuID0gcmFuZG9tLlN5c3RlbVJhbmRvbSgpCisKKyAgICBkZWYgdGVzdF9hdXRvc2VlZChzZWxmKToKKyAgICAgICAgIyBEb2Vzbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgZXhjZXB0IG5vdCBmYWlsCisgICAgICAgIHNlbGYuZ2VuLnNlZWQoKQorCisgICAgZGVmIHRlc3Rfc2F2ZXJlc3RvcmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHNlbGYuZ2VuLmdldHN0YXRlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBzZWxmLmdlbi5zZXRzdGF0ZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3NlZWRhcmdzKHNlbGYpOgorICAgICAgICAjIERvZXNuJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBleGNlcHQgbm90IGZhaWwKKyAgICAgICAgc2VsZi5nZW4uc2VlZCgxMDApCisKKyAgICBkZWYgdGVzdF9qdW1wYWhlYWQoc2VsZik6CisgICAgICAgICMgRG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGV4Y2VwdCBub3QgZmFpbAorICAgICAgICBzZWxmLmdlbi5qdW1wYWhlYWQoMTAwKQorCisgICAgZGVmIHRlc3RfZ2F1c3Moc2VsZik6CisgICAgICAgIHNlbGYuZ2VuLmdhdXNzX25leHQgPSBOb25lCisgICAgICAgIHNlbGYuZ2VuLnNlZWQoMTAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2VuLmdhdXNzX25leHQsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgcGlja2xlLmR1bXBzLCBzZWxmLmdlbikKKworICAgIGRlZiB0ZXN0XzUzX2JpdHNfcGVyX2Zsb2F0KHNlbGYpOgorICAgICAgICAjIFRoaXMgc2hvdWxkIHBhc3Mgd2hlbmV2ZXIgYSBDIGRvdWJsZSBoYXMgNTMgYml0IHByZWNpc2lvbi4KKyAgICAgICAgc3BhbiA9IDIgKiogNTMKKyAgICAgICAgY3VtID0gMAorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKKyAgICAgICAgICAgIGN1bSB8PSBpbnQoc2VsZi5nZW4ucmFuZG9tKCkgKiBzcGFuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1bSwgc3Bhbi0xKQorCisgICAgZGVmIHRlc3RfYmlncmFuZChzZWxmKToKKyAgICAgICAgIyBUaGUgcmFuZHJhbmdlIHJvdXRpbmUgc2hvdWxkIGJ1aWxkLXVwIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgYml0cworICAgICAgICAjIGluIHN0YWdlcyBzbyB0aGF0IGFsbCBiaXQgcG9zaXRpb25zIGFyZSBhY3RpdmUuCisgICAgICAgIHNwYW4gPSAyICoqIDUwMAorICAgICAgICBjdW0gPSAwCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgciA9IHNlbGYuZ2VuLnJhbmRyYW5nZShzcGFuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gciA8IHNwYW4pCisgICAgICAgICAgICBjdW0gfD0gcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1bSwgc3Bhbi0xKQorCisgICAgZGVmIHRlc3RfYmlncmFuZF9yYW5nZXMoc2VsZik6CisgICAgICAgIGZvciBpIGluIFs0MCw4MCwgMTYwLCAyMDAsIDIxMSwgMjUwLCAzNzUsIDUxMiwgNTUwXToKKyAgICAgICAgICAgIHN0YXJ0ID0gc2VsZi5nZW4ucmFuZHJhbmdlKDIgKiogaSkKKyAgICAgICAgICAgIHN0b3AgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiAoaS0yKSkKKyAgICAgICAgICAgIGlmIHN0b3AgPD0gc3RhcnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RhcnQgPD0gc2VsZi5nZW4ucmFuZHJhbmdlKHN0YXJ0LCBzdG9wKSA8IHN0b3ApCisKKyAgICBkZWYgdGVzdF9yYW5nZWxpbWl0cyhzZWxmKToKKyAgICAgICAgZm9yIHN0YXJ0LCBzdG9wIGluIFsoLTIsMCksICgtKDIqKjYwKS0yLC0oMioqNjApKSwgKDIqKjYwLDIqKjYwKzIpXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KHJhbmdlKHN0YXJ0LHN0b3ApKSwKKyAgICAgICAgICAgICAgICBzZXQoW3NlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCxzdG9wKSBmb3IgaSBpbiB4cmFuZ2UoMTAwKV0pKQorCisgICAgZGVmIHRlc3RfZ2VucmFuZGJpdHMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHJhbmdlcworICAgICAgICBmb3IgayBpbiB4cmFuZ2UoMSwgMTAwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBzZWxmLmdlbi5nZXRyYW5kYml0cyhrKSA8IDIqKmspCisKKyAgICAgICAgIyBWZXJpZnkgYWxsIGJpdHMgYWN0aXZlCisgICAgICAgIGdldGJpdHMgPSBzZWxmLmdlbi5nZXRyYW5kYml0cworICAgICAgICBmb3Igc3BhbiBpbiBbMSwgMiwgMywgNCwgMzEsIDMyLCAzMiwgNTIsIDUzLCA1NCwgMTE5LCAxMjcsIDEyOCwgMTI5XToKKyAgICAgICAgICAgIGN1bSA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgICAgIGN1bSB8PSBnZXRiaXRzKHNwYW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1bSwgMioqc3Bhbi0xKQorCisgICAgICAgICMgVmVyaWZ5IGFyZ3VtZW50IGNoZWNraW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZ2VuLmdldHJhbmRiaXRzLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cywgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMsIDEwLjEpCisKKyAgICBkZWYgdGVzdF9yYW5kYmVsb3dfbG9naWMoc2VsZiwgX2xvZz1sb2csIGludD1pbnQpOgorICAgICAgICAjIGNoZWNrIGJpdGNvdW50IHRyYW5zaXRpb24gcG9pbnRzOiAgMioqaSBhbmQgMioqKGkrMSktMQorICAgICAgICAjIHNob3cgdGhhdDogayA9IGludCgxLjAwMSArIF9sb2cobiwgMikpCisgICAgICAgICMgaXMgZXF1YWwgdG8gb3Igb25lIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gbgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMSwgMTAwMCk6CisgICAgICAgICAgICBuID0gMUwgPDwgaSAjIGNoZWNrIGFuIGV4YWN0IHBvd2VyIG9mIHR3bworICAgICAgICAgICAgbnVtYml0cyA9IGkrMQorICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLCAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgbnVtYml0cykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuID09IDIqKihrLTEpKQorCisgICAgICAgICAgICBuICs9IG4gLSAxICAgICAgIyBjaGVjayAxIGJlbG93IHRoZSBuZXh0IHBvd2VyIG9mIHR3bworICAgICAgICAgICAgayA9IGludCgxLjAwMDAxICsgX2xvZyhuLCAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgW251bWJpdHMsIG51bWJpdHMrMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqayA+IG4gPiAyKiooay0yKSkKKworICAgICAgICAgICAgbiAtPSBuID4+IDE1ICAgICAjIGNoZWNrIGEgbGl0dGxlIGZhcnRoZXIgYmVsb3cgdGhlIG5leHQgcG93ZXIgb2YgdHdvCisgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBudW1iaXRzKSAgICAgICAgIyBub3RlIHRoZSBzdHJvbmdlciBhc3NlcnRpb24KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyKiprID4gbiA+IDIqKihrLTEpKSAgICMgbm90ZSB0aGUgc3Ryb25nZXIgYXNzZXJ0aW9uCisKKworY2xhc3MgTWVyc2VubmVUd2lzdGVyX1Rlc3RCYXNpY09wcyhUZXN0QmFzaWNPcHMpOgorICAgIGdlbiA9IHJhbmRvbS5SYW5kb20oKQorCisgICAgZGVmIHRlc3Rfc2V0c3RhdGVfZmlyc3RfYXJnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmdlbi5zZXRzdGF0ZSwgKDEsIE5vbmUsIE5vbmUpKQorCisgICAgZGVmIHRlc3Rfc2V0c3RhdGVfbWlkZGxlX2FyZyhzZWxmKToKKyAgICAgICAgIyBXcm9uZyB0eXBlLCBzL2IgdHVwbGUKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5zZXRzdGF0ZSwgKDIsIE5vbmUsIE5vbmUpKQorICAgICAgICAjIFdyb25nIGxlbmd0aCwgcy9iIDYyNQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmdlbi5zZXRzdGF0ZSwgKDIsICgxLDIsMyksIE5vbmUpKQorICAgICAgICAjIFdyb25nIHR5cGUsIHMvYiB0dXBsZSBvZiA2MjUgaW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZ2VuLnNldHN0YXRlLCAoMiwgKCdhJywpKjYyNSwgTm9uZSkpCisgICAgICAgICMgTGFzdCBlbGVtZW50IHMvYiBhbiBpbnQgYWxzbworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZ2VuLnNldHN0YXRlLCAoMiwgKDAsKSo2MjQrKCdhJywpLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X3JlZmVyZW5jZUltcGxlbWVudGF0aW9uKHNlbGYpOgorICAgICAgICAjIENvbXBhcmUgdGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiB3aXRoIHJlc3VsdHMgZnJvbSB0aGUgb3JpZ2luYWwKKyAgICAgICAgIyBjb2RlLiAgQ3JlYXRlIDIwMDAgNTMtYml0IHByZWNpc2lvbiByYW5kb20gZmxvYXRzLiAgQ29tcGFyZSBvbmx5CisgICAgICAgICMgdGhlIGxhc3QgdGVuIGVudHJpZXMgdG8gc2hvdyB0aGF0IHRoZSBpbmRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgIyBhcmUgdHJhY2tpbmcuICBIZXJlIGlzIHRoZSBtYWluKCkgZnVuY3Rpb24gbmVlZGVkIHRvIGNyZWF0ZSB0aGUKKyAgICAgICAgIyBsaXN0IG9mIGV4cGVjdGVkIHJhbmRvbSBudW1iZXJzOgorICAgICAgICAjICAgIHZvaWQgbWFpbih2b2lkKXsKKyAgICAgICAgIyAgICAgICAgIGludCBpOworICAgICAgICAjICAgICAgICAgdW5zaWduZWQgbG9uZyBpbml0WzRdPXs2MTczMSwgMjQ5MDMsIDYxNCwgNDIxNDN9LCBsZW5ndGg9NDsKKyAgICAgICAgIyAgICAgICAgIGluaXRfYnlfYXJyYXkoaW5pdCwgbGVuZ3RoKTsKKyAgICAgICAgIyAgICAgICAgIGZvciAoaT0wOyBpPDIwMDA7IGkrKykgeworICAgICAgICAjICAgICAgICAgICBwcmludGYoIiUuMTVmICIsIGdlbnJhbmRfcmVzNTMoKSk7CisgICAgICAgICMgICAgICAgICAgIGlmIChpJTU9PTQpIHByaW50ZigiXG4iKTsKKyAgICAgICAgIyAgICAgICAgIH0KKyAgICAgICAgIyAgICAgfQorICAgICAgICBleHBlY3RlZCA9IFswLjQ1ODM5ODAzMDczNzEzMjU5LAorICAgICAgICAgICAgICAgICAgICAwLjg2MDU3ODE1MjAxOTc4NzgyLAorICAgICAgICAgICAgICAgICAgICAwLjkyODQ4MzMxNzI2NzgyMTUyLAorICAgICAgICAgICAgICAgICAgICAwLjM1OTMyNjgxMTE5NzgyNDYxLAorICAgICAgICAgICAgICAgICAgICAwLjA4MTgyMzQ5Mzc2MjQ0OTU3MywKKyAgICAgICAgICAgICAgICAgICAgMC4xNDMzMjIyNjQ3MDE2OTMyOSwKKyAgICAgICAgICAgICAgICAgICAgMC4wODQyOTc4MjM4MjM1MjAwMjQsCisgICAgICAgICAgICAgICAgICAgIDAuNTM4MTQ4NjQ2NzE4MzE0NTMsCisgICAgICAgICAgICAgICAgICAgIDAuMDg5MjE1MDI0OTExOTkzNDAxLAorICAgICAgICAgICAgICAgICAgICAwLjc4NDg2MTk2MTA1MzcyOTA3XQorCisgICAgICAgIHNlbGYuZ2VuLnNlZWQoNjE3MzFMICsgKDI0OTAzTDw8MzIpICsgKDYxNEw8PDY0KSArICg0MjE0M0w8PDk2KSkKKyAgICAgICAgYWN0dWFsID0gc2VsZi5yYW5kb21saXN0KDIwMDApWy0xMDpdCisgICAgICAgIGZvciBhLCBlIGluIHppcChhY3R1YWwsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoYSxlLHBsYWNlcz0xNCkKKworICAgIGRlZiB0ZXN0X3N0cm9uZ19yZWZlcmVuY2VfaW1wbGVtZW50YXRpb24oc2VsZik6CisgICAgICAgICMgTGlrZSB0ZXN0X3JlZmVyZW5jZUltcGxlbWVudGF0aW9uLCBidXQgY2hlY2tzIGZvciBleGFjdCBiaXQtbGV2ZWwKKyAgICAgICAgIyBlcXVhbGl0eS4gIFRoaXMgc2hvdWxkIHBhc3Mgb24gYW55IGJveCB3aGVyZSBDIGRvdWJsZSBjb250YWlucworICAgICAgICAjIGF0IGxlYXN0IDUzIGJpdHMgb2YgcHJlY2lzaW9uICh0aGUgdW5kZXJseWluZyBhbGdvcml0aG0gc3VmZmVycworICAgICAgICAjIG5vIHJvdW5kaW5nIGVycm9ycyAtLSBhbGwgcmVzdWx0cyBhcmUgZXhhY3QpLgorICAgICAgICBmcm9tIG1hdGggaW1wb3J0IGxkZXhwCisKKyAgICAgICAgZXhwZWN0ZWQgPSBbMHgwZWFiMzI1OGQyMjMxZkwsCisgICAgICAgICAgICAgICAgICAgIDB4MWI4OWRiMzE1Mjc3YTVMLAorICAgICAgICAgICAgICAgICAgICAweDFkYjYyMmE1NTE4MDE2TCwKKyAgICAgICAgICAgICAgICAgICAgMHgwYjdmOWFmMGQ1NzViZkwsCisgICAgICAgICAgICAgICAgICAgIDB4MDI5ZTRjNGRiODIyNDBMLAorICAgICAgICAgICAgICAgICAgICAweDA0OTYxODkyZjVkNjczTCwKKyAgICAgICAgICAgICAgICAgICAgMHgwMmIyOTE1OThlNDU4OUwsCisgICAgICAgICAgICAgICAgICAgIDB4MTEzODgzODJjMTU2OTRMLAorICAgICAgICAgICAgICAgICAgICAweDAyZGFkOTc3YzllMWZlTCwKKyAgICAgICAgICAgICAgICAgICAgMHgxOTFkOTZkNGQzMzRjNkxdCisgICAgICAgIHNlbGYuZ2VuLnNlZWQoNjE3MzFMICsgKDI0OTAzTDw8MzIpICsgKDYxNEw8PDY0KSArICg0MjE0M0w8PDk2KSkKKyAgICAgICAgYWN0dWFsID0gc2VsZi5yYW5kb21saXN0KDIwMDApWy0xMDpdCisgICAgICAgIGZvciBhLCBlIGluIHppcChhY3R1YWwsIGV4cGVjdGVkKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhsZGV4cChhLCA1MykpLCBlKQorCisgICAgZGVmIHRlc3RfbG9uZ19zZWVkKHNlbGYpOgorICAgICAgICAjIFRoaXMgaXMgbW9zdCBpbnRlcmVzdGluZyB0byBydW4gaW4gZGVidWcgbW9kZSwganVzdCB0byBtYWtlIHN1cmUKKyAgICAgICAgIyBub3RoaW5nIGJsb3dzIHVwLiAgVW5kZXIgdGhlIGNvdmVycywgYSBkeW5hbWljYWxseSByZXNpemVkIGFycmF5CisgICAgICAgICMgaXMgYWxsb2NhdGVkLCBjb25zdW1pbmcgc3BhY2UgcHJvcG9ydGlvbmFsIHRvIHRoZSBudW1iZXIgb2YgYml0cworICAgICAgICAjIGluIHRoZSBzZWVkLiAgVW5mb3J0dW5hdGVseSwgdGhhdCdzIGEgcXVhZHJhdGljLXRpbWUgYWxnb3JpdGhtLAorICAgICAgICAjIHNvIGRvbid0IG1ha2UgdGhpcyBob3JyaWJseSBiaWcuCisgICAgICAgIHNlZWQgPSAoMUwgPDwgKDEwMDAwICogOCkpIC0gMSAgIyBhYm91dCAxMEsgYnl0ZXMKKyAgICAgICAgc2VsZi5nZW4uc2VlZChzZWVkKQorCisgICAgZGVmIHRlc3RfNTNfYml0c19wZXJfZmxvYXQoc2VsZik6CisgICAgICAgICMgVGhpcyBzaG91bGQgcGFzcyB3aGVuZXZlciBhIEMgZG91YmxlIGhhcyA1MyBiaXQgcHJlY2lzaW9uLgorICAgICAgICBzcGFuID0gMiAqKiA1MworICAgICAgICBjdW0gPSAwCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgY3VtIHw9IGludChzZWxmLmdlbi5yYW5kb20oKSAqIHNwYW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VtLCBzcGFuLTEpCisKKyAgICBkZWYgdGVzdF9iaWdyYW5kKHNlbGYpOgorICAgICAgICAjIFRoZSByYW5kcmFuZ2Ugcm91dGluZSBzaG91bGQgYnVpbGQtdXAgdGhlIHJlcXVpcmVkIG51bWJlciBvZiBiaXRzCisgICAgICAgICMgaW4gc3RhZ2VzIHNvIHRoYXQgYWxsIGJpdCBwb3NpdGlvbnMgYXJlIGFjdGl2ZS4KKyAgICAgICAgc3BhbiA9IDIgKiogNTAwCisgICAgICAgIGN1bSA9IDAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CisgICAgICAgICAgICByID0gc2VsZi5nZW4ucmFuZHJhbmdlKHNwYW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSByIDwgc3BhbikKKyAgICAgICAgICAgIGN1bSB8PSByCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VtLCBzcGFuLTEpCisKKyAgICBkZWYgdGVzdF9iaWdyYW5kX3JhbmdlcyhzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gWzQwLDgwLCAxNjAsIDIwMCwgMjExLCAyNTAsIDM3NSwgNTEyLCA1NTBdOgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiBpKQorICAgICAgICAgICAgc3RvcCA9IHNlbGYuZ2VuLnJhbmRyYW5nZSgyICoqIChpLTIpKQorICAgICAgICAgICAgaWYgc3RvcCA8PSBzdGFydDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdGFydCA8PSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsIHN0b3ApIDwgc3RvcCkKKworICAgIGRlZiB0ZXN0X3JhbmdlbGltaXRzKHNlbGYpOgorICAgICAgICBmb3Igc3RhcnQsIHN0b3AgaW4gWygtMiwwKSwgKC0oMioqNjApLTIsLSgyKio2MCkpLCAoMioqNjAsMioqNjArMildOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQocmFuZ2Uoc3RhcnQsc3RvcCkpLAorICAgICAgICAgICAgICAgIHNldChbc2VsZi5nZW4ucmFuZHJhbmdlKHN0YXJ0LHN0b3ApIGZvciBpIGluIHhyYW5nZSgxMDApXSkpCisKKyAgICBkZWYgdGVzdF9nZW5yYW5kYml0cyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgY3Jvc3MtcGxhdGZvcm0gcmVwZWF0YWJpbGl0eQorICAgICAgICBzZWxmLmdlbi5zZWVkKDEyMzQ1NjcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5nZW4uZ2V0cmFuZGJpdHMoMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICA5NzkwNDg0NTc3NzM0MzUxMDQwNDcxODk1NjExNUwpCisgICAgICAgICMgVmVyaWZ5IHJhbmdlcworICAgICAgICBmb3IgayBpbiB4cmFuZ2UoMSwgMTAwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBzZWxmLmdlbi5nZXRyYW5kYml0cyhrKSA8IDIqKmspCisKKyAgICAgICAgIyBWZXJpZnkgYWxsIGJpdHMgYWN0aXZlCisgICAgICAgIGdldGJpdHMgPSBzZWxmLmdlbi5nZXRyYW5kYml0cworICAgICAgICBmb3Igc3BhbiBpbiBbMSwgMiwgMywgNCwgMzEsIDMyLCAzMiwgNTIsIDUzLCA1NCwgMTE5LCAxMjcsIDEyOCwgMTI5XToKKyAgICAgICAgICAgIGN1bSA9IDAKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICAgICAgICAgIGN1bSB8PSBnZXRiaXRzKHNwYW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1bSwgMioqc3Bhbi0xKQorCisgICAgICAgICMgVmVyaWZ5IGFyZ3VtZW50IGNoZWNraW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmdlbi5nZXRyYW5kYml0cywgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5nZW4uZ2V0cmFuZGJpdHMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZ2VuLmdldHJhbmRiaXRzLCAtMSkKKworICAgIGRlZiB0ZXN0X3JhbmRiZWxvd19sb2dpYyhzZWxmLCBfbG9nPWxvZywgaW50PWludCk6CisgICAgICAgICMgY2hlY2sgYml0Y291bnQgdHJhbnNpdGlvbiBwb2ludHM6ICAyKippIGFuZCAyKiooaSsxKS0xCisgICAgICAgICMgc2hvdyB0aGF0OiBrID0gaW50KDEuMDAxICsgX2xvZyhuLCAyKSkKKyAgICAgICAgIyBpcyBlcXVhbCB0byBvciBvbmUgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgYml0cyBpbiBuCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxLCAxMDAwKToKKyAgICAgICAgICAgIG4gPSAxTCA8PCBpICMgY2hlY2sgYW4gZXhhY3QgcG93ZXIgb2YgdHdvCisgICAgICAgICAgICBudW1iaXRzID0gaSsxCisgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBudW1iaXRzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG4gPT0gMioqKGstMSkpCisKKyAgICAgICAgICAgIG4gKz0gbiAtIDEgICAgICAjIGNoZWNrIDEgYmVsb3cgdGhlIG5leHQgcG93ZXIgb2YgdHdvCisgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCBbbnVtYml0cywgbnVtYml0cysxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyKiprID4gbiA+IDIqKihrLTIpKQorCisgICAgICAgICAgICBuIC09IG4gPj4gMTUgICAgICMgY2hlY2sgYSBsaXR0bGUgZmFydGhlciBiZWxvdyB0aGUgbmV4dCBwb3dlciBvZiB0d28KKyAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobiwgMikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIG51bWJpdHMpICAgICAgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKmsgPiBuID4gMioqKGstMSkpICAgIyBub3RlIHRoZSBzdHJvbmdlciBhc3NlcnRpb24KKworICAgIGRlZiB0ZXN0X3JhbmRyYW5nZV9idWdfMTU5MDg5MShzZWxmKToKKyAgICAgICAgc3RhcnQgPSAxMDAwMDAwMDAwMDAwCisgICAgICAgIHN0b3AgPSAtMTAwMDAwMDAwMDAwMDAwMDAwMDAwCisgICAgICAgIHN0ZXAgPSAtMjAwCisgICAgICAgIHggPSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdG9wIDwgeCA8PSBzdGFydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeCtzdG9wKSVzdGVwLCAwKQorCitkZWYgZ2FtbWEoeiwgc3FydDJwaT0oMi4wKnBpKSoqMC41KToKKyAgICAjIFJlZmxlY3Rpb24gdG8gcmlnaHQgaGFsZiBvZiBjb21wbGV4IHBsYW5lCisgICAgaWYgeiA8IDAuNToKKyAgICAgICAgcmV0dXJuIHBpIC8gc2luKHBpKnopIC8gZ2FtbWEoMS4wLXopCisgICAgIyBMYW5jem9zIGFwcHJveGltYXRpb24gd2l0aCBnPTcKKyAgICBheiA9IHogKyAoNy4wIC0gMC41KQorICAgIHJldHVybiBheiAqKiAoei0wLjUpIC8gZXhwKGF6KSAqIHNxcnQycGkgKiBmc3VtKFsKKyAgICAgICAgMC45OTk5OTk5OTk5OTk1MTgzLAorICAgICAgICA2NzYuNTIwMzY4MTIxODgzNSAvIHosCisgICAgICAgIC0xMjU5LjEzOTIxNjcyMjI4OSAvICh6KzEuMCksCisgICAgICAgIDc3MS4zMjM0Mjg3NzU3Njc0IC8gKHorMi4wKSwKKyAgICAgICAgLTE3Ni42MTUwMjkxNDk4Mzg2IC8gKHorMy4wKSwKKyAgICAgICAgMTIuNTA3MzQzMjQwMDkwNTYgLyAoeis0LjApLAorICAgICAgICAtMC4xMzg1NzEwMzMxMjk2NTI2IC8gKHorNS4wKSwKKyAgICAgICAgMC45OTM0OTM3MTEzOTMwNzQ4ZS0wNSAvICh6KzYuMCksCisgICAgICAgIDAuMTY1OTQ3MDE4NzQwODQ2MmUtMDYgLyAoeis3LjApLAorICAgIF0pCisKK2NsYXNzIFRlc3REaXN0cmlidXRpb25zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF96ZXJvaW5wdXRzKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IGRpc3RyaWJ1dGlvbnMgY2FuIGhhbmRsZSBhIHNlcmllcyBvZiB6ZXJvIGlucHV0cycKKyAgICAgICAgZyA9IHJhbmRvbS5SYW5kb20oKQorICAgICAgICB4ID0gW2cucmFuZG9tKCkgZm9yIGkgaW4geHJhbmdlKDUwKV0gKyBbMC4wXSo1CisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcudW5pZm9ybSgxLDEwKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLnBhcmV0b3ZhcmlhdGUoMS4wKQorICAgICAgICBnLnJhbmRvbSA9IHhbOl0ucG9wOyBnLmV4cG92YXJpYXRlKDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy53ZWlidWxsdmFyaWF0ZSgxLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy52b25taXNlc3ZhcmlhdGUoMS4wLCAxLjApCisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcubm9ybWFsdmFyaWF0ZSgwLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5nYXVzcygwLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5sb2dub3JtdmFyaWF0ZSgwLjAsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy52b25taXNlc3ZhcmlhdGUoMC4wLCAxLjApCisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcuZ2FtbWF2YXJpYXRlKDAuMDEsIDEuMCkKKyAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcDsgZy5nYW1tYXZhcmlhdGUoMS4wLCAxLjApCisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcuZ2FtbWF2YXJpYXRlKDIwMC4wLCAxLjApCisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcuYmV0YXZhcmlhdGUoMy4wLCAzLjApCisgICAgICAgIGcucmFuZG9tID0geFs6XS5wb3A7IGcudHJpYW5ndWxhcigwLjAsIDEuMCwgMS4wLzMuMCkKKworICAgIGRlZiB0ZXN0X2F2Z19zdGQoc2VsZik6CisgICAgICAgICMgVXNlIGludGVncmF0aW9uIHRvIHRlc3QgZGlzdHJpYnV0aW9uIGF2ZXJhZ2UgYW5kIHN0YW5kYXJkIGRldmlhdGlvbi4KKyAgICAgICAgIyBPbmx5IHdvcmtzIGZvciBkaXN0cmlidXRpb25zIHdoaWNoIGRvIG5vdCBjb25zdW1lIHZhcmlhdGVzIGluIHBhaXJzCisgICAgICAgIGcgPSByYW5kb20uUmFuZG9tKCkKKyAgICAgICAgTiA9IDUwMDAKKyAgICAgICAgeCA9IFtpL2Zsb2F0KE4pIGZvciBpIGluIHhyYW5nZSgxLE4pXQorICAgICAgICBmb3IgdmFyaWF0ZSwgYXJncywgbXUsIHNpZ21hc3FyZCBpbiBbCisgICAgICAgICAgICAgICAgKGcudW5pZm9ybSwgKDEuMCwxMC4wKSwgKDEwLjArMS4wKS8yLCAoMTAuMC0xLjApKioyLzEyKSwKKyAgICAgICAgICAgICAgICAoZy50cmlhbmd1bGFyLCAoMC4wLCAxLjAsIDEuMC8zLjApLCA0LjAvOS4wLCA3LjAvOS4wLzE4LjApLAorICAgICAgICAgICAgICAgIChnLmV4cG92YXJpYXRlLCAoMS41LCksIDEvMS41LCAxLzEuNSoqMiksCisgICAgICAgICAgICAgICAgKGcudm9ubWlzZXN2YXJpYXRlLCAoMS4yMywgMCksIHBpLCBwaSoqMi8zKSwKKyAgICAgICAgICAgICAgICAoZy5wYXJldG92YXJpYXRlLCAoNS4wLCksIDUuMC8oNS4wLTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMC8oKDUuMC0xKSoqMiooNS4wLTIpKSksCisgICAgICAgICAgICAgICAgKGcud2VpYnVsbHZhcmlhdGUsICgxLjAsIDMuMCksIGdhbW1hKDErMS8zLjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhbW1hKDErMi8zLjApLWdhbW1hKDErMS8zLjApKioyKSBdOgorICAgICAgICAgICAgZy5yYW5kb20gPSB4WzpdLnBvcAorICAgICAgICAgICAgeSA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHgpKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHkuYXBwZW5kKHZhcmlhdGUoKmFyZ3MpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBzMSA9IHMyID0gMAorICAgICAgICAgICAgZm9yIGUgaW4geToKKyAgICAgICAgICAgICAgICBzMSArPSBlCisgICAgICAgICAgICAgICAgczIgKz0gKGUgLSBtdSkgKiogMgorICAgICAgICAgICAgTiA9IGxlbih5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzMS9OLCBtdSwgcGxhY2VzPTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nJXMlcicgJSAodmFyaWF0ZS5fX25hbWVfXywgYXJncykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMyLyhOLTEpLCBzaWdtYXNxcmQsIHBsYWNlcz0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9JyVzJXInICUgKHZhcmlhdGUuX19uYW1lX18sIGFyZ3MpKQorCisgICAgZGVmIHRlc3RfY29uc3RhbnQoc2VsZik6CisgICAgICAgIGcgPSByYW5kb20uUmFuZG9tKCkKKyAgICAgICAgTiA9IDEwMAorICAgICAgICBmb3IgdmFyaWF0ZSwgYXJncywgZXhwZWN0ZWQgaW4gWworICAgICAgICAgICAgICAgIChnLnVuaWZvcm0sICgxMC4wLCAxMC4wKSwgMTAuMCksCisgICAgICAgICAgICAgICAgKGcudHJpYW5ndWxhciwgKDEwLjAsIDEwLjApLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAjKGcudHJpYW5ndWxhciwgKDEwLjAsIDEwLjAsIDEwLjApLCAxMC4wKSwKKyAgICAgICAgICAgICAgICAoZy5leHBvdmFyaWF0ZSwgKGZsb2F0KCdpbmYnKSwpLCAwLjApLAorICAgICAgICAgICAgICAgIChnLnZvbm1pc2VzdmFyaWF0ZSwgKDMuMCwgZmxvYXQoJ2luZicpKSwgMy4wKSwKKyAgICAgICAgICAgICAgICAoZy5nYXVzcywgKDEwLjAsIDAuMCksIDEwLjApLAorICAgICAgICAgICAgICAgIChnLmxvZ25vcm12YXJpYXRlLCAoMC4wLCAwLjApLCAxLjApLAorICAgICAgICAgICAgICAgIChnLmxvZ25vcm12YXJpYXRlLCAoLWZsb2F0KCdpbmYnKSwgMC4wKSwgMC4wKSwKKyAgICAgICAgICAgICAgICAoZy5ub3JtYWx2YXJpYXRlLCAoMTAuMCwgMC4wKSwgMTAuMCksCisgICAgICAgICAgICAgICAgKGcucGFyZXRvdmFyaWF0ZSwgKGZsb2F0KCdpbmYnKSwpLCAxLjApLAorICAgICAgICAgICAgICAgIChnLndlaWJ1bGx2YXJpYXRlLCAoMTAuMCwgZmxvYXQoJ2luZicpKSwgMTAuMCksCisgICAgICAgICAgICAgICAgKGcud2VpYnVsbHZhcmlhdGUsICgwLjAsIDEwLjApLCAwLjApLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFyaWF0ZSgqYXJncyksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3Rfdm9uX21pc2VzX3JhbmdlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE3MTQ5OiB2b24gbWlzZXMgdmFyaWF0ZXMgd2VyZSBub3QgY29uc2lzdGVudGx5IGluIHRoZQorICAgICAgICAjIHJhbmdlIFswLCAyKlBJXS4KKyAgICAgICAgZyA9IHJhbmRvbS5SYW5kb20oKQorICAgICAgICBOID0gMTAwCisgICAgICAgIGZvciBtdSBpbiAwLjAsIDAuMSwgMy4xLCA2LjI6CisgICAgICAgICAgICBmb3Iga2FwcGEgaW4gMC4wLCAyLjMsIDUwMC4wOgorICAgICAgICAgICAgICAgIGZvciBfIGluIHJhbmdlKE4pOgorICAgICAgICAgICAgICAgICAgICBzYW1wbGUgPSBnLnZvbm1pc2VzdmFyaWF0ZShtdSwga2FwcGEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgPD0gc2FtcGxlIDw9IHJhbmRvbS5UV09QSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0oInZvbm1pc2VzdmFyaWF0ZSh7fSwge30pIHByb2R1Y2VkIGEgcmVzdWx0IHt9IG91dCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvZiByYW5nZSBbMCwgMipwaV0iKS5mb3JtYXQobXUsIGthcHBhLCBzYW1wbGUpKQorCisgICAgZGVmIHRlc3Rfdm9uX21pc2VzX2xhcmdlX2thcHBhKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNzE0MTogdm9ubWlzZXN2YXJpYXRlKCkgd2FzIGhhbmcgZm9yIGxhcmdlIGthcHBhcworICAgICAgICByYW5kb20udm9ubWlzZXN2YXJpYXRlKDAsIDFlMTUpCisgICAgICAgIHJhbmRvbS52b25taXNlc3ZhcmlhdGUoMCwgMWUxMDApCisKKworY2xhc3MgVGVzdE1vZHVsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RNYWdpY0NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyYW5kb20uTlZfTUFHSUNDT05TVCwgMS43MTU1Mjc3Njk5MjE0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChyYW5kb20uVFdPUEksIDYuMjgzMTg1MzA3MTgpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocmFuZG9tLkxPRzQsIDEuMzg2Mjk0MzYxMTE5ODkpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocmFuZG9tLlNHX01BR0lDQ09OU1QsIDIuNTA0MDc3Mzk2Nzc2MjcpCisKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgICMgdGVzdHMgdmFsaWRpdHkgYnV0IG5vdCBjb21wbGV0ZW5lc3Mgb2YgdGhlIF9fYWxsX18gbGlzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHJhbmRvbS5fX2FsbF9fKSA8PSBzZXQoZGlyKHJhbmRvbSkpKQorCisgICAgZGVmIHRlc3RfcmFuZG9tX3N1YmNsYXNzX3dpdGhfa3dhcmdzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAjMTQ4NjY2MyAtLSB0aGlzIHVzZWQgdG8gZXJyb25lb3VzbHkgcmFpc2UgYSBUeXBlRXJyb3IKKyAgICAgICAgY2xhc3MgU3ViY2xhc3MocmFuZG9tLlJhbmRvbSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmV3YXJnPU5vbmUpOgorICAgICAgICAgICAgICAgIHJhbmRvbS5SYW5kb20uX19pbml0X18oc2VsZikKKyAgICAgICAgU3ViY2xhc3MobmV3YXJnPTEpCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3RjbGFzc2VzID0gICAgW1dpY2htYW5uSGlsbF9UZXN0QmFzaWNPcHMsCisgICAgICAgICAgICAgICAgICAgICAgTWVyc2VubmVUd2lzdGVyX1Rlc3RCYXNpY09wcywKKyAgICAgICAgICAgICAgICAgICAgICBUZXN0RGlzdHJpYnV0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICBUZXN0TW9kdWxlXQorCisgICAgdHJ5OgorICAgICAgICByYW5kb20uU3lzdGVtUmFuZG9tKCkucmFuZG9tKCkKKyAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHRlc3RjbGFzc2VzLmFwcGVuZChTeXN0ZW1SYW5kb21fVGVzdEJhc2ljT3BzKQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdGNsYXNzZXMpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgdmVyYm9zZSBhbmQgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihjb3VudHMpKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RjbGFzc2VzKQorICAgICAgICAgICAgY291bnRzW2ldID0gc3lzLmdldHRvdGFscmVmY291bnQoKQorICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmFuZG9tLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JhbmRvbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxYzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JhbmRvbS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmFuZG9tLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JhbmRvbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxYzY2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JhbmRvbS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGE4MWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmUucHkKQEAgLTAsMCArMSwxMDMwIEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHByZWNpc2lvbmJpZ21lbXRlc3QsIF8yRywgY3B5dGhvbl9vbmx5CitpbXBvcnQgcmUKK2Zyb20gcmUgaW1wb3J0IFNjYW5uZXIKK2ltcG9ydCBzcmVfY29uc3RhbnRzCitpbXBvcnQgc3lzCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgdHJhY2ViYWNrCitmcm9tIHdlYWtyZWYgaW1wb3J0IHByb3h5CisKKworIyBNaXNjIHRlc3RzIGZyb20gVGltIFBldGVycycgcmUuZG9jCisKKyMgV0FSTklORzogRG9uJ3QgY2hhbmdlIGRldGFpbHMgaW4gdGhlc2UgdGVzdHMgaWYgeW91IGRvbid0IGtub3cKKyMgd2hhdCB5b3UncmUgZG9pbmcuIFNvbWUgb2YgdGhlc2UgdGVzdHMgd2VyZSBjYXJlZnVsbHkgbW9kZWxlZCB0bworIyBjb3ZlciBtb3N0IG9mIHRoZSBjb2RlLgorCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgUmVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgorICAgICAgICBzID0gJ1FhYmJiY1InCisgICAgICAgIHggPSByZS5jb21waWxlKCdhYitjJykKKyAgICAgICAgeSA9IHByb3h5KHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5maW5kYWxsKCdRYWJiYmNSJyksIHkuZmluZGFsbCgnUWFiYmJjUicpKQorCisgICAgZGVmIHRlc3Rfc2VhcmNoX3N0YXJfcGx1cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2goJ3gqJywgJ2F4eCcpLnNwYW4oMCksICgwLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2goJ3gqJywgJ2F4eCcpLnNwYW4oKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgneCsnLCAnYXh4Jykuc3BhbigwKSwgKDEsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgneCsnLCAnYXh4Jykuc3BhbigpLCAoMSwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKCd4JywgJ2FhYScpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdhKicsICd4eHgnKS5zcGFuKDApLCAoMCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ2EqJywgJ3h4eCcpLnNwYW4oKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCd4KicsICd4eHhhJykuc3BhbigwKSwgKDAsIDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCd4KicsICd4eHhhJykuc3BhbigpLCAoMCwgMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ2ErJywgJ3h4eCcpLCBOb25lKQorCisgICAgZGVmIGJ1bXBfbnVtKHNlbGYsIG1hdGNob2JqKToKKyAgICAgICAgaW50X3ZhbHVlID0gaW50KG1hdGNob2JqLmdyb3VwKDApKQorICAgICAgICByZXR1cm4gc3RyKGludF92YWx1ZSArIDEpCisKKyAgICBkZWYgdGVzdF9iYXNpY19yZV9zdWIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCIoP2kpYisiLCAieCIsICJiYmJiIEJCQkIiKSwgJ3ggeCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKHInXGQrJywgc2VsZi5idW1wX251bSwgJzA4LjIgLTIgMjN4OTl5JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJzkuMyAtMyAyNHgxMDB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIocidcZCsnLCBzZWxmLmJ1bXBfbnVtLCAnMDguMiAtMiAyM3g5OXknLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnOS4zIC0zIDIzeDk5eScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJy4nLCBsYW1iZGEgbTogciJcbiIsICd4JyksICdcXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignLicsIHIiXG4iLCAneCcpLCAnXG4nKQorCisgICAgICAgIHMgPSByIlwxXDEiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoLiknLCBzLCAneCcpLCAneHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKC4pJywgcmUuZXNjYXBlKHMpLCAneCcpLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKC4pJywgbGFtYmRhIG06IHMsICd4JyksIHMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDxhPngpJywgJ1xnPGE+XGc8YT4nLCAneHgnKSwgJ3h4eHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKD9QPGE+eCknLCAnXGc8YT5cZzwxPicsICd4eCcpLCAneHh4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoP1A8dW5rPngpJywgJ1xnPHVuaz5cZzx1bms+JywgJ3h4JyksICd4eHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJyg/UDx1bms+eCknLCAnXGc8MT5cZzwxPicsICd4eCcpLCAneHh4eCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ2EnLHInXHRcblx2XHJcZlxhXGJcQlxaXGFcQVx3XFdcc1xTXGRcRCcsJ2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXHRcblx2XHJcZlxhXGJcXEJcXFpcYVxcQVxcd1xcV1xcc1xcU1xcZFxcRCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdhJywgJ1x0XG5cdlxyXGZcYScsICdhJyksICdcdFxuXHZcclxmXGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignYScsICdcdFxuXHZcclxmXGEnLCAnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChjaHIoOSkrY2hyKDEwKStjaHIoMTEpK2NocigxMykrY2hyKDEyKStjaHIoNykpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdeXHMqJywgJ1gnLCAndGVzdCcpLCAnWHRlc3QnKQorCisgICAgZGVmIHRlc3RfYnVnXzQ0OTk2NChzZWxmKToKKyAgICAgICAgIyBmYWlscyBmb3IgZ3JvdXAgZm9sbG93ZWQgYnkgb3RoZXIgZXNjYXBlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKHInKD9QPHVuaz54KScsICdcZzwxPlxnPDE+XFxiJywgJ3h4JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3h4XGJ4eFxiJykKKworICAgIGRlZiB0ZXN0X2J1Z180NDkwMDAoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3Igc3ViKCkgb24gZXNjYXBlZCBjaGFyYWN0ZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKHInXHJcbicsIHInXG4nLCAnYWJjXHJcbmRlZlxyXG4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYWJjXG5kZWZcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCdcclxuJywgcidcbicsICdhYmNcclxuZGVmXHJcbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhYmNcbmRlZlxuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIocidcclxuJywgJ1xuJywgJ2FiY1xyXG5kZWZcclxuJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiY1xuZGVmXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignXHJcbicsICdcbicsICdhYmNcclxuZGVmXHJcbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhYmNcbmRlZlxuJykKKworICAgIGRlZiB0ZXN0X2J1Z18xMTQwKHNlbGYpOgorICAgICAgICAjIHJlLnN1Yih4LCB5LCB1JycpIHNob3VsZCByZXR1cm4gdScnLCBub3QgJycsIGFuZAorICAgICAgICAjIHJlLnN1Yih4LCB5LCAnJykgc2hvdWxkIHJldHVybiAnJywgbm90IHUnJy4KKyAgICAgICAgIyBBbHNvOgorICAgICAgICAjIHJlLnN1Yih4LCB5LCB1bmljb2RlKHgpKSBzaG91bGQgcmV0dXJuIHVuaWNvZGUoeSksIGFuZAorICAgICAgICAjIHJlLnN1Yih4LCB5LCBzdHIoeCkpIHNob3VsZCByZXR1cm4KKyAgICAgICAgIyAgICAgc3RyKHkpIGlmIGlzaW5zdGFuY2UoeSwgc3RyKSBlbHNlIHVuaWNvZGUoeSkuCisgICAgICAgIGZvciB4IGluICd4JywgdSd4JzoKKyAgICAgICAgICAgIGZvciB5IGluICd5JywgdSd5JzoKKyAgICAgICAgICAgICAgICB6ID0gcmUuc3ViKHgsIHksIHUnJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHosIHUnJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeiksIHVuaWNvZGUpCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIHogPSByZS5zdWIoeCwgeSwgJycpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6LCAnJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeiksIHN0cikKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICAgICAgeiA9IHJlLnN1Yih4LCB5LCB1bmljb2RlKHgpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeiwgeSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeiksIHVuaWNvZGUpCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIHogPSByZS5zdWIoeCwgeSwgc3RyKHgpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeiwgeSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoeiksIHR5cGUoeSkpCisKKyAgICBkZWYgdGVzdF9idWdfMTY2MShzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBmbGFncyBkbyBub3QgZ2V0IHNpbGVudGx5IGlnbm9yZWQgd2l0aCBjb21waWxlZCBwYXR0ZXJucworICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgnLicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLm1hdGNoLCBwYXR0ZXJuLCAnQScsIHJlLkkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLnNlYXJjaCwgcGF0dGVybiwgJ0EnLCByZS5JKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCByZS5maW5kYWxsLCBwYXR0ZXJuLCAnQScsIHJlLkkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHJlLmNvbXBpbGUsIHBhdHRlcm4sIHJlLkkpCisKKyAgICBkZWYgdGVzdF9idWdfMzYyOShzZWxmKToKKyAgICAgICAgIyBBIHJlZ2V4IHRoYXQgdHJpZ2dlcmVkIGEgYnVnIGluIHRoZSBzcmUtY29kZSB2YWxpZGF0b3IKKyAgICAgICAgcmUuY29tcGlsZSgiKD9QPHF1b3RlPikoPyhxdW90ZSkpIikKKworICAgIGRlZiB0ZXN0X3N1Yl90ZW1wbGF0ZV9udW1lcmljX2VzY2FwZShzZWxmKToKKyAgICAgICAgIyBidWcgNzc2MzExIGFuZCBmcmllbmRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMCcsICd4JyksICdcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMDAwJywgJ3gnKSwgJ1wwMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDAwMScsICd4JyksICdcMDAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wwMDgnLCAneCcpLCAnXDAnICsgJzgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDAwOScsICd4JyksICdcMCcgKyAnOScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMTExJywgJ3gnKSwgJ1wxMTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDExNycsICd4JyksICdcMTE3JykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDExMTEnLCAneCcpLCAnXDExMTEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDExMTEnLCAneCcpLCAnXDExMScgKyAnMScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wwMCcsICd4JyksICdceDAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wwNycsICd4JyksICdceDA3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3gnLCByJ1wwOCcsICd4JyksICdcMCcgKyAnOCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcMDknLCAneCcpLCAnXDAnICsgJzknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDBhJywgJ3gnKSwgJ1wwJyArICdhJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneCcsIHInXDQwMCcsICd4JyksICdcMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCd4JywgcidcNzc3JywgJ3gnKSwgJ1wzNzcnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcMScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1w4JywgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAneCcsIHInXDknLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcMTEnLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcMTgnLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcMWEnLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcOTAnLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcOTknLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcMTE4JywgJ3gnKSAjIHInXDExJyArICc4JworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAneCcsIHInXDExYScsICd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJ3gnLCByJ1wxODEnLCAneCcpICMgcidcMTgnICsgJzEnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICd4JywgcidcODAwJywgJ3gnKSAjIHInXDgwJyArICcwJworCisgICAgICAgICMgaW4gcHl0aG9uMi4zIChldGMpLCB0aGVzZSBsb29wIGVuZGxlc3NseSBpbiBzcmVfcGFyc2VyLnB5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3ViKCcoKCgoKCgoKCgoKHgpKSkpKSkpKSkpKScsIHInXDExJywgJ3gnKSwgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKCgoKCgoKCgoKHkpKSkpKSkpKSkpKC4pJywgcidcMTE4JywgJ3h5eicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd4ejgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignKCgoKCgoKCgoKHkpKSkpKSkpKSkpKC4pJywgcidcMTFhJywgJ3h5eicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICd4emEnKQorCisgICAgZGVmIHRlc3RfcXVhbGlmaWVkX3JlX3N1YihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ2EnLCAnYicsICdhYWFhYScpLCAnYmJiYmInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YignYScsICdiJywgJ2FhYWFhJywgMSksICdiYWFhYScpCisKKyAgICBkZWYgdGVzdF9idWdfMTE0NjYwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YihyJyhcUylccysoXFMpJywgcidcMSBcMicsICdoZWxsbyAgdGhlcmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnaGVsbG8gdGhlcmUnKQorCisgICAgZGVmIHRlc3RfYnVnXzQ2MjI3MChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBlbXB0eSBzdWIoKSBiZWhhdmlvdXIsIHNlZSBTRiBidWcgIzQ2MjI3MAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1YigneConLCAnLScsICdhYnhkJyksICctYS1iLWQtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWIoJ3grJywgJy0nLCAnYWJ4ZCcpLCAnYWItZCcpCisKKyAgICBkZWYgdGVzdF9zeW1ib2xpY19ncm91cHMoc2VsZik6CisgICAgICAgIHJlLmNvbXBpbGUoJyg/UDxhPngpKD9QPWEpKD8oYSl5KScpCisgICAgICAgIHJlLmNvbXBpbGUoJyg/UDxhMT54KSg/UD1hMSkoPyhhMSl5KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPGE+KSg/UDxhPiknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UHgpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A9KScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD9QPTEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A9YSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UD1hMSknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UD1hLiknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UDwpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoP1A8PiknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UDwxPiknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuY29tcGlsZSwgJyg/UDxhLj4pJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoPygpKScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnKD8oYSkpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoPygxYSkpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLmNvbXBpbGUsICcoPyhhLikpJykKKworICAgIGRlZiB0ZXN0X3N5bWJvbGljX3JlZnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZzxhJywgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpJywgJ1xnPCcsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZycsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KScsICdcZzxhIGE+JywgJ3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMocmUuZXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpJywgJ1xnPD4nLCAneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGc8MWExPicsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHJlLnN1YiwgJyg/UDxhPngpJywgJ1xnPGFiPicsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KXwoP1A8Yj55KScsICdcZzxiPicsICd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5zdWIsICcoP1A8YT54KXwoP1A8Yj55KScsICdcXDInLCAneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUuc3ViLCAnKD9QPGE+eCknLCAnXGc8LTE+JywgJ3h4JykKKworICAgIGRlZiB0ZXN0X3JlX3N1Ym4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3VibigiKD9pKWIrIiwgIngiLCAiYmJiYiBCQkJCIiksICgneCB4JywgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3VibigiYisiLCAieCIsICJiYmJiIEJCQkIiKSwgKCd4IEJCQkInLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zdWJuKCJiKyIsICJ4IiwgInh5eiIpLCAoJ3h5eicsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1Ym4oImIqIiwgIngiLCAieHl6IiksICgneHh4eXh6eCcsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnN1Ym4oImIqIiwgIngiLCAieHl6IiwgMiksICgneHh4eXonLCAyKSkKKworICAgIGRlZiB0ZXN0X3JlX3NwbGl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNwbGl0KCI6IiwgIjphOmI6OmMiKSwgWycnLCAnYScsICdiJywgJycsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIjoqIiwgIjphOmI6OmMiKSwgWycnLCAnYScsICdiJywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiKDoqKSIsICI6YTpiOjpjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWycnLCAnOicsICdhJywgJzonLCAnYicsICc6OicsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIig/OjoqKSIsICI6YTpiOjpjIiksIFsnJywgJ2EnLCAnYicsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIig6KSoiLCAiOmE6Yjo6YyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnJywgJzonLCAnYScsICc6JywgJ2InLCAnOicsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIihbYjpdKykiLCAiOmE6Yjo6YyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnJywgJzonLCAnYScsICc6Yjo6JywgJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiKGIpfCg6KykiLCAiOmE6Yjo6YyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnJywgTm9uZSwgJzonLCAnYScsIE5vbmUsICc6JywgJycsICdiJywgTm9uZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsICc6OicsICdjJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIig/OmIpfCg/OjorKSIsICI6YTpiOjpjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWycnLCAnYScsICcnLCAnJywgJ2MnXSkKKworICAgIGRlZiB0ZXN0X3F1YWxpZmllZF9yZV9zcGxpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zcGxpdCgiOiIsICI6YTpiOjpjIiwgMiksIFsnJywgJ2EnLCAnYjo6YyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNwbGl0KCc6JywgJ2E6YjpjOmQnLCAyKSwgWydhJywgJ2InLCAnYzpkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc3BsaXQoIig6KSIsICI6YTpiOjpjIiwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWycnLCAnOicsICdhJywgJzonLCAnYjo6YyddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNwbGl0KCIoOiopIiwgIjphOmI6OmMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJycsICc6JywgJ2EnLCAnOicsICdiOjpjJ10pCisKKyAgICBkZWYgdGVzdF9yZV9maW5kYWxsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZpbmRhbGwoIjorIiwgImFiYyIpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5maW5kYWxsKCI6KyIsICJhOmI6OmM6OjpkIiksIFsiOiIsICI6OiIsICI6OjoiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5maW5kYWxsKCIoOispIiwgImE6Yjo6Yzo6OmQiKSwgWyI6IiwgIjo6IiwgIjo6OiJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmZpbmRhbGwoIig6KSg6KikiLCAiYTpiOjpjOjo6ZCIpLCBbKCI6IiwgIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCI6IiwgIjoiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiOiIsICI6OiIpXSkKKworICAgIGRlZiB0ZXN0X2J1Z18xMTc2MTIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZmluZGFsbChyIihhfChiKSkiLCAiYWJhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWygiYSIsICIiKSwoImIiLCAiYiIpLCgiYSIsICIiKV0pCisKKyAgICBkZWYgdGVzdF9yZV9tYXRjaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnYScsICdhJykuZ3JvdXBzKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCcoYSknLCAnYScpLmdyb3VwcygpLCAoJ2EnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSknLCAnYScpLmdyb3VwKDApLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSknLCAnYScpLmdyb3VwKDEpLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSknLCAnYScpLmdyb3VwKDEsIDEpLCAoJ2EnLCAnYScpKQorCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUoJygoYSl8KGIpKShjKT8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYScpLmdyb3VwcygpLCAoJ2EnLCAnYScsIE5vbmUsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYicpLmdyb3VwcygpLCAoJ2InLCBOb25lLCAnYicsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYWMnKS5ncm91cHMoKSwgKCdhJywgJ2EnLCBOb25lLCAnYycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYmMnKS5ncm91cHMoKSwgKCdiJywgTm9uZSwgJ2InLCAnYycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYmMnKS5ncm91cHMoIiIpLCAoJ2InLCAiIiwgJ2InLCAnYycpKQorCisgICAgICAgICMgQSBzaW5nbGUgZ3JvdXAKKyAgICAgICAgbSA9IHJlLm1hdGNoKCcoYSknLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgwKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoMCksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLmdyb3VwKDEpLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5ncm91cCgxLCAxKSwgKCdhJywgJ2EnKSkKKworICAgICAgICBwYXQgPSByZS5jb21waWxlKCcoPzooP1A8YTE+YSl8KD9QPGIyPmIpKSg/UDxjMz5jKT8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdC5tYXRjaCgnYScpLmdyb3VwKDEsIDIsIDMpLCAoJ2EnLCBOb25lLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goJ2InKS5ncm91cCgnYTEnLCAnYjInLCAnYzMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2InLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXQubWF0Y2goJ2FjJykuZ3JvdXAoMSwgJ2IyJywgMyksICgnYScsIE5vbmUsICdjJykpCisKKyAgICBkZWYgdGVzdF9yZV9ncm91cHJlZl9leGlzdHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oXCgpPyhbXigpXSspKD8oMSlcKSkkJywgJyhhKScpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnKCcsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oXCgpPyhbXigpXSspKD8oMSlcKSkkJywgJ2EnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnYSknKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXihcKCk/KFteKCldKykoPygxKVwpKSQnLCAnKGEnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXig/OihhKXxjKSgoPygxKWJ8ZCkpJCcsICdhYicpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsICdiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oPzooYSl8YykoKD8oMSlifGQpKSQnLCAnY2QnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgJ2QnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXig/OihhKXxjKSgoPygxKXxkKSkkJywgJ2NkJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICdkJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oPzooYSl8YykoKD8oMSl8ZCkpJCcsICdhJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdhJywgJycpKQorCisgICAgICAgICMgVGVzdHMgZm9yIGJ1ZyAjMTE3NzgzMTogZXhlcmNpc2UgZ3JvdXBzIG90aGVyIHRoYW4gdGhlIGZpcnN0IGdyb3VwCisgICAgICAgIHAgPSByZS5jb21waWxlKCcoP1A8ZzE+YSkoP1A8ZzI+Yik/KCg/KGcyKWN8ZCkpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm1hdGNoKCdhYmMnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EnLCAnYicsICdjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5tYXRjaCgnYWQnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EnLCBOb25lLCAnZCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubWF0Y2goJ2FiZCcpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubWF0Y2goJ2FjJyksIE5vbmUpCisKKworICAgIGRlZiB0ZXN0X3JlX2dyb3VwcmVmKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXihcfCk/KFteKCldKylcMSQnLCAnfGF8JykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCd8JywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJ14oXHwpPyhbXigpXSspXDE/JCcsICdhJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocideKFx8KT8oW14oKV0rKVwxJCcsICdhfCcpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInXihcfCk/KFteKCldKylcMSQnLCAnfGEnKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyJ14oPzooYSl8YykoXDEpJCcsICdhYScpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYScsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocideKD86KGEpfGMpKFwxKT8kJywgJ2MnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9ncm91cGRpY3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJyg/UDxmaXJzdD5maXJzdCkgKD9QPHNlY29uZD5zZWNvbmQpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmlyc3Qgc2Vjb25kJykuZ3JvdXBkaWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgeydmaXJzdCc6J2ZpcnN0JywgJ3NlY29uZCc6J3NlY29uZCd9KQorCisgICAgZGVmIHRlc3RfZXhwYW5kKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoP1A8Zmlyc3Q+Zmlyc3QpICg/UDxzZWNvbmQ+c2Vjb25kKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0IHNlY29uZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmV4cGFuZChyIlwyIFwxIFxnPHNlY29uZD4gXGc8Zmlyc3Q+IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZCBmaXJzdCBzZWNvbmQgZmlyc3QiKQorCisgICAgZGVmIHRlc3RfcmVwZWF0X21pbm1heChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7MX0kIiwgImFiYyIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxfT8kIiwgImFiYyIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxLDJ9JCIsICJhYmMiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7MSwyfT8kIiwgImFiYyIpLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezN9JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxLDN9JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxLDR9JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXszLDR9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7M30/JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJeKFx3KXsxLDN9PyQiLCAiYWJjIikuZ3JvdXAoMSksICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXihcdyl7MSw0fT8kIiwgImFiYyIpLmdyb3VwKDEpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl4oXHcpezMsNH0/JCIsICJhYmMiKS5ncm91cCgxKSwgImMiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl54ezF9JCIsICJ4eHgiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXnh7MX0/JCIsICJ4eHgiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiXnh7MSwyfSQiLCAieHh4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl54ezEsMn0/JCIsICJ4eHgiKSwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCJeeHszfSQiLCAieHh4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIl54ezEsM30kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCJeeHsxLDR9JCIsICJ4eHgiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaCgiXnh7Myw0fT8kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCJeeHszfT8kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCJeeHsxLDN9PyQiLCAieHh4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2goIl54ezEsNH0/JCIsICJ4eHgiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaCgiXnh7Myw0fT8kIiwgInh4eCIpLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIl54e30kIiwgInh4eCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCJeeHt9JCIsICJ4e30iKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2dldGF0dHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goIihhKSIsICJhIikucG9zLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSkiLCAiYSIpLmVuZHBvcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKGEpIiwgImEiKS5zdHJpbmcsICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKGEpIiwgImEiKS5yZWdzLCAoKDAsIDEpLCAoMCwgMSkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKCIoYSkiLCAiYSIpLnJlLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc3BlY2lhbF9lc2NhcGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxiKGIuKVxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiY2QgYWJjIGJjZCBieCIpLmdyb3VwKDEpLCAiYngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxCKGIuKVxCIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiYyBiY2QgYmMgYWJ4ZCIpLmdyb3VwKDEpLCAiYngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxiKGIuKVxiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiY2QgYWJjIGJjZCBieCIsIHJlLkxPQ0FMRSkuZ3JvdXAoMSksICJieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXEIoYi4pXEIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWJjIGJjZCBiYyBhYnhkIiwgcmUuTE9DQUxFKS5ncm91cCgxKSwgImJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcYihiLilcYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmNkIGFiYyBiY2QgYngiLCByZS5VTklDT0RFKS5ncm91cCgxKSwgImJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcQihiLilcQiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMgYmNkIGJjIGFieGQiLCByZS5VTklDT0RFKS5ncm91cCgxKSwgImJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJeYWJjJCIsICJcbmFiY1xuIiwgcmUuTSkuZ3JvdXAoMCksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIl5cQWFiY1xaJCIsICJhYmMiLCByZS5NKS5ncm91cCgwKSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXlxBYWJjXFokIiwgIlxuYWJjXG4iLCByZS5NKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5zZWFyY2gociJcYihiLilcYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUiYWJjZCBhYmMgYmNkIGJ4IikuZ3JvdXAoMSksICJieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXEIoYi4pXEIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ImFiYyBiY2QgYmMgYWJ4ZCIpLmdyb3VwKDEpLCAiYngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIl5hYmMkIiwgdSJcbmFiY1xuIiwgcmUuTSkuZ3JvdXAoMCksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIl5cQWFiY1xaJCIsIHUiYWJjIiwgcmUuTSkuZ3JvdXAoMCksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIl5cQWFiY1xaJCIsIHUiXG5hYmNcbiIsIHJlLk0pLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxkXERcd1xXXHNcUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxYWEhIGEiKS5ncm91cCgwKSwgIjFhYSEgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXGRcRFx3XFdcc1xTIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjFhYSEgYSIsIHJlLkxPQ0FMRSkuZ3JvdXAoMCksICIxYWEhIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaChyIlxkXERcd1xXXHNcUyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxYWEhIGEiLCByZS5VTklDT0RFKS5ncm91cCgwKSwgIjFhYSEgYSIpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfYm91bmRhcmllcyhzZWxmKToKKyAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTEwNzEzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXGIoYWJjKVxiIiwgImFiYyIpLmdyb3VwKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhYmMiKQorICAgICAgICAjIFRoZXJlJ3MgYSB3b3JkIGJvdW5kYXJ5IGF0IHRoZSBzdGFydCBvZiBhIHN0cmluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHIiXGIiLCAiYWJjIikpCisgICAgICAgICMgQSBub24tZW1wdHkgc3RyaW5nIGluY2x1ZGVzIGEgbm9uLWJvdW5kYXJ5IHplcm8tbGVuZ3RoIG1hdGNoLgorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKHIiXEIiLCAiYWJjIikpCisgICAgICAgICMgVGhlcmUgaXMgbm8gbm9uLWJvdW5kYXJ5IG1hdGNoIGF0IHRoZSBzdGFydCBvZiBhIHN0cmluZy4KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZS5tYXRjaChyIlxCIiwgImFiYyIpKQorICAgICAgICAjIEhvd2V2ZXIsIGFuIGVtcHR5IHN0cmluZyBjb250YWlucyBubyB3b3JkIGJvdW5kYXJpZXMsIGFuZCBhbHNvIG5vCisgICAgICAgICMgbm9uLWJvdW5kYXJpZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXEIiLCAiIiksIE5vbmUpCisgICAgICAgICMgVGhpcyBvbmUgaXMgcXVlc3Rpb25hYmxlIGFuZCBkaWZmZXJlbnQgZnJvbSB0aGUgcGVybHJlIGJlaGF2aW91ciwKKyAgICAgICAgIyBidXQgZGVzY3JpYmVzIGN1cnJlbnQgYmVoYXZpb3IuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuc2VhcmNoKHIiXGIiLCAiIiksIE5vbmUpCisgICAgICAgICMgQSBzaW5nbGUgd29yZC1jaGFyYWN0ZXIgc3RyaW5nIGhhcyB0d28gYm91bmRhcmllcywgYnV0IG5vCisgICAgICAgICMgbm9uLWJvdW5kYXJ5IGdhcHMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlLmZpbmRhbGwociJcYiIsICJhIikpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZS5maW5kYWxsKHIiXEIiLCAiYSIpKSwgMCkKKyAgICAgICAgIyBJZiB0aGVyZSBhcmUgbm8gd29yZHMsIHRoZXJlIGFyZSBubyBib3VuZGFyaWVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlLmZpbmRhbGwociJcYiIsICIgIikpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZS5maW5kYWxsKHIiXGIiLCAiICAgIikpLCAwKQorICAgICAgICAjIENhbiBtYXRjaCBhcm91bmQgdGhlIHdoaXRlc3BhY2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlLmZpbmRhbGwociJcQiIsICIgIikpLCAyKQorCisgICAgZGVmIHRlc3RfYmlnY2hhcnNldChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCh1IihbXHUyMjIyXHUyMjIzXSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUiXHUyMjIyIikuZ3JvdXAoMSksIHUiXHUyMjIyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCh1IihbXHUyMjIyXHUyMjIzXSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUiXHUyMjIyIiwgcmUuVU5JQ09ERSkuZ3JvdXAoMSksIHUiXHUyMjIyIikKKworICAgIGRlZiB0ZXN0X2JpZ19jb2Rlc2l6ZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTE2MAorICAgICAgICByID0gcmUuY29tcGlsZSgnfCcuam9pbigoJyVkJyV4IGZvciB4IGluIHJhbmdlKDEwMDAwKSkpKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShyLm1hdGNoKCcxMDAwJykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHIubWF0Y2goJzk5OTknKSkKKworICAgIGRlZiB0ZXN0X2FueWFsbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiYS5iIiwgImFcbmIiLCByZS5ET1RBTEwpLmdyb3VwKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhXG5iIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiYS4qYiIsICJhXG5cbmIiLCByZS5ET1RBTEwpLmdyb3VwKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICJhXG5cbmIiKQorCisgICAgZGVmIHRlc3Rfbm9uX2NvbnN1bWluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKGEoPz1cc1teYV0pKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSg/PVxzW15hXSopKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSg/PVxzW2FiY10pKSIsICJhIGIiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCIoYSg/PVxzW2FiY10qKSkiLCAiYSBiYyIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSkoPz1cc1wxKSIsICJhIGEiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKGEpKD89XHNcMSopIiwgImEgYWEiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKGEpKD89XHMoYWJjfGEpKSIsICJhIGEiKS5ncm91cCgxKSwgImEiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSg/IVxzW15hXSkpIiwgImEgYSIpLmdyb3VwKDEpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYSg/IVxzW2FiY10pKSIsICJhIGQiKS5ncm91cCgxKSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKGEpKD8hXHNcMSkiLCAiYSBiIikuZ3JvdXAoMSksICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhKSg/IVxzKGFiY3xhKSkiLCAiYSBiIikuZ3JvdXAoMSksICJhIikKKworICAgIGRlZiB0ZXN0X2lnbm9yZV9jYXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJhYmMiLCAiQUJDIiwgcmUuSSkuZ3JvdXAoMCksICJBQkMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJhYmMiLCB1IkFCQyIsIHJlLkkpLmdyb3VwKDApLCAiQUJDIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIihhXHNbXmFdKSIsICJhIGIiLCByZS5JKS5ncm91cCgxKSwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYVxzW15hXSopIiwgImEgYmIiLCByZS5JKS5ncm91cCgxKSwgImEgYmIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKGFcc1thYmNdKSIsICJhIGIiLCByZS5JKS5ncm91cCgxKSwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoYVxzW2FiY10qKSIsICJhIGJiIiwgcmUuSSkuZ3JvdXAoMSksICJhIGJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIigoYSlcc1wyKSIsICJhIGEiLCByZS5JKS5ncm91cCgxKSwgImEgYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoKGEpXHNcMiopIiwgImEgYWEiLCByZS5JKS5ncm91cCgxKSwgImEgYWEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKChhKVxzKGFiY3xhKSkiLCAiYSBhIiwgcmUuSSkuZ3JvdXAoMSksICJhIGEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiKChhKVxzKGFiY3xhKSopIiwgImEgYWEiLCByZS5JKS5ncm91cCgxKSwgImEgYWEiKQorCisgICAgZGVmIHRlc3RfY2F0ZWdvcnkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gociIoXHMpIiwgIiAiKS5ncm91cCgxKSwgIiAiKQorCisgICAgZGVmIHRlc3RfZ2V0bG93ZXIoc2VsZik6CisgICAgICAgIGltcG9ydCBfc3JlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3NyZS5nZXRsb3dlcihvcmQoJ0EnKSwgMCksIG9yZCgnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zcmUuZ2V0bG93ZXIob3JkKCdBJyksIHJlLkxPQ0FMRSksIG9yZCgnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9zcmUuZ2V0bG93ZXIob3JkKCdBJyksIHJlLlVOSUNPREUpLCBvcmQoJ2EnKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJhYmMiLCAiQUJDIiwgcmUuSSkuZ3JvdXAoMCksICJBQkMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCJhYmMiLCB1IkFCQyIsIHJlLkkpLmdyb3VwKDApLCAiQUJDIikKKworICAgIGRlZiB0ZXN0X25vdF9saXRlcmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgiXHMoW15hXSkiLCAiIGIiKS5ncm91cCgxKSwgImIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgiXHMoW15hXSopIiwgIiBiYiIpLmdyb3VwKDEpLCAiYmIiKQorCisgICAgZGVmIHRlc3Rfc2VhcmNoX2NvdmVyYWdlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgiXHMoYikiLCAiIGIiKS5ncm91cCgxKSwgImIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgiYVxzIiwgImEgIikuZ3JvdXAoMCksICJhICIpCisKKyAgICBkZWYgYXNzZXJ0TWF0Y2goc2VsZiwgcGF0dGVybiwgdGV4dCwgbWF0Y2g9Tm9uZSwgc3Bhbj1Ob25lLAorICAgICAgICAgICAgICAgICAgICBtYXRjaGVyPXJlLm1hdGNoKToKKyAgICAgICAgaWYgbWF0Y2ggaXMgTm9uZSBhbmQgc3BhbiBpcyBOb25lOgorICAgICAgICAgICAgIyB0aGUgcGF0dGVybiBtYXRjaGVzIHRoZSB3aG9sZSB0ZXh0CisgICAgICAgICAgICBtYXRjaCA9IHRleHQKKyAgICAgICAgICAgIHNwYW4gPSAoMCwgbGVuKHRleHQpKQorICAgICAgICBlbGlmIG1hdGNoIGlzIE5vbmUgb3Igc3BhbiBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSWYgbWF0Y2ggaXMgbm90IE5vbmUsIHNwYW4gc2hvdWxkIGJlIHNwZWNpZmllZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoYW5kIHZpY2UgdmVyc2EpLicpCisgICAgICAgIG0gPSBtYXRjaGVyKHBhdHRlcm4sIHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZ3JvdXAoKSwgbWF0Y2gpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zcGFuKCksIHNwYW4pCisKKyAgICBkZWYgdGVzdF9yZV9lc2NhcGUoc2VsZik6CisgICAgICAgIGFsbnVtX2NoYXJzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzCisgICAgICAgIHAgPSB1Jycuam9pbih1bmljaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMjU2KSkKKyAgICAgICAgZm9yIGMgaW4gcDoKKyAgICAgICAgICAgIGlmIGMgaW4gYWxudW1fY2hhcnM6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5lc2NhcGUoYyksIGMpCisgICAgICAgICAgICBlbGlmIGMgPT0gdSdceDAwJzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmVzY2FwZShjKSwgdSdcXDAwMCcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZXNjYXBlKGMpLCB1J1xcJyArIGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydE1hdGNoKHJlLmVzY2FwZShjKSwgYykKKyAgICAgICAgc2VsZi5hc3NlcnRNYXRjaChyZS5lc2NhcGUocCksIHApCisKKyAgICBkZWYgdGVzdF9yZV9lc2NhcGVfYnl0ZShzZWxmKToKKyAgICAgICAgYWxudW1fY2hhcnMgPSAoc3RyaW5nLmFzY2lpX2xldHRlcnMgKyBzdHJpbmcuZGlnaXRzKS5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgcCA9ICcnLmpvaW4oY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NikpCisgICAgICAgIGZvciBiIGluIHA6CisgICAgICAgICAgICBpZiBiIGluIGFsbnVtX2NoYXJzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZXNjYXBlKGIpLCBiKQorICAgICAgICAgICAgZWxpZiBiID09IGInXHgwMCc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5lc2NhcGUoYiksIGInXFwwMDAnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmVzY2FwZShiKSwgYidcXCcgKyBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRNYXRjaChyZS5lc2NhcGUoYiksIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0TWF0Y2gocmUuZXNjYXBlKHApLCBwKQorCisgICAgZGVmIHRlc3RfcmVfZXNjYXBlX25vbl9hc2NpaShzZWxmKToKKyAgICAgICAgcyA9IHUneHh4XHUyNjIwXHUyNjIwXHUyNjIweHh4JworICAgICAgICBzX2VzY2FwZWQgPSByZS5lc2NhcGUocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzX2VzY2FwZWQsIHUneHh4XFxcdTI2MjBcXFx1MjYyMFxcXHUyNjIweHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRNYXRjaChzX2VzY2FwZWQsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0TWF0Y2godScuJXMrLicgJSByZS5lc2NhcGUodSdcdTI2MjAnKSwgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J3hcdTI2MjBcdTI2MjBcdTI2MjB4JywgKDIsIDcpLCByZS5zZWFyY2gpCisKKyAgICBkZWYgdGVzdF9yZV9lc2NhcGVfbm9uX2FzY2lpX2J5dGVzKHNlbGYpOgorICAgICAgICBiID0gdSd5XHUyNjIweVx1MjYyMHknLmVuY29kZSgndXRmLTgnKQorICAgICAgICBiX2VzY2FwZWQgPSByZS5lc2NhcGUoYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiX2VzY2FwZWQsIGIneVxcXHhlMlxcXHg5OFxcXHhhMHlcXFx4ZTJcXFx4OThcXFx4YTB5JykKKyAgICAgICAgc2VsZi5hc3NlcnRNYXRjaChiX2VzY2FwZWQsIGIpCisgICAgICAgIHJlcyA9IHJlLmZpbmRhbGwocmUuZXNjYXBlKHUnXHUyNjIwJy5lbmNvZGUoJ3V0Zi04JykpLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXMpLCAyKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIGltcG9ydCBwaWNrbGUKKyAgICAgICAgc2VsZi5waWNrbGVfdGVzdChwaWNrbGUpCisgICAgICAgIGltcG9ydCBjUGlja2xlCisgICAgICAgIHNlbGYucGlja2xlX3Rlc3QoY1BpY2tsZSkKKyAgICAgICAgIyBvbGQgcGlja2xlcyBleHBlY3QgdGhlIF9jb21waWxlKCkgcmVjb25zdHJ1Y3RvciBpbiBzcmUgbW9kdWxlCisgICAgICAgIGltcG9ydF9tb2R1bGUoInNyZSIsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKyAgICAgICAgZnJvbSBzcmUgaW1wb3J0IF9jb21waWxlCisKKyAgICBkZWYgcGlja2xlX3Rlc3Qoc2VsZiwgcGlja2xlKToKKyAgICAgICAgb2xkcGF0ID0gcmUuY29tcGlsZSgnYSg/OmJ8KGN8ZSl7MSwyfT98ZCkrPyguKScpCisgICAgICAgIHMgPSBwaWNrbGUuZHVtcHMob2xkcGF0KQorICAgICAgICBuZXdwYXQgPSBwaWNrbGUubG9hZHMocykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvbGRwYXQsIG5ld3BhdCkKKworICAgIGRlZiB0ZXN0X2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5JLCByZS5JR05PUkVDQVNFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLkwsIHJlLkxPQ0FMRSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5NLCByZS5NVUxUSUxJTkUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuUywgcmUuRE9UQUxMKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLlgsIHJlLlZFUkJPU0UpCisKKyAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKKyAgICAgICAgZm9yIGZsYWcgaW4gW3JlLkksIHJlLk0sIHJlLlgsIHJlLlMsIHJlLkxdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5jb21waWxlKCdecGF0dGVybiQnLCBmbGFnKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3NyZV9jaGFyYWN0ZXJfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgIGZvciBpIGluIFswLCA4LCAxNiwgMzIsIDY0LCAxMjcsIDEyOCwgMjU1XToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJcJTAzbyIgJSBpLCBjaHIoaSkpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIlwlMDNvMCIgJSBpLCBjaHIoaSkrIjAiKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJcJTAzbzgiICUgaSwgY2hyKGkpKyI4IiksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiXHglMDJ4IiAlIGksIGNocihpKSksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiXHglMDJ4MCIgJSBpLCBjaHIoaSkrIjAiKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJceCUwMnh6IiAlIGksIGNocihpKSsieiIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUubWF0Y2gsICJcOTExIiwgIiIpCisKKyAgICBkZWYgdGVzdF9zcmVfY2hhcmFjdGVyX2NsYXNzX2xpdGVyYWxzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiBbMCwgOCwgMTYsIDMyLCA2NCwgMTI3LCAxMjgsIDI1NV06CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiW1wlMDNvXSIgJSBpLCBjaHIoaSkpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIltcJTAzbzBdIiAlIGksIGNocihpKSksIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlLm1hdGNoKHIiW1wlMDNvOF0iICUgaSwgY2hyKGkpKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmUubWF0Y2gociJbXHglMDJ4XSIgJSBpLCBjaHIoaSkpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIltceCUwMngwXSIgJSBpLCBjaHIoaSkpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZS5tYXRjaChyIltceCUwMnh6XSIgJSBpLCBjaHIoaSkpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhyZS5lcnJvciwgcmUubWF0Y2gsICJbXDkxMV0iLCAiIikKKworICAgIGRlZiB0ZXN0X2J1Z18xMTMyNTQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSl8KGIpJywgJ2InKS5zdGFydCgxKSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSl8KGIpJywgJ2InKS5lbmQoMSksIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInKGEpfChiKScsICdiJykuc3BhbigxKSwgKC0xLCAtMSkpCisKKyAgICBkZWYgdGVzdF9idWdfNTI3MzcxKHNlbGYpOgorICAgICAgICAjIGJ1ZyBkZXNjcmliZWQgaW4gcGF0Y2hlcyA1MjczNzEvNjcyNDkxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSk/YScsJ2EnKS5sYXN0aW5kZXgsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoYSkoYik/YicsJ2FiJykubGFzdGluZGV4LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInKD9QPGE+YSkoP1A8Yj5iKT9iJywnYWInKS5sYXN0Z3JvdXAsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKD9QPGE+YShiKSkiLCAiYWIiKS5sYXN0Z3JvdXAsICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgiKChhKSkiLCAiYSIpLmxhc3RpbmRleCwgMSkKKworICAgIGRlZiB0ZXN0X2J1Z181NDU4NTUoc2VsZik6CisgICAgICAgICMgYnVnIDU0NTg1NSAtLSBUaGlzIHBhdHRlcm4gZmFpbGVkIHRvIGNhdXNlIGEgY29tcGlsZSBlcnJvciBhcyBpdAorICAgICAgICAjIHNob3VsZCwgaW5zdGVhZCBwcm92b2tpbmcgYSBUeXBlRXJyb3IuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHJlLmVycm9yLCByZS5jb21waWxlLCAnZm9vW2EtJykKKworICAgIGRlZiB0ZXN0X2J1Z180MTg2MjYoc2VsZik6CisgICAgICAgICMgYnVncyA0MTg2MjYgYXQgYWwuIC0tIFRlc3RpbmcgR3JlZyBDaGFwbWFuJ3MgYWRkaXRpb24gb2Ygb3AgY29kZQorICAgICAgICAjIFNSRV9PUF9NSU5fUkVQRUFUX09ORSBmb3IgZWxpbWluYXRpbmcgcmVjdXJzaW9uIG9uIHNpbXBsZSB1c2VzIG9mCisgICAgICAgICMgcGF0dGVybiAnKj8nIG9uIGEgbG9uZyBzdHJpbmcuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJy4qP2MnLCAxMDAwMConYWInKydjZCcpLmVuZCgwKSwgMjAwMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJy4qP2NkJywgNTAwMConYWInKydjJys1MDAwKidhYicrJ2NkZScpLmVuZCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAyMDAwMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnLio/Y2QnLCAyMDAwMConYWJjJysnZGUnKS5lbmQoMCksIDYwMDAxKQorICAgICAgICAjIG5vbi1zaW1wbGUgJyo/JyBzdGlsbCB1c2VkIHRvIGhpdCB0aGUgcmVjdXJzaW9uIGxpbWl0LCBiZWZvcmUgdGhlCisgICAgICAgICMgbm9uLXJlY3Vyc2l2ZSBzY2hlbWUgd2FzIGltcGxlbWVudGVkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLnNlYXJjaCgnKGF8YikqP2MnLCAxMDAwMConYWInKydjZCcpLmVuZCgwKSwgMjAwMDEpCisKKyAgICBkZWYgdGVzdF9idWdfNjEyMDc0KHNlbGYpOgorICAgICAgICBwYXQ9dSJbIityZS5lc2NhcGUodSJcdTIwMzkiKSt1Il0iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuY29tcGlsZShwYXQpIGFuZCAxLCAxKQorCisgICAgZGVmIHRlc3Rfc3RhY2tfb3ZlcmZsb3coc2VsZik6CisgICAgICAgICMgbmFzdHkgY2FzZXMgdGhhdCB1c2VkIHRvIG92ZXJmbG93IHRoZSBzdHJhaWdodGZvcndhcmQgcmVjdXJzaXZlCisgICAgICAgICMgaW1wbGVtZW50YXRpb24gb2YgcmVwZWF0ZWQgZ3JvdXBzLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCcoeCkqJywgNTAwMDAqJ3gnKS5ncm91cCgxKSwgJ3gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCcoeCkqeScsIDUwMDAwKid4JysneScpLmdyb3VwKDEpLCAneCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJyh4KSo/eScsIDUwMDAwKid4JysneScpLmdyb3VwKDEpLCAneCcpCisKKyAgICBkZWYgdGVzdF91bmxpbWl0ZWRfemVyb193aWR0aF9yZXBlYXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzk2NjkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoPzphPykqeScsICd6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKD86YT8pK3knLCAneicpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OmE/KXsyLH15JywgJ3onKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2gocicoPzphPykqP3knLCAneicpKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZS5tYXRjaChyJyg/OmE/KSs/eScsICd6JykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHInKD86YT8pezIsfT95JywgJ3onKSkKKworICAgIGRlZiB0ZXN0X3NjYW5uZXIoc2VsZik6CisgICAgICAgIGRlZiBzX2lkZW50KHNjYW5uZXIsIHRva2VuKTogcmV0dXJuIHRva2VuCisgICAgICAgIGRlZiBzX29wZXJhdG9yKHNjYW5uZXIsIHRva2VuKTogcmV0dXJuICJvcCVzIiAlIHRva2VuCisgICAgICAgIGRlZiBzX2Zsb2F0KHNjYW5uZXIsIHRva2VuKTogcmV0dXJuIGZsb2F0KHRva2VuKQorICAgICAgICBkZWYgc19pbnQoc2Nhbm5lciwgdG9rZW4pOiByZXR1cm4gaW50KHRva2VuKQorCisgICAgICAgIHNjYW5uZXIgPSBTY2FubmVyKFsKKyAgICAgICAgICAgIChyIlthLXpBLVpfXVx3KiIsIHNfaWRlbnQpLAorICAgICAgICAgICAgKHIiXGQrXC5cZCoiLCBzX2Zsb2F0KSwKKyAgICAgICAgICAgIChyIlxkKyIsIHNfaW50KSwKKyAgICAgICAgICAgIChyIj18XCt8LXxcKnwvIiwgc19vcGVyYXRvciksCisgICAgICAgICAgICAociJccysiLCBOb25lKSwKKyAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzY2FubmVyLnNjYW5uZXIuc2Nhbm5lcigiIikucGF0dGVybiwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNjYW5uZXIuc2Nhbigic3VtID0gMypmb28gKyAzMTIuNTAgKyBiYXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoWydzdW0nLCAnb3A9JywgMywgJ29wKicsICdmb28nLCAnb3ArJywgMzEyLjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnb3ArJywgJ2JhciddLCAnJykpCisKKyAgICBkZWYgdGVzdF9idWdfNDQ4OTUxKHNlbGYpOgorICAgICAgICAjIGJ1ZyA0NDg5NTEgKHNpbWlsYXIgdG8gNDI5MzU3LCBidXQgd2l0aCBzaW5nbGUgY2hhciBtYXRjaCkKKyAgICAgICAgIyAoQWxzbyB0ZXN0IGdyZWVkeSBtYXRjaGVzLikKKyAgICAgICAgZm9yIG9wIGluICcnLCc/JywnKic6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHInKCguJXMpOik/eiclb3AsICd6JykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb25lLCBOb25lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2gocicoKC4lcyk6KT96JyVvcCwgJ2E6eicpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2E6JywgJ2EnKSkKKworICAgIGRlZiB0ZXN0X2J1Z183MjUxMDYoc2VsZik6CisgICAgICAgICMgY2FwdHVyaW5nIGdyb3VwcyBpbiBhbHRlcm5hdGl2ZXMgaW4gcmVwZWF0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKChhKXxiKSonLCAnYWJjJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdiJywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXigoW2FiXSl8YykqJywgJ2FiYycpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYycsICdiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oKGQpfFthYl0pKicsICdhYmMnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2InLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXigoYSljfFthYl0pKicsICdhYmMnKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2InLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXigoYSl8YikqP2MnLCAnYWJjJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdiJywgJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnXigoW2FiXSl8YykqP2QnLCAnYWJjZCcpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYycsICdiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUubWF0Y2goJ14oKGQpfFthYl0pKj9jJywgJ2FiYycpLmdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnYicsIE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeKChhKWN8W2FiXSkqP2MnLCAnYWJjJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdiJywgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9idWdfNzI1MTQ5KHNlbGYpOgorICAgICAgICAjIG1hcmtfc3RhY2tfYmFzZSByZXN0b3JpbmcgYmVmb3JlIHJlc3RvcmluZyBtYXJrcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCcoYSkoPzooPz0oYikqKWMpKicsICdhYmInKS5ncm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ2EnLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaCgnKGEpKCg/IShiKSopKSonLCAnYWJiJykuZ3JvdXBzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdhJywgTm9uZSwgTm9uZSkpCisKKyAgICBkZWYgdGVzdF9idWdfNzY0NTQ4KHNlbGYpOgorICAgICAgICAjIGJ1ZyA3NjQ1NDgsIHJlLmNvbXBpbGUoKSBiYXJmcyBvbiBzdHIvdW5pY29kZSBzdWJjbGFzc2VzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAgIyBubyBwcm9ibGVtIGlmIHdlIGhhdmUgbm8gdW5pY29kZQorICAgICAgICBjbGFzcyBteV91bmljb2RlKHVuaWNvZGUpOiBwYXNzCisgICAgICAgIHBhdCA9IHJlLmNvbXBpbGUobXlfdW5pY29kZSgiYWJjIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0Lm1hdGNoKCJ4eXoiKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRpdGVyKHNlbGYpOgorICAgICAgICBpdGVyID0gcmUuZmluZGl0ZXIociI6KyIsICJhOmI6OmM6OjpkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbaXRlbS5ncm91cCgwKSBmb3IgaXRlbSBpbiBpdGVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbIjoiLCAiOjoiLCAiOjo6Il0pCisKKyAgICBkZWYgdGVzdF9idWdfOTI2MDc1KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIyBubyBwcm9ibGVtIGlmIHdlIGhhdmUgbm8gdW5pY29kZQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuY29tcGlsZSgnYnVnXzkyNjA3NScpIGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgcmUuY29tcGlsZShldmFsKCJ1J2J1Z185MjYwNzUnIikpKQorCisgICAgZGVmIHRlc3RfYnVnXzkzMTg0OChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY29kZQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBwYXR0ZXJuID0gZXZhbCgndSJbXHUwMDJFXHUzMDAyXHVGRjBFXHVGRjYxXSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmNvbXBpbGUocGF0dGVybikuc3BsaXQoImEuYi5jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydhJywnYicsJ2MnXSkKKworICAgIGRlZiB0ZXN0X2J1Z181ODEwODAoc2VsZik6CisgICAgICAgIGl0ZXIgPSByZS5maW5kaXRlcihyIlxzIiwgImEgYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlci5uZXh0KCkuc3BhbigpLCAoMSwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgaXRlci5uZXh0KQorCisgICAgICAgIHNjYW5uZXIgPSByZS5jb21waWxlKHIiXHMiKS5zY2FubmVyKCJhIGIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNjYW5uZXIuc2VhcmNoKCkuc3BhbigpLCAoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Nhbm5lci5zZWFyY2goKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2J1Z184MTcyMzQoc2VsZik6CisgICAgICAgIGl0ZXIgPSByZS5maW5kaXRlcihyIi4qIiwgImFzZGYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIubmV4dCgpLnNwYW4oKSwgKDAsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIubmV4dCgpLnNwYW4oKSwgKDQsIDQpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBpdGVyLm5leHQpCisKKyAgICBkZWYgdGVzdF9idWdfNjU2MShzZWxmKToKKyAgICAgICAgIyAnXGQnIHNob3VsZCBtYXRjaCBjaGFyYWN0ZXJzIGluIFVuaWNvZGUgY2F0ZWdvcnkgJ05kJworICAgICAgICAjIChOdW1iZXIsIERlY2ltYWwgRGlnaXQpLCBidXQgbm90IHRob3NlIGluICdObCcgKE51bWJlciwKKyAgICAgICAgIyBMZXR0ZXIpIG9yICdObycgKE51bWJlciwgT3RoZXIpLgorICAgICAgICBkZWNpbWFsX2RpZ2l0cyA9IFsKKyAgICAgICAgICAgIHUnXHUwMDM3JywgIyAnXE57RElHSVQgU0VWRU59JywgY2F0ZWdvcnkgJ05kJworICAgICAgICAgICAgdSdcdTBlNTgnLCAjICdcTntUSEFJIERJR0lUIFNJWH0nLCBjYXRlZ29yeSAnTmQnCisgICAgICAgICAgICB1J1x1ZmYxMCcsICMgJ1xOe0ZVTExXSURUSCBESUdJVCBaRVJPfScsIGNhdGVnb3J5ICdOZCcKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gZGVjaW1hbF9kaWdpdHM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKCdeXGQkJywgeCwgcmUuVU5JQ09ERSkuZ3JvdXAoMCksIHgpCisKKyAgICAgICAgbm90X2RlY2ltYWxfZGlnaXRzID0gWworICAgICAgICAgICAgdSdcdTIxNjUnLCAjICdcTntST01BTiBOVU1FUkFMIFNJWH0nLCBjYXRlZ29yeSAnTmwnCisgICAgICAgICAgICB1J1x1MzAzOScsICMgJ1xOe0hBTkdaSE9VIE5VTUVSQUwgVFdFTlRZfScsIGNhdGVnb3J5ICdObCcKKyAgICAgICAgICAgIHUnXHUyMDgyJywgIyAnXE57U1VCU0NSSVBUIFRXT30nLCBjYXRlZ29yeSAnTm8nCisgICAgICAgICAgICB1J1x1MzJiNCcsICMgJ1xOe0NJUkNMRUQgTlVNQkVSIFRISVJUWSBOSU5FfScsIGNhdGVnb3J5ICdObycKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHggaW4gbm90X2RlY2ltYWxfZGlnaXRzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmUubWF0Y2goJ15cZCQnLCB4LCByZS5VTklDT0RFKSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X2FycmF5KHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZiAxNjQ3NTQxCisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICBmb3IgdHlwZWNvZGUgaW4gJ2NiQnVoSGlJbExmZCc6CisgICAgICAgICAgICBhID0gYXJyYXkuYXJyYXkodHlwZWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLmNvbXBpbGUoImJsYSIpLm1hdGNoKGEpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5jb21waWxlKCIiKS5tYXRjaChhKS5ncm91cHMoKSwgKCkpCisKKyAgICBkZWYgdGVzdF9pbmxpbmVfZmxhZ3Moc2VsZik6CisgICAgICAgICMgQnVnICMxNzAwCisgICAgICAgIHVwcGVyX2NoYXIgPSB1bmljaHIoMHgxZWEwKSAjIExhdGluIENhcGl0YWwgTGV0dGVyIEEgd2l0aCBEb3QgQmVsbG93CisgICAgICAgIGxvd2VyX2NoYXIgPSB1bmljaHIoMHgxZWExKSAjIExhdGluIFNtYWxsIExldHRlciBBIHdpdGggRG90IEJlbGxvdworCisgICAgICAgIHAgPSByZS5jb21waWxlKHVwcGVyX2NoYXIsIHJlLkkgfCByZS5VKQorICAgICAgICBxID0gcC5tYXRjaChsb3dlcl9jaGFyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHEsIE5vbmUpCisKKyAgICAgICAgcCA9IHJlLmNvbXBpbGUobG93ZXJfY2hhciwgcmUuSSB8IHJlLlUpCisgICAgICAgIHEgPSBwLm1hdGNoKHVwcGVyX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocSwgTm9uZSkKKworICAgICAgICBwID0gcmUuY29tcGlsZSgnKD9pKScgKyB1cHBlcl9jaGFyLCByZS5VKQorICAgICAgICBxID0gcC5tYXRjaChsb3dlcl9jaGFyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHEsIE5vbmUpCisKKyAgICAgICAgcCA9IHJlLmNvbXBpbGUoJyg/aSknICsgbG93ZXJfY2hhciwgcmUuVSkKKyAgICAgICAgcSA9IHAubWF0Y2godXBwZXJfY2hhcikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChxLCBOb25lKQorCisgICAgICAgIHAgPSByZS5jb21waWxlKCcoP2l1KScgKyB1cHBlcl9jaGFyKQorICAgICAgICBxID0gcC5tYXRjaChsb3dlcl9jaGFyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHEsIE5vbmUpCisKKyAgICAgICAgcCA9IHJlLmNvbXBpbGUoJyg/aXUpJyArIGxvd2VyX2NoYXIpCisgICAgICAgIHEgPSBwLm1hdGNoKHVwcGVyX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2RvbGxhcl9tYXRjaGVzX3R3aWNlKHNlbGYpOgorICAgICAgICAiJCBtYXRjaGVzIHRoZSBlbmQgb2Ygc3RyaW5nLCBhbmQganVzdCBiZWZvcmUgdGhlIHRlcm1pbmF0aW5nIFxuIgorICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgnJCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0dGVybi5zdWIoJyMnLCAnYVxuYlxuJyksICdhXG5iI1xuIycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGF0dGVybi5zdWIoJyMnLCAnYVxuYlxuYycpLCAnYVxuYlxuYyMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhdHRlcm4uc3ViKCcjJywgJ1xuJyksICcjXG4jJykKKworICAgICAgICBwYXR0ZXJuID0gcmUuY29tcGlsZSgnJCcsIHJlLk1VTFRJTElORSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXR0ZXJuLnN1YignIycsICdhXG5iXG4nICksICdhI1xuYiNcbiMnICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXR0ZXJuLnN1YignIycsICdhXG5iXG5jJyksICdhI1xuYiNcbmMjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXR0ZXJuLnN1YignIycsICdcbicpLCAnI1xuIycpCisKKyAgICBkZWYgdGVzdF9kZWFsbG9jKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDMyOTk6IGNoZWNrIGZvciBzZWdmYXVsdCBpbiBkZWJ1ZyBidWlsZAorICAgICAgICBpbXBvcnQgX3NyZQorICAgICAgICAjIHRoZSBvdmVyZmxvdyBsaW1pdCBpcyBkaWZmZXJlbnQgb24gd2lkZSBhbmQgbmFycm93IGJ1aWxkcyBhbmQgaXQKKyAgICAgICAgIyBkZXBlbmRzIG9uIHRoZSBkZWZpbml0aW9uIG9mIFNSRV9DT0RFIChzZWUgc3JlLmgpLgorICAgICAgICAjIDIqKjEyOCBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBvdmVyZmxvdyBvbiBib3RoLiBGb3Igc21hbGxlciB2YWx1ZXMKKyAgICAgICAgIyBhIFJ1bnRpbWVFcnJvciBpcyByYWlzZWQgaW5zdGVhZCBvZiBPdmVyZmxvd0Vycm9yLgorICAgICAgICBsb25nX292ZXJmbG93ID0gMioqMTI4CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmUuZmluZGl0ZXIsICJhIiwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIF9zcmUuY29tcGlsZSwgImFiYyIsIDAsIFtsb25nX292ZXJmbG93XSkKKworICAgIGRlZiB0ZXN0X2NvbXBpbGUoc2VsZik6CisgICAgICAgICMgVGVzdCByZXR1cm4gdmFsdWUgd2hlbiBnaXZlbiBzdHJpbmcgYW5kIHBhdHRlcm4gYXMgcGFyYW1ldGVyCisgICAgICAgIHBhdHRlcm4gPSByZS5jb21waWxlKCdyYW5kb20gcGF0dGVybicpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShwYXR0ZXJuLCByZS5fcGF0dGVybl90eXBlKQorICAgICAgICBzYW1lX3BhdHRlcm4gPSByZS5jb21waWxlKHBhdHRlcm4pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzYW1lX3BhdHRlcm4sIHJlLl9wYXR0ZXJuX3R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc2FtZV9wYXR0ZXJuLCBwYXR0ZXJuKQorICAgICAgICAjIFRlc3QgYmVoYXZpb3VyIHdoZW4gbm90IGdpdmVuIGEgc3RyaW5nIG9yIHBhdHRlcm4gYXMgcGFyYW1ldGVyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmUuY29tcGlsZSwgMCkKKworICAgIGRlZiB0ZXN0X2J1Z18xMzg5OShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTM4OTk6IHJlIHBhdHRlcm4gciJbXEFdIiBzaG91bGQgd29yayBsaWtlICJBIiBidXQgbWF0Y2hlcworICAgICAgICAjIG5vdGhpbmcuIERpdHRvIEIgYW5kIFouCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmUuZmluZGFsbChyJ1tcQVxCXGJcQ1xaXScsICdBQlxiQ1onKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0EnLCAnQicsICdcYicsICdDJywgJ1onXSkKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9sYXJnZV9zZWFyY2goc2VsZiwgc2l6ZSk6CisgICAgICAgICMgSXNzdWUgIzEwMTgyOiBpbmRpY2VzIHdlcmUgMzItYml0LXRydW5jYXRlZC4KKyAgICAgICAgcyA9ICdhJyAqIHNpemUKKyAgICAgICAgbSA9IHJlLnNlYXJjaCgnJCcsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobS5zdGFydCgpLCBzaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0uZW5kKCksIHNpemUpCisKKyAgICAjIFRoZSBodWdlIG1lbXVzZSBpcyBiZWNhdXNlIG9mIHJlLnN1YigpIHVzaW5nIGEgbGlzdCBhbmQgYSBqb2luKCkKKyAgICAjIHRvIGNyZWF0ZSB0aGUgcmVwbGFjZW1lbnQgcmVzdWx0LgorICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzJHLCBtZW11c2U9MTYgKyAyKQorICAgIGRlZiB0ZXN0X2xhcmdlX3N1Ym4oc2VsZiwgc2l6ZSk6CisgICAgICAgICMgSXNzdWUgIzEwMTgyOiBpbmRpY2VzIHdlcmUgMzItYml0LXRydW5jYXRlZC4KKyAgICAgICAgcyA9ICdhJyAqIHNpemUKKyAgICAgICAgciwgbiA9IHJlLnN1Ym4oJycsICcnLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobiwgc2l6ZSArIDEpCisKKworICAgIGRlZiB0ZXN0X3JlcGVhdF9taW5tYXhfb3ZlcmZsb3coc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzMTY5CisgICAgICAgIHN0cmluZyA9ICJ4IiAqIDEwMDAwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNX0iLCBzdHJpbmcpLnNwYW4oKSwgKDAsIDY1NTM1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIi57LDY1NTM1fSIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNSx9PyIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNn0iLCBzdHJpbmcpLnNwYW4oKSwgKDAsIDY1NTM2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZS5tYXRjaChyIi57LDY1NTM2fSIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLns2NTUzNix9PyIsIHN0cmluZykuc3BhbigpLCAoMCwgNjU1MzYpKQorICAgICAgICAjIDIqKjEyOCBzaG91bGQgYmUgYmlnIGVub3VnaCB0byBvdmVyZmxvdyBib3RoIFNSRV9DT0RFIGFuZCBQeV9zc2l6ZV90LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57JWR9IiAlIDIqKjEyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgcmUuY29tcGlsZSwgciIueywlZH0iICUgMioqMTI4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57JWQsfT8iICUgMioqMTI4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57JWQsJWR9IiAlICgyKioxMjksIDIqKjEyOCkpCisKKyAgICBAY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfcmVwZWF0X21pbm1heF9vdmVyZmxvd19tYXhyZXBlYXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gX3NyZSBpbXBvcnQgTUFYUkVQRUFUCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoJ3JlcXVpcmVzIF9zcmUuTUFYUkVQRUFUIGNvbnN0YW50JykKKyAgICAgICAgc3RyaW5nID0gIngiICogMTAwMDAwCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHIiLnslZH0iICUgKE1BWFJFUEVBVCAtIDEpLCBzdHJpbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlLm1hdGNoKHIiLnssJWR9IiAlIChNQVhSRVBFQVQgLSAxKSwgc3RyaW5nKS5zcGFuKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDEwMDAwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlLm1hdGNoKHIiLnslZCx9PyIgJSAoTUFYUkVQRUFUIC0gMSksIHN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnslZH0iICUgTUFYUkVQRUFUKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCByZS5jb21waWxlLCByIi57LCVkfSIgJSBNQVhSRVBFQVQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHJlLmNvbXBpbGUsIHIiLnslZCx9PyIgJSBNQVhSRVBFQVQpCisKKyAgICBkZWYgdGVzdF9iYWNrcmVmX2dyb3VwX25hbWVfaW5fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE3MzQxOiBQb29yIGVycm9yIG1lc3NhZ2Ugd2hlbiBjb21waWxpbmcgaW52YWxpZCByZWdleAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKHNyZV9jb25zdGFudHMuZXJyb3IsICc8Zm9vPicpOgorICAgICAgICAgICAgcmUuY29tcGlsZSgnKD9QPTxmb28+KScpCisKKyAgICBkZWYgdGVzdF9ncm91cF9uYW1lX2luX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxNzM0MTogUG9vciBlcnJvciBtZXNzYWdlIHdoZW4gY29tcGlsaW5nIGludmFsaWQgcmVnZXgKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChzcmVfY29uc3RhbnRzLmVycm9yLCAnXD9mb28nKToKKyAgICAgICAgICAgIHJlLmNvbXBpbGUoJyg/UDw/Zm9vPiknKQorCisKK2RlZiBydW5fcmVfdGVzdHMoKToKKyAgICBmcm9tIHRlc3QucmVfdGVzdHMgaW1wb3J0IHRlc3RzLCBTVUNDRUVELCBGQUlMLCBTWU5UQVhfRVJST1IKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnUnVubmluZyByZV90ZXN0cyB0ZXN0IHN1aXRlJworICAgIGVsc2U6CisgICAgICAgICMgVG8gc2F2ZSB0aW1lLCBvbmx5IHJ1biB0aGUgZmlyc3QgYW5kIGxhc3QgMTAgdGVzdHMKKyAgICAgICAgI3Rlc3RzID0gdGVzdHNbOjEwXSArIHRlc3RzWy0xMDpdCisgICAgICAgIHBhc3MKKworICAgIGZvciB0IGluIHRlc3RzOgorICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgcGF0dGVybiA9IHMgPSBvdXRjb21lID0gcmVwbCA9IGV4cGVjdGVkID0gTm9uZQorICAgICAgICBpZiBsZW4odCkgPT0gNToKKyAgICAgICAgICAgIHBhdHRlcm4sIHMsIG91dGNvbWUsIHJlcGwsIGV4cGVjdGVkID0gdAorICAgICAgICBlbGlmIGxlbih0KSA9PSAzOgorICAgICAgICAgICAgcGF0dGVybiwgcywgb3V0Y29tZSA9IHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICgnVGVzdCB0dXBsZXMgc2hvdWxkIGhhdmUgMyBvciA1IGZpZWxkcycsIHQpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb2JqID0gcmUuY29tcGlsZShwYXR0ZXJuKQorICAgICAgICBleGNlcHQgcmUuZXJyb3I6CisgICAgICAgICAgICBpZiBvdXRjb21lID09IFNZTlRBWF9FUlJPUjogcGFzcyAgIyBFeHBlY3RlZCBhIHN5bnRheCBlcnJvcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnPT09IFN5bnRheCBlcnJvcjonLCB0CisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDogcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcHJpbnQgJyoqKiBVbmV4cGVjdGVkIGVycm9yICoqKicsIHQKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPXN5cy5zdGRvdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqLnNlYXJjaChzKQorICAgICAgICAgICAgZXhjZXB0IHJlLmVycm9yLCBtc2c6CisgICAgICAgICAgICAgICAgcHJpbnQgJz09PSBVbmV4cGVjdGVkIGV4Y2VwdGlvbicsIHQsIHJlcHIobXNnKQorICAgICAgICAgICAgaWYgb3V0Y29tZSA9PSBTWU5UQVhfRVJST1I6CisgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBoYXZlIGJlZW4gYSBzeW50YXggZXJyb3I7IGZvcmdldCBpdC4KKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbGlmIG91dGNvbWUgPT0gRkFJTDoKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgTm9uZTogcGFzcyAgICMgTm8gbWF0Y2gsIGFzIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgZWxzZTogcHJpbnQgJz09PSBTdWNjZWVkZWQgaW5jb3JyZWN0bHknLCB0CisgICAgICAgICAgICBlbGlmIG91dGNvbWUgPT0gU1VDQ0VFRDoKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICMgTWF0Y2hlZCwgYXMgZXhwZWN0ZWQsIHNvIG5vdyB3ZSBjb21wdXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAjIHJlc3VsdCBzdHJpbmcgYW5kIGNvbXBhcmUgaXQgdG8gb3VyIGV4cGVjdGVkIHJlc3VsdC4KKyAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IHJlc3VsdC5zcGFuKDApCisgICAgICAgICAgICAgICAgICAgIHZhcmRpY3Q9eydmb3VuZCc6IHJlc3VsdC5ncm91cCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dyb3Vwcyc6IHJlc3VsdC5ncm91cCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmxhZ3MnOiByZXN1bHQucmUuZmxhZ3N9CisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDEwMCk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kgPSByZXN1bHQuZ3JvdXAoaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFNwZWNpYWwgaGFjayBiZWNhdXNlIGVsc2UgdGhlIHN0cmluZyBjb25jYXQgZmFpbHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ2kgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kgPSAiTm9uZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpID0gIkVycm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyZGljdFsnZyVkJyAlIGldID0gZ2kKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmVzdWx0LnJlLmdyb3VwaW5kZXgua2V5cygpOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpID0gcmVzdWx0Lmdyb3VwKGkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZ2kgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2kgPSAiTm9uZSIKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpID0gIkVycm9yIgorICAgICAgICAgICAgICAgICAgICAgICAgdmFyZGljdFtpXSA9IGdpCisgICAgICAgICAgICAgICAgICAgIHJlcGwgPSBldmFsKHJlcGwsIHZhcmRpY3QpCisgICAgICAgICAgICAgICAgICAgIGlmIHJlcGwgIT0gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnPT09IGdyb3VwaW5nIGVycm9yJywgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHJlcHIocmVwbCkgKyAnIHNob3VsZCBiZSAnICsgcmVwcihleHBlY3RlZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnPT09IEZhaWxlZCBpbmNvcnJlY3RseScsIHQKKworICAgICAgICAgICAgICAgICMgVHJ5IHRoZSBtYXRjaCBvbiBhIHVuaWNvZGUgc3RyaW5nLCBhbmQgY2hlY2sgdGhhdCBpdAorICAgICAgICAgICAgICAgICMgc3RpbGwgc3VjY2VlZHMuCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBvYmouc2VhcmNoKHVuaWNvZGUocywgImxhdGluLTEiKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnPT09IEZhaWxzIG9uIHVuaWNvZGUgbWF0Y2gnLCB0CisgICAgICAgICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgIyAxLjUuMgorICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgdW5pY29kZSB0ZXN0IGNhc2UKKworICAgICAgICAgICAgICAgICMgVHJ5IHRoZSBtYXRjaCBvbiBhIHVuaWNvZGUgcGF0dGVybiwgYW5kIGNoZWNrIHRoYXQgaXQKKyAgICAgICAgICAgICAgICAjIHN0aWxsIHN1Y2NlZWRzLgorICAgICAgICAgICAgICAgIG9iaj1yZS5jb21waWxlKHVuaWNvZGUocGF0dGVybiwgImxhdGluLTEiKSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBvYmouc2VhcmNoKHMpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gRmFpbHMgb24gdW5pY29kZSBwYXR0ZXJuIG1hdGNoJywgdAorCisgICAgICAgICAgICAgICAgIyBUcnkgdGhlIG1hdGNoIHdpdGggdGhlIHNlYXJjaCBhcmVhIGxpbWl0ZWQgdG8gdGhlIGV4dGVudAorICAgICAgICAgICAgICAgICMgb2YgdGhlIG1hdGNoIGFuZCBzZWUgaWYgaXQgc3RpbGwgc3VjY2VlZHMuICBcQiB3aWxsCisgICAgICAgICAgICAgICAgIyBicmVhayAoYmVjYXVzZSBpdCB3b24ndCBtYXRjaCBhdCB0aGUgZW5kIG9yIHN0YXJ0IG9mIGEKKyAgICAgICAgICAgICAgICAjIHN0cmluZyksIHNvIHdlJ2xsIGlnbm9yZSBwYXR0ZXJucyB0aGF0IGZlYXR1cmUgaXQuCisKKyAgICAgICAgICAgICAgICBpZiBwYXR0ZXJuWzoyXSAhPSAnXFxCJyBhbmQgcGF0dGVyblstMjpdICE9ICdcXEInIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmVzdWx0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvYmogPSByZS5jb21waWxlKHBhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iai5zZWFyY2gocywgcmVzdWx0LnN0YXJ0KDApLCByZXN1bHQuZW5kKDApICsgMSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnPT09IEZhaWxlZCBvbiByYW5nZS1saW1pdGVkIG1hdGNoJywgdAorCisgICAgICAgICAgICAgICAgIyBUcnkgdGhlIG1hdGNoIHdpdGggSUdOT1JFQ0FTRSBlbmFibGVkLCBhbmQgY2hlY2sgdGhhdCBpdAorICAgICAgICAgICAgICAgICMgc3RpbGwgc3VjY2VlZHMuCisgICAgICAgICAgICAgICAgb2JqID0gcmUuY29tcGlsZShwYXR0ZXJuLCByZS5JR05PUkVDQVNFKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG9iai5zZWFyY2gocykKKyAgICAgICAgICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJz09PSBGYWlscyBvbiBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoJywgdAorCisgICAgICAgICAgICAgICAgIyBUcnkgdGhlIG1hdGNoIHdpdGggTE9DQUxFIGVuYWJsZWQsIGFuZCBjaGVjayB0aGF0IGl0CisgICAgICAgICAgICAgICAgIyBzdGlsbCBzdWNjZWVkcy4KKyAgICAgICAgICAgICAgICBvYmogPSByZS5jb21waWxlKHBhdHRlcm4sIHJlLkxPQ0FMRSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBvYmouc2VhcmNoKHMpCisgICAgICAgICAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gRmFpbHMgb24gbG9jYWxlLXNlbnNpdGl2ZSBtYXRjaCcsIHQKKworICAgICAgICAgICAgICAgICMgVHJ5IHRoZSBtYXRjaCB3aXRoIFVOSUNPREUgbG9jYWxlIGVuYWJsZWQsIGFuZCBjaGVjaworICAgICAgICAgICAgICAgICMgdGhhdCBpdCBzdGlsbCBzdWNjZWVkcy4KKyAgICAgICAgICAgICAgICBvYmogPSByZS5jb21waWxlKHBhdHRlcm4sIHJlLlVOSUNPREUpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gb2JqLnNlYXJjaChzKQorICAgICAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnPT09IEZhaWxzIG9uIHVuaWNvZGUtc2Vuc2l0aXZlIG1hdGNoJywgdAorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFJlVGVzdHMpCisgICAgcnVuX3JlX3Rlc3RzKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzU4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzU4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZWFkbGluZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVjN2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHkKQEAgLTAsMCArMSw0NyBAQAorIiIiCitWZXJ5IG1pbmltYWwgdW5pdHRlc3RzIGZvciBwYXJ0cyBvZiB0aGUgcmVhZGxpbmUgbW9kdWxlLgorCitUaGVzZSB0ZXN0cyB3ZXJlIGFkZGVkIHRvIGNoZWNrIHRoYXQgdGhlIGxpYmVkaXQgZW11bGF0aW9uIG9uIE9TWCBhbmQKK3RoZSAicmVhbCIgcmVhZGxpbmUgaGF2ZSB0aGUgc2FtZSBpbnRlcmZhY2UgZm9yIGhpc3RvcnkgbWFuaXB1bGF0aW9uLiBUaGF0J3MKK3doeSB0aGUgdGVzdHMgY292ZXIgb25seSBhIHNtYWxsIHN1YnNldCBvZiB0aGUgaW50ZXJmYWNlLgorIiIiCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgaW1wb3J0X21vZHVsZQorCisjIFNraXAgdGVzdHMgaWYgdGhlcmUgaXMgbm8gcmVhZGxpbmUgbW9kdWxlCityZWFkbGluZSA9IGltcG9ydF9tb2R1bGUoJ3JlYWRsaW5lJykKKworY2xhc3MgVGVzdEhpc3RvcnlNYW5pcHVsYXRpb24gKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEB1bml0dGVzdC5za2lwSWYobm90IGhhc2F0dHIocmVhZGxpbmUsICdjbGVhcl9oaXN0b3J5JyksCisgICAgICAgICAgICAgICAgICAgICAiVGhlIGhpc3RvcnkgdXBkYXRlIHRlc3QgY2Fubm90IGJlIHJ1biBiZWNhdXNlIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAiY2xlYXJfaGlzdG9yeSBtZXRob2QgaXMgbm90IGF2YWlsYWJsZS4iKQorICAgIGRlZiB0ZXN0SGlzdG9yeVVwZGF0ZXMoc2VsZik6CisgICAgICAgIHJlYWRsaW5lLmNsZWFyX2hpc3RvcnkoKQorCisgICAgICAgIHJlYWRsaW5lLmFkZF9oaXN0b3J5KCJmaXJzdCBsaW5lIikKKyAgICAgICAgcmVhZGxpbmUuYWRkX2hpc3RvcnkoInNlY29uZCBsaW5lIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oMCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbSgxKSwgImZpcnN0IGxpbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oMiksICJzZWNvbmQgbGluZSIpCisKKyAgICAgICAgcmVhZGxpbmUucmVwbGFjZV9oaXN0b3J5X2l0ZW0oMCwgInJlcGxhY2VkIGxpbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oMCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZGxpbmUuZ2V0X2hpc3RvcnlfaXRlbSgxKSwgInJlcGxhY2VkIGxpbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oMiksICJzZWNvbmQgbGluZSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkbGluZS5nZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCgpLCAyKQorCisgICAgICAgIHJlYWRsaW5lLnJlbW92ZV9oaXN0b3J5X2l0ZW0oMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkbGluZS5nZXRfaGlzdG9yeV9pdGVtKDApLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWRsaW5lLmdldF9oaXN0b3J5X2l0ZW0oMSksICJzZWNvbmQgbGluZSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkbGluZS5nZXRfY3VycmVudF9oaXN0b3J5X2xlbmd0aCgpLCAxKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdEhpc3RvcnlNYW5pcHVsYXRpb24pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlYWRsaW5lLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlYWRsaW5lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFlMmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlYWRsaW5lLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlYWRsaW5lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTFlMmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVhZGxpbmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JlcHIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MmZjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5CkBAIC0wLDAgKzEsMzI3IEBACisiIiIKKyAgVGVzdCBjYXNlcyBmb3IgdGhlIHJlcHIgbW9kdWxlCisgIE5pY2sgTWF0aGV3c29uCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19weTNrX3dhcm5pbmdzCitmcm9tIHJlcHIgaW1wb3J0IHJlcHIgYXMgciAjIERvbid0IHNoYWRvdyBidWlsdGluIHJlcHIKK2Zyb20gcmVwciBpbXBvcnQgUmVwcgorCisKK2RlZiBuZXN0ZWRUdXBsZShuZXN0aW5nKToKKyAgICB0ID0gKCkKKyAgICBmb3IgaSBpbiByYW5nZShuZXN0aW5nKToKKyAgICAgICAgdCA9ICh0LCkKKyAgICByZXR1cm4gdAorCitjbGFzcyBSZXByVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEocigiYWJjIiksICInYWJjJyIpCisgICAgICAgIGVxKHIoImFiY2RlZmdoaWprbG1ub3AiKSwiJ2FiY2RlZmdoaWprbG1ub3AnIikKKworICAgICAgICBzID0gImEiKjMwKyJiIiozMAorICAgICAgICBleHBlY3RlZCA9IHJlcHIocylbOjEzXSArICIuLi4iICsgcmVwcihzKVstMTQ6XQorICAgICAgICBlcShyKHMpLCBleHBlY3RlZCkKKworICAgICAgICBlcShyKCJcIiciKSwgcmVwcigiXCInIikpCisgICAgICAgIHMgPSAiXCIiKjMwKyInIioxMDAKKyAgICAgICAgZXhwZWN0ZWQgPSByZXByKHMpWzoxM10gKyAiLi4uIiArIHJlcHIocylbLTE0Ol0KKyAgICAgICAgZXEocihzKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHIoKDEsKSksICIoMSwpIikKKworICAgICAgICB0MyA9ICgxLCAyLCAzKQorICAgICAgICBlcShyKHQzKSwgIigxLCAyLCAzKSIpCisKKyAgICAgICAgcjIgPSBSZXByKCkKKyAgICAgICAgcjIubWF4dHVwbGUgPSAyCisgICAgICAgIGV4cGVjdGVkID0gcmVwcih0MylbOi0yXSArICIuLi4pIgorICAgICAgICBlcShyMi5yZXByKHQzKSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9jb250YWluZXIoc2VsZik6CisgICAgICAgIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CisgICAgICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCisKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgVHVwbGVzIGdpdmUgdXAgYWZ0ZXIgNiBlbGVtZW50cworICAgICAgICBlcShyKCgpKSwgIigpIikKKyAgICAgICAgZXEocigoMSwpKSwgIigxLCkiKQorICAgICAgICBlcShyKCgxLCAyLCAzKSksICIoMSwgMiwgMykiKQorICAgICAgICBlcShyKCgxLCAyLCAzLCA0LCA1LCA2KSksICIoMSwgMiwgMywgNCwgNSwgNikiKQorICAgICAgICBlcShyKCgxLCAyLCAzLCA0LCA1LCA2LCA3KSksICIoMSwgMiwgMywgNCwgNSwgNiwgLi4uKSIpCisKKyAgICAgICAgIyBMaXN0cyBnaXZlIHVwIGFmdGVyIDYgYXMgd2VsbAorICAgICAgICBlcShyKFtdKSwgIltdIikKKyAgICAgICAgZXEocihbMV0pLCAiWzFdIikKKyAgICAgICAgZXEocihbMSwgMiwgM10pLCAiWzEsIDIsIDNdIikKKyAgICAgICAgZXEocihbMSwgMiwgMywgNCwgNSwgNl0pLCAiWzEsIDIsIDMsIDQsIDUsIDZdIikKKyAgICAgICAgZXEocihbMSwgMiwgMywgNCwgNSwgNiwgN10pLCAiWzEsIDIsIDMsIDQsIDUsIDYsIC4uLl0iKQorCisgICAgICAgICMgU2V0cyBnaXZlIHVwIGFmdGVyIDYgYXMgd2VsbAorICAgICAgICBlcShyKHNldChbXSkpLCAic2V0KFtdKSIpCisgICAgICAgIGVxKHIoc2V0KFsxXSkpLCAic2V0KFsxXSkiKQorICAgICAgICBlcShyKHNldChbMSwgMiwgM10pKSwgInNldChbMSwgMiwgM10pIikKKyAgICAgICAgZXEocihzZXQoWzEsIDIsIDMsIDQsIDUsIDZdKSksICJzZXQoWzEsIDIsIDMsIDQsIDUsIDZdKSIpCisgICAgICAgIGVxKHIoc2V0KFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkpLCAic2V0KFsxLCAyLCAzLCA0LCA1LCA2LCAuLi5dKSIpCisKKyAgICAgICAgIyBGcm96ZW5zZXRzIGdpdmUgdXAgYWZ0ZXIgNiBhcyB3ZWxsCisgICAgICAgIGVxKHIoZnJvemVuc2V0KFtdKSksICJmcm96ZW5zZXQoW10pIikKKyAgICAgICAgZXEocihmcm96ZW5zZXQoWzFdKSksICJmcm96ZW5zZXQoWzFdKSIpCisgICAgICAgIGVxKHIoZnJvemVuc2V0KFsxLCAyLCAzXSkpLCAiZnJvemVuc2V0KFsxLCAyLCAzXSkiKQorICAgICAgICBlcShyKGZyb3plbnNldChbMSwgMiwgMywgNCwgNSwgNl0pKSwgImZyb3plbnNldChbMSwgMiwgMywgNCwgNSwgNl0pIikKKyAgICAgICAgZXEocihmcm96ZW5zZXQoWzEsIDIsIDMsIDQsIDUsIDYsIDddKSksICJmcm96ZW5zZXQoWzEsIDIsIDMsIDQsIDUsIDYsIC4uLl0pIikKKworICAgICAgICAjIGNvbGxlY3Rpb25zLmRlcXVlIGFmdGVyIDYKKyAgICAgICAgZXEocihkZXF1ZShbMSwgMiwgMywgNCwgNSwgNiwgN10pKSwgImRlcXVlKFsxLCAyLCAzLCA0LCA1LCA2LCAuLi5dKSIpCisKKyAgICAgICAgIyBEaWN0aW9uYXJpZXMgZ2l2ZSB1cCBhZnRlciA0LgorICAgICAgICBlcShyKHt9KSwgInt9IikKKyAgICAgICAgZCA9IHsnYWxpY2UnOiAxLCAnYm9iJzogMiwgJ2NoYXJsZXMnOiAzLCAnZGF2ZSc6IDR9CisgICAgICAgIGVxKHIoZCksICJ7J2FsaWNlJzogMSwgJ2JvYic6IDIsICdjaGFybGVzJzogMywgJ2RhdmUnOiA0fSIpCisgICAgICAgIGRbJ2FydGh1ciddID0gMQorICAgICAgICBlcShyKGQpLCAieydhbGljZSc6IDEsICdhcnRodXInOiAxLCAnYm9iJzogMiwgJ2NoYXJsZXMnOiAzLCAuLi59IikKKworICAgICAgICAjIGFycmF5LmFycmF5IGFmdGVyIDUuCisgICAgICAgIGVxKHIoYXJyYXkoJ2knKSksICJhcnJheSgnaScsIFtdKSIpCisgICAgICAgIGVxKHIoYXJyYXkoJ2knLCBbMV0pKSwgImFycmF5KCdpJywgWzFdKSIpCisgICAgICAgIGVxKHIoYXJyYXkoJ2knLCBbMSwgMl0pKSwgImFycmF5KCdpJywgWzEsIDJdKSIpCisgICAgICAgIGVxKHIoYXJyYXkoJ2knLCBbMSwgMiwgM10pKSwgImFycmF5KCdpJywgWzEsIDIsIDNdKSIpCisgICAgICAgIGVxKHIoYXJyYXkoJ2knLCBbMSwgMiwgMywgNF0pKSwgImFycmF5KCdpJywgWzEsIDIsIDMsIDRdKSIpCisgICAgICAgIGVxKHIoYXJyYXkoJ2knLCBbMSwgMiwgMywgNCwgNV0pKSwgImFycmF5KCdpJywgWzEsIDIsIDMsIDQsIDVdKSIpCisgICAgICAgIGVxKHIoYXJyYXkoJ2knLCBbMSwgMiwgMywgNCwgNSwgNl0pKSwKKyAgICAgICAgICAgICAgICAgICAiYXJyYXkoJ2knLCBbMSwgMiwgMywgNCwgNSwgLi4uXSkiKQorCisgICAgZGVmIHRlc3RfbnVtYmVycyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHIoMTIzKSwgcmVwcigxMjMpKQorICAgICAgICBlcShyKDEyM0wpLCByZXByKDEyM0wpKQorICAgICAgICBlcShyKDEuMC8zKSwgcmVwcigxLjAvMykpCisKKyAgICAgICAgbiA9IDEwTCoqMTAwCisgICAgICAgIGV4cGVjdGVkID0gcmVwcihuKVs6MThdICsgIi4uLiIgKyByZXByKG4pWy0xOTpdCisgICAgICAgIGVxKHIobiksIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBpMSA9IENsYXNzV2l0aFJlcHIoImEiKQorICAgICAgICBlcShyKGkxKSwgcmVwcihpMSkpCisKKyAgICAgICAgaTIgPSBDbGFzc1dpdGhSZXByKCJ4IioxMDAwKQorICAgICAgICBleHBlY3RlZCA9IHJlcHIoaTIpWzoxM10gKyAiLi4uIiArIHJlcHIoaTIpWy0xNDpdCisgICAgICAgIGVxKHIoaTIpLCBleHBlY3RlZCkKKworICAgICAgICBpMyA9IENsYXNzV2l0aEZhaWxpbmdSZXByKCkKKyAgICAgICAgZXEocihpMyksICgiPENsYXNzV2l0aEZhaWxpbmdSZXByIGluc3RhbmNlIGF0ICV4PiIlaWQoaTMpKSkKKworICAgICAgICBzID0gcihDbGFzc1dpdGhGYWlsaW5nUmVwcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiPGNsYXNzICIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aCgiPiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5maW5kKCIuLi4iKSA9PSA4KQorCisgICAgZGVmIHRlc3RfZmlsZShzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuKHVuaXR0ZXN0Ll9fZmlsZV9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihmcCkuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICI8b3BlbiBmaWxlICVyLCBtb2RlICdyJyBhdCAweCIgJSB1bml0dGVzdC5fX2ZpbGVfXykpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZnApLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAiPGNsb3NlZCBmaWxlICVyLCBtb2RlICdyJyBhdCAweCIgJSB1bml0dGVzdC5fX2ZpbGVfXykpCisKKyAgICBkZWYgdGVzdF9sYW1iZGEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGxhbWJkYSB4OiB4KS5zdGFydHN3aXRoKAorICAgICAgICAgICAgIjxmdW5jdGlvbiA8bGFtYmRhIikpCisgICAgICAgICMgWFhYIGFub255bW91cyBmdW5jdGlvbnM/ICBzZWUgZnVuY19yZXByCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGdW5jdGlvbnMKKyAgICAgICAgZXEocmVwcihoYXNoKSwgJzxidWlsdC1pbiBmdW5jdGlvbiBoYXNoPicpCisgICAgICAgICMgTWV0aG9kcworICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcignJy5zcGxpdCkuc3RhcnRzd2l0aCgKKyAgICAgICAgICAgICc8YnVpbHQtaW4gbWV0aG9kIHNwbGl0IG9mIHN0ciBvYmplY3QgYXQgMHgnKSkKKworICAgIGRlZiB0ZXN0X3hyYW5nZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHJlcHIoeHJhbmdlKDEpKSwgJ3hyYW5nZSgxKScpCisgICAgICAgIGVxKHJlcHIoeHJhbmdlKDEsIDIpKSwgJ3hyYW5nZSgxLCAyKScpCisgICAgICAgIGVxKHJlcHIoeHJhbmdlKDEsIDIsIDMpKSwgJ3hyYW5nZSgxLCA0LCAzKScpCisKKyAgICBkZWYgdGVzdF9uZXN0aW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBldmVyeXRoaW5nIGlzIG1lYW50IHRvIGdpdmUgdXAgYWZ0ZXIgNiBsZXZlbHMuCisgICAgICAgIGVxKHIoW1tbW1tbW11dXV1dXV0pLCAiW1tbW1tbW11dXV1dXV0iKQorICAgICAgICBlcShyKFtbW1tbW1tbXV1dXV1dXV0pLCAiW1tbW1tbWy4uLl1dXV1dXV0iKQorCisgICAgICAgIGVxKHIobmVzdGVkVHVwbGUoNikpLCAiKCgoKCgoKCksKSwpLCksKSwpLCkiKQorICAgICAgICBlcShyKG5lc3RlZFR1cGxlKDcpKSwgIigoKCgoKCguLi4pLCksKSwpLCksKSwpIikKKworICAgICAgICBlcShyKHsgbmVzdGVkVHVwbGUoNSkgOiBuZXN0ZWRUdXBsZSg1KSB9KSwKKyAgICAgICAgICAgInsoKCgoKCgpLCksKSwpLCksKTogKCgoKCgoKSwpLCksKSwpLCl9IikKKyAgICAgICAgZXEocih7IG5lc3RlZFR1cGxlKDYpIDogbmVzdGVkVHVwbGUoNikgfSksCisgICAgICAgICAgICJ7KCgoKCgoLi4uKSwpLCksKSwpLCk6ICgoKCgoKC4uLiksKSwpLCksKSwpfSIpCisKKyAgICAgICAgZXEocihbW1tbW1t7fV1dXV1dXSksICJbW1tbW1t7fV1dXV1dXSIpCisgICAgICAgIGVxKHIoW1tbW1tbW3t9XV1dXV1dXSksICJbW1tbW1tbLi4uXV1dXV1dXSIpCisKKyAgICBkZWYgdGVzdF9idWZmZXIoc2VsZik6CisgICAgICAgICMgWFhYIGRvZXNuJ3QgdGVzdCBidWZmZXJzIHdpdGggbm8gYl9iYXNlIG9yIHJlYWQtd3JpdGUgYnVmZmVycyAoc2VlCisgICAgICAgICMgYnVmZmVyb2JqZWN0LmMpLiAgVGhlIHRlc3QgaXMgZmFpcmx5IGluY29tcGxldGUgdG9vLiAgU2lnaC4KKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB4ID0gYnVmZmVyKCdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcih4KS5zdGFydHN3aXRoKCc8cmVhZC1vbmx5IGJ1ZmZlciBmb3IgMHgnKSkKKworICAgIGRlZiB0ZXN0X2NlbGwoc2VsZik6CisgICAgICAgICMgWFhYIEhtbT8gSG93IHRvIGdldCBhdCBhIGNlbGwgb2JqZWN0PworICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9kZXNjcmlwdG9ycyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgbWV0aG9kIGRlc2NyaXB0b3JzCisgICAgICAgIGVxKHJlcHIoZGljdC5pdGVtcyksICI8bWV0aG9kICdpdGVtcycgb2YgJ2RpY3QnIG9iamVjdHM+IikKKyAgICAgICAgIyBYWFggbWVtYmVyIGRlc2NyaXB0b3JzCisgICAgICAgICMgWFhYIGF0dHJpYnV0ZSBkZXNjcmlwdG9ycworICAgICAgICAjIFhYWCBzbG90IGRlc2NyaXB0b3JzCisgICAgICAgICMgc3RhdGljIGFuZCBjbGFzcyBtZXRob2RzCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgZm9vKGNscyk6IHBhc3MKKyAgICAgICAgeCA9IHN0YXRpY21ldGhvZChDLmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoeCkuc3RhcnRzd2l0aCgnPHN0YXRpY21ldGhvZCBvYmplY3QgYXQgMHgnKSkKKyAgICAgICAgeCA9IGNsYXNzbWV0aG9kKEMuZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcih4KS5zdGFydHN3aXRoKCc8Y2xhc3NtZXRob2Qgb2JqZWN0IGF0IDB4JykpCisKKyAgICBkZWYgdGVzdF91bnNvcnRhYmxlKHNlbGYpOgorICAgICAgICAjIFJlcHIucmVwcigpIHVzZWQgdG8gY2FsbCBzb3J0ZWQoKSBvbiBzZXRzLCBmcm96ZW5zZXRzIGFuZCBkaWN0cworICAgICAgICAjIHdpdGhvdXQgdGFraW5nIGludG8gYWNjb3VudCB0aGF0IG5vdCBhbGwgb2JqZWN0cyBhcmUgY29tcGFyYWJsZQorICAgICAgICB4ID0gc2V0KFsxaiwgMmosIDNqXSkKKyAgICAgICAgeSA9IGZyb3plbnNldCh4KQorICAgICAgICB6ID0gezFqOiAxLCAyajogMn0KKyAgICAgICAgcih4KQorICAgICAgICByKHkpCisgICAgICAgIHIoeikKKworZGVmIHRvdWNoKHBhdGgsIHRleHQ9JycpOgorICAgIGZwID0gb3BlbihwYXRoLCAndycpCisgICAgZnAud3JpdGUodGV4dCkKKyAgICBmcC5jbG9zZSgpCisKK2NsYXNzIExvbmdSZXByVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBsb25nbmFtZSA9ICdhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24nCisgICAgICAgIHNlbGYucGtnbmFtZSA9IG9zLnBhdGguam9pbihsb25nbmFtZSkKKyAgICAgICAgc2VsZi5zdWJwa2duYW1lID0gb3MucGF0aC5qb2luKGxvbmduYW1lLCBsb25nbmFtZSkKKyAgICAgICAgIyBNYWtlIHRoZSBwYWNrYWdlIGFuZCBzdWJwYWNrYWdlCisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5wa2duYW1lLCBpZ25vcmVfZXJyb3JzPVRydWUpCisgICAgICAgIG9zLm1rZGlyKHNlbGYucGtnbmFtZSkKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYucGtnbmFtZSwgJ19faW5pdF9fJytvcy5leHRzZXArJ3B5JykpCisgICAgICAgIHNodXRpbC5ybXRyZWUoc2VsZi5zdWJwa2duYW1lLCBpZ25vcmVfZXJyb3JzPVRydWUpCisgICAgICAgIG9zLm1rZGlyKHNlbGYuc3VicGtnbmFtZSkKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYuc3VicGtnbmFtZSwgJ19faW5pdF9fJytvcy5leHRzZXArJ3B5JykpCisgICAgICAgICMgUmVtZW1iZXIgd2hlcmUgd2UgYXJlCisgICAgICAgIHNlbGYuaGVyZSA9IG9zLmdldGN3ZCgpCisgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBzZWxmLmhlcmUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGFjdGlvbnMgPSBbXQorICAgICAgICBmb3IgZGlycGF0aCwgZGlybmFtZXMsIGZpbGVuYW1lcyBpbiBvcy53YWxrKHNlbGYucGtnbmFtZSk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBkaXJuYW1lcyArIGZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICBhY3Rpb25zLmFwcGVuZChvcy5wYXRoLmpvaW4oZGlycGF0aCwgbmFtZSkpCisgICAgICAgIGFjdGlvbnMuYXBwZW5kKHNlbGYucGtnbmFtZSkKKyAgICAgICAgYWN0aW9ucy5zb3J0KCkKKyAgICAgICAgYWN0aW9ucy5yZXZlcnNlKCkKKyAgICAgICAgZm9yIHAgaW4gYWN0aW9uczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocCk6CisgICAgICAgICAgICAgICAgb3Mucm1kaXIocCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHApCisgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgZGVmIHRlc3RfbW9kdWxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdG91Y2gob3MucGF0aC5qb2luKHNlbGYuc3VicGtnbmFtZSwgc2VsZi5wa2duYW1lICsgb3MuZXh0c2VwICsgJ3B5JykpCisgICAgICAgIGZyb20gYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uLmFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbiBpbXBvcnQgYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uCisgICAgICAgIGVxKHJlcHIoYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uKSwKKyAgICAgICAgICAgIjxtb2R1bGUgJyVzJyBmcm9tICclcyc+IiAlIChhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24uX19uYW1lX18sIGFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbi5fX2ZpbGVfXykpCisgICAgICAgIGVxKHJlcHIoc3lzKSwgIjxtb2R1bGUgJ3N5cycgKGJ1aWx0LWluKT4iKQorCisgICAgZGVmIHRlc3RfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLnN1YnBrZ25hbWUsICdmb28nK29zLmV4dHNlcCsncHknKSwgJycnXAorY2xhc3MgZm9vKG9iamVjdCk6CisgICAgcGFzcworJycnKQorICAgICAgICBmcm9tIGFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbi5hcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24gaW1wb3J0IGZvbworICAgICAgICBlcShyZXByKGZvby5mb28pLAorICAgICAgICAgICAgICAgIjxjbGFzcyAnJXMuZm9vJz4iICUgZm9vLl9fbmFtZV9fKQorCisgICAgZGVmIHRlc3Rfb2JqZWN0KHNlbGYpOgorICAgICAgICAjIFhYWCBUZXN0IHRoZSByZXByIG9mIGEgdHlwZSB3aXRoIGEgcmVhbGx5IGxvbmcgdHBfbmFtZSBidXQgd2l0aCBubworICAgICAgICAjIHRwX3JlcHIuICBXSUJOSSB3ZSBoYWQgOjpJbmxpbmU/IDopCisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2NsYXNzKHNlbGYpOgorICAgICAgICB0b3VjaChvcy5wYXRoLmpvaW4oc2VsZi5zdWJwa2duYW1lLCAnYmFyJytvcy5leHRzZXArJ3B5JyksICcnJ1wKK2NsYXNzIGJhcjoKKyAgICBwYXNzCisnJycpCisgICAgICAgIGZyb20gYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uLmFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbiBpbXBvcnQgYmFyCisgICAgICAgICMgTW9kdWxlIG5hbWUgbWF5IGJlIHByZWZpeGVkIHdpdGggInRlc3QuIiwgZGVwZW5kaW5nIG9uIGhvdyBydW4uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGJhci5iYXIpLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAiPGNsYXNzICVzLmJhciBhdCAweCIgJSBiYXIuX19uYW1lX18pKQorCisgICAgZGVmIHRlc3RfaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLnN1YnBrZ25hbWUsICdiYXonK29zLmV4dHNlcCsncHknKSwgJycnXAorY2xhc3MgYmF6OgorICAgIHBhc3MKKycnJykKKyAgICAgICAgZnJvbSBhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24uYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uIGltcG9ydCBiYXoKKyAgICAgICAgaWJheiA9IGJhei5iYXooKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihpYmF6KS5zdGFydHN3aXRoKAorICAgICAgICAgICAgIjwlcy5iYXogaW5zdGFuY2UgYXQgMHgiICUgYmF6Ll9fbmFtZV9fKSkKKworICAgIGRlZiB0ZXN0X21ldGhvZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHRvdWNoKG9zLnBhdGguam9pbihzZWxmLnN1YnBrZ25hbWUsICdxdXgnK29zLmV4dHNlcCsncHknKSwgJycnXAorY2xhc3MgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWE6CisgICAgZGVmIGFtZXRob2Qoc2VsZik6IHBhc3MKKycnJykKKyAgICAgICAgZnJvbSBhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24uYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uIGltcG9ydCBxdXgKKyAgICAgICAgIyBVbmJvdW5kIG1ldGhvZHMgZmlyc3QKKyAgICAgICAgZXEocmVwcihxdXguYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuYW1ldGhvZCksCisgICAgICAgICc8dW5ib3VuZCBtZXRob2QgYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEuYW1ldGhvZD4nKQorICAgICAgICAjIEJvdW5kIG1ldGhvZCBuZXh0CisgICAgICAgIGlxdXggPSBxdXguYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWEoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihpcXV4LmFtZXRob2QpLnN0YXJ0c3dpdGgoCisgICAgICAgICAgICAnPGJvdW5kIG1ldGhvZCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS5hbWV0aG9kIG9mIDwlcy5hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSBpbnN0YW5jZSBhdCAweCcgXAorICAgICAgICAgICAgJSAocXV4Ll9fbmFtZV9fLCkgKSkKKworICAgIGRlZiB0ZXN0X2J1aWx0aW5fZnVuY3Rpb24oc2VsZik6CisgICAgICAgICMgWFhYIHRlc3QgYnVpbHQtaW4gZnVuY3Rpb25zIGFuZCBtZXRob2RzIHdpdGggcmVhbGx5IGxvbmcgbmFtZXMKKyAgICAgICAgcGFzcworCitjbGFzcyBDbGFzc1dpdGhSZXByOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzKToKKyAgICAgICAgc2VsZi5zID0gcworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJDbGFzc1dpdGhMb25nUmVwciglcikiICUgc2VsZi5zCisKKworY2xhc3MgQ2xhc3NXaXRoRmFpbGluZ1JlcHI6CisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByYWlzZSBFeGNlcHRpb24oIlRoaXMgc2hvdWxkIGJlIGNhdWdodCBieSBSZXByLnJlcHJfaW5zdGFuY2UiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoUmVwclRlc3RzKQorICAgIHJ1bl91bml0dGVzdChMb25nUmVwclRlc3QpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVwci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU5NWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVwci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVwci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXByLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU5NWExCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVwci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVzb3VyY2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDViMjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVzb3VyY2UucHkKQEAgLTAsMCArMSwxMjcgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB0aW1lCisKK3Jlc291cmNlID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3Jlc291cmNlJykKKworIyBUaGlzIHRlc3QgaXMgY2hlY2tpbmcgYSBmZXcgc3BlY2lmaWMgcHJvYmxlbSBzcG90cyB3aXRoIHRoZSByZXNvdXJjZSBtb2R1bGUuCisKK2NsYXNzIFJlc291cmNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlc291cmNlLmdldHJsaW1pdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXNvdXJjZS5nZXRybGltaXQsIDQyLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXNvdXJjZS5zZXRybGltaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVzb3VyY2Uuc2V0cmxpbWl0LCA0MiwgNDIsIDQyKQorCisgICAgZGVmIHRlc3RfZnNpemVfaXNtYXgoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIChjdXIsIG1heCkgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFJMSU1JVF9GU0laRSBzaG91bGQgYmUgUkxJTV9JTkZJTklUWSwgd2hpY2ggd2lsbCBiZSBhIHJlYWxseSBiaWcKKyAgICAgICAgICAgICMgbnVtYmVyIG9uIGEgcGxhdGZvcm0gd2l0aCBsYXJnZSBmaWxlIHN1cHBvcnQuICBPbiB0aGVzZSBwbGF0Zm9ybXMsCisgICAgICAgICAgICAjIHdlIG5lZWQgdG8gdGVzdCB0aGF0IHRoZSBnZXQvc2V0cmxpbWl0IGZ1bmN0aW9ucyBwcm9wZXJseSBjb252ZXJ0CisgICAgICAgICAgICAjIHRoZSBudW1iZXIgdG8gYSBDIGxvbmcgbG9uZyBhbmQgdGhhdCB0aGUgY29udmVyc2lvbiBkb2Vzbid0IHJhaXNlCisgICAgICAgICAgICAjIGFuIGVycm9yLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNvdXJjZS5STElNX0lORklOSVRZLCBtYXgpCisgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAoY3VyLCBtYXgpKQorCisgICAgZGVmIHRlc3RfZnNpemVfZW5mb3JjZWQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIChjdXIsIG1heCkgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIENoZWNrIHRvIHNlZSB3aGF0IGhhcHBlbnMgd2hlbiB0aGUgUkxJTUlUX0ZTSVpFIGlzIHNtYWxsLiAgU29tZQorICAgICAgICAgICAgIyB2ZXJzaW9ucyBvZiBQeXRob24gd2VyZSB0ZXJtaW5hdGVkIGJ5IGFuIHVuY2F1Z2h0IFNJR1hGU1osIGJ1dAorICAgICAgICAgICAgIyBweXRob25ydW4uYyBoYXMgYmVlbiBmaXhlZCB0byBpZ25vcmUgdGhhdCBleGNlcHRpb24uICBJZiBzbywgdGhlCisgICAgICAgICAgICAjIHdyaXRlKCkgc2hvdWxkIHJldHVybiBFRkJJRyB3aGVuIHRoZSBsaW1pdCBpcyBleGNlZWRlZC4KKworICAgICAgICAgICAgIyBBdCBsZWFzdCBvbmUgcGxhdGZvcm0gaGFzIGFuIHVubGltaXRlZCBSTElNSVRfRlNJWkUgYW5kIGF0dGVtcHRzCisgICAgICAgICAgICAjIHRvIGNoYW5nZSBpdCByYWlzZSBWYWx1ZUVycm9yIGluc3RlYWQuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAoMTAyNCwgbWF4KSkKKyAgICAgICAgICAgICAgICAgICAgbGltaXRfc2V0ID0gVHJ1ZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBsaW1pdF9zZXQgPSBGYWxzZQorICAgICAgICAgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKCJYIiAqIDEwMjQpCisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoIlkiKQorICAgICAgICAgICAgICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgICAgICAjIE9uIHNvbWUgc3lzdGVtcyAoZS5nLiwgVWJ1bnR1IG9uIGhwcGEpIHRoZSBmbHVzaCgpCisgICAgICAgICAgICAgICAgICAgICAgICAjIGRvZXNuJ3QgYWx3YXlzIGNhdXNlIHRoZSBleGNlcHRpb24sIGJ1dCB0aGUgY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIyBkb2VzIGV2ZW50dWFsbHkuICBUcnkgZmx1c2hpbmcgc2V2ZXJhbCB0aW1lcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBhbiBhdHRlbXB0IHRvIGVuc3VyZSB0aGUgZmlsZSBpcyByZWFsbHkgc3luY2VkIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIHJhaXNlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoLjEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5mbHVzaCgpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IGxpbWl0X3NldDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICBpZiBsaW1pdF9zZXQ6CisgICAgICAgICAgICAgICAgICAgICAgICAjIENsb3NlIHdpbGwgYXR0ZW1wdCB0byBmbHVzaCB0aGUgYnl0ZSB3ZSB3cm90ZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBSZXN0b3JlIGxpbWl0IGZpcnN0IHRvIGF2b2lkIGdldHRpbmcgYSBzcHVyaW91cyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKGN1ciwgbWF4KSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgbGltaXRfc2V0OgorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAoY3VyLCBtYXgpKQorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2ZzaXplX3Rvb2JpZyhzZWxmKToKKyAgICAgICAgIyBCZSBzdXJlIHRoYXQgc2V0cmxpbWl0IGlzIGNoZWNraW5nIGZvciByZWFsbHkgbGFyZ2UgdmFsdWVzCisgICAgICAgIHRvb19iaWcgPSAxMEwqKjUwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIChjdXIsIG1heCkgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9GU0laRSwgKHRvb19iaWcsIG1heCkpCisgICAgICAgICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0ZTSVpFLCAobWF4LCB0b29fYmlnKSkKKyAgICAgICAgICAgIGV4Y2VwdCAoT3ZlcmZsb3dFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfZ2V0cnVzYWdlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlc291cmNlLmdldHJ1c2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZXNvdXJjZS5nZXRydXNhZ2UsIDQyLCA0MikKKyAgICAgICAgdXNhZ2VzZWxmID0gcmVzb3VyY2UuZ2V0cnVzYWdlKHJlc291cmNlLlJVU0FHRV9TRUxGKQorICAgICAgICB1c2FnZWNoaWxkcmVuID0gcmVzb3VyY2UuZ2V0cnVzYWdlKHJlc291cmNlLlJVU0FHRV9DSElMRFJFTikKKyAgICAgICAgIyBNYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgc3lzdGVtcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXNhZ2Vib3RoID0gcmVzb3VyY2UuZ2V0cnVzYWdlKHJlc291cmNlLlJVU0FHRV9CT1RIKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgSXNzdWUgNjA4MzogUmVmZXJlbmNlIGNvdW50aW5nIGJ1ZworICAgIGRlZiB0ZXN0X3NldHJ1c2FnZV9yZWZjb3VudChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGltaXRzID0gcmVzb3VyY2UuZ2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DUFUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNsYXNzIEJhZFNlcXVlbmNlOgorICAgICAgICAgICAgICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICAgICAgICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgICAgICBpZiBrZXkgaW4gKDAsIDEpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbih0dXBsZShyYW5nZSgxMDAwMDAwKSkpCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DUFUsIEJhZFNlcXVlbmNlKCkpCisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFJlc291cmNlVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVzb3VyY2UucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVzb3VyY2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzcwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVzb3VyY2UucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmVzb3VyY2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzcwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZXNvdXJjZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmZjODIyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmZjODIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YTAyODAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZmM4MjIucHkKQEAgLTAsMCArMSwyNTcgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworcmZjODIyID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoInJmYzgyMiIsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKwordHJ5OgorICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKKworY2xhc3MgTWVzc2FnZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY3JlYXRlX21lc3NhZ2Uoc2VsZiwgbXNnKToKKyAgICAgICAgcmV0dXJuIHJmYzgyMi5NZXNzYWdlKFN0cmluZ0lPKG1zZykpCisKKyAgICBkZWYgdGVzdF9nZXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuY3JlYXRlX21lc3NhZ2UoCisgICAgICAgICAgICAnVG86ICJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PlxuXG50ZXN0XG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldCgidG8iKSA9PSAnImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXQoIlRPIikgPT0gJyJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0KCJOby1TdWNoLUhlYWRlciIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0KCJOby1TdWNoLUhlYWRlciIsICJOby1TdWNoLVZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgID09ICJOby1TdWNoLVZhbHVlIikKKworICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuY3JlYXRlX21lc3NhZ2UoCisgICAgICAgICAgICAnVG86ICJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PlxuXG50ZXN0XG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG1zZy5oYXNfa2V5KCJOZXctSGVhZGVyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuc2V0ZGVmYXVsdCgiTmV3LUhlYWRlciIsICJOZXctVmFsdWUiKSA9PSAiTmV3LVZhbHVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5zZXRkZWZhdWx0KCJOZXctSGVhZGVyIiwgIkRpZmZlcmVudC1WYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgICA9PSAiTmV3LVZhbHVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ1sibmV3LWhlYWRlciJdID09ICJOZXctVmFsdWUiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuc2V0ZGVmYXVsdCgiQW5vdGhlci1IZWFkZXIiKSA9PSAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ1siYW5vdGhlci1oZWFkZXIiXSA9PSAiIikKKworICAgIGRlZiBjaGVjayhzZWxmLCBtc2csIHJlc3VsdHMpOgorICAgICAgICAiIiJDaGVjayBhZGRyZXNzZXMgYW5kIHRoZSBkYXRlLiIiIgorICAgICAgICBtID0gc2VsZi5jcmVhdGVfbWVzc2FnZShtc2cpCisgICAgICAgIGkgPSAwCisgICAgICAgIGZvciBuLCBhIGluIG0uZ2V0YWRkcmxpc3QoJ3RvJykgKyBtLmdldGFkZHJsaXN0KCdjYycpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG1uLCBtYSA9IHJlc3VsdHNbaV1bMF0sIHJlc3VsdHNbaV1bMV0KKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHByaW50ICdleHRyYSBwYXJzZWQgYWRkcmVzczonLCByZXByKG4pLCByZXByKGEpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtbiwgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVuLWV4cGVjdGVkIG5hbWU6ICVyICE9ICVyIiAlIChtbiwgbikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hLCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW4tZXhwZWN0ZWQgYWRkcmVzczogJXIgIT0gJXIiICUgKG1hLCBhKSkKKyAgICAgICAgICAgIGlmIG1uID09IG4gYW5kIG1hID09IGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnbm90IGZvdW5kOicsIHJlcHIobiksIHJlcHIoYSkKKworICAgICAgICBvdXQgPSBtLmdldGRhdGUoJ2RhdGUnKQorICAgICAgICBpZiBvdXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5OTksIDEsIDEzLCAyMywgNTcsIDM1LCAwLCAxLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGUgY29udmVyc2lvbiBmYWlsZWQiKQorCisKKyAgICAjIE5vdGU6IGFsbCB0ZXN0IGNhc2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBkYXRlIChpbiB2YXJpb3VzIGZvcm1hdHMpLAorICAgICMgb3Igbm8gZGF0ZSEKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ0RhdGU6ICAgIFdlZCwgMTMgSmFuIDE5OTkgMjM6NTc6MzUgLTA1MDBcbicKKyAgICAgICAgICAgICdGcm9tOiAgICBHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BDTlJJLlJlc3Rvbi5WQS5VUz5cbicKKyAgICAgICAgICAgICdUbzogICAgICAiR3VpZG8gdmFuXG4nCisgICAgICAgICAgICAnXHQgOiBSb3NzdW0iIDxndWlkb0BweXRob24ub3JnPlxuJworICAgICAgICAgICAgJ1N1YmplY3Q6IHRlc3QyXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAndGVzdDJcbicsCisgICAgICAgICAgICBbKCdHdWlkbyB2YW5cblx0IDogUm9zc3VtJywgJ2d1aWRvQHB5dGhvbi5vcmcnKV0pCisKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdGcm9tOiBCYXJyeSA8YndhcnNhd0BweXRob24ub3JnXG4nCisgICAgICAgICAgICAnVG86IGd1aWRvQHB5dGhvbi5vcmcgKEd1aWRvOiB0aGUgQmFyYmFyaWFuKVxuJworICAgICAgICAgICAgJ1N1YmplY3Q6IG5vbnNlbnNlXG4nCisgICAgICAgICAgICAnRGF0ZTogV2VkbmVzZGF5LCBKYW51YXJ5IDEzIDE5OTkgMjM6NTc6MzUgLTA1MDBcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJ0d1aWRvOiB0aGUgQmFyYmFyaWFuJywgJ2d1aWRvQHB5dGhvbi5vcmcnKV0pCisKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdGcm9tOiBCYXJyeSA8YndhcnNhd0BweXRob24ub3JnXG4nCisgICAgICAgICAgICAnVG86IGd1aWRvQHB5dGhvbi5vcmcgKEd1aWRvOiB0aGUgQmFyYmFyaWFuKVxuJworICAgICAgICAgICAgJ0NjOiAiR3VpZG86IHRoZSBNYWRtYW4iIDxndWlkb0BweXRob24ub3JnPlxuJworICAgICAgICAgICAgJ0RhdGU6ICAxMy1KYW4tMTk5OSAyMzo1NzozNSBFU1RcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJ0d1aWRvOiB0aGUgQmFyYmFyaWFuJywgJ2d1aWRvQHB5dGhvbi5vcmcnKSwKKyAgICAgICAgICAgICAoJ0d1aWRvOiB0aGUgTWFkbWFuJywgJ2d1aWRvQHB5dGhvbi5vcmcnKQorICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdUbzogIlRoZSBtb25zdGVyIHdpdGhcbicKKyAgICAgICAgICAgICcgICAgIHRoZSB2ZXJ5IGxvbmcgbmFtZTogR3VpZG8iIDxndWlkb0BweXRob24ub3JnPlxuJworICAgICAgICAgICAgJ0RhdGU6ICAgIFdlZCwgMTMgSmFuIDE5OTkgMjM6NTc6MzUgLTA1MDBcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJ1RoZSBtb25zdGVyIHdpdGhcbiAgICAgdGhlIHZlcnkgbG9uZyBuYW1lOiBHdWlkbycsCisgICAgICAgICAgICAgICdndWlkb0BweXRob24ub3JnJyldKQorCisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnVG86ICJBbWl0IEouIFBhdGVsIiA8YW1pdHBAVGhlb3J5LlN0YW5mb3JkLkVEVT5cbicKKyAgICAgICAgICAgICdDQzogTWlrZSBGbGV0Y2hlciA8bWZsZXRjaEB2cnRlbGVjb20uY29tPixcbicKKyAgICAgICAgICAgICcgICAgICAgICJcJ3N0cmluZy1zaWdAcHl0aG9uLm9yZ1wnIiA8c3RyaW5nLXNpZ0BweXRob24ub3JnPlxuJworICAgICAgICAgICAgJ0NjOiBmb296QGJhdC5jb20sIGJhcnRAdG9vZi5jb21cbicKKyAgICAgICAgICAgICdDYzogZ29pdEBsaXAuY29tXG4nCisgICAgICAgICAgICAnRGF0ZTogICAgV2VkLCAxMyBKYW4gMTk5OSAyMzo1NzozNSAtMDUwMFxuJworICAgICAgICAgICAgJ1xuJworICAgICAgICAgICAgJ3Rlc3QnLAorICAgICAgICAgICAgWygnQW1pdCBKLiBQYXRlbCcsICdhbWl0cEBUaGVvcnkuU3RhbmZvcmQuRURVJyksCisgICAgICAgICAgICAgKCdNaWtlIEZsZXRjaGVyJywgJ21mbGV0Y2hAdnJ0ZWxlY29tLmNvbScpLAorICAgICAgICAgICAgICgiJ3N0cmluZy1zaWdAcHl0aG9uLm9yZyciLCAnc3RyaW5nLXNpZ0BweXRob24ub3JnJyksCisgICAgICAgICAgICAgKCcnLCAnZm9vekBiYXQuY29tJyksCisgICAgICAgICAgICAgKCcnLCAnYmFydEB0b29mLmNvbScpLAorICAgICAgICAgICAgICgnJywgJ2dvaXRAbGlwLmNvbScpLAorICAgICAgICAgICAgIF0pCisKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdUbzogU29tZSBPbmUgPHNvbWVvbmVAZG9tLmFpbj5cbicKKyAgICAgICAgICAgICdGcm9tOiBBbnVkZGVyIFBlcnNpbiA8c3VidWRkeS5lbHNlQGRvbS5haW4+XG4nCisgICAgICAgICAgICAnRGF0ZTpcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJ1NvbWUgT25lJywgJ3NvbWVvbmVAZG9tLmFpbicpXSkKKworICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ1RvOiBwZXJzb25AZG9tLmFpbiAoVXNlciBKLiBQZXJzb24pXG5cbicsCisgICAgICAgICAgICBbKCdVc2VyIEouIFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpXSkKKworICAgIGRlZiB0ZXN0X2RvdWJsZWNvbW1lbnQoc2VsZik6CisgICAgICAgICMgVGhlIFJGQyBhbGxvd3MgY29tbWVudHMgd2l0aGluIGNvbW1lbnRzIGluIGFuIGVtYWlsIGFkZHIKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdUbzogcGVyc29uQGRvbS5haW4gKChVc2VyIEouIFBlcnNvbikpLCBKb2huIERvZSA8Zm9vQGJhci5jb20+XG5cbicsCisgICAgICAgICAgICBbKCdVc2VyIEouIFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpLCAoJ0pvaG4gRG9lJywgJ2Zvb0BiYXIuY29tJyldKQorCisgICAgZGVmIHRlc3RfdHdpc3RlZChzZWxmKToKKyAgICAgICAgIyBUaGlzIG9uZSBpcyBqdXN0IHR3aXN0ZWQuICBJIGRvbid0IGtub3cgd2hhdCB0aGUgcHJvcGVyCisgICAgICAgICMgcmVzdWx0IHNob3VsZCBiZSwgYnV0IGl0IHNob3VsZG4ndCBiZSB0byBpbmZsb29wLCB3aGljaCBpcworICAgICAgICAjIHdoYXQgdXNlZCB0byBoYXBwZW4hCisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnVG86IDxbc210cDpkZDQ3QG1haWwueHh4LmVkdV1fYXRfaG1ocUBoZHEtbWRtMS1pbWdvdXQuY29tcGFuYXkuY29tPlxuJworICAgICAgICAgICAgJ0RhdGU6ICAgIFdlZCwgMTMgSmFuIDE5OTkgMjM6NTc6MzUgLTA1MDBcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJycsICcnKSwKKyAgICAgICAgICAgICAoJycsICdkZDQ3QG1haWwueHh4LmVkdScpLAorICAgICAgICAgICAgICgnJywgJ19hdF9obWhxQGhkcS1tZG0xLWltZ291dC5jb21wYW5heS5jb20nKSwKKyAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfY29tbWFzX2luX2Z1bGxfbmFtZShzZWxmKToKKyAgICAgICAgIyBUaGlzIGV4ZXJjaXNlcyB0aGUgb2xkIGNvbW1hcy1pbi1hLWZ1bGwtbmFtZSBidWcsIHdoaWNoCisgICAgICAgICMgc2hvdWxkIGJlIGRvaW5nIHRoZSByaWdodCB0aGluZyBpbiByZWNlbnQgdmVyc2lvbnMgb2YgdGhlCisgICAgICAgICMgbW9kdWxlLgorICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ1RvOiAibGFzdCwgZmlyc3QiIDx1c2VyaWRAZm9vLm5ldD5cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJ2xhc3QsIGZpcnN0JywgJ3VzZXJpZEBmb28ubmV0JyldKQorCisgICAgZGVmIHRlc3RfcXVvdGVkX25hbWUoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soCisgICAgICAgICAgICAnVG86IChDb21tZW50IHN0dWZmKSAiUXVvdGVkIG5hbWUiQHNvbWV3aGVyZS5jb21cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJ0NvbW1lbnQgc3R1ZmYnLCAnIlF1b3RlZCBuYW1lIkBzb21ld2hlcmUuY29tJyldKQorCisgICAgZGVmIHRlc3RfYm9ndXNfdG9faGVhZGVyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrKAorICAgICAgICAgICAgJ1RvOiA6XG4nCisgICAgICAgICAgICAnQ2M6IGdvaXRAbGlwLmNvbVxuJworICAgICAgICAgICAgJ0RhdGU6ICAgIFdlZCwgMTMgSmFuIDE5OTkgMjM6NTc6MzUgLTA1MDBcbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICd0ZXN0JywKKyAgICAgICAgICAgIFsoJycsICdnb2l0QGxpcC5jb20nKV0pCisKKyAgICBkZWYgdGVzdF9hZGRyX2lwcXVhZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygKKyAgICAgICAgICAgICdUbzogZ3VpZG9AWzEzMi4xNTEuMS4yMV1cbicKKyAgICAgICAgICAgICdcbicKKyAgICAgICAgICAgICdmb28nLAorICAgICAgICAgICAgWygnJywgJ2d1aWRvQFsxMzIuMTUxLjEuMjFdJyldKQorCisgICAgZGVmIHRlc3RfaXRlcihzZWxmKToKKyAgICAgICAgbSA9IHJmYzgyMi5NZXNzYWdlKFN0cmluZ0lPKAorICAgICAgICAgICAgJ0RhdGU6ICAgIFdlZCwgMTMgSmFuIDE5OTkgMjM6NTc6MzUgLTA1MDBcbicKKyAgICAgICAgICAgICdGcm9tOiAgICBHdWlkbyB2YW4gUm9zc3VtIDxndWlkb0BDTlJJLlJlc3Rvbi5WQS5VUz5cbicKKyAgICAgICAgICAgICdUbzogICAgICAiR3VpZG8gdmFuXG4nCisgICAgICAgICAgICAnXHQgOiBSb3NzdW0iIDxndWlkb0BweXRob24ub3JnPlxuJworICAgICAgICAgICAgJ1N1YmplY3Q6IHRlc3QyXG4nCisgICAgICAgICAgICAnXG4nCisgICAgICAgICAgICAndGVzdDJcbicgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3J0ZWQobSksIFsnZGF0ZScsICdmcm9tJywgJ3N1YmplY3QnLCAndG8nXSkKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfcGhyYXNlcyhzZWxmKToKKyAgICAgICAgIyBSRkMgMjgyMiAodGhlIHVwZGF0ZSB0byBSRkMgODIyKSBzcGVjaWZpZXMgdGhhdCBkb3RzIGluIHBocmFzZXMgYXJlCisgICAgICAgICMgb2Jzb2xldGUgc3ludGF4LCB3aGljaCBjb25mb3JtaW5nIHByb2dyYW1zIE1VU1QgcmVjb2duaXplIGJ1dCBORVZFUgorICAgICAgICAjIGdlbmVyYXRlIChzZWUgJDQuMSBNaXNjZWxsYW5lb3VzIG9ic29sZXRlIHRva2VucykuICBUaGlzIGlzIGEKKyAgICAgICAgIyBkZXBhcnR1cmUgZnJvbSBSRkMgODIyIHdoaWNoIGRpZCBub3QgYWxsb3cgZG90cyBpbiBub24tcXVvdGVkCisgICAgICAgICMgcGhyYXNlcy4KKyAgICAgICAgc2VsZi5jaGVjaygnVG86IFVzZXIgSi4gUGVyc29uIDxwZXJzb25AZG9tLmFpbj5cblxuJywKKyAgICAgICAgICAgICAgICAgICBbKCdVc2VyIEouIFBlcnNvbicsICdwZXJzb25AZG9tLmFpbicpXSkKKworICAgICMgVGhpcyB0YWtlcyB0b28gbG9uZyB0byBhZGQgdG8gdGhlIHRlc3Qgc3VpdGUKKyMjICAgIGRlZiB0ZXN0X2FuX2V4Y3J1dGlhdGluZ2x5X2xvbmdfYWRkcmVzc19maWVsZChzZWxmKToKKyMjICAgICAgICBPQlNDRU5FTFlfTE9OR19IRUFERVJfTVVMVElQTElFUiA9IDEwMDAwCisjIyAgICAgICAgb25lYWRkciA9ICgnUGVyc29uJyAqIDEwKSArICdAJyArICgnLicuam9pbihbJ2RvbSddKjEwKSkgKyAnLmNvbScKKyMjICAgICAgICBhZGRyID0gJywgJy5qb2luKFtvbmVhZGRyXSAqIE9CU0NFTkVMWV9MT05HX0hFQURFUl9NVUxUSVBMSUVSKQorIyMgICAgICAgIGxzdCA9IHJmYzgyMi5BZGRybGlzdENsYXNzKGFkZHIpLmdldGFkZHJsaXN0KCkKKyMjICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsc3QpLCBPQlNDRU5FTFlfTE9OR19IRUFERVJfTVVMVElQTElFUikKKworICAgIGRlZiB0ZXN0XzJnZXRhZGRybGlzdChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuY3JlYXRlX21lc3NhZ2UoIiIiXAorVG86IGFwZXJzb25AZG9tLmFpbgorQ2M6IGJwZXJzb25AZG9tLmFpbgorQ2M6IGNwZXJzb25AZG9tLmFpbgorQ2M6IGRwZXJzb25AZG9tLmFpbgorCitBIHRlc3QgbWVzc2FnZS4KKyIiIikKKyAgICAgICAgY2NzID0gWygnJywgYSkgZm9yIGEgaW4KKyAgICAgICAgICAgICAgIFsnYnBlcnNvbkBkb20uYWluJywgJ2NwZXJzb25AZG9tLmFpbicsICdkcGVyc29uQGRvbS5haW4nXV0KKyAgICAgICAgYWRkcnMgPSBtc2cuZ2V0YWRkcmxpc3QoJ2NjJykKKyAgICAgICAgYWRkcnMuc29ydCgpCisgICAgICAgIGVxKGFkZHJzLCBjY3MpCisgICAgICAgICMgVHJ5IGFnYWluLCB0aGlzIG9uZSB1c2VkIHRvIGZhaWwKKyAgICAgICAgYWRkcnMgPSBtc2cuZ2V0YWRkcmxpc3QoJ2NjJykKKyAgICAgICAgYWRkcnMuc29ydCgpCisgICAgICAgIGVxKGFkZHJzLCBjY3MpCisKKyAgICBkZWYgdGVzdF9wYXJzZWFkZHIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShyZmM4MjIucGFyc2VhZGRyKCc8PicpLCAoJycsICcnKSkKKyAgICAgICAgZXEocmZjODIyLnBhcnNlYWRkcignYXBlcnNvbkBkb20uYWluJyksICgnJywgJ2FwZXJzb25AZG9tLmFpbicpKQorICAgICAgICBlcShyZmM4MjIucGFyc2VhZGRyKCdicGVyc29uQGRvbS5haW4gKEJlYSBBLiBQZXJzb24pJyksCisgICAgICAgICAgICgnQmVhIEEuIFBlcnNvbicsICdicGVyc29uQGRvbS5haW4nKSkKKyAgICAgICAgZXEocmZjODIyLnBhcnNlYWRkcignQ3ludGhpYSBQZXJzb24gPGNwZXJzb25AZG9tLmFpbj4nKSwKKyAgICAgICAgICAgKCdDeW50aGlhIFBlcnNvbicsICdjcGVyc29uQGRvbS5haW4nKSkKKworICAgIGRlZiB0ZXN0X3F1b3RlX3VucXVvdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcShyZmM4MjIucXVvdGUoJ2Zvb1xcd2Fja3kibmFtZScpLCAnZm9vXFxcXHdhY2t5XFwibmFtZScpCisgICAgICAgIGVxKHJmYzgyMi51bnF1b3RlKCciZm9vXFxcXHdhY2t5XFwibmFtZSInKSwgJ2Zvb1xcd2Fja3kibmFtZScpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTWVzc2FnZVRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JmYzgyMi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZmM4MjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzQzODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZmM4MjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JmYzgyMi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZmM4MjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzQzODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yZmM4MjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JpY2hjbXAucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yaWNoY21wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmEwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yaWNoY21wLnB5CkBAIC0wLDAgKzEsMzM4IEBACisjIFRlc3RzIGZvciByaWNoIGNvbXBhcmlzb25zCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworaW1wb3J0IG9wZXJhdG9yCisKK2NsYXNzIE51bWJlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgc2VsZi54ID0geAorCisgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLnggPCBvdGhlcgorCisgICAgZGVmIF9fbGVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLnggPD0gb3RoZXIKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZi54ID09IG90aGVyCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYueCAhPSBvdGhlcgorCisgICAgZGVmIF9fZ3RfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLnggPiBvdGhlcgorCisgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLnggPj0gb3RoZXIKKworICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQsICJOdW1iZXIuX19jbXBfXygpIHNob3VsZCBub3QgYmUgY2FsbGVkIgorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIk51bWJlciglcikiICUgKHNlbGYueCwgKQorCitjbGFzcyBWZWN0b3I6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGF0YSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtpXQorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGksIHYpOgorICAgICAgICBzZWxmLmRhdGFbaV0gPSB2CisKKyAgICBfX2hhc2hfXyA9IE5vbmUgIyBWZWN0b3JzIGNhbm5vdCBiZSBoYXNoZWQKKworICAgIGRlZiBfX25vbnplcm9fXyhzZWxmKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiVmVjdG9ycyBjYW5ub3QgYmUgdXNlZCBpbiBCb29sZWFuIGNvbnRleHRzIgorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgIlZlY3Rvci5fX2NtcF9fKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQiCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiVmVjdG9yKCVyKSIgJSAoc2VsZi5kYXRhLCApCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFZlY3RvcihbYSA8IGIgZm9yIGEsIGIgaW4gemlwKHNlbGYuZGF0YSwgc2VsZi5fX2Nhc3Qob3RoZXIpKV0pCisKKyAgICBkZWYgX19sZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFZlY3RvcihbYSA8PSBiIGZvciBhLCBiIGluIHppcChzZWxmLmRhdGEsIHNlbGYuX19jYXN0KG90aGVyKSldKQorCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJldHVybiBWZWN0b3IoW2EgPT0gYiBmb3IgYSwgYiBpbiB6aXAoc2VsZi5kYXRhLCBzZWxmLl9fY2FzdChvdGhlcikpXSkKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gVmVjdG9yKFthICE9IGIgZm9yIGEsIGIgaW4gemlwKHNlbGYuZGF0YSwgc2VsZi5fX2Nhc3Qob3RoZXIpKV0pCisKKyAgICBkZWYgX19ndF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFZlY3RvcihbYSA+IGIgZm9yIGEsIGIgaW4gemlwKHNlbGYuZGF0YSwgc2VsZi5fX2Nhc3Qob3RoZXIpKV0pCisKKyAgICBkZWYgX19nZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIFZlY3RvcihbYSA+PSBiIGZvciBhLCBiIGluIHppcChzZWxmLmRhdGEsIHNlbGYuX19jYXN0KG90aGVyKSldKQorCisgICAgZGVmIF9fY2FzdChzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFZlY3Rvcik6CisgICAgICAgICAgICBvdGhlciA9IG90aGVyLmRhdGEKKyAgICAgICAgaWYgbGVuKHNlbGYuZGF0YSkgIT0gbGVuKG90aGVyKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJDYW5ub3QgY29tcGFyZSB2ZWN0b3JzIG9mIGRpZmZlcmVudCBsZW5ndGgiCisgICAgICAgIHJldHVybiBvdGhlcgorCitvcG1hcCA9IHsKKyAgICAibHQiOiAobGFtYmRhIGEsYjogYTwgYiwgb3BlcmF0b3IubHQsIG9wZXJhdG9yLl9fbHRfXyksCisgICAgImxlIjogKGxhbWJkYSBhLGI6IGE8PWIsIG9wZXJhdG9yLmxlLCBvcGVyYXRvci5fX2xlX18pLAorICAgICJlcSI6IChsYW1iZGEgYSxiOiBhPT1iLCBvcGVyYXRvci5lcSwgb3BlcmF0b3IuX19lcV9fKSwKKyAgICAibmUiOiAobGFtYmRhIGEsYjogYSE9Yiwgb3BlcmF0b3IubmUsIG9wZXJhdG9yLl9fbmVfXyksCisgICAgImd0IjogKGxhbWJkYSBhLGI6IGE+IGIsIG9wZXJhdG9yLmd0LCBvcGVyYXRvci5fX2d0X18pLAorICAgICJnZSI6IChsYW1iZGEgYSxiOiBhPj1iLCBvcGVyYXRvci5nZSwgb3BlcmF0b3IuX19nZV9fKQorfQorCitjbGFzcyBWZWN0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBjaGVja2ZhaWwoc2VsZiwgZXJyb3IsIG9wbmFtZSwgKmFyZ3MpOgorICAgICAgICBmb3Igb3AgaW4gb3BtYXBbb3BuYW1lXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yLCBvcCwgKmFyZ3MpCisKKyAgICBkZWYgY2hlY2tlcXVhbChzZWxmLCBvcG5hbWUsIGEsIGIsIGV4cHJlcyk6CisgICAgICAgIGZvciBvcCBpbiBvcG1hcFtvcG5hbWVdOgorICAgICAgICAgICAgcmVhbHJlcyA9IG9wKGEsIGIpCisgICAgICAgICAgICAjIGNhbid0IHVzZSBhc3NlcnRFcXVhbChyZWFscmVzLCBleHByZXMpIGhlcmUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlYWxyZXMpLCBsZW4oZXhwcmVzKSkKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4ocmVhbHJlcykpOgorICAgICAgICAgICAgICAgICMgcmVzdWx0cyBhcmUgYm9vbCwgc28gd2UgY2FuIHVzZSAiaXMiIGhlcmUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVhbHJlc1tpXSBpcyBleHByZXNbaV0pCisKKyAgICBkZWYgdGVzdF9taXhlZChzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGNvbXBhcmlzb25zIGludm9sdmluZyBWZWN0b3Igb2JqZWN0cworICAgICAgICAjIHdoaWNoIHJldHVybiByaWNoIHJlc3VsdHMgKGkuZS4gVmVjdG9ycyB3aXRoIGl0ZW13aXNlCisgICAgICAgICMgY29tcGFyaXNvbiByZXN1bHRzKSB3b3JrCisgICAgICAgIGEgPSBWZWN0b3IocmFuZ2UoMikpCisgICAgICAgIGIgPSBWZWN0b3IocmFuZ2UoMykpCisgICAgICAgICMgYWxsIGNvbXBhcmlzb25zIHNob3VsZCBmYWlsIGZvciBkaWZmZXJlbnQgbGVuZ3RoCisgICAgICAgIGZvciBvcG5hbWUgaW4gb3BtYXA6CisgICAgICAgICAgICBzZWxmLmNoZWNrZmFpbChWYWx1ZUVycm9yLCBvcG5hbWUsIGEsIGIpCisKKyAgICAgICAgYSA9IHJhbmdlKDUpCisgICAgICAgIGIgPSA1ICogWzJdCisgICAgICAgICMgdHJ5IG1peGVkIGFyZ3VtZW50cyAoYnV0IG5vdCAoYSwgYikgYXMgdGhhdCB3b24ndCByZXR1cm4gYSBib29sIHZlY3RvcikKKyAgICAgICAgYXJncyA9IFsoYSwgVmVjdG9yKGIpKSwgKFZlY3RvcihhKSwgYiksIChWZWN0b3IoYSksIFZlY3RvcihiKSldCisgICAgICAgIGZvciAoYSwgYikgaW4gYXJnczoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgibHQiLCBhLCBiLCBbVHJ1ZSwgIFRydWUsICBGYWxzZSwgRmFsc2UsIEZhbHNlXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgibGUiLCBhLCBiLCBbVHJ1ZSwgIFRydWUsICBUcnVlLCAgRmFsc2UsIEZhbHNlXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgiZXEiLCBhLCBiLCBbRmFsc2UsIEZhbHNlLCBUcnVlLCAgRmFsc2UsIEZhbHNlXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgibmUiLCBhLCBiLCBbVHJ1ZSwgIFRydWUsICBGYWxzZSwgVHJ1ZSwgIFRydWUgXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgiZ3QiLCBhLCBiLCBbRmFsc2UsIEZhbHNlLCBGYWxzZSwgVHJ1ZSwgIFRydWUgXSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgiZ2UiLCBhLCBiLCBbRmFsc2UsIEZhbHNlLCBUcnVlLCAgVHJ1ZSwgIFRydWUgXSkKKworICAgICAgICAgICAgZm9yIG9wcyBpbiBvcG1hcC5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICAgICAgZm9yIG9wIGluIG9wczoKKyAgICAgICAgICAgICAgICAgICAgIyBjYWxscyBfX25vbnplcm9fXywgd2hpY2ggc2hvdWxkIGZhaWwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBib29sLCBvcChhLCBiKSkKKworY2xhc3MgTnVtYmVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGNvbXBhcmlzb25zIGludm9sdmluZyBOdW1iZXIgb2JqZWN0cworICAgICAgICAjIGdpdmUgdGhlIHNhbWUgcmVzdWx0cyBnaXZlIGFzIGNvbXBhcmluZyB0aGUKKyAgICAgICAgIyBjb3JyZXNwb25kaW5nIGludHMKKyAgICAgICAgZm9yIGEgaW4geHJhbmdlKDMpOgorICAgICAgICAgICAgZm9yIGIgaW4geHJhbmdlKDMpOgorICAgICAgICAgICAgICAgIGZvciB0eXBlYSBpbiAoaW50LCBOdW1iZXIpOgorICAgICAgICAgICAgICAgICAgICBmb3IgdHlwZWIgaW4gKGludCwgTnVtYmVyKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHR5cGVhPT10eXBlYj09aW50OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlICMgdGhlIGNvbWJpbmF0aW9uIGludCwgaW50IGlzIHVzZWxlc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhID0gdHlwZWEoYSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRiID0gdHlwZWIoYikKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvcHMgaW4gb3BtYXAuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBvcCBpbiBvcHM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxvdXRjb21lID0gb3AoYSwgYikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdG91dGNvbWUgPSBvcCh0YSwgdGIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbG91dGNvbWUsIHRlc3RvdXRjb21lKQorCisgICAgZGVmIGNoZWNrdmFsdWUoc2VsZiwgb3BuYW1lLCBhLCBiLCBleHByZXMpOgorICAgICAgICBmb3IgdHlwZWEgaW4gKGludCwgTnVtYmVyKToKKyAgICAgICAgICAgIGZvciB0eXBlYiBpbiAoaW50LCBOdW1iZXIpOgorICAgICAgICAgICAgICAgIHRhID0gdHlwZWEoYSkKKyAgICAgICAgICAgICAgICB0YiA9IHR5cGViKGIpCisgICAgICAgICAgICAgICAgZm9yIG9wIGluIG9wbWFwW29wbmFtZV06CisgICAgICAgICAgICAgICAgICAgIHJlYWxyZXMgPSBvcCh0YSwgdGIpCisgICAgICAgICAgICAgICAgICAgIHJlYWxyZXMgPSBnZXRhdHRyKHJlYWxyZXMsICJ4IiwgcmVhbHJlcykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlYWxyZXMgaXMgZXhwcmVzKQorCisgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgorICAgICAgICAjIGNoZWNrIGFsbCBvcGVyYXRvcnMgYW5kIGFsbCBjb21wYXJpc29uIHJlc3VsdHMKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJsdCIsIDAsIDAsIEZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImxlIiwgMCwgMCwgVHJ1ZSApCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgiZXEiLCAwLCAwLCBUcnVlICkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJuZSIsIDAsIDAsIEZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImd0IiwgMCwgMCwgRmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgiZ2UiLCAwLCAwLCBUcnVlICkKKworICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImx0IiwgMCwgMSwgVHJ1ZSApCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgibGUiLCAwLCAxLCBUcnVlICkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJlcSIsIDAsIDEsIEZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoIm5lIiwgMCwgMSwgVHJ1ZSApCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgiZ3QiLCAwLCAxLCBGYWxzZSkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJnZSIsIDAsIDEsIEZhbHNlKQorCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgibHQiLCAxLCAwLCBGYWxzZSkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJsZSIsIDEsIDAsIEZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImVxIiwgMSwgMCwgRmFsc2UpCisgICAgICAgIHNlbGYuY2hlY2t2YWx1ZSgibmUiLCAxLCAwLCBUcnVlICkKKyAgICAgICAgc2VsZi5jaGVja3ZhbHVlKCJndCIsIDEsIDAsIFRydWUgKQorICAgICAgICBzZWxmLmNoZWNrdmFsdWUoImdlIiwgMSwgMCwgVHJ1ZSApCisKK2NsYXNzIE1pc2NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X21pc2JlaGF2aW4oc2VsZik6CisgICAgICAgIGNsYXNzIE1pc2I6CisgICAgICAgICAgICBkZWYgX19sdF9fKHNlbGZfLCBvdGhlcik6IHJldHVybiAwCisgICAgICAgICAgICBkZWYgX19ndF9fKHNlbGZfLCBvdGhlcik6IHJldHVybiAwCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGZfLCBvdGhlcik6IHJldHVybiAwCisgICAgICAgICAgICBkZWYgX19sZV9fKHNlbGZfLCBvdGhlcik6IHNlbGYuZmFpbCgiVGhpcyBzaG91bGRuJ3QgaGFwcGVuIikKKyAgICAgICAgICAgIGRlZiBfX2dlX18oc2VsZl8sIG90aGVyKTogc2VsZi5mYWlsKCJUaGlzIHNob3VsZG4ndCBoYXBwZW4iKQorICAgICAgICAgICAgZGVmIF9fbmVfXyhzZWxmXywgb3RoZXIpOiBzZWxmLmZhaWwoIlRoaXMgc2hvdWxkbid0IGhhcHBlbiIpCisgICAgICAgICAgICBkZWYgX19jbXBfXyhzZWxmXywgb3RoZXIpOiByYWlzZSBSdW50aW1lRXJyb3IsICJleHBlY3RlZCIKKyAgICAgICAgYSA9IE1pc2IoKQorICAgICAgICBiID0gTWlzYigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYTxiLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGE9PWIsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYT5iLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgYSwgYikKKworICAgIGRlZiB0ZXN0X25vdChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGV4Y2VwdGlvbnMgaW4gX19ub256ZXJvX18gYXJlIHByb3Blcmx5CisgICAgICAgICMgcHJvcGFnYXRlZCBieSB0aGUgbm90IG9wZXJhdG9yCisgICAgICAgIGltcG9ydCBvcGVyYXRvcgorICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2xhc3MgQmFkOgorICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YworCisgICAgICAgIGRlZiBkbyhiYWQpOgorICAgICAgICAgICAgbm90IGJhZAorCisgICAgICAgIGZvciBmdW5jIGluIChkbywgb3BlcmF0b3Iubm90Xyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGZ1bmMsIEJhZCgpKQorCisgICAgZGVmIHRlc3RfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgY29tcGFyaXNvbiBmb3IgcmVjdXJzaXZlIG9iamVjdHMgZmFpbHMgZ3JhY2VmdWxseQorICAgICAgICBmcm9tIFVzZXJMaXN0IGltcG9ydCBVc2VyTGlzdAorICAgICAgICBhID0gVXNlckxpc3QoKQorICAgICAgICBiID0gVXNlckxpc3QoKQorICAgICAgICBhLmFwcGVuZChiKQorICAgICAgICBiLmFwcGVuZChhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmVxLCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLm5lLCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmx0LCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmxlLCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmd0LCBhLCBiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmdlLCBhLCBiKQorCisgICAgICAgIGIuYXBwZW5kKDE3KQorICAgICAgICAjIEV2ZW4gcmVjdXJzaXZlIGxpc3RzIG9mIGRpZmZlcmVudCBsZW5ndGhzIGFyZSBkaWZmZXJlbnQsCisgICAgICAgICMgYnV0IHRoZXkgY2Fubm90IGJlIG9yZGVyZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoYSA9PSBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5sdCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5sZSwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5ndCwgYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBvcGVyYXRvci5nZSwgYSwgYikKKyAgICAgICAgYS5hcHBlbmQoMTcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IuZXEsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IubmUsIGEsIGIpCisgICAgICAgIGEuaW5zZXJ0KDAsIDExKQorICAgICAgICBiLmluc2VydCgwLCAxMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoYSA9PSBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPCBiKQorCitjbGFzcyBEaWN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kaWN0cyhzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCBfX2VxX18gYW5kIF9fbmVfXyB3b3JrIGZvciBkaWN0cyBldmVuIGlmIHRoZSBrZXlzIGFuZAorICAgICAgICAjIHZhbHVlcyBkb24ndCBzdXBwb3J0IGFueXRoaW5nIG90aGVyIHRoYW4gX19lcV9fIGFuZCBfX25lX18gKGFuZAorICAgICAgICAjIF9faGFzaF9fKS4gIENvbXBsZXggbnVtYmVycyBhcmUgYSBmaW5lIGV4YW1wbGUgb2YgdGhhdC4KKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICBpbWFnMWEgPSB7fQorICAgICAgICBmb3IgaSBpbiByYW5nZSg1MCk6CisgICAgICAgICAgICBpbWFnMWFbcmFuZG9tLnJhbmRyYW5nZSgxMDApKjFqXSA9IHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSoxagorICAgICAgICBpdGVtcyA9IGltYWcxYS5pdGVtcygpCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGl0ZW1zKQorICAgICAgICBpbWFnMWIgPSB7fQorICAgICAgICBmb3IgaywgdiBpbiBpdGVtczoKKyAgICAgICAgICAgIGltYWcxYltrXSA9IHYKKyAgICAgICAgaW1hZzIgPSBpbWFnMWIuY29weSgpCisgICAgICAgIGltYWcyW2tdID0gdiArIDEuMAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW1hZzFhID09IGltYWcxYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGltYWcxYSA9PSBpbWFnMWIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbWFnMiA9PSBpbWFnMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGltYWcxYSAhPSBpbWFnMikKKyAgICAgICAgZm9yIG9wbmFtZSBpbiAoImx0IiwgImxlIiwgImd0IiwgImdlIik6CisgICAgICAgICAgICBmb3Igb3AgaW4gb3BtYXBbb3BuYW1lXToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wLCBpbWFnMWEsIGltYWcyKQorCitjbGFzcyBMaXN0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jb3ZlcmFnZShzZWxmKToKKyAgICAgICAgIyBleGVyY2lzZSBhbGwgY29tcGFyaXNvbnMgZm9yIGxpc3RzCisgICAgICAgIHggPSBbNDJdCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeDx4LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4PD14LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHg9PXgsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeCE9eCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeD54LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4Pj14LCBUcnVlKQorICAgICAgICB5ID0gWzQyLCA0Ml0KKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4PHksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeDw9eSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4PT15LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh4IT15LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzKHg+eSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoeD49eSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9iYWRlbnRyeShzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBleGNlcHRpb25zIGZvciBpdGVtIGNvbXBhcmlzb24gYXJlIHByb3Blcmx5CisgICAgICAgICMgcHJvcGFnYXRlZCBpbiBsaXN0IGNvbXBhcmlzb25zCisgICAgICAgIGNsYXNzIEV4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBCYWQ6CisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGMKKworICAgICAgICB4ID0gW0JhZCgpXQorICAgICAgICB5ID0gW0JhZCgpXQorCisgICAgICAgIGZvciBvcCBpbiBvcG1hcFsiZXEiXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Yywgb3AsIHgsIHkpCisKKyAgICBkZWYgdGVzdF9nb29kZW50cnkoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUgZmluYWwgY2FsbCB0byBQeU9iamVjdF9SaWNoQ29tcGFyZSgpCisgICAgICAgICMgaW4gT2JqZWN0cy9saXN0b2JqZWN0LmM6Omxpc3RfcmljaGNvbXBhcmUoKQorICAgICAgICBjbGFzcyBHb29kOgorICAgICAgICAgICAgZGVmIF9fbHRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICB4ID0gW0dvb2QoKV0KKyAgICAgICAgeSA9IFtHb29kKCldCisKKyAgICAgICAgZm9yIG9wIGluIG9wbWFwWyJsdCJdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhvcCh4LCB5KSwgVHJ1ZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVmVjdG9yVGVzdCwgTnVtYmVyVGVzdCwgTWlzY1Rlc3QsIExpc3RUZXN0KQorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKCJkaWN0IGluZXF1YWxpdHkgY29tcGFyaXNvbnMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBzdXBwb3J0ZWQgaW4gMy54IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KERpY3RUZXN0KQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JpY2hjbXAucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmljaGNtcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MjIzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JpY2hjbXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JpY2hjbXAucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcmljaGNtcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5MjIzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JpY2hjbXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwZTcwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3JsY29tcGxldGVyLnB5CkBAIC0wLDAgKzEsNzMgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0IGFzIHN1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IF9fYnVpbHRpbl9fIGFzIGJ1aWx0aW5zCitpbXBvcnQgcmxjb21wbGV0ZXIKKworY2xhc3MgQ29tcGxldGVNZShvYmplY3QpOgorICAgICIiIiBUcml2aWFsIGNsYXNzIHVzZWQgaW4gdGVzdGluZyBybGNvbXBsZXRlci5Db21wbGV0ZXIuICIiIgorICAgIHNwYW0gPSAxCisKKworY2xhc3MgVGVzdFJsY29tcGxldGVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc3RkY29tcGxldGVyID0gcmxjb21wbGV0ZXIuQ29tcGxldGVyKCkKKyAgICAgICAgc2VsZi5jb21wbGV0ZXIgPSBybGNvbXBsZXRlci5Db21wbGV0ZXIoZGljdChzcGFtPWludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZ2c9c3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBsZXRlTWU9Q29tcGxldGVNZSkpCisKKyAgICAgICAgIyBmb3JjZXMgc3RkY29tcGxldGVyIHRvIGJpbmQgYnVpbHRpbnMgbmFtZXNwYWNlCisgICAgICAgIHNlbGYuc3RkY29tcGxldGVyLmNvbXBsZXRlKCcnLCAwKQorCisgICAgZGVmIHRlc3RfbmFtZXNwYWNlKHNlbGYpOgorICAgICAgICBjbGFzcyBBKGRpY3QpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBCKGxpc3QpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnN0ZGNvbXBsZXRlci51c2VfbWFpbl9ucykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmNvbXBsZXRlci51c2VfbWFpbl9ucykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShybGNvbXBsZXRlci5Db21wbGV0ZXIoQSgpKS51c2VfbWFpbl9ucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBybGNvbXBsZXRlci5Db21wbGV0ZXIsIEIoKDEsKSkpCisKKyAgICBkZWYgdGVzdF9nbG9iYWxfbWF0Y2hlcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHdpdGggYnVpbHRpbnMgbmFtZXNwYWNlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHNlbGYuc3RkY29tcGxldGVyLmdsb2JhbF9tYXRjaGVzKCdkaScpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbeCsnKCcgZm9yIHggaW4gZGlyKGJ1aWx0aW5zKSBpZiB4LnN0YXJ0c3dpdGgoJ2RpJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChzZWxmLnN0ZGNvbXBsZXRlci5nbG9iYWxfbWF0Y2hlcygnc3QnKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgW3grJygnIGZvciB4IGluIGRpcihidWlsdGlucykgaWYgeC5zdGFydHN3aXRoKCdzdCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnN0ZGNvbXBsZXRlci5nbG9iYWxfbWF0Y2hlcygnYWtha3NhamFkaGFrJyksIFtdKQorCisgICAgICAgICMgdGVzdCB3aXRoIGEgY3VzdG9taXplZCBuYW1lc3BhY2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5nbG9iYWxfbWF0Y2hlcygnQ29tcGxldGVNJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgWydDb21wbGV0ZU1lKCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmdsb2JhbF9tYXRjaGVzKCdlZycpLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnZWdnKCddKQorICAgICAgICAjIFhYWDogc2VlIGlzc3VlNTI1NgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmdsb2JhbF9tYXRjaGVzKCdDb21wbGV0ZU0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUoJ10pCisKKyAgICBkZWYgdGVzdF9hdHRyX21hdGNoZXMoc2VsZik6CisgICAgICAgICMgdGVzdCB3aXRoIGJ1aWx0aW5zIG5hbWVzcGFjZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3RkY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnc3RyLnMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ3N0ci57fSgnLmZvcm1hdCh4KSBmb3IgeCBpbiBkaXIoc3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zdGRjb21wbGV0ZXIuYXR0cl9tYXRjaGVzKCd0dXBsZS5mb29zcGFtZWdnJyksIFtdKQorCisgICAgICAgICMgdGVzdCB3aXRoIGEgY3VzdG9taXplZCBuYW1lc3BhY2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUuc3AnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUuc3BhbSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnQ29tcGxldGVtZS5lZ2cnKSwgW10pCisKKyAgICAgICAgQ29tcGxldGVNZS5tZSA9IENvbXBsZXRlTWUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbXBsZXRlci5hdHRyX21hdGNoZXMoJ0NvbXBsZXRlTWUubWUubWUuc3AnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ0NvbXBsZXRlTWUubWUubWUuc3BhbSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tcGxldGVyLmF0dHJfbWF0Y2hlcygnZWdnLnMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ2VnZy57fSgnLmZvcm1hdCh4KSBmb3IgeCBpbiBkaXIoc3RyKQorICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB4LnN0YXJ0c3dpdGgoJ3MnKV0pCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0Umxjb21wbGV0ZXIpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmQwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcmxjb21wbGV0ZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYmQwNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ybGNvbXBsZXRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Q0YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKQEAgLTAsMCArMSwyNzYgQEAKK2ltcG9ydCB1bml0dGVzdCwgU3RyaW5nSU8sIHJvYm90cGFyc2VyCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB1cmxsaWIyIGltcG9ydCB1cmxvcGVuLCBIVFRQRXJyb3IKKworY2xhc3MgUm9ib3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGluZGV4LCBwYXJzZXIsIHVybCwgZ29vZCwgYWdlbnQpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmKQorICAgICAgICBpZiBnb29kOgorICAgICAgICAgICAgc2VsZi5zdHIgPSAiUm9ib3RUZXN0KCVkLCBnb29kLCAlcykiICUgKGluZGV4LCB1cmwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0ciA9ICJSb2JvdFRlc3QoJWQsIGJhZCwgJXMpIiAlIChpbmRleCwgdXJsKQorICAgICAgICBzZWxmLnBhcnNlciA9IHBhcnNlcgorICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICBzZWxmLmdvb2QgPSBnb29kCisgICAgICAgIHNlbGYuYWdlbnQgPSBhZ2VudAorCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi51cmwsIHR1cGxlKToKKyAgICAgICAgICAgIGFnZW50LCB1cmwgPSBzZWxmLnVybAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXJsID0gc2VsZi51cmwKKyAgICAgICAgICAgIGFnZW50ID0gc2VsZi5hZ2VudAorICAgICAgICBpZiBzZWxmLmdvb2Q6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhcnNlci5jYW5fZmV0Y2goYWdlbnQsIHVybCkpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RyCisKK3Rlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworZGVmIFJvYm90VGVzdChpbmRleCwgcm9ib3RzX3R4dCwgZ29vZF91cmxzLCBiYWRfdXJscywKKyAgICAgICAgICAgICAgYWdlbnQ9InRlc3Rfcm9ib3RwYXJzZXIiKToKKworICAgIGxpbmVzID0gU3RyaW5nSU8uU3RyaW5nSU8ocm9ib3RzX3R4dCkucmVhZGxpbmVzKCkKKyAgICBwYXJzZXIgPSByb2JvdHBhcnNlci5Sb2JvdEZpbGVQYXJzZXIoKQorICAgIHBhcnNlci5wYXJzZShsaW5lcykKKyAgICBmb3IgdXJsIGluIGdvb2RfdXJsczoKKyAgICAgICAgdGVzdHMuYWRkVGVzdChSb2JvdFRlc3RDYXNlKGluZGV4LCBwYXJzZXIsIHVybCwgMSwgYWdlbnQpKQorICAgIGZvciB1cmwgaW4gYmFkX3VybHM6CisgICAgICAgIHRlc3RzLmFkZFRlc3QoUm9ib3RUZXN0Q2FzZShpbmRleCwgcGFyc2VyLCB1cmwsIDAsIGFnZW50KSkKKworIyBFeGFtcGxlcyBmcm9tIGh0dHA6Ly93d3cucm9ib3RzdHh0Lm9yZy93Yy9ub3JvYm90cy5odG1sIChmZXRjaGVkIDIwMDIpCisKKyMgMS4KK2RvYyA9ICIiIgorVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC9jeWJlcndvcmxkL21hcC8gIyBUaGlzIGlzIGFuIGluZmluaXRlIHZpcnR1YWwgVVJMIHNwYWNlCitEaXNhbGxvdzogL3RtcC8gIyB0aGVzZSB3aWxsIHNvb24gZGlzYXBwZWFyCitEaXNhbGxvdzogL2Zvby5odG1sCisiIiIKKworZ29vZCA9IFsnLycsJy90ZXN0Lmh0bWwnXQorYmFkID0gWycvY3liZXJ3b3JsZC9tYXAvaW5kZXguaHRtbCcsJy90bXAveHh4JywnL2Zvby5odG1sJ10KKworUm9ib3RUZXN0KDEsIGRvYywgZ29vZCwgYmFkKQorCisjIDIuCitkb2MgPSAiIiIKKyMgcm9ib3RzLnR4dCBmb3IgaHR0cDovL3d3dy5leGFtcGxlLmNvbS8KKworVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC9jeWJlcndvcmxkL21hcC8gIyBUaGlzIGlzIGFuIGluZmluaXRlIHZpcnR1YWwgVVJMIHNwYWNlCisKKyMgQ3liZXJtYXBwZXIga25vd3Mgd2hlcmUgdG8gZ28uCitVc2VyLWFnZW50OiBjeWJlcm1hcHBlcgorRGlzYWxsb3c6CisKKyIiIgorCitnb29kID0gWycvJywnL3Rlc3QuaHRtbCcsKCdjeWJlcm1hcHBlcicsJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJyldCitiYWQgPSBbJy9jeWJlcndvcmxkL21hcC9pbmRleC5odG1sJ10KKworUm9ib3RUZXN0KDIsIGRvYywgZ29vZCwgYmFkKQorCisjIDMuCitkb2MgPSAiIiIKKyMgZ28gYXdheQorVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC8KKyIiIgorCitnb29kID0gW10KK2JhZCA9IFsnL2N5YmVyd29ybGQvbWFwL2luZGV4Lmh0bWwnLCcvJywnL3RtcC8nXQorCitSb2JvdFRlc3QoMywgZG9jLCBnb29kLCBiYWQpCisKKyMgRXhhbXBsZXMgZnJvbSBodHRwOi8vd3d3LnJvYm90c3R4dC5vcmcvd2Mvbm9yb2JvdHMtcmZjLmh0bWwgKGZldGNoZWQgMjAwMikKKworIyA0LgorZG9jID0gIiIiCitVc2VyLWFnZW50OiBmaWd0cmVlCitEaXNhbGxvdzogL3RtcAorRGlzYWxsb3c6IC9hJTNjZC5odG1sCitEaXNhbGxvdzogL2ElMmZiLmh0bWwKK0Rpc2FsbG93OiAvJTdlam9lL2luZGV4Lmh0bWwKKyIiIgorCitnb29kID0gW10gIyBYRkFJTCAnL2EvYi5odG1sJworYmFkID0gWycvdG1wJywnL3RtcC5odG1sJywnL3RtcC9hLmh0bWwnLAorICAgICAgICcvYSUzY2QuaHRtbCcsJy9hJTNDZC5odG1sJywnL2ElMmZiLmh0bWwnLAorICAgICAgICcvfmpvZS9pbmRleC5odG1sJworICAgICAgIF0KKworUm9ib3RUZXN0KDQsIGRvYywgZ29vZCwgYmFkLCAnZmlndHJlZScpCitSb2JvdFRlc3QoNSwgZG9jLCBnb29kLCBiYWQsICdGaWdUcmVlIFJvYm90IGxpYnd3dy1wZXJsLzUuMDQnKQorCisjIDYuCitkb2MgPSAiIiIKK1VzZXItYWdlbnQ6ICoKK0Rpc2FsbG93OiAvdG1wLworRGlzYWxsb3c6IC9hJTNDZC5odG1sCitEaXNhbGxvdzogL2EvYi5odG1sCitEaXNhbGxvdzogLyU3ZWpvZS9pbmRleC5odG1sCisiIiIKKworZ29vZCA9IFsnL3RtcCcsXSAjIFhGQUlMOiAnL2ElMmZiLmh0bWwnCitiYWQgPSBbJy90bXAvJywnL3RtcC9hLmh0bWwnLAorICAgICAgICcvYSUzY2QuaHRtbCcsJy9hJTNDZC5odG1sJywiL2EvYi5odG1sIiwKKyAgICAgICAnLyU3RWpvZS9pbmRleC5odG1sJ10KKworUm9ib3RUZXN0KDYsIGRvYywgZ29vZCwgYmFkKQorCisjIEZyb20gYnVnIHJlcG9ydCAjNTIzMDQxCisKKyMgNy4KK2RvYyA9ICIiIgorVXNlci1BZ2VudDogKgorRGlzYWxsb3c6IC8uCisiIiIKKworZ29vZCA9IFsnL2Zvby5odG1sJ10KK2JhZCA9IFtdICMgQnVnIHJlcG9ydCBzYXlzICIvIiBzaG91bGQgYmUgZGVuaWVkLCBidXQgdGhhdCBpcyBub3QgaW4gdGhlIFJGQworCitSb2JvdFRlc3QoNywgZG9jLCBnb29kLCBiYWQpCisKKyMgRnJvbSBHb29nbGU6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9zdXBwb3J0L3dlYm1hc3RlcnMvYmluL2Fuc3dlci5weT9obD1lbiZhbnN3ZXI9NDAzNjQKKworIyA4LgorZG9jID0gIiIiCitVc2VyLWFnZW50OiBHb29nbGVib3QKK0FsbG93OiAvZm9sZGVyMS9teWZpbGUuaHRtbAorRGlzYWxsb3c6IC9mb2xkZXIxLworIiIiCisKK2dvb2QgPSBbJy9mb2xkZXIxL215ZmlsZS5odG1sJ10KK2JhZCA9IFsnL2ZvbGRlcjEvYW5vdGhlcmZpbGUuaHRtbCddCisKK1JvYm90VGVzdCg4LCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdCIpCisKKyMgOS4gIFRoaXMgZmlsZSBpcyBpbmNvcnJlY3QgYmVjYXVzZSAiR29vZ2xlYm90IiBpcyBhIHN1YnN0cmluZyBvZgorIyAgICAgIkdvb2dsZWJvdC1Nb2JpbGUiLCBzbyB0ZXN0IDEwIHdvcmtzIGp1c3QgbGlrZSB0ZXN0IDkuCitkb2MgPSAiIiIKK1VzZXItYWdlbnQ6IEdvb2dsZWJvdAorRGlzYWxsb3c6IC8KKworVXNlci1hZ2VudDogR29vZ2xlYm90LU1vYmlsZQorQWxsb3c6IC8KKyIiIgorCitnb29kID0gW10KK2JhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQorCitSb2JvdFRlc3QoOSwgZG9jLCBnb29kLCBiYWQsIGFnZW50PSJHb29nbGVib3QiKQorCitnb29kID0gW10KK2JhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQorCitSb2JvdFRlc3QoMTAsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90LU1vYmlsZSIpCisKKyMgMTEuICBHZXQgdGhlIG9yZGVyIGNvcnJlY3QuCitkb2MgPSAiIiIKK1VzZXItYWdlbnQ6IEdvb2dsZWJvdC1Nb2JpbGUKK0FsbG93OiAvCisKK1VzZXItYWdlbnQ6IEdvb2dsZWJvdAorRGlzYWxsb3c6IC8KKyIiIgorCitnb29kID0gW10KK2JhZCA9IFsnL3NvbWV0aGluZy5qcGcnXQorCitSb2JvdFRlc3QoMTEsIGRvYywgZ29vZCwgYmFkLCBhZ2VudD0iR29vZ2xlYm90IikKKworZ29vZCA9IFsnL3NvbWV0aGluZy5qcGcnXQorYmFkID0gW10KKworUm9ib3RUZXN0KDEyLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Ikdvb2dsZWJvdC1Nb2JpbGUiKQorCisKKyMgMTMuICBHb29nbGUgYWxzbyBnb3QgdGhlIG9yZGVyIHdyb25nIGluICM4LiAgWW91IG5lZWQgdG8gc3BlY2lmeSB0aGUKKyMgICAgICBVUkxzIGZyb20gbW9yZSBzcGVjaWZpYyB0byBtb3JlIGdlbmVyYWwuCitkb2MgPSAiIiIKK1VzZXItYWdlbnQ6IEdvb2dsZWJvdAorQWxsb3c6IC9mb2xkZXIxL215ZmlsZS5odG1sCitEaXNhbGxvdzogL2ZvbGRlcjEvCisiIiIKKworZ29vZCA9IFsnL2ZvbGRlcjEvbXlmaWxlLmh0bWwnXQorYmFkID0gWycvZm9sZGVyMS9hbm90aGVyZmlsZS5odG1sJ10KKworUm9ib3RUZXN0KDEzLCBkb2MsIGdvb2QsIGJhZCwgYWdlbnQ9Imdvb2dsZWJvdCIpCisKKworIyAxNC4gRm9yIGlzc3VlICM2MzI1IChxdWVyeSBzdHJpbmcgc3VwcG9ydCkKK2RvYyA9ICIiIgorVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC9zb21lL3BhdGg/bmFtZT12YWx1ZQorIiIiCisKK2dvb2QgPSBbJy9zb21lL3BhdGgnXQorYmFkID0gWycvc29tZS9wYXRoP25hbWU9dmFsdWUnXQorCitSb2JvdFRlc3QoMTQsIGRvYywgZ29vZCwgYmFkKQorCisjIDE1LiBGb3IgaXNzdWUgIzQxMDggKG9iZXkgZmlyc3QgKiBlbnRyeSkKK2RvYyA9ICIiIgorVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC9zb21lL3BhdGgKKworVXNlci1hZ2VudDogKgorRGlzYWxsb3c6IC9hbm90aGVyL3BhdGgKKyIiIgorCitnb29kID0gWycvYW5vdGhlci9wYXRoJ10KK2JhZCA9IFsnL3NvbWUvcGF0aCddCisKK1JvYm90VGVzdCgxNSwgZG9jLCBnb29kLCBiYWQpCisKKworY2xhc3MgTmV0d29ya1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0UGFzc3dvcmRQcm90ZWN0ZWRTaXRlKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoJ211ZWJsZXNtb3JhbGVkYS5jb20nKToKKyAgICAgICAgICAgIHVybCA9ICdodHRwOi8vbXVlYmxlc21vcmFsZWRhLmNvbScKKyAgICAgICAgICAgIHJvYm90c191cmwgPSB1cmwgKyAiL3JvYm90cy50eHQiCisgICAgICAgICAgICAjIEZpcnN0IGNoZWNrIHRoZSBVUkwgaXMgdXNhYmxlIGZvciBvdXIgcHVycG9zZXMsIHNpbmNlIHRoZQorICAgICAgICAgICAgIyB0ZXN0IHNpdGUgaXMgYSBiaXQgZmxha3kuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdXJsb3Blbihyb2JvdHNfdXJsKQorICAgICAgICAgICAgZXhjZXB0IEhUVFBFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuY29kZSBub3QgaW4gezQwMSwgNDAzfToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICIlciBzaG91bGQgcmV0dXJuIGEgNDAxIG9yIDQwMyBIVFRQIGVycm9yLCBub3QgJXIiCisgICAgICAgICAgICAgICAgICAgICAgICAlIChyb2JvdHNfdXJsLCBlLmNvZGUpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KAorICAgICAgICAgICAgICAgICAgICAiJXIgc2hvdWxkIHJldHVybiBhIDQwMSBvciA0MDMgSFRUUCBlcnJvciwgbm90IHN1Y2NlZWQiCisgICAgICAgICAgICAgICAgICAgICUgKHJvYm90c191cmwpKQorICAgICAgICAgICAgcGFyc2VyID0gcm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKCkKKyAgICAgICAgICAgIHBhcnNlci5zZXRfdXJsKHVybCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXJzZXIucmVhZCgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCclcyBpcyB1bmF2YWlsYWJsZScgJSB1cmwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5jYW5fZmV0Y2goIioiLCByb2JvdHNfdXJsKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdFB5dGhvbk9yZyhzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCduZXR3b3JrJykKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCd3d3cucHl0aG9uLm9yZycpOgorICAgICAgICAgICAgcGFyc2VyID0gcm9ib3RwYXJzZXIuUm9ib3RGaWxlUGFyc2VyKAorICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvcm9ib3RzLnR4dCIpCisgICAgICAgICAgICBwYXJzZXIucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgcGFyc2VyLmNhbl9mZXRjaCgiKiIsICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvcm9ib3RzLnR4dCIpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KHRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTmV0d29ya1Rlc3RDYXNlKQorCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICB0ZXN0X3N1cHBvcnQudmVyYm9zZSA9IDEKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWJiODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWJiODgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcnVucHkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ydW5weS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njg1OGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfcnVucHkucHkKQEAgLTAsMCArMSw0MDUgQEAKKyMgVGVzdCB0aGUgcnVucHkgbW9kdWxlCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHRlbXBmaWxlCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBydW5fdW5pdHRlc3QsIGZvcmdldAorZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0ICh0ZW1wX2RpciwgbWFrZV9zY3JpcHQsIGNvbXBpbGVfc2NyaXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BrZywgbWFrZV96aXBfc2NyaXB0LCBtYWtlX3ppcF9wa2cpCisKKworZnJvbSBydW5weSBpbXBvcnQgX3J1bl9jb2RlLCBfcnVuX21vZHVsZV9jb2RlLCBydW5fbW9kdWxlLCBydW5fcGF0aAorIyBOb3RlOiBUaGlzIG1vZHVsZSBjYW4ndCBzYWZlbHkgdGVzdCBfcnVuX21vZHVsZV9hc19tYWluIGFzIGl0CisjIHJ1bnMgaXRzIHRlc3RzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MsIHdoaWNoIHdvdWxkIG1lc3Mgd2l0aCB0aGUKKyMgcmVhbCBfX21haW5fXyBtb2R1bGUgKHVzdWFsbHkgdGVzdC5yZWdydGVzdCkKKyMgU2VlIHRlc3RfY21kX2xpbmVfc2NyaXB0IGZvciBhIHRlc3QgdGhhdCBleGVjdXRlcyB0aGF0IGNvZGUgcGF0aAorCisjIFNldCB1cCB0aGUgdGVzdCBjb2RlIGFuZCBleHBlY3RlZCByZXN1bHRzCisKK2NsYXNzIFJ1bk1vZHVsZUNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJVbml0IHRlc3RzIGZvciBydW5weS5fcnVuX2NvZGUgYW5kIHJ1bnB5Ll9ydW5fbW9kdWxlX2NvZGUiIiIKKworICAgIGV4cGVjdGVkX3Jlc3VsdCA9IFsiVG9wIGxldmVsIGFzc2lnbm1lbnQiLCAiTG93ZXIgbGV2ZWwgcmVmZXJlbmNlIl0KKyAgICB0ZXN0X3NvdXJjZSA9ICgKKyAgICAgICAgIiMgQ2hlY2sgYmFzaWMgY29kZSBleGVjdXRpb25cbiIKKyAgICAgICAgInJlc3VsdCA9IFsnVG9wIGxldmVsIGFzc2lnbm1lbnQnXVxuIgorICAgICAgICAiZGVmIGYoKTpcbiIKKyAgICAgICAgIiAgICByZXN1bHQuYXBwZW5kKCdMb3dlciBsZXZlbCByZWZlcmVuY2UnKVxuIgorICAgICAgICAiZigpXG4iCisgICAgICAgICIjIENoZWNrIHRoZSBzeXMgbW9kdWxlXG4iCisgICAgICAgICJpbXBvcnQgc3lzXG4iCisgICAgICAgICJydW5fYXJndjAgPSBzeXMuYXJndlswXVxuIgorICAgICAgICAicnVuX25hbWVfaW5fc3lzX21vZHVsZXMgPSBfX25hbWVfXyBpbiBzeXMubW9kdWxlc1xuIgorICAgICAgICAiaWYgcnVuX25hbWVfaW5fc3lzX21vZHVsZXM6XG4iCisgICAgICAgICIgICBtb2R1bGVfaW5fc3lzX21vZHVsZXMgPSBnbG9iYWxzKCkgaXMgc3lzLm1vZHVsZXNbX19uYW1lX19dLl9fZGljdF9fXG4iCisgICAgICAgICIjIENoZWNrIG5lc3RlZCBvcGVyYXRpb25cbiIKKyAgICAgICAgImltcG9ydCBydW5weVxuIgorICAgICAgICAibmVzdGVkID0gcnVucHkuX3J1bl9tb2R1bGVfY29kZSgneD0xXFxuJywgbW9kX25hbWU9JzxydW4+JylcbiIKKyAgICApCisKKyAgICBkZWYgdGVzdF9ydW5fY29kZShzZWxmKToKKyAgICAgICAgc2F2ZWRfYXJndjAgPSBzeXMuYXJndlswXQorICAgICAgICBkID0gX3J1bl9jb2RlKHNlbGYudGVzdF9zb3VyY2UsIHt9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbInJlc3VsdCJdLCBzZWxmLmV4cGVjdGVkX3Jlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkWyJfX25hbWVfXyJdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzKGRbIl9fZmlsZV9fIl0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZFsiX19sb2FkZXJfXyJdLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydElzKGRbIl9fcGFja2FnZV9fIl0sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZFsicnVuX2FyZ3YwIl0sIHNhdmVkX2FyZ3YwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJydW5fbmFtZSIsIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3lzLmFyZ3ZbMF0sIHNhdmVkX2FyZ3YwKQorCisgICAgZGVmIHRlc3RfcnVuX21vZHVsZV9jb2RlKHNlbGYpOgorICAgICAgICBpbml0aWFsID0gb2JqZWN0KCkKKyAgICAgICAgbmFtZSA9ICI8Tm9uc2Vuc2U+IgorICAgICAgICBmaWxlID0gIlNvbWUgb3RoZXIgbm9uc2Vuc2UiCisgICAgICAgIGxvYWRlciA9ICJOb3cgeW91J3JlIGp1c3QgYmVpbmcgc2lsbHkiCisgICAgICAgIHBhY2thZ2UgPSAnJyAjIFRyZWF0IGFzIGEgdG9wIGxldmVsIG1vZHVsZQorICAgICAgICBkMSA9IGRpY3QoaW5pdGlhbD1pbml0aWFsKQorICAgICAgICBzYXZlZF9hcmd2MCA9IHN5cy5hcmd2WzBdCisgICAgICAgIGQyID0gX3J1bl9tb2R1bGVfY29kZShzZWxmLnRlc3Rfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oInJlc3VsdCIsIGQxKQorICAgICAgICBzZWxmLmFzc2VydElzKGQyWyJpbml0aWFsIl0sIGluaXRpYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDJbInJlc3VsdCJdLCBzZWxmLmV4cGVjdGVkX3Jlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMlsibmVzdGVkIl1bIngiXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkMlsiX19uYW1lX18iXSwgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJydW5fbmFtZV9pbl9zeXNfbW9kdWxlcyJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIm1vZHVsZV9pbl9zeXNfbW9kdWxlcyJdKQorICAgICAgICBzZWxmLmFzc2VydElzKGQyWyJfX2ZpbGVfXyJdLCBmaWxlKQorICAgICAgICBzZWxmLmFzc2VydElzKGQyWyJydW5fYXJndjAiXSwgZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhkMlsiX19sb2FkZXJfXyJdLCBsb2FkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoZDJbIl9fcGFja2FnZV9fIl0sIHBhY2thZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3lzLmFyZ3ZbMF0sIHNhdmVkX2FyZ3YwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKG5hbWUsIHN5cy5tb2R1bGVzKQorCisKK2NsYXNzIFJ1bk1vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlVuaXQgdGVzdHMgZm9yIHJ1bnB5LnJ1bl9tb2R1bGUiIiIKKworICAgIGRlZiBleHBlY3RfaW1wb3J0X2Vycm9yKHNlbGYsIG1vZF9uYW1lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcnVuX21vZHVsZShtb2RfbmFtZSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBpbXBvcnQgZXJyb3IgZm9yICIgKyBtb2RfbmFtZSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfbmFtZXMoc2VsZik6CisgICAgICAgICMgQnVpbHRpbiBtb2R1bGUKKyAgICAgICAgc2VsZi5leHBlY3RfaW1wb3J0X2Vycm9yKCJzeXMiKQorICAgICAgICAjIE5vbi1leGlzdGVudCBtb2R1bGVzCisgICAgICAgIHNlbGYuZXhwZWN0X2ltcG9ydF9lcnJvcigic3lzLmltcC5lcmljIikKKyAgICAgICAgc2VsZi5leHBlY3RfaW1wb3J0X2Vycm9yKCJvcy5wYXRoLmhhbGYiKQorICAgICAgICBzZWxmLmV4cGVjdF9pbXBvcnRfZXJyb3IoImEuYmVlIikKKyAgICAgICAgc2VsZi5leHBlY3RfaW1wb3J0X2Vycm9yKCIuaG93YXJkIikKKyAgICAgICAgc2VsZi5leHBlY3RfaW1wb3J0X2Vycm9yKCIuLmVhdGVuIikKKyAgICAgICAgIyBQYWNrYWdlIHdpdGhvdXQgX19tYWluX18ucHkKKyAgICAgICAgc2VsZi5leHBlY3RfaW1wb3J0X2Vycm9yKCJtdWx0aXByb2Nlc3NpbmciKQorCisgICAgZGVmIHRlc3RfbGlicmFyeV9tb2R1bGUoc2VsZik6CisgICAgICAgIHJ1bl9tb2R1bGUoInJ1bnB5IikKKworICAgIGRlZiBfYWRkX3BrZ19kaXIoc2VsZiwgcGtnX2Rpcik6CisgICAgICAgIG9zLm1rZGlyKHBrZ19kaXIpCisgICAgICAgIHBrZ19mbmFtZSA9IG9zLnBhdGguam9pbihwa2dfZGlyLCAiX19pbml0X18iK29zLmV4dHNlcCsicHkiKQorICAgICAgICBwa2dfZmlsZSA9IG9wZW4ocGtnX2ZuYW1lLCAidyIpCisgICAgICAgIHBrZ19maWxlLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHBrZ19mbmFtZQorCisgICAgZGVmIF9tYWtlX3BrZyhzZWxmLCBzb3VyY2UsIGRlcHRoLCBtb2RfYmFzZT0icnVucHlfdGVzdCIpOgorICAgICAgICBwa2dfbmFtZSA9ICJfX3J1bnB5X3BrZ19fIgorICAgICAgICB0ZXN0X2ZuYW1lID0gbW9kX2Jhc2Urb3MuZXh0c2VwKyJweSIKKyAgICAgICAgcGtnX2RpciA9IHN1Yl9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgUGFja2FnZSB0cmVlIGluOiIsIHN1Yl9kaXIKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIHBrZ19kaXIpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIFVwZGF0ZWQgc3lzLnBhdGg6Iiwgc3lzLnBhdGhbMF0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGVwdGgpOgorICAgICAgICAgICAgc3ViX2RpciA9IG9zLnBhdGguam9pbihzdWJfZGlyLCBwa2dfbmFtZSkKKyAgICAgICAgICAgIHBrZ19mbmFtZSA9IHNlbGYuX2FkZF9wa2dfZGlyKHN1Yl9kaXIpCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiICBOZXh0IGxldmVsIGluOiIsIHN1Yl9kaXIKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIENyZWF0ZWQ6IiwgcGtnX2ZuYW1lCisgICAgICAgIG1vZF9mbmFtZSA9IG9zLnBhdGguam9pbihzdWJfZGlyLCB0ZXN0X2ZuYW1lKQorICAgICAgICBtb2RfZmlsZSA9IG9wZW4obW9kX2ZuYW1lLCAidyIpCisgICAgICAgIG1vZF9maWxlLndyaXRlKHNvdXJjZSkKKyAgICAgICAgbW9kX2ZpbGUuY2xvc2UoKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiICBDcmVhdGVkOiIsIG1vZF9mbmFtZQorICAgICAgICBtb2RfbmFtZSA9IChwa2dfbmFtZSsiLiIpKmRlcHRoICsgbW9kX2Jhc2UKKyAgICAgICAgcmV0dXJuIHBrZ19kaXIsIG1vZF9mbmFtZSwgbW9kX25hbWUKKworICAgIGRlZiBfZGVsX3BrZyhzZWxmLCB0b3AsIGRlcHRoLCBtb2RfbmFtZSk6CisgICAgICAgIGZvciBlbnRyeSBpbiBsaXN0KHN5cy5tb2R1bGVzKToKKyAgICAgICAgICAgIGlmIGVudHJ5LnN0YXJ0c3dpdGgoIl9fcnVucHlfcGtnX18iKToKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbZW50cnldCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIFJlbW92ZWQgc3lzLm1vZHVsZXMgZW50cmllcyIKKyAgICAgICAgZGVsIHN5cy5wYXRoWzBdCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIFJlbW92ZWQgc3lzLnBhdGggZW50cnkiCisgICAgICAgIGZvciByb290LCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHRvcCwgdG9wZG93bj1GYWxzZSk6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4ocm9vdCwgbmFtZSkpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4OgorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCBleCAjIFBlcnNpc3Qgd2l0aCBjbGVhbmluZyB1cAorICAgICAgICAgICAgZm9yIG5hbWUgaW4gZGlyczoKKyAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihyb290LCBuYW1lKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgb3Mucm1kaXIoZnVsbG5hbWUpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4OgorICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCBleCAjIFBlcnNpc3Qgd2l0aCBjbGVhbmluZyB1cAorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5ybWRpcih0b3ApCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiICBSZW1vdmVkIHBhY2thZ2UgdHJlZSIKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGV4OgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgZXggIyBQZXJzaXN0IHdpdGggY2xlYW5pbmcgdXAKKworICAgIGRlZiBfY2hlY2tfbW9kdWxlKHNlbGYsIGRlcHRoKToKKyAgICAgICAgcGtnX2RpciwgbW9kX2ZuYW1lLCBtb2RfbmFtZSA9ICgKKyAgICAgICAgICAgICAgIHNlbGYuX21ha2VfcGtnKCJ4PTFcbiIsIGRlcHRoKSkKKyAgICAgICAgZm9yZ2V0KG1vZF9uYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIHNvdXJjZToiLCBtb2RfbmFtZQorICAgICAgICAgICAgZDEgPSBydW5fbW9kdWxlKG1vZF9uYW1lKSAjIFJlYWQgZnJvbSBzb3VyY2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIngiLCBkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMVsieCJdID09IDEpCisgICAgICAgICAgICBkZWwgZDEgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCisgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZF9uYW1lKQorICAgICAgICAgICAgb3MucmVtb3ZlKG1vZF9mbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIGNvbXBpbGVkOiIsIG1vZF9uYW1lCisgICAgICAgICAgICAgICAgZDIgPSBydW5fbW9kdWxlKG1vZF9uYW1lKSAjIFJlYWQgZnJvbSBieXRlY29kZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIngiLCBkMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIngiXSA9PSAxKQorICAgICAgICAgICAgICAgIGRlbCBkMiAjIEVuc3VyZSBfX2xvYWRlcl9fIGVudHJ5IGRvZXNuJ3Qga2VlcCBmaWxlIG9wZW4KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2RlbF9wa2cocGtnX2RpciwgZGVwdGgsIG1vZF9uYW1lKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiTW9kdWxlIGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseSIKKworICAgIGRlZiBfY2hlY2tfcGFja2FnZShzZWxmLCBkZXB0aCk6CisgICAgICAgIHBrZ19kaXIsIG1vZF9mbmFtZSwgbW9kX25hbWUgPSAoCisgICAgICAgICAgICAgICBzZWxmLl9tYWtlX3BrZygieD0xXG4iLCBkZXB0aCwgIl9fbWFpbl9fIikpCisgICAgICAgIHBrZ19uYW1lLCBfLCBfID0gbW9kX25hbWUucnBhcnRpdGlvbigiLiIpCisgICAgICAgIGZvcmdldChtb2RfbmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlJ1bm5pbmcgZnJvbSBzb3VyY2U6IiwgcGtnX25hbWUKKyAgICAgICAgICAgIGQxID0gcnVuX21vZHVsZShwa2dfbmFtZSkgIyBSZWFkIGZyb20gc291cmNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJ4IiwgZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDFbIngiXSA9PSAxKQorICAgICAgICAgICAgZGVsIGQxICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgorICAgICAgICAgICAgX19pbXBvcnRfXyhtb2RfbmFtZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShtb2RfZm5hbWUpCisgICAgICAgICAgICBpZiBub3Qgc3lzLmRvbnRfd3JpdGVfYnl0ZWNvZGU6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlJ1bm5pbmcgZnJvbSBjb21waWxlZDoiLCBwa2dfbmFtZQorICAgICAgICAgICAgICAgIGQyID0gcnVuX21vZHVsZShwa2dfbmFtZSkgIyBSZWFkIGZyb20gYnl0ZWNvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJ4IiwgZDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJ4Il0gPT0gMSkKKyAgICAgICAgICAgICAgICBkZWwgZDIgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9kZWxfcGtnKHBrZ19kaXIsIGRlcHRoLCBwa2dfbmFtZSkKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlBhY2thZ2UgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IgorCisgICAgZGVmIF9hZGRfcmVsYXRpdmVfbW9kdWxlcyhzZWxmLCBiYXNlX2Rpciwgc291cmNlLCBkZXB0aCk6CisgICAgICAgIGlmIGRlcHRoIDw9IDE6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJSZWxhdGl2ZSBtb2R1bGUgdGVzdCBuZWVkcyBkZXB0aCA+IDEiKQorICAgICAgICBwa2dfbmFtZSA9ICJfX3J1bnB5X3BrZ19fIgorICAgICAgICBtb2R1bGVfZGlyID0gYmFzZV9kaXIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoZGVwdGgpOgorICAgICAgICAgICAgcGFyZW50X2RpciA9IG1vZHVsZV9kaXIKKyAgICAgICAgICAgIG1vZHVsZV9kaXIgPSBvcy5wYXRoLmpvaW4obW9kdWxlX2RpciwgcGtnX25hbWUpCisgICAgICAgICMgQWRkIHNpYmxpbmcgbW9kdWxlCisgICAgICAgIHNpYmxpbmdfZm5hbWUgPSBvcy5wYXRoLmpvaW4obW9kdWxlX2RpciwgInNpYmxpbmciK29zLmV4dHNlcCsicHkiKQorICAgICAgICBzaWJsaW5nX2ZpbGUgPSBvcGVuKHNpYmxpbmdfZm5hbWUsICJ3IikKKyAgICAgICAgc2libGluZ19maWxlLmNsb3NlKCkKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgQWRkZWQgc2libGluZyBtb2R1bGU6Iiwgc2libGluZ19mbmFtZQorICAgICAgICAjIEFkZCBuZXBoZXcgbW9kdWxlCisgICAgICAgIHVuY2xlX2RpciA9IG9zLnBhdGguam9pbihwYXJlbnRfZGlyLCAidW5jbGUiKQorICAgICAgICBzZWxmLl9hZGRfcGtnX2Rpcih1bmNsZV9kaXIpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICIgIEFkZGVkIHVuY2xlIHBhY2thZ2U6IiwgdW5jbGVfZGlyCisgICAgICAgIGNvdXNpbl9kaXIgPSBvcy5wYXRoLmpvaW4odW5jbGVfZGlyLCAiY291c2luIikKKyAgICAgICAgc2VsZi5fYWRkX3BrZ19kaXIoY291c2luX2RpcikKKyAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIiAgQWRkZWQgY291c2luIHBhY2thZ2U6IiwgY291c2luX2RpcgorICAgICAgICBuZXBoZXdfZm5hbWUgPSBvcy5wYXRoLmpvaW4oY291c2luX2RpciwgIm5lcGhldyIrb3MuZXh0c2VwKyJweSIpCisgICAgICAgIG5lcGhld19maWxlID0gb3BlbihuZXBoZXdfZm5hbWUsICJ3IikKKyAgICAgICAgbmVwaGV3X2ZpbGUuY2xvc2UoKQorICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiICBBZGRlZCBuZXBoZXcgbW9kdWxlOiIsIG5lcGhld19mbmFtZQorCisgICAgZGVmIF9jaGVja19yZWxhdGl2ZV9pbXBvcnRzKHNlbGYsIGRlcHRoLCBydW5fbmFtZT1Ob25lKToKKyAgICAgICAgY29udGVudHMgPSByIiIiXAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBhYnNvbHV0ZV9pbXBvcnQKK2Zyb20gLiBpbXBvcnQgc2libGluZworZnJvbSAuLnVuY2xlLmNvdXNpbiBpbXBvcnQgbmVwaGV3CisiIiIKKyAgICAgICAgcGtnX2RpciwgbW9kX2ZuYW1lLCBtb2RfbmFtZSA9ICgKKyAgICAgICAgICAgICAgIHNlbGYuX21ha2VfcGtnKGNvbnRlbnRzLCBkZXB0aCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2FkZF9yZWxhdGl2ZV9tb2R1bGVzKHBrZ19kaXIsIGNvbnRlbnRzLCBkZXB0aCkKKyAgICAgICAgICAgIHBrZ19uYW1lID0gbW9kX25hbWUucnBhcnRpdGlvbignLicpWzBdCisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIHNvdXJjZToiLCBtb2RfbmFtZQorICAgICAgICAgICAgZDEgPSBydW5fbW9kdWxlKG1vZF9uYW1lLCBydW5fbmFtZT1ydW5fbmFtZSkgIyBSZWFkIGZyb20gc291cmNlCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJfX3BhY2thZ2VfXyIsIGQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxWyJfX3BhY2thZ2VfXyJdID09IHBrZ19uYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigic2libGluZyIsIGQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibmVwaGV3IiwgZDEpCisgICAgICAgICAgICBkZWwgZDEgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCisgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZF9uYW1lKQorICAgICAgICAgICAgb3MucmVtb3ZlKG1vZF9mbmFtZSkKKyAgICAgICAgICAgIGlmIG5vdCBzeXMuZG9udF93cml0ZV9ieXRlY29kZToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIGNvbXBpbGVkOiIsIG1vZF9uYW1lCisgICAgICAgICAgICAgICAgZDIgPSBydW5fbW9kdWxlKG1vZF9uYW1lLCBydW5fbmFtZT1ydW5fbmFtZSkgIyBSZWFkIGZyb20gYnl0ZWNvZGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJfX3BhY2thZ2VfXyIsIGQyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsiX19wYWNrYWdlX18iXSA9PSBwa2dfbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJzaWJsaW5nIiwgZDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigibmVwaGV3IiwgZDIpCisgICAgICAgICAgICAgICAgZGVsIGQyICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fZGVsX3BrZyhwa2dfZGlyLCBkZXB0aCwgbW9kX25hbWUpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJNb2R1bGUgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5IgorCisgICAgZGVmIHRlc3RfcnVuX21vZHVsZShzZWxmKToKKyAgICAgICAgZm9yIGRlcHRoIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlRlc3RpbmcgcGFja2FnZSBkZXB0aDoiLCBkZXB0aAorICAgICAgICAgICAgc2VsZi5fY2hlY2tfbW9kdWxlKGRlcHRoKQorCisgICAgZGVmIHRlc3RfcnVuX3BhY2thZ2Uoc2VsZik6CisgICAgICAgIGZvciBkZXB0aCBpbiByYW5nZSgxLCA0KToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJUZXN0aW5nIHBhY2thZ2UgZGVwdGg6IiwgZGVwdGgKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3BhY2thZ2UoZGVwdGgpCisKKyAgICBkZWYgdGVzdF9leHBsaWNpdF9yZWxhdGl2ZV9pbXBvcnQoc2VsZik6CisgICAgICAgIGZvciBkZXB0aCBpbiByYW5nZSgyLCA1KToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJUZXN0aW5nIHJlbGF0aXZlIGltcG9ydHMgYXQgZGVwdGg6IiwgZGVwdGgKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3JlbGF0aXZlX2ltcG9ydHMoZGVwdGgpCisKKyAgICBkZWYgdGVzdF9tYWluX3JlbGF0aXZlX2ltcG9ydChzZWxmKToKKyAgICAgICAgZm9yIGRlcHRoIGluIHJhbmdlKDIsIDUpOgorICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlRlc3RpbmcgbWFpbiByZWxhdGl2ZSBpbXBvcnRzIGF0IGRlcHRoOiIsIGRlcHRoCisgICAgICAgICAgICBzZWxmLl9jaGVja19yZWxhdGl2ZV9pbXBvcnRzKGRlcHRoLCAiX19tYWluX18iKQorCisKK2NsYXNzIFJ1blBhdGhUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJVbml0IHRlc3RzIGZvciBydW5weS5ydW5fcGF0aCIiIgorICAgICMgQmFzZWQgb24gY29ycmVzcG9uZGluZyB0ZXN0cyBpbiB0ZXN0X2NtZF9saW5lX3NjcmlwdAorCisgICAgdGVzdF9zb3VyY2UgPSAiIiJcCisjIFNjcmlwdCBtYXkgYmUgcnVuIHdpdGggb3B0aW1pc2F0aW9uIGVuYWJsZWQsIHNvIGRvbid0IHJlbHkgb24gYXNzZXJ0CisjIHN0YXRlbWVudHMgYmVpbmcgZXhlY3V0ZWQKK2RlZiBhc3NlcnRFcXVhbChsaHMsIHJocyk6CisgICAgaWYgbGhzICE9IHJoczoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJyVyICE9ICVyJyAlIChsaHMsIHJocykpCitkZWYgYXNzZXJ0SXMobGhzLCByaHMpOgorICAgIGlmIGxocyBpcyBub3QgcmhzOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcignJXIgaXMgbm90ICVyJyAlIChsaHMsIHJocykpCisjIENoZWNrIGJhc2ljIGNvZGUgZXhlY3V0aW9uCityZXN1bHQgPSBbJ1RvcCBsZXZlbCBhc3NpZ25tZW50J10KK2RlZiBmKCk6CisgICAgcmVzdWx0LmFwcGVuZCgnTG93ZXIgbGV2ZWwgcmVmZXJlbmNlJykKK2YoKQorYXNzZXJ0RXF1YWwocmVzdWx0LCBbJ1RvcCBsZXZlbCBhc3NpZ25tZW50JywgJ0xvd2VyIGxldmVsIHJlZmVyZW5jZSddKQorIyBDaGVjayB0aGUgc3lzIG1vZHVsZQoraW1wb3J0IHN5cworYXNzZXJ0SXMoZ2xvYmFscygpLCBzeXMubW9kdWxlc1tfX25hbWVfX10uX19kaWN0X18pCithcmd2MCA9IHN5cy5hcmd2WzBdCisiIiIKKworICAgIGRlZiBfbWFrZV90ZXN0X3NjcmlwdChzZWxmLCBzY3JpcHRfZGlyLCBzY3JpcHRfYmFzZW5hbWUsIHNvdXJjZT1Ob25lKToKKyAgICAgICAgaWYgc291cmNlIGlzIE5vbmU6CisgICAgICAgICAgICBzb3VyY2UgPSBzZWxmLnRlc3Rfc291cmNlCisgICAgICAgIHJldHVybiBtYWtlX3NjcmlwdChzY3JpcHRfZGlyLCBzY3JpcHRfYmFzZW5hbWUsIHNvdXJjZSkKKworICAgIGRlZiBfY2hlY2tfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBleHBlY3RlZF9uYW1lLCBleHBlY3RlZF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2FyZ3YwLCBleHBlY3RlZF9wYWNrYWdlKToKKyAgICAgICAgcmVzdWx0ID0gcnVuX3BhdGgoc2NyaXB0X25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WyJfX25hbWVfXyJdLCBleHBlY3RlZF9uYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFsiX19maWxlX18iXSwgZXhwZWN0ZWRfZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiYXJndjAiLCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WyJhcmd2MCJdLCBleHBlY3RlZF9hcmd2MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbIl9fcGFja2FnZV9fIl0sIGV4cGVjdGVkX3BhY2thZ2UpCisKKyAgICBkZWYgX2NoZWNrX2ltcG9ydF9lcnJvcihzZWxmLCBzY3JpcHRfbmFtZSwgbXNnKToKKyAgICAgICAgbXNnID0gcmUuZXNjYXBlKG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoSW1wb3J0RXJyb3IsIG1zZywgcnVuX3BhdGgsIHNjcmlwdF9uYW1lKQorCisgICAgZGVmIHRlc3RfYmFzaWNfc2NyaXB0KHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gJ3NjcmlwdCcKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc2VsZi5fbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCBtb2RfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdChzY3JpcHRfbmFtZSwgIjxydW5fcGF0aD4iLCBzY3JpcHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfbmFtZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3NjcmlwdF9jb21waWxlZChzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBtb2RfbmFtZSA9ICdzY3JpcHQnCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHNlbGYuX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgbW9kX25hbWUpCisgICAgICAgICAgICBjb21waWxlZF9uYW1lID0gY29tcGlsZV9zY3JpcHQoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBvcy5yZW1vdmUoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoY29tcGlsZWRfbmFtZSwgIjxydW5fcGF0aD4iLCBjb21waWxlZF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkX25hbWUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgbW9kX25hbWUgPSAnX19tYWluX18nCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHNlbGYuX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgbW9kX25hbWUpCisgICAgICAgICAgICBzZWxmLl9jaGVja19zY3JpcHQoc2NyaXB0X2RpciwgIjxydW5fcGF0aD4iLCBzY3JpcHRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfZGlyLCAnJykKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9jb21waWxlZChzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBtb2RfbmFtZSA9ICdfX21haW5fXycKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc2VsZi5fbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCBtb2RfbmFtZSkKKyAgICAgICAgICAgIGNvbXBpbGVkX25hbWUgPSBjb21waWxlX3NjcmlwdChzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdChzY3JpcHRfZGlyLCAiPHJ1bl9wYXRoPiIsIGNvbXBpbGVkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X2RpciwgJycpCisKKyAgICBkZWYgdGVzdF9kaXJlY3RvcnlfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgorICAgICAgICAgICAgbW9kX25hbWUgPSAnbm90X21haW4nCisgICAgICAgICAgICBzY3JpcHRfbmFtZSA9IHNlbGYuX21ha2VfdGVzdF9zY3JpcHQoc2NyaXB0X2RpciwgbW9kX25hbWUpCisgICAgICAgICAgICBtc2cgPSAiY2FuJ3QgZmluZCAnX19tYWluX18nIG1vZHVsZSBpbiAlciIgJSBzY3JpcHRfZGlyCisgICAgICAgICAgICBzZWxmLl9jaGVja19pbXBvcnRfZXJyb3Ioc2NyaXB0X2RpciwgbXNnKQorCisgICAgZGVmIHRlc3RfemlwZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBtb2RfbmFtZSA9ICdfX21haW5fXycKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc2VsZi5fbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCBtb2RfbmFtZSkKKyAgICAgICAgICAgIHppcF9uYW1lLCBmbmFtZSA9IG1ha2VfemlwX3NjcmlwdChzY3JpcHRfZGlyLCAndGVzdF96aXAnLCBzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NjcmlwdCh6aXBfbmFtZSwgIjxydW5fcGF0aD4iLCBmbmFtZSwgemlwX25hbWUsICcnKQorCisgICAgZGVmIHRlc3RfemlwZmlsZV9jb21waWxlZChzZWxmKToKKyAgICAgICAgd2l0aCB0ZW1wX2RpcigpIGFzIHNjcmlwdF9kaXI6CisgICAgICAgICAgICBtb2RfbmFtZSA9ICdfX21haW5fXycKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc2VsZi5fbWFrZV90ZXN0X3NjcmlwdChzY3JpcHRfZGlyLCBtb2RfbmFtZSkKKyAgICAgICAgICAgIGNvbXBpbGVkX25hbWUgPSBjb21waWxlX3NjcmlwdChzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIHppcF9uYW1lLCBmbmFtZSA9IG1ha2VfemlwX3NjcmlwdChzY3JpcHRfZGlyLCAndGVzdF96aXAnLCBjb21waWxlZF9uYW1lKQorICAgICAgICAgICAgc2VsZi5fY2hlY2tfc2NyaXB0KHppcF9uYW1lLCAiPHJ1bl9wYXRoPiIsIGZuYW1lLCB6aXBfbmFtZSwgJycpCisKKyAgICBkZWYgdGVzdF96aXBmaWxlX2Vycm9yKHNlbGYpOgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgc2NyaXB0X2RpcjoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gJ25vdF9tYWluJworICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBzZWxmLl9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsIG1vZF9uYW1lKQorICAgICAgICAgICAgemlwX25hbWUsIGZuYW1lID0gbWFrZV96aXBfc2NyaXB0KHNjcmlwdF9kaXIsICd0ZXN0X3ppcCcsIHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgbXNnID0gImNhbid0IGZpbmQgJ19fbWFpbl9fJyBtb2R1bGUgaW4gJXIiICUgemlwX25hbWUKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX2ltcG9ydF9lcnJvcih6aXBfbmFtZSwgbXNnKQorCisgICAgZGVmIHRlc3RfbWFpbl9yZWN1cnNpb25fZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyLCB0ZW1wX2RpcigpIGFzIGR1bW15X2RpcjoKKyAgICAgICAgICAgIG1vZF9uYW1lID0gJ19fbWFpbl9fJworICAgICAgICAgICAgc291cmNlID0gKCJpbXBvcnQgcnVucHlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAicnVucHkucnVuX3BhdGgoJXIpXG4iKSAlIGR1bW15X2RpcgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBzZWxmLl9tYWtlX3Rlc3Rfc2NyaXB0KHNjcmlwdF9kaXIsIG1vZF9uYW1lLCBzb3VyY2UpCisgICAgICAgICAgICB6aXBfbmFtZSwgZm5hbWUgPSBtYWtlX3ppcF9zY3JpcHQoc2NyaXB0X2RpciwgJ3Rlc3RfemlwJywgc2NyaXB0X25hbWUpCisgICAgICAgICAgICBtc2cgPSAicmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoUnVudGltZUVycm9yLCBtc2csIHJ1bl9wYXRoLCB6aXBfbmFtZSkKKworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoUnVuTW9kdWxlQ29kZVRlc3QsIFJ1bk1vZHVsZVRlc3QsIFJ1blBhdGhUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ydW5weS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ydW5weS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlNTJhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3J1bnB5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ydW5weS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9ydW5weS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlNTJhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3J1bnB5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zYXgucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zYXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyMGVhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NheC5weQpAQCAtMCwwICsxLDg4NyBAQAorIyByZWdyZXNzaW9uIHRlc3QgZm9yIFNBWCAyLjAgICAgICAgICAgICAtKi0gY29kaW5nOiB1dGYtOCAtKi0KKyMgJElkJAorCitmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyLCBDb250ZW50SGFuZGxlciwgXAorICAgICAgICAgICAgICAgICAgICBTQVhFeGNlcHRpb24sIFNBWFJlYWRlck5vdEF2YWlsYWJsZSwgU0FYUGFyc2VFeGNlcHRpb24KK3RyeToKKyAgICBtYWtlX3BhcnNlcigpCitleGNlcHQgU0FYUmVhZGVyTm90QXZhaWxhYmxlOgorICAgICMgZG9uJ3QgdHJ5IHRvIHRlc3QgdGhpcyBtb2R1bGUgaWYgd2UgY2Fubm90IGNyZWF0ZSBhIHBhcnNlcgorICAgIHJhaXNlIEltcG9ydEVycm9yKCJubyBYTUwgcGFyc2VycyBhdmFpbGFibGUiKQorZnJvbSB4bWwuc2F4LnNheHV0aWxzIGltcG9ydCBYTUxHZW5lcmF0b3IsIGVzY2FwZSwgdW5lc2NhcGUsIHF1b3RlYXR0ciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxGaWx0ZXJCYXNlCitmcm9tIHhtbC5zYXguZXhwYXRyZWFkZXIgaW1wb3J0IGNyZWF0ZV9wYXJzZXIKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX25hbWVzcGFjZXMKK2Zyb20geG1sLnNheC54bWxyZWFkZXIgaW1wb3J0IElucHV0U291cmNlLCBBdHRyaWJ1dGVzSW1wbCwgQXR0cmlidXRlc05TSW1wbAorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgaW8KK2ltcG9ydCBvcy5wYXRoCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CisKK1RFU1RfWE1MRklMRSA9IGZpbmRmaWxlKCJ0ZXN0LnhtbCIsIHN1YmRpcj0ieG1sdGVzdGRhdGEiKQorVEVTVF9YTUxGSUxFX09VVCA9IGZpbmRmaWxlKCJ0ZXN0LnhtbC5vdXQiLCBzdWJkaXI9InhtbHRlc3RkYXRhIikKKworc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMgPSBUcnVlCitpZiBub3Qgb3MucGF0aC5zdXBwb3J0c191bmljb2RlX2ZpbGVuYW1lczoKKyAgICB0cnk6CisgICAgICAgIHN1cHBvcnQuVEVTVEZOX1VOSUNPREUuZW5jb2RlKHN1cHBvcnQuVEVTVEZOX0VOQ09ESU5HKQorICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFVuaWNvZGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgIyBFaXRoZXIgdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nIGlzIE5vbmUsIG9yIHRoZSBmaWxlIG5hbWUKKyAgICAgICAgIyBjYW5ub3QgYmUgZW5jb2RlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcuCisgICAgICAgIHN1cHBvcnRzX3VuaWNvZGVfZmlsZW5hbWVzID0gRmFsc2UKK3JlcXVpcmVzX3VuaWNvZGVfZmlsZW5hbWVzID0gdW5pdHRlc3Quc2tpcFVubGVzcygKKyAgICAgICAgc3VwcG9ydHNfdW5pY29kZV9maWxlbmFtZXMsCisgICAgICAgICdSZXF1aXJlcyB1bmljb2RlIGZpbGVuYW1lcyBzdXBwb3J0JykKKworbnNfdXJpID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy94bWwtbnMvc2F4dGVzdC8iCisKK2NsYXNzIFhtbFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdmVyaWZ5X2VtcHR5X2F0dHJzKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldFZhbHVlLCAiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUsICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldE5hbWVCeVFOYW1lLCAiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRRTmFtZUJ5TmFtZSwgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuX19nZXRpdGVtX18sICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRMZW5ndGgoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXROYW1lcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRRTmFtZXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGF0dHJzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShhdHRycy5oYXNfa2V5KCJhdHRyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMua2V5cygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXQoImF0dHJzIiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KCJhdHRycyIsIDI1KSwgMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuaXRlbXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMudmFsdWVzKCksIFtdKQorCisgICAgZGVmIHZlcmlmeV9lbXB0eV9uc2F0dHJzKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldFZhbHVlLCAobnNfdXJpLCAiYXR0ciIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuZ2V0VmFsdWVCeVFOYW1lLCAibnM6YXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXROYW1lQnlRTmFtZSwgIm5zOmF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuZ2V0UU5hbWVCeU5hbWUsIChuc191cmksICJhdHRyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5fX2dldGl0ZW1fXywgKG5zX3VyaSwgImF0dHIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRMZW5ndGgoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXROYW1lcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRRTmFtZXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGF0dHJzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShhdHRycy5oYXNfa2V5KChuc191cmksICJhdHRyIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmtleXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KChuc191cmksICJhdHRyIikpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpLCAyNSksIDI1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLml0ZW1zKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLnZhbHVlcygpLCBbXSkKKworICAgIGRlZiB2ZXJpZnlfYXR0cnNfd2F0dHIoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldExlbmd0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldE5hbWVzKCksIFsiYXR0ciJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldFFOYW1lcygpLCBbImF0dHIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXR0cnMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXR0cnMuaGFzX2tleSgiYXR0ciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmtleXMoKSwgWyJhdHRyIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KCJhdHRyIiksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldCgiYXR0ciIsIDI1KSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuaXRlbXMoKSwgWygiYXR0ciIsICJ2YWwiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMudmFsdWVzKCksIFsidmFsIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0VmFsdWUoImF0dHIiKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0VmFsdWVCeVFOYW1lKCJhdHRyIiksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldE5hbWVCeVFOYW1lKCJhdHRyIiksICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRyc1siYXR0ciJdLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRRTmFtZUJ5TmFtZSgiYXR0ciIpLCAiYXR0ciIpCisKK2NsYXNzIE1ha2VQYXJzZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9tYWtlX3BhcnNlcjIoc2VsZik6CisgICAgICAgICMgQ3JlYXRpbmcgcGFyc2VycyBzZXZlcmFsIHRpbWVzIGluIGEgcm93IHNob3VsZCBzdWNjZWVkLgorICAgICAgICAjIFRlc3RpbmcgdGhpcyBiZWNhdXNlIHRoZXJlIGhhdmUgYmVlbiBmYWlsdXJlcyBvZiB0aGlzIGtpbmQKKyAgICAgICAgIyBiZWZvcmUuCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCisKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgICBzYXh1dGlscyB0ZXN0cworIworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgU2F4dXRpbHNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjID09PT09IGVzY2FwZQorICAgIGRlZiB0ZXN0X2VzY2FwZV9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlc2NhcGUoIkRvbmFsZCBEdWNrICYgQ28iKSwgIkRvbmFsZCBEdWNrICZhbXA7IENvIikKKworICAgIGRlZiB0ZXN0X2VzY2FwZV9hbGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXNjYXBlKCI8RG9uYWxkIER1Y2sgJiBDbz4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJmx0O0RvbmFsZCBEdWNrICZhbXA7IENvJmd0OyIpCisKKyAgICBkZWYgdGVzdF9lc2NhcGVfZXh0cmEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXNjYXBlKCJIZWkgcMOlIGRlZyIsIHsiw6UiIDogIiZhcmluZzsifSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaSBwJmFyaW5nOyBkZWciKQorCisgICAgIyA9PT09PSB1bmVzY2FwZQorICAgIGRlZiB0ZXN0X3VuZXNjYXBlX2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuZXNjYXBlKCJEb25hbGQgRHVjayAmYW1wOyBDbyIpLCAiRG9uYWxkIER1Y2sgJiBDbyIpCisKKyAgICBkZWYgdGVzdF91bmVzY2FwZV9hbGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5lc2NhcGUoIiZsdDtEb25hbGQgRHVjayAmYW1wOyBDbyZndDsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiPERvbmFsZCBEdWNrICYgQ28+IikKKworICAgIGRlZiB0ZXN0X3VuZXNjYXBlX2V4dHJhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuZXNjYXBlKCJIZWkgcMOlIGRlZyIsIHsiw6UiIDogIiZhcmluZzsifSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkhlaSBwJmFyaW5nOyBkZWciKQorCisgICAgZGVmIHRlc3RfdW5lc2NhcGVfYW1wX2V4dHJhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuZXNjYXBlKCImYW1wO2ZvbzsiLCB7IiZmb287IjogInNwbGF0In0pLCAiJmZvbzsiKQorCisgICAgIyA9PT09PSBxdW90ZWF0dHIKKyAgICBkZWYgdGVzdF9xdW90ZWF0dHJfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVvdGVhdHRyKCJEb25hbGQgRHVjayAmIENvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJEb25hbGQgRHVjayAmYW1wOyBDbyInKQorCisgICAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlYXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW90ZWF0dHIoJ0luY2x1ZGVzICJkb3VibGUiIHF1b3RlcycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdcJ0luY2x1ZGVzICJkb3VibGUiIHF1b3Rlc1wnJykKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9xdW90ZWF0dHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocXVvdGVhdHRyKCJJbmNsdWRlcyAnc2luZ2xlJyBxdW90ZXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiXCJJbmNsdWRlcyAnc2luZ2xlJyBxdW90ZXNcIiIpCisKKyAgICBkZWYgdGVzdF9zaW5nbGVfZG91YmxlX3F1b3RlYXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW90ZWF0dHIoIkluY2x1ZGVzICdzaW5nbGUnIGFuZCBcImRvdWJsZVwiIHF1b3RlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJcIkluY2x1ZGVzICdzaW5nbGUnIGFuZCAmcXVvdDtkb3VibGUmcXVvdDsgcXVvdGVzXCIiKQorCisgICAgIyA9PT09PSBtYWtlX3BhcnNlcgorICAgIGRlZiB0ZXN0X21ha2VfcGFyc2VyKHNlbGYpOgorICAgICAgICAjIENyZWF0aW5nIGEgcGFyc2VyIHNob3VsZCBzdWNjZWVkIC0gaXQgc2hvdWxkIGZhbGwgYmFjaworICAgICAgICAjIHRvIHRoZSBleHBhdHJlYWRlcgorICAgICAgICBwID0gbWFrZV9wYXJzZXIoWyd4bWwucGFyc2Vycy5ub19zdWNoX3BhcnNlciddKQorCisKKyMgPT09PT0gWE1MR2VuZXJhdG9yCisKK3N0YXJ0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz5cbicKKworY2xhc3MgWG1sZ2VuVGVzdDoKKyAgICBkZWYgdGVzdF94bWxnZW5fYmFzaWMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+PC9kb2M+IikKKworICAgIGRlZiB0ZXN0X3htbGdlbl9jb250ZW50KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIGdlbi5jaGFyYWN0ZXJzKCJodWhlaSIpCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+aHVoZWk8L2RvYz4iKQorCisgICAgZGVmIHRlc3RfeG1sZ2VuX3BpKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnByb2Nlc3NpbmdJbnN0cnVjdGlvbigidGVzdCIsICJkYXRhIikKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjw/dGVzdCBkYXRhPz48ZG9jPjwvZG9jPiIpCisKKyAgICBkZWYgdGVzdF94bWxnZW5fY29udGVudF9lc2NhcGUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZ2VuLmNoYXJhY3RlcnMoIjxodWhlaSYiKQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgc3RhcnQgKyAiPGRvYz4mbHQ7aHVoZWkmYW1wOzwvZG9jPiIpCisKKyAgICBkZWYgdGVzdF94bWxnZW5fYXR0cl9lc2NhcGUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7ImEiOiAnIid9KQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJlIiwgeyJhIjogIicifSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJlIiwgeyJhIjogIidcIiJ9KQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZSIpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiXG5cclx0In0pCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJlIikKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKworICAgICAgICAgICAgKCI8ZG9jIGE9J1wiJz48ZSBhPVwiJ1wiPjwvZT4iCisgICAgICAgICAgICAgIjxlIGE9XCInJnF1b3Q7XCI+PC9lPiIKKyAgICAgICAgICAgICAiPGUgYT1cIiYjMTA7JiMxMzsmIzk7XCI+PC9lPjwvZG9jPiIpKQorCisgICAgZGVmIHRlc3RfeG1sZ2VuX2VuY29kaW5nKHNlbGYpOgorICAgICAgICBlbmNvZGluZ3MgPSAoJ2lzby04ODU5LTE1JywgJ3V0Zi04JywKKyAgICAgICAgICAgICAgICAgICAgICd1dGYtMTZiZScsICd1dGYtMTZsZScsCisgICAgICAgICAgICAgICAgICAgICAndXRmLTMyYmUnLCAndXRmLTMybGUnKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gZW5jb2RpbmdzOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQsIGVuY29kaW5nPWVuY29kaW5nKQorCisgICAgICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7ImEiOiB1J1x1MjBhYyd9KQorICAgICAgICAgICAgZ2VuLmNoYXJhY3RlcnModSJcdTIwYWMiKQorICAgICAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCAoCisgICAgICAgICAgICAgICAgdSc8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIlcyI/PlxuJworICAgICAgICAgICAgICAgIHUnPGRvYyBhPSJcdTIwYWMiPlx1MjBhYzwvZG9jPicgJSBlbmNvZGluZworICAgICAgICAgICAgICAgICkuZW5jb2RlKGVuY29kaW5nLCAneG1sY2hhcnJlZnJlcGxhY2UnKSkKKworICAgIGRlZiB0ZXN0X3htbGdlbl91bmVuY29kYWJsZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCwgZW5jb2Rpbmc9J2FzY2lpJykKKworICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHsiYSI6IHUnXHUyMGFjJ30pCisgICAgICAgIGdlbi5jaGFyYWN0ZXJzKHUiXHUyMGFjIikKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYXNjaWkiPz5cbicKKyAgICAgICAgICAgICAgICAnPGRvYyBhPSImIzgzNjQ7Ij4mIzgzNjQ7PC9kb2M+JykKKworICAgIGRlZiB0ZXN0X3htbGdlbl9pZ25vcmFibGUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZ2VuLmlnbm9yYWJsZVdoaXRlc3BhY2UoIiAiKQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArICI8ZG9jPiA8L2RvYz4iKQorCisgICAgZGVmIHRlc3RfeG1sZ2VuX25zKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0UHJlZml4TWFwcGluZygibnMxIiwgbnNfdXJpKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50TlMoKG5zX3VyaSwgImRvYyIpLCAibnMxOmRvYyIsIHt9KQorICAgICAgICAjIGFkZCBhbiB1bnF1YWxpZmllZCBuYW1lCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygoTm9uZSwgInVkb2MiKSwgTm9uZSwge30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKE5vbmUsICJ1ZG9jIiksIE5vbmUpCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKG5zX3VyaSwgImRvYyIpLCAibnMxOmRvYyIpCisgICAgICAgIGdlbi5lbmRQcmVmaXhNYXBwaW5nKCJuczEiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgXAorICAgICAgICAgICAoJzxuczE6ZG9jIHhtbG5zOm5zMT0iJXMiPjx1ZG9jPjwvdWRvYz48L25zMTpkb2M+JyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zX3VyaSkpCisKKyAgICBkZWYgdGVzdF8xNDYzMDI2XzEoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50TlMoKE5vbmUsICdhJyksICdhJywgeyhOb25lLCAnYicpOidjJ30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKE5vbmUsICdhJyksICdhJykKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCsnPGEgYj0iYyI+PC9hPicpCisKKyAgICBkZWYgdGVzdF8xNDYzMDI2XzIoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRQcmVmaXhNYXBwaW5nKE5vbmUsICdxdXgnKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50TlMoKCdxdXgnLCAnYScpLCAnYScsIHt9KQorICAgICAgICBnZW4uZW5kRWxlbWVudE5TKCgncXV4JywgJ2EnKSwgJ2EnKQorICAgICAgICBnZW4uZW5kUHJlZml4TWFwcGluZyhOb25lKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0Kyc8YSB4bWxucz0icXV4Ij48L2E+JykKKworICAgIGRlZiB0ZXN0XzE0NjMwMjZfMyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydFByZWZpeE1hcHBpbmcoJ215JywgJ3F1eCcpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygoJ3F1eCcsICdhJyksICdhJywgeyhOb25lLCAnYicpOidjJ30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKCdxdXgnLCAnYScpLCAnYScpCisgICAgICAgIGdlbi5lbmRQcmVmaXhNYXBwaW5nKCdteScpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgIHN0YXJ0Kyc8bXk6YSB4bWxuczpteT0icXV4IiBiPSJjIj48L215OmE+JykKKworICAgIGRlZiB0ZXN0XzUwMjdfMShzZWxmKToKKyAgICAgICAgIyBUaGUgeG1sIHByZWZpeCAoYXMgaW4geG1sOmxhbmcgYmVsb3cpIGlzIHJlc2VydmVkIGFuZCBib3VuZCBieQorICAgICAgICAjIGRlZmluaXRpb24gdG8gaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlLiAgWE1MR2VuZXJhdG9yIGhhZAorICAgICAgICAjIGEgYnVnIHdoZXJlYnkgYSBLZXlFcnJvciBpcyByYWlzZWQgYmVjYXVzZSB0aGlzIG5hbWVzcGFjZSBpcyBtaXNzaW5nCisgICAgICAgICMgZnJvbSBhIGRpY3Rpb25hcnkuCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIHRlc3QgZGVtb25zdHJhdGVzIHRoZSBidWcgYnkgcGFyc2luZyBhIGRvY3VtZW50LgorICAgICAgICB0ZXN0X3htbCA9IFN0cmluZ0lPKAorICAgICAgICAgICAgJzw/eG1sIHZlcnNpb249IjEuMCI/PicKKyAgICAgICAgICAgICc8YTpnMSB4bWxuczphPSJodHRwOi8vZXhhbXBsZS5jb20vbnMiPicKKyAgICAgICAgICAgICAnPGE6ZzIgeG1sOmxhbmc9ImVuIj5IZWxsbzwvYTpnMj4nCisgICAgICAgICAgICAnPC9hOmcxPicpCisKKyAgICAgICAgcGFyc2VyID0gbWFrZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0RmVhdHVyZShmZWF0dXJlX25hbWVzcGFjZXMsIFRydWUpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuaW9jbGFzcygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnZW4pCisgICAgICAgIHBhcnNlci5wYXJzZSh0ZXN0X3htbCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICsgKAorICAgICAgICAgICAgICAgICAgICAgICAgICc8YTpnMSB4bWxuczphPSJodHRwOi8vZXhhbXBsZS5jb20vbnMiPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJzxhOmcyIHhtbDpsYW5nPSJlbiI+SGVsbG88L2E6ZzI+JworICAgICAgICAgICAgICAgICAgICAgICAgICc8L2E6ZzE+JykpCisKKyAgICBkZWYgdGVzdF81MDI3XzIoc2VsZik6CisgICAgICAgICMgVGhlIHhtbCBwcmVmaXggKGFzIGluIHhtbDpsYW5nIGJlbG93KSBpcyByZXNlcnZlZCBhbmQgYm91bmQgYnkKKyAgICAgICAgIyBkZWZpbml0aW9uIHRvIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS4gIFhNTEdlbmVyYXRvciBoYWQKKyAgICAgICAgIyBhIGJ1ZyB3aGVyZWJ5IGEgS2V5RXJyb3IgaXMgcmFpc2VkIGJlY2F1c2UgdGhpcyBuYW1lc3BhY2UgaXMgbWlzc2luZworICAgICAgICAjIGZyb20gYSBkaWN0aW9uYXJ5LgorICAgICAgICAjCisgICAgICAgICMgVGhpcyB0ZXN0IGRlbW9uc3RyYXRlcyB0aGUgYnVnIGJ5IGRpcmVjdCBtYW5pcHVsYXRpb24gb2YgdGhlCisgICAgICAgICMgWE1MR2VuZXJhdG9yLgorICAgICAgICByZXN1bHQgPSBzZWxmLmlvY2xhc3MoKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0UHJlZml4TWFwcGluZygnYScsICdodHRwOi8vZXhhbXBsZS5jb20vbnMnKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50TlMoKCdodHRwOi8vZXhhbXBsZS5jb20vbnMnLCAnZzEnKSwgJ2cxJywge30pCisgICAgICAgIGxhbmdfYXR0ciA9IHsoJ2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZScsICdsYW5nJyk6ICdlbid9CisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygoJ2h0dHA6Ly9leGFtcGxlLmNvbS9ucycsICdnMicpLCAnZzInLCBsYW5nX2F0dHIpCisgICAgICAgIGdlbi5jaGFyYWN0ZXJzKCdIZWxsbycpCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKCdodHRwOi8vZXhhbXBsZS5jb20vbnMnLCAnZzInKSwgJ2cyJykKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnROUygoJ2h0dHA6Ly9leGFtcGxlLmNvbS9ucycsICdnMScpLCAnZzEnKQorICAgICAgICBnZW4uZW5kUHJlZml4TWFwcGluZygnYScpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCArICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAnPGE6ZzEgeG1sbnM6YT0iaHR0cDovL2V4YW1wbGUuY29tL25zIj4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICc8YTpnMiB4bWw6bGFuZz0iZW4iPkhlbGxvPC9hOmcyPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAnPC9hOmcxPicpKQorCisgICAgZGVmIHRlc3Rfbm9fY2xvc2VfZmlsZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZGVmIGZ1bmMob3V0KToKKyAgICAgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihvdXQpCisgICAgICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZnVuYyhyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0LmNsb3NlZCkKKworICAgIGRlZiB0ZXN0X3htbGdlbl9mcmFnbWVudChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5pb2NsYXNzKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICAjIERvbid0IGNhbGwgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJmb28iLCB7ImEiOiAiMS4wIn0pCisgICAgICAgIGdlbi5jaGFyYWN0ZXJzKCJIZWxsbyIpCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJmb28iKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJiYXIiLCB7ImIiOiAiMi4wIn0pCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJiYXIiKQorICAgICAgICAjIERvbid0IGNhbGwgZ2VuLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICc8Zm9vIGE9IjEuMCI+SGVsbG88L2Zvbz48YmFyIGI9IjIuMCI+PC9iYXI+JykKKworY2xhc3MgU3RyaW5nWG1sZ2VuVGVzdChYbWxnZW5UZXN0LCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaW9jbGFzcyA9IFN0cmluZ0lPCisKK2NsYXNzIEJ5dGVzSU9YbWxnZW5UZXN0KFhtbGdlblRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBpb2NsYXNzID0gaW8uQnl0ZXNJTworCitjbGFzcyBXcml0ZXJYbWxnZW5UZXN0KFhtbGdlblRlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBjbGFzcyBpb2NsYXNzKGxpc3QpOgorICAgICAgICB3cml0ZSA9IGxpc3QuYXBwZW5kCisgICAgICAgIGNsb3NlZCA9IEZhbHNlCisKKyAgICAgICAgZGVmIGdldHZhbHVlKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIGInJy5qb2luKHNlbGYpCisKKworY2xhc3MgWE1MRmlsdGVyQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2ZpbHRlcl9iYXNpYyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgICAgICBmaWx0ZXIgPSBYTUxGaWx0ZXJCYXNlKCkKKyAgICAgICAgZmlsdGVyLnNldENvbnRlbnRIYW5kbGVyKGdlbikKKworICAgICAgICBmaWx0ZXIuc3RhcnREb2N1bWVudCgpCisgICAgICAgIGZpbHRlci5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQorICAgICAgICBmaWx0ZXIuY2hhcmFjdGVycygiY29udGVudCIpCisgICAgICAgIGZpbHRlci5pZ25vcmFibGVXaGl0ZXNwYWNlKCIgIikKKyAgICAgICAgZmlsdGVyLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIGZpbHRlci5lbmREb2N1bWVudCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPGRvYz5jb250ZW50IDwvZG9jPiIpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgZXhwYXRyZWFkZXIgdGVzdHMKKyMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3htbF90ZXN0X291dCA9IG9wZW4oVEVTVF9YTUxGSUxFX09VVCkucmVhZCgpCisKK2NsYXNzIEV4cGF0UmVhZGVyVGVzdChYbWxUZXN0QmFzZSk6CisKKyAgICAjID09PT09IFhNTFJlYWRlciBzdXBwb3J0CisKKyAgICBkZWYgdGVzdF9leHBhdF9maWxlKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIHBhcnNlci5wYXJzZShvcGVuKFRFU1RfWE1MRklMRSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQorCisgICAgQHJlcXVpcmVzX3VuaWNvZGVfZmlsZW5hbWVzCisgICAgZGVmIHRlc3RfZXhwYXRfZmlsZV91bmljb2RlKHNlbGYpOgorICAgICAgICBmbmFtZSA9IHN1cHBvcnQuVEVTVEZOX1VOSUNPREUKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlKFRFU1RfWE1MRklMRSwgZm5hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZm5hbWUpCisKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2Uob3BlbihmbmFtZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQorCisgICAgIyA9PT09PSBEVERIYW5kbGVyIHN1cHBvcnQKKworICAgIGNsYXNzIFRlc3REVERIYW5kbGVyOgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX25vdGF0aW9ucyA9IFtdCisgICAgICAgICAgICBzZWxmLl9lbnRpdGllcyAgPSBbXQorCisgICAgICAgIGRlZiBub3RhdGlvbkRlY2woc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKKyAgICAgICAgICAgIHNlbGYuX25vdGF0aW9ucy5hcHBlbmQoKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkpCisKKyAgICAgICAgZGVmIHVucGFyc2VkRW50aXR5RGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKToKKyAgICAgICAgICAgIHNlbGYuX2VudGl0aWVzLmFwcGVuZCgobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuZGF0YSkpCisKKyAgICBkZWYgdGVzdF9leHBhdF9kdGRoYW5kbGVyKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuVGVzdERUREhhbmRsZXIoKQorICAgICAgICBwYXJzZXIuc2V0RFRESGFuZGxlcihoYW5kbGVyKQorCisgICAgICAgIHBhcnNlci5mZWVkKCc8IURPQ1RZUEUgZG9jIFtcbicpCisgICAgICAgIHBhcnNlci5mZWVkKCcgIDwhRU5USVRZIGltZyBTWVNURU0gImV4cGF0LmdpZiIgTkRBVEEgR0lGPlxuJykKKyAgICAgICAgcGFyc2VyLmZlZWQoJyAgPCFOT1RBVElPTiBHSUYgUFVCTElDICItLy9Db21wdVNlcnZlLy9OT1RBVElPTiBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQgODlhLy9FTiI+XG4nKQorICAgICAgICBwYXJzZXIuZmVlZCgnXT5cbicpCisgICAgICAgIHBhcnNlci5mZWVkKCc8ZG9jPjwvZG9jPicpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLl9ub3RhdGlvbnMsCisgICAgICAgICAgICBbKCJHSUYiLCAiLS8vQ29tcHVTZXJ2ZS8vTk9UQVRJT04gR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0IDg5YS8vRU4iLCBOb25lKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlci5fZW50aXRpZXMsIFsoImltZyIsIE5vbmUsICJleHBhdC5naWYiLCAiR0lGIildKQorCisgICAgIyA9PT09PSBFbnRpdHlSZXNvbHZlciBzdXBwb3J0CisKKyAgICBjbGFzcyBUZXN0RW50aXR5UmVzb2x2ZXI6CisKKyAgICAgICAgZGVmIHJlc29sdmVFbnRpdHkoc2VsZiwgcHVibGljSWQsIHN5c3RlbUlkKToKKyAgICAgICAgICAgIGlucHNyYyA9IElucHV0U291cmNlKCkKKyAgICAgICAgICAgIGlucHNyYy5zZXRCeXRlU3RyZWFtKFN0cmluZ0lPKCI8ZW50aXR5Lz4iKSkKKyAgICAgICAgICAgIHJldHVybiBpbnBzcmMKKworICAgIGRlZiB0ZXN0X2V4cGF0X2VudGl0eXJlc29sdmVyKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKHNlbGYuVGVzdEVudGl0eVJlc29sdmVyKCkpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKFhNTEdlbmVyYXRvcihyZXN1bHQpKQorCisgICAgICAgIHBhcnNlci5mZWVkKCc8IURPQ1RZUEUgZG9jIFtcbicpCisgICAgICAgIHBhcnNlci5mZWVkKCcgIDwhRU5USVRZIHRlc3QgU1lTVEVNICJ3aGF0ZXZlciI+XG4nKQorICAgICAgICBwYXJzZXIuZmVlZCgnXT5cbicpCisgICAgICAgIHBhcnNlci5mZWVkKCc8ZG9jPiZ0ZXN0OzwvZG9jPicpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKworICAgICAgICAgICAgICAgICAgICAgICAgICI8ZG9jPjxlbnRpdHk+PC9lbnRpdHk+PC9kb2M+IikKKworICAgICMgPT09PT0gQXR0cmlidXRlcyBzdXBwb3J0CisKKyAgICBjbGFzcyBBdHRyR2F0aGVyZXIoQ29udGVudEhhbmRsZXIpOgorCisgICAgICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycworCisgICAgICAgIGRlZiBzdGFydEVsZW1lbnROUyhzZWxmLCBuYW1lLCBxbmFtZSwgYXR0cnMpOgorICAgICAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycworCisgICAgZGVmIHRlc3RfZXhwYXRfYXR0cnNfZW1wdHkoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBnYXRoZXIgPSBzZWxmLkF0dHJHYXRoZXJlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2MvPiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi52ZXJpZnlfZW1wdHlfYXR0cnMoZ2F0aGVyLl9hdHRycykKKworICAgIGRlZiB0ZXN0X2V4cGF0X2F0dHJzX3dhdHRyKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgZ2F0aGVyID0gc2VsZi5BdHRyR2F0aGVyZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoZ2F0aGVyKQorCisgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jIGF0dHI9J3ZhbCcvPiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi52ZXJpZnlfYXR0cnNfd2F0dHIoZ2F0aGVyLl9hdHRycykKKworICAgIGRlZiB0ZXN0X2V4cGF0X25zYXR0cnNfZW1wdHkoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoMSkKKyAgICAgICAgZ2F0aGVyID0gc2VsZi5BdHRyR2F0aGVyZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoZ2F0aGVyKQorCisgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jLz4iKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorCisgICAgICAgIHNlbGYudmVyaWZ5X2VtcHR5X25zYXR0cnMoZ2F0aGVyLl9hdHRycykKKworICAgIGRlZiB0ZXN0X2V4cGF0X25zYXR0cnNfd2F0dHIoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoMSkKKyAgICAgICAgZ2F0aGVyID0gc2VsZi5BdHRyR2F0aGVyZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoZ2F0aGVyKQorCisgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jIHhtbG5zOm5zPSclcycgbnM6YXR0cj0ndmFsJy8+IiAlIG5zX3VyaSkKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBhdHRycyA9IGdhdGhlci5fYXR0cnMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldExlbmd0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldE5hbWVzKCksIFsobnNfdXJpLCAiYXR0ciIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhdHRycy5nZXRRTmFtZXMoKSA9PSBbXSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFsibnM6YXR0ciJdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXR0cnMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXR0cnMuaGFzX2tleSgobnNfdXJpLCAiYXR0ciIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpLCAyNSksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLml0ZW1zKCksIFsoKG5zX3VyaSwgImF0dHIiKSwgInZhbCIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy52YWx1ZXMoKSwgWyJ2YWwiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRWYWx1ZSgobnNfdXJpLCAiYXR0ciIpKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnNbKG5zX3VyaSwgImF0dHIiKV0sICJ2YWwiKQorCisgICAgIyA9PT09PSBJbnB1dFNvdXJjZSBzdXBwb3J0CisKKyAgICBkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2VfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKFRFU1RfWE1MRklMRSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCB4bWxfdGVzdF9vdXQpCisKKyAgICBkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2Vfc3lzaWQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKElucHV0U291cmNlKFRFU1RfWE1MRklMRSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQorCisgICAgQHJlcXVpcmVzX3VuaWNvZGVfZmlsZW5hbWVzCisgICAgZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX3N5c2lkX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGZuYW1lID0gc3VwcG9ydC5URVNURk5fVU5JQ09ERQorICAgICAgICBzaHV0aWwuY29weWZpbGUoVEVTVF9YTUxGSUxFLCBmbmFtZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN1cHBvcnQudW5saW5rLCBmbmFtZSkKKworICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIHBhcnNlci5wYXJzZShJbnB1dFNvdXJjZShmbmFtZSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQorCisgICAgZGVmIHRlc3RfZXhwYXRfaW5wc291cmNlX3N0cmVhbShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBpbnBzcmMgPSBJbnB1dFNvdXJjZSgpCisgICAgICAgIGlucHNyYy5zZXRCeXRlU3RyZWFtKG9wZW4oVEVTVF9YTUxGSUxFKSkKKyAgICAgICAgcGFyc2VyLnBhcnNlKGlucHNyYykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCB4bWxfdGVzdF9vdXQpCisKKyAgICAjID09PT09IEluY3JlbWVudGFsUGFyc2VyIHN1cHBvcnQKKworICAgIGRlZiB0ZXN0X2V4cGF0X2luY3JlbWVudGFsKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorCisgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jPiIpCisgICAgICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+PC9kb2M+IikKKworICAgIGRlZiB0ZXN0X2V4cGF0X2luY3JlbWVudGFsX3Jlc2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorCisgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jPiIpCisgICAgICAgIHBhcnNlci5mZWVkKCJ0ZXh0IikKKworICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIHBhcnNlci5yZXNldCgpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKKyAgICAgICAgcGFyc2VyLmZlZWQoInRleHQiKQorICAgICAgICBwYXJzZXIuZmVlZCgiPC9kb2M+IikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArICI8ZG9jPnRleHQ8L2RvYz4iKQorCisgICAgIyA9PT09PSBMb2NhdG9yIHN1cHBvcnQKKworICAgIGRlZiB0ZXN0X2V4cGF0X2xvY2F0b3Jfbm9pbmZvKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorCisgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jPiIpCisgICAgICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldFN5c3RlbUlkKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldFB1YmxpY0lkKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldExpbmVOdW1iZXIoKSwgMSkKKworICAgIGRlZiB0ZXN0X2V4cGF0X2xvY2F0b3Jfd2l0aGluZm8oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIHBhcnNlci5wYXJzZShURVNUX1hNTEZJTEUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZXIuZ2V0U3lzdGVtSWQoKSwgVEVTVF9YTUxGSUxFKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5nZXRQdWJsaWNJZCgpLCBOb25lKQorCisgICAgQHJlcXVpcmVzX3VuaWNvZGVfZmlsZW5hbWVzCisgICAgZGVmIHRlc3RfZXhwYXRfbG9jYXRvcl93aXRoaW5mb191bmljb2RlKHNlbGYpOgorICAgICAgICBmbmFtZSA9IHN1cHBvcnQuVEVTVEZOX1VOSUNPREUKKyAgICAgICAgc2h1dGlsLmNvcHlmaWxlKFRFU1RfWE1MRklMRSwgZm5hbWUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzdXBwb3J0LnVubGluaywgZm5hbWUpCisKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKGZuYW1lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2VyLmdldFN5c3RlbUlkKCksIGZuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlci5nZXRQdWJsaWNJZCgpLCBOb25lKQorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgZXJyb3IgcmVwb3J0aW5nCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBFcnJvclJlcG9ydGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9sb2NhdGlvbihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlcigpKSAjIGRvIG5vdGhpbmcKKyAgICAgICAgc291cmNlID0gSW5wdXRTb3VyY2UoKQorICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShTdHJpbmdJTygiPGZvbyBiYXIgZm9vYmFyPiIpKSAgICNpbGwtZm9ybWVkCisgICAgICAgIG5hbWUgPSAiYSBmaWxlIG5hbWUiCisgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFNBWEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5nZXRTeXN0ZW1JZCgpLCBuYW1lKQorCisgICAgZGVmIHRlc3RfZXhwYXRfaW5jb21wbGV0ZShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlcigpKSAjIGRvIG5vdGhpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU0FYUGFyc2VFeGNlcHRpb24sIHBhcnNlci5wYXJzZSwgU3RyaW5nSU8oIjxmb28+IikpCisKKyAgICBkZWYgdGVzdF9zYXhfcGFyc2VfZXhjZXB0aW9uX3N0cihzZWxmKToKKyAgICAgICAgIyBwYXNzIHZhcmlvdXMgdmFsdWVzIGZyb20gYSBsb2NhdG9yIHRvIHRoZSBTQVhQYXJzZUV4Y2VwdGlvbiB0bworICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IHRoZSBfX3N0cl9fKCkgZG9lc24ndCBmYWxsIGFwYXJ0IHdoZW4gTm9uZSBpcworICAgICAgICAjIHBhc3NlZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIgbGluZSBhbmQgY29sdW1uIG51bWJlcgorICAgICAgICAjCisgICAgICAgICMgdXNlICJub3JtYWwiIHZhbHVlcyBmb3IgdGhlIGxvY2F0b3I6CisgICAgICAgIHN0cihTQVhQYXJzZUV4Y2VwdGlvbigibWVzc2FnZSIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkR1bW15TG9jYXRvcigxLCAxKSkpCisgICAgICAgICMgdXNlIE5vbmUgZm9yIHRoZSBsaW5lIG51bWJlcjoKKyAgICAgICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRHVtbXlMb2NhdG9yKE5vbmUsIDEpKSkKKyAgICAgICAgIyB1c2UgTm9uZSBmb3IgdGhlIGNvbHVtbiBudW1iZXI6CisgICAgICAgIHN0cihTQVhQYXJzZUV4Y2VwdGlvbigibWVzc2FnZSIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkR1bW15TG9jYXRvcigxLCBOb25lKSkpCisgICAgICAgICMgdXNlIE5vbmUgZm9yIGJvdGg6CisgICAgICAgIHN0cihTQVhQYXJzZUV4Y2VwdGlvbigibWVzc2FnZSIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLkR1bW15TG9jYXRvcihOb25lLCBOb25lKSkpCisKKyAgICBjbGFzcyBEdW1teUxvY2F0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm8sIGNvbG5vKToKKyAgICAgICAgICAgIHNlbGYuX2xpbmVubyA9IGxpbmVubworICAgICAgICAgICAgc2VsZi5fY29sbm8gPSBjb2xubworCisgICAgICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiAicHViaWQiCisKKyAgICAgICAgZGVmIGdldFN5c3RlbUlkKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICJzeXNpZCIKKworICAgICAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9saW5lbm8KKworICAgICAgICBkZWYgZ2V0Q29sdW1uTnVtYmVyKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG5vCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjICAgeG1scmVhZGVyIHRlc3RzCisjCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBYbWxSZWFkZXJUZXN0KFhtbFRlc3RCYXNlKToKKworICAgICMgPT09PT0gQXR0cmlidXRlc0ltcGwKKyAgICBkZWYgdGVzdF9hdHRyc19lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi52ZXJpZnlfZW1wdHlfYXR0cnMoQXR0cmlidXRlc0ltcGwoe30pKQorCisgICAgZGVmIHRlc3RfYXR0cnNfd2F0dHIoc2VsZik6CisgICAgICAgIHNlbGYudmVyaWZ5X2F0dHJzX3dhdHRyKEF0dHJpYnV0ZXNJbXBsKHsiYXR0ciIgOiAidmFsIn0pKQorCisgICAgZGVmIHRlc3RfbnNhdHRyc19lbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi52ZXJpZnlfZW1wdHlfbnNhdHRycyhBdHRyaWJ1dGVzTlNJbXBsKHt9LCB7fSkpCisKKyAgICBkZWYgdGVzdF9uc2F0dHJzX3dhdHRyKHNlbGYpOgorICAgICAgICBhdHRycyA9IEF0dHJpYnV0ZXNOU0ltcGwoeyhuc191cmksICJhdHRyIikgOiAidmFsIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KG5zX3VyaSwgImF0dHIiKSA6ICJuczphdHRyIn0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRMZW5ndGgoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXROYW1lcygpLCBbKG5zX3VyaSwgImF0dHIiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0UU5hbWVzKCksIFsibnM6YXR0ciJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhdHRycyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhdHRycy5oYXNfa2V5KChuc191cmksICJhdHRyIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmtleXMoKSwgWyhuc191cmksICJhdHRyIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0KChuc191cmksICJhdHRyIiksIDI1KSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuaXRlbXMoKSwgWygobnNfdXJpLCAiYXR0ciIpLCAidmFsIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLnZhbHVlcygpLCBbInZhbCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF0dHJzLmdldFZhbHVlKChuc191cmksICJhdHRyIikpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRycy5nZXRWYWx1ZUJ5UU5hbWUoIm5zOmF0dHIiKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoIm5zOmF0dHIiKSwgKG5zX3VyaSwgImF0dHIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdHRyc1sobnNfdXJpLCAiYXR0ciIpXSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXR0cnMuZ2V0UU5hbWVCeU5hbWUoKG5zX3VyaSwgImF0dHIiKSksICJuczphdHRyIikKKworCisgICAgIyBEdXJpbmcgdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiAyLjUsIGFuIGF0dGVtcHQgdG8gbW92ZSB0aGUgInhtbCIKKyAgICAjIHBhY2thZ2UgaW1wbGVtZW50YXRpb24gdG8gYSBuZXcgcGFja2FnZSAoInhtbGNvcmUiKSBwcm92ZWQgcGFpbmZ1bC4KKyAgICAjIFRoZSBnb2FsIG9mIHRoaXMgY2hhbmdlIHdhcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gYmUgYWJsZSB0bworICAgICMgb2J0YWluIGFuZCByZWx5IG9uIGJlaGF2aW9yIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisgICAgIyBvZiB0aGUgWE1MIHN1cHBvcnQgd2l0aG91dCBuZWVkaW5nIHRvIGJlIGNvbmNlcm5lZCBhYm91dCB0aGUKKyAgICAjIGF2YWlsYWJpbGl0eSBvZiB0aGUgUHlYTUwgaW1wbGVtZW50YXRpb24uCisgICAgIworICAgICMgV2hpbGUgdGhlIGV4aXN0aW5nIGltcG9ydCBoYWNrZXJ5IGluIExpYi94bWwvX19pbml0X18ucHkgY2FuIGNhdXNlCisgICAgIyBQeVhNTCdzIF94bWxwdXMgcGFja2FnZSB0byBzdXBwbGFudCB0aGUgInhtbCIgcGFja2FnZSwgdGhhdCBvbmx5CisgICAgIyB3b3JrcyBiZWNhdXNlIGVpdGhlciBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAieG1sIiBwYWNrYWdlIG5hbWUgZm9yCisgICAgIyBpbXBvcnRzLgorICAgICMKKyAgICAjIFRoZSBtb3ZlIHJlc3VsdGVkIGluIGEgbnVtYmVyIG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdAorICAgICMgdGhlIGltcG9ydCBtYWNoaW5lcnkncyAicGFja2FnZSBjb250ZXh0IiBpcyBiYXNlZCBvbiB0aGUgbmFtZSB0aGF0J3MKKyAgICAjIGJlaW5nIGltcG9ydGVkIHJhdGhlciB0aGFuIHRoZSBfX25hbWVfXyBvZiB0aGUgYWN0dWFsIHBhY2thZ2UKKyAgICAjIGNvbnRhaW5tZW50OyBpdCB3YXNuJ3QgcG9zc2libGUgZm9yIHRoZSAieG1sIiBwYWNrYWdlIHRvIGJlIHJlcGxhY2VkCisgICAgIyBieSBhIHNpbXBsZSBtb2R1bGUgdGhhdCBpbmRpcmVjdGVkIGltcG9ydHMgdG8gdGhlICJ4bWxjb3JlIiBwYWNrYWdlLgorICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGV4ZXJjaXNlZCBidWdzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIHRoYXQKKyAgICAjIGF0dGVtcHQuICBLZWVwaW5nIHRoZXNlIHRlc3RzIGFyb3VuZCB3aWxsIGhlbHAgZGV0ZWN0IHByb2JsZW1zIHdpdGgKKyAgICAjIG90aGVyIGF0dGVtcHRzIHRvIHByb3ZpZGUgcmVsaWFibGUgYWNjZXNzIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5J3MKKyAgICAjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgc3VwcG9ydC4KKworICAgIGRlZiB0ZXN0X3NmXzE1MTE0OTcoc2VsZik6CisgICAgICAgICMgQnVnIHJlcG9ydDogaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE1MTE0OTcKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBvbGRfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmNvcHkoKQorICAgICAgICBmb3IgbW9kbmFtZSBpbiBzeXMubW9kdWxlcy5rZXlzKCk6CisgICAgICAgICAgICBpZiBtb2RuYW1lLnN0YXJ0c3dpdGgoInhtbC4iKToKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHhtbC5zYXguZXhwYXRyZWFkZXIKKyAgICAgICAgICAgIG1vZHVsZSA9IHhtbC5zYXguZXhwYXRyZWFkZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kdWxlLl9fbmFtZV9fLCAieG1sLnNheC5leHBhdHJlYWRlciIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMubW9kdWxlcy51cGRhdGUob2xkX21vZHVsZXMpCisKKyAgICBkZWYgdGVzdF9zZl8xNTEzNjExKHNlbGYpOgorICAgICAgICAjIEJ1ZyByZXBvcnQ6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi8xNTEzNjExCisgICAgICAgIHNpbyA9IFN0cmluZ0lPKCJpbnZhbGlkIikKKyAgICAgICAgcGFyc2VyID0gbWFrZV9wYXJzZXIoKQorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IFNBWFBhcnNlRXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFNBWFBhcnNlRXhjZXB0aW9uLCBwYXJzZXIucGFyc2UsIHNpbykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KE1ha2VQYXJzZXJUZXN0LAorICAgICAgICAgICAgICAgICBTYXh1dGlsc1Rlc3QsCisgICAgICAgICAgICAgICAgIFN0cmluZ1htbGdlblRlc3QsCisgICAgICAgICAgICAgICAgIEJ5dGVzSU9YbWxnZW5UZXN0LAorICAgICAgICAgICAgICAgICBXcml0ZXJYbWxnZW5UZXN0LAorICAgICAgICAgICAgICAgICBFeHBhdFJlYWRlclRlc3QsCisgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0aW5nVGVzdCwKKyAgICAgICAgICAgICAgICAgWG1sUmVhZGVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2F4LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NheC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3YTNkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NheC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2F4LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NheC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3YTNkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NheC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY29wZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU4M2UxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHkKQEAgLTAsMCArMSw2NjQgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgY2hlY2tfc3ludGF4X2Vycm9yLCBjaGVja19weTNrX3dhcm5pbmdzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja193YXJuaW5ncywgcnVuX3VuaXR0ZXN0CisKKworY2xhc3MgU2NvcGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdFNpbXBsZU5lc3Rpbmcoc2VsZik6CisKKyAgICAgICAgZGVmIG1ha2VfYWRkZXIoeCk6CisgICAgICAgICAgICBkZWYgYWRkZXIoeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB5CisgICAgICAgICAgICByZXR1cm4gYWRkZXIKKworICAgICAgICBpbmMgPSBtYWtlX2FkZGVyKDEpCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXIoMTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKKworICAgIGRlZiB0ZXN0RXh0cmFOZXN0aW5nKHNlbGYpOgorCisgICAgICAgIGRlZiBtYWtlX2FkZGVyMih4KToKKyAgICAgICAgICAgIGRlZiBleHRyYSgpOiAjIGNoZWNrIGZyZWV2YXJzIHBhc3NpbmcgdGhyb3VnaCBub24tdXNlIHNjb3BlcworICAgICAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB5CisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZGVyCisgICAgICAgICAgICByZXR1cm4gZXh0cmEoKQorCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXIyKDEpCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXIyKDEwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDEpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBsdXMxMCgtMiksIDgpCisKKyAgICBkZWYgdGVzdFNpbXBsZUFuZFJlYmluZGluZyhzZWxmKToKKworICAgICAgICBkZWYgbWFrZV9hZGRlcjMoeCk6CisgICAgICAgICAgICBkZWYgYWRkZXIoeSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB5CisgICAgICAgICAgICB4ID0geCArIDEgIyBjaGVjayB0cmFja2luZyBvZiBhc3NpZ25tZW50IHRvIHggaW4gZGVmaW5pbmcgc2NvcGUKKyAgICAgICAgICAgIHJldHVybiBhZGRlcgorCisgICAgICAgIGluYyA9IG1ha2VfYWRkZXIzKDApCisgICAgICAgIHBsdXMxMCA9IG1ha2VfYWRkZXIzKDkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKKworICAgIGRlZiB0ZXN0TmVzdGluZ0dsb2JhbE5vRnJlZShzZWxmKToKKworICAgICAgICBkZWYgbWFrZV9hZGRlcjQoKTogIyBYWFggYWRkIGV4dGEgbGV2ZWwgb2YgaW5kaXJlY3Rpb24KKyAgICAgICAgICAgIGRlZiBuZXN0KCk6CisgICAgICAgICAgICAgICAgZGVmIG5lc3QoKToKKyAgICAgICAgICAgICAgICAgICAgZGVmIGFkZGVyKHkpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbF94ICsgeSAjIGNoZWNrIHRoYXQgcGxhaW4gb2xkIGdsb2JhbHMgd29yaworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWRkZXIKKyAgICAgICAgICAgICAgICByZXR1cm4gbmVzdCgpCisgICAgICAgICAgICByZXR1cm4gbmVzdCgpCisKKyAgICAgICAgZ2xvYmFsX3ggPSAxCisgICAgICAgIGFkZGVyID0gbWFrZV9hZGRlcjQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkZGVyKDEpLCAyKQorCisgICAgICAgIGdsb2JhbF94ID0gMTAKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZGRlcigtMiksIDgpCisKKyAgICBkZWYgdGVzdE5lc3RpbmdUaHJvdWdoQ2xhc3Moc2VsZik6CisKKyAgICAgICAgZGVmIG1ha2VfYWRkZXI1KHgpOgorICAgICAgICAgICAgY2xhc3MgQWRkZXI6CisgICAgICAgICAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHkpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICAgICAgICAgIHJldHVybiBBZGRlcigpCisKKyAgICAgICAgaW5jID0gbWFrZV9hZGRlcjUoMSkKKyAgICAgICAgcGx1czEwID0gbWFrZV9hZGRlcjUoMTApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKC0yKSwgOCkKKworICAgIGRlZiB0ZXN0TmVzdGluZ1BsdXNGcmVlUmVmVG9HbG9iYWwoc2VsZik6CisKKyAgICAgICAgZGVmIG1ha2VfYWRkZXI2KHgpOgorICAgICAgICAgICAgZ2xvYmFsIGdsb2JhbF9uZXN0X3gKKyAgICAgICAgICAgIGRlZiBhZGRlcih5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsX25lc3RfeCArIHkKKyAgICAgICAgICAgIGdsb2JhbF9uZXN0X3ggPSB4CisgICAgICAgICAgICByZXR1cm4gYWRkZXIKKworICAgICAgICBpbmMgPSBtYWtlX2FkZGVyNigxKQorICAgICAgICBwbHVzMTAgPSBtYWtlX2FkZGVyNigxMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMTEpICMgdGhlcmUncyBvbmx5IG9uZSBnbG9iYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoLTIpLCA4KQorCisgICAgZGVmIHRlc3ROZWFyZXN0RW5jbG9zaW5nU2NvcGUoc2VsZik6CisKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZyh5KToKKyAgICAgICAgICAgICAgICB4ID0gNDIgIyBjaGVjayB0aGF0IHRoaXMgbWFza3MgYmluZGluZyBpbiBmKCkKKyAgICAgICAgICAgICAgICBkZWYgaCh6KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHggKyB6CisgICAgICAgICAgICAgICAgcmV0dXJuIGgKKyAgICAgICAgICAgIHJldHVybiBnKDIpCisKKyAgICAgICAgdGVzdF9mdW5jID0gZigxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0X2Z1bmMoNSksIDQ3KQorCisgICAgZGVmIHRlc3RNaXhlZEZyZWV2YXJzQW5kQ2VsbHZhcnMoc2VsZik6CisKKyAgICAgICAgZGVmIGlkZW50aXR5KHgpOgorICAgICAgICAgICAgcmV0dXJuIHgKKworICAgICAgICBkZWYgZih4LCB5LCB6KToKKyAgICAgICAgICAgIGRlZiBnKGEsIGIsIGMpOgorICAgICAgICAgICAgICAgIGEgPSBhICsgeCAjIDMKKyAgICAgICAgICAgICAgICBkZWYgaCgpOgorICAgICAgICAgICAgICAgICAgICAjIHogKiAoNCArIDkpCisgICAgICAgICAgICAgICAgICAgICMgMyAqIDEzCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZGVudGl0eSh6ICogKGIgKyB5KSkKKyAgICAgICAgICAgICAgICB5ID0gYyArIHogIyA5CisgICAgICAgICAgICAgICAgcmV0dXJuIGgKKyAgICAgICAgICAgIHJldHVybiBnCisKKyAgICAgICAgZyA9IGYoMSwgMiwgMykKKyAgICAgICAgaCA9IGcoMiwgNCwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoKCksIDM5KQorCisgICAgZGVmIHRlc3RGcmVlVmFySW5NZXRob2Qoc2VsZik6CisKKyAgICAgICAgZGVmIHRlc3QoKToKKyAgICAgICAgICAgIG1ldGhvZF9hbmRfdmFyID0gInZhciIKKyAgICAgICAgICAgIGNsYXNzIFRlc3Q6CisgICAgICAgICAgICAgICAgZGVmIG1ldGhvZF9hbmRfdmFyKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGhvZCIKKyAgICAgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZF9hbmRfdmFyCisgICAgICAgICAgICAgICAgZGVmIGFjdHVhbF9nbG9iYWwoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHIoImdsb2JhbCIpCisgICAgICAgICAgICAgICAgZGVmIHN0cihzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorICAgICAgICAgICAgcmV0dXJuIFRlc3QoKQorCisgICAgICAgIHQgPSB0ZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnRlc3QoKSwgInZhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5tZXRob2RfYW5kX3ZhcigpLCAibWV0aG9kIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmFjdHVhbF9nbG9iYWwoKSwgImdsb2JhbCIpCisKKyAgICAgICAgbWV0aG9kX2FuZF92YXIgPSAidmFyIgorICAgICAgICBjbGFzcyBUZXN0OgorICAgICAgICAgICAgIyB0aGlzIGNsYXNzIGlzIG5vdCBuZXN0ZWQsIHNvIHRoZSBydWxlcyBhcmUgZGlmZmVyZW50CisgICAgICAgICAgICBkZWYgbWV0aG9kX2FuZF92YXIoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRob2QiCisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kX2FuZF92YXIKKyAgICAgICAgICAgIGRlZiBhY3R1YWxfZ2xvYmFsKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoImdsb2JhbCIpCisgICAgICAgICAgICBkZWYgc3RyKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIoc2VsZikKKworICAgICAgICB0ID0gVGVzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC50ZXN0KCksICJ2YXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWV0aG9kX2FuZF92YXIoKSwgIm1ldGhvZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5hY3R1YWxfZ2xvYmFsKCksICJnbG9iYWwiKQorCisgICAgZGVmIHRlc3RSZWN1cnNpb24oc2VsZik6CisKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZmFjdChuKToKKyAgICAgICAgICAgICAgICBpZiBuID09IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG4gKiBmYWN0KG4gLSAxKQorICAgICAgICAgICAgaWYgeCA+PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWN0KHgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJ4IG11c3QgYmUgPj0gMCIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYoNiksIDcyMCkKKworCisgICAgZGVmIHRlc3RVbm9wdGltaXplZE5hbWVzcGFjZXMoc2VsZik6CisKKyAgICAgICAgY2hlY2tfc3ludGF4X2Vycm9yKHNlbGYsICIiIlwKK2RlZiB1bm9wdGltaXplZF9jbGFzaDEoc3RyaXApOgorICAgIGRlZiBmKHMpOgorICAgICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgICAgICByZXR1cm4gc3RyaXAocykgIyBhbWJpZ3VpdHk6IGZyZWUgb3IgbG9jYWwKKyAgICByZXR1cm4gZgorIiIiKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCitkZWYgdW5vcHRpbWl6ZWRfY2xhc2gyKCk6CisgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKKyAgICBkZWYgZihzKToKKyAgICAgICAgcmV0dXJuIHN0cmlwKHMpICMgYW1iaWd1aXR5OiBnbG9iYWwgb3IgbG9jYWwKKyAgICByZXR1cm4gZgorIiIiKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCitkZWYgdW5vcHRpbWl6ZWRfY2xhc2gyKCk6CisgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKKyAgICBkZWYgZygpOgorICAgICAgICBkZWYgZihzKToKKyAgICAgICAgICAgIHJldHVybiBzdHJpcChzKSAjIGFtYmlndWl0eTogZ2xvYmFsIG9yIGxvY2FsCisgICAgICAgIHJldHVybiBmCisiIiIpCisKKyAgICAgICAgIyBYWFggY291bGQgYWxsb3cgdGhpcyBmb3IgZXhlYyB3aXRoIGNvbnN0IGFyZ3VtZW50LCBidXQgd2hhdCdzIHRoZSBwb2ludAorICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAorZGVmIGVycm9yKHkpOgorICAgIGV4ZWMgImEgPSAxIgorICAgIGRlZiBmKHgpOgorICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gZgorIiIiKQorCisgICAgICAgIGNoZWNrX3N5bnRheF9lcnJvcihzZWxmLCAiIiJcCitkZWYgZih4KToKKyAgICBkZWYgZygpOgorICAgICAgICByZXR1cm4geAorICAgIGRlbCB4ICMgY2FuJ3QgZGVsIG5hbWUKKyIiIikKKworICAgICAgICBjaGVja19zeW50YXhfZXJyb3Ioc2VsZiwgIiIiXAorZGVmIGYoKToKKyAgICBkZWYgZygpOgorICAgICAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgICAgICByZXR1cm4gc3RyaXAgIyBnbG9iYWwgb3IgbG9jYWw/CisiIiIpCisKKyAgICAgICAgIyBhbmQgdmVyaWZ5IGEgZmV3IGNhc2VzIHRoYXQgc2hvdWxkIHdvcmsKKworICAgICAgICBleGVjICIiIgorZGVmIG5vcHJvYmxlbTEoKToKKyAgICBmcm9tIHN0cmluZyBpbXBvcnQgKgorICAgIGYgPSBsYW1iZGEgeDp4CisKK2RlZiBub3Byb2JsZW0yKCk6CisgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKKyAgICBkZWYgZih4KToKKyAgICAgICAgcmV0dXJuIHggKyAxCisKK2RlZiBub3Byb2JsZW0zKCk6CisgICAgZnJvbSBzdHJpbmcgaW1wb3J0ICoKKyAgICBkZWYgZih4KToKKyAgICAgICAgZ2xvYmFsIHkKKyAgICAgICAgeSA9IHgKKyIiIgorCisgICAgZGVmIHRlc3RMYW1iZGFzKHNlbGYpOgorCisgICAgICAgIGYxID0gbGFtYmRhIHg6IGxhbWJkYSB5OiB4ICsgeQorICAgICAgICBpbmMgPSBmMSgxKQorICAgICAgICBwbHVzMTAgPSBmMSgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmMoMSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGx1czEwKDUpLCAxNSkKKworICAgICAgICBmMiA9IGxhbWJkYSB4OiAobGFtYmRhIDogbGFtYmRhIHk6IHggKyB5KSgpCisgICAgICAgIGluYyA9IGYyKDEpCisgICAgICAgIHBsdXMxMCA9IGYyKDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluYygxKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwbHVzMTAoNSksIDE1KQorCisgICAgICAgIGYzID0gbGFtYmRhIHg6IGxhbWJkYSB5OiBnbG9iYWxfeCArIHkKKyAgICAgICAgZ2xvYmFsX3ggPSAxCisgICAgICAgIGluYyA9IGYzKE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5jKDIpLCAzKQorCisgICAgICAgIGY4ID0gbGFtYmRhIHgsIHksIHo6IGxhbWJkYSBhLCBiLCBjOiBsYW1iZGEgOiB6ICogKGIgKyB5KQorICAgICAgICBnID0gZjgoMSwgMiwgMykKKyAgICAgICAgaCA9IGcoMiwgNCwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoKCksIDE4KQorCisgICAgZGVmIHRlc3RVbmJvdW5kTG9jYWwoc2VsZik6CisKKyAgICAgICAgZGVmIGVycm9ySW5PdXRlcigpOgorICAgICAgICAgICAgcHJpbnQgeQorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHkKKyAgICAgICAgICAgIHkgPSAxCisKKyAgICAgICAgZGVmIGVycm9ySW5Jbm5lcigpOgorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHkKKyAgICAgICAgICAgIGlubmVyKCkKKyAgICAgICAgICAgIHkgPSAxCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5ib3VuZExvY2FsRXJyb3IsIGVycm9ySW5PdXRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yLCBlcnJvckluSW5uZXIpCisKKyAgICAgICAgIyB0ZXN0IGZvciBidWcgIzE1MDE5MzQ6IGluY29ycmVjdCBMT0FEL1NUT1JFX0dMT0JBTCBnZW5lcmF0aW9uCisgICAgICAgIGV4ZWMgIiIiCitnbG9iYWxfeCA9IDEKK2RlZiBmKCk6CisgICAgZ2xvYmFsX3ggKz0gMQordHJ5OgorICAgIGYoKQorZXhjZXB0IFVuYm91bmRMb2NhbEVycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgZmFpbCgnc2NvcGUgb2YgZ2xvYmFsX3ggbm90IGNvcnJlY3RseSBkZXRlcm1pbmVkJykKKyIiIiBpbiB7J2ZhaWwnOiBzZWxmLmZhaWx9CisKKyAgICBkZWYgdGVzdENvbXBsZXhEZWZpbml0aW9ucyhzZWxmKToKKworICAgICAgICBkZWYgbWFrZVJldHVybmVyKCpsc3QpOgorICAgICAgICAgICAgZGVmIHJldHVybmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGxzdAorICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWtlUmV0dXJuZXIoMSwyLDMpKCksICgxLDIsMykpCisKKyAgICAgICAgZGVmIG1ha2VSZXR1cm5lcjIoKiprd2FyZ3MpOgorICAgICAgICAgICAgZGVmIHJldHVybmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGt3YXJncworICAgICAgICAgICAgcmV0dXJuIHJldHVybmVyCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWtlUmV0dXJuZXIyKGE9MTEpKClbJ2EnXSwgMTEpCisKKyAgICAgICAgd2l0aCBjaGVja19weTNrX3dhcm5pbmdzKCgidHVwbGUgcGFyYW1ldGVyIHVucGFja2luZyBoYXMgYmVlbiByZW1vdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nKSk6CisgICAgICAgICAgICBleGVjICIiIlwKK2RlZiBtYWtlQWRkUGFpcigoYSwgYikpOgorICAgIGRlZiBhZGRQYWlyKChjLCBkKSk6CisgICAgICAgIHJldHVybiAoYSArIGMsIGIgKyBkKQorICAgIHJldHVybiBhZGRQYWlyCisiIiIgaW4gbG9jYWxzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYWtlQWRkUGFpcigoMSwgMikpKCgxMDAsIDIwMCkpLCAoMTAxLDIwMikpCisKKyAgICBkZWYgdGVzdFNjb3BlT2ZHbG9iYWxTdG10KHNlbGYpOgorIyBFeGFtcGxlcyBwb3N0ZWQgYnkgU2FtdWVsZSBQZWRyb25pIHRvIHB5dGhvbi1kZXYgb24gMy8xLzIwMDEKKworICAgICAgICBleGVjICIiIlwKKyMgSQoreCA9IDcKK2RlZiBmKCk6CisgICAgeCA9IDEKKyAgICBkZWYgZygpOgorICAgICAgICBnbG9iYWwgeAorICAgICAgICBkZWYgaSgpOgorICAgICAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgcmV0dXJuIGgoKQorICAgICAgICByZXR1cm4gaSgpCisgICAgcmV0dXJuIGcoKQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDcpCitzZWxmLmFzc2VydEVxdWFsKHgsIDcpCisKKyMgSUkKK3ggPSA3CitkZWYgZigpOgorICAgIHggPSAxCisgICAgZGVmIGcoKToKKyAgICAgICAgeCA9IDIKKyAgICAgICAgZGVmIGkoKToKKyAgICAgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgIHJldHVybiBoKCkKKyAgICAgICAgcmV0dXJuIGkoKQorICAgIHJldHVybiBnKCkKK3NlbGYuYXNzZXJ0RXF1YWwoZigpLCAyKQorc2VsZi5hc3NlcnRFcXVhbCh4LCA3KQorCisjIElJSQoreCA9IDcKK2RlZiBmKCk6CisgICAgeCA9IDEKKyAgICBkZWYgZygpOgorICAgICAgICBnbG9iYWwgeAorICAgICAgICB4ID0gMgorICAgICAgICBkZWYgaSgpOgorICAgICAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgcmV0dXJuIGgoKQorICAgICAgICByZXR1cm4gaSgpCisgICAgcmV0dXJuIGcoKQorc2VsZi5hc3NlcnRFcXVhbChmKCksIDIpCitzZWxmLmFzc2VydEVxdWFsKHgsIDIpCisKKyMgSVYKK3ggPSA3CitkZWYgZigpOgorICAgIHggPSAzCisgICAgZGVmIGcoKToKKyAgICAgICAgZ2xvYmFsIHgKKyAgICAgICAgeCA9IDIKKyAgICAgICAgZGVmIGkoKToKKyAgICAgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgIHJldHVybiBoKCkKKyAgICAgICAgcmV0dXJuIGkoKQorICAgIHJldHVybiBnKCkKK3NlbGYuYXNzZXJ0RXF1YWwoZigpLCAyKQorc2VsZi5hc3NlcnRFcXVhbCh4LCAyKQorCisjIFhYWCB3aGF0IGFib3V0IGdsb2JhbCBzdGF0ZW1lbnRzIGluIGNsYXNzIGJsb2Nrcz8KKyMgZG8gdGhleSBhZmZlY3QgbWV0aG9kcz8KKworeCA9IDEyCitjbGFzcyBHbG9iYWw6CisgICAgZ2xvYmFsIHgKKyAgICB4ID0gMTMKKyAgICBkZWYgc2V0KHNlbGYsIHZhbCk6CisgICAgICAgIHggPSB2YWwKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4geAorCitnID0gR2xvYmFsKCkKK3NlbGYuYXNzZXJ0RXF1YWwoZy5nZXQoKSwgMTMpCitnLnNldCgxNSkKK3NlbGYuYXNzZXJ0RXF1YWwoZy5nZXQoKSwgMTMpCisiIiIKKworICAgIGRlZiB0ZXN0TGVha3Moc2VsZik6CisKKyAgICAgICAgY2xhc3MgRm9vOgorICAgICAgICAgICAgY291bnQgPSAwCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBGb28uY291bnQgKz0gMQorCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBGb28uY291bnQgLT0gMQorCisgICAgICAgIGRlZiBmMSgpOgorICAgICAgICAgICAgeCA9IEZvbygpCisgICAgICAgICAgICBkZWYgZjIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgZjIoKQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICBmMSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGb28uY291bnQsIDApCisKKyAgICBkZWYgdGVzdENsYXNzQW5kR2xvYmFsKHNlbGYpOgorCisgICAgICAgIGV4ZWMgIiIiXAorZGVmIHRlc3QoeCk6CisgICAgY2xhc3MgRm9vOgorICAgICAgICBnbG9iYWwgeAorICAgICAgICBkZWYgX19jYWxsX18oc2VsZiwgeSk6CisgICAgICAgICAgICByZXR1cm4geCArIHkKKyAgICByZXR1cm4gRm9vKCkKKworeCA9IDAKK3NlbGYuYXNzZXJ0RXF1YWwodGVzdCg2KSgyKSwgOCkKK3ggPSAtMQorc2VsZi5hc3NlcnRFcXVhbCh0ZXN0KDMpKDIpLCA1KQorCitsb29rZWRfdXBfYnlfbG9hZF9uYW1lID0gRmFsc2UKK2NsYXNzIFg6CisgICAgIyBJbXBsaWNpdCBnbG9iYWxzIGluc2lkZSBjbGFzc2VzIGFyZSBiZSBsb29rZWQgdXAgYnkgTE9BRF9OQU1FLCBub3QKKyAgICAjIExPQURfR0xPQkFMLgorICAgIGxvY2FscygpWydsb29rZWRfdXBfYnlfbG9hZF9uYW1lJ10gPSBUcnVlCisgICAgcGFzc2VkID0gbG9va2VkX3VwX2J5X2xvYWRfbmFtZQorCitzZWxmLmFzc2VydFRydWUoWC5wYXNzZWQpCisiIiIKKworICAgIGRlZiB0ZXN0TG9jYWxzRnVuY3Rpb24oc2VsZik6CisKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZyh5KToKKyAgICAgICAgICAgICAgICBkZWYgaCh6KToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHkgKyB6CisgICAgICAgICAgICAgICAgdyA9IHggKyB5CisgICAgICAgICAgICAgICAgeSArPSAzCisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FscygpCisgICAgICAgICAgICByZXR1cm4gZworCisgICAgICAgIGQgPSBmKDIpKDQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2gnLCBkKQorICAgICAgICBkZWwgZFsnaCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZCwgeyd4JzogMiwgJ3knOiA3LCAndyc6IDZ9KQorCisgICAgZGVmIHRlc3RMb2NhbHNDbGFzcyhzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBjYWxsaW5nIGxvY2FscygpIGRvZXMgbm90IHBvbGx1dGUKKyAgICAgICAgIyB0aGUgbG9jYWwgbmFtZXNwYWNlIG9mIHRoZSBjbGFzcyB3aXRoIGZyZWUgdmFyaWFibGVzLiAgT2xkCisgICAgICAgICMgdmVyc2lvbnMgb2YgUHl0aG9uIGhhZCBhIGJ1Zywgd2hlcmUgYSBmcmVlIHZhcmlhYmxlIGJlaW5nCisgICAgICAgICMgcGFzc2VkIHRocm91Z2ggYSBjbGFzcyBuYW1lc3BhY2Ugd291bGQgYmUgaW5zZXJ0ZWQgaW50bworICAgICAgICAjIGxvY2FscygpIGJ5IGxvY2FscygpIG9yIGV4ZWMgb3IgYSB0cmFjZSBmdW5jdGlvbi4KKyAgICAgICAgIworICAgICAgICAjIFRoZSByZWFsIGJ1ZyBsaWVzIGluIGZyYW1lIGNvZGUgdGhhdCBjb3BpZXMgdmFyaWFibGVzCisgICAgICAgICMgYmV0d2VlbiBmYXN0IGxvY2FscyBhbmQgdGhlIGxvY2FscyBkaWN0LCBlLmcuIHdoZW4gZXhlY3V0aW5nCisgICAgICAgICMgYSB0cmFjZSBmdW5jdGlvbi4KKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICAgeCA9IDEyCisgICAgICAgICAgICAgICAgZGVmIG0oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB4CisgICAgICAgICAgICAgICAgbG9jYWxzKCkKKyAgICAgICAgICAgIHJldHVybiBDCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmKDEpLngsIDEyKQorCisgICAgICAgIGRlZiBmKHgpOgorICAgICAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgICAgICB5ID0geAorICAgICAgICAgICAgICAgIGRlZiBtKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgICAgIHogPSBsaXN0KGxvY2FscygpKQorICAgICAgICAgICAgcmV0dXJuIEMKKworICAgICAgICB2YXJuYW1lcyA9IGYoMSkuegorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJ4IiwgdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInkiLCB2YXJuYW1lcykKKworICAgIGRlZiB0ZXN0TG9jYWxzQ2xhc3NfV2l0aFRyYWNlKHNlbGYpOgorICAgICAgICAjIElzc3VlMjM3Mjg6IGFmdGVyIHRoZSB0cmFjZSBmdW5jdGlvbiByZXR1cm5zLCB0aGUgbG9jYWxzKCkKKyAgICAgICAgIyBkaWN0aW9uYXJ5IGlzIHVzZWQgdG8gdXBkYXRlIGFsbCB2YXJpYWJsZXMsIHRoaXMgdXNlZCB0bworICAgICAgICAjIGluY2x1ZGUgZnJlZSB2YXJpYWJsZXMuIEJ1dCBpbiBjbGFzcyBzdGF0ZW1lbnRzLCBmcmVlCisgICAgICAgICMgdmFyaWFibGVzIGFyZSBub3QgaW5zZXJ0ZWQuLi4KKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBzeXMuc2V0dHJhY2UobGFtYmRhIGEsYixjOk5vbmUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggPSAxMgorCisgICAgICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgICAgIGRlZiBmKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geAorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIDEyKSAjIFVzZWQgdG8gcmFpc2UgVW5ib3VuZExvY2FsRXJyb3IKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorCisgICAgZGVmIHRlc3RCb3VuZEFuZEZyZWUoc2VsZik6CisgICAgICAgICMgdmFyIGlzIGJvdW5kIGFuZCBmcmVlIGluIGNsYXNzCisKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgICAgIGRlZiBtKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4geAorICAgICAgICAgICAgICAgIGEgPSB4CisgICAgICAgICAgICByZXR1cm4gQworCisgICAgICAgIGluc3QgPSBmKDMpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnN0LmEsIGluc3QubSgpKQorCisgICAgZGVmIHRlc3RJbnRlcmFjdGlvbldpdGhUcmFjZUZ1bmMoc2VsZik6CisKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBkZWYgdHJhY2VyKGEsYixjKToKKyAgICAgICAgICAgIHJldHVybiB0cmFjZXIKKworICAgICAgICBkZWYgYWRhcHRnZXR0ZXIobmFtZSwga2xhc3MsIGdldHRlcik6CisgICAgICAgICAgICBraW5kLCBkZXMgPSBnZXR0ZXIKKyAgICAgICAgICAgIGlmIGtpbmQgPT0gMTogICAgICAgIyBBViBoYXBwZW5zIHdoZW4gc3RlcHBpbmcgZnJvbSB0aGlzIGxpbmUgdG8gbmV4dAorICAgICAgICAgICAgICAgIGlmIGRlcyA9PSAiIjoKKyAgICAgICAgICAgICAgICAgICAgZGVzID0gIl8lc19fJXMiICUgKGtsYXNzLl9fbmFtZV9fLCBuYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBsYW1iZGEgb2JqOiBnZXRhdHRyKG9iaiwgZGVzKQorCisgICAgICAgIGNsYXNzIFRlc3RDbGFzczoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VyKQorICAgICAgICBhZGFwdGdldHRlcigiZm9vIiwgVGVzdENsYXNzLCAoMSwgIiIpKQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5zZXR0cmFjZSkKKworICAgIGRlZiB0ZXN0RXZhbEV4ZWNGcmVlVmFycyhzZWxmKToKKworICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIHJldHVybiBsYW1iZGE6IHggKyAxCisKKyAgICAgICAgZyA9IGYoMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCBnLmZ1bmNfY29kZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBleGVjIGcuZnVuY19jb2RlIGluIHt9CisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4ZWMgc2hvdWxkIGhhdmUgZmFpbGVkLCBiZWNhdXNlIGNvZGUgY29udGFpbmVkIGZyZWUgdmFycyIpCisKKyAgICBkZWYgdGVzdExpc3RDb21wTG9jYWxWYXJzKHNlbGYpOgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50IGJhZAorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJpbnQgImJhZCBzaG91bGQgbm90IGJlIGRlZmluZWQiCisKKyAgICAgICAgZGVmIHgoKToKKyAgICAgICAgICAgIFtiYWQgZm9yIHMgaW4gJ2EgYicgZm9yIGJhZCBpbiBzLnNwbGl0KCldCisKKyAgICAgICAgeCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHByaW50IGJhZAorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RFdmFsRnJlZVZhcnMoc2VsZik6CisKKyAgICAgICAgZGVmIGYoeCk6CisgICAgICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgICAgIHgKKyAgICAgICAgICAgICAgICBldmFsKCJ4ICsgMSIpCisgICAgICAgICAgICByZXR1cm4gZworCisgICAgICAgIGYoNCkoKQorCisgICAgZGVmIHRlc3RGcmVlaW5nQ2VsbChzZWxmKToKKyAgICAgICAgIyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgZmluYWxpemVyIGFjY2Vzc2VzCisgICAgICAgICMgdGhlIGNlbGwgd2hlcmUgdGhlIG9iamVjdCB3YXMgc3RvcmVkLgorICAgICAgICBjbGFzcyBTcGVjaWFsOgorICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgbmVzdGVkY2VsbF9nZXQoKQorCisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBnbG9iYWwgbmVzdGVkY2VsbF9nZXQKKyAgICAgICAgICAgIGRlZiBuZXN0ZWRjZWxsX2dldCgpOgorICAgICAgICAgICAgICAgIHJldHVybiBjCisKKyAgICAgICAgICAgIGMgPSAoU3BlY2lhbCgpLCkKKyAgICAgICAgICAgIGMgPSAyCisKKyAgICAgICAgZigpICMgdXNlZCB0byBjcmFzaCB0aGUgaW50ZXJwcmV0ZXIuLi4KKworICAgIGRlZiB0ZXN0R2xvYmFsSW5QYXJhbGxlbE5lc3RlZEZ1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgIyBBIHN5bWJvbCB0YWJsZSBidWcgbGVha2VkIHRoZSBnbG9iYWwgc3RhdGVtZW50IGZyb20gb25lCisgICAgICAgICMgZnVuY3Rpb24gdG8gb3RoZXIgbmVzdGVkIGZ1bmN0aW9ucyBpbiB0aGUgc2FtZSBibG9jay4KKyAgICAgICAgIyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBhIGdsb2JhbCBzdGF0ZW1lbnQgaW4gdGhlIGZpcnN0CisgICAgICAgICMgZnVuY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBzZWNvbmQgZnVuY3Rpb24uCisgICAgICAgIENPREUgPSAiIiJkZWYgZigpOgorICAgIHkgPSAxCisgICAgZGVmIGcoKToKKyAgICAgICAgZ2xvYmFsIHkKKyAgICAgICAgcmV0dXJuIHkKKyAgICBkZWYgaCgpOgorICAgICAgICByZXR1cm4geSArIDEKKyAgICByZXR1cm4gZywgaAorCit5ID0gOQorZywgaCA9IGYoKQorcmVzdWx0OSA9IGcoKQorcmVzdWx0MiA9IGgoKQorIiIiCisgICAgICAgIGxvY2FsX25zID0ge30KKyAgICAgICAgZ2xvYmFsX25zID0ge30KKyAgICAgICAgZXhlYyBDT0RFIGluIGxvY2FsX25zLCBnbG9iYWxfbnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBnbG9iYWxfbnNbInJlc3VsdDIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBnbG9iYWxfbnNbInJlc3VsdDkiXSkKKworICAgIGRlZiB0ZXN0VG9wSXNOb3RTaWduaWZpY2FudChzZWxmKToKKyAgICAgICAgIyBTZWUgIzk5OTcuCisgICAgICAgIGRlZiB0b3AoYSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBiKCk6CisgICAgICAgICAgICBnbG9iYWwgYQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgiaW1wb3J0IFwqIG9ubHkgYWxsb3dlZCBhdCBtb2R1bGUgbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KFNjb3BlVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Njb3BlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Njb3BlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGEwMTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Njb3BlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Njb3BlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGEwMTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NvcGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NjcmlwdHBhY2thZ2VzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NyaXB0cGFja2FnZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UwMmZhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NjcmlwdHBhY2thZ2VzLnB5CkBAIC0wLDAgKzEsNTEgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBTa2lwIHRoaXMgdGVzdCBpZiBhZXRvb2xzIGRvZXMgbm90IGV4aXN0LgordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2FldG9vbHMnKQorCitjbGFzcyBUZXN0U2NyaXB0cGFja2FnZXModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF90ZXN0X3NjcmlwdHBhY2thZ2Uoc2VsZiwgcGFja2FnZSwgdGVzdG9iamVjdD0xKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHdlIGNhbiBpbXBvcnQgdGhlIHBhY2thZ2UKKyAgICAgICAgbW9kID0gX19pbXBvcnRfXyhwYWNrYWdlKQorICAgICAgICAjIFRlc3QgdGhhdCB3ZSBjYW4gZ2V0IHRoZSBtYWluIGV2ZW50IGNsYXNzCisgICAgICAgIGtsYXNzID0gZ2V0YXR0cihtb2QsIHBhY2thZ2UpCisgICAgICAgICMgVGVzdCB0aGF0IHdlIGNhbiBpbnN0YW50aWF0ZSB0aGF0IGNsYXNzCisgICAgICAgIHRhbGtlciA9IGtsYXNzKCkKKyAgICAgICAgaWYgdGVzdG9iamVjdDoKKyAgICAgICAgICAgICMgVGVzdCB0aGF0IHdlIGNhbiBnZXQgYW4gYXBwbGljYXRpb24gb2JqZWN0CisgICAgICAgICAgICBvYmogPSBtb2QuYXBwbGljYXRpb24oMCkKKworICAgIGRlZiB0ZXN0X19idWlsdGluU3VpdGVzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3NjcmlwdHBhY2thZ2UoJ19idWlsdGluU3VpdGVzJywgdGVzdG9iamVjdD0wKQorCisgICAgZGVmIHRlc3RfU3RkU3VpdGVzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3NjcmlwdHBhY2thZ2UoJ1N0ZFN1aXRlcycpCisKKyAgICBkZWYgdGVzdF9TeXN0ZW1FdmVudHMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc2NyaXB0cGFja2FnZSgnU3lzdGVtRXZlbnRzJykKKworICAgIGRlZiB0ZXN0X0ZpbmRlcihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9zY3JpcHRwYWNrYWdlKCdGaW5kZXInKQorCisgICAgZGVmIHRlc3RfVGVybWluYWwoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc2NyaXB0cGFja2FnZSgnVGVybWluYWwnKQorCisgICAgZGVmIHRlc3RfTmV0c2NhcGUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc2NyaXB0cGFja2FnZSgnTmV0c2NhcGUnKQorCisgICAgZGVmIHRlc3RfRXhwbG9yZXIoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc2NyaXB0cGFja2FnZSgnRXhwbG9yZXInKQorCisgICAgZGVmIHRlc3RfQ29kZVdhcnJpb3Ioc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3Rfc2NyaXB0cGFja2FnZSgnQ29kZVdhcnJpb3InKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0U2NyaXB0cGFja2FnZXMpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NyaXB0cGFja2FnZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NyaXB0cGFja2FnZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzBkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY3JpcHRwYWNrYWdlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NyaXB0cGFja2FnZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2NyaXB0cGFja2FnZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzBkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zY3JpcHRwYWNrYWdlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2VsZWN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2VsZWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NWJiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZWxlY3QucHkKQEAgLTAsMCArMSw2NyBAQAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNlbGVjdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtWzozXSBpbiAoJ3dpbicsICdvczInLCAncmlzY29zJyksCisgICAgICAgICAgICAgICAgICJjYW4ndCBlYXNpbHkgdGVzdCBvbiB0aGlzIHN5c3RlbSIpCitjbGFzcyBTZWxlY3RUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBjbGFzcyBOb3BlOgorICAgICAgICBwYXNzCisKKyAgICBjbGFzcyBBbG1vc3Q6CisgICAgICAgIGRlZiBmaWxlbm8oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gJ2ZpbGVubycKKworICAgIGRlZiB0ZXN0X2Vycm9yX2NvbmRpdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LnNlbGVjdCwgMSwgMiwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxlY3Quc2VsZWN0LCBbc2VsZi5Ob3BlKCldLCBbXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LnNlbGVjdCwgW3NlbGYuQWxtb3N0KCldLCBbXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZWN0LnNlbGVjdCwgW10sIFtdLCBbXSwgIm5vdCBhIG51bWJlciIpCisKKyAgICBkZWYgdGVzdF9yZXR1cm5lZF9saXN0X2lkZW50aXR5KHNlbGYpOgorICAgICAgICAjIFNlZSBpc3N1ZSAjODMyOQorICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdChbXSwgW10sIFtdLCAxKQorICAgICAgICBzZWxmLmFzc2VydElzTm90KHIsIHcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QociwgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdCh3LCB4KQorCisgICAgZGVmIHRlc3Rfc2VsZWN0KHNlbGYpOgorICAgICAgICBjbWQgPSAnZm9yIGkgaW4gMCAxIDIgMyA0IDUgNiA3IDggOTsgZG8gZWNobyB0ZXN0aW5nLi4uOyBzbGVlcCAxOyBkb25lJworICAgICAgICBwID0gb3MucG9wZW4oY21kLCAncicpCisgICAgICAgIGZvciB0b3V0IGluICgwLCAxLCAyLCA0LCA4LCAxNikgKyAoTm9uZSwpKjEwOgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3RpbWVvdXQgPScsIHRvdXQKKyAgICAgICAgICAgIHJmZCwgd2ZkLCB4ZmQgPSBzZWxlY3Quc2VsZWN0KFtwXSwgW10sIFtdLCB0b3V0KQorICAgICAgICAgICAgaWYgKHJmZCwgd2ZkLCB4ZmQpID09IChbXSwgW10sIFtdKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgKHJmZCwgd2ZkLCB4ZmQpID09IChbcF0sIFtdLCBbXSk6CisgICAgICAgICAgICAgICAgbGluZSA9IHAucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCByZXByKGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0VPRicKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5mYWlsKCdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZXMgZnJvbSBzZWxlY3QoKTonLCByZmQsIHdmZCwgeGZkKQorICAgICAgICBwLmNsb3NlKCkKKworICAgICMgSXNzdWUgMTYyMzA6IENyYXNoIG9uIHNlbGVjdCByZXNpemVkIGxpc3QKKyAgICBkZWYgdGVzdF9zZWxlY3RfbXV0YXRlZChzZWxmKToKKyAgICAgICAgYSA9IFtdCisgICAgICAgIGNsYXNzIEY6CisgICAgICAgICAgICBkZWYgZmlsZW5vKHNlbGYpOgorICAgICAgICAgICAgICAgIGRlbCBhWy0xXQorICAgICAgICAgICAgICAgIHJldHVybiBzeXMuX19zdGRvdXRfXy5maWxlbm8oKQorICAgICAgICBhWzpdID0gW0YoKV0gKiAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGVjdC5zZWxlY3QoW10sIGEsIFtdKSwgKFtdLCBhWzo1XSwgW10pKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTZWxlY3RUZXN0Q2FzZSkKKyAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NlbGVjdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZWxlY3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDk5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZWxlY3QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NlbGVjdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZWxlY3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZDk5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZWxlY3QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGIyNmVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC0wLDAgKzEsMTgzMiBAQAorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgZ2MKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBjb3B5CitpbXBvcnQgcGlja2xlCitmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlLCBzaHVmZmxlCitpbXBvcnQgc3lzCitpbXBvcnQgY29sbGVjdGlvbnMKKworY2xhc3MgUGFzc1RocnUoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKK2RlZiBjaGVja19wYXNzX3RocnUoKToKKyAgICByYWlzZSBQYXNzVGhydQorICAgIHlpZWxkIDEKKworY2xhc3MgQmFkQ21wOgorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCitjbGFzcyBSZXByV3JhcHBlcjoKKyAgICAnVXNlZCB0byB0ZXN0IHNlbGYtcmVmZXJlbnRpYWwgcmVwcigpIGNhbGxzJworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlcHIoc2VsZi52YWx1ZSkKKworY2xhc3MgSGFzaENvdW50aW5nSW50KGludCk6CisgICAgJ2ludC1saWtlIG9iamVjdCB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHRpbWVzIF9faGFzaF9fIGlzIGNhbGxlZCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmhhc2hfY291bnQgPSAwCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICBzZWxmLmhhc2hfY291bnQgKz0gMQorICAgICAgICByZXR1cm4gaW50Ll9faGFzaF9fKHNlbGYpCisKK2NsYXNzIFRlc3RKb2ludE9wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0cyBjb21tb24gdG8gYm90aCBzZXQgYW5kIGZyb3plbnNldAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLndvcmQgPSB3b3JkID0gJ3NpbXNhbGFiaW0nCisgICAgICAgIHNlbGYub3RoZXJ3b3JkID0gJ21hZGFnYXNjYXInCisgICAgICAgIHNlbGYubGV0dGVycyA9ICdhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworICAgICAgICBzZWxmLnMgPSBzZWxmLnRoZXR5cGUod29yZCkKKyAgICAgICAgc2VsZi5kID0gZGljdC5mcm9ta2V5cyh3b3JkKQorCisgICAgZGVmIHRlc3RfbmV3X29yX2luaXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50aGV0eXBlLCBbXSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXQoKS5fX2luaXRfXywgYT0xKQorCisgICAgZGVmIHRlc3RfdW5pcXVpZmljYXRpb24oc2VsZik6CisgICAgICAgIGFjdHVhbCA9IHNvcnRlZChzZWxmLnMpCisgICAgICAgIGV4cGVjdGVkID0gc29ydGVkKHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi50aGV0eXBlLCBjaGVja19wYXNzX3RocnUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnRoZXR5cGUsIFtbXV0pCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYucyksIGxlbihzZWxmLmQpKQorCisgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CisgICAgICAgIGZvciBjIGluIHNlbGYubGV0dGVyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYyBpbiBzZWxmLnMsIGMgaW4gc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5fX2NvbnRhaW5zX18sIFtbXV0pCisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoW2Zyb3plbnNldChzZWxmLmxldHRlcnMpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLnRoZXR5cGUoc2VsZi5sZXR0ZXJzKSwgcykKKworICAgIGRlZiB0ZXN0X3VuaW9uKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi5zLnVuaW9uKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmxldHRlcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gdSwgYyBpbiBzZWxmLmQgb3IgYyBpbiBzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIHNlbGYudGhldHlwZShzZWxmLndvcmQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodSksIHNlbGYudGhldHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUGFzc1RocnUsIHNlbGYucy51bmlvbiwgY2hlY2tfcGFzc190aHJ1KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnVuaW9uLCBbW11dKQorICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnVuaW9uKEMoJ2NkYycpKSwgc2V0KCdhYmNkJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS51bmlvbihDKCdlZmdmZScpKSwgc2V0KCdhYmNlZmcnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnVuaW9uKEMoJ2NjYicpKSwgc2V0KCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnVuaW9uKEMoJ2VmJykpLCBzZXQoJ2FiY2VmJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS51bmlvbihDKCdlZicpLCBDKCdmZycpKSwgc2V0KCdhYmNlZmcnKSkKKworICAgICAgICAjIElzc3VlICM2NTczCisgICAgICAgIHggPSBzZWxmLnRoZXR5cGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudW5pb24oc2V0KFsxXSksIHgsIHNldChbMl0pKSwgc2VsZi50aGV0eXBlKFsxLCAyXSkpCisKKyAgICBkZWYgdGVzdF9vcihzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucy51bmlvbihzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgfCBzZXQoc2VsZi5vdGhlcndvcmQpLCBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyB8IGZyb3plbnNldChzZWxmLm90aGVyd29yZCksIGkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucyB8IHNlbGYub3RoZXJ3b3JkCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInN8dCBkaWQgbm90IHNjcmVlbi1vdXQgZ2VuZXJhbCBpdGVyYWJsZXMiKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLmludGVyc2VjdGlvbihzZWxmLm90aGVyd29yZCkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIGksIGMgaW4gc2VsZi5kIGFuZCBjIGluIHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpKSwgc2VsZi50aGV0eXBlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLmludGVyc2VjdGlvbiwgY2hlY2tfcGFzc190aHJ1KCkpCisgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuaW50ZXJzZWN0aW9uKEMoJ2NkYycpKSwgc2V0KCdjYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuaW50ZXJzZWN0aW9uKEMoJ2VmZ2ZlJykpLCBzZXQoJycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuaW50ZXJzZWN0aW9uKEMoJ2NjYicpKSwgc2V0KCdiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuaW50ZXJzZWN0aW9uKEMoJ2VmJykpLCBzZXQoJycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuaW50ZXJzZWN0aW9uKEMoJ2NiY2YnKSwgQygnYmFnJykpLCBzZXQoJ2InKSkKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZSgnYWJjYmEnKQorICAgICAgICB6ID0gcy5pbnRlcnNlY3Rpb24oKQorICAgICAgICBpZiBzZWxmLnRoZXR5cGUgPT0gZnJvemVuc2V0KCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlkKHMpLCBpZCh6KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQocyksIGlkKHopKQorCisgICAgZGVmIHRlc3RfaXNkaXNqb2ludChzZWxmKToKKyAgICAgICAgZGVmIGYoczEsIHMyKToKKyAgICAgICAgICAgICdQdXJlIHB5dGhvbiBlcXVpdmFsZW50IG9mIGlzZGlzam9pbnQoKScKKyAgICAgICAgICAgIHJldHVybiBub3Qgc2V0KHMxKS5pbnRlcnNlY3Rpb24oczIpCisgICAgICAgIGZvciBsYXJnIGluICcnLCAnYScsICdhYicsICdhYmMnLCAnYWJhYmFjJywgJ2NkYycsICdjYycsICdlZmdmZScsICdjY2InLCAnZWYnOgorICAgICAgICAgICAgczEgPSBzZWxmLnRoZXR5cGUobGFyZykKKyAgICAgICAgICAgIGZvciByYXJnIGluICcnLCAnYScsICdhYicsICdhYmMnLCAnYWJhYmFjJywgJ2NkYycsICdjYycsICdlZmdmZScsICdjY2InLCAnZWYnOgorICAgICAgICAgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgICAgICAgICBzMiA9IEMocmFyZykKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsID0gczEuaXNkaXNqb2ludChzMikKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBmKHMxLCBzMikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWN0dWFsIGlzIFRydWUgb3IgYWN0dWFsIGlzIEZhbHNlKQorCisgICAgZGVmIHRlc3RfYW5kKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLmludGVyc2VjdGlvbihzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgJiBzZXQoc2VsZi5vdGhlcndvcmQpLCBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAmIGZyb3plbnNldChzZWxmLm90aGVyd29yZCksIGkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYucyAmIHNlbGYub3RoZXJ3b3JkCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInMmdCBkaWQgbm90IHNjcmVlbi1vdXQgZ2VuZXJhbCBpdGVyYWJsZXMiKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucy5kaWZmZXJlbmNlKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiBzZWxmLmxldHRlcnM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gaSwgYyBpbiBzZWxmLmQgYW5kIGMgbm90IGluIHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpKSwgc2VsZi50aGV0eXBlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLmRpZmZlcmVuY2UsIGNoZWNrX3Bhc3NfdGhydSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5kaWZmZXJlbmNlLCBbW11dKQorICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLmRpZmZlcmVuY2UoQygnY2RjJykpLCBzZXQoJ2FiJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5kaWZmZXJlbmNlKEMoJ2VmZ2ZlJykpLCBzZXQoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuZGlmZmVyZW5jZShDKCdjY2InKSksIHNldCgnYScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRoZXR5cGUoJ2FiY2JhJykuZGlmZmVyZW5jZShDKCdlZicpKSwgc2V0KCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLmRpZmZlcmVuY2UoKSwgc2V0KCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLmRpZmZlcmVuY2UoQygnYScpLCBDKCdiJykpLCBzZXQoJ2MnKSkKKworICAgIGRlZiB0ZXN0X3N1YihzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucy5kaWZmZXJlbmNlKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAtIHNldChzZWxmLm90aGVyd29yZCksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIC0gZnJvemVuc2V0KHNlbGYub3RoZXJ3b3JkKSwgaSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zIC0gc2VsZi5vdGhlcndvcmQKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicy10IGRpZCBub3Qgc2NyZWVuLW91dCBnZW5lcmFsIGl0ZXJhYmxlcyIpCisKKyAgICBkZWYgdGVzdF9zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmLm90aGVyd29yZCkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIGksIChjIGluIHNlbGYuZCkgXiAoYyBpbiBzZWxmLm90aGVyd29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGkpLCBzZWxmLnRoZXR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2UsIGNoZWNrX3Bhc3NfdGhydSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZSwgW1tdXSkKKyAgICAgICAgZm9yIEMgaW4gc2V0LCBmcm96ZW5zZXQsIGRpY3QuZnJvbWtleXMsIHN0ciwgdW5pY29kZSwgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5zeW1tZXRyaWNfZGlmZmVyZW5jZShDKCdjZGMnKSksIHNldCgnYWJkJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5zeW1tZXRyaWNfZGlmZmVyZW5jZShDKCdlZmdmZScpKSwgc2V0KCdhYmNlZmcnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50aGV0eXBlKCdhYmNiYScpLnN5bW1ldHJpY19kaWZmZXJlbmNlKEMoJ2NjYicpKSwgc2V0KCdhJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGhldHlwZSgnYWJjYmEnKS5zeW1tZXRyaWNfZGlmZmVyZW5jZShDKCdlZicpKSwgc2V0KCdhYmNlZicpKQorCisgICAgZGVmIHRlc3RfeG9yKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyBeIHNldChzZWxmLm90aGVyd29yZCksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIF4gZnJvemVuc2V0KHNlbGYub3RoZXJ3b3JkKSwgaSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zIF4gc2VsZi5vdGhlcndvcmQKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic150IGRpZCBub3Qgc2NyZWVuLW91dCBnZW5lcmFsIGl0ZXJhYmxlcyIpCisKKyAgICBkZWYgdGVzdF9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIHNldChzZWxmLndvcmQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgZnJvemVuc2V0KHNlbGYud29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zID09IHNlbGYud29yZCwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5zLCBzZXQoc2VsZi5vdGhlcndvcmQpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYucywgZnJvemVuc2V0KHNlbGYub3RoZXJ3b3JkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgIT0gc2VsZi53b3JkLCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc2V0T2ZGcm96ZW5zZXRzKHNlbGYpOgorICAgICAgICB0ID0gbWFwKGZyb3plbnNldCwgWydhYmNkZWYnLCAnYmNkJywgJ2JkY2InLCAnZmVkJywgJ2ZlZGNjYmEnXSkKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZSh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgMykKKworICAgIGRlZiB0ZXN0X2NvbXBhcmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLl9fY21wX18sIHNlbGYucykKKworICAgIGRlZiB0ZXN0X3N1Yl9hbmRfc3VwZXIoc2VsZik6CisgICAgICAgIHAsIHEsIHIgPSBtYXAoc2VsZi50aGV0eXBlLCBbJ2FiJywgJ2FiY2RlJywgJ2RlZiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocCA8IHEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwIDw9IHEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxIDw9IHEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxID4gcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEgPj0gcCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxIDwgcikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxIDw9IHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocSA+IHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocSA+PSByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KCdhJykuaXNzdWJzZXQoJ2FiYycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KCdhYmMnKS5pc3N1cGVyc2V0KCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2V0KCdhJykuaXNzdWJzZXQoJ2NicycpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNldCgnY2JzJykuaXNzdXBlcnNldCgnYScpKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBwID0gcGlja2xlLmR1bXBzKHNlbGYucywgaSkKKyAgICAgICAgICAgIGR1cCA9IHBpY2tsZS5sb2FkcyhwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIGR1cCwgIiVzICE9ICVzIiAlIChzZWxmLnMsIGR1cCkpCisgICAgICAgICAgICBpZiB0eXBlKHNlbGYucykgbm90IGluIChzZXQsIGZyb3plbnNldCk6CisgICAgICAgICAgICAgICAgc2VsZi5zLnggPSAxMAorICAgICAgICAgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoc2VsZi5zKQorICAgICAgICAgICAgICAgIGR1cCA9IHBpY2tsZS5sb2FkcyhwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLngsIGR1cC54KQorCisgICAgZGVmIHRlc3RfZGVlcGNvcHkoc2VsZik6CisgICAgICAgIGNsYXNzIFRyYWNlcjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKyAgICAgICAgICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbz1Ob25lKToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2VyKHNlbGYudmFsdWUgKyAxKQorICAgICAgICB0ID0gVHJhY2VyKDEwKQorICAgICAgICBzID0gc2VsZi50aGV0eXBlKFt0XSkKKyAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHMpLCBpZChkdXApKQorICAgICAgICBmb3IgZWxlbSBpbiBkdXA6CisgICAgICAgICAgICBuZXd0ID0gZWxlbQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHQpLCBpZChuZXd0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnZhbHVlICsgMSwgbmV3dC52YWx1ZSkKKworICAgIGRlZiB0ZXN0X2djKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSBhIG5lc3Qgb2YgY3ljbGVzIHRvIGV4ZXJjaXNlIG92ZXJhbGwgcmVmIGNvdW50IGNoZWNrCisgICAgICAgIGNsYXNzIEE6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHMgPSBzZXQoQSgpIGZvciBpIGluIHhyYW5nZSgxMDAwKSkKKyAgICAgICAgZm9yIGVsZW0gaW4gczoKKyAgICAgICAgICAgIGVsZW0uY3ljbGUgPSBzCisgICAgICAgICAgICBlbGVtLnN1YiA9IGVsZW0KKyAgICAgICAgICAgIGVsZW0uc2V0ID0gc2V0KFtlbGVtXSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3dpdGhfY3VzdG9tX2hhc2goc2VsZik6CisgICAgICAgICMgQnVnICMxMjU3NzMxCisgICAgICAgIGNsYXNzIEgoc2VsZi50aGV0eXBlKToKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50KGlkKHNlbGYpICYgMHg3ZmZmZmZmZikKKyAgICAgICAgcz1IKCkKKyAgICAgICAgZj1zZXQoKQorICAgICAgICBmLmFkZChzKQorICAgICAgICBzZWxmLmFzc2VydEluKHMsIGYpCisgICAgICAgIGYucmVtb3ZlKHMpCisgICAgICAgIGYuYWRkKHMpCisgICAgICAgIGYuZGlzY2FyZChzKQorCisgICAgZGVmIHRlc3RfYmFkY21wKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKFtCYWRDbXAoKV0pCisgICAgICAgICMgRGV0ZWN0IGNvbXBhcmlzb24gZXJyb3JzIGR1cmluZyBpbnNlcnRpb24gYW5kIGxvb2t1cAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNlbGYudGhldHlwZSwgW0JhZENtcCgpLCBCYWRDbXAoKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcy5fX2NvbnRhaW5zX18sIEJhZENtcCgpKQorICAgICAgICAjIERldGVjdCBlcnJvcnMgZHVyaW5nIG11dGF0aW5nIG9wZXJhdGlvbnMKKyAgICAgICAgaWYgaGFzYXR0cihzLCAnYWRkJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHMuYWRkLCBCYWRDbXAoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcy5kaXNjYXJkLCBCYWRDbXAoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgcy5yZW1vdmUsIEJhZENtcCgpKQorCisgICAgZGVmIHRlc3RfY3ljbGljYWxfcmVwcihzZWxmKToKKyAgICAgICAgdyA9IFJlcHJXcmFwcGVyKCkKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShbd10pCisgICAgICAgIHcudmFsdWUgPSBzCisgICAgICAgIG5hbWUgPSByZXByKHMpLnBhcnRpdGlvbignKCcpWzBdICAgICMgc3RyaXAgY2xhc3MgbmFtZSBmcm9tIHJlcHIgc3RyaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzKSwgJyVzKFslcyguLi4pXSknICUgKG5hbWUsIG5hbWUpKQorCisgICAgZGVmIHRlc3RfY3ljbGljYWxfcHJpbnQoc2VsZik6CisgICAgICAgIHcgPSBSZXByV3JhcHBlcigpCisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoW3ddKQorICAgICAgICB3LnZhbHVlID0gcworICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgIndiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQgPj4gZm8sIHMsCisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZCgpLCByZXByKHMpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm8uY2xvc2UoKQorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfZG9fbm90X3JlaGFzaF9kaWN0X2tleXMoc2VsZik6CisgICAgICAgIG4gPSAxMAorICAgICAgICBkID0gZGljdC5mcm9ta2V5cyhtYXAoSGFzaENvdW50aW5nSW50LCB4cmFuZ2UobikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShlbGVtLmhhc2hfY291bnQgZm9yIGVsZW0gaW4gZCksIG4pCisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oZWxlbS5oYXNoX2NvdW50IGZvciBlbGVtIGluIGQpLCBuKQorICAgICAgICBzLmRpZmZlcmVuY2UoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oZWxlbS5oYXNoX2NvdW50IGZvciBlbGVtIGluIGQpLCBuKQorICAgICAgICBpZiBoYXNhdHRyKHMsICdzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUnKToKKyAgICAgICAgICAgIHMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VtKGVsZW0uaGFzaF9jb3VudCBmb3IgZWxlbSBpbiBkKSwgbikKKyAgICAgICAgZDIgPSBkaWN0LmZyb21rZXlzKHNldChkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oZWxlbS5oYXNoX2NvdW50IGZvciBlbGVtIGluIGQpLCBuKQorICAgICAgICBkMyA9IGRpY3QuZnJvbWtleXMoZnJvemVuc2V0KGQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1bShlbGVtLmhhc2hfY291bnQgZm9yIGVsZW0gaW4gZCksIG4pCisgICAgICAgIGQzID0gZGljdC5mcm9ta2V5cyhmcm96ZW5zZXQoZCksIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oZWxlbS5oYXNoX2NvdW50IGZvciBlbGVtIGluIGQpLCBuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQzLCBkaWN0LmZyb21rZXlzKGQsIDEyMykpCisKKyAgICBkZWYgdGVzdF9jb250YWluZXJfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgICMgQnVnICMzNjgwOiB0cF90cmF2ZXJzZSB3YXMgbm90IGltcGxlbWVudGVkIGZvciBzZXQgaXRlcmF0b3Igb2JqZWN0CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgb2JqID0gQygpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKG9iaikKKyAgICAgICAgY29udGFpbmVyID0gc2V0KFtvYmosIDFdKQorICAgICAgICBvYmoueCA9IGl0ZXIoY29udGFpbmVyKQorICAgICAgICBkZWwgb2JqLCBjb250YWluZXIKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorCitjbGFzcyBUZXN0U2V0KFRlc3RKb2ludE9wcyk6CisgICAgdGhldHlwZSA9IHNldAorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZSgpCisgICAgICAgIHMuX19pbml0X18oc2VsZi53b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNldChzZWxmLndvcmQpKQorICAgICAgICBzLl9faW5pdF9fKHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNldChzZWxmLm90aGVyd29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcy5fX2luaXRfXywgcywgMik7CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcy5fX2luaXRfXywgMSk7CisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcl9pZGVudGl0eShzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShyYW5nZSgzKSkKKyAgICAgICAgdCA9IHNlbGYudGhldHlwZShzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHMpLCBpZCh0KSkKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5zKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYucy5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBzZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zKSwgMCkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGR1cCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIGR1cCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChzZWxmLnMpLCBpZChkdXApKQorCisgICAgZGVmIHRlc3RfYWRkKHNlbGYpOgorICAgICAgICBzZWxmLnMuYWRkKCdRJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignUScsIHNlbGYucykKKyAgICAgICAgZHVwID0gc2VsZi5zLmNvcHkoKQorICAgICAgICBzZWxmLnMuYWRkKCdRJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMsIGR1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuYWRkLCBbXSkKKworICAgIGRlZiB0ZXN0X3JlbW92ZShzZWxmKToKKyAgICAgICAgc2VsZi5zLnJlbW92ZSgnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2EnLCBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnMucmVtb3ZlLCAnUScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnJlbW92ZSwgW10pCisgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoW2Zyb3plbnNldChzZWxmLndvcmQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSwgcykKKyAgICAgICAgcy5yZW1vdmUoc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oc2VsZi50aGV0eXBlKHNlbGYud29yZCksIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnMucmVtb3ZlLCBzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9rZXllcnJvcl91bnBhY2tpbmcoc2VsZik6CisgICAgICAgICMgYnVnOiAgd3d3LnB5dGhvbi5vcmcvc2YvMTU3NjY1NworICAgICAgICBmb3IgdjEgaW4gWydRJywgKDEsKV06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5zLnJlbW92ZSh2MSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciwgZToKKyAgICAgICAgICAgICAgICB2MiA9IGUuYXJnc1swXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjEsIHYyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX2tleWVycm9yX3NldChzZWxmKToKKyAgICAgICAga2V5ID0gc2VsZi50aGV0eXBlKFszLCA0XSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zLnJlbW92ZShrZXkpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGUuYXJnc1swXSBpcyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIktleUVycm9yIHNob3VsZCBiZSB7MH0sIG5vdCB7MX0iLmZvcm1hdChrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmFyZ3NbMF0pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKworICAgIGRlZiB0ZXN0X2Rpc2NhcmQoc2VsZik6CisgICAgICAgIHNlbGYucy5kaXNjYXJkKCdhJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsIHNlbGYucykKKyAgICAgICAgc2VsZi5zLmRpc2NhcmQoJ1EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5kaXNjYXJkLCBbXSkKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShbZnJvemVuc2V0KHNlbGYud29yZCldKQorICAgICAgICBzZWxmLmFzc2VydEluKHNlbGYudGhldHlwZShzZWxmLndvcmQpLCBzKQorICAgICAgICBzLmRpc2NhcmQoc2VsZi50aGV0eXBlKHNlbGYud29yZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oc2VsZi50aGV0eXBlKHNlbGYud29yZCksIHMpCisgICAgICAgIHMuZGlzY2FyZChzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihzZWxmLnMpKToKKyAgICAgICAgICAgIGVsZW0gPSBzZWxmLnMucG9wKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oZWxlbSwgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgc2VsZi5zLnBvcCkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5zLnVwZGF0ZShzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCisgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUGFzc1RocnUsIHNlbGYucy51cGRhdGUsIGNoZWNrX3Bhc3NfdGhydSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy51cGRhdGUsIFtbXV0pCisgICAgICAgIGZvciBwLCBxIGluICgoJ2NkYycsICdhYmNkJyksICgnZWZnZmUnLCAnYWJjZWZnJyksICgnY2NiJywgJ2FiYycpLCAoJ2VmJywgJ2FiY2VmJykpOgorICAgICAgICAgICAgZm9yIEMgaW4gc2V0LCBmcm96ZW5zZXQsIGRpY3QuZnJvbWtleXMsIHN0ciwgdW5pY29kZSwgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYudGhldHlwZSgnYWJjYmEnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy51cGRhdGUoQyhwKSksIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZXQocSkpCisgICAgICAgIGZvciBwIGluICgnY2RjJywgJ2VmZ2ZlJywgJ2NjYicsICdlZicsICdhYmNkYScpOgorICAgICAgICAgICAgcSA9ICdhaGknCisgICAgICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdhYmNiYScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnVwZGF0ZShDKHApLCBDKHEpKSwgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNldChzKSB8IHNldChwKSB8IHNldChxKSkKKworICAgIGRlZiB0ZXN0X2lvcihzZWxmKToKKyAgICAgICAgc2VsZi5zIHw9IHNldChzZWxmLm90aGVyd29yZCkKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5zLmludGVyc2VjdGlvbl91cGRhdGUoc2VsZi5vdGhlcndvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgorICAgICAgICAgICAgaWYgYyBpbiBzZWxmLm90aGVyd29yZCBhbmQgYyBpbiBzZWxmLndvcmQ6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYywgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLmludGVyc2VjdGlvbl91cGRhdGUsIGNoZWNrX3Bhc3NfdGhydSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5pbnRlcnNlY3Rpb25fdXBkYXRlLCBbW11dKQorICAgICAgICBmb3IgcCwgcSBpbiAoKCdjZGMnLCAnYycpLCAoJ2VmZ2ZlJywgJycpLCAoJ2NjYicsICdiYycpLCAoJ2VmJywgJycpKToKKyAgICAgICAgICAgIGZvciBDIGluIHNldCwgZnJvemVuc2V0LCBkaWN0LmZyb21rZXlzLCBzdHIsIHVuaWNvZGUsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoJ2FiY2JhJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuaW50ZXJzZWN0aW9uX3VwZGF0ZShDKHApKSwgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNldChxKSkKKyAgICAgICAgICAgICAgICBzcyA9ICdhYmNiYScKKyAgICAgICAgICAgICAgICBzID0gc2VsZi50aGV0eXBlKHNzKQorICAgICAgICAgICAgICAgIHQgPSAnY2JjJworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pbnRlcnNlY3Rpb25fdXBkYXRlKEMocCksIEModCkpLCBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2V0KCdhYmNiYScpJnNldChwKSZzZXQodCkpCisKKyAgICBkZWYgdGVzdF9pYW5kKHNlbGYpOgorICAgICAgICBzZWxmLnMgJj0gc2V0KHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgorICAgICAgICAgICAgaWYgYyBpbiBzZWxmLm90aGVyd29yZCBhbmQgYyBpbiBzZWxmLndvcmQ6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYywgc2VsZi5zKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CisgICAgICAgIHJldHZhbCA9IHNlbGYucy5kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCisgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICBpZiBjIGluIHNlbGYud29yZCBhbmQgYyBub3QgaW4gc2VsZi5vdGhlcndvcmQ6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjLCBzZWxmLnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYywgc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLmRpZmZlcmVuY2VfdXBkYXRlLCBjaGVja19wYXNzX3RocnUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuZGlmZmVyZW5jZV91cGRhdGUsIFtbXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKKyAgICAgICAgZm9yIHAsIHEgaW4gKCgnY2RjJywgJ2FiJyksICgnZWZnZmUnLCAnYWJjJyksICgnY2NiJywgJ2EnKSwgKCdlZicsICdhYmMnKSk6CisgICAgICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgc3RyLCB1bmljb2RlLCBsaXN0LCB0dXBsZToKKyAgICAgICAgICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdhYmNiYScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmRpZmZlcmVuY2VfdXBkYXRlKEMocCkpLCBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgc2V0KHEpKQorCisgICAgICAgICAgICAgICAgcyA9IHNlbGYudGhldHlwZSgnYWJjZGVmZ2hpaCcpCisgICAgICAgICAgICAgICAgcy5kaWZmZXJlbmNlX3VwZGF0ZSgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZWxmLnRoZXR5cGUoJ2FiY2RlZmdoaWgnKSkKKworICAgICAgICAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoJ2FiY2RlZmdoaWgnKQorICAgICAgICAgICAgICAgIHMuZGlmZmVyZW5jZV91cGRhdGUoQygnYWJhJykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZWxmLnRoZXR5cGUoJ2NkZWZnaGloJykpCisKKyAgICAgICAgICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdhYmNkZWZnaGloJykKKyAgICAgICAgICAgICAgICBzLmRpZmZlcmVuY2VfdXBkYXRlKEMoJ2NkYycpLCBDKCdhYmEnKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHNlbGYudGhldHlwZSgnZWZnaGloJykpCisKKyAgICBkZWYgdGVzdF9pc3ViKHNlbGYpOgorICAgICAgICBzZWxmLnMgLT0gc2V0KHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgorICAgICAgICAgICAgaWYgYyBpbiBzZWxmLndvcmQgYW5kIGMgbm90IGluIHNlbGYub3RoZXJ3b3JkOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKworICAgIGRlZiB0ZXN0X3N5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCisgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CisgICAgICAgICAgICBpZiAoYyBpbiBzZWxmLndvcmQpIF4gKGMgaW4gc2VsZi5vdGhlcndvcmQpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUGFzc1RocnUsIHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsIGNoZWNrX3Bhc3NfdGhydSgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsIFtbXV0pCisgICAgICAgIGZvciBwLCBxIGluICgoJ2NkYycsICdhYmQnKSwgKCdlZmdmZScsICdhYmNlZmcnKSwgKCdjY2InLCAnYScpLCAoJ2VmJywgJ2FiY2VmJykpOgorICAgICAgICAgICAgZm9yIEMgaW4gc2V0LCBmcm96ZW5zZXQsIGRpY3QuZnJvbWtleXMsIHN0ciwgdW5pY29kZSwgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICAgICAgcyA9IHNlbGYudGhldHlwZSgnYWJjYmEnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoQyhwKSksIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZXQocSkpCisKKyAgICBkZWYgdGVzdF9peG9yKHNlbGYpOgorICAgICAgICBzZWxmLnMgXj0gc2V0KHNlbGYub3RoZXJ3b3JkKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgorICAgICAgICAgICAgaWYgKGMgaW4gc2VsZi53b3JkKSBeIChjIGluIHNlbGYub3RoZXJ3b3JkKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX29uX3NlbGYoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnMuY29weSgpCisgICAgICAgIHQgfD0gdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHNlbGYucykKKyAgICAgICAgdCAmPSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi5zKQorICAgICAgICB0IC09IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBzZWxmLnRoZXR5cGUoKSkKKyAgICAgICAgdCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgdCBePSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi50aGV0eXBlKCkpCisKKyAgICBkZWYgdGVzdF93ZWFrcmVmKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKCdnYWxsYWhhZCcpCisgICAgICAgIHAgPSB3ZWFrcmVmLnByb3h5KHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHApLCBzdHIocykpCisgICAgICAgIHMgPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJlZmVyZW5jZUVycm9yLCBzdHIsIHApCisKKyAgICAjIEMgQVBJIHRlc3Qgb25seSBhdmFpbGFibGUgaW4gYSBkZWJ1ZyBidWlsZAorICAgIGlmIGhhc2F0dHIoc2V0LCAidGVzdF9jX2FwaSIpOgorICAgICAgICBkZWYgdGVzdF9jX2FwaShzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KCkudGVzdF9jX2FwaSgpLCBUcnVlKQorCitjbGFzcyBTZXRTdWJjbGFzcyhzZXQpOgorICAgIHBhc3MKKworY2xhc3MgVGVzdFNldFN1YmNsYXNzKFRlc3RTZXQpOgorICAgIHRoZXR5cGUgPSBTZXRTdWJjbGFzcworCitjbGFzcyBTZXRTdWJjbGFzc1dpdGhLZXl3b3JkQXJncyhzZXQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpdGVyYWJsZT1bXSwgbmV3YXJnPU5vbmUpOgorICAgICAgICBzZXQuX19pbml0X18oc2VsZiwgaXRlcmFibGUpCisKK2NsYXNzIFRlc3RTZXRTdWJjbGFzc1dpdGhLZXl3b3JkQXJncyhUZXN0U2V0KToKKworICAgIGRlZiB0ZXN0X2tleXdvcmRzX2luX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICAnU0YgYnVnICMxNDg2NjYzIC0tIHRoaXMgdXNlZCB0byBlcnJvbmVvdXNseSByYWlzZSBhIFR5cGVFcnJvcicKKyAgICAgICAgU2V0U3ViY2xhc3NXaXRoS2V5d29yZEFyZ3MobmV3YXJnPTEpCisKK2NsYXNzIFRlc3RGcm96ZW5TZXQoVGVzdEpvaW50T3BzKToKKyAgICB0aGV0eXBlID0gZnJvemVuc2V0CisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKHNlbGYud29yZCkKKyAgICAgICAgcy5fX2luaXRfXyhzZWxmLm90aGVyd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZXQoc2VsZi53b3JkKSkKKworICAgIGRlZiB0ZXN0X3NpbmdsZXRvbl9lbXB0eV9mcm96ZW5zZXQoc2VsZik6CisgICAgICAgIGYgPSBmcm96ZW5zZXQoKQorICAgICAgICBlZnMgPSBbZnJvemVuc2V0KCksIGZyb3plbnNldChbXSksIGZyb3plbnNldCgoKSksIGZyb3plbnNldCgnJyksCisgICAgICAgICAgICAgICBmcm96ZW5zZXQoKSwgZnJvemVuc2V0KFtdKSwgZnJvemVuc2V0KCgpKSwgZnJvemVuc2V0KCcnKSwKKyAgICAgICAgICAgICAgIGZyb3plbnNldCh4cmFuZ2UoMCkpLCBmcm96ZW5zZXQoZnJvemVuc2V0KCkpLAorICAgICAgICAgICAgICAgZnJvemVuc2V0KGYpLCBmXQorICAgICAgICAjIEFsbCBvZiB0aGUgZW1wdHkgZnJvemVuc2V0cyBzaG91bGQgaGF2ZSBqdXN0IG9uZSBpZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChtYXAoaWQsIGVmcykpKSwgMSkKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yX2lkZW50aXR5KHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKHJhbmdlKDMpKQorICAgICAgICB0ID0gc2VsZi50aGV0eXBlKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQocyksIGlkKHQpKQorCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHNlbGYudGhldHlwZSgnYWJjZGViJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2goc2VsZi50aGV0eXBlKCdlYmVjZGEnKSkpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBhbGwgcGVybXV0YXRpb25zIGdpdmUgdGhlIHNhbWUgaGFzaCB2YWx1ZQorICAgICAgICBuID0gMTAwCisgICAgICAgIHNlcSA9IFtyYW5kcmFuZ2UobikgZm9yIGkgaW4geHJhbmdlKG4pXQorICAgICAgICByZXN1bHRzID0gc2V0KCkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwMCk6CisgICAgICAgICAgICBzaHVmZmxlKHNlcSkKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKGhhc2goc2VsZi50aGV0eXBlKHNlcSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHRzKSwgMSkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGR1cCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpZChzZWxmLnMpLCBpZChkdXApKQorCisgICAgZGVmIHRlc3RfZnJvemVuX2FzX2RpY3RrZXkoc2VsZik6CisgICAgICAgIHNlcSA9IHJhbmdlKDEwKSArIGxpc3QoJ2FiY2RlZmcnKSArIFsnYXBwbGUnXQorICAgICAgICBrZXkxID0gc2VsZi50aGV0eXBlKHNlcSkKKyAgICAgICAga2V5MiA9IHNlbGYudGhldHlwZShyZXZlcnNlZChzZXEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleTEsIGtleTIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoa2V5MSksIGlkKGtleTIpKQorICAgICAgICBkID0ge30KKyAgICAgICAgZFtrZXkxXSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtrZXkyXSwgNDIpCisKKyAgICBkZWYgdGVzdF9oYXNoX2NhY2hpbmcoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLnRoZXR5cGUoJ2FiY2RjZGEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goZiksIGhhc2goZikpCisKKyAgICBkZWYgdGVzdF9oYXNoX2VmZmVjdGl2ZW5lc3Moc2VsZik6CisgICAgICAgIG4gPSAxMworICAgICAgICBoYXNodmFsdWVzID0gc2V0KCkKKyAgICAgICAgYWRkaGFzaHZhbHVlID0gaGFzaHZhbHVlcy5hZGQKKyAgICAgICAgZWxlbW1hc2tzID0gWyhpKzEsIDE8PGkpIGZvciBpIGluIHJhbmdlKG4pXQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMioqbik6CisgICAgICAgICAgICBhZGRoYXNodmFsdWUoaGFzaChmcm96ZW5zZXQoW2UgZm9yIGUsIG0gaW4gZWxlbW1hc2tzIGlmIG0maV0pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaGFzaHZhbHVlcyksIDIqKm4pCisKK2NsYXNzIEZyb3plblNldFN1YmNsYXNzKGZyb3plbnNldCk6CisgICAgcGFzcworCitjbGFzcyBUZXN0RnJvemVuU2V0U3ViY2xhc3MoVGVzdEZyb3plblNldCk6CisgICAgdGhldHlwZSA9IEZyb3plblNldFN1YmNsYXNzCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcl9pZGVudGl0eShzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudGhldHlwZShyYW5nZSgzKSkKKyAgICAgICAgdCA9IHNlbGYudGhldHlwZShzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHMpLCBpZCh0KSkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIGR1cCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChzZWxmLnMpLCBpZChkdXApKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2VtcHR5X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50aGV0eXBlKCkKKyAgICAgICAgdCA9IHNlbGYudGhldHlwZShzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHQpCisKKyAgICBkZWYgdGVzdF9zaW5nbGV0b25fZW1wdHlfZnJvemVuc2V0KHNlbGYpOgorICAgICAgICBGcm96ZW5zZXQgPSBzZWxmLnRoZXR5cGUKKyAgICAgICAgZiA9IGZyb3plbnNldCgpCisgICAgICAgIEYgPSBGcm96ZW5zZXQoKQorICAgICAgICBlZnMgPSBbRnJvemVuc2V0KCksIEZyb3plbnNldChbXSksIEZyb3plbnNldCgoKSksIEZyb3plbnNldCgnJyksCisgICAgICAgICAgICAgICBGcm96ZW5zZXQoKSwgRnJvemVuc2V0KFtdKSwgRnJvemVuc2V0KCgpKSwgRnJvemVuc2V0KCcnKSwKKyAgICAgICAgICAgICAgIEZyb3plbnNldCh4cmFuZ2UoMCkpLCBGcm96ZW5zZXQoRnJvemVuc2V0KCkpLAorICAgICAgICAgICAgICAgRnJvemVuc2V0KGZyb3plbnNldCgpKSwgZiwgRiwgRnJvemVuc2V0KGYpLCBGcm96ZW5zZXQoRildCisgICAgICAgICMgQWxsIGVtcHR5IGZyb3plbnNldCBzdWJjbGFzcyBpbnN0YW5jZXMgc2hvdWxkIGhhdmUgZGlmZmVyZW50IGlkcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQobWFwKGlkLCBlZnMpKSksIGxlbihlZnMpKQorCisjIFRlc3RzIHRha2VuIGZyb20gdGVzdF9zZXRzLnB5ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitlbXB0eV9zZXQgPSBzZXQoKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RCYXNpY09wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJlcHIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoc2VsZi5zZXQpLCBzZWxmLnJlcHIpCisKKyAgICBkZWYgY2hlY2tfcmVwcl9hZ2FpbnN0X3ZhbHVlcyhzZWxmKToKKyAgICAgICAgdGV4dCA9IHJlcHIoc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXh0LnN0YXJ0c3dpdGgoJ3snKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRleHQuZW5kc3dpdGgoJ30nKSkKKworICAgICAgICByZXN1bHQgPSB0ZXh0WzE6LTFdLnNwbGl0KCcsICcpCisgICAgICAgIHJlc3VsdC5zb3J0KCkKKyAgICAgICAgc29ydGVkX3JlcHJfdmFsdWVzID0gW3JlcHIodmFsdWUpIGZvciB2YWx1ZSBpbiBzZWxmLnZhbHVlc10KKyAgICAgICAgc29ydGVkX3JlcHJfdmFsdWVzLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc29ydGVkX3JlcHJfdmFsdWVzKQorCisgICAgZGVmIHRlc3RfcHJpbnQoc2VsZik6CisgICAgICAgIGZvID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmludCA+PiBmbywgc2VsZi5zZXQsCisgICAgICAgICAgICBmby5jbG9zZSgpCisgICAgICAgICAgICBmbyA9IG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZCgpLCByZXByKHNlbGYuc2V0KSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvLmNsb3NlKCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2xlbmd0aChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zZXQpLCBzZWxmLmxlbmd0aCkKKworICAgIGRlZiB0ZXN0X3NlbGZfZXF1YWxpdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3RfZXF1aXZhbGVudF9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LmNvcHkoKSwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9zZWxmX3VuaW9uKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3VuaW9uKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCB8IGVtcHR5X3NldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF91bmlvbl9lbXB0eShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gZW1wdHlfc2V0IHwgc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3Rfc2VsZl9pbnRlcnNlY3Rpb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfaW50ZXJzZWN0aW9uKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIGVtcHR5X3NldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX2VtcHR5KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBlbXB0eV9zZXQgJiBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3Rfc2VsZl9pc2Rpc2pvaW50KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldC5pc2Rpc2pvaW50KHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbm90IHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3RfZW1wdHlfaXNkaXNqb2ludChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQuaXNkaXNqb2ludChlbXB0eV9zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBUcnVlKQorCisgICAgZGVmIHRlc3RfaXNkaXNqb2ludF9lbXB0eShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gZW1wdHlfc2V0LmlzZGlzam9pbnQoc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc2VsZl9zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3RfZW1wdHlfc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gZW1wdHlfc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLnNldCkKKworICAgIGRlZiB0ZXN0X3NlbGZfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgLSBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3RfZW1wdHlfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgLSBlbXB0eV9zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfZGlmZmVyZW5jZV9yZXYoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IGVtcHR5X3NldCAtIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CisgICAgICAgIGZvciB2IGluIHNlbGYuc2V0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih2LCBzZWxmLnZhbHVlcykKKyAgICAgICAgc2V0aXRlciA9IGl0ZXIoc2VsZi5zZXQpCisgICAgICAgICMgbm90ZTogX19sZW5ndGhfaGludF9fIGlzIGFuIGludGVybmFsIHVuZG9jdW1lbnRlZCBBUEksCisgICAgICAgICMgZG9uJ3QgcmVseSBvbiBpdCBpbiB5b3VyIG93biBwcm9ncmFtcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldGl0ZXIuX19sZW5ndGhfaGludF9fKCksIGxlbihzZWxmLnNldCkpCisKKyAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKKyAgICAgICAgcCA9IHBpY2tsZS5kdW1wcyhzZWxmLnNldCkKKyAgICAgICAgY29weSA9IHBpY2tsZS5sb2FkcyhwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBjb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAhPSAlcyIgJSAoc2VsZi5zZXQsIGNvcHkpKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc0VtcHR5KFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJlbXB0eSBzZXQiCisgICAgICAgIHNlbGYudmFsdWVzID0gW10KKyAgICAgICAgc2VsZi5zZXQgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDAKKyAgICAgICAgc2VsZi5yZXByICAgPSAic2V0KFtdKSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0QmFzaWNPcHNTaW5nbGV0b24oVGVzdEJhc2ljT3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZSAgID0gInVuaXQgc2V0IChudW1iZXIpIgorICAgICAgICBzZWxmLnZhbHVlcyA9IFszXQorICAgICAgICBzZWxmLnNldCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gMQorICAgICAgICBzZWxmLnJlcHIgICA9ICJzZXQoWzNdKSIKKworICAgIGRlZiB0ZXN0X2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEluKDMsIHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3Rfbm90X2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDIsIHNlbGYuc2V0KQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc1R1cGxlKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJ1bml0IHNldCAodHVwbGUpIgorICAgICAgICBzZWxmLnZhbHVlcyA9IFsoMCwgInplcm8iKV0KKyAgICAgICAgc2VsZi5zZXQgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDEKKyAgICAgICAgc2VsZi5yZXByICAgPSAic2V0KFsoMCwgJ3plcm8nKV0pIgorCisgICAgZGVmIHRlc3RfaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oKDAsICJ6ZXJvIiksIHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3Rfbm90X2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDksIHNlbGYuc2V0KQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc1RyaXBsZShUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAidHJpcGxlIHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbMCwgInplcm8iLCBvcGVyYXRvci5hZGRdCisgICAgICAgIHNlbGYuc2V0ICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSAzCisgICAgICAgIHNlbGYucmVwciAgID0gTm9uZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc1N0cmluZyhUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAic3RyaW5nIHNldCIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbImEiLCAiYiIsICJjIl0KKyAgICAgICAgc2VsZi5zZXQgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDMKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcmVwcl9hZ2FpbnN0X3ZhbHVlcygpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzVW5pY29kZShUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAidW5pY29kZSBzZXQiCisgICAgICAgIHNlbGYudmFsdWVzID0gW3UiYSIsIHUiYiIsIHUiYyJdCisgICAgICAgIHNlbGYuc2V0ICAgID0gc2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSAzCisKKyAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3JlcHJfYWdhaW5zdF92YWx1ZXMoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RCYXNpY09wc01peGVkU3RyaW5nVW5pY29kZShUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAic3RyaW5nIGFuZCBieXRlcyBzZXQiCisgICAgICAgIHNlbGYudmFsdWVzID0gWyJhIiwgImIiLCB1ImEiLCB1ImIiXQorICAgICAgICBzZWxmLnNldCAgICA9IHNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBzZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gNAorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfcmVwcl9hZ2FpbnN0X3ZhbHVlcygpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworZGVmIGJhZGl0ZXIoKToKKyAgICByYWlzZSBUeXBlRXJyb3IKKyAgICB5aWVsZCBUcnVlCisKK2RlZiBnb29kaXRlcigpOgorICAgIHlpZWxkIFRydWUKKworY2xhc3MgVGVzdEV4Y2VwdGlvblByb3BhZ2F0aW9uKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJTRiA2MjgyNDY6ICBTZXQgY29uc3RydWN0b3Igc2hvdWxkIG5vdCB0cmFwIGl0ZXJhdG9yIFR5cGVFcnJvcnMiIiIKKworICAgIGRlZiB0ZXN0X2luc3RhbmNlV2l0aEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXQsIGJhZGl0ZXIoKSkKKworICAgIGRlZiB0ZXN0X2luc3RhbmNlc1dpdGhvdXRFeGNlcHRpb24oc2VsZik6CisgICAgICAgICMgQWxsIG9mIHRoZXNlIGl0ZXJhYmxlcyBzaG91bGQgbG9hZCB3aXRob3V0IGV4Y2VwdGlvbi4KKyAgICAgICAgc2V0KFsxLDIsM10pCisgICAgICAgIHNldCgoMSwyLDMpKQorICAgICAgICBzZXQoeydvbmUnOjEsICd0d28nOjIsICd0aHJlZSc6M30pCisgICAgICAgIHNldCh4cmFuZ2UoMykpCisgICAgICAgIHNldCgnYWJjJykKKyAgICAgICAgc2V0KGdvb2RpdGVyKCkpCisKKyAgICBkZWYgdGVzdF9jaGFuZ2luZ1NpemVXaGlsZUl0ZXJhdGluZyhzZWxmKToKKyAgICAgICAgcyA9IHNldChbMSwyLDNdKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiBzOgorICAgICAgICAgICAgICAgIHMudXBkYXRlKFs0XSkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIHdoZW4gY2hhbmdpbmcgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uIikKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0U2V0T2ZTZXRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgaW5uZXIgPSBmcm96ZW5zZXQoWzFdKQorICAgICAgICBvdXRlciA9IHNldChbaW5uZXJdKQorICAgICAgICBlbGVtZW50ID0gb3V0ZXIucG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGVsZW1lbnQpLCBmcm96ZW5zZXQpCisgICAgICAgIG91dGVyLmFkZChpbm5lcikgICAgICAgICMgUmVidWlsZCBzZXQgb2Ygc2V0cyB3aXRoIC5hZGQgbWV0aG9kCisgICAgICAgIG91dGVyLnJlbW92ZShpbm5lcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRlciwgc2V0KCkpICAgIyBWZXJpZnkgdGhhdCByZW1vdmUgd29ya2VkCisgICAgICAgIG91dGVyLmRpc2NhcmQoaW5uZXIpICAgICMgQWJzZW5jZSBvZiBLZXlFcnJvciBpbmRpY2F0ZXMgd29ya2luZyBmaW5lCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEJpbmFyeU9wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IHNldCgoMiwgNCwgNikpCisKKyAgICBkZWYgdGVzdF9lcShzZWxmKTogICAgICAgICAgICAgICMgU0YgYnVnIDY0MzExNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoezI6MSw0OjMsNjo1fSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9zdWJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgc2V0KFsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNldCgoMiwgNCwgNikpKQorCisgICAgZGVmIHRlc3RfdW5pb25fc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgc2V0KFsyLCA0LCA2LCA4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3RfdW5pb25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBzZXQoWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFsyLCAzLCA0LCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBzZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fc3Vic2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIHNldCgoMiwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZXQoKDIsIDQpKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdXBlcnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBzZXQoWzIsIDQsIDYsIDhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFsyLCA0LCA2XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBzZXQoWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2V0KFs0XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgc2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X2lzZGlzam9pbnRfc3Vic2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldC5pc2Rpc2pvaW50KHNldCgoMiwgNCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9pc2Rpc2pvaW50X3N1cGVyc2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldC5pc2Rpc2pvaW50KHNldChbMiwgNCwgNiwgOF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgRmFsc2UpCisKKyAgICBkZWYgdGVzdF9pc2Rpc2pvaW50X292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0LmlzZGlzam9pbnQoc2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBGYWxzZSkKKworICAgIGRlZiB0ZXN0X2lzZGlzam9pbnRfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0LmlzZGlzam9pbnQoc2V0KFs4XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBUcnVlKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfc3Vic2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIHNldCgoMiwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZXQoWzZdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIHNldCgoMiwgNCwgNiwgOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZXQoWzhdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gc2V0KCgzLCA0LCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNldChbMiwgMywgNSwgNl0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IF4gc2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3RfY21wKHNlbGYpOgorICAgICAgICBhLCBiID0gc2V0KCdhJyksIHNldCgnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBhLCBiKQorCisgICAgICAgICMgWW91IGNhbiB2aWV3IHRoaXMgYXMgYSBidWdsZXQ6ICBjbXAoYSwgYSkgZG9lcyBub3QgcmFpc2UgVHlwZUVycm9yLAorICAgICAgICAjIGJlY2F1c2UgX19lcV9fIGlzIHRyaWVkIGJlZm9yZSBfX2NtcF9fLCBhbmQgYS5fX2VxX18oYSkgcmV0dXJucyBUcnVlLAorICAgICAgICAjIHdoaWNoIFB5dGhvbiB0aGlua3MgaXMgZ29vZCBlbm91Z2ggdG8gc3ludGhlc2l6ZSBhIGNtcCgpIHJlc3VsdAorICAgICAgICAjIHdpdGhvdXQgY2FsbGluZyBfX2NtcF9fLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChhLCBhKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgYSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCAiYWJjIiwgYSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0VXBkYXRlT3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gc2V0KCgyLCA0LCA2KSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX3N1YnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgfD0gc2V0KFsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KCgyLCA0LCA2KSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9zdXBlcnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgfD0gc2V0KFsyLCA0LCA2LCA4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCB8PSBzZXQoWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzIsIDMsIDQsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCB8PSBzZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzIsIDQsIDYsIDhdKSkKKworICAgIGRlZiB0ZXN0X3VuaW9uX21ldGhvZF9jYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnNldC51cGRhdGUoc2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgMywgNCwgNSwgNl0pKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3N1YnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgJj0gc2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KCgyLCA0KSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICY9IHNldChbMiwgNCwgNiwgOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgNCwgNl0pKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICY9IHNldChbMywgNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbNF0pKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAmPSBzZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fbWV0aG9kX2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmludGVyc2VjdGlvbl91cGRhdGUoc2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbNF0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfc3Vic2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCBePSBzZXQoKDIsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzZdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCBePSBzZXQoKDIsIDQsIDYsIDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzhdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IF49IHNldCgoMywgNCwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgMywgNSwgNl0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Vfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IF49IHNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2VfbWV0aG9kX2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZXQoWzMsIDQsIDVdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFsyLCAzLCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3N1YnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgLT0gc2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KFs2XSkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCAtPSBzZXQoKDIsIDQsIDYsIDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoW10pKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAtPSBzZXQoKDMsIDQsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoWzIsIDZdKSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Vfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IC09IHNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgNCwgNl0pKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9tZXRob2RfY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZV91cGRhdGUoc2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChbMiwgNl0pKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RNdXRhdGUodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbImEiLCAiYiIsICJjIl0KKyAgICAgICAgc2VsZi5zZXQgPSBzZXQoc2VsZi52YWx1ZXMpCisKKyAgICBkZWYgdGVzdF9hZGRfcHJlc2VudChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuYWRkKCJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KCJhYmMiKSkKKworICAgIGRlZiB0ZXN0X2FkZF9hYnNlbnQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmFkZCgiZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldCgiYWJjZCIpKQorCisgICAgZGVmIHRlc3RfYWRkX3VudGlsX2Z1bGwoc2VsZik6CisgICAgICAgIHRtcCA9IHNldCgpCisgICAgICAgIGV4cGVjdGVkX2xlbiA9IDAKKyAgICAgICAgZm9yIHYgaW4gc2VsZi52YWx1ZXM6CisgICAgICAgICAgICB0bXAuYWRkKHYpCisgICAgICAgICAgICBleHBlY3RlZF9sZW4gKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odG1wKSwgZXhwZWN0ZWRfbGVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRtcCwgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfcHJlc2VudChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQucmVtb3ZlKCJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KCJhYyIpKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX2Fic2VudChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQucmVtb3ZlKCJkIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVtb3ZpbmcgbWlzc2luZyBlbGVtZW50IHNob3VsZCBoYXZlIHJhaXNlZCBMb29rdXBFcnJvciIpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3JlbW92ZV91bnRpbF9lbXB0eShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWRfbGVuID0gbGVuKHNlbGYuc2V0KQorICAgICAgICBmb3IgdiBpbiBzZWxmLnZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuc2V0LnJlbW92ZSh2KQorICAgICAgICAgICAgZXhwZWN0ZWRfbGVuIC09IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc2V0KSwgZXhwZWN0ZWRfbGVuKQorCisgICAgZGVmIHRlc3RfZGlzY2FyZF9wcmVzZW50KHNlbGYpOgorICAgICAgICBzZWxmLnNldC5kaXNjYXJkKCJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KCJhYiIpKQorCisgICAgZGVmIHRlc3RfZGlzY2FyZF9hYnNlbnQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmRpc2NhcmQoImQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZXQoImFiYyIpKQorCisgICAgZGVmIHRlc3RfY2xlYXIoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmNsZWFyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zZXQpLCAwKQorCisgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgorICAgICAgICBwb3BwZWQgPSB7fQorICAgICAgICB3aGlsZSBzZWxmLnNldDoKKyAgICAgICAgICAgIHBvcHBlZFtzZWxmLnNldC5wb3AoKV0gPSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvcHBlZCksIGxlbihzZWxmLnZhbHVlcykpCisgICAgICAgIGZvciB2IGluIHNlbGYudmFsdWVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih2LCBwb3BwZWQpCisKKyAgICBkZWYgdGVzdF91cGRhdGVfZW1wdHlfdHVwbGUoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnVwZGF0ZSgoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2V0KHNlbGYudmFsdWVzKSkKKworICAgIGRlZiB0ZXN0X3VwZGF0ZV91bml0X3R1cGxlX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnVwZGF0ZSgoImEiLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChzZWxmLnZhbHVlcykpCisKKyAgICBkZWYgdGVzdF91cGRhdGVfdW5pdF90dXBsZV9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQudXBkYXRlKCgiYSIsICJ6IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIHNldChzZWxmLnZhbHVlcyArIFsieiJdKSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0U3Vic2V0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBjYXNlMm1ldGhvZCA9IHsiPD0iOiAiaXNzdWJzZXQiLAorICAgICAgICAgICAgICAgICAgICI+PSI6ICJpc3N1cGVyc2V0IiwKKyAgICAgICAgICAgICAgICAgIH0KKworICAgIHJldmVyc2UgPSB7Ij09IjogIj09IiwKKyAgICAgICAgICAgICAgICIhPSI6ICIhPSIsCisgICAgICAgICAgICAgICAiPCI6ICAiPiIsCisgICAgICAgICAgICAgICAiPiI6ICAiPCIsCisgICAgICAgICAgICAgICAiPD0iOiAiPj0iLAorICAgICAgICAgICAgICAgIj49IjogIjw9IiwKKyAgICAgICAgICAgICAgfQorCisgICAgZGVmIHRlc3RfaXNzdWJzZXQoc2VsZik6CisgICAgICAgIHggPSBzZWxmLmxlZnQKKyAgICAgICAgeSA9IHNlbGYucmlnaHQKKyAgICAgICAgZm9yIGNhc2UgaW4gIiE9IiwgIj09IiwgIjwiLCAiPD0iLCAiPiIsICI+PSI6CisgICAgICAgICAgICBleHBlY3RlZCA9IGNhc2UgaW4gc2VsZi5jYXNlcworICAgICAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgaW5maXggc3BlbGxpbmcuCisgICAgICAgICAgICByZXN1bHQgPSBldmFsKCJ4IiArIGNhc2UgKyAieSIsIGxvY2FscygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICAgICAgIyBUZXN0IHRoZSAiZnJpZW5kbHkiIG1ldGhvZC1uYW1lIHNwZWxsaW5nLCBpZiBvbmUgZXhpc3RzLgorICAgICAgICAgICAgaWYgY2FzZSBpbiBUZXN0U3Vic2V0cy5jYXNlMm1ldGhvZDoKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHgsIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kW2Nhc2VdKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZCh5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKworICAgICAgICAgICAgIyBOb3cgZG8gdGhlIHNhbWUgZm9yIHRoZSBvcGVyYW5kcyByZXZlcnNlZC4KKyAgICAgICAgICAgIHJjYXNlID0gVGVzdFN1YnNldHMucmV2ZXJzZVtjYXNlXQorICAgICAgICAgICAgcmVzdWx0ID0gZXZhbCgieSIgKyByY2FzZSArICJ4IiwgbG9jYWxzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisgICAgICAgICAgICBpZiByY2FzZSBpbiBUZXN0U3Vic2V0cy5jYXNlMm1ldGhvZDoKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHksIFRlc3RTdWJzZXRzLmNhc2UybWV0aG9kW3JjYXNlXSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QoeCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdWJzZXRFcXVhbEVtcHR5KFRlc3RTdWJzZXRzKToKKyAgICBsZWZ0ICA9IHNldCgpCisgICAgcmlnaHQgPSBzZXQoKQorICAgIG5hbWUgID0gImJvdGggZW1wdHkiCisgICAgY2FzZXMgPSAiPT0iLCAiPD0iLCAiPj0iCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdFN1YnNldEVxdWFsTm9uRW1wdHkoVGVzdFN1YnNldHMpOgorICAgIGxlZnQgID0gc2V0KFsxLCAyXSkKKyAgICByaWdodCA9IHNldChbMSwgMl0pCisgICAgbmFtZSAgPSAiZXF1YWwgcGFpciIKKyAgICBjYXNlcyA9ICI9PSIsICI8PSIsICI+PSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0U3Vic2V0RW1wdHlOb25FbXB0eShUZXN0U3Vic2V0cyk6CisgICAgbGVmdCAgPSBzZXQoKQorICAgIHJpZ2h0ID0gc2V0KFsxLCAyXSkKKyAgICBuYW1lICA9ICJvbmUgZW1wdHksIG9uZSBub24tZW1wdHkiCisgICAgY2FzZXMgPSAiIT0iLCAiPCIsICI8PSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0U3Vic2V0UGFydGlhbChUZXN0U3Vic2V0cyk6CisgICAgbGVmdCAgPSBzZXQoWzFdKQorICAgIHJpZ2h0ID0gc2V0KFsxLCAyXSkKKyAgICBuYW1lICA9ICJvbmUgYSBub24tZW1wdHkgcHJvcGVyIHN1YnNldCBvZiBvdGhlciIKKyAgICBjYXNlcyA9ICIhPSIsICI8IiwgIjw9IgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdWJzZXROb25PdmVybGFwKFRlc3RTdWJzZXRzKToKKyAgICBsZWZ0ICA9IHNldChbMV0pCisgICAgcmlnaHQgPSBzZXQoWzJdKQorICAgIG5hbWUgID0gIm5laXRoZXIgZW1wdHksIG5laXRoZXIgY29udGFpbnMiCisgICAgY2FzZXMgPSAiIT0iCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZXFfbmUoc2VsZik6CisgICAgICAgICMgVW5saWtlIHRoZSBvdGhlcnMsIHRoaXMgaXMgdGVzdGluZyB0aGF0ID09IGFuZCAhPSAqYXJlKiBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYub3RoZXIgPT0gc2VsZi5zZXQsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0ID09IHNlbGYub3RoZXIsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYub3RoZXIgIT0gc2VsZi5zZXQsIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQgIT0gc2VsZi5vdGhlciwgVHJ1ZSkKKworICAgIGRlZiB0ZXN0X2dlX2d0X2xlX2x0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPCBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgPD0gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0ID4gc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0ID49IHNlbGYub3RoZXIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPCBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgPD0gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyID4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyID49IHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3RfdXBkYXRlX29wZXJhdG9yKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldCB8PSBzZWxmLm90aGVyCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF91cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQudXBkYXRlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LnVwZGF0ZSwgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X3VuaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgfCBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciB8IHNlbGYuc2V0KQorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LnVuaW9uKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LnVuaW9uLCBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQgJj0gc2VsZi5vdGhlcgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb25fdXBkYXRlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb25fdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0ICYgc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgJiBzZWxmLnNldCkKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb24oc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQuaW50ZXJzZWN0aW9uLCBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2VfdXBkYXRlX29wZXJhdG9yKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNldCBePSBzZWxmLm90aGVyCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4cGVjdGVkIFR5cGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCBeIHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIF4gc2VsZi5zZXQpCisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2Uoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2UsIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQgLT0gc2VsZi5vdGhlcgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0LmRpZmZlcmVuY2VfdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCAtIHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIC0gc2VsZi5zZXQpCisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuZGlmZmVyZW5jZShzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC5kaWZmZXJlbmNlLCBzZWxmLm90aGVyKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c051bWVyaWMoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IHNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSAxOQorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IEZhbHNlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzRGljdChUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gc2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9IHsxOjIsIDM6NH0KKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzT3BlcmF0b3IoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IHNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSBvcGVyYXRvci5hZGQKKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBGYWxzZQorCisgICAgZGVmIHRlc3RfZ2VfZ3RfbGVfbHQoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHN1cGVyKFRlc3RPbmx5U2V0c09wZXJhdG9yLCBzZWxmKS50ZXN0X2dlX2d0X2xlX2x0KCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNUdXBsZShUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gc2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9ICgyLCA0LCA2KQorICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNTdHJpbmcoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IHNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSAnYWJjJworICAgICAgICBzZWxmLm90aGVySXNJdGVyYWJsZSA9IFRydWUKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNHZW5lcmF0b3IoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDAsIDEwLCAyKToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgIHNlbGYuc2V0ICAgPSBzZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gZ2VuKCkKKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdENvcHlpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZHVwID0gbGlzdChzZWxmLnNldC5jb3B5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cCksIGxlbihzZWxmLnNldCkpCisgICAgICAgIGZvciBlbCBpbiBzZWxmLnNldDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZWwsIGR1cCkKKyAgICAgICAgICAgIHBvcyA9IGR1cC5pbmRleChlbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMoZWwsIGR1cC5wb3AocG9zKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShkdXApCisKKyAgICBkZWYgdGVzdF9kZWVwX2NvcHkoc2VsZik6CisgICAgICAgIGR1cCA9IGNvcHkuZGVlcGNvcHkoc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoZHVwLCBzZWxmLnNldCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0Q29weWluZ0VtcHR5KFRlc3RDb3B5aW5nKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gc2V0KCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0Q29weWluZ1NpbmdsZXRvbihUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IHNldChbImhlbGxvIl0pCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENvcHlpbmdUcmlwbGUoVGVzdENvcHlpbmcpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgPSBzZXQoWyJ6ZXJvIiwgMCwgTm9uZV0pCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENvcHlpbmdUdXBsZShUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IHNldChbKDEsIDIpXSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0Q29weWluZ05lc3RlZChUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IHNldChbKCgxLCAyKSwgKDMsIDQpKV0pCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdElkZW50aXRpZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5hID0gc2V0KCdhYnJhY2FkYWJyYScpCisgICAgICAgIHNlbGYuYiA9IHNldCgnYWxhY2F6YW0nKQorCisgICAgZGVmIHRlc3RfYmlub3BzVnNTdWJzZXRzKHNlbGYpOgorICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgLSBiIDwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIgLSBhIDwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgfCBiID4gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgfCBiID4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgXiBiIDwgYSB8IGIpCisKKyAgICBkZWYgdGVzdF9jb21tdXRhdGl2aXR5KHNlbGYpOgorICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhJmIsIGImYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhfGIsIGJ8YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhXmIsIGJeYSkKKyAgICAgICAgaWYgYSAhPSBiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLWIsIGItYSkKKworICAgIGRlZiB0ZXN0X3N1bW1hdGlvbnMoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBzdW1zIG9mIHBhcnRzIGVxdWFsIHRoZSB3aG9sZQorICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYSZiKXwoYi1hKSwgYXxiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhJmIpfChhXmIpLCBhfGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXwoYi1hKSwgYXxiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLWIpfGIsIGF8YikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYSZiKSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYi1hKXwoYSZiKSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXwoYi1hKSwgYV5iKQorCisgICAgZGVmIHRlc3RfZXhjbHVzaW9uKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgaW52ZXJzZSBvcGVyYXRpb25zIHNob3cgbm9uLW92ZXJsYXAKKyAgICAgICAgYSwgYiwgemVybyA9IHNlbGYuYSwgc2VsZi5iLCBzZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhLWIpJmIsIHplcm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGItYSkmYSwgemVybykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSZiKSYoYV5iKSwgemVybykKKworIyBUZXN0cyBkZXJpdmVkIGZyb20gdGVzdF9pdGVydG9vbHMucHkgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2RlZiBSKHNlcW4pOgorICAgICdSZWd1bGFyIGdlbmVyYXRvcicKKyAgICBmb3IgaSBpbiBzZXFuOgorICAgICAgICB5aWVsZCBpCisKK2NsYXNzIEc6CisgICAgJ1NlcXVlbmNlIHVzaW5nIF9fZ2V0aXRlbV9fJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBpKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc2VxbltpXQorCitjbGFzcyBJOgorICAgICdTZXF1ZW5jZSB1c2luZyBpdGVyYXRvciBwcm90b2NvbCcKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5pID49IGxlbihzZWxmLnNlcW4pOiByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHYgPSBzZWxmLnNlcW5bc2VsZi5pXQorICAgICAgICBzZWxmLmkgKz0gMQorICAgICAgICByZXR1cm4gdgorCitjbGFzcyBJZzoKKyAgICAnU2VxdWVuY2UgdXNpbmcgaXRlcmF0b3IgcHJvdG9jb2wgZGVmaW5lZCB3aXRoIGEgZ2VuZXJhdG9yJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICBmb3IgdmFsIGluIHNlbGYuc2VxbjoKKyAgICAgICAgICAgIHlpZWxkIHZhbAorCitjbGFzcyBYOgorICAgICdNaXNzaW5nIF9fZ2V0aXRlbV9fIGFuZCBfX2l0ZXJfXycKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2Vxbik6CisgICAgICAgIHNlbGYuc2VxbiA9IHNlcW4KKyAgICAgICAgc2VsZi5pID0gMAorICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmkgPj0gbGVuKHNlbGYuc2Vxbik6IHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgdiA9IHNlbGYuc2VxbltzZWxmLmldCisgICAgICAgIHNlbGYuaSArPSAxCisgICAgICAgIHJldHVybiB2CisKK2NsYXNzIE46CisgICAgJ0l0ZXJhdG9yIG1pc3NpbmcgbmV4dCgpJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgc2VsZi5zZXFuID0gc2VxbgorICAgICAgICBzZWxmLmkgPSAwCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCitjbGFzcyBFOgorICAgICdUZXN0IHByb3BhZ2F0aW9uIG9mIGV4Y2VwdGlvbnMnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcW4pOgorICAgICAgICBzZWxmLnNlcW4gPSBzZXFuCisgICAgICAgIHNlbGYuaSA9IDAKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIDMgLy8gMAorCitjbGFzcyBTOgorICAgICdUZXN0IGltbWVkaWF0ZSBzdG9wJworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXFuKToKKyAgICAgICAgcGFzcworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCitmcm9tIGl0ZXJ0b29scyBpbXBvcnQgY2hhaW4sIGltYXAKK2RlZiBMKHNlcW4pOgorICAgICdUZXN0IG11bHRpcGxlIHRpZXJzIG9mIGl0ZXJhdG9ycycKKyAgICByZXR1cm4gY2hhaW4oaW1hcChsYW1iZGEgeDp4LCBSKElnKEcoc2VxbikpKSkpCisKK2NsYXNzIFRlc3RWYXJpb3VzSXRlcmF0b3JBcmdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBmb3IgY29ucyBpbiAoc2V0LCBmcm96ZW5zZXQpOgorICAgICAgICAgICAgZm9yIHMgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpKToKKyAgICAgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFNldEVxdWFsKGNvbnMoZyhzKSksIHNldChnKHMpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNvbnMgLCBYKHMpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29ucyAsIE4ocykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIGNvbnMgLCBFKHMpKQorCisgICAgZGVmIHRlc3RfaW5saW5lX21ldGhvZHMoc2VsZik6CisgICAgICAgIHMgPSBzZXQoJ25vdmVtYmVyJykKKyAgICAgICAgZm9yIGRhdGEgaW4gKCIxMjMiLCAiIiwgcmFuZ2UoMTAwMCksICgnZG8nLCAxLjIpLCB4cmFuZ2UoMjAwMCwyMjAwLDUpLCAnZGVjZW1iZXInKToKKyAgICAgICAgICAgIGZvciBtZXRoIGluIChzLnVuaW9uLCBzLmludGVyc2VjdGlvbiwgcy5kaWZmZXJlbmNlLCBzLnN5bW1ldHJpY19kaWZmZXJlbmNlLCBzLmlzZGlzam9pbnQpOgorICAgICAgICAgICAgICAgIGZvciBnIGluIChHLCBJLCBJZywgTCwgUik6CisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gbWV0aChkYXRhKQorICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBtZXRoKEcoZGF0YSkpCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIGJvb2wpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChhY3R1YWwsIGV4cGVjdGVkKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgWChzKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIE4ocykpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IsIG1ldGgsIEUocykpCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX21ldGhvZHMoc2VsZik6CisgICAgICAgIGZvciBkYXRhIGluICgiMTIzIiwgIiIsIHJhbmdlKDEwMDApLCAoJ2RvJywgMS4yKSwgeHJhbmdlKDIwMDAsMjIwMCw1KSwgJ2RlY2VtYmVyJyk6CisgICAgICAgICAgICBmb3IgbWV0aG5hbWUgaW4gKCd1cGRhdGUnLCAnaW50ZXJzZWN0aW9uX3VwZGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaWZmZXJlbmNlX3VwZGF0ZScsICdzeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUnKToKKyAgICAgICAgICAgICAgICBmb3IgZyBpbiAoRywgSSwgSWcsIFMsIEwsIFIpOgorICAgICAgICAgICAgICAgICAgICBzID0gc2V0KCdqYW51YXJ5JykKKyAgICAgICAgICAgICAgICAgICAgdCA9IHMuY29weSgpCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHIocywgbWV0aG5hbWUpKGxpc3QoZyhkYXRhKSkpCisgICAgICAgICAgICAgICAgICAgIGdldGF0dHIodCwgbWV0aG5hbWUpKGcoZGF0YSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwocywgdCkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXR0cihzZXQoJ2phbnVhcnknKSwgbWV0aG5hbWUpLCBYKGRhdGEpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXR0cihzZXQoJ2phbnVhcnknKSwgbWV0aG5hbWUpLCBOKGRhdGEpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBnZXRhdHRyKHNldCgnamFudWFyeScpLCBtZXRobmFtZSksIEUoZGF0YSkpCisKK2NsYXNzIGJhZF9lcToKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgYmVfYmFkOgorICAgICAgICAgICAgc2V0Mi5jbGVhcigpCisgICAgICAgICAgICByYWlzZSBaZXJvRGl2aXNpb25FcnJvcgorICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlcgorICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworY2xhc3MgYmFkX2RpY3RfY2xlYXI6CisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGJlX2JhZDoKKyAgICAgICAgICAgIGRpY3QyLmNsZWFyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYgaXMgb3RoZXIKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiAwCisKK2NsYXNzIFRlc3RXZWlyZEJ1Z3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0Xzg0MjBfc2V0X21lcmdlKHNlbGYpOgorICAgICAgICAjIFRoaXMgdXNlZCB0byBzZWdmYXVsdAorICAgICAgICBnbG9iYWwgYmVfYmFkLCBzZXQyLCBkaWN0MgorICAgICAgICBiZV9iYWQgPSBGYWxzZQorICAgICAgICBzZXQxID0ge2JhZF9lcSgpfQorICAgICAgICBzZXQyID0ge2JhZF9lcSgpIGZvciBpIGluIHJhbmdlKDc1KX0KKyAgICAgICAgYmVfYmFkID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2V0MS51cGRhdGUsIHNldDIpCisKKyAgICAgICAgYmVfYmFkID0gRmFsc2UKKyAgICAgICAgc2V0MSA9IHtiYWRfZGljdF9jbGVhcigpfQorICAgICAgICBkaWN0MiA9IHtiYWRfZGljdF9jbGVhcigpOiBOb25lfQorICAgICAgICBiZV9iYWQgPSBUcnVlCisgICAgICAgIHNldDEuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlKGRpY3QyKQorCisjIEFwcGxpY2F0aW9uIHRlc3RzIChiYXNlZCBvbiBEYXZpZCBFcHBzdGVpbidzIGdyYXBoIHJlY2lwZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2RlZiBwb3dlcnNldChVKToKKyAgICAiIiJHZW5lcmF0ZXMgYWxsIHN1YnNldHMgb2YgYSBzZXQgb3Igc2VxdWVuY2UgVS4iIiIKKyAgICBVID0gaXRlcihVKQorICAgIHRyeToKKyAgICAgICAgeCA9IGZyb3plbnNldChbVS5uZXh0KCldKQorICAgICAgICBmb3IgUyBpbiBwb3dlcnNldChVKToKKyAgICAgICAgICAgIHlpZWxkIFMKKyAgICAgICAgICAgIHlpZWxkIFMgfCB4CisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHlpZWxkIGZyb3plbnNldCgpCisKK2RlZiBjdWJlKG4pOgorICAgICIiIkdyYXBoIG9mIG4tZGltZW5zaW9uYWwgaHlwZXJjdWJlLiIiIgorICAgIHNpbmdsZXRvbnMgPSBbZnJvemVuc2V0KFt4XSkgZm9yIHggaW4gcmFuZ2UobildCisgICAgcmV0dXJuIGRpY3QoWyh4LCBmcm96ZW5zZXQoW3hecyBmb3IgcyBpbiBzaW5nbGV0b25zXSkpCisgICAgICAgICAgICAgICAgIGZvciB4IGluIHBvd2Vyc2V0KHJhbmdlKG4pKV0pCisKK2RlZiBsaW5lZ3JhcGgoRyk6CisgICAgIiIiR3JhcGgsIHRoZSB2ZXJ0aWNlcyBvZiB3aGljaCBhcmUgZWRnZXMgb2YgRywKKyAgICB3aXRoIHR3byB2ZXJ0aWNlcyBiZWluZyBhZGphY2VudCBpZmYgdGhlIGNvcnJlc3BvbmRpbmcKKyAgICBlZGdlcyBzaGFyZSBhIHZlcnRleC4iIiIKKyAgICBMID0ge30KKyAgICBmb3IgeCBpbiBHOgorICAgICAgICBmb3IgeSBpbiBHW3hdOgorICAgICAgICAgICAgbnggPSBbZnJvemVuc2V0KFt4LHpdKSBmb3IgeiBpbiBHW3hdIGlmIHogIT0geV0KKyAgICAgICAgICAgIG55ID0gW2Zyb3plbnNldChbeSx6XSkgZm9yIHogaW4gR1t5XSBpZiB6ICE9IHhdCisgICAgICAgICAgICBMW2Zyb3plbnNldChbeCx5XSldID0gZnJvemVuc2V0KG54K255KQorICAgIHJldHVybiBMCisKK2RlZiBmYWNlcyhHKToKKyAgICAnUmV0dXJuIGEgc2V0IG9mIGZhY2VzIGluIEcuICBXaGVyZSBhIGZhY2UgaXMgYSBzZXQgb2YgdmVydGljZXMgb24gdGhhdCBmYWNlJworICAgICMgY3VycmVudGx5IGxpbWl0ZWQgdG8gdHJpYW5nbGVzLHNxdWFyZXMsIGFuZCBwZW50YWdvbnMKKyAgICBmID0gc2V0KCkKKyAgICBmb3IgdjEsIGVkZ2VzIGluIEcuaXRlbXMoKToKKyAgICAgICAgZm9yIHYyIGluIGVkZ2VzOgorICAgICAgICAgICAgZm9yIHYzIGluIEdbdjJdOgorICAgICAgICAgICAgICAgIGlmIHYxID09IHYzOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIHYxIGluIEdbdjNdOgorICAgICAgICAgICAgICAgICAgICBmLmFkZChmcm96ZW5zZXQoW3YxLCB2MiwgdjNdKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmb3IgdjQgaW4gR1t2M106CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB2NCA9PSB2MjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjEgaW4gR1t2NF06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5hZGQoZnJvemVuc2V0KFt2MSwgdjIsIHYzLCB2NF0pKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdjUgaW4gR1t2NF06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHY1ID09IHYzIG9yIHY1ID09IHYyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdjEgaW4gR1t2NV06CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmFkZChmcm96ZW5zZXQoW3YxLCB2MiwgdjMsIHY0LCB2NV0pKQorICAgIHJldHVybiBmCisKKworY2xhc3MgVGVzdEdyYXBocyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jdWJlKHNlbGYpOgorCisgICAgICAgIGcgPSBjdWJlKDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHZlcnQgLS0+IHt2MSwgdjIsIHYzfQorICAgICAgICB2ZXJ0aWNlczEgPSBzZXQoZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odmVydGljZXMxKSwgOCkgICAgICMgZWlnaHQgdmVydGljZXMKKyAgICAgICAgZm9yIGVkZ2UgaW4gZy52YWx1ZXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVkZ2UpLCAzKSAgICAgICMgZWFjaCB2ZXJ0ZXggY29ubmVjdHMgdG8gdGhyZWUgZWRnZXMKKyAgICAgICAgdmVydGljZXMyID0gc2V0KHYgZm9yIGVkZ2VzIGluIGcudmFsdWVzKCkgZm9yIHYgaW4gZWRnZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVydGljZXMxLCB2ZXJ0aWNlczIpICAjIGVkZ2UgdmVydGljZXMgaW4gb3JpZ2luYWwgc2V0CisKKyAgICAgICAgY3ViZWZhY2VzID0gZmFjZXMoZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oY3ViZWZhY2VzKSwgNikgICAgICMgc2l4IGZhY2VzCisgICAgICAgIGZvciBmYWNlIGluIGN1YmVmYWNlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGZhY2UpLCA0KSAgICAgICMgZWFjaCBmYWNlIGlzIGEgc3F1YXJlCisKKyAgICBkZWYgdGVzdF9jdWJvY3RhaGVkcm9uKHNlbGYpOgorCisgICAgICAgICMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DdWJvY3RhaGVkcm9uCisgICAgICAgICMgOCB0cmlhbmd1bGFyIGZhY2VzIGFuZCA2IHNxdWFyZSBmYWNlcworICAgICAgICAjIDEyIGluZGVudGljYWwgdmVydGljZXMgZWFjaCBjb25uZWN0aW5nIGEgdHJpYW5nbGUgYW5kIHNxdWFyZQorCisgICAgICAgIGcgPSBjdWJlKDMpCisgICAgICAgIGN1Ym9jdGFoZWRyb24gPSBsaW5lZ3JhcGgoZykgICAgICAgICAgICAjIFYoIC0tPiB7VjEsIFYyLCBWMywgVjR9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGN1Ym9jdGFoZWRyb24pLCAxMikjIHR3ZWx2ZSB2ZXJ0aWNlcworCisgICAgICAgIHZlcnRpY2VzID0gc2V0KGN1Ym9jdGFoZWRyb24pCisgICAgICAgIGZvciBlZGdlcyBpbiBjdWJvY3RhaGVkcm9uLnZhbHVlcygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWRnZXMpLCA0KSAgICAgIyBlYWNoIHZlcnRleCBjb25uZWN0cyB0byBmb3VyIG90aGVyIHZlcnRpY2VzCisgICAgICAgIG90aGVydmVydGljZXMgPSBzZXQoZWRnZSBmb3IgZWRnZXMgaW4gY3Vib2N0YWhlZHJvbi52YWx1ZXMoKSBmb3IgZWRnZSBpbiBlZGdlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2ZXJ0aWNlcywgb3RoZXJ2ZXJ0aWNlcykgICAjIGVkZ2UgdmVydGljZXMgaW4gb3JpZ2luYWwgc2V0CisKKyAgICAgICAgY3Vib2ZhY2VzID0gZmFjZXMoY3Vib2N0YWhlZHJvbikKKyAgICAgICAgZmFjZXNpemVzID0gY29sbGVjdGlvbnMuZGVmYXVsdGRpY3QoaW50KQorICAgICAgICBmb3IgZmFjZSBpbiBjdWJvZmFjZXM6CisgICAgICAgICAgICBmYWNlc2l6ZXNbbGVuKGZhY2UpXSArPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmFjZXNpemVzWzNdLCA4KSAgICAgICAjIGVpZ2h0IHRyaWFuZ3VsYXIgZmFjZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmYWNlc2l6ZXNbNF0sIDYpICAgICAgICMgc2l4IHNxdWFyZSBmYWNlcworCisgICAgICAgIGZvciB2ZXJ0ZXggaW4gY3Vib2N0YWhlZHJvbjoKKyAgICAgICAgICAgIGVkZ2UgPSB2ZXJ0ZXggICAgICAgICAgICAgICAgICAgICAgICMgQ3Vib2N0YWhlZHJvbiB2ZXJ0aWNlcyBhcmUgZWRnZXMgaW4gQ3ViZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWRnZSksIDIpICAgICAgIyBUd28gY3ViZSB2ZXJ0aWNlcyBkZWZpbmUgYW4gZWRnZQorICAgICAgICAgICAgZm9yIGN1YmV2ZXJ0IGluIGVkZ2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihjdWJldmVydCwgZykKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X2NsYXNzZXMgPSAoCisgICAgICAgIFRlc3RTZXQsCisgICAgICAgIFRlc3RTZXRTdWJjbGFzcywKKyAgICAgICAgVGVzdFNldFN1YmNsYXNzV2l0aEtleXdvcmRBcmdzLAorICAgICAgICBUZXN0RnJvemVuU2V0LAorICAgICAgICBUZXN0RnJvemVuU2V0U3ViY2xhc3MsCisgICAgICAgIFRlc3RTZXRPZlNldHMsCisgICAgICAgIFRlc3RFeGNlcHRpb25Qcm9wYWdhdGlvbiwKKyAgICAgICAgVGVzdEJhc2ljT3BzRW1wdHksCisgICAgICAgIFRlc3RCYXNpY09wc1NpbmdsZXRvbiwKKyAgICAgICAgVGVzdEJhc2ljT3BzVHVwbGUsCisgICAgICAgIFRlc3RCYXNpY09wc1RyaXBsZSwKKyAgICAgICAgVGVzdEJpbmFyeU9wcywKKyAgICAgICAgVGVzdFVwZGF0ZU9wcywKKyAgICAgICAgVGVzdE11dGF0ZSwKKyAgICAgICAgVGVzdFN1YnNldEVxdWFsRW1wdHksCisgICAgICAgIFRlc3RTdWJzZXRFcXVhbE5vbkVtcHR5LAorICAgICAgICBUZXN0U3Vic2V0RW1wdHlOb25FbXB0eSwKKyAgICAgICAgVGVzdFN1YnNldFBhcnRpYWwsCisgICAgICAgIFRlc3RTdWJzZXROb25PdmVybGFwLAorICAgICAgICBUZXN0T25seVNldHNOdW1lcmljLAorICAgICAgICBUZXN0T25seVNldHNEaWN0LAorICAgICAgICBUZXN0T25seVNldHNPcGVyYXRvciwKKyAgICAgICAgVGVzdE9ubHlTZXRzVHVwbGUsCisgICAgICAgIFRlc3RPbmx5U2V0c1N0cmluZywKKyAgICAgICAgVGVzdE9ubHlTZXRzR2VuZXJhdG9yLAorICAgICAgICBUZXN0Q29weWluZ0VtcHR5LAorICAgICAgICBUZXN0Q29weWluZ1NpbmdsZXRvbiwKKyAgICAgICAgVGVzdENvcHlpbmdUcmlwbGUsCisgICAgICAgIFRlc3RDb3B5aW5nVHVwbGUsCisgICAgICAgIFRlc3RDb3B5aW5nTmVzdGVkLAorICAgICAgICBUZXN0SWRlbnRpdGllcywKKyAgICAgICAgVGVzdFZhcmlvdXNJdGVyYXRvckFyZ3MsCisgICAgICAgIFRlc3RHcmFwaHMsCisgICAgICAgIFRlc3RXZWlyZEJ1Z3MsCisgICAgICAgICkKKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKworICAgICMgdmVyaWZ5IHJlZmVyZW5jZSBjb3VudGluZworICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICBpbXBvcnQgZ2MKKyAgICAgICAgY291bnRzID0gW05vbmVdICogNQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorICAgICAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgIHByaW50IGNvdW50cworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVlYjkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODVlYjkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRjb21wcy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNWU2ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRjb21wcy5weQpAQCAtMCwwICsxLDE1MSBAQAorZG9jdGVzdHMgPSAiIiIKKyMjIyMjIyMjIyMjIFRlc3RzIG1vc3RseSBjb3BpZWQgZnJvbSB0ZXN0X2xpc3Rjb21wcy5weSAjIyMjIyMjIyMjIyMKKworVGVzdCBzaW1wbGUgbG9vcCB3aXRoIGNvbmRpdGlvbmFsCisKKyAgICA+Pj4gc3VtKHtpKmkgZm9yIGkgaW4gcmFuZ2UoMTAwKSBpZiBpJjEgPT0gMX0pCisgICAgMTY2NjUwCisKK1Rlc3Qgc2ltcGxlIGNhc2UKKworICAgID4+PiB7Mip5ICsgeCArIDEgZm9yIHggaW4gKDAsKSBmb3IgeSBpbiAoMSwpfQorICAgIHNldChbM10pCisKK1Rlc3Qgc2ltcGxlIG5lc3RpbmcKKworICAgID4+PiBsaXN0KHNvcnRlZCh7KGksaikgZm9yIGkgaW4gcmFuZ2UoMykgZm9yIGogaW4gcmFuZ2UoNCl9KSkKKyAgICBbKDAsIDApLCAoMCwgMSksICgwLCAyKSwgKDAsIDMpLCAoMSwgMCksICgxLCAxKSwgKDEsIDIpLCAoMSwgMyksICgyLCAwKSwgKDIsIDEpLCAoMiwgMiksICgyLCAzKV0KKworVGVzdCBuZXN0aW5nIHdpdGggdGhlIGlubmVyIGV4cHJlc3Npb24gZGVwZW5kZW50IG9uIHRoZSBvdXRlcgorCisgICAgPj4+IGxpc3Qoc29ydGVkKHsoaSxqKSBmb3IgaSBpbiByYW5nZSg0KSBmb3IgaiBpbiByYW5nZShpKX0pKQorICAgIFsoMSwgMCksICgyLCAwKSwgKDIsIDEpLCAoMywgMCksICgzLCAxKSwgKDMsIDIpXQorCitNYWtlIHN1cmUgdGhlIGluZHVjdGlvbiB2YXJpYWJsZSBpcyBub3QgZXhwb3NlZAorCisgICAgPj4+IGkgPSAyMAorICAgID4+PiBzdW0oe2kqaSBmb3IgaSBpbiByYW5nZSgxMDApfSkKKyAgICAzMjgzNTAKKworICAgID4+PiBpCisgICAgMjAKKworVmVyaWZ5IHRoYXQgc3ludGF4IGVycm9yJ3MgYXJlIHJhaXNlZCBmb3Igc2V0Y29tcHMgdXNlZCBhcyBsdmFsdWVzCisKKyAgICA+Pj4ge3kgZm9yIHkgaW4gKDEsMil9ID0gMTAgICAgICAgICAgIyBkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgLi4uCisgICAgU3ludGF4RXJyb3I6IC4uLgorCisgICAgPj4+IHt5IGZvciB5IGluICgxLDIpfSArPSAxMCAgICAgICAgICMgZG9jdGVzdDogK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgIC4uLgorICAgIFN5bnRheEVycm9yOiAuLi4KKworCitNYWtlIGEgbmVzdGVkIHNldCBjb21wcmVoZW5zaW9uIHRoYXQgYWN0cyBsaWtlIHNldChyYW5nZSgpKQorCisgICAgPj4+IGRlZiBzcmFuZ2Uobik6CisgICAgLi4uICAgICByZXR1cm4ge2kgZm9yIGkgaW4gcmFuZ2Uobil9CisgICAgPj4+IGxpc3Qoc29ydGVkKHNyYW5nZSgxMCkpKQorICAgIFswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorCitTYW1lIGFnYWluLCBvbmx5IGFzIGEgbGFtYmRhIGV4cHJlc3Npb24gaW5zdGVhZCBvZiBhIGZ1bmN0aW9uIGRlZmluaXRpb24KKworICAgID4+PiBscmFuZ2UgPSBsYW1iZGEgbjogIHtpIGZvciBpIGluIHJhbmdlKG4pfQorICAgID4+PiBsaXN0KHNvcnRlZChscmFuZ2UoMTApKSkKKyAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KKworR2VuZXJhdG9ycyBjYW4gY2FsbCBvdGhlciBnZW5lcmF0b3JzOgorCisgICAgPj4+IGRlZiBncmFuZ2Uobik6CisgICAgLi4uICAgICBmb3IgeCBpbiB7aSBmb3IgaSBpbiByYW5nZShuKX06CisgICAgLi4uICAgICAgICAgeWllbGQgeAorICAgID4+PiBsaXN0KHNvcnRlZChncmFuZ2UoNSkpKQorICAgIFswLCAxLCAyLCAzLCA0XQorCisKK01ha2Ugc3VyZSB0aGF0IE5vbmUgaXMgYSB2YWxpZCByZXR1cm4gdmFsdWUKKworICAgID4+PiB7Tm9uZSBmb3IgaSBpbiByYW5nZSgxMCl9CisgICAgc2V0KFtOb25lXSkKKworIyMjIyMjIyMjIyMgVGVzdHMgZm9yIHZhcmlvdXMgc2NvcGluZyBjb3JuZXIgY2FzZXMgIyMjIyMjIyMjIyMjCisKK1JldHVybiBsYW1iZGFzIHRoYXQgdXNlIHRoZSBpdGVyYXRpb24gdmFyaWFibGUgYXMgYSBkZWZhdWx0IGFyZ3VtZW50CisKKyAgICA+Pj4gaXRlbXMgPSB7KGxhbWJkYSBpPWk6IGkpIGZvciBpIGluIHJhbmdlKDUpfQorICAgID4+PiB7eCgpIGZvciB4IGluIGl0ZW1zfSA9PSBzZXQocmFuZ2UoNSkpCisgICAgVHJ1ZQorCitTYW1lIGFnYWluLCBvbmx5IHRoaXMgdGltZSBhcyBhIGNsb3N1cmUgdmFyaWFibGUKKworICAgID4+PiBpdGVtcyA9IHsobGFtYmRhOiBpKSBmb3IgaSBpbiByYW5nZSg1KX0KKyAgICA+Pj4ge3goKSBmb3IgeCBpbiBpdGVtc30KKyAgICBzZXQoWzRdKQorCitBbm90aGVyIHdheSB0byB0ZXN0IHRoYXQgdGhlIGl0ZXJhdGlvbiB2YXJpYWJsZSBpcyBsb2NhbCB0byB0aGUgbGlzdCBjb21wCisKKyAgICA+Pj4gaXRlbXMgPSB7KGxhbWJkYTogaSkgZm9yIGkgaW4gcmFuZ2UoNSl9CisgICAgPj4+IGkgPSAyMAorICAgID4+PiB7eCgpIGZvciB4IGluIGl0ZW1zfQorICAgIHNldChbNF0pCisKK0FuZCBjb25maXJtIHRoYXQgYSBjbG9zdXJlIGNhbiBqdW1wIG92ZXIgdGhlIGxpc3QgY29tcCBzY29wZQorCisgICAgPj4+IGl0ZW1zID0geyhsYW1iZGE6IHkpIGZvciBpIGluIHJhbmdlKDUpfQorICAgID4+PiB5ID0gMgorICAgID4+PiB7eCgpIGZvciB4IGluIGl0ZW1zfQorICAgIHNldChbMl0pCisKK1dlIGFsc28gcmVwZWF0IGVhY2ggb2YgdGhlIGFib3ZlIHNjb3BpbmcgdGVzdHMgaW5zaWRlIGEgZnVuY3Rpb24KKworICAgID4+PiBkZWYgdGVzdF9mdW5jKCk6CisgICAgLi4uICAgICBpdGVtcyA9IHsobGFtYmRhIGk9aTogaSkgZm9yIGkgaW4gcmFuZ2UoNSl9CisgICAgLi4uICAgICByZXR1cm4ge3goKSBmb3IgeCBpbiBpdGVtc30KKyAgICA+Pj4gdGVzdF9mdW5jKCkgPT0gc2V0KHJhbmdlKDUpKQorICAgIFRydWUKKworICAgID4+PiBkZWYgdGVzdF9mdW5jKCk6CisgICAgLi4uICAgICBpdGVtcyA9IHsobGFtYmRhOiBpKSBmb3IgaSBpbiByYW5nZSg1KX0KKyAgICAuLi4gICAgIHJldHVybiB7eCgpIGZvciB4IGluIGl0ZW1zfQorICAgID4+PiB0ZXN0X2Z1bmMoKQorICAgIHNldChbNF0pCisKKyAgICA+Pj4gZGVmIHRlc3RfZnVuYygpOgorICAgIC4uLiAgICAgaXRlbXMgPSB7KGxhbWJkYTogaSkgZm9yIGkgaW4gcmFuZ2UoNSl9CisgICAgLi4uICAgICBpID0gMjAKKyAgICAuLi4gICAgIHJldHVybiB7eCgpIGZvciB4IGluIGl0ZW1zfQorICAgID4+PiB0ZXN0X2Z1bmMoKQorICAgIHNldChbNF0pCisKKyAgICA+Pj4gZGVmIHRlc3RfZnVuYygpOgorICAgIC4uLiAgICAgaXRlbXMgPSB7KGxhbWJkYTogeSkgZm9yIGkgaW4gcmFuZ2UoNSl9CisgICAgLi4uICAgICB5ID0gMgorICAgIC4uLiAgICAgcmV0dXJuIHt4KCkgZm9yIHggaW4gaXRlbXN9CisgICAgPj4+IHRlc3RfZnVuYygpCisgICAgc2V0KFsyXSkKKworIiIiCisKKworX190ZXN0X18gPSB7J2RvY3Rlc3RzJyA6IGRvY3Rlc3RzfQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgaW1wb3J0IHN5cworICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3NldGNvbXBzCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3Rfc2V0Y29tcHMsIHZlcmJvc2UpCisKKyAgICAjIHZlcmlmeSByZWZlcmVuY2UgY291bnRpbmcKKyAgICBpZiB2ZXJib3NlIGFuZCBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICAgICAgaW1wb3J0IGdjCisgICAgICAgIGNvdW50cyA9IFtOb25lXSAqIDUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3Rfc2V0Y29tcHMsIHZlcmJvc2UpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGNvdW50c1tpXSA9IHN5cy5nZXR0b3RhbHJlZmNvdW50KCkKKyAgICAgICAgcHJpbnQoY291bnRzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRjb21wcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRjb21wcy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1Nzg4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRjb21wcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRjb21wcy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1Nzg4MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NldGNvbXBzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzU0ZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0cy5weQpAQCAtMCwwICsxLDg2MiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCB1bml0dGVzdCwgb3BlcmF0b3IsIGNvcHksIHBpY2tsZSwgcmFuZG9tCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgic2V0cyIsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2Zyb20gc2V0cyBpbXBvcnQgU2V0LCBJbW11dGFibGVTZXQKKworZW1wdHlfc2V0ID0gU2V0KCkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0QmFzaWNPcHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5yZXByIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNlbGYuc2V0KSwgc2VsZi5yZXByKQorCisgICAgZGVmIHRlc3RfbGVuZ3RoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnNldCksIHNlbGYubGVuZ3RoKQorCisgICAgZGVmIHRlc3Rfc2VsZl9lcXVhbGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9lcXVpdmFsZW50X2VxdWFsaXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQuY29weSgpLCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X3NlbGZfdW5pb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZHVwKQorCisgICAgZGVmIHRlc3RfZW1wdHlfdW5pb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgZW1wdHlfc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmR1cCkKKworICAgIGRlZiB0ZXN0X3VuaW9uX2VtcHR5KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBlbXB0eV9zZXQgfCBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9zZWxmX2ludGVyc2VjdGlvbihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBzZWxmLnNldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9lbXB0eV9pbnRlcnNlY3Rpb24oc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgZW1wdHlfc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fZW1wdHkoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IGVtcHR5X3NldCAmIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9zZWxmX3N5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgY2hlY2tlbXB0eV9zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBlbXB0eV9zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3Rfc2VsZl9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAtIHNlbGYuc2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBlbXB0eV9zZXQpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAtIGVtcHR5X3NldAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgc2VsZi5kdXApCisKKyAgICBkZWYgdGVzdF9lbXB0eV9kaWZmZXJlbmNlX3JldihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gZW1wdHlfc2V0IC0gc2VsZi5zZXQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmKToKKyAgICAgICAgZm9yIHYgaW4gc2VsZi5zZXQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHYsIHNlbGYudmFsdWVzKQorCisgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CisgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoc2VsZi5zZXQpCisgICAgICAgIGNvcHkgPSBwaWNrbGUubG9hZHMocCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgY29weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgIT0gJXMiICUgKHNlbGYuc2V0LCBjb3B5KSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0QmFzaWNPcHNFbXB0eShUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAiZW1wdHkgc2V0IgorICAgICAgICBzZWxmLnZhbHVlcyA9IFtdCisgICAgICAgIHNlbGYuc2V0ICAgID0gU2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IFNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSAwCisgICAgICAgIHNlbGYucmVwciAgID0gIlNldChbXSkiCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdEJhc2ljT3BzU2luZ2xldG9uKFRlc3RCYXNpY09wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNhc2UgICA9ICJ1bml0IHNldCAobnVtYmVyKSIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbM10KKyAgICAgICAgc2VsZi5zZXQgICAgPSBTZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYuZHVwICAgID0gU2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmxlbmd0aCA9IDEKKyAgICAgICAgc2VsZi5yZXByICAgPSAiU2V0KFszXSkiCisKKyAgICBkZWYgdGVzdF9pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDMgaW4gc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyIG5vdCBpbiBzZWxmLnNldCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0QmFzaWNPcHNUdXBsZShUZXN0QmFzaWNPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYXNlICAgPSAidW5pdCBzZXQgKHR1cGxlKSIKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBbKDAsICJ6ZXJvIildCisgICAgICAgIHNlbGYuc2V0ICAgID0gU2V0KHNlbGYudmFsdWVzKQorICAgICAgICBzZWxmLmR1cCAgICA9IFNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5sZW5ndGggPSAxCisgICAgICAgIHNlbGYucmVwciAgID0gIlNldChbKDAsICd6ZXJvJyldKSIKKworICAgIGRlZiB0ZXN0X2luKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDAsICJ6ZXJvIikgaW4gc2VsZi5zZXQpCisKKyAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSg5IG5vdCBpbiBzZWxmLnNldCkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0QmFzaWNPcHNUcmlwbGUoVGVzdEJhc2ljT3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2FzZSAgID0gInRyaXBsZSBzZXQiCisgICAgICAgIHNlbGYudmFsdWVzID0gWzAsICJ6ZXJvIiwgb3BlcmF0b3IuYWRkXQorICAgICAgICBzZWxmLnNldCAgICA9IFNldChzZWxmLnZhbHVlcykKKyAgICAgICAgc2VsZi5kdXAgICAgPSBTZXQoc2VsZi52YWx1ZXMpCisgICAgICAgIHNlbGYubGVuZ3RoID0gMworICAgICAgICBzZWxmLnJlcHIgICA9IE5vbmUKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitkZWYgYmFkaXRlcigpOgorICAgIHJhaXNlIFR5cGVFcnJvcgorICAgIHlpZWxkIFRydWUKKworZGVmIGdvb2RpdGVyKCk6CisgICAgeWllbGQgVHJ1ZQorCitjbGFzcyBUZXN0RXhjZXB0aW9uUHJvcGFnYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlNGIDYyODI0NjogIFNldCBjb25zdHJ1Y3RvciBzaG91bGQgbm90IHRyYXAgaXRlcmF0b3IgVHlwZUVycm9ycyIiIgorCisgICAgZGVmIHRlc3RfaW5zdGFuY2VXaXRoRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFNldCwgYmFkaXRlcigpKQorCisgICAgZGVmIHRlc3RfaW5zdGFuY2VzV2l0aG91dEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyBBbGwgb2YgdGhlc2UgaXRlcmFibGVzIHNob3VsZCBsb2FkIHdpdGhvdXQgZXhjZXB0aW9uLgorICAgICAgICBTZXQoWzEsMiwzXSkKKyAgICAgICAgU2V0KCgxLDIsMykpCisgICAgICAgIFNldCh7J29uZSc6MSwgJ3R3byc6MiwgJ3RocmVlJzozfSkKKyAgICAgICAgU2V0KHhyYW5nZSgzKSkKKyAgICAgICAgU2V0KCdhYmMnKQorICAgICAgICBTZXQoZ29vZGl0ZXIoKSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0U2V0T2ZTZXRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgaW5uZXIgPSBTZXQoWzFdKQorICAgICAgICBvdXRlciA9IFNldChbaW5uZXJdKQorICAgICAgICBlbGVtZW50ID0gb3V0ZXIucG9wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGVsZW1lbnQpLCBJbW11dGFibGVTZXQpCisgICAgICAgIG91dGVyLmFkZChpbm5lcikgICAgICAgICMgUmVidWlsZCBzZXQgb2Ygc2V0cyB3aXRoIC5hZGQgbWV0aG9kCisgICAgICAgIG91dGVyLnJlbW92ZShpbm5lcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXRlciwgU2V0KCkpICAgIyBWZXJpZnkgdGhhdCByZW1vdmUgd29ya2VkCisgICAgICAgIG91dGVyLmRpc2NhcmQoaW5uZXIpICAgICMgQWJzZW5jZSBvZiBLZXlFcnJvciBpbmRpY2F0ZXMgd29ya2luZyBmaW5lCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdEJpbmFyeU9wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IFNldCgoMiwgNCwgNikpCisKKyAgICBkZWYgdGVzdF9lcShzZWxmKTogICAgICAgICAgICAgICMgU0YgYnVnIDY0MzExNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoezI6MSw0OjMsNjo1fSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9zdWJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgU2V0KFsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldCgoMiwgNCwgNikpKQorCisgICAgZGVmIHRlc3RfdW5pb25fc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0IHwgU2V0KFsyLCA0LCA2LCA4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIFNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3RfdW5pb25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBTZXQoWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFsyLCAzLCA0LCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgfCBTZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fc3Vic2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCAmIFNldCgoMiwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoKDIsIDQpKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdXBlcnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBTZXQoWzIsIDQsIDYsIDhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFsyLCA0LCA2XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgJiBTZXQoWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFs0XSkpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb25fbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuc2V0ICYgU2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGVtcHR5X3NldCkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1YnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBTZXQoKDIsIDQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFs2XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9zdXBlcnNldChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5zZXQgXiBTZXQoKDIsIDQsIDYsIDgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgU2V0KFs4XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIFNldCgoMywgNCwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDMsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBzZWxmLnNldCBeIFNldChbOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBTZXQoWzIsIDQsIDYsIDhdKSkKKworICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKKyAgICAgICAgYSwgYiA9IFNldCgnYScpLCBTZXQoJ2InKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgYSwgYikKKworICAgICAgICAjIFlvdSBjYW4gdmlldyB0aGlzIGFzIGEgYnVnbGV0OiAgY21wKGEsIGEpIGRvZXMgbm90IHJhaXNlIFR5cGVFcnJvciwKKyAgICAgICAgIyBiZWNhdXNlIF9fZXFfXyBpcyB0cmllZCBiZWZvcmUgX19jbXBfXywgYW5kIGEuX19lcV9fKGEpIHJldHVybnMgVHJ1ZSwKKyAgICAgICAgIyB3aGljaCBQeXRob24gdGhpbmtzIGlzIGdvb2QgZW5vdWdoIHRvIHN5bnRoZXNpemUgYSBjbXAoKSByZXN1bHQKKyAgICAgICAgIyB3aXRob3V0IGNhbGxpbmcgX19jbXBfXy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoYSwgYSksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGEsIDEyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgImFiYyIsIGEpCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX29uX3NlbGYoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnNldC5jb3B5KCkKKyAgICAgICAgdCB8PSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi5zZXQpCisgICAgICAgIHQgJj0gdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHNlbGYuc2V0KQorICAgICAgICB0IC09IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odCksIDApCisgICAgICAgIHQgPSBzZWxmLnNldC5jb3B5KCkKKyAgICAgICAgdCBePSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCAwKQorCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdFVwZGF0ZU9wcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IFNldCgoMiwgNCwgNikpCisKKyAgICBkZWYgdGVzdF91bmlvbl9zdWJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IHw9IFNldChbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgoMiwgNCwgNikpKQorCisgICAgZGVmIHRlc3RfdW5pb25fc3VwZXJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IHw9IFNldChbMiwgNCwgNiwgOF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgNCwgNiwgOF0pKQorCisgICAgZGVmIHRlc3RfdW5pb25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgfD0gU2V0KFszLCA0LCA1XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCAzLCA0LCA1LCA2XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgfD0gU2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCA0LCA2LCA4XSkpCisKKyAgICBkZWYgdGVzdF91bmlvbl9tZXRob2RfY2FsbChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQudW5pb25fdXBkYXRlKFNldChbMywgNCwgNV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDMsIDQsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9zdWJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICY9IFNldCgoMiwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgoMiwgNCkpKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3N1cGVyc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnNldCAmPSBTZXQoWzIsIDQsIDYsIDhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDQsIDZdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAmPSBTZXQoWzMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzRdKSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl9ub25fb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgJj0gU2V0KFs4XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgZW1wdHlfc2V0KQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX21ldGhvZF9jYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnNldC5pbnRlcnNlY3Rpb25fdXBkYXRlKFNldChbMywgNCwgNV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzRdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3N1YnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgXj0gU2V0KCgyLCA0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFs2XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9zdXBlcnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgXj0gU2V0KCgyLCA0LCA2LCA4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFs4XSkpCisKKyAgICBkZWYgdGVzdF9zeW1fZGlmZmVyZW5jZV9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCBePSBTZXQoKDMsIDQsIDUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDMsIDUsIDZdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCBePSBTZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDQsIDYsIDhdKSkKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX21ldGhvZF9jYWxsKHNlbGYpOgorICAgICAgICBzZWxmLnNldC5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoU2V0KFszLCA0LCA1XSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbMiwgMywgNSwgNl0pKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9zdWJzZXQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0IC09IFNldCgoMiwgNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChbNl0pKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV9zdXBlcnNldChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgLT0gU2V0KCgyLCA0LCA2LCA4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFtdKSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2Vfb3ZlcmxhcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgLT0gU2V0KCgzLCA0LCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KFsyLCA2XSkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX25vbl9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAtPSBTZXQoWzhdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDQsIDZdKSkKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2VfbWV0aG9kX2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmRpZmZlcmVuY2VfdXBkYXRlKFNldChbMywgNCwgNV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoWzIsIDZdKSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBUZXN0TXV0YXRlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudmFsdWVzID0gWyJhIiwgImIiLCAiYyJdCisgICAgICAgIHNlbGYuc2V0ID0gU2V0KHNlbGYudmFsdWVzKQorCisgICAgZGVmIHRlc3RfYWRkX3ByZXNlbnQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LmFkZCgiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgiYWJjIikpCisKKyAgICBkZWYgdGVzdF9hZGRfYWJzZW50KHNlbGYpOgorICAgICAgICBzZWxmLnNldC5hZGQoImQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoImFiY2QiKSkKKworICAgIGRlZiB0ZXN0X2FkZF91bnRpbF9mdWxsKHNlbGYpOgorICAgICAgICB0bXAgPSBTZXQoKQorICAgICAgICBleHBlY3RlZF9sZW4gPSAwCisgICAgICAgIGZvciB2IGluIHNlbGYudmFsdWVzOgorICAgICAgICAgICAgdG1wLmFkZCh2KQorICAgICAgICAgICAgZXhwZWN0ZWRfbGVuICs9IDEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRtcCksIGV4cGVjdGVkX2xlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0bXAsIHNlbGYuc2V0KQorCisgICAgZGVmIHRlc3RfcmVtb3ZlX3ByZXNlbnQoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnJlbW92ZSgiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgiYWMiKSkKKworICAgIGRlZiB0ZXN0X3JlbW92ZV9hYnNlbnQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0LnJlbW92ZSgiZCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlJlbW92aW5nIG1pc3NpbmcgZWxlbWVudCBzaG91bGQgaGF2ZSByYWlzZWQgTG9va3VwRXJyb3IiKQorICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9yZW1vdmVfdW50aWxfZW1wdHkoc2VsZik6CisgICAgICAgIGV4cGVjdGVkX2xlbiA9IGxlbihzZWxmLnNldCkKKyAgICAgICAgZm9yIHYgaW4gc2VsZi52YWx1ZXM6CisgICAgICAgICAgICBzZWxmLnNldC5yZW1vdmUodikKKyAgICAgICAgICAgIGV4cGVjdGVkX2xlbiAtPSAxCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnNldCksIGV4cGVjdGVkX2xlbikKKworICAgIGRlZiB0ZXN0X2Rpc2NhcmRfcHJlc2VudChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQuZGlzY2FyZCgiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldCgiYWIiKSkKKworICAgIGRlZiB0ZXN0X2Rpc2NhcmRfYWJzZW50KHNlbGYpOgorICAgICAgICBzZWxmLnNldC5kaXNjYXJkKCJkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCwgU2V0KCJhYmMiKSkKKworICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnNldC5jbGVhcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuc2V0KSwgMCkKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgcG9wcGVkID0ge30KKyAgICAgICAgd2hpbGUgc2VsZi5zZXQ6CisgICAgICAgICAgICBwb3BwZWRbc2VsZi5zZXQucG9wKCldID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3BwZWQpLCBsZW4oc2VsZi52YWx1ZXMpKQorICAgICAgICBmb3IgdiBpbiBzZWxmLnZhbHVlczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4odiwgcG9wcGVkKQorCisgICAgZGVmIHRlc3RfdXBkYXRlX2VtcHR5X3R1cGxlKHNlbGYpOgorICAgICAgICBzZWxmLnNldC51bmlvbl91cGRhdGUoKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zZXQsIFNldChzZWxmLnZhbHVlcykpCisKKyAgICBkZWYgdGVzdF91cGRhdGVfdW5pdF90dXBsZV9vdmVybGFwKHNlbGYpOgorICAgICAgICBzZWxmLnNldC51bmlvbl91cGRhdGUoKCJhIiwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoc2VsZi52YWx1ZXMpKQorCisgICAgZGVmIHRlc3RfdXBkYXRlX3VuaXRfdHVwbGVfbm9uX292ZXJsYXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0LnVuaW9uX3VwZGF0ZSgoImEiLCAieiIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0LCBTZXQoc2VsZi52YWx1ZXMgKyBbInoiXSkpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdFN1YnNldHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgY2FzZTJtZXRob2QgPSB7Ijw9IjogImlzc3Vic2V0IiwKKyAgICAgICAgICAgICAgICAgICAiPj0iOiAiaXNzdXBlcnNldCIsCisgICAgICAgICAgICAgICAgICB9CisKKyAgICByZXZlcnNlID0geyI9PSI6ICI9PSIsCisgICAgICAgICAgICAgICAiIT0iOiAiIT0iLAorICAgICAgICAgICAgICAgIjwiOiAgIj4iLAorICAgICAgICAgICAgICAgIj4iOiAgIjwiLAorICAgICAgICAgICAgICAgIjw9IjogIj49IiwKKyAgICAgICAgICAgICAgICI+PSI6ICI8PSIsCisgICAgICAgICAgICAgIH0KKworICAgIGRlZiB0ZXN0X2lzc3Vic2V0KHNlbGYpOgorICAgICAgICB4ID0gc2VsZi5sZWZ0CisgICAgICAgIHkgPSBzZWxmLnJpZ2h0CisgICAgICAgIGZvciBjYXNlIGluICIhPSIsICI9PSIsICI8IiwgIjw9IiwgIj4iLCAiPj0iOgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjYXNlIGluIHNlbGYuY2FzZXMKKyAgICAgICAgICAgICMgVGVzdCB0aGUgYmluYXJ5IGluZml4IHNwZWxsaW5nLgorICAgICAgICAgICAgcmVzdWx0ID0gZXZhbCgieCIgKyBjYXNlICsgInkiLCBsb2NhbHMoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3RlZCkKKyAgICAgICAgICAgICMgVGVzdCB0aGUgImZyaWVuZGx5IiBtZXRob2QtbmFtZSBzcGVsbGluZywgaWYgb25lIGV4aXN0cy4KKyAgICAgICAgICAgIGlmIGNhc2UgaW4gVGVzdFN1YnNldHMuY2FzZTJtZXRob2Q6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cih4LCBUZXN0U3Vic2V0cy5jYXNlMm1ldGhvZFtjYXNlXSkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QoeSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgICAgICMgTm93IGRvIHRoZSBzYW1lIGZvciB0aGUgb3BlcmFuZHMgcmV2ZXJzZWQuCisgICAgICAgICAgICByY2FzZSA9IFRlc3RTdWJzZXRzLnJldmVyc2VbY2FzZV0KKyAgICAgICAgICAgIHJlc3VsdCA9IGV2YWwoInkiICsgcmNhc2UgKyAieCIsIGxvY2FscygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorICAgICAgICAgICAgaWYgcmNhc2UgaW4gVGVzdFN1YnNldHMuY2FzZTJtZXRob2Q6CisgICAgICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cih5LCBUZXN0U3Vic2V0cy5jYXNlMm1ldGhvZFtyY2FzZV0pCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kKHgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGV4cGVjdGVkKQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0U3Vic2V0RXF1YWxFbXB0eShUZXN0U3Vic2V0cyk6CisgICAgbGVmdCAgPSBTZXQoKQorICAgIHJpZ2h0ID0gU2V0KCkKKyAgICBuYW1lICA9ICJib3RoIGVtcHR5IgorICAgIGNhc2VzID0gIj09IiwgIjw9IiwgIj49IgorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RTdWJzZXRFcXVhbE5vbkVtcHR5KFRlc3RTdWJzZXRzKToKKyAgICBsZWZ0ICA9IFNldChbMSwgMl0pCisgICAgcmlnaHQgPSBTZXQoWzEsIDJdKQorICAgIG5hbWUgID0gImVxdWFsIHBhaXIiCisgICAgY2FzZXMgPSAiPT0iLCAiPD0iLCAiPj0iCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdFN1YnNldEVtcHR5Tm9uRW1wdHkoVGVzdFN1YnNldHMpOgorICAgIGxlZnQgID0gU2V0KCkKKyAgICByaWdodCA9IFNldChbMSwgMl0pCisgICAgbmFtZSAgPSAib25lIGVtcHR5LCBvbmUgbm9uLWVtcHR5IgorICAgIGNhc2VzID0gIiE9IiwgIjwiLCAiPD0iCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdFN1YnNldFBhcnRpYWwoVGVzdFN1YnNldHMpOgorICAgIGxlZnQgID0gU2V0KFsxXSkKKyAgICByaWdodCA9IFNldChbMSwgMl0pCisgICAgbmFtZSAgPSAib25lIGEgbm9uLWVtcHR5IHByb3BlciBzdWJzZXQgb2Ygb3RoZXIiCisgICAgY2FzZXMgPSAiIT0iLCAiPCIsICI8PSIKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0U3Vic2V0Tm9uT3ZlcmxhcChUZXN0U3Vic2V0cyk6CisgICAgbGVmdCAgPSBTZXQoWzFdKQorICAgIHJpZ2h0ID0gU2V0KFsyXSkKKyAgICBuYW1lICA9ICJuZWl0aGVyIGVtcHR5LCBuZWl0aGVyIGNvbnRhaW5zIgorICAgIGNhc2VzID0gIiE9IgorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2VxX25lKHNlbGYpOgorICAgICAgICAjIFVubGlrZSB0aGUgb3RoZXJzLCB0aGlzIGlzIHRlc3RpbmcgdGhhdCA9PSBhbmQgIT0gKmFyZSogYWxsb3dlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm90aGVyID09IHNlbGYuc2V0LCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNldCA9PSBzZWxmLm90aGVyLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm90aGVyICE9IHNlbGYuc2V0LCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2V0ICE9IHNlbGYub3RoZXIsIFRydWUpCisKKyAgICBkZWYgdGVzdF9nZV9ndF9sZV9sdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDwgc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IDw9IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+IHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCA+PSBzZWxmLm90aGVyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDwgc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyIDw9IHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+IHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciA+PSBzZWxmLnNldCkKKworICAgIGRlZiB0ZXN0X3VuaW9uX3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQgfD0gc2VsZi5vdGhlcgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3RfdW5pb25fdXBkYXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LnVuaW9uX3VwZGF0ZShzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC51bmlvbl91cGRhdGUsIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF91bmlvbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYuc2V0IHwgc2VsZi5vdGhlcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IHNlbGYub3RoZXIgfCBzZWxmLnNldCkKKyAgICAgICAgaWYgc2VsZi5vdGhlcklzSXRlcmFibGU6CisgICAgICAgICAgICBzZWxmLnNldC51bmlvbihzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNldC51bmlvbiwgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl91cGRhdGVfb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0ICY9IHNlbGYub3RoZXIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbl91cGRhdGUoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXQuaW50ZXJzZWN0aW9uX3VwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF9pbnRlcnNlY3Rpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLnNldCAmIHNlbGYub3RoZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBzZWxmLm90aGVyICYgc2VsZi5zZXQpCisgICAgICAgIGlmIHNlbGYub3RoZXJJc0l0ZXJhYmxlOgorICAgICAgICAgICAgc2VsZi5zZXQuaW50ZXJzZWN0aW9uKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LmludGVyc2VjdGlvbiwgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlX3VwZGF0ZV9vcGVyYXRvcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXQgXj0gc2VsZi5vdGhlcgorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBUeXBlRXJyb3IiKQorCisgICAgZGVmIHRlc3Rfc3ltX2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZShzZWxmLm90aGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXQuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vdGhlcikKKworICAgIGRlZiB0ZXN0X3N5bV9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgXiBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciBeIHNlbGYuc2V0KQorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc2V0LnN5bW1ldHJpY19kaWZmZXJlbmNlLCBzZWxmLm90aGVyKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW5jZV91cGRhdGVfb3BlcmF0b3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0IC09IHNlbGYub3RoZXIKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X2RpZmZlcmVuY2VfdXBkYXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LmRpZmZlcmVuY2VfdXBkYXRlKHNlbGYub3RoZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNldC5kaWZmZXJlbmNlX3VwZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3RoZXIpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5zZXQgLSBzZWxmLm90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogc2VsZi5vdGhlciAtIHNlbGYuc2V0KQorICAgICAgICBpZiBzZWxmLm90aGVySXNJdGVyYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2V0LmRpZmZlcmVuY2Uoc2VsZi5vdGhlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zZXQuZGlmZmVyZW5jZSwgc2VsZi5vdGhlcikKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0T25seVNldHNOdW1lcmljKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICAgPSBTZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gMTkKKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBGYWxzZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c0RpY3QoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IFNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSB7MToyLCAzOjR9CisgICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gVHJ1ZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c09wZXJhdG9yKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICAgPSBTZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gb3BlcmF0b3IuYWRkCisgICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gRmFsc2UKKworICAgIGRlZiB0ZXN0X2dlX2d0X2xlX2x0KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBzdXBlcihUZXN0T25seVNldHNPcGVyYXRvciwgc2VsZikudGVzdF9nZV9ndF9sZV9sdCgpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzVHVwbGUoVGVzdE9ubHlTZXRzSW5CaW5hcnlPcHMpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgICA9IFNldCgoMSwgMiwgMykpCisgICAgICAgIHNlbGYub3RoZXIgPSAoMiwgNCwgNikKKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzU3RyaW5nKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ICAgPSBTZXQoKDEsIDIsIDMpKQorICAgICAgICBzZWxmLm90aGVyID0gJ2FiYycKKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdE9ubHlTZXRzR2VuZXJhdG9yKFRlc3RPbmx5U2V0c0luQmluYXJ5T3BzKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGRlZiBnZW4oKToKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgwLCAxMCwgMik6CisgICAgICAgICAgICAgICAgeWllbGQgaQorICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9IGdlbigpCisgICAgICAgIHNlbGYub3RoZXJJc0l0ZXJhYmxlID0gVHJ1ZQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RPbmx5U2V0c29mU2V0cyhUZXN0T25seVNldHNJbkJpbmFyeU9wcyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCAgID0gU2V0KCgxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5vdGhlciA9IFtTZXQoJ2FiJyksIEltbXV0YWJsZVNldCgnY2QnKV0KKyAgICAgICAgc2VsZi5vdGhlcklzSXRlcmFibGUgPSBUcnVlCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworY2xhc3MgVGVzdENvcHlpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgZHVwID0gc2VsZi5zZXQuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cCksIGxlbihzZWxmLnNldCkpCisgICAgICAgIGR1cF9saXN0ID0gc29ydGVkKGR1cCkKKyAgICAgICAgc2V0X2xpc3QgPSBzb3J0ZWQoc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGR1cF9saXN0KSwgbGVuKHNldF9saXN0KSkKKyAgICAgICAgZm9yIGksIGVsIGluIGVudW1lcmF0ZShkdXBfbGlzdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzKGVsLCBzZXRfbGlzdFtpXSkKKworICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKKyAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChkdXAsIHNlbGYuc2V0KQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb3B5aW5nRW1wdHkoVGVzdENvcHlpbmcpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgPSBTZXQoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb3B5aW5nU2luZ2xldG9uKFRlc3RDb3B5aW5nKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2V0ID0gU2V0KFsiaGVsbG8iXSkKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBUZXN0Q29weWluZ1RyaXBsZShUZXN0Q29weWluZyk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNldCA9IFNldChbInplcm8iLCAwLCBOb25lXSkKKworICAgIGRlZiB0ZXN0X2NvcHkoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHN1cGVyKFRlc3RDb3B5aW5nVHJpcGxlLCBzZWxmKS50ZXN0X2NvcHkoKQorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIFRlc3RDb3B5aW5nVHVwbGUoVGVzdENvcHlpbmcpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgPSBTZXQoWygxLCAyKV0pCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgVGVzdENvcHlpbmdOZXN0ZWQoVGVzdENvcHlpbmcpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXQgPSBTZXQoWygoMSwgMiksICgzLCA0KSldKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RJZGVudGl0aWVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuYSA9IFNldChbcmFuZG9tLnJhbmRyYW5nZSgxMDApIGZvciBpIGluIHhyYW5nZSg1MCldKQorICAgICAgICBzZWxmLmIgPSBTZXQoW3JhbmRvbS5yYW5kcmFuZ2UoMTAwKSBmb3IgaSBpbiB4cmFuZ2UoNTApXSkKKworICAgIGRlZiB0ZXN0X2Jpbm9wc1ZzU3Vic2V0cyhzZWxmKToKKyAgICAgICAgYSwgYiA9IHNlbGYuYSwgc2VsZi5iCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIC0gYiA8PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiAtIGEgPD0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhICYgYiA8PSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPj0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgfCBiID49IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIF4gYiA8PSBhIHwgYikKKworICAgIGRlZiB0ZXN0X2NvbW11dGF0aXZpdHkoc2VsZik6CisgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEmYiwgYiZhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF8YiwgYnxhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFeYiwgYl5hKQorICAgICAgICBpZiBhICE9IGI6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGEtYiwgYi1hKQorCisgICAgZGVmIHRlc3RfcmVmbGV4c2l2ZV9yZWxhdGlvbnMoc2VsZik6CisgICAgICAgIGEsIHplcm8gPSBzZWxmLmEsIFNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSBeIGEsIHplcm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAtIGEsIHplcm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSB8IGEsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSAmIGEsIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID49IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IGEpCisKKyAgICBkZWYgdGVzdF9zdW1tYXRpb25zKHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgc3VtcyBvZiBwYXJ0cyBlcXVhbCB0aGUgd2hvbGUKKyAgICAgICAgYSwgYiA9IHNlbGYuYSwgc2VsZi5iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtYil8KGEmYil8KGItYSksIGF8YikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYSZiKXwoYV5iKSwgYXxiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF8KGItYSksIGF8YikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYS1iKXxiLCBhfGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtYil8KGEmYiksIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGItYSl8KGEmYiksIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtYil8KGItYSksIGFeYikKKworICAgIGRlZiB0ZXN0X2V4Y2x1c2lvbihzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGludmVyc2Ugb3BlcmF0aW9ucyBkbyBub3Qgb3ZlcmxhcAorICAgICAgICBhLCBiLCB6ZXJvID0gc2VsZi5hLCBzZWxmLmIsIFNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGEtYikmYiwgemVybykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYi1hKSZhLCB6ZXJvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChhJmIpJihhXmIpLCB6ZXJvKQorCisgICAgZGVmIHRlc3RfY2FyZGluYWxpdHlfcmVsYXRpb25zKHNlbGYpOgorICAgICAgICBhLCBiID0gc2VsZi5hLCBzZWxmLmIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIGxlbihhLWIpICsgbGVuKGEmYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCBsZW4oYi1hKSArIGxlbihhJmIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhXmIpLCBsZW4oYS1iKSArIGxlbihiLWEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhfGIpLCBsZW4oYS1iKSArIGxlbihhJmIpICsgbGVuKGItYSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFeYikgKyBsZW4oYSZiKSwgbGVuKGF8YikpCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbGlicmVmdGVzdCA9ICIiIgorRXhhbXBsZSBmcm9tIHRoZSBMaWJyYXJ5IFJlZmVyZW5jZTogIERvYy9saWIvbGlic2V0cy50ZXgKKworPj4+IGZyb20gc2V0cyBpbXBvcnQgU2V0IGFzIEJhc2UgICMgb3ZlcnJpZGUgX3JlcHIgdG8gZ2V0IHNvcnRlZCBvdXRwdXQKKz4+PiBjbGFzcyBTZXQoQmFzZSk6CisuLi4gICAgIGRlZiBfcmVwcihzZWxmKToKKy4uLiAgICAgICAgIHJldHVybiBCYXNlLl9yZXByKHNlbGYsIHNvcnRlZD1UcnVlKQorPj4+IGVuZ2luZWVycyA9IFNldChbJ0pvaG4nLCAnSmFuZScsICdKYWNrJywgJ0phbmljZSddKQorPj4+IHByb2dyYW1tZXJzID0gU2V0KFsnSmFjaycsICdTYW0nLCAnU3VzYW4nLCAnSmFuaWNlJ10pCis+Pj4gbWFuYWdlcnMgPSBTZXQoWydKYW5lJywgJ0phY2snLCAnU3VzYW4nLCAnWmFjayddKQorPj4+IGVtcGxveWVlcyA9IGVuZ2luZWVycyB8IHByb2dyYW1tZXJzIHwgbWFuYWdlcnMgICAgICAgICAgICMgdW5pb24KKz4+PiBlbmdpbmVlcmluZ19tYW5hZ2VtZW50ID0gZW5naW5lZXJzICYgbWFuYWdlcnMgICAgICAgICAgICAjIGludGVyc2VjdGlvbgorPj4+IGZ1bGx0aW1lX21hbmFnZW1lbnQgPSBtYW5hZ2VycyAtIGVuZ2luZWVycyAtIHByb2dyYW1tZXJzICMgZGlmZmVyZW5jZQorPj4+IGVuZ2luZWVycy5hZGQoJ01hcnZpbicpCis+Pj4gcHJpbnQgZW5naW5lZXJzCitTZXQoWydKYWNrJywgJ0phbmUnLCAnSmFuaWNlJywgJ0pvaG4nLCAnTWFydmluJ10pCis+Pj4gZW1wbG95ZWVzLmlzc3VwZXJzZXQoZW5naW5lZXJzKSAgICAgICAgICAgIyBzdXBlcnNldCB0ZXN0CitGYWxzZQorPj4+IGVtcGxveWVlcy51bmlvbl91cGRhdGUoZW5naW5lZXJzKSAgICAgICAgICMgdXBkYXRlIGZyb20gYW5vdGhlciBzZXQKKz4+PiBlbXBsb3llZXMuaXNzdXBlcnNldChlbmdpbmVlcnMpCitUcnVlCis+Pj4gZm9yIGdyb3VwIGluIFtlbmdpbmVlcnMsIHByb2dyYW1tZXJzLCBtYW5hZ2VycywgZW1wbG95ZWVzXToKKy4uLiAgICAgZ3JvdXAuZGlzY2FyZCgnU3VzYW4nKSAgICAgICAgICAgICAgICAjIHVuY29uZGl0aW9uYWxseSByZW1vdmUgZWxlbWVudAorLi4uICAgICBwcmludCBncm91cAorLi4uCitTZXQoWydKYWNrJywgJ0phbmUnLCAnSmFuaWNlJywgJ0pvaG4nLCAnTWFydmluJ10pCitTZXQoWydKYWNrJywgJ0phbmljZScsICdTYW0nXSkKK1NldChbJ0phY2snLCAnSmFuZScsICdaYWNrJ10pCitTZXQoWydKYWNrJywgJ0phbmUnLCAnSmFuaWNlJywgJ0pvaG4nLCAnTWFydmluJywgJ1NhbScsICdaYWNrJ10pCisiIiIKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitfX3Rlc3RfXyA9IHsnbGlicmVmdGVzdCcgOiBsaWJyZWZ0ZXN0fQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgaW1wb3J0IGRvY3Rlc3QKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc2V0cworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFRlc3RTZXRPZlNldHMsCisgICAgICAgIFRlc3RFeGNlcHRpb25Qcm9wYWdhdGlvbiwKKyAgICAgICAgVGVzdEJhc2ljT3BzRW1wdHksCisgICAgICAgIFRlc3RCYXNpY09wc1NpbmdsZXRvbiwKKyAgICAgICAgVGVzdEJhc2ljT3BzVHVwbGUsCisgICAgICAgIFRlc3RCYXNpY09wc1RyaXBsZSwKKyAgICAgICAgVGVzdEJpbmFyeU9wcywKKyAgICAgICAgVGVzdFVwZGF0ZU9wcywKKyAgICAgICAgVGVzdE11dGF0ZSwKKyAgICAgICAgVGVzdFN1YnNldEVxdWFsRW1wdHksCisgICAgICAgIFRlc3RTdWJzZXRFcXVhbE5vbkVtcHR5LAorICAgICAgICBUZXN0U3Vic2V0RW1wdHlOb25FbXB0eSwKKyAgICAgICAgVGVzdFN1YnNldFBhcnRpYWwsCisgICAgICAgIFRlc3RTdWJzZXROb25PdmVybGFwLAorICAgICAgICBUZXN0T25seVNldHNOdW1lcmljLAorICAgICAgICBUZXN0T25seVNldHNEaWN0LAorICAgICAgICBUZXN0T25seVNldHNPcGVyYXRvciwKKyAgICAgICAgVGVzdE9ubHlTZXRzVHVwbGUsCisgICAgICAgIFRlc3RPbmx5U2V0c1N0cmluZywKKyAgICAgICAgVGVzdE9ubHlTZXRzR2VuZXJhdG9yLAorICAgICAgICBUZXN0T25seVNldHNvZlNldHMsCisgICAgICAgIFRlc3RDb3B5aW5nRW1wdHksCisgICAgICAgIFRlc3RDb3B5aW5nU2luZ2xldG9uLAorICAgICAgICBUZXN0Q29weWluZ1RyaXBsZSwKKyAgICAgICAgVGVzdENvcHlpbmdUdXBsZSwKKyAgICAgICAgVGVzdENvcHlpbmdOZXN0ZWQsCisgICAgICAgIFRlc3RJZGVudGl0aWVzLAorICAgICAgICBkb2N0ZXN0LkRvY1Rlc3RTdWl0ZSh0ZXN0X3NldHMpLAorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjg5ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zZXRzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjg5ZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2V0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NnbWxsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE4YmNjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NnbWxsaWIucHkKQEAgLTAsMCArMSw0MzkgQEAKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCByZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorc2dtbGxpYiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdzZ21sbGliJywgZGVwcmVjYXRlZD1UcnVlKQorCisKK2NsYXNzIEV2ZW50Q29sbGVjdG9yKHNnbWxsaWIuU0dNTFBhcnNlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZXZlbnRzID0gW10KKyAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLmV2ZW50cy5hcHBlbmQKKyAgICAgICAgc2dtbGxpYi5TR01MUGFyc2VyLl9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgZ2V0X2V2ZW50cyhzZWxmKToKKyAgICAgICAgIyBOb3JtYWxpemUgdGhlIGxpc3Qgb2YgZXZlbnRzIHNvIHRoYXQgYnVmZmVyIGFydGVmYWN0cyBkb24ndAorICAgICAgICAjIHNlcGFyYXRlIHJ1bnMgb2YgY29udGlndW91cyBjaGFyYWN0ZXJzLgorICAgICAgICBMID0gW10KKyAgICAgICAgcHJldnR5cGUgPSBOb25lCisgICAgICAgIGZvciBldmVudCBpbiBzZWxmLmV2ZW50czoKKyAgICAgICAgICAgIHR5cGUgPSBldmVudFswXQorICAgICAgICAgICAgaWYgdHlwZSA9PSBwcmV2dHlwZSA9PSAiZGF0YSI6CisgICAgICAgICAgICAgICAgTFstMV0gPSAoImRhdGEiLCBMWy0xXVsxXSArIGV2ZW50WzFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChldmVudCkKKyAgICAgICAgICAgIHByZXZ0eXBlID0gdHlwZQorICAgICAgICBzZWxmLmV2ZW50cyA9IEwKKyAgICAgICAgcmV0dXJuIEwKKworICAgICMgc3RydWN0dXJlIG1hcmt1cAorCisgICAgZGVmIHVua25vd25fc3RhcnR0YWcoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgic3RhcnR0YWciLCB0YWcsIGF0dHJzKSkKKworICAgIGRlZiB1bmtub3duX2VuZHRhZyhzZWxmLCB0YWcpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImVuZHRhZyIsIHRhZykpCisKKyAgICAjIGFsbCBvdGhlciBtYXJrdXAKKworICAgIGRlZiBoYW5kbGVfY29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjb21tZW50IiwgZGF0YSkpCisKKyAgICBkZWYgaGFuZGxlX2NoYXJyZWYoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY2hhcnJlZiIsIGRhdGEpKQorCisgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImRhdGEiLCBkYXRhKSkKKworICAgIGRlZiBoYW5kbGVfZGVjbChzZWxmLCBkZWNsKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJkZWNsIiwgZGVjbCkpCisKKyAgICBkZWYgaGFuZGxlX2VudGl0eXJlZihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJlbnRpdHlyZWYiLCBkYXRhKSkKKworICAgIGRlZiBoYW5kbGVfcGkoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgicGkiLCBkYXRhKSkKKworICAgIGRlZiB1bmtub3duX2RlY2woc2VsZiwgZGVjbCk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgidW5rbm93biBkZWNsIiwgZGVjbCkpCisKKworY2xhc3MgQ0RBVEFFdmVudENvbGxlY3RvcihFdmVudENvbGxlY3Rvcik6CisgICAgZGVmIHN0YXJ0X2NkYXRhKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJzdGFydHRhZyIsICJjZGF0YSIsIGF0dHJzKSkKKyAgICAgICAgc2VsZi5zZXRsaXRlcmFsKCkKKworCitjbGFzcyBIVE1MRW50aXR5Q29sbGVjdG9yKEV2ZW50Q29sbGVjdG9yKToKKworICAgIGVudGl0eV9vcl9jaGFycmVmID0gcmUuY29tcGlsZSgnKD86JihbYS16QS1aXVstLmEtekEtWjAtOV0qKScKKyAgICAgICAgJ3wmIyh4WzAtOWEtekEtWl0rfFswLTldKykpKDs/KScpCisKKyAgICBkZWYgY29udmVydF9jaGFycmVmKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImNoYXJyZWYiLCAiY29udmVydCIsIG5hbWUpKQorICAgICAgICBpZiBuYW1lWzBdICE9ICJ4IjoKKyAgICAgICAgICAgIHJldHVybiBFdmVudENvbGxlY3Rvci5jb252ZXJ0X2NoYXJyZWYoc2VsZiwgbmFtZSkKKworICAgIGRlZiBjb252ZXJ0X2NvZGVwb2ludChzZWxmLCBjb2RlcG9pbnQpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImNvZGVwb2ludCIsICJjb252ZXJ0IiwgY29kZXBvaW50KSkKKyAgICAgICAgRXZlbnRDb2xsZWN0b3IuY29udmVydF9jb2RlcG9pbnQoc2VsZiwgY29kZXBvaW50KQorCisgICAgZGVmIGNvbnZlcnRfZW50aXR5cmVmKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImVudGl0eXJlZiIsICJjb252ZXJ0IiwgbmFtZSkpCisgICAgICAgIHJldHVybiBFdmVudENvbGxlY3Rvci5jb252ZXJ0X2VudGl0eXJlZihzZWxmLCBuYW1lKQorCisgICAgIyBUaGVzZSB0byByZWNvcmQgdGhhdCB0aGV5IHdlcmUgY2FsbGVkLCB0aGVuIHBhc3MgdGhlIGNhbGwgYWxvbmcKKyAgICAjIHRvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNvIHRoYXQgaXQncyBhY3Rpb25zIGNhbiBiZQorICAgICMgcmVjb3JkZWQuCisKKyAgICBkZWYgaGFuZGxlX2NoYXJyZWYoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKCgiY2hhcnJlZiIsIGRhdGEpKQorICAgICAgICBzZ21sbGliLlNHTUxQYXJzZXIuaGFuZGxlX2NoYXJyZWYoc2VsZiwgZGF0YSkKKworICAgIGRlZiBoYW5kbGVfZW50aXR5cmVmKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImVudGl0eXJlZiIsIGRhdGEpKQorICAgICAgICBzZ21sbGliLlNHTUxQYXJzZXIuaGFuZGxlX2VudGl0eXJlZihzZWxmLCBkYXRhKQorCisKK2NsYXNzIFNHTUxQYXJzZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBjb2xsZWN0b3IgPSBFdmVudENvbGxlY3RvcgorCisgICAgZGVmIGdldF9ldmVudHMoc2VsZiwgc291cmNlKToKKyAgICAgICAgcGFyc2VyID0gc2VsZi5jb2xsZWN0b3IoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgcyBpbiBzb3VyY2U6CisgICAgICAgICAgICAgICAgcGFyc2VyLmZlZWQocykKKyAgICAgICAgICAgIHBhcnNlci5jbG9zZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICNzZWxmLmV2ZW50cyA9IHBhcnNlci5ldmVudHMKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiBwYXJzZXIuZ2V0X2V2ZW50cygpCisKKyAgICBkZWYgY2hlY2tfZXZlbnRzKHNlbGYsIHNvdXJjZSwgZXhwZWN0ZWRfZXZlbnRzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXZlbnRzID0gc2VsZi5nZXRfZXZlbnRzKHNvdXJjZSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgI2ltcG9ydCBzeXMKKyAgICAgICAgICAgICNwcmludCA+PnN5cy5zdGRlcnIsIHBwcmludC5wZm9ybWF0KHNlbGYuZXZlbnRzKQorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgaWYgZXZlbnRzICE9IGV4cGVjdGVkX2V2ZW50czoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmVjZWl2ZWQgZXZlbnRzIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgZXZlbnRzXG4iCisgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkOlxuIiArIHBwcmludC5wZm9ybWF0KGV4cGVjdGVkX2V2ZW50cykgKworICAgICAgICAgICAgICAgICAgICAgICJcblJlY2VpdmVkOlxuIiArIHBwcmludC5wZm9ybWF0KGV2ZW50cykpCisKKyAgICBkZWYgY2hlY2tfcGFyc2VfZXJyb3Ioc2VsZiwgc291cmNlKToKKyAgICAgICAgcGFyc2VyID0gRXZlbnRDb2xsZWN0b3IoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIuZmVlZChzb3VyY2UpCisgICAgICAgICAgICBwYXJzZXIuY2xvc2UoKQorICAgICAgICBleGNlcHQgc2dtbGxpYi5TR01MUGFyc2VFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgU0dNTFBhcnNlRXJyb3IgZm9yICVyXG5SZWNlaXZlZDpcbiVzIgorICAgICAgICAgICAgICAgICAgICAgICUgKHNvdXJjZSwgcHByaW50LnBmb3JtYXQocGFyc2VyLmdldF9ldmVudHMoKSkpKQorCisgICAgZGVmIHRlc3RfZG9jdHlwZV9kZWNsX2ludGVybmFsKHNlbGYpOgorICAgICAgICBpbnNpZGUgPSAiIiJcCitET0NUWVBFIGh0bWwgUFVCTElDICctLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOJworICAgICAgICAgICAgIFNZU1RFTSAnaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS9zdHJpY3QuZHRkJyBbCisgIDwhRUxFTUVOVCBodG1sIC0gTyBFTVBUWT4KKyAgPCFBVFRMSVNUIGh0bWwKKyAgICAgIHZlcnNpb24gQ0RBVEEgI0lNUExJRUQKKyAgICAgIHByb2ZpbGUgQ0RBVEEgJ0R1YmxpbkNvcmUnPgorICA8IU5PVEFUSU9OIGRhdGF0eXBlIFNZU1RFTSAnaHR0cDovL3htbC5weXRob24ub3JnL25vdGF0aW9ucy9weXRob24tbW9kdWxlJz4KKyAgPCFFTlRJVFkgbXlFbnRpdHkgJ2ludGVybmFsIHBhcnNlZCBlbnRpdHknPgorICA8IUVOVElUWSBhbkVudGl0eSBTWVNURU0gJ2h0dHA6Ly94bWwucHl0aG9uLm9yZy9lbnRpdGllcy9zb21ldGhpbmcueG1sJz4KKyAgPCFFTlRJVFkgJSBwYXJhbUVudGl0eSAnbmFtZXxuYW1lfG5hbWUnPgorICAlcGFyYW1FbnRpdHk7CisgIDwhLS0gY29tbWVudCAtLT4KK10iIiIKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8ISVzPiIgJSBpbnNpZGVdLCBbCisgICAgICAgICAgICAoImRlY2wiLCBpbnNpZGUpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2RvY3R5cGVfZGVjbF9leHRlcm5hbChzZWxmKToKKyAgICAgICAgaW5zaWRlID0gIkRPQ1RZUEUgaHRtbCBQVUJMSUMgJy0vL1czQy8vRFREIEhUTUwgNC4wMS8vRU4nIgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPCElcz4iICUgaW5zaWRlLCBbCisgICAgICAgICAgICAoImRlY2wiLCBpbnNpZGUpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3VuZGVyc2NvcmVfaW5fYXR0cm5hbWUoc2VsZik6CisgICAgICAgICMgU0YgYnVnICM0MzY2MjEKKyAgICAgICAgIiIiTWFrZSBzdXJlIGF0dHJpYnV0ZSBuYW1lcyB3aXRoIHVuZGVyc2NvcmVzIGFyZSBhY2NlcHRlZCIiIgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPGEgaGFzX3VuZGVyIF91bmRlcj4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJoYXNfdW5kZXIiLCAiaGFzX3VuZGVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJfdW5kZXIiLCAiX3VuZGVyIildKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF91bmRlcnNjb3JlX2luX3RhZ25hbWUoc2VsZik6CisgICAgICAgICMgU0YgYnVnICM0MzY2MjEKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRhZyBuYW1lcyB3aXRoIHVuZGVyc2NvcmVzIGFyZSBhY2NlcHRlZCIiIgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPGhhc191bmRlcj48L2hhc191bmRlcj4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImhhc191bmRlciIsIFtdKSwKKyAgICAgICAgICAgICgiZW5kdGFnIiwgImhhc191bmRlciIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3F1b3Rlc19pbl91bnF1b3RlZF9hdHRycyhzZWxmKToKKyAgICAgICAgIyBTRiBidWcgIzQzNjYyMQorICAgICAgICAiIiJCZSBzdXJlIHF1b3RlcyBpbiB1bnF1b3RlZCBhdHRyaWJ1dGVzIGFyZSBtYWRlIHBhcnQgb2YgdGhlIHZhbHVlIiIiCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8YSBocmVmPWZvbydiYXJcImJhej4iLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgImZvbydiYXJcImJheiIpXSksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfeGh0bWxfZW1wdHlfdGFnKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGluZyBvZiBYSFRNTC1zdHlsZSBlbXB0eSBzdGFydCB0YWdzIiIiCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8YnIgLz50ZXh0PGk+PC9pPiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYnIiLCBbXSksCisgICAgICAgICAgICAoImRhdGEiLCAidGV4dCIpLAorICAgICAgICAgICAgKCJzdGFydHRhZyIsICJpIiwgW10pLAorICAgICAgICAgICAgKCJlbmR0YWciLCAiaSIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3Byb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fb25seShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjw/cHJvY2Vzc2luZyBpbnN0cnVjdGlvbj4iLCBbCisgICAgICAgICAgICAoInBpIiwgInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24iKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9iYWRfbmVzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIjxhPjxiPjwvYT48L2I+IiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgW10pLAorICAgICAgICAgICAgKCJzdGFydHRhZyIsICJiIiwgW10pLAorICAgICAgICAgICAgKCJlbmR0YWciLCAiYSIpLAorICAgICAgICAgICAgKCJlbmR0YWciLCAiYiIpLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2JhcmVfYW1wZXJzYW5kcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoInRoaXMgdGV4dCAmIGNvbnRhaW5zICYgYW1wZXJzYW5kcyAmIiwgWworICAgICAgICAgICAgKCJkYXRhIiwgInRoaXMgdGV4dCAmIGNvbnRhaW5zICYgYW1wZXJzYW5kcyAmIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYmFyZV9wb2ludHlfYnJhY2tldHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCJ0aGlzIDwgdGV4dCA+IGNvbnRhaW5zIDwgYmFyZT5wb2ludHk8IGJyYWNrZXRzIiwgWworICAgICAgICAgICAgKCJkYXRhIiwgInRoaXMgPCB0ZXh0ID4gY29udGFpbnMgPCBiYXJlPnBvaW50eTwgYnJhY2tldHMiKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9hdHRyX3N5bnRheChzZWxmKToKKyAgICAgICAgb3V0cHV0ID0gWworICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImIiLCAidiIpLCAoImMiLCAidiIpLCAoImQiLCAidiIpLCAoImUiLCAiZSIpXSkKKyAgICAgICAgICBdCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9J3YnIGM9InYiIGQ9diBlPiIiIiwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSAgYiA9ICd2JyBjID0gInYiIGQgPSB2IGU+IiIiLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhXG5iXG49XG4ndidcbmNcbj1cbiJ2IlxuZFxuPVxudlxuZT4iIiIsIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGFcdGJcdD1cdCd2J1x0Y1x0PVx0InYiXHRkXHQ9XHR2XHRlPiIiIiwgb3V0cHV0KQorCisgICAgZGVmIHRlc3RfYXR0cl92YWx1ZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9J3h4eFxuXHR4eHgnIGM9Inl5eVx0XG55eXkiIGQ9J1x0eHl6XG4nPiIiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgInh4eFxuXHR4eHgiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgInl5eVx0XG55eXkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgIlx0eHl6XG4iKV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYj0nJyBjPSIiPiIiIiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICIiKSwgKCJjIiwgIiIpXSksCisgICAgICAgICAgICBdKQorICAgICAgICAjIFVSTCBjb25zdHJ1Y3Rpb24gc3R1ZmYgZnJvbSBSRkMgMTgwODoKKyAgICAgICAgc2FmZSA9ICIkLV8uKyIKKyAgICAgICAgZXh0cmEgPSAiISonKCksIgorICAgICAgICByZXNlcnZlZCA9ICI7Lz86QCY9IgorICAgICAgICB1cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tOjgwODAvcGF0aC90by9maWxlPyVzJXMlcyIgJSAoCisgICAgICAgICAgICBzYWZlLCBleHRyYSwgcmVzZXJ2ZWQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxlIGE9JXM+IiIiICUgdXJsLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImUiLCBbKCJhIiwgdXJsKV0pLAorICAgICAgICAgICAgXSkKKyAgICAgICAgIyBSZWdyZXNzaW9uIHRlc3QgZm9yIFNGIHBhdGNoICM2Njk2ODMuCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8ZSBhPXJnYigxLDIsMyk+IiwgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJlIiwgWygiYSIsICJyZ2IoMSwyLDMpIildKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9hdHRyX3ZhbHVlc19lbnRpdGllcyhzZWxmKToKKyAgICAgICAgIiIiU3Vic3RpdHV0aW9uIG9mIGVudGl0aWVzIGFuZCBjaGFycmVmcyBpbiBhdHRyaWJ1dGUgdmFsdWVzIiIiCisgICAgICAgICMgU0YgYnVnICMxNDUyMjQ2CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9Jmx0OyBjPSZsdDsmZ3Q7IGQ9Jmx0LSZndDsgZT0nJmx0OyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGY9IiZ4eHg7IiBnPScmIzMyOyYjMzM7JyBoPScmIzUwMDsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGk9J3g/YT1iJmM9ZDsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGo9JyZhbXA7IzQyOycgaz0nJiMzODsjNDI7Jz4iIiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsICI8PiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCAiJmx0LT4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgIjwgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZiIsICImeHh4OyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImciLCAiICEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgIiYjNTAwOyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCAieD9hPWImYz1kOyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImoiLCAiJiM0MjsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJrIiwgIiYjNDI7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXSkKKworICAgIGRlZiB0ZXN0X2NvbnZlcnRfb3ZlcnJpZGVzKHNlbGYpOgorICAgICAgICAjIFRoaXMgY2hlY2tzIHRoYXQgdGhlIGNoYXJhY3RlciBhbmQgZW50aXR5IHJlZmVyZW5jZQorICAgICAgICAjIGNvbnZlcnNpb24gaGVscGVycyBhcmUgY2FsbGVkIGF0IHRoZSBkb2N1bWVudGVkIHRpbWVzLiAgTm8KKyAgICAgICAgIyBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhbGx5IGNoYW5nZSB3aGF0IHRoZSBwYXJzZXIgYWNjZXB0cy4KKyAgICAgICAgIworICAgICAgICBzZWxmLmNvbGxlY3RvciA9IEhUTUxFbnRpdHlDb2xsZWN0b3IKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoKCc8YSB0aXRsZT0iJmxkcXVvO3Rlc3QmI3gyMDFkOyI+Zm9vPC9hPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcmZm9vYmFyOyYjNDI7JyksIFsKKyAgICAgICAgICAgICgnZW50aXR5cmVmJywgJ2NvbnZlcnQnLCAnbGRxdW8nKSwKKyAgICAgICAgICAgICgnY2hhcnJlZicsICdjb252ZXJ0JywgJ3gyMDFkJyksCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2EnLCBbKCd0aXRsZScsICcmbGRxdW87dGVzdCYjeDIwMWQ7JyldKSwKKyAgICAgICAgICAgICgnZGF0YScsICdmb28nKSwKKyAgICAgICAgICAgICgnZW5kdGFnJywgJ2EnKSwKKyAgICAgICAgICAgICgnZW50aXR5cmVmJywgJ2Zvb2JhcicpLAorICAgICAgICAgICAgKCdlbnRpdHlyZWYnLCAnY29udmVydCcsICdmb29iYXInKSwKKyAgICAgICAgICAgICgnY2hhcnJlZicsICc0MicpLAorICAgICAgICAgICAgKCdjaGFycmVmJywgJ2NvbnZlcnQnLCAnNDInKSwKKyAgICAgICAgICAgICgnY29kZXBvaW50JywgJ2NvbnZlcnQnLCA0MiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYXR0cl9mdW5reV9uYW1lcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYS5iPSd2JyBjOmQ9diBlLWY9dj4iIiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImEuYiIsICJ2IiksICgiYzpkIiwgInYiKSwgKCJlLWYiLCAidiIpXSksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYXR0cl92YWx1ZV9pcDZfdXJsKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi84NTM1MDYKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoKCI8YSBocmVmPSdodHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vJz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGEgaHJlZj1odHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vPiIpLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgImh0dHA6Ly9bMTA4MDo6ODo4MDA6MjAwQzo0MTdBXS8iKV0pLAorICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiaHJlZiIsICJodHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vIildKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF93ZWlyZF9zdGFydHRhZ3Moc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8YTxhPiIsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFtdKSwKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFtdKSwKKyAgICAgICAgICAgIF0pCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCI8L2E8YT4iLCBbCisgICAgICAgICAgICAoImVuZHRhZyIsICJhIiksCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbXSksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZGVjbGFyYXRpb25fanVua19jaGFycyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPCFET0NUWVBFIGZvbyAkID4iKQorCisgICAgZGVmIHRlc3RfZ2V0X3N0YXJ0dGFnX3RleHQoc2VsZik6CisgICAgICAgIHMgPSAiIiI8Zm9vYmFyICAgXG4gICBvbmU9IjEiXHR0d289MiAgID4iIiIKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMocywgWworICAgICAgICAgICAgKCJzdGFydHRhZyIsICJmb29iYXIiLCBbKCJvbmUiLCAiMSIpLCAoInR3byIsICIyIildKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jZGF0YV9jb250ZW50KHNlbGYpOgorICAgICAgICBzID0gKCI8Y2RhdGE+IDwhLS0gbm90IGEgY29tbWVudCAtLT4gJm5vdC1hbi1lbnRpdHktcmVmOyA8L2NkYXRhPiIKKyAgICAgICAgICAgICAiPG5vdGNkYXRhPiA8IS0tIGNvbW1lbnQgLS0+IDwvbm90Y2RhdGE+IikKKyAgICAgICAgc2VsZi5jb2xsZWN0b3IgPSBDREFUQUV2ZW50Q29sbGVjdG9yCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKHMsIFsKKyAgICAgICAgICAgICgic3RhcnR0YWciLCAiY2RhdGEiLCBbXSksCisgICAgICAgICAgICAoImRhdGEiLCAiIDwhLS0gbm90IGEgY29tbWVudCAtLT4gJm5vdC1hbi1lbnRpdHktcmVmOyAiKSwKKyAgICAgICAgICAgICgiZW5kdGFnIiwgImNkYXRhIiksCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgIm5vdGNkYXRhIiwgW10pLAorICAgICAgICAgICAgKCJkYXRhIiwgIiAiKSwKKyAgICAgICAgICAgICgiY29tbWVudCIsICIgY29tbWVudCAiKSwKKyAgICAgICAgICAgICgiZGF0YSIsICIgIiksCisgICAgICAgICAgICAoImVuZHRhZyIsICJub3RjZGF0YSIpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgcyA9ICIiIjxjZGF0YT4gPG5vdCBhPSdzdGFydCB0YWcnPiA8L2NkYXRhPiIiIgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhzLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImNkYXRhIiwgW10pLAorICAgICAgICAgICAgKCJkYXRhIiwgIiA8bm90IGE9J3N0YXJ0IHRhZyc+ICIpLAorICAgICAgICAgICAgKCJlbmR0YWciLCAiY2RhdGEiKSwKKyAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9pbGxlZ2FsX2RlY2xhcmF0aW9ucyhzZWxmKToKKyAgICAgICAgcyA9ICdhYmM8IXNwYWNlciB0eXBlPSJibG9jayIgaGVpZ2h0PSIyNSI+ZGVmJworICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhzLCBbCisgICAgICAgICAgICAoImRhdGEiLCAiYWJjIiksCisgICAgICAgICAgICAoInVua25vd24gZGVjbCIsICdzcGFjZXIgdHlwZT0iYmxvY2siIGhlaWdodD0iMjUiJyksCisgICAgICAgICAgICAoImRhdGEiLCAiZGVmIiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZW51bWVyYXRlZF9hdHRyX3R5cGUoc2VsZik6CisgICAgICAgIHMgPSAiPCFET0NUWVBFIGRvYyBbPCFBVFRMSVNUIGRvYyBhdHRyIChhIHwgYikgPl0+IgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhzLCBbCisgICAgICAgICAgICAoJ2RlY2wnLCAnRE9DVFlQRSBkb2MgWzwhQVRUTElTVCBkb2MgYXR0ciAoYSB8IGIpID5dJyksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfcmVhZF9jaHVua3Moc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxNTQxNjk3LCB0aGlzIGNhdXNlZCBzZ21sIHBhcnNlciB0byBoYW5nCisgICAgICAgICMgSnVzdCB2ZXJpZnkgdGhpcyBjb2RlIGRvZXNuJ3QgY2F1c2UgYSBoYW5nLgorICAgICAgICBDSFVOSyA9IDEwMjQgICMgaW5jcmVhc2luZyB0aGlzIHRvIDgyMTIgbWFrZXMgdGhlIHByb2JsZW0gZ28gYXdheQorCisgICAgICAgIGYgPSBvcGVuKHRlc3Rfc3VwcG9ydC5maW5kZmlsZSgnc2dtbF9pbnB1dC5odG1sJykpCisgICAgICAgIGZwID0gc2dtbGxpYi5TR01MUGFyc2VyKCkKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoQ0hVTkspCisgICAgICAgICAgICBmcC5mZWVkKGRhdGEpCisgICAgICAgICAgICBpZiBsZW4oZGF0YSkgIT0gQ0hVTks6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiB0ZXN0X29ubHlfZGVjb2RlX2FzY2lpKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyAjMTY1MTk5NSwgbWFrZSBzdXJlIG5vbi1hc2NpaSBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhcmUgbm90IGRlY29kZWQKKyAgICAgICAgcyA9ICc8c2lnbnMgZXhjbGFtYXRpb249IiYjMzMiIGNvcHlyaWdodD0iJiMxNjkiIHF1b3RlbGVmdD0iJiM4MjE2OyI+JworICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhzLCBbCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ3NpZ25zJywKKyAgICAgICAgICAgICBbKCdleGNsYW1hdGlvbicsICchJyksICgnY29weXJpZ2h0JywgJyYjMTY5JyksCisgICAgICAgICAgICAgICgncXVvdGVsZWZ0JywgJyYjODIxNjsnKV0pLAorICAgICAgICAgICAgXSkKKworICAgICMgWFhYIFRoZXNlIHRlc3RzIGhhdmUgYmVlbiBkaXNhYmxlZCBieSBwcmVmaXhpbmcgdGhlaXIgbmFtZXMgd2l0aAorICAgICMgYW4gdW5kZXJzY29yZS4gIFRoZSBmaXJzdCB0d28gZXhlcmNpc2Ugb3V0c3RhbmRpbmcgYnVncyBpbiB0aGUKKyAgICAjIHNnbWxsaWIgbW9kdWxlLCBhbmQgdGhlIHRoaXJkIGV4aGliaXRzIHF1ZXN0aW9uYWJsZSBiZWhhdmlvcgorICAgICMgdGhhdCBuZWVkcyB0byBiZSBjYXJlZnVsbHkgY29uc2lkZXJlZCBiZWZvcmUgY2hhbmdpbmcgaXQuCisKKyAgICBkZWYgX3Rlc3Rfc3RhcnR0YWdfZW5kX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPGEgYj0nPCc+IiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpXSldKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPGEgYj0nPic+IiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPiIpXSldKQorCisgICAgZGVmIF90ZXN0X2J1ZmZlcl9hcnRlZmFjdHMoc2VsZik6CisgICAgICAgIG91dHB1dCA9IFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKV0pXQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjxhIGI9JzwnPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgIiwgImI9JzwnPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYiIsICI9JzwnPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYj0iLCAiJzwnPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYj0nPCIsICInPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYj0nPCciLCAiPiJdLCBvdXRwdXQpCisKKyAgICAgICAgb3V0cHV0ID0gWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPiIpXSldCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPGEgYj0nPic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSAiLCAiYj0nPic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiIiwgIj0nPic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSIsICInPic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSc+IiwgIic+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSc+JyIsICI+Il0sIG91dHB1dCkKKworICAgICAgICBvdXRwdXQgPSBbKCJjb21tZW50IiwgImFiYyIpXQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIiIsICI8IS0tYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IiwgIiEtLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEiLCAiLS1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLSIsICItYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tIiwgImFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWEiLCAiYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYiIsICJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYWJjIiwgIi0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiYy0iLCAiLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMtLSIsICI+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYWJjLS0+IiwgIiJdLCBvdXRwdXQpCisKKyAgICBkZWYgX3Rlc3Rfc3RhcnR0YWdfanVua19jaGFycyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPCIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjw+IikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPC8kPiIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjwvIikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPC9hIikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPCQiKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8JD4iKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8ISIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjxhICQ+IikKKyAgICAgICAgc2VsZi5jaGVja19wYXJzZV9lcnJvcigiPGEiKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8YSBmb289J2JhciciKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8YSBmb289J2JhciIpCisgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjxhIGZvbz0nPiciKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8YSBmb289Jz4iKQorICAgICAgICBzZWxmLmNoZWNrX3BhcnNlX2Vycm9yKCI8YSBmb289PiIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU0dNTFBhcnNlclRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NnbWxsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjOGMzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NnbWxsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NnbWxsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2dtbGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjOGMzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NnbWxsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoYS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoYS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjM4NDM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hhLnB5CkBAIC0wLDAgKzEsNTYgQEAKKyMgVGVzdGluZyBzaGEgbW9kdWxlIChOSVNUJ3MgU2VjdXJlIEhhc2ggQWxnb3JpdGhtKQorCisjIHVzZSB0aGUgdGhyZWUgZXhhbXBsZXMgZnJvbSBGZWRlcmFsIEluZm9ybWF0aW9uIFByb2Nlc3NpbmcgU3RhbmRhcmRzCisjIFB1YmxpY2F0aW9uIDE4MC0xLCBTZWN1cmUgSGFzaCBTdGFuZGFyZCwgIDE5OTUgQXByaWwgMTcKKyMgaHR0cDovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk3L3B1YnMvZmlwMTgwLTEuaHRtCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0aGUgc2hhIG1vZHVsZSBpcyBkZXByZWNhdGVkLioiLAorICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorCitpbXBvcnQgc2hhCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworY2xhc3MgU0hBVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjaGVjayhzZWxmLCBkYXRhLCBkaWdlc3QpOgorICAgICAgICAjIENoZWNrIGRpZ2VzdCBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZQorICAgICAgICBvYmogPSBzaGEubmV3KGRhdGEpCisgICAgICAgIGNvbXB1dGVkID0gb2JqLmhleGRpZ2VzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wdXRlZCA9PSBkaWdlc3QpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgdmFsdWUgZG9lc24ndCBjaGFuZ2UgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUKKyAgICAgICAgIyBkaWdlc3Qgb3BlcmF0aW9ucy4KKyAgICAgICAgY29tcHV0ZWRfYWdhaW4gPSBvYmouaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXB1dGVkID09IGNvbXB1dGVkX2FnYWluKQorCisgICAgICAgICMgQ2hlY2sgaGV4ZGlnZXN0KCkgb3V0cHV0IG1hdGNoZXMgZGlnZXN0KCkncyBvdXRwdXQKKyAgICAgICAgZGlnZXN0ID0gb2JqLmRpZ2VzdCgpCisgICAgICAgIGhleGQgPSAiIgorICAgICAgICBmb3IgYyBpbiBkaWdlc3Q6CisgICAgICAgICAgICBoZXhkICs9ICclMDJ4JyAlIG9yZChjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcHV0ZWQgPT0gaGV4ZCkKKworICAgIGRlZiB0ZXN0X2Nhc2VfMShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVjaygiYWJjIiwKKyAgICAgICAgICAgICAgICAgICAiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpCisKKyAgICBkZWYgdGVzdF9jYXNlXzIoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soImFiY2RiY2RlY2RlZmRlZmdlZmdoZmdoaWdoaWpoaWpraWprbGprbG1rbG1ubG1ub21ub3Bub3BxIiwKKyAgICAgICAgICAgICAgICAgICAiODQ5ODNlNDQxYzNiZDI2ZWJhYWU0YWExZjk1MTI5ZTVlNTQ2NzBmMSIpCisKKyAgICBkZWYgdGVzdF9jYXNlXzMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soImEiICogMTAwMDAwMCwKKyAgICAgICAgICAgICAgICAgICAiMzRhYTk3M2NkNGM0ZGFhNGY2MWVlYjJiZGJhZDI3MzE2NTM0MDE2ZiIpCisKKyAgICBkZWYgdGVzdF9jYXNlXzQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2soY2hyKDB4QUEpICogODAsCisgICAgICAgICAgICAgICAgICAgJzRjYTBlZjM4ZjE3OTRiMjhhOGY4ZWUxMTBlZTc5ZDQ4Y2UxM2JlMjUnKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTSEFUZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGEucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hhLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTczNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hhLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGEucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hhLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTczNTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hhLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGVsdmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGVsdmUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY1NjYyNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weQpAQCAtMCwwICsxLDE2MyBAQAoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzaGVsdmUKK2ltcG9ydCBnbG9iCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnYW55ZGJtJywgZGVwcmVjYXRlZD1UcnVlKQorCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBmbiA9ICJzaGVsZnRlbXAiICsgb3MuZXh0c2VwICsgImRiIgorCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIGQxID0ge30KKyAgICAgICAgcyA9IHNoZWx2ZS5TaGVsZihkMSwgcHJvdG9jb2w9Miwgd3JpdGViYWNrPUZhbHNlKQorICAgICAgICBzWydrZXkxJ10gPSBbMSwyLDMsNF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sIFsxLDIsMyw0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocyksIDEpCisgICAgICAgIHMuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsZW4sIHMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNbJ2tleTEnXQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnQ2xvc2VkIHNoZWxmIHNob3VsZCBub3QgZmluZCBhIGtleScpCisKKyAgICBkZWYgdGVzdF9hc2NpaV9maWxlX3NoZWxmKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gc2hlbHZlLm9wZW4oc2VsZi5mbiwgcHJvdG9jb2w9MCkKKyAgICAgICAgICAgIHNbJ2tleTEnXSA9ICgxLDIsMyw0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sICgxLDIsMyw0KSkKKyAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIGYgaW4gZ2xvYi5nbG9iKHNlbGYuZm4rIioiKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZikKKworICAgIGRlZiB0ZXN0X2JpbmFyeV9maWxlX3NoZWxmKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gc2hlbHZlLm9wZW4oc2VsZi5mbiwgcHJvdG9jb2w9MSkKKyAgICAgICAgICAgIHNbJ2tleTEnXSA9ICgxLDIsMyw0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sICgxLDIsMyw0KSkKKyAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIGYgaW4gZ2xvYi5nbG9iKHNlbGYuZm4rIioiKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZikKKworICAgIGRlZiB0ZXN0X3Byb3RvMl9maWxlX3NoZWxmKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzID0gc2hlbHZlLm9wZW4oc2VsZi5mbiwgcHJvdG9jb2w9MikKKyAgICAgICAgICAgIHNbJ2tleTEnXSA9ICgxLDIsMyw0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sICgxLDIsMyw0KSkKKyAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIGYgaW4gZ2xvYi5nbG9iKHNlbGYuZm4rIioiKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsoZikKKworICAgIGRlZiB0ZXN0X2luX21lbW9yeV9zaGVsZihzZWxmKToKKyAgICAgICAgZDEgPSB7fQorICAgICAgICBzID0gc2hlbHZlLlNoZWxmKGQxLCBwcm90b2NvbD0wKQorICAgICAgICBzWydrZXkxJ10gPSAoMSwyLDMsNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sICgxLDIsMyw0KSkKKyAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIGQyID0ge30KKyAgICAgICAgcyA9IHNoZWx2ZS5TaGVsZihkMiwgcHJvdG9jb2w9MSkKKyAgICAgICAgc1sna2V5MSddID0gKDEsMiwzLDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1sna2V5MSddLCAoMSwyLDMsNCkpCisgICAgICAgIHMuY2xvc2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQxKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkMSwgZDIpCisKKyAgICBkZWYgdGVzdF9tdXRhYmxlX2VudHJ5KHNlbGYpOgorICAgICAgICBkMSA9IHt9CisgICAgICAgIHMgPSBzaGVsdmUuU2hlbGYoZDEsIHByb3RvY29sPTIsIHdyaXRlYmFjaz1GYWxzZSkKKyAgICAgICAgc1sna2V5MSddID0gWzEsMiwzLDRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1sna2V5MSddLCBbMSwyLDMsNF0pCisgICAgICAgIHNbJ2tleTEnXS5hcHBlbmQoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sIFsxLDIsMyw0XSkKKyAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgZDIgPSB7fQorICAgICAgICBzID0gc2hlbHZlLlNoZWxmKGQyLCBwcm90b2NvbD0yLCB3cml0ZWJhY2s9VHJ1ZSkKKyAgICAgICAgc1sna2V5MSddID0gWzEsMiwzLDRdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1sna2V5MSddLCBbMSwyLDMsNF0pCisgICAgICAgIHNbJ2tleTEnXS5hcHBlbmQoNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWydrZXkxJ10sIFsxLDIsMyw0LDVdKQorICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQyKSwgMSkKKworICAgIGRlZiB0ZXN0X3dyaXRlYmFja19hbHNvX3dyaXRlc19pbW1lZGlhdGVseShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA1NzU0CisgICAgICAgIGQgPSB7fQorICAgICAgICBzID0gc2hlbHZlLlNoZWxmKGQsIHdyaXRlYmFjaz1UcnVlKQorICAgICAgICBzWydrZXknXSA9IFsxXQorICAgICAgICBwMSA9IGRbJ2tleSddICAjIFdpbGwgZ2l2ZSBhIEtleUVycm9yIGlmIGJhY2tpbmcgc3RvcmUgbm90IHVwZGF0ZWQKKyAgICAgICAgc1sna2V5J10uYXBwZW5kKDIpCisgICAgICAgIHMuY2xvc2UoKQorICAgICAgICBwMiA9IGRbJ2tleSddCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocDEsIHAyKSAgIyBXcml0ZSBjcmVhdGVzIG5ldyBvYmplY3QgaW4gc3RvcmUKKworCitmcm9tIHRlc3QgaW1wb3J0IG1hcHBpbmdfdGVzdHMKKworY2xhc3MgVGVzdFNoZWx2ZUJhc2UobWFwcGluZ190ZXN0cy5CYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wpOgorICAgIGZuID0gInNoZWxmdGVtcC5kYiIKKyAgICBjb3VudGVyID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIHNlbGYuX2RiID0gW10KKyAgICAgICAgbWFwcGluZ190ZXN0cy5CYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisgICAgdHlwZTJ0ZXN0ID0gc2hlbHZlLlNoZWxmCisgICAgZGVmIF9yZWZlcmVuY2Uoc2VsZik6CisgICAgICAgIHJldHVybiB7ImtleTEiOiJ2YWx1ZTEiLCAia2V5MiI6MiwgImtleTMiOigxLDIsMyl9CisgICAgZGVmIF9lbXB0eV9tYXBwaW5nKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9pbl9tZW06CisgICAgICAgICAgICB4PSBzaGVsdmUuU2hlbGYoe30sICoqc2VsZi5fYXJncykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY291bnRlcis9MQorICAgICAgICAgICAgeD0gc2hlbHZlLm9wZW4oc2VsZi5mbitzdHIoc2VsZi5jb3VudGVyKSwgKipzZWxmLl9hcmdzKQorICAgICAgICBzZWxmLl9kYi5hcHBlbmQoeCkKKyAgICAgICAgcmV0dXJuIHgKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBkYiBpbiBzZWxmLl9kYjoKKyAgICAgICAgICAgIGRiLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fZGIgPSBbXQorICAgICAgICBpZiBub3Qgc2VsZi5faW5fbWVtOgorICAgICAgICAgICAgZm9yIGYgaW4gZ2xvYi5nbG9iKHNlbGYuZm4rIioiKToKKyAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKGYpCisKK2NsYXNzIFRlc3RBc2NpaUZpbGVTaGVsdmUoVGVzdFNoZWx2ZUJhc2UpOgorICAgIF9hcmdzPXsncHJvdG9jb2wnOjB9CisgICAgX2luX21lbSA9IEZhbHNlCitjbGFzcyBUZXN0QmluYXJ5RmlsZVNoZWx2ZShUZXN0U2hlbHZlQmFzZSk6CisgICAgX2FyZ3M9eydwcm90b2NvbCc6MX0KKyAgICBfaW5fbWVtID0gRmFsc2UKK2NsYXNzIFRlc3RQcm90bzJGaWxlU2hlbHZlKFRlc3RTaGVsdmVCYXNlKToKKyAgICBfYXJncz17J3Byb3RvY29sJzoyfQorICAgIF9pbl9tZW0gPSBGYWxzZQorY2xhc3MgVGVzdEFzY2lpTWVtU2hlbHZlKFRlc3RTaGVsdmVCYXNlKToKKyAgICBfYXJncz17J3Byb3RvY29sJzowfQorICAgIF9pbl9tZW0gPSBUcnVlCitjbGFzcyBUZXN0QmluYXJ5TWVtU2hlbHZlKFRlc3RTaGVsdmVCYXNlKToKKyAgICBfYXJncz17J3Byb3RvY29sJzoxfQorICAgIF9pbl9tZW0gPSBUcnVlCitjbGFzcyBUZXN0UHJvdG8yTWVtU2hlbHZlKFRlc3RTaGVsdmVCYXNlKToKKyAgICBfYXJncz17J3Byb3RvY29sJzoyfQorICAgIF9pbl9tZW0gPSBUcnVlCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBUZXN0QXNjaWlGaWxlU2hlbHZlLAorICAgICAgICBUZXN0QmluYXJ5RmlsZVNoZWx2ZSwKKyAgICAgICAgVGVzdFByb3RvMkZpbGVTaGVsdmUsCisgICAgICAgIFRlc3RBc2NpaU1lbVNoZWx2ZSwKKyAgICAgICAgVGVzdEJpbmFyeU1lbVNoZWx2ZSwKKyAgICAgICAgVGVzdFByb3RvMk1lbVNoZWx2ZSwKKyAgICAgICAgVGVzdENhc2UKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGVsdmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjMzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGVsdmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NoZWx2ZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGVsdmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYjMzNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGVsdmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NobGV4LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hsZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMzNWY0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NobGV4LnB5CkBAIC0wLDAgKzEsMTkxIEBACisjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzaGxleAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworCisjIFRoZSBvcmlnaW5hbCB0ZXN0IGRhdGEgc2V0IHdhcyBmcm9tIHNoZWxsd29yZHMsIGJ5IEhhcnRtdXQgR29lYmVsLgorCitkYXRhID0gciIiInh8eHwKK2ZvbyBiYXJ8Zm9vfGJhcnwKKyBmb28gYmFyfGZvb3xiYXJ8CisgZm9vIGJhciB8Zm9vfGJhcnwKK2ZvbyAgIGJhciAgICBibGEgICAgIGZhc2VsfGZvb3xiYXJ8YmxhfGZhc2VsfAoreCB5ICB6ICAgICAgICAgICAgICB4eHh4fHh8eXx6fHh4eHh8CitceCBiYXJ8XHx4fGJhcnwKK1wgeCBiYXJ8XHx4fGJhcnwKK1wgYmFyfFx8YmFyfAorZm9vIFx4IGJhcnxmb298XHx4fGJhcnwKK2ZvbyBcIHggYmFyfGZvb3xcfHh8YmFyfAorZm9vIFwgYmFyfGZvb3xcfGJhcnwKK2ZvbyAiYmFyIiBibGF8Zm9vfCJiYXIifGJsYXwKKyJmb28iICJiYXIiICJibGEifCJmb28ifCJiYXIifCJibGEifAorImZvbyIgYmFyICJibGEifCJmb28ifGJhcnwiYmxhInwKKyJmb28iIGJhciBibGF8ImZvbyJ8YmFyfGJsYXwKK2ZvbyAnYmFyJyBibGF8Zm9vfCdiYXInfGJsYXwKKydmb28nICdiYXInICdibGEnfCdmb28nfCdiYXInfCdibGEnfAorJ2ZvbycgYmFyICdibGEnfCdmb28nfGJhcnwnYmxhJ3wKKydmb28nIGJhciBibGF8J2Zvbyd8YmFyfGJsYXwKK2JsdXJiIGZvbyJiYXIiYmFyImZhc2VsIiBiYXp8Ymx1cmJ8Zm9vImJhciJiYXIiZmFzZWwifGJhenwKK2JsdXJiIGZvbydiYXInYmFyJ2Zhc2VsJyBiYXp8Ymx1cmJ8Zm9vJ2JhcidiYXInZmFzZWwnfGJhenwKKyIifCIifAorJyd8Jyd8Citmb28gIiIgYmFyfGZvb3wiInxiYXJ8Citmb28gJycgYmFyfGZvb3wnJ3xiYXJ8Citmb28gIiIgIiIgIiIgYmFyfGZvb3wiInwiInwiInxiYXJ8Citmb28gJycgJycgJycgYmFyfGZvb3wnJ3wnJ3wnJ3xiYXJ8CitcIiJ8XHwiInwKKyJcInwiXCJ8CisiZm9vXCBiYXIifCJmb29cIGJhciJ8CisiZm9vXFwgYmFyInwiZm9vXFwgYmFyInwKKyJmb29cXCBiYXJcInwiZm9vXFwgYmFyXCJ8CisiZm9vXFwiIGJhclwiInwiZm9vXFwifGJhcnxcfCIifAorImZvb1xcIGJhclwiIGRmYWRmInwiZm9vXFwgYmFyXCJ8ZGZhZGYifAorImZvb1xcXCBiYXJcIiBkZmFkZiJ8ImZvb1xcXCBiYXJcInxkZmFkZiJ8CisiZm9vXFxceCBiYXJcIiBkZmFkZiJ8ImZvb1xcXHggYmFyXCJ8ZGZhZGYifAorImZvb1x4IGJhclwiIGRmYWRmInwiZm9vXHggYmFyXCJ8ZGZhZGYifAorXCcnfFx8Jyd8CisnZm9vXCBiYXInfCdmb29cIGJhcid8CisnZm9vXFwgYmFyJ3wnZm9vXFwgYmFyJ3wKKyJmb29cXFx4IGJhclwiIGRmJ2FcICdkZid8ImZvb1xcXHggYmFyXCJ8ZGYnYXxcfCdkZid8CitcImZvbyJ8XHwiZm9vInwKK1wiZm9vIlx4fFx8ImZvbyJ8XHx4fAorImZvb1x4InwiZm9vXHgifAorImZvb1wgInwiZm9vXCAifAorZm9vXCB4eHxmb298XHx4eHwKK2Zvb1wgeFx4fGZvb3xcfHh8XHx4fAorZm9vXCB4XHhcIiJ8Zm9vfFx8eHxcfHh8XHwiInwKKyJmb29cIHhceCJ8ImZvb1wgeFx4InwKKyJmb29cIHhceFxcInwiZm9vXCB4XHhcXCJ8CisiZm9vXCB4XHhcXCIiZm9vYmFyInwiZm9vXCB4XHhcXCJ8ImZvb2JhciJ8CisiZm9vXCB4XHhcXCJcJyciZm9vYmFyInwiZm9vXCB4XHhcXCJ8XHwnJ3wiZm9vYmFyInwKKyJmb29cIHhceFxcIlwnImZvJ29iYXIifCJmb29cIHhceFxcInxcfCciZm8nfG9iYXIifAorImZvb1wgeFx4XFwiXCciZm8nb2JhciIgJ2RvbidcJyd0J3wiZm9vXCB4XHhcXCJ8XHwnImZvJ3xvYmFyInwnZG9uJ3xcfCcnfHQnfAorJ2Zvb1wgYmFyJ3wnZm9vXCBiYXInfAorJ2Zvb1xcIGJhcid8J2Zvb1xcIGJhcid8Citmb29cIGJhcnxmb298XHxiYXJ8Citmb28jYmFyXG5iYXp8Zm9vYmF6fAorOi0pIDstKXw6fC18KXw7fC18KXwKK+Hp7fP6fOF86XztfPN8+nwKKyIiIgorCitwb3NpeF9kYXRhID0gciIiInh8eHwKK2ZvbyBiYXJ8Zm9vfGJhcnwKKyBmb28gYmFyfGZvb3xiYXJ8CisgZm9vIGJhciB8Zm9vfGJhcnwKK2ZvbyAgIGJhciAgICBibGEgICAgIGZhc2VsfGZvb3xiYXJ8YmxhfGZhc2VsfAoreCB5ICB6ICAgICAgICAgICAgICB4eHh4fHh8eXx6fHh4eHh8CitceCBiYXJ8eHxiYXJ8CitcIHggYmFyfCB4fGJhcnwKK1wgYmFyfCBiYXJ8Citmb28gXHggYmFyfGZvb3x4fGJhcnwKK2ZvbyBcIHggYmFyfGZvb3wgeHxiYXJ8Citmb28gXCBiYXJ8Zm9vfCBiYXJ8Citmb28gImJhciIgYmxhfGZvb3xiYXJ8YmxhfAorImZvbyIgImJhciIgImJsYSJ8Zm9vfGJhcnxibGF8CisiZm9vIiBiYXIgImJsYSJ8Zm9vfGJhcnxibGF8CisiZm9vIiBiYXIgYmxhfGZvb3xiYXJ8YmxhfAorZm9vICdiYXInIGJsYXxmb298YmFyfGJsYXwKKydmb28nICdiYXInICdibGEnfGZvb3xiYXJ8YmxhfAorJ2ZvbycgYmFyICdibGEnfGZvb3xiYXJ8YmxhfAorJ2ZvbycgYmFyIGJsYXxmb298YmFyfGJsYXwKK2JsdXJiIGZvbyJiYXIiYmFyImZhc2VsIiBiYXp8Ymx1cmJ8Zm9vYmFyYmFyZmFzZWx8YmF6fAorYmx1cmIgZm9vJ2JhcidiYXInZmFzZWwnIGJhenxibHVyYnxmb29iYXJiYXJmYXNlbHxiYXp8CisiInx8CisnJ3x8Citmb28gIiIgYmFyfGZvb3x8YmFyfAorZm9vICcnIGJhcnxmb298fGJhcnwKK2ZvbyAiIiAiIiAiIiBiYXJ8Zm9vfHx8fGJhcnwKK2ZvbyAnJyAnJyAnJyBiYXJ8Zm9vfHx8fGJhcnwKK1wifCJ8CisiXCIifCJ8CisiZm9vXCBiYXIifGZvb1wgYmFyfAorImZvb1xcIGJhciJ8Zm9vXCBiYXJ8CisiZm9vXFwgYmFyXCIifGZvb1wgYmFyInwKKyJmb29cXCIgYmFyXCJ8Zm9vXHxiYXIifAorImZvb1xcIGJhclwiIGRmYWRmInxmb29cIGJhciIgZGZhZGZ8CisiZm9vXFxcIGJhclwiIGRmYWRmInxmb29cXCBiYXIiIGRmYWRmfAorImZvb1xcXHggYmFyXCIgZGZhZGYifGZvb1xceCBiYXIiIGRmYWRmfAorImZvb1x4IGJhclwiIGRmYWRmInxmb29ceCBiYXIiIGRmYWRmfAorXCd8J3wKKydmb29cIGJhcid8Zm9vXCBiYXJ8CisnZm9vXFwgYmFyJ3xmb29cXCBiYXJ8CisiZm9vXFxceCBiYXJcIiBkZidhXCAnZGYifGZvb1xceCBiYXIiIGRmJ2FcICdkZnwKK1wiZm9vfCJmb298CitcImZvb1x4fCJmb294fAorImZvb1x4Inxmb29ceHwKKyJmb29cICJ8Zm9vXCB8Citmb29cIHh4fGZvbyB4eHwKK2Zvb1wgeFx4fGZvbyB4eHwKK2Zvb1wgeFx4XCJ8Zm9vIHh4InwKKyJmb29cIHhceCJ8Zm9vXCB4XHh8CisiZm9vXCB4XHhcXCJ8Zm9vXCB4XHhcfAorImZvb1wgeFx4XFwiImZvb2JhciJ8Zm9vXCB4XHhcZm9vYmFyfAorImZvb1wgeFx4XFwiXCciZm9vYmFyInxmb29cIHhceFwnZm9vYmFyfAorImZvb1wgeFx4XFwiXCciZm8nb2JhciJ8Zm9vXCB4XHhcJ2ZvJ29iYXJ8CisiZm9vXCB4XHhcXCJcJyJmbydvYmFyIiAnZG9uJ1wnJ3QnfGZvb1wgeFx4XCdmbydvYmFyfGRvbid0fAorImZvb1wgeFx4XFwiXCciZm8nb2JhciIgJ2RvbidcJyd0JyBcXHxmb29cIHhceFwnZm8nb2Jhcnxkb24ndHxcfAorJ2Zvb1wgYmFyJ3xmb29cIGJhcnwKKydmb29cXCBiYXInfGZvb1xcIGJhcnwKK2Zvb1wgYmFyfGZvbyBiYXJ8Citmb28jYmFyXG5iYXp8Zm9vfGJhenwKKzotKSA7LSl8Oi0pfDstKXwKK+Hp7fP6fOHp7fP6fAorIiIiCisKK2NsYXNzIFNobGV4VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRhdGEgPSBbeC5zcGxpdCgifCIpWzotMV0KKyAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIGRhdGEuc3BsaXRsaW5lcygpXQorICAgICAgICBzZWxmLnBvc2l4X2RhdGEgPSBbeC5zcGxpdCgifCIpWzotMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4IGluIHBvc2l4X2RhdGEuc3BsaXRsaW5lcygpXQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmRhdGE6CisgICAgICAgICAgICBpdGVtWzBdID0gaXRlbVswXS5yZXBsYWNlKHIiXG4iLCAiXG4iKQorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnBvc2l4X2RhdGE6CisgICAgICAgICAgICBpdGVtWzBdID0gaXRlbVswXS5yZXBsYWNlKHIiXG4iLCAiXG4iKQorCisgICAgZGVmIHNwbGl0VGVzdChzZWxmLCBkYXRhLCBjb21tZW50cyk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkYXRhKSk6CisgICAgICAgICAgICBsID0gc2hsZXguc3BsaXQoZGF0YVtpXVswXSwgY29tbWVudHM9Y29tbWVudHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIGRhdGFbaV1bMTpdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhW2ldWzBdLCBsLCBkYXRhW2ldWzE6XSkpCisKKyAgICBkZWYgb2xkU3BsaXQoc2VsZiwgcyk6CisgICAgICAgIHJldCA9IFtdCisgICAgICAgIGxleCA9IHNobGV4LnNobGV4KFN0cmluZ0lPKHMpKQorICAgICAgICB0b2sgPSBsZXguZ2V0X3Rva2VuKCkKKyAgICAgICAgd2hpbGUgdG9rOgorICAgICAgICAgICAgcmV0LmFwcGVuZCh0b2spCisgICAgICAgICAgICB0b2sgPSBsZXguZ2V0X3Rva2VuKCkKKyAgICAgICAgcmV0dXJuIHJldAorCisgICAgZGVmIHRlc3RTcGxpdFBvc2l4KHNlbGYpOgorICAgICAgICAiIiJUZXN0IGRhdGEgc3BsaXR0aW5nIHdpdGggcG9zaXggcGFyc2VyIiIiCisgICAgICAgIHNlbGYuc3BsaXRUZXN0KHNlbGYucG9zaXhfZGF0YSwgY29tbWVudHM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0Q29tcGF0KHNlbGYpOgorICAgICAgICAiIiJUZXN0IGNvbXBhdGliaWxpdHkgaW50ZXJmYWNlIiIiCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmRhdGEpKToKKyAgICAgICAgICAgIGwgPSBzZWxmLm9sZFNwbGl0KHNlbGYuZGF0YVtpXVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgc2VsZi5kYXRhW2ldWzE6XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5kYXRhW2ldWzBdLCBsLCBzZWxmLmRhdGFbaV1bMTpdKSkKKworIyBBbGxvdyB0aGlzIHRlc3QgdG8gYmUgdXNlZCB3aXRoIG9sZCBzaGxleC5weQoraWYgbm90IGdldGF0dHIoc2hsZXgsICJzcGxpdCIsIE5vbmUpOgorICAgIGZvciBtZXRobmFtZSBpbiBkaXIoU2hsZXhUZXN0KToKKyAgICAgICAgaWYgbWV0aG5hbWUuc3RhcnRzd2l0aCgidGVzdCIpIGFuZCBtZXRobmFtZSAhPSAidGVzdENvbXBhdCI6CisgICAgICAgICAgICBkZWxhdHRyKFNobGV4VGVzdCwgbWV0aG5hbWUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFNobGV4VGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hsZXgucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hsZXgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDk2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGxleC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hsZXgucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2hsZXgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNDk2MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaGxleC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2h1dGlsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2h1dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZGI3MjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHkKQEAgLTAsMCArMSw4NjUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDAzIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHNodXRpbAoraW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgc3lzCitpbXBvcnQgc3RhdAoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IGVycm5vCitmcm9tIG9zLnBhdGggaW1wb3J0IHNwbGl0ZHJpdmUKK2Zyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUsIHNwYXduCitmcm9tIHNodXRpbCBpbXBvcnQgKF9tYWtlX3RhcmJhbGwsIF9tYWtlX3ppcGZpbGUsIG1ha2VfYXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQsIHVucmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGdldF9hcmNoaXZlX2Zvcm1hdHMpCitpbXBvcnQgdGFyZmlsZQoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBURVNURk4sIGNoZWNrX3dhcm5pbmdzLCBjYXB0dXJlZF9zdGRvdXQKKworVEVTVEZOMiA9IFRFU1RGTiArICIyIgorCit0cnk6CisgICAgaW1wb3J0IGdycAorICAgIGltcG9ydCBwd2QKKyAgICBVSURfR0lEX1NVUFBPUlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgVUlEX0dJRF9TVVBQT1JUID0gRmFsc2UKKwordHJ5OgorICAgIGltcG9ydCB6bGliCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgemxpYiA9IE5vbmUKKwordHJ5OgorICAgIGltcG9ydCB6aXBmaWxlCisgICAgWklQX1NVUFBPUlQgPSBUcnVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgWklQX1NVUFBPUlQgPSBmaW5kX2V4ZWN1dGFibGUoJ3ppcCcpCisKK2NsYXNzIFRlc3RTaHV0aWwodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0U2h1dGlsLCBzZWxmKS5zZXRVcCgpCisgICAgICAgIHNlbGYudGVtcGRpcnMgPSBbXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzdXBlcihUZXN0U2h1dGlsLCBzZWxmKS50ZWFyRG93bigpCisgICAgICAgIHdoaWxlIHNlbGYudGVtcGRpcnM6CisgICAgICAgICAgICBkID0gc2VsZi50ZW1wZGlycy5wb3AoKQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkLCBvcy5uYW1lIGluICgnbnQnLCAnY3lnd2luJykpCisKKyAgICBkZWYgd3JpdGVfZmlsZShzZWxmLCBwYXRoLCBjb250ZW50PSd4eHgnKToKKyAgICAgICAgIiIiV3JpdGVzIGEgZmlsZSBpbiB0aGUgZ2l2ZW4gcGF0aC4KKworCisgICAgICAgIHBhdGggY2FuIGJlIGEgc3RyaW5nIG9yIGEgc2VxdWVuY2UuCisgICAgICAgICIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHBhdGgsIChsaXN0LCB0dXBsZSkpOgorICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbigqcGF0aCkKKyAgICAgICAgZiA9IG9wZW4ocGF0aCwgJ3cnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiBta2R0ZW1wKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSBjbGVhbmVkIHVwLgorCisgICAgICAgIFJldHVybnMgdGhlIHBhdGggb2YgdGhlIGRpcmVjdG9yeS4KKyAgICAgICAgIiIiCisgICAgICAgIGQgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi50ZW1wZGlycy5hcHBlbmQoZCkKKyAgICAgICAgcmV0dXJuIGQKKyAgICBkZWYgdGVzdF9ybXRyZWVfZXJyb3JzKHNlbGYpOgorICAgICAgICAjIGZpbGVuYW1lIGlzIGd1YXJhbnRlZWQgbm90IHRvIGV4aXN0CisgICAgICAgIGZpbGVuYW1lID0gdGVtcGZpbGUubWt0ZW1wKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc2h1dGlsLnJtdHJlZSwgZmlsZW5hbWUpCisKKyAgICAjIFNlZSBidWcgIzEwNzE1MTMgZm9yIHdoeSB3ZSBkb24ndCBydW4gdGhpcyBvbiBjeWd3aW4KKyAgICAjIGFuZCBidWcgIzEwNzY0NjcgZm9yIHdoeSB3ZSBkb24ndCBydW4gdGhpcyBhcyByb290LgorICAgIGlmIChoYXNhdHRyKG9zLCAnY2htb2QnKSBhbmQgc3lzLnBsYXRmb3JtWzo2XSAhPSAnY3lnd2luJworICAgICAgICBhbmQgbm90IChoYXNhdHRyKG9zLCAnZ2V0ZXVpZCcpIGFuZCBvcy5nZXRldWlkKCkgPT0gMCkpOgorICAgICAgICBkZWYgdGVzdF9vbl9lcnJvcihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZXJyb3JTdGF0ZSA9IDAKKyAgICAgICAgICAgIG9zLm1rZGlyKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuY2hpbGRwYXRoID0gb3MucGF0aC5qb2luKFRFU1RGTiwgJ2EnKQorICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5jaGlsZHBhdGgsICd3JykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgb2xkX2Rpcl9tb2RlID0gb3Muc3RhdChURVNURk4pLnN0X21vZGUKKyAgICAgICAgICAgIG9sZF9jaGlsZF9tb2RlID0gb3Muc3RhdChzZWxmLmNoaWxkcGF0aCkuc3RfbW9kZQorICAgICAgICAgICAgIyBNYWtlIHVud3JpdGFibGUuCisgICAgICAgICAgICBvcy5jaG1vZChzZWxmLmNoaWxkcGF0aCwgc3RhdC5TX0lSRUFEKQorICAgICAgICAgICAgb3MuY2htb2QoVEVTVEZOLCBzdGF0LlNfSVJFQUQpCisKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOLCBvbmVycm9yPXNlbGYuY2hlY2tfYXJnc190b19vbmVycm9yKQorICAgICAgICAgICAgIyBUZXN0IHdoZXRoZXIgb25lcnJvciBoYXMgYWN0dWFsbHkgYmVlbiBjYWxsZWQuCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZXJyb3JTdGF0ZSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGNhbGwgdG8gb25lcnJvciBmdW5jdGlvbiBkaWQgbm90IGhhcHBlbi4iKQorCisgICAgICAgICAgICAjIE1ha2Ugd3JpdGFibGUgYWdhaW4uCisgICAgICAgICAgICBvcy5jaG1vZChURVNURk4sIG9sZF9kaXJfbW9kZSkKKyAgICAgICAgICAgIG9zLmNobW9kKHNlbGYuY2hpbGRwYXRoLCBvbGRfY2hpbGRfbW9kZSkKKworICAgICAgICAgICAgIyBDbGVhbiB1cC4KKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOKQorCisgICAgZGVmIGNoZWNrX2FyZ3NfdG9fb25lcnJvcihzZWxmLCBmdW5jLCBhcmcsIGV4Yyk6CisgICAgICAgICMgdGVzdF9ybXRyZWVfZXJyb3JzIGRlbGliZXJhdGVseSBydW5zIHJtdHJlZQorICAgICAgICAjIG9uIGEgZGlyZWN0b3J5IHRoYXQgaXMgY2htb2QgNDAwLCB3aGljaCB3aWxsIGZhaWwuCisgICAgICAgICMgVGhpcyBmdW5jdGlvbiBpcyBydW4gd2hlbiBzaHV0aWwucm10cmVlIGZhaWxzLgorICAgICAgICAjIDk5LjklIG9mIHRoZSB0aW1lIGl0IGluaXRpYWxseSBmYWlscyB0byByZW1vdmUKKyAgICAgICAgIyBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSwgc28gdGhlIGZpcnN0IHRpbWUgdGhyb3VnaAorICAgICAgICAjIGZ1bmMgaXMgb3MucmVtb3ZlLgorICAgICAgICAjIEhvd2V2ZXIsIHNvbWUgTGludXggbWFjaGluZXMgcnVubmluZyBaRlMgb24KKyAgICAgICAgIyBGVVNFIGV4cGVyaWVuY2VkIGEgZmFpbHVyZSBlYXJsaWVyIGluIHRoZSBwcm9jZXNzCisgICAgICAgICMgYXQgb3MubGlzdGRpci4gIFRoZSBmaXJzdCBmYWlsdXJlIG1heSBsZWdhbGx5CisgICAgICAgICMgYmUgZWl0aGVyLgorICAgICAgICBpZiBzZWxmLmVycm9yU3RhdGUgPT0gMDoKKyAgICAgICAgICAgIGlmIGZ1bmMgaXMgb3MucmVtb3ZlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJnLCBzZWxmLmNoaWxkcGF0aCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhmdW5jLCBvcy5saXN0ZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmMgbXVzdCBiZSBlaXRoZXIgb3MucmVtb3ZlIG9yIG9zLmxpc3RkaXIiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJnLCBURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhleGNbMF0sIE9TRXJyb3IpKQorICAgICAgICAgICAgc2VsZi5lcnJvclN0YXRlID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jLCBvcy5ybWRpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJnLCBURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhleGNbMF0sIE9TRXJyb3IpKQorICAgICAgICAgICAgc2VsZi5lcnJvclN0YXRlID0gMgorCisgICAgZGVmIHRlc3Rfcm10cmVlX2RvbnRfZGVsZXRlX2ZpbGUoc2VsZik6CisgICAgICAgICMgV2hlbiBjYWxsZWQgb24gYSBmaWxlIGluc3RlYWQgb2YgYSBkaXJlY3RvcnksIGRvbid0IGRlbGV0ZSBpdC4KKyAgICAgICAgaGFuZGxlLCBwYXRoID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIG9zLmZkb3BlbihoYW5kbGUpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc2h1dGlsLnJtdHJlZSwgcGF0aCkKKyAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisKKyAgICBkZWYgdGVzdF9jb3B5dHJlZV9zaW1wbGUoc2VsZik6CisgICAgICAgIGRlZiB3cml0ZV9kYXRhKHBhdGgsIGRhdGEpOgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgInciKQorICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZGVmIHJlYWRfZGF0YShwYXRoKToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIGRhdGEKKworICAgICAgICBzcmNfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIGRzdF9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUubWtkdGVtcCgpLCAnZGVzdGluYXRpb24nKQorCisgICAgICAgIHdyaXRlX2RhdGEob3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0LnR4dCcpLCAnMTIzJykKKworICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyJykpCisgICAgICAgIHdyaXRlX2RhdGEob3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpLCAnNDU2JykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzaHV0aWwuY29weXRyZWUoc3JjX2RpciwgZHN0X2RpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3QudHh0JykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QudHh0JykpKQorICAgICAgICAgICAgYWN0dWFsID0gcmVhZF9kYXRhKG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCAnMTIzJykKKyAgICAgICAgICAgIGFjdHVhbCA9IHJlYWRfZGF0YShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgJzQ1NicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgcGF0aCBpbiAoCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdC50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0LnR4dCcpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JyksCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdF9kaXInLCAndGVzdC50eHQnKSwKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKyAgICAgICAgICAgIGZvciBwYXRoIGluIChzcmNfZGlyLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZHN0X2RpcikKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKHBhdGgpCisKKyAgICBkZWYgdGVzdF9jb3B5dHJlZV93aXRoX2V4Y2x1ZGUoc2VsZik6CisKKyAgICAgICAgZGVmIHdyaXRlX2RhdGEocGF0aCwgZGF0YSk6CisgICAgICAgICAgICBmID0gb3BlbihwYXRoLCAidyIpCisgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICBkZWYgcmVhZF9kYXRhKHBhdGgpOgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCkKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gZGF0YQorCisgICAgICAgICMgY3JlYXRpbmcgZGF0YQorICAgICAgICBqb2luID0gb3MucGF0aC5qb2luCisgICAgICAgIGV4aXN0cyA9IG9zLnBhdGguZXhpc3RzCisgICAgICAgIHNyY19kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZHN0X2RpciA9IGpvaW4odGVtcGZpbGUubWtkdGVtcCgpLCAnZGVzdGluYXRpb24nKQorICAgICAgICAgICAgd3JpdGVfZGF0YShqb2luKHNyY19kaXIsICd0ZXN0LnR4dCcpLCAnMTIzJykKKyAgICAgICAgICAgIHdyaXRlX2RhdGEoam9pbihzcmNfZGlyLCAndGVzdC50bXAnKSwgJzEyMycpCisgICAgICAgICAgICBvcy5ta2Rpcihqb2luKHNyY19kaXIsICd0ZXN0X2RpcicpKQorICAgICAgICAgICAgd3JpdGVfZGF0YShqb2luKHNyY19kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpLCAnNDU2JykKKyAgICAgICAgICAgIG9zLm1rZGlyKGpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyMicpKQorICAgICAgICAgICAgd3JpdGVfZGF0YShqb2luKHNyY19kaXIsICd0ZXN0X2RpcjInLCAndGVzdC50eHQnKSwgJzQ1NicpCisgICAgICAgICAgICBvcy5ta2Rpcihqb2luKHNyY19kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyJykpCisgICAgICAgICAgICBvcy5ta2Rpcihqb2luKHNyY19kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyMicpKQorICAgICAgICAgICAgd3JpdGVfZGF0YShqb2luKHNyY19kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyJywgJ3Rlc3QudHh0JyksICc0NTYnKQorICAgICAgICAgICAgd3JpdGVfZGF0YShqb2luKHNyY19kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyMicsICd0ZXN0LnB5JyksICc0NTYnKQorCisKKyAgICAgICAgICAgICMgdGVzdGluZyBnbG9iLWxpa2UgcGF0dGVybnMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXR0ZXJucyA9IHNodXRpbC5pZ25vcmVfcGF0dGVybnMoJyoudG1wJywgJ3Rlc3RfZGlyMicpCisgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIsIGlnbm9yZT1wYXR0ZXJucykKKyAgICAgICAgICAgICAgICAjIGNoZWNraW5nIHRoZSByZXN1bHQ6IHNvbWUgZWxlbWVudHMgc2hvdWxkIG5vdCBiZSBjb3BpZWQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3QudHh0JykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3QudG1wJykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0X2Rpcik6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZHN0X2RpcikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXR0ZXJucyA9IHNodXRpbC5pZ25vcmVfcGF0dGVybnMoJyoudG1wJywgJ3N1YmRpcionKQorICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmNfZGlyLCBkc3RfZGlyLCBpZ25vcmU9cGF0dGVybnMpCisgICAgICAgICAgICAgICAgIyBjaGVja2luZyB0aGUgcmVzdWx0OiBzb21lIGVsZW1lbnRzIHNob3VsZCBub3QgYmUgY29waWVkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdC50bXAnKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJywgJ3N1YmRpcjInKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJywgJ3N1YmRpcicpKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0X2Rpcik6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZHN0X2RpcikKKworICAgICAgICAgICAgIyB0ZXN0aW5nIGNhbGxhYmxlLXN0eWxlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGVmIF9maWx0ZXIoc3JjLCBuYW1lcyk6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IFtdCisgICAgICAgICAgICAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzcmMsIG5hbWUpCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcy5wYXRoLmlzZGlyKHBhdGgpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguc3BsaXQoKVstMV0gPT0gJ3N1YmRpcicpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgb3MucGF0aC5zcGxpdGV4dChwYXRoKVstMV0gaW4gKCcucHknKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuYXBwZW5kKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMKKworICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShzcmNfZGlyLCBkc3RfZGlyLCBpZ25vcmU9X2ZpbHRlcikKKworICAgICAgICAgICAgICAgICMgY2hlY2tpbmcgdGhlIHJlc3VsdDogc29tZSBlbGVtZW50cyBzaG91bGQgbm90IGJlIGNvcGllZAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXIyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5weScpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyJykpKQorCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdF9kaXIpOgorICAgICAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRzdF9kaXIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHNyY19kaXIpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKG9zLnBhdGguZGlybmFtZShkc3RfZGlyKSkKKworICAgIGlmIGhhc2F0dHIob3MsICJzeW1saW5rIik6CisgICAgICAgIGRlZiB0ZXN0X2RvbnRfY29weV9maWxlX29udG9fbGlua190b19pdHNlbGYoc2VsZik6CisgICAgICAgICAgICAjIGJ1ZyA4NTExMjMuCisgICAgICAgICAgICBvcy5ta2RpcihURVNURk4pCisgICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCAnY2hlZXNlJykKKyAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihURVNURk4sICdzaG9wJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmID0gb3BlbihzcmMsICd3JykKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdjaGVkZGFyJykKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgICAgIG9zLmxpbmsoc3JjLCBkc3QpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2h1dGlsLkVycm9yLCBzaHV0aWwuY29weWZpbGUsIHNyYywgZHN0KQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihzcmMsICdyJykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgJ2NoZWRkYXInKQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkc3QpCisKKyAgICAgICAgICAgICAgICAjIFVzaW5nIGBzcmNgIGhlcmUgd291bGQgbWVhbiB3ZSBlbmQgdXAgd2l0aCBhIHN5bWxpbmsgcG9pbnRpbmcKKyAgICAgICAgICAgICAgICAjIHRvIFRFU1RGTi9URVNURk4vY2hlZXNlLCB3aGlsZSBpdCBzaG91bGQgcG9pbnQgYXQKKyAgICAgICAgICAgICAgICAjIFRFU1RGTi9jaGVlc2UuCisgICAgICAgICAgICAgICAgb3Muc3ltbGluaygnY2hlZXNlJywgZHN0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNodXRpbC5FcnJvciwgc2h1dGlsLmNvcHlmaWxlLCBzcmMsIGRzdCkKKyAgICAgICAgICAgICAgICB3aXRoIG9wZW4oc3JjLCAncicpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICdjaGVkZGFyJykKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZHN0KQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIHRlc3Rfcm10cmVlX29uX3N5bWxpbmsoc2VsZik6CisgICAgICAgICAgICAjIGJ1ZyAxNjY5LgorICAgICAgICAgICAgb3MubWtkaXIoVEVTVEZOKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihURVNURk4sICdjaGVlc2UnKQorICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihURVNURk4sICdzaG9wJykKKyAgICAgICAgICAgICAgICBvcy5ta2RpcihzcmMpCisgICAgICAgICAgICAgICAgb3Muc3ltbGluayhzcmMsIGRzdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzaHV0aWwucm10cmVlLCBkc3QpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOLCBpZ25vcmVfZXJyb3JzPVRydWUpCisKKyAgICBpZiBoYXNhdHRyKG9zLCAibWtmaWZvIik6CisgICAgICAgICMgSXNzdWUgIzMwMDI6IGNvcHlmaWxlIGFuZCBjb3B5dHJlZSBibG9jayBpbmRlZmluaXRlbHkgb24gbmFtZWQgcGlwZXMKKyAgICAgICAgZGVmIHRlc3RfY29weWZpbGVfbmFtZWRfcGlwZShzZWxmKToKKyAgICAgICAgICAgIG9zLm1rZmlmbyhURVNURk4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2h1dGlsLlNwZWNpYWxGaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlLCBURVNURk4sIFRFU1RGTjIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2h1dGlsLlNwZWNpYWxGaWxlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHlmaWxlLCBfX2ZpbGVfXywgVEVTVEZOKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorCisgICAgICAgIGRlZiB0ZXN0X2NvcHl0cmVlX25hbWVkX3BpcGUoc2VsZik6CisgICAgICAgICAgICBvcy5ta2RpcihURVNURk4pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3ViZGlyID0gb3MucGF0aC5qb2luKFRFU1RGTiwgInN1YmRpciIpCisgICAgICAgICAgICAgICAgb3MubWtkaXIoc3ViZGlyKQorICAgICAgICAgICAgICAgIHBpcGUgPSBvcy5wYXRoLmpvaW4oc3ViZGlyLCAibXlwaXBlIikKKyAgICAgICAgICAgICAgICBvcy5ta2ZpZm8ocGlwZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5dHJlZShURVNURk4sIFRFU1RGTjIpCisgICAgICAgICAgICAgICAgZXhjZXB0IHNodXRpbC5FcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcnMgPSBlLmFyZ3NbMF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXJyb3JzKSwgMSkKKyAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIGVycm9yX21zZyA9IGVycm9yc1swXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJgJXNgIGlzIGEgbmFtZWQgcGlwZSIgJSBwaXBlLCBlcnJvcl9tc2cpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaHV0aWwuRXJyb3Igc2hvdWxkIGhhdmUgYmVlbiByYWlzZWQiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFU1RGTiwgaWdub3JlX2Vycm9ycz1UcnVlKQorICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOMiwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2NoZmxhZ3MnKSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYXNhdHRyKGVycm5vLCAnRU9QTk9UU1VQUCcpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2F0dHIoZXJybm8sICdFTk9UU1VQJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVzIG9zLmNoZmxhZ3MsIEVPUE5PVFNVUFAgJiBFTk9UU1VQIikKKyAgICBkZWYgdGVzdF9jb3B5c3RhdF9oYW5kbGVzX2hhcm1sZXNzX2NoZmxhZ3NfZXJyb3JzKHNlbGYpOgorICAgICAgICB0bXBkaXIgPSBzZWxmLm1rZHRlbXAoKQorICAgICAgICBmaWxlMSA9IG9zLnBhdGguam9pbih0bXBkaXIsICdmaWxlMScpCisgICAgICAgIGZpbGUyID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2ZpbGUyJykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGZpbGUxLCAneHh4JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKGZpbGUyLCAneHh4JykKKworICAgICAgICBkZWYgbWFrZV9jaGZsYWdzX3JhaXNlcihlcnIpOgorICAgICAgICAgICAgZXggPSBPU0Vycm9yKCkKKworICAgICAgICAgICAgZGVmIF9jaGZsYWdzX3JhaXNlcihwYXRoLCBmbGFncyk6CisgICAgICAgICAgICAgICAgZXguZXJybm8gPSBlcnIKKyAgICAgICAgICAgICAgICByYWlzZSBleAorICAgICAgICAgICAgcmV0dXJuIF9jaGZsYWdzX3JhaXNlcgorICAgICAgICBvbGRfY2hmbGFncyA9IG9zLmNoZmxhZ3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGVyciBpbiBlcnJuby5FT1BOT1RTVVBQLCBlcnJuby5FTk9UU1VQOgorICAgICAgICAgICAgICAgIG9zLmNoZmxhZ3MgPSBtYWtlX2NoZmxhZ3NfcmFpc2VyKGVycikKKyAgICAgICAgICAgICAgICBzaHV0aWwuY29weXN0YXQoZmlsZTEsIGZpbGUyKQorICAgICAgICAgICAgIyBhc3NlcnQgb3RoZXJzIGVycm9ycyBicmVhayBpdAorICAgICAgICAgICAgb3MuY2hmbGFncyA9IG1ha2VfY2hmbGFnc19yYWlzZXIoZXJybm8uRU9QTk9UU1VQUCArIGVycm5vLkVOT1RTVVApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzaHV0aWwuY29weXN0YXQsIGZpbGUxLCBmaWxlMikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZmxhZ3MgPSBvbGRfY2hmbGFncworCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X21ha2VfdGFyYmFsbChzZWxmKToKKyAgICAgICAgIyBjcmVhdGluZyBzb21ldGhpbmcgdG8gdGFyCisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbdG1wZGlyLCAnZmlsZTEnXSwgJ3h4eCcpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbdG1wZGlyLCAnZmlsZTInXSwgJ3h4eCcpCisgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbih0bXBkaXIsICdzdWInKSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFt0bXBkaXIsICdzdWInLCAnZmlsZTMnXSwgJ3h4eCcpCisKKyAgICAgICAgdG1wZGlyMiA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgICMgZm9yY2Ugc2h1dGlsIHRvIGNyZWF0ZSB0aGUgZGlyZWN0b3J5CisgICAgICAgIG9zLnJtZGlyKHRtcGRpcjIpCisgICAgICAgIHVuaXR0ZXN0LnNraXBVbmxlc3Moc3BsaXRkcml2ZSh0bXBkaXIpWzBdID09IHNwbGl0ZHJpdmUodG1wZGlyMilbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSBhbmQgdGFyZ2V0IHNob3VsZCBiZSBvbiBzYW1lIGRyaXZlIikKKworICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorCisgICAgICAgICMgd29ya2luZyB3aXRoIHJlbGF0aXZlIHBhdGhzIHRvIGF2b2lkIHRhciB3YXJuaW5ncworICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfbWFrZV90YXJiYWxsKHNwbGl0ZHJpdmUoYmFzZV9uYW1lKVsxXSwgJy4nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb21wcmVzc2VkIHRhcmJhbGwgd2FzIGNyZWF0ZWQKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyLmd6JworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICAgICAgIyB0cnlpbmcgYW4gdW5jb21wcmVzc2VkIG9uZQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfbWFrZV90YXJiYWxsKHNwbGl0ZHJpdmUoYmFzZV9uYW1lKVsxXSwgJy4nLCBjb21wcmVzcz1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyJworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICBkZWYgX3RhcmluZm8oc2VsZiwgcGF0aCk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lcyA9IHRhci5nZXRuYW1lcygpCisgICAgICAgICAgICBuYW1lcy5zb3J0KCkKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShuYW1lcykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICBkZWYgX2NyZWF0ZV9maWxlcyhzZWxmKToKKyAgICAgICAgIyBjcmVhdGluZyBzb21ldGhpbmcgdG8gdGFyCisgICAgICAgIHRtcGRpciA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGRpc3QgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAnZGlzdCcpCisgICAgICAgIG9zLm1rZGlyKGRpc3QpCisgICAgICAgIHNlbGYud3JpdGVfZmlsZShbZGlzdCwgJ2ZpbGUxJ10sICd4eHgnKQorICAgICAgICBzZWxmLndyaXRlX2ZpbGUoW2Rpc3QsICdmaWxlMiddLCAneHh4JykKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKGRpc3QsICdzdWInKSkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFtkaXN0LCAnc3ViJywgJ2ZpbGUzJ10sICd4eHgnKQorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oZGlzdCwgJ3N1YjInKSkKKyAgICAgICAgdG1wZGlyMiA9IHNlbGYubWtkdGVtcCgpCisgICAgICAgIGJhc2VfbmFtZSA9IG9zLnBhdGguam9pbih0bXBkaXIyLCAnYXJjaGl2ZScpCisgICAgICAgIHJldHVybiB0bXBkaXIsIHRtcGRpcjIsIGJhc2VfbmFtZQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoemxpYiwgIlJlcXVpcmVzIHpsaWIiKQorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGZpbmRfZXhlY3V0YWJsZSgndGFyJykgYW5kIGZpbmRfZXhlY3V0YWJsZSgnZ3ppcCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdOZWVkIHRoZSB0YXIgY29tbWFuZCB0byBydW4nKQorICAgIGRlZiB0ZXN0X3RhcmZpbGVfdnNfdGFyKHNlbGYpOgorICAgICAgICB0bXBkaXIsIHRtcGRpcjIsIGJhc2VfbmFtZSA9ICBzZWxmLl9jcmVhdGVfZmlsZXMoKQorICAgICAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBfbWFrZV90YXJiYWxsKGJhc2VfbmFtZSwgJ2Rpc3QnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb21wcmVzc2VkIHRhcmJhbGwgd2FzIGNyZWF0ZWQKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyLmd6JworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICAgICAgIyBub3cgY3JlYXRlIGFub3RoZXIgdGFyYmFsbCB1c2luZyBgdGFyYAorICAgICAgICB0YXJiYWxsMiA9IG9zLnBhdGguam9pbih0bXBkaXIsICdhcmNoaXZlMi50YXIuZ3onKQorICAgICAgICB0YXJfY21kID0gWyd0YXInLCAnLWNmJywgJ2FyY2hpdmUyLnRhcicsICdkaXN0J10KKyAgICAgICAgZ3ppcF9jbWQgPSBbJ2d6aXAnLCAnLWY5JywgJ2FyY2hpdmUyLnRhciddCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKKyAgICAgICAgICAgICAgICBzcGF3bih0YXJfY21kKQorICAgICAgICAgICAgICAgIHNwYXduKGd6aXBfY21kKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbDIpKQorICAgICAgICAjIGxldCdzIGNvbXBhcmUgYm90aCB0YXJiYWxscworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX3RhcmluZm8odGFyYmFsbCksIHNlbGYuX3RhcmluZm8odGFyYmFsbDIpKQorCisgICAgICAgICMgdHJ5aW5nIGFuIHVuY29tcHJlc3NlZCBvbmUKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcjIsICdhcmNoaXZlJykKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX21ha2VfdGFyYmFsbChiYXNlX25hbWUsICdkaXN0JywgY29tcHJlc3M9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhcicKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorCisgICAgICAgICMgbm93IGZvciBhIGRyeV9ydW4KKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcjIsICdhcmNoaXZlJykKKyAgICAgICAgb2xkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX21ha2VfdGFyYmFsbChiYXNlX25hbWUsICdkaXN0JywgY29tcHJlc3M9Tm9uZSwgZHJ5X3J1bj1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyJworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAiUmVxdWlyZXMgemxpYiIpCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoWklQX1NVUFBPUlQsICdOZWVkIHppcCBzdXBwb3J0IHRvIHJ1bicpCisgICAgZGVmIHRlc3RfbWFrZV96aXBmaWxlKHNlbGYpOgorICAgICAgICAjIGNyZWF0aW5nIHNvbWV0aGluZyB0byB0YXIKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFt0bXBkaXIsICdmaWxlMSddLCAneHh4JykKKyAgICAgICAgc2VsZi53cml0ZV9maWxlKFt0bXBkaXIsICdmaWxlMiddLCAneHh4JykKKworICAgICAgICB0bXBkaXIyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgIyBmb3JjZSBzaHV0aWwgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgb3Mucm1kaXIodG1wZGlyMikKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpcjIsICdhcmNoaXZlJykKKyAgICAgICAgX21ha2VfemlwZmlsZShiYXNlX25hbWUsIHRtcGRpcikKKworICAgICAgICAjIGNoZWNrIGlmIHRoZSBjb21wcmVzc2VkIHRhcmJhbGwgd2FzIGNyZWF0ZWQKKyAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcuemlwJworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisKKworICAgIGRlZiB0ZXN0X21ha2VfYXJjaGl2ZShzZWxmKToKKyAgICAgICAgdG1wZGlyID0gc2VsZi5ta2R0ZW1wKCkKKyAgICAgICAgYmFzZV9uYW1lID0gb3MucGF0aC5qb2luKHRtcGRpciwgJ2FyY2hpdmUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYWtlX2FyY2hpdmUsIGJhc2VfbmFtZSwgJ3h4eCcpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAiUmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbWFrZV9hcmNoaXZlX293bmVyX2dyb3VwKHNlbGYpOgorICAgICAgICAjIHRlc3RpbmcgbWFrZV9hcmNoaXZlIHdpdGggb3duZXIgYW5kIGdyb3VwLCB3aXRoIHZhcmlvdXMgY29tYmluYXRpb25zCisgICAgICAgICMgdGhpcyB3b3JrcyBldmVuIGlmIHRoZXJlJ3Mgbm90IGdpZC91aWQgc3VwcG9ydAorICAgICAgICBpZiBVSURfR0lEX1NVUFBPUlQ6CisgICAgICAgICAgICBncm91cCA9IGdycC5nZXRncmdpZCgwKVswXQorICAgICAgICAgICAgb3duZXIgPSBwd2QuZ2V0cHd1aWQoMClbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGdyb3VwID0gb3duZXIgPSAncm9vdCcKKworICAgICAgICBiYXNlX2Rpciwgcm9vdF9kaXIsIGJhc2VfbmFtZSA9ICBzZWxmLl9jcmVhdGVfZmlsZXMoKQorICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4oc2VsZi5ta2R0ZW1wKCkgLCAnYXJjaGl2ZScpCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd6aXAnLCByb290X2RpciwgYmFzZV9kaXIsIG93bmVyPW93bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA9Z3JvdXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd6aXAnLCByb290X2RpciwgYmFzZV9kaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd0YXInLCByb290X2RpciwgYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcj1vd25lciwgZ3JvdXA9Z3JvdXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhyZXMpKQorCisgICAgICAgIHJlcyA9IG1ha2VfYXJjaGl2ZShiYXNlX25hbWUsICd0YXInLCByb290X2RpciwgYmFzZV9kaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lcj0na2poa2poa2pnJywgZ3JvdXA9J29paG9ob2gnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMocmVzKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHpsaWIsICJSZXF1aXJlcyB6bGliIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhVSURfR0lEX1NVUFBPUlQsICJSZXF1aXJlcyBncnAgYW5kIHB3ZCBzdXBwb3J0IikKKyAgICBkZWYgdGVzdF90YXJmaWxlX3Jvb3Rfb3duZXIoc2VsZik6CisgICAgICAgIHRtcGRpciwgdG1wZGlyMiwgYmFzZV9uYW1lID0gIHNlbGYuX2NyZWF0ZV9maWxlcygpCisgICAgICAgIG9sZF9kaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcih0bXBkaXIpCisgICAgICAgIGdyb3VwID0gZ3JwLmdldGdyZ2lkKDApWzBdCisgICAgICAgIG93bmVyID0gcHdkLmdldHB3dWlkKDApWzBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFyY2hpdmVfbmFtZSA9IF9tYWtlX3RhcmJhbGwoYmFzZV9uYW1lLCAnZGlzdCcsIGNvbXByZXNzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bmVyPW93bmVyLCBncm91cD1ncm91cCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCisKKyAgICAgICAgIyBjaGVjayBpZiB0aGUgY29tcHJlc3NlZCB0YXJiYWxsIHdhcyBjcmVhdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhhcmNoaXZlX25hbWUpKQorCisgICAgICAgICMgbm93IGNoZWNrcyB0aGUgcmlnaHRzCisgICAgICAgIGFyY2hpdmUgPSB0YXJmaWxlLm9wZW4oYXJjaGl2ZV9uYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbWVtYmVyIGluIGFyY2hpdmUuZ2V0bWVtYmVycygpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVtYmVyLnVpZCwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lbWJlci5naWQsIDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBhcmNoaXZlLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X21ha2VfYXJjaGl2ZV9jd2Qoc2VsZik6CisgICAgICAgIGN1cnJlbnRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgZGVmIF9icmVha3MoKmFyZ3MsICoqa3cpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKworICAgICAgICByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCgneHh4JywgX2JyZWFrcywgW10sICd4eHggZmlsZScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBtYWtlX2FyY2hpdmUoJ3h4eCcsICd4eHgnLCByb290X2Rpcj1zZWxmLm1rZHRlbXAoKSkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5nZXRjd2QoKSwgY3VycmVudF9kaXIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB1bnJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KCd4eHgnKQorCisgICAgZGVmIHRlc3RfcmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQoc2VsZik6CisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWdpc3Rlcl9hcmNoaXZlX2Zvcm1hdCwgJ3h4eCcsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQsICd4eHgnLCBsYW1iZGE6IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQsICd4eHgnLCBsYW1iZGE6IHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoMSwgMiksICgxLCAyLCAzKV0pCisKKyAgICAgICAgcmVnaXN0ZXJfYXJjaGl2ZV9mb3JtYXQoJ3h4eCcsIGxhbWJkYTogeCwgWygxLCAyKV0sICd4eHggZmlsZScpCisgICAgICAgIGZvcm1hdHMgPSBbbmFtZSBmb3IgbmFtZSwgcGFyYW1zIGluIGdldF9hcmNoaXZlX2Zvcm1hdHMoKV0KKyAgICAgICAgc2VsZi5hc3NlcnRJbigneHh4JywgZm9ybWF0cykKKworICAgICAgICB1bnJlZ2lzdGVyX2FyY2hpdmVfZm9ybWF0KCd4eHgnKQorICAgICAgICBmb3JtYXRzID0gW25hbWUgZm9yIG5hbWUsIHBhcmFtcyBpbiBnZXRfYXJjaGl2ZV9mb3JtYXRzKCldCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ3h4eCcsIGZvcm1hdHMpCisKKworY2xhc3MgVGVzdE1vdmUodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBmaWxlbmFtZSA9ICJmb28iCisgICAgICAgIHNlbGYuc3JjX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBzZWxmLmRzdF9kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgc2VsZi5zcmNfZmlsZSA9IG9zLnBhdGguam9pbihzZWxmLnNyY19kaXIsIGZpbGVuYW1lKQorICAgICAgICBzZWxmLmRzdF9maWxlID0gb3MucGF0aC5qb2luKHNlbGYuZHN0X2RpciwgZmlsZW5hbWUpCisgICAgICAgICMgVHJ5IHRvIGNyZWF0ZSBhIGRpciBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGhvcGluZyB0aGF0IGl0IGlzCisgICAgICAgICMgbm90IGxvY2F0ZWQgb24gdGhlIHNhbWUgZmlsZXN5c3RlbSBhcyB0aGUgc3lzdGVtIHRtcCBkaXIuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZGlyX290aGVyX2ZzID0gdGVtcGZpbGUubWtkdGVtcCgKKyAgICAgICAgICAgICAgICBkaXI9b3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSkKKyAgICAgICAgICAgIHNlbGYuZmlsZV9vdGhlcl9mcyA9IG9zLnBhdGguam9pbihzZWxmLmRpcl9vdGhlcl9mcywKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBzZWxmLmRpcl9vdGhlcl9mcyA9IE5vbmUKKyAgICAgICAgd2l0aCBvcGVuKHNlbGYuc3JjX2ZpbGUsICJ3YiIpIGFzIGY6CisgICAgICAgICAgICBmLndyaXRlKCJzcGFtIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGQgaW4gKHNlbGYuc3JjX2Rpciwgc2VsZi5kc3RfZGlyLCBzZWxmLmRpcl9vdGhlcl9mcyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgZDoKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfY2hlY2tfbW92ZV9maWxlKHNlbGYsIHNyYywgZHN0LCByZWFsX2RzdCk6CisgICAgICAgIHdpdGggb3BlbihzcmMsICJyYiIpIGFzIGY6CisgICAgICAgICAgICBjb250ZW50cyA9IGYucmVhZCgpCisgICAgICAgIHNodXRpbC5tb3ZlKHNyYywgZHN0KQorICAgICAgICB3aXRoIG9wZW4ocmVhbF9kc3QsICJyYiIpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCBmLnJlYWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhzcmMpKQorCisgICAgZGVmIF9jaGVja19tb3ZlX2RpcihzZWxmLCBzcmMsIGRzdCwgcmVhbF9kc3QpOgorICAgICAgICBjb250ZW50cyA9IHNvcnRlZChvcy5saXN0ZGlyKHNyYykpCisgICAgICAgIHNodXRpbC5tb3ZlKHNyYywgZHN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCBzb3J0ZWQob3MubGlzdGRpcihyZWFsX2RzdCkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHNyYykpCisKKyAgICBkZWYgdGVzdF9tb3ZlX2ZpbGUoc2VsZik6CisgICAgICAgICMgTW92ZSBhIGZpbGUgdG8gYW5vdGhlciBsb2NhdGlvbiBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtLgorICAgICAgICBzZWxmLl9jaGVja19tb3ZlX2ZpbGUoc2VsZi5zcmNfZmlsZSwgc2VsZi5kc3RfZmlsZSwgc2VsZi5kc3RfZmlsZSkKKworICAgIGRlZiB0ZXN0X21vdmVfZmlsZV90b19kaXIoc2VsZik6CisgICAgICAgICMgTW92ZSBhIGZpbGUgaW5zaWRlIGFuIGV4aXN0aW5nIGRpciBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtLgorICAgICAgICBzZWxmLl9jaGVja19tb3ZlX2ZpbGUoc2VsZi5zcmNfZmlsZSwgc2VsZi5kc3RfZGlyLCBzZWxmLmRzdF9maWxlKQorCisgICAgZGVmIHRlc3RfbW92ZV9maWxlX290aGVyX2ZzKHNlbGYpOgorICAgICAgICAjIE1vdmUgYSBmaWxlIHRvIGFuIGV4aXN0aW5nIGRpciBvbiBhbm90aGVyIGZpbGVzeXN0ZW0uCisgICAgICAgIGlmIG5vdCBzZWxmLmRpcl9vdGhlcl9mczoKKyAgICAgICAgICAgICMgc2tpcAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZmlsZShzZWxmLnNyY19maWxlLCBzZWxmLmZpbGVfb3RoZXJfZnMsCisgICAgICAgICAgICBzZWxmLmZpbGVfb3RoZXJfZnMpCisKKyAgICBkZWYgdGVzdF9tb3ZlX2ZpbGVfdG9fZGlyX290aGVyX2ZzKHNlbGYpOgorICAgICAgICAjIE1vdmUgYSBmaWxlIHRvIGFub3RoZXIgbG9jYXRpb24gb24gYW5vdGhlciBmaWxlc3lzdGVtLgorICAgICAgICBpZiBub3Qgc2VsZi5kaXJfb3RoZXJfZnM6CisgICAgICAgICAgICAjIHNraXAKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jaGVja19tb3ZlX2ZpbGUoc2VsZi5zcmNfZmlsZSwgc2VsZi5kaXJfb3RoZXJfZnMsCisgICAgICAgICAgICBzZWxmLmZpbGVfb3RoZXJfZnMpCisKKyAgICBkZWYgdGVzdF9tb3ZlX2RpcihzZWxmKToKKyAgICAgICAgIyBNb3ZlIGEgZGlyIHRvIGFub3RoZXIgbG9jYXRpb24gb24gdGhlIHNhbWUgZmlsZXN5c3RlbS4KKyAgICAgICAgZHN0X2RpciA9IHRlbXBmaWxlLm1rdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZGlyKHNlbGYuc3JjX2RpciwgZHN0X2RpciwgZHN0X2RpcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRzdF9kaXIpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbW92ZV9kaXJfb3RoZXJfZnMoc2VsZik6CisgICAgICAgICMgTW92ZSBhIGRpciB0byBhbm90aGVyIGxvY2F0aW9uIG9uIGFub3RoZXIgZmlsZXN5c3RlbS4KKyAgICAgICAgaWYgbm90IHNlbGYuZGlyX290aGVyX2ZzOgorICAgICAgICAgICAgIyBza2lwCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZHN0X2RpciA9IHRlbXBmaWxlLm1rdGVtcChkaXI9c2VsZi5kaXJfb3RoZXJfZnMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NoZWNrX21vdmVfZGlyKHNlbGYuc3JjX2RpciwgZHN0X2RpciwgZHN0X2RpcikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzaHV0aWwucm10cmVlKGRzdF9kaXIpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfbW92ZV9kaXJfdG9fZGlyKHNlbGYpOgorICAgICAgICAjIE1vdmUgYSBkaXIgaW5zaWRlIGFuIGV4aXN0aW5nIGRpciBvbiB0aGUgc2FtZSBmaWxlc3lzdGVtLgorICAgICAgICBzZWxmLl9jaGVja19tb3ZlX2RpcihzZWxmLnNyY19kaXIsIHNlbGYuZHN0X2RpciwKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmRzdF9kaXIsIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5zcmNfZGlyKSkpCisKKyAgICBkZWYgdGVzdF9tb3ZlX2Rpcl90b19kaXJfb3RoZXJfZnMoc2VsZik6CisgICAgICAgICMgTW92ZSBhIGRpciBpbnNpZGUgYW4gZXhpc3RpbmcgZGlyIG9uIGFub3RoZXIgZmlsZXN5c3RlbS4KKyAgICAgICAgaWYgbm90IHNlbGYuZGlyX290aGVyX2ZzOgorICAgICAgICAgICAgIyBza2lwCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fY2hlY2tfbW92ZV9kaXIoc2VsZi5zcmNfZGlyLCBzZWxmLmRpcl9vdGhlcl9mcywKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLmRpcl9vdGhlcl9mcywgb3MucGF0aC5iYXNlbmFtZShzZWxmLnNyY19kaXIpKSkKKworICAgIGRlZiB0ZXN0X2V4aXN0aW5nX2ZpbGVfaW5zaWRlX2Rlc3RfZGlyKHNlbGYpOgorICAgICAgICAjIEEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW5zaWRlIHRoZSBkZXN0aW5hdGlvbiBkaXIgYWxyZWFkeSBleGlzdHMuCisgICAgICAgIHdpdGggb3BlbihzZWxmLmRzdF9maWxlLCAid2IiKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2h1dGlsLkVycm9yLCBzaHV0aWwubW92ZSwgc2VsZi5zcmNfZmlsZSwgc2VsZi5kc3RfZGlyKQorCisgICAgZGVmIHRlc3RfZG9udF9tb3ZlX2Rpcl9pbl9pdHNlbGYoc2VsZik6CisgICAgICAgICMgTW92aW5nIGEgZGlyIGluc2lkZSBpdHNlbGYgcmFpc2VzIGFuIEVycm9yLgorICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5zcmNfZGlyLCAiYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2h1dGlsLkVycm9yLCBzaHV0aWwubW92ZSwgc2VsZi5zcmNfZGlyLCBkc3QpCisKKyAgICBkZWYgdGVzdF9kZXN0aW5zcmNfZmFsc2VfbmVnYXRpdmUoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKFRFU1RGTikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIHNyYywgZHN0IGluIFsoJ3NyY2RpcicsICdzcmNkaXIvZGVzdCcpXToKKyAgICAgICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCBzcmMpCisgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKFRFU1RGTiwgZHN0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaHV0aWwuX2Rlc3RpbnNyYyhzcmMsIGRzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nX2Rlc3RpbnNyYygpIHdyb25nbHkgY29uY2x1ZGVkIHRoYXQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZHN0ICglcykgaXMgbm90IGluIHNyYyAoJXMpJyAlIChkc3QsIHNyYykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFU1RGTiwgaWdub3JlX2Vycm9ycz1UcnVlKQorCisgICAgZGVmIHRlc3RfZGVzdGluc3JjX2ZhbHNlX3Bvc2l0aXZlKHNlbGYpOgorICAgICAgICBvcy5ta2RpcihURVNURk4pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBzcmMsIGRzdCBpbiBbKCdzcmNkaXInLCAnc3JjL2Rlc3QnKSwgKCdzcmNkaXInLCAnc3JjZGlyLm5ldycpXToKKyAgICAgICAgICAgICAgICBzcmMgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCBzcmMpCisgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKFRFU1RGTiwgZHN0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2h1dGlsLl9kZXN0aW5zcmMoc3JjLCBkc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0nX2Rlc3RpbnNyYygpIHdyb25nbHkgY29uY2x1ZGVkIHRoYXQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkc3QgKCVzKSBpcyBpbiBzcmMgKCVzKScgJSAoZHN0LCBzcmMpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShURVNURk4sIGlnbm9yZV9lcnJvcnM9VHJ1ZSkKKworCitjbGFzcyBUZXN0Q29weUZpbGUodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgX2RlbGV0ZSA9IEZhbHNlCisKKyAgICBjbGFzcyBGYXV4KG9iamVjdCk6CisgICAgICAgIF9lbnRlcmVkID0gRmFsc2UKKyAgICAgICAgX2V4aXRlZF93aXRoID0gTm9uZQorICAgICAgICBfcmFpc2VkID0gRmFsc2UKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJhaXNlX2luX2V4aXQ9RmFsc2UsIHN1cHByZXNzX2F0X2V4aXQ9VHJ1ZSk6CisgICAgICAgICAgICBzZWxmLl9yYWlzZV9pbl9leGl0ID0gcmFpc2VfaW5fZXhpdAorICAgICAgICAgICAgc2VsZi5fc3VwcHJlc3NfYXRfZXhpdCA9IHN1cHByZXNzX2F0X2V4aXQKKyAgICAgICAgZGVmIHJlYWQoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLl9lbnRlcmVkID0gVHJ1ZQorICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWwsIGV4Y190Yik6CisgICAgICAgICAgICBzZWxmLl9leGl0ZWRfd2l0aCA9IGV4Y190eXBlLCBleGNfdmFsLCBleGNfdGIKKyAgICAgICAgICAgIGlmIHNlbGYuX3JhaXNlX2luX2V4aXQ6CisgICAgICAgICAgICAgICAgc2VsZi5fcmFpc2VkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoIkNhbm5vdCBjbG9zZSIpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fc3VwcHJlc3NfYXRfZXhpdAorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9kZWxldGU6CisgICAgICAgICAgICBkZWwgc2h1dGlsLm9wZW4KKworICAgIGRlZiBfc2V0X3NodXRpbF9vcGVuKHNlbGYsIGZ1bmMpOgorICAgICAgICBzaHV0aWwub3BlbiA9IGZ1bmMKKyAgICAgICAgc2VsZi5fZGVsZXRlID0gVHJ1ZQorCisgICAgZGVmIHRlc3Rfd19zb3VyY2Vfb3Blbl9mYWlscyhzZWxmKToKKyAgICAgICAgZGVmIF9vcGVuKGZpbGVuYW1lLCBtb2RlPSdyJyk6CisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAnc3JjZmlsZSc6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcignQ2Fubm90IG9wZW4gInNyY2ZpbGUiJykKKyAgICAgICAgICAgIGFzc2VydCAwICAjIHNob3VsZG4ndCByZWFjaCBoZXJlLgorCisgICAgICAgIHNlbGYuX3NldF9zaHV0aWxfb3Blbihfb3BlbikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCBzaHV0aWwuY29weWZpbGUsICdzcmNmaWxlJywgJ2Rlc3RmaWxlJykKKworICAgIGRlZiB0ZXN0X3dfZGVzdF9vcGVuX2ZhaWxzKHNlbGYpOgorCisgICAgICAgIHNyY2ZpbGUgPSBzZWxmLkZhdXgoKQorCisgICAgICAgIGRlZiBfb3BlbihmaWxlbmFtZSwgbW9kZT0ncicpOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gJ3NyY2ZpbGUnOgorICAgICAgICAgICAgICAgIHJldHVybiBzcmNmaWxlCisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAnZGVzdGZpbGUnOgorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ0Nhbm5vdCBvcGVuICJkZXN0ZmlsZSInKQorICAgICAgICAgICAgYXNzZXJ0IDAgICMgc2hvdWxkbid0IHJlYWNoIGhlcmUuCisKKyAgICAgICAgc2VsZi5fc2V0X3NodXRpbF9vcGVuKF9vcGVuKQorCisgICAgICAgIHNodXRpbC5jb3B5ZmlsZSgnc3JjZmlsZScsICdkZXN0ZmlsZScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcmNmaWxlLl9lbnRlcmVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3JjZmlsZS5fZXhpdGVkX3dpdGhbMF0gaXMgSU9FcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmNmaWxlLl9leGl0ZWRfd2l0aFsxXS5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnQ2Fubm90IG9wZW4gImRlc3RmaWxlIicsKSkKKworICAgIGRlZiB0ZXN0X3dfZGVzdF9jbG9zZV9mYWlscyhzZWxmKToKKworICAgICAgICBzcmNmaWxlID0gc2VsZi5GYXV4KCkKKyAgICAgICAgZGVzdGZpbGUgPSBzZWxmLkZhdXgoVHJ1ZSkKKworICAgICAgICBkZWYgX29wZW4oZmlsZW5hbWUsIG1vZGU9J3InKToKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lID09ICdzcmNmaWxlJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gc3JjZmlsZQorICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gJ2Rlc3RmaWxlJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzdGZpbGUKKyAgICAgICAgICAgIGFzc2VydCAwICAjIHNob3VsZG4ndCByZWFjaCBoZXJlLgorCisgICAgICAgIHNlbGYuX3NldF9zaHV0aWxfb3Blbihfb3BlbikKKworICAgICAgICBzaHV0aWwuY29weWZpbGUoJ3NyY2ZpbGUnLCAnZGVzdGZpbGUnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3JjZmlsZS5fZW50ZXJlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlc3RmaWxlLl9lbnRlcmVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVzdGZpbGUuX3JhaXNlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNyY2ZpbGUuX2V4aXRlZF93aXRoWzBdIGlzIElPRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3JjZmlsZS5fZXhpdGVkX3dpdGhbMV0uYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ0Nhbm5vdCBjbG9zZScsKSkKKworICAgIGRlZiB0ZXN0X3dfc291cmNlX2Nsb3NlX2ZhaWxzKHNlbGYpOgorCisgICAgICAgIHNyY2ZpbGUgPSBzZWxmLkZhdXgoVHJ1ZSkKKyAgICAgICAgZGVzdGZpbGUgPSBzZWxmLkZhdXgoKQorCisgICAgICAgIGRlZiBfb3BlbihmaWxlbmFtZSwgbW9kZT0ncicpOgorICAgICAgICAgICAgaWYgZmlsZW5hbWUgPT0gJ3NyY2ZpbGUnOgorICAgICAgICAgICAgICAgIHJldHVybiBzcmNmaWxlCisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAnZGVzdGZpbGUnOgorICAgICAgICAgICAgICAgIHJldHVybiBkZXN0ZmlsZQorICAgICAgICAgICAgYXNzZXJ0IDAgICMgc2hvdWxkbid0IHJlYWNoIGhlcmUuCisKKyAgICAgICAgc2VsZi5fc2V0X3NodXRpbF9vcGVuKF9vcGVuKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5ZmlsZSwgJ3NyY2ZpbGUnLCAnZGVzdGZpbGUnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3JjZmlsZS5fZW50ZXJlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRlc3RmaWxlLl9lbnRlcmVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRlc3RmaWxlLl9yYWlzZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcmNmaWxlLl9leGl0ZWRfd2l0aFswXSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3JjZmlsZS5fcmFpc2VkKQorCisgICAgZGVmIHRlc3RfbW92ZV9kaXJfY2FzZWluc2Vuc2l0aXZlKHNlbGYpOgorICAgICAgICAjIFJlbmFtZXMgYSBmb2xkZXIgdG8gdGhlIHNhbWUgbmFtZQorICAgICAgICAjIGJ1dCBhIGRpZmZlcmVudCBjYXNlLgorCisgICAgICAgIHNlbGYuc3JjX2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICBkc3RfZGlyID0gb3MucGF0aC5qb2luKAorICAgICAgICAgICAgICAgIG9zLnBhdGguZGlybmFtZShzZWxmLnNyY19kaXIpLAorICAgICAgICAgICAgICAgIG9zLnBhdGguYmFzZW5hbWUoc2VsZi5zcmNfZGlyKS51cHBlcigpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuc3JjX2RpciwgZHN0X2RpcikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzaHV0aWwubW92ZShzZWxmLnNyY19kaXIsIGRzdF9kaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Rpcihkc3RfZGlyKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdF9kaXIpOgorICAgICAgICAgICAgICAgIG9zLnJtZGlyKGRzdF9kaXIpCisKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0U2h1dGlsLCBUZXN0TW92ZSwgVGVzdENvcHlGaWxlKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2h1dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWUwYTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2h1dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaHV0aWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2h1dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI4MGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2h1dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4M2Y2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpZ25hbC5weQpAQCAtMCwwICsxLDUwMSBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSBjb250ZXh0bGliIGltcG9ydCBjbG9zaW5nCitpbXBvcnQgZ2MKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgc3lzLCBvcywgdGltZSwgZXJybm8KKworaWYgc3lzLnBsYXRmb3JtIGluICgnb3MyJywgJ3Jpc2NvcycpOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJDYW4ndCB0ZXN0IHNpZ25hbCBvbiAlcyIgJSBzeXMucGxhdGZvcm0pCisKKworY2xhc3MgSGFuZGxlckJDYWxsZWQoRXhjZXB0aW9uKToKKyAgICBwYXNzCisKKworZGVmIGV4aXRfc3VicHJvY2VzcygpOgorICAgICIiIlVzZSBvcy5fZXhpdCgwKSB0byBleGl0IHRoZSBjdXJyZW50IHN1YnByb2Nlc3MuCisKKyAgICBPdGhlcndpc2UsIHRoZSB0ZXN0IGNhdGNoZXMgdGhlIFN5c3RlbUV4aXQgYW5kIGNvbnRpbnVlcyBleGVjdXRpbmcKKyAgICBpbiBwYXJhbGxlbCB3aXRoIHRoZSBvcmlnaW5hbCB0ZXN0LCBzbyB5b3Ugd2luZCB1cCB3aXRoIGFuCisgICAgZXhwb25lbnRpYWwgbnVtYmVyIG9mIHRlc3RzIHJ1bm5pbmcgY29uY3VycmVudGx5LgorICAgICIiIgorICAgIG9zLl9leGl0KDApCisKKworZGVmIGlnbm9yaW5nX2VpbnRyKF9fZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBfX2Z1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yIGFzIGU6CisgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICByYWlzZQorICAgICAgICByZXR1cm4gTm9uZQorCisKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJOb3QgdmFsaWQgb24gV2luZG93cyIpCitjbGFzcyBJbnRlclByb2Nlc3NTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgTUFYX0RVUkFUSU9OID0gMjAgICAjIEVudGlyZSB0ZXN0IHNob3VsZCBsYXN0IGF0IG1vc3QgMjAgc2VjLgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnVzaW5nX2djID0gZ2MuaXNlbmFibGVkKCkKKyAgICAgICAgZ2MuZGlzYWJsZSgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYudXNpbmdfZ2M6CisgICAgICAgICAgICBnYy5lbmFibGUoKQorCisgICAgZGVmIGZvcm1hdF9mcmFtZShzZWxmLCBmcmFtZSwgbGltaXQ9Tm9uZSk6CisgICAgICAgIHJldHVybiAnJy5qb2luKHRyYWNlYmFjay5mb3JtYXRfc3RhY2soZnJhbWUsIGxpbWl0PWxpbWl0KSkKKworICAgIGRlZiBoYW5kbGVyQShzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgc2VsZi5hX2NhbGxlZCA9IFRydWUKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiaGFuZGxlckEgaW52b2tlZCBmcm9tIHNpZ25hbCAlcyBhdDpcbiVzIiAlICgKKyAgICAgICAgICAgICAgICBzaWdudW0sIHNlbGYuZm9ybWF0X2ZyYW1lKGZyYW1lLCBsaW1pdD0xKSkKKworICAgIGRlZiBoYW5kbGVyQihzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgc2VsZi5iX2NhbGxlZCA9IFRydWUKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiaGFuZGxlckIgaW52b2tlZCBmcm9tIHNpZ25hbCAlcyBhdDpcbiVzIiAlICgKKyAgICAgICAgICAgICAgICBzaWdudW0sIHNlbGYuZm9ybWF0X2ZyYW1lKGZyYW1lLCBsaW1pdD0xKSkKKyAgICAgICAgcmFpc2UgSGFuZGxlckJDYWxsZWQoc2lnbnVtLCBzZWxmLmZvcm1hdF9mcmFtZShmcmFtZSkpCisKKyAgICBkZWYgd2FpdChzZWxmLCBjaGlsZCk6CisgICAgICAgICIiIldhaXQgZm9yIGNoaWxkIHRvIGZpbmlzaCwgaWdub3JpbmcgRUlOVFIuIiIiCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2hpbGQud2FpdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgcnVuX3Rlc3Qoc2VsZik6CisgICAgICAgICMgSW5zdGFsbCBoYW5kbGVycy4gVGhpcyBmdW5jdGlvbiBydW5zIGluIGEgc3ViLXByb2Nlc3MsIHNvIHdlCisgICAgICAgICMgZG9uJ3Qgd29ycnkgYWJvdXQgcmUtc2V0dGluZyB0aGUgZGVmYXVsdCBoYW5kbGVycy4KKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBzZWxmLmhhbmRsZXJBKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBzZWxmLmhhbmRsZXJCKQorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IyLCBzaWduYWwuU0lHX0lHTikKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIpCisKKyAgICAgICAgIyBWYXJpYWJsZXMgdGhlIHNpZ25hbHMgd2lsbCBtb2RpZnk6CisgICAgICAgIHNlbGYuYV9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmJfY2FsbGVkID0gRmFsc2UKKworICAgICAgICAjIExldCB0aGUgc3ViLXByb2Nlc3NlcyBrbm93IHdobyB0byBzZW5kIHNpZ25hbHMgdG8uCisgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgInRlc3QgcnVubmVyJ3MgcGlkIGlzIiwgcGlkCisKKyAgICAgICAgY2hpbGQgPSBpZ25vcmluZ19laW50cihzdWJwcm9jZXNzLlBvcGVuLCBbJ2tpbGwnLCAnLUhVUCcsIHN0cihwaWQpXSkKKyAgICAgICAgaWYgY2hpbGQ6CisgICAgICAgICAgICBzZWxmLndhaXQoY2hpbGQpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5hX2NhbGxlZDoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEpICAjIEdpdmUgdGhlIHNpZ25hbCB0aW1lIHRvIGJlIGRlbGl2ZXJlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYV9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5iX2NhbGxlZCkKKyAgICAgICAgc2VsZi5hX2NhbGxlZCA9IEZhbHNlCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHNpZ25hbCBpc24ndCBkZWxpdmVyZWQgd2hpbGUgdGhlIHByZXZpb3VzCisgICAgICAgICMgUG9wZW4gb2JqZWN0IGlzIGJlaW5nIGRlc3Ryb3llZCwgYmVjYXVzZSBfX2RlbF9fIHN3YWxsb3dzCisgICAgICAgICMgZXhjZXB0aW9ucy4KKyAgICAgICAgZGVsIGNoaWxkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoaWxkID0gc3VicHJvY2Vzcy5Qb3BlbihbJ2tpbGwnLCAnLVVTUjEnLCBzdHIocGlkKV0pCisgICAgICAgICAgICAjIFRoaXMgd2FpdCBzaG91bGQgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIHNpZ25hbCdzIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIHNlbGYud2FpdChjaGlsZCkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkgICMgR2l2ZSB0aGUgc2lnbmFsIHRpbWUgdG8gYmUgZGVsaXZlcmVkLgorICAgICAgICAgICAgc2VsZi5mYWlsKCdIYW5kbGVyQkNhbGxlZCBleGNlcHRpb24gbm90IHJhaXNlZCcpCisgICAgICAgIGV4Y2VwdCBIYW5kbGVyQkNhbGxlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmJfY2FsbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFfY2FsbGVkKQorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIkhhbmRsZXJCQ2FsbGVkIGV4Y2VwdGlvbiBjYXVnaHQiCisKKyAgICAgICAgY2hpbGQgPSBpZ25vcmluZ19laW50cihzdWJwcm9jZXNzLlBvcGVuLCBbJ2tpbGwnLCAnLVVTUjInLCBzdHIocGlkKV0pCisgICAgICAgIGlmIGNoaWxkOgorICAgICAgICAgICAgc2VsZi53YWl0KGNoaWxkKSAgIyBOb3RoaW5nIHNob3VsZCBoYXBwZW4uCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAjIFRoZSByYWNlIGNvbmRpdGlvbiBpbiBwYXVzZSBkb2Vzbid0IG1hdHRlciBpbiB0aGlzIGNhc2UsCisgICAgICAgICAgICAjIHNpbmNlIGFsYXJtIGlzIGdvaW5nIHRvIHJhaXNlIGEgS2V5Ym9hcmRFeGNlcHRpb24sIHdoaWNoCisgICAgICAgICAgICAjIHdpbGwgc2tpcCB0aGUgY2FsbC4KKyAgICAgICAgICAgIHNpZ25hbC5wYXVzZSgpCisgICAgICAgICAgICAjIEJ1dCBpZiBhbm90aGVyIHNpZ25hbCBhcnJpdmVzIGJlZm9yZSB0aGUgYWxhcm0sIHBhdXNlCisgICAgICAgICAgICAjIG1heSByZXR1cm4gZWFybHkuCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJLZXlib2FyZEludGVycnVwdCAodGhlIGFsYXJtKCkgd2VudCBvZmYpIgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNvbWUgb3RoZXIgZXhjZXB0aW9uIHdva2UgdXMgZnJvbSBwYXVzZTogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICB0cmFjZWJhY2suZm9ybWF0X2V4YygpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJwYXVzZSByZXR1cm5lZCBvZiBpdHMgb3duIGFjY29yZCwgYW5kIHRoZSBzaWduYWwiCisgICAgICAgICAgICAgICAgICAgICAgIiBkaWRuJ3QgYXJyaXZlIGFmdGVyIGFub3RoZXIgc2Vjb25kLiIpCisKKyAgICAjIElzc3VlIDM4NjQuIFVua25vd24gaWYgdGhpcyBhZmZlY3RzIGVhcmxpZXIgdmVyc2lvbnMgb2YgZnJlZWJzZCBhbHNvLgorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtPT0nZnJlZWJzZDYnLAorICAgICAgICAnaW50ZXIgcHJvY2VzcyBzaWduYWxzIG5vdCByZWxpYWJsZSAoZG8gbm90IG1peCB3ZWxsIHdpdGggdGhyZWFkaW5nKSAnCisgICAgICAgICdvbiBmcmVlYnNkNicpCisgICAgZGVmIHRlc3RfbWFpbihzZWxmKToKKyAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIHNwYXducyBhIGNoaWxkIHByb2Nlc3MgdG8gaW5zdWxhdGUgdGhlIG1haW4KKyAgICAgICAgIyB0ZXN0LXJ1bm5pbmcgcHJvY2VzcyBmcm9tIGFsbCB0aGUgc2lnbmFscy4gSXQgdGhlbgorICAgICAgICAjIGNvbW11bmljYXRlcyB3aXRoIHRoYXQgY2hpbGQgcHJvY2VzcyBvdmVyIGEgcGlwZSBhbmQKKyAgICAgICAgIyByZS1yYWlzZXMgaW5mb3JtYXRpb24gYWJvdXQgYW55IGV4Y2VwdGlvbnMgdGhlIGNoaWxkCisgICAgICAgICMgcmFpc2VzLiBUaGUgcmVhbCB3b3JrIGhhcHBlbnMgaW4gc2VsZi5ydW5fdGVzdCgpLgorICAgICAgICBvc19kb25lX3IsIG9zX2RvbmVfdyA9IG9zLnBpcGUoKQorICAgICAgICB3aXRoIGNsb3Npbmcob3MuZmRvcGVuKG9zX2RvbmVfcikpIGFzIGRvbmVfciwgXAorICAgICAgICAgICAgIGNsb3Npbmcob3MuZmRvcGVuKG9zX2RvbmVfdywgJ3cnKSkgYXMgZG9uZV93OgorICAgICAgICAgICAgY2hpbGQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIGNoaWxkID09IDA6CisgICAgICAgICAgICAgICAgIyBJbiB0aGUgY2hpbGQgcHJvY2VzczsgcnVuIHRoZSB0ZXN0IGFuZCByZXBvcnQgcmVzdWx0cworICAgICAgICAgICAgICAgICMgdGhyb3VnaCB0aGUgcGlwZS4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRvbmVfci5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICMgSGF2ZSB0byBjbG9zZSBkb25lX3cgYWdhaW4gaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgICMgZXhpdF9zdWJwcm9jZXNzKCkgd2lsbCBza2lwIHRoZSBlbmNsb3Npbmcgd2l0aCBibG9jay4KKyAgICAgICAgICAgICAgICAgICAgd2l0aCBjbG9zaW5nKGRvbmVfdyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5fdGVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlja2xlLmR1bXAodHJhY2ViYWNrLmZvcm1hdF9leGMoKSwgZG9uZV93KQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcChOb25lLCBkb25lX3cpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwcmludCAnVWggb2gsIHJhaXNlZCBmcm9tIHBpY2tsZS4nCisgICAgICAgICAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGV4aXRfc3VicHJvY2VzcygpCisKKyAgICAgICAgICAgIGRvbmVfdy5jbG9zZSgpCisgICAgICAgICAgICAjIEJsb2NrIGZvciB1cCB0byBNQVhfRFVSQVRJT04gc2Vjb25kcyBmb3IgdGhlIHRlc3QgdG8gZmluaXNoLgorICAgICAgICAgICAgciwgdywgeCA9IHNlbGVjdC5zZWxlY3QoW2RvbmVfcl0sIFtdLCBbXSwgc2VsZi5NQVhfRFVSQVRJT04pCisgICAgICAgICAgICBpZiBkb25lX3IgaW4gcjoKKyAgICAgICAgICAgICAgICB0YiA9IHBpY2tsZS5sb2FkKGRvbmVfcikKKyAgICAgICAgICAgICAgICBpZiB0YjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKHRiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy5raWxsKGNoaWxkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ1Rlc3QgZGVhZGxvY2tlZCBhZnRlciAlZCBzZWNvbmRzLicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLk1BWF9EVVJBVElPTikKKworCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiLCAiTm90IHZhbGlkIG9uIFdpbmRvd3MiKQorY2xhc3MgQmFzaWNTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRyaXZpYWxfc2lnbmFsX2hhbmRsZXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9vdXRfb2ZfcmFuZ2Vfc2lnbmFsX251bWJlcl9yYWlzZXNfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNpZ25hbC5nZXRzaWduYWwsIDQyNDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2lnbmFsLnNpZ25hbCwgNDI0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50cml2aWFsX3NpZ25hbF9oYW5kbGVyKQorCisgICAgZGVmIHRlc3Rfc2V0dGluZ19zaWduYWxfaGFuZGxlcl90b19ub25lX3JhaXNlc19lcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzaWduYWwuc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwuU0lHVVNSMSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2dldHNpZ25hbChzZWxmKToKKyAgICAgICAgaHVwID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBzZWxmLnRyaXZpYWxfc2lnbmFsX2hhbmRsZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSFVQKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRyaXZpYWxfc2lnbmFsX2hhbmRsZXIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaHVwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0hVUCksIGh1cCkKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIldpbmRvd3Mgc3BlY2lmaWMiKQorY2xhc3MgV2luZG93c1NpZ25hbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9pc3N1ZTkzMjQoc2VsZik6CisgICAgICAgICMgVXBkYXRlZCBmb3IgaXNzdWUgIzEwMDAzLCBhZGRpbmcgU0lHQlJFQUsKKyAgICAgICAgaGFuZGxlciA9IGxhbWJkYSB4LCB5OiBOb25lCisgICAgICAgIGZvciBzaWcgaW4gKHNpZ25hbC5TSUdBQlJULCBzaWduYWwuU0lHQlJFQUssIHNpZ25hbC5TSUdGUEUsCisgICAgICAgICAgICAgICAgICAgIHNpZ25hbC5TSUdJTEwsIHNpZ25hbC5TSUdJTlQsIHNpZ25hbC5TSUdTRUdWLAorICAgICAgICAgICAgICAgICAgICBzaWduYWwuU0lHVEVSTSk6CisgICAgICAgICAgICAjIFNldCBhbmQgdGhlbiByZXNldCBhIGhhbmRsZXIgZm9yIHNpZ25hbHMgdGhhdCB3b3JrIG9uIHdpbmRvd3MKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnLCBzaWduYWwuc2lnbmFsKHNpZywgaGFuZGxlcikpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoLTEsIGhhbmRsZXIpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoNywgaGFuZGxlcikKKworCitjbGFzcyBXYWtldXBGRFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfZmQoc2VsZik6CisgICAgICAgIGZkID0gdGVzdF9zdXBwb3J0Lm1ha2VfYmFkX2ZkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2lnbmFsLnNldF93YWtldXBfZmQsIGZkKQorCisKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJOb3QgdmFsaWQgb24gV2luZG93cyIpCitjbGFzcyBXYWtldXBTaWduYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgVElNRU9VVF9GVUxMID0gMTAKKyAgICBUSU1FT1VUX0hBTEYgPSA1CisKKyAgICBkZWYgdGVzdF93YWtldXBfZmRfZWFybHkoc2VsZik6CisgICAgICAgIGltcG9ydCBzZWxlY3QKKworICAgICAgICBzaWduYWwuYWxhcm0oMSkKKyAgICAgICAgYmVmb3JlX3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICAjIFdlIGF0dGVtcHQgdG8gZ2V0IGEgc2lnbmFsIGR1cmluZyB0aGUgc2xlZXAsCisgICAgICAgICMgYmVmb3JlIHNlbGVjdCBpcyBjYWxsZWQKKyAgICAgICAgdGltZS5zbGVlcChzZWxmLlRJTUVPVVRfRlVMTCkKKyAgICAgICAgbWlkX3RpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWlkX3RpbWUgLSBiZWZvcmVfdGltZSA8IHNlbGYuVElNRU9VVF9IQUxGKQorICAgICAgICBzZWxlY3Quc2VsZWN0KFtzZWxmLnJlYWRdLCBbXSwgW10sIHNlbGYuVElNRU9VVF9GVUxMKQorICAgICAgICBhZnRlcl90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFmdGVyX3RpbWUgLSBtaWRfdGltZSA8IHNlbGYuVElNRU9VVF9IQUxGKQorCisgICAgZGVmIHRlc3Rfd2FrZXVwX2ZkX2R1cmluZyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHNlbGVjdAorCisgICAgICAgIHNpZ25hbC5hbGFybSgxKQorICAgICAgICBiZWZvcmVfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgICMgV2UgYXR0ZW1wdCB0byBnZXQgYSBzaWduYWwgZHVyaW5nIHRoZSBzZWxlY3QgY2FsbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxlY3QuZXJyb3IsIHNlbGVjdC5zZWxlY3QsCisgICAgICAgICAgICBbc2VsZi5yZWFkXSwgW10sIFtdLCBzZWxmLlRJTUVPVVRfRlVMTCkKKyAgICAgICAgYWZ0ZXJfdGltZSA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhZnRlcl90aW1lIC0gYmVmb3JlX3RpbWUgPCBzZWxmLlRJTUVPVVRfSEFMRikKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaW1wb3J0IGZjbnRsCisKKyAgICAgICAgc2VsZi5hbHJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgbGFtYmRhIHgseTpOb25lKQorICAgICAgICBzZWxmLnJlYWQsIHNlbGYud3JpdGUgPSBvcy5waXBlKCkKKyAgICAgICAgZmxhZ3MgPSBmY250bC5mY250bChzZWxmLndyaXRlLCBmY250bC5GX0dFVEZMLCAwKQorICAgICAgICBmbGFncyA9IGZsYWdzIHwgb3MuT19OT05CTE9DSworICAgICAgICBmY250bC5mY250bChzZWxmLndyaXRlLCBmY250bC5GX1NFVEZMLCBmbGFncykKKyAgICAgICAgc2VsZi5vbGRfd2FrZXVwID0gc2lnbmFsLnNldF93YWtldXBfZmQoc2VsZi53cml0ZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2lnbmFsLnNldF93YWtldXBfZmQoc2VsZi5vbGRfd2FrZXVwKQorICAgICAgICBvcy5jbG9zZShzZWxmLnJlYWQpCisgICAgICAgIG9zLmNsb3NlKHNlbGYud3JpdGUpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIHNlbGYuYWxybSkKKworQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKK2NsYXNzIFNpZ2ludGVycnVwdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJJbnN0YWxsIGEgbm8tb3Agc2lnbmFsIGhhbmRsZXIgdGhhdCBjYW4gYmUgc2V0IHRvIGFsbG93CisgICAgICAgIGludGVycnVwdHMgb3Igbm90LCBhbmQgYXJyYW5nZSBmb3IgdGhlIG9yaWdpbmFsIHNpZ25hbCBoYW5kbGVyIHRvIGJlCisgICAgICAgIHJlLWluc3RhbGxlZCB3aGVuIHRoZSB0ZXN0IGlzIGZpbmlzaGVkLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5zaWdudW0gPSBzaWduYWwuU0lHVVNSMQorICAgICAgICBvbGRoYW5kbGVyID0gc2lnbmFsLnNpZ25hbChzZWxmLnNpZ251bSwgbGFtYmRhIHgseTogTm9uZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNpZ25hbC5zaWduYWwsIHNlbGYuc2lnbnVtLCBvbGRoYW5kbGVyKQorCisgICAgZGVmIHJlYWRwaXBlX2ludGVycnVwdGVkKHNlbGYpOgorICAgICAgICAiIiJQZXJmb3JtIGEgcmVhZCBkdXJpbmcgd2hpY2ggYSBzaWduYWwgd2lsbCBhcnJpdmUuICBSZXR1cm4gVHJ1ZSBpZiB0aGUKKyAgICAgICAgcmVhZCBpcyBpbnRlcnJ1cHRlZCBieSB0aGUgc2lnbmFsIGFuZCByYWlzZXMgYW4gZXhjZXB0aW9uLiAgUmV0dXJuIEZhbHNlCisgICAgICAgIGlmIGl0IHJldHVybnMgbm9ybWFsbHkuCisgICAgICAgICIiIgorICAgICAgICAjIENyZWF0ZSBhIHBpcGUgdGhhdCBjYW4gYmUgdXNlZCBmb3IgdGhlIHJlYWQuICBBbHNvIGNsZWFuIGl0IHVwCisgICAgICAgICMgd2hlbiB0aGUgdGVzdCBpcyBvdmVyLCBzaW5jZSBub3RoaW5nIGVsc2Ugd2lsbCAoYnV0IHNlZSBiZWxvdyBmb3IKKyAgICAgICAgIyB0aGUgd3JpdGUgZW5kKS4KKyAgICAgICAgciwgdyA9IG9zLnBpcGUoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAob3MuY2xvc2UsIHIpCisKKyAgICAgICAgIyBDcmVhdGUgYW5vdGhlciBwcm9jZXNzIHdoaWNoIGNhbiBzZW5kIGEgc2lnbmFsIHRvIHRoaXMgb25lIHRvIHRyeQorICAgICAgICAjIHRvIGludGVycnVwdCB0aGUgcmVhZC4KKyAgICAgICAgcHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorCisgICAgICAgIGlmIHBpZCA9PSAwOgorICAgICAgICAgICAgIyBDaGlsZCBjb2RlOiBzbGVlcCB0byBnaXZlIHRoZSBwYXJlbnQgZW5vdWdoIHRpbWUgdG8gZW50ZXIgdGhlCisgICAgICAgICAgICAjIHJlYWQoKSBjYWxsICh0aGVyZSdzIGEgcmFjZSBoZXJlLCBidXQgaXQncyByZWFsbHkgdHJpY2t5IHRvCisgICAgICAgICAgICAjIGVsaW1pbmF0ZSBpdCk7IHRoZW4gc2lnbmFsIHRoZSBwYXJlbnQgcHJvY2Vzcy4gIEFsc28sIHNsZWVwCisgICAgICAgICAgICAjIGFnYWluIHRvIG1ha2UgaXQgbGlrZWx5IHRoYXQgdGhlIHNpZ25hbCBpcyBkZWxpdmVyZWQgdG8gdGhlCisgICAgICAgICAgICAjIHBhcmVudCBwcm9jZXNzIGJlZm9yZSB0aGUgY2hpbGQgZXhpdHMuICBJZiB0aGUgY2hpbGQgZXhpdHMKKyAgICAgICAgICAgICMgZmlyc3QsIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUgd2lsbCBiZSBjbG9zZWQgYW5kIHRoZSB0ZXN0CisgICAgICAgICAgICAjIGlzIGludmFsaWQuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjIpCisgICAgICAgICAgICAgICAgb3Mua2lsbChwcGlkLCBzZWxmLnNpZ251bSkKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgIyBObyBtYXR0ZXIgd2hhdCwganVzdCBleGl0IGFzIGZhc3QgYXMgcG9zc2libGUgbm93LgorICAgICAgICAgICAgICAgIGV4aXRfc3VicHJvY2VzcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBhcmVudCBjb2RlLgorICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGNoaWxkIGlzIGV2ZW50dWFsbHkgcmVhcGVkLCBlbHNlIGl0J2xsIGJlIGEKKyAgICAgICAgICAgICMgem9tYmllIGZvciB0aGUgcmVzdCBvZiB0aGUgdGVzdCBzdWl0ZSBydW4uCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3Mud2FpdHBpZCwgcGlkLCAwKQorCisgICAgICAgICAgICAjIENsb3NlIHRoZSB3cml0ZSBlbmQgb2YgdGhlIHBpcGUuICBUaGUgY2hpbGQgaGFzIGEgY29weSwgc28KKyAgICAgICAgICAgICMgaXQncyBub3QgcmVhbGx5IGNsb3NlZCB1bnRpbCB0aGUgY2hpbGQgZXhpdHMuICBXZSBuZWVkIGl0IHRvCisgICAgICAgICAgICAjIGNsb3NlIHdoZW4gdGhlIGNoaWxkIGV4aXRzIHNvIHRoYXQgaW4gdGhlIG5vbi1pbnRlcnJ1cHQgY2FzZQorICAgICAgICAgICAgIyB0aGUgcmVhZCBldmVudHVhbGx5IGNvbXBsZXRlcywgb3RoZXJ3aXNlIHdlIGNvdWxkIGp1c3QgY2xvc2UKKyAgICAgICAgICAgICMgaXQgKmFmdGVyKiB0aGUgdGVzdC4KKyAgICAgICAgICAgIG9zLmNsb3NlKHcpCisKKyAgICAgICAgICAgICMgVHJ5IHRoZSByZWFkIGFuZCByZXBvcnQgd2hldGhlciBpdCBpcyBpbnRlcnJ1cHRlZCBvciBub3QgdG8KKyAgICAgICAgICAgICMgdGhlIGNhbGxlci4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkID0gb3MucmVhZChyLCAxKQorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBpZiBlcnIuZXJybm8gIT0gZXJybm8uRUlOVFI6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGRlZiB0ZXN0X3dpdGhvdXRfc2lnaW50ZXJydXB0KHNlbGYpOgorICAgICAgICAiIiJJZiBhIHNpZ25hbCBoYW5kbGVyIGlzIGluc3RhbGxlZCBhbmQgc2lnaW50ZXJydXB0IGlzIG5vdCBjYWxsZWQKKyAgICAgICAgYXQgYWxsLCB3aGVuIHRoYXQgc2lnbmFsIGFycml2ZXMsIGl0IGludGVycnVwdHMgYSBzeXNjYWxsIHRoYXQncyBpbgorICAgICAgICBwcm9ncmVzcy4KKyAgICAgICAgIiIiCisgICAgICAgIGkgPSBzZWxmLnJlYWRwaXBlX2ludGVycnVwdGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkpCisgICAgICAgICMgQXJyaXZhbCBvZiB0aGUgc2lnbmFsIHNob3VsZG4ndCBoYXZlIGNoYW5nZWQgYW55dGhpbmcuCisgICAgICAgIGkgPSBzZWxmLnJlYWRwaXBlX2ludGVycnVwdGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkpCisKKyAgICBkZWYgdGVzdF9zaWdpbnRlcnJ1cHRfb24oc2VsZik6CisgICAgICAgICIiIklmIGEgc2lnbmFsIGhhbmRsZXIgaXMgaW5zdGFsbGVkIGFuZCBzaWdpbnRlcnJ1cHQgaXMgY2FsbGVkIHdpdGgKKyAgICAgICAgYSB0cnVlIHZhbHVlIGZvciB0aGUgc2Vjb25kIGFyZ3VtZW50LCB3aGVuIHRoYXQgc2lnbmFsIGFycml2ZXMsIGl0CisgICAgICAgIGludGVycnVwdHMgYSBzeXNjYWxsIHRoYXQncyBpbiBwcm9ncmVzcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNpZ25hbC5zaWdpbnRlcnJ1cHQoc2VsZi5zaWdudW0sIDEpCisgICAgICAgIGkgPSBzZWxmLnJlYWRwaXBlX2ludGVycnVwdGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkpCisgICAgICAgICMgQXJyaXZhbCBvZiB0aGUgc2lnbmFsIHNob3VsZG4ndCBoYXZlIGNoYW5nZWQgYW55dGhpbmcuCisgICAgICAgIGkgPSBzZWxmLnJlYWRwaXBlX2ludGVycnVwdGVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkpCisKKyAgICBkZWYgdGVzdF9zaWdpbnRlcnJ1cHRfb2ZmKHNlbGYpOgorICAgICAgICAiIiJJZiBhIHNpZ25hbCBoYW5kbGVyIGlzIGluc3RhbGxlZCBhbmQgc2lnaW50ZXJydXB0IGlzIGNhbGxlZCB3aXRoCisgICAgICAgIGEgZmFsc2UgdmFsdWUgZm9yIHRoZSBzZWNvbmQgYXJndW1lbnQsIHdoZW4gdGhhdCBzaWduYWwgYXJyaXZlcywgaXQKKyAgICAgICAgZG9lcyBub3QgaW50ZXJydXB0IGEgc3lzY2FsbCB0aGF0J3MgaW4gcHJvZ3Jlc3MuCisgICAgICAgICIiIgorICAgICAgICBzaWduYWwuc2lnaW50ZXJydXB0KHNlbGYuc2lnbnVtLCAwKQorICAgICAgICBpID0gc2VsZi5yZWFkcGlwZV9pbnRlcnJ1cHRlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaSkKKyAgICAgICAgIyBBcnJpdmFsIG9mIHRoZSBzaWduYWwgc2hvdWxkbid0IGhhdmUgY2hhbmdlZCBhbnl0aGluZy4KKyAgICAgICAgaSA9IHNlbGYucmVhZHBpcGVfaW50ZXJydXB0ZWQoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGkpCisKKworQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gIndpbjMyIiwgIk5vdCB2YWxpZCBvbiBXaW5kb3dzIikKK2NsYXNzIEl0aW1lclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5obmRsX2NhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuaG5kbF9jb3VudCA9IDAKKyAgICAgICAgc2VsZi5pdGltZXIgPSBOb25lCisgICAgICAgIHNlbGYub2xkX2FsYXJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2VsZi5zaWdfYWxybSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgc2VsZi5vbGRfYWxhcm0pCisgICAgICAgIGlmIHNlbGYuaXRpbWVyIGlzIG5vdCBOb25lOiAjIHRlc3RfaXRpbWVyX2V4YyBkb2Vzbid0IGNoYW5nZSB0aGlzIGF0dHIKKyAgICAgICAgICAgICMganVzdCBlbnN1cmUgdGhhdCBpdGltZXIgaXMgc3RvcHBlZAorICAgICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzZWxmLml0aW1lciwgMCkKKworICAgIGRlZiBzaWdfYWxybShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuaG5kbF9jYWxsZWQgPSBUcnVlCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIlNJR0FMUk0gaGFuZGxlciBpbnZva2VkIiwgYXJncykKKworICAgIGRlZiBzaWdfdnRhbHJtKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5obmRsX2NhbGxlZCA9IFRydWUKKworICAgICAgICBpZiBzZWxmLmhuZGxfY291bnQgPiAzOgorICAgICAgICAgICAgIyBpdCBzaG91bGRuJ3QgYmUgaGVyZSwgYmVjYXVzZSBpdCBzaG91bGQgaGF2ZSBiZWVuIGRpc2FibGVkLgorICAgICAgICAgICAgcmFpc2Ugc2lnbmFsLkl0aW1lckVycm9yKCJzZXRpdGltZXIgZGlkbid0IGRpc2FibGUgSVRJTUVSX1ZJUlRVQUwgIgorICAgICAgICAgICAgICAgICJ0aW1lci4iKQorICAgICAgICBlbGlmIHNlbGYuaG5kbF9jb3VudCA9PSAzOgorICAgICAgICAgICAgIyBkaXNhYmxlIElUSU1FUl9WSVJUVUFMLCB0aGlzIGZ1bmN0aW9uIHNob3VsZG4ndCBiZSBjYWxsZWQgYW55bW9yZQorICAgICAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1ZJUlRVQUwsIDApCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCgibGFzdCBTSUdWVEFMUk0gaGFuZGxlciBjYWxsIikKKworICAgICAgICBzZWxmLmhuZGxfY291bnQgKz0gMQorCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQoIlNJR1ZUQUxSTSBoYW5kbGVyIGludm9rZWQiLCBhcmdzKQorCisgICAgZGVmIHNpZ19wcm9mKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5obmRsX2NhbGxlZCA9IFRydWUKKyAgICAgICAgc2lnbmFsLnNldGl0aW1lcihzaWduYWwuSVRJTUVSX1BST0YsIDApCisKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiU0lHUFJPRiBoYW5kbGVyIGludm9rZWQiLCBhcmdzKQorCisgICAgZGVmIHRlc3RfaXRpbWVyX2V4YyhzZWxmKToKKyAgICAgICAgIyBYWFggSSdtIGFzc3VtaW5nIC0xIGlzIGFuIGludmFsaWQgaXRpbWVyLCBidXQgbWF5YmUgc29tZSBwbGF0Zm9ybQorICAgICAgICAjIGRlZmluZXMgaXQgPworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaWduYWwuSXRpbWVyRXJyb3IsIHNpZ25hbC5zZXRpdGltZXIsIC0xLCAwKQorICAgICAgICAjIE5lZ2F0aXZlIHRpbWVzIGFyZSB0cmVhdGVkIGFzIHplcm8gb24gc29tZSBwbGF0Zm9ybXMuCisgICAgICAgIGlmIDA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzaWduYWwuSXRpbWVyRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwuc2V0aXRpbWVyLCBzaWduYWwuSVRJTUVSX1JFQUwsIC0xKQorCisgICAgZGVmIHRlc3RfaXRpbWVyX3JlYWwoc2VsZik6CisgICAgICAgIHNlbGYuaXRpbWVyID0gc2lnbmFsLklUSU1FUl9SRUFMCisgICAgICAgIHNpZ25hbC5zZXRpdGltZXIoc2VsZi5pdGltZXIsIDEuMCkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCgiXG5jYWxsIHBhdXNlKCkuLi4iKQorICAgICAgICBzaWduYWwucGF1c2UoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5obmRsX2NhbGxlZCwgVHJ1ZSkKKworICAgICMgSXNzdWUgMzg2NC4gVW5rbm93biBpZiB0aGlzIGFmZmVjdHMgZWFybGllciB2ZXJzaW9ucyBvZiBmcmVlYnNkIGFsc28uCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gKCdmcmVlYnNkNicsICduZXRic2Q1JyksCisgICAgICAgICdpdGltZXIgbm90IHJlbGlhYmxlIChkb2VzIG5vdCBtaXggd2VsbCB3aXRoIHRocmVhZGluZykgb24gc29tZSBCU0RzLicpCisgICAgZGVmIHRlc3RfaXRpbWVyX3ZpcnR1YWwoc2VsZik6CisgICAgICAgIHNlbGYuaXRpbWVyID0gc2lnbmFsLklUSU1FUl9WSVJUVUFMCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1ZUQUxSTSwgc2VsZi5zaWdfdnRhbHJtKQorICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNlbGYuaXRpbWVyLCAwLjMsIDAuMikKKworICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgd2hpbGUgdGltZS50aW1lKCkgLSBzdGFydF90aW1lIDwgNjAuMDoKKyAgICAgICAgICAgICMgdXNlIHVwIHNvbWUgdmlydHVhbCB0aW1lIGJ5IGRvaW5nIHJlYWwgd29yaworICAgICAgICAgICAgXyA9IHBvdygxMjM0NSwgNjc4OTAsIDEwMDAwMDE5KQorICAgICAgICAgICAgaWYgc2lnbmFsLmdldGl0aW1lcihzZWxmLml0aW1lcikgPT0gKDAuMCwgMC4wKToKKyAgICAgICAgICAgICAgICBicmVhayAjIHNpZ192dGFscm0gaGFuZGxlciBzdG9wcGVkIHRoaXMgaXRpbWVyCisgICAgICAgIGVsc2U6ICMgSXNzdWUgODQyNAorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGltZW91dDogbGlrZWx5IGNhdXNlOiBtYWNoaW5lIHRvbyBzbG93IG9yIGxvYWQgdG9vICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhpZ2giKQorCisgICAgICAgICMgdmlydHVhbCBpdGltZXIgc2hvdWxkIGJlICgwLjAsIDAuMCkgbm93CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldGl0aW1lcihzZWxmLml0aW1lciksICgwLjAsIDAuMCkpCisgICAgICAgICMgYW5kIHRoZSBoYW5kbGVyIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5obmRsX2NhbGxlZCwgVHJ1ZSkKKworICAgICMgSXNzdWUgMzg2NC4gVW5rbm93biBpZiB0aGlzIGFmZmVjdHMgZWFybGllciB2ZXJzaW9ucyBvZiBmcmVlYnNkIGFsc28uCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm09PSdmcmVlYnNkNicsCisgICAgICAgICdpdGltZXIgbm90IHJlbGlhYmxlIChkb2VzIG5vdCBtaXggd2VsbCB3aXRoIHRocmVhZGluZykgb24gZnJlZWJzZDYnKQorICAgIGRlZiB0ZXN0X2l0aW1lcl9wcm9mKHNlbGYpOgorICAgICAgICBzZWxmLml0aW1lciA9IHNpZ25hbC5JVElNRVJfUFJPRgorICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdQUk9GLCBzZWxmLnNpZ19wcm9mKQorICAgICAgICBzaWduYWwuc2V0aXRpbWVyKHNlbGYuaXRpbWVyLCAwLjIsIDAuMikKKworICAgICAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgd2hpbGUgdGltZS50aW1lKCkgLSBzdGFydF90aW1lIDwgNjAuMDoKKyAgICAgICAgICAgICMgZG8gc29tZSB3b3JrCisgICAgICAgICAgICBfID0gcG93KDEyMzQ1LCA2Nzg5MCwgMTAwMDAwMTkpCisgICAgICAgICAgICBpZiBzaWduYWwuZ2V0aXRpbWVyKHNlbGYuaXRpbWVyKSA9PSAoMC4wLCAwLjApOgorICAgICAgICAgICAgICAgIGJyZWFrICMgc2lnX3Byb2YgaGFuZGxlciBzdG9wcGVkIHRoaXMgaXRpbWVyCisgICAgICAgIGVsc2U6ICMgSXNzdWUgODQyNAorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGltZW91dDogbGlrZWx5IGNhdXNlOiBtYWNoaW5lIHRvbyBzbG93IG9yIGxvYWQgdG9vICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhpZ2giKQorCisgICAgICAgICMgcHJvZmlsaW5nIGl0aW1lciBzaG91bGQgYmUgKDAuMCwgMC4wKSBub3cKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0aXRpbWVyKHNlbGYuaXRpbWVyKSwgKDAuMCwgMC4wKSkKKyAgICAgICAgIyBhbmQgdGhlIGhhbmRsZXIgc2hvdWxkIGhhdmUgYmVlbiBjYWxsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmhuZGxfY2FsbGVkLCBUcnVlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCYXNpY1NpZ25hbFRlc3RzLCBJbnRlclByb2Nlc3NTaWduYWxUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdha2V1cEZEVGVzdHMsIFdha2V1cFNpZ25hbFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnaW50ZXJydXB0VGVzdCwgSXRpbWVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd3NTaWduYWxUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2lnbmFsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTkxZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2lnbmFsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaWduYWwucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2lnbmFsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTkxZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2lnbmFsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaXRlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2l0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGI1ZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc2l0ZS5weQpAQCAtMCwwICsxLDM5NCBAQAorIiIiVGVzdHMgZm9yICdzaXRlJy4KKworVGVzdHMgYXNzdW1lIHRoZSBpbml0aWFsIHBhdGhzIGluIHN5cy5wYXRoIG9uY2UgdGhlIGludGVycHJldGVyIGhhcyBiZWd1bgorZXhlY3V0aW5nIGhhdmUgbm90IGJlZW4gcmVtb3ZlZC4KKworIiIiCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdCwgVEVTVEZOLCBFbnZpcm9ubWVudFZhckd1YXJkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBjYXB0dXJlZF9vdXRwdXQKK2ltcG9ydCBfX2J1aWx0aW5fXworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2ltcG9ydCBlbmNvZGluZ3MKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzY29uZmlnCitmcm9tIGNvcHkgaW1wb3J0IGNvcHkKKworIyBOZWVkIHRvIG1ha2Ugc3VyZSB0byBub3QgaW1wb3J0ICdzaXRlJyBpZiBzb21lb25lIHNwZWNpZmllZCBgYC1TYGAgYXQgdGhlCisjIGNvbW1hbmQtbGluZS4gIERldGVjdCB0aGlzIGJ5IGp1c3QgbWFraW5nIHN1cmUgJ3NpdGUnIGhhcyBub3QgYmVlbiBpbXBvcnRlZAorIyBhbHJlYWR5LgoraWYgInNpdGUiIGluIHN5cy5tb2R1bGVzOgorICAgIGltcG9ydCBzaXRlCitlbHNlOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJpbXBvcnRhdGlvbiBvZiBzaXRlLnB5IHN1cHByZXNzZWQiKQorCitpZiBzaXRlLkVOQUJMRV9VU0VSX1NJVEUgYW5kIG5vdCBvcy5wYXRoLmlzZGlyKHNpdGUuVVNFUl9TSVRFKToKKyAgICAjIG5lZWQgdG8gYWRkIHVzZXIgc2l0ZSBkaXJlY3RvcnkgZm9yIHRlc3RzCisgICAgb3MubWFrZWRpcnMoc2l0ZS5VU0VSX1NJVEUpCisgICAgc2l0ZS5hZGRzaXRlZGlyKHNpdGUuVVNFUl9TSVRFKQorCitjbGFzcyBIZWxwZXJGdW5jdGlvbnNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIGhlbHBlciBmdW5jdGlvbnMuCisKKyAgICBUaGUgc2V0dGluZyBvZiB0aGUgZW5jb2RpbmcgKHNldCB1c2luZyBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nKSB1c2VkIGJ5CisgICAgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24gaXMgbm90IHRlc3RlZC4KKworICAgICIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJTYXZlIGEgY29weSBvZiBzeXMucGF0aCIiIgorICAgICAgICBzZWxmLnN5c19wYXRoID0gc3lzLnBhdGhbOl0KKyAgICAgICAgc2VsZi5vbGRfYmFzZSA9IHNpdGUuVVNFUl9CQVNFCisgICAgICAgIHNlbGYub2xkX3NpdGUgPSBzaXRlLlVTRVJfU0lURQorICAgICAgICBzZWxmLm9sZF9wcmVmaXhlcyA9IHNpdGUuUFJFRklYRVMKKyAgICAgICAgc2VsZi5vbGRfdmFycyA9IGNvcHkoc3lzY29uZmlnLl9DT05GSUdfVkFSUykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIiIiUmVzdG9yZSBzeXMucGF0aCIiIgorICAgICAgICBzeXMucGF0aFs6XSA9IHNlbGYuc3lzX3BhdGgKKyAgICAgICAgc2l0ZS5VU0VSX0JBU0UgPSBzZWxmLm9sZF9iYXNlCisgICAgICAgIHNpdGUuVVNFUl9TSVRFID0gc2VsZi5vbGRfc2l0ZQorICAgICAgICBzaXRlLlBSRUZJWEVTID0gc2VsZi5vbGRfcHJlZml4ZXMKKyAgICAgICAgc3lzY29uZmlnLl9DT05GSUdfVkFSUyA9IHNlbGYub2xkX3ZhcnMKKworICAgIGRlZiB0ZXN0X21ha2VwYXRoKHNlbGYpOgorICAgICAgICAjIFRlc3QgbWFrZXBhdGgoKSBoYXZlIGFuIGFic29sdXRlIHBhdGggZm9yIGl0cyBmaXJzdCByZXR1cm4gdmFsdWUKKyAgICAgICAgIyBhbmQgYSBjYXNlLW5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgYWJzb2x1dGUgcGF0aCBmb3IgaXRzCisgICAgICAgICMgc2Vjb25kIHZhbHVlLgorICAgICAgICBwYXRoX3BhcnRzID0gKCJCZWdpbm5pbmciLCAiRW5kIikKKyAgICAgICAgb3JpZ2luYWxfZGlyID0gb3MucGF0aC5qb2luKCpwYXRoX3BhcnRzKQorICAgICAgICBhYnNfZGlyLCBub3JtX2RpciA9IHNpdGUubWFrZXBhdGgoKnBhdGhfcGFydHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5hYnNwYXRoKG9yaWdpbmFsX2RpciksIGFic19kaXIpCisgICAgICAgIGlmIG9yaWdpbmFsX2RpciA9PSBvcy5wYXRoLm5vcm1jYXNlKG9yaWdpbmFsX2Rpcik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFic19kaXIsIG5vcm1fZGlyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLm5vcm1jYXNlKGFic19kaXIpLCBub3JtX2RpcikKKworICAgIGRlZiB0ZXN0X2luaXRfcGF0aGluZm8oc2VsZik6CisgICAgICAgIGRpcl9zZXQgPSBzaXRlLl9pbml0X3BhdGhpbmZvKCkKKyAgICAgICAgZm9yIGVudHJ5IGluIFtzaXRlLm1ha2VwYXRoKHBhdGgpWzFdIGZvciBwYXRoIGluIHN5cy5wYXRoCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKHBhdGgpXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZW50cnksIGRpcl9zZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBmcm9tIHN5cy5wYXRoIG5vdCBmb3VuZCBpbiBzZXQgcmV0dXJuZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgX2luaXRfcGF0aGluZm8oKTogJXMiICUgKGVudHJ5LCBkaXJfc2V0KSkKKworICAgIGRlZiBwdGhfZmlsZV90ZXN0cyhzZWxmLCBwdGhfZmlsZSk6CisgICAgICAgICIiIkNvbnRhaW4gY29tbW9uIGNvZGUgZm9yIHRlc3RpbmcgcmVzdWx0cyBvZiByZWFkaW5nIGEgLnB0aCBmaWxlIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocHRoX2ZpbGUuaW1wb3J0ZWQsIHN5cy5tb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICIlcyBub3QgaW4gc3lzLm1vZHVsZXMiICUgcHRoX2ZpbGUuaW1wb3J0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc2l0ZS5tYWtlcGF0aChwdGhfZmlsZS5nb29kX2Rpcl9wYXRoKVswXSwgc3lzLnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMocHRoX2ZpbGUuYmFkX2Rpcl9wYXRoKSkKKworICAgIGRlZiB0ZXN0X2FkZHBhY2thZ2Uoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFkZHBhY2thZ2UoKSBpbXBvcnRzIGlmIHRoZSBsaW5lIHN0YXJ0cyB3aXRoICdpbXBvcnQnLAorICAgICAgICAjIGFkZHMgZGlyZWN0b3JpZXMgdG8gc3lzLnBhdGggZm9yIGFueSBsaW5lIGluIHRoZSBmaWxlIHRoYXQgaXMgbm90IGEKKyAgICAgICAgIyBjb21tZW50IG9yIGltcG9ydCB0aGF0IGlzIGEgdmFsaWQgZGlyZWN0b3J5IG5hbWUgZm9yIHdoZXJlIHRoZSAucHRoCisgICAgICAgICMgZmlsZSByZXNpZGVzOyBpbnZhbGlkIGRpcmVjdG9yaWVzIGFyZSBub3QgYWRkZWQKKyAgICAgICAgcHRoX2ZpbGUgPSBQdGhGaWxlKCkKKyAgICAgICAgcHRoX2ZpbGUuY2xlYW51cChwcmVwPVRydWUpICAjIHRvIG1ha2Ugc3VyZSB0aGF0IG5vdGhpbmcgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwcmUtZXhpc3RpbmcgdGhhdCBzaG91bGRuJ3QgYmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHRoX2ZpbGUuY3JlYXRlKCkKKyAgICAgICAgICAgIHNpdGUuYWRkcGFja2FnZShwdGhfZmlsZS5iYXNlX2RpciwgcHRoX2ZpbGUuZmlsZW5hbWUsIHNldCgpKQorICAgICAgICAgICAgc2VsZi5wdGhfZmlsZV90ZXN0cyhwdGhfZmlsZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHB0aF9maWxlLmNsZWFudXAoKQorCisgICAgZGVmIG1ha2VfcHRoKHNlbGYsIGNvbnRlbnRzLCBwdGhfZGlyPScuJywgcHRoX25hbWU9VEVTVEZOKToKKyAgICAgICAgIyBDcmVhdGUgYSAucHRoIGZpbGUgYW5kIHJldHVybiBpdHMgKGFic3BhdGgsIGJhc2VuYW1lKS4KKyAgICAgICAgcHRoX2RpciA9IG9zLnBhdGguYWJzcGF0aChwdGhfZGlyKQorICAgICAgICBwdGhfYmFzZW5hbWUgPSBwdGhfbmFtZSArICcucHRoJworICAgICAgICBwdGhfZm4gPSBvcy5wYXRoLmpvaW4ocHRoX2RpciwgcHRoX2Jhc2VuYW1lKQorICAgICAgICBwdGhfZmlsZSA9IG9wZW4ocHRoX2ZuLCAndycpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChsYW1iZGE6IG9zLnJlbW92ZShwdGhfZm4pKQorICAgICAgICBwdGhfZmlsZS53cml0ZShjb250ZW50cykKKyAgICAgICAgcHRoX2ZpbGUuY2xvc2UoKQorICAgICAgICByZXR1cm4gcHRoX2RpciwgcHRoX2Jhc2VuYW1lCisKKyAgICBkZWYgdGVzdF9hZGRwYWNrYWdlX2ltcG9ydF9iYWRfc3ludGF4KHNlbGYpOgorICAgICAgICAjIElzc3VlIDEwNjQyCisgICAgICAgIHB0aF9kaXIsIHB0aF9mbiA9IHNlbGYubWFrZV9wdGgoImltcG9ydCBiYWQpc3ludGF4XG4iKQorICAgICAgICB3aXRoIGNhcHR1cmVkX291dHB1dCgic3RkZXJyIikgYXMgZXJyX291dDoKKyAgICAgICAgICAgIHNpdGUuYWRkcGFja2FnZShwdGhfZGlyLCBwdGhfZm4sIHNldCgpKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLCAibGluZSAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgIHJlLmVzY2FwZShvcy5wYXRoLmpvaW4ocHRoX2RpciwgcHRoX2ZuKSkpCisgICAgICAgICMgWFhYOiB0aGUgcHJldmlvdXMgdHdvIHNob3VsZCBiZSBpbmRlcGVuZGVudCBjaGVja3Mgc28gdGhhdCB0aGUKKyAgICAgICAgIyBvcmRlciBkb2Vzbid0IG1hdHRlci4gIFRoZSBuZXh0IHRocmVlIGNvdWxkIGJlIGEgc2luZ2xlIGNoZWNrCisgICAgICAgICMgYnV0IG15IHJlZ2V4IGZvbyBpc24ndCBnb29kIGVub3VnaCB0byB3cml0ZSBpdC4KKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwgJ1RyYWNlYmFjaycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksIHInaW1wb3J0IGJhZFwpc3ludGF4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwgJ1N5bnRheEVycm9yJykKKworICAgIGRlZiB0ZXN0X2FkZHBhY2thZ2VfaW1wb3J0X2JhZF9leGVjKHNlbGYpOgorICAgICAgICAjIElzc3VlIDEwNjQyCisgICAgICAgIHB0aF9kaXIsIHB0aF9mbiA9IHNlbGYubWFrZV9wdGgoInJhbmRvbXBhdGhcbmltcG9ydCBub3N1Y2htb2R1bGVcbiIpCisgICAgICAgIHdpdGggY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBlcnJfb3V0OgorICAgICAgICAgICAgc2l0ZS5hZGRwYWNrYWdlKHB0aF9kaXIsIHB0aF9mbiwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksICJsaW5lIDIiKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgcmUuZXNjYXBlKG9zLnBhdGguam9pbihwdGhfZGlyLCBwdGhfZm4pKSkKKyAgICAgICAgIyBYWFg6IGRpdHRvIHByZXZpb3VzIFhYWCBjb21tZW50LgorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLCAnVHJhY2ViYWNrJykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwgJ0ltcG9ydEVycm9yJykKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICJ3aW4zMiIsICJXaW5kb3dzIGRvZXMgbm90IHJhaXNlIGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAiZXJyb3IgZm9yIGZpbGUgcGF0aHMgY29udGFpbmluZyBudWxsIGNoYXJhY3RlcnMiKQorICAgIGRlZiB0ZXN0X2FkZHBhY2thZ2VfaW1wb3J0X2JhZF9wdGhfZmlsZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA1MjU4CisgICAgICAgIHB0aF9kaXIsIHB0aF9mbiA9IHNlbGYubWFrZV9wdGgoImFiY1x4MDBkZWZcbiIpCisgICAgICAgIHdpdGggY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBlcnJfb3V0OgorICAgICAgICAgICAgc2l0ZS5hZGRwYWNrYWdlKHB0aF9kaXIsIHB0aF9mbiwgc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcyhlcnJfb3V0LmdldHZhbHVlKCksICJsaW5lIDEiKQorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgcmUuZXNjYXBlKG9zLnBhdGguam9pbihwdGhfZGlyLCBwdGhfZm4pKSkKKyAgICAgICAgIyBYWFg6IGRpdHRvIHByZXZpb3VzIFhYWCBjb21tZW50LgorICAgICAgICBzZWxmLmFzc2VydFJlZ2V4cE1hdGNoZXMoZXJyX291dC5nZXR2YWx1ZSgpLCAnVHJhY2ViYWNrJykKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKGVycl9vdXQuZ2V0dmFsdWUoKSwgJ1R5cGVFcnJvcicpCisKKyAgICBkZWYgdGVzdF9hZGRzaXRlZGlyKHNlbGYpOgorICAgICAgICAjIFNhbWUgdGVzdHMgZm9yIHRlc3RfYWRkcGFja2FnZSBzaW5jZSBhZGRzaXRlZGlyKCkgZXNzZW50aWFsbHkganVzdAorICAgICAgICAjIGNhbGxzIGFkZHBhY2thZ2UoKSBmb3IgZXZlcnkgLnB0aCBmaWxlIGluIHRoZSBkaXJlY3RvcnkKKyAgICAgICAgcHRoX2ZpbGUgPSBQdGhGaWxlKCkKKyAgICAgICAgcHRoX2ZpbGUuY2xlYW51cChwcmVwPVRydWUpICMgTWFrZSBzdXJlIHRoYXQgbm90aGluZyBpcyBwcmUtZXhpc3RpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhhdCBpcyB0ZXN0ZWQgZm9yCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHB0aF9maWxlLmNyZWF0ZSgpCisgICAgICAgICAgICBzaXRlLmFkZHNpdGVkaXIocHRoX2ZpbGUuYmFzZV9kaXIsIHNldCgpKQorICAgICAgICAgICAgc2VsZi5wdGhfZmlsZV90ZXN0cyhwdGhfZmlsZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHB0aF9maWxlLmNsZWFudXAoKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc2l0ZS5FTkFCTEVfVVNFUl9TSVRFLCAicmVxdWlyZXMgYWNjZXNzIHRvIFBFUCAzNzAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlci1zaXRlIChzaXRlLkVOQUJMRV9VU0VSX1NJVEUpIikKKyAgICBkZWYgdGVzdF9zX29wdGlvbihzZWxmKToKKyAgICAgICAgdXNlcnNpdGUgPSBzaXRlLlVTRVJfU0lURQorICAgICAgICBzZWxmLmFzc2VydEluKHVzZXJzaXRlLCBzeXMucGF0aCkKKworICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICctYycsCisgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLmV4aXQoJXIgaW4gc3lzLnBhdGgpJyAlIHVzZXJzaXRlXSwKKyAgICAgICAgICAgIGVudj1lbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDEsICIlciBpcyBub3QgaW4gc3lzLnBhdGggKHN5cy5leGl0IHJldHVybmVkICVyKSIKKyAgICAgICAgICAgICAgICAlICh1c2Vyc2l0ZSwgcmMpKQorCisgICAgICAgIGVudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgJy1zJywgJy1jJywKKyAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuZXhpdCglciBpbiBzeXMucGF0aCknICUgdXNlcnNpdGVdLAorICAgICAgICAgICAgZW52PWVudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMCkKKworICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBlbnZbIlBZVEhPTk5PVVNFUlNJVEUiXSA9ICIxIgorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICctYycsCisgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLmV4aXQoJXIgaW4gc3lzLnBhdGgpJyAlIHVzZXJzaXRlXSwKKyAgICAgICAgICAgIGVudj1lbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDApCisKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgZW52WyJQWVRIT05VU0VSQkFTRSJdID0gIi90bXAiCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgJy1jJywKKyAgICAgICAgICAgICdpbXBvcnQgc3lzLCBzaXRlOyBzeXMuZXhpdChzaXRlLlVTRVJfQkFTRS5zdGFydHN3aXRoKCIvdG1wIikpJ10sCisgICAgICAgICAgICBlbnY9ZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAxKQorCisgICAgZGVmIHRlc3RfZ2V0dXNlcmJhc2Uoc2VsZik6CisgICAgICAgIHNpdGUuVVNFUl9CQVNFID0gTm9uZQorICAgICAgICB1c2VyX2Jhc2UgPSBzaXRlLmdldHVzZXJiYXNlKCkKKworICAgICAgICAjIHRoZSBjYWxsIHNldHMgc2l0ZS5VU0VSX0JBU0UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXRlLlVTRVJfQkFTRSwgdXNlcl9iYXNlKQorCisgICAgICAgICMgbGV0J3Mgc2V0IFBZVEhPTlVTRVJCQVNFIGFuZCBzZWUgaWYgaXQgdXNlcyBpdAorICAgICAgICBzaXRlLlVTRVJfQkFTRSA9IE5vbmUKKyAgICAgICAgaW1wb3J0IHN5c2NvbmZpZworICAgICAgICBzeXNjb25maWcuX0NPTkZJR19WQVJTID0gTm9uZQorCisgICAgICAgIHdpdGggRW52aXJvbm1lbnRWYXJHdWFyZCgpIGFzIGVudmlyb246CisgICAgICAgICAgICBlbnZpcm9uWydQWVRIT05VU0VSQkFTRSddID0gJ3hveG8nCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l0ZS5nZXR1c2VyYmFzZSgpLnN0YXJ0c3dpdGgoJ3hveG8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXRlLmdldHVzZXJiYXNlKCkpCisKKyAgICBkZWYgdGVzdF9nZXR1c2Vyc2l0ZXBhY2thZ2VzKHNlbGYpOgorICAgICAgICBzaXRlLlVTRVJfU0lURSA9IE5vbmUKKyAgICAgICAgc2l0ZS5VU0VSX0JBU0UgPSBOb25lCisgICAgICAgIHVzZXJfc2l0ZSA9IHNpdGUuZ2V0dXNlcnNpdGVwYWNrYWdlcygpCisKKyAgICAgICAgIyB0aGUgY2FsbCBzZXRzIFVTRVJfQkFTRSAqYW5kKiBVU0VSX1NJVEUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXRlLlVTRVJfU0lURSwgdXNlcl9zaXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9zaXRlLnN0YXJ0c3dpdGgoc2l0ZS5VU0VSX0JBU0UpLCB1c2VyX3NpdGUpCisKKyAgICBkZWYgdGVzdF9nZXRzaXRlcGFja2FnZXMoc2VsZik6CisgICAgICAgIHNpdGUuUFJFRklYRVMgPSBbJ3hveG8nXQorICAgICAgICBkaXJzID0gc2l0ZS5nZXRzaXRlcGFja2FnZXMoKQorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ29zMmVteCcsICdyaXNjb3MnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRpcnMpLCAxKQorICAgICAgICAgICAgd2FudGVkID0gb3MucGF0aC5qb2luKCd4b3hvJywgJ0xpYicsICdzaXRlLXBhY2thZ2VzJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1swXSwgd2FudGVkKQorICAgICAgICBlbGlmIChzeXMucGxhdGZvcm0gPT0gImRhcndpbiIgYW5kCisgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoIlBZVEhPTkZSQU1FV09SSyIpKToKKyAgICAgICAgICAgICMgT1MgWCBmcmFtZXdvcmsgYnVpbGRzCisgICAgICAgICAgICBzaXRlLlBSRUZJWEVTID0gWydQeXRob24uZnJhbWV3b3JrJ10KKyAgICAgICAgICAgIGRpcnMgPSBzaXRlLmdldHNpdGVwYWNrYWdlcygpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMykKKyAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbignL0xpYnJhcnknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcigiUFlUSE9ORlJBTUVXT1JLIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnZlcnNpb25bOjNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyc1syXSwgd2FudGVkKQorICAgICAgICBlbGlmIG9zLnNlcCA9PSAnLyc6CisgICAgICAgICAgICAjIE9TIFggbm9uLWZyYW13ZXdvcmsgYnVpbGRzLCBMaW51eCwgRnJlZUJTRCwgZXRjCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkaXJzKSwgMikKKyAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbigneG94bycsICdsaWInLCAncHl0aG9uJyArIHN5cy52ZXJzaW9uWzozXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2l0ZS1wYWNrYWdlcycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMF0sIHdhbnRlZCkKKyAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbigneG94bycsICdsaWInLCAnc2l0ZS1weXRob24nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXJzWzFdLCB3YW50ZWQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG90aGVyIHBsYXRmb3JtcworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZGlycyksIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMF0sICd4b3hvJykKKyAgICAgICAgICAgIHdhbnRlZCA9IG9zLnBhdGguam9pbigneG94bycsICdsaWInLCAnc2l0ZS1wYWNrYWdlcycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcnNbMV0sIHdhbnRlZCkKKworY2xhc3MgUHRoRmlsZShvYmplY3QpOgorICAgICIiIkhlbHBlciBjbGFzcyBmb3IgaGFuZGxpbmcgdGVzdGluZyBvZiAucHRoIGZpbGVzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWVfYmFzZT1URVNURk4sIGltcG9ydGVkPSJ0aW1lIiwKKyAgICAgICAgICAgICAgICAgICAgZ29vZF9kaXJuYW1lPSJfX3Rlc3RkaXJfXyIsIGJhZF9kaXJuYW1lPSJfX2JhZCIpOgorICAgICAgICAiIiJJbml0aWFsaXplIGluc3RhbmNlIHZhcmlhYmxlcyIiIgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWVfYmFzZSArICIucHRoIgorICAgICAgICBzZWxmLmJhc2VfZGlyID0gb3MucGF0aC5hYnNwYXRoKCcnKQorICAgICAgICBzZWxmLmZpbGVfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmJhc2VfZGlyLCBzZWxmLmZpbGVuYW1lKQorICAgICAgICBzZWxmLmltcG9ydGVkID0gaW1wb3J0ZWQKKyAgICAgICAgc2VsZi5nb29kX2Rpcm5hbWUgPSBnb29kX2Rpcm5hbWUKKyAgICAgICAgc2VsZi5iYWRfZGlybmFtZSA9IGJhZF9kaXJuYW1lCisgICAgICAgIHNlbGYuZ29vZF9kaXJfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLmJhc2VfZGlyLCBzZWxmLmdvb2RfZGlybmFtZSkKKyAgICAgICAgc2VsZi5iYWRfZGlyX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlX2Rpciwgc2VsZi5iYWRfZGlybmFtZSkKKworICAgIGRlZiBjcmVhdGUoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBhIC5wdGggZmlsZSB3aXRoIGEgY29tbWVudCwgYmxhbmsgbGluZXMsIGFuIGBgaW1wb3J0CisgICAgICAgIDxzZWxmLmltcG9ydGVkPmBgLCBhIGxpbmUgd2l0aCBzZWxmLmdvb2RfZGlybmFtZSwgYW5kIGEgbGluZSB3aXRoCisgICAgICAgIHNlbGYuYmFkX2Rpcm5hbWUuCisKKyAgICAgICAgQ3JlYXRpb24gb2YgdGhlIGRpcmVjdG9yeSBmb3Igc2VsZi5nb29kX2Rpcl9wYXRoIChiYXNlZCBvZmYgb2YKKyAgICAgICAgc2VsZi5nb29kX2Rpcm5hbWUpIGlzIGFsc28gcGVyZm9ybWVkLgorCisgICAgICAgIE1ha2Ugc3VyZSB0byBjYWxsIHNlbGYuY2xlYW51cCgpIHRvIHVuZG8gYW55dGhpbmcgZG9uZSBieSB0aGlzIG1ldGhvZC4KKworICAgICAgICAiIiIKKyAgICAgICAgRklMRSA9IG9wZW4oc2VsZi5maWxlX3BhdGgsICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcHJpbnQ+PkZJTEUsICIjaW1wb3J0IEBiYWQgbW9kdWxlIG5hbWUiCisgICAgICAgICAgICBwcmludD4+RklMRSwgIlxuIgorICAgICAgICAgICAgcHJpbnQ+PkZJTEUsICJpbXBvcnQgJXMiICUgc2VsZi5pbXBvcnRlZAorICAgICAgICAgICAgcHJpbnQ+PkZJTEUsIHNlbGYuZ29vZF9kaXJuYW1lCisgICAgICAgICAgICBwcmludD4+RklMRSwgc2VsZi5iYWRfZGlybmFtZQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRklMRS5jbG9zZSgpCisgICAgICAgIG9zLm1rZGlyKHNlbGYuZ29vZF9kaXJfcGF0aCkKKworICAgIGRlZiBjbGVhbnVwKHNlbGYsIHByZXA9RmFsc2UpOgorICAgICAgICAiIiJNYWtlIHN1cmUgdGhhdCB0aGUgLnB0aCBmaWxlIGlzIGRlbGV0ZWQsIHNlbGYuaW1wb3J0ZWQgaXMgbm90IGluCisgICAgICAgIHN5cy5tb2R1bGVzLCBhbmQgdGhhdCBib3RoIHNlbGYuZ29vZF9kaXJuYW1lIGFuZCBzZWxmLmJhZF9kaXJuYW1lIGFyZQorICAgICAgICBub3QgZXhpc3RpbmcgZGlyZWN0b3JpZXMuIiIiCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZV9wYXRoKToKKyAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLmZpbGVfcGF0aCkKKyAgICAgICAgaWYgcHJlcDoKKyAgICAgICAgICAgIHNlbGYuaW1wb3J0ZWRfbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KHNlbGYuaW1wb3J0ZWQpCisgICAgICAgICAgICBpZiBzZWxmLmltcG9ydGVkX21vZHVsZToKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbc2VsZi5pbXBvcnRlZF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuaW1wb3J0ZWRfbW9kdWxlOgorICAgICAgICAgICAgICAgIHN5cy5tb2R1bGVzW3NlbGYuaW1wb3J0ZWRdID0gc2VsZi5pbXBvcnRlZF9tb2R1bGUKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5nb29kX2Rpcl9wYXRoKToKKyAgICAgICAgICAgIG9zLnJtZGlyKHNlbGYuZ29vZF9kaXJfcGF0aCkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2VsZi5iYWRfZGlyX3BhdGgpOgorICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5iYWRfZGlyX3BhdGgpCisKK2NsYXNzIEltcG9ydFNpZGVFZmZlY3RUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBzaWRlLWVmZmVjdHMgZnJvbSBpbXBvcnRpbmcgJ3NpdGUnLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJNYWtlIGEgY29weSBvZiBzeXMucGF0aCIiIgorICAgICAgICBzZWxmLnN5c19wYXRoID0gc3lzLnBhdGhbOl0KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIiIiUmVzdG9yZSBzeXMucGF0aCIiIgorICAgICAgICBzeXMucGF0aFs6XSA9IHNlbGYuc3lzX3BhdGgKKworICAgIGRlZiB0ZXN0X2Fic19fZmlsZV9fKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBhbGwgaW1wb3J0ZWQgbW9kdWxlcyBoYXZlIHRoZWlyIF9fZmlsZV9fIGF0dHJpYnV0ZQorICAgICAgICAjIGFzIGFuIGFic29sdXRlIHBhdGguCisgICAgICAgICMgSGFuZGxlZCBieSBhYnNfX2ZpbGVfXygpCisgICAgICAgIHNpdGUuYWJzX19maWxlX18oKQorICAgICAgICBmb3IgbW9kdWxlIGluIChzeXMsIG9zLCBfX2J1aWx0aW5fXyk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNhYnMobW9kdWxlLl9fZmlsZV9fKSwgcmVwcihtb2R1bGUpKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICMgV2UgY291bGQgdHJ5IGV2ZXJ5dGhpbmcgaW4gc3lzLm1vZHVsZXM7IGhvd2V2ZXIsIHdoZW4gcmVncnRlc3QucHkKKyAgICAgICAgIyBydW5zIHNvbWV0aGluZyBsaWtlIHRlc3RfZnJvemVuIGJlZm9yZSB0ZXN0X3NpdGUsIHRoZW4gd2Ugd2lsbAorICAgICAgICAjIGJlIHRlc3RpbmcgdGhpbmdzIGxvYWRlZCAqYWZ0ZXIqIHRlc3Rfc2l0ZSBkaWQgcGF0aCBub3JtYWxpemF0aW9uCisKKyAgICBkZWYgdGVzdF9ub19kdXBsaWNhdGVfcGF0aHMoc2VsZik6CisgICAgICAgICMgTm8gZHVwbGljYXRlIHBhdGhzIHNob3VsZCBleGlzdCBpbiBzeXMucGF0aAorICAgICAgICAjIEhhbmRsZWQgYnkgcmVtb3ZlZHVwcGF0aHMoKQorICAgICAgICBzaXRlLnJlbW92ZWR1cHBhdGhzKCkKKyAgICAgICAgc2Vlbl9wYXRocyA9IHNldCgpCisgICAgICAgIGZvciBwYXRoIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihwYXRoLCBzZWVuX3BhdGhzKQorICAgICAgICAgICAgc2Vlbl9wYXRocy5hZGQocGF0aCkKKworICAgIGRlZiB0ZXN0X2FkZF9idWlsZF9kaXIoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBidWlsZCBkaXJlY3RvcnkncyBNb2R1bGVzIGRpcmVjdG9yeSBpcyB1c2VkIHdoZW4gaXQKKyAgICAgICAgIyBzaG91bGQgYmUuCisgICAgICAgICMgWFhYOiBpbXBsZW1lbnQKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc2V0dGluZ19xdWl0KHNlbGYpOgorICAgICAgICAjICdxdWl0JyBhbmQgJ2V4aXQnIHNob3VsZCBiZSBpbmplY3RlZCBpbnRvIF9fYnVpbHRpbl9fCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAicXVpdCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihfX2J1aWx0aW5fXywgImV4aXQiKSkKKworICAgIGRlZiB0ZXN0X3NldHRpbmdfY29weXJpZ2h0KHNlbGYpOgorICAgICAgICAjICdjb3B5cmlnaHQnIGFuZCAnY3JlZGl0cycgc2hvdWxkIGJlIGluIF9fYnVpbHRpbl9fCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAiY29weXJpZ2h0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAiY3JlZGl0cyIpKQorCisgICAgZGVmIHRlc3Rfc2V0dGluZ19oZWxwKHNlbGYpOgorICAgICAgICAjICdoZWxwJyBzaG91bGQgYmUgc2V0IGluIF9fYnVpbHRpbl9fCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAiaGVscCIpKQorCisgICAgZGVmIHRlc3RfYWxpYXNpbmdfbWJjcyhzZWxmKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICBpbXBvcnQgbG9jYWxlCisgICAgICAgICAgICBpZiBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpWzFdLnN0YXJ0c3dpdGgoJ2NwJyk6CisgICAgICAgICAgICAgICAgZm9yIHZhbHVlIGluIGVuY29kaW5ncy5hbGlhc2VzLmFsaWFzZXMuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICBpZiB2YWx1ZSA9PSAibWJjcyI6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZGlkIG5vdCBhbGlhcyBtYmNzIikKKworICAgIGRlZiB0ZXN0X3NldGRlZmF1bHRlbmNvZGluZ19yZW1vdmVkKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBzeXMuc2V0ZGVmYXVsdGVuY29kaW5nIGlzIGdvbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKHN5cywgInNldGRlZmF1bHRlbmNvZGluZyIpKQorCisgICAgZGVmIHRlc3Rfc2l0ZWN1c3RvbWl6ZV9leGVjdXRlZChzZWxmKToKKyAgICAgICAgIyBJZiBzaXRlY3VzdG9taXplIGlzIGF2YWlsYWJsZSwgaXQgc2hvdWxkIGhhdmUgYmVlbiBpbXBvcnRlZC4KKyAgICAgICAgaWYgInNpdGVjdXN0b21pemUiIG5vdCBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgc2l0ZWN1c3RvbWl6ZQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzaXRlY3VzdG9taXplIG5vdCBpbXBvcnRlZCBhdXRvbWF0aWNhbGx5IikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChIZWxwZXJGdW5jdGlvbnNUZXN0cywgSW1wb3J0U2lkZUVmZmVjdFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaXRlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NmNiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaXRlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NmNiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zaXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbGljZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMDRkNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbGljZS5weQpAQCAtMCwwICsxLDEzNCBAQAorIyB0ZXN0cyBmb3Igc2xpY2Ugb2JqZWN0czsgaW4gcGFydGljdWxhciB0aGUgaW5kaWNlcyBtZXRob2QuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gY1BpY2tsZSBpbXBvcnQgbG9hZHMsIGR1bXBzCisKK2ltcG9ydCBzeXMKKworY2xhc3MgU2xpY2VUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNsaWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNsaWNlLCAxLCAyLCAzLCA0KQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHNsaWNlKDEsIDIsIDMpKSwgInNsaWNlKDEsIDIsIDMpIikKKworICAgIGRlZiB0ZXN0X2hhc2goc2VsZik6CisgICAgICAgICMgVmVyaWZ5IGNsZWFyaW5nIG9mIFNGIGJ1ZyAjODAwNzk2CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2xpY2UoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2UoNSkuX19oYXNoX18pCisKKyAgICBkZWYgdGVzdF9jbXAoc2VsZik6CisgICAgICAgIHMxID0gc2xpY2UoMSwgMiwgMykKKyAgICAgICAgczIgPSBzbGljZSgxLCAyLCAzKQorICAgICAgICBzMyA9IHNsaWNlKDEsIDIsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMyKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHMxLCBzMykKKworICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBCYWRDbXAob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YworICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKKworICAgICAgICBzMSA9IHNsaWNlKEJhZENtcCgpKQorICAgICAgICBzMiA9IHNsaWNlKEJhZENtcCgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIGNtcCwgczEsIHMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMSkKKworICAgICAgICBzMSA9IHNsaWNlKDEsIEJhZENtcCgpKQorICAgICAgICBzMiA9IHNsaWNlKDEsIEJhZENtcCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBjbXAsIHMxLCBzMikKKworICAgICAgICBzMSA9IHNsaWNlKDEsIDIsIEJhZENtcCgpKQorICAgICAgICBzMiA9IHNsaWNlKDEsIDIsIEJhZENtcCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCBjbXAsIHMxLCBzMikKKworICAgIGRlZiB0ZXN0X21lbWJlcnMoc2VsZik6CisgICAgICAgIHMgPSBzbGljZSgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RhcnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdG9wLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RlcCwgTm9uZSkKKworICAgICAgICBzID0gc2xpY2UoMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0YXJ0LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RvcCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0ZXAsIE5vbmUpCisKKyAgICAgICAgcyA9IHNsaWNlKDEsIDIsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdGFydCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnN0b3AsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zdGVwLCAzKQorCisgICAgICAgIGNsYXNzIEFueUNsYXNzOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG9iaiA9IEFueUNsYXNzKCkKKyAgICAgICAgcyA9IHNsaWNlKG9iaikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RvcCBpcyBvYmopCisKKyAgICBkZWYgdGVzdF9pbmRpY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUgICAgICAgICAgICkuaW5kaWNlcygxMCksICgwLCAxMCwgIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsICBOb25lLCAgMikuaW5kaWNlcygxMCksICgwLCAxMCwgIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKDEsICAgICBOb25lLCAgMikuaW5kaWNlcygxMCksICgxLCAxMCwgIDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsICBOb25lLCAtMSkuaW5kaWNlcygxMCksICg5LCAtMSwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsICBOb25lLCAtMikuaW5kaWNlcygxMCksICg5LCAtMSwgLTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKDMsICAgICBOb25lLCAtMikuaW5kaWNlcygxMCksICgzLCAtMSwgLTIpKQorICAgICAgICAjIGlzc3VlIDMwMDQgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCAtOSkuaW5kaWNlcygxMCksICgwLCAxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCAtMTApLmluZGljZXMoMTApLCAoMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgLTExKS5pbmRpY2VzKDEwKSwgKDAsIDAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIC0xMCwgLTEpLmluZGljZXMoMTApLCAoOSwgMCwgLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIC0xMSwgLTEpLmluZGljZXMoMTApLCAoOSwgLTEsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCAtMTIsIC0xKS5pbmRpY2VzKDEwKSwgKDksIC0xLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgOSkuaW5kaWNlcygxMCksICgwLCA5LCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCAxMCkuaW5kaWNlcygxMCksICgwLCAxMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgMTEpLmluZGljZXMoMTApLCAoMCwgMTAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKE5vbmUsIDgsIC0xKS5pbmRpY2VzKDEwKSwgKDksIDgsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lLCA5LCAtMSkuaW5kaWNlcygxMCksICg5LCA5LCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2xpY2UoTm9uZSwgMTAsIC0xKS5pbmRpY2VzKDEwKSwgKDksIDksIC0xKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgc2xpY2UoLTEwMCwgIDEwMCAgICAgKS5pbmRpY2VzKDEwKSwKKyAgICAgICAgICAgIHNsaWNlKE5vbmUpLmluZGljZXMoMTApCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNsaWNlKDEwMCwgIC0xMDAsICAtMSkuaW5kaWNlcygxMCksCisgICAgICAgICAgICBzbGljZShOb25lLCBOb25lLCAtMSkuaW5kaWNlcygxMCkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNsaWNlKC0xMDBMLCAxMDBMLCAyTCkuaW5kaWNlcygxMCksICgwLCAxMCwgIDIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmFuZ2UoMTApWzo6c3lzLm1heGludCAtIDFdLCBbMF0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc2xpY2UoTm9uZSkuaW5kaWNlcywgMUw8PDEwMCkKKworICAgIGRlZiB0ZXN0X3NldHNsaWNlX3dpdGhvdXRfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgIHRtcCA9IFtdCisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgaSwgaiwgayk6CisgICAgICAgICAgICAgICAgdG1wLmFwcGVuZCgoaSwgaiwgaykpCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB4WzE6Ml0gPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRtcCwgWygxLCAyLCA0MildKQorCisgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgorICAgICAgICBzID0gc2xpY2UoMTAsIDIwLCAzKQorICAgICAgICBmb3IgcHJvdG9jb2wgaW4gKDAsMSwyKToKKyAgICAgICAgICAgIHQgPSBsb2FkcyhkdW1wcyhzLCBwcm90b2NvbCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuaW5kaWNlcygxNSksIHQuaW5kaWNlcygxNSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKHMpLCBpZCh0KSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU2xpY2VUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbGljZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbGljZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmOWM3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbGljZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbGljZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmOWM3MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NsaWNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgwNmM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weQpAQCAtMCwwICsxLDUxNyBAQAoraW1wb3J0IGFzeW5jb3JlCitpbXBvcnQgZW1haWwudXRpbHMKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzbXRwZAoraW1wb3J0IHNtdHBsaWIKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK2ltcG9ydCBzZWxlY3QKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZGluZyA9IE5vbmUKKworSE9TVCA9IHRlc3Rfc3VwcG9ydC5IT1NUCisKK2RlZiBzZXJ2ZXIoZXZ0LCBidWYsIHNlcnYpOgorICAgIHNlcnYubGlzdGVuKDUpCisgICAgZXZ0LnNldCgpCisgICAgdHJ5OgorICAgICAgICBjb25uLCBhZGRyID0gc2Vydi5hY2NlcHQoKQorICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIG4gPSA1MDAKKyAgICAgICAgd2hpbGUgYnVmIGFuZCBuID4gMDoKKyAgICAgICAgICAgIHIsIHcsIGUgPSBzZWxlY3Quc2VsZWN0KFtdLCBbY29ubl0sIFtdKQorICAgICAgICAgICAgaWYgdzoKKyAgICAgICAgICAgICAgICBzZW50ID0gY29ubi5zZW5kKGJ1ZikKKyAgICAgICAgICAgICAgICBidWYgPSBidWZbc2VudDpdCisKKyAgICAgICAgICAgIG4gLT0gMQorCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgIGZpbmFsbHk6CisgICAgICAgIHNlcnYuY2xvc2UoKQorICAgICAgICBldnQuc2V0KCkKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEdlbmVyYWxUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX3RocmVhZHMgPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDE1KQorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICAgICAgc2VydmFyZ3MgPSAoc2VsZi5ldnQsICIyMjAgSG9sYSBtdW5kb1xuIiwgc2VsZi5zb2NrKQorICAgICAgICBzZWxmLnRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlciwgYXJncz1zZXJ2YXJncykKKyAgICAgICAgc2VsZi50aHJlYWQuc3RhcnQoKQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgc2VsZi5ldnQuY2xlYXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgc2VsZi50aHJlYWQuam9pbigpCisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKworICAgIGRlZiB0ZXN0QmFzaWMxKHNlbGYpOgorICAgICAgICAjIGNvbm5lY3RzCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzbXRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0QmFzaWMyKHNlbGYpOgorICAgICAgICAjIGNvbm5lY3RzLCBpbmNsdWRlIHBvcnQgaW4gaG9zdCBuYW1lCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoIiVzOiVzIiAlIChIT1NULCBzZWxmLnBvcnQpKQorICAgICAgICBzbXRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0TG9jYWxIb3N0TmFtZShzZWxmKToKKyAgICAgICAgIyBjaGVjayB0aGF0IHN1cHBsaWVkIGxvY2FsX2hvc3RuYW1lIGlzIHVzZWQKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSJ0ZXN0aG9zdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5sb2NhbF9ob3N0bmFtZSwgInRlc3Rob3N0IikKKyAgICAgICAgc210cC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAuc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICBzbXRwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dE5vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCB0aW1lb3V0PU5vbmUpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNtdHAuc29jay5nZXR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc210cC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXRWYWx1ZShzZWxmKToKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIHRpbWVvdXQ9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHNtdHAuY2xvc2UoKQorCisKKyMgVGVzdCBzZXJ2ZXIgdGhyZWFkIHVzaW5nIHRoZSBzcGVjaWZpZWQgU01UUCBzZXJ2ZXIgY2xhc3MKK2RlZiBkZWJ1Z2dpbmdfc2VydmVyKHNlcnYsIHNlcnZfZXZ0LCBjbGllbnRfZXZ0KToKKyAgICBzZXJ2X2V2dC5zZXQoKQorCisgICAgdHJ5OgorICAgICAgICBpZiBoYXNhdHRyKHNlbGVjdCwgJ3BvbGwnKToKKyAgICAgICAgICAgIHBvbGxfZnVuID0gYXN5bmNvcmUucG9sbDIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBvbGxfZnVuID0gYXN5bmNvcmUucG9sbAorCisgICAgICAgIG4gPSAxMDAwCisgICAgICAgIHdoaWxlIGFzeW5jb3JlLnNvY2tldF9tYXAgYW5kIG4gPiAwOgorICAgICAgICAgICAgcG9sbF9mdW4oMC4wMSwgYXN5bmNvcmUuc29ja2V0X21hcCkKKworICAgICAgICAgICAgIyB3aGVuIHRoZSBjbGllbnQgY29udmVyc2F0aW9uIGlzIGZpbmlzaGVkLCBpdCB3aWxsCisgICAgICAgICAgICAjIHNldCBjbGllbnRfZXZ0LCBhbmQgaXQncyB0aGVuIG9rIHRvIGtpbGwgdGhlIHNlcnZlcgorICAgICAgICAgICAgaWYgY2xpZW50X2V2dC5pc19zZXQoKToKKyAgICAgICAgICAgICAgICBzZXJ2LmNsb3NlKCkKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBuIC09IDEKKworICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIGlmIG5vdCBjbGllbnRfZXZ0LmlzX3NldCgpOgorICAgICAgICAgICAgIyBhbGxvdyBzb21lIHRpbWUgZm9yIHRoZSBjbGllbnQgdG8gcmVhZCB0aGUgcmVzdWx0CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuNSkKKyAgICAgICAgICAgIHNlcnYuY2xvc2UoKQorICAgICAgICBhc3luY29yZS5jbG9zZV9hbGwoKQorICAgICAgICBzZXJ2X2V2dC5zZXQoKQorCitNU0dfQkVHSU4gPSAnLS0tLS0tLS0tLSBNRVNTQUdFIEZPTExPV1MgLS0tLS0tLS0tLVxuJworTVNHX0VORCA9ICctLS0tLS0tLS0tLS0gRU5EIE1FU1NBR0UgLS0tLS0tLS0tLS0tXG4nCisKKyMgTk9URTogU29tZSBTTVRQIG9iamVjdHMgaW4gdGhlIHRlc3RzIGJlbG93IGFyZSBjcmVhdGVkIHdpdGggYSBub24tZGVmYXVsdAorIyBsb2NhbF9ob3N0bmFtZSBhcmd1bWVudCB0byB0aGUgY29uc3RydWN0b3IsIHNpbmNlIChvbiBzb21lIHN5c3RlbXMpIHRoZSBGUUROCisjIGxvb2t1cCBjYXVzZWQgYnkgdGhlIGRlZmF1bHQgbG9jYWxfaG9zdG5hbWUgc29tZXRpbWVzIHRha2VzIHNvIGxvbmcgdGhhdCB0aGUKKyMgdGVzdCBzZXJ2ZXIgdGltZXMgb3V0LCBjYXVzaW5nIHRoZSB0ZXN0IHRvIGZhaWwuCisKKyMgVGVzdCBiZWhhdmlvciBvZiBzbXRwZC5EZWJ1Z2dpbmdTZXJ2ZXIKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBEZWJ1Z2dpbmdTZXJ2ZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgdGVtcG9yYXJpbHkgcmVwbGFjZSBzeXMuc3Rkb3V0IHRvIGNhcHR1cmUgRGVidWdnaW5nU2VydmVyIG91dHB1dAorICAgICAgICBzZWxmLm9sZF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYub3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5vdXRwdXQKKworICAgICAgICBzZWxmLl90aHJlYWRzID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCisgICAgICAgIHNlbGYuc2Vydl9ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLmNsaWVudF9ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAjIFBpY2sgYSByYW5kb20gdW51c2VkIHBvcnQgYnkgcGFzc2luZyAwIGZvciB0aGUgcG9ydCBudW1iZXIKKyAgICAgICAgc2VsZi5zZXJ2ID0gc210cGQuRGVidWdnaW5nU2VydmVyKChIT1NULCAwKSwgKCdub3doZXJlJywgLTEpKQorICAgICAgICAjIEtlZXAgYSBub3RlIG9mIHdoYXQgcG9ydCB3YXMgYXNzaWduZWQKKyAgICAgICAgc2VsZi5wb3J0ID0gc2VsZi5zZXJ2LnNvY2tldC5nZXRzb2NrbmFtZSgpWzFdCisgICAgICAgIHNlcnZfYXJncyA9IChzZWxmLnNlcnYsIHNlbGYuc2Vydl9ldnQsIHNlbGYuY2xpZW50X2V2dCkKKyAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1kZWJ1Z2dpbmdfc2VydmVyLCBhcmdzPXNlcnZfYXJncykKKyAgICAgICAgc2VsZi50aHJlYWQuc3RhcnQoKQorCisgICAgICAgICMgd2FpdCB1bnRpbCBzZXJ2ZXIgdGhyZWFkIGhhcyBhc3NpZ25lZCBhIHBvcnQgbnVtYmVyCisgICAgICAgIHNlbGYuc2Vydl9ldnQud2FpdCgpCisgICAgICAgIHNlbGYuc2Vydl9ldnQuY2xlYXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIGluZGljYXRlIHRoYXQgdGhlIGNsaWVudCBpcyBmaW5pc2hlZAorICAgICAgICBzZWxmLmNsaWVudF9ldnQuc2V0KCkKKyAgICAgICAgIyB3YWl0IGZvciB0aGUgc2VydmVyIHRocmVhZCB0byB0ZXJtaW5hdGUKKyAgICAgICAgc2VsZi5zZXJ2X2V2dC53YWl0KCkKKyAgICAgICAgc2VsZi50aHJlYWQuam9pbigpCisgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqc2VsZi5fdGhyZWFkcykKKyAgICAgICAgIyByZXN0b3JlIHN5cy5zdGRvdXQKKyAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYub2xkX3N0ZG91dAorCisgICAgZGVmIHRlc3RCYXNpYyhzZWxmKToKKyAgICAgICAgIyBjb25uZWN0CisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0zKQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgZGVmIHRlc3ROT09QKHNlbGYpOgorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MykKKyAgICAgICAgZXhwZWN0ZWQgPSAoMjUwLCAnT2snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAubm9vcCgpLCBleHBlY3RlZCkKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgIGRlZiB0ZXN0UlNFVChzZWxmKToKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTMpCisgICAgICAgIGV4cGVjdGVkID0gKDI1MCwgJ09rJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLnJzZXQoKSwgZXhwZWN0ZWQpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdE5vdEltcGxlbWVudGVkKHNlbGYpOgorICAgICAgICAjIEVITE8gaXNuJ3QgaW1wbGVtZW50ZWQgaW4gRGVidWdnaW5nU2VydmVyCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0zKQorICAgICAgICBleHBlY3RlZCA9ICg1MDIsICdFcnJvcjogY29tbWFuZCAiRUhMTyIgbm90IGltcGxlbWVudGVkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLmVobG8oKSwgZXhwZWN0ZWQpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdFZSRlkoc2VsZik6CisgICAgICAgICMgVlJGWSBpc24ndCBpbXBsZW1lbnRlZCBpbiBEZWJ1Z2dpbmdTZXJ2ZXIKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTMpCisgICAgICAgIGV4cGVjdGVkID0gKDUwMiwgJ0Vycm9yOiBjb21tYW5kICJWUkZZIiBub3QgaW1wbGVtZW50ZWQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAudnJmeSgnbm9ib2R5QG5vd2hlcmUuY29tJyksIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAudmVyaWZ5KCdub2JvZHlAbm93aGVyZS5jb20nKSwgZXhwZWN0ZWQpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdFNlY29uZEhFTE8oc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBhIHNlY29uZCBIRUxPIHJldHVybnMgYSBtZXNzYWdlIHRoYXQgaXQncyBhIGR1cGxpY2F0ZQorICAgICAgICAjICh0aGlzIGJlaGF2aW9yIGlzIHNwZWNpZmljIHRvIHNtdHBkLlNNVFBDaGFubmVsKQorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MykKKyAgICAgICAgc210cC5oZWxvKCkKKyAgICAgICAgZXhwZWN0ZWQgPSAoNTAzLCAnRHVwbGljYXRlIEhFTE8vRUhMTycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC5oZWxvKCksIGV4cGVjdGVkKQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgZGVmIHRlc3RIRUxQKHNlbGYpOgorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLmhlbHAoKSwgJ0Vycm9yOiBjb21tYW5kICJIRUxQIiBub3QgaW1wbGVtZW50ZWQnKQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgZGVmIHRlc3RTZW5kKHNlbGYpOgorICAgICAgICAjIGNvbm5lY3QgYW5kIHNlbmQgbWFpbAorICAgICAgICBtID0gJ0EgdGVzdCBtZXNzYWdlJworICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MykKKyAgICAgICAgc210cC5zZW5kbWFpbCgnSm9obicsICdTYWxseScsIG0pCisgICAgICAgICMgWFhYKG5ub3J3aXR6KTogdGhpcyB0ZXN0IGlzIGZsYWt5IGFuZCBkaWVzIHdpdGggYSBiYWQgZmlsZSBkZXNjcmlwdG9yCisgICAgICAgICMgaW4gYXN5bmNvcmUuICBUaGlzIHNsZWVwIG1pZ2h0IGhlbHAsIGJ1dCBzaG91bGQgcmVhbGx5IGJlIGZpeGVkCisgICAgICAgICMgcHJvcGVybHkgYnkgdXNpbmcgYW4gRXZlbnQgdmFyaWFibGUuCisgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgICAgICBzZWxmLmNsaWVudF9ldnQuc2V0KCkKKyAgICAgICAgc2VsZi5zZXJ2X2V2dC53YWl0KCkKKyAgICAgICAgc2VsZi5vdXRwdXQuZmx1c2goKQorICAgICAgICBtZXhwZWN0ID0gJyVzJXNcbiVzJyAlIChNU0dfQkVHSU4sIG0sIE1TR19FTkQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5vdXRwdXQuZ2V0dmFsdWUoKSwgbWV4cGVjdCkKKworCitjbGFzcyBOb25Db25uZWN0aW5nVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3ROb3RDb25uZWN0ZWQoc2VsZik6CisgICAgICAgICMgVGVzdCB2YXJpb3VzIG9wZXJhdGlvbnMgb24gYW4gdW5jb25uZWN0ZWQgU01UUCBvYmplY3QgdGhhdAorICAgICAgICAjIHNob3VsZCByYWlzZSBleGNlcHRpb25zIChhdCBwcmVzZW50IHRoZSBhdHRlbXB0IGluIFNNVFAuc2VuZAorICAgICAgICAjIHRvIHJlZmVyZW5jZSB0aGUgbm9uZXhpc3RlbnQgJ3NvY2snIGF0dHJpYnV0ZSBvZiB0aGUgU01UUCBvYmplY3QKKyAgICAgICAgIyBjYXVzZXMgYW4gQXR0cmlidXRlRXJyb3IpCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzbXRwbGliLlNNVFBTZXJ2ZXJEaXNjb25uZWN0ZWQsIHNtdHAuZWhsbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc210cGxpYi5TTVRQU2VydmVyRGlzY29ubmVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzbXRwLnNlbmQsICd0ZXN0IG1zZycpCisKKyAgICBkZWYgdGVzdE5vbm51bWVyaWNQb3J0KHNlbGYpOgorICAgICAgICAjIGNoZWNrIHRoYXQgbm9uLW51bWVyaWMgcG9ydCByYWlzZXMgc29ja2V0LmVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc210cGxpYi5TTVRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxob3N0IiwgImJvZ3VzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzbXRwbGliLlNNVFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbGhvc3Q6Ym9ndXMiKQorCisKKyMgdGVzdCByZXNwb25zZSBvZiBjbGllbnQgdG8gYSBub24tc3VjY2Vzc2Z1bCBIRUxPIG1lc3NhZ2UKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBCYWRIRUxPU2VydmVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9sZF9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYub3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5vdXRwdXQKKworICAgICAgICBzZWxmLl90aHJlYWRzID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCisgICAgICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgxNSkKKyAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCisgICAgICAgIHNlcnZhcmdzID0gKHNlbGYuZXZ0LCAiMTk5IG5vIGhlbGxvIGZvciB5b3UhXG4iLCBzZWxmLnNvY2spCisgICAgICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLCBhcmdzPXNlcnZhcmdzKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBzZWxmLmV2dC5jbGVhcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICBzZWxmLnRocmVhZC5qb2luKCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCpzZWxmLl90aHJlYWRzKQorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5vbGRfc3Rkb3V0CisKKyAgICBkZWYgdGVzdEZhaWxpbmdIRUxPKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzbXRwbGliLlNNVFBDb25uZWN0RXJyb3IsIHNtdHBsaWIuU01UUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1NULCBzZWxmLnBvcnQsICdsb2NhbGhvc3QnLCAzKQorCisKK3NpbV91c2VycyA9IHsnTXIuQUBzb21ld2hlcmUuY29tJzonSm9obiBBJywKKyAgICAgICAgICAgICAnTXMuQkBzb21ld2hlcmUuY29tJzonU2FsbHkgQicsCisgICAgICAgICAgICAgJ01ycy5DQHNvbWV3aGVyZWVzbGUuY29tJzonUnV0aCBDJywKKyAgICAgICAgICAgIH0KKworc2ltX2F1dGggPSAoJ01yLkFAc29tZXdoZXJlLmNvbScsICdzb21lcGFzc3dvcmQnKQorc2ltX2NyYW1fbWQ1X2NoYWxsZW5nZSA9ICgnUEVOQ2VVeEZSRUpvVTBObmJtaE5XaXRPTWpOR05uJworICAgICAgICAgICAgICAgICAgICAgICAgICAnZEFaV3gzYjI5a0xtbHVibTl6YjJaMExtTnZiVDQ9JykKK3NpbV9hdXRoX2NyZWRlbnRpYWxzID0geworICAgICdsb2dpbic6ICdUWEl1UVVCemIyMWxkMmhsY21VdVkyOXQnLAorICAgICdwbGFpbic6ICdBRTF5TGtGQWMyOXRaWGRvWlhKbExtTnZiUUJ6YjIxbGNHRnpjM2R2Y21RPScsCisgICAgJ2NyYW0tbWQ1JzogKCdUWElVUVVCWkIyMUxEMkhMQ01VVVkyOVRJREc0T1dRME1KJworICAgICAgICAgICAgICAgICAnS1daR1E0T0ROTU5EQTROVEdYTURSTFpXTVlaSkRNT0RHMScpLAorICAgIH0KK3NpbV9hdXRoX2xvZ2luX3Bhc3N3b3JkID0gJ0MyOVRaWEJIQzNOM0IzSksnCisKK3NpbV9saXN0cyA9IHsnbGlzdC0xJzpbJ01yLkFAc29tZXdoZXJlLmNvbScsJ01ycy5DQHNvbWV3aGVyZWVzbGUuY29tJ10sCisgICAgICAgICAgICAgJ2xpc3QtMic6WydNcy5CQHNvbWV3aGVyZS5jb20nLF0sCisgICAgICAgICAgICB9CisKKyMgU2ltdWxhdGVkIFNNVFAgY2hhbm5lbCAmIHNlcnZlcgorY2xhc3MgU2ltU01UUENoYW5uZWwoc210cGQuU01UUENoYW5uZWwpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV4dHJhX2ZlYXR1cmVzLCAqYXJncywgKiprdyk6CisgICAgICAgIHNlbGYuX2V4dHJhZmVhdHVyZXMgPSAnJy5qb2luKAorICAgICAgICAgICAgWyAiMjUwLXswfVxyXG4iLmZvcm1hdCh4KSBmb3IgeCBpbiBleHRyYV9mZWF0dXJlcyBdKQorICAgICAgICBzbXRwZC5TTVRQQ2hhbm5lbC5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprdykKKworICAgIGRlZiBzbXRwX0VITE8oc2VsZiwgYXJnKToKKyAgICAgICAgcmVzcCA9ICgnMjUwLXRlc3Rob3N0XHJcbicKKyAgICAgICAgICAgICAgICAnMjUwLUVYUE5cclxuJworICAgICAgICAgICAgICAgICcyNTAtU0laRSAyMDAwMDAwMFxyXG4nCisgICAgICAgICAgICAgICAgJzI1MC1TVEFSVFRMU1xyXG4nCisgICAgICAgICAgICAgICAgJzI1MC1ERUxJVkVSQllcclxuJykKKyAgICAgICAgcmVzcCA9IHJlc3AgKyBzZWxmLl9leHRyYWZlYXR1cmVzICsgJzI1MCBIRUxQJworICAgICAgICBzZWxmLnB1c2gocmVzcCkKKworICAgIGRlZiBzbXRwX1ZSRlkoc2VsZiwgYXJnKToKKyAgICAgICAgIyBGb3IgbWF4IGNvbXBhdGliaWxpdHkgc210cGxpYiBzaG91bGQgYmUgc2VuZGluZyB0aGUgcmF3IGFkZHJlc3MuCisgICAgICAgIGlmIGFyZyBpbiBzaW1fdXNlcnM6CisgICAgICAgICAgICBzZWxmLnB1c2goJzI1MCAlcyAlcycgJSAoc2ltX3VzZXJzW2FyZ10sIHNtdHBsaWIucXVvdGVhZGRyKGFyZykpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5wdXNoKCc1NTAgTm8gc3VjaCB1c2VyOiAlcycgJSBhcmcpCisKKyAgICBkZWYgc210cF9FWFBOKHNlbGYsIGFyZyk6CisgICAgICAgIGxpc3RfbmFtZSA9IGFyZy5sb3dlcigpCisgICAgICAgIGlmIGxpc3RfbmFtZSBpbiBzaW1fbGlzdHM6CisgICAgICAgICAgICB1c2VyX2xpc3QgPSBzaW1fbGlzdHNbbGlzdF9uYW1lXQorICAgICAgICAgICAgZm9yIG4sIHVzZXJfZW1haWwgaW4gZW51bWVyYXRlKHVzZXJfbGlzdCk6CisgICAgICAgICAgICAgICAgcXVvdGVkX2FkZHIgPSBzbXRwbGliLnF1b3RlYWRkcih1c2VyX2VtYWlsKQorICAgICAgICAgICAgICAgIGlmIG4gPCBsZW4odXNlcl9saXN0KSAtIDE6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHVzaCgnMjUwLSVzICVzJyAlIChzaW1fdXNlcnNbdXNlcl9lbWFpbF0sIHF1b3RlZF9hZGRyKSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnB1c2goJzI1MCAlcyAlcycgJSAoc2ltX3VzZXJzW3VzZXJfZW1haWxdLCBxdW90ZWRfYWRkcikpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnB1c2goJzU1MCBObyBhY2Nlc3MgZm9yIHlvdSEnKQorCisgICAgZGVmIHNtdHBfQVVUSChzZWxmLCBhcmcpOgorICAgICAgICBpZiBhcmcuc3RyaXAoKS5sb3dlcigpPT0nY3JhbS1tZDUnOgorICAgICAgICAgICAgc2VsZi5wdXNoKCczMzQgezB9Jy5mb3JtYXQoc2ltX2NyYW1fbWQ1X2NoYWxsZW5nZSkpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbWVjaCwgYXV0aCA9IGFyZy5zcGxpdCgpCisgICAgICAgIG1lY2ggPSBtZWNoLmxvd2VyKCkKKyAgICAgICAgaWYgbWVjaCBub3QgaW4gc2ltX2F1dGhfY3JlZGVudGlhbHM6CisgICAgICAgICAgICBzZWxmLnB1c2goJzUwNCBhdXRoIHR5cGUgdW5pbXBsZW1lbnRlZCcpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbWVjaCA9PSAncGxhaW4nIGFuZCBhdXRoPT1zaW1fYXV0aF9jcmVkZW50aWFsc1sncGxhaW4nXToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnMjM1IHBsYWluIGF1dGggb2snKQorICAgICAgICBlbGlmIG1lY2g9PSdsb2dpbicgYW5kIGF1dGg9PXNpbV9hdXRoX2NyZWRlbnRpYWxzWydsb2dpbiddOgorICAgICAgICAgICAgc2VsZi5wdXNoKCczMzQgUGFzc3dvcmQ6JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHVzaCgnNTUwIE5vIGFjY2VzcyBmb3IgeW91IScpCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZQorCisKK2NsYXNzIFNpbVNNVFBTZXJ2ZXIoc210cGQuU01UUFNlcnZlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICBzZWxmLl9leHRyYV9mZWF0dXJlcyA9IFtdCisgICAgICAgIHNtdHBkLlNNVFBTZXJ2ZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICBkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKKyAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuYWNjZXB0KCkKKyAgICAgICAgc2VsZi5fU01UUGNoYW5uZWwgPSBTaW1TTVRQQ2hhbm5lbChzZWxmLl9leHRyYV9mZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBjb25uLCBhZGRyKQorCisgICAgZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBwZWVyLCBtYWlsZnJvbSwgcmNwdHRvcywgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBhZGRfZmVhdHVyZShzZWxmLCBmZWF0dXJlKToKKyAgICAgICAgc2VsZi5fZXh0cmFfZmVhdHVyZXMuYXBwZW5kKGZlYXR1cmUpCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICByYWlzZQorCisKKyMgVGVzdCB2YXJpb3VzIFNNVFAgJiBFU01UUCBjb21tYW5kcy9iZWhhdmlvcnMgdGhhdCByZXF1aXJlIGEgc2ltdWxhdGVkIHNlcnZlcgorIyAoaS5lLiwgc29tZXRoaW5nIHdpdGggbW9yZSBmZWF0dXJlcyB0aGFuIERlYnVnZ2luZ1NlcnZlcikKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBTTVRQU2ltVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl90aHJlYWRzID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCisgICAgICAgIHNlbGYuc2Vydl9ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLmNsaWVudF9ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAjIFBpY2sgYSByYW5kb20gdW51c2VkIHBvcnQgYnkgcGFzc2luZyAwIGZvciB0aGUgcG9ydCBudW1iZXIKKyAgICAgICAgc2VsZi5zZXJ2ID0gU2ltU01UUFNlcnZlcigoSE9TVCwgMCksICgnbm93aGVyZScsIC0xKSkKKyAgICAgICAgIyBLZWVwIGEgbm90ZSBvZiB3aGF0IHBvcnQgd2FzIGFzc2lnbmVkCisgICAgICAgIHNlbGYucG9ydCA9IHNlbGYuc2Vydi5zb2NrZXQuZ2V0c29ja25hbWUoKVsxXQorICAgICAgICBzZXJ2X2FyZ3MgPSAoc2VsZi5zZXJ2LCBzZWxmLnNlcnZfZXZ0LCBzZWxmLmNsaWVudF9ldnQpCisgICAgICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZGVidWdnaW5nX3NlcnZlciwgYXJncz1zZXJ2X2FyZ3MpCisgICAgICAgIHNlbGYudGhyZWFkLnN0YXJ0KCkKKworICAgICAgICAjIHdhaXQgdW50aWwgc2VydmVyIHRocmVhZCBoYXMgYXNzaWduZWQgYSBwb3J0IG51bWJlcgorICAgICAgICBzZWxmLnNlcnZfZXZ0LndhaXQoKQorICAgICAgICBzZWxmLnNlcnZfZXZ0LmNsZWFyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyBpbmRpY2F0ZSB0aGF0IHRoZSBjbGllbnQgaXMgZmluaXNoZWQKKyAgICAgICAgc2VsZi5jbGllbnRfZXZ0LnNldCgpCisgICAgICAgICMgd2FpdCBmb3IgdGhlIHNlcnZlciB0aHJlYWQgdG8gdGVybWluYXRlCisgICAgICAgIHNlbGYuc2Vydl9ldnQud2FpdCgpCisgICAgICAgIHNlbGYudGhyZWFkLmpvaW4oKQorICAgICAgICB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnNlbGYuX3RocmVhZHMpCisKKyAgICBkZWYgdGVzdEJhc2ljKHNlbGYpOgorICAgICAgICAjIHNtb2tlIHRlc3QKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTE1KQorICAgICAgICBzbXRwLnF1aXQoKQorCisgICAgZGVmIHRlc3RFSExPKHNlbGYpOgorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MTUpCisKKyAgICAgICAgIyBubyBmZWF0dXJlcyBzaG91bGQgYmUgcHJlc2VudCBiZWZvcmUgdGhlIEVITE8KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLmVzbXRwX2ZlYXR1cmVzLCB7fSkKKworICAgICAgICAjIGZlYXR1cmVzIGV4cGVjdGVkIGZyb20gdGhlIHRlc3Qgc2VydmVyCisgICAgICAgIGV4cGVjdGVkX2ZlYXR1cmVzID0geydleHBuJzonJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemUnOiAnMjAwMDAwMDAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RhcnR0bHMnOiAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlbGl2ZXJieSc6ICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVscCc6ICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgc210cC5laGxvKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbXRwLmVzbXRwX2ZlYXR1cmVzLCBleHBlY3RlZF9mZWF0dXJlcykKKyAgICAgICAgZm9yIGsgaW4gZXhwZWN0ZWRfZmVhdHVyZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc210cC5oYXNfZXh0bihrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzbXRwLmhhc19leHRuKCd1bnN1cHBvcnRlZC1mZWF0dXJlJykpCisgICAgICAgIHNtdHAucXVpdCgpCisKKyAgICBkZWYgdGVzdFZSRlkoc2VsZik6CisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0xNSkKKworICAgICAgICBmb3IgZW1haWwsIG5hbWUgaW4gc2ltX3VzZXJzLml0ZW1zKCk6CisgICAgICAgICAgICBleHBlY3RlZF9rbm93biA9ICgyNTAsICclcyAlcycgJSAobmFtZSwgc210cGxpYi5xdW90ZWFkZHIoZW1haWwpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc210cC52cmZ5KGVtYWlsKSwgZXhwZWN0ZWRfa25vd24pCisKKyAgICAgICAgdSA9ICdub2JvZHlAbm93aGVyZS5jb20nCisgICAgICAgIGV4cGVjdGVkX3Vua25vd24gPSAoNTUwLCAnTm8gc3VjaCB1c2VyOiAlcycgJSB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAudnJmeSh1KSwgZXhwZWN0ZWRfdW5rbm93bikKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgIGRlZiB0ZXN0RVhQTihzZWxmKToKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTE1KQorCisgICAgICAgIGZvciBsaXN0bmFtZSwgbWVtYmVycyBpbiBzaW1fbGlzdHMuaXRlbXMoKToKKyAgICAgICAgICAgIHVzZXJzID0gW10KKyAgICAgICAgICAgIGZvciBtIGluIG1lbWJlcnM6CisgICAgICAgICAgICAgICAgdXNlcnMuYXBwZW5kKCclcyAlcycgJSAoc2ltX3VzZXJzW21dLCBzbXRwbGliLnF1b3RlYWRkcihtKSkpCisgICAgICAgICAgICBleHBlY3RlZF9rbm93biA9ICgyNTAsICdcbicuam9pbih1c2VycykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAuZXhwbihsaXN0bmFtZSksIGV4cGVjdGVkX2tub3duKQorCisgICAgICAgIHUgPSAnUFNVLU1lbWJlcnMtTGlzdCcKKyAgICAgICAgZXhwZWN0ZWRfdW5rbm93biA9ICg1NTAsICdObyBhY2Nlc3MgZm9yIHlvdSEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAuZXhwbih1KSwgZXhwZWN0ZWRfdW5rbm93bikKKyAgICAgICAgc210cC5xdWl0KCkKKworICAgIGRlZiB0ZXN0QVVUSF9QTEFJTihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LmFkZF9mZWF0dXJlKCJBVVRIIFBMQUlOIikKKyAgICAgICAgc210cCA9IHNtdHBsaWIuU01UUChIT1NULCBzZWxmLnBvcnQsIGxvY2FsX2hvc3RuYW1lPSdsb2NhbGhvc3QnLCB0aW1lb3V0PTE1KQorCisgICAgICAgIGV4cGVjdGVkX2F1dGhfb2sgPSAoMjM1LCBiJ3BsYWluIGF1dGggb2snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtdHAubG9naW4oc2ltX2F1dGhbMF0sIHNpbV9hdXRoWzFdKSwgZXhwZWN0ZWRfYXV0aF9vaykKKworICAgICMgU2ltU01UUENoYW5uZWwgZG9lc24ndCBmdWxseSBzdXBwb3J0IExPR0lOIG9yIENSQU0tTUQ1IGF1dGggYmVjYXVzZSB0aGV5CisgICAgIyByZXF1aXJlIGEgc3luY2hyb25vdXMgcmVhZCB0byBvYnRhaW4gdGhlIGNyZWRlbnRpYWxzLi4uc28gaW5zdGVhZCBzbXRwZAorICAgICMgc2VlcyB0aGUgY3JlZGVudGlhbCBzZW50IGJ5IHNtdHBsaWIncyBsb2dpbiBtZXRob2QgYXMgYW4gdW5rbm93biBjb21tYW5kLAorICAgICMgd2hpY2ggcmVzdWx0cyBpbiBzbXRwbGliIHJhaXNpbmcgYW4gYXV0aCBlcnJvci4gIEZvcnR1bmF0ZWx5IHRoZSBlcnJvcgorICAgICMgbWVzc2FnZSBjb250YWlucyB0aGUgZW5jb2RlZCBjcmVkZW50aWFsLCBzbyB3ZSBjYW4gcGFydGlhbGx5IGNoZWNrIHRoYXQgaXQKKyAgICAjIHdhcyBnZW5lcmF0ZWQgY29ycmVjdGx5IChwYXJ0aWFsbHksIGJlY2F1c2UgdGhlICd3b3JkJyBpcyB1cHBlcmNhc2VkIGluCisgICAgIyB0aGUgZXJyb3IgbWVzc2FnZSkuCisKKyAgICBkZWYgdGVzdEFVVEhfTE9HSU4oc2VsZik6CisgICAgICAgIHNlbGYuc2Vydi5hZGRfZmVhdHVyZSgiQVVUSCBMT0dJTiIpCisgICAgICAgIHNtdHAgPSBzbXRwbGliLlNNVFAoSE9TVCwgc2VsZi5wb3J0LCBsb2NhbF9ob3N0bmFtZT0nbG9jYWxob3N0JywgdGltZW91dD0xNSkKKyAgICAgICAgdHJ5OiBzbXRwLmxvZ2luKHNpbV9hdXRoWzBdLCBzaW1fYXV0aFsxXSkKKyAgICAgICAgZXhjZXB0IHNtdHBsaWIuU01UUEF1dGhlbnRpY2F0aW9uRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgc2ltX2F1dGhfbG9naW5fcGFzc3dvcmQgbm90IGluIHN0cihlcnIpOgorICAgICAgICAgICAgICAgIHJhaXNlICJleHBlY3RlZCBlbmNvZGVkIHBhc3N3b3JkIG5vdCBmb3VuZCBpbiBlcnJvciBtZXNzYWdlIgorCisgICAgZGVmIHRlc3RBVVRIX0NSQU1fTUQ1KHNlbGYpOgorICAgICAgICBzZWxmLnNlcnYuYWRkX2ZlYXR1cmUoIkFVVEggQ1JBTS1NRDUiKQorICAgICAgICBzbXRwID0gc210cGxpYi5TTVRQKEhPU1QsIHNlbGYucG9ydCwgbG9jYWxfaG9zdG5hbWU9J2xvY2FsaG9zdCcsIHRpbWVvdXQ9MTUpCisKKyAgICAgICAgdHJ5OiBzbXRwLmxvZ2luKHNpbV9hdXRoWzBdLCBzaW1fYXV0aFsxXSkKKyAgICAgICAgZXhjZXB0IHNtdHBsaWIuU01UUEF1dGhlbnRpY2F0aW9uRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgc2ltX2F1dGhfY3JlZGVudGlhbHNbJ2NyYW0tbWQ1J10gbm90IGluIHN0cihlcnIpOgorICAgICAgICAgICAgICAgIHJhaXNlICJleHBlY3RlZCBlbmNvZGVkIGNyZWRlbnRpYWxzIG5vdCBmb3VuZCBpbiBlcnJvciBtZXNzYWdlIgorCisgICAgI1RPRE86IGFkZCB0ZXN0cyBmb3IgY29ycmVjdCBBVVRIIG1ldGhvZCBmYWxsYmFjayBub3cgdGhhdCB0aGUKKyAgICAjdGVzdCBpbmZyYXN0cnVjdHVyZSBjYW4gc3VwcG9ydCBpdC4KKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChHZW5lcmFsVGVzdHMsIERlYnVnZ2luZ1NlcnZlclRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uQ29ubmVjdGluZ1Rlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFkSEVMT1NlcnZlclRlc3RzLCBTTVRQU2ltVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBsaWIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMmY4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBsaWIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cGxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMmY4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NtdHBuZXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzM5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5CkBAIC0wLDAgKzEsMzEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgc210cGxpYgorCit0ZXN0X3N1cHBvcnQucmVxdWlyZXMoIm5ldHdvcmsiKQorCitjbGFzcyBTbXRwU1NMVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgdGVzdFNlcnZlciA9ICdzbXRwLmdtYWlsLmNvbScKKyAgICByZW1vdGVQb3J0ID0gNDY1CisKKyAgICBkZWYgdGVzdF9jb25uZWN0KHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQuZ2V0X2F0dHJpYnV0ZShzbXRwbGliLCAnU01UUF9TU0wnKQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoc2VsZi50ZXN0U2VydmVyKToKKyAgICAgICAgICAgIHNlcnZlciA9IHNtdHBsaWIuU01UUF9TU0woc2VsZi50ZXN0U2VydmVyLCBzZWxmLnJlbW90ZVBvcnQpCisgICAgICAgIHNlcnZlci5laGxvKCkKKyAgICAgICAgc2VydmVyLnF1aXQoKQorCisgICAgZGVmIHRlc3RfY29ubmVjdF9kZWZhdWx0X3BvcnQoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5nZXRfYXR0cmlidXRlKHNtdHBsaWIsICdTTVRQX1NTTCcpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChzZWxmLnRlc3RTZXJ2ZXIpOgorICAgICAgICAgICAgc2VydmVyID0gc210cGxpYi5TTVRQX1NTTChzZWxmLnRlc3RTZXJ2ZXIpCisgICAgICAgIHNlcnZlci5laGxvKCkKKyAgICAgICAgc2VydmVyLnF1aXQoKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTbXRwU1NMVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cG5ldC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFhNThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cG5ldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cG5ldC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zbXRwbmV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTFhNThlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc210cG5ldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMWU1NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHkKQEAgLTAsMCArMSwxNzI0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgZXJybm8KK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzZWxlY3QKK2ltcG9ydCBfdGVzdGNhcGkKK2ltcG9ydCB0aW1lCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgUXVldWUKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGFycmF5CitpbXBvcnQgY29udGV4dGxpYgorZnJvbSB3ZWFrcmVmIGltcG9ydCBwcm94eQoraW1wb3J0IHNpZ25hbAoraW1wb3J0IG1hdGgKKworZGVmIHRyeV9hZGRyZXNzKGhvc3QsIHBvcnQ9MCwgZmFtaWx5PXNvY2tldC5BRl9JTkVUKToKKyAgICAiIiJUcnkgdG8gYmluZCBhIHNvY2tldCBvbiB0aGUgZ2l2ZW4gaG9zdDpwb3J0IGFuZCByZXR1cm4gVHJ1ZQorICAgIGlmIHRoYXQgaGFzIGJlZW4gcG9zc2libGUuIiIiCisgICAgdHJ5OgorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc29jay5iaW5kKChob3N0LCBwb3J0KSkKKyAgICBleGNlcHQgKHNvY2tldC5lcnJvciwgc29ja2V0LmdhaWVycm9yKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZWxzZToKKyAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIHJldHVybiBUcnVlCisKK0hPU1QgPSB0ZXN0X3N1cHBvcnQuSE9TVAorTVNHID0gYidNaWNoYWVsIEdpbGZpeCB3YXMgaGVyZVxuJworU1VQUE9SVFNfSVBWNiA9IHNvY2tldC5oYXNfaXB2NiBhbmQgdHJ5X2FkZHJlc3MoJzo6MScsIGZhbWlseT1zb2NrZXQuQUZfSU5FVDYpCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkCisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZCA9IE5vbmUKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK0hPU1QgPSB0ZXN0X3N1cHBvcnQuSE9TVAorTVNHID0gJ01pY2hhZWwgR2lsZml4IHdhcyBoZXJlXG4nCisKK2NsYXNzIFNvY2tldFRDUFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zZXJ2KQorICAgICAgICBzZWxmLnNlcnYubGlzdGVuKDEpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc2Vydi5jbG9zZSgpCisgICAgICAgIHNlbGYuc2VydiA9IE5vbmUKKworY2xhc3MgU29ja2V0VURQVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2VydiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc2VydikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2LmNsb3NlKCkKKyAgICAgICAgc2VsZi5zZXJ2ID0gTm9uZQorCitjbGFzcyBUaHJlYWRhYmxlVGVzdDoKKyAgICAiIiJUaHJlYWRhYmxlIFRlc3QgY2xhc3MKKworICAgIFRoZSBUaHJlYWRhYmxlVGVzdCBjbGFzcyBtYWtlcyBpdCBlYXN5IHRvIGNyZWF0ZSBhIHRocmVhZGVkCisgICAgY2xpZW50L3NlcnZlciBwYWlyIGZyb20gYW4gZXhpc3RpbmcgdW5pdCB0ZXN0LiBUbyBjcmVhdGUgYQorICAgIG5ldyB0aHJlYWRlZCBjbGFzcyBmcm9tIGFuIGV4aXN0aW5nIHVuaXQgdGVzdCwgdXNlIG11bHRpcGxlCisgICAgaW5oZXJpdGFuY2U6CisKKyAgICAgICAgY2xhc3MgTmV3Q2xhc3MgKE9sZENsYXNzLCBUaHJlYWRhYmxlVGVzdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICBUaGlzIGNsYXNzIGRlZmluZXMgdHdvIG5ldyBmaXh0dXJlIGZ1bmN0aW9ucyB3aXRoIG9idmlvdXMKKyAgICBwdXJwb3NlcyBmb3Igb3ZlcnJpZGluZzoKKworICAgICAgICBjbGllbnRTZXRVcCAoKQorICAgICAgICBjbGllbnRUZWFyRG93biAoKQorCisgICAgQW55IG5ldyB0ZXN0IGZ1bmN0aW9ucyB3aXRoaW4gdGhlIGNsYXNzIG11c3QgdGhlbiBkZWZpbmUKKyAgICB0ZXN0cyBpbiBwYWlycywgd2hlcmUgdGhlIHRlc3QgbmFtZSBpcyBwcmVjZWVkZWQgd2l0aCBhCisgICAgJ18nIHRvIGluZGljYXRlIHRoZSBjbGllbnQgcG9ydGlvbiBvZiB0aGUgdGVzdC4gRXg6CisKKyAgICAgICAgZGVmIHRlc3RGb28oc2VsZik6CisgICAgICAgICAgICAjIFNlcnZlciBwb3J0aW9uCisKKyAgICAgICAgZGVmIF90ZXN0Rm9vKHNlbGYpOgorICAgICAgICAgICAgIyBDbGllbnQgcG9ydGlvbgorCisgICAgQW55IGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IHRoZSBjbGllbnRzIGR1cmluZyB0aGVpciB0ZXN0cworICAgIGFyZSBjYXVnaHQgYW5kIHRyYW5zZmVycmVkIHRvIHRoZSBtYWluIHRocmVhZCB0byBhbGVydAorICAgIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KKworICAgIE5vdGUsIHRoZSBzZXJ2ZXIgc2V0dXAgZnVuY3Rpb24gY2Fubm90IGNhbGwgYW55IGJsb2NraW5nCisgICAgZnVuY3Rpb25zIHRoYXQgcmVseSBvbiB0aGUgY2xpZW50IHRocmVhZCBkdXJpbmcgc2V0dXAsCisgICAgdW5sZXNzIHNlcnZlckV4cGxpY2l0UmVhZHkoKSBpcyBjYWxsZWQganVzdCBiZWZvcmUKKyAgICB0aGUgYmxvY2tpbmcgY2FsbCAoc3VjaCBhcyBpbiBzZXR0aW5nIHVwIGEgY2xpZW50L3NlcnZlcgorICAgIGNvbm5lY3Rpb24gYW5kIHBlcmZvcm1pbmcgdGhlIGFjY2VwdCgpIGluIHNldFVwKCkuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgU3dhcCB0aGUgdHJ1ZSBzZXR1cCBmdW5jdGlvbgorICAgICAgICBzZWxmLl9fc2V0VXAgPSBzZWxmLnNldFVwCisgICAgICAgIHNlbGYuX190ZWFyRG93biA9IHNlbGYudGVhckRvd24KKyAgICAgICAgc2VsZi5zZXRVcCA9IHNlbGYuX3NldFVwCisgICAgICAgIHNlbGYudGVhckRvd24gPSBzZWxmLl90ZWFyRG93bgorCisgICAgZGVmIHNlcnZlckV4cGxpY2l0UmVhZHkoc2VsZik6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGFsbG93cyB0aGUgc2VydmVyIHRvIGV4cGxpY2l0bHkgaW5kaWNhdGUgdGhhdAorICAgICAgICBpdCB3YW50cyB0aGUgY2xpZW50IHRocmVhZCB0byBwcm9jZWVkLiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUKKyAgICAgICAgc2VydmVyIGlzIGFib3V0IHRvIGV4ZWN1dGUgYSBibG9ja2luZyByb3V0aW5lIHRoYXQgaXMKKyAgICAgICAgZGVwZW5kZW50IHVwb24gdGhlIGNsaWVudCB0aHJlYWQgZHVyaW5nIGl0cyBzZXR1cCByb3V0aW5lLiIiIgorICAgICAgICBzZWxmLnNlcnZlcl9yZWFkeS5zZXQoKQorCisgICAgZGVmIF9zZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJfcmVhZHkgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLmNsaWVudF9yZWFkeSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuZG9uZSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYucXVldWUgPSBRdWV1ZS5RdWV1ZSgxKQorCisgICAgICAgICMgRG8gc29tZSBtdW5naW5nIHRvIHN0YXJ0IHRoZSBjbGllbnQgdGVzdC4KKyAgICAgICAgbWV0aG9kbmFtZSA9IHNlbGYuaWQoKQorICAgICAgICBpID0gbWV0aG9kbmFtZS5yZmluZCgnLicpCisgICAgICAgIG1ldGhvZG5hbWUgPSBtZXRob2RuYW1lW2krMTpdCisgICAgICAgIHRlc3RfbWV0aG9kID0gZ2V0YXR0cihzZWxmLCAnXycgKyBtZXRob2RuYW1lKQorICAgICAgICBzZWxmLmNsaWVudF90aHJlYWQgPSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCgKKyAgICAgICAgICAgIHNlbGYuY2xpZW50UnVuLCAodGVzdF9tZXRob2QsKSkKKworICAgICAgICBzZWxmLl9fc2V0VXAoKQorICAgICAgICBpZiBub3Qgc2VsZi5zZXJ2ZXJfcmVhZHkuaXNfc2V0KCk6CisgICAgICAgICAgICBzZWxmLnNlcnZlcl9yZWFkeS5zZXQoKQorICAgICAgICBzZWxmLmNsaWVudF9yZWFkeS53YWl0KCkKKworICAgIGRlZiBfdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuX190ZWFyRG93bigpCisgICAgICAgIHNlbGYuZG9uZS53YWl0KCkKKworICAgICAgICBpZiBub3Qgc2VsZi5xdWV1ZS5lbXB0eSgpOgorICAgICAgICAgICAgbXNnID0gc2VsZi5xdWV1ZS5nZXQoKQorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgIGRlZiBjbGllbnRSdW4oc2VsZiwgdGVzdF9mdW5jKToKKyAgICAgICAgc2VsZi5zZXJ2ZXJfcmVhZHkud2FpdCgpCisgICAgICAgIHNlbGYuY2xpZW50U2V0VXAoKQorICAgICAgICBzZWxmLmNsaWVudF9yZWFkeS5zZXQoKQorICAgICAgICBpZiBub3QgY2FsbGFibGUodGVzdF9mdW5jKToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigidGVzdF9mdW5jIG11c3QgYmUgYSBjYWxsYWJsZSBmdW5jdGlvbi4iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X2Z1bmMoKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBzdHJlcnJvcjoKKyAgICAgICAgICAgIHNlbGYucXVldWUucHV0KHN0cmVycm9yKQorICAgICAgICBzZWxmLmNsaWVudFRlYXJEb3duKCkKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigiY2xpZW50U2V0VXAgbXVzdCBiZSBpbXBsZW1lbnRlZC4iKQorCisgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmRvbmUuc2V0KCkKKyAgICAgICAgdGhyZWFkLmV4aXQoKQorCitjbGFzcyBUaHJlYWRlZFRDUFNvY2tldFRlc3QoU29ja2V0VENQVGVzdCwgVGhyZWFkYWJsZVRlc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgU29ja2V0VENQVGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisgICAgICAgIFRocmVhZGFibGVUZXN0Ll9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgY2xpZW50U2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorCisgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5jbG9zZSgpCisgICAgICAgIHNlbGYuY2xpID0gTm9uZQorICAgICAgICBUaHJlYWRhYmxlVGVzdC5jbGllbnRUZWFyRG93bihzZWxmKQorCitjbGFzcyBUaHJlYWRlZFVEUFNvY2tldFRlc3QoU29ja2V0VURQVGVzdCwgVGhyZWFkYWJsZVRlc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgU29ja2V0VURQVGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisgICAgICAgIFRocmVhZGFibGVUZXN0Ll9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgY2xpZW50U2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfREdSQU0pCisKKyAgICBkZWYgY2xpZW50VGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jbGkgPSBOb25lCisgICAgICAgIFRocmVhZGFibGVUZXN0LmNsaWVudFRlYXJEb3duKHNlbGYpCisKK2NsYXNzIFNvY2tldENvbm5lY3RlZFRlc3QoVGhyZWFkZWRUQ1BTb2NrZXRUZXN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIFRocmVhZGVkVENQU29ja2V0VGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIFRocmVhZGVkVENQU29ja2V0VGVzdC5zZXRVcChzZWxmKQorICAgICAgICAjIEluZGljYXRlIGV4cGxpY2l0bHkgd2UncmUgcmVhZHkgZm9yIHRoZSBjbGllbnQgdGhyZWFkIHRvCisgICAgICAgICMgcHJvY2VlZCBhbmQgdGhlbiBwZXJmb3JtIHRoZSBibG9ja2luZyBjYWxsIHRvIGFjY2VwdAorICAgICAgICBzZWxmLnNlcnZlckV4cGxpY2l0UmVhZHkoKQorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIHNlbGYuY2xpX2Nvbm4gPSBjb25uCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpX2Nvbm4uY2xvc2UoKQorICAgICAgICBzZWxmLmNsaV9jb25uID0gTm9uZQorICAgICAgICBUaHJlYWRlZFRDUFNvY2tldFRlc3QudGVhckRvd24oc2VsZikKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgVGhyZWFkZWRUQ1BTb2NrZXRUZXN0LmNsaWVudFNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuY2xpLmNvbm5lY3QoKEhPU1QsIHNlbGYucG9ydCkpCisgICAgICAgIHNlbGYuc2Vydl9jb25uID0gc2VsZi5jbGkKKworICAgIGRlZiBjbGllbnRUZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uY2xvc2UoKQorICAgICAgICBzZWxmLnNlcnZfY29ubiA9IE5vbmUKKyAgICAgICAgVGhyZWFkZWRUQ1BTb2NrZXRUZXN0LmNsaWVudFRlYXJEb3duKHNlbGYpCisKK2NsYXNzIFNvY2tldFBhaXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlLCBUaHJlYWRhYmxlVGVzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisgICAgICAgIFRocmVhZGFibGVUZXN0Ll9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc2Vydiwgc2VsZi5jbGkgPSBzb2NrZXQuc29ja2V0cGFpcigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc2Vydi5jbG9zZSgpCisgICAgICAgIHNlbGYuc2VydiA9IE5vbmUKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGNsaWVudFRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5jbG9zZSgpCisgICAgICAgIHNlbGYuY2xpID0gTm9uZQorICAgICAgICBUaHJlYWRhYmxlVGVzdC5jbGllbnRUZWFyRG93bihzZWxmKQorCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyBCZWdpbiBUZXN0cworCitjbGFzcyBHZW5lcmFsTW9kdWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3Rfd2Vha3JlZihzZWxmKToKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgcCA9IHByb3h5KHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5maWxlbm8oKSwgcy5maWxlbm8oKSkKKyAgICAgICAgcy5jbG9zZSgpCisgICAgICAgIHMgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAuZmlsZW5vKCkKKyAgICAgICAgZXhjZXB0IFJlZmVyZW5jZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdTb2NrZXQgcHJveHkgc3RpbGwgZXhpc3RzJykKKworICAgIGRlZiB0ZXN0U29ja2V0RXJyb3Ioc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzb2NrZXQgbW9kdWxlIGV4Y2VwdGlvbnMKKyAgICAgICAgZGVmIHJhaXNlX2Vycm9yKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IKKyAgICAgICAgZGVmIHJhaXNlX2hlcnJvcigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmhlcnJvcgorICAgICAgICBkZWYgcmFpc2VfZ2FpZXJyb3IoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHJhaXNlIHNvY2tldC5nYWllcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHJhaXNlX2Vycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJhaXNpbmcgc29ja2V0IGV4Y2VwdGlvbi4iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHJhaXNlX2hlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByYWlzaW5nIHNvY2tldCBleGNlcHRpb24uIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCByYWlzZV9nYWllcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByYWlzaW5nIHNvY2tldCBleGNlcHRpb24uIikKKworICAgIGRlZiB0ZXN0U2VuZHRvRXJyb3JzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgdGhhdCBzZW5kdG8gZG9lbnMndCBtYXNrcyBmYWlsdXJlcy4gU2VlICMxMDE2OS4KKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgcy5iaW5kKCgnJywgMCkpCisgICAgICAgIHNvY2tuYW1lID0gcy5nZXRzb2NrbmFtZSgpCisgICAgICAgICMgMiBhcmdzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yKToKKyAgICAgICAgICAgIHMuc2VuZHRvKHUnXHUyNjIwJywgc29ja25hbWUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHMuc2VuZHRvKDVqLCBzb2NrbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignbm90IGNvbXBsZXgnLCBzdHIoY20uZXhjZXB0aW9uKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgcy5zZW5kdG8oJ2ZvbycsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vdCBOb25lVHlwZScsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICAjIDMgYXJncworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICBzLnNlbmR0byh1J1x1MjYyMCcsIDAsIHNvY2tuYW1lKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBzLnNlbmR0byg1aiwgMCwgc29ja25hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ25vdCBjb21wbGV4Jywgc3RyKGNtLmV4Y2VwdGlvbikpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHMuc2VuZHRvKCdmb28nLCAwLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEluKCdub3QgTm9uZVR5cGUnLCBzdHIoY20uZXhjZXB0aW9uKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgcy5zZW5kdG8oJ2ZvbycsICdiYXInLCBzb2NrbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYW4gaW50ZWdlciBpcyByZXF1aXJlZCcsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICBzLnNlbmR0bygnZm9vJywgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYW4gaW50ZWdlciBpcyByZXF1aXJlZCcsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICAjIHdyb25nIG51bWJlciBvZiBhcmdzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHMuc2VuZHRvKCdmb28nKQorICAgICAgICBzZWxmLmFzc2VydEluKCcoMSBnaXZlbiknLCBzdHIoY20uZXhjZXB0aW9uKSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgcy5zZW5kdG8oJ2ZvbycsIDAsIHNvY2tuYW1lLCA0KQorICAgICAgICBzZWxmLmFzc2VydEluKCcoNCBnaXZlbiknLCBzdHIoY20uZXhjZXB0aW9uKSkKKworCisgICAgZGVmIHRlc3RDcnVjaWFsQ29uc3RhbnRzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZm9yIG1pc3Npb24gY3JpdGljYWwgY29uc3RhbnRzCisgICAgICAgIHNvY2tldC5BRl9JTkVUCisgICAgICAgIHNvY2tldC5TT0NLX1NUUkVBTQorICAgICAgICBzb2NrZXQuU09DS19ER1JBTQorICAgICAgICBzb2NrZXQuU09DS19SQVcKKyAgICAgICAgc29ja2V0LlNPQ0tfUkRNCisgICAgICAgIHNvY2tldC5TT0NLX1NFUVBBQ0tFVAorICAgICAgICBzb2NrZXQuU09MX1NPQ0tFVAorICAgICAgICBzb2NrZXQuU09fUkVVU0VBRERSCisKKyAgICBkZWYgdGVzdEhvc3RuYW1lUmVzKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgaG9zdG5hbWUgcmVzb2x1dGlvbiBtZWNoYW5pc21zCisgICAgICAgIGhvc3RuYW1lID0gc29ja2V0LmdldGhvc3RuYW1lKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaXAgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShob3N0bmFtZSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICMgUHJvYmFibHkgbmFtZSBsb29rdXAgd2Fzbid0IHNldCB1cCByaWdodDsgc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXAuZmluZCgnLicpID49IDAsICJFcnJvciByZXNvbHZpbmcgaG9zdCB0byBpcC4iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBobmFtZSwgYWxpYXNlcywgaXBhZGRycyA9IHNvY2tldC5nZXRob3N0YnlhZGRyKGlwKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgIyBQcm9iYWJseSBhIHNpbWlsYXIgcHJvYmxlbSBhcyBhYm92ZTsgc2tpcCB0aGlzIHRlc3QKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBhbGxfaG9zdF9uYW1lcyA9IFtob3N0bmFtZSwgaG5hbWVdICsgYWxpYXNlcworICAgICAgICBmcWhuID0gc29ja2V0LmdldGZxZG4oaXApCisgICAgICAgIGlmIG5vdCBmcWhuIGluIGFsbF9ob3N0X25hbWVzOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciB0ZXN0aW5nIGhvc3QgcmVzb2x1dGlvbiBtZWNoYW5pc21zLiAoZnFkbjogJXMsIGFsbDogJXMpIiAlIChmcWhuLCByZXByKGFsbF9ob3N0X25hbWVzKSkpCisKKyAgICBkZWYgdGVzdFJlZkNvdW50R2V0TmFtZUluZm8oc2VsZik6CisgICAgICAgICMgVGVzdGluZyByZWZlcmVuY2UgY291bnQgZm9yIGdldG5hbWVpbmZvCisgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0cmVmY291bnQiKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIE9uIHNvbWUgdmVyc2lvbnMsIHRoaXMgbG9zZXMgYSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBvcmlnID0gc3lzLmdldHJlZmNvdW50KF9fbmFtZV9fKQorICAgICAgICAgICAgICAgIHNvY2tldC5nZXRuYW1laW5mbyhfX25hbWVfXywwKQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChfX25hbWVfXyksIG9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0LmdldG5hbWVpbmZvIGxvc2VzIGEgcmVmZXJlbmNlIikKKworICAgIGRlZiB0ZXN0SW50ZXJwcmV0ZXJDcmFzaChzZWxmKToKKyAgICAgICAgIyBNYWtpbmcgc3VyZSBnZXRuYW1laW5mbyBkb2Vzbid0IGNyYXNoIHRoZSBpbnRlcnByZXRlcgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIE9uIHNvbWUgdmVyc2lvbnMsIHRoaXMgY3Jhc2hlcyB0aGUgaW50ZXJwcmV0ZXIuCisgICAgICAgICAgICBzb2NrZXQuZ2V0bmFtZWluZm8oKCd4JywgMCwgMCwgMCksIDApCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdE50b0goc2VsZik6CisgICAgICAgICMgVGhpcyBqdXN0IGNoZWNrcyB0aGF0IGh0b25zIGV0Yy4gYXJlIHRoZWlyIG93biBpbnZlcnNlLAorICAgICAgICAjIHdoZW4gbG9va2luZyBhdCB0aGUgbG93ZXIgMTYgb3IgMzIgYml0cy4KKyAgICAgICAgc2l6ZXMgPSB7c29ja2V0Lmh0b25sOiAzMiwgc29ja2V0Lm50b2hsOiAzMiwKKyAgICAgICAgICAgICAgICAgc29ja2V0Lmh0b25zOiAxNiwgc29ja2V0Lm50b2hzOiAxNn0KKyAgICAgICAgZm9yIGZ1bmMsIHNpemUgaW4gc2l6ZXMuaXRlbXMoKToKKyAgICAgICAgICAgIG1hc2sgPSAoMUw8PHNpemUpIC0gMQorICAgICAgICAgICAgZm9yIGkgaW4gKDAsIDEsIDB4ZmZmZiwgfjB4ZmZmZiwgMiwgMHgwMTIzNDU2NywgMHg3NjU0MzIxMCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpICYgbWFzaywgZnVuYyhmdW5jKGkmbWFzaykpICYgbWFzaykKKworICAgICAgICAgICAgc3dhcHBlZCA9IGZ1bmMobWFzaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3dhcHBlZCAmIG1hc2ssIG1hc2spCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBmdW5jLCAxTDw8MzQpCisKKyAgICBkZWYgdGVzdE50b0hFcnJvcnMoc2VsZik6CisgICAgICAgIGdvb2RfdmFsdWVzID0gWyAxLCAyLCAzLCAxTCwgMkwsIDNMIF0KKyAgICAgICAgYmFkX3ZhbHVlcyA9IFsgLTEsIC0yLCAtMywgLTFMLCAtMkwsIC0zTCBdCisgICAgICAgIGZvciBrIGluIGdvb2RfdmFsdWVzOgorICAgICAgICAgICAgc29ja2V0Lm50b2hsKGspCisgICAgICAgICAgICBzb2NrZXQubnRvaHMoaykKKyAgICAgICAgICAgIHNvY2tldC5odG9ubChrKQorICAgICAgICAgICAgc29ja2V0Lmh0b25zKGspCisgICAgICAgIGZvciBrIGluIGJhZF92YWx1ZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrZXQubnRvaGwsIGspCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrZXQubnRvaHMsIGspCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrZXQuaHRvbmwsIGspCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrZXQuaHRvbnMsIGspCisKKyAgICBkZWYgdGVzdEdldFNlcnZCeShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgRmluZCBvbmUgc2VydmljZSB0aGF0IGV4aXN0cywgdGhlbiBjaGVjayBhbGwgdGhlIHJlbGF0ZWQgaW50ZXJmYWNlcy4KKyAgICAgICAgIyBJJ3ZlIG9yZGVyZWQgdGhpcyBieSBwcm90b2NvbHMgdGhhdCBoYXZlIGJvdGggYSB0Y3AgYW5kIHVkcAorICAgICAgICAjIHByb3RvY29sLCBhdCBsZWFzdCBmb3IgbW9kZXJuIExpbnV4ZXMuCisgICAgICAgIGlmIChzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnbGludXgnKSBvcgorICAgICAgICAgICAgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2ZyZWVic2QnKSBvcgorICAgICAgICAgICAgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ25ldGJzZCcpIG9yCisgICAgICAgICAgICBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicpOgorICAgICAgICAgICAgIyBhdm9pZCB0aGUgJ2VjaG8nIHNlcnZpY2Ugb24gdGhpcyBwbGF0Zm9ybSwgYXMgdGhlcmUgaXMgYW4KKyAgICAgICAgICAgICMgYXNzdW1wdGlvbiBicmVha2luZyBub24tc3RhbmRhcmQgcG9ydC9wcm90b2NvbCBlbnRyeQorICAgICAgICAgICAgc2VydmljZXMgPSAoJ2RheXRpbWUnLCAncW90ZCcsICdkb21haW4nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VydmljZXMgPSAoJ2VjaG8nLCAnZGF5dGltZScsICdkb21haW4nKQorICAgICAgICBmb3Igc2VydmljZSBpbiBzZXJ2aWNlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwb3J0ID0gc29ja2V0LmdldHNlcnZieW5hbWUoc2VydmljZSwgJ3RjcCcpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmVycm9yCisgICAgICAgICMgVHJ5IHNhbWUgY2FsbCB3aXRoIG9wdGlvbmFsIHByb3RvY29sIG9taXR0ZWQKKyAgICAgICAgcG9ydDIgPSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShzZXJ2aWNlKQorICAgICAgICBlcShwb3J0LCBwb3J0MikKKyAgICAgICAgIyBUcnkgdWRwLCBidXQgZG9uJ3QgYmFyZiBpZiBpdCBkb2Vzbid0IGV4aXN0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVkcHBvcnQgPSBzb2NrZXQuZ2V0c2VydmJ5bmFtZShzZXJ2aWNlLCAndWRwJykKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgIHVkcHBvcnQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlcSh1ZHBwb3J0LCBwb3J0KQorICAgICAgICAjIE5vdyBtYWtlIHN1cmUgdGhlIGxvb2t1cCBieSBwb3J0IHJldHVybnMgdGhlIHNhbWUgc2VydmljZSBuYW1lCisgICAgICAgIGVxKHNvY2tldC5nZXRzZXJ2Ynlwb3J0KHBvcnQyKSwgc2VydmljZSkKKyAgICAgICAgZXEoc29ja2V0LmdldHNlcnZieXBvcnQocG9ydCwgJ3RjcCcpLCBzZXJ2aWNlKQorICAgICAgICBpZiB1ZHBwb3J0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZXEoc29ja2V0LmdldHNlcnZieXBvcnQodWRwcG9ydCwgJ3VkcCcpLCBzZXJ2aWNlKQorICAgICAgICAjIE1ha2Ugc3VyZSBnZXRzZXJ2Ynlwb3J0IGRvZXMgbm90IGFjY2VwdCBvdXQgb2YgcmFuZ2UgcG9ydHMuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNvY2tldC5nZXRzZXJ2Ynlwb3J0LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc29ja2V0LmdldHNlcnZieXBvcnQsIDY1NTM2KQorCisgICAgZGVmIHRlc3REZWZhdWx0VGltZW91dChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGRlZmF1bHQgdGltZW91dAorICAgICAgICAjIFRoZSBkZWZhdWx0IHRpbWVvdXQgc2hvdWxkIGluaXRpYWxseSBiZSBOb25lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCksIE5vbmUpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHRpbWVvdXQoKSwgTm9uZSkKKyAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgIyBTZXQgdGhlIGRlZmF1bHQgdGltZW91dCB0byAxMCwgYW5kIHNlZSBpZiBpdCBwcm9wYWdhdGVzCisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSwgMTApCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHRpbWVvdXQoKSwgMTApCisgICAgICAgIHMuY2xvc2UoKQorCisgICAgICAgICMgUmVzZXQgdGhlIGRlZmF1bHQgdGltZW91dCB0byBOb25lLCBhbmQgc2VlIGlmIGl0IHByb3BhZ2F0ZXMKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCksIE5vbmUpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHRpbWVvdXQoKSwgTm9uZSkKKyAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHNldHRpbmcgaXQgdG8gYW4gaW52YWxpZCB2YWx1ZSByYWlzZXMgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQsIC0xKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBzZXR0aW5nIGl0IHRvIGFuIGludmFsaWQgdHlwZSByYWlzZXMgVHlwZUVycm9yCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0LCAic3BhbSIpCisKKyAgICBkZWYgdGVzdElQdjRfaW5ldF9hdG9uX2ZvdXJieXRlcyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnaW5ldF9hdG9uJyk6CisgICAgICAgICAgICByZXR1cm4gICMgTm8gaW5ldF9hdG9uLCBub3RoaW5nIHRvIGNoZWNrCisgICAgICAgICMgVGVzdCB0aGF0IGlzc3VlMTAwODA4NiBhbmQgaXNzdWU3NjcxNTAgYXJlIGZpeGVkLgorICAgICAgICAjIEl0IG11c3QgcmV0dXJuIDQgYnl0ZXMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MDAnKjQsIHNvY2tldC5pbmV0X2F0b24oJzAuMC4wLjAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhmZicqNCwgc29ja2V0LmluZXRfYXRvbignMjU1LjI1NS4yNTUuMjU1JykpCisKKyAgICBkZWYgdGVzdElQdjR0b1N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc29ja2V0LCAnaW5ldF9wdG9uJyk6CisgICAgICAgICAgICByZXR1cm4gIyBObyBpbmV0X3B0b24oKSBvbiB0aGlzIHBsYXRmb3JtCisgICAgICAgIGZyb20gc29ja2V0IGltcG9ydCBpbmV0X2F0b24gYXMgZiwgaW5ldF9wdG9uLCBBRl9JTkVUCisgICAgICAgIGcgPSBsYW1iZGEgYTogaW5ldF9wdG9uKEFGX0lORVQsIGEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgwMFx4MDBceDAwXHgwMCcsIGYoJzAuMC4wLjAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhmZlx4MDBceGZmXHgwMCcsIGYoJzI1NS4wLjI1NS4wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4YWFceGFhXHhhYVx4YWEnLCBmKCcxNzAuMTcwLjE3MC4xNzAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgwMVx4MDJceDAzXHgwNCcsIGYoJzEuMi4zLjQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnXHhmZlx4ZmZceGZmXHhmZicsIGYoJzI1NS4yNTUuMjU1LjI1NScpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MDBceDAwXHgwMFx4MDAnLCBnKCcwLjAuMC4wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4ZmZceDAwXHhmZlx4MDAnLCBnKCcyNTUuMC4yNTUuMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceGFhXHhhYVx4YWFceGFhJywgZygnMTcwLjE3MC4xNzAuMTcwJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4ZmZceGZmXHhmZlx4ZmYnLCBnKCcyNTUuMjU1LjI1NS4yNTUnKSkKKworICAgIGRlZiB0ZXN0SVB2NnRvU3RyaW5nKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdpbmV0X3B0b24nKToKKyAgICAgICAgICAgIHJldHVybiAjIE5vIGluZXRfcHRvbigpIG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBzb2NrZXQgaW1wb3J0IGluZXRfcHRvbiwgQUZfSU5FVDYsIGhhc19pcHY2CisgICAgICAgICAgICBpZiBub3QgaGFzX2lwdjY6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmID0gbGFtYmRhIGE6IGluZXRfcHRvbihBRl9JTkVUNiwgYSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceDAwJyAqIDE2LCBmKCc6OicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdceDAwJyAqIDE2LCBmKCcwOjowJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1x4MDBceDAxJyArICdceDAwJyAqIDE0LCBmKCcxOjonKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICdceDQ1XHhlZlx4NzZceGNiXHgwMFx4MWFceDU2XHhlZlx4YWZceGViXHgwYlx4YWNceDE5XHgyNFx4YWVceGFlJywKKyAgICAgICAgICAgIGYoJzQ1ZWY6NzZjYjoxYTo1NmVmOmFmZWI6YmFjOjE5MjQ6YWVhZScpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0U3RyaW5nVG9JUHY0KHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzb2NrZXQsICdpbmV0X250b3AnKToKKyAgICAgICAgICAgIHJldHVybiAjIE5vIGluZXRfbnRvcCgpIG9uIHRoaXMgcGxhdGZvcm0KKyAgICAgICAgZnJvbSBzb2NrZXQgaW1wb3J0IGluZXRfbnRvYSBhcyBmLCBpbmV0X250b3AsIEFGX0lORVQKKyAgICAgICAgZyA9IGxhbWJkYSBhOiBpbmV0X250b3AoQUZfSU5FVCwgYSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxLjAuMS4wJywgZignXHgwMVx4MDBceDAxXHgwMCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcxNzAuODUuMTcwLjg1JywgZignXHhhYVx4NTVceGFhXHg1NScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcyNTUuMjU1LjI1NS4yNTUnLCBmKCdceGZmXHhmZlx4ZmZceGZmJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzEuMi4zLjQnLCBmKCdceDAxXHgwMlx4MDNceDA0JykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMS4wLjEuMCcsIGcoJ1x4MDFceDAwXHgwMVx4MDAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMTcwLjg1LjE3MC44NScsIGcoJ1x4YWFceDU1XHhhYVx4NTUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnMjU1LjI1NS4yNTUuMjU1JywgZygnXHhmZlx4ZmZceGZmXHhmZicpKQorCisgICAgZGVmIHRlc3RTdHJpbmdUb0lQdjYoc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgJ2luZXRfbnRvcCcpOgorICAgICAgICAgICAgcmV0dXJuICMgTm8gaW5ldF9udG9wKCkgb24gdGhpcyBwbGF0Zm9ybQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHNvY2tldCBpbXBvcnQgaW5ldF9udG9wLCBBRl9JTkVUNiwgaGFzX2lwdjYKKyAgICAgICAgICAgIGlmIG5vdCBoYXNfaXB2NjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYgPSBsYW1iZGEgYTogaW5ldF9udG9wKEFGX0lORVQ2LCBhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzo6JywgZignXHgwMCcgKiAxNikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzo6MScsIGYoJ1x4MDAnICogMTUgKyAnXHgwMScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgJ2FlZjpiMDE6NTA2OjEwMDE6ZmZmZjo5OTk3OjU1OjE3MCcsCisgICAgICAgICAgICBmKCdceDBhXHhlZlx4MGJceDAxXHgwNVx4MDZceDEwXHgwMVx4ZmZceGZmXHg5OVx4OTdceDAwXHg1NVx4MDFceDcwJykKKyAgICAgICAgKQorCisgICAgIyBYWFggVGhlIGZvbGxvd2luZyBkb24ndCB0ZXN0IG1vZHVsZS1sZXZlbCBmdW5jdGlvbmFsaXR5Li4uCisKKyAgICBkZWYgX2dldF91bnVzZWRfcG9ydChzZWxmLCBiaW5kX2FkZHJlc3M9JzAuMC4wLjAnKToKKyAgICAgICAgIiIiVXNlIGEgdGVtcG9yYXJ5IHNvY2tldCB0byBlbGljaXQgYW4gdW51c2VkIGVwaGVtZXJhbCBwb3J0LgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBiaW5kX2FkZHJlc3M6IEhvc3RuYW1lIG9yIElQIGFkZHJlc3MgdG8gc2VhcmNoIGZvciBhIHBvcnQgb24uCisKKyAgICAgICAgUmV0dXJuczogQSBtb3N0IGxpa2VseSB0byBiZSB1bnVzZWQgcG9ydC4KKyAgICAgICAgIiIiCisgICAgICAgIHRlbXBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgIHRlbXBzb2NrLmJpbmQoKGJpbmRfYWRkcmVzcywgMCkpCisgICAgICAgIGhvc3QsIHBvcnQgPSB0ZW1wc29jay5nZXRzb2NrbmFtZSgpCisgICAgICAgIHRlbXBzb2NrLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIHBvcnQKKworICAgIGRlZiB0ZXN0U29ja05hbWUoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBnZXRzb2NrbmFtZSgpCisgICAgICAgIHBvcnQgPSBzZWxmLl9nZXRfdW51c2VkX3BvcnQoKQorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc29jay5jbG9zZSkKKyAgICAgICAgc29jay5iaW5kKCgiMC4wLjAuMCIsIHBvcnQpKQorICAgICAgICBuYW1lID0gc29jay5nZXRzb2NrbmFtZSgpCisgICAgICAgICMgWFhYKG5ub3J3aXR6KTogaHR0cDovL3Rpbnl1cmwuY29tL29zNWp6IHNlZW1zIHRvIGluZGljYXRlCisgICAgICAgICMgaXQgcmVhc29uYWJsZSB0byBnZXQgdGhlIGhvc3QncyBhZGRyIGluIGFkZGl0aW9uIHRvIDAuMC4wLjAuCisgICAgICAgICMgQXQgbGVhc3QgZm9yIGVDb3MuICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgUy8zOTAgdG8gcGFzcy4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXlfaXBfYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgIyBQcm9iYWJseSBuYW1lIGxvb2t1cCB3YXNuJ3Qgc2V0IHVwIHJpZ2h0OyBza2lwIHRoaXMgdGVzdAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obmFtZVswXSwgKCIwLjAuMC4wIiwgbXlfaXBfYWRkciksICclcyBpbnZhbGlkJyAlIG5hbWVbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZVsxXSwgcG9ydCkKKworICAgIGRlZiB0ZXN0R2V0U29ja09wdChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGdldHNvY2tvcHQoKQorICAgICAgICAjIFdlIGtub3cgYSBzb2NrZXQgc2hvdWxkIHN0YXJ0IHdpdGhvdXQgcmV1c2U9PTAKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIHJldXNlID0gc29jay5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJldXNlICE9IDAsICJpbml0aWFsIG1vZGUgaXMgcmV1c2UiKQorCisgICAgZGVmIHRlc3RTZXRTb2NrT3B0KHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgc2V0c29ja29wdCgpCisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzb2NrLmNsb3NlKQorICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIHJldXNlID0gc29jay5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJldXNlID09IDAsICJmYWlsZWQgdG8gc2V0IHJldXNlIG1vZGUiKQorCisgICAgZGVmIHRlc3RTZW5kQWZ0ZXJDbG9zZShzZWxmKToKKyAgICAgICAgIyB0ZXN0aW5nIHNlbmQoKSBhZnRlciBjbG9zZSgpIHdpdGggdGltZW91dAorICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzb2NrLnNldHRpbWVvdXQoMSkKKyAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc29jay5zZW5kLCAic3BhbSIpCisKKyAgICBkZWYgdGVzdE5ld0F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgICMgdGVzdGluZyAuZmFtaWx5LCAudHlwZSBhbmQgLnByb3RvY29sCisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29jay5mYW1pbHksIHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvY2sudHlwZSwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvY2sucHJvdG8sIDApCisgICAgICAgIHNvY2suY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZ2V0c29ja2FkZHJhcmcoc2VsZik6CisgICAgICAgIGhvc3QgPSAnMC4wLjAuMCcKKyAgICAgICAgcG9ydCA9IHNlbGYuX2dldF91bnVzZWRfcG9ydChiaW5kX2FkZHJlc3M9aG9zdCkKKyAgICAgICAgYmlnX3BvcnQgPSBwb3J0ICsgNjU1MzYKKyAgICAgICAgbmVnX3BvcnQgPSBwb3J0IC0gNjU1MzYKKyAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrLmJpbmQsIChob3N0LCBiaWdfcG9ydCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzb2NrLmJpbmQsIChob3N0LCBuZWdfcG9ydCkpCisgICAgICAgICAgICBzb2NrLmJpbmQoKGhvc3QsIHBvcnQpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29jay5jbG9zZSgpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhvcy5uYW1lID09ICJudCIsICJXaW5kb3dzIHNwZWNpZmljIikKKyAgICBkZWYgdGVzdF9zb2NrX2lvY3RsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQuc29ja2V0LCAnaW9jdGwnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc29ja2V0LCAnU0lPX1JDVkFMTCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQsICdSQ1ZBTExfT04nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc29ja2V0LCAnUkNWQUxMX09GRicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQsICdTSU9fS0VFUEFMSVZFX1ZBTFMnKSkKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocy5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcy5pb2N0bCwgLTEsIE5vbmUpCisgICAgICAgIHMuaW9jdGwoc29ja2V0LlNJT19LRUVQQUxJVkVfVkFMUywgKDEsIDEwMCwgMTAwKSkKKworICAgIGRlZiB0ZXN0R2V0YWRkcmluZm8oc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbygnbG9jYWxob3N0JywgODApCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgaWYgZXJyLmVycm5vID09IHNvY2tldC5FQUlfU0VSVklDRToKKyAgICAgICAgICAgICAgICAjIHNlZSBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTI4MjY0NworICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImJ1Z2d5IGxpYmMgdmVyc2lvbiIpCisgICAgICAgICAgICByYWlzZQorICAgICAgICAjIGxlbiBvZiBldmVyeSBzZXF1ZW5jZSBpcyBzdXBwb3NlZCB0byBiZSA9PSA1CisgICAgICAgIGZvciBpbmZvIGluIHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCBOb25lKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGluZm8pLCA1KQorICAgICAgICAjIGhvc3QgY2FuIGJlIGEgZG9tYWluIG5hbWUsIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuCisgICAgICAgICMgSVB2NC92NiBhZGRyZXNzIG9yIE5vbmUKKyAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKCdsb2NhbGhvc3QnLCA4MCkKKyAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKCcxMjcuMC4wLjEnLCA4MCkKKyAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKE5vbmUsIDgwKQorICAgICAgICBpZiBTVVBQT1JUU19JUFY2OgorICAgICAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKCc6OjEnLCA4MCkKKyAgICAgICAgIyBwb3J0IGNhbiBiZSBhIHN0cmluZyBzZXJ2aWNlIG5hbWUgc3VjaCBhcyAiaHR0cCIsIGEgbnVtZXJpYworICAgICAgICAjIHBvcnQgbnVtYmVyIChpbnQgb3IgbG9uZyksIG9yIE5vbmUKKyAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKEhPU1QsICJodHRwIikKKyAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKEhPU1QsIDgwKQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgODBMKQorICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgTm9uZSkKKyAgICAgICAgIyB0ZXN0IGZhbWlseSBhbmQgc29ja3R5cGUgZmlsdGVycworICAgICAgICBpbmZvcyA9IHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCBOb25lLCBzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgZm9yIGZhbWlseSwgXywgXywgXywgXyBpbiBpbmZvczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmFtaWx5LCBzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgaW5mb3MgPSBzb2NrZXQuZ2V0YWRkcmluZm8oSE9TVCwgTm9uZSwgMCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBmb3IgXywgc29ja3R5cGUsIF8sIF8sIF8gaW4gaW5mb3M6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvY2t0eXBlLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICMgdGVzdCBwcm90byBhbmQgZmxhZ3MgYXJndW1lbnRzCisgICAgICAgIHNvY2tldC5nZXRhZGRyaW5mbyhIT1NULCBOb25lLCAwLCAwLCBzb2NrZXQuU09MX1RDUCkKKyAgICAgICAgc29ja2V0LmdldGFkZHJpbmZvKEhPU1QsIE5vbmUsIDAsIDAsIDAsIHNvY2tldC5BSV9QQVNTSVZFKQorICAgICAgICAjIGEgc2VydmVyIHdpbGxpbmcgdG8gc3VwcG9ydCBib3RoIElQdjQgYW5kIElQdjYgd2lsbAorICAgICAgICAjIHVzdWFsbHkgZG8gdGhpcworICAgICAgICBzb2NrZXQuZ2V0YWRkcmluZm8oTm9uZSwgMCwgc29ja2V0LkFGX1VOU1BFQywgc29ja2V0LlNPQ0tfU1RSRUFNLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LkFJX1BBU1NJVkUpCisKKworICAgIGRlZiBjaGVja19zZW5kYWxsX2ludGVycnVwdGVkKHNlbGYsIHdpdGhfdGltZW91dCk6CisgICAgICAgICMgc29ja2V0cGFpcigpIGlzIG5vdCBzdHJpY2x5IHJlcXVpcmVkLCBidXQgaXQgbWFrZXMgdGhpbmdzIGVhc2llci4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2lnbmFsLCAnYWxhcm0nKSBvciBub3QgaGFzYXR0cihzb2NrZXQsICdzb2NrZXRwYWlyJyk6CisgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJzaWduYWwuYWxhcm0gYW5kIHNvY2tldC5zb2NrZXRwYWlyIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QiKQorICAgICAgICAjIE91ciBzaWduYWwgaGFuZGxlcnMgY2xvYmJlciB0aGUgQyBlcnJubyBieSBjYWxsaW5nIGEgbWF0aCBmdW5jdGlvbgorICAgICAgICAjIHdpdGggYW4gaW52YWxpZCBkb21haW4gdmFsdWUuCisgICAgICAgIGRlZiBva19oYW5kbGVyKCphcmdzKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYWNvc2gsIDApCisgICAgICAgIGRlZiByYWlzaW5nX2hhbmRsZXIoKmFyZ3MpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zaCwgMCkKKyAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBjLCBzID0gc29ja2V0LnNvY2tldHBhaXIoKQorICAgICAgICBvbGRfYWxhcm0gPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdBTFJNLCByYWlzaW5nX2hhbmRsZXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHdpdGhfdGltZW91dDoKKyAgICAgICAgICAgICAgICAjIEp1c3QgYWJvdmUgdGhlIG9uZSBzZWNvbmQgbWluaW11bSBmb3Igc2lnbmFsLmFsYXJtCisgICAgICAgICAgICAgICAgYy5zZXR0aW1lb3V0KDEuNSkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoWmVyb0RpdmlzaW9uRXJyb3IpOgorICAgICAgICAgICAgICAgIHNpZ25hbC5hbGFybSgxKQorICAgICAgICAgICAgICAgIGMuc2VuZGFsbChiIngiICogKDEwMjQqKjIpKQorICAgICAgICAgICAgaWYgd2l0aF90aW1lb3V0OgorICAgICAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIG9rX2hhbmRsZXIpCisgICAgICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LnRpbWVvdXQsIGMuc2VuZGFsbCwgYiJ4IiAqICgxMDI0KioyKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIG9sZF9hbGFybSkKKyAgICAgICAgICAgIGMuY2xvc2UoKQorICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9zZW5kYWxsX2ludGVycnVwdGVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3NlbmRhbGxfaW50ZXJydXB0ZWQoRmFsc2UpCisKKyAgICBkZWYgdGVzdF9zZW5kYWxsX2ludGVycnVwdGVkX3dpdGhfdGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zZW5kYWxsX2ludGVycnVwdGVkKFRydWUpCisKKyAgICBkZWYgdGVzdF9saXN0ZW5fYmFja2xvZyhzZWxmKToKKyAgICAgICAgZm9yIGJhY2tsb2cgaW4gMCwgLTE6CisgICAgICAgICAgICBzcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBzcnYuYmluZCgoSE9TVCwgMCkpCisgICAgICAgICAgICBzcnYubGlzdGVuKGJhY2tsb2cpCisgICAgICAgICAgICBzcnYuY2xvc2UoKQorCisgICAgICAgICMgSXNzdWUgMTU5ODkKKyAgICAgICAgc3J2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzcnYuYmluZCgoSE9TVCwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHNydi5saXN0ZW4sIF90ZXN0Y2FwaS5JTlRfTUFYICsgMSkKKyAgICAgICAgc3J2LmNsb3NlKCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFNVUFBPUlRTX0lQVjYsICdJUHY2IHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKKyAgICBkZWYgdGVzdF9mbG93aW5mbyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc29ja2V0LmdldG5hbWVpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoJzo6MScsMCwgMHhmZmZmZmZmZiksIDApCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUNiwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzLmJpbmQsICgnOjoxJywgMCwgLTEwKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHMuY2xvc2UoKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZCwgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBCYXNpY1RDUFRlc3QoU29ja2V0Q29ubmVjdGVkVGVzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKworICAgIGRlZiB0ZXN0UmVjdihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGxhcmdlIHJlY2VpdmUgb3ZlciBUQ1AKKyAgICAgICAgbXNnID0gc2VsZi5jbGlfY29ubi5yZWN2KDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWN2KHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKworICAgIGRlZiB0ZXN0T3ZlckZsb3dSZWN2KHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgcmVjZWl2ZSBpbiBjaHVua3Mgb3ZlciBUQ1AKKyAgICAgICAgc2VnMSA9IHNlbGYuY2xpX2Nvbm4ucmVjdihsZW4oTVNHKSAtIDMpCisgICAgICAgIHNlZzIgPSBzZWxmLmNsaV9jb25uLnJlY3YoMTAyNCkKKyAgICAgICAgbXNnID0gc2VnMSArIHNlZzIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdE92ZXJGbG93UmVjdihzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChNU0cpCisKKyAgICBkZWYgdGVzdFJlY3ZGcm9tKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgbGFyZ2UgcmVjdmZyb20oKSBvdmVyIFRDUAorICAgICAgICBtc2csIGFkZHIgPSBzZWxmLmNsaV9jb25uLnJlY3Zmcm9tKDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWN2RnJvbShzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChNU0cpCisKKyAgICBkZWYgdGVzdE92ZXJGbG93UmVjdkZyb20oc2VsZik6CisgICAgICAgICMgVGVzdGluZyByZWN2ZnJvbSgpIGluIGNodW5rcyBvdmVyIFRDUAorICAgICAgICBzZWcxLCBhZGRyID0gc2VsZi5jbGlfY29ubi5yZWN2ZnJvbShsZW4oTVNHKS0zKQorICAgICAgICBzZWcyLCBhZGRyID0gc2VsZi5jbGlfY29ubi5yZWN2ZnJvbSgxMDI0KQorICAgICAgICBtc2cgPSBzZWcxICsgc2VnMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0T3ZlckZsb3dSZWN2RnJvbShzZWxmKToKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChNU0cpCisKKyAgICBkZWYgdGVzdFNlbmRBbGwoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzZW5kYWxsKCkgd2l0aCBhIDIwNDggYnl0ZSBzdHJpbmcgb3ZlciBUQ1AKKyAgICAgICAgbXNnID0gJycKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHJlYWQgPSBzZWxmLmNsaV9jb25uLnJlY3YoMTAyNCkKKyAgICAgICAgICAgIGlmIG5vdCByZWFkOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBtc2cgKz0gcmVhZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgJ2YnICogMjA0OCkKKworICAgIGRlZiBfdGVzdFNlbmRBbGwoc2VsZik6CisgICAgICAgIGJpZ19jaHVuayA9ICdmJyAqIDIwNDgKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZGFsbChiaWdfY2h1bmspCisKKyAgICBkZWYgdGVzdEZyb21GZChzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIGZyb21mZCgpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgImZyb21mZCIpOgorICAgICAgICAgICAgcmV0dXJuICMgT24gV2luZG93cywgdGhpcyBkb2Vzbid0IGV4aXN0CisgICAgICAgIGZkID0gc2VsZi5jbGlfY29ubi5maWxlbm8oKQorICAgICAgICBzb2NrID0gc29ja2V0LmZyb21mZChmZCwgc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIG1zZyA9IHNvY2sucmVjdigxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0RnJvbUZkKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKworICAgIGRlZiB0ZXN0RHVwKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgZHVwKCkKKyAgICAgICAgc29jayA9IHNlbGYuY2xpX2Nvbm4uZHVwKCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNvY2suY2xvc2UpCisgICAgICAgIG1zZyA9IHNvY2sucmVjdigxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0RHVwKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKworICAgIGRlZiB0ZXN0U2h1dGRvd24oc2VsZik6CisgICAgICAgICMgVGVzdGluZyBzaHV0ZG93bigpCisgICAgICAgIG1zZyA9IHNlbGYuY2xpX2Nvbm4ucmVjdigxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorICAgICAgICAjIHdhaXQgZm9yIF90ZXN0U2h1dGRvd24gdG8gZmluaXNoOiBvbiBPUyBYLCB3aGVuIHRoZSBzZXJ2ZXIKKyAgICAgICAgIyBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gdGhlIGNsaWVudCBhbHNvIGJlY29tZXMgZGlzY29ubmVjdGVkLAorICAgICAgICAjIGFuZCB0aGUgY2xpZW50J3Mgc2h1dGRvd24gY2FsbCB3aWxsIGZhaWwuIChJc3N1ZSAjNDM5Ny4pCisgICAgICAgIHNlbGYuZG9uZS53YWl0KCkKKworICAgIGRlZiBfdGVzdFNodXRkb3duKHNlbGYpOgorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKE1TRykKKyAgICAgICAgIyBJc3N1ZSAxNTk4OQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLnNlcnZfY29ubi5zaHV0ZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX3Rlc3RjYXBpLklOVF9NQVggKyAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzZWxmLnNlcnZfY29ubi5zaHV0ZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMiArIChfdGVzdGNhcGkuVUlOVF9NQVggKyAxKSkKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2h1dGRvd24oMikKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEJhc2ljVURQVGVzdChUaHJlYWRlZFVEUFNvY2tldFRlc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgVGhyZWFkZWRVRFBTb2NrZXRUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKworICAgIGRlZiB0ZXN0U2VuZHRvQW5kUmVjdihzZWxmKToKKyAgICAgICAgIyBUZXN0aW5nIHNlbmR0bygpIGFuZCBSZWN2KCkgb3ZlciBVRFAKKyAgICAgICAgbXNnID0gc2VsZi5zZXJ2LnJlY3YobGVuKE1TRykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RTZW5kdG9BbmRSZWN2KHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5zZW5kdG8oTVNHLCAwLCAoSE9TVCwgc2VsZi5wb3J0KSkKKworICAgIGRlZiB0ZXN0UmVjdkZyb20oc2VsZik6CisgICAgICAgICMgVGVzdGluZyByZWN2ZnJvbSgpIG92ZXIgVURQCisgICAgICAgIG1zZywgYWRkciA9IHNlbGYuc2Vydi5yZWN2ZnJvbShsZW4oTVNHKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdFJlY3ZGcm9tKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5zZW5kdG8oTVNHLCAwLCAoSE9TVCwgc2VsZi5wb3J0KSkKKworICAgIGRlZiB0ZXN0UmVjdkZyb21OZWdhdGl2ZShzZWxmKToKKyAgICAgICAgIyBOZWdhdGl2ZSBsZW5ndGhzIHBhc3NlZCB0byByZWN2ZnJvbSBzaG91bGQgZ2l2ZSBWYWx1ZUVycm9yLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLnNlcnYucmVjdmZyb20sIC0xKQorCisgICAgZGVmIF90ZXN0UmVjdkZyb21OZWdhdGl2ZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuc2VuZHRvKE1TRywgMCwgKEhPU1QsIHNlbGYucG9ydCkpCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZCwgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBUQ1BDbG9zZXJUZXN0KFRocmVhZGVkVENQU29ja2V0VGVzdCk6CisKKyAgICBkZWYgdGVzdENsb3NlKHNlbGYpOgorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgICAgIHNkID0gc2VsZi5jbGkKKyAgICAgICAgcmVhZCwgd3JpdGUsIGVyciA9IHNlbGVjdC5zZWxlY3QoW3NkXSwgW10sIFtdLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZCwgW3NkXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZC5yZWN2KDEpLCAnJykKKworICAgIGRlZiBfdGVzdENsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5jb25uZWN0KChIT1NULCBzZWxmLnBvcnQpKQorICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEJhc2ljU29ja2V0UGFpclRlc3QoU29ja2V0UGFpclRlc3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgU29ja2V0UGFpclRlc3QuX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT1tZXRob2ROYW1lKQorCisgICAgZGVmIHRlc3RSZWN2KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLnNlcnYucmVjdigxMDI0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgZGVmIF90ZXN0UmVjdihzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuc2VuZChNU0cpCisKKyAgICBkZWYgdGVzdFNlbmQoc2VsZik6CisgICAgICAgIHNlbGYuc2Vydi5zZW5kKE1TRykKKworICAgIGRlZiBfdGVzdFNlbmQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuY2xpLnJlY3YoMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIE5vbkJsb2NraW5nVENQVGVzdHMoVGhyZWFkZWRUQ1BTb2NrZXRUZXN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIFRocmVhZGVkVENQU29ja2V0VGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisKKyAgICBkZWYgdGVzdFNldEJsb2NraW5nKHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgd2hldGhlciBzZXQgYmxvY2tpbmcgd29ya3MKKyAgICAgICAgc2VsZi5zZXJ2LnNldGJsb2NraW5nKFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuc2Vydi5nZXR0aW1lb3V0KCkpCisgICAgICAgIHNlbGYuc2Vydi5zZXRibG9ja2luZyhGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnYuZ2V0dGltZW91dCgpLCAwLjApCisgICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoZW5kIC0gc3RhcnQpIDwgMS4wLCAiRXJyb3Igc2V0dGluZyBub24tYmxvY2tpbmcgbW9kZS4iKQorICAgICAgICAjIElzc3VlIDE1OTg5CisgICAgICAgIGlmIF90ZXN0Y2FwaS5VSU5UX01BWCA8IF90ZXN0Y2FwaS5VTE9OR19NQVg6CisgICAgICAgICAgICBzZWxmLnNlcnYuc2V0YmxvY2tpbmcoX3Rlc3RjYXBpLlVJTlRfTUFYICsgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHNlbGYuc2Vydi5nZXR0aW1lb3V0KCkpCisKKyAgICBkZWYgX3Rlc3RTZXRCbG9ja2luZyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RBY2NlcHQoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBub24tYmxvY2tpbmcgYWNjZXB0CisgICAgICAgIHNlbGYuc2Vydi5zZXRibG9ja2luZygwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIHRyeWluZyB0byBkbyBub24tYmxvY2tpbmcgYWNjZXB0LiIpCisgICAgICAgIHJlYWQsIHdyaXRlLCBlcnIgPSBzZWxlY3Quc2VsZWN0KFtzZWxmLnNlcnZdLCBbXSwgW10pCisgICAgICAgIGlmIHNlbGYuc2VydiBpbiByZWFkOgorICAgICAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIHRyeWluZyB0byBkbyBhY2NlcHQgYWZ0ZXIgc2VsZWN0LiIpCisKKyAgICBkZWYgX3Rlc3RBY2NlcHQoc2VsZik6CisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBzZWxmLmNsaS5jb25uZWN0KChIT1NULCBzZWxmLnBvcnQpKQorCisgICAgZGVmIHRlc3RDb25uZWN0KHNlbGYpOgorICAgICAgICAjIFRlc3Rpbmcgbm9uLWJsb2NraW5nIGNvbm5lY3QKKyAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICBjb25uLmNsb3NlKCkKKworICAgIGRlZiBfdGVzdENvbm5lY3Qoc2VsZik6CisgICAgICAgIHNlbGYuY2xpLnNldHRpbWVvdXQoMTApCisgICAgICAgIHNlbGYuY2xpLmNvbm5lY3QoKEhPU1QsIHNlbGYucG9ydCkpCisKKyAgICBkZWYgdGVzdFJlY3Yoc2VsZik6CisgICAgICAgICMgVGVzdGluZyBub24tYmxvY2tpbmcgcmVjdgorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGNvbm4uc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gY29ubi5yZWN2KGxlbihNU0cpKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciB0cnlpbmcgdG8gZG8gbm9uLWJsb2NraW5nIHJlY3YuIikKKyAgICAgICAgcmVhZCwgd3JpdGUsIGVyciA9IHNlbGVjdC5zZWxlY3QoW2Nvbm5dLCBbXSwgW10pCisgICAgICAgIGlmIGNvbm4gaW4gcmVhZDoKKyAgICAgICAgICAgIG1zZyA9IGNvbm4ucmVjdihsZW4oTVNHKSkKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRXJyb3IgZHVyaW5nIHNlbGVjdCBjYWxsIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQuIikKKworICAgIGRlZiBfdGVzdFJlY3Yoc2VsZik6CisgICAgICAgIHNlbGYuY2xpLmNvbm5lY3QoKEhPU1QsIHNlbGYucG9ydCkpCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgICAgICBzZWxmLmNsaS5zZW5kKE1TRykKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKFNvY2tldENvbm5lY3RlZFRlc3QpOgorCisgICAgYnVmc2l6ZSA9IC0xICMgVXNlIGRlZmF1bHQgYnVmZmVyIHNpemUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIFNvY2tldENvbm5lY3RlZFRlc3QuX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT1tZXRob2ROYW1lKQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0LnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuc2Vydl9maWxlID0gc2VsZi5jbGlfY29ubi5tYWtlZmlsZSgncmInLCBzZWxmLmJ1ZnNpemUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc2Vydl9maWxlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc2Vydl9maWxlLmNsb3NlZCkKKyAgICAgICAgU29ja2V0Q29ubmVjdGVkVGVzdC50ZWFyRG93bihzZWxmKQorICAgICAgICBzZWxmLnNlcnZfZmlsZSA9IE5vbmUKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgU29ja2V0Q29ubmVjdGVkVGVzdC5jbGllbnRTZXRVcChzZWxmKQorICAgICAgICBzZWxmLmNsaV9maWxlID0gc2VsZi5zZXJ2X2Nvbm4ubWFrZWZpbGUoJ3diJykKKworICAgIGRlZiBjbGllbnRUZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGlfZmlsZS5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNsaV9maWxlLmNsb3NlZCkKKyAgICAgICAgc2VsZi5jbGlfZmlsZSA9IE5vbmUKKyAgICAgICAgU29ja2V0Q29ubmVjdGVkVGVzdC5jbGllbnRUZWFyRG93bihzZWxmKQorCisgICAgZGVmIHRlc3RTbWFsbFJlYWQoc2VsZik6CisgICAgICAgICMgUGVyZm9ybWluZyBzbWFsbCBmaWxlIHJlYWQgdGVzdAorICAgICAgICBmaXJzdF9zZWcgPSBzZWxmLnNlcnZfZmlsZS5yZWFkKGxlbihNU0cpLTMpCisgICAgICAgIHNlY29uZF9zZWcgPSBzZWxmLnNlcnZfZmlsZS5yZWFkKDMpCisgICAgICAgIG1zZyA9IGZpcnN0X3NlZyArIHNlY29uZF9zZWcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdFNtYWxsUmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5jbGlfZmlsZS53cml0ZShNU0cpCisgICAgICAgIHNlbGYuY2xpX2ZpbGUuZmx1c2goKQorCisgICAgZGVmIHRlc3RGdWxsUmVhZChzZWxmKToKKyAgICAgICAgIyByZWFkIHVudGlsIEVPRgorICAgICAgICBtc2cgPSBzZWxmLnNlcnZfZmlsZS5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIGRlZiBfdGVzdEZ1bGxSZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKE1TRykKKyAgICAgICAgc2VsZi5jbGlfZmlsZS5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFVuYnVmZmVyZWRSZWFkKHNlbGYpOgorICAgICAgICAjIFBlcmZvcm1pbmcgdW5idWZmZXJlZCBmaWxlIHJlYWQgdGVzdAorICAgICAgICBidWYgPSAnJworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgY2hhciA9IHNlbGYuc2Vydl9maWxlLnJlYWQoMSkKKyAgICAgICAgICAgIGlmIG5vdCBjaGFyOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBidWYgKz0gY2hhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgTVNHKQorCisgICAgZGVmIF90ZXN0VW5idWZmZXJlZFJlYWQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpX2ZpbGUud3JpdGUoTVNHKQorICAgICAgICBzZWxmLmNsaV9maWxlLmZsdXNoKCkKKworICAgIGRlZiB0ZXN0UmVhZGxpbmUoc2VsZik6CisgICAgICAgICMgUGVyZm9ybWluZyBmaWxlIHJlYWRsaW5lIHRlc3QKKyAgICAgICAgbGluZSA9IHNlbGYuc2Vydl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWFkbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGlfZmlsZS53cml0ZShNU0cpCisgICAgICAgIHNlbGYuY2xpX2ZpbGUuZmx1c2goKQorCisgICAgZGVmIHRlc3RSZWFkbGluZUFmdGVyUmVhZChzZWxmKToKKyAgICAgICAgYV9iYWxvb19pcyA9IHNlbGYuc2Vydl9maWxlLnJlYWQobGVuKCJBIGJhbG9vIGlzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkEgYmFsb28gaXMiLCBhX2JhbG9vX2lzKQorICAgICAgICBfYV9iZWFyID0gc2VsZi5zZXJ2X2ZpbGUucmVhZChsZW4oIiBhIGJlYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiIGEgYmVhciIsIF9hX2JlYXIpCisgICAgICAgIGxpbmUgPSBzZWxmLnNlcnZfZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlxuIiwgbGluZSkKKyAgICAgICAgbGluZSA9IHNlbGYuc2Vydl9maWxlLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiQSBCQUxPTyBJUyBBIEJFQVIuXG4iLCBsaW5lKQorICAgICAgICBsaW5lID0gc2VsZi5zZXJ2X2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE1TRywgbGluZSkKKworICAgIGRlZiBfdGVzdFJlYWRsaW5lQWZ0ZXJSZWFkKHNlbGYpOgorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKCJBIGJhbG9vIGlzIGEgYmVhclxuIikKKyAgICAgICAgc2VsZi5jbGlfZmlsZS53cml0ZSgiQSBCQUxPTyBJUyBBIEJFQVIuXG4iKQorICAgICAgICBzZWxmLmNsaV9maWxlLndyaXRlKE1TRykKKyAgICAgICAgc2VsZi5jbGlfZmlsZS5mbHVzaCgpCisKKyAgICBkZWYgdGVzdFJlYWRsaW5lQWZ0ZXJSZWFkTm9OZXdsaW5lKHNlbGYpOgorICAgICAgICBlbmRfb2ZfID0gc2VsZi5zZXJ2X2ZpbGUucmVhZChsZW4oIkVuZCBPZiAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiRW5kIE9mICIsIGVuZF9vZl8pCisgICAgICAgIGxpbmUgPSBzZWxmLnNlcnZfZmlsZS5yZWFkbGluZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkxpbmUiLCBsaW5lKQorCisgICAgZGVmIF90ZXN0UmVhZGxpbmVBZnRlclJlYWROb05ld2xpbmUoc2VsZik6CisgICAgICAgIHNlbGYuY2xpX2ZpbGUud3JpdGUoIkVuZCBPZiBMaW5lIikKKworICAgIGRlZiB0ZXN0Q2xvc2VkQXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLnNlcnZfZmlsZS5jbG9zZWQpCisKKyAgICBkZWYgX3Rlc3RDbG9zZWRBdHRyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuY2xpX2ZpbGUuY2xvc2VkKQorCisKK2NsYXNzIEZpbGVPYmplY3RJbnRlcnJ1cHRlZFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIGZpbGUgb2JqZWN0IGNvcnJlY3RseSBoYW5kbGVzIEVJTlRSIGludGVybmFsbHkuIiIiCisKKyAgICBjbGFzcyBNb2NrU29ja2V0KG9iamVjdCk6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZWN2X2Z1bmNzPSgpKToKKyAgICAgICAgICAgICMgQSBnZW5lcmF0b3IgdGhhdCByZXR1cm5zIGNhbGxhYmxlcyB0aGF0IHdlJ2xsIGNhbGwgZm9yIGVhY2gKKyAgICAgICAgICAgICMgY2FsbCB0byByZWN2KCkuCisgICAgICAgICAgICBzZWxmLl9yZWN2X3N0ZXAgPSBpdGVyKHJlY3ZfZnVuY3MpCisKKyAgICAgICAgZGVmIHJlY3Yoc2VsZiwgc2l6ZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVjdl9zdGVwLm5leHQoKSgpCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIF9yYWlzZV9laW50cigpOgorICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoZXJybm8uRUlOVFIpCisKKyAgICBkZWYgX3Rlc3RfcmVhZGxpbmUoc2VsZiwgc2l6ZT0tMSwgKiprd2FyZ3MpOgorICAgICAgICBtb2NrX3NvY2sgPSBzZWxmLk1vY2tTb2NrZXQocmVjdl9mdW5jcz1bCisgICAgICAgICAgICAgICAgbGFtYmRhIDogIlRoaXMgaXMgdGhlIGZpcnN0IGxpbmVcbkFuZCB0aGUgc2VjIiwKKyAgICAgICAgICAgICAgICBzZWxmLl9yYWlzZV9laW50ciwKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAib25kIGxpbmUgaXMgaGVyZVxuIiwKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiIiwKKyAgICAgICAgICAgIF0pCisgICAgICAgIGZvID0gc29ja2V0Ll9maWxlb2JqZWN0KG1vY2tfc29jaywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZGxpbmUoc2l6ZSksICJUaGlzIGlzIHRoZSBmaXJzdCBsaW5lXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnJlYWRsaW5lKHNpemUpLCAiQW5kIHRoZSBzZWNvbmQgbGluZSBpcyBoZXJlXG4iKQorCisgICAgZGVmIF90ZXN0X3JlYWQoc2VsZiwgc2l6ZT0tMSwgKiprd2FyZ3MpOgorICAgICAgICBtb2NrX3NvY2sgPSBzZWxmLk1vY2tTb2NrZXQocmVjdl9mdW5jcz1bCisgICAgICAgICAgICAgICAgbGFtYmRhIDogIlRoaXMgaXMgdGhlIGZpcnN0IGxpbmVcbkFuZCB0aGUgc2VjIiwKKyAgICAgICAgICAgICAgICBzZWxmLl9yYWlzZV9laW50ciwKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAib25kIGxpbmUgaXMgaGVyZVxuIiwKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiIiwKKyAgICAgICAgICAgIF0pCisgICAgICAgIGZvID0gc29ja2V0Ll9maWxlb2JqZWN0KG1vY2tfc29jaywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZChzaXplKSwgIlRoaXMgaXMgdGhlIGZpcnN0IGxpbmVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkFuZCB0aGUgc2Vjb25kIGxpbmUgaXMgaGVyZVxuIikKKworICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmUoKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWRsaW5lKHNpemU9MTAwKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWQoKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWQoc2l6ZT0xMDApCisKKyAgICBkZWYgdGVzdF93aXRoXzFrX2J1ZmZlcihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZShidWZzaXplPTEwMjQpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZGxpbmUoc2l6ZT0xMDAsIGJ1ZnNpemU9MTAyNCkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkKGJ1ZnNpemU9MTAyNCkKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkKHNpemU9MTAwLCBidWZzaXplPTEwMjQpCisKKyAgICBkZWYgX3Rlc3RfcmVhZGxpbmVfbm9fYnVmZmVyKHNlbGYsIHNpemU9LTEpOgorICAgICAgICBtb2NrX3NvY2sgPSBzZWxmLk1vY2tTb2NrZXQocmVjdl9mdW5jcz1bCisgICAgICAgICAgICAgICAgbGFtYmRhIDogImFhIiwKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiXG4iLAorICAgICAgICAgICAgICAgIGxhbWJkYSA6ICJCQiIsCisgICAgICAgICAgICAgICAgc2VsZi5fcmFpc2VfZWludHIsCisgICAgICAgICAgICAgICAgbGFtYmRhIDogImJiIiwKKyAgICAgICAgICAgICAgICBsYW1iZGEgOiAiIiwKKyAgICAgICAgICAgIF0pCisgICAgICAgIGZvID0gc29ja2V0Ll9maWxlb2JqZWN0KG1vY2tfc29jaywgYnVmc2l6ZT0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnJlYWRsaW5lKHNpemUpLCAiYWFcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm8ucmVhZGxpbmUoc2l6ZSksICJCQmJiIikKKworICAgIGRlZiB0ZXN0X25vX2J1ZmZlcihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkbGluZV9ub19idWZmZXIoKQorICAgICAgICBzZWxmLl90ZXN0X3JlYWRsaW5lX25vX2J1ZmZlcihzaXplPTQpCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZChidWZzaXplPTApCisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZChzaXplPTEwMCwgYnVmc2l6ZT0wKQorCisKK2NsYXNzIFVuYnVmZmVyZWRGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZShGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZSk6CisKKyAgICAiIiJSZXBlYXQgdGhlIHRlc3RzIGZyb20gRmlsZU9iamVjdENsYXNzVGVzdENhc2Ugd2l0aCBidWZzaXplPT0wLgorCisgICAgSW4gdGhpcyBjYXNlIChhbmQgaW4gdGhpcyBjYXNlIG9ubHkpLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8KKyAgICBjcmVhdGUgYSBmaWxlIG9iamVjdCwgcmVhZCBhIGxpbmUgZnJvbSBpdCwgY3JlYXRlIGFub3RoZXIgZmlsZQorICAgIG9iamVjdCwgcmVhZCBhbm90aGVyIGxpbmUgZnJvbSBpdCwgd2l0aG91dCBsb3NzIG9mIGRhdGEgaW4gdGhlCisgICAgZmlyc3QgZmlsZSBvYmplY3QncyBidWZmZXIuICBOb3RlIHRoYXQgaHR0cGxpYiByZWxpZXMgb24gdGhpcworICAgIHdoZW4gcmVhZGluZyBtdWx0aXBsZSByZXF1ZXN0cyBmcm9tIHRoZSBzYW1lIHNvY2tldC4iIiIKKworICAgIGJ1ZnNpemUgPSAwICMgVXNlIHVuYnVmZmVyZWQgbW9kZQorCisgICAgZGVmIHRlc3RVbmJ1ZmZlcmVkUmVhZGxpbmUoc2VsZik6CisgICAgICAgICMgUmVhZCBhIGxpbmUsIGNyZWF0ZSBhIG5ldyBmaWxlIG9iamVjdCwgcmVhZCBhbm90aGVyIGxpbmUgd2l0aCBpdAorICAgICAgICBsaW5lID0gc2VsZi5zZXJ2X2ZpbGUucmVhZGxpbmUoKSAjIGZpcnN0IGxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCAiQS4gIiArIE1TRykgIyBmaXJzdCBsaW5lCisgICAgICAgIHNlbGYuc2Vydl9maWxlID0gc2VsZi5jbGlfY29ubi5tYWtlZmlsZSgncmInLCAwKQorICAgICAgICBsaW5lID0gc2VsZi5zZXJ2X2ZpbGUucmVhZGxpbmUoKSAjIHNlY29uZCBsaW5lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgIkIuICIgKyBNU0cpICMgc2Vjb25kIGxpbmUKKworICAgIGRlZiBfdGVzdFVuYnVmZmVyZWRSZWFkbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5jbGlfZmlsZS53cml0ZSgiQS4gIiArIE1TRykKKyAgICAgICAgc2VsZi5jbGlfZmlsZS53cml0ZSgiQi4gIiArIE1TRykKKyAgICAgICAgc2VsZi5jbGlfZmlsZS5mbHVzaCgpCisKK2NsYXNzIExpbmVCdWZmZXJlZEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKToKKworICAgIGJ1ZnNpemUgPSAxICMgRGVmYXVsdC1idWZmZXJlZCBmb3IgcmVhZGluZzsgbGluZS1idWZmZXJlZCBmb3Igd3JpdGluZworCisgICAgY2xhc3MgU29ja2V0TWVtbyhvYmplY3QpOgorICAgICAgICAiIiJBIHdyYXBwZXIgdG8ga2VlcCB0cmFjayBvZiBzZW50IGRhdGEsIG5lZWRlZCB0byBleGFtaW5lIHdyaXRlIGJlaGF2aW91ciIiIgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc29jayk6CisgICAgICAgICAgICBzZWxmLl9zb2NrID0gc29jaworICAgICAgICAgICAgc2VsZi5zZW50ID0gW10KKworICAgICAgICBkZWYgc2VuZChzZWxmLCBkYXRhLCBmbGFncz0wKToKKyAgICAgICAgICAgIG4gPSBzZWxmLl9zb2NrLnNlbmQoZGF0YSwgZmxhZ3MpCisgICAgICAgICAgICBzZWxmLnNlbnQuYXBwZW5kKGRhdGFbOm5dKQorICAgICAgICAgICAgcmV0dXJuIG4KKworICAgICAgICBkZWYgc2VuZGFsbChzZWxmLCBkYXRhLCBmbGFncz0wKToKKyAgICAgICAgICAgIHNlbGYuX3NvY2suc2VuZGFsbChkYXRhLCBmbGFncykKKyAgICAgICAgICAgIHNlbGYuc2VudC5hcHBlbmQoZGF0YSkKKworICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9zb2NrLCBhdHRyKQorCisgICAgICAgIGRlZiBnZXRzZW50KHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIFtlLnRvYnl0ZXMoKSBpZiBpc2luc3RhbmNlKGUsIG1lbW9yeXZpZXcpIGVsc2UgZSBmb3IgZSBpbiBzZWxmLnNlbnRdCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlLnNldFVwKHNlbGYpCisgICAgICAgIHNlbGYuc2Vydl9maWxlLl9zb2NrID0gc2VsZi5Tb2NrZXRNZW1vKHNlbGYuc2Vydl9maWxlLl9zb2NrKQorCisgICAgZGVmIHRlc3RMaW5lYnVmZmVyZWRXcml0ZShzZWxmKToKKyAgICAgICAgIyBXcml0ZSB0d28gbGluZXMsIGluIHNtYWxsIGNodW5rcworICAgICAgICBtc2cgPSBNU0cuc3RyaXAoKQorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgbXNnLAorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgbXNnCisKKyAgICAgICAgIyBzZWNvbmQgbGluZToKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zZXJ2X2ZpbGUsIG1zZywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zZXJ2X2ZpbGUsIG1zZywKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zZXJ2X2ZpbGUsIG1zZworCisgICAgICAgICMgdGhpcmQgbGluZQorICAgICAgICBwcmludCA+PiBzZWxmLnNlcnZfZmlsZSwgJycKKworICAgICAgICBzZWxmLnNlcnZfZmlsZS5mbHVzaCgpCisKKyAgICAgICAgbXNnMSA9ICIlcyAlc1xuIiUobXNnLCBtc2cpCisgICAgICAgIG1zZzIgPSAgIiVzICVzICVzXG4iJShtc2csIG1zZywgbXNnKQorICAgICAgICBtc2czID0gICJcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNlcnZfZmlsZS5fc29jay5nZXRzZW50KCksIFttc2cxLCBtc2cyLCBtc2czXSkKKworICAgIGRlZiBfdGVzdExpbmVidWZmZXJlZFdyaXRlKHNlbGYpOgorICAgICAgICBtc2cgPSBNU0cuc3RyaXAoKQorICAgICAgICBtc2cxID0gIiVzICVzXG4iJShtc2csIG1zZykKKyAgICAgICAgbXNnMiA9ICAiJXMgJXMgJXNcbiIlKG1zZywgbXNnLCBtc2cpCisgICAgICAgIG1zZzMgPSAgIlxuIgorICAgICAgICBsMSA9IHNlbGYuY2xpX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwxLCBtc2cxKQorICAgICAgICBsMiA9IHNlbGYuY2xpX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwyLCBtc2cyKQorICAgICAgICBsMyA9IHNlbGYuY2xpX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwzLCBtc2czKQorCisKK2NsYXNzIFNtYWxsQnVmZmVyZWRGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZShGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZSk6CisKKyAgICBidWZzaXplID0gMiAjIEV4ZXJjaXNlIHRoZSBidWZmZXJpbmcgY29kZQorCisKK2NsYXNzIE5ldHdvcmtDb25uZWN0aW9uVGVzdChvYmplY3QpOgorICAgICIiIlByb3ZlIG5ldHdvcmsgY29ubmVjdGlvbi4iIiIKKyAgICBkZWYgY2xpZW50U2V0VXAoc2VsZik6CisgICAgICAgICMgV2UncmUgaW5oZXJpdGVkIGJlbG93IGJ5IEJhc2ljVENQVGVzdDIsIHdoaWNoIGFsc28gaW5oZXJpdHMKKyAgICAgICAgIyBCYXNpY1RDUFRlc3QsIHdoaWNoIGRlZmluZXMgc2VsZi5wb3J0IHJlZmVyZW5jZWQgYmVsb3cuCisgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpKQorICAgICAgICBzZWxmLnNlcnZfY29ubiA9IHNlbGYuY2xpCisKK2NsYXNzIEJhc2ljVENQVGVzdDIoTmV0d29ya0Nvbm5lY3Rpb25UZXN0LCBCYXNpY1RDUFRlc3QpOgorICAgICIiIlRlc3RzIHRoYXQgTmV0d29ya0Nvbm5lY3Rpb24gZG9lcyBub3QgYnJlYWsgZXhpc3RpbmcgVENQIGZ1bmN0aW9uYWxpdHkuCisgICAgIiIiCisKK2NsYXNzIE5ldHdvcmtDb25uZWN0aW9uTm9TZXJ2ZXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNsYXNzIE1vY2tTb2NrZXQoc29ja2V0LnNvY2tldCk6CisgICAgICAgIGRlZiBjb25uZWN0KHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIHJhaXNlIHNvY2tldC50aW1lb3V0KCd0aW1lZCBvdXQnKQorCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgbW9ja2VkX3NvY2tldF9tb2R1bGUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHNvY2tldCB3aGljaCB0aW1lcyBvdXQgb24gY29ubmVjdCIiIgorICAgICAgICBvbGRfc29ja2V0ID0gc29ja2V0LnNvY2tldAorICAgICAgICBzb2NrZXQuc29ja2V0ID0gc2VsZi5Nb2NrU29ja2V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzb2NrZXQuc29ja2V0ID0gb2xkX3NvY2tldAorCisgICAgZGVmIHRlc3RfY29ubmVjdChzZWxmKToKKyAgICAgICAgcG9ydCA9IHRlc3Rfc3VwcG9ydC5maW5kX3VudXNlZF9wb3J0KCkKKyAgICAgICAgY2xpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoY2xpLmNsb3NlKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvcikgYXMgY206CisgICAgICAgICAgICBjbGkuY29ubmVjdCgoSE9TVCwgcG9ydCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmVycm5vLCBlcnJuby5FQ09OTlJFRlVTRUQpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfY29ubmVjdGlvbihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjOTc5MjogZXJyb3JzIHJhaXNlZCBieSBjcmVhdGVfY29ubmVjdGlvbigpIHNob3VsZCBoYXZlCisgICAgICAgICMgYSBwcm9wZXIgZXJybm8gYXR0cmlidXRlLgorICAgICAgICBwb3J0ID0gdGVzdF9zdXBwb3J0LmZpbmRfdW51c2VkX3BvcnQoKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvcikgYXMgY206CisgICAgICAgICAgICBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHBvcnQpKQorCisgICAgICAgICMgSXNzdWUgIzE2MjU3OiBjcmVhdGVfY29ubmVjdGlvbigpIGNhbGxzIGdldGFkZHJpbmZvKCkgYWdhaW5zdAorICAgICAgICAjICdsb2NhbGhvc3QnLiAgVGhpcyBtYXkgcmVzdWx0IGluIGFuIElQVjYgYWRkciBiZWluZyByZXR1cm5lZAorICAgICAgICAjIGFzIHdlbGwgYXMgYW4gSVBWNCBvbmU6CisgICAgICAgICMgICA+Pj4gc29ja2V0LmdldGFkZHJpbmZvKCdsb2NhbGhvc3QnLCBwb3J0LCAwLCBTT0NLX1NUUkVBTSkKKyAgICAgICAgIyAgID4+PiBbKDIsICAyLCAwLCAnJywgKCcxMjcuMC4wLjEnLCA0MTIzMCkpLAorICAgICAgICAjICAgICAgICAoMjYsIDIsIDAsICcnLCAoJzo6MScsIDQxMjMwLCAwLCAwKSldCisgICAgICAgICMKKyAgICAgICAgIyBjcmVhdGVfY29ubmVjdGlvbigpIGVudW1lcmF0ZXMgdGhyb3VnaCBhbGwgdGhlIGFkZHJlc3NlcyByZXR1cm5lZAorICAgICAgICAjIGFuZCBpZiBpdCBkb2Vzbid0IHN1Y2Nlc3NmdWxseSBiaW5kIHRvIGFueSBvZiB0aGVtLCBpdCBwcm9wYWdhdGVzCisgICAgICAgICMgdGhlIGxhc3QgZXhjZXB0aW9uIGl0IGVuY291bnRlcmVkLgorICAgICAgICAjCisgICAgICAgICMgT24gU29sYXJpcywgRU5FVFVOUkVBQ0ggaXMgcmV0dXJuZWQgaW4gdGhpcyBjaXJjdW1zdGFuY2UgaW5zdGVhZAorICAgICAgICAjIG9mIEVDT05OUkVGVVNFRC4gIFNvLCBpZiB0aGF0IGVycm5vIGV4aXN0cywgYWRkIGl0IHRvIG91ciBsaXN0IG9mCisgICAgICAgICMgZXhwZWN0ZWQgZXJybm9zLgorICAgICAgICBleHBlY3RlZF9lcnJub3MgPSBbIGVycm5vLkVDT05OUkVGVVNFRCwgXQorICAgICAgICBpZiBoYXNhdHRyKGVycm5vLCAnRU5FVFVOUkVBQ0gnKToKKyAgICAgICAgICAgIGV4cGVjdGVkX2Vycm5vcy5hcHBlbmQoZXJybm8uRU5FVFVOUkVBQ0gpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJbihjbS5leGNlcHRpb24uZXJybm8sIGV4cGVjdGVkX2Vycm5vcykKKworICAgIGRlZiB0ZXN0X2NyZWF0ZV9jb25uZWN0aW9uX3RpbWVvdXQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzk3OTI6IGNyZWF0ZV9jb25uZWN0aW9uKCkgc2hvdWxkIG5vdCByZWNhc3QgdGltZW91dCBlcnJvcnMKKyAgICAgICAgIyBhcyBnZW5lcmljIHNvY2tldCBlcnJvcnMuCisgICAgICAgIHdpdGggc2VsZi5tb2NrZWRfc29ja2V0X21vZHVsZSgpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQudGltZW91dCk6CisgICAgICAgICAgICAgICAgc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCAxMjM0KSkKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb25BdHRyaWJ1dGVzVGVzdChTb2NrZXRUQ1BUZXN0LCBUaHJlYWRhYmxlVGVzdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICBTb2NrZXRUQ1BUZXN0Ll9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9bWV0aG9kTmFtZSkKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuX19pbml0X18oc2VsZikKKworICAgIGRlZiBjbGllbnRTZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zb3VyY2VfcG9ydCA9IHRlc3Rfc3VwcG9ydC5maW5kX3VudXNlZF9wb3J0KCkKKworICAgIGRlZiBjbGllbnRUZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jbGkuY2xvc2UoKQorICAgICAgICBzZWxmLmNsaSA9IE5vbmUKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuY2xpZW50VGVhckRvd24oc2VsZikKKworICAgIGRlZiBfanVzdEFjY2VwdChzZWxmKToKKyAgICAgICAgY29ubiwgYWRkciA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICBjb25uLmNsb3NlKCkKKworICAgIHRlc3RGYW1pbHkgPSBfanVzdEFjY2VwdAorICAgIGRlZiBfdGVzdEZhbWlseShzZWxmKToKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHNlbGYucG9ydCksIHRpbWVvdXQ9MzApCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLmNsaS5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaS5mYW1pbHksIDIpCisKKyAgICB0ZXN0U291cmNlQWRkcmVzcyA9IF9qdXN0QWNjZXB0CisgICAgZGVmIF90ZXN0U291cmNlQWRkcmVzcyhzZWxmKToKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHNlbGYucG9ydCksIHRpbWVvdXQ9MzAsCisgICAgICAgICAgICAgICAgc291cmNlX2FkZHJlc3M9KCcnLCBzZWxmLnNvdXJjZV9wb3J0KSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuY2xpLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY2xpLmdldHNvY2tuYW1lKClbMV0sIHNlbGYuc291cmNlX3BvcnQpCisgICAgICAgICMgVGhlIHBvcnQgbnVtYmVyIGJlaW5nIHVzZWQgaXMgc3VmZmljaWVudCB0byBzaG93IHRoYXQgdGhlIGJpbmQoKQorICAgICAgICAjIGNhbGwgaGFwcGVuZWQuCisKKyAgICB0ZXN0VGltZW91dERlZmF1bHQgPSBfanVzdEFjY2VwdAorICAgIGRlZiBfdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgorICAgICAgICAjIHBhc3Npbmcgbm8gZXhwbGljaXQgdGltZW91dCB1c2VzIHNvY2tldCdzIGdsb2JhbCBkZWZhdWx0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoNDIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuY2xpLmNsb3NlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGkuZ2V0dGltZW91dCgpLCA0MikKKworICAgIHRlc3RUaW1lb3V0Tm9uZSA9IF9qdXN0QWNjZXB0CisgICAgZGVmIF90ZXN0VGltZW91dE5vbmUoc2VsZik6CisgICAgICAgICMgTm9uZSB0aW1lb3V0IG1lYW5zIHRoZSBzYW1lIGFzIHNvY2suc2V0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSwgdGltZW91dD1Ob25lKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHNlbGYuY2xpLmNsb3NlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGkuZ2V0dGltZW91dCgpLCBOb25lKQorCisgICAgdGVzdFRpbWVvdXRWYWx1ZU5hbWVkID0gX2p1c3RBY2NlcHQKKyAgICBkZWYgX3Rlc3RUaW1lb3V0VmFsdWVOYW1lZChzZWxmKToKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKEhPU1QsIHNlbGYucG9ydCksIHRpbWVvdXQ9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGkuZ2V0dGltZW91dCgpLCAzMCkKKworICAgIHRlc3RUaW1lb3V0VmFsdWVOb25hbWVkID0gX2p1c3RBY2NlcHQKKyAgICBkZWYgX3Rlc3RUaW1lb3V0VmFsdWVOb25hbWVkKHNlbGYpOgorICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSwgMzApCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzZWxmLmNsaS5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNsaS5nZXR0aW1lb3V0KCksIDMwKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWQsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgTmV0d29ya0Nvbm5lY3Rpb25CZWhhdmlvdXJUZXN0KFNvY2tldFRDUFRlc3QsIFRocmVhZGFibGVUZXN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPSdydW5UZXN0Jyk6CisgICAgICAgIFNvY2tldFRDUFRlc3QuX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT1tZXRob2ROYW1lKQorICAgICAgICBUaHJlYWRhYmxlVGVzdC5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIGNsaWVudFNldFVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgY2xpZW50VGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY2xpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jbGkgPSBOb25lCisgICAgICAgIFRocmVhZGFibGVUZXN0LmNsaWVudFRlYXJEb3duKHNlbGYpCisKKyAgICBkZWYgdGVzdEluc2lkZVRpbWVvdXQoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLnNlcnYuYWNjZXB0KCkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGNvbm4uY2xvc2UpCisgICAgICAgIHRpbWUuc2xlZXAoMykKKyAgICAgICAgY29ubi5zZW5kKCJkb25lISIpCisgICAgdGVzdE91dHNpZGVUaW1lb3V0ID0gdGVzdEluc2lkZVRpbWVvdXQKKworICAgIGRlZiBfdGVzdEluc2lkZVRpbWVvdXQoc2VsZik6CisgICAgICAgIHNlbGYuY2xpID0gc29jayA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSkKKyAgICAgICAgZGF0YSA9IHNvY2sucmVjdig1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICJkb25lISIpCisKKyAgICBkZWYgX3Rlc3RPdXRzaWRlVGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5jbGkgPSBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpLCB0aW1lb3V0PTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0LCBsYW1iZGE6IHNvY2sucmVjdig1KSkKKworCitjbGFzcyBVcmxsaWIyRmlsZW9iamVjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyB1cmxsaWIyLkhUVFBIYW5kbGVyIGhhcyAiYm9ycm93ZWQiIHNvY2tldC5fZmlsZW9iamVjdCwgYW5kIHJlcXVpcmVzIHRoYXQKKyAgICAjIGl0IGNsb3NlIHRoZSBzb2NrZXQgaWYgdGhlIGNsb3NlIGMndG9yIGFyZ3VtZW50IGlzIHRydWUKKworICAgIGRlZiB0ZXN0Q2xvc2Uoc2VsZik6CisgICAgICAgIGNsYXNzIE1vY2tTb2NrZXQ6CisgICAgICAgICAgICBjbG9zZWQgPSBGYWxzZQorICAgICAgICAgICAgZGVmIGZsdXNoKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgY2xvc2Uoc2VsZik6IHNlbGYuY2xvc2VkID0gVHJ1ZQorCisgICAgICAgICMgbXVzdCBub3QgY2xvc2UgdW5sZXNzIHdlIHJlcXVlc3QgaXQ6IHRoZSBvcmlnaW5hbCB1c2Ugb2YgX2ZpbGVvYmplY3QKKyAgICAgICAgIyBieSBtb2R1bGUgc29ja2V0IHJlcXVpcmVzIHRoYXQgdGhlIHVuZGVybHlpbmcgc29ja2V0IG5vdCBiZSBjbG9zZWQgdW50aWwKKyAgICAgICAgIyB0aGUgX3NvY2tldG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIF9maWxlb2JqZWN0IGlzIGNsb3NlZAorICAgICAgICBzID0gTW9ja1NvY2tldCgpCisgICAgICAgIGYgPSBzb2NrZXQuX2ZpbGVvYmplY3QocykKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgcy5jbG9zZWQpCisKKyAgICAgICAgcyA9IE1vY2tTb2NrZXQoKQorICAgICAgICBmID0gc29ja2V0Ll9maWxlb2JqZWN0KHMsIGNsb3NlPVRydWUpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5jbG9zZWQpCisKK2NsYXNzIFRDUFRpbWVvdXRUZXN0KFNvY2tldFRDUFRlc3QpOgorCisgICAgZGVmIHRlc3RUQ1BUaW1lb3V0KHNlbGYpOgorICAgICAgICBkZWYgcmFpc2VfdGltZW91dCgqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgc2VsZi5zZXJ2LnNldHRpbWVvdXQoMS4wKQorICAgICAgICAgICAgc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0LCByYWlzZV90aW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGdlbmVyYXRpbmcgYSB0aW1lb3V0IGV4Y2VwdGlvbiAoVENQKSIpCisKKyAgICBkZWYgdGVzdFRpbWVvdXRaZXJvKHNlbGYpOgorICAgICAgICBvayA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2Vydi5zZXR0aW1lb3V0KDAuMCkKKyAgICAgICAgICAgIGZvbyA9IHNlbGYuc2Vydi5hY2NlcHQoKQorICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoImNhdWdodCB0aW1lb3V0IGluc3RlYWQgb2YgZXJyb3IgKFRDUCkiKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgb2sgPSBUcnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIChUQ1ApIikKKyAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJhY2NlcHQoKSByZXR1cm5lZCBzdWNjZXNzIHdoZW4gd2UgZGlkIG5vdCBleHBlY3QgaXQiKQorCisgICAgZGVmIHRlc3RJbnRlcnJ1cHRlZFRpbWVvdXQoc2VsZik6CisgICAgICAgICMgWFhYIEkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhpcyB0ZXN0IG9uIE1TV2luZG93cyBvciBhbnkgb3RoZXIKKyAgICAgICAgIyBwbGFmb3JtIHRoYXQgZG9lc24ndCBzdXBwb3J0IHNpZ25hbC5hbGFybSgpIG9yIG9zLmtpbGwoKSwgdGhvdWdoCisgICAgICAgICMgdGhlIGJ1ZyBzaG91bGQgaGF2ZSBleGlzdGVkIG9uIGFsbCBwbGF0Zm9ybXMuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNpZ25hbCwgImFsYXJtIik6CisgICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAjIGNhbiBvbmx5IHRlc3Qgb24gKm5peAorICAgICAgICBzZWxmLnNlcnYuc2V0dGltZW91dCg1LjApICAgIyBtdXN0IGJlIGxvbmdlciB0aGFuIGFsYXJtCisgICAgICAgIGNsYXNzIEFsYXJtKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBhbGFybV9oYW5kbGVyKHNpZ25hbCwgZnJhbWUpOgorICAgICAgICAgICAgcmFpc2UgQWxhcm0KKyAgICAgICAgb2xkX2FsYXJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgYWxhcm1faGFuZGxlcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDIpICAgICMgUE9TSVggYWxsb3dzIGFsYXJtIHRvIGJlIHVwIHRvIDEgc2Vjb25kIGVhcmx5CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9vID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjYXVnaHQgdGltZW91dCBpbnN0ZWFkIG9mIEFsYXJtIikKKyAgICAgICAgICAgIGV4Y2VwdCBBbGFybToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjYXVnaHQgb3RoZXIgZXhjZXB0aW9uIGluc3RlYWQgb2YgQWxhcm06IgorICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzKCVzKTpcbiVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzeXMuZXhjX2luZm8oKVs6Ml0gKyAodHJhY2ViYWNrLmZvcm1hdF9leGMoKSwpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJub3RoaW5nIGNhdWdodCIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNpZ25hbC5hbGFybSgwKSAgICAgICAgICMgc2h1dCBvZmYgYWxhcm0KKyAgICAgICAgZXhjZXB0IEFsYXJtOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJnb3QgQWxhcm0gaW4gd3JvbmcgcGxhY2UiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBubyBhbGFybSBjYW4gYmUgcGVuZGluZy4gIFNhZmUgdG8gcmVzdG9yZSBvbGQgaGFuZGxlci4KKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIG9sZF9hbGFybSkKKworY2xhc3MgVURQVGltZW91dFRlc3QoU29ja2V0VURQVGVzdCk6CisKKyAgICBkZWYgdGVzdFVEUFRpbWVvdXQoc2VsZik6CisgICAgICAgIGRlZiByYWlzZV90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICBzZWxmLnNlcnYuc2V0dGltZW91dCgxLjApCisgICAgICAgICAgICBzZWxmLnNlcnYucmVjdigxMDI0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQudGltZW91dCwgcmFpc2VfdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZW5lcmF0aW5nIGEgdGltZW91dCBleGNlcHRpb24gKFVEUCkiKQorCisgICAgZGVmIHRlc3RUaW1lb3V0WmVybyhzZWxmKToKKyAgICAgICAgb2sgPSBGYWxzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnNlcnYuc2V0dGltZW91dCgwLjApCisgICAgICAgICAgICBmb28gPSBzZWxmLnNlcnYucmVjdigxMDI0KQorICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoImNhdWdodCB0aW1lb3V0IGluc3RlYWQgb2YgZXJyb3IgKFVEUCkiKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgb2sgPSBUcnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiY2F1Z2h0IHVuZXhwZWN0ZWQgZXhjZXB0aW9uIChVRFApIikKKyAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyZWN2KCkgcmV0dXJuZWQgc3VjY2VzcyB3aGVuIHdlIGRpZCBub3QgZXhwZWN0IGl0IikKKworY2xhc3MgVGVzdEV4Y2VwdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RFeGNlcHRpb25UcmVlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzb2NrZXQuZXJyb3IsIEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNvY2tldC5oZXJyb3IsIHNvY2tldC5lcnJvcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNvY2tldC5nYWllcnJvciwgc29ja2V0LmVycm9yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc29ja2V0LnRpbWVvdXQsIHNvY2tldC5lcnJvcikpCisKK2NsYXNzIFRlc3RMaW51eEFic3RyYWN0TmFtZXNwYWNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIFVOSVhfUEFUSF9NQVggPSAxMDgKKworICAgIGRlZiB0ZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZShzZWxmKToKKyAgICAgICAgYWRkcmVzcyA9ICJceDAwcHl0aG9uLXRlc3QtaGVsbG9ceDAwXHhmZiIKKyAgICAgICAgczEgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHMxLmJpbmQoYWRkcmVzcykKKyAgICAgICAgczEubGlzdGVuKDEpCisgICAgICAgIHMyID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzMi5jb25uZWN0KHMxLmdldHNvY2tuYW1lKCkpCisgICAgICAgIHMxLmFjY2VwdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEuZ2V0c29ja25hbWUoKSwgYWRkcmVzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMi5nZXRwZWVybmFtZSgpLCBhZGRyZXNzKQorCisgICAgZGVmIHRlc3RNYXhOYW1lKHNlbGYpOgorICAgICAgICBhZGRyZXNzID0gIlx4MDAiICsgImgiICogKHNlbGYuVU5JWF9QQVRIX01BWCAtIDEpCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHMuYmluZChhZGRyZXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0c29ja25hbWUoKSwgYWRkcmVzcykKKworICAgIGRlZiB0ZXN0TmFtZU92ZXJmbG93KHNlbGYpOgorICAgICAgICBhZGRyZXNzID0gIlx4MDAiICsgImgiICogc2VsZi5VTklYX1BBVEhfTUFYCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgcy5iaW5kLCBhZGRyZXNzKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZCwgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBCdWZmZXJJT1Rlc3QoU29ja2V0Q29ubmVjdGVkVGVzdCk6CisgICAgIiIiCisgICAgVGVzdCB0aGUgYnVmZmVyIHZlcnNpb25zIG9mIHNvY2tldC5yZWN2KCkgYW5kIHNvY2tldC5zZW5kKCkuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKKyAgICAgICAgU29ja2V0Q29ubmVjdGVkVGVzdC5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lPW1ldGhvZE5hbWUpCisKKyAgICBkZWYgdGVzdFJlY3ZJbnRvQXJyYXkoc2VsZik6CisgICAgICAgIGJ1ZiA9IGFycmF5LmFycmF5KCdjJywgJyAnKjEwMjQpCisgICAgICAgIG5ieXRlcyA9IHNlbGYuY2xpX2Nvbm4ucmVjdl9pbnRvKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihNU0cpKQorICAgICAgICBtc2cgPSBidWYudG9zdHJpbmcoKVs6bGVuKE1TRyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWN2SW50b0FycmF5KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBidWYgPSBidWZmZXIoTVNHKQorICAgICAgICBzZWxmLnNlcnZfY29ubi5zZW5kKGJ1ZikKKworICAgIGRlZiB0ZXN0UmVjdkludG9CeXRlYXJyYXkoc2VsZik6CisgICAgICAgIGJ1ZiA9IGJ5dGVhcnJheSgxMDI0KQorICAgICAgICBuYnl0ZXMgPSBzZWxmLmNsaV9jb25uLnJlY3ZfaW50byhidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmJ5dGVzLCBsZW4oTVNHKSkKKyAgICAgICAgbXNnID0gYnVmWzpsZW4oTVNHKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIF90ZXN0UmVjdkludG9CeXRlYXJyYXkgPSBfdGVzdFJlY3ZJbnRvQXJyYXkKKworICAgIGRlZiB0ZXN0UmVjdkludG9NZW1vcnl2aWV3KHNlbGYpOgorICAgICAgICBidWYgPSBieXRlYXJyYXkoMTAyNCkKKyAgICAgICAgbmJ5dGVzID0gc2VsZi5jbGlfY29ubi5yZWN2X2ludG8obWVtb3J5dmlldyhidWYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ieXRlcywgbGVuKE1TRykpCisgICAgICAgIG1zZyA9IGJ1Zls6bGVuKE1TRyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBfdGVzdFJlY3ZJbnRvTWVtb3J5dmlldyA9IF90ZXN0UmVjdkludG9BcnJheQorCisgICAgZGVmIHRlc3RSZWN2RnJvbUludG9BcnJheShzZWxmKToKKyAgICAgICAgYnVmID0gYXJyYXkuYXJyYXkoJ2MnLCAnICcqMTAyNCkKKyAgICAgICAgbmJ5dGVzLCBhZGRyID0gc2VsZi5jbGlfY29ubi5yZWN2ZnJvbV9pbnRvKGJ1ZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihNU0cpKQorICAgICAgICBtc2cgPSBidWYudG9zdHJpbmcoKVs6bGVuKE1TRyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisKKyAgICBkZWYgX3Rlc3RSZWN2RnJvbUludG9BcnJheShzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgYnVmID0gYnVmZmVyKE1TRykKKyAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChidWYpCisKKyAgICBkZWYgdGVzdFJlY3ZGcm9tSW50b0J5dGVhcnJheShzZWxmKToKKyAgICAgICAgYnVmID0gYnl0ZWFycmF5KDEwMjQpCisgICAgICAgIG5ieXRlcywgYWRkciA9IHNlbGYuY2xpX2Nvbm4ucmVjdmZyb21faW50byhidWYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmJ5dGVzLCBsZW4oTVNHKSkKKyAgICAgICAgbXNnID0gYnVmWzpsZW4oTVNHKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworICAgIF90ZXN0UmVjdkZyb21JbnRvQnl0ZWFycmF5ID0gX3Rlc3RSZWN2RnJvbUludG9BcnJheQorCisgICAgZGVmIHRlc3RSZWN2RnJvbUludG9NZW1vcnl2aWV3KHNlbGYpOgorICAgICAgICBidWYgPSBieXRlYXJyYXkoMTAyNCkKKyAgICAgICAgbmJ5dGVzLCBhZGRyID0gc2VsZi5jbGlfY29ubi5yZWN2ZnJvbV9pbnRvKG1lbW9yeXZpZXcoYnVmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYnl0ZXMsIGxlbihNU0cpKQorICAgICAgICBtc2cgPSBidWZbOmxlbihNU0cpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgTVNHKQorCisgICAgX3Rlc3RSZWN2RnJvbUludG9NZW1vcnl2aWV3ID0gX3Rlc3RSZWN2RnJvbUludG9BcnJheQorCisKK1RJUENfU1RZUEUgPSAyMDAwCitUSVBDX0xPV0VSID0gMjAwCitUSVBDX1VQUEVSID0gMjEwCisKK2RlZiBpc1RpcGNBdmFpbGFibGUoKToKKyAgICAiIiJDaGVjayBpZiB0aGUgVElQQyBtb2R1bGUgaXMgbG9hZGVkCisKKyAgICBUaGUgVElQQyBtb2R1bGUgaXMgbm90IGxvYWRlZCBhdXRvbWF0aWNhbGx5IG9uIFVidW50dSBhbmQgcHJvYmFibHkKKyAgICBvdGhlciBMaW51eCBkaXN0cm9zLgorICAgICIiIgorICAgIGlmIG5vdCBoYXNhdHRyKHNvY2tldCwgIkFGX1RJUEMiKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgaWYgbm90IG9zLnBhdGguaXNmaWxlKCIvcHJvYy9tb2R1bGVzIik6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIHdpdGggb3BlbigiL3Byb2MvbW9kdWxlcyIpIGFzIGY6CisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoInRpcGMgIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgcHJpbnQgIlRJUEMgbW9kdWxlIGlzIG5vdCBsb2FkZWQsIHBsZWFzZSAnc3VkbyBtb2Rwcm9iZSB0aXBjJyIKKyAgICByZXR1cm4gRmFsc2UKKworY2xhc3MgVElQQ1Rlc3QgKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdFJETShzZWxmKToKKyAgICAgICAgc3J2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVElQQywgc29ja2V0LlNPQ0tfUkRNKQorICAgICAgICBjbGkgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9USVBDLCBzb2NrZXQuU09DS19SRE0pCisKKyAgICAgICAgc3J2LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIHNydmFkZHIgPSAoc29ja2V0LlRJUENfQUREUl9OQU1FU0VRLCBUSVBDX1NUWVBFLAorICAgICAgICAgICAgICAgIFRJUENfTE9XRVIsIFRJUENfVVBQRVIpCisgICAgICAgIHNydi5iaW5kKHNydmFkZHIpCisKKyAgICAgICAgc2VuZGFkZHIgPSAoc29ja2V0LlRJUENfQUREUl9OQU1FLCBUSVBDX1NUWVBFLAorICAgICAgICAgICAgICAgIFRJUENfTE9XRVIgKyAoVElQQ19VUFBFUiAtIFRJUENfTE9XRVIpIC8gMiwgMCkKKyAgICAgICAgY2xpLnNlbmR0byhNU0csIHNlbmRhZGRyKQorCisgICAgICAgIG1zZywgcmVjdmFkZHIgPSBzcnYucmVjdmZyb20oMTAyNCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNsaS5nZXRzb2NrbmFtZSgpLCByZWN2YWRkcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIE1TRykKKworCitjbGFzcyBUSVBDVGhyZWFkYWJsZVRlc3QgKHVuaXR0ZXN0LlRlc3RDYXNlLCBUaHJlYWRhYmxlVGVzdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWUgPSAncnVuVGVzdCcpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCBtZXRob2ROYW1lID0gbWV0aG9kTmFtZSkKKyAgICAgICAgVGhyZWFkYWJsZVRlc3QuX19pbml0X18oc2VsZikKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9USVBDLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc3J2LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisgICAgICAgIHNydmFkZHIgPSAoc29ja2V0LlRJUENfQUREUl9OQU1FU0VRLCBUSVBDX1NUWVBFLAorICAgICAgICAgICAgICAgIFRJUENfTE9XRVIsIFRJUENfVVBQRVIpCisgICAgICAgIHNlbGYuc3J2LmJpbmQoc3J2YWRkcikKKyAgICAgICAgc2VsZi5zcnYubGlzdGVuKDUpCisgICAgICAgIHNlbGYuc2VydmVyRXhwbGljaXRSZWFkeSgpCisgICAgICAgIHNlbGYuY29ubiwgc2VsZi5jb25uYWRkciA9IHNlbGYuc3J2LmFjY2VwdCgpCisKKyAgICBkZWYgY2xpZW50U2V0VXAoc2VsZik6CisgICAgICAgICMgVGhlIGlzIGEgaGl0dGFibGUgcmFjZSBiZXR3ZWVuIHNlcnZlckV4cGxpY2l0UmVhZHkoKSBhbmQgdGhlCisgICAgICAgICMgYWNjZXB0KCkgY2FsbDsgc2xlZXAgYSBsaXR0bGUgd2hpbGUgdG8gYXZvaWQgaXQsIG90aGVyd2lzZQorICAgICAgICAjIHdlIGNvdWxkIGdldCBhbiBleGNlcHRpb24KKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVElQQywgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBhZGRyID0gKHNvY2tldC5USVBDX0FERFJfTkFNRSwgVElQQ19TVFlQRSwKKyAgICAgICAgICAgICAgICBUSVBDX0xPV0VSICsgKFRJUENfVVBQRVIgLSBUSVBDX0xPV0VSKSAvIDIsIDApCisgICAgICAgIHNlbGYuY2xpLmNvbm5lY3QoYWRkcikKKyAgICAgICAgc2VsZi5jbGlhZGRyID0gc2VsZi5jbGkuZ2V0c29ja25hbWUoKQorCisgICAgZGVmIHRlc3RTdHJlYW0oc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuY29ubi5yZWN2KDEwMjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBNU0cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jbGlhZGRyLCBzZWxmLmNvbm5hZGRyKQorCisgICAgZGVmIF90ZXN0U3RyZWFtKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5zZW5kKE1TRykKKyAgICAgICAgc2VsZi5jbGkuY2xvc2UoKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0cyA9IFtHZW5lcmFsTW9kdWxlVGVzdHMsIEJhc2ljVENQVGVzdCwgVENQQ2xvc2VyVGVzdCwgVENQVGltZW91dFRlc3QsCisgICAgICAgICAgICAgVGVzdEV4Y2VwdGlvbnMsIEJ1ZmZlcklPVGVzdCwgQmFzaWNUQ1BUZXN0MiwgQmFzaWNVRFBUZXN0LAorICAgICAgICAgICAgIFVEUFRpbWVvdXRUZXN0IF0KKworICAgIHRlc3RzLmV4dGVuZChbCisgICAgICAgIE5vbkJsb2NraW5nVENQVGVzdHMsCisgICAgICAgIEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlLAorICAgICAgICBGaWxlT2JqZWN0SW50ZXJydXB0ZWRUZXN0Q2FzZSwKKyAgICAgICAgVW5idWZmZXJlZEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlLAorICAgICAgICBMaW5lQnVmZmVyZWRGaWxlT2JqZWN0Q2xhc3NUZXN0Q2FzZSwKKyAgICAgICAgU21hbGxCdWZmZXJlZEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlLAorICAgICAgICBVcmxsaWIyRmlsZW9iamVjdFRlc3QsCisgICAgICAgIE5ldHdvcmtDb25uZWN0aW9uTm9TZXJ2ZXIsCisgICAgICAgIE5ldHdvcmtDb25uZWN0aW9uQXR0cmlidXRlc1Rlc3QsCisgICAgICAgIE5ldHdvcmtDb25uZWN0aW9uQmVoYXZpb3VyVGVzdCwKKyAgICBdKQorICAgIGlmIGhhc2F0dHIoc29ja2V0LCAic29ja2V0cGFpciIpOgorICAgICAgICB0ZXN0cy5hcHBlbmQoQmFzaWNTb2NrZXRQYWlyVGVzdCkKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2xpbnV4Mic6CisgICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZSkKKyAgICBpZiBpc1RpcGNBdmFpbGFibGUoKToKKyAgICAgICAgdGVzdHMuYXBwZW5kKFRJUENUZXN0KQorICAgICAgICB0ZXN0cy5hcHBlbmQoVElQQ1RocmVhZGFibGVUZXN0KQorCisgICAgdGhyZWFkX2luZm8gPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnRocmVhZF9pbmZvKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMyYWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWMyYWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiYjhlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weQpAQCAtMCwwICsxLDMxOSBAQAorIiIiCitUZXN0IHN1aXRlIGZvciBTb2NrZXRTZXJ2ZXIucHkuCisiIiIKKworaW1wb3J0IGNvbnRleHRsaWIKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcworaW1wb3J0IHNlbGVjdAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHNvY2tldAoraW1wb3J0IHNlbGVjdAoraW1wb3J0IGVycm5vCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFNvY2tldFNlcnZlcgorCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJlYXBfY2hpbGRyZW4sIHJlYXBfdGhyZWFkcywgdmVyYm9zZQordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK3Rlc3QudGVzdF9zdXBwb3J0LnJlcXVpcmVzKCJuZXR3b3JrIikKKworVEVTVF9TVFIgPSAiaGVsbG8gd29ybGRcbiIKK0hPU1QgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5IT1NUCisKK0hBVkVfVU5JWF9TT0NLRVRTID0gaGFzYXR0cihzb2NrZXQsICJBRl9VTklYIikKK0hBVkVfRk9SS0lORyA9IGhhc2F0dHIob3MsICJmb3JrIikgYW5kIG9zLm5hbWUgIT0gIm9zMiIKKworZGVmIHNpZ25hbF9hbGFybShuKToKKyAgICAiIiJDYWxsIHNpZ25hbC5hbGFybSB3aGVuIGl0IGV4aXN0cyAoaS5lLiBub3Qgb24gV2luZG93cykuIiIiCisgICAgaWYgaGFzYXR0cihzaWduYWwsICdhbGFybScpOgorICAgICAgICBzaWduYWwuYWxhcm0obikKKworIyBSZW1lbWJlciByZWFsIHNlbGVjdCgpIHRvIGF2b2lkIGludGVyZmVyZW5jZXMgd2l0aCBtb2NraW5nCitfcmVhbF9zZWxlY3QgPSBzZWxlY3Quc2VsZWN0CisKK2RlZiByZWNlaXZlKHNvY2ssIG4sIHRpbWVvdXQ9MjApOgorICAgIHIsIHcsIHggPSBfcmVhbF9zZWxlY3QoW3NvY2tdLCBbXSwgW10sIHRpbWVvdXQpCisgICAgaWYgc29jayBpbiByOgorICAgICAgICByZXR1cm4gc29jay5yZWN2KG4pCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAidGltZWQgb3V0IG9uICVyIiAlIChzb2NrLCkKKworaWYgSEFWRV9VTklYX1NPQ0tFVFM6CisgICAgY2xhc3MgRm9ya2luZ1VuaXhTdHJlYW1TZXJ2ZXIoU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuVW5peFN0cmVhbVNlcnZlcik6CisgICAgICAgIHBhc3MKKworICAgIGNsYXNzIEZvcmtpbmdVbml4RGF0YWdyYW1TZXJ2ZXIoU29ja2V0U2VydmVyLkZvcmtpbmdNaXhJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5Vbml4RGF0YWdyYW1TZXJ2ZXIpOgorICAgICAgICBwYXNzCisKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBzaW1wbGVfc3VicHJvY2Vzcyh0ZXN0Y2FzZSk6CisgICAgcGlkID0gb3MuZm9yaygpCisgICAgaWYgcGlkID09IDA6CisgICAgICAgICMgRG9uJ3QgcmFpc2UgYW4gZXhjZXB0aW9uOyBpdCB3b3VsZCBiZSBjYXVnaHQgYnkgdGhlIHRlc3QgaGFybmVzcy4KKyAgICAgICAgb3MuX2V4aXQoNzIpCisgICAgeWllbGQgTm9uZQorICAgIHBpZDIsIHN0YXR1cyA9IG9zLndhaXRwaWQocGlkLCAwKQorICAgIHRlc3RjYXNlLmFzc2VydEVxdWFsKHBpZDIsIHBpZCkKKyAgICB0ZXN0Y2FzZS5hc3NlcnRFcXVhbCg3MiA8PCA4LCBzdGF0dXMpCisKKworQHVuaXR0ZXN0LnNraXBVbmxlc3ModGhyZWFkaW5nLCAnVGhyZWFkaW5nIHJlcXVpcmVkIGZvciB0aGlzIHRlc3QuJykKK2NsYXNzIFNvY2tldFNlcnZlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgYWxsIHNvY2tldCBzZXJ2ZXJzLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzaWduYWxfYWxhcm0oNjApICAjIEtpbGwgZGVhZGxvY2tzIGFmdGVyIDYwIHNlY29uZHMuCisgICAgICAgIHNlbGYucG9ydF9zZWVkID0gMAorICAgICAgICBzZWxmLnRlc3RfZmlsZXMgPSBbXQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzaWduYWxfYWxhcm0oMCkgICMgRGlkbid0IGRlYWRsb2NrLgorICAgICAgICByZWFwX2NoaWxkcmVuKCkKKworICAgICAgICBmb3IgZm4gaW4gc2VsZi50ZXN0X2ZpbGVzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmbikKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYudGVzdF9maWxlc1s6XSA9IFtdCisKKyAgICBkZWYgcGlja2FkZHIoc2VsZiwgcHJvdG8pOgorICAgICAgICBpZiBwcm90byA9PSBzb2NrZXQuQUZfSU5FVDoKKyAgICAgICAgICAgIHJldHVybiAoSE9TVCwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgWFhYOiBXZSBuZWVkIGEgd2F5IHRvIHRlbGwgQUZfVU5JWCB0byBwaWNrIGl0cyBvd24gbmFtZQorICAgICAgICAgICAgIyBsaWtlIEFGX0lORVQgcHJvdmlkZXMgcG9ydD09MC4KKyAgICAgICAgICAgIGRpciA9IE5vbmUKKyAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ29zMic6CisgICAgICAgICAgICAgICAgZGlyID0gJ1xzb2NrZXQnCisgICAgICAgICAgICBmbiA9IHRlbXBmaWxlLm1rdGVtcChwcmVmaXg9J3VuaXhfc29ja2V0LicsIGRpcj1kaXIpCisgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdvczInOgorICAgICAgICAgICAgICAgICMgQUZfVU5JWCBzb2NrZXQgbmFtZXMgb24gT1MvMiByZXF1aXJlIGEgc3BlY2lmaWMgcHJlZml4CisgICAgICAgICAgICAgICAgIyB3aGljaCBjYW4ndCBpbmNsdWRlIGEgZHJpdmUgbGV0dGVyIGFuZCBtdXN0IGFsc28gdXNlCisgICAgICAgICAgICAgICAgIyBiYWNrc2xhc2hlcyBhcyBkaXJlY3Rvcnkgc2VwYXJhdG9ycworICAgICAgICAgICAgICAgIGlmIGZuWzFdID09ICc6JzoKKyAgICAgICAgICAgICAgICAgICAgZm4gPSBmblsyOl0KKyAgICAgICAgICAgICAgICBpZiBmblswXSBpbiAob3Muc2VwLCBvcy5hbHRzZXApOgorICAgICAgICAgICAgICAgICAgICBmbiA9IGZuWzE6XQorICAgICAgICAgICAgICAgIGlmIG9zLnNlcCA9PSAnLyc6CisgICAgICAgICAgICAgICAgICAgIGZuID0gZm4ucmVwbGFjZShvcy5zZXAsIG9zLmFsdHNlcCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmbiA9IGZuLnJlcGxhY2Uob3MuYWx0c2VwLCBvcy5zZXApCisgICAgICAgICAgICBzZWxmLnRlc3RfZmlsZXMuYXBwZW5kKGZuKQorICAgICAgICAgICAgcmV0dXJuIGZuCisKKyAgICBkZWYgbWFrZV9zZXJ2ZXIoc2VsZiwgYWRkciwgc3ZyY2xzLCBoZGxyYmFzZSk6CisgICAgICAgIGNsYXNzIE15U2VydmVyKHN2cmNscyk6CisgICAgICAgICAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzKToKKyAgICAgICAgICAgICAgICBzZWxmLmNsb3NlX3JlcXVlc3QocmVxdWVzdCkKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBjbGFzcyBNeUhhbmRsZXIoaGRscmJhc2UpOgorICAgICAgICAgICAgZGVmIGhhbmRsZShzZWxmKToKKyAgICAgICAgICAgICAgICBsaW5lID0gc2VsZi5yZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShsaW5lKQorCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJjcmVhdGluZyBzZXJ2ZXIiCisgICAgICAgIHNlcnZlciA9IE15U2VydmVyKGFkZHIsIE15SGFuZGxlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXJ2ZXIuc2VydmVyX2FkZHJlc3MsIHNlcnZlci5zb2NrZXQuZ2V0c29ja25hbWUoKSkKKyAgICAgICAgcmV0dXJuIHNlcnZlcgorCisgICAgQHJlYXBfdGhyZWFkcworICAgIGRlZiBydW5fc2VydmVyKHNlbGYsIHN2cmNscywgaGRscmJhc2UsIHRlc3RmdW5jKToKKyAgICAgICAgc2VydmVyID0gc2VsZi5tYWtlX3NlcnZlcihzZWxmLnBpY2thZGRyKHN2cmNscy5hZGRyZXNzX2ZhbWlseSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZyY2xzLCBoZGxyYmFzZSkKKyAgICAgICAgIyBXZSBoYWQgdGhlIE9TIHBpY2sgYSBwb3J0LCBzbyBwdWxsIHRoZSByZWFsIGFkZHJlc3Mgb3V0IG9mCisgICAgICAgICMgdGhlIHNlcnZlci4KKyAgICAgICAgYWRkciA9IHNlcnZlci5zZXJ2ZXJfYWRkcmVzcworICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgInNlcnZlciBjcmVhdGVkIgorICAgICAgICAgICAgcHJpbnQgIkFERFIgPSIsIGFkZHIKKyAgICAgICAgICAgIHByaW50ICJDTEFTUyA9Iiwgc3ZyY2xzCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgbmFtZT0nJXMgc2VydmluZycgJSBzdnJjbHMsCisgICAgICAgICAgICB0YXJnZXQ9c2VydmVyLnNlcnZlX2ZvcmV2ZXIsCisgICAgICAgICAgICAjIFNob3J0IHBvbGwgaW50ZXJ2YWwgdG8gbWFrZSB0aGUgdGVzdCBmaW5pc2ggcXVpY2tseS4KKyAgICAgICAgICAgICMgVGltZSBiZXR3ZWVuIHJlcXVlc3RzIGlzIHNob3J0IGVub3VnaCB0aGF0IHdlIHdvbid0IHdha2UKKyAgICAgICAgICAgICMgdXAgc3B1cmlvdXNseSB0b28gbWFueSB0aW1lcy4KKyAgICAgICAgICAgIGt3YXJncz17J3BvbGxfaW50ZXJ2YWwnOjAuMDF9KQorICAgICAgICB0LmRhZW1vbiA9IFRydWUgICMgSW4gY2FzZSB0aGlzIGZ1bmN0aW9uIHJhaXNlcy4KKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJzZXJ2ZXIgcnVubmluZyIKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAidGVzdCBjbGllbnQiLCBpCisgICAgICAgICAgICB0ZXN0ZnVuYyhzdnJjbHMuYWRkcmVzc19mYW1pbHksIGFkZHIpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJ3YWl0aW5nIGZvciBzZXJ2ZXIiCisgICAgICAgIHNlcnZlci5zaHV0ZG93bigpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJkb25lIgorCisgICAgZGVmIHN0cmVhbV9leGFtaW5lKHNlbGYsIHByb3RvLCBhZGRyKToKKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQocHJvdG8sIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgcy5jb25uZWN0KGFkZHIpCisgICAgICAgIHMuc2VuZGFsbChURVNUX1NUUikKKyAgICAgICAgYnVmID0gZGF0YSA9IHJlY2VpdmUocywgMTAwKQorICAgICAgICB3aGlsZSBkYXRhIGFuZCAnXG4nIG5vdCBpbiBidWY6CisgICAgICAgICAgICBkYXRhID0gcmVjZWl2ZShzLCAxMDApCisgICAgICAgICAgICBidWYgKz0gZGF0YQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgVEVTVF9TVFIpCisgICAgICAgIHMuY2xvc2UoKQorCisgICAgZGVmIGRncmFtX2V4YW1pbmUoc2VsZiwgcHJvdG8sIGFkZHIpOgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChwcm90bywgc29ja2V0LlNPQ0tfREdSQU0pCisgICAgICAgIHMuc2VuZHRvKFRFU1RfU1RSLCBhZGRyKQorICAgICAgICBidWYgPSBkYXRhID0gcmVjZWl2ZShzLCAxMDApCisgICAgICAgIHdoaWxlIGRhdGEgYW5kICdcbicgbm90IGluIGJ1ZjoKKyAgICAgICAgICAgIGRhdGEgPSByZWNlaXZlKHMsIDEwMCkKKyAgICAgICAgICAgIGJ1ZiArPSBkYXRhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLCBURVNUX1NUUikKKyAgICAgICAgcy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9UQ1BTZXJ2ZXIoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVENQU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW1fZXhhbWluZSkKKworICAgIGRlZiB0ZXN0X1RocmVhZGluZ1RDUFNlcnZlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5UaHJlYWRpbmdUQ1BTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuU3RyZWFtUmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQorCisgICAgaWYgSEFWRV9GT1JLSU5HOgorICAgICAgICBkZWYgdGVzdF9Gb3JraW5nVENQU2VydmVyKHNlbGYpOgorICAgICAgICAgICAgd2l0aCBzaW1wbGVfc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLkZvcmtpbmdUQ1BTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW1fZXhhbWluZSkKKworICAgIGlmIEhBVkVfVU5JWF9TT0NLRVRTOgorICAgICAgICBkZWYgdGVzdF9Vbml4U3RyZWFtU2VydmVyKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5Vbml4U3RyZWFtU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQorCisgICAgICAgIGRlZiB0ZXN0X1RocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIoc2VsZik6CisgICAgICAgICAgICBzZWxmLnJ1bl9zZXJ2ZXIoU29ja2V0U2VydmVyLlRocmVhZGluZ1VuaXhTdHJlYW1TZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtX2V4YW1pbmUpCisKKyAgICAgICAgaWYgSEFWRV9GT1JLSU5HOgorICAgICAgICAgICAgZGVmIHRlc3RfRm9ya2luZ1VuaXhTdHJlYW1TZXJ2ZXIoc2VsZik6CisgICAgICAgICAgICAgICAgd2l0aCBzaW1wbGVfc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ydW5fc2VydmVyKEZvcmtpbmdVbml4U3RyZWFtU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLlN0cmVhbVJlcXVlc3RIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW1fZXhhbWluZSkKKworICAgIGRlZiB0ZXN0X1VEUFNlcnZlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5VRFBTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKworICAgIGRlZiB0ZXN0X1RocmVhZGluZ1VEUFNlcnZlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5UaHJlYWRpbmdVRFBTZXJ2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKworICAgIGlmIEhBVkVfRk9SS0lORzoKKyAgICAgICAgZGVmIHRlc3RfRm9ya2luZ1VEUFNlcnZlcihzZWxmKToKKyAgICAgICAgICAgIHdpdGggc2ltcGxlX3N1YnByb2Nlc3Moc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5Gb3JraW5nVURQU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZ3JhbV9leGFtaW5lKQorCisgICAgQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKKyAgICBkZWYgbW9ja2VkX3NlbGVjdF9tb2R1bGUoc2VsZik6CisgICAgICAgICIiIk1vY2tzIHRoZSBzZWxlY3Quc2VsZWN0KCkgY2FsbCB0byByYWlzZSBFSU5UUiBmb3IgZmlyc3QgY2FsbCIiIgorICAgICAgICBvbGRfc2VsZWN0ID0gc2VsZWN0LnNlbGVjdAorCisgICAgICAgIGNsYXNzIE1vY2tTZWxlY3Q6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSAwCisKKyAgICAgICAgICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY2FsbGVkID09IDE6CisgICAgICAgICAgICAgICAgICAgICMgcmFpc2UgdGhlIGV4Y2VwdGlvbiBvbiBmaXJzdCBjYWxsCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHNlbGVjdC5lcnJvcihlcnJuby5FSU5UUiwgb3Muc3RyZXJyb3IoZXJybm8uRUlOVFIpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgUmV0dXJuIHJlYWwgc2VsZWN0IHZhbHVlIGZvciBjb25zZWN1dGl2ZSBjYWxscworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2xkX3NlbGVjdCgqYXJncykKKworICAgICAgICBzZWxlY3Quc2VsZWN0ID0gTW9ja1NlbGVjdCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHlpZWxkIHNlbGVjdC5zZWxlY3QKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QgPSBvbGRfc2VsZWN0CisKKyAgICBkZWYgdGVzdF9JbnRlcnJ1cHRTZXJ2ZXJTZWxlY3RDYWxsKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYubW9ja2VkX3NlbGVjdF9tb2R1bGUoKSBhcyBtb2NrX3NlbGVjdDoKKyAgICAgICAgICAgIHBpZCA9IHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVENQU2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbV9leGFtaW5lKQorICAgICAgICAgICAgIyBNYWtlIHN1cmUgc2VsZWN0IHdhcyBjYWxsZWQgYWdhaW46CisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIobW9ja19zZWxlY3QuY2FsbGVkLCAxKQorCisgICAgIyBBbGFzLCBvbiBMaW51eCAoYXQgbGVhc3QpIHJlY3Zmcm9tKCkgZG9lc24ndCByZXR1cm4gYSBtZWFuaW5nZnVsCisgICAgIyBjbGllbnQgYWRkcmVzcyBzbyB0aGlzIGNhbm5vdCB3b3JrOgorCisgICAgIyBpZiBIQVZFX1VOSVhfU09DS0VUUzoKKyAgICAjICAgICBkZWYgdGVzdF9Vbml4RGF0YWdyYW1TZXJ2ZXIoc2VsZik6CisgICAgIyAgICAgICAgIHNlbGYucnVuX3NlcnZlcihTb2NrZXRTZXJ2ZXIuVW5peERhdGFncmFtU2VydmVyLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgU29ja2V0U2VydmVyLkRhdGFncmFtUmVxdWVzdEhhbmRsZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRncmFtX2V4YW1pbmUpCisgICAgIworICAgICMgICAgIGRlZiB0ZXN0X1RocmVhZGluZ1VuaXhEYXRhZ3JhbVNlcnZlcihzZWxmKToKKyAgICAjICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5UaHJlYWRpbmdVbml4RGF0YWdyYW1TZXJ2ZXIsCisgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICBTb2NrZXRTZXJ2ZXIuRGF0YWdyYW1SZXF1ZXN0SGFuZGxlciwKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKyAgICAjCisgICAgIyAgICAgaWYgSEFWRV9GT1JLSU5HOgorICAgICMgICAgICAgICBkZWYgdGVzdF9Gb3JraW5nVW5peERhdGFncmFtU2VydmVyKHNlbGYpOgorICAgICMgICAgICAgICAgICAgc2VsZi5ydW5fc2VydmVyKFNvY2tldFNlcnZlci5Gb3JraW5nVW5peERhdGFncmFtU2VydmVyLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvY2tldFNlcnZlci5EYXRhZ3JhbVJlcXVlc3RIYW5kbGVyLAorICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGdyYW1fZXhhbWluZSkKKworICAgIEByZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF9zaHV0ZG93bihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMjMwMjogc2h1dGRvd24oKSBzaG91bGQgYWx3YXlzIHN1Y2NlZWQgaW4gbWFraW5nIGFuCisgICAgICAgICMgb3RoZXIgdGhyZWFkIGxlYXZlIHNlcnZlX2ZvcmV2ZXIoKS4KKyAgICAgICAgY2xhc3MgTXlTZXJ2ZXIoU29ja2V0U2VydmVyLlRDUFNlcnZlcik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgTXlIYW5kbGVyKFNvY2tldFNlcnZlci5TdHJlYW1SZXF1ZXN0SGFuZGxlcik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGhyZWFkcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDIwKToKKyAgICAgICAgICAgIHMgPSBNeVNlcnZlcigoSE9TVCwgMCksIE15SGFuZGxlcikKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKAorICAgICAgICAgICAgICAgIG5hbWU9J015U2VydmVyIHNlcnZpbmcnLAorICAgICAgICAgICAgICAgIHRhcmdldD1zLnNlcnZlX2ZvcmV2ZXIsCisgICAgICAgICAgICAgICAga3dhcmdzPXsncG9sbF9pbnRlcnZhbCc6MC4wMX0pCisgICAgICAgICAgICB0LmRhZW1vbiA9IFRydWUgICMgSW4gY2FzZSB0aGlzIGZ1bmN0aW9uIHJhaXNlcy4KKyAgICAgICAgICAgIHRocmVhZHMuYXBwZW5kKCh0LCBzKSkKKyAgICAgICAgZm9yIHQsIHMgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgcy5zaHV0ZG93bigpCisgICAgICAgIGZvciB0LCBzIGluIHRocmVhZHM6CisgICAgICAgICAgICB0LmpvaW4oKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBpZiBpbXAubG9ja19oZWxkKCk6CisgICAgICAgICMgSWYgdGhlIGltcG9ydCBsb2NrIGlzIGhlbGQsIHRoZSB0aHJlYWRzIHdpbGwgaGFuZworICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiY2FuJ3QgcnVuIHdoZW4gaW1wb3J0IGxvY2sgaXMgaGVsZCIpCisKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU29ja2V0U2VydmVyVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2YTM0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM2YTM0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvY2tldHNlcnZlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOWEwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb2Z0c3BhY2UucHkKQEAgLTAsMCArMSwyMyBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBTdHJpbmdJTworCitjbGFzcyBTb2Z0c3BhY2VUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfYnVnXzQ4MDIxNShzZWxmKToKKyAgICAgICAgIyBTRiBidWcgNDgwMjE1OiAgc29mdHNwYWNlIGNvbmZ1c2VkIGluIG5lc3RlZCBwcmludAorICAgICAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gZiwgJ2EnCisgICAgICAgICAgICAgICAgcmV0dXJuICdiJworCisgICAgICAgIHByaW50ID4+IGYsIEMoKSwgJ2MgJywgJ2RcdCcsICdlJworICAgICAgICBwcmludCA+PiBmLCAnZicsICdnJworICAgICAgICAjIEluIDIuMiAmIGVhcmxpZXIsIHRoaXMgcHJpbnRlZCAnIGFcbmJjICBkXHRlXG5mIGdcbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLmdldHZhbHVlKCksICdhXG5iIGMgIGRcdGVcbmYgZ1xuJykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChTb2Z0c3BhY2VUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvZnRzcGFjZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZDk2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvZnRzcGFjZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29mdHNwYWNlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvZnRzcGFjZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZDk2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvZnRzcGFjZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1YWJjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NvcnQucHkKQEAgLTAsMCArMSwyOTIgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgcmFuZG9tCitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKwordmVyYm9zZSA9IHRlc3Rfc3VwcG9ydC52ZXJib3NlCituZXJyb3JzID0gMAorCitkZWYgY2hlY2sodGFnLCBleHBlY3RlZCwgcmF3LCBjb21wYXJlPU5vbmUpOgorICAgIGdsb2JhbCBuZXJyb3JzCisKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAiICAgIGNoZWNraW5nIiwgdGFnCisKKyAgICBvcmlnID0gcmF3WzpdICAgIyBzYXZlIGlucHV0IGluIGNhc2Ugb2YgZXJyb3IKKyAgICBpZiBjb21wYXJlOgorICAgICAgICByYXcuc29ydChjb21wYXJlKQorICAgIGVsc2U6CisgICAgICAgIHJhdy5zb3J0KCkKKworICAgIGlmIGxlbihleHBlY3RlZCkgIT0gbGVuKHJhdyk6CisgICAgICAgIHByaW50ICJlcnJvciBpbiIsIHRhZworICAgICAgICBwcmludCAibGVuZ3RoIG1pc21hdGNoOyIsIGxlbihleHBlY3RlZCksIGxlbihyYXcpCisgICAgICAgIHByaW50IGV4cGVjdGVkCisgICAgICAgIHByaW50IG9yaWcKKyAgICAgICAgcHJpbnQgcmF3CisgICAgICAgIG5lcnJvcnMgKz0gMQorICAgICAgICByZXR1cm4KKworICAgIGZvciBpLCBnb29kIGluIGVudW1lcmF0ZShleHBlY3RlZCk6CisgICAgICAgIG1heWJlID0gcmF3W2ldCisgICAgICAgIGlmIGdvb2QgaXMgbm90IG1heWJlOgorICAgICAgICAgICAgcHJpbnQgImVycm9yIGluIiwgdGFnCisgICAgICAgICAgICBwcmludCAib3V0IG9mIG9yZGVyIGF0IGluZGV4IiwgaSwgZ29vZCwgbWF5YmUKKyAgICAgICAgICAgIHByaW50IGV4cGVjdGVkCisgICAgICAgICAgICBwcmludCBvcmlnCisgICAgICAgICAgICBwcmludCByYXcKKyAgICAgICAgICAgIG5lcnJvcnMgKz0gMQorICAgICAgICAgICAgcmV0dXJuCisKK2NsYXNzIFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdFN0cmVzc2Z1bGx5KHNlbGYpOgorICAgICAgICAjIFRyeSBhIHZhcmlldHkgb2Ygc2l6ZXMgYXQgYW5kIGFyb3VuZCBwb3dlcnMgb2YgMiwgYW5kIGF0IHBvd2VycyBvZiAxMC4KKyAgICAgICAgc2l6ZXMgPSBbMF0KKyAgICAgICAgZm9yIHBvd2VyIGluIHJhbmdlKDEsIDEwKToKKyAgICAgICAgICAgIG4gPSAyICoqIHBvd2VyCisgICAgICAgICAgICBzaXplcy5leHRlbmQocmFuZ2Uobi0xLCBuKzIpKQorICAgICAgICBzaXplcy5leHRlbmQoWzEwLCAxMDAsIDEwMDBdKQorCisgICAgICAgIGNsYXNzIENvbXBsYWlucyhvYmplY3QpOgorICAgICAgICAgICAgbWF5YmVfY29tcGxhaW4gPSBUcnVlCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBpKToKKyAgICAgICAgICAgICAgICBzZWxmLmkgPSBpCisKKyAgICAgICAgICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIENvbXBsYWlucy5tYXliZV9jb21wbGFpbiBhbmQgcmFuZG9tLnJhbmRvbSgpIDwgMC4wMDE6CisgICAgICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCAiICAgICAgICBjb21wbGFpbmluZyBhdCIsIHNlbGYsIG90aGVyCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmkgPCBvdGhlci5pCisKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gIkNvbXBsYWlucyglZCkiICUgc2VsZi5pCisKKyAgICAgICAgY2xhc3MgU3RhYmxlKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwga2V5LCBpKToKKyAgICAgICAgICAgICAgICBzZWxmLmtleSA9IGtleQorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXggPSBpCisKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYua2V5LCBvdGhlci5rZXkpCisgICAgICAgICAgICBfX2hhc2hfXyA9IE5vbmUgIyBTaWxlbmNlIFB5M2sgd2FybmluZworCisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJTdGFibGUoJWQsICVkKSIgJSAoc2VsZi5rZXksIHNlbGYuaW5kZXgpCisKKyAgICAgICAgZm9yIG4gaW4gc2l6ZXM6CisgICAgICAgICAgICB4ID0gcmFuZ2UobikKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIlRlc3Rpbmcgc2l6ZSIsIG4KKworICAgICAgICAgICAgcyA9IHhbOl0KKyAgICAgICAgICAgIGNoZWNrKCJpZGVudGl0eSIsIHgsIHMpCisKKyAgICAgICAgICAgIHMgPSB4WzpdCisgICAgICAgICAgICBzLnJldmVyc2UoKQorICAgICAgICAgICAgY2hlY2soInJldmVyc2VkIiwgeCwgcykKKworICAgICAgICAgICAgcyA9IHhbOl0KKyAgICAgICAgICAgIHJhbmRvbS5zaHVmZmxlKHMpCisgICAgICAgICAgICBjaGVjaygicmFuZG9tIHBlcm11dGF0aW9uIiwgeCwgcykKKworICAgICAgICAgICAgeSA9IHhbOl0KKyAgICAgICAgICAgIHkucmV2ZXJzZSgpCisgICAgICAgICAgICBzID0geFs6XQorICAgICAgICAgICAgY2hlY2soInJldmVyc2VkIHZpYSBmdW5jdGlvbiIsIHksIHMsIGxhbWJkYSBhLCBiOiBjbXAoYiwgYSkpCisKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIiAgICBDaGVja2luZyBhZ2FpbnN0IGFuIGluc2FuZSBjb21wYXJpc29uIGZ1bmN0aW9uLiIKKyAgICAgICAgICAgICAgICBwcmludCAiICAgICAgICBJZiB0aGUgaW1wbGVtZW50YXRpb24gaXNuJ3QgY2FyZWZ1bCwgdGhpcyBtYXkgc2VnZmF1bHQuIgorICAgICAgICAgICAgcyA9IHhbOl0KKyAgICAgICAgICAgIHMuc29ydChsYW1iZGEgYSwgYjogIGludChyYW5kb20ucmFuZG9tKCkgKiAzKSAtIDEpCisgICAgICAgICAgICBjaGVjaygiYW4gaW5zYW5lIGZ1bmN0aW9uIGxlZnQgc29tZSBwZXJtdXRhdGlvbiIsIHgsIHMpCisKKyAgICAgICAgICAgIHggPSBbQ29tcGxhaW5zKGkpIGZvciBpIGluIHhdCisgICAgICAgICAgICBzID0geFs6XQorICAgICAgICAgICAgcmFuZG9tLnNodWZmbGUocykKKyAgICAgICAgICAgIENvbXBsYWlucy5tYXliZV9jb21wbGFpbiA9IFRydWUKKyAgICAgICAgICAgIGl0X2NvbXBsYWluZWQgPSBGYWxzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuc29ydCgpCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIGl0X2NvbXBsYWluZWQgPSBUcnVlCisgICAgICAgICAgICBpZiBpdF9jb21wbGFpbmVkOgorICAgICAgICAgICAgICAgIENvbXBsYWlucy5tYXliZV9jb21wbGFpbiA9IEZhbHNlCisgICAgICAgICAgICAgICAgY2hlY2soImV4Y2VwdGlvbiBkdXJpbmcgc29ydCBsZWZ0IHNvbWUgcGVybXV0YXRpb24iLCB4LCBzKQorCisgICAgICAgICAgICBzID0gW1N0YWJsZShyYW5kb20ucmFuZHJhbmdlKDEwKSwgaSkgZm9yIGkgaW4geHJhbmdlKG4pXQorICAgICAgICAgICAgYXVnbWVudGVkID0gWyhlLCBlLmluZGV4KSBmb3IgZSBpbiBzXQorICAgICAgICAgICAgYXVnbWVudGVkLnNvcnQoKSAgICAjIGZvcmNlZCBzdGFibGUgYmVjYXVzZSB0aWVzIGJyb2tlbiBieSBpbmRleAorICAgICAgICAgICAgeCA9IFtlIGZvciBlLCBpIGluIGF1Z21lbnRlZF0gIyBhIHN0YWJsZSBzb3J0IG9mIHMKKyAgICAgICAgICAgIGNoZWNrKCJzdGFiaWxpdHkiLCB4LCBzKQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3RCdWdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2J1ZzQ1MzUyMyhzZWxmKToKKyAgICAgICAgIyBidWcgNDUzNTIzIC0tIGxpc3Quc29ydCgpIGNyYXNoZXIuCisgICAgICAgICMgSWYgdGhpcyBmYWlscywgdGhlIG1vc3QgbGlrZWx5IG91dGNvbWUgaXMgYSBjb3JlIGR1bXAuCisgICAgICAgICMgTXV0YXRpb25zIGR1cmluZyBhIGxpc3Qgc29ydCBzaG91bGQgcmFpc2UgYSBWYWx1ZUVycm9yLgorCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICBpZiBMIGFuZCByYW5kb20ucmFuZG9tKCkgPCAwLjc1OgorICAgICAgICAgICAgICAgICAgICBMLnBvcCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgTC5hcHBlbmQoMykKKyAgICAgICAgICAgICAgICByZXR1cm4gcmFuZG9tLnJhbmRvbSgpIDwgMC41CisKKyAgICAgICAgTCA9IFtDKCkgZm9yIGkgaW4gcmFuZ2UoNTApXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBMLnNvcnQpCisKKyAgICBkZWYgdGVzdF9jbXBOb25lKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgTm9uZSBhcyBhIGNvbXBhcmlzb24gZnVuY3Rpb24uCisKKyAgICAgICAgTCA9IHJhbmdlKDUwKQorICAgICAgICByYW5kb20uc2h1ZmZsZShMKQorICAgICAgICBMLnNvcnQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMLCByYW5nZSg1MCkpCisKKyAgICBkZWYgdGVzdF91bmRldGVjdGVkX211dGF0aW9uKHNlbGYpOgorICAgICAgICAjIFB5dGhvbiAyLjRhMSBkaWQgbm90IGFsd2F5cyBkZXRlY3QgbXV0YXRpb24KKyAgICAgICAgbWVtb3J5d2FzdGVyID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMjApOgorICAgICAgICAgICAgZGVmIG11dGF0aW5nX2NtcCh4LCB5KToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZCgzKQorICAgICAgICAgICAgICAgIEwucG9wKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gY21wKHgsIHkpCisgICAgICAgICAgICBMID0gWzEsMl0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEwuc29ydCwgbXV0YXRpbmdfY21wKQorICAgICAgICAgICAgZGVmIG11dGF0aW5nX2NtcCh4LCB5KToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZCgzKQorICAgICAgICAgICAgICAgIGRlbCBMWzpdCisgICAgICAgICAgICAgICAgcmV0dXJuIGNtcCh4LCB5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgTC5zb3J0LCBtdXRhdGluZ19jbXApCisgICAgICAgICAgICBtZW1vcnl3YXN0ZXIgPSBbbWVtb3J5d2FzdGVyXQorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIFRlc3REZWNvcmF0ZVNvcnRVbmRlY29yYXRlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2RlY29yYXRlZChzZWxmKToKKyAgICAgICAgZGF0YSA9ICdUaGUgcXVpY2sgQnJvd24gZm94IEp1bXBlZCBvdmVyIFRoZSBsYXp5IERvZycuc3BsaXQoKQorICAgICAgICBjb3B5ID0gZGF0YVs6XQorICAgICAgICByYW5kb20uc2h1ZmZsZShkYXRhKQorICAgICAgICBkYXRhLnNvcnQoa2V5PXN0ci5sb3dlcikKKyAgICAgICAgY29weS5zb3J0KGNtcD1sYW1iZGEgeCx5OiBjbXAoeC5sb3dlcigpLCB5Lmxvd2VyKCkpKQorCisgICAgZGVmIHRlc3RfYmFkZGVjb3JhdG9yKHNlbGYpOgorICAgICAgICBkYXRhID0gJ1RoZSBxdWljayBCcm93biBmb3ggSnVtcGVkIG92ZXIgVGhlIGxhenkgRG9nJy5zcGxpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGF0YS5zb3J0LCBOb25lLCBsYW1iZGEgeCx5OiAwKQorCisgICAgZGVmIHRlc3Rfc3RhYmlsaXR5KHNlbGYpOgorICAgICAgICBkYXRhID0gWyhyYW5kb20ucmFuZHJhbmdlKDEwMCksIGkpIGZvciBpIGluIHhyYW5nZSgyMDApXQorICAgICAgICBjb3B5ID0gZGF0YVs6XQorICAgICAgICBkYXRhLnNvcnQoa2V5PWxhbWJkYSB4OiB4WzBdKSAgICMgc29ydCBvbiB0aGUgcmFuZG9tIGZpcnN0IGZpZWxkCisgICAgICAgIGNvcHkuc29ydCgpICAgICAgICAgICAgICAgICAgICAgIyBzb3J0IHVzaW5nIGJvdGggZmllbGRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgY29weSkgICAgIyBzaG91bGQgZ2V0IHRoZSBzYW1lIHJlc3VsdAorCisgICAgZGVmIHRlc3RfY21wX2FuZF9rZXlfY29tYmluYXRpb24oc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgdGhlIHdyYXBwZXIgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICBkZWYgY29tcGFyZSh4LCB5KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh4KSwgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHgpLCBzdHIpCisgICAgICAgICAgICByZXR1cm4gY21wKHgsIHkpCisgICAgICAgIGRhdGEgPSAnVGhlIHF1aWNrIEJyb3duIGZveCBKdW1wZWQgb3ZlciBUaGUgbGF6eSBEb2cnLnNwbGl0KCkKKyAgICAgICAgZGF0YS5zb3J0KGNtcD1jb21wYXJlLCBrZXk9c3RyLmxvd2VyKQorCisgICAgZGVmIHRlc3RfYmFkY21wX3dpdGhfa2V5KHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSB3cmFwcGVyIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgZGF0YSA9ICdUaGUgcXVpY2sgQnJvd24gZm94IEp1bXBlZCBvdmVyIFRoZSBsYXp5IERvZycuc3BsaXQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRhdGEuc29ydCwgImJhZCIsIHN0ci5sb3dlcikKKworICAgIGRlZiB0ZXN0X2tleV93aXRoX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgd3JhcHBlciBoYXMgYmVlbiByZW1vdmVkCisgICAgICAgIGRhdGEgPSByYW5nZSgtMiwyKQorICAgICAgICBkdXAgPSBkYXRhWzpdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBkYXRhLnNvcnQsIE5vbmUsIGxhbWJkYSB4OiAxIC8vIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZHVwKQorCisgICAgZGVmIHRlc3Rfa2V5X3dpdGhfbXV0YXRpb24oc2VsZik6CisgICAgICAgIGRhdGEgPSByYW5nZSgxMCkKKyAgICAgICAgZGVmIGsoeCk6CisgICAgICAgICAgICBkZWwgZGF0YVs6XQorICAgICAgICAgICAgZGF0YVs6XSA9IHJhbmdlKDIwKQorICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZGF0YS5zb3J0LCBrZXk9aykKKworICAgIGRlZiB0ZXN0X2tleV93aXRoX211dGF0aW5nX2RlbChzZWxmKToKKyAgICAgICAgZGF0YSA9IHJhbmdlKDEwKQorICAgICAgICBjbGFzcyBTb3J0S2lsbGVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICAgICAgZGVsIGRhdGFbOl0KKyAgICAgICAgICAgICAgICBkYXRhWzpdID0gcmFuZ2UoMjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGRhdGEuc29ydCwga2V5PVNvcnRLaWxsZXIpCisKKyAgICBkZWYgdGVzdF9rZXlfd2l0aF9tdXRhdGluZ19kZWxfYW5kX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZGF0YSA9IHJhbmdlKDEwKQorICAgICAgICAjIyBkdXAgPSBkYXRhWzpdCisgICAgICAgIGNsYXNzIFNvcnRLaWxsZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBpZiB4ID4gMjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCisgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBkZWwgZGF0YVs6XQorICAgICAgICAgICAgICAgIGRhdGFbOl0gPSByYW5nZSgyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBkYXRhLnNvcnQsIGtleT1Tb3J0S2lsbGVyKQorICAgICAgICAjIyBtYWpvciBob25raW5nIHN1YnRsZXR5OiB3ZSAqY2FuJ3QqIGRvOgorICAgICAgICAjIworICAgICAgICAjIyBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGR1cCkKKyAgICAgICAgIyMKKyAgICAgICAgIyMgYmVjYXVzZSB0aGVyZSBpcyBhIHJlZmVyZW5jZSB0byBhIFNvcnRLaWxsZXIgaW4gdGhlCisgICAgICAgICMjIHRyYWNlYmFjayBhbmQgYnkgdGhlIHRpbWUgaXQgZGllcyB3ZSdyZSBvdXRzaWRlIHRoZSBjYWxsIHRvCisgICAgICAgICMjIC5zb3J0KCkgYW5kIHNvIHRoZSBsaXN0IHByb3RlY3Rpb24gZ2ltbWlja3MgYXJlIG91dCBvZgorICAgICAgICAjIyBkYXRlICh0aGlzIGNvc3Qgc29tZSBicmFpbiBjZWxscyB0byBmaWd1cmUgb3V0Li4uKS4KKworICAgIGRlZiB0ZXN0X3JldmVyc2Uoc2VsZik6CisgICAgICAgIGRhdGEgPSByYW5nZSgxMDApCisgICAgICAgIHJhbmRvbS5zaHVmZmxlKGRhdGEpCisgICAgICAgIGRhdGEuc29ydChyZXZlcnNlPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgcmFuZ2UoOTksLTEsLTEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRhdGEuc29ydCwgIndyb25nIHR5cGUiKQorCisgICAgZGVmIHRlc3RfcmV2ZXJzZV9zdGFiaWxpdHkoc2VsZik6CisgICAgICAgIGRhdGEgPSBbKHJhbmRvbS5yYW5kcmFuZ2UoMTAwKSwgaSkgZm9yIGkgaW4geHJhbmdlKDIwMCldCisgICAgICAgIGNvcHkxID0gZGF0YVs6XQorICAgICAgICBjb3B5MiA9IGRhdGFbOl0KKyAgICAgICAgZGF0YS5zb3J0KGNtcD1sYW1iZGEgeCx5OiBjbXAoeFswXSx5WzBdKSwgcmV2ZXJzZT1UcnVlKQorICAgICAgICBjb3B5MS5zb3J0KGNtcD1sYW1iZGEgeCx5OiBjbXAoeVswXSx4WzBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBjb3B5MSkKKyAgICAgICAgY29weTIuc29ydChrZXk9bGFtYmRhIHg6IHhbMF0sIHJldmVyc2U9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBjb3B5MikKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9jbGFzc2VzID0gKAorICAgICAgICBUZXN0QmFzZSwKKyAgICAgICAgVGVzdERlY29yYXRlU29ydFVuZGVjb3JhdGUsCisgICAgICAgIFRlc3RCdWdzLAorICAgICkKKworICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoInRoZSBjbXAgYXJndW1lbnQgaXMgbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKKyAgICAgICAgIyB2ZXJpZnkgcmVmZXJlbmNlIGNvdW50aW5nCisgICAgICAgIGlmIHZlcmJvc2UgYW5kIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgorICAgICAgICAgICAgaW1wb3J0IGdjCisgICAgICAgICAgICBjb3VudHMgPSBbTm9uZV0gKiA1CisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKGNvdW50cykpOgorICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgICAgICBjb3VudHNbaV0gPSBzeXMuZ2V0dG90YWxyZWZjb3VudCgpCisgICAgICAgICAgICBwcmludCBjb3VudHMKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ydC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb3J0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdiZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ydC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zb3J0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjdiZGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc29ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3FsaXRlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3FsaXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjczMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHkKQEAgLTAsMCArMSwxNiBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCisKKyMgU2tpcCB0ZXN0IGlmIF9zcWxpdGUzIG1vZHVsZSB3YXMgbm90IGJ1aWx0LgoraW1wb3J0X21vZHVsZSgnX3NxbGl0ZTMnKQorCitmcm9tIHNxbGl0ZTMudGVzdCBpbXBvcnQgKGRiYXBpLCB0eXBlcywgdXNlcmZ1bmN0aW9ucywgcHkyNXRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LCB0cmFuc2FjdGlvbnMsIGhvb2tzLCByZWdyZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdW1wKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KGRiYXBpLnN1aXRlKCksIHR5cGVzLnN1aXRlKCksIHVzZXJmdW5jdGlvbnMuc3VpdGUoKSwKKyAgICAgICAgICAgICAgICAgcHkyNXRlc3RzLnN1aXRlKCksIGZhY3Rvcnkuc3VpdGUoKSwgdHJhbnNhY3Rpb25zLnN1aXRlKCksCisgICAgICAgICAgICAgICAgIGhvb2tzLnN1aXRlKCksIHJlZ3Jlc3Npb24uc3VpdGUoKSwgZHVtcC5zdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3FsaXRlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc0YjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3FsaXRlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zcWxpdGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3FsaXRlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODc0YjUzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3FsaXRlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zc2wucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zc2wucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1MjE5OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weQpAQCAtMCwwICsxLDEzOTQgQEAKKyMgVGVzdCB0aGUgc3VwcG9ydCBmb3IgU1NMIGFuZCBzb2NrZXRzCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBhc3luY29yZQoraW1wb3J0IHNvY2tldAoraW1wb3J0IHNlbGVjdAoraW1wb3J0IHRpbWUKK2ltcG9ydCBnYworaW1wb3J0IG9zCitpbXBvcnQgZXJybm8KK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCB1cmxsaWIsIHVybHBhcnNlCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgd2Vha3JlZgoraW1wb3J0IGZ1bmN0b29scworaW1wb3J0IHBsYXRmb3JtCisKK2Zyb20gQmFzZUhUVFBTZXJ2ZXIgaW1wb3J0IEhUVFBTZXJ2ZXIKK2Zyb20gU2ltcGxlSFRUUFNlcnZlciBpbXBvcnQgU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyCisKK3NzbCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCJzc2wiKQorCitIT1NUID0gdGVzdF9zdXBwb3J0LkhPU1QKK0NFUlRGSUxFID0gTm9uZQorU1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJUID0gTm9uZQorCitkZWYgaGFuZGxlX2Vycm9yKHByZWZpeCk6CisgICAgZXhjX2Zvcm1hdCA9ICcgJy5qb2luKHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKCpzeXMuZXhjX2luZm8oKSkpCisgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUocHJlZml4ICsgZXhjX2Zvcm1hdCkKKworCitjbGFzcyBCYXNpY1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NzbHdyYXBfc2ltcGxlKHNlbGYpOgorICAgICAgICAjIEEgY3J1ZGUgdGVzdCBmb3IgdGhlIGxlZ2FjeSBBUEkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3NsLnNzbHdyYXBfc2ltcGxlKHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gMzI6ICMgYnJva2VuIHBpcGUgd2hlbiBzc2xfc29jay5kb19oYW5kc2hha2UoKSwgdGhpcyB0ZXN0IGRvZXNuJ3QgY2FyZSBhYm91dCB0aGF0CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzc2wuc3Nsd3JhcF9zaW1wbGUoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkuX3NvY2spCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBlOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSAzMjogIyBicm9rZW4gcGlwZSB3aGVuIHNzbF9zb2NrLmRvX2hhbmRzaGFrZSgpLCB0aGlzIHRlc3QgZG9lc24ndCBjYXJlIGFib3V0IHRoYXQKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyMgSXNzdWUgIzk0MTU6IFVidW50dSBoaWphY2tzIHRoZWlyIE9wZW5TU0wgYW5kIGZvcmNlZnVsbHkgZGlzYWJsZXMgU1NMdjIKK2RlZiBza2lwX2lmX2Jyb2tlbl91YnVudHVfc3NsKGZ1bmMpOgorICAgIGlmIGhhc2F0dHIoc3NsLCAnUFJPVE9DT0xfU1NMdjInKToKKyAgICAgICAgIyBXZSBuZWVkIHRvIGFjY2VzcyB0aGUgbG93ZXItbGV2ZWwgd3JhcHBlciBpbiBvcmRlciB0byBjcmVhdGUgYW4KKyAgICAgICAgIyBpbXBsaWNpdCBTU0wgY29udGV4dCB3aXRob3V0IHRyeWluZyB0byBjb25uZWN0IG9yIGxpc3Rlbi4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IF9zc2wKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgIyBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gd29uJ3QgZ2V0IGV4ZWN1dGVkLCBqdXN0IGlnbm9yZSB0aGUgZXJyb3IKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgQGZ1bmN0b29scy53cmFwcyhmdW5jKQorICAgICAgICBkZWYgZigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKQorICAgICAgICAgICAgICAgIF9zc2wuc3Nsd3JhcChzLl9zb2NrLCAwLCBOb25lLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wuQ0VSVF9OT05FLCBzc2wuUFJPVE9DT0xfU1NMdjIsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yIGFzIGU6CisgICAgICAgICAgICAgICAgaWYgKHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTyA9PSAoMCwgOSwgOCwgMTUsIDE1KSBhbmQKKyAgICAgICAgICAgICAgICAgICAgcGxhdGZvcm0ubGludXhfZGlzdHJpYnV0aW9uKCkgPT0gKCdkZWJpYW4nLCAnc3F1ZWV6ZS9zaWQnLCAnJykKKyAgICAgICAgICAgICAgICAgICAgYW5kICdJbnZhbGlkIFNTTCBwcm90b2NvbCB2YXJpYW50IHNwZWNpZmllZCcgaW4gc3RyKGUpKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIlBhdGNoZWQgVWJ1bnR1IE9wZW5TU0wgYnJlYWtzIGJlaGF2aW91ciIpCisgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHJldHVybiBmCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGZ1bmMKKworCitjbGFzcyBCYXNpY1NvY2tldFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2NvbnN0YW50cyhzZWxmKToKKyAgICAgICAgI3NzbC5QUk9UT0NPTF9TU0x2MgorICAgICAgICBzc2wuUFJPVE9DT0xfU1NMdjIzCisgICAgICAgIHNzbC5QUk9UT0NPTF9TU0x2MworICAgICAgICBzc2wuUFJPVE9DT0xfVExTdjEKKyAgICAgICAgc3NsLkNFUlRfTk9ORQorICAgICAgICBzc2wuQ0VSVF9PUFRJT05BTAorICAgICAgICBzc2wuQ0VSVF9SRVFVSVJFRAorCisgICAgZGVmIHRlc3RfcmFuZG9tKHNlbGYpOgorICAgICAgICB2ID0gc3NsLlJBTkRfc3RhdHVzKCkKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiBSQU5EX3N0YXR1cyBpcyAlZCAoJXMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHYsICh2IGFuZCAic3VmZmljaWVudCByYW5kb21uZXNzIikgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3VmZmljaWVudCByYW5kb21uZXNzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3NsLlJBTkRfZWdkLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNzbC5SQU5EX2VnZCwgJ2ZvbycsIDEpCisgICAgICAgIHNzbC5SQU5EX2FkZCgidGhpcyBpcyBhIHJhbmRvbSBzdHJpbmciLCA3NS4wKQorCisgICAgZGVmIHRlc3RfcGFyc2VfY2VydChzZWxmKToKKyAgICAgICAgIyBub3RlIHRoYXQgdGhpcyB1c2VzIGFuICd1bm9mZmljaWFsJyBmdW5jdGlvbiBpbiBfc3NsLmMsCisgICAgICAgICMgcHJvdmlkZWQgc29sZWx5IGZvciB0aGlzIHRlc3QsIHRvIGV4ZXJjaXNlIHRoZSBjZXJ0aWZpY2F0ZQorICAgICAgICAjIHBhcnNpbmcgY29kZQorICAgICAgICBwID0gc3NsLl9zc2wuX3Rlc3RfZGVjb2RlX2NlcnQoQ0VSVEZJTEUsIEZhbHNlKQorICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIiArIHBwcmludC5wZm9ybWF0KHApICsgIlxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWydzdWJqZWN0J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgoJ2NvdW50cnlOYW1lJywgJ1hZJyksKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnbG9jYWxpdHlOYW1lJywgJ0Nhc3RsZSBBbnRocmF4JyksKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCgnb3JnYW5pemF0aW9uTmFtZScsICdQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbicpLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgoJ2NvbW1vbk5hbWUnLCAnbG9jYWxob3N0JyksKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWydzdWJqZWN0QWx0TmFtZSddLCAoKCdETlMnLCAnbG9jYWxob3N0JyksKSkKKyAgICAgICAgIyBJc3N1ZSAjMTMwMzQ6IHRoZSBzdWJqZWN0QWx0TmFtZSBpbiBzb21lIGNlcnRpZmljYXRlcworICAgICAgICAjIChub3RhYmx5IHByb2plY3RzLmRldmVsb3Blci5ub2tpYS5jb206NDQzKSB3YXNuJ3QgcGFyc2VkCisgICAgICAgIHAgPSBzc2wuX3NzbC5fdGVzdF9kZWNvZGVfY2VydChOT0tJQUNFUlQpCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iICsgcHByaW50LnBmb3JtYXQocCkgKyAiXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbJ3N1YmplY3RBbHROYW1lJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgKCgnRE5TJywgJ3Byb2plY3RzLmRldmVsb3Blci5ub2tpYS5jb20nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCdETlMnLCAncHJvamVjdHMuZm9ydW0ubm9raWEuY29tJykpCisgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9ERVJfdG9fUEVNKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oU1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJULCAncicpIGFzIGY6CisgICAgICAgICAgICBwZW0gPSBmLnJlYWQoKQorICAgICAgICBkMSA9IHNzbC5QRU1fY2VydF90b19ERVJfY2VydChwZW0pCisgICAgICAgIHAyID0gc3NsLkRFUl9jZXJ0X3RvX1BFTV9jZXJ0KGQxKQorICAgICAgICBkMiA9IHNzbC5QRU1fY2VydF90b19ERVJfY2VydChwMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgZDIpCisgICAgICAgIGlmIG5vdCBwMi5zdGFydHN3aXRoKHNzbC5QRU1fSEVBREVSICsgJ1xuJyk6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRFUi10by1QRU0gZGlkbid0IGluY2x1ZGUgY29ycmVjdCBoZWFkZXI6XG4lclxuIiAlIHAyKQorICAgICAgICBpZiBub3QgcDIuZW5kc3dpdGgoJ1xuJyArIHNzbC5QRU1fRk9PVEVSICsgJ1xuJyk6CisgICAgICAgICAgICBzZWxmLmZhaWwoIkRFUi10by1QRU0gZGlkbid0IGluY2x1ZGUgY29ycmVjdCBmb290ZXI6XG4lclxuIiAlIHAyKQorCisgICAgZGVmIHRlc3Rfb3BlbnNzbF92ZXJzaW9uKHNlbGYpOgorICAgICAgICBuID0gc3NsLk9QRU5TU0xfVkVSU0lPTl9OVU1CRVIKKyAgICAgICAgdCA9IHNzbC5PUEVOU1NMX1ZFUlNJT05fSU5GTworICAgICAgICBzID0gc3NsLk9QRU5TU0xfVkVSU0lPTgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobiwgKGludCwgbG9uZykpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0LCB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHMsIHN0cikKKyAgICAgICAgIyBTb21lIHNhbml0eSBjaGVja3MgZm9sbG93CisgICAgICAgICMgPj0gMC45CisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4sIDB4OTAwMDAwKQorICAgICAgICAjIDwgMi4wCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhuLCAweDIwMDAwMDAwKQorICAgICAgICBtYWpvciwgbWlub3IsIGZpeCwgcGF0Y2gsIHN0YXR1cyA9IHQKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobWFqb3IsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhtYWpvciwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobWlub3IsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhtaW5vciwgMjU2KQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChmaXgsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyhmaXgsIDI1NikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwocGF0Y2gsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHBhdGNoLCAyNikKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoc3RhdHVzLCAwKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChzdGF0dXMsIDE1KQorICAgICAgICAjIFZlcnNpb24gc3RyaW5nIGFzIHJldHVybmVkIGJ5IE9wZW5TU0wsIHRoZSBmb3JtYXQgbWlnaHQgY2hhbmdlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoIk9wZW5TU0wgezpkfS57OmR9Lns6ZH0iLmZvcm1hdChtYWpvciwgbWlub3IsIGZpeCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgKHMsIHQpKQorCisgICAgZGVmIHRlc3RfY2lwaGVycyhzZWxmKToKKyAgICAgICAgaWYgbm90IHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmVtb3RlID0gKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHJlbW90ZVswXSk6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2lwaGVycz0iQUxMIikKKyAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfTk9ORSwgY2lwaGVycz0iREVGQVVMVCIpCisgICAgICAgICAgICBzLmNvbm5lY3QocmVtb3RlKQorICAgICAgICAgICAgIyBFcnJvciBjaGVja2luZyBvY2N1cnMgd2hlbiBjb25uZWN0aW5nLCBiZWNhdXNlIHRoZSBTU0wgY29udGV4dAorICAgICAgICAgICAgIyBpc24ndCBjcmVhdGVkIGJlZm9yZS4KKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLCBjaXBoZXJzPSJeJDosOz8qJ2Rvcm90aHl4IikKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoc3NsLlNTTEVycm9yLCAiTm8gY2lwaGVyIGNhbiBiZSBzZWxlY3RlZCIpOgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X3JlZmN5Y2xlKHNlbGYpOgorICAgICAgICAjIElzc3VlICM3OTQzOiBhbiBTU0wgb2JqZWN0IGRvZXNuJ3QgY3JlYXRlIHJlZmVyZW5jZSBjeWNsZXMgd2l0aAorICAgICAgICAjIGl0c2VsZi4KKyAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgIHNzID0gc3NsLndyYXBfc29ja2V0KHMpCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoc3MpCisgICAgICAgIGRlbCBzcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyKCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF93cmFwcGVkX3VuY29ubmVjdGVkKHNlbGYpOgorICAgICAgICAjIFRoZSBfZGVsZWdhdGVfbWV0aG9kcyBpbiBzb2NrZXQucHkgYXJlIGNvcnJlY3RseSBkZWxlZ2F0ZWQgdG8gYnkgYW4KKyAgICAgICAgIyB1bmNvbm5lY3RlZCBTU0xTb2NrZXQsIHNvIHRoZXkgd2lsbCByYWlzZSBhIHNvY2tldC5lcnJvciByYXRoZXIgdGhhbgorICAgICAgICAjIHNvbWV0aGluZyB1bmV4cGVjdGVkIGxpa2UgVHlwZUVycm9yLgorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgc3MgPSBzc2wud3JhcF9zb2NrZXQocykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzcy5yZWN2LCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNzLnJlY3ZfaW50bywgYnl0ZWFycmF5KGIneCcpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNzLnJlY3Zmcm9tLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNzLnJlY3Zmcm9tX2ludG8sIGJ5dGVhcnJheShiJ3gnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzcy5zZW5kLCBiJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNzLnNlbmR0bywgYid4JywgKCcwLjAuMC4wJywgMCkpCisKKworY2xhc3MgTmV0d29ya2VkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfY29ubmVjdChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzdm4ucHl0aG9uLm9yZyIpOgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX05PTkUpCisgICAgICAgICAgICBzLmNvbm5lY3QoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykpCisgICAgICAgICAgICBjID0gcy5nZXRwZWVyY2VydCgpCisgICAgICAgICAgICBpZiBjOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUGVlciBjZXJ0ICVzIHNob3VsZG4ndCBiZSBoZXJlISIpCisgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICAgICAgIyB0aGlzIHNob3VsZCBmYWlsIGJlY2F1c2Ugd2UgaGF2ZSBubyB2ZXJpZmljYXRpb24gY2VydHMKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykpCisgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgICAgICMgdGhpcyBzaG91bGQgc3VjY2VlZCBiZWNhdXNlIHdlIHNwZWNpZnkgdGhlIHJvb3QgY2VydAorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1TVk5fUFlUSE9OX09SR19ST09UX0NFUlQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5jb25uZWN0KCgic3ZuLnB5dGhvbi5vcmciLCA0NDMpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2Nvbm5lY3RfZXgoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzExMzI2OiBjaGVjayBjb25uZWN0X2V4KCkgaW1wbGVtZW50YXRpb24KKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzdm4ucHl0aG9uLm9yZyIpOgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1TVk5fUFlUSE9OX09SR19ST09UX0NFUlQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzLmNvbm5lY3RfZXgoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHBlZXJjZXJ0KCkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgZGVmIHRlc3Rfbm9uX2Jsb2NraW5nX2Nvbm5lY3RfZXgoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzExMzI2OiBub24tYmxvY2tpbmcgY29ubmVjdF9leCgpIHNob3VsZCBhbGxvdyBoYW5kc2hha2UKKyAgICAgICAgIyB0byBwcm9jZWVkIGFmdGVyIHRoZSBzb2NrZXQgZ2V0cyByZWFkeS4KKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KCJzdm4ucHl0aG9uLm9yZyIpOgorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPXNzbC5DRVJUX1JFUVVJUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1TVk5fUFlUSE9OX09SR19ST09UX0NFUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX2hhbmRzaGFrZV9vbl9jb25uZWN0PUZhbHNlKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgICAgICAgICAgcmMgPSBzLmNvbm5lY3RfZXgoKCdzdm4ucHl0aG9uLm9yZycsIDQ0MykpCisgICAgICAgICAgICAgICAgIyBFV09VTERCTE9DSyB1bmRlciBXaW5kb3dzLCBFSU5QUk9HUkVTUyBlbHNld2hlcmUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJjLCAoMCwgZXJybm8uRUlOUFJPR1JFU1MsIGVycm5vLkVXT1VMREJMT0NLKSkKKyAgICAgICAgICAgICAgICAjIFdhaXQgZm9yIGNvbm5lY3QgdG8gZmluaXNoCisgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSwgNS4wKQorICAgICAgICAgICAgICAgICMgTm9uLWJsb2NraW5nIGhhbmRzaGFrZQorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHMuZG9faGFuZHNoYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmFyZ3NbMF0gPT0gc3NsLlNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbc10sIFtdLCBbXSwgNS4wKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBlcnIuYXJnc1swXSA9PSBzc2wuU1NMX0VSUk9SX1dBTlRfV1JJVEU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnNlbGVjdChbXSwgW3NdLCBbXSwgNS4wKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICMgU1NMIGVzdGFibGlzaGVkCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZ2V0cGVlcmNlcnQoKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90aW1lb3V0X2Nvbm5lY3RfZXgoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEyMDY1OiBvbiBhIHRpbWVvdXQsIGNvbm5lY3RfZXgoKSBzaG91bGQgcmV0dXJuIHRoZSBvcmlnaW5hbAorICAgICAgICAjIGVycm5vIChtaW1pY2tpbmcgdGhlIGJlaGF2aW91ciBvZiBub24tU1NMIHNvY2tldHMpLgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9faGFuZHNoYWtlX29uX2Nvbm5lY3Q9RmFsc2UpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcy5zZXR0aW1lb3V0KDAuMDAwMDAwMSkKKyAgICAgICAgICAgICAgICByYyA9IHMuY29ubmVjdF9leCgoJ3N2bi5weXRob24ub3JnJywgNDQzKSkKKyAgICAgICAgICAgICAgICBpZiByYyA9PSAwOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJzdm4ucHl0aG9uLm9yZyByZXNwb25kZWQgdG9vIHF1aWNrbHkiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmMsIChlcnJuby5FQUdBSU4sIGVycm5vLkVXT1VMREJMT0NLKSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9jb25uZWN0X2V4X2Vycm9yKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPVNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVycm5vLkVDT05OUkVGVVNFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMuY29ubmVjdF9leCgoInN2bi5weXRob24ub3JnIiwgNDQ0KSkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihvcy5uYW1lID09ICJudCIsICJDYW4ndCB1c2UgYSBzb2NrZXQgYXMgYSBmaWxlIHVuZGVyIFdpbmRvd3MiKQorICAgIGRlZiB0ZXN0X21ha2VmaWxlX2Nsb3NlKHNlbGYpOgorICAgICAgICAjIElzc3VlICM1MjM4OiBjcmVhdGluZyBhIGZpbGUtbGlrZSBvYmplY3Qgd2l0aCBtYWtlZmlsZSgpIHNob3VsZG4ndAorICAgICAgICAjIGRlbGF5IGNsb3NpbmcgdGhlIHVuZGVybHlpbmcgInJlYWwgc29ja2V0IiAoaGVyZSB0ZXN0ZWQgd2l0aCBpdHMKKyAgICAgICAgIyBmaWxlIGRlc2NyaXB0b3IsIGhlbmNlIHNraXBwaW5nIHRoZSB0ZXN0IHVuZGVyIFdpbmRvd3MpLgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgICBzcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVUKSkKKyAgICAgICAgICAgIHNzLmNvbm5lY3QoKCJzdm4ucHl0aG9uLm9yZyIsIDQ0MykpCisgICAgICAgICAgICBmZCA9IHNzLmZpbGVubygpCisgICAgICAgICAgICBmID0gc3MubWFrZWZpbGUoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAjIFRoZSBmZCBpcyBzdGlsbCBvcGVuCisgICAgICAgICAgICBvcy5yZWFkKGZkLCAwKQorICAgICAgICAgICAgIyBDbG9zaW5nIHRoZSBTU0wgc29ja2V0IHNob3VsZCBjbG9zZSB0aGUgZmQgdG9vCisgICAgICAgICAgICBzcy5jbG9zZSgpCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcikgYXMgZToKKyAgICAgICAgICAgICAgICBvcy5yZWFkKGZkLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRUJBREYpCisKKyAgICBkZWYgdGVzdF9ub25fYmxvY2tpbmdfaGFuZHNoYWtlKHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoInN2bi5weXRob24ub3JnIik6CisgICAgICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgICAgIHMuY29ubmVjdCgoInN2bi5weXRob24ub3JnIiwgNDQzKSkKKyAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoRmFsc2UpCisgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgcy5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgaWYgZXJyLmFyZ3NbMF0gPT0gc3NsLlNTTF9FUlJPUl9XQU5UX1JFQUQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Quc2VsZWN0KFtzXSwgW10sIFtdKQorICAgICAgICAgICAgICAgICAgICBlbGlmIGVyci5hcmdzWzBdID09IHNzbC5TU0xfRVJST1JfV0FOVF9XUklURToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zZWxlY3QoW10sIFtzXSwgW10pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgcy5jbG9zZSgpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbk5lZWRlZCAlZCBjYWxscyB0byBkb19oYW5kc2hha2UoKSB0byBlc3RhYmxpc2ggc2Vzc2lvbi5cbiIgJSBjb3VudCkKKworICAgIGRlZiB0ZXN0X2dldF9zZXJ2ZXJfY2VydGlmaWNhdGUoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic3ZuLnB5dGhvbi5vcmciKToKKyAgICAgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKCgic3ZuLnB5dGhvbi5vcmciLCA0NDMpKQorICAgICAgICAgICAgaWYgbm90IHBlbToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIHNlcnZlciBjZXJ0aWZpY2F0ZSBvbiBzdm4ucHl0aG9uLm9yZzo0NDMhIikKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKCgic3ZuLnB5dGhvbi5vcmciLCA0NDMpLCBjYV9jZXJ0cz1DRVJURklMRSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3I6CisgICAgICAgICAgICAgICAgI3Nob3VsZCBmYWlsCisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkdvdCBzZXJ2ZXIgY2VydGlmaWNhdGUgJXMgZm9yIHN2bi5weXRob24ub3JnISIgJSBwZW0pCisKKyAgICAgICAgICAgIHBlbSA9IHNzbC5nZXRfc2VydmVyX2NlcnRpZmljYXRlKCgic3ZuLnB5dGhvbi5vcmciLCA0NDMpLCBjYV9jZXJ0cz1TVk5fUFlUSE9OX09SR19ST09UX0NFUlQpCisgICAgICAgICAgICBpZiBub3QgcGVtOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiTm8gc2VydmVyIGNlcnRpZmljYXRlIG9uIHN2bi5weXRob24ub3JnOjQ0MyEiKQorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5WZXJpZmllZCBjZXJ0aWZpY2F0ZSBmb3Igc3ZuLnB5dGhvbi5vcmc6NDQzIGlzXG4lc1xuIiAlIHBlbSkKKworICAgIGRlZiB0ZXN0X2FsZ29yaXRobXMoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzg0ODQ6IGFsbCBhbGdvcml0aG1zIHNob3VsZCBiZSBhdmFpbGFibGUgd2hlbiB2ZXJpZnlpbmcgYQorICAgICAgICAjIGNlcnRpZmljYXRlLgorICAgICAgICAjIFNIQTI1NiB3YXMgYWRkZWQgaW4gT3BlblNTTCAwLjkuOAorICAgICAgICBpZiBzc2wuT1BFTlNTTF9WRVJTSU9OX0lORk8gPCAoMCwgOSwgOCwgMCwgMTUpOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiU0hBMjU2IG5vdCBhdmFpbGFibGUgb24gJXIiICUgc3NsLk9QRU5TU0xfVkVSU0lPTikKKyAgICAgICAgc2VsZi5za2lwVGVzdCgicmVtb3RlIGhvc3QgbmVlZHMgU05JLCBvbmx5IGF2YWlsYWJsZSBvbiBQeXRob24gMy4yKyIpCisgICAgICAgICMgTk9URTogaHR0cHM6Ly9zaGEyLmhib2Vjay5kZSBpcyBhbm90aGVyIHBvc3NpYmxlIHRlc3QgaG9zdAorICAgICAgICByZW1vdGUgPSAoInNoYTI1Ni50YnMtaW50ZXJuZXQuY29tIiwgNDQzKQorICAgICAgICBzaGEyNTZfY2VydCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAic2hhMjU2LnBlbSIpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgic2hhMjU2LnRicy1pbnRlcm5ldC5jb20iKToKKyAgICAgICAgICAgIHMgPSBzc2wud3JhcF9zb2NrZXQoc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9c2hhMjU2X2NlcnQsKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChyZW1vdGUpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuQ2lwaGVyIHdpdGggJXIgaXMgJXJcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdGUsIHMuY2lwaGVyKCkpKQorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJDZXJ0aWZpY2F0ZSBpczpcbiVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChzLmdldHBlZXJjZXJ0KCkpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworCit0cnk6CisgICAgaW1wb3J0IHRocmVhZGluZworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIF9oYXZlX3RocmVhZHMgPSBGYWxzZQorZWxzZToKKyAgICBfaGF2ZV90aHJlYWRzID0gVHJ1ZQorCisgICAgY2xhc3MgVGhyZWFkZWRFY2hvU2VydmVyKHRocmVhZGluZy5UaHJlYWQpOgorCisgICAgICAgIGNsYXNzIENvbm5lY3Rpb25IYW5kbGVyKHRocmVhZGluZy5UaHJlYWQpOgorCisgICAgICAgICAgICAiIiJBIG1pbGRseSBjb21wbGljYXRlZCBjbGFzcywgYmVjYXVzZSB3ZSB3YW50IGl0IHRvIHdvcmsgYm90aAorICAgICAgICAgICAgd2l0aCBhbmQgd2l0aG91dCB0aGUgU1NMIHdyYXBwZXIgYXJvdW5kIHRoZSBzb2NrZXQgY29ubmVjdGlvbiwgc28KKyAgICAgICAgICAgIHRoYXQgd2UgY2FuIHRlc3QgdGhlIFNUQVJUVExTIGZ1bmN0aW9uYWxpdHkuIiIiCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXIsIGNvbm5zb2NrKToKKyAgICAgICAgICAgICAgICBzZWxmLnNlcnZlciA9IHNlcnZlcgorICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gY29ubnNvY2sKKyAgICAgICAgICAgICAgICBzZWxmLnNvY2suc2V0YmxvY2tpbmcoMSkKKyAgICAgICAgICAgICAgICBzZWxmLnNzbGNvbm4gPSBOb25lCisgICAgICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQorCisgICAgICAgICAgICBkZWYgc2hvd19jb25uX2RldGFpbHMoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zZXJ2ZXIuY2VydHJlcXMgPT0gc3NsLkNFUlRfUkVRVUlSRUQ6CisgICAgICAgICAgICAgICAgICAgIGNlcnQgPSBzZWxmLnNzbGNvbm4uZ2V0cGVlcmNlcnQoKQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsaWVudCBjZXJ0IGlzICIgKyBwcHJpbnQucGZvcm1hdChjZXJ0KSArICJcbiIpCisgICAgICAgICAgICAgICAgICAgIGNlcnRfYmluYXJ5ID0gc2VsZi5zc2xjb25uLmdldHBlZXJjZXJ0KFRydWUpCisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlIGFuZCBzZWxmLnNlcnZlci5jaGF0dHk6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2VydCBiaW5hcnkgaXMgIiArIHN0cihsZW4oY2VydF9iaW5hcnkpKSArICIgYnl0ZXNcbiIpCisgICAgICAgICAgICAgICAgY2lwaGVyID0gc2VsZi5zc2xjb25uLmNpcGhlcigpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuc2VydmVyLmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogY29ubmVjdGlvbiBjaXBoZXIgaXMgbm93ICIgKyBzdHIoY2lwaGVyKSArICJcbiIpCisKKyAgICAgICAgICAgIGRlZiB3cmFwX2Nvbm4oc2VsZik6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbGNvbm4gPSBzc2wud3JhcF9zb2NrZXQoc2VsZi5zb2NrLCBzZXJ2ZXJfc2lkZT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5zZXJ2ZXIuY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zZWxmLnNlcnZlci5wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhX2NlcnRzPXNlbGYuc2VydmVyLmNhY2VydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c2VsZi5zZXJ2ZXIuY2VydHJlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPXNlbGYuc2VydmVyLmNpcGhlcnMpCisgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAjIFhYWCBWYXJpb3VzIGVycm9ycyBjYW4gaGF2ZSBoYXBwZW5lZCBoZXJlLCBmb3IgZXhhbXBsZQorICAgICAgICAgICAgICAgICAgICAjIGEgbWlzbWF0Y2hpbmcgcHJvdG9jb2wgdmVyc2lvbiwgYW4gaW52YWxpZCBjZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgIyBvciBhIGxvdy1sZXZlbCBidWcuIFRoaXMgc2hvdWxkIGJlIG1hZGUgbW9yZSBkaXNjcmltaW5hdGluZy4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuY29ubl9lcnJvcnMuYXBwZW5kKGUpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyLmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZV9lcnJvcigiXG4gc2VydmVyOiAgYmFkIGNvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihzZWxmLnNvY2suZ2V0cGVlcm5hbWUoKSkgKyAiOlxuIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICBkZWYgcmVhZChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNzbGNvbm46CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNzbGNvbm4ucmVhZCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc29jay5yZWN2KDEwMjQpCisKKyAgICAgICAgICAgIGRlZiB3cml0ZShzZWxmLCBieXRlcyk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5zc2xjb25uOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zc2xjb25uLndyaXRlKGJ5dGVzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNvY2suc2VuZChieXRlcykKKworICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc3NsY29ubjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zc2xjb25uLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2suX3NvY2suY2xvc2UoKQorCisgICAgICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IFRydWUKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zZXJ2ZXIuc3RhcnR0bHNfc2VydmVyOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuc29jaywgc3NsLlNTTFNvY2tldCk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNzbGNvbm4gPSBzZWxmLnNvY2sKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi53cmFwX2Nvbm4oKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3dfY29ubl9kZXRhaWxzKCkKKyAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnJ1bm5pbmc6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IHNlbGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3QgbXNnOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZW9mLCBzbyBxdWl0IHRoaXMgaGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucnVubmluZyA9IEZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG1zZy5zdHJpcCgpID09ICdvdmVyJzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogY2xpZW50IGNsb3NlZCBjb25uZWN0aW9uXG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnNlcnZlci5zdGFydHRsc19zZXJ2ZXIgYW5kIG1zZy5zdHJpcCgpID09ICdTVEFSVFRMUyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuc2VydmVyLmNvbm5lY3Rpb25jaGF0dHk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBzZXJ2ZXI6IHJlYWQgU1RBUlRUTFMgZnJvbSBjbGllbnQsIHNlbmRpbmcgT0suLi5cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZSgiT0tcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYud3JhcF9jb25uKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICAgICAgICAgZWxpZiBzZWxmLnNlcnZlci5zdGFydHRsc19zZXJ2ZXIgYW5kIHNlbGYuc3NsY29ubiBhbmQgbXNnLnN0cmlwKCkgPT0gJ0VORFRMUyc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuc2VydmVyLmNvbm5lY3Rpb25jaGF0dHk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBzZXJ2ZXI6IHJlYWQgRU5EVExTIGZyb20gY2xpZW50LCBzZW5kaW5nIE9LLi4uXG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoIk9LXG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubi51bndyYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc3NsY29ubiA9IE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogY29ubmVjdGlvbiBpcyBub3cgdW5lbmNyeXB0ZWQuLi5cbiIpCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuY29ubmVjdGlvbmNoYXR0eSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlID0gKHNlbGYuc3NsY29ubiBhbmQgImVuY3J5cHRlZCIpIG9yICJ1bmVuY3J5cHRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogcmVhZCAlcyAoJXMpLCBzZW5kaW5nIGJhY2sgJXMgKCVzKS4uLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHJlcHIobXNnKSwgY3R5cGUsIHJlcHIobXNnLmxvd2VyKCkpLCBjdHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShtc2cubG93ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNzbC5TU0xFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyLmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVfZXJyb3IoIlRlc3Qgc2VydmVyIGZhaWx1cmU6XG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgIyBub3JtYWxseSwgd2UnZCBqdXN0IHN0b3AgaGVyZSwgYnV0IGZvciB0aGUgdGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgIyBoYXJuZXNzLCB3ZSB3YW50IHRvIHN0b3AgdGhlIHNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNlcnRpZmljYXRlLCBzc2xfdmVyc2lvbj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgY2VydHJlcXM9Tm9uZSwgY2FjZXJ0cz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgY2hhdHR5PVRydWUsIGNvbm5lY3Rpb25jaGF0dHk9RmFsc2UsIHN0YXJ0dGxzX3NlcnZlcj1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIHdyYXBfYWNjZXB0aW5nX3NvY2tldD1GYWxzZSwgY2lwaGVycz1Ob25lKToKKworICAgICAgICAgICAgaWYgc3NsX3ZlcnNpb24gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbiA9IHNzbC5QUk9UT0NPTF9UTFN2MQorICAgICAgICAgICAgaWYgY2VydHJlcXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjZXJ0cmVxcyA9IHNzbC5DRVJUX05PTkUKKyAgICAgICAgICAgIHNlbGYuY2VydGlmaWNhdGUgPSBjZXJ0aWZpY2F0ZQorICAgICAgICAgICAgc2VsZi5wcm90b2NvbCA9IHNzbF92ZXJzaW9uCisgICAgICAgICAgICBzZWxmLmNlcnRyZXFzID0gY2VydHJlcXMKKyAgICAgICAgICAgIHNlbGYuY2FjZXJ0cyA9IGNhY2VydHMKKyAgICAgICAgICAgIHNlbGYuY2lwaGVycyA9IGNpcGhlcnMKKyAgICAgICAgICAgIHNlbGYuY2hhdHR5ID0gY2hhdHR5CisgICAgICAgICAgICBzZWxmLmNvbm5lY3Rpb25jaGF0dHkgPSBjb25uZWN0aW9uY2hhdHR5CisgICAgICAgICAgICBzZWxmLnN0YXJ0dGxzX3NlcnZlciA9IHN0YXJ0dGxzX3NlcnZlcgorICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICBzZWxmLmZsYWcgPSBOb25lCisgICAgICAgICAgICBpZiB3cmFwX2FjY2VwdGluZ19zb2NrZXQ6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc3NsLndyYXBfc29ja2V0KHNlbGYuc29jaywgc2VydmVyX3NpZGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9c2VsZi5jZXJ0aWZpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzID0gc2VsZi5jZXJ0cmVxcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHMgPSBzZWxmLmNhY2VydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uID0gc2VsZi5wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVycyA9IHNlbGYuY2lwaGVycykKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZSBhbmQgc2VsZi5jaGF0dHk6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJyBzZXJ2ZXI6ICB3cmFwcGVkIHNlcnZlciBzb2NrZXQgYXMgJXNcbicgJSBzdHIoc2VsZi5zb2NrKSkKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zb2NrKQorICAgICAgICAgICAgc2VsZi5hY3RpdmUgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5jb25uX2Vycm9ycyA9IFtdCisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICBzZWxmLmRhZW1vbiA9IFRydWUKKworICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zdGFydCh0aHJlYWRpbmcuRXZlbnQoKSkKKyAgICAgICAgICAgIHNlbGYuZmxhZy53YWl0KCkKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgIHNlbGYuc3RvcCgpCisgICAgICAgICAgICBzZWxmLmpvaW4oKQorCisgICAgICAgIGRlZiBzdGFydChzZWxmLCBmbGFnPU5vbmUpOgorICAgICAgICAgICAgc2VsZi5mbGFnID0gZmxhZworICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5zdGFydChzZWxmKQorCisgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgwLjA1KQorICAgICAgICAgICAgc2VsZi5zb2NrLmxpc3Rlbig1KQorICAgICAgICAgICAgc2VsZi5hY3RpdmUgPSBUcnVlCisgICAgICAgICAgICBpZiBzZWxmLmZsYWc6CisgICAgICAgICAgICAgICAgIyBzaWduYWwgYW4gZXZlbnQKKyAgICAgICAgICAgICAgICBzZWxmLmZsYWcuc2V0KCkKKyAgICAgICAgICAgIHdoaWxlIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgbmV3Y29ubiwgY29ubmFkZHIgPSBzZWxmLnNvY2suYWNjZXB0KCkKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2UgYW5kIHNlbGYuY2hhdHR5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnIHNlcnZlcjogIG5ldyBjb25uZWN0aW9uIGZyb20gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHN0cihjb25uYWRkcikgKyAnXG4nKQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5Db25uZWN0aW9uSGFuZGxlcihzZWxmLCBuZXdjb25uKQorICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLnN0YXJ0KCkKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5qb2luKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3RvcCgpCisgICAgICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorCisgICAgICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUgPSBGYWxzZQorCisgICAgY2xhc3MgQXN5bmNvcmVFY2hvU2VydmVyKHRocmVhZGluZy5UaHJlYWQpOgorCisgICAgICAgIGNsYXNzIEVjaG9TZXJ2ZXIoYXN5bmNvcmUuZGlzcGF0Y2hlcik6CisKKyAgICAgICAgICAgIGNsYXNzIENvbm5lY3Rpb25IYW5kbGVyKGFzeW5jb3JlLmRpc3BhdGNoZXJfd2l0aF9zZW5kKToKKworICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjb25uLCBjZXJ0ZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIGFzeW5jb3JlLmRpc3BhdGNoZXJfd2l0aF9zZW5kLl9faW5pdF9fKHNlbGYsIGNvbm4pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc29ja2V0ID0gc3NsLndyYXBfc29ja2V0KGNvbm4sIHNlcnZlcl9zaWRlPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPWNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb19oYW5kc2hha2Vfb25fY29ubmVjdD1GYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3NsX2FjY2VwdGluZyA9IFRydWUKKworICAgICAgICAgICAgICAgIGRlZiByZWFkYWJsZShzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnNvY2tldCwgc3NsLlNTTFNvY2tldCk6CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBzZWxmLnNvY2tldC5wZW5kaW5nKCkgPiAwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX3JlYWRfZXZlbnQoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgICAgICAgICAgZGVmIF9kb19zc2xfaGFuZHNoYWtlKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNvY2tldC5kb19oYW5kc2hha2UoKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBlcnIuYXJnc1swXSBpbiAoc3NsLlNTTF9FUlJPUl9XQU5UX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLlNTTF9FUlJPUl9XQU5UX1dSSVRFKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgZXJyLmFyZ3NbMF0gPT0gc3NsLlNTTF9FUlJPUl9FT0Y6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlX2Nsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGVyci5hcmdzWzBdID09IGVycm5vLkVDT05OQUJPUlRFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGVfY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fc3NsX2FjY2VwdGluZyA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX3NzbF9hY2NlcHRpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9kb19zc2xfaGFuZHNoYWtlKCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlY3YoMTAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgYW5kIGRhdGEuc3RyaXAoKSAhPSAnb3Zlcic6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZW5kKGRhdGEubG93ZXIoKSkKKworICAgICAgICAgICAgICAgIGRlZiBoYW5kbGVfY2xvc2Uoc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBzZXJ2ZXI6ICBjbG9zZWQgY29ubmVjdGlvbiAlc1xuIiAlIHNlbGYuc29ja2V0KQorCisgICAgICAgICAgICAgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNlcnRmaWxlKToKKyAgICAgICAgICAgICAgICBzZWxmLmNlcnRmaWxlID0gY2VydGZpbGUKKyAgICAgICAgICAgICAgICBhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVfc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2tldCkKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3Rlbig1KQorCisgICAgICAgICAgICBkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKKyAgICAgICAgICAgICAgICBzb2NrX29iaiwgYWRkciA9IHNlbGYuYWNjZXB0KCkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIHNlcnZlcjogIG5ldyBjb25uZWN0aW9uIGZyb20gJXM6JXNcbiIgJWFkZHIpCisgICAgICAgICAgICAgICAgc2VsZi5Db25uZWN0aW9uSGFuZGxlcihzb2NrX29iaiwgc2VsZi5jZXJ0ZmlsZSkKKworICAgICAgICAgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZQorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjZXJ0ZmlsZSk6CisgICAgICAgICAgICBzZWxmLmZsYWcgPSBOb25lCisgICAgICAgICAgICBzZWxmLmFjdGl2ZSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLnNlcnZlciA9IHNlbGYuRWNob1NlcnZlcihjZXJ0ZmlsZSkKKyAgICAgICAgICAgIHNlbGYucG9ydCA9IHNlbGYuc2VydmVyLnBvcnQKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgIHNlbGYuZGFlbW9uID0gVHJ1ZQorCisgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuICI8JXMgJXM+IiAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5zZXJ2ZXIpCisKKyAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc3RhcnQodGhyZWFkaW5nLkV2ZW50KCkpCisgICAgICAgICAgICBzZWxmLmZsYWcud2FpdCgpCisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xlYW51cDogc3RvcHBpbmcgc2VydmVyLlxuIikKKyAgICAgICAgICAgIHNlbGYuc3RvcCgpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xlYW51cDogam9pbmluZyBzZXJ2ZXIgdGhyZWFkLlxuIikKKyAgICAgICAgICAgIHNlbGYuam9pbigpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xlYW51cDogc3VjY2Vzc2Z1bGx5IGpvaW5lZC5cbiIpCisKKyAgICAgICAgZGVmIHN0YXJ0KHNlbGYsIGZsYWc9Tm9uZSk6CisgICAgICAgICAgICBzZWxmLmZsYWcgPSBmbGFnCisgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLnN0YXJ0KHNlbGYpCisKKyAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlID0gVHJ1ZQorICAgICAgICAgICAgaWYgc2VsZi5mbGFnOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZy5zZXQoKQorICAgICAgICAgICAgd2hpbGUgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICAgICAgYXN5bmNvcmUubG9vcCgwLjA1KQorCisgICAgICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUgPSBGYWxzZQorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuY2xvc2UoKQorCisgICAgY2xhc3MgU29ja2V0U2VydmVySFRUUFNTZXJ2ZXIodGhyZWFkaW5nLlRocmVhZCk6CisKKyAgICAgICAgY2xhc3MgSFRUUFNTZXJ2ZXIoSFRUUFNlcnZlcik6CisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcywgY2VydGZpbGUpOgorICAgICAgICAgICAgICAgIEhUVFBTZXJ2ZXIuX19pbml0X18oc2VsZiwgc2VydmVyX2FkZHJlc3MsIFJlcXVlc3RIYW5kbGVyQ2xhc3MpCisgICAgICAgICAgICAgICAgIyB3ZSBhc3N1bWUgdGhlIGNlcnRmaWxlIGNvbnRhaW5zIGJvdGggcHJpdmF0ZSBrZXkgYW5kIGNlcnRpZmljYXRlCisgICAgICAgICAgICAgICAgc2VsZi5jZXJ0ZmlsZSA9IGNlcnRmaWxlCisgICAgICAgICAgICAgICAgc2VsZi5hbGxvd19yZXVzZV9hZGRyZXNzID0gVHJ1ZQorCisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCc8JXMgJXM6JXM+JyAlCisgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNlcnZlcl9wb3J0KSkKKworICAgICAgICAgICAgZGVmIGdldF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhpcyB0byB3cmFwIHNvY2tldCB3aXRoIFNTTAorICAgICAgICAgICAgICAgIHNvY2ssIGFkZHIgPSBzZWxmLnNvY2tldC5hY2NlcHQoKQorICAgICAgICAgICAgICAgIHNzbGNvbm4gPSBzc2wud3JhcF9zb2NrZXQoc29jaywgc2VydmVyX3NpZGU9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPXNlbGYuY2VydGZpbGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNzbGNvbm4sIGFkZHIKKworICAgICAgICBjbGFzcyBSb290ZWRIVFRQUmVxdWVzdEhhbmRsZXIoU2ltcGxlSFRUUFJlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgICAgICMgbmVlZCB0byBvdmVycmlkZSB0cmFuc2xhdGVfcGF0aCB0byBnZXQgYSBrbm93biByb290LAorICAgICAgICAgICAgIyBpbnN0ZWFkIG9mIHVzaW5nIG9zLmN1cmRpciwgc2luY2UgdGhlIHRlc3QgY291bGQgYmUKKyAgICAgICAgICAgICMgcnVuIGZyb20gYW55d2hlcmUKKworICAgICAgICAgICAgc2VydmVyX3ZlcnNpb24gPSAiVGVzdEhUVFBTLzEuMCIKKworICAgICAgICAgICAgcm9vdCA9IE5vbmUKKworICAgICAgICAgICAgZGVmIHRyYW5zbGF0ZV9wYXRoKHNlbGYsIHBhdGgpOgorICAgICAgICAgICAgICAgICIiIlRyYW5zbGF0ZSBhIC8tc2VwYXJhdGVkIFBBVEggdG8gdGhlIGxvY2FsIGZpbGVuYW1lIHN5bnRheC4KKworICAgICAgICAgICAgICAgIENvbXBvbmVudHMgdGhhdCBtZWFuIHNwZWNpYWwgdGhpbmdzIHRvIHRoZSBsb2NhbCBmaWxlIHN5c3RlbQorICAgICAgICAgICAgICAgIChlLmcuIGRyaXZlIG9yIGRpcmVjdG9yeSBuYW1lcykgYXJlIGlnbm9yZWQuICAoWFhYIFRoZXkgc2hvdWxkCisgICAgICAgICAgICAgICAgcHJvYmFibHkgYmUgZGlhZ25vc2VkLikKKworICAgICAgICAgICAgICAgICIiIgorICAgICAgICAgICAgICAgICMgYWJhbmRvbiBxdWVyeSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgcGF0aCA9IHVybHBhcnNlLnVybHBhcnNlKHBhdGgpWzJdCisgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGgubm9ybXBhdGgodXJsbGliLnVucXVvdGUocGF0aCkpCisgICAgICAgICAgICAgICAgd29yZHMgPSBwYXRoLnNwbGl0KCcvJykKKyAgICAgICAgICAgICAgICB3b3JkcyA9IGZpbHRlcihOb25lLCB3b3JkcykKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5yb290CisgICAgICAgICAgICAgICAgZm9yIHdvcmQgaW4gd29yZHM6CisgICAgICAgICAgICAgICAgICAgIGRyaXZlLCB3b3JkID0gb3MucGF0aC5zcGxpdGRyaXZlKHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGhlYWQsIHdvcmQgPSBvcy5wYXRoLnNwbGl0KHdvcmQpCisgICAgICAgICAgICAgICAgICAgIGlmIHdvcmQgaW4gc2VsZi5yb290OiBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsIHdvcmQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhdGgKKworICAgICAgICAgICAgZGVmIGxvZ19tZXNzYWdlKHNlbGYsIGZvcm1hdCwgKmFyZ3MpOgorCisgICAgICAgICAgICAgICAgIyB3ZSBvdmVycmlkZSB0aGlzIHRvIHN1cHByZXNzIGxvZ2dpbmcgdW5sZXNzICJ2ZXJib3NlIgorCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBzZXJ2ZXIgKCVzOiVkICVzKTpcbiAgIFslc10gJXNcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLnNlcnZlci5zZXJ2ZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2VydmVyX3BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVxdWVzdC5jaXBoZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2dfZGF0ZV90aW1lX3N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQlYXJncykpCisKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgY2VydGZpbGUpOgorICAgICAgICAgICAgc2VsZi5mbGFnID0gTm9uZQorICAgICAgICAgICAgc2VsZi5Sb290ZWRIVFRQUmVxdWVzdEhhbmRsZXIucm9vdCA9IG9zLnBhdGguc3BsaXQoQ0VSVEZJTEUpWzBdCisgICAgICAgICAgICBzZWxmLnNlcnZlciA9IHNlbGYuSFRUUFNTZXJ2ZXIoCisgICAgICAgICAgICAgICAgKEhPU1QsIDApLCBzZWxmLlJvb3RlZEhUVFBSZXF1ZXN0SGFuZGxlciwgY2VydGZpbGUpCisgICAgICAgICAgICBzZWxmLnBvcnQgPSBzZWxmLnNlcnZlci5zZXJ2ZXJfcG9ydAorICAgICAgICAgICAgdGhyZWFkaW5nLlRocmVhZC5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgc2VsZi5kYWVtb24gPSBUcnVlCisKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIjwlcyAlcz4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLnNlcnZlcikKKworICAgICAgICBkZWYgc3RhcnQoc2VsZiwgZmxhZz1Ob25lKToKKyAgICAgICAgICAgIHNlbGYuZmxhZyA9IGZsYWcKKyAgICAgICAgICAgIHRocmVhZGluZy5UaHJlYWQuc3RhcnQoc2VsZikKKworICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5mbGFnOgorICAgICAgICAgICAgICAgIHNlbGYuZmxhZy5zZXQoKQorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2VydmVfZm9yZXZlcigwLjA1KQorCisgICAgICAgIGRlZiBzdG9wKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc2h1dGRvd24oKQorCisKKyAgICBkZWYgYmFkX2NlcnRfdGVzdChjZXJ0ZmlsZSk6CisgICAgICAgICIiIgorICAgICAgICBMYXVuY2ggYSBzZXJ2ZXIgd2l0aCBDRVJUX1JFUVVJUkVELCBhbmQgY2hlY2sgdGhhdCB0cnlpbmcgdG8KKyAgICAgICAgY29ubmVjdCB0byBpdCB3aXRoIHRoZSBnaXZlbiBjbGllbnQgY2VydGlmaWNhdGUgZmFpbHMuCisgICAgICAgICIiIgorICAgICAgICBzZXJ2ZXIgPSBUaHJlYWRlZEVjaG9TZXJ2ZXIoQ0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0cmVxcz1zc2wuQ0VSVF9SRVFVSVJFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2VydHM9Q0VSVEZJTEUsIGNoYXR0eT1GYWxzZSkKKyAgICAgICAgd2l0aCBzZXJ2ZXI6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ZmlsZT1jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MSkKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKEhPU1QsIHNlcnZlci5wb3J0KSkKKyAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3IsIHg6CisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuU1NMRXJyb3IgaXMgJXNcbiIgJSB4WzFdKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgeDoKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG5zb2NrZXQuZXJyb3IgaXMgJXNcbiIgJSB4WzFdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVXNlIG9mIGludmFsaWQgY2VydCBzaG91bGQgaGF2ZSBmYWlsZWQhIikKKworICAgIGRlZiBzZXJ2ZXJfcGFyYW1zX3Rlc3QoY2VydGZpbGUsIHByb3RvY29sLCBjZXJ0cmVxcywgY2FjZXJ0c2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfY2VydGZpbGUsIGNsaWVudF9wcm90b2NvbD1Ob25lLCBpbmRhdGE9IkZPT1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9Tm9uZSwgY2hhdHR5PVRydWUsIGNvbm5lY3Rpb25jaGF0dHk9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwX2FjY2VwdGluZ19zb2NrZXQ9RmFsc2UpOgorICAgICAgICAiIiIKKyAgICAgICAgTGF1bmNoIGEgc2VydmVyLCBjb25uZWN0IGEgY2xpZW50IHRvIGl0IGFuZCB0cnkgdmFyaW91cyByZWFkcworICAgICAgICBhbmQgd3JpdGVzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VydmVyID0gVGhyZWFkZWRFY2hvU2VydmVyKGNlcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydHJlcXM9Y2VydHJlcXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1wcm90b2NvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2VydHM9Y2FjZXJ0c2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXBoZXJzPWNpcGhlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9Y2hhdHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbmNoYXR0eT1jb25uZWN0aW9uY2hhdHR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9hY2NlcHRpbmdfc29ja2V0PXdyYXBfYWNjZXB0aW5nX3NvY2tldCkKKyAgICAgICAgd2l0aCBzZXJ2ZXI6CisgICAgICAgICAgICAjIHRyeSB0byBjb25uZWN0CisgICAgICAgICAgICBpZiBjbGllbnRfcHJvdG9jb2wgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjbGllbnRfcHJvdG9jb2wgPSBwcm90b2NvbAorICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPWNsaWVudF9jZXJ0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Y2FjZXJ0c2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9Y2lwaGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9yZXFzPWNlcnRyZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1jbGllbnRfcHJvdG9jb2wpCisgICAgICAgICAgICBzLmNvbm5lY3QoKEhPU1QsIHNlcnZlci5wb3J0KSkKKyAgICAgICAgICAgIGZvciBhcmcgaW4gW2luZGF0YSwgYnl0ZWFycmF5KGluZGF0YSksIG1lbW9yeXZpZXcoaW5kYXRhKV06CisgICAgICAgICAgICAgICAgaWYgY29ubmVjdGlvbmNoYXR0eToKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2xpZW50OiAgc2VuZGluZyAlcy4uLlxuIiAlIChyZXByKGFyZykpKQorICAgICAgICAgICAgICAgIHMud3JpdGUoYXJnKQorICAgICAgICAgICAgICAgIG91dGRhdGEgPSBzLnJlYWQoKQorICAgICAgICAgICAgICAgIGlmIGNvbm5lY3Rpb25jaGF0dHk6CisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsaWVudDogIHJlYWQgJXNcbiIgJSByZXByKG91dGRhdGEpKQorICAgICAgICAgICAgICAgIGlmIG91dGRhdGEgIT0gaW5kYXRhLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgImJhZCBkYXRhIDw8JXM+PiAoJWQpIHJlY2VpdmVkOyBleHBlY3RlZCA8PCVzPj4gKCVkKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgJSAob3V0ZGF0YVs6bWluKGxlbihvdXRkYXRhKSwyMCldLCBsZW4ob3V0ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRhdGFbOm1pbihsZW4oaW5kYXRhKSwyMCldLmxvd2VyKCksIGxlbihpbmRhdGEpKSkKKyAgICAgICAgICAgIHMud3JpdGUoIm92ZXJcbiIpCisgICAgICAgICAgICBpZiBjb25uZWN0aW9uY2hhdHR5OgorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCIgY2xpZW50OiAgY2xvc2luZyBjb25uZWN0aW9uLlxuIikKKyAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgZGVmIHRyeV9wcm90b2NvbF9jb21ibyhzZXJ2ZXJfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfcHJvdG9jb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3Rfc3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRzcmVxcz1Ob25lKToKKyAgICAgICAgaWYgY2VydHNyZXFzIGlzIE5vbmU6CisgICAgICAgICAgICBjZXJ0c3JlcXMgPSBzc2wuQ0VSVF9OT05FCisgICAgICAgIGNlcnR0eXBlID0geworICAgICAgICAgICAgc3NsLkNFUlRfTk9ORTogIkNFUlRfTk9ORSIsCisgICAgICAgICAgICBzc2wuQ0VSVF9PUFRJT05BTDogIkNFUlRfT1BUSU9OQUwiLAorICAgICAgICAgICAgc3NsLkNFUlRfUkVRVUlSRUQ6ICJDRVJUX1JFUVVJUkVEIiwKKyAgICAgICAgfVtjZXJ0c3JlcXNdCisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgZm9ybWF0c3RyID0gKGV4cGVjdF9zdWNjZXNzIGFuZCAiICVzLT4lcyAlc1xuIikgb3IgIiB7JXMtPiVzfSAlc1xuIgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShmb3JtYXRzdHIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3NsLmdldF9wcm90b2NvbF9uYW1lKGNsaWVudF9wcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2wuZ2V0X3Byb3RvY29sX25hbWUoc2VydmVyX3Byb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnR0eXBlKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBOT1RFOiB3ZSBtdXN0IGVuYWJsZSAiQUxMIiBjaXBoZXJzLCBvdGhlcndpc2UgYW4gU1NMdjIzIGNsaWVudAorICAgICAgICAgICAgIyB3aWxsIHNlbmQgYW4gU1NMdjMgaGVsbG8gKHJhdGhlciB0aGFuIFNTTHYyKSBzdGFydGluZyBmcm9tCisgICAgICAgICAgICAjIE9wZW5TU0wgMS4wLjAgKHNlZSBpc3N1ZSAjODMyMikuCisgICAgICAgICAgICBzZXJ2ZXJfcGFyYW1zX3Rlc3QoQ0VSVEZJTEUsIHNlcnZlcl9wcm90b2NvbCwgY2VydHNyZXFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFUlRGSUxFLCBDRVJURklMRSwgY2xpZW50X3Byb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9IkFMTCIsIGNoYXR0eT1GYWxzZSkKKyAgICAgICAgIyBQcm90b2NvbCBtaXNtYXRjaCBjYW4gcmVzdWx0IGluIGVpdGhlciBhbiBTU0xFcnJvciwgb3IgYQorICAgICAgICAjICJDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIiIGVycm9yLgorICAgICAgICBleGNlcHQgc3NsLlNTTEVycm9yOgorICAgICAgICAgICAgaWYgZXhwZWN0X3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciBhcyBlOgorICAgICAgICAgICAgaWYgZXhwZWN0X3N1Y2Nlc3Mgb3IgZS5lcnJubyAhPSBlcnJuby5FQ09OTlJFU0VUOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBub3QgZXhwZWN0X3N1Y2Nlc3M6CisgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJDbGllbnQgcHJvdG9jb2wgJXMgc3VjY2VlZGVkIHdpdGggc2VydmVyIHByb3RvY29sICVzISIKKyAgICAgICAgICAgICAgICAgICAgJSAoc3NsLmdldF9wcm90b2NvbF9uYW1lKGNsaWVudF9wcm90b2NvbCksCisgICAgICAgICAgICAgICAgICAgICAgIHNzbC5nZXRfcHJvdG9jb2xfbmFtZShzZXJ2ZXJfcHJvdG9jb2wpKSkKKworCisgICAgY2xhc3MgVGhyZWFkZWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAgICAgZGVmIHRlc3RfcnVkZV9zaHV0ZG93bihzZWxmKToKKyAgICAgICAgICAgICIiIkEgYnJ1dGFsIHNodXRkb3duIG9mIGFuIFNTTCBzZXJ2ZXIgc2hvdWxkIHJhaXNlIGFuIElPRXJyb3IKKyAgICAgICAgICAgIGluIHRoZSBjbGllbnQgd2hlbiBhdHRlbXB0aW5nIGhhbmRzaGFrZS4KKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgbGlzdGVuZXJfcmVhZHkgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAgICAgbGlzdGVuZXJfZ29uZSA9IHRocmVhZGluZy5FdmVudCgpCisKKyAgICAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgIHBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHMsIEhPU1QpCisKKyAgICAgICAgICAgICMgYGxpc3RlbmVyYCBydW5zIGluIGEgdGhyZWFkLiAgSXQgc2l0cyBpbiBhbiBhY2NlcHQoKSB1bnRpbAorICAgICAgICAgICAgIyB0aGUgbWFpbiB0aHJlYWQgY29ubmVjdHMuICBUaGVuIGl0IHJ1ZGVseSBjbG9zZXMgdGhlIHNvY2tldCwKKyAgICAgICAgICAgICMgYW5kIHNldHMgRXZlbnQgYGxpc3RlbmVyX2dvbmVgIHRvIGxldCB0aGUgbWFpbiB0aHJlYWQga25vdworICAgICAgICAgICAgIyB0aGUgc29ja2V0IGlzIGdvbmUuCisgICAgICAgICAgICBkZWYgbGlzdGVuZXIoKToKKyAgICAgICAgICAgICAgICBzLmxpc3Rlbig1KQorICAgICAgICAgICAgICAgIGxpc3RlbmVyX3JlYWR5LnNldCgpCisgICAgICAgICAgICAgICAgcy5hY2NlcHQoKQorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorICAgICAgICAgICAgICAgIGxpc3RlbmVyX2dvbmUuc2V0KCkKKworICAgICAgICAgICAgZGVmIGNvbm5lY3RvcigpOgorICAgICAgICAgICAgICAgIGxpc3RlbmVyX3JlYWR5LndhaXQoKQorICAgICAgICAgICAgICAgIGMgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgICAgICBjLmNvbm5lY3QoKEhPU1QsIHBvcnQpKQorICAgICAgICAgICAgICAgIGxpc3RlbmVyX2dvbmUud2FpdCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzc2xfc29jayA9IHNzbC53cmFwX3NvY2tldChjKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdjb25uZWN0aW5nIHRvIGNsb3NlZCBTU0wgc29ja2V0IHNob3VsZCBoYXZlIGZhaWxlZCcpCisKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1saXN0ZW5lcikKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbm5lY3RvcigpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHQuam9pbigpCisKKyAgICAgICAgQHNraXBfaWZfYnJva2VuX3VidW50dV9zc2wKKyAgICAgICAgZGVmIHRlc3RfZWNobyhzZWxmKToKKyAgICAgICAgICAgICIiIkJhc2ljIHRlc3Qgb2YgYW4gU1NMIGNsaWVudCBjb25uZWN0aW5nIHRvIGEgc2VydmVyIiIiCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisgICAgICAgICAgICBzZXJ2ZXJfcGFyYW1zX3Rlc3QoQ0VSVEZJTEUsIHNzbC5QUk9UT0NPTF9UTFN2MSwgc3NsLkNFUlRfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRVJURklMRSwgQ0VSVEZJTEUsIHNzbC5QUk9UT0NPTF9UTFN2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9VHJ1ZSwgY29ubmVjdGlvbmNoYXR0eT1UcnVlKQorCisgICAgICAgIGRlZiB0ZXN0X2dldHBlZXJjZXJ0KHNlbGYpOgorICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgczIgPSBzb2NrZXQuc29ja2V0KCkKKyAgICAgICAgICAgIHNlcnZlciA9IFRocmVhZGVkRWNob1NlcnZlcihDRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0cmVxcz1zc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FjZXJ0cz1DRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9RmFsc2UpCisgICAgICAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRmaWxlPUNFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FfY2VydHM9Q0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0X3JlcXM9c3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfU1NMdjIzKQorICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoSE9TVCwgc2VydmVyLnBvcnQpKQorICAgICAgICAgICAgICAgIGNlcnQgPSBzLmdldHBlZXJjZXJ0KCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2VydCwgIkNhbid0IGdldCBwZWVyIGNlcnRpZmljYXRlLiIpCisgICAgICAgICAgICAgICAgY2lwaGVyID0gcy5jaXBoZXIoKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHBwcmludC5wZm9ybWF0KGNlcnQpICsgJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiQ29ubmVjdGlvbiBjaXBoZXIgaXMgIiArIHN0cihjaXBoZXIpICsgJy5cbicpCisgICAgICAgICAgICAgICAgaWYgJ3N1YmplY3QnIG5vdCBpbiBjZXJ0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIHN1YmplY3QgZmllbGQgaW4gY2VydGlmaWNhdGU6ICVzLiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQoY2VydCkpCisgICAgICAgICAgICAgICAgaWYgKCgoJ29yZ2FuaXphdGlvbk5hbWUnLCAnUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24nKSwpCisgICAgICAgICAgICAgICAgICAgIG5vdCBpbiBjZXJ0WydzdWJqZWN0J10pOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiTWlzc2luZyBvciBpbnZhbGlkICdvcmdhbml6YXRpb25OYW1lJyBmaWVsZCBpbiBjZXJ0aWZpY2F0ZSBzdWJqZWN0OyAiCisgICAgICAgICAgICAgICAgICAgICAgICAic2hvdWxkIGJlICdQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbicuIikKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICBkZWYgdGVzdF9lbXB0eV9jZXJ0KHNlbGYpOgorICAgICAgICAgICAgIiIiQ29ubmVjdGluZyB3aXRoIGFuIGVtcHR5IGNlcnQgZmlsZSIiIgorICAgICAgICAgICAgYmFkX2NlcnRfdGVzdChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudWxsY2VydC5wZW0iKSkKKyAgICAgICAgZGVmIHRlc3RfbWFsZm9ybWVkX2NlcnQoc2VsZik6CisgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHdpdGggYSBiYWRseSBmb3JtYXR0ZWQgY2VydGlmaWNhdGUgKHN5bnRheCBlcnJvcikiIiIKKyAgICAgICAgICAgIGJhZF9jZXJ0X3Rlc3Qob3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhZGNlcnQucGVtIikpCisgICAgICAgIGRlZiB0ZXN0X25vbmV4aXN0aW5nX2NlcnQoc2VsZik6CisgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHdpdGggYSBub24tZXhpc3RpbmcgY2VydCBmaWxlIiIiCisgICAgICAgICAgICBiYWRfY2VydF90ZXN0KG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZ2NlcnQucGVtIikpCisgICAgICAgIGRlZiB0ZXN0X21hbGZvcm1lZF9rZXkoc2VsZik6CisgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHdpdGggYSBiYWRseSBmb3JtYXR0ZWQga2V5IChzeW50YXggZXJyb3IpIiIiCisgICAgICAgICAgICBiYWRfY2VydF90ZXN0KG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWRrZXkucGVtIikpCisKKyAgICAgICAgQHNraXBfaWZfYnJva2VuX3VidW50dV9zc2wKKyAgICAgICAgZGVmIHRlc3RfcHJvdG9jb2xfc3NsdjIoc2VsZik6CisgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHRvIGFuIFNTTHYyIHNlcnZlciB3aXRoIHZhcmlvdXMgY2xpZW50IG9wdGlvbnMiIiIKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNzbCwgJ1BST1RPQ09MX1NTTHYyJyk6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiUFJPVE9DT0xfU1NMdjIgbmVlZGVkIikKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIsIHNzbC5QUk9UT0NPTF9TU0x2MiwgVHJ1ZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIsIHNzbC5QUk9UT0NPTF9TU0x2MiwgVHJ1ZSwgc3NsLkNFUlRfT1BUSU9OQUwpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyLCBzc2wuUFJPVE9DT0xfU1NMdjIsIFRydWUsIHNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2Miwgc3NsLlBST1RPQ09MX1NTTHYyMywgVHJ1ZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIsIHNzbC5QUk9UT0NPTF9TU0x2MywgRmFsc2UpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyLCBzc2wuUFJPVE9DT0xfVExTdjEsIEZhbHNlKQorCisgICAgICAgIEBza2lwX2lmX2Jyb2tlbl91YnVudHVfc3NsCisgICAgICAgIGRlZiB0ZXN0X3Byb3RvY29sX3NzbHYyMyhzZWxmKToKKyAgICAgICAgICAgICIiIkNvbm5lY3RpbmcgdG8gYW4gU1NMdjIzIHNlcnZlciB3aXRoIHZhcmlvdXMgY2xpZW50IG9wdGlvbnMiIiIKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIzLCBzc2wuUFJPVE9DT0xfU1NMdjMsIFRydWUpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYyMywgc3NsLlBST1RPQ09MX1NTTHYyMywgVHJ1ZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIzLCBzc2wuUFJPVE9DT0xfVExTdjEsIFRydWUpCisKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIzLCBzc2wuUFJPVE9DT0xfU1NMdjMsIFRydWUsIHNzbC5DRVJUX09QVElPTkFMKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9TU0x2MjMsIFRydWUsIHNzbC5DRVJUX09QVElPTkFMKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9UTFN2MSwgVHJ1ZSwgc3NsLkNFUlRfT1BUSU9OQUwpCisKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjIzLCBzc2wuUFJPVE9DT0xfU1NMdjMsIFRydWUsIHNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9TU0x2MjMsIFRydWUsIHNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgdHJ5X3Byb3RvY29sX2NvbWJvKHNzbC5QUk9UT0NPTF9TU0x2MjMsIHNzbC5QUk9UT0NPTF9UTFN2MSwgVHJ1ZSwgc3NsLkNFUlRfUkVRVUlSRUQpCisKKyAgICAgICAgQHNraXBfaWZfYnJva2VuX3VidW50dV9zc2wKKyAgICAgICAgZGVmIHRlc3RfcHJvdG9jb2xfc3NsdjMoc2VsZik6CisgICAgICAgICAgICAiIiJDb25uZWN0aW5nIHRvIGFuIFNTTHYzIHNlcnZlciB3aXRoIHZhcmlvdXMgY2xpZW50IG9wdGlvbnMiIiIKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjMsIHNzbC5QUk9UT0NPTF9TU0x2MywgVHJ1ZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjMsIHNzbC5QUk9UT0NPTF9TU0x2MywgVHJ1ZSwgc3NsLkNFUlRfT1BUSU9OQUwpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYzLCBzc2wuUFJPVE9DT0xfU1NMdjMsIFRydWUsIHNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MicpOgorICAgICAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfU1NMdjMsIHNzbC5QUk9UT0NPTF9TU0x2MiwgRmFsc2UpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1NTTHYzLCBzc2wuUFJPVE9DT0xfVExTdjEsIEZhbHNlKQorCisgICAgICAgIEBza2lwX2lmX2Jyb2tlbl91YnVudHVfc3NsCisgICAgICAgIGRlZiB0ZXN0X3Byb3RvY29sX3Rsc3YxKHNlbGYpOgorICAgICAgICAgICAgIiIiQ29ubmVjdGluZyB0byBhIFRMU3YxIHNlcnZlciB3aXRoIHZhcmlvdXMgY2xpZW50IG9wdGlvbnMiIiIKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfVExTdjEsIHNzbC5QUk9UT0NPTF9UTFN2MSwgVHJ1ZSkKKyAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfVExTdjEsIHNzbC5QUk9UT0NPTF9UTFN2MSwgVHJ1ZSwgc3NsLkNFUlRfT1BUSU9OQUwpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1RMU3YxLCBzc2wuUFJPVE9DT0xfVExTdjEsIFRydWUsIHNzbC5DRVJUX1JFUVVJUkVEKQorICAgICAgICAgICAgaWYgaGFzYXR0cihzc2wsICdQUk9UT0NPTF9TU0x2MicpOgorICAgICAgICAgICAgICAgIHRyeV9wcm90b2NvbF9jb21ibyhzc2wuUFJPVE9DT0xfVExTdjEsIHNzbC5QUk9UT0NPTF9TU0x2MiwgRmFsc2UpCisgICAgICAgICAgICB0cnlfcHJvdG9jb2xfY29tYm8oc3NsLlBST1RPQ09MX1RMU3YxLCBzc2wuUFJPVE9DT0xfU1NMdjMsIEZhbHNlKQorCisgICAgICAgIGRlZiB0ZXN0X3N0YXJ0dGxzKHNlbGYpOgorICAgICAgICAgICAgIiIiU3dpdGNoaW5nIGZyb20gY2xlYXIgdGV4dCB0byBlbmNyeXB0ZWQgYW5kIGJhY2sgYWdhaW4uIiIiCisgICAgICAgICAgICBtc2dzID0gKCJtc2cgMSIsICJNU0cgMiIsICJTVEFSVFRMUyIsICJNU0cgMyIsICJtc2cgNCIsICJFTkRUTFMiLCAibXNnIDUiLCAibXNnIDYiKQorCisgICAgICAgICAgICBzZXJ2ZXIgPSBUaHJlYWRlZEVjaG9TZXJ2ZXIoQ0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dGxzX3NlcnZlcj1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXR0eT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25jaGF0dHk9VHJ1ZSkKKyAgICAgICAgICAgIHdyYXBwZWQgPSBGYWxzZQorICAgICAgICAgICAgd2l0aCBzZXJ2ZXI6CisgICAgICAgICAgICAgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgICAgICAgICAgICAgIHMuc2V0YmxvY2tpbmcoMSkKKyAgICAgICAgICAgICAgICBzLmNvbm5lY3QoKEhPU1QsIHNlcnZlci5wb3J0KSkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgICAgIGZvciBpbmRhdGEgaW4gbXNnczoKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgY2xpZW50OiAgc2VuZGluZyAlcy4uLlxuIiAlIHJlcHIoaW5kYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgd3JhcHBlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm4ud3JpdGUoaW5kYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IGNvbm4ucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzLnNlbmQoaW5kYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IHMucmVjdigxMDI0KQorICAgICAgICAgICAgICAgICAgICBpZiAoaW5kYXRhID09ICJTVEFSVFRMUyIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhLnN0cmlwKCkubG93ZXIoKS5zdGFydHN3aXRoKCJvayIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU1RBUlRUTFMgb2ssIHN3aXRjaCB0byBzZWN1cmUgbW9kZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGllbnQ6ICByZWFkICVzIGZyb20gc2VydmVyLCBzdGFydGluZyBUTFMuLi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSByZXByKG91dGRhdGEpKQorICAgICAgICAgICAgICAgICAgICAgICAgY29ubiA9IHNzbC53cmFwX3NvY2tldChzLCBzc2xfdmVyc2lvbj1zc2wuUFJPVE9DT0xfVExTdjEpCisgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBlbGlmIChpbmRhdGEgPT0gIkVORFRMUyIgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRkYXRhLnN0cmlwKCkubG93ZXIoKS5zdGFydHN3aXRoKCJvayIpKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgRU5EVExTIG9rLCBzd2l0Y2ggYmFjayB0byBjbGVhciB0ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNsaWVudDogIHJlYWQgJXMgZnJvbSBzZXJ2ZXIsIGVuZGluZyBUTFMuLi5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSByZXByKG91dGRhdGEpKQorICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGNvbm4udW53cmFwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWQgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGllbnQ6ICByZWFkICVzIGZyb20gc2VydmVyXG4iICUgcmVwcihvdXRkYXRhKSkKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiIGNsaWVudDogIGNsb3NpbmcgY29ubmVjdGlvbi5cbiIpCisgICAgICAgICAgICAgICAgaWYgd3JhcHBlZDoKKyAgICAgICAgICAgICAgICAgICAgY29ubi53cml0ZSgib3ZlclxuIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzLnNlbmQoIm92ZXJcbiIpCisgICAgICAgICAgICAgICAgcy5jbG9zZSgpCisKKyAgICAgICAgZGVmIHRlc3Rfc29ja2V0c2VydmVyKHNlbGYpOgorICAgICAgICAgICAgIiIiVXNpbmcgYSBTb2NrZXRTZXJ2ZXIgdG8gY3JlYXRlIGFuZCBtYW5hZ2UgU1NMIGNvbm5lY3Rpb25zLiIiIgorICAgICAgICAgICAgc2VydmVyID0gU29ja2V0U2VydmVySFRUUFNTZXJ2ZXIoQ0VSVEZJTEUpCisgICAgICAgICAgICBmbGFnID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgICAgIHNlcnZlci5zdGFydChmbGFnKQorICAgICAgICAgICAgIyB3YWl0IGZvciBpdCB0byBzdGFydAorICAgICAgICAgICAgZmxhZy53YWl0KCkKKyAgICAgICAgICAgICMgdHJ5IHRvIGNvbm5lY3QKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgnXG4nKQorICAgICAgICAgICAgICAgIHdpdGggb3BlbihDRVJURklMRSwgJ3JiJykgYXMgZjoKKyAgICAgICAgICAgICAgICAgICAgZDEgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgIGQyID0gJycKKyAgICAgICAgICAgICAgICAjIG5vdyBmZXRjaCB0aGUgc2FtZSBkYXRhIGZyb20gdGhlIEhUVFBTIHNlcnZlcgorICAgICAgICAgICAgICAgIHVybCA9ICdodHRwczovLzEyNy4wLjAuMTolZC8lcycgJSAoCisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5wb3J0LCBvcy5wYXRoLnNwbGl0KENFUlRGSUxFKVsxXSkKKyAgICAgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgICAgIGYgPSB1cmxsaWIudXJsb3Blbih1cmwpCisgICAgICAgICAgICAgICAgZGxlbiA9IGYuaW5mbygpLmdldGhlYWRlcigiY29udGVudC1sZW5ndGgiKQorICAgICAgICAgICAgICAgIGlmIGRsZW4gYW5kIChpbnQoZGxlbikgPiAwKToKKyAgICAgICAgICAgICAgICAgICAgZDIgPSBmLnJlYWQoaW50KGRsZW4pKQorICAgICAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGllbnQ6IHJlYWQgJWQgYnl0ZXMgZnJvbSByZW1vdGUgc2VydmVyICclcydcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChsZW4oZDIpLCBzZXJ2ZXIpKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDEsIGQyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpCisgICAgICAgICAgICAgICAgc2VydmVyLmpvaW4oKQorCisgICAgICAgIGRlZiB0ZXN0X3dyYXBwZWRfYWNjZXB0KHNlbGYpOgorICAgICAgICAgICAgIiIiQ2hlY2sgdGhlIGFjY2VwdCgpIG1ldGhvZCBvbiBTU0wgc29ja2V0cy4iIiIKKyAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIlxuIikKKyAgICAgICAgICAgIHNlcnZlcl9wYXJhbXNfdGVzdChDRVJURklMRSwgc3NsLlBST1RPQ09MX1NTTHYyMywgc3NsLkNFUlRfUkVRVUlSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VSVEZJTEUsIENFUlRGSUxFLCBzc2wuUFJPVE9DT0xfU1NMdjIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXR0eT1UcnVlLCBjb25uZWN0aW9uY2hhdHR5PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcF9hY2NlcHRpbmdfc29ja2V0PVRydWUpCisKKyAgICAgICAgZGVmIHRlc3RfYXN5bmNvcmVfc2VydmVyKHNlbGYpOgorICAgICAgICAgICAgIiIiQ2hlY2sgdGhlIGV4YW1wbGUgYXN5bmNvcmUgaW50ZWdyYXRpb24uIiIiCisgICAgICAgICAgICBpbmRhdGEgPSAiVEVTVCBNRVNTQUdFIG9mIG1peGVkIGNhc2VcbiIKKworICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorICAgICAgICAgICAgc2VydmVyID0gQXN5bmNvcmVFY2hvU2VydmVyKENFUlRGSUxFKQorICAgICAgICAgICAgd2l0aCBzZXJ2ZXI6CisgICAgICAgICAgICAgICAgcyA9IHNzbC53cmFwX3NvY2tldChzb2NrZXQuc29ja2V0KCkpCisgICAgICAgICAgICAgICAgcy5jb25uZWN0KCgnMTI3LjAuMC4xJywgc2VydmVyLnBvcnQpKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgIiBjbGllbnQ6ICBzZW5kaW5nICVzLi4uXG4iICUgKHJlcHIoaW5kYXRhKSkpCisgICAgICAgICAgICAgICAgcy53cml0ZShpbmRhdGEpCisgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IHMucmVhZCgpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBjbGllbnQ6ICByZWFkICVzXG4iICUgcmVwcihvdXRkYXRhKSkKKyAgICAgICAgICAgICAgICBpZiBvdXRkYXRhICE9IGluZGF0YS5sb3dlcigpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAiYmFkIGRhdGEgPDwlcz4+ICglZCkgcmVjZWl2ZWQ7IGV4cGVjdGVkIDw8JXM+PiAoJWQpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAlIChvdXRkYXRhWzptaW4obGVuKG91dGRhdGEpLDIwKV0sIGxlbihvdXRkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGF0YVs6bWluKGxlbihpbmRhdGEpLDIwKV0ubG93ZXIoKSwgbGVuKGluZGF0YSkpKQorICAgICAgICAgICAgICAgIHMud3JpdGUoIm92ZXJcbiIpCisgICAgICAgICAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIiBjbGllbnQ6ICBjbG9zaW5nIGNvbm5lY3Rpb24uXG4iKQorICAgICAgICAgICAgICAgIHMuY2xvc2UoKQorCisgICAgICAgIGRlZiB0ZXN0X3JlY3Zfc2VuZChzZWxmKToKKyAgICAgICAgICAgICIiIlRlc3QgcmVjdigpLCBzZW5kKCkgYW5kIGZyaWVuZHMuIiIiCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCisKKyAgICAgICAgICAgIHNlcnZlciA9IFRocmVhZGVkRWNob1NlcnZlcihDRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0cmVxcz1zc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9UTFN2MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWNlcnRzPUNFUlRGSUxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXR0eT1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25jaGF0dHk9RmFsc2UpCisgICAgICAgICAgICB3aXRoIHNlcnZlcjoKKyAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2tldC5zb2NrZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zaWRlPUZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydGZpbGU9Q0VSVEZJTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYV9jZXJ0cz1DRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlcnRfcmVxcz1zc2wuQ0VSVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsX3ZlcnNpb249c3NsLlBST1RPQ09MX1RMU3YxKQorICAgICAgICAgICAgICAgIHMuY29ubmVjdCgoSE9TVCwgc2VydmVyLnBvcnQpKQorICAgICAgICAgICAgICAgICMgaGVscGVyIG1ldGhvZHMgZm9yIHN0YW5kYXJkaXNpbmcgcmVjdiogbWV0aG9kIHNpZ25hdHVyZXMKKyAgICAgICAgICAgICAgICBkZWYgX3JlY3ZfaW50bygpOgorICAgICAgICAgICAgICAgICAgICBiID0gYnl0ZWFycmF5KCJcMCIqMTAwKQorICAgICAgICAgICAgICAgICAgICBjb3VudCA9IHMucmVjdl9pbnRvKGIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiWzpjb3VudF0KKworICAgICAgICAgICAgICAgIGRlZiBfcmVjdmZyb21faW50bygpOgorICAgICAgICAgICAgICAgICAgICBiID0gYnl0ZWFycmF5KCJcMCIqMTAwKQorICAgICAgICAgICAgICAgICAgICBjb3VudCwgYWRkciA9IHMucmVjdmZyb21faW50byhiKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gYls6Y291bnRdCisKKyAgICAgICAgICAgICAgICAjIChuYW1lLCBtZXRob2QsIHdoZXRoZXIgdG8gZXhwZWN0IHN1Y2Nlc3MsICphcmdzKQorICAgICAgICAgICAgICAgIHNlbmRfbWV0aG9kcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgKCdzZW5kJywgcy5zZW5kLCBUcnVlLCBbXSksCisgICAgICAgICAgICAgICAgICAgICgnc2VuZHRvJywgcy5zZW5kdG8sIEZhbHNlLCBbInNvbWUuYWRkcmVzcyJdKSwKKyAgICAgICAgICAgICAgICAgICAgKCdzZW5kYWxsJywgcy5zZW5kYWxsLCBUcnVlLCBbXSksCisgICAgICAgICAgICAgICAgXQorICAgICAgICAgICAgICAgIHJlY3ZfbWV0aG9kcyA9IFsKKyAgICAgICAgICAgICAgICAgICAgKCdyZWN2Jywgcy5yZWN2LCBUcnVlLCBbXSksCisgICAgICAgICAgICAgICAgICAgICgncmVjdmZyb20nLCBzLnJlY3Zmcm9tLCBGYWxzZSwgWyJzb21lLmFkZHJlc3MiXSksCisgICAgICAgICAgICAgICAgICAgICgncmVjdl9pbnRvJywgX3JlY3ZfaW50bywgVHJ1ZSwgW10pLAorICAgICAgICAgICAgICAgICAgICAoJ3JlY3Zmcm9tX2ludG8nLCBfcmVjdmZyb21faW50bywgRmFsc2UsIFtdKSwKKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICAgICAgZGF0YV9wcmVmaXggPSB1IlBSRUZJWF8iCisKKyAgICAgICAgICAgICAgICBmb3IgbWV0aF9uYW1lLCBzZW5kX21ldGgsIGV4cGVjdF9zdWNjZXNzLCBhcmdzIGluIHNlbmRfbWV0aG9kczoKKyAgICAgICAgICAgICAgICAgICAgaW5kYXRhID0gZGF0YV9wcmVmaXggKyBtZXRoX25hbWUKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VuZF9tZXRoKGluZGF0YS5lbmNvZGUoJ0FTQ0lJJywgJ3N0cmljdCcpLCAqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGRhdGEgPSBzLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IG91dGRhdGEuZGVjb2RlKCdBU0NJSScsICdzdHJpY3QnKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3V0ZGF0YSAhPSBpbmRhdGEubG93ZXIoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXaGlsZSBzZW5kaW5nIHdpdGggPDwlcz4+IGJhZCBkYXRhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8JXI+PiAoJWQpIHJlY2VpdmVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCA8PCVyPj4gKCVkKVxuIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhfbmFtZSwgb3V0ZGF0YVs6MjBdLCBsZW4ob3V0ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRhdGFbOjIwXSwgbGVuKGluZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4cGVjdF9zdWNjZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBzZW5kIHdpdGggbWV0aG9kIDw8JXM+PjsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdG8gc3VjY2VlZC5cbiIgJSAobWV0aF9uYW1lLCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyKGUpLnN0YXJ0c3dpdGgobWV0aF9uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgPDwlcz4+IGZhaWxlZCB3aXRoIHVuZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIG1lc3NhZ2U6ICVzXG4iICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aF9uYW1lLCBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKKyAgICAgICAgICAgICAgICBmb3IgbWV0aF9uYW1lLCByZWN2X21ldGgsIGV4cGVjdF9zdWNjZXNzLCBhcmdzIGluIHJlY3ZfbWV0aG9kczoKKyAgICAgICAgICAgICAgICAgICAgaW5kYXRhID0gZGF0YV9wcmVmaXggKyBtZXRoX25hbWUKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcy5zZW5kKGluZGF0YS5lbmNvZGUoJ0FTQ0lJJywgJ3N0cmljdCcpKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZGF0YSA9IHJlY3ZfbWV0aCgqYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGRhdGEgPSBvdXRkYXRhLmRlY29kZSgnQVNDSUknLCAnc3RyaWN0JykKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG91dGRhdGEgIT0gaW5kYXRhLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2hpbGUgcmVjZWl2aW5nIHdpdGggPDwlcz4+IGJhZCBkYXRhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjw8JXI+PiAoJWQpIHJlY2VpdmVkOyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCA8PCVyPj4gKCVkKVxuIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhfbmFtZSwgb3V0ZGF0YVs6MjBdLCBsZW4ob3V0ZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRhdGFbOjIwXSwgbGVuKGluZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGV4cGVjdF9zdWNjZXNzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZWNlaXZlIHdpdGggbWV0aG9kIDw8JXM+PjsgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdG8gc3VjY2VlZC5cbiIgJSAobWV0aF9uYW1lLCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgc3RyKGUpLnN0YXJ0c3dpdGgobWV0aF9uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZXRob2QgPDwlcz4+IGZhaWxlZCB3aXRoIHVuZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhjZXB0aW9uIG1lc3NhZ2U6ICVzXG4iICUgKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aF9uYW1lLCBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnN1bWUgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgcy5yZWFkKCkKKworICAgICAgICAgICAgICAgIHMud3JpdGUoIm92ZXJcbiIuZW5jb2RlKCJBU0NJSSIsICJzdHJpY3QiKSkKKyAgICAgICAgICAgICAgICBzLmNsb3NlKCkKKworICAgICAgICBkZWYgdGVzdF9oYW5kc2hha2VfdGltZW91dChzZWxmKToKKyAgICAgICAgICAgICMgSXNzdWUgIzUxMDM6IFNTTCBoYW5kc2hha2UgbXVzdCByZXNwZWN0IHRoZSBzb2NrZXQgdGltZW91dAorICAgICAgICAgICAgc2VydmVyID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCkKKyAgICAgICAgICAgIGhvc3QgPSAiMTI3LjAuMC4xIgorICAgICAgICAgICAgcG9ydCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VydmVyKQorICAgICAgICAgICAgc3RhcnRlZCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgICAgICBmaW5pc2ggPSBGYWxzZQorCisgICAgICAgICAgICBkZWYgc2VydmUoKToKKyAgICAgICAgICAgICAgICBzZXJ2ZXIubGlzdGVuKDUpCisgICAgICAgICAgICAgICAgc3RhcnRlZC5zZXQoKQorICAgICAgICAgICAgICAgIGNvbm5zID0gW10KKyAgICAgICAgICAgICAgICB3aGlsZSBub3QgZmluaXNoOgorICAgICAgICAgICAgICAgICAgICByLCB3LCBlID0gc2VsZWN0LnNlbGVjdChbc2VydmVyXSwgW10sIFtdLCAwLjEpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlcnZlciBpbiByOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBMZXQgdGhlIHNvY2tldCBoYW5nIGFyb3VuZCByYXRoZXIgdGhhbiBoYXZpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICMgaXQgY2xvc2VkIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5zLmFwcGVuZChzZXJ2ZXIuYWNjZXB0KClbMF0pCisKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZSkKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgc3RhcnRlZC53YWl0KCkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgICAgICAgICAgICAgIGMuc2V0dGltZW91dCgwLjIpCisgICAgICAgICAgICAgICAgICAgIGMuY29ubmVjdCgoaG9zdCwgcG9ydCkpCisgICAgICAgICAgICAgICAgICAgICMgV2lsbCBhdHRlbXB0IGhhbmRzaGFrZSBhbmQgdGltZSBvdXQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoc3NsLlNTTEVycm9yLCAidGltZWQgb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NsLndyYXBfc29ja2V0LCBjKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGMuY2xvc2UoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgYyA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQpCisgICAgICAgICAgICAgICAgICAgIGMuc2V0dGltZW91dCgwLjIpCisgICAgICAgICAgICAgICAgICAgIGMgPSBzc2wud3JhcF9zb2NrZXQoYykKKyAgICAgICAgICAgICAgICAgICAgIyBXaWxsIGF0dGVtcHQgaGFuZHNoYWtlIGFuZCB0aW1lIG91dAorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChzc2wuU1NMRXJyb3IsICJ0aW1lZCBvdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLmNvbm5lY3QsIChob3N0LCBwb3J0KSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZmluaXNoID0gVHJ1ZQorICAgICAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgICAgICAgICAgc2VydmVyLmNsb3NlKCkKKworICAgICAgICBkZWYgdGVzdF9kZWZhdWx0X2NpcGhlcnMoc2VsZik6CisgICAgICAgICAgICB3aXRoIFRocmVhZGVkRWNob1NlcnZlcihDRVJURklMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGF0dHk9RmFsc2UpIGFzIHNlcnZlcjoKKyAgICAgICAgICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIEZvcmNlIGEgc2V0IG9mIHdlYWsgY2lwaGVycyBvbiBvdXIgY2xpZW50IHNvY2tldAorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzID0gc3NsLndyYXBfc29ja2V0KHNvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzbF92ZXJzaW9uPXNzbC5QUk9UT0NPTF9TU0x2MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpcGhlcnM9IkRFUyIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzc2wuU1NMRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJubyBERVMgY2lwaGVyIGF2YWlsYWJsZSIpCisgICAgICAgICAgICAgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoKE9TRXJyb3IsIHNzbC5TU0xFcnJvcikpOgorICAgICAgICAgICAgICAgICAgICAgICAgcy5jb25uZWN0KChIT1NULCBzZXJ2ZXIucG9ydCkpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgc29jay5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJubyBzaGFyZWQgY2lwaGVyIiwgc3RyKHNlcnZlci5jb25uX2Vycm9yc1swXSkpCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPUZhbHNlKToKKyAgICBnbG9iYWwgQ0VSVEZJTEUsIFNWTl9QWVRIT05fT1JHX1JPT1RfQ0VSVCwgTk9LSUFDRVJUCisgICAgQ0VSVEZJTEUgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSBvciBvcy5jdXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleWNlcnQucGVtIikKKyAgICBTVk5fUFlUSE9OX09SR19ST09UX0NFUlQgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykgb3Igb3MuY3VyZGlyLAorICAgICAgICAiaHR0cHNfc3ZuX3B5dGhvbl9vcmdfcm9vdC5wZW0iKQorICAgIE5PS0lBQ0VSVCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pIG9yIG9zLmN1cmRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5va2lhLnBlbSIpCisKKyAgICBpZiAobm90IG9zLnBhdGguZXhpc3RzKENFUlRGSUxFKSBvcgorICAgICAgICBub3Qgb3MucGF0aC5leGlzdHMoU1ZOX1BZVEhPTl9PUkdfUk9PVF9DRVJUKSBvcgorICAgICAgICBub3Qgb3MucGF0aC5leGlzdHMoTk9LSUFDRVJUKSk6CisgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkKCJDYW4ndCByZWFkIGNlcnRpZmljYXRlIGZpbGVzISIpCisKKyAgICB0ZXN0cyA9IFtCYXNpY1Rlc3RzLCBCYXNpY1NvY2tldFRlc3RzXQorCisgICAgaWYgdGVzdF9zdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoJ25ldHdvcmsnKToKKyAgICAgICAgdGVzdHMuYXBwZW5kKE5ldHdvcmtlZFRlc3RzKQorCisgICAgaWYgX2hhdmVfdGhyZWFkczoKKyAgICAgICAgdGhyZWFkX2luZm8gPSB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKyAgICAgICAgaWYgdGhyZWFkX2luZm8gYW5kIHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJyk6CisgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoVGhyZWFkZWRUZXN0cykKKworICAgIHRyeToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisgICAgZmluYWxseToKKyAgICAgICAgaWYgX2hhdmVfdGhyZWFkczoKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zc2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTJmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zc2wucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3NzbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zc2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTJmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zc2wucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNlOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5CkBAIC0wLDAgKzEsNDUgQEAKKyMgUmlkaWN1bG91c2x5IHNpbXBsZSB0ZXN0IG9mIHRoZSBvcy5zdGFydGZpbGUgZnVuY3Rpb24gZm9yIFdpbmRvd3MuCisjCisjIGVtcHR5LnZicyBpcyBhbiBlbXB0eSBmaWxlIChleGNlcHQgZm9yIGEgY29tbWVudCksIHdoaWNoIGRvZXMKKyMgbm90aGluZyB3aGVuIHJ1biB3aXRoIGNzY3JpcHQgb3Igd3NjcmlwdC4KKyMKKyMgQSBwb3NzaWJsZSBpbXByb3ZlbWVudCB3b3VsZCBiZSB0byBoYXZlIGVtcHR5LnZicyBkbyBzb21ldGhpbmcgdGhhdAorIyB3ZSBjYW4gZGV0ZWN0IGhlcmUsIHRvIG1ha2Ugc3VyZSB0aGF0IG5vdCBvbmx5IHRoZSBvcy5zdGFydGZpbGUoKQorIyBjYWxsIHN1Y2NlZWRlZCwgYnV0IGFsc28gdGhlIHRoZSBzY3JpcHQgYWN0dWFsbHkgaGFzIHJ1bi4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IG9zCitmcm9tIG9zIGltcG9ydCBwYXRoCitmcm9tIHRpbWUgaW1wb3J0IHNsZWVwCisKK3N0YXJ0ZmlsZSA9IHRlc3Rfc3VwcG9ydC5nZXRfYXR0cmlidXRlKG9zLCAnc3RhcnRmaWxlJykKKworCitjbGFzcyBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfbm9uZXhpc3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHN0YXJ0ZmlsZSwgIm5vbmV4aXN0aW5nLnZicyIpCisKKyAgICBkZWYgdGVzdF9ub25leGlzdGluZ191KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBzdGFydGZpbGUsIHUibm9uZXhpc3RpbmcudmJzIikKKworICAgIGRlZiB0ZXN0X2VtcHR5KHNlbGYpOgorICAgICAgICBlbXB0eSA9IHBhdGguam9pbihwYXRoLmRpcm5hbWUoX19maWxlX18pLCAiZW1wdHkudmJzIikKKyAgICAgICAgc3RhcnRmaWxlKGVtcHR5KQorICAgICAgICBzdGFydGZpbGUoZW1wdHksICJvcGVuIikKKyAgICAgICAgIyBHaXZlIHRoZSBjaGlsZCBwcm9jZXNzIHNvbWUgdGltZSB0byBleGl0IGJlZm9yZSB3ZSBmaW5pc2guCisgICAgICAgICMgT3RoZXJ3aXNlIHRoZSBjbGVhbnVwIGNvZGUgd2lsbCBub3QgYmUgYWJsZSB0byBkZWxldGUgdGhlIGN3ZCwKKyAgICAgICAgIyBiZWNhdXNlIGl0IGlzIHN0aWxsIGluIHVzZS4KKyAgICAgICAgc2xlZXAoMC4xKQorCisgICAgZGVmIHRlc3RfZW1wdHlfdShzZWxmKToKKyAgICAgICAgZW1wdHkgPSBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImVtcHR5LnZicyIpCisgICAgICAgIHN0YXJ0ZmlsZSh1bmljb2RlKGVtcHR5LCAibWJjcyIpKQorICAgICAgICBzdGFydGZpbGUodW5pY29kZShlbXB0eSwgIm1iY3MiKSwgIm9wZW4iKQorICAgICAgICBzbGVlcCgwLjEpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RDYXNlKQorCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3NTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3NTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNzA0ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHkKQEAgLTAsMCArMSw0NjEgQEAKKworaW1wb3J0IHN0cnVjdAoraW1wb3J0IHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIHN0cmluZ190ZXN0cworCisKK2NsYXNzIFN0clRlc3QoCisgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QsCisgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LAorICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVzZXJTdHJpbmdUZXN0LAorICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVUZXN0LAorICAgICk6CisKKyAgICB0eXBlMnRlc3QgPSBzdHIKKworICAgICMgV2UgZG9uJ3QgbmVlZCB0byBwcm9wYWdhdGUgdG8gc3RyCisgICAgZGVmIGZpeHR5cGUoc2VsZiwgb2JqKToKKyAgICAgICAgcmV0dXJuIG9iagorCisgICAgZGVmIHRlc3RfYmFzaWNfY3JlYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKCcnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKDApLCAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKDBMKSwgJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cigoKSksICcoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFtdKSwgJ1tdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoe30pLCAne30nKQorICAgICAgICBhID0gW10KKyAgICAgICAgYS5hcHBlbmQoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYSksICdbWy4uLl1dJykKKyAgICAgICAgYSA9IHt9CisgICAgICAgIGFbMF0gPSBhCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGEpLCAnezA6IHsuLi59fScpCisKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF9mb3JtYXR0aW5nKHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsICclYycuX19tb2RfXywgMHgxMjM0KQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF9mb3JtYXR0aW5nX2h1Z2VfcHJlY2lzaW9uKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgSU5UX01BWAorICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiUue31mIi5mb3JtYXQoSU5UX01BWCArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfc3RyaW5nICUgMi4zNAorCisgICAgZGVmIHRlc3RfZm9ybWF0dGluZ19odWdlX3dpZHRoKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiV7fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfc3RyaW5nICUgMi4zNAorCisgICAgZGVmIHRlc3RfY29udmVyc2lvbihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgX19zdHJfXygpIGJlaGF2ZXMgcHJvcGVybHkKKyAgICAgICAgY2xhc3MgRm9vMDoKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJmb28iCisKKyAgICAgICAgY2xhc3MgRm9vMToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1ImZvbyIKKworICAgICAgICBjbGFzcyBGb280KHVuaWNvZGUpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzUoc3RyKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1ImZvbyIKKworICAgICAgICBjbGFzcyBGb282KHN0cik6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvb3MiCisKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJmb291IgorCisgICAgICAgIGNsYXNzIEZvbzcodW5pY29kZSk6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvb3MiCisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUiZm9vdSIKKworICAgICAgICBjbGFzcyBGb284KHN0cik6CisgICAgICAgICAgICBkZWYgX19uZXdfXyhjbHMsIGNvbnRlbnQ9IiIpOgorICAgICAgICAgICAgICAgIHJldHVybiBzdHIuX19uZXdfXyhjbHMsIDIqY29udGVudCkKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgY2xhc3MgRm9vOShzdHIpOgorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciCisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJub3QgdW5pY29kZSIKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKEZvbzAoKSkuc3RhcnRzd2l0aCgiPCIpKSAjIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gX191bmljb2RlX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vMSgpKSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzIoKSksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb28zKCkpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vNCgiYmFyIikpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vNSgiYmFyIikpLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vNigiYmFyIikpLCAiZm9vcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzcoImJhciIpKSwgImZvb3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb284KCJmb28iKSksICJmb29mb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb285KCJmb28iKSksICJzdHJpbmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vOSgiZm9vIikpLCB1Im5vdCB1bmljb2RlIikKKworICAgIGRlZiB0ZXN0X2V4cGFuZHRhYnNfb3ZlcmZsb3dzX2dyYWNlZnVsbHkoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IG9ubHkgYWZmZWN0cyAzMi1iaXQgcGxhdGZvcm1zIGJlY2F1c2UgZXhwYW5kdGFicyBjYW4gb25seSB0YWtlCisgICAgICAgICMgYW4gaW50IGFzIHRoZSBtYXggdmFsdWUsIG5vdCBhIDY0LWJpdCBDIGxvbmcuICBJZiBleHBhbmR0YWJzIGlzIGNoYW5nZWQKKyAgICAgICAgIyB0byB0YWtlIGEgNjQtYml0IGxvbmcsIHRoaXMgdGVzdCBzaG91bGQgYXBwbHkgdG8gYWxsIHBsYXRmb3Jtcy4KKyAgICAgICAgaWYgc3lzLm1heGludCA+ICgxIDw8IDMyKSBvciBzdHJ1Y3QuY2FsY3NpemUoJ1AnKSAhPSA0OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsICd0XHR0XHQnLmV4cGFuZHRhYnMsIHN5cy5tYXhpbnQpCisKKyAgICBkZWYgdGVzdF9fZm9ybWF0X18oc2VsZik6CisgICAgICAgIGRlZiB0ZXN0KHZhbHVlLCBmb3JtYXQsIGV4cGVjdGVkKToKKyAgICAgICAgICAgICMgdGVzdCBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIHRyYWlsaW5nICdzJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5fX2Zvcm1hdF9fKGZvcm1hdCksIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5fX2Zvcm1hdF9fKGZvcm1hdCArICdzJyksIGV4cGVjdGVkKQorCisgICAgICAgIHRlc3QoJycsICcnLCAnJykKKyAgICAgICAgdGVzdCgnYWJjJywgJycsICdhYmMnKQorICAgICAgICB0ZXN0KCdhYmMnLCAnLjMnLCAnYWJjJykKKyAgICAgICAgdGVzdCgnYWInLCAnLjMnLCAnYWInKQorICAgICAgICB0ZXN0KCdhYmNkZWYnLCAnLjMnLCAnYWJjJykKKyAgICAgICAgdGVzdCgnYWJjZGVmJywgJy4wJywgJycpCisgICAgICAgIHRlc3QoJ2FiYycsICczLjMnLCAnYWJjJykKKyAgICAgICAgdGVzdCgnYWJjJywgJzIuMycsICdhYmMnKQorICAgICAgICB0ZXN0KCdhYmMnLCAnMi4yJywgJ2FiJykKKyAgICAgICAgdGVzdCgnYWJjJywgJzMuMicsICdhYiAnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAneDwwJywgJ3Jlc3VsdCcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICd4PDUnLCAncmVzdWx0JykKKyAgICAgICAgdGVzdCgncmVzdWx0JywgJ3g8NicsICdyZXN1bHQnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAneDw3JywgJ3Jlc3VsdHgnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAneDw4JywgJ3Jlc3VsdHh4JykKKyAgICAgICAgdGVzdCgncmVzdWx0JywgJyA8NycsICdyZXN1bHQgJykKKyAgICAgICAgdGVzdCgncmVzdWx0JywgJzw3JywgJ3Jlc3VsdCAnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAnPjcnLCAnIHJlc3VsdCcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICc+OCcsICcgIHJlc3VsdCcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICdeOCcsICcgcmVzdWx0ICcpCisgICAgICAgIHRlc3QoJ3Jlc3VsdCcsICdeOScsICcgcmVzdWx0ICAnKQorICAgICAgICB0ZXN0KCdyZXN1bHQnLCAnXjEwJywgJyAgcmVzdWx0ICAnKQorICAgICAgICB0ZXN0KCdhJywgJzEwMDAwJywgJ2EnICsgJyAnICogOTk5OSkKKyAgICAgICAgdGVzdCgnJywgJzEwMDAwJywgJyAnICogMTAwMDApCisgICAgICAgIHRlc3QoJycsICcxMDAwMDAwMCcsICcgJyAqIDEwMDAwMDAwKQorCisgICAgZGVmIHRlc3RfZm9ybWF0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmZvcm1hdCgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYScuZm9ybWF0KCksICdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWInLmZvcm1hdCgpLCAnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhe3snLmZvcm1hdCgpLCAnYXsnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhfX0nLmZvcm1hdCgpLCAnYX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e2InLmZvcm1hdCgpLCAne2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd9fWInLmZvcm1hdCgpLCAnfWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhe3tiJy5mb3JtYXQoKSwgJ2F7YicpCisKKyAgICAgICAgIyBleGFtcGxlcyBmcm9tIHRoZSBQRVA6CisgICAgICAgIGltcG9ydCBkYXRldGltZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJNeSBuYW1lIGlzIHswfSIuZm9ybWF0KCdGcmVkJyksICJNeSBuYW1lIGlzIEZyZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJNeSBuYW1lIGlzIHswW25hbWVdfSIuZm9ybWF0KGRpY3QobmFtZT0nRnJlZCcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTXkgbmFtZSBpcyBGcmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiTXkgbmFtZSBpcyB7MH0gOi17e319Ii5mb3JtYXQoJ0ZyZWQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTXkgbmFtZSBpcyBGcmVkIDote30iKQorCisgICAgICAgIGQgPSBkYXRldGltZS5kYXRlKDIwMDcsIDgsIDE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJUaGUgeWVhciBpcyB7MC55ZWFyfSIuZm9ybWF0KGQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgeWVhciBpcyAyMDA3IikKKworICAgICAgICAjIGNsYXNzZXMgd2UnbGwgdXNlIGZvciB0ZXN0aW5nCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeD0xMDApOgorICAgICAgICAgICAgICAgIHNlbGYuX3ggPSB4CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworCisgICAgICAgIGNsYXNzIEQ6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLngpCisKKyAgICAgICAgIyBjbGFzcyB3aXRoIF9fc3RyX18sIGJ1dCBubyBfX2Zvcm1hdF9fCisgICAgICAgIGNsYXNzIEU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdFKCcgKyBzZWxmLnggKyAnKScKKworICAgICAgICAjIGNsYXNzIHdpdGggX19yZXByX18sIGJ1dCBubyBfX2Zvcm1hdF9fIG9yIF9fc3RyX18KKyAgICAgICAgY2xhc3MgRjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdGKCcgKyBzZWxmLnggKyAnKScKKworICAgICAgICAjIGNsYXNzIHdpdGggX19mb3JtYXRfXyB0aGF0IGZvcndhcmRzIHRvIHN0cmluZywgZm9yIHNvbWUgZm9ybWF0X3NwZWMncworICAgICAgICBjbGFzcyBHOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIGlzICIgKyBzZWxmLngKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICBpZiBmb3JtYXRfc3BlYyA9PSAnZCc6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAnRygnICsgc2VsZi54ICsgJyknCisgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdC5fX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKQorCisgICAgICAgICMgY2xhc3MgdGhhdCByZXR1cm5zIGEgYmFkIHR5cGUgZnJvbSBfX2Zvcm1hdF9fCisgICAgICAgIGNsYXNzIEg6CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIDEuMAorCisgICAgICAgIGNsYXNzIEkoZGF0ZXRpbWUuZGF0ZSk6CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3RyZnRpbWUoZm9ybWF0X3NwZWMpCisKKyAgICAgICAgY2xhc3MgSihpbnQpOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQuX19mb3JtYXRfXyhzZWxmICogMiwgZm9ybWF0X3NwZWMpCisKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmZvcm1hdCgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjJy5mb3JtYXQoKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swfScuZm9ybWF0KCdhYmMnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOn0nLmZvcm1hdCgnYWJjJyksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdYezB9Jy5mb3JtYXQoJ2FiYycpLCAnWGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swfVgnLmZvcm1hdCgnYWJjJyksICdhYmNYJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnWHswfVknLmZvcm1hdCgnYWJjJyksICdYYWJjWScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3sxfScuZm9ybWF0KDEsICdhYmMnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ1h7MX0nLmZvcm1hdCgxLCAnYWJjJyksICdYYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezF9WCcuZm9ybWF0KDEsICdhYmMnKSwgJ2FiY1gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdYezF9WScuZm9ybWF0KDEsICdhYmMnKSwgJ1hhYmNZJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9Jy5mb3JtYXQoLTE1KSwgJy0xNScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swfXsxfScuZm9ybWF0KC0xNSwgJ2FiYycpLCAnLTE1YWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9WHsxfScuZm9ybWF0KC0xNSwgJ2FiYycpLCAnLTE1WGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7Jy5mb3JtYXQoKSwgJ3snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd9fScuZm9ybWF0KCksICd9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne3t9fScuZm9ybWF0KCksICd7fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7eH19Jy5mb3JtYXQoKSwgJ3t4fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3t7ezB9fX0nLmZvcm1hdCgxMjMpLCAnezEyM30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7e3t7MH19fX0nLmZvcm1hdCgpLCAne3swfX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd9fXt7Jy5mb3JtYXQoKSwgJ317JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnfX14e3snLmZvcm1hdCgpLCAnfXh7JykKKworICAgICAgICAjIHdlaXJkIGZpZWxkIG5hbWVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswW2Zvby1iYXJdfSIuZm9ybWF0KHsnZm9vLWJhcic6J2Jheid9KSwgJ2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswW2ZvbyBiYXJdfSIuZm9ybWF0KHsnZm9vIGJhcic6J2Jheid9KSwgJ2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswWyBdfSIuZm9ybWF0KHsnICc6M30pLCAnMycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2Zvby5feH0nLmZvcm1hdChmb289QygyMCkpLCAnMjAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MX17MH0nLmZvcm1hdChEKDEwKSwgRCgyMCkpLCAnMjAxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swLl94Lnh9Jy5mb3JtYXQoQyhEKCdhYmMnKSkpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezBbMF19Jy5mb3JtYXQoWydhYmMnLCAnZGVmJ10pLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezBbMV19Jy5mb3JtYXQoWydhYmMnLCAnZGVmJ10pLCAnZGVmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezBbMV1bMF19Jy5mb3JtYXQoWydhYmMnLCBbJ2RlZiddXSksICdkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MFsxXVswXS54fScuZm9ybWF0KFsnYWJjJywgW0QoJ2RlZicpXV0pLCAnZGVmJykKKworICAgICAgICAjIHN0cmluZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6LjNzfScuZm9ybWF0KCdhYmMnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOi4zc30nLmZvcm1hdCgnYWInKSwgJ2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6LjNzfScuZm9ybWF0KCdhYmNkZWYnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOi4wc30nLmZvcm1hdCgnYWJjZGVmJyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDozLjNzfScuZm9ybWF0KCdhYmMnKSwgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOjIuM3N9Jy5mb3JtYXQoJ2FiYycpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6Mi4yc30nLmZvcm1hdCgnYWJjJyksICdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOjMuMnN9Jy5mb3JtYXQoJ2FiYycpLCAnYWIgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6eDwwc30nLmZvcm1hdCgncmVzdWx0JyksICdyZXN1bHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDp4PDVzfScuZm9ybWF0KCdyZXN1bHQnKSwgJ3Jlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOng8NnN9Jy5mb3JtYXQoJ3Jlc3VsdCcpLCAncmVzdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6eDw3c30nLmZvcm1hdCgncmVzdWx0JyksICdyZXN1bHR4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6eDw4c30nLmZvcm1hdCgncmVzdWx0JyksICdyZXN1bHR4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOiA8N3N9Jy5mb3JtYXQoJ3Jlc3VsdCcpLCAncmVzdWx0ICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOjw3c30nLmZvcm1hdCgncmVzdWx0JyksICdyZXN1bHQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6PjdzfScuZm9ybWF0KCdyZXN1bHQnKSwgJyByZXN1bHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDo+OHN9Jy5mb3JtYXQoJ3Jlc3VsdCcpLCAnICByZXN1bHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpeOHN9Jy5mb3JtYXQoJ3Jlc3VsdCcpLCAnIHJlc3VsdCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpeOXN9Jy5mb3JtYXQoJ3Jlc3VsdCcpLCAnIHJlc3VsdCAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XjEwc30nLmZvcm1hdCgncmVzdWx0JyksICcgIHJlc3VsdCAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6MTAwMDB9Jy5mb3JtYXQoJ2EnKSwgJ2EnICsgJyAnICogOTk5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6MTAwMDB9Jy5mb3JtYXQoJycpLCAnICcgKiAxMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6MTAwMDAwMDB9Jy5mb3JtYXQoJycpLCAnICcgKiAxMDAwMDAwMCkKKworICAgICAgICAjIGZvcm1hdCBzcGVjaWZpZXJzIGZvciB1c2VyIGRlZmluZWQgdHlwZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDphYmN9Jy5mb3JtYXQoQygpKSwgJ2FiYycpCisKKyAgICAgICAgIyAhciBhbmQgIXMgY29lcmNpb25zCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swIXN9Jy5mb3JtYXQoJ0hlbGxvJyksICdIZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swIXM6fScuZm9ybWF0KCdIZWxsbycpLCAnSGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MCFzOjE1fScuZm9ybWF0KCdIZWxsbycpLCAnSGVsbG8gICAgICAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezAhczoxNXN9Jy5mb3JtYXQoJ0hlbGxvJyksICdIZWxsbyAgICAgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MCFyfScuZm9ybWF0KCdIZWxsbycpLCAiJ0hlbGxvJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swIXI6fScuZm9ybWF0KCdIZWxsbycpLCAiJ0hlbGxvJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swIXJ9Jy5mb3JtYXQoRignSGVsbG8nKSksICdGKEhlbGxvKScpCisKKyAgICAgICAgIyB0ZXN0IGZhbGxiYWNrIHRvIG9iamVjdC5fX2Zvcm1hdF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swfScuZm9ybWF0KHt9KSwgJ3t9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9Jy5mb3JtYXQoW10pLCAnW10nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MH0nLmZvcm1hdChbMV0pLCAnWzFdJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezB9Jy5mb3JtYXQoRSgnZGF0YScpKSwgJ0UoZGF0YSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7MDpkfScuZm9ybWF0KEcoJ2RhdGEnKSksICdHKGRhdGEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezAhc30nLmZvcm1hdChHKCdkYXRhJykpLCAnc3RyaW5nIGlzIGRhdGEnKQorCisgICAgICAgIG1zZyA9ICdvYmplY3QuX19mb3JtYXRfXyB3aXRoIGEgbm9uLWVtcHR5IGZvcm1hdCBzdHJpbmcgaXMgZGVwcmVjYXRlZCcKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKG1zZywgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6XjEwfScuZm9ybWF0KEUoJ2RhdGEnKSksICcgRShkYXRhKSAgJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOl4xMHN9Jy5mb3JtYXQoRSgnZGF0YScpKSwgJyBFKGRhdGEpICAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezA6PjE1c30nLmZvcm1hdChHKCdkYXRhJykpLCAnIHN0cmluZyBpcyBkYXRhJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7MDpkYXRlOiAlWS0lbS0lZH0iLmZvcm1hdChJKHllYXI9MjAwNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aD04LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheT0yNykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRlOiAyMDA3LTA4LTI3IikKKworICAgICAgICAjIHRlc3QgZGVyaXZpbmcgZnJvbSBhIGJ1aWx0aW4gdHlwZSBhbmQgb3ZlcnJpZGluZyBfX2Zvcm1hdF9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswfSIuZm9ybWF0KEooMTApKSwgIjIwIikKKworCisgICAgICAgICMgc3RyaW5nIGZvcm1hdCBzcGVjaWZpZXJzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3swOn0nLmZvcm1hdCgnYScpLCAnYScpCisKKyAgICAgICAgIyBjb21wdXRlZCBmb3JtYXQgc3BlY2lmaWVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7MDouezF9fSIuZm9ybWF0KCdoZWxsbyB3b3JsZCcsIDUpLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ7MDouezF9c30iLmZvcm1hdCgnaGVsbG8gd29ybGQnLCA1KSwgJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiezA6LntwcmVjaXNpb259c30iLmZvcm1hdCgnaGVsbG8gd29ybGQnLCBwcmVjaXNpb249NSksICdoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInswOnt3aWR0aH0ue3ByZWNpc2lvbn1zfSIuZm9ybWF0KCdoZWxsbyB3b3JsZCcsIHdpZHRoPTEwLCBwcmVjaXNpb249NSksICdoZWxsbyAgICAgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiezA6e3dpZHRofS57cHJlY2lzaW9ufXN9Ii5mb3JtYXQoJ2hlbGxvIHdvcmxkJywgd2lkdGg9JzEwJywgcHJlY2lzaW9uPSc1JyksICdoZWxsbyAgICAgJykKKworICAgICAgICAjIHRlc3QgdmFyaW91cyBlcnJvcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ3snLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ30nLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ2F7Jy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICdhfScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAne2EnLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ31hJy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsICd7MH0nLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgJ3sxfScuZm9ybWF0LCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsICAgJ3t4fScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAifXsiLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInsiLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgIn0iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgImFiY3swOnt9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MCIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAiezAufSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezAufSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAiezBbfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezBbfSIuZm9ybWF0LCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsICAgInswXX0iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswLltdfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezAuLmZvb30iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswWzB9Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MFswOmZvb30iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsICAgIntjXX0iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInt7IHt7ezB9fSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezB9fSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgICAie2Zvb30iLmZvcm1hdCwgYmFyPTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MCF4fSIuZm9ybWF0LCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezAhfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezAhcnN9Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7IX0iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgIns6fSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAiezpzfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCAie30iLmZvcm1hdCkKKworICAgICAgICAjIGlzc3VlIDYwODkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswWzBdeH0iLmZvcm1hdCwgW05vbmVdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezBbMF0oMTApfSIuZm9ybWF0LCBbTm9uZV0pCisKKyAgICAgICAgIyBjYW4ndCBoYXZlIGEgcmVwbGFjZW1lbnQgb24gdGhlIGZpZWxkIG5hbWUgcG9ydGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsICd7MFt7MX1dfScuZm9ybWF0LCAnYWJjZGVmZycsIDQpCisKKyAgICAgICAgIyBleGNlZWQgbWF4aW11bSByZWN1cnNpb24gZGVwdGgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswOnsxOnsyfX19Ii5mb3JtYXQsICdhYmMnLCAncycsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAiezA6ezE6ezI6ezM6ezQ6ezU6ezZ9fX19fX19Ii5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcpCisKKyAgICAgICAgIyBzdHJpbmcgZm9ybWF0IHNwZWMgZXJyb3JzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICJ7MDotc30iLmZvcm1hdCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgIiIsICItIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgInswOj1zfSIuZm9ybWF0LCAnJykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX3ByZWNpc2lvbihzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIue31mIi5mb3JtYXQoc3lzLm1heHNpemUgKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0KDIuMzQsIGZvcm1hdF9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfaHVnZV93aWR0aChzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9ICJ7fWYiLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXQoMi4zNCwgZm9ybWF0X3N0cmluZykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9odWdlX2l0ZW1fbnVtYmVyKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gInt7e306LjZmfX0iLmZvcm1hdChzeXMubWF4c2l6ZSArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfc3RyaW5nLmZvcm1hdCgyLjM0KQorCisgICAgZGVmIHRlc3RfZm9ybWF0X2F1dG9fbnVtYmVyaW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHg9MTAwKToKKyAgICAgICAgICAgICAgICBzZWxmLl94ID0geAorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNwZWMKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7fScuZm9ybWF0KDEwKSwgJzEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnezo1fScuZm9ybWF0KCdzJyksICdzICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3shcn0nLmZvcm1hdCgncycpLCAiJ3MnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgney5feH0nLmZvcm1hdChDKDEwKSksICcxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3tbMV19Jy5mb3JtYXQoWzEsIDJdKSwgJzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7W2FdfScuZm9ybWF0KHsnYSc6NCwgJ2InOjJ9KSwgJzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhe31ie31jJy5mb3JtYXQoMCwgMSksICdhMGIxYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYXs6e319YicuZm9ybWF0KCd4JywgJ14xMCcpLCAnYSAgICB4ICAgICBiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYXs6e314fWInLmZvcm1hdCgyMCwgJyMnKSwgJ2EweDE0YicpCisKKyAgICAgICAgIyBjYW4ndCBtaXggYW5kIG1hdGNoIG51bWJlcmluZyBhbmQgYXV0by1udW1iZXJpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgJ3t9ezF9Jy5mb3JtYXQsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICd7MX17fScuZm9ybWF0LCAxLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAnezp7MX19Jy5mb3JtYXQsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsICd7MDp7fX0nLmZvcm1hdCwgMSwgMikKKworICAgICAgICAjIGNhbiBtaXggYW5kIG1hdGNoIGF1dG8tbnVtYmVyaW5nIGFuZCBuYW1lZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCd7Zn17fScuZm9ybWF0KDQsIGY9J3Rlc3QnKSwgJ3Rlc3Q0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne317Zn0nLmZvcm1hdCg0LCBmPSd0ZXN0JyksICc0dGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3s6e2Z9fXtnfXt9Jy5mb3JtYXQoMSwgMywgZz0nZycsIGY9MiksICcgMWczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgne2Y6e319e317Z30nLmZvcm1hdCgyLCA0LCBmPTEsIGc9J2cnKSwgJyAxNGcnKQorCisgICAgZGVmIHRlc3RfYnVmZmVyX2lzX3JlYWRvbmx5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5zdGRpbi5yZWFkaW50bywgYiIiKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX2FuZF9kZWNvZGVfa3dhcmdzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmNkZScuZW5jb2RlKCdhc2NpaScsICdyZXBsYWNlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiY2RlJy5lbmNvZGUoJ2FzY2lpJywgZXJyb3JzPSdyZXBsYWNlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2RlJy5lbmNvZGUoJ2FzY2lpJywgJ2lnbm9yZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhYmNkZScuZW5jb2RlKGVuY29kaW5nPSdhc2NpaScsIGVycm9ycz0naWdub3JlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0FuZHJcMjAyIHgnLmRlY29kZSgnYXNjaWknLCAnaWdub3JlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ0FuZHJcMjAyIHgnLmRlY29kZSgnYXNjaWknLCBlcnJvcnM9J2lnbm9yZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdBbmRyXDIwMiB4Jy5kZWNvZGUoJ2FzY2lpJywgJ3JlcGxhY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnQW5kclwyMDIgeCcuZGVjb2RlKGVuY29kaW5nPSdhc2NpaScsIGVycm9ycz0ncmVwbGFjZScpKQorCisgICAgZGVmIHRlc3Rfc3RhcnRzd2l0aF9lbmRzd2l0aF9lcnJvcnMoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKKyAgICAgICAgICAgICdceGZmJy5zdGFydHN3aXRoKHUneCcpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKToKKyAgICAgICAgICAgICdceGZmJy5lbmRzd2l0aCh1J3gnKQorICAgICAgICBmb3IgbWV0aCBpbiAoJ2Zvbycuc3RhcnRzd2l0aCwgJ2ZvbycuZW5kc3dpdGgpOgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgICAgIG1ldGgoWydmJ10pCisgICAgICAgICAgICBleGMgPSBzdHIoY20uZXhjZXB0aW9uKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigndW5pY29kZScsIGV4YykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3N0cicsIGV4YykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3R1cGxlJywgZXhjKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGM5NTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGM5NTNjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJmdGltZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNmViZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJmdGltZS5weQpAQCAtMCwwICsxLDE4NSBAQAorIiIiCitVbml0dGVzdCBmb3IgdGltZS5zdHJmdGltZQorIiIiCisKK2ltcG9ydCBjYWxlbmRhcgoraW1wb3J0IHN5cworaW1wb3J0IHJlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCisKKyMgaGVscGVyIGZ1bmN0aW9ucworZGVmIGZpeGFzY3RpbWUocyk6CisgICAgaWYgc1s4XSA9PSAnICc6CisgICAgICAgIHMgPSBzWzo4XSArICcwJyArIHNbOTpdCisgICAgcmV0dXJuIHMKKworZGVmIGVzY2FwZXN0cih0ZXh0LCBhbXBtKToKKyAgICAiIiIKKyAgICBFc2NhcGUgdGV4dCB0byBkZWFsIHdpdGggcG9zc2libGUgbG9jYWxlIHZhbHVlcyB0aGF0IGhhdmUgcmVnZXgKKyAgICBzeW50YXggd2hpbGUgYWxsb3dpbmcgcmVnZXggc3ludGF4IHVzZWQgZm9yIGNvbXBhcmlzb24uCisgICAgIiIiCisgICAgbmV3X3RleHQgPSByZS5lc2NhcGUodGV4dCkKKyAgICBuZXdfdGV4dCA9IG5ld190ZXh0LnJlcGxhY2UocmUuZXNjYXBlKGFtcG0pLCBhbXBtKQorICAgIG5ld190ZXh0ID0gbmV3X3RleHQucmVwbGFjZSgnXCUnLCAnJScpCisgICAgbmV3X3RleHQgPSBuZXdfdGV4dC5yZXBsYWNlKCdcOicsICc6JykKKyAgICBuZXdfdGV4dCA9IG5ld190ZXh0LnJlcGxhY2UoJ1w/JywgJz8nKQorICAgIHJldHVybiBuZXdfdGV4dAorCitjbGFzcyBTdHJmdGltZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICprLCAqKmt3KToKKyAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UuX19pbml0X18oc2VsZiwgKmssICoqa3cpCisKKyAgICBkZWYgX3VwZGF0ZV92YXJpYWJsZXMoc2VsZiwgbm93KToKKyAgICAgICAgIyB3ZSBtdXN0IHVwZGF0ZSB0aGUgbG9jYWwgdmFyaWFibGVzIG9uIGV2ZXJ5IGN5Y2xlCisgICAgICAgIHNlbGYuZ210ID0gdGltZS5nbXRpbWUobm93KQorICAgICAgICBub3cgPSB0aW1lLmxvY2FsdGltZShub3cpCisKKyAgICAgICAgaWYgbm93WzNdIDwgMTI6IHNlbGYuYW1wbT0nKEFNfGFtKScKKyAgICAgICAgZWxzZTogc2VsZi5hbXBtPScoUE18cG0pJworCisgICAgICAgIHNlbGYuamFuMSA9IHRpbWUubG9jYWx0aW1lKHRpbWUubWt0aW1lKChub3dbMF0sIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDApKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3dbOF06IHNlbGYudHogPSB0aW1lLnR6bmFtZVsxXQorICAgICAgICAgICAgZWxzZTogc2VsZi50eiA9IHRpbWUudHpuYW1lWzBdCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYudHogPSAnJworCisgICAgICAgIGlmIG5vd1szXSA+IDEyOiBzZWxmLmNsb2NrMTIgPSBub3dbM10gLSAxMgorICAgICAgICBlbGlmIG5vd1szXSA+IDA6IHNlbGYuY2xvY2sxMiA9IG5vd1szXQorICAgICAgICBlbHNlOiBzZWxmLmNsb2NrMTIgPSAxMgorCisgICAgICAgIHNlbGYubm93ID0gbm93CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBqYXZhCisgICAgICAgICAgICBqYXZhLnV0aWwuTG9jYWxlLnNldERlZmF1bHQoamF2YS51dGlsLkxvY2FsZS5VUykKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaW1wb3J0IGxvY2FsZQorICAgICAgICAgICAgbG9jYWxlLnNldGxvY2FsZShsb2NhbGUuTENfVElNRSwgJ0MnKQorCisgICAgZGVmIHRlc3Rfc3RyZnRpbWUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuX3VwZGF0ZV92YXJpYWJsZXMobm93KQorICAgICAgICBzZWxmLnN0cmZ0ZXN0MShub3cpCisgICAgICAgIHNlbGYuc3RyZnRlc3QyKG5vdykKKworICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJTdHJmdGltZSB0ZXN0LCBwbGF0Zm9ybTogJXMsIFB5dGhvbiB2ZXJzaW9uOiAlcyIgJSBcCisgICAgICAgICAgICAgICAgICAoc3lzLnBsYXRmb3JtLCBzeXMudmVyc2lvbi5zcGxpdCgpWzBdKQorCisgICAgICAgIGZvciBqIGluIHJhbmdlKC01LCA1KToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDI1KToKKyAgICAgICAgICAgICAgICBhcmcgPSBub3cgKyAoaStqKjEwMCkqMjMqMzYwMworICAgICAgICAgICAgICAgIHNlbGYuX3VwZGF0ZV92YXJpYWJsZXMoYXJnKQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZnRlc3QxKGFyZykKKyAgICAgICAgICAgICAgICBzZWxmLnN0cmZ0ZXN0MihhcmcpCisKKyAgICBkZWYgc3RyZnRlc3QxKHNlbGYsIG5vdyk6CisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgInN0cmZ0aW1lIHRlc3QgZm9yIiwgdGltZS5jdGltZShub3cpCisgICAgICAgIG5vdyA9IHNlbGYubm93CisgICAgICAgICMgTWFrZSBzdXJlIGFueSBjaGFyYWN0ZXJzIHRoYXQgY291bGQgYmUgdGFrZW4gYXMgcmVnZXggc3ludGF4IGlzCisgICAgICAgICMgZXNjYXBlZCBpbiBlc2NhcGVzdHIoKQorICAgICAgICBleHBlY3RhdGlvbnMgPSAoCisgICAgICAgICAgICAoJyVhJywgY2FsZW5kYXIuZGF5X2FiYnJbbm93WzZdXSwgJ2FiYnJldmlhdGVkIHdlZWtkYXkgbmFtZScpLAorICAgICAgICAgICAgKCclQScsIGNhbGVuZGFyLmRheV9uYW1lW25vd1s2XV0sICdmdWxsIHdlZWtkYXkgbmFtZScpLAorICAgICAgICAgICAgKCclYicsIGNhbGVuZGFyLm1vbnRoX2FiYnJbbm93WzFdXSwgJ2FiYnJldmlhdGVkIG1vbnRoIG5hbWUnKSwKKyAgICAgICAgICAgICgnJUInLCBjYWxlbmRhci5tb250aF9uYW1lW25vd1sxXV0sICdmdWxsIG1vbnRoIG5hbWUnKSwKKyAgICAgICAgICAgICMgJWMgc2VlIGJlbG93CisgICAgICAgICAgICAoJyVkJywgJyUwMmQnICUgbm93WzJdLCAnZGF5IG9mIG1vbnRoIGFzIG51bWJlciAoMDAtMzEpJyksCisgICAgICAgICAgICAoJyVIJywgJyUwMmQnICUgbm93WzNdLCAnaG91ciAoMDAtMjMpJyksCisgICAgICAgICAgICAoJyVJJywgJyUwMmQnICUgc2VsZi5jbG9jazEyLCAnaG91ciAoMDEtMTIpJyksCisgICAgICAgICAgICAoJyVqJywgJyUwM2QnICUgbm93WzddLCAnanVsaWFuIGRheSAoMDAxLTM2NiknKSwKKyAgICAgICAgICAgICgnJW0nLCAnJTAyZCcgJSBub3dbMV0sICdtb250aCBhcyBudW1iZXIgKDAxLTEyKScpLAorICAgICAgICAgICAgKCclTScsICclMDJkJyAlIG5vd1s0XSwgJ21pbnV0ZSwgKDAwLTU5KScpLAorICAgICAgICAgICAgKCclcCcsIHNlbGYuYW1wbSwgJ0FNIG9yIFBNIGFzIGFwcHJvcHJpYXRlJyksCisgICAgICAgICAgICAoJyVTJywgJyUwMmQnICUgbm93WzVdLCAnc2Vjb25kcyBvZiBjdXJyZW50IHRpbWUgKDAwLTYwKScpLAorICAgICAgICAgICAgKCclVScsICclMDJkJyAlICgobm93WzddICsgc2VsZi5qYW4xWzZdKS8vNyksCisgICAgICAgICAgICAgJ3dlZWsgbnVtYmVyIG9mIHRoZSB5ZWFyIChTdW4gMXN0KScpLAorICAgICAgICAgICAgKCcldycsICcwPyVkJyAlICgoMStub3dbNl0pICUgNyksICd3ZWVrZGF5IGFzIGEgbnVtYmVyIChTdW4gMXN0KScpLAorICAgICAgICAgICAgKCclVycsICclMDJkJyAlICgobm93WzddICsgKHNlbGYuamFuMVs2XSAtIDEpJTcpLy83KSwKKyAgICAgICAgICAgICd3ZWVrIG51bWJlciBvZiB0aGUgeWVhciAoTW9uIDFzdCknKSwKKyAgICAgICAgICAgICMgJXggc2VlIGJlbG93CisgICAgICAgICAgICAoJyVYJywgJyUwMmQ6JTAyZDolMDJkJyAlIChub3dbM10sIG5vd1s0XSwgbm93WzVdKSwgJyVIOiVNOiVTJyksCisgICAgICAgICAgICAoJyV5JywgJyUwMmQnICUgKG5vd1swXSUxMDApLCAneWVhciB3aXRob3V0IGNlbnR1cnknKSwKKyAgICAgICAgICAgICgnJVknLCAnJWQnICUgbm93WzBdLCAneWVhciB3aXRoIGNlbnR1cnknKSwKKyAgICAgICAgICAgICMgJVogc2VlIGJlbG93CisgICAgICAgICAgICAoJyUlJywgJyUnLCAnc2luZ2xlIHBlcmNlbnQgc2lnbicpLAorICAgICAgICApCisKKyAgICAgICAgZm9yIGUgaW4gZXhwZWN0YXRpb25zOgorICAgICAgICAgICAgIyBtdXNuJ3QgcmFpc2UgYSB2YWx1ZSBlcnJvcgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRpbWUuc3RyZnRpbWUoZVswXSwgbm93KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgic3RyZnRpbWUgJyVzJyBmb3JtYXQgZ2F2ZSBlcnJvcjogJXMiICUgKGVbMF0sIGVycm9yKSkKKyAgICAgICAgICAgIGlmIHJlLm1hdGNoKGVzY2FwZXN0cihlWzFdLCBzZWxmLmFtcG0pLCByZXN1bHQpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBub3QgcmVzdWx0IG9yIHJlc3VsdFswXSA9PSAnJSc6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJzdHJmdGltZSBkb2VzIG5vdCBzdXBwb3J0IHN0YW5kYXJkICclcycgZm9ybWF0ICglcykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICUgKGVbMF0sIGVbMl0pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkNvbmZsaWN0IGZvciAlcyAoJXMpOiBleHBlY3RlZCAlcywgYnV0IGdvdCAlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZVswXSwgZVsyXSwgZVsxXSwgcmVzdWx0KSkKKworICAgIGRlZiBzdHJmdGVzdDIoc2VsZiwgbm93KToKKyAgICAgICAgbm93c2VjcyA9IHN0cihsb25nKG5vdykpWzotMV0KKyAgICAgICAgbm93ID0gc2VsZi5ub3cKKworICAgICAgICBub25zdGFuZGFyZF9leHBlY3RhdGlvbnMgPSAoCisgICAgICAgICMgVGhlc2UgYXJlIHN0YW5kYXJkIGJ1dCBkb24ndCBoYXZlIHByZWRpY3RhYmxlIG91dHB1dAorICAgICAgICAgICAgKCclYycsIGZpeGFzY3RpbWUodGltZS5hc2N0aW1lKG5vdykpLCAnbmVhci1hc2N0aW1lKCkgZm9ybWF0JyksCisgICAgICAgICAgICAoJyV4JywgJyUwMmQvJTAyZC8lMDJkJyAlIChub3dbMV0sIG5vd1syXSwgKG5vd1swXSUxMDApKSwKKyAgICAgICAgICAgICclbS8lZC8leSAlSDolTTolUycpLAorICAgICAgICAgICAgKCclWicsICclcycgJSBzZWxmLnR6LCAndGltZSB6b25lIG5hbWUnKSwKKworICAgICAgICAgICAgIyBUaGVzZSBhcmUgc29tZSBwbGF0Zm9ybSBzcGVjaWZpYyBleHRlbnNpb25zCisgICAgICAgICAgICAoJyVEJywgJyUwMmQvJTAyZC8lMDJkJyAlIChub3dbMV0sIG5vd1syXSwgKG5vd1swXSUxMDApKSwgJ21tL2RkL3l5JyksCisgICAgICAgICAgICAoJyVlJywgJyUyZCcgJSBub3dbMl0sICdkYXkgb2YgbW9udGggYXMgbnVtYmVyLCBibGFuayBwYWRkZWQgKCAwLTMxKScpLAorICAgICAgICAgICAgKCclaCcsIGNhbGVuZGFyLm1vbnRoX2FiYnJbbm93WzFdXSwgJ2FiYnJldmlhdGVkIG1vbnRoIG5hbWUnKSwKKyAgICAgICAgICAgICgnJWsnLCAnJTJkJyAlIG5vd1szXSwgJ2hvdXIsIGJsYW5rIHBhZGRlZCAoIDAtMjMpJyksCisgICAgICAgICAgICAoJyVuJywgJ1xuJywgJ25ld2xpbmUgY2hhcmFjdGVyJyksCisgICAgICAgICAgICAoJyVyJywgJyUwMmQ6JTAyZDolMDJkICVzJyAlIChzZWxmLmNsb2NrMTIsIG5vd1s0XSwgbm93WzVdLCBzZWxmLmFtcG0pLAorICAgICAgICAgICAgJyVJOiVNOiVTICVwJyksCisgICAgICAgICAgICAoJyVSJywgJyUwMmQ6JTAyZCcgJSAobm93WzNdLCBub3dbNF0pLCAnJUg6JU0nKSwKKyAgICAgICAgICAgICgnJXMnLCBub3dzZWNzLCAnc2Vjb25kcyBzaW5jZSB0aGUgRXBvY2ggaW4gVUNUJyksCisgICAgICAgICAgICAoJyV0JywgJ1x0JywgJ3RhYiBjaGFyYWN0ZXInKSwKKyAgICAgICAgICAgICgnJVQnLCAnJTAyZDolMDJkOiUwMmQnICUgKG5vd1szXSwgbm93WzRdLCBub3dbNV0pLCAnJUg6JU06JVMnKSwKKyAgICAgICAgICAgICgnJTN5JywgJyUwM2QnICUgKG5vd1swXSUxMDApLAorICAgICAgICAgICAgJ3llYXIgd2l0aG91dCBjZW50dXJ5IHJlbmRlcmVkIHVzaW5nIGZpZWxkd2lkdGgnKSwKKyAgICAgICAgKQorCisgICAgICAgIGZvciBlIGluIG5vbnN0YW5kYXJkX2V4cGVjdGF0aW9uczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0aW1lLnN0cmZ0aW1lKGVbMF0sIG5vdykKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCByZXN1bHQ6CisgICAgICAgICAgICAgICAgbXNnID0gIkVycm9yIGZvciBub25zdGFuZGFyZCAnJXMnIGZvcm1hdCAoJXMpOiAlcyIgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKGVbMF0sIGVbMl0sIHN0cihyZXN1bHQpKQorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCBtc2cKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiByZS5tYXRjaChlc2NhcGVzdHIoZVsxXSwgc2VsZi5hbXBtKSwgcmVzdWx0KToKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIlN1cHBvcnRzIG5vbnN0YW5kYXJkICclcycgZm9ybWF0ICglcykiICUgKGVbMF0sIGVbMl0pCisgICAgICAgICAgICBlbGlmIG5vdCByZXN1bHQgb3IgcmVzdWx0WzBdID09ICclJzoKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkRvZXMgbm90IGFwcGVhciB0byBzdXBwb3J0ICclcycgZm9ybWF0ICglcykiICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVbMF0sIGVbMl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiQ29uZmxpY3QgZm9yIG5vbnN0YW5kYXJkICclcycgZm9ybWF0ICglcyk6IiAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChlWzBdLCBlWzJdKQorICAgICAgICAgICAgICAgICAgICBwcmludCAiICBFeHBlY3RlZCAlcywgYnV0IGdvdCAlcyIgJSAoZVsxXSwgcmVzdWx0KQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJmdGltZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzIyNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyZnRpbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmZ0aW1lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzIyNTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyZnRpbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDA3YjkxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5CkBAIC0wLDAgKzEsMjE3IEBACitpbXBvcnQgdW5pdHRlc3QsIHN0cmluZworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQsIHN0cmluZ190ZXN0cworZnJvbSBVc2VyTGlzdCBpbXBvcnQgVXNlckxpc3QKKworY2xhc3MgU3RyaW5nVGVzdCgKKyAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdCwKKyAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJTdHJpbmdVc2VyU3RyaW5nVGVzdAorICAgICk6CisKKyAgICB0eXBlMnRlc3QgPSBzdHIKKworICAgIGRlZiBjaGVja2VxdWFsKHNlbGYsIHJlc3VsdCwgb2JqZWN0LCBtZXRob2RuYW1lLCAqYXJncyk6CisgICAgICAgIHJlYWxyZXN1bHQgPSBnZXRhdHRyKHN0cmluZywgbWV0aG9kbmFtZSkob2JqZWN0LCAqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHJlc3VsdCwKKyAgICAgICAgICAgIHJlYWxyZXN1bHQKKyAgICAgICAgKQorCisgICAgZGVmIGNoZWNrcmFpc2VzKHNlbGYsIGV4Yywgb2JqZWN0LCBtZXRob2RuYW1lLCAqYXJncyk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgZXhjLAorICAgICAgICAgICAgZ2V0YXR0cihzdHJpbmcsIG1ldGhvZG5hbWUpLAorICAgICAgICAgICAgb2JqZWN0LAorICAgICAgICAgICAgKmFyZ3MKKyAgICAgICAgKQorCisgICAgZGVmIGNoZWNrY2FsbChzZWxmLCBvYmplY3QsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgZ2V0YXR0cihzdHJpbmcsIG1ldGhvZG5hbWUpKG9iamVjdCwgKmFyZ3MpCisKKyAgICBkZWYgdGVzdF9qb2luKHNlbGYpOgorICAgICAgICAjIFRoZXNlIGFyZSB0aGUgc2FtZSBjaGVja3MgYXMgaW4gc3RyaW5nX3Rlc3QuT2JqZWN0VGVzdC50ZXN0X2pvaW4KKyAgICAgICAgIyBidXQgdGhlIGFyZ3VtZW50IG9yZGVyIGlzdCBkaWZmZXJlbnQKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhIGIgYyBkJywgWydhJywgJ2InLCAnYycsICdkJ10sICdqb2luJywgJyAnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY2QnLCAoJ2EnLCAnYicsICdjJywgJ2QnKSwgJ2pvaW4nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd3IHggeSB6Jywgc3RyaW5nX3Rlc3RzLlNlcXVlbmNlKCksICdqb2luJywgJyAnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiYycsICgnYWJjJywpLCAnam9pbicsICdhJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd6JywgVXNlckxpc3QoWyd6J10pLCAnam9pbicsICdhJykKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCdhLmIuYycpLCBbJ2EnLCAnYicsICdjJ10sICdqb2luJywgdW5pY29kZSgnLicpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHVuaWNvZGUoJ2EuYi5jJyksIFt1bmljb2RlKCdhJyksICdiJywgJ2MnXSwgJ2pvaW4nLCAnLicpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwodW5pY29kZSgnYS5iLmMnKSwgWydhJywgdW5pY29kZSgnYicpLCAnYyddLCAnam9pbicsICcuJykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1bmljb2RlKCdhLmIuYycpLCBbJ2EnLCAnYicsIHVuaWNvZGUoJ2MnKV0sICdqb2luJywgJy4nKQorICAgICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsIFsnYScsIHVuaWNvZGUoJ2InKSwgM10sICdqb2luJywgJy4nKQorICAgICAgICBmb3IgaSBpbiBbNSwgMjUsIDEyNV06CisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWwoCisgICAgICAgICAgICAgICAgKCgoJ2EnICogaSkgKyAnLScpICogaSlbOi0xXSwKKyAgICAgICAgICAgICAgICBbJ2EnICogaV0gKiBpLCAnam9pbicsICctJykKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgKKyAgICAgICAgICAgICAgICAoKCgnYScgKiBpKSArICctJykgKiBpKVs6LTFdLAorICAgICAgICAgICAgICAgICgnYScgKiBpLCkgKiBpLCAnam9pbicsICctJykKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgc3RyaW5nX3Rlc3RzLkJhZFNlcTEoKSwgJ2pvaW4nLCAnICcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYSBiIGMnLCBzdHJpbmdfdGVzdHMuQmFkU2VxMigpLCAnam9pbicsICcgJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICB5aWVsZCA0ICsgIiIKKyAgICAgICAgICAgIHNlbGYuZml4dHlwZSgnICcpLmpvaW4oZigpKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgaWYgJysnIG5vdCBpbiBzdHIoZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdqb2luKCkgYXRlIGV4Y2VwdGlvbiBtZXNzYWdlJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZXhjZXB0aW9uIG5vdCByYWlzZWQnKQorCisKKworCitjbGFzcyBNb2R1bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2F0dHJzKHNlbGYpOgorICAgICAgICBzdHJpbmcud2hpdGVzcGFjZQorICAgICAgICBzdHJpbmcubG93ZXJjYXNlCisgICAgICAgIHN0cmluZy51cHBlcmNhc2UKKyAgICAgICAgc3RyaW5nLmxldHRlcnMKKyAgICAgICAgc3RyaW5nLmRpZ2l0cworICAgICAgICBzdHJpbmcuaGV4ZGlnaXRzCisgICAgICAgIHN0cmluZy5vY3RkaWdpdHMKKyAgICAgICAgc3RyaW5nLnB1bmN0dWF0aW9uCisgICAgICAgIHN0cmluZy5wcmludGFibGUKKworICAgIGRlZiB0ZXN0X2F0b2koc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmF0b2koIiAxICIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcuYXRvaSwgIiAxeCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cmluZy5hdG9pLCAiIHgxICIpCisKKyAgICBkZWYgdGVzdF9hdG9sKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZy5hdG9sKCIgIDEgICIpLCAxTCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3RyaW5nLmF0b2wsICIgIDF4ICIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cmluZy5hdG9sLCAiICB4MSAiKQorCisgICAgZGVmIHRlc3RfYXRvZihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzdHJpbmcuYXRvZigiICAxICAiKSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcuYXRvZiwgIiAgMXggIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3RyaW5nLmF0b2YsICIgIHgxICIpCisKKyAgICBkZWYgdGVzdF9tYWtldHJhbnMoc2VsZik6CisgICAgICAgIHRyYW5zdGFibGUgPSAnXDAwMFwwMDFcMDAyXDAwM1wwMDRcMDA1XDAwNlwwMDdcMDEwXDAxMVwwMTJcMDEzXDAxNFwwMTVcMDE2XDAxN1wwMjBcMDIxXDAyMlwwMjNcMDI0XDAyNVwwMjZcMDI3XDAzMFwwMzFcMDMyXDAzM1wwMzRcMDM1XDAzNlwwMzcgISIjJCUmXCcoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9geHl6ZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXp7fH1+XDE3N1wyMDBcMjAxXDIwMlwyMDNcMjA0XDIwNVwyMDZcMjA3XDIxMFwyMTFcMjEyXDIxM1wyMTRcMjE1XDIxNlwyMTdcMjIwXDIyMVwyMjJcMjIzXDIyNFwyMjVcMjI2XDIyN1wyMzBcMjMxXDIzMlwyMzNcMjM0XDIzNVwyMzZcMjM3XDI0MFwyNDFcMjQyXDI0M1wyNDRcMjQ1XDI0NlwyNDdcMjUwXDI1MVwyNTJcMjUzXDI1NFwyNTVcMjU2XDI1N1wyNjBcMjYxXDI2MlwyNjNcMjY0XDI2NVwyNjZcMjY3XDI3MFwyNzFcMjcyXDI3M1wyNzRcMjc1XDI3NlwyNzdcMzAwXDMwMVwzMDJcMzAzXDMwNFwzMDVcMzA2XDMwN1wzMTBcMzExXDMxMlwzMTNcMzE0XDMxNVwzMTZcMzE3XDMyMFwzMjFcMzIyXDMyM1wzMjRcMzI1XDMyNlwzMjdcMzMwXDMzMVwzMzJcMzMzXDMzNFwzMzVcMzM2XDMzN1wzNDBcMzQxXDM0MlwzNDNcMzQ0XDM0NVwzNDZcMzQ3XDM1MFwzNTFcMzUyXDM1M1wzNTRcMzU1XDM1NlwzNTdcMzYwXDM2MVwzNjJcMzYzXDM2NFwzNjVcMzY2XDM2N1wzNzBcMzcxXDM3MlwzNzNcMzc0XDM3NVwzNzZcMzc3JworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLm1ha2V0cmFucygnYWJjJywgJ3h5eicpLCB0cmFuc3RhYmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJpbmcubWFrZXRyYW5zLCAnYWJjJywgJ3h5enEnKQorCisgICAgZGVmIHRlc3RfY2Fwd29yZHMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdhYmMgZGVmIGdoaScpLCAnQWJjIERlZiBHaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZy5jYXB3b3JkcygnYWJjXHRkZWZcbmdoaScpLCAnQWJjIERlZiBHaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZy5jYXB3b3JkcygnYWJjXHQgICBkZWYgIFxuZ2hpJyksICdBYmMgRGVmIEdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdBQkMgREVGIEdISScpLCAnQWJjIERlZiBHaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZy5jYXB3b3JkcygnQUJDLURFRi1HSEknLCAnLScpLCAnQWJjLURlZi1HaGknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZy5jYXB3b3JkcygnQUJDLWRlZiBERUYtZ2hpIEdISScpLCAnQWJjLWRlZiBEZWYtZ2hpIEdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCcgICBhQmMgIERlRiAgICcpLCAnQWJjIERlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nLmNhcHdvcmRzKCdcdGFCY1x0RGVGXHQnKSwgJ0FiYyBEZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZy5jYXB3b3JkcygnXHRhQmNcdERlRlx0JywgJ1x0JyksICdcdEFiY1x0RGVmXHQnKQorCisgICAgZGVmIHRlc3RfZm9ybWF0dGVyKHNlbGYpOgorICAgICAgICBmbXQgPSBzdHJpbmcuRm9ybWF0dGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQuZm9ybWF0KCJmb28iKSwgImZvbyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQuZm9ybWF0KCJmb297MH0iLCAiYmFyIiksICJmb29iYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoImZvb3sxfXswfS17MX0iLCAiYmFyIiwgNiksICJmb282YmFyLTYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoIi17YXJnIXJ9LSIsIGFyZz0ndGVzdCcpLCAiLSd0ZXN0Jy0iKQorCisgICAgICAgICMgb3ZlcnJpZGUgZ2V0X3ZhbHVlICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIGNsYXNzIE5hbWVzcGFjZUZvcm1hdHRlcihzdHJpbmcuRm9ybWF0dGVyKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2U9e30pOgorICAgICAgICAgICAgICAgIHN0cmluZy5Gb3JtYXR0ZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWVzcGFjZSA9IG5hbWVzcGFjZQorCisgICAgICAgICAgICBkZWYgZ2V0X3ZhbHVlKHNlbGYsIGtleSwgYXJncywga3dkcyk6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShrZXksIHN0cik6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgZXhwbGljaXRseSBwYXNzZWQgYXJndW1lbnRzIGZpcnN0CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ga3dkc1trZXldCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLm5hbWVzcGFjZVtrZXldCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nLkZvcm1hdHRlci5nZXRfdmFsdWUoa2V5LCBhcmdzLCBrd2RzKQorCisgICAgICAgIGZtdCA9IE5hbWVzcGFjZUZvcm1hdHRlcih7J2dyZWV0aW5nJzonaGVsbG8nfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQuZm9ybWF0KCJ7Z3JlZXRpbmd9LCB3b3JsZCEiKSwgJ2hlbGxvLCB3b3JsZCEnKQorCisKKyAgICAgICAgIyBvdmVycmlkZSBmb3JtYXRfZmllbGQgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgY2xhc3MgQ2FsbEZvcm1hdHRlcihzdHJpbmcuRm9ybWF0dGVyKToKKyAgICAgICAgICAgIGRlZiBmb3JtYXRfZmllbGQoc2VsZiwgdmFsdWUsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KHZhbHVlKCksIGZvcm1hdF9zcGVjKQorCisgICAgICAgIGZtdCA9IENhbGxGb3JtYXR0ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoJyp7MH0qJywgbGFtYmRhIDogJ3Jlc3VsdCcpLCAnKnJlc3VsdConKQorCisKKyAgICAgICAgIyBvdmVycmlkZSBjb252ZXJ0X2ZpZWxkICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAgICAgY2xhc3MgWEZvcm1hdHRlcihzdHJpbmcuRm9ybWF0dGVyKToKKyAgICAgICAgICAgIGRlZiBjb252ZXJ0X2ZpZWxkKHNlbGYsIHZhbHVlLCBjb252ZXJzaW9uKToKKyAgICAgICAgICAgICAgICBpZiBjb252ZXJzaW9uID09ICd4JzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoWEZvcm1hdHRlciwgc2VsZikuY29udmVydF9maWVsZCh2YWx1ZSwgY29udmVyc2lvbikKKworICAgICAgICBmbXQgPSBYRm9ybWF0dGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbXQuZm9ybWF0KCJ7MCFyfTp7MCF4fSIsICdmb28nLCAnZm9vJyksICInZm9vJzpOb25lIikKKworCisgICAgICAgICMgb3ZlcnJpZGUgcGFyc2UgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgICAgIGNsYXNzIEJhckZvcm1hdHRlcihzdHJpbmcuRm9ybWF0dGVyKToKKyAgICAgICAgICAgICMgcmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IGNvbnRhaW5zIHR1cGxlcyBvZiB0aGUgZm9ybToKKyAgICAgICAgICAgICMgKGxpdGVyYWxfdGV4dCwgZmllbGRfbmFtZSwgZm9ybWF0X3NwZWMsIGNvbnZlcnNpb24pCisgICAgICAgICAgICBkZWYgcGFyc2Uoc2VsZiwgZm9ybWF0X3N0cmluZyk6CisgICAgICAgICAgICAgICAgZm9yIGZpZWxkIGluIGZvcm1hdF9zdHJpbmcuc3BsaXQoJ3wnKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZmllbGRbMF0gPT0gJysnOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBpdCdzIG1hcmt1cAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbmFtZSwgXywgZm9ybWF0X3NwZWMgPSBmaWVsZFsxOl0ucGFydGl0aW9uKCc6JykKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkICcnLCBmaWVsZF9uYW1lLCBmb3JtYXRfc3BlYywgTm9uZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZmllbGQsIE5vbmUsIE5vbmUsIE5vbmUKKworICAgICAgICBmbXQgPSBCYXJGb3JtYXR0ZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoJyp8KzA6XjEwc3wqJywgJ2ZvbycpLCAnKiAgIGZvbyAgICAqJykKKworICAgICAgICAjIHRlc3QgYWxsIHBhcmFtZXRlcnMgdXNlZAorICAgICAgICBjbGFzcyBDaGVja0FsbFVzZWRGb3JtYXR0ZXIoc3RyaW5nLkZvcm1hdHRlcik6CisgICAgICAgICAgICBkZWYgY2hlY2tfdW51c2VkX2FyZ3Moc2VsZiwgdXNlZF9hcmdzLCBhcmdzLCBrd2FyZ3MpOgorICAgICAgICAgICAgICAgICMgVHJhY2sgd2hpY2ggYXJndW1lbnRzIGFjdHVhbGx5IGdvdCB1c2VkCisgICAgICAgICAgICAgICAgdW51c2VkX2FyZ3MgPSBzZXQoa3dhcmdzLmtleXMoKSkKKyAgICAgICAgICAgICAgICB1bnVzZWRfYXJncy51cGRhdGUocmFuZ2UoMCwgbGVuKGFyZ3MpKSkKKworICAgICAgICAgICAgICAgIGZvciBhcmcgaW4gdXNlZF9hcmdzOgorICAgICAgICAgICAgICAgICAgICB1bnVzZWRfYXJncy5yZW1vdmUoYXJnKQorCisgICAgICAgICAgICAgICAgaWYgdW51c2VkX2FyZ3M6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVudXNlZCBhcmd1bWVudHMiKQorCisgICAgICAgIGZtdCA9IENoZWNrQWxsVXNlZEZvcm1hdHRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10LmZvcm1hdCgiezB9IiwgMTApLCAiMTAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZtdC5mb3JtYXQoInswfXtpfSIsIDEwLCBpPTEwMCksICIxMDEwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm10LmZvcm1hdCgiezB9e2l9ezF9IiwgMTAsIDIwLCBpPTEwMCksICIxMDEwMDIwIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm10LmZvcm1hdCwgInswfXtpfXsxfSIsIDEwLCAyMCwgaT0xMDAsIGo9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm10LmZvcm1hdCwgInswfSIsIDEwLCAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm10LmZvcm1hdCwgInswfSIsIDEwLCAyMCwgaT0xMDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZtdC5mb3JtYXQsICJ7aX0iLCAxMCwgMjAsIGk9MTAwKQorCisgICAgICAgICMgQWx0ZXJuYXRlIGZvcm1hdHRpbmcgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsICcnLCAnIycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgJycsICcjMjAnKQorCitjbGFzcyBCeXRlc0FsaWFzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9idWlsdGluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyIGlzIGJ5dGVzKQorCisgICAgZGVmIHRlc3Rfc3ludGF4KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIic3BhbSIsICJzcGFtIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiciJlZ2dcZm9vIiwgImVnZ1xcZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYiIiKSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiciIiKSwgc3RyKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJpbmdUZXN0LCBNb2R1bGVUZXN0LCBCeXRlc0FsaWFzVGVzdCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyZjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5nLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyZjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViZGY4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkKQEAgLTAsMCArMSw5NiBAQAorIyBUbyBmdWxseSB0ZXN0IHRoaXMgbW9kdWxlLCB3ZSB3b3VsZCBuZWVkIGEgY29weSBvZiB0aGUgc3RyaW5ncHJlcCB0YWJsZXMuCisjIFNpbmNlIHdlIGRvbid0IGhhdmUgdGhlbSwgdGhpcyB0ZXN0IGNoZWNrcyBvbmx5IGEgZmV3IGNvZGVwb2ludHMuCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworZnJvbSBzdHJpbmdwcmVwIGltcG9ydCAqCisKK2NsYXNzIFN0cmluZ3ByZXBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9hMSh1Ilx1MDIyMSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2ExKHUiXHUwMjIyIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2IxKHUiXHUwMGFkIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYjEodSJcdTAwYWUiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUobWFwX3RhYmxlX2IyKHUiXHUwMDQxIiksIHUiXHUwMDYxIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hcF90YWJsZV9iMih1Ilx1MDA2MSIpLCB1Ilx1MDA2MSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hcF90YWJsZV9iMyh1Ilx1MDA0MSIpLCB1Ilx1MDA2MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXBfdGFibGVfYjModSJcdTAwNjEiKSwgdSJcdTAwNjEiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMTEodSJcdTAwMjAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMTEodSJcdTAwMjEiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzEyKHUiXHUwMGEwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzEyKHUiXHUwMGExIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MxMih1Ilx1MDBhMCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MxMih1Ilx1MDBhMSIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMTFfYzEyKHUiXHUwMGEwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzExX2MxMih1Ilx1MDBhMSIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMjEodSJcdTAwMWYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMjEodSJcdTAwMjAiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzIyKHUiXHUwMDlmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzIyKHUiXHUwMGEwIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MyMV9jMjIodSJcdTAwOWYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMjFfYzIyKHUiXHUwMGEwIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MzKHUiXHVlMDAwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzModSJcdWY5MDAiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzQodSJcdWZmZmYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jNCh1Ilx1MDAwMCIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jNSh1Ilx1ZDgwMCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2M1KHUiXHVkN2ZmIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2M2KHUiXHVmZmY5IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzYodSJcdWZmZmUiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzcodSJcdTJmZjAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jNyh1Ilx1MmZmYyIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jOCh1Ilx1MDM0MCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2M4KHUiXHUwMzQyIikpCisKKyAgICAgICAgIyBDLjkgaXMgbm90IGluIHRoZSBibXAKKyAgICAgICAgIyBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzkodSJcVTAwMEUwMDAxIikpCisgICAgICAgICMgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jOCh1IlxVMDAwRTAwMDIiKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfZDEodSJcdTA1YmUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9kMSh1Ilx1MDViZiIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9kMih1Ilx1MDA0MSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2QyKHUiXHUwMDQwIikpCisKKyAgICAgICAgIyBUaGlzIHdvdWxkIGdlbmVyYXRlIGEgaGFzaCBvZiBhbGwgcHJlZGljYXRlcy4gSG93ZXZlciwgcnVubmluZworICAgICAgICAjIGl0IGlzIHF1aXRlIGV4cGVuc2l2ZSwgYW5kIG9ubHkgc2VydmVzIHRvIGRldGVjdCBjaGFuZ2VzIGluIHRoZQorICAgICAgICAjIHVuaWNvZGUgZGF0YWJhc2UuIEluc3RlYWQsIHN0cmluZ3ByZXAucHkgYXNzZXJ0cyB0aGUgdmVyc2lvbiBvZgorICAgICAgICAjIHRoZSBkYXRhYmFzZS4KKworICAgICAgICAjIGltcG9ydCBoYXNobGliCisgICAgICAgICMgcHJlZGljYXRlcyA9IFtrIGZvciBrIGluIGRpcihzdHJpbmdwcmVwKSBpZiBrLnN0YXJ0c3dpdGgoImluX3RhYmxlIildCisgICAgICAgICMgcHJlZGljYXRlcy5zb3J0KCkKKyAgICAgICAgIyBmb3IgcCBpbiBwcmVkaWNhdGVzOgorICAgICAgICAjICAgICBmID0gZ2V0YXR0cihzdHJpbmdwcmVwLCBwKQorICAgICAgICAjICAgICAjIENvbGxlY3QgYWxsIEJNUCBjb2RlIHBvaW50cworICAgICAgICAjICAgICBkYXRhID0gWyIwIl0gKiAweDEwMDAwCisgICAgICAgICMgICAgIGZvciBpIGluIHJhbmdlKDB4MTAwMDApOgorICAgICAgICAjICAgICAgICAgaWYgZih1bmljaHIoaSkpOgorICAgICAgICAjICAgICAgICAgICAgIGRhdGFbaV0gPSAiMSIKKyAgICAgICAgIyAgICAgZGF0YSA9ICIiLmpvaW4oZGF0YSkKKyAgICAgICAgIyAgICAgaCA9IGhhc2hsaWIuc2hhMSgpCisgICAgICAgICMgICAgIGgudXBkYXRlKGRhdGEpCisgICAgICAgICMgICAgIHByaW50IHAsIGguaGV4ZGlnZXN0KCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RyaW5ncHJlcFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTM3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OTM3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJvcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjZTI5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJvcC5weQpAQCAtMCwwICsxLDE1MyBAQAoraW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInN0cm9wIGZ1bmN0aW9ucyBhcmUgb2Jzb2xldGU7IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHIndGVzdC50ZXN0X3N0cm9wfHVuaXR0ZXN0JykKK2ltcG9ydCBzdHJvcAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisKK2NsYXNzIFN0cm9wRnVuY3Rpb25UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hdG9pKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuYXRvaSgiIDEgIikgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvaSwgIiAxeCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2ksICIgeDEgIikKKworICAgIGRlZiB0ZXN0X2F0b2woc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5hdG9sKCIgMSAiKSA9PSAxTCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvbCwgIiAxeCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2wsICIgeDEgIikKKworICAgIGRlZiB0ZXN0X2F0b2Yoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5hdG9mKCIgMSAiKSA9PSAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2YsICIgMXgiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9mLCAiIHgxICIpCisKKyAgICBkZWYgdGVzdF9jYXBpdGFsaXplKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuY2FwaXRhbGl6ZSgiIGhlbGxvICIpID09ICIgaGVsbG8gIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmNhcGl0YWxpemUoImhlbGxvICIpID09ICJIZWxsbyAiKQorCisgICAgZGVmIHRlc3RfZmluZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmZpbmQoImFiY2RlZmdoaWFiYyIsICJhYmMiKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuZmluZCgiYWJjZGVmZ2hpYWJjIiwgImFiYyIsIDEpID09IDkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5maW5kKCJhYmNkZWZnaGlhYmMiLCAiZGVmIiwgNCkgPT0gLTEpCisKKyAgICBkZWYgdGVzdF9yZmluZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnJmaW5kKCJhYmNkZWZnaGlhYmMiLCAiYWJjIikgPT0gOSkKKworICAgIGRlZiB0ZXN0X2xvd2VyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AubG93ZXIoIkhlTExvIikgPT0gImhlbGxvIikKKworICAgIGRlZiB0ZXN0X3VwcGVyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AudXBwZXIoIkhlTExvIikgPT0gIkhFTExPIikKKworICAgIGRlZiB0ZXN0X3N3YXBjYXNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auc3dhcGNhc2UoIkhlTExvIGNPbXBVdGVScyIpID09ICJoRWxsTyBDb01QdVRFclMiKQorCisgICAgZGVmIHRlc3Rfc3RyaXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5zdHJpcCgiIFx0XG4gaGVsbG8gXHRcbiAiKSA9PSAiaGVsbG8iKQorCisgICAgZGVmIHRlc3RfbHN0cmlwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AubHN0cmlwKCIgXHRcbiBoZWxsbyBcdFxuICIpID09ICJoZWxsbyBcdFxuICIpCisKKyAgICBkZWYgdGVzdF9yc3RyaXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5yc3RyaXAoIiBcdFxuIGhlbGxvIFx0XG4gIikgPT0gIiBcdFxuIGhlbGxvIikKKworICAgIGRlZiB0ZXN0X3JlcGxhY2Uoc2VsZik6CisgICAgICAgIHJlcGxhY2UgPSBzdHJvcC5yZXBsYWNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAxKQorICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d28hdGhyZWUhIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDIpCisgICAgICAgICAgICAgICAgICAgICA9PSAib25lQHR3b0B0aHJlZSEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgMykKKyAgICAgICAgICAgICAgICAgICAgID09ICJvbmVAdHdvQHRocmVlQCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCA0KQorICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKKworICAgICAgICAjIENBVVRJT046IGEgcmVwbGFjZSBjb3VudCBvZiAwIG1lYW5zIGluZmluaXR5IG9ubHkgdG8gc3Ryb3AsCisgICAgICAgICMgbm90IHRvIHRoZSBzdHJpbmcgLnJlcGxhY2UoKSBtZXRob2Qgb3IgdG8gdGhlCisgICAgICAgICMgc3RyaW5nLnJlcGxhY2UoKSBmdW5jdGlvbi4KKworICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgMCkKKyAgICAgICAgICAgICAgICAgICAgID09ICJvbmVAdHdvQHRocmVlQCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnKQorICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJ3gnLCAnQCcpCisgICAgICAgICAgICAgICAgICAgICA9PSAib25lIXR3byF0aHJlZSEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAneCcsICdAJywgMikKKyAgICAgICAgICAgICAgICAgICAgID09ICJvbmUhdHdvIXRocmVlISIpCisKKyAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKKyAgICAgICAgc3BsaXQgPSBzdHJvcC5zcGxpdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoInRoaXMgaXMgdGhlIHNwbGl0IGZ1bmN0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgID09IFsndGhpcycsICdpcycsICd0aGUnLCAnc3BsaXQnLCAnZnVuY3Rpb24nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhfGJ8Y3xkIiwgJ3wnKSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhfGJ8Y3xkIiwgJ3wnLCAyKSA9PSBbJ2EnLCAnYicsICdjfGQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMSkgPT0gWydhJywgJ2IgYyBkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDIpID09IFsnYScsICdiJywgJ2MgZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgYiBjIGQiLCBOb25lLCAzKSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgNCkgPT0gWydhJywgJ2InLCAnYycsICdkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDApID09IFsnYScsICdiJywgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgIGIgIGMgIGQiLCBOb25lLCAyKSA9PSAgWydhJywgJ2InLCAnYyAgZCddKQorCisgICAgZGVmIHRlc3Rfam9pbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmpvaW4oWydhJywgJ2InLCAnYycsICdkJ10pID09ICdhIGIgYyBkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmpvaW4oKCdhJywgJ2InLCAnYycsICdkJyksICcnKSA9PSAnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5qb2luKFNlcXVlbmNlKCkpID09ICd3IHggeSB6JykKKworICAgICAgICAjIHRyeSBhIGZldyBsb25nIG9uZXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmpvaW4oWyd4JyAqIDEwMF0gKiAxMDAsICc6JykKKyAgICAgICAgICAgICAgICAgICAgID09ICgoJ3gnICogMTAwKSArICI6IikgKiA5OSArICJ4IiAqIDEwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmpvaW4oKCd4JyAqIDEwMCwpICogMTAwLCAnOicpCisgICAgICAgICAgICAgICAgICAgICA9PSAoKCd4JyAqIDEwMCkgKyAiOiIpICogOTkgKyAieCIgKiAxMDApCisKKyAgICBkZWYgdGVzdF9tYWtldHJhbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5tYWtldHJhbnMoImFiYyIsICJ4eXoiKSA9PSB0cmFuc3RhYmxlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5tYWtldHJhbnMsICJhYmMiLCAieHl6cSIpCisKKyAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC50cmFuc2xhdGUoInh5emFiY2RlZiIsIHRyYW5zdGFibGUsICJkZWYiKQorICAgICAgICAgICAgICAgICAgICAgPT0gInh5enh5eiIpCisKKyAgICBkZWYgdGVzdF9kYXRhX2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHN0cm9wLmxvd2VyY2FzZQorICAgICAgICBzdHJvcC51cHBlcmNhc2UKKyAgICAgICAgc3Ryb3Aud2hpdGVzcGFjZQorCisgICAgQHRlc3Rfc3VwcG9ydC5wcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9dGVzdF9zdXBwb3J0Ll8yRyAtIDEsIG1lbXVzZT01KQorICAgIGRlZiB0ZXN0X3N0cm9wam9pbl9odWdlX2xpc3Qoc2VsZiwgc2l6ZSk6CisgICAgICAgIGEgPSAiQSIgKiBzaXplCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHIgPSBzdHJvcC5qb2luKFthLCBhXSwgYSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyKSwgbGVuKGEpICogMykKKworICAgIEB0ZXN0X3N1cHBvcnQucHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPXRlc3Rfc3VwcG9ydC5fMkcgLSAxLCBtZW11c2U9MSkKKyAgICBkZWYgdGVzdF9zdHJvcGpvaW5faHVnZV90dXAoc2VsZiwgc2l6ZSk6CisgICAgICAgIGEgPSAiQSIgKiBzaXplCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHIgPSBzdHJvcC5qb2luKChhLCBhKSwgYSkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHIpLCBsZW4oYSkgKiAzKQorCit0cmFuc3RhYmxlID0gJ1wwMDBcMDAxXDAwMlwwMDNcMDA0XDAwNVwwMDZcMDA3XDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1XDAxNlwwMTdcMDIwXDAyMVwwMjJcMDIzXDAyNFwwMjVcMDI2XDAyN1wwMzBcMDMxXDAzMlwwMzNcMDM0XDAzNVwwMzZcMDM3ICEiIyQlJlwnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xcXV5fYHh5emRlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9flwxNzdcMjAwXDIwMVwyMDJcMjAzXDIwNFwyMDVcMjA2XDIwN1wyMTBcMjExXDIxMlwyMTNcMjE0XDIxNVwyMTZcMjE3XDIyMFwyMjFcMjIyXDIyM1wyMjRcMjI1XDIyNlwyMjdcMjMwXDIzMVwyMzJcMjMzXDIzNFwyMzVcMjM2XDIzN1wyNDBcMjQxXDI0MlwyNDNcMjQ0XDI0NVwyNDZcMjQ3XDI1MFwyNTFcMjUyXDI1M1wyNTRcMjU1XDI1NlwyNTdcMjYwXDI2MVwyNjJcMjYzXDI2NFwyNjVcMjY2XDI2N1wyNzBcMjcxXDI3MlwyNzNcMjc0XDI3NVwyNzZcMjc3XDMwMFwzMDFcMzAyXDMwM1wzMDRcMzA1XDMwNlwzMDdcMzEwXDMxMVwzMTJcMzEzXDMxNFwzMTVcMzE2XDMxN1wzMjBcMzIxXDMyMlwzMjNcMzI0XDMyNVwzMjZcMzI3XDMzMFwzMzFcMzMyXDMzM1wzMzRcMzM1XDMzNlwzMzdcMzQwXDM0MVwzNDJcMzQzXDM0NFwzNDVcMzQ2XDM0N1wzNTBcMzUxXDM1MlwzNTNcMzU0XDM1NVwzNTZcMzU3XDM2MFwzNjFcMzYyXDM2M1wzNjRcMzY1XDM2NlwzNjdcMzcwXDM3MVwzNzJcMzczXDM3NFwzNzVcMzc2XDM3NycKKworCisjIGpvaW4oKSBub3cgd29ya3Mgd2l0aCBhbnkgc2VxdWVuY2UgdHlwZS4KK2NsYXNzIFNlcXVlbmNlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKTogc2VsZi5zZXEgPSAnd3h5eicKKyAgICBkZWYgX19sZW5fXyhzZWxmKTogcmV0dXJuIGxlbihzZWxmLnNlcSkKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6IHJldHVybiBzZWxmLnNlcVtpXQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN0cm9wRnVuY3Rpb25UZXN0Q2FzZSkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJvcC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJvcC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2MTQzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJvcC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJvcC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY2MTQzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cm9wLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJwdGltZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnB0aW1lLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZTQzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJwdGltZS5weQpAQCAtMCwwICsxLDU2NyBAQAorIiIiUHlVbml0IHRlc3RpbmcgYWdhaW5zdCBzdHJwdGltZSIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB0aW1lCitpbXBvcnQgbG9jYWxlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRlIGFzIGRhdGV0aW1lX2RhdGUKKworaW1wb3J0IF9zdHJwdGltZQorCitjbGFzcyBnZXRsYW5nX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IF9nZXRsYW5nIiIiCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoX3N0cnB0aW1lLl9nZXRsYW5nKCksIGxvY2FsZS5nZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUpKQorCitjbGFzcyBMb2NhbGVUaW1lX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgX3N0cnB0aW1lLkxvY2FsZVRpbWUuCisKKyAgICBBbGwgdmFsdWVzIGFyZSBsb3dlci1jYXNlZCB3aGVuIHN0b3JlZCBpbiBMb2NhbGVUaW1lLCBzbyBtYWtlIHN1cmUgdG8KKyAgICBjb21wYXJlIHZhbHVlcyBhZnRlciBydW5uaW5nIGBgbG93ZXJgYCBvbiB0aGVtLgorCisgICAgIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSB0aW1lIHR1cGxlIGJhc2VkIG9uIGN1cnJlbnQgdGltZS4iIiIKKyAgICAgICAgc2VsZi50aW1lX3R1cGxlID0gdGltZS5sb2NhbHRpbWUoKQorICAgICAgICBzZWxmLkxUX2lucyA9IF9zdHJwdGltZS5Mb2NhbGVUaW1lKCkKKworICAgIGRlZiBjb21wYXJlX2FnYWluc3RfdGltZShzZWxmLCB0ZXN0aW5nLCBkaXJlY3RpdmUsIHR1cGxlX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9tc2cpOgorICAgICAgICAiIiJIZWxwZXIgbWV0aG9kIHRoYXQgdGVzdHMgdGVzdGluZyBhZ2FpbnN0IGRpcmVjdGl2ZSBiYXNlZCBvbiB0aGUKKyAgICAgICAgdHVwbGVfcG9zaXRpb24gb2YgdGltZV90dXBsZS4gIFVzZXMgZXJyb3JfbXNnIGFzIGVycm9yIG1lc3NhZ2UuCisKKyAgICAgICAgIiIiCisgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoZGlyZWN0aXZlLCBzZWxmLnRpbWVfdHVwbGUpLmxvd2VyKCkKKyAgICAgICAgY29tcGFyaXNvbiA9IHRlc3Rpbmdbc2VsZi50aW1lX3R1cGxlW3R1cGxlX3Bvc2l0aW9uXV0KKyAgICAgICAgc2VsZi5hc3NlcnRJbihzdHJmdGltZV9vdXRwdXQsIHRlc3RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIiVzOiBub3QgZm91bmQgaW4gdHVwbGUiICUgZXJyb3JfbXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbXBhcmlzb24sIHN0cmZ0aW1lX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXM6IHBvc2l0aW9uIHdpdGhpbiB0dXBsZSBpbmNvcnJlY3Q7ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yX21zZywgY29tcGFyaXNvbiwgc3RyZnRpbWVfb3V0cHV0KSkKKworICAgIGRlZiB0ZXN0X3dlZWtkYXkoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgZnVsbCBhbmQgYWJicmV2aWF0ZWQgd2Vla2RheSBuYW1lcyBhcmUgY29ycmVjdCBpbgorICAgICAgICAjIGJvdGggc3RyaW5nIGFuZCBwb3NpdGlvbiB3aXRoIHR1cGxlCisgICAgICAgIHNlbGYuY29tcGFyZV9hZ2FpbnN0X3RpbWUoc2VsZi5MVF9pbnMuZl93ZWVrZGF5LCAnJUEnLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0aW5nIG9mIGZ1bGwgd2Vla2RheSBuYW1lIGZhaWxlZCIpCisgICAgICAgIHNlbGYuY29tcGFyZV9hZ2FpbnN0X3RpbWUoc2VsZi5MVF9pbnMuYV93ZWVrZGF5LCAnJWEnLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0aW5nIG9mIGFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZSBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfbW9udGgoc2VsZik6CisgICAgICAgICMgVGVzdCBmdWxsIGFuZCBhYmJyZXZpYXRlZCBtb250aCBuYW1lczsgYm90aCBzdHJpbmcgYW5kIHBvc2l0aW9uCisgICAgICAgICMgd2l0aGluIHRoZSB0dXBsZQorICAgICAgICBzZWxmLmNvbXBhcmVfYWdhaW5zdF90aW1lKHNlbGYuTFRfaW5zLmZfbW9udGgsICclQicsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlc3RpbmcgYWdhaW5zdCBmdWxsIG1vbnRoIG5hbWUgZmFpbGVkIikKKyAgICAgICAgc2VsZi5jb21wYXJlX2FnYWluc3RfdGltZShzZWxmLkxUX2lucy5hX21vbnRoLCAnJWInLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0aW5nIGFnYWluc3QgYWJicmV2aWF0ZWQgbW9udGggbmFtZSBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfYW1fcG0oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIEFNL1BNIHJlcHJlc2VudGF0aW9uIGRvbmUgcHJvcGVybHkKKyAgICAgICAgc3RyZnRpbWVfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJXAiLCBzZWxmLnRpbWVfdHVwbGUpLmxvd2VyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzdHJmdGltZV9vdXRwdXQsIHNlbGYuTFRfaW5zLmFtX3BtLAorICAgICAgICAgICAgICAgICAgICAgICJBTS9QTSByZXByZXNlbnRhdGlvbiBub3QgaW4gdHVwbGUiKQorICAgICAgICBpZiBzZWxmLnRpbWVfdHVwbGVbM10gPCAxMjogcG9zaXRpb24gPSAwCisgICAgICAgIGVsc2U6IHBvc2l0aW9uID0gMQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuTFRfaW5zLmFtX3BtW3Bvc2l0aW9uXSwgc3RyZnRpbWVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJBTS9QTSByZXByZXNlbnRhdGlvbiBpbiB0aGUgd3JvbmcgcG9zaXRpb24gd2l0aGluIHRoZSB0dXBsZSIpCisKKyAgICBkZWYgdGVzdF90aW1lem9uZShzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGltZXpvbmUgaXMgY29ycmVjdAorICAgICAgICB0aW1lem9uZSA9IHRpbWUuc3RyZnRpbWUoIiVaIiwgc2VsZi50aW1lX3R1cGxlKS5sb3dlcigpCisgICAgICAgIGlmIHRpbWV6b25lOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWV6b25lIGluIHNlbGYuTFRfaW5zLnRpbWV6b25lWzBdIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXpvbmUgaW4gc2VsZi5MVF9pbnMudGltZXpvbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWV6b25lICVzIG5vdCBmb3VuZCBpbiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lem9uZSwgc2VsZi5MVF9pbnMudGltZXpvbmUpKQorCisgICAgZGVmIHRlc3RfZGF0ZV90aW1lKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgTENfZGF0ZV90aW1lLCBMQ19kYXRlLCBhbmQgTENfdGltZSBhcmUgY29ycmVjdAorICAgICAgICAjIHRoZSBtYWdpYyBkYXRlIGlzIHVzZWQgc28gYXMgdG8gbm90IGhhdmUgaXNzdWVzIHdpdGggJWMgd2hlbiBkYXkgb2YKKyAgICAgICAgIyAgdGhlIG1vbnRoIGlzIGEgc2luZ2xlIGRpZ2l0IGFuZCBoYXMgYSBsZWFkaW5nIHNwYWNlLiAgVGhpcyBpcyBub3QgYW4KKyAgICAgICAgIyAgaXNzdWUgc2luY2Ugc3RycHRpbWUgc3RpbGwgcGFyc2VzIGl0IGNvcnJlY3RseS4gIFRoZSBwcm9ibGVtIGlzCisgICAgICAgICMgIHRlc3RpbmcgdGhlc2UgZGlyZWN0aXZlcyBmb3IgY29ycmVjdG5lc3MgYnkgY29tcGFyaW5nIHN0cmZ0aW1lCisgICAgICAgICMgIG91dHB1dC4KKyAgICAgICAgbWFnaWNfZGF0ZSA9ICgxOTk5LCAzLCAxNywgMjIsIDQ0LCA1NSwgMiwgNzYsIDApCisgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVjIiwgbWFnaWNfZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX2RhdGVfdGltZSwgbWFnaWNfZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWVfb3V0cHV0LCAiTENfZGF0ZV90aW1lIGluY29ycmVjdCIpCisgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiV4IiwgbWFnaWNfZGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX2RhdGUsIG1hZ2ljX2RhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmZ0aW1lX291dHB1dCwgIkxDX2RhdGUgaW5jb3JyZWN0IikKKyAgICAgICAgc3RyZnRpbWVfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJVgiLCBtYWdpY19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfdGltZSwgbWFnaWNfZGF0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWVfb3V0cHV0LCAiTENfdGltZSBpbmNvcnJlY3QiKQorICAgICAgICBMVCA9IF9zdHJwdGltZS5Mb2NhbGVUaW1lKCkKKyAgICAgICAgTFQuYW1fcG0gPSAoJycsICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoTFQuTENfdGltZSwgIkxvY2FsZVRpbWUncyBMQyBkaXJlY3RpdmVzIGNhbm5vdCBoYW5kbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVtcHR5IHN0cmluZ3MiKQorCisgICAgZGVmIHRlc3RfbGFuZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgbGFuZyBpcyBzZXQgdG8gd2hhdCBfZ2V0bGFuZygpIHJldHVybnMKKyAgICAgICAgIyBBc3N1bWluZyBsb2NhbGUgaGFzIG5vdCBjaGFuZ2VkIGJldHdlZW4gbm93IGFuZCB3aGVuIHNlbGYuTFRfaW5zIHdhcyBjcmVhdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5MVF9pbnMubGFuZywgX3N0cnB0aW1lLl9nZXRsYW5nKCkpCisKKworY2xhc3MgVGltZVJFVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBUaW1lUkUuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIkNvbnN0cnVjdCBnZW5lcmljIFRpbWVSRSBvYmplY3QuIiIiCisgICAgICAgIHNlbGYudGltZV9yZSA9IF9zdHJwdGltZS5UaW1lUkUoKQorICAgICAgICBzZWxmLmxvY2FsZV90aW1lID0gX3N0cnB0aW1lLkxvY2FsZVRpbWUoKQorCisgICAgZGVmIHRlc3RfcGF0dGVybihzZWxmKToKKyAgICAgICAgIyBUZXN0IFRpbWVSRS5wYXR0ZXJuCisgICAgICAgIHBhdHRlcm5fc3RyaW5nID0gc2VsZi50aW1lX3JlLnBhdHRlcm4ociIlYSAlQSAlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXR0ZXJuX3N0cmluZy5maW5kKHNlbGYubG9jYWxlX3RpbWUuYV93ZWVrZGF5WzJdKSAhPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IGZpbmQgYWJicmV2aWF0ZWQgd2Vla2RheSBpbiBwYXR0ZXJuIHN0cmluZyAnJXMnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXR0ZXJuX3N0cmluZy5maW5kKHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5WzRdKSAhPSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IGZpbmQgZnVsbCB3ZWVrZGF5IGluIHBhdHRlcm4gc3RyaW5nICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhdHRlcm5fc3RyaW5nLmZpbmQoc2VsZi50aW1lX3JlWydkJ10pICE9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgZmluZCAnZCcgZGlyZWN0aXZlIHBhdHRlcm4gc3RyaW5nICclcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuX3N0cmluZykKKworICAgIGRlZiB0ZXN0X3BhdHRlcm5fZXNjYXBpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nIHRoYXQgbWlnaHQgYmUgdGFrZW4gYXMKKyAgICAgICAgIyByZWdleCBzeW50YXggaXMgZXNjYXBlZC4KKyAgICAgICAgcGF0dGVybl9zdHJpbmcgPSBzZWxmLnRpbWVfcmUucGF0dGVybigiXGQrIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihyIlxcZFwrIiwgcGF0dGVybl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIiVzIGRvZXMgbm90IGhhdmUgcmUgY2hhcmFjdGVycyBlc2NhcGVkIHByb3Blcmx5IiAlCisgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9jb21waWxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgY29tcGlsZWQgcmVnZXggaXMgY29ycmVjdAorICAgICAgICBmb3VuZCA9IHNlbGYudGltZV9yZS5jb21waWxlKHIiJUEiKS5tYXRjaChzZWxmLmxvY2FsZV90aW1lLmZfd2Vla2RheVs2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kIGFuZCBmb3VuZC5ncm91cCgnQScpID09IHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5WzZdLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlIG9iamVjdCBmb3IgJyVBJyBmYWlsZWQiKQorICAgICAgICBjb21waWxlZCA9IHNlbGYudGltZV9yZS5jb21waWxlKHIiJWEgJWIiKQorICAgICAgICBmb3VuZCA9IGNvbXBpbGVkLm1hdGNoKCIlcyAlcyIgJSAoc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGVfdGltZS5hX21vbnRoWzRdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLAorICAgICAgICAgICAgIk1hdGNoIGZhaWxlZCB3aXRoICclcycgcmVnZXggYW5kICclcycgc3RyaW5nIiAlCisgICAgICAgICAgICAgKGNvbXBpbGVkLnBhdHRlcm4sICIlcyAlcyIgJSAoc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGVfdGltZS5hX21vbnRoWzRdKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZC5ncm91cCgnYScpID09IHNlbGYubG9jYWxlX3RpbWUuYV93ZWVrZGF5WzRdIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmdyb3VwKCdiJykgPT0gc2VsZi5sb2NhbGVfdGltZS5hX21vbnRoWzRdLAorICAgICAgICAgICAgICAgICAgICAgICAgInJlIG9iamVjdCBjb3VsZG4ndCBmaW5kIHRoZSBhYmJyZXZpYXRlZCB3ZWVrZGF5IG1vbnRoIGluICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyB1c2luZyAnJXMnOyBncm91cCAnYScgPSAnJXMnLCBncm91cCAnYicgPSAlcyciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZm91bmQuc3RyaW5nLCBmb3VuZC5yZS5wYXR0ZXJuLCBmb3VuZC5ncm91cCgnYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5ncm91cCgnYicpKSkKKyAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCdBJywnYicsJ0InLCdjJywnZCcsJ0gnLCdJJywnaicsJ20nLCdNJywncCcsJ1MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnVScsJ3cnLCdXJywneCcsJ1gnLCd5JywnWScsJ1onLCclJyk6CisgICAgICAgICAgICBjb21waWxlZCA9IHNlbGYudGltZV9yZS5jb21waWxlKCIlIiArIGRpcmVjdGl2ZSkKKyAgICAgICAgICAgIGZvdW5kID0gY29tcGlsZWQubWF0Y2godGltZS5zdHJmdGltZSgiJSIgKyBkaXJlY3RpdmUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCAiTWF0Y2hpbmcgZmFpbGVkIG9uICclcycgdXNpbmcgJyVzJyByZWdleCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZC5wYXR0ZXJuKSkKKworICAgIGRlZiB0ZXN0X2JsYW5rcGF0dGVybihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgd2hlbiB0dXBsZSBvciBzb21ldGhpbmcgaGFzIG5vIHZhbHVlcyBubyByZWdleCBpcyBnZW5lcmF0ZWQuCisgICAgICAgICMgRml4ZXMgYnVnICM2NjEzNTQKKyAgICAgICAgdGVzdF9sb2NhbGUgPSBfc3RycHRpbWUuTG9jYWxlVGltZSgpCisgICAgICAgIHRlc3RfbG9jYWxlLnRpbWV6b25lID0gKGZyb3plbnNldCgpLCBmcm96ZW5zZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfc3RycHRpbWUuVGltZVJFKHRlc3RfbG9jYWxlKS5wYXR0ZXJuKCIlWiIpLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aW1lem9uZSA9PSAoJycsJycpLCBUaW1lUkUoKS5wYXR0ZXJuKCclWicpICE9ICcnIikKKworICAgIGRlZiB0ZXN0X21hdGNoaW5nX3dpdGhfZXNjYXBlcyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYSBmb3JtYXQgdGhhdCByZXF1aXJlcyBlc2NhcGluZyBvZiBjaGFyYWN0ZXJzIHdvcmtzCisgICAgICAgIGNvbXBpbGVkX3JlID0gc2VsZi50aW1lX3JlLmNvbXBpbGUoIlx3KyAlbSIpCisgICAgICAgIGZvdW5kID0gY29tcGlsZWRfcmUubWF0Y2goIlx3KyAxMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZCwgIkVzY2FwaW5nIGZhaWxlZCBvZiBmb3JtYXQgJ1x3KyAxMCciKQorCisgICAgZGVmIHRlc3RfbG9jYWxlX2RhdGFfd19yZWdleF9tZXRhY2hhcmFjdGVycyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGlmIGxvY2FsZSBkYXRhIGNvbnRhaW5zIHJlZ2V4IG1ldGFjaGFyYWN0ZXJzIHRoZXkgYXJlCisgICAgICAgICMgZXNjYXBlZCBwcm9wZXJseS4KKyAgICAgICAgIyBEaXNjb3ZlcmVkIGJ5IGJ1ZyAjMTAzOTI3MCAuCisgICAgICAgIGxvY2FsZV90aW1lID0gX3N0cnB0aW1lLkxvY2FsZVRpbWUoKQorICAgICAgICBsb2NhbGVfdGltZS50aW1lem9uZSA9IChmcm96ZW5zZXQoKCJ1dGMiLCAiZ210IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRva3lvIChzdGFuZGFyZCB0aW1lKSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvemVuc2V0KCJUb2t5byAoZGF5bGlnaHQgdGltZSkiKSkKKyAgICAgICAgdGltZV9yZSA9IF9zdHJwdGltZS5UaW1lUkUobG9jYWxlX3RpbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lX3JlLmNvbXBpbGUoIiVaIikubWF0Y2goIlRva3lvIChzdGFuZGFyZCB0aW1lKSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsZSBkYXRhIHRoYXQgY29udGFpbnMgcmVnZXggbWV0YWNoYXJhY3RlcnMgaXMgbm90IgorICAgICAgICAgICAgICAgICAgICAgICAgIiBwcm9wZXJseSBlc2NhcGVkIikKKworICAgIGRlZiB0ZXN0X3doaXRlc3BhY2Vfc3Vic3RpdHV0aW9uKHNlbGYpOgorICAgICAgICAjIFdoZW4gcGF0dGVybiBjb250YWlucyB3aGl0ZXNwYWNlLCBtYWtlIHN1cmUgaXQgaXMgdGFrZW4gaW50byBhY2NvdW50CisgICAgICAgICMgc28gYXMgdG8gbm90IGFsbG93IHRvIHN1YnBhdHRlcm5zIHRvIGVuZCB1cCBuZXh0IHRvIGVhY2ggb3RoZXIgYW5kCisgICAgICAgICMgInN0ZWFsIiBjaGFyYWN0ZXJzIGZyb20gZWFjaCBvdGhlci4KKyAgICAgICAgcGF0dGVybiA9IHNlbGYudGltZV9yZS5wYXR0ZXJuKCclaiAlSCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmUubWF0Y2gocGF0dGVybiwgIjE4MCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUubWF0Y2gocGF0dGVybiwgIjE4IDAiKSkKKworCitjbGFzcyBTdHJwdGltZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyBmb3IgX3N0cnB0aW1lLnN0cnB0aW1lLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJDcmVhdGUgdGVzdGluZyB0aW1lIHR1cGxlLiIiIgorICAgICAgICBzZWxmLnRpbWVfdHVwbGUgPSB0aW1lLmdtdGltZSgpCisKKyAgICBkZWYgdGVzdF9WYWx1ZUVycm9yKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBWYWx1ZUVycm9yIGlzIHJhaXNlZCB3aGVuIG1hdGNoIGZhaWxzIG9yIGZvcm1hdCBpcyBiYWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lLCBkYXRhX3N0cmluZz0iJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ9IiVBIikKKyAgICAgICAgZm9yIGJhZF9mb3JtYXQgaW4gKCIlIiwgIiUgIiwgIiVlIik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCIyMDA1IiwgYmFkX2Zvcm1hdCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlcnI6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCInJXMnIHJhaXNlZCAlcywgbm90IFZhbHVlRXJyb3IiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFkX2Zvcm1hdCwgZXJyLl9fY2xhc3NfXy5fX25hbWVfXykpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJyVzJyBkaWQgbm90IHJhaXNlIFZhbHVlRXJyb3IiICUgYmFkX2Zvcm1hdCkKKworICAgIGRlZiB0ZXN0X3VuY29udmVydGVkZGF0YShzZWxmKToKKyAgICAgICAgIyBDaGVjayBWYWx1ZUVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZXJlIGlzIHVuY29udmVydGVkIGRhdGEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lLCAiMTAgMTIiLCAiJW0iKQorCisgICAgZGVmIGhlbHBlcihzZWxmLCBkaXJlY3RpdmUsIHBvc2l0aW9uKToKKyAgICAgICAgIiIiSGVscGVyIGZ4biBpbiB0ZXN0aW5nLiIiIgorICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlLCBzZWxmLnRpbWVfdHVwbGUpCisgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LCAiJSIgKyBkaXJlY3RpdmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFtwb3NpdGlvbl0gPT0gc2VsZi50aW1lX3R1cGxlW3Bvc2l0aW9uXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nIG9mICclcycgZGlyZWN0aXZlIGZhaWxlZDsgJyVzJyAtPiAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChkaXJlY3RpdmUsIHN0cmZfb3V0cHV0LCBzdHJwX291dHB1dFtwb3NpdGlvbl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudGltZV90dXBsZVtwb3NpdGlvbl0pKQorCisgICAgZGVmIHRlc3RfeWVhcihzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgdGhlIHllYXIgaXMgaGFuZGxlZCBwcm9wZXJseQorICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgneScsICdZJyk6CisgICAgICAgICAgICBzZWxmLmhlbHBlcihkaXJlY3RpdmUsIDApCisgICAgICAgICMgTXVzdCBhbHNvIG1ha2Ugc3VyZSAleSB2YWx1ZXMgYXJlIGNvcnJlY3QgZm9yIGJvdW5kcyBzZXQgYnkgT3BlbiBHcm91cAorICAgICAgICBmb3IgY2VudHVyeSwgYm91bmRzIGluICgoMTkwMCwgKCc2OScsICc5OScpKSwgKDIwMDAsICgnMDAnLCAnNjgnKSkpOgorICAgICAgICAgICAgZm9yIGJvdW5kIGluIGJvdW5kczoKKyAgICAgICAgICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShib3VuZCwgJyV5JykKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9yZXN1bHQgPSBjZW50dXJ5ICsgaW50KGJvdW5kKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFswXSA9PSBleHBlY3RlZF9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIneScgdGVzdCBmYWlsZWQ7IHBhc3NlZCBpbiAnJXMnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCByZXR1cm5lZCAnJXMnIiAlIChib3VuZCwgc3RycF9vdXRwdXRbMF0pKQorCisgICAgZGVmIHRlc3RfbW9udGgoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgbW9udGggZGlyZWN0aXZlcworICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnQicsICdiJywgJ20nKToKKyAgICAgICAgICAgIHNlbGYuaGVscGVyKGRpcmVjdGl2ZSwgMSkKKworICAgIGRlZiB0ZXN0X2RheShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBkYXkgZGlyZWN0aXZlcworICAgICAgICBzZWxmLmhlbHBlcignZCcsIDIpCisKKyAgICBkZWYgdGVzdF9ob3VyKHNlbGYpOgorICAgICAgICAjIFRlc3QgaG91ciBkaXJlY3RpdmVzCisgICAgICAgIHNlbGYuaGVscGVyKCdIJywgMykKKyAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlSSAlcCIsIHNlbGYudGltZV90dXBsZSkKKyAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQsICIlSSAlcCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFszXSA9PSBzZWxmLnRpbWVfdHVwbGVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAidGVzdGluZyBvZiAnJSVJICUlcCcgZGlyZWN0aXZlIGZhaWxlZDsgJyVzJyAtPiAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJmX291dHB1dCwgc3RycF9vdXRwdXRbM10sIHNlbGYudGltZV90dXBsZVszXSkpCisKKyAgICBkZWYgdGVzdF9taW51dGUoc2VsZik6CisgICAgICAgICMgVGVzdCBtaW51dGUgZGlyZWN0aXZlcworICAgICAgICBzZWxmLmhlbHBlcignTScsIDQpCisKKyAgICBkZWYgdGVzdF9zZWNvbmQoc2VsZik6CisgICAgICAgICMgVGVzdCBzZWNvbmQgZGlyZWN0aXZlcworICAgICAgICBzZWxmLmhlbHBlcignUycsIDUpCisKKyAgICBkZWYgdGVzdF9mcmFjdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IG1pY3Jvc2Vjb25kcworICAgICAgICBpbXBvcnQgZGF0ZXRpbWUKKyAgICAgICAgZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMTIsIDEyLCAyMCwgMTIsIDM0LCA1NiwgNzg5ODcpCisgICAgICAgIHR1cCwgZnJhYyA9IF9zdHJwdGltZS5fc3RycHRpbWUoc3RyKGQpLCBmb3JtYXQ9IiVZLSVtLSVkICVIOiVNOiVTLiVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcmFjLCBkLm1pY3Jvc2Vjb25kKQorCisgICAgZGVmIHRlc3Rfd2Vla2RheShzZWxmKToKKyAgICAgICAgIyBUZXN0IHdlZWtkYXkgZGlyZWN0aXZlcworICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnQScsICdhJywgJ3cnKToKKyAgICAgICAgICAgIHNlbGYuaGVscGVyKGRpcmVjdGl2ZSw2KQorCisgICAgZGVmIHRlc3RfanVsaWFuKHNlbGYpOgorICAgICAgICAjIFRlc3QganVsaWFuIGRpcmVjdGl2ZXMKKyAgICAgICAgc2VsZi5oZWxwZXIoJ2onLCA3KQorCisgICAgZGVmIHRlc3RfdGltZXpvbmUoc2VsZik6CisgICAgICAgICMgVGVzdCB0aW1lem9uZSBkaXJlY3RpdmVzLgorICAgICAgICAjIFdoZW4gZ210aW1lKCkgaXMgdXNlZCB3aXRoICVaLCBlbnRpcmUgcmVzdWx0IG9mIHN0cmZ0aW1lKCkgaXMgZW1wdHkuCisgICAgICAgICMgQ2hlY2sgZm9yIGVxdWFsIHRpbWV6b25lIG5hbWVzIGRlYWxzIHdpdGggYmFkIGxvY2FsZSBpbmZvIHdoZW4gdGhpcworICAgICAgICAjIG9jY3VyczsgZmlyc3QgZm91bmQgaW4gRnJlZUJTRCA0LjQuCisgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCJVVEMiLCAiJVoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnBfb3V0cHV0LnRtX2lzZHN0LCAwKQorICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgiR01UIiwgIiVaIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJwX291dHB1dC50bV9pc2RzdCwgMCkKKyAgICAgICAgdGltZV90dXBsZSA9IHRpbWUubG9jYWx0aW1lKCkKKyAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlWiIpICAjVVRDIGRvZXMgbm90IGhhdmUgYSB0aW1lem9uZQorICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dCwgIiVaIikKKyAgICAgICAgbG9jYWxlX3RpbWUgPSBfc3RycHRpbWUuTG9jYWxlVGltZSgpCisgICAgICAgIGlmIHRpbWUudHpuYW1lWzBdICE9IHRpbWUudHpuYW1lWzFdIG9yIG5vdCB0aW1lLmRheWxpZ2h0OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzhdID09IHRpbWVfdHVwbGVbOF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWV6b25lIGNoZWNrIGZhaWxlZDsgJyVzJyAtPiAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZl9vdXRwdXQsIHN0cnBfb3V0cHV0WzhdLCB0aW1lX3R1cGxlWzhdKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs4XSA9PSAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jYWxlVGltZSgpLnRpbWV6b25lIGhhcyBkdXBsaWNhdGUgdmFsdWVzIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lLmRheWxpZ2h0IGJ1dCB0aW1lem9uZSB2YWx1ZSBub3Qgc2V0IHRvIC0xIikKKworICAgIGRlZiB0ZXN0X2JhZF90aW1lem9uZShzZWxmKToKKyAgICAgICAgIyBFeHBsaWNpdGx5IHRlc3QgcG9zc2liaWxpdHkgb2YgYmFkIHRpbWV6b25lOworICAgICAgICAjIHdoZW4gdGltZS50em5hbWVbMF0gPT0gdGltZS50em5hbWVbMV0gYW5kIHRpbWUuZGF5bGlnaHQKKyAgICAgICAgdHpfbmFtZSA9IHRpbWUudHpuYW1lWzBdCisgICAgICAgIGlmIHR6X25hbWUudXBwZXIoKSBpbiAoIlVUQyIsICJHTVQiKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcmlnaW5hbF90em5hbWUgPSB0aW1lLnR6bmFtZQorICAgICAgICAgICAgb3JpZ2luYWxfZGF5bGlnaHQgPSB0aW1lLmRheWxpZ2h0CisgICAgICAgICAgICB0aW1lLnR6bmFtZSA9ICh0el9uYW1lLCB0el9uYW1lKQorICAgICAgICAgICAgdGltZS5kYXlsaWdodCA9IDEKKyAgICAgICAgICAgIHR6X3ZhbHVlID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHR6X25hbWUsICIlWiIpWzhdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR6X3ZhbHVlLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgIiVzIGxlYWQgdG8gYSB0aW1lem9uZSB2YWx1ZSBvZiAlcyBpbnN0ZWFkIG9mIC0xIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAidGltZS5kYXlsaWdodCBzZXQgdG8gJXMgYW5kIHBhc3NpbmcgaW4gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgKHRpbWUudHpuYW1lLCB0el92YWx1ZSwgdGltZS5kYXlsaWdodCwgdHpfbmFtZSkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0aW1lLnR6bmFtZSA9IG9yaWdpbmFsX3R6bmFtZQorICAgICAgICAgICAgdGltZS5kYXlsaWdodCA9IG9yaWdpbmFsX2RheWxpZ2h0CisKKyAgICBkZWYgdGVzdF9kYXRlX3RpbWUoc2VsZik6CisgICAgICAgICMgVGVzdCAlYyBkaXJlY3RpdmUKKyAgICAgICAgZm9yIHBvc2l0aW9uIGluIHJhbmdlKDYpOgorICAgICAgICAgICAgc2VsZi5oZWxwZXIoJ2MnLCBwb3NpdGlvbikKKworICAgIGRlZiB0ZXN0X2RhdGUoc2VsZik6CisgICAgICAgICMgVGVzdCAleCBkaXJlY3RpdmUKKyAgICAgICAgZm9yIHBvc2l0aW9uIGluIHJhbmdlKDAsMyk6CisgICAgICAgICAgICBzZWxmLmhlbHBlcigneCcsIHBvc2l0aW9uKQorCisgICAgZGVmIHRlc3RfdGltZShzZWxmKToKKyAgICAgICAgIyBUZXN0ICVYIGRpcmVjdGl2ZQorICAgICAgICBmb3IgcG9zaXRpb24gaW4gcmFuZ2UoMyw2KToKKyAgICAgICAgICAgIHNlbGYuaGVscGVyKCdYJywgcG9zaXRpb24pCisKKyAgICBkZWYgdGVzdF9wZXJjZW50KHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSAlIHNpZ25zIGFyZSBoYW5kbGVkIHByb3Blcmx5CisgICAgICAgIHN0cmZfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJW0gJSUgJVkiLCBzZWxmLnRpbWVfdHVwbGUpCisgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LCAiJW0gJSUgJVkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbMF0gPT0gc2VsZi50aW1lX3R1cGxlWzBdIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzFdID09IHNlbGYudGltZV90dXBsZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGluZyBvZiBwZXJjZW50IHNpZ24gZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X2Nhc2VpbnNlbnNpdGl2ZShzZWxmKToKKyAgICAgICAgIyBTaG91bGQgaGFuZGxlIG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseS4KKyAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlQiIsIHNlbGYudGltZV90dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dC51cHBlcigpLCAiJUIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJzdHJwdGltZSBkb2VzIG5vdCBoYW5kbGUgQUxMLUNBUFMgbmFtZXMgcHJvcGVybHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0Lmxvd2VyKCksICIlQiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgInN0cnB0aW1lIGRvZXMgbm90IGhhbmRsZSBsb3dlcmNhc2UgbmFtZXMgcHJvcGVybHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LmNhcGl0YWxpemUoKSwgIiVCIiksCisgICAgICAgICAgICAgICAgICAgICAgICAic3RycHRpbWUgZG9lcyBub3QgaGFuZGxlIGNhcHdvcmQgbmFtZXMgcHJvcGVybHkiKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdHMoc2VsZik6CisgICAgICAgICMgRGVmYXVsdCByZXR1cm4gdmFsdWUgc2hvdWxkIGJlICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAwKQorICAgICAgICBkZWZhdWx0cyA9ICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkKKyAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJzEnLCAnJW0nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXQgPT0gZGVmYXVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAiRGVmYXVsdCB2YWx1ZXMgZm9yIHN0cnB0aW1lKCkgYXJlIGluY29ycmVjdDsiCisgICAgICAgICAgICAgICAgICAgICAgICAiICVzICE9ICVzIiAlIChzdHJwX291dHB1dCwgZGVmYXVsdHMpKQorCisgICAgZGVmIHRlc3RfZXNjYXBpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSByZWdleCBzaWduaWZpY2FuY2UgYXJlIGVzY2FwZWQuCisgICAgICAgICMgUGFyZW50aGVzZXMgYXJlIGluIGEgcHVycG9zZWZ1bCBvcmRlcjsgd2lsbCBjYXVzZSBhbiBlcnJvciBvZgorICAgICAgICAjIHVuYmFsYW5jZWQgcGFyZW50aGVzZXMgd2hlbiB0aGUgcmVnZXggaXMgY29tcGlsZWQgaWYgdGhleSBhcmUgbm90CisgICAgICAgICMgZXNjYXBlZC4KKyAgICAgICAgIyBUZXN0IGluc3RpZ2F0ZWQgYnkgYnVnICM3OTYxNDkgLgorICAgICAgICBuZWVkX2VzY2FwaW5nID0gIi5eJCorP3t9XFtdfCkoIgorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKG5lZWRfZXNjYXBpbmcsIG5lZWRfZXNjYXBpbmcpKQorCisgICAgZGVmIHRlc3RfZmViMjlfb25fbGVhcF95ZWFyX3dpdGhvdXRfeWVhcihzZWxmKToKKyAgICAgICAgdGltZS5zdHJwdGltZSgiRmViIDI5IiwgIiViICVkIikKKworICAgIGRlZiB0ZXN0X21hcjFfY29tZXNfYWZ0ZXJfZmViMjlfZXZlbl93aGVuX29taXR0aW5nX3RoZV95ZWFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydExlc3MoCisgICAgICAgICAgICAgICAgdGltZS5zdHJwdGltZSgiRmViIDI5IiwgIiViICVkIiksCisgICAgICAgICAgICAgICAgdGltZS5zdHJwdGltZSgiTWFyIDEiLCAiJWIgJWQiKSkKKworY2xhc3MgU3RycHRpbWUxMkFNUE1UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCBhIF9zdHJwdGltZSByZWdyZXNzaW9uIGluICclSSAlcCcgYXQgMTIgbm9vbiAoMTIgUE0pIiIiCisKKyAgICBkZWYgdGVzdF90d2VsdmVfbm9vbl9taWRuaWdodChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHRpbWUuc3RycHRpbWUoJzEyIFBNJywgJyVJICVwJylbM10sIDEyKQorICAgICAgICBlcSh0aW1lLnN0cnB0aW1lKCcxMiBBTScsICclSSAlcCcpWzNdLCAwKQorICAgICAgICBlcShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJzEyIFBNJywgJyVJICVwJylbM10sIDEyKQorICAgICAgICBlcShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJzEyIEFNJywgJyVJICVwJylbM10sIDApCisKKworY2xhc3MgSnVsaWFuVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgYSBfc3RycHRpbWUgcmVncmVzc2lvbiB0aGF0IGFsbCBqdWxpYW4gKDEtMzY2KSBhcmUgYWNjZXB0ZWQiIiIKKworICAgIGRlZiB0ZXN0X2FsbF9qdWxpYW5fZGF5cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDM2Nyk6CisgICAgICAgICAgICAjIHVzZSAyMDA0LCBzaW5jZSBpdCBpcyBhIGxlYXAgeWVhciwgd2UgaGF2ZSAzNjYgZGF5cworICAgICAgICAgICAgZXEoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCclZCAyMDA0JyAlIGksICclaiAlWScpWzddLCBpKQorCitjbGFzcyBDYWxjdWxhdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgc3RycHRpbWUoKSBmaWxscyBpbiBtaXNzaW5nIGluZm8gY29ycmVjdGx5IiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGltZV90dXBsZSA9IHRpbWUuZ210aW1lKCkKKworICAgIGRlZiB0ZXN0X2p1bGlhbl9jYWxjdWxhdGlvbihzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB3aGVuIEp1bGlhbiBpcyBtaXNzaW5nIHRoYXQgaXQgaXMgY2FsY3VsYXRlZAorICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiVZICVtICVkICVIICVNICVTICV3ICVaIgorICAgICAgICByZXN1bHQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodGltZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nLCBzZWxmLnRpbWVfdHVwbGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC50bV95ZGF5ID09IHNlbGYudGltZV90dXBsZS50bV95ZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGN1bGF0aW9uIG9mIHRtX3lkYXkgZmFpbGVkOyAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChyZXN1bHQudG1feWRheSwgc2VsZi50aW1lX3R1cGxlLnRtX3lkYXkpKQorCisgICAgZGVmIHRlc3RfZ3JlZ29yaWFuX2NhbGN1bGF0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBHcmVnb3JpYW4gZGF0ZSBjYW4gYmUgY2FsY3VsYXRlZCBmcm9tIEp1bGlhbiBkYXkKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIlWSAlSCAlTSAlUyAldyAlaiAlWiIKKyAgICAgICAgcmVzdWx0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHRpbWUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZywgc2VsZi50aW1lX3R1cGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQudG1feWVhciA9PSBzZWxmLnRpbWVfdHVwbGUudG1feWVhciBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudG1fbW9uID09IHNlbGYudGltZV90dXBsZS50bV9tb24gYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRtX21kYXkgPT0gc2VsZi50aW1lX3R1cGxlLnRtX21kYXksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsY3VsYXRpb24gb2YgR3JlZ29yaWFuIGRhdGUgZmFpbGVkOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMtJXMtJXMgIT0gJXMtJXMtJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0LnRtX3llYXIsIHJlc3VsdC50bV9tb24sIHJlc3VsdC50bV9tZGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRpbWVfdHVwbGUudG1feWVhciwgc2VsZi50aW1lX3R1cGxlLnRtX21vbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lX3R1cGxlLnRtX21kYXkpKQorCisgICAgZGVmIHRlc3RfZGF5X29mX3dlZWtfY2FsY3VsYXRpb24oc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHRoZSBkYXkgb2YgdGhlIHdlZWsgaXMgY2FsY3VsYXRlZCBhcyBuZWVkZWQKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIlWSAlbSAlZCAlSCAlUyAlaiAlWiIKKyAgICAgICAgcmVzdWx0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHRpbWUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZywgc2VsZi50aW1lX3R1cGxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQudG1fd2RheSA9PSBzZWxmLnRpbWVfdHVwbGUudG1fd2RheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJDYWxjdWxhdGlvbiBvZiBkYXkgb2YgdGhlIHdlZWsgZmFpbGVkOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgIT0gJXMiICUgKHJlc3VsdC50bV93ZGF5LCBzZWxmLnRpbWVfdHVwbGUudG1fd2RheSkpCisKKyAgICBkZWYgdGVzdF93ZWVrX29mX3llYXJfYW5kX2RheV9vZl93ZWVrX2NhbGN1bGF0aW9uKHNlbGYpOgorICAgICAgICAjIFNob3VsZCBiZSBhYmxlIHRvIGluZmVyIGRhdGUgaWYgZ2l2ZW4geWVhciwgd2VlayBvZiB5ZWFyICglVSBvciAlVykKKyAgICAgICAgIyBhbmQgZGF5IG9mIHRoZSB3ZWVrCisgICAgICAgIGRlZiB0ZXN0X2hlbHBlcih5bWRfdHVwbGUsIHRlc3RfcmVhc29uKToKKyAgICAgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdXJywgJ1UnKToKKyAgICAgICAgICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiUlWSAlJSVzICUldyIgJSBkaXJlY3RpdmUKKyAgICAgICAgICAgICAgICBkdF9kYXRlID0gZGF0ZXRpbWVfZGF0ZSgqeW1kX3R1cGxlKQorICAgICAgICAgICAgICAgIHN0cnBfaW5wdXQgPSBkdF9kYXRlLnN0cmZ0aW1lKGZvcm1hdF9zdHJpbmcpCisgICAgICAgICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RycF9pbnB1dCwgZm9ybWF0X3N0cmluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbOjNdID09IHltZF90dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcykgdGVzdCBmYWlsZWQgdy8gJyVzJzogJXMgIT0gJXMgKCVzICE9ICVzKSIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0X3JlYXNvbiwgZGlyZWN0aXZlLCBzdHJwX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJwX291dHB1dFs6M10sIHltZF90dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbN10sIGR0X2RhdGUudGltZXR1cGxlKClbN10pKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgMyksICJ3ZWVrIDAiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkwMSwgMSwgOCksICJjb21tb24gY2FzZSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTAxLCAxLCAxMyksICJkYXkgb24gU3VuZGF5IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDE5MDEsIDEsIDE0KSwgImRheSBvbiBNb25kYXkiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkwNSwgMSwgMSksICJKYW4gMSBvbiBTdW5kYXkiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkwNiwgMSwgMSksICJKYW4gMSBvbiBNb25kYXkiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkwNiwgMSwgNyksICJmaXJzdCBTdW5kYXkgaW4gYSB5ZWFyIHN0YXJ0aW5nIG9uIE1vbmRheSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTA1LCAxMiwgMzEpLCAiRGVjIDMxIG9uIFN1bmRheSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTA2LCAxMiwgMzEpLCAiRGVjIDMxIG9uIE1vbmRheSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgyMDA4LCAxMiwgMjkpLCAiTW9uZGF5IGluIHRoZSBsYXN0IHdlZWsgb2YgdGhlIHllYXIiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMjAwOCwgMTIsIDIyKSwgIk1vbmRheSBpbiB0aGUgc2Vjb25kLXRvLWxhc3Qgd2VlayBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInllYXIiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTk3OCwgMTAsIDIzKSwgInJhbmRvbWx5IGNob3NlbiBkYXRlIikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDIwMDQsIDEyLCAxOCksICJyYW5kb21seSBjaG9zZW4gZGF0ZSIpCisgICAgICAgIHRlc3RfaGVscGVyKCgxOTc4LCAxMCwgMjMpLCAieWVhciBzdGFydGluZyBhbmQgZW5kaW5nIG9uIE1vbmRheSB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRhdGUgbm90IG9uIFN1bmRheSBvciBNb25kYXkiKQorICAgICAgICB0ZXN0X2hlbHBlcigoMTkxNywgMTIsIDE3KSwgInllYXIgc3RhcnRpbmcgYW5kIGVuZGluZyBvbiBNb25kYXkgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgTW9uZGF5IG5vdCBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSB5ZWFyIikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDE5MTcsIDEyLCAzMSksICJEZWMgMzEgb24gTW9uZGF5IHdpdGggeWVhciBzdGFydGluZyBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbmRpbmcgb24gTW9uZGF5IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDIwMDcsIDAxLCAwNyksICJGaXJzdCBTdW5kYXkgb2YgMjAwNyIpCisgICAgICAgIHRlc3RfaGVscGVyKCgyMDA3LCAwMSwgMTQpLCAiU2Vjb25kIFN1bmRheSBvZiAyMDA3IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDIwMDYsIDEyLCAzMSksICJMYXN0IFN1bmRheSBvZiAyMDA2IikKKyAgICAgICAgdGVzdF9oZWxwZXIoKDIwMDYsIDEyLCAyNCksICJTZWNvbmQgdG8gbGFzdCBTdW5kYXkgb2YgMjAwNiIpCisKKworY2xhc3MgQ2FjaGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdCB0aGF0IGNhY2hpbmcgd29ya3MgcHJvcGVybHkuIiIiCisKKyAgICBkZWYgdGVzdF90aW1lX3JlX3JlY3JlYXRpb24oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGNhY2hlIGlzIHJlY3JlYXRlZCB3aGVuIGN1cnJlbnQgbG9jYWxlIGRvZXMgbm90IG1hdGNoIHdoYXQKKyAgICAgICAgIyBjYWNoZWQgb2JqZWN0IHdhcyBjcmVhdGVkIHdpdGguCisgICAgICAgIF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgiMTAiLCAiJWQiKQorICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIjIwMDUiLCAiJVkiKQorICAgICAgICBfc3RycHRpbWUuX1RpbWVSRV9jYWNoZS5sb2NhbGVfdGltZS5sYW5nID0gIk5pIgorICAgICAgICBvcmlnaW5hbF90aW1lX3JlID0gX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUKKyAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCIxMCIsICIlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3Qob3JpZ2luYWxfdGltZV9yZSwgX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKF9zdHJwdGltZS5fcmVnZXhfY2FjaGUpLCAxKQorCisgICAgZGVmIHRlc3RfcmVnZXhfY2xlYW51cChzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGVkIHJlZ2V4ZXMgYXJlIGRpc2NhcmRlZCB3aGVuIGNhY2hlIGJlY29tZXMgImZ1bGwiLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgX3N0cnB0aW1lLl9yZWdleF9jYWNoZVsnJWQnXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGJvZ3VzX2tleSA9IDAKKyAgICAgICAgd2hpbGUgbGVuKF9zdHJwdGltZS5fcmVnZXhfY2FjaGUpIDw9IF9zdHJwdGltZS5fQ0FDSEVfTUFYX1NJWkU6CisgICAgICAgICAgICBfc3RycHRpbWUuX3JlZ2V4X2NhY2hlW2JvZ3VzX2tleV0gPSBOb25lCisgICAgICAgICAgICBib2d1c19rZXkgKz0gMQorICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIjEwIiwgIiVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oX3N0cnB0aW1lLl9yZWdleF9jYWNoZSksIDEpCisKKyAgICBkZWYgdGVzdF9uZXdfbG9jYWxldGltZShzZWxmKToKKyAgICAgICAgIyBBIG5ldyBMb2NhbGVUaW1lIGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkIHdoZW4gYSBuZXcgVGltZVJFIG9iamVjdAorICAgICAgICAjIGlzIGNyZWF0ZWQuCisgICAgICAgIGxvY2FsZV90aW1lX2lkID0gX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUKKyAgICAgICAgX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUubGFuZyA9ICJOaSIKKyAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCIxMCIsICIlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3QobG9jYWxlX3RpbWVfaWQsIF9zdHJwdGltZS5fVGltZVJFX2NhY2hlLmxvY2FsZV90aW1lKQorCisgICAgZGVmIHRlc3RfVGltZVJFX3JlY3JlYXRpb24oc2VsZik6CisgICAgICAgICMgVGhlIFRpbWVSRSBpbnN0YW5jZSBzaG91bGQgYmUgcmVjcmVhdGVkIHVwb24gY2hhbmdpbmcgdGhlIGxvY2FsZS4KKyAgICAgICAgbG9jYWxlX2luZm8gPSBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FLCAoJ2VuX1VTJywgJ1VURjgnKSkKKyAgICAgICAgZXhjZXB0IGxvY2FsZS5FcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJzEwJywgJyVkJykKKyAgICAgICAgICAgICMgR2V0IGlkIG9mIGN1cnJlbnQgY2FjaGUgb2JqZWN0LgorICAgICAgICAgICAgZmlyc3RfdGltZV9yZSA9IF9zdHJwdGltZS5fVGltZVJFX2NhY2hlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBDaGFuZ2UgdGhlIGxvY2FsZSBhbmQgZm9yY2UgYSByZWNyZWF0aW9uIG9mIHRoZSBjYWNoZS4KKyAgICAgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FLCAoJ2RlX0RFJywgJ1VURjgnKSkKKyAgICAgICAgICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoJzEwJywgJyVkJykKKyAgICAgICAgICAgICAgICAjIEdldCB0aGUgbmV3IGNhY2hlIG9iamVjdCdzIGlkLgorICAgICAgICAgICAgICAgIHNlY29uZF90aW1lX3JlID0gX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUKKyAgICAgICAgICAgICAgICAjIFRoZXkgc2hvdWxkIG5vdCBiZSBlcXVhbC4KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydElzTm90KGZpcnN0X3RpbWVfcmUsIHNlY29uZF90aW1lX3JlKQorICAgICAgICAgICAgIyBQb3NzaWJsZSB0ZXN0IGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkIHdoaWxlIGluaXRpYWwgbG9jYWxlIGlzLgorICAgICAgICAgICAgIyBJZiB0aGlzIGlzIHRoZSBjYXNlIGp1c3Qgc3VwcHJlc3MgdGhlIGV4Y2VwdGlvbiBhbmQgZmFsbC10aHJvdWdoCisgICAgICAgICAgICAjIHRvIHRoZSByZXNldHRpbmcgdG8gdGhlIG9yaWdpbmFsIGxvY2FsZS4KKyAgICAgICAgICAgIGV4Y2VwdCBsb2NhbGUuRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCB0cmFtcGxlIG9uIHRoZSBsb2NhbGUgc2V0dGluZyBvbmNlIHdlIGxlYXZlIHRoZQorICAgICAgICAjIHRlc3QuCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FLCBsb2NhbGVfaW5mbykKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgZ2V0bGFuZ19UZXN0cywKKyAgICAgICAgTG9jYWxlVGltZV9UZXN0cywKKyAgICAgICAgVGltZVJFVGVzdHMsCisgICAgICAgIFN0cnB0aW1lVGVzdHMsCisgICAgICAgIFN0cnB0aW1lMTJBTVBNVGVzdHMsCisgICAgICAgIEp1bGlhblRlc3RzLAorICAgICAgICBDYWxjdWxhdGlvblRlc3RzLAorICAgICAgICBDYWNoZVRlc3RzCisgICAgKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnB0aW1lLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnB0aW1lLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjdlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RycHRpbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnB0aW1lLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnB0aW1lLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjdlMTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RycHRpbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmM1OTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydG9kLnB5CkBAIC0wLDAgKzEsMzk5IEBACisjIFRlc3RzIGZvciB0aGUgY29ycmVjdGx5LXJvdW5kZWQgc3RyaW5nIC0+IGZsb2F0IGNvbnZlcnNpb25zCisjIGludHJvZHVjZWQgaW4gUHl0aG9uIDIuNyBhbmQgMy4xLgorCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgc3RydWN0CitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCByZQoraW1wb3J0IHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworaWYgZ2V0YXR0cihzeXMsICdmbG9hdF9yZXByX3N0eWxlJywgJycpICE9ICdzaG9ydCc6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ2NvcnJlY3RseS1yb3VuZGVkIHN0cmluZy0+ZmxvYXQgY29udmVyc2lvbnMgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3QgYXZhaWxhYmxlIG9uIHRoaXMgc3lzdGVtJykKKworIyBDb3JyZWN0bHkgcm91bmRlZCBzdHIgLT4gZmxvYXQgaW4gcHVyZSBQeXRob24sIGZvciBjb21wYXJpc29uLgorCitzdHJ0b2RfcGFyc2VyID0gcmUuY29tcGlsZShyIiIiICAgICMgQSBudW1lcmljIHN0cmluZyBjb25zaXN0cyBvZjoKKyAgICAoP1A8c2lnbj5bLStdKT8gICAgICAgICAgIyBhbiBvcHRpb25hbCBzaWduLCBmb2xsb3dlZCBieQorICAgICg/PVxkfFwuXGQpICAgICAgICAgICAgICAjIGEgbnVtYmVyIHdpdGggYXQgbGVhc3Qgb25lIGRpZ2l0CisgICAgKD9QPGludD5cZCopICAgICAgICAgICAgICMgaGF2aW5nIGEgKHBvc3NpYmx5IGVtcHR5KSBpbnRlZ2VyIHBhcnQKKyAgICAoPzpcLig/UDxmcmFjPlxkKikpPyAgICAgIyBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCBmcmFjdGlvbmFsIHBhcnQKKyAgICAoPzpFKD9QPGV4cD5bLStdP1xkKykpPyAgIyBhbmQgYW4gb3B0aW9uYWwgZXhwb25lbnQKKyAgICBcWgorIiIiLCByZS5WRVJCT1NFIHwgcmUuSUdOT1JFQ0FTRSkubWF0Y2gKKworIyBQdXJlIFB5dGhvbiB2ZXJzaW9uIG9mIGNvcnJlY3RseSByb3VuZGVkIHN0cmluZy0+ZmxvYXQgY29udmVyc2lvbi4KKyMgQXZvaWRzIGFueSB1c2Ugb2YgZmxvYXRpbmctcG9pbnQgYnkgcmV0dXJuaW5nIHRoZSByZXN1bHQgYXMgYSBoZXggc3RyaW5nLgorZGVmIHN0cnRvZChzLCBtYW50X2RpZz01MywgbWluX2V4cCA9IC0xMDIxLCBtYXhfZXhwID0gMTAyNCk6CisgICAgIiIiQ29udmVydCBhIGZpbml0ZSBkZWNpbWFsIHN0cmluZyB0byBhIGhleCBzdHJpbmcgcmVwcmVzZW50aW5nIGFuCisgICAgSUVFRSA3NTQgYmluYXJ5NjQgZmxvYXQuICBSZXR1cm4gJ2luZicgb3IgJy1pbmYnIG9uIG92ZXJmbG93LgorICAgIFRoaXMgZnVuY3Rpb24gbWFrZXMgbm8gdXNlIG9mIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMgYXQgYW55CisgICAgc3RhZ2UuIiIiCisKKyAgICAjIHBhcnNlIHN0cmluZyBpbnRvIGEgcGFpciBvZiBpbnRlZ2VycyAnYScgYW5kICdiJyBzdWNoIHRoYXQKKyAgICAjIGFicyhkZWNpbWFsIHZhbHVlKSA9IGEvYiwgYWxvbmcgd2l0aCBhIGJvb2xlYW4gJ25lZ2F0aXZlJy4KKyAgICBtID0gc3RydG9kX3BhcnNlcihzKQorICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW52YWxpZCBudW1lcmljIHN0cmluZycpCisgICAgZnJhY3Rpb24gPSBtLmdyb3VwKCdmcmFjJykgb3IgJycKKyAgICBpbnRwYXJ0ID0gaW50KG0uZ3JvdXAoJ2ludCcpICsgZnJhY3Rpb24pCisgICAgZXhwID0gaW50KG0uZ3JvdXAoJ2V4cCcpIG9yICcwJykgLSBsZW4oZnJhY3Rpb24pCisgICAgbmVnYXRpdmUgPSBtLmdyb3VwKCdzaWduJykgPT0gJy0nCisgICAgYSwgYiA9IGludHBhcnQqMTAqKm1heChleHAsIDApLCAxMCoqbWF4KDAsIC1leHApCisKKyAgICAjIHF1aWNrIHJldHVybiBmb3IgemVyb3MKKyAgICBpZiBub3QgYToKKyAgICAgICAgcmV0dXJuICctMHgwLjBwKzAnIGlmIG5lZ2F0aXZlIGVsc2UgJzB4MC4wcCswJworCisgICAgIyBjb21wdXRlIGV4cG9uZW50IGUgZm9yIHJlc3VsdDsgbWF5IGJlIG9uZSB0b28gc21hbGwgaW4gdGhlIGNhc2UKKyAgICAjIHRoYXQgdGhlIHJvdW5kZWQgdmFsdWUgb2YgYS9iIGxpZXMgaW4gYSBkaWZmZXJlbnQgYmluYWRlIGZyb20gYS9iCisgICAgZCA9IGEuYml0X2xlbmd0aCgpIC0gYi5iaXRfbGVuZ3RoKCkKKyAgICBkICs9IChhID4+IGQgaWYgZCA+PSAwIGVsc2UgYSA8PCAtZCkgPj0gYgorICAgIGUgPSBtYXgoZCwgbWluX2V4cCkgLSBtYW50X2RpZworCisgICAgIyBhcHByb3hpbWF0ZSBhL2IgYnkgbnVtYmVyIG9mIHRoZSBmb3JtIHEgKiAyKiplOyBhZGp1c3QgZSBpZiBuZWNlc3NhcnkKKyAgICBhLCBiID0gYSA8PCBtYXgoLWUsIDApLCBiIDw8IG1heChlLCAwKQorICAgIHEsIHIgPSBkaXZtb2QoYSwgYikKKyAgICBpZiAyKnIgPiBiIG9yIDIqciA9PSBiIGFuZCBxICYgMToKKyAgICAgICAgcSArPSAxCisgICAgICAgIGlmIHEuYml0X2xlbmd0aCgpID09IG1hbnRfZGlnKzE6CisgICAgICAgICAgICBxIC8vPSAyCisgICAgICAgICAgICBlICs9IDEKKworICAgICMgZG91YmxlIGNoZWNrIHRoYXQgKHEsIGUpIGhhcyB0aGUgcmlnaHQgZm9ybQorICAgIGFzc2VydCBxLmJpdF9sZW5ndGgoKSA8PSBtYW50X2RpZyBhbmQgZSA+PSBtaW5fZXhwIC0gbWFudF9kaWcKKyAgICBhc3NlcnQgcS5iaXRfbGVuZ3RoKCkgPT0gbWFudF9kaWcgb3IgZSA9PSBtaW5fZXhwIC0gbWFudF9kaWcKKworICAgICMgY2hlY2sgZm9yIG92ZXJmbG93IGFuZCB1bmRlcmZsb3cKKyAgICBpZiBlICsgcS5iaXRfbGVuZ3RoKCkgPiBtYXhfZXhwOgorICAgICAgICByZXR1cm4gJy1pbmYnIGlmIG5lZ2F0aXZlIGVsc2UgJ2luZicKKyAgICBpZiBub3QgcToKKyAgICAgICAgcmV0dXJuICctMHgwLjBwKzAnIGlmIG5lZ2F0aXZlIGVsc2UgJzB4MC4wcCswJworCisgICAgIyBmb3IgaGV4IHJlcHJlc2VudGF0aW9uLCBzaGlmdCBzbyAjIGJpdHMgYWZ0ZXIgcG9pbnQgaXMgYSBtdWx0aXBsZSBvZiA0CisgICAgaGV4ZGlncyA9IDEgKyAobWFudF9kaWctMikvLzQKKyAgICBzaGlmdCA9IDMgLSAobWFudF9kaWctMiklNAorICAgIHEsIGUgPSBxIDw8IHNoaWZ0LCBlIC0gc2hpZnQKKyAgICByZXR1cm4gJ3t9MHh7Onh9Lns6MHt9eH1wezorZH0nLmZvcm1hdCgKKyAgICAgICAgJy0nIGlmIG5lZ2F0aXZlIGVsc2UgJycsCisgICAgICAgIHEgLy8gMTYqKmhleGRpZ3MsCisgICAgICAgIHEgJSAxNioqaGV4ZGlncywKKyAgICAgICAgaGV4ZGlncywKKyAgICAgICAgZSArIDQqaGV4ZGlncykKKworVEVTVF9TSVpFID0gMTAKKworY2xhc3MgU3RydG9kVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjaGVja19zdHJ0b2Qoc2VsZiwgcyk6CisgICAgICAgICIiIkNvbXBhcmUgdGhlIHJlc3VsdCBvZiBQeXRob24ncyBidWlsdGluIGNvcnJlY3RseSByb3VuZGVkCisgICAgICAgIHN0cmluZy0+ZmxvYXQgY29udmVyc2lvbiAodXNpbmcgZmxvYXQpIHRvIGEgcHVyZSBQeXRob24KKyAgICAgICAgY29ycmVjdGx5IHJvdW5kZWQgc3RyaW5nLT5mbG9hdCBpbXBsZW1lbnRhdGlvbi4gIEZhaWwgaWYgdGhlCisgICAgICAgIHR3byBtZXRob2RzIGdpdmUgZGlmZmVyZW50IHJlc3VsdHMuIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnMgPSBmbG9hdChzKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIGdvdCA9ICctaW5mJyBpZiBzWzBdID09ICctJyBlbHNlICdpbmYnCisgICAgICAgIGV4Y2VwdCBNZW1vcnlFcnJvcjoKKyAgICAgICAgICAgIGdvdCA9ICdtZW1vcnkgZXJyb3InCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnb3QgPSBmcy5oZXgoKQorICAgICAgICBleHBlY3RlZCA9IHN0cnRvZChzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBnb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29ycmVjdGx5IHJvdW5kZWQgc3RyLT5mbG9hdCBjb252ZXJzaW9uIGZvciB7fTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCB7fSwgZ290IHt9Ii5mb3JtYXQocywgZXhwZWN0ZWQsIGdvdCkpCisKKyAgICBkZWYgdGVzdF9zaG9ydF9oYWxmd2F5X2Nhc2VzKHNlbGYpOgorICAgICAgICAjIGV4YWN0IGhhbGZ3YXkgY2FzZXMgd2l0aCBhIHNtYWxsIG51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMKKyAgICAgICAgZm9yIGsgaW4gMCwgNSwgMTAsIDE1LCAyMDoKKyAgICAgICAgICAgICMgdXBwZXIgPSBzbWFsbGVzdCBpbnRlZ2VyID49IDIqKjU0LzUqKmsKKyAgICAgICAgICAgIHVwcGVyID0gLSgtMioqNTQvLzUqKmspCisgICAgICAgICAgICAjIGxvd2VyID0gc21hbGxlc3Qgb2RkIG51bWJlciA+PSAyKio1My81KiprCisgICAgICAgICAgICBsb3dlciA9IC0oLTIqKjUzLy81KiprKQorICAgICAgICAgICAgaWYgbG93ZXIgJSAyID09IDA6CisgICAgICAgICAgICAgICAgbG93ZXIgKz0gMQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKFRFU1RfU0laRSk6CisgICAgICAgICAgICAgICAgIyBTZWxlY3QgYSByYW5kb20gb2RkIG4gaW4gWzIqKjUzLzUqKmssCisgICAgICAgICAgICAgICAgIyAyKio1NC81KiprKS4gVGhlbiBuICogMTAqKmsgZ2l2ZXMgYSBoYWxmd2F5IGNhc2UKKyAgICAgICAgICAgICAgICAjIHdpdGggc21hbGwgbnVtYmVyIG9mIHNpZ25pZmljYW50IGRpZ2l0cy4KKyAgICAgICAgICAgICAgICBuLCBlID0gcmFuZG9tLnJhbmRyYW5nZShsb3dlciwgdXBwZXIsIDIpLCBrCisKKyAgICAgICAgICAgICAgICAjIFJlbW92ZSBhbnkgYWRkaXRpb25hbCBwb3dlcnMgb2YgNS4KKyAgICAgICAgICAgICAgICB3aGlsZSBuICUgNSA9PSAwOgorICAgICAgICAgICAgICAgICAgICBuLCBlID0gbiAvLyA1LCBlICsgMQorICAgICAgICAgICAgICAgIGFzc2VydCBuICUgMTAgaW4gKDEsIDMsIDcsIDkpCisKKyAgICAgICAgICAgICAgICAjIFRyeSBudW1iZXJzIG9mIHRoZSBmb3JtIG4gKiAyKipwMiAqIDEwKiplLCBwMiA+PSAwLAorICAgICAgICAgICAgICAgICMgdW50aWwgbiAqIDIqKnAyIGhhcyBtb3JlIHRoYW4gMjAgc2lnbmlmaWNhbnQgZGlnaXRzLgorICAgICAgICAgICAgICAgIGRpZ2l0cywgZXhwb25lbnQgPSBuLCBlCisgICAgICAgICAgICAgICAgd2hpbGUgZGlnaXRzIDwgMTAqKjIwOgorICAgICAgICAgICAgICAgICAgICBzID0gJ3t9ZXt9Jy5mb3JtYXQoZGlnaXRzLCBleHBvbmVudCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdHJ0b2QocykKKyAgICAgICAgICAgICAgICAgICAgIyBTYW1lIGFnYWluLCBidXQgd2l0aCBleHRyYSB0cmFpbGluZyB6ZXJvcy4KKyAgICAgICAgICAgICAgICAgICAgcyA9ICd7fWV7fScuZm9ybWF0KGRpZ2l0cyAqIDEwKio0MCwgZXhwb25lbnQgLSA0MCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdHJ0b2QocykKKyAgICAgICAgICAgICAgICAgICAgZGlnaXRzICo9IDIKKworICAgICAgICAgICAgICAgICMgVHJ5IG51bWJlcnMgb2YgdGhlIGZvcm0gbiAqIDUqKnAyICogMTAqKihlIC0gcDUpLCBwNQorICAgICAgICAgICAgICAgICMgPj0gMCwgd2l0aCBuICogNSoqcDUgPCAxMCoqMjAuCisgICAgICAgICAgICAgICAgZGlnaXRzLCBleHBvbmVudCA9IG4sIGUKKyAgICAgICAgICAgICAgICB3aGlsZSBkaWdpdHMgPCAxMCoqMjA6CisgICAgICAgICAgICAgICAgICAgIHMgPSAne31le30nLmZvcm1hdChkaWdpdHMsIGV4cG9uZW50KQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorICAgICAgICAgICAgICAgICAgICAjIFNhbWUgYWdhaW4sIGJ1dCB3aXRoIGV4dHJhIHRyYWlsaW5nIHplcm9zLgorICAgICAgICAgICAgICAgICAgICBzID0gJ3t9ZXt9Jy5mb3JtYXQoZGlnaXRzICogMTAqKjQwLCBleHBvbmVudCAtIDQwKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorICAgICAgICAgICAgICAgICAgICBkaWdpdHMgKj0gNQorICAgICAgICAgICAgICAgICAgICBleHBvbmVudCAtPSAxCisKKyAgICBkZWYgdGVzdF9oYWxmd2F5X2Nhc2VzKHNlbGYpOgorICAgICAgICAjIHRlc3QgaGFsZndheSBjYXNlcyBmb3IgdGhlIHJvdW5kLWhhbGYtdG8tZXZlbiBydWxlCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDAgKiBURVNUX1NJWkUpOgorICAgICAgICAgICAgIyBiaXQgcGF0dGVybiBmb3IgYSByYW5kb20gZmluaXRlIHBvc2l0aXZlIChvciArMC4wKSBmbG9hdAorICAgICAgICAgICAgYml0cyA9IHJhbmRvbS5yYW5kcmFuZ2UoMjA0NyoyKio1MikKKworICAgICAgICAgICAgIyBjb252ZXJ0IGJpdCBwYXR0ZXJuIHRvIGEgbnVtYmVyIG9mIHRoZSBmb3JtIG0gKiAyKiplCisgICAgICAgICAgICBlLCBtID0gZGl2bW9kKGJpdHMsIDIqKjUyKQorICAgICAgICAgICAgaWYgZToKKyAgICAgICAgICAgICAgICBtLCBlID0gbSArIDIqKjUyLCBlIC0gMQorICAgICAgICAgICAgZSAtPSAxMDc0CisKKyAgICAgICAgICAgICMgYWRkIDAuNSB1bHBzCisgICAgICAgICAgICBtLCBlID0gMiptICsgMSwgZSAtIDEKKworICAgICAgICAgICAgIyBjb252ZXJ0IHRvIGEgZGVjaW1hbCBzdHJpbmcKKyAgICAgICAgICAgIGlmIGUgPj0gMDoKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSBtIDw8IGUKKyAgICAgICAgICAgICAgICBleHBvbmVudCA9IDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBtICogMioqZSA9IChtICogNSoqLWUpICogMTAqKmUKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSBtICogNSoqLWUKKyAgICAgICAgICAgICAgICBleHBvbmVudCA9IGUKKyAgICAgICAgICAgIHMgPSAne31le30nLmZvcm1hdChkaWdpdHMsIGV4cG9uZW50KQorICAgICAgICAgICAgc2VsZi5jaGVja19zdHJ0b2QocykKKworICAgIGRlZiB0ZXN0X2JvdW5kYXJpZXMoc2VsZik6CisgICAgICAgICMgYm91bmRhcmllcyBleHByZXNzZWQgYXMgdHJpcGxlcyAobiwgZSwgdSksIHdoZXJlCisgICAgICAgICMgbioxMCoqZSBpcyBhbiBhcHByb3hpbWF0aW9uIHRvIHRoZSBib3VuZGFyeSB2YWx1ZSBhbmQKKyAgICAgICAgIyB1KjEwKiplIGlzIDF1bHAKKyAgICAgICAgYm91bmRhcmllcyA9IFsKKyAgICAgICAgICAgICgxMDAwMDAwMDAwMDAwMDAwMDAwMCwgLTE5LCAxMTEwKSwgICAjIGEgcG93ZXIgb2YgMiBib3VuZGFyeSAoMS4wKQorICAgICAgICAgICAgKDE3OTc2OTMxMzQ4NjIzMTU5MDc3LCAyODksIDE5OTUpLCAgICMgb3ZlcmZsb3cgYm91bmRhcnkgKDIuKioxMDI0KQorICAgICAgICAgICAgKDIyMjUwNzM4NTg1MDcyMDEzODMxLCAtMzI3LCA0OTQxKSwgICMgbm9ybWFsL3N1Ym5vcm1hbCAoMi4qKi0xMDIyKQorICAgICAgICAgICAgKDAsIC0zMjcsIDQ5NDEpLCAgICAgICAgICAgICAgICAgICAgICMgemVybworICAgICAgICAgICAgXQorICAgICAgICBmb3IgbiwgZSwgdSBpbiBib3VuZGFyaWVzOgorICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKDEwMDApOgorICAgICAgICAgICAgICAgIGRpZ2l0cyA9IG4gKyByYW5kb20ucmFuZHJhbmdlKC0zKnUsIDMqdSkKKyAgICAgICAgICAgICAgICBleHBvbmVudCA9IGUKKyAgICAgICAgICAgICAgICBzID0gJ3t9ZXt9Jy5mb3JtYXQoZGlnaXRzLCBleHBvbmVudCkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorICAgICAgICAgICAgICAgIG4gKj0gMTAKKyAgICAgICAgICAgICAgICB1ICo9IDEwCisgICAgICAgICAgICAgICAgZSAtPSAxCisKKyAgICBkZWYgdGVzdF91bmRlcmZsb3dfYm91bmRhcnkoc2VsZik6CisgICAgICAgICMgdGVzdCB2YWx1ZXMgY2xvc2UgdG8gMioqLTEwNzUsIHRoZSB1bmRlcmZsb3cgYm91bmRhcnk7IHNpbWlsYXIKKyAgICAgICAgIyB0byBib3VuZGFyeV90ZXN0cywgZXhjZXB0IHRoYXQgdGhlIHJhbmRvbSBlcnJvciBkb2Vzbid0IHNjYWxlCisgICAgICAgICMgd2l0aCBuCisgICAgICAgIGZvciBleHBvbmVudCBpbiB4cmFuZ2UoLTQwMCwgLTMyMCk6CisgICAgICAgICAgICBiYXNlID0gMTAqKi1leHBvbmVudCAvLyAyKioxMDc1CisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoVEVTVF9TSVpFKToKKyAgICAgICAgICAgICAgICBkaWdpdHMgPSBiYXNlICsgcmFuZG9tLnJhbmRyYW5nZSgtMTAwMCwgMTAwMCkKKyAgICAgICAgICAgICAgICBzID0gJ3t9ZXt9Jy5mb3JtYXQoZGlnaXRzLCBleHBvbmVudCkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorCisgICAgZGVmIHRlc3RfYmlnY29tcChzZWxmKToKKyAgICAgICAgZm9yIG5kaWdzIGluIDUsIDEwLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgNDAsIDQxLCA1MDoKKyAgICAgICAgICAgIGRpZzEwID0gMTAqKm5kaWdzCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAgKiBURVNUX1NJWkUpOgorICAgICAgICAgICAgICAgIGRpZ2l0cyA9IHJhbmRvbS5yYW5kcmFuZ2UoZGlnMTApCisgICAgICAgICAgICAgICAgZXhwb25lbnQgPSByYW5kb20ucmFuZHJhbmdlKC00MDAsIDQwMCkKKyAgICAgICAgICAgICAgICBzID0gJ3t9ZXt9Jy5mb3JtYXQoZGlnaXRzLCBleHBvbmVudCkKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX3N0cnRvZChzKQorCisgICAgZGVmIHRlc3RfcGFyc2luZyhzZWxmKToKKyAgICAgICAgIyBtYWtlICcwJyBtb3JlIGxpa2VseSB0byBiZSBjaG9zZW4gdGhhbiBvdGhlciBkaWdpdHMKKyAgICAgICAgZGlnaXRzID0gJzAwMDAwMDEyMzQ1Njc4OScKKyAgICAgICAgc2lnbnMgPSAoJysnLCAnLScsICcnKQorCisgICAgICAgICMgcHV0IHRvZ2V0aGVyIHJhbmRvbSBzaG9ydCB2YWxpZCBzdHJpbmdzCisgICAgICAgICMgXGQqWy5cZCpdP2UKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMDApOgorICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKFRFU1RfU0laRSk6CisgICAgICAgICAgICAgICAgcyA9IHJhbmRvbS5jaG9pY2Uoc2lnbnMpCisgICAgICAgICAgICAgICAgaW50cGFydF9sZW4gPSByYW5kb20ucmFuZHJhbmdlKDUpCisgICAgICAgICAgICAgICAgcyArPSAnJy5qb2luKHJhbmRvbS5jaG9pY2UoZGlnaXRzKSBmb3IgXyBpbiB4cmFuZ2UoaW50cGFydF9sZW4pKQorICAgICAgICAgICAgICAgIGlmIHJhbmRvbS5jaG9pY2UoW1RydWUsIEZhbHNlXSk6CisgICAgICAgICAgICAgICAgICAgIHMgKz0gJy4nCisgICAgICAgICAgICAgICAgICAgIGZyYWNwYXJ0X2xlbiA9IHJhbmRvbS5yYW5kcmFuZ2UoNSkKKyAgICAgICAgICAgICAgICAgICAgcyArPSAnJy5qb2luKHJhbmRvbS5jaG9pY2UoZGlnaXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIF8gaW4geHJhbmdlKGZyYWNwYXJ0X2xlbikpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZnJhY3BhcnRfbGVuID0gMAorICAgICAgICAgICAgICAgIGlmIHJhbmRvbS5jaG9pY2UoW1RydWUsIEZhbHNlXSk6CisgICAgICAgICAgICAgICAgICAgIHMgKz0gcmFuZG9tLmNob2ljZShbJ2UnLCAnRSddKQorICAgICAgICAgICAgICAgICAgICBzICs9IHJhbmRvbS5jaG9pY2Uoc2lnbnMpCisgICAgICAgICAgICAgICAgICAgIGV4cG9uZW50X2xlbiA9IHJhbmRvbS5yYW5kcmFuZ2UoMSwgNCkKKyAgICAgICAgICAgICAgICAgICAgcyArPSAnJy5qb2luKHJhbmRvbS5jaG9pY2UoZGlnaXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIF8gaW4geHJhbmdlKGV4cG9uZW50X2xlbikpCisKKyAgICAgICAgICAgICAgICBpZiBpbnRwYXJ0X2xlbiArIGZyYWNwYXJ0X2xlbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jaGVja19zdHJ0b2QocykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdChzKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCBGYWxzZSwgImV4cGVjdGVkIFZhbHVlRXJyb3IiCisKKyAgICBkZWYgdGVzdF9wYXJ0aWN1bGFyKHNlbGYpOgorICAgICAgICAjIGlucHV0cyB0aGF0IHByb2R1Y2VkIGNyYXNoZXMgb3IgaW5jb3JyZWN0bHkgcm91bmRlZCByZXN1bHRzIHdpdGgKKyAgICAgICAgIyBwcmV2aW91cyB2ZXJzaW9ucyBvZiBkdG9hLmMsIGZvciB2YXJpb3VzIHJlYXNvbnMKKyAgICAgICAgdGVzdF9zdHJpbmdzID0gWworICAgICAgICAgICAgIyBpc3N1ZSA3NjMyIGJ1ZyAxLCBvcmlnaW5hbGx5IHJlcG9ydGVkIGZhaWxpbmcgY2FzZQorICAgICAgICAgICAgJzIxODMxNjcwMTIzMTIxMTIzMTIzMTIuMjM1MzgwMjAzNzQ0MjA0NDYxOTJlLTM3MCcsCisgICAgICAgICAgICAjIDUgaW5zdGFuY2VzIG9mIGlzc3VlIDc2MzIgYnVnIDIKKyAgICAgICAgICAgICcxMjU3OTgxNjA0OTAwODMwNTU0Njk3NDM5MTc2ODk5NjM2OTQ2NDk2MzAyNDY2MzEwNGUtMzU3JywKKyAgICAgICAgICAgICcxNzQ4OTYyODU2NTIwMjExNzI2MzE0NTM2NzU5NjAyODM4OTM0ODkyMjk4MTg1NzAxM2UtMzU3JywKKyAgICAgICAgICAgICcxODQ4NzM5ODc4NTk5MTk5NDYzNDE4MjkxNjYzODU0MjY4MDc1OTYxMzU5MDQ4MjI3M2UtMzU3JywKKyAgICAgICAgICAgICczMjAwMjg2NDIwMDU4MTAzMzEzNDM1ODcyNDY3NTE5ODA0NDUyNzQ2OTM2Njc3MzkyOGUtMzU4JywKKyAgICAgICAgICAgICc5NDM5MzQzMTE5MzE4MDY5Njk0Mjg0MTgzNzA4NTAzMzY0NzkxMzIyNDE0ODUzOTg1NGUtMzU4JywKKyAgICAgICAgICAgICc3MzYwODI3ODk5ODk2Njk2OTM0NTgyNDY1MzUwMDEzNjc4Nzg3NjQzNjAwNTk1Nzk1M2UtMzU4JywKKyAgICAgICAgICAgICc2NDc3NDQ3ODgzNjQxNzI5OTQ5MTcxODQzNTIzNDYxMTI5OTMzNjI4ODA4MjEzNjA1NGUtMzU4JywKKyAgICAgICAgICAgICcxMzcwNDk0MDEzNDEyNjU3NDUzNDg3ODY0MTg3Njk0Nzk4MDg3ODgyNDY4ODQ1MTE2OWUtMzU3JywKKyAgICAgICAgICAgICc0NjY5NzQ0NTc3NDA0NzA2MDk2MDYyNDQ5Nzk2NDQyNTQxNjYxMDQ4MDUyNDc2MDQ3MWUtMzU4JywKKyAgICAgICAgICAgICMgZmFpbGluZyBjYXNlIGZvciBidWcgaW50cm9kdWNlZCBieSBNRVREIGluIHI3NzQ1MSAoYXR0ZW1wdGVkCisgICAgICAgICAgICAjIGZpeCBmb3IgaXNzdWUgNzYzMiwgYnVnIDIpLCBhbmQgZml4ZWQgaW4gcjc3NDgyLgorICAgICAgICAgICAgJzI4NjM5MDk3MTc4MjYxNzYzMTc4NDg5NzU5MTA3MzIxMzkyNzQ1MTA4NDkxODI1MzAzZS0zMTEnLAorICAgICAgICAgICAgIyB0d28gbnVtYmVycyBkZW1vbnN0cmF0aW5nIGEgZmxhdyBpbiB0aGUgYmlnY29tcCAnZGlnID09IDAnCisgICAgICAgICAgICAjIGNvcnJlY3Rpb24gYmxvY2sgKGlzc3VlIDc2MzIsIGJ1ZyAzKQorICAgICAgICAgICAgJzEuMDAwMDAwMDAwMDAwMDAwMDFlNDQnLAorICAgICAgICAgICAgJzEuMDAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMWU0NCcsCisgICAgICAgICAgICAjIGR0b2EuYyBidWcgZm9yIG51bWJlcnMganVzdCBzbWFsbGVyIHRoYW4gYSBwb3dlciBvZiAyIChpc3N1ZQorICAgICAgICAgICAgIyA3NjMyLCBidWcgNCkKKyAgICAgICAgICAgICc5OTk5OTk5OTk5OTk5OTk5NDQ4NzY2NTQ2NTU1NDc2MDcxNzAzOTUzMjU3ODU0NmUtNDcnLAorICAgICAgICAgICAgIyBmYWlsaW5nIGNhc2UgZm9yIG9mZi1ieS1vbmUgZXJyb3IgaW50cm9kdWNlZCBieSBNRVREIGluCisgICAgICAgICAgICAjIHI3NzQ4MyAoZHRvYS5jIGNsZWFudXApLCBmaXhlZCBpbiByNzc0OTAKKyAgICAgICAgICAgICc5NjU0MzcxNzYzMzM2NTQ5MzE3OTkwMzU1MTM2NzE5OTcxMTgzNDU1NzAwNDU5MTQ0NjknICMuLi4KKyAgICAgICAgICAgICc2MjEzNDEzMzUwODIxNDE2MzEyMTk0NDIwMDA3OTkxMzA2OTA4NDcwMTQ3MzIyMDIwMTIxMDE4MzY4ZTAnLAorICAgICAgICAgICAgIyBpbmNvcnJlY3QgbHNiIGRldGVjdGlvbiBmb3Igcm91bmQtaGFsZi10by1ldmVuIHdoZW4KKyAgICAgICAgICAgICMgYmMtPnNjYWxlICE9IDAgKGlzc3VlIDc2MzIsIGJ1ZyA2KS4KKyAgICAgICAgICAgICcxMDQzMDg0ODUyNDE5ODM5OTA2NjY3MTM0MDE3MDgwNzIxNzU3NzMxNjUwMzQyNzg2ODUnICMuLi4KKyAgICAgICAgICAgICc2ODI2NDYxMTE3NjIyOTI0MDkzMzA5Mjg3Mzk3NTE3MDI0MDQ2NTgxOTc4NzIzMTkxMjknICMuLi4KKyAgICAgICAgICAgICcwMzY1MTk5NDc0MzUzMTk0MTgzODc4Mzk3NTg5OTA0Nzg1NDk0Nzc3Nzc1ODY2NzMwNzUnICMuLi4KKyAgICAgICAgICAgICc5NDU4NDQ4OTU5ODEwMTIwMjQzODc5OTIxMzU2MTcwNjQ1MzIxNDE0ODkyNzg4MTUyMzknICMuLi4KKyAgICAgICAgICAgICc4NDkxMDgxMDU5NTE2MTk5OTc4MjkxNTM2MzM1MzUzMTQ4NDk5OTk2NzQyNjYxNjkyNTgnICMuLi4KKyAgICAgICAgICAgICc5Mjg5NDA2OTIyMzk2ODQ3NzE1OTAwNjUwMjcwMjU4MzU4MDQ4NjM1ODU0NTQ4NzI0OTknICMuLi4KKyAgICAgICAgICAgICczMjA1MDAwMjMxMjYxNDI1NTM5MzI2NTQzNzAzNjIwMjQxMDQ0NjIyNTUyNDQwMzQwNTMnICMuLi4KKyAgICAgICAgICAgICcyMDM5OTg5NjQzNjA4ODI0ODczNzgzMzQ4NjAxOTc3MjUxMzkxNTEyNjU1OTA4MzI4ODcnICMuLi4KKyAgICAgICAgICAgICc0MzM3MzYxODk0Njg4NTg2MTQ1MjE3MDg1Njc2NDY3NDM0NTU2MDE5MDU5MzU1OTUzODEnICMuLi4KKyAgICAgICAgICAgICc4NTI3MjM3MjM2NDU3OTk4NjY2NzI1NTg1NzY5OTM5NzgwMjUwMzM1OTA3Mjg2ODcyMDYnICMuLi4KKyAgICAgICAgICAgICcyOTYzNzk4MDEzNjMwMjQwOTQwNDgzMjcyNzM5MTMwNzk2MTI0Njk5ODI1ODU2NzQ4MjQnICMuLi4KKyAgICAgICAgICAgICcxNTYwMDA3ODMxNjc5NjMwODE2MTYyMTQ3MTA2OTE3NTk4NjQzMzIzMzkyMzk2ODg3MzQnICMuLi4KKyAgICAgICAgICAgICc2NTY1NDg3OTA2NTY0ODY2NDYxMDY5ODM0NTA4MDkwNzM3NTA1MzU2MjQ4OTQyOTYyNDInICMuLi4KKyAgICAgICAgICAgICcwNzIwMTAxOTU3MTAyNzYwNzMwNDIwMzY0MjU1Nzk4NTI0NTk1NTYxODM1NDExOTkwMTInICMuLi4KKyAgICAgICAgICAgICc2NTI1NzExMjM4OTg5OTY1NzQ1NjM4MjQ0MjQzMzA5NjAwMjc4NzM1MTYwODI3NjM2NzE4NzVlLTEwNzUnLAorICAgICAgICAgICAgIyBkZW1vbnN0cmF0aW9uIHRoYXQgb3JpZ2luYWwgZml4IGZvciBpc3N1ZSA3NjMyIGJ1ZyAxIHdhcworICAgICAgICAgICAgIyBidWdneTsgdGhlIGV4aXQgY29uZGl0aW9uIHdhcyB0b28gc3Ryb25nCisgICAgICAgICAgICAnMjQ3MDMyODIyOTIwNjIzMjk1ZS0zNDEnLAorICAgICAgICAgICAgIyBkZW1vbnN0cmF0ZSBzaW1pbGFyIHByb2JsZW0gdG8gaXNzdWUgNzYzMiBidWcxOiBjcmFzaAorICAgICAgICAgICAgIyB3aXRoICdvdmVyc2l6ZWQgcXVvdGllbnQgaW4gcXVvcmVtJyBtZXNzYWdlLgorICAgICAgICAgICAgJzk5MDM3NDg1NzAwMjQ1NjgzMTAyODA1MDQzNDM3MzQ2OTY1MjQ4MDI5NjAxMjg2NDMxZS0zNzMnLAorICAgICAgICAgICAgJzk5NjE3NjM5ODMzNzQzODYzMTYxMTA5OTYxMTYyODgxMDI3NDA2NzY5NTEwNTU4NDU3ZS0zNzMnLAorICAgICAgICAgICAgJzk4ODUyOTE1MDI1NzY5MzQ1Mjk1NzQ5Mjc4MzUxNTYzMTc5ODQwMTMwNTY1NTkxNDYyZS0zNzInLAorICAgICAgICAgICAgJzk5MDU5OTQ0ODI3NjkzNTY5NjU5MTUzMDQyNzY5NjkwOTMwOTA1MTQ4MDE1ODc2Nzg4ZS0zNzMnLAorICAgICAgICAgICAgJzk4OTE0OTc5MjA1MDY5MzY4MjcwNDIxODI5ODg5MDc4MzU2MjU0MDU5NzYwMzI3MTAxZS0zNzInLAorICAgICAgICAgICAgIyBpc3N1ZSA3NjMyIGJ1ZyA1OiB0aGUgZm9sbG93aW5nIDIgc3RyaW5ncyBjb252ZXJ0IGRpZmZlcmVudGx5CisgICAgICAgICAgICAnMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGUtMTYnLAorICAgICAgICAgICAgJzEwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwZS0xNycsCisgICAgICAgICAgICAjIGlzc3VlIDc2MzIgYnVnIDcKKyAgICAgICAgICAgICc5OTE2MzM3OTMxODkxNTA3MjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBlLTMzJywKKyAgICAgICAgICAgICMgQW5kIGFub3RoZXIsIHNpbWlsYXIsIGZhaWxpbmcgaGFsZndheSBjYXNlCisgICAgICAgICAgICAnNDEwNjI1MDE5ODAzOTQ5MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGUtMzgnLAorICAgICAgICAgICAgIyBpc3N1ZSA3NjMyIGJ1ZyA4OiAgdGhlIGZvbGxvd2luZyBwcm9kdWNlZCAxMC4wCisgICAgICAgICAgICAnMTAuOTAwMDAwMDAwMDAwMDAwMDEyMzQ1Njc4OTEyMzQ1Njc4OTEyMzQ1JywKKworICAgICAgICAgICAgIyB0d28gaHVtb25nb3VzIHZhbHVlcyBmcm9tIGlzc3VlIDc3NDMKKyAgICAgICAgICAgICcxMTY1MTI4NzQ5NDA1OTQxOTU2Mzg2MTc5MDcwOTI1Njk4ODE1MTkwMzQ3OTMyMjkzODUnICMuLi4KKyAgICAgICAgICAgICcyMjg1NjkxNjUxOTE1NDE4OTA4NDY1NjQ2Njk3NzE3MTQ4OTY5MTYwODQ4ODM5ODc5MjAnICMuLi4KKyAgICAgICAgICAgICc0NzMzMjEyNjgxMDAyOTY4NTc2MzYyMDA5MjYwNjUzNDA3Njk2ODI4NjMzNDkyMDUzNjMnICMuLi4KKyAgICAgICAgICAgICczNDkyNDc2Mzc2NjA2NzE3ODMyMDk5MDc5NDkyNzM2ODMwNDAzOTc5Nzk5ODQxMDc4MDYnICMuLi4KKyAgICAgICAgICAgICc0NjE4MjI2OTMzMzI3MTI4MjgzOTc2MTc5NDYwMzYyMzk1ODE2MzI5NzY1ODUxMDA2MzMnICMuLi4KKyAgICAgICAgICAgICc1MjAyNjA3NzA3NjEwNjA3MjU0MDM5MDQxMjMxNDQzODQ1NzE2MTIwNzM3MzI3NTQ3NzQnICMuLi4KKyAgICAgICAgICAgICc1ODgyMTE5NDQ0MDY0NjU1NzI1OTEwMjIwODE5NzM4Mjg0NDg5MjczMzg2MDI1NTYyODcnICMuLi4KKyAgICAgICAgICAgICc4NTE4MzE3NDU0MTkzOTc0MzMwMTI0OTE4ODQ4Njk0NTQ0NjI0NDA1MzY4OTUwNDc0OTknICMuLi4KKyAgICAgICAgICAgICc0MzY1NTE5NzQ2NDk3MzE5MTcxNzAwOTkzODc3NjI4NzEwMjA0MDM1ODI5OTQxOTM0MzknICMuLi4KKyAgICAgICAgICAgICc3NjE5MzM0MTIxNjY4MjE0ODQwMTU4ODM2MzE2MjI1MzkzMTQyMDM3OTkwMzQ0OTc5ODInICMuLi4KKyAgICAgICAgICAgICcxMzAwMzg3NDE3NDE3Mjc5MDc0Mjk1NzU2NzMzMDI0NjEzODAzODY1OTY1MDExODc0ODInICMuLi4KKyAgICAgICAgICAgICcwMDYyNTc1Mjc3MDk4NDIxNzkzMzY0ODgzODE2NzI4MTg3OTg0NTAyMjkzMzkxMjM1MjcnICMuLi4KKyAgICAgICAgICAgICc4NTg4NDQ0NDgzMzY4MTU5MTIwMjA0NTIyOTQ2MjQ5MTY5OTM1NDYzODg5NTY1NjE1MjInICMuLi4KKyAgICAgICAgICAgICcxNjE4NzUzNTI1NzI1OTA0MjA4MjM2MDc0Nzg3ODgzOTk0NjAxNjIyMjgzMDg2OTM3NDInICMuLi4KKyAgICAgICAgICAgICcwNTI4NzY2MzQ0MTQwMzUzMzk0ODIwNDA4NTM5MDg5ODM5OTA1NTAwNDExOTg3MzA0Njg3NWUtMTA3NScsCisKKyAgICAgICAgICAgICc1MjU0NDA2NTMzNTI5NTUyNjYxMDk2NjEwNjAzNTgyMDI4MTk1NjEyNTg5ODQ5NjQ5MTMnICMuLi4KKyAgICAgICAgICAgICc4OTIyNTY1Mjc4NDk3NTg5NTYwNDUyMTgyNTcwNTk3MTM3NjU4NzQyNTE0MzYxOTM2MTknICMuLi4KKyAgICAgICAgICAgICc0NDMyNDgyMDU5OTg4NzAwMDE2MzM4NjU2NTc1MTc0NDczNTU5OTIyMjU4NTI5NDU5MTInICMuLi4KKyAgICAgICAgICAgICcwMTY2Njg2NjAwMDAyMTAyODM4MDcyMDk4NTA2NjIyMjQ0MTc1MDQ3NTIyNjQ5OTUzNjAnICMuLi4KKyAgICAgICAgICAgICc2MzE1MTIwMDc3NTM4NTU4MDEwNzUzNzMwNTc2MzIxNTc3Mzg3NTI4MDA4NDAzMDI1OTYnICMuLi4KKyAgICAgICAgICAgICcyMzcwNTAyNDc5MTA1MzA1MzgyNTAwMDg2ODIyNzI3ODM2NjA3NzgxODE2MjgwNDA3MzMnICMuLi4KKyAgICAgICAgICAgICc2NTMxMjE0OTI0MzY0MDg4MTI2NjgwMjM0NzgwMDEyMDg1MjkxOTAzNTkyNTQzMjIzNDAnICMuLi4KKyAgICAgICAgICAgICczOTc1NzUxODUyNDg4NDQ3ODg1MTU0MTA3MjI5NTg3ODQ2NDA5MjY1Mjg1NDQwNDMwOTAnICMuLi4KKyAgICAgICAgICAgICcxMTUzNTI1MTM2NDA4ODQ5ODgwMTczNDI0NjkyNzUwMDY5OTkxMDQ1MTk2MjA5NDY0MzAnICMuLi4KKyAgICAgICAgICAgICc4MTg3NjcxNDc5NjY0OTU0ODU0MDY1Nzc3MDM5NzI2ODc4MzgxNzY3Nzg5OTM0NzI5ODknICMuLi4KKyAgICAgICAgICAgICc1NjE5NTkwMDAwNDcwMzY2Mzg5MzgzOTYzMzMxNDY2ODUxMzc5MDMwMTgzNzY0OTY0MDgnICMuLi4KKyAgICAgICAgICAgICczMTk3MDUzMzM4Njg0NzY5MjUyOTczMTcxMzY1MTM5NzAxODkwNzM2OTMzMTQ3MTAzMTgnICMuLi4KKyAgICAgICAgICAgICc5OTEyNTI4MTEwNTA1MDE0NDgzMjY4NzUyMzI4NTA2MDA0NTE3NzYwOTEzMDMwNDM3MTUnICMuLi4KKyAgICAgICAgICAgICcxNTcxOTEyOTI4Mjc2MTQwNDY4NzY5NTAyMjU3MTQ3NDMxMTgyOTEwMzQ3ODA0NjYzMjUnICMuLi4KKyAgICAgICAgICAgICcwODUxNDEzNDM3MzQ1NjQ5MTUxOTM0MjY5OTQ1ODcyMDY0MzI2OTczMzcxMTgyMTE1MjcnICMuLi4KKyAgICAgICAgICAgICcyNzg5Njg3MzEyOTQ2MzkzNTMzNTQ3NzQ3ODg2MDI0Njc3OTUxNjc4NzUxMTc0ODE2NjAnICMuLi4KKyAgICAgICAgICAgICc0NzM4NzkxMjU2ODUzNjc1NjkwNTQzNjYzMjgzNzgyMjE1ODY2ODI1ZS0xMTgwJywKKworICAgICAgICAgICAgIyBleGVyY2lzZSBleGl0IGNvbmRpdGlvbnMgaW4gYmlnY29tcCBjb21wYXJpc29uIGxvb3AKKyAgICAgICAgICAgICcyNjAyMTI5Mjk4NDA0OTYzMDgzODMzODUzNDc5MTEzNTc3MjUzMTA1OTM5OTk1Njg4ZTInLAorICAgICAgICAgICAgJzI2MDIxMjkyOTg0MDQ5NjMwODM4MzM4NTM0NzkxMTM1NzcyNTMxMDU5Mzk5OTU2ODg5NmUwJywKKyAgICAgICAgICAgICcyNjAyMTI5Mjk4NDA0OTYzMDgzODMzODUzNDc5MTEzNTc3MjUzMTA1OTM5OTk1Njg4OTYwMWUtMicsCisgICAgICAgICAgICAnMjYwMjEyOTI5ODQwNDk2MzA4MzgzMzg1MzQ3OTExMzU3NzI1MzEwNTkzOTk5NTY4ODk1ZTAnLAorICAgICAgICAgICAgJzI2MDIxMjkyOTg0MDQ5NjMwODM4MzM4NTM0NzkxMTM1NzcyNTMxMDU5Mzk5OTU2ODg5N2UwJywKKyAgICAgICAgICAgICcyNjAyMTI5Mjk4NDA0OTYzMDgzODMzODUzNDc5MTEzNTc3MjUzMTA1OTM5OTk1Njg5OTZlMCcsCisgICAgICAgICAgICAnMjYwMjEyOTI5ODQwNDk2MzA4MzgzMzg1MzQ3OTExMzU3NzI1MzEwNTkzOTk5NTY4ODY2ZTAnLAorICAgICAgICAgICAgIyAyKio1MworICAgICAgICAgICAgJzkwMDcxOTkyNTQ3NDA5OTIuMDAnLAorICAgICAgICAgICAgIyAyKioxMDI0IC0gMioqOTcwOiAgZXhhY3Qgb3ZlcmZsb3cgYm91bmRhcnkuICBBbGwgdmFsdWVzCisgICAgICAgICAgICAjIHNtYWxsZXIgdGhhbiB0aGlzIHNob3VsZCByb3VuZCB0byBzb21ldGhpbmcgZmluaXRlOyAgYW55IHZhbHVlCisgICAgICAgICAgICAjIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIG9uZSBvdmVyZmxvd3MuCisgICAgICAgICAgICAnMTc5NzY5MzEzNDg2MjMxNTgwNzkzNzI4OTcxNDA1MzAzNDE1MDc5OTM0MTMyNzEwMDM3JyAjLi4uCisgICAgICAgICAgICAnODI2OTM2MTczNzc4OTgwNDQ0OTY4MjkyNzY0NzUwOTQ2NjQ5MDE3OTc3NTg3MjA3MDk2JyAjLi4uCisgICAgICAgICAgICAnMzMwMjg2NDE2NjkyODg3OTEwOTQ2NTU1NTQ3ODUxOTQwNDAyNjMwNjU3NDg4NjcxNTA1JyAjLi4uCisgICAgICAgICAgICAnODIwNjgxOTA4OTAyMDAwNzA4MzgzNjc2MjczODU0ODQ1ODE3NzExNTMxNzY0NDc1NzMwJyAjLi4uCisgICAgICAgICAgICAnMjcwMDY5ODU1NTcxMzY2OTU5NjIyODQyOTE0ODE5ODYwODM0OTM2NDc1MjkyNzE5MDc0JyAjLi4uCisgICAgICAgICAgICAnMTY4NDQ0MzY1NTEwNzA0MzQyNzExNTU5Njk5NTA4MDkzMDQyODgwMTc3OTA0MTc0NDk3NzkyJywKKyAgICAgICAgICAgICMgMioqMTAyNCAtIDIqKjk3MCAtIHRpbnkKKyAgICAgICAgICAgICcxNzk3NjkzMTM0ODYyMzE1ODA3OTM3Mjg5NzE0MDUzMDM0MTUwNzk5MzQxMzI3MTAwMzcnICMuLi4KKyAgICAgICAgICAgICc4MjY5MzYxNzM3Nzg5ODA0NDQ5NjgyOTI3NjQ3NTA5NDY2NDkwMTc5Nzc1ODcyMDcwOTYnICMuLi4KKyAgICAgICAgICAgICczMzAyODY0MTY2OTI4ODc5MTA5NDY1NTU1NDc4NTE5NDA0MDI2MzA2NTc0ODg2NzE1MDUnICMuLi4KKyAgICAgICAgICAgICc4MjA2ODE5MDg5MDIwMDA3MDgzODM2NzYyNzM4NTQ4NDU4MTc3MTE1MzE3NjQ0NzU3MzAnICMuLi4KKyAgICAgICAgICAgICcyNzAwNjk4NTU1NzEzNjY5NTk2MjI4NDI5MTQ4MTk4NjA4MzQ5MzY0NzUyOTI3MTkwNzQnICMuLi4KKyAgICAgICAgICAgICcxNjg0NDQzNjU1MTA3MDQzNDI3MTE1NTk2OTk1MDgwOTMwNDI4ODAxNzc5MDQxNzQ0OTc3OTEuOTk5JywKKyAgICAgICAgICAgICMgMioqMTAyNCAtIDIqKjk3MCArIHRpbnkKKyAgICAgICAgICAgICcxNzk3NjkzMTM0ODYyMzE1ODA3OTM3Mjg5NzE0MDUzMDM0MTUwNzk5MzQxMzI3MTAwMzcnICMuLi4KKyAgICAgICAgICAgICc4MjY5MzYxNzM3Nzg5ODA0NDQ5NjgyOTI3NjQ3NTA5NDY2NDkwMTc5Nzc1ODcyMDcwOTYnICMuLi4KKyAgICAgICAgICAgICczMzAyODY0MTY2OTI4ODc5MTA5NDY1NTU1NDc4NTE5NDA0MDI2MzA2NTc0ODg2NzE1MDUnICMuLi4KKyAgICAgICAgICAgICc4MjA2ODE5MDg5MDIwMDA3MDgzODM2NzYyNzM4NTQ4NDU4MTc3MTE1MzE3NjQ0NzU3MzAnICMuLi4KKyAgICAgICAgICAgICcyNzAwNjk4NTU1NzEzNjY5NTk2MjI4NDI5MTQ4MTk4NjA4MzQ5MzY0NzUyOTI3MTkwNzQnICMuLi4KKyAgICAgICAgICAgICcxNjg0NDQzNjU1MTA3MDQzNDI3MTE1NTk2OTk1MDgwOTMwNDI4ODAxNzc5MDQxNzQ0OTc3OTIuMDAxJywKKyAgICAgICAgICAgICMgMSAtIDIqKi01NCwgKy10aW55CisgICAgICAgICAgICAnOTk5OTk5OTk5OTk5OTk5OTQ0NDg4ODQ4NzY4NzQyMTcyOTc4ODE4NDE2NTk1NDU4OTg0Mzc1ZS01NCcsCisgICAgICAgICAgICAnOTk5OTk5OTk5OTk5OTk5OTQ0NDg4ODQ4NzY4NzQyMTcyOTc4ODE4NDE2NTk1NDU4OTg0Mzc0OTk5OTk5OWUtNTQnLAorICAgICAgICAgICAgJzk5OTk5OTk5OTk5OTk5OTk0NDQ4ODg0ODc2ODc0MjE3Mjk3ODgxODQxNjU5NTQ1ODk4NDM3NTAwMDAwMDFlLTU0JywKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHMgaW4gdGVzdF9zdHJpbmdzOgorICAgICAgICAgICAgc2VsZi5jaGVja19zdHJ0b2QocykKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RydG9kVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ0b2QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNmZjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ0b2QucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnRvZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ0b2QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDljMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ0b2QucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTYxM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5CkBAIC0wLDAgKzEsNTgxIEBACitpbXBvcnQgb3MKK2ltcG9ydCBhcnJheQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3RydWN0CitpbXBvcnQgaW5zcGVjdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKGNoZWNrX3dhcm5pbmdzLCBjaGVja19weTNrX3dhcm5pbmdzKQorCitpbXBvcnQgc3lzCitJU0JJR0VORElBTiA9IHN5cy5ieXRlb3JkZXIgPT0gImJpZyIKK0lTMzJCSVQgPSBzeXMubWF4c2l6ZSA9PSAweDdmZmZmZmZmCisKK2ludGVnZXJfY29kZXMgPSAnYicsICdCJywgJ2gnLCAnSCcsICdpJywgJ0knLCAnbCcsICdMJywgJ3EnLCAnUScKKwordGVzdG1vZF9maWxlbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoX19maWxlX18pWzBdICsgJy5weScKKyMgTmF0aXZlICdxJyBwYWNraW5nIGlzbid0IGF2YWlsYWJsZSBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgQworIyBsb25nIGxvbmcgdHlwZS4KK3RyeToKKyAgICBzdHJ1Y3QucGFjaygncScsIDUpCitleGNlcHQgc3RydWN0LmVycm9yOgorICAgIEhBVkVfTE9OR19MT05HID0gRmFsc2UKK2Vsc2U6CisgICAgSEFWRV9MT05HX0xPTkcgPSBUcnVlCisKK2RlZiBzdHJpbmdfcmV2ZXJzZShzKToKKyAgICByZXR1cm4gIiIuam9pbihyZXZlcnNlZChzKSkKKworZGVmIGJpZ2VuZGlhbl90b19uYXRpdmUodmFsdWUpOgorICAgIGlmIElTQklHRU5ESUFOOgorICAgICAgICByZXR1cm4gdmFsdWUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gc3RyaW5nX3JldmVyc2UodmFsdWUpCisKK2NsYXNzIFN0cnVjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX2Zsb2F0X2NvZXJjZShzZWxmLCBmb3JtYXQsIG51bWJlcik6CisgICAgICAgICMgU0YgYnVnIDE1MzA1NTkuIHN0cnVjdC5wYWNrIHJhaXNlcyBUeXBlRXJyb3Igd2hlcmUgaXQgdXNlZAorICAgICAgICAjIHRvIGNvbnZlcnQuCisgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCIuKmludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykpIGFzIHc6CisgICAgICAgICAgICBnb3QgPSBzdHJ1Y3QucGFjayhmb3JtYXQsIG51bWJlcikKKyAgICAgICAgbGluZW5vID0gaW5zcGVjdC5jdXJyZW50ZnJhbWUoKS5mX2xpbmVubyAtIDEKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3LmZpbGVuYW1lLCB0ZXN0bW9kX2ZpbGVuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcubGluZW5vLCBsaW5lbm8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcud2FybmluZ3MpLCAxKQorICAgICAgICBleHBlY3RlZCA9IHN0cnVjdC5wYWNrKGZvcm1hdCwgaW50KG51bWJlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2lzYmlnZW5kaWFuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzdHJ1Y3QucGFjaygnPWknLCAxKVswXSA9PSBjaHIoMCkpLCBJU0JJR0VORElBTikKKworICAgIGRlZiB0ZXN0X2NvbnNpc3RlbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHN0cnVjdC5jYWxjc2l6ZSwgJ1onKQorCisgICAgICAgIHN6ID0gc3RydWN0LmNhbGNzaXplKCdpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeiAqIDMsIHN0cnVjdC5jYWxjc2l6ZSgnaWlpJykpCisKKyAgICAgICAgZm10ID0gJ2NieHh4eHh4aGhoaGlpbGxmZmQ/JworICAgICAgICBmbXQzID0gJzNjM2IxOHgxMmg2aTZsNmYzZDM/JworICAgICAgICBzeiA9IHN0cnVjdC5jYWxjc2l6ZShmbXQpCisgICAgICAgIHN6MyA9IHN0cnVjdC5jYWxjc2l6ZShmbXQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6ICogMywgc3ozKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgc3RydWN0LnBhY2ssICdpaWknLCAzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHN0cnVjdC5wYWNrLCAnaScsIDMsIDMsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHN0cnVjdC5lcnJvciksIHN0cnVjdC5wYWNrLCAnaScsICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBzdHJ1Y3QuZXJyb3IpLCBzdHJ1Y3QucGFjaywgJ1AnLCAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3RydWN0LmVycm9yLCBzdHJ1Y3QudW5wYWNrLCAnZCcsICdmbGFwJykKKyAgICAgICAgcyA9IHN0cnVjdC5wYWNrKCdpaScsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgc3RydWN0LnVucGFjaywgJ2lpaScsIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHN0cnVjdC5lcnJvciwgc3RydWN0LnVucGFjaywgJ2knLCBzKQorCisgICAgZGVmIHRlc3RfdHJhbnNpdGl2ZW5lc3Moc2VsZik6CisgICAgICAgIGMgPSAnYScKKyAgICAgICAgYiA9IDEKKyAgICAgICAgaCA9IDI1NQorICAgICAgICBpID0gNjU1MzUKKyAgICAgICAgbCA9IDY1NTM2CisgICAgICAgIGYgPSAzLjE0MTUKKyAgICAgICAgZCA9IDMuMTQxNQorICAgICAgICB0ID0gVHJ1ZQorCisgICAgICAgIGZvciBwcmVmaXggaW4gKCcnLCAnQCcsICc8JywgJz4nLCAnPScsICchJyk6CisgICAgICAgICAgICBmb3IgZm9ybWF0IGluICgneGNiaGlsZmQ/JywgJ3hjQkhJTGZkPycpOgorICAgICAgICAgICAgICAgIGZvcm1hdCA9IHByZWZpeCArIGZvcm1hdAorICAgICAgICAgICAgICAgIHMgPSBzdHJ1Y3QucGFjayhmb3JtYXQsIGMsIGIsIGgsIGksIGwsIGYsIGQsIHQpCisgICAgICAgICAgICAgICAgY3AsIGJwLCBocCwgaXAsIGxwLCBmcCwgZHAsIHRwID0gc3RydWN0LnVucGFjayhmb3JtYXQsIHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjcCwgYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJwLCBiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHAsIGgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpcCwgaSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxwLCBsKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KDEwMCAqIGZwKSwgaW50KDEwMCAqIGYpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50KDEwMCAqIGRwKSwgaW50KDEwMCAqIGQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHAsIHQpCisKKyAgICBkZWYgdGVzdF9uZXdfZmVhdHVyZXMoc2VsZik6CisgICAgICAgICMgVGVzdCBzb21lIG9mIHRoZSBuZXcgZmVhdHVyZXMgaW4gZGV0YWlsCisgICAgICAgICMgKGZvcm1hdCwgYXJndW1lbnQsIGJpZy1lbmRpYW4gcmVzdWx0LCBsaXR0bGUtZW5kaWFuIHJlc3VsdCwgYXN5bW1ldHJpYykKKyAgICAgICAgdGVzdHMgPSBbCisgICAgICAgICAgICAoJ2MnLCAnYScsICdhJywgJ2EnLCAwKSwKKyAgICAgICAgICAgICgneGMnLCAnYScsICdcMGEnLCAnXDBhJywgMCksCisgICAgICAgICAgICAoJ2N4JywgJ2EnLCAnYVwwJywgJ2FcMCcsIDApLAorICAgICAgICAgICAgKCdzJywgJ2EnLCAnYScsICdhJywgMCksCisgICAgICAgICAgICAoJzBzJywgJ2hlbGxvd29ybGQnLCAnJywgJycsIDEpLAorICAgICAgICAgICAgKCcxcycsICdoZWxsb3dvcmxkJywgJ2gnLCAnaCcsIDEpLAorICAgICAgICAgICAgKCc5cycsICdoZWxsb3dvcmxkJywgJ2hlbGxvd29ybCcsICdoZWxsb3dvcmwnLCAxKSwKKyAgICAgICAgICAgICgnMTBzJywgJ2hlbGxvd29ybGQnLCAnaGVsbG93b3JsZCcsICdoZWxsb3dvcmxkJywgMCksCisgICAgICAgICAgICAoJzExcycsICdoZWxsb3dvcmxkJywgJ2hlbGxvd29ybGRcMCcsICdoZWxsb3dvcmxkXDAnLCAxKSwKKyAgICAgICAgICAgICgnMjBzJywgJ2hlbGxvd29ybGQnLCAnaGVsbG93b3JsZCcrMTAqJ1wwJywgJ2hlbGxvd29ybGQnKzEwKidcMCcsIDEpLAorICAgICAgICAgICAgKCdiJywgNywgJ1w3JywgJ1w3JywgMCksCisgICAgICAgICAgICAoJ2InLCAtNywgJ1wzNzEnLCAnXDM3MScsIDApLAorICAgICAgICAgICAgKCdCJywgNywgJ1w3JywgJ1w3JywgMCksCisgICAgICAgICAgICAoJ0InLCAyNDksICdcMzcxJywgJ1wzNzEnLCAwKSwKKyAgICAgICAgICAgICgnaCcsIDcwMCwgJ1wwMDJcMjc0JywgJ1wyNzRcMDAyJywgMCksCisgICAgICAgICAgICAoJ2gnLCAtNzAwLCAnXDM3NUQnLCAnRFwzNzUnLCAwKSwKKyAgICAgICAgICAgICgnSCcsIDcwMCwgJ1wwMDJcMjc0JywgJ1wyNzRcMDAyJywgMCksCisgICAgICAgICAgICAoJ0gnLCAweDEwMDAwLTcwMCwgJ1wzNzVEJywgJ0RcMzc1JywgMCksCisgICAgICAgICAgICAoJ2knLCA3MDAwMDAwMCwgJ1wwMDQsXDAzNVwyMDAnLCAnXDIwMFwwMzUsXDAwNCcsIDApLAorICAgICAgICAgICAgKCdpJywgLTcwMDAwMDAwLCAnXDM3M1wzMjNcMzQyXDIwMCcsICdcMjAwXDM0MlwzMjNcMzczJywgMCksCisgICAgICAgICAgICAoJ0knLCA3MDAwMDAwMEwsICdcMDA0LFwwMzVcMjAwJywgJ1wyMDBcMDM1LFwwMDQnLCAwKSwKKyAgICAgICAgICAgICgnSScsIDB4MTAwMDAwMDAwTC03MDAwMDAwMCwgJ1wzNzNcMzIzXDM0MlwyMDAnLCAnXDIwMFwzNDJcMzIzXDM3MycsIDApLAorICAgICAgICAgICAgKCdsJywgNzAwMDAwMDAsICdcMDA0LFwwMzVcMjAwJywgJ1wyMDBcMDM1LFwwMDQnLCAwKSwKKyAgICAgICAgICAgICgnbCcsIC03MDAwMDAwMCwgJ1wzNzNcMzIzXDM0MlwyMDAnLCAnXDIwMFwzNDJcMzIzXDM3MycsIDApLAorICAgICAgICAgICAgKCdMJywgNzAwMDAwMDBMLCAnXDAwNCxcMDM1XDIwMCcsICdcMjAwXDAzNSxcMDA0JywgMCksCisgICAgICAgICAgICAoJ0wnLCAweDEwMDAwMDAwMEwtNzAwMDAwMDAsICdcMzczXDMyM1wzNDJcMjAwJywgJ1wyMDBcMzQyXDMyM1wzNzMnLCAwKSwKKyAgICAgICAgICAgICgnZicsIDIuMCwgJ0BcMDAwXDAwMFwwMDAnLCAnXDAwMFwwMDBcMDAwQCcsIDApLAorICAgICAgICAgICAgKCdkJywgMi4wLCAnQFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDAnLAorICAgICAgICAgICAgICAgICAgICAgICAnXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMEAnLCAwKSwKKyAgICAgICAgICAgICgnZicsIC0yLjAsICdcMzAwXDAwMFwwMDBcMDAwJywgJ1wwMDBcMDAwXDAwMFwzMDAnLCAwKSwKKyAgICAgICAgICAgICgnZCcsIC0yLjAsICdcMzAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDAwMCcsCisgICAgICAgICAgICAgICAgICAgICAgICdcMDAwXDAwMFwwMDBcMDAwXDAwMFwwMDBcMDAwXDMwMCcsIDApLAorICAgICAgICAgICAgICAgICgnPycsIDAsICdcMCcsICdcMCcsIDApLAorICAgICAgICAgICAgICAgICgnPycsIDMsICdcMScsICdcMScsIDEpLAorICAgICAgICAgICAgICAgICgnPycsIFRydWUsICdcMScsICdcMScsIDApLAorICAgICAgICAgICAgICAgICgnPycsIFtdLCAnXDAnLCAnXDAnLCAxKSwKKyAgICAgICAgICAgICAgICAoJz8nLCAoMSwpLCAnXDEnLCAnXDEnLCAxKSwKKyAgICAgICAgXQorCisgICAgICAgIGZvciBmbXQsIGFyZywgYmlnLCBsaWwsIGFzeSBpbiB0ZXN0czoKKyAgICAgICAgICAgIGZvciAoeGZtdCwgZXhwKSBpbiBbKCc+JytmbXQsIGJpZyksICgnIScrZm10LCBiaWcpLCAoJzwnK2ZtdCwgbGlsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCc9JytmbXQsIElTQklHRU5ESUFOIGFuZCBiaWcgb3IgbGlsKV06CisgICAgICAgICAgICAgICAgcmVzID0gc3RydWN0LnBhY2soeGZtdCwgYXJnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBleHApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ1Y3QuY2FsY3NpemUoeGZtdCksIGxlbihyZXMpKQorICAgICAgICAgICAgICAgIHJldiA9IHN0cnVjdC51bnBhY2soeGZtdCwgcmVzKVswXQorICAgICAgICAgICAgICAgIGlmIHJldiAhPSBhcmc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhc3kpCisKKyAgICBkZWYgdGVzdF9jYWxjc2l6ZShzZWxmKToKKyAgICAgICAgZXhwZWN0ZWRfc2l6ZSA9IHsKKyAgICAgICAgICAgICdiJzogMSwgJ0InOiAxLAorICAgICAgICAgICAgJ2gnOiAyLCAnSCc6IDIsCisgICAgICAgICAgICAnaSc6IDQsICdJJzogNCwKKyAgICAgICAgICAgICdsJzogNCwgJ0wnOiA0LAorICAgICAgICAgICAgJ3EnOiA4LCAnUSc6IDgsCisgICAgICAgICAgICB9CisKKyAgICAgICAgIyBzdGFuZGFyZCBpbnRlZ2VyIHNpemVzCisgICAgICAgIGZvciBjb2RlIGluIGludGVnZXJfY29kZXM6CisgICAgICAgICAgICBmb3IgYnl0ZW9yZGVyIGluICgnPScsICc8JywgJz4nLCAnIScpOgorICAgICAgICAgICAgICAgIGZvcm1hdCA9IGJ5dGVvcmRlcitjb2RlCisgICAgICAgICAgICAgICAgc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShmb3JtYXQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplLCBleHBlY3RlZF9zaXplW2NvZGVdKQorCisgICAgICAgICMgbmF0aXZlIGludGVnZXIgc2l6ZXMsIGV4Y2VwdCAncScgYW5kICdRJworICAgICAgICBmb3IgZm9ybWF0X3BhaXIgaW4gKCdiQicsICdoSCcsICdpSScsICdsTCcpOgorICAgICAgICAgICAgZm9yIGJ5dGVvcmRlciBpbiBbJycsICdAJ106CisgICAgICAgICAgICAgICAgc2lnbmVkX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoYnl0ZW9yZGVyICsgZm9ybWF0X3BhaXJbMF0pCisgICAgICAgICAgICAgICAgdW5zaWduZWRfc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShieXRlb3JkZXIgKyBmb3JtYXRfcGFpclsxXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25lZF9zaXplLCB1bnNpZ25lZF9zaXplKQorCisgICAgICAgICMgYm91bmRzIGZvciBuYXRpdmUgaW50ZWdlciBzaXplcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnYicpLCAxKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgyLCBzdHJ1Y3QuY2FsY3NpemUoJ2gnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoNCwgc3RydWN0LmNhbGNzaXplKCdsJykpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKHN0cnVjdC5jYWxjc2l6ZSgnaCcpLCBzdHJ1Y3QuY2FsY3NpemUoJ2knKSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoc3RydWN0LmNhbGNzaXplKCdpJyksIHN0cnVjdC5jYWxjc2l6ZSgnbCcpKQorCisgICAgICAgICMgdGVzdHMgZm9yIG5hdGl2ZSAncScgYW5kICdRJyB3aGVuIGFwcGxpY2FibGUKKyAgICAgICAgaWYgSEFWRV9MT05HX0xPTkc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnVjdC5jYWxjc2l6ZSgncScpLCBzdHJ1Y3QuY2FsY3NpemUoJ1EnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKDgsIHN0cnVjdC5jYWxjc2l6ZSgncScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoc3RydWN0LmNhbGNzaXplKCdsJyksIHN0cnVjdC5jYWxjc2l6ZSgncScpKQorCisgICAgZGVmIHRlc3RfaW50ZWdlcnMoc2VsZik6CisgICAgICAgICMgSW50ZWdlciB0ZXN0cyAoYkJoSGlJbExxUSkuCisgICAgICAgIGltcG9ydCBiaW5hc2NpaQorCisgICAgICAgIGNsYXNzIEludFRlc3Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0KToKKyAgICAgICAgICAgICAgICBzdXBlcihJbnRUZXN0ZXIsIHNlbGYpLl9faW5pdF9fKG1ldGhvZE5hbWU9J3Rlc3Rfb25lJykKKyAgICAgICAgICAgICAgICBzZWxmLmZvcm1hdCA9IGZvcm1hdAorICAgICAgICAgICAgICAgIHNlbGYuY29kZSA9IGZvcm1hdFstMV0KKyAgICAgICAgICAgICAgICBzZWxmLmRpcmVjdGlvbiA9IGZvcm1hdFs6LTFdCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZGlyZWN0aW9uIGluICgnJywgJ0AnLCAnPScsICc8JywgJz4nLCAnIScpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bnJlY29nbml6ZWQgcGFja2luZyBkaXJlY3Rpb246ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaXJlY3Rpb24pCisgICAgICAgICAgICAgICAgc2VsZi5ieXRlc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShmb3JtYXQpCisgICAgICAgICAgICAgICAgc2VsZi5iaXRzaXplID0gc2VsZi5ieXRlc2l6ZSAqIDgKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvZGUgaW4gdHVwbGUoJ2JoaWxxJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2lnbmVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLm1pbl92YWx1ZSA9IC0oMkwqKihzZWxmLmJpdHNpemUtMSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWF4X3ZhbHVlID0gMkwqKihzZWxmLmJpdHNpemUtMSkgLSAxCisgICAgICAgICAgICAgICAgZWxpZiBzZWxmLmNvZGUgaW4gdHVwbGUoJ0JISUxRJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2lnbmVkID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5taW5fdmFsdWUgPSAwCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWF4X3ZhbHVlID0gMkwqKnNlbGYuYml0c2l6ZSAtIDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bnJlY29nbml6ZWQgZm9ybWF0IGNvZGU6ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2RlKQorCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZiwgeCwgcGFjaz1zdHJ1Y3QucGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnBhY2s9c3RydWN0LnVucGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmhleGxpZnk9YmluYXNjaWkudW5oZXhsaWZ5KToKKworICAgICAgICAgICAgICAgIGZvcm1hdCA9IHNlbGYuZm9ybWF0CisgICAgICAgICAgICAgICAgaWYgc2VsZi5taW5fdmFsdWUgPD0geCA8PSBzZWxmLm1heF92YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25nKHgpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuc2lnbmVkIGFuZCB4IDwgMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkICs9IDFMIDw8IHNlbGYuYml0c2l6ZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChleHBlY3RlZCwgMCkKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSAnJXgnICUgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGV4cGVjdGVkKSAmIDE6CisgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9ICIwIiArIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gdW5oZXhsaWZ5KGV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9ICgiXHgwMCIgKiAoc2VsZi5ieXRlc2l6ZSAtIGxlbihleHBlY3RlZCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmRpcmVjdGlvbiA9PSAnPCcgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlyZWN0aW9uIGluICgnJywgJ0AnLCAnPScpIGFuZCBub3QgSVNCSUdFTkRJQU4pOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBzdHJpbmdfcmV2ZXJzZShleHBlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXhwZWN0ZWQpLCBzZWxmLmJ5dGVzaXplKQorCisgICAgICAgICAgICAgICAgICAgICMgUGFjayB3b3JrPworICAgICAgICAgICAgICAgICAgICBnb3QgPSBwYWNrKGZvcm1hdCwgeCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQorCisgICAgICAgICAgICAgICAgICAgICMgVW5wYWNrIHdvcms/CisgICAgICAgICAgICAgICAgICAgIHJldHJpZXZlZCA9IHVucGFjayhmb3JtYXQsIGdvdClbMF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCByZXRyaWV2ZWQpCisKKyAgICAgICAgICAgICAgICAgICAgIyBBZGRpbmcgYW55IGJ5dGUgc2hvdWxkIGNhdXNlIGEgInRvbyBiaWciIGVycm9yLgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoc3RydWN0LmVycm9yLCBUeXBlRXJyb3IpLCB1bnBhY2ssIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1x4MDEnICsgZ290KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgeCBpcyBvdXQgb2YgcmFuZ2UgLS0gdmVyaWZ5IHBhY2sgcmVhbGl6ZXMgdGhhdC4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IsIHN0cnVjdC5lcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2ssIGZvcm1hdCwgeCkKKworICAgICAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgICAgICBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlCisKKyAgICAgICAgICAgICAgICAjIENyZWF0ZSBhbGwgaW50ZXJlc3RpbmcgcG93ZXJzIG9mIDIuCisgICAgICAgICAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgZXhwIGluIHJhbmdlKHNlbGYuYml0c2l6ZSArIDMpOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKDFMIDw8IGV4cCkKKworICAgICAgICAgICAgICAgICMgQWRkIHNvbWUgcmFuZG9tIHZhbHVlcy4KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLmJpdHNpemUpOgorICAgICAgICAgICAgICAgICAgICB2YWwgPSAwTAorICAgICAgICAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShzZWxmLmJ5dGVzaXplKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgOCkgfCByYW5kcmFuZ2UoMjU2KQorICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHZhbCkKKworICAgICAgICAgICAgICAgICMgVmFsdWVzIGFic29yYmVkIGZyb20gb3RoZXIgdGVzdHMKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZXh0ZW5kKFszMDAsIDcwMDAwMCwgc3lzLm1heGludCo0XSkKKworICAgICAgICAgICAgICAgICMgVHJ5IGFsbCB0aG9zZSwgYW5kIHRoZWlyIG5lZ2F0aW9ucywgYW5kICstMSBmcm9tCisgICAgICAgICAgICAgICAgIyB0aGVtLiAgTm90ZSB0aGF0IHRoaXMgdGVzdHMgYWxsIHBvd2VyLW9mLTIKKyAgICAgICAgICAgICAgICAjIGJvdW5kYXJpZXMgaW4gcmFuZ2UsIGFuZCBhIGZldyBvdXQgb2YgcmFuZ2UsIHBsdXMKKyAgICAgICAgICAgICAgICAjICstKDIqKm4gKy0gMSkuCisgICAgICAgICAgICAgICAgZm9yIGJhc2UgaW4gdmFsdWVzOgorICAgICAgICAgICAgICAgICAgICBmb3IgdmFsIGluIC1iYXNlLCBiYXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGluY3IgaW4gLTEsIDAsIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHZhbCArIGluY3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfb25lKGludCh4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfb25lKGxvbmcoeCkpCisKKyAgICAgICAgICAgICAgICAjIFNvbWUgZXJyb3IgY2FzZXMuCisgICAgICAgICAgICAgICAgY2xhc3MgTm90QW5JbnROUyhvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA0MgorCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2xvbmdfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxNzI5TAorCisgICAgICAgICAgICAgICAgY2xhc3MgTm90QW5JbnRPUzoKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gODUKKworICAgICAgICAgICAgICAgICAgICBkZWYgX19sb25nX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE2M0wKKworICAgICAgICAgICAgICAgICMgT2JqZWN0cyB3aXRoIGFuICdfX2luZGV4X18nIG1ldGhvZCBzaG91bGQgYmUgYWxsb3dlZAorICAgICAgICAgICAgICAgICMgdG8gcGFjayBhcyBpbnRlZ2Vycy4gIFRoYXQgaXMgYXNzdW1pbmcgdGhlIGltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgIyAnX19pbmRleF9fJyBtZXRob2QgcmV0dXJucyBhbmQgJ2ludCcgb3IgJ2xvbmcnLgorICAgICAgICAgICAgICAgIGNsYXNzIEluZGV4YWJsZShvYmplY3QpOgorICAgICAgICAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdmFsdWUgPSB2YWx1ZQorCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdmFsdWUKKworICAgICAgICAgICAgICAgICMgSWYgdGhlICdfX2luZGV4X18nIG1ldGhvZCByYWlzZXMgYSB0eXBlIGVycm9yLCB0aGVuCisgICAgICAgICAgICAgICAgIyAnX19pbnRfXycgc2hvdWxkIGJlIHVzZWQgd2l0aCBhIGRlcHJlY2F0aW9uIHdhcm5pbmcuCisgICAgICAgICAgICAgICAgY2xhc3MgQmFkSW5kZXgob2JqZWN0KToKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorCisgICAgICAgICAgICAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQyCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBzdHJ1Y3QuZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5wYWNrLCBzZWxmLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBzdHJpbmciKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHN0cnVjdC5lcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2ssIHNlbGYuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRyYW5nZSkKKyAgICAgICAgICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCgiaW50ZWdlciBhcmd1bWVudCBleHBlY3RlZCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb3Qgbm9uLWludGVnZXIiLCBEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBzdHJ1Y3QuZXJyb3IpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdC5wYWNrKHNlbGYuZm9ybWF0LCAzKzQyaikKKworICAgICAgICAgICAgICAgICMgYW4gYXR0ZW1wdCB0byBjb252ZXJ0IGEgbm9uLWludGVnZXIgKHdpdGggYW4KKyAgICAgICAgICAgICAgICAjIGltcGxpY2l0IGNvbnZlcnNpb24gdmlhIF9faW50X18pIHNob3VsZCBzdWNjZWVkLAorICAgICAgICAgICAgICAgICMgd2l0aCBhIERlcHJlY2F0aW9uV2FybmluZworICAgICAgICAgICAgICAgIGZvciBub25pbnQgaW4gTm90QW5JbnROUygpLCBOb3RBbkludE9TKCksIEJhZEluZGV4KCk6CisgICAgICAgICAgICAgICAgICAgIHdpdGggY2hlY2tfd2FybmluZ3MoKCIuKmludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBub24iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItaW50ZWdlciIsIERlcHJlY2F0aW9uV2FybmluZykpIGFzIHc6CisgICAgICAgICAgICAgICAgICAgICAgICBnb3QgPSBzdHJ1Y3QucGFjayhzZWxmLmZvcm1hdCwgbm9uaW50KQorICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBpbnNwZWN0LmN1cnJlbnRmcmFtZSgpLmZfbGluZW5vIC0gMQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcuZmlsZW5hbWUsIHRlc3Rtb2RfZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody5saW5lbm8sIGxpbmVubykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ody53YXJuaW5ncyksIDEpCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gc3RydWN0LnBhY2soc2VsZi5mb3JtYXQsIGludChub25pbnQpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCisKKyAgICAgICAgICAgICAgICAjIENoZWNrIGZvciBsZWdpdGltYXRlIHZhbHVlcyBmcm9tICdfX2luZGV4X18nLgorICAgICAgICAgICAgICAgIGZvciBvYmogaW4gKEluZGV4YWJsZSgwKSwgSW5kZXhhYmxlKDEwKSwgSW5kZXhhYmxlKDE3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleGFibGUoNDIpLCBJbmRleGFibGUoMTAwKSwgSW5kZXhhYmxlKDEyNykpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QucGFjayhmb3JtYXQsIG9iaikKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnRlZ2VyIGNvZGUgcGFjayBmYWlsZWQgb24gb2JqZWN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCAnX19pbmRleF9fJyBtZXRob2QiKQorCisgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgYm9ndXMgdmFsdWVzIGZyb20gJ19faW5kZXhfXycuCisgICAgICAgICAgICAgICAgZm9yIG9iaiBpbiAoSW5kZXhhYmxlKCdhJyksIEluZGV4YWJsZSh1J2InKSwgSW5kZXhhYmxlKE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4YWJsZSh7J2EnOiAxfSksIEluZGV4YWJsZShbMSwgMiwgM10pKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgc3RydWN0LmVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0LnBhY2ssIHNlbGYuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmopCisKKyAgICAgICAgYnl0ZW9yZGVycyA9ICcnLCAnQCcsICc9JywgJzwnLCAnPicsICchJworICAgICAgICBmb3IgY29kZSBpbiBpbnRlZ2VyX2NvZGVzOgorICAgICAgICAgICAgZm9yIGJ5dGVvcmRlciBpbiBieXRlb3JkZXJzOgorICAgICAgICAgICAgICAgIGlmIChieXRlb3JkZXIgaW4gKCcnLCAnQCcpIGFuZCBjb2RlIGluICgncScsICdRJykgYW5kCisgICAgICAgICAgICAgICAgICAgIG5vdCBIQVZFX0xPTkdfTE9ORyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZm9ybWF0ID0gYnl0ZW9yZGVyK2NvZGUKKyAgICAgICAgICAgICAgICB0ID0gSW50VGVzdGVyKGZvcm1hdCkKKyAgICAgICAgICAgICAgICB0LnJ1bigpCisKKyAgICBkZWYgdGVzdF9wX2NvZGUoc2VsZik6CisgICAgICAgICMgVGVzdCBwICgiUGFzY2FsIHN0cmluZyIpIGNvZGUuCisgICAgICAgIGZvciBjb2RlLCBpbnB1dCwgZXhwZWN0ZWQsIGV4cGVjdGVkYmFjayBpbiBbCisgICAgICAgICAgICAgICAgKCdwJywnYWJjJywgJ1x4MDAnLCAnJyksCisgICAgICAgICAgICAgICAgKCcxcCcsICdhYmMnLCAnXHgwMCcsICcnKSwKKyAgICAgICAgICAgICAgICAoJzJwJywgJ2FiYycsICdceDAxYScsICdhJyksCisgICAgICAgICAgICAgICAgKCczcCcsICdhYmMnLCAnXHgwMmFiJywgJ2FiJyksCisgICAgICAgICAgICAgICAgKCc0cCcsICdhYmMnLCAnXHgwM2FiYycsICdhYmMnKSwKKyAgICAgICAgICAgICAgICAoJzVwJywgJ2FiYycsICdceDAzYWJjXHgwMCcsICdhYmMnKSwKKyAgICAgICAgICAgICAgICAoJzZwJywgJ2FiYycsICdceDAzYWJjXHgwMFx4MDAnLCAnYWJjJyksCisgICAgICAgICAgICAgICAgKCcxMDAwcCcsICd4JyoxMDAwLCAnXHhmZicgKyAneCcqOTk5LCAneCcqMjU1KV06CisgICAgICAgICAgICBnb3QgPSBzdHJ1Y3QucGFjayhjb2RlLCBpbnB1dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LCBleHBlY3RlZCkKKyAgICAgICAgICAgIChnb3QsKSA9IHN0cnVjdC51bnBhY2soY29kZSwgZ290KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkYmFjaykKKworICAgIGRlZiB0ZXN0XzcwNTgzNihzZWxmKToKKyAgICAgICAgIyBTRiBidWcgNzA1ODM2LiAgIjxmIiBhbmQgIj5mIiBoYWQgYSBzZXZlcmUgcm91bmRpbmcgYnVnLCB3aGVyZSBhIGNhcnJ5CisgICAgICAgICMgZnJvbSB0aGUgbG93LW9yZGVyIGRpc2NhcmRlZCBiaXRzIGNvdWxkIHByb3BhZ2F0ZSBpbnRvIHRoZSBleHBvbmVudAorICAgICAgICAjIGZpZWxkLCBjYXVzaW5nIHRoZSByZXN1bHQgdG8gYmUgd3JvbmcgYnkgYSBmYWN0b3Igb2YgMi4KKyAgICAgICAgaW1wb3J0IG1hdGgKKworICAgICAgICBmb3IgYmFzZSBpbiByYW5nZSgxLCAzMyk6CisgICAgICAgICAgICAjIHNtYWxsZXIgPC0gbGFyZ2VzdCByZXByZXNlbnRhYmxlIGZsb2F0IGxlc3MgdGhhbiBiYXNlLgorICAgICAgICAgICAgZGVsdGEgPSAwLjUKKyAgICAgICAgICAgIHdoaWxlIGJhc2UgLSBkZWx0YSAvIDIuMCAhPSBiYXNlOgorICAgICAgICAgICAgICAgIGRlbHRhIC89IDIuMAorICAgICAgICAgICAgc21hbGxlciA9IGJhc2UgLSBkZWx0YQorICAgICAgICAgICAgIyBQYWNraW5nIHRoaXMgcm91bmRzIGF3YXkgYSBzb2xpZCBzdHJpbmcgb2YgdHJhaWxpbmcgMSBiaXRzLgorICAgICAgICAgICAgcGFja2VkID0gc3RydWN0LnBhY2soIjxmIiwgc21hbGxlcikKKyAgICAgICAgICAgIHVucGFja2VkID0gc3RydWN0LnVucGFjaygiPGYiLCBwYWNrZWQpWzBdCisgICAgICAgICAgICAjIFRoaXMgZmFpbGVkIGF0IGJhc2UgPSAyLCA0LCBhbmQgMzIsIHdpdGggdW5wYWNrZWQgPSAxLCAyLCBhbmQKKyAgICAgICAgICAgICMgMTYsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgdW5wYWNrZWQpCisgICAgICAgICAgICBiaWdwYWNrZWQgPSBzdHJ1Y3QucGFjaygiPmYiLCBzbWFsbGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaWdwYWNrZWQsIHN0cmluZ19yZXZlcnNlKHBhY2tlZCkpCisgICAgICAgICAgICB1bnBhY2tlZCA9IHN0cnVjdC51bnBhY2soIj5mIiwgYmlncGFja2VkKVswXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLCB1bnBhY2tlZCkKKworICAgICAgICAjIExhcmdlc3QgZmluaXRlIElFRUUgc2luZ2xlLgorICAgICAgICBiaWcgPSAoMSA8PCAyNCkgLSAxCisgICAgICAgIGJpZyA9IG1hdGgubGRleHAoYmlnLCAxMjcgLSAyMykKKyAgICAgICAgcGFja2VkID0gc3RydWN0LnBhY2soIj5mIiwgYmlnKQorICAgICAgICB1bnBhY2tlZCA9IHN0cnVjdC51bnBhY2soIj5mIiwgcGFja2VkKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpZywgdW5wYWNrZWQpCisKKyAgICAgICAgIyBUaGUgc2FtZSwgYnV0IHRhY2sgb24gYSAxIGJpdCBzbyBpdCByb3VuZHMgdXAgdG8gaW5maW5pdHkuCisgICAgICAgIGJpZyA9ICgxIDw8IDI1KSAtIDEKKyAgICAgICAgYmlnID0gbWF0aC5sZGV4cChiaWcsIDEyNyAtIDI0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBzdHJ1Y3QucGFjaywgIj5mIiwgYmlnKQorCisgICAgZGVmIHRlc3RfMTUzMDU1OShzZWxmKToKKyAgICAgICAgIyBTRiBidWcgMTUzMDU1OS4gc3RydWN0LnBhY2sgcmFpc2VzIFR5cGVFcnJvciB3aGVyZSBpdCB1c2VkIHRvIGNvbnZlcnQuCisgICAgICAgIGZvciBlbmRpYW4gaW4gKCcnLCAnPicsICc8Jyk6CisgICAgICAgICAgICBmb3IgZm10IGluIGludGVnZXJfY29kZXM6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19mbG9hdF9jb2VyY2UoZW5kaWFuICsgZm10LCAxLjApCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19mbG9hdF9jb2VyY2UoZW5kaWFuICsgZm10LCAxLjUpCisKKyAgICBkZWYgdGVzdF91bnBhY2tfZnJvbShzZWxmLCBjbHM9c3RyKToKKyAgICAgICAgZGF0YSA9IGNscygnYWJjZDAxMjM0JykKKyAgICAgICAgZm10ID0gJzRzJworICAgICAgICBzID0gc3RydWN0LlN0cnVjdChmbXQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnVucGFja19mcm9tKGRhdGEpLCAoJ2FiY2QnLCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydWN0LnVucGFja19mcm9tKGZtdCwgZGF0YSksICgnYWJjZCcsKSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDYpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnVucGFja19mcm9tKGRhdGEsIGkpLCAoZGF0YVtpOmkrNF0sKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydWN0LnVucGFja19mcm9tKGZtdCwgZGF0YSwgaSksIChkYXRhW2k6aSs0XSwpKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoNiwgbGVuKGRhdGEpICsgMSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHMudW5wYWNrX2Zyb20sIGRhdGEsIGkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzdHJ1Y3QuZXJyb3IsIHN0cnVjdC51bnBhY2tfZnJvbSwgZm10LCBkYXRhLCBpKQorCisgICAgZGVmIHRlc3RfcGFja19pbnRvKHNlbGYpOgorICAgICAgICB0ZXN0X3N0cmluZyA9ICdSZXlramF2aWsgcm9ja3MsIGVvdyEnCisgICAgICAgIHdyaXRhYmxlX2J1ZiA9IGFycmF5LmFycmF5KCdjJywgJyAnKjEwMCkKKyAgICAgICAgZm10ID0gJzIxcycKKyAgICAgICAgcyA9IHN0cnVjdC5TdHJ1Y3QoZm10KQorCisgICAgICAgICMgVGVzdCB3aXRob3V0IG9mZnNldAorICAgICAgICBzLnBhY2tfaW50byh3cml0YWJsZV9idWYsIDAsIHRlc3Rfc3RyaW5nKQorICAgICAgICBmcm9tX2J1ZiA9IHdyaXRhYmxlX2J1Zi50b3N0cmluZygpWzpsZW4odGVzdF9zdHJpbmcpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyb21fYnVmLCB0ZXN0X3N0cmluZykKKworICAgICAgICAjIFRlc3Qgd2l0aCBvZmZzZXQuCisgICAgICAgIHMucGFja19pbnRvKHdyaXRhYmxlX2J1ZiwgMTAsIHRlc3Rfc3RyaW5nKQorICAgICAgICBmcm9tX2J1ZiA9IHdyaXRhYmxlX2J1Zi50b3N0cmluZygpWzpsZW4odGVzdF9zdHJpbmcpKzEwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyb21fYnVmLCB0ZXN0X3N0cmluZ1s6MTBdICsgdGVzdF9zdHJpbmcpCisKKyAgICAgICAgIyBHbyBiZXlvbmQgYm91bmRhcmllcy4KKyAgICAgICAgc21hbGxfYnVmID0gYXJyYXkuYXJyYXkoJ2MnLCAnICcqMTApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChWYWx1ZUVycm9yLCBzdHJ1Y3QuZXJyb3IpLCBzLnBhY2tfaW50bywgc21hbGxfYnVmLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFZhbHVlRXJyb3IsIHN0cnVjdC5lcnJvciksIHMucGFja19pbnRvLCBzbWFsbF9idWYsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3RyaW5nKQorCisgICAgICAgICMgVGVzdCBib2d1cyBvZmZzZXQgKGlzc3VlIDM2OTQpCisgICAgICAgIHNiID0gc21hbGxfYnVmCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIHN0cnVjdC5lcnJvciksIHN0cnVjdC5wYWNrX2ludG8sIGInJywgc2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUpCisKKyAgICBkZWYgdGVzdF9wYWNrX2ludG9fZm4oc2VsZik6CisgICAgICAgIHRlc3Rfc3RyaW5nID0gJ1JleWtqYXZpayByb2NrcywgZW93IScKKyAgICAgICAgd3JpdGFibGVfYnVmID0gYXJyYXkuYXJyYXkoJ2MnLCAnICcqMTAwKQorICAgICAgICBmbXQgPSAnMjFzJworICAgICAgICBwYWNrX2ludG8gPSBsYW1iZGEgKmFyZ3M6IHN0cnVjdC5wYWNrX2ludG8oZm10LCAqYXJncykKKworICAgICAgICAjIFRlc3Qgd2l0aG91dCBvZmZzZXQuCisgICAgICAgIHBhY2tfaW50byh3cml0YWJsZV9idWYsIDAsIHRlc3Rfc3RyaW5nKQorICAgICAgICBmcm9tX2J1ZiA9IHdyaXRhYmxlX2J1Zi50b3N0cmluZygpWzpsZW4odGVzdF9zdHJpbmcpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyb21fYnVmLCB0ZXN0X3N0cmluZykKKworICAgICAgICAjIFRlc3Qgd2l0aCBvZmZzZXQuCisgICAgICAgIHBhY2tfaW50byh3cml0YWJsZV9idWYsIDEwLCB0ZXN0X3N0cmluZykKKyAgICAgICAgZnJvbV9idWYgPSB3cml0YWJsZV9idWYudG9zdHJpbmcoKVs6bGVuKHRlc3Rfc3RyaW5nKSsxMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcm9tX2J1ZiwgdGVzdF9zdHJpbmdbOjEwXSArIHRlc3Rfc3RyaW5nKQorCisgICAgICAgICMgR28gYmV5b25kIGJvdW5kYXJpZXMuCisgICAgICAgIHNtYWxsX2J1ZiA9IGFycmF5LmFycmF5KCdjJywgJyAnKjEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgc3RydWN0LmVycm9yKSwgcGFja19pbnRvLCBzbWFsbF9idWYsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVmFsdWVFcnJvciwgc3RydWN0LmVycm9yKSwgcGFja19pbnRvLCBzbWFsbF9idWYsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3RyaW5nKQorCisgICAgZGVmIHRlc3RfdW5wYWNrX3dpdGhfYnVmZmVyKHNlbGYpOgorICAgICAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKCJidWZmZXIuLiBub3Qgc3VwcG9ydGVkIGluIDMueCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICAjIFNGIGJ1ZyAxNTYzNzU5OiBzdHJ1Y3QudW5wYWNrIGRvZXNuJ3Qgc3VwcG9ydCBidWZmZXIgcHJvdG9jb2wgb2JqZWN0cworICAgICAgICAgICAgZGF0YTEgPSBhcnJheS5hcnJheSgnQicsICdceDEyXHgzNFx4NTZceDc4JykKKyAgICAgICAgICAgIGRhdGEyID0gYnVmZmVyKCcuLi4uLi5ceDEyXHgzNFx4NTZceDc4Li4uLi4uJywgNiwgNCkKKyAgICAgICAgICAgIGZvciBkYXRhIGluIFtkYXRhMSwgZGF0YTJdOgorICAgICAgICAgICAgICAgIHZhbHVlLCA9IHN0cnVjdC51bnBhY2soJz5JJywgZGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAweDEyMzQ1Njc4KQorCisgICAgICAgICAgICBzZWxmLnRlc3RfdW5wYWNrX2Zyb20oY2xzPWJ1ZmZlcikKKworICAgIGRlZiB0ZXN0X3VucGFja193aXRoX21lbW9yeXZpZXcoc2VsZik6CisgICAgICAgICMgQnVnIDEwMjEyOiBzdHJ1Y3QudW5wYWNrIGRvZXNuJ3Qgc3VwcG9ydCBuZXcgYnVmZmVyIHByb3RvY29sIG9iamVjdHMKKyAgICAgICAgZGF0YTEgPSBtZW1vcnl2aWV3KCdceDEyXHgzNFx4NTZceDc4JykKKyAgICAgICAgZm9yIGRhdGEgaW4gW2RhdGExLF06CisgICAgICAgICAgICB2YWx1ZSwgPSBzdHJ1Y3QudW5wYWNrKCc+SScsIGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCAweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLnRlc3RfdW5wYWNrX2Zyb20oY2xzPW1lbW9yeXZpZXcpCisKKyAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgorICAgICAgICBjbGFzcyBFeHBsb2RpbmdCb29sKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcgorICAgICAgICBmb3IgcHJlZml4IGluIHR1cGxlKCI8PiE9IikrKCcnLCk6CisgICAgICAgICAgICBmYWxzZSA9ICgpLCBbXSwgW10sICcnLCAwCisgICAgICAgICAgICB0cnVlID0gWzFdLCAndGVzdCcsIDUsIC0xLCAweGZmZmZmZmZmTCsxLCAweGZmZmZmZmZmLy8yCisKKyAgICAgICAgICAgIGZhbHNlRm9ybWF0ID0gcHJlZml4ICsgJz8nICogbGVuKGZhbHNlKQorICAgICAgICAgICAgcGFja2VkRmFsc2UgPSBzdHJ1Y3QucGFjayhmYWxzZUZvcm1hdCwgKmZhbHNlKQorICAgICAgICAgICAgdW5wYWNrZWRGYWxzZSA9IHN0cnVjdC51bnBhY2soZmFsc2VGb3JtYXQsIHBhY2tlZEZhbHNlKQorCisgICAgICAgICAgICB0cnVlRm9ybWF0ID0gcHJlZml4ICsgJz8nICogbGVuKHRydWUpCisgICAgICAgICAgICBwYWNrZWRUcnVlID0gc3RydWN0LnBhY2sodHJ1ZUZvcm1hdCwgKnRydWUpCisgICAgICAgICAgICB1bnBhY2tlZFRydWUgPSBzdHJ1Y3QudW5wYWNrKHRydWVGb3JtYXQsIHBhY2tlZFRydWUpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRydWUpLCBsZW4odW5wYWNrZWRUcnVlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGZhbHNlKSwgbGVuKHVucGFja2VkRmFsc2UpKQorCisgICAgICAgICAgICBmb3IgdCBpbiB1bnBhY2tlZEZhbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodCkKKyAgICAgICAgICAgIGZvciB0IGluIHVucGFja2VkVHJ1ZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodCkKKworICAgICAgICAgICAgcGFja2VkID0gc3RydWN0LnBhY2socHJlZml4Kyc/JywgMSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGFja2VkKSwgc3RydWN0LmNhbGNzaXplKHByZWZpeCsnPycpKQorCisgICAgICAgICAgICBpZiBsZW4ocGFja2VkKSAhPSAxOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJlZml4LCBtc2c9J2VuY29kZWQgYm9vbCBpcyBub3Qgb25lIGJ5dGU6ICVyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXBhY2tlZCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgc3RydWN0LnBhY2ssIHByZWZpeCArICc/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGxvZGluZ0Jvb2woKSkKKworICAgICAgICBmb3IgYyBpbiBbYidceDAxJywgYidceDdmJywgYidceGZmJywgYidceDBmJywgYidceGYwJ106CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RydWN0LnVucGFjaygnPj8nLCBjKVswXSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKElTMzJCSVQsICJTcGVjaWZpYyB0byAzMmJpdCBtYWNoaW5lcyIpCisgICAgZGVmIHRlc3RfY3Jhc2hlcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWVtb3J5RXJyb3IsIHN0cnVjdC5wYWNrLCAiMzU3OTEzOTQxYyIsICJhIikKKworICAgIGRlZiB0ZXN0X2NvdW50X292ZXJmbG93KHNlbGYpOgorICAgICAgICBodWdlY291bnQgPSAne31iJy5mb3JtYXQoc3lzLm1heHNpemUrMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3RydWN0LmVycm9yLCBzdHJ1Y3QuY2FsY3NpemUsIGh1Z2Vjb3VudCkKKworICAgICAgICBodWdlY291bnQyID0gJ3t9Ynt9SCcuZm9ybWF0KHN5cy5tYXhzaXplLy8yLCBzeXMubWF4c2l6ZS8vMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc3RydWN0LmVycm9yLCBzdHJ1Y3QuY2FsY3NpemUsIGh1Z2Vjb3VudDIpCisKKyAgICBkZWYgY2hlY2tfc2l6ZW9mKHNlbGYsIGZvcm1hdF9zdHIsIG51bWJlcl9vZl9jb2Rlcyk6CisgICAgICAgICMgVGhlIHNpemUgb2YgJ1B5U3RydWN0T2JqZWN0JworICAgICAgICB0b3RhbHNpemUgPSBzdXBwb3J0LmNhbGNvYmpzaXplKCc1UCcpCisgICAgICAgICMgVGhlIHNpemUgdGFrZW4gdXAgYnkgdGhlICdmb3JtYXRjb2RlJyBkeW5hbWljIGFycmF5CisgICAgICAgIHRvdGFsc2l6ZSArPSBzdHJ1Y3QuY2FsY3NpemUoJzNQJykgKiAobnVtYmVyX29mX2NvZGVzICsgMSkKKyAgICAgICAgc3VwcG9ydC5jaGVja19zaXplb2Yoc2VsZiwgc3RydWN0LlN0cnVjdChmb3JtYXRfc3RyKSwgdG90YWxzaXplKQorCisgICAgQHN1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfX3NpemVvZl9fKHNlbGYpOgorICAgICAgICBmb3IgY29kZSBpbiBpbnRlZ2VyX2NvZGVzOgorICAgICAgICAgICAgc2VsZi5jaGVja19zaXplb2YoY29kZSwgMSkKKyAgICAgICAgc2VsZi5jaGVja19zaXplb2YoJ0JISUxmZHNwUCcsIDkpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCdCJyAqIDEyMzQsIDEyMzQpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCdmZCcsIDIpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCd4eHh4eHh4eHh4eHh4eCcsIDApCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCcxMDBIJywgMTAwKQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignMTg3cycsIDEpCisgICAgICAgIHNlbGYuY2hlY2tfc2l6ZW9mKCcyMHAnLCAxKQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignMHMnLCAxKQorICAgICAgICBzZWxmLmNoZWNrX3NpemVvZignMGMnLCAwKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoU3RydWN0VGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYmVmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVlYmVmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjNThjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHkKQEAgLTAsMCArMSwxMDggQEAKK2Zyb20gX3Rlc3RjYXBpIGltcG9ydCBfdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZSwgXAorICAgIENIQVJfTUFYLCBDSEFSX01JTiwgVUNIQVJfTUFYLCBcCisgICAgU0hSVF9NQVgsIFNIUlRfTUlOLCBVU0hSVF9NQVgsIFwKKyAgICBJTlRfTUFYLCBJTlRfTUlOLCBVSU5UX01BWCwgXAorICAgIExPTkdfTUFYLCBMT05HX01JTiwgVUxPTkdfTUFYLCBcCisgICAgTExPTkdfTUFYLCBMTE9OR19NSU4sIFVMTE9OR19NQVgKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCit0cz1fdGVzdF9zdHJ1Y3RtZW1iZXJzVHlwZShGYWxzZSwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOS45OTk5OSwgMTAuMTAxMDEwMTAxMCwgImhpIikKKworY2xhc3MgUmVhZFdyaXRlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKKyAgICAgICAgdHMuVF9CT09MID0gVHJ1ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfQk9PTCwgVHJ1ZSkKKyAgICAgICAgdHMuVF9CT09MID0gRmFsc2UKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0JPT0wsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHRzLCAnVF9CT09MJywgMSkKKworICAgIGRlZiB0ZXN0X2J5dGUoc2VsZik6CisgICAgICAgIHRzLlRfQllURSA9IENIQVJfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9CWVRFLCBDSEFSX01BWCkKKyAgICAgICAgdHMuVF9CWVRFID0gQ0hBUl9NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0JZVEUsIENIQVJfTUlOKQorICAgICAgICB0cy5UX1VCWVRFID0gVUNIQVJfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9VQllURSwgVUNIQVJfTUFYKQorCisgICAgZGVmIHRlc3Rfc2hvcnQoc2VsZik6CisgICAgICAgIHRzLlRfU0hPUlQgPSBTSFJUX01BWAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzLlRfU0hPUlQsIFNIUlRfTUFYKQorICAgICAgICB0cy5UX1NIT1JUID0gU0hSVF9NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1NIT1JULCBTSFJUX01JTikKKyAgICAgICAgdHMuVF9VU0hPUlQgPSBVU0hSVF9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1VTSE9SVCwgVVNIUlRfTUFYKQorCisgICAgZGVmIHRlc3RfaW50KHNlbGYpOgorICAgICAgICB0cy5UX0lOVCA9IElOVF9NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0lOVCwgSU5UX01BWCkKKyAgICAgICAgdHMuVF9JTlQgPSBJTlRfTUlOCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9JTlQsIElOVF9NSU4pCisgICAgICAgIHRzLlRfVUlOVCA9IFVJTlRfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9VSU5ULCBVSU5UX01BWCkKKworICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6CisgICAgICAgIHRzLlRfTE9ORyA9IExPTkdfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9MT05HLCBMT05HX01BWCkKKyAgICAgICAgdHMuVF9MT05HID0gTE9OR19NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0xPTkcsIExPTkdfTUlOKQorICAgICAgICB0cy5UX1VMT05HID0gVUxPTkdfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9VTE9ORywgVUxPTkdfTUFYKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cih0cywgIlRfTE9OR0xPTkciKSwgImxvbmcgbG9uZyBub3QgcHJlc2VudCIpCisgICAgZGVmIHRlc3RfbG9uZ2xvbmcoc2VsZik6CisgICAgICAgIHRzLlRfTE9OR0xPTkcgPSBMTE9OR19NQVgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0xPTkdMT05HLCBMTE9OR19NQVgpCisgICAgICAgIHRzLlRfTE9OR0xPTkcgPSBMTE9OR19NSU4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX0xPTkdMT05HLCBMTE9OR19NSU4pCisKKyAgICAgICAgdHMuVF9VTE9OR0xPTkcgPSBVTExPTkdfTUFYCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9VTE9OR0xPTkcsIFVMTE9OR19NQVgpCisKKyAgICAgICAgIyMgbWFrZSBzdXJlIHRoZXNlIHdpbGwgYWNjZXB0IGEgcGxhaW4gaW50IGFzIHdlbGwgYXMgYSBsb25nCisgICAgICAgIHRzLlRfTE9OR0xPTkcgPSAzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9MT05HTE9ORywgMykKKyAgICAgICAgdHMuVF9VTE9OR0xPTkcgPSA0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMuVF9VTE9OR0xPTkcsIDQpCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX3N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cy5UX1NUUklOR19JTlBMQUNFLCAiaGkiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHRzLCAiVF9TVFJJTkdfSU5QTEFDRSIsICJzIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkZWxhdHRyLCB0cywgIlRfU1RSSU5HX0lOUExBQ0UiKQorCisKK2NsYXNzIFRlc3RXYXJuaW5ncyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9ieXRlX21heChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgdHMuVF9CWVRFID0gQ0hBUl9NQVgrMQorCisgICAgZGVmIHRlc3RfYnl0ZV9taW4oc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgIHRzLlRfQllURSA9IENIQVJfTUlOLTEKKworICAgIGRlZiB0ZXN0X3VieXRlX21heChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCcnLCBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgdHMuVF9VQllURSA9IFVDSEFSX01BWCsxCisKKyAgICBkZWYgdGVzdF9zaG9ydF9tYXgoc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgIHRzLlRfU0hPUlQgPSBTSFJUX01BWCsxCisKKyAgICBkZWYgdGVzdF9zaG9ydF9taW4oc2VsZik6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgIHRzLlRfU0hPUlQgPSBTSFJUX01JTi0xCisKKyAgICBkZWYgdGVzdF91c2hvcnRfbWF4KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIFJ1bnRpbWVXYXJuaW5nKSk6CisgICAgICAgICAgICB0cy5UX1VTSE9SVCA9IFVTSFJUX01BWCsxCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKHZlcmJvc2U9VHJ1ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhOWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0bWVtYmVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhOWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdG1lbWJlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdHNlcS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N0cnVjdHNlcS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWExMmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5CkBAIC0wLDAgKzEsMTIwIEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCB0aW1lCisKK2NsYXNzIFN0cnVjdFNlcVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHVwbGUoc2VsZik6CisgICAgICAgIHQgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIGFzdHVwbGUgPSB0dXBsZSh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0KSwgbGVuKGFzdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIGFzdHVwbGUpCisKKyAgICAgICAgIyBDaGVjayB0aGF0IHNsaWNpbmcgd29ya3MgdGhlIHNhbWUgd2F5OyBhdCBvbmUgcG9pbnQsIHNsaWNpbmcgdFtpOmpdIHdpdGgKKyAgICAgICAgIyAwIDwgaSA8IGogY291bGQgcHJvZHVjZSBOVUxMcyBpbiB0aGUgcmVzdWx0LgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoLWxlbih0KSwgbGVuKHQpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFtpOl0sIGFzdHVwbGVbaTpdKQorICAgICAgICAgICAgZm9yIGogaW4geHJhbmdlKC1sZW4odCksIGxlbih0KSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0W2k6al0sIGFzdHVwbGVbaTpqXSkKKworICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoLWxlbih0KSwgbGVuKHQpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodFs6al0sIGFzdHVwbGVbOmpdKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHQuX19nZXRpdGVtX18sIC1sZW4odCktMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdC5fX2dldGl0ZW1fXywgbGVuKHQpKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoLWxlbih0KSwgbGVuKHQpLTEpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0W2ldLCBhc3R1cGxlW2ldKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgdCA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIodCkpCisgICAgICAgIHQgPSB0aW1lLmdtdGltZSgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodCksCisgICAgICAgICAgICAidGltZS5zdHJ1Y3RfdGltZSh0bV95ZWFyPTE5NzAsIHRtX21vbj0xLCB0bV9tZGF5PTEsIHRtX2hvdXI9MCwgIgorICAgICAgICAgICAgInRtX21pbj0wLCB0bV9zZWM9MCwgdG1fd2RheT0zLCB0bV95ZGF5PTEsIHRtX2lzZHN0PTApIikKKworICAgIGRlZiB0ZXN0X2NvbmNhdChzZWxmKToKKyAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIHQyID0gdDEgKyB0dXBsZSh0MSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbih0MSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MltpXSwgdDJbaStsZW4odDEpXSkKKworICAgIGRlZiB0ZXN0X3JlcGVhdChzZWxmKToKKyAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIHQyID0gMyAqIHQxCisgICAgICAgIGZvciBpIGluIHhyYW5nZShsZW4odDEpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDJbaV0sIHQyW2krbGVuKHQxKV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyW2ldLCB0MltpKzIqbGVuKHQxKV0pCisKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIGZvciBpdGVtIGluIHQxOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihpdGVtLCB0MSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigtNDIsIHQxKQorCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaCh0MSksIGhhc2godHVwbGUodDEpKSkKKworICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKKyAgICAgICAgdDEgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIHQyID0gdHlwZSh0MSkodDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDEsIHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICh0MSA8IHQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICh0MSA+IHQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICh0MSAhPSB0MikpCisKKyAgICBkZWYgdGVzdF9maWVsZHMoc2VsZik6CisgICAgICAgIHQgPSB0aW1lLmdtdGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHQpLCB0Lm5fZmllbGRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubl9maWVsZHMsIHQubl9zZXF1ZW5jZV9maWVsZHMrdC5uX3VubmFtZWRfZmllbGRzKQorCisgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CisgICAgICAgIHQgPSB0aW1lLnN0cnVjdF90aW1lCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgIjEyMyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgIjEyMyIsIGRpY3Q9e30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdCwgIjEyMzQ1Njc4OSIsIGRpY3Q9Tm9uZSkKKworICAgICAgICBzID0gIjEyMzQ1Njc4OSIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiIi5qb2luKHQocykpLCBzKQorCisgICAgZGVmIHRlc3RfZXZpbHR1cGxlKHNlbGYpOgorICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIERldmlvdXMgY29kZSBjb3VsZCBjcmFzaCBzdHJ1Y3RzZXFzJyBjb250cnVjdG9ycworICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgICAgICAgICAgICAgIHJhaXNlIEV4YworICAgICAgICAgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIHRpbWUuc3RydWN0X3RpbWUsIEMoKSkKKworICAgIGRlZiB0ZXN0X3JlZHVjZShzZWxmKToKKyAgICAgICAgdCA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgeCA9IHQuX19yZWR1Y2VfXygpCisKKyAgICBkZWYgdGVzdF9leHRlbmRlZF9nZXRzbGljZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGV4dGVuZGVkIHNsaWNpbmcgYnkgY29tcGFyaW5nIHdpdGggbGlzdCBzbGljaW5nLgorICAgICAgICB0ID0gdGltZS5nbXRpbWUoKQorICAgICAgICBMID0gbGlzdCh0KQorICAgICAgICBpbmRpY2VzID0gKDAsIE5vbmUsIDEsIDMsIDE5LCAzMDAsIC0xLCAtMiwgLTMxLCAtMzAwKQorICAgICAgICBmb3Igc3RhcnQgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIGZvciBzdG9wIGluIGluZGljZXM6CisgICAgICAgICAgICAgICAgIyBTa2lwIHN0ZXAgMCAoaW52YWxpZCkKKyAgICAgICAgICAgICAgICBmb3Igc3RlcCBpbiBpbmRpY2VzWzE6XToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHRbc3RhcnQ6c3RvcDpzdGVwXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFtzdGFydDpzdG9wOnN0ZXBdKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJ1Y3RTZXFUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI3NzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdHJ1Y3RzZXEucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI3NzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODlkODRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtMCwwICsxLDEzOTcgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgb3MKK2ltcG9ydCBlcnJubworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHJlCitpbXBvcnQgc3lzY29uZmlnCisKK3RyeToKKyAgICBpbXBvcnQgcmVzb3VyY2UKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICByZXNvdXJjZSA9IE5vbmUKKworbXN3aW5kb3dzID0gKHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiKQorCisjCisjIERlcGVuZHMgb24gdGhlIGZvbGxvd2luZyBleHRlcm5hbCBwcm9ncmFtczogUHl0aG9uCisjCisKK2lmIG1zd2luZG93czoKKyAgICBTRVRCSU5BUlkgPSAoJ2ltcG9ydCBtc3ZjcnQ7IG1zdmNydC5zZXRtb2RlKHN5cy5zdGRvdXQuZmlsZW5vKCksICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcy5PX0JJTkFSWSk7JykKK2Vsc2U6CisgICAgU0VUQklOQVJZID0gJycKKworCit0cnk6CisgICAgbWtzdGVtcCA9IHRlbXBmaWxlLm1rc3RlbXAKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAjIHRlbXBmaWxlLm1rc3RlbXAgaXMgbm90IGF2YWlsYWJsZQorICAgIGRlZiBta3N0ZW1wKCk6CisgICAgICAgICIiIlJlcGxhY2VtZW50IGZvciBta3N0ZW1wLCBjYWxsaW5nIG1rdGVtcC4iIiIKKyAgICAgICAgZm5hbWUgPSB0ZW1wZmlsZS5ta3RlbXAoKQorICAgICAgICByZXR1cm4gb3Mub3BlbihmbmFtZSwgb3MuT19SRFdSfG9zLk9fQ1JFQVQpLCBmbmFtZQorCisKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIFRyeSB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHdlIGhhdmUgc28gdGhpcyB0ZXN0CisgICAgICAgICMgZG9lc24ndCBjcmFzaCBvbiBzb21lIGJ1aWxkYm90cyAoQWxwaGFzIGluIHBhcnRpY3VsYXIpLgorICAgICAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBpbnN0IGluIHN1YnByb2Nlc3MuX2FjdGl2ZToKKyAgICAgICAgICAgIGluc3Qud2FpdCgpCisgICAgICAgIHN1YnByb2Nlc3MuX2NsZWFudXAoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN1YnByb2Nlc3MuX2FjdGl2ZSwgInN1YnByb2Nlc3MuX2FjdGl2ZSBub3QgZW1wdHkiKQorCisgICAgZGVmIGFzc2VydFN0ZGVyckVxdWFsKHNlbGYsIHN0ZGVyciwgZXhwZWN0ZWQsIG1zZz1Ob25lKToKKyAgICAgICAgIyBJbiBhIGRlYnVnIGJ1aWxkLCBzdHVmZiBsaWtlICJbNjU4MCByZWZzXSIgaXMgcHJpbnRlZCB0byBzdGRlcnIgYXQKKyAgICAgICAgIyBzaHV0ZG93biB0aW1lLiAgVGhhdCBmcnVzdHJhdGVzIHRlc3RzIHRyeWluZyB0byBjaGVjayBzdGRlcnIgcHJvZHVjZWQKKyAgICAgICAgIyBmcm9tIGEgc3Bhd25lZCBQeXRob24gcHJvY2Vzcy4KKyAgICAgICAgYWN0dWFsID0gcmUuc3ViKHIiXFtcZCsgcmVmc1xdXHI/XG4/JCIsICIiLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKQorCisKK2NsYXNzIFBvcGVuVGVzdEV4Y2VwdGlvbihFeGNlcHRpb24pOgorICAgIHBhc3MKKworCitjbGFzcyBQb3BlbkV4ZWN1dGVDaGlsZFJhaXNlcyhzdWJwcm9jZXNzLlBvcGVuKToKKyAgICAiIiJQb3BlbiBzdWJjbGFzcyBmb3IgdGVzdGluZyBjbGVhbnVwIG9mIHN1YnByb2Nlc3MuUElQRSBmaWxlaGFuZGxlcyB3aGVuCisgICAgX2V4ZWN1dGVfY2hpbGQgZmFpbHMuCisgICAgIiIiCisgICAgZGVmIF9leGVjdXRlX2NoaWxkKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJhaXNlIFBvcGVuVGVzdEV4Y2VwdGlvbigiRm9yY2VkIEV4Y2VwdGlvbiBmb3IgVGVzdCIpCisKKworY2xhc3MgUHJvY2Vzc1Rlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9jYWxsX3NlcShzZWxmKToKKyAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzZXF1ZW5jZSBhcmd1bWVudAorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDQ3KQorCisgICAgZGVmIHRlc3RfY2hlY2tfY2FsbF96ZXJvKHNlbGYpOgorICAgICAgICAjIGNoZWNrX2NhbGwoKSBmdW5jdGlvbiB3aXRoIHplcm8gcmV0dXJuIGNvZGUKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDApIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDApCisKKyAgICBkZWYgdGVzdF9jaGVja19jYWxsX25vbnplcm8oc2VsZik6CisgICAgICAgICMgY2hlY2tfY2FsbCgpIGZ1bmN0aW9uIHdpdGggbm9uLXplcm8gcmV0dXJuIGNvZGUKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuY2hlY2tfY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmV4Y2VwdGlvbi5yZXR1cm5jb2RlLCA0NykKKworICAgIGRlZiB0ZXN0X2NoZWNrX291dHB1dChzZWxmKToKKyAgICAgICAgIyBjaGVja19vdXRwdXQoKSBmdW5jdGlvbiB3aXRoIHplcm8gcmV0dXJuIGNvZGUKKyAgICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAicHJpbnQgJ0JERkwnIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ0JERkwnLCBvdXRwdXQpCisKKyAgICBkZWYgdGVzdF9jaGVja19vdXRwdXRfbm9uemVybyhzZWxmKToKKyAgICAgICAgIyBjaGVja19jYWxsKCkgZnVuY3Rpb24gd2l0aCBub24temVybyByZXR1cm4gY29kZQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yKSBhcyBjOgorICAgICAgICAgICAgc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgImltcG9ydCBzeXM7IHN5cy5leGl0KDUpIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5leGNlcHRpb24ucmV0dXJuY29kZSwgNSkKKworICAgIGRlZiB0ZXN0X2NoZWNrX291dHB1dF9zdGRlcnIoc2VsZik6CisgICAgICAgICMgY2hlY2tfb3V0cHV0KCkgZnVuY3Rpb24gc3RkZXJyIHJlZGlyZWN0ZWQgdG8gc3Rkb3V0CisgICAgICAgIG91dHB1dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgImltcG9ydCBzeXM7IHN5cy5zdGRlcnIud3JpdGUoJ0JERkwnKSJdLAorICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignQkRGTCcsIG91dHB1dCkKKworICAgIGRlZiB0ZXN0X2NoZWNrX291dHB1dF9zdGRvdXRfYXJnKHNlbGYpOgorICAgICAgICAjIGNoZWNrX291dHB1dCgpIGZ1bmN0aW9uIHN0ZGVyciByZWRpcmVjdGVkIHRvIHN0ZG91dAorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIGM6CisgICAgICAgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAicHJpbnQgJ3dpbGwgbm90IGJlIHJ1biciXSwKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN5cy5zdGRvdXQpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIFZhbHVlRXJyb3Igd2hlbiBzdGRvdXQgYXJnIHN1cHBsaWVkLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3N0ZG91dCcsIGMuZXhjZXB0aW9uLmFyZ3NbMF0pCisKKyAgICBkZWYgdGVzdF9jYWxsX2t3YXJncyhzZWxmKToKKyAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBrZXl3b3JkIGFyZ3MKKyAgICAgICAgbmV3ZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgbmV3ZW52WyJGUlVJVCJdID0gImJhbmFuYSIKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXMsIG9zOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuZXhpdChvcy5nZXRlbnYoIkZSVUlUIik9PSJiYW5hbmEiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCAxKQorCisgICAgZGVmIHRlc3RfaW52YWxpZF9hcmdzKHNlbGYpOgorICAgICAgICAjIFBvcGVuKCkgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHMgc2hvdWxkIHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAjIGJ1dCBQb3Blbi5fX2RlbF9fIHNob3VsZCBub3QgY29tcGxhaW4gKGlzc3VlICMxMjA4NSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfc3RkZXJyKCkgYXMgczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VicHJvY2Vzcy5Qb3BlbiwgaW52YWxpZF9hcmdfbmFtZT0xKQorICAgICAgICAgICAgYXJnY291bnQgPSBzdWJwcm9jZXNzLlBvcGVuLl9faW5pdF9fLl9fY29kZV9fLmNvX2FyZ2NvdW50CisgICAgICAgICAgICB0b29fbWFueV9hcmdzID0gWzBdICogKGFyZ2NvdW50ICsgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VicHJvY2Vzcy5Qb3BlbiwgKnRvb19tYW55X2FyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnJykKKworICAgIGRlZiB0ZXN0X3N0ZGluX25vbmUoc2VsZik6CisgICAgICAgICMgLnN0ZGluIGlzIE5vbmUgd2hlbiBub3QgcmVkaXJlY3RlZAorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICdwcmludCAiYmFuYW5hIiddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3RkaW4sIE5vbmUpCisKKyAgICBkZWYgdGVzdF9zdGRvdXRfbm9uZShzZWxmKToKKyAgICAgICAgIyAuc3Rkb3V0IGlzIE5vbmUgd2hlbiBub3QgcmVkaXJlY3RlZCwgYW5kIHRoZSBjaGlsZCdzIHN0ZG91dCB3aWxsCisgICAgICAgICMgYmUgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudC4gIEluIG9yZGVyIHRvIHRlc3QgdGhpcyB3ZSBydW4gYQorICAgICAgICAjIHN1YnByb2Nlc3MgaW4gYSBzdWJwcm9jZXNzOgorICAgICAgICAjIHRoaXNfdGVzdAorICAgICAgICAjICAgXC0tIHN1YnByb2Nlc3MgY3JlYXRlZCBieSB0aGlzIHRlc3QgKHBhcmVudCkKKyAgICAgICAgIyAgICAgICAgICBcLS0gc3VicHJvY2VzcyBjcmVhdGVkIGJ5IHRoZSBwYXJlbnQgc3VicHJvY2VzcyAoY2hpbGQpCisgICAgICAgICMgVGhlIHBhcmVudCBkb2Vzbid0IHNwZWNpZnkgc3Rkb3V0LCBzbyB0aGUgY2hpbGQgd2lsbCB1c2UgdGhlCisgICAgICAgICMgcGFyZW50J3Mgc3Rkb3V0LiAgVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IHRoZSBtZXNzYWdlIHByaW50ZWQgYnkgdGhlCisgICAgICAgICMgY2hpbGQgZ29lcyB0byB0aGUgcGFyZW50IHN0ZG91dC4gIFRoZSBwYXJlbnQgYWxzbyBjaGVja3MgdGhhdCB0aGUKKyAgICAgICAgIyBjaGlsZCdzIHN0ZG91dCBpcyBOb25lLiAgU2VlICMxMTk2My4KKyAgICAgICAgY29kZSA9ICgnaW1wb3J0IHN5czsgZnJvbSBzdWJwcm9jZXNzIGltcG9ydCBQb3BlbiwgUElQRTsnCisgICAgICAgICAgICAgICAgJ3AgPSBQb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICJwcmludCBcJ3Rlc3Rfc3Rkb3V0X25vbmVcJyJdLCcKKyAgICAgICAgICAgICAgICAnICAgICAgICAgIHN0ZGluPVBJUEUsIHN0ZGVycj1QSVBFKTsnCisgICAgICAgICAgICAgICAgJ3Aud2FpdCgpOyBhc3NlcnQgcC5zdGRvdXQgaXMgTm9uZTsnKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsIGNvZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgb3V0LCBlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJldHVybmNvZGUsIDAsIGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQucnN0cmlwKCksICd0ZXN0X3N0ZG91dF9ub25lJykKKworICAgIGRlZiB0ZXN0X3N0ZGVycl9ub25lKHNlbGYpOgorICAgICAgICAjIC5zdGRlcnIgaXMgTm9uZSB3aGVuIG5vdCByZWRpcmVjdGVkCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgJ3ByaW50ICJiYW5hbmEiJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3RkZXJyLCBOb25lKQorCisgICAgZGVmIHRlc3RfZXhlY3V0YWJsZV93aXRoX2N3ZChzZWxmKToKKyAgICAgICAgcHl0aG9uX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKHN5cy5leGVjdXRhYmxlKSkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJzb21ldGhpbmd5b3Vkb250aGF2ZSIsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGU9c3lzLmV4ZWN1dGFibGUsIGN3ZD1weXRob25fZGlyKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgNDcpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICJuZWVkIGFuIGluc3RhbGxlZCBQeXRob24uIFNlZSAjNzc3NCIpCisgICAgZGVmIHRlc3RfZXhlY3V0YWJsZV93aXRob3V0X2N3ZChzZWxmKToKKyAgICAgICAgIyBGb3IgYSBub3JtYWwgaW5zdGFsbGF0aW9uLCBpdCBzaG91bGQgd29yayB3aXRob3V0ICdjd2QnCisgICAgICAgICMgYXJndW1lbnQuICBGb3IgdGVzdCBydW5zIGluIHRoZSBidWlsZCBkaXJlY3RvcnksIHNlZSAjNzc3NC4KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJzb21ldGhpbmd5b3Vkb250aGF2ZSIsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGU9c3lzLmV4ZWN1dGFibGUpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXR1cm5jb2RlLCA0NykKKworICAgIGRlZiB0ZXN0X3N0ZGluX3BpcGUoc2VsZik6CisgICAgICAgICMgc3RkaW4gcmVkaXJlY3Rpb24KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuZXhpdChzeXMuc3RkaW4ucmVhZCgpID09ICJwZWFyIiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgcC5zdGRpbi53cml0ZSgicGVhciIpCisgICAgICAgIHAuc3RkaW4uY2xvc2UoKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgMSkKKworICAgIGRlZiB0ZXN0X3N0ZGluX2ZpbGVkZXMoc2VsZik6CisgICAgICAgICMgc3RkaW4gaXMgc2V0IHRvIG9wZW4gZmlsZSBkZXNjcmlwdG9yCisgICAgICAgIHRmID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIGQgPSB0Zi5maWxlbm8oKQorICAgICAgICBvcy53cml0ZShkLCAicGVhciIpCisgICAgICAgIG9zLmxzZWVrKGQsIDAsIDApCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLmV4aXQoc3lzLnN0ZGluLnJlYWQoKSA9PSAicGVhciIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49ZCkKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJldHVybmNvZGUsIDEpCisKKyAgICBkZWYgdGVzdF9zdGRpbl9maWxlb2JqKHNlbGYpOgorICAgICAgICAjIHN0ZGluIGlzIHNldCB0byBvcGVuIGZpbGUgb2JqZWN0CisgICAgICAgIHRmID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIHRmLndyaXRlKCJwZWFyIikKKyAgICAgICAgdGYuc2VlaygwKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5leGl0KHN5cy5zdGRpbi5yZWFkKCkgPT0gInBlYXIiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXRmKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgMSkKKworICAgIGRlZiB0ZXN0X3N0ZG91dF9waXBlKHNlbGYpOgorICAgICAgICAjIHN0ZG91dCByZWRpcmVjdGlvbgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKCJvcmFuZ2UiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksICJvcmFuZ2UiKQorCisgICAgZGVmIHRlc3Rfc3Rkb3V0X2ZpbGVkZXMoc2VsZik6CisgICAgICAgICMgc3Rkb3V0IGlzIHNldCB0byBvcGVuIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICB0ZiA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKQorICAgICAgICBkID0gdGYuZmlsZW5vKCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZSgib3JhbmdlIiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9ZCkKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgb3MubHNlZWsoZCwgMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5yZWFkKGQsIDEwMjQpLCAib3JhbmdlIikKKworICAgIGRlZiB0ZXN0X3N0ZG91dF9maWxlb2JqKHNlbGYpOgorICAgICAgICAjIHN0ZG91dCBpcyBzZXQgdG8gb3BlbiBmaWxlIG9iamVjdAorICAgICAgICB0ZiA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKCJvcmFuZ2UiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD10ZikKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgdGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRmLnJlYWQoKSwgIm9yYW5nZSIpCisKKyAgICBkZWYgdGVzdF9zdGRlcnJfcGlwZShzZWxmKToKKyAgICAgICAgIyBzdGRlcnIgcmVkaXJlY3Rpb24KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLnN0ZGVyci53cml0ZSgic3RyYXdiZXJyeSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHAuc3RkZXJyLnJlYWQoKSwgInN0cmF3YmVycnkiKQorCisgICAgZGVmIHRlc3Rfc3RkZXJyX2ZpbGVkZXMoc2VsZik6CisgICAgICAgICMgc3RkZXJyIGlzIHNldCB0byBvcGVuIGZpbGUgZGVzY3JpcHRvcgorICAgICAgICB0ZiA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoKQorICAgICAgICBkID0gdGYuZmlsZW5vKCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsgc3lzLnN0ZGVyci53cml0ZSgic3RyYXdiZXJyeSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPWQpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIG9zLmxzZWVrKGQsIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwob3MucmVhZChkLCAxMDI0KSwgInN0cmF3YmVycnkiKQorCisgICAgZGVmIHRlc3Rfc3RkZXJyX2ZpbGVvYmooc2VsZik6CisgICAgICAgICMgc3RkZXJyIGlzIHNldCB0byBvcGVuIGZpbGUgb2JqZWN0CisgICAgICAgIHRmID0gdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IHN5cy5zdGRlcnIud3JpdGUoInN0cmF3YmVycnkiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj10ZikKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgdGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHRmLnJlYWQoKSwgInN0cmF3YmVycnkiKQorCisgICAgZGVmIHRlc3Rfc3Rkb3V0X3N0ZGVycl9waXBlKHNlbGYpOgorICAgICAgICAjIGNhcHR1cmUgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gdGhlIHNhbWUgcGlwZQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUoImFwcGxlIik7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC5mbHVzaCgpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRlcnIud3JpdGUoIm9yYW5nZSIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5TVERPVVQpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChwLnN0ZG91dC5yZWFkKCksICJhcHBsZW9yYW5nZSIpCisKKyAgICBkZWYgdGVzdF9zdGRvdXRfc3RkZXJyX2ZpbGUoc2VsZik6CisgICAgICAgICMgY2FwdHVyZSBzdGRvdXQgYW5kIHN0ZGVyciB0byB0aGUgc2FtZSBvcGVuIGZpbGUKKyAgICAgICAgdGYgPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5czsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKCJhcHBsZSIpOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJvcmFuZ2UiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD10ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9dGYpCisgICAgICAgIHAud2FpdCgpCisgICAgICAgIHRmLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbCh0Zi5yZWFkKCksICJhcHBsZW9yYW5nZSIpCisKKyAgICBkZWYgdGVzdF9zdGRvdXRfZmlsZWRlc19vZl9zdGRvdXQoc2VsZik6CisgICAgICAgICMgc3Rkb3V0IGlzIHNldCB0byAxICgjMTUzMTg2MikuCisgICAgICAgICMgVG8gYXZvaWQgcHJpbnRpbmcgdGhlIHRleHQgb24gc3Rkb3V0LCB3ZSBkbyBzb21ldGhpbmcgc2ltaWxhciB0bworICAgICAgICAjIHRlc3Rfc3Rkb3V0X25vbmUgKHNlZSBhYm92ZSkuICBUaGUgcGFyZW50IHN1YnByb2Nlc3MgY2FsbHMgdGhlIGNoaWxkCisgICAgICAgICMgc3VicHJvY2VzcyBwYXNzaW5nIHN0ZG91dD0xLCBhbmQgdGhpcyB0ZXN0IHVzZXMgc3Rkb3V0PVBJUEUgaW4KKyAgICAgICAgIyBvcmRlciB0byBjYXB0dXJlIGFuZCBjaGVjayB0aGUgb3V0cHV0IG9mIHRoZSBwYXJlbnQuIFNlZSAjMTE5NjMuCisgICAgICAgIGNvZGUgPSAoJ2ltcG9ydCBzeXMsIHN1YnByb2Nlc3M7ICcKKyAgICAgICAgICAgICAgICAncmMgPSBzdWJwcm9jZXNzLmNhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAnCisgICAgICAgICAgICAgICAgJyAgICAiaW1wb3J0IG9zLCBzeXM7IHN5cy5leGl0KG9zLndyaXRlKHN5cy5zdGRvdXQuZmlsZW5vKCksICcKKyAgICAgICAgICAgICAgICAgICAgICdcJ3Rlc3Qgd2l0aCBzdGRvdXQ9MVwnKSkiXSwgc3Rkb3V0PTEpOyAnCisgICAgICAgICAgICAgICAgJ2Fzc2VydCByYyA9PSAxOCcpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgY29kZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBvdXQsIGVyciA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucmV0dXJuY29kZSwgMCwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5yc3RyaXAoKSwgJ3Rlc3Qgd2l0aCBzdGRvdXQ9MScpCisKKyAgICBkZWYgdGVzdF9jd2Qoc2VsZik6CisgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorICAgICAgICAjIFdlIGNhbm5vdCB1c2Ugb3MucGF0aC5yZWFscGF0aCB0byBjYW5vbmljYWxpemUgdGhlIHBhdGgsCisgICAgICAgICMgc2luY2UgaXQgZG9lc24ndCBleHBhbmQgVHJ1NjQge21lbWJ9IHN0cmluZ3MuIFNlZSBidWcgMTA2MzU3MS4KKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIodG1wZGlyKQorICAgICAgICB0bXBkaXIgPSBvcy5nZXRjd2QoKQorICAgICAgICBvcy5jaGRpcihjd2QpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXMsb3M7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZShvcy5nZXRjd2QoKSknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGN3ZD10bXBkaXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgbm9ybWNhc2UgPSBvcy5wYXRoLm5vcm1jYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm9ybWNhc2UocC5zdGRvdXQucmVhZCgpKSwgbm9ybWNhc2UodG1wZGlyKSkKKworICAgIGRlZiB0ZXN0X2VudihzZWxmKToKKyAgICAgICAgbmV3ZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgbmV3ZW52WyJGUlVJVCJdID0gIm9yYW5nZSIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5cyxvczsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKG9zLmdldGVudigiRlJVSVQiKSknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnN0ZG91dC5yZWFkKCksICJvcmFuZ2UiKQorCisgICAgZGVmIHRlc3RfY29tbXVuaWNhdGVfc3RkaW4oc2VsZik6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuZXhpdChzeXMuc3RkaW4ucmVhZCgpID09ICJwZWFyIiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBwLmNvbW11bmljYXRlKCJwZWFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJldHVybmNvZGUsIDEpCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9zdGRvdXQoc2VsZik6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3Rkb3V0LndyaXRlKCJwaW5lYXBwbGUiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAoc3Rkb3V0LCBzdGRlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LCAicGluZWFwcGxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRlcnIsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9zdGRlcnIoc2VsZik6CisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuc3RkZXJyLndyaXRlKCJwaW5lYXBwbGUiKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAoc3Rkb3V0LCBzdGRlcnIpID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgInBpbmVhcHBsZSIpCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZShzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5cyxvczsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJwaW5lYXBwbGUiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKHN5cy5zdGRpbi5yZWFkKCkpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQorICAgICAgICAoc3Rkb3V0LCBzdGRlcnIpID0gcC5jb21tdW5pY2F0ZSgiYmFuYW5hIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsICJiYW5hbmEiKQorICAgICAgICBzZWxmLmFzc2VydFN0ZGVyckVxdWFsKHN0ZGVyciwgInBpbmVhcHBsZSIpCisKKyAgICAjIFRoaXMgdGVzdCBpcyBMaW51eCBzcGVjaWZpYyBmb3Igc2ltcGxpY2l0eSB0byBhdCBsZWFzdCBoYXZlCisgICAgIyBzb21lIGNvdmVyYWdlLiAgSXQgaXMgbm90IGEgcGxhdGZvcm0gc3BlY2lmaWMgYnVnLgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLnBhdGguaXNkaXIoJy9wcm9jLyVkL2ZkJyAlIG9zLmdldHBpZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTGludXggc3BlY2lmaWMiKQorICAgICMgVGVzdCBmb3IgdGhlIGZkIGxlYWsgcmVwb3J0ZWQgaW4gaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTI3OTEuCisgICAgZGVmIHRlc3RfY29tbXVuaWNhdGVfcGlwZV9mZF9sZWFrKHNlbGYpOgorICAgICAgICBmZF9kaXJlY3RvcnkgPSAnL3Byb2MvJWQvZmQnICUgb3MuZ2V0cGlkKCkKKyAgICAgICAgbnVtX2Zkc19iZWZvcmVfcG9wZW4gPSBsZW4ob3MubGlzdGRpcihmZF9kaXJlY3RvcnkpKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICJwcmludCgpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHAuY29tbXVuaWNhdGUoKQorICAgICAgICBudW1fZmRzX2FmdGVyX2NvbW11bmljYXRlID0gbGVuKG9zLmxpc3RkaXIoZmRfZGlyZWN0b3J5KSkKKyAgICAgICAgZGVsIHAKKyAgICAgICAgbnVtX2Zkc19hZnRlcl9kZXN0cnVjdGlvbiA9IGxlbihvcy5saXN0ZGlyKGZkX2RpcmVjdG9yeSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtX2Zkc19iZWZvcmVfcG9wZW4sIG51bV9mZHNfYWZ0ZXJfZGVzdHJ1Y3Rpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtX2Zkc19iZWZvcmVfcG9wZW4sIG51bV9mZHNfYWZ0ZXJfY29tbXVuaWNhdGUpCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9yZXR1cm5zKHNlbGYpOgorICAgICAgICAjIGNvbW11bmljYXRlKCkgc2hvdWxkIHJldHVybiBOb25lIGlmIG5vIHJlZGlyZWN0aW9uIGlzIGFjdGl2ZQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIl0pCisgICAgICAgIChzdGRvdXQsIHN0ZGVycikgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RkZXJyLCBOb25lKQorCisgICAgZGVmIHRlc3RfY29tbXVuaWNhdGVfcGlwZV9idWYoc2VsZik6CisgICAgICAgICMgY29tbXVuaWNhdGUoKSB3aXRoIHdyaXRlcyBsYXJnZXIgdGhhbiBwaXBlX2J1ZgorICAgICAgICAjIFRoaXMgdGVzdCB3aWxsIHByb2JhYmx5IGRlYWRsb2NrIHJhdGhlciB0aGFuIGZhaWwsIGlmCisgICAgICAgICMgY29tbXVuaWNhdGUoKSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5LgorICAgICAgICB4LCB5ID0gb3MucGlwZSgpCisgICAgICAgIGlmIG1zd2luZG93czoKKyAgICAgICAgICAgIHBpcGVfYnVmID0gNTEyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwaXBlX2J1ZiA9IG9zLmZwYXRoY29uZih4LCAiUENfUElQRV9CVUYiKQorICAgICAgICBvcy5jbG9zZSh4KQorICAgICAgICBvcy5jbG9zZSh5KQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzLG9zOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUoc3lzLnN0ZGluLnJlYWQoNDcpKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3RkZXJyLndyaXRlKCJ4eXoiKiVkKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKHN5cy5zdGRpbi5yZWFkKCkpJyAlIHBpcGVfYnVmXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgIHN0cmluZ190b193cml0ZSA9ICJhYmMiKnBpcGVfYnVmCisgICAgICAgIChzdGRvdXQsIHN0ZGVycikgPSBwLmNvbW11bmljYXRlKHN0cmluZ190b193cml0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsIHN0cmluZ190b193cml0ZSkKKworICAgIGRlZiB0ZXN0X3dyaXRlc19iZWZvcmVfY29tbXVuaWNhdGUoc2VsZik6CisgICAgICAgICMgc3RkaW4ud3JpdGUgYmVmb3JlIGNvbW11bmljYXRlKCkKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5cyxvczsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LndyaXRlKHN5cy5zdGRpbi5yZWFkKCkpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQorICAgICAgICBwLnN0ZGluLndyaXRlKCJiYW5hbmEiKQorICAgICAgICAoc3Rkb3V0LCBzdGRlcnIpID0gcC5jb21tdW5pY2F0ZSgic3BsaXQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0ZG91dCwgImJhbmFuYXNwbGl0IikKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsICIiKQorCisgICAgZGVmIHRlc3RfdW5pdmVyc2FsX25ld2xpbmVzKHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzLG9zOycgKyBTRVRCSU5BUlkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTFcXG4iKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTJcXHIiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTNcXHJcXG4iKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTRcXHIiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgiXFxubGluZTUiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgiXFxubGluZTYiKTsnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz0xKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHN0ZG91dCA9IHAuc3Rkb3V0LnJlYWQoKQorICAgICAgICBpZiBoYXNhdHRyKGZpbGUsICduZXdsaW5lcycpOgorICAgICAgICAgICAgIyBJbnRlcnByZXRlciB3aXRoIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTFcbmxpbmUyXG5saW5lM1xubGluZTRcbmxpbmU1XG5saW5lNiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEludGVycHJldGVyIHdpdGhvdXQgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lMVxubGluZTJccmxpbmUzXHJcbmxpbmU0XHJcbmxpbmU1XG5saW5lNiIpCisKKyAgICBkZWYgdGVzdF91bml2ZXJzYWxfbmV3bGluZXNfY29tbXVuaWNhdGUoc2VsZik6CisgICAgICAgICMgdW5pdmVyc2FsIG5ld2xpbmVzIHRocm91Z2ggY29tbXVuaWNhdGUoKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzLG9zOycgKyBTRVRCSU5BUlkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTFcXG4iKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTJcXHIiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTNcXHJcXG4iKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgibGluZTRcXHIiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgiXFxubGluZTUiKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXMuc3Rkb3V0LmZsdXNoKCk7JworICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgiXFxubGluZTYiKTsnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcz0xKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgKHN0ZG91dCwgc3RkZXJyKSA9IHAuY29tbXVuaWNhdGUoKQorICAgICAgICBpZiBoYXNhdHRyKGZpbGUsICduZXdsaW5lcycpOgorICAgICAgICAgICAgIyBJbnRlcnByZXRlciB3aXRoIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGluZTFcbmxpbmUyXG5saW5lM1xubGluZTRcbmxpbmU1XG5saW5lNiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIEludGVycHJldGVyIHdpdGhvdXQgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lMVxubGluZTJccmxpbmUzXHJcbmxpbmU0XHJcbmxpbmU1XG5saW5lNiIpCisKKyAgICBkZWYgdGVzdF9ub19sZWFraW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBsZWFrIG5vIHJlc291cmNlcworICAgICAgICBpZiBub3QgbXN3aW5kb3dzOgorICAgICAgICAgICAgbWF4X2hhbmRsZXMgPSAxMDI2ICMgdG9vIG11Y2ggZm9yIG1vc3QgVU5JWCBzeXN0ZW1zCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXhfaGFuZGxlcyA9IDIwNTAgIyB0b28gbXVjaCBmb3IgKGF0IGxlYXN0IHNvbWUpIFdpbmRvd3Mgc2V0dXBzCisgICAgICAgIGhhbmRsZXMgPSBbXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtYXhfaGFuZGxlcyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBoYW5kbGVzLmFwcGVuZChvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuT19XUk9OTFkgfCBvcy5PX0NSRUFUKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICBpZiBlLmVycm5vICE9IGVycm5vLkVNRklMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImZhaWxlZCB0byByZWFjaCB0aGUgZmlsZSBkZXNjcmlwdG9yIGxpbWl0ICIKKyAgICAgICAgICAgICAgICAgICAgIih0cmllZCAlZCkiICUgbWF4X2hhbmRsZXMpCisgICAgICAgICAgICAjIENsb3NlIGEgY291cGxlIG9mIHRoZW0gKHNob3VsZCBiZSBlbm91Z2ggZm9yIGEgc3VicHJvY2VzcykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICAgICBvcy5jbG9zZShoYW5kbGVzLnBvcCgpKQorICAgICAgICAgICAgIyBMb29wIGNyZWF0aW5nIHNvbWUgc3VicHJvY2Vzc2VzLiBJZiBvbmUgb2YgdGhlbSBsZWFrcyBzb21lIGZkcywKKyAgICAgICAgICAgICMgdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gd2lsbCBmYWlsIGJ5IHJlYWNoaW5nIHRoZSBtYXggZmQgbGltaXQuCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxNSk6CisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeXMuc3Rkb3V0LndyaXRlKHN5cy5zdGRpbi5yZWFkKCkpIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgICAgICBkYXRhID0gcC5jb21tdW5pY2F0ZShiImxpbWUiKVswXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYiJsaW1lIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvciBoIGluIGhhbmRsZXM6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoaCkKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGRlZiB0ZXN0X2xpc3QyY21kbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbJ2EgYiBjJywgJ2QnLCAnZSddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnImEgYiBjIiBkIGUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFsnYWIiYycsICdcXCcsICdkJ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhYlxcImMgXFwgZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWydhYiJjJywgJyBcXCcsICdkJ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhYlxcImMgIiBcXFxcIiBkJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJwcm9jZXNzLmxpc3QyY21kbGluZShbJ2FcXFxcXFxiJywgJ2RlIGZnJywgJ2gnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FcXFxcXFxiICJkZSBmZyIgaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWydhXFwiYicsICdjJywgJ2QnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FcXFxcXFwiYiBjIGQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1YnByb2Nlc3MubGlzdDJjbWRsaW5lKFsnYVxcXFxiIGMnLCAnZCcsICdlJ10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICciYVxcXFxiIGMiIGQgZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWydhXFxcXGJcXCBjJywgJ2QnLCAnZSddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnImFcXFxcYlxcIGMiIGQgZScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VicHJvY2Vzcy5saXN0MmNtZGxpbmUoWydhYicsICcnXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FiICIiJykKKworCisgICAgZGVmIHRlc3RfcG9sbChzZWxmKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiLWMiLCAiaW1wb3J0IHRpbWU7IHRpbWUuc2xlZXAoMSkiXSkKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIHdoaWxlIHAucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgIyBXZSBleHBlY3QgdGhhdCB0aGUgcG9sbCBsb29wIHByb2JhYmx5IHdlbnQgYXJvdW5kIGFib3V0IDEwIHRpbWVzLAorICAgICAgICAjIGJ1dCwgYmFzZWQgb24gc3lzdGVtIHNjaGVkdWxpbmcgd2UgY2FuJ3QgY29udHJvbCwgaXQncyBwb3NzaWJsZQorICAgICAgICAjIHBvbGwoKSBuZXZlciByZXR1cm5lZCBOb25lLiAgSXQgInNob3VsZCBiZSIgdmVyeSByYXJlIHRoYXQgaXQKKyAgICAgICAgIyBkaWRuJ3QgZ28gYXJvdW5kIGF0IGxlYXN0IHR3aWNlLgorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChjb3VudCwgMikKKyAgICAgICAgIyBTdWJzZXF1ZW50IGludm9jYXRpb25zIHNob3VsZCBqdXN0IHJldHVybiB0aGUgcmV0dXJuY29kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9sbCgpLCAwKQorCisKKyAgICBkZWYgdGVzdF93YWl0KHNlbGYpOgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICItYyIsICJpbXBvcnQgdGltZTsgdGltZS5zbGVlcCgyKSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAud2FpdCgpLCAwKQorICAgICAgICAjIFN1YnNlcXVlbnQgaW52b2NhdGlvbnMgc2hvdWxkIGp1c3QgcmV0dXJuIHRoZSByZXR1cm5jb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIDApCisKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfYnVmc2l6ZShzZWxmKToKKyAgICAgICAgIyBhbiBpbnZhbGlkIHR5cGUgb2YgdGhlIGJ1ZnNpemUgYXJndW1lbnQgc2hvdWxkIHJhaXNlCisgICAgICAgICMgVHlwZUVycm9yLgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6CisgICAgICAgICAgICBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgInBhc3MiXSwgIm9yYW5nZSIpCisKKyAgICBkZWYgdGVzdF9sZWFraW5nX2Zkc19vbl9lcnJvcihzZWxmKToKKyAgICAgICAgIyBzZWUgYnVnICM1MTc5OiBQb3BlbiBsZWFrcyBmaWxlIGRlc2NyaXB0b3JzIHRvIFBJUEVzIGlmCisgICAgICAgICMgdGhlIGNoaWxkIGZhaWxzIHRvIGV4ZWN1dGU7IHRoaXMgd2lsbCBldmVudHVhbGx5IGV4aGF1c3QKKyAgICAgICAgIyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3BlbiBmZHMuIDEwMjQgc2VlbXMgYSB2ZXJ5IGNvbW1vbgorICAgICAgICAjIHZhbHVlIGZvciB0aGF0IGxpbWl0LCBidXQgV2luZG93cyBoYXMgMjA0OCwgc28gd2UgbG9vcAorICAgICAgICAjIDEwMjQgdGltZXMgKGVhY2ggY2FsbCBsZWFrZWQgdHdvIGZkcykuCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMjQpOgorICAgICAgICAgICAgIyBXaW5kb3dzIHJhaXNlcyBJT0Vycm9yLiAgT3RoZXJzIHJhaXNlIE9TRXJyb3IuCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEVudmlyb25tZW50RXJyb3IpIGFzIGM6CisgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5Qb3BlbihbJ25vbmV4aXN0aW5nX2lfaG9wZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICAgICAjIGlnbm9yZSBlcnJvcnMgdGhhdCBpbmRpY2F0ZSB0aGUgY29tbWFuZCB3YXMgbm90IGZvdW5kCisgICAgICAgICAgICBpZiBjLmV4Y2VwdGlvbi5lcnJubyBub3QgaW4gKGVycm5vLkVOT0VOVCwgZXJybm8uRUFDQ0VTKToKKyAgICAgICAgICAgICAgICByYWlzZSBjLmV4Y2VwdGlvbgorCisgICAgZGVmIHRlc3RfaGFuZGxlc19jbG9zZWRfb25fZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIElmIENyZWF0ZVByb2Nlc3MgZXhpdHMgd2l0aCBhbiBlcnJvciwgZW5zdXJlIHRoZQorICAgICAgICAjIGR1cGxpY2F0ZSBvdXRwdXQgaGFuZGxlcyBhcmUgcmVsZWFzZWQKKyAgICAgICAgaWZoYW5kbGUsIGlmbmFtZSA9IG1rc3RlbXAoKQorICAgICAgICBvZmhhbmRsZSwgb2ZuYW1lID0gbWtzdGVtcCgpCisgICAgICAgIGVmaGFuZGxlLCBlZm5hbWUgPSBta3N0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3VicHJvY2Vzcy5Qb3BlbiAoWyIqIl0sIHN0ZGluPWlmaGFuZGxlLCBzdGRvdXQ9b2ZoYW5kbGUsCisgICAgICAgICAgICAgIHN0ZGVycj1lZmhhbmRsZSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBvcy5jbG9zZShpZmhhbmRsZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShpZm5hbWUpCisgICAgICAgICAgICBvcy5jbG9zZShvZmhhbmRsZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShvZm5hbWUpCisgICAgICAgICAgICBvcy5jbG9zZShlZmhhbmRsZSkKKyAgICAgICAgICAgIG9zLnJlbW92ZShlZm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoaWZuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhvZm5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKGVmbmFtZSkpCisKKyAgICBkZWYgdGVzdF9jb21tdW5pY2F0ZV9lcGlwZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMDk2MzogY29tbXVuaWNhdGUoKSBzaG91bGQgaGlkZSBFUElQRQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICdwYXNzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQorICAgICAgICBwLmNvbW11bmljYXRlKCJ4IiAqIDIqKjIwKQorCisgICAgZGVmIHRlc3RfY29tbXVuaWNhdGVfZXBpcGVfb25seV9zdGRpbihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMDk2MzogY29tbXVuaWNhdGUoKSBzaG91bGQgaGlkZSBFUElQRQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICdwYXNzJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkaW4uY2xvc2UpCisgICAgICAgIHRpbWUuc2xlZXAoMikKKyAgICAgICAgcC5jb21tdW5pY2F0ZSgieCIgKiAyKioyMCkKKworICAgICMgVGhpcyB0ZXN0IGlzIExpbnV4LWlzaCBzcGVjaWZpYyBmb3Igc2ltcGxpY2l0eSB0byBhdCBsZWFzdCBoYXZlCisgICAgIyBzb21lIGNvdmVyYWdlLiAgSXQgaXMgbm90IGEgcGxhdGZvcm0gc3BlY2lmaWMgYnVnLgorICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKG9zLnBhdGguaXNkaXIoJy9wcm9jLyVkL2ZkJyAlIG9zLmdldHBpZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTGludXggc3BlY2lmaWMiKQorICAgIGRlZiB0ZXN0X2ZhaWxlZF9jaGlsZF9leGVjdXRlX2ZkX2xlYWsoc2VsZik6CisgICAgICAgICIiIlRlc3QgZm9yIHRoZSBmb3JrKCkgZmFpbHVyZSBmZCBsZWFrIHJlcG9ydGVkIGluIGlzc3VlMTYzMjcuIiIiCisgICAgICAgIGZkX2RpcmVjdG9yeSA9ICcvcHJvYy8lZC9mZCcgJSBvcy5nZXRwaWQoKQorICAgICAgICBmZHNfYmVmb3JlX3BvcGVuID0gb3MubGlzdGRpcihmZF9kaXJlY3RvcnkpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUG9wZW5UZXN0RXhjZXB0aW9uKToKKyAgICAgICAgICAgIFBvcGVuRXhlY3V0ZUNoaWxkUmFpc2VzKAorICAgICAgICAgICAgICAgICAgICBbc3lzLmV4ZWN1dGFibGUsICctYycsICdwYXNzJ10sIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKworICAgICAgICAjIE5PVEU6IFRoaXMgdGVzdCBkb2Vzbid0IHZlcmlmeSB0aGF0IHRoZSByZWFsIF9leGVjdXRlX2NoaWxkCisgICAgICAgICMgZG9lcyBub3QgY2xvc2UgdGhlIGZpbGUgZGVzY3JpcHRvcnMgaXRzZWxmIG9uIHRoZSB3YXkgb3V0CisgICAgICAgICMgZHVyaW5nIGFuIGV4Y2VwdGlvbi4gIENvZGUgaW5zcGVjdGlvbiBoYXMgY29uZmlybWVkIHRoYXQuCisKKyAgICAgICAgZmRzX2FmdGVyX2V4Y2VwdGlvbiA9IG9zLmxpc3RkaXIoZmRfZGlyZWN0b3J5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZkc19iZWZvcmVfcG9wZW4sIGZkc19hZnRlcl9leGNlcHRpb24pCisKKworIyBjb250ZXh0IG1hbmFnZXIKK2NsYXNzIF9TdXBwcmVzc0NvcmVGaWxlcyhvYmplY3QpOgorICAgICIiIlRyeSB0byBwcmV2ZW50IGNvcmUgZmlsZXMgZnJvbSBiZWluZyBjcmVhdGVkLiIiIgorICAgIG9sZF9saW1pdCA9IE5vbmUKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICIiIlRyeSB0byBzYXZlIHByZXZpb3VzIHVsaW1pdCwgdGhlbiBzZXQgaXQgdG8gKDAsIDApLiIiIgorICAgICAgICBpZiByZXNvdXJjZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLm9sZF9saW1pdCA9IHJlc291cmNlLmdldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ09SRSkKKyAgICAgICAgICAgICAgICByZXNvdXJjZS5zZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0NPUkUsICgwLCAwKSkKKyAgICAgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgcmVzb3VyY2UuZXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAjIENoZWNrIGlmIHRoZSAnQ3Jhc2ggUmVwb3J0ZXInIG9uIE9TWCB3YXMgY29uZmlndXJlZAorICAgICAgICAgICAgIyBpbiAnRGV2ZWxvcGVyJyBtb2RlIGFuZCB3YXJuIHRoYXQgaXQgd2lsbCBnZXQgdHJpZ2dlcmVkCisgICAgICAgICAgICAjIHdoZW4gaXQgaXMuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoaXMgYXNzdW1lcyB0aGF0IHRoaXMgY29udGV4dCBtYW5hZ2VyIGlzIHVzZWQgaW4gdGVzdHMKKyAgICAgICAgICAgICMgdGhhdCBtaWdodCB0cmlnZ2VyIHRoZSBuZXh0IG1hbmFnZXIuCisgICAgICAgICAgICB2YWx1ZSA9IHN1YnByb2Nlc3MuUG9wZW4oWycvdXNyL2Jpbi9kZWZhdWx0cycsICdyZWFkJywKKyAgICAgICAgICAgICAgICAgICAgJ2NvbS5hcHBsZS5DcmFzaFJlcG9ydGVyJywgJ0RpYWxvZ1R5cGUnXSwKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkuY29tbXVuaWNhdGUoKVswXQorICAgICAgICAgICAgaWYgdmFsdWUuc3RyaXAoKSA9PSBiJ2RldmVsb3Blcic6CisgICAgICAgICAgICAgICAgcHJpbnQgInRoaXMgdGVzdHMgdHJpZ2dlcnMgdGhlIENyYXNoIFJlcG9ydGVyLCB0aGF0IGlzIGludGVudGlvbmFsIgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiUmV0dXJuIGNvcmUgZmlsZSBiZWhhdmlvciB0byBkZWZhdWx0LiIiIgorICAgICAgICBpZiBzZWxmLm9sZF9saW1pdCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHJlc291cmNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlc291cmNlLnNldHJsaW1pdChyZXNvdXJjZS5STElNSVRfQ09SRSwgc2VsZi5vbGRfbGltaXQpCisgICAgICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIHJlc291cmNlLmVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKHNpZ25hbCwgJ1NJR0FMUk0nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWlyZXMgc2lnbmFsLlNJR0FMUk0iKQorICAgIGRlZiB0ZXN0X2NvbW11bmljYXRlX2VpbnRyKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMjQ5MzogY29tbXVuaWNhdGUoKSBzaG91bGQgaGFuZGxlIEVJTlRSCisgICAgICAgIGRlZiBoYW5kbGVyKHNpZ251bSwgZnJhbWUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvbGRfaGFuZGxlciA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGhhbmRsZXIpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzaWduYWwuc2lnbmFsLCBzaWduYWwuU0lHQUxSTSwgb2xkX2hhbmRsZXIpCisKKyAgICAgICAgIyB0aGUgcHJvY2VzcyBpcyBydW5uaW5nIGZvciAyIHNlY29uZHMKKyAgICAgICAgYXJncyA9IFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgJ2ltcG9ydCB0aW1lOyB0aW1lLnNsZWVwKDIpJ10KKyAgICAgICAgZm9yIHN0cmVhbSBpbiAoJ3N0ZG91dCcsICdzdGRlcnInKToKKyAgICAgICAgICAgIGt3ID0ge3N0cmVhbTogc3VicHJvY2Vzcy5QSVBFfQorICAgICAgICAgICAgd2l0aCBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsICoqa3cpIGFzIHByb2Nlc3M6CisgICAgICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICAgICAgIyBjb21tdW5pY2F0ZSgpIHdpbGwgYmUgaW50ZXJydXB0ZWQgYnkgU0lHQUxSTQorICAgICAgICAgICAgICAgIHByb2Nlc3MuY29tbXVuaWNhdGUoKQorCisKK0B1bml0dGVzdC5za2lwSWYobXN3aW5kb3dzLCAiUE9TSVggc3BlY2lmaWMgdGVzdHMiKQorY2xhc3MgUE9TSVhQcm9jZXNzVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgICMgY2F1Z2h0ICYgcmUtcmFpc2VkIGV4Y2VwdGlvbnMKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yKSBhcyBjOgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2Q9Ii90aGlzL3BhdGgvZG9lcy9ub3QvZXhpc3QiKQorICAgICAgICAjIFRoZSBhdHRyaWJ1dGUgY2hpbGRfdHJhY2ViYWNrIHNob3VsZCBjb250YWluICJvcy5jaGRpciIgc29tZXdoZXJlLgorICAgICAgICBzZWxmLmFzc2VydEluKCJvcy5jaGRpciIsIGMuZXhjZXB0aW9uLmNoaWxkX3RyYWNlYmFjaykKKworICAgIGRlZiB0ZXN0X3J1bl9hYm9ydChzZWxmKToKKyAgICAgICAgIyByZXR1cm5jb2RlIGhhbmRsZXMgc2lnbmFsIHRlcm1pbmF0aW9uCisgICAgICAgIHdpdGggX1N1cHByZXNzQ29yZUZpbGVzKCk6CisgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBvczsgb3MuYWJvcnQoKSJdKQorICAgICAgICAgICAgcC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtcC5yZXR1cm5jb2RlLCBzaWduYWwuU0lHQUJSVCkKKworICAgIGRlZiB0ZXN0X3ByZWV4ZWMoc2VsZik6CisgICAgICAgICMgcHJlZXhlYyBmdW5jdGlvbgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5cywgb3M7IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5cy5zdGRvdXQud3JpdGUob3MuZ2V0ZW52KCdGUlVJVCcpKSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPWxhbWJkYTogb3MucHV0ZW52KCJGUlVJVCIsICJhcHBsZSIpKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zdGRvdXQucmVhZCgpLCAiYXBwbGUiKQorCisgICAgY2xhc3MgX1Rlc3RFeGVjdXRlQ2hpbGRQb3BlbihzdWJwcm9jZXNzLlBvcGVuKToKKyAgICAgICAgIiIiVXNlZCB0byB0ZXN0IGJlaGF2aW9yIGF0IHRoZSBlbmQgb2YgX2V4ZWN1dGVfY2hpbGQuIiIiCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0Y2FzZSwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RjYXNlID0gdGVzdGNhc2UKKyAgICAgICAgICAgIHN1YnByb2Nlc3MuUG9wZW4uX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorCisgICAgICAgIGRlZiBfZXhlY3V0ZV9jaGlsZCgKKyAgICAgICAgICAgICAgICBzZWxmLCBhcmdzLCBleGVjdXRhYmxlLCBwcmVleGVjX2ZuLCBjbG9zZV9mZHMsIGN3ZCwgZW52LAorICAgICAgICAgICAgICAgIHVuaXZlcnNhbF9uZXdsaW5lcywgc3RhcnR1cGluZm8sIGNyZWF0aW9uZmxhZ3MsIHNoZWxsLAorICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlLAorICAgICAgICAgICAgICAgIGVycnJlYWQsIGVycndyaXRlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzdWJwcm9jZXNzLlBvcGVuLl9leGVjdXRlX2NoaWxkKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYXJncywgZXhlY3V0YWJsZSwgcHJlZXhlY19mbiwgY2xvc2VfZmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgY3dkLCBlbnYsIHVuaXZlcnNhbF9uZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dXBpbmZvLCBjcmVhdGlvbmZsYWdzLCBzaGVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJyZWFkLCBlcnJ3cml0ZSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgIyBPcGVuIGEgYnVuY2ggb2YgZmlsZSBkZXNjcmlwdG9ycyBhbmQgdmVyaWZ5IHRoYXQKKyAgICAgICAgICAgICAgICAjIG5vbmUgb2YgdGhlbSBhcmUgdGhlIHNhbWUgYXMgdGhlIG9uZXMgdGhlIFBvcGVuCisgICAgICAgICAgICAgICAgIyBpbnN0YW5jZSBpcyB1c2luZyBmb3Igc3RkaW4vc3Rkb3V0L3N0ZGVyci4KKyAgICAgICAgICAgICAgICBkZXZ6ZXJvX2ZkcyA9IFtvcy5vcGVuKCIvZGV2L3plcm8iLCBvcy5PX1JET05MWSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZSg4KV0KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZvciBmZCBpbiBkZXZ6ZXJvX2ZkczoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RjYXNlLmFzc2VydE5vdEluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZCwgKHAyY3dyaXRlLCBjMnByZWFkLCBlcnJyZWFkKSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBtYXAob3MuY2xvc2UsIGRldnplcm9fZmRzKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihub3Qgb3MucGF0aC5leGlzdHMoIi9kZXYvemVybyIpLCAiL2Rldi96ZXJvIHJlcXVpcmVkLiIpCisgICAgZGVmIHRlc3RfcHJlZXhlY19lcnJwaXBlX2RvZXNfbm90X2RvdWJsZV9jbG9zZV9waXBlcyhzZWxmKToKKyAgICAgICAgIiIiSXNzdWUxNjE0MDogRG9uJ3QgZG91YmxlIGNsb3NlIHBpcGVzIG9uIHByZWV4ZWMgZXJyb3IuIiIiCisKKyAgICAgICAgZGVmIHJhaXNlX2l0KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImZvcmNlIHRoZSBfZXhlY3V0ZV9jaGlsZCgpIGVycnBpcGVfZGF0YSBwYXRoLiIpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5fVGVzdEV4ZWN1dGVDaGlsZFBvcGVuKAorICAgICAgICAgICAgICAgICAgICBzZWxmLCBbc3lzLmV4ZWN1dGFibGUsICItYyIsICJwYXNzIl0sCisgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgcHJlZXhlY19mbj1yYWlzZV9pdCkKKworICAgIGRlZiB0ZXN0X2FyZ3Nfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIGFyZ3MgaXMgYSBzdHJpbmcKKyAgICAgICAgZiwgZm5hbWUgPSBta3N0ZW1wKCkKKyAgICAgICAgb3Mud3JpdGUoZiwgIiMhL2Jpbi9zaFxuIikKKyAgICAgICAgb3Mud3JpdGUoZiwgImV4ZWMgJyVzJyAtYyAnaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpJ1xuIiAlCisgICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlKQorICAgICAgICBvcy5jbG9zZShmKQorICAgICAgICBvcy5jaG1vZChmbmFtZSwgMG83MDApCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGZuYW1lKQorICAgICAgICBwLndhaXQoKQorICAgICAgICBvcy5yZW1vdmUoZm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXR1cm5jb2RlLCA0NykKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfYXJncyhzZWxmKToKKyAgICAgICAgIyBpbnZhbGlkIGFyZ3VtZW50cyBzaG91bGQgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdWJwcm9jZXNzLmNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnR1cGluZm89NDcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN1YnByb2Nlc3MuY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbmZsYWdzPTQ3KQorCisgICAgZGVmIHRlc3Rfc2hlbGxfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgICMgUnVuIGNvbW1hbmQgdGhyb3VnaCB0aGUgc2hlbGwgKHNlcXVlbmNlKQorICAgICAgICBuZXdlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBuZXdlbnZbIkZSVUlUIl0gPSAiYXBwbGUiCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsiZWNobyAkRlJVSVQiXSwgc2hlbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcCgpLCAiYXBwbGUiKQorCisgICAgZGVmIHRlc3Rfc2hlbGxfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIFJ1biBjb21tYW5kIHRocm91Z2ggdGhlIHNoZWxsIChzdHJpbmcpCisgICAgICAgIG5ld2VudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIG5ld2VudlsiRlJVSVQiXSA9ICJhcHBsZSIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oImVjaG8gJEZSVUlUIiwgc2hlbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52PW5ld2VudikKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcCgpLCAiYXBwbGUiKQorCisgICAgZGVmIHRlc3RfY2FsbF9zdHJpbmcoc2VsZik6CisgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc3RyaW5nIGFyZ3VtZW50IG9uIFVOSVgKKyAgICAgICAgZiwgZm5hbWUgPSBta3N0ZW1wKCkKKyAgICAgICAgb3Mud3JpdGUoZiwgIiMhL2Jpbi9zaFxuIikKKyAgICAgICAgb3Mud3JpdGUoZiwgImV4ZWMgJyVzJyAtYyAnaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpJ1xuIiAlCisgICAgICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlKQorICAgICAgICBvcy5jbG9zZShmKQorICAgICAgICBvcy5jaG1vZChmbmFtZSwgMDcwMCkKKyAgICAgICAgcmMgPSBzdWJwcm9jZXNzLmNhbGwoZm5hbWUpCisgICAgICAgIG9zLnJlbW92ZShmbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDcpCisKKyAgICBkZWYgdGVzdF9zcGVjaWZpY19zaGVsbChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjOTI2NTogSW5jb3JyZWN0IG5hbWUgcGFzc2VkIGFzIGFyZ1swXS4KKyAgICAgICAgc2hlbGxzID0gW10KKyAgICAgICAgZm9yIHByZWZpeCBpbiBbJy9iaW4nLCAnL3Vzci9iaW4vJywgJy91c3IvbG9jYWwvYmluJ106CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBbJ2Jhc2gnLCAna3NoJ106CisgICAgICAgICAgICAgICAgc2ggPSBvcy5wYXRoLmpvaW4ocHJlZml4LCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNoKToKKyAgICAgICAgICAgICAgICAgICAgc2hlbGxzLmFwcGVuZChzaCkKKyAgICAgICAgaWYgbm90IHNoZWxsczogIyBXaWxsIHByb2JhYmx5IHdvcmsgZm9yIGFueSBzaGVsbCBidXQgY3NoLgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgiYmFzaCBvciBrc2ggcmVxdWlyZWQgZm9yIHRoaXMgdGVzdCIpCisgICAgICAgIHNoID0gJy9iaW4vc2gnCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHNoKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKHNoKToKKyAgICAgICAgICAgICMgVGVzdCB3aWxsIGZhaWwgaWYgL2Jpbi9zaCBpcyBhIHN5bWxpbmsgdG8gY3NoLgorICAgICAgICAgICAgc2hlbGxzLmFwcGVuZChzaCkKKyAgICAgICAgZm9yIHNoIGluIHNoZWxsczoKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKCJlY2hvICQwIiwgZXhlY3V0YWJsZT1zaCwgc2hlbGw9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc3Rkb3V0LnJlYWQoKS5zdHJpcCgpLCBzaCkKKworICAgIGRlZiBfa2lsbF9wcm9jZXNzKHNlbGYsIG1ldGhvZCwgKmFyZ3MpOgorICAgICAgICAjIERvIG5vdCBpbmhlcml0IGZpbGUgaGFuZGxlcyBmcm9tIHRoZSBwYXJlbnQuCisgICAgICAgICMgSXQgc2hvdWxkIGZpeCBmYWlsdXJlcyBvbiBzb21lIHBsYXRmb3Jtcy4KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiIiJpZiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzLCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ3hcXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgzMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKKyAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCisgICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKKyAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICByZXR1cm4gcAorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgoJ25ldGJzZCcsICdvcGVuYnNkJykpLAorICAgICAgICAgICAgICAgICAgICAgIkR1ZSB0byBrbm93biBPUyBidWcgKGlzc3VlICMxNjc2MikiKQorICAgIGRlZiBfa2lsbF9kZWFkX3Byb2Nlc3Moc2VsZiwgbWV0aG9kLCAqYXJncyk6CisgICAgICAgICMgRG8gbm90IGluaGVyaXQgZmlsZSBoYW5kbGVzIGZyb20gdGhlIHBhcmVudC4KKyAgICAgICAgIyBJdCBzaG91bGQgZml4IGZhaWx1cmVzIG9uIHNvbWUgcGxhdGZvcm1zLgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiImlmIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgneFxcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQorICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgcC5zdGRvdXQucmVhZCgxKQorICAgICAgICAjIFRoZSBwcm9jZXNzIHNob3VsZCBlbmQgYWZ0ZXIgdGhpcworICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgcmFpc2UgZXZlbiB0aG91Z2ggdGhlIGNoaWxkIGlzIG5vdyBkZWFkCisgICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKKyAgICAgICAgcC5jb21tdW5pY2F0ZSgpCisKKyAgICBkZWYgdGVzdF9zZW5kX3NpZ25hbChzZWxmKToKKyAgICAgICAgcCA9IHNlbGYuX2tpbGxfcHJvY2Vzcygnc2VuZF9zaWduYWwnLCBzaWduYWwuU0lHSU5UKQorICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbignS2V5Ym9hcmRJbnRlcnJ1cHQnLCBzdGRlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocC53YWl0KCksIDApCisKKyAgICBkZWYgdGVzdF9raWxsKHNlbGYpOgorICAgICAgICBwID0gc2VsZi5fa2lsbF9wcm9jZXNzKCdraWxsJykKKyAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgLXNpZ25hbC5TSUdLSUxMKQorCisgICAgZGVmIHRlc3RfdGVybWluYXRlKHNlbGYpOgorICAgICAgICBwID0gc2VsZi5fa2lsbF9wcm9jZXNzKCd0ZXJtaW5hdGUnKQorICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAud2FpdCgpLCAtc2lnbmFsLlNJR1RFUk0pCisKKyAgICBkZWYgdGVzdF9zZW5kX3NpZ25hbF9kZWFkKHNlbGYpOgorICAgICAgICAjIFNlbmRpbmcgYSBzaWduYWwgdG8gYSBkZWFkIHByb2Nlc3MKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ3NlbmRfc2lnbmFsJywgc2lnbmFsLlNJR0lOVCkKKworICAgIGRlZiB0ZXN0X2tpbGxfZGVhZChzZWxmKToKKyAgICAgICAgIyBLaWxsaW5nIGEgZGVhZCBwcm9jZXNzCisgICAgICAgIHNlbGYuX2tpbGxfZGVhZF9wcm9jZXNzKCdraWxsJykKKworICAgIGRlZiB0ZXN0X3Rlcm1pbmF0ZV9kZWFkKHNlbGYpOgorICAgICAgICAjIFRlcm1pbmF0aW5nIGEgZGVhZCBwcm9jZXNzCisgICAgICAgIHNlbGYuX2tpbGxfZGVhZF9wcm9jZXNzKCd0ZXJtaW5hdGUnKQorCisgICAgZGVmIGNoZWNrX2Nsb3NlX3N0ZF9mZHMoc2VsZiwgZmRzKToKKyAgICAgICAgIyBJc3N1ZSAjOTkwNTogdGVzdCB0aGF0IHN1YnByb2Nlc3MgcGlwZXMgc3RpbGwgd29yayBwcm9wZXJseSB3aXRoCisgICAgICAgICMgc29tZSBzdGFuZGFyZCBmZHMgY2xvc2VkCisgICAgICAgIHN0ZGluID0gMAorICAgICAgICBuZXdmZHMgPSBbXQorICAgICAgICBmb3IgYSBpbiBmZHM6CisgICAgICAgICAgICBiID0gb3MuZHVwKGEpCisgICAgICAgICAgICBuZXdmZHMuYXBwZW5kKGIpCisgICAgICAgICAgICBpZiBhID09IDA6CisgICAgICAgICAgICAgICAgc3RkaW4gPSBiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBmZCBpbiBmZHM6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICBvdXQsIGVyciA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQud3JpdGUoImFwcGxlIik7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N5cy5zdGRvdXQuZmx1c2goKTsnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZGVyci53cml0ZSgib3JhbmdlIiknXSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3RkaW4sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpLmNvbW11bmljYXRlKCkKKyAgICAgICAgICAgIGVyciA9IHRlc3Rfc3VwcG9ydC5zdHJpcF9weXRob25fc3RkZXJyKGVycikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG91dCwgZXJyKSwgKGInYXBwbGUnLCBiJ29yYW5nZScpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIGIsIGEgaW4gemlwKG5ld2ZkcywgZmRzKToKKyAgICAgICAgICAgICAgICBvcy5kdXAyKGIsIGEpCisgICAgICAgICAgICBmb3IgYiBpbiBuZXdmZHM6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoYikKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2ZkXzAoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY2xvc2Vfc3RkX2ZkcyhbMF0pCisKKyAgICBkZWYgdGVzdF9jbG9zZV9mZF8xKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Nsb3NlX3N0ZF9mZHMoWzFdKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZmRfMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jbG9zZV9zdGRfZmRzKFsyXSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2Zkc18wXzEoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfY2xvc2Vfc3RkX2ZkcyhbMCwgMV0pCisKKyAgICBkZWYgdGVzdF9jbG9zZV9mZHNfMF8yKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Nsb3NlX3N0ZF9mZHMoWzAsIDJdKQorCisgICAgZGVmIHRlc3RfY2xvc2VfZmRzXzFfMihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19jbG9zZV9zdGRfZmRzKFsxLCAyXSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2Zkc18wXzFfMihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTA4MDY6IHRlc3QgdGhhdCBzdWJwcm9jZXNzIHBpcGVzIHN0aWxsIHdvcmsgcHJvcGVybHkgd2l0aAorICAgICAgICAjIGFsbCBzdGFuZGFyZCBmZHMgY2xvc2VkLgorICAgICAgICBzZWxmLmNoZWNrX2Nsb3NlX3N0ZF9mZHMoWzAsIDEsIDJdKQorCisgICAgZGVmIGNoZWNrX3N3YXBfZmRzKHNlbGYsIHN0ZGluX25vLCBzdGRvdXRfbm8sIHN0ZGVycl9ubyk6CisgICAgICAgICMgb3BlbiB1cCBzb21lIHRlbXBvcmFyeSBmaWxlcworICAgICAgICB0ZW1wcyA9IFtta3N0ZW1wKCkgZm9yIGkgaW4gcmFuZ2UoMyldCisgICAgICAgIHRlbXBfZmRzID0gW2ZkIGZvciBmZCwgZm5hbWUgaW4gdGVtcHNdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdW5saW5rIHRoZSBmaWxlcyAtLSB3ZSB3b24ndCBuZWVkIHRvIHJlb3BlbiB0aGVtCisgICAgICAgICAgICBmb3IgZmQsIGZuYW1lIGluIHRlbXBzOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmbmFtZSkKKworICAgICAgICAgICAgIyBzYXZlIGEgY29weSBvZiB0aGUgc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycworICAgICAgICAgICAgc2F2ZWRfZmRzID0gW29zLmR1cChmZCkgZm9yIGZkIGluIHJhbmdlKDMpXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgZHVwbGljYXRlIHRoZSB0ZW1wIGZpbGVzIG92ZXIgdGhlIHN0YW5kYXJkIGZkJ3MgMCwgMSwgMgorICAgICAgICAgICAgICAgIGZvciBmZCwgdGVtcF9mZCBpbiBlbnVtZXJhdGUodGVtcF9mZHMpOgorICAgICAgICAgICAgICAgICAgICBvcy5kdXAyKHRlbXBfZmQsIGZkKQorCisgICAgICAgICAgICAgICAgIyB3cml0ZSBzb21lIGRhdGEgdG8gd2hhdCB3aWxsIGJlY29tZSBzdGRpbiwgYW5kIHJld2luZAorICAgICAgICAgICAgICAgIG9zLndyaXRlKHN0ZGluX25vLCBiIlNURElOIikKKyAgICAgICAgICAgICAgICBvcy5sc2VlayhzdGRpbl9ubywgMCwgMCkKKworICAgICAgICAgICAgICAgICMgbm93IHVzZSB0aG9zZSBmaWxlcyBpbiB0aGUgZ2l2ZW4gb3JkZXIsIHNvIHRoYXQgc3VicHJvY2VzcworICAgICAgICAgICAgICAgICMgaGFzIHRvIHJlYXJyYW5nZSB0aGVtIGluIHRoZSBjaGlsZAorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXM7IGdvdCA9IHN5cy5zdGRpbi5yZWFkKCk7JworICAgICAgICAgICAgICAgICAgICAnc3lzLnN0ZG91dC53cml0ZSgiZ290ICVzIiVnb3QpOyBzeXMuc3RkZXJyLndyaXRlKCJlcnIiKSddLAorICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdGRpbl9ubywKKyAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN0ZG91dF9ubywKKyAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN0ZGVycl9ubykKKyAgICAgICAgICAgICAgICBwLndhaXQoKQorCisgICAgICAgICAgICAgICAgZm9yIGZkIGluIHRlbXBfZmRzOgorICAgICAgICAgICAgICAgICAgICBvcy5sc2VlayhmZCwgMCwgMCkKKworICAgICAgICAgICAgICAgIG91dCA9IG9zLnJlYWQoc3Rkb3V0X25vLCAxMDI0KQorICAgICAgICAgICAgICAgIGVyciA9IHRlc3Rfc3VwcG9ydC5zdHJpcF9weXRob25fc3RkZXJyKG9zLnJlYWQoc3RkZXJyX25vLCAxMDI0KSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgZm9yIHN0ZCwgc2F2ZWQgaW4gZW51bWVyYXRlKHNhdmVkX2Zkcyk6CisgICAgICAgICAgICAgICAgICAgIG9zLmR1cDIoc2F2ZWQsIHN0ZCkKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2Uoc2F2ZWQpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LCBiImdvdCBTVERJTiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgYiJlcnIiKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgZmQgaW4gdGVtcF9mZHM6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisKKyAgICAjIFdoZW4gZHVwaW5nIGZkcywgaWYgdGhlcmUgYXJpc2VzIGEgc2l0dWF0aW9uIHdoZXJlIG9uZSBvZiB0aGUgZmRzIGlzCisgICAgIyBlaXRoZXIgMCwgMSBvciAyLCBpdCBpcyBwb3NzaWJsZSB0aGF0IGl0IGlzIG92ZXJ3cml0dGVuICgjMTI2MDcpLgorICAgICMgVGhpcyB0ZXN0cyBhbGwgY29tYmluYXRpb25zIG9mIHRoaXMuCisgICAgZGVmIHRlc3Rfc3dhcF9mZHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc3dhcF9mZHMoMCwgMSwgMikKKyAgICAgICAgc2VsZi5jaGVja19zd2FwX2ZkcygwLCAyLCAxKQorICAgICAgICBzZWxmLmNoZWNrX3N3YXBfZmRzKDEsIDAsIDIpCisgICAgICAgIHNlbGYuY2hlY2tfc3dhcF9mZHMoMSwgMiwgMCkKKyAgICAgICAgc2VsZi5jaGVja19zd2FwX2ZkcygyLCAwLCAxKQorICAgICAgICBzZWxmLmNoZWNrX3N3YXBfZmRzKDIsIDEsIDApCisKKyAgICBkZWYgdGVzdF93YWl0X3doZW5fc2lnY2hpbGRfaWdub3JlZChzZWxmKToKKyAgICAgICAgIyBOT1RFOiBzaWdjaGlsZF9pZ25vcmUucHkgbWF5IG5vdCBiZSBhbiBlZmZlY3RpdmUgdGVzdCBvbiBhbGwgT1Nlcy4KKyAgICAgICAgc2lnY2hpbGRfaWdub3JlID0gdGVzdF9zdXBwb3J0LmZpbmRmaWxlKCJzaWdjaGlsZF9pZ25vcmUucHkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViZGlyPSJzdWJwcm9jZXNzZGF0YSIpCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgc2lnY2hpbGRfaWdub3JlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwLnJldHVybmNvZGUsICJzaWdjaGlsZF9pZ25vcmUucHkgZXhpdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICIgbm9uLXplcm8gd2l0aCB0aGlzIGVycm9yOlxuJXMiICUgc3RkZXJyKQorCisgICAgZGVmIHRlc3Rfem9tYmllX2Zhc3RfcHJvY2Vzc19kZWwoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEyNjUwOiBvbiBVbml4LCBpZiBQb3Blbi5fX2RlbF9fKCkgd2FzIGNhbGxlZCBiZWZvcmUgdGhlCisgICAgICAgICMgcHJvY2VzcyBleGl0ZWQsIGl0IHdvdWxkbid0IGJlIGFkZGVkIHRvIHN1YnByb2Nlc3MuX2FjdGl2ZSwgYW5kIHdvdWxkCisgICAgICAgICMgcmVtYWluIGEgem9tYmllLgorICAgICAgICAjIHNwYXduIGEgUG9wZW4sIGFuZCBkZWxldGUgaXRzIHJlZmVyZW5jZSBiZWZvcmUgaXQgZXhpdHMKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXMsIHRpbWU7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWUuc2xlZXAoMC4yKSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgaWRlbnQgPSBpZChwKQorICAgICAgICBwaWQgPSBwLnBpZAorICAgICAgICBkZWwgcAorICAgICAgICAjIGNoZWNrIHRoYXQgcCBpcyBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0SW4oaWRlbnQsIFtpZChvKSBmb3IgbyBpbiBzdWJwcm9jZXNzLl9hY3RpdmVdKQorCisgICAgZGVmIHRlc3RfbGVha19mYXN0X3Byb2Nlc3NfZGVsX2tpbGxlZChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTI2NTA6IG9uIFVuaXgsIGlmIFBvcGVuLl9fZGVsX18oKSB3YXMgY2FsbGVkIGJlZm9yZSB0aGUKKyAgICAgICAgIyBwcm9jZXNzIGV4aXRlZCwgYW5kIHRoZSBwcm9jZXNzIGdvdCBraWxsZWQgYnkgYSBzaWduYWwsIGl0IHdvdWxkIG5ldmVyCisgICAgICAgICMgYmUgcmVtb3ZlZCBmcm9tIHN1YnByb2Nlc3MuX2FjdGl2ZSwgd2hpY2ggdHJpZ2dlcmVkIGEgRkQgYW5kIG1lbW9yeQorICAgICAgICAjIGxlYWsuCisgICAgICAgICMgc3Bhd24gYSBQb3BlbiwgZGVsZXRlIGl0cyByZWZlcmVuY2UgYW5kIGtpbGwgaXQKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCB0aW1lOycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lLnNsZWVwKDMpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBpZGVudCA9IGlkKHApCisgICAgICAgIHBpZCA9IHAucGlkCisgICAgICAgIGRlbCBwCisgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgICAgIyBjaGVjayB0aGF0IHAgaXMgaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdAorICAgICAgICBzZWxmLmFzc2VydEluKGlkZW50LCBbaWQobykgZm9yIG8gaW4gc3VicHJvY2Vzcy5fYWN0aXZlXSkKKworICAgICAgICAjIGxldCBzb21lIHRpbWUgZm9yIHRoZSBwcm9jZXNzIHRvIGV4aXQsIGFuZCBjcmVhdGUgYSBuZXcgUG9wZW46IHRoaXMKKyAgICAgICAgIyBzaG91bGQgdHJpZ2dlciB0aGUgd2FpdCgpIG9mIHAKKyAgICAgICAgdGltZS5zbGVlcCgwLjIpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRW52aXJvbm1lbnRFcnJvcikgYXMgYzoKKyAgICAgICAgICAgIHdpdGggc3VicHJvY2Vzcy5Qb3BlbihbJ25vbmV4aXN0aW5nX2lfaG9wZSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkgYXMgcHJvYzoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICMgcCBzaG91bGQgaGF2ZSBiZWVuIHdhaXQoKWVkIG9uLCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBfYWN0aXZlIGxpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3Mud2FpdHBpZCwgcGlkLCAwKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKGlkZW50LCBbaWQobykgZm9yIG8gaW4gc3VicHJvY2Vzcy5fYWN0aXZlXSkKKworICAgIGRlZiB0ZXN0X3BpcGVfY2xvZXhlYyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMjc4NjogY2hlY2sgdGhhdCB0aGUgY29tbXVuaWNhdGlvbiBwaXBlcycgRkRzIGFyZSBzZXQgQ0xPRVhFQywKKyAgICAgICAgIyBhbmQgYXJlIG5vdCBpbmhlcml0ZWQgYnkgYW5vdGhlciBjaGlsZCBwcm9jZXNzLgorICAgICAgICBwMSA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnQgb3M7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvcy5yZWFkKDAsIDEpJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisKKyAgICAgICAgcDIgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgIiIiaWYgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgb3MsIGVycm5vLCBzeXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmQgaW4gJXI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZS5lcnJubyAhPSBlcnJuby5FQkFERjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZXhpdCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIiAlIFtmLmZpbGVubygpIGZvciBmIGluIChwMS5zdGRpbiwgcDEuc3Rkb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwMS5zdGRlcnIpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUsIGNsb3NlX2Zkcz1GYWxzZSkKKyAgICAgICAgcDEuY29tbXVuaWNhdGUoJ2ZvbycpCisgICAgICAgIF8sIHN0ZGVyciA9IHAyLmNvbW11bmljYXRlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAyLnJldHVybmNvZGUsIDAsICJVbmV4cGVjdGVkIGVycm9yOiAiICsgcmVwcihzdGRlcnIpKQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKG1zd2luZG93cywgIldpbmRvd3Mgc3BlY2lmaWMgdGVzdHMiKQorY2xhc3MgV2luMzJQcm9jZXNzVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3N0YXJ0dXBpbmZvKHNlbGYpOgorICAgICAgICAjIHN0YXJ0dXBpbmZvIGFyZ3VtZW50CisgICAgICAgICMgV2UgdXNlcyBoYXJkY29kZWQgY29uc3RhbnRzLCBiZWNhdXNlIHdlIGRvIG5vdCB3YW50IHRvCisgICAgICAgICMgZGVwZW5kIG9uIHdpbjMyYWxsLgorICAgICAgICBTVEFSVEZfVVNFU0hPV1dJTkRPVyA9IDEKKyAgICAgICAgU1dfTUFYSU1JWkUgPSAzCisgICAgICAgIHN0YXJ0dXBpbmZvID0gc3VicHJvY2Vzcy5TVEFSVFVQSU5GTygpCisgICAgICAgIHN0YXJ0dXBpbmZvLmR3RmxhZ3MgPSBTVEFSVEZfVVNFU0hPV1dJTkRPVworICAgICAgICBzdGFydHVwaW5mby53U2hvd1dpbmRvdyA9IFNXX01BWElNSVpFCisgICAgICAgICMgU2luY2UgUHl0aG9uIGlzIGEgY29uc29sZSBwcm9jZXNzLCBpdCB3b24ndCBiZSBhZmZlY3RlZAorICAgICAgICAjIGJ5IHdTaG93V2luZG93LCBidXQgdGhlIGFyZ3VtZW50IHNob3VsZCBiZSBzaWxlbnRseQorICAgICAgICAjIGlnbm9yZWQKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgImltcG9ydCBzeXM7IHN5cy5leGl0KDApIl0sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHVwaW5mbz1zdGFydHVwaW5mbykKKworICAgIGRlZiB0ZXN0X2NyZWF0aW9uZmxhZ3Moc2VsZik6CisgICAgICAgICMgY3JlYXRpb25mbGFncyBhcmd1bWVudAorICAgICAgICBDUkVBVEVfTkVXX0NPTlNPTEUgPSAxNgorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCIgICAgYSBET1MgYm94IHNob3VsZCBmbGFzaCBicmllZmx5IC4uLlxuIikKKyAgICAgICAgc3VicHJvY2Vzcy5jYWxsKHN5cy5leGVjdXRhYmxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICcgLWMgImltcG9ydCB0aW1lOyB0aW1lLnNsZWVwKDAuMjUpIicsCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGlvbmZsYWdzPUNSRUFURV9ORVdfQ09OU09MRSkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfYXJncyhzZWxmKToKKyAgICAgICAgIyBpbnZhbGlkIGFyZ3VtZW50cyBzaG91bGQgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdWJwcm9jZXNzLmNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZXhlY19mbj1sYW1iZGE6IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN1YnByb2Nlc3MuY2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW3N5cy5leGVjdXRhYmxlLCAiLWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZV9mZHM9VHJ1ZSkKKworICAgIGRlZiB0ZXN0X2Nsb3NlX2ZkcyhzZWxmKToKKyAgICAgICAgIyBjbG9zZSBmaWxlIGRlc2NyaXB0b3JzCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgc3lzOyBzeXMuZXhpdCg0NykiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0NykKKworICAgIGRlZiB0ZXN0X3NoZWxsX3NlcXVlbmNlKHNlbGYpOgorICAgICAgICAjIFJ1biBjb21tYW5kIHRocm91Z2ggdGhlIHNoZWxsIChzZXF1ZW5jZSkKKyAgICAgICAgbmV3ZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgbmV3ZW52WyJGUlVJVCJdID0gInBoeXNhbGlzIgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbInNldCJdLCBzaGVsbD0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnY9bmV3ZW52KQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oInBoeXNhbGlzIiwgcC5zdGRvdXQucmVhZCgpKQorCisgICAgZGVmIHRlc3Rfc2hlbGxfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIFJ1biBjb21tYW5kIHRocm91Z2ggdGhlIHNoZWxsIChzdHJpbmcpCisgICAgICAgIG5ld2VudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIG5ld2VudlsiRlJVSVQiXSA9ICJwaHlzYWxpcyIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oInNldCIsIHNoZWxsPTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudj1uZXdlbnYpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbigicGh5c2FsaXMiLCBwLnN0ZG91dC5yZWFkKCkpCisKKyAgICBkZWYgdGVzdF9jYWxsX3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzdHJpbmcgYXJndW1lbnQgb24gV2luZG93cworICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChzeXMuZXhlY3V0YWJsZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgLWMgImltcG9ydCBzeXM7IHN5cy5leGl0KDQ3KSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0NykKKworICAgIGRlZiBfa2lsbF9wcm9jZXNzKHNlbGYsIG1ldGhvZCwgKmFyZ3MpOgorICAgICAgICAjIFNvbWUgd2luMzIgYnVpbGRib3QgcmFpc2VzIEVPRkVycm9yIGlmIHN0ZGluIGlzIGluaGVyaXRlZAorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiImlmIDE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBzeXMsIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgneFxcbicpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDMwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3RkZXJyLmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRpbi5jbG9zZSkKKyAgICAgICAgIyBXYWl0IGZvciB0aGUgaW50ZXJwcmV0ZXIgdG8gYmUgY29tcGxldGVseSBpbml0aWFsaXplZCBiZWZvcmUKKyAgICAgICAgIyBzZW5kaW5nIGFueSBzaWduYWwuCisgICAgICAgIHAuc3Rkb3V0LnJlYWQoMSkKKyAgICAgICAgZ2V0YXR0cihwLCBtZXRob2QpKCphcmdzKQorICAgICAgICBfLCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRTdGRlcnJFcXVhbChzdGRlcnIsICcnKQorICAgICAgICByZXR1cm5jb2RlID0gcC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyZXR1cm5jb2RlLCAwKQorCisgICAgZGVmIF9raWxsX2RlYWRfcHJvY2VzcyhzZWxmLCBtZXRob2QsICphcmdzKToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiIiJpZiAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzLCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoJ3hcXG4nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmV4aXQoNDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGluLmNsb3NlKQorICAgICAgICAjIFdhaXQgZm9yIHRoZSBpbnRlcnByZXRlciB0byBiZSBjb21wbGV0ZWx5IGluaXRpYWxpemVkIGJlZm9yZQorICAgICAgICAjIHNlbmRpbmcgYW55IHNpZ25hbC4KKyAgICAgICAgcC5zdGRvdXQucmVhZCgxKQorICAgICAgICAjIFRoZSBwcm9jZXNzIHNob3VsZCBlbmQgYWZ0ZXIgdGhpcworICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICMgVGhpcyBzaG91bGRuJ3QgcmFpc2UgZXZlbiB0aG91Z2ggdGhlIGNoaWxkIGlzIG5vdyBkZWFkCisgICAgICAgIGdldGF0dHIocCwgbWV0aG9kKSgqYXJncykKKyAgICAgICAgXywgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0U3RkZXJyRXF1YWwoc3RkZXJyLCBiJycpCisgICAgICAgIHJjID0gcC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDIpCisKKyAgICBkZWYgdGVzdF9zZW5kX3NpZ25hbChzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF9wcm9jZXNzKCdzZW5kX3NpZ25hbCcsIHNpZ25hbC5TSUdURVJNKQorCisgICAgZGVmIHRlc3Rfa2lsbChzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF9wcm9jZXNzKCdraWxsJykKKworICAgIGRlZiB0ZXN0X3Rlcm1pbmF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF9wcm9jZXNzKCd0ZXJtaW5hdGUnKQorCisgICAgZGVmIHRlc3Rfc2VuZF9zaWduYWxfZGVhZChzZWxmKToKKyAgICAgICAgc2VsZi5fa2lsbF9kZWFkX3Byb2Nlc3MoJ3NlbmRfc2lnbmFsJywgc2lnbmFsLlNJR1RFUk0pCisKKyAgICBkZWYgdGVzdF9raWxsX2RlYWQoc2VsZik6CisgICAgICAgIHNlbGYuX2tpbGxfZGVhZF9wcm9jZXNzKCdraWxsJykKKworICAgIGRlZiB0ZXN0X3Rlcm1pbmF0ZV9kZWFkKHNlbGYpOgorICAgICAgICBzZWxmLl9raWxsX2RlYWRfcHJvY2VzcygndGVybWluYXRlJykKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyhnZXRhdHRyKHN1YnByb2Nlc3MsICdfaGFzX3BvbGwnLCBGYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAicG9sbCBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkIikKK2NsYXNzIFByb2Nlc3NUZXN0Q2FzZU5vUG9sbChQcm9jZXNzVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VicHJvY2Vzcy5faGFzX3BvbGwgPSBGYWxzZQorICAgICAgICBQcm9jZXNzVGVzdENhc2Uuc2V0VXAoc2VsZikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc3VicHJvY2Vzcy5faGFzX3BvbGwgPSBUcnVlCisgICAgICAgIFByb2Nlc3NUZXN0Q2FzZS50ZWFyRG93bihzZWxmKQorCisKK2NsYXNzIEhlbHBlckZ1bmN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIEB1bml0dGVzdC5za2lwSWYobXN3aW5kb3dzLCAiZXJybm8gYW5kIEVJTlRSIG1ha2Ugbm8gc2Vuc2Ugb24gd2luZG93cyIpCisgICAgZGVmIHRlc3RfZWludHJfcmV0cnlfY2FsbChzZWxmKToKKyAgICAgICAgcmVjb3JkX2NhbGxzID0gW10KKyAgICAgICAgZGVmIGZha2Vfb3NfZnVuYygqYXJncyk6CisgICAgICAgICAgICByZWNvcmRfY2FsbHMuYXBwZW5kKGFyZ3MpCisgICAgICAgICAgICBpZiBsZW4ocmVjb3JkX2NhbGxzKSA9PSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoZXJybm8uRUlOVFIsICJmYWtlIGludGVycnVwdGVkIHN5c3RlbSBjYWxsIikKKyAgICAgICAgICAgIHJldHVybiB0dXBsZShyZXZlcnNlZChhcmdzKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCg5OTksIDI1NiksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5fZWludHJfcmV0cnlfY2FsbChmYWtlX29zX2Z1bmMsIDI1NiwgOTk5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKDI1NiwgOTk5KV0sIHJlY29yZF9jYWxscykKKyAgICAgICAgIyBUaGlzIHRpbWUgdGhlcmUgd2lsbCBiZSBhbiBFSU5UUiBzbyBpdCB3aWxsIGxvb3Agb25jZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNjY2LCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VicHJvY2Vzcy5fZWludHJfcmV0cnlfY2FsbChmYWtlX29zX2Z1bmMsIDY2NikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWygyNTYsIDk5OSksICg2NjYsKSwgKDY2NiwpXSwgcmVjb3JkX2NhbGxzKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhtc3dpbmRvd3MsICJtc3dpbmRvd3Mgb25seSIpCitjbGFzcyBDb21tYW5kc1dpdGhTcGFjZXMgKEJhc2VUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHN1cGVyKENvbW1hbmRzV2l0aFNwYWNlcywgc2VsZikuc2V0VXAoKQorICAgICAgICBmLCBmbmFtZSA9IG1rc3RlbXAoIi5weSIsICJ0ZSBzdCIpCisgICAgICAgIHNlbGYuZm5hbWUgPSBmbmFtZS5sb3dlciAoKQorICAgICAgICBvcy53cml0ZShmLCBiImltcG9ydCBzeXM7IgorICAgICAgICAgICAgICAgICAgICBiInN5cy5zdGRvdXQud3JpdGUoJyVkICVzJyAlIChsZW4oc3lzLmFyZ3YpLCBbYS5sb3dlciAoKSBmb3IgYSBpbiBzeXMuYXJndl0pKSIKKyAgICAgICAgKQorICAgICAgICBvcy5jbG9zZShmKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBvcy5yZW1vdmUoc2VsZi5mbmFtZSkKKyAgICAgICAgc3VwZXIoQ29tbWFuZHNXaXRoU3BhY2VzLCBzZWxmKS50ZWFyRG93bigpCisKKyAgICBkZWYgd2l0aF9zcGFjZXMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAga3dhcmdzWydzdGRvdXQnXSA9IHN1YnByb2Nlc3MuUElQRQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZG91dC5jbG9zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICBwLnN0ZG91dC5yZWFkICgpLmRlY29kZSgibWJjcyIpLAorICAgICAgICAgICIyIFslciwgJ2FiIGNkJ10iICUgc2VsZi5mbmFtZQorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9zaGVsbF9zdHJpbmdfd2l0aF9zcGFjZXMoc2VsZik6CisgICAgICAgICMgY2FsbCgpIGZ1bmN0aW9uIHdpdGggc3RyaW5nIGFyZ3VtZW50IHdpdGggc3BhY2VzIG9uIFdpbmRvd3MKKyAgICAgICAgc2VsZi53aXRoX3NwYWNlcygnIiVzIiAiJXMiICIlcyInICUgKHN5cy5leGVjdXRhYmxlLCBzZWxmLmZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiIGNkIiksIHNoZWxsPTEpCisKKyAgICBkZWYgdGVzdF9zaGVsbF9zZXF1ZW5jZV93aXRoX3NwYWNlcyhzZWxmKToKKyAgICAgICAgIyBjYWxsKCkgZnVuY3Rpb24gd2l0aCBzZXF1ZW5jZSBhcmd1bWVudCB3aXRoIHNwYWNlcyBvbiBXaW5kb3dzCisgICAgICAgIHNlbGYud2l0aF9zcGFjZXMoW3N5cy5leGVjdXRhYmxlLCBzZWxmLmZuYW1lLCAiYWIgY2QiXSwgc2hlbGw9MSkKKworICAgIGRlZiB0ZXN0X25vc2hlbGxfc3RyaW5nX3dpdGhfc3BhY2VzKHNlbGYpOgorICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHN0cmluZyBhcmd1bWVudCB3aXRoIHNwYWNlcyBvbiBXaW5kb3dzCisgICAgICAgIHNlbGYud2l0aF9zcGFjZXMoJyIlcyIgIiVzIiAiJXMiJyAlIChzeXMuZXhlY3V0YWJsZSwgc2VsZi5mbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiIGNkIikpCisKKyAgICBkZWYgdGVzdF9ub3NoZWxsX3NlcXVlbmNlX3dpdGhfc3BhY2VzKHNlbGYpOgorICAgICAgICAjIGNhbGwoKSBmdW5jdGlvbiB3aXRoIHNlcXVlbmNlIGFyZ3VtZW50IHdpdGggc3BhY2VzIG9uIFdpbmRvd3MKKyAgICAgICAgc2VsZi53aXRoX3NwYWNlcyhbc3lzLmV4ZWN1dGFibGUsIHNlbGYuZm5hbWUsICJhYiBjZCJdKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdW5pdF90ZXN0cyA9IChQcm9jZXNzVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICBQT1NJWFByb2Nlc3NUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgIFdpbjMyUHJvY2Vzc1Rlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgUHJvY2Vzc1Rlc3RDYXNlTm9Qb2xsLAorICAgICAgICAgICAgICAgICAgSGVscGVyRnVuY3Rpb25UZXN0cywKKyAgICAgICAgICAgICAgICAgIENvbW1hbmRzV2l0aFNwYWNlcykKKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnVuaXRfdGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmQ4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNmQ4OWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5hdWRpb2Rldi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NmY3MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5hdWRpb2Rldi5weQpAQCAtMCwwICsxLDMzIEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZSwgVGVzdEZhaWxlZCwgaW1wb3J0X21vZHVsZQoraW1wb3J0IHVuaXR0ZXN0CitzdW5hdWRpb2RldiA9IGltcG9ydF9tb2R1bGUoJ3N1bmF1ZGlvZGV2JywgZGVwcmVjYXRlZD1UcnVlKQoraW1wb3J0IG9zCisKK3RyeToKKyAgICBhdWRpb2RldiA9IG9zLmVudmlyb25bIkFVRElPREVWIl0KK2V4Y2VwdCBLZXlFcnJvcjoKKyAgICBhdWRpb2RldiA9ICIvZGV2L2F1ZGlvIgorCitpZiBub3Qgb3MucGF0aC5leGlzdHMoYXVkaW9kZXYpOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJubyBhdWRpbyBkZXZpY2UgZm91bmQhIikKKworZGVmIHBsYXlfc291bmRfZmlsZShwYXRoKToKKyAgICBmcCA9IG9wZW4ocGF0aCwgJ3InKQorICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICBmcC5jbG9zZSgpCisgICAgdHJ5OgorICAgICAgICBhID0gc3VuYXVkaW9kZXYub3BlbigndycpCisgICAgZXhjZXB0IHN1bmF1ZGlvZGV2LmVycm9yLCBtc2c6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsIG1zZworICAgIGVsc2U6CisgICAgICAgIGEud3JpdGUoZGF0YSkKKyAgICAgICAgYS5jbG9zZSgpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHBsYXlfc291bmRfZmlsZShmaW5kZmlsZSgnYXVkaW90ZXN0LmF1JykpCisKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5hdWRpb2Rldi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5hdWRpb2Rldi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwNDBiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5hdWRpb2Rldi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5hdWRpb2Rldi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEwNDBiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmF1ZGlvZGV2LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5kcnkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5kcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwZWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weQpAQCAtMCwwICsxLDEwMCBAQAorIiIiRG8gYSBtaW5pbWFsIHRlc3Qgb2YgYWxsIHRoZSBtb2R1bGVzIHRoYXQgYXJlbid0IG90aGVyd2lzZSB0ZXN0ZWQuIiIiCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgc3lzCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0VW50ZXN0ZWRNb2R1bGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9hdF9sZWFzdF9pbXBvcnRfdW50ZXN0ZWRfbW9kdWxlcyhzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MocXVpZXQ9VHJ1ZSk6CisgICAgICAgICAgICBpbXBvcnQgQ0dJSFRUUFNlcnZlcgorICAgICAgICAgICAgaW1wb3J0IGF1ZGlvZGV2CisgICAgICAgICAgICBpbXBvcnQgYmRiCisgICAgICAgICAgICBpbXBvcnQgY2dpdGIKKyAgICAgICAgICAgIGltcG9ydCBjb2RlCisgICAgICAgICAgICBpbXBvcnQgY29tcGlsZWFsbAorCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmJjcHBjb21waWxlcgorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jY29tcGlsZXIKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY3lnd2luY2NvbXBpbGVyCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmVteGNjb21waWxlcgorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5maWxlbGlzdAorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ3dpbicpOgorICAgICAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMubXN2Y2NvbXBpbGVyCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLnRleHRfZmlsZQorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy51bml4Y2NvbXBpbGVyCisKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdF9kdW1iCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfbXNpICMgaWYgbXNpIG1vZHVsZSBpcyBub3QgYnVpbGQKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgInNraXBwaW5nIGJkaXN0X21zaSIKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdAorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3JwbQorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmJkaXN0X3dpbmluc3QKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5idWlsZF9jbGliCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0CisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGQKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbgorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmNvbmZpZworICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZGF0YQorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm8KKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2hlYWRlcnMKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2xpYgorICAgICAgICAgICAgaW1wb3J0IGRpc3R1dGlscy5jb21tYW5kLnJlZ2lzdGVyCisgICAgICAgICAgICBpbXBvcnQgZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QKKyAgICAgICAgICAgIGltcG9ydCBkaXN0dXRpbHMuY29tbWFuZC51cGxvYWQKKworICAgICAgICAgICAgaW1wb3J0IGVuY29kaW5ncworICAgICAgICAgICAgaW1wb3J0IGZvcm1hdHRlcgorICAgICAgICAgICAgaW1wb3J0IGdldHBhc3MKKyAgICAgICAgICAgIGltcG9ydCBodG1sZW50aXR5ZGVmcworICAgICAgICAgICAgaW1wb3J0IGlob29rcworICAgICAgICAgICAgaW1wb3J0IGltZ2hkcgorICAgICAgICAgICAgaW1wb3J0IGltcHV0aWwKKyAgICAgICAgICAgIGltcG9ydCBrZXl3b3JkCisgICAgICAgICAgICBpbXBvcnQgbGluZWNhY2hlCisgICAgICAgICAgICBpbXBvcnQgbWFjdXJsMnBhdGgKKyAgICAgICAgICAgIGltcG9ydCBtYWlsY2FwCisgICAgICAgICAgICBpbXBvcnQgbWltaWZ5CisgICAgICAgICAgICBpbXBvcnQgbm50cGxpYgorICAgICAgICAgICAgaW1wb3J0IG50dXJsMnBhdGgKKyAgICAgICAgICAgIGltcG9ydCBvcGNvZGUKKyAgICAgICAgICAgIGltcG9ydCBvczJlbXhwYXRoCisgICAgICAgICAgICBpbXBvcnQgcGRiCisgICAgICAgICAgICBpbXBvcnQgcG9zaXhmaWxlCisgICAgICAgICAgICBpbXBvcnQgcHN0YXRzCisgICAgICAgICAgICBpbXBvcnQgcHlfY29tcGlsZQorICAgICAgICAgICAgaW1wb3J0IHJleGVjCisgICAgICAgICAgICBpbXBvcnQgc2NoZWQKKyAgICAgICAgICAgIGltcG9ydCBzbmRoZHIKKyAgICAgICAgICAgIGltcG9ydCBzdGF0dmZzCisgICAgICAgICAgICBpbXBvcnQgc3RyaW5nb2xkCisgICAgICAgICAgICBpbXBvcnQgc3VuYXUKKyAgICAgICAgICAgIGltcG9ydCBzdW5hdWRpbworICAgICAgICAgICAgaW1wb3J0IHN5bWJvbAorICAgICAgICAgICAgaW1wb3J0IHRhYm5hbm55CisgICAgICAgICAgICBpbXBvcnQgdGltZWl0CisgICAgICAgICAgICBpbXBvcnQgdG9haWZmCisgICAgICAgICAgICBpbXBvcnQgdG9rZW4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgdHR5ICAgICAjIG5vdCBhdmFpbGFibGUgb24gV2luZG93cworICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAic2tpcHBpbmcgdHR5IgorCisgICAgICAgICAgICAjIENhbid0IHRlc3QgdGhlICJ1c2VyIiBtb2R1bGUgLS0gaWYgdGhlIHVzZXIgaGFzIGEgfi8ucHl0aG9ucmMucHksIGl0CisgICAgICAgICAgICAjIGNhbiBzY3JldyB1cCBhbGwgc29ydHMgb2YgdGhpbmdzIChlc3AuIGlmIGl0IHByaW50cyEpLgorICAgICAgICAgICAgI2ltcG9ydCB1c2VyCisgICAgICAgICAgICBpbXBvcnQgd2ViYnJvd3NlcgorICAgICAgICAgICAgaW1wb3J0IHhtbAorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RVbnRlc3RlZE1vZHVsZXMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5kcnkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzkxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5kcnkucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1bmRyeS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5kcnkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzkxZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdW5kcnkucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMWNhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdXBwb3J0LnB5CkBAIC0wLDAgKzEsMTM2NyBAQAorIiIiU3VwcG9ydGluZyBkZWZpbml0aW9ucyBmb3IgdGhlIFB5dGhvbiByZWdyZXNzaW9uIHRlc3RzLiIiIgorCitpZiBfX25hbWVfXyAhPSAndGVzdC50ZXN0X3N1cHBvcnQnOgorICAgIHJhaXNlIEltcG9ydEVycm9yKCd0ZXN0X3N1cHBvcnQgbXVzdCBiZSBpbXBvcnRlZCBmcm9tIHRoZSB0ZXN0IHBhY2thZ2UnKQorCitpbXBvcnQgY29udGV4dGxpYgoraW1wb3J0IGVycm5vCitpbXBvcnQgZnVuY3Rvb2xzCitpbXBvcnQgZ2MKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHBsYXRmb3JtCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGltcG9ydGxpYgoraW1wb3J0IFVzZXJEaWN0CitpbXBvcnQgcmUKK2ltcG9ydCB0aW1lCitpbXBvcnQgc3RydWN0CitpbXBvcnQgX3Rlc3RjYXBpCitpbXBvcnQgc3lzY29uZmlnCit0cnk6CisgICAgaW1wb3J0IHRocmVhZAorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHRocmVhZCA9IE5vbmUKKworX19hbGxfXyA9IFsiRXJyb3IiLCAiVGVzdEZhaWxlZCIsICJSZXNvdXJjZURlbmllZCIsICJpbXBvcnRfbW9kdWxlIiwKKyAgICAgICAgICAgInZlcmJvc2UiLCAidXNlX3Jlc291cmNlcyIsICJtYXhfbWVtdXNlIiwgInJlY29yZF9vcmlnaW5hbF9zdGRvdXQiLAorICAgICAgICAgICAiZ2V0X29yaWdpbmFsX3N0ZG91dCIsICJ1bmxvYWQiLCAidW5saW5rIiwgInJtdHJlZSIsICJmb3JnZXQiLAorICAgICAgICAgICAiaXNfcmVzb3VyY2VfZW5hYmxlZCIsICJyZXF1aXJlcyIsICJmaW5kX3VudXNlZF9wb3J0IiwgImJpbmRfcG9ydCIsCisgICAgICAgICAgICJmY21wIiwgImhhdmVfdW5pY29kZSIsICJpc19qeXRob24iLCAiVEVTVEZOIiwgIkhPU1QiLCAiRlVaWiIsCisgICAgICAgICAgICJTQVZFRENXRCIsICJ0ZW1wX2N3ZCIsICJmaW5kZmlsZSIsICJzb3J0ZGljdCIsICJjaGVja19zeW50YXhfZXJyb3IiLAorICAgICAgICAgICAib3Blbl91cmxyZXNvdXJjZSIsICJjaGVja193YXJuaW5ncyIsICJjaGVja19weTNrX3dhcm5pbmdzIiwKKyAgICAgICAgICAgIkNsZWFuSW1wb3J0IiwgIkVudmlyb25tZW50VmFyR3VhcmQiLCAiY2FwdHVyZWRfb3V0cHV0IiwKKyAgICAgICAgICAgImNhcHR1cmVkX3N0ZG91dCIsICJUcmFuc2llbnRSZXNvdXJjZSIsICJ0cmFuc2llbnRfaW50ZXJuZXQiLAorICAgICAgICAgICAicnVuX3dpdGhfbG9jYWxlIiwgInNldF9tZW1saW1pdCIsICJiaWdtZW10ZXN0IiwgImJpZ2FkZHJzcGFjZXRlc3QiLAorICAgICAgICAgICAiQmFzaWNUZXN0UnVubmVyIiwgInJ1bl91bml0dGVzdCIsICJydW5fZG9jdGVzdCIsICJ0aHJlYWRpbmdfc2V0dXAiLAorICAgICAgICAgICAidGhyZWFkaW5nX2NsZWFudXAiLCAicmVhcF9jaGlsZHJlbiIsICJjcHl0aG9uX29ubHkiLAorICAgICAgICAgICAiY2hlY2tfaW1wbF9kZXRhaWwiLCAiZ2V0X2F0dHJpYnV0ZSIsICJweTNrX2J5dGVzIiwKKyAgICAgICAgICAgImltcG9ydF9mcmVzaF9tb2R1bGUiLCAidGhyZWFkaW5nX2NsZWFudXAiLCAicmVhcF9jaGlsZHJlbiIsCisgICAgICAgICAgICJzdHJpcF9weXRob25fc3RkZXJyIl0KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciByZWdyZXNzaW9uIHRlc3QgZXhjZXB0aW9ucy4iIiIKKworY2xhc3MgVGVzdEZhaWxlZChFcnJvcik6CisgICAgIiIiVGVzdCBmYWlsZWQuIiIiCisKK2NsYXNzIFJlc291cmNlRGVuaWVkKHVuaXR0ZXN0LlNraXBUZXN0KToKKyAgICAiIiJUZXN0IHNraXBwZWQgYmVjYXVzZSBpdCByZXF1ZXN0ZWQgYSBkaXNhbGxvd2VkIHJlc291cmNlLgorCisgICAgVGhpcyBpcyByYWlzZWQgd2hlbiBhIHRlc3QgY2FsbHMgcmVxdWlyZXMoKSBmb3IgYSByZXNvdXJjZSB0aGF0CisgICAgaGFzIG5vdCBiZWVuIGVuYWJsZWQuICBJdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZXhwZWN0ZWQKKyAgICBhbmQgdW5leHBlY3RlZCBza2lwcy4KKyAgICAiIiIKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBfaWdub3JlX2RlcHJlY2F0ZWRfaW1wb3J0cyhpZ25vcmU9VHJ1ZSk6CisgICAgIiIiQ29udGV4dCBtYW5hZ2VyIHRvIHN1cHByZXNzIHBhY2thZ2UgYW5kIG1vZHVsZSBkZXByZWNhdGlvbgorICAgIHdhcm5pbmdzIHdoZW4gaW1wb3J0aW5nIHRoZW0uCisKKyAgICBJZiBpZ25vcmUgaXMgRmFsc2UsIHRoaXMgY29udGV4dCBtYW5hZ2VyIGhhcyBubyBlZmZlY3QuIiIiCisgICAgaWYgaWdub3JlOgorICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgIi4rIChtb2R1bGV8cGFja2FnZSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICAgICAgeWllbGQKKyAgICBlbHNlOgorICAgICAgICB5aWVsZAorCisKK2RlZiBpbXBvcnRfbW9kdWxlKG5hbWUsIGRlcHJlY2F0ZWQ9RmFsc2UpOgorICAgICIiIkltcG9ydCBhbmQgcmV0dXJuIHRoZSBtb2R1bGUgdG8gYmUgdGVzdGVkLCByYWlzaW5nIFNraXBUZXN0IGlmCisgICAgaXQgaXMgbm90IGF2YWlsYWJsZS4KKworICAgIElmIGRlcHJlY2F0ZWQgaXMgVHJ1ZSwgYW55IG1vZHVsZSBvciBwYWNrYWdlIGRlcHJlY2F0aW9uIG1lc3NhZ2VzCisgICAgd2lsbCBiZSBzdXBwcmVzc2VkLiIiIgorICAgIHdpdGggX2lnbm9yZV9kZXByZWNhdGVkX2ltcG9ydHMoZGVwcmVjYXRlZCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBpbXBvcnRsaWIuaW1wb3J0X21vZHVsZShuYW1lKQorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KHN0cihtc2cpKQorCisKK2RlZiBfc2F2ZV9hbmRfcmVtb3ZlX21vZHVsZShuYW1lLCBvcmlnX21vZHVsZXMpOgorICAgICIiIkhlbHBlciBmdW5jdGlvbiB0byBzYXZlIGFuZCByZW1vdmUgYSBtb2R1bGUgZnJvbSBzeXMubW9kdWxlcworCisgICAgICAgUmFpc2UgSW1wb3J0RXJyb3IgaWYgdGhlIG1vZHVsZSBjYW4ndCBiZSBpbXBvcnRlZC4iIiIKKyAgICAjIHRyeSB0byBpbXBvcnQgdGhlIG1vZHVsZSBhbmQgcmFpc2UgYW4gZXJyb3IgaWYgaXQgY2FuJ3QgYmUgaW1wb3J0ZWQKKyAgICBpZiBuYW1lIG5vdCBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbmFtZV0KKyAgICBmb3IgbW9kbmFtZSBpbiBsaXN0KHN5cy5tb2R1bGVzKToKKyAgICAgICAgaWYgbW9kbmFtZSA9PSBuYW1lIG9yIG1vZG5hbWUuc3RhcnRzd2l0aChuYW1lICsgJy4nKToKKyAgICAgICAgICAgIG9yaWdfbW9kdWxlc1ttb2RuYW1lXSA9IHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kbmFtZV0KKworZGVmIF9zYXZlX2FuZF9ibG9ja19tb2R1bGUobmFtZSwgb3JpZ19tb2R1bGVzKToKKyAgICAiIiJIZWxwZXIgZnVuY3Rpb24gdG8gc2F2ZSBhbmQgYmxvY2sgYSBtb2R1bGUgaW4gc3lzLm1vZHVsZXMKKworICAgICAgIFJldHVybiBUcnVlIGlmIHRoZSBtb2R1bGUgd2FzIGluIHN5cy5tb2R1bGVzLCBGYWxzZSBvdGhlcndpc2UuIiIiCisgICAgc2F2ZWQgPSBUcnVlCisgICAgdHJ5OgorICAgICAgICBvcmlnX21vZHVsZXNbbmFtZV0gPSBzeXMubW9kdWxlc1tuYW1lXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgc2F2ZWQgPSBGYWxzZQorICAgIHN5cy5tb2R1bGVzW25hbWVdID0gTm9uZQorICAgIHJldHVybiBzYXZlZAorCisKK2RlZiBpbXBvcnRfZnJlc2hfbW9kdWxlKG5hbWUsIGZyZXNoPSgpLCBibG9ja2VkPSgpLCBkZXByZWNhdGVkPUZhbHNlKToKKyAgICAiIiJJbXBvcnRzIGFuZCByZXR1cm5zIGEgbW9kdWxlLCBkZWxpYmVyYXRlbHkgYnlwYXNzaW5nIHRoZSBzeXMubW9kdWxlcyBjYWNoZQorICAgIGFuZCBpbXBvcnRpbmcgYSBmcmVzaCBjb3B5IG9mIHRoZSBtb2R1bGUuIE9uY2UgdGhlIGltcG9ydCBpcyBjb21wbGV0ZSwKKyAgICB0aGUgc3lzLm1vZHVsZXMgY2FjaGUgaXMgcmVzdG9yZWQgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLgorCisgICAgTW9kdWxlcyBuYW1lZCBpbiBmcmVzaCBhcmUgYWxzbyBpbXBvcnRlZCBhbmV3IGlmIG5lZWRlZCBieSB0aGUgaW1wb3J0LgorICAgIElmIG9uZSBvZiB0aGVzZSBtb2R1bGVzIGNhbid0IGJlIGltcG9ydGVkLCBOb25lIGlzIHJldHVybmVkLgorCisgICAgSW1wb3J0aW5nIG9mIG1vZHVsZXMgbmFtZWQgaW4gYmxvY2tlZCBpcyBwcmV2ZW50ZWQgd2hpbGUgdGhlIGZyZXNoIGltcG9ydAorICAgIHRha2VzIHBsYWNlLgorCisgICAgSWYgZGVwcmVjYXRlZCBpcyBUcnVlLCBhbnkgbW9kdWxlIG9yIHBhY2thZ2UgZGVwcmVjYXRpb24gbWVzc2FnZXMKKyAgICB3aWxsIGJlIHN1cHByZXNzZWQuIiIiCisgICAgIyBOT1RFOiB0ZXN0X2hlYXBxLCB0ZXN0X2pzb24sIGFuZCB0ZXN0X3dhcm5pbmdzIGluY2x1ZGUgZXh0cmEgc2FuaXR5CisgICAgIyBjaGVja3MgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyB1dGlsaXR5IGZ1bmN0aW9uIGlzIHdvcmtpbmcgYXMgZXhwZWN0ZWQKKyAgICB3aXRoIF9pZ25vcmVfZGVwcmVjYXRlZF9pbXBvcnRzKGRlcHJlY2F0ZWQpOgorICAgICAgICAjIEtlZXAgdHJhY2sgb2YgbW9kdWxlcyBzYXZlZCBmb3IgbGF0ZXIgcmVzdG9yYXRpb24gYXMgd2VsbAorICAgICAgICAjIGFzIHRob3NlIHdoaWNoIGp1c3QgbmVlZCBhIGJsb2NraW5nIGVudHJ5IHJlbW92ZWQKKyAgICAgICAgb3JpZ19tb2R1bGVzID0ge30KKyAgICAgICAgbmFtZXNfdG9fcmVtb3ZlID0gW10KKyAgICAgICAgX3NhdmVfYW5kX3JlbW92ZV9tb2R1bGUobmFtZSwgb3JpZ19tb2R1bGVzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgZnJlc2hfbmFtZSBpbiBmcmVzaDoKKyAgICAgICAgICAgICAgICBfc2F2ZV9hbmRfcmVtb3ZlX21vZHVsZShmcmVzaF9uYW1lLCBvcmlnX21vZHVsZXMpCisgICAgICAgICAgICBmb3IgYmxvY2tlZF9uYW1lIGluIGJsb2NrZWQ6CisgICAgICAgICAgICAgICAgaWYgbm90IF9zYXZlX2FuZF9ibG9ja19tb2R1bGUoYmxvY2tlZF9uYW1lLCBvcmlnX21vZHVsZXMpOgorICAgICAgICAgICAgICAgICAgICBuYW1lc190b19yZW1vdmUuYXBwZW5kKGJsb2NrZWRfbmFtZSkKKyAgICAgICAgICAgIGZyZXNoX21vZHVsZSA9IGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKG5hbWUpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGZyZXNoX21vZHVsZSA9IE5vbmUKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZvciBvcmlnX25hbWUsIG1vZHVsZSBpbiBvcmlnX21vZHVsZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBzeXMubW9kdWxlc1tvcmlnX25hbWVdID0gbW9kdWxlCisgICAgICAgICAgICBmb3IgbmFtZV90b19yZW1vdmUgaW4gbmFtZXNfdG9fcmVtb3ZlOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1tuYW1lX3RvX3JlbW92ZV0KKyAgICAgICAgcmV0dXJuIGZyZXNoX21vZHVsZQorCisKK2RlZiBnZXRfYXR0cmlidXRlKG9iaiwgbmFtZSk6CisgICAgIiIiR2V0IGFuIGF0dHJpYnV0ZSwgcmFpc2luZyBTa2lwVGVzdCBpZiBBdHRyaWJ1dGVFcnJvciBpcyByYWlzZWQuIiIiCisgICAgdHJ5OgorICAgICAgICBhdHRyaWJ1dGUgPSBnZXRhdHRyKG9iaiwgbmFtZSkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJtb2R1bGUgJXMgaGFzIG5vIGF0dHJpYnV0ZSAlcyIgJSAoCisgICAgICAgICAgICBvYmouX19uYW1lX18sIG5hbWUpKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGUKKworCit2ZXJib3NlID0gMSAgICAgICAgICAgICAgIyBGbGFnIHNldCB0byAwIGJ5IHJlZ3J0ZXN0LnB5Cit1c2VfcmVzb3VyY2VzID0gTm9uZSAgICAgIyBGbGFnIHNldCB0byBbXSBieSByZWdydGVzdC5weQorbWF4X21lbXVzZSA9IDAgICAgICAgICAgICMgRGlzYWJsZSBiaWdtZW0gdGVzdHMgKHRoZXkgd2lsbCBzdGlsbCBiZSBydW4gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICMgc21hbGwgc2l6ZXMsIHRvIG1ha2Ugc3VyZSB0aGV5IHdvcmsuKQorcmVhbF9tYXhfbWVtdXNlID0gMAorCisjIF9vcmlnaW5hbF9zdGRvdXQgaXMgbWVhbnQgdG8gaG9sZCBzdGRvdXQgYXQgdGhlIHRpbWUgcmVncnRlc3QgYmVnYW4uCisjIFRoaXMgbWF5IGJlICJ0aGUgcmVhbCIgc3Rkb3V0LCBvciBJRExFJ3MgZW11bGF0aW9uIG9mIHN0ZG91dCwgb3Igd2hhdGV2ZXIuCisjIFRoZSBwb2ludCBpcyB0byBoYXZlIHNvbWUgZmxhdm9yIG9mIHN0ZG91dCB0aGUgdXNlciBjYW4gYWN0dWFsbHkgc2VlLgorX29yaWdpbmFsX3N0ZG91dCA9IE5vbmUKK2RlZiByZWNvcmRfb3JpZ2luYWxfc3Rkb3V0KHN0ZG91dCk6CisgICAgZ2xvYmFsIF9vcmlnaW5hbF9zdGRvdXQKKyAgICBfb3JpZ2luYWxfc3Rkb3V0ID0gc3Rkb3V0CisKK2RlZiBnZXRfb3JpZ2luYWxfc3Rkb3V0KCk6CisgICAgcmV0dXJuIF9vcmlnaW5hbF9zdGRvdXQgb3Igc3lzLnN0ZG91dAorCitkZWYgdW5sb2FkKG5hbWUpOgorICAgIHRyeToKKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBwYXNzCisKK2lmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCJ3aW4iKToKKyAgICBkZWYgX3dhaXRmb3IoZnVuYywgcGF0aG5hbWUsIHdhaXRhbGw9RmFsc2UpOgorICAgICAgICAjIFBlZm9ybSB0aGUgb3BlcmF0aW9uCisgICAgICAgIGZ1bmMocGF0aG5hbWUpCisgICAgICAgICMgTm93IHNldHVwIHRoZSB3YWl0IGxvb3AKKyAgICAgICAgaWYgd2FpdGFsbDoKKyAgICAgICAgICAgIGRpcm5hbWUgPSBwYXRobmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGlybmFtZSwgbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aG5hbWUpCisgICAgICAgICAgICBkaXJuYW1lID0gZGlybmFtZSBvciAnLicKKyAgICAgICAgIyBDaGVjayBmb3IgYHBhdGhuYW1lYCB0byBiZSByZW1vdmVkIGZyb20gdGhlIGZpbGVzeXN0ZW0uCisgICAgICAgICMgVGhlIGV4cG9uZW50aWFsIGJhY2tvZmYgb2YgdGhlIHRpbWVvdXQgYW1vdW50cyB0byBhIHRvdGFsCisgICAgICAgICMgb2YgfjEgc2Vjb25kIGFmdGVyIHdoaWNoIHRoZSBkZWxldGlvbiBpcyBwcm9iYWJseSBhbiBlcnJvcgorICAgICAgICAjIGFueXdheS4KKyAgICAgICAgIyBUZXN0aW5nIG9uIGEgaTdANC4zR0h6IHNob3dzIHRoYXQgdXN1YWxseSBvbmx5IDEgaXRlcmF0aW9uIGlzCisgICAgICAgICMgcmVxdWlyZWQgd2hlbiBjb250ZW50aW9uIG9jY3Vycy4KKyAgICAgICAgdGltZW91dCA9IDAuMDAxCisgICAgICAgIHdoaWxlIHRpbWVvdXQgPCAxLjA6CisgICAgICAgICAgICAjIE5vdGUgd2UgYXJlIG9ubHkgdGVzdGluZyBmb3IgdGhlIGV4aXN0YW5jZSBvZiB0aGUgZmlsZShzKSBpbgorICAgICAgICAgICAgIyB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSByZWdhcmRsZXNzIG9mIGFueSBzZWN1cml0eSBvcgorICAgICAgICAgICAgIyBhY2Nlc3MgcmlnaHRzLiAgSWYgd2UgaGF2ZSBtYWRlIGl0IHRoaXMgZmFyLCB3ZSBoYXZlIHN1ZmZpY2llbnQKKyAgICAgICAgICAgICMgcGVybWlzc2lvbnMgdG8gZG8gdGhhdCBtdWNoIHVzaW5nIFB5dGhvbidzIGVxdWl2YWxlbnQgb2YgdGhlCisgICAgICAgICAgICAjIFdpbmRvd3MgQVBJIEZpbmRGaXJzdEZpbGUuCisgICAgICAgICAgICAjIE90aGVyIFdpbmRvd3MgQVBJcyBjYW4gZmFpbCBvciBnaXZlIGluY29ycmVjdCByZXN1bHRzIHdoZW4KKyAgICAgICAgICAgICMgZGVhbGluZyB3aXRoIGZpbGVzIHRoYXQgYXJlIHBlbmRpbmcgZGVsZXRpb24uCisgICAgICAgICAgICBMID0gb3MubGlzdGRpcihkaXJuYW1lKQorICAgICAgICAgICAgaWYgbm90IChMIGlmIHdhaXRhbGwgZWxzZSBuYW1lIGluIEwpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgIyBJbmNyZWFzZSB0aGUgdGltZW91dCBhbmQgdHJ5IGFnYWluCisgICAgICAgICAgICB0aW1lLnNsZWVwKHRpbWVvdXQpCisgICAgICAgICAgICB0aW1lb3V0ICo9IDIKKyAgICAgICAgd2FybmluZ3Mud2FybigndGVzdHMgbWF5IGZhaWwsIGRlbGV0ZSBzdGlsbCBwZW5kaW5nIGZvciAnICsgcGF0aG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgUnVudGltZVdhcm5pbmcsIHN0YWNrbGV2ZWw9NCkKKworICAgIGRlZiBfdW5saW5rKGZpbGVuYW1lKToKKyAgICAgICAgX3dhaXRmb3Iob3MudW5saW5rLCBmaWxlbmFtZSkKKworICAgIGRlZiBfcm1kaXIoZGlybmFtZSk6CisgICAgICAgIF93YWl0Zm9yKG9zLnJtZGlyLCBkaXJuYW1lKQorCisgICAgZGVmIF9ybXRyZWUocGF0aCk6CisgICAgICAgIGRlZiBfcm10cmVlX2lubmVyKHBhdGgpOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihwYXRoLCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbG5hbWUpOgorICAgICAgICAgICAgICAgICAgICBfd2FpdGZvcihfcm10cmVlX2lubmVyLCBmdWxsbmFtZSwgd2FpdGFsbD1UcnVlKQorICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihmdWxsbmFtZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZnVsbG5hbWUpCisgICAgICAgIF93YWl0Zm9yKF9ybXRyZWVfaW5uZXIsIHBhdGgsIHdhaXRhbGw9VHJ1ZSkKKyAgICAgICAgX3dhaXRmb3Iob3Mucm1kaXIsIHBhdGgpCitlbHNlOgorICAgIF91bmxpbmsgPSBvcy51bmxpbmsKKyAgICBfcm1kaXIgPSBvcy5ybWRpcgorICAgIF9ybXRyZWUgPSBzaHV0aWwucm10cmVlCisKK2RlZiB1bmxpbmsoZmlsZW5hbWUpOgorICAgIHRyeToKKyAgICAgICAgX3VubGluayhmaWxlbmFtZSkKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgcGFzcworCitkZWYgcm1kaXIoZGlybmFtZSk6CisgICAgdHJ5OgorICAgICAgICBfcm1kaXIoZGlybmFtZSkKKyAgICBleGNlcHQgT1NFcnJvciBhcyBlcnJvcjoKKyAgICAgICAgIyBUaGUgZGlyZWN0b3J5IG5lZWQgbm90IGV4aXN0LgorICAgICAgICBpZiBlcnJvci5lcnJubyAhPSBlcnJuby5FTk9FTlQ6CisgICAgICAgICAgICByYWlzZQorCitkZWYgcm10cmVlKHBhdGgpOgorICAgIHRyeToKKyAgICAgICAgX3JtdHJlZShwYXRoKQorICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAjIFVuaXggcmV0dXJucyBFTk9FTlQsIFdpbmRvd3MgcmV0dXJucyBFU1JDSC4KKyAgICAgICAgaWYgZS5lcnJubyBub3QgaW4gKGVycm5vLkVOT0VOVCwgZXJybm8uRVNSQ0gpOgorICAgICAgICAgICAgcmFpc2UKKworZGVmIGZvcmdldChtb2RuYW1lKToKKyAgICAnJyciRm9yZ2V0IiBhIG1vZHVsZSB3YXMgZXZlciBpbXBvcnRlZCBieSByZW1vdmluZyBpdCBmcm9tIHN5cy5tb2R1bGVzIGFuZAorICAgIGRlbGV0aW5nIGFueSAucHljIGFuZCAucHlvIGZpbGVzLicnJworICAgIHVubG9hZChtb2RuYW1lKQorICAgIGZvciBkaXJuYW1lIGluIHN5cy5wYXRoOgorICAgICAgICB1bmxpbmsob3MucGF0aC5qb2luKGRpcm5hbWUsIG1vZG5hbWUgKyBvcy5leHRzZXAgKyAncHljJykpCisgICAgICAgICMgRGVsZXRpbmcgdGhlIC5weW8gZmlsZSBjYW5ub3QgYmUgd2l0aGluIHRoZSAndHJ5JyBmb3IgdGhlIC5weWMgc2luY2UKKyAgICAgICAgIyB0aGUgY2hhbmNlIGV4aXN0cyB0aGF0IHRoZXJlIGlzIG5vIC5weWMgKGFuZCB0aHVzIHRoZSAndHJ5JyBzdGF0ZW1lbnQKKyAgICAgICAgIyBpcyBleGl0ZWQpIGJ1dCB0aGVyZSBpcyBhIC5weW8gZmlsZS4KKyAgICAgICAgdW5saW5rKG9zLnBhdGguam9pbihkaXJuYW1lLCBtb2RuYW1lICsgb3MuZXh0c2VwICsgJ3B5bycpKQorCitkZWYgaXNfcmVzb3VyY2VfZW5hYmxlZChyZXNvdXJjZSk6CisgICAgIiIiVGVzdCB3aGV0aGVyIGEgcmVzb3VyY2UgaXMgZW5hYmxlZC4gIEtub3duIHJlc291cmNlcyBhcmUgc2V0IGJ5CisgICAgcmVncnRlc3QucHkuIiIiCisgICAgcmV0dXJuIHVzZV9yZXNvdXJjZXMgaXMgbm90IE5vbmUgYW5kIHJlc291cmNlIGluIHVzZV9yZXNvdXJjZXMKKworZGVmIHJlcXVpcmVzKHJlc291cmNlLCBtc2c9Tm9uZSk6CisgICAgIiIiUmFpc2UgUmVzb3VyY2VEZW5pZWQgaWYgdGhlIHNwZWNpZmllZCByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlLgorCisgICAgSWYgdGhlIGNhbGxlcidzIG1vZHVsZSBpcyBfX21haW5fXyB0aGVuIGF1dG9tYXRpY2FsbHkgcmV0dXJuIFRydWUuICBUaGUKKyAgICBwb3NzaWJpbGl0eSBvZiBGYWxzZSBiZWluZyByZXR1cm5lZCBvY2N1cnMgd2hlbiByZWdydGVzdC5weSBpcyBleGVjdXRpbmcuIiIiCisgICAgIyBzZWUgaWYgdGhlIGNhbGxlcidzIG1vZHVsZSBpcyBfX21haW5fXyAtIGlmIHNvLCB0cmVhdCBhcyBpZgorICAgICMgdGhlIHJlc291cmNlIHdhcyBzZXQKKyAgICBpZiBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscy5nZXQoIl9fbmFtZV9fIikgPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgcmV0dXJuCisgICAgaWYgbm90IGlzX3Jlc291cmNlX2VuYWJsZWQocmVzb3VyY2UpOgorICAgICAgICBpZiBtc2cgaXMgTm9uZToKKyAgICAgICAgICAgIG1zZyA9ICJVc2Ugb2YgdGhlIGAlcycgcmVzb3VyY2Ugbm90IGVuYWJsZWQiICUgcmVzb3VyY2UKKyAgICAgICAgcmFpc2UgUmVzb3VyY2VEZW5pZWQobXNnKQorCitIT1NUID0gJ2xvY2FsaG9zdCcKKworZGVmIGZpbmRfdW51c2VkX3BvcnQoZmFtaWx5PXNvY2tldC5BRl9JTkVULCBzb2NrdHlwZT1zb2NrZXQuU09DS19TVFJFQU0pOgorICAgICIiIlJldHVybnMgYW4gdW51c2VkIHBvcnQgdGhhdCBzaG91bGQgYmUgc3VpdGFibGUgZm9yIGJpbmRpbmcuICBUaGlzIGlzCisgICAgYWNoaWV2ZWQgYnkgY3JlYXRpbmcgYSB0ZW1wb3Jhcnkgc29ja2V0IHdpdGggdGhlIHNhbWUgZmFtaWx5IGFuZCB0eXBlIGFzCisgICAgdGhlICdzb2NrJyBwYXJhbWV0ZXIgKGRlZmF1bHQgaXMgQUZfSU5FVCwgU09DS19TVFJFQU0pLCBhbmQgYmluZGluZyBpdCB0bworICAgIHRoZSBzcGVjaWZpZWQgaG9zdCBhZGRyZXNzIChkZWZhdWx0cyB0byAwLjAuMC4wKSB3aXRoIHRoZSBwb3J0IHNldCB0byAwLAorICAgIGVsaWNpdGluZyBhbiB1bnVzZWQgZXBoZW1lcmFsIHBvcnQgZnJvbSB0aGUgT1MuICBUaGUgdGVtcG9yYXJ5IHNvY2tldCBpcworICAgIHRoZW4gY2xvc2VkIGFuZCBkZWxldGVkLCBhbmQgdGhlIGVwaGVtZXJhbCBwb3J0IGlzIHJldHVybmVkLgorCisgICAgRWl0aGVyIHRoaXMgbWV0aG9kIG9yIGJpbmRfcG9ydCgpIHNob3VsZCBiZSB1c2VkIGZvciBhbnkgdGVzdHMgd2hlcmUgYQorICAgIHNlcnZlciBzb2NrZXQgbmVlZHMgdG8gYmUgYm91bmQgdG8gYSBwYXJ0aWN1bGFyIHBvcnQgZm9yIHRoZSBkdXJhdGlvbiBvZgorICAgIHRoZSB0ZXN0LiAgV2hpY2ggb25lIHRvIHVzZSBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGNhbGxpbmcgY29kZSBpcyBjcmVhdGluZworICAgIGEgcHl0aG9uIHNvY2tldCwgb3IgaWYgYW4gdW51c2VkIHBvcnQgbmVlZHMgdG8gYmUgcHJvdmlkZWQgaW4gYSBjb25zdHJ1Y3RvcgorICAgIG9yIHBhc3NlZCB0byBhbiBleHRlcm5hbCBwcm9ncmFtIChpLmUuIHRoZSAtYWNjZXB0IGFyZ3VtZW50IHRvIG9wZW5zc2wncworICAgIHNfc2VydmVyIG1vZGUpLiAgQWx3YXlzIHByZWZlciBiaW5kX3BvcnQoKSBvdmVyIGZpbmRfdW51c2VkX3BvcnQoKSB3aGVyZQorICAgIHBvc3NpYmxlLiAgSGFyZCBjb2RlZCBwb3J0cyBzaG91bGQgKk5FVkVSKiBiZSB1c2VkLiAgQXMgc29vbiBhcyBhIHNlcnZlcgorICAgIHNvY2tldCBpcyBib3VuZCB0byBhIGhhcmQgY29kZWQgcG9ydCwgdGhlIGFiaWxpdHkgdG8gcnVuIG11bHRpcGxlIGluc3RhbmNlcworICAgIG9mIHRoZSB0ZXN0IHNpbXVsdGFuZW91c2x5IG9uIHRoZSBzYW1lIGhvc3QgaXMgY29tcHJvbWlzZWQsIHdoaWNoIG1ha2VzIHRoZQorICAgIHRlc3QgYSB0aWNraW5nIHRpbWUgYm9tYiBpbiBhIGJ1aWxkYm90IGVudmlyb25tZW50LiBPbiBVbml4IGJ1aWxkYm90cywgdGhpcworICAgIG1heSBzaW1wbHkgbWFuaWZlc3QgYXMgYSBmYWlsZWQgdGVzdCwgd2hpY2ggY2FuIGJlIHJlY292ZXJlZCBmcm9tIHdpdGhvdXQKKyAgICBpbnRlcnZlbnRpb24gaW4gbW9zdCBjYXNlcywgYnV0IG9uIFdpbmRvd3MsIHRoZSBlbnRpcmUgcHl0aG9uIHByb2Nlc3MgY2FuCisgICAgY29tcGxldGVseSBhbmQgdXR0ZXJseSB3ZWRnZSwgcmVxdWlyaW5nIHNvbWVvbmUgdG8gbG9nIGluIHRvIHRoZSBidWlsZGJvdAorICAgIGFuZCBtYW51YWxseSBraWxsIHRoZSBhZmZlY3RlZCBwcm9jZXNzLgorCisgICAgKFRoaXMgaXMgZWFzeSB0byByZXByb2R1Y2Ugb24gV2luZG93cywgdW5mb3J0dW5hdGVseSwgYW5kIGNhbiBiZSB0cmFjZWQgdG8KKyAgICB0aGUgU09fUkVVU0VBRERSIHNvY2tldCBvcHRpb24gaGF2aW5nIGRpZmZlcmVudCBzZW1hbnRpY3Mgb24gV2luZG93cyB2ZXJzdXMKKyAgICBVbml4L0xpbnV4LiAgT24gVW5peCwgeW91IGNhbid0IGhhdmUgdHdvIEFGX0lORVQgU09DS19TVFJFQU0gc29ja2V0cyBiaW5kLAorICAgIGxpc3RlbiBhbmQgdGhlbiBhY2NlcHQgY29ubmVjdGlvbnMgb24gaWRlbnRpY2FsIGhvc3QvcG9ydHMuICBBbiBFQUREUklOVVNFCisgICAgc29ja2V0LmVycm9yIHdpbGwgYmUgcmFpc2VkIGF0IHNvbWUgcG9pbnQgKGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gYW5kCisgICAgdGhlIG9yZGVyIGJpbmQgYW5kIGxpc3RlbiB3ZXJlIGNhbGxlZCBvbiBlYWNoIHNvY2tldCkuCisKKyAgICBIb3dldmVyLCBvbiBXaW5kb3dzLCBpZiBTT19SRVVTRUFERFIgaXMgc2V0IG9uIHRoZSBzb2NrZXRzLCBubyBFQUREUklOVVNFCisgICAgd2lsbCBldmVyIGJlIHJhaXNlZCB3aGVuIGF0dGVtcHRpbmcgdG8gYmluZCB0d28gaWRlbnRpY2FsIGhvc3QvcG9ydHMuIFdoZW4KKyAgICBhY2NlcHQoKSBpcyBjYWxsZWQgb24gZWFjaCBzb2NrZXQsIHRoZSBzZWNvbmQgY2FsbGVyJ3MgcHJvY2VzcyB3aWxsIHN0ZWFsCisgICAgdGhlIHBvcnQgZnJvbSB0aGUgZmlyc3QgY2FsbGVyLCBsZWF2aW5nIHRoZW0gYm90aCBpbiBhbiBhd2t3YXJkbHkgd2VkZ2VkCisgICAgc3RhdGUgd2hlcmUgdGhleSdsbCBubyBsb25nZXIgcmVzcG9uZCB0byBhbnkgc2lnbmFscyBvciBncmFjZWZ1bCBraWxscywgYW5kCisgICAgbXVzdCBiZSBmb3JjaWJseSBraWxsZWQgdmlhIE9wZW5Qcm9jZXNzKCkvVGVybWluYXRlUHJvY2VzcygpLgorCisgICAgVGhlIHNvbHV0aW9uIG9uIFdpbmRvd3MgaXMgdG8gdXNlIHRoZSBTT19FWENMVVNJVkVBRERSVVNFIHNvY2tldCBvcHRpb24KKyAgICBpbnN0ZWFkIG9mIFNPX1JFVVNFQUREUiwgd2hpY2ggZWZmZWN0aXZlbHkgYWZmb3JkcyB0aGUgc2FtZSBzZW1hbnRpY3MgYXMKKyAgICBTT19SRVVTRUFERFIgb24gVW5peC4gIEdpdmVuIHRoZSBwcm9wZW5zaXR5IG9mIFVuaXggZGV2ZWxvcGVycyBpbiB0aGUgT3BlbgorICAgIFNvdXJjZSB3b3JsZCBjb21wYXJlZCB0byBXaW5kb3dzIG9uZXMsIHRoaXMgaXMgYSBjb21tb24gbWlzdGFrZS4gIEEgcXVpY2sKKyAgICBsb29rIG92ZXIgT3BlblNTTCdzIDAuOS44ZyBzb3VyY2Ugc2hvd3MgdGhhdCB0aGV5IHVzZSBTT19SRVVTRUFERFIgd2hlbgorICAgIG9wZW5zc2wuZXhlIGlzIGNhbGxlZCB3aXRoIHRoZSAnc19zZXJ2ZXInIG9wdGlvbiwgZm9yIGV4YW1wbGUuIFNlZQorICAgIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNTUwIGZvciBtb3JlIGluZm8uICBUaGUgZm9sbG93aW5nIHNpdGUgYWxzbworICAgIGhhcyBhIHZlcnkgdGhvcm91Z2ggZGVzY3JpcHRpb24gYWJvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiBib3RoIFJFVVNFQUREUgorICAgIGFuZCBFWENMVVNJVkVBRERSVVNFIG9uIFdpbmRvd3M6CisgICAgaHR0cDovL21zZG4yLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczc0MDYyMShWUy44NSkuYXNweCkKKworICAgIFhYWDogYWx0aG91Z2ggdGhpcyBhcHByb2FjaCBpcyBhIHZhc3QgaW1wcm92ZW1lbnQgb24gcHJldmlvdXMgYXR0ZW1wdHMgdG8KKyAgICBlbGljaXQgdW51c2VkIHBvcnRzLCBpdCByZXN0cyBoZWF2aWx5IG9uIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGVwaGVtZXJhbAorICAgIHBvcnQgcmV0dXJuZWQgdG8gdXMgYnkgdGhlIE9TIHdvbid0IGltbWVkaWF0ZWx5IGJlIGRpc2hlZCBiYWNrIG91dCB0byBzb21lCisgICAgb3RoZXIgcHJvY2VzcyB3aGVuIHdlIGNsb3NlIGFuZCBkZWxldGUgb3VyIHRlbXBvcmFyeSBzb2NrZXQgYnV0IGJlZm9yZSBvdXIKKyAgICBjYWxsaW5nIGNvZGUgaGFzIGEgY2hhbmNlIHRvIGJpbmQgdGhlIHJldHVybmVkIHBvcnQuICBXZSBjYW4gZGVhbCB3aXRoIHRoaXMKKyAgICBpc3N1ZSBpZi93aGVuIHdlIGNvbWUgYWNyb3NzIGl0LiIiIgorICAgIHRlbXBzb2NrID0gc29ja2V0LnNvY2tldChmYW1pbHksIHNvY2t0eXBlKQorICAgIHBvcnQgPSBiaW5kX3BvcnQodGVtcHNvY2spCisgICAgdGVtcHNvY2suY2xvc2UoKQorICAgIGRlbCB0ZW1wc29jaworICAgIHJldHVybiBwb3J0CisKK2RlZiBiaW5kX3BvcnQoc29jaywgaG9zdD1IT1NUKToKKyAgICAiIiJCaW5kIHRoZSBzb2NrZXQgdG8gYSBmcmVlIHBvcnQgYW5kIHJldHVybiB0aGUgcG9ydCBudW1iZXIuICBSZWxpZXMgb24KKyAgICBlcGhlbWVyYWwgcG9ydHMgaW4gb3JkZXIgdG8gZW5zdXJlIHdlIGFyZSB1c2luZyBhbiB1bmJvdW5kIHBvcnQuICBUaGlzIGlzCisgICAgaW1wb3J0YW50IGFzIG1hbnkgdGVzdHMgbWF5IGJlIHJ1bm5pbmcgc2ltdWx0YW5lb3VzbHksIGVzcGVjaWFsbHkgaW4gYQorICAgIGJ1aWxkYm90IGVudmlyb25tZW50LiAgVGhpcyBtZXRob2QgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc29jay5mYW1pbHkKKyAgICBpcyBBRl9JTkVUIGFuZCBzb2NrLnR5cGUgaXMgU09DS19TVFJFQU0sICphbmQqIHRoZSBzb2NrZXQgaGFzIFNPX1JFVVNFQUREUgorICAgIG9yIFNPX1JFVVNFUE9SVCBzZXQgb24gaXQuICBUZXN0cyBzaG91bGQgKm5ldmVyKiBzZXQgdGhlc2Ugc29ja2V0IG9wdGlvbnMKKyAgICBmb3IgVENQL0lQIHNvY2tldHMuICBUaGUgb25seSBjYXNlIGZvciBzZXR0aW5nIHRoZXNlIG9wdGlvbnMgaXMgdGVzdGluZworICAgIG11bHRpY2FzdGluZyB2aWEgbXVsdGlwbGUgVURQIHNvY2tldHMuCisKKyAgICBBZGRpdGlvbmFsbHksIGlmIHRoZSBTT19FWENMVVNJVkVBRERSVVNFIHNvY2tldCBvcHRpb24gaXMgYXZhaWxhYmxlIChpLmUuCisgICAgb24gV2luZG93cyksIGl0IHdpbGwgYmUgc2V0IG9uIHRoZSBzb2NrZXQuICBUaGlzIHdpbGwgcHJldmVudCBhbnlvbmUgZWxzZQorICAgIGZyb20gYmluZCgpJ2luZyB0byBvdXIgaG9zdC9wb3J0IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHRlc3QuCisgICAgIiIiCisgICAgaWYgc29jay5mYW1pbHkgPT0gc29ja2V0LkFGX0lORVQgYW5kIHNvY2sudHlwZSA9PSBzb2NrZXQuU09DS19TVFJFQU06CisgICAgICAgIGlmIGhhc2F0dHIoc29ja2V0LCAnU09fUkVVU0VBRERSJyk6CisgICAgICAgICAgICBpZiBzb2NrLmdldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIpID09IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgidGVzdHMgc2hvdWxkIG5ldmVyIHNldCB0aGUgU09fUkVVU0VBRERSICIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IG9wdGlvbiBvbiBUQ1AvSVAgc29ja2V0cyEiKQorICAgICAgICBpZiBoYXNhdHRyKHNvY2tldCwgJ1NPX1JFVVNFUE9SVCcpOgorICAgICAgICAgICAgaWYgc29jay5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VQT1JUKSA9PSAxOgorICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInRlc3RzIHNob3VsZCBuZXZlciBzZXQgdGhlIFNPX1JFVVNFUE9SVCAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tldCBvcHRpb24gb24gVENQL0lQIHNvY2tldHMhIikKKyAgICAgICAgaWYgaGFzYXR0cihzb2NrZXQsICdTT19FWENMVVNJVkVBRERSVVNFJyk6CisgICAgICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19FWENMVVNJVkVBRERSVVNFLCAxKQorCisgICAgc29jay5iaW5kKChob3N0LCAwKSkKKyAgICBwb3J0ID0gc29jay5nZXRzb2NrbmFtZSgpWzFdCisgICAgcmV0dXJuIHBvcnQKKworRlVaWiA9IDFlLTYKKworZGVmIGZjbXAoeCwgeSk6ICMgZnV6enkgY29tcGFyaXNvbiBmdW5jdGlvbgorICAgIGlmIGlzaW5zdGFuY2UoeCwgZmxvYXQpIG9yIGlzaW5zdGFuY2UoeSwgZmxvYXQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmdXp6ID0gKGFicyh4KSArIGFicyh5KSkgKiBGVVpaCisgICAgICAgICAgICBpZiBhYnMoeC15KSA8PSBmdXp6OgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICBlbGlmIHR5cGUoeCkgPT0gdHlwZSh5KSBhbmQgaXNpbnN0YW5jZSh4LCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobWluKGxlbih4KSwgbGVuKHkpKSk6CisgICAgICAgICAgICBvdXRjb21lID0gZmNtcCh4W2ldLCB5W2ldKQorICAgICAgICAgICAgaWYgb3V0Y29tZSAhPSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBvdXRjb21lCisgICAgICAgIHJldHVybiAobGVuKHgpID4gbGVuKHkpKSAtIChsZW4oeCkgPCBsZW4oeSkpCisgICAgcmV0dXJuICh4ID4geSkgLSAoeCA8IHkpCisKKworIyBBIGNvbnN0YW50IGxpa2VseSBsYXJnZXIgdGhhbiB0aGUgdW5kZXJseWluZyBPUyBwaXBlIGJ1ZmZlciBzaXplLCB0bworIyBtYWtlIHdyaXRlcyBibG9ja2luZy4KKyMgV2luZG93cyBsaW1pdCBzZWVtcyB0byBiZSBhcm91bmQgNTEyIEIsIGFuZCBtYW55IFVuaXgga2VybmVscyBoYXZlIGEKKyMgNjQgS2lCIHBpcGUgYnVmZmVyIHNpemUgb3IgMTYgKiBQQUdFX1NJWkU6IHRha2UgYSBmZXcgbWVncyB0byBiZSBzdXJlLgorIyAoc2VlIGlzc3VlICMxNzgzNSBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoaXMgbnVtYmVyKS4KK1BJUEVfTUFYX1NJWkUgPSA0ICoxMDI0ICogMTAyNCArIDEKKworCit0cnk6CisgICAgdW5pY29kZQorICAgIGhhdmVfdW5pY29kZSA9IFRydWUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgaGF2ZV91bmljb2RlID0gRmFsc2UKKworaXNfanl0aG9uID0gc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKQorCisjIEZpbGVuYW1lIHVzZWQgZm9yIHRlc3RpbmcKK2lmIG9zLm5hbWUgPT0gJ2phdmEnOgorICAgICMgSnl0aG9uIGRpc2FsbG93cyBAIGluIG1vZHVsZSBuYW1lcworICAgIFRFU1RGTiA9ICckdGVzdCcKK2VsaWYgb3MubmFtZSA9PSAncmlzY29zJzoKKyAgICBURVNURk4gPSAndGVzdGZpbGUnCitlbHNlOgorICAgIFRFU1RGTiA9ICdAdGVzdCcKKyAgICAjIFVuaWNvZGUgbmFtZSBvbmx5IHVzZWQgaWYgVEVTVF9GTl9FTkNPRElORyBleGlzdHMgZm9yIHRoZSBwbGF0Zm9ybS4KKyAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICMgQXNzdW1pbmcgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpIT1zeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICAgICAgIyBURVNURk5fVU5JQ09ERSBpcyBhIGZpbGVuYW1lIHRoYXQgY2FuIGJlIGVuY29kZWQgdXNpbmcgdGhlCisgICAgICAgICMgZmlsZSBzeXN0ZW0gZW5jb2RpbmcsIGJ1dCAqbm90KiB3aXRoIHRoZSBkZWZhdWx0IChhc2NpaSkgZW5jb2RpbmcKKyAgICAgICAgaWYgaXNpbnN0YW5jZSgnJywgdW5pY29kZSk6CisgICAgICAgICAgICAjIHB5dGhvbiAtVQorICAgICAgICAgICAgIyBYWFggcGVyaGFwcyB1bmljb2RlKCkgc2hvdWxkIGFjY2VwdCBVbmljb2RlIHN0cmluZ3M/CisgICAgICAgICAgICBURVNURk5fVU5JQ09ERSA9ICJAdGVzdC1ceGUwXHhmMiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgMiBsYXRpbiBjaGFyYWN0ZXJzLgorICAgICAgICAgICAgVEVTVEZOX1VOSUNPREUgPSB1bmljb2RlKCJAdGVzdC1ceGUwXHhmMiIsICJsYXRpbi0xIikKKyAgICAgICAgVEVTVEZOX0VOQ09ESU5HID0gc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpCisgICAgICAgICMgVEVTVEZOX1VORU5DT0RBQkxFIGlzIGEgZmlsZW5hbWUgdGhhdCBzaG91bGQgKm5vdCogYmUKKyAgICAgICAgIyBhYmxlIHRvIGJlIGVuY29kZWQgYnkgKmVpdGhlciogdGhlIGRlZmF1bHQgb3IgZmlsZXN5c3RlbSBlbmNvZGluZy4KKyAgICAgICAgIyBUaGlzIHRlc3QgcmVhbGx5IG9ubHkgbWFrZXMgc2Vuc2Ugb24gV2luZG93cyBOVCBwbGF0Zm9ybXMKKyAgICAgICAgIyB3aGljaCBoYXZlIHNwZWNpYWwgVW5pY29kZSBzdXBwb3J0IGluIHBvc2l4bW9kdWxlLgorICAgICAgICBpZiAobm90IGhhc2F0dHIoc3lzLCAiZ2V0d2luZG93c3ZlcnNpb24iKSBvcgorICAgICAgICAgICAgICAgIHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpWzNdIDwgMik6ICMgIDA9d2luMzJzIG9yIDE9OXgvTUUKKyAgICAgICAgICAgIFRFU1RGTl9VTkVOQ09EQUJMRSA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgSmFwYW5lc2UgY2hhcmFjdGVycyAoSSB0aGluayAtIGZyb20gYnVnIDg0NjEzMykKKyAgICAgICAgICAgIFRFU1RGTl9VTkVOQ09EQUJMRSA9IGV2YWwoJ3UiQHRlc3QtXHU1MTcxXHU2NzA5XHUzMDU1XHUzMDhjXHUzMDhiIicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBYWFggLSBOb3RlIC0gc2hvdWxkIGJlIHVzaW5nIFRFU1RGTl9FTkNPRElORyBoZXJlIC0gYnV0IGZvcgorICAgICAgICAgICAgICAgICMgV2luZG93cywgIm1iY3MiIGN1cnJlbnRseSBhbHdheXMgb3BlcmF0ZXMgYXMgaWYgaW4KKyAgICAgICAgICAgICAgICAjIGVycm9ycz1pZ25vcmUnIG1vZGUgLSBoZW5jZSB3ZSBnZXQgJz8nIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4KKyAgICAgICAgICAgICAgICAjIHRoZSBleGNlcHRpb24uICAnTGF0aW4xJyBvcGVyYXRlcyBhcyB3ZSBleHBlY3QgLSBpZSwgZmFpbHMuCisgICAgICAgICAgICAgICAgIyBTZWUgWyA4NTA5OTcgXSBtYmNzIGVuY29kaW5nIGlnbm9yZXMgZXJyb3JzCisgICAgICAgICAgICAgICAgVEVTVEZOX1VORU5DT0RBQkxFLmVuY29kZSgiTGF0aW4xIikKKyAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCBcCisgICAgICAgICAgICAgICAgJ1dBUk5JTkc6IFRoZSBmaWxlbmFtZSAlciBDQU4gYmUgZW5jb2RlZCBieSB0aGUgZmlsZXN5c3RlbS4gICcgXAorICAgICAgICAgICAgICAgICdVbmljb2RlIGZpbGVuYW1lIHRlc3RzIG1heSBub3QgYmUgZWZmZWN0aXZlJyBcCisgICAgICAgICAgICAgICAgJSBURVNURk5fVU5FTkNPREFCTEUKKworCisjIERpc2FtYmlndWF0ZSBURVNURk4gZm9yIHBhcmFsbGVsIHRlc3RpbmcsIHdoaWxlIGxldHRpbmcgaXQgcmVtYWluIGEgdmFsaWQKKyMgbW9kdWxlIG5hbWUuCitURVNURk4gPSAie31fe31fdG1wIi5mb3JtYXQoVEVTVEZOLCBvcy5nZXRwaWQoKSkKKworIyBTYXZlIHRoZSBpbml0aWFsIGN3ZAorU0FWRURDV0QgPSBvcy5nZXRjd2QoKQorCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIHRlbXBfY3dkKG5hbWU9J3RlbXBjd2QnLCBxdWlldD1GYWxzZSk6CisgICAgIiIiCisgICAgQ29udGV4dCBtYW5hZ2VyIHRoYXQgY3JlYXRlcyBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgYW5kIHNldCBpdCBhcyBDV0QuCisKKyAgICBUaGUgbmV3IENXRCBpcyBjcmVhdGVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgaXQncyBuYW1lZCAqbmFtZSouCisgICAgSWYgKnF1aWV0KiBpcyBGYWxzZSAoZGVmYXVsdCkgYW5kIGl0J3Mgbm90IHBvc3NpYmxlIHRvIGNyZWF0ZSBvciBjaGFuZ2UKKyAgICB0aGUgQ1dELCBhbiBlcnJvciBpcyByYWlzZWQuICBJZiBpdCdzIFRydWUsIG9ubHkgYSB3YXJuaW5nIGlzIHJhaXNlZAorICAgIGFuZCB0aGUgb3JpZ2luYWwgQ1dEIGlzIHVzZWQuCisgICAgIiIiCisgICAgaWYgaGF2ZV91bmljb2RlIGFuZCBpc2luc3RhbmNlKG5hbWUsIHVuaWNvZGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lID0gbmFtZS5lbmNvZGUoc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpIG9yICdhc2NpaScpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRW5jb2RlRXJyb3I6CisgICAgICAgICAgICBpZiBub3QgcXVpZXQ6CisgICAgICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ3VuYWJsZSB0byBlbmNvZGUgdGhlIGN3ZCBuYW1lIHdpdGggJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0aGUgZmlsZXN5c3RlbSBlbmNvZGluZy4nKQorICAgIHNhdmVkX2RpciA9IG9zLmdldGN3ZCgpCisgICAgaXNfdGVtcG9yYXJ5ID0gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIG9zLm1rZGlyKG5hbWUpCisgICAgICAgIG9zLmNoZGlyKG5hbWUpCisgICAgICAgIGlzX3RlbXBvcmFyeSA9IFRydWUKKyAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgd2FybmluZ3Mud2FybigndGVzdHMgbWF5IGZhaWwsIHVuYWJsZSB0byBjaGFuZ2UgdGhlIENXRCB0byAnICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZywgc3RhY2tsZXZlbD0zKQorICAgIHRyeToKKyAgICAgICAgeWllbGQgb3MuZ2V0Y3dkKCkKKyAgICBmaW5hbGx5OgorICAgICAgICBvcy5jaGRpcihzYXZlZF9kaXIpCisgICAgICAgIGlmIGlzX3RlbXBvcmFyeToKKyAgICAgICAgICAgIHJtdHJlZShuYW1lKQorCisKK2RlZiBmaW5kZmlsZShmaWxlLCBoZXJlPV9fZmlsZV9fLCBzdWJkaXI9Tm9uZSk6CisgICAgIiIiVHJ5IHRvIGZpbmQgYSBmaWxlIG9uIHN5cy5wYXRoIGFuZCB0aGUgd29ya2luZyBkaXJlY3RvcnkuICBJZiBpdCBpcyBub3QKKyAgICBmb3VuZCB0aGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBpcyByZXR1cm5lZCAodGhpcyBkb2VzIG5vdAorICAgIG5lY2Vzc2FyaWx5IHNpZ25hbCBmYWlsdXJlOyBjb3VsZCBzdGlsbCBiZSB0aGUgbGVnaXRpbWF0ZSBwYXRoKS4iIiIKKyAgICBpZiBvcy5wYXRoLmlzYWJzKGZpbGUpOgorICAgICAgICByZXR1cm4gZmlsZQorICAgIGlmIHN1YmRpciBpcyBub3QgTm9uZToKKyAgICAgICAgZmlsZSA9IG9zLnBhdGguam9pbihzdWJkaXIsIGZpbGUpCisgICAgcGF0aCA9IHN5cy5wYXRoCisgICAgcGF0aCA9IFtvcy5wYXRoLmRpcm5hbWUoaGVyZSldICsgcGF0aAorICAgIGZvciBkbiBpbiBwYXRoOgorICAgICAgICBmbiA9IG9zLnBhdGguam9pbihkbiwgZmlsZSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZm4pOiByZXR1cm4gZm4KKyAgICByZXR1cm4gZmlsZQorCitkZWYgc29ydGRpY3QoZGljdCk6CisgICAgIkxpa2UgcmVwcihkaWN0KSwgYnV0IGluIHNvcnRlZCBvcmRlci4iCisgICAgaXRlbXMgPSBkaWN0Lml0ZW1zKCkKKyAgICBpdGVtcy5zb3J0KCkKKyAgICByZXBycGFpcnMgPSBbIiVyOiAlciIgJSBwYWlyIGZvciBwYWlyIGluIGl0ZW1zXQorICAgIHdpdGhjb21tYXMgPSAiLCAiLmpvaW4ocmVwcnBhaXJzKQorICAgIHJldHVybiAieyVzfSIgJSB3aXRoY29tbWFzCisKK2RlZiBtYWtlX2JhZF9mZCgpOgorICAgICIiIgorICAgIENyZWF0ZSBhbiBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvciBieSBvcGVuaW5nIGFuZCBjbG9zaW5nIGEgZmlsZSBhbmQgcmV0dXJuCisgICAgaXRzIGZkLgorICAgICIiIgorICAgIGZpbGUgPSBvcGVuKFRFU1RGTiwgIndiIikKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBmaWxlLmZpbGVubygpCisgICAgZmluYWxseToKKyAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIHVubGluayhURVNURk4pCisKK2RlZiBjaGVja19zeW50YXhfZXJyb3IodGVzdGNhc2UsIHN0YXRlbWVudCk6CisgICAgdGVzdGNhc2UuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCBzdGF0ZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICc8dGVzdCBzdHJpbmc+JywgJ2V4ZWMnKQorCitkZWYgb3Blbl91cmxyZXNvdXJjZSh1cmwsIGNoZWNrPU5vbmUpOgorICAgIGltcG9ydCB1cmxwYXJzZSwgdXJsbGliMgorCisgICAgZmlsZW5hbWUgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzJdLnNwbGl0KCcvJylbLTFdICMgJy8nOiBpdCdzIFVSTCEKKworICAgIGZuID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksICJkYXRhIiwgZmlsZW5hbWUpCisKKyAgICBkZWYgY2hlY2tfdmFsaWRfZmlsZShmbik6CisgICAgICAgIGYgPSBvcGVuKGZuKQorICAgICAgICBpZiBjaGVjayBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgZWxpZiBjaGVjayhmKToKKyAgICAgICAgICAgIGYuc2VlaygwKQorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbik6CisgICAgICAgIGYgPSBjaGVja192YWxpZF9maWxlKGZuKQorICAgICAgICBpZiBmIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGYKKyAgICAgICAgdW5saW5rKGZuKQorCisgICAgIyBWZXJpZnkgdGhlIHJlcXVpcmVtZW50IGJlZm9yZSBkb3dubG9hZGluZyB0aGUgZmlsZQorICAgIHJlcXVpcmVzKCd1cmxmZXRjaCcpCisKKyAgICBwcmludCA+PiBnZXRfb3JpZ2luYWxfc3Rkb3V0KCksICdcdGZldGNoaW5nICVzIC4uLicgJSB1cmwKKyAgICBmID0gdXJsbGliMi51cmxvcGVuKHVybCwgdGltZW91dD0xNSkKKyAgICB0cnk6CisgICAgICAgIHdpdGggb3BlbihmbiwgIndiIikgYXMgb3V0OgorICAgICAgICAgICAgcyA9IGYucmVhZCgpCisgICAgICAgICAgICB3aGlsZSBzOgorICAgICAgICAgICAgICAgIG91dC53cml0ZShzKQorICAgICAgICAgICAgICAgIHMgPSBmLnJlYWQoKQorICAgIGZpbmFsbHk6CisgICAgICAgIGYuY2xvc2UoKQorCisgICAgZiA9IGNoZWNrX3ZhbGlkX2ZpbGUoZm4pCisgICAgaWYgZiBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIGYKKyAgICByYWlzZSBUZXN0RmFpbGVkKCdpbnZhbGlkIHJlc291cmNlICIlcyInICUgZm4pCisKKworY2xhc3MgV2FybmluZ3NSZWNvcmRlcihvYmplY3QpOgorICAgICIiIkNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIHRoZSB3YXJuaW5ncyBsaXN0IHJldHVybmVkIG9uCisgICAgICAgZW50cnkgdG8gdGhlIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCkgY29udGV4dCBtYW5hZ2VyLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3YXJuaW5nc19saXN0KToKKyAgICAgICAgc2VsZi5fd2FybmluZ3MgPSB3YXJuaW5nc19saXN0CisgICAgICAgIHNlbGYuX2xhc3QgPSAwCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGxlbihzZWxmLl93YXJuaW5ncykgPiBzZWxmLl9sYXN0OgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fd2FybmluZ3NbLTFdLCBhdHRyKQorICAgICAgICBlbGlmIGF0dHIgaW4gd2FybmluZ3MuV2FybmluZ01lc3NhZ2UuX1dBUk5JTkdfREVUQUlMUzoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCIlciBoYXMgbm8gYXR0cmlidXRlICVyIiAlIChzZWxmLCBhdHRyKSkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiB3YXJuaW5ncyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3dhcm5pbmdzW3NlbGYuX2xhc3Q6XQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLl9sYXN0ID0gbGVuKHNlbGYuX3dhcm5pbmdzKQorCisKK2RlZiBfZmlsdGVyd2FybmluZ3MoZmlsdGVycywgcXVpZXQ9RmFsc2UpOgorICAgICIiIkNhdGNoIHRoZSB3YXJuaW5ncywgdGhlbiBjaGVjayBpZiBhbGwgdGhlIGV4cGVjdGVkCisgICAgd2FybmluZ3MgaGF2ZSBiZWVuIHJhaXNlZCBhbmQgcmUtcmFpc2UgdW5leHBlY3RlZCB3YXJuaW5ncy4KKyAgICBJZiAncXVpZXQnIGlzIFRydWUsIG9ubHkgcmUtcmFpc2UgdGhlIHVuZXhwZWN0ZWQgd2FybmluZ3MuCisgICAgIiIiCisgICAgIyBDbGVhciB0aGUgd2FybmluZyByZWdpc3RyeSBvZiB0aGUgY2FsbGluZyBtb2R1bGUKKyAgICAjIGluIG9yZGVyIHRvIHJlLXJhaXNlIHRoZSB3YXJuaW5ncy4KKyAgICBmcmFtZSA9IHN5cy5fZ2V0ZnJhbWUoMikKKyAgICByZWdpc3RyeSA9IGZyYW1lLmZfZ2xvYmFscy5nZXQoJ19fd2FybmluZ3JlZ2lzdHJ5X18nKQorICAgIGlmIHJlZ2lzdHJ5OgorICAgICAgICByZWdpc3RyeS5jbGVhcigpCisgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSkgYXMgdzoKKyAgICAgICAgIyBTZXQgZmlsdGVyICJhbHdheXMiIHRvIHJlY29yZCBhbGwgd2FybmluZ3MuICBCZWNhdXNlCisgICAgICAgICMgdGVzdF93YXJuaW5ncyBzd2FwIHRoZSBtb2R1bGUsIHdlIG5lZWQgdG8gbG9vayB1cCBpbgorICAgICAgICAjIHRoZSBzeXMubW9kdWxlcyBkaWN0aW9uYXJ5LgorICAgICAgICBzeXMubW9kdWxlc1snd2FybmluZ3MnXS5zaW1wbGVmaWx0ZXIoImFsd2F5cyIpCisgICAgICAgIHlpZWxkIFdhcm5pbmdzUmVjb3JkZXIodykKKyAgICAjIEZpbHRlciB0aGUgcmVjb3JkZWQgd2FybmluZ3MKKyAgICByZXJhaXNlID0gW3dhcm5pbmcubWVzc2FnZSBmb3Igd2FybmluZyBpbiB3XQorICAgIG1pc3NpbmcgPSBbXQorICAgIGZvciBtc2csIGNhdCBpbiBmaWx0ZXJzOgorICAgICAgICBzZWVuID0gRmFsc2UKKyAgICAgICAgZm9yIGV4YyBpbiByZXJhaXNlWzpdOgorICAgICAgICAgICAgbWVzc2FnZSA9IHN0cihleGMpCisgICAgICAgICAgICAjIEZpbHRlciBvdXQgdGhlIG1hdGNoaW5nIG1lc3NhZ2VzCisgICAgICAgICAgICBpZiAocmUubWF0Y2gobXNnLCBtZXNzYWdlLCByZS5JKSBhbmQKKyAgICAgICAgICAgICAgICBpc3N1YmNsYXNzKGV4Yy5fX2NsYXNzX18sIGNhdCkpOgorICAgICAgICAgICAgICAgIHNlZW4gPSBUcnVlCisgICAgICAgICAgICAgICAgcmVyYWlzZS5yZW1vdmUoZXhjKQorICAgICAgICBpZiBub3Qgc2VlbiBhbmQgbm90IHF1aWV0OgorICAgICAgICAgICAgIyBUaGlzIGZpbHRlciBjYXVnaHQgbm90aGluZworICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQoKG1zZywgY2F0Ll9fbmFtZV9fKSkKKyAgICBpZiByZXJhaXNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigidW5oYW5kbGVkIHdhcm5pbmcgJXIiICUgcmVyYWlzZVswXSkKKyAgICBpZiBtaXNzaW5nOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiZmlsdGVyICglciwgJXMpIGRpZCBub3QgY2F0Y2ggYW55IHdhcm5pbmciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1swXSkKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIGNoZWNrX3dhcm5pbmdzKCpmaWx0ZXJzLCAqKmt3YXJncyk6CisgICAgIiIiQ29udGV4dCBtYW5hZ2VyIHRvIHNpbGVuY2Ugd2FybmluZ3MuCisKKyAgICBBY2NlcHQgMi10dXBsZXMgYXMgcG9zaXRpb25hbCBhcmd1bWVudHM6CisgICAgICAgICgibWVzc2FnZSByZWdleHAiLCBXYXJuaW5nQ2F0ZWdvcnkpCisKKyAgICBPcHRpb25hbCBhcmd1bWVudDoKKyAgICAgLSBpZiAncXVpZXQnIGlzIFRydWUsIGl0IGRvZXMgbm90IGZhaWwgaWYgYSBmaWx0ZXIgY2F0Y2hlcyBub3RoaW5nCisgICAgICAgIChkZWZhdWx0IFRydWUgd2l0aG91dCBhcmd1bWVudCwKKyAgICAgICAgIGRlZmF1bHQgRmFsc2UgaWYgc29tZSBmaWx0ZXJzIGFyZSBkZWZpbmVkKQorCisgICAgV2l0aG91dCBhcmd1bWVudCwgaXQgZGVmYXVsdHMgdG86CisgICAgICAgIGNoZWNrX3dhcm5pbmdzKCgiIiwgV2FybmluZyksIHF1aWV0PVRydWUpCisgICAgIiIiCisgICAgcXVpZXQgPSBrd2FyZ3MuZ2V0KCdxdWlldCcpCisgICAgaWYgbm90IGZpbHRlcnM6CisgICAgICAgIGZpbHRlcnMgPSAoKCIiLCBXYXJuaW5nKSwpCisgICAgICAgICMgUHJlc2VydmUgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICAgICBpZiBxdWlldCBpcyBOb25lOgorICAgICAgICAgICAgcXVpZXQgPSBUcnVlCisgICAgcmV0dXJuIF9maWx0ZXJ3YXJuaW5ncyhmaWx0ZXJzLCBxdWlldCkKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIGNoZWNrX3B5M2tfd2FybmluZ3MoKmZpbHRlcnMsICoqa3dhcmdzKToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gc2lsZW5jZSBweTNrIHdhcm5pbmdzLgorCisgICAgQWNjZXB0IDItdHVwbGVzIGFzIHBvc2l0aW9uYWwgYXJndW1lbnRzOgorICAgICAgICAoIm1lc3NhZ2UgcmVnZXhwIiwgV2FybmluZ0NhdGVnb3J5KQorCisgICAgT3B0aW9uYWwgYXJndW1lbnQ6CisgICAgIC0gaWYgJ3F1aWV0JyBpcyBUcnVlLCBpdCBkb2VzIG5vdCBmYWlsIGlmIGEgZmlsdGVyIGNhdGNoZXMgbm90aGluZworICAgICAgICAoZGVmYXVsdCBGYWxzZSkKKworICAgIFdpdGhvdXQgYXJndW1lbnQsIGl0IGRlZmF1bHRzIHRvOgorICAgICAgICBjaGVja19weTNrX3dhcm5pbmdzKCgiIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwgcXVpZXQ9RmFsc2UpCisgICAgIiIiCisgICAgaWYgc3lzLnB5M2t3YXJuaW5nOgorICAgICAgICBpZiBub3QgZmlsdGVyczoKKyAgICAgICAgICAgIGZpbHRlcnMgPSAoKCIiLCBEZXByZWNhdGlvbldhcm5pbmcpLCkKKyAgICBlbHNlOgorICAgICAgICAjIEl0IHNob3VsZCBub3QgcmFpc2UgYW55IHB5M2sgd2FybmluZworICAgICAgICBmaWx0ZXJzID0gKCkKKyAgICByZXR1cm4gX2ZpbHRlcndhcm5pbmdzKGZpbHRlcnMsIGt3YXJncy5nZXQoJ3F1aWV0JykpCisKKworY2xhc3MgQ2xlYW5JbXBvcnQob2JqZWN0KToKKyAgICAiIiJDb250ZXh0IG1hbmFnZXIgdG8gZm9yY2UgaW1wb3J0IHRvIHJldHVybiBhIG5ldyBtb2R1bGUgcmVmZXJlbmNlLgorCisgICAgVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgbW9kdWxlLWxldmVsIGJlaGF2aW91cnMsIHN1Y2ggYXMKKyAgICB0aGUgZW1pc3Npb24gb2YgYSBEZXByZWNhdGlvbldhcm5pbmcgb24gaW1wb3J0LgorCisgICAgVXNlIGxpa2UgdGhpczoKKworICAgICAgICB3aXRoIENsZWFuSW1wb3J0KCJmb28iKToKKyAgICAgICAgICAgIGltcG9ydGxpYi5pbXBvcnRfbW9kdWxlKCJmb28iKSAjIG5ldyByZWZlcmVuY2UKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqbW9kdWxlX25hbWVzKToKKyAgICAgICAgc2VsZi5vcmlnaW5hbF9tb2R1bGVzID0gc3lzLm1vZHVsZXMuY29weSgpCisgICAgICAgIGZvciBtb2R1bGVfbmFtZSBpbiBtb2R1bGVfbmFtZXM6CisgICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2R1bGVfbmFtZV0KKyAgICAgICAgICAgICAgICAjIEl0IGlzIHBvc3NpYmxlIHRoYXQgbW9kdWxlX25hbWUgaXMganVzdCBhbiBhbGlhcyBmb3IKKyAgICAgICAgICAgICAgICAjIGFub3RoZXIgbW9kdWxlIChlLmcuIHN0dWIgZm9yIG1vZHVsZXMgcmVuYW1lZCBpbiAzLngpLgorICAgICAgICAgICAgICAgICMgSW4gdGhhdCBjYXNlLCB3ZSBhbHNvIG5lZWQgZGVsZXRlIHRoZSByZWFsIG1vZHVsZSB0byBjbGVhcgorICAgICAgICAgICAgICAgICMgdGhlIGltcG9ydCBjYWNoZS4KKyAgICAgICAgICAgICAgICBpZiBtb2R1bGUuX19uYW1lX18gIT0gbW9kdWxlX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1ttb2R1bGUuX19uYW1lX19dCisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqaWdub3JlX2V4Yyk6CisgICAgICAgIHN5cy5tb2R1bGVzLnVwZGF0ZShzZWxmLm9yaWdpbmFsX21vZHVsZXMpCisKKworY2xhc3MgRW52aXJvbm1lbnRWYXJHdWFyZChVc2VyRGljdC5EaWN0TWl4aW4pOgorCisgICAgIiIiQ2xhc3MgdG8gaGVscCBwcm90ZWN0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBwcm9wZXJseS4gIENhbiBiZSB1c2VkIGFzCisgICAgYSBjb250ZXh0IG1hbmFnZXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2Vudmlyb24gPSBvcy5lbnZpcm9uCisgICAgICAgIHNlbGYuX2NoYW5nZWQgPSB7fQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGVudnZhcik6CisgICAgICAgIHJldHVybiBzZWxmLl9lbnZpcm9uW2VudnZhcl0KKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBlbnZ2YXIsIHZhbHVlKToKKyAgICAgICAgIyBSZW1lbWJlciB0aGUgaW5pdGlhbCB2YWx1ZSBvbiB0aGUgZmlyc3QgYWNjZXNzCisgICAgICAgIGlmIGVudnZhciBub3QgaW4gc2VsZi5fY2hhbmdlZDoKKyAgICAgICAgICAgIHNlbGYuX2NoYW5nZWRbZW52dmFyXSA9IHNlbGYuX2Vudmlyb24uZ2V0KGVudnZhcikKKyAgICAgICAgc2VsZi5fZW52aXJvbltlbnZ2YXJdID0gdmFsdWUKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBlbnZ2YXIpOgorICAgICAgICAjIFJlbWVtYmVyIHRoZSBpbml0aWFsIHZhbHVlIG9uIHRoZSBmaXJzdCBhY2Nlc3MKKyAgICAgICAgaWYgZW52dmFyIG5vdCBpbiBzZWxmLl9jaGFuZ2VkOgorICAgICAgICAgICAgc2VsZi5fY2hhbmdlZFtlbnZ2YXJdID0gc2VsZi5fZW52aXJvbi5nZXQoZW52dmFyKQorICAgICAgICBpZiBlbnZ2YXIgaW4gc2VsZi5fZW52aXJvbjoKKyAgICAgICAgICAgIGRlbCBzZWxmLl9lbnZpcm9uW2VudnZhcl0KKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZW52aXJvbi5rZXlzKCkKKworICAgIGRlZiBzZXQoc2VsZiwgZW52dmFyLCB2YWx1ZSk6CisgICAgICAgIHNlbGZbZW52dmFyXSA9IHZhbHVlCisKKyAgICBkZWYgdW5zZXQoc2VsZiwgZW52dmFyKToKKyAgICAgICAgZGVsIHNlbGZbZW52dmFyXQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqaWdub3JlX2V4Yyk6CisgICAgICAgIGZvciAoaywgdikgaW4gc2VsZi5fY2hhbmdlZC5pdGVtcygpOgorICAgICAgICAgICAgaWYgdiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIGsgaW4gc2VsZi5fZW52aXJvbjoKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuX2Vudmlyb25ba10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZW52aXJvbltrXSA9IHYKKyAgICAgICAgb3MuZW52aXJvbiA9IHNlbGYuX2Vudmlyb24KKworCitjbGFzcyBEaXJzT25TeXNQYXRoKG9iamVjdCk6CisgICAgIiIiQ29udGV4dCBtYW5hZ2VyIHRvIHRlbXBvcmFyaWx5IGFkZCBkaXJlY3RvcmllcyB0byBzeXMucGF0aC4KKworICAgIFRoaXMgbWFrZXMgYSBjb3B5IG9mIHN5cy5wYXRoLCBhcHBlbmRzIGFueSBkaXJlY3RvcmllcyBnaXZlbgorICAgIGFzIHBvc2l0aW9uYWwgYXJndW1lbnRzLCB0aGVuIHJldmVydHMgc3lzLnBhdGggdG8gdGhlIGNvcGllZAorICAgIHNldHRpbmdzIHdoZW4gdGhlIGNvbnRleHQgZW5kcy4KKworICAgIE5vdGUgdGhhdCAqYWxsKiBzeXMucGF0aCBtb2RpZmljYXRpb25zIGluIHRoZSBib2R5IG9mIHRoZQorICAgIGNvbnRleHQgbWFuYWdlciwgaW5jbHVkaW5nIHJlcGxhY2VtZW50IG9mIHRoZSBvYmplY3QsCisgICAgd2lsbCBiZSByZXZlcnRlZCBhdCB0aGUgZW5kIG9mIHRoZSBibG9jay4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqcGF0aHMpOgorICAgICAgICBzZWxmLm9yaWdpbmFsX3ZhbHVlID0gc3lzLnBhdGhbOl0KKyAgICAgICAgc2VsZi5vcmlnaW5hbF9vYmplY3QgPSBzeXMucGF0aAorICAgICAgICBzeXMucGF0aC5leHRlbmQocGF0aHMpCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICppZ25vcmVfZXhjKToKKyAgICAgICAgc3lzLnBhdGggPSBzZWxmLm9yaWdpbmFsX29iamVjdAorICAgICAgICBzeXMucGF0aFs6XSA9IHNlbGYub3JpZ2luYWxfdmFsdWUKKworCitjbGFzcyBUcmFuc2llbnRSZXNvdXJjZShvYmplY3QpOgorCisgICAgIiIiUmFpc2UgUmVzb3VyY2VEZW5pZWQgaWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGlsZSB0aGUgY29udGV4dCBtYW5hZ2VyCisgICAgaXMgaW4gZWZmZWN0IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGV4Y2VwdGlvbiBhbmQgYXR0cmlidXRlcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleGMsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi5leGMgPSBleGMKKyAgICAgICAgc2VsZi5hdHRycyA9IGt3YXJncworCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlXz1Ob25lLCB2YWx1ZT1Ob25lLCB0cmFjZWJhY2s9Tm9uZSk6CisgICAgICAgICIiIklmIHR5cGVfIGlzIGEgc3ViY2xhc3Mgb2Ygc2VsZi5leGMgYW5kIHZhbHVlIGhhcyBhdHRyaWJ1dGVzIG1hdGNoaW5nCisgICAgICAgIHNlbGYuYXR0cnMsIHJhaXNlIFJlc291cmNlRGVuaWVkLiAgT3RoZXJ3aXNlIGxldCB0aGUgZXhjZXB0aW9uCisgICAgICAgIHByb3BhZ2F0ZSAoaWYgYW55KS4iIiIKKyAgICAgICAgaWYgdHlwZV8gaXMgbm90IE5vbmUgYW5kIGlzc3ViY2xhc3Moc2VsZi5leGMsIHR5cGVfKToKKyAgICAgICAgICAgIGZvciBhdHRyLCBhdHRyX3ZhbHVlIGluIHNlbGYuYXR0cnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIodmFsdWUsIGF0dHIpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGdldGF0dHIodmFsdWUsIGF0dHIpICE9IGF0dHJfdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFJlc291cmNlRGVuaWVkKCJhbiBvcHRpb25hbCByZXNvdXJjZSBpcyBub3QgYXZhaWxhYmxlIikKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIHRyYW5zaWVudF9pbnRlcm5ldChyZXNvdXJjZV9uYW1lLCB0aW1lb3V0PTMwLjAsIGVycm5vcz0oKSk6CisgICAgIiIiUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHRoYXQgcmFpc2VzIFJlc291cmNlRGVuaWVkIHdoZW4gdmFyaW91cyBpc3N1ZXMKKyAgICB3aXRoIHRoZSBJbnRlcm5ldCBjb25uZWN0aW9uIG1hbmlmZXN0IHRoZW1zZWx2ZXMgYXMgZXhjZXB0aW9ucy4iIiIKKyAgICBkZWZhdWx0X2Vycm5vcyA9IFsKKyAgICAgICAgKCdFQ09OTlJFRlVTRUQnLCAxMTEpLAorICAgICAgICAoJ0VDT05OUkVTRVQnLCAxMDQpLAorICAgICAgICAoJ0VIT1NUVU5SRUFDSCcsIDExMyksCisgICAgICAgICgnRU5FVFVOUkVBQ0gnLCAxMDEpLAorICAgICAgICAoJ0VUSU1FRE9VVCcsIDExMCksCisgICAgXQorICAgIGRlZmF1bHRfZ2FpX2Vycm5vcyA9IFsKKyAgICAgICAgKCdFQUlfQUdBSU4nLCAtMyksCisgICAgICAgICgnRUFJX0ZBSUwnLCAtNCksCisgICAgICAgICgnRUFJX05PTkFNRScsIC0yKSwKKyAgICAgICAgKCdFQUlfTk9EQVRBJywgLTUpLAorICAgICAgICAjIFdpbmRvd3MgZGVmaW5lcyBFQUlfTk9EQVRBIGFzIDExMDAxIGJ1dCBpZGlvdGljIGdldGFkZHJpbmZvKCkKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBhY3R1YWxseSByZXR1cm5zIFdTQU5PX0RBVEEgaS5lLiAxMTAwNC4KKyAgICAgICAgKCdXU0FOT19EQVRBJywgMTEwMDQpLAorICAgIF0KKworICAgIGRlbmllZCA9IFJlc291cmNlRGVuaWVkKCJSZXNvdXJjZSAnJXMnIGlzIG5vdCBhdmFpbGFibGUiICUgcmVzb3VyY2VfbmFtZSkKKyAgICBjYXB0dXJlZF9lcnJub3MgPSBlcnJub3MKKyAgICBnYWlfZXJybm9zID0gW10KKyAgICBpZiBub3QgY2FwdHVyZWRfZXJybm9zOgorICAgICAgICBjYXB0dXJlZF9lcnJub3MgPSBbZ2V0YXR0cihlcnJubywgbmFtZSwgbnVtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChuYW1lLCBudW0pIGluIGRlZmF1bHRfZXJybm9zXQorICAgICAgICBnYWlfZXJybm9zID0gW2dldGF0dHIoc29ja2V0LCBuYW1lLCBudW0pCisgICAgICAgICAgICAgICAgICAgICAgZm9yIChuYW1lLCBudW0pIGluIGRlZmF1bHRfZ2FpX2Vycm5vc10KKworICAgIGRlZiBmaWx0ZXJfZXJyb3IoZXJyKToKKyAgICAgICAgbiA9IGdldGF0dHIoZXJyLCAnZXJybm8nLCBOb25lKQorICAgICAgICBpZiAoaXNpbnN0YW5jZShlcnIsIHNvY2tldC50aW1lb3V0KSBvcgorICAgICAgICAgICAgKGlzaW5zdGFuY2UoZXJyLCBzb2NrZXQuZ2FpZXJyb3IpIGFuZCBuIGluIGdhaV9lcnJub3MpIG9yCisgICAgICAgICAgICBuIGluIGNhcHR1cmVkX2Vycm5vcyk6CisgICAgICAgICAgICBpZiBub3QgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKGRlbmllZC5hcmdzWzBdICsgIlxuIikKKyAgICAgICAgICAgIHJhaXNlIGRlbmllZAorCisgICAgb2xkX3RpbWVvdXQgPSBzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKQorICAgIHRyeToKKyAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCh0aW1lb3V0KQorICAgICAgICB5aWVsZAorICAgIGV4Y2VwdCBJT0Vycm9yIGFzIGVycjoKKyAgICAgICAgIyB1cmxsaWIgY2FuIHdyYXAgb3JpZ2luYWwgc29ja2V0IGVycm9ycyBtdWx0aXBsZSB0aW1lcyAoISksIHdlIG11c3QKKyAgICAgICAgIyB1bndyYXAgdG8gZ2V0IGF0IHRoZSBvcmlnaW5hbCBlcnJvci4KKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGEgPSBlcnIuYXJncworICAgICAgICAgICAgaWYgbGVuKGEpID49IDEgYW5kIGlzaW5zdGFuY2UoYVswXSwgSU9FcnJvcik6CisgICAgICAgICAgICAgICAgZXJyID0gYVswXQorICAgICAgICAgICAgIyBUaGUgZXJyb3IgY2FuIGFsc28gYmUgd3JhcHBlZCBhcyBhcmdzWzFdOgorICAgICAgICAgICAgIyAgICBleGNlcHQgc29ja2V0LmVycm9yIGFzIG1zZzoKKyAgICAgICAgICAgICMgICAgICAgIHJhaXNlIElPRXJyb3IoJ3NvY2tldCBlcnJvcicsIG1zZykud2l0aF90cmFjZWJhY2soc3lzLmV4Y19pbmZvKClbMl0pCisgICAgICAgICAgICBlbGlmIGxlbihhKSA+PSAyIGFuZCBpc2luc3RhbmNlKGFbMV0sIElPRXJyb3IpOgorICAgICAgICAgICAgICAgIGVyciA9IGFbMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZmlsdGVyX2Vycm9yKGVycikKKyAgICAgICAgcmFpc2UKKyAgICAjIFhYWCBzaG91bGQgd2UgY2F0Y2ggZ2VuZXJpYyBleGNlcHRpb25zIGFuZCBsb29rIGZvciB0aGVpcgorICAgICMgX19jYXVzZV9fIG9yIF9fY29udGV4dF9fPworICAgIGZpbmFsbHk6CisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChvbGRfdGltZW91dCkKKworCitAY29udGV4dGxpYi5jb250ZXh0bWFuYWdlcgorZGVmIGNhcHR1cmVkX291dHB1dChzdHJlYW1fbmFtZSk6CisgICAgIiIiUmV0dXJuIGEgY29udGV4dCBtYW5hZ2VyIHVzZWQgYnkgY2FwdHVyZWRfc3Rkb3V0IGFuZCBjYXB0dXJlZF9zdGRpbgorICAgIHRoYXQgdGVtcG9yYXJpbHkgcmVwbGFjZXMgdGhlIHN5cyBzdHJlYW0gKnN0cmVhbV9uYW1lKiB3aXRoIGEgU3RyaW5nSU8uIiIiCisgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgb3JpZ19zdGRvdXQgPSBnZXRhdHRyKHN5cywgc3RyZWFtX25hbWUpCisgICAgc2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lLCBTdHJpbmdJTy5TdHJpbmdJTygpKQorICAgIHRyeToKKyAgICAgICAgeWllbGQgZ2V0YXR0cihzeXMsIHN0cmVhbV9uYW1lKQorICAgIGZpbmFsbHk6CisgICAgICAgIHNldGF0dHIoc3lzLCBzdHJlYW1fbmFtZSwgb3JpZ19zdGRvdXQpCisKK2RlZiBjYXB0dXJlZF9zdGRvdXQoKToKKyAgICAiIiJDYXB0dXJlIHRoZSBvdXRwdXQgb2Ygc3lzLnN0ZG91dDoKKworICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgczoKKyAgICAgICAgICAgcHJpbnQgImhlbGxvIgorICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiaGVsbG8iKQorICAgICIiIgorICAgIHJldHVybiBjYXB0dXJlZF9vdXRwdXQoInN0ZG91dCIpCisKK2RlZiBjYXB0dXJlZF9zdGRlcnIoKToKKyAgICByZXR1cm4gY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKQorCitkZWYgY2FwdHVyZWRfc3RkaW4oKToKKyAgICByZXR1cm4gY2FwdHVyZWRfb3V0cHV0KCJzdGRpbiIpCisKK2RlZiBnY19jb2xsZWN0KCk6CisgICAgIiIiRm9yY2UgYXMgbWFueSBvYmplY3RzIGFzIHBvc3NpYmxlIHRvIGJlIGNvbGxlY3RlZC4KKworICAgIEluIG5vbi1DUHl0aG9uIGltcGxlbWVudGF0aW9ucyBvZiBQeXRob24sIHRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGltZWx5CisgICAgZGVhbGxvY2F0aW9uIGlzIG5vdCBndWFyYW50ZWVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIChFdmVuIGluIENQeXRob24KKyAgICB0aGlzIGNhbiBiZSB0aGUgY2FzZSBpbiBjYXNlIG9mIHJlZmVyZW5jZSBjeWNsZXMuKSAgVGhpcyBtZWFucyB0aGF0IF9fZGVsX18KKyAgICBtZXRob2RzIG1heSBiZSBjYWxsZWQgbGF0ZXIgdGhhbiBleHBlY3RlZCBhbmQgd2Vha3JlZnMgbWF5IHJlbWFpbiBhbGl2ZSBmb3IKKyAgICBsb25nZXIgdGhhbiBleHBlY3RlZC4gIFRoaXMgZnVuY3Rpb24gdHJpZXMgaXRzIGJlc3QgdG8gZm9yY2UgYWxsIGdhcmJhZ2UKKyAgICBvYmplY3RzIHRvIGRpc2FwcGVhci4KKyAgICAiIiIKKyAgICBnYy5jb2xsZWN0KCkKKyAgICBpZiBpc19qeXRob246CisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorICAgIGdjLmNvbGxlY3QoKQorICAgIGdjLmNvbGxlY3QoKQorCisKK19oZWFkZXIgPSAnMlAnCitpZiBoYXNhdHRyKHN5cywgImdldHRvdGFscmVmY291bnQiKToKKyAgICBfaGVhZGVyID0gJzJQJyArIF9oZWFkZXIKK192aGVhZGVyID0gX2hlYWRlciArICdQJworCitkZWYgY2FsY29ianNpemUoZm10KToKKyAgICByZXR1cm4gc3RydWN0LmNhbGNzaXplKF9oZWFkZXIgKyBmbXQgKyAnMFAnKQorCitkZWYgY2FsY3ZvYmpzaXplKGZtdCk6CisgICAgcmV0dXJuIHN0cnVjdC5jYWxjc2l6ZShfdmhlYWRlciArIGZtdCArICcwUCcpCisKKworX1RQRkxBR1NfSEFWRV9HQyA9IDE8PDE0CitfVFBGTEFHU19IRUFQVFlQRSA9IDE8PDkKKworZGVmIGNoZWNrX3NpemVvZih0ZXN0LCBvLCBzaXplKToKKyAgICByZXN1bHQgPSBzeXMuZ2V0c2l6ZW9mKG8pCisgICAgIyBhZGQgR0MgaGVhZGVyIHNpemUKKyAgICBpZiAoKHR5cGUobykgPT0gdHlwZSkgYW5kIChvLl9fZmxhZ3NfXyAmIF9UUEZMQUdTX0hFQVBUWVBFKSBvclwKKyAgICAgICAgKCh0eXBlKG8pICE9IHR5cGUpIGFuZCAodHlwZShvKS5fX2ZsYWdzX18gJiBfVFBGTEFHU19IQVZFX0dDKSkpOgorICAgICAgICBzaXplICs9IF90ZXN0Y2FwaS5TSVpFT0ZfUFlHQ19IRUFECisgICAgbXNnID0gJ3dyb25nIHNpemUgZm9yICVzOiBnb3QgJWQsIGV4cGVjdGVkICVkJyBcCisgICAgICAgICAgICAlICh0eXBlKG8pLCByZXN1bHQsIHNpemUpCisgICAgdGVzdC5hc3NlcnRFcXVhbChyZXN1bHQsIHNpemUsIG1zZykKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRGVjb3JhdG9yIGZvciBydW5uaW5nIGEgZnVuY3Rpb24gaW4gYSBkaWZmZXJlbnQgbG9jYWxlLCBjb3JyZWN0bHkgcmVzZXR0aW5nCisjIGl0IGFmdGVyd2FyZHMuCisKK2RlZiBydW5fd2l0aF9sb2NhbGUoY2F0c3RyLCAqbG9jYWxlcyk6CisgICAgZGVmIGRlY29yYXRvcihmdW5jKToKKyAgICAgICAgZGVmIGlubmVyKCphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBsb2NhbGUKKyAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IGdldGF0dHIobG9jYWxlLCBjYXRzdHIpCisgICAgICAgICAgICAgICAgb3JpZ19sb2NhbGUgPSBsb2NhbGUuc2V0bG9jYWxlKGNhdGVnb3J5KQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgaWYgdGhlIHRlc3QgYXV0aG9yIGdpdmVzIHVzIGFuIGludmFsaWQgY2F0ZWdvcnkgc3RyaW5nCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIGNhbm5vdCByZXRyaWV2ZSBvcmlnaW5hbCBsb2NhbGUsIHNvIGRvIG5vdGhpbmcKKyAgICAgICAgICAgICAgICBsb2NhbGUgPSBvcmlnX2xvY2FsZSA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZm9yIGxvYyBpbiBsb2NhbGVzOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGNhdGVnb3J5LCBsb2MpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICMgbm93IHJ1biB0aGUgZnVuY3Rpb24sIHJlc2V0dGluZyB0aGUgbG9jYWxlIG9uIGV4Y2VwdGlvbnMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKiprd2RzKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBsb2NhbGUgYW5kIG9yaWdfbG9jYWxlOgorICAgICAgICAgICAgICAgICAgICBsb2NhbGUuc2V0bG9jYWxlKGNhdGVnb3J5LCBvcmlnX2xvY2FsZSkKKyAgICAgICAgaW5uZXIuZnVuY19uYW1lID0gZnVuYy5mdW5jX25hbWUKKyAgICAgICAgaW5uZXIuX19kb2NfXyA9IGZ1bmMuX19kb2NfXworICAgICAgICByZXR1cm4gaW5uZXIKKyAgICByZXR1cm4gZGVjb3JhdG9yCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCaWctbWVtb3J5LXRlc3Qgc3VwcG9ydC4gU2VwYXJhdGUgZnJvbSAncmVzb3VyY2VzJyBiZWNhdXNlIG1lbW9yeSB1c2Ugc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZS4KKworIyBTb21lIGhhbmR5IHNob3J0aGFuZHMuIE5vdGUgdGhhdCB0aGVzZSBhcmUgdXNlZCBmb3IgYnl0ZS1saW1pdHMgYXMgd2VsbAorIyBhcyBzaXplLWxpbWl0cywgaW4gdGhlIHZhcmlvdXMgYmlnbWVtIHRlc3RzCitfMU0gPSAxMDI0KjEwMjQKK18xRyA9IDEwMjQgKiBfMU0KK18yRyA9IDIgKiBfMUcKK180RyA9IDQgKiBfMUcKKworTUFYX1B5X3NzaXplX3QgPSBzeXMubWF4c2l6ZQorCitkZWYgc2V0X21lbWxpbWl0KGxpbWl0KToKKyAgICBnbG9iYWwgbWF4X21lbXVzZQorICAgIGdsb2JhbCByZWFsX21heF9tZW11c2UKKyAgICBzaXplcyA9IHsKKyAgICAgICAgJ2snOiAxMDI0LAorICAgICAgICAnbSc6IF8xTSwKKyAgICAgICAgJ2cnOiBfMUcsCisgICAgICAgICd0JzogMTAyNCpfMUcsCisgICAgfQorICAgIG0gPSByZS5tYXRjaChyJyhcZCsoXC5cZCspPykgKEt8TXxHfFQpYj8kJywgbGltaXQsCisgICAgICAgICAgICAgICAgIHJlLklHTk9SRUNBU0UgfCByZS5WRVJCT1NFKQorICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignSW52YWxpZCBtZW1vcnkgbGltaXQgJXInICUgKGxpbWl0LCkpCisgICAgbWVtbGltaXQgPSBpbnQoZmxvYXQobS5ncm91cCgxKSkgKiBzaXplc1ttLmdyb3VwKDMpLmxvd2VyKCldKQorICAgIHJlYWxfbWF4X21lbXVzZSA9IG1lbWxpbWl0CisgICAgaWYgbWVtbGltaXQgPiBNQVhfUHlfc3NpemVfdDoKKyAgICAgICAgbWVtbGltaXQgPSBNQVhfUHlfc3NpemVfdAorICAgIGlmIG1lbWxpbWl0IDwgXzJHIC0gMToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTWVtb3J5IGxpbWl0ICVyIHRvbyBsb3cgdG8gYmUgdXNlZnVsJyAlIChsaW1pdCwpKQorICAgIG1heF9tZW11c2UgPSBtZW1saW1pdAorCitkZWYgYmlnbWVtdGVzdChtaW5zaXplLCBtZW11c2UsIG92ZXJoZWFkPTUqXzFNKToKKyAgICAiIiJEZWNvcmF0b3IgZm9yIGJpZ21lbSB0ZXN0cy4KKworICAgICdtaW5zaXplJyBpcyB0aGUgbWluaW11bSB1c2VmdWwgc2l6ZSBmb3IgdGhlIHRlc3QgKGluIGFyYml0cmFyeSwKKyAgICB0ZXN0LWludGVycHJldGVkIHVuaXRzLikgJ21lbXVzZScgaXMgdGhlIG51bWJlciBvZiAnYnl0ZXMgcGVyIHNpemUnIGZvcgorICAgIHRoZSB0ZXN0LCBvciBhIGdvb2QgZXN0aW1hdGUgb2YgaXQuICdvdmVyaGVhZCcgc3BlY2lmaWVzIGZpeGVkIG92ZXJoZWFkLAorICAgIGluZGVwZW5kZW50IG9mIHRoZSB0ZXN0c2l6ZSwgYW5kIGRlZmF1bHRzIHRvIDVNYi4KKworICAgIFRoZSBkZWNvcmF0b3IgdHJpZXMgdG8gZ3Vlc3MgYSBnb29kIHZhbHVlIGZvciAnc2l6ZScgYW5kIHBhc3NlcyBpdCB0bworICAgIHRoZSBkZWNvcmF0ZWQgdGVzdCBmdW5jdGlvbi4gSWYgbWluc2l6ZSAqIG1lbXVzZSBpcyBtb3JlIHRoYW4gdGhlCisgICAgYWxsb3dlZCBtZW1vcnkgdXNlIChhcyBkZWZpbmVkIGJ5IG1heF9tZW11c2UpLCB0aGUgdGVzdCBpcyBza2lwcGVkLgorICAgIE90aGVyd2lzZSwgbWluc2l6ZSBpcyBhZGp1c3RlZCB1cHdhcmQgdG8gdXNlIHVwIHRvIG1heF9tZW11c2UuCisgICAgIiIiCisgICAgZGVmIGRlY29yYXRvcihmKToKKyAgICAgICAgZGVmIHdyYXBwZXIoc2VsZik6CisgICAgICAgICAgICBpZiBub3QgbWF4X21lbXVzZToKKyAgICAgICAgICAgICAgICAjIElmIG1heF9tZW11c2UgaXMgMCAodGhlIGRlZmF1bHQpLAorICAgICAgICAgICAgICAgICMgd2Ugc3RpbGwgd2FudCB0byBydW4gdGhlIHRlc3RzIHdpdGggc2l6ZSBzZXQgdG8gYSBmZXcga2IsCisgICAgICAgICAgICAgICAgIyB0byBtYWtlIHN1cmUgdGhleSB3b3JrLiBXZSBzdGlsbCB3YW50IHRvIGF2b2lkIHVzaW5nCisgICAgICAgICAgICAgICAgIyB0b28gbXVjaCBtZW1vcnksIHRob3VnaCwgYnV0IHdlIGRvIHRoYXQgbm9pc2lseS4KKyAgICAgICAgICAgICAgICBtYXhzaXplID0gNTE0NworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF4c2l6ZSAqIG1lbXVzZSArIG92ZXJoZWFkID4gMjAgKiBfMU0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG1heHNpemUgPSBpbnQoKG1heF9tZW11c2UgLSBvdmVyaGVhZCkgLyBtZW11c2UpCisgICAgICAgICAgICAgICAgaWYgbWF4c2l6ZSA8IG1pbnNpemU6CisgICAgICAgICAgICAgICAgICAgICMgUmVhbGx5IG91Z2h0IHRvIHByaW50ICd0ZXN0IHNraXBwZWQnIG9yIHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiU2tpcHBpbmcgJXMgYmVjYXVzZSBvZiBtZW1vcnkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3RyYWludFxuIiAlIChmLl9fbmFtZV9fLCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgICMgVHJ5IHRvIGtlZXAgc29tZSBicmVhdGhpbmcgcm9vbSBpbiBtZW1vcnkgdXNlCisgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IG1heChtYXhzaXplIC0gNTAgKiBfMU0sIG1pbnNpemUpCisgICAgICAgICAgICByZXR1cm4gZihzZWxmLCBtYXhzaXplKQorICAgICAgICB3cmFwcGVyLm1pbnNpemUgPSBtaW5zaXplCisgICAgICAgIHdyYXBwZXIubWVtdXNlID0gbWVtdXNlCisgICAgICAgIHdyYXBwZXIub3ZlcmhlYWQgPSBvdmVyaGVhZAorICAgICAgICByZXR1cm4gd3JhcHBlcgorICAgIHJldHVybiBkZWNvcmF0b3IKKworZGVmIHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZSwgbWVtdXNlLCBvdmVyaGVhZD01Kl8xTSwgZHJ5X3J1bj1UcnVlKToKKyAgICBkZWYgZGVjb3JhdG9yKGYpOgorICAgICAgICBkZWYgd3JhcHBlcihzZWxmKToKKyAgICAgICAgICAgIGlmIG5vdCByZWFsX21heF9tZW11c2U6CisgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IDUxNDcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWF4c2l6ZSA9IHNpemUKKworICAgICAgICAgICAgaWYgKChyZWFsX21heF9tZW11c2Ugb3Igbm90IGRyeV9ydW4pCisgICAgICAgICAgICAgICAgYW5kIHJlYWxfbWF4X21lbXVzZSA8IG1heHNpemUgKiBtZW11c2UpOgorICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlNraXBwaW5nICVzIGJlY2F1c2Ugb2YgbWVtb3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3RyYWludFxuIiAlIChmLl9fbmFtZV9fLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHJldHVybiBmKHNlbGYsIG1heHNpemUpCisgICAgICAgIHdyYXBwZXIuc2l6ZSA9IHNpemUKKyAgICAgICAgd3JhcHBlci5tZW11c2UgPSBtZW11c2UKKyAgICAgICAgd3JhcHBlci5vdmVyaGVhZCA9IG92ZXJoZWFkCisgICAgICAgIHJldHVybiB3cmFwcGVyCisgICAgcmV0dXJuIGRlY29yYXRvcgorCitkZWYgYmlnYWRkcnNwYWNldGVzdChmKToKKyAgICAiIiJEZWNvcmF0b3IgZm9yIHRlc3RzIHRoYXQgZmlsbCB0aGUgYWRkcmVzcyBzcGFjZS4iIiIKKyAgICBkZWYgd3JhcHBlcihzZWxmKToKKyAgICAgICAgaWYgbWF4X21lbXVzZSA8IE1BWF9QeV9zc2l6ZV90OgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJTa2lwcGluZyAlcyBiZWNhdXNlIG9mIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3RyYWludFxuIiAlIChmLl9fbmFtZV9fLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZihzZWxmKQorICAgIHJldHVybiB3cmFwcGVyCisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyB1bml0dGVzdCBpbnRlZ3JhdGlvbi4KKworY2xhc3MgQmFzaWNUZXN0UnVubmVyOgorICAgIGRlZiBydW4oc2VsZiwgdGVzdCk6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitkZWYgX2lkKG9iaik6CisgICAgcmV0dXJuIG9iagorCitkZWYgcmVxdWlyZXNfcmVzb3VyY2UocmVzb3VyY2UpOgorICAgIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQocmVzb3VyY2UpOgorICAgICAgICByZXR1cm4gX2lkCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHVuaXR0ZXN0LnNraXAoInJlc291cmNlIHswIXJ9IGlzIG5vdCBlbmFibGVkIi5mb3JtYXQocmVzb3VyY2UpKQorCitkZWYgY3B5dGhvbl9vbmx5KHRlc3QpOgorICAgICIiIgorICAgIERlY29yYXRvciBmb3IgdGVzdHMgb25seSBhcHBsaWNhYmxlIG9uIENQeXRob24uCisgICAgIiIiCisgICAgcmV0dXJuIGltcGxfZGV0YWlsKGNweXRob249VHJ1ZSkodGVzdCkKKworZGVmIGltcGxfZGV0YWlsKG1zZz1Ob25lLCAqKmd1YXJkcyk6CisgICAgaWYgY2hlY2tfaW1wbF9kZXRhaWwoKipndWFyZHMpOgorICAgICAgICByZXR1cm4gX2lkCisgICAgaWYgbXNnIGlzIE5vbmU6CisgICAgICAgIGd1YXJkbmFtZXMsIGRlZmF1bHQgPSBfcGFyc2VfZ3VhcmRzKGd1YXJkcykKKyAgICAgICAgaWYgZGVmYXVsdDoKKyAgICAgICAgICAgIG1zZyA9ICJpbXBsZW1lbnRhdGlvbiBkZXRhaWwgbm90IGF2YWlsYWJsZSBvbiB7MH0iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2cgPSAiaW1wbGVtZW50YXRpb24gZGV0YWlsIHNwZWNpZmljIHRvIHswfSIKKyAgICAgICAgZ3VhcmRuYW1lcyA9IHNvcnRlZChndWFyZG5hbWVzLmtleXMoKSkKKyAgICAgICAgbXNnID0gbXNnLmZvcm1hdCgnIG9yICcuam9pbihndWFyZG5hbWVzKSkKKyAgICByZXR1cm4gdW5pdHRlc3Quc2tpcChtc2cpCisKK2RlZiBfcGFyc2VfZ3VhcmRzKGd1YXJkcyk6CisgICAgIyBSZXR1cm5zIGEgdHVwbGUgKHtwbGF0Zm9ybV9uYW1lOiBydW5fbWV9LCBkZWZhdWx0X3ZhbHVlKQorICAgIGlmIG5vdCBndWFyZHM6CisgICAgICAgIHJldHVybiAoeydjcHl0aG9uJzogVHJ1ZX0sIEZhbHNlKQorICAgIGlzX3RydWUgPSBndWFyZHMudmFsdWVzKClbMF0KKyAgICBhc3NlcnQgZ3VhcmRzLnZhbHVlcygpID09IFtpc190cnVlXSAqIGxlbihndWFyZHMpICAgIyBhbGwgVHJ1ZSBvciBhbGwgRmFsc2UKKyAgICByZXR1cm4gKGd1YXJkcywgbm90IGlzX3RydWUpCisKKyMgVXNlIHRoZSBmb2xsb3dpbmcgY2hlY2sgdG8gZ3VhcmQgQ1B5dGhvbidzIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIHRlc3RzIC0tCisjIG9yIHRvIHJ1biB0aGVtIG9ubHkgb24gdGhlIGltcGxlbWVudGF0aW9uKHMpIGd1YXJkZWQgYnkgdGhlIGFyZ3VtZW50cy4KK2RlZiBjaGVja19pbXBsX2RldGFpbCgqKmd1YXJkcyk6CisgICAgIiIiVGhpcyBmdW5jdGlvbiByZXR1cm5zIFRydWUgb3IgRmFsc2UgZGVwZW5kaW5nIG9uIHRoZSBob3N0IHBsYXRmb3JtLgorICAgICAgIEV4YW1wbGVzOgorICAgICAgICAgIGlmIGNoZWNrX2ltcGxfZGV0YWlsKCk6ICAgICAgICAgICAgICAgIyBvbmx5IG9uIENQeXRob24gKGRlZmF1bHQpCisgICAgICAgICAgaWYgY2hlY2tfaW1wbF9kZXRhaWwoanl0aG9uPVRydWUpOiAgICAjIG9ubHkgb24gSnl0aG9uCisgICAgICAgICAgaWYgY2hlY2tfaW1wbF9kZXRhaWwoY3B5dGhvbj1GYWxzZSk6ICAjIGV2ZXJ5d2hlcmUgZXhjZXB0IG9uIENQeXRob24KKyAgICAiIiIKKyAgICBndWFyZHMsIGRlZmF1bHQgPSBfcGFyc2VfZ3VhcmRzKGd1YXJkcykKKyAgICByZXR1cm4gZ3VhcmRzLmdldChwbGF0Zm9ybS5weXRob25faW1wbGVtZW50YXRpb24oKS5sb3dlcigpLCBkZWZhdWx0KQorCisKKworZGVmIF9ydW5fc3VpdGUoc3VpdGUpOgorICAgICIiIlJ1biB0ZXN0cyBmcm9tIGEgdW5pdHRlc3QuVGVzdFN1aXRlLWRlcml2ZWQgY2xhc3MuIiIiCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3lzLnN0ZG91dCwgdmVyYm9zaXR5PTIpCisgICAgZWxzZToKKyAgICAgICAgcnVubmVyID0gQmFzaWNUZXN0UnVubmVyKCkKKworICAgIHJlc3VsdCA9IHJ1bm5lci5ydW4oc3VpdGUpCisgICAgaWYgbm90IHJlc3VsdC53YXNTdWNjZXNzZnVsKCk6CisgICAgICAgIGlmIGxlbihyZXN1bHQuZXJyb3JzKSA9PSAxIGFuZCBub3QgcmVzdWx0LmZhaWx1cmVzOgorICAgICAgICAgICAgZXJyID0gcmVzdWx0LmVycm9yc1swXVsxXQorICAgICAgICBlbGlmIGxlbihyZXN1bHQuZmFpbHVyZXMpID09IDEgYW5kIG5vdCByZXN1bHQuZXJyb3JzOgorICAgICAgICAgICAgZXJyID0gcmVzdWx0LmZhaWx1cmVzWzBdWzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlcnIgPSAibXVsdGlwbGUgZXJyb3JzIG9jY3VycmVkIgorICAgICAgICAgICAgaWYgbm90IHZlcmJvc2U6CisgICAgICAgICAgICAgICAgZXJyICs9ICI7IHJ1biBpbiB2ZXJib3NlIG1vZGUgZm9yIGRldGFpbHMiCisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoZXJyKQorCisKK2RlZiBydW5fdW5pdHRlc3QoKmNsYXNzZXMpOgorICAgICIiIlJ1biB0ZXN0cyBmcm9tIHVuaXR0ZXN0LlRlc3RDYXNlLWRlcml2ZWQgY2xhc3Nlcy4iIiIKKyAgICB2YWxpZF90eXBlcyA9ICh1bml0dGVzdC5UZXN0U3VpdGUsIHVuaXR0ZXN0LlRlc3RDYXNlKQorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgY2xzIGluIGNsYXNzZXM6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoY2xzLCBzdHIpOgorICAgICAgICAgICAgaWYgY2xzIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QuZmluZFRlc3RDYXNlcyhzeXMubW9kdWxlc1tjbHNdKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic3RyIGFyZ3VtZW50cyBtdXN0IGJlIGtleXMgaW4gc3lzLm1vZHVsZXMiKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoY2xzLCB2YWxpZF90eXBlcyk6CisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGNscykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKGNscykpCisgICAgX3J1bl9zdWl0ZShzdWl0ZSkKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIENoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG9jc3RyaW5ncy4KKworSEFWRV9ET0NTVFJJTkdTID0gKGNoZWNrX2ltcGxfZGV0YWlsKGNweXRob249RmFsc2UpIG9yCisgICAgICAgICAgICAgICAgICAgc3lzLnBsYXRmb3JtID09ICd3aW4zMicgb3IKKyAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1dJVEhfRE9DX1NUUklOR1MnKSkKKworcmVxdWlyZXNfZG9jc3RyaW5ncyA9IHVuaXR0ZXN0LnNraXBVbmxlc3MoSEFWRV9ET0NTVFJJTkdTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QgcmVxdWlyZXMgZG9jc3RyaW5ncyIpCisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIGRvY3Rlc3QgZHJpdmVyLgorCitkZWYgcnVuX2RvY3Rlc3QobW9kdWxlLCB2ZXJib3NpdHk9Tm9uZSk6CisgICAgIiIiUnVuIGRvY3Rlc3Qgb24gdGhlIGdpdmVuIG1vZHVsZS4gIFJldHVybiAoI2ZhaWx1cmVzLCAjdGVzdHMpLgorCisgICAgSWYgb3B0aW9uYWwgYXJndW1lbnQgdmVyYm9zaXR5IGlzIG5vdCBzcGVjaWZpZWQgKG9yIGlzIE5vbmUpLCBwYXNzCisgICAgdGVzdF9zdXBwb3J0J3MgYmVsaWVmIGFib3V0IHZlcmJvc2l0eSBvbiB0byBkb2N0ZXN0LiAgRWxzZSBkb2N0ZXN0J3MKKyAgICB1c3VhbCBiZWhhdmlvciBpcyB1c2VkIChpdCBzZWFyY2hlcyBzeXMuYXJndiBmb3IgLXYpLgorICAgICIiIgorCisgICAgaW1wb3J0IGRvY3Rlc3QKKworICAgIGlmIHZlcmJvc2l0eSBpcyBOb25lOgorICAgICAgICB2ZXJib3NpdHkgPSB2ZXJib3NlCisgICAgZWxzZToKKyAgICAgICAgdmVyYm9zaXR5ID0gTm9uZQorCisgICAgIyBEaXJlY3QgZG9jdGVzdCBvdXRwdXQgKG5vcm1hbGx5IGp1c3QgZXJyb3JzKSB0byByZWFsIHN0ZG91dDsgZG9jdGVzdAorICAgICMgb3V0cHV0IHNob3VsZG4ndCBiZSBjb21wYXJlZCBieSByZWdydGVzdC4KKyAgICBzYXZlX3N0ZG91dCA9IHN5cy5zdGRvdXQKKyAgICBzeXMuc3Rkb3V0ID0gZ2V0X29yaWdpbmFsX3N0ZG91dCgpCisgICAgdHJ5OgorICAgICAgICBmLCB0ID0gZG9jdGVzdC50ZXN0bW9kKG1vZHVsZSwgdmVyYm9zZT12ZXJib3NpdHkpCisgICAgICAgIGlmIGY6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCIlZCBvZiAlZCBkb2N0ZXN0cyBmYWlsZWQiICUgKGYsIHQpKQorICAgIGZpbmFsbHk6CisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlX3N0ZG91dAorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdkb2N0ZXN0ICglcykgLi4uICVkIHRlc3RzIHdpdGggemVybyBmYWlsdXJlcycgJSAobW9kdWxlLl9fbmFtZV9fLCB0KQorICAgIHJldHVybiBmLCB0CisKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBUaHJlYWRpbmcgc3VwcG9ydCB0byBwcmV2ZW50IHJlcG9ydGluZyByZWZsZWFrcyB3aGVuIHJ1bm5pbmcgcmVncnRlc3QucHkgLVIKKworIyBOT1RFOiB3ZSB1c2UgdGhyZWFkLl9jb3VudCgpIHJhdGhlciB0aGFuIHRocmVhZGluZy5lbnVtZXJhdGUoKSAob3IgdGhlCisjIG1vcmFsIGVxdWl2YWxlbnQgdGhlcmVvZikgYmVjYXVzZSBhIHRocmVhZGluZy5UaHJlYWQgb2JqZWN0IGlzIHN0aWxsIGFsaXZlCisjIHVudGlsIGl0cyBfX2Jvb3RzdHJhcCgpIG1ldGhvZCBoYXMgcmV0dXJuZWQsIGV2ZW4gYWZ0ZXIgaXQgaGFzIGJlZW4KKyMgdW5yZWdpc3RlcmVkIGZyb20gdGhlIHRocmVhZGluZyBtb2R1bGUuCisjIHRocmVhZC5fY291bnQoKSwgb24gdGhlIG90aGVyIGhhbmQsIG9ubHkgZ2V0cyBkZWNyZW1lbnRlZCAqYWZ0ZXIqIHRoZQorIyBfX2Jvb3RzdHJhcCgpIG1ldGhvZCBoYXMgcmV0dXJuZWQsIHdoaWNoIGdpdmVzIHVzIHJlbGlhYmxlIHJlZmVyZW5jZSBjb3VudHMKKyMgYXQgdGhlIGVuZCBvZiBhIHRlc3QgcnVuLgorCitkZWYgdGhyZWFkaW5nX3NldHVwKCk6CisgICAgaWYgdGhyZWFkOgorICAgICAgICByZXR1cm4gdGhyZWFkLl9jb3VudCgpLAorICAgIGVsc2U6CisgICAgICAgIHJldHVybiAxLAorCitkZWYgdGhyZWFkaW5nX2NsZWFudXAobmJfdGhyZWFkcyk6CisgICAgaWYgbm90IHRocmVhZDoKKyAgICAgICAgcmV0dXJuCisKKyAgICBfTUFYX0NPVU5UID0gMTAKKyAgICBmb3IgY291bnQgaW4gcmFuZ2UoX01BWF9DT1VOVCk6CisgICAgICAgIG4gPSB0aHJlYWQuX2NvdW50KCkKKyAgICAgICAgaWYgbiA9PSBuYl90aHJlYWRzOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgIyBYWFggcHJpbnQgYSB3YXJuaW5nIGluIGNhc2Ugb2YgZmFpbHVyZT8KKworZGVmIHJlYXBfdGhyZWFkcyhmdW5jKToKKyAgICAiIiJVc2UgdGhpcyBmdW5jdGlvbiB3aGVuIHRocmVhZHMgYXJlIGJlaW5nIHVzZWQuICBUaGlzIHdpbGwKKyAgICBlbnN1cmUgdGhhdCB0aGUgdGhyZWFkcyBhcmUgY2xlYW5lZCB1cCBldmVuIHdoZW4gdGhlIHRlc3QgZmFpbHMuCisgICAgSWYgdGhyZWFkaW5nIGlzIHVuYXZhaWxhYmxlIHRoaXMgZnVuY3Rpb24gZG9lcyBub3RoaW5nLgorICAgICIiIgorICAgIGlmIG5vdCB0aHJlYWQ6CisgICAgICAgIHJldHVybiBmdW5jCisKKyAgICBAZnVuY3Rvb2xzLndyYXBzKGZ1bmMpCisgICAgZGVmIGRlY29yYXRvcigqYXJncyk6CisgICAgICAgIGtleSA9IHRocmVhZGluZ19zZXR1cCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdGhyZWFkaW5nX2NsZWFudXAoKmtleSkKKyAgICByZXR1cm4gZGVjb3JhdG9yCisKK2RlZiByZWFwX2NoaWxkcmVuKCk6CisgICAgIiIiVXNlIHRoaXMgZnVuY3Rpb24gYXQgdGhlIGVuZCBvZiB0ZXN0X21haW4oKSB3aGVuZXZlciBzdWItcHJvY2Vzc2VzCisgICAgYXJlIHN0YXJ0ZWQuICBUaGlzIHdpbGwgaGVscCBlbnN1cmUgdGhhdCBubyBleHRyYSBjaGlsZHJlbiAoem9tYmllcykKKyAgICBzdGljayBhcm91bmQgdG8gaG9nIHJlc291cmNlcyBhbmQgY3JlYXRlIHByb2JsZW1zIHdoZW4gbG9va2luZworICAgIGZvciByZWZsZWFrcy4KKyAgICAiIiIKKworICAgICMgUmVhcCBhbGwgb3VyIGRlYWQgY2hpbGQgcHJvY2Vzc2VzIHNvIHdlIGRvbid0IGxlYXZlIHpvbWJpZXMgYXJvdW5kLgorICAgICMgVGhlc2UgaG9nIHJlc291cmNlcyBhbmQgbWlnaHQgYmUgY2F1c2luZyBzb21lIG9mIHRoZSBidWlsZGJvdHMgdG8gZGllLgorICAgIGlmIGhhc2F0dHIob3MsICd3YWl0cGlkJyk6CisgICAgICAgIGFueV9wcm9jZXNzID0gLTEKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFRoaXMgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gb24gV2luZG93cy4gIFRoYXQncyBvay4KKyAgICAgICAgICAgICAgICBwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoYW55X3Byb2Nlc3MsIG9zLldOT0hBTkcpCisgICAgICAgICAgICAgICAgaWYgcGlkID09IDA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKworQGNvbnRleHRsaWIuY29udGV4dG1hbmFnZXIKK2RlZiBzd2FwX2F0dHIob2JqLCBhdHRyLCBuZXdfdmFsKToKKyAgICAiIiJUZW1wb3Jhcnkgc3dhcCBvdXQgYW4gYXR0cmlidXRlIHdpdGggYSBuZXcgb2JqZWN0LgorCisgICAgVXNhZ2U6CisgICAgICAgIHdpdGggc3dhcF9hdHRyKG9iaiwgImF0dHIiLCA1KToKKyAgICAgICAgICAgIC4uLgorCisgICAgICAgIFRoaXMgd2lsbCBzZXQgb2JqLmF0dHIgdG8gNSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB3aXRoOiBibG9jaywKKyAgICAgICAgcmVzdG9yaW5nIHRoZSBvbGQgdmFsdWUgYXQgdGhlIGVuZCBvZiB0aGUgYmxvY2suIElmIGBhdHRyYCBkb2Vzbid0CisgICAgICAgIGV4aXN0IG9uIGBvYmpgLCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZW4gZGVsZXRlZCBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICBibG9jay4KKyAgICAiIiIKKyAgICBpZiBoYXNhdHRyKG9iaiwgYXR0cik6CisgICAgICAgIHJlYWxfdmFsID0gZ2V0YXR0cihvYmosIGF0dHIpCisgICAgICAgIHNldGF0dHIob2JqLCBhdHRyLCBuZXdfdmFsKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2V0YXR0cihvYmosIGF0dHIsIHJlYWxfdmFsKQorICAgIGVsc2U6CisgICAgICAgIHNldGF0dHIob2JqLCBhdHRyLCBuZXdfdmFsKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVsYXR0cihvYmosIGF0dHIpCisKK2RlZiBweTNrX2J5dGVzKGIpOgorICAgICIiIkVtdWxhdGUgdGhlIHB5M2sgYnl0ZXMoKSBjb25zdHJ1Y3Rvci4KKworICAgIE5PVEU6IFRoaXMgaXMgb25seSBhIGJlc3QgZWZmb3J0IGZ1bmN0aW9uLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgIyBtZW1vcnl2aWV3PworICAgICAgICByZXR1cm4gYi50b2J5dGVzKCkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgaXRlcmFibGUgb2YgaW50cz8KKyAgICAgICAgICAgIHJldHVybiBiIiIuam9pbihjaHIoeCkgZm9yIHggaW4gYikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBieXRlcyhiKQorCitkZWYgYXJnc19mcm9tX2ludGVycHJldGVyX2ZsYWdzKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBjb21tYW5kLWxpbmUgYXJndW1lbnRzIHJlcHJvZHVjaW5nIHRoZSBjdXJyZW50CisgICAgc2V0dGluZ3MgaW4gc3lzLmZsYWdzLiIiIgorICAgIGltcG9ydCBzdWJwcm9jZXNzCisgICAgcmV0dXJuIHN1YnByb2Nlc3MuX2FyZ3NfZnJvbV9pbnRlcnByZXRlcl9mbGFncygpCisKK2RlZiBzdHJpcF9weXRob25fc3RkZXJyKHN0ZGVycik6CisgICAgIiIiU3RyaXAgdGhlIHN0ZGVyciBvZiBhIFB5dGhvbiBwcm9jZXNzIGZyb20gcG90ZW50aWFsIGRlYnVnIG91dHB1dAorICAgIGVtaXR0ZWQgYnkgdGhlIGludGVycHJldGVyLgorCisgICAgVGhpcyB3aWxsIHR5cGljYWxseSBiZSBydW4gb24gdGhlIHJlc3VsdCBvZiB0aGUgY29tbXVuaWNhdGUoKSBtZXRob2QKKyAgICBvZiBhIHN1YnByb2Nlc3MuUG9wZW4gb2JqZWN0LgorICAgICIiIgorICAgIHN0ZGVyciA9IHJlLnN1YihiciJcW1xkKyByZWZzXF1ccj9cbj8kIiwgYiIiLCBzdGRlcnIpLnN0cmlwKCkKKyAgICByZXR1cm4gc3RkZXJyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdXBwb3J0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2MxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdXBwb3J0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Njg5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bXRhYmxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzdlODYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weQpAQCAtMCwwICsxLDE4NCBAQAorIiIiCitUZXN0IHRoZSBBUEkgb2YgdGhlIHN5bXRhYmxlIG1vZHVsZS4KKyIiIgoraW1wb3J0IHN5bXRhYmxlCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitURVNUX0NPREUgPSAiIiIKK2ltcG9ydCBzeXMKKworZ2xvYiA9IDQyCisKK2NsYXNzIE1pbmU6CisgICAgaW5zdGFuY2VfdmFyID0gMjQKKyAgICBkZWYgYV9tZXRob2QocDEsIHAyKToKKyAgICAgICAgcGFzcworCitkZWYgc3BhbShhLCBiLCAqdmFyLCAqKmt3KToKKyAgICBnbG9iYWwgYmFyCisgICAgYmFyID0gNDcKKyAgICB4ID0gMjMKKyAgICBnbG9iCisgICAgZGVmIGludGVybmFsKCk6CisgICAgICAgIHJldHVybiB4CisgICAgcmV0dXJuIGludGVybmFsCisKK2RlZiBmb28oKToKKyAgICBleGVjICdtJworICAgIGZyb20gc3lzIGltcG9ydCAqCisKK2RlZiBuYW1lc3BhY2VfdGVzdCgpOiBwYXNzCitkZWYgbmFtZXNwYWNlX3Rlc3QoKTogcGFzcworIiIiCisKKworZGVmIGZpbmRfYmxvY2soYmxvY2ssIG5hbWUpOgorICAgIGZvciBjaCBpbiBibG9jay5nZXRfY2hpbGRyZW4oKToKKyAgICAgICAgaWYgY2guZ2V0X25hbWUoKSA9PSBuYW1lOgorICAgICAgICAgICAgcmV0dXJuIGNoCisKKworY2xhc3MgU3ltdGFibGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKAorICAgICAgICAgICAgKCJpbXBvcnQgXCogb25seSBhbGxvd2VkIGF0IG1vZHVsZSBsZXZlbCIsIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgdG9wID0gc3ltdGFibGUuc3ltdGFibGUoVEVTVF9DT0RFLCAiPyIsICJleGVjIikKKyAgICAjIFRoZXNlIGNvcnJlc3BvbmQgdG8gc2NvcGVzIGluIFRFU1RfQ09ERQorICAgIE1pbmUgPSBmaW5kX2Jsb2NrKHRvcCwgIk1pbmUiKQorICAgIGFfbWV0aG9kID0gZmluZF9ibG9jayhNaW5lLCAiYV9tZXRob2QiKQorICAgIHNwYW0gPSBmaW5kX2Jsb2NrKHRvcCwgInNwYW0iKQorICAgIGludGVybmFsID0gZmluZF9ibG9jayhzcGFtLCAiaW50ZXJuYWwiKQorICAgIGZvbyA9IGZpbmRfYmxvY2sodG9wLCAiZm9vIikKKworICAgIGRlZiB0ZXN0X3R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50b3AuZ2V0X3R5cGUoKSwgIm1vZHVsZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5NaW5lLmdldF90eXBlKCksICJjbGFzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hX21ldGhvZC5nZXRfdHlwZSgpLCAiZnVuY3Rpb24iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3BhbS5nZXRfdHlwZSgpLCAiZnVuY3Rpb24iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuaW50ZXJuYWwuZ2V0X3R5cGUoKSwgImZ1bmN0aW9uIikKKworICAgIGRlZiB0ZXN0X29wdGltaXplZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnRvcC5pc19vcHRpbWl6ZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnRvcC5oYXNfZXhlYygpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudG9wLmhhc19pbXBvcnRfc3RhcigpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNwYW0uaXNfb3B0aW1pemVkKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZvby5pc19vcHRpbWl6ZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZm9vLmhhc19leGVjKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZvby5oYXNfaW1wb3J0X3N0YXIoKSkKKworICAgIGRlZiB0ZXN0X25lc3RlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnRvcC5pc19uZXN0ZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLk1pbmUuaXNfbmVzdGVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5zcGFtLmlzX25lc3RlZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pbnRlcm5hbC5pc19uZXN0ZWQoKSkKKworICAgIGRlZiB0ZXN0X2NoaWxkcmVuKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50b3AuaGFzX2NoaWxkcmVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLk1pbmUuaGFzX2NoaWxkcmVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5mb28uaGFzX2NoaWxkcmVuKCkpCisKKyAgICBkZWYgdGVzdF9saW5lbm8oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50b3AuZ2V0X2xpbmVubygpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3BhbS5nZXRfbGluZW5vKCksIDExKQorCisgICAgZGVmIHRlc3RfZnVuY3Rpb25faW5mbyhzZWxmKToKKyAgICAgICAgZnVuYyA9IHNlbGYuc3BhbQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvcnRlZChmdW5jLmdldF9wYXJhbWV0ZXJzKCkpLCBbImEiLCAiYiIsICJrdyIsICJ2YXIiXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBbImEiLCAiYiIsICJpbnRlcm5hbCIsICJrdyIsICJ2YXIiLCAieCJdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGZ1bmMuZ2V0X2xvY2FscygpKSwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGZ1bmMuZ2V0X2dsb2JhbHMoKSksIFsiYmFyIiwgImdsb2IiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmludGVybmFsLmdldF9mcmVlcygpLCAoIngiLCkpCisKKyAgICBkZWYgdGVzdF9nbG9iYWxzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cCgiZ2xvYiIpLmlzX2dsb2JhbCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuc3BhbS5sb29rdXAoImdsb2IiKS5pc19kZWNsYXJlZF9nbG9iYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3BhbS5sb29rdXAoImJhciIpLmlzX2dsb2JhbCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cCgiYmFyIikuaXNfZGVjbGFyZWRfZ2xvYmFsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5pbnRlcm5hbC5sb29rdXAoIngiKS5pc19nbG9iYWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLk1pbmUubG9va3VwKCJpbnN0YW5jZV92YXIiKS5pc19nbG9iYWwoKSkKKworICAgIGRlZiB0ZXN0X2xvY2FsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cCgieCIpLmlzX2xvY2FsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5pbnRlcm5hbC5sb29rdXAoIngiKS5pc19sb2NhbCgpKQorCisgICAgZGVmIHRlc3RfcmVmZXJlbmNlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaW50ZXJuYWwubG9va3VwKCJ4IikuaXNfcmVmZXJlbmNlZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cCgiaW50ZXJuYWwiKS5pc19yZWZlcmVuY2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5zcGFtLmxvb2t1cCgieCIpLmlzX3JlZmVyZW5jZWQoKSkKKworICAgIGRlZiB0ZXN0X3BhcmFtZXRlcnMoc2VsZik6CisgICAgICAgIGZvciBzeW0gaW4gKCJhIiwgInZhciIsICJrdyIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3BhbS5sb29rdXAoc3ltKS5pc19wYXJhbWV0ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnNwYW0ubG9va3VwKCJ4IikuaXNfcGFyYW1ldGVyKCkpCisKKyAgICBkZWYgdGVzdF9zeW1ib2xfbG9va3VwKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLnRvcC5nZXRfaWRlbnRpZmllcnMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKHNlbGYudG9wLmdldF9zeW1ib2xzKCkpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnRvcC5sb29rdXAsICJub3RfaGVyZSIpCisKKyAgICBkZWYgdGVzdF9uYW1lc3BhY2VzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50b3AubG9va3VwKCJNaW5lIikuaXNfbmFtZXNwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLk1pbmUubG9va3VwKCJhX21ldGhvZCIpLmlzX25hbWVzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50b3AubG9va3VwKCJzcGFtIikuaXNfbmFtZXNwYWNlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnNwYW0ubG9va3VwKCJpbnRlcm5hbCIpLmlzX25hbWVzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50b3AubG9va3VwKCJuYW1lc3BhY2VfdGVzdCIpLmlzX25hbWVzcGFjZSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuc3BhbS5sb29rdXAoIngiKS5pc19uYW1lc3BhY2UoKSkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50b3AubG9va3VwKCJzcGFtIikuZ2V0X25hbWVzcGFjZSgpIGlzIHNlbGYuc3BhbSkKKyAgICAgICAgbnNfdGVzdCA9IHNlbGYudG9wLmxvb2t1cCgibmFtZXNwYWNlX3Rlc3QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuc190ZXN0LmdldF9uYW1lc3BhY2VzKCkpLCAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBuc190ZXN0LmdldF9uYW1lc3BhY2UpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25lZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuc3BhbS5sb29rdXAoIngiKS5pc19hc3NpZ25lZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zcGFtLmxvb2t1cCgiYmFyIikuaXNfYXNzaWduZWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudG9wLmxvb2t1cCgic3BhbSIpLmlzX2Fzc2lnbmVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLk1pbmUubG9va3VwKCJhX21ldGhvZCIpLmlzX2Fzc2lnbmVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5pbnRlcm5hbC5sb29rdXAoIngiKS5pc19hc3NpZ25lZCgpKQorCisgICAgZGVmIHRlc3RfaW1wb3J0ZWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRvcC5sb29rdXAoInN5cyIpLmlzX2ltcG9ydGVkKCkpCisKKyAgICBkZWYgdGVzdF9uYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudG9wLmdldF9uYW1lKCksICJ0b3AiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc3BhbS5nZXRfbmFtZSgpLCAic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zcGFtLmxvb2t1cCgieCIpLmdldF9uYW1lKCksICJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLk1pbmUuZ2V0X25hbWUoKSwgIk1pbmUiKQorCisgICAgZGVmIHRlc3RfY2xhc3NfaW5mbyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLk1pbmUuZ2V0X21ldGhvZHMoKSwgKCdhX21ldGhvZCcsKSkKKworICAgIGRlZiB0ZXN0X2ZpbGVuYW1lX2NvcnJlY3Qoc2VsZik6CisgICAgICAgICMjIyBCdWcgdGlja2xlcjogU3ludGF4RXJyb3IgZmlsZSBuYW1lIGNvcnJlY3Qgd2hldGhlciBlcnJvciByYWlzZWQKKyAgICAgICAgIyMjIHdoaWxlIHBhcnNpbmcgb3IgYnVpbGRpbmcgc3ltYm9sIHRhYmxlLgorICAgICAgICBkZWYgY2hlY2tmaWxlbmFtZShicm9rZW5jb2RlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzeW10YWJsZS5zeW10YWJsZShicm9rZW5jb2RlLCAic3BhbSIsICJleGVjIikKKyAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciBhcyBlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5maWxlbmFtZSwgInNwYW0iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIFN5bnRheEVycm9yIGZvciAlciIgJSAoYnJva2VuY29kZSwpKQorICAgICAgICBjaGVja2ZpbGVuYW1lKCJkZWYgZih4KTogZm9vKSgiKSAgIyBwYXJzZS10aW1lCisgICAgICAgIGNoZWNrZmlsZW5hbWUoImRlZiBmKHgpOiBnbG9iYWwgeCIpICAjIHN5bXRhYmxlLWJ1aWxkLXRpbWUKKworICAgIGRlZiB0ZXN0X2V2YWwoc2VsZik6CisgICAgICAgIHN5bWJvbHMgPSBzeW10YWJsZS5zeW10YWJsZSgiNDIiLCAiPyIsICJldmFsIikKKworICAgIGRlZiB0ZXN0X3NpbmdsZShzZWxmKToKKyAgICAgICAgc3ltYm9scyA9IHN5bXRhYmxlLnN5bXRhYmxlKCI0MiIsICI/IiwgInNpbmdsZSIpCisKKyAgICBkZWYgdGVzdF9leGVjKHNlbGYpOgorICAgICAgICBzeW1ib2xzID0gc3ltdGFibGUuc3ltdGFibGUoImRlZiBmKHgpOiByZXR1cm4geCIsICI/IiwgImV4ZWMiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN5bXRhYmxlVGVzdCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ltdGFibGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ltdGFibGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODA2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ltdGFibGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ltdGFibGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODA2YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW10YWJsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5OTRmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeW50YXgucHkKQEAgLTAsMCArMSw1NzIgQEAKKyIiIlRoaXMgbW9kdWxlIHRlc3RzIFN5bnRheEVycm9ycy4KKworSGVyZSdzIGFuIGV4YW1wbGUgb2YgdGhlIHNvcnQgb2YgdGhpbmcgdGhhdCBpcyB0ZXN0ZWQuCisKKz4+PiBkZWYgZih4KToKKy4uLiAgICAgZ2xvYmFsIHgKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKK1N5bnRheEVycm9yOiBuYW1lICd4JyBpcyBsb2NhbCBhbmQgZ2xvYmFsICg8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzBdPiwgbGluZSAxKQorCitUaGUgdGVzdHMgYXJlIGFsbCByYWlzZSBTeW50YXhFcnJvcnMuICBUaGV5IHdlcmUgY3JlYXRlZCBieSBjaGVja2luZworZWFjaCBDIGNhbGwgdGhhdCByYWlzZXMgU3ludGF4RXJyb3IuICBUaGVyZSBhcmUgc2V2ZXJhbCBtb2R1bGVzIHRoYXQKK3JhaXNlIHRoZXNlIGV4Y2VwdGlvbnMtLSBhc3QuYywgY29tcGlsZS5jLCBmdXR1cmUuYywgcHl0aG9ucnVuLmMsIGFuZAorc3ltdGFibGUuYy4KKworVGhlIHBhcnNlciBpdHNlbGYgb3V0bGF3cyBhIGxvdCBvZiBpbnZhbGlkIHN5bnRheC4gIE5vbmUgb2YgdGhlc2UKK2Vycm9ycyBhcmUgdGVzdGVkIGhlcmUgYXQgdGhlIG1vbWVudC4gIFdlIHNob3VsZCBhZGQgc29tZSB0ZXN0czsgc2luY2UKK3RoZXJlIGFyZSBpbmZpbml0ZWx5IG1hbnkgcHJvZ3JhbXMgd2l0aCBpbnZhbGlkIHN5bnRheCwgd2Ugd291bGQgbmVlZAordG8gYmUganVkaWNpb3VzIGluIHNlbGVjdGluZyBzb21lLgorCitUaGUgY29tcGlsZXIgZ2VuZXJhdGVzIGEgc3ludGhldGljIG1vZHVsZSBuYW1lIGZvciBjb2RlIGV4ZWN1dGVkIGJ5Citkb2N0ZXN0LiAgU2luY2UgYWxsIHRoZSBjb2RlIGNvbWVzIGZyb20gdGhlIHNhbWUgbW9kdWxlLCBhIHN1ZmZpeCBsaWtlCitbMV0gaXMgYXBwZW5kZWQgdG8gdGhlIG1vZHVsZSBuYW1lLCBBcyBhIGNvbnNlcXVlbmNlLCBjaGFuZ2luZyB0aGUKK29yZGVyIG9mIHRlc3RzIGluIHRoaXMgbW9kdWxlIG1lYW5zIHJlbnVtYmVyaW5nIGFsbCB0aGUgZXJyb3JzIGFmdGVyCitpdC4gIChNYXliZSB3ZSBzaG91bGQgZW5hYmxlIHRoZSBlbGxpcHNpcyBvcHRpb24gZm9yIHRoZXNlIHRlc3RzLikKKworSW4gYXN0LmMsIHN5bnRheCBlcnJvcnMgYXJlIHJhaXNlZCBieSBjYWxsaW5nIGFzdF9lcnJvcigpLgorCitFcnJvcnMgZnJvbSBzZXRfY29udGV4dCgpOgorCis+Pj4gb2JqLk5vbmUgPSAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMV0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2Fubm90IGFzc2lnbiB0byBOb25lCisKKz4+PiBOb25lID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzJdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbm5vdCBhc3NpZ24gdG8gTm9uZQorCitJdCdzIGEgc3ludGF4IGVycm9yIHRvIGFzc2lnbiB0byB0aGUgZW1wdHkgdHVwbGUuICBXaHkgaXNuJ3QgaXQgYW4KK2Vycm9yIHRvIGFzc2lnbiB0byB0aGUgZW1wdHkgbGlzdD8gIEl0IHdpbGwgYWx3YXlzIHJhaXNlIHNvbWUgZXJyb3IgYXQKK3J1bnRpbWUuCisKKz4+PiAoKSA9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFszXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gKCkKKworPj4+IGYoKSA9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbAorCis+Pj4gZGVsIGYoKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzVdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGRlbGV0ZSBmdW5jdGlvbiBjYWxsCisKKz4+PiBhICsgMSA9IDIKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs2XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gb3BlcmF0b3IKKworPj4+ICh4IGZvciB4IGluIHgpID0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzddPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBnZW5lcmF0b3IgZXhwcmVzc2lvbgorCis+Pj4gMSA9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs4XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gbGl0ZXJhbAorCis+Pj4gImFiYyIgPSAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbOF0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGxpdGVyYWwKKworPj4+IGAxYCA9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxMF0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIHJlcHIKKworSWYgdGhlIGxlZnQtaGFuZCBzaWRlIG9mIGFuIGFzc2lnbm1lbnQgaXMgYSBsaXN0IG9yIHR1cGxlLCBhbiBpbGxlZ2FsCitleHByZXNzaW9uIGluc2lkZSB0aGF0IGNvbnRhaW4gc2hvdWxkIHN0aWxsIGNhdXNlIGEgc3ludGF4IGVycm9yLgorVGhpcyB0ZXN0IGp1c3QgY2hlY2tzIGEgY291cGxlIG9mIGNhc2VzIHJhdGhlciB0aGFuIGVudW1lcmF0aW5nIGFsbCBvZgordGhlbS4KKworPj4+IChhLCAiYiIsIGMpID0gKDEsIDIsIDMpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTFdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBsaXRlcmFsCisKKz4+PiBbYSwgYiwgYyArIDFdID0gWzEsIDIsIDNdCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTJdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBvcGVyYXRvcgorCis+Pj4gYSBpZiAxIGVsc2UgYiA9IDEKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxM10+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24KKworRnJvbSBjb21waWxlcl9jb21wbGV4X2FyZ3MoKToKKworPj4+IGRlZiBmKE5vbmU9MSk6CisuLi4gICAgIHBhc3MKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxNF0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2Fubm90IGFzc2lnbiB0byBOb25lCisKKworRnJvbSBhc3RfZm9yX2FyZ3VtZW50cygpOgorCis+Pj4gZGVmIGYoeCwgeT0xLCB6KToKKy4uLiAgICAgcGFzcworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzE1XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBub24tZGVmYXVsdCBhcmd1bWVudCBmb2xsb3dzIGRlZmF1bHQgYXJndW1lbnQKKworPj4+IGRlZiBmKHgsIE5vbmUpOgorLi4uICAgICBwYXNzCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTZdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbm5vdCBhc3NpZ24gdG8gTm9uZQorCis+Pj4gZGVmIGYoKk5vbmUpOgorLi4uICAgICBwYXNzCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMTddPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbm5vdCBhc3NpZ24gdG8gTm9uZQorCis+Pj4gZGVmIGYoKipOb25lKToKKy4uLiAgICAgcGFzcworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzE4XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW5ub3QgYXNzaWduIHRvIE5vbmUKKworCitGcm9tIGFzdF9mb3JfZnVuY2RlZigpOgorCis+Pj4gZGVmIE5vbmUoeCk6CisuLi4gICAgIHBhc3MKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsxOV0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2Fubm90IGFzc2lnbiB0byBOb25lCisKKworRnJvbSBhc3RfZm9yX2NhbGwoKToKKworPj4+IGRlZiBmKGl0LCAqdmFyYXJncyk6CisuLi4gICAgIHJldHVybiBsaXN0KGl0KQorPj4+IEwgPSByYW5nZSgxMCkKKz4+PiBmKHggZm9yIHggaW4gTCkKK1swLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5XQorPj4+IGYoeCBmb3IgeCBpbiBMLCAxKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzIzXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBHZW5lcmF0b3IgZXhwcmVzc2lvbiBtdXN0IGJlIHBhcmVudGhlc2l6ZWQgaWYgbm90IHNvbGUgYXJndW1lbnQKKz4+PiBmKCh4IGZvciB4IGluIEwpLCAxKQorWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCisKKz4+PiBmKGkwLCAgaTEsICBpMiwgIGkzLCAgaTQsICBpNSwgIGk2LCAgaTcsICBpOCwgIGk5LCAgaTEwLCAgaTExLAorLi4uICAgaTEyLCAgaTEzLCAgaTE0LCAgaTE1LCAgaTE2LCAgaTE3LCAgaTE4LCAgaTE5LCAgaTIwLCAgaTIxLCAgaTIyLAorLi4uICAgaTIzLCAgaTI0LCAgaTI1LCAgaTI2LCAgaTI3LCAgaTI4LCAgaTI5LCAgaTMwLCAgaTMxLCAgaTMyLCAgaTMzLAorLi4uICAgaTM0LCAgaTM1LCAgaTM2LCAgaTM3LCAgaTM4LCAgaTM5LCAgaTQwLCAgaTQxLCAgaTQyLCAgaTQzLCAgaTQ0LAorLi4uICAgaTQ1LCAgaTQ2LCAgaTQ3LCAgaTQ4LCAgaTQ5LCAgaTUwLCAgaTUxLCAgaTUyLCAgaTUzLCAgaTU0LCAgaTU1LAorLi4uICAgaTU2LCAgaTU3LCAgaTU4LCAgaTU5LCAgaTYwLCAgaTYxLCAgaTYyLCAgaTYzLCAgaTY0LCAgaTY1LCAgaTY2LAorLi4uICAgaTY3LCAgaTY4LCAgaTY5LCAgaTcwLCAgaTcxLCAgaTcyLCAgaTczLCAgaTc0LCAgaTc1LCAgaTc2LCAgaTc3LAorLi4uICAgaTc4LCAgaTc5LCAgaTgwLCAgaTgxLCAgaTgyLCAgaTgzLCAgaTg0LCAgaTg1LCAgaTg2LCAgaTg3LCAgaTg4LAorLi4uICAgaTg5LCAgaTkwLCAgaTkxLCAgaTkyLCAgaTkzLCAgaTk0LCAgaTk1LCAgaTk2LCAgaTk3LCAgaTk4LCAgaTk5LAorLi4uICAgaTEwMCwgIGkxMDEsICBpMTAyLCAgaTEwMywgIGkxMDQsICBpMTA1LCAgaTEwNiwgIGkxMDcsICBpMTA4LAorLi4uICAgaTEwOSwgIGkxMTAsICBpMTExLCAgaTExMiwgIGkxMTMsICBpMTE0LCAgaTExNSwgIGkxMTYsICBpMTE3LAorLi4uICAgaTExOCwgIGkxMTksICBpMTIwLCAgaTEyMSwgIGkxMjIsICBpMTIzLCAgaTEyNCwgIGkxMjUsICBpMTI2LAorLi4uICAgaTEyNywgIGkxMjgsICBpMTI5LCAgaTEzMCwgIGkxMzEsICBpMTMyLCAgaTEzMywgIGkxMzQsICBpMTM1LAorLi4uICAgaTEzNiwgIGkxMzcsICBpMTM4LCAgaTEzOSwgIGkxNDAsICBpMTQxLCAgaTE0MiwgIGkxNDMsICBpMTQ0LAorLi4uICAgaTE0NSwgIGkxNDYsICBpMTQ3LCAgaTE0OCwgIGkxNDksICBpMTUwLCAgaTE1MSwgIGkxNTIsICBpMTUzLAorLi4uICAgaTE1NCwgIGkxNTUsICBpMTU2LCAgaTE1NywgIGkxNTgsICBpMTU5LCAgaTE2MCwgIGkxNjEsICBpMTYyLAorLi4uICAgaTE2MywgIGkxNjQsICBpMTY1LCAgaTE2NiwgIGkxNjcsICBpMTY4LCAgaTE2OSwgIGkxNzAsICBpMTcxLAorLi4uICAgaTE3MiwgIGkxNzMsICBpMTc0LCAgaTE3NSwgIGkxNzYsICBpMTc3LCAgaTE3OCwgIGkxNzksICBpMTgwLAorLi4uICAgaTE4MSwgIGkxODIsICBpMTgzLCAgaTE4NCwgIGkxODUsICBpMTg2LCAgaTE4NywgIGkxODgsICBpMTg5LAorLi4uICAgaTE5MCwgIGkxOTEsICBpMTkyLCAgaTE5MywgIGkxOTQsICBpMTk1LCAgaTE5NiwgIGkxOTcsICBpMTk4LAorLi4uICAgaTE5OSwgIGkyMDAsICBpMjAxLCAgaTIwMiwgIGkyMDMsICBpMjA0LCAgaTIwNSwgIGkyMDYsICBpMjA3LAorLi4uICAgaTIwOCwgIGkyMDksICBpMjEwLCAgaTIxMSwgIGkyMTIsICBpMjEzLCAgaTIxNCwgIGkyMTUsICBpMjE2LAorLi4uICAgaTIxNywgIGkyMTgsICBpMjE5LCAgaTIyMCwgIGkyMjEsICBpMjIyLCAgaTIyMywgIGkyMjQsICBpMjI1LAorLi4uICAgaTIyNiwgIGkyMjcsICBpMjI4LCAgaTIyOSwgIGkyMzAsICBpMjMxLCAgaTIzMiwgIGkyMzMsICBpMjM0LAorLi4uICAgaTIzNSwgIGkyMzYsICBpMjM3LCAgaTIzOCwgIGkyMzksICBpMjQwLCAgaTI0MSwgIGkyNDIsICBpMjQzLAorLi4uICAgaTI0NCwgIGkyNDUsICBpMjQ2LCAgaTI0NywgIGkyNDgsICBpMjQ5LCAgaTI1MCwgIGkyNTEsICBpMjUyLAorLi4uICAgaTI1MywgIGkyNTQsICBpMjU1KQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI1XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBtb3JlIHRoYW4gMjU1IGFyZ3VtZW50cworCitUaGUgYWN0dWFsIGVycm9yIGNhc2VzIGNvdW50cyBwb3NpdGlvbmFsIGFyZ3VtZW50cywga2V5d29yZCBhcmd1bWVudHMsCithbmQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gYXJndW1lbnRzIHNlcGFyYXRlbHkuICBUaGlzIHRlc3QgY29tYmluZXMgdGhlCit0aHJlZS4KKworPj4+IGYoaTAsICBpMSwgIGkyLCAgaTMsICBpNCwgIGk1LCAgaTYsICBpNywgIGk4LCAgaTksICBpMTAsICBpMTEsCisuLi4gICBpMTIsICBpMTMsICBpMTQsICBpMTUsICBpMTYsICBpMTcsICBpMTgsICBpMTksICBpMjAsICBpMjEsICBpMjIsCisuLi4gICBpMjMsICBpMjQsICBpMjUsICBpMjYsICBpMjcsICBpMjgsICBpMjksICBpMzAsICBpMzEsICBpMzIsICBpMzMsCisuLi4gICBpMzQsICBpMzUsICBpMzYsICBpMzcsICBpMzgsICBpMzksICBpNDAsICBpNDEsICBpNDIsICBpNDMsICBpNDQsCisuLi4gICBpNDUsICBpNDYsICBpNDcsICBpNDgsICBpNDksICBpNTAsICBpNTEsICBpNTIsICBpNTMsICBpNTQsICBpNTUsCisuLi4gICBpNTYsICBpNTcsICBpNTgsICBpNTksICBpNjAsICBpNjEsICBpNjIsICBpNjMsICBpNjQsICBpNjUsICBpNjYsCisuLi4gICBpNjcsICBpNjgsICBpNjksICBpNzAsICBpNzEsICBpNzIsICBpNzMsICBpNzQsICBpNzUsICBpNzYsICBpNzcsCisuLi4gICBpNzgsICBpNzksICBpODAsICBpODEsICBpODIsICBpODMsICBpODQsICBpODUsICBpODYsICBpODcsICBpODgsCisuLi4gICBpODksICBpOTAsICBpOTEsICBpOTIsICBpOTMsICBpOTQsICBpOTUsICBpOTYsICBpOTcsICBpOTgsICBpOTksCisuLi4gICBpMTAwLCAgaTEwMSwgIGkxMDIsICBpMTAzLCAgaTEwNCwgIGkxMDUsICBpMTA2LCAgaTEwNywgIGkxMDgsCisuLi4gICBpMTA5LCAgaTExMCwgIGkxMTEsICBpMTEyLCAgaTExMywgIGkxMTQsICBpMTE1LCAgaTExNiwgIGkxMTcsCisuLi4gICBpMTE4LCAgaTExOSwgIGkxMjAsICBpMTIxLCAgaTEyMiwgIGkxMjMsICBpMTI0LCAgaTEyNSwgIGkxMjYsCisuLi4gICBpMTI3LCAgaTEyOCwgIGkxMjksICBpMTMwLCAgaTEzMSwgIGkxMzIsICBpMTMzLCAgaTEzNCwgIGkxMzUsCisuLi4gICBpMTM2LCAgaTEzNywgIGkxMzgsICBpMTM5LCAgaTE0MCwgIGkxNDEsICBpMTQyLCAgaTE0MywgIGkxNDQsCisuLi4gICBpMTQ1LCAgaTE0NiwgIGkxNDcsICBpMTQ4LCAgaTE0OSwgIGkxNTAsICBpMTUxLCAgaTE1MiwgIGkxNTMsCisuLi4gICBpMTU0LCAgaTE1NSwgIGkxNTYsICBpMTU3LCAgaTE1OCwgIGkxNTksICBpMTYwLCAgaTE2MSwgIGkxNjIsCisuLi4gICBpMTYzLCAgaTE2NCwgIGkxNjUsICBpMTY2LCAgaTE2NywgIGkxNjgsICBpMTY5LCAgaTE3MCwgIGkxNzEsCisuLi4gICBpMTcyLCAgaTE3MywgIGkxNzQsICBpMTc1LCAgaTE3NiwgIGkxNzcsICBpMTc4LCAgaTE3OSwgIGkxODAsCisuLi4gICBpMTgxLCAgaTE4MiwgIGkxODMsICBpMTg0LCAgaTE4NSwgIGkxODYsICBpMTg3LCAgaTE4OCwgIGkxODksCisuLi4gICBpMTkwLCAgaTE5MSwgIGkxOTIsICBpMTkzLCAgaTE5NCwgIGkxOTUsICBpMTk2LCAgaTE5NywgIGkxOTgsCisuLi4gICBpMTk5LCAgaTIwMCwgIGkyMDEsICBpMjAyLCAgaTIwMywgIGkyMDQsICBpMjA1LCAgaTIwNiwgIGkyMDcsCisuLi4gICBpMjA4LCAgaTIwOSwgIGkyMTAsICBpMjExLCAgaTIxMiwgIGkyMTMsICBpMjE0LCAgaTIxNSwgIGkyMTYsCisuLi4gICBpMjE3LCAgaTIxOCwgIGkyMTksICBpMjIwLCAgaTIyMSwgIGkyMjIsICBpMjIzLCAgaTIyNCwgIGkyMjUsCisuLi4gICBpMjI2LCAgaTIyNywgIGkyMjgsICBpMjI5LCAgaTIzMCwgIGkyMzEsICBpMjMyLCAgaTIzMywgIGkyMzQsCisuLi4gICBpMjM1LCBpMjM2LCAgaTIzNywgIGkyMzgsICBpMjM5LCAgaTI0MCwgIGkyNDEsICBpMjQyLCAgaTI0MywKKy4uLiAgICh4IGZvciB4IGluIGkyNDQpLCAgaTI0NSwgIGkyNDYsICBpMjQ3LCAgaTI0OCwgIGkyNDksICBpMjUwLCAgaTI1MSwKKy4uLiAgICBpMjUyPTEsIGkyNTM9MSwgIGkyNTQ9MSwgIGkyNTU9MSkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFsyNl0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogbW9yZSB0aGFuIDI1NSBhcmd1bWVudHMKKworPj4+IGYobGFtYmRhIHg6IHhbMF0gPSAzKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI3XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBsYW1iZGEgY2Fubm90IGNvbnRhaW4gYXNzaWdubWVudAorCitUaGUgZ3JhbW1hciBhY2NlcHRzIGFueSB0ZXN0IChiYXNpY2FsbHksIGFueSBleHByZXNzaW9uKSBpbiB0aGUKK2tleXdvcmQgc2xvdCBvZiBhIGNhbGwgc2l0ZS4gIFRlc3QgYSBmZXcgZGlmZmVyZW50IG9wdGlvbnMuCisKKz4+PiBmKHgoKT0yKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI4XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBrZXl3b3JkIGNhbid0IGJlIGFuIGV4cHJlc3Npb24KKz4+PiBmKGEgb3IgYj0xKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzI5XT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBrZXl3b3JkIGNhbid0IGJlIGFuIGV4cHJlc3Npb24KKz4+PiBmKHgueT0xKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzMwXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBrZXl3b3JkIGNhbid0IGJlIGFuIGV4cHJlc3Npb24KKworCitNb3JlIHNldF9jb250ZXh0KCk6CisKKz4+PiAoeCBmb3IgeCBpbiB4KSArPSAxCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzFdPiIsIGxpbmUgMQorU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBnZW5lcmF0b3IgZXhwcmVzc2lvbgorPj4+IE5vbmUgKz0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzMyXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW5ub3QgYXNzaWduIHRvIE5vbmUKKz4+PiBmKCkgKz0gMQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzMzXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbAorCisKK1Rlc3QgY29udGludWUgaW4gZmluYWxseSBpbiB3ZWlyZCBjb21iaW5hdGlvbnMuCisKK2NvbnRpbnVlIGluIGZvciBsb29wIHVuZGVyIGZpbmFsbHkgc2hvdWxkIGJlIG9rLgorCisgICAgPj4+IGRlZiB0ZXN0KCk6CisgICAgLi4uICAgICB0cnk6CisgICAgLi4uICAgICAgICAgcGFzcworICAgIC4uLiAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICBmb3IgYWJjIGluIHJhbmdlKDEwKToKKyAgICAuLi4gICAgICAgICAgICAgY29udGludWUKKyAgICAuLi4gICAgIHByaW50IGFiYworICAgID4+PiB0ZXN0KCkKKyAgICA5CisKK1N0YXJ0IHNpbXBsZSwgYSBjb250aW51ZSBpbiBhIGZpbmFsbHkgc2hvdWxkIG5vdCBiZSBhbGxvd2VkLgorCisgICAgPj4+IGRlZiB0ZXN0KCk6CisgICAgLi4uICAgIGZvciBhYmMgaW4gcmFuZ2UoMTApOgorICAgIC4uLiAgICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzZdPiIsIGxpbmUgNgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UKKworVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbnRpbnVlIGluIGEgZmluYWxseSB3aGljaCBzaG91bGQgbm90IGJlIGFsbG93ZWQuCisKKyAgICA+Pj4gZGVmIHRlc3QoKToKKyAgICAuLi4gICAgZm9yIGFiYyBpbiByYW5nZSgxMCk6CisgICAgLi4uICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICAgZmluYWxseToKKyAgICAuLi4gICAgICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgLi4uICAgICAgICAgICAgZXhjZXB0OgorICAgIC4uLiAgICAgICAgICAgICAgICBwYXNzCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzM3XT4iLCBsaW5lIDYKKyAgICBTeW50YXhFcnJvcjogJ2NvbnRpbnVlJyBub3Qgc3VwcG9ydGVkIGluc2lkZSAnZmluYWxseScgY2xhdXNlCisKKyAgICA+Pj4gZGVmIGZvbygpOgorICAgIC4uLiAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgIGZpbmFsbHk6CisgICAgLi4uICAgICAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzhdPiIsIGxpbmUgNQorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UKKworICAgID4+PiBkZWYgZm9vKCk6CisgICAgLi4uICAgICBmb3IgYSBpbiAoKToKKyAgICAuLi4gICAgICAgdHJ5OgorICAgIC4uLiAgICAgICAgICAgcGFzcworICAgIC4uLiAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbMzldPiIsIGxpbmUgNgorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UKKworICAgID4+PiBkZWYgZm9vKCk6CisgICAgLi4uICAgICBmb3IgYSBpbiAoKToKKyAgICAuLi4gICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgIHBhc3MKKyAgICAuLi4gICAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgICB0cnk6CisgICAgLi4uICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgIC4uLiAgICAgICAgICAgICBmaW5hbGx5OgorICAgIC4uLiAgICAgICAgICAgICAgICAgcGFzcworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0MF0+IiwgbGluZSA3CisgICAgU3ludGF4RXJyb3I6ICdjb250aW51ZScgbm90IHN1cHBvcnRlZCBpbnNpZGUgJ2ZpbmFsbHknIGNsYXVzZQorCisgICAgPj4+IGRlZiBmb28oKToKKyAgICAuLi4gIGZvciBhIGluICgpOgorICAgIC4uLiAgIHRyeTogcGFzcworICAgIC4uLiAgIGZpbmFsbHk6CisgICAgLi4uICAgIHRyeToKKyAgICAuLi4gICAgIHBhc3MKKyAgICAuLi4gICAgZXhjZXB0OgorICAgIC4uLiAgICAgY29udGludWUKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNDFdPiIsIGxpbmUgOAorICAgIFN5bnRheEVycm9yOiAnY29udGludWUnIG5vdCBzdXBwb3J0ZWQgaW5zaWRlICdmaW5hbGx5JyBjbGF1c2UKKworVGhlcmUgaXMgb25lIHRlc3QgZm9yIGEgYnJlYWsgdGhhdCBpcyBub3QgaW4gYSBsb29wLiAgVGhlIGNvbXBpbGVyCit1c2VzIGEgc2luZ2xlIGRhdGEgc3RydWN0dXJlIHRvIGtlZXAgdHJhY2sgb2YgdHJ5LWZpbmFsbHkgYW5kIGxvb3BzLAorc28gd2UgbmVlZCB0byBiZSBzdXJlIHRoYXQgYSBicmVhayBpcyBhY3R1YWxseSBpbnNpZGUgYSBsb29wLiAgSWYgaXQKK2lzbid0LCB0aGVyZSBzaG91bGQgYmUgYSBzeW50YXggZXJyb3IuCisKKyAgID4+PiB0cnk6CisgICAuLi4gICAgIHByaW50IDEKKyAgIC4uLiAgICAgYnJlYWsKKyAgIC4uLiAgICAgcHJpbnQgMgorICAgLi4uIGZpbmFsbHk6CisgICAuLi4gICAgIHByaW50IDMKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNDJdPiIsIGxpbmUgMworICAgU3ludGF4RXJyb3I6ICdicmVhaycgb3V0c2lkZSBsb29wCisKK1RoaXMgc2hvdWxkIHByb2JhYmx5IHJhaXNlIGEgYmV0dGVyIGVycm9yIHRoYW4gYSBTeXN0ZW1FcnJvciAob3Igbm9uZSBhdCBhbGwpLgorSW4gMi41IHRoZXJlIHdhcyBhIG1pc3NpbmcgZXhjZXB0aW9uIGFuZCBhbiBhc3NlcnQgd2FzIHRyaWdnZXJlZCBpbiBhIGRlYnVnCitidWlsZC4gIFRoZSBudW1iZXIgb2YgYmxvY2tzIG11c3QgYmUgZ3JlYXRlciB0aGFuIENPX01BWEJMT0NLUy4gIFNGICMxNTY1NTE0CisKKyAgID4+PiB3aGlsZSAxOgorICAgLi4uICB3aGlsZSAyOgorICAgLi4uICAgd2hpbGUgMzoKKyAgIC4uLiAgICB3aGlsZSA0OgorICAgLi4uICAgICB3aGlsZSA1OgorICAgLi4uICAgICAgd2hpbGUgNjoKKyAgIC4uLiAgICAgICB3aGlsZSA4OgorICAgLi4uICAgICAgICB3aGlsZSA5OgorICAgLi4uICAgICAgICAgd2hpbGUgMTA6CisgICAuLi4gICAgICAgICAgd2hpbGUgMTE6CisgICAuLi4gICAgICAgICAgIHdoaWxlIDEyOgorICAgLi4uICAgICAgICAgICAgd2hpbGUgMTM6CisgICAuLi4gICAgICAgICAgICAgd2hpbGUgMTQ6CisgICAuLi4gICAgICAgICAgICAgIHdoaWxlIDE1OgorICAgLi4uICAgICAgICAgICAgICAgd2hpbGUgMTY6CisgICAuLi4gICAgICAgICAgICAgICAgd2hpbGUgMTc6CisgICAuLi4gICAgICAgICAgICAgICAgIHdoaWxlIDE4OgorICAgLi4uICAgICAgICAgICAgICAgICAgd2hpbGUgMTk6CisgICAuLi4gICAgICAgICAgICAgICAgICAgd2hpbGUgMjA6CisgICAuLi4gICAgICAgICAgICAgICAgICAgIHdoaWxlIDIxOgorICAgLi4uICAgICAgICAgICAgICAgICAgICAgd2hpbGUgMjI6CisgICAuLi4gICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICBTeXN0ZW1FcnJvcjogdG9vIG1hbnkgc3RhdGljYWxseSBuZXN0ZWQgYmxvY2tzCisKK1RoaXMgdGVzdHMgYXNzaWdubWVudC1jb250ZXh0OyB0aGVyZSB3YXMgYSBidWcgaW4gUHl0aG9uIDIuNSB3aGVyZSBjb21waWxpbmcKK2EgY29tcGxleCAnaWYnIChvbmUgd2l0aCAnZWxpZicpIHdvdWxkIGZhaWwgdG8gbm90aWNlIGFuIGludmFsaWQgc3VpdGUsCitsZWFkaW5nIHRvIHNwdXJpb3VzIGVycm9ycy4KKworICAgPj4+IGlmIDE6CisgICAuLi4gICB4KCkgPSAxCisgICAuLi4gZWxpZiAxOgorICAgLi4uICAgcGFzcworICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0NF0+IiwgbGluZSAyCisgICBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGZ1bmN0aW9uIGNhbGwKKworICAgPj4+IGlmIDE6CisgICAuLi4gICBwYXNzCisgICAuLi4gZWxpZiAxOgorICAgLi4uICAgeCgpID0gMQorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0NV0+IiwgbGluZSA0CisgICBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGZ1bmN0aW9uIGNhbGwKKworICAgPj4+IGlmIDE6CisgICAuLi4gICB4KCkgPSAxCisgICAuLi4gZWxpZiAxOgorICAgLi4uICAgcGFzcworICAgLi4uIGVsc2U6CisgICAuLi4gICBwYXNzCisgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgIC4uLgorICAgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzQ2XT4iLCBsaW5lIDIKKyAgIFN5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gZnVuY3Rpb24gY2FsbAorCisgICA+Pj4gaWYgMToKKyAgIC4uLiAgIHBhc3MKKyAgIC4uLiBlbGlmIDE6CisgICAuLi4gICB4KCkgPSAxCisgICAuLi4gZWxzZToKKyAgIC4uLiAgIHBhc3MKKyAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgLi4uCisgICAgIEZpbGUgIjxkb2N0ZXN0IHRlc3QudGVzdF9zeW50YXhbNDddPiIsIGxpbmUgNAorICAgU3ludGF4RXJyb3I6IGNhbid0IGFzc2lnbiB0byBmdW5jdGlvbiBjYWxsCisKKyAgID4+PiBpZiAxOgorICAgLi4uICAgcGFzcworICAgLi4uIGVsaWYgMToKKyAgIC4uLiAgIHBhc3MKKyAgIC4uLiBlbHNlOgorICAgLi4uICAgeCgpID0gMQorICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAuLi4KKyAgICAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0OF0+IiwgbGluZSA2CisgICBTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIGZ1bmN0aW9uIGNhbGwKKworPj4+IGYoYT0yMywgYT0yMzQpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAuLi4KKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs0OV0+IiwgbGluZSAxCitTeW50YXhFcnJvcjoga2V5d29yZCBhcmd1bWVudCByZXBlYXRlZAorCis+Pj4gZGVsICgpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAuLi4KKyAgRmlsZSAiPGRvY3Rlc3QgdGVzdC50ZXN0X3N5bnRheFs1MF0+IiwgbGluZSAxCitTeW50YXhFcnJvcjogY2FuJ3QgZGVsZXRlICgpCisKKz4+PiB7MSwgMiwgM30gPSA0MgorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgLi4uCisgICBGaWxlICI8ZG9jdGVzdCB0ZXN0LnRlc3Rfc3ludGF4WzUwXT4iLCBsaW5lIDEKK1N5bnRheEVycm9yOiBjYW4ndCBhc3NpZ24gdG8gbGl0ZXJhbAorCitDb3JuZXItY2FzZSB0aGF0IHVzZWQgdG8gY3Jhc2g6CisKKyAgICA+Pj4gZGVmIGYoKnh4LCAqKl9fZGVidWdfXyk6IHBhc3MKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgU3ludGF4RXJyb3I6IGNhbm5vdCBhc3NpZ24gdG8gX19kZWJ1Z19fCisKKyIiIgorCitpbXBvcnQgcmUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHdhcm5pbmdzCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFN5bnRheFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfY2hlY2tfZXJyb3Ioc2VsZiwgY29kZSwgZXJydGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSI8dGVzdGNhc2U+IiwgbW9kZT0iZXhlYyIsIHN1YmNsYXNzPU5vbmUpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGNvbXBpbGluZyBjb2RlIHJhaXNlcyBTeW50YXhFcnJvciB3aXRoIGVycnRleHQuCisKKyAgICAgICAgZXJydGVzdCBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG11c3QgYmUgcHJlc2VudCBpbiB0aGUKKyAgICAgICAgdGVzdCBvZiB0aGUgZXhjZXB0aW9uIHJhaXNlZC4gIElmIHN1YmNsYXNzIGlzIHNwZWNpZmllZCBpdAorICAgICAgICBpcyB0aGUgZXhwZWN0ZWQgc3ViY2xhc3Mgb2YgU3ludGF4RXJyb3IgKGUuZy4gSW5kZW50YXRpb25FcnJvcikuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb21waWxlKGNvZGUsIGZpbGVuYW1lLCBtb2RlKQorICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IsIGVycjoKKyAgICAgICAgICAgIGlmIHN1YmNsYXNzIGFuZCBub3QgaXNpbnN0YW5jZShlcnIsIHN1YmNsYXNzKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlN5bnRheEVycm9yIGlzIG5vdCBhICVzIiAlIHN1YmNsYXNzLl9fbmFtZV9fKQorICAgICAgICAgICAgbW8gPSByZS5zZWFyY2goZXJydGV4dCwgc3RyKGVycikpCisgICAgICAgICAgICBpZiBtbyBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXMgZGlkIG5vdCBjb250YWluICclciciICUgKGVyciwgZXJydGV4dCwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJjb21waWxlKCkgZGlkIG5vdCByYWlzZSBTeW50YXhFcnJvciIpCisKKyAgICBkZWYgdGVzdF9wYXJlbl9hcmdfd2l0aF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19lcnJvcigiZGVmIGYoKHgpPTIzKTogcGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJlbnRoZXNpemVkIGFyZyB3aXRoIGRlZmF1bHQiKQorCisgICAgZGVmIHRlc3RfYXNzaWduX2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKCJmKCkgPSAxIiwgImFzc2lnbiIpCisKKyAgICBkZWYgdGVzdF9hc3NpZ25fZGVsKHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19lcnJvcigiZGVsIGYoKSIsICJkZWxldGUiKQorCisgICAgZGVmIHRlc3RfZ2xvYmFsX2Vycl90aGVuX3dhcm4oc2VsZik6CisgICAgICAgICMgQnVnIHRpY2tsZXI6ICBUaGUgU3ludGF4RXJyb3IgcmFpc2VkIGZvciBvbmUgZ2xvYmFsIHN0YXRlbWVudAorICAgICAgICAjIHNob3VsZG4ndCBiZSBjbG9iYmVyZWQgYnkgYSBTeW50YXhXYXJuaW5nIGlzc3VlZCBmb3IgYSBsYXRlciBvbmUuCisgICAgICAgIHNvdXJjZSA9IHJlLnN1YignKD9tKV4gKjonLCAnJywgIiIiXAorICAgICAgICAgICAgOmRlZiBlcnJvcihhKToKKyAgICAgICAgICAgIDogICAgZ2xvYmFsIGEgICMgU3ludGF4RXJyb3IKKyAgICAgICAgICAgIDpkZWYgd2FybmluZygpOgorICAgICAgICAgICAgOiAgICBiID0gMQorICAgICAgICAgICAgOiAgICBnbG9iYWwgYiAgIyBTeW50YXhXYXJuaW5nCisgICAgICAgICAgICA6IiIiKQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncyhhY3Rpb249J2lnbm9yZScsIGNhdGVnb3J5PVN5bnRheFdhcm5pbmcpCisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKHNvdXJjZSwgImdsb2JhbCIpCisgICAgICAgIHdhcm5pbmdzLmZpbHRlcnMucG9wKDApCisKKyAgICBkZWYgdGVzdF9icmVha19vdXRzaWRlX2xvb3Aoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKCJicmVhayIsICJvdXRzaWRlIGxvb3AiKQorCisgICAgZGVmIHRlc3RfZGVsZXRlX2RlcmVmKHNlbGYpOgorICAgICAgICBzb3VyY2UgPSByZS5zdWIoJyg/bSleICo6JywgJycsICIiIlwKKyAgICAgICAgICAgIDpkZWYgZm9vKHgpOgorICAgICAgICAgICAgOiAgZGVmIGJhcigpOgorICAgICAgICAgICAgOiAgICBwcmludCB4CisgICAgICAgICAgICA6ICBkZWwgeAorICAgICAgICAgICAgOiIiIikKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3Ioc291cmNlLCAibmVzdGVkIHNjb3BlIikKKworICAgIGRlZiB0ZXN0X3VuZXhwZWN0ZWRfaW5kZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jaGVja19lcnJvcigiZm9vKClcbiBiYXIoKVxuIiwgInVuZXhwZWN0ZWQgaW5kZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY2xhc3M9SW5kZW50YXRpb25FcnJvcikKKworICAgIGRlZiB0ZXN0X25vX2luZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3IoImlmIDE6XG5mb28oKSIsICJleHBlY3RlZCBhbiBpbmRlbnRlZCBibG9jayIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzPUluZGVudGF0aW9uRXJyb3IpCisKKyAgICBkZWYgdGVzdF9iYWRfb3V0ZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fY2hlY2tfZXJyb3IoImlmIDE6XG4gIGZvbygpXG4gYmFyKCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pbmRlbnQgZG9lcyBub3QgbWF0Y2ggLiogbGV2ZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjbGFzcz1JbmRlbnRhdGlvbkVycm9yKQorCisgICAgZGVmIHRlc3Rfa3dhcmdzX2xhc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX2NoZWNrX2Vycm9yKCJpbnQoYmFzZT0xMCwgJzInKSIsICJub24ta2V5d29yZCBhcmciKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTeW50YXhUZXN0Q2FzZSkKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3ludGF4CisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygoImJhY2txdW90ZSBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheFdhcm5pbmcpKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3Rfc3ludGF4LCB2ZXJib3NpdHk9VHJ1ZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bnRheC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhOTRmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bnRheC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3ludGF4LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bnRheC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhOTRmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5bnRheC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZWE2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXMucHkKQEAgLTAsMCArMSw3NzYgQEAKKyMgLSotIGNvZGluZzogaXNvLTg4NTktMSAtKi0KK2ltcG9ydCB1bml0dGVzdCwgdGVzdC50ZXN0X3N1cHBvcnQKK2ltcG9ydCBzeXMsIG9zLCBjU3RyaW5nSU8KK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBvcGVyYXRvcgorCitjbGFzcyBTeXNNb2R1bGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKKyAgICBkZWYgdGVzdF9vcmlnaW5hbF9kaXNwbGF5aG9vayhzZWxmKToKKyAgICAgICAgaW1wb3J0IF9fYnVpbHRpbl9fCisgICAgICAgIHNhdmVzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIG91dCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN5cy5zdGRvdXQgPSBvdXQKKworICAgICAgICBkaCA9IHN5cy5fX2Rpc3BsYXlob29rX18KKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRoKQorICAgICAgICBpZiBoYXNhdHRyKF9fYnVpbHRpbl9fLCAiXyIpOgorICAgICAgICAgICAgZGVsIF9fYnVpbHRpbl9fLl8KKworICAgICAgICBkaChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKF9fYnVpbHRpbl9fLCAiXyIpKQorICAgICAgICBkaCg0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuZ2V0dmFsdWUoKSwgIjQyXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKF9fYnVpbHRpbl9fLl8sIDQyKQorCisgICAgICAgIGRlbCBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZGgsIDQyKQorCisgICAgICAgIHN5cy5zdGRvdXQgPSBzYXZlc3Rkb3V0CisKKyAgICBkZWYgdGVzdF9sb3N0X2Rpc3BsYXlob29rKHNlbGYpOgorICAgICAgICBvbGRkaXNwbGF5aG9vayA9IHN5cy5kaXNwbGF5aG9vaworICAgICAgICBkZWwgc3lzLmRpc3BsYXlob29rCisgICAgICAgIGNvZGUgPSBjb21waWxlKCI0MiIsICI8c3RyaW5nPiIsICJzaW5nbGUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGV2YWwsIGNvZGUpCisgICAgICAgIHN5cy5kaXNwbGF5aG9vayA9IG9sZGRpc3BsYXlob29rCisKKyAgICBkZWYgdGVzdF9jdXN0b21fZGlzcGxheWhvb2soc2VsZik6CisgICAgICAgIG9sZGRpc3BsYXlob29rID0gc3lzLmRpc3BsYXlob29rCisgICAgICAgIGRlZiBiYWRkaXNwbGF5aG9vayhvYmopOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBzeXMuZGlzcGxheWhvb2sgPSBiYWRkaXNwbGF5aG9vaworICAgICAgICBjb2RlID0gY29tcGlsZSgiNDIiLCAiPHN0cmluZz4iLCAic2luZ2xlIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZXZhbCwgY29kZSkKKyAgICAgICAgc3lzLmRpc3BsYXlob29rID0gb2xkZGlzcGxheWhvb2sKKworICAgIGRlZiB0ZXN0X29yaWdpbmFsX2V4Y2VwdGhvb2soc2VsZik6CisgICAgICAgIHNhdmVzdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIGVyciA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN5cy5zdGRlcnIgPSBlcnIKKworICAgICAgICBlaCA9IHN5cy5fX2V4Y2VwdGhvb2tfXworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZWgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoNDIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBleGM6CisgICAgICAgICAgICBlaCgqc3lzLmV4Y19pbmZvKCkpCisKKyAgICAgICAgc3lzLnN0ZGVyciA9IHNhdmVzdGRlcnIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyci5nZXR2YWx1ZSgpLmVuZHN3aXRoKCJWYWx1ZUVycm9yOiA0MlxuIikpCisKKyAgICAjIEZJWE1FOiB0ZXN0aW5nIHRoZSBjb2RlIGZvciBhIGxvc3Qgb3IgcmVwbGFjZWQgZXhjZXB0aG9vayBpbgorICAgICMgUHl0aG9uL3B5dGhvbnJ1bi5jOjpQeUVycl9QcmludEV4KCkgaXMgdHJpY2t5LgorCisgICAgZGVmIHRlc3RfZXhjX2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5leGNfY2xlYXIsIDQyKQorCisgICAgICAgICMgVmVyaWZ5IHRoYXQgZXhjX2luZm8gaXMgcHJlc2VudCBhbmQgbWF0Y2hlcyBleGMsIHRoZW4gY2xlYXIgaXQsIGFuZAorICAgICAgICAjIGNoZWNrIHRoYXQgaXQgd29ya2VkLgorICAgICAgICBkZWYgY2xlYXJfY2hlY2soZXhjKToKKyAgICAgICAgICAgIHR5cCwgdmFsdWUsIHRyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwIGlzIG5vdCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGlzIGV4YykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0cmFjZWJhY2sgaXMgbm90IE5vbmUpCisKKyAgICAgICAgICAgIHdpdGggdGVzdC50ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIHN5cy5leGNfY2xlYXIoKQorCisgICAgICAgICAgICB0eXAsIHZhbHVlLCB0cmFjZWJhY2sgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cCBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHJhY2ViYWNrIGlzIE5vbmUpCisKKyAgICAgICAgZGVmIGNsZWFyKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgNDIKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBleGM6CisgICAgICAgICAgICAgICAgY2xlYXJfY2hlY2soZXhjKQorCisgICAgICAgICMgUmFpc2UgYW4gZXhjZXB0aW9uIGFuZCBjaGVjayB0aGF0IGl0IGNhbiBiZSBjbGVhcmVkCisgICAgICAgIGNsZWFyKCkKKworICAgICAgICAjIFZlcmlmeSB0aGF0IGEgZnJhbWUgY3VycmVudGx5IGhhbmRsaW5nIGFuIGV4Y2VwdGlvbiBpcworICAgICAgICAjIHVuYWZmZWN0ZWQgYnkgY2FsbGluZyBleGNfY2xlYXIgaW4gYSBuZXN0ZWQgZnJhbWUuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIDEzCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBleGM6CisgICAgICAgICAgICB0eXAxLCB2YWx1ZTEsIHRyYWNlYmFjazEgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgY2xlYXIoKQorICAgICAgICAgICAgdHlwMiwgdmFsdWUyLCB0cmFjZWJhY2syID0gc3lzLmV4Y19pbmZvKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cDEgaXMgdHlwMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWx1ZTEgaXMgZXhjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlMSBpcyB2YWx1ZTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHJhY2ViYWNrMSBpcyB0cmFjZWJhY2syKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCBhbiBleGNlcHRpb24gY2FuIGJlIGNsZWFyZWQgb3V0c2lkZSBvZiBhbiBleGNlcHQgYmxvY2sKKyAgICAgICAgY2xlYXJfY2hlY2soZXhjKQorCisgICAgZGVmIHRlc3RfZXhpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuZXhpdCwgNDIsIDQyKQorCisgICAgICAgICMgY2FsbCB3aXRob3V0IGFyZ3VtZW50CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCBleGM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Yy5jb2RlLCAwKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgIyBjYWxsIHdpdGggdHVwbGUgYXJndW1lbnQgd2l0aCBvbmUgZW50cnkKKyAgICAgICAgIyBlbnRyeSB3aWxsIGJlIHVucGFja2VkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5leGl0KDQyKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgZXhjOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMuY29kZSwgNDIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICAjIGNhbGwgd2l0aCBpbnRlZ2VyIGFyZ3VtZW50CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5leGl0KCg0MiwpKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgZXhjOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMuY29kZSwgNDIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgZXhjZXB0aW9uIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibm8gZXhjZXB0aW9uIikKKworICAgICAgICAjIGNhbGwgd2l0aCBzdHJpbmcgYXJndW1lbnQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLmV4aXQoImV4aXQiKQorICAgICAgICBleGNlcHQgU3lzdGVtRXhpdCwgZXhjOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMuY29kZSwgImV4aXQiKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgIyBjYWxsIHdpdGggdHVwbGUgYXJndW1lbnQgd2l0aCB0d28gZW50cmllcworICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuZXhpdCgoMTcsIDIzKSkKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQsIGV4YzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjLmNvZGUsICgxNywgMjMpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGV4Y2VwdGlvbiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIm5vIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgIyB0ZXN0IHRoYXQgdGhlIGV4aXQgbWFjaGluZXJ5IGhhbmRsZXMgU3lzdGVtRXhpdHMgcHJvcGVybHkKKyAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgIyBib3RoIHVubm9ybWFsaXplZC4uLgorICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFpc2UgU3lzdGVtRXhpdCwgNDYiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgNDYpCisgICAgICAgICMgLi4uIGFuZCBub3JtYWxpemVkCisgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyYWlzZSBTeXN0ZW1FeGl0KDQ3KSJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJjLCA0NykKKworICAgICAgICBkZWYgY2hlY2tfZXhpdF9tZXNzYWdlKGNvZGUsIGV4cGVjdGVkLCBlbnY9Tm9uZSk6CisgICAgICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsIGNvZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSwgZW52PWVudikKKyAgICAgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2Nlc3MucmV0dXJuY29kZSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdGRlcnIuc3RhcnRzd2l0aChleHBlY3RlZCksCisgICAgICAgICAgICAgICAgIiVzIGRvZXNuJ3Qgc3RhcnQgd2l0aCAlcyIgJSAocmVwcihzdGRlcnIpLCByZXByKGV4cGVjdGVkKSkpCisKKyAgICAgICAgIyB0ZXN0IHRoYXQgc3RkZXJyIGJ1ZmZlciBpZiBmbHVzaGVkIGJlZm9yZSB0aGUgZXhpdCBtZXNzYWdlIGlzIHdyaXR0ZW4KKyAgICAgICAgIyBpbnRvIHN0ZGVycgorICAgICAgICBjaGVja19leGl0X21lc3NhZ2UoCisgICAgICAgICAgICByJ2ltcG9ydCBzeXM7IHN5cy5zdGRlcnIud3JpdGUoInVuZmx1c2hlZCwiKTsgc3lzLmV4aXQoIm1lc3NhZ2UiKScsCisgICAgICAgICAgICBiInVuZmx1c2hlZCxtZXNzYWdlIikKKworICAgICAgICAjIHRlc3QgdGhhdCB0aGUgdW5pY29kZSBtZXNzYWdlIGlzIGVuY29kZWQgdG8gdGhlIHN0ZGVyciBlbmNvZGluZworICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBlbnZbJ1BZVEhPTklPRU5DT0RJTkcnXSA9ICdsYXRpbi0xJworICAgICAgICBjaGVja19leGl0X21lc3NhZ2UoCisgICAgICAgICAgICByJ2ltcG9ydCBzeXM7IHN5cy5leGl0KHUiaFx4ZTkiKScsCisgICAgICAgICAgICBiImhceGU5IiwgZW52PWVudikKKworICAgIGRlZiB0ZXN0X2dldGRlZmF1bHRlbmNvZGluZyhzZWxmKToKKyAgICAgICAgaWYgdGVzdC50ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nLCA0MikKKyAgICAgICAgICAgICMgY2FuJ3QgY2hlY2sgbW9yZSB0aGFuIHRoZSB0eXBlLCBhcyB0aGUgdXNlciBtaWdodCBoYXZlIGNoYW5nZWQgaXQKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCksIHN0cikKKworICAgICMgdGVzdGluZyBzeXMuc2V0dHJhY2UoKSBpcyBkb25lIGluIHRlc3Rfc3lzX3NldHRyYWNlLnB5CisgICAgIyB0ZXN0aW5nIHN5cy5zZXRwcm9maWxlKCkgaXMgZG9uZSBpbiB0ZXN0X3N5c19zZXRwcm9maWxlLnB5CisKKyAgICBkZWYgdGVzdF9zZXRjaGVja2ludGVydmFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5zZXRjaGVja2ludGVydmFsKQorICAgICAgICBvcmlnID0gc3lzLmdldGNoZWNraW50ZXJ2YWwoKQorICAgICAgICBmb3IgbiBpbiAwLCAxMDAsIDEyMCwgb3JpZzogIyBvcmlnIGxhc3QgdG8gcmVzdG9yZSBzdGFydGluZyBzdGF0ZQorICAgICAgICAgICAgc3lzLnNldGNoZWNraW50ZXJ2YWwobikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldGNoZWNraW50ZXJ2YWwoKSwgbikKKworICAgIGRlZiB0ZXN0X3JlY3Vyc2lvbmxpbWl0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5nZXRyZWN1cnNpb25saW1pdCwgNDIpCisgICAgICAgIG9sZGxpbWl0ID0gc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuc2V0cmVjdXJzaW9ubGltaXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN5cy5zZXRyZWN1cnNpb25saW1pdCwgLTQyKQorICAgICAgICBzeXMuc2V0cmVjdXJzaW9ubGltaXQoMTAwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHJlY3Vyc2lvbmxpbWl0KCksIDEwMDAwKQorICAgICAgICBzeXMuc2V0cmVjdXJzaW9ubGltaXQob2xkbGltaXQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgc3lzLnNldHJlY3Vyc2lvbmxpbWl0LCAxIDw8IDMxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc2V0cmVjdXJzaW9ubGltaXQoKDEgPDwgMzEpIC0gNSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIGlzc3VlMTM1NDY6IGlzaW5zdGFuY2UoZSwgVmFsdWVFcnJvcikgdXNlZCB0byBmYWlsCisgICAgICAgICAgICAgICAgIyB3aGVuIHRoZSByZWN1cnNpb24gbGltaXQgaXMgY2xvc2UgdG8gMTw8MzEKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zZXRyZWN1cnNpb25saW1pdChvbGRsaW1pdCkKKworICAgIGRlZiB0ZXN0X2dldHdpbmRvd3N2ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIFJhaXNlIFNraXBUZXN0IGlmIHN5cyBkb2Vzbid0IGhhdmUgZ2V0d2luZG93c3ZlcnNpb24gYXR0cmlidXRlCisgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LmdldF9hdHRyaWJ1dGUoc3lzLCAiZ2V0d2luZG93c3ZlcnNpb24iKQorICAgICAgICB2ID0gc3lzLmdldHdpbmRvd3N2ZXJzaW9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odiksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2WzBdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2WzFdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2WzJdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2WzNdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2WzRdLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIHYsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2Lm1ham9yLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2Lm1pbm9yLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2LmJ1aWxkLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2LnBsYXRmb3JtLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2LnNlcnZpY2VfcGFjaywgc3RyKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uodi5zZXJ2aWNlX3BhY2tfbWlub3IsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYuc2VydmljZV9wYWNrX21ham9yLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2LnN1aXRlX21hc2ssIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHYucHJvZHVjdF90eXBlLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodlswXSwgdi5tYWpvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2WzFdLCB2Lm1pbm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZbMl0sIHYuYnVpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodlszXSwgdi5wbGF0Zm9ybSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2WzRdLCB2LnNlcnZpY2VfcGFjaykKKworICAgICAgICAjIFRoaXMgaXMgaG93IHBsYXRmb3JtLnB5IGNhbGxzIGl0LiBNYWtlIHN1cmUgdHVwbGUKKyAgICAgICAgIyAgc3RpbGwgaGFzIDUgZWxlbWVudHMKKyAgICAgICAgbWFqLCBtaW4sIGJ1aWxkbm8sIHBsYXQsIGNzZCA9IHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpCisKKyAgICBkZWYgdGVzdF9kbG9wZW5mbGFncyhzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICJzZXRkbG9wZW5mbGFncyIpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc3lzLCAiZ2V0ZGxvcGVuZmxhZ3MiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmdldGRsb3BlbmZsYWdzLCA0MikKKyAgICAgICAgICAgIG9sZGZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLnNldGRsb3BlbmZsYWdzKQorICAgICAgICAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZGZsYWdzKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRkbG9wZW5mbGFncygpLCBvbGRmbGFncysxKQorICAgICAgICAgICAgc3lzLnNldGRsb3BlbmZsYWdzKG9sZGZsYWdzKQorCisgICAgZGVmIHRlc3RfcmVmY291bnQoc2VsZik6CisgICAgICAgICMgbiBoZXJlIG11c3QgYmUgYSBnbG9iYWwgaW4gb3JkZXIgZm9yIHRoaXMgdGVzdCB0byBwYXNzIHdoaWxlCisgICAgICAgICMgdHJhY2luZyB3aXRoIGEgcHl0aG9uIGZ1bmN0aW9uLiAgVHJhY2luZyBjYWxscyBQeUZyYW1lX0Zhc3RUb0xvY2FscworICAgICAgICAjIHdoaWNoIHdpbGwgYWRkIGEgY29weSBvZiBhbnkgbG9jYWxzIHRvIHRoZSBmcmFtZSBvYmplY3QsIGNhdXNpbmcKKyAgICAgICAgIyB0aGUgcmVmZXJlbmNlIGNvdW50IHRvIGluY3JlYXNlIGJ5IDIgaW5zdGVhZCBvZiAxLgorICAgICAgICBnbG9iYWwgbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5nZXRyZWZjb3VudCkKKyAgICAgICAgYyA9IHN5cy5nZXRyZWZjb3VudChOb25lKQorICAgICAgICBuID0gTm9uZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChOb25lKSwgYysxKQorICAgICAgICBkZWwgbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5nZXRyZWZjb3VudChOb25lKSwgYykKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLmdldHRvdGFscmVmY291bnQoKSwgaW50KQorCisgICAgZGVmIHRlc3RfZ2V0ZnJhbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLl9nZXRmcmFtZSwgNDIsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzeXMuX2dldGZyYW1lLCAyMDAwMDAwMDAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBTeXNNb2R1bGVUZXN0LnRlc3RfZ2V0ZnJhbWUuaW1fZnVuYy5mdW5jX2NvZGUgXAorICAgICAgICAgICAgaXMgc3lzLl9nZXRmcmFtZSgpLmZfY29kZQorICAgICAgICApCisKKyAgICAjIHN5cy5fY3VycmVudF9mcmFtZXMoKSBpcyBhIENQeXRob24tb25seSBnaW1taWNrLgorICAgIGRlZiB0ZXN0X2N1cnJlbnRfZnJhbWVzKHNlbGYpOgorICAgICAgICBoYXZlX3RocmVhZHMgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaGF2ZV90aHJlYWRzID0gRmFsc2UKKworICAgICAgICBpZiBoYXZlX3RocmVhZHM6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZnJhbWVzX3dpdGhfdGhyZWFkcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmN1cnJlbnRfZnJhbWVzX3dpdGhvdXRfdGhyZWFkcygpCisKKyAgICAjIFRlc3Qgc3lzLl9jdXJyZW50X2ZyYW1lcygpIGluIGEgV0lUSF9USFJFQURTIGJ1aWxkLgorICAgIEB0ZXN0LnRlc3Rfc3VwcG9ydC5yZWFwX3RocmVhZHMKKyAgICBkZWYgY3VycmVudF9mcmFtZXNfd2l0aF90aHJlYWRzKHNlbGYpOgorICAgICAgICBpbXBvcnQgdGhyZWFkaW5nLCB0aHJlYWQKKyAgICAgICAgaW1wb3J0IHRyYWNlYmFjaworCisgICAgICAgICMgU3Bhd24gYSB0aHJlYWQgdGhhdCBibG9ja3MgYXQgYSBrbm93biBwbGFjZS4gIFRoZW4gdGhlIG1haW4KKyAgICAgICAgIyB0aHJlYWQgZG9lcyBzeXMuX2N1cnJlbnRfZnJhbWVzKCksIGFuZCB2ZXJpZmllcyB0aGF0IHRoZSBmcmFtZXMKKyAgICAgICAgIyByZXR1cm5lZCBtYWtlIHNlbnNlLgorICAgICAgICBlbnRlcmVkX2cgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBsZWF2ZV9nID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgdGhyZWFkX2luZm8gPSBbXSAgIyB0aGUgdGhyZWFkJ3MgaWQKKworICAgICAgICBkZWYgZjEyMygpOgorICAgICAgICAgICAgZzQ1NigpCisKKyAgICAgICAgZGVmIGc0NTYoKToKKyAgICAgICAgICAgIHRocmVhZF9pbmZvLmFwcGVuZCh0aHJlYWQuZ2V0X2lkZW50KCkpCisgICAgICAgICAgICBlbnRlcmVkX2cuc2V0KCkKKyAgICAgICAgICAgIGxlYXZlX2cud2FpdCgpCisKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWYxMjMpCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBlbnRlcmVkX2cud2FpdCgpCisKKyAgICAgICAgIyBBdCB0aGlzIHBvaW50LCB0IGhhcyBmaW5pc2hlZCBpdHMgZW50ZXJlZF9nLnNldCgpLCBhbHRob3VnaCBpdCdzCisgICAgICAgICMgaW1wb3NzaWJsZSB0byBndWVzcyB3aGV0aGVyIGl0J3Mgc3RpbGwgb24gdGhhdCBsaW5lIG9yIGhhcyBtb3ZlZCBvbgorICAgICAgICAjIHRvIGl0cyBsZWF2ZV9nLndhaXQoKS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGhyZWFkX2luZm8pLCAxKQorICAgICAgICB0aHJlYWRfaWQgPSB0aHJlYWRfaW5mb1swXQorCisgICAgICAgIGQgPSBzeXMuX2N1cnJlbnRfZnJhbWVzKCkKKworICAgICAgICBtYWluX2lkID0gdGhyZWFkLmdldF9pZGVudCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obWFpbl9pZCwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih0aHJlYWRfaWQsIGQpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgY2FwdHVyZWQgbWFpbi10aHJlYWQgZnJhbWUgaXMgX3RoaXNfIGZyYW1lLgorICAgICAgICBmcmFtZSA9IGQucG9wKG1haW5faWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmcmFtZSBpcyBzeXMuX2dldGZyYW1lKCkpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgY2FwdHVyZWQgdGhyZWFkIGZyYW1lIGlzIGJsb2NrZWQgaW4gZzQ1NiwgY2FsbGVkCisgICAgICAgICMgZnJvbSBmMTIzLiAgVGhpcyBpcyBhIGxpdHRlIHRyaWNreSwgc2luY2UgdmFyaW91cyBiaXRzIG9mCisgICAgICAgICMgdGhyZWFkaW5nLnB5IGFyZSBhbHNvIGluIHRoZSB0aHJlYWQncyBjYWxsIHN0YWNrLgorICAgICAgICBmcmFtZSA9IGQucG9wKHRocmVhZF9pZCkKKyAgICAgICAgc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhmcmFtZSkKKyAgICAgICAgZm9yIGksIChmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSwgc291cmNlbGluZSkgaW4gZW51bWVyYXRlKHN0YWNrKToKKyAgICAgICAgICAgIGlmIGZ1bmNuYW1lID09ICJmMTIzIjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWRuJ3QgZmluZCBmMTIzKCkgb24gdGhyZWFkJ3MgY2FsbCBzdGFjayIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VyY2VsaW5lLCAiZzQ1NigpIikKKworICAgICAgICAjIEFuZCB0aGUgbmV4dCByZWNvcmQgbXVzdCBiZSBmb3IgZzQ1NigpLgorICAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSwgc291cmNlbGluZSA9IHN0YWNrW2krMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jbmFtZSwgImc0NTYiKQorICAgICAgICBzZWxmLmFzc2VydEluKHNvdXJjZWxpbmUsIFsibGVhdmVfZy53YWl0KCkiLCAiZW50ZXJlZF9nLnNldCgpIl0pCisKKyAgICAgICAgIyBSZWFwIHRoZSBzcGF3bmVkIHRocmVhZC4KKyAgICAgICAgbGVhdmVfZy5zZXQoKQorICAgICAgICB0LmpvaW4oKQorCisgICAgIyBUZXN0IHN5cy5fY3VycmVudF9mcmFtZXMoKSB3aGVuIHRocmVhZCBzdXBwb3J0IGRvZXNuJ3QgZXhpc3QuCisgICAgZGVmIGN1cnJlbnRfZnJhbWVzX3dpdGhvdXRfdGhyZWFkcyhzZWxmKToKKyAgICAgICAgIyBOb3QgbXVjaCBoYXBwZW5zIGhlcmU6ICB0aGVyZSBpcyBvbmx5IG9uZSB0aHJlYWQsIHdpdGggYXJ0aWZpY2lhbAorICAgICAgICAjICJ0aHJlYWQgaWQiIDAuCisgICAgICAgIGQgPSBzeXMuX2N1cnJlbnRfZnJhbWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMCwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRbMF0gaXMgc3lzLl9nZXRmcmFtZSgpKQorCisgICAgZGVmIHRlc3RfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5hcGlfdmVyc2lvbiwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLmFyZ3YsIGxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oc3lzLmJ5dGVvcmRlciwgKCJsaXR0bGUiLCAiYmlnIikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMsIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLmNvcHlyaWdodCwgYmFzZXN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5leGVjX3ByZWZpeCwgYmFzZXN0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5leGVjdXRhYmxlLCBiYXNlc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzeXMuZmxvYXRfaW5mbyksIDExKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5mbG9hdF9pbmZvLnJhZGl4LCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzeXMubG9uZ19pbmZvKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN5cy5sb25nX2luZm8uYml0c19wZXJfZGlnaXQgJSA1ID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMubG9uZ19pbmZvLnNpemVvZl9kaWdpdCA+PSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3lzLmxvbmdfaW5mby5iaXRzX3Blcl9kaWdpdCksIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHN5cy5sb25nX2luZm8uc2l6ZW9mX2RpZ2l0KSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLmhleHZlcnNpb24sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5tYXhpbnQsIGludCkKKyAgICAgICAgaWYgdGVzdC50ZXN0X3N1cHBvcnQuaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5tYXh1bmljb2RlLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMucGxhdGZvcm0sIGJhc2VzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMucHJlZml4LCBiYXNlc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLnZlcnNpb24sIGJhc2VzdHJpbmcpCisgICAgICAgIHZpID0gc3lzLnZlcnNpb25faW5mbworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmlbOl0sIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2aSksIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2aVswXSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmlbMV0sIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpWzJdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odmlbM10sICgiYWxwaGEiLCAiYmV0YSIsICJjYW5kaWRhdGUiLCAiZmluYWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpWzRdLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2aS5tYWpvciwgaW50KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmkubWlub3IsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHZpLm1pY3JvLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odmkucmVsZWFzZWxldmVsLCAoImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiwgImZpbmFsIikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh2aS5zZXJpYWwsIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aVswXSwgdmkubWFqb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlbMV0sIHZpLm1pbm9yKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzJdLCB2aS5taWNybykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aVszXSwgdmkucmVsZWFzZWxldmVsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzRdLCB2aS5zZXJpYWwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aSA+ICgxLDAsMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzeXMuZmxvYXRfcmVwcl9zdHlsZSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEluKHN5cy5mbG9hdF9yZXByX3N0eWxlLCAoJ3Nob3J0JywgJ2xlZ2FjeScpKQorCisgICAgZGVmIHRlc3RfNDM1ODEoc2VsZik6CisgICAgICAgICMgQ2FuJ3QgdXNlIHN5cy5zdGRvdXQsIGFzIHRoaXMgaXMgYSBjU3RyaW5nSU8gb2JqZWN0IHdoZW4KKyAgICAgICAgIyB0aGUgdGVzdCBydW5zIHVuZGVyIHJlZ3J0ZXN0LgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3lzLl9fc3Rkb3V0X18uZW5jb2RpbmcgPT0gc3lzLl9fc3RkZXJyX18uZW5jb2RpbmcpCisKKyAgICBkZWYgdGVzdF9zeXNfZmxhZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMuZmxhZ3MpCisgICAgICAgIGF0dHJzID0gKCJkZWJ1ZyIsICJweTNrX3dhcm5pbmciLCAiZGl2aXNpb25fd2FybmluZyIsICJkaXZpc2lvbl9uZXciLAorICAgICAgICAgICAgICAgICAiaW5zcGVjdCIsICJpbnRlcmFjdGl2ZSIsICJvcHRpbWl6ZSIsICJkb250X3dyaXRlX2J5dGVjb2RlIiwKKyAgICAgICAgICAgICAgICAgIm5vX3NpdGUiLCAiaWdub3JlX2Vudmlyb25tZW50IiwgInRhYmNoZWNrIiwgInZlcmJvc2UiLAorICAgICAgICAgICAgICAgICAidW5pY29kZSIsICJieXRlc193YXJuaW5nIiwgImhhc2hfcmFuZG9taXphdGlvbiIpCisgICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc3lzLmZsYWdzLCBhdHRyKSwgYXR0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShnZXRhdHRyKHN5cy5mbGFncywgYXR0cikpLCBpbnQsIGF0dHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHN5cy5mbGFncykpCisKKyAgICBkZWYgdGVzdF9jbGVhcl90eXBlX2NhY2hlKHNlbGYpOgorICAgICAgICBzeXMuX2NsZWFyX3R5cGVfY2FjaGUoKQorCisgICAgZGVmIHRlc3RfaW9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgZW52ID0gZGljdChvcy5lbnZpcm9uKQorCisgICAgICAgICMgVGVzdCBjaGFyYWN0ZXI6IGNlbnQgc2lnbiwgZW5jb2RlZCBhcyAweDRBIChBU0NJSSBKKSBpbiBDUDQyNCwKKyAgICAgICAgIyBub3QgcmVwcmVzZW50YWJsZSBpbiBBU0NJSS4KKworICAgICAgICBlbnZbIlBZVEhPTklPRU5DT0RJTkciXSA9ICJjcDQyNCIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAncHJpbnQgdW5pY2hyKDB4YTIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dCA9IHN1YnByb2Nlc3MuUElQRSwgZW52PWVudikKKyAgICAgICAgb3V0ID0gcC5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsIHVuaWNocigweGEyKS5lbmNvZGUoImNwNDI0IikpCisKKyAgICAgICAgZW52WyJQWVRIT05JT0VOQ09ESU5HIl0gPSAiYXNjaWk6cmVwbGFjZSIKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAncHJpbnQgdW5pY2hyKDB4YTIpJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dCA9IHN1YnByb2Nlc3MuUElQRSwgZW52PWVudikKKyAgICAgICAgb3V0ID0gcC5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsICc/JykKKworICAgIGRlZiB0ZXN0X2NhbGxfdHJhY2luZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuY2FsbF90cmFjaW5nKHN0ciwgKDIsKSksICIyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuY2FsbF90cmFjaW5nLCBzdHIsIDIpCisKKyAgICBkZWYgdGVzdF9leGVjdXRhYmxlKHNlbGYpOgorICAgICAgICAjIHN5cy5leGVjdXRhYmxlIHNob3VsZCBiZSBhYnNvbHV0ZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYWJzcGF0aChzeXMuZXhlY3V0YWJsZSksIHN5cy5leGVjdXRhYmxlKQorCisgICAgICAgICMgSXNzdWUgIzc3NzQ6IEVuc3VyZSB0aGF0IHN5cy5leGVjdXRhYmxlIGlzIGFuIGVtcHR5IHN0cmluZyBpZiBhcmd2WzBdCisgICAgICAgICMgaGFzIGJlZW4gc2V0IHRvIGFuIG5vbiBleGlzdGVudCBwcm9ncmFtIG5hbWUgYW5kIFB5dGhvbiBpcyB1bmFibGUgdG8KKyAgICAgICAgIyByZXRyaWV2ZSB0aGUgcmVhbCBwcm9ncmFtIG5hbWUKKyAgICAgICAgaW1wb3J0IHN1YnByb2Nlc3MKKyAgICAgICAgIyBGb3IgYSBub3JtYWwgaW5zdGFsbGF0aW9uLCBpdCBzaG91bGQgd29yayB3aXRob3V0ICdjd2QnCisgICAgICAgICMgYXJndW1lbnQuIEZvciB0ZXN0IHJ1bnMgaW4gdGhlIGJ1aWxkIGRpcmVjdG9yeSwgc2VlICM3Nzc0LgorICAgICAgICBweXRob25fZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoc3lzLmV4ZWN1dGFibGUpKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbigKKyAgICAgICAgICAgIFsibm9uZXhpc3RlbnQiLCAiLWMiLCAnaW1wb3J0IHN5czsgcHJpbnQgcmVwcihzeXMuZXhlY3V0YWJsZSknXSwKKyAgICAgICAgICAgIGV4ZWN1dGFibGU9c3lzLmV4ZWN1dGFibGUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIGN3ZD1weXRob25fZGlyKQorICAgICAgICBleGVjdXRhYmxlID0gcC5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKKyAgICAgICAgcC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbihleGVjdXRhYmxlLCBbIicnIiwgcmVwcihzeXMuZXhlY3V0YWJsZSldKQorCitjbGFzcyBTaXplb2ZUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5QID0gc3RydWN0LmNhbGNzaXplKCdQJykKKyAgICAgICAgc2VsZi5sb25nZGlnaXQgPSBzeXMubG9uZ19pbmZvLnNpemVvZl9kaWdpdAorICAgICAgICBpbXBvcnQgX3Rlc3RjYXBpCisgICAgICAgIHNlbGYuZ2NfaGVhZHNpemUgPSBfdGVzdGNhcGkuU0laRU9GX1BZR0NfSEVBRAorICAgICAgICBzZWxmLmZpbGUgPSBvcGVuKHRlc3QudGVzdF9zdXBwb3J0LlRFU1RGTiwgJ3diJykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5maWxlLmNsb3NlKCkKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQudW5saW5rKHRlc3QudGVzdF9zdXBwb3J0LlRFU1RGTikKKworICAgIGNoZWNrX3NpemVvZiA9IHRlc3QudGVzdF9zdXBwb3J0LmNoZWNrX3NpemVvZgorCisgICAgZGVmIHRlc3RfZ2NfaGVhZF9zaXplKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgdGhlIGdjIGhlYWRlciBzaXplIGlzIGFkZGVkIHRvIG9iamVjdHMgdHJhY2tlZCBieSB0aGUgZ2MuCisgICAgICAgIHNpemUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5jYWxjb2Jqc2l6ZQorICAgICAgICBnY19oZWFkZXJfc2l6ZSA9IHNlbGYuZ2NfaGVhZHNpemUKKyAgICAgICAgIyBib29sIG9iamVjdHMgYXJlIG5vdCBnYyB0cmFja2VkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLmdldHNpemVvZihUcnVlKSwgc2l6ZSgnbCcpKQorICAgICAgICAjIGJ1dCBsaXN0cyBhcmUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0c2l6ZW9mKFtdKSwgc2l6ZSgnUCBQUCcpICsgZ2NfaGVhZGVyX3NpemUpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0KHNlbGYpOgorICAgICAgICBzaXplID0gdGVzdC50ZXN0X3N1cHBvcnQuY2FsY29ianNpemUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0c2l6ZW9mKFRydWUsIC0xKSwgc2l6ZSgnbCcpKQorCisgICAgZGVmIHRlc3Rfb2JqZWN0dHlwZXMoc2VsZik6CisgICAgICAgICMgY2hlY2sgYWxsIHR5cGVzIGRlZmluZWQgaW4gT2JqZWN0cy8KKyAgICAgICAgc2l6ZSA9IHRlc3QudGVzdF9zdXBwb3J0LmNhbGNvYmpzaXplCisgICAgICAgIHZzaXplID0gdGVzdC50ZXN0X3N1cHBvcnQuY2FsY3ZvYmpzaXplCisgICAgICAgIGNoZWNrID0gc2VsZi5jaGVja19zaXplb2YKKyAgICAgICAgIyBib29sCisgICAgICAgIGNoZWNrKFRydWUsIHNpemUoJ2wnKSkKKyAgICAgICAgIyBidWZmZXIKKyAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICBjaGVjayhidWZmZXIoJycpLCBzaXplKCcyUDJQaWwnKSkKKyAgICAgICAgIyBidWlsdGluX2Z1bmN0aW9uX29yX21ldGhvZAorICAgICAgICBjaGVjayhsZW4sIHNpemUoJzNQJykpCisgICAgICAgICMgYnl0ZWFycmF5CisgICAgICAgIHNhbXBsZXMgPSBbJycsICd1JyoxMDAwMDBdCisgICAgICAgIGZvciBzYW1wbGUgaW4gc2FtcGxlczoKKyAgICAgICAgICAgIHggPSBieXRlYXJyYXkoc2FtcGxlKQorICAgICAgICAgICAgY2hlY2soeCwgdnNpemUoJ2lQUCcpICsgeC5fX2FsbG9jX18oKSkKKyAgICAgICAgIyBieXRlYXJyYXlfaXRlcmF0b3IKKyAgICAgICAgY2hlY2soaXRlcihieXRlYXJyYXkoKSksIHNpemUoJ1BQJykpCisgICAgICAgICMgY2VsbAorICAgICAgICBkZWYgZ2V0X2NlbGwoKToKKyAgICAgICAgICAgIHggPSA0MgorICAgICAgICAgICAgZGVmIGlubmVyKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgIHJldHVybiBpbm5lcgorICAgICAgICBjaGVjayhnZXRfY2VsbCgpLmZ1bmNfY2xvc3VyZVswXSwgc2l6ZSgnUCcpKQorICAgICAgICAjIGNsYXNzb2JqIChvbGQtc3R5bGUgY2xhc3MpCisgICAgICAgIGNsYXNzIGNsYXNzX29sZHN0eWxlKCk6CisgICAgICAgICAgICBkZWYgbWV0aG9kKCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBjaGVjayhjbGFzc19vbGRzdHlsZSwgc2l6ZSgnN1AnKSkKKyAgICAgICAgIyBpbnN0YW5jZSAob2xkLXN0eWxlIGNsYXNzKQorICAgICAgICBjaGVjayhjbGFzc19vbGRzdHlsZSgpLCBzaXplKCczUCcpKQorICAgICAgICAjIGluc3RhbmNlbWV0aG9kIChvbGQtc3R5bGUgY2xhc3MpCisgICAgICAgIGNoZWNrKGNsYXNzX29sZHN0eWxlKCkubWV0aG9kLCBzaXplKCc0UCcpKQorICAgICAgICAjIGNvbXBsZXgKKyAgICAgICAgY2hlY2soY29tcGxleCgwLDEpLCBzaXplKCcyZCcpKQorICAgICAgICAjIGNvZGUKKyAgICAgICAgY2hlY2soZ2V0X2NlbGwoKS5mdW5jX2NvZGUsIHNpemUoJzRpOFBpM1AnKSkKKyAgICAgICAgIyBCYXNlRXhjZXB0aW9uCisgICAgICAgIGNoZWNrKEJhc2VFeGNlcHRpb24oKSwgc2l6ZSgnM1AnKSkKKyAgICAgICAgIyBVbmljb2RlRW5jb2RlRXJyb3IKKyAgICAgICAgY2hlY2soVW5pY29kZUVuY29kZUVycm9yKCIiLCB1IiIsIDAsIDAsICIiKSwgc2l6ZSgnNVAyUFAnKSkKKyAgICAgICAgIyBVbmljb2RlRGVjb2RlRXJyb3IKKyAgICAgICAgY2hlY2soVW5pY29kZURlY29kZUVycm9yKCIiLCAiIiwgMCwgMCwgIiIpLCBzaXplKCc1UDJQUCcpKQorICAgICAgICAjIFVuaWNvZGVUcmFuc2xhdGVFcnJvcgorICAgICAgICBjaGVjayhVbmljb2RlVHJhbnNsYXRlRXJyb3IodSIiLCAwLCAxLCAiIiksIHNpemUoJzVQMlBQJykpCisgICAgICAgICMgbWV0aG9kX2Rlc2NyaXB0b3IgKGRlc2NyaXB0b3Igb2JqZWN0KQorICAgICAgICBjaGVjayhzdHIubG93ZXIsIHNpemUoJzJQUCcpKQorICAgICAgICAjIGNsYXNzbWV0aG9kX2Rlc2NyaXB0b3IgKGRlc2NyaXB0b3Igb2JqZWN0KQorICAgICAgICAjIFhYWAorICAgICAgICAjIG1lbWJlcl9kZXNjcmlwdG9yIChkZXNjcmlwdG9yIG9iamVjdCkKKyAgICAgICAgaW1wb3J0IGRhdGV0aW1lCisgICAgICAgIGNoZWNrKGRhdGV0aW1lLnRpbWVkZWx0YS5kYXlzLCBzaXplKCcyUFAnKSkKKyAgICAgICAgIyBnZXRzZXRfZGVzY3JpcHRvciAoZGVzY3JpcHRvciBvYmplY3QpCisgICAgICAgIGltcG9ydCBfX2J1aWx0aW5fXworICAgICAgICBjaGVjayhfX2J1aWx0aW5fXy5maWxlLmNsb3NlZCwgc2l6ZSgnMlBQJykpCisgICAgICAgICMgd3JhcHBlcl9kZXNjcmlwdG9yIChkZXNjcmlwdG9yIG9iamVjdCkKKyAgICAgICAgY2hlY2soaW50Ll9fYWRkX18sIHNpemUoJzJQMlAnKSkKKyAgICAgICAgIyBkaWN0cHJveHkKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOiBwYXNzCisgICAgICAgIGNoZWNrKEMuX19kaWN0X18sIHNpemUoJ1AnKSkKKyAgICAgICAgIyBtZXRob2Qtd3JhcHBlciAoZGVzY3JpcHRvciBvYmplY3QpCisgICAgICAgIGNoZWNrKHt9Ll9faXRlcl9fLCBzaXplKCcyUCcpKQorICAgICAgICAjIGRpY3QKKyAgICAgICAgY2hlY2soe30sIHNpemUoJzNQMlAnICsgOConUDJQJykpCisgICAgICAgIHggPSB7MToxLCAyOjIsIDM6MywgNDo0LCA1OjUsIDY6NiwgNzo3LCA4Ojh9CisgICAgICAgIGNoZWNrKHgsIHNpemUoJzNQMlAnICsgOConUDJQJykgKyAxNipzdHJ1Y3QuY2FsY3NpemUoJ1AyUCcpKQorICAgICAgICAjIGRpY3Rpb25hcnkta2V5aXRlcmF0b3IKKyAgICAgICAgY2hlY2soe30uaXRlcmtleXMoKSwgc2l6ZSgnUDJQUFAnKSkKKyAgICAgICAgIyBkaWN0aW9uYXJ5LXZhbHVlaXRlcmF0b3IKKyAgICAgICAgY2hlY2soe30uaXRlcnZhbHVlcygpLCBzaXplKCdQMlBQUCcpKQorICAgICAgICAjIGRpY3Rpb25hcnktaXRlbWl0ZXJhdG9yCisgICAgICAgIGNoZWNrKHt9Lml0ZXJpdGVtcygpLCBzaXplKCdQMlBQUCcpKQorICAgICAgICAjIGVsbGlwc2VzCisgICAgICAgIGNoZWNrKEVsbGlwc2lzLCBzaXplKCcnKSkKKyAgICAgICAgIyBFbmNvZGluZ01hcAorICAgICAgICBpbXBvcnQgY29kZWNzLCBlbmNvZGluZ3MuaXNvODg1OV8zCisgICAgICAgIHggPSBjb2RlY3MuY2hhcm1hcF9idWlsZChlbmNvZGluZ3MuaXNvODg1OV8zLmRlY29kaW5nX3RhYmxlKQorICAgICAgICBjaGVjayh4LCBzaXplKCczMkIyaUInKSkKKyAgICAgICAgIyBlbnVtZXJhdGUKKyAgICAgICAgY2hlY2soZW51bWVyYXRlKFtdKSwgc2l6ZSgnbDNQJykpCisgICAgICAgICMgZmlsZQorICAgICAgICBjaGVjayhzZWxmLmZpbGUsIHNpemUoJzRQMmk0UDNpM1AzaScpKQorICAgICAgICAjIGZsb2F0CisgICAgICAgIGNoZWNrKGZsb2F0KDApLCBzaXplKCdkJykpCisgICAgICAgICMgc3lzLmZsb2F0aW5mbworICAgICAgICBjaGVjayhzeXMuZmxvYXRfaW5mbywgdnNpemUoJycpICsgc2VsZi5QICogbGVuKHN5cy5mbG9hdF9pbmZvKSkKKyAgICAgICAgIyBmcmFtZQorICAgICAgICBpbXBvcnQgaW5zcGVjdAorICAgICAgICBDT19NQVhCTE9DS1MgPSAyMAorICAgICAgICB4ID0gaW5zcGVjdC5jdXJyZW50ZnJhbWUoKQorICAgICAgICBuY2VsbHMgPSBsZW4oeC5mX2NvZGUuY29fY2VsbHZhcnMpCisgICAgICAgIG5mcmVlcyA9IGxlbih4LmZfY29kZS5jb19mcmVldmFycykKKyAgICAgICAgZXh0cmFzID0geC5mX2NvZGUuY29fc3RhY2tzaXplICsgeC5mX2NvZGUuY29fbmxvY2FscyArXAorICAgICAgICAgICAgICAgICBuY2VsbHMgKyBuZnJlZXMgLSAxCisgICAgICAgIGNoZWNrKHgsIHZzaXplKCcxMlAzaScgKyBDT19NQVhCTE9DS1MqJzNpJyArICdQJyArIGV4dHJhcyonUCcpKQorICAgICAgICAjIGZ1bmN0aW9uCisgICAgICAgIGRlZiBmdW5jKCk6IHBhc3MKKyAgICAgICAgY2hlY2soZnVuYywgc2l6ZSgnOVAnKSkKKyAgICAgICAgY2xhc3MgYygpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIGZvbygpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIGJhcihjbHMpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgc3RhdGljbWV0aG9kCisgICAgICAgICAgICBjaGVjayhmb28sIHNpemUoJ1AnKSkKKyAgICAgICAgICAgICMgY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGNoZWNrKGJhciwgc2l6ZSgnUCcpKQorICAgICAgICAjIGdlbmVyYXRvcgorICAgICAgICBkZWYgZ2V0X2dlbigpOiB5aWVsZCAxCisgICAgICAgIGNoZWNrKGdldF9nZW4oKSwgc2l6ZSgnUGkyUCcpKQorICAgICAgICAjIGludGVnZXIKKyAgICAgICAgY2hlY2soMSwgc2l6ZSgnbCcpKQorICAgICAgICBjaGVjaygxMDAsIHNpemUoJ2wnKSkKKyAgICAgICAgIyBpdGVyYXRvcgorICAgICAgICBjaGVjayhpdGVyKCdhYmMnKSwgc2l6ZSgnbFAnKSkKKyAgICAgICAgIyBjYWxsYWJsZS1pdGVyYXRvcgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgY2hlY2socmUuZmluZGl0ZXIoJycsJycpLCBzaXplKCcyUCcpKQorICAgICAgICAjIGxpc3QKKyAgICAgICAgc2FtcGxlcyA9IFtbXSwgWzEsMiwzXSwgWycxJywgJzInLCAnMyddXQorICAgICAgICBmb3Igc2FtcGxlIGluIHNhbXBsZXM6CisgICAgICAgICAgICBjaGVjayhzYW1wbGUsIHZzaXplKCdQUCcpICsgbGVuKHNhbXBsZSkqc2VsZi5QKQorICAgICAgICAjIHNvcnR3cmFwcGVyIChsaXN0KQorICAgICAgICAjIFhYWAorICAgICAgICAjIGNtcHdyYXBwZXIgKGxpc3QpCisgICAgICAgICMgWFhYCisgICAgICAgICMgbGlzdGl0ZXJhdG9yIChsaXN0KQorICAgICAgICBjaGVjayhpdGVyKFtdKSwgc2l6ZSgnbFAnKSkKKyAgICAgICAgIyBsaXN0cmV2ZXJzZWl0ZXJhdG9yIChsaXN0KQorICAgICAgICBjaGVjayhyZXZlcnNlZChbXSksIHNpemUoJ2xQJykpCisgICAgICAgICMgbG9uZworICAgICAgICBjaGVjaygwTCwgdnNpemUoJycpKQorICAgICAgICBjaGVjaygxTCwgdnNpemUoJycpICsgc2VsZi5sb25nZGlnaXQpCisgICAgICAgIGNoZWNrKC0xTCwgdnNpemUoJycpICsgc2VsZi5sb25nZGlnaXQpCisgICAgICAgIFB5TG9uZ19CQVNFID0gMioqc3lzLmxvbmdfaW5mby5iaXRzX3Blcl9kaWdpdAorICAgICAgICBjaGVjayhsb25nKFB5TG9uZ19CQVNFKSwgdnNpemUoJycpICsgMipzZWxmLmxvbmdkaWdpdCkKKyAgICAgICAgY2hlY2sobG9uZyhQeUxvbmdfQkFTRSoqMi0xKSwgdnNpemUoJycpICsgMipzZWxmLmxvbmdkaWdpdCkKKyAgICAgICAgY2hlY2sobG9uZyhQeUxvbmdfQkFTRSoqMiksIHZzaXplKCcnKSArIDMqc2VsZi5sb25nZGlnaXQpCisgICAgICAgICMgbW9kdWxlCisgICAgICAgIGNoZWNrKHVuaXR0ZXN0LCBzaXplKCdQJykpCisgICAgICAgICMgTm9uZQorICAgICAgICBjaGVjayhOb25lLCBzaXplKCcnKSkKKyAgICAgICAgIyBvYmplY3QKKyAgICAgICAgY2hlY2sob2JqZWN0KCksIHNpemUoJycpKQorICAgICAgICAjIHByb3BlcnR5IChkZXNjcmlwdG9yIG9iamVjdCkKKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl9feAorICAgICAgICAgICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOiBzZWxmLl9feCA9IHZhbHVlCisgICAgICAgICAgICBkZWYgZGVseChzZWxmKTogZGVsIHNlbGYuX194CisgICAgICAgICAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgIiIpCisgICAgICAgICAgICBjaGVjayh4LCBzaXplKCc0UGknKSkKKyAgICAgICAgIyBQeUNPYmplY3QKKyAgICAgICAgIyBQeUNhcHN1bGUKKyAgICAgICAgIyBYWFgKKyAgICAgICAgIyByYW5nZWl0ZXJhdG9yCisgICAgICAgIGNoZWNrKGl0ZXIoeHJhbmdlKDEpKSwgc2l6ZSgnNGwnKSkKKyAgICAgICAgIyByZXZlcnNlCisgICAgICAgIGNoZWNrKHJldmVyc2VkKCcnKSwgc2l6ZSgnUFAnKSkKKyAgICAgICAgIyBzZXQKKyAgICAgICAgIyBmcm96ZW5zZXQKKyAgICAgICAgUHlTZXRfTUlOU0laRSA9IDgKKyAgICAgICAgc2FtcGxlcyA9IFtbXSwgcmFuZ2UoMTApLCByYW5nZSg1MCldCisgICAgICAgIHMgPSBzaXplKCczUDJQJyArIFB5U2V0X01JTlNJWkUqJ2xQJyArICdsUCcpCisgICAgICAgIGZvciBzYW1wbGUgaW4gc2FtcGxlczoKKyAgICAgICAgICAgIG1pbnVzZWQgPSBsZW4oc2FtcGxlKQorICAgICAgICAgICAgaWYgbWludXNlZCA9PSAwOiB0bXAgPSAxCisgICAgICAgICAgICAjIHRoZSBjb21wdXRhdGlvbiBvZiBtaW51c2VkIGlzIGFjdHVhbGx5IGEgYml0IG1vcmUgY29tcGxpY2F0ZWQKKyAgICAgICAgICAgICMgYnV0IHRoaXMgc3VmZmljZXMgZm9yIHRoZSBzaXplb2YgdGVzdAorICAgICAgICAgICAgbWludXNlZCA9IG1pbnVzZWQqMgorICAgICAgICAgICAgbmV3c2l6ZSA9IFB5U2V0X01JTlNJWkUKKyAgICAgICAgICAgIHdoaWxlIG5ld3NpemUgPD0gbWludXNlZDoKKyAgICAgICAgICAgICAgICBuZXdzaXplID0gbmV3c2l6ZSA8PCAxCisgICAgICAgICAgICBpZiBuZXdzaXplIDw9IDg6CisgICAgICAgICAgICAgICAgY2hlY2soc2V0KHNhbXBsZSksIHMpCisgICAgICAgICAgICAgICAgY2hlY2soZnJvemVuc2V0KHNhbXBsZSksIHMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoZWNrKHNldChzYW1wbGUpLCBzICsgbmV3c2l6ZSpzdHJ1Y3QuY2FsY3NpemUoJ2xQJykpCisgICAgICAgICAgICAgICAgY2hlY2soZnJvemVuc2V0KHNhbXBsZSksIHMgKyBuZXdzaXplKnN0cnVjdC5jYWxjc2l6ZSgnbFAnKSkKKyAgICAgICAgIyBzZXRpdGVyYXRvcgorICAgICAgICBjaGVjayhpdGVyKHNldCgpKSwgc2l6ZSgnUDNQJykpCisgICAgICAgICMgc2xpY2UKKyAgICAgICAgY2hlY2soc2xpY2UoMSksIHNpemUoJzNQJykpCisgICAgICAgICMgc3RyCisgICAgICAgIHZoID0gdGVzdC50ZXN0X3N1cHBvcnQuX3ZoZWFkZXIKKyAgICAgICAgY2hlY2soJycsIHN0cnVjdC5jYWxjc2l6ZSh2aCArICdsaWMnKSkKKyAgICAgICAgY2hlY2soJ2FiYycsIHN0cnVjdC5jYWxjc2l6ZSh2aCArICdsaWMnKSArIDMpCisgICAgICAgICMgc3VwZXIKKyAgICAgICAgY2hlY2soc3VwZXIoaW50KSwgc2l6ZSgnM1AnKSkKKyAgICAgICAgIyB0dXBsZQorICAgICAgICBjaGVjaygoKSwgdnNpemUoJycpKQorICAgICAgICBjaGVjaygoMSwyLDMpLCB2c2l6ZSgnJykgKyAzKnNlbGYuUCkKKyAgICAgICAgIyB0dXBsZWl0ZXJhdG9yCisgICAgICAgIGNoZWNrKGl0ZXIoKCkpLCBzaXplKCdsUCcpKQorICAgICAgICAjIHR5cGUKKyAgICAgICAgIyAoUHlUeXBlT2JqZWN0ICsgUHlOdW1iZXJNZXRob2RzICsgIFB5TWFwcGluZ01ldGhvZHMgKworICAgICAgICAjICBQeVNlcXVlbmNlTWV0aG9kcyArIFB5QnVmZmVyUHJvY3MpCisgICAgICAgIHMgPSB2c2l6ZSgnUDJQMTVQbDRQUDlQUDExUEknKSArIHN0cnVjdC5jYWxjc2l6ZSgnNDFQIDEwUCAzUCA2UCcpCisgICAgICAgIGNsYXNzIG5ld3N0eWxlY2xhc3Mob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgY2hlY2sobmV3c3R5bGVjbGFzcywgcykKKyAgICAgICAgIyBidWlsdGluIHR5cGUKKyAgICAgICAgY2hlY2soaW50LCBzKQorICAgICAgICAjIE5vdEltcGxlbWVudGVkVHlwZQorICAgICAgICBpbXBvcnQgdHlwZXMKKyAgICAgICAgY2hlY2sodHlwZXMuTm90SW1wbGVtZW50ZWRUeXBlLCBzKQorICAgICAgICAjIHVuaWNvZGUKKyAgICAgICAgdXNpemUgPSBsZW4odSdcMCcuZW5jb2RlKCd1bmljb2RlLWludGVybmFsJykpCisgICAgICAgIHNhbXBsZXMgPSBbdScnLCB1JzEnKjEwMF0KKyAgICAgICAgIyB3ZSBuZWVkIHRvIHRlc3QgZm9yIGJvdGggc2l6ZXMsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUgc3RyaW5nCisgICAgICAgICMgaGFzIGJlZW4gY2FjaGVkCisgICAgICAgIGZvciBzIGluIHNhbXBsZXM6CisgICAgICAgICAgICBjaGVjayhzLCBzaXplKCdQUGxQJykgKyB1c2l6ZSAqIChsZW4ocykgKyAxKSkKKyAgICAgICAgIyB3ZWFrcmVmCisgICAgICAgIGltcG9ydCB3ZWFrcmVmCisgICAgICAgIGNoZWNrKHdlYWtyZWYucmVmKGludCksIHNpemUoJzJQbDJQJykpCisgICAgICAgICMgd2Vha3Byb3h5CisgICAgICAgICMgWFhYCisgICAgICAgICMgd2Vha2NhbGxhYmxlcHJveHkKKyAgICAgICAgY2hlY2sod2Vha3JlZi5wcm94eShpbnQpLCBzaXplKCcyUGwyUCcpKQorICAgICAgICAjIHhyYW5nZQorICAgICAgICBjaGVjayh4cmFuZ2UoMSksIHNpemUoJzNsJykpCisgICAgICAgIGNoZWNrKHhyYW5nZSg2NjAwMCksIHNpemUoJzNsJykpCisKKyAgICBkZWYgdGVzdF9weXRob250eXBlcyhzZWxmKToKKyAgICAgICAgIyBjaGVjayBhbGwgdHlwZXMgZGVmaW5lZCBpbiBQeXRob24vCisgICAgICAgIHNpemUgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5jYWxjb2Jqc2l6ZQorICAgICAgICB2c2l6ZSA9IHRlc3QudGVzdF9zdXBwb3J0LmNhbGN2b2Jqc2l6ZQorICAgICAgICBjaGVjayA9IHNlbGYuY2hlY2tfc2l6ZW9mCisgICAgICAgICMgX2FzdC5BU1QKKyAgICAgICAgaW1wb3J0IF9hc3QKKyAgICAgICAgY2hlY2soX2FzdC5BU1QoKSwgc2l6ZSgnJykpCisgICAgICAgICMgaW1wLk51bGxJbXBvcnRlcgorICAgICAgICBpbXBvcnQgaW1wCisgICAgICAgIGNoZWNrKGltcC5OdWxsSW1wb3J0ZXIoc2VsZi5maWxlLm5hbWUpLCBzaXplKCcnKSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICB0YiA9IHN5cy5leGNfaW5mbygpWzJdCisgICAgICAgICAgICAjIHRyYWNlYmFjaworICAgICAgICAgICAgaWYgdGIgIT0gTm9uZToKKyAgICAgICAgICAgICAgICBjaGVjayh0Yiwgc2l6ZSgnMlAyaScpKQorICAgICAgICAjIHN5bXRhYmxlIGVudHJ5CisgICAgICAgICMgWFhYCisgICAgICAgICMgc3lzLmZsYWdzCisgICAgICAgIGNoZWNrKHN5cy5mbGFncywgdnNpemUoJycpICsgc2VsZi5QICogbGVuKHN5cy5mbGFncykpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3RfY2xhc3NlcyA9IChTeXNNb2R1bGVUZXN0LCBTaXplb2ZUZXN0KQorCisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0X2NsYXNzZXMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2NlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2NlZGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXRwcm9maWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHByb2ZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyNTU5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXRwcm9maWxlLnB5CkBAIC0wLDAgKzEsMzg2IEBACitpbXBvcnQgZ2MKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitjbGFzcyBUZXN0R2V0UHJvZmlsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzeXMuc2V0cHJvZmlsZShOb25lKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuc2V0cHJvZmlsZShOb25lKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHN5cy5nZXRwcm9maWxlKCkpCisKKyAgICBkZWYgdGVzdF9zZXRnZXQoc2VsZik6CisgICAgICAgIGRlZiBmbigqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc3lzLnNldHByb2ZpbGUoZm4pCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3lzLmdldHByb2ZpbGUoKSwgZm4pCisKK2NsYXNzIEhvb2tXYXRjaGVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5mcmFtZXMgPSBbXQorICAgICAgICBzZWxmLmV2ZW50cyA9IFtdCisKKyAgICBkZWYgY2FsbGJhY2soc2VsZiwgZnJhbWUsIGV2ZW50LCBhcmcpOgorICAgICAgICBpZiAoZXZlbnQgPT0gImNhbGwiCisgICAgICAgICAgICBvciBldmVudCA9PSAicmV0dXJuIgorICAgICAgICAgICAgb3IgZXZlbnQgPT0gImV4Y2VwdGlvbiIpOgorICAgICAgICAgICAgc2VsZi5hZGRfZXZlbnQoZXZlbnQsIGZyYW1lKQorCisgICAgZGVmIGFkZF9ldmVudChzZWxmLCBldmVudCwgZnJhbWU9Tm9uZSk6CisgICAgICAgICIiIkFkZCBhbiBldmVudCB0byB0aGUgbG9nLiIiIgorICAgICAgICBpZiBmcmFtZSBpcyBOb25lOgorICAgICAgICAgICAgZnJhbWUgPSBzeXMuX2dldGZyYW1lKDEpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJhbWVubyA9IHNlbGYuZnJhbWVzLmluZGV4KGZyYW1lKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIGZyYW1lbm8gPSBsZW4oc2VsZi5mcmFtZXMpCisgICAgICAgICAgICBzZWxmLmZyYW1lcy5hcHBlbmQoZnJhbWUpCisKKyAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKChmcmFtZW5vLCBldmVudCwgaWRlbnQoZnJhbWUpKSkKKworICAgIGRlZiBnZXRfZXZlbnRzKHNlbGYpOgorICAgICAgICAiIiJSZW1vdmUgY2FsbHMgdG8gYWRkX2V2ZW50KCkuIiIiCisgICAgICAgIGRpc2FsbG93ZWQgPSBbaWRlbnQoc2VsZi5hZGRfZXZlbnQuaW1fZnVuYyksIGlkZW50KGlkZW50KV0KKyAgICAgICAgc2VsZi5mcmFtZXMgPSBOb25lCisKKyAgICAgICAgcmV0dXJuIFtpdGVtIGZvciBpdGVtIGluIHNlbGYuZXZlbnRzIGlmIGl0ZW1bMl0gbm90IGluIGRpc2FsbG93ZWRdCisKKworY2xhc3MgUHJvZmlsZVNpbXVsYXRvcihIb29rV2F0Y2hlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRlc3RjYXNlKToKKyAgICAgICAgc2VsZi50ZXN0Y2FzZSA9IHRlc3RjYXNlCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBIb29rV2F0Y2hlci5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIGNhbGxiYWNrKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgIyBDYWxsYmFjayByZWdpc3RlcmVkIHdpdGggc3lzLnNldHByb2ZpbGUoKS9zeXMuc2V0dHJhY2UoKQorICAgICAgICBzZWxmLmRpc3BhdGNoW2V2ZW50XShzZWxmLCBmcmFtZSkKKworICAgIGRlZiB0cmFjZV9jYWxsKHNlbGYsIGZyYW1lKToKKyAgICAgICAgc2VsZi5hZGRfZXZlbnQoJ2NhbGwnLCBmcmFtZSkKKyAgICAgICAgc2VsZi5zdGFjay5hcHBlbmQoZnJhbWUpCisKKyAgICBkZWYgdHJhY2VfcmV0dXJuKHNlbGYsIGZyYW1lKToKKyAgICAgICAgc2VsZi5hZGRfZXZlbnQoJ3JldHVybicsIGZyYW1lKQorICAgICAgICBzZWxmLnN0YWNrLnBvcCgpCisKKyAgICBkZWYgdHJhY2VfZXhjZXB0aW9uKHNlbGYsIGZyYW1lKToKKyAgICAgICAgc2VsZi50ZXN0Y2FzZS5mYWlsKAorICAgICAgICAgICAgInRoZSBwcm9maWxlciBzaG91bGQgbmV2ZXIgcmVjZWl2ZSBleGNlcHRpb24gZXZlbnRzIikKKworICAgIGRlZiB0cmFjZV9wYXNzKHNlbGYsIGZyYW1lKToKKyAgICAgICAgcGFzcworCisgICAgZGlzcGF0Y2ggPSB7CisgICAgICAgICdjYWxsJzogdHJhY2VfY2FsbCwKKyAgICAgICAgJ2V4Y2VwdGlvbic6IHRyYWNlX2V4Y2VwdGlvbiwKKyAgICAgICAgJ3JldHVybic6IHRyYWNlX3JldHVybiwKKyAgICAgICAgJ2NfY2FsbCc6IHRyYWNlX3Bhc3MsCisgICAgICAgICdjX3JldHVybic6IHRyYWNlX3Bhc3MsCisgICAgICAgICdjX2V4Y2VwdGlvbic6IHRyYWNlX3Bhc3MsCisgICAgICAgIH0KKworCitjbGFzcyBUZXN0Q2FzZUJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjaGVja19ldmVudHMoc2VsZiwgY2FsbGFibGUsIGV4cGVjdGVkKToKKyAgICAgICAgZXZlbnRzID0gY2FwdHVyZV9ldmVudHMoY2FsbGFibGUsIHNlbGYubmV3X3dhdGNoZXIoKSkKKyAgICAgICAgaWYgZXZlbnRzICE9IGV4cGVjdGVkOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJFeHBlY3RlZCBldmVudHM6XG4lc1xuUmVjZWl2ZWQgZXZlbnRzOlxuJXMiCisgICAgICAgICAgICAgICAgICAgICAgJSAocHByaW50LnBmb3JtYXQoZXhwZWN0ZWQpLCBwcHJpbnQucGZvcm1hdChldmVudHMpKSkKKworCitjbGFzcyBQcm9maWxlSG9va1Rlc3RDYXNlKFRlc3RDYXNlQmFzZSk6CisgICAgZGVmIG5ld193YXRjaGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gSG9va1dhdGNoZXIoKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlKHNlbGYpOgorICAgICAgICBkZWYgZihwKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGYsIFsoMSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZihwKToKKyAgICAgICAgICAgIDEuLzAKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGYsIFsoMSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfY2F1Z2h0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICB0cnk6IDEuLzAKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jYXVnaHRfbmVzdGVkX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICB0cnk6IDEuLzAKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZihwKToKKyAgICAgICAgICAgIDEuLzAKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGYsIFsoMSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhpcyBpc24ndCB3aGF0IEkgZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICgwLCAnZXhjZXB0aW9uJywgcHJvdGVjdF9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIEkgZXhwZWN0ZWQgdGhpcyBhZ2FpbjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZXhjZXB0aW9uX2luX2V4Y2VwdF9jbGF1c2Uoc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgMS4vMAorICAgICAgICBkZWYgZyhwKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmKHApCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgdHJ5OiBmKHApCisgICAgICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBnX2lkZW50ID0gaWRlbnQoZykKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZywgWygxLCAnY2FsbCcsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBnX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb25fcHJvcG9nYXRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgMS4vMAorICAgICAgICBkZWYgZyhwKToKKyAgICAgICAgICAgIHRyeTogZihwKQorICAgICAgICAgICAgZmluYWxseTogcC5hZGRfZXZlbnQoImZhbGxpbmcgdGhyb3VnaCIpCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBnX2lkZW50ID0gaWRlbnQoZykKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZywgWygxLCAnY2FsbCcsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdmYWxsaW5nIHRocm91Z2gnLCBnX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfcmFpc2VfdHdpY2Uoc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgdHJ5OiAxLi8wCisgICAgICAgICAgICBleGNlcHQ6IDEuLzAKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGYsIFsoMSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfcmFpc2VfcmVyYWlzZShzZWxmKToKKyAgICAgICAgZGVmIGYocCk6CisgICAgICAgICAgICB0cnk6IDEuLzAKKyAgICAgICAgICAgIGV4Y2VwdDogcmFpc2UKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGYsIFsoMSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfcmFpc2Uoc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCkKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGYsIFsoMSwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfZGlzdGFudF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAxLi8wCisgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICBmKCkKKyAgICAgICAgZGVmIGgoKToKKyAgICAgICAgICAgIGcoKQorICAgICAgICBkZWYgaSgpOgorICAgICAgICAgICAgaCgpCisgICAgICAgIGRlZiBqKHApOgorICAgICAgICAgICAgaSgpCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBnX2lkZW50ID0gaWRlbnQoZykKKyAgICAgICAgaF9pZGVudCA9IGlkZW50KGgpCisgICAgICAgIGlfaWRlbnQgPSBpZGVudChpKQorICAgICAgICBqX2lkZW50ID0gaWRlbnQoaikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoaiwgWygxLCAnY2FsbCcsIGpfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgaV9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2NhbGwnLCBoX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnY2FsbCcsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdyZXR1cm4nLCBnX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAncmV0dXJuJywgaF9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGlfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBqX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9nZW5lcmF0b3Ioc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgyKToKKyAgICAgICAgICAgICAgICB5aWVsZCBpCisgICAgICAgIGRlZiBnKHApOgorICAgICAgICAgICAgZm9yIGkgaW4gZigpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZl9pZGVudCA9IGlkZW50KGYpCisgICAgICAgIGdfaWRlbnQgPSBpZGVudChnKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhnLCBbKDEsICdjYWxsJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNhbGwgdGhlIGl0ZXJhdG9yIHR3aWNlIHRvIGdlbmVyYXRlIHZhbHVlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmNlIG1vcmU7IHJldHVybnMgZW5kLW9mLWl0ZXJhdGlvbiB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGFjdHVhbGx5IHJhaXNpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X3N0b3BfaXRlcmF0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMik6CisgICAgICAgICAgICAgICAgeWllbGQgaQorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBkZWYgZyhwKToKKyAgICAgICAgICAgIGZvciBpIGluIGYoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBnX2lkZW50ID0gaWRlbnQoZykKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZywgWygxLCAnY2FsbCcsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjYWxsIHRoZSBpdGVyYXRvciB0d2ljZSB0byBnZW5lcmF0ZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25jZSBtb3JlIHRvIGhpdCB0aGUgcmFpc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2NhbGwnLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGdfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworCitjbGFzcyBQcm9maWxlU2ltdWxhdG9yVGVzdENhc2UoVGVzdENhc2VCYXNlKToKKyAgICBkZWYgbmV3X3dhdGNoZXIoc2VsZik6CisgICAgICAgIHJldHVybiBQcm9maWxlU2ltdWxhdG9yKHNlbGYpCisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgcGFzcworICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9iYXNpY19leGNlcHRpb24oc2VsZik6CisgICAgICAgIGRlZiBmKHApOgorICAgICAgICAgICAgMS4vMAorICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoZiwgWygxLCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pCisKKyAgICBkZWYgdGVzdF9jYXVnaHRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZihwKToKKyAgICAgICAgICAgIHRyeTogMS4vMAorICAgICAgICAgICAgZXhjZXB0OiBwYXNzCisgICAgICAgIGZfaWRlbnQgPSBpZGVudChmKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhmLCBbKDEsICdjYWxsJywgZl9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ3JldHVybicsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Rpc3RhbnRfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgMS4vMAorICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgZigpCisgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICBnKCkKKyAgICAgICAgZGVmIGkoKToKKyAgICAgICAgICAgIGgoKQorICAgICAgICBkZWYgaihwKToKKyAgICAgICAgICAgIGkoKQorICAgICAgICBmX2lkZW50ID0gaWRlbnQoZikKKyAgICAgICAgZ19pZGVudCA9IGlkZW50KGcpCisgICAgICAgIGhfaWRlbnQgPSBpZGVudChoKQorICAgICAgICBpX2lkZW50ID0gaWRlbnQoaSkKKyAgICAgICAgal9pZGVudCA9IGlkZW50KGopCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKGosIFsoMSwgJ2NhbGwnLCBqX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnY2FsbCcsIGlfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdjYWxsJywgaF9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2NhbGwnLCBnX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnY2FsbCcsIGZfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdyZXR1cm4nLCBmX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAncmV0dXJuJywgZ19pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ3JldHVybicsIGhfaWRlbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdyZXR1cm4nLCBpX2lkZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJywgal9pZGVudCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorCisKK2RlZiBpZGVudChmdW5jdGlvbik6CisgICAgaWYgaGFzYXR0cihmdW5jdGlvbiwgImZfY29kZSIpOgorICAgICAgICBjb2RlID0gZnVuY3Rpb24uZl9jb2RlCisgICAgZWxzZToKKyAgICAgICAgY29kZSA9IGZ1bmN0aW9uLmZ1bmNfY29kZQorICAgIHJldHVybiBjb2RlLmNvX2ZpcnN0bGluZW5vLCBjb2RlLmNvX25hbWUKKworCitkZWYgcHJvdGVjdChmLCBwKToKKyAgICB0cnk6IGYocCkKKyAgICBleGNlcHQ6IHBhc3MKKworcHJvdGVjdF9pZGVudCA9IGlkZW50KHByb3RlY3QpCisKKworZGVmIGNhcHR1cmVfZXZlbnRzKGNhbGxhYmxlLCBwPU5vbmUpOgorICAgIGlmIHAgaXMgTm9uZToKKyAgICAgICAgcCA9IEhvb2tXYXRjaGVyKCkKKyAgICAjIERpc2FibGUgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiBUaGlzIHByZXZlbnRzIF9fZGVsX19zIGZyb20gc2hvd2luZyB1cCBpbgorICAgICMgdHJhY2VzLgorICAgIG9sZF9nYyA9IGdjLmlzZW5hYmxlZCgpCisgICAgZ2MuZGlzYWJsZSgpCisgICAgdHJ5OgorICAgICAgICBzeXMuc2V0cHJvZmlsZShwLmNhbGxiYWNrKQorICAgICAgICBwcm90ZWN0KGNhbGxhYmxlLCBwKQorICAgICAgICBzeXMuc2V0cHJvZmlsZShOb25lKQorICAgIGZpbmFsbHk6CisgICAgICAgIGlmIG9sZF9nYzoKKyAgICAgICAgICAgIGdjLmVuYWJsZSgpCisgICAgcmV0dXJuIHAuZ2V0X2V2ZW50cygpWzE6LTFdCisKKworZGVmIHNob3dfZXZlbnRzKGNhbGxhYmxlKToKKyAgICBpbXBvcnQgcHByaW50CisgICAgcHByaW50LnBwcmludChjYXB0dXJlX2V2ZW50cyhjYWxsYWJsZSkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFRlc3RHZXRQcm9maWxlLAorICAgICAgICBQcm9maWxlSG9va1Rlc3RDYXNlLAorICAgICAgICBQcm9maWxlU2ltdWxhdG9yVGVzdENhc2UKKyAgICApCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHByb2ZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHByb2ZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmE2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0cHJvZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHByb2ZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHByb2ZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YmE2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0cHJvZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzX3NldHRyYWNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljN2JjZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHkKQEAgLTAsMCArMSw4MDAgQEAKKyMgVGVzdGluZyB0aGUgbGluZSB0cmFjZSBmYWNpbGl0eS4KKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHN5cworaW1wb3J0IGRpZmZsaWIKK2ltcG9ydCBnYworCisjIEEgdmVyeSBiYXNpYyBleGFtcGxlLiAgSWYgdGhpcyBmYWlscywgd2UncmUgaW4gZGVlcCB0cm91YmxlLgorZGVmIGJhc2ljKCk6CisgICAgcmV0dXJuIDEKKworYmFzaWMuZXZlbnRzID0gWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICgxLCAncmV0dXJuJyldCisKKyMgTWFueSBvZiB0aGUgdGVzdHMgYmVsb3cgYXJlIHRyaWNreSBiZWNhdXNlIHRoZXkgaW52b2x2ZSBwYXNzIHN0YXRlbWVudHMuCisjIElmIHRoZXJlIGlzIGltcGxpY2l0IGNvbnRyb2wgZmxvdyBhcm91bmQgYSBwYXNzIHN0YXRlbWVudCAoaW4gYW4gZXhjZXB0CisjIGNsYXVzZSBvciBlbHNlIGNhbHVzZSkgdW5kZXIgd2hhdCBjb25kaXRpb25zIGRvIHlvdSBzZXQgYSBsaW5lIG51bWJlcgorIyBmb2xsb3dpbmcgdGhhdCBjbGF1c2U/CisKKworIyBUaGUgZW50aXJlICJ3aGlsZSAwOiIgc3RhdGVtZW50IGlzIG9wdGltaXplZCBhd2F5LiAgTm8gY29kZQorIyBleGlzdHMgZm9yIGl0LCBzbyB0aGUgbGluZSBudW1iZXJzIHNraXAgZGlyZWN0bHkgZnJvbSAiZGVsIHgiCisjIHRvICJ4ID0gMSIuCitkZWYgYXJpZ29fZXhhbXBsZSgpOgorICAgIHggPSAxCisgICAgZGVsIHgKKyAgICB3aGlsZSAwOgorICAgICAgICBwYXNzCisgICAgeCA9IDEKKworYXJpZ29fZXhhbXBsZS5ldmVudHMgPSBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKDUsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ3JldHVybicpXQorCisjIGNoZWNrIHRoYXQgbGluZXMgY29uc2lzdGluZyBvZiBqdXN0IG9uZSBpbnN0cnVjdGlvbiBnZXQgdHJhY2VkOgorZGVmIG9uZV9pbnN0cl9saW5lKCk6CisgICAgeCA9IDEKKyAgICBkZWwgeAorICAgIHggPSAxCisKK29uZV9pbnN0cl9saW5lLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ3JldHVybicpXQorCitkZWYgbm9fcG9wX3RvcHMoKTogICAgICAjIDAKKyAgICB4ID0gMSAgICAgICAgICAgICAgICMgMQorICAgIGZvciBhIGluIHJhbmdlKDIpOiAgIyAyCisgICAgICAgIGlmIGE6ICAgICAgICAgICAjIDMKKyAgICAgICAgICAgIHggPSAxICAgICAgICMgNAorICAgICAgICBlbHNlOiAgICAgICAgICAgIyA1CisgICAgICAgICAgICB4ID0gMSAgICAgICAjIDYKKworbm9fcG9wX3RvcHMuZXZlbnRzID0gWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICg2LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJyldCisKK2RlZiBub19wb3BfYmxvY2tzKCk6CisgICAgeSA9IDEKKyAgICB3aGlsZSBub3QgeToKKyAgICAgICAgYmxhCisgICAgeCA9IDEKKworbm9fcG9wX2Jsb2Nrcy5ldmVudHMgPSBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ3JldHVybicpXQorCitkZWYgY2FsbGVkKCk6ICMgbGluZSAtMworICAgIHggPSAxCisKK2RlZiBjYWxsKCk6ICAgIyBsaW5lIDAKKyAgICBjYWxsZWQoKQorCitjYWxsLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgKC0zLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgKC0yLCAnbGluZScpLAorICAgICAgICAgICAgICAgKC0yLCAncmV0dXJuJyksCisgICAgICAgICAgICAgICAoMSwgJ3JldHVybicpXQorCitkZWYgcmFpc2VzKCk6CisgICAgcmFpc2UgRXhjZXB0aW9uCisKK2RlZiB0ZXN0X3JhaXNlKCk6CisgICAgdHJ5OgorICAgICAgICByYWlzZXMoKQorICAgIGV4Y2VwdCBFeGNlcHRpb24sIGV4YzoKKyAgICAgICAgeCA9IDEKKwordGVzdF9yYWlzZS5ldmVudHMgPSBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgKC0zLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICAgICAgKC0yLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgKC0yLCAnZXhjZXB0aW9uJyksCisgICAgICAgICAgICAgICAgICAgICAoLTIsICdyZXR1cm4nKSwKKyAgICAgICAgICAgICAgICAgICAgICgyLCAnZXhjZXB0aW9uJyksCisgICAgICAgICAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgKDQsICdyZXR1cm4nKV0KKworZGVmIF9zZXR0cmFjZV9hbmRfcmV0dXJuKHRyYWNlZnVuYyk6CisgICAgc3lzLnNldHRyYWNlKHRyYWNlZnVuYykKKyAgICBzeXMuX2dldGZyYW1lKCkuZl9iYWNrLmZfdHJhY2UgPSB0cmFjZWZ1bmMKK2RlZiBzZXR0cmFjZV9hbmRfcmV0dXJuKHRyYWNlZnVuYyk6CisgICAgX3NldHRyYWNlX2FuZF9yZXR1cm4odHJhY2VmdW5jKQorCitzZXR0cmFjZV9hbmRfcmV0dXJuLmV2ZW50cyA9IFsoMSwgJ3JldHVybicpXQorCitkZWYgX3NldHRyYWNlX2FuZF9yYWlzZSh0cmFjZWZ1bmMpOgorICAgIHN5cy5zZXR0cmFjZSh0cmFjZWZ1bmMpCisgICAgc3lzLl9nZXRmcmFtZSgpLmZfYmFjay5mX3RyYWNlID0gdHJhY2VmdW5jCisgICAgcmFpc2UgUnVudGltZUVycm9yCitkZWYgc2V0dHJhY2VfYW5kX3JhaXNlKHRyYWNlZnVuYyk6CisgICAgdHJ5OgorICAgICAgICBfc2V0dHJhY2VfYW5kX3JhaXNlKHRyYWNlZnVuYykKKyAgICBleGNlcHQgUnVudGltZUVycm9yLCBleGM6CisgICAgICAgIHBhc3MKKworc2V0dHJhY2VfYW5kX3JhaXNlLmV2ZW50cyA9IFsoMiwgJ2V4Y2VwdGlvbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAncmV0dXJuJyldCisKKyMgaW1wbGljaXQgcmV0dXJuIGV4YW1wbGUKKyMgVGhpcyB0ZXN0IGlzIGludGVyZXN0aW5nIGJlY2F1c2Ugb2YgdGhlIGVsc2U6IHBhc3MKKyMgcGFydCBvZiB0aGUgY29kZS4gIFRoZSBjb2RlIGdlbmVyYXRlIGZvciB0aGUgdHJ1ZQorIyBwYXJ0IG9mIHRoZSBpZiBjb250YWlucyBhIGp1bXAgcGFzdCB0aGUgZWxzZSBicmFuY2guCisjIFRoZSBjb21waWxlciB0aGVuIGdlbmVyYXRlcyBhbiBpbXBsaWNpdCAicmV0dXJuIE5vbmUiCisjIEludGVybmFsbHksIHRoZSBjb21waWxlciB2aXNpdHMgdGhlIHBhc3Mgc3RhdGVtZW50CisjIGFuZCBzdG9yZXMgaXRzIGxpbmUgbnVtYmVyIGZvciB1c2Ugb24gdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisjIFRoZSBuZXh0IGluc3RydWN0aW9uIGlzIHRoZSBpbXBsaWNpdCByZXR1cm4gTm9uZS4KK2RlZiBpcmV0dXJuX2V4YW1wbGUoKToKKyAgICBhID0gNQorICAgIGIgPSA1CisgICAgaWYgYSA9PSBiOgorICAgICAgICBiID0gYSsxCisgICAgZWxzZToKKyAgICAgICAgcGFzcworCitpcmV0dXJuX2V4YW1wbGUuZXZlbnRzID0gWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDYsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICg2LCAncmV0dXJuJyldCisKKyMgVGlnaHQgbG9vcCB3aXRoIHdoaWxlKDEpIGV4YW1wbGUgKFNGICM3NjU2MjQpCitkZWYgdGlnaHRsb29wX2V4YW1wbGUoKToKKyAgICBpdGVtcyA9IHJhbmdlKDAsIDMpCisgICAgdHJ5OgorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgYiA9IGl0ZW1zW2ldOyBpKz0xCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHBhc3MKKwordGlnaHRsb29wX2V4YW1wbGUuZXZlbnRzID0gWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnZXhjZXB0aW9uJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcsICdyZXR1cm4nKV0KKworZGVmIHRpZ2h0ZXJsb29wX2V4YW1wbGUoKToKKyAgICBpdGVtcyA9IHJhbmdlKDEsIDQpCisgICAgdHJ5OgorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSAxOiBpID0gaXRlbXNbaV0KKyAgICBleGNlcHQgSW5kZXhFcnJvcjoKKyAgICAgICAgcGFzcworCit0aWdodGVybG9vcF9leGFtcGxlLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMywgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2V4Y2VwdGlvbicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2LCAncmV0dXJuJyldCisKK2RlZiBnZW5lcmF0b3JfZnVuY3Rpb24oKToKKyAgICB0cnk6CisgICAgICAgIHlpZWxkIFRydWUKKyAgICAgICAgImNvbnRpbnVlZCIKKyAgICBmaW5hbGx5OgorICAgICAgICAiZmluYWxseSIKK2RlZiBnZW5lcmF0b3JfZXhhbXBsZSgpOgorICAgICMgYW55KCkgd2lsbCBsZWF2ZSB0aGUgZ2VuZXJhdG9yIGJlZm9yZSBpdHMgZW5kCisgICAgeCA9IGFueShnZW5lcmF0b3JfZnVuY3Rpb24oKSkKKworICAgICMgdGhlIGZvbGxvd2luZyBsaW5lcyB3ZXJlIG5vdCB0cmFjZWQKKyAgICBmb3IgeCBpbiByYW5nZSgxMCk6CisgICAgICAgIHkgPSB4CisKK2dlbmVyYXRvcl9leGFtcGxlLmV2ZW50cyA9IChbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTYsICdjYWxsJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC00LCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQsICdyZXR1cm4nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC00LCAnY2FsbCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTQsICdleGNlcHRpb24nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLCAnbGluZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEsICdyZXR1cm4nKV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoNSwgJ2xpbmUnKSwgKDYsICdsaW5lJyldICogMTAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoNSwgJ2xpbmUnKSwgKDUsICdyZXR1cm4nKV0pCisKKworY2xhc3MgVHJhY2VyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5ldmVudHMgPSBbXQorICAgIGRlZiB0cmFjZShzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCgoZnJhbWUuZl9saW5lbm8sIGV2ZW50KSkKKyAgICAgICAgcmV0dXJuIHNlbGYudHJhY2UKKyAgICBkZWYgdHJhY2VXaXRoR2VuZXhwKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgKG8gZm9yIG8gaW4gWzFdKQorICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoKGZyYW1lLmZfbGluZW5vLCBldmVudCkpCisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlCisKK2NsYXNzIFRyYWNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBEaXNhYmxlIGdjIGNvbGxlY3Rpb24gd2hlbiB0cmFjaW5nLCBvdGhlcndpc2UgdGhlCisgICAgIyBkZWFsbG9jYXRvcnMgbWF5IGJlIHRyYWNlZCBhcyB3ZWxsLgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi51c2luZ19nYyA9IGdjLmlzZW5hYmxlZCgpCisgICAgICAgIGdjLmRpc2FibGUoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnVzaW5nX2djOgorICAgICAgICAgICAgZ2MuZW5hYmxlKCkKKworICAgIGRlZiBjb21wYXJlX2V2ZW50cyhzZWxmLCBsaW5lX29mZnNldCwgZXZlbnRzLCBleHBlY3RlZF9ldmVudHMpOgorICAgICAgICBldmVudHMgPSBbKGwgLSBsaW5lX29mZnNldCwgZSkgZm9yIChsLCBlKSBpbiBldmVudHNdCisgICAgICAgIGlmIGV2ZW50cyAhPSBleHBlY3RlZF9ldmVudHM6CisgICAgICAgICAgICBzZWxmLmZhaWwoCisgICAgICAgICAgICAgICAgImV2ZW50cyBkaWQgbm90IG1hdGNoIGV4cGVjdGF0aW9uOlxuIiArCisgICAgICAgICAgICAgICAgIlxuIi5qb2luKGRpZmZsaWIubmRpZmYoW3N0cih4KSBmb3IgeCBpbiBleHBlY3RlZF9ldmVudHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHIoeCkgZm9yIHggaW4gZXZlbnRzXSkpKQorCisgICAgZGVmIHJ1bl9hbmRfY29tcGFyZShzZWxmLCBmdW5jLCBldmVudHMpOgorICAgICAgICB0cmFjZXIgPSBUcmFjZXIoKQorICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VyLnRyYWNlKQorICAgICAgICBmdW5jKCkKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgIHNlbGYuY29tcGFyZV9ldmVudHMoZnVuYy5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VyLmV2ZW50cywgZXZlbnRzKQorCisgICAgZGVmIHJ1bl90ZXN0KHNlbGYsIGZ1bmMpOgorICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZShmdW5jLCBmdW5jLmV2ZW50cykKKworICAgIGRlZiBydW5fdGVzdDIoc2VsZiwgZnVuYyk6CisgICAgICAgIHRyYWNlciA9IFRyYWNlcigpCisgICAgICAgIGZ1bmModHJhY2VyLnRyYWNlKQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgc2VsZi5jb21wYXJlX2V2ZW50cyhmdW5jLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZXIuZXZlbnRzLCBmdW5jLmV2ZW50cykKKworICAgIGRlZiB0ZXN0X3NldF9hbmRfcmV0cmlldmVfbm9uZShzZWxmKToKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgIGFzc2VydCBzeXMuZ2V0dHJhY2UoKSBpcyBOb25lCisKKyAgICBkZWYgdGVzdF9zZXRfYW5kX3JldHJpZXZlX2Z1bmMoc2VsZik6CisgICAgICAgIGRlZiBmbigqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc3lzLnNldHRyYWNlKGZuKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhc3NlcnQgc3lzLmdldHRyYWNlKCkgaXMgZm4KKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShOb25lKQorCisgICAgZGVmIHRlc3RfMDFfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoYmFzaWMpCisgICAgZGVmIHRlc3RfMDJfYXJpZ28oc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoYXJpZ29fZXhhbXBsZSkKKyAgICBkZWYgdGVzdF8wM19vbmVfaW5zdHIoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qob25lX2luc3RyX2xpbmUpCisgICAgZGVmIHRlc3RfMDRfbm9fcG9wX2Jsb2NrcyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19wb3BfYmxvY2tzKQorICAgIGRlZiB0ZXN0XzA1X25vX3BvcF90b3BzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF90b3BzKQorICAgIGRlZiB0ZXN0XzA2X2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoY2FsbCkKKyAgICBkZWYgdGVzdF8wN19yYWlzZShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdCh0ZXN0X3JhaXNlKQorCisgICAgZGVmIHRlc3RfMDhfc2V0dHJhY2VfYW5kX3JldHVybihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdDIoc2V0dHJhY2VfYW5kX3JldHVybikKKyAgICBkZWYgdGVzdF8wOV9zZXR0cmFjZV9hbmRfcmFpc2Uoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QyKHNldHRyYWNlX2FuZF9yYWlzZSkKKyAgICBkZWYgdGVzdF8xMF9pcmV0dXJuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGlyZXR1cm5fZXhhbXBsZSkKKyAgICBkZWYgdGVzdF8xMV90aWdodGxvb3Aoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QodGlnaHRsb29wX2V4YW1wbGUpCisgICAgZGVmIHRlc3RfMTJfdGlnaHRlcmxvb3Aoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QodGlnaHRlcmxvb3BfZXhhbXBsZSkKKworICAgIGRlZiB0ZXN0XzEzX2dlbmV4cChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChnZW5lcmF0b3JfZXhhbXBsZSkKKyAgICAgICAgIyBpc3N1ZTEyNjU6IGlmIHRoZSB0cmFjZSBmdW5jdGlvbiBjb250YWlucyBhIGdlbmVyYXRvciwKKyAgICAgICAgIyBhbmQgaWYgdGhlIHRyYWNlZCBmdW5jdGlvbiBjb250YWlucyBhbm90aGVyIGdlbmVyYXRvcgorICAgICAgICAjIHRoYXQgaXMgbm90IGNvbXBsZXRlbHkgZXhoYXVzdGVkLCB0aGUgdHJhY2Ugc3RvcHBlZC4KKyAgICAgICAgIyBXb3JzZTogdGhlICdmaW5hbGx5JyBjbGF1c2Ugd2FzIG5vdCBpbnZva2VkLgorICAgICAgICB0cmFjZXIgPSBUcmFjZXIoKQorICAgICAgICBzeXMuc2V0dHJhY2UodHJhY2VyLnRyYWNlV2l0aEdlbmV4cCkKKyAgICAgICAgZ2VuZXJhdG9yX2V4YW1wbGUoKQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgc2VsZi5jb21wYXJlX2V2ZW50cyhnZW5lcmF0b3JfZXhhbXBsZS5fX2NvZGVfXy5jb19maXJzdGxpbmVubywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjZXIuZXZlbnRzLCBnZW5lcmF0b3JfZXhhbXBsZS5ldmVudHMpCisKKyAgICBkZWYgdGVzdF8xNF9vbmxpbmVyX2lmKHNlbGYpOgorICAgICAgICBkZWYgb25saW5lcnMoKToKKyAgICAgICAgICAgIGlmIFRydWU6IEZhbHNlCisgICAgICAgICAgICBlbHNlOiBUcnVlCisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZSgKKyAgICAgICAgICAgIG9ubGluZXJzLAorICAgICAgICAgICAgWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICgxLCAnbGluZScpLAorICAgICAgICAgICAgICgzLCAnbGluZScpLAorICAgICAgICAgICAgICgzLCAncmV0dXJuJyldKQorCisgICAgZGVmIHRlc3RfMTVfbG9vcHMoc2VsZik6CisgICAgICAgICMgaXNzdWUxNzUwMDc2OiAid2hpbGUiIGV4cHJlc3Npb24gaXMgc2tpcHBlZCBieSBkZWJ1Z2dlcgorICAgICAgICBkZWYgZm9yX2V4YW1wbGUoKToKKyAgICAgICAgICAgIGZvciB4IGluIHJhbmdlKDIpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5ydW5fYW5kX2NvbXBhcmUoCisgICAgICAgICAgICBmb3JfZXhhbXBsZSwKKyAgICAgICAgICAgIFsoMCwgJ2NhbGwnKSwKKyAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAoMSwgJ3JldHVybicpXSkKKworICAgICAgICBkZWYgd2hpbGVfZXhhbXBsZSgpOgorICAgICAgICAgICAgIyBXaGlsZSBleHByZXNzaW9uIHNob3VsZCBiZSB0cmFjZWQgb24gZXZlcnkgbG9vcAorICAgICAgICAgICAgeCA9IDIKKyAgICAgICAgICAgIHdoaWxlIHggPiAwOgorICAgICAgICAgICAgICAgIHggLT0gMQorICAgICAgICBzZWxmLnJ1bl9hbmRfY29tcGFyZSgKKyAgICAgICAgICAgIHdoaWxlX2V4YW1wbGUsCisgICAgICAgICAgICBbKDAsICdjYWxsJyksCisgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgKDQsICdsaW5lJyksCisgICAgICAgICAgICAgKDMsICdsaW5lJyksCisgICAgICAgICAgICAgKDMsICdyZXR1cm4nKV0pCisKKyAgICBkZWYgdGVzdF8xNl9ibGFua19saW5lcyhzZWxmKToKKyAgICAgICAgZXhlYygiZGVmIGYoKTpcbiIgKyAiXG4iICogMjU2ICsgIiAgICBwYXNzIikKKyAgICAgICAgc2VsZi5ydW5fYW5kX2NvbXBhcmUoCisgICAgICAgICAgICBmLAorICAgICAgICAgICAgWygwLCAnY2FsbCcpLAorICAgICAgICAgICAgICgyNTcsICdsaW5lJyksCisgICAgICAgICAgICAgKDI1NywgJ3JldHVybicpXSkKKworCitjbGFzcyBSYWlzaW5nVHJhY2VGdW5jVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0cmFjZShzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZyk6CisgICAgICAgICIiIkEgdHJhY2UgZnVuY3Rpb24gdGhhdCByYWlzZXMgYW4gZXhjZXB0aW9uIGluIHJlc3BvbnNlIHRvIGEKKyAgICAgICAgc3BlY2lmaWMgdHJhY2UgZXZlbnQuIiIiCisgICAgICAgIGlmIGV2ZW50ID09IHNlbGYucmFpc2VPbkV2ZW50OgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciAjIGp1c3Qgc29tZXRoaW5nIHRoYXQgaXNuJ3QgUnVudGltZUVycm9yCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50cmFjZQorCisgICAgZGVmIGYoc2VsZik6CisgICAgICAgICIiIlRoZSBmdW5jdGlvbiB0byB0cmFjZTsgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGF0J3MgdGhlIGNhc2UKKyAgICAgICAgd2UncmUgdGVzdGluZywgc28gdGhhdCB0aGUgJ2V4Y2VwdGlvbicgdHJhY2UgZXZlbnQgZmlyZXMuIiIiCisgICAgICAgIGlmIHNlbGYucmFpc2VPbkV2ZW50ID09ICdleGNlcHRpb24nOgorICAgICAgICAgICAgeCA9IDAKKyAgICAgICAgICAgIHkgPSAxIC8vIHgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgcnVuX3Rlc3RfZm9yX2V2ZW50KHNlbGYsIGV2ZW50KToKKyAgICAgICAgIiIiVGVzdHMgdGhhdCBhbiBleGNlcHRpb24gcmFpc2VkIGluIHJlc3BvbnNlIHRvIHRoZSBnaXZlbiBldmVudCBpcworICAgICAgICBoYW5kbGVkIE9LLiIiIgorICAgICAgICBzZWxmLnJhaXNlT25FdmVudCA9IGV2ZW50CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShzeXMuZ2V0cmVjdXJzaW9ubGltaXQoKSArIDEpOgorICAgICAgICAgICAgICAgIHN5cy5zZXR0cmFjZShzZWxmLnRyYWNlKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhjZXB0aW9uIG5vdCByYWlzZWQhIikKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmVjdXJzaW9uIGNvdW50ZXIgbm90IHJlc2V0IikKKworICAgICMgVGVzdCB0aGUgaGFuZGxpbmcgb2YgZXhjZXB0aW9ucyByYWlzZWQgYnkgZWFjaCBraW5kIG9mIHRyYWNlIGV2ZW50LgorICAgIGRlZiB0ZXN0X2NhbGwoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3RfZm9yX2V2ZW50KCdjYWxsJykKKyAgICBkZWYgdGVzdF9saW5lKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0X2Zvcl9ldmVudCgnbGluZScpCisgICAgZGVmIHRlc3RfcmV0dXJuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0X2Zvcl9ldmVudCgncmV0dXJuJykKKyAgICBkZWYgdGVzdF9leGNlcHRpb24oc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3RfZm9yX2V2ZW50KCdleGNlcHRpb24nKQorCisgICAgZGVmIHRlc3RfdHJhc2hfc3RhY2soc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSg1KToKKyAgICAgICAgICAgICAgICBwcmludCBpICAjIGxpbmUgdHJhY2luZyB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBhdCB0aGlzIGxpbmUKKworICAgICAgICBkZWYgZyhmcmFtZSwgd2h5LCBleHRyYSk6CisgICAgICAgICAgICBpZiAod2h5ID09ICdsaW5lJyBhbmQKKyAgICAgICAgICAgICAgICBmcmFtZS5mX2xpbmVubyA9PSBmLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubyArIDIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImkgYW0gY3Jhc2hpbmciCisgICAgICAgICAgICByZXR1cm4gZworCisgICAgICAgIHN5cy5zZXR0cmFjZShnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmKCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICMgdGhlIHRlc3QgaXMgcmVhbGx5IHRoYXQgdGhpcyBkb2Vzbid0IHNlZ2ZhdWx0OgorICAgICAgICAgICAgaW1wb3J0IGdjCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhjZXB0aW9uIG5vdCBwcm9wYWdhdGVkIikKKworCisjICdKdW1wJyB0ZXN0czogYXNzaWduaW5nIHRvIGZyYW1lLmZfbGluZW5vIHdpdGhpbiBhIHRyYWNlIGZ1bmN0aW9uCisjIG1vdmVzIHRoZSBleGVjdXRpb24gcG9zaXRpb24gLSBpdCdzIGhvdyBkZWJ1Z2dlcnMgaW1wbGVtZW50IGEgSnVtcAorIyBjb21tYW5kIChha2EuICJTZXQgbmV4dCBzdGF0ZW1lbnQiKS4KKworY2xhc3MgSnVtcFRyYWNlcjoKKyAgICAiIiJEZWZpbmVzIGEgdHJhY2UgZnVuY3Rpb24gdGhhdCBqdW1wcyBmcm9tIG9uZSBwbGFjZSB0byBhbm90aGVyLAorICAgIHdpdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbGluZXMgb2YgdGhlIGp1bXAgYmVpbmcgZGVmaW5lZCBieQorICAgIHRoZSAnanVtcCcgcHJvcGVydHkgb2YgdGhlIGZ1bmN0aW9uIHVuZGVyIHRlc3QuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnVuY3Rpb24pOgorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gZnVuY3Rpb24KKyAgICAgICAgc2VsZi5qdW1wRnJvbSA9IGZ1bmN0aW9uLmp1bXBbMF0KKyAgICAgICAgc2VsZi5qdW1wVG8gPSBmdW5jdGlvbi5qdW1wWzFdCisgICAgICAgIHNlbGYuZG9uZSA9IEZhbHNlCisKKyAgICBkZWYgdHJhY2Uoc2VsZiwgZnJhbWUsIGV2ZW50LCBhcmcpOgorICAgICAgICBpZiBub3Qgc2VsZi5kb25lIGFuZCBmcmFtZS5mX2NvZGUgPT0gc2VsZi5mdW5jdGlvbi5mdW5jX2NvZGU6CisgICAgICAgICAgICBmaXJzdExpbmUgPSBmcmFtZS5mX2NvZGUuY29fZmlyc3RsaW5lbm8KKyAgICAgICAgICAgIGlmIGV2ZW50ID09ICdsaW5lJyBhbmQgZnJhbWUuZl9saW5lbm8gPT0gZmlyc3RMaW5lICsgc2VsZi5qdW1wRnJvbToKKyAgICAgICAgICAgICAgICAjIENvcGUgd2l0aCBub24taW50ZWdlciBzZWxmLmp1bXBUbyAoYmVjYXVzZSBvZgorICAgICAgICAgICAgICAgICMgbm9fanVtcF90b19ub25faW50ZWdlcnMgYmVsb3cpLgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUuZl9saW5lbm8gPSBmaXJzdExpbmUgKyBzZWxmLmp1bXBUbworICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIGZyYW1lLmZfbGluZW5vID0gc2VsZi5qdW1wVG8KKyAgICAgICAgICAgICAgICBzZWxmLmRvbmUgPSBUcnVlCisgICAgICAgIHJldHVybiBzZWxmLnRyYWNlCisKKyMgVGhlIGZpcnN0IHNldCBvZiAnanVtcCcgdGVzdHMgYXJlIGZvciB0aGluZ3MgdGhhdCBhcmUgYWxsb3dlZDoKKworZGVmIGp1bXBfc2ltcGxlX2ZvcndhcmRzKG91dHB1dCk6CisgICAgb3V0cHV0LmFwcGVuZCgxKQorICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBvdXRwdXQuYXBwZW5kKDMpCisKK2p1bXBfc2ltcGxlX2ZvcndhcmRzLmp1bXAgPSAoMSwgMykKK2p1bXBfc2ltcGxlX2ZvcndhcmRzLm91dHB1dCA9IFszXQorCitkZWYganVtcF9zaW1wbGVfYmFja3dhcmRzKG91dHB1dCk6CisgICAgb3V0cHV0LmFwcGVuZCgxKQorICAgIG91dHB1dC5hcHBlbmQoMikKKworanVtcF9zaW1wbGVfYmFja3dhcmRzLmp1bXAgPSAoMiwgMSkKK2p1bXBfc2ltcGxlX2JhY2t3YXJkcy5vdXRwdXQgPSBbMSwgMSwgMl0KKworZGVmIGp1bXBfb3V0X29mX2Jsb2NrX2ZvcndhcmRzKG91dHB1dCk6CisgICAgZm9yIGkgaW4gMSwgMjoKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgyKQorICAgICAgICBmb3IgaiBpbiBbM106ICAjIEFsc28gdGVzdHMganVtcGluZyBvdmVyIGEgYmxvY2sKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoNCkKKyAgICBvdXRwdXQuYXBwZW5kKDUpCisKK2p1bXBfb3V0X29mX2Jsb2NrX2ZvcndhcmRzLmp1bXAgPSAoMywgNSkKK2p1bXBfb3V0X29mX2Jsb2NrX2ZvcndhcmRzLm91dHB1dCA9IFsyLCA1XQorCitkZWYganVtcF9vdXRfb2ZfYmxvY2tfYmFja3dhcmRzKG91dHB1dCk6CisgICAgb3V0cHV0LmFwcGVuZCgxKQorICAgIGZvciBpIGluIFsxXToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgzKQorICAgICAgICBmb3IgaiBpbiBbMl06ICAjIEFsc28gdGVzdHMganVtcGluZyBvdmVyIGEgYmxvY2sKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoNSkKKyAgICAgICAgb3V0cHV0LmFwcGVuZCg2KQorICAgIG91dHB1dC5hcHBlbmQoNykKKworanVtcF9vdXRfb2ZfYmxvY2tfYmFja3dhcmRzLmp1bXAgPSAoNiwgMSkKK2p1bXBfb3V0X29mX2Jsb2NrX2JhY2t3YXJkcy5vdXRwdXQgPSBbMSwgMywgNSwgMSwgMywgNSwgNiwgN10KKworZGVmIGp1bXBfdG9fY29kZWxlc3NfbGluZShvdXRwdXQpOgorICAgIG91dHB1dC5hcHBlbmQoMSkKKyAgICAjIEp1bXBpbmcgdG8gdGhpcyBsaW5lIHNob3VsZCBza2lwIHRvIHRoZSBuZXh0IG9uZS4KKyAgICBvdXRwdXQuYXBwZW5kKDMpCisKK2p1bXBfdG9fY29kZWxlc3NfbGluZS5qdW1wID0gKDEsIDIpCitqdW1wX3RvX2NvZGVsZXNzX2xpbmUub3V0cHV0ID0gWzNdCisKK2RlZiBqdW1wX3RvX3NhbWVfbGluZShvdXRwdXQpOgorICAgIG91dHB1dC5hcHBlbmQoMSkKKyAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgb3V0cHV0LmFwcGVuZCgzKQorCitqdW1wX3RvX3NhbWVfbGluZS5qdW1wID0gKDIsIDIpCitqdW1wX3RvX3NhbWVfbGluZS5vdXRwdXQgPSBbMSwgMiwgM10KKworIyBUZXN0cyBqdW1waW5nIHdpdGhpbiBhIGZpbmFsbHkgYmxvY2ssIGFuZCBvdmVyIG9uZS4KK2RlZiBqdW1wX2luX25lc3RlZF9maW5hbGx5KG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgZmluYWxseToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCg0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDYpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDgpCisgICAgICAgIG91dHB1dC5hcHBlbmQoOSkKKworanVtcF9pbl9uZXN0ZWRfZmluYWxseS5qdW1wID0gKDQsIDkpCitqdW1wX2luX25lc3RlZF9maW5hbGx5Lm91dHB1dCA9IFsyLCA5XQorCisjIFRoZSBzZWNvbmQgc2V0IG9mICdqdW1wJyB0ZXN0cyBhcmUgZm9yIHRoaW5ncyB0aGF0IGFyZSBub3QgYWxsb3dlZDoKKworZGVmIG5vX2p1bXBfdG9vX2Zhcl9mb3J3YXJkcyhvdXRwdXQpOgorICAgIHRyeToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgyKQorICAgICAgICBvdXRwdXQuYXBwZW5kKDMpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ2FmdGVyJyBpbiBzdHIoZSkpCisKK25vX2p1bXBfdG9vX2Zhcl9mb3J3YXJkcy5qdW1wID0gKDMsIDYpCitub19qdW1wX3Rvb19mYXJfZm9yd2FyZHMub3V0cHV0ID0gWzIsIFRydWVdCisKK2RlZiBub19qdW1wX3Rvb19mYXJfYmFja3dhcmRzKG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgICAgIG91dHB1dC5hcHBlbmQoMykKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnYmVmb3JlJyBpbiBzdHIoZSkpCisKK25vX2p1bXBfdG9vX2Zhcl9iYWNrd2FyZHMuanVtcCA9ICgzLCAtMSkKK25vX2p1bXBfdG9vX2Zhcl9iYWNrd2FyZHMub3V0cHV0ID0gWzIsIFRydWVdCisKKyMgVGVzdCBlYWNoIGtpbmQgb2YgJ2V4Y2VwdCcgbGluZS4KK2RlZiBub19qdW1wX3RvX2V4Y2VwdF8xKG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgZXhjZXB0OgorICAgICAgICBlID0gc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnZXhjZXB0JyBpbiBzdHIoZSkpCisKK25vX2p1bXBfdG9fZXhjZXB0XzEuanVtcCA9ICgyLCAzKQorbm9fanVtcF90b19leGNlcHRfMS5vdXRwdXQgPSBbVHJ1ZV0KKworZGVmIG5vX2p1bXBfdG9fZXhjZXB0XzIob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgZSA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIG91dHB1dC5hcHBlbmQoJ2V4Y2VwdCcgaW4gc3RyKGUpKQorCitub19qdW1wX3RvX2V4Y2VwdF8yLmp1bXAgPSAoMiwgMykKK25vX2p1bXBfdG9fZXhjZXB0XzIub3V0cHV0ID0gW1RydWVdCisKK2RlZiBub19qdW1wX3RvX2V4Y2VwdF8zKG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ2V4Y2VwdCcgaW4gc3RyKGUpKQorCitub19qdW1wX3RvX2V4Y2VwdF8zLmp1bXAgPSAoMiwgMykKK25vX2p1bXBfdG9fZXhjZXB0XzMub3V0cHV0ID0gW1RydWVdCisKK2RlZiBub19qdW1wX3RvX2V4Y2VwdF80KG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBSdW50aW1lRXJyb3IpLCBlOgorICAgICAgICBvdXRwdXQuYXBwZW5kKCdleGNlcHQnIGluIHN0cihlKSkKKworbm9fanVtcF90b19leGNlcHRfNC5qdW1wID0gKDIsIDMpCitub19qdW1wX3RvX2V4Y2VwdF80Lm91dHB1dCA9IFtUcnVlXQorCitkZWYgbm9fanVtcF9mb3J3YXJkc19pbnRvX2Jsb2NrKG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICBvdXRwdXQuYXBwZW5kKDIpCisgICAgICAgIGZvciBpIGluIDEsIDI6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDQpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ2ludG8nIGluIHN0cihlKSkKKworbm9fanVtcF9mb3J3YXJkc19pbnRvX2Jsb2NrLmp1bXAgPSAoMiwgNCkKK25vX2p1bXBfZm9yd2FyZHNfaW50b19ibG9jay5vdXRwdXQgPSBbVHJ1ZV0KKworZGVmIG5vX2p1bXBfYmFja3dhcmRzX2ludG9fYmxvY2sob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIGZvciBpIGluIDEsIDI6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDMpCisgICAgICAgIG91dHB1dC5hcHBlbmQoNCkKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnaW50bycgaW4gc3RyKGUpKQorCitub19qdW1wX2JhY2t3YXJkc19pbnRvX2Jsb2NrLmp1bXAgPSAoNCwgMykKK25vX2p1bXBfYmFja3dhcmRzX2ludG9fYmxvY2sub3V0cHV0ID0gWzMsIDMsIFRydWVdCisKK2RlZiBub19qdW1wX2ludG9fZmluYWxseV9ibG9jayhvdXRwdXQpOgorICAgIHRyeToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgzKQorICAgICAgICAgICAgeCA9IDEKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoNikKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnZmluYWxseScgaW4gc3RyKGUpKQorCitub19qdW1wX2ludG9fZmluYWxseV9ibG9jay5qdW1wID0gKDQsIDYpCitub19qdW1wX2ludG9fZmluYWxseV9ibG9jay5vdXRwdXQgPSBbMywgNiwgVHJ1ZV0gICMgVGhlICdmaW5hbGx5JyBzdGlsbCBydW5zCisKK2RlZiBub19qdW1wX291dF9vZl9maW5hbGx5X2Jsb2NrKG91dHB1dCk6CisgICAgdHJ5OgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDUpCisgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKDYpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgIG91dHB1dC5hcHBlbmQoJ2ZpbmFsbHknIGluIHN0cihlKSkKKworbm9fanVtcF9vdXRfb2ZfZmluYWxseV9ibG9jay5qdW1wID0gKDUsIDEpCitub19qdW1wX291dF9vZl9maW5hbGx5X2Jsb2NrLm91dHB1dCA9IFszLCBUcnVlXQorCisjIFRoaXMgdmVyaWZpZXMgdGhlIGxpbmUtbnVtYmVycy1tdXN0LWJlLWludGVnZXJzIHJ1bGUuCitkZWYgbm9fanVtcF90b19ub25faW50ZWdlcnMob3V0cHV0KToKKyAgICB0cnk6CisgICAgICAgIG91dHB1dC5hcHBlbmQoMikKKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgb3V0cHV0LmFwcGVuZCgnaW50ZWdlcicgaW4gc3RyKGUpKQorCitub19qdW1wX3RvX25vbl9pbnRlZ2Vycy5qdW1wID0gKDIsICJTcGFtIikKK25vX2p1bXBfdG9fbm9uX2ludGVnZXJzLm91dHB1dCA9IFtUcnVlXQorCitkZWYganVtcF9hY3Jvc3Nfd2l0aChvdXRwdXQpOgorICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgcGFzcworICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgcGFzcworanVtcF9hY3Jvc3Nfd2l0aC5qdW1wID0gKDEsIDMpCitqdW1wX2Fjcm9zc193aXRoLm91dHB1dCA9IFtdCisKKyMgVGhpcyB2ZXJpZmllcyB0aGF0IHlvdSBjYW4ndCBzZXQgZl9saW5lbm8gdmlhIF9nZXRmcmFtZSBvciBzaW1pbGFyCisjIHRyaWNrZXJ5LgorZGVmIG5vX2p1bXBfd2l0aG91dF90cmFjZV9mdW5jdGlvbigpOgorICAgIHRyeToKKyAgICAgICAgcHJldmlvdXNfZnJhbWUgPSBzeXMuX2dldGZyYW1lKCkuZl9iYWNrCisgICAgICAgIHByZXZpb3VzX2ZyYW1lLmZfbGluZW5vID0gcHJldmlvdXNfZnJhbWUuZl9saW5lbm8KKyAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKKyAgICAgICAgIyBUaGlzIGlzIHRoZSBleGNlcHRpb24gd2Ugd2FudGVkOyBtYWtlIHN1cmUgdGhlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgIyB0YWxrcyBhYm91dCB0cmFjZSBmdW5jdGlvbnMuCisgICAgICAgIGlmICd0cmFjZScgbm90IGluIHN0cihlKToKKyAgICAgICAgICAgIHJhaXNlCisgICAgZWxzZToKKyAgICAgICAgIyBTb21ldGhpbmcncyB3cm9uZyAtIHRoZSBleHBlY3RlZCBleGNlcHRpb24gd2Fzbid0IHJhaXNlZC4KKyAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiVHJhY2UtZnVuY3Rpb24tbGVzcyBqdW1wIGZhaWxlZCB0byBmYWlsIgorCisKK2NsYXNzIEp1bXBUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGNvbXBhcmVfanVtcF9vdXRwdXQoc2VsZiwgZXhwZWN0ZWQsIHJlY2VpdmVkKToKKyAgICAgICAgaWYgcmVjZWl2ZWQgIT0gZXhwZWN0ZWQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoICJPdXRwdXRzIGRvbid0IG1hdGNoOlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZDogIiArIHJlcHIoZXhwZWN0ZWQpICsgIlxuIiArCisgICAgICAgICAgICAgICAgICAgICAgICJSZWNlaXZlZDogIiArIHJlcHIocmVjZWl2ZWQpKQorCisgICAgZGVmIHJ1bl90ZXN0KHNlbGYsIGZ1bmMpOgorICAgICAgICB0cmFjZXIgPSBKdW1wVHJhY2VyKGZ1bmMpCisgICAgICAgIHN5cy5zZXR0cmFjZSh0cmFjZXIudHJhY2UpCisgICAgICAgIG91dHB1dCA9IFtdCisgICAgICAgIGZ1bmMob3V0cHV0KQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgc2VsZi5jb21wYXJlX2p1bXBfb3V0cHV0KGZ1bmMub3V0cHV0LCBvdXRwdXQpCisKKyAgICBkZWYgdGVzdF8wMV9qdW1wX3NpbXBsZV9mb3J3YXJkcyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChqdW1wX3NpbXBsZV9mb3J3YXJkcykKKyAgICBkZWYgdGVzdF8wMl9qdW1wX3NpbXBsZV9iYWNrd2FyZHMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoanVtcF9zaW1wbGVfYmFja3dhcmRzKQorICAgIGRlZiB0ZXN0XzAzX2p1bXBfb3V0X29mX2Jsb2NrX2ZvcndhcmRzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGp1bXBfb3V0X29mX2Jsb2NrX2ZvcndhcmRzKQorICAgIGRlZiB0ZXN0XzA0X2p1bXBfb3V0X29mX2Jsb2NrX2JhY2t3YXJkcyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChqdW1wX291dF9vZl9ibG9ja19iYWNrd2FyZHMpCisgICAgZGVmIHRlc3RfMDVfanVtcF90b19jb2RlbGVzc19saW5lKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGp1bXBfdG9fY29kZWxlc3NfbGluZSkKKyAgICBkZWYgdGVzdF8wNl9qdW1wX3RvX3NhbWVfbGluZShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChqdW1wX3RvX3NhbWVfbGluZSkKKyAgICBkZWYgdGVzdF8wN19qdW1wX2luX25lc3RlZF9maW5hbGx5KHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KGp1bXBfaW5fbmVzdGVkX2ZpbmFsbHkpCisgICAgZGVmIHRlc3RfMDhfbm9fanVtcF90b29fZmFyX2ZvcndhcmRzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9vX2Zhcl9mb3J3YXJkcykKKyAgICBkZWYgdGVzdF8wOV9ub19qdW1wX3Rvb19mYXJfYmFja3dhcmRzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9vX2Zhcl9iYWNrd2FyZHMpCisgICAgZGVmIHRlc3RfMTBfbm9fanVtcF90b19leGNlcHRfMShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8xKQorICAgIGRlZiB0ZXN0XzExX25vX2p1bXBfdG9fZXhjZXB0XzIoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMikKKyAgICBkZWYgdGVzdF8xMl9ub19qdW1wX3RvX2V4Y2VwdF8zKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzMpCisgICAgZGVmIHRlc3RfMTNfbm9fanVtcF90b19leGNlcHRfNChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF80KQorICAgIGRlZiB0ZXN0XzE0X25vX2p1bXBfZm9yd2FyZHNfaW50b19ibG9jayhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX2ZvcndhcmRzX2ludG9fYmxvY2spCisgICAgZGVmIHRlc3RfMTVfbm9fanVtcF9iYWNrd2FyZHNfaW50b19ibG9jayhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX2JhY2t3YXJkc19pbnRvX2Jsb2NrKQorICAgIGRlZiB0ZXN0XzE2X25vX2p1bXBfaW50b19maW5hbGx5X2Jsb2NrKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfaW50b19maW5hbGx5X2Jsb2NrKQorICAgIGRlZiB0ZXN0XzE3X25vX2p1bXBfb3V0X29mX2ZpbmFsbHlfYmxvY2soc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF9vdXRfb2ZfZmluYWxseV9ibG9jaykKKyAgICBkZWYgdGVzdF8xOF9ub19qdW1wX3RvX25vbl9pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX25vbl9pbnRlZ2VycykKKyAgICBkZWYgdGVzdF8xOV9ub19qdW1wX3dpdGhvdXRfdHJhY2VfZnVuY3Rpb24oc2VsZik6CisgICAgICAgIG5vX2p1bXBfd2l0aG91dF90cmFjZV9mdW5jdGlvbigpCisgICAgZGVmIHRlc3RfanVtcF9hY3Jvc3Nfd2l0aChzZWxmKToKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHRlc3Rfc3VwcG9ydC51bmxpbmssIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYucnVuX3Rlc3QoanVtcF9hY3Jvc3Nfd2l0aCkKKworICAgIGRlZiB0ZXN0XzIwX2xhcmdlX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBkID0ge30KKyAgICAgICAgZXhlYygiIiJkZWYgZihvdXRwdXQpOiAgICAgICAgIyBsaW5lIDAKKyAgICAgICAgICAgIHggPSAwICAgICAgICAgICAgICAgICAgICAgIyBsaW5lIDEKKyAgICAgICAgICAgIHkgPSAxICAgICAgICAgICAgICAgICAgICAgIyBsaW5lIDIKKyAgICAgICAgICAgICcnJyAgICAgICAgICAgICAgICAgICAgICAgIyBsaW5lIDMKKyAgICAgICAgICAgICVzICAgICAgICAgICAgICAgICAgICAgICAgIyBsaW5lcyA0LTEwMDQKKyAgICAgICAgICAgICcnJyAgICAgICAgICAgICAgICAgICAgICAgIyBsaW5lIDEwMDUKKyAgICAgICAgICAgIHggKz0gMSAgICAgICAgICAgICAgICAgICAgIyBsaW5lIDEwMDYKKyAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoeCkgICAgICAgICAgIyBsaW5lIDEwMDcKKyAgICAgICAgICAgIHJldHVybiIiIiAlICgnXG4nICogMTAwMCwpLCBkKQorICAgICAgICBmID0gZFsnZiddCisKKyAgICAgICAgZi5qdW1wID0gKDIsIDEwMDcpCisgICAgICAgIGYub3V0cHV0ID0gWzBdCisgICAgICAgIHNlbGYucnVuX3Rlc3QoZikKKworICAgIGRlZiB0ZXN0X2p1bXBfdG9fZmlyc3RsaW5lbm8oc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0cyB0aGF0IFBEQiBjYW4ganVtcCBiYWNrIHRvIHRoZSBmaXJzdCBsaW5lIGluIGEKKyAgICAgICAgIyBmaWxlLiAgU2VlIGlzc3VlICMxNjg5NDU4LiAgSXQgY2FuIG9ubHkgYmUgdHJpZ2dlcmVkIGluIGEKKyAgICAgICAgIyBmdW5jdGlvbiBjYWxsIGlmIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIG9uIGEgc2luZ2xlIGxpbmUuCisgICAgICAgIGNvZGUgPSBjb21waWxlKCIiIgorIyBDb21tZW50cyBkb24ndCBjb3VudC4KK291dHB1dC5hcHBlbmQoMikgICMgZmlyc3RsaW5lbm8gaXMgaGVyZS4KK291dHB1dC5hcHBlbmQoMykKK291dHB1dC5hcHBlbmQoNCkKKyIiIiwgIjxmYWtlIG1vZHVsZT4iLCAiZXhlYyIpCisgICAgICAgIGNsYXNzIGZha2VfZnVuY3Rpb246CisgICAgICAgICAgICBmdW5jX2NvZGUgPSBjb2RlCisgICAgICAgICAgICBqdW1wID0gKDIsIDApCisgICAgICAgIHRyYWNlciA9IEp1bXBUcmFjZXIoZmFrZV9mdW5jdGlvbikKKyAgICAgICAgc3lzLnNldHRyYWNlKHRyYWNlci50cmFjZSkKKyAgICAgICAgbmFtZXNwYWNlID0geyJvdXRwdXQiOiBbXX0KKyAgICAgICAgZXhlYyBjb2RlIGluIG5hbWVzcGFjZQorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgc2VsZi5jb21wYXJlX2p1bXBfb3V0cHV0KFsyLCAzLCAyLCAzLCA0XSwgbmFtZXNwYWNlWyJvdXRwdXQiXSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgVHJhY2VUZXN0Q2FzZSwKKyAgICAgICAgUmFpc2luZ1RyYWNlRnVuY1Rlc3RDYXNlLAorICAgICAgICBKdW1wVGVzdENhc2UKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYmI2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c19zZXR0cmFjZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZDBlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNfc2V0dHJhY2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTVmMzVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfc3lzY29uZmlnLnB5CkBAIC0wLDAgKzEsMzI4IEBACisiIiJUZXN0cyBmb3Igc3lzY29uZmlnLiIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHN1YnByb2Nlc3MKK2Zyb20gY29weSBpbXBvcnQgY29weSwgZGVlcGNvcHkKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk4sIHVubGluaywgZ2V0X2F0dHJpYnV0ZQorCitpbXBvcnQgc3lzY29uZmlnCitmcm9tIHN5c2NvbmZpZyBpbXBvcnQgKGdldF9wYXRocywgZ2V0X3BsYXRmb3JtLCBnZXRfY29uZmlnX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGdldF9wYXRoLCBnZXRfcGF0aF9uYW1lcywgX0lOU1RBTExfU0NIRU1FUywKKyAgICAgICAgICAgICAgICAgICAgICAgX2dldF9kZWZhdWx0X3NjaGVtZSwgX2V4cGFuZF92YXJzLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRfc2NoZW1lX25hbWVzLCBnZXRfY29uZmlnX3ZhcikKK2ltcG9ydCBfb3N4X3N1cHBvcnQKKworY2xhc3MgVGVzdFN5c0NvbmZpZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICIiIk1ha2UgYSBjb3B5IG9mIHN5cy5wYXRoIiIiCisgICAgICAgIHN1cGVyKFRlc3RTeXNDb25maWcsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5zeXNfcGF0aCA9IHN5cy5wYXRoWzpdCisgICAgICAgIHNlbGYubWFrZWZpbGUgPSBOb25lCisgICAgICAgICMgcGF0Y2hpbmcgb3MudW5hbWUKKyAgICAgICAgaWYgaGFzYXR0cihvcywgJ3VuYW1lJyk6CisgICAgICAgICAgICBzZWxmLnVuYW1lID0gb3MudW5hbWUKKyAgICAgICAgICAgIHNlbGYuX3VuYW1lID0gb3MudW5hbWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi51bmFtZSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX3VuYW1lID0gTm9uZQorICAgICAgICBvcy51bmFtZSA9IHNlbGYuX2dldF91bmFtZQorICAgICAgICAjIHNhdmluZyB0aGUgZW52aXJvbm1lbnQKKyAgICAgICAgc2VsZi5uYW1lID0gb3MubmFtZQorICAgICAgICBzZWxmLnBsYXRmb3JtID0gc3lzLnBsYXRmb3JtCisgICAgICAgIHNlbGYudmVyc2lvbiA9IHN5cy52ZXJzaW9uCisgICAgICAgIHNlbGYuc2VwID0gb3Muc2VwCisgICAgICAgIHNlbGYuam9pbiA9IG9zLnBhdGguam9pbgorICAgICAgICBzZWxmLmlzYWJzID0gb3MucGF0aC5pc2FicworICAgICAgICBzZWxmLnNwbGl0ZHJpdmUgPSBvcy5wYXRoLnNwbGl0ZHJpdmUKKyAgICAgICAgc2VsZi5fY29uZmlnX3ZhcnMgPSBjb3B5KHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMpCisgICAgICAgIHNlbGYub2xkX2Vudmlyb24gPSBkZWVwY29weShvcy5lbnZpcm9uKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAiIiJSZXN0b3JlIHN5cy5wYXRoIiIiCisgICAgICAgIHN5cy5wYXRoWzpdID0gc2VsZi5zeXNfcGF0aAorICAgICAgICBpZiBzZWxmLm1ha2VmaWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3MudW5saW5rKHNlbGYubWFrZWZpbGUpCisgICAgICAgIHNlbGYuX2NsZWFudXBfdGVzdGZuKCkKKyAgICAgICAgaWYgc2VsZi51bmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9zLnVuYW1lID0gc2VsZi51bmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVsIG9zLnVuYW1lCisgICAgICAgIG9zLm5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gc2VsZi5wbGF0Zm9ybQorICAgICAgICBzeXMudmVyc2lvbiA9IHNlbGYudmVyc2lvbgorICAgICAgICBvcy5zZXAgPSBzZWxmLnNlcAorICAgICAgICBvcy5wYXRoLmpvaW4gPSBzZWxmLmpvaW4KKyAgICAgICAgb3MucGF0aC5pc2FicyA9IHNlbGYuaXNhYnMKKyAgICAgICAgb3MucGF0aC5zcGxpdGRyaXZlID0gc2VsZi5zcGxpdGRyaXZlCisgICAgICAgIHN5c2NvbmZpZy5fQ09ORklHX1ZBUlMgPSBjb3B5KHNlbGYuX2NvbmZpZ192YXJzKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLm9sZF9lbnZpcm9uLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBvcy5lbnZpcm9uLmdldChrZXkpICE9IHZhbHVlOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25ba2V5XSA9IHZhbHVlCisKKyAgICAgICAgZm9yIGtleSBpbiBvcy5lbnZpcm9uLmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gc2VsZi5vbGRfZW52aXJvbjoKKyAgICAgICAgICAgICAgICBkZWwgb3MuZW52aXJvbltrZXldCisKKyAgICAgICAgc3VwZXIoVGVzdFN5c0NvbmZpZywgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIF9zZXRfdW5hbWUoc2VsZiwgdW5hbWUpOgorICAgICAgICBzZWxmLl91bmFtZSA9IHVuYW1lCisKKyAgICBkZWYgX2dldF91bmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3VuYW1lCisKKyAgICBkZWYgX2NsZWFudXBfdGVzdGZuKHNlbGYpOgorICAgICAgICBwYXRoID0gVEVTVEZOCisgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHBhdGgpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUocGF0aCkKKworICAgIGRlZiB0ZXN0X2dldF9wYXRoX25hbWVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wYXRoX25hbWVzKCksIHN5c2NvbmZpZy5fU0NIRU1FX0tFWVMpCisKKyAgICBkZWYgdGVzdF9nZXRfcGF0aHMoc2VsZik6CisgICAgICAgIHNjaGVtZSA9IGdldF9wYXRocygpCisgICAgICAgIGRlZmF1bHRfc2NoZW1lID0gX2dldF9kZWZhdWx0X3NjaGVtZSgpCisgICAgICAgIHdhbnRlZCA9IF9leHBhbmRfdmFycyhkZWZhdWx0X3NjaGVtZSwgTm9uZSkKKyAgICAgICAgd2FudGVkID0gd2FudGVkLml0ZW1zKCkKKyAgICAgICAgd2FudGVkLnNvcnQoKQorICAgICAgICBzY2hlbWUgPSBzY2hlbWUuaXRlbXMoKQorICAgICAgICBzY2hlbWUuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2NoZW1lLCB3YW50ZWQpCisKKyAgICBkZWYgdGVzdF9nZXRfcGF0aChzZWxmKToKKyAgICAgICAgIyB4eHggbWFrZSByZWFsIHRlc3RzIGhlcmUKKyAgICAgICAgZm9yIHNjaGVtZSBpbiBfSU5TVEFMTF9TQ0hFTUVTOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gX0lOU1RBTExfU0NIRU1FU1tzY2hlbWVdOgorICAgICAgICAgICAgICAgIHJlcyA9IGdldF9wYXRoKG5hbWUsIHNjaGVtZSkKKworICAgIGRlZiB0ZXN0X2dldF9jb25maWdfdmFycyhzZWxmKToKKyAgICAgICAgY3ZhcnMgPSBnZXRfY29uZmlnX3ZhcnMoKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoY3ZhcnMsIGRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjdmFycykKKworICAgIGRlZiB0ZXN0X2dldF9wbGF0Zm9ybShzZWxmKToKKyAgICAgICAgIyB3aW5kb3dzIFhQLCAzMmJpdHMKKyAgICAgICAgb3MubmFtZSA9ICdudCcKKyAgICAgICAgc3lzLnZlcnNpb24gPSAoJzIuNC40ICgjNzEsIE9jdCAxOCAyMDA2LCAwODozNDo0MykgJworICAgICAgICAgICAgICAgICAgICAgICAnW01TQyB2LjEzMTAgMzIgYml0IChJbnRlbCldJykKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ3dpbjMyJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnd2luMzInKQorCisgICAgICAgICMgd2luZG93cyBYUCwgYW1kNjQKKyAgICAgICAgb3MubmFtZSA9ICdudCcKKyAgICAgICAgc3lzLnZlcnNpb24gPSAoJzIuNC40ICgjNzEsIE9jdCAxOCAyMDA2LCAwODozNDo0MykgJworICAgICAgICAgICAgICAgICAgICAgICAnW01TQyB2LjEzMTAgMzIgYml0IChBbWQ2NCldJykKKyAgICAgICAgc3lzLnBsYXRmb3JtID0gJ3dpbjMyJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnd2luLWFtZDY0JykKKworICAgICAgICAjIHdpbmRvd3MgWFAsIGl0YW5pdW0KKyAgICAgICAgb3MubmFtZSA9ICdudCcKKyAgICAgICAgc3lzLnZlcnNpb24gPSAoJzIuNC40ICgjNzEsIE9jdCAxOCAyMDA2LCAwODozNDo0MykgJworICAgICAgICAgICAgICAgICAgICAgICAnW01TQyB2LjEzMTAgMzIgYml0IChJdGFuaXVtKV0nKQorICAgICAgICBzeXMucGxhdGZvcm0gPSAnd2luMzInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BsYXRmb3JtKCksICd3aW4taWE2NCcpCisKKyAgICAgICAgIyBtYWNib29rCisgICAgICAgIG9zLm5hbWUgPSAncG9zaXgnCisgICAgICAgIHN5cy52ZXJzaW9uID0gKCcyLjUgKHIyNTo1MTkxOCwgU2VwIDE5IDIwMDYsIDA4OjQ5OjEzKSAnCisgICAgICAgICAgICAgICAgICAgICAgICdcbltHQ0MgNC4wLjEgKEFwcGxlIENvbXB1dGVyLCBJbmMuIGJ1aWxkIDUzNDEpXScpCisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdkYXJ3aW4nCisgICAgICAgIHNlbGYuX3NldF91bmFtZSgoJ0RhcndpbicsICdtYWN6aWFkZScsICc4LjExLjEnLAorICAgICAgICAgICAgICAgICAgICgnRGFyd2luIEtlcm5lbCBWZXJzaW9uIDguMTEuMTogJworICAgICAgICAgICAgICAgICAgICAnV2VkIE9jdCAxMCAxODoyMzoyOCBQRFQgMjAwNzsgJworICAgICAgICAgICAgICAgICAgICAncm9vdDp4bnUtNzkyLjI1LjIwfjEvUkVMRUFTRV9JMzg2JyksICdQb3dlclBDJykpCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhnZXRfY29uZmlnX3ZhcnMoKSkKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddID0gJzEwLjMnCisKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctZm5vLXN0cmljdC1hbGlhc2luZyAtRE5ERUJVRyAtZyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZ3cmFwdiAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcycpCisKKyAgICAgICAgbWF4aW50ID0gc3lzLm1heGludAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMubWF4aW50ID0gMjE0NzQ4MzY0NworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC4zLXBwYycpCisgICAgICAgICAgICBzeXMubWF4aW50ID0gOTIyMzM3MjAzNjg1NDc3NTgwNworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC4zLXBwYzY0JykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN5cy5tYXhpbnQgPSBtYXhpbnQKKworCisgICAgICAgIHNlbGYuX3NldF91bmFtZSgoJ0RhcndpbicsICdtYWN6aWFkZScsICc4LjExLjEnLAorICAgICAgICAgICAgICAgICAgICgnRGFyd2luIEtlcm5lbCBWZXJzaW9uIDguMTEuMTogJworICAgICAgICAgICAgICAgICAgICAnV2VkIE9jdCAxMCAxODoyMzoyOCBQRFQgMjAwNzsgJworICAgICAgICAgICAgICAgICAgICAncm9vdDp4bnUtNzkyLjI1LjIwfjEvUkVMRUFTRV9JMzg2JyksICdpMzg2JykpCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhnZXRfY29uZmlnX3ZhcnMoKSkKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddID0gJzEwLjMnCisKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctZm5vLXN0cmljdC1hbGlhc2luZyAtRE5ERUJVRyAtZyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZ3cmFwdiAtTzMgLVdhbGwgLVdzdHJpY3QtcHJvdG90eXBlcycpCisKKyAgICAgICAgbWF4aW50ID0gc3lzLm1heGludAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMubWF4aW50ID0gMjE0NzQ4MzY0NworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC4zLWkzODYnKQorICAgICAgICAgICAgc3lzLm1heGludCA9IDkyMjMzNzIwMzY4NTQ3NzU4MDcKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BsYXRmb3JtKCksICdtYWNvc3gtMTAuMy14ODZfNjQnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLm1heGludCA9IG1heGludAorCisgICAgICAgICMgbWFjYm9vayB3aXRoIGZhdCBiaW5hcmllcyAoZmF0LCB1bml2ZXJzYWwgb3IgZmF0NjQpCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhnZXRfY29uZmlnX3ZhcnMoKSkKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddID0gJzEwLjQnCisgICAgICAgIGdldF9jb25maWdfdmFycygpWydDRkxBR1MnXSA9ICgnLWFyY2ggcHBjIC1hcmNoIGkzODYgLWlzeXNyb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1keW5hbWljIC1ETkRFQlVHIC1nIC1PMycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LWZhdCcpCisKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHg4Nl82NCAtYXJjaCBpMzg2IC1pc3lzcm9vdCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayAgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZHluYW1pYyAtRE5ERUJVRyAtZyAtTzMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BsYXRmb3JtKCksICdtYWNvc3gtMTAuNC1pbnRlbCcpCisKKyAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICBnZXRfY29uZmlnX3ZhcnMoKVsnQ0ZMQUdTJ10gPSAoJy1hcmNoIHg4Nl82NCAtYXJjaCBwcGMgLWFyY2ggaTM4NiAtaXN5c3Jvb3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy9EZXZlbG9wZXIvU0RLcy9NYWNPU1gxMC40dS5zZGsgICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctZm5vLXN0cmljdC1hbGlhc2luZyAtZm5vLWNvbW1vbiAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWR5bmFtaWMgLUROREVCVUcgLWcgLU8zJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LWZhdDMnKQorCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhnZXRfY29uZmlnX3ZhcnMoKSkKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctYXJjaCBwcGM2NCAtYXJjaCB4ODZfNjQgLWFyY2ggcHBjIC1hcmNoIGkzODYgLWlzeXNyb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1keW5hbWljIC1ETkRFQlVHIC1nIC1PMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3BsYXRmb3JtKCksICdtYWNvc3gtMTAuNC11bml2ZXJzYWwnKQorCisgICAgICAgIF9vc3hfc3VwcG9ydC5fcmVtb3ZlX29yaWdpbmFsX3ZhbHVlcyhnZXRfY29uZmlnX3ZhcnMoKSkKKyAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctYXJjaCB4ODZfNjQgLWFyY2ggcHBjNjQgLWlzeXNyb290ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1jb21tb24gJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1keW5hbWljIC1ETkRFQlVHIC1nIC1PMycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ21hY29zeC0xMC40LWZhdDY0JykKKworICAgICAgICBmb3IgYXJjaCBpbiAoJ3BwYycsICdpMzg2JywgJ3g4Nl82NCcsICdwcGM2NCcpOgorICAgICAgICAgICAgX29zeF9zdXBwb3J0Ll9yZW1vdmVfb3JpZ2luYWxfdmFsdWVzKGdldF9jb25maWdfdmFycygpKQorICAgICAgICAgICAgZ2V0X2NvbmZpZ192YXJzKClbJ0NGTEFHUyddID0gKCctYXJjaCAlcyAtaXN5c3Jvb3QgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvRGV2ZWxvcGVyL1NES3MvTWFjT1NYMTAuNHUuc2RrICAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy1mbm8tc3RyaWN0LWFsaWFzaW5nIC1mbm8tY29tbW9uICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLWR5bmFtaWMgLUROREVCVUcgLWcgLU8zJyUoYXJjaCwpKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9wbGF0Zm9ybSgpLCAnbWFjb3N4LTEwLjQtJXMnJShhcmNoLCkpCisKKyAgICAgICAgIyBsaW51eCBkZWJpYW4gc2FyZ2UKKyAgICAgICAgb3MubmFtZSA9ICdwb3NpeCcKKyAgICAgICAgc3lzLnZlcnNpb24gPSAoJzIuMy41ICgjMSwgSnVsICA0IDIwMDcsIDE3OjI4OjU5KSAnCisgICAgICAgICAgICAgICAgICAgICAgICdcbltHQ0MgNC4xLjIgMjAwNjExMTUgKHByZXJlbGVhc2UpIChEZWJpYW4gNC4xLjEtMjEpXScpCisgICAgICAgIHN5cy5wbGF0Zm9ybSA9ICdsaW51eDInCisgICAgICAgIHNlbGYuX3NldF91bmFtZSgoJ0xpbnV4JywgJ2FnbGFlJywgJzIuNi4yMS4xZGVkaWJveC1yNycsCisgICAgICAgICAgICAgICAgICAgICcjMSBNb24gQXByIDMwIDE3OjI1OjM4IENFU1QgMjAwNycsICdpNjg2JykpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfcGxhdGZvcm0oKSwgJ2xpbnV4LWk2ODYnKQorCisgICAgICAgICMgWFhYIG1vcmUgcGxhdGZvcm1zIHRvIHRlc3RzIGhlcmUKKworICAgIGRlZiB0ZXN0X2dldF9jb25maWdfaF9maWxlbmFtZShzZWxmKToKKyAgICAgICAgY29uZmlnX2ggPSBzeXNjb25maWcuZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGNvbmZpZ19oKSwgY29uZmlnX2gpCisKKyAgICBkZWYgdGVzdF9nZXRfc2NoZW1lX25hbWVzKHNlbGYpOgorICAgICAgICB3YW50ZWQgPSAoJ250JywgJ250X3VzZXInLCAnb3MyJywgJ29zMl9ob21lJywgJ29zeF9mcmFtZXdvcmtfdXNlcicsCisgICAgICAgICAgICAgICAgICAncG9zaXhfaG9tZScsICdwb3NpeF9wcmVmaXgnLCAncG9zaXhfdXNlcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X3NjaGVtZV9uYW1lcygpLCB3YW50ZWQpCisKKyAgICBkZWYgdGVzdF9zeW1saW5rKHNlbGYpOgorICAgICAgICAjIElzc3VlIDc4ODAKKyAgICAgICAgc3ltbGluayA9IGdldF9hdHRyaWJ1dGUob3MsICJzeW1saW5rIikKKyAgICAgICAgZGVmIGdldChweXRob24pOgorICAgICAgICAgICAgY21kID0gW3B5dGhvbiwgJy1jJywKKyAgICAgICAgICAgICAgICAgICAnaW1wb3J0IHN5c2NvbmZpZzsgcHJpbnQgc3lzY29uZmlnLmdldF9wbGF0Zm9ybSgpJ10KKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZCwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgICAgIHJldHVybiBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgcmVhbCA9IG9zLnBhdGgucmVhbHBhdGgoc3lzLmV4ZWN1dGFibGUpCisgICAgICAgIGxpbmsgPSBvcy5wYXRoLmFic3BhdGgoVEVTVEZOKQorICAgICAgICBzeW1saW5rKHJlYWwsIGxpbmspCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0KHJlYWwpLCBnZXQobGluaykpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB1bmxpbmsobGluaykKKworICAgIGRlZiB0ZXN0X3VzZXJfc2ltaWxhcihzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODc1OTogbWFrZSBzdXJlIHRoZSBwb3NpeCBzY2hlbWUgZm9yIHRoZSB1c2VycworICAgICAgICAjIGlzIHNpbWlsYXIgdG8gdGhlIGdsb2JhbCBwb3NpeF9wcmVmaXggb25lCisgICAgICAgIGJhc2UgPSBnZXRfY29uZmlnX3ZhcignYmFzZScpCisgICAgICAgIHVzZXIgPSBnZXRfY29uZmlnX3ZhcigndXNlcmJhc2UnKQorICAgICAgICAjIHRoZSBnbG9iYWwgc2NoZW1lIG1pcnJvcnMgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gcHJlZml4IGFuZAorICAgICAgICAjIGV4ZWMtcHJlZml4IGJ1dCBub3QgdGhlIHVzZXIgc2NoZW1lLCBzbyB3ZSBoYXZlIHRvIGFkYXB0IHRoZSBwYXRocworICAgICAgICAjIGJlZm9yZSBjb21wYXJpbmcgKGlzc3VlICM5MTAwKQorICAgICAgICBhZGFwdCA9IHN5cy5wcmVmaXggIT0gc3lzLmV4ZWNfcHJlZml4CisgICAgICAgIGZvciBuYW1lIGluICgnc3RkbGliJywgJ3BsYXRzdGRsaWInLCAncHVyZWxpYicsICdwbGF0bGliJyk6CisgICAgICAgICAgICBnbG9iYWxfcGF0aCA9IGdldF9wYXRoKG5hbWUsICdwb3NpeF9wcmVmaXgnKQorICAgICAgICAgICAgaWYgYWRhcHQ6CisgICAgICAgICAgICAgICAgZ2xvYmFsX3BhdGggPSBnbG9iYWxfcGF0aC5yZXBsYWNlKHN5cy5leGVjX3ByZWZpeCwgc3lzLnByZWZpeCkKKyAgICAgICAgICAgICAgICBiYXNlID0gYmFzZS5yZXBsYWNlKHN5cy5leGVjX3ByZWZpeCwgc3lzLnByZWZpeCkKKyAgICAgICAgICAgIHVzZXJfcGF0aCA9IGdldF9wYXRoKG5hbWUsICdwb3NpeF91c2VyJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXNlcl9wYXRoLCBnbG9iYWxfcGF0aC5yZXBsYWNlKGJhc2UsIHVzZXIsIDEpKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3Moc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iLCAidGVzdCBvbmx5IHJlbGV2YW50IG9uIE1hY09TWCIpCisgICAgZGVmIHRlc3RfcGxhdGZvcm1faW5fc3VicHJvY2VzcyhzZWxmKToKKyAgICAgICAgbXlfcGxhdGZvcm0gPSBzeXNjb25maWcuZ2V0X3BsYXRmb3JtKCkKKworICAgICAgICAjIFRlc3Qgd2l0aG91dCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgaW4gdGhlIGVudmlyb25tZW50CisKKyAgICAgICAgZW52ID0gb3MuZW52aXJvbi5jb3B5KCkKKyAgICAgICAgaWYgJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCcgaW4gZW52OgorICAgICAgICAgICAgZGVsIGVudlsnTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJ10KKworICAgICAgICB3aXRoIG9wZW4oJy9kZXYvbnVsbCcsICd3JykgYXMgZGV2bnVsbF9mcDoKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsKKyAgICAgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUsICctYycsCisgICAgICAgICAgICAgICAgICAgJ2ltcG9ydCBzeXNjb25maWc7IHByaW50KHN5c2NvbmZpZy5nZXRfcGxhdGZvcm0oKSknLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICBzdGRlcnI9ZGV2bnVsbF9mcCwKKyAgICAgICAgICAgICAgICBlbnY9ZW52KQorICAgICAgICB0ZXN0X3BsYXRmb3JtID0gcC5jb21tdW5pY2F0ZSgpWzBdLnN0cmlwKCkKKyAgICAgICAgdGVzdF9wbGF0Zm9ybSA9IHRlc3RfcGxhdGZvcm0uZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIHN0YXR1cyA9IHAud2FpdCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXlfcGxhdGZvcm0sIHRlc3RfcGxhdGZvcm0pCisKKworICAgICAgICAjIFRlc3Qgd2l0aCBNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgaW4gdGhlIGVudmlyb25tZW50LCBhbmQKKyAgICAgICAgIyB1c2luZyBhIHZhbHVlIHRoYXQgaXMgdW5saWtlbHkgdG8gYmUgdGhlIGRlZmF1bHQgb25lLgorICAgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBlbnZbJ01BQ09TWF9ERVBMT1lNRU5UX1RBUkdFVCddID0gJzEwLjEnCisKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWworICAgICAgICAgICAgICAgIHN5cy5leGVjdXRhYmxlLCAnLWMnLAorICAgICAgICAgICAgICAgICdpbXBvcnQgc3lzY29uZmlnOyBwcmludChzeXNjb25maWcuZ2V0X3BsYXRmb3JtKCkpJywKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgc3RkZXJyPW9wZW4oJy9kZXYvbnVsbCcpLAorICAgICAgICAgICAgZW52PWVudikKKyAgICAgICAgdGVzdF9wbGF0Zm9ybSA9IHAuY29tbXVuaWNhdGUoKVswXS5zdHJpcCgpCisgICAgICAgIHRlc3RfcGxhdGZvcm0gPSB0ZXN0X3BsYXRmb3JtLmRlY29kZSgndXRmLTgnKQorICAgICAgICBzdGF0dXMgPSBwLndhaXQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG15X3BsYXRmb3JtLCB0ZXN0X3BsYXRmb3JtKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RTeXNDb25maWcpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNjb25maWcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjUzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNjb25maWcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3N5c2NvbmZpZy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNjb25maWcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYjUzNmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF9zeXNjb25maWcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RhcmZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDM0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5CkBAIC0wLDAgKzEsMTY2NyBAQAorIyAtKi0gY29kaW5nOiBpc28tODg1OS0xNSAtKi0KKworaW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgU3RyaW5nSU8KK2Zyb20gaGFzaGxpYiBpbXBvcnQgbWQ1CitpbXBvcnQgZXJybm8KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGFyZmlsZQorCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIENoZWNrIGZvciBvdXIgY29tcHJlc3Npb24gbW9kdWxlcy4KK3RyeToKKyAgICBpbXBvcnQgZ3ppcAorICAgIGd6aXAuR3ppcEZpbGUKK2V4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICBnemlwID0gTm9uZQordHJ5OgorICAgIGltcG9ydCBiejIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBiejIgPSBOb25lCisKK2RlZiBtZDVzdW0oZGF0YSk6CisgICAgcmV0dXJuIG1kNShkYXRhKS5oZXhkaWdlc3QoKQorCitURU1QRElSID0gb3MucGF0aC5hYnNwYXRoKHRlc3Rfc3VwcG9ydC5URVNURk4pCit0YXJuYW1lID0gdGVzdF9zdXBwb3J0LmZpbmRmaWxlKCJ0ZXN0dGFyLnRhciIpCitnemlwbmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuZ3oiKQorYnoybmFtZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHRhci50YXIuYnoyIikKK3RtcG5hbWUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRtcC50YXIiKQorCittZDVfcmVndHlwZSA9ICI2NWY0NzdjODE4YWQ5ZTE1ZjdmZWFiMGM2ZDM3NzQyZiIKK21kNV9zcGFyc2UgPSAiYTU0ZmJjNGNhNGY0Mzk5YTkwZTFiMjcxNjQwMTJmYzYiCisKKworY2xhc3MgUmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgdGFybmFtZSA9IHRhcm5hbWUKKyAgICBtb2RlID0gInI6IgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIG1vZGU9c2VsZi5tb2RlLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50YXIuY2xvc2UoKQorCisKK2NsYXNzIFVzdGFyUmVhZFRlc3QoUmVhZFRlc3QpOgorCisgICAgZGVmIHRlc3RfZmlsZW9ial9yZWd1bGFyX2ZpbGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3JlZ3R5cGUiKQorICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgobGVuKGRhdGEpLCBtZDVzdW0oZGF0YSkpID09ICh0YXJpbmZvLnNpemUsIG1kNV9yZWd0eXBlKSwKKyAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBzZWxmLnRhci5leHRyYWN0KCJ1c3Rhci9yZWd0eXBlIiwgVEVNUERJUikKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIGZvYmoxID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3JlZ3R5cGUiKSwgInJVIikKKyAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQorCisgICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpCisgICAgICAgIGxpbmVzMiA9IGZvYmoyLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5lczEgPT0gbGluZXMyLAorICAgICAgICAgICAgICAgICJmaWxlb2JqLnJlYWRsaW5lcygpIGZhaWxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obGluZXMyKSA9PSAxMTQsCisgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMls4M10gPT0KKyAgICAgICAgICAgICAgICAiSSB3aWxsIGdsYWRseSBhZG1pdCB0aGF0IFB5dGhvbiBpcyBub3QgdGhlIGZhc3Rlc3QgcnVubmluZyBzY3JpcHRpbmcgbGFuZ3VhZ2UuXG4iLAorICAgICAgICAgICAgICAgICJmaWxlb2JqLnJlYWRsaW5lcygpIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX2l0ZXIoc2VsZik6CisgICAgICAgIHNlbGYudGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgZm9iajEgPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAiclUiKQorICAgICAgICBmb2JqMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCisgICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpCisgICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIGZvYmoyXQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGluZXMxID09IGxpbmVzMiwKKyAgICAgICAgICAgICAgICAgICAgICJmaWxlb2JqLl9faXRlcl9fKCkgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfc2VlayhzZWxmKToKKyAgICAgICAgc2VsZi50YXIuZXh0cmFjdCgidXN0YXIvcmVndHlwZSIsIFRFTVBESVIpCisgICAgICAgIGZvYmogPSBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvcmVndHlwZSIpLCAicmIiKQorICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICAgICAgZm9iai5jbG9zZSgpCisKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQorCisgICAgICAgIHRleHQgPSBmb2JqLnJlYWQoKQorICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoMjA0OCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIwNDggPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGFic29sdXRlIHBvc2l0aW9uIGZhaWxlZCIpCisgICAgICAgIGZvYmouc2VlaygtMTAyNCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEwMjQgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIG5lZ2F0aXZlIHJlbGF0aXZlIHBvc2l0aW9uIGZhaWxlZCIpCisgICAgICAgIGZvYmouc2VlaygxMDI0LCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMjA0OCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gcG9zaXRpdmUgcmVsYXRpdmUgcG9zaXRpb24gZmFpbGVkIikKKyAgICAgICAgcyA9IGZvYmoucmVhZCgxMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gZGF0YVsyMDQ4OjIwNThdLAorICAgICAgICAgICAgICAgICAgICAgInJlYWQoKSBhZnRlciBzZWVrIGZhaWxlZCIpCisgICAgICAgIGZvYmouc2VlaygwLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby5zaXplID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBmaWxlJ3MgZW5kIGZhaWxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2JqLnJlYWQoKSA9PSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYXQgZmlsZSdzIGVuZCBkaWQgbm90IHJldHVybiBlbXB0eSBzdHJpbmciKQorICAgICAgICBmb2JqLnNlZWsoLXRhcmluZm8uc2l6ZSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAicmVsYXRpdmUgc2VlaygpIHRvIGZpbGUncyBzdGFydCBmYWlsZWQiKQorICAgICAgICBmb2JqLnNlZWsoNTEyKQorICAgICAgICBzMSA9IGZvYmoucmVhZGxpbmVzKCkKKyAgICAgICAgZm9iai5zZWVrKDUxMikKKyAgICAgICAgczIgPSBmb2JqLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSA9PSBzMiwKKyAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZXMoKSBhZnRlciBzZWVrIGZhaWxlZCIpCisgICAgICAgIGZvYmouc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGZvYmoucmVhZGxpbmUoKSkgPT0gZm9iai50ZWxsKCksCisgICAgICAgICAgICAgICAgICAgICAidGVsbCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDUxMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihmb2JqLnJlYWRsaW5lKCkpICsgNTEyID09IGZvYmoudGVsbCgpLAorICAgICAgICAgICAgICAgICAgICAgInRlbGwoKSBhZnRlciBzZWVrKCkgYW5kIHJlYWRsaW5lKCkgZmFpbGVkIikKKyAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgIGxpbmUgPSBmb2JqLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoucmVhZCgpID09IGRhdGFbbGVuKGxpbmUpOl0sCisgICAgICAgICAgICAgICAgICAgICAicmVhZCgpIGFmdGVyIHJlYWRsaW5lKCkgZmFpbGVkIikKKyAgICAgICAgZm9iai5jbG9zZSgpCisKKyAgICAjIFRlc3QgaWYgc3ltYm9saWMgYW5kIGhhcmQgbGlua3MgYXJlIHJlc29sdmVkIGJ5IGV4dHJhY3RmaWxlKCkuICBUaGUKKyAgICAjIHRlc3QgbGluayBtZW1iZXJzIGVhY2ggcG9pbnQgdG8gYSByZWd1bGFyIG1lbWJlciB3aG9zZSBkYXRhIGlzCisgICAgIyBzdXBwb3NlZCB0byBiZSBleHBvcnRlZC4KKyAgICBkZWYgX3Rlc3RfZmlsZW9ial9saW5rKHNlbGYsIGxua3R5cGUsIHJlZ3R5cGUpOgorICAgICAgICBhID0gc2VsZi50YXIuZXh0cmFjdGZpbGUobG5rdHlwZSkKKyAgICAgICAgYiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHJlZ3R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5uYW1lLCBiLm5hbWUpCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX2xpbmsxKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2ZpbGVvYmpfbGluaygidXN0YXIvbG5rdHlwZSIsICJ1c3Rhci9yZWd0eXBlIikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfbGluazIoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZmlsZW9ial9saW5rKCIuL3VzdGFyL2xpbmt0ZXN0Mi9sbmt0eXBlIiwgInVzdGFyL2xpbmt0ZXN0MS9yZWd0eXBlIikKKworICAgIGRlZiB0ZXN0X2ZpbGVvYmpfc3ltbGluazEoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZmlsZW9ial9saW5rKCJ1c3Rhci9zeW10eXBlIiwgInVzdGFyL3JlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfZmlsZW9ial9zeW1saW5rMihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoIi4vdXN0YXIvbGlua3Rlc3QyL3N5bXR5cGUiLCAidXN0YXIvbGlua3Rlc3QxL3JlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfaXNzdWUxNDE2MChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9maWxlb2JqX2xpbmsoInN5bXR5cGUyIiwgInVzdGFyL3JlZ3R5cGUiKQorCisKK2NsYXNzIENvbW1vblJlYWRUZXN0KFJlYWRUZXN0KToKKworICAgIGRlZiB0ZXN0X2VtcHR5X3RhcmZpbGUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgaXNzdWU2MTIzOiBBbGxvdyBvcGVuaW5nIGVtcHR5IGFyY2hpdmVzLgorICAgICAgICAjIFRoaXMgdGVzdCBjaGVja3MgaWYgdGFyZmlsZS5vcGVuKCkgaXMgYWJsZSB0byBvcGVuIGFuIGVtcHR5IHRhcgorICAgICAgICAjIGFyY2hpdmUgc3VjY2Vzc2Z1bGx5LiBOb3RlIHRoYXQgYW4gZW1wdHkgdGFyIGFyY2hpdmUgaXMgbm90IHRoZQorICAgICAgICAjIHNhbWUgYXMgYW4gZW1wdHkgZmlsZSEKKyAgICAgICAgdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZS5yZXBsYWNlKCJyIiwgInciKSkuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICAgICAgdGFyLmdldG5hbWVzKCkKKyAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJ0YXJmaWxlLm9wZW4oKSBmYWlsZWQgb24gZW1wdHkgYXJjaGl2ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0TGlzdEVxdWFsKHRhci5nZXRtZW1iZXJzKCksIFtdKQorCisgICAgZGVmIHRlc3RfbnVsbF90YXJmaWxlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGlzc3VlNjEyMzogQWxsb3cgb3BlbmluZyBlbXB0eSBhcmNoaXZlcy4KKyAgICAgICAgIyBUaGlzIHRlc3QgZ3VhcmFudGVlcyB0aGF0IHRhcmZpbGUub3BlbigpIGRvZXMgbm90IHRyZWF0IGFuIGVtcHR5CisgICAgICAgICMgZmlsZSBhcyBhbiBlbXB0eSB0YXIgYXJjaGl2ZS4KKyAgICAgICAgb3Blbih0bXBuYW1lLCAid2IiKS5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZV96ZXJvcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IFRhckZpbGUncyBpZ25vcmVfemVyb3Mgb3B0aW9uLgorICAgICAgICBpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpneiIpOgorICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlCisgICAgICAgIGVsaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6YnoyIik6CisgICAgICAgICAgICBfb3BlbiA9IGJ6Mi5CWjJGaWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfb3BlbiA9IG9wZW4KKworICAgICAgICBmb3IgY2hhciBpbiAoJ1wwJywgJ2EnKToKKyAgICAgICAgICAgICMgVGVzdCBpZiBFT0ZIZWFkZXJFcnJvciAoJ1wwJykgYW5kIEludmFsaWRIZWFkZXJFcnJvciAoJ2EnKQorICAgICAgICAgICAgIyBhcmUgaWdub3JlZCBjb3JyZWN0bHkuCisgICAgICAgICAgICBmb2JqID0gX29wZW4odG1wbmFtZSwgIndiIikKKyAgICAgICAgICAgIGZvYmoud3JpdGUoY2hhciAqIDEwMjQpCisgICAgICAgICAgICBmb2JqLndyaXRlKHRhcmZpbGUuVGFySW5mbygiZm9vIikudG9idWYoKSkKKyAgICAgICAgICAgIGZvYmouY2xvc2UoKQorCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgbW9kZT0iciIsIGlnbm9yZV96ZXJvcz1UcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwodGFyLmdldG5hbWVzKCksIFsiZm9vIl0sCisgICAgICAgICAgICAgICAgICAgICJpZ25vcmVfemVyb3M9VHJ1ZSBzaG91bGQgaGF2ZSBza2lwcGVkIHRoZSAlci1ibG9ja3MiICUgY2hhcikKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKworY2xhc3MgTWlzY1JlYWRUZXN0KENvbW1vblJlYWRUZXN0KToKKworICAgIGRlZiB0ZXN0X25vX25hbWVfYXJndW1lbnQoc2VsZik6CisgICAgICAgIGZvYmogPSBvcGVuKHNlbGYudGFybmFtZSwgInJiIikKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIG9zLnBhdGguYWJzcGF0aChmb2JqLm5hbWUpKQorCisgICAgZGVmIHRlc3Rfbm9fbmFtZV9hdHRyaWJ1dGUoc2VsZik6CisgICAgICAgIGRhdGEgPSBvcGVuKHNlbGYudGFybmFtZSwgInJiIikucmVhZCgpCisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZ2V0YXR0ciwgZm9iaiwgIm5hbWUiKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIubmFtZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X25hbWVfYXR0cmlidXRlKHNlbGYpOgorICAgICAgICBkYXRhID0gb3BlbihzZWxmLnRhcm5hbWUsICJyYiIpLnJlYWQoKQorICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKKyAgICAgICAgZm9iai5uYW1lID0gIiIKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT1zZWxmLm1vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLm5hbWUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX3dpdGhfb2Zmc2V0KHNlbGYpOgorICAgICAgICAjIFNraXAgdGhlIGZpcnN0IG1lbWJlciBhbmQgc3RvcmUgdmFsdWVzIGZyb20gdGhlIHNlY29uZCBtZW1iZXIKKyAgICAgICAgIyBvZiB0aGUgdGVzdHRhci4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT1zZWxmLm1vZGUpCisgICAgICAgIHRhci5uZXh0KCkKKyAgICAgICAgdCA9IHRhci5uZXh0KCkKKyAgICAgICAgbmFtZSA9IHQubmFtZQorICAgICAgICBvZmZzZXQgPSB0Lm9mZnNldAorICAgICAgICBkYXRhID0gdGFyLmV4dHJhY3RmaWxlKHQpLnJlYWQoKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgICMgT3BlbiB0aGUgdGVzdHRhciBhbmQgc2VlayB0byB0aGUgb2Zmc2V0IG9mIHRoZSBzZWNvbmQgbWVtYmVyLgorICAgICAgICBpZiBzZWxmLm1vZGUuZW5kc3dpdGgoIjpneiIpOgorICAgICAgICAgICAgX29wZW4gPSBnemlwLkd6aXBGaWxlCisgICAgICAgIGVsaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCI6YnoyIik6CisgICAgICAgICAgICBfb3BlbiA9IGJ6Mi5CWjJGaWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBfb3BlbiA9IG9wZW4KKyAgICAgICAgZm9iaiA9IF9vcGVuKHNlbGYudGFybmFtZSwgInJiIikKKyAgICAgICAgZm9iai5zZWVrKG9mZnNldCkKKworICAgICAgICAjIFRlc3QgaWYgdGhlIHRhcmZpbGUgc3RhcnRzIHdpdGggdGhlIHNlY29uZCBtZW1iZXIuCisgICAgICAgIHRhciA9IHRhci5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT0icjoiLCBmaWxlb2JqPWZvYmopCisgICAgICAgIHQgPSB0YXIubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5uYW1lLCBuYW1lKQorICAgICAgICAjIFJlYWQgdG8gdGhlIGVuZCBvZiBmaWxlb2JqIGFuZCB0ZXN0IGlmIHNlZWtpbmcgYmFjayB0byB0aGUKKyAgICAgICAgIyBiZWdpbm5pbmcgd29ya3MuCisgICAgICAgIHRhci5nZXRtZW1iZXJzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZXh0cmFjdGZpbGUodCkucmVhZCgpLCBkYXRhLAorICAgICAgICAgICAgICAgICJzZWVrIGJhY2sgZGlkIG5vdCB3b3JrIikKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2ZhaWxfY29tcChzZWxmKToKKyAgICAgICAgIyBGb3IgR3ppcCBhbmQgQnoyIFRlc3RzOiBmYWlsIHdpdGggYSBSZWFkRXJyb3Igb24gYW4gdW5jb21wcmVzc2VkIGZpbGUuCisgICAgICAgIGlmIHNlbGYubW9kZSA9PSAicjoiOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRhcm5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSwgInJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKKworICAgIGRlZiB0ZXN0X3Y3X2RpcnR5cGUoc2VsZik6CisgICAgICAgICMgVGVzdCBvbGQgc3R5bGUgZGlydHlwZSBtZW1iZXIgKGJ1ZyAjMTMzNjYyMyk6CisgICAgICAgICMgT2xkIFY3IHRhcnMgY3JlYXRlIGRpcmVjdG9yeSBtZW1iZXJzIHVzaW5nIGFuIEFSRUdUWVBFCisgICAgICAgICMgaGVhZGVyIHdpdGggYSAiLyIgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lIGZpZWxkLgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJtaXNjL2RpcnR5cGUtb2xkLXY3IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkRJUlRZUEUsCisgICAgICAgICAgICAgICAgInY3IGRpcnR5cGUgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X3hzdGFyX3R5cGUoc2VsZik6CisgICAgICAgICMgVGhlIHhzdGFyIGZvcm1hdCBzdG9yZXMgZXh0cmEgYXRpbWUgYW5kIGN0aW1lIGZpZWxkcyBpbnNpZGUgdGhlCisgICAgICAgICMgc3BhY2UgcmVzZXJ2ZWQgZm9yIHRoZSBwcmVmaXggZmllbGQuIFRoZSBwcmVmaXggZmllbGQgbXVzdCBiZQorICAgICAgICAjIGlnbm9yZWQgaW4gdGhpcyBjYXNlLCBvdGhlcndpc2UgaXQgd2lsbCBtZXNzIHVwIHRoZSBuYW1lLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvcmVndHlwZS14c3RhciIpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZmFpbGVkIHRvIGZpbmQgbWlzYy9yZWd0eXBlLXhzdGFyIChtYW5nbGVkIHByZWZpeD8pIikKKworICAgIGRlZiB0ZXN0X2NoZWNrX21lbWJlcnMoc2VsZik6CisgICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYudGFyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludCh0YXJpbmZvLm10aW1lKSA9PSAwNzYwNjEzNjYxNywKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIG10aW1lIGZvciAlcyIgJSB0YXJpbmZvLm5hbWUpCisgICAgICAgICAgICBpZiBub3QgdGFyaW5mby5uYW1lLnN0YXJ0c3dpdGgoInVzdGFyLyIpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby51bmFtZSA9PSAidGFyZmlsZSIsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB1bmFtZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQorCisgICAgZGVmIHRlc3RfZmluZF9tZW1iZXJzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50YXIuZ2V0bWVtYmVycygpWy0xXS5uYW1lID09ICJtaXNjL2VvZiIsCisgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGFsbCBtZW1iZXJzIikKKworICAgIGRlZiB0ZXN0X2V4dHJhY3RfaGFyZGxpbmsoc2VsZik6CisgICAgICAgICMgVGVzdCBoYXJkbGluayBleHRyYWN0aW9uIChlLmcuIGJ1ZyAjODU3Mjk3KS4KKyAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odGFybmFtZSwgZXJyb3JsZXZlbD0xLCBlbmNvZGluZz0iaXNvODg1OS0xIikgYXMgdGFyOgorICAgICAgICAgICAgdGFyLmV4dHJhY3QoInVzdGFyL3JlZ3R5cGUiLCBURU1QRElSKQorICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKG9zLnJlbW92ZSwgb3MucGF0aC5qb2luKFRFTVBESVIsICJ1c3Rhci9yZWd0eXBlIikpCisKKyAgICAgICAgICAgIHRhci5leHRyYWN0KCJ1c3Rhci9sbmt0eXBlIiwgVEVNUERJUikKKyAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChvcy5yZW1vdmUsIG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvbG5rdHlwZSIpKQorICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihURU1QRElSLCAidXN0YXIvbG5rdHlwZSIpLCAicmIiKSBhcyBmOgorICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZDVzdW0oZGF0YSksIG1kNV9yZWd0eXBlKQorCisgICAgICAgICAgICB0YXIuZXh0cmFjdCgidXN0YXIvc3ltdHlwZSIsIFRFTVBESVIpCisgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAob3MucmVtb3ZlLCBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3N5bXR5cGUiKSkKKyAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgInVzdGFyL3N5bXR5cGUiKSwgInJiIikgYXMgZjoKKyAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWQ1c3VtKGRhdGEpLCBtZDVfcmVndHlwZSkKKworICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGwoc2VsZik6CisgICAgICAgICMgVGVzdCBpZiBleHRyYWN0YWxsKCkgY29ycmVjdGx5IHJlc3RvcmVzIGRpcmVjdG9yeSBwZXJtaXNzaW9ucworICAgICAgICAjIGFuZCB0aW1lcyAoc2VlIGlzc3VlMTczNSkuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgZGlyZWN0b3JpZXMgPSBbdCBmb3IgdCBpbiB0YXIgaWYgdC5pc2RpcigpXQorICAgICAgICB0YXIuZXh0cmFjdGFsbChURU1QRElSLCBkaXJlY3RvcmllcykKKyAgICAgICAgZm9yIHRhcmluZm8gaW4gZGlyZWN0b3JpZXM6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKFRFTVBESVIsIHRhcmluZm8ubmFtZSkKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSAhPSAid2luMzIiOgorICAgICAgICAgICAgICAgICMgV2luMzIgaGFzIG5vIHN1cHBvcnQgZm9yIGZpbmUgZ3JhaW5lZCBwZXJtaXNzaW9ucy4KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubW9kZSAmIDA3NzcsIG9zLnN0YXQocGF0aCkuc3RfbW9kZSAmIDA3NzcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubXRpbWUsIG9zLnBhdGguZ2V0bXRpbWUocGF0aCkpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9pbml0X2Nsb3NlX2ZvYmooc2VsZik6CisgICAgICAgICMgSXNzdWUgIzczNDE6IENsb3NlIHRoZSBpbnRlcm5hbCBmaWxlIG9iamVjdCBpbiB0aGUgVGFyRmlsZQorICAgICAgICAjIGNvbnN0cnVjdG9yIGluIGNhc2Ugb2YgYW4gZXJyb3IuIEZvciB0aGUgdGVzdCB3ZSByZWx5IG9uCisgICAgICAgICMgdGhlIGZhY3QgdGhhdCBvcGVuaW5nIGFuIGVtcHR5IGZpbGUgcmFpc2VzIGEgUmVhZEVycm9yLgorICAgICAgICBlbXB0eSA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZW1wdHkiKQorICAgICAgICBvcGVuKGVtcHR5LCAid2IiKS53cml0ZSgiIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXIgPSBvYmplY3QuX19uZXdfXyh0YXJmaWxlLlRhckZpbGUpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyLl9faW5pdF9fKGVtcHR5KQorICAgICAgICAgICAgZXhjZXB0IHRhcmZpbGUuUmVhZEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZmlsZW9iai5jbG9zZWQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUmVhZEVycm9yIG5vdCByYWlzZWQiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MucmVtb3ZlKGVtcHR5KQorCisgICAgZGVmIHRlc3RfcGFyYWxsZWxfaXRlcmF0aW9uKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxNjYwMTogUmVzdGFydGluZyBpdGVyYXRpb24gb3ZlciB0YXJmaWxlIGNvbnRpbnVlZAorICAgICAgICAjIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuCisgICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSkgYXMgdGFyOgorICAgICAgICAgICAgZm9yIG0xLCBtMiBpbiB6aXAodGFyLCB0YXIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEub2Zmc2V0LCBtMi5vZmZzZXQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtMS5uYW1lLCBtMi5uYW1lKQorCisKK2NsYXNzIFN0cmVhbVJlYWRUZXN0KENvbW1vblJlYWRUZXN0KToKKworICAgIG1vZGU9InJ8IgorCisgICAgZGVmIHRlc3RfZmlsZW9ial9yZWd1bGFyX2ZpbGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5uZXh0KCkgIyBnZXQgInJlZ3R5cGUiIChjYW4ndCB1c2UgZ2V0bWVtYmVyKQorICAgICAgICBmb2JqID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbykKKyAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgobGVuKGRhdGEpLCBtZDVzdW0oZGF0YSkpID09ICh0YXJpbmZvLnNpemUsIG1kNV9yZWd0eXBlKSwKKyAgICAgICAgICAgICAgICAicmVndWxhciBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X3Byb3Zva2Vfc3RyZWFtX2Vycm9yKHNlbGYpOgorICAgICAgICB0YXJpbmZvcyA9IHNlbGYudGFyLmdldG1lbWJlcnMoKQorICAgICAgICBmID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mb3NbMF0pICMgcmVhZCB0aGUgZmlyc3QgbWVtYmVyCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuU3RyZWFtRXJyb3IsIGYucmVhZCkKKworICAgIGRlZiB0ZXN0X2NvbXBhcmVfbWVtYmVycyhzZWxmKToKKyAgICAgICAgdGFyMSA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCBlbmNvZGluZz0iaXNvODg1OS0xIikKKyAgICAgICAgdGFyMiA9IHNlbGYudGFyCisKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIHQxID0gdGFyMS5uZXh0KCkKKyAgICAgICAgICAgIHQyID0gdGFyMi5uZXh0KCkKKyAgICAgICAgICAgIGlmIHQxIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiBpcyBub3QgTm9uZSwgInN0cmVhbS5uZXh0KCkgZmFpbGVkLiIpCisKKyAgICAgICAgICAgIGlmIHQyLmlzbG5rKCkgb3IgdDIuaXNzeW0oKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlN0cmVhbUVycm9yLCB0YXIyLmV4dHJhY3RmaWxlLCB0MikKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICB2MSA9IHRhcjEuZXh0cmFjdGZpbGUodDEpCisgICAgICAgICAgICB2MiA9IHRhcjIuZXh0cmFjdGZpbGUodDIpCisgICAgICAgICAgICBpZiB2MSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodjIgaXMgbm90IE5vbmUsICJzdHJlYW0uZXh0cmFjdGZpbGUoKSBmYWlsZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYxLnJlYWQoKSA9PSB2Mi5yZWFkKCksICJzdHJlYW0gZXh0cmFjdGlvbiBmYWlsZWQiKQorCisgICAgICAgIHRhcjEuY2xvc2UoKQorCisKK2NsYXNzIERldGVjdFJlYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfdGVzdGZ1bmNfZmlsZShzZWxmLCBuYW1lLCBtb2RlKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGFyZmlsZS5vcGVuKG5hbWUsIG1vZGUpCisgICAgICAgIGV4Y2VwdCB0YXJmaWxlLlJlYWRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKKyAgICBkZWYgX3Rlc3RmdW5jX2ZpbGVvYmooc2VsZiwgbmFtZSwgbW9kZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmZpbGUub3BlbihuYW1lLCBtb2RlLCBmaWxlb2JqPW9wZW4obmFtZSwgInJiIikpCisgICAgICAgIGV4Y2VwdCB0YXJmaWxlLlJlYWRFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgpCisKKyAgICBkZWYgX3Rlc3RfbW9kZXMoc2VsZiwgdGVzdGZ1bmMpOgorICAgICAgICB0ZXN0ZnVuYyh0YXJuYW1lLCAiciIpCisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyOiIpCisgICAgICAgIHRlc3RmdW5jKHRhcm5hbWUsICJyOioiKQorICAgICAgICB0ZXN0ZnVuYyh0YXJuYW1lLCAicnwiKQorICAgICAgICB0ZXN0ZnVuYyh0YXJuYW1lLCAicnwqIikKKworICAgICAgICBpZiBnemlwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgbW9kZT0icjpneiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCB0YXJuYW1lLCBtb2RlPSJyfGd6IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIGd6aXBuYW1lLCBtb2RlPSJyOiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgdGFyZmlsZS5vcGVuLCBnemlwbmFtZSwgbW9kZT0icnwiKQorCisgICAgICAgICAgICB0ZXN0ZnVuYyhnemlwbmFtZSwgInIiKQorICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyOioiKQorICAgICAgICAgICAgdGVzdGZ1bmMoZ3ppcG5hbWUsICJyOmd6IikKKyAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAicnwqIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGd6aXBuYW1lLCAicnxneiIpCisKKyAgICAgICAgaWYgYnoyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgbW9kZT0icjpiejIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgdGFybmFtZSwgbW9kZT0icnxiejIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgYnoybmFtZSwgbW9kZT0icjoiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModGFyZmlsZS5SZWFkRXJyb3IsIHRhcmZpbGUub3BlbiwgYnoybmFtZSwgbW9kZT0icnwiKQorCisgICAgICAgICAgICB0ZXN0ZnVuYyhiejJuYW1lLCAiciIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhiejJuYW1lLCAicjoqIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyOmJ6MiIpCisgICAgICAgICAgICB0ZXN0ZnVuYyhiejJuYW1lLCAicnwqIikKKyAgICAgICAgICAgIHRlc3RmdW5jKGJ6Mm5hbWUsICJyfGJ6MiIpCisKKyAgICBkZWYgdGVzdF9kZXRlY3RfZmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9tb2RlcyhzZWxmLl90ZXN0ZnVuY19maWxlKQorCisgICAgZGVmIHRlc3RfZGV0ZWN0X2ZpbGVvYmooc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfbW9kZXMoc2VsZi5fdGVzdGZ1bmNfZmlsZW9iaikKKworICAgIGRlZiB0ZXN0X2RldGVjdF9zdHJlYW1fYnoyKHNlbGYpOgorICAgICAgICAjIE9yaWdpbmFsbHksIHRhcmZpbGUncyBzdHJlYW0gZGV0ZWN0aW9uIGxvb2tlZCBmb3IgdGhlIHN0cmluZworICAgICAgICAjICJCWmg5MSIgYXQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlLiBUaGlzIGlzIGluY29ycmVjdCBiZWNhdXNlCisgICAgICAgICMgdGhlICc5JyByZXByZXNlbnRzIHRoZSBibG9ja3NpemUgKDkwMGtCKS4gSWYgdGhlIGZpbGUgd2FzCisgICAgICAgICMgY29tcHJlc3NlZCB1c2luZyBhbm90aGVyIGJsb2Nrc2l6ZSBhdXRvZGV0ZWN0aW9uIGZhaWxzLgorICAgICAgICBpZiBub3QgYnoyOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgd2l0aCBvcGVuKHRhcm5hbWUsICJyYiIpIGFzIGZvYmo6CisgICAgICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKKworICAgICAgICAjIENvbXByZXNzIHdpdGggYmxvY2tzaXplIDEwMGtCLCB0aGUgZmlsZSBzdGFydHMgd2l0aCAiQlpoMTEiLgorICAgICAgICB3aXRoIGJ6Mi5CWjJGaWxlKHRtcG5hbWUsICJ3YiIsIGNvbXByZXNzbGV2ZWw9MSkgYXMgZm9iajoKKyAgICAgICAgICAgIGZvYmoud3JpdGUoZGF0YSkKKworICAgICAgICBzZWxmLl90ZXN0ZnVuY19maWxlKHRtcG5hbWUsICJyfCoiKQorCisKK2NsYXNzIE1lbWJlclJlYWRUZXN0KFJlYWRUZXN0KToKKworICAgIGRlZiBfdGVzdF9tZW1iZXIoc2VsZiwgdGFyaW5mbywgY2hrc3VtPU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgaWYgY2hrc3VtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1kNXN1bShzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKS5yZWFkKCkpID09IGNoa3N1bSwKKyAgICAgICAgICAgICAgICAgICAgIndyb25nIG1kNXN1bSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQorCisgICAgICAgIGt3YXJnc1sibXRpbWUiXSA9IDA3NjA2MTM2NjE3CisgICAgICAgIGt3YXJnc1sidWlkIl0gPSAxMDAwCisgICAgICAgIGt3YXJnc1siZ2lkIl0gPSAxMDAKKyAgICAgICAgaWYgIm9sZC12NyIgbm90IGluIHRhcmluZm8ubmFtZToKKyAgICAgICAgICAgICMgVjcgdGFyIGNhbid0IGhhbmRsZSBhbHBoYWJldGljIG93bmVycy4KKyAgICAgICAgICAgIGt3YXJnc1sidW5hbWUiXSA9ICJ0YXJmaWxlIgorICAgICAgICAgICAga3dhcmdzWyJnbmFtZSJdID0gInRhcmZpbGUiCisgICAgICAgIGZvciBrLCB2IGluIGt3YXJncy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnZXRhdHRyKHRhcmluZm8sIGspID09IHYsCisgICAgICAgICAgICAgICAgICAgICJ3cm9uZyB2YWx1ZSBpbiAlcyBmaWVsZCBvZiAlcyIgJSAoaywgdGFyaW5mby5uYW1lKSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcmVndHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZmluZF9jb250dHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvY29udHR5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfZGlydHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZGlydHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCkKKworICAgIGRlZiB0ZXN0X2ZpbmRfZGlydHlwZV93aXRoX3NpemUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2RpcnR5cGUtd2l0aC1zaXplIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0yNTUpCisKKyAgICBkZWYgdGVzdF9maW5kX2xua3R5cGUoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL2xua3R5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTAsIGxpbmtuYW1lPSJ1c3Rhci9yZWd0eXBlIikKKworICAgIGRlZiB0ZXN0X2ZpbmRfc3ltdHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3ltdHlwZSIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9MCwgbGlua25hbWU9InJlZ3R5cGUiKQorCisgICAgZGVmIHRlc3RfZmluZF9ibGt0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9ibGt0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBkZXZtYWpvcj0zLCBkZXZtaW5vcj0wKQorCisgICAgZGVmIHRlc3RfZmluZF9jaHJ0eXBlKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJ1c3Rhci9jaHJ0eXBlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT0wLCBkZXZtYWpvcj0xLCBkZXZtaW5vcj0zKQorCisgICAgZGVmIHRlc3RfZmluZF9maWZvdHlwZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvZmlmb3R5cGUiKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTApCisKKyAgICBkZWYgdGVzdF9maW5kX3NwYXJzZShzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvc3BhcnNlIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT04NjAxNiwgY2hrc3VtPW1kNV9zcGFyc2UpCisKKyAgICBkZWYgdGVzdF9maW5kX3VtbGF1dHMoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3VtbGF1dHMtxNbc5Pb83yIpCisgICAgICAgIHNlbGYuX3Rlc3RfbWVtYmVyKHRhcmluZm8sIHNpemU9NzAxMSwgY2hrc3VtPW1kNV9yZWd0eXBlKQorCisgICAgZGVmIHRlc3RfZmluZF91c3Rhcl9sb25nbmFtZShzZWxmKToKKyAgICAgICAgbmFtZSA9ICJ1c3Rhci8iICsgIjEyMzQ1LyIgKiAzOSArICIxMjM0NTY3L2xvbmduYW1lIgorICAgICAgICBzZWxmLmFzc2VydEluKG5hbWUsIHNlbGYudGFyLmdldG5hbWVzKCkpCisKKyAgICBkZWYgdGVzdF9maW5kX3JlZ3R5cGVfb2xkdjcoc2VsZik6CisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIoIm1pc2MvcmVndHlwZS1vbGQtdjciKQorICAgICAgICBzZWxmLl90ZXN0X21lbWJlcih0YXJpbmZvLCBzaXplPTcwMTEsIGNoa3N1bT1tZDVfcmVndHlwZSkKKworICAgIGRlZiB0ZXN0X2ZpbmRfcGF4X3VtbGF1dHMoc2VsZik6CisgICAgICAgIHNlbGYudGFyID0gdGFyZmlsZS5vcGVuKHNlbGYudGFybmFtZSwgbW9kZT1zZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJwYXgvdW1sYXV0cy3E1tzk9vzfIikKKyAgICAgICAgc2VsZi5fdGVzdF9tZW1iZXIodGFyaW5mbywgc2l6ZT03MDExLCBjaGtzdW09bWQ1X3JlZ3R5cGUpCisKKworY2xhc3MgTG9uZ25hbWVUZXN0KFJlYWRUZXN0KToKKworICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ25hbWUoc2VsZik6CisgICAgICAgICMgVGVzdCByZWFkaW5nIG9mIGxvbmduYW1lIChidWcgIzE0NzE0MjcpLgorICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBzZWxmLmZhaWwoImxvbmduYW1lIG5vdCBmb3VuZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgIT0gdGFyZmlsZS5ESVJUWVBFLCAicmVhZCBsb25nbmFtZSBhcyBkaXJ0eXBlIikKKworICAgIGRlZiB0ZXN0X3JlYWRfbG9uZ2xpbmsoc2VsZik6CisgICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCisgICAgICAgIGxvbmdsaW5rID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ2xpbmsiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ2xpbmspCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgibG9uZ2xpbmsgbm90IGZvdW5kIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8ubGlua25hbWUgPT0gbG9uZ25hbWUsICJsaW5rbmFtZSB3cm9uZyIpCisKKyAgICBkZWYgdGVzdF90cnVuY2F0ZWRfbG9uZ25hbWUoc2VsZik6CisgICAgICAgIGxvbmduYW1lID0gc2VsZi5zdWJkaXIgKyAiLyIgKyAiMTIzLyIgKiAxMjUgKyAibG9uZ25hbWUiCisgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpCisgICAgICAgIG9mZnNldCA9IHRhcmluZm8ub2Zmc2V0CisgICAgICAgIHNlbGYudGFyLmZpbGVvYmouc2VlayhvZmZzZXQpCisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLnRhci5maWxlb2JqLnJlYWQoMyAqIDUxMikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIG5hbWU9ImZvby50YXIiLCBmaWxlb2JqPWZvYmopCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfb2Zmc2V0KHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgVGFySW5mbyBvYmplY3QgaW5jbHVkZXMKKyAgICAgICAgIyB0aGUgcHJlY2VkaW5nIGV4dGVuZGVkIGhlYWRlci4KKyAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKKyAgICAgICAgb2Zmc2V0ID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmduYW1lKS5vZmZzZXQKKyAgICAgICAgZm9iaiA9IG9wZW4odGFybmFtZSkKKyAgICAgICAgZm9iai5zZWVrKG9mZnNldCkKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mby5mcm9tYnVmKGZvYmoucmVhZCg1MTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udHlwZSwgc2VsZi5sb25nbmFtZXR5cGUpCisKKworY2xhc3MgR05VUmVhZFRlc3QoTG9uZ25hbWVUZXN0KToKKworICAgIHN1YmRpciA9ICJnbnUiCisgICAgbG9uZ25hbWV0eXBlID0gdGFyZmlsZS5HTlVUWVBFX0xPTkdOQU1FCisKKyAgICBkZWYgdGVzdF9zcGFyc2VfZmlsZShzZWxmKToKKyAgICAgICAgdGFyaW5mbzEgPSBzZWxmLnRhci5nZXRtZW1iZXIoInVzdGFyL3NwYXJzZSIpCisgICAgICAgIGZvYmoxID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbzEpCisgICAgICAgIHRhcmluZm8yID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJnbnUvc3BhcnNlIikKKyAgICAgICAgZm9iajIgPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmoxLnJlYWQoKSA9PSBmb2JqMi5yZWFkKCksCisgICAgICAgICAgICAgICAgInNwYXJzZSBmaWxlIGV4dHJhY3Rpb24gZmFpbGVkIikKKworCitjbGFzcyBQYXhSZWFkVGVzdChMb25nbmFtZVRlc3QpOgorCisgICAgc3ViZGlyID0gInBheCIKKyAgICBsb25nbmFtZXR5cGUgPSB0YXJmaWxlLlhIRFRZUEUKKworICAgIGRlZiB0ZXN0X3BheF9nbG9iYWxfaGVhZGVycyhzZWxmKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQorCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uZ25hbWUsICJiYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ucGF4X2hlYWRlcnMuZ2V0KCJWRU5ET1IudW1sYXV0cyIpLCB1IsTW3OT2/N8iKQorCisgICAgICAgIHRhcmluZm8gPSB0YXIuZ2V0bWVtYmVyKCJwYXgvcmVndHlwZTMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJ0YXJmaWxlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmduYW1lLCAidGFyZmlsZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5wYXhfaGVhZGVycy5nZXQoIlZFTkRPUi51bWxhdXRzIiksIHUixNbc5Pb83yIpCisKKyAgICBkZWYgdGVzdF9wYXhfbnVtYmVyX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgIyBBbGwgZm9sbG93aW5nIG51bWJlciBmaWVsZHMgYXJlIHJlYWQgZnJvbSB0aGUgcGF4IGhlYWRlci4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICB0YXJpbmZvID0gdGFyLmdldG1lbWJlcigicGF4L3JlZ3R5cGU0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDcwMTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51aWQsIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLmdpZCwgMTIzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubXRpbWUsIDEwNDE4MDg3ODMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHRhcmluZm8ubXRpbWUpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCh0YXJpbmZvLnBheF9oZWFkZXJzWyJhdGltZSJdKSwgMTA0MTgwODc4My4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KHRhcmluZm8ucGF4X2hlYWRlcnNbImN0aW1lIl0pLCAxMDQxODA4NzgzLjApCisKKworY2xhc3MgV3JpdGVUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBQdXQgYWxsIHdyaXRlIHRlc3RzIGluIGhlcmUgdGhhdCBhcmUgc3VwcG9zZWQgdG8gYmUgdGVzdGVkCisgICAgIyBpbiBhbGwgcG9zc2libGUgbW9kZSBjb21iaW5hdGlvbnMuCisKKyAgICBkZWYgdGVzdF9maWxlb2JqX25vX2Nsb3NlKHNlbGYpOgorICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKKyAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJmb28iKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvYmouY2xvc2VkIGlzIEZhbHNlLCAiZXh0ZXJuYWwgZmlsZW9ianMgbXVzdCBuZXZlciBjbG9zZWQiKQorCisKK2NsYXNzIFdyaXRlVGVzdChXcml0ZVRlc3RCYXNlKToKKworICAgIG1vZGUgPSAidzoiCisKKyAgICBkZWYgdGVzdF8xMDBfY2hhcl9uYW1lKHNlbGYpOgorICAgICAgICAjIFRoZSBuYW1lIGZpZWxkIGluIGEgdGFyIGhlYWRlciBzdG9yZXMgc3RyaW5ncyBvZiBhdCBtb3N0IDEwMCBjaGFycy4KKyAgICAgICAgIyBJZiBhIHN0cmluZyBpcyBzaG9ydGVyIHRoYW4gMTAwIGNoYXJzIGl0IGhhcyB0byBiZSBwYWRkZWQgd2l0aCAnXDAnLAorICAgICAgICAjIHdoaWNoIGltcGxpZXMgdGhhdCBhIHN0cmluZyBvZiBleGFjdGx5IDEwMCBjaGFycyBpcyBzdG9yZWQgd2l0aG91dAorICAgICAgICAjIGEgdHJhaWxpbmcgJ1wwJy4KKyAgICAgICAgbmFtZSA9ICIwMTIzNDU2Nzg5IiAqIDEwCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8obmFtZSkKKyAgICAgICAgdGFyLmFkZGZpbGUodCkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpWzBdID09IG5hbWUsCisgICAgICAgICAgICAgICAgImZhaWxlZCB0byBzdG9yZSAxMDAgY2hhciBmaWxlbmFtZSIpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF90YXJfc2l6ZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzEwMTM4ODIuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZpbGUiKQorICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQorICAgICAgICBmb2JqLndyaXRlKCJhYWEiKQorICAgICAgICBmb2JqLmNsb3NlKCkKKyAgICAgICAgdGFyLmFkZChwYXRoKQorICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpID4gMCwKKyAgICAgICAgICAgICAgICAidGFyZmlsZSBpcyBlbXB0eSIpCisKKyAgICAjIFRoZSB0ZXN0Xypfc2l6ZSB0ZXN0cyB0ZXN0IGZvciBidWcgIzExNjcxMjguCisgICAgZGVmIHRlc3RfZmlsZV9zaXplKHNlbGYpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorCisgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZpbGUiKQorICAgICAgICBmb2JqID0gb3BlbihwYXRoLCAid2IiKQorICAgICAgICBmb2JqLmNsb3NlKCkKKyAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby5zaXplLCAwKQorCisgICAgICAgIGZvYmogPSBvcGVuKHBhdGgsICJ3YiIpCisgICAgICAgIGZvYmoud3JpdGUoImFhYSIpCisgICAgICAgIGZvYmouY2xvc2UoKQorICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8ocGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDMpCisKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9zaXplKHNlbGYpOgorICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJkaXJlY3RvcnkiKQorICAgICAgICBvcy5ta2RpcihwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKHBhdGgpCisKKyAgICBkZWYgdGVzdF9saW5rX3NpemUoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6CisgICAgICAgICAgICBsaW5rID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJsaW5rIikKKyAgICAgICAgICAgIHRhcmdldCA9IG9zLnBhdGguam9pbihURU1QRElSLCAibGlua190YXJnZXQiKQorICAgICAgICAgICAgZm9iaiA9IG9wZW4odGFyZ2V0LCAid2IiKQorICAgICAgICAgICAgZm9iai53cml0ZSgiYWFhIikKKyAgICAgICAgICAgIGZvYmouY2xvc2UoKQorICAgICAgICAgICAgb3MubGluayh0YXJnZXQsIGxpbmspCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKKyAgICAgICAgICAgICAgICAjIFJlY29yZCB0aGUgbGluayB0YXJnZXQgaW4gdGhlIGlub2RlcyBsaXN0LgorICAgICAgICAgICAgICAgIHRhci5nZXR0YXJpbmZvKHRhcmdldCkKKyAgICAgICAgICAgICAgICB0YXJpbmZvID0gdGFyLmdldHRhcmluZm8obGluaykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8uc2l6ZSwgMCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRhcmdldCkKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUobGluaykKKworICAgIGRlZiB0ZXN0X3N5bWxpbmtfc2l6ZShzZWxmKToKKyAgICAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInN5bWxpbmsiKQorICAgICAgICAgICAgb3Muc3ltbGluaygibGlua190YXJnZXQiLCBwYXRoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICAgICAgdGFyaW5mbyA9IHRhci5nZXR0YXJpbmZvKHBhdGgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLnNpemUsIDApCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwYXRoKQorCisgICAgZGVmIHRlc3RfYWRkX3NlbGYoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgIzEyNTcyNTUuCisgICAgICAgIGRzdG5hbWUgPSBvcy5wYXRoLmFic3BhdGgodG1wbmFtZSkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLm5hbWUgPT0gZHN0bmFtZSwgImFyY2hpdmUgbmFtZSBtdXN0IGJlIGFic29sdXRlIikKKworICAgICAgICB0YXIuYWRkKGRzdG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCisKKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIoVEVNUERJUikKKyAgICAgICAgdGFyLmFkZChkc3RuYW1lKQorICAgICAgICBvcy5jaGRpcihjd2QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuZ2V0bmFtZXMoKSA9PSBbXSwgImFkZGVkIHRoZSBhcmNoaXZlIHRvIGl0c2VsZiIpCisKKyAgICBkZWYgdGVzdF9leGNsdWRlKHNlbGYpOgorICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJleGNsdWRlIikKKyAgICAgICAgb3MubWtkaXIodGVtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCJmb28iLCAiYmFyIiwgImJheiIpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgbmFtZSkKKyAgICAgICAgICAgICAgICBvcGVuKG5hbWUsICJ3YiIpLmNsb3NlKCkKKworICAgICAgICAgICAgZXhjbHVkZSA9IG9zLnBhdGguaXNmaWxlCisKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKCJ1c2UgdGhlIGZpbHRlciBhcmd1bWVudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgICAgICAgICAgdGFyLmFkZCh0ZW1wZGlyLCBhcmNuYW1lPSJlbXB0eV9kaXIiLCBleGNsdWRlPWV4Y2x1ZGUpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGFyLmdldG1lbWJlcnMoKSksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpWzBdLCAiZW1wdHlfZGlyIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKKworICAgIGRlZiB0ZXN0X2ZpbHRlcihzZWxmKToKKyAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAiZmlsdGVyIikKKyAgICAgICAgb3MubWtkaXIodGVtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gKCJmb28iLCAiYmFyIiwgImJheiIpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgbmFtZSkKKyAgICAgICAgICAgICAgICBvcGVuKG5hbWUsICJ3YiIpLmNsb3NlKCkKKworICAgICAgICAgICAgZGVmIGZpbHRlcih0YXJpbmZvKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKHRhcmluZm8ubmFtZSkgPT0gImJhciI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHRhcmluZm8udWlkID0gMTIzCisgICAgICAgICAgICAgICAgdGFyaW5mby51bmFtZSA9ICJmb28iCisgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmluZm8KKworICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgICAgICB0YXIuYWRkKHRlbXBkaXIsIGFyY25hbWU9ImVtcHR5X2RpciIsIGZpbHRlcj1maWx0ZXIpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInIiKQorICAgICAgICAgICAgZm9yIHRhcmluZm8gaW4gdGFyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyaW5mby51aWQsIDEyMykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8udW5hbWUsICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGFyLmdldG1lbWJlcnMoKSksIDMpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQorCisgICAgIyBHdWFyYW50ZWUgdGhhdCBzdG9yZWQgcGF0aG5hbWVzIGFyZSBub3QgbW9kaWZpZWQuIERvbid0CisgICAgIyByZW1vdmUgLi8gb3IgLi4vIG9yIGRvdWJsZSBzbGFzaGVzLiBTdGlsbCBtYWtlIGFic29sdXRlCisgICAgIyBwYXRobmFtZXMgcmVsYXRpdmUuCisgICAgIyBGb3IgZGV0YWlscyBzZWUgYnVnICM2MDU0LgorICAgIGRlZiBfdGVzdF9wYXRobmFtZShzZWxmLCBwYXRoLCBjbXBfcGF0aD1Ob25lLCBkaXI9RmFsc2UpOgorICAgICAgICAjIENyZWF0ZSBhIHRhcmZpbGUgd2l0aCBhbiBlbXB0eSBtZW1iZXIgbmFtZWQgcGF0aAorICAgICAgICAjIGFuZCBjb21wYXJlIHRoZSBzdG9yZWQgbmFtZSB3aXRoIHRoZSBvcmlnaW5hbC4KKyAgICAgICAgZm9vID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJmb28iKQorICAgICAgICBpZiBub3QgZGlyOgorICAgICAgICAgICAgb3Blbihmb28sICJ3IikuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MubWtkaXIoZm9vKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHRhci5hZGQoZm9vLCBhcmNuYW1lPXBhdGgpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJyIikKKyAgICAgICAgdCA9IHRhci5uZXh0KCkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICBpZiBub3QgZGlyOgorICAgICAgICAgICAgb3MucmVtb3ZlKGZvbykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLnJtZGlyKGZvbykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubmFtZSwgY21wX3BhdGggb3IgcGF0aC5yZXBsYWNlKG9zLnNlcCwgIi8iKSkKKworICAgIGRlZiB0ZXN0X3BhdGhuYW1lcyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiZm9vIikKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oImZvbyIsICIuIiwgImJhciIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiZm9vIiwgIi4uIiwgImJhciIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLiIsICJmb28iKSkKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4iKSkKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4iLCAiYmFyIikpCisgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuIiwgImZvbyIsICIuLiIsICJiYXIiKSkKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4iLCAiZm9vIiwgIi4uIiwgImJhciIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLi4iLCAiZm9vIikpCisgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUob3MucGF0aC5qb2luKCIuLiIsICJmb28iLCAiLi4iKSkKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZShvcy5wYXRoLmpvaW4oIi4uIiwgImZvbyIsICIuIiwgImJhciIpKQorICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKG9zLnBhdGguam9pbigiLi4iLCAiZm9vIiwgIi4uIiwgImJhciIpKQorCisgICAgICAgIHNlbGYuX3Rlc3RfcGF0aG5hbWUoImZvbyIgKyBvcy5zZXAgKyBvcy5zZXAgKyAiYmFyIikKKyAgICAgICAgc2VsZi5fdGVzdF9wYXRobmFtZSgiZm9vIiArIG9zLnNlcCArIG9zLnNlcCwgImZvbyIsIGRpcj1UcnVlKQorCisgICAgZGVmIHRlc3RfYWJzX3BhdGhuYW1lcyhzZWxmKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CisgICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCJDOlxcZm9vIiwgImZvbyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCIvZm9vIiwgImZvbyIpCisgICAgICAgICAgICBzZWxmLl90ZXN0X3BhdGhuYW1lKCIvLy9mb28iLCAiZm9vIikKKworICAgIGRlZiB0ZXN0X2N3ZChzZWxmKToKKyAgICAgICAgIyBUZXN0IGFkZGluZyB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KKyAgICAgICAgY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgb3MuY2hkaXIoVEVNUERJUikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3BlbigiZm9vIiwgInciKS5jbG9zZSgpCisKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgICAgICB0YXIuYWRkKCIuIikKKyAgICAgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAiciIpCisgICAgICAgICAgICBmb3IgdCBpbiB0YXI6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQubmFtZSA9PSAiLiIgb3IgdC5uYW1lLnN0YXJ0c3dpdGgoIi4vIikpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ3N5bWxpbmsnKSwgIm5lZWRzIG9zLnN5bWxpbmsiKQorICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfc3ltbGlua3Moc2VsZik6CisgICAgICAgICMgVGVzdCBpZiBleHRyYWN0YWxsIHdvcmtzIHByb3Blcmx5IHdoZW4gdGFyZmlsZSBjb250YWlucyBzeW1saW5rcworICAgICAgICB0ZW1wZGlyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MiKQorICAgICAgICB0ZW1wYXJjaGl2ZSA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzLnRhciIpCisgICAgICAgIG9zLm1rZGlyKHRlbXBkaXIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNvdXJjZV9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3NvdXJjZScpCisgICAgICAgICAgICB0YXJnZXRfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzeW1saW5rJykKKyAgICAgICAgICAgIHdpdGggb3Blbihzb3VyY2VfZmlsZSwndycpIGFzIGY6CisgICAgICAgICAgICAgICAgZi53cml0ZSgnc29tZXRoaW5nXG4nKQorICAgICAgICAgICAgb3Muc3ltbGluayhzb3VyY2VfZmlsZSwgdGFyZ2V0X2ZpbGUpCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGVtcGFyY2hpdmUsJ3cnKQorICAgICAgICAgICAgdGFyLmFkZChzb3VyY2VfZmlsZSwgYXJjbmFtZT1vcy5wYXRoLmJhc2VuYW1lKHNvdXJjZV9maWxlKSkKKyAgICAgICAgICAgIHRhci5hZGQodGFyZ2V0X2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZSh0YXJnZXRfZmlsZSkpCisgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICAgICAgIyBMZXQncyBleHRyYWN0IGl0IHRvIHRoZSBsb2NhdGlvbiB3aGljaCBjb250YWlucyB0aGUgc3ltbGluaworICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCdyJykKKyAgICAgICAgICAgICMgdGhpcyBzaG91bGQgbm90IHJhaXNlIE9TRXJyb3I6IFtFcnJubyAxN10gRmlsZSBleGlzdHMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0YXIuZXh0cmFjdGFsbChwYXRoPXRlbXBkaXIpCisgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImV4dHJhY3RhbGwgZmFpbGVkIHdpdGggc3ltbGlua2VkIGZpbGVzIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayh0ZW1wYXJjaGl2ZSkKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUodGVtcGRpcikKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdzeW1saW5rJyksICJuZWVkcyBvcy5zeW1saW5rIikKKyAgICBkZWYgdGVzdF9leHRyYWN0YWxsX2Jyb2tlbl9zeW1saW5rcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGlmIGV4dHJhY3RhbGwgd29ya3MgcHJvcGVybHkgd2hlbiB0YXJmaWxlIGNvbnRhaW5zIGJyb2tlbgorICAgICAgICAjIHN5bWxpbmtzCisgICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcyIpCisgICAgICAgIHRlbXBhcmNoaXZlID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJ0ZXN0c3ltbGlua3MudGFyIikKKyAgICAgICAgb3MubWtkaXIodGVtcGRpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc291cmNlX2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc291cmNlJykKKyAgICAgICAgICAgIHRhcmdldF9maWxlID0gb3MucGF0aC5qb2luKHRlbXBkaXIsJ3N5bWxpbmsnKQorICAgICAgICAgICAgd2l0aCBvcGVuKHNvdXJjZV9maWxlLCd3JykgYXMgZjoKKyAgICAgICAgICAgICAgICBmLndyaXRlKCdzb21ldGhpbmdcbicpCisgICAgICAgICAgICBvcy5zeW1saW5rKHNvdXJjZV9maWxlLCB0YXJnZXRfZmlsZSkKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwndycpCisgICAgICAgICAgICB0YXIuYWRkKHRhcmdldF9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2ZpbGUpKQorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgICAgICMgcmVtb3ZlIHRoZSByZWFsIGZpbGUKKyAgICAgICAgICAgIG9zLnVubGluayhzb3VyY2VfZmlsZSkKKyAgICAgICAgICAgICMgTGV0J3MgZXh0cmFjdCBpdCB0byB0aGUgbG9jYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWxpbmsKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwncicpCisgICAgICAgICAgICAjIHRoaXMgc2hvdWxkIG5vdCByYWlzZSBPU0Vycm9yOiBbRXJybm8gMTddIEZpbGUgZXhpc3RzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyLmV4dHJhY3RhbGwocGF0aD10ZW1wZGlyKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHRyYWN0YWxsIGZhaWxlZCB3aXRoIGJyb2tlbiBzeW1saW5rZWQgZmlsZXMiKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICB0YXIuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKHRlbXBhcmNoaXZlKQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSh0ZW1wZGlyKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2xpbmsnKSwgIm5lZWRzIG9zLmxpbmsiKQorICAgIGRlZiB0ZXN0X2V4dHJhY3RhbGxfaGFyZGxpbmtzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgZXh0cmFjdGFsbCB3b3JrcyBwcm9wZXJseSB3aGVuIHRhcmZpbGUgY29udGFpbnMgc3ltbGlua3MKKyAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbihURU1QRElSLCAidGVzdHN5bWxpbmtzIikKKyAgICAgICAgdGVtcGFyY2hpdmUgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgInRlc3RzeW1saW5rcy50YXIiKQorICAgICAgICBvcy5ta2Rpcih0ZW1wZGlyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb3VyY2VfZmlsZSA9IG9zLnBhdGguam9pbih0ZW1wZGlyLCdzb3VyY2UnKQorICAgICAgICAgICAgdGFyZ2V0X2ZpbGUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwnc3ltbGluaycpCisgICAgICAgICAgICB3aXRoIG9wZW4oc291cmNlX2ZpbGUsJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoJ3NvbWV0aGluZ1xuJykKKyAgICAgICAgICAgIG9zLmxpbmsoc291cmNlX2ZpbGUsIHRhcmdldF9maWxlKQorICAgICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRlbXBhcmNoaXZlLCd3JykKKyAgICAgICAgICAgIHRhci5hZGQoc291cmNlX2ZpbGUsIGFyY25hbWU9b3MucGF0aC5iYXNlbmFtZShzb3VyY2VfZmlsZSkpCisgICAgICAgICAgICB0YXIuYWRkKHRhcmdldF9maWxlLCBhcmNuYW1lPW9zLnBhdGguYmFzZW5hbWUodGFyZ2V0X2ZpbGUpKQorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgICAgICMgTGV0J3MgZXh0cmFjdCBpdCB0byB0aGUgbG9jYXRpb24gd2hpY2ggY29udGFpbnMgdGhlIHN5bWxpbmsKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0ZW1wYXJjaGl2ZSwncicpCisgICAgICAgICAgICAjIHRoaXMgc2hvdWxkIG5vdCByYWlzZSBPU0Vycm9yOiBbRXJybm8gMTddIEZpbGUgZXhpc3RzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyLmV4dHJhY3RhbGwocGF0aD10ZW1wZGlyKQorICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHRyYWN0YWxsIGZhaWxlZCB3aXRoIGxpbmtlZCBmaWxlcyIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy51bmxpbmsodGVtcGFyY2hpdmUpCisgICAgICAgICAgICBzaHV0aWwucm10cmVlKHRlbXBkaXIpCisKK2NsYXNzIFN0cmVhbVdyaXRlVGVzdChXcml0ZVRlc3RCYXNlKToKKworICAgIG1vZGUgPSAid3wiCisKKyAgICBkZWYgdGVzdF9zdHJlYW1fcGFkZGluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBidWcgIzE1NDMzMDMuCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBzZWxmLm1vZGUpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCJneiIpOgorICAgICAgICAgICAgZm9iaiA9IGd6aXAuR3ppcEZpbGUodG1wbmFtZSkKKyAgICAgICAgICAgIGRhdGEgPSBmb2JqLnJlYWQoKQorICAgICAgICAgICAgZm9iai5jbG9zZSgpCisgICAgICAgIGVsaWYgc2VsZi5tb2RlLmVuZHN3aXRoKCJiejIiKToKKyAgICAgICAgICAgIGRlYyA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQorICAgICAgICAgICAgZGF0YSA9IG9wZW4odG1wbmFtZSwgInJiIikucmVhZCgpCisgICAgICAgICAgICBkYXRhID0gZGVjLmRlY29tcHJlc3MoZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGVjLnVudXNlZF9kYXRhKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAiZm91bmQgdHJhaWxpbmcgZGF0YSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb2JqID0gb3Blbih0bXBuYW1lLCAicmIiKQorICAgICAgICAgICAgZGF0YSA9IGZvYmoucmVhZCgpCisgICAgICAgICAgICBmb2JqLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YS5jb3VudCgiXDAiKSA9PSB0YXJmaWxlLlJFQ09SRFNJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgImluY29ycmVjdCB6ZXJvIHBhZGRpbmciKQorCisgICAgZGVmIHRlc3RfZmlsZV9tb2RlKHNlbGYpOgorICAgICAgICAjIFRlc3QgZm9yIGlzc3VlICM4NDY0OiBDcmVhdGUgZmlsZXMgd2l0aCBjb3JyZWN0CisgICAgICAgICMgcGVybWlzc2lvbnMuCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiIG9yIG5vdCBoYXNhdHRyKG9zLCAidW1hc2siKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRtcG5hbWUpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHRtcG5hbWUpCisKKyAgICAgICAgb3JpZ2luYWxfdW1hc2sgPSBvcy51bWFzaygwMDIyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgc2VsZi5tb2RlKQorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgICAgIG1vZGUgPSBvcy5zdGF0KHRtcG5hbWUpLnN0X21vZGUgJiAwNzc3CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZGUsIDA2NDQsICJ3cm9uZyBmaWxlIHBlcm1pc3Npb25zIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVtYXNrKG9yaWdpbmFsX3VtYXNrKQorCisgICAgZGVmIHRlc3RfaXNzdWUxMzYzOShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odW5pY29kZSh0bXBuYW1lLCBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpLCBzZWxmLm1vZGUpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiX1N0cmVhbSBmYWlsZWQgdG8gd3JpdGUgdW5pY29kZSBmaWxlbmFtZSIpCisKKworY2xhc3MgR05VV3JpdGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRoaXMgdGVzdGNhc2UgY2hlY2tzIGZvciBjb3JyZWN0IGNyZWF0aW9uIG9mIEdOVSBMb25nbmFtZQorICAgICMgYW5kIExvbmdsaW5rIGV4dGVuZGVkIGhlYWRlcnMgKGNwLiBidWcgIzgxMjMyNSkuCisKKyAgICBkZWYgX2xlbmd0aChzZWxmLCBzKToKKyAgICAgICAgYmxvY2tzLCByZW1haW5kZXIgPSBkaXZtb2QobGVuKHMpICsgMSwgNTEyKQorICAgICAgICBpZiByZW1haW5kZXI6CisgICAgICAgICAgICBibG9ja3MgKz0gMQorICAgICAgICByZXR1cm4gYmxvY2tzICogNTEyCisKKyAgICBkZWYgX2NhbGNfc2l6ZShzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgorICAgICAgICAjIEluaXRpYWwgdGFyIGhlYWRlcgorICAgICAgICBjb3VudCA9IDUxMgorCisgICAgICAgIGlmIGxlbihuYW1lKSA+IHRhcmZpbGUuTEVOR1RIX05BTUU6CisgICAgICAgICAgICAjIEdOVSBsb25nbmFtZSBleHRlbmRlZCBoZWFkZXIgKyBsb25nbmFtZQorICAgICAgICAgICAgY291bnQgKz0gNTEyCisgICAgICAgICAgICBjb3VudCArPSBzZWxmLl9sZW5ndGgobmFtZSkKKyAgICAgICAgaWYgbGluayBpcyBub3QgTm9uZSBhbmQgbGVuKGxpbmspID4gdGFyZmlsZS5MRU5HVEhfTElOSzoKKyAgICAgICAgICAgICMgR05VIGxvbmdsaW5rIGV4dGVuZGVkIGhlYWRlciArIGxvbmdsaW5rCisgICAgICAgICAgICBjb3VudCArPSA1MTIKKyAgICAgICAgICAgIGNvdW50ICs9IHNlbGYuX2xlbmd0aChsaW5rKQorICAgICAgICByZXR1cm4gY291bnQKKworICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKG5hbWUpCisgICAgICAgIGlmIGxpbms6CisgICAgICAgICAgICB0YXJpbmZvLmxpbmtuYW1lID0gbGluaworICAgICAgICAgICAgdGFyaW5mby50eXBlID0gdGFyZmlsZS5MTktUWVBFCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IikKKyAgICAgICAgdGFyLmZvcm1hdCA9IHRhcmZpbGUuR05VX0ZPUk1BVAorICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQorCisgICAgICAgIHYxID0gc2VsZi5fY2FsY19zaXplKG5hbWUsIGxpbmspCisgICAgICAgIHYyID0gdGFyLm9mZnNldAorICAgICAgICBzZWxmLmFzc2VydFRydWUodjEgPT0gdjIsICJHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKKworICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQorICAgICAgICBtZW1iZXIgPSB0YXIubmV4dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKG1lbWJlciwKKyAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJpbmZvLm5hbWUsIG1lbWJlci5uYW1lLAorICAgICAgICAgICAgICAgICJ1bmFibGUgdG8gcmVhZCBsb25nbmFtZSBtZW1iZXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhcmluZm8ubGlua25hbWUsIG1lbWJlci5saW5rbmFtZSwKKyAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKKworICAgIGRlZiB0ZXN0X2xvbmduYW1lXzEwMjMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3QoKCJsb25nbmFtLyIgKiAxMjcpICsgImxvbmduYW0iKQorCisgICAgZGVmIHRlc3RfbG9uZ25hbWVfMTAyNChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbWUiKQorCisgICAgZGVmIHRlc3RfbG9uZ25hbWVfMTAyNShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbWVfIikKKworICAgIGRlZiB0ZXN0X2xvbmdsaW5rXzEwMjMoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3QoIm5hbWUiLCAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xuayIpCisKKyAgICBkZWYgdGVzdF9sb25nbGlua18xMDI0KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0KCJuYW1lIiwgKCJsb25nbG5rLyIgKiAxMjcpICsgImxvbmdsaW5rIikKKworICAgIGRlZiB0ZXN0X2xvbmdsaW5rXzEwMjUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3QoIm5hbWUiLCAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xpbmtfIikKKworICAgIGRlZiB0ZXN0X2xvbmduYW1lbGlua18xMDIzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0KCgibG9uZ25hbS8iICogMTI3KSArICJsb25nbmFtIiwKKyAgICAgICAgICAgICAgICAgICAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xuayIpCisKKyAgICBkZWYgdGVzdF9sb25nbmFtZWxpbmtfMTAyNChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbWUiLAorICAgICAgICAgICAgICAgICAgICgibG9uZ2xuay8iICogMTI3KSArICJsb25nbGluayIpCisKKyAgICBkZWYgdGVzdF9sb25nbmFtZWxpbmtfMTAyNShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdCgoImxvbmduYW0vIiAqIDEyNykgKyAibG9uZ25hbWVfIiwKKyAgICAgICAgICAgICAgICAgICAoImxvbmdsbmsvIiAqIDEyNykgKyAibG9uZ2xpbmtfIikKKworCitjbGFzcyBIYXJkbGlua1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCB0aGUgY3JlYXRpb24gb2YgTE5LVFlQRSAoaGFyZGxpbmspIG1lbWJlcnMgaW4gYW4gYXJjaGl2ZS4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5mb28gPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImZvbyIpCisgICAgICAgIHNlbGYuYmFyID0gb3MucGF0aC5qb2luKFRFTVBESVIsICJiYXIiKQorCisgICAgICAgIGZvYmogPSBvcGVuKHNlbGYuZm9vLCAid2IiKQorICAgICAgICBmb2JqLndyaXRlKCJmb28iKQorICAgICAgICBmb2JqLmNsb3NlKCkKKworICAgICAgICBvcy5saW5rKHNlbGYuZm9vLCBzZWxmLmJhcikKKworICAgICAgICBzZWxmLnRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIpCisgICAgICAgIHNlbGYudGFyLmFkZChzZWxmLmZvbykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50YXIuY2xvc2UoKQorICAgICAgICBvcy5yZW1vdmUoc2VsZi5mb28pCisgICAgICAgIG9zLnJlbW92ZShzZWxmLmJhcikKKworICAgIGRlZiB0ZXN0X2FkZF90d2ljZShzZWxmKToKKyAgICAgICAgIyBUaGUgc2FtZSBuYW1lIHdpbGwgYmUgYWRkZWQgYXMgYSBSRUdUWVBFIGV2ZXJ5CisgICAgICAgICMgdGltZSByZWdhcmRsZXNzIG9mIHN0X25saW5rLgorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLlJFR1RZUEUsCisgICAgICAgICAgICAgICAgImFkZCBmaWxlIGFzIHJlZ3VsYXIgZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X2FkZF9oYXJkbGluayhzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldHRhcmluZm8oc2VsZi5iYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5MTktUWVBFLAorICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyBoYXJkbGluayBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfZGVyZWZlcmVuY2VfaGFyZGxpbmsoc2VsZik6CisgICAgICAgIHNlbGYudGFyLmRlcmVmZXJlbmNlID0gVHJ1ZQorICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmJhcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLlJFR1RZUEUsCisgICAgICAgICAgICAgICAgImRlcmVmZXJlbmNpbmcgaGFyZGxpbmsgZmFpbGVkIikKKworCitjbGFzcyBQYXhXcml0ZVRlc3QoR05VV3JpdGVUZXN0KToKKworICAgIGRlZiBfdGVzdChzZWxmLCBuYW1lLCBsaW5rPU5vbmUpOgorICAgICAgICAjIFNlZSBHTlVXcml0ZVRlc3QuCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8obmFtZSkKKyAgICAgICAgaWYgbGluazoKKyAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSBsaW5rCisgICAgICAgICAgICB0YXJpbmZvLnR5cGUgPSB0YXJmaWxlLkxOS1RZUEUKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFUKQorICAgICAgICB0YXIuYWRkZmlsZSh0YXJpbmZvKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lKQorICAgICAgICBpZiBsaW5rOgorICAgICAgICAgICAgbCA9IHRhci5nZXRtZW1iZXJzKClbMF0ubGlua25hbWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaW5rID09IGwsICJQQVggbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG4gPSB0YXIuZ2V0bWVtYmVycygpWzBdLm5hbWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lID09IG4sICJQQVggbG9uZ25hbWUgY3JlYXRpb24gZmFpbGVkIikKKworICAgIGRlZiB0ZXN0X3BheF9nbG9iYWxfaGVhZGVyKHNlbGYpOgorICAgICAgICBwYXhfaGVhZGVycyA9IHsKKyAgICAgICAgICAgICAgICB1ImZvbyI6IHUiYmFyIiwKKyAgICAgICAgICAgICAgICB1InVpZCI6IHUiMCIsCisgICAgICAgICAgICAgICAgdSJtdGltZSI6IHUiMS4yMyIsCisgICAgICAgICAgICAgICAgdSJ0ZXN0IjogdSLk9vwiLAorICAgICAgICAgICAgICAgIHUi5Pb8IjogdSJ0ZXN0In0KKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciLCBmb3JtYXQ9dGFyZmlsZS5QQVhfRk9STUFULAorICAgICAgICAgICAgICAgIHBheF9oZWFkZXJzPXBheF9oZWFkZXJzKQorICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8oInRlc3QiKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICAjIFRlc3QgaWYgdGhlIGdsb2JhbCBoZWFkZXIgd2FzIHdyaXR0ZW4gY29ycmVjdGx5LgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyLnBheF9oZWFkZXJzLCBwYXhfaGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bWVtYmVycygpWzBdLnBheF9oZWFkZXJzLCBwYXhfaGVhZGVycykKKworICAgICAgICAjIFRlc3QgaWYgYWxsIHRoZSBmaWVsZHMgYXJlIHVuaWNvZGUuCisgICAgICAgIGZvciBrZXksIHZhbCBpbiB0YXIucGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShrZXkpIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh2YWwpIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBpZiBrZXkgaW4gdGFyZmlsZS5QQVhfTlVNQkVSX0ZJRUxEUzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuUEFYX05VTUJFUl9GSUVMRFNba2V5XSh2YWwpCisgICAgICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoInVuYWJsZSB0byBjb252ZXJ0IHBheCBoZWFkZXIgZmllbGQiKQorCisgICAgZGVmIHRlc3RfcGF4X2V4dGVuZGVkX2hlYWRlcihzZWxmKToKKyAgICAgICAgIyBUaGUgZmllbGRzIGZyb20gdGhlIHBheCBoZWFkZXIgaGF2ZSBwcmlvcml0eSBvdmVyIHRoZQorICAgICAgICAjIFRhckluZm8uCisgICAgICAgIHBheF9oZWFkZXJzID0ge3UicGF0aCI6IHUiZm9vIiwgdSJ1aWQiOiB1IjEyMyJ9CisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXRhcmZpbGUuUEFYX0ZPUk1BVCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oKQorICAgICAgICB0Lm5hbWUgPSB1IuT2/CIgICAgICMgbm9uLUFTQ0lJCisgICAgICAgIHQudWlkID0gOCoqOCAgICAgICAgIyB0b28gbGFyZ2UKKyAgICAgICAgdC5wYXhfaGVhZGVycyA9IHBheF9oZWFkZXJzCisgICAgICAgIHRhci5hZGRmaWxlKHQpCisgICAgICAgIHRhci5jbG9zZSgpCisKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICB0ID0gdGFyLmdldG1lbWJlcnMoKVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQucGF4X2hlYWRlcnMsIHBheF9oZWFkZXJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubmFtZSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC51aWQsIDEyMykKKworCitjbGFzcyBVc3RhclVuaWNvZGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEFsbCAqVW5pY29kZVRlc3RzIEZJWE1FCisKKyAgICBmb3JtYXQgPSB0YXJmaWxlLlVTVEFSX0ZPUk1BVAorCisgICAgZGVmIHRlc3RfaXNvODg1OV8xX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoImlzbzg4NTktMSIpCisKKyAgICBkZWYgdGVzdF91dGY3X2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3VuaWNvZGVfZmlsZW5hbWUoInV0ZjciKQorCisgICAgZGVmIHRlc3RfdXRmOF9maWxlbmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF91bmljb2RlX2ZpbGVuYW1lKCJ1dGY4IikKKworICAgIGRlZiBfdGVzdF91bmljb2RlX2ZpbGVuYW1lKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsICJ3IiwgZm9ybWF0PXNlbGYuZm9ybWF0LCBlbmNvZGluZz1lbmNvZGluZywgZXJyb3JzPSJzdHJpY3QiKQorICAgICAgICBuYW1lID0gdSLk9vwiCisgICAgICAgIHRhci5hZGRmaWxlKHRhcmZpbGUuVGFySW5mbyhuYW1lKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHRhci5nZXRuYW1lcygpWzBdKSBpcyBub3QgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bWVtYmVycygpWzBdLm5hbWUsIG5hbWUuZW5jb2RlKGVuY29kaW5nKSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfZmlsZW5hbWVfZXJyb3Ioc2VsZik6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9ImFzY2lpIiwgZXJyb3JzPSJzdHJpY3QiKQorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCkKKworICAgICAgICB0YXJpbmZvLm5hbWUgPSAi5Pb8IgorICAgICAgICBpZiBzZWxmLmZvcm1hdCA9PSB0YXJmaWxlLlBBWF9GT1JNQVQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhci5hZGRmaWxlLCB0YXJpbmZvKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFyLmFkZGZpbGUodGFyaW5mbykKKworICAgICAgICB0YXJpbmZvLm5hbWUgPSB1IuT2/CIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB0YXIuYWRkZmlsZSwgdGFyaW5mbykKKworICAgICAgICB0YXJpbmZvLm5hbWUgPSAiZm9vIgorICAgICAgICB0YXJpbmZvLnVuYW1lID0gdSLk9vwiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdGFyLmFkZGZpbGUsIHRhcmluZm8pCisKKyAgICBkZWYgdGVzdF91bmljb2RlX2FyZ3VtZW50KHNlbGYpOgorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgInIiLCBlbmNvZGluZz0iaXNvODg1OS0xIiwgZXJyb3JzPSJzdHJpY3QiKQorICAgICAgICBmb3IgdCBpbiB0YXI6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0Lm5hbWUpIGlzIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQubGlua25hbWUpIGlzIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQudW5hbWUpIGlzIHN0cikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQuZ25hbWUpIGlzIHN0cikKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3VuYW1lX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGZvciBuYW1lIGluICh1IuT2/CIsICLk9vwiKToKKyAgICAgICAgICAgIHQgPSB0YXJmaWxlLlRhckluZm8oImZvbyIpCisgICAgICAgICAgICB0LnVuYW1lID0gbmFtZQorICAgICAgICAgICAgdC5nbmFtZSA9IG5hbWUKKworICAgICAgICAgICAgZm9iaiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbigiZm9vLnRhciIsIG1vZGU9InciLCBmaWxlb2JqPWZvYmosIGZvcm1hdD1zZWxmLmZvcm1hdCwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgICAgICB0YXIuYWRkZmlsZSh0KQorICAgICAgICAgICAgdGFyLmNsb3NlKCkKKyAgICAgICAgICAgIGZvYmouc2VlaygwKQorCisgICAgICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oImZvby50YXIiLCBmaWxlb2JqPWZvYmosIGVuY29kaW5nPSJpc284ODU5LTEiKQorICAgICAgICAgICAgdCA9IHRhci5nZXRtZW1iZXIoImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQudW5hbWUsICLk9vwiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmduYW1lLCAi5Pb8IikKKworCitjbGFzcyBHTlVVbmljb2RlVGVzdChVc3RhclVuaWNvZGVUZXN0KToKKworICAgIGZvcm1hdCA9IHRhcmZpbGUuR05VX0ZPUk1BVAorCisKK2NsYXNzIFBheFVuaWNvZGVUZXN0KFVzdGFyVW5pY29kZVRlc3QpOgorCisgICAgZm9ybWF0ID0gdGFyZmlsZS5QQVhfRk9STUFUCisKKyAgICBkZWYgX2NyZWF0ZV91bmljb2RlX25hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCAidyIsIGZvcm1hdD1zZWxmLmZvcm1hdCkKKyAgICAgICAgdCA9IHRhcmZpbGUuVGFySW5mbygpCisgICAgICAgIHQucGF4X2hlYWRlcnNbInBhdGgiXSA9IG5hbWUKKyAgICAgICAgdGFyLmFkZGZpbGUodCkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2Vycm9yX2hhbmRsZXJzKHNlbGYpOgorICAgICAgICAjIFRlc3QgaWYgdGhlIHVuaWNvZGUgZXJyb3IgaGFuZGxlcnMgd29yayBjb3JyZWN0bHkgZm9yIGNoYXJhY3RlcnMKKyAgICAgICAgIyB0aGF0IGNhbm5vdCBiZSBleHByZXNzZWQgaW4gYSBnaXZlbiBlbmNvZGluZy4KKyAgICAgICAgc2VsZi5fY3JlYXRlX3VuaWNvZGVfbmFtZSh1IuT2/CIpCisKKyAgICAgICAgZm9yIGhhbmRsZXIsIG5hbWUgaW4gKCgidXRmLTgiLCB1IuT2/CIuZW5jb2RlKCJ1dGY4IikpLAorICAgICAgICAgICAgICAgICAgICAoInJlcGxhY2UiLCAiPz8/IiksICgiaWdub3JlIiwgIiIpKToKKyAgICAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJhc2NpaSIsCisgICAgICAgICAgICAgICAgICAgIGVycm9ycz1oYW5kbGVyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKVswXSwgbmFtZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRXJyb3IsIHRhcmZpbGUub3BlbiwgdG1wbmFtZSwKKyAgICAgICAgICAgICAgICBlbmNvZGluZz0iYXNjaWkiLCBlcnJvcnM9InN0cmljdCIpCisKKyAgICBkZWYgdGVzdF9lcnJvcl9oYW5kbGVyX3V0Zjgoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIGEgcGF0aG5hbWUgdGhhdCBoYXMgb25lIGNvbXBvbmVudCByZXByZXNlbnRhYmxlIHVzaW5nCisgICAgICAgICMgaXNvODg1OS0xIGFuZCB0aGUgb3RoZXIgb25seSBpbiBpc284ODU5LTE1LgorICAgICAgICBzZWxmLl9jcmVhdGVfdW5pY29kZV9uYW1lKHUi5Pb8L6QiKQorCisgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0bXBuYW1lLCBmb3JtYXQ9c2VsZi5mb3JtYXQsIGVuY29kaW5nPSJpc284ODU5LTEiLAorICAgICAgICAgICAgICAgIGVycm9ycz0idXRmLTgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRuYW1lcygpWzBdLCAi5Pb8LyIgKyB1IqQiLmVuY29kZSgidXRmOCIpKQorCisKK2NsYXNzIEFwcGVuZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgVGVzdCBhcHBlbmQgbW9kZSAoY3AuIHBhdGNoICMxNjUyNjgxKS4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50YXJuYW1lID0gdG1wbmFtZQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLnRhcm5hbWUpOgorICAgICAgICAgICAgb3MucmVtb3ZlKHNlbGYudGFybmFtZSkKKworICAgIGRlZiBfYWRkX3Rlc3RmaWxlKHNlbGYsIGZpbGVvYmo9Tm9uZSk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsICJhIiwgZmlsZW9iaj1maWxlb2JqKQorICAgICAgICB0YXIuYWRkZmlsZSh0YXJmaWxlLlRhckluZm8oImJhciIpKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIF9jcmVhdGVfdGVzdHRhcihzZWxmLCBtb2RlPSJ3OiIpOgorICAgICAgICBzcmMgPSB0YXJmaWxlLm9wZW4odGFybmFtZSwgZW5jb2Rpbmc9Imlzbzg4NTktMSIpCisgICAgICAgIHQgPSBzcmMuZ2V0bWVtYmVyKCJ1c3Rhci9yZWd0eXBlIikKKyAgICAgICAgdC5uYW1lID0gImZvbyIKKyAgICAgICAgZiA9IHNyYy5leHRyYWN0ZmlsZSh0KQorICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oc2VsZi50YXJuYW1lLCBtb2RlKQorICAgICAgICB0YXIuYWRkZmlsZSh0LCBmKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgZGVmIF90ZXN0KHNlbGYsIG5hbWVzPVsiYmFyIl0sIGZpbGVvYmo9Tm9uZSk6CisgICAgICAgIHRhciA9IHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsIGZpbGVvYmo9ZmlsZW9iaikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXIuZ2V0bmFtZXMoKSwgbmFtZXMpCisKKyAgICBkZWYgdGVzdF9ub25fZXhpc3Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCisgICAgICAgIHNlbGYuX3Rlc3QoKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIHRhcmZpbGUub3BlbihzZWxmLnRhcm5hbWUsICJ3OiIpLmNsb3NlKCkKKyAgICAgICAgc2VsZi5fYWRkX3Rlc3RmaWxlKCkKKyAgICAgICAgc2VsZi5fdGVzdCgpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9maWxlb2JqKHNlbGYpOgorICAgICAgICBmb2JqID0gU3RyaW5nSU8uU3RyaW5nSU8oIlwwIiAqIDEwMjQpCisgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZShmb2JqKQorICAgICAgICBmb2JqLnNlZWsoMCkKKyAgICAgICAgc2VsZi5fdGVzdChmaWxlb2JqPWZvYmopCisKKyAgICBkZWYgdGVzdF9maWxlb2JqKHNlbGYpOgorICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCisgICAgICAgIGRhdGEgPSBvcGVuKHNlbGYudGFybmFtZSkucmVhZCgpCisgICAgICAgIGZvYmogPSBTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQorICAgICAgICBzZWxmLl9hZGRfdGVzdGZpbGUoZm9iaikKKyAgICAgICAgZm9iai5zZWVrKDApCisgICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0sIGZpbGVvYmo9Zm9iaikKKworICAgIGRlZiB0ZXN0X2V4aXN0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigpCisgICAgICAgIHNlbGYuX2FkZF90ZXN0ZmlsZSgpCisgICAgICAgIHNlbGYuX3Rlc3QobmFtZXM9WyJmb28iLCAiYmFyIl0pCisKKyAgICBkZWYgdGVzdF9hcHBlbmRfZ3ooc2VsZik6CisgICAgICAgIGlmIGd6aXAgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9jcmVhdGVfdGVzdHRhcigidzpneiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsICJhIikKKworICAgIGRlZiB0ZXN0X2FwcGVuZF9iejIoc2VsZik6CisgICAgICAgIGlmIGJ6MiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX2NyZWF0ZV90ZXN0dGFyKCJ3OmJ6MiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRhcmZpbGUuUmVhZEVycm9yLCB0YXJmaWxlLm9wZW4sIHRtcG5hbWUsICJhIikKKworICAgICMgQXBwZW5kIG1vZGUgaXMgc3VwcG9zZWQgdG8gZmFpbCBpZiB0aGUgdGFyZmlsZSB0byBhcHBlbmQgdG8KKyAgICAjIGRvZXMgbm90IGVuZCB3aXRoIGEgemVybyBibG9jay4KKyAgICBkZWYgX3Rlc3RfZXJyb3Ioc2VsZiwgZGF0YSk6CisgICAgICAgIG9wZW4oc2VsZi50YXJuYW1lLCAid2IiKS53cml0ZShkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlJlYWRFcnJvciwgc2VsZi5fYWRkX3Rlc3RmaWxlKQorCisgICAgZGVmIHRlc3RfbnVsbChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9lcnJvcigiIikKKworICAgIGRlZiB0ZXN0X2luY29tcGxldGUoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoIlwwIiAqIDEzKQorCisgICAgZGVmIHRlc3RfcHJlbWF0dXJlX2VvZihzZWxmKToKKyAgICAgICAgZGF0YSA9IHRhcmZpbGUuVGFySW5mbygiZm9vIikudG9idWYoKQorICAgICAgICBzZWxmLl90ZXN0X2Vycm9yKGRhdGEpCisKKyAgICBkZWYgdGVzdF90cmFpbGluZ19nYXJiYWdlKHNlbGYpOgorICAgICAgICBkYXRhID0gdGFyZmlsZS5UYXJJbmZvKCJmb28iKS50b2J1ZigpCisgICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoZGF0YSArICJcMCIgKiAxMykKKworICAgIGRlZiB0ZXN0X2ludmFsaWQoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfZXJyb3IoImEiICogNTEyKQorCisKK2NsYXNzIExpbWl0c1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdXN0YXJfbGltaXRzKHNlbGYpOgorICAgICAgICAjIDEwMCBjaGFyIG5hbWUKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMDEyMzQ1Njc4OSIgKiAxMCkKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKKworICAgICAgICAjIDEwMSBjaGFyIG5hbWUgdGhhdCBjYW5ub3QgYmUgc3RvcmVkCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjAxMjM0NTY3ODkiICogMTAgKyAiMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQorCisgICAgICAgICMgMjU2IGNoYXIgbmFtZSB3aXRoIGEgc2xhc2ggYXQgcG9zIDE1NgorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDYyICsgImxvbmduYW1lIikKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlVTVEFSX0ZPUk1BVCkKKworICAgICAgICAjIDI1NiBjaGFyIG5hbWUgdGhhdCBjYW5ub3QgYmUgc3RvcmVkCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMzQ1NjcvIiAqIDMxICsgImxvbmduYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCisKKyAgICAgICAgIyA1MTIgY2hhciBuYW1lCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIjEyMy8iICogMTI2ICsgImxvbmduYW1lIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGFyaW5mby50b2J1ZiwgdGFyZmlsZS5VU1RBUl9GT1JNQVQpCisKKyAgICAgICAgIyA1MTIgY2hhciBsaW5rbmFtZQorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCisgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQorCisgICAgICAgICMgdWlkID4gOCBkaWdpdHMKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCisgICAgICAgIHRhcmluZm8udWlkID0gMDEwMDAwMDAwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRhcmluZm8udG9idWYsIHRhcmZpbGUuVVNUQVJfRk9STUFUKQorCisgICAgZGVmIHRlc3RfZ251X2xpbWl0cyhzZWxmKToKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiKQorICAgICAgICB0YXJpbmZvLnRvYnVmKHRhcmZpbGUuR05VX0ZPUk1BVCkKKworICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCJsb25nbGluayIpCisgICAgICAgIHRhcmluZm8ubGlua25hbWUgPSAiMTIzLyIgKiAxMjYgKyAibG9uZ25hbWUiCisgICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5HTlVfRk9STUFUKQorCisgICAgICAgICMgdWlkID49IDI1NiAqKiA3CisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oIm5hbWUiKQorICAgICAgICB0YXJpbmZvLnVpZCA9IDA0MDAwMDAwMDAwMDAwMDAwMDAwTAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0YXJpbmZvLnRvYnVmLCB0YXJmaWxlLkdOVV9GT1JNQVQpCisKKyAgICBkZWYgdGVzdF9wYXhfbGltaXRzKHNlbGYpOgorICAgICAgICB0YXJpbmZvID0gdGFyZmlsZS5UYXJJbmZvKCIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIpCisgICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5QQVhfRk9STUFUKQorCisgICAgICAgIHRhcmluZm8gPSB0YXJmaWxlLlRhckluZm8oImxvbmdsaW5rIikKKyAgICAgICAgdGFyaW5mby5saW5rbmFtZSA9ICIxMjMvIiAqIDEyNiArICJsb25nbmFtZSIKKyAgICAgICAgdGFyaW5mby50b2J1Zih0YXJmaWxlLlBBWF9GT1JNQVQpCisKKyAgICAgICAgdGFyaW5mbyA9IHRhcmZpbGUuVGFySW5mbygibmFtZSIpCisgICAgICAgIHRhcmluZm8udWlkID0gMDQwMDAwMDAwMDAwMDAwMDAwMDBMCisgICAgICAgIHRhcmluZm8udG9idWYodGFyZmlsZS5QQVhfRk9STUFUKQorCisKK2NsYXNzIENvbnRleHRNYW5hZ2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odGFybmFtZSkgYXMgdGFyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0YXIuY2xvc2VkLCAiY2xvc2VkIGluc2lkZSBydW50aW1lIGNvbnRleHQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmNsb3NlZCwgImNvbnRleHQgbWFuYWdlciBmYWlsZWQiKQorCisgICAgZGVmIHRlc3RfY2xvc2VkKHNlbGYpOgorICAgICAgICAjIFRoZSBfX2VudGVyX18oKSBtZXRob2QgaXMgc3VwcG9zZWQgdG8gcmFpc2UgSU9FcnJvcgorICAgICAgICAjIGlmIHRoZSBUYXJGaWxlIG9iamVjdCBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRhcm5hbWUpCisgICAgICAgIHRhci5jbG9zZSgpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvcik6CisgICAgICAgICAgICB3aXRoIHRhcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9leGNlcHRpb24oc2VsZik6CisgICAgICAgICMgVGVzdCBpZiB0aGUgSU9FcnJvciBleGNlcHRpb24gaXMgcGFzc2VkIHRocm91Z2ggcHJvcGVybHkuCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoRXhjZXB0aW9uKSBhcyBleGM6CisgICAgICAgICAgICB3aXRoIHRhcmZpbGUub3Blbih0YXJuYW1lKSBhcyB0YXI6CisgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvcgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZXhjLmV4Y2VwdGlvbiwgSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBleGNlcHRpb24gcmFpc2VkIGluIGNvbnRleHQgbWFuYWdlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuY2xvc2VkLCAiY29udGV4dCBtYW5hZ2VyIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9ub19lb2Yoc2VsZik6CisgICAgICAgICMgX19leGl0X18oKSBtdXN0IG5vdCB3cml0ZSBlbmQtb2YtYXJjaGl2ZSBibG9ja3MgaWYgYW4KKyAgICAgICAgIyBleGNlcHRpb24gd2FzIHJhaXNlZC4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciKSBhcyB0YXI6CisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmdldHNpemUodG1wbmFtZSksIDAsCisgICAgICAgICAgICAgICAgImNvbnRleHQgbWFuYWdlciB3cm90ZSBhbiBlbmQtb2YtYXJjaGl2ZSBibG9jayIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuY2xvc2VkLCAiY29udGV4dCBtYW5hZ2VyIGZhaWxlZCIpCisKKyAgICBkZWYgdGVzdF9lb2Yoc2VsZik6CisgICAgICAgICMgX19leGl0X18oKSBtdXN0IHdyaXRlIGVuZC1vZi1hcmNoaXZlIGJsb2NrcywgaS5lLiBjYWxsCisgICAgICAgICMgVGFyRmlsZS5jbG9zZSgpIGlmIHRoZXJlIHdhcyBubyBlcnJvci4KKyAgICAgICAgd2l0aCB0YXJmaWxlLm9wZW4odG1wbmFtZSwgInciKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcy5wYXRoLmdldHNpemUodG1wbmFtZSksIDAsCisgICAgICAgICAgICAgICAgImNvbnRleHQgbWFuYWdlciB3cm90ZSBubyBlbmQtb2YtYXJjaGl2ZSBibG9jayIpCisKKyAgICBkZWYgdGVzdF9maWxlb2JqKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBfX2V4aXRfXygpIGRpZCBub3QgY2xvc2UgdGhlIGV4dGVybmFsIGZpbGUKKyAgICAgICAgIyBvYmplY3QuCisgICAgICAgIGZvYmogPSBvcGVuKHRtcG5hbWUsICJ3YiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggdGFyZmlsZS5vcGVuKGZpbGVvYmo9Zm9iaiwgbW9kZT0idyIpIGFzIHRhcjoKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZvYmouY2xvc2VkLCAiZXh0ZXJuYWwgZmlsZSBvYmplY3Qgd2FzIGNsb3NlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIuY2xvc2VkLCAiY29udGV4dCBtYW5hZ2VyIGZhaWxlZCIpCisgICAgICAgIGZvYmouY2xvc2UoKQorCisKK2NsYXNzIExpbmtFbXVsYXRpb25UZXN0KFJlYWRUZXN0KToKKworICAgICMgVGVzdCBmb3IgaXNzdWUgIzg3NDEgcmVncmVzc2lvbi4gT24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQKKyAgICAjIHN5bWJvbGljIG9yIGhhcmQgbGlua3MgdGFyZmlsZSB0cmllcyB0byBleHRyYWN0IHRoZXNlIHR5cGVzIG9mIG1lbWJlcnMgYXMKKyAgICAjIHRoZSByZWd1bGFyIGZpbGVzIHRoZXkgcG9pbnQgdG8uCisgICAgZGVmIF90ZXN0X2xpbmtfZXh0cmFjdGlvbihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi50YXIuZXh0cmFjdChuYW1lLCBURU1QRElSKQorICAgICAgICBkYXRhID0gb3Blbihvcy5wYXRoLmpvaW4oVEVNUERJUiwgbmFtZSksICJyYiIpLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1kNXN1bShkYXRhKSwgbWQ1X3JlZ3R5cGUpCisKKyAgICBkZWYgdGVzdF9oYXJkbGlua19leHRyYWN0aW9uMShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9saW5rX2V4dHJhY3Rpb24oInVzdGFyL2xua3R5cGUiKQorCisgICAgZGVmIHRlc3RfaGFyZGxpbmtfZXh0cmFjdGlvbjIoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfbGlua19leHRyYWN0aW9uKCIuL3VzdGFyL2xpbmt0ZXN0Mi9sbmt0eXBlIikKKworICAgIGRlZiB0ZXN0X3N5bWxpbmtfZXh0cmFjdGlvbjEoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfbGlua19leHRyYWN0aW9uKCJ1c3Rhci9zeW10eXBlIikKKworICAgIGRlZiB0ZXN0X3N5bWxpbmtfZXh0cmFjdGlvbjIoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfbGlua19leHRyYWN0aW9uKCIuL3VzdGFyL2xpbmt0ZXN0Mi9zeW10eXBlIikKKworCitjbGFzcyBHemlwTWlzY1JlYWRUZXN0KE1pc2NSZWFkVGVzdCk6CisgICAgdGFybmFtZSA9IGd6aXBuYW1lCisgICAgbW9kZSA9ICJyOmd6IgorY2xhc3MgR3ppcFVzdGFyUmVhZFRlc3QoVXN0YXJSZWFkVGVzdCk6CisgICAgdGFybmFtZSA9IGd6aXBuYW1lCisgICAgbW9kZSA9ICJyOmd6IgorY2xhc3MgR3ppcFN0cmVhbVJlYWRUZXN0KFN0cmVhbVJlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gZ3ppcG5hbWUKKyAgICBtb2RlID0gInJ8Z3oiCitjbGFzcyBHemlwV3JpdGVUZXN0KFdyaXRlVGVzdCk6CisgICAgbW9kZSA9ICJ3Omd6IgorY2xhc3MgR3ppcFN0cmVhbVdyaXRlVGVzdChTdHJlYW1Xcml0ZVRlc3QpOgorICAgIG1vZGUgPSAid3xneiIKKworCitjbGFzcyBCejJNaXNjUmVhZFRlc3QoTWlzY1JlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gYnoybmFtZQorICAgIG1vZGUgPSAicjpiejIiCitjbGFzcyBCejJVc3RhclJlYWRUZXN0KFVzdGFyUmVhZFRlc3QpOgorICAgIHRhcm5hbWUgPSBiejJuYW1lCisgICAgbW9kZSA9ICJyOmJ6MiIKK2NsYXNzIEJ6MlN0cmVhbVJlYWRUZXN0KFN0cmVhbVJlYWRUZXN0KToKKyAgICB0YXJuYW1lID0gYnoybmFtZQorICAgIG1vZGUgPSAicnxiejIiCitjbGFzcyBCejJXcml0ZVRlc3QoV3JpdGVUZXN0KToKKyAgICBtb2RlID0gInc6YnoyIgorY2xhc3MgQnoyU3RyZWFtV3JpdGVUZXN0KFN0cmVhbVdyaXRlVGVzdCk6CisgICAgbW9kZSA9ICJ3fGJ6MiIKKworY2xhc3MgQnoyUGFydGlhbFJlYWRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIElzc3VlNTA2ODogVGhlIF9CWjJQcm94eS5yZWFkKCkgbWV0aG9kIGxvb3BzIGZvcmV2ZXIKKyAgICAjIG9uIGFuIGVtcHR5IG9yIHBhcnRpYWwgYnppcHBlZCBmaWxlLgorCisgICAgZGVmIF90ZXN0X3BhcnRpYWxfaW5wdXQoc2VsZiwgbW9kZSk6CisgICAgICAgIGNsYXNzIE15U3RyaW5nSU8oU3RyaW5nSU8uU3RyaW5nSU8pOgorICAgICAgICAgICAgaGl0X2VvZiA9IEZhbHNlCisgICAgICAgICAgICBkZWYgcmVhZChzZWxmLCBuKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmhpdF9lb2Y6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJpbmZpbml0ZSBsb29wIGRldGVjdGVkIGluIHRhcmZpbGUub3BlbigpIikKKyAgICAgICAgICAgICAgICBzZWxmLmhpdF9lb2YgPSBzZWxmLnBvcyA9PSBzZWxmLmxlbgorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTy5yZWFkKHNlbGYsIG4pCisgICAgICAgICAgICBkZWYgc2VlayhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgc2VsZi5oaXRfZW9mID0gRmFsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nSU8uU3RyaW5nSU8uc2VlayhzZWxmLCAqYXJncykKKworICAgICAgICBkYXRhID0gYnoyLmNvbXByZXNzKHRhcmZpbGUuVGFySW5mbygiZm9vIikudG9idWYoKSkKKyAgICAgICAgZm9yIHggaW4gcmFuZ2UobGVuKGRhdGEpICsgMSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGFyZmlsZS5vcGVuKGZpbGVvYmo9TXlTdHJpbmdJTyhkYXRhWzp4XSksIG1vZGU9bW9kZSkKKyAgICAgICAgICAgIGV4Y2VwdCB0YXJmaWxlLlJlYWRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzICMgd2UgaGF2ZSBubyBpbnRlcmVzdCBpbiBSZWFkRXJyb3JzCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsX2lucHV0KHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X3BhcnRpYWxfaW5wdXQoInIiKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9pbnB1dF9iejIoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcGFydGlhbF9pbnB1dCgicjpiejIiKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBvcy5tYWtlZGlycyhURU1QRElSKQorCisgICAgdGVzdHMgPSBbCisgICAgICAgIFVzdGFyUmVhZFRlc3QsCisgICAgICAgIE1pc2NSZWFkVGVzdCwKKyAgICAgICAgU3RyZWFtUmVhZFRlc3QsCisgICAgICAgIERldGVjdFJlYWRUZXN0LAorICAgICAgICBNZW1iZXJSZWFkVGVzdCwKKyAgICAgICAgR05VUmVhZFRlc3QsCisgICAgICAgIFBheFJlYWRUZXN0LAorICAgICAgICBXcml0ZVRlc3QsCisgICAgICAgIFN0cmVhbVdyaXRlVGVzdCwKKyAgICAgICAgR05VV3JpdGVUZXN0LAorICAgICAgICBQYXhXcml0ZVRlc3QsCisgICAgICAgIFVzdGFyVW5pY29kZVRlc3QsCisgICAgICAgIEdOVVVuaWNvZGVUZXN0LAorICAgICAgICBQYXhVbmljb2RlVGVzdCwKKyAgICAgICAgQXBwZW5kVGVzdCwKKyAgICAgICAgTGltaXRzVGVzdCwKKyAgICAgICAgQ29udGV4dE1hbmFnZXJUZXN0LAorICAgIF0KKworICAgIGlmIGhhc2F0dHIob3MsICJsaW5rIik6CisgICAgICAgIHRlc3RzLmFwcGVuZChIYXJkbGlua1Rlc3QpCisgICAgZWxzZToKKyAgICAgICAgdGVzdHMuYXBwZW5kKExpbmtFbXVsYXRpb25UZXN0KQorCisgICAgZm9iaiA9IG9wZW4odGFybmFtZSwgInJiIikKKyAgICBkYXRhID0gZm9iai5yZWFkKCkKKyAgICBmb2JqLmNsb3NlKCkKKworICAgIGlmIGd6aXA6CisgICAgICAgICMgQ3JlYXRlIHRlc3R0YXIudGFyLmd6IGFuZCBhZGQgZ3ppcC1zcGVjaWZpYyB0ZXN0cy4KKyAgICAgICAgdGFyID0gZ3ppcC5vcGVuKGd6aXBuYW1lLCAid2IiKQorICAgICAgICB0YXIud3JpdGUoZGF0YSkKKyAgICAgICAgdGFyLmNsb3NlKCkKKworICAgICAgICB0ZXN0cyArPSBbCisgICAgICAgICAgICBHemlwTWlzY1JlYWRUZXN0LAorICAgICAgICAgICAgR3ppcFVzdGFyUmVhZFRlc3QsCisgICAgICAgICAgICBHemlwU3RyZWFtUmVhZFRlc3QsCisgICAgICAgICAgICBHemlwV3JpdGVUZXN0LAorICAgICAgICAgICAgR3ppcFN0cmVhbVdyaXRlVGVzdCwKKyAgICAgICAgXQorCisgICAgaWYgYnoyOgorICAgICAgICAjIENyZWF0ZSB0ZXN0dGFyLnRhci5iejIgYW5kIGFkZCBiejItc3BlY2lmaWMgdGVzdHMuCisgICAgICAgIHRhciA9IGJ6Mi5CWjJGaWxlKGJ6Mm5hbWUsICJ3YiIpCisgICAgICAgIHRhci53cml0ZShkYXRhKQorICAgICAgICB0YXIuY2xvc2UoKQorCisgICAgICAgIHRlc3RzICs9IFsKKyAgICAgICAgICAgIEJ6Mk1pc2NSZWFkVGVzdCwKKyAgICAgICAgICAgIEJ6MlVzdGFyUmVhZFRlc3QsCisgICAgICAgICAgICBCejJTdHJlYW1SZWFkVGVzdCwKKyAgICAgICAgICAgIEJ6MldyaXRlVGVzdCwKKyAgICAgICAgICAgIEJ6MlN0cmVhbVdyaXRlVGVzdCwKKyAgICAgICAgICAgIEJ6MlBhcnRpYWxSZWFkVGVzdCwKKyAgICAgICAgXQorCisgICAgdHJ5OgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURU1QRElSKToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVNUERJUikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGFyZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTE5YTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGFyZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGFyZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90YXJmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTE5YTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGFyZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGNsLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGNsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZTllNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90Y2wucHkKQEAgLTAsMCArMSwxOTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gc3VicHJvY2VzcyBpbXBvcnQgUG9wZW4sIFBJUEUKKworIyBTa2lwIHRoaXMgdGVzdCBpZiB0aGUgX3RraW50ZXIgbW9kdWxlIHdhc24ndCBidWlsdC4KK190a2ludGVyID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ190a2ludGVyJykKKworZnJvbSBUa2ludGVyIGltcG9ydCBUY2wKK2Zyb20gX3RraW50ZXIgaW1wb3J0IFRjbEVycm9yCisKKworY2xhc3MgVGtpbnRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RGbGF0dGVuTGVuKHNlbGYpOgorICAgICAgICAjIGZsYXR0ZW4oPG9iamVjdCB3aXRoIG5vIGxlbmd0aD4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgX3RraW50ZXIuX2ZsYXR0ZW4sIFRydWUpCisKKworY2xhc3MgVGNsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaW50ZXJwID0gVGNsKCkKKworICAgIGRlZiB0ZXN0RXZhbChzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgdGNsLmV2YWwoJ3NldCBhIDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdzZXQgYScpLCcxJykKKworICAgIGRlZiB0ZXN0RXZhbEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmV2YWwsJ3NldCBhJykKKworICAgIGRlZiB0ZXN0RXZhbEV4Y2VwdGlvbjIoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLHRjbC5ldmFsLCd0aGlzIGlzIHdyb25nJykKKworICAgIGRlZiB0ZXN0Q2FsbChzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgdGNsLmNhbGwoJ3NldCcsJ2EnLCcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuY2FsbCgnc2V0JywnYScpLCcxJykKKworICAgIGRlZiB0ZXN0Q2FsbEV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmNhbGwsJ3NldCcsJ2EnKQorCisgICAgZGVmIHRlc3RDYWxsRXhjZXB0aW9uMihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmNhbGwsJ3RoaXMnLCdpcycsJ3dyb25nJykKKworICAgIGRlZiB0ZXN0U2V0VmFyKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuc2V0dmFyKCdhJywnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ3NldCBhJyksJzEnKQorCisgICAgZGVmIHRlc3RTZXRWYXJBcnJheShzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgdGNsLnNldHZhcignYSgxKScsJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdzZXQgYSgxKScpLCcxJykKKworICAgIGRlZiB0ZXN0R2V0VmFyKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuZXZhbCgnc2V0IGEgMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmdldHZhcignYScpLCcxJykKKworICAgIGRlZiB0ZXN0R2V0VmFyQXJyYXkoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHRjbC5ldmFsKCdzZXQgYSgxKSAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZ2V0dmFyKCdhKDEpJyksJzEnKQorCisgICAgZGVmIHRlc3RHZXRWYXJFeGNlcHRpb24oc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRjbEVycm9yLHRjbC5nZXR2YXIsJ2EnKQorCisgICAgZGVmIHRlc3RHZXRWYXJBcnJheUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmdldHZhciwnYSgxKScpCisKKyAgICBkZWYgdGVzdFVuc2V0VmFyKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuc2V0dmFyKCdhJywxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdpbmZvIGV4aXN0cyBhJyksJzEnKQorICAgICAgICB0Y2wudW5zZXR2YXIoJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdpbmZvIGV4aXN0cyBhJyksJzAnKQorCisgICAgZGVmIHRlc3RVbnNldFZhckFycmF5KHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICB0Y2wuc2V0dmFyKCdhKDEpJywxKQorICAgICAgICB0Y2wuc2V0dmFyKCdhKDIpJywyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdpbmZvIGV4aXN0cyBhKDEpJyksJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdpbmZvIGV4aXN0cyBhKDIpJyksJzEnKQorICAgICAgICB0Y2wudW5zZXR2YXIoJ2EoMSknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdpbmZvIGV4aXN0cyBhKDEpJyksJzAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdpbmZvIGV4aXN0cyBhKDIpJyksJzEnKQorCisgICAgZGVmIHRlc3RVbnNldFZhckV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLnVuc2V0dmFyLCdhJykKKworICAgIGRlZiB0ZXN0RXZhbEZpbGUoc2VsZik6CisgICAgICAgIHRjbCA9IHNlbGYuaW50ZXJwCisgICAgICAgIGZpbGVuYW1lID0gInRlc3RFdmFsRmlsZS50Y2wiCisgICAgICAgIGZkID0gb3BlbihmaWxlbmFtZSwndycpCisgICAgICAgIHNjcmlwdCA9ICIiInNldCBhIDEKKyAgICAgICAgc2V0IGIgMgorICAgICAgICBzZXQgYyBbIGV4cHIgJGEgKyAkYiBdCisgICAgICAgICIiIgorICAgICAgICBmZC53cml0ZShzY3JpcHQpCisgICAgICAgIGZkLmNsb3NlKCkKKyAgICAgICAgdGNsLmV2YWxmaWxlKGZpbGVuYW1lKQorICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGNsLmV2YWwoJ3NldCBhJyksJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRjbC5ldmFsKCdzZXQgYicpLCcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Y2wuZXZhbCgnc2V0IGMnKSwnMycpCisKKyAgICBkZWYgdGVzdEV2YWxGaWxlRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICB0Y2wgPSBzZWxmLmludGVycAorICAgICAgICBmaWxlbmFtZSA9ICJkb2Vzbm90ZXhpc3RzIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoZmlsZW5hbWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sZToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmV2YWxmaWxlLGZpbGVuYW1lKQorCisgICAgZGVmIHRlc3RQYWNrYWdlUmVxdWlyZUV4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgdGNsID0gc2VsZi5pbnRlcnAKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGNsRXJyb3IsdGNsLmV2YWwsJ3BhY2thZ2UgcmVxdWlyZSBETkUnKQorCisgICAgZGVmIHRlc3RMb2FkV2l0aFVOQyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ3dpbjMyJzoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgQnVpbGQgYSBVTkMgcGF0aCBmcm9tIHRoZSByZWd1bGFyIHBhdGguCisgICAgICAgICMgU29tZXRoaW5nIGxpa2UKKyAgICAgICAgIyAgIFxcJUNPTVBVVEVSTkFNRSVcYyRccHl0aG9uMjdccHl0aG9uLmV4ZQorCisgICAgICAgIGZ1bGxuYW1lID0gb3MucGF0aC5hYnNwYXRoKHN5cy5leGVjdXRhYmxlKQorICAgICAgICBpZiBmdWxsbmFtZVsxXSAhPSAnOic6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdW5jX25hbWUgPSByJ1xcJXNcJXMkXCVzJyAlIChvcy5lbnZpcm9uWydDT01QVVRFUk5BTUUnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbG5hbWVbMzpdKQorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CisgICAgICAgICAgICBlbnYudW5zZXQoIlRDTF9MSUJSQVJZIikKKyAgICAgICAgICAgIGNtZCA9ICclcyAtYyAiaW1wb3J0IFRraW50ZXI7IHByaW50IFRraW50ZXIiJyAlICh1bmNfbmFtZSwpCisKKyAgICAgICAgICAgIHAgPSBQb3BlbihjbWQsIHN0ZG91dD1QSVBFLCBzdGRlcnI9UElQRSkKKyAgICAgICAgICAgIG91dF9kYXRhLCBlcnJfZGF0YSA9IHAuY29tbXVuaWNhdGUoKQorCisgICAgICAgICAgICBtc2cgPSAnXG5cbicuam9pbihbJyJUa2ludGVyLnB5IiBub3QgaW4gb3V0cHV0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ29tbWFuZDonLCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3N0ZG91dDonLCBvdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3RkZXJyOicsIGVycl9kYXRhXSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignVGtpbnRlci5weScsIG91dF9kYXRhLCBtc2cpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIDAsICdOb24temVybyBleGl0IGNvZGUnKQorCisKKyAgICBkZWYgdGVzdF9wYXNzaW5nX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZGVmIHBhc3NWYWx1ZSh2YWx1ZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pbnRlcnAuY2FsbCgnc2V0JywgJ18nLCB2YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoVHJ1ZSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKEZhbHNlKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKCdzdHJpbmcnKSwgJ3N0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKCdzdHJpbmdcdTIwYWMnKSwgJ3N0cmluZ1x1MjBhYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc1ZhbHVlKHUnc3RyaW5nJyksIHUnc3RyaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUodSdzdHJpbmdcdTIwYWMnKSwgdSdzdHJpbmdcdTIwYWMnKQorICAgICAgICBmb3IgaSBpbiAoMCwgMSwgLTEsIGludCgyKiozMS0xKSwgaW50KC0yKiozMSkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoaSksIGkpCisgICAgICAgIGZvciBmIGluICgwLjAsIDEuMCwgLTEuMCwgMS8vMywgMS8zLjAsCisgICAgICAgICAgICAgICAgICBzeXMuZmxvYXRfaW5mby5taW4sIHN5cy5mbG9hdF9pbmZvLm1heCwKKyAgICAgICAgICAgICAgICAgIC1zeXMuZmxvYXRfaW5mby5taW4sIC1zeXMuZmxvYXRfaW5mby5tYXgpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoZiksIGYpCisgICAgICAgIGZvciBmIGluIGZsb2F0KCduYW4nKSwgZmxvYXQoJ2luZicpLCAtZmxvYXQoJ2luZicpOgorICAgICAgICAgICAgaWYgZiAhPSBmOiAjIE5hTgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocGFzc1ZhbHVlKGYpLCBmKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3NWYWx1ZShmKSwgZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzVmFsdWUoKDEsICcyJywgKDMuNCwpKSksICgxLCAnMicsICgzLjQsKSkpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGNsVGVzdCwgVGtpbnRlclRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RjbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90Y2wucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZWRkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90Y2wucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RjbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90Y2wucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiZWRkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90Y2wucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmRiNDllCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVsbmV0bGliLnB5CkBAIC0wLDAgKzEsNDU0IEBACitpbXBvcnQgc29ja2V0CitpbXBvcnQgdGVsbmV0bGliCitpbXBvcnQgdGltZQoraW1wb3J0IFF1ZXVlCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB1bml0dGVzdCBpbXBvcnQgVGVzdENhc2UKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Cit0aHJlYWRpbmcgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKKworSE9TVCA9IHRlc3Rfc3VwcG9ydC5IT1NUCitFT0Zfc2lnaWwgPSBvYmplY3QoKQorCitkZWYgc2VydmVyKGV2dCwgc2VydiwgZGF0YXE9Tm9uZSk6CisgICAgIiIiIE9wZW4gYSB0Y3Agc2VydmVyIGluIHRocmVlIHN0ZXBzCisgICAgICAgIDEpIHNldCBldnQgdG8gdHJ1ZSB0byBsZXQgdGhlIHBhcmVudCBrbm93IHdlIGFyZSByZWFkeQorICAgICAgICAyKSBbb3B0aW9uYWxdIGlmIGlzIG5vdCBGYWxzZSwgd3JpdGUgdGhlIGxpc3Qgb2YgZGF0YSBmcm9tIGRhdGFxLmdldCgpCisgICAgICAgICAgIHRvIHRoZSBzb2NrZXQuCisgICAgIiIiCisgICAgc2Vydi5saXN0ZW4oNSkKKyAgICBldnQuc2V0KCkKKyAgICB0cnk6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZXJ2LmFjY2VwdCgpCisgICAgICAgIGlmIGRhdGFxOgorICAgICAgICAgICAgZGF0YSA9ICcnCisgICAgICAgICAgICBuZXdfZGF0YSA9IGRhdGFxLmdldChUcnVlLCAwLjUpCisgICAgICAgICAgICBkYXRhcS50YXNrX2RvbmUoKQorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gbmV3X2RhdGE6CisgICAgICAgICAgICAgICAgaWYgaXRlbSA9PSBFT0Zfc2lnaWw6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgdHlwZShpdGVtKSBpbiBbaW50LCBmbG9hdF06CisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoaXRlbSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBkYXRhICs9IGl0ZW0KKyAgICAgICAgICAgICAgICB3cml0dGVuID0gY29ubi5zZW5kKGRhdGEpCisgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGFbd3JpdHRlbjpdCisgICAgICAgIGNvbm4uY2xvc2UoKQorICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIHNlcnYuY2xvc2UoKQorCitjbGFzcyBHZW5lcmFsVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoNjApICAjIFNhZmV0eSBuZXQuIExvb2sgaXNzdWUgMTE4MTIKKyAgICAgICAgc2VsZi5wb3J0ID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzZWxmLnNvY2spCisgICAgICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLCBhcmdzPShzZWxmLmV2dCxzZWxmLnNvY2spKQorICAgICAgICBzZWxmLnRocmVhZC5zZXREYWVtb24oVHJ1ZSkKKyAgICAgICAgc2VsZi50aHJlYWQuc3RhcnQoKQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi50aHJlYWQuam9pbigpCisKKyAgICBkZWYgdGVzdEJhc2ljKHNlbGYpOgorICAgICAgICAjIGNvbm5lY3RzCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICB0ZWxuZXQuc29jay5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXREZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlbG5ldC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dE5vbmUoc2VsZik6CisgICAgICAgICMgTm9uZSwgaGF2aW5nIG90aGVyIGRlZmF1bHQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQsIHRpbWVvdXQ9Tm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVsbmV0LnNvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0VGltZW91dFZhbHVlKHNlbGYpOgorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCwgdGltZW91dD0zMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZWxuZXQuc29jay5nZXR0aW1lb3V0KCksIDMwKQorICAgICAgICB0ZWxuZXQuc29jay5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFRpbWVvdXRPcGVuKHNlbGYpOgorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KCkKKyAgICAgICAgdGVsbmV0Lm9wZW4oSE9TVCwgc2VsZi5wb3J0LCB0aW1lb3V0PTMwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlbG5ldC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisgICAgICAgIHRlbG5ldC5zb2NrLmNsb3NlKCkKKworZGVmIF9yZWFkX3NldFVwKHNlbGYpOgorICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICBzZWxmLmRhdGFxID0gUXVldWUuUXVldWUoKQorICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICBzZWxmLnNvY2suc2V0dGltZW91dCgxMCkKKyAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICBzZWxmLnRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXNlcnZlciwgYXJncz0oc2VsZi5ldnQsc2VsZi5zb2NrLCBzZWxmLmRhdGFxKSkKKyAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgc2VsZi5ldnQud2FpdCgpCisKK2RlZiBfcmVhZF90ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLnRocmVhZC5qb2luKCkKKworY2xhc3MgUmVhZFRlc3RzKFRlc3RDYXNlKToKKyAgICBzZXRVcCA9IF9yZWFkX3NldFVwCisgICAgdGVhckRvd24gPSBfcmVhZF90ZWFyRG93bgorCisgICAgIyB1c2UgYSBzaW1pbGFyIGFwcHJvYWNoIHRvIHRlc3RpbmcgdGltZW91dHMgYXMgdGVzdF90aW1lb3V0LnB5CisgICAgIyB0aGVzZSB3aWxsIG5ldmVyIHBhc3MgMTAwJSBidXQgbWFrZSB0aGUgZnV6eiBiaWcgZW5vdWdoIHRoYXQgaXQgaXMgcmFyZQorICAgIGJsb2NrX2xvbmcgPSAwLjYKKyAgICBibG9ja19zaG9ydCA9IDAuMworICAgIGRlZiB0ZXN0X3JlYWRfdW50aWxfQShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIHJlYWRfdW50aWwoZXhwZWN0ZWQsIFt0aW1lb3V0XSkKKyAgICAgICAgICBSZWFkIHVudGlsIHRoZSBleHBlY3RlZCBzdHJpbmcgaGFzIGJlZW4gc2Vlbiwgb3IgYSB0aW1lb3V0IGlzCisgICAgICAgICAgaGl0IChkZWZhdWx0IGlzIG5vIHRpbWVvdXQpOyBtYXkgYmxvY2suCisgICAgICAgICIiIgorICAgICAgICB3YW50ID0gWyd4JyAqIDEwLCAnbWF0Y2gnLCAneScgKiAxMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgZGF0YSA9IHRlbG5ldC5yZWFkX3VudGlsKCdtYXRjaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbih3YW50WzotMl0pKQorCisgICAgZGVmIHRlc3RfcmVhZF91bnRpbF9CKHNlbGYpOgorICAgICAgICAjIHRlc3QgdGhlIHRpbWVvdXQgLSBpdCBkb2VzIE5PVCByYWlzZSBzb2NrZXQudGltZW91dAorICAgICAgICB3YW50ID0gWydoZWxsbycsIHNlbGYuYmxvY2tfbG9uZywgJ25vdCBzZWVuJywgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgZGF0YSA9IHRlbG5ldC5yZWFkX3VudGlsKCdub3Qgc2VlbicsIHNlbGYuYmxvY2tfc2hvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgd2FudFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZWxuZXQucmVhZF9hbGwoKSwgJ25vdCBzZWVuJykKKworICAgIGRlZiB0ZXN0X3JlYWRfdW50aWxfd2l0aF9wb2xsKHNlbGYpOgorICAgICAgICAiIiJVc2Ugc2VsZWN0LnBvbGwoKSB0byBpbXBsZW1lbnQgdGVsbmV0LnJlYWRfdW50aWwoKS4iIiIKKyAgICAgICAgd2FudCA9IFsneCcgKiAxMCwgJ21hdGNoJywgJ3knICogMTAsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIGlmIG5vdCB0ZWxuZXQuX2hhc19wb2xsOgorICAgICAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoJ3NlbGVjdC5wb2xsKCkgaXMgcmVxdWlyZWQnKQorICAgICAgICB0ZWxuZXQuX2hhc19wb2xsID0gVHJ1ZQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBkYXRhID0gdGVsbmV0LnJlYWRfdW50aWwoJ21hdGNoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKHdhbnRbOi0yXSkpCisKKyAgICBkZWYgdGVzdF9yZWFkX3VudGlsX3dpdGhfc2VsZWN0KHNlbGYpOgorICAgICAgICAiIiJVc2Ugc2VsZWN0LnNlbGVjdCgpIHRvIGltcGxlbWVudCB0ZWxuZXQucmVhZF91bnRpbCgpLiIiIgorICAgICAgICB3YW50ID0gWyd4JyAqIDEwLCAnbWF0Y2gnLCAneScgKiAxMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgdGVsbmV0Ll9oYXNfcG9sbCA9IEZhbHNlCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIGRhdGEgPSB0ZWxuZXQucmVhZF91bnRpbCgnbWF0Y2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4od2FudFs6LTJdKSkKKworICAgIGRlZiB0ZXN0X3JlYWRfYWxsX0Eoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICByZWFkX2FsbCgpCisgICAgICAgICAgUmVhZCBhbGwgZGF0YSB1bnRpbCBFT0Y7IG1heSBibG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogNTAwLCAneScgKiA1MDAsICd6JyAqIDUwMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgZGF0YSA9IHRlbG5ldC5yZWFkX2FsbCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbih3YW50WzotMV0pKQorICAgICAgICByZXR1cm4KKworICAgIGRlZiBfdGVzdF9ibG9ja2luZyhzZWxmLCBmdW5jKToKKyAgICAgICAgc2VsZi5kYXRhcS5wdXQoW3NlbGYuYmxvY2tfbG9uZywgRU9GX3NpZ2lsXSkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgc3RhcnQgPSB0aW1lLnRpbWUoKQorICAgICAgICBkYXRhID0gZnVuYygpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmJsb2NrX3Nob3J0IDw9IHRpbWUudGltZSgpIC0gc3RhcnQpCisKKyAgICBkZWYgdGVzdF9yZWFkX2FsbF9CKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Jsb2NraW5nKHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KS5yZWFkX2FsbCkKKworICAgIGRlZiB0ZXN0X3JlYWRfYWxsX0Moc2VsZik6CisgICAgICAgIHNlbGYuZGF0YXEucHV0KFtFT0Zfc2lnaWxdKQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgdGVsbmV0LnJlYWRfYWxsKCkKKyAgICAgICAgdGVsbmV0LnJlYWRfYWxsKCkgIyBzaG91bGRuJ3QgcmFpc2UKKworICAgIGRlZiB0ZXN0X3JlYWRfc29tZV9BKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgcmVhZF9zb21lKCkKKyAgICAgICAgICBSZWFkIGF0IGxlYXN0IG9uZSBieXRlIG9yIEVPRjsgbWF5IGJsb2NrLgorICAgICAgICAiIiIKKyAgICAgICAgIyB0ZXN0ICdhdCBsZWFzdCBvbmUgYnl0ZScKKyAgICAgICAgd2FudCA9IFsneCcgKiA1MDAsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIGRhdGEgPSB0ZWxuZXQucmVhZF9hbGwoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRhdGEpID49IDEpCisKKyAgICBkZWYgdGVzdF9yZWFkX3NvbWVfQihzZWxmKToKKyAgICAgICAgIyB0ZXN0IEVPRgorICAgICAgICBzZWxmLmRhdGFxLnB1dChbRU9GX3NpZ2lsXSkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHRlbG5ldC5yZWFkX3NvbWUoKSkKKworICAgIGRlZiB0ZXN0X3JlYWRfc29tZV9DKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2Jsb2NraW5nKHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KS5yZWFkX3NvbWUpCisKKyAgICBkZWYgX3Rlc3RfcmVhZF9hbnlfZWFnZXJfQShzZWxmLCBmdW5jX25hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgcmVhZF92ZXJ5X2VhZ2VyKCkKKyAgICAgICAgICBSZWFkIGFsbCBkYXRhIGF2YWlsYWJsZSBhbHJlYWR5IHF1ZXVlZCBvciBvbiB0aGUgc29ja2V0LAorICAgICAgICAgIHdpdGhvdXQgYmxvY2tpbmcuCisgICAgICAgICIiIgorICAgICAgICB3YW50ID0gW3NlbGYuYmxvY2tfbG9uZywgJ3gnICogMTAwLCAneScgKiAxMDAsIEVPRl9zaWdpbF0KKyAgICAgICAgZXhwZWN0cyA9IHdhbnRbMV0gKyB3YW50WzJdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBmdW5jID0gZ2V0YXR0cih0ZWxuZXQsIGZ1bmNfbmFtZSkKKyAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSArPSBmdW5jKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0cy5zdGFydHN3aXRoKGRhdGEpKQorICAgICAgICAgICAgZXhjZXB0IEVPRkVycm9yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0cywgZGF0YSkKKworICAgIGRlZiBfdGVzdF9yZWFkX2FueV9lYWdlcl9CKHNlbGYsIGZ1bmNfbmFtZSk6CisgICAgICAgICMgdGVzdCBFT0YKKyAgICAgICAgc2VsZi5kYXRhcS5wdXQoW0VPRl9zaWdpbF0pCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICB0aW1lLnNsZWVwKHNlbGYuYmxvY2tfc2hvcnQpCisgICAgICAgIGZ1bmMgPSBnZXRhdHRyKHRlbG5ldCwgZnVuY19uYW1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgZnVuYykKKworICAgICMgcmVhZF9lYWdlciBhbmQgcmVhZF92ZXJ5X2VhZ2VyIG1ha2UgdGhlIHNhbWUgZ2F1cmFudGVlcworICAgICMgKHRoZXkgYmVoYXZlIGRpZmZlcmVudGx5IGJ1dCB3ZSBvbmx5IHRlc3QgdGhlIGdhdXJhbnRlZXMpCisgICAgZGVmIHRlc3RfcmVhZF92ZXJ5X2VhZ2VyX0Eoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZF9hbnlfZWFnZXJfQSgncmVhZF92ZXJ5X2VhZ2VyJykKKyAgICBkZWYgdGVzdF9yZWFkX3ZlcnlfZWFnZXJfQihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkX2FueV9lYWdlcl9CKCdyZWFkX3ZlcnlfZWFnZXInKQorICAgIGRlZiB0ZXN0X3JlYWRfZWFnZXJfQShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkX2FueV9lYWdlcl9BKCdyZWFkX2VhZ2VyJykKKyAgICBkZWYgdGVzdF9yZWFkX2VhZ2VyX0Ioc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZF9hbnlfZWFnZXJfQigncmVhZF9lYWdlcicpCisgICAgIyBOQiAtLSB3ZSBuZWVkIHRvIHRlc3QgdGhlIElBQyBibG9jayB3aGljaCBpcyBtZW50aW9uZWQgaW4gdGhlIGRvY3N0cmluZworICAgICMgYnV0IG5vdCBpbiB0aGUgbW9kdWxlIGRvY3MKKworICAgIGRlZiBfdGVzdF9yZWFkX2FueV9sYXp5X0Ioc2VsZiwgZnVuY19uYW1lKToKKyAgICAgICAgc2VsZi5kYXRhcS5wdXQoW0VPRl9zaWdpbF0pCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBmdW5jID0gZ2V0YXR0cih0ZWxuZXQsIGZ1bmNfbmFtZSkKKyAgICAgICAgdGVsbmV0LmZpbGxfcmF3cSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEVPRkVycm9yLCBmdW5jKQorCisgICAgZGVmIHRlc3RfcmVhZF9sYXp5X0Eoc2VsZik6CisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICB0aW1lLnNsZWVwKHNlbGYuYmxvY2tfc2hvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHRlbG5ldC5yZWFkX2xhenkoKSkKKyAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVhZF9kYXRhID0gdGVsbmV0LnJlYWRfbGF6eSgpCisgICAgICAgICAgICAgICAgZGF0YSArPSByZWFkX2RhdGEKKyAgICAgICAgICAgICAgICBpZiBub3QgcmVhZF9kYXRhOgorICAgICAgICAgICAgICAgICAgICB0ZWxuZXQuZmlsbF9yYXdxKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFT0ZFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdhbnRbMF0uc3RhcnRzd2l0aChkYXRhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB3YW50WzBdKQorCisgICAgZGVmIHRlc3RfcmVhZF9sYXp5X0Ioc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RfcmVhZF9hbnlfbGF6eV9CKCdyZWFkX2xhenknKQorCisgICAgZGVmIHRlc3RfcmVhZF92ZXJ5X2xhenlfQShzZWxmKToKKyAgICAgICAgd2FudCA9IFsneCcgKiAxMDAsIEVPRl9zaWdpbF0KKyAgICAgICAgc2VsZi5kYXRhcS5wdXQod2FudCkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIHRpbWUuc2xlZXAoc2VsZi5ibG9ja19zaG9ydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgdGVsbmV0LnJlYWRfdmVyeV9sYXp5KCkpCisgICAgICAgIGRhdGEgPSAnJworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlYWRfZGF0YSA9IHRlbG5ldC5yZWFkX3ZlcnlfbGF6eSgpCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGRhdGEgKz0gcmVhZF9kYXRhCisgICAgICAgICAgICBpZiBub3QgcmVhZF9kYXRhOgorICAgICAgICAgICAgICAgIHRlbG5ldC5maWxsX3Jhd3EoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHRlbG5ldC5jb29rZWRxKQorICAgICAgICAgICAgICAgIHRlbG5ldC5wcm9jZXNzX3Jhd3EoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdhbnRbMF0uc3RhcnRzd2l0aChkYXRhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB3YW50WzBdKQorCisgICAgZGVmIHRlc3RfcmVhZF92ZXJ5X2xhenlfQihzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9yZWFkX2FueV9sYXp5X0IoJ3JlYWRfdmVyeV9sYXp5JykKKworY2xhc3MgbmVnb19jb2xsZWN0b3Iob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2JfZ2V0dGVyPU5vbmUpOgorICAgICAgICBzZWxmLnNlZW4gPSAnJworICAgICAgICBzZWxmLnNiX2dldHRlciA9IHNiX2dldHRlcgorICAgICAgICBzZWxmLnNiX3NlZW4gPSAnJworCisgICAgZGVmIGRvX25lZ28oc2VsZiwgc29jaywgY21kLCBvcHQpOgorICAgICAgICBzZWxmLnNlZW4gKz0gY21kICsgb3B0CisgICAgICAgIGlmIGNtZCA9PSB0bC5TRSBhbmQgc2VsZi5zYl9nZXR0ZXI6CisgICAgICAgICAgICBzYl9kYXRhID0gc2VsZi5zYl9nZXR0ZXIoKQorICAgICAgICAgICAgc2VsZi5zYl9zZWVuICs9IHNiX2RhdGEKKwordGwgPSB0ZWxuZXRsaWIKK2NsYXNzIE9wdGlvblRlc3RzKFRlc3RDYXNlKToKKyAgICBzZXRVcCA9IF9yZWFkX3NldFVwCisgICAgdGVhckRvd24gPSBfcmVhZF90ZWFyRG93bgorICAgICMgUkZDIDg1NCBjb21tYW5kcworICAgIGNtZHMgPSBbdGwuQU8sIHRsLkFZVCwgdGwuQlJLLCB0bC5FQywgdGwuRUwsIHRsLkdBLCB0bC5JUCwgdGwuTk9QXQorCisgICAgZGVmIF90ZXN0X2NvbW1hbmQoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIiBoZWxwZXIgZm9yIHRlc3RpbmcgSUFDICsgY21kICIiIgorICAgICAgICBzZWxmLnNldFVwKCkKKyAgICAgICAgc2VsZi5kYXRhcS5wdXQoZGF0YSkKKyAgICAgICAgdGVsbmV0ID0gdGVsbmV0bGliLlRlbG5ldChIT1NULCBzZWxmLnBvcnQpCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIG5lZ28gPSBuZWdvX2NvbGxlY3RvcigpCisgICAgICAgIHRlbG5ldC5zZXRfb3B0aW9uX25lZ290aWF0aW9uX2NhbGxiYWNrKG5lZ28uZG9fbmVnbykKKyAgICAgICAgdHh0ID0gdGVsbmV0LnJlYWRfYWxsKCkKKyAgICAgICAgY21kID0gbmVnby5zZWVuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oY21kKSA+IDApICMgd2UgZXhwZWN0IGF0IGxlYXN0IG9uZSBjb21tYW5kCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oY21kWzBdLCBzZWxmLmNtZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kWzFdLCB0bC5OT09QVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oJycuam9pbihkYXRhWzotMV0pKSwgbGVuKHR4dCArIGNtZCkpCisgICAgICAgIG5lZ28uc2JfZ2V0dGVyID0gTm9uZSAjIGJyZWFrIHRoZSBuZWdvID0+IHRlbG5ldCBjeWNsZQorICAgICAgICBzZWxmLnRlYXJEb3duKCkKKworICAgIGRlZiB0ZXN0X0lBQ19jb21tYW5kcyhzZWxmKToKKyAgICAgICAgIyByZXNldCBvdXIgc2V0dXAKKyAgICAgICAgc2VsZi5kYXRhcS5wdXQoW0VPRl9zaWdpbF0pCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBzZWxmLnRlYXJEb3duKCkKKworICAgICAgICBmb3IgY21kIGluIHNlbGYuY21kczoKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tbWFuZChbJ3gnICogMTAwLCB0bC5JQUMgKyBjbWQsICd5JyoxMDAsIEVPRl9zaWdpbF0pCisgICAgICAgICAgICBzZWxmLl90ZXN0X2NvbW1hbmQoWyd4JyAqIDEwLCB0bC5JQUMgKyBjbWQsICd5JyoxMCwgRU9GX3NpZ2lsXSkKKyAgICAgICAgICAgIHNlbGYuX3Rlc3RfY29tbWFuZChbdGwuSUFDICsgY21kLCBFT0Zfc2lnaWxdKQorICAgICAgICAjIGFsbCBhdCBvbmNlCisgICAgICAgIHNlbGYuX3Rlc3RfY29tbWFuZChbdGwuSUFDICsgY21kIGZvciAoY21kKSBpbiBzZWxmLmNtZHNdICsgW0VPRl9zaWdpbF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHRlbG5ldC5yZWFkX3NiX2RhdGEoKSkKKworICAgIGRlZiB0ZXN0X1NCX2NvbW1hbmRzKHNlbGYpOgorICAgICAgICAjIFJGQyA4NTUsIHN1Ym5lZ290aWF0aW9ucyBwb3J0aW9uCisgICAgICAgIHNlbmQgPSBbdGwuSUFDICsgdGwuU0IgKyB0bC5JQUMgKyB0bC5TRSwKKyAgICAgICAgICAgICAgICB0bC5JQUMgKyB0bC5TQiArIHRsLklBQyArIHRsLklBQyArIHRsLklBQyArIHRsLlNFLAorICAgICAgICAgICAgICAgIHRsLklBQyArIHRsLlNCICsgdGwuSUFDICsgdGwuSUFDICsgJ2FhJyArIHRsLklBQyArIHRsLlNFLAorICAgICAgICAgICAgICAgIHRsLklBQyArIHRsLlNCICsgJ2JiJyArIHRsLklBQyArIHRsLklBQyArIHRsLklBQyArIHRsLlNFLAorICAgICAgICAgICAgICAgIHRsLklBQyArIHRsLlNCICsgJ2NjJyArIHRsLklBQyArIHRsLklBQyArICdkZCcgKyB0bC5JQUMgKyB0bC5TRSwKKyAgICAgICAgICAgICAgICBFT0Zfc2lnaWwsCisgICAgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHNlbmQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICBuZWdvID0gbmVnb19jb2xsZWN0b3IodGVsbmV0LnJlYWRfc2JfZGF0YSkKKyAgICAgICAgdGVsbmV0LnNldF9vcHRpb25fbmVnb3RpYXRpb25fY2FsbGJhY2sobmVnby5kb19uZWdvKQorICAgICAgICB0eHQgPSB0ZWxuZXQucmVhZF9hbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR4dCwgJycpCisgICAgICAgIHdhbnRfc2JfZGF0YSA9IHRsLklBQyArIHRsLklBQyArICdhYWJiJyArIHRsLklBQyArICdjYycgKyB0bC5JQUMgKyAnZGQnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmVnby5zYl9zZWVuLCB3YW50X3NiX2RhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHRlbG5ldC5yZWFkX3NiX2RhdGEoKSkKKyAgICAgICAgbmVnby5zYl9nZXR0ZXIgPSBOb25lICMgYnJlYWsgdGhlIG5lZ28gPT4gdGVsbmV0IGN5Y2xlCisKKworY2xhc3MgRXhwZWN0VGVzdHMoVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBzZWxmLmRhdGFxID0gUXVldWUuUXVldWUoKQorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEwKQorICAgICAgICBzZWxmLnBvcnQgPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaykKKyAgICAgICAgc2VsZi50aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZXJ2ZXIsIGFyZ3M9KHNlbGYuZXZ0LHNlbGYuc29jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YXEpKQorICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnRocmVhZC5qb2luKCkKKworICAgICMgdXNlIGEgc2ltaWxhciBhcHByb2FjaCB0byB0ZXN0aW5nIHRpbWVvdXRzIGFzIHRlc3RfdGltZW91dC5weQorICAgICMgdGhlc2Ugd2lsbCBuZXZlciBwYXNzIDEwMCUgYnV0IG1ha2UgdGhlIGZ1enogYmlnIGVub3VnaCB0aGF0IGl0IGlzIHJhcmUKKyAgICBibG9ja19sb25nID0gMC42CisgICAgYmxvY2tfc2hvcnQgPSAwLjMKKyAgICBkZWYgdGVzdF9leHBlY3RfQShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIGV4cGVjdChleHBlY3RlZCwgW3RpbWVvdXRdKQorICAgICAgICAgIFJlYWQgdW50aWwgdGhlIGV4cGVjdGVkIHN0cmluZyBoYXMgYmVlbiBzZWVuLCBvciBhIHRpbWVvdXQgaXMKKyAgICAgICAgICBoaXQgKGRlZmF1bHQgaXMgbm8gdGltZW91dCk7IG1heSBibG9jay4KKyAgICAgICAgIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICAoXyxfLGRhdGEpID0gdGVsbmV0LmV4cGVjdChbJ21hdGNoJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbih3YW50WzotMl0pKQorCisgICAgZGVmIHRlc3RfZXhwZWN0X0Ioc2VsZik6CisgICAgICAgICMgdGVzdCB0aGUgdGltZW91dCAtIGl0IGRvZXMgTk9UIHJhaXNlIHNvY2tldC50aW1lb3V0CisgICAgICAgIHdhbnQgPSBbJ2hlbGxvJywgc2VsZi5ibG9ja19sb25nLCAnbm90IHNlZW4nLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBzZWxmLmRhdGFxLmpvaW4oKQorICAgICAgICAoXyxfLGRhdGEpID0gdGVsbmV0LmV4cGVjdChbJ25vdCBzZWVuJ10sIHNlbGYuYmxvY2tfc2hvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgd2FudFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZWxuZXQucmVhZF9hbGwoKSwgJ25vdCBzZWVuJykKKworICAgIGRlZiB0ZXN0X2V4cGVjdF93aXRoX3BvbGwoc2VsZik6CisgICAgICAgICIiIlVzZSBzZWxlY3QucG9sbCgpIHRvIGltcGxlbWVudCB0ZWxuZXQuZXhwZWN0KCkuIiIiCisgICAgICAgIHdhbnQgPSBbJ3gnICogMTAsICdtYXRjaCcsICd5JyAqIDEwLCBFT0Zfc2lnaWxdCisgICAgICAgIHNlbGYuZGF0YXEucHV0KHdhbnQpCisgICAgICAgIHRlbG5ldCA9IHRlbG5ldGxpYi5UZWxuZXQoSE9TVCwgc2VsZi5wb3J0KQorICAgICAgICBpZiBub3QgdGVsbmV0Ll9oYXNfcG9sbDoKKyAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdzZWxlY3QucG9sbCgpIGlzIHJlcXVpcmVkJykKKyAgICAgICAgdGVsbmV0Ll9oYXNfcG9sbCA9IFRydWUKKyAgICAgICAgc2VsZi5kYXRhcS5qb2luKCkKKyAgICAgICAgKF8sXyxkYXRhKSA9IHRlbG5ldC5leHBlY3QoWydtYXRjaCddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4od2FudFs6LTJdKSkKKworICAgIGRlZiB0ZXN0X2V4cGVjdF93aXRoX3NlbGVjdChzZWxmKToKKyAgICAgICAgIiIiVXNlIHNlbGVjdC5zZWxlY3QoKSB0byBpbXBsZW1lbnQgdGVsbmV0LmV4cGVjdCgpLiIiIgorICAgICAgICB3YW50ID0gWyd4JyAqIDEwLCAnbWF0Y2gnLCAneScgKiAxMCwgRU9GX3NpZ2lsXQorICAgICAgICBzZWxmLmRhdGFxLnB1dCh3YW50KQorICAgICAgICB0ZWxuZXQgPSB0ZWxuZXRsaWIuVGVsbmV0KEhPU1QsIHNlbGYucG9ydCkKKyAgICAgICAgdGVsbmV0Ll9oYXNfcG9sbCA9IEZhbHNlCisgICAgICAgIHNlbGYuZGF0YXEuam9pbigpCisgICAgICAgIChfLF8sZGF0YSkgPSB0ZWxuZXQuZXhwZWN0KFsnbWF0Y2gnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAnJy5qb2luKHdhbnRbOi0yXSkpCisKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoR2VuZXJhbFRlc3RzLCBSZWFkVGVzdHMsIE9wdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0VGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZWxuZXRsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjQyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZWxuZXRsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbG5ldGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZWxuZXRsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjQyYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZWxuZXRsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkMjNhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5CkBAIC0wLDAgKzEsOTY1IEBACisjIHRlbXBmaWxlLnB5IHVuaXQgdGVzdHMuCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBlcnJubworaW1wb3J0IGlvCitpbXBvcnQgb3MKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzaHV0aWwKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHdhcm5pbmdzCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQgYXMgc3VwcG9ydAorCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PVJ1bnRpbWVXYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZT0ibWt0ZW1wIiwgbW9kdWxlPV9fbmFtZV9fKQorCitpZiBoYXNhdHRyKG9zLCAnc3RhdCcpOgorICAgIGltcG9ydCBzdGF0CisgICAgaGFzX3N0YXQgPSAxCitlbHNlOgorICAgIGhhc19zdGF0ID0gMAorCitoYXNfdGV4dG1vZGUgPSAodGVtcGZpbGUuX3RleHRfb3BlbmZsYWdzICE9IHRlbXBmaWxlLl9iaW5fb3BlbmZsYWdzKQoraGFzX3NwYXdubCA9IGhhc2F0dHIob3MsICdzcGF3bmwnKQorCisjIFRFU1RfRklMRVMgbWF5IG5lZWQgdG8gYmUgdHdlYWtlZCBmb3Igc3lzdGVtcyBkZXBlbmRpbmcgb24gdGhlIG1heGltdW0KKyMgbnVtYmVyIG9mIGZpbGVzIHRoYXQgY2FuIGJlIG9wZW5lZCBhdCBvbmUgdGltZSAoc2VlIHVsaW1pdCAtbikKK2lmIHN5cy5wbGF0Zm9ybSBpbiAoJ29wZW5ic2QzJywgJ29wZW5ic2Q0Jyk6CisgICAgVEVTVF9GSUxFUyA9IDQ4CitlbHNlOgorICAgIFRFU1RfRklMRVMgPSAxMDAKKworIyBUaGlzIGlzIG9yZ2FuaXplZCBhcyBvbmUgdGVzdCBmb3IgZWFjaCBjaHVuayBvZiBjb2RlIGluIHRlbXBmaWxlLnB5LAorIyBpbiBvcmRlciBvZiB0aGVpciBhcHBlYXJhbmNlIGluIHRoZSBmaWxlLiAgVGVzdGluZyB3aGljaCByZXF1aXJlcworIyB0aHJlYWRzIGlzIG5vdCBkb25lIGhlcmUuCisKKyMgQ29tbW9uIGZ1bmN0aW9uYWxpdHkuCitjbGFzcyBUQyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBzdHJfY2hlY2sgPSByZS5jb21waWxlKHIiW2EtekEtWjAtOV8tXXs2fSQiKQorCisgICAgZGVmIGZhaWxPbkV4Y2VwdGlvbihzZWxmLCB3aGF0LCBlaT1Ob25lKToKKyAgICAgICAgaWYgZWkgaXMgTm9uZToKKyAgICAgICAgICAgIGVpID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgc2VsZi5mYWlsKCIlcyByYWlzZWQgJXM6ICVzIiAlICh3aGF0LCBlaVswXSwgZWlbMV0pKQorCisgICAgZGVmIG5hbWVDaGVjayhzZWxmLCBuYW1lLCBkaXIsIHByZSwgc3VmKToKKyAgICAgICAgKG5kaXIsIG5iYXNlKSA9IG9zLnBhdGguc3BsaXQobmFtZSkKKyAgICAgICAgbnByZSAgPSBuYmFzZVs6bGVuKHByZSldCisgICAgICAgIG5zdWYgID0gbmJhc2VbbGVuKG5iYXNlKS1sZW4oc3VmKTpdCisKKyAgICAgICAgIyBjaGVjayBmb3IgZXF1YWxpdHkgb2YgdGhlIGFic29sdXRlIHBhdGhzIQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYWJzcGF0aChuZGlyKSwgb3MucGF0aC5hYnNwYXRoKGRpciksCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJyVzJyBub3QgaW4gZGlyZWN0b3J5ICclcyciICUgKG5hbWUsIGRpcikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnByZSwgcHJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlICclcycgZG9lcyBub3QgYmVnaW4gd2l0aCAnJXMnIiAlIChuYmFzZSwgcHJlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuc3VmLCBzdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJyVzJyBkb2VzIG5vdCBlbmQgd2l0aCAnJXMnIiAlIChuYmFzZSwgc3VmKSkKKworICAgICAgICBuYmFzZSA9IG5iYXNlW2xlbihwcmUpOmxlbihuYmFzZSktbGVuKHN1ZildCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnN0cl9jaGVjay5tYXRjaChuYmFzZSksCisgICAgICAgICAgICAgICAgICAgICAicmFuZG9tIHN0cmluZyAnJXMnIGRvZXMgbm90IG1hdGNoIC9eW2EtekEtWjAtOV8tXXs2fSQvIgorICAgICAgICAgICAgICAgICAgICAgJSBuYmFzZSkKKwordGVzdF9jbGFzc2VzID0gW10KKworY2xhc3MgdGVzdF9leHBvcnRzKFRDKToKKyAgICBkZWYgdGVzdF9leHBvcnRzKHNlbGYpOgorICAgICAgICAjIFRoZXJlIGFyZSBubyBzdXJwcmlzaW5nIHN5bWJvbHMgaW4gdGhlIHRlbXBmaWxlIG1vZHVsZQorICAgICAgICBkaWN0ID0gdGVtcGZpbGUuX19kaWN0X18KKworICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgICJOYW1lZFRlbXBvcmFyeUZpbGUiIDogMSwKKyAgICAgICAgICAgICJUZW1wb3JhcnlGaWxlIiA6IDEsCisgICAgICAgICAgICAibWtzdGVtcCIgOiAxLAorICAgICAgICAgICAgIm1rZHRlbXAiIDogMSwKKyAgICAgICAgICAgICJta3RlbXAiIDogMSwKKyAgICAgICAgICAgICJUTVBfTUFYIiA6IDEsCisgICAgICAgICAgICAiZ2V0dGVtcHByZWZpeCIgOiAxLAorICAgICAgICAgICAgImdldHRlbXBkaXIiIDogMSwKKyAgICAgICAgICAgICJ0ZW1wZGlyIiA6IDEsCisgICAgICAgICAgICAidGVtcGxhdGUiIDogMSwKKyAgICAgICAgICAgICJTcG9vbGVkVGVtcG9yYXJ5RmlsZSIgOiAxCisgICAgICAgIH0KKworICAgICAgICB1bmV4cCA9IFtdCisgICAgICAgIGZvciBrZXkgaW4gZGljdDoKKyAgICAgICAgICAgIGlmIGtleVswXSAhPSAnXycgYW5kIGtleSBub3QgaW4gZXhwZWN0ZWQ6CisgICAgICAgICAgICAgICAgdW5leHAuYXBwZW5kKGtleSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih1bmV4cCkgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGtleXM6ICVzIiAlIHVuZXhwKQorCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfZXhwb3J0cykKKworCitjbGFzcyB0ZXN0X19SYW5kb21OYW1lU2VxdWVuY2UoVEMpOgorICAgICIiIlRlc3QgdGhlIGludGVybmFsIGl0ZXJhdG9yIG9iamVjdCBfUmFuZG9tTmFtZVNlcXVlbmNlLiIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnIgPSB0ZW1wZmlsZS5fUmFuZG9tTmFtZVNlcXVlbmNlKCkKKworICAgIGRlZiB0ZXN0X2dldF9zaXhfY2hhcl9zdHIoc2VsZik6CisgICAgICAgICMgX1JhbmRvbU5hbWVTZXF1ZW5jZSByZXR1cm5zIGEgc2l4LWNoYXJhY3RlciBzdHJpbmcKKyAgICAgICAgcyA9IHNlbGYuci5uZXh0KCkKKyAgICAgICAgc2VsZi5uYW1lQ2hlY2socywgJycsICcnLCAnJykKKworICAgIGRlZiB0ZXN0X21hbnkoc2VsZik6CisgICAgICAgICMgX1JhbmRvbU5hbWVTZXF1ZW5jZSByZXR1cm5zIG5vIGR1cGxpY2F0ZSBzdHJpbmdzIChzdG9jaGFzdGljKQorCisgICAgICAgIGRpY3QgPSB7fQorICAgICAgICByID0gc2VsZi5yCisgICAgICAgIGZvciBpIGluIHhyYW5nZShURVNUX0ZJTEVTKToKKyAgICAgICAgICAgIHMgPSByLm5leHQoKQorICAgICAgICAgICAgc2VsZi5uYW1lQ2hlY2socywgJycsICcnLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ocywgZGljdCkKKyAgICAgICAgICAgIGRpY3Rbc10gPSAxCisKKyAgICBkZWYgdGVzdF9zdXBwb3J0c19pdGVyKHNlbGYpOgorICAgICAgICAjIF9SYW5kb21OYW1lU2VxdWVuY2Ugc3VwcG9ydHMgdGhlIGl0ZXJhdG9yIHByb3RvY29sCisKKyAgICAgICAgaSA9IDAKKyAgICAgICAgciA9IHNlbGYucgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgcyBpbiByOgorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIGlmIGkgPT0gMjA6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJpdGVyYXRpb24iKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwKKyAgICAgICAgIm9zLmZvcmsgaXMgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdCIpCisgICAgZGVmIHRlc3RfcHJvY2Vzc19hd2FyZW5lc3Moc2VsZik6CisgICAgICAgICMgZW5zdXJlIHRoYXQgdGhlIHJhbmRvbSBzb3VyY2UgZGlmZmVycyBiZXR3ZWVuCisgICAgICAgICMgY2hpbGQgYW5kIHBhcmVudC4KKyAgICAgICAgcmVhZF9mZCwgd3JpdGVfZmQgPSBvcy5waXBlKCkKKyAgICAgICAgcGlkID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIG5vdCBwaWQ6CisgICAgICAgICAgICAgICAgb3MuY2xvc2UocmVhZF9mZCkKKyAgICAgICAgICAgICAgICBvcy53cml0ZSh3cml0ZV9mZCwgbmV4dChzZWxmLnIpLmVuY29kZSgiYXNjaWkiKSkKKyAgICAgICAgICAgICAgICBvcy5jbG9zZSh3cml0ZV9mZCkKKyAgICAgICAgICAgICAgICAjIGJ5cGFzcyB0aGUgbm9ybWFsIGV4aXQgaGFuZGxlcnMtIGxlYXZlIHRob3NlIHRvCisgICAgICAgICAgICAgICAgIyB0aGUgcGFyZW50LgorICAgICAgICAgICAgICAgIG9zLl9leGl0KDApCisgICAgICAgICAgICBwYXJlbnRfdmFsdWUgPSBuZXh0KHNlbGYucikKKyAgICAgICAgICAgIGNoaWxkX3ZhbHVlID0gb3MucmVhZChyZWFkX2ZkLCBsZW4ocGFyZW50X3ZhbHVlKSkuZGVjb2RlKCJhc2NpaSIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBwaWQ6CisgICAgICAgICAgICAgICAgIyBiZXN0IGVmZm9ydCB0byBlbnN1cmUgdGhlIHByb2Nlc3MgY2FuJ3QgYmxlZWQgb3V0CisgICAgICAgICAgICAgICAgIyB2aWEgYW55IGJ1Z3MgYWJvdmUKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgICAgICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgb3MuY2xvc2UocmVhZF9mZCkKKyAgICAgICAgICAgIG9zLmNsb3NlKHdyaXRlX2ZkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNoaWxkX3ZhbHVlLCBwYXJlbnRfdmFsdWUpCisKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X19SYW5kb21OYW1lU2VxdWVuY2UpCisKKworY2xhc3MgdGVzdF9fY2FuZGlkYXRlX3RlbXBkaXJfbGlzdChUQyk6CisgICAgIiIiVGVzdCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QuIiIiCisKKyAgICBkZWYgdGVzdF9ub25lbXB0eV9saXN0KHNlbGYpOgorICAgICAgICAjIF9jYW5kaWRhdGVfdGVtcGRpcl9saXN0IHJldHVybnMgYSBub25lbXB0eSBsaXN0IG9mIHN0cmluZ3MKKworICAgICAgICBjYW5kID0gdGVtcGZpbGUuX2NhbmRpZGF0ZV90ZW1wZGlyX2xpc3QoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKGNhbmQpID09IDApCisgICAgICAgIGZvciBjIGluIGNhbmQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoYywgYmFzZXN0cmluZykKKworICAgIGRlZiB0ZXN0X3dhbnRlZF9kaXJzKHNlbGYpOgorICAgICAgICAjIF9jYW5kaWRhdGVfdGVtcGRpcl9saXN0IGNvbnRhaW5zIHRoZSBleHBlY3RlZCBkaXJlY3RvcmllcworCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBpbnRlcmVzdGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGFsbCBzZXQuCisgICAgICAgIHdpdGggc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgorICAgICAgICAgICAgZm9yIGVudm5hbWUgaW4gJ1RNUERJUicsICdURU1QJywgJ1RNUCc6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLmdldGVudihlbnZuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkaXJuYW1lOgorICAgICAgICAgICAgICAgICAgICBlbnZbZW52bmFtZV0gPSBvcy5wYXRoLmFic3BhdGgoZW52bmFtZSkKKworICAgICAgICAgICAgY2FuZCA9IHRlbXBmaWxlLl9jYW5kaWRhdGVfdGVtcGRpcl9saXN0KCkKKworICAgICAgICAgICAgZm9yIGVudm5hbWUgaW4gJ1RNUERJUicsICdURU1QJywgJ1RNUCc6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLmdldGVudihlbnZuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkaXJuYW1lOiByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihkaXJuYW1lLCBjYW5kKQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBvcy5lcnJvcik6CisgICAgICAgICAgICAgICAgZGlybmFtZSA9IG9zLmN1cmRpcgorCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGRpcm5hbWUsIGNhbmQpCisKKyAgICAgICAgICAgICMgTm90IHByYWN0aWNhbCB0byB0cnkgdG8gdmVyaWZ5IHRoZSBwcmVzZW5jZSBvZiBPUy1zcGVjaWZpYworICAgICAgICAgICAgIyBwYXRocyBpbiB0aGlzIGxpc3QuCisKK3Rlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9fY2FuZGlkYXRlX3RlbXBkaXJfbGlzdCkKKworIyBXZSB0ZXN0IF9nZXRfZGVmYXVsdF90ZW1wZGlyIHNvbWUgbW9yZSBieSB0ZXN0aW5nIGdldHRlbXBkaXIuCisKK2NsYXNzIFRlc3RHZXREZWZhdWx0VGVtcGRpcihUQyk6CisgICAgIiIiVGVzdCBfZ2V0X2RlZmF1bHRfdGVtcGRpcigpLiIiIgorCisgICAgZGVmIHRlc3Rfbm9fZmlsZXNfbGVmdF9iZWhpbmQoc2VsZik6CisgICAgICAgICMgdXNlIGEgcHJpdmF0ZSBlbXB0eSBkaXJlY3RvcnkKKyAgICAgICAgb3VyX3RlbXBfZGlyZWN0b3J5ID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgZm9yY2UgX2dldF9kZWZhdWx0X3RlbXBkaXIoKSB0byBjb25zaWRlciBvdXIgZW1wdHkgZGlyZWN0b3J5CisgICAgICAgICAgICBkZWYgb3VyX2NhbmRpZGF0ZV9saXN0KCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFtvdXJfdGVtcF9kaXJlY3RvcnldCisKKyAgICAgICAgICAgIHdpdGggc3VwcG9ydC5zd2FwX2F0dHIodGVtcGZpbGUsICJfY2FuZGlkYXRlX3RlbXBkaXJfbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91cl9jYW5kaWRhdGVfbGlzdCk6CisgICAgICAgICAgICAgICAgIyB2ZXJpZnkgb3VyIGRpcmVjdG9yeSBpcyBlbXB0eSBhZnRlciBfZ2V0X2RlZmF1bHRfdGVtcGRpcigpCisgICAgICAgICAgICAgICAgdGVtcGZpbGUuX2dldF9kZWZhdWx0X3RlbXBkaXIoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubGlzdGRpcihvdXJfdGVtcF9kaXJlY3RvcnkpLCBbXSkKKworICAgICAgICAgICAgICAgIGRlZiByYWlzZV9PU0Vycm9yKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIE9TRXJyb3IoLTEpCisKKyAgICAgICAgICAgICAgICB3aXRoIHN1cHBvcnQuc3dhcF9hdHRyKGlvLCAib3BlbiIsIHJhaXNlX09TRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICAjIHRlc3QgYWdhaW4gd2l0aCBmYWlsaW5nIGlvLm9wZW4oKQorICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUuX2dldF9kZWZhdWx0X3RlbXBkaXIoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PRU5UKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxpc3RkaXIob3VyX3RlbXBfZGlyZWN0b3J5KSwgW10pCisKKyAgICAgICAgICAgICAgICBvcGVuID0gaW8ub3BlbgorICAgICAgICAgICAgICAgIGRlZiBiYWRfd3JpdGVyKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICAgICAgICAgICAgIGZwID0gb3BlbigqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlID0gcmFpc2VfT1NFcnJvcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnAKKworICAgICAgICAgICAgICAgIHdpdGggc3VwcG9ydC5zd2FwX2F0dHIoaW8sICJvcGVuIiwgYmFkX3dyaXRlcik6CisgICAgICAgICAgICAgICAgICAgICMgdGVzdCBhZ2FpbiB3aXRoIGZhaWxpbmcgd3JpdGUoKQorICAgICAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKElPRXJyb3IpIGFzIGNtOgorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGZpbGUuX2dldF9kZWZhdWx0X3RlbXBkaXIoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5lcnJubywgZXJybm8uRU5PRU5UKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLmxpc3RkaXIob3VyX3RlbXBfZGlyZWN0b3J5KSwgW10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzaHV0aWwucm10cmVlKG91cl90ZW1wX2RpcmVjdG9yeSkKKwordGVzdF9jbGFzc2VzLmFwcGVuZChUZXN0R2V0RGVmYXVsdFRlbXBkaXIpCisKKworY2xhc3MgdGVzdF9fZ2V0X2NhbmRpZGF0ZV9uYW1lcyhUQyk6CisgICAgIiIiVGVzdCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gX2dldF9jYW5kaWRhdGVfbmFtZXMuIiIiCisKKyAgICBkZWYgdGVzdF9yZXR2YWwoc2VsZik6CisgICAgICAgICMgX2dldF9jYW5kaWRhdGVfbmFtZXMgcmV0dXJucyBhIF9SYW5kb21OYW1lU2VxdWVuY2Ugb2JqZWN0CisgICAgICAgIG9iaiA9IHRlbXBmaWxlLl9nZXRfY2FuZGlkYXRlX25hbWVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9iaiwgdGVtcGZpbGUuX1JhbmRvbU5hbWVTZXF1ZW5jZSkKKworICAgIGRlZiB0ZXN0X3NhbWVfdGhpbmcoc2VsZik6CisgICAgICAgICMgX2dldF9jYW5kaWRhdGVfbmFtZXMgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0CisgICAgICAgIGEgPSB0ZW1wZmlsZS5fZ2V0X2NhbmRpZGF0ZV9uYW1lcygpCisgICAgICAgIGIgPSB0ZW1wZmlsZS5fZ2V0X2NhbmRpZGF0ZV9uYW1lcygpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X19nZXRfY2FuZGlkYXRlX25hbWVzKQorCisKK2NsYXNzIHRlc3RfX21rc3RlbXBfaW5uZXIoVEMpOgorICAgICIiIlRlc3QgdGhlIGludGVybmFsIGZ1bmN0aW9uIF9ta3N0ZW1wX2lubmVyLiIiIgorCisgICAgY2xhc3MgbWtzdGVtcGVkOgorICAgICAgICBfYmZsYWdzID0gdGVtcGZpbGUuX2Jpbl9vcGVuZmxhZ3MKKyAgICAgICAgX3RmbGFncyA9IHRlbXBmaWxlLl90ZXh0X29wZW5mbGFncworICAgICAgICBfY2xvc2UgPSBvcy5jbG9zZQorICAgICAgICBfdW5saW5rID0gb3MudW5saW5rCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpciwgcHJlLCBzdWYsIGJpbik6CisgICAgICAgICAgICBpZiBiaW46IGZsYWdzID0gc2VsZi5fYmZsYWdzCisgICAgICAgICAgICBlbHNlOiAgIGZsYWdzID0gc2VsZi5fdGZsYWdzCisKKyAgICAgICAgICAgIChzZWxmLmZkLCBzZWxmLm5hbWUpID0gdGVtcGZpbGUuX21rc3RlbXBfaW5uZXIoZGlyLCBwcmUsIHN1ZiwgZmxhZ3MpCisKKyAgICAgICAgZGVmIHdyaXRlKHNlbGYsIHN0cik6CisgICAgICAgICAgICBvcy53cml0ZShzZWxmLmZkLCBzdHIpCisKKyAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgICAgICBzZWxmLl9jbG9zZShzZWxmLmZkKQorICAgICAgICAgICAgc2VsZi5fdW5saW5rKHNlbGYubmFtZSkKKworICAgIGRlZiBkb19jcmVhdGUoc2VsZiwgZGlyPU5vbmUsIHByZT0iIiwgc3VmPSIiLCBiaW49MSk6CisgICAgICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICAgICAgZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLm1rc3RlbXBlZChkaXIsIHByZSwgc3VmLCBiaW4pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJfbWtzdGVtcF9pbm5lciIpCisKKyAgICAgICAgc2VsZi5uYW1lQ2hlY2soZmlsZS5uYW1lLCBkaXIsIHByZSwgc3VmKQorICAgICAgICByZXR1cm4gZmlsZQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgX21rc3RlbXBfaW5uZXIgY2FuIGNyZWF0ZSBmaWxlcworICAgICAgICBzZWxmLmRvX2NyZWF0ZSgpLndyaXRlKCJibGF0IikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhIikud3JpdGUoImJsYXQiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShzdWY9ImIiKS53cml0ZSgiYmxhdCIpCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKHByZT0iYSIsIHN1Zj0iYiIpLndyaXRlKCJibGF0IikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhYSIsIHN1Zj0iLnR4dCIpLndyaXRlKCJibGF0IikKKworICAgIGRlZiB0ZXN0X2Jhc2ljX21hbnkoc2VsZik6CisgICAgICAgICMgX21rc3RlbXBfaW5uZXIgY2FuIGNyZWF0ZSBtYW55IGZpbGVzIChzdG9jaGFzdGljKQorICAgICAgICBleHRhbnQgPSByYW5nZShURVNUX0ZJTEVTKQorICAgICAgICBmb3IgaSBpbiBleHRhbnQ6CisgICAgICAgICAgICBleHRhbnRbaV0gPSBzZWxmLmRvX2NyZWF0ZShwcmU9ImFhIikKKworICAgIGRlZiB0ZXN0X2Nob29zZV9kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgICMgX21rc3RlbXBfaW5uZXIgY2FuIGNyZWF0ZSBmaWxlcyBpbiBhIHVzZXItc2VsZWN0ZWQgZGlyZWN0b3J5CisgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRvX2NyZWF0ZShkaXI9ZGlyKS53cml0ZSgiYmxhdCIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihkaXIpCisKKyAgICBkZWYgdGVzdF9maWxlX21vZGUoc2VsZik6CisgICAgICAgICMgX21rc3RlbXBfaW5uZXIgY3JlYXRlcyBmaWxlcyB3aXRoIHRoZSBwcm9wZXIgbW9kZQorICAgICAgICBpZiBub3QgaGFzX3N0YXQ6CisgICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAjIHVnaCwgY2FuJ3QgdXNlIFNraXBUZXN0LgorCisgICAgICAgIGZpbGUgPSBzZWxmLmRvX2NyZWF0ZSgpCisgICAgICAgIG1vZGUgPSBzdGF0LlNfSU1PREUob3Muc3RhdChmaWxlLm5hbWUpLnN0X21vZGUpCisgICAgICAgIGV4cGVjdGVkID0gMDYwMAorICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCd3aW4zMicsICdvczJlbXgnKToKKyAgICAgICAgICAgICMgVGhlcmUncyBubyBkaXN0aW5jdGlvbiBhbW9uZyAndXNlcicsICdncm91cCcgYW5kICd3b3JsZCc7CisgICAgICAgICAgICAjIHJlcGxpY2F0ZSB0aGUgJ3VzZXInIGJpdHMuCisgICAgICAgICAgICB1c2VyID0gZXhwZWN0ZWQgPj4gNgorICAgICAgICAgICAgZXhwZWN0ZWQgPSB1c2VyICogKDEgKyA4ICsgNjQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kZSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9ub2luaGVyaXQoc2VsZik6CisgICAgICAgICMgX21rc3RlbXBfaW5uZXIgZmlsZSBoYW5kbGVzIGFyZSBub3QgaW5oZXJpdGVkIGJ5IGNoaWxkIHByb2Nlc3NlcworICAgICAgICBpZiBub3QgaGFzX3NwYXdubDoKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICMgdWdoLCBjYW4ndCB1c2UgU2tpcFRlc3QuCisKKyAgICAgICAgaWYgc3VwcG9ydC52ZXJib3NlOgorICAgICAgICAgICAgdj0idiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHY9InEiCisKKyAgICAgICAgZmlsZSA9IHNlbGYuZG9fY3JlYXRlKCkKKyAgICAgICAgZmQgPSAiJWQiICUgZmlsZS5mZAorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1lID0gX19maWxlX18KKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgIG1lID0gc3lzLmFyZ3ZbMF0KKworICAgICAgICAjIFdlIGhhdmUgdG8gZXhlYyBzb21ldGhpbmcsIHNvIHRoYXQgRkRfQ0xPRVhFQyB3aWxsIHRha2UKKyAgICAgICAgIyBlZmZlY3QuICBUaGUgY29yZSBvZiB0aGlzIHRlc3QgaXMgdGhlcmVmb3JlIGluCisgICAgICAgICMgdGZfaW5oZXJpdF9jaGVjay5weSwgd2hpY2ggc2VlLgorICAgICAgICB0ZXN0ZXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguYWJzcGF0aChtZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRmX2luaGVyaXRfY2hlY2sucHkiKQorCisgICAgICAgICMgT24gV2luZG93cyBhIHNwYXduKiAvcGF0aC8gd2l0aCBlbWJlZGRlZCBzcGFjZXMgc2hvdWxkbid0IGJlIHF1b3RlZCwKKyAgICAgICAgIyBidXQgYW4gYXJnIHdpdGggZW1iZWRkZWQgc3BhY2VzIHNob3VsZCBiZSBkZWNvcmF0ZWQgd2l0aCBkb3VibGUKKyAgICAgICAgIyBxdW90ZXMgb24gZWFjaCBlbmQKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnd2luMzInLCk6CisgICAgICAgICAgICBkZWNvcmF0ZWQgPSAnIiVzIicgJSBzeXMuZXhlY3V0YWJsZQorICAgICAgICAgICAgdGVzdGVyID0gJyIlcyInICUgdGVzdGVyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWNvcmF0ZWQgPSBzeXMuZXhlY3V0YWJsZQorCisgICAgICAgIHJldHZhbCA9IG9zLnNwYXdubChvcy5QX1dBSVQsIHN5cy5leGVjdXRhYmxlLCBkZWNvcmF0ZWQsIHRlc3RlciwgdiwgZmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmV0dmFsIDwgMCwKKyAgICAgICAgICAgICAgICAgICAgImNoaWxkIHByb2Nlc3MgY2F1Z2h0IGZhdGFsIHNpZ25hbCAlZCIgJSAtcmV0dmFsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJldHZhbCA+IDAsICJjaGlsZCBwcm9jZXNzIHJlcG9ydHMgZmFpbHVyZSAlZCIlcmV0dmFsKQorCisgICAgZGVmIHRlc3RfdGV4dG1vZGUoc2VsZik6CisgICAgICAgICMgX21rc3RlbXBfaW5uZXIgY2FuIGNyZWF0ZSBmaWxlcyBpbiB0ZXh0IG1vZGUKKyAgICAgICAgaWYgbm90IGhhc190ZXh0bW9kZToKKyAgICAgICAgICAgIHJldHVybiAgICAgICAgICAgICMgdWdoLCBjYW4ndCB1c2UgU2tpcFRlc3QuCisKKyAgICAgICAgc2VsZi5kb19jcmVhdGUoYmluPTApLndyaXRlKCJibGF0XG4iKQorICAgICAgICAjIFhYWCBzaG91bGQgdGVzdCB0aGF0IHRoZSBmaWxlIHJlYWxseSBpcyBhIHRleHQgZmlsZQorCit0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfX21rc3RlbXBfaW5uZXIpCisKKworY2xhc3MgdGVzdF9nZXR0ZW1wcHJlZml4KFRDKToKKyAgICAiIiJUZXN0IGdldHRlbXBwcmVmaXgoKS4iIiIKKworICAgIGRlZiB0ZXN0X3NhbmVfdGVtcGxhdGUoc2VsZik6CisgICAgICAgICMgZ2V0dGVtcHByZWZpeCByZXR1cm5zIGEgbm9uZW1wdHkgcHJlZml4IHN0cmluZworICAgICAgICBwID0gdGVtcGZpbGUuZ2V0dGVtcHByZWZpeCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHAsIGJhc2VzdHJpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4ocCkgPiAwKQorCisgICAgZGVmIHRlc3RfdXNhYmxlX3RlbXBsYXRlKHNlbGYpOgorICAgICAgICAjIGdldHRlbXBwcmVmaXggcmV0dXJucyBhIHVzYWJsZSBwcmVmaXggc3RyaW5nCisKKyAgICAgICAgIyBDcmVhdGUgYSB0ZW1wIGRpcmVjdG9yeSwgYXZvaWRpbmcgdXNlIG9mIHRoZSBwcmVmaXguCisgICAgICAgICMgVGhlbiBhdHRlbXB0IHRvIGNyZWF0ZSBhIGZpbGUgd2hvc2UgbmFtZSBpcworICAgICAgICAjIHByZWZpeCArICd4eHh4eHgueHh4JyBpbiB0aGF0IGRpcmVjdG9yeS4KKyAgICAgICAgcCA9IHRlbXBmaWxlLmdldHRlbXBwcmVmaXgoKSArICJ4eHh4eHgueHh4IgorICAgICAgICBkID0gdGVtcGZpbGUubWtkdGVtcChwcmVmaXg9IiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBvcy5wYXRoLmpvaW4oZCwgcCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmZCA9IG9zLm9wZW4ocCwgb3MuT19SRFdSIHwgb3MuT19DUkVBVCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigib3Mub3BlbiIpCisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIG9zLnVubGluayhwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Mucm1kaXIoZCkKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X2dldHRlbXBwcmVmaXgpCisKKworY2xhc3MgdGVzdF9nZXR0ZW1wZGlyKFRDKToKKyAgICAiIiJUZXN0IGdldHRlbXBkaXIoKS4iIiIKKworICAgIGRlZiB0ZXN0X2RpcmVjdG9yeV9leGlzdHMoc2VsZik6CisgICAgICAgICMgZ2V0dGVtcGRpciByZXR1cm5zIGEgZGlyZWN0b3J5IHdoaWNoIGV4aXN0cworCisgICAgICAgIGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2FicyhkaXIpIG9yIGRpciA9PSBvcy5jdXJkaXIsCisgICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGFuIGFic29sdXRlIHBhdGgiICUgZGlyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2RpcihkaXIpLAorICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIgJSBkaXIpCisKKyAgICBkZWYgdGVzdF9kaXJlY3Rvcnlfd3JpdGFibGUoc2VsZik6CisgICAgICAgICMgZ2V0dGVtcGRpciByZXR1cm5zIGEgZGlyZWN0b3J5IHdyaXRhYmxlIGJ5IHRoZSB1c2VyCisKKyAgICAgICAgIyBzbmVha3k6IGp1c3QgaW5zdGFudGlhdGUgYSBOYW1lZFRlbXBvcmFyeUZpbGUsIHdoaWNoCisgICAgICAgICMgZGVmYXVsdHMgdG8gd3JpdGluZyBpbnRvIHRoZSBkaXJlY3RvcnkgcmV0dXJuZWQgYnkKKyAgICAgICAgIyBnZXR0ZW1wZGlyLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgICAgIGZpbGUud3JpdGUoImJsYXQiKQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJjcmVhdGUgZmlsZSBpbiAlcyIgJSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkpCisKKyAgICBkZWYgdGVzdF9zYW1lX3RoaW5nKHNlbGYpOgorICAgICAgICAjIGdldHRlbXBkaXIgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgb2JqZWN0CisgICAgICAgIGEgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKyAgICAgICAgYiA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCisKK3Rlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9nZXR0ZW1wZGlyKQorCisKK2NsYXNzIHRlc3RfbWtzdGVtcChUQyk6CisgICAgIiIiVGVzdCBta3N0ZW1wKCkuIiIiCisKKyAgICBkZWYgZG9fY3JlYXRlKHNlbGYsIGRpcj1Ob25lLCBwcmU9IiIsIHN1Zj0iIik6CisgICAgICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICAgICAgZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIChmZCwgbmFtZSkgPSB0ZW1wZmlsZS5ta3N0ZW1wKGRpcj1kaXIsIHByZWZpeD1wcmUsIHN1ZmZpeD1zdWYpCisgICAgICAgICAgICAobmRpciwgbmJhc2UpID0gb3MucGF0aC5zcGxpdChuYW1lKQorICAgICAgICAgICAgYWRpciA9IG9zLnBhdGguYWJzcGF0aChkaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkaXIsIG5kaXIsCisgICAgICAgICAgICAgICAgIkRpcmVjdG9yeSAnJXMnIGluY29ycmVjdGx5IHJldHVybmVkIGFzICclcyciICUgKGFkaXIsIG5kaXIpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigibWtzdGVtcCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5uYW1lQ2hlY2sobmFtZSwgZGlyLCBwcmUsIHN1ZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkKQorICAgICAgICAgICAgb3MudW5saW5rKG5hbWUpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBta3N0ZW1wIGNhbiBjcmVhdGUgZmlsZXMKKyAgICAgICAgc2VsZi5kb19jcmVhdGUoKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImEiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShzdWY9ImIiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImEiLCBzdWY9ImIiKQorICAgICAgICBzZWxmLmRvX2NyZWF0ZShwcmU9ImFhIiwgc3VmPSIudHh0IikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUoZGlyPSIuIikKKworICAgIGRlZiB0ZXN0X2Nob29zZV9kaXJlY3Rvcnkoc2VsZik6CisgICAgICAgICMgbWtzdGVtcCBjYW4gY3JlYXRlIGRpcmVjdG9yaWVzIGluIGEgdXNlci1zZWxlY3RlZCBkaXJlY3RvcnkKKyAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZG9fY3JlYXRlKGRpcj1kaXIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihkaXIpCisKK3Rlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9ta3N0ZW1wKQorCisKK2NsYXNzIHRlc3RfbWtkdGVtcChUQyk6CisgICAgIiIiVGVzdCBta2R0ZW1wKCkuIiIiCisKKyAgICBkZWYgZG9fY3JlYXRlKHNlbGYsIGRpcj1Ob25lLCBwcmU9IiIsIHN1Zj0iIik6CisgICAgICAgIGlmIGRpciBpcyBOb25lOgorICAgICAgICAgICAgZGlyID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWUgPSB0ZW1wZmlsZS5ta2R0ZW1wKGRpcj1kaXIsIHByZWZpeD1wcmUsIHN1ZmZpeD1zdWYpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJta2R0ZW1wIikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLm5hbWVDaGVjayhuYW1lLCBkaXIsIHByZSwgc3VmKQorICAgICAgICAgICAgcmV0dXJuIG5hbWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgb3Mucm1kaXIobmFtZSkKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBta2R0ZW1wIGNhbiBjcmVhdGUgZGlyZWN0b3JpZXMKKyAgICAgICAgb3Mucm1kaXIoc2VsZi5kb19jcmVhdGUoKSkKKyAgICAgICAgb3Mucm1kaXIoc2VsZi5kb19jcmVhdGUocHJlPSJhIikpCisgICAgICAgIG9zLnJtZGlyKHNlbGYuZG9fY3JlYXRlKHN1Zj0iYiIpKQorICAgICAgICBvcy5ybWRpcihzZWxmLmRvX2NyZWF0ZShwcmU9ImEiLCBzdWY9ImIiKSkKKyAgICAgICAgb3Mucm1kaXIoc2VsZi5kb19jcmVhdGUocHJlPSJhYSIsIHN1Zj0iLnR4dCIpKQorCisgICAgZGVmIHRlc3RfYmFzaWNfbWFueShzZWxmKToKKyAgICAgICAgIyBta2R0ZW1wIGNhbiBjcmVhdGUgbWFueSBkaXJlY3RvcmllcyAoc3RvY2hhc3RpYykKKyAgICAgICAgZXh0YW50ID0gcmFuZ2UoVEVTVF9GSUxFUykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIGkgaW4gZXh0YW50OgorICAgICAgICAgICAgICAgIGV4dGFudFtpXSA9IHNlbGYuZG9fY3JlYXRlKHByZT0iYWEiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZm9yIGkgaW4gZXh0YW50OgorICAgICAgICAgICAgICAgIGlmKGlzaW5zdGFuY2UoaSwgYmFzZXN0cmluZykpOgorICAgICAgICAgICAgICAgICAgICBvcy5ybWRpcihpKQorCisgICAgZGVmIHRlc3RfY2hvb3NlX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgIyBta2R0ZW1wIGNhbiBjcmVhdGUgZGlyZWN0b3JpZXMgaW4gYSB1c2VyLXNlbGVjdGVkIGRpcmVjdG9yeQorICAgICAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5kb19jcmVhdGUoZGlyPWRpcikpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihkaXIpCisKKyAgICBkZWYgdGVzdF9tb2RlKHNlbGYpOgorICAgICAgICAjIG1rZHRlbXAgY3JlYXRlcyBkaXJlY3RvcmllcyB3aXRoIHRoZSBwcm9wZXIgbW9kZQorICAgICAgICBpZiBub3QgaGFzX3N0YXQ6CisgICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAjIHVnaCwgY2FuJ3QgdXNlIFNraXBUZXN0LgorCisgICAgICAgIGRpciA9IHNlbGYuZG9fY3JlYXRlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kZSA9IHN0YXQuU19JTU9ERShvcy5zdGF0KGRpcikuc3RfbW9kZSkKKyAgICAgICAgICAgIG1vZGUgJj0gMDc3NyAjIE1hc2sgb2ZmIHN0aWNreSBiaXRzIGluaGVyaXRlZCBmcm9tIC90bXAKKyAgICAgICAgICAgIGV4cGVjdGVkID0gMDcwMAorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluICgnd2luMzInLCAnb3MyZW14Jyk6CisgICAgICAgICAgICAgICAgIyBUaGVyZSdzIG5vIGRpc3RpbmN0aW9uIGFtb25nICd1c2VyJywgJ2dyb3VwJyBhbmQgJ3dvcmxkJzsKKyAgICAgICAgICAgICAgICAjIHJlcGxpY2F0ZSB0aGUgJ3VzZXInIGJpdHMuCisgICAgICAgICAgICAgICAgdXNlciA9IGV4cGVjdGVkID4+IDYKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IHVzZXIgKiAoMSArIDggKyA2NCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kZSwgZXhwZWN0ZWQpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBvcy5ybWRpcihkaXIpCisKK3Rlc3RfY2xhc3Nlcy5hcHBlbmQodGVzdF9ta2R0ZW1wKQorCisKK2NsYXNzIHRlc3RfbWt0ZW1wKFRDKToKKyAgICAiIiJUZXN0IG1rdGVtcCgpLiIiIgorCisgICAgIyBGb3Igc2FmZXR5LCBhbGwgdXNlIG9mIG1rdGVtcCBtdXN0IG9jY3VyIGluIGEgcHJpdmF0ZSBkaXJlY3RvcnkuCisgICAgIyBXZSBtdXN0IGFsc28gc3VwcHJlc3MgdGhlIFJ1bnRpbWVXYXJuaW5nIGl0IGdlbmVyYXRlcy4KKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuZGlyOgorICAgICAgICAgICAgb3Mucm1kaXIoc2VsZi5kaXIpCisgICAgICAgICAgICBzZWxmLmRpciA9IE5vbmUKKworICAgIGNsYXNzIG1rdGVtcGVkOgorICAgICAgICBfdW5saW5rID0gb3MudW5saW5rCisgICAgICAgIF9iZmxhZ3MgPSB0ZW1wZmlsZS5fYmluX29wZW5mbGFncworCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaXIsIHByZSwgc3VmKToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IHRlbXBmaWxlLm1rdGVtcChkaXI9ZGlyLCBwcmVmaXg9cHJlLCBzdWZmaXg9c3VmKQorICAgICAgICAgICAgIyBDcmVhdGUgdGhlIGZpbGUuICBUaGlzIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGl0J3MKKyAgICAgICAgICAgICMgbXlzdGVyaW91c2x5IGFwcGVhcmVkIGluIHRoZSBtZWFud2hpbGUuCisgICAgICAgICAgICBvcy5jbG9zZShvcy5vcGVuKHNlbGYubmFtZSwgc2VsZi5fYmZsYWdzLCAwNjAwKSkKKworICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX3VubGluayhzZWxmLm5hbWUpCisKKyAgICBkZWYgZG9fY3JlYXRlKHNlbGYsIHByZT0iIiwgc3VmPSIiKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IHNlbGYubWt0ZW1wZWQoc2VsZi5kaXIsIHByZSwgc3VmKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigibWt0ZW1wIikKKworICAgICAgICBzZWxmLm5hbWVDaGVjayhmaWxlLm5hbWUsIHNlbGYuZGlyLCBwcmUsIHN1ZikKKyAgICAgICAgcmV0dXJuIGZpbGUKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIG1rdGVtcCBjYW4gY2hvb3NlIHVzYWJsZSBmaWxlIG5hbWVzCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKCkKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhIikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUoc3VmPSJiIikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhIiwgc3VmPSJiIikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhYSIsIHN1Zj0iLnR4dCIpCisKKyAgICBkZWYgdGVzdF9tYW55KHNlbGYpOgorICAgICAgICAjIG1rdGVtcCBjYW4gY2hvb3NlIG1hbnkgdXNhYmxlIGZpbGUgbmFtZXMgKHN0b2NoYXN0aWMpCisgICAgICAgIGV4dGFudCA9IHJhbmdlKFRFU1RfRklMRVMpCisgICAgICAgIGZvciBpIGluIGV4dGFudDoKKyAgICAgICAgICAgIGV4dGFudFtpXSA9IHNlbGYuZG9fY3JlYXRlKHByZT0iYWEiKQorCisjIyAgICAgZGVmIHRlc3Rfd2FybmluZyhzZWxmKToKKyMjICAgICAgICAgIyBta3RlbXAgaXNzdWVzIGEgd2FybmluZyB3aGVuIHVzZWQKKyMjICAgICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9UnVudGltZVdhcm5pbmcsCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U9Im1rdGVtcCIpCisjIyAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVXYXJuaW5nLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wZmlsZS5ta3RlbXAsIGRpcj1zZWxmLmRpcikKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X21rdGVtcCkKKworCisjIFdlIHRlc3QgX1RlbXBvcmFyeUZpbGVXcmFwcGVyIGJ5IHRlc3RpbmcgTmFtZWRUZW1wb3JhcnlGaWxlLgorCisKK2NsYXNzIHRlc3RfTmFtZWRUZW1wb3JhcnlGaWxlKFRDKToKKyAgICAiIiJUZXN0IE5hbWVkVGVtcG9yYXJ5RmlsZSgpLiIiIgorCisgICAgZGVmIGRvX2NyZWF0ZShzZWxmLCBkaXI9Tm9uZSwgcHJlPSIiLCBzdWY9IiIsIGRlbGV0ZT1UcnVlKToKKyAgICAgICAgaWYgZGlyIGlzIE5vbmU6CisgICAgICAgICAgICBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkaXI9ZGlyLCBwcmVmaXg9cHJlLCBzdWZmaXg9c3VmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGU9ZGVsZXRlKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWxPbkV4Y2VwdGlvbigiTmFtZWRUZW1wb3JhcnlGaWxlIikKKworICAgICAgICBzZWxmLm5hbWVDaGVjayhmaWxlLm5hbWUsIGRpciwgcHJlLCBzdWYpCisgICAgICAgIHJldHVybiBmaWxlCisKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICAjIE5hbWVkVGVtcG9yYXJ5RmlsZSBjYW4gY3JlYXRlIGZpbGVzCisgICAgICAgIHNlbGYuZG9fY3JlYXRlKCkKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhIikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUoc3VmPSJiIikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhIiwgc3VmPSJiIikKKyAgICAgICAgc2VsZi5kb19jcmVhdGUocHJlPSJhYSIsIHN1Zj0iLnR4dCIpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVzX25hbWVkKHNlbGYpOgorICAgICAgICAjIE5hbWVkVGVtcG9yYXJ5RmlsZSBjcmVhdGVzIGZpbGVzIHdpdGggbmFtZXMKKyAgICAgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVkVGVtcG9yYXJ5RmlsZSAlcyBkb2VzIG5vdCBleGlzdCIgJSBmLm5hbWUpCisKKyAgICBkZWYgdGVzdF9kZWxfb25fY2xvc2Uoc2VsZik6CisgICAgICAgICMgQSBOYW1lZFRlbXBvcmFyeUZpbGUgaXMgZGVsZXRlZCB3aGVuIGNsb3NlZAorICAgICAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShkaXI9ZGlyKQorICAgICAgICAgICAgZi53cml0ZSgnYmxhdCcpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZi5uYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOYW1lZFRlbXBvcmFyeUZpbGUgJXMgZXhpc3RzIGFmdGVyIGNsb3NlIiAlIGYubmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKworICAgIGRlZiB0ZXN0X2Rpc19kZWxfb25fY2xvc2Uoc2VsZik6CisgICAgICAgICMgVGVzdHMgdGhhdCBkZWxldGUtb24tY2xvc2UgY2FuIGJlIGRpc2FibGVkCisgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0bXAgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGlyPWRpciwgZGVsZXRlPUZhbHNlKQorICAgICAgICAgICAgdG1wID0gZi5uYW1lCisgICAgICAgICAgICBmLndyaXRlKCdibGF0JykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGYubmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiTmFtZWRUZW1wb3JhcnlGaWxlICVzIG1pc3NpbmcgYWZ0ZXIgY2xvc2UiICUgZi5uYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgdG1wIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG9zLnVubGluayh0bXApCisgICAgICAgICAgICBvcy5ybWRpcihkaXIpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9jbG9zZShzZWxmKToKKyAgICAgICAgIyBBIE5hbWVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgY2xvc2VkIG1hbnkgdGltZXMgd2l0aG91dCBlcnJvcgorICAgICAgICBmID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgZi53cml0ZSgnYWJjXG4nKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oImNsb3NlIikKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcihzZWxmKToKKyAgICAgICAgIyBBIE5hbWVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgorICAgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZi5uYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpKQorICAgICAgICBkZWYgdXNlX2Nsb3NlZCgpOgorICAgICAgICAgICAgd2l0aCBmOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKKworICAgICMgSG93IHRvIHRlc3QgdGhlIG1vZGUgYW5kIGJ1ZnNpemUgcGFyYW1ldGVycz8KKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X05hbWVkVGVtcG9yYXJ5RmlsZSkKKworY2xhc3MgdGVzdF9TcG9vbGVkVGVtcG9yYXJ5RmlsZShUQyk6CisgICAgIiIiVGVzdCBTcG9vbGVkVGVtcG9yYXJ5RmlsZSgpLiIiIgorCisgICAgZGVmIGRvX2NyZWF0ZShzZWxmLCBtYXhfc2l6ZT0wLCBkaXI9Tm9uZSwgcHJlPSIiLCBzdWY9IiIpOgorICAgICAgICBpZiBkaXIgaXMgTm9uZToKKyAgICAgICAgICAgIGRpciA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9bWF4X3NpemUsIGRpcj1kaXIsIHByZWZpeD1wcmUsIHN1ZmZpeD1zdWYpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJTcG9vbGVkVGVtcG9yYXJ5RmlsZSIpCisKKyAgICAgICAgcmV0dXJuIGZpbGUKKworCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGNyZWF0ZSBmaWxlcworICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUoKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTEwMCwgcHJlPSJhIiwgc3VmPSIudHh0IikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisKKyAgICBkZWYgdGVzdF9kZWxfb25fY2xvc2Uoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBpcyBkZWxldGVkIHdoZW4gY2xvc2VkCisgICAgICAgIGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MTAsIGRpcj1kaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgICAgIGYud3JpdGUoJ2JsYXQgJyAqIDUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBmLm5hbWUKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAiU3Bvb2xlZFRlbXBvcmFyeUZpbGUgJXMgZXhpc3RzIGFmdGVyIGNsb3NlIiAlIGZpbGVuYW1lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQorCisgICAgZGVmIHRlc3RfcmV3cml0ZV9zbWFsbChzZWxmKToKKyAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB3cml0dGVuIHRvIG11bHRpcGxlIHdpdGhpbiB0aGUgbWF4X3NpemUKKyAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTMwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6CisgICAgICAgICAgICBmLnNlZWsoMCwgMCkKKyAgICAgICAgICAgIGYud3JpdGUoJ3gnICogMjApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfc2VxdWVudGlhbChzZWxmKToKKyAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIHNob3VsZCBob2xkIGV4YWN0bHkgbWF4X3NpemUgYnl0ZXMsIGFuZCByb2xsCisgICAgICAgICMgb3ZlciBhZnRlcndhcmQKKyAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTMwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgZi53cml0ZSgneCcgKiAyMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIGYud3JpdGUoJ3gnICogMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBmLndyaXRlKCd4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKworICAgIGRlZiB0ZXN0X3dyaXRlbGluZXMoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHdyaXRlbGluZXMgd2l0aCBhIFNwb29sZWRUZW1wb3JhcnlGaWxlCisgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZSgpCisgICAgICAgIGYud3JpdGVsaW5lcygoYid4JywgYid5JywgYid6JykpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBidWYgPSBmLnJlYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZiwgYid4eXonKQorCisgICAgZGVmIHRlc3Rfd3JpdGVsaW5lc19zZXF1ZW50aWFsKHNlbGYpOgorICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgc2hvdWxkIGhvbGQgZXhhY3RseSBtYXhfc2l6ZSBieXRlcywgYW5kIHJvbGwKKyAgICAgICAgIyBvdmVyIGFmdGVyd2FyZAorICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzUpCisgICAgICAgIGYud3JpdGVsaW5lcygoYid4JyAqIDIwLCBiJ3gnICogMTAsIGIneCcgKiA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIGYud3JpdGUoYid4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKworICAgIGRlZiB0ZXN0X3hyZWFkbGluZXMoc2VsZik6CisgICAgICAgIGYgPSBzZWxmLmRvX2NyZWF0ZShtYXhfc2l6ZT0yMCkKKyAgICAgICAgZi53cml0ZShiJ2FiY1xuJyAqIDUpCisgICAgICAgIGYuc2VlaygwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGYueHJlYWRsaW5lcygpKSwgW2InYWJjXG4nXSAqIDUpCisgICAgICAgIGYud3JpdGUoYid4XG55JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKyAgICAgICAgZi5zZWVrKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChmLnhyZWFkbGluZXMoKSksIFtiJ2FiY1xuJ10gKiA1ICsgW2IneFxuJywgYid5J10pCisKKyAgICBkZWYgdGVzdF9zcGFyc2Uoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSB0aGF0IGlzIHdyaXR0ZW4gbGF0ZSBpbiB0aGUgZmlsZSB3aWxsIGV4dGVuZAorICAgICAgICAjIHdoZW4gdGhhdCBvY2N1cnMKKyAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTMwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgZi5zZWVrKDEwMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgIGYud3JpdGUoJ3gnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQorCisgICAgZGVmIHRlc3RfZmlsZW5vKHNlbGYpOgorICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgc2hvdWxkIHJvbGwgb3ZlciB0byBhIHJlYWwgZmlsZSBvbiBmaWxlbm8oKQorICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5maWxlbm8oKSA+IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9jbG9zZV9iZWZvcmVfcm9sbG92ZXIoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgY2xvc2VkIG1hbnkgdGltZXMgd2l0aG91dCBlcnJvcgorICAgICAgICBmID0gdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUoKQorICAgICAgICBmLndyaXRlKCdhYmNcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oImNsb3NlIikKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX2Nsb3NlX2FmdGVyX3JvbGxvdmVyKHNlbGYpOgorICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGJlIGNsb3NlZCBtYW55IHRpbWVzIHdpdGhvdXQgZXJyb3IKKyAgICAgICAgZiA9IHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKG1heF9zaXplPTEpCisgICAgICAgIGYud3JpdGUoJ2FiY1xuJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJjbG9zZSIpCisKKyAgICBkZWYgdGVzdF9ib3VuZF9tZXRob2RzKHNlbGYpOgorICAgICAgICAjIEl0IHNob3VsZCBiZSBPSyB0byBzdGVhbCBhIGJvdW5kIG1ldGhvZCBmcm9tIGEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUKKyAgICAgICAgIyBhbmQgdXNlIGl0IGluZGVwZW5kZW50bHk7IHdoZW4gdGhlIGZpbGUgcm9sbHMgb3ZlciwgdGhvc2UgYm91bmQKKyAgICAgICAgIyBtZXRob2RzIHNob3VsZCBjb250aW51ZSB0byBmdW5jdGlvbgorICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCisgICAgICAgIHJlYWQgPSBmLnJlYWQKKyAgICAgICAgd3JpdGUgPSBmLndyaXRlCisgICAgICAgIHNlZWsgPSBmLnNlZWsKKworICAgICAgICB3cml0ZSgiYSIgKiAzNSkKKyAgICAgICAgd3JpdGUoImIiICogMzUpCisgICAgICAgIHNlZWsoMCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlYWQoNzApID09ICdhJyozNSArICdiJyozNSkKKworICAgIGRlZiB0ZXN0X3Byb3BlcnRpZXMoc2VsZik6CisgICAgICAgIGYgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT0xMCkKKyAgICAgICAgZi53cml0ZShiJ3gnICogMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYubW9kZSwgJ3crYicpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKGYubmFtZSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBmLm5ld2xpbmVzCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgZi5lbmNvZGluZworCisgICAgICAgIGYud3JpdGUoYid4JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLm1vZGUsICd3K2InKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZShmLm5hbWUpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgZi5uZXdsaW5lcworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgICAgIGYuZW5jb2RpbmcKKworICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9iZWZvcmVfcm9sbG92ZXIoc2VsZik6CisgICAgICAgICMgQSBTcG9vbGVkVGVtcG9yYXJ5RmlsZSBjYW4gYmUgdXNlZCBhcyBhIGNvbnRleHQgbWFuYWdlcgorICAgICAgICB3aXRoIHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKG1heF9zaXplPTEpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKyAgICAgICAgZGVmIHVzZV9jbG9zZWQoKToKKyAgICAgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCisKKyAgICBkZWYgdGVzdF9jb250ZXh0X21hbmFnZXJfZHVyaW5nX3JvbGxvdmVyKHNlbGYpOgorICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGJlIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIKKyAgICAgICAgd2l0aCB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT0xKSBhcyBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCisgICAgICAgICAgICBmLndyaXRlKCdhYmNcbicpCisgICAgICAgICAgICBmLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCisgICAgICAgIGRlZiB1c2VfY2xvc2VkKCk6CisgICAgICAgICAgICB3aXRoIGY6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyX2FmdGVyX3JvbGxvdmVyKHNlbGYpOgorICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGJlIHVzZWQgYXMgYSBjb250ZXh0IG1hbmFnZXIKKyAgICAgICAgZiA9IHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKG1heF9zaXplPTEpCisgICAgICAgIGYud3JpdGUoJ2FiY1xuJykKKyAgICAgICAgZi5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCisgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKKyAgICAgICAgZGVmIHVzZV9jbG9zZWQoKToKKyAgICAgICAgICAgIHdpdGggZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCisKKwordGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X1Nwb29sZWRUZW1wb3JhcnlGaWxlKQorCisKK2NsYXNzIHRlc3RfVGVtcG9yYXJ5RmlsZShUQyk6CisgICAgIiIiVGVzdCBUZW1wb3JhcnlGaWxlKCkuIiIiCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBUZW1wb3JhcnlGaWxlIGNhbiBjcmVhdGUgZmlsZXMKKyAgICAgICAgIyBObyBwb2ludCBpbiB0ZXN0aW5nIHRoZSBuYW1lIHBhcmFtcyAtIHRoZSBmaWxlIGhhcyBubyBuYW1lLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oIlRlbXBvcmFyeUZpbGUiKQorCisgICAgZGVmIHRlc3RfaGFzX25vX25hbWUoc2VsZik6CisgICAgICAgICMgVGVtcG9yYXJ5RmlsZSBjcmVhdGVzIGZpbGVzIHdpdGggbm8gbmFtZXMgKG9uIHRoaXMgc3lzdGVtKQorICAgICAgICBkaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKCkKKyAgICAgICAgZiA9IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGUoZGlyPWRpcikKKyAgICAgICAgZi53cml0ZSgnYmxhdCcpCisKKyAgICAgICAgIyBTbmVha3k6IGJlY2F1c2UgdGhpcyBmaWxlIGhhcyBubyBuYW1lLCBpdCBzaG91bGQgbm90IHByZXZlbnQKKyAgICAgICAgIyB1cyBmcm9tIHJlbW92aW5nIHRoZSBkaXJlY3RvcnkgaXQgd2FzIGNyZWF0ZWQgaW4uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZWkgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgIyBjbGVhbnVwCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJtZGlyKGRpcikKKyAgICAgICAgICAgIHNlbGYuZmFpbE9uRXhjZXB0aW9uKCJybWRpciIsIGVpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwbGVfY2xvc2Uoc2VsZik6CisgICAgICAgICMgQSBUZW1wb3JhcnlGaWxlIGNhbiBiZSBjbG9zZWQgbWFueSB0aW1lcyB3aXRob3V0IGVycm9yCisgICAgICAgIGYgPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCkKKyAgICAgICAgZi53cml0ZSgnYWJjXG4nKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsT25FeGNlcHRpb24oImNsb3NlIikKKworICAgICMgSG93IHRvIHRlc3QgdGhlIG1vZGUgYW5kIGJ1ZnNpemUgcGFyYW1ldGVycz8KKworCitpZiB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUgaXMgbm90IHRlbXBmaWxlLlRlbXBvcmFyeUZpbGU6CisgICAgdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X1RlbXBvcmFyeUZpbGUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBzdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZW1wZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZW1wZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwZGYxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZW1wZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZW1wZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwZGYxMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RlbXBmaWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZXh0d3JhcC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RleHR3cmFwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNzI2NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ZXh0d3JhcC5weQpAQCAtMCwwICsxLDY1OCBAQAorIworIyBUZXN0IHN1aXRlIGZvciB0aGUgdGV4dHdyYXAgbW9kdWxlLgorIworIyBPcmlnaW5hbCB0ZXN0cyB3cml0dGVuIGJ5IEdyZWcgV2FyZCA8Z3dhcmRAcHl0aG9uLm5ldD4uCisjIENvbnZlcnRlZCB0byBQeVVuaXQgYnkgUGV0ZXIgSGFuc2VuIDxwZXRlckBlbmdjb3JwLmNvbT4uCisjIEN1cnJlbnRseSBtYWludGFpbmVkIGJ5IEdyZWcgV2FyZC4KKyMKKyMgJElkJAorIworCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2Zyb20gdGV4dHdyYXAgaW1wb3J0IFRleHRXcmFwcGVyLCB3cmFwLCBmaWxsLCBkZWRlbnQKKworCitjbGFzcyBCYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICcnJ1BhcmVudCBjbGFzcyB3aXRoIHV0aWxpdHkgbWV0aG9kcyBmb3IgdGV4dHdyYXAgdGVzdHMuJycnCisKKyAgICBkZWYgc2hvdyhzZWxmLCB0ZXh0aW4pOgorICAgICAgICBpZiBpc2luc3RhbmNlKHRleHRpbiwgbGlzdCk6CisgICAgICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHRleHRpbikpOgorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgJWQ6ICVyIiAlIChpLCB0ZXh0aW5baV0pKQorICAgICAgICAgICAgcmVzdWx0ID0gJ1xuJy5qb2luKHJlc3VsdCkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRleHRpbiwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByZXN1bHQgPSAiICAlc1xuIiAlIHJlcHIodGV4dGluKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKworICAgIGRlZiBjaGVjayhzZWxmLCByZXN1bHQsIGV4cGVjdCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3QsCisgICAgICAgICAgICAnZXhwZWN0ZWQ6XG4lc1xuYnV0IGdvdDpcbiVzJyAlICgKKyAgICAgICAgICAgICAgICBzZWxmLnNob3coZXhwZWN0KSwgc2VsZi5zaG93KHJlc3VsdCkpKQorCisgICAgZGVmIGNoZWNrX3dyYXAoc2VsZiwgdGV4dCwgd2lkdGgsIGV4cGVjdCwgKiprd2FyZ3MpOgorICAgICAgICByZXN1bHQgPSB3cmFwKHRleHQsIHdpZHRoLCAqKmt3YXJncykKKyAgICAgICAgc2VsZi5jaGVjayhyZXN1bHQsIGV4cGVjdCkKKworICAgIGRlZiBjaGVja19zcGxpdChzZWxmLCB0ZXh0LCBleHBlY3QpOgorICAgICAgICByZXN1bHQgPSBzZWxmLndyYXBwZXIuX3NwbGl0KHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlxuZXhwZWN0ZWQgJXJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IGdvdCAgJXIiICUgKGV4cGVjdCwgcmVzdWx0KSkKKworCitjbGFzcyBXcmFwVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi53cmFwcGVyID0gVGV4dFdyYXBwZXIod2lkdGg9NDUpCisKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgICMgU2ltcGxlIGNhc2U6IGp1c3Qgd29yZHMsIHNwYWNlcywgYW5kIGEgYml0IG9mIHB1bmN0dWF0aW9uCisKKyAgICAgICAgdGV4dCA9ICJIZWxsbyB0aGVyZSwgaG93IGFyZSB5b3UgdGhpcyBmaW5lIGRheT8gIEknbSBnbGFkIHRvIGhlYXIgaXQhIgorCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsiSGVsbG8gdGhlcmUsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaG93IGFyZSB5b3UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGlzIGZpbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJkYXk/ICBJJ20iLAorICAgICAgICAgICAgICAgICAgICAgICAgICJnbGFkIHRvIGhlYXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpdCEiXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJIZWxsbyB0aGVyZSwgaG93IGFyZSB5b3UgdGhpcyBmaW5lIGRheT8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICJJJ20gZ2xhZCB0byBoZWFyIGl0ISJdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgODAsIFt0ZXh0XSkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3N0cmluZyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHdyYXBwaW5nIHRoZSBlbXB0eSBzdHJpbmcgcmV0dXJucyBhbiBlbXB0eSBsaXN0LgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiIsIDYsIFtdKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiIsIDYsIFtdLCBkcm9wX3doaXRlc3BhY2U9RmFsc2UpCisKKyAgICBkZWYgdGVzdF9lbXB0eV9zdHJpbmdfd2l0aF9pbml0aWFsX2luZGVudChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBlbXB0eSBzdHJpbmcgaXMgbm90IGluZGVudGVkLgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiIsIDYsIFtdLCBpbml0aWFsX2luZGVudD0iKysiKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiIsIDYsIFtdLCBpbml0aWFsX2luZGVudD0iKysiLCBkcm9wX3doaXRlc3BhY2U9RmFsc2UpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICAjIFdoaXRlc3BhY2UgbXVuZ2luZyBhbmQgZW5kLW9mLXNlbnRlbmNlIGRldGVjdGlvbgorCisgICAgICAgIHRleHQgPSAiIiJcCitUaGlzIGlzIGEgcGFyYWdyYXBoIHRoYXQgYWxyZWFkeSBoYXMKK2xpbmUgYnJlYWtzLiAgQnV0IHNvbWUgb2YgaXRzIGxpbmVzIGFyZSBtdWNoIGxvbmdlciB0aGFuIHRoZSBvdGhlcnMsCitzbyBpdCBuZWVkcyB0byBiZSB3cmFwcGVkLgorU29tZSBsaW5lcyBhcmUgXHR0YWJiZWQgdG9vLgorV2hhdCBhIG1lc3MhCisiIiIKKworICAgICAgICBleHBlY3QgPSBbIlRoaXMgaXMgYSBwYXJhZ3JhcGggdGhhdCBhbHJlYWR5IGhhcyBsaW5lIiwKKyAgICAgICAgICAgICAgICAgICJicmVha3MuICBCdXQgc29tZSBvZiBpdHMgbGluZXMgYXJlIG11Y2giLAorICAgICAgICAgICAgICAgICAgImxvbmdlciB0aGFuIHRoZSBvdGhlcnMsIHNvIGl0IG5lZWRzIHRvIGJlIiwKKyAgICAgICAgICAgICAgICAgICJ3cmFwcGVkLiAgU29tZSBsaW5lcyBhcmUgIHRhYmJlZCB0b28uICBXaGF0IGEiLAorICAgICAgICAgICAgICAgICAgIm1lc3MhIl0KKworICAgICAgICB3cmFwcGVyID0gVGV4dFdyYXBwZXIoNDUsIGZpeF9zZW50ZW5jZV9lbmRpbmdzPVRydWUpCisgICAgICAgIHJlc3VsdCA9IHdyYXBwZXIud3JhcCh0ZXh0KQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgZXhwZWN0KQorCisgICAgICAgIHJlc3VsdCA9IHdyYXBwZXIuZmlsbCh0ZXh0KQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgJ1xuJy5qb2luKGV4cGVjdCkpCisKKyAgICBkZWYgdGVzdF9maXhfc2VudGVuY2VfZW5kaW5ncyhzZWxmKToKKyAgICAgICAgd3JhcHBlciA9IFRleHRXcmFwcGVyKDYwLCBmaXhfc2VudGVuY2VfZW5kaW5ncz1UcnVlKQorCisgICAgICAgICMgU0YgIzg0NzM0NjogZW5zdXJlIHRoYXQgZml4X3NlbnRlbmNlX2VuZGluZ3M9VHJ1ZSBkb2VzIHRoZQorICAgICAgICAjIHJpZ2h0IHRoaW5nIGV2ZW4gb24gaW5wdXQgc2hvcnQgZW5vdWdoIHRoYXQgaXQgZG9lc24ndCBuZWVkIHRvCisgICAgICAgICMgYmUgd3JhcHBlZC4KKyAgICAgICAgdGV4dCA9ICJBIHNob3J0IGxpbmUuIE5vdGUgdGhlIHNpbmdsZSBzcGFjZS4iCisgICAgICAgIGV4cGVjdCA9IFsiQSBzaG9ydCBsaW5lLiAgTm90ZSB0aGUgc2luZ2xlIHNwYWNlLiJdCisgICAgICAgIHNlbGYuY2hlY2sod3JhcHBlci53cmFwKHRleHQpLCBleHBlY3QpCisKKyAgICAgICAgIyBUZXN0IHNvbWUgb2YgdGhlIGhhaXJ5IGVuZCBjYXNlcyB0aGF0IF9maXhfc2VudGVuY2VfZW5kaW5ncygpCisgICAgICAgICMgaXMgc3VwcG9zZWQgdG8gaGFuZGxlICh0aGUgZWFzeSBzdHVmZiBpcyB0ZXN0ZWQgaW4KKyAgICAgICAgIyB0ZXN0X3doaXRlc3BhY2UoKSBhYm92ZSkuCisgICAgICAgIHRleHQgPSAiV2VsbCwgRG9jdG9yPyBXaGF0IGRvIHlvdSB0aGluaz8iCisgICAgICAgIGV4cGVjdCA9IFsiV2VsbCwgRG9jdG9yPyAgV2hhdCBkbyB5b3UgdGhpbms/Il0KKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgICAgICB0ZXh0ID0gIldlbGwsIERvY3Rvcj9cbldoYXQgZG8geW91IHRoaW5rPyIKKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgICAgICB0ZXh0ID0gJ0kgc2F5LCBjaGFwcyEgQW55b25lIGZvciAidGVubmlzPyJcbkhtbXBoIScKKyAgICAgICAgZXhwZWN0ID0gWydJIHNheSwgY2hhcHMhICBBbnlvbmUgZm9yICJ0ZW5uaXM/IiAgSG1tcGghJ10KKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgICAgICB3cmFwcGVyLndpZHRoID0gMjAKKyAgICAgICAgZXhwZWN0ID0gWydJIHNheSwgY2hhcHMhJywgJ0FueW9uZSBmb3IgInRlbm5pcz8iJywgJ0htbXBoISddCisgICAgICAgIHNlbGYuY2hlY2sod3JhcHBlci53cmFwKHRleHQpLCBleHBlY3QpCisKKyAgICAgICAgdGV4dCA9ICdBbmQgc2hlIHNhaWQsICJHbyB0byBoZWxsISJcbkNhbiB5b3UgYmVsaWV2ZSB0aGF0PycKKyAgICAgICAgZXhwZWN0ID0gWydBbmQgc2hlIHNhaWQsICJHbyB0bycsCisgICAgICAgICAgICAgICAgICAnaGVsbCEiICBDYW4geW91JywKKyAgICAgICAgICAgICAgICAgICdiZWxpZXZlIHRoYXQ/J10KKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgICAgICB3cmFwcGVyLndpZHRoID0gNjAKKyAgICAgICAgZXhwZWN0ID0gWydBbmQgc2hlIHNhaWQsICJHbyB0byBoZWxsISIgIENhbiB5b3UgYmVsaWV2ZSB0aGF0PyddCisgICAgICAgIHNlbGYuY2hlY2sod3JhcHBlci53cmFwKHRleHQpLCBleHBlY3QpCisKKyAgICAgICAgdGV4dCA9ICdGaWxlIHN0ZGlvLmggaXMgbmljZS4nCisgICAgICAgIGV4cGVjdCA9IFsnRmlsZSBzdGRpby5oIGlzIG5pY2UuJ10KKyAgICAgICAgc2VsZi5jaGVjayh3cmFwcGVyLndyYXAodGV4dCksIGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X3dyYXBfc2hvcnQoc2VsZik6CisgICAgICAgICMgV3JhcHBpbmcgdG8gbWFrZSBzaG9ydCBsaW5lcyBsb25nZXIKKworICAgICAgICB0ZXh0ID0gIlRoaXMgaXMgYVxuc2hvcnQgcGFyYWdyYXBoLiIKKworICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMjAsIFsiVGhpcyBpcyBhIHNob3J0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFncmFwaC4iXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDQwLCBbIlRoaXMgaXMgYSBzaG9ydCBwYXJhZ3JhcGguIl0pCisKKworICAgIGRlZiB0ZXN0X3dyYXBfc2hvcnRfMWxpbmUoc2VsZik6CisgICAgICAgICMgVGVzdCBlbmRjYXNlcworCisgICAgICAgIHRleHQgPSAiVGhpcyBpcyBhIHNob3J0IGxpbmUuIgorCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzMCwgWyJUaGlzIGlzIGEgc2hvcnQgbGluZS4iXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDMwLCBbIigxKSBUaGlzIGlzIGEgc2hvcnQgbGluZS4iXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxfaW5kZW50PSIoMSkgIikKKworCisgICAgZGVmIHRlc3RfaHlwaGVuYXRlZChzZWxmKToKKyAgICAgICAgIyBUZXN0IGJyZWFraW5nIGh5cGhlbmF0ZWQgd29yZHMKKworICAgICAgICB0ZXh0ID0gKCJ0aGlzLWlzLWEtdXNlZnVsLWZlYXR1cmUtZm9yLSIKKyAgICAgICAgICAgICAgICAicmVmb3JtYXR0aW5nLXBvc3RzLWZyb20tdGltLXBldGVycydseSIpCisKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDQwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJ0aGlzLWlzLWEtdXNlZnVsLWZlYXR1cmUtZm9yLSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlZm9ybWF0dGluZy1wb3N0cy1mcm9tLXRpbS1wZXRlcnMnbHkiXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDQxLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJ0aGlzLWlzLWEtdXNlZnVsLWZlYXR1cmUtZm9yLSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlZm9ybWF0dGluZy1wb3N0cy1mcm9tLXRpbS1wZXRlcnMnbHkiXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJ0aGlzLWlzLWEtdXNlZnVsLWZlYXR1cmUtZm9yLXJlZm9ybWF0dGluZy0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICJwb3N0cy1mcm9tLXRpbS1wZXRlcnMnbHkiXSkKKworICAgIGRlZiB0ZXN0X2h5cGhlbmF0ZWRfbnVtYmVycyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgaHlwaGVuYXRlZCBudW1iZXJzIChlZy4gZGF0ZXMpIGFyZSBub3QgYnJva2VuIGxpa2Ugd29yZHMuCisgICAgICAgIHRleHQgPSAoIlB5dGhvbiAxLjAuMCB3YXMgcmVsZWFzZWQgb24gMTk5NC0wMS0yNi4gIFB5dGhvbiAxLjAuMSB3YXNcbiIKKyAgICAgICAgICAgICAgICAicmVsZWFzZWQgb24gMTk5NC0wMi0xNS4iKQorCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzNSwgWydQeXRob24gMS4wLjAgd2FzIHJlbGVhc2VkIG9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzE5OTQtMDEtMjYuICBQeXRob24gMS4wLjEgd2FzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbGVhc2VkIG9uIDE5OTQtMDItMTUuJ10pCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA0MCwgWydQeXRob24gMS4wLjAgd2FzIHJlbGVhc2VkIG9uIDE5OTQtMDEtMjYuJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1B5dGhvbiAxLjAuMSB3YXMgcmVsZWFzZWQgb24gMTk5NC0wMi0xNS4nXSkKKworICAgICAgICB0ZXh0ID0gIkkgZG8gYWxsIG15IHNob3BwaW5nIGF0IDctMTEuIgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMjUsIFsiSSBkbyBhbGwgbXkgc2hvcHBpbmcgYXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNy0xMS4iXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDI3LCBbIkkgZG8gYWxsIG15IHNob3BwaW5nIGF0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjctMTEuIl0pCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAyOSwgWyJJIGRvIGFsbCBteSBzaG9wcGluZyBhdCA3LTExLiJdKQorCisgICAgZGVmIHRlc3RfZW1fZGFzaChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRleHQgd2l0aCBlbS1kYXNoZXMKKyAgICAgICAgdGV4dCA9ICJFbS1kYXNoZXMgc2hvdWxkIGJlIHdyaXR0ZW4gLS0gdGh1cy4iCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsiRW0tZGFzaGVzIHNob3VsZCBiZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIndyaXR0ZW4gLS0gdGh1cy4iXSkKKworICAgICAgICAjIFByb2JlIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBwcm9wZXJseSB3cml0dGVuIGVtLWRhc2gsCisgICAgICAgICMgaWUuICIgLS0gIi4KKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDI5LAorICAgICAgICAgICAgICAgICAgICAgICAgWyJFbS1kYXNoZXMgc2hvdWxkIGJlIHdyaXR0ZW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICItLSB0aHVzLiJdKQorICAgICAgICBleHBlY3QgPSBbIkVtLWRhc2hlcyBzaG91bGQgYmUgd3JpdHRlbiAtLSIsCisgICAgICAgICAgICAgICAgICAidGh1cy4iXQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzAsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDM1LCBleHBlY3QpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzNiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsiRW0tZGFzaGVzIHNob3VsZCBiZSB3cml0dGVuIC0tIHRodXMuIl0pCisKKyAgICAgICAgIyBUaGUgaW1wcm9wZXJseSB3cml0dGVuIGVtLWRhc2ggaXMgaGFuZGxlZCB0b28sIGJlY2F1c2UKKyAgICAgICAgIyBpdCdzIGFkamFjZW50IHRvIG5vbi13aGl0ZXNwYWNlIG9uIGJvdGggc2lkZXMuCisgICAgICAgIHRleHQgPSAiWW91IGNhbiBhbHNvIGRvLS10aGlzIG9yIGV2ZW4tLS10aGlzLiIKKyAgICAgICAgZXhwZWN0ID0gWyJZb3UgY2FuIGFsc28gZG8iLAorICAgICAgICAgICAgICAgICAgIi0tdGhpcyBvciBldmVuIiwKKyAgICAgICAgICAgICAgICAgICItLS10aGlzLiJdCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAxNSwgZXhwZWN0KQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMTYsIGV4cGVjdCkKKyAgICAgICAgZXhwZWN0ID0gWyJZb3UgY2FuIGFsc28gZG8tLSIsCisgICAgICAgICAgICAgICAgICAidGhpcyBvciBldmVuLS0tIiwKKyAgICAgICAgICAgICAgICAgICJ0aGlzLiJdCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAxNywgZXhwZWN0KQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMTksIGV4cGVjdCkKKyAgICAgICAgZXhwZWN0ID0gWyJZb3UgY2FuIGFsc28gZG8tLXRoaXMgb3IgZXZlbiIsCisgICAgICAgICAgICAgICAgICAiLS0tdGhpcy4iXQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMjksIGV4cGVjdCkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDMxLCBleHBlY3QpCisgICAgICAgIGV4cGVjdCA9IFsiWW91IGNhbiBhbHNvIGRvLS10aGlzIG9yIGV2ZW4tLS0iLAorICAgICAgICAgICAgICAgICAgInRoaXMuIl0KKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDMyLCBleHBlY3QpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzNSwgZXhwZWN0KQorCisgICAgICAgICMgQWxsIG9mIHRoZSBhYm92ZSBiZWhhdmlvdXIgY291bGQgYmUgZGVkdWNlZCBieSBwcm9iaW5nIHRoZQorICAgICAgICAjIF9zcGxpdCgpIG1ldGhvZC4KKyAgICAgICAgdGV4dCA9ICJIZXJlJ3MgYW4gLS0gZW0tZGFzaCBhbmQtLWhlcmUncyBhbm90aGVyLS0tYW5kIGFub3RoZXIhIgorICAgICAgICBleHBlY3QgPSBbIkhlcmUncyIsICIgIiwgImFuIiwgIiAiLCAiLS0iLCAiICIsICJlbS0iLCAiZGFzaCIsICIgIiwKKyAgICAgICAgICAgICAgICAgICJhbmQiLCAiLS0iLCAiaGVyZSdzIiwgIiAiLCAiYW5vdGhlciIsICItLS0iLAorICAgICAgICAgICAgICAgICAgImFuZCIsICIgIiwgImFub3RoZXIhIl0KKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCh0ZXh0LCBleHBlY3QpCisKKyAgICAgICAgdGV4dCA9ICJhbmQgdGhlbi0tYmFtIS0taGUgd2FzIGdvbmUiCisgICAgICAgIGV4cGVjdCA9IFsiYW5kIiwgIiAiLCAidGhlbiIsICItLSIsICJiYW0hIiwgIi0tIiwKKyAgICAgICAgICAgICAgICAgICJoZSIsICIgIiwgIndhcyIsICIgIiwgImdvbmUiXQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KHRleHQsIGV4cGVjdCkKKworCisgICAgZGVmIHRlc3RfdW5peF9vcHRpb25zIChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgVW5peC1zdHlsZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgd3JhcHBlZCBjb3JyZWN0bHkuCisgICAgICAgICMgQm90aCBPcHRpayAoT3B0aW9uUGFyc2VyKSBhbmQgRG9jdXRpbHMgcmVseSBvbiB0aGlzIGJlaGF2aW91ciEKKworICAgICAgICB0ZXh0ID0gIllvdSBzaG91bGQgdXNlIHRoZSAtbiBvcHRpb24sIG9yIC0tZHJ5LXJ1biBpbiBpdHMgbG9uZyBmb3JtLiIKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyJZb3Ugc2hvdWxkIHVzZSB0aGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICItbiBvcHRpb24sIG9yIC0tZHJ5LSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgInJ1biBpbiBpdHMgbG9uZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImZvcm0uIl0pCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsiWW91IHNob3VsZCB1c2UgdGhlIC1uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uLCBvciAtLWRyeS1ydW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbiBpdHMgbG9uZyBmb3JtLiJdKQorICAgICAgICBleHBlY3QgPSBbIllvdSBzaG91bGQgdXNlIHRoZSAtbiBvcHRpb24sIG9yIiwKKyAgICAgICAgICAgICAgICAgICItLWRyeS1ydW4gaW4gaXRzIGxvbmcgZm9ybS4iXQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzIsIGV4cGVjdCkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDM0LCBleHBlY3QpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzNSwgZXhwZWN0KQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgMzgsIGV4cGVjdCkKKyAgICAgICAgZXhwZWN0ID0gWyJZb3Ugc2hvdWxkIHVzZSB0aGUgLW4gb3B0aW9uLCBvciAtLWRyeS0iLAorICAgICAgICAgICAgICAgICAgInJ1biBpbiBpdHMgbG9uZyBmb3JtLiJdCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAzOSwgZXhwZWN0KQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNDEsIGV4cGVjdCkKKyAgICAgICAgZXhwZWN0ID0gWyJZb3Ugc2hvdWxkIHVzZSB0aGUgLW4gb3B0aW9uLCBvciAtLWRyeS1ydW4iLAorICAgICAgICAgICAgICAgICAgImluIGl0cyBsb25nIGZvcm0uIl0KKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDQyLCBleHBlY3QpCisKKyAgICAgICAgIyBBZ2FpbiwgYWxsIG9mIHRoZSBhYm92ZSBjYW4gYmUgZGVkdWNlZCBmcm9tIF9zcGxpdCgpLgorICAgICAgICB0ZXh0ID0gInRoZSAtbiBvcHRpb24sIG9yIC0tZHJ5LXJ1biBvciAtLWRyeXJ1biIKKyAgICAgICAgZXhwZWN0ID0gWyJ0aGUiLCAiICIsICItbiIsICIgIiwgIm9wdGlvbiwiLCAiICIsICJvciIsICIgIiwKKyAgICAgICAgICAgICAgICAgICItLWRyeS0iLCAicnVuIiwgIiAiLCAib3IiLCAiICIsICItLWRyeXJ1biJdCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQodGV4dCwgZXhwZWN0KQorCisgICAgZGVmIHRlc3RfZnVua3lfaHlwaGVucyAoc2VsZik6CisgICAgICAgICMgU2NyZXd5IGVkZ2UgY2FzZXMgY29va2VkIHVwIGJ5IERhdmlkIEdvb2RnZXIuICBBbGwgcmVwb3J0ZWQKKyAgICAgICAgIyBpbiBTRiBidWcgIzU5NjQzNC4KKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgid2hhdCB0aGUtLWhleSEiLCBbIndoYXQiLCAiICIsICJ0aGUiLCAiLS0iLCAiaGV5ISJdKQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCJ3aGF0IHRoZS0tIiwgWyJ3aGF0IiwgIiAiLCAidGhlLS0iXSkKKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgid2hhdCB0aGUtLS4iLCBbIndoYXQiLCAiICIsICJ0aGUtLS4iXSkKKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgiLS10ZXh0LS0uIiwgWyItLXRleHQtLS4iXSkKKworICAgICAgICAjIFdoZW4gSSBmaXJzdCByZWFkIGJ1ZyAjNTk2NDM0LCB0aGlzIGlzIHdoYXQgSSB0aG91Z2h0IERhdmlkCisgICAgICAgICMgd2FzIHRhbGtpbmcgYWJvdXQuICBJIHdhcyB3cm9uZzsgdGhlc2UgaGF2ZSBhbHdheXMgd29ya2VkCisgICAgICAgICMgZmluZS4gIFRoZSByZWFsIHByb2JsZW0gaXMgdGVzdGVkIGluIHRlc3RfZnVua3lfcGFyZW5zKCkKKyAgICAgICAgIyBiZWxvdy4uLgorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCItLW9wdGlvbiIsIFsiLS1vcHRpb24iXSkKKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgiLS1vcHRpb24tb3B0IiwgWyItLW9wdGlvbi0iLCAib3B0Il0pCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoImZvbyAtLW9wdGlvbi1vcHQgYmFyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImZvbyIsICIgIiwgIi0tb3B0aW9uLSIsICJvcHQiLCAiICIsICJiYXIiXSkKKworICAgIGRlZiB0ZXN0X3B1bmN0X2h5cGhlbnMoc2VsZik6CisgICAgICAgICMgT2ggYm90aGVyLCBTRiAjOTY1NDI1IGZvdW5kIGFub3RoZXIgcHJvYmxlbSB3aXRoIGh5cGhlbnMgLS0KKyAgICAgICAgIyBoeXBoZW5hdGVkIHdvcmRzIGluIHNpbmdsZSBxdW90ZXMgd2VyZW4ndCBoYW5kbGVkIGNvcnJlY3RseS4KKyAgICAgICAgIyBJbiBmYWN0LCB0aGUgYnVnIGlzIHRoYXQgKmFueSogcHVuY3R1YXRpb24gYXJvdW5kIGEgaHlwaGVuYXRlZAorICAgICAgICAjIHdvcmQgd2FzIGhhbmRsZWQgaW5jb3JyZWN0bHksIGV4Y2VwdCBmb3IgYSBsZWFkaW5nICItLSIsIHdoaWNoCisgICAgICAgICMgd2FzIHNwZWNpYWwtY2FzZWQgZm9yIE9wdGlrIGFuZCBEb2N1dGlscy4gIFNvIHRlc3QgYSB2YXJpZXR5CisgICAgICAgICMgb2Ygc3R5bGVzIG9mIHB1bmN0dWF0aW9uIGFyb3VuZCBhIGh5cGhlbmF0ZWQgd29yZC4KKyAgICAgICAgIyAoQWN0dWFsbHkgdGhpcyBpcyBiYXNlZCBvbiBhbiBPcHRpayBidWcgcmVwb3J0LCAjODEzMDc3KS4KKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgidGhlICd3aWJibGUtd29iYmxlJyB3aWRnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsndGhlJywgJyAnLCAiJ3dpYmJsZS0iLCAid29iYmxlJyIsICcgJywgJ3dpZGdldCddKQorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCd0aGUgIndpYmJsZS13b2JibGUiIHdpZGdldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyd0aGUnLCAnICcsICcid2liYmxlLScsICd3b2JibGUiJywgJyAnLCAnd2lkZ2V0J10pCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoInRoZSAod2liYmxlLXdvYmJsZSkgd2lkZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ3RoZScsICcgJywgIih3aWJibGUtIiwgIndvYmJsZSkiLCAnICcsICd3aWRnZXQnXSkKKyAgICAgICAgc2VsZi5jaGVja19zcGxpdCgidGhlIFsnd2liYmxlLXdvYmJsZSddIHdpZGdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyd0aGUnLCAnICcsICJbJ3dpYmJsZS0iLCAid29iYmxlJ10iLCAnICcsICd3aWRnZXQnXSkKKworICAgIGRlZiB0ZXN0X2Z1bmt5X3BhcmVucyAoc2VsZik6CisgICAgICAgICMgU2Vjb25kIHBhcnQgb2YgU0YgYnVnICM1OTY0MzQ6IGxvbmcgb3B0aW9uIHN0cmluZ3MgaW5zaWRlCisgICAgICAgICMgcGFyZW50aGVzZXMuCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoImZvbyAoLS1vcHRpb24pIGJhciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgWyJmb28iLCAiICIsICIoLS1vcHRpb24pIiwgIiAiLCAiYmFyIl0pCisKKyAgICAgICAgIyBSZWxhdGVkIHN0dWZmIC0tIG1ha2Ugc3VyZSBwYXJlbnMgd29yayBpbiBzaW1wbGVyIGNvbnRleHRzLgorICAgICAgICBzZWxmLmNoZWNrX3NwbGl0KCJmb28gKGJhcikgYmF6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImZvbyIsICIgIiwgIihiYXIpIiwgIiAiLCAiYmF6Il0pCisgICAgICAgIHNlbGYuY2hlY2tfc3BsaXQoImJsYWggKGRpbmcgZG9uZyksIHd1YmJhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbImJsYWgiLCAiICIsICIoZGluZyIsICIgIiwgImRvbmcpLCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiwgInd1YmJhIl0pCisKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2VfZmFsc2Uoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBkcm9wX3doaXRlc3BhY2U9RmFsc2UgcHJlc2VydmVzIHdoaXRlc3BhY2UuCisgICAgICAgICMgU0YgcGF0Y2ggIzE1ODEwNzMKKyAgICAgICAgdGV4dCA9ICIgVGhpcyBpcyBhICAgIHNlbnRlbmNlIHdpdGggICAgIG11Y2ggd2hpdGVzcGFjZS4iCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsiIFRoaXMgaXMgYSIsICIgICAgIiwgInNlbnRlbmNlICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggICAgICIsICJtdWNoIHdoaXRlIiwgInNwYWNlLiJdLAorICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPUZhbHNlKQorCisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX2ZhbHNlX3doaXRlc3BhY2Vfb25seShzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGRyb3Bfd2hpdGVzcGFjZT1GYWxzZSBwcmVzZXJ2ZXMgYSB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiAgICIsIDYsIFsiICAgIl0sIGRyb3Bfd2hpdGVzcGFjZT1GYWxzZSkKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV9mYWxzZV93aGl0ZXNwYWNlX29ubHlfd2l0aF9pbmRlbnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBhIHdoaXRlc3BhY2Utb25seSBzdHJpbmcgZ2V0cyBpbmRlbnRlZCAod2hlbgorICAgICAgICAjIGRyb3Bfd2hpdGVzcGFjZSBpcyBGYWxzZSkuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiICAgIiwgNiwgWyIgICAgICJdLCBkcm9wX3doaXRlc3BhY2U9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD0iICAiKQorCisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX3doaXRlc3BhY2Vfb25seShzZWxmKToKKyAgICAgICAgIyBDaGVjayBkcm9wX3doaXRlc3BhY2Ugb24gYSB3aGl0ZXNwYWNlLW9ubHkgc3RyaW5nLgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiAgIiwgNiwgW10pCisKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2VfbGVhZGluZ193aGl0ZXNwYWNlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgZHJvcF93aGl0ZXNwYWNlIGRvZXMgbm90IGRyb3AgbGVhZGluZyB3aGl0ZXNwYWNlIChpZgorICAgICAgICAjIGZvbGxvd2VkIGJ5IG5vbi13aGl0ZXNwYWNlKS4KKyAgICAgICAgIyBTRiBidWcgIzYyMjg0OSByZXBvcnRlZCBpbmNvbnNpc3RlbnQgaGFuZGxpbmcgb2YgbGVhZGluZworICAgICAgICAjIHdoaXRlc3BhY2U7IGxldCdzIHRlc3QgdGhhdCBhIGJpdCwgc2hhbGwgd2U/CisgICAgICAgIHRleHQgPSAiIFRoaXMgaXMgYSBzZW50ZW5jZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZS4iCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsiIFRoaXMgaXMgYSBzZW50ZW5jZSB3aXRoIGxlYWRpbmcgd2hpdGVzcGFjZS4iXSkKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDMwLAorICAgICAgICAgICAgICAgICAgICAgICAgWyIgVGhpcyBpcyBhIHNlbnRlbmNlIHdpdGgiLCAibGVhZGluZyB3aGl0ZXNwYWNlLiJdKQorCisgICAgZGVmIHRlc3RfZHJvcF93aGl0ZXNwYWNlX3doaXRlc3BhY2VfbGluZShzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGRyb3Bfd2hpdGVzcGFjZSBza2lwcyB0aGUgd2hvbGUgbGluZSBpZiBhIG5vbi1sZWFkaW5nCisgICAgICAgICMgbGluZSBjb25zaXN0cyBvbmx5IG9mIHdoaXRlc3BhY2UuCisgICAgICAgIHRleHQgPSAiYWJjZCAgICBlZmdoIgorICAgICAgICAjIEluY2x1ZGUgdGhlIHJlc3VsdCBmb3IgZHJvcF93aGl0ZXNwYWNlPUZhbHNlIGZvciBjb21wYXJpc29uLgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNiwgWyJhYmNkIiwgIiAgICAiLCAiZWZnaCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPUZhbHNlKQorICAgICAgICBzZWxmLmNoZWNrX3dyYXAodGV4dCwgNiwgWyJhYmNkIiwgImVmZ2giXSkKKworICAgIGRlZiB0ZXN0X2Ryb3Bfd2hpdGVzcGFjZV93aGl0ZXNwYWNlX29ubHlfd2l0aF9pbmRlbnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBpbml0aWFsX2luZGVudCBpcyBub3QgYXBwbGllZCB0byBhIHdoaXRlc3BhY2Utb25seQorICAgICAgICAjIHN0cmluZy4gIFRoaXMgY2hlY2tzIGEgc3BlY2lhbCBjYXNlIG9mIHRoZSBmYWN0IHRoYXQgZHJvcHBpbmcKKyAgICAgICAgIyB3aGl0ZXNwYWNlIG9jY3VycyBiZWZvcmUgaW5kZW50aW5nLgorICAgICAgICBzZWxmLmNoZWNrX3dyYXAoIiAgIiwgNiwgW10sIGluaXRpYWxfaW5kZW50PSIrKyIpCisKKyAgICBkZWYgdGVzdF9kcm9wX3doaXRlc3BhY2Vfd2hpdGVzcGFjZV9pbmRlbnQoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBkcm9wX3doaXRlc3BhY2UgZG9lcyBub3QgZHJvcCB3aGl0ZXNwYWNlIGluZGVudHMuCisgICAgICAgICMgVGhpcyBjaGVja3MgYSBzcGVjaWFsIGNhc2Ugb2YgdGhlIGZhY3QgdGhhdCBkcm9wcGluZyB3aGl0ZXNwYWNlCisgICAgICAgICMgb2NjdXJzIGJlZm9yZSBpbmRlbnRpbmcuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgiYWJjZCBlZmdoIiwgNiwgWyIgIGFiY2QiLCAiICBlZmdoIl0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsX2luZGVudD0iICAiLCBzdWJzZXF1ZW50X2luZGVudD0iICAiKQorCisgICAgaWYgdGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKKyAgICAgICAgZGVmIHRlc3RfdW5pY29kZShzZWxmKToKKyAgICAgICAgICAgICMgKlZlcnkqIHNpbXBsZSB0ZXN0IG9mIHdyYXBwaW5nIFVuaWNvZGUgc3RyaW5ncy4gIEknbSBzdXJlCisgICAgICAgICAgICAjIHRoZXJlJ3MgbW9yZSB0byBpdCB0aGFuIHRoaXMsIGJ1dCBsZXQncyBhdCBsZWFzdCBtYWtlCisgICAgICAgICAgICAjIHN1cmUgdGV4dHdyYXAgZG9lc24ndCBjcmFzaCBvbiBVbmljb2RlIGlucHV0IQorICAgICAgICAgICAgdGV4dCA9IHUiSGVsbG8gdGhlcmUsIGhvdyBhcmUgeW91IHRvZGF5PyIKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCA1MCwgW3UiSGVsbG8gdGhlcmUsIGhvdyBhcmUgeW91IHRvZGF5PyJdKQorICAgICAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDIwLCBbdSJIZWxsbyB0aGVyZSwgaG93IGFyZSIsICJ5b3UgdG9kYXk/Il0pCisgICAgICAgICAgICBvbGluZXMgPSBzZWxmLndyYXBwZXIud3JhcCh0ZXh0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG9saW5lcywgbGlzdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvbGluZXNbMF0sIHVuaWNvZGUpCisgICAgICAgICAgICBvdGV4dCA9IHNlbGYud3JhcHBlci5maWxsKHRleHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob3RleHQsIHVuaWNvZGUpCisKKyAgICAgICAgZGVmIHRlc3Rfbm9fc3BsaXRfYXRfdW1sYXV0KHNlbGYpOgorICAgICAgICAgICAgdGV4dCA9IHUiRGllIEVtcGZceGU0bmdlci1BdXN3YWhsIgorICAgICAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDEzLCBbdSJEaWUiLCB1IkVtcGZceGU0bmdlci0iLCB1IkF1c3dhaGwiXSkKKworICAgICAgICBkZWYgdGVzdF91bWxhdXRfZm9sbG93ZWRfYnlfZGFzaChzZWxmKToKKyAgICAgICAgICAgIHRleHQgPSB1ImFhIFx4ZTRceGU0LVx4ZTRceGU0IgorICAgICAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDcsIFt1ImFhIFx4ZTRceGU0LSIsIHUiXHhlNFx4ZTQiXSkKKworICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBzdGFuZGFyZCBfc3BsaXQoKSBtZXRob2Qgd29ya3MgYXMgYWR2ZXJ0aXNlZAorICAgICAgICAjIGluIHRoZSBjb21tZW50cworCisgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hIgorCisgICAgICAgIHJlc3VsdCA9IHNlbGYud3JhcHBlci5fc3BsaXQodGV4dCkKKyAgICAgICAgc2VsZi5jaGVjayhyZXN1bHQsCisgICAgICAgICAgICAgWyJIZWxsbyIsICIgIiwgInRoZXJlIiwgIiAiLCAiLS0iLCAiICIsICJ5b3UiLCAiICIsICJnb29mLSIsCisgICAgICAgICAgICAgICJiYWxsLCIsICIgIiwgInVzZSIsICIgIiwgInRoZSIsICIgIiwgIi1iIiwgIiAiLCAgIm9wdGlvbiEiXSkKKworICAgIGRlZiB0ZXN0X2JyZWFrX29uX2h5cGhlbnMoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIGJyZWFrX29uX2h5cGhlbnMgYXR0cmlidXRlcyB3b3JrCisgICAgICAgIHRleHQgPSAieWFiYSBkYWJhLWRvbyIKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHRleHQsIDEwLCBbInlhYmEgZGFiYS0iLCAiZG9vIl0sCisgICAgICAgICAgICAgICAgICAgICAgICBicmVha19vbl9oeXBoZW5zPVRydWUpCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCh0ZXh0LCAxMCwgWyJ5YWJhIiwgImRhYmEtZG9vIl0sCisgICAgICAgICAgICAgICAgICAgICAgICBicmVha19vbl9oeXBoZW5zPUZhbHNlKQorCisgICAgZGVmIHRlc3RfYmFkX3dpZHRoKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IHdpZHRoIDw9IDAgaXMgY2F1Z2h0LgorICAgICAgICB0ZXh0ID0gIldoYXRldmVyLCBpdCBkb2Vzbid0IG1hdHRlci4iCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHdyYXAsIHRleHQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHdyYXAsIHRleHQsIC0xKQorCisKK2NsYXNzIExvbmdXb3JkVGVzdENhc2UgKEJhc2VUZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLndyYXBwZXIgPSBUZXh0V3JhcHBlcigpCisgICAgICAgIHNlbGYudGV4dCA9ICcnJ1wKK0RpZCB5b3Ugc2F5ICJzdXBlcmNhbGlmcmFnaWxpc3RpY2V4cGlhbGlkb2Npb3VzPyIKK0hvdyAqZG8qIHlvdSBzcGVsbCB0aGF0IG9kZCB3b3JkLCBhbnl3YXlzPworJycnCisKKyAgICBkZWYgdGVzdF9icmVha19sb25nKHNlbGYpOgorICAgICAgICAjIFdyYXAgdGV4dCB3aXRoIGxvbmcgd29yZHMgYW5kIGxvdHMgb2YgcHVuY3R1YXRpb24KKworICAgICAgICBzZWxmLmNoZWNrX3dyYXAoc2VsZi50ZXh0LCAzMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsnRGlkIHlvdSBzYXkgInN1cGVyY2FsaWZyYWdpbGlzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGljZXhwaWFsaWRvY2lvdXM/IiBIb3cgKmRvKicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3lvdSBzcGVsbCB0aGF0IG9kZCB3b3JkLCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FueXdheXM/J10pCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcChzZWxmLnRleHQsIDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgWydEaWQgeW91IHNheSAic3VwZXJjYWxpZnJhZ2lsaXN0aWNleHBpYWxpZG9jaW91cz8iJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnSG93ICpkbyogeW91IHNwZWxsIHRoYXQgb2RkIHdvcmQsIGFueXdheXM/J10pCisKKyAgICAgICAgIyBTRiBidWcgNzk3NjUwLiAgUHJldmVudCBhbiBpbmZpbml0ZSBsb29wIGJ5IG1ha2luZyBzdXJlIHRoYXQgYXQKKyAgICAgICAgIyBsZWFzdCBvbmUgY2hhcmFjdGVyIGdldHMgc3BsaXQgb2ZmIG9uIGV2ZXJ5IHBhc3MuCisgICAgICAgIHNlbGYuY2hlY2tfd3JhcCgnLScqMTArJ2hlbGxvJywgMTAsCisgICAgICAgICAgICAgICAgICAgICAgICBbJy0tLS0tLS0tLS0nLAorICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICBoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJyAgICAgICAgICAgICAgIGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgICAgICAgICAgICBsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgbyddLAorICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2VxdWVudF9pbmRlbnQgPSAnICcqMTUpCisKKyAgICAgICAgIyBidWcgMTE0Ni4gIFByZXZlbnQgYSBsb25nIHdvcmQgdG8gYmUgd3JvbmdseSB3cmFwcGVkIHdoZW4gdGhlCisgICAgICAgICMgcHJlY2VkaW5nIHdvcmQgaXMgZXhhY3RseSBvbmUgY2hhcmFjdGVyIHNob3J0ZXIgdGhhbiB0aGUgd2lkdGgKKyAgICAgICAgc2VsZi5jaGVja193cmFwKHNlbGYudGV4dCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICBbJ0RpZCB5b3Ugc2F5ICcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJyJzdXBlcmNhbGlmcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FnaWxpc3RpY2V4cCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2lhbGlkb2Npb3VzPycsCisgICAgICAgICAgICAgICAgICAgICAgICAgJyIgSG93ICpkbyonLAorICAgICAgICAgICAgICAgICAgICAgICAgICd5b3Ugc3BlbGwnLAorICAgICAgICAgICAgICAgICAgICAgICAgICd0aGF0IG9kZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3dvcmQsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAnYW55d2F5cz8nXSkKKworICAgIGRlZiB0ZXN0X25vYnJlYWtfbG9uZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IHdpdGggYnJlYWtfbG9uZ193b3JkcyBkaXNhYmxlZAorICAgICAgICBzZWxmLndyYXBwZXIuYnJlYWtfbG9uZ193b3JkcyA9IDAKKyAgICAgICAgc2VsZi53cmFwcGVyLndpZHRoID0gMzAKKyAgICAgICAgZXhwZWN0ID0gWydEaWQgeW91IHNheScsCisgICAgICAgICAgICAgICAgICAnInN1cGVyY2FsaWZyYWdpbGlzdGljZXhwaWFsaWRvY2lvdXM/IicsCisgICAgICAgICAgICAgICAgICAnSG93ICpkbyogeW91IHNwZWxsIHRoYXQgb2RkJywKKyAgICAgICAgICAgICAgICAgICd3b3JkLCBhbnl3YXlzPycKKyAgICAgICAgICAgICAgICAgIF0KKyAgICAgICAgcmVzdWx0ID0gc2VsZi53cmFwcGVyLndyYXAoc2VsZi50ZXh0KQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgZXhwZWN0KQorCisgICAgICAgICMgU2FtZSB0aGluZyB3aXRoIGt3YXJncyBwYXNzZWQgdG8gc3RhbmRhbG9uZSB3cmFwKCkgZnVuY3Rpb24uCisgICAgICAgIHJlc3VsdCA9IHdyYXAoc2VsZi50ZXh0LCB3aWR0aD0zMCwgYnJlYWtfbG9uZ193b3Jkcz0wKQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgZXhwZWN0KQorCisKK2NsYXNzIEluZGVudFRlc3RDYXNlcyhCYXNlVGVzdENhc2UpOgorCisgICAgIyBjYWxsZWQgYmVmb3JlIGVhY2ggdGVzdCBtZXRob2QKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudGV4dCA9ICcnJ1wKK1RoaXMgcGFyYWdyYXBoIHdpbGwgYmUgZmlsbGVkLCBmaXJzdCB3aXRob3V0IGFueSBpbmRlbnRhdGlvbiwKK2FuZCB0aGVuIHdpdGggc29tZSAoaW5jbHVkaW5nIGEgaGFuZ2luZyBpbmRlbnQpLicnJworCisKKyAgICBkZWYgdGVzdF9maWxsKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhlIGZpbGwoKSBtZXRob2QKKworICAgICAgICBleHBlY3QgPSAnJydcCitUaGlzIHBhcmFncmFwaCB3aWxsIGJlIGZpbGxlZCwgZmlyc3QKK3dpdGhvdXQgYW55IGluZGVudGF0aW9uLCBhbmQgdGhlbiB3aXRoCitzb21lIChpbmNsdWRpbmcgYSBoYW5naW5nIGluZGVudCkuJycnCisKKyAgICAgICAgcmVzdWx0ID0gZmlsbChzZWxmLnRleHQsIDQwKQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgZXhwZWN0KQorCisKKyAgICBkZWYgdGVzdF9pbml0aWFsX2luZGVudChzZWxmKToKKyAgICAgICAgIyBUZXN0IGluaXRpYWxfaW5kZW50IHBhcmFtZXRlcgorCisgICAgICAgIGV4cGVjdCA9IFsiICAgICBUaGlzIHBhcmFncmFwaCB3aWxsIGJlIGZpbGxlZCwiLAorICAgICAgICAgICAgICAgICAgImZpcnN0IHdpdGhvdXQgYW55IGluZGVudGF0aW9uLCBhbmQgdGhlbiIsCisgICAgICAgICAgICAgICAgICAid2l0aCBzb21lIChpbmNsdWRpbmcgYSBoYW5naW5nIGluZGVudCkuIl0KKyAgICAgICAgcmVzdWx0ID0gd3JhcChzZWxmLnRleHQsIDQwLCBpbml0aWFsX2luZGVudD0iICAgICAiKQorICAgICAgICBzZWxmLmNoZWNrKHJlc3VsdCwgZXhwZWN0KQorCisgICAgICAgIGV4cGVjdCA9ICJcbiIuam9pbihleHBlY3QpCisgICAgICAgIHJlc3VsdCA9IGZpbGwoc2VsZi50ZXh0LCA0MCwgaW5pdGlhbF9pbmRlbnQ9IiAgICAgIikKKyAgICAgICAgc2VsZi5jaGVjayhyZXN1bHQsIGV4cGVjdCkKKworCisgICAgZGVmIHRlc3Rfc3Vic2VxdWVudF9pbmRlbnQoc2VsZik6CisgICAgICAgICMgVGVzdCBzdWJzZXF1ZW50X2luZGVudCBwYXJhbWV0ZXIKKworICAgICAgICBleHBlY3QgPSAnJydcCisgICogVGhpcyBwYXJhZ3JhcGggd2lsbCBiZSBmaWxsZWQsIGZpcnN0CisgICAgd2l0aG91dCBhbnkgaW5kZW50YXRpb24sIGFuZCB0aGVuCisgICAgd2l0aCBzb21lIChpbmNsdWRpbmcgYSBoYW5naW5nCisgICAgaW5kZW50KS4nJycKKworICAgICAgICByZXN1bHQgPSBmaWxsKHNlbGYudGV4dCwgNDAsCisgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9IiAgKiAiLCBzdWJzZXF1ZW50X2luZGVudD0iICAgICIpCisgICAgICAgIHNlbGYuY2hlY2socmVzdWx0LCBleHBlY3QpCisKKworIyBEZXNwaXRlIHRoZSBzaW1pbGFyIG5hbWVzLCBEZWRlbnRUZXN0Q2FzZSBpcyAqbm90KiB0aGUgaW52ZXJzZQorIyBvZiBJbmRlbnRUZXN0Q2FzZSEKK2NsYXNzIERlZGVudFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBhc3NlcnRVbmNoYW5nZWQoc2VsZiwgdGV4dCk6CisgICAgICAgICIiImFzc2VydCB0aGF0IGRlZGVudCgpIGhhcyBubyBlZmZlY3Qgb24gJ3RleHQnIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgZGVkZW50KHRleHQpKQorCisgICAgZGVmIHRlc3RfZGVkZW50X25vbWFyZ2luKHNlbGYpOgorICAgICAgICAjIE5vIGxpbmVzIGluZGVudGVkLgorICAgICAgICB0ZXh0ID0gIkhlbGxvIHRoZXJlLlxuSG93IGFyZSB5b3U/XG5PaCBnb29kLCBJJ20gZ2xhZC4iCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCisKKyAgICAgICAgIyBTaW1pbGFyLCB3aXRoIGEgYmxhbmsgbGluZS4KKyAgICAgICAgdGV4dCA9ICJIZWxsbyB0aGVyZS5cblxuQm9vISIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIFNvbWUgbGluZXMgaW5kZW50ZWQsIGJ1dCBvdmVyYWxsIG1hcmdpbiBpcyBzdGlsbCB6ZXJvLgorICAgICAgICB0ZXh0ID0gIkhlbGxvIHRoZXJlLlxuICBUaGlzIGlzIGluZGVudGVkLiIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIEFnYWluLCBhZGQgYSBibGFuayBsaW5lLgorICAgICAgICB0ZXh0ID0gIkhlbGxvIHRoZXJlLlxuXG4gIEJvbyFcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgIGRlZiB0ZXN0X2RlZGVudF9ldmVuKHNlbGYpOgorICAgICAgICAjIEFsbCBsaW5lcyBpbmRlbnRlZCBieSB0d28gc3BhY2VzLgorICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG4gIEhvdyBhcmUgeWE/XG4gIE9oIGdvb2QuIgorICAgICAgICBleHBlY3QgPSAiSGVsbG8gdGhlcmUuXG5Ib3cgYXJlIHlhP1xuT2ggZ29vZC4iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgIyBTYW1lLCB3aXRoIGJsYW5rIGxpbmVzLgorICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG5cbiAgSG93IGFyZSB5YT9cbiAgT2ggZ29vZC5cbiIKKyAgICAgICAgZXhwZWN0ID0gIkhlbGxvIHRoZXJlLlxuXG5Ib3cgYXJlIHlhP1xuT2ggZ29vZC5cbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICAjIE5vdyBpbmRlbnQgb25lIG9mIHRoZSBibGFuayBsaW5lcy4KKyAgICAgICAgdGV4dCA9ICIgIEhlbGxvIHRoZXJlLlxuICBcbiAgSG93IGFyZSB5YT9cbiAgT2ggZ29vZC5cbiIKKyAgICAgICAgZXhwZWN0ID0gIkhlbGxvIHRoZXJlLlxuXG5Ib3cgYXJlIHlhP1xuT2ggZ29vZC5cbiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgIGRlZiB0ZXN0X2RlZGVudF91bmV2ZW4oc2VsZik6CisgICAgICAgICMgTGluZXMgaW5kZW50ZWQgdW5ldmVubHkuCisgICAgICAgIHRleHQgPSAnJydcCisgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZvbworICAgICAgICAnJycKKyAgICAgICAgZXhwZWN0ID0gJycnXAorZGVmIGZvbygpOgorICAgIHdoaWxlIDE6CisgICAgICAgIHJldHVybiBmb28KKycnJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgICAgICMgVW5ldmVuIGluZGVudGF0aW9uIHdpdGggYSBibGFuayBsaW5lLgorICAgICAgICB0ZXh0ID0gIiAgRm9vXG4gICAgQmFyXG5cbiAgIEJhelxuIgorICAgICAgICBleHBlY3QgPSAiRm9vXG4gIEJhclxuXG4gQmF6XG4iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgIyBVbmV2ZW4gaW5kZW50YXRpb24gd2l0aCBhIHdoaXRlc3BhY2Utb25seSBsaW5lLgorICAgICAgICB0ZXh0ID0gIiAgRm9vXG4gICAgQmFyXG4gXG4gICBCYXpcbiIKKyAgICAgICAgZXhwZWN0ID0gIkZvb1xuICBCYXJcblxuIEJhelxuIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZGVkZW50KHRleHQpKQorCisgICAgIyBkZWRlbnQoKSBzaG91bGQgbm90IG1hbmdsZSBpbnRlcm5hbCB0YWJzCisgICAgZGVmIHRlc3RfZGVkZW50X3ByZXNlcnZlX2ludGVybmFsX3RhYnMoc2VsZik6CisgICAgICAgIHRleHQgPSAiICBoZWxsb1x0dGhlcmVcbiAgaG93IGFyZVx0eW91PyIKKyAgICAgICAgZXhwZWN0ID0gImhlbGxvXHR0aGVyZVxuaG93IGFyZVx0eW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICAjIG1ha2Ugc3VyZSB0aGF0IGl0IHByZXNlcnZlcyB0YWJzIHdoZW4gaXQncyBub3QgbWFraW5nIGFueQorICAgICAgICAjIGNoYW5nZXMgYXQgYWxsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBkZWRlbnQoZXhwZWN0KSkKKworICAgICMgZGVkZW50KCkgc2hvdWxkIG5vdCBtYW5nbGUgdGFicyBpbiB0aGUgbWFyZ2luIChpLmUuCisgICAgIyB0YWJzIGFuZCBzcGFjZXMgYm90aCBjb3VudCBhcyBtYXJnaW4sIGJ1dCBhcmUgKm5vdCoKKyAgICAjIGNvbnNpZGVyZWQgZXF1aXZhbGVudCkKKyAgICBkZWYgdGVzdF9kZWRlbnRfcHJlc2VydmVfbWFyZ2luX3RhYnMoc2VsZik6CisgICAgICAgIHRleHQgPSAiICBoZWxsbyB0aGVyZVxuXHRob3cgYXJlIHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCisKKyAgICAgICAgIyBzYW1lIGVmZmVjdCBldmVuIGlmIHdlIGhhdmUgOCBzcGFjZXMKKyAgICAgICAgdGV4dCA9ICIgICAgICAgIGhlbGxvIHRoZXJlXG5cdGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIGRlZGVudCgpIG9ubHkgcmVtb3ZlcyB3aGl0ZXNwYWNlIHRoYXQgY2FuIGJlIHVuaWZvcm1seSByZW1vdmVkIQorICAgICAgICB0ZXh0ID0gIlx0aGVsbG8gdGhlcmVcblx0aG93IGFyZSB5b3U/IgorICAgICAgICBleHBlY3QgPSAiaGVsbG8gdGhlcmVcbmhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICB0ZXh0ID0gIiAgXHRoZWxsbyB0aGVyZVxuICBcdGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICB0ZXh0ID0gIiAgXHQgIGhlbGxvIHRoZXJlXG4gIFx0ICBob3cgYXJlIHlvdT8iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgdGV4dCA9ICIgIFx0aGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIKKyAgICAgICAgZXhwZWN0ID0gImhlbGxvIHRoZXJlXG4gIGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChXcmFwVGVzdENhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb25nV29yZFRlc3RDYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kZW50VGVzdENhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVkZW50VGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RleHR3cmFwLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RleHR3cmFwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E5MmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGV4dHdyYXAucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RleHR3cmFwLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RleHR3cmFwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2E5MmIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGV4dHdyYXAucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTM4ODlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkLnB5CkBAIC0wLDAgKzEsMjY1IEBACitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHJhbmRvbQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK3RocmVhZCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWQnKQoraW1wb3J0IHRpbWUKK2ltcG9ydCBzeXMKK2ltcG9ydCB3ZWFrcmVmCisKK2Zyb20gdGVzdCBpbXBvcnQgbG9ja190ZXN0cworCitOVU1UQVNLUyA9IDEwCitOVU1UUklQUyA9IDMKKworCitfcHJpbnRfbXV0ZXggPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCisKK2RlZiB2ZXJib3NlX3ByaW50KGFyZyk6CisgICAgIiIiSGVscGVyIGZ1bmN0aW9uIGZvciBwcmludGluZyBvdXQgZGVidWdnaW5nIG91dHB1dC4iIiIKKyAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgd2l0aCBfcHJpbnRfbXV0ZXg6CisgICAgICAgICAgICBwcmludCBhcmcKKworCitjbGFzcyBCYXNpY1RocmVhZFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmRvbmVfbXV0ZXggPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCisgICAgICAgIHNlbGYuZG9uZV9tdXRleC5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5ydW5uaW5nX211dGV4ID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorICAgICAgICBzZWxmLnJhbmRvbV9tdXRleCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgc2VsZi5jcmVhdGVkID0gMAorICAgICAgICBzZWxmLnJ1bm5pbmcgPSAwCisgICAgICAgIHNlbGYubmV4dF9pZGVudCA9IDAKKworCitjbGFzcyBUaHJlYWRSdW5uaW5nVGVzdHMoQmFzaWNUaHJlYWRUZXN0KToKKworICAgIGRlZiBuZXd0YXNrKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYucnVubmluZ19tdXRleDoKKyAgICAgICAgICAgIHNlbGYubmV4dF9pZGVudCArPSAxCisgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJjcmVhdGluZyB0YXNrICVzIiAlIHNlbGYubmV4dF9pZGVudCkKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHNlbGYudGFzaywgKHNlbGYubmV4dF9pZGVudCwpKQorICAgICAgICAgICAgc2VsZi5jcmVhdGVkICs9IDEKKyAgICAgICAgICAgIHNlbGYucnVubmluZyArPSAxCisKKyAgICBkZWYgdGFzayhzZWxmLCBpZGVudCk6CisgICAgICAgIHdpdGggc2VsZi5yYW5kb21fbXV0ZXg6CisgICAgICAgICAgICBkZWxheSA9IHJhbmRvbS5yYW5kb20oKSAvIDEwMDAwLjAKKyAgICAgICAgdmVyYm9zZV9wcmludCgidGFzayAlcyB3aWxsIHJ1biBmb3IgJXN1cyIgJSAoaWRlbnQsIHJvdW5kKGRlbGF5KjFlNikpKQorICAgICAgICB0aW1lLnNsZWVwKGRlbGF5KQorICAgICAgICB2ZXJib3NlX3ByaW50KCJ0YXNrICVzIGRvbmUiICUgaWRlbnQpCisgICAgICAgIHdpdGggc2VsZi5ydW5uaW5nX211dGV4OgorICAgICAgICAgICAgc2VsZi5ydW5uaW5nIC09IDEKKyAgICAgICAgICAgIGlmIHNlbGYuY3JlYXRlZCA9PSBOVU1UQVNLUyBhbmQgc2VsZi5ydW5uaW5nID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5kb25lX211dGV4LnJlbGVhc2UoKQorCisgICAgZGVmIHRlc3Rfc3RhcnRpbmdfdGhyZWFkcyhzZWxmKToKKyAgICAgICAgIyBCYXNpYyB0ZXN0IGZvciB0aHJlYWQgY3JlYXRpb24uCisgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTVRBU0tTKToKKyAgICAgICAgICAgIHNlbGYubmV3dGFzaygpCisgICAgICAgIHZlcmJvc2VfcHJpbnQoIndhaXRpbmcgZm9yIHRhc2tzIHRvIGNvbXBsZXRlLi4uIikKKyAgICAgICAgc2VsZi5kb25lX211dGV4LmFjcXVpcmUoKQorICAgICAgICB2ZXJib3NlX3ByaW50KCJhbGwgdGFza3MgZG9uZSIpCisKKyAgICBkZWYgdGVzdF9zdGFja19zaXplKHNlbGYpOgorICAgICAgICAjIFZhcmlvdXMgc3RhY2sgc2l6ZSB0ZXN0cy4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aHJlYWQuc3RhY2tfc2l6ZSgpLCAwLCAiaW5pdGlhbCBzdGFjayBzaXplIGlzIG5vdCAwIikKKworICAgICAgICB0aHJlYWQuc3RhY2tfc2l6ZSgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRocmVhZC5zdGFja19zaXplKCksIDAsICJzdGFja19zaXplIG5vdCByZXNldCB0byBkZWZhdWx0IikKKworICAgICAgICBpZiBvcy5uYW1lIG5vdCBpbiAoIm50IiwgIm9zMiIsICJwb3NpeCIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHNzX3N1cHBvcnRlZCA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUoNDA5NikKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJjYXVnaHQgZXhwZWN0ZWQgVmFsdWVFcnJvciBzZXR0aW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhY2tfc2l6ZSg0MDk2KSIpCisgICAgICAgIGV4Y2VwdCB0aHJlYWQuZXJyb3I6CisgICAgICAgICAgICB0c3Nfc3VwcG9ydGVkID0gRmFsc2UKKyAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoInBsYXRmb3JtIGRvZXMgbm90IHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2l6ZSIpCisKKyAgICAgICAgaWYgdHNzX3N1cHBvcnRlZDoKKyAgICAgICAgICAgIGZhaWxfbXNnID0gInN0YWNrX3NpemUoJWQpIGZhaWxlZCAtIHNob3VsZCBzdWNjZWVkIgorICAgICAgICAgICAgZm9yIHRzcyBpbiAoMjYyMTQ0LCAweDEwMDAwMCwgMCk6CisgICAgICAgICAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUodHNzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhyZWFkLnN0YWNrX3NpemUoKSwgdHNzLCBmYWlsX21zZyAlIHRzcykKKyAgICAgICAgICAgICAgICB2ZXJib3NlX3ByaW50KCJzdWNjZXNzZnVsbHkgc2V0IHN0YWNrX3NpemUoJWQpIiAlIHRzcykKKworICAgICAgICAgICAgZm9yIHRzcyBpbiAoMjYyMTQ0LCAweDEwMDAwMCk6CisgICAgICAgICAgICAgICAgdmVyYm9zZV9wcmludCgidHJ5aW5nIHN0YWNrX3NpemUgPSAoJWQpIiAlIHRzcykKKyAgICAgICAgICAgICAgICBzZWxmLm5leHRfaWRlbnQgPSAwCisgICAgICAgICAgICAgICAgc2VsZi5jcmVhdGVkID0gMAorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTVRBU0tTKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXd0YXNrKCkKKworICAgICAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoIndhaXRpbmcgZm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZSIpCisgICAgICAgICAgICAgICAgc2VsZi5kb25lX211dGV4LmFjcXVpcmUoKQorICAgICAgICAgICAgICAgIHZlcmJvc2VfcHJpbnQoImFsbCB0YXNrcyBkb25lIikKKworICAgICAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUoMCkKKworICAgIGRlZiB0ZXN0X19jb3VudChzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoZSBfY291bnQoKSBmdW5jdGlvbi4KKyAgICAgICAgb3JpZyA9IHRocmVhZC5fY291bnQoKQorICAgICAgICBtdXQgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCisgICAgICAgIG11dC5hY3F1aXJlKCkKKyAgICAgICAgc3RhcnRlZCA9IFtdCisgICAgICAgIGRlZiB0YXNrKCk6CisgICAgICAgICAgICBzdGFydGVkLmFwcGVuZChOb25lKQorICAgICAgICAgICAgbXV0LmFjcXVpcmUoKQorICAgICAgICAgICAgbXV0LnJlbGVhc2UoKQorICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCh0YXNrLCAoKSkKKyAgICAgICAgd2hpbGUgbm90IHN0YXJ0ZWQ6CisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGhyZWFkLl9jb3VudCgpLCBvcmlnICsgMSkKKyAgICAgICAgIyBBbGxvdyB0aGUgdGFzayB0byBmaW5pc2guCisgICAgICAgIG11dC5yZWxlYXNlKCkKKyAgICAgICAgIyBUaGUgb25seSByZWxpYWJsZSB3YXkgdG8gYmUgc3VyZSB0aGF0IHRoZSB0aHJlYWQgZW5kZWQgZnJvbSB0aGUKKyAgICAgICAgIyBpbnRlcnByZXRlcidzIHBvaW50IG9mIHZpZXcgaXMgdG8gd2FpdCBmb3IgdGhlIGZ1bmN0aW9uIG9iamVjdCB0byBiZQorICAgICAgICAjIGRlc3Ryb3llZC4KKyAgICAgICAgZG9uZSA9IFtdCisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYodGFzaywgbGFtYmRhIF86IGRvbmUuYXBwZW5kKE5vbmUpKQorICAgICAgICBkZWwgdGFzaworICAgICAgICB3aGlsZSBub3QgZG9uZToKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aHJlYWQuX2NvdW50KCksIG9yaWcpCisKKyAgICBkZWYgdGVzdF9zYXZlX2V4Y2VwdGlvbl9zdGF0ZV9vbl9lcnJvcihzZWxmKToKKyAgICAgICAgIyBTZWUgaXNzdWUgIzE0NDc0CisgICAgICAgIGRlZiB0YXNrKCk6CisgICAgICAgICAgICBzdGFydGVkLnJlbGVhc2UoKQorICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKKyAgICAgICAgZGVmIG15d3JpdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJlYWxfd3JpdGUoc2VsZiwgKmFyZ3MpCisgICAgICAgIGMgPSB0aHJlYWQuX2NvdW50KCkKKyAgICAgICAgc3RhcnRlZCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCJzdGRlcnIiKSBhcyBzdGRlcnI6CisgICAgICAgICAgICByZWFsX3dyaXRlID0gc3RkZXJyLndyaXRlCisgICAgICAgICAgICBzdGRlcnIud3JpdGUgPSBteXdyaXRlCisgICAgICAgICAgICBzdGFydGVkLmFjcXVpcmUoKQorICAgICAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQodGFzaywgKCkpCisgICAgICAgICAgICBzdGFydGVkLmFjcXVpcmUoKQorICAgICAgICAgICAgd2hpbGUgdGhyZWFkLl9jb3VudCgpID4gYzoKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlRyYWNlYmFjayIsIHN0ZGVyci5nZXR2YWx1ZSgpKQorCisKK2NsYXNzIEJhcnJpZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG51bV90aHJlYWRzKToKKyAgICAgICAgc2VsZi5udW1fdGhyZWFkcyA9IG51bV90aHJlYWRzCisgICAgICAgIHNlbGYud2FpdGluZyA9IDAKKyAgICAgICAgc2VsZi5jaGVja2luX211dGV4ICA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgc2VsZi5jaGVja291dF9tdXRleCA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKyAgICAgICAgc2VsZi5jaGVja291dF9tdXRleC5hY3F1aXJlKCkKKworICAgIGRlZiBlbnRlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2luX211dGV4LmFjcXVpcmUoKQorICAgICAgICBzZWxmLndhaXRpbmcgPSBzZWxmLndhaXRpbmcgKyAxCisgICAgICAgIGlmIHNlbGYud2FpdGluZyA9PSBzZWxmLm51bV90aHJlYWRzOgorICAgICAgICAgICAgc2VsZi53YWl0aW5nID0gc2VsZi5udW1fdGhyZWFkcyAtIDEKKyAgICAgICAgICAgIHNlbGYuY2hlY2tvdXRfbXV0ZXgucmVsZWFzZSgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jaGVja2luX211dGV4LnJlbGVhc2UoKQorCisgICAgICAgIHNlbGYuY2hlY2tvdXRfbXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHNlbGYud2FpdGluZyA9IHNlbGYud2FpdGluZyAtIDEKKyAgICAgICAgaWYgc2VsZi53YWl0aW5nID09IDA6CisgICAgICAgICAgICBzZWxmLmNoZWNraW5fbXV0ZXgucmVsZWFzZSgpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jaGVja291dF9tdXRleC5yZWxlYXNlKCkKKworCitjbGFzcyBCYXJyaWVyVGVzdChCYXNpY1RocmVhZFRlc3QpOgorCisgICAgZGVmIHRlc3RfYmFycmllcihzZWxmKToKKyAgICAgICAgc2VsZi5iYXIgPSBCYXJyaWVyKE5VTVRBU0tTKQorICAgICAgICBzZWxmLnJ1bm5pbmcgPSBOVU1UQVNLUworICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1UQVNLUyk6CisgICAgICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZChzZWxmLnRhc2syLCAoaSwpKQorICAgICAgICB2ZXJib3NlX3ByaW50KCJ3YWl0aW5nIGZvciB0YXNrcyB0byBlbmQiKQorICAgICAgICBzZWxmLmRvbmVfbXV0ZXguYWNxdWlyZSgpCisgICAgICAgIHZlcmJvc2VfcHJpbnQoInRhc2tzIGRvbmUiKQorCisgICAgZGVmIHRhc2syKHNlbGYsIGlkZW50KToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNVFJJUFMpOgorICAgICAgICAgICAgaWYgaWRlbnQgPT0gMDoKKyAgICAgICAgICAgICAgICAjIGdpdmUgaXQgYSBnb29kIGNoYW5jZSB0byBlbnRlciB0aGUgbmV4dAorICAgICAgICAgICAgICAgICMgYmFycmllciBiZWZvcmUgdGhlIG90aGVycyBhcmUgYWxsIG91dAorICAgICAgICAgICAgICAgICMgb2YgdGhlIGN1cnJlbnQgb25lCisgICAgICAgICAgICAgICAgZGVsYXkgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5yYW5kb21fbXV0ZXg6CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gcmFuZG9tLnJhbmRvbSgpIC8gMTAwMDAuMAorICAgICAgICAgICAgdmVyYm9zZV9wcmludCgidGFzayAlcyB3aWxsIHJ1biBmb3IgJXN1cyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAoaWRlbnQsIHJvdW5kKGRlbGF5ICogMWU2KSkpCisgICAgICAgICAgICB0aW1lLnNsZWVwKGRlbGF5KQorICAgICAgICAgICAgdmVyYm9zZV9wcmludCgidGFzayAlcyBlbnRlcmluZyAlcyIgJSAoaWRlbnQsIGkpKQorICAgICAgICAgICAgc2VsZi5iYXIuZW50ZXIoKQorICAgICAgICAgICAgdmVyYm9zZV9wcmludCgidGFzayAlcyBsZWF2aW5nIGJhcnJpZXIiICUgaWRlbnQpCisgICAgICAgIHdpdGggc2VsZi5ydW5uaW5nX211dGV4OgorICAgICAgICAgICAgc2VsZi5ydW5uaW5nIC09IDEKKyAgICAgICAgICAgICMgTXVzdCByZWxlYXNlIG11dGV4IGJlZm9yZSByZWxlYXNpbmcgZG9uZSwgZWxzZSB0aGUgbWFpbiB0aHJlYWQgY2FuCisgICAgICAgICAgICAjIGV4aXQgYW5kIHNldCBtdXRleCB0byBOb25lIGFzIHBhcnQgb2YgZ2xvYmFsIHRlYXJkb3duOyB0aGVuCisgICAgICAgICAgICAjIG11dGV4LnJlbGVhc2UoKSByYWlzZXMgQXR0cmlidXRlRXJyb3IuCisgICAgICAgICAgICBmaW5pc2hlZCA9IHNlbGYucnVubmluZyA9PSAwCisgICAgICAgIGlmIGZpbmlzaGVkOgorICAgICAgICAgICAgc2VsZi5kb25lX211dGV4LnJlbGVhc2UoKQorCisKK2NsYXNzIExvY2tUZXN0cyhsb2NrX3Rlc3RzLkxvY2tUZXN0cyk6CisgICAgbG9ja3R5cGUgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaworCisKK2NsYXNzIFRlc3RGb3JrSW5UaHJlYWQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5yZWFkX2ZkLCBzZWxmLndyaXRlX2ZkID0gb3MucGlwZSgpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCd3aW4nKSwKKyAgICAgICAgICAgICAgICAgICAgICJUaGlzIHRlc3QgaXMgb25seSBhcHByb3ByaWF0ZSBmb3IgUE9TSVgtbGlrZSBzeXN0ZW1zLiIpCisgICAgQHRlc3Rfc3VwcG9ydC5yZWFwX3RocmVhZHMKKyAgICBkZWYgdGVzdF9mb3JraW50aHJlYWQoc2VsZik6CisgICAgICAgIGRlZiB0aHJlYWQxKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGlkID0gb3MuZm9yaygpICMgZm9yayBpbiBhIHRocmVhZAorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgwKSAjIGV4aXQgdGhlIGNoaWxkCisKKyAgICAgICAgICAgIGlmIHBpZCA9PSAwOiAjIGNoaWxkCisgICAgICAgICAgICAgICAgb3MuY2xvc2Uoc2VsZi5yZWFkX2ZkKQorICAgICAgICAgICAgICAgIG9zLndyaXRlKHNlbGYud3JpdGVfZmQsICJPSyIpCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgICAgIGVsc2U6ICMgcGFyZW50CisgICAgICAgICAgICAgICAgb3MuY2xvc2Uoc2VsZi53cml0ZV9mZCkKKworICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZCh0aHJlYWQxLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5yZWFkKHNlbGYucmVhZF9mZCwgMiksICJPSyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBmb3JrKCkgaW4gdGhyZWFkIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MuY2xvc2Uoc2VsZi5yZWFkX2ZkKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jbG9zZShzZWxmLndyaXRlX2ZkKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUaHJlYWRSdW5uaW5nVGVzdHMsIEJhcnJpZXJUZXN0LCBMb2NrVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0Rm9ya0luVGhyZWFkKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGIzNWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGIzNWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxZmRmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weQpAQCAtMCwwICsxLDc2IEBACisjIFRoaXMgaXMgYSB2YXJpYW50IG9mIHRoZSB2ZXJ5IG9sZCAoZWFybHkgOTAncykgZmlsZQorIyBEZW1vL3RocmVhZHMvYnVnLnB5LiAgSXQgc2ltcGx5IHByb3Zva2VzIGEgbnVtYmVyIG9mIHRocmVhZHMgaW50bworIyB0cnlpbmcgdG8gaW1wb3J0IHRoZSBzYW1lIG1vZHVsZSAiYXQgdGhlIHNhbWUgdGltZSIuCisjIFRoZXJlIGFyZSBubyBwbGVhc2FudCBmYWlsdXJlIG1vZGVzIC0tIG1vc3QgbGlrZWx5IGlzIHRoYXQgUHl0aG9uCisjIGNvbXBsYWlucyBzZXZlcmFsIHRpbWVzIGFib3V0IG1vZHVsZSByYW5kb20gaGF2aW5nIG5vIGF0dHJpYnV0ZQorIyByYW5kcmFuZ2UsIGFuZCB0aGVuIFB5dGhvbiBoYW5ncy4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBUZXN0RmFpbGVkLCBpbXBvcnRfbW9kdWxlCit0aHJlYWQgPSBpbXBvcnRfbW9kdWxlKCd0aHJlYWQnKQorCitjcml0aWNhbF9zZWN0aW9uID0gdGhyZWFkLmFsbG9jYXRlX2xvY2soKQorZG9uZSA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKworZGVmIHRhc2soKToKKyAgICBnbG9iYWwgTiwgY3JpdGljYWxfc2VjdGlvbiwgZG9uZQorICAgIGltcG9ydCByYW5kb20KKyAgICB4ID0gcmFuZG9tLnJhbmRyYW5nZSgxLCAzKQorICAgIGNyaXRpY2FsX3NlY3Rpb24uYWNxdWlyZSgpCisgICAgTiAtPSAxCisgICAgIyBNdXN0IHJlbGVhc2UgY3JpdGljYWxfc2VjdGlvbiBiZWZvcmUgcmVsZWFzaW5nIGRvbmUsIGVsc2UgdGhlIG1haW4KKyAgICAjIHRocmVhZCBjYW4gZXhpdCBhbmQgc2V0IGNyaXRpY2FsX3NlY3Rpb24gdG8gTm9uZSBhcyBwYXJ0IG9mIGdsb2JhbAorICAgICMgdGVhcmRvd247IHRoZW4gY3JpdGljYWxfc2VjdGlvbi5yZWxlYXNlKCkgcmFpc2VzIEF0dHJpYnV0ZUVycm9yLgorICAgIGZpbmlzaGVkID0gTiA9PSAwCisgICAgY3JpdGljYWxfc2VjdGlvbi5yZWxlYXNlKCkKKyAgICBpZiBmaW5pc2hlZDoKKyAgICAgICAgZG9uZS5yZWxlYXNlKCkKKworZGVmIHRlc3RfaW1wb3J0X2hhbmdlcnMoKToKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgInRlc3RpbmcgaW1wb3J0IGhhbmdlcnMgLi4uIiwKKworICAgIGltcG9ydCB0ZXN0LnRocmVhZGVkX2ltcG9ydF9oYW5nZXJzCisgICAgdHJ5OgorICAgICAgICBpZiB0ZXN0LnRocmVhZGVkX2ltcG9ydF9oYW5nZXJzLmVycm9yczoKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQodGVzdC50aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5lcnJvcnMpCisgICAgICAgIGVsaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJPSy4iCisgICAgZmluYWxseToKKyAgICAgICAgIyBJbiBjYXNlIHRoaXMgdGVzdCBpcyBydW4gYWdhaW4sIG1ha2Ugc3VyZSB0aGUgaGVscGVyIG1vZHVsZQorICAgICAgICAjIGdldHMgbG9hZGVkIGZyb20gc2NyYXRjaCBhZ2Fpbi4KKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzWyd0ZXN0LnRocmVhZGVkX2ltcG9ydF9oYW5nZXJzJ10KKworIyBUcmlja3k6ICBXaGVuIHJlZ3J0ZXN0IGltcG9ydHMgdGhpcyBtb2R1bGUsIHRoZSB0aHJlYWQgcnVubmluZyByZWdydGVzdAorIyBncmFicyB0aGUgaW1wb3J0IGxvY2sgYW5kIHdvbid0IGxldCBnbyBvZiBpdCB1bnRpbCB0aGlzIG1vZHVsZSByZXR1cm5zLgorIyBBbGwgb3RoZXIgdGhyZWFkcyBhdHRlbXB0aW5nIGFuIGltcG9ydCBoYW5nIGZvciB0aGUgZHVyYXRpb24uICBTaW5jZQorIyB0aGlzIHRlc3Qgc3Bhd25zIHRocmVhZHMgdGhhdCBkbyBsaXR0bGUgKmJ1dCogaW1wb3J0LCB3ZSBjYW4ndCBkbyB0aGF0CisjIHN1Y2Nlc3NmdWxseSB1bnRpbCBhZnRlciB0aGlzIG1vZHVsZSBmaW5pc2hlcyBpbXBvcnRpbmcgYW5kIHJlZ3J0ZXN0CisjIHJlZ2FpbnMgY29udHJvbC4gIFRvIG1ha2UgdGhpcyB3b3JrLCBhIHNwZWNpYWwgY2FzZSB3YXMgYWRkZWQgdG8KKyMgcmVncnRlc3QgdG8gaW52b2tlIGEgbW9kdWxlJ3MgInRlc3RfbWFpbiIgZnVuY3Rpb24gKGlmIGFueSkgYWZ0ZXIKKyMgaW1wb3J0aW5nIGl0LgorCitkZWYgdGVzdF9tYWluKCk6ICAgICAgICAjIG1hZ2ljIG5hbWUhICBzZWUgYWJvdmUKKyAgICBnbG9iYWwgTiwgZG9uZQorCisgICAgaW1wb3J0IGltcAorICAgIGlmIGltcC5sb2NrX2hlbGQoKToKKyAgICAgICAgIyBUaGlzIHRyaWdnZXJzIG9uLCBlLmcuLCBmcm9tIHRlc3QgaW1wb3J0IGF1dG90ZXN0LgorICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgiY2FuJ3QgcnVuIHdoZW4gaW1wb3J0IGxvY2sgaXMgaGVsZCIpCisKKyAgICBkb25lLmFjcXVpcmUoKQorICAgIGZvciBOIGluICgyMCwgNTApICogMzoKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICJUcnlpbmciLCBOLCAidGhyZWFkcyAuLi4iLAorICAgICAgICBmb3IgaSBpbiByYW5nZShOKToKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKHRhc2ssICgpKQorICAgICAgICBkb25lLmFjcXVpcmUoKQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIk9LLiIKKyAgICBkb25lLnJlbGVhc2UoKQorCisgICAgdGVzdF9pbXBvcnRfaGFuZ2VycygpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOGZmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOGZmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDk2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5CkBAIC0wLDAgKzEsNzggQEAKKyIiIgorQ3JlYXRlIGFuZCBkZWxldGUgRklMRVNfUEVSX1RIUkVBRCB0ZW1wIGZpbGVzICh2aWEgdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSkKK2luIGVhY2ggb2YgTlVNX1RIUkVBRFMgdGhyZWFkcywgcmVjb3JkaW5nIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc2VzIGFuZAorZmFpbHVyZXMuICBBIGZhaWx1cmUgaXMgYSBidWcgaW4gdGVtcGZpbGUsIGFuZCBtYXkgYmUgZHVlIHRvOgorCisrIFRyeWluZyB0byBjcmVhdGUgbW9yZSB0aGFuIG9uZSB0ZW1wZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUuCisrIFRyeWluZyB0byBkZWxldGUgYSB0ZW1wZmlsZSB0aGF0IGRvZXNuJ3Qgc3RpbGwgZXhpc3QuCisrIFNvbWV0aGluZyB3ZSd2ZSBuZXZlciBzZWVuIGJlZm9yZS4KKworQnkgZGVmYXVsdCwgTlVNX1RIUkVBRFMgPT0gMjAgYW5kIEZJTEVTX1BFUl9USFJFQUQgPT0gNTAuICBUaGlzIGlzIGVub3VnaCB0bworY3JlYXRlIGFib3V0IDE1MCBmYWlsdXJlcyBwZXIgcnVuIHVuZGVyIFdpbjk4U0UgaW4gMi4wLCBhbmQgcnVucyBwcmV0dHkKK3F1aWNrbHkuIEd1aWRvIHJlcG9ydHMgbmVlZGluZyB0byBib29zdCBGSUxFU19QRVJfVEhSRUFEIHRvIDUwMCBiZWZvcmUKK3Byb3Zva2luZyBhIDIuMCBmYWlsdXJlIHVuZGVyIExpbnV4LgorIiIiCisKK05VTV9USFJFQURTID0gMjAKK0ZJTEVTX1BFUl9USFJFQUQgPSA1MAorCitpbXBvcnQgdGVtcGZpbGUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdGhyZWFkaW5nX3NldHVwLCB0aHJlYWRpbmdfY2xlYW51cCwgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlCit0aHJlYWRpbmcgPSBpbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdHJhY2ViYWNrIGltcG9ydCBwcmludF9leGMKKworc3RhcnRFdmVudCA9IHRocmVhZGluZy5FdmVudCgpCisKK2NsYXNzIFRlbXBGaWxlR3JlZWR5KHRocmVhZGluZy5UaHJlYWQpOgorICAgIGVycm9yX2NvdW50ID0gMAorICAgIG9rX2NvdW50ID0gMAorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5lcnJvcnMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHN0YXJ0RXZlbnQud2FpdCgpCisgICAgICAgIGZvciBpIGluIHJhbmdlKEZJTEVTX1BFUl9USFJFQUQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGYgPSB0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlKCJ3K2IiKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHNlbGYuZXJyb3JfY291bnQgKz0gMQorICAgICAgICAgICAgICAgIHByaW50X2V4YyhmaWxlPXNlbGYuZXJyb3JzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm9rX2NvdW50ICs9IDEKKworCitjbGFzcyBUaHJlYWRlZFRlbXBGaWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbWFpbihzZWxmKToKKyAgICAgICAgdGhyZWFkcyA9IFtdCisgICAgICAgIHRocmVhZF9pbmZvID0gdGhyZWFkaW5nX3NldHVwKCkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShOVU1fVEhSRUFEUyk6CisgICAgICAgICAgICB0ID0gVGVtcEZpbGVHcmVlZHkoKQorICAgICAgICAgICAgdGhyZWFkcy5hcHBlbmQodCkKKyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgICAgIHN0YXJ0RXZlbnQuc2V0KCkKKworICAgICAgICBvayA9IDAKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgICAgICBvayArPSB0Lm9rX2NvdW50CisgICAgICAgICAgICBpZiB0LmVycm9yX2NvdW50OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoc3RyKHQuZ2V0TmFtZSgpKSArIHN0cih0LmVycm9ycy5nZXR2YWx1ZSgpKSkKKworICAgICAgICB0aHJlYWRpbmdfY2xlYW51cCgqdGhyZWFkX2luZm8pCisKKyAgICAgICAgbXNnID0gIkVycm9yczogZXJyb3JzICVkIG9rICVkXG4lcyIgJSAobGVuKGVycm9ycyksIG9rLAorICAgICAgICAgICAgJ1xuJy5qb2luKGVycm9ycykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyb3JzLCBbXSwgbXNnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9rLCBOVU1fVEhSRUFEUyAqIEZJTEVTX1BFUl9USFJFQUQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGhyZWFkZWRUZW1wRmlsZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllYjFkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjllYjFkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjA0Y2QzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5CkBAIC0wLDAgKzEsNzc4IEBACisjIFZlcnkgcnVkaW1lbnRhcnkgdGVzdCBvZiB0aHJlYWRpbmcgbW9kdWxlCisKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQorZnJvbSB0ZXN0LnNjcmlwdF9oZWxwZXIgaW1wb3J0IGFzc2VydF9weXRob25fb2sKKworaW1wb3J0IHJhbmRvbQoraW1wb3J0IHJlCitpbXBvcnQgc3lzCit0aHJlYWQgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWQnKQordGhyZWFkaW5nID0gdGVzdC50ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgndGhyZWFkaW5nJykKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCB3ZWFrcmVmCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKK2Zyb20gdGVzdCBpbXBvcnQgbG9ja190ZXN0cworCisjIEEgdHJpdmlhbCBtdXRhYmxlIGNvdW50ZXIuCitjbGFzcyBDb3VudGVyKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlID0gMAorICAgIGRlZiBpbmMoc2VsZik6CisgICAgICAgIHNlbGYudmFsdWUgKz0gMQorICAgIGRlZiBkZWMoc2VsZik6CisgICAgICAgIHNlbGYudmFsdWUgLT0gMQorICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlCisKK2NsYXNzIFRlc3RUaHJlYWQodGhyZWFkaW5nLlRocmVhZCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHRlc3RjYXNlLCBzZW1hLCBtdXRleCwgbnJ1bm5pbmcpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkLl9faW5pdF9fKHNlbGYsIG5hbWU9bmFtZSkKKyAgICAgICAgc2VsZi50ZXN0Y2FzZSA9IHRlc3RjYXNlCisgICAgICAgIHNlbGYuc2VtYSA9IHNlbWEKKyAgICAgICAgc2VsZi5tdXRleCA9IG11dGV4CisgICAgICAgIHNlbGYubnJ1bm5pbmcgPSBucnVubmluZworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgZGVsYXkgPSByYW5kb20ucmFuZG9tKCkgLyAxMDAwMC4wCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAndGFzayAlcyB3aWxsIHJ1biBmb3IgJS4xZiB1c2VjJyAlICgKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIGRlbGF5ICogMWU2KQorCisgICAgICAgIHdpdGggc2VsZi5zZW1hOgorICAgICAgICAgICAgd2l0aCBzZWxmLm11dGV4OgorICAgICAgICAgICAgICAgIHNlbGYubnJ1bm5pbmcuaW5jKCkKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5ydW5uaW5nLmdldCgpLCAndGFza3MgYXJlIHJ1bm5pbmcnCisgICAgICAgICAgICAgICAgc2VsZi50ZXN0Y2FzZS5hc3NlcnRUcnVlKHNlbGYubnJ1bm5pbmcuZ2V0KCkgPD0gMykKKworICAgICAgICAgICAgdGltZS5zbGVlcChkZWxheSkKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ3Rhc2snLCBzZWxmLm5hbWUsICdkb25lJworCisgICAgICAgICAgICB3aXRoIHNlbGYubXV0ZXg6CisgICAgICAgICAgICAgICAgc2VsZi5ucnVubmluZy5kZWMoKQorICAgICAgICAgICAgICAgIHNlbGYudGVzdGNhc2UuYXNzZXJ0VHJ1ZShzZWxmLm5ydW5uaW5nLmdldCgpID49IDApCisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyVzIGlzIGZpbmlzaGVkLiAlZCB0YXNrcyBhcmUgcnVubmluZycgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYubnJ1bm5pbmcuZ2V0KCkpCisKK2NsYXNzIEJhc2VUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLl90aHJlYWRzID0gdGVzdC50ZXN0X3N1cHBvcnQudGhyZWFkaW5nX3NldHVwKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdGVzdC50ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnNlbGYuX3RocmVhZHMpCisgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQorCisKK2NsYXNzIFRocmVhZFRlc3RzKEJhc2VUZXN0Q2FzZSk6CisKKyAgICAjIENyZWF0ZSBhIGJ1bmNoIG9mIHRocmVhZHMsIGxldCBlYWNoIGRvIHNvbWUgd29yaywgd2FpdCB1bnRpbCBhbGwgYXJlCisgICAgIyBkb25lLgorICAgIGRlZiB0ZXN0X3ZhcmlvdXNfb3BzKHNlbGYpOgorICAgICAgICAjIFRoaXMgdGFrZXMgYWJvdXQgbi8zIHNlY29uZHMgdG8gcnVuIChhYm91dCBuLzMgY2x1bXBzIG9mIHRhc2tzLAorICAgICAgICAjIHRpbWVzIGFib3V0IDEgc2Vjb25kIHBlciBjbHVtcCkuCisgICAgICAgIE5VTVRBU0tTID0gMTAKKworICAgICAgICAjIG5vIG1vcmUgdGhhbiAzIG9mIHRoZSAxMCBjYW4gcnVuIGF0IG9uY2UKKyAgICAgICAgc2VtYSA9IHRocmVhZGluZy5Cb3VuZGVkU2VtYXBob3JlKHZhbHVlPTMpCisgICAgICAgIG11dGV4ID0gdGhyZWFkaW5nLlJMb2NrKCkKKyAgICAgICAgbnVtcnVubmluZyA9IENvdW50ZXIoKQorCisgICAgICAgIHRocmVhZHMgPSBbXQorCisgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTVRBU0tTKToKKyAgICAgICAgICAgIHQgPSBUZXN0VGhyZWFkKCI8dGhyZWFkICVkPiIlaSwgc2VsZiwgc2VtYSwgbXV0ZXgsIG51bXJ1bm5pbmcpCisgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LmlkZW50LCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKCc8VGVzdFRocmVhZFwoLiosIGluaXRpYWxcKT4nLCByZXByKHQpKSkKKyAgICAgICAgICAgIHQuc3RhcnQoKQorCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAnd2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlJworICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgdC5qb2luKE5VTVRBU0tTKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0LmlzX2FsaXZlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHQuaWRlbnQsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQuaWRlbnQgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnPFRlc3RUaHJlYWRcKC4qLCBcdysgLT9cZCtcKT4nLCByZXByKHQpKSkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdhbGwgdGFza3MgZG9uZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1ydW5uaW5nLmdldCgpLCAwKQorCisgICAgZGVmIHRlc3RfaWRlbnRfb2Zfbm9fdGhyZWFkaW5nX3RocmVhZHMoc2VsZik6CisgICAgICAgICMgVGhlIGlkZW50IHN0aWxsIG11c3Qgd29yayBmb3IgdGhlIG1haW4gdGhyZWFkIGFuZCBkdW1teSB0aHJlYWRzLgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHRocmVhZGluZy5jdXJyZW50VGhyZWFkKCkuaWRlbnQgaXMgTm9uZSkKKyAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgIGlkZW50LmFwcGVuZCh0aHJlYWRpbmcuY3VycmVudFRocmVhZCgpLmlkZW50KQorICAgICAgICAgICAgZG9uZS5zZXQoKQorICAgICAgICBkb25lID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgaWRlbnQgPSBbXQorICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZChmLCAoKSkKKyAgICAgICAgZG9uZS53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpZGVudFswXSBpcyBOb25lKQorICAgICAgICAjIEtpbGwgdGhlICJpbW1vcnRhbCIgX0R1bW15VGhyZWFkCisgICAgICAgIGRlbCB0aHJlYWRpbmcuX2FjdGl2ZVtpZGVudFswXV0KKworICAgICMgcnVuIHdpdGggYSBzbWFsbChpc2gpIHRocmVhZCBzdGFjayBzaXplICgyNTZrQikKKyAgICBkZWYgdGVzdF92YXJpb3VzX29wc19zbWFsbF9zdGFjayhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd3aXRoIDI1NmtCIHRocmVhZCBzdGFjayBzaXplLi4uJworICAgICAgICB0cnk6CisgICAgICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgyNjIxNDQpCisgICAgICAgIGV4Y2VwdCB0aHJlYWQuZXJyb3I6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRocmVhZCBzdGFjayBzaXplJworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudGVzdF92YXJpb3VzX29wcygpCisgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDApCisKKyAgICAjIHJ1biB3aXRoIGEgbGFyZ2UgdGhyZWFkIHN0YWNrIHNpemUgKDFNQikKKyAgICBkZWYgdGVzdF92YXJpb3VzX29wc19sYXJnZV9zdGFjayhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd3aXRoIDFNQiB0aHJlYWQgc3RhY2sgc2l6ZS4uLicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGhyZWFkaW5nLnN0YWNrX3NpemUoMHgxMDAwMDApCisgICAgICAgIGV4Y2VwdCB0aHJlYWQuZXJyb3I6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRocmVhZCBzdGFjayBzaXplJworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudGVzdF92YXJpb3VzX29wcygpCisgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDApCisKKyAgICBkZWYgdGVzdF9mb3JlaWduX3RocmVhZChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGEgImZvcmVpZ24iIHRocmVhZCBjYW4gdXNlIHRoZSB0aHJlYWRpbmcgbW9kdWxlLgorICAgICAgICBkZWYgZihtdXRleCk6CisgICAgICAgICAgICAjIENhbGxpbmcgY3VycmVudF90aHJlYWQoKSBmb3JjZXMgYW4gZW50cnkgZm9yIHRoZSBmb3JlaWduCisgICAgICAgICAgICAjIHRocmVhZCB0byBnZXQgbWFkZSBpbiB0aGUgdGhyZWFkaW5nLl9hY3RpdmUgbWFwLgorICAgICAgICAgICAgdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKKyAgICAgICAgICAgIG11dGV4LnJlbGVhc2UoKQorCisgICAgICAgIG11dGV4ID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICBtdXRleC5hY3F1aXJlKCkKKyAgICAgICAgdGlkID0gdGhyZWFkLnN0YXJ0X25ld190aHJlYWQoZiwgKG11dGV4LCkpCisgICAgICAgICMgV2FpdCBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2guCisgICAgICAgIG11dGV4LmFjcXVpcmUoKQorICAgICAgICBzZWxmLmFzc2VydEluKHRpZCwgdGhyZWFkaW5nLl9hY3RpdmUpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0aHJlYWRpbmcuX2FjdGl2ZVt0aWRdLCB0aHJlYWRpbmcuX0R1bW15VGhyZWFkKQorICAgICAgICBkZWwgdGhyZWFkaW5nLl9hY3RpdmVbdGlkXQorCisgICAgIyBQeVRocmVhZFN0YXRlX1NldEFzeW5jRXhjKCkgaXMgYSBDUHl0aG9uLW9ubHkgZ2ltbWljaywgbm90IChjdXJyZW50bHkpCisgICAgIyBleHBvc2VkIGF0IHRoZSBQeXRob24gbGV2ZWwuICBUaGlzIHRlc3QgcmVsaWVzIG9uIGN0eXBlcyB0byBnZXQgYXQgaXQuCisgICAgZGVmIHRlc3RfUHlUaHJlYWRTdGF0ZV9TZXRBc3luY0V4YyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJ0ZXN0X1B5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMgY2FuJ3QgaW1wb3J0IGN0eXBlcyIKKyAgICAgICAgICAgIHJldHVybiAgIyBjYW4ndCBkbyBhbnl0aGluZworCisgICAgICAgIHNldF9hc3luY19leGMgPSBjdHlwZXMucHl0aG9uYXBpLlB5VGhyZWFkU3RhdGVfU2V0QXN5bmNFeGMKKworICAgICAgICBjbGFzcyBBc3luY0V4YyhFeGNlcHRpb24pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGV4Y2VwdGlvbiA9IGN0eXBlcy5weV9vYmplY3QoQXN5bmNFeGMpCisKKyAgICAgICAgIyBGaXJzdCBjaGVjayBpdCB3b3JrcyB3aGVuIHNldHRpbmcgdGhlIGV4Y2VwdGlvbiBmcm9tIHRoZSBzYW1lIHRocmVhZC4KKyAgICAgICAgdGlkID0gdGhyZWFkLmdldF9pZGVudCgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gc2V0X2FzeW5jX2V4YyhjdHlwZXMuY19sb25nKHRpZCksIGV4Y2VwdGlvbikKKyAgICAgICAgICAgICMgVGhlIGV4Y2VwdGlvbiBpcyBhc3luYywgc28gd2UgbWlnaHQgaGF2ZSB0byBrZWVwIHRoZSBWTSBidXN5IHVudGlsCisgICAgICAgICAgICAjIGl0IG5vdGljZXMuCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IEFzeW5jRXhjOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBUaGlzIGNvZGUgaXMgdW5yZWFjaGFibGUgYnV0IGl0IHJlZmxlY3RzIHRoZSBpbnRlbnQuIElmIHdlIHdhbnRlZAorICAgICAgICAgICAgIyB0byBiZSBzbWFydGVyIHRoZSBhYm92ZSBsb29wIHdvdWxkbid0IGJlIGluZmluaXRlLgorICAgICAgICAgICAgc2VsZi5mYWlsKCJBc3luY0V4YyBub3QgcmFpc2VkIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDEpICMgb25lIHRocmVhZCBzdGF0ZSBtb2RpZmllZAorICAgICAgICBleGNlcHQgVW5ib3VuZExvY2FsRXJyb3I6CisgICAgICAgICAgICAjIFRoZSBleGNlcHRpb24gd2FzIHJhaXNlZCB0b28gcXVpY2tseSBmb3IgdXMgdG8gZ2V0IHRoZSByZXN1bHQuCisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBgd29ya2VyX3N0YXJ0ZWRgIGlzIHNldCBieSB0aGUgdGhyZWFkIHdoZW4gaXQncyBpbnNpZGUgYSB0cnkvZXhjZXB0CisgICAgICAgICMgYmxvY2sgd2FpdGluZyB0byBjYXRjaCB0aGUgYXN5bmNocm9ub3VzbHkgc2V0IEFzeW5jRXhjIGV4Y2VwdGlvbi4KKyAgICAgICAgIyBgd29ya2VyX3Nhd19leGNlcHRpb25gIGlzIHNldCBieSB0aGUgdGhyZWFkIHVwb24gY2F0Y2hpbmcgdGhhdAorICAgICAgICAjIGV4Y2VwdGlvbi4KKyAgICAgICAgd29ya2VyX3N0YXJ0ZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICB3b3JrZXJfc2F3X2V4Y2VwdGlvbiA9IHRocmVhZGluZy5FdmVudCgpCisKKyAgICAgICAgY2xhc3MgV29ya2VyKHRocmVhZGluZy5UaHJlYWQpOgorICAgICAgICAgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmlkID0gdGhyZWFkLmdldF9pZGVudCgpCisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2hlZCA9IEZhbHNlCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXJfc3RhcnRlZC5zZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgICAgICAgICAgZXhjZXB0IEFzeW5jRXhjOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICB3b3JrZXJfc2F3X2V4Y2VwdGlvbi5zZXQoKQorCisgICAgICAgIHQgPSBXb3JrZXIoKQorICAgICAgICB0LmRhZW1vbiA9IFRydWUgIyBzbyBpZiB0aGlzIGZhaWxzLCB3ZSBkb24ndCBoYW5nIFB5dGhvbiBhdCBzaHV0ZG93bgorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIgICAgc3RhcnRlZCB3b3JrZXIgdGhyZWFkIgorCisgICAgICAgICMgVHJ5IGEgdGhyZWFkIGlkIHRoYXQgZG9lc24ndCBtYWtlIHNlbnNlLgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiAgICB0cnlpbmcgbm9uc2Vuc2ljYWwgdGhyZWFkIGlkIgorICAgICAgICByZXN1bHQgPSBzZXRfYXN5bmNfZXhjKGN0eXBlcy5jX2xvbmcoLTEpLCBleGNlcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAwKSAgIyBubyB0aHJlYWQgc3RhdGVzIG1vZGlmaWVkCisKKyAgICAgICAgIyBOb3cgcmFpc2UgYW4gZXhjZXB0aW9uIGluIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIiAgICB3YWl0aW5nIGZvciB3b3JrZXIgdGhyZWFkIHRvIGdldCBzdGFydGVkIgorICAgICAgICByZXQgPSB3b3JrZXJfc3RhcnRlZC53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJldCkKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIgICAgdmVyaWZ5aW5nIHdvcmtlciBoYXNuJ3QgZXhpdGVkIgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQuZmluaXNoZWQpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiICAgIGF0dGVtcHRpbmcgdG8gcmFpc2UgYXN5bmNoIGV4Y2VwdGlvbiBpbiB3b3JrZXIiCisgICAgICAgIHJlc3VsdCA9IHNldF9hc3luY19leGMoY3R5cGVzLmNfbG9uZyh0LmlkKSwgZXhjZXB0aW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMSkgIyBvbmUgdGhyZWFkIHN0YXRlIG1vZGlmaWVkCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiICAgIHdhaXRpbmcgZm9yIHdvcmtlciB0byBzYXkgaXQgY2F1Z2h0IHRoZSBleGNlcHRpb24iCisgICAgICAgIHdvcmtlcl9zYXdfZXhjZXB0aW9uLndhaXQodGltZW91dD0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQuZmluaXNoZWQpCisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiICAgIGFsbCBPSyAtLSBqb2luaW5nIHdvcmtlciIKKyAgICAgICAgaWYgdC5maW5pc2hlZDoKKyAgICAgICAgICAgIHQuam9pbigpCisgICAgICAgICMgZWxzZSB0aGUgdGhyZWFkIGlzIHN0aWxsIHJ1bm5pbmcsIGFuZCB3ZSBoYXZlIG5vIHdheSB0byBraWxsIGl0CisKKyAgICBkZWYgdGVzdF9saW1ib19jbGVhbnVwKHNlbGYpOgorICAgICAgICAjIElzc3VlIDc0ODE6IEZhaWx1cmUgdG8gc3RhcnQgdGhyZWFkIHNob3VsZCBjbGVhbnVwIHRoZSBsaW1ibyBtYXAuCisgICAgICAgIGRlZiBmYWlsX25ld190aHJlYWQoKmFyZ3MpOgorICAgICAgICAgICAgcmFpc2UgdGhyZWFkLmVycm9yKCkKKyAgICAgICAgX3N0YXJ0X25ld190aHJlYWQgPSB0aHJlYWRpbmcuX3N0YXJ0X25ld190aHJlYWQKKyAgICAgICAgdGhyZWFkaW5nLl9zdGFydF9uZXdfdGhyZWFkID0gZmFpbF9uZXdfdGhyZWFkCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1sYW1iZGE6IE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0aHJlYWQuZXJyb3IsIHQuc3RhcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICAgICAgICAgIHQgaW4gdGhyZWFkaW5nLl9saW1ibywKKyAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNsZWFudXAgX2xpbWJvIG1hcCBvbiBmYWlsdXJlIG9mIFRocmVhZC5zdGFydCgpLiIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB0aHJlYWRpbmcuX3N0YXJ0X25ld190aHJlYWQgPSBfc3RhcnRfbmV3X3RocmVhZAorCisgICAgZGVmIHRlc3RfZmluYWxpemVfcnVubm5pbmdfdGhyZWFkKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE0MDI6IHRoZSBQeUdJTFN0YXRlX0Vuc3VyZSAvIF9SZWxlYXNlIGZ1bmN0aW9ucyBtYXkgYmUgY2FsbGVkCisgICAgICAgICMgdmVyeSBsYXRlIG9uIHB5dGhvbiBleGl0OiBvbiBkZWFsbG9jYXRpb24gb2YgYSBydW5uaW5nIHRocmVhZCBmb3IKKyAgICAgICAgIyBleGFtcGxlLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgY3R5cGVzCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQoInRlc3RfZmluYWxpemVfd2l0aF9ydW5ubmluZ190aHJlYWQgY2FuJ3QgaW1wb3J0IGN0eXBlcyIpCisgICAgICAgICAgICByZXR1cm4gICMgY2FuJ3QgZG8gYW55dGhpbmcKKworICAgICAgICByYyA9IHN1YnByb2Nlc3MuY2FsbChbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiImlmIDE6CisgICAgICAgICAgICBpbXBvcnQgY3R5cGVzLCBzeXMsIHRpbWUsIHRocmVhZAorCisgICAgICAgICAgICAjIFRoaXMgbG9jayBpcyB1c2VkIGFzIGEgc2ltcGxlIGV2ZW50IHZhcmlhYmxlLgorICAgICAgICAgICAgcmVhZHkgPSB0aHJlYWQuYWxsb2NhdGVfbG9jaygpCisgICAgICAgICAgICByZWFkeS5hY3F1aXJlKCkKKworICAgICAgICAgICAgIyBNb2R1bGUgZ2xvYmFscyBhcmUgY2xlYXJlZCBiZWZvcmUgX19kZWxfXyBpcyBydW4KKyAgICAgICAgICAgICMgU28gd2Ugc2F2ZSB0aGUgZnVuY3Rpb25zIGluIGNsYXNzIGRpY3QKKyAgICAgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICAgICAgZW5zdXJlID0gY3R5cGVzLnB5dGhvbmFwaS5QeUdJTFN0YXRlX0Vuc3VyZQorICAgICAgICAgICAgICAgIHJlbGVhc2UgPSBjdHlwZXMucHl0aG9uYXBpLlB5R0lMU3RhdGVfUmVsZWFzZQorICAgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHNlbGYuZW5zdXJlKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWxlYXNlKHN0YXRlKQorCisgICAgICAgICAgICBkZWYgd2FpdGluZ1RocmVhZCgpOgorICAgICAgICAgICAgICAgIHggPSBDKCkKKyAgICAgICAgICAgICAgICByZWFkeS5yZWxlYXNlKCkKKyAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDEwMCkKKworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQod2FpdGluZ1RocmVhZCwgKCkpCisgICAgICAgICAgICByZWFkeS5hY3F1aXJlKCkgICMgQmUgc3VyZSB0aGUgb3RoZXIgdGhyZWFkIGlzIHdhaXRpbmcuCisgICAgICAgICAgICBzeXMuZXhpdCg0MikKKyAgICAgICAgICAgICIiIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmMsIDQyKQorCisgICAgZGVmIHRlc3RfZmluYWxpemVfd2l0aF90cmFjZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZTE3MzM3NTcKKyAgICAgICAgIyBBdm9pZCBhIGRlYWRsb2NrIHdoZW4gc3lzLnNldHRyYWNlIHN0ZXBzIGludG8gdGhyZWFkaW5nLl9zaHV0ZG93bgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsICIiImlmIDE6CisgICAgICAgICAgICBpbXBvcnQgc3lzLCB0aHJlYWRpbmcKKworICAgICAgICAgICAgIyBBIGRlYWRsb2NrLWtpbGxlciwgdG8gcHJldmVudCB0aGUKKyAgICAgICAgICAgICMgdGVzdHN1aXRlIHRvIGhhbmcgZm9yZXZlcgorICAgICAgICAgICAgZGVmIGtpbGxlcigpOgorICAgICAgICAgICAgICAgIGltcG9ydCBvcywgdGltZQorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMikKKyAgICAgICAgICAgICAgICBwcmludCAncHJvZ3JhbSBibG9ja2VkOyBhYm9ydGluZycKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgyKQorICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWtpbGxlcikKKyAgICAgICAgICAgIHQuZGFlbW9uID0gVHJ1ZQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgdHJhY2UgZnVuY3Rpb24KKyAgICAgICAgICAgIGRlZiBmdW5jKGZyYW1lLCBldmVudCwgYXJnKToKKyAgICAgICAgICAgICAgICB0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKQorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jCisKKyAgICAgICAgICAgIHN5cy5zZXR0cmFjZShmdW5jKQorICAgICAgICAgICAgIiIiXSwKKyAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRvdXQuY2xvc2UpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChwLnN0ZGVyci5jbG9zZSkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSBwLmNvbW11bmljYXRlKCkKKyAgICAgICAgcmMgPSBwLnJldHVybmNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyYyA9PSAyLCAiaW50ZXJwcmV0ZWQgd2FzIGJsb2NrZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmMgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGVycm9yOiAiICsgcmVwcihzdGRlcnIpKQorCisgICAgZGVmIHRlc3Rfam9pbl9ub25kYWVtb25fb25fc2h1dGRvd24oc2VsZik6CisgICAgICAgICMgSXNzdWUgMTcyMjM0NAorICAgICAgICAjIFJhaXNpbmcgU3lzdGVtRXhpdCBza2lwcGVkIHRocmVhZGluZy5fc2h1dGRvd24KKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCAiIiJpZiAxOgorICAgICAgICAgICAgICAgIGltcG9ydCB0aHJlYWRpbmcKKyAgICAgICAgICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHNsZWVwCisKKyAgICAgICAgICAgICAgICBkZWYgY2hpbGQoKToKKyAgICAgICAgICAgICAgICAgICAgc2xlZXAoMSkKKyAgICAgICAgICAgICAgICAgICAgIyBBcyBhIG5vbi1kYWVtb24gdGhyZWFkIHdlIFNIT1VMRCB3YWtlIHVwIGFuZCBub3RoaW5nCisgICAgICAgICAgICAgICAgICAgICMgc2hvdWxkIGJlIHRvcm4gZG93biB5ZXQKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIldva2UgdXAsIHNsZWVwIGZ1bmN0aW9uIGlzOiIsIHNsZWVwCisKKyAgICAgICAgICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1jaGlsZCkuc3RhcnQoKQorICAgICAgICAgICAgICAgIHJhaXNlIFN5c3RlbUV4aXQKKyAgICAgICAgICAgICIiIl0sCisgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHAuc3Rkb3V0LmNsb3NlKQorICAgICAgICBzZWxmLmFkZENsZWFudXAocC5zdGRlcnIuY2xvc2UpCisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3Rkb3V0LnN0cmlwKCksCisgICAgICAgICAgICAiV29rZSB1cCwgc2xlZXAgZnVuY3Rpb24gaXM6IDxidWlsdC1pbiBmdW5jdGlvbiBzbGVlcD4iKQorICAgICAgICBzdGRlcnIgPSByZS5zdWIociJeXFtcZCsgcmVmc1xdIiwgIiIsIHN0ZGVyciwgcmUuTVVMVElMSU5FKS5zdHJpcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RkZXJyLCAiIikKKworICAgIGRlZiB0ZXN0X2VudW1lcmF0ZV9hZnRlcl9qb2luKHNlbGYpOgorICAgICAgICAjIFRyeSBoYXJkIHRvIHRyaWdnZXIgIzE3MDM0NDg6IGEgdGhyZWFkIGlzIHN0aWxsIHJldHVybmVkIGluCisgICAgICAgICMgdGhyZWFkaW5nLmVudW1lcmF0ZSgpIGFmdGVyIGl0IGhhcyBiZWVuIGpvaW4oKWVkLgorICAgICAgICBlbnVtID0gdGhyZWFkaW5nLmVudW1lcmF0ZQorICAgICAgICBvbGRfaW50ZXJ2YWwgPSBzeXMuZ2V0Y2hlY2tpbnRlcnZhbCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxLCAxMDApOgorICAgICAgICAgICAgICAgICMgVHJ5IGEgY291cGxlIHRpbWVzIGF0IGVhY2ggdGhyZWFkLXN3aXRjaGluZyBpbnRlcnZhbAorICAgICAgICAgICAgICAgICMgdG8gZ2V0IG1vcmUgaW50ZXJsZWF2aW5ncy4KKyAgICAgICAgICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbChpIC8vIDUpCisgICAgICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWxhbWJkYTogTm9uZSkKKyAgICAgICAgICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICAgICAgICAgIGwgPSBlbnVtKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKHQsIGwsCisgICAgICAgICAgICAgICAgICAgICIjMTcwMzQ0OCB0cmlnZ2VyZWQgYWZ0ZXIgJWQgdHJpYWxzOiAlcyIgJSAoaSwgbCkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbChvbGRfaW50ZXJ2YWwpCisKKyAgICBkZWYgdGVzdF9ub19yZWZjeWNsZV90aHJvdWdoX3RhcmdldChzZWxmKToKKyAgICAgICAgY2xhc3MgUnVuU2VsZkZ1bmN0aW9uKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc2hvdWxkX3JhaXNlKToKKyAgICAgICAgICAgICAgICAjIFRoZSBsaW5rcyBpbiB0aGlzIHJlZmN5Y2xlIGZyb20gVGhyZWFkIGJhY2sgdG8gc2VsZgorICAgICAgICAgICAgICAgICMgc2hvdWxkIGJlIGNsZWFuZWQgdXAgd2hlbiB0aGUgdGhyZWFkIGNvbXBsZXRlcy4KKyAgICAgICAgICAgICAgICBzZWxmLnNob3VsZF9yYWlzZSA9IHNob3VsZF9yYWlzZQorICAgICAgICAgICAgICAgIHNlbGYudGhyZWFkID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VsZi5fcnVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPShzZWxmLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3YXJncz17J3lldF9hbm90aGVyJzpzZWxmfSkKKyAgICAgICAgICAgICAgICBzZWxmLnRocmVhZC5zdGFydCgpCisKKyAgICAgICAgICAgIGRlZiBfcnVuKHNlbGYsIG90aGVyX3JlZiwgeWV0X2Fub3RoZXIpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuc2hvdWxkX3JhaXNlOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisKKyAgICAgICAgY3ljbGljX29iamVjdCA9IFJ1blNlbGZGdW5jdGlvbihzaG91bGRfcmFpc2U9RmFsc2UpCisgICAgICAgIHdlYWtfY3ljbGljX29iamVjdCA9IHdlYWtyZWYucmVmKGN5Y2xpY19vYmplY3QpCisgICAgICAgIGN5Y2xpY19vYmplY3QudGhyZWFkLmpvaW4oKQorICAgICAgICBkZWwgY3ljbGljX29iamVjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHdlYWtfY3ljbGljX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0oJyVkIHJlZmVyZW5jZXMgc3RpbGwgYXJvdW5kJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMuZ2V0cmVmY291bnQod2Vha19jeWNsaWNfb2JqZWN0KCkpKSkKKworICAgICAgICByYWlzaW5nX2N5Y2xpY19vYmplY3QgPSBSdW5TZWxmRnVuY3Rpb24oc2hvdWxkX3JhaXNlPVRydWUpCisgICAgICAgIHdlYWtfcmFpc2luZ19jeWNsaWNfb2JqZWN0ID0gd2Vha3JlZi5yZWYocmFpc2luZ19jeWNsaWNfb2JqZWN0KQorICAgICAgICByYWlzaW5nX2N5Y2xpY19vYmplY3QudGhyZWFkLmpvaW4oKQorICAgICAgICBkZWwgcmFpc2luZ19jeWNsaWNfb2JqZWN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgd2Vha19yYWlzaW5nX2N5Y2xpY19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9KCclZCByZWZlcmVuY2VzIHN0aWxsIGFyb3VuZCcgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldHJlZmNvdW50KHdlYWtfcmFpc2luZ19jeWNsaWNfb2JqZWN0KCkpKSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdmb3JrJyksICd0ZXN0IG5lZWRzIGZvcmsoKScpCisgICAgZGVmIHRlc3RfZHVtbXlfdGhyZWFkX2FmdGVyX2Zvcmsoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE0MzA4OiBhIGR1bW15IHRocmVhZCBpbiB0aGUgYWN0aXZlIGxpc3QgZG9lc24ndCBtZXNzIHVwCisgICAgICAgICMgdGhlIGFmdGVyLWZvcmsgbWVjaGFuaXNtLgorICAgICAgICBjb2RlID0gIiIiaWYgMToKKyAgICAgICAgICAgIGltcG9ydCB0aHJlYWQsIHRocmVhZGluZywgb3MsIHRpbWUKKworICAgICAgICAgICAgZGVmIGJhY2tncm91bmRfdGhyZWFkKGV2dCk6CisgICAgICAgICAgICAgICAgIyBDcmVhdGVzIGFuZCByZWdpc3RlcnMgdGhlIF9EdW1teVRocmVhZCBpbnN0YW5jZQorICAgICAgICAgICAgICAgIHRocmVhZGluZy5jdXJyZW50X3RocmVhZCgpCisgICAgICAgICAgICAgICAgZXZ0LnNldCgpCisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgxMCkKKworICAgICAgICAgICAgZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKGJhY2tncm91bmRfdGhyZWFkLCAoZXZ0LCkpCisgICAgICAgICAgICBldnQud2FpdCgpCisgICAgICAgICAgICBhc3NlcnQgdGhyZWFkaW5nLmFjdGl2ZV9jb3VudCgpID09IDIsIHRocmVhZGluZy5hY3RpdmVfY291bnQoKQorICAgICAgICAgICAgaWYgb3MuZm9yaygpID09IDA6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHRocmVhZGluZy5hY3RpdmVfY291bnQoKSA9PSAxLCB0aHJlYWRpbmcuYWN0aXZlX2NvdW50KCkKKyAgICAgICAgICAgICAgICBvcy5fZXhpdCgwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBvcy53YWl0KCkKKyAgICAgICAgIiIiCisgICAgICAgIF8sIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vaygiLWMiLCBjb2RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCAnJykKKworCitjbGFzcyBUaHJlYWRKb2luT25TaHV0ZG93bihCYXNlVGVzdENhc2UpOgorCisgICAgIyBCZXR3ZWVuIGZvcmsoKSBhbmQgZXhlYygpLCBvbmx5IGFzeW5jLXNhZmUgZnVuY3Rpb25zIGFyZSBhbGxvd2VkIChpc3N1ZXMKKyAgICAjICMxMjMxNiBhbmQgIzExODcwKSwgYW5kIGZvcmsoKSBmcm9tIGEgd29ya2VyIHRocmVhZCBpcyBrbm93biB0byB0cmlnZ2VyCisgICAgIyBwcm9ibGVtcyB3aXRoIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgKGlzc3VlICMzODYzKTogc2tpcCBwcm9ibGVtYXRpYyB0ZXN0cworICAgICMgb24gcGxhdGZvcm1zIGtub3duIHRvIGJlaGF2ZSBiYWRseS4KKyAgICBwbGF0Zm9ybXNfdG9fc2tpcCA9ICgnZnJlZWJzZDQnLCAnZnJlZWJzZDUnLCAnZnJlZWJzZDYnLCAnbmV0YnNkNScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ29zMmVteCcpCisKKyAgICBkZWYgX3J1bl9hbmRfam9pbihzZWxmLCBzY3JpcHQpOgorICAgICAgICBzY3JpcHQgPSAiIiJpZiAxOgorICAgICAgICAgICAgaW1wb3J0IHN5cywgb3MsIHRpbWUsIHRocmVhZGluZworCisgICAgICAgICAgICAjIGEgdGhyZWFkLCB3aGljaCB3YWl0cyBmb3IgdGhlIG1haW4gcHJvZ3JhbSB0byB0ZXJtaW5hdGUKKyAgICAgICAgICAgIGRlZiBqb2luaW5nZnVuYyhtYWludGhyZWFkKToKKyAgICAgICAgICAgICAgICBtYWludGhyZWFkLmpvaW4oKQorICAgICAgICAgICAgICAgIHByaW50ICdlbmQgb2YgdGhyZWFkJworICAgICAgICBcbiIiIiArIHNjcmlwdAorCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1jIiwgc2NyaXB0XSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgcmMgPSBwLndhaXQoKQorICAgICAgICBkYXRhID0gcC5zdGRvdXQucmVhZCgpLnJlcGxhY2UoJ1xyJywgJycpCisgICAgICAgIHAuc3Rkb3V0LmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAiZW5kIG9mIG1haW5cbmVuZCBvZiB0aHJlYWRcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmMgPT0gMiwgImludGVycHJldGVyIHdhcyBibG9ja2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJjID09IDAsICJVbmV4cGVjdGVkIGVycm9yIikKKworICAgIGRlZiB0ZXN0XzFfam9pbl9vbl9zaHV0ZG93bihzZWxmKToKKyAgICAgICAgIyBUaGUgdXN1YWwgY2FzZTogb24gZXhpdCwgd2FpdCBmb3IgYSBub24tZGFlbW9uIHRocmVhZAorICAgICAgICBzY3JpcHQgPSAiIiJpZiAxOgorICAgICAgICAgICAgaW1wb3J0IG9zCisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9am9pbmluZ2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSh0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKSwpKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKyAgICAgICAgICAgIHByaW50ICdlbmQgb2YgbWFpbicKKyAgICAgICAgICAgICIiIgorICAgICAgICBzZWxmLl9ydW5fYW5kX2pvaW4oc2NyaXB0KQorCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAnZm9yaycpLCAibmVlZHMgb3MuZm9yaygpIikKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSBpbiBwbGF0Zm9ybXNfdG9fc2tpcCwgImR1ZSB0byBrbm93biBPUyBidWciKQorICAgIGRlZiB0ZXN0XzJfam9pbl9pbl9mb3JrZWRfcHJvY2VzcyhzZWxmKToKKyAgICAgICAgIyBMaWtlIHRoZSB0ZXN0IGFib3ZlLCBidXQgZnJvbSBhIGZvcmtlZCBpbnRlcnByZXRlcgorICAgICAgICBzY3JpcHQgPSAiIiJpZiAxOgorICAgICAgICAgICAgY2hpbGRwaWQgPSBvcy5mb3JrKCkKKyAgICAgICAgICAgIGlmIGNoaWxkcGlkICE9IDA6CisgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChjaGlsZHBpZCwgMCkKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9am9pbmluZ2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzPSh0aHJlYWRpbmcuY3VycmVudF90aHJlYWQoKSwpKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICBwcmludCAnZW5kIG9mIG1haW4nCisgICAgICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcnVuX2FuZF9qb2luKHNjcmlwdCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdmb3JrJyksICJuZWVkcyBvcy5mb3JrKCkiKQorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtIGluIHBsYXRmb3Jtc190b19za2lwLCAiZHVlIHRvIGtub3duIE9TIGJ1ZyIpCisgICAgZGVmIHRlc3RfM19qb2luX2luX2ZvcmtlZF9mcm9tX3RocmVhZChzZWxmKToKKyAgICAgICAgIyBMaWtlIHRoZSB0ZXN0IGFib3ZlLCBidXQgZm9yaygpIHdhcyBjYWxsZWQgZnJvbSBhIHdvcmtlciB0aHJlYWQKKyAgICAgICAgIyBJbiB0aGUgZm9ya2VkIHByb2Nlc3MsIHRoZSBtYWluIFRocmVhZCBvYmplY3QgbXVzdCBiZSBtYXJrZWQgYXMgc3RvcHBlZC4KKyAgICAgICAgc2NyaXB0ID0gIiIiaWYgMToKKyAgICAgICAgICAgIG1haW5fdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKKyAgICAgICAgICAgIGRlZiB3b3JrZXIoKToKKyAgICAgICAgICAgICAgICBjaGlsZHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgICAgIGlmIGNoaWxkcGlkICE9IDA6CisgICAgICAgICAgICAgICAgICAgIG9zLndhaXRwaWQoY2hpbGRwaWQsIDApCisgICAgICAgICAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9am9pbmluZ2Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncz0obWFpbl90aHJlYWQsKSkKKyAgICAgICAgICAgICAgICBwcmludCAnZW5kIG9mIG1haW4nCisgICAgICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICAgICAgdC5qb2luKCkgIyBTaG91bGQgbm90IGJsb2NrOiBtYWluX3RocmVhZCBpcyBhbHJlYWR5IHN0b3BwZWQKKworICAgICAgICAgICAgdyA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXdvcmtlcikKKyAgICAgICAgICAgIHcuc3RhcnQoKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX3J1bl9hbmRfam9pbihzY3JpcHQpCisKKyAgICBkZWYgYXNzZXJ0U2NyaXB0SGFzT3V0cHV0KHNlbGYsIHNjcmlwdCwgZXhwZWN0ZWRfb3V0cHV0KToKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLWMiLCBzY3JpcHRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICByYyA9IHAud2FpdCgpCisgICAgICAgIGRhdGEgPSBwLnN0ZG91dC5yZWFkKCkuZGVjb2RlKCkucmVwbGFjZSgnXHInLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYywgMCwgIlVuZXhwZWN0ZWQgZXJyb3IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGV4cGVjdGVkX291dHB1dCkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdmb3JrJyksICJuZWVkcyBvcy5mb3JrKCkiKQorICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtIGluIHBsYXRmb3Jtc190b19za2lwLCAiZHVlIHRvIGtub3duIE9TIGJ1ZyIpCisgICAgZGVmIHRlc3RfNF9qb2luaW5nX2Fjcm9zc19mb3JrX2luX3dvcmtlcl90aHJlYWQoc2VsZik6CisgICAgICAgICMgVGhlcmUgdXNlZCB0byBiZSBhIHBvc3NpYmxlIGRlYWRsb2NrIHdoZW4gZm9ya2luZyBmcm9tIGEgY2hpbGQKKyAgICAgICAgIyB0aHJlYWQuICBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTY2NDMuCisKKyAgICAgICAgIyBUaGUgc2NyaXB0IHRha2VzIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisgICAgICAgICMgLSBUaGUgbWFpbiB0aHJlYWQgaW4gdGhlIHBhcmVudCBwcm9jZXNzIHN0YXJ0cyBhIG5ldyB0aHJlYWQgYW5kIHRoZW4KKyAgICAgICAgIyAgIHRyaWVzIHRvIGpvaW4gaXQuCisgICAgICAgICMgLSBUaGUgam9pbiBvcGVyYXRpb24gYWNxdWlyZXMgdGhlIExvY2sgaW5zaWRlIHRoZSB0aHJlYWQncyBfYmxvY2sKKyAgICAgICAgIyAgIENvbmRpdGlvbi4gIChTZWUgdGhyZWFkaW5nLnB5OlRocmVhZC5qb2luKCkuKQorICAgICAgICAjIC0gV2Ugc3R1YiBvdXQgdGhlIGFjcXVpcmUgbWV0aG9kIG9uIHRoZSBjb25kaXRpb24gdG8gZm9yY2UgaXQgdG8gd2FpdAorICAgICAgICAjICAgdW50aWwgdGhlIGNoaWxkIHRocmVhZCBmb3Jrcy4gIChTZWUgTE9DSyBBQ1FVSVJFRCBIRVJFKQorICAgICAgICAjIC0gVGhlIGNoaWxkIHRocmVhZCBmb3Jrcy4gIChTZWUgTE9DSyBIRUxEIGFuZCBXT1JLRVIgVEhSRUFEIEZPUktTCisgICAgICAgICMgICBIRVJFKQorICAgICAgICAjIC0gVGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwYXJlbnQgcHJvY2VzcyBlbnRlcnMgQ29uZGl0aW9uLndhaXQoKSwKKyAgICAgICAgIyAgIHdoaWNoIHJlbGVhc2VzIHRoZSBsb2NrIG9uIHRoZSBjaGlsZCB0aHJlYWQuCisgICAgICAgICMgLSBUaGUgY2hpbGQgcHJvY2VzcyByZXR1cm5zLiAgV2l0aG91dCB0aGUgbmVjZXNzYXJ5IGZpeCwgd2hlbiB0aGUKKyAgICAgICAgIyAgIG1haW4gdGhyZWFkIG9mIHRoZSBjaGlsZCBwcm9jZXNzICh3aGljaCB1c2VkIHRvIGJlIHRoZSBjaGlsZCB0aHJlYWQKKyAgICAgICAgIyAgIGluIHRoZSBwYXJlbnQgcHJvY2VzcykgYXR0ZW1wdHMgdG8gZXhpdCwgaXQgd2lsbCB0cnkgdG8gYWNxdWlyZSB0aGUKKyAgICAgICAgIyAgIGxvY2sgaW4gdGhlIFRocmVhZC5fYmxvY2sgQ29uZGl0aW9uIG9iamVjdCBhbmQgaGFuZywgYmVjYXVzZSB0aGUKKyAgICAgICAgIyAgIGxvY2sgd2FzIGhlbGQgYWNyb3NzIHRoZSBmb3JrLgorCisgICAgICAgIHNjcmlwdCA9ICIiImlmIDE6CisgICAgICAgICAgICBpbXBvcnQgb3MsIHRpbWUsIHRocmVhZGluZworCisgICAgICAgICAgICBmaW5pc2hfam9pbiA9IEZhbHNlCisgICAgICAgICAgICBzdGFydF9mb3JrID0gRmFsc2UKKworICAgICAgICAgICAgZGVmIHdvcmtlcigpOgorICAgICAgICAgICAgICAgICMgV2FpdCB1bnRpbCB0aGlzIHRocmVhZCdzIGxvY2sgaXMgYWNxdWlyZWQgYmVmb3JlIGZvcmtpbmcgdG8KKyAgICAgICAgICAgICAgICAjIGNyZWF0ZSB0aGUgZGVhZGxvY2suCisgICAgICAgICAgICAgICAgZ2xvYmFsIGZpbmlzaF9qb2luCisgICAgICAgICAgICAgICAgd2hpbGUgbm90IHN0YXJ0X2Zvcms6CisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKyAgICAgICAgICAgICAgICAjIExPQ0sgSEVMRDogTWFpbiB0aHJlYWQgaG9sZHMgbG9jayBhY3Jvc3MgdGhpcyBjYWxsLgorICAgICAgICAgICAgICAgIGNoaWxkcGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICAgICAgZmluaXNoX2pvaW4gPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgY2hpbGRwaWQgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBQYXJlbnQgcHJvY2VzcyBqdXN0IHdhaXRzIGZvciBjaGlsZC4KKyAgICAgICAgICAgICAgICAgICAgb3Mud2FpdHBpZChjaGlsZHBpZCwgMCkKKyAgICAgICAgICAgICAgICAjIENoaWxkIHByb2Nlc3Mgc2hvdWxkIGp1c3QgcmV0dXJuLgorCisgICAgICAgICAgICB3ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9d29ya2VyKQorCisgICAgICAgICAgICAjIFN0dWIgb3V0IHRoZSBwcml2YXRlIGNvbmRpdGlvbiB2YXJpYWJsZSdzIGxvY2sgYWNxdWlyZSBtZXRob2QuCisgICAgICAgICAgICAjIFRoaXMgYWNxdWlyZXMgdGhlIGxvY2sgYW5kIHRoZW4gd2FpdHMgdW50aWwgdGhlIGNoaWxkIGhhcyBmb3JrZWQKKyAgICAgICAgICAgICMgYmVmb3JlIHJldHVybmluZywgd2hpY2ggd2lsbCByZWxlYXNlIHRoZSBsb2NrIHNvb24gYWZ0ZXIuICBJZgorICAgICAgICAgICAgIyBzb21lb25lIGVsc2UgdHJpZXMgdG8gZml4IHRoaXMgdGVzdCBjYXNlIGJ5IGFjcXVpcmluZyB0aGlzIGxvY2sKKyAgICAgICAgICAgICMgYmVmb3JlIGZvcmtpbmcgaW5zdGVhZCBvZiByZXNldHRpbmcgaXQsIHRoZSB0ZXN0IGNhc2Ugd2lsbAorICAgICAgICAgICAgIyBkZWFkbG9jayB3aGVuIGl0IHNob3VsZG4ndC4KKyAgICAgICAgICAgIGNvbmRpdGlvbiA9IHcuX2Jsb2NrCisgICAgICAgICAgICBvcmlnX2FjcXVpcmUgPSBjb25kaXRpb24uYWNxdWlyZQorICAgICAgICAgICAgY2FsbF9jb3VudF9sb2NrID0gdGhyZWFkaW5nLkxvY2soKQorICAgICAgICAgICAgY2FsbF9jb3VudCA9IDAKKyAgICAgICAgICAgIGRlZiBteV9hY3F1aXJlKCk6CisgICAgICAgICAgICAgICAgZ2xvYmFsIGNhbGxfY291bnQKKyAgICAgICAgICAgICAgICBnbG9iYWwgc3RhcnRfZm9yaworICAgICAgICAgICAgICAgIG9yaWdfYWNxdWlyZSgpICAjIExPQ0sgQUNRVUlSRUQgSEVSRQorICAgICAgICAgICAgICAgIHN0YXJ0X2ZvcmsgPSBUcnVlCisgICAgICAgICAgICAgICAgaWYgY2FsbF9jb3VudCA9PSAwOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBub3QgZmluaXNoX2pvaW46CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMDEpICAjIFdPUktFUiBUSFJFQUQgRk9SS1MgSEVSRQorICAgICAgICAgICAgICAgIHdpdGggY2FsbF9jb3VudF9sb2NrOgorICAgICAgICAgICAgICAgICAgICBjYWxsX2NvdW50ICs9IDEKKyAgICAgICAgICAgIGNvbmRpdGlvbi5hY3F1aXJlID0gbXlfYWNxdWlyZQorCisgICAgICAgICAgICB3LnN0YXJ0KCkKKyAgICAgICAgICAgIHcuam9pbigpCisgICAgICAgICAgICBwcmludCgnZW5kIG9mIG1haW4nKQorICAgICAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U2NyaXB0SGFzT3V0cHV0KHNjcmlwdCwgImVuZCBvZiBtYWluXG4iKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgIm5lZWRzIG9zLmZvcmsoKSIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gcGxhdGZvcm1zX3RvX3NraXAsICJkdWUgdG8ga25vd24gT1MgYnVnIikKKyAgICBkZWYgdGVzdF81X2NsZWFyX3dhaXRlcl9sb2Nrc190b19hdm9pZF9jcmFzaChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGEgc3Bhd25lZCB0aHJlYWQgdGhhdCBmb3JrcyBkb2Vzbid0IHNlZ2ZhdWx0IG9uIGNlcnRhaW4KKyAgICAgICAgIyBwbGF0Zm9ybXMsIG5hbWVseSBPUyBYLiAgVGhpcyB1c2VkIHRvIGhhcHBlbiBpZiB0aGVyZSB3YXMgYSB3YWl0ZXIKKyAgICAgICAgIyBsb2NrIGluIHRoZSB0aHJlYWQncyBjb25kaXRpb24gdmFyaWFibGUncyB3YWl0ZXJzIGxpc3QuICBFdmVuIHRob3VnaAorICAgICAgICAjIHdlIGtub3cgdGhlIGxvY2sgd2lsbCBiZSBoZWxkIGFjcm9zcyB0aGUgZm9yaywgaXQgaXMgbm90IHNhZmUgdG8KKyAgICAgICAgIyByZWxlYXNlIGxvY2tzIGhlbGQgYWNyb3NzIGZvcmtzIG9uIGFsbCBwbGF0Zm9ybXMsIHNvIHJlbGVhc2luZyB0aGUKKyAgICAgICAgIyB3YWl0ZXIgbG9jayBjYXVzZWQgYSBzZWdmYXVsdCBvbiBPUyBYLiAgRnVydGhlcm1vcmUsIHNpbmNlIGxvY2tzIG9uCisgICAgICAgICMgT1MgWCBhcmUgKGFzIG9mIHRoaXMgd3JpdGluZykgaW1wbGVtZW50ZWQgd2l0aCBhIG11dGV4ICsgY29uZGl0aW9uCisgICAgICAgICMgdmFyaWFibGUgaW5zdGVhZCBvZiBhIHNlbWFwaG9yZSwgd2hpbGUgd2Uga25vdyB0aGF0IHRoZSBQeXRob24tbGV2ZWwKKyAgICAgICAgIyBsb2NrIHdpbGwgYmUgYWNxdWlyZWQsIHdlIGNhbid0IGtub3cgaWYgdGhlIGludGVybmFsIG11dGV4IHdpbGwgYmUKKyAgICAgICAgIyBhY3F1aXJlZCBhdCB0aGUgdGltZSBvZiB0aGUgZm9yay4KKworICAgICAgICBzY3JpcHQgPSAiIiJpZiBUcnVlOgorICAgICAgICAgICAgaW1wb3J0IG9zLCB0aW1lLCB0aHJlYWRpbmcKKworICAgICAgICAgICAgc3RhcnRfZm9yayA9IEZhbHNlCisKKyAgICAgICAgICAgIGRlZiB3b3JrZXIoKToKKyAgICAgICAgICAgICAgICAjIFdhaXQgdW50aWwgdGhlIG1haW4gdGhyZWFkIGhhcyBhdHRlbXB0ZWQgdG8gam9pbiB0aGlzIHRocmVhZAorICAgICAgICAgICAgICAgICMgYmVmb3JlIGNvbnRpbnVpbmcuCisgICAgICAgICAgICAgICAgd2hpbGUgbm90IHN0YXJ0X2Zvcms6CisgICAgICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoMC4wMSkKKyAgICAgICAgICAgICAgICBjaGlsZHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgICAgIGlmIGNoaWxkcGlkICE9IDA6CisgICAgICAgICAgICAgICAgICAgICMgUGFyZW50IHByb2Nlc3MganVzdCB3YWl0cyBmb3IgY2hpbGQuCisgICAgICAgICAgICAgICAgICAgIChjcGlkLCByYykgPSBvcy53YWl0cGlkKGNoaWxkcGlkLCAwKQorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgY3BpZCA9PSBjaGlsZHBpZAorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgcmMgPT0gMAorICAgICAgICAgICAgICAgICAgICBwcmludCgnZW5kIG9mIHdvcmtlciB0aHJlYWQnKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgQ2hpbGQgcHJvY2VzcyBzaG91bGQganVzdCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdyA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXdvcmtlcikKKworICAgICAgICAgICAgIyBTdHViIG91dCB0aGUgcHJpdmF0ZSBjb25kaXRpb24gdmFyaWFibGUncyBfcmVsZWFzZV9zYXZlIG1ldGhvZC4KKyAgICAgICAgICAgICMgVGhpcyByZWxlYXNlcyB0aGUgY29uZGl0aW9uJ3MgbG9jayBhbmQgZmxpcHMgdGhlIGdsb2JhbCB0aGF0CisgICAgICAgICAgICAjIGNhdXNlcyB0aGUgd29ya2VyIHRvIGZvcmsuICBBdCB0aGlzIHBvaW50LCB0aGUgcHJvYmxlbWF0aWMgd2FpdGVyCisgICAgICAgICAgICAjIGxvY2sgaGFzIGJlZW4gYWNxdWlyZWQgb25jZSBieSB0aGUgd2FpdGVyIGFuZCBoYXMgYmVlbiBwdXQgb250bworICAgICAgICAgICAgIyB0aGUgd2FpdGVycyBsaXN0LgorICAgICAgICAgICAgY29uZGl0aW9uID0gdy5fYmxvY2sKKyAgICAgICAgICAgIG9yaWdfcmVsZWFzZV9zYXZlID0gY29uZGl0aW9uLl9yZWxlYXNlX3NhdmUKKyAgICAgICAgICAgIGRlZiBteV9yZWxlYXNlX3NhdmUoKToKKyAgICAgICAgICAgICAgICBnbG9iYWwgc3RhcnRfZm9yaworICAgICAgICAgICAgICAgIG9yaWdfcmVsZWFzZV9zYXZlKCkKKyAgICAgICAgICAgICAgICAjIFdhaXRlciBsb2NrIGhlbGQgaGVyZSwgY29uZGl0aW9uIGxvY2sgcmVsZWFzZWQuCisgICAgICAgICAgICAgICAgc3RhcnRfZm9yayA9IFRydWUKKyAgICAgICAgICAgIGNvbmRpdGlvbi5fcmVsZWFzZV9zYXZlID0gbXlfcmVsZWFzZV9zYXZlCisKKyAgICAgICAgICAgIHcuc3RhcnQoKQorICAgICAgICAgICAgdy5qb2luKCkKKyAgICAgICAgICAgIHByaW50KCdlbmQgb2YgbWFpbiB0aHJlYWQnKQorICAgICAgICAgICAgIiIiCisgICAgICAgIG91dHB1dCA9ICJlbmQgb2Ygd29ya2VyIHRocmVhZFxuZW5kIG9mIG1haW4gdGhyZWFkXG4iCisgICAgICAgIHNlbGYuYXNzZXJ0U2NyaXB0SGFzT3V0cHV0KHNjcmlwdCwgb3V0cHV0KQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2ZvcmsnKSwgIm5lZWRzIG9zLmZvcmsoKSIpCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gaW4gcGxhdGZvcm1zX3RvX3NraXAsICJkdWUgdG8ga25vd24gT1MgYnVnIikKKyAgICBkZWYgdGVzdF9yZWluaXRfdGxzX2FmdGVyX2Zvcmsoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzEzODE3OiBmb3JrKCkgd291bGQgZGVhZGxvY2sgaW4gYSBtdWx0aXRocmVhZGVkIHByb2dyYW0gd2l0aAorICAgICAgICAjIHRoZSBhZC1ob2MgVExTIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgIGRlZiBkb19mb3JrX2FuZF93YWl0KCk6CisgICAgICAgICAgICAjIGp1c3QgZm9yayBhIGNoaWxkIHByb2Nlc3MgYW5kIHdhaXQgaXQKKyAgICAgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICAgICAgaWYgcGlkID4gMDoKKyAgICAgICAgICAgICAgICBvcy53YWl0cGlkKHBpZCwgMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgb3MuX2V4aXQoMCkKKworICAgICAgICAjIHN0YXJ0IGEgYnVuY2ggb2YgdGhyZWFkcyB0aGF0IHdpbGwgZm9yaygpIGNoaWxkIHByb2Nlc3NlcworICAgICAgICB0aHJlYWRzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTYpOgorICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWRvX2ZvcmtfYW5kX3dhaXQpCisgICAgICAgICAgICB0aHJlYWRzLmFwcGVuZCh0KQorICAgICAgICAgICAgdC5zdGFydCgpCisKKyAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKKyAgICAgICAgICAgIHQuam9pbigpCisKKworY2xhc3MgVGhyZWFkaW5nRXhjZXB0aW9uVGVzdHMoQmFzZVRlc3RDYXNlKToKKyAgICAjIEEgUnVudGltZUVycm9yIHNob3VsZCBiZSByYWlzZWQgaWYgVGhyZWFkLnN0YXJ0KCkgaXMgY2FsbGVkCisgICAgIyBtdWx0aXBsZSB0aW1lcy4KKyAgICBkZWYgdGVzdF9zdGFydF90aHJlYWRfYWdhaW4oc2VsZik6CisgICAgICAgIHRocmVhZCA9IHRocmVhZGluZy5UaHJlYWQoKQorICAgICAgICB0aHJlYWQuc3RhcnQoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHRocmVhZC5zdGFydCkKKworICAgIGRlZiB0ZXN0X2pvaW5pbmdfY3VycmVudF90aHJlYWQoc2VsZik6CisgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gdGhyZWFkaW5nLmN1cnJlbnRfdGhyZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjdXJyZW50X3RocmVhZC5qb2luKTsKKworICAgIGRlZiB0ZXN0X2pvaW5pbmdfaW5hY3RpdmVfdGhyZWFkKHNlbGYpOgorICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB0aHJlYWQuam9pbikKKworICAgIGRlZiB0ZXN0X2RhZW1vbml6ZV9hY3RpdmVfdGhyZWFkKHNlbGYpOgorICAgICAgICB0aHJlYWQgPSB0aHJlYWRpbmcuVGhyZWFkKCkKKyAgICAgICAgdGhyZWFkLnN0YXJ0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzZXRhdHRyLCB0aHJlYWQsICJkYWVtb24iLCBUcnVlKQorCisKK2NsYXNzIExvY2tUZXN0cyhsb2NrX3Rlc3RzLkxvY2tUZXN0cyk6CisgICAgbG9ja3R5cGUgPSBzdGF0aWNtZXRob2QodGhyZWFkaW5nLkxvY2spCisKK2NsYXNzIFJMb2NrVGVzdHMobG9ja190ZXN0cy5STG9ja1Rlc3RzKToKKyAgICBsb2NrdHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuUkxvY2spCisKK2NsYXNzIEV2ZW50VGVzdHMobG9ja190ZXN0cy5FdmVudFRlc3RzKToKKyAgICBldmVudHR5cGUgPSBzdGF0aWNtZXRob2QodGhyZWFkaW5nLkV2ZW50KQorCitjbGFzcyBDb25kaXRpb25Bc1JMb2NrVGVzdHMobG9ja190ZXN0cy5STG9ja1Rlc3RzKToKKyAgICAjIEFuIENvbmRpdGlvbiB1c2VzIGFuIFJMb2NrIGJ5IGRlZmF1bHQgYW5kIGV4cG9ydHMgaXRzIEFQSS4KKyAgICBsb2NrdHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuQ29uZGl0aW9uKQorCitjbGFzcyBDb25kaXRpb25UZXN0cyhsb2NrX3Rlc3RzLkNvbmRpdGlvblRlc3RzKToKKyAgICBjb25kdHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuQ29uZGl0aW9uKQorCitjbGFzcyBTZW1hcGhvcmVUZXN0cyhsb2NrX3Rlc3RzLlNlbWFwaG9yZVRlc3RzKToKKyAgICBzZW10eXBlID0gc3RhdGljbWV0aG9kKHRocmVhZGluZy5TZW1hcGhvcmUpCisKK2NsYXNzIEJvdW5kZWRTZW1hcGhvcmVUZXN0cyhsb2NrX3Rlc3RzLkJvdW5kZWRTZW1hcGhvcmVUZXN0cyk6CisgICAgc2VtdHlwZSA9IHN0YXRpY21ldGhvZCh0aHJlYWRpbmcuQm91bmRlZFNlbWFwaG9yZSkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJywgJ3Rlc3QgbWFjb3N4IHByb2JsZW0nKQorICAgIGRlZiB0ZXN0X3JlY3Vyc2lvbl9saW1pdChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA5NjcwCisgICAgICAgICMgdGVzdCB0aGF0IGV4Y2Vzc2l2ZSByZWN1cnNpb24gd2l0aGluIGEgbm9uLW1haW4gdGhyZWFkIGNhdXNlcworICAgICAgICAjIGFuIGV4Y2VwdGlvbiByYXRoZXIgdGhhbiBjcmFzaGluZyB0aGUgaW50ZXJwcmV0ZXIgb24gcGxhdGZvcm1zCisgICAgICAgICMgbGlrZSBNYWMgT1MgWCBvciBGcmVlQlNEIHdoaWNoIGhhdmUgc21hbGwgZGVmYXVsdCBzdGFjayBzaXplcworICAgICAgICAjIGZvciB0aHJlYWRzCisgICAgICAgIHNjcmlwdCA9ICIiImlmIFRydWU6CisgICAgICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCisKKyAgICAgICAgICAgIGRlZiByZWN1cnNlKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlY3Vyc2UoKQorCisgICAgICAgICAgICBkZWYgb3V0ZXIoKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2UoKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdyA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PW91dGVyKQorICAgICAgICAgICAgdy5zdGFydCgpCisgICAgICAgICAgICB3LmpvaW4oKQorICAgICAgICAgICAgcHJpbnQoJ2VuZCBvZiBtYWluIHRocmVhZCcpCisgICAgICAgICAgICAiIiIKKyAgICAgICAgZXhwZWN0ZWRfb3V0cHV0ID0gImVuZCBvZiBtYWluIHRocmVhZFxuIgorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItYyIsIHNjcmlwdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIHN0ZG91dCwgc3RkZXJyID0gcC5jb21tdW5pY2F0ZSgpCisgICAgICAgIGRhdGEgPSBzdGRvdXQuZGVjb2RlKCkucmVwbGFjZSgnXHInLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJldHVybmNvZGUsIDAsICJVbmV4cGVjdGVkIGVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBleHBlY3RlZF9vdXRwdXQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoTG9ja1Rlc3RzLCBSTG9ja1Rlc3RzLCBFdmVudFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25kaXRpb25Bc1JMb2NrVGVzdHMsIENvbmRpdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZW1hcGhvcmVUZXN0cywgQm91bmRlZFNlbWFwaG9yZVRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkSm9pbk9uU2h1dGRvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZGluZ0V4Y2VwdGlvblRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxM2EyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxM2EyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzlmMjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkaW5nX2xvY2FsLnB5CkBAIC0wLDAgKzEsMjM0IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gZG9jdGVzdCBpbXBvcnQgRG9jVGVzdFN1aXRlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHdlYWtyZWYKK2ltcG9ydCBnYworCisjIE1vZHVsZXMgdW5kZXIgdGVzdAorX3RocmVhZCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWQnKQordGhyZWFkaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ3RocmVhZGluZycpCitpbXBvcnQgX3RocmVhZGluZ19sb2NhbAorCisKK2NsYXNzIFdlYWsob2JqZWN0KToKKyAgICBwYXNzCisKK2RlZiB0YXJnZXQobG9jYWwsIHdlYWtsaXN0KToKKyAgICB3ZWFrID0gV2VhaygpCisgICAgbG9jYWwud2VhayA9IHdlYWsKKyAgICB3ZWFrbGlzdC5hcHBlbmQod2Vha3JlZi5yZWYod2VhaykpCisKK2NsYXNzIEJhc2VMb2NhbFRlc3Q6CisKKyAgICBkZWYgdGVzdF9sb2NhbF9yZWZzKHNlbGYpOgorICAgICAgICBzZWxmLl9sb2NhbF9yZWZzKDIwKQorICAgICAgICBzZWxmLl9sb2NhbF9yZWZzKDUwKQorICAgICAgICBzZWxmLl9sb2NhbF9yZWZzKDEwMCkKKworICAgIGRlZiBfbG9jYWxfcmVmcyhzZWxmLCBuKToKKyAgICAgICAgbG9jYWwgPSBzZWxmLl9sb2NhbCgpCisgICAgICAgIHdlYWtsaXN0ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9dGFyZ2V0LCBhcmdzPShsb2NhbCwgd2Vha2xpc3QpKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgICAgICB0LmpvaW4oKQorICAgICAgICBkZWwgdAorCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3ZWFrbGlzdCksIG4pCisKKyAgICAgICAgIyBYWFggX3RocmVhZGluZ19sb2NhbCBrZWVwcyB0aGUgbG9jYWwgb2YgdGhlIGxhc3Qgc3RvcHBlZCB0aHJlYWQgYWxpdmUuCisgICAgICAgIGRlYWRsaXN0ID0gW3dlYWsgZm9yIHdlYWsgaW4gd2Vha2xpc3QgaWYgd2VhaygpIGlzIE5vbmVdCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obGVuKGRlYWRsaXN0KSwgKG4tMSwgbikpCisKKyAgICAgICAgIyBBc3NpZ25tZW50IHRvIHRoZSBzYW1lIHRocmVhZCBsb2NhbCBmcmVlcyBpdCBzb21ldGltZXMgKCEpCisgICAgICAgIGxvY2FsLnNvbWVvdGhlcnZhciA9IE5vbmUKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGRlYWRsaXN0ID0gW3dlYWsgZm9yIHdlYWsgaW4gd2Vha2xpc3QgaWYgd2VhaygpIGlzIE5vbmVdCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obGVuKGRlYWRsaXN0KSwgKG4tMSwgbiksIChuLCBsZW4oZGVhZGxpc3QpKSkKKworICAgIGRlZiB0ZXN0X2Rlcml2ZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgMzA4ODogaWYgdGhlcmUgaXMgYSB0aHJlYWRzIHN3aXRjaCBpbnNpZGUgdGhlIF9faW5pdF9fCisgICAgICAgICMgb2YgYSB0aHJlYWRpbmcubG9jYWwgZGVyaXZlZCBjbGFzcywgdGhlIHBlci10aHJlYWQgZGljdGlvbmFyeQorICAgICAgICAjIGlzIGNyZWF0ZWQgYnV0IG5vdCBjb3JyZWN0bHkgc2V0IG9uIHRoZSBvYmplY3QuCisgICAgICAgICMgVGhlIGZpcnN0IG1lbWJlciBzZXQgbWF5IGJlIGJvZ3VzLgorICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICBjbGFzcyBMb2NhbChzZWxmLl9sb2NhbCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjAxKQorICAgICAgICBsb2NhbCA9IExvY2FsKCkKKworICAgICAgICBkZWYgZihpKToKKyAgICAgICAgICAgIGxvY2FsLnggPSBpCisgICAgICAgICAgICAjIFNpbXBseSBjaGVjayB0aGF0IHRoZSB2YXJpYWJsZSBpcyBjb3JyZWN0bHkgc2V0CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2FsLngsIGkpCisKKyAgICAgICAgdGhyZWFkcz0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWYsIGFyZ3M9KGksKSkKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgdGhyZWFkcy5hcHBlbmQodCkKKworICAgICAgICBmb3IgdCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgdC5qb2luKCkKKworICAgIGRlZiB0ZXN0X2Rlcml2ZWRfY3ljbGVfZGVhbGxvYyhzZWxmKToKKyAgICAgICAgIyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlNjk5MAorICAgICAgICBjbGFzcyBMb2NhbChzZWxmLl9sb2NhbCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGxvY2FscyA9IE5vbmUKKyAgICAgICAgcGFzc2VkID0gW0ZhbHNlXQorICAgICAgICBlMSA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIGUyID0gdGhyZWFkaW5nLkV2ZW50KCkKKworICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgIyAxKSBJbnZvbHZlIExvY2FsIGluIGEgY3ljbGUKKyAgICAgICAgICAgIGN5Y2xlID0gW0xvY2FsKCldCisgICAgICAgICAgICBjeWNsZS5hcHBlbmQoY3ljbGUpCisgICAgICAgICAgICBjeWNsZVswXS5mb28gPSAnYmFyJworCisgICAgICAgICAgICAjIDIpIEdDIHRoZSBjeWNsZSAodHJpZ2dlcnMgdGhyZWFkbW9kdWxlLmM6OmxvY2FsX2NsZWFyCisgICAgICAgICAgICAjIGJlZm9yZSBsb2NhbF9kZWFsbG9jKQorICAgICAgICAgICAgZGVsIGN5Y2xlCisgICAgICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgICAgIGUxLnNldCgpCisgICAgICAgICAgICBlMi53YWl0KCkKKworICAgICAgICAgICAgIyA0KSBOZXcgTG9jYWxzIHNob3VsZCBiZSBlbXB0eQorICAgICAgICAgICAgcGFzc2VkWzBdID0gYWxsKG5vdCBoYXNhdHRyKGxvY2FsLCAnZm9vJykgZm9yIGxvY2FsIGluIGxvY2FscykKKworICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9ZikKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIGUxLndhaXQoKQorCisgICAgICAgICMgMykgTmV3IExvY2FscyBzaG91bGQgcmVjeWNsZSB0aGUgb3JpZ2luYWwncyBhZGRyZXNzLiBDcmVhdGluZworICAgICAgICAjIHRoZW0gaW4gdGhlIHRocmVhZCBvdmVyd3JpdGVzIHRoZSB0aHJlYWQgc3RhdGUgYW5kIGF2b2lkcyB0aGUKKyAgICAgICAgIyBidWcKKyAgICAgICAgbG9jYWxzID0gW0xvY2FsKCkgZm9yIGkgaW4gcmFuZ2UoMTApXQorICAgICAgICBlMi5zZXQoKQorICAgICAgICB0LmpvaW4oKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXNzZWRbMF0pCisKKyAgICBkZWYgdGVzdF9hcmd1bWVudHMoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTUyMjIzNworICAgICAgICBmcm9tIHRocmVhZCBpbXBvcnQgX2xvY2FsIGFzIGxvY2FsCisgICAgICAgIGZyb20gX3RocmVhZGluZ19sb2NhbCBpbXBvcnQgbG9jYWwgYXMgcHlfbG9jYWwKKworICAgICAgICBmb3IgY2xzIGluIChsb2NhbCwgcHlfbG9jYWwpOgorICAgICAgICAgICAgY2xhc3MgTXlMb2NhbChjbHMpOgorICAgICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIE15TG9jYWwoYT0xKQorICAgICAgICAgICAgTXlMb2NhbCgxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbHMsIGE9MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY2xzLCAxKQorCisgICAgZGVmIF90ZXN0X29uZV9jbGFzcyhzZWxmLCBjKToKKyAgICAgICAgc2VsZi5fZmFpbGVkID0gIk5vIGVycm9yIG1lc3NhZ2Ugc2V0IG9yIGNsZWFyZWQuIgorICAgICAgICBvYmogPSBjKCkKKyAgICAgICAgZTEgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICBlMiA9IHRocmVhZGluZy5FdmVudCgpCisKKyAgICAgICAgZGVmIGYxKCk6CisgICAgICAgICAgICBvYmoueCA9ICdmb28nCisgICAgICAgICAgICBvYmoueSA9ICdiYXInCisgICAgICAgICAgICBkZWwgb2JqLnkKKyAgICAgICAgICAgIGUxLnNldCgpCisgICAgICAgICAgICBlMi53YWl0KCkKKworICAgICAgICBkZWYgZjIoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmb28gPSBvYmoueAorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBleHBlY3RlZCAtLSB3ZSBoYXZlbid0IHNldCBvYmoueCBpbiB0aGlzIHRocmVhZCB5ZXQhCisgICAgICAgICAgICAgICAgc2VsZi5fZmFpbGVkID0gIiIgICMgcGFzc2VkCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2ZhaWxlZCA9ICgnSW5jb3JyZWN0bHkgZ290IHZhbHVlICVyIGZyb20gY2xhc3MgJXJcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9vLCBjKSkKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKHNlbGYuX2ZhaWxlZCkKKworICAgICAgICB0MSA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWYxKQorICAgICAgICB0MS5zdGFydCgpCisgICAgICAgIGUxLndhaXQoKQorICAgICAgICB0MiA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWYyKQorICAgICAgICB0Mi5zdGFydCgpCisgICAgICAgIHQyLmpvaW4oKQorICAgICAgICAjIFRoZSB0ZXN0IGlzIGRvbmU7IGp1c3QgbGV0IHQxIGtub3cgaXQgY2FuIGV4aXQsIGFuZCB3YWl0IGZvciBpdC4KKyAgICAgICAgZTIuc2V0KCkKKyAgICAgICAgdDEuam9pbigpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLl9mYWlsZWQsIHNlbGYuX2ZhaWxlZCkKKworICAgIGRlZiB0ZXN0X3RocmVhZGluZ19sb2NhbChzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9vbmVfY2xhc3Moc2VsZi5fbG9jYWwpCisKKyAgICBkZWYgdGVzdF90aHJlYWRpbmdfbG9jYWxfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIExvY2FsU3ViY2xhc3Moc2VsZi5fbG9jYWwpOgorICAgICAgICAgICAgIiIiVG8gdGVzdCB0aGF0IHN1YmNsYXNzZXMgYmVoYXZlIHByb3Blcmx5LiIiIgorICAgICAgICBzZWxmLl90ZXN0X29uZV9jbGFzcyhMb2NhbFN1YmNsYXNzKQorCisgICAgZGVmIF90ZXN0X2RpY3RfYXR0cmlidXRlKHNlbGYsIGNscyk6CisgICAgICAgIG9iaiA9IGNscygpCisgICAgICAgIG9iai54ID0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iai5fX2RpY3RfXywgeyd4JzogNX0pCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IpOgorICAgICAgICAgICAgb2JqLl9fZGljdF9fID0ge30KKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgICAgICBkZWwgb2JqLl9fZGljdF9fCisKKyAgICBkZWYgdGVzdF9kaWN0X2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9kaWN0X2F0dHJpYnV0ZShzZWxmLl9sb2NhbCkKKworICAgIGRlZiB0ZXN0X2RpY3RfYXR0cmlidXRlX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBMb2NhbFN1YmNsYXNzKHNlbGYuX2xvY2FsKToKKyAgICAgICAgICAgICIiIlRvIHRlc3QgdGhhdCBzdWJjbGFzc2VzIGJlaGF2ZSBwcm9wZXJseS4iIiIKKyAgICAgICAgc2VsZi5fdGVzdF9kaWN0X2F0dHJpYnV0ZShMb2NhbFN1YmNsYXNzKQorCisKK2NsYXNzIFRocmVhZExvY2FsVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSwgQmFzZUxvY2FsVGVzdCk6CisgICAgX2xvY2FsID0gX3RocmVhZC5fbG9jYWwKKworICAgICMgRmFpbHMgZm9yIHRoZSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgorICAgIGRlZiB0ZXN0X2N5Y2xlX2NvbGxlY3Rpb24oc2VsZik6CisgICAgICAgIGNsYXNzIFg6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgeCA9IFgoKQorICAgICAgICB4LmxvY2FsID0gc2VsZi5fbG9jYWwoKQorICAgICAgICB4LmxvY2FsLnggPSB4CisgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoeCkKKyAgICAgICAgZGVsIHgKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMod3IoKSwgTm9uZSkKKworY2xhc3MgUHlUaHJlYWRpbmdMb2NhbFRlc3QodW5pdHRlc3QuVGVzdENhc2UsIEJhc2VMb2NhbFRlc3QpOgorICAgIF9sb2NhbCA9IF90aHJlYWRpbmdfbG9jYWwubG9jYWwKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QoRG9jVGVzdFN1aXRlKCdfdGhyZWFkaW5nX2xvY2FsJykpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGhyZWFkTG9jYWxUZXN0KSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShQeVRocmVhZGluZ0xvY2FsVGVzdCkpCisKKyAgICB0cnk6CisgICAgICAgIGZyb20gdGhyZWFkIGltcG9ydCBfbG9jYWwKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnQgX3RocmVhZGluZ19sb2NhbAorICAgICAgICBsb2NhbF9vcmlnID0gX3RocmVhZGluZ19sb2NhbC5sb2NhbAorICAgICAgICBkZWYgc2V0VXAodGVzdCk6CisgICAgICAgICAgICBfdGhyZWFkaW5nX2xvY2FsLmxvY2FsID0gX2xvY2FsCisgICAgICAgIGRlZiB0ZWFyRG93bih0ZXN0KToKKyAgICAgICAgICAgIF90aHJlYWRpbmdfbG9jYWwubG9jYWwgPSBsb2NhbF9vcmlnCisgICAgICAgIHN1aXRlLmFkZFRlc3QoRG9jVGVzdFN1aXRlKCdfdGhyZWFkaW5nX2xvY2FsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXA9c2V0VXAsIHRlYXJEb3duPXRlYXJEb3duKQorICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3Qoc3VpdGUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmQxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYmQxM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RocmVhZHNpZ25hbHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmN2ViNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5CkBAIC0wLDAgKzEsODUgQEAKKyIiIlB5VW5pdCB0ZXN0aW5nIHRoYXQgdGhyZWFkcyBob25vciBvdXIgc2lnbmFsIHNlbWFudGljcyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpbXBvcnRfbW9kdWxlLCByZWFwX3RocmVhZHMKK3RocmVhZCA9IGltcG9ydF9tb2R1bGUoJ3RocmVhZCcpCisKK2lmIHN5cy5wbGF0Zm9ybVs6M10gaW4gKCd3aW4nLCAnb3MyJykgb3Igc3lzLnBsYXRmb3JtPT0ncmlzY29zJzoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIkNhbid0IHRlc3Qgc2lnbmFsIG9uICVzIiAlIHN5cy5wbGF0Zm9ybQorCitwcm9jZXNzX3BpZCA9IG9zLmdldHBpZCgpCitzaWduYWxsZWRfYWxsPXRocmVhZC5hbGxvY2F0ZV9sb2NrKCkKKworCitkZWYgcmVnaXN0ZXJTaWduYWxzKGZvcl91c3IxLCBmb3JfdXNyMiwgZm9yX2Fscm0pOgorICAgIHVzcjEgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBmb3JfdXNyMSkKKyAgICB1c3IyID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVVNSMiwgZm9yX3VzcjIpCisgICAgYWxybSA9IHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIGZvcl9hbHJtKQorICAgIHJldHVybiB1c3IxLCB1c3IyLCBhbHJtCisKKworIyBUaGUgc2lnbmFsIGhhbmRsZXIuIEp1c3Qgbm90ZSB0aGF0IHRoZSBzaWduYWwgb2NjdXJyZWQgYW5kCisjIGZyb20gd2hvLgorZGVmIGhhbmRsZV9zaWduYWxzKHNpZyxmcmFtZSk6CisgICAgc2lnbmFsX2JsYWNrYm9hcmRbc2lnXVsndHJpcHBlZCddICs9IDEKKyAgICBzaWduYWxfYmxhY2tib2FyZFtzaWddWyd0cmlwcGVkX2J5J10gPSB0aHJlYWQuZ2V0X2lkZW50KCkKKworIyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBzcGF3bmVkIGFzIGEgc2VwYXJhdGUgdGhyZWFkLgorZGVmIHNlbmRfc2lnbmFscygpOgorICAgIG9zLmtpbGwocHJvY2Vzc19waWQsIHNpZ25hbC5TSUdVU1IxKQorICAgIG9zLmtpbGwocHJvY2Vzc19waWQsIHNpZ25hbC5TSUdVU1IyKQorICAgIHNpZ25hbGxlZF9hbGwucmVsZWFzZSgpCisKK2NsYXNzIFRocmVhZFNpZ25hbHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3Qgc2lnbmFsIGhhbmRsaW5nIHNlbWFudGljcyBvZiB0aHJlYWRzLgorICAgICAgIFdlIHNwYXduIGEgdGhyZWFkLCBoYXZlIHRoZSB0aHJlYWQgc2VuZCB0d28gc2lnbmFscywgYW5kCisgICAgICAgd2FpdCBmb3IgaXQgdG8gZmluaXNoLiBDaGVjayB0aGF0IHdlIGdvdCBib3RoIHNpZ25hbHMKKyAgICAgICBhbmQgdGhhdCB0aGV5IHdlcmUgcnVuIGJ5IHRoZSBtYWluIHRocmVhZC4KKyAgICAiIiIKKyAgICBAcmVhcF90aHJlYWRzCisgICAgZGVmIHRlc3Rfc2lnbmFscyhzZWxmKToKKyAgICAgICAgc2lnbmFsbGVkX2FsbC5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5zcGF3blNpZ25hbGxpbmdUaHJlYWQoKQorICAgICAgICBzaWduYWxsZWRfYWxsLmFjcXVpcmUoKQorICAgICAgICAjIHRoZSBzaWduYWxzIHRoYXQgd2UgYXNrZWQgdGhlIGtlcm5lbCB0byBzZW5kCisgICAgICAgICMgd2lsbCBjb21lIGJhY2ssIGJ1dCB3ZSBkb24ndCBrbm93IHdoZW4uCisgICAgICAgICMgKGl0IG1pZ2h0IGV2ZW4gYmUgYWZ0ZXIgdGhlIHRocmVhZCBleGl0cworICAgICAgICAjIGFuZCBtaWdodCBiZSBvdXQgb2Ygb3JkZXIuKSAgSWYgd2UgaGF2ZW4ndCBzZWVuCisgICAgICAgICMgdGhlIHNpZ25hbHMgeWV0LCBzZW5kIHlldCBhbm90aGVyIHNpZ25hbCBhbmQKKyAgICAgICAgIyB3YWl0IGZvciBpdCByZXR1cm4uCisgICAgICAgIGlmIHNpZ25hbF9ibGFja2JvYXJkW3NpZ25hbC5TSUdVU1IxXVsndHJpcHBlZCddID09IDAgXAorICAgICAgICAgICBvciBzaWduYWxfYmxhY2tib2FyZFtzaWduYWwuU0lHVVNSMl1bJ3RyaXBwZWQnXSA9PSAwOgorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDEpCisgICAgICAgICAgICBzaWduYWwucGF1c2UoKQorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCggc2lnbmFsX2JsYWNrYm9hcmRbc2lnbmFsLlNJR1VTUjFdWyd0cmlwcGVkJ10sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIHNpZ25hbF9ibGFja2JvYXJkW3NpZ25hbC5TSUdVU1IxXVsndHJpcHBlZF9ieSddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldF9pZGVudCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCBzaWduYWxfYmxhY2tib2FyZFtzaWduYWwuU0lHVVNSMl1bJ3RyaXBwZWQnXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCggc2lnbmFsX2JsYWNrYm9hcmRbc2lnbmFsLlNJR1VTUjJdWyd0cmlwcGVkX2J5J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuZ2V0X2lkZW50KCkpCisgICAgICAgIHNpZ25hbGxlZF9hbGwucmVsZWFzZSgpCisKKyAgICBkZWYgc3Bhd25TaWduYWxsaW5nVGhyZWFkKHNlbGYpOgorICAgICAgICB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZChzZW5kX3NpZ25hbHMsICgpKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBnbG9iYWwgc2lnbmFsX2JsYWNrYm9hcmQKKworICAgIHNpZ25hbF9ibGFja2JvYXJkID0geyBzaWduYWwuU0lHVVNSMSA6IHsndHJpcHBlZCc6IDAsICd0cmlwcGVkX2J5JzogMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwuU0lHVVNSMiA6IHsndHJpcHBlZCc6IDAsICd0cmlwcGVkX2J5JzogMCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwuU0lHQUxSTSA6IHsndHJpcHBlZCc6IDAsICd0cmlwcGVkX2J5JzogMCB9IH0KKworICAgIG9sZHNpZ3MgPSByZWdpc3RlclNpZ25hbHMoaGFuZGxlX3NpZ25hbHMsIGhhbmRsZV9zaWduYWxzLCBoYW5kbGVfc2lnbmFscykKKyAgICB0cnk6CisgICAgICAgIHJ1bl91bml0dGVzdChUaHJlYWRTaWduYWxzKQorICAgIGZpbmFsbHk6CisgICAgICAgIHJlZ2lzdGVyU2lnbmFscygqb2xkc2lncykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkc2lnbmFscy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRjYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkc2lnbmFscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkc2lnbmFscy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aHJlYWRzaWduYWxzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTRjYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGhyZWFkc2lnbmFscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3MWMxMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWUucHkKQEAgLTAsMCArMSwyNTUgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCisKKworY2xhc3MgVGltZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50ID0gdGltZS50aW1lKCkKKworICAgIGRlZiB0ZXN0X2RhdGFfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgdGltZS5hbHR6b25lCisgICAgICAgIHRpbWUuZGF5bGlnaHQKKyAgICAgICAgdGltZS50aW1lem9uZQorICAgICAgICB0aW1lLnR6bmFtZQorCisgICAgZGVmIHRlc3RfY2xvY2soc2VsZik6CisgICAgICAgIHRpbWUuY2xvY2soKQorCisgICAgZGVmIHRlc3RfY29udmVyc2lvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLmN0aW1lKHNlbGYudCkKKyAgICAgICAgICAgICAgICAgICAgID09IHRpbWUuYXNjdGltZSh0aW1lLmxvY2FsdGltZShzZWxmLnQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvbmcodGltZS5ta3RpbWUodGltZS5sb2NhbHRpbWUoc2VsZi50KSkpCisgICAgICAgICAgICAgICAgICAgICA9PSBsb25nKHNlbGYudCkpCisKKyAgICBkZWYgdGVzdF9zbGVlcChzZWxmKToKKyAgICAgICAgdGltZS5zbGVlcCgxLjIpCisKKyAgICBkZWYgdGVzdF9zdHJmdGltZShzZWxmKToKKyAgICAgICAgdHQgPSB0aW1lLmdtdGltZShzZWxmLnQpCisgICAgICAgIGZvciBkaXJlY3RpdmUgaW4gKCdhJywgJ0EnLCAnYicsICdCJywgJ2MnLCAnZCcsICdIJywgJ0knLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnaicsICdtJywgJ00nLCAncCcsICdTJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1UnLCAndycsICdXJywgJ3gnLCAnWCcsICd5JywgJ1knLCAnWicsICclJyk6CisgICAgICAgICAgICBmb3JtYXQgPSAnICUnICsgZGlyZWN0aXZlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGltZS5zdHJmdGltZShmb3JtYXQsIHR0KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdjb252ZXJzaW9uIHNwZWNpZmllcjogJXIgZmFpbGVkLicgJSBmb3JtYXQpCisKKyAgICAgICAgIyBJc3N1ZSAjMTA3NjI6IEd1YXJkIGFnYWluc3QgaW52YWxpZC9ub24tc3VwcG9ydGVkIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgIyBzbyB0aGF0IFB5dGhvbiBkb24ndCBjcmFzaCAoV2luZG93cyBjcmFzaGVzIHdoZW4gdGhlIGZvcm1hdCBzdHJpbmcKKyAgICAgICAgIyBpbnB1dCB0byBbd11zdHJmdGltZSBpcyBub3Qga29zaGVyLgorICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHRpbWUuc3RyZnRpbWUoJyVmJykKKworICAgIGRlZiB0ZXN0X3N0cmZ0aW1lX2JvdW5kc19jaGVja2luZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBzdHJmdGltZSgpIGNoZWNrcyB0aGUgYm91bmRzIG9mIHRoZSB2YXJpb3VzIHBhcnRzCisgICAgICAgICNvZiB0aGUgdGltZSB0dXBsZSAoMCBpcyB2YWxpZCBmb3IgKmFsbCogdmFsdWVzKS4KKworICAgICAgICAjIENoZWNrIHllYXIgWzE5MDAsIG1heChpbnQpXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTg5OSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQorICAgICAgICBpZiB0aW1lLmFjY2VwdDJkeWVhcjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICMgQ2hlY2sgbW9udGggWzEsIDEyXSArIHplcm8gc3VwcG9ydAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgLTEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEzLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICMgQ2hlY2sgZGF5IG9mIG1vbnRoIFsxLCAzMV0gKyB6ZXJvIHN1cHBvcnQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIC0xLCAwLCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAzMiwgMCwgMCwgMCwgMCwgMSwgLTEpKQorICAgICAgICAjIENoZWNrIGhvdXIgWzAsIDIzXQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgLTEsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDI0LCAwLCAwLCAwLCAxLCAtMSkpCisgICAgICAgICMgQ2hlY2sgbWludXRlIFswLCA1OV0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIC0xLCAwLCAwLCAxLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCA2MCwgMCwgMCwgMSwgLTEpKQorICAgICAgICAjIENoZWNrIHNlY29uZCBbMCwgNjFdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAtMSwgMCwgMSwgLTEpKQorICAgICAgICAjIEM5OSBvbmx5IHJlcXVpcmVzIGFsbG93aW5nIGZvciBvbmUgbGVhcCBzZWNvbmQsIGJ1dCBQeXRob24ncyBkb2NzIHNheQorICAgICAgICAjIGFsbG93IHR3byBsZWFwIHNlY29uZHMgKDAuLjYxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgNjIsIDAsIDEsIC0xKSkKKyAgICAgICAgIyBObyBjaGVjayBmb3IgdXBwZXItYm91bmQgZGF5IG9mIHdlZWs7CisgICAgICAgICMgIHZhbHVlIGZvcmNlZCBpbnRvIHJhbmdlIGJ5IGEgYGAlIDdgYCBjYWxjdWxhdGlvbi4KKyAgICAgICAgIyBTdGFydCBjaGVjayBhdCAtMiBzaW5jZSBnZXR0bWFyZygpIGluY3JlbWVudHMgdmFsdWUgYmVmb3JlIHRha2luZworICAgICAgICAjICBtb2R1bG8uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAtMiwgMSwgLTEpKQorICAgICAgICAjIENoZWNrIGRheSBvZiB0aGUgeWVhciBbMSwgMzY2XSArIHplcm8gc3VwcG9ydAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgLTEsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDM2NywgLTEpKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF92YWx1ZXNfZm9yX3plcm8oc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgdXNpbmcgYWxsIHplcm9zIHVzZXMgdGhlIHByb3BlciBkZWZhdWx0IHZhbHVlcy4KKyAgICAgICAgIyBObyB0ZXN0IGZvciBkYXlsaWdodCBzYXZpbmdzIHNpbmNlIHN0cmZ0aW1lKCkgZG9lcyBub3QgY2hhbmdlIG91dHB1dAorICAgICAgICAjIGJhc2VkIG9uIGl0cyB2YWx1ZS4KKyAgICAgICAgZXhwZWN0ZWQgPSAiMjAwMCAwMSAwMSAwMCAwMCAwMCAxIDAwMSIKKyAgICAgICAgcmVzdWx0ID0gdGltZS5zdHJmdGltZSgiJVkgJW0gJWQgJUggJU0gJVMgJXcgJWoiLCAoMCwpKjkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X3N0cnB0aW1lKHNlbGYpOgorICAgICAgICAjIFNob3VsZCBiZSBhYmxlIHRvIGdvIHJvdW5kLXRyaXAgZnJvbSBzdHJmdGltZSB0byBzdHJwdGltZSB3aXRob3V0CisgICAgICAgICMgcmFpc2luZyBhbiBleGNlcHRpb24uCisgICAgICAgIHR0ID0gdGltZS5nbXRpbWUoc2VsZi50KQorICAgICAgICBmb3IgZGlyZWN0aXZlIGluICgnYScsICdBJywgJ2InLCAnQicsICdjJywgJ2QnLCAnSCcsICdJJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2onLCAnbScsICdNJywgJ3AnLCAnUycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdVJywgJ3cnLCAnVycsICd4JywgJ1gnLCAneScsICdZJywgJ1onLCAnJScpOgorICAgICAgICAgICAgZm9ybWF0ID0gJyUnICsgZGlyZWN0aXZlCisgICAgICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoZm9ybWF0LCB0dCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0aW1lLnN0cnB0aW1lKHN0cmZfb3V0cHV0LCBmb3JtYXQpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImNvbnZlcnNpb24gc3BlY2lmaWVyICVyIGZhaWxlZCB3aXRoICclcycgaW5wdXQuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3JtYXQsIHN0cmZfb3V0cHV0KSkKKworICAgIGRlZiB0ZXN0X2FzY3RpbWUoc2VsZik6CisgICAgICAgIHRpbWUuYXNjdGltZSh0aW1lLmdtdGltZShzZWxmLnQpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRpbWUuYXNjdGltZSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0aW1lLmFzY3RpbWUsICgpKQorICAgICAgICAjIFhYWDogUG9zaXggY29tcGlhbnQgYXNjdGltZSBzaG91bGQgcmVmdXNlIHRvIGNvbnZlcnQKKyAgICAgICAgIyB5ZWFyID4gOTk5OSwgYnV0IExpbnV4IGltcGxlbWVudGF0aW9uIGRvZXMgbm90LgorICAgICAgICAjIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuYXNjdGltZSwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICgxMjM0NSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCisgICAgICAgICMgWFhYOiBGb3Igbm93LCBqdXN0IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIGEgY3Jhc2g6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRpbWUuYXNjdGltZSgoMTIzNDUsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDApKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIEB1bml0dGVzdC5za2lwSWYobm90IGhhc2F0dHIodGltZSwgInR6c2V0IiksCisgICAgICAgICJ0aW1lIG1vZHVsZSBoYXMgbm8gYXR0cmlidXRlIHR6c2V0IikKKyAgICBkZWYgdGVzdF90enNldChzZWxmKToKKworICAgICAgICBmcm9tIG9zIGltcG9ydCBlbnZpcm9uCisKKyAgICAgICAgIyBFcG9jaCB0aW1lIG9mIG1pZG5pZ2h0IERlYyAyNXRoIDIwMDIuIE5ldmVyIERTVCBpbiBub3J0aGVybgorICAgICAgICAjIGhlbWlzcGhlcmUuCisgICAgICAgIHhtYXMyMDAyID0gMTA0MDc3NDQwMC4wCisKKyAgICAgICAgIyBUaGVzZSBmb3JtYXRzIGFyZSBjb3JyZWN0IGZvciAyMDAyLCBhbmQgcG9zc2libHkgZnV0dXJlIHllYXJzCisgICAgICAgICMgVGhpcyBmb3JtYXQgaXMgdGhlICdzdGFuZGFyZCcgYXMgZG9jdW1lbnRlZCBhdDoKKyAgICAgICAgIyBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvYmFzZWRlZnMveGJkX2NoYXAwOC5odG1sCisgICAgICAgICMgVGhleSBhcmUgYWxzbyBkb2N1bWVudGVkIGluIHRoZSB0enNldCgzKSBtYW4gcGFnZSBvbiBtb3N0IFVuaXgKKyAgICAgICAgIyBzeXN0ZW1zLgorICAgICAgICBlYXN0ZXJuID0gJ0VTVCswNUVEVCxNNC4xLjAsTTEwLjUuMCcKKyAgICAgICAgdmljdG9yaWEgPSAnQUVTVC0xMEFFRFQtMTEsTTEwLjUuMCxNMy41LjAnCisgICAgICAgIHV0Yz0nVVRDKzAnCisKKyAgICAgICAgb3JnX1RaID0gZW52aXJvbi5nZXQoJ1RaJyxOb25lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBjYW4gc3dpdGNoIHRvIFVUQyB0aW1lIGFuZCByZXN1bHRzIGFyZSBjb3JyZWN0CisgICAgICAgICAgICAjIE5vdGUgdGhhdCB1bmtub3duIHRpbWV6b25lcyBkZWZhdWx0IHRvIFVUQy4KKyAgICAgICAgICAgICMgTm90ZSB0aGF0IGFsdHpvbmUgaXMgdW5kZWZpbmVkIGluIFVUQywgYXMgdGhlcmUgaXMgbm8gRFNUCisgICAgICAgICAgICBlbnZpcm9uWydUWiddID0gZWFzdGVybgorICAgICAgICAgICAgdGltZS50enNldCgpCisgICAgICAgICAgICBlbnZpcm9uWydUWiddID0gdXRjCisgICAgICAgICAgICB0aW1lLnR6c2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgdGltZS5nbXRpbWUoeG1hczIwMDIpLCB0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuZGF5bGlnaHQsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUudGltZXpvbmUsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKS50bV9pc2RzdCwgMCkKKworICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgY2FuIHN3aXRjaCB0byBVUy9FYXN0ZXJuCisgICAgICAgICAgICBlbnZpcm9uWydUWiddID0gZWFzdGVybgorICAgICAgICAgICAgdGltZS50enNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHRpbWUuZ210aW1lKHhtYXMyMDAyKSwgdGltZS5sb2NhbHRpbWUoeG1hczIwMDIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnR6bmFtZSwgKCdFU1QnLCAnRURUJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0aW1lLnR6bmFtZSksIDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuZGF5bGlnaHQsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUudGltZXpvbmUsIDE4MDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmFsdHpvbmUsIDE0NDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikudG1faXNkc3QsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0aW1lLnR6bmFtZSksIDIpCisKKyAgICAgICAgICAgICMgTm93IGdvIHRvIHRoZSBzb3V0aGVybiBoZW1pc3BoZXJlLgorICAgICAgICAgICAgZW52aXJvblsnVFonXSA9IHZpY3RvcmlhCisgICAgICAgICAgICB0aW1lLnR6c2V0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGltZS5nbXRpbWUoeG1hczIwMDIpLCB0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikpCisKKyAgICAgICAgICAgICMgSXNzdWUgIzExODg2OiBBdXN0cmFsaWFuIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSAoVVRDKzEwKSBpcyBjYWxsZWQKKyAgICAgICAgICAgICMgIkVTVCIgKGFzIEVhc3Rlcm4gU3RhbmRhcmQgVGltZSwgVVRDLTUpIGluc3RlYWQgb2YgIkFFU1QiIG9uIHNvbWUKKyAgICAgICAgICAgICMgb3BlcmF0aW5nIHN5c3RlbXMgKGUuZy4gRnJlZUJTRCksIHdoaWNoIGlzIHdyb25nLiBTZWUgZm9yIGV4YW1wbGUKKyAgICAgICAgICAgICMgdGhpcyBidWc6IGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz05MzgxMAorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbih0aW1lLnR6bmFtZVswXSwgKCdBRVNUJyAnRVNUJyksIHRpbWUudHpuYW1lWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUudHpuYW1lWzFdID09ICdBRURUJywgc3RyKHRpbWUudHpuYW1lWzFdKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5kYXlsaWdodCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS50aW1lem9uZSwgLTM2MDAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmFsdHpvbmUsIC0zOTYwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5sb2NhbHRpbWUoeG1hczIwMDIpLnRtX2lzZHN0LCAxKQorCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIFJlcGFpciBUWiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiBjYXNlIGFueSBvdGhlciB0ZXN0cworICAgICAgICAgICAgIyByZWx5IG9uIGl0LgorICAgICAgICAgICAgaWYgb3JnX1RaIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGVudmlyb25bJ1RaJ10gPSBvcmdfVFoKKyAgICAgICAgICAgIGVsaWYgZW52aXJvbi5oYXNfa2V5KCdUWicpOgorICAgICAgICAgICAgICAgIGRlbCBlbnZpcm9uWydUWiddCisgICAgICAgICAgICB0aW1lLnR6c2V0KCkKKworICAgIGRlZiB0ZXN0X2luc2FuZV90aW1lc3RhbXBzKHNlbGYpOgorICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCBzb21lIHBsYXRmb3JtIG1hcHMgdGltZV90IHRvIGRvdWJsZSwKKyAgICAgICAgIyBhbmQgdGhhdCB0aGlzIHRlc3Qgd2lsbCBmYWlsIHRoZXJlLiAgVGhpcyB0ZXN0IHNob3VsZAorICAgICAgICAjIGV4ZW1wdCBzdWNoIHBsYXRmb3JtcyAocHJvdmlkZWQgdGhleSByZXR1cm4gcmVhc29uYWJsZQorICAgICAgICAjIHJlc3VsdHMhKS4KKyAgICAgICAgZm9yIGZ1bmMgaW4gdGltZS5jdGltZSwgdGltZS5nbXRpbWUsIHRpbWUubG9jYWx0aW1lOgorICAgICAgICAgICAgZm9yIHVucmVhc29uYWJsZSBpbiAtMWUyMDAsIDFlMjAwOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZ1bmMsIHVucmVhc29uYWJsZSkKKworICAgIGRlZiB0ZXN0X2N0aW1lX3dpdGhvdXRfYXJnKHNlbGYpOgorICAgICAgICAjIE5vdCBzdXJlIGhvdyB0byBjaGVjayB0aGUgdmFsdWVzLCBzaW5jZSB0aGUgY2xvY2sgY291bGQgdGljaworICAgICAgICAjIGF0IGFueSB0aW1lLiAgTWFrZSBzdXJlIHRoZXNlIGFyZSBhdCBsZWFzdCBhY2NlcHRlZCBhbmQKKyAgICAgICAgIyBkb24ndCByYWlzZSBlcnJvcnMuCisgICAgICAgIHRpbWUuY3RpbWUoKQorICAgICAgICB0aW1lLmN0aW1lKE5vbmUpCisKKyAgICBkZWYgdGVzdF9nbXRpbWVfd2l0aG91dF9hcmcoc2VsZik6CisgICAgICAgIGd0MCA9IHRpbWUuZ210aW1lKCkKKyAgICAgICAgZ3QxID0gdGltZS5nbXRpbWUoTm9uZSkKKyAgICAgICAgdDAgPSB0aW1lLm1rdGltZShndDApCisgICAgICAgIHQxID0gdGltZS5ta3RpbWUoZ3QxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSAodDEtdDApIDwgMC4yKQorCisgICAgZGVmIHRlc3RfbG9jYWx0aW1lX3dpdGhvdXRfYXJnKHNlbGYpOgorICAgICAgICBsdDAgPSB0aW1lLmxvY2FsdGltZSgpCisgICAgICAgIGx0MSA9IHRpbWUubG9jYWx0aW1lKE5vbmUpCisgICAgICAgIHQwID0gdGltZS5ta3RpbWUobHQwKQorICAgICAgICB0MSA9IHRpbWUubWt0aW1lKGx0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gKHQxLXQwKSA8IDAuMikKKworICAgIGRlZiB0ZXN0X21rdGltZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTcyNjY4NworICAgICAgICBmb3IgdCBpbiAoLTIsIC0xLCAwLCAxKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0dCA9IHRpbWUubG9jYWx0aW1lKHQpCisgICAgICAgICAgICBleGNlcHQgKE92ZXJmbG93RXJyb3IsIFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLm1rdGltZSh0dCksIHQpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGltZVRlc3RDYXNlKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1MTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1MTk0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RpbWVvdXQucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYzEyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5CkBAIC0wLDAgKzEsMjAyIEBACisiIiJVbml0IHRlc3RzIGZvciBzb2NrZXQgdGltZW91dCBmZWF0dXJlLiIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgVGhpcyByZXF1aXJlcyB0aGUgJ25ldHdvcmsnIHJlc291cmNlIGFzIGdpdmVuIG9uIHRoZSByZWdydGVzdCBjb21tYW5kIGxpbmUuCitza2lwX2V4cGVjdGVkID0gbm90IHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCduZXR3b3JrJykKKworaW1wb3J0IHRpbWUKK2ltcG9ydCBzb2NrZXQKKworCitjbGFzcyBDcmVhdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIHNvY2tldC5nZXR0aW1lb3V0KCkgYW5kIHNvY2tldC5zZXR0aW1lb3V0KCkiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLnNvY2suY2xvc2UoKQorCisgICAgZGVmIHRlc3RPYmplY3RDcmVhdGlvbihzZWxmKToKKyAgICAgICAgIyBUZXN0IFNvY2tldCBjcmVhdGlvbgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgbm90IGRpc2FibGVkIGJ5IGRlZmF1bHQiKQorCisgICAgZGVmIHRlc3RGbG9hdFJldHVyblZhbHVlKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmV0dXJuIHZhbHVlIG9mIGdldHRpbWVvdXQoKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCg3LjM0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNvY2suZ2V0dGltZW91dCgpLCA3LjM0NSkKKworICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIDMpCisKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNvY2suZ2V0dGltZW91dCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RSZXR1cm5UeXBlKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmV0dXJuIHR5cGUgb2YgZ2V0dGltZW91dCgpCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShzZWxmLnNvY2suZ2V0dGltZW91dCgpKSwgdHlwZSgxLjApKQorCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDMuOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHNlbGYuc29jay5nZXR0aW1lb3V0KCkpLCB0eXBlKDEuMCkpCisKKyAgICBkZWYgdGVzdFR5cGVDaGVjayhzZWxmKToKKyAgICAgICAgIyBUZXN0IHR5cGUgY2hlY2tpbmcgYnkgc2V0dGltZW91dCgpCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDApCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDBMKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgwLjApCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsICIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc29jay5zZXR0aW1lb3V0LCB1IiIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsICgpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuc29jay5zZXR0aW1lb3V0LCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnNvY2suc2V0dGltZW91dCwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsIDBqKQorCisgICAgZGVmIHRlc3RSYW5nZUNoZWNrKHNlbGYpOgorICAgICAgICAjIFRlc3QgcmFuZ2UgY2hlY2tpbmcgYnkgc2V0dGltZW91dCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuc29jay5zZXR0aW1lb3V0LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsIC0xTCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5zb2NrLnNldHRpbWVvdXQsIC0xLjApCisKKyAgICBkZWYgdGVzdFRpbWVvdXRUaGVuQmxvY2tpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCBzZXR0aW1lb3V0KCkgZm9sbG93ZWQgYnkgc2V0YmxvY2tpbmcoKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgxMCkKKyAgICAgICAgc2VsZi5zb2NrLnNldGJsb2NraW5nKDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zb2NrLmdldHRpbWVvdXQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5zb2NrLnNldGJsb2NraW5nKDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zb2NrLmdldHRpbWVvdXQoKSwgMC4wKQorCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KDEwKQorICAgICAgICBzZWxmLnNvY2suc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNvY2suZ2V0dGltZW91dCgpLCAwLjApCisgICAgICAgIHNlbGYuc29jay5zZXRibG9ja2luZygxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdEJsb2NraW5nVGhlblRpbWVvdXQoc2VsZik6CisgICAgICAgICMgVGVzdCBzZXRibG9ja2luZygpIGZvbGxvd2VkIGJ5IHNldHRpbWVvdXQoKQorICAgICAgICBzZWxmLnNvY2suc2V0YmxvY2tpbmcoMCkKKyAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNvY2suZ2V0dGltZW91dCgpLCAxKQorCisgICAgICAgIHNlbGYuc29jay5zZXRibG9ja2luZygxKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dCgxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc29jay5nZXR0aW1lb3V0KCksIDEpCisKKworY2xhc3MgVGltZW91dFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IGNhc2UgZm9yIHNvY2tldC5zb2NrZXQoKSB0aW1lb3V0IGZ1bmN0aW9ucyIiIgorCisgICAgIyBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdGVzdHMgaGVyZSB0cnlpbmcgdG8gbWFrZSBzdXJlIHRoYXQgYW4gb3BlcmF0aW9uCisgICAgIyBkb2Vzbid0IHRha2UgdG9vIG11Y2ggbG9uZ2VyIHRoYW4gZXhwZWN0ZWQuICBCdXQgY29tcGV0aW5nIG1hY2hpbmUKKyAgICAjIGFjdGl2aXR5IG1ha2VzIGl0IGluZXZpdGFibGUgdGhhdCBzdWNoIHRlc3RzIHdpbGwgZmFpbCBhdCB0aW1lcy4KKyAgICAjIFdoZW4gZnV6eiB3YXMgYXQgMS4wLCBJICh0aW0pIHJvdXRpbmVseSBzYXcgYm9ndXMgZmFpbHVyZXMgb24gV2luMksKKyAgICAjIGFuZCBXaW45OFNFLiAgQm9vc3RpbmcgaXQgdG8gMi4wIGhlbHBlZCBhIGxvdCwgYnV0IGlzbid0IGEgcmVhbAorICAgICMgc29sdXRpb24uCisgICAgZnV6eiA9IDIuMAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYWRkcl9yZW1vdGUgPSAoJ3d3dy5weXRob24ub3JnLicsIDgwKQorICAgICAgICBzZWxmLmxvY2FsaG9zdCA9ICcxMjcuMC4wLjEnCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc29jay5jbG9zZSgpCisKKyAgICBkZWYgdGVzdENvbm5lY3RUaW1lb3V0KHNlbGYpOgorICAgICAgICAjIENob29zZSBhIHByaXZhdGUgYWRkcmVzcyB0aGF0IGlzIHVubGlrZWx5IHRvIGV4aXN0IHRvIHByZXZlbnQKKyAgICAgICAgIyBmYWlsdXJlcyBkdWUgdG8gdGhlIGNvbm5lY3Qgc3VjY2VlZGluZyBiZWZvcmUgdGhlIHRpbWVvdXQuCisgICAgICAgICMgVXNlIGEgZG90dGVkIElQIGFkZHJlc3MgdG8gYXZvaWQgaW5jbHVkaW5nIHRoZSBETlMgbG9va3VwIHRpbWUKKyAgICAgICAgIyB3aXRoIHRoZSBjb25uZWN0IHRpbWUuICBUaGlzIGF2b2lkcyBmYWlsaW5nIHRoZSBhc3NlcnRpb24gdGhhdAorICAgICAgICAjIHRoZSB0aW1lb3V0IG9jY3VycmVkIGZhc3QgZW5vdWdoLgorICAgICAgICBhZGRyID0gKCcxMC4wLjAuMCcsIDEyMzQ1KQorCisgICAgICAgICMgVGVzdCBjb25uZWN0KCkgdGltZW91dAorICAgICAgICBfdGltZW91dCA9IDAuMDAxCisgICAgICAgIHNlbGYuc29jay5zZXR0aW1lb3V0KF90aW1lb3V0KQorCisgICAgICAgIF90MSA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLmNvbm5lY3QsIGFkZHIpCisgICAgICAgIF90MiA9IHRpbWUudGltZSgpCisKKyAgICAgICAgX2RlbHRhID0gYWJzKF90MSAtIF90MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgKCVnKSBpcyBtb3JlIHRoYW4gJWcgc2Vjb25kcyBtb3JlIHRoYW4gZXhwZWN0ZWQgKCVnKSIKKyAgICAgICAgICAgICAgICAgICAgICUoX2RlbHRhLCBzZWxmLmZ1enosIF90aW1lb3V0KSkKKworICAgIGRlZiB0ZXN0UmVjdlRpbWVvdXQoc2VsZik6CisgICAgICAgICMgVGVzdCByZWN2KCkgdGltZW91dAorICAgICAgICBfdGltZW91dCA9IDAuMDIKKworICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoc2VsZi5hZGRyX3JlbW90ZVswXSk6CisgICAgICAgICAgICBzZWxmLnNvY2suY29ubmVjdChzZWxmLmFkZHJfcmVtb3RlKQorICAgICAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoX3RpbWVvdXQpCisKKyAgICAgICAgICAgIF90MSA9IHRpbWUudGltZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQudGltZW91dCwgc2VsZi5zb2NrLnJlY3YsIDEwMjQpCisgICAgICAgICAgICBfdDIgPSB0aW1lLnRpbWUoKQorCisgICAgICAgICAgICBfZGVsdGEgPSBhYnMoX3QxIC0gX3QyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0ICglZykgaXMgJWcgc2Vjb25kcyBtb3JlIHRoYW4gZXhwZWN0ZWQgKCVnKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlKF9kZWx0YSwgc2VsZi5mdXp6LCBfdGltZW91dCkpCisKKyAgICBkZWYgdGVzdEFjY2VwdFRpbWVvdXQoc2VsZik6CisgICAgICAgICMgVGVzdCBhY2NlcHQoKSB0aW1lb3V0CisgICAgICAgIF90aW1lb3V0ID0gMgorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dChfdGltZW91dCkKKyAgICAgICAgIyBQcmV2ZW50ICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiBzb2NrZXQgZXhjZXB0aW9ucworICAgICAgICB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaywgc2VsZi5sb2NhbGhvc3QpCisgICAgICAgIHNlbGYuc29jay5saXN0ZW4oNSkKKworICAgICAgICBfdDEgPSB0aW1lLnRpbWUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5hY2NlcHQpCisgICAgICAgIF90MiA9IHRpbWUudGltZSgpCisKKyAgICAgICAgX2RlbHRhID0gYWJzKF90MSAtIF90MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgKCVnKSBpcyAlZyBzZWNvbmRzIG1vcmUgdGhhbiBleHBlY3RlZCAoJWcpIgorICAgICAgICAgICAgICAgICAgICAgJShfZGVsdGEsIHNlbGYuZnV6eiwgX3RpbWVvdXQpKQorCisgICAgZGVmIHRlc3RSZWN2ZnJvbVRpbWVvdXQoc2VsZik6CisgICAgICAgICMgVGVzdCByZWN2ZnJvbSgpIHRpbWVvdXQKKyAgICAgICAgX3RpbWVvdXQgPSAyCisgICAgICAgIHNlbGYuc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX0RHUkFNKQorICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dChfdGltZW91dCkKKyAgICAgICAgIyBQcmV2ZW50ICJBZGRyZXNzIGFscmVhZHkgaW4gdXNlIiBzb2NrZXQgZXhjZXB0aW9ucworICAgICAgICB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHNlbGYuc29jaywgc2VsZi5sb2NhbGhvc3QpCisKKyAgICAgICAgX3QxID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2sucmVjdmZyb20sIDgxOTIpCisgICAgICAgIF90MiA9IHRpbWUudGltZSgpCisKKyAgICAgICAgX2RlbHRhID0gYWJzKF90MSAtIF90MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQgKCVnKSBpcyAlZyBzZWNvbmRzIG1vcmUgdGhhbiBleHBlY3RlZCAoJWcpIgorICAgICAgICAgICAgICAgICAgICAgJShfZGVsdGEsIHNlbGYuZnV6eiwgX3RpbWVvdXQpKQorCisgICAgZGVmIHRlc3RTZW5kKHNlbGYpOgorICAgICAgICAjIFRlc3Qgc2VuZCgpIHRpbWVvdXQKKyAgICAgICAgIyBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byB0ZXN0IGl0CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0U2VuZHRvKHNlbGYpOgorICAgICAgICAjIFRlc3Qgc2VuZHRvKCkgdGltZW91dAorICAgICAgICAjIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IHRvIHRlc3QgaXQKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RTZW5kYWxsKHNlbGYpOgorICAgICAgICAjIFRlc3Qgc2VuZGFsbCgpIHRpbWVvdXQKKyAgICAgICAgIyBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byB0ZXN0IGl0CisgICAgICAgIHBhc3MKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCduZXR3b3JrJykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENyZWF0aW9uVGVzdENhc2UsIFRpbWVvdXRUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZW91dC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFlYjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZW91dC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZW91dC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90aW1lb3V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWFlYjVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGltZW91dC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGsucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI1ZGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGsucHkKQEAgLTAsMCArMSwyOSBAQAoraW1wb3J0IG9zCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCisjIFNraXAgdGVzdCBpZiBfdGtpbnRlciB3YXNuJ3QgYnVpbHQuCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3RraW50ZXInKQorCit0aGlzX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorbGliX3RrX3Rlc3QgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHRoaXNfZGlyLCBvcy5wYXRoLnBhcmRpciwKKyAgICAnbGliLXRrJywgJ3Rlc3QnKSkKKword2l0aCB0ZXN0X3N1cHBvcnQuRGlyc09uU3lzUGF0aChsaWJfdGtfdGVzdCk6CisgICAgaW1wb3J0IHJ1bnRrdGVzdHMKKworIyBTa2lwIHRlc3QgaWYgdGsgY2Fubm90IGJlIGluaXRpYWxpemVkLgorcnVudGt0ZXN0cy5jaGVja190a19hdmFpbGFiaWxpdHkoKQorCitkZWYgdGVzdF9tYWluKGVuYWJsZV9ndWk9RmFsc2UpOgorICAgIGlmIGVuYWJsZV9ndWk6CisgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzIGlzIE5vbmU6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcyA9IFsnZ3VpJ10KKyAgICAgICAgZWxpZiAnZ3VpJyBub3QgaW4gdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXM6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlcy5hcHBlbmQoJ2d1aScpCisKKyAgICB3aXRoIHRlc3Rfc3VwcG9ydC5EaXJzT25TeXNQYXRoKGxpYl90a190ZXN0KToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgICAgICpydW50a3Rlc3RzLmdldF90ZXN0cyh0ZXh0PUZhbHNlLCBwYWNrYWdlcz1bJ3Rlc3RfdGtpbnRlciddKSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oZW5hYmxlX2d1aT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGsucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjExNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGsucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdGsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjExNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90ay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b2tlbml6ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODlmNjhmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHkKQEAgLTAsMCArMSw2MjUgQEAKK2RvY3Rlc3RzID0gIiIiCitUZXN0cyBmb3IgdGhlIHRva2VuaXplIG1vZHVsZS4KKworICAgID4+PiBpbXBvcnQgZ2xvYiwgcmFuZG9tLCBzeXMKKworVGhlIHRlc3RzIGNhbiBiZSByZWFsbHkgc2ltcGxlLiBHaXZlbiBhIHNtYWxsIGZyYWdtZW50IG9mIHNvdXJjZQorY29kZSwgcHJpbnQgb3V0IGEgdGFibGUgd2l0aCB0b2tlbnMuIFRoZSBFTkRNQVJLIGlzIG9taXR0ZWQgZm9yCiticmV2aXR5LgorCisgICAgPj4+IGR1bXBfdG9rZW5zKCIxICsgMSIpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoImlmIEZhbHNlOlxcbiIKKyAgICAuLi4gICAgICAgICAgICAgIiAgICAjIE5MXFxuIgorICAgIC4uLiAgICAgICAgICAgICAiICAgIFRydWUgPSBGYWxzZSAjIE5FV0xJTkVcXG4iKQorICAgIE5BTUUgICAgICAgJ2lmJyAgICAgICAgICAoMSwgMCkgKDEsIDIpCisgICAgTkFNRSAgICAgICAnRmFsc2UnICAgICAgICgxLCAzKSAoMSwgOCkKKyAgICBPUCAgICAgICAgICc6JyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIE5FV0xJTkUgICAgJ1xcbicgICAgICAgICAgKDEsIDkpICgxLCAxMCkKKyAgICBDT01NRU5UICAgICcjIE5MJyAgICAgICAgKDIsIDQpICgyLCA4KQorICAgIE5MICAgICAgICAgJ1xcbicgICAgICAgICAgKDIsIDgpICgyLCA5KQorICAgIElOREVOVCAgICAgJyAgICAnICAgICAgICAoMywgMCkgKDMsIDQpCisgICAgTkFNRSAgICAgICAnVHJ1ZScgICAgICAgICgzLCA0KSAoMywgOCkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDMsIDkpICgzLCAxMCkKKyAgICBOQU1FICAgICAgICdGYWxzZScgICAgICAgKDMsIDExKSAoMywgMTYpCisgICAgQ09NTUVOVCAgICAnIyBORVdMSU5FJyAgICgzLCAxNykgKDMsIDI2KQorICAgIE5FV0xJTkUgICAgJ1xcbicgICAgICAgICAgKDMsIDI2KSAoMywgMjcpCisgICAgREVERU5UICAgICAnJyAgICAgICAgICAgICg0LCAwKSAoNCwgMCkKKworICAgID4+PiBpbmRlbnRfZXJyb3JfZmlsZSA9IFwiIiIKKyAgICAuLi4gZGVmIGsoeCk6CisgICAgLi4uICAgICB4ICs9IDIKKyAgICAuLi4gICB4ICs9IDUKKyAgICAuLi4gXCIiIgorCisgICAgPj4+IGZvciB0b2sgaW4gZ2VuZXJhdGVfdG9rZW5zKFN0cmluZ0lPKGluZGVudF9lcnJvcl9maWxlKS5yZWFkbGluZSk6IHBhc3MKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAgIC4uLgorICAgIEluZGVudGF0aW9uRXJyb3I6IHVuaW5kZW50IGRvZXMgbm90IG1hdGNoIGFueSBvdXRlciBpbmRlbnRhdGlvbiBsZXZlbAorCitUZXN0IHJvdW5kdHJpcCBmb3IgYHVudG9rZW5pemVgLiBgZmAgaXMgYW4gb3BlbiBmaWxlIG9yIGEgc3RyaW5nLiBUaGUgc291cmNlCitjb2RlIGluIGYgaXMgdG9rZW5pemVkLCBjb252ZXJ0ZWQgYmFjayB0byBzb3VyY2UgY29kZSB2aWEgdG9rZW5pemUudW50b2tlbml6ZSgpLAorYW5kIHRva2VuaXplZCBhZ2FpbiBmcm9tIHRoZSBsYXR0ZXIuIFRoZSB0ZXN0IGZhaWxzIGlmIHRoZSBzZWNvbmQgdG9rZW5pemF0aW9uCitkb2Vzbid0IG1hdGNoIHRoZSBmaXJzdC4KKworICAgID4+PiBkZWYgcm91bmR0cmlwKGYpOgorICAgIC4uLiAgICAgaWYgaXNpbnN0YW5jZShmLCBzdHIpOiBmID0gU3RyaW5nSU8oZikKKyAgICAuLi4gICAgIHRva2VuX2xpc3QgPSBsaXN0KGdlbmVyYXRlX3Rva2VucyhmLnJlYWRsaW5lKSkKKyAgICAuLi4gICAgIGYuY2xvc2UoKQorICAgIC4uLiAgICAgdG9rZW5zMSA9IFt0b2tbOjJdIGZvciB0b2sgaW4gdG9rZW5fbGlzdF0KKyAgICAuLi4gICAgIG5ld190ZXh0ID0gdW50b2tlbml6ZSh0b2tlbnMxKQorICAgIC4uLiAgICAgcmVhZGxpbmUgPSBpdGVyKG5ld190ZXh0LnNwbGl0bGluZXMoMSkpLm5leHQKKyAgICAuLi4gICAgIHRva2VuczIgPSBbdG9rWzoyXSBmb3IgdG9rIGluIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSldCisgICAgLi4uICAgICByZXR1cm4gdG9rZW5zMSA9PSB0b2tlbnMyCisgICAgLi4uCisKK1RoZXJlIGFyZSBzb21lIHN0YW5kYXJkIGZvcm1hdHRpbmcgcHJhY3RpY2VzIHRoYXQgYXJlIGVhc3kgdG8gZ2V0IHJpZ2h0LgorCisgICAgPj4+IHJvdW5kdHJpcCgiaWYgeCA9PSAxOlxcbiIKKyAgICAuLi4gICAgICAgICAgICIgICAgcHJpbnQgeFxcbiIpCisgICAgVHJ1ZQorCisgICAgPj4+IHJvdW5kdHJpcCgiIyBUaGlzIGlzIGEgY29tbWVudFxcbiMgVGhpcyBhbHNvIikKKyAgICBUcnVlCisKK1NvbWUgcGVvcGxlIHVzZSBkaWZmZXJlbnQgZm9ybWF0dGluZyBjb252ZW50aW9ucywgd2hpY2ggbWFrZXMKK3VudG9rZW5pemUgYSBsaXR0bGUgdHJpY2tpZXIuIE5vdGUgdGhhdCB0aGlzIHRlc3QgaW52b2x2ZXMgdHJhaWxpbmcKK3doaXRlc3BhY2UgYWZ0ZXIgdGhlIGNvbG9uLiBOb3RlIHRoYXQgd2UgdXNlIGhleCBlc2NhcGVzIHRvIG1ha2UgdGhlCit0d28gdHJhaWxpbmcgYmxhbmtzIGFwcGVyYW50IGluIHRoZSBleHBlY3RlZCBvdXRwdXQuCisKKyAgICA+Pj4gcm91bmR0cmlwKCJpZiB4ID09IDEgOiBcXG4iCisgICAgLi4uICAgICAgICAgICAiICBwcmludCB4XFxuIikKKyAgICBUcnVlCisKKyAgICA+Pj4gZiA9IHRlc3Rfc3VwcG9ydC5maW5kZmlsZSgidG9rZW5pemVfdGVzdHMiICsgb3MuZXh0c2VwICsgInR4dCIpCisgICAgPj4+IHJvdW5kdHJpcChvcGVuKGYpKQorICAgIFRydWUKKworICAgID4+PiByb3VuZHRyaXAoImlmIHggPT0gMTpcXG4iCisgICAgLi4uICAgICAgICAgICAiICAgICMgQSBjb21tZW50IGJ5IGl0c2VsZi5cXG4iCisgICAgLi4uICAgICAgICAgICAiICAgIHByaW50IHggIyBDb21tZW50IGhlcmUsIHRvby5cXG4iCisgICAgLi4uICAgICAgICAgICAiICAgICMgQW5vdGhlciBjb21tZW50LlxcbiIKKyAgICAuLi4gICAgICAgICAgICJhZnRlcl9pZiA9IFRydWVcXG4iKQorICAgIFRydWUKKworICAgID4+PiByb3VuZHRyaXAoImlmICh4ICMgVGhlIGNvbW1lbnRzIG5lZWQgdG8gZ28gaW4gdGhlIHJpZ2h0IHBsYWNlXFxuIgorICAgIC4uLiAgICAgICAgICAgIiAgICA9PSAxKTpcXG4iCisgICAgLi4uICAgICAgICAgICAiICAgIHByaW50ICd4PT0xJ1xcbiIpCisgICAgVHJ1ZQorCisgICAgPj4+IHJvdW5kdHJpcCgiY2xhc3MgVGVzdDogIyBBIGNvbW1lbnQgaGVyZVxcbiIKKyAgICAuLi4gICAgICAgICAgICIgICMgQSBjb21tZW50IHdpdGggd2VpcmQgaW5kZW50XFxuIgorICAgIC4uLiAgICAgICAgICAgIiAgYWZ0ZXJfY29tID0gNVxcbiIKKyAgICAuLi4gICAgICAgICAgICIgIGRlZiB4KG0pOiByZXR1cm4gbSo1ICMgYSBvbmUgbGluZXJcXG4iCisgICAgLi4uICAgICAgICAgICAiICBkZWYgeShtKTogIyBBIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIGNvbG9uXFxuIgorICAgIC4uLiAgICAgICAgICAgIiAgICAgcmV0dXJuIHkqNCAjIDMtc3BhY2UgaW5kZW50XFxuIikKKyAgICBUcnVlCisKK1NvbWUgZXJyb3ItaGFuZGxpbmcgY29kZQorCisgICAgPj4+IHJvdW5kdHJpcCgidHJ5OiBpbXBvcnQgc29tZW1vZHVsZVxcbiIKKyAgICAuLi4gICAgICAgICAgICJleGNlcHQgSW1wb3J0RXJyb3I6ICMgY29tbWVudFxcbiIKKyAgICAuLi4gICAgICAgICAgICIgICAgcHJpbnQgJ0NhbiBub3QgaW1wb3J0JyAjIGNvbW1lbnQyXFxuIgorICAgIC4uLiAgICAgICAgICAgImVsc2U6ICAgcHJpbnQgJ0xvYWRlZCdcXG4iKQorICAgIFRydWUKKworQmFsYW5jaW5nIGNvbnRpbnVhdGlvbgorCisgICAgPj4+IHJvdW5kdHJpcCgiYSA9ICgzLDQsIFxcbiIKKyAgICAuLi4gICAgICAgICAgICI1LDYpXFxuIgorICAgIC4uLiAgICAgICAgICAgInkgPSBbMywgNCxcXG4iCisgICAgLi4uICAgICAgICAgICAiNV1cXG4iCisgICAgLi4uICAgICAgICAgICAieiA9IHsnYSc6IDUsXFxuIgorICAgIC4uLiAgICAgICAgICAgIidiJzoxNSwgJ2MnOlRydWV9XFxuIgorICAgIC4uLiAgICAgICAgICAgInggPSBsZW4oeSkgKyA1IC0gYVtcXG4iCisgICAgLi4uICAgICAgICAgICAiM10gLSBhWzJdXFxuIgorICAgIC4uLiAgICAgICAgICAgIisgbGVuKHopIC0geltcXG4iCisgICAgLi4uICAgICAgICAgICAiJ2InXVxcbiIpCisgICAgVHJ1ZQorCitPcmRpbmFyeSBpbnRlZ2VycyBhbmQgYmluYXJ5IG9wZXJhdG9ycworCisgICAgPj4+IGR1bXBfdG9rZW5zKCIweGZmIDw9IDI1NSIpCisgICAgTlVNQkVSICAgICAnMHhmZicgICAgICAgICgxLCAwKSAoMSwgNCkKKyAgICBPUCAgICAgICAgICc8PScgICAgICAgICAgKDEsIDUpICgxLCA3KQorICAgIE5VTUJFUiAgICAgJzI1NScgICAgICAgICAoMSwgOCkgKDEsIDExKQorICAgID4+PiBkdW1wX3Rva2VucygiMGIxMCA8PSAyNTUiKQorICAgIE5VTUJFUiAgICAgJzBiMTAnICAgICAgICAoMSwgMCkgKDEsIDQpCisgICAgT1AgICAgICAgICAnPD0nICAgICAgICAgICgxLCA1KSAoMSwgNykKKyAgICBOVU1CRVIgICAgICcyNTUnICAgICAgICAgKDEsIDgpICgxLCAxMSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoIjBvMTIzIDw9IDAxMjMiKQorICAgIE5VTUJFUiAgICAgJzBvMTIzJyAgICAgICAoMSwgMCkgKDEsIDUpCisgICAgT1AgICAgICAgICAnPD0nICAgICAgICAgICgxLCA2KSAoMSwgOCkKKyAgICBOVU1CRVIgICAgICcwMTIzJyAgICAgICAgKDEsIDkpICgxLCAxMykKKyAgICA+Pj4gZHVtcF90b2tlbnMoIjAxMjM0NTY3ID4gfjB4MTUiKQorICAgIE5VTUJFUiAgICAgJzAxMjM0NTY3JyAgICAoMSwgMCkgKDEsIDgpCisgICAgT1AgICAgICAgICAnPicgICAgICAgICAgICgxLCA5KSAoMSwgMTApCisgICAgT1AgICAgICAgICAnficgICAgICAgICAgICgxLCAxMSkgKDEsIDEyKQorICAgIE5VTUJFUiAgICAgJzB4MTUnICAgICAgICAoMSwgMTIpICgxLCAxNikKKyAgICA+Pj4gZHVtcF90b2tlbnMoIjIxMzQ1NjggIT0gMDEyMzE1MTUiKQorICAgIE5VTUJFUiAgICAgJzIxMzQ1NjgnICAgICAoMSwgMCkgKDEsIDcpCisgICAgT1AgICAgICAgICAnIT0nICAgICAgICAgICgxLCA4KSAoMSwgMTApCisgICAgTlVNQkVSICAgICAnMDEyMzE1MTUnICAgICgxLCAxMSkgKDEsIDE5KQorICAgID4+PiBkdW1wX3Rva2VucygiKC0xMjQ1NjEtMSkgJiAwMjAwMDAwMDAwIikKKyAgICBPUCAgICAgICAgICcoJyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgMSkgKDEsIDIpCisgICAgTlVNQkVSICAgICAnMTI0NTYxJyAgICAgICgxLCAyKSAoMSwgOCkKKyAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIE9QICAgICAgICAgJyknICAgICAgICAgICAoMSwgMTApICgxLCAxMSkKKyAgICBPUCAgICAgICAgICcmJyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgTlVNQkVSICAgICAnMDIwMDAwMDAwMCcgICgxLCAxNCkgKDEsIDI0KQorICAgID4+PiBkdW1wX3Rva2VucygiMHhkZWFkYmVlZiAhPSAtMSIpCisgICAgTlVNQkVSICAgICAnMHhkZWFkYmVlZicgICgxLCAwKSAoMSwgMTApCisgICAgT1AgICAgICAgICAnIT0nICAgICAgICAgICgxLCAxMSkgKDEsIDEzKQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgMTQpICgxLCAxNSkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDE1KSAoMSwgMTYpCisgICAgPj4+IGR1bXBfdG9rZW5zKCIweGRlYWRjMGRlICYgMDEyMzQ1IikKKyAgICBOVU1CRVIgICAgICcweGRlYWRjMGRlJyAgKDEsIDApICgxLCAxMCkKKyAgICBPUCAgICAgICAgICcmJyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgTlVNQkVSICAgICAnMDEyMzQ1JyAgICAgICgxLCAxMykgKDEsIDE5KQorICAgID4+PiBkdW1wX3Rva2VucygiMHhGRiAmIDB4MTUgfCAxMjM0IikKKyAgICBOVU1CRVIgICAgICcweEZGJyAgICAgICAgKDEsIDApICgxLCA0KQorICAgIE9QICAgICAgICAgJyYnICAgICAgICAgICAoMSwgNSkgKDEsIDYpCisgICAgTlVNQkVSICAgICAnMHgxNScgICAgICAgICgxLCA3KSAoMSwgMTEpCisgICAgT1AgICAgICAgICAnfCcgICAgICAgICAgICgxLCAxMikgKDEsIDEzKQorICAgIE5VTUJFUiAgICAgJzEyMzQnICAgICAgICAoMSwgMTQpICgxLCAxOCkKKworTG9uZyBpbnRlZ2VycworCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gMEwiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICcwTCcgICAgICAgICAgKDEsIDQpICgxLCA2KQorICAgID4+PiBkdW1wX3Rva2VucygieCA9IDB4ZmZmZmZmZmZmZmYiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICcweGZmZmZmZmZmZmYgKDEsIDQpICgxLCAxNykKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAxMjMxNDEyNDIxNTEyNTE2MTYxMTBsIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnMTIzMTQxMjQyMTUxICgxLCA0KSAoMSwgMjYpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gLTE1OTIxNTkwMjE1MDEyNTkxTCIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisgICAgTlVNQkVSICAgICAnMTU5MjE1OTAyMTUwICgxLCA1KSAoMSwgMjMpCisKK0Zsb2F0aW5nIHBvaW50IG51bWJlcnMKKworICAgID4+PiBkdW1wX3Rva2VucygieCA9IDMuMTQxNTkiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICczLjE0MTU5JyAgICAgKDEsIDQpICgxLCAxMSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAzMTQxNTkuIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnMzE0MTU5LicgICAgICgxLCA0KSAoMSwgMTEpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gLjMxNDE1OSIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJy4zMTQxNTknICAgICAoMSwgNCkgKDEsIDExKQorICAgID4+PiBkdW1wX3Rva2VucygieCA9IDNlMTQxNTkiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICczZTE0MTU5JyAgICAgKDEsIDQpICgxLCAxMSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAzRTEyMyIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzNFMTIzJyAgICAgICAoMSwgNCkgKDEsIDkpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4K3kgPSAzZS0xMjMwIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMSkgKDEsIDIpCisgICAgTkFNRSAgICAgICAneScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDQpICgxLCA1KQorICAgIE5VTUJFUiAgICAgJzNlLTEyMzAnICAgICAoMSwgNikgKDEsIDEzKQorICAgID4+PiBkdW1wX3Rva2VucygieCA9IDMuMTRlMTU5IikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgTlVNQkVSICAgICAnMy4xNGUxNTknICAgICgxLCA0KSAoMSwgMTIpCisKK1N0cmluZyBsaXRlcmFscworCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gJyc7IHkgPSBcXFwiXFxcIiIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIFNUUklORyAgICAgIicnIiAgICAgICAgICAoMSwgNCkgKDEsIDYpCisgICAgT1AgICAgICAgICAnOycgICAgICAgICAgICgxLCA2KSAoMSwgNykKKyAgICBOQU1FICAgICAgICd5JyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMTApICgxLCAxMSkKKyAgICBTVFJJTkcgICAgICciIicgICAgICAgICAgKDEsIDEyKSAoMSwgMTQpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gJ1xcXCInOyB5ID0gXFxcIidcXFwiIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgU1RSSU5HICAgICAnXFwnIlxcJycgICAgICAgKDEsIDQpICgxLCA3KQorICAgIE9QICAgICAgICAgJzsnICAgICAgICAgICAoMSwgNykgKDEsIDgpCisgICAgTkFNRSAgICAgICAneScgICAgICAgICAgICgxLCA5KSAoMSwgMTApCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAxMSkgKDEsIDEyKQorICAgIFNUUklORyAgICAgJyJcXCciJyAgICAgICAgKDEsIDEzKSAoMSwgMTYpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gXFxcImRvZXNuJ3QgXFxcInNocmlua1xcXCIsIGRvZXMgaXRcXFwiIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgU1RSSU5HICAgICAnImRvZXNuXFwndCAiJyAoMSwgNCkgKDEsIDE0KQorICAgIE5BTUUgICAgICAgJ3NocmluaycgICAgICAoMSwgMTQpICgxLCAyMCkKKyAgICBTVFJJTkcgICAgICciLCBkb2VzIGl0IicgKDEsIDIwKSAoMSwgMzEpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gdSdhYmMnICsgVSdBQkMnIikKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgU1RSSU5HICAgICAidSdhYmMnIiAgICAgICgxLCA0KSAoMSwgMTApCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAxMSkgKDEsIDEyKQorICAgIFNUUklORyAgICAgIlUnQUJDJyIgICAgICAoMSwgMTMpICgxLCAxOSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoJ3kgPSB1IkFCQyIgKyBVIkFCQyInKQorICAgIE5BTUUgICAgICAgJ3knICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBTVFJJTkcgICAgICd1IkFCQyInICAgICAgKDEsIDQpICgxLCAxMCkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgU1RSSU5HICAgICAnVSJBQkMiJyAgICAgICgxLCAxMykgKDEsIDE5KQorICAgID4+PiBkdW1wX3Rva2VucygieCA9IHVyJ2FiYycgKyBVcidBQkMnICsgdVInQUJDJyArIFVSJ0FCQyciKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBTVFJJTkcgICAgICJ1cidhYmMnIiAgICAgKDEsIDQpICgxLCAxMSkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgU1RSSU5HICAgICAiVXInQUJDJyIgICAgICgxLCAxNCkgKDEsIDIxKQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMjIpICgxLCAyMykKKyAgICBTVFJJTkcgICAgICJ1UidBQkMnIiAgICAgKDEsIDI0KSAoMSwgMzEpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAzMikgKDEsIDMzKQorICAgIFNUUklORyAgICAgIlVSJ0FCQyciICAgICAoMSwgMzQpICgxLCA0MSkKKyAgICA+Pj4gZHVtcF90b2tlbnMoJ3kgPSB1ciJhYmMiICsgVXIiQUJDIiArIHVSIkFCQyIgKyBVUiJBQkMiJykKKyAgICBOQU1FICAgICAgICd5JyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMikgKDEsIDMpCisgICAgU1RSSU5HICAgICAndXIiYWJjIicgICAgICgxLCA0KSAoMSwgMTEpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAxMikgKDEsIDEzKQorICAgIFNUUklORyAgICAgJ1VyIkFCQyInICAgICAoMSwgMTQpICgxLCAyMSkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDIyKSAoMSwgMjMpCisgICAgU1RSSU5HICAgICAndVIiQUJDIicgICAgICgxLCAyNCkgKDEsIDMxKQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMzIpICgxLCAzMykKKyAgICBTVFJJTkcgICAgICdVUiJBQkMiJyAgICAgKDEsIDM0KSAoMSwgNDEpCisKKyAgICA+Pj4gZHVtcF90b2tlbnMoImInYWJjJyArIEInYWJjJyIpCisgICAgU1RSSU5HICAgICAiYidhYmMnIiAgICAgICgxLCAwKSAoMSwgNikKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDcpICgxLCA4KQorICAgIFNUUklORyAgICAgIkInYWJjJyIgICAgICAoMSwgOSkgKDEsIDE1KQorICAgID4+PiBkdW1wX3Rva2VucygnYiJhYmMiICsgQiJhYmMiJykKKyAgICBTVFJJTkcgICAgICdiImFiYyInICAgICAgKDEsIDApICgxLCA2KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgNykgKDEsIDgpCisgICAgU1RSSU5HICAgICAnQiJhYmMiJyAgICAgICgxLCA5KSAoMSwgMTUpCisgICAgPj4+IGR1bXBfdG9rZW5zKCJicidhYmMnICsgYlInYWJjJyArIEJyJ2FiYycgKyBCUidhYmMnIikKKyAgICBTVFJJTkcgICAgICJicidhYmMnIiAgICAgKDEsIDApICgxLCA3KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgU1RSSU5HICAgICAiYlInYWJjJyIgICAgICgxLCAxMCkgKDEsIDE3KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMTgpICgxLCAxOSkKKyAgICBTVFJJTkcgICAgICJCcidhYmMnIiAgICAgKDEsIDIwKSAoMSwgMjcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAyOCkgKDEsIDI5KQorICAgIFNUUklORyAgICAgIkJSJ2FiYyciICAgICAoMSwgMzApICgxLCAzNykKKyAgICA+Pj4gZHVtcF90b2tlbnMoJ2JyImFiYyIgKyBiUiJhYmMiICsgQnIiYWJjIiArIEJSImFiYyInKQorICAgIFNUUklORyAgICAgJ2JyImFiYyInICAgICAoMSwgMCkgKDEsIDcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCA4KSAoMSwgOSkKKyAgICBTVFJJTkcgICAgICdiUiJhYmMiJyAgICAgKDEsIDEwKSAoMSwgMTcpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAxOCkgKDEsIDE5KQorICAgIFNUUklORyAgICAgJ0JyImFiYyInICAgICAoMSwgMjApICgxLCAyNykKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDI4KSAoMSwgMjkpCisgICAgU1RSSU5HICAgICAnQlIiYWJjIicgICAgICgxLCAzMCkgKDEsIDM3KQorCitPcGVyYXRvcnMKKworICAgID4+PiBkdW1wX3Rva2VucygiZGVmIGQyMihhLCBiLCBjPTIsIGQ9MiwgKmspOiBwYXNzIikKKyAgICBOQU1FICAgICAgICdkZWYnICAgICAgICAgKDEsIDApICgxLCAzKQorICAgIE5BTUUgICAgICAgJ2QyMicgICAgICAgICAoMSwgNCkgKDEsIDcpCisgICAgT1AgICAgICAgICAnKCcgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBOQU1FICAgICAgICdhJyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIE9QICAgICAgICAgJywnICAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIE5BTUUgICAgICAgJ2InICAgICAgICAgICAoMSwgMTEpICgxLCAxMikKKyAgICBPUCAgICAgICAgICcsJyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgTkFNRSAgICAgICAnYycgICAgICAgICAgICgxLCAxNCkgKDEsIDE1KQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMSwgMTUpICgxLCAxNikKKyAgICBOVU1CRVIgICAgICcyJyAgICAgICAgICAgKDEsIDE2KSAoMSwgMTcpCisgICAgT1AgICAgICAgICAnLCcgICAgICAgICAgICgxLCAxNykgKDEsIDE4KQorICAgIE5BTUUgICAgICAgJ2QnICAgICAgICAgICAoMSwgMTkpICgxLCAyMCkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIwKSAoMSwgMjEpCisgICAgTlVNQkVSICAgICAnMicgICAgICAgICAgICgxLCAyMSkgKDEsIDIyKQorICAgIE9QICAgICAgICAgJywnICAgICAgICAgICAoMSwgMjIpICgxLCAyMykKKyAgICBPUCAgICAgICAgICcqJyAgICAgICAgICAgKDEsIDI0KSAoMSwgMjUpCisgICAgTkFNRSAgICAgICAnaycgICAgICAgICAgICgxLCAyNSkgKDEsIDI2KQorICAgIE9QICAgICAgICAgJyknICAgICAgICAgICAoMSwgMjYpICgxLCAyNykKKyAgICBPUCAgICAgICAgICc6JyAgICAgICAgICAgKDEsIDI3KSAoMSwgMjgpCisgICAgTkFNRSAgICAgICAncGFzcycgICAgICAgICgxLCAyOSkgKDEsIDMzKQorICAgID4+PiBkdW1wX3Rva2VucygiZGVmIGQwMXZfKGE9MSwgKmssICoqdyk6IHBhc3MiKQorICAgIE5BTUUgICAgICAgJ2RlZicgICAgICAgICAoMSwgMCkgKDEsIDMpCisgICAgTkFNRSAgICAgICAnZDAxdl8nICAgICAgICgxLCA0KSAoMSwgOSkKKyAgICBPUCAgICAgICAgICcoJyAgICAgICAgICAgKDEsIDkpICgxLCAxMCkKKyAgICBOQU1FICAgICAgICdhJyAgICAgICAgICAgKDEsIDEwKSAoMSwgMTEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAxMSkgKDEsIDEyKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgMTIpICgxLCAxMykKKyAgICBPUCAgICAgICAgICcsJyAgICAgICAgICAgKDEsIDEzKSAoMSwgMTQpCisgICAgT1AgICAgICAgICAnKicgICAgICAgICAgICgxLCAxNSkgKDEsIDE2KQorICAgIE5BTUUgICAgICAgJ2snICAgICAgICAgICAoMSwgMTYpICgxLCAxNykKKyAgICBPUCAgICAgICAgICcsJyAgICAgICAgICAgKDEsIDE3KSAoMSwgMTgpCisgICAgT1AgICAgICAgICAnKionICAgICAgICAgICgxLCAxOSkgKDEsIDIxKQorICAgIE5BTUUgICAgICAgJ3cnICAgICAgICAgICAoMSwgMjEpICgxLCAyMikKKyAgICBPUCAgICAgICAgICcpJyAgICAgICAgICAgKDEsIDIyKSAoMSwgMjMpCisgICAgT1AgICAgICAgICAnOicgICAgICAgICAgICgxLCAyMykgKDEsIDI0KQorICAgIE5BTUUgICAgICAgJ3Bhc3MnICAgICAgICAoMSwgMjUpICgxLCAyOSkKKworQ29tcGFyaXNvbgorCisgICAgPj4+IGR1bXBfdG9rZW5zKCJpZiAxIDwgMSA+IDEgPT0gMSA+PSA1IDw9IDB4MTUgPD0gMHgxMiAhPSAiICsKKyAgICAuLi4gICAgICAgICAgICAgIjEgYW5kIDUgaW4gMSBub3QgaW4gMSBpcyAxIG9yIDUgaXMgbm90IDE6IHBhc3MiKQorICAgIE5BTUUgICAgICAgJ2lmJyAgICAgICAgICAoMSwgMCkgKDEsIDIpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAzKSAoMSwgNCkKKyAgICBPUCAgICAgICAgICc8JyAgICAgICAgICAgKDEsIDUpICgxLCA2KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNykgKDEsIDgpCisgICAgT1AgICAgICAgICAnPicgICAgICAgICAgICgxLCA5KSAoMSwgMTApCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAxMSkgKDEsIDEyKQorICAgIE9QICAgICAgICAgJz09JyAgICAgICAgICAoMSwgMTMpICgxLCAxNSkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDE2KSAoMSwgMTcpCisgICAgT1AgICAgICAgICAnPj0nICAgICAgICAgICgxLCAxOCkgKDEsIDIwKQorICAgIE5VTUJFUiAgICAgJzUnICAgICAgICAgICAoMSwgMjEpICgxLCAyMikKKyAgICBPUCAgICAgICAgICc8PScgICAgICAgICAgKDEsIDIzKSAoMSwgMjUpCisgICAgTlVNQkVSICAgICAnMHgxNScgICAgICAgICgxLCAyNikgKDEsIDMwKQorICAgIE9QICAgICAgICAgJzw9JyAgICAgICAgICAoMSwgMzEpICgxLCAzMykKKyAgICBOVU1CRVIgICAgICcweDEyJyAgICAgICAgKDEsIDM0KSAoMSwgMzgpCisgICAgT1AgICAgICAgICAnIT0nICAgICAgICAgICgxLCAzOSkgKDEsIDQxKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNDIpICgxLCA0MykKKyAgICBOQU1FICAgICAgICdhbmQnICAgICAgICAgKDEsIDQ0KSAoMSwgNDcpCisgICAgTlVNQkVSICAgICAnNScgICAgICAgICAgICgxLCA0OCkgKDEsIDQ5KQorICAgIE5BTUUgICAgICAgJ2luJyAgICAgICAgICAoMSwgNTApICgxLCA1MikKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDUzKSAoMSwgNTQpCisgICAgTkFNRSAgICAgICAnbm90JyAgICAgICAgICgxLCA1NSkgKDEsIDU4KQorICAgIE5BTUUgICAgICAgJ2luJyAgICAgICAgICAoMSwgNTkpICgxLCA2MSkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDYyKSAoMSwgNjMpCisgICAgTkFNRSAgICAgICAnaXMnICAgICAgICAgICgxLCA2NCkgKDEsIDY2KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNjcpICgxLCA2OCkKKyAgICBOQU1FICAgICAgICdvcicgICAgICAgICAgKDEsIDY5KSAoMSwgNzEpCisgICAgTlVNQkVSICAgICAnNScgICAgICAgICAgICgxLCA3MikgKDEsIDczKQorICAgIE5BTUUgICAgICAgJ2lzJyAgICAgICAgICAoMSwgNzQpICgxLCA3NikKKyAgICBOQU1FICAgICAgICdub3QnICAgICAgICAgKDEsIDc3KSAoMSwgODApCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA4MSkgKDEsIDgyKQorICAgIE9QICAgICAgICAgJzonICAgICAgICAgICAoMSwgODIpICgxLCA4MykKKyAgICBOQU1FICAgICAgICdwYXNzJyAgICAgICAgKDEsIDg0KSAoMSwgODgpCisKK1NoaWZ0CisKKyAgICA+Pj4gZHVtcF90b2tlbnMoInggPSAxIDw8IDEgPj4gNSIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisgICAgT1AgICAgICAgICAnPDwnICAgICAgICAgICgxLCA2KSAoMSwgOCkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDkpICgxLCAxMCkKKyAgICBPUCAgICAgICAgICc+PicgICAgICAgICAgKDEsIDExKSAoMSwgMTMpCisgICAgTlVNQkVSICAgICAnNScgICAgICAgICAgICgxLCAxNCkgKDEsIDE1KQorCitBZGRpdGl2ZQorCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ4ID0gMSAtIHkgKyAxNSAtIDAxICsgMHgxMjQgKyB6ICsgYVs1XSIpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgxLCAwKSAoMSwgMSkKKyAgICBPUCAgICAgICAgICc9JyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCA2KSAoMSwgNykKKyAgICBOQU1FICAgICAgICd5JyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMTApICgxLCAxMSkKKyAgICBOVU1CRVIgICAgICcxNScgICAgICAgICAgKDEsIDEyKSAoMSwgMTQpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCAxNSkgKDEsIDE2KQorICAgIE5VTUJFUiAgICAgJzAxJyAgICAgICAgICAoMSwgMTcpICgxLCAxOSkKKyAgICBPUCAgICAgICAgICcrJyAgICAgICAgICAgKDEsIDIwKSAoMSwgMjEpCisgICAgTlVNQkVSICAgICAnMHgxMjQnICAgICAgICgxLCAyMikgKDEsIDI3KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgMjgpICgxLCAyOSkKKyAgICBOQU1FICAgICAgICd6JyAgICAgICAgICAgKDEsIDMwKSAoMSwgMzEpCisgICAgT1AgICAgICAgICAnKycgICAgICAgICAgICgxLCAzMikgKDEsIDMzKQorICAgIE5BTUUgICAgICAgJ2EnICAgICAgICAgICAoMSwgMzQpICgxLCAzNSkKKyAgICBPUCAgICAgICAgICdbJyAgICAgICAgICAgKDEsIDM1KSAoMSwgMzYpCisgICAgTlVNQkVSICAgICAnNScgICAgICAgICAgICgxLCAzNikgKDEsIDM3KQorICAgIE9QICAgICAgICAgJ10nICAgICAgICAgICAoMSwgMzcpICgxLCAzOCkKKworTXVsdGlwbGljYXRpdmUKKworICAgID4+PiBkdW1wX3Rva2VucygieCA9IDEvLzEqMS81KjEyJTB4MTIiKQorICAgIE5BTUUgICAgICAgJ3gnICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgT1AgICAgICAgICAnPScgICAgICAgICAgICgxLCAyKSAoMSwgMykKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDQpICgxLCA1KQorICAgIE9QICAgICAgICAgJy8vJyAgICAgICAgICAoMSwgNSkgKDEsIDcpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBPUCAgICAgICAgICcqJyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIE9QICAgICAgICAgJy8nICAgICAgICAgICAoMSwgMTApICgxLCAxMSkKKyAgICBOVU1CRVIgICAgICc1JyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgT1AgICAgICAgICAnKicgICAgICAgICAgICgxLCAxMikgKDEsIDEzKQorICAgIE5VTUJFUiAgICAgJzEyJyAgICAgICAgICAoMSwgMTMpICgxLCAxNSkKKyAgICBPUCAgICAgICAgICclJyAgICAgICAgICAgKDEsIDE1KSAoMSwgMTYpCisgICAgTlVNQkVSICAgICAnMHgxMicgICAgICAgICgxLCAxNikgKDEsIDIwKQorCitVbmFyeQorCisgICAgPj4+IGR1bXBfdG9rZW5zKCJ+MSBeIDEgJiAxIHwxIF4gLTEiKQorICAgIE9QICAgICAgICAgJ34nICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAxKSAoMSwgMikKKyAgICBPUCAgICAgICAgICdeJyAgICAgICAgICAgKDEsIDMpICgxLCA0KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgNSkgKDEsIDYpCisgICAgT1AgICAgICAgICAnJicgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDkpICgxLCAxMCkKKyAgICBPUCAgICAgICAgICd8JyAgICAgICAgICAgKDEsIDExKSAoMSwgMTIpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAxMikgKDEsIDEzKQorICAgIE9QICAgICAgICAgJ14nICAgICAgICAgICAoMSwgMTQpICgxLCAxNSkKKyAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDE2KSAoMSwgMTcpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAxNykgKDEsIDE4KQorICAgID4+PiBkdW1wX3Rva2VucygiLTEqMS8xKzEqMS8vMSAtIC0tLTEqKjEiKQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgMCkgKDEsIDEpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAxKSAoMSwgMikKKyAgICBPUCAgICAgICAgICcqJyAgICAgICAgICAgKDEsIDIpICgxLCAzKQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgMykgKDEsIDQpCisgICAgT1AgICAgICAgICAnLycgICAgICAgICAgICgxLCA0KSAoMSwgNSkKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDUpICgxLCA2KQorICAgIE9QICAgICAgICAgJysnICAgICAgICAgICAoMSwgNikgKDEsIDcpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCA3KSAoMSwgOCkKKyAgICBPUCAgICAgICAgICcqJyAgICAgICAgICAgKDEsIDgpICgxLCA5KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgOSkgKDEsIDEwKQorICAgIE9QICAgICAgICAgJy8vJyAgICAgICAgICAoMSwgMTApICgxLCAxMikKKyAgICBOVU1CRVIgICAgICcxJyAgICAgICAgICAgKDEsIDEyKSAoMSwgMTMpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCAxNCkgKDEsIDE1KQorICAgIE9QICAgICAgICAgJy0nICAgICAgICAgICAoMSwgMTYpICgxLCAxNykKKyAgICBPUCAgICAgICAgICctJyAgICAgICAgICAgKDEsIDE3KSAoMSwgMTgpCisgICAgT1AgICAgICAgICAnLScgICAgICAgICAgICgxLCAxOCkgKDEsIDE5KQorICAgIE5VTUJFUiAgICAgJzEnICAgICAgICAgICAoMSwgMTkpICgxLCAyMCkKKyAgICBPUCAgICAgICAgICcqKicgICAgICAgICAgKDEsIDIwKSAoMSwgMjIpCisgICAgTlVNQkVSICAgICAnMScgICAgICAgICAgICgxLCAyMikgKDEsIDIzKQorCitTZWxlY3RvcgorCisgICAgPj4+IGR1bXBfdG9rZW5zKCJpbXBvcnQgc3lzLCB0aW1lXFxueCA9IHN5cy5tb2R1bGVzWyd0aW1lJ10udGltZSgpIikKKyAgICBOQU1FICAgICAgICdpbXBvcnQnICAgICAgKDEsIDApICgxLCA2KQorICAgIE5BTUUgICAgICAgJ3N5cycgICAgICAgICAoMSwgNykgKDEsIDEwKQorICAgIE9QICAgICAgICAgJywnICAgICAgICAgICAoMSwgMTApICgxLCAxMSkKKyAgICBOQU1FICAgICAgICd0aW1lJyAgICAgICAgKDEsIDEyKSAoMSwgMTYpCisgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMSwgMTYpICgxLCAxNykKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDIsIDApICgyLCAxKQorICAgIE9QICAgICAgICAgJz0nICAgICAgICAgICAoMiwgMikgKDIsIDMpCisgICAgTkFNRSAgICAgICAnc3lzJyAgICAgICAgICgyLCA0KSAoMiwgNykKKyAgICBPUCAgICAgICAgICcuJyAgICAgICAgICAgKDIsIDcpICgyLCA4KQorICAgIE5BTUUgICAgICAgJ21vZHVsZXMnICAgICAoMiwgOCkgKDIsIDE1KQorICAgIE9QICAgICAgICAgJ1snICAgICAgICAgICAoMiwgMTUpICgyLCAxNikKKyAgICBTVFJJTkcgICAgICIndGltZSciICAgICAgKDIsIDE2KSAoMiwgMjIpCisgICAgT1AgICAgICAgICAnXScgICAgICAgICAgICgyLCAyMikgKDIsIDIzKQorICAgIE9QICAgICAgICAgJy4nICAgICAgICAgICAoMiwgMjMpICgyLCAyNCkKKyAgICBOQU1FICAgICAgICd0aW1lJyAgICAgICAgKDIsIDI0KSAoMiwgMjgpCisgICAgT1AgICAgICAgICAnKCcgICAgICAgICAgICgyLCAyOCkgKDIsIDI5KQorICAgIE9QICAgICAgICAgJyknICAgICAgICAgICAoMiwgMjkpICgyLCAzMCkKKworTWV0aG9kcworCisgICAgPj4+IGR1bXBfdG9rZW5zKCJAc3RhdGljbWV0aG9kXFxuZGVmIGZvbyh4LHkpOiBwYXNzIikKKyAgICBPUCAgICAgICAgICdAJyAgICAgICAgICAgKDEsIDApICgxLCAxKQorICAgIE5BTUUgICAgICAgJ3N0YXRpY21ldGhvZCAoMSwgMSkgKDEsIDEzKQorICAgIE5FV0xJTkUgICAgJ1xcbicgICAgICAgICAgKDEsIDEzKSAoMSwgMTQpCisgICAgTkFNRSAgICAgICAnZGVmJyAgICAgICAgICgyLCAwKSAoMiwgMykKKyAgICBOQU1FICAgICAgICdmb28nICAgICAgICAgKDIsIDQpICgyLCA3KQorICAgIE9QICAgICAgICAgJygnICAgICAgICAgICAoMiwgNykgKDIsIDgpCisgICAgTkFNRSAgICAgICAneCcgICAgICAgICAgICgyLCA4KSAoMiwgOSkKKyAgICBPUCAgICAgICAgICcsJyAgICAgICAgICAgKDIsIDkpICgyLCAxMCkKKyAgICBOQU1FICAgICAgICd5JyAgICAgICAgICAgKDIsIDEwKSAoMiwgMTEpCisgICAgT1AgICAgICAgICAnKScgICAgICAgICAgICgyLCAxMSkgKDIsIDEyKQorICAgIE9QICAgICAgICAgJzonICAgICAgICAgICAoMiwgMTIpICgyLCAxMykKKyAgICBOQU1FICAgICAgICdwYXNzJyAgICAgICAgKDIsIDE0KSAoMiwgMTgpCisKK0JhY2tzbGFzaCBtZWFucyBsaW5lIGNvbnRpbnVhdGlvbiwgZXhjZXB0IGZvciBjb21tZW50cworCisgICAgPj4+IHJvdW5kdHJpcCgieD0xK1xcXFxuIgorICAgIC4uLiAgICAgICAgICAgIjFcXG4iCisgICAgLi4uICAgICAgICAgICAiIyBUaGlzIGlzIGEgY29tbWVudFxcXFxuIgorICAgIC4uLiAgICAgICAgICAgIiMgVGhpcyBhbHNvXFxuIikKKyAgICBUcnVlCisgICAgPj4+IHJvdW5kdHJpcCgiIyBDb21tZW50IFxcXFxueCA9IDAiKQorICAgIFRydWUKKworVHdvIHN0cmluZyBsaXRlcmFscyBvbiB0aGUgc2FtZSBsaW5lCisKKyAgICA+Pj4gcm91bmR0cmlwKCInJyAnJyIpCisgICAgVHJ1ZQorCitUZXN0IHJvdW5kdHJpcCBvbiByYW5kb20gcHl0aG9uIG1vZHVsZXMuCitwYXNzIHRoZSAnLXVjcHUnIG9wdGlvbiB0byBwcm9jZXNzIHRoZSBmdWxsIGRpcmVjdG9yeS4KKworICAgID4+PgorICAgID4+PiB0ZW1wZGlyID0gb3MucGF0aC5kaXJuYW1lKGYpIG9yIG9zLmN1cmRpcgorICAgID4+PiB0ZXN0ZmlsZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKHRlbXBkaXIsICJ0ZXN0Ki5weSIpKQorCisgICAgPj4+IGlmIG5vdCB0ZXN0X3N1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgiY3B1Iik6CisgICAgLi4uICAgICB0ZXN0ZmlsZXMgPSByYW5kb20uc2FtcGxlKHRlc3RmaWxlcywgMTApCisgICAgLi4uCisgICAgPj4+IGZvciB0ZXN0ZmlsZSBpbiB0ZXN0ZmlsZXM6CisgICAgLi4uICAgICBpZiBub3Qgcm91bmR0cmlwKG9wZW4odGVzdGZpbGUpKToKKyAgICAuLi4gICAgICAgICBwcmludCAiUm91bmR0cmlwIGZhaWxlZCBmb3IgZmlsZSAlcyIgJSB0ZXN0ZmlsZQorICAgIC4uLiAgICAgICAgIGJyZWFrCisgICAgLi4uIGVsc2U6IFRydWUKKyAgICBUcnVlCisKK0V2aWwgdGFicworICAgID4+PiBkdW1wX3Rva2VucygiZGVmIGYoKTpcXG5cXHRpZiB4XFxuICAgICAgICBcXHRwYXNzIikKKyAgICBOQU1FICAgICAgICdkZWYnICAgICAgICAgKDEsIDApICgxLCAzKQorICAgIE5BTUUgICAgICAgJ2YnICAgICAgICAgICAoMSwgNCkgKDEsIDUpCisgICAgT1AgICAgICAgICAnKCcgICAgICAgICAgICgxLCA1KSAoMSwgNikKKyAgICBPUCAgICAgICAgICcpJyAgICAgICAgICAgKDEsIDYpICgxLCA3KQorICAgIE9QICAgICAgICAgJzonICAgICAgICAgICAoMSwgNykgKDEsIDgpCisgICAgTkVXTElORSAgICAnXFxuJyAgICAgICAgICAoMSwgOCkgKDEsIDkpCisgICAgSU5ERU5UICAgICAnXFx0JyAgICAgICAgICAoMiwgMCkgKDIsIDEpCisgICAgTkFNRSAgICAgICAnaWYnICAgICAgICAgICgyLCAxKSAoMiwgMykKKyAgICBOQU1FICAgICAgICd4JyAgICAgICAgICAgKDIsIDQpICgyLCA1KQorICAgIE5FV0xJTkUgICAgJ1xcbicgICAgICAgICAgKDIsIDUpICgyLCA2KQorICAgIElOREVOVCAgICAgJyAgICAgICAgXFx0JyAgKDMsIDApICgzLCA5KQorICAgIE5BTUUgICAgICAgJ3Bhc3MnICAgICAgICAoMywgOSkgKDMsIDEzKQorICAgIERFREVOVCAgICAgJycgICAgICAgICAgICAoNCwgMCkgKDQsIDApCisgICAgREVERU5UICAgICAnJyAgICAgICAgICAgICg0LCAwKSAoNCwgMCkKKworUGF0aG9sb2dpY2FsIHdoaXRlc3BhY2UgKGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNjE1MikKKyAgICA+Pj4gZHVtcF90b2tlbnMoIkAgICAgICAgICAgIikKKyAgICBPUCAgICAgICAgICdAJyAgICAgICAgICAgKDEsIDApICgxLCAxKQorIiIiCisKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdG9rZW5pemUgaW1wb3J0ICh1bnRva2VuaXplLCBnZW5lcmF0ZV90b2tlbnMsIE5VTUJFUiwgTkFNRSwgT1AsCisgICAgICAgICAgICAgICAgICAgICBTVFJJTkcsIEVORE1BUktFUiwgdG9rX25hbWUpCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworaW1wb3J0IG9zCisKK2RlZiBkdW1wX3Rva2VucyhzKToKKyAgICAiIiJQcmludCBvdXQgdGhlIHRva2VucyBpbiBzIGluIGEgdGFibGUgZm9ybWF0LgorCisgICAgVGhlIEVORE1BUktFUiBpcyBvbWl0dGVkLgorICAgICIiIgorICAgIGYgPSBTdHJpbmdJTyhzKQorICAgIGZvciB0eXBlLCB0b2tlbiwgc3RhcnQsIGVuZCwgbGluZSBpbiBnZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSk6CisgICAgICAgIGlmIHR5cGUgPT0gRU5ETUFSS0VSOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgdHlwZSA9IHRva19uYW1lW3R5cGVdCisgICAgICAgIHByaW50KCIlKHR5cGUpLTEwLjEwcyAlKHRva2VuKS0xMy4xM3IgJShzdGFydClzICUoZW5kKXMiICUgbG9jYWxzKCkpCisKKyMgVGhpcyBpcyBhbiBleGFtcGxlIGZyb20gdGhlIGRvY3MsIHNldCB1cCBhcyBhIGRvY3Rlc3QuCitkZWYgZGVjaXN0bXQocyk6CisgICAgIiIiU3Vic3RpdHV0ZSBEZWNpbWFscyBmb3IgZmxvYXRzIGluIGEgc3RyaW5nIG9mIHN0YXRlbWVudHMuCisKKyAgICA+Pj4gZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCisgICAgPj4+IHMgPSAncHJpbnQgKzIxLjNlLTUqLS4xMjM0LzgxLjcnCisgICAgPj4+IGRlY2lzdG10KHMpCisgICAgInByaW50ICtEZWNpbWFsICgnMjEuM2UtNScpKi1EZWNpbWFsICgnLjEyMzQnKS9EZWNpbWFsICgnODEuNycpIgorCisgICAgVGhlIGZvcm1hdCBvZiB0aGUgZXhwb25lbnQgaXMgaW5oZXJpdGVkIGZyb20gdGhlIHBsYXRmb3JtIEMgbGlicmFyeS4KKyAgICBLbm93biBjYXNlcyBhcmUgImUtMDA3IiAoV2luZG93cykgYW5kICJlLTA3IiAobm90IFdpbmRvd3MpLiAgU2luY2UKKyAgICB3ZSdyZSBvbmx5IHNob3dpbmcgMTIgZGlnaXRzLCBhbmQgdGhlIDEzdGggaXNuJ3QgY2xvc2UgdG8gNSwgdGhlCisgICAgcmVzdCBvZiB0aGUgb3V0cHV0IHNob3VsZCBiZSBwbGF0Zm9ybS1pbmRlcGVuZGVudC4KKworICAgID4+PiBleGVjKHMpICNkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAtMy4yMTcxNjAzNDI3MmUtMC4uLjcKKworICAgIE91dHB1dCBmcm9tIGNhbGN1bGF0aW9ucyB3aXRoIERlY2ltYWwgc2hvdWxkIGJlIGlkZW50aWNhbCBhY3Jvc3MgYWxsCisgICAgcGxhdGZvcm1zLgorCisgICAgPj4+IGV4ZWMoZGVjaXN0bXQocykpCisgICAgLTMuMjE3MTYwMzQyNzE3MjU4MjYxOTMzOTA0NTI5RS03CisgICAgIiIiCisKKyAgICByZXN1bHQgPSBbXQorICAgIGcgPSBnZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8ocykucmVhZGxpbmUpICAgIyB0b2tlbml6ZSB0aGUgc3RyaW5nCisgICAgZm9yIHRva251bSwgdG9rdmFsLCBfLCBfLCBfICBpbiBnOgorICAgICAgICBpZiB0b2tudW0gPT0gTlVNQkVSIGFuZCAnLicgaW4gdG9rdmFsOiAgIyByZXBsYWNlIE5VTUJFUiB0b2tlbnMKKyAgICAgICAgICAgIHJlc3VsdC5leHRlbmQoWworICAgICAgICAgICAgICAgIChOQU1FLCAnRGVjaW1hbCcpLAorICAgICAgICAgICAgICAgIChPUCwgJygnKSwKKyAgICAgICAgICAgICAgICAoU1RSSU5HLCByZXByKHRva3ZhbCkpLAorICAgICAgICAgICAgICAgIChPUCwgJyknKQorICAgICAgICAgICAgXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHRva251bSwgdG9rdmFsKSkKKyAgICByZXR1cm4gdW50b2tlbml6ZShyZXN1bHQpCisKKworX190ZXN0X18gPSB7ImRvY3Rlc3RzIiA6IGRvY3Rlc3RzLCAnZGVjaXN0bXQnOiBkZWNpc3RtdH0KKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3Rva2VuaXplCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdG9rZW5pemUsIFRydWUpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rva2VuaXplLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rva2VuaXplLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRiODkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rva2VuaXplLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rva2VuaXplLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRiODkyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9rZW5pemUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rvb2xzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9vbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwYjRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3Rvb2xzLnB5CkBAIC0wLDAgKzEsMzY4IEBACisiIiJUZXN0cyBmb3Igc2NyaXB0cyBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LgorCitUaGlzIGZpbGUgY29udGFpbnMgcmVncmVzc2lvbiB0ZXN0cyBmb3Igc29tZSBvZiB0aGUgc2NyaXB0cyBmb3VuZCBpbiB0aGUKK1Rvb2xzIGRpcmVjdG9yeSBvZiBhIFB5dGhvbiBjaGVja291dCBvciB0YXJiYWxsLCBzdWNoIGFzIHJlaW5kZW50LnB5LgorIiIiCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5c2NvbmZpZworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGV4dHdyYXAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgYXNzZXJ0X3B5dGhvbl9vaywgdGVtcF9kaXIKKworaWYgbm90IHN5c2NvbmZpZy5pc19weXRob25fYnVpbGQoKToKKyAgICAjIFhYWCBzb21lIGluc3RhbGxlcnMgZG8gY29udGFpbiB0aGUgdG9vbHMsIHNob3VsZCB3ZSBkZXRlY3QgdGhhdAorICAgICMgYW5kIHJ1biB0aGUgdGVzdHMgaW4gdGhhdCBjYXNlIHRvbz8KKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgndGVzdCBpcnJlbGV2YW50IGZvciBhbiBpbnN0YWxsZWQgUHl0aG9uJykKKworYmFzZXBhdGggPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSksCisgICAgICAgICAgICAgICAgICAgICAgICAnVG9vbHMnKQorc2NyaXB0c2RpciA9IG9zLnBhdGguam9pbihiYXNlcGF0aCwgJ3NjcmlwdHMnKQorCisKK2NsYXNzIFJlaW5kZW50VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHNjcmlwdCA9IG9zLnBhdGguam9pbihzY3JpcHRzZGlyLCAncmVpbmRlbnQucHknKQorCisgICAgZGVmIHRlc3Rfbm9hcmdzKHNlbGYpOgorICAgICAgICBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0KQorCisgICAgZGVmIHRlc3RfaGVscChzZWxmKToKKyAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vayhzZWxmLnNjcmlwdCwgJy1oJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsIGInJykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKGVyciwgYicnKQorCisKK2NsYXNzIFBpbmRlbnRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc2NyaXB0ID0gb3MucGF0aC5qb2luKHNjcmlwdHNkaXIsICdwaW5kZW50LnB5JykKKworICAgIGRlZiBhc3NlcnRGaWxlRXF1YWwoc2VsZiwgZm4xLCBmbjIpOgorICAgICAgICB3aXRoIG9wZW4oZm4xKSBhcyBmMSwgb3BlbihmbjIpIGFzIGYyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmMS5yZWFkbGluZXMoKSwgZjIucmVhZGxpbmVzKCkpCisKKyAgICBkZWYgcGluZGVudChzZWxmLCBzb3VyY2UsICphcmdzKToKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oCisgICAgICAgICAgICAgICAgKHN5cy5leGVjdXRhYmxlLCBzZWxmLnNjcmlwdCkgKyBhcmdzLAorICAgICAgICAgICAgICAgIHN0ZGluPXN1YnByb2Nlc3MuUElQRSwgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKKyAgICAgICAgICAgICAgICB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSkKKyAgICAgICAgb3V0LCBlcnIgPSBwcm9jLmNvbW11bmljYXRlKHNvdXJjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUoZXJyKQorICAgICAgICByZXR1cm4gb3V0CisKKyAgICBkZWYgbHN0cmlwbGluZXMoc2VsZiwgZGF0YSk6CisgICAgICAgIHJldHVybiAnXG4nLmpvaW4obGluZS5sc3RyaXAoKSBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoKSkgKyAnXG4nCisKKyAgICBkZWYgdGVzdF9zZWxmdGVzdChzZWxmKToKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgZGlyZWN0b3J5OgorICAgICAgICAgICAgZGF0YV9wYXRoID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgJ190ZXN0LnB5JykKKyAgICAgICAgICAgIHdpdGggb3BlbihzZWxmLnNjcmlwdCkgYXMgZjoKKyAgICAgICAgICAgICAgICBjbG9zZWQgPSBmLnJlYWQoKQorICAgICAgICAgICAgd2l0aCBvcGVuKGRhdGFfcGF0aCwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoY2xvc2VkKQorCisgICAgICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKHNlbGYuc2NyaXB0LCAnLWQnLCBkYXRhX3BhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwgYicnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIsIGInJykKKyAgICAgICAgICAgIGJhY2t1cCA9IGRhdGFfcGF0aCArICd+JworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGJhY2t1cCkpCisgICAgICAgICAgICB3aXRoIG9wZW4oYmFja3VwKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGNsb3NlZCkKKyAgICAgICAgICAgIHdpdGggb3BlbihkYXRhX3BhdGgpIGFzIGY6CisgICAgICAgICAgICAgICAgY2xlYW4gPSBmLnJlYWQoKQorICAgICAgICAgICAgY29tcGlsZShjbGVhbiwgJ190ZXN0LnB5JywgJ2V4ZWMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xlYW4sICctYycpLCBjbG9zZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbG9zZWQsICctZCcpLCBjbGVhbikKKworICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vayhzZWxmLnNjcmlwdCwgJy1jJywgZGF0YV9wYXRoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsIGInJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCisgICAgICAgICAgICB3aXRoIG9wZW4oYmFja3VwKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGNsZWFuKQorICAgICAgICAgICAgd2l0aCBvcGVuKGRhdGFfcGF0aCkgYXMgZjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBjbG9zZWQpCisKKyAgICAgICAgICAgIGJyb2tlbiA9IHNlbGYubHN0cmlwbGluZXMoY2xvc2VkKQorICAgICAgICAgICAgd2l0aCBvcGVuKGRhdGFfcGF0aCwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgICAgIGYud3JpdGUoYnJva2VuKQorICAgICAgICAgICAgcmMsIG91dCwgZXJyID0gYXNzZXJ0X3B5dGhvbl9vayhzZWxmLnNjcmlwdCwgJy1yJywgZGF0YV9wYXRoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsIGInJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLCBiJycpCisgICAgICAgICAgICB3aXRoIG9wZW4oYmFja3VwKSBhcyBmOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGJyb2tlbikKKyAgICAgICAgICAgIHdpdGggb3BlbihkYXRhX3BhdGgpIGFzIGY6CisgICAgICAgICAgICAgICAgaW5kZW50ZWQgPSBmLnJlYWQoKQorICAgICAgICAgICAgY29tcGlsZShpbmRlbnRlZCwgJ190ZXN0LnB5JywgJ2V4ZWMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoYnJva2VuLCAnLXInKSwgaW5kZW50ZWQpCisKKyAgICBkZWYgcGluZGVudF90ZXN0KHNlbGYsIGNsZWFuLCBjbG9zZWQpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbGVhbiwgJy1jJyksIGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xvc2VkLCAnLWQnKSwgY2xlYW4pCisgICAgICAgIGJyb2tlbiA9IHNlbGYubHN0cmlwbGluZXMoY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChicm9rZW4sICctcicsICctZScsICctcycsICc0JyksIGNsb3NlZCkKKworICAgIGRlZiB0ZXN0X3N0YXRlbWVudHMoc2VsZik6CisgICAgICAgIGNsZWFuID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBpZiBhOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBpZiBhOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsaWY6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHdoaWxlIGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgd2hpbGUgYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGZvciBpIGluIGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICB3aXRoIGE6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAiIiIpCisKKyAgICAgICAgY2xvc2VkID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgaWYKKworICAgICAgICAgICAgaWYgYToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIGlmCisKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIGlmCisKKyAgICAgICAgICAgIHdoaWxlIGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICMgZW5kIHdoaWxlCisKKyAgICAgICAgICAgIHdoaWxlIGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgd2hpbGUKKworICAgICAgICAgICAgZm9yIGkgaW4gYToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIyBlbmQgZm9yCisKKyAgICAgICAgICAgIGZvciBpIGluIGE6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgZm9yCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIHRyeQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIHRyeQorCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIHRyeQorCisgICAgICAgICAgICB3aXRoIGE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgIyBlbmQgd2l0aAorCisgICAgICAgICAgICBjbGFzcyBBOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICMgZW5kIGNsYXNzIEEKKworICAgICAgICAgICAgZGVmIGYoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCBkZWYgZgorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLnBpbmRlbnRfdGVzdChjbGVhbiwgY2xvc2VkKQorCisgICAgZGVmIHRlc3RfbXVsdGlsZXZlbChzZWxmKToKKyAgICAgICAgY2xlYW4gPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgZGVmIGZvb2JhcihhLCBiKToKKyAgICAgICAgICAgICAgICBpZiBhID09IGI6CisgICAgICAgICAgICAgICAgICAgIGEgPSBhKzEKKyAgICAgICAgICAgICAgICBlbGlmIGEgPCBiOgorICAgICAgICAgICAgICAgICAgICBiID0gYi0xCisgICAgICAgICAgICAgICAgICAgIGlmIGIgPiBhOiBhID0gYS0xCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ29vcHMhJworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgZGVmIGZvb2JhcihhLCBiKToKKyAgICAgICAgICAgICAgICBpZiBhID09IGI6CisgICAgICAgICAgICAgICAgICAgIGEgPSBhKzEKKyAgICAgICAgICAgICAgICBlbGlmIGEgPCBiOgorICAgICAgICAgICAgICAgICAgICBiID0gYi0xCisgICAgICAgICAgICAgICAgICAgIGlmIGIgPiBhOiBhID0gYS0xCisgICAgICAgICAgICAgICAgICAgICMgZW5kIGlmCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ29vcHMhJworICAgICAgICAgICAgICAgICMgZW5kIGlmCisgICAgICAgICAgICAjIGVuZCBkZWYgZm9vYmFyCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYucGluZGVudF90ZXN0KGNsZWFuLCBjbG9zZWQpCisKKyAgICBkZWYgdGVzdF9wcmVzZXJ2ZV9pbmRlbnRzKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOgorICAgICAgICAgICAgICAgICAgICAgaWYgYjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgY2xvc2VkID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICAgICAgICAgICBpZiBiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICMgZW5kIGlmCisgICAgICAgICAgICAiIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsZWFuLCAnLWMnKSwgY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGluZGVudChjbG9zZWQsICctZCcpLCBjbGVhbikKKyAgICAgICAgYnJva2VuID0gc2VsZi5sc3RyaXBsaW5lcyhjbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGJyb2tlbiwgJy1yJywgJy1lJywgJy1zJywgJzknKSwgY2xvc2VkKQorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBpZiBhOgorICAgICAgICAgICAgXHRpZiBiOgorICAgICAgICAgICAgXHRcdHBhc3MKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgY2xvc2VkID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisgICAgICAgICAgICBcdGlmIGI6CisgICAgICAgICAgICBcdFx0cGFzcworICAgICAgICAgICAgXHQjIGVuZCBpZgorICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xlYW4sICctYycpLCBjbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsb3NlZCwgJy1kJyksIGNsZWFuKQorICAgICAgICBicm9rZW4gPSBzZWxmLmxzdHJpcGxpbmVzKGNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoYnJva2VuLCAnLXInKSwgY2xvc2VkKQorCisgICAgZGVmIHRlc3RfZXNjYXBlZF9uZXdsaW5lKHNlbGYpOgorICAgICAgICBjbGVhbiA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICBjbGFzc1xcCisgICAgICAgICAgICBcXAorICAgICAgICAgICAgIEE6CisgICAgICAgICAgICAgICBkZWZcCisgICAgICAgICAgICBcXAorICAgICAgICAgICAgZjoKKyAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgY2xvc2VkID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGNsYXNzXFwKKyAgICAgICAgICAgIFxcCisgICAgICAgICAgICAgQToKKyAgICAgICAgICAgICAgIGRlZlwKKyAgICAgICAgICAgIFxcCisgICAgICAgICAgICBmOgorICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgIyBlbmQgZGVmIGYKKyAgICAgICAgICAgICMgZW5kIGNsYXNzIEEKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBpbmRlbnQoY2xlYW4sICctYycpLCBjbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5waW5kZW50KGNsb3NlZCwgJy1kJyksIGNsZWFuKQorCisgICAgZGVmIHRlc3RfZW1wdHlfbGluZShzZWxmKToKKyAgICAgICAgY2xlYW4gPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYToKKworICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgY2xvc2VkID0gdGV4dHdyYXAuZGVkZW50KCIiIlwKKyAgICAgICAgICAgIGlmIGE6CisKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAjIGVuZCBpZgorICAgICAgICAgICAgIiIiKQorICAgICAgICBzZWxmLnBpbmRlbnRfdGVzdChjbGVhbiwgY2xvc2VkKQorCisgICAgZGVmIHRlc3Rfb25lbGluZShzZWxmKToKKyAgICAgICAgY2xlYW4gPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYTogcGFzcworICAgICAgICAgICAgIiIiKQorICAgICAgICBjbG9zZWQgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgaWYgYTogcGFzcworICAgICAgICAgICAgIyBlbmQgaWYKKyAgICAgICAgICAgICIiIikKKyAgICAgICAgc2VsZi5waW5kZW50X3Rlc3QoY2xlYW4sIGNsb3NlZCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqW29iaiBmb3Igb2JqIGluIGdsb2JhbHMoKS52YWx1ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvYmosIHR5cGUpXSkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9vbHMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9vbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjE2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b29scy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9vbHMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdG9vbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNjE2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90b29scy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjkyYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2UucHkKQEAgLTAsMCArMSwzNDEgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgKHJ1bl91bml0dGVzdCwgVEVTVEZOLCBybXRyZWUsIHVubGluaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlZF9zdGRvdXQpCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHRyYWNlCitmcm9tIHRyYWNlIGltcG9ydCBDb3ZlcmFnZVJlc3VsdHMsIFRyYWNlCisKK2Zyb20gdGVzdC50cmFjZWRtb2R1bGVzIGltcG9ydCB0ZXN0bW9kCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCitkZWYgZml4X2V4dF9weShmaWxlbmFtZSk6CisgICAgIiIiR2l2ZW4gYSAucHljLy5weW8gZmlsZW5hbWUgY29udmVydHMgaXQgdG8gdGhlIGFwcHJvcHJpYXRlIC5weSIiIgorICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCgnLnB5YycsICcucHlvJykpOgorICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KKyAgICByZXR1cm4gZmlsZW5hbWUKKworZGVmIG15X2ZpbGVfYW5kX21vZG5hbWUoKToKKyAgICAiIiJUaGUgLnB5IGZpbGUgYW5kIG1vZHVsZSBuYW1lIG9mIHRoaXMgZmlsZSAoX19maWxlX18pIiIiCisgICAgbW9kbmFtZSA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5iYXNlbmFtZShfX2ZpbGVfXykpWzBdCisgICAgcmV0dXJuIGZpeF9leHRfcHkoX19maWxlX18pLCBtb2RuYW1lCisKK2RlZiBnZXRfZmlyc3RsaW5lbm8oZnVuYyk6CisgICAgcmV0dXJuIGZ1bmMuX19jb2RlX18uY29fZmlyc3RsaW5lbm8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tIFRhcmdldCBmdW5jdGlvbnMgZm9yIHRyYWNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworIworIyBUaGUgcmVsYXRpdmUgbGluZSBudW1iZXJzIG9mIGxpbmVzIGluIHRoZXNlIGZ1bmN0aW9ucyBtYXR0ZXIgZm9yIHZlcmlmeWluZworIyB0cmFjaW5nLiBQbGVhc2UgbW9kaWZ5IHRoZSBhcHByb3ByaWF0ZSB0ZXN0cyBpZiB5b3UgY2hhbmdlIG9uZSBvZiB0aGUKKyMgZnVuY3Rpb25zLiBBYnNvbHV0ZSBsaW5lIG51bWJlcnMgZG9uJ3QgbWF0dGVyLgorIworCitkZWYgdHJhY2VkX2Z1bmNfbGluZWFyKHgsIHkpOgorICAgIGEgPSB4CisgICAgYiA9IHkKKyAgICBjID0gYSArIGIKKyAgICByZXR1cm4gYworCitkZWYgdHJhY2VkX2Z1bmNfbG9vcCh4LCB5KToKKyAgICBjID0geAorICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICBjICs9IHkKKyAgICByZXR1cm4gYworCitkZWYgdHJhY2VkX2Z1bmNfaW1wb3J0aW5nKHgsIHkpOgorICAgIHJldHVybiB4ICsgeSArIHRlc3Rtb2QuZnVuYygxKQorCitkZWYgdHJhY2VkX2Z1bmNfc2ltcGxlX2NhbGxlcih4KToKKyAgICBjID0gdHJhY2VkX2Z1bmNfbGluZWFyKHgsIHgpCisgICAgcmV0dXJuIGMgKyB4CisKK2RlZiB0cmFjZWRfZnVuY19pbXBvcnRpbmdfY2FsbGVyKHgpOgorICAgIGsgPSB0cmFjZWRfZnVuY19zaW1wbGVfY2FsbGVyKHgpCisgICAgayArPSB0cmFjZWRfZnVuY19pbXBvcnRpbmcoaywgeCkKKyAgICByZXR1cm4gaworCitkZWYgdHJhY2VkX2Z1bmNfZ2VuZXJhdG9yKG51bSk6CisgICAgYyA9IDUgICAgICAgIyBleGVjdXRlZCBvbmNlCisgICAgZm9yIGkgaW4gcmFuZ2UobnVtKToKKyAgICAgICAgeWllbGQgaSArIGMKKworZGVmIHRyYWNlZF9mdW5jX2NhbGxpbmdfZ2VuZXJhdG9yKCk6CisgICAgayA9IDAKKyAgICBmb3IgaSBpbiB0cmFjZWRfZnVuY19nZW5lcmF0b3IoMTApOgorICAgICAgICBrICs9IGkKKworZGVmIHRyYWNlZF9kb3VibGVyKG51bSk6CisgICAgcmV0dXJuIG51bSAqIDIKKworZGVmIHRyYWNlZF9jYWxsZXJfbGlzdF9jb21wcmVoZW5zaW9uKCk6CisgICAgayA9IDEwCisgICAgbXlsaXN0ID0gW3RyYWNlZF9kb3VibGVyKGkpIGZvciBpIGluIHJhbmdlKGspXQorICAgIHJldHVybiBteWxpc3QKKworCitjbGFzcyBUcmFjZWRDbGFzcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgc2VsZi5hID0geAorCisgICAgZGVmIGluc3RfbWV0aG9kX2xpbmVhcihzZWxmLCB5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuYSArIHkKKworICAgIGRlZiBpbnN0X21ldGhvZF9jYWxsaW5nKHNlbGYsIHgpOgorICAgICAgICBjID0gc2VsZi5pbnN0X21ldGhvZF9saW5lYXIoeCkKKyAgICAgICAgcmV0dXJuIGMgKyB0cmFjZWRfZnVuY19saW5lYXIoeCwgYykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBjbGFzc19tZXRob2RfbGluZWFyKGNscywgeSk6CisgICAgICAgIHJldHVybiB5ICogMgorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBzdGF0aWNfbWV0aG9kX2xpbmVhcih5KToKKyAgICAgICAgcmV0dXJuIHkgKiAyCisKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBUZXN0IGNhc2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIworCisKK2NsYXNzIFRlc3RMaW5lQ291bnRzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJXaGl0ZS1ib3ggdGVzdGluZyBvZiBsaW5lLWNvdW50aW5nLCB2aWEgcnVuZnVuYyIiIgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIgPSBUcmFjZShjb3VudD0xLCB0cmFjZT0wLCBjb3VudGZ1bmNzPTAsIGNvdW50Y2FsbGVycz0wKQorICAgICAgICBzZWxmLm15X3B5X2ZpbGVuYW1lID0gZml4X2V4dF9weShfX2ZpbGVfXykKKworICAgIGRlZiB0ZXN0X3RyYWNlZF9mdW5jX2xpbmVhcihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfZnVuY19saW5lYXIsIDIsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCA3KQorCisgICAgICAgICMgYWxsIGxpbmVzIGFyZSBleGVjdXRlZCBvbmNlCisgICAgICAgIGV4cGVjdGVkID0ge30KKyAgICAgICAgZmlyc3RsaW5lbm8gPSBnZXRfZmlyc3RsaW5lbm8odHJhY2VkX2Z1bmNfbGluZWFyKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCA1KToKKyAgICAgICAgICAgIGV4cGVjdGVkWyhzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArICBpKV0gPSAxCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY291bnRzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3RyYWNlZF9mdW5jX2xvb3Aoc2VsZik6CisgICAgICAgIHNlbGYudHJhY2VyLnJ1bmZ1bmModHJhY2VkX2Z1bmNfbG9vcCwgMiwgMykKKworICAgICAgICBmaXJzdGxpbmVubyA9IGdldF9maXJzdGxpbmVubyh0cmFjZWRfZnVuY19sb29wKQorICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArIDEpOiAxLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vICsgMik6IDYsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm8gKyAzKTogNSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArIDQpOiAxLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmFjZXIucmVzdWx0cygpLmNvdW50cywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF90cmFjZWRfZnVuY19pbXBvcnRpbmcoc2VsZik6CisgICAgICAgIHNlbGYudHJhY2VyLnJ1bmZ1bmModHJhY2VkX2Z1bmNfaW1wb3J0aW5nLCAyLCA1KQorCisgICAgICAgIGZpcnN0bGluZW5vID0gZ2V0X2ZpcnN0bGluZW5vKHRyYWNlZF9mdW5jX2ltcG9ydGluZykKKyAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm8gKyAxKTogMSwKKyAgICAgICAgICAgIChmaXhfZXh0X3B5KHRlc3Rtb2QuX19maWxlX18pLCAyKTogMSwKKyAgICAgICAgICAgIChmaXhfZXh0X3B5KHRlc3Rtb2QuX19maWxlX18pLCAzKTogMSwKKyAgICAgICAgfQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmFjZXIucmVzdWx0cygpLmNvdW50cywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF90cmFjZV9mdW5jX2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfZnVuY19jYWxsaW5nX2dlbmVyYXRvcikKKworICAgICAgICBmaXJzdGxpbmVub19jYWxsaW5nID0gZ2V0X2ZpcnN0bGluZW5vKHRyYWNlZF9mdW5jX2NhbGxpbmdfZ2VuZXJhdG9yKQorICAgICAgICBmaXJzdGxpbmVub19nZW4gPSBnZXRfZmlyc3RsaW5lbm8odHJhY2VkX2Z1bmNfZ2VuZXJhdG9yKQorICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVub19jYWxsaW5nICsgMSk6IDEsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm9fY2FsbGluZyArIDIpOiAxMSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVub19jYWxsaW5nICsgMyk6IDEwLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2dlbiArIDEpOiAxLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2dlbiArIDIpOiAxMSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVub19nZW4gKyAzKTogMTAsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY291bnRzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X3RyYWNlX2xpc3RfY29tcHJlaGVuc2lvbihzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfY2FsbGVyX2xpc3RfY29tcHJlaGVuc2lvbikKKworICAgICAgICBmaXJzdGxpbmVub19jYWxsaW5nID0gZ2V0X2ZpcnN0bGluZW5vKHRyYWNlZF9jYWxsZXJfbGlzdF9jb21wcmVoZW5zaW9uKQorICAgICAgICBmaXJzdGxpbmVub19jYWxsZWQgPSBnZXRfZmlyc3RsaW5lbm8odHJhY2VkX2RvdWJsZXIpCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2NhbGxpbmcgKyAxKTogMSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVub19jYWxsaW5nICsgMik6IDExLAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vX2NhbGxpbmcgKyAzKTogMSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVub19jYWxsZWQgKyAxKTogMTAsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY291bnRzLCBleHBlY3RlZCkKKworCisgICAgZGVmIHRlc3RfbGluZWFyX21ldGhvZHMoc2VsZik6CisgICAgICAgICMgWFhYIHRvZG86IGxhdGVyIGFkZCAnc3RhdGljX21ldGhvZF9saW5lYXInIGFuZCAnY2xhc3NfbWV0aG9kX2xpbmVhcicKKyAgICAgICAgIyBoZXJlLCBvbmNlIGlzc3VlMTc2NDI4NiBpcyByZXNvbHZlZAorICAgICAgICAjCisgICAgICAgIGZvciBtZXRobmFtZSBpbiBbJ2luc3RfbWV0aG9kX2xpbmVhcicsXToKKyAgICAgICAgICAgIHRyYWNlciA9IFRyYWNlKGNvdW50PTEsIHRyYWNlPTAsIGNvdW50ZnVuY3M9MCwgY291bnRjYWxsZXJzPTApCisgICAgICAgICAgICB0cmFjZWRfb2JqID0gVHJhY2VkQ2xhc3MoMjUpCisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHRyYWNlZF9vYmosIG1ldGhuYW1lKQorICAgICAgICAgICAgdHJhY2VyLnJ1bmZ1bmMobWV0aG9kLCAyMCkKKworICAgICAgICAgICAgZmlyc3RsaW5lbm8gPSBnZXRfZmlyc3RsaW5lbm8obWV0aG9kKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vICsgMSk6IDEsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlci5yZXN1bHRzKCkuY291bnRzLCBleHBlY3RlZCkKKworY2xhc3MgVGVzdFJ1bkV4ZWNDb3VudHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIkEgc2ltcGxlIHNhbml0eSB0ZXN0IG9mIGxpbmUtY291bnRpbmcsIHZpYSBydW5jdHggKGV4ZWMpIiIiCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm15X3B5X2ZpbGVuYW1lID0gZml4X2V4dF9weShfX2ZpbGVfXykKKworICAgIGRlZiB0ZXN0X2V4ZWNfY291bnRzKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlciA9IFRyYWNlKGNvdW50PTEsIHRyYWNlPTAsIGNvdW50ZnVuY3M9MCwgY291bnRjYWxsZXJzPTApCisgICAgICAgIGNvZGUgPSByJycndHJhY2VkX2Z1bmNfbG9vcCgyLCA1KScnJworICAgICAgICBjb2RlID0gY29tcGlsZShjb2RlLCBfX2ZpbGVfXywgJ2V4ZWMnKQorICAgICAgICBzZWxmLnRyYWNlci5ydW5jdHgoY29kZSwgZ2xvYmFscygpLCB2YXJzKCkpCisKKyAgICAgICAgZmlyc3RsaW5lbm8gPSBnZXRfZmlyc3RsaW5lbm8odHJhY2VkX2Z1bmNfbG9vcCkKKyAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm8gKyAxKTogMSwKKyAgICAgICAgICAgIChzZWxmLm15X3B5X2ZpbGVuYW1lLCBmaXJzdGxpbmVubyArIDIpOiA2LAorICAgICAgICAgICAgKHNlbGYubXlfcHlfZmlsZW5hbWUsIGZpcnN0bGluZW5vICsgMyk6IDUsCisgICAgICAgICAgICAoc2VsZi5teV9weV9maWxlbmFtZSwgZmlyc3RsaW5lbm8gKyA0KTogMSwKKyAgICAgICAgfQorCisgICAgICAgICMgV2hlbiB1c2VkIHRocm91Z2ggJ3J1bicsIHNvbWUgb3RoZXIgc3B1cmlvdXMgY291bnRzIGFyZSBwcm9kdWNlZCwgbGlrZQorICAgICAgICAjIHRoZSBzZXR0cmFjZSBvZiB0aHJlYWRpbmcsIHdoaWNoIHdlIGlnbm9yZSwganVzdCBtYWtpbmcgc3VyZSB0aGF0IHRoZQorICAgICAgICAjIGNvdW50cyBmbyB0cmFjZWRfZnVuY19sb29wIHdlcmUgcmlnaHQuCisgICAgICAgICMKKyAgICAgICAgZm9yIGsgaW4gZXhwZWN0ZWQua2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY291bnRzW2tdLCBleHBlY3RlZFtrXSkKKworCitjbGFzcyBUZXN0RnVuY3ModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIldoaXRlLWJveCB0ZXN0aW5nIG9mIGZ1bmNzIHRyYWNpbmciIiIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYudHJhY2VyID0gVHJhY2UoY291bnQ9MCwgdHJhY2U9MCwgY291bnRmdW5jcz0xKQorICAgICAgICBzZWxmLmZpbGVtb2QgPSBteV9maWxlX2FuZF9tb2RuYW1lKCkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9jYWxsZXIoc2VsZik6CisgICAgICAgIHNlbGYudHJhY2VyLnJ1bmZ1bmModHJhY2VkX2Z1bmNfc2ltcGxlX2NhbGxlciwgMSkKKworICAgICAgICBleHBlY3RlZCA9IHsKKyAgICAgICAgICAgIHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfc2ltcGxlX2NhbGxlcicsKTogMSwKKyAgICAgICAgICAgIHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfbGluZWFyJywpOiAxLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmFjZXIucmVzdWx0cygpLmNhbGxlZGZ1bmNzLCBleHBlY3RlZCkKKworICAgIGRlZiB0ZXN0X2xvb3BfY2FsbGVyX2ltcG9ydGluZyhzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfZnVuY19pbXBvcnRpbmdfY2FsbGVyLCAxKQorCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19zaW1wbGVfY2FsbGVyJywpOiAxLAorICAgICAgICAgICAgc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19saW5lYXInLCk6IDEsCisgICAgICAgICAgICBzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX2ltcG9ydGluZ19jYWxsZXInLCk6IDEsCisgICAgICAgICAgICBzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX2ltcG9ydGluZycsKTogMSwKKyAgICAgICAgICAgIChmaXhfZXh0X3B5KHRlc3Rtb2QuX19maWxlX18pLCAndGVzdG1vZCcsICdmdW5jJyk6IDEsCisgICAgICAgIH0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRyYWNlci5yZXN1bHRzKCkuY2FsbGVkZnVuY3MsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfaW5zdF9tZXRob2RfY2FsbGluZyhzZWxmKToKKyAgICAgICAgb2JqID0gVHJhY2VkQ2xhc3MoMjApCisgICAgICAgIHNlbGYudHJhY2VyLnJ1bmZ1bmMob2JqLmluc3RfbWV0aG9kX2NhbGxpbmcsIDEpCisKKyAgICAgICAgZXhwZWN0ZWQgPSB7CisgICAgICAgICAgICBzZWxmLmZpbGVtb2QgKyAoJ1RyYWNlZENsYXNzLmluc3RfbWV0aG9kX2NhbGxpbmcnLCk6IDEsCisgICAgICAgICAgICBzZWxmLmZpbGVtb2QgKyAoJ1RyYWNlZENsYXNzLmluc3RfbWV0aG9kX2xpbmVhcicsKTogMSwKKyAgICAgICAgICAgIHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfbGluZWFyJywpOiAxLAorICAgICAgICB9CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50cmFjZXIucmVzdWx0cygpLmNhbGxlZGZ1bmNzLCBleHBlY3RlZCkKKworCitjbGFzcyBUZXN0Q2FsbGVycyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiV2hpdGUtYm94IHRlc3Rpbmcgb2YgY2FsbGVycyB0cmFjaW5nIiIiCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnRyYWNlciA9IFRyYWNlKGNvdW50PTAsIHRyYWNlPTAsIGNvdW50Y2FsbGVycz0xKQorICAgICAgICBzZWxmLmZpbGVtb2QgPSBteV9maWxlX2FuZF9tb2RuYW1lKCkKKworICAgIGRlZiB0ZXN0X2xvb3BfY2FsbGVyX2ltcG9ydGluZyhzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZXIucnVuZnVuYyh0cmFjZWRfZnVuY19pbXBvcnRpbmdfY2FsbGVyLCAxKQorCisgICAgICAgIGV4cGVjdGVkID0geworICAgICAgICAgICAgKChvcy5wYXRoLnNwbGl0ZXh0KHRyYWNlLl9fZmlsZV9fKVswXSArICcucHknLCAndHJhY2UnLCAnVHJhY2UucnVuZnVuYycpLAorICAgICAgICAgICAgICAgIChzZWxmLmZpbGVtb2QgKyAoJ3RyYWNlZF9mdW5jX2ltcG9ydGluZ19jYWxsZXInLCkpKTogMSwKKyAgICAgICAgICAgICgoc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19zaW1wbGVfY2FsbGVyJywpKSwKKyAgICAgICAgICAgICAgICAoc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19saW5lYXInLCkpKTogMSwKKyAgICAgICAgICAgICgoc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19pbXBvcnRpbmdfY2FsbGVyJywpKSwKKyAgICAgICAgICAgICAgICAoc2VsZi5maWxlbW9kICsgKCd0cmFjZWRfZnVuY19zaW1wbGVfY2FsbGVyJywpKSk6IDEsCisgICAgICAgICAgICAoKHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfaW1wb3J0aW5nX2NhbGxlcicsKSksCisgICAgICAgICAgICAgICAgKHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfaW1wb3J0aW5nJywpKSk6IDEsCisgICAgICAgICAgICAoKHNlbGYuZmlsZW1vZCArICgndHJhY2VkX2Z1bmNfaW1wb3J0aW5nJywpKSwKKyAgICAgICAgICAgICAgICAoZml4X2V4dF9weSh0ZXN0bW9kLl9fZmlsZV9fKSwgJ3Rlc3Rtb2QnLCAnZnVuYycpKTogMSwKKyAgICAgICAgfQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHJhY2VyLnJlc3VsdHMoKS5jYWxsZXJzLCBleHBlY3RlZCkKKworCisjIENyZWF0ZWQgc2VwYXJhdGVseSBmb3IgaXNzdWUgIzM4MjEKK2NsYXNzIFRlc3RDb3ZlcmFnZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBybXRyZWUoVEVTVEZOKQorICAgICAgICB1bmxpbmsoVEVTVEZOKQorCisgICAgZGVmIF9jb3ZlcmFnZShzZWxmLCB0cmFjZXIsCisgICAgICAgICAgICAgICAgICBjbWQ9J2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9wcHJpbnQ7IHRlc3RfcHByaW50LnRlc3RfbWFpbigpJyk6CisgICAgICAgIHRyYWNlci5ydW4oY21kKQorICAgICAgICByID0gdHJhY2VyLnJlc3VsdHMoKQorICAgICAgICByLndyaXRlX3Jlc3VsdHMoc2hvd19taXNzaW5nPVRydWUsIHN1bW1hcnk9VHJ1ZSwgY292ZXJkaXI9VEVTVEZOKQorCisgICAgZGVmIHRlc3RfY292ZXJhZ2Uoc2VsZik6CisgICAgICAgIHRyYWNlciA9IHRyYWNlLlRyYWNlKHRyYWNlPTAsIGNvdW50PTEpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgc2VsZi5fY292ZXJhZ2UodHJhY2VyKQorICAgICAgICBzdGRvdXQgPSBzdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInBwcmludC5weSIgaW4gc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImNhc2UucHkiIGluIHN0ZG91dCkgICAjIGZyb20gdW5pdHRlc3QKKyAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKFRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJwcHJpbnQuY292ZXIiIGluIGZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInVuaXR0ZXN0LmNhc2UuY292ZXIiIGluIGZpbGVzKQorCisgICAgZGVmIHRlc3RfY292ZXJhZ2VfaWdub3JlKHNlbGYpOgorICAgICAgICAjIElnbm9yZSBhbGwgZmlsZXMsIG5vdGhpbmcgc2hvdWxkIGJlIHRyYWNlZCBub3IgcHJpbnRlZAorICAgICAgICBsaWJwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmRpcm5hbWUob3MuX19maWxlX18pKQorICAgICAgICAjIHN5cy5wcmVmaXggZG9lcyBub3Qgd29yayB3aGVuIHJ1bm5pbmcgZnJvbSBhIGNoZWNrb3V0CisgICAgICAgIHRyYWNlciA9IHRyYWNlLlRyYWNlKGlnbm9yZWRpcnM9W3N5cy5wcmVmaXgsIHN5cy5leGVjX3ByZWZpeCwgbGlicGF0aF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNlPTAsIGNvdW50PTEpCisgICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgorICAgICAgICAgICAgc2VsZi5fY292ZXJhZ2UodHJhY2VyKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKFRFU1RGTikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZXMsIFtdKQorCisgICAgZGVmIHRlc3RfaXNzdWU5OTM2KHNlbGYpOgorICAgICAgICB0cmFjZXIgPSB0cmFjZS5UcmFjZSh0cmFjZT0wLCBjb3VudD0xKQorICAgICAgICBtb2RuYW1lID0gJ3Rlc3QudHJhY2VkbW9kdWxlcy50ZXN0bW9kJworICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBtb2R1bGUgaXMgZXhlY3V0ZWQgaW4gaW1wb3J0CisgICAgICAgIGlmIG1vZG5hbWUgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICAgICAgY21kID0gKCJpbXBvcnQgdGVzdC50cmFjZWRtb2R1bGVzLnRlc3Rtb2QgYXMgdDsiCisgICAgICAgICAgICAgICAidC5mdW5jKDApOyB0LmZ1bmMyKCk7IikKKyAgICAgICAgd2l0aCBjYXB0dXJlZF9zdGRvdXQoKSBhcyBzdGRvdXQ6CisgICAgICAgICAgICBzZWxmLl9jb3ZlcmFnZSh0cmFjZXIsIGNtZCkKKyAgICAgICAgc3Rkb3V0LnNlZWsoMCkKKyAgICAgICAgc3Rkb3V0LnJlYWRsaW5lKCkKKyAgICAgICAgY292ZXJhZ2UgPSB7fQorICAgICAgICBmb3IgbGluZSBpbiBzdGRvdXQ6CisgICAgICAgICAgICBsaW5lcywgY292LCBtb2R1bGUgPSBsaW5lLnNwbGl0KClbOjNdCisgICAgICAgICAgICBjb3ZlcmFnZVttb2R1bGVdID0gKGludChsaW5lcyksIGludChjb3ZbOi0xXSkpCisgICAgICAgICMgWFhYIFRoaXMgaXMgbmVlZGVkIHRvIHJ1biByZWdydGVzdC5weSBhcyBhIHNjcmlwdAorICAgICAgICBtb2RuYW1lID0gdHJhY2UuZnVsbG1vZG5hbWUoc3lzLm1vZHVsZXNbbW9kbmFtZV0uX19maWxlX18pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kbmFtZSwgY292ZXJhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY292ZXJhZ2VbbW9kbmFtZV0sICg1LCAxMDApKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoX19uYW1lX18pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2UucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTdjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2UucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMTdjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNzZiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTAsMCArMSwyMDQgQEAKKyIiIlRlc3QgY2FzZXMgZm9yIHRyYWNlYmFjayBtb2R1bGUiIiIKKworZnJvbSBfdGVzdGNhcGkgaW1wb3J0IHRyYWNlYmFja19wcmludAorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAorZnJvbSBpbXAgaW1wb3J0IHJlbG9hZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBpc19qeXRob24sIEVycm9yCisKK2ltcG9ydCB0cmFjZWJhY2sKKworCitjbGFzcyBUcmFjZWJhY2tDYXNlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBGb3Igbm93LCBhIHZlcnkgbWluaW1hbCBzZXQgb2YgdGVzdHMuICBJIHdhbnQgdG8gYmUgc3VyZSB0aGF0CisgICAgIyBmb3JtYXR0aW5nIG9mIFN5bnRheEVycm9ycyB3b3JrcyBiYXNlZCBvbiBjaGFuZ2VzIGZvciAyLjEuCisKKyAgICBkZWYgZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZiwgZnVuYywgZXhjKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYygpCisgICAgICAgIGV4Y2VwdCBleGMsIHZhbHVlOgorICAgICAgICAgICAgcmV0dXJuIHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoZXhjLCB2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJjYWxsIGRpZCBub3QgcmFpc2UgZXhjZXB0aW9uIgorCisgICAgZGVmIHN5bnRheF9lcnJvcl93aXRoX2NhcmV0KHNlbGYpOgorICAgICAgICBjb21waWxlKCJkZWYgZmFjdCh4KTpcblx0cmV0dXJuIHghXG4iLCAiPyIsICJleGVjIikKKworICAgIGRlZiBzeW50YXhfZXJyb3Jfd2l0aF9jYXJldF8yKHNlbGYpOgorICAgICAgICBjb21waWxlKCIxICtcbiIsICI/IiwgImV4ZWMiKQorCisgICAgZGVmIHN5bnRheF9lcnJvcl93aXRob3V0X2NhcmV0KHNlbGYpOgorICAgICAgICAjIFhYWCB3aHkgZG9lc24ndCBjb21waWxlIHJhaXNlIHRoZSBzYW1lIHRyYWNlYmFjaz8KKyAgICAgICAgaW1wb3J0IHRlc3QuYmFkc3ludGF4X25vY2FyZXQKKworICAgIGRlZiBzeW50YXhfZXJyb3JfYmFkX2luZGVudGF0aW9uKHNlbGYpOgorICAgICAgICBjb21waWxlKCJkZWYgc3BhbSgpOlxuICBwcmludCAxXG4gcHJpbnQgMiIsICI/IiwgImV4ZWMiKQorCisgICAgZGVmIHRlc3RfY2FyZXQoc2VsZik6CisgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3Jfd2l0aF9jYXJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihlcnIpID09IDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uc3RyaXAoKSA9PSAicmV0dXJuIHghIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbigiXiIsIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLmZpbmQoIiEiKSA9PSBlcnJbMl0uZmluZCgiXiIpKSAjIGluIHRoZSByaWdodCBwbGFjZQorCisgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3Jfd2l0aF9jYXJldF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheEVycm9yKQorICAgICAgICBzZWxmLmFzc2VydEluKCJeIiwgZXJyWzJdKSAjIHRoaXJkIGxpbmUgaGFzIGNhcmV0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMl0uY291bnQoJ1xuJykgPT0gMSkgIyBhbmQgbm8gYWRkaXRpb25hbCBuZXdsaW5lCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uZmluZCgiKyIpID09IGVyclsyXS5maW5kKCJeIikpICMgaW4gdGhlIHJpZ2h0IHBsYWNlCisKKyAgICBkZWYgdGVzdF9ub2NhcmV0KHNlbGYpOgorICAgICAgICBpZiBpc19qeXRob246CisgICAgICAgICAgICAjIGp5dGhvbiBhZGRzIGEgY2FyZXQgaW4gdGhpcyBjYXNlICh3aHkgc2hvdWxkbid0IGl0PykKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX3dpdGhvdXRfY2FyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZXJyKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLnN0cmlwKCkgPT0gIlt4IGZvciB4IGluIHhdID0geCIpCisKKyAgICBkZWYgdGVzdF9iYWRfaW5kZW50YXRpb24oc2VsZik6CisgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3JfYmFkX2luZGVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudGF0aW9uRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZXJyKSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLnN0cmlwKCkgPT0gInByaW50IDIiKQorICAgICAgICBzZWxmLmFzc2VydEluKCJeIiwgZXJyWzJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLmZpbmQoIjIiKSA9PSBlcnJbMl0uZmluZCgiXiIpKQorCisgICAgZGVmIHRlc3RfYnVnNzM3NDczKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MsIHRlbXBmaWxlLCB0aW1lCisKKyAgICAgICAgc2F2ZWRwYXRoID0gc3lzLnBhdGhbOl0KKyAgICAgICAgdGVzdGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgdGVzdGRpcikKKyAgICAgICAgICAgIHRlc3RmaWxlID0gb3MucGF0aC5qb2luKHRlc3RkaXIsICd0ZXN0X2J1ZzczNzQ3My5weScpCisgICAgICAgICAgICBwcmludCA+PiBvcGVuKHRlc3RmaWxlLCAndycpLCAiIiIKK2RlZiB0ZXN0KCk6CisgICAgcmFpc2UgVmFsdWVFcnJvciIiIgorCisgICAgICAgICAgICBpZiAndGVzdF9idWc3Mzc0NzMnIGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1sndGVzdF9idWc3Mzc0NzMnXQorICAgICAgICAgICAgaW1wb3J0IHRlc3RfYnVnNzM3NDczCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZXN0X2J1ZzczNzQ3My50ZXN0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICMgdGhpcyBsb2FkcyBzb3VyY2UgY29kZSB0byBsaW5lY2FjaGUKKyAgICAgICAgICAgICAgICB0cmFjZWJhY2suZXh0cmFjdF90YihzeXMuZXhjX3RyYWNlYmFjaykKKworICAgICAgICAgICAgIyBJZiB0aGlzIHRlc3QgcnVucyB0b28gcXVpY2tseSwgdGVzdF9idWc3Mzc0NzMucHkncyBtdGltZQorICAgICAgICAgICAgIyBhdHRyaWJ1dGUgd2lsbCByZW1haW4gdW5jaGFuZ2VkIGV2ZW4gaWYgdGhlIGZpbGUgaXMgcmV3cml0dGVuLgorICAgICAgICAgICAgIyBDb25zZXF1ZW50bHksIHRoZSBmaWxlIHdvdWxkIG5vdCByZWxvYWQuICBTbywgYWRkZWQgYSBzbGVlcCgpCisgICAgICAgICAgICAjIGRlbGF5IHRvIGFzc3VyZSB0aGF0IGEgbmV3LCBkaXN0aW5jdCB0aW1lc3RhbXAgaXMgd3JpdHRlbi4KKyAgICAgICAgICAgICMgU2luY2UgV2luTUUgd2l0aCBGQVQzMiBoYXMgbXVsdGlzZWNvbmQgcmVzb2x1dGlvbiwgbW9yZSB0aGFuCisgICAgICAgICAgICAjIHRocmVlIHNlY29uZHMgYXJlIG5lZWRlZCBmb3IgdGhpcyB0ZXN0IHRvIHBhc3MgcmVsaWFibHkgOi0oCisgICAgICAgICAgICB0aW1lLnNsZWVwKDQpCisKKyAgICAgICAgICAgIHByaW50ID4+IG9wZW4odGVzdGZpbGUsICd3JyksICIiIgorZGVmIHRlc3QoKToKKyAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yIiIiCisgICAgICAgICAgICByZWxvYWQodGVzdF9idWc3Mzc0NzMpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVzdF9idWc3Mzc0NzMudGVzdCgpCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICBzcmMgPSB0cmFjZWJhY2suZXh0cmFjdF90YihzeXMuZXhjX3RyYWNlYmFjaylbLTFdWy0xXQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3JjLCAncmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMucGF0aFs6XSA9IHNhdmVkcGF0aAorICAgICAgICAgICAgZm9yIGYgaW4gb3MubGlzdGRpcih0ZXN0ZGlyKToKKyAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHRlc3RkaXIsIGYpKQorICAgICAgICAgICAgb3Mucm1kaXIodGVzdGRpcikKKworICAgIGRlZiB0ZXN0X2Jhc2VfZXhjZXB0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBleGNlcHRpb25zIGRlcml2ZWQgZnJvbSBCYXNlRXhjZXB0aW9uIGFyZSBmb3JtYXR0ZWQgcmlnaHQKKyAgICAgICAgZSA9IEtleWJvYXJkSW50ZXJydXB0KCkKKyAgICAgICAgbHN0ID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShlLl9fY2xhc3NfXywgZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFsnS2V5Ym9hcmRJbnRlcnJ1cHRcbiddKQorCisgICAgIyBTdHJpbmcgZXhjZXB0aW9ucyBhcmUgZGVwcmVjYXRlZCwgYnV0IGxlZ2FsLiAgVGhlIHF1aXJreSBmb3JtIHdpdGgKKyAgICAjIHNlcGFyYXRlICJ0eXBlIiBhbmQgInZhbHVlIiB0ZW5kcyB0byBicmVhayB0aGluZ3MsIGJlY2F1c2UKKyAgICAjICAgICBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgdHlwZSkKKyAgICAjIGFuZCBhIHN0cmluZyBjYW5ub3QgYmUgdGhlIGZpcnN0IGFyZ3VtZW50IHRvIGlzc3ViY2xhc3MuCisgICAgIworICAgICMgTm90ZSB0aGF0IHN5cy5sYXN0X3R5cGUgYW5kIHN5cy5sYXN0X3ZhbHVlIGRvIG5vdCBnZXQgc2V0IGlmIGFuCisgICAgIyBleGNlcHRpb24gaXMgY2F1Z2h0LCBzbyB3ZSBzb3J0IG9mIGNoZWF0IGFuZCBqdXN0IGVtdWxhdGUgdGhlbS4KKyAgICAjCisgICAgIyB0ZXN0X3N0cmluZ19leGNlcHRpb24xIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAjCisgICAgIyA+Pj4gcmFpc2UgIlN0cmluZyBFeGNlcHRpb24iCisgICAgIworICAgICMgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMiBpcyBlcXVpdmFsZW50IHRvCisgICAgIworICAgICMgPj4+IHJhaXNlICJTdHJpbmcgRXhjZXB0aW9uIiwgIlN0cmluZyBWYWx1ZSIKKyAgICAjCisgICAgZGVmIHRlc3Rfc3RyaW5nX2V4Y2VwdGlvbjEoc2VsZik6CisgICAgICAgIHN0cl90eXBlID0gIlN0cmluZyBFeGNlcHRpb24iCisgICAgICAgIGVyciA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkoc3RyX3R5cGUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBzdHJfdHlwZSArICdcbicpCisKKyAgICBkZWYgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMihzZWxmKToKKyAgICAgICAgc3RyX3R5cGUgPSAiU3RyaW5nIEV4Y2VwdGlvbiIKKyAgICAgICAgc3RyX3ZhbHVlID0gIlN0cmluZyBWYWx1ZSIKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShzdHJfdHlwZSwgc3RyX3ZhbHVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyclswXSwgc3RyX3R5cGUgKyAnOiAnICsgc3RyX3ZhbHVlICsgJ1xuJykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9leGNlcHRpb25fb25seV9iYWRfX3N0cl9fKHNlbGYpOgorICAgICAgICBjbGFzcyBYKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShYLCBYKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHN0cl92YWx1ZSA9ICc8dW5wcmludGFibGUgJXMgb2JqZWN0PicgJSBYLl9fbmFtZV9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBYLl9fbmFtZV9fICsgJzogJyArIHN0cl92YWx1ZSArICdcbicpCisKKyAgICBkZWYgdGVzdF93aXRob3V0X2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVyciwgWydOb25lXG4nXSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGUoc2VsZik6CisgICAgICAgIGVyciA9IEFzc2VydGlvbkVycm9yKCdceGZmJykKKyAgICAgICAgbGluZXMgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHR5cGUoZXJyKSwgZXJyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbJ0Fzc2VydGlvbkVycm9yOiBceGZmXG4nXSkKKworICAgICAgICBlcnIgPSBBc3NlcnRpb25FcnJvcih1J1x4ZTknKQorICAgICAgICBsaW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uX29ubHkodHlwZShlcnIpLCBlcnIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZXMsIFsnQXNzZXJ0aW9uRXJyb3I6IFxceGU5XG4nXSkKKworCitjbGFzcyBUcmFjZWJhY2tGb3JtYXRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF90cmFjZWJhY2tfZm9ybWF0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcignYmxhaCcpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHR5cGVfLCB2YWx1ZSwgdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgdHJhY2ViYWNrX2ZtdCA9ICdUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6XG4nICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnLmpvaW4odHJhY2ViYWNrLmZvcm1hdF90Yih0YikpCisgICAgICAgICAgICBmaWxlXyA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIHRyYWNlYmFja19wcmludCh0YiwgZmlsZV8pCisgICAgICAgICAgICBweXRob25fZm10ICA9IGZpbGVfLmdldHZhbHVlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yKCJ1bmFibGUgdG8gY3JlYXRlIHRlc3QgdHJhY2ViYWNrIHN0cmluZyIpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBQeXRob24gYW5kIHRoZSB0cmFjZWJhY2sgbW9kdWxlIGZvcm1hdCB0aGUgc2FtZSB0aGluZworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRyYWNlYmFja19mbXQsIHB5dGhvbl9mbXQpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgdHJhY2ViYWNrIGlzIHByb3Blcmx5IGluZGVudGVkLgorICAgICAgICB0Yl9saW5lcyA9IHB5dGhvbl9mbXQuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRiX2xpbmVzKSwgMykKKyAgICAgICAgYmFubmVyLCBsb2NhdGlvbiwgc291cmNlX2xpbmUgPSB0Yl9saW5lcworICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFubmVyLnN0YXJ0c3dpdGgoJ1RyYWNlYmFjaycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9jYXRpb24uc3RhcnRzd2l0aCgnICBGaWxlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb3VyY2VfbGluZS5zdGFydHN3aXRoKCcgICAgcmFpc2UnKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRyYWNlYmFja0Nhc2VzLCBUcmFjZWJhY2tGb3JtYXRUZXN0cykKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWEzYmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFjZWJhY2sucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWEzYmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4OTFhYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weQpAQCAtMCwwICsxLDM4IEBACitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKK3Rlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCdjb21waWxlcicsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK2Zyb20gY29tcGlsZXIgaW1wb3J0IHRyYW5zZm9ybWVyLCBhc3QKK2Zyb20gY29tcGlsZXIgaW1wb3J0IGNvbXBpbGUKKworY2xhc3MgVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RNdWx0aXBsZUxIUyhzZWxmKToKKyAgICAgICAgIiIiIFRlc3QgbXVsdGlwbGUgdGFyZ2V0cyBvbiB0aGUgbGVmdCBoYW5kIHNpZGUuICIiIgorCisgICAgICAgIHNuaXBwZXRzID0gWydhLCBiID0gMSwgMicsCisgICAgICAgICAgICAgICAgICAgICcoYSwgYikgPSAxLCAyJywKKyAgICAgICAgICAgICAgICAgICAgJygoYSwgYiksIGMpID0gKDEsIDIpLCAzJ10KKworICAgICAgICBmb3IgcyBpbiBzbmlwcGV0czoKKyAgICAgICAgICAgIGEgPSB0cmFuc2Zvcm1lci5wYXJzZShzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGEsIGFzdC5Nb2R1bGUpCisgICAgICAgICAgICBjaGlsZDEgPSBhLmdldENoaWxkTm9kZXMoKVswXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGNoaWxkMSwgYXN0LlN0bXQpCisgICAgICAgICAgICBjaGlsZDIgPSBjaGlsZDEuZ2V0Q2hpbGROb2RlcygpWzBdCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoY2hpbGQyLCBhc3QuQXNzaWduKQorCisgICAgICAgICAgICAjIFRoaXMgYWN0dWFsbHkgdGVzdHMgdGhlIGNvbXBpbGVyLCBidXQgaXQncyBhIHdheSB0byBhc3N1cmUgdGhlIGFzdAorICAgICAgICAgICAgIyBpcyBjb3JyZWN0CisgICAgICAgICAgICBjID0gY29tcGlsZShzLCAnPHN0cmluZz4nLCAnc2luZ2xlJykKKyAgICAgICAgICAgIHZhbHMgPSB7fQorICAgICAgICAgICAgZXhlYyBjIGluIHZhbHMKKyAgICAgICAgICAgIGFzc2VydCB2YWxzWydhJ10gPT0gMQorICAgICAgICAgICAgYXNzZXJ0IHZhbHNbJ2InXSA9PSAyCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiMDAyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90cmFuc2Zvcm1lci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxZDEyZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3RyYW5zZm9ybWVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMzY4YmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weQpAQCAtMCwwICsxLDQzIEBACitpbXBvcnQgb3MKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBTa2lwIHRoaXMgdGVzdCBpZiBfdGtpbnRlciB3YXNuJ3QgYnVpbHQuCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3RraW50ZXInKQorCit0aGlzX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorbGliX3RrX3Rlc3QgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHRoaXNfZGlyLCBvcy5wYXRoLnBhcmRpciwKKyAgICAnbGliLXRrJywgJ3Rlc3QnKSkKKword2l0aCB0ZXN0X3N1cHBvcnQuRGlyc09uU3lzUGF0aChsaWJfdGtfdGVzdCk6CisgICAgaW1wb3J0IHJ1bnRrdGVzdHMKKworIyBTa2lwIHRlc3QgaWYgdGsgY2Fubm90IGJlIGluaXRpYWxpemVkLgorcnVudGt0ZXN0cy5jaGVja190a19hdmFpbGFiaWxpdHkoKQorCitpbXBvcnQgdHRrCitmcm9tIF90a2ludGVyIGltcG9ydCBUY2xFcnJvcgorCit0cnk6CisgICAgdHRrLkJ1dHRvbigpCitleGNlcHQgVGNsRXJyb3IsIG1zZzoKKyAgICAjIGFzc3VtaW5nIHR0ayBpcyBub3QgYXZhaWxhYmxlCisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoInR0ayBub3QgYXZhaWxhYmxlOiAlcyIgJSBtc2cpCisKK2RlZiB0ZXN0X21haW4oZW5hYmxlX2d1aT1GYWxzZSk6CisgICAgaWYgZW5hYmxlX2d1aToKKyAgICAgICAgaWYgdGVzdF9zdXBwb3J0LnVzZV9yZXNvdXJjZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzID0gWydndWknXQorICAgICAgICBlbGlmICdndWknIG5vdCBpbiB0ZXN0X3N1cHBvcnQudXNlX3Jlc291cmNlczoKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51c2VfcmVzb3VyY2VzLmFwcGVuZCgnZ3VpJykKKworICAgIHdpdGggdGVzdF9zdXBwb3J0LkRpcnNPblN5c1BhdGgobGliX3RrX3Rlc3QpOgorICAgICAgICBmcm9tIHRlc3RfdHRrLnN1cHBvcnQgaW1wb3J0IGdldF90a19yb290CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgICAgICAgICAgKnJ1bnRrdGVzdHMuZ2V0X3Rlc3RzKHRleHQ9RmFsc2UsIHBhY2thZ2VzPVsndGVzdF90dGsnXSkpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBnZXRfdGtfcm9vdCgpLmRlc3Ryb3koKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbihlbmFibGVfZ3VpPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhODBhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfZ3Vpb25seS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFhODBhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a19ndWlvbmx5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dGtfdGV4dG9ubHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MjA0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weQpAQCAtMCwwICsxLDE5IEBACitpbXBvcnQgb3MKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgU2tpcCB0aGlzIHRlc3QgaWYgX3RraW50ZXIgZG9lcyBub3QgZXhpc3QuCit0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnX3RraW50ZXInKQorCit0aGlzX2RpciA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmFic3BhdGgoX19maWxlX18pKQorbGliX3RrX3Rlc3QgPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5qb2luKHRoaXNfZGlyLCAnLi4nLCAnbGliLXRrJywgJ3Rlc3QnKSkKKword2l0aCB0ZXN0X3N1cHBvcnQuRGlyc09uU3lzUGF0aChsaWJfdGtfdGVzdCk6CisgICAgaW1wb3J0IHJ1bnRrdGVzdHMKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LkRpcnNPblN5c1BhdGgobGliX3RrX3Rlc3QpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgKnJ1bnRrdGVzdHMuZ2V0X3Rlc3RzKGd1aT1GYWxzZSwgcGFja2FnZXM9Wyd0ZXN0X3R0ayddKSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkNzNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHRrX3RleHRvbmx5LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkNzNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R0a190ZXh0b25seS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHVwbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dXBsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzMwOGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHVwbGUucHkKQEAgLTAsMCArMSwxNjEgQEAKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBzZXFfdGVzdHMKKworaW1wb3J0IGdjCisKK2NsYXNzIFR1cGxlVGVzdChzZXFfdGVzdHMuQ29tbW9uVGVzdCk6CisgICAgdHlwZTJ0ZXN0ID0gdHVwbGUKKworICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9ycyhzZWxmKToKKyAgICAgICAgc3VwZXIoVHVwbGVUZXN0LCBzZWxmKS50ZXN0X2NvbnN0cnVjdG9ycygpCisgICAgICAgICMgY2FsbGluZyBidWlsdC1pbiB0eXBlcyB3aXRob3V0IGFyZ3VtZW50IG11c3QgcmV0dXJuIGVtcHR5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoKSwgKCkpCisgICAgICAgIHQwXzMgPSAoMCwgMSwgMiwgMykKKyAgICAgICAgdDBfM19iaXMgPSB0dXBsZSh0MF8zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDBfMyBpcyB0MF8zX2JpcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShbXSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKFswLCAxLCAyLCAzXSksICgwLCAxLCAyLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSgnJyksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKCdzcGFtJyksICgncycsICdwJywgJ2EnLCAnbScpKQorCisgICAgZGVmIHRlc3RfdHJ1dGgoc2VsZik6CisgICAgICAgIHN1cGVyKFR1cGxlVGVzdCwgc2VsZikudGVzdF90cnV0aCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoNDIsICkpCisKKyAgICBkZWYgdGVzdF9sZW4oc2VsZik6CisgICAgICAgIHN1cGVyKFR1cGxlVGVzdCwgc2VsZikudGVzdF9sZW4oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbigoKSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKCgwLCkpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbigoMCwgMSwgMikpLCAzKQorCisgICAgZGVmIHRlc3RfaWFkZChzZWxmKToKKyAgICAgICAgc3VwZXIoVHVwbGVUZXN0LCBzZWxmKS50ZXN0X2lhZGQoKQorICAgICAgICB1ID0gKDAsIDEpCisgICAgICAgIHUyID0gdQorICAgICAgICB1ICs9ICgyLCAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSBpcyBub3QgdTIpCisKKyAgICBkZWYgdGVzdF9pbXVsKHNlbGYpOgorICAgICAgICBzdXBlcihUdXBsZVRlc3QsIHNlbGYpLnRlc3RfaW11bCgpCisgICAgICAgIHUgPSAoMCwgMSkKKyAgICAgICAgdTIgPSB1CisgICAgICAgIHUgKj0gMworICAgICAgICBzZWxmLmFzc2VydFRydWUodSBpcyBub3QgdTIpCisKKyAgICBkZWYgdGVzdF90dXBsZXJlc2l6ZWJ1ZyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGEgc3BlY2lmaWMgYnVnIGluIF9QeVR1cGxlX1Jlc2l6ZSgpIGlzIHNxdWFzaGVkLgorICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTAwMCk6CisgICAgICAgICAgICAgICAgeWllbGQgaQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QodHVwbGUoZigpKSksIHJhbmdlKDEwMDApKQorCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgIyBTZWUgU0YgYnVnIDk0Mjk1MjogIFdlYWtuZXNzIGluIHR1cGxlIGhhc2gKKyAgICAgICAgIyBUaGUgaGFzaCBzaG91bGQ6CisgICAgICAgICMgICAgICBiZSBub24tY29tbXV0YXRpdmUKKyAgICAgICAgIyAgICAgIHNob3VsZCBzcHJlYWQtb3V0IGNsb3NlbHkgc3BhY2VkIHZhbHVlcworICAgICAgICAjICAgICAgc2hvdWxkIG5vdCBleGhpYml0IGNhbmNlbGxhdGlvbiBpbiB0dXBsZXMgbGlrZSAoeCwoeCx5KSkKKyAgICAgICAgIyAgICAgIHNob3VsZCBiZSBkaXN0aW5jdCBmcm9tIGVsZW1lbnQgaGFzaGVzOiAgaGFzaCh4KSE9aGFzaCgoeCwpKQorICAgICAgICAjIFRoaXMgdGVzdCBleGVyY2lzZXMgdGhvc2UgY2FzZXMuCisgICAgICAgICMgRm9yIGEgcHVyZSByYW5kb20gaGFzaCBhbmQgTj01MCwgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBvY2N1cGllZAorICAgICAgICAjICAgICAgYnVja2V0cyB3aGVuIHRvc3NpbmcgMjUyLDYwMCBiYWxscyBpbnRvIDIqKjMyIGJ1Y2tldHMKKyAgICAgICAgIyAgICAgIGlzIDI1Miw1OTIuNiwgb3IgYWJvdXQgNy40IGV4cGVjdGVkIGNvbGxpc2lvbnMuICBUaGUKKyAgICAgICAgIyAgICAgIHN0YW5kYXJkIGRldmlhdGlvbiBpcyAyLjczLiAgT24gYSBib3ggd2l0aCA2NC1iaXQgaGFzaAorICAgICAgICAjICAgICAgY29kZXMsIG5vIGNvbGxpc2lvbnMgYXJlIGV4cGVjdGVkLiAgSGVyZSB3ZSBhY2NlcHQgbm8KKyAgICAgICAgIyAgICAgIG1vcmUgdGhhbiAxNSBjb2xsaXNpb25zLiAgQW55IHdvcnNlIGFuZCB0aGUgaGFzaCBmdW5jdGlvbgorICAgICAgICAjICAgICAgaXMgc29yZWx5IHN1c3BlY3QuCisKKyAgICAgICAgTj01MAorICAgICAgICBiYXNlID0gcmFuZ2UoTikKKyAgICAgICAgeHAgPSBbKGksIGopIGZvciBpIGluIGJhc2UgZm9yIGogaW4gYmFzZV0KKyAgICAgICAgaW5wcyA9IGJhc2UgKyBbKGksIGopIGZvciBpIGluIGJhc2UgZm9yIGogaW4geHBdICsgXAorICAgICAgICAgICAgICAgICAgICAgWyhpLCBqKSBmb3IgaSBpbiB4cCBmb3IgaiBpbiBiYXNlXSArIHhwICsgemlwKGJhc2UpCisgICAgICAgIGNvbGxpc2lvbnMgPSBsZW4oaW5wcykgLSBsZW4oc2V0KG1hcChoYXNoLCBpbnBzKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2xsaXNpb25zIDw9IDE1KQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgbDAgPSB0dXBsZSgpCisgICAgICAgIGwyID0gKDAsIDEsIDIpCisgICAgICAgIGEwID0gc2VsZi50eXBlMnRlc3QobDApCisgICAgICAgIGEyID0gc2VsZi50eXBlMnRlc3QobDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYTApLCByZXByKGwwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYTIpLCByZXByKGwyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEwKSwgIigpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGEyKSwgIigwLCAxLCAyKSIpCisKKyAgICBkZWYgX25vdF90cmFja2VkKHNlbGYsIHQpOgorICAgICAgICAjIE5lc3RlZCB0dXBsZXMgY2FuIHRha2Ugc2V2ZXJhbCBjb2xsZWN0aW9ucyB0byB1bnRyYWNrCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShnYy5pc190cmFja2VkKHQpLCB0KQorCisgICAgZGVmIF90cmFja2VkKHNlbGYsIHQpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZCh0KSwgdCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2MuaXNfdHJhY2tlZCh0KSwgdCkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfdHJhY2tfbGl0ZXJhbHMoc2VsZik6CisgICAgICAgICMgVGVzdCBHQy1vcHRpbWl6YXRpb24gb2YgdHVwbGUgbGl0ZXJhbHMKKyAgICAgICAgeCwgeSwgeiA9IDEuNSwgImEiLCBbXQorCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKCgpKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCgoMSwpKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCgoMSwgMikpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKCgxLCAyLCAiYSIpKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCgoMSwgMiwgKE5vbmUsIFRydWUsIEZhbHNlLCAoKSksIGludCkpCisgICAgICAgIHNlbGYuX25vdF90cmFja2VkKChvYmplY3QoKSwpKQorICAgICAgICBzZWxmLl9ub3RfdHJhY2tlZCgoKDEsIHgpLCB5LCAoMiwgMykpKQorCisgICAgICAgICMgVHVwbGVzIHdpdGggbXV0YWJsZSBlbGVtZW50cyBhcmUgYWx3YXlzIHRyYWNrZWQsIGV2ZW4gaWYgdGhvc2UKKyAgICAgICAgIyBlbGVtZW50cyBhcmUgbm90IHRyYWNrZWQgcmlnaHQgbm93LgorICAgICAgICBzZWxmLl90cmFja2VkKChbXSwpKQorICAgICAgICBzZWxmLl90cmFja2VkKChbMV0sKSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCgoe30sKSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCgoc2V0KCksKSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCgoeCwgeSwgeikpCisKKyAgICBkZWYgY2hlY2tfdHJhY2tfZHluYW1pYyhzZWxmLCB0cCwgYWx3YXlzX3RyYWNrKToKKyAgICAgICAgeCwgeSwgeiA9IDEuNSwgImEiLCBbXQorCisgICAgICAgIGNoZWNrID0gc2VsZi5fdHJhY2tlZCBpZiBhbHdheXNfdHJhY2sgZWxzZSBzZWxmLl9ub3RfdHJhY2tlZAorICAgICAgICBjaGVjayh0cCgpKQorICAgICAgICBjaGVjayh0cChbXSkpCisgICAgICAgIGNoZWNrKHRwKHNldCgpKSkKKyAgICAgICAgY2hlY2sodHAoWzEsIHgsIHldKSkKKyAgICAgICAgY2hlY2sodHAob2JqIGZvciBvYmogaW4gWzEsIHgsIHldKSkKKyAgICAgICAgY2hlY2sodHAoc2V0KFsxLCB4LCB5XSkpKQorICAgICAgICBjaGVjayh0cCh0dXBsZShbb2JqXSkgZm9yIG9iaiBpbiBbMSwgeCwgeV0pKQorICAgICAgICBjaGVjayh0dXBsZSh0cChbb2JqXSkgZm9yIG9iaiBpbiBbMSwgeCwgeV0pKQorCisgICAgICAgIHNlbGYuX3RyYWNrZWQodHAoW3pdKSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCh0cChbW3gsIHldXSkpCisgICAgICAgIHNlbGYuX3RyYWNrZWQodHAoW3t4OiB5fV0pKQorICAgICAgICBzZWxmLl90cmFja2VkKHRwKG9iaiBmb3Igb2JqIGluIFt4LCB5LCB6XSkpCisgICAgICAgIHNlbGYuX3RyYWNrZWQodHAodHVwbGUoW29ial0pIGZvciBvYmogaW4gW3gsIHksIHpdKSkKKyAgICAgICAgc2VsZi5fdHJhY2tlZCh0dXBsZSh0cChbb2JqXSkgZm9yIG9iaiBpbiBbeCwgeSwgel0pKQorCisgICAgQHRlc3Rfc3VwcG9ydC5jcHl0aG9uX29ubHkKKyAgICBkZWYgdGVzdF90cmFja19keW5hbWljKHNlbGYpOgorICAgICAgICAjIFRlc3QgR0Mtb3B0aW1pemF0aW9uIG9mIGR5bmFtaWNhbGx5IGNvbnN0cnVjdGVkIHR1cGxlcy4KKyAgICAgICAgc2VsZi5jaGVja190cmFja19keW5hbWljKHR1cGxlLCBGYWxzZSkKKworICAgIEB0ZXN0X3N1cHBvcnQuY3B5dGhvbl9vbmx5CisgICAgZGVmIHRlc3RfdHJhY2tfc3VidHlwZXMoc2VsZik6CisgICAgICAgICMgVHVwbGUgc3VidHlwZXMgbXVzdCBhbHdheXMgYmUgdHJhY2tlZAorICAgICAgICBjbGFzcyBNeVR1cGxlKHR1cGxlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5jaGVja190cmFja19keW5hbWljKE15VHVwbGUsIFRydWUpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2J1Zzc0NjYoc2VsZik6CisgICAgICAgICMgVHJ5aW5nIHRvIHVudHJhY2sgYW4gdW5maW5pc2hlZCB0dXBsZSBjb3VsZCBjcmFzaCBQeXRob24KKyAgICAgICAgc2VsZi5fbm90X3RyYWNrZWQodHVwbGUoZ2MuY29sbGVjdCgpIGZvciBpIGluIHJhbmdlKDEwMSkpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUdXBsZVRlc3QpCisKK2lmIF9fbmFtZV9fPT0iX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dXBsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dXBsZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMjIyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R1cGxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dXBsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90dXBsZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMjIyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3R1cGxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZWNoZWNrcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2YwMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZWNoZWNrcy5weQpAQCAtMCwwICsxLDkzIEBACisiIiJVbml0IHRlc3RzIGZvciBfX2luc3RhbmNlY2hlY2tfXyBhbmQgX19zdWJjbGFzc2NoZWNrX18uIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworCitjbGFzcyBBQkModHlwZSk6CisKKyAgICBkZWYgX19pbnN0YW5jZWNoZWNrX18oY2xzLCBpbnN0KToKKyAgICAgICAgIiIiSW1wbGVtZW50IGlzaW5zdGFuY2UoaW5zdCwgY2xzKS4iIiIKKyAgICAgICAgcmV0dXJuIGFueShjbHMuX19zdWJjbGFzc2NoZWNrX18oYykKKyAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBzZXQoW3R5cGUoaW5zdCksIGluc3QuX19jbGFzc19fXSkpCisKKyAgICBkZWYgX19zdWJjbGFzc2NoZWNrX18oY2xzLCBzdWIpOgorICAgICAgICAiIiJJbXBsZW1lbnQgaXNzdWJjbGFzcyhzdWIsIGNscykuIiIiCisgICAgICAgIGNhbmRpZGF0ZXMgPSBjbHMuX19kaWN0X18uZ2V0KCJfX3N1YmNsYXNzX18iLCBzZXQoKSkgfCBzZXQoW2Nsc10pCisgICAgICAgIHJldHVybiBhbnkoYyBpbiBjYW5kaWRhdGVzIGZvciBjIGluIHN1Yi5tcm8oKSkKKworCitjbGFzcyBJbnRlZ2VyOgorCisgICAgX19tZXRhY2xhc3NfXyA9IEFCQworCisgICAgX19zdWJjbGFzc19fID0gc2V0KFtpbnRdKQorCisKK2NsYXNzIFN1YkludChJbnRlZ2VyKToKKworICAgIHBhc3MKKworCitjbGFzcyBUeXBlQ2hlY2tzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdElzU3ViY2xhc3NJbnRlcm5hbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChJbnRlZ2VyLl9fc3ViY2xhc3NjaGVja19fKGludCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSW50ZWdlci5fX3N1YmNsYXNzY2hlY2tfXyhmbG9hdCksIEZhbHNlKQorCisgICAgZGVmIHRlc3RJc1N1YmNsYXNzQnVpbHRpbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKGludCwgSW50ZWdlciksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhpbnQsIChJbnRlZ2VyLCkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoZmxvYXQsIEludGVnZXIpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKGZsb2F0LCAoSW50ZWdlciwpKSwgRmFsc2UpCisKKyAgICBkZWYgdGVzdElzSW5zdGFuY2VCdWlsdGluKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoNDIsIEludGVnZXIpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoNDIsIChJbnRlZ2VyLCkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoMy4xNCwgSW50ZWdlciksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoMy4xNCwgKEludGVnZXIsKSksIEZhbHNlKQorCisgICAgZGVmIHRlc3RJc0luc3RhbmNlQWN0dWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoSW50ZWdlcigpLCBJbnRlZ2VyKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc2luc3RhbmNlKEludGVnZXIoKSwgKEludGVnZXIsKSksIFRydWUpCisKKyAgICBkZWYgdGVzdElzU3ViY2xhc3NBY3R1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhJbnRlZ2VyLCBJbnRlZ2VyKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKEludGVnZXIsIChJbnRlZ2VyLCkpLCBUcnVlKQorCisgICAgZGVmIHRlc3RTdWJjbGFzc0JlaGF2aW9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoU3ViSW50LCBJbnRlZ2VyKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKFN1YkludCwgKEludGVnZXIsKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhTdWJJbnQsIFN1YkludCksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhTdWJJbnQsIChTdWJJbnQsKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNzdWJjbGFzcyhJbnRlZ2VyLCBTdWJJbnQpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKEludGVnZXIsIChTdWJJbnQsKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzc3ViY2xhc3MoaW50LCBTdWJJbnQpLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc3N1YmNsYXNzKGludCwgKFN1YkludCwpKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZShTdWJJbnQoKSwgSW50ZWdlciksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZShTdWJJbnQoKSwgKEludGVnZXIsKSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNpbnN0YW5jZShTdWJJbnQoKSwgU3ViSW50KSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpc2luc3RhbmNlKFN1YkludCgpLCAoU3ViSW50LCkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoNDIsIFN1YkludCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlzaW5zdGFuY2UoNDIsIChTdWJJbnQsKSksIEZhbHNlKQorCisgICAgZGVmIHRlc3Rfb2xkc3R5bGUoc2VsZik6CisgICAgICAgICMgVGhlc2Ugc2hvdWxkIGp1c3QgYmUgaWdub3JlZC4KKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2luc3RhbmNlY2hlY2tfXyhzZWxmLCBpbnN0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZGVmIF9fc3ViY2xhc3NjaGVja19fKHNlbGYsIGNscyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgY2xhc3MgU3ViKFgpOiBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSgzLCBYKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoWCgpLCBYKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoU3ViLCBYKSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUeXBlQ2hlY2tzVGVzdCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZWNoZWNrcy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQwODg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZWNoZWNrcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZWNoZWNrcy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlY2hlY2tzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQwODg5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZWNoZWNrcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGY2ZDJmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZXMucHkKQEAgLTAsMCArMSw3NTYgQEAKKyMgUHl0aG9uIHRlc3Qgc2V0IC0tIHBhcnQgNiwgYnVpbHQtaW4gdHlwZXMKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBoYXZlX3VuaWNvZGUsIHJ1bl93aXRoX2xvY2FsZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfcHkza193YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgbG9jYWxlCisKK2NsYXNzIFR5cGVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHJ1dGhfdmFsdWVzKHNlbGYpOgorICAgICAgICBpZiBOb25lOiBzZWxmLmZhaWwoJ05vbmUgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgMDogc2VsZi5mYWlsKCcwIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIDBMOiBzZWxmLmZhaWwoJzBMIGlzIHRydWUgaW5zdGVhZCBvZiBmYWxzZScpCisgICAgICAgIGlmIDAuMDogc2VsZi5mYWlsKCcwLjAgaXMgdHJ1ZSBpbnN0ZWFkIG9mIGZhbHNlJykKKyAgICAgICAgaWYgJyc6IHNlbGYuZmFpbCgnXCdcJyBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiBub3QgMTogc2VsZi5mYWlsKCcxIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCAxTDogc2VsZi5mYWlsKCcxTCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgMS4wOiBzZWxmLmZhaWwoJzEuMCBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgJ3gnOiBzZWxmLmZhaWwoJ1wneFwnIGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGlmIG5vdCB7J3gnOiAxfTogc2VsZi5mYWlsKCd7XCd4XCc6IDF9IGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisgICAgICAgIGRlZiBmKCk6IHBhc3MKKyAgICAgICAgY2xhc3MgQzogcGFzcworICAgICAgICB4ID0gQygpCisgICAgICAgIGlmIG5vdCBmOiBzZWxmLmZhaWwoJ2YgaXMgZmFsc2UgaW5zdGVhZCBvZiB0cnVlJykKKyAgICAgICAgaWYgbm90IEM6IHNlbGYuZmFpbCgnQyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3Qgc3lzOiBzZWxmLmZhaWwoJ3N5cyBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgeDogc2VsZi5mYWlsKCd4IGlzIGZhbHNlIGluc3RlYWQgb2YgdHJ1ZScpCisKKyAgICBkZWYgdGVzdF9ib29sZWFuX29wcyhzZWxmKToKKyAgICAgICAgaWYgMCBvciAwOiBzZWxmLmZhaWwoJzAgb3IgMCBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorICAgICAgICBpZiAxIGFuZCAxOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnMSBhbmQgMSBpcyBmYWxzZSBpbnN0ZWFkIG9mIHRydWUnKQorICAgICAgICBpZiBub3QgMTogc2VsZi5mYWlsKCdub3QgMSBpcyB0cnVlIGluc3RlYWQgb2YgZmFsc2UnKQorCisgICAgZGVmIHRlc3RfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGlmIDAgPCAxIDw9IDEgPT0gMSA+PSAxID4gMCAhPSAxOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50IGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmIDBMIDwgMUwgPD0gMUwgPT0gMUwgPj0gMUwgPiAwTCAhPSAxTDogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcgaW50IGNvbXBhcmlzb25zIGZhaWxlZCcpCisgICAgICAgIGlmIDAuMCA8IDEuMCA8PSAxLjAgPT0gMS4wID49IDEuMCA+IDAuMCAhPSAxLjA6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdmbG9hdCBjb21wYXJpc29ucyBmYWlsZWQnKQorICAgICAgICBpZiAnJyA8ICdhJyA8PSAnYScgPT0gJ2EnIDwgJ2FiYycgPCAnYWJkJyA8ICdiJzogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ3N0cmluZyBjb21wYXJpc29ucyBmYWlsZWQnKQorICAgICAgICBpZiBOb25lIGlzIE5vbmU6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpZGVudGl0eSB0ZXN0IGZhaWxlZCcpCisKKyAgICBkZWYgdGVzdF9mbG9hdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgJzVcMCcpCisKKyAgICBkZWYgdGVzdF96ZXJvX2RpdmlzaW9uKHNlbGYpOgorICAgICAgICB0cnk6IDUuMCAvIDAuMAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1LjAgLyAwLjAgZGlkbid0IHJhaXNlIFplcm9EaXZpc2lvbkVycm9yIikKKworICAgICAgICB0cnk6IDUuMCAvLyAwLjAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNS4wIC8vIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQorCisgICAgICAgIHRyeTogNS4wICUgMC4wCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUuMCAlIDAuMCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQorCisgICAgICAgIHRyeTogNSAvIDBMCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoIjUgLyAwTCBkaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQorCisgICAgICAgIHRyeTogNSAvLyAwTAorICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCI1IC8vIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCisKKyAgICAgICAgdHJ5OiA1ICUgMEwKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiNSAlIDBMIGRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCisKKyAgICBkZWYgdGVzdF9udW1lcmljX3R5cGVzKHNlbGYpOgorICAgICAgICBpZiAwICE9IDBMIG9yIDAgIT0gMC4wIG9yIDBMICE9IDAuMDogc2VsZi5mYWlsKCdtaXhlZCBjb21wYXJpc29ucycpCisgICAgICAgIGlmIDEgIT0gMUwgb3IgMSAhPSAxLjAgb3IgMUwgIT0gMS4wOiBzZWxmLmZhaWwoJ21peGVkIGNvbXBhcmlzb25zJykKKyAgICAgICAgaWYgLTEgIT0gLTFMIG9yIC0xICE9IC0xLjAgb3IgLTFMICE9IC0xLjA6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ludC9sb25nL2Zsb2F0IHZhbHVlIG5vdCBlcXVhbCcpCisgICAgICAgICMgY2FsbGluZyBidWlsdC1pbiB0eXBlcyB3aXRob3V0IGFyZ3VtZW50IG11c3QgcmV0dXJuIDAKKyAgICAgICAgaWYgaW50KCkgIT0gMDogc2VsZi5mYWlsKCdpbnQoKSBkb2VzIG5vdCByZXR1cm4gMCcpCisgICAgICAgIGlmIGxvbmcoKSAhPSAwTDogc2VsZi5mYWlsKCdsb25nKCkgZG9lcyBub3QgcmV0dXJuIDBMJykKKyAgICAgICAgaWYgZmxvYXQoKSAhPSAwLjA6IHNlbGYuZmFpbCgnZmxvYXQoKSBkb2VzIG5vdCByZXR1cm4gMC4wJykKKyAgICAgICAgaWYgaW50KDEuOSkgPT0gMSA9PSBpbnQoMS4xKSBhbmQgaW50KC0xLjEpID09IC0xID09IGludCgtMS45KTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2ludCgpIGRvZXMgbm90IHJvdW5kIHByb3Blcmx5JykKKyAgICAgICAgaWYgbG9uZygxLjkpID09IDFMID09IGxvbmcoMS4xKSBhbmQgbG9uZygtMS4xKSA9PSAtMUwgPT0gbG9uZygtMS45KTogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcoKSBkb2VzIG5vdCByb3VuZCBwcm9wZXJseScpCisgICAgICAgIGlmIGZsb2F0KDEpID09IDEuMCBhbmQgZmxvYXQoLTEpID09IC0xLjAgYW5kIGZsb2F0KDApID09IDAuMDogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2Zsb2F0KCkgZG9lcyBub3Qgd29yayBwcm9wZXJseScpCisKKyAgICBkZWYgdGVzdF9mbG9hdF90b19zdHJpbmcoc2VsZik6CisgICAgICAgIGRlZiB0ZXN0KGYsIHJlc3VsdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuX19mb3JtYXRfXygnZScpLCByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclZScgJSBmLCByZXN1bHQpCisKKyAgICAgICAgIyB0ZXN0IGFsbCAyIGRpZ2l0IGV4cG9uZW50cywgYm90aCB3aXRoIF9fZm9ybWF0X18gYW5kIHdpdGgKKyAgICAgICAgIyAgJyUnIGZvcm1hdHRpbmcKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTk5LCAxMDApOgorICAgICAgICAgICAgdGVzdChmbG9hdCgnMS41ZScrc3RyKGkpKSwgJzEuNTAwMDAwZXswOiswM2R9Jy5mb3JtYXQoaSkpCisKKyAgICAgICAgIyB0ZXN0IHNvbWUgMyBkaWdpdCBleHBvbmVudHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLjVlMTAwLl9fZm9ybWF0X18oJ2UnKSwgJzEuNTAwMDAwZSsxMDAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclZScgJSAxLjVlMTAwLCAnMS41MDAwMDBlKzEwMCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLjVlMTAxLl9fZm9ybWF0X18oJ2UnKSwgJzEuNTAwMDAwZSsxMDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclZScgJSAxLjVlMTAxLCAnMS41MDAwMDBlKzEwMScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLjVlLTEwMC5fX2Zvcm1hdF9fKCdlJyksICcxLjUwMDAwMGUtMTAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJWUnICUgMS41ZS0xMDAsICcxLjUwMDAwMGUtMTAwJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEuNWUtMTAxLl9fZm9ybWF0X18oJ2UnKSwgJzEuNTAwMDAwZS0xMDEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclZScgJSAxLjVlLTEwMSwgJzEuNTAwMDAwZS0xMDEnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyVnJyAlIDEuMCwgJzEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclI2cnICUgMS4wLCAnMS4wMDAwMCcpCisKKyAgICBkZWYgdGVzdF9ub3JtYWxfaW50ZWdlcnMoc2VsZik6CisgICAgICAgICMgRW5zdXJlIHRoZSBmaXJzdCAyNTYgaW50ZWdlcnMgYXJlIHNoYXJlZAorICAgICAgICBhID0gMjU2CisgICAgICAgIGIgPSAxMjgqMgorICAgICAgICBpZiBhIGlzIG5vdCBiOiBzZWxmLmZhaWwoJzI1NiBpcyBub3Qgc2hhcmVkJykKKyAgICAgICAgaWYgMTIgKyAyNCAhPSAzNjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICBpZiAxMiArICgtMjQpICE9IC0xMjogc2VsZi5mYWlsKCdpbnQgb3AnKQorICAgICAgICBpZiAoLTEyKSArIDI0ICE9IDEyOiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmICgtMTIpICsgKC0yNCkgIT0gLTM2OiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmIG5vdCAxMiA8IDI0OiBzZWxmLmZhaWwoJ2ludCBvcCcpCisgICAgICAgIGlmIG5vdCAtMjQgPCAtMTI6IHNlbGYuZmFpbCgnaW50IG9wJykKKyAgICAgICAgIyBUZXN0IGZvciBhIHBhcnRpY3VsYXIgYnVnIGluIGludGVnZXIgbXVsdGlwbHkKKyAgICAgICAgeHNpemUsIHlzaXplLCB6c2l6ZSA9IDIzOCwgMzU2LCA0CisgICAgICAgIGlmIG5vdCAoeHNpemUqeXNpemUqenNpemUgPT0genNpemUqeHNpemUqeXNpemUgPT0gMzM4OTEyKToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnaW50IG11bCBjb21tdXRhdGl2aXR5JykKKyAgICAgICAgIyBBbmQgYW5vdGhlci4KKyAgICAgICAgbSA9IC1zeXMubWF4aW50IC0gMQorICAgICAgICBmb3IgZGl2aXNvciBpbiAxLCAyLCA0LCA4LCAxNiwgMzI6CisgICAgICAgICAgICBqID0gbSAvLyBkaXZpc29yCisgICAgICAgICAgICBwcm9kID0gZGl2aXNvciAqIGoKKyAgICAgICAgICAgIGlmIHByb2QgIT0gbToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVyICogJXIgPT0gJXIgIT0gJXIiICUgKGRpdmlzb3IsIGosIHByb2QsIG0pKQorICAgICAgICAgICAgaWYgdHlwZShwcm9kKSBpcyBub3QgaW50OgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgdHlwZShwcm9kKSB0byBiZSBpbnQsIG5vdCAlciIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKHByb2QpKQorICAgICAgICAjIENoZWNrIGZvciBleHBlY3RlZCAqIG92ZXJmbG93IHRvIGxvbmcuCisgICAgICAgIGZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKKyAgICAgICAgICAgIGogPSBtIC8vIGRpdmlzb3IgLSAxCisgICAgICAgICAgICBwcm9kID0gZGl2aXNvciAqIGoKKyAgICAgICAgICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGxvbmc6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0eXBlKCVyKSB0byBiZSBsb25nLCBub3QgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2QsIHR5cGUocHJvZCkpKQorICAgICAgICAjIENoZWNrIGZvciBleHBlY3RlZCAqIG92ZXJmbG93IHRvIGxvbmcuCisgICAgICAgIG0gPSBzeXMubWF4aW50CisgICAgICAgIGZvciBkaXZpc29yIGluIDEsIDIsIDQsIDgsIDE2LCAzMjoKKyAgICAgICAgICAgIGogPSBtIC8vIGRpdmlzb3IgKyAxCisgICAgICAgICAgICBwcm9kID0gZGl2aXNvciAqIGoKKyAgICAgICAgICAgIGlmIHR5cGUocHJvZCkgaXMgbm90IGxvbmc6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCB0eXBlKCVyKSB0byBiZSBsb25nLCBub3QgJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2QsIHR5cGUocHJvZCkpKQorCisgICAgZGVmIHRlc3RfbG9uZ19pbnRlZ2VycyhzZWxmKToKKyAgICAgICAgaWYgMTJMICsgMjRMICE9IDM2TDogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgMTJMICsgKC0yNEwpICE9IC0xMkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmICgtMTJMKSArIDI0TCAhPSAxMkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmICgtMTJMKSArICgtMjRMKSAhPSAtMzZMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiBub3QgMTJMIDwgMjRMOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICBpZiBub3QgLTI0TCA8IC0xMkw6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHggPSBzeXMubWF4aW50CisgICAgICAgIGlmIGludChsb25nKHgpKSAhPSB4OiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICB0cnk6IHkgPSBpbnQobG9uZyh4KSsxTCkKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHksIGxvbmcpOiBzZWxmLmZhaWwoJ2xvbmcgb3AnKQorICAgICAgICB4ID0gLXgKKyAgICAgICAgaWYgaW50KGxvbmcoeCkpICE9IHg6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHggPSB4LTEKKyAgICAgICAgaWYgaW50KGxvbmcoeCkpICE9IHg6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisgICAgICAgIHRyeTogeSA9IGludChsb25nKHgpLTFMKQorICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjogc2VsZi5mYWlsKCdsb25nIG9wJykKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoeSwgbG9uZyk6IHNlbGYuZmFpbCgnbG9uZyBvcCcpCisKKyAgICAgICAgdHJ5OiA1IDw8IC01CisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgnaW50IG5lZ2F0aXZlIHNoaWZ0IDw8JykKKworICAgICAgICB0cnk6IDVMIDw8IC01TAorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2xvbmcgbmVnYXRpdmUgc2hpZnQgPDwnKQorCisgICAgICAgIHRyeTogNSA+PiAtNQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjogcGFzcworICAgICAgICBlbHNlOiBzZWxmLmZhaWwoJ2ludCBuZWdhdGl2ZSBzaGlmdCA+PicpCisKKyAgICAgICAgdHJ5OiA1TCA+PiAtNUwKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdsb25nIG5lZ2F0aXZlIHNoaWZ0ID4+JykKKworICAgIGRlZiB0ZXN0X2Zsb2F0cyhzZWxmKToKKyAgICAgICAgaWYgMTIuMCArIDI0LjAgIT0gMzYuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisgICAgICAgIGlmIDEyLjAgKyAoLTI0LjApICE9IC0xMi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgKC0xMi4wKSArIDI0LjAgIT0gMTIuMDogc2VsZi5mYWlsKCdmbG9hdCBvcCcpCisgICAgICAgIGlmICgtMTIuMCkgKyAoLTI0LjApICE9IC0zNi4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgbm90IDEyLjAgPCAyNC4wOiBzZWxmLmZhaWwoJ2Zsb2F0IG9wJykKKyAgICAgICAgaWYgbm90IC0yNC4wIDwgLTEyLjA6IHNlbGYuZmFpbCgnZmxvYXQgb3AnKQorCisgICAgZGVmIHRlc3Rfc3RyaW5ncyhzZWxmKToKKyAgICAgICAgaWYgbGVuKCcnKSAhPSAwOiBzZWxmLmZhaWwoJ2xlbihcJ1wnKScpCisgICAgICAgIGlmIGxlbignYScpICE9IDE6IHNlbGYuZmFpbCgnbGVuKFwnYVwnKScpCisgICAgICAgIGlmIGxlbignYWJjZGVmJykgIT0gNjogc2VsZi5mYWlsKCdsZW4oXCdhYmNkZWZcJyknKQorICAgICAgICBpZiAneHl6JyArICdhYmNkZScgIT0gJ3h5emFiY2RlJzogc2VsZi5mYWlsKCdzdHJpbmcgY29uY2F0ZW5hdGlvbicpCisgICAgICAgIGlmICd4eXonKjMgIT0gJ3h5enh5enh5eic6IHNlbGYuZmFpbCgnc3RyaW5nIHJlcGV0aXRpb24gKjMnKQorICAgICAgICBpZiAwKidhYmNkZScgIT0gJyc6IHNlbGYuZmFpbCgnc3RyaW5nIHJlcGV0aXRpb24gMConKQorICAgICAgICBpZiBtaW4oJ2FiYycpICE9ICdhJyBvciBtYXgoJ2FiYycpICE9ICdjJzogc2VsZi5mYWlsKCdtaW4vbWF4IHN0cmluZycpCisgICAgICAgIGlmICdhJyBpbiAnYWJjJyBhbmQgJ2InIGluICdhYmMnIGFuZCAnYycgaW4gJ2FiYycgYW5kICdkJyBub3QgaW4gJ2FiYyc6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCdpbi9ub3QgaW4gc3RyaW5nJykKKyAgICAgICAgeCA9ICd4JyoxMDMKKyAgICAgICAgaWYgJyVzIScleCAhPSB4KychJzogc2VsZi5mYWlsKCduYXN0eSBzdHJpbmcgZm9ybWF0dGluZyBidWcnKQorCisgICAgICAgICNleHRlbmRlZCBzbGljZXMgZm9yIHN0cmluZ3MKKyAgICAgICAgYSA9ICcwMTIzNDU2Nzg5JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjoyXSwgJzAyNDY4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzE6OjJdLCAnMTM1NzknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMV0sJzk4NzY1NDMyMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMl0sICc5NzUzMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszOjotMl0sICczMScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVstMTAwOjEwMDpdLCBhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTAwOi0xMDA6LTFdLCBhWzo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTEwMEw6MTAwTDoyTF0sICcwMjQ2OCcpCisKKyAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgYSA9IHVuaWNvZGUoJzAxMjM0NTY3ODknLCAnYXNjaWknKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6XSwgYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6OjJdLCB1bmljb2RlKCcwMjQ2OCcsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzE6OjJdLCB1bmljb2RlKCcxMzU3OScsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzo6LTFdLCB1bmljb2RlKCc5ODc2NTQzMjEwJywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjotMl0sIHVuaWNvZGUoJzk3NTMxJywgJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMzo6LTJdLCB1bmljb2RlKCczMScsICdhc2NpaScpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDA6MTAwOl0sIGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMTAwOi0xMDA6LTFdLCBhWzo6LTFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWy0xMDBMOjEwMEw6MkxdLCB1bmljb2RlKCcwMjQ2OCcsICdhc2NpaScpKQorCisKKyAgICBkZWYgdGVzdF90eXBlX2Z1bmN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHR5cGUsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHlwZSwgMSwgMiwgMywgNCkKKworICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmZlciwgJ2FzZGYnLCAtMSkKKyAgICAgICAgY21wKGJ1ZmZlcigiYWJjIiksIGJ1ZmZlcigiZGVmIikpICMgdXNlZCB0byByYWlzZSBhIHdhcm5pbmc6IHRwX2NvbXBhcmUgZGlkbid0IHJldHVybiAtMSwgMCwgb3IgMQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYnVmZmVyLCBOb25lKQorCisgICAgICAgIGEgPSBidWZmZXIoJ2FzZGYnKQorICAgICAgICBoYXNoKGEpCisgICAgICAgIGIgPSBhICogNQorICAgICAgICBpZiBhID09IGI6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2J1ZmZlcnMgc2hvdWxkIG5vdCBiZSBlcXVhbCcpCisgICAgICAgIGlmIHN0cihiKSAhPSAoJ2FzZGYnICogNSk6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3JlcGVhdGVkIGJ1ZmZlciBoYXMgd3JvbmcgY29udGVudCcpCisgICAgICAgIGlmIHN0cihhICogMCkgIT0gJyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3JlcGVhdGVkIGJ1ZmZlciB6ZXJvIHRpbWVzIGhhcyB3cm9uZyBjb250ZW50JykKKyAgICAgICAgaWYgc3RyKGEgKyBidWZmZXIoJ2RlZicpKSAhPSAnYXNkZmRlZic6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2NvbmNhdGVuYXRpb24gb2YgYnVmZmVycyB5aWVsZHMgd3JvbmcgY29udGVudCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYSkpICE9ICdhc2RmJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGJ1ZmZlcnMgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhLCAyKSkgIT0gJ2RmJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc3BlY2lmeWluZyBidWZmZXIgb2Zmc2V0IGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYSwgMCwgMikpICE9ICdhcyc6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3NwZWNpZnlpbmcgYnVmZmVyIHNpemUgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihhLCAxLCAyKSkgIT0gJ3NkJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnc3BlY2lmeWluZyBidWZmZXIgb2Zmc2V0IGFuZCBzaXplIGZhaWxlZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGJ1ZmZlciwgYnVmZmVyKCdhc2RmJywgMSksIC0xKQorICAgICAgICBpZiBzdHIoYnVmZmVyKGJ1ZmZlcignYXNkZicsIDAsIDIpLCAwKSkgIT0gJ2FzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcpCisgICAgICAgIGlmIHN0cihidWZmZXIoYnVmZmVyKCdhc2RmJywgMCwgMiksIDAsIDUwMDApKSAhPSAnYXMnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMCwgLTEpKSAhPSAnYXMnOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdjb21wb3NpbmcgbGVuZ3RoLXNwZWNpZmllZCBidWZmZXIgZmFpbGVkJykKKyAgICAgICAgaWYgc3RyKGJ1ZmZlcihidWZmZXIoJ2FzZGYnLCAwLCAyKSwgMSwgMikpICE9ICdzJzoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnY29tcG9zaW5nIGxlbmd0aC1zcGVjaWZpZWQgYnVmZmVyIGZhaWxlZCcpCisKKyAgICAgICAgdHJ5OiBhWzFdID0gJ2cnCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJidWZmZXIgYXNzaWdubWVudCBzaG91bGQgcmFpc2UgVHlwZUVycm9yIikKKworICAgICAgICB0cnk6IGFbMDoxXSA9ICdnJworICAgICAgICBleGNlcHQgVHlwZUVycm9yOiBwYXNzCisgICAgICAgIGVsc2U6IHNlbGYuZmFpbCgiYnVmZmVyIHNsaWNlIGFzc2lnbm1lbnQgc2hvdWxkIHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAgICAgIyBhcnJheS5hcnJheSgpIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGEgY2hhciBidWZmZXIsCisgICAgICAgICMgc29tZXRoaW5nIHdoaWNoIGludCgpIHVzZXMgZm9yIGNvbnZlcnNpb24uCisgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICB0cnk6IGludChidWZmZXIoYXJyYXkuYXJyYXkoJ2MnKSkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKKyAgICAgICAgZWxzZTogc2VsZi5mYWlsKCJjaGFyIGJ1ZmZlciAoYXQgQyBsZXZlbCkgbm90IHdvcmtpbmciKQorCisgICAgZGVmIHRlc3RfaW50X19mb3JtYXRfXyhzZWxmKToKKyAgICAgICAgZGVmIHRlc3QoaSwgZm9ybWF0X3NwZWMsIHJlc3VsdCk6CisgICAgICAgICAgICAjIGp1c3QgbWFrZSBzdXJlIEknbSBub3QgYWNjaWRlbnRhbGx5IGNoZWNraW5nIGxvbmdzCisgICAgICAgICAgICBhc3NlcnQgdHlwZShpKSA9PSBpbnQKKyAgICAgICAgICAgIGFzc2VydCB0eXBlKGZvcm1hdF9zcGVjKSA9PSBzdHIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKSwgcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLl9fZm9ybWF0X18odW5pY29kZShmb3JtYXRfc3BlYykpLCByZXN1bHQpCisKKyAgICAgICAgdGVzdCgxMjM0NTY3ODksICdkJywgJzEyMzQ1Njc4OScpCisgICAgICAgIHRlc3QoMTIzNDU2Nzg5LCAnZCcsICcxMjM0NTY3ODknKQorCisgICAgICAgIHRlc3QoMSwgJ2MnLCAnXDAxJykKKworICAgICAgICAjIHNpZ24gYW5kIGFsaWduaW5nIGFyZSBpbnRlcmRlcGVuZGVudAorICAgICAgICB0ZXN0KDEsICItIiwgJzEnKQorICAgICAgICB0ZXN0KC0xLCAiLSIsICctMScpCisgICAgICAgIHRlc3QoMSwgIi0zIiwgJyAgMScpCisgICAgICAgIHRlc3QoLTEsICItMyIsICcgLTEnKQorICAgICAgICB0ZXN0KDEsICIrMyIsICcgKzEnKQorICAgICAgICB0ZXN0KC0xLCAiKzMiLCAnIC0xJykKKyAgICAgICAgdGVzdCgxLCAiIDMiLCAnICAxJykKKyAgICAgICAgdGVzdCgtMSwgIiAzIiwgJyAtMScpCisgICAgICAgIHRlc3QoMSwgIiAiLCAnIDEnKQorICAgICAgICB0ZXN0KC0xLCAiICIsICctMScpCisKKyAgICAgICAgIyBoZXgKKyAgICAgICAgdGVzdCgzLCAieCIsICIzIikKKyAgICAgICAgdGVzdCgzLCAiWCIsICIzIikKKyAgICAgICAgdGVzdCgxMjM0LCAieCIsICI0ZDIiKQorICAgICAgICB0ZXN0KC0xMjM0LCAieCIsICItNGQyIikKKyAgICAgICAgdGVzdCgxMjM0LCAiOHgiLCAiICAgICA0ZDIiKQorICAgICAgICB0ZXN0KC0xMjM0LCAiOHgiLCAiICAgIC00ZDIiKQorICAgICAgICB0ZXN0KDEyMzQsICJ4IiwgIjRkMiIpCisgICAgICAgIHRlc3QoLTEyMzQsICJ4IiwgIi00ZDIiKQorICAgICAgICB0ZXN0KC0zLCAieCIsICItMyIpCisgICAgICAgIHRlc3QoLTMsICJYIiwgIi0zIikKKyAgICAgICAgdGVzdChpbnQoJ2JlJywgMTYpLCAieCIsICJiZSIpCisgICAgICAgIHRlc3QoaW50KCdiZScsIDE2KSwgIlgiLCAiQkUiKQorICAgICAgICB0ZXN0KC1pbnQoJ2JlJywgMTYpLCAieCIsICItYmUiKQorICAgICAgICB0ZXN0KC1pbnQoJ2JlJywgMTYpLCAiWCIsICItQkUiKQorCisgICAgICAgICMgb2N0YWwKKyAgICAgICAgdGVzdCgzLCAibyIsICIzIikKKyAgICAgICAgdGVzdCgtMywgIm8iLCAiLTMiKQorICAgICAgICB0ZXN0KDY1LCAibyIsICIxMDEiKQorICAgICAgICB0ZXN0KC02NSwgIm8iLCAiLTEwMSIpCisgICAgICAgIHRlc3QoMTIzNCwgIm8iLCAiMjMyMiIpCisgICAgICAgIHRlc3QoLTEyMzQsICJvIiwgIi0yMzIyIikKKyAgICAgICAgdGVzdCgxMjM0LCAiLW8iLCAiMjMyMiIpCisgICAgICAgIHRlc3QoLTEyMzQsICItbyIsICItMjMyMiIpCisgICAgICAgIHRlc3QoMTIzNCwgIiBvIiwgIiAyMzIyIikKKyAgICAgICAgdGVzdCgtMTIzNCwgIiBvIiwgIi0yMzIyIikKKyAgICAgICAgdGVzdCgxMjM0LCAiK28iLCAiKzIzMjIiKQorICAgICAgICB0ZXN0KC0xMjM0LCAiK28iLCAiLTIzMjIiKQorCisgICAgICAgICMgYmluYXJ5CisgICAgICAgIHRlc3QoMywgImIiLCAiMTEiKQorICAgICAgICB0ZXN0KC0zLCAiYiIsICItMTEiKQorICAgICAgICB0ZXN0KDEyMzQsICJiIiwgIjEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgtMTIzNCwgImIiLCAiLTEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgxMjM0LCAiLWIiLCAiMTAwMTEwMTAwMTAiKQorICAgICAgICB0ZXN0KC0xMjM0LCAiLWIiLCAiLTEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgxMjM0LCAiIGIiLCAiIDEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgtMTIzNCwgIiBiIiwgIi0xMDAxMTAxMDAxMCIpCisgICAgICAgIHRlc3QoMTIzNCwgIitiIiwgIisxMDAxMTAxMDAxMCIpCisgICAgICAgIHRlc3QoLTEyMzQsICIrYiIsICItMTAwMTEwMTAwMTAiKQorCisgICAgICAgICMgYWx0ZXJuYXRlICgjKSBmb3JtYXR0aW5nCisgICAgICAgIHRlc3QoMCwgIiNiIiwgJzBiMCcpCisgICAgICAgIHRlc3QoMCwgIi0jYiIsICcwYjAnKQorICAgICAgICB0ZXN0KDEsICItI2IiLCAnMGIxJykKKyAgICAgICAgdGVzdCgtMSwgIi0jYiIsICctMGIxJykKKyAgICAgICAgdGVzdCgtMSwgIi0jNWIiLCAnIC0wYjEnKQorICAgICAgICB0ZXN0KDEsICIrIzViIiwgJyArMGIxJykKKyAgICAgICAgdGVzdCgxMDAsICIrI2IiLCAnKzBiMTEwMDEwMCcpCisgICAgICAgIHRlc3QoMTAwLCAiIzAxMmIiLCAnMGIwMDAxMTAwMTAwJykKKyAgICAgICAgdGVzdCgtMTAwLCAiIzAxMmIiLCAnLTBiMDAxMTAwMTAwJykKKworICAgICAgICB0ZXN0KDAsICIjbyIsICcwbzAnKQorICAgICAgICB0ZXN0KDAsICItI28iLCAnMG8wJykKKyAgICAgICAgdGVzdCgxLCAiLSNvIiwgJzBvMScpCisgICAgICAgIHRlc3QoLTEsICItI28iLCAnLTBvMScpCisgICAgICAgIHRlc3QoLTEsICItIzVvIiwgJyAtMG8xJykKKyAgICAgICAgdGVzdCgxLCAiKyM1byIsICcgKzBvMScpCisgICAgICAgIHRlc3QoMTAwLCAiKyNvIiwgJyswbzE0NCcpCisgICAgICAgIHRlc3QoMTAwLCAiIzAxMm8iLCAnMG8wMDAwMDAwMTQ0JykKKyAgICAgICAgdGVzdCgtMTAwLCAiIzAxMm8iLCAnLTBvMDAwMDAwMTQ0JykKKworICAgICAgICB0ZXN0KDAsICIjeCIsICcweDAnKQorICAgICAgICB0ZXN0KDAsICItI3giLCAnMHgwJykKKyAgICAgICAgdGVzdCgxLCAiLSN4IiwgJzB4MScpCisgICAgICAgIHRlc3QoLTEsICItI3giLCAnLTB4MScpCisgICAgICAgIHRlc3QoLTEsICItIzV4IiwgJyAtMHgxJykKKyAgICAgICAgdGVzdCgxLCAiKyM1eCIsICcgKzB4MScpCisgICAgICAgIHRlc3QoMTAwLCAiKyN4IiwgJysweDY0JykKKyAgICAgICAgdGVzdCgxMDAsICIjMDEyeCIsICcweDAwMDAwMDAwNjQnKQorICAgICAgICB0ZXN0KC0xMDAsICIjMDEyeCIsICctMHgwMDAwMDAwNjQnKQorICAgICAgICB0ZXN0KDEyMzQ1NiwgIiMwMTJ4IiwgJzB4MDAwMDAxZTI0MCcpCisgICAgICAgIHRlc3QoLTEyMzQ1NiwgIiMwMTJ4IiwgJy0weDAwMDAxZTI0MCcpCisKKyAgICAgICAgdGVzdCgwLCAiI1giLCAnMFgwJykKKyAgICAgICAgdGVzdCgwLCAiLSNYIiwgJzBYMCcpCisgICAgICAgIHRlc3QoMSwgIi0jWCIsICcwWDEnKQorICAgICAgICB0ZXN0KC0xLCAiLSNYIiwgJy0wWDEnKQorICAgICAgICB0ZXN0KC0xLCAiLSM1WCIsICcgLTBYMScpCisgICAgICAgIHRlc3QoMSwgIisjNVgiLCAnICswWDEnKQorICAgICAgICB0ZXN0KDEwMCwgIisjWCIsICcrMFg2NCcpCisgICAgICAgIHRlc3QoMTAwLCAiIzAxMlgiLCAnMFgwMDAwMDAwMDY0JykKKyAgICAgICAgdGVzdCgtMTAwLCAiIzAxMlgiLCAnLTBYMDAwMDAwMDY0JykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIjMDEyWCIsICcwWDAwMDAwMUUyNDAnKQorICAgICAgICB0ZXN0KC0xMjM0NTYsICIjMDEyWCIsICctMFgwMDAwMUUyNDAnKQorCisgICAgICAgICMgaXNzdWUgNTc4MiwgY29tbWFzIHdpdGggbm8gc3BlY2lmaWVyIHR5cGUKKyAgICAgICAgdGVzdCgxMjM0LCAnMDEwLCcsICcwMCwwMDEsMjM0JykKKworICAgICAgICAjIG1ha2Ugc3VyZSB0aGVzZSBhcmUgZXJyb3JzCisKKyAgICAgICAgIyBwcmVjaXNpb24gZGlzYWxsb3dlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAzIC5fX2Zvcm1hdF9fLCAiMS4zIikKKyAgICAgICAgIyBzaWduIG5vdCBhbGxvd2VkIHdpdGggJ2MnCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIDMgLl9fZm9ybWF0X18sICIrYyIpCisgICAgICAgICMgZm9ybWF0IHNwZWMgbXVzdCBiZSBzdHJpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAzIC5fX2Zvcm1hdF9fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIDMgLl9fZm9ybWF0X18sIDApCisKKyAgICAgICAgIyBjYW4ndCBoYXZlICcsJyB3aXRoICdjJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAzIC5fX2Zvcm1hdF9fLCAiLGMiKQorCisgICAgICAgICMgZW5zdXJlIHRoYXQgb25seSBpbnQgYW5kIGZsb2F0IHR5cGUgc3BlY2lmaWVycyB3b3JrCisgICAgICAgIGZvciBmb3JtYXRfc3BlYyBpbiAoW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ2EnKSwgb3JkKCd6JykrMSldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnQScpLCBvcmQoJ1onKSsxKV0pOgorICAgICAgICAgICAgaWYgbm90IGZvcm1hdF9zcGVjIGluICdiY2RveFhlRWZGZ0duJSc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgMCAuX19mb3JtYXRfXywgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgMSAuX19mb3JtYXRfXywgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgKC0xKSAuX19mb3JtYXRfXywgZm9ybWF0X3NwZWMpCisKKyAgICAgICAgIyBlbnN1cmUgdGhhdCBmbG9hdCB0eXBlIHNwZWNpZmllcnMgd29yazsgZm9ybWF0IGNvbnZlcnRzCisgICAgICAgICMgIHRoZSBpbnQgdG8gYSBmbG9hdAorICAgICAgICBmb3IgZm9ybWF0X3NwZWMgaW4gJ2VFZkZnRyUnOgorICAgICAgICAgICAgZm9yIHZhbHVlIGluIFswLCAxLCAtMSwgMTAwLCAtMTAwLCAxMjM0NTY3ODkwLCAtMTIzNDU2Nzg5MF06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KHZhbHVlKS5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKSkKKworICAgICAgICAjIElzc3VlIDY5MDIKKyAgICAgICAgdGVzdCgxMjM0NTYsICIwPDIwIiwgJzEyMzQ1NjAwMDAwMDAwMDAwMDAwJykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIxPDIwIiwgJzEyMzQ1NjExMTExMTExMTExMTExJykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIqPDIwIiwgJzEyMzQ1NioqKioqKioqKioqKioqJykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIwPjIwIiwgJzAwMDAwMDAwMDAwMDAwMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIxPjIwIiwgJzExMTExMTExMTExMTExMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIqPjIwIiwgJyoqKioqKioqKioqKioqMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIwPTIwIiwgJzAwMDAwMDAwMDAwMDAwMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIxPTIwIiwgJzExMTExMTExMTExMTExMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTYsICIqPTIwIiwgJyoqKioqKioqKioqKioqMTIzNDU2JykKKworICAgIGRlZiB0ZXN0X2xvbmdfX2Zvcm1hdF9fKHNlbGYpOgorICAgICAgICBkZWYgdGVzdChpLCBmb3JtYXRfc3BlYywgcmVzdWx0KToKKyAgICAgICAgICAgICMgbWFrZSBzdXJlIHdlJ3JlIG5vdCBhY2NpZGVudGFsbHkgY2hlY2tpbmcgaW50cworICAgICAgICAgICAgYXNzZXJ0IHR5cGUoaSkgPT0gbG9uZworICAgICAgICAgICAgYXNzZXJ0IHR5cGUoZm9ybWF0X3NwZWMpID09IHN0cgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpLCByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuX19mb3JtYXRfXyh1bmljb2RlKGZvcm1hdF9zcGVjKSksIHJlc3VsdCkKKworICAgICAgICB0ZXN0KDEwKioxMDAsICdkJywgJzEnICsgJzAnICogMTAwKQorICAgICAgICB0ZXN0KDEwKioxMDArMTAwLCAnZCcsICcxJyArICcwJyAqIDk3ICsgJzEwMCcpCisKKyAgICAgICAgdGVzdCgxMjM0NTY3ODlMLCAnZCcsICcxMjM0NTY3ODknKQorICAgICAgICB0ZXN0KDEyMzQ1Njc4OUwsICdkJywgJzEyMzQ1Njc4OScpCisKKyAgICAgICAgIyBzaWduIGFuZCBhbGlnbmluZyBhcmUgaW50ZXJkZXBlbmRlbnQKKyAgICAgICAgdGVzdCgxTCwgIi0iLCAnMScpCisgICAgICAgIHRlc3QoLTFMLCAiLSIsICctMScpCisgICAgICAgIHRlc3QoMUwsICItMyIsICcgIDEnKQorICAgICAgICB0ZXN0KC0xTCwgIi0zIiwgJyAtMScpCisgICAgICAgIHRlc3QoMUwsICIrMyIsICcgKzEnKQorICAgICAgICB0ZXN0KC0xTCwgIiszIiwgJyAtMScpCisgICAgICAgIHRlc3QoMUwsICIgMyIsICcgIDEnKQorICAgICAgICB0ZXN0KC0xTCwgIiAzIiwgJyAtMScpCisgICAgICAgIHRlc3QoMUwsICIgIiwgJyAxJykKKyAgICAgICAgdGVzdCgtMUwsICIgIiwgJy0xJykKKworICAgICAgICB0ZXN0KDFMLCAnYycsICdcMDEnKQorCisgICAgICAgICMgaGV4CisgICAgICAgIHRlc3QoM0wsICJ4IiwgIjMiKQorICAgICAgICB0ZXN0KDNMLCAiWCIsICIzIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIngiLCAiNGQyIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICJ4IiwgIi00ZDIiKQorICAgICAgICB0ZXN0KDEyMzRMLCAiOHgiLCAiICAgICA0ZDIiKQorICAgICAgICB0ZXN0KC0xMjM0TCwgIjh4IiwgIiAgICAtNGQyIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIngiLCAiNGQyIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICJ4IiwgIi00ZDIiKQorICAgICAgICB0ZXN0KC0zTCwgIngiLCAiLTMiKQorICAgICAgICB0ZXN0KC0zTCwgIlgiLCAiLTMiKQorICAgICAgICB0ZXN0KGxvbmcoJ2JlJywgMTYpLCAieCIsICJiZSIpCisgICAgICAgIHRlc3QobG9uZygnYmUnLCAxNiksICJYIiwgIkJFIikKKyAgICAgICAgdGVzdCgtbG9uZygnYmUnLCAxNiksICJ4IiwgIi1iZSIpCisgICAgICAgIHRlc3QoLWxvbmcoJ2JlJywgMTYpLCAiWCIsICItQkUiKQorCisgICAgICAgICMgb2N0YWwKKyAgICAgICAgdGVzdCgzTCwgIm8iLCAiMyIpCisgICAgICAgIHRlc3QoLTNMLCAibyIsICItMyIpCisgICAgICAgIHRlc3QoNjVMLCAibyIsICIxMDEiKQorICAgICAgICB0ZXN0KC02NUwsICJvIiwgIi0xMDEiKQorICAgICAgICB0ZXN0KDEyMzRMLCAibyIsICIyMzIyIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICJvIiwgIi0yMzIyIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIi1vIiwgIjIzMjIiKQorICAgICAgICB0ZXN0KC0xMjM0TCwgIi1vIiwgIi0yMzIyIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIiBvIiwgIiAyMzIyIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICIgbyIsICItMjMyMiIpCisgICAgICAgIHRlc3QoMTIzNEwsICIrbyIsICIrMjMyMiIpCisgICAgICAgIHRlc3QoLTEyMzRMLCAiK28iLCAiLTIzMjIiKQorCisgICAgICAgICMgYmluYXJ5CisgICAgICAgIHRlc3QoM0wsICJiIiwgIjExIikKKyAgICAgICAgdGVzdCgtM0wsICJiIiwgIi0xMSIpCisgICAgICAgIHRlc3QoMTIzNEwsICJiIiwgIjEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgtMTIzNEwsICJiIiwgIi0xMDAxMTAxMDAxMCIpCisgICAgICAgIHRlc3QoMTIzNEwsICItYiIsICIxMDAxMTAxMDAxMCIpCisgICAgICAgIHRlc3QoLTEyMzRMLCAiLWIiLCAiLTEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIiBiIiwgIiAxMDAxMTAxMDAxMCIpCisgICAgICAgIHRlc3QoLTEyMzRMLCAiIGIiLCAiLTEwMDExMDEwMDEwIikKKyAgICAgICAgdGVzdCgxMjM0TCwgIitiIiwgIisxMDAxMTAxMDAxMCIpCisgICAgICAgIHRlc3QoLTEyMzRMLCAiK2IiLCAiLTEwMDExMDEwMDEwIikKKworICAgICAgICAjIG1ha2Ugc3VyZSB0aGVzZSBhcmUgZXJyb3JzCisKKyAgICAgICAgIyBwcmVjaXNpb24gZGlzYWxsb3dlZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAzTCAuX19mb3JtYXRfXywgIjEuMyIpCisgICAgICAgICMgc2lnbiBub3QgYWxsb3dlZCB3aXRoICdjJworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAzTCAuX19mb3JtYXRfXywgIitjIikKKyAgICAgICAgIyBmb3JtYXQgc3BlYyBtdXN0IGJlIHN0cmluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIDNMIC5fX2Zvcm1hdF9fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIDNMIC5fX2Zvcm1hdF9fLCAwKQorICAgICAgICAjIGFsdGVybmF0ZSBzcGVjaWZpZXIgaW4gd3JvbmcgcGxhY2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgMUwgLl9fZm9ybWF0X18sICIjKzV4IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgMUwgLl9fZm9ybWF0X18sICIrNSN4IikKKworICAgICAgICAjIGVuc3VyZSB0aGF0IG9ubHkgaW50IGFuZCBmbG9hdCB0eXBlIHNwZWNpZmllcnMgd29yaworICAgICAgICBmb3IgZm9ybWF0X3NwZWMgaW4gKFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdhJyksIG9yZCgneicpKzEpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ0EnKSwgb3JkKCdaJykrMSldKToKKyAgICAgICAgICAgIGlmIG5vdCBmb3JtYXRfc3BlYyBpbiAnYmNkb3hYZUVmRmdHbiUnOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIDBMIC5fX2Zvcm1hdF9fLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAxTCAuX19mb3JtYXRfXywgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgKC0xTCkgLl9fZm9ybWF0X18sIGZvcm1hdF9zcGVjKQorCisgICAgICAgICMgZW5zdXJlIHRoYXQgZmxvYXQgdHlwZSBzcGVjaWZpZXJzIHdvcms7IGZvcm1hdCBjb252ZXJ0cworICAgICAgICAjICB0aGUgbG9uZyB0byBhIGZsb2F0CisgICAgICAgIGZvciBmb3JtYXRfc3BlYyBpbiAnZUVmRmdHJSc6CisgICAgICAgICAgICBmb3IgdmFsdWUgaW4gWzBMLCAxTCwgLTFMLCAxMDBMLCAtMTAwTCwgMTIzNDU2Nzg5MEwsIC0xMjM0NTY3ODkwTF06CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KHZhbHVlKS5fX2Zvcm1hdF9fKGZvcm1hdF9zcGVjKSkKKyAgICAgICAgIyBJc3N1ZSA2OTAyCisgICAgICAgIHRlc3QoMTIzNDU2TCwgIjA8MjAiLCAnMTIzNDU2MDAwMDAwMDAwMDAwMDAnKQorICAgICAgICB0ZXN0KDEyMzQ1NkwsICIxPDIwIiwgJzEyMzQ1NjExMTExMTExMTExMTExJykKKyAgICAgICAgdGVzdCgxMjM0NTZMLCAiKjwyMCIsICcxMjM0NTYqKioqKioqKioqKioqKicpCisgICAgICAgIHRlc3QoMTIzNDU2TCwgIjA+MjAiLCAnMDAwMDAwMDAwMDAwMDAxMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NkwsICIxPjIwIiwgJzExMTExMTExMTExMTExMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTZMLCAiKj4yMCIsICcqKioqKioqKioqKioqKjEyMzQ1NicpCisgICAgICAgIHRlc3QoMTIzNDU2TCwgIjA9MjAiLCAnMDAwMDAwMDAwMDAwMDAxMjM0NTYnKQorICAgICAgICB0ZXN0KDEyMzQ1NkwsICIxPTIwIiwgJzExMTExMTExMTExMTExMTIzNDU2JykKKyAgICAgICAgdGVzdCgxMjM0NTZMLCAiKj0yMCIsICcqKioqKioqKioqKioqKjEyMzQ1NicpCisKKyAgICBAcnVuX3dpdGhfbG9jYWxlKCdMQ19OVU1FUklDJywgJ2VuX1VTLlVURjgnKQorICAgIGRlZiB0ZXN0X2Zsb2F0X19mb3JtYXRfX2xvY2FsZShzZWxmKToKKyAgICAgICAgIyB0ZXN0IGxvY2FsZSBzdXBwb3J0IGZvciBfX2Zvcm1hdF9fIGNvZGUgJ24nCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoLTEwLCAxMCk6CisgICAgICAgICAgICB4ID0gMTIzNDU2Nzg5MC4wICogKDEwLjAgKiogaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9jYWxlLmZvcm1hdCgnJWcnLCB4LCBncm91cGluZz1UcnVlKSwgZm9ybWF0KHgsICduJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2FsZS5mb3JtYXQoJyUuMTBnJywgeCwgZ3JvdXBpbmc9VHJ1ZSksIGZvcm1hdCh4LCAnLjEwbicpKQorCisgICAgQHJ1bl93aXRoX2xvY2FsZSgnTENfTlVNRVJJQycsICdlbl9VUy5VVEY4JykKKyAgICBkZWYgdGVzdF9pbnRfX2Zvcm1hdF9fbG9jYWxlKHNlbGYpOgorICAgICAgICAjIHRlc3QgbG9jYWxlIHN1cHBvcnQgZm9yIF9fZm9ybWF0X18gY29kZSAnbicgZm9yIGludGVnZXJzCisKKyAgICAgICAgeCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MAorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCAzMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvY2FsZS5mb3JtYXQoJyVkJywgeCwgZ3JvdXBpbmc9VHJ1ZSksIGZvcm1hdCh4LCAnbicpKQorCisgICAgICAgICAgICAjIG1vdmUgdG8gdGhlIG5leHQgaW50ZWdlciB0byB0ZXN0CisgICAgICAgICAgICB4ID0geCAvLyAxMAorCisgICAgICAgIHJmbXQgPSAiPjIwbiIKKyAgICAgICAgbGZtdCA9ICI8MjBuIgorICAgICAgICBjZm10ID0gIl4yMG4iCisgICAgICAgIGZvciB4IGluICgxMjM0LCAxMjM0NSwgMTIzNDU2LCAxMjM0NTY3LCAxMjM0NTY3OCwgMTIzNDU2Nzg5LCAxMjM0NTY3ODkwLCAxMjM0NTY3ODkwMCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihmb3JtYXQoMCwgcmZtdCkpLCBsZW4oZm9ybWF0KHgsIHJmbXQpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGZvcm1hdCgwLCBsZm10KSksIGxlbihmb3JtYXQoeCwgbGZtdCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZm9ybWF0KDAsIGNmbXQpKSwgbGVuKGZvcm1hdCh4LCBjZm10KSkpCisKKyAgICBkZWYgdGVzdF9mbG9hdF9fZm9ybWF0X18oc2VsZik6CisgICAgICAgICMgdGhlc2Ugc2hvdWxkIGJlIHJld3JpdHRlbiB0byB1c2UgYm90aCBmb3JtYXQoeCwgc3BlYykgYW5kCisgICAgICAgICMgeC5fX2Zvcm1hdF9fKHNwZWMpCisKKyAgICAgICAgZGVmIHRlc3QoZiwgZm9ybWF0X3NwZWMsIHJlc3VsdCk6CisgICAgICAgICAgICBhc3NlcnQgdHlwZShmKSA9PSBmbG9hdAorICAgICAgICAgICAgYXNzZXJ0IHR5cGUoZm9ybWF0X3NwZWMpID09IHN0cgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLl9fZm9ybWF0X18oZm9ybWF0X3NwZWMpLCByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYuX19mb3JtYXRfXyh1bmljb2RlKGZvcm1hdF9zcGVjKSksIHJlc3VsdCkKKworICAgICAgICB0ZXN0KDAuMCwgJ2YnLCAnMC4wMDAwMDAnKQorCisgICAgICAgICMgdGhlIGRlZmF1bHQgaXMgJ2cnLCBleGNlcHQgZm9yIGVtcHR5IGZvcm1hdCBzcGVjCisgICAgICAgIHRlc3QoMC4wLCAnJywgJzAuMCcpCisgICAgICAgIHRlc3QoMC4wMSwgJycsICcwLjAxJykKKyAgICAgICAgdGVzdCgwLjAxLCAnZycsICcwLjAxJykKKworICAgICAgICAjIHRlc3QgZm9yIGlzc3VlIDM0MTEKKyAgICAgICAgdGVzdCgxLjIzLCAnMScsICcxLjIzJykKKyAgICAgICAgdGVzdCgtMS4yMywgJzEnLCAnLTEuMjMnKQorICAgICAgICB0ZXN0KDEuMjMsICcxZycsICcxLjIzJykKKyAgICAgICAgdGVzdCgtMS4yMywgJzFnJywgJy0xLjIzJykKKworICAgICAgICB0ZXN0KCAxLjAsICcgZycsICcgMScpCisgICAgICAgIHRlc3QoLTEuMCwgJyBnJywgJy0xJykKKyAgICAgICAgdGVzdCggMS4wLCAnK2cnLCAnKzEnKQorICAgICAgICB0ZXN0KC0xLjAsICcrZycsICctMScpCisgICAgICAgIHRlc3QoMS4xMjM0ZTIwMCwgJ2cnLCAnMS4xMjM0ZSsyMDAnKQorICAgICAgICB0ZXN0KDEuMTIzNGUyMDAsICdHJywgJzEuMTIzNEUrMjAwJykKKworCisgICAgICAgIHRlc3QoMS4wLCAnZicsICcxLjAwMDAwMCcpCisKKyAgICAgICAgdGVzdCgtMS4wLCAnZicsICctMS4wMDAwMDAnKQorCisgICAgICAgIHRlc3QoIDEuMCwgJyBmJywgJyAxLjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEuMCwgJyBmJywgJy0xLjAwMDAwMCcpCisgICAgICAgIHRlc3QoIDEuMCwgJytmJywgJysxLjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEuMCwgJytmJywgJy0xLjAwMDAwMCcpCisKKyAgICAgICAgIyBQeXRob24gdmVyc2lvbnMgPD0gMi42IHN3aXRjaGVkIGZyb20gJ2YnIHRvICdnJyBmb3JtYXR0aW5nIGZvcgorICAgICAgICAjIHZhbHVlcyBsYXJnZXIgdGhhbiAxZTUwLiAgTm8gbG9uZ2VyLgorICAgICAgICBmID0gMS4xMjM0ZTkwCisgICAgICAgIGZvciBmbXQgaW4gJ2YnLCAnRic6CisgICAgICAgICAgICAjIGRvbid0IGRvIGEgZGlyZWN0IGVxdWFsaXR5IGNoZWNrLCBzaW5jZSBvbiBzb21lCisgICAgICAgICAgICAjIHBsYXRmb3JtcyBvbmx5IHRoZSBmaXJzdCBmZXcgZGlnaXRzIG9mIGR0b2EKKyAgICAgICAgICAgICMgd2lsbCBiZSByZWxpYWJsZQorICAgICAgICAgICAgcmVzdWx0ID0gZi5fX2Zvcm1hdF9fKGZtdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIDk4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRbLTddLCAnLicpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKHJlc3VsdFs6MTJdLCAoJzExMjM0MDAwMDAwMCcsICcxMTIzMzk5OTk5OTknKSkKKyAgICAgICAgZiA9IDEuMTIzNGUyMDAKKyAgICAgICAgZm9yIGZtdCBpbiAnZicsICdGJzoKKyAgICAgICAgICAgIHJlc3VsdCA9IGYuX19mb3JtYXRfXyhmbXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAyMDgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFstN10sICcuJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmVzdWx0WzoxMl0sICgnMTEyMzQwMDAwMDAwJywgJzExMjMzOTk5OTk5OScpKQorCisKKyAgICAgICAgdGVzdCggMS4wLCAnZScsICcxLjAwMDAwMGUrMDAnKQorICAgICAgICB0ZXN0KC0xLjAsICdlJywgJy0xLjAwMDAwMGUrMDAnKQorICAgICAgICB0ZXN0KCAxLjAsICdFJywgJzEuMDAwMDAwRSswMCcpCisgICAgICAgIHRlc3QoLTEuMCwgJ0UnLCAnLTEuMDAwMDAwRSswMCcpCisgICAgICAgIHRlc3QoMS4xMjM0ZTIwLCAnZScsICcxLjEyMzQwMGUrMjAnKQorICAgICAgICB0ZXN0KDEuMTIzNGUyMCwgJ0UnLCAnMS4xMjM0MDBFKzIwJykKKworICAgICAgICAjIE5vIGZvcm1hdCBjb2RlIG1lYW5zIHVzZSBnLCBidXQgbXVzdCBoYXZlIGEgZGVjaW1hbAorICAgICAgICAjIGFuZCBhIG51bWJlciBhZnRlciB0aGUgZGVjaW1hbC4gIFRoaXMgaXMgdHJpY2t5LCBiZWNhdXNlCisgICAgICAgICMgYSB0b3RhbHkgZW1wdHkgZm9ybWF0IHNwZWNpZmllciBtZWFucyBzb21ldGhpbmcgZWxzZS4KKyAgICAgICAgIyBTbywganVzdCB1c2UgYSBzaWduIGZsYWcKKyAgICAgICAgdGVzdCgxZTIwMCwgJytnJywgJysxZSsyMDAnKQorICAgICAgICB0ZXN0KDFlMjAwLCAnKycsICcrMWUrMjAwJykKKyAgICAgICAgdGVzdCgxLjFlMjAwLCAnK2cnLCAnKzEuMWUrMjAwJykKKyAgICAgICAgdGVzdCgxLjFlMjAwLCAnKycsICcrMS4xZSsyMDAnKQorCisgICAgICAgIHRlc3QoMS4xZTIwMCwgJytnJywgJysxLjFlKzIwMCcpCisgICAgICAgIHRlc3QoMS4xZTIwMCwgJysnLCAnKzEuMWUrMjAwJykKKworICAgICAgICAjIDAgcGFkZGluZworICAgICAgICB0ZXN0KDEyMzQuLCAnMDEwZicsICcxMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoMTIzNC4sICcwMTFmJywgJzEyMzQuMDAwMDAwJykKKyAgICAgICAgdGVzdCgxMjM0LiwgJzAxMmYnLCAnMDEyMzQuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMTIzNC4sICcwMTFmJywgJy0xMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEyMzQuLCAnMDEyZicsICctMTIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0LiwgJzAxM2YnLCAnLTAxMjM0LjAwMDAwMCcpCisgICAgICAgIHRlc3QoLTEyMzQuMTIzNDEyMzQsICcwMTNmJywgJy0wMTIzNC4xMjM0MTInKQorICAgICAgICB0ZXN0KC0xMjM0NTYuMTIzNDEyMzQsICcwMTEuMmYnLCAnLTAxMjM0NTYuMTInKQorCisgICAgICAgICMgaXNzdWUgNTc4MiwgY29tbWFzIHdpdGggbm8gc3BlY2lmaWVyIHR5cGUKKyAgICAgICAgdGVzdCgxLjIsICcwMTAsLjInLCAnMCwwMDAsMDAxLjInKQorCisgICAgICAgICMgMCBwYWRkaW5nIHdpdGggY29tbWFzCisgICAgICAgIHRlc3QoMTIzNC4sICcwMTEsZicsICcxLDIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KDEyMzQuLCAnMDEyLGYnLCAnMSwyMzQuMDAwMDAwJykKKyAgICAgICAgdGVzdCgxMjM0LiwgJzAxMyxmJywgJzAxLDIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0LiwgJzAxMixmJywgJy0xLDIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0LiwgJzAxMyxmJywgJy0xLDIzNC4wMDAwMDAnKQorICAgICAgICB0ZXN0KC0xMjM0LiwgJzAxNCxmJywgJy0wMSwyMzQuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMTIzNDUuLCAnMDE1LGYnLCAnLTAxMiwzNDUuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMTIzNDU2LiwgJzAxNixmJywgJy0wLDEyMyw0NTYuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMTIzNDU2LiwgJzAxNyxmJywgJy0wLDEyMyw0NTYuMDAwMDAwJykKKyAgICAgICAgdGVzdCgtMTIzNDU2LjEyMzQxMjM0LCAnMDE3LGYnLCAnLTAsMTIzLDQ1Ni4xMjM0MTInKQorICAgICAgICB0ZXN0KC0xMjM0NTYuMTIzNDEyMzQsICcwMTMsLjJmJywgJy0wLDEyMyw0NTYuMTInKQorCisgICAgICAgICAjICUgZm9ybWF0dGluZworICAgICAgICB0ZXN0KC0xLjAsICclJywgJy0xMDAuMDAwMDAwJScpCisKKyAgICAgICAgIyBmb3JtYXQgc3BlYyBtdXN0IGJlIHN0cmluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIDMuMC5fX2Zvcm1hdF9fLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIDMuMC5fX2Zvcm1hdF9fLCAwKQorCisgICAgICAgICMgb3RoZXIgZm9ybWF0IHNwZWNpZmllcnMgc2hvdWxkbid0IHdvcmsgb24gZmxvYXRzLAorICAgICAgICAjICBpbiBwYXJ0aWN1bGFyIGludCBzcGVjaWZpZXJzCisgICAgICAgIGZvciBmb3JtYXRfc3BlYyBpbiAoW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ2EnKSwgb3JkKCd6JykrMSldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnQScpLCBvcmQoJ1onKSsxKV0pOgorICAgICAgICAgICAgaWYgbm90IGZvcm1hdF9zcGVjIGluICdlRWZGZ0duJSc6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAwLjAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMS4wLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIC0xLjAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMWUxMDAsIGZvcm1hdF9zcGVjKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgLTFlMTAwLCBmb3JtYXRfc3BlYykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDFlLTEwMCwgZm9ybWF0X3NwZWMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAtMWUtMTAwLCBmb3JtYXRfc3BlYykKKworICAgICAgICAjIEFsdGVybmF0ZSBmb3JtYXR0aW5nIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAwLjAsICcjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAwLjAsICcjMjBmJykKKworICAgICAgICAjIElzc3VlIDY5MDIKKyAgICAgICAgdGVzdCgxMjM0NS42LCAiMDwyMCIsICcxMjM0NS42MDAwMDAwMDAwMDAwMCcpCisgICAgICAgIHRlc3QoMTIzNDUuNiwgIjE8MjAiLCAnMTIzNDUuNjExMTExMTExMTExMTEnKQorICAgICAgICB0ZXN0KDEyMzQ1LjYsICIqPDIwIiwgJzEyMzQ1LjYqKioqKioqKioqKioqJykKKyAgICAgICAgdGVzdCgxMjM0NS42LCAiMD4yMCIsICcwMDAwMDAwMDAwMDAwMTIzNDUuNicpCisgICAgICAgIHRlc3QoMTIzNDUuNiwgIjE+MjAiLCAnMTExMTExMTExMTExMTEyMzQ1LjYnKQorICAgICAgICB0ZXN0KDEyMzQ1LjYsICIqPjIwIiwgJyoqKioqKioqKioqKioxMjM0NS42JykKKyAgICAgICAgdGVzdCgxMjM0NS42LCAiMD0yMCIsICcwMDAwMDAwMDAwMDAwMTIzNDUuNicpCisgICAgICAgIHRlc3QoMTIzNDUuNiwgIjE9MjAiLCAnMTExMTExMTExMTExMTEyMzQ1LjYnKQorICAgICAgICB0ZXN0KDEyMzQ1LjYsICIqPTIwIiwgJyoqKioqKioqKioqKioxMjM0NS42JykKKworICAgIGRlZiB0ZXN0X2Zvcm1hdF9zcGVjX2Vycm9ycyhzZWxmKToKKyAgICAgICAgIyBpbnQsIGZsb2F0LCBhbmQgc3RyaW5nIGFsbCBzaGFyZSB0aGUgc2FtZSBmb3JtYXQgc3BlYworICAgICAgICAjIG1pbmktbGFuZ3VhZ2UgcGFyc2VyLgorCisgICAgICAgICMgQ2hlY2sgdGhhdCB3ZSBjYW4ndCBhc2sgZm9yIHRvbyBtYW55IGRpZ2l0cy4gVGhpcyBpcworICAgICAgICAjIHByb2JhYmx5IGEgQ1B5dGhvbiBzcGVjaWZpYyB0ZXN0LiBJdCB0cmllcyB0byBwdXQgdGhlIHdpZHRoCisgICAgICAgICMgaW50byBhIEMgbG9uZy4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAwLCAnMScqMTAwMDAgKyAnZCcpCisKKyAgICAgICAgIyBTaW1pbGFyIHdpdGggdGhlIHByZWNpc2lvbi4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZm9ybWF0LCAwLCAnLicgKyAnMScqMTAwMDAgKyAnZCcpCisKKyAgICAgICAgIyBBbmQgbWF5IGFzIHdlbGwgdGVzdCBib3RoLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIDAsICcxJyoxMDAwICsgJy4nICsgJzEnKjEwMDAwICsgJ2QnKQorCisgICAgICAgICMgTWFrZSBzdXJlIGNvbW1hcyBhcmVuJ3QgYWxsb3dlZCB3aXRoIHZhcmlvdXMgdHlwZSBjb2RlcworICAgICAgICBmb3IgY29kZSBpbiAneFhvYm5zJzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZvcm1hdCwgMCwgJywnICsgY29kZSkKKworICAgIGRlZiB0ZXN0X2ludGVybmFsX3NpemVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIob2JqZWN0Ll9fYmFzaWNzaXplX18sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcih0dXBsZS5fX2l0ZW1zaXplX18sIDApCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgiYnVmZmVyLi4gbm90IHN1cHBvcnRlZCIsIERlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAoImNsYXNzaWMgbG9uZyBkaXZpc2lvbiIsIERlcHJlY2F0aW9uV2FybmluZykpOgorICAgICAgICBydW5fdW5pdHRlc3QoVHlwZXNUZXN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjhlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMmM1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF90eXBlcy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdWNuLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdWNuLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYTRmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHkKQEAgLTAsMCArMSwxNjcgQEAKKyIiIiBUZXN0IHNjcmlwdCBmb3IgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24uCisKK1dyaXR0ZW4gYnkgQmlsbCBUdXR0LgorTW9kaWZpZWQgZm9yIFB5dGhvbiAyLjAgYnkgRnJlZHJpayBMdW5kaCAoZnJlZHJpa0BweXRob253YXJlLmNvbSkKKworKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KKworIiIiIyIKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgX3Rlc3RjYXBpCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIFVuaWNvZGVOYW1lc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrbGV0dGVyKHNlbGYsIG5hbWUsIGNvZGUpOgorICAgICAgICAjIEhlbHBlciB0aGF0IHB1dCBhbGwgXE4gZXNjYXBlcyBpbnNpZGUgZXZhbCdkIHJhdyBzdHJpbmdzLAorICAgICAgICAjIHRvIG1ha2Ugc3VyZSB0aGlzIHNjcmlwdCBydW5zIGV2ZW4gaWYgdGhlIGNvbXBpbGVyCisgICAgICAgICMgY2hva2VzIG9uIFxOIGVzY2FwZXMKKyAgICAgICAgcmVzID0gZXZhbCh1cid1IlxOeyVzfSInICUgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsIGNvZGUpCisgICAgICAgIHJldHVybiByZXMKKworICAgIGRlZiB0ZXN0X2dlbmVyYWwoc2VsZik6CisgICAgICAgICMgR2VuZXJhbCBhbmQgY2FzZSBpbnNlbnNpdGl2aXR5IHRlc3Q6CisgICAgICAgIGNoYXJzID0gWworICAgICAgICAgICAgIkxBVElOIENBUElUQUwgTEVUVEVSIFQiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBIIiwKKyAgICAgICAgICAgICJMQVRJTiBTTUFMTCBMRVRURVIgRSIsCisgICAgICAgICAgICAiU1BBQ0UiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBSIiwKKyAgICAgICAgICAgICJMQVRJTiBDQVBJVEFMIExFVFRFUiBFIiwKKyAgICAgICAgICAgICJMQVRJTiBTTUFMTCBMRVRURVIgRCIsCisgICAgICAgICAgICAiU1BBQ0UiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBmIiwKKyAgICAgICAgICAgICJMQVRJTiBDQVBJVEFMIExlVHRFciBvIiwKKyAgICAgICAgICAgICJMQVRJTiBTTWFMbCBMRVRURVIgeCIsCisgICAgICAgICAgICAiU1BBQ0UiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBBIiwKKyAgICAgICAgICAgICJMQVRJTiBTTUFMTCBMRVRURVIgVCIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIEUiLAorICAgICAgICAgICAgIlNQQUNFIiwKKyAgICAgICAgICAgICJMQVRJTiBTTUFMTCBMRVRURVIgVCIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIEgiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBFIiwKKyAgICAgICAgICAgICJTcEFjRSIsCisgICAgICAgICAgICAiTEFUSU4gU01BTEwgTEVUVEVSIFMiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBIIiwKKyAgICAgICAgICAgICJMQVRJTiBzbWFsbCBMRVRURVIgZSIsCisgICAgICAgICAgICAiTEFUSU4gc21hbGwgTEVUVEVSIGUiLAorICAgICAgICAgICAgIkxBVElOIFNNQUxMIExFVFRFUiBQIiwKKyAgICAgICAgICAgICJGVUxMIFNUT1AiCisgICAgICAgIF0KKyAgICAgICAgc3RyaW5nID0gdSJUaGUgckVkIGZPeCBhdGUgdGhlIHNoZWVwLiIKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSIiLmpvaW4oW3NlbGYuY2hlY2tsZXR0ZXIoKmFyZ3MpIGZvciBhcmdzIGluIHppcChjaGFycywgc3RyaW5nKV0pLAorICAgICAgICAgICAgc3RyaW5nCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2FzY2lpX2xldHRlcnMoc2VsZik6CisgICAgICAgIGltcG9ydCB1bmljb2RlZGF0YQorCisgICAgICAgIGZvciBjaGFyIGluICIiLmpvaW4obWFwKGNociwgeHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSkpKToKKyAgICAgICAgICAgIG5hbWUgPSAiTEFUSU4gU01BTEwgTEVUVEVSICVzIiAlIGNoYXIudXBwZXIoKQorICAgICAgICAgICAgY29kZSA9IHVuaWNvZGVkYXRhLmxvb2t1cChuYW1lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlZGF0YS5uYW1lKGNvZGUpLCBuYW1lKQorCisgICAgZGVmIHRlc3RfaGFuZ3VsX3N5bGxhYmxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIEdBIiwgdSJcdWFjMDAiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgR0dXRU9TUyIsIHUiXHVhZmU4IikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIERPTFMiLCB1Ilx1YjNkMCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBSWUFOIiwgdSJcdWI3YjgiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgTVdJSyIsIHUiXHViYmEwIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIEJCV0FFTSIsIHUiXHViZjg4IikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIFNTRU9MIiwgdSJcdWMzNzAiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQU5HVUwgU1lMTEFCTEUgWUkiLCB1Ilx1Yzc1OCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBKSllPU1MiLCB1Ilx1Y2I0MCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBLWUVPTFMiLCB1Ilx1Y2YyOCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBQQU4iLCB1Ilx1ZDMxMCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkhBTkdVTCBTWUxMQUJMRSBIV0VPSyIsIHUiXHVkNmY4IikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiSEFOR1VMIFNZTExBQkxFIEhJSCIsIHUiXHVkN2EzIikKKworICAgICAgICBpbXBvcnQgdW5pY29kZWRhdGEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdW5pY29kZWRhdGEubmFtZSwgdSJcdWQ3YTQiKQorCisgICAgZGVmIHRlc3RfY2prX3VuaWZpZWRfaWRlb2dyYXBocyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiQ0pLIFVOSUZJRUQgSURFT0dSQVBILTM0MDAiLCB1Ilx1MzQwMCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkNKSyBVTklGSUVEIElERU9HUkFQSC00REI1IiwgdSJcdTRkYjUiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJDSksgVU5JRklFRCBJREVPR1JBUEgtNEUwMCIsIHUiXHU0ZTAwIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiQ0pLIFVOSUZJRUQgSURFT0dSQVBILTlGQTUiLCB1Ilx1OWZhNSIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkNKSyBVTklGSUVEIElERU9HUkFQSC0yMDAwMCIsIHUiXFUwMDAyMDAwMCIpCisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIkNKSyBVTklGSUVEIElERU9HUkFQSC0yQTZENiIsIHUiXFUwMDAyYTZkNiIpCisKKyAgICBkZWYgdGVzdF9ibXBfY2hhcmFjdGVycyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHVuaWNvZGVkYXRhCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICBmb3IgY29kZSBpbiB4cmFuZ2UoMHgxMDAwMCk6CisgICAgICAgICAgICBjaGFyID0gdW5pY2hyKGNvZGUpCisgICAgICAgICAgICBuYW1lID0gdW5pY29kZWRhdGEubmFtZShjaGFyLCBOb25lKQorICAgICAgICAgICAgaWYgbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVkYXRhLmxvb2t1cChuYW1lKSwgY2hhcikKKyAgICAgICAgICAgICAgICBjb3VudCArPSAxCisKKyAgICBkZWYgdGVzdF9taXNjX3N5bWJvbHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tsZXR0ZXIoIlBJTENST1cgU0lHTiIsIHUiXHUwMGI2IikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiUkVQTEFDRU1FTlQgQ0hBUkFDVEVSIiwgdSJcdUZGRkQiKQorICAgICAgICBzZWxmLmNoZWNrbGV0dGVyKCJIQUxGV0lEVEggS0FUQUtBTkEgU0VNSS1WT0lDRUQgU09VTkQgTUFSSyIsIHUiXHVGRjlGIikKKyAgICAgICAgc2VsZi5jaGVja2xldHRlcigiRlVMTFdJRFRIIExBVElOIFNNQUxMIExFVFRFUiBBIiwgdSJcdUZGNDEiKQorCisgICAgZGVmIHRlc3RfZXJyb3JzKHNlbGYpOgorICAgICAgICBpbXBvcnQgdW5pY29kZWRhdGEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1bmljb2RlZGF0YS5uYW1lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHVuaWNvZGVkYXRhLm5hbWUsIHUneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHVuaWNvZGVkYXRhLmxvb2t1cCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHVuaWNvZGVkYXRhLmxvb2t1cCwgdSd1bmtub3duJykKKworICAgIGRlZiB0ZXN0X3N0cmljdF9lcm9yX2hhbmRsaW5nKHNlbGYpOgorICAgICAgICAjIGJvZ3VzIGNoYXJhY3RlciBuYW1lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVW5pY29kZUVycm9yLAorICAgICAgICAgICAgdW5pY29kZSwgIlxcTntibGFofSIsICd1bmljb2RlLWVzY2FwZScsICdzdHJpY3QnCisgICAgICAgICkKKyAgICAgICAgIyBsb25nIGJvZ3VzIGNoYXJhY3RlciBuYW1lCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgVW5pY29kZUVycm9yLAorICAgICAgICAgICAgdW5pY29kZSwgIlxcTnslc30iICUgKCJ4IiAqIDEwMDAwMCksICd1bmljb2RlLWVzY2FwZScsICdzdHJpY3QnCisgICAgICAgICkKKyAgICAgICAgIyBtaXNzaW5nIGNsb3NpbmcgYnJhY2UKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBVbmljb2RlRXJyb3IsCisgICAgICAgICAgICB1bmljb2RlLCAiXFxOe1NQQUNFIiwgJ3VuaWNvZGUtZXNjYXBlJywgJ3N0cmljdCcKKyAgICAgICAgKQorICAgICAgICAjIG1pc3Npbmcgb3BlbmluZyBicmFjZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFVuaWNvZGVFcnJvciwKKyAgICAgICAgICAgIHVuaWNvZGUsICJcXE5TUEFDRSIsICd1bmljb2RlLWVzY2FwZScsICdzdHJpY3QnCisgICAgICAgICkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKF90ZXN0Y2FwaS5JTlRfTUFYIDwgX3Rlc3RjYXBpLlBZX1NTSVpFX1RfTUFYLAorICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkcyBVSU5UX01BWCA8IFNJWkVfTUFYIikKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhfdGVzdGNhcGkuVUlOVF9NQVggPCBzeXMubWF4aW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICJuZWVkcyBVSU5UX01BWCA8IHN5cy5tYXhpbnQiKQorICAgIEB0ZXN0X3N1cHBvcnQuYmlnbWVtdGVzdChtaW5zaXplPV90ZXN0Y2FwaS5VSU5UX01BWCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXVzZT0yICsgNCAvLyBsZW4odSdcVTAwMDEwMDAwJykpCisgICAgZGVmIHRlc3RfaXNzdWUxNjMzNShzZWxmLCBzaXplKToKKyAgICAgICAgZnVuYyA9IHNlbGYudGVzdF9pc3N1ZTE2MzM1CisgICAgICAgIGlmIHNpemUgPCBmdW5jLm1pbnNpemU6CisgICAgICAgICAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCgibm90IGVub3VnaCBtZW1vcnk6ICUuMWZHIG1pbmltdW0gbmVlZGVkIiAlCisgICAgICAgICAgICAgICAgICAgIChmdW5jLm1pbnNpemUgKiBmdW5jLm1lbXVzZSAvIGZsb2F0KDEwMjQqKjMpLCkpCisgICAgICAgICMgdmVyeSB2ZXJ5IGxvbmcgYm9ndXMgY2hhcmFjdGVyIG5hbWUKKyAgICAgICAgeCA9IGInXFxOe1NQQUNFJyArIGIneCcgKiBpbnQoX3Rlc3RjYXBpLlVJTlRfTUFYICsgMSkgKyBiJ30nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHgpLCBsZW4oYidcXE57U1BBQ0V9JykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF90ZXN0Y2FwaS5VSU5UX01BWCArIDEpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChVbmljb2RlRXJyb3IsCisgICAgICAgICAgICAndW5rbm93biBVbmljb2RlIGNoYXJhY3RlciBuYW1lJywKKyAgICAgICAgICAgIHguZGVjb2RlLCAndW5pY29kZS1lc2NhcGUnCisgICAgICAgICkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVbmljb2RlTmFtZXNUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdWNuLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZjNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdWNuLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91Y24ucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdWNuLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWZjNGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdWNuLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuYXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5OGZjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weQpAQCAtMCwwICsxLDU5IEBACisiIiJUZXN0IGNvbXBpbGVyIGNoYW5nZXMgZm9yIHVuYXJ5IG9wcyAoKywgLSwgfikgaW50cm9kdWNlZCBpbiBQeXRob24gMi4yIiIiCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBoYXZlX3VuaWNvZGUKKworY2xhc3MgVW5hcnlPcFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X25lZ2F0aXZlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTIgPT0gMCAtIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMCA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLS0yID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMkwgPT0gMCAtIDJMKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTIuMCA9PSAwIC0gMi4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTJqID09IDAgLSAyaikKKworICAgIGRlZiB0ZXN0X3Bvc2l0aXZlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCswID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgrKzIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCsyTCA9PSAyTCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCsyLjAgPT0gMi4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzJqID09IDJqKQorCisgICAgZGVmIHRlc3RfaW52ZXJ0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoLTIgPT0gMCAtIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMCA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoLS0yID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMkwgPT0gMCAtIDJMKQorCisgICAgZGVmIHRlc3Rfbm9fb3ZlcmZsb3coc2VsZik6CisgICAgICAgIG5pbmVzID0gIjkiICogMzIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoIisiICsgbmluZXMpID09IGV2YWwoIisiICsgbmluZXMgKyAiTCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgiLSIgKyBuaW5lcykgPT0gZXZhbCgiLSIgKyBuaW5lcyArICJMIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCJ+IiArIG5pbmVzKSA9PSBldmFsKCJ+IiArIG5pbmVzICsgIkwiKSkKKworICAgIGRlZiB0ZXN0X25lZ2F0aW9uX29mX2V4cG9uZW50aWF0aW9uKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSAnKionIGRvZXMgdGhlIHJpZ2h0IHRoaW5nOyB0aGVzZSBmb3JtIGEKKyAgICAgICAgIyByZWdyZXNzaW9uIHRlc3QgZm9yIFNvdXJjZUZvcmdlIGJ1ZyAjNDU2NzU2LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKC0yICoqIDMsIC04KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMikgKiogMywgLTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIgKiogNCwgLTE2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgtMikgKiogNCwgMTYpCisKKyAgICBkZWYgdGVzdF9iYWRfdHlwZXMoc2VsZik6CisgICAgICAgIGZvciBvcCBpbiAnKycsICctJywgJ34nOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCBvcCArICInYSciKQorICAgICAgICAgICAgaWYgaGF2ZV91bmljb2RlOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZXZhbCwgb3AgKyAidSdhJyIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAifjJqIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLCAifjIuMCIpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChVbmFyeU9wVGVzdENhc2UpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5hcnkucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5hcnkucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjU5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5hcnkucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5hcnkucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZjU5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmFyeS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5kb2N1bWVudGVkX2RldGFpbHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZjMjgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5kb2N1bWVudGVkX2RldGFpbHMucHkKQEAgLTAsMCArMSwzOSBAQAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBjaGVja19weTNrX3dhcm5pbmdzCitpbXBvcnQgdW5pdHRlc3QKKworY2xhc3MgVGVzdEltcGxlbWVudGF0aW9uQ29tcGFyaXNvbnModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfdHlwZV9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0ciA8IGludCBvciBzdHIgPiBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQgPD0gc3RyIG9yIGludCA+PSBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoaW50LCBzdHIpICE9IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQgaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyID09IHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludCAhPSBzdHIpCisKKyAgICBkZWYgdGVzdF9jZWxsX2NvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBkZWYgZih4KToKKyAgICAgICAgICAgIGlmIHg6CisgICAgICAgICAgICAgICAgeSA9IDEKKyAgICAgICAgICAgIGRlZiBnKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHgKKyAgICAgICAgICAgIGRlZiBoKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHkKKyAgICAgICAgICAgIHJldHVybiBnLCBoCisgICAgICAgIGcsIGggPSBmKDApCisgICAgICAgIGdfY2VsbCwgPSBnLmZ1bmNfY2xvc3VyZQorICAgICAgICBoX2NlbGwsID0gaC5mdW5jX2Nsb3N1cmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhfY2VsbCA8IGdfY2VsbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdfY2VsbCA+PSBoX2NlbGwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGdfY2VsbCwgaF9jZWxsKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdfY2VsbCBpcyBnX2NlbGwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnX2NlbGwgPT0gZ19jZWxsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaF9jZWxsID09IGhfY2VsbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdfY2VsbCAhPSBoX2NlbGwpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIGNoZWNrX3B5M2tfd2FybmluZ3MoKToKKyAgICAgICAgcnVuX3VuaXR0ZXN0KFRlc3RJbXBsZW1lbnRhdGlvbkNvbXBhcmlzb25zKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZDAzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmRvY3VtZW50ZWRfZGV0YWlscy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkZDAzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuZG9jdW1lbnRlZF9kZXRhaWxzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDRmZTAzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtMCwwICsxLDE2NjYgQEAKKyIiIiBUZXN0IHNjcmlwdCBmb3IgdGhlIFVuaWNvZGUgaW1wbGVtZW50YXRpb24uCisKK1dyaXR0ZW4gYnkgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAbGVtYnVyZy5jb20pLgorCisoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIjIgoraW1wb3J0IHN5cworaW1wb3J0IHN0cnVjdAoraW1wb3J0IGNvZGVjcworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgc3RyaW5nX3Rlc3RzCisKKyMgZGVjb3JhdG9yIHRvIHNraXAgdGVzdHMgb24gbmFycm93IGJ1aWxkcworcmVxdWlyZXNfd2lkZV9idWlsZCA9IHVuaXR0ZXN0LnNraXBJZihzeXMubWF4dW5pY29kZSA9PSA2NTUzNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlcXVpcmVzIHdpZGUgYnVpbGQnKQorCisjIEVycm9yIGhhbmRsaW5nIChiYWQgZGVjb2RlciByZXR1cm4pCitkZWYgc2VhcmNoX2Z1bmN0aW9uKGVuY29kaW5nKToKKyAgICBkZWYgZGVjb2RlMShpbnB1dCwgZXJyb3JzPSJzdHJpY3QiKToKKyAgICAgICAgcmV0dXJuIDQyICMgbm90IGEgdHVwbGUKKyAgICBkZWYgZW5jb2RlMShpbnB1dCwgZXJyb3JzPSJzdHJpY3QiKToKKyAgICAgICAgcmV0dXJuIDQyICMgbm90IGEgdHVwbGUKKyAgICBkZWYgZW5jb2RlMihpbnB1dCwgZXJyb3JzPSJzdHJpY3QiKToKKyAgICAgICAgcmV0dXJuICg0MiwgNDIpICMgbm8gdW5pY29kZQorICAgIGRlZiBkZWNvZGUyKGlucHV0LCBlcnJvcnM9InN0cmljdCIpOgorICAgICAgICByZXR1cm4gKDQyLCA0MikgIyBubyB1bmljb2RlCisgICAgaWYgZW5jb2Rpbmc9PSJ0ZXN0LnVuaWNvZGUxIjoKKyAgICAgICAgcmV0dXJuIChlbmNvZGUxLCBkZWNvZGUxLCBOb25lLCBOb25lKQorICAgIGVsaWYgZW5jb2Rpbmc9PSJ0ZXN0LnVuaWNvZGUyIjoKKyAgICAgICAgcmV0dXJuIChlbmNvZGUyLCBkZWNvZGUyLCBOb25lLCBOb25lKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBOb25lCitjb2RlY3MucmVnaXN0ZXIoc2VhcmNoX2Z1bmN0aW9uKQorCitjbGFzcyBVbmljb2RlVGVzdCgKKyAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdCwKKyAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QsCisgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVRlc3QsCisgICAgKToKKyAgICB0eXBlMnRlc3QgPSB1bmljb2RlCisKKyAgICBkZWYgYXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCwgbXNnPU5vbmUpOgorICAgICAgICAjIHN0cmljdCBhc3NlcnRFcXVhbCBtZXRob2Q6IHJlamVjdCBpbXBsaWNpdCBieXRlcy91bmljb2RlIGVxdWFsaXR5CisgICAgICAgIHN1cGVyKFVuaWNvZGVUZXN0LCBzZWxmKS5hc3NlcnRFcXVhbChmaXJzdCwgc2Vjb25kLCBtc2cpCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZmlyc3QsIHVuaWNvZGUpIG9yIGlzaW5zdGFuY2Uoc2Vjb25kLCB1bmljb2RlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaXJzdCwgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNvbmQsIHVuaWNvZGUpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShmaXJzdCwgc3RyKSBvciBpc2luc3RhbmNlKHNlY29uZCwgc3RyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaXJzdCwgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHNlY29uZCwgc3RyKQorCisgICAgZGVmIGNoZWNrZXF1YWxub2ZpeChzZWxmLCByZXN1bHQsIG9iamVjdCwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBtZXRob2QgPSBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkKKyAgICAgICAgcmVhbHJlc3VsdCA9IG1ldGhvZCgqYXJncykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFscmVzdWx0LCByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlYWxyZXN1bHQpIGlzIHR5cGUocmVzdWx0KSkKKworICAgICAgICAjIGlmIHRoZSBvcmlnaW5hbCBpcyByZXR1cm5lZCBtYWtlIHN1cmUgdGhhdAorICAgICAgICAjIHRoaXMgZG9lc24ndCBoYXBwZW4gd2l0aCBzdWJjbGFzc2VzCisgICAgICAgIGlmIHJlYWxyZXN1bHQgaXMgb2JqZWN0OgorICAgICAgICAgICAgY2xhc3MgdXN1Yih1bmljb2RlKToKKyAgICAgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAndXN1YiglciknICUgdW5pY29kZS5fX3JlcHJfXyhzZWxmKQorICAgICAgICAgICAgb2JqZWN0ID0gdXN1YihvYmplY3QpCisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkKKyAgICAgICAgICAgIHJlYWxyZXN1bHQgPSBtZXRob2QoKmFyZ3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxyZXN1bHQsIHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvYmplY3QgaXMgbm90IHJlYWxyZXN1bHQpCisKKyAgICBkZWYgdGVzdF9saXRlcmFscyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x4ZmYnLCB1J1x1MDBmZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdWZmZmYnLCB1J1xVMDAwMGZmZmYnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgJ3VcJ1xcVWZmZmZmZmZlXCcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgJ3VcJ1xcVWZmZmZmZmZmXCcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgZXZhbCwgJ3VcJ1xcVSUwOHhcJycgJSAweDExMDAwMCkKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgIyBUZXN0IGJhc2ljIHNhbml0eSBvZiByZXByKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J2FiYycpLCAidSdhYmMnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J2FiXFxjJyksICJ1J2FiXFxcXGMnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J2FiXFwnKSwgInUnYWJcXFxcJyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodSdcXGMnKSwgInUnXFxcXGMnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J1xcJyksICJ1J1xcXFwnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J1xuJyksICJ1J1xcbiciKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnXHInKSwgInUnXFxyJyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodSdcdCcpLCAidSdcXHQnIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1J1xiJyksICJ1J1xceDA4JyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodSInXCIiKSwgIiIidSdcXCciJyIiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1IidcIiIpLCAiIiJ1J1xcJyInIiIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUiJyIpLCAnJyd1IiciJycnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUnIicpLCAiIiJ1JyInIiIiKQorICAgICAgICAgICAgbGF0aW4xcmVwciA9ICgKKyAgICAgICAgICAgICAgICAidSdcXHgwMFxceDAxXFx4MDJcXHgwM1xceDA0XFx4MDVcXHgwNlxceDA3XFx4MDhcXHRcXG5cXHgwYlxceDBjXFxyIgorICAgICAgICAgICAgICAgICJcXHgwZVxceDBmXFx4MTBcXHgxMVxceDEyXFx4MTNcXHgxNFxceDE1XFx4MTZcXHgxN1xceDE4XFx4MTlcXHgxYSIKKyAgICAgICAgICAgICAgICAiXFx4MWJcXHgxY1xceDFkXFx4MWVcXHgxZiAhXCIjJCUmXFwnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISSIKKyAgICAgICAgICAgICAgICAiSktMTU5PUFFSU1RVVldYWVpbXFxcXF1eX2BhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX5cXHg3ZiIKKyAgICAgICAgICAgICAgICAiXFx4ODBcXHg4MVxceDgyXFx4ODNcXHg4NFxceDg1XFx4ODZcXHg4N1xceDg4XFx4ODlcXHg4YVxceDhiXFx4OGNcXHg4ZCIKKyAgICAgICAgICAgICAgICAiXFx4OGVcXHg4ZlxceDkwXFx4OTFcXHg5MlxceDkzXFx4OTRcXHg5NVxceDk2XFx4OTdcXHg5OFxceDk5XFx4OWFcXHg5YiIKKyAgICAgICAgICAgICAgICAiXFx4OWNcXHg5ZFxceDllXFx4OWZcXHhhMFxceGExXFx4YTJcXHhhM1xceGE0XFx4YTVcXHhhNlxceGE3XFx4YThcXHhhOSIKKyAgICAgICAgICAgICAgICAiXFx4YWFcXHhhYlxceGFjXFx4YWRcXHhhZVxceGFmXFx4YjBcXHhiMVxceGIyXFx4YjNcXHhiNFxceGI1XFx4YjZcXHhiNyIKKyAgICAgICAgICAgICAgICAiXFx4YjhcXHhiOVxceGJhXFx4YmJcXHhiY1xceGJkXFx4YmVcXHhiZlxceGMwXFx4YzFcXHhjMlxceGMzXFx4YzRcXHhjNSIKKyAgICAgICAgICAgICAgICAiXFx4YzZcXHhjN1xceGM4XFx4YzlcXHhjYVxceGNiXFx4Y2NcXHhjZFxceGNlXFx4Y2ZcXHhkMFxceGQxXFx4ZDJcXHhkMyIKKyAgICAgICAgICAgICAgICAiXFx4ZDRcXHhkNVxceGQ2XFx4ZDdcXHhkOFxceGQ5XFx4ZGFcXHhkYlxceGRjXFx4ZGRcXHhkZVxceGRmXFx4ZTBcXHhlMSIKKyAgICAgICAgICAgICAgICAiXFx4ZTJcXHhlM1xceGU0XFx4ZTVcXHhlNlxceGU3XFx4ZThcXHhlOVxceGVhXFx4ZWJcXHhlY1xceGVkXFx4ZWVcXHhlZiIKKyAgICAgICAgICAgICAgICAiXFx4ZjBcXHhmMVxceGYyXFx4ZjNcXHhmNFxceGY1XFx4ZjZcXHhmN1xceGY4XFx4ZjlcXHhmYVxceGZiXFx4ZmNcXHhmZCIKKyAgICAgICAgICAgICAgICAiXFx4ZmVcXHhmZiciKQorICAgICAgICAgICAgdGVzdHJlcHIgPSByZXByKHUnJy5qb2luKG1hcCh1bmljaHIsIHhyYW5nZSgyNTYpKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3RyZXByLCBsYXRpbjFyZXByKQorICAgICAgICAgICAgIyBUZXN0IHJlcHIgd29ya3Mgb24gd2lkZSB1bmljb2RlIGVzY2FwZXMgd2l0aG91dCBvdmVyZmxvdy4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1IlxVMDAwMTAwMDAiICogMzkgKyB1Ilx1ZmZmZiIgKiA0MDk2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcih1IlxVMDAwMTAwMDAiICogMzkgKyB1Ilx1ZmZmZiIgKiA0MDk2KSkKKworCisgICAgZGVmIHRlc3RfY291bnQoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3RfY291bnQoc2VsZikKKyAgICAgICAgIyBjaGVjayBtaXhlZCBhcmd1bWVudCB0eXBlcworICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgzLCAgJ2FhYScsICdjb3VudCcsIHUnYScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDAsICAnYWFhJywgJ2NvdW50JywgdSdiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMywgdSdhYWEnLCAnY291bnQnLCAgJ2EnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgwLCB1J2FhYScsICdjb3VudCcsICAnYicpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDAsIHUnYWFhJywgJ2NvdW50JywgICdiJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMSwgdSdhYWEnLCAnY291bnQnLCAgJ2EnLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMywgdSdhYWEnLCAnY291bnQnLCAgJ2EnLCAtMTApCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDIsIHUnYWFhJywgJ2NvdW50JywgICdhJywgMCwgLTEpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDAsIHUnYWFhJywgJ2NvdW50JywgICdhJywgMCwgLTEwKQorCisgICAgZGVmIHRlc3RfZmluZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMCwgIHUnYWJjZGVmZ2hpYWJjJywgJ2ZpbmQnLCB1J2FiYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDksICB1J2FiY2RlZmdoaWFiYycsICdmaW5kJywgdSdhYmMnLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgtMSwgdSdhYmNkZWZnaGlhYmMnLCAnZmluZCcsIHUnZGVmJywgNCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUnaGVsbG8nLmZpbmQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdSdoZWxsbycuZmluZCwgNDIpCisKKyAgICBkZWYgdGVzdF9yZmluZChzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QudGVzdF9yZmluZChzZWxmKQorICAgICAgICAjIGNoZWNrIG1peGVkIGFyZ3VtZW50IHR5cGVzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDksICAgJ2FiY2RlZmdoaWFiYycsICdyZmluZCcsIHUnYWJjJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMTIsICAnYWJjZGVmZ2hpYWJjJywgJ3JmaW5kJywgdScnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCgxMiwgdSdhYmNkZWZnaGlhYmMnLCAncmZpbmQnLCAgJycpCisKKyAgICBkZWYgdGVzdF9pbmRleChzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QudGVzdF9pbmRleChzZWxmKQorICAgICAgICAjIGNoZWNrIG1peGVkIGFyZ3VtZW50IHR5cGVzCisgICAgICAgIGZvciAodDEsIHQyKSBpbiAoKHN0ciwgdW5pY29kZSksICh1bmljb2RlLCBzdHIpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDAsIHQxKCdhYmNkZWZnaGlhYmMnKSwgJ2luZGV4JywgIHQyKCcnKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDMsIHQxKCdhYmNkZWZnaGlhYmMnKSwgJ2luZGV4JywgIHQyKCdkZWYnKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDAsIHQxKCdhYmNkZWZnaGlhYmMnKSwgJ2luZGV4JywgIHQyKCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDksIHQxKCdhYmNkZWZnaGlhYmMnKSwgJ2luZGV4JywgIHQyKCdhYmMnKSwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQxKCdhYmNkZWZnaGlhYmMnKS5pbmRleCwgdDIoJ2hpYicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdDEoJ2FiY2RlZmdoaWFiJykuaW5kZXgsICB0MignYWJjJyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0MSgnYWJjZGVmZ2hpJykuaW5kZXgsICB0MignZ2hpJyksIDgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0MSgnYWJjZGVmZ2hpJykuaW5kZXgsICB0MignZ2hpJyksIC0xKQorCisgICAgZGVmIHRlc3RfcmluZGV4KHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X3JpbmRleChzZWxmKQorICAgICAgICAjIGNoZWNrIG1peGVkIGFyZ3VtZW50IHR5cGVzCisgICAgICAgIGZvciAodDEsIHQyKSBpbiAoKHN0ciwgdW5pY29kZSksICh1bmljb2RlLCBzdHIpKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDEyLCB0MSgnYWJjZGVmZ2hpYWJjJyksICdyaW5kZXgnLCAgdDIoJycpKQorICAgICAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoMywgIHQxKCdhYmNkZWZnaGlhYmMnKSwgJ3JpbmRleCcsICB0MignZGVmJykpCisgICAgICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCg5LCAgdDEoJ2FiY2RlZmdoaWFiYycpLCAncmluZGV4JywgIHQyKCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KDAsICB0MSgnYWJjZGVmZ2hpYWJjJyksICdyaW5kZXgnLCAgdDIoJ2FiYycpLCAwLCAtMSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdDEoJ2FiY2RlZmdoaWFiYycpLnJpbmRleCwgIHQyKCdoaWInKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQxKCdkZWZnaGlhYmMnKS5yaW5kZXgsICB0MignZGVmJyksIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0MSgnZGVmZ2hpYWJjJykucmluZGV4LCAgdDIoJ2FiYycpLCAwLCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHQxKCdhYmNkZWZnaGknKS5yaW5kZXgsICB0MignZ2hpJyksIDAsIDgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0MSgnYWJjZGVmZ2hpJykucmluZGV4LCAgdDIoJ2doaScpLCAwLCAtMSkKKworICAgIGRlZiB0ZXN0X3RyYW5zbGF0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSdiYmJjJywgdSdhYmFiYWJjJywgJ3RyYW5zbGF0ZScsIHtvcmQoJ2EnKTpOb25lfSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSdpaWljJywgdSdhYmFiYWJjJywgJ3RyYW5zbGF0ZScsIHtvcmQoJ2EnKTpOb25lLCBvcmQoJ2InKTpvcmQoJ2knKX0pCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUnaWlpeCcsIHUnYWJhYmFiYycsICd0cmFuc2xhdGUnLCB7b3JkKCdhJyk6Tm9uZSwgb3JkKCdiJyk6b3JkKCdpJyksIG9yZCgnYycpOnUneCd9KQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1JzxpPjxpPjxpPmMnLCB1J2FiYWJhYmMnLCAndHJhbnNsYXRlJywge29yZCgnYScpOk5vbmUsIG9yZCgnYicpOnUnPGk+J30pCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUnYycsIHUnYWJhYmFiYycsICd0cmFuc2xhdGUnLCB7b3JkKCdhJyk6Tm9uZSwgb3JkKCdiJyk6dScnfSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSd4eXl4JywgdSd4engnLCAndHJhbnNsYXRlJywge29yZCgneicpOnUneXknfSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUnaGVsbG8nLnRyYW5zbGF0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1J2FiYWJhYmMnLnRyYW5zbGF0ZSwge29yZCgnYScpOicnfSkKKworICAgIGRlZiB0ZXN0X3NwbGl0KHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X3NwbGl0KHNlbGYpCisKKyAgICAgICAgIyBNaXhlZCBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoW3UnYScsIHUnYicsIHUnYycsIHUnZCddLCB1J2EvL2IvL2MvL2QnLCAnc3BsaXQnLCAnLy8nKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChbdSdhJywgdSdiJywgdSdjJywgdSdkJ10sICdhLy9iLy9jLy9kJywgJ3NwbGl0JywgdScvLycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFt1J2VuZGNhc2UgJywgdScnXSwgdSdlbmRjYXNlIHRlc3QnLCAnc3BsaXQnLCAndGVzdCcpCisKKyAgICBkZWYgdGVzdF9qb2luKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF9qb2luKHNlbGYpCisKKyAgICAgICAgIyBtaXhlZCBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSdhIGIgYyBkJywgdScgJywgJ2pvaW4nLCBbJ2EnLCAnYicsIHUnYycsIHUnZCddKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J2FiY2QnLCB1JycsICdqb2luJywgKHUnYScsIHUnYicsIHUnYycsIHUnZCcpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J3cgeCB5IHonLCB1JyAnLCAnam9pbicsIHN0cmluZ190ZXN0cy5TZXF1ZW5jZSgnd3h5eicpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J2EgYiBjIGQnLCAnICcsICdqb2luJywgW3UnYScsIHUnYicsIHUnYycsIHUnZCddKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J2EgYiBjIGQnLCAnICcsICdqb2luJywgWydhJywgJ2InLCB1J2MnLCB1J2QnXSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgodSdhYmNkJywgJycsICdqb2luJywgKHUnYScsIHUnYicsIHUnYycsIHUnZCcpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeCh1J3cgeCB5IHonLCAnICcsICdqb2luJywgc3RyaW5nX3Rlc3RzLlNlcXVlbmNlKHUnd3h5eicpKQorCisgICAgZGVmIHRlc3Rfc3RyaXAoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3Rfc3RyaXAoc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB1ImhlbGxvIi5zdHJpcCwgIlx4ZmYiKQorCisgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QudGVzdF9yZXBsYWNlKHNlbGYpCisKKyAgICAgICAgIyBtZXRob2QgY2FsbCBmb3J3YXJkZWQgZnJvbSBzdHIgaW1wbGVtZW50YXRpb24gYmVjYXVzZSBvZiB1bmljb2RlIGFyZ3VtZW50CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KHUnb25lQHR3byF0aHJlZSEnLCAnb25lIXR3byF0aHJlZSEnLCAncmVwbGFjZScsIHUnIScsIHUnQCcsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgJ3JlcGxhY2UnLnJlcGxhY2UsIHUiciIsIDQyKQorCisgICAgZGVmIHRlc3RfY29tcGFyaXNvbihzZWxmKToKKyAgICAgICAgIyBDb21wYXJpc29uczoKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWJjJyA9PSAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhYmMnID09IHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWJjJyA9PSB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiY2QnID4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYWJjZCcgPiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiY2QnID4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYmMnIDwgJ2FiY2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2FiYycgPCB1J2FiY2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYmMnIDwgdSdhYmNkJykKKworICAgICAgICBpZiAwOgorICAgICAgICAgICAgIyBNb3ZlIHRoZXNlIHRlc3RzIHRvIGEgVW5pY29kZSBjb2xsYXRpb24gbW9kdWxlIHRlc3QuLi4KKyAgICAgICAgICAgICMgVGVzdGluZyBVVEYtMTYgY29kZSBwb2ludCBvcmRlciBjb21wYXJpc29ucy4uLgorCisgICAgICAgICAgICAjIE5vIHN1cnJvZ2F0ZXMsIG5vIGZpeHVwIHJlcXVpcmVkLgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXHUwMDYxJyA8IHUnXHUyMGFjJykKKyAgICAgICAgICAgICMgTm9uIHN1cnJvZ2F0ZSBiZWxvdyBzdXJyb2dhdGUgdmFsdWUsIG5vIGZpeHVwIHJlcXVpcmVkCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcdTAwNjEnIDwgdSdcdWQ4MDBcdWRjMDInKQorCisgICAgICAgICAgICAjIE5vbiBzdXJyb2dhdGUgYWJvdmUgc3Vycm9nYXRlIHZhbHVlLCBmaXh1cCByZXF1aXJlZAorICAgICAgICAgICAgZGVmIHRlc3RfbGVjbXAocywgczIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzIDwgczIpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0X2ZpeHVwKHMpOgorICAgICAgICAgICAgICAgIHMyID0gdSdcdWQ4MDBcdWRjMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkOTAwXHVkYzAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZGEwMFx1ZGMwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWRiMDBcdWRjMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkODAwXHVkZDAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZDkwMFx1ZGQwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWRhMDBcdWRkMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkYjAwXHVkZDAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZDgwMFx1ZGUwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWQ5MDBcdWRlMDEnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkYTAwXHVkZTAxJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZGIwMFx1ZGUwMScKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWQ4MDBcdWRmZmYnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKyAgICAgICAgICAgICAgICBzMiA9IHUnXHVkOTAwXHVkZmZmJworICAgICAgICAgICAgICAgIHRlc3RfbGVjbXAocywgczIpCisgICAgICAgICAgICAgICAgczIgPSB1J1x1ZGEwMFx1ZGZmZicKKyAgICAgICAgICAgICAgICB0ZXN0X2xlY21wKHMsIHMyKQorICAgICAgICAgICAgICAgIHMyID0gdSdcdWRiMDBcdWRmZmYnCisgICAgICAgICAgICAgICAgdGVzdF9sZWNtcChzLCBzMikKKworICAgICAgICAgICAgICAgIHRlc3RfZml4dXAodSdcdWUwMDAnKQorICAgICAgICAgICAgICAgIHRlc3RfZml4dXAodSdcdWZmNjEnKQorCisgICAgICAgICMgU3Vycm9nYXRlcyBvbiBib3RoIHNpZGVzLCBubyBmaXh1cCByZXF1aXJlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcdWQ4MDBcdWRjMDInIDwgdSdcdWQ4NGRcdWRjNTYnKQorCisgICAgZGVmIHRlc3RfY2FwaXRhbGl6ZShzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLkNvbW1vblRlc3QudGVzdF9jYXBpdGFsaXplKHNlbGYpCisgICAgICAgICMgY2hlY2sgdGhhdCB0aXRsZWNhc2VkIGNoYXJzIGFyZSBsb3dlcmVkIGNvcnJlY3RseQorICAgICAgICAjIFx1MWZmYyBpcyB0aGUgdGl0bGVjYXNlZCBjaGFyCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J1x1MWZmY1x1MWZmM1x1MWZmM1x1MWZmMycsCisgICAgICAgICAgICAgICAgICAgICAgICB1J1x1MWZmM1x1MWZmM1x1MWZmY1x1MWZmYycsICdjYXBpdGFsaXplJykKKyAgICAgICAgIyBjaGVjayB3aXRoIGNhc2VkIG5vbi1sZXR0ZXIgY2hhcnMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnXHUyNGM1XHUyNGU4XHUyNGUzXHUyNGQ3XHUyNGRlXHUyNGRkJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUnXHUyNGM1XHUyNGNlXHUyNGM5XHUyNGJkXHUyNGM0XHUyNGMzJywgJ2NhcGl0YWxpemUnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwodSdcdTI0YzVcdTI0ZThcdTI0ZTNcdTI0ZDdcdTI0ZGVcdTI0ZGQnLAorICAgICAgICAgICAgICAgICAgICAgICAgdSdcdTI0ZGZcdTI0ZThcdTI0ZTNcdTI0ZDdcdTI0ZGVcdTI0ZGQnLCAnY2FwaXRhbGl6ZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J1x1MjE2MFx1MjE3MVx1MjE3MicsCisgICAgICAgICAgICAgICAgICAgICAgICB1J1x1MjE2MFx1MjE2MVx1MjE2MicsICdjYXBpdGFsaXplJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnXHUyMTYwXHUyMTcxXHUyMTcyJywKKyAgICAgICAgICAgICAgICAgICAgICAgIHUnXHUyMTcwXHUyMTcxXHUyMTcyJywgJ2NhcGl0YWxpemUnKQorICAgICAgICAjIGNoZWNrIHdpdGggTGwgY2hhcnMgd2l0aCBubyB1cHBlciAtIG5vdGhpbmcgY2hhbmdlcyBoZXJlCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J1x1MDE5Ylx1MWQwMFx1MWQ4Nlx1MDIyMVx1MWZiNycsCisgICAgICAgICAgICAgICAgICAgICAgICB1J1x1MDE5Ylx1MWQwMFx1MWQ4Nlx1MDIyMVx1MWZiNycsICdjYXBpdGFsaXplJykKKworICAgIGRlZiB0ZXN0X2lzbG93ZXIoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2lzbG93ZXIoc2VsZikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnXHUxRkZjJywgJ2lzbG93ZXInKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9pc2xvd2VyX25vbl9ibXAoc2VsZik6CisgICAgICAgICMgbm9uLUJNUCwgdXBwZXJjYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodSdcVTAwMDEwNDAxJy5pc2xvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodSdcVTAwMDEwNDI3Jy5pc2xvd2VyKCkpCisgICAgICAgICMgbm9uLUJNUCwgbG93ZXJjYXNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0MjknLmlzbG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXFUwMDAxMDQ0RScuaXNsb3dlcigpKQorICAgICAgICAjIG5vbi1CTVAsIG5vbi1jYXNlZAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxRjQwRCcuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHUnXFUwMDAxRjQ2RicuaXNsb3dlcigpKQorCisgICAgZGVmIHRlc3RfaXN1cHBlcihzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LnRlc3RfaXN1cHBlcihzZWxmKQorICAgICAgICBpZiBub3Qgc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2phdmEnKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1J1x1MUZGYycsICdpc3VwcGVyJykKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXN1cHBlcl9ub25fYm1wKHNlbGYpOgorICAgICAgICAjIG5vbi1CTVAsIHVwcGVyY2FzZQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcVTAwMDEwNDAxJy5pc3VwcGVyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0MjcnLmlzdXBwZXIoKSkKKyAgICAgICAgIyBub24tQk1QLCBsb3dlcmNhc2UKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMTA0MjknLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMTA0NEUnLmlzdXBwZXIoKSkKKyAgICAgICAgIyBub24tQk1QLCBub24tY2FzZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMUY0MEQnLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMUY0NkYnLmlzdXBwZXIoKSkKKworICAgIGRlZiB0ZXN0X2lzdGl0bGUoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2lzdGl0bGUoc2VsZikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdSdcdTFGRmMnLCAnaXN0aXRsZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnR3JlZWsgXHUxRkZjaXRsZWNhc2VzIC4uLicsICdpc3RpdGxlJykKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXN0aXRsZV9ub25fYm1wKHNlbGYpOgorICAgICAgICAjIG5vbi1CTVAsIHVwcGVyY2FzZSArIGxvd2VyY2FzZQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcVTAwMDEwNDAxXFUwMDAxMDQyOScuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcVTAwMDEwNDI3XFUwMDAxMDQ0RScuaXN0aXRsZSgpKQorICAgICAgICAjIGFwcGFyZW50bHkgdGhlcmUgYXJlIG5vIHRpdGxlY2FzZWQgKEx0KSBub24tQk1QIGNoYXJzIGluIFVuaWNvZGUgNgorICAgICAgICBmb3IgY2ggaW4gW3UnXFUwMDAxMDQyOScsIHUnXFUwMDAxMDQ0RScsIHUnXFUwMDAxRjQwRCcsIHUnXFUwMDAxRjQ2RiddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjaC5pc3RpdGxlKCksICd7IXJ9IGlzIG5vdCB0aXRsZScuZm9ybWF0KGNoKSkKKworICAgIGRlZiB0ZXN0X2lzc3BhY2Uoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2lzc3BhY2Uoc2VsZikKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdSdcdTIwMDAnLCAnaXNzcGFjZScpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnXHUyMDBhJywgJ2lzc3BhY2UnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChGYWxzZSwgdSdcdTIwMTQnLCAnaXNzcGFjZScpCisKKyAgICBAcmVxdWlyZXNfd2lkZV9idWlsZAorICAgIGRlZiB0ZXN0X2lzc3BhY2Vfbm9uX2JtcChzZWxmKToKKyAgICAgICAgIyBhcHBhcmVudGx5IHRoZXJlIGFyZSBubyBub24tQk1QIHNwYWNlcyBjaGFycyBpbiBVbmljb2RlIDYKKyAgICAgICAgZm9yIGNoIGluIFt1J1xVMDAwMTA0MDEnLCB1J1xVMDAwMTA0MjcnLCB1J1xVMDAwMTA0MjknLCB1J1xVMDAwMTA0NEUnLAorICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxRjQwRCcsIHUnXFUwMDAxRjQ2RiddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjaC5pc3NwYWNlKCksICd7IXJ9IGlzIG5vdCBzcGFjZS4nLmZvcm1hdChjaCkpCisKKyAgICBAcmVxdWlyZXNfd2lkZV9idWlsZAorICAgIGRlZiB0ZXN0X2lzYWxudW1fbm9uX2JtcChzZWxmKToKKyAgICAgICAgZm9yIGNoIGluIFt1J1xVMDAwMTA0MDEnLCB1J1xVMDAwMTA0MjcnLCB1J1xVMDAwMTA0MjknLCB1J1xVMDAwMTA0NEUnLAorICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxRDdGNicsIHUnXFUwMDAxMDRBMCcsIHUnXFUwMDAxMDRBMCcsIHUnXFUwMDAxRjEwNyddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoLmlzYWxudW0oKSwgJ3shcn0gaXMgYWxudW0uJy5mb3JtYXQoY2gpKQorCisgICAgZGVmIHRlc3RfaXNhbHBoYShzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LnRlc3RfaXNhbHBoYShzZWxmKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x1MUZGYycsICdpc2FscGhhJykKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXNhbHBoYV9ub25fYm1wKHNlbGYpOgorICAgICAgICAjIG5vbi1CTVAsIGNhc2VkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0MDEnLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXFUwMDAxMDQyNycuaXNhbHBoYSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcVTAwMDEwNDI5Jy5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1xVMDAwMTA0NEUnLmlzYWxwaGEoKSkKKyAgICAgICAgIyBub24tQk1QLCBub24tY2FzZWQKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMUY0MEQnLmlzYWxwaGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1J1xVMDAwMUY0NkYnLmlzYWxwaGEoKSkKKworICAgIGRlZiB0ZXN0X2lzZGVjaW1hbChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnJywgJ2lzZGVjaW1hbCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1J2EnLCAnaXNkZWNpbWFsJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdScwJywgJ2lzZGVjaW1hbCcpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1J1x1MjQ2MCcsICdpc2RlY2ltYWwnKSAjIENJUkNMRUQgRElHSVQgT05FCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1J1x4YmMnLCAnaXNkZWNpbWFsJykgIyBWVUxHQVIgRlJBQ1RJT04gT05FIFFVQVJURVIKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdSdcdTA2NjAnLCAnaXNkZWNpbWFsJykgIyBBUkFCSUMtSU5ESUMgRElHSVQgWkVSTworICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1JzAxMjM0NTY3ODknLCAnaXNkZWNpbWFsJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoRmFsc2UsIHUnMDEyMzQ1Njc4OWEnLCAnaXNkZWNpbWFsJykKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2FiYycsICdpc2RlY2ltYWwnLCA0MikKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXNkZWNpbWFsX25vbl9ibXAoc2VsZik6CisgICAgICAgIGZvciBjaCBpbiBbdSdcVTAwMDEwNDAxJywgdSdcVTAwMDEwNDI3JywgdSdcVTAwMDEwNDI5JywgdSdcVTAwMDEwNDRFJywKKyAgICAgICAgICAgICAgICAgICB1J1xVMDAwMUY0MEQnLCB1J1xVMDAwMUY0NkYnLCB1J1xVMDAwMTEwNjUnLCB1J1xVMDAwMUYxMDcnXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2guaXNkZWNpbWFsKCksICd7IXJ9IGlzIG5vdCBkZWNpbWFsLicuZm9ybWF0KGNoKSkKKyAgICAgICAgZm9yIGNoIGluIFt1J1xVMDAwMUQ3RjYnLCB1J1xVMDAwMTA0QTAnLCB1J1xVMDAwMTA0QTAnXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaC5pc2RlY2ltYWwoKSwgJ3shcn0gaXMgZGVjaW1hbC4nLmZvcm1hdChjaCkpCisKKyAgICBkZWYgdGVzdF9pc2RpZ2l0KHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QudGVzdF9pc2RpZ2l0KHNlbGYpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnXHUyNDYwJywgJ2lzZGlnaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChGYWxzZSwgdSdceGJjJywgJ2lzZGlnaXQnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x1MDY2MCcsICdpc2RpZ2l0JykKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXNkaWdpdF9ub25fYm1wKHNlbGYpOgorICAgICAgICBmb3IgY2ggaW4gW3UnXFUwMDAxMDQwMScsIHUnXFUwMDAxMDQyNycsIHUnXFUwMDAxMDQyOScsIHUnXFUwMDAxMDQ0RScsCisgICAgICAgICAgICAgICAgICAgdSdcVTAwMDFGNDBEJywgdSdcVTAwMDFGNDZGJywgdSdcVTAwMDExMDY1J106CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNoLmlzZGlnaXQoKSwgJ3shcn0gaXMgbm90IGEgZGlnaXQuJy5mb3JtYXQoY2gpKQorICAgICAgICBmb3IgY2ggaW4gW3UnXFUwMDAxRDdGNicsIHUnXFUwMDAxMDRBMCcsIHUnXFUwMDAxMDRBMCcsIHUnXFUwMDAxRjEwNyddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoLmlzZGlnaXQoKSwgJ3shcn0gaXMgYSBkaWdpdC4nLmZvcm1hdChjaCkpCisKKyAgICBkZWYgdGVzdF9pc251bWVyaWMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1JycsICdpc251bWVyaWMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChGYWxzZSwgdSdhJywgJ2lzbnVtZXJpYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KFRydWUsIHUnMCcsICdpc251bWVyaWMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x1MjQ2MCcsICdpc251bWVyaWMnKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWxub2ZpeChUcnVlLCB1J1x4YmMnLCAnaXNudW1lcmljJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdSdcdTA2NjAnLCAnaXNudW1lcmljJykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsbm9maXgoVHJ1ZSwgdScwMTIzNDU2Nzg5JywgJ2lzbnVtZXJpYycpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbG5vZml4KEZhbHNlLCB1JzAxMjM0NTY3ODlhJywgJ2lzbnVtZXJpYycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1ImFiYyIuaXNudW1lcmljLCA0MikKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfaXNudW1lcmljX25vbl9ibXAoc2VsZik6CisgICAgICAgIGZvciBjaCBpbiBbdSdcVTAwMDEwNDAxJywgdSdcVTAwMDEwNDI3JywgdSdcVTAwMDEwNDI5JywgdSdcVTAwMDEwNDRFJywKKyAgICAgICAgICAgICAgICAgICB1J1xVMDAwMUY0MEQnLCB1J1xVMDAwMUY0NkYnXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2guaXNudW1lcmljKCksICd7IXJ9IGlzIG5vdCBudW1lcmljLicuZm9ybWF0KGNoKSkKKyAgICAgICAgZm9yIGNoIGluIFt1J1xVMDAwMTAxMDcnLCB1J1xVMDAwMUQ3RjYnLCB1J1xVMDAwMjNiMWInLAorICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDRBMCcsIHUnXFUwMDAxRjEwNyddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoLmlzbnVtZXJpYygpLCAneyFyfSBpcyBudW1lcmljLicuZm9ybWF0KGNoKSkKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3Rfc3Vycm9nYXRlcyhzZWxmKToKKyAgICAgICAgIyB0aGlzIHRlc3QgYWN0dWFsbHkgcGFzc2VzIG9uIG5hcnJvdyB0b28sIGJ1dCBpdCdzIGp1c3QgYnkgYWNjaWRlbnQuCisgICAgICAgICMgU3Vycm9nYXRlcyBhcmUgc2VlbiBhcyBub24tY2FzZWQgY2hhcnMsIHNvIHUnWFx1RDgwMFgnIGlzIGFzCisgICAgICAgICMgdXBwZXJjYXNlIGFzICdYIFgnCisgICAgICAgIGZvciBzIGluICh1J2FcdUQ4MDBiXHVERkZGJywgdSdhXHVERkZGYlx1RDgwMCcsCisgICAgICAgICAgICAgICAgICB1J2FcdUQ4MDBiXHVERkZGYScsIHUnYVx1REZGRmJcdUQ4MDBhJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2xvd2VyKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXN1cHBlcigpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzdGl0bGUoKSkKKyAgICAgICAgZm9yIHMgaW4gKHUnQVx1RDgwMEJcdURGRkYnLCB1J0FcdURGRkZCXHVEODAwJywKKyAgICAgICAgICAgICAgICAgIHUnQVx1RDgwMEJcdURGRkZBJywgdSdBXHVERkZGQlx1RDgwMEEnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc2xvd2VyKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3VwcGVyKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3RpdGxlKCkpCisKKyAgICAgICAgZm9yIG1ldGhfbmFtZSBpbiAoJ2lzbG93ZXInLCAnaXN1cHBlcicsICdpc3RpdGxlJyk6CisgICAgICAgICAgICBtZXRoID0gZ2V0YXR0cih1bmljb2RlLCBtZXRoX25hbWUpCisgICAgICAgICAgICBmb3IgcyBpbiAodSdcdUQ4MDAnLCB1J1x1REZGRicsIHUnXHVEODAwXHVEODAwJywgdSdcdURGRkZcdURGRkYnKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1ldGgocyksICclci4lcygpIGlzIEZhbHNlJyAlIChzLCBtZXRoX25hbWUpKQorCisgICAgICAgIGZvciBtZXRoX25hbWUgaW4gKCdpc2FscGhhJywgJ2lzYWxudW0nLCAnaXNkaWdpdCcsICdpc3NwYWNlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzZGVjaW1hbCcsICdpc251bWVyaWMnKToKKyAgICAgICAgICAgIG1ldGggPSBnZXRhdHRyKHVuaWNvZGUsIG1ldGhfbmFtZSkKKyAgICAgICAgICAgIGZvciBzIGluICh1J1x1RDgwMCcsIHUnXHVERkZGJywgdSdcdUQ4MDBcdUQ4MDAnLCB1J1x1REZGRlx1REZGRicsCisgICAgICAgICAgICAgICAgICAgICAgdSdhXHVEODAwYlx1REZGRicsIHUnYVx1REZGRmJcdUQ4MDAnLAorICAgICAgICAgICAgICAgICAgICAgIHUnYVx1RDgwMGJcdURGRkZhJywgdSdhXHVERkZGYlx1RDgwMGEnKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1ldGgocyksICclci4lcygpIGlzIEZhbHNlJyAlIChzLCBtZXRoX25hbWUpKQorCisKKyAgICBAcmVxdWlyZXNfd2lkZV9idWlsZAorICAgIGRlZiB0ZXN0X2xvd2VyKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X2xvd2VyKHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDI3Jy5sb3dlcigpLCB1J1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQyN1xVMDAwMTA0MjcnLmxvd2VyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDRGXFUwMDAxMDQ0RicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDI3XFUwMDAxMDQ0RicubG93ZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0NEZcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1hcVTAwMDEwNDI3eFxVMDAwMTA0NEYnLmxvd2VyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSd4XFUwMDAxMDQ0RnhcVTAwMDEwNDRGJykKKworICAgIEByZXF1aXJlc193aWRlX2J1aWxkCisgICAgZGVmIHRlc3RfdXBwZXIoc2VsZik6CisgICAgICAgIHN0cmluZ190ZXN0cy5Db21tb25UZXN0LnRlc3RfdXBwZXIoc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEYnLnVwcGVyKCksIHUnXFUwMDAxMDQyNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDRGXFUwMDAxMDQ0RicudXBwZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0MjdcVTAwMDEwNDI3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0MjdcVTAwMDEwNDRGJy51cHBlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0MjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnWFxVMDAwMTA0Mjd4XFUwMDAxMDQ0RicudXBwZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1hcVTAwMDEwNDI3WFxVMDAwMTA0MjcnKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF9jYXBpdGFsaXplKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X2NhcGl0YWxpemUoc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEYnLmNhcGl0YWxpemUoKSwgdSdcVTAwMDEwNDI3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEZcVTAwMDEwNDRGJy5jYXBpdGFsaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDI3XFUwMDAxMDQ0RicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDI3XFUwMDAxMDQ0RicuY2FwaXRhbGl6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQ0RlxVMDAwMTA0MjcnLmNhcGl0YWxpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0MjdcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1hcVTAwMDEwNDI3eFxVMDAwMTA0NEYnLmNhcGl0YWxpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1hcVTAwMDEwNDRGeFxVMDAwMTA0NEYnKQorCisgICAgQHJlcXVpcmVzX3dpZGVfYnVpbGQKKyAgICBkZWYgdGVzdF90aXRsZShzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LnRlc3RfdGl0bGUoc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEYnLnRpdGxlKCksIHUnXFUwMDAxMDQyNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDRGXFUwMDAxMDQ0RicudGl0bGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0MjdcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEZcVTAwMDEwNDRGIFxVMDAwMTA0NEZcVTAwMDEwNDRGJy50aXRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYgXFUwMDAxMDQyN1xVMDAwMTA0NEYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYgXFUwMDAxMDQyN1xVMDAwMTA0NEYnLnRpdGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDI3XFUwMDAxMDQ0RiBcVTAwMDEwNDI3XFUwMDAxMDQ0RicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDRGXFUwMDAxMDQyNyBcVTAwMDEwNDRGXFUwMDAxMDQyNycudGl0bGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0MjdcVTAwMDEwNDRGIFxVMDAwMTA0MjdcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1hcVTAwMDEwNDI3eFxVMDAwMTA0NEYgWFxVMDAwMTA0Mjd4XFUwMDAxMDQ0RicudGl0bGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1hcVTAwMDEwNDRGeFxVMDAwMTA0NEYgWFxVMDAwMTA0NEZ4XFUwMDAxMDQ0RicpCisKKyAgICBAcmVxdWlyZXNfd2lkZV9idWlsZAorICAgIGRlZiB0ZXN0X3N3YXBjYXNlKHNlbGYpOgorICAgICAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdC50ZXN0X3N3YXBjYXNlKHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDRGJy5zd2FwY2FzZSgpLCB1J1xVMDAwMTA0MjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQyNycuc3dhcGNhc2UoKSwgdSdcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1xVMDAwMTA0NEZcVTAwMDEwNDRGJy5zd2FwY2FzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnXFUwMDAxMDQyN1xVMDAwMTA0MjcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXFUwMDAxMDQyN1xVMDAwMTA0NEYnLnN3YXBjYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcVTAwMDEwNDRGXFUwMDAxMDQyNycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcVTAwMDEwNDRGXFUwMDAxMDQyNycuc3dhcGNhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1xVMDAwMTA0MjdcVTAwMDEwNDRGJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1hcVTAwMDEwNDI3eFxVMDAwMTA0NEYnLnN3YXBjYXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSd4XFUwMDAxMDQ0RlhcVTAwMDEwNDI3JykKKworICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgorICAgICAgICAjIFRlc3RpbmcgVW5pY29kZSBjb250YWlucyBtZXRob2QKKyAgICAgICAgc2VsZi5hc3NlcnRJbignYScsIHUnYWJkYicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCB1J2JkYWInKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgdSdiZGFiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ2EnLCB1J2JkYmEnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgdSdiZGJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2EnLCB1J2JkYmEnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnYScsIHUnYmRiJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbih1J2EnLCAnYmRiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2EnLCAnYmRiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdhJywgKCdhJywxLE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYScsICgxLE5vbmUsJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2EnLCAoMSxOb25lLHUnYScpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgKCdhJywxLE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgKDEsTm9uZSwnYScpKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgKDEsTm9uZSx1J2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsICgneCcsMSx1J3knKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYScsICgneCcsMSxOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbih1J2FiY2QnLCB1J2FiY3h4eHgnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnYWInLCB1J2FiY2QnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhYicsIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2FiJywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdhYicsICgxLE5vbmUsdSdhYicpKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnJywgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEluKCcnLCB1J2FiYycpCisKKyAgICAgICAgIyBJZiB0aGUgZm9sbG93aW5nIGZhaWxzIGVpdGhlcgorICAgICAgICAjIHRoZSBjb250YWlucyBvcGVyYXRvciBkb2VzIG5vdCBwcm9wYWdhdGUgVW5pY29kZUVycm9ycyBvcgorICAgICAgICAjIHNvbWVvbmUgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgZW5jb2RpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCAnZ1x4ZTJ0ZWF1Jy5fX2NvbnRhaW5zX18sIHUnXHhlMicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgdSdnXHhlMnRlYXUnLl9fY29udGFpbnNfXywgJ1x4ZTInKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odScnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignJywgdScnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnJywgdScnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnJywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJycsIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1JycsIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbih1J1wwJywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ1wwJywgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnXDAnLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdcMCcsICdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ1wwJywgdSdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdcMCcsIHUnXDBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnXDAnLCAnYWJjXDAnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdcMCcsIHUnYWJjXDAnKQorICAgICAgICBzZWxmLmFzc2VydEluKHUnXDAnLCB1J2FiY1wwJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2EnLCAnXDBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgdSdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdhJywgdSdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odSdhc2RmJywgJ2FzZGYnKQorICAgICAgICBzZWxmLmFzc2VydEluKCdhc2RmJywgdSdhc2RmJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1J2FzZGYnLCB1J2FzZGYnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnYXNkZicsICdhc2QnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKCdhc2RmJywgdSdhc2QnKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUnYXNkZicsIHUnYXNkJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbih1J2FzZGYnLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignYXNkZicsIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbih1J2FzZGYnLCB1JycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1ImFiYyIuX19jb250YWluc19fKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiYWJjIi5fX2NvbnRhaW5zX18sIG9iamVjdCgpKQorCisgICAgZGVmIHRlc3RfZm9ybWF0dGluZyhzZWxmKToKKyAgICAgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVW5pY29kZVVzZXJTdHJpbmdUZXN0LnRlc3RfZm9ybWF0dGluZyhzZWxmKQorICAgICAgICAjIFRlc3RpbmcgVW5pY29kZSBmb3JtYXR0aW5nIHN0cmluZ3MuLi4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiVzLCAlcyIgJSAodSJhYmMiLCAiYWJjIiksIHUnYWJjLCBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJXMsICVzLCAlaSwgJWYsICU1LjJmIiAlICh1ImFiYyIsICJhYmMiLCAxLCAyLCAzKSwgdSdhYmMsIGFiYywgMSwgMi4wMDAwMDAsICAzLjAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgMSwgLTIsIDMpLCB1J2FiYywgYWJjLCAxLCAtMi4wMDAwMDAsICAzLjAwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAzLjUpLCB1J2FiYywgYWJjLCAtMSwgLTIuMDAwMDAwLCAgMy41MCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIlcywgJXMsICVpLCAlZiwgJTUuMmYiICUgKHUiYWJjIiwgImFiYyIsIC0xLCAtMiwgMy41NyksIHUnYWJjLCBhYmMsIC0xLCAtMi4wMDAwMDAsICAzLjU3JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiVzLCAlcywgJWksICVmLCAlNS4yZiIgJSAodSJhYmMiLCAiYWJjIiwgLTEsIC0yLCAxMDAzLjU3KSwgdSdhYmMsIGFiYywgLTEsIC0yLjAwMDAwMCwgMTAwMy41NycpCisgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiVyLCAlciIgJSAodSJhYmMiLCAiYWJjIiksIHUidSdhYmMnLCAnYWJjJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIlKHgpcywgJSh5KXMiICUgeyd4Jzp1ImFiYyIsICd5JzoiZGVmIn0sIHUnYWJjLCBkZWYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJSh4KXMsICUoXHhmYylzIiAlIHsneCc6dSJhYmMiLCB1J1x4ZmMnOiJkZWYifSwgdSdhYmMsIGRlZicpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JyVjJyAlIDB4MTIzNCwgdSdcdTEyMzQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB1IiVjIi5fX21vZF9fLCAoc3lzLm1heHVuaWNvZGUrMSwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1IiUuMVx1MTAzMmYiLl9fbW9kX18sICgxLjAvMykpCisKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZSgweDAwLDB4ODApOgorICAgICAgICAgICAgY2hhciA9IGNocihudW0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiJWMiICUgY2hhciwgdW5pY29kZShjaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIlYyIgJSBudW0sIHVuaWNvZGUoY2hhcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hhciA9PSB1IiVjIiAlIGNoYXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hhciA9PSB1IiVjIiAlIG51bSkKKyAgICAgICAgIyBJc3N1ZSA3NjQ5CisgICAgICAgIGZvciBudW0gaW4gcmFuZ2UoMHg4MCwweDEwMCk6CisgICAgICAgICAgICB1Y2hhciA9IHVuaWNocihudW0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVjaGFyLCB1IiVjIiAlIG51bSkgICAjIHdvcmtzIG9ubHkgd2l0aCBpbnRzCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVjaGFyLCB1IiVjIiAlIHVjaGFyKSAjIGFuZCB1bmljb2RlIGNoYXJzCisgICAgICAgICAgICAjIHRoZSBpbXBsaWNpdCBkZWNvZGluZyBzaG91bGQgZmFpbCBmb3Igbm9uLWFzY2lpIGNoYXJzCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIHUiJWMiLl9fbW9kX18sIGNocihudW0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCB1IiVzIi5fX21vZF9fLCBjaHIobnVtKSkKKworICAgICAgICAjIGZvcm1hdHRpbmcgam9icyBkZWxlZ2F0ZWQgZnJvbSB0aGUgc3RyaW5nIGltcGxlbWVudGF0aW9uOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcuLi4lKGZvbylzLi4uJyAlIHsnZm9vJzp1ImFiYyJ9LCB1Jy4uLmFiYy4uLicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy4uLiUoZm9vKXMuLi4nICUgeydmb28nOiJhYmMifSwgJy4uLmFiYy4uLicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzoiYWJjIn0sICcuLi5hYmMuLi4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcuLi4lKGZvbylzLi4uJyAlIHt1J2Zvbyc6dSJhYmMifSwgdScuLi5hYmMuLi4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcuLi4lKGZvbylzLi4uJyAlIHt1J2Zvbyc6dSJhYmMiLCdkZWYnOjEyM30sICB1Jy4uLmFiYy4uLicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJy4uLiUoZm9vKXMuLi4nICUge3UnZm9vJzp1ImFiYyIsdSdkZWYnOjEyM30sIHUnLi4uYWJjLi4uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnLi4uJXMuLi4lcy4uLiVzLi4uJXMuLi4nICUgKDEsMiwzLHUiYWJjIiksIHUnLi4uMS4uLjIuLi4zLi4uYWJjLi4uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnLi4uJSUuLi4lJXMuLi4lcy4uLiVzLi4uJXMuLi4lcy4uLicgJSAoMSwyLDMsdSJhYmMiKSwgdScuLi4lLi4uJXMuLi4xLi4uMi4uLjMuLi5hYmMuLi4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcuLi4lcy4uLicgJSB1ImFiYyIsIHUnLi4uYWJjLi4uJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJSpzJyAlICg1LHUnYWJjJywpLCB1JyAgYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJSpzJyAlICgtNSx1J2FiYycsKSwgdSdhYmMgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyUqLipzJyAlICg1LDIsdSdhYmMnLCksIHUnICAgYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclKi4qcycgJSAoNSwzLHUnYWJjJywpLCB1JyAgYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJWkgJSouKnMnICUgKDEwLCA1LDMsdSdhYmMnLCksIHUnMTAgICBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCclaSVzICUqLipzJyAlICgxMCwgMywgNSwgMywgdSdhYmMnLCksIHUnMTAzICAgYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJWMnICUgdSdhJywgdSdhJykKKyAgICAgICAgY2xhc3MgV3JhcHBlcjoKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1J1x1MTIzNCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJXMnICUgV3JhcHBlcigpLCB1J1x1MTIzNCcpCisKKyAgICBAdGVzdF9zdXBwb3J0LmNweXRob25fb25seQorICAgIGRlZiB0ZXN0X2Zvcm1hdHRpbmdfaHVnZV9wcmVjaXNpb24oc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBJTlRfTUFYCisgICAgICAgIGZvcm1hdF9zdHJpbmcgPSB1IiUue31mIi5mb3JtYXQoSU5UX01BWCArIDEpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXRfc3RyaW5nICUgMi4zNAorCisgICAgZGVmIHRlc3RfZm9ybWF0dGluZ19odWdlX3dpZHRoKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gdSIle31mIi5mb3JtYXQoc3lzLm1heHNpemUgKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0X3N0cmluZyAlIDIuMzQKKworICAgIGRlZiB0ZXN0X3N0YXJ0c3dpdGhfZW5kc3dpdGhfZXJyb3JzKHNlbGYpOgorICAgICAgICBmb3IgbWV0aCBpbiAodSdmb28nLnN0YXJ0c3dpdGgsIHUnZm9vJy5lbmRzd2l0aCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgbWV0aCgnXHhmZicpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcikgYXMgY206CisgICAgICAgICAgICAgICAgbWV0aChbJ2YnXSkKKyAgICAgICAgICAgIGV4YyA9IHN0cihjbS5leGNlcHRpb24pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCd1bmljb2RlJywgZXhjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignc3RyJywgZXhjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigndHVwbGUnLCBleGMpCisKKyAgICBAdGVzdF9zdXBwb3J0LnJ1bl93aXRoX2xvY2FsZSgnTENfQUxMJywgJ2RlX0RFJywgJ2ZyX0ZSJykKKyAgICBkZWYgdGVzdF9mb3JtYXRfZmxvYXQoc2VsZik6CisgICAgICAgICMgc2hvdWxkIG5vdCBmb3JtYXQgd2l0aCBhIGNvbW1hLCBidXQgYWx3YXlzIHdpdGggQyBsb2NhbGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JzEuMCcsIHUnJS4xZicgJSAxLjApCisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKKyAgICAgICAgIyB1bmljb2RlKG9iaikgdGVzdHMgKHRoaXMgbWFwcyB0byBQeU9iamVjdF9Vbmljb2RlKCkgYXQgQyBsZXZlbCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdW5pY29kZSh1J3VuaWNvZGUgcmVtYWlucyB1bmljb2RlJyksCisgICAgICAgICAgICB1J3VuaWNvZGUgcmVtYWlucyB1bmljb2RlJworICAgICAgICApCisKKyAgICAgICAgY2xhc3MgVW5pY29kZVN1YmNsYXNzKHVuaWNvZGUpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1bmljb2RlKFVuaWNvZGVTdWJjbGFzcygndW5pY29kZSBzdWJjbGFzcyBiZWNvbWVzIHVuaWNvZGUnKSksCisgICAgICAgICAgICB1J3VuaWNvZGUgc3ViY2xhc3MgYmVjb21lcyB1bmljb2RlJworICAgICAgICApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHVuaWNvZGUoJ3N0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byB1bmljb2RlJyksCisgICAgICAgICAgICB1J3N0cmluZ3MgYXJlIGNvbnZlcnRlZCB0byB1bmljb2RlJworICAgICAgICApCisKKyAgICAgICAgY2xhc3MgVW5pY29kZUNvbXBhdDoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1bmljb2RlKFVuaWNvZGVDb21wYXQoJ19fdW5pY29kZV9fIGNvbXBhdGlibGUgb2JqZWN0cyBhcmUgcmVjb2duaXplZCcpKSwKKyAgICAgICAgICAgIHUnX191bmljb2RlX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJykKKworICAgICAgICBjbGFzcyBTdHJpbmdDb21wYXQ6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYueAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1bmljb2RlKFN0cmluZ0NvbXBhdCgnX19zdHJfXyBjb21wYXRpYmxlIG9iamVjdHMgYXJlIHJlY29nbml6ZWQnKSksCisgICAgICAgICAgICB1J19fc3RyX18gY29tcGF0aWJsZSBvYmplY3RzIGFyZSByZWNvZ25pemVkJworICAgICAgICApCisKKyAgICAgICAgIyB1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKToKKworICAgICAgICBvID0gU3RyaW5nQ29tcGF0KCd1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShvKSwgdSd1bmljb2RlKG9iaikgaXMgY29tcGF0aWJsZSB0byBzdHIoKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG8pLCAndW5pY29kZShvYmopIGlzIGNvbXBhdGlibGUgdG8gc3RyKCknKQorCisgICAgICAgICMgJS1mb3JtYXR0aW5nIGFuZCAuX191bmljb2RlX18oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlQ29tcGF0KHUidSclcycgJSBvYmogdXNlcyBvYmouX191bmljb2RlX18oKSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUidSclcycgJSBvYmogdXNlcyBvYmouX191bmljb2RlX18oKSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSclcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGVDb21wYXQodSJ1JyVzJyAlIG9iaiBmYWxscyBiYWNrIHRvIG9iai5fX3N0cl9fKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1InUnJXMnICUgb2JqIGZhbGxzIGJhY2sgdG8gb2JqLl9fc3RyX18oKSIpCisKKyAgICAgICAgZm9yIG9iaiBpbiAoMTIzLCAxMjMuNDUsIDEyM0wpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKG9iaiksIHVuaWNvZGUoc3RyKG9iaikpKQorCisgICAgICAgICMgdW5pY29kZShvYmosIGVuY29kaW5nLCBlcnJvcikgdGVzdHMgKHRoaXMgbWFwcyB0bworICAgICAgICAjIFB5VW5pY29kZV9Gcm9tRW5jb2RlZE9iamVjdCgpIGF0IEMgbGV2ZWwpCisKKyAgICAgICAgaWYgbm90IHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdqYXZhJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBUeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgdW5pY29kZSwKKyAgICAgICAgICAgICAgICB1J2RlY29kaW5nIHVuaWNvZGUgaXMgbm90IHN1cHBvcnRlZCcsCisgICAgICAgICAgICAgICAgJ3V0Zi04JywKKyAgICAgICAgICAgICAgICAnc3RyaWN0JworICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1bmljb2RlKCdzdHJpbmdzIGFyZSBkZWNvZGVkIHRvIHVuaWNvZGUnLCAndXRmLTgnLCAnc3RyaWN0JyksCisgICAgICAgICAgICB1J3N0cmluZ3MgYXJlIGRlY29kZWQgdG8gdW5pY29kZScKKyAgICAgICAgKQorCisgICAgICAgIGlmIG5vdCBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnamF2YScpOgorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgICAgIGJ1ZiA9IGJ1ZmZlcignY2hhcmFjdGVyIGJ1ZmZlcnMgYXJlIGRlY29kZWQgdG8gdW5pY29kZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIHVuaWNvZGUoCisgICAgICAgICAgICAgICAgICAgIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgJ3V0Zi04JywKKyAgICAgICAgICAgICAgICAgICAgJ3N0cmljdCcKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgIHUnY2hhcmFjdGVyIGJ1ZmZlcnMgYXJlIGRlY29kZWQgdG8gdW5pY29kZScKKyAgICAgICAgICAgICkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHVuaWNvZGUsIDQyLCA0MiwgNDIpCisKKyAgICBkZWYgdGVzdF9jb2RlY3NfdXRmNyhzZWxmKToKKyAgICAgICAgdXRmVGVzdHMgPSBbCisgICAgICAgICAgICAodSdBXHUyMjYyXHUwMzkxLicsICdBK0ltSURrUS4nKSwgICAgICAgICAgICAgIyBSRkMyMTUyIGV4YW1wbGUKKyAgICAgICAgICAgICh1J0hpIE1vbSAtXHUyNjNhLSEnLCAnSGkgTW9tIC0rSmpvLS0hJyksICAgICAjIFJGQzIxNTIgZXhhbXBsZQorICAgICAgICAgICAgKHUnXHU2NUU1XHU2NzJDXHU4QTlFJywgJytaZVZuTElxZS0nKSwgICAgICAgICMgUkZDMjE1MiBleGFtcGxlCisgICAgICAgICAgICAodSdJdGVtIDMgaXMgXHUwMGEzMS4nLCAnSXRlbSAzIGlzICtBS00tMS4nKSwgIyBSRkMyMTUyIGV4YW1wbGUKKyAgICAgICAgICAgICh1JysnLCAnKy0nKSwKKyAgICAgICAgICAgICh1JystJywgJystLScpLAorICAgICAgICAgICAgKHUnKz8nLCAnKy0/JyksCisgICAgICAgICAgICAodSdcPycsICcrQUZ3PycpLAorICAgICAgICAgICAgKHUnKz8nLCAnKy0/JyksCisgICAgICAgICAgICAodXInXFw/JywgJytBRndBWEE/JyksCisgICAgICAgICAgICAodXInXFxcPycsICcrQUZ3QVhBQmM/JyksCisgICAgICAgICAgICAodXInKystLScsICcrLSstLS0nKSwKKyAgICAgICAgICAgICh1J1xVMDAwYWJjZGUnLCAnKzJtL2MzZy0nKSwgICAgICAgICAgICAgICAgICAjIHN1cnJvZ2F0ZSBwYWlycworICAgICAgICAgICAgKHUnLycsICcvJyksCisgICAgICAgIF0KKworICAgICAgICBmb3IgKHgsIHkpIGluIHV0ZlRlc3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmVuY29kZSgndXRmLTcnKSwgeSkKKworICAgICAgICAjIFVucGFpcmVkIHN1cnJvZ2F0ZXMgYXJlIHBhc3NlZCB0aHJvdWdoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdUQ4MDEnLmVuY29kZSgndXRmLTcnKSwgJysyQUUtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1RDgwMXgnLmVuY29kZSgndXRmLTcnKSwgJysyQUUteCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdURDMDEnLmVuY29kZSgndXRmLTcnKSwgJyszQUUtJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1REMwMXgnLmVuY29kZSgndXRmLTcnKSwgJyszQUUteCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJysyQUUtJy5kZWNvZGUoJ3V0Zi03JyksIHUnXHVEODAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnKzJBRS14Jy5kZWNvZGUoJ3V0Zi03JyksIHUnXHVEODAxeCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJyszQUUtJy5kZWNvZGUoJ3V0Zi03JyksIHUnXHVEQzAxJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnKzNBRS14Jy5kZWNvZGUoJ3V0Zi03JyksIHUnXHVEQzAxeCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1RDgwMVxVMDAwYWJjZGUnLmVuY29kZSgndXRmLTcnKSwgJysyQUhhYjl6ZS0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcrMkFIYWI5emUtJy5kZWNvZGUoJ3V0Zi03JyksIHUnXHVEODAxXFUwMDBhYmNkZScpCisKKyAgICAgICAgIyBEaXJlY3QgZW5jb2RlZCBjaGFyYWN0ZXJzCisgICAgICAgIHNldF9kID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JygpLC0uLzo/IgorICAgICAgICAjIE9wdGlvbmFsIGRpcmVjdCBjaGFyYWN0ZXJzCisgICAgICAgIHNldF9vID0gJyEiIyQlJio7PD0+QFtdXl9ge3x9JworICAgICAgICBmb3IgYyBpbiBzZXRfZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5lbmNvZGUoJ3V0ZjcnKSwgYy5lbmNvZGUoJ2FzY2lpJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZW5jb2RlKCdhc2NpaScpLmRlY29kZSgndXRmNycpLCB1bmljb2RlKGMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgPT0gYy5lbmNvZGUoJ2FzY2lpJykuZGVjb2RlKCd1dGY3JykpCisgICAgICAgIGZvciBjIGluIHNldF9vOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLmVuY29kZSgnYXNjaWknKS5kZWNvZGUoJ3V0ZjcnKSwgdW5pY29kZShjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjID09IGMuZW5jb2RlKCdhc2NpaScpLmRlY29kZSgndXRmNycpKQorCisgICAgZGVmIHRlc3RfY29kZWNzX3V0Zjgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScnLmVuY29kZSgndXRmLTgnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTIwYWMnLmVuY29kZSgndXRmLTgnKSwgJ1x4ZTJceDgyXHhhYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdWQ4MDBcdWRjMDInLmVuY29kZSgndXRmLTgnKSwgJ1x4ZjBceDkwXHg4MFx4ODInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHVkODRkXHVkYzU2Jy5lbmNvZGUoJ3V0Zi04JyksICdceGYwXHhhM1x4OTFceDk2JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1ZDgwMCcuZW5jb2RlKCd1dGYtOCcpLCAnXHhlZFx4YTBceDgwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1ZGMwMCcuZW5jb2RlKCd1dGYtOCcpLCAnXHhlZFx4YjBceDgwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgICh1J1x1ZDgwMFx1ZGMwMicqMTAwMCkuZW5jb2RlKCd1dGYtOCcpLAorICAgICAgICAgICAgJ1x4ZjBceDkwXHg4MFx4ODInKjEwMDAKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdSdcdTZiNjNcdTc4YmFcdTMwNmJcdThhMDBcdTMwNDZcdTMwNjhcdTdmZmJcdThhMzNcdTMwNmYnCisgICAgICAgICAgICB1J1x1MzA1NVx1MzA4Y1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1Ylx1MzA5M1x1MzAwMlx1NGUwMCcKKyAgICAgICAgICAgIHUnXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjJworICAgICAgICAgICAgdSdcdTMwMDFcdTMwNDJcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNWZcdTMwODlcdTMwODFcdTMwNjcnCisgICAgICAgICAgICB1J1x1MzA1OVx1MzAwMlx1NWI5Zlx1OTY5Ylx1MzA2Ylx1MzA2Zlx1MzAwY1dlbm4gaXN0IGRhcycKKyAgICAgICAgICAgIHUnIE51bnN0dWNrIGdpdCB1bmQnLmVuY29kZSgndXRmLTgnKSwKKyAgICAgICAgICAgICdceGU2XHhhZFx4YTNceGU3XHhhMlx4YmFceGUzXHg4MVx4YWJceGU4XHhhOFx4ODBceGUzXHg4MScKKyAgICAgICAgICAgICdceDg2XHhlM1x4ODFceGE4XHhlN1x4YmZceGJiXHhlOFx4YThceGIzXHhlM1x4ODFceGFmXHhlMycKKyAgICAgICAgICAgICdceDgxXHg5NVx4ZTNceDgyXHg4Y1x4ZTNceDgxXHhhNlx4ZTNceDgxXHg4NFx4ZTNceDgxXHhiZScKKyAgICAgICAgICAgICdceGUzXHg4MVx4OWJceGUzXHg4Mlx4OTNceGUzXHg4MFx4ODJceGU0XHhiOFx4ODBceGU5XHg4MycKKyAgICAgICAgICAgICdceGE4XHhlM1x4ODFceGFmXHhlM1x4ODNceDg5XHhlM1x4ODJceGE0XHhlM1x4ODNceDg0XHhlOCcKKyAgICAgICAgICAgICdceGFhXHg5ZVx4ZTNceDgxXHhhN1x4ZTNceDgxXHg5OVx4ZTNceDgxXHg4Y1x4ZTNceDgwXHg4MScKKyAgICAgICAgICAgICdceGUzXHg4MVx4ODJceGUzXHg4MVx4YThceGUzXHg4MVx4YWZceGUzXHg4MVx4YTdceGUzXHg4MScKKyAgICAgICAgICAgICdceDlmXHhlM1x4ODJceDg5XHhlM1x4ODJceDgxXHhlM1x4ODFceGE3XHhlM1x4ODFceDk5XHhlMycKKyAgICAgICAgICAgICdceDgwXHg4Mlx4ZTVceGFlXHg5Zlx4ZTlceDlhXHg5Ylx4ZTNceDgxXHhhYlx4ZTNceDgxXHhhZicKKyAgICAgICAgICAgICdceGUzXHg4MFx4OGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0IHVuZCcKKyAgICAgICAgKQorCisgICAgICAgICMgVVRGLTggc3BlY2lmaWMgZGVjb2RpbmcgdGVzdHMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCdceGYwXHhhM1x4OTFceDk2JywgJ3V0Zi04JyksIHUnXFUwMDAyMzQ1NicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnXHhmMFx4OTBceDgwXHg4MicsICd1dGYtOCcpLCB1J1xVMDAwMTAwMDInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ1x4ZTJceDgyXHhhYycsICd1dGYtOCcpLCB1J1x1MjBhYycpCisKKyAgICAgICAgIyBPdGhlciBwb3NzaWJsZSB1dGYtOCB0ZXN0IGNhc2VzOgorICAgICAgICAjICogc3RyaWN0IGRlY29kaW5nIHRlc3RpbmcgZm9yIGFsbCBvZiB0aGUKKyAgICAgICAgIyAgIFVURjhfRVJST1IgY2FzZXMgaW4gUHlVbmljb2RlX0RlY29kZVVURjgKKworICAgIGRlZiB0ZXN0X3V0ZjhfZGVjb2RlX3ZhbGlkX3NlcXVlbmNlcyhzZWxmKToKKyAgICAgICAgc2VxdWVuY2VzID0gWworICAgICAgICAgICAgIyBzaW5nbGUgYnl0ZQorICAgICAgICAgICAgKCdceDAwJywgdSdceDAwJyksICgnYScsIHUnYScpLCAoJ1x4N2YnLCB1J1x4N2YnKSwKKyAgICAgICAgICAgICMgMiBieXRlcworICAgICAgICAgICAgKCdceGMyXHg4MCcsIHUnXHg4MCcpLCAoJ1x4ZGZceGJmJywgdSdcdTA3ZmYnKSwKKyAgICAgICAgICAgICMgMyBieXRlcworICAgICAgICAgICAgKCdceGUwXHhhMFx4ODAnLCB1J1x1MDgwMCcpLCAoJ1x4ZWRceDlmXHhiZicsIHUnXHVkN2ZmJyksCisgICAgICAgICAgICAoJ1x4ZWVceDgwXHg4MCcsIHUnXHVFMDAwJyksICgnXHhlZlx4YmZceGJmJywgdSdcdWZmZmYnKSwKKyAgICAgICAgICAgICMgNCBieXRlcworICAgICAgICAgICAgKCdceEYwXHg5MFx4ODBceDgwJywgdSdcVTAwMDEwMDAwJyksCisgICAgICAgICAgICAoJ1x4ZjRceDhmXHhiZlx4YmYnLCB1J1xVMDAxMEZGRkYnKQorICAgICAgICBdCisgICAgICAgIGZvciBzZXEsIHJlcyBpbiBzZXF1ZW5jZXM6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcS5kZWNvZGUoJ3V0Zi04JyksIHJlcykKKworICAgICAgICBmb3IgY2ggaW4gbWFwKHVuaWNociwgcmFuZ2UoMCwgc3lzLm1heHVuaWNvZGUpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2gsIGNoLmVuY29kZSgndXRmLTgnKS5kZWNvZGUoJ3V0Zi04JykpCisKKyAgICBkZWYgdGVzdF91dGY4X2RlY29kZV9pbnZhbGlkX3NlcXVlbmNlcyhzZWxmKToKKyAgICAgICAgIyBjb250aW51YXRpb24gYnl0ZXMgaW4gYSBzZXF1ZW5jZSBvZiAyLCAzLCBvciA0IGJ5dGVzCisgICAgICAgIGNvbnRpbnVhdGlvbl9ieXRlcyA9IG1hcChjaHIsIHJhbmdlKDB4ODAsIDB4QzApKQorICAgICAgICAjIHN0YXJ0IGJ5dGVzIG9mIGEgMi1ieXRlIHNlcXVlbmNlIGVxdWl2YWxlbnQgdG8gY29kZXBvaW50cyA8IDB4N0YKKyAgICAgICAgaW52YWxpZF8yQl9zZXFfc3RhcnRfYnl0ZXMgPSBtYXAoY2hyLCByYW5nZSgweEMwLCAweEMyKSkKKyAgICAgICAgIyBzdGFydCBieXRlcyBvZiBhIDQtYnl0ZSBzZXF1ZW5jZSBlcXVpdmFsZW50IHRvIGNvZGVwb2ludHMgPiAweDEwRkZGRgorICAgICAgICBpbnZhbGlkXzRCX3NlcV9zdGFydF9ieXRlcyA9IG1hcChjaHIsIHJhbmdlKDB4RjUsIDB4RjgpKQorICAgICAgICBpbnZhbGlkX3N0YXJ0X2J5dGVzID0gKAorICAgICAgICAgICAgY29udGludWF0aW9uX2J5dGVzICsgaW52YWxpZF8yQl9zZXFfc3RhcnRfYnl0ZXMgKworICAgICAgICAgICAgaW52YWxpZF80Ql9zZXFfc3RhcnRfYnl0ZXMgKyBtYXAoY2hyLCByYW5nZSgweEY3LCAweDEwMCkpCisgICAgICAgICkKKworICAgICAgICBmb3IgYnl0ZSBpbiBpbnZhbGlkX3N0YXJ0X2J5dGVzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBieXRlLmRlY29kZSwgJ3V0Zi04JykKKworICAgICAgICBmb3Igc2IgaW4gaW52YWxpZF8yQl9zZXFfc3RhcnRfYnl0ZXM6CisgICAgICAgICAgICBmb3IgY2IgaW4gY29udGludWF0aW9uX2J5dGVzOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwgKHNiK2NiKS5kZWNvZGUsICd1dGYtOCcpCisKKyAgICAgICAgZm9yIHNiIGluIGludmFsaWRfNEJfc2VxX3N0YXJ0X2J5dGVzOgorICAgICAgICAgICAgZm9yIGNiMSBpbiBjb250aW51YXRpb25fYnl0ZXNbOjNdOgorICAgICAgICAgICAgICAgIGZvciBjYjMgaW4gY29udGludWF0aW9uX2J5dGVzWzozXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2IrY2IxKydceDgwJytjYjMpLmRlY29kZSwgJ3V0Zi04JykKKworICAgICAgICBmb3IgY2IgaW4gbWFwKGNociwgcmFuZ2UoMHg4MCwgMHhBMCkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdceEUwJytjYisnXHg4MCcpLmRlY29kZSwgJ3V0Zi04JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnXHhFMCcrY2IrJ1x4QkYnKS5kZWNvZGUsICd1dGYtOCcpCisgICAgICAgICMgWFhYOiBzdXJyb2dhdGVzIHNob3VsZG4ndCBiZSB2YWxpZCBVVEYtOCEKKyAgICAgICAgIyBzZWUgaHR0cDovL3d3dy51bmljb2RlLm9yZy92ZXJzaW9ucy9Vbmljb2RlNS4yLjAvY2gwMy5wZGYKKyAgICAgICAgIyAodGFibGUgMy03KSBhbmQgaHR0cDovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMzYyOS50eHQKKyAgICAgICAgI2ZvciBjYiBpbiBtYXAoY2hyLCByYW5nZSgweEEwLCAweEMwKSk6CisgICAgICAgICAgICAjc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIygnXHhFRCcrY2IrJ1x4ODAnKS5kZWNvZGUsICd1dGYtOCcpCisgICAgICAgICAgICAjc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIygnXHhFRCcrY2IrJ1x4QkYnKS5kZWNvZGUsICd1dGYtOCcpCisgICAgICAgICMgYnV0IHNpbmNlIHRoZXkgYXJlIHZhbGlkIG9uIFB5dGhvbiAyIGFkZCBhIHRlc3QgZm9yIHRoYXQ6CisgICAgICAgIGZvciBjYiwgc3Vycm9nYXRlIGluIHppcChtYXAoY2hyLCByYW5nZSgweEEwLCAweEMwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAodW5pY2hyLCByYW5nZSgweGQ4MDAsIDB4ZTAwMCwgNjQpKSk6CisgICAgICAgICAgICBlbmNvZGVkID0gJ1x4RUQnK2NiKydceDgwJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVkLmRlY29kZSgndXRmLTgnKSwgc3Vycm9nYXRlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdXJyb2dhdGUuZW5jb2RlKCd1dGYtOCcpLCBlbmNvZGVkKQorCisgICAgICAgIGZvciBjYiBpbiBtYXAoY2hyLCByYW5nZSgweDgwLCAweDkwKSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ1x4RjAnK2NiKydceDgwXHg4MCcpLmRlY29kZSwgJ3V0Zi04JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnXHhGMCcrY2IrJ1x4QkZceEJGJykuZGVjb2RlLCAndXRmLTgnKQorICAgICAgICBmb3IgY2IgaW4gbWFwKGNociwgcmFuZ2UoMHg5MCwgMHhDMCkpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCdceEY0JytjYisnXHg4MFx4ODAnKS5kZWNvZGUsICd1dGYtOCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ1x4RjQnK2NiKydceEJGXHhCRicpLmRlY29kZSwgJ3V0Zi04JykKKworICAgIGRlZiB0ZXN0X2lzc3VlODI3MShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjODI3MTogZHVyaW5nIHRoZSBkZWNvZGluZyBvZiBhbiBpbnZhbGlkIFVURi04IGJ5dGUgc2VxdWVuY2UsCisgICAgICAgICMgb25seSB0aGUgc3RhcnQgYnl0ZSBhbmQgdGhlIGNvbnRpbnVhdGlvbiBieXRlKHMpIGFyZSBub3cgY29uc2lkZXJlZAorICAgICAgICAjIGludmFsaWQsIGluc3RlYWQgb2YgdGhlIG51bWJlciBvZiBieXRlcyBzcGVjaWZpZWQgYnkgdGhlIHN0YXJ0IGJ5dGUuCisgICAgICAgICMgU2VlIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdmVyc2lvbnMvVW5pY29kZTUuMi4wL2NoMDMucGRmIChwYWdlIDk1LAorICAgICAgICAjIHRhYmxlIDMtOCwgUm93IDIpIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbGdvcml0aG0gdXNlZC4KKyAgICAgICAgRkZGRCA9IHUnXHVmZmZkJworICAgICAgICBzZXF1ZW5jZXMgPSBbCisgICAgICAgICAgICAjIGludmFsaWQgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHg4MCcsIEZGRkQpLCAjIGNvbnRpbnVhdGlvbiBieXRlCisgICAgICAgICAgICAoJ1x4ODBceDgwJywgRkZGRCoyKSwgIyAyIGNvbnRpbnVhdGlvbiBieXRlcworICAgICAgICAgICAgKCdceGMwJywgRkZGRCksCisgICAgICAgICAgICAoJ1x4YzBceGMwJywgRkZGRCoyKSwKKyAgICAgICAgICAgICgnXHhjMScsIEZGRkQpLAorICAgICAgICAgICAgKCdceGMxXHhjMCcsIEZGRkQqMiksCisgICAgICAgICAgICAoJ1x4YzBceGMxJywgRkZGRCoyKSwKKyAgICAgICAgICAgICMgd2l0aCBzdGFydCBieXRlIG9mIGEgMi1ieXRlIHNlcXVlbmNlCisgICAgICAgICAgICAoJ1x4YzInLCBGRkZEKSwgIyBvbmx5IHRoZSBzdGFydCBieXRlCisgICAgICAgICAgICAoJ1x4YzJceGMyJywgRkZGRCoyKSwgIyAyIHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4YzJceGMyXHhjMicsIEZGRkQqMyksICMgMiBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceGMyXHg0MScsIEZGRkQrJ0EnKSwgIyBpbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlCisgICAgICAgICAgICAjIHdpdGggc3RhcnQgYnl0ZSBvZiBhIDMtYnl0ZSBzZXF1ZW5jZQorICAgICAgICAgICAgKCdceGUxJywgRkZGRCksICMgb25seSB0aGUgc3RhcnQgYnl0ZQorICAgICAgICAgICAgKCdceGUxXHhlMScsIEZGRkQqMiksICMgMiBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceGUxXHhlMVx4ZTEnLCBGRkZEKjMpLCAjIDMgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhlMVx4ZTFceGUxXHhlMScsIEZGRkQqNCksICMgNCBzdGFydCBieXRlcworICAgICAgICAgICAgKCdceGUxXHg4MCcsIEZGRkQpLCAjIG9ubHkgMSBjb250aW51YXRpb24gYnl0ZQorICAgICAgICAgICAgKCdceGUxXHg0MScsIEZGRkQrJ0EnKSwgIyBpbnZhbGlkIGNvbnRpbnVhdGlvbiBieXRlCisgICAgICAgICAgICAoJ1x4ZTFceDQxXHg4MCcsIEZGRkQrJ0EnK0ZGRkQpLCAjIGludmFsaWQgY2IgZm9sbG93ZWQgYnkgdmFsaWQgY2IKKyAgICAgICAgICAgICgnXHhlMVx4NDFceDQxJywgRkZGRCsnQUEnKSwgIyAyIGludmFsaWQgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZTFceDgwXHg0MScsIEZGRkQrJ0EnKSwgIyBvbmx5IDEgdmFsaWQgY29udGludWF0aW9uIGJ5dGUKKyAgICAgICAgICAgICgnXHhlMVx4ODBceGUxXHg0MScsIEZGRkQqMisnQScpLCAjIDEgdmFsaWQgYW5kIHRoZSBvdGhlciBpbnZhbGlkCisgICAgICAgICAgICAoJ1x4ZTFceDQxXHhlMVx4ODAnLCBGRkZEKydBJytGRkZEKSwgIyAxIGludmFsaWQgYW5kIHRoZSBvdGhlciB2YWxpZAorICAgICAgICAgICAgIyB3aXRoIHN0YXJ0IGJ5dGUgb2YgYSA0LWJ5dGUgc2VxdWVuY2UKKyAgICAgICAgICAgICgnXHhmMScsIEZGRkQpLCAjIG9ubHkgdGhlIHN0YXJ0IGJ5dGUKKyAgICAgICAgICAgICgnXHhmMVx4ZjEnLCBGRkZEKjIpLCAjIDIgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhmMVx4ZjFceGYxJywgRkZGRCozKSwgIyAzIHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZjFceGYxXHhmMVx4ZjEnLCBGRkZEKjQpLCAjIDQgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhmMVx4ZjFceGYxXHhmMVx4ZjEnLCBGRkZEKjUpLCAjIDUgc3RhcnQgYnl0ZXMKKyAgICAgICAgICAgICgnXHhmMVx4ODAnLCBGRkZEKSwgIyBvbmx5IDEgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZjFceDgwXHg4MCcsIEZGRkQpLCAjIG9ubHkgMiBjb250aW51YXRpb24gYnl0ZXMKKyAgICAgICAgICAgICgnXHhmMVx4ODBceDQxJywgRkZGRCsnQScpLCAjIDEgdmFsaWQgY2IgYW5kIDEgaW52YWxpZAorICAgICAgICAgICAgKCdceGYxXHg4MFx4NDFceDQxJywgRkZGRCsnQUEnKSwgIyAxIHZhbGlkIGNiIGFuZCAxIGludmFsaWQKKyAgICAgICAgICAgICgnXHhmMVx4ODBceDgwXHg0MScsIEZGRkQrJ0EnKSwgIyAyIHZhbGlkIGNiIGFuZCAxIGludmFsaWQKKyAgICAgICAgICAgICgnXHhmMVx4NDFceDgwJywgRkZGRCsnQScrRkZGRCksICMgMSBpbnZhbGlkIGN2IGFuZCAxIHZhbGlkCisgICAgICAgICAgICAoJ1x4ZjFceDQxXHg4MFx4ODAnLCBGRkZEKydBJytGRkZEKjIpLCAjIDEgaW52YWxpZCBjYiBhbmQgMiBpbnZhbGlkCisgICAgICAgICAgICAoJ1x4ZjFceDQxXHg4MFx4NDEnLCBGRkZEKydBJytGRkZEKydBJyksICMgMiBpbnZhbGlkIGNiIGFuZCAxIGludmFsaWQKKyAgICAgICAgICAgICgnXHhmMVx4NDFceDQxXHg4MCcsIEZGRkQrJ0FBJytGRkZEKSwgIyAxIHZhbGlkIGNiIGFuZCAxIGludmFsaWQKKyAgICAgICAgICAgICgnXHhmMVx4NDFceGYxXHg4MCcsIEZGRkQrJ0EnK0ZGRkQpLAorICAgICAgICAgICAgKCdceGYxXHg0MVx4ODBceGYxJywgRkZGRCsnQScrRkZGRCoyKSwKKyAgICAgICAgICAgICgnXHhmMVx4ZjFceDgwXHg0MScsIEZGRkQqMisnQScpLAorICAgICAgICAgICAgKCdceGYxXHg0MVx4ZjFceGYxJywgRkZGRCsnQScrRkZGRCoyKSwKKyAgICAgICAgICAgICMgd2l0aCBpbnZhbGlkIHN0YXJ0IGJ5dGUgb2YgYSA0LWJ5dGUgc2VxdWVuY2UgKHJmYzIyNzkpCisgICAgICAgICAgICAoJ1x4ZjUnLCBGRkZEKSwgIyBvbmx5IHRoZSBzdGFydCBieXRlCisgICAgICAgICAgICAoJ1x4ZjVceGY1JywgRkZGRCoyKSwgIyAyIHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZjVceDgwJywgRkZGRCoyKSwgIyBvbmx5IDEgY29udGludWF0aW9uIGJ5dGUKKyAgICAgICAgICAgICgnXHhmNVx4ODBceDgwJywgRkZGRCozKSwgIyBvbmx5IDIgY29udGludWF0aW9uIGJ5dGUKKyAgICAgICAgICAgICgnXHhmNVx4ODBceDgwXHg4MCcsIEZGRkQqNCksICMgMyBjb250aW51YXRpb24gYnl0ZXMKKyAgICAgICAgICAgICgnXHhmNVx4ODBceDQxJywgRkZGRCoyKydBJyksICMgIDEgdmFsaWQgY2IgYW5kIDEgaW52YWxpZAorICAgICAgICAgICAgKCdceGY1XHg4MFx4NDFceGY1JywgRkZGRCoyKydBJytGRkZEKSwKKyAgICAgICAgICAgICgnXHhmNVx4NDFceDgwXHg4MFx4NDEnLCBGRkZEKydBJytGRkZEKjIrJ0EnKSwKKyAgICAgICAgICAgICMgd2l0aCBpbnZhbGlkIHN0YXJ0IGJ5dGUgb2YgYSA1LWJ5dGUgc2VxdWVuY2UgKHJmYzIyNzkpCisgICAgICAgICAgICAoJ1x4ZjgnLCBGRkZEKSwgIyBvbmx5IHRoZSBzdGFydCBieXRlCisgICAgICAgICAgICAoJ1x4ZjhceGY4JywgRkZGRCoyKSwgIyAyIHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZjhceDgwJywgRkZGRCoyKSwgIyBvbmx5IG9uZSBjb250aW51YXRpb24gYnl0ZQorICAgICAgICAgICAgKCdceGY4XHg4MFx4NDEnLCBGRkZEKjIgKyAnQScpLCAjIDEgdmFsaWQgY2IgYW5kIDEgaW52YWxpZAorICAgICAgICAgICAgKCdceGY4XHg4MFx4ODBceDgwXHg4MCcsIEZGRkQqNSksICMgaW52YWxpZCA1IGJ5dGVzIHNlcSB3aXRoIDUgYnl0ZXMKKyAgICAgICAgICAgICMgd2l0aCBpbnZhbGlkIHN0YXJ0IGJ5dGUgb2YgYSA2LWJ5dGUgc2VxdWVuY2UgKHJmYzIyNzkpCisgICAgICAgICAgICAoJ1x4ZmMnLCBGRkZEKSwgIyBvbmx5IHRoZSBzdGFydCBieXRlCisgICAgICAgICAgICAoJ1x4ZmNceGZjJywgRkZGRCoyKSwgIyAyIHN0YXJ0IGJ5dGVzCisgICAgICAgICAgICAoJ1x4ZmNceDgwXHg4MCcsIEZGRkQqMyksICMgb25seSAyIGNvbnRpbnVhdGlvbiBieXRlcworICAgICAgICAgICAgKCdceGZjXHg4MFx4ODBceDgwXHg4MFx4ODAnLCBGRkZEKjYpLCAjIDYgY29udGludWF0aW9uIGJ5dGVzCisgICAgICAgICAgICAjIGludmFsaWQgc3RhcnQgYnl0ZQorICAgICAgICAgICAgKCdceGZlJywgRkZGRCksCisgICAgICAgICAgICAoJ1x4ZmVceDgwXHg4MCcsIEZGRkQqMyksCisgICAgICAgICAgICAjIG90aGVyIHNlcXVlbmNlcworICAgICAgICAgICAgKCdceGYxXHg4MFx4NDFceDQyXHg0MycsIHUnXHVmZmZkXHg0MVx4NDJceDQzJyksCisgICAgICAgICAgICAoJ1x4ZjFceDgwXHhmZlx4NDJceDQzJywgdSdcdWZmZmRcdWZmZmRceDQyXHg0MycpLAorICAgICAgICAgICAgKCdceGYxXHg4MFx4YzJceDgxXHg0MycsIHUnXHVmZmZkXHg4MVx4NDMnKSwKKyAgICAgICAgICAgICgnXHg2MVx4RjFceDgwXHg4MFx4RTFceDgwXHhDMlx4NjJceDgwXHg2M1x4ODBceEJGXHg2NCcsCisgICAgICAgICAgICAgdSdceDYxXHVGRkZEXHVGRkZEXHVGRkZEXHg2Mlx1RkZGRFx4NjNcdUZGRkRcdUZGRkRceDY0JyksCisgICAgICAgIF0KKyAgICAgICAgZm9yIG4sIChzZXEsIHJlcykgaW4gZW51bWVyYXRlKHNlcXVlbmNlcyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIHNlcS5kZWNvZGUsICd1dGYtOCcsICdzdHJpY3QnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXEuZGVjb2RlKCd1dGYtOCcsICdyZXBsYWNlJyksIHJlcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNlcSsnYicpLmRlY29kZSgndXRmLTgnLCAncmVwbGFjZScpLCByZXMrJ2InKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXEuZGVjb2RlKCd1dGYtOCcsICdpZ25vcmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzLnJlcGxhY2UodSdcdUZGRkQnLCAnJykpCisKKyAgICBkZWYgdGVzdF9jb2RlY3NfaWRuYShzZWxmKToKKyAgICAgICAgIyBUZXN0IHdoZXRoZXIgdHJhaWxpbmcgZG90IGlzIHByZXNlcnZlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUid3d3LnB5dGhvbi5vcmcuIi5lbmNvZGUoImlkbmEiKSwgInd3dy5weXRob24ub3JnLiIpCisKKyAgICBkZWYgdGVzdF9jb2RlY3NfZXJyb3JzKHNlbGYpOgorICAgICAgICAjIEVycm9yIGhhbmRsaW5nIChlbmNvZGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB1J0FuZHJcMjAyIHgnLmVuY29kZSwgJ2FzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB1J0FuZHJcMjAyIHgnLmVuY29kZSwgJ2FzY2lpJywnc3RyaWN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCdpZ25vcmUnKSwgIkFuZHIgeCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywncmVwbGFjZScpLCAiQW5kcj8geCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdBbmRyXDIwMiB4Jy5lbmNvZGUoJ2FzY2lpJywgJ3JlcGxhY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCBlcnJvcnM9J3JlcGxhY2UnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J0FuZHJcMjAyIHgnLmVuY29kZSgnYXNjaWknLCAnaWdub3JlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdBbmRyXDIwMiB4Jy5lbmNvZGUoZW5jb2Rpbmc9J2FzY2lpJywgZXJyb3JzPSdpZ25vcmUnKSkKKworICAgICAgICAjIEVycm9yIGhhbmRsaW5nIChkZWNvZGluZykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCB1bmljb2RlLCAnQW5kclwyMDIgeCcsICdhc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgdW5pY29kZSwgJ0FuZHJcMjAyIHgnLCAnYXNjaWknLCdzdHJpY3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoJ0FuZHJcMjAyIHgnLCdhc2NpaScsJ2lnbm9yZScpLCB1IkFuZHIgeCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnQW5kclwyMDIgeCcsJ2FzY2lpJywncmVwbGFjZScpLCB1J0FuZHJcdUZGRkQgeCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhYmNkZScuZGVjb2RlKCdhc2NpaScsICdpZ25vcmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J2FiY2RlJy5kZWNvZGUoJ2FzY2lpJywgZXJyb3JzPSdpZ25vcmUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2FiY2RlJy5kZWNvZGUoJ2FzY2lpJywgJ3JlcGxhY2UnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J2FiY2RlJy5kZWNvZGUoZW5jb2Rpbmc9J2FzY2lpJywgZXJyb3JzPSdyZXBsYWNlJykpCisKKyAgICAgICAgIyBFcnJvciBoYW5kbGluZyAodW5rbm93biBjaGFyYWN0ZXIgbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlxcTntmb299eHgiLmRlY29kZSgidW5pY29kZS1lc2NhcGUiLCAiaWdub3JlIiksIHUieHgiKQorCisgICAgICAgICMgRXJyb3IgaGFuZGxpbmcgKHRydW5jYXRlZCBlc2NhcGUgc2VxdWVuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgIlxcIi5kZWNvZGUsICJ1bmljb2RlLWVzY2FwZSIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCAiaGVsbG8iLmRlY29kZSwgInRlc3QudW5pY29kZTEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHVuaWNvZGUsICJoZWxsbyIsICJ0ZXN0LnVuaWNvZGUyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1ImhlbGxvIi5lbmNvZGUsICJ0ZXN0LnVuaWNvZGUxIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1ImhlbGxvIi5lbmNvZGUsICJ0ZXN0LnVuaWNvZGUyIikKKyAgICAgICAgIyBleGVjdXRlcyBQeVVuaWNvZGVfRW5jb2RlKCkKKyAgICAgICAgaW1wb3J0IGltcAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIEltcG9ydEVycm9yLAorICAgICAgICAgICAgaW1wLmZpbmRfbW9kdWxlLAorICAgICAgICAgICAgIm5vbi1leGlzdGluZyBtb2R1bGUiLAorICAgICAgICAgICAgW3Uibm9uLWV4aXN0aW5nIGRpciJdCisgICAgICAgICkKKworICAgICAgICAjIEVycm9yIGhhbmRsaW5nICh3cm9uZyBhcmd1bWVudHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdSJoZWxsbyIuZW5jb2RlLCA0MiwgNDIsIDQyKQorCisgICAgICAgICMgRXJyb3IgaGFuZGxpbmcgKFB5VW5pY29kZV9FbmNvZGVEZWNpbWFsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgaW50LCB1Ilx1MDIwMCIpCisKKyAgICBkZWYgdGVzdF9jb2RlY3Moc2VsZik6CisgICAgICAgICMgRW5jb2RpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2hlbGxvJy5lbmNvZGUoJ2FzY2lpJyksICdoZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdoZWxsbycuZW5jb2RlKCd1dGYtNycpLCAnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnaGVsbG8nLmVuY29kZSgndXRmLTgnKSwgJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2hlbGxvJy5lbmNvZGUoJ3V0ZjgnKSwgJ2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2hlbGxvJy5lbmNvZGUoJ3V0Zi0xNi1sZScpLCAnaFwwMDBlXDAwMGxcMDAwbFwwMDBvXDAwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdoZWxsbycuZW5jb2RlKCd1dGYtMTYtYmUnKSwgJ1wwMDBoXDAwMGVcMDAwbFwwMDBsXDAwMG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnaGVsbG8nLmVuY29kZSgnbGF0aW4tMScpLCAnaGVsbG8nKQorCisgICAgICAgICMgUm91bmR0cmlwIHNhZmV0eSBmb3IgQk1QIChqdXN0IHRoZSBmaXJzdCAxMDI0IGNoYXJzKQorICAgICAgICBmb3IgYyBpbiB4cmFuZ2UoMTAyNCk6CisgICAgICAgICAgICB1ID0gdW5pY2hyKGMpCisgICAgICAgICAgICBmb3IgZW5jb2RpbmcgaW4gKCd1dGYtNycsICd1dGYtOCcsICd1dGYtMTYnLCAndXRmLTE2LWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3V0Zi0xNi1iZScsICdyYXdfdW5pY29kZV9lc2NhcGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndW5pY29kZV9lc2NhcGUnLCAndW5pY29kZV9pbnRlcm5hbCcpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpLCB1KQorCisgICAgICAgICMgUm91bmR0cmlwIHNhZmV0eSBmb3IgQk1QIChqdXN0IHRoZSBmaXJzdCAyNTYgY2hhcnMpCisgICAgICAgIGZvciBjIGluIHhyYW5nZSgyNTYpOgorICAgICAgICAgICAgdSA9IHVuaWNocihjKQorICAgICAgICAgICAgZm9yIGVuY29kaW5nIGluICgnbGF0aW4tMScsKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUodS5lbmNvZGUoZW5jb2RpbmcpLGVuY29kaW5nKSwgdSkKKworICAgICAgICAjIFJvdW5kdHJpcCBzYWZldHkgZm9yIEJNUCAoanVzdCB0aGUgZmlyc3QgMTI4IGNoYXJzKQorICAgICAgICBmb3IgYyBpbiB4cmFuZ2UoMTI4KToKKyAgICAgICAgICAgIHUgPSB1bmljaHIoYykKKyAgICAgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ2FzY2lpJywpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpLCB1KQorCisgICAgICAgICMgUm91bmR0cmlwIHNhZmV0eSBmb3Igbm9uLUJNUCAoanVzdCBhIGZldyBjaGFycykKKyAgICAgICAgdSA9IHUnXFUwMDAxMDAwMVxVMDAwMjAwMDJcVTAwMDMwMDAzXFUwMDA0MDAwNFxVMDAwNTAwMDUnCisgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ3V0Zi04JywgJ3V0Zi0xNicsICd1dGYtMTYtbGUnLCAndXRmLTE2LWJlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAjJ3Jhd191bmljb2RlX2VzY2FwZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuaWNvZGVfZXNjYXBlJywgJ3VuaWNvZGVfaW50ZXJuYWwnKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpLCB1KQorCisgICAgICAgICMgVVRGLTggbXVzdCBiZSByb3VuZHRyaXAgc2FmZSBmb3IgYWxsIFVDUy0yIGNvZGUgcG9pbnRzCisgICAgICAgICMgVGhpcyBleGNsdWRlcyBzdXJyb2dhdGVzOiBpbiB0aGUgZnVsbCByYW5nZSwgdGhlcmUgd291bGQgYmUKKyAgICAgICAgIyBhIHN1cnJvZ2F0ZSBwYWlyIChcdWRiZmZcdWRjMDApLCB3aGljaCBnZXRzIGNvbnZlcnRlZCBiYWNrCisgICAgICAgICMgdG8gYSBub24tQk1QIGNoYXJhY3RlciAoXFUwMDEwZmMwMCkKKyAgICAgICAgdSA9IHUnJy5qb2luKG1hcCh1bmljaHIsIHJhbmdlKDAsMHhkODAwKStyYW5nZSgweGUwMDAsMHgxMDAwMCkpKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gKCd1dGYtOCcsKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSh1LmVuY29kZShlbmNvZGluZyksZW5jb2RpbmcpLCB1KQorCisgICAgZGVmIHRlc3RfY29kZWNzX2NoYXJtYXAoc2VsZik6CisgICAgICAgICMgMC0xMjcKKyAgICAgICAgcyA9ICcnLmpvaW4obWFwKGNociwgeHJhbmdlKDEyOCkpKQorICAgICAgICBmb3IgZW5jb2RpbmcgaW4gKAorICAgICAgICAgICAgJ2NwMDM3JywgJ2NwMTAyNicsCisgICAgICAgICAgICAnY3A0MzcnLCAnY3A1MDAnLCAnY3A3MjAnLCAnY3A3MzcnLCAnY3A3NzUnLCAnY3A4NTAnLAorICAgICAgICAgICAgJ2NwODUyJywgJ2NwODU1JywgJ2NwODU4JywgJ2NwODYwJywgJ2NwODYxJywgJ2NwODYyJywKKyAgICAgICAgICAgICdjcDg2MycsICdjcDg2NScsICdjcDg2NicsCisgICAgICAgICAgICAnaXNvODg1OV8xMCcsICdpc284ODU5XzEzJywgJ2lzbzg4NTlfMTQnLCAnaXNvODg1OV8xNScsCisgICAgICAgICAgICAnaXNvODg1OV8yJywgJ2lzbzg4NTlfMycsICdpc284ODU5XzQnLCAnaXNvODg1OV81JywgJ2lzbzg4NTlfNicsCisgICAgICAgICAgICAnaXNvODg1OV83JywgJ2lzbzg4NTlfOScsICdrb2k4X3InLCAnbGF0aW5fMScsCisgICAgICAgICAgICAnbWFjX2N5cmlsbGljJywgJ21hY19sYXRpbjInLAorCisgICAgICAgICAgICAnY3AxMjUwJywgJ2NwMTI1MScsICdjcDEyNTInLCAnY3AxMjUzJywgJ2NwMTI1NCcsICdjcDEyNTUnLAorICAgICAgICAgICAgJ2NwMTI1NicsICdjcDEyNTcnLCAnY3AxMjU4JywKKyAgICAgICAgICAgICdjcDg1NicsICdjcDg1NycsICdjcDg2NCcsICdjcDg2OScsICdjcDg3NCcsCisKKyAgICAgICAgICAgICdtYWNfZ3JlZWsnLCAnbWFjX2ljZWxhbmQnLCdtYWNfcm9tYW4nLCAnbWFjX3R1cmtpc2gnLAorICAgICAgICAgICAgJ2NwMTAwNicsICdpc284ODU5XzgnLAorCisgICAgICAgICAgICAjIyMgVGhlc2UgaGF2ZSB1bmRlZmluZWQgbWFwcGluZ3M6CisgICAgICAgICAgICAjJ2NwNDI0JywKKworICAgICAgICAgICAgIyMjIFRoZXNlIGZhaWwgdGhlIHJvdW5kLXRyaXA6CisgICAgICAgICAgICAjJ2NwODc1JworCisgICAgICAgICAgICApOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHMsIGVuY29kaW5nKS5lbmNvZGUoZW5jb2RpbmcpLCBzKQorCisgICAgICAgICMgMTI4LTI1NQorICAgICAgICBzID0gJycuam9pbihtYXAoY2hyLCB4cmFuZ2UoMTI4LCAyNTYpKSkKKyAgICAgICAgZm9yIGVuY29kaW5nIGluICgKKyAgICAgICAgICAgICdjcDAzNycsICdjcDEwMjYnLAorICAgICAgICAgICAgJ2NwNDM3JywgJ2NwNTAwJywgJ2NwNzIwJywgJ2NwNzM3JywgJ2NwNzc1JywgJ2NwODUwJywKKyAgICAgICAgICAgICdjcDg1MicsICdjcDg1NScsICdjcDg1OCcsICdjcDg2MCcsICdjcDg2MScsICdjcDg2MicsCisgICAgICAgICAgICAnY3A4NjMnLCAnY3A4NjUnLCAnY3A4NjYnLAorICAgICAgICAgICAgJ2lzbzg4NTlfMTAnLCAnaXNvODg1OV8xMycsICdpc284ODU5XzE0JywgJ2lzbzg4NTlfMTUnLAorICAgICAgICAgICAgJ2lzbzg4NTlfMicsICdpc284ODU5XzQnLCAnaXNvODg1OV81JywKKyAgICAgICAgICAgICdpc284ODU5XzknLCAna29pOF9yJywgJ2xhdGluXzEnLAorICAgICAgICAgICAgJ21hY19jeXJpbGxpYycsICdtYWNfbGF0aW4yJywKKworICAgICAgICAgICAgIyMjIFRoZXNlIGhhdmUgdW5kZWZpbmVkIG1hcHBpbmdzOgorICAgICAgICAgICAgIydjcDEyNTAnLCAnY3AxMjUxJywgJ2NwMTI1MicsICdjcDEyNTMnLCAnY3AxMjU0JywgJ2NwMTI1NScsCisgICAgICAgICAgICAjJ2NwMTI1NicsICdjcDEyNTcnLCAnY3AxMjU4JywKKyAgICAgICAgICAgICMnY3A0MjQnLCAnY3A4NTYnLCAnY3A4NTcnLCAnY3A4NjQnLCAnY3A4NjknLCAnY3A4NzQnLAorICAgICAgICAgICAgIydpc284ODU5XzMnLCAnaXNvODg1OV82JywgJ2lzbzg4NTlfNycsCisgICAgICAgICAgICAjJ21hY19ncmVlaycsICdtYWNfaWNlbGFuZCcsJ21hY19yb21hbicsICdtYWNfdHVya2lzaCcsCisKKyAgICAgICAgICAgICMjIyBUaGVzZSBmYWlsIHRoZSByb3VuZC10cmlwOgorICAgICAgICAgICAgIydjcDEwMDYnLCAnY3A4NzUnLCAnaXNvODg1OV84JywKKworICAgICAgICAgICAgKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShzLCBlbmNvZGluZykuZW5jb2RlKGVuY29kaW5nKSwgcykKKworICAgIGRlZiB0ZXN0X2NvbmNhdGVuYXRpb24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHUiYWJjIiB1ImRlZiIpLCB1ImFiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCJhYmMiIHUiZGVmIiksIHUiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodSJhYmMiICJkZWYiKSwgdSJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh1ImFiYyIgdSJkZWYiICJnaGkiKSwgdSJhYmNkZWZnaGkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgiYWJjIiAiZGVmIiB1ImdoaSIpLCB1ImFiY2RlZmdoaSIpCisKKyAgICBkZWYgdGVzdF9wcmludGluZyhzZWxmKToKKyAgICAgICAgY2xhc3MgQml0QnVja2V0OgorICAgICAgICAgICAgZGVmIHdyaXRlKHNlbGYsIHRleHQpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBvdXQgPSBCaXRCdWNrZXQoKQorICAgICAgICBwcmludCA+Pm91dCwgdSdhYmMnCisgICAgICAgIHByaW50ID4+b3V0LCB1J2FiYycsIHUnZGVmJworICAgICAgICBwcmludCA+Pm91dCwgdSdhYmMnLCAnZGVmJworICAgICAgICBwcmludCA+Pm91dCwgJ2FiYycsIHUnZGVmJworICAgICAgICBwcmludCA+Pm91dCwgdSdhYmNcbicKKyAgICAgICAgcHJpbnQgPj5vdXQsIHUnYWJjXG4nLAorICAgICAgICBwcmludCA+Pm91dCwgdSdhYmNcbicsCisgICAgICAgIHByaW50ID4+b3V0LCB1J2RlZlxuJworICAgICAgICBwcmludCA+Pm91dCwgdSdkZWZcbicKKworICAgIGRlZiB0ZXN0X3VjczQoc2VsZik6CisgICAgICAgIHggPSB1J1xVMDAxMDAwMDAnCisgICAgICAgIHkgPSB4LmVuY29kZSgicmF3LXVuaWNvZGUtZXNjYXBlIikuZGVjb2RlKCJyYXctdW5pY29kZS1lc2NhcGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCisKKyAgICAgICAgeSA9IHInXFUwMDEwMDAwMCcKKyAgICAgICAgeCA9IHkuZGVjb2RlKCJyYXctdW5pY29kZS1lc2NhcGUiKS5lbmNvZGUoInJhdy11bmljb2RlLWVzY2FwZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKyAgICAgICAgeSA9IHInXFUwMDAxMDAwMCcKKyAgICAgICAgeCA9IHkuZGVjb2RlKCJyYXctdW5pY29kZS1lc2NhcGUiKS5lbmNvZGUoInJhdy11bmljb2RlLWVzY2FwZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAnXFUxMTExMTExMScuZGVjb2RlKCJyYXctdW5pY29kZS1lc2NhcGUiKQorICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuc3RhcnQsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZW5kLCAxMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIFVuaWNvZGVEZWNvZGVFcnJvciIpCisKKyAgICBkZWYgdGVzdF9jb252ZXJzaW9uKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBfX3VuaWNvZGVfXygpIHdvcmtzIHByb3Blcmx5CisgICAgICAgIGNsYXNzIEZvbzA6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKKworICAgICAgICBjbGFzcyBGb28xOgorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1ImZvbyIKKworICAgICAgICBjbGFzcyBGb28yKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUiZm9vIgorCisgICAgICAgIGNsYXNzIEZvbzMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKKworICAgICAgICBjbGFzcyBGb280KHN0cik6CisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iCisKKyAgICAgICAgY2xhc3MgRm9vNSh1bmljb2RlKToKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbyIKKworICAgICAgICBjbGFzcyBGb282KHN0cik6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvb3MiCisKKyAgICAgICAgICAgIGRlZiBfX3VuaWNvZGVfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJmb291IgorCisgICAgICAgIGNsYXNzIEZvbzcodW5pY29kZSk6CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvb3MiCisgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUiZm9vdSIKKworICAgICAgICBjbGFzcyBGb284KHVuaWNvZGUpOgorICAgICAgICAgICAgZGVmIF9fbmV3X18oY2xzLCBjb250ZW50PSIiKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdW5pY29kZS5fX25ld19fKGNscywgMipjb250ZW50KQorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgY2xhc3MgRm9vOSh1bmljb2RlKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIgorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAibm90IHVuaWNvZGUiCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzAoKSksIHUiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzEoKSksIHUiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzIoKSksIHUiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzMoKSksIHUiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzQoImJhciIpKSwgdSJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vNSgiYmFyIikpLCB1ImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShGb282KCJiYXIiKSksIHUiZm9vdSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShGb283KCJiYXIiKSksIHUiZm9vdSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZShGb284KCJmb28iKSksIHUiZm9vZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vOSgiZm9vIikpLCAic3RyaW5nIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKEZvbzkoImZvbyIpKSwgdSJub3QgdW5pY29kZSIpCisKKyAgICBkZWYgdGVzdF91bmljb2RlX3JlcHIoc2VsZik6CisgICAgICAgIGNsYXNzIHMxOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAnXFxuJworCisgICAgICAgIGNsYXNzIHMyOgorICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1J1xcbicKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoczEoKSksICdcXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoczIoKSksICdcXG4nKQorCisgICAgZGVmIHRlc3RfZXhwYW5kdGFic19vdmVyZmxvd3NfZ3JhY2VmdWxseShzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3Qgb25seSBhZmZlY3RzIDMyLWJpdCBwbGF0Zm9ybXMgYmVjYXVzZSBleHBhbmR0YWJzIGNhbiBvbmx5IHRha2UKKyAgICAgICAgIyBhbiBpbnQgYXMgdGhlIG1heCB2YWx1ZSwgbm90IGEgNjQtYml0IEMgbG9uZy4gIElmIGV4cGFuZHRhYnMgaXMgY2hhbmdlZAorICAgICAgICAjIHRvIHRha2UgYSA2NC1iaXQgbG9uZywgdGhpcyB0ZXN0IHNob3VsZCBhcHBseSB0byBhbGwgcGxhdGZvcm1zLgorICAgICAgICBpZiBzeXMubWF4aW50ID4gKDEgPDwgMzIpIG9yIHN0cnVjdC5jYWxjc2l6ZSgnUCcpICE9IDQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgdSd0XHR0XHQnLmV4cGFuZHRhYnMsIHN5cy5tYXhpbnQpCisKKyAgICBkZWYgdGVzdF9fZm9ybWF0X18oc2VsZik6CisgICAgICAgIGRlZiB0ZXN0KHZhbHVlLCBmb3JtYXQsIGV4cGVjdGVkKToKKyAgICAgICAgICAgICMgdGVzdCBib3RoIHdpdGggYW5kIHdpdGhvdXQgdGhlIHRyYWlsaW5nICdzJworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5fX2Zvcm1hdF9fKGZvcm1hdCksIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZS5fX2Zvcm1hdF9fKGZvcm1hdCArIHUncycpLCBleHBlY3RlZCkKKworICAgICAgICB0ZXN0KHUnJywgdScnLCB1JycpCisgICAgICAgIHRlc3QodSdhYmMnLCB1JycsIHUnYWJjJykKKyAgICAgICAgdGVzdCh1J2FiYycsIHUnLjMnLCB1J2FiYycpCisgICAgICAgIHRlc3QodSdhYicsIHUnLjMnLCB1J2FiJykKKyAgICAgICAgdGVzdCh1J2FiY2RlZicsIHUnLjMnLCB1J2FiYycpCisgICAgICAgIHRlc3QodSdhYmNkZWYnLCB1Jy4wJywgdScnKQorICAgICAgICB0ZXN0KHUnYWJjJywgdSczLjMnLCB1J2FiYycpCisgICAgICAgIHRlc3QodSdhYmMnLCB1JzIuMycsIHUnYWJjJykKKyAgICAgICAgdGVzdCh1J2FiYycsIHUnMi4yJywgdSdhYicpCisgICAgICAgIHRlc3QodSdhYmMnLCB1JzMuMicsIHUnYWIgJykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUneDwwJywgdSdyZXN1bHQnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSd4PDUnLCB1J3Jlc3VsdCcpCisgICAgICAgIHRlc3QodSdyZXN1bHQnLCB1J3g8NicsIHUncmVzdWx0JykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUneDw3JywgdSdyZXN1bHR4JykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUneDw4JywgdSdyZXN1bHR4eCcpCisgICAgICAgIHRlc3QodSdyZXN1bHQnLCB1JyA8NycsIHUncmVzdWx0ICcpCisgICAgICAgIHRlc3QodSdyZXN1bHQnLCB1Jzw3JywgdSdyZXN1bHQgJykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUnPjcnLCB1JyByZXN1bHQnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSc+OCcsIHUnICByZXN1bHQnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSdeOCcsIHUnIHJlc3VsdCAnKQorICAgICAgICB0ZXN0KHUncmVzdWx0JywgdSdeOScsIHUnIHJlc3VsdCAgJykKKyAgICAgICAgdGVzdCh1J3Jlc3VsdCcsIHUnXjEwJywgdScgIHJlc3VsdCAgJykKKyAgICAgICAgdGVzdCh1J2EnLCB1JzEwMDAwJywgdSdhJyArIHUnICcgKiA5OTk5KQorICAgICAgICB0ZXN0KHUnJywgdScxMDAwMCcsIHUnICcgKiAxMDAwMCkKKyAgICAgICAgdGVzdCh1JycsIHUnMTAwMDAwMDAnLCB1JyAnICogMTAwMDAwMDApCisKKyAgICAgICAgIyB0ZXN0IG1peGluZyB1bmljb2RlIGFuZCBzdHIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2FiYycuX19mb3JtYXRfXygncycpLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhYmMnLl9fZm9ybWF0X18oJy0+MTBzJyksIHUnLS0tLS0tLWFiYycpCisKKyAgICBkZWYgdGVzdF9mb3JtYXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScnLmZvcm1hdCgpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhJy5mb3JtYXQoKSwgdSdhJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2FiJy5mb3JtYXQoKSwgdSdhYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhe3snLmZvcm1hdCgpLCB1J2F7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2F9fScuZm9ybWF0KCksIHUnYX0nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne3tiJy5mb3JtYXQoKSwgdSd7YicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd9fWInLmZvcm1hdCgpLCB1J31iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2F7e2InLmZvcm1hdCgpLCB1J2F7YicpCisKKyAgICAgICAgIyBleGFtcGxlcyBmcm9tIHRoZSBQRVA6CisgICAgICAgIGltcG9ydCBkYXRldGltZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiTXkgbmFtZSBpcyB7MH0iLmZvcm1hdCh1J0ZyZWQnKSwgdSJNeSBuYW1lIGlzIEZyZWQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiTXkgbmFtZSBpcyB7MFtuYW1lXX0iLmZvcm1hdChkaWN0KG5hbWU9dSdGcmVkJykpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUiTXkgbmFtZSBpcyBGcmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ik15IG5hbWUgaXMgezB9IDote3t9fSIuZm9ybWF0KHUnRnJlZCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUiTXkgbmFtZSBpcyBGcmVkIDote30iKQorCisgICAgICAgICMgZGF0ZXRpbWUuX19mb3JtYXRfXyBkb2Vzbid0IHdvcmsgd2l0aCB1bmljb2RlCisgICAgICAgICNkID0gZGF0ZXRpbWUuZGF0ZSgyMDA3LCA4LCAxOCkKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwoIlRoZSB5ZWFyIGlzIHswLnllYXJ9Ii5mb3JtYXQoZCksCisgICAgICAgICMgICAgICAgICAgICAgICAgICJUaGUgeWVhciBpcyAyMDA3IikKKworICAgICAgICAjIGNsYXNzZXMgd2UnbGwgdXNlIGZvciB0ZXN0aW5nCisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeD0xMDApOgorICAgICAgICAgICAgICAgIHNlbGYuX3ggPSB4CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworCisgICAgICAgIGNsYXNzIEQ6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgc3BlYyk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmLngpCisKKyAgICAgICAgIyBjbGFzcyB3aXRoIF9fc3RyX18sIGJ1dCBubyBfX2Zvcm1hdF9fCisgICAgICAgIGNsYXNzIEU6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeCk6CisgICAgICAgICAgICAgICAgc2VsZi54ID0geAorICAgICAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUnRSgnICsgc2VsZi54ICsgdScpJworCisgICAgICAgICMgY2xhc3Mgd2l0aCBfX3JlcHJfXywgYnV0IG5vIF9fZm9ybWF0X18gb3IgX19zdHJfXworICAgICAgICBjbGFzcyBGOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHgpOgorICAgICAgICAgICAgICAgIHNlbGYueCA9IHgKKyAgICAgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSdGKCcgKyBzZWxmLnggKyB1JyknCisKKyAgICAgICAgIyBjbGFzcyB3aXRoIF9fZm9ybWF0X18gdGhhdCBmb3J3YXJkcyB0byBzdHJpbmcsIGZvciBzb21lIGZvcm1hdF9zcGVjJ3MKKyAgICAgICAgY2xhc3MgRzoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB4KToKKyAgICAgICAgICAgICAgICBzZWxmLnggPSB4CisgICAgICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdSJzdHJpbmcgaXMgIiArIHNlbGYueAorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIGlmIGZvcm1hdF9zcGVjID09ICdkJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUnRygnICsgc2VsZi54ICsgdScpJworICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QuX19mb3JtYXRfXyhzZWxmLCBmb3JtYXRfc3BlYykKKworICAgICAgICAjIGNsYXNzIHRoYXQgcmV0dXJucyBhIGJhZCB0eXBlIGZyb20gX19mb3JtYXRfXworICAgICAgICBjbGFzcyBIOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiAxLjAKKworICAgICAgICBjbGFzcyBJKGRhdGV0aW1lLmRhdGUpOgorICAgICAgICAgICAgZGVmIF9fZm9ybWF0X18oc2VsZiwgZm9ybWF0X3NwZWMpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN0cmZ0aW1lKGZvcm1hdF9zcGVjKQorCisgICAgICAgIGNsYXNzIEooaW50KToKKyAgICAgICAgICAgIGRlZiBfX2Zvcm1hdF9fKHNlbGYsIGZvcm1hdF9zcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50Ll9fZm9ybWF0X18oc2VsZiAqIDIsIGZvcm1hdF9zcGVjKQorCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZm9ybWF0KCksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2FiYycuZm9ybWF0KCksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swfScuZm9ybWF0KHUnYWJjJyksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOn0nLmZvcm1hdCh1J2FiYycpLCB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdYezB9Jy5mb3JtYXQodSdhYmMnKSwgdSdYYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swfVgnLmZvcm1hdCh1J2FiYycpLCB1J2FiY1gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnWHswfVknLmZvcm1hdCh1J2FiYycpLCB1J1hhYmNZJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3sxfScuZm9ybWF0KDEsIHUnYWJjJyksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J1h7MX0nLmZvcm1hdCgxLCB1J2FiYycpLCB1J1hhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezF9WCcuZm9ybWF0KDEsIHUnYWJjJyksIHUnYWJjWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdYezF9WScuZm9ybWF0KDEsIHUnYWJjJyksIHUnWGFiY1knKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezB9Jy5mb3JtYXQoLTE1KSwgdSctMTUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezB9ezF9Jy5mb3JtYXQoLTE1LCB1J2FiYycpLCB1Jy0xNWFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MH1YezF9Jy5mb3JtYXQoLTE1LCB1J2FiYycpLCB1Jy0xNVhhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne3snLmZvcm1hdCgpLCB1J3snKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnfX0nLmZvcm1hdCgpLCB1J30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne3t9fScuZm9ybWF0KCksIHUne30nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne3t4fX0nLmZvcm1hdCgpLCB1J3t4fScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7e3swfX19Jy5mb3JtYXQoMTIzKSwgdSd7MTIzfScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7e3t7MH19fX0nLmZvcm1hdCgpLCB1J3t7MH19JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J319e3snLmZvcm1hdCgpLCB1J317JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J319eHt7Jy5mb3JtYXQoKSwgdSd9eHsnKQorCisgICAgICAgICMgd2VpcmQgZmllbGQgbmFtZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InswW2Zvby1iYXJdfSIuZm9ybWF0KHt1J2Zvby1iYXInOnUnYmF6J30pLCB1J2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJ7MFtmb28gYmFyXX0iLmZvcm1hdCh7dSdmb28gYmFyJzp1J2Jheid9KSwgdSdiYXonKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezBbIF19Ii5mb3JtYXQoe3UnICc6M30pLCB1JzMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7Zm9vLl94fScuZm9ybWF0KGZvbz1DKDIwKSksIHUnMjAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezF9ezB9Jy5mb3JtYXQoRCgxMCksIEQoMjApKSwgdScyMDEwJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swLl94Lnh9Jy5mb3JtYXQoQyhEKHUnYWJjJykpKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezBbMF19Jy5mb3JtYXQoW3UnYWJjJywgdSdkZWYnXSksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swWzFdfScuZm9ybWF0KFt1J2FiYycsIHUnZGVmJ10pLCB1J2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MFsxXVswXX0nLmZvcm1hdChbdSdhYmMnLCBbdSdkZWYnXV0pLCB1J2RlZicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MFsxXVswXS54fScuZm9ybWF0KFsnYWJjJywgW0QodSdkZWYnKV1dKSwgdSdkZWYnKQorCisgICAgICAgICMgc3RyaW5ncworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6LjNzfScuZm9ybWF0KHUnYWJjJyksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOi4zc30nLmZvcm1hdCh1J2FiJyksIHUnYWInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6LjNzfScuZm9ybWF0KHUnYWJjZGVmJyksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOi4wc30nLmZvcm1hdCh1J2FiY2RlZicpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDozLjNzfScuZm9ybWF0KHUnYWJjJyksIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjIuM3N9Jy5mb3JtYXQodSdhYmMnKSwgdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6Mi4yc30nLmZvcm1hdCh1J2FiYycpLCB1J2FiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjMuMnN9Jy5mb3JtYXQodSdhYmMnKSwgdSdhYiAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6eDwwc30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1J3Jlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDp4PDVzfScuZm9ybWF0KHUncmVzdWx0JyksIHUncmVzdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOng8NnN9Jy5mb3JtYXQodSdyZXN1bHQnKSwgdSdyZXN1bHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6eDw3c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1J3Jlc3VsdHgnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6eDw4c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1J3Jlc3VsdHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOiA8N3N9Jy5mb3JtYXQodSdyZXN1bHQnKSwgdSdyZXN1bHQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjw3c30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1J3Jlc3VsdCAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6PjdzfScuZm9ybWF0KHUncmVzdWx0JyksIHUnIHJlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDo+OHN9Jy5mb3JtYXQodSdyZXN1bHQnKSwgdScgIHJlc3VsdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDpeOHN9Jy5mb3JtYXQodSdyZXN1bHQnKSwgdScgcmVzdWx0ICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDpeOXN9Jy5mb3JtYXQodSdyZXN1bHQnKSwgdScgcmVzdWx0ICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6XjEwc30nLmZvcm1hdCh1J3Jlc3VsdCcpLCB1JyAgcmVzdWx0ICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6MTAwMDB9Jy5mb3JtYXQodSdhJyksIHUnYScgKyB1JyAnICogOTk5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjEwMDAwfScuZm9ybWF0KHUnJyksIHUnICcgKiAxMDAwMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOjEwMDAwMDAwfScuZm9ybWF0KHUnJyksIHUnICcgKiAxMDAwMDAwMCkKKworICAgICAgICAjIGZvcm1hdCBzcGVjaWZpZXJzIGZvciB1c2VyIGRlZmluZWQgdHlwZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6YWJjfScuZm9ybWF0KEMoKSksIHUnYWJjJykKKworICAgICAgICAjICFyIGFuZCAhcyBjb2VyY2lvbnMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swIXN9Jy5mb3JtYXQodSdIZWxsbycpLCB1J0hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swIXM6fScuZm9ybWF0KHUnSGVsbG8nKSwgdSdIZWxsbycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MCFzOjE1fScuZm9ybWF0KHUnSGVsbG8nKSwgdSdIZWxsbyAgICAgICAgICAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezAhczoxNXN9Jy5mb3JtYXQodSdIZWxsbycpLCB1J0hlbGxvICAgICAgICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MCFyfScuZm9ybWF0KHUnSGVsbG8nKSwgdSJ1J0hlbGxvJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MCFyOn0nLmZvcm1hdCh1J0hlbGxvJyksIHUidSdIZWxsbyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezAhcn0nLmZvcm1hdChGKHUnSGVsbG8nKSksIHUnRihIZWxsbyknKQorCisgICAgICAgICMgdGVzdCBmYWxsYmFjayB0byBvYmplY3QuX19mb3JtYXRfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezB9Jy5mb3JtYXQoe30pLCB1J3t9JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swfScuZm9ybWF0KFtdKSwgdSdbXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MH0nLmZvcm1hdChbMV0pLCB1J1sxXScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MH0nLmZvcm1hdChFKHUnZGF0YScpKSwgdSdFKGRhdGEpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3swOmR9Jy5mb3JtYXQoRyh1J2RhdGEnKSksIHUnRyhkYXRhKScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MCFzfScuZm9ybWF0KEcodSdkYXRhJykpLCB1J3N0cmluZyBpcyBkYXRhJykKKworICAgICAgICBtc2cgPSAnb2JqZWN0Ll9fZm9ybWF0X18gd2l0aCBhIG5vbi1lbXB0eSBmb3JtYXQgc3RyaW5nIGlzIGRlcHJlY2F0ZWQnCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKChtc2csIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcpKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDpeMTB9Jy5mb3JtYXQoRSh1J2RhdGEnKSksIHUnIEUoZGF0YSkgICcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6XjEwc30nLmZvcm1hdChFKHUnZGF0YScpKSwgdScgRShkYXRhKSAgJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7MDo+MTVzfScuZm9ybWF0KEcodSdkYXRhJykpLCB1JyBzdHJpbmcgaXMgZGF0YScpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InswOmRhdGU6ICVZLSVtLSVkfSIuZm9ybWF0KEkoeWVhcj0yMDA3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb250aD04LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXk9MjcpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1ImRhdGU6IDIwMDctMDgtMjciKQorCisgICAgICAgICMgdGVzdCBkZXJpdmluZyBmcm9tIGEgYnVpbHRpbiB0eXBlIGFuZCBvdmVycmlkaW5nIF9fZm9ybWF0X18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InswfSIuZm9ybWF0KEooMTApKSwgdSIyMCIpCisKKworICAgICAgICAjIHN0cmluZyBmb3JtYXQgc3BlY2lmaWVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezA6fScuZm9ybWF0KCdhJyksIHUnYScpCisKKyAgICAgICAgIyBjb21wdXRlZCBmb3JtYXQgc3BlY2lmaWVycworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezA6LnsxfX0iLmZvcm1hdCh1J2hlbGxvIHdvcmxkJywgNSksIHUnaGVsbG8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiezA6LnsxfXN9Ii5mb3JtYXQodSdoZWxsbyB3b3JsZCcsIDUpLCB1J2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InswOi57cHJlY2lzaW9ufXN9Ii5mb3JtYXQoJ2hlbGxvIHdvcmxkJywgcHJlY2lzaW9uPTUpLCB1J2hlbGxvJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1InswOnt3aWR0aH0ue3ByZWNpc2lvbn1zfSIuZm9ybWF0KCdoZWxsbyB3b3JsZCcsIHdpZHRoPTEwLCBwcmVjaXNpb249NSksIHUnaGVsbG8gICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJ7MDp7d2lkdGh9LntwcmVjaXNpb259c30iLmZvcm1hdCgnaGVsbG8gd29ybGQnLCB3aWR0aD0nMTAnLCBwcmVjaXNpb249JzUnKSwgdSdoZWxsbyAgICAgJykKKworICAgICAgICAjIHRlc3QgdmFyaW91cyBlcnJvcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSd7Jy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUnfScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1J2F7Jy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUnYX0nLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSd7YScuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1J31hJy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHUnezB9Jy5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHUnezF9Jy5mb3JtYXQsIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsICAgdSd7eH0nLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ9eyIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InsiLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ9Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiYWJjezA6e30iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MCIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1InswLn0iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MC59Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHUiezBbfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswW30iLmZvcm1hdCwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCAgIHUiezBdfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswLltdfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswLi5mb299Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezBbMH0iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MFswOmZvb30iLmZvcm1hdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsICAgdSJ7Y119Ii5mb3JtYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUie3sge3t7MH19Ii5mb3JtYXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezB9fSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgICB1Intmb299Ii5mb3JtYXQsIGJhcj0zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswIXh9Ii5mb3JtYXQsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUiezAhfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswIXJzfSIuZm9ybWF0LCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InshfSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ins6fSIuZm9ybWF0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB1Ins6c30iLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdSJ7fSIuZm9ybWF0KQorICAgICAgICBiaWcgPSB1IjIzMDk4NDc1MDI5Mzg0NzAyOTgzNDc2MDk4MjMwNzU0OTczMjA5NDgyNTczIgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCAodSJ7IiArIGJpZyArIHUifSIpLmZvcm1hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgKHUie1siICsgYmlnICsgdSJdfSIpLmZvcm1hdCwgWzBdKQorCisgICAgICAgICMgaXNzdWUgNjA4OQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswWzBdeH0iLmZvcm1hdCwgW05vbmVdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1InswWzBdKDEwKX0iLmZvcm1hdCwgW05vbmVdKQorCisgICAgICAgICMgY2FuJ3QgaGF2ZSBhIHJlcGxhY2VtZW50IG9uIHRoZSBmaWVsZCBuYW1lIHBvcnRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1J3swW3sxfV19Jy5mb3JtYXQsIHUnYWJjZGVmZycsIDQpCisKKyAgICAgICAgIyBleGNlZWQgbWF4aW11bSByZWN1cnNpb24gZGVwdGgKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MDp7MTp7Mn19fSIuZm9ybWF0LCB1J2FiYycsIHUncycsIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MDp7MTp7Mjp7Mzp7NDp7NTp7Nn19fX19fX0iLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNykKKworICAgICAgICAjIHN0cmluZyBmb3JtYXQgc3BlYyBlcnJvcnMKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MDotc30iLmZvcm1hdCwgdScnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmb3JtYXQsIHUiIiwgdSItIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSJ7MDo9c30iLmZvcm1hdCwgdScnKQorCisgICAgICAgICMgdGVzdCBjb21iaW5pbmcgc3RyaW5nIGFuZCB1bmljb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJmb297MH0iLmZvcm1hdCgnYmFyJyksIHUnZm9vYmFyJykKKyAgICAgICAgIyBUaGlzIHdpbGwgdHJ5IHRvIGNvbnZlcnQgdGhlIGFyZ3VtZW50IGZyb20gdW5pY29kZSB0byBzdHIsIHdoaWNoCisgICAgICAgICMgIHdpbGwgc3VjY2VlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJmb297MH0iLmZvcm1hdCh1J2JhcicpLCAnZm9vYmFyJykKKyAgICAgICAgIyBUaGlzIHdpbGwgdHJ5IHRvIGNvbnZlcnQgdGhlIGFyZ3VtZW50IGZyb20gdW5pY29kZSB0byBzdHIsIHdoaWNoCisgICAgICAgICMgIHdpbGwgZmFpbAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsICJmb297MH0iLmZvcm1hdCwgdSdcdTEwMDBiYXInKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X2h1Z2VfcHJlY2lzaW9uKHNlbGYpOgorICAgICAgICBmb3JtYXRfc3RyaW5nID0gdSIue31mIi5mb3JtYXQoc3lzLm1heHNpemUgKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0KDIuMzQsIGZvcm1hdF9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfaHVnZV93aWR0aChzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IHUie31mIi5mb3JtYXQoc3lzLm1heHNpemUgKyAxKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgorICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0KDIuMzQsIGZvcm1hdF9zdHJpbmcpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfaHVnZV9pdGVtX251bWJlcihzZWxmKToKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IHUie3t7fTouNmZ9fSIuZm9ybWF0KHN5cy5tYXhzaXplICsgMSkKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKKyAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdF9zdHJpbmcuZm9ybWF0KDIuMzQpCisKKyAgICBkZWYgdGVzdF9mb3JtYXRfYXV0b19udW1iZXJpbmcoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgeD0xMDApOgorICAgICAgICAgICAgICAgIHNlbGYuX3ggPSB4CisgICAgICAgICAgICBkZWYgX19mb3JtYXRfXyhzZWxmLCBzcGVjKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BlYworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7fScuZm9ybWF0KDEwKSwgdScxMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7OjV9Jy5mb3JtYXQoJ3MnKSwgdSdzICAgICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSd7IXJ9Jy5mb3JtYXQoJ3MnKSwgdSIncyciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUney5feH0nLmZvcm1hdChDKDEwKSksIHUnMTAnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne1sxXX0nLmZvcm1hdChbMSwgMl0pLCB1JzInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne1thXX0nLmZvcm1hdCh7J2EnOjQsICdiJzoyfSksIHUnNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhe31ie31jJy5mb3JtYXQoMCwgMSksIHUnYTBiMWMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhezp7fX1iJy5mb3JtYXQoJ3gnLCAnXjEwJyksIHUnYSAgICB4ICAgICBiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2F7Ont9eH1iJy5mb3JtYXQoMjAsICcjJyksIHUnYTB4MTRiJykKKworICAgICAgICAjIGNhbid0IG1peCBhbmQgbWF0Y2ggbnVtYmVyaW5nIGFuZCBhdXRvLW51bWJlcmluZworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1J3t9ezF9Jy5mb3JtYXQsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHUnezF9e30nLmZvcm1hdCwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSd7OnsxfX0nLmZvcm1hdCwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdSd7MDp7fX0nLmZvcm1hdCwgMSwgMikKKworICAgICAgICAjIGNhbiBtaXggYW5kIG1hdGNoIGF1dG8tbnVtYmVyaW5nIGFuZCBuYW1lZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne2Z9e30nLmZvcm1hdCg0LCBmPSd0ZXN0JyksIHUndGVzdDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUne317Zn0nLmZvcm1hdCg0LCBmPSd0ZXN0JyksIHUnNHRlc3QnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnezp7Zn19e2d9e30nLmZvcm1hdCgxLCAzLCBnPSdnJywgZj0yKSwgdScgMWczJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J3tmOnt9fXt9e2d9Jy5mb3JtYXQoMiwgNCwgZj0xLCBnPSdnJyksIHUnIDE0ZycpCisKKyAgICBkZWYgdGVzdF9yYWlzZU1lbUVycm9yKHNlbGYpOgorICAgICAgICAjIEVuc3VyZSB0aGF0IHRoZSBmcmVlbGlzdCBjb250YWlucyBhIGNvbnNpc3RlbnQgb2JqZWN0LCBldmVuCisgICAgICAgICMgd2hlbiBhIHN0cmluZyBhbGxvY2F0aW9uIGZhaWxzIHdpdGggYSBNZW1vcnlFcnJvci4KKyAgICAgICAgIyBUaGlzIHVzZWQgdG8gY3Jhc2ggdGhlIGludGVycHJldGVyLAorICAgICAgICAjIG9yIGxlYWsgcmVmZXJlbmNlcyB3aGVuIHRoZSBudW1iZXIgd2FzIHNtYWxsZXIuCisgICAgICAgIGNoYXJ3aWR0aCA9IDQgaWYgc3lzLm1heHVuaWNvZGUgPj0gMHgxMDAwMCBlbHNlIDIKKyAgICAgICAgIyBOb3RlOiBzeXMubWF4c2l6ZSBpcyBoYWxmIG9mIHRoZSBhY3R1YWwgbWF4IGFsbG9jYXRpb24gYmVjYXVzZSBvZgorICAgICAgICAjIHRoZSBzaWduZWRuZXNzIG9mIFB5X3NzaXplX3QuCisgICAgICAgIGFsbG9jID0gbGFtYmRhOiB1ImEiICogKHN5cy5tYXhzaXplIC8vIGNoYXJ3aWR0aCAqIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE1lbW9yeUVycm9yLCBhbGxvYykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTWVtb3J5RXJyb3IsIGFsbG9jKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBVKHVuaWNvZGUpOgorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1J19fdW5pY29kZV9fIG92ZXJyaWRkZW4nCisgICAgICAgIHUgPSBVKHUneHh4JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiJXMiICUgdSwgdSdfX3VuaWNvZGVfXyBvdmVycmlkZGVuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgie30iLmZvcm1hdCh1KSwgJ19fdW5pY29kZV9fIG92ZXJyaWRkZW4nKQorCisgICAgZGVmIHRlc3RfZW5jb2RlX2RlY2ltYWwoc2VsZik6CisgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCB1bmljb2RlX2VuY29kZWRlY2ltYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodScxMjMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJzEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUnXHUwNjYzLlx1MDY2MVx1MDY2NCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInMy4xNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUiXE57RU0gU1BBQ0V9My4xNFxOe0VOIFNQQUNFfSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInIDMuMTQgJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bmljb2RlX2VuY29kZWRlY2ltYWwsIHUiMTIzXHUyMGFjIiwgInN0cmljdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUiMTIzXHUyMGFjIiwgInJlcGxhY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJzEyMz8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVfZW5jb2RlZGVjaW1hbCh1IjEyM1x1MjBhYyIsICJpZ25vcmUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJzEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUiMTIzXHUyMGFjIiwgInhtbGNoYXJyZWZyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYicxMjMmIzgzNjQ7JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodSIxMjNcdTIwYWMiLCAiYmFja3NsYXNocmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInMTIzXFx1MjBhYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZV9lbmNvZGVkZWNpbWFsKHUiMTIzXHUyMGFjXE57RU0gU1BBQ0V9IiwgInJlcGxhY2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBiJzEyMz8gJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlX2VuY29kZWRlY2ltYWwodSIxMjNcdTIwYWNcdTIwYWMiLCAicmVwbGFjZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGInMTIzPz8nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGVfZW5jb2RlZGVjaW1hbCh1IjEyM1x1MjBhY1x1MDY2MCIsICJyZXBsYWNlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgYicxMjM/MCcpCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoX19uYW1lX18pCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0OTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0OTUyNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVfZmlsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVfZmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDRiYWQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5CkBAIC0wLDAgKzEsMjAwIEBACisjIFRlc3Qgc29tZSBVbmljb2RlIGZpbGUgbmFtZSBzZW1hbnRpY3MKKyMgV2UgZG9udCB0ZXN0IG1hbnkgb3BlcmF0aW9ucyBvbiBmaWxlcyBvdGhlciB0aGFuCisjIHRoYXQgdGhlaXIgbmFtZXMgY2FuIGJlIHVzZWQgd2l0aCBVbmljb2RlIGNoYXJhY3RlcnMuCitpbXBvcnQgb3MsIGdsb2IsIHRpbWUsIHNodXRpbAoraW1wb3J0IHVuaWNvZGVkYXRhCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCBURVNURk5fVU5JQ09ERQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOX0VOQ09ESU5HLCBURVNURk5fVU5FTkNPREFCTEUKK3RyeToKKyAgICBURVNURk5fRU5DT0RFRCA9IFRFU1RGTl9VTklDT0RFLmVuY29kZShURVNURk5fRU5DT0RJTkcpCitleGNlcHQgKFVuaWNvZGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAjIEVpdGhlciB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgaXMgTm9uZSwgb3IgdGhlIGZpbGUgbmFtZQorICAgICMgY2Fubm90IGJlIGVuY29kZWQgaW4gdGhlIGZpbGUgc3lzdGVtIGVuY29kaW5nLgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJObyBVbmljb2RlIGZpbGVzeXN0ZW0gc2VtYW50aWNzIG9uIHRoaXMgcGxhdGZvcm0uIikKKworaWYgVEVTVEZOX0VOQ09ERUQuZGVjb2RlKFRFU1RGTl9FTkNPRElORykgIT0gVEVTVEZOX1VOSUNPREU6CisgICAgIyBUaGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcgZG9lcyBub3Qgc3VwcG9ydCBMYXRpbi0xCisgICAgIyAod2hpY2ggdGVzdF9zdXBwb3J0IGFzc3VtZXMpLCBzbyB0cnkgdGhlIGZpbGUgc3lzdGVtCisgICAgIyBlbmNvZGluZyBpbnN0ZWFkLgorICAgIGltcG9ydCBzeXMKKyAgICB0cnk6CisgICAgICAgIFRFU1RGTl9VTklDT0RFID0gdW5pY29kZSgiQHRlc3QtXHhlMFx4ZjIiLCBzeXMuZ2V0ZmlsZXN5c3RlbWVuY29kaW5nKCkpCisgICAgICAgIFRFU1RGTl9FTkNPREVEID0gVEVTVEZOX1VOSUNPREUuZW5jb2RlKFRFU1RGTl9FTkNPRElORykKKyAgICAgICAgaWYgJz8nIGluIFRFU1RGTl9FTkNPREVEOgorICAgICAgICAgICAgIyBNQkNTIHdpbGwgbm90IHJlcG9ydCB0aGUgZXJyb3IgcHJvcGVybHkKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgIm1iY3MgZW5jb2RpbmcgcHJvYmxlbSIKKyAgICBleGNlcHQgKFVuaWNvZGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoIkNhbm5vdCBmaW5kIGEgc3VpdGVhYmxlIGZpbGVuYW1lLiIpCisKK2lmIFRFU1RGTl9FTkNPREVELmRlY29kZShURVNURk5fRU5DT0RJTkcpICE9IFRFU1RGTl9VTklDT0RFOgorICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCJDYW5ub3QgZmluZCBhIHN1aXRhYmxlIGZpbGVuYW1lLiIpCisKK2RlZiByZW1vdmVfaWZfZXhpc3RzKGZpbGVuYW1lKToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworY2xhc3MgVGVzdFVuaWNvZGVGaWxlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGUgJ2RvXycgZnVuY3Rpb25zIGFyZSB0aGUgYWN0dWFsIHRlc3RzLiAgVGhleSBnZW5lcmFsbHkgYXNzdW1lIHRoZQorICAgICMgZmlsZSBhbHJlYWR5IGV4aXN0cyBldGMuCisKKyAgICAjIERvIGFsbCB0aGUgdGVzdHMgd2UgY2FuIGdpdmVuIG9ubHkgYSBzaW5nbGUgZmlsZW5hbWUuICBUaGUgZmlsZSBzaG91bGQKKyAgICAjIGV4aXN0LgorICAgIGRlZiBfZG9fc2luZ2xlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLmFjY2VzcyhmaWxlbmFtZSwgb3MuUl9PSykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MuYWNjZXNzKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSksIG9zLlJfT0spKQorICAgICAgICBvcy5jaG1vZChmaWxlbmFtZSwgMDc3NykKKyAgICAgICAgb3MudXRpbWUoZmlsZW5hbWUsIE5vbmUpCisgICAgICAgIG9zLnV0aW1lKGZpbGVuYW1lLCAodGltZS50aW1lKCksIHRpbWUudGltZSgpKSkKKyAgICAgICAgIyBDb3B5L3JlbmFtZSBldGMgdGVzdHMgdXNpbmcgdGhlIHNhbWUgZmlsZW5hbWUKKyAgICAgICAgc2VsZi5fZG9fY29weWlzaChmaWxlbmFtZSwgZmlsZW5hbWUpCisgICAgICAgICMgRmlsZW5hbWUgc2hvdWxkIGFwcGVhciBpbiBnbG9iIG91dHB1dAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCisgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpPT1vcy5wYXRoLmFic3BhdGgoZ2xvYi5nbG9iKGZpbGVuYW1lKVswXSkpCisgICAgICAgICMgYmFzZW5hbWUgc2hvdWxkIGFwcGVhciBpbiBsaXN0ZGlyLgorICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKQorICAgICAgICBpZiBpc2luc3RhbmNlKGJhc2UsIHN0cik6CisgICAgICAgICAgICBiYXNlID0gYmFzZS5kZWNvZGUoVEVTVEZOX0VOQ09ESU5HKQorICAgICAgICBmaWxlX2xpc3QgPSBvcy5saXN0ZGlyKHBhdGgpCisgICAgICAgICMgbGlzdGRpcigpIHdpdGggYSB1bmljb2RlIGFyZyBtYXkgb3IgbWF5IG5vdCByZXR1cm4gVW5pY29kZQorICAgICAgICAjIG9iamVjdHMsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0uCisgICAgICAgIGlmIGZpbGVfbGlzdCBhbmQgaXNpbnN0YW5jZShmaWxlX2xpc3RbMF0sIHN0cik6CisgICAgICAgICAgICBmaWxlX2xpc3QgPSBbZi5kZWNvZGUoVEVTVEZOX0VOQ09ESU5HKSBmb3IgZiBpbiBmaWxlX2xpc3RdCisKKyAgICAgICAgIyBOb3JtYWxpemUgdGhlIHVuaWNvZGUgc3RyaW5ncywgYXMgcm91bmQtdHJpcHBpbmcgdGhlIG5hbWUgdmlhIHRoZSBPUworICAgICAgICAjIG1heSByZXR1cm4gYSBkaWZmZXJlbnQgKGJ1dCBlcXVpdmFsZW50KSB2YWx1ZS4KKyAgICAgICAgYmFzZSA9IHVuaWNvZGVkYXRhLm5vcm1hbGl6ZSgiTkZEIiwgYmFzZSkKKyAgICAgICAgZmlsZV9saXN0ID0gW3VuaWNvZGVkYXRhLm5vcm1hbGl6ZSgiTkZEIiwgZikgZm9yIGYgaW4gZmlsZV9saXN0XQorCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oYmFzZSwgZmlsZV9saXN0KQorCisgICAgIyBEbyBhcyBtYW55ICJlcXVpdmFsYW5jeScgdGVzdHMgYXMgd2UgY2FuIC0gaWUsIGNoZWNrIHRoYXQgYWx0aG91Z2ggd2UKKyAgICAjIGhhdmUgZGlmZmVyZW50IHR5cGVzIGZvciB0aGUgZmlsZW5hbWUsIHRoZXkgcmVmZXIgdG8gdGhlIHNhbWUgZmlsZS4KKyAgICBkZWYgX2RvX2VxdWl2YWxlbnQoc2VsZiwgZmlsZW5hbWUxLCBmaWxlbmFtZTIpOgorICAgICAgICAjIE5vdGUgd2Ugb25seSBjaGVjayAiZmlsZW5hbWUxIGFnYWluc3QgZmlsZW5hbWUyIiAtIHdlIGRvbid0IGJvdGhlcgorICAgICAgICAjIGNoZWNraW5nICJmaWxlbmFtZTIgYWdhaW5zdCAxIiwgYXMgd2UgYXNzdW1lIHdlIGFyZSBjYWxsZWQgYWdhaW4gd2l0aAorICAgICAgICAjIHRoZSBhcmdzIHJldmVyc2VkLgorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShmaWxlbmFtZTEpIT10eXBlKGZpbGVuYW1lMiksCisgICAgICAgICAgICAgICAgICAgICJObyBwb2ludCBjaGVja2luZyBlcXVpdmFsZW50IGZpbGVuYW1lcyBvZiB0aGUgc2FtZSB0eXBlIikKKyAgICAgICAgIyBzdGF0IGFuZCBsc3RhdCBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHJlc3VsdHMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlbmFtZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KGZpbGVuYW1lMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHN0YXQoZmlsZW5hbWUxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubHN0YXQoZmlsZW5hbWUyKSkKKyAgICAgICAgIyBDb3B5L3JlbmFtZSBldGMgdGVzdHMgdXNpbmcgZXF1aXZhbGVudCBmaWxlbmFtZQorICAgICAgICBzZWxmLl9kb19jb3B5aXNoKGZpbGVuYW1lMSwgZmlsZW5hbWUyKQorCisgICAgIyBUZXN0cyB0aGF0IGNvcHksIG1vdmUsIGV0YyBvbmUgZmlsZSB0byBhbm90aGVyLgorICAgIGRlZiBfZG9fY29weWlzaChzZWxmLCBmaWxlbmFtZTEsIGZpbGVuYW1lMik6CisgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gcmVuYW1lIHRoZSBmaWxlIHVzaW5nIGVpdGhlciBuYW1lLgorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUxKSkgIyBtdXN0IGV4aXN0LgorICAgICAgICBvcy5yZW5hbWUoZmlsZW5hbWUxLCBmaWxlbmFtZTIgKyAiLm5ldyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShmaWxlbmFtZTErIi5uZXciKSkKKyAgICAgICAgb3MucmVuYW1lKGZpbGVuYW1lMSArICIubmV3IiwgZmlsZW5hbWUyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUyKSkKKworICAgICAgICBzaHV0aWwuY29weShmaWxlbmFtZTEsIGZpbGVuYW1lMiArICIubmV3IikKKyAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lMSArICIubmV3IikgIyByZW1vdmUgdXNpbmcgZXF1aXYgbmFtZS4KKyAgICAgICAgIyBBbmQgYSBjb3VwbGUgb2YgbW92ZXMsIG9uZSB1c2luZyBlYWNoIG5hbWUuCisgICAgICAgIHNodXRpbC5tb3ZlKGZpbGVuYW1lMSwgZmlsZW5hbWUyICsgIi5uZXciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lMikpCisgICAgICAgIHNodXRpbC5tb3ZlKGZpbGVuYW1lMSArICIubmV3IiwgZmlsZW5hbWUyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZmlsZW5hbWUxKSkKKyAgICAgICAgIyBOb3RlIC0gZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzaHV0aWwubW92ZSwKKyAgICAgICAgIyBpdCB0cmllcyBhIHJlbmFtZSBmaXJzdC4gIFRoaXMgb25seSBmYWlscyBvbiBXaW5kb3dzIHdoZW4gb24KKyAgICAgICAgIyBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zIC0gYW5kIHRoaXMgdGVzdCBjYW4ndCBlbnN1cmUgdGhhdC4KKyAgICAgICAgIyBTbyB3ZSB0ZXN0IHRoZSBzaHV0aWwuY29weTIgZnVuY3Rpb24sIHdoaWNoIGlzIHRoZSB0aGluZyBtb3N0CisgICAgICAgICMgbGlrZWx5IHRvIGZhaWwuCisgICAgICAgIHNodXRpbC5jb3B5MihmaWxlbmFtZTEsIGZpbGVuYW1lMiArICIubmV3IikKKyAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lMSArICIubmV3IikKKworICAgIGRlZiBfZG9fZGlyZWN0b3J5KHNlbGYsIG1ha2VfbmFtZSwgY2hkaXJfbmFtZSwgZW5jb2RlZCk6CisgICAgICAgIGN3ZCA9IG9zLmdldGN3ZCgpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIobWFrZV9uYW1lKToKKyAgICAgICAgICAgIG9zLnJtZGlyKG1ha2VfbmFtZSkKKyAgICAgICAgb3MubWtkaXIobWFrZV9uYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jaGRpcihjaGRpcl9uYW1lKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBlbmNvZGVkOgorICAgICAgICAgICAgICAgICAgICBjd2RfcmVzdWx0ID0gb3MuZ2V0Y3dkdSgpCisgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzdWx0ID0gbWFrZV9uYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgY3dkX3Jlc3VsdCA9IG9zLmdldGN3ZCgpLmRlY29kZShURVNURk5fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzdWx0ID0gbWFrZV9uYW1lLmRlY29kZShURVNURk5fRU5DT0RJTkcpCisKKyAgICAgICAgICAgICAgICBjd2RfcmVzdWx0ID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBjd2RfcmVzdWx0KQorICAgICAgICAgICAgICAgIG5hbWVfcmVzdWx0ID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBuYW1lX3Jlc3VsdCkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5iYXNlbmFtZShjd2RfcmVzdWx0KSxuYW1lX3Jlc3VsdCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3MuY2hkaXIoY3dkKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Mucm1kaXIobWFrZV9uYW1lKQorCisgICAgIyBUaGUgJ190ZXN0JyBmdW5jdGlvbnMgJ2VudHJ5IHBvaW50cyB3aXRoIHBhcmFtcycgLSBpZSwgd2hhdCB0aGUKKyAgICAjIHRvcC1sZXZlbCAndGVzdCcgZnVuY3Rpb25zIHdvdWxkIGJlIGlmIHRoZXkgY291bGQgdGFrZSBwYXJhbXMKKyAgICBkZWYgX3Rlc3Rfc2luZ2xlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgcmVtb3ZlX2lmX2V4aXN0cyhmaWxlbmFtZSkKKyAgICAgICAgZiA9IGZpbGUoZmlsZW5hbWUsICJ3IikKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2RvX3NpbmdsZShmaWxlbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkpCisgICAgICAgICMgYW5kIGFnYWluIHdpdGggb3Mub3Blbi4KKyAgICAgICAgZiA9IG9zLm9wZW4oZmlsZW5hbWUsIG9zLk9fQ1JFQVQpCisgICAgICAgIG9zLmNsb3NlKGYpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2RvX3NpbmdsZShmaWxlbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKworICAgIGRlZiBfdGVzdF9lcXVpdmFsZW50KHNlbGYsIGZpbGVuYW1lMSwgZmlsZW5hbWUyKToKKyAgICAgICAgcmVtb3ZlX2lmX2V4aXN0cyhmaWxlbmFtZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUyKSkKKyAgICAgICAgZiA9IGZpbGUoZmlsZW5hbWUxLCAidyIpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9kb19lcXVpdmFsZW50KGZpbGVuYW1lMSwgZmlsZW5hbWUyKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lMSkKKworICAgICMgVGhlICd0ZXN0JyBmdW5jdGlvbnMgYXJlIHVuaXR0ZXN0IGVudHJ5IHBvaW50cywgYW5kIHNpbXBseSBjYWxsIG91cgorICAgICMgX3Rlc3QgZnVuY3Rpb25zIHdpdGggZWFjaCBvZiB0aGUgZmlsZW5hbWUgY29tYmluYXRpb25zIHdlIHdpc2ggdG8gdGVzdAorICAgIGRlZiB0ZXN0X3NpbmdsZV9maWxlcyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9zaW5nbGUoVEVTVEZOX0VOQ09ERUQpCisgICAgICAgIHNlbGYuX3Rlc3Rfc2luZ2xlKFRFU1RGTl9VTklDT0RFKQorICAgICAgICBpZiBURVNURk5fVU5FTkNPREFCTEUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl90ZXN0X3NpbmdsZShURVNURk5fVU5FTkNPREFCTEUpCisKKyAgICBkZWYgdGVzdF9lcXVpdmFsZW50X2ZpbGVzKHNlbGYpOgorICAgICAgICBzZWxmLl90ZXN0X2VxdWl2YWxlbnQoVEVTVEZOX0VOQ09ERUQsIFRFU1RGTl9VTklDT0RFKQorICAgICAgICBzZWxmLl90ZXN0X2VxdWl2YWxlbnQoVEVTVEZOX1VOSUNPREUsIFRFU1RGTl9FTkNPREVEKQorCisgICAgZGVmIHRlc3RfZGlyZWN0b3JpZXMoc2VsZik6CisgICAgICAgICMgRm9yIGFsbCAnZXF1aXZhbGVudCcgY29tYmluYXRpb25zOgorICAgICAgICAjICBNYWtlIGRpciB3aXRoIGVuY29kZWQsIGNoZGlyIHdpdGggdW5pY29kZSwgY2hlY2tkaXIgd2l0aCBlbmNvZGVkCisgICAgICAgICMgIChvciB1bmljb2RlL2VuY29kZWQvdW5pY29kZSwgZXRjCisgICAgICAgIGV4dCA9ICIuZGlyIgorICAgICAgICBzZWxmLl9kb19kaXJlY3RvcnkoVEVTVEZOX0VOQ09ERUQrZXh0LCBURVNURk5fRU5DT0RFRCtleHQsIFRydWUpCisgICAgICAgIHNlbGYuX2RvX2RpcmVjdG9yeShURVNURk5fRU5DT0RFRCtleHQsIFRFU1RGTl9VTklDT0RFK2V4dCwgVHJ1ZSkKKyAgICAgICAgc2VsZi5fZG9fZGlyZWN0b3J5KFRFU1RGTl9VTklDT0RFK2V4dCwgVEVTVEZOX0VOQ09ERUQrZXh0LCBGYWxzZSkKKyAgICAgICAgc2VsZi5fZG9fZGlyZWN0b3J5KFRFU1RGTl9VTklDT0RFK2V4dCwgVEVTVEZOX1VOSUNPREUrZXh0LCBGYWxzZSkKKyAgICAgICAgIyBPdXIgZGlyZWN0b3J5IG5hbWUgdGhhdCBjYW4ndCB1c2UgYSBub24tdW5pY29kZSBuYW1lLgorICAgICAgICBpZiBURVNURk5fVU5FTkNPREFCTEUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9kb19kaXJlY3RvcnkoVEVTVEZOX1VORU5DT0RBQkxFK2V4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNURk5fVU5FTkNPREFCTEUrZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhbHNlKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc4ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc4ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGVjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weQpAQCAtMCwwICsxLDMxNyBAQAorIiIiIFRlc3Qgc2NyaXB0IGZvciB0aGUgdW5pY29kZWRhdGEgbW9kdWxlLgorCisgICAgV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyAgICAoYykgQ29weXJpZ2h0IENOUkksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIE5PIFdBUlJBTlRZLgorCisiIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorCitlbmNvZGluZyA9ICd1dGYtOCcKKworCisjIyMgUnVuIHRlc3RzCisKK2NsYXNzIFVuaWNvZGVNZXRob2RzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICAjIHVwZGF0ZSB0aGlzLCBpZiB0aGUgZGF0YWJhc2UgY2hhbmdlcworICAgIGV4cGVjdGVkY2hlY2tzdW0gPSAnNDUwNGRmZmQwMzViYWVhMDJjNWI5ZGU4MmJlYmMzZDY1ZTBlMGJhZicKKworICAgIGRlZiB0ZXN0X21ldGhvZF9jaGVja3N1bShzZWxmKToKKyAgICAgICAgaCA9IGhhc2hsaWIuc2hhMSgpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDB4MTAwMDApOgorICAgICAgICAgICAgY2hhciA9IHVuaWNocihpKQorICAgICAgICAgICAgZGF0YSA9IFsKKyAgICAgICAgICAgICAgICAjIFByZWRpY2F0ZXMgKHNpbmdsZSBjaGFyKQorICAgICAgICAgICAgICAgIHUiMDEiW2NoYXIuaXNhbG51bSgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIltjaGFyLmlzYWxwaGEoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbY2hhci5pc2RlY2ltYWwoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbY2hhci5pc2RpZ2l0KCldLAorICAgICAgICAgICAgICAgIHUiMDEiW2NoYXIuaXNsb3dlcigpXSwKKyAgICAgICAgICAgICAgICB1IjAxIltjaGFyLmlzbnVtZXJpYygpXSwKKyAgICAgICAgICAgICAgICB1IjAxIltjaGFyLmlzc3BhY2UoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbY2hhci5pc3RpdGxlKCldLAorICAgICAgICAgICAgICAgIHUiMDEiW2NoYXIuaXN1cHBlcigpXSwKKworICAgICAgICAgICAgICAgICMgUHJlZGljYXRlcyAobXVsdGlwbGUgY2hhcnMpCisgICAgICAgICAgICAgICAgdSIwMSJbKGNoYXIgKyB1J2FiYycpLmlzYWxudW0oKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbKGNoYXIgKyB1J2FiYycpLmlzYWxwaGEoKV0sCisgICAgICAgICAgICAgICAgdSIwMSJbKGNoYXIgKyB1JzEyMycpLmlzZGVjaW1hbCgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIlsoY2hhciArIHUnMTIzJykuaXNkaWdpdCgpXSwKKyAgICAgICAgICAgICAgICB1IjAxIlsoY2hhciArIHUnYWJjJykuaXNsb3dlcigpXSwKKyAgICAgICAgICAgICAgICB1IjAxIlsoY2hhciArIHUnMTIzJykuaXNudW1lcmljKCldLAorICAgICAgICAgICAgICAgIHUiMDEiWyhjaGFyICsgdScgXHQnKS5pc3NwYWNlKCldLAorICAgICAgICAgICAgICAgIHUiMDEiWyhjaGFyICsgdSdhYmMnKS5pc3RpdGxlKCldLAorICAgICAgICAgICAgICAgIHUiMDEiWyhjaGFyICsgdSdBQkMnKS5pc3VwcGVyKCldLAorCisgICAgICAgICAgICAgICAgIyBNYXBwaW5ncyAoc2luZ2xlIGNoYXIpCisgICAgICAgICAgICAgICAgY2hhci5sb3dlcigpLAorICAgICAgICAgICAgICAgIGNoYXIudXBwZXIoKSwKKyAgICAgICAgICAgICAgICBjaGFyLnRpdGxlKCksCisKKyAgICAgICAgICAgICAgICAjIE1hcHBpbmdzIChtdWx0aXBsZSBjaGFycykKKyAgICAgICAgICAgICAgICAoY2hhciArIHUnYWJjJykubG93ZXIoKSwKKyAgICAgICAgICAgICAgICAoY2hhciArIHUnQUJDJykudXBwZXIoKSwKKyAgICAgICAgICAgICAgICAoY2hhciArIHUnYWJjJykudGl0bGUoKSwKKyAgICAgICAgICAgICAgICAoY2hhciArIHUnQUJDJykudGl0bGUoKSwKKworICAgICAgICAgICAgICAgIF0KKyAgICAgICAgICAgIGgudXBkYXRlKHUnJy5qb2luKGRhdGEpLmVuY29kZShlbmNvZGluZykpCisgICAgICAgIHJlc3VsdCA9IGguaGV4ZGlnZXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNlbGYuZXhwZWN0ZWRjaGVja3N1bSkKKworY2xhc3MgVW5pY29kZURhdGFiYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgSW4gY2FzZSB1bmljb2RlZGF0YSBpcyBub3QgYXZhaWxhYmxlLCB0aGlzIHdpbGwgcmFpc2UgYW4gSW1wb3J0RXJyb3IsCisgICAgICAgICMgYnV0IHRoZSBvdGhlciB0ZXN0IGNhc2VzIHdpbGwgc3RpbGwgYmUgcnVuCisgICAgICAgIGltcG9ydCB1bmljb2RlZGF0YQorICAgICAgICBzZWxmLmRiID0gdW5pY29kZWRhdGEKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNlbGYuZGIKKworY2xhc3MgVW5pY29kZUZ1bmN0aW9uc1Rlc3QoVW5pY29kZURhdGFiYXNlVGVzdCk6CisKKyAgICAjIHVwZGF0ZSB0aGlzLCBpZiB0aGUgZGF0YWJhc2UgY2hhbmdlcworICAgIGV4cGVjdGVkY2hlY2tzdW0gPSAnNmNjZjFiMWEzNjQ2MGQyNjk0ZjliMGIwZjAzMjQ5NDJmZTcwZWRlNicKKworICAgIGRlZiB0ZXN0X2Z1bmN0aW9uX2NoZWNrc3VtKHNlbGYpOgorICAgICAgICBkYXRhID0gW10KKyAgICAgICAgaCA9IGhhc2hsaWIuc2hhMSgpCisKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMHgxMDAwMCk6CisgICAgICAgICAgICBjaGFyID0gdW5pY2hyKGkpCisgICAgICAgICAgICBkYXRhID0gWworICAgICAgICAgICAgICAgICMgUHJvcGVydGllcworICAgICAgICAgICAgICAgIHN0cihzZWxmLmRiLmRpZ2l0KGNoYXIsIC0xKSksCisgICAgICAgICAgICAgICAgc3RyKHNlbGYuZGIubnVtZXJpYyhjaGFyLCAtMSkpLAorICAgICAgICAgICAgICAgIHN0cihzZWxmLmRiLmRlY2ltYWwoY2hhciwgLTEpKSwKKyAgICAgICAgICAgICAgICBzZWxmLmRiLmNhdGVnb3J5KGNoYXIpLAorICAgICAgICAgICAgICAgIHNlbGYuZGIuYmlkaXJlY3Rpb25hbChjaGFyKSwKKyAgICAgICAgICAgICAgICBzZWxmLmRiLmRlY29tcG9zaXRpb24oY2hhciksCisgICAgICAgICAgICAgICAgc3RyKHNlbGYuZGIubWlycm9yZWQoY2hhcikpLAorICAgICAgICAgICAgICAgIHN0cihzZWxmLmRiLmNvbWJpbmluZyhjaGFyKSksCisgICAgICAgICAgICBdCisgICAgICAgICAgICBoLnVwZGF0ZSgnJy5qb2luKGRhdGEpKQorICAgICAgICByZXN1bHQgPSBoLmhleGRpZ2VzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzZWxmLmV4cGVjdGVkY2hlY2tzdW0pCisKKyAgICBkZWYgdGVzdF9kaWdpdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmRpZ2l0KHUnQScsIE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGlnaXQodSc5JyksIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kaWdpdCh1J1x1MjE1YicsIE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGlnaXQodSdcdTI0NjgnKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmRpZ2l0KHUnXFUwMDAyMDAwMCcsIE5vbmUpLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5kaWdpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLmRpZ2l0LCB1J3h4JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kYi5kaWdpdCwgdSd4JykKKworICAgIGRlZiB0ZXN0X251bWVyaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5udW1lcmljKHUnQScsTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5udW1lcmljKHUnOScpLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubnVtZXJpYyh1J1x1MjE1YicpLCAwLjEyNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm51bWVyaWModSdcdTI0NjgnKSwgOS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubnVtZXJpYyh1J1x1YTYyNycpLCA3LjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5udW1lcmljKHUnXFUwMDAyMDAwMCcsIE5vbmUpLCBOb25lKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5udW1lcmljKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIubnVtZXJpYywgdSd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZGIubnVtZXJpYywgdSd4JykKKworICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kZWNpbWFsKHUnQScsTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5kZWNpbWFsKHUnOScpLCA5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGVjaW1hbCh1J1x1MjE1YicsIE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGVjaW1hbCh1J1x1MjQ2OCcsIE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGVjaW1hbCh1J1xVMDAwMjAwMDAnLCBOb25lKSwgTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuZGVjaW1hbCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLmRlY2ltYWwsIHUneHgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZWxmLmRiLmRlY2ltYWwsIHUneCcpCisKKyAgICBkZWYgdGVzdF9jYXRlZ29yeShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmNhdGVnb3J5KHUnXHVGRkZFJyksICdDbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5jYXRlZ29yeSh1J2EnKSwgJ0xsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmNhdGVnb3J5KHUnQScpLCAnTHUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuY2F0ZWdvcnkodSdcVTAwMDIwMDAwJyksICdMbycpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLmNhdGVnb3J5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuY2F0ZWdvcnksIHUneHgnKQorCisgICAgZGVmIHRlc3RfYmlkaXJlY3Rpb25hbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmJpZGlyZWN0aW9uYWwodSdcdUZGRkUnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5iaWRpcmVjdGlvbmFsKHUnICcpLCAnV1MnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuYmlkaXJlY3Rpb25hbCh1J0EnKSwgJ0wnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuYmlkaXJlY3Rpb25hbCh1J1xVMDAwMjAwMDAnKSwgJ0wnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5iaWRpcmVjdGlvbmFsKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuYmlkaXJlY3Rpb25hbCwgdSd4eCcpCisKKyAgICBkZWYgdGVzdF9kZWNvbXBvc2l0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGVjb21wb3NpdGlvbih1J1x1RkZGRScpLCcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuZGVjb21wb3NpdGlvbih1J1x1MDBiYycpLCAnPGZyYWN0aW9uPiAwMDMxIDIwNDQgMDAzNCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLmRlY29tcG9zaXRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5kZWNvbXBvc2l0aW9uLCB1J3h4JykKKworICAgIGRlZiB0ZXN0X21pcnJvcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubWlycm9yZWQodSdcdUZGRkUnKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm1pcnJvcmVkKHUnYScpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubWlycm9yZWQodSdcdTIyMDEnKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLm1pcnJvcmVkKHUnXFUwMDAyMDAwMCcpLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5kYi5taXJyb3JlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLm1pcnJvcmVkLCB1J3h4JykKKworICAgIGRlZiB0ZXN0X2NvbWJpbmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmNvbWJpbmluZyh1J1x1RkZGRScpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuY29tYmluaW5nKHUnYScpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIuY29tYmluaW5nKHUnXHUyMGUxJyksIDIzMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmNvbWJpbmluZyh1J1xVMDAwMjAwMDAnKSwgMCkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuY29tYmluaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZGIuY29tYmluaW5nLCB1J3h4JykKKworICAgIGRlZiB0ZXN0X25vcm1hbGl6ZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmRiLm5vcm1hbGl6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2VsZi5kYi5ub3JtYWxpemUsICd1bmtub3duJywgdSd4eCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5ub3JtYWxpemUoJ05GS0MnLCB1JycpLCB1JycpCisgICAgICAgICMgVGhlIHJlc3QgY2FuIGJlIGZvdW5kIGluIHRlc3Rfbm9ybWFsaXphdGlvbi5weQorICAgICAgICAjIHdoaWNoIHJlcXVpcmVzIGFuIGV4dGVybmFsIGZpbGUuCisKKyAgICBkZWYgdGVzdF9wcjI5KHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmV2aWV3L3ByLTI5Lmh0bWwKKyAgICAgICAgIyBTZWUgaXNzdWVzICMxMDU0OTQzIGFuZCAjMTAyNTQuCisgICAgICAgIGNvbXBvc2VkID0gKHUiXHUwYjQ3XHUwMzAwXHUwYjNlIiwgdSJcdTExMDBcdTAzMDBcdTExNjEiLAorICAgICAgICAgICAgICAgICAgICB1J0xpXHUwMzBkdC1zXHUxZTczXHUwMzAxJywKKyAgICAgICAgICAgICAgICAgICAgdSdcdTA5MmVcdTA5M2VcdTA5MzBcdTA5NGRcdTA5MTUgXHUwOTFjXHUwOTNjJworICAgICAgICAgICAgICAgICAgICArIHUnXHUwOTQxXHUwOTE1XHUwOTQ3XHUwOTMwXHUwOTJjXHUwOTMwXHUwOTRkXHUwOTE3JywKKyAgICAgICAgICAgICAgICAgICAgdSdcdTA5MTVcdTA5M2ZcdTA5MzBcdTA5NGRcdTA5MTdcdTA5M2ZcdTA5MWNcdTA5M2MnCisgICAgICAgICAgICAgICAgICAgICsgJ3VcdTA5MzhcdTA5NGRcdTA5MjRcdTA5M2VcdTA5MjgnKQorICAgICAgICBmb3IgdGV4dCBpbiBjb21wb3NlZDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kYi5ub3JtYWxpemUoJ05GQycsIHRleHQpLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfaXNzdWUxMDI1NChzZWxmKToKKyAgICAgICAgIyBDcmFzaCByZXBvcnRlZCBpbiAjMTAyNTQKKyAgICAgICAgYSA9IHUnQ1x1MDMzOCcgKiAyMCAgKyB1J0NcdTAzMjcnCisgICAgICAgIGIgPSB1J0NcdTAzMzgnICogMjAgICsgdSdceEM3JworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGIubm9ybWFsaXplKCdORkMnLCBhKSwgYikKKworICAgIGRlZiB0ZXN0X2Vhc3RfYXNpYW5fd2lkdGgoc2VsZik6CisgICAgICAgIGVhdyA9IHNlbGYuZGIuZWFzdF9hc2lhbl93aWR0aAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGVhdywgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGVhdywgdScnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGVhdywgdSdyYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWF3KHUnXHgxZScpLCAnTicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWF3KHUnXHgyMCcpLCAnTmEnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVhdyh1J1x1Qzg5NCcpLCAnVycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWF3KHUnXHVGRjY2JyksICdIJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlYXcodSdcdUZGMUYnKSwgJ0YnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVhdyh1J1x1MjAxMCcpLCAnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZWF3KHUnXFUwMDAyMDAwMCcpLCAnVycpCisKK2NsYXNzIFVuaWNvZGVNaXNjVGVzdChVbmljb2RlRGF0YWJhc2VUZXN0KToKKworICAgIGRlZiB0ZXN0X2ZhaWxlZF9pbXBvcnRfZHVyaW5nX2NvbXBpbGluZyhzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA0MzY3CisgICAgICAgICMgRGVjb2RpbmcgXE4gZXNjYXBlcyByZXF1aXJlcyB0aGUgdW5pY29kZWRhdGEgbW9kdWxlLiBJZiBpdCBjYW4ndCBiZQorICAgICAgICAjIGltcG9ydGVkLCB3ZSBzaG91bGRuJ3Qgc2VnZmF1bHQuCisKKyAgICAgICAgIyBUaGlzIHByb2dyYW0gc2hvdWxkIHJhaXNlIGEgU3ludGF4RXJyb3IgaW4gdGhlIGV2YWwuCisgICAgICAgIGNvZGUgPSAiaW1wb3J0IHN5czsiIFwKKyAgICAgICAgICAgICJzeXMubW9kdWxlc1sndW5pY29kZWRhdGEnXSA9IE5vbmU7IiBcCisgICAgICAgICAgICAiIiJldmFsKCJ1J1xOe1NPRlQgSFlQSEVOfSciKSIiIgorICAgICAgICBhcmdzID0gW3N5cy5leGVjdXRhYmxlLCAiLWMiLCBjb2RlXQorICAgICAgICAjIFdlIHVzZSBhIHN1YnByb2Nlc3MgYmVjYXVzZSB0aGUgdW5pY29kZWRhdGEgbW9kdWxlIG1heSBhbHJlYWR5IGhhdmUKKyAgICAgICAgIyBiZWVuIGxvYWRlZCBpbiB0aGlzIHByb2Nlc3MuCisgICAgICAgIHBvcGVuID0gc3VicHJvY2Vzcy5Qb3BlbihhcmdzLCBzdGRlcnI9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBwb3Blbi53YWl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3Blbi5yZXR1cm5jb2RlLCAxKQorICAgICAgICBlcnJvciA9ICJTeW50YXhFcnJvcjogKHVuaWNvZGUgZXJyb3IpIFxOIGVzY2FwZXMgbm90IHN1cHBvcnRlZCAiIFwKKyAgICAgICAgICAgICIoY2FuJ3QgbG9hZCB1bmljb2RlZGF0YSBtb2R1bGUpIgorICAgICAgICBzZWxmLmFzc2VydEluKGVycm9yLCBwb3Blbi5zdGRlcnIucmVhZCgpKQorCisgICAgZGVmIHRlc3RfZGVjaW1hbF9udW1lcmljX2NvbnNpc3RlbnQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGRlY2ltYWwgYW5kIG51bWVyaWMgYXJlIGNvbnNpc3RlbnQsCisgICAgICAgICMgaS5lLiBpZiBhIGNoYXJhY3RlciBoYXMgYSBkZWNpbWFsIHZhbHVlLAorICAgICAgICAjIGl0cyBudW1lcmljIHZhbHVlIHNob3VsZCBiZSB0aGUgc2FtZS4KKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgweDEwMDAwKToKKyAgICAgICAgICAgIGMgPSB1bmljaHIoaSkKKyAgICAgICAgICAgIGRlYyA9IHNlbGYuZGIuZGVjaW1hbChjLCAtMSkKKyAgICAgICAgICAgIGlmIGRlYyAhPSAtMToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlYywgc2VsZi5kYi5udW1lcmljKGMpKQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvdW50ID49IDEwKSAjIHNob3VsZCBoYXZlIHRlc3RlZCBhdCBsZWFzdCB0aGUgQVNDSUkgZGlnaXRzCisKKyAgICBkZWYgdGVzdF9kaWdpdF9udW1lcmljX2NvbnNpc3RlbnQoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IGRpZ2l0IGFuZCBudW1lcmljIGFyZSBjb25zaXN0ZW50LAorICAgICAgICAjIGkuZS4gaWYgYSBjaGFyYWN0ZXIgaGFzIGEgZGlnaXQgdmFsdWUsCisgICAgICAgICMgaXRzIG51bWVyaWMgdmFsdWUgc2hvdWxkIGJlIHRoZSBzYW1lLgorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDB4MTAwMDApOgorICAgICAgICAgICAgYyA9IHVuaWNocihpKQorICAgICAgICAgICAgZGVjID0gc2VsZi5kYi5kaWdpdChjLCAtMSkKKyAgICAgICAgICAgIGlmIGRlYyAhPSAtMToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlYywgc2VsZi5kYi5udW1lcmljKGMpKQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvdW50ID49IDEwKSAjIHNob3VsZCBoYXZlIHRlc3RlZCBhdCBsZWFzdCB0aGUgQVNDSUkgZGlnaXRzCisKKyAgICBkZWYgdGVzdF9idWdfMTcwNDc5MyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRiLmxvb2t1cCgiR09USElDIExFVFRFUiBGQUlIVSIpLCB1J1xVMDAwMTAzNDYnKQorCisgICAgZGVmIHRlc3RfdWNkXzUxMChzZWxmKToKKyAgICAgICAgaW1wb3J0IHVuaWNvZGVkYXRhCisgICAgICAgICMgSW4gVUNEIDUuMS4wLCBhIG1pcnJvcmVkIHByb3BlcnR5IGNoYW5nZWQgd3J0LiBVQ0QgMy4yLjAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaWNvZGVkYXRhLm1pcnJvcmVkKHUiXHUwZjNhIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdW5pY29kZWRhdGEudWNkXzNfMl8wLm1pcnJvcmVkKHUiXHUwZjNhIikpCisgICAgICAgICMgQWxzbywgd2Ugbm93IGhhdmUgdHdvIHdheXMgb2YgcmVwcmVzZW50aW5nCisgICAgICAgICMgdGhlIHVwcGVyLWNhc2UgbWFwcGluZzogYXMgZGVsdGEsIG9yIGFzIGFic29sdXRlIHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1ImEiLnVwcGVyKCk9PXUnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1Ilx1MWQ3OSIudXBwZXIoKT09dSdcdWE3N2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSIuIi51cHBlcigpPT11Ii4iKQorCisgICAgZGVmIHRlc3RfYnVnXzU4Mjgoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJcdTFkNzkiLmxvd2VyKCksIHUiXHUxZDc5IikKKyAgICAgICAgIyBPbmx5IFUrMDAwMCBzaG91bGQgaGF2ZSBVKzAwMDAgYXMgaXRzIHVwcGVyL2xvd2VyL3RpdGxlY2FzZSB2YXJpYW50CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBbCisgICAgICAgICAgICAgICAgYyBmb3IgYyBpbiByYW5nZShzeXMubWF4dW5pY29kZSsxKQorICAgICAgICAgICAgICAgIGlmIHUiXHgwMCIgaW4gdW5pY2hyKGMpLmxvd2VyKCkrdW5pY2hyKGMpLnVwcGVyKCkrdW5pY2hyKGMpLnRpdGxlKCkKKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBbMF0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYnVnXzQ5NzEoc2VsZik6CisgICAgICAgICMgTEVUVEVSIERaIFdJVEggQ0FST046IERaLCBEeiwgZHoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Ilx1MDFjNCIudGl0bGUoKSwgdSJcdTAxYzUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiXHUwMWM1Ii50aXRsZSgpLCB1Ilx1MDFjNSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJcdTAxYzYiLnRpdGxlKCksIHUiXHUwMWM1IikKKworICAgIGRlZiB0ZXN0X2xpbmVicmVha183NjQzKHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZSgweDEwMDAwKToKKyAgICAgICAgICAgIGxpbmVzID0gKHVuaWNocihpKSArIHUnQScpLnNwbGl0bGluZXMoKQorICAgICAgICAgICAgaWYgaSBpbiAoMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHg4NSwKKyAgICAgICAgICAgICAgICAgICAgIDB4MWMsIDB4MWQsIDB4MWUsIDB4MjAyOCwgMHgyMDI5KToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaW5lcyksIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIlx1JS40eCBzaG91bGQgYmUgYSBsaW5lYnJlYWsiICUgaSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGluZXMpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJcdSUuNHggc2hvdWxkIG5vdCBiZSBhIGxpbmVicmVhayIgJSBpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBVbmljb2RlTWlzY1Rlc3QsCisgICAgICAgIFVuaWNvZGVNZXRob2RzVGVzdCwKKyAgICAgICAgVW5pY29kZUZ1bmN0aW9uc1Rlc3QKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjliYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjliYjk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdHRlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhOTk4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTIgQEAKK2ltcG9ydCB1bml0dGVzdC50ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QodW5pdHRlc3QudGVzdC5zdWl0ZSgpKQorICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml0dGVzdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml0dGVzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkNDUzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml0dGVzdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml0dGVzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVkNDUzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXR0ZXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhOTA5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lcy5weQpAQCAtMCwwICsxLDEzNSBAQAorIyBUZXN0cyB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0IGZvciBib3RoIHJlYWRpbmcgYW5kIHBhcnNpbmcgZmlsZXMuCisKKyMgTk9URTogdGhpcyBmaWxlIHRlc3RzIHRoZSBuZXcgYGlvYCBsaWJyYXJ5IGJhY2twb3J0ZWQgZnJvbSBQeXRob24gMy54LgorIyBTaW1pbGFyIHRlc3RzIGZvciB0aGUgYnVpbHRpbiBmaWxlIG9iamVjdCBjYW4gYmUgZm91bmQgaW4gdGVzdF91bml2bmV3bGluZXMyay5weS4KKworZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCB1bmljb2RlX2xpdGVyYWxzCisKK2ltcG9ydCBpbworaW1wb3J0IF9weWlvIGFzIHB5aW8KK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IG9zCitpbXBvcnQgc3lzCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCBhcyBzdXBwb3J0CisKK2lmIG5vdCBoYXNhdHRyKHN5cy5zdGRpbiwgJ25ld2xpbmVzJyk6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QoCisgICAgICAgICJUaGlzIFB5dGhvbiBkb2VzIG5vdCBoYXZlIHVuaXZlcnNhbCBuZXdsaW5lIHN1cHBvcnQiKQorCitGQVRYID0gJ3gnICogKDIqKjE0KQorCitEQVRBX1RFTVBMQVRFID0gWworICAgICJsaW5lMT0xIiwKKyAgICAibGluZTI9J3RoaXMgaXMgYSB2ZXJ5IGxvbmcgbGluZSBkZXNpZ25lZCB0byBnbyBwYXN0IGFueSBkZWZhdWx0ICIgKworICAgICAgICAiYnVmZmVyIGxpbWl0cyB0aGF0IGV4aXN0IGluIGlvLnB5IGJ1dCB3ZSBhbHNvIHdhbnQgdG8gdGVzdCAiICsKKyAgICAgICAgInRoZSB1bmNvbW1vbiBjYXNlLCBuYXR1cmFsbHkuJyIsCisgICAgImRlZiBsaW5lMygpOnBhc3MiLAorICAgICJsaW5lNCA9ICclcyciICUgRkFUWCwKKyAgICBdCisKK0RBVEFfTEYgPSAiXG4iLmpvaW4oREFUQV9URU1QTEFURSkgKyAiXG4iCitEQVRBX0NSID0gIlxyIi5qb2luKERBVEFfVEVNUExBVEUpICsgIlxyIgorREFUQV9DUkxGID0gIlxyXG4iLmpvaW4oREFUQV9URU1QTEFURSkgKyAiXHJcbiIKKworIyBOb3RlIHRoYXQgREFUQV9NSVhFRCBhbHNvIHRlc3RzIHRoZSBhYmlsaXR5IHRvIHJlY29nbml6ZSBhIGxvbmUgXHIKKyMgYmVmb3JlIGVuZC1vZi1maWxlLgorREFUQV9NSVhFRCA9ICJcbiIuam9pbihEQVRBX1RFTVBMQVRFKSArICJcciIKK0RBVEFfU1BMSVQgPSBbeCArICJcbiIgZm9yIHggaW4gREFUQV9URU1QTEFURV0KKworY2xhc3MgVGVzdEdlbmVyaWNVbml2TmV3bGluZXModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgdXNlIGEgY2xhc3MgdmFyaWFibGUgREFUQSB0byBkZWZpbmUgdGhlIGRhdGEgdG8gd3JpdGUgdG8gdGhlIGZpbGUKKyAgICAjIGFuZCBhIGNsYXNzIHZhcmlhYmxlIE5FV0xJTkUgdG8gc2V0IHRoZSBleHBlY3RlZCBuZXdsaW5lcyB2YWx1ZQorICAgIFJFQURNT0RFID0gJ3InCisgICAgV1JJVEVNT0RFID0gJ3diJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5EQVRBCisgICAgICAgIGlmICJiIiBpbiBzZWxmLldSSVRFTU9ERToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLmVuY29kZSgiYXNjaWkiKQorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi5XUklURU1PREUpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoZGF0YSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKHN1cHBvcnQuVEVTVEZOKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9yZWFkKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgREFUQV9MRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoZnAubmV3bGluZXMpLCBzZXQoc2VsZi5ORVdMSU5FKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lcyhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sIHNlbGYuUkVBRE1PREUpIGFzIGZwOgorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgREFUQV9TUExJVCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoZnAubmV3bGluZXMpLCBzZXQoc2VsZi5ORVdMSU5FKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBkYXRhID0gW10KKyAgICAgICAgICAgIGQgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICB3aGlsZSBkOgorICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKGQpCisgICAgICAgICAgICAgICAgZCA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX1NQTElUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChmcC5uZXdsaW5lcyksIHNldChzZWxmLk5FV0xJTkUpKQorCisgICAgZGVmIHRlc3Rfc2VlayhzZWxmKToKKyAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sIHNlbGYuUkVBRE1PREUpIGFzIGZwOgorICAgICAgICAgICAgZnAucmVhZGxpbmUoKQorICAgICAgICAgICAgcG9zID0gZnAudGVsbCgpCisgICAgICAgICAgICBkYXRhID0gZnAucmVhZGxpbmVzKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgREFUQV9TUExJVFsxOl0pCisgICAgICAgICAgICBmcC5zZWVrKHBvcykKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIERBVEFfU1BMSVRbMTpdKQorCisKK2NsYXNzIFRlc3RDUk5ld2xpbmVzKFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKToKKyAgICBORVdMSU5FID0gJ1xyJworICAgIERBVEEgPSBEQVRBX0NSCisKK2NsYXNzIFRlc3RMRk5ld2xpbmVzKFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKToKKyAgICBORVdMSU5FID0gJ1xuJworICAgIERBVEEgPSBEQVRBX0xGCisKK2NsYXNzIFRlc3RDUkxGTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAnXHJcbicKKyAgICBEQVRBID0gREFUQV9DUkxGCisKKyAgICBkZWYgdGVzdF90ZWxsKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZnAubmV3bGluZXMpLCByZXByKE5vbmUpKQorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHBvcyA9IGZwLnRlbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZnAubmV3bGluZXMpLCByZXByKHNlbGYuTkVXTElORSkpCisKK2NsYXNzIFRlc3RNaXhlZE5ld2xpbmVzKFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKToKKyAgICBORVdMSU5FID0gKCdccicsICdcbicpCisgICAgREFUQSA9IERBVEFfTUlYRUQKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgYmFzZV90ZXN0cyA9IChUZXN0Q1JOZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgIFRlc3RMRk5ld2xpbmVzLAorICAgICAgICAgICAgICAgICAgVGVzdENSTEZOZXdsaW5lcywKKyAgICAgICAgICAgICAgICAgIFRlc3RNaXhlZE5ld2xpbmVzKQorICAgIHRlc3RzID0gW10KKyAgICAjIFRlc3QgdGhlIEMgYW5kIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMuCisgICAgZm9yIHRlc3QgaW4gYmFzZV90ZXN0czoKKyAgICAgICAgY2xhc3MgQ1Rlc3QodGVzdCk6CisgICAgICAgICAgICBvcGVuID0gaW8ub3BlbgorICAgICAgICBDVGVzdC5fX25hbWVfXyA9IHN0cigiQyIgKyB0ZXN0Ll9fbmFtZV9fKQorICAgICAgICBjbGFzcyBQeVRlc3QodGVzdCk6CisgICAgICAgICAgICBvcGVuID0gc3RhdGljbWV0aG9kKHB5aW8ub3BlbikKKyAgICAgICAgUHlUZXN0Ll9fbmFtZV9fID0gc3RyKCJQeSIgKyB0ZXN0Ll9fbmFtZV9fKQorICAgICAgICB0ZXN0cy5hcHBlbmQoQ1Rlc3QpCisgICAgICAgIHRlc3RzLmFwcGVuZChQeVRlc3QpCisgICAgc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQyMzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQyMzgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VuaXZuZXdsaW5lczJrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2EzMWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weQpAQCAtMCwwICsxLDEzMCBAQAorIyBUZXN0cyB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0IGZvciBib3RoIHJlYWRpbmcgYW5kIHBhcnNpbmcgZmlsZXMuCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBvcworaW1wb3J0IHN5cworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworaWYgbm90IGhhc2F0dHIoc3lzLnN0ZGluLCAnbmV3bGluZXMnKToKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgXAorICAgICAgICAiVGhpcyBQeXRob24gZG9lcyBub3QgaGF2ZSB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0IgorCitGQVRYID0gJ3gnICogKDIqKjE0KQorCitEQVRBX1RFTVBMQVRFID0gWworICAgICJsaW5lMT0xIiwKKyAgICAibGluZTI9J3RoaXMgaXMgYSB2ZXJ5IGxvbmcgbGluZSBkZXNpZ25lZCB0byBnbyBwYXN0IHRoZSBtYWdpYyAiICsKKyAgICAgICAgImh1bmRyZWQgY2hhcmFjdGVyIGxpbWl0IHRoYXQgaXMgaW5zaWRlIGZpbGVvYmplY3QuYyBhbmQgd2hpY2ggIiArCisgICAgICAgICJpcyBtZWFudCB0byBzcGVlZCB1cCB0aGUgY29tbW9uIGNhc2UsIGJ1dCB3ZSBhbHNvIHdhbnQgdG8gdGVzdCAiICsKKyAgICAgICAgInRoZSB1bmNvbW1vbiBjYXNlLCBuYXR1cmFsbHkuJyIsCisgICAgImRlZiBsaW5lMygpOnBhc3MiLAorICAgICJsaW5lNCA9ICclcyciICUgRkFUWCwKKyAgICBdCisKK0RBVEFfTEYgPSAiXG4iLmpvaW4oREFUQV9URU1QTEFURSkgKyAiXG4iCitEQVRBX0NSID0gIlxyIi5qb2luKERBVEFfVEVNUExBVEUpICsgIlxyIgorREFUQV9DUkxGID0gIlxyXG4iLmpvaW4oREFUQV9URU1QTEFURSkgKyAiXHJcbiIKKworIyBOb3RlIHRoYXQgREFUQV9NSVhFRCBhbHNvIHRlc3RzIHRoZSBhYmlsaXR5IHRvIHJlY29nbml6ZSBhIGxvbmUgXHIKKyMgYmVmb3JlIGVuZC1vZi1maWxlLgorREFUQV9NSVhFRCA9ICJcbiIuam9pbihEQVRBX1RFTVBMQVRFKSArICJcciIKK0RBVEFfU1BMSVQgPSBbeCArICJcbiIgZm9yIHggaW4gREFUQV9URU1QTEFURV0KK2RlbCB4CisKK2NsYXNzIFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIHVzZSBhIGNsYXNzIHZhcmlhYmxlIERBVEEgdG8gZGVmaW5lIHRoZSBkYXRhIHRvIHdyaXRlIHRvIHRoZSBmaWxlCisgICAgIyBhbmQgYSBjbGFzcyB2YXJpYWJsZSBORVdMSU5FIHRvIHNldCB0aGUgZXhwZWN0ZWQgbmV3bGluZXMgdmFsdWUKKyAgICBSRUFETU9ERSA9ICdVJworICAgIFdSSVRFTU9ERSA9ICd3YicKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgd2l0aCBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIHNlbGYuV1JJVEVNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuREFUQSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MudW5saW5rKHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX0xGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZnAubmV3bGluZXMpLCByZXByKHNlbGYuTkVXTElORSkpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXMoc2VsZik6CisgICAgICAgIHdpdGggb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOLCBzZWxmLlJFQURNT0RFKSBhcyBmcDoKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIERBVEFfU1BMSVQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmcC5uZXdsaW5lcyksIHJlcHIoc2VsZi5ORVdMSU5FKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBkYXRhID0gW10KKyAgICAgICAgICAgIGQgPSBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICB3aGlsZSBkOgorICAgICAgICAgICAgICAgIGRhdGEuYXBwZW5kKGQpCisgICAgICAgICAgICAgICAgZCA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX1NQTElUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZnAubmV3bGluZXMpLCByZXByKHNlbGYuTkVXTElORSkpCisKKyAgICBkZWYgdGVzdF9zZWVrKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBmcC5yZWFkbGluZSgpCisgICAgICAgICAgICBwb3MgPSBmcC50ZWxsKCkKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBEQVRBX1NQTElUWzE6XSkKKyAgICAgICAgICAgIGZwLnNlZWsocG9zKQorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgREFUQV9TUExJVFsxOl0pCisKKyAgICBkZWYgdGVzdF9leGVjZmlsZShzZWxmKToKKyAgICAgICAgbmFtZXNwYWNlID0ge30KKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgZXhlY2ZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgbmFtZXNwYWNlKQorICAgICAgICBmdW5jID0gbmFtZXNwYWNlWydsaW5lMyddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYy5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8sIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXNwYWNlWydsaW5lNCddLCBGQVRYKQorCisKK2NsYXNzIFRlc3ROYXRpdmVOZXdsaW5lcyhUZXN0R2VuZXJpY1VuaXZOZXdsaW5lcyk6CisgICAgTkVXTElORSA9IE5vbmUKKyAgICBEQVRBID0gREFUQV9MRgorICAgIFJFQURNT0RFID0gJ3InCisgICAgV1JJVEVNT0RFID0gJ3cnCisKK2NsYXNzIFRlc3RDUk5ld2xpbmVzKFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKToKKyAgICBORVdMSU5FID0gJ1xyJworICAgIERBVEEgPSBEQVRBX0NSCisKK2NsYXNzIFRlc3RMRk5ld2xpbmVzKFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKToKKyAgICBORVdMSU5FID0gJ1xuJworICAgIERBVEEgPSBEQVRBX0xGCisKK2NsYXNzIFRlc3RDUkxGTmV3bGluZXMoVGVzdEdlbmVyaWNVbml2TmV3bGluZXMpOgorICAgIE5FV0xJTkUgPSAnXHJcbicKKyAgICBEQVRBID0gREFUQV9DUkxGCisKKyAgICBkZWYgdGVzdF90ZWxsKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgc2VsZi5SRUFETU9ERSkgYXMgZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZnAubmV3bGluZXMpLCByZXByKE5vbmUpKQorICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHBvcyA9IGZwLnRlbGwoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZnAubmV3bGluZXMpLCByZXByKHNlbGYuTkVXTElORSkpCisKK2NsYXNzIFRlc3RNaXhlZE5ld2xpbmVzKFRlc3RHZW5lcmljVW5pdk5ld2xpbmVzKToKKyAgICBORVdMSU5FID0gKCdccicsICdcbicpCisgICAgREFUQSA9IERBVEFfTUlYRUQKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgVGVzdE5hdGl2ZU5ld2xpbmVzLAorICAgICAgICBUZXN0Q1JOZXdsaW5lcywKKyAgICAgICAgVGVzdExGTmV3bGluZXMsCisgICAgICAgIFRlc3RDUkxGTmV3bGluZXMsCisgICAgICAgIFRlc3RNaXhlZE5ld2xpbmVzCisgICAgICkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTRkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5pdm5ld2xpbmVzMmsucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYTRkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bml2bmV3bGluZXMyay5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5wYWNrLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5wYWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZGJjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHkKQEAgLTAsMCArMSwxMzAgQEAKK2RvY3Rlc3RzID0gIiIiCisKK1VucGFjayB0dXBsZQorCisgICAgPj4+IHQgPSAoMSwgMiwgMykKKyAgICA+Pj4gYSwgYiwgYyA9IHQKKyAgICA+Pj4gYSA9PSAxIGFuZCBiID09IDIgYW5kIGMgPT0gMworICAgIFRydWUKKworVW5wYWNrIGxpc3QKKworICAgID4+PiBsID0gWzQsIDUsIDZdCisgICAgPj4+IGEsIGIsIGMgPSBsCisgICAgPj4+IGEgPT0gNCBhbmQgYiA9PSA1IGFuZCBjID09IDYKKyAgICBUcnVlCisKK1VucGFjayBpbXBsaWVkIHR1cGxlCisKKyAgICA+Pj4gYSwgYiwgYyA9IDcsIDgsIDkKKyAgICA+Pj4gYSA9PSA3IGFuZCBiID09IDggYW5kIGMgPT0gOQorICAgIFRydWUKKworVW5wYWNrIHN0cmluZy4uLiBmdW4hCisKKyAgICA+Pj4gYSwgYiwgYyA9ICdvbmUnCisgICAgPj4+IGEgPT0gJ28nIGFuZCBiID09ICduJyBhbmQgYyA9PSAnZScKKyAgICBUcnVlCisKK1VucGFjayBnZW5lcmljIHNlcXVlbmNlCisKKyAgICA+Pj4gY2xhc3MgU2VxOgorICAgIC4uLiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGkpOgorICAgIC4uLiAgICAgICAgIGlmIGkgPj0gMCBhbmQgaSA8IDM6IHJldHVybiBpCisgICAgLi4uICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgIC4uLgorICAgID4+PiBhLCBiLCBjID0gU2VxKCkKKyAgICA+Pj4gYSA9PSAwIGFuZCBiID09IDEgYW5kIGMgPT0gMgorICAgIFRydWUKKworU2luZ2xlIGVsZW1lbnQgdW5wYWNraW5nLCB3aXRoIGV4dHJhIHN5bnRheAorCisgICAgPj4+IHN0ID0gKDk5LCkKKyAgICA+Pj4gc2wgPSBbMTAwXQorICAgID4+PiBhLCA9IHN0CisgICAgPj4+IGEKKyAgICA5OQorICAgID4+PiBiLCA9IHNsCisgICAgPj4+IGIKKyAgICAxMDAKKworTm93IGZvciBzb21lIGZhaWx1cmVzCisKK1VucGFja2luZyBub24tc2VxdWVuY2UKKworICAgID4+PiBhLCBiLCBjID0gNworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFR5cGVFcnJvcjogJ2ludCcgb2JqZWN0IGlzIG5vdCBpdGVyYWJsZQorCitVbnBhY2tpbmcgdHVwbGUgb2Ygd3Jvbmcgc2l6ZQorCisgICAgPj4+IGEsIGIgPSB0CisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogdG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjaworCitVbnBhY2tpbmcgdHVwbGUgb2Ygd3Jvbmcgc2l6ZQorCisgICAgPj4+IGEsIGIgPSBsCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogdG9vIG1hbnkgdmFsdWVzIHRvIHVucGFjaworCitVbnBhY2tpbmcgc2VxdWVuY2UgdG9vIHNob3J0CisKKyAgICA+Pj4gYSwgYiwgYywgZCA9IFNlcSgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmFsdWVFcnJvcjogbmVlZCBtb3JlIHRoYW4gMyB2YWx1ZXMgdG8gdW5wYWNrCisKK1VucGFja2luZyBzZXF1ZW5jZSB0b28gbG9uZworCisgICAgPj4+IGEsIGIgPSBTZXEoKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAgIC4uLgorICAgIFZhbHVlRXJyb3I6IHRvbyBtYW55IHZhbHVlcyB0byB1bnBhY2sKKworVW5wYWNraW5nIGEgc2VxdWVuY2Ugd2hlcmUgdGhlIHRlc3QgZm9yIHRvbyBsb25nIHJhaXNlcyBhIGRpZmZlcmVudCBraW5kIG9mCitlcnJvcgorCisgICAgPj4+IGNsYXNzIEJvem9FcnJvcihFeGNlcHRpb24pOgorICAgIC4uLiAgICAgcGFzcworICAgIC4uLgorICAgID4+PiBjbGFzcyBCYWRTZXE6CisgICAgLi4uICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgLi4uICAgICAgICAgaWYgaSA+PSAwIGFuZCBpIDwgMzoKKyAgICAuLi4gICAgICAgICAgICAgcmV0dXJuIGkKKyAgICAuLi4gICAgICAgICBlbGlmIGkgPT0gMzoKKyAgICAuLi4gICAgICAgICAgICAgcmFpc2UgQm96b0Vycm9yCisgICAgLi4uICAgICAgICAgZWxzZToKKyAgICAuLi4gICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorICAgIC4uLgorCitUcmlnZ2VyIGNvZGUgd2hpbGUgbm90IGV4cGVjdGluZyBhbiBJbmRleEVycm9yICh1bnBhY2sgc2VxdWVuY2UgdG9vIGxvbmcsIHdyb25nCitlcnJvcikKKworICAgID4+PiBhLCBiLCBjLCBkLCBlID0gQmFkU2VxKCkKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgICAuLi4KKyAgICBCb3pvRXJyb3IKKworVHJpZ2dlciBjb2RlIHdoaWxlIGV4cGVjdGluZyBhbiBJbmRleEVycm9yICh1bnBhY2sgc2VxdWVuY2UgdG9vIHNob3J0LCB3cm9uZworZXJyb3IpCisKKyAgICA+Pj4gYSwgYiwgYyA9IEJhZFNlcSgpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgQm96b0Vycm9yCisKKyIiIgorCitfX3Rlc3RfXyA9IHsnZG9jdGVzdHMnIDogZG9jdGVzdHN9CisKK2RlZiB0ZXN0X21haW4odmVyYm9zZT1GYWxzZSk6CisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyAgICBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfdW5wYWNrCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdW5wYWNrLCB2ZXJib3NlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbih2ZXJib3NlPVRydWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5wYWNrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU3NzYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5wYWNrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91bnBhY2sucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5wYWNrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU3NzYzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdW5wYWNrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyNzNmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weQpAQCAtMCwwICsxLDkxMyBAQAorIiIiUmVncmVzc3Npb24gdGVzdHMgZm9yIHVybGxpYiIiIgorCitpbXBvcnQgdXJsbGliCitpbXBvcnQgaHR0cGxpYgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBtaW1ldG9vbHMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIGJhc2U2NCBpbXBvcnQgYjY0ZW5jb2RlCisKKworZGVmIGhleGVzY2FwZShjaGFyKToKKyAgICAiIiJFc2NhcGUgY2hhciBhcyBSRkMgMjM5NiBzcGVjaWZpZXMiIiIKKyAgICBoZXhfcmVwciA9IGhleChvcmQoY2hhcikpWzI6XS51cHBlcigpCisgICAgaWYgbGVuKGhleF9yZXByKSA9PSAxOgorICAgICAgICBoZXhfcmVwciA9ICIwJXMiICUgaGV4X3JlcHIKKyAgICByZXR1cm4gIiUiICsgaGV4X3JlcHIKKworCitjbGFzcyBGYWtlSFRUUE1peGluKG9iamVjdCk6CisgICAgZGVmIGZha2VodHRwKHNlbGYsIGZha2VkYXRhKToKKyAgICAgICAgY2xhc3MgRmFrZVNvY2tldChTdHJpbmdJTy5TdHJpbmdJTyk6CisKKyAgICAgICAgICAgIGRlZiBzZW5kYWxsKHNlbGYsIGRhdGEpOgorICAgICAgICAgICAgICAgIEZha2VIVFRQQ29ubmVjdGlvbi5idWYgPSBkYXRhCisKKyAgICAgICAgICAgIGRlZiBtYWtlZmlsZShzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgcmVhZChzZWxmLCBhbXQ9Tm9uZSk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTy5yZWFkKHNlbGYsIGFtdCkKKworICAgICAgICAgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxlbmd0aD1Ob25lKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZ0lPLlN0cmluZ0lPLnJlYWRsaW5lKHNlbGYsIGxlbmd0aCkKKworICAgICAgICBjbGFzcyBGYWtlSFRUUENvbm5lY3Rpb24oaHR0cGxpYi5IVFRQQ29ubmVjdGlvbik6CisKKyAgICAgICAgICAgICMgYnVmZmVyIHRvIHN0b3JlIGRhdGEgZm9yIHZlcmlmaWNhdGlvbiBpbiB1cmxvcGVuIHRlc3RzLgorICAgICAgICAgICAgYnVmID0gIiIKKworICAgICAgICAgICAgZGVmIGNvbm5lY3Qoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gRmFrZVNvY2tldChmYWtlZGF0YSkKKworICAgICAgICBhc3NlcnQgaHR0cGxpYi5IVFRQLl9jb25uZWN0aW9uX2NsYXNzID09IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24KKworICAgICAgICBodHRwbGliLkhUVFAuX2Nvbm5lY3Rpb25fY2xhc3MgPSBGYWtlSFRUUENvbm5lY3Rpb24KKworICAgIGRlZiB1bmZha2VodHRwKHNlbGYpOgorICAgICAgICBodHRwbGliLkhUVFAuX2Nvbm5lY3Rpb25fY2xhc3MgPSBodHRwbGliLkhUVFBDb25uZWN0aW9uCisKKworY2xhc3MgdXJsb3Blbl9GaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdXJsb3BlbigpIG9wZW5pbmcgYSB0ZW1wb3JhcnkgZmlsZS4KKworICAgIFRyeSB0byB0ZXN0IGFzIG11Y2ggZnVuY3Rpb25hbGl0eSBhcyBwb3NzaWJsZSBzbyBhcyB0byBjdXQgZG93biBvbiByZWxpYW5jZQorICAgIG9uIGNvbm5lY3RpbmcgdG8gdGhlIE5ldCBmb3IgdGVzdGluZy4KKworICAgICIiIgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAiIiJTZXR1cCBvZiBhIHRlbXAgZmlsZSB0byB1c2UgZm9yIHRlc3RpbmciIiIKKyAgICAgICAgc2VsZi50ZXh0ID0gInRlc3RfdXJsbGliOiAlc1xuIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCisgICAgICAgIEZJTEUgPSBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3YicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEZJTEUud3JpdGUoc2VsZi50ZXh0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRklMRS5jbG9zZSgpCisgICAgICAgIHNlbGYucGF0aG5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCisgICAgICAgIHNlbGYucmV0dXJuZWRfb2JqID0gdXJsbGliLnVybG9wZW4oImZpbGU6JXMiICUgc2VsZi5wYXRobmFtZSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIiIiU2h1dCBkb3duIHRoZSBvcGVuIG9iamVjdCIiIgorICAgICAgICBzZWxmLnJldHVybmVkX29iai5jbG9zZSgpCisgICAgICAgIG9zLnJlbW92ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorCisgICAgZGVmIHRlc3RfaW50ZXJmYWNlKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBvYmplY3QgcmV0dXJuZWQgYnkgdXJsb3BlbigpIGhhcyB0aGUgc3BlY2lmaWVkIG1ldGhvZHMKKyAgICAgICAgZm9yIGF0dHIgaW4gKCJyZWFkIiwgInJlYWRsaW5lIiwgInJlYWRsaW5lcyIsICJmaWxlbm8iLAorICAgICAgICAgICAgICAgICAgICAgImNsb3NlIiwgImluZm8iLCAiZ2V0dXJsIiwgImdldGNvZGUiLCAiX19pdGVyX18iKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNlbGYucmV0dXJuZWRfb2JqLCBhdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmVkIGJ5IHVybG9wZW4oKSBsYWNrcyAlcyBhdHRyaWJ1dGUiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyKQorCisgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRleHQsIHNlbGYucmV0dXJuZWRfb2JqLnJlYWQoKSkKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGV4dCwgc2VsZi5yZXR1cm5lZF9vYmoucmVhZGxpbmUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgc2VsZi5yZXR1cm5lZF9vYmoucmVhZGxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGluZyByZWFkbGluZSgpIGFmdGVyIGV4aGF1c3RpbmcgdGhlIGZpbGUgZGlkIG5vdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIHJldHVybiBhbiBlbXB0eSBzdHJpbmciKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICBsaW5lc19saXN0ID0gc2VsZi5yZXR1cm5lZF9vYmoucmVhZGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obGluZXNfbGlzdCksIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lcygpIHJldHVybmVkIHRoZSB3cm9uZyBudW1iZXIgb2YgbGluZXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzX2xpc3RbMF0sIHNlbGYudGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmVzKCkgcmV0dXJuZWQgaW1wcm9wZXIgdGV4dCIpCisKKyAgICBkZWYgdGVzdF9maWxlbm8oc2VsZik6CisgICAgICAgIGZpbGVfbnVtID0gc2VsZi5yZXR1cm5lZF9vYmouZmlsZW5vKCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbGVfbnVtLCBpbnQsICJmaWxlbm8oKSBkaWQgbm90IHJldHVybiBhbiBpbnQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQoZmlsZV9udW0sIGxlbihzZWxmLnRleHQpKSwgc2VsZi50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkaW5nIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgZmlsZW5vKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IHJldHVybiB0aGUgZXhwZWN0ZWQgdGV4dCIpCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgIyBUZXN0IGNsb3NlKCkgYnkgY2FsbGluZyBpdCBoZWFyIGFuZCB0aGVuIGhhdmluZyBpdCBiZSBjYWxsZWQgYWdhaW4KKyAgICAgICAgIyBieSB0aGUgdGVhckRvd24oKSBtZXRob2QgZm9yIHRoZSB0ZXN0CisgICAgICAgIHNlbGYucmV0dXJuZWRfb2JqLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2luZm8oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLnJldHVybmVkX29iai5pbmZvKCksIG1pbWV0b29scy5NZXNzYWdlKQorCisgICAgZGVmIHRlc3RfZ2V0dXJsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucmV0dXJuZWRfb2JqLmdldHVybCgpLCBzZWxmLnBhdGhuYW1lKQorCisgICAgZGVmIHRlc3RfZ2V0Y29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnJldHVybmVkX29iai5nZXRjb2RlKCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9pdGVyKHNlbGYpOgorICAgICAgICAjIFRlc3QgaXRlcmF0b3IKKyAgICAgICAgIyBEb24ndCBuZWVkIHRvIGNvdW50IG51bWJlciBvZiBpdGVyYXRpb25zIHNpbmNlIHRlc3Qgd291bGQgZmFpbCB0aGUKKyAgICAgICAgIyBpbnN0YW50IGl0IHJldHVybmVkIGFueXRoaW5nIGJleW9uZCB0aGUgZmlyc3QgbGluZSBmcm9tIHRoZQorICAgICAgICAjIGNvbXBhcmlzb24KKyAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5yZXR1cm5lZF9vYmouX19pdGVyX18oKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgc2VsZi50ZXh0KQorCisgICAgZGVmIHRlc3RfcmVsYXRpdmVsb2NhbGZpbGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsdXJsbGliLnVybG9wZW4sJy4vJyArIHNlbGYucGF0aG5hbWUpCisKK2NsYXNzIFByb3h5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIFJlY29yZHMgY2hhbmdlcyB0byBlbnYgdmFycworICAgICAgICBzZWxmLmVudiA9IHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkKKyAgICAgICAgIyBEZWxldGUgYWxsIHByb3h5IHJlbGF0ZWQgZW52IHZhcnMKKyAgICAgICAgZm9yIGsgaW4gb3MuZW52aXJvbi5rZXlzKCk6CisgICAgICAgICAgICBpZiAncHJveHknIGluIGsubG93ZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLmVudi51bnNldChrKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIFJlc3RvcmUgYWxsIHByb3h5IHJlbGF0ZWQgZW52IHZhcnMKKyAgICAgICAgc2VsZi5lbnYuX19leGl0X18oKQorICAgICAgICBkZWwgc2VsZi5lbnYKKworICAgIGRlZiB0ZXN0X2dldHByb3hpZXNfZW52aXJvbm1lbnRfa2VlcF9ub19wcm94aWVzKHNlbGYpOgorICAgICAgICBzZWxmLmVudi5zZXQoJ05PX1BST1hZJywgJ2xvY2FsaG9zdCcpCisgICAgICAgIHByb3hpZXMgPSB1cmxsaWIuZ2V0cHJveGllc19lbnZpcm9ubWVudCgpCisgICAgICAgICMgZ2V0cHJveGllc19lbnZpcm9ubWVudCB1c2UgbG93ZXJlZCBjYXNlIHRydW5jYXRlZCAobm8gJ19wcm94eScpIGtleXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnbG9jYWxob3N0JywgcHJveGllc1snbm8nXSkKKyAgICAgICAgIyBMaXN0IG9mIG5vX3Byb3hpZXMgd2l0aCBzcGFjZS4KKyAgICAgICAgc2VsZi5lbnYuc2V0KCdOT19QUk9YWScsICdsb2NhbGhvc3QsIGFub3RoZXJkb21haW4uY29tLCBuZXdkb21haW4uY29tJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVybGxpYi5wcm94eV9ieXBhc3NfZW52aXJvbm1lbnQoJ2Fub3RoZXJkb21haW4uY29tJykpCisKKworY2xhc3MgdXJsb3Blbl9IdHRwVGVzdHModW5pdHRlc3QuVGVzdENhc2UsIEZha2VIVFRQTWl4aW4pOgorICAgICIiIlRlc3QgdXJsb3BlbigpIG9wZW5pbmcgYSBmYWtlIGh0dHAgY29ubmVjdGlvbi4iIiIKKworICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CisgICAgICAgIHNlbGYuZmFrZWh0dHAoJ0hlbGxvIScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwID0gdXJsbGliLnVybG9wZW4oImh0dHA6Ly9weXRob24ub3JnLyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKCksICdIZWxsbyEnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSgpLCAnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAuZ2V0dXJsKCksICdodHRwOi8vcHl0aG9uLm9yZy8nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5nZXRjb2RlKCksIDIwMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudW5mYWtlaHR0cCgpCisKKyAgICBkZWYgdGVzdF91cmxfZnJhZ21lbnQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzExNzAzOiBnZXR1cmwoKSBvbWl0cyBmcmFnbWVudHMgaW4gdGhlIG9yaWdpbmFsIFVSTC4KKyAgICAgICAgdXJsID0gJ2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91cmxsaWIuaHRtbCNPSycKKyAgICAgICAgc2VsZi5mYWtlaHR0cCgnSGVsbG8hJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnAgPSB1cmxsaWIudXJsb3Blbih1cmwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLmdldHVybCgpLCB1cmwpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnVuZmFrZWh0dHAoKQorCisgICAgZGVmIHRlc3RfcmVhZF9ib2d1cyhzZWxmKToKKyAgICAgICAgIyB1cmxvcGVuKCkgc2hvdWxkIHJhaXNlIElPRXJyb3IgZm9yIG1hbnkgZXJyb3IgY29kZXMuCisgICAgICAgIHNlbGYuZmFrZWh0dHAoJycnSFRUUC8xLjEgNDAxIEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkCitEYXRlOiBXZWQsIDAyIEphbiAyMDA4IDAzOjAzOjU0IEdNVAorU2VydmVyOiBBcGFjaGUvMS4zLjMzIChEZWJpYW4gR05VL0xpbnV4KSBtb2Rfc3NsLzIuOC4yMiBPcGVuU1NMLzAuOS43ZQorQ29ubmVjdGlvbjogY2xvc2UKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEKKycnJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgdXJsbGliLnVybG9wZW4sICJodHRwOi8vcHl0aG9uLm9yZy8iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworICAgIGRlZiB0ZXN0X2ludmFsaWRfcmVkaXJlY3Qoc2VsZik6CisgICAgICAgICMgdXJsb3BlbigpIHNob3VsZCByYWlzZSBJT0Vycm9yIGZvciBtYW55IGVycm9yIGNvZGVzLgorICAgICAgICBzZWxmLmZha2VodHRwKCIiIkhUVFAvMS4xIDMwMiBGb3VuZAorRGF0ZTogV2VkLCAwMiBKYW4gMjAwOCAwMzowMzo1NCBHTVQKK1NlcnZlcjogQXBhY2hlLzEuMy4zMyAoRGViaWFuIEdOVS9MaW51eCkgbW9kX3NzbC8yLjguMjIgT3BlblNTTC8wLjkuN2UKK0xvY2F0aW9uOiBmaWxlOlJFQURNRQorQ29ubmVjdGlvbjogY2xvc2UKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEKKyIiIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgdXJsbGliLnVybG9wZW4sICJodHRwOi8vcHl0aG9uLm9yZy8iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworICAgIGRlZiB0ZXN0X2VtcHR5X3NvY2tldChzZWxmKToKKyAgICAgICAgIyB1cmxvcGVuKCkgcmFpc2VzIElPRXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgc29ja2V0IGRvZXMgbm90IHNlbmQgYW55CisgICAgICAgICMgZGF0YS4gKCMxNjgwMjMwKQorICAgICAgICBzZWxmLmZha2VodHRwKCcnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB1cmxsaWIudXJsb3BlbiwgJ2h0dHA6Ly9zb21ldGhpbmcnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfbG9jYWxmaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB1cmxsaWIudXJsb3BlbiwKKyAgICAgICAgICAgICAgICAnZmlsZTovL2xvY2FsaG9zdC9hL21pc3NpbmcvZmlsZS5weScpCisgICAgICAgIGZkLCB0bXBfZmlsZSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICB0bXBfZmlsZXVybCA9ICdmaWxlOi8vbG9jYWxob3N0LycgKyB0bXBfZmlsZS5yZXBsYWNlKG9zLnBhdGguc2VwLCAnLycpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0bXBfZmlsZSkpCisgICAgICAgICAgICBmcCA9IHVybGxpYi51cmxvcGVuKHRtcF9maWxldXJsKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuY2xvc2UoZmQpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG9zLnVubGluayh0bXBfZmlsZSkKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9zLnBhdGguZXhpc3RzKHRtcF9maWxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgdXJsbGliLnVybG9wZW4sIHRtcF9maWxldXJsKQorCisgICAgZGVmIHRlc3RfZnRwX25vbmV4aXN0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB1cmxsaWIudXJsb3BlbiwKKyAgICAgICAgICAgICAgICAnZnRwOi8vbG9jYWxob3N0L25vdC9leGlzdGluZy9maWxlLnB5JykKKworCisgICAgZGVmIHRlc3RfdXNlcnBhc3NfaW51cmwoc2VsZik6CisgICAgICAgIHNlbGYuZmFrZWh0dHAoJ0hlbGxvIScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZha2VodHRwX3dyYXBwZXIgPSBodHRwbGliLkhUVFAuX2Nvbm5lY3Rpb25fY2xhc3MKKyAgICAgICAgICAgIGZwID0gdXJsbGliLnVybG9wZW4oImh0dHA6Ly91c2VyOnBhc3NAcHl0aG9uLm9yZy8iKQorICAgICAgICAgICAgYXV0aG9yaXphdGlvbiA9ICgiQXV0aG9yaXphdGlvbjogQmFzaWMgJXNcclxuIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYjY0ZW5jb2RlKCd1c2VyOnBhc3MnKSkKKyAgICAgICAgICAgICMgVGhlIGF1dGhvcml6YXRpb24gaGVhZGVyIG11c3QgYmUgaW4gcGxhY2UKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYXV0aG9yaXphdGlvbiwgZmFrZWh0dHBfd3JhcHBlci5idWYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKCksICJIZWxsbyEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5yZWFkbGluZSgpLCAiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAuZ2V0dXJsKCksICdodHRwOi8vdXNlcjpwYXNzQHB5dGhvbi5vcmcvJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAuZ2V0Y29kZSgpLCAyMDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnVuZmFrZWh0dHAoKQorCisgICAgZGVmIHRlc3RfdXNlcnBhc3Nfd2l0aF9zcGFjZXNfaW51cmwoc2VsZik6CisgICAgICAgIHNlbGYuZmFrZWh0dHAoJ0hlbGxvIScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHVybCA9ICJodHRwOi8vYSBiOmMgZEBweXRob24ub3JnLyIKKyAgICAgICAgICAgIGZha2VodHRwX3dyYXBwZXIgPSBodHRwbGliLkhUVFAuX2Nvbm5lY3Rpb25fY2xhc3MKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb24gPSAoIkF1dGhvcml6YXRpb246IEJhc2ljICVzXHJcbiIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiNjRlbmNvZGUoJ2EgYjpjIGQnKSkKKyAgICAgICAgICAgIGZwID0gdXJsbGliLnVybG9wZW4odXJsKQorICAgICAgICAgICAgIyBUaGUgYXV0aG9yaXphdGlvbiBoZWFkZXIgbXVzdCBiZSBpbiBwbGFjZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihhdXRob3JpemF0aW9uLCBmYWtlaHR0cF93cmFwcGVyLmJ1ZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnAucmVhZGxpbmUoKSwgIkhlbGxvISIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLnJlYWRsaW5lKCksICIiKQorICAgICAgICAgICAgIyB0aGUgc3BhY2VzIGFyZSBxdW90ZWQgaW4gVVJMIHNvIG5vIG1hdGNoCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZwLmdldHVybCgpLCB1cmwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZwLmdldGNvZGUoKSwgMjAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi51bmZha2VodHRwKCkKKworCitjbGFzcyB1cmxyZXRyaWV2ZV9GaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgdXJsbGliLnVybHJldHJpZXZlKCkgb24gbG9jYWwgZmlsZXMiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBsaXN0IG9mIHRlbXBvcmFyeSBmaWxlcy4gRWFjaCBpdGVtIGluIHRoZSBsaXN0IGlzIGEgZmlsZQorICAgICAgICAjIG5hbWUgKGFic29sdXRlIHBhdGggb3IgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkpLgorICAgICAgICAjIEFsbCBmaWxlcyBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBkZWxldGVkIGluIHRoZSB0ZWFyRG93biBtZXRob2QuIE5vdGUsCisgICAgICAgICMgdGhpcyBvbmx5IGhlbHBzIHRvIG1ha2VzIHN1cmUgdGVtcG9yYXJ5IGZpbGVzIGdldCBkZWxldGVkLCBidXQgaXQKKyAgICAgICAgIyBkb2VzIG5vdGhpbmcgYWJvdXQgdHJ5aW5nIHRvIGNsb3NlIGZpbGVzIHRoYXQgbWF5IHN0aWxsIGJlIG9wZW4uIEl0CisgICAgICAgICMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBkZXZlbG9wZXIgdG8gcHJvcGVybHkgY2xvc2UgZmlsZXMgZXZlbgorICAgICAgICAjIHdoZW4gZXhjZXB0aW9uYWwgY29uZGl0aW9ucyBvY2N1ci4KKyAgICAgICAgc2VsZi50ZW1wRmlsZXMgPSBbXQorCisgICAgICAgICMgQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgICAgIHNlbGYucmVnaXN0ZXJGaWxlRm9yQ2xlYW5VcCh0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLnRleHQgPSAndGVzdGluZyB1cmxsaWIudXJscmV0cmlldmUnCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEZJTEUgPSBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICd3YicpCisgICAgICAgICAgICBGSUxFLndyaXRlKHNlbGYudGV4dCkKKyAgICAgICAgICAgIEZJTEUuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OiBGSUxFLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIERlbGV0ZSB0aGUgdGVtcG9yYXJ5IGZpbGVzLgorICAgICAgICBmb3IgZWFjaCBpbiBzZWxmLnRlbXBGaWxlczoKKyAgICAgICAgICAgIHRyeTogb3MucmVtb3ZlKGVhY2gpCisgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKworICAgIGRlZiBjb25zdHJ1Y3RMb2NhbEZpbGVVcmwoc2VsZiwgZmlsZVBhdGgpOgorICAgICAgICByZXR1cm4gImZpbGU6Ly8lcyIgJSB1cmxsaWIucGF0aG5hbWUydXJsKG9zLnBhdGguYWJzcGF0aChmaWxlUGF0aCkpCisKKyAgICBkZWYgY3JlYXRlTmV3VGVtcEZpbGUoc2VsZiwgZGF0YT0iIik6CisgICAgICAgICIiIkNyZWF0ZXMgYSBuZXcgdGVtcG9yYXJ5IGZpbGUgY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIGRhdGEsCisgICAgICAgIHJlZ2lzdGVycyB0aGUgZmlsZSBmb3IgZGVsZXRpb24gZHVyaW5nIHRoZSB0ZXN0IGZpeHR1cmUgdGVhciBkb3duLCBhbmQKKyAgICAgICAgcmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4iIiIKKworICAgICAgICBuZXdGZCwgbmV3RmlsZVBhdGggPSB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZWdpc3RlckZpbGVGb3JDbGVhblVwKG5ld0ZpbGVQYXRoKQorICAgICAgICAgICAgbmV3RmlsZSA9IG9zLmZkb3BlbihuZXdGZCwgIndiIikKKyAgICAgICAgICAgIG5ld0ZpbGUud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIG5ld0ZpbGUuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgdHJ5OiBuZXdGaWxlLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdDogcGFzcworICAgICAgICByZXR1cm4gbmV3RmlsZVBhdGgKKworICAgIGRlZiByZWdpc3RlckZpbGVGb3JDbGVhblVwKHNlbGYsIGZpbGVOYW1lKToKKyAgICAgICAgc2VsZi50ZW1wRmlsZXMuYXBwZW5kKGZpbGVOYW1lKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgYSBsb2NhbCBmaWxlIGp1c3QgZ2V0cyBpdHMgb3duIGxvY2F0aW9uIHJldHVybmVkIGFuZAorICAgICAgICAjIGEgaGVhZGVycyB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybHJldHJpZXZlKCJmaWxlOiVzIiAlIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0WzBdLCB0ZXN0X3N1cHBvcnQuVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UocmVzdWx0WzFdLCBtaW1ldG9vbHMuTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IGdldCBhIG1pbWV0b29scy5NZXNzYWdlIGluc3RhbmNlIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWNvbmQgcmV0dXJuZWQgdmFsdWUiKQorCisgICAgZGVmIHRlc3RfY29weShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgc2V0dGluZyB0aGUgZmlsZW5hbWUgYXJndW1lbnQgd29ya3MuCisgICAgICAgIHNlY29uZF90ZW1wID0gIiVzLjIiICUgdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBzZWxmLnJlZ2lzdGVyRmlsZUZvckNsZWFuVXAoc2Vjb25kX3RlbXApCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi51cmxyZXRyaWV2ZShzZWxmLmNvbnN0cnVjdExvY2FsRmlsZVVybCgKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4pLCBzZWNvbmRfdGVtcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfdGVtcCwgcmVzdWx0WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2Vjb25kX3RlbXApLCAiY29weSBvZiB0aGUgZmlsZSB3YXMgbm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hZGUiKQorICAgICAgICBGSUxFID0gZmlsZShzZWNvbmRfdGVtcCwgJ3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGV4dCA9IEZJTEUucmVhZCgpCisgICAgICAgICAgICBGSUxFLmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHRyeTogRklMRS5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQ6IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnRleHQsIHRleHQpCisKKyAgICBkZWYgdGVzdF9yZXBvcnRob29rKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXBvcnRob29rIHdvcmtzLgorICAgICAgICBkZWYgaG9va3Rlc3Rlcihjb3VudCwgYmxvY2tfc2l6ZSwgdG90YWxfc2l6ZSwgY291bnRfaG9sZGVyPVswXSk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoY291bnQsIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShibG9ja19zaXplLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodG90YWxfc2l6ZSwgaW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgY291bnRfaG9sZGVyWzBdKQorICAgICAgICAgICAgY291bnRfaG9sZGVyWzBdID0gY291bnRfaG9sZGVyWzBdICsgMQorICAgICAgICBzZWNvbmRfdGVtcCA9ICIlcy4yIiAlIHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgc2VsZi5yZWdpc3RlckZpbGVGb3JDbGVhblVwKHNlY29uZF90ZW1wKQorICAgICAgICB1cmxsaWIudXJscmV0cmlldmUoc2VsZi5jb25zdHJ1Y3RMb2NhbEZpbGVVcmwodGVzdF9zdXBwb3J0LlRFU1RGTiksCisgICAgICAgICAgICBzZWNvbmRfdGVtcCwgaG9va3Rlc3RlcikKKworICAgIGRlZiB0ZXN0X3JlcG9ydGhvb2tfMF9ieXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG9uIHplcm8gbGVuZ3RoIGZpbGUuIFNob3VsZCBjYWxsIHJlcG9ydGhvb2sgb25seSAxIHRpbWUuCisgICAgICAgIHJlcG9ydCA9IFtdCisgICAgICAgIGRlZiBob29rdGVzdGVyKGNvdW50LCBibG9ja19zaXplLCB0b3RhbF9zaXplLCBfcmVwb3J0PXJlcG9ydCk6CisgICAgICAgICAgICBfcmVwb3J0LmFwcGVuZCgoY291bnQsIGJsb2NrX3NpemUsIHRvdGFsX3NpemUpKQorICAgICAgICBzcmNGaWxlTmFtZSA9IHNlbGYuY3JlYXRlTmV3VGVtcEZpbGUoKQorICAgICAgICB1cmxsaWIudXJscmV0cmlldmUoc2VsZi5jb25zdHJ1Y3RMb2NhbEZpbGVVcmwoc3JjRmlsZU5hbWUpLAorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiwgaG9va3Rlc3RlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVwb3J0KSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXBvcnRbMF1bMl0sIDApCisKKyAgICBkZWYgdGVzdF9yZXBvcnRob29rXzVfYnl0ZXMoc2VsZik6CisgICAgICAgICMgVGVzdCBvbiA1IGJ5dGUgZmlsZS4gU2hvdWxkIGNhbGwgcmVwb3J0aG9vayBvbmx5IDIgdGltZXMgKG9uY2Ugd2hlbgorICAgICAgICAjIHRoZSAibmV0d29yayBjb25uZWN0aW9uIiBpcyBlc3RhYmxpc2hlZCBhbmQgb25jZSB3aGVuIHRoZSBibG9jayBpcworICAgICAgICAjIHJlYWQpLiBTaW5jZSB0aGUgYmxvY2sgc2l6ZSBpcyA4MTkyIGJ5dGVzLCBvbmx5IG9uZSBibG9jayByZWFkIGlzCisgICAgICAgICMgcmVxdWlyZWQgdG8gcmVhZCB0aGUgZW50aXJlIGZpbGUuCisgICAgICAgIHJlcG9ydCA9IFtdCisgICAgICAgIGRlZiBob29rdGVzdGVyKGNvdW50LCBibG9ja19zaXplLCB0b3RhbF9zaXplLCBfcmVwb3J0PXJlcG9ydCk6CisgICAgICAgICAgICBfcmVwb3J0LmFwcGVuZCgoY291bnQsIGJsb2NrX3NpemUsIHRvdGFsX3NpemUpKQorICAgICAgICBzcmNGaWxlTmFtZSA9IHNlbGYuY3JlYXRlTmV3VGVtcEZpbGUoIngiICogNSkKKyAgICAgICAgdXJsbGliLnVybHJldHJpZXZlKHNlbGYuY29uc3RydWN0TG9jYWxGaWxlVXJsKHNyY0ZpbGVOYW1lKSwKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4sIGhvb2t0ZXN0ZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcG9ydCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwb3J0WzBdWzFdLCA4MTkyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcG9ydFswXVsyXSwgNSkKKworICAgIGRlZiB0ZXN0X3JlcG9ydGhvb2tfODE5M19ieXRlcyhzZWxmKToKKyAgICAgICAgIyBUZXN0IG9uIDgxOTMgYnl0ZSBmaWxlLiBTaG91bGQgY2FsbCByZXBvcnRob29rIG9ubHkgMyB0aW1lcyAob25jZQorICAgICAgICAjIHdoZW4gdGhlICJuZXR3b3JrIGNvbm5lY3Rpb24iIGlzIGVzdGFibGlzaGVkLCBvbmNlIGZvciB0aGUgbmV4dCA4MTkyCisgICAgICAgICMgYnl0ZXMsIGFuZCBvbmNlIGZvciB0aGUgbGFzdCBieXRlKS4KKyAgICAgICAgcmVwb3J0ID0gW10KKyAgICAgICAgZGVmIGhvb2t0ZXN0ZXIoY291bnQsIGJsb2NrX3NpemUsIHRvdGFsX3NpemUsIF9yZXBvcnQ9cmVwb3J0KToKKyAgICAgICAgICAgIF9yZXBvcnQuYXBwZW5kKChjb3VudCwgYmxvY2tfc2l6ZSwgdG90YWxfc2l6ZSkpCisgICAgICAgIHNyY0ZpbGVOYW1lID0gc2VsZi5jcmVhdGVOZXdUZW1wRmlsZSgieCIgKiA4MTkzKQorICAgICAgICB1cmxsaWIudXJscmV0cmlldmUoc2VsZi5jb25zdHJ1Y3RMb2NhbEZpbGVVcmwoc3JjRmlsZU5hbWUpLAorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LlRFU1RGTiwgaG9va3Rlc3RlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVwb3J0KSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXBvcnRbMF1bMV0sIDgxOTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwb3J0WzBdWzJdLCA4MTkzKQorCisKK2NsYXNzIHVybHJldHJpZXZlX0h0dHBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSwgRmFrZUhUVFBNaXhpbik6CisgICAgIiIiVGVzdCB1cmxsaWIudXJscmV0cmlldmUoKSB1c2luZyBmYWtlIGh0dHAgY29ubmVjdGlvbnMiIiIKKworICAgIGRlZiB0ZXN0X3Nob3J0X2NvbnRlbnRfcmFpc2VzX0NvbnRlbnRUb29TaG9ydEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZha2VodHRwKCcnJ0hUVFAvMS4xIDIwMCBPSworRGF0ZTogV2VkLCAwMiBKYW4gMjAwOCAwMzowMzo1NCBHTVQKK1NlcnZlcjogQXBhY2hlLzEuMy4zMyAoRGViaWFuIEdOVS9MaW51eCkgbW9kX3NzbC8yLjguMjIgT3BlblNTTC8wLjkuN2UKK0Nvbm5lY3Rpb246IGNsb3NlCitDb250ZW50LUxlbmd0aDogMTAwCitDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xCisKK0ZGCisnJycpCisKKyAgICAgICAgZGVmIF9yZXBvcnRob29rKHBhcjEsIHBhcjIsIHBhcjMpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYi5Db250ZW50VG9vU2hvcnRFcnJvciwgdXJsbGliLnVybHJldHJpZXZlLAorICAgICAgICAgICAgICAgICAgICAnaHR0cDovL2V4YW1wbGUuY29tJywgcmVwb3J0aG9vaz1fcmVwb3J0aG9vaykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudW5mYWtlaHR0cCgpCisKKyAgICBkZWYgdGVzdF9zaG9ydF9jb250ZW50X3JhaXNlc19Db250ZW50VG9vU2hvcnRFcnJvcl93aXRob3V0X3JlcG9ydGhvb2soc2VsZik6CisgICAgICAgIHNlbGYuZmFrZWh0dHAoJycnSFRUUC8xLjEgMjAwIE9LCitEYXRlOiBXZWQsIDAyIEphbiAyMDA4IDAzOjAzOjU0IEdNVAorU2VydmVyOiBBcGFjaGUvMS4zLjMzIChEZWJpYW4gR05VL0xpbnV4KSBtb2Rfc3NsLzIuOC4yMiBPcGVuU1NMLzAuOS43ZQorQ29ubmVjdGlvbjogY2xvc2UKK0NvbnRlbnQtTGVuZ3RoOiAxMDAKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEKKworRkYKKycnJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliLkNvbnRlbnRUb29TaG9ydEVycm9yLCB1cmxsaWIudXJscmV0cmlldmUsICdodHRwOi8vZXhhbXBsZS5jb20vJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYudW5mYWtlaHR0cCgpCisKK2NsYXNzIFF1b3RpbmdUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgZm9yIHVybGxpYi5xdW90ZSgpIGFuZCB1cmxsaWIucXVvdGVfcGx1cygpCisKKyAgICBBY2NvcmRpbmcgdG8gUkZDIDIzOTYgKCJVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzKSwgdG8gZXNjYXBlIGEKKyAgICBjaGFyYWN0ZXIgeW91IHdyaXRlIGl0IGFzICclJyArIDwyIGNoYXJhY3RlciBVUy1BU0NJSSBoZXggdmFsdWU+LiAgVGhlIFB5dGhvbgorICAgIGNvZGUgb2YgYGAnJScgKyBoZXgob3JkKDxjaGFyYWN0ZXI+KSlbMjpdYGAgZXNjYXBlcyBhIGNoYXJhY3RlciBwcm9wZXJseS4KKyAgICBDYXNlIGRvZXMgbm90IG1hdHRlciBvbiB0aGUgaGV4IGxldHRlcnMuCisKKyAgICBUaGUgdmFyaW91cyBjaGFyYWN0ZXIgc2V0cyBzcGVjaWZpZWQgYXJlOgorCisgICAgUmVzZXJ2ZWQgY2hhcmFjdGVycyA6ICI7Lz86QCY9KyQsIgorICAgICAgICBIYXZlIHNwZWNpYWwgbWVhbmluZyBpbiBVUklzIGFuZCBtdXN0IGJlIGVzY2FwZWQgaWYgbm90IGJlaW5nIHVzZWQgZm9yCisgICAgICAgIHRoZWlyIHNwZWNpYWwgbWVhbmluZworICAgIERhdGEgY2hhcmFjdGVycyA6IGxldHRlcnMsIGRpZ2l0cywgYW5kICItXy4hfionKCkiCisgICAgICAgIFVucmVzZXJ2ZWQgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIGVzY2FwZWQ7IGNhbiBiZSwgdGhvdWdoLCBpZiBkZXNpcmVkCisgICAgQ29udHJvbCBjaGFyYWN0ZXJzIDogMHgwMCAtIDB4MUYsIDB4N0YKKyAgICAgICAgSGF2ZSBubyB1c2UgaW4gVVJJcyBzbyBtdXN0IGJlIGVzY2FwZWQKKyAgICBzcGFjZSA6IDB4MjAKKyAgICAgICAgTXVzdCBiZSBlc2NhcGVkCisgICAgRGVsaW1pdGVycyA6ICc8PiMlIicKKyAgICAgICAgTXVzdCBiZSBlc2NhcGVkCisgICAgVW53aXNlIDogInt9fFxeW11gIgorICAgICAgICBNdXN0IGJlIGVzY2FwZWQKKworICAgICIiIgorCisgICAgZGVmIHRlc3RfbmV2ZXJfcXVvdGUoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHF1b3RlKCkgZG9lcyBub3QgcXVvdGUgbGV0dGVycywgZGlnaXRzLCBhbmQgIl8sLi0iCisgICAgICAgIGRvX25vdF9xdW90ZSA9ICcnIC5qb2luKFsiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVoiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIwMTIzNDU2Nzg5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfLi0iXSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlKGRvX25vdF9xdW90ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkb19ub3RfcXVvdGUsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGUoKTogJXMgIT0gJXMiICUgKGRvX25vdF9xdW90ZSwgcmVzdWx0KSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlX3BsdXMoZG9fbm90X3F1b3RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRvX25vdF9xdW90ZSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlX3BsdXMoKTogJXMgIT0gJXMiICUgKGRvX25vdF9xdW90ZSwgcmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfc2FmZShzZWxmKToKKyAgICAgICAgIyBUZXN0ICcvJyBpcyBkZWZhdWx0IHZhbHVlIGZvciAnc2FmZScgcGFyYW1ldGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsbGliLnF1b3RlLmZ1bmNfZGVmYXVsdHNbMF0sICcvJykKKworICAgIGRlZiB0ZXN0X3NhZmUoc2VsZik6CisgICAgICAgICMgVGVzdCBzZXR0aW5nICdzYWZlJyBwYXJhbWV0ZXIgZG9lcyB3aGF0IGl0IHNob3VsZCBkbworICAgICAgICBxdW90ZV9ieV9kZWZhdWx0ID0gIjw+IgorICAgICAgICByZXN1bHQgPSB1cmxsaWIucXVvdGUocXVvdGVfYnlfZGVmYXVsdCwgc2FmZT1xdW90ZV9ieV9kZWZhdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHF1b3RlX2J5X2RlZmF1bHQsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGUoKTogJXMgIT0gJXMiICUgKHF1b3RlX2J5X2RlZmF1bHQsIHJlc3VsdCkpCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZV9wbHVzKHF1b3RlX2J5X2RlZmF1bHQsIHNhZmU9cXVvdGVfYnlfZGVmYXVsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW90ZV9ieV9kZWZhdWx0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlX3BsdXMoKTogJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocXVvdGVfYnlfZGVmYXVsdCwgcmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfcXVvdGluZyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgYWxsIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgYmUgcXVvdGVkIGFyZSBieSBkZWZhdWx0IHNhbnMKKyAgICAgICAgIyBzcGFjZSAoc2VwYXJhdGUgdGVzdCBmb3IgdGhhdCkuCisgICAgICAgIHNob3VsZF9xdW90ZSA9IFtjaHIobnVtKSBmb3IgbnVtIGluIHJhbmdlKDMyKV0gIyBGb3IgMHgwMCAtIDB4MUYKKyAgICAgICAgc2hvdWxkX3F1b3RlLmFwcGVuZCgnPD4jJSJ7fXxcXltdYCcpCisgICAgICAgIHNob3VsZF9xdW90ZS5hcHBlbmQoY2hyKDEyNykpICMgRm9yIDB4N0YKKyAgICAgICAgc2hvdWxkX3F1b3RlID0gJycuam9pbihzaG91bGRfcXVvdGUpCisgICAgICAgIGZvciBjaGFyIGluIHNob3VsZF9xdW90ZToKKyAgICAgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZShjaGFyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZXhlc2NhcGUoY2hhciksIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlKCk6ICVzIHNob3VsZCBiZSBlc2NhcGVkIHRvICVzLCBub3QgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIsIGhleGVzY2FwZShjaGFyKSwgcmVzdWx0KSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZV9wbHVzKGNoYXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleGVzY2FwZShjaGFyKSwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGVfcGx1cygpOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBzaG91bGQgYmUgZXNjYXBlcyB0byAlcywgbm90ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyLCBoZXhlc2NhcGUoY2hhciksIHJlc3VsdCkpCisgICAgICAgIGRlbCBzaG91bGRfcXVvdGUKKyAgICAgICAgcGFydGlhbF9xdW90ZSA9ICJhYltdY2QiCisgICAgICAgIGV4cGVjdGVkID0gImFiJTVCJTVEY2QiCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZShwYXJ0aWFsX3F1b3RlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlKCk6ICVzICE9ICVzIiAlIChleHBlY3RlZCwgcmVzdWx0KSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlX3BsdXMocGFydGlhbF9xdW90ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZV9wbHVzKCk6ICVzICE9ICVzIiAlIChleHBlY3RlZCwgcmVzdWx0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB1cmxsaWIucXVvdGUsIE5vbmUpCisKKyAgICBkZWYgdGVzdF9xdW90aW5nX3NwYWNlKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBxdW90ZSgpIGFuZCBxdW90ZV9wbHVzKCkgaGFuZGxlIHNwYWNlcyBhcyBzcGVjaWZpZWQgaW4KKyAgICAgICAgIyB0aGVpciB1bmlxdWUgd2F5CisgICAgICAgIHJlc3VsdCA9IHVybGxpYi5xdW90ZSgnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBoZXhlc2NhcGUoJyAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGUoKTogJXMgIT0gJXMiICUgKHJlc3VsdCwgaGV4ZXNjYXBlKCcgJykpKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucXVvdGVfcGx1cygnICcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAnKycsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHF1b3RlX3BsdXMoKTogJXMgIT0gKyIgJSByZXN1bHQpCisgICAgICAgIGdpdmVuID0gImEgYiBjZCBlIGYiCisgICAgICAgIGV4cGVjdCA9IGdpdmVuLnJlcGxhY2UoJyAnLCBoZXhlc2NhcGUoJyAnKSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnF1b3RlKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZSgpOiAlcyAhPSAlcyIgJSAoZXhwZWN0LCByZXN1bHQpKQorICAgICAgICBleHBlY3QgPSBnaXZlbi5yZXBsYWNlKCcgJywgJysnKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucXVvdGVfcGx1cyhnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGVfcGx1cygpOiAlcyAhPSAlcyIgJSAoZXhwZWN0LCByZXN1bHQpKQorCisgICAgZGVmIHRlc3RfcXVvdGluZ19wbHVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybGxpYi5xdW90ZV9wbHVzKCdhbHBoYStiZXRhIGdhbW1hJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2FscGhhJTJCYmV0YStnYW1tYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsbGliLnF1b3RlX3BsdXMoJ2FscGhhK2JldGEgZ2FtbWEnLCAnKycpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdhbHBoYStiZXRhK2dhbW1hJykKKworY2xhc3MgVW5xdW90aW5nVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciB1bnF1b3RlKCkgYW5kIHVucXVvdGVfcGx1cygpCisKKyAgICBTZWUgdGhlIGRvYyBzdHJpbmcgZm9yIHF1b3RpbmdfVGVzdHMgZm9yIGRldGFpbHMgb24gcXVvdGluZyBhbmQgc3VjaC4KKworICAgICIiIgorCisgICAgZGVmIHRlc3RfdW5xdW90aW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB1bnF1b3Rpbmcgb2YgYWxsIEFTQ0lJIHZhbHVlcyB3b3JrcworICAgICAgICBlc2NhcGVfbGlzdCA9IFtdCisgICAgICAgIGZvciBudW0gaW4gcmFuZ2UoMTI4KToKKyAgICAgICAgICAgIGdpdmVuID0gaGV4ZXNjYXBlKGNocihudW0pKQorICAgICAgICAgICAgZXhwZWN0ID0gY2hyKG51bSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHVybGxpYi51bnF1b3RlKGdpdmVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHVucXVvdGUoKTogJXMgIT0gJXMiICUgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgICAgIHJlc3VsdCA9IHVybGxpYi51bnF1b3RlX3BsdXMoZ2l2ZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgdW5xdW90ZV9wbHVzKCk6ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3QsIHJlc3VsdCkpCisgICAgICAgICAgICBlc2NhcGVfbGlzdC5hcHBlbmQoZ2l2ZW4pCisgICAgICAgIGVzY2FwZV9zdHJpbmcgPSAnJy5qb2luKGVzY2FwZV9saXN0KQorICAgICAgICBkZWwgZXNjYXBlX2xpc3QKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZXNjYXBlX3N0cmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnQoJyUnKSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgcXVvdGUoKTogbm90IGFsbCBjaGFyYWN0ZXJzIGVzY2FwZWQ7ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudW5xdW90ZShlc2NhcGVfc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudCgnJScpLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyB1bnF1b3RlKCk6IG5vdCBhbGwgY2hhcmFjdGVycyBlc2NhcGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIiAlIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X3VucXVvdGluZ19iYWRwZXJjZW50KHNlbGYpOgorICAgICAgICAjIFRlc3QgdW5xdW90aW5nIG9uIGJhZCBwZXJjZW50LWVzY2FwZXMKKyAgICAgICAgZ2l2ZW4gPSAnJXhhYicKKyAgICAgICAgZXhwZWN0ID0gZ2l2ZW4KKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsICJ1c2luZyB1bnF1b3RlKCk6ICVyICE9ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgZ2l2ZW4gPSAnJXgnCisgICAgICAgIGV4cGVjdCA9IGdpdmVuCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi51bnF1b3RlKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LCAidXNpbmcgdW5xdW90ZSgpOiAlciAhPSAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIChleHBlY3QsIHJlc3VsdCkpCisgICAgICAgIGdpdmVuID0gJyUnCisgICAgICAgIGV4cGVjdCA9IGdpdmVuCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi51bnF1b3RlKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LCAidXNpbmcgdW5xdW90ZSgpOiAlciAhPSAlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIChleHBlY3QsIHJlc3VsdCkpCisKKyAgICBkZWYgdGVzdF91bnF1b3RpbmdfbWl4ZWRfY2FzZShzZWxmKToKKyAgICAgICAgIyBUZXN0IHVucXVvdGluZyBvbiBtaXhlZC1jYXNlIGhleCBkaWdpdHMgaW4gdGhlIHBlcmNlbnQtZXNjYXBlcworICAgICAgICBnaXZlbiA9ICclQWIlZUEnCisgICAgICAgIGV4cGVjdCA9ICdceGFiXHhlYScKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsICJ1c2luZyB1bnF1b3RlKCk6ICVyICE9ICVyIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgKGV4cGVjdCwgcmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X3VucXVvdGluZ19wYXJ0cyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdW5xdW90aW5nIHdvcmtzIHdoZW4gaGF2ZSBub24tcXVvdGVkIGNoYXJhY3RlcnMKKyAgICAgICAgIyBpbnRlcnNwZXJzZWQKKyAgICAgICAgZ2l2ZW4gPSAnYWIlc2QnICUgaGV4ZXNjYXBlKCdjJykKKyAgICAgICAgZXhwZWN0ID0gImFiY2QiCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi51bnF1b3RlKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBxdW90ZSgpOiAlcyAhPSAlcyIgJSAoZXhwZWN0LCByZXN1bHQpKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIudW5xdW90ZV9wbHVzKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyB1bnF1b3RlX3BsdXMoKTogJXMgIT0gJXMiICUgKGV4cGVjdCwgcmVzdWx0KSkKKworICAgIGRlZiB0ZXN0X3VucXVvdGluZ19wbHVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgZGlmZmVyZW5jZSBiZXR3ZWVuIHVucXVvdGUoKSBhbmQgdW5xdW90ZV9wbHVzKCkKKyAgICAgICAgZ2l2ZW4gPSAiYXJlK3RoZXJlK3NwYWNlcy4uLiIKKyAgICAgICAgZXhwZWN0ID0gZ2l2ZW4KKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVzaW5nIHVucXVvdGUoKTogJXMgIT0gJXMiICUgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgZXhwZWN0ID0gZ2l2ZW4ucmVwbGFjZSgnKycsICcgJykKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVucXVvdGVfcGx1cyhnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgdW5xdW90ZV9wbHVzKCk6ICVzICE9ICVzIiAlIChleHBlY3QsIHJlc3VsdCkpCisKKyAgICBkZWYgdGVzdF91bnF1b3RlX3dpdGhfdW5pY29kZShzZWxmKToKKyAgICAgICAgciA9IHVybGxpYi51bnF1b3RlKHUnYnIlQzMlQkNja25lcl9zYXBwb3JvXzIwMDUwOTMwLmRvYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgdSdiclx4YzNceGJjY2tuZXJfc2FwcG9yb18yMDA1MDkzMC5kb2MnKQorCitjbGFzcyB1cmxlbmNvZGVfVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciB1cmxlbmNvZGUoKSIiIgorCisgICAgZGVmIGhlbHBfaW5wdXR0eXBlKHNlbGYsIGdpdmVuLCB0ZXN0X3R5cGUpOgorICAgICAgICAiIiJIZWxwZXIgbWV0aG9kIGZvciB0ZXN0aW5nIGRpZmZlcmVudCBpbnB1dCB0eXBlcy4KKworICAgICAgICAnZ2l2ZW4nIG11c3QgbGVhZCB0byBvbmx5IHRoZSBwYWlyczoKKyAgICAgICAgICAgICogMXN0LCAxCisgICAgICAgICAgICAqIDJuZCwgMgorICAgICAgICAgICAgKiAzcmQsIDMKKworICAgICAgICBUZXN0IGNhbm5vdCBhc3N1bWUgYW55dGhpbmcgYWJvdXQgb3JkZXIuICBEb2NzIG1ha2Ugbm8gZ3VhcmFudGVlIGFuZAorICAgICAgICBoYXZlIHBvc3NpYmxlIGRpY3Rpb25hcnkgaW5wdXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIGV4cGVjdF9zb21ld2hlcmUgPSBbIjFzdD0xIiwgIjJuZD0yIiwgIjNyZD0zIl0KKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybGVuY29kZShnaXZlbikKKyAgICAgICAgZm9yIGV4cGVjdGVkIGluIGV4cGVjdF9zb21ld2hlcmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGV4cGVjdGVkLCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RpbmcgJXM6ICVzIG5vdCBmb3VuZCBpbiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0X3R5cGUsIGV4cGVjdGVkLCByZXN1bHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudCgnJicpLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nICVzOiBleHBlY3RlZCAyICcmJ3M7IGdvdCAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICh0ZXN0X3R5cGUsIHJlc3VsdC5jb3VudCgnJicpKSkKKyAgICAgICAgYW1wX2xvY2F0aW9uID0gcmVzdWx0LmluZGV4KCcmJykKKyAgICAgICAgb25fYW1wX2xlZnQgPSByZXN1bHRbYW1wX2xvY2F0aW9uIC0gMV0KKyAgICAgICAgb25fYW1wX3JpZ2h0ID0gcmVzdWx0W2FtcF9sb2NhdGlvbiArIDFdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvbl9hbXBfbGVmdC5pc2RpZ2l0KCkgYW5kIG9uX2FtcF9yaWdodC5pc2RpZ2l0KCksCisgICAgICAgICAgICAgICAgICAgICAidGVzdGluZyAlczogJyYnIG5vdCBsb2NhdGVkIGluIHByb3BlciBwbGFjZSBpbiAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgKHRlc3RfdHlwZSwgcmVzdWx0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0KSwgKDUgKiAzKSArIDIsICM1IGNoYXJzIHBlciB0aGluZyBhbmQgYW1wcworICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nICVzOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNoYXJhY3RlcnM6ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHRlc3RfdHlwZSwgbGVuKHJlc3VsdCksICg1ICogMykgKyAyKSkKKworICAgIGRlZiB0ZXN0X3VzaW5nX21hcHBpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCBwYXNzaW5nIGluIGEgbWFwcGluZyBvYmplY3QgYXMgYW4gYXJndW1lbnQuCisgICAgICAgIHNlbGYuaGVscF9pbnB1dHR5cGUoeyIxc3QiOicxJywgIjJuZCI6JzInLCAiM3JkIjonMyd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBkaWN0IGFzIGlucHV0IHR5cGUiKQorCisgICAgZGVmIHRlc3RfdXNpbmdfc2VxdWVuY2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBwYXNzaW5nIGluIGEgc2VxdWVuY2Ugb2YgdHdvLWl0ZW0gc2VxdWVuY2VzIGFzIGFuIGFyZ3VtZW50LgorICAgICAgICBzZWxmLmhlbHBfaW5wdXR0eXBlKFsoJzFzdCcsICcxJyksICgnMm5kJywgJzInKSwgKCczcmQnLCAnMycpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgc2VxdWVuY2Ugb2YgdHdvLWl0ZW0gdHVwbGVzIGFzIGlucHV0IikKKworICAgIGRlZiB0ZXN0X3F1b3Rpbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGtleXMgYW5kIHZhbHVlcyBhcmUgcXVvdGVkIHVzaW5nIHF1b3RlX3BsdXMoKQorICAgICAgICBnaXZlbiA9IHsiJiI6Ij0ifQorICAgICAgICBleHBlY3QgPSAiJXM9JXMiICUgKGhleGVzY2FwZSgnJicpLCBoZXhlc2NhcGUoJz0nKSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybGVuY29kZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCkKKyAgICAgICAgZ2l2ZW4gPSB7ImtleSBuYW1lIjoiQSBidW5jaCBvZiBwbHVzZXMifQorICAgICAgICBleHBlY3QgPSAia2V5K25hbWU9QStidW5jaCtvZitwbHVzZXMiCisgICAgICAgIHJlc3VsdCA9IHVybGxpYi51cmxlbmNvZGUoZ2l2ZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQpCisKKyAgICBkZWYgdGVzdF9kb3NlcShzZWxmKToKKyAgICAgICAgIyBUZXN0IHRoYXQgcGFzc2luZyBUcnVlIGZvciAnZG9zZXEnIHBhcmFtZXRlciB3b3JrcyBjb3JyZWN0bHkKKyAgICAgICAgZ2l2ZW4gPSB7J3NlcXVlbmNlJzpbJzEnLCAnMicsICczJ119CisgICAgICAgIGV4cGVjdCA9ICJzZXF1ZW5jZT0lcyIgJSB1cmxsaWIucXVvdGVfcGx1cyhzdHIoWycxJywgJzInLCAnMyddKSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybGVuY29kZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybGVuY29kZShnaXZlbiwgVHJ1ZSkKKyAgICAgICAgZm9yIHZhbHVlIGluIGdpdmVuWyJzZXF1ZW5jZSJdOgorICAgICAgICAgICAgZXhwZWN0ID0gInNlcXVlbmNlPSVzIiAlIHZhbHVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGV4cGVjdCwgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudCgnJicpLCAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCAyICcmJ3MsIGdvdCAlcyIgJSByZXN1bHQuY291bnQoJyYnKSkKKworY2xhc3MgUGF0aG5hbWVfVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3QgcGF0aG5hbWUydXJsKCkgYW5kIHVybDJwYXRobmFtZSgpIiIiCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgc2ltcGxlIHRlc3RzIHBhc3MKKyAgICAgICAgZXhwZWN0ZWRfcGF0aCA9IG9zLnBhdGguam9pbigicGFydHMiLCAib2YiLCAiYSIsICJwYXRoIikKKyAgICAgICAgZXhwZWN0ZWRfdXJsID0gInBhcnRzL29mL2EvcGF0aCIKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnBhdGhuYW1lMnVybChleHBlY3RlZF9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3VybCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRobmFtZTJ1cmwoKSBmYWlsZWQ7ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdCwgZXhwZWN0ZWRfdXJsKSkKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybDJwYXRobmFtZShleHBlY3RlZF91cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfcGF0aCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmwycGF0aGFtZSgpIGZhaWxlZDsgJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAocmVzdWx0LCBleHBlY3RlZF9wYXRoKSkKKworICAgIGRlZiB0ZXN0X3F1b3Rpbmcoc2VsZik6CisgICAgICAgICMgVGVzdCBhdXRvbWF0aWMgcXVvdGluZyBhbmQgdW5xdW90aW5nIHdvcmtzIGZvciBwYXRobmFtMnVybCgpIGFuZAorICAgICAgICAjIHVybDJwYXRobmFtZSgpIHJlc3BlY3RpdmVseQorICAgICAgICBnaXZlbiA9IG9zLnBhdGguam9pbigibmVlZHMiLCAicXVvdD1pbmciLCAiaGVyZSIpCisgICAgICAgIGV4cGVjdCA9ICJuZWVkcy8lcy9oZXJlIiAlIHVybGxpYi5xdW90ZSgicXVvdD1pbmciKQorICAgICAgICByZXN1bHQgPSB1cmxsaWIucGF0aG5hbWUydXJsKGdpdmVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJwYXRobmFtZTJ1cmwoKSBmYWlsZWQ7ICVzICE9ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdCwgcmVzdWx0KSkKKyAgICAgICAgZXhwZWN0ID0gZ2l2ZW4KKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybDJwYXRobmFtZShyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgInVybDJwYXRobmFtZSgpIGZhaWxlZDsgJXMgIT0gJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0LCByZXN1bHQpKQorICAgICAgICBnaXZlbiA9IG9zLnBhdGguam9pbigibWFrZSBzdXJlIiwgInVzaW5nX3F1b3RlIikKKyAgICAgICAgZXhwZWN0ID0gIiVzL3VzaW5nX3F1b3RlIiAlIHVybGxpYi5xdW90ZSgibWFrZSBzdXJlIikKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnBhdGhuYW1lMnVybChnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAicGF0aG5hbWUydXJsKCkgZmFpbGVkOyAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3QsIHJlc3VsdCkpCisgICAgICAgIGdpdmVuID0gIm1ha2Urc3VyZS91c2luZ191bnF1b3RlIgorICAgICAgICBleHBlY3QgPSBvcy5wYXRoLmpvaW4oIm1ha2Urc3VyZSIsICJ1c2luZ191bnF1b3RlIikKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybDJwYXRobmFtZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAidXJsMnBhdGhuYW1lKCkgZmFpbGVkOyAlcyAhPSAlcyIgJQorICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3QsIHJlc3VsdCkpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCBzcGVjaWZpYyB0byB0aGUgbnR1cmwycGF0aCBsaWJyYXJ5JykKKyAgICBkZWYgdGVzdF9udHBhdGgoc2VsZik6CisgICAgICAgIGdpdmVuID0gKCcvQzovJywgJy8vL0M6LycsICcvQ3wvLycpCisgICAgICAgIGV4cGVjdCA9ICdDOlxcJworICAgICAgICBmb3IgdXJsIGluIGdpdmVuOgorICAgICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybDJwYXRobmFtZSh1cmwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnR1cmwycGF0aC51cmwycGF0aG5hbWUoKSBmYWlsZWQ7ICVzICE9ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3QsIHJlc3VsdCkpCisgICAgICAgIGdpdmVuID0gJy8vL0N8L3BhdGgnCisgICAgICAgIGV4cGVjdCA9ICdDOlxccGF0aCcKKyAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybDJwYXRobmFtZShnaXZlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnbnR1cmwycGF0aC51cmwycGF0aG5hbWUoKSBmYWlsZWQ7ICVzICE9ICVzJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgKGV4cGVjdCwgcmVzdWx0KSkKKworY2xhc3MgVXRpbGl0eV9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdGNhc2UgdG8gdGVzdCB0aGUgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyBpbiB0aGUgdXJsbGliLiIiIgorCisgICAgZGVmIHRlc3Rfc3BsaXRwYXNzd2Qoc2VsZik6CisgICAgICAgICIiIlNvbWUgb2YgdGhlIHBhc3N3b3JkIGV4YW1wbGVzIGFyZSBub3Qgc2Vuc2libGUsIGJ1dCBpdCBpcyBhZGRlZCB0bworICAgICAgICBjb25maXJtaW5nIHRvIFJGQzI2MTcgYW5kIGFkZHJlc3NpbmcgaXNzdWU0Njc1LgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYWInKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXI6YWInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYVxuYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphXG5iJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2FcdGInKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXI6YVx0YicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhXHJiJyksdXJsbGliLnNwbGl0cGFzc3dkKCd1c2VyOmFccmInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXInLCAnYVxmYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphXGZiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2FcdmInKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXI6YVx2YicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgndXNlcicsICdhOmInKSx1cmxsaWIuc3BsaXRwYXNzd2QoJ3VzZXI6YTpiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyJywgJ2EgYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlcjphIGInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoJ3VzZXIgMicsICdhYicpLHVybGxpYi5zcGxpdHBhc3N3ZCgndXNlciAyOmFiJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKCd1c2VyKzEnLCAnYStiJyksdXJsbGliLnNwbGl0cGFzc3dkKCd1c2VyKzE6YStiJykpCisKKworY2xhc3MgVVJMb3BlbmVyX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0Y2FzZSB0byB0ZXN0IHRoZSBvcGVuIG1ldGhvZCBvZiBVUkxvcGVuZXIgY2xhc3MuIiIiCisKKyAgICBkZWYgdGVzdF9xdW90ZWRfb3BlbihzZWxmKToKKyAgICAgICAgY2xhc3MgRHVtbXlVUkxvcGVuZXIodXJsbGliLlVSTG9wZW5lcik6CisgICAgICAgICAgICBkZWYgb3Blbl9zcGFtKHNlbGYsIHVybCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHVybAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRHVtbXlVUkxvcGVuZXIoKS5vcGVuKAorICAgICAgICAgICAgJ3NwYW06Ly9leGFtcGxlLyAvJyksJy8vZXhhbXBsZS8lMjAvJykKKworICAgICAgICAjIHRlc3QgdGhlIHNhZmUgY2hhcmFjdGVycyBhcmUgbm90IHF1b3RlZCBieSB1cmxvcGVuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRHVtbXlVUkxvcGVuZXIoKS5vcGVuKAorICAgICAgICAgICAgInNwYW06Ly9jOnx3aW5kb3dzJS86PSY/fiMrISQsOydAKCkqW118L3BhdGgvIiksCisgICAgICAgICAgICAiLy9jOnx3aW5kb3dzJS86PSY/fiMrISQsOydAKCkqW118L3BhdGgvIikKKworCisjIEp1c3QgY29tbWVudGVkIHRoZW0gb3V0LgorIyBDYW4ndCByZWFsbHkgdGVsbCB3aHkga2VlcCBmYWlsaW5nIGluIHdpbmRvd3MgYW5kIHNwYXJjLgorIyBFdmVyeXdoZXJlIGVsc2UgdGhleSB3b3JrIG9rLCBidXQgb24gdGhvc2UgbWFjaGluZXMsIHNvbWV0aW1lcworIyBmYWlsIGluIG9uZSBvZiB0aGUgdGVzdHMsIHNvbWV0aW1lcyBpbiBvdGhlci4gSSBoYXZlIGEgbGludXgsIGFuZAorIyB0aGUgdGVzdHMgZ28gb2suCisjIElmIGFueWJvZHkgaGFzIG9uZSBvZiB0aGUgcHJvYmxlbWF0aWMgZW52aXJvbWVudHMsIHBsZWFzZSBoZWxwIQorIyAuICAgRmFjdW5kbworIworIyBkZWYgc2VydmVyKGV2dCk6CisjICAgICBpbXBvcnQgc29ja2V0LCB0aW1lCisjICAgICBzZXJ2ID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorIyAgICAgc2Vydi5zZXR0aW1lb3V0KDMpCisjICAgICBzZXJ2LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCisjICAgICBzZXJ2LmJpbmQoKCIiLCA5MDkzKSkKKyMgICAgIHNlcnYubGlzdGVuKDUpCisjICAgICB0cnk6CisjICAgICAgICAgY29ubiwgYWRkciA9IHNlcnYuYWNjZXB0KCkKKyMgICAgICAgICBjb25uLnNlbmQoIjEgSG9sYSBtdW5kb1xuIikKKyMgICAgICAgICBjYW50ZGF0YSA9IDAKKyMgICAgICAgICB3aGlsZSBjYW50ZGF0YSA8IDEzOgorIyAgICAgICAgICAgICBkYXRhID0gY29ubi5yZWN2KDEzLWNhbnRkYXRhKQorIyAgICAgICAgICAgICBjYW50ZGF0YSArPSBsZW4oZGF0YSkKKyMgICAgICAgICAgICAgdGltZS5zbGVlcCguMykKKyMgICAgICAgICBjb25uLnNlbmQoIjIgTm8gbW9yZSBsaW5lc1xuIikKKyMgICAgICAgICBjb25uLmNsb3NlKCkKKyMgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyMgICAgICAgICBwYXNzCisjICAgICBmaW5hbGx5OgorIyAgICAgICAgIHNlcnYuY2xvc2UoKQorIyAgICAgICAgIGV2dC5zZXQoKQorIworIyBjbGFzcyBGVFBXcmFwcGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorIworIyAgICAgZGVmIHNldFVwKHNlbGYpOgorIyAgICAgICAgIGltcG9ydCBmdHBsaWIsIHRpbWUsIHRocmVhZGluZworIyAgICAgICAgIGZ0cGxpYi5GVFAucG9ydCA9IDkwOTMKKyMgICAgICAgICBzZWxmLmV2dCA9IHRocmVhZGluZy5FdmVudCgpCisjICAgICAgICAgdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9c2VydmVyLCBhcmdzPShzZWxmLmV2dCwpKS5zdGFydCgpCisjICAgICAgICAgdGltZS5zbGVlcCguMSkKKyMKKyMgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyMgICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyMKKyMgICAgIGRlZiB0ZXN0QmFzaWMoc2VsZik6CisjICAgICAgICAgIyBjb25uZWN0cworIyAgICAgICAgIGZ0cCA9IHVybGxpYi5mdHB3cmFwcGVyKCJteXVzZXIiLCAibXlwYXNzIiwgImxvY2FsaG9zdCIsIDkwOTMsIFtdKQorIyAgICAgICAgIGZ0cC5jbG9zZSgpCisjCisjICAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgorIyAgICAgICAgICMgZ2xvYmFsIGRlZmF1bHQgdGltZW91dCBpcyBpZ25vcmVkCisjICAgICAgICAgaW1wb3J0IHNvY2tldAorIyAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorIyAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKKyMgICAgICAgICB0cnk6CisjICAgICAgICAgICAgIGZ0cCA9IHVybGxpYi5mdHB3cmFwcGVyKCJteXVzZXIiLCAibXlwYXNzIiwgImxvY2FsaG9zdCIsIDkwOTMsIFtdKQorIyAgICAgICAgIGZpbmFsbHk6CisjICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorIyAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnRwLmZ0cC5zb2NrLmdldHRpbWVvdXQoKSwgMzApCisjICAgICAgICAgZnRwLmNsb3NlKCkKKyMKKyMgICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CisjICAgICAgICAgIyBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IGlzIHVzZWQKKyMgICAgICAgICBpbXBvcnQgc29ja2V0CisjICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisjICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQorIyAgICAgICAgIHRyeToKKyMgICAgICAgICAgICAgZnRwID0gdXJsbGliLmZ0cHdyYXBwZXIoIm15dXNlciIsICJteXBhc3MiLCAibG9jYWxob3N0IiwgOTA5MywgW10pCisjICAgICAgICAgZmluYWxseToKKyMgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisjICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdHAuZnRwLnNvY2suZ2V0dGltZW91dCgpLCAzMCkKKyMgICAgICAgICBmdHAuY2xvc2UoKQorIworIyAgICAgZGVmIHRlc3RUaW1lb3V0VmFsdWUoc2VsZik6CisjICAgICAgICAgZnRwID0gdXJsbGliLmZ0cHdyYXBwZXIoIm15dXNlciIsICJteXBhc3MiLCAibG9jYWxob3N0IiwgOTA5MywgW10sCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dD0zMCkKKyMgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ0cC5mdHAuc29jay5nZXR0aW1lb3V0KCksIDMwKQorIyAgICAgICAgIGZ0cC5jbG9zZSgpCisKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgaW1wb3J0IHdhcm5pbmdzCisgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgIi4qdXJsbGliXC51cmxvcGVuLipQeXRob24gMy4wIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgdXJsb3Blbl9GaWxlVGVzdHMsCisgICAgICAgICAgICB1cmxvcGVuX0h0dHBUZXN0cywKKyAgICAgICAgICAgIHVybHJldHJpZXZlX0ZpbGVUZXN0cywKKyAgICAgICAgICAgIHVybHJldHJpZXZlX0h0dHBUZXN0cywKKyAgICAgICAgICAgIFByb3h5VGVzdHMsCisgICAgICAgICAgICBRdW90aW5nVGVzdHMsCisgICAgICAgICAgICBVbnF1b3RpbmdUZXN0cywKKyAgICAgICAgICAgIHVybGVuY29kZV9UZXN0cywKKyAgICAgICAgICAgIFBhdGhuYW1lX1Rlc3RzLAorICAgICAgICAgICAgVXRpbGl0eV9UZXN0cywKKyAgICAgICAgICAgIFVSTG9wZW5lcl9UZXN0cywKKyAgICAgICAgICAgICNGVFBXcmFwcGVyVGVzdHMsCisgICAgICAgICkKKworCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyM2QwNGUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MjhhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYzk5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5CkBAIC0wLDAgKzEsMTM3OCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgb3MKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgdXJsbGliMgorZnJvbSB1cmxsaWIyIGltcG9ydCBSZXF1ZXN0LCBPcGVuZXJEaXJlY3RvcgorCisjIFhYWAorIyBSZXF1ZXN0CisjIENhY2hlRlRQSGFuZGxlciAoaGFyZCB0byB3cml0ZSkKKyMgcGFyc2Vfa2Vxdl9saXN0LCBwYXJzZV9odHRwX2xpc3QsIEhUVFBEaWdlc3RBdXRoSGFuZGxlcgorCitjbGFzcyBUcml2aWFsVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3RyaXZpYWwoc2VsZik6CisgICAgICAgICMgQSBjb3VwbGUgdHJpdmlhbCB0ZXN0cworCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVybGxpYjIudXJsb3BlbiwgJ2JvZ3VzIHVybCcpCisKKyAgICAgICAgIyBYWFggTmFtZSBoYWNraW5nIHRvIGdldCB0aGlzIHRvIHdvcmsgb24gV2luZG93cy4KKyAgICAgICAgZm5hbWUgPSBvcy5wYXRoLmFic3BhdGgodXJsbGliMi5fX2ZpbGVfXykucmVwbGFjZSgnXFwnLCAnLycpCisKKyAgICAgICAgIyBBbmQgbW9yZSBoYWNraW5nIHRvIGdldCBpdCB0byB3b3JrIG9uIE1hY09TLiBUaGlzIGFzc3VtZXMKKyAgICAgICAgIyB1cmxsaWIucGF0aG5hbWUydXJsIHdvcmtzLCB1bmZvcnR1bmF0ZWx5Li4uCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Jpc2Nvcyc6CisgICAgICAgICAgICBpbXBvcnQgc3RyaW5nCisgICAgICAgICAgICBmbmFtZSA9IG9zLmV4cGFuZChmbmFtZSkKKyAgICAgICAgICAgIGZuYW1lID0gZm5hbWUudHJhbnNsYXRlKHN0cmluZy5tYWtldHJhbnMoIi8uIiwgIi4vIikpCisKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgZmlsZV91cmwgPSAiZmlsZTovLy8lcyIgJSBmbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlsZV91cmwgPSAiZmlsZTovLyVzIiAlIGZuYW1lCisKKyAgICAgICAgZiA9IHVybGxpYjIudXJsb3BlbihmaWxlX3VybCkKKworICAgICAgICBidWYgPSBmLnJlYWQoKQorICAgICAgICBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3BhcnNlX2h0dHBfbGlzdChzZWxmKToKKyAgICAgICAgdGVzdHMgPSBbKCdhLGIsYycsIFsnYScsICdiJywgJ2MnXSksCisgICAgICAgICAgICAgICAgICgncGF0aCJvLGwib2ciaSJjYWwsIGV4YW1wbGUnLCBbJ3BhdGgibyxsIm9nImkiY2FsJywgJ2V4YW1wbGUnXSksCisgICAgICAgICAgICAgICAgICgnYSwgYiwgImMiLCAiZCIsICJlLGYiLCBnLCBoJywgWydhJywgJ2InLCAnImMiJywgJyJkIicsICciZSxmIicsICdnJywgJ2gnXSksCisgICAgICAgICAgICAgICAgICgnYT0iYlxcImMiLCBkPSJlXFwsZiIsIGc9ImhcXFxcaSInLCBbJ2E9ImIiYyInLCAnZD0iZSxmIicsICdnPSJoXFxpIiddKV0KKyAgICAgICAgZm9yIHN0cmluZywgbGlzdCBpbiB0ZXN0czoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJsbGliMi5wYXJzZV9odHRwX2xpc3Qoc3RyaW5nKSwgbGlzdCkKKworCitkZWYgdGVzdF9yZXF1ZXN0X2hlYWRlcnNfZGljdCgpOgorICAgICIiIgorICAgIFRoZSBSZXF1ZXN0LmhlYWRlcnMgZGljdGlvbmFyeSBpcyBub3QgYSBkb2N1bWVudGVkIGludGVyZmFjZS4gIEl0IHNob3VsZAorICAgIHN0YXkgdGhhdCB3YXksIGJlY2F1c2UgdGhlIGNvbXBsZXRlIHNldCBvZiBoZWFkZXJzIGFyZSBvbmx5IGFjY2Vzc2libGUKKyAgICB0aHJvdWdoIHRoZSAuZ2V0X2hlYWRlcigpLCAuaGFzX2hlYWRlcigpLCAuaGVhZGVyX2l0ZW1zKCkgaW50ZXJmYWNlLgorICAgIEhvd2V2ZXIsIC5oZWFkZXJzIHByZS1kYXRlcyB0aG9zZSBtZXRob2RzLCBhbmQgc28gcmVhbCBjb2RlIHdpbGwgYmUgdXNpbmcKKyAgICB0aGUgZGljdGlvbmFyeS4KKworICAgIFRoZSBpbnRyb2R1Y3Rpb24gaW4gMi40IG9mIHRob3NlIG1ldGhvZHMgd2FzIGEgbWlzdGFrZSBmb3IgdGhlIHNhbWUgcmVhc29uOgorICAgIGNvZGUgdGhhdCBwcmV2aW91c2x5IHNhdyBhbGwgKHVybGxpYjIgdXNlciktcHJvdmlkZWQgaGVhZGVycyBpbiAuaGVhZGVycworICAgIG5vdyBzZWVzIG9ubHkgYSBzdWJzZXQgKGFuZCB0aGUgZnVuY3Rpb24gaW50ZXJmYWNlIGlzIHVnbHkgYW5kIGluY29tcGxldGUpLgorICAgIEEgYmV0dGVyIGNoYW5nZSB3b3VsZCBoYXZlIGJlZW4gdG8gcmVwbGFjZSAuaGVhZGVycyBkaWN0IHdpdGggYSBkaWN0CisgICAgc3ViY2xhc3MgKG9yIFVzZXJEaWN0LkRpY3RNaXhpbiBpbnN0YW5jZT8pICB0aGF0IHByZXNlcnZlZCB0aGUgLmhlYWRlcnMKKyAgICBpbnRlcmZhY2UgYW5kIGFsc28gcHJvdmlkZWQgYWNjZXNzIHRvIHRoZSAidW5yZWRpcmVjdGVkIiBoZWFkZXJzLiAgSXQncworICAgIHByb2JhYmx5IHRvbyBsYXRlIHRvIGZpeCB0aGF0LCB0aG91Z2guCisKKworICAgIENoZWNrIC5jYXBpdGFsaXplKCkgY2FzZSBub3JtYWxpemF0aW9uOgorCisgICAgPj4+IHVybCA9ICJodHRwOi8vZXhhbXBsZS5jb20iCisgICAgPj4+IFJlcXVlc3QodXJsLCBoZWFkZXJzPXsiU3BhbS1lZ2dzIjogImJsYWgifSkuaGVhZGVyc1siU3BhbS1lZ2dzIl0KKyAgICAnYmxhaCcKKyAgICA+Pj4gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eyJzcGFtLUVnZ1MiOiAiYmxhaCJ9KS5oZWFkZXJzWyJTcGFtLWVnZ3MiXQorICAgICdibGFoJworCisgICAgQ3VycmVudGx5LCBSZXF1ZXN0KHVybCwgIlNwYW0tZWdncyIpLmhlYWRlcnNbIlNwYW0tRWdncyJdIHJhaXNlcyBLZXlFcnJvciwKKyAgICBidXQgdGhhdCBjb3VsZCBiZSBjaGFuZ2VkIGluIGZ1dHVyZS4KKworICAgICIiIgorCitkZWYgdGVzdF9yZXF1ZXN0X2hlYWRlcnNfbWV0aG9kcygpOgorICAgICIiIgorICAgIE5vdGUgdGhlIGNhc2Ugbm9ybWFsaXphdGlvbiBvZiBoZWFkZXIgbmFtZXMgaGVyZSwgdG8gLmNhcGl0YWxpemUoKS1jYXNlLgorICAgIFRoaXMgc2hvdWxkIGJlIHByZXNlcnZlZCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuICAoSW4gdGhlIEhUVFAgY2FzZSwKKyAgICBub3JtYWxpemF0aW9uIHRvIC50aXRsZSgpLWNhc2UgaXMgZG9uZSBieSB1cmxsaWIyIGJlZm9yZSBzZW5kaW5nIGhlYWRlcnMgdG8KKyAgICBodHRwbGliKS4KKworICAgID4+PiB1cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tIgorICAgID4+PiByID0gUmVxdWVzdCh1cmwsIGhlYWRlcnM9eyJTcGFtLWVnZ3MiOiAiYmxhaCJ9KQorICAgID4+PiByLmhhc19oZWFkZXIoIlNwYW0tZWdncyIpCisgICAgVHJ1ZQorICAgID4+PiByLmhlYWRlcl9pdGVtcygpCisgICAgWygnU3BhbS1lZ2dzJywgJ2JsYWgnKV0KKyAgICA+Pj4gci5hZGRfaGVhZGVyKCJGb28tQmFyIiwgImJheiIpCisgICAgPj4+IGl0ZW1zID0gci5oZWFkZXJfaXRlbXMoKQorICAgID4+PiBpdGVtcy5zb3J0KCkKKyAgICA+Pj4gaXRlbXMKKyAgICBbKCdGb28tYmFyJywgJ2JheicpLCAoJ1NwYW0tZWdncycsICdibGFoJyldCisKKyAgICBOb3RlIHRoYXQgZS5nLiByLmhhc19oZWFkZXIoInNwYW0tRWdnUyIpIGlzIGN1cnJlbnRseSBGYWxzZSwgYW5kCisgICAgci5nZXRfaGVhZGVyKCJzcGFtLUVnZ1MiKSByZXR1cm5zIE5vbmUsIGJ1dCB0aGF0IGNvdWxkIGJlIGNoYW5nZWQgaW4KKyAgICBmdXR1cmUuCisKKyAgICA+Pj4gci5oYXNfaGVhZGVyKCJOb3QtdGhlcmUiKQorICAgIEZhbHNlCisgICAgPj4+IHByaW50IHIuZ2V0X2hlYWRlcigiTm90LXRoZXJlIikKKyAgICBOb25lCisgICAgPj4+IHIuZ2V0X2hlYWRlcigiTm90LXRoZXJlIiwgImRlZmF1bHQiKQorICAgICdkZWZhdWx0JworCisgICAgIiIiCisKKworZGVmIHRlc3RfcGFzc3dvcmRfbWFuYWdlcihzZWxmKToKKyAgICAiIiIKKyAgICA+Pj4gbWdyID0gdXJsbGliMi5IVFRQUGFzc3dvcmRNZ3IoKQorICAgID4+PiBhZGQgPSBtZ3IuYWRkX3Bhc3N3b3JkCisgICAgPj4+IGFkZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vIiwgImpvZSIsICJwYXNzd29yZCIpCisgICAgPj4+IGFkZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vbmkiLCAibmkiLCAibmkiKQorICAgID4+PiBhZGQoImMiLCAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIsICJmb28iLCAibmkiKQorICAgID4+PiBhZGQoImMiLCAiaHR0cDovL2V4YW1wbGUuY29tL2JhciIsICJiYXIiLCAibmluaSIpCisgICAgPj4+IGFkZCgiYiIsICJodHRwOi8vZXhhbXBsZS5jb20vIiwgImZpcnN0IiwgImJsYWgiKQorICAgID4+PiBhZGQoImIiLCAiaHR0cDovL2V4YW1wbGUuY29tLyIsICJzZWNvbmQiLCAic3BhbSIpCisgICAgPj4+IGFkZCgiYSIsICJodHRwOi8vZXhhbXBsZS5jb20iLCAiMSIsICJhIikKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImh0dHA6Ly9jLmV4YW1wbGUuY29tOjMxMjgiLCAiMyIsICJjIikKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImQuZXhhbXBsZS5jb20iLCAiNCIsICJkIikKKyAgICA+Pj4gYWRkKCJTb21lIFJlYWxtIiwgImUuZXhhbXBsZS5jb206MzEyOCIsICI1IiwgImUiKQorCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiZXhhbXBsZS5jb20iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vIikKKyAgICAoJ2pvZScsICdwYXNzd29yZCcpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiaHR0cDovL2V4YW1wbGUuY29tL3NwYW0iKQorICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vc3BhbS9zcGFtIikKKyAgICAoJ2pvZScsICdwYXNzd29yZCcpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImMiLCAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIpCisgICAgKCdmb28nLCAnbmknKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJjIiwgImh0dHA6Ly9leGFtcGxlLmNvbS9iYXIiKQorICAgICgnYmFyJywgJ25pbmknKQorCisgICAgQWN0dWFsbHksIHRoaXMgaXMgcmVhbGx5IHVuZGVmaW5lZCBBVE0KKyMjICAgICBDdXJyZW50bHksIHdlIHVzZSB0aGUgaGlnaGVzdC1sZXZlbCBwYXRoIHdoZXJlIG1vcmUgdGhhbiBvbmUgbWF0Y2g6CisKKyMjICAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vZXhhbXBsZS5jb20vbmkiKQorIyMgICAgICgnam9lJywgJ3Bhc3N3b3JkJykKKworICAgIFVzZSBsYXRlc3QgYWRkX3Bhc3N3b3JkKCkgaW4gY2FzZSBvZiBjb25mbGljdDoKKworICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJiIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgICgnc2Vjb25kJywgJ3NwYW0nKQorCisgICAgTm8gc3BlY2lhbCByZWxhdGlvbnNoaXAgYmV0d2VlbiBhLmV4YW1wbGUuY29tIGFuZCBleGFtcGxlLmNvbToKKworICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJhIiwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgICgnMScsICdhJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiYSIsICJodHRwOi8vYS5leGFtcGxlLmNvbS8iKQorICAgIChOb25lLCBOb25lKQorCisgICAgUG9ydHM6CisKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJjLmV4YW1wbGUuY29tIikKKyAgICAoTm9uZSwgTm9uZSkKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJjLmV4YW1wbGUuY29tOjMxMjgiKQorICAgICgnMycsICdjJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiU29tZSBSZWFsbSIsICJodHRwOi8vYy5leGFtcGxlLmNvbTozMTI4IikKKyAgICAoJzMnLCAnYycpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoIlNvbWUgUmVhbG0iLCAiZC5leGFtcGxlLmNvbSIpCisgICAgKCc0JywgJ2QnKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJTb21lIFJlYWxtIiwgImUuZXhhbXBsZS5jb206MzEyOCIpCisgICAgKCc1JywgJ2UnKQorCisgICAgIiIiCisgICAgcGFzcworCisKK2RlZiB0ZXN0X3Bhc3N3b3JkX21hbmFnZXJfZGVmYXVsdF9wb3J0KHNlbGYpOgorICAgICIiIgorICAgID4+PiBtZ3IgPSB1cmxsaWIyLkhUVFBQYXNzd29yZE1ncigpCisgICAgPj4+IGFkZCA9IG1nci5hZGRfcGFzc3dvcmQKKworICAgIFRoZSBwb2ludCB0byBub3RlIGhlcmUgaXMgdGhhdCB3ZSBjYW4ndCBndWVzcyB0aGUgZGVmYXVsdCBwb3J0IGlmIHRoZXJlJ3MKKyAgICBubyBzY2hlbWUuICBUaGlzIGFwcGxpZXMgdG8gYm90aCBhZGRfcGFzc3dvcmQgYW5kIGZpbmRfdXNlcl9wYXNzd29yZC4KKworICAgID4+PiBhZGQoImYiLCAiaHR0cDovL2cuZXhhbXBsZS5jb206ODAiLCAiMTAiLCAiaiIpCisgICAgPj4+IGFkZCgiZyIsICJodHRwOi8vaC5leGFtcGxlLmNvbSIsICIxMSIsICJrIikKKyAgICA+Pj4gYWRkKCJoIiwgImkuZXhhbXBsZS5jb206ODAiLCAiMTIiLCAibCIpCisgICAgPj4+IGFkZCgiaSIsICJqLmV4YW1wbGUuY29tIiwgIjEzIiwgIm0iKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJmIiwgImcuZXhhbXBsZS5jb206MTAwIikKKyAgICAoTm9uZSwgTm9uZSkKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiZiIsICJnLmV4YW1wbGUuY29tOjgwIikKKyAgICAoJzEwJywgJ2onKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJmIiwgImcuZXhhbXBsZS5jb20iKQorICAgIChOb25lLCBOb25lKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJmIiwgImh0dHA6Ly9nLmV4YW1wbGUuY29tOjEwMCIpCisgICAgKE5vbmUsIE5vbmUpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImYiLCAiaHR0cDovL2cuZXhhbXBsZS5jb206ODAiKQorICAgICgnMTAnLCAnaicpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImYiLCAiaHR0cDovL2cuZXhhbXBsZS5jb20iKQorICAgICgnMTAnLCAnaicpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImciLCAiaC5leGFtcGxlLmNvbSIpCisgICAgKCcxMScsICdrJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiZyIsICJoLmV4YW1wbGUuY29tOjgwIikKKyAgICAoJzExJywgJ2snKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJnIiwgImh0dHA6Ly9oLmV4YW1wbGUuY29tOjgwIikKKyAgICAoJzExJywgJ2snKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJoIiwgImkuZXhhbXBsZS5jb20iKQorICAgIChOb25lLCBOb25lKQorICAgID4+PiBtZ3IuZmluZF91c2VyX3Bhc3N3b3JkKCJoIiwgImkuZXhhbXBsZS5jb206ODAiKQorICAgICgnMTInLCAnbCcpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImgiLCAiaHR0cDovL2kuZXhhbXBsZS5jb206ODAiKQorICAgICgnMTInLCAnbCcpCisgICAgPj4+IG1nci5maW5kX3VzZXJfcGFzc3dvcmQoImkiLCAiai5leGFtcGxlLmNvbSIpCisgICAgKCcxMycsICdtJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiaSIsICJqLmV4YW1wbGUuY29tOjgwIikKKyAgICAoTm9uZSwgTm9uZSkKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiaSIsICJodHRwOi8vai5leGFtcGxlLmNvbSIpCisgICAgKCcxMycsICdtJykKKyAgICA+Pj4gbWdyLmZpbmRfdXNlcl9wYXNzd29yZCgiaSIsICJodHRwOi8vai5leGFtcGxlLmNvbTo4MCIpCisgICAgKE5vbmUsIE5vbmUpCisKKyAgICAiIiIKKworY2xhc3MgTW9ja09wZW5lcjoKKyAgICBhZGRoZWFkZXJzID0gW10KKyAgICBkZWYgb3BlbihzZWxmLCByZXEsIGRhdGE9Tm9uZSx0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgIHNlbGYucmVxLCBzZWxmLmRhdGEsIHNlbGYudGltZW91dCAgPSByZXEsIGRhdGEsIHRpbWVvdXQKKyAgICBkZWYgZXJyb3Ioc2VsZiwgcHJvdG8sICphcmdzKToKKyAgICAgICAgc2VsZi5wcm90bywgc2VsZi5hcmdzID0gcHJvdG8sIGFyZ3MKKworY2xhc3MgTW9ja0ZpbGU6CisgICAgZGVmIHJlYWQoc2VsZiwgY291bnQ9Tm9uZSk6IHBhc3MKKyAgICBkZWYgcmVhZGxpbmUoc2VsZiwgY291bnQ9Tm9uZSk6IHBhc3MKKyAgICBkZWYgY2xvc2Uoc2VsZik6IHBhc3MKKworY2xhc3MgTW9ja0hlYWRlcnMoZGljdCk6CisgICAgZGVmIGdldGhlYWRlcnMoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLnZhbHVlcygpCisKK2NsYXNzIE1vY2tSZXNwb25zZShTdHJpbmdJTy5TdHJpbmdJTyk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvZGUsIG1zZywgaGVhZGVycywgZGF0YSwgdXJsPU5vbmUpOgorICAgICAgICBTdHJpbmdJTy5TdHJpbmdJTy5fX2luaXRfXyhzZWxmLCBkYXRhKQorICAgICAgICBzZWxmLmNvZGUsIHNlbGYubXNnLCBzZWxmLmhlYWRlcnMsIHNlbGYudXJsID0gY29kZSwgbXNnLCBoZWFkZXJzLCB1cmwKKyAgICBkZWYgaW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycworICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnVybAorCitjbGFzcyBNb2NrQ29va2llSmFyOgorICAgIGRlZiBhZGRfY29va2llX2hlYWRlcihzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgc2VsZi5hY2hfcmVxID0gcmVxdWVzdAorICAgIGRlZiBleHRyYWN0X2Nvb2tpZXMoc2VsZiwgcmVzcG9uc2UsIHJlcXVlc3QpOgorICAgICAgICBzZWxmLmVjX3JlcSwgc2VsZi5lY19yID0gcmVxdWVzdCwgcmVzcG9uc2UKKworY2xhc3MgRmFrZU1ldGhvZDoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aF9uYW1lLCBhY3Rpb24sIGhhbmRsZSk6CisgICAgICAgIHNlbGYubWV0aF9uYW1lID0gbWV0aF9uYW1lCisgICAgICAgIHNlbGYuaGFuZGxlID0gaGFuZGxlCisgICAgICAgIHNlbGYuYWN0aW9uID0gYWN0aW9uCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlKHNlbGYubWV0aF9uYW1lLCBzZWxmLmFjdGlvbiwgKmFyZ3MpCisKK2NsYXNzIE1vY2tIVFRQUmVzcG9uc2U6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZwLCBtc2csIHN0YXR1cywgcmVhc29uKToKKyAgICAgICAgc2VsZi5mcCA9IGZwCisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCisgICAgICAgIHNlbGYucmVhc29uID0gcmVhc29uCisgICAgZGVmIHJlYWQoc2VsZik6CisgICAgICAgIHJldHVybiAnJworCitjbGFzcyBNb2NrSFRUUENsYXNzOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5yZXFfaGVhZGVycyA9IFtdCisgICAgICAgIHNlbGYuZGF0YSA9IE5vbmUKKyAgICAgICAgc2VsZi5yYWlzZV9vbl9lbmRoZWFkZXJzID0gRmFsc2UKKyAgICAgICAgc2VsZi5fdHVubmVsX2hlYWRlcnMgPSB7fQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGhvc3QsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICAgICAgc2VsZi5ob3N0ID0gaG9zdAorICAgICAgICBzZWxmLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgc2V0X2RlYnVnbGV2ZWwoc2VsZiwgbGV2ZWwpOgorICAgICAgICBzZWxmLmxldmVsID0gbGV2ZWwKKworICAgIGRlZiBzZXRfdHVubmVsKHNlbGYsIGhvc3QsIHBvcnQ9Tm9uZSwgaGVhZGVycz1Ob25lKToKKyAgICAgICAgc2VsZi5fdHVubmVsX2hvc3QgPSBob3N0CisgICAgICAgIHNlbGYuX3R1bm5lbF9wb3J0ID0gcG9ydAorICAgICAgICBpZiBoZWFkZXJzOgorICAgICAgICAgICAgc2VsZi5fdHVubmVsX2hlYWRlcnMgPSBoZWFkZXJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl90dW5uZWxfaGVhZGVycy5jbGVhcigpCisKKyAgICBkZWYgcmVxdWVzdChzZWxmLCBtZXRob2QsIHVybCwgYm9keT1Ob25lLCBoZWFkZXJzPU5vbmUpOgorICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAorICAgICAgICBzZWxmLnNlbGVjdG9yID0gdXJsCisgICAgICAgIGlmIGhlYWRlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlcV9oZWFkZXJzICs9IGhlYWRlcnMuaXRlbXMoKQorICAgICAgICBzZWxmLnJlcV9oZWFkZXJzLnNvcnQoKQorICAgICAgICBpZiBib2R5OgorICAgICAgICAgICAgc2VsZi5kYXRhID0gYm9keQorICAgICAgICBpZiBzZWxmLnJhaXNlX29uX2VuZGhlYWRlcnM6CisgICAgICAgICAgICBpbXBvcnQgc29ja2V0CisgICAgICAgICAgICByYWlzZSBzb2NrZXQuZXJyb3IoKQorCisgICAgZGVmIGdldHJlc3BvbnNlKHNlbGYpOgorICAgICAgICByZXR1cm4gTW9ja0hUVFBSZXNwb25zZShNb2NrRmlsZSgpLCB7fSwgMjAwLCAiT0siKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIE1vY2tIYW5kbGVyOgorICAgICMgdXNlZnVsIGZvciB0ZXN0aW5nIGhhbmRsZXIgbWFjaGluZXJ5CisgICAgIyBzZWUgYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycygpIGRvY3N0cmluZworICAgIGhhbmRsZXJfb3JkZXIgPSA1MDAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kcyk6CisgICAgICAgIHNlbGYuX2RlZmluZV9tZXRob2RzKG1ldGhvZHMpCisgICAgZGVmIF9kZWZpbmVfbWV0aG9kcyhzZWxmLCBtZXRob2RzKToKKyAgICAgICAgZm9yIHNwZWMgaW4gbWV0aG9kczoKKyAgICAgICAgICAgIGlmIGxlbihzcGVjKSA9PSAyOiBuYW1lLCBhY3Rpb24gPSBzcGVjCisgICAgICAgICAgICBlbHNlOiBuYW1lLCBhY3Rpb24gPSBzcGVjLCBOb25lCisgICAgICAgICAgICBtZXRoID0gRmFrZU1ldGhvZChuYW1lLCBhY3Rpb24sIHNlbGYuaGFuZGxlKQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLl9fY2xhc3NfXywgbmFtZSwgbWV0aCkKKyAgICBkZWYgaGFuZGxlKHNlbGYsIGZuX25hbWUsIGFjdGlvbiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHNlbGYucGFyZW50LmNhbGxzLmFwcGVuZCgoc2VsZiwgZm5fbmFtZSwgYXJncywga3dkcykpCisgICAgICAgIGlmIGFjdGlvbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxpZiBhY3Rpb24gPT0gInJldHVybiBzZWxmIjoKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGVsaWYgYWN0aW9uID09ICJyZXR1cm4gcmVzcG9uc2UiOgorICAgICAgICAgICAgcmVzID0gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwge30sICIiKQorICAgICAgICAgICAgcmV0dXJuIHJlcworICAgICAgICBlbGlmIGFjdGlvbiA9PSAicmV0dXJuIHJlcXVlc3QiOgorICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3QoImh0dHA6Ly9ibGFoLyIpCisgICAgICAgIGVsaWYgYWN0aW9uLnN0YXJ0c3dpdGgoImVycm9yIik6CisgICAgICAgICAgICBjb2RlID0gYWN0aW9uW2FjdGlvbi5yZmluZCgiICIpKzE6XQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvZGUgPSBpbnQoY29kZSkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHJlcyA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIikKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5lcnJvcigiaHR0cCIsIGFyZ3NbMF0sIHJlcywgY29kZSwgIiIsIHt9KQorICAgICAgICBlbGlmIGFjdGlvbiA9PSAicmFpc2UiOgorICAgICAgICAgICAgcmFpc2UgdXJsbGliMi5VUkxFcnJvcigiYmxhaCIpCisgICAgICAgIGFzc2VydCBGYWxzZQorICAgIGRlZiBjbG9zZShzZWxmKTogcGFzcworICAgIGRlZiBhZGRfcGFyZW50KHNlbGYsIHBhcmVudCk6CisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisgICAgICAgIHNlbGYucGFyZW50LmNhbGxzID0gW10KKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3RoZXIsICJoYW5kbGVyX29yZGVyIik6CisgICAgICAgICAgICAjIE5vIGhhbmRsZXJfb3JkZXIsIGxlYXZlIGluIG9yaWdpbmFsIG9yZGVyLiAgWXVjay4KKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZXJfb3JkZXIgPCBvdGhlci5oYW5kbGVyX29yZGVyCisKK2RlZiBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG9wZW5lciwgbWV0aF9zcGVjKToKKyAgICAiIiJDcmVhdGUgTW9ja0hhbmRsZXJzIGFuZCBhZGQgdGhlbSB0byBhbiBPcGVuZXJEaXJlY3Rvci4KKworICAgIG1ldGhfc3BlYzogbGlzdCBvZiBsaXN0cyBvZiB0dXBsZXMgYW5kIHN0cmluZ3MgZGVmaW5pbmcgbWV0aG9kcyB0byBkZWZpbmUKKyAgICBvbiBoYW5kbGVycy4gIGVnOgorCisgICAgW1siaHR0cF9lcnJvciIsICJmdHBfb3BlbiJdLCBbImh0dHBfb3BlbiJdXQorCisgICAgZGVmaW5lcyBtZXRob2RzIC5odHRwX2Vycm9yKCkgYW5kIC5mdHBfb3BlbigpIG9uIG9uZSBoYW5kbGVyLCBhbmQKKyAgICAuaHR0cF9vcGVuKCkgb24gYW5vdGhlci4gIFRoZXNlIG1ldGhvZHMganVzdCByZWNvcmQgdGhlaXIgYXJndW1lbnRzIGFuZAorICAgIHJldHVybiBOb25lLiAgVXNpbmcgYSB0dXBsZSBpbnN0ZWFkIG9mIGEgc3RyaW5nIGNhdXNlcyB0aGUgbWV0aG9kIHRvCisgICAgcGVyZm9ybSBzb21lIGFjdGlvbiAoc2VlIE1vY2tIYW5kbGVyLmhhbmRsZSgpKSwgZWc6CisKKyAgICBbWyJodHRwX2Vycm9yIl0sIFsoImh0dHBfb3BlbiIsICJyZXR1cm4gcmVxdWVzdCIpXV0KKworICAgIGRlZmluZXMgLmh0dHBfZXJyb3IoKSBvbiBvbmUgaGFuZGxlciAod2hpY2ggc2ltcGx5IHJldHVybnMgTm9uZSksIGFuZAorICAgIC5odHRwX29wZW4oKSBvbiBhbm90aGVyIGhhbmRsZXIsIHdoaWNoIHJldHVybnMgYSBSZXF1ZXN0IG9iamVjdC4KKworICAgICIiIgorICAgIGhhbmRsZXJzID0gW10KKyAgICBjb3VudCA9IDAKKyAgICBmb3IgbWV0aHMgaW4gbWV0aF9zcGVjOgorICAgICAgICBjbGFzcyBNb2NrSGFuZGxlclN1YmNsYXNzKE1vY2tIYW5kbGVyKTogcGFzcworICAgICAgICBoID0gTW9ja0hhbmRsZXJTdWJjbGFzcyhtZXRocykKKyAgICAgICAgaC5oYW5kbGVyX29yZGVyICs9IGNvdW50CisgICAgICAgIGguYWRkX3BhcmVudChvcGVuZXIpCisgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgIGhhbmRsZXJzLmFwcGVuZChoKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaCkKKyAgICByZXR1cm4gaGFuZGxlcnMKKworZGVmIGJ1aWxkX3Rlc3Rfb3BlbmVyKCpoYW5kbGVyX2luc3RhbmNlcyk6CisgICAgb3BlbmVyID0gT3BlbmVyRGlyZWN0b3IoKQorICAgIGZvciBoIGluIGhhbmRsZXJfaW5zdGFuY2VzOgorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaCkKKyAgICByZXR1cm4gb3BlbmVyCisKK2NsYXNzIE1vY2tIVFRQSGFuZGxlcih1cmxsaWIyLkJhc2VIYW5kbGVyKToKKyAgICAjIHVzZWZ1bCBmb3IgdGVzdGluZyByZWRpcmVjdGlvbnMgYW5kIGF1dGgKKyAgICAjIHNlbmRzIHN1cHBsaWVkIGhlYWRlcnMgYW5kIGNvZGUgYXMgZmlyc3QgcmVzcG9uc2UKKyAgICAjIHNlbmRzIDIwMCBPSyBhcyBzZWNvbmQgcmVzcG9uc2UKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29kZSwgaGVhZGVycyk6CisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycworICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuX2NvdW50ID0gMAorICAgICAgICBzZWxmLnJlcXVlc3RzID0gW10KKyAgICBkZWYgaHR0cF9vcGVuKHNlbGYsIHJlcSk6CisgICAgICAgIGltcG9ydCBtaW1ldG9vbHMsIGh0dHBsaWIsIGNvcHkKKyAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgc2VsZi5yZXF1ZXN0cy5hcHBlbmQoY29weS5kZWVwY29weShyZXEpKQorICAgICAgICBpZiBzZWxmLl9jb3VudCA9PSAwOgorICAgICAgICAgICAgc2VsZi5fY291bnQgPSBzZWxmLl9jb3VudCArIDEKKyAgICAgICAgICAgIG5hbWUgPSBodHRwbGliLnJlc3BvbnNlc1tzZWxmLmNvZGVdCisgICAgICAgICAgICBtc2cgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTyhzZWxmLmhlYWRlcnMpKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50LmVycm9yKAorICAgICAgICAgICAgICAgICJodHRwIiwgcmVxLCBNb2NrRmlsZSgpLCBzZWxmLmNvZGUsIG5hbWUsIG1zZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucmVxID0gcmVxCisgICAgICAgICAgICBtc2cgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTygiXHJcblxyXG4iKSkKKyAgICAgICAgICAgIHJldHVybiBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCBtc2csICIiLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCisKK2NsYXNzIE1vY2tIVFRQU0hhbmRsZXIodXJsbGliMi5BYnN0cmFjdEhUVFBIYW5kbGVyKToKKyAgICAjIFVzZWZ1bCBmb3IgdGVzdGluZyB0aGUgUHJveHktQXV0aG9yaXphdGlvbiByZXF1ZXN0IGJ5IHZlcmlmeWluZyB0aGUKKyAgICAjIHByb3BlcnRpZXMgb2YgaHR0cGNvbgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICB1cmxsaWIyLkFic3RyYWN0SFRUUEhhbmRsZXIuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5odHRwY29ubiA9IE1vY2tIVFRQQ2xhc3MoKQorCisgICAgZGVmIGh0dHBzX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbihzZWxmLmh0dHBjb25uLCByZXEpCisKK2NsYXNzIE1vY2tQYXNzd29yZE1hbmFnZXI6CisgICAgZGVmIGFkZF9wYXNzd29yZChzZWxmLCByZWFsbSwgdXJpLCB1c2VyLCBwYXNzd29yZCk6CisgICAgICAgIHNlbGYucmVhbG0gPSByZWFsbQorICAgICAgICBzZWxmLnVybCA9IHVyaQorICAgICAgICBzZWxmLnVzZXIgPSB1c2VyCisgICAgICAgIHNlbGYucGFzc3dvcmQgPSBwYXNzd29yZAorICAgIGRlZiBmaW5kX3VzZXJfcGFzc3dvcmQoc2VsZiwgcmVhbG0sIGF1dGh1cmkpOgorICAgICAgICBzZWxmLnRhcmdldF9yZWFsbSA9IHJlYWxtCisgICAgICAgIHNlbGYudGFyZ2V0X3VybCA9IGF1dGh1cmkKKyAgICAgICAgcmV0dXJuIHNlbGYudXNlciwgc2VsZi5wYXNzd29yZAorCisKK2NsYXNzIE9wZW5lckRpcmVjdG9yVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYWRkX25vbl9oYW5kbGVyKHNlbGYpOgorICAgICAgICBjbGFzcyBOb25IYW5kbGVyKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlbmVyRGlyZWN0b3IoKS5hZGRfaGFuZGxlciwgTm9uSGFuZGxlcigpKQorCisgICAgZGVmIHRlc3RfYmFkbHlfbmFtZWRfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgIyB0ZXN0IHdvcmstYXJvdW5kIGZvciB0aHJlZSBtZXRob2RzIHRoYXQgYWNjaWRlbnRhbGx5IGZvbGxvdyB0aGUKKyAgICAgICAgIyBuYW1pbmcgY29udmVudGlvbnMgZm9yIGhhbmRsZXIgbWV0aG9kcworICAgICAgICAjICgqX29wZW4oKSAvICpfcmVxdWVzdCgpIC8gKl9yZXNwb25zZSgpKQorCisgICAgICAgICMgVGhlc2UgdXNlZCB0byBjYWxsIHRoZSBhY2NpZGVudGFsbHktbmFtZWQgbWV0aG9kcywgY2F1c2luZyBhCisgICAgICAgICMgVHlwZUVycm9yIGluIHJlYWwgY29kZTsgaGVyZSwgcmV0dXJuaW5nIHNlbGYgZnJvbSB0aGVzZSBtb2NrCisgICAgICAgICMgbWV0aG9kcyB3b3VsZCBlaXRoZXIgY2F1c2Ugbm8gZXhjZXB0aW9uLCBvciBBdHRyaWJ1dGVFcnJvci4KKworICAgICAgICBmcm9tIHVybGxpYjIgaW1wb3J0IFVSTEVycm9yCisKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgbWV0aF9zcGVjID0gWworICAgICAgICAgICAgWygiZG9fb3BlbiIsICJyZXR1cm4gc2VsZiIpLCAoInByb3h5X29wZW4iLCAicmV0dXJuIHNlbGYiKV0sCisgICAgICAgICAgICBbKCJyZWRpcmVjdF9yZXF1ZXN0IiwgInJldHVybiBzZWxmIildLAorICAgICAgICAgICAgXQorICAgICAgICBoYW5kbGVycyA9IGFkZF9vcmRlcmVkX21vY2tfaGFuZGxlcnMobywgbWV0aF9zcGVjKQorICAgICAgICBvLmFkZF9oYW5kbGVyKHVybGxpYjIuVW5rbm93bkhhbmRsZXIoKSkKKyAgICAgICAgZm9yIHNjaGVtZSBpbiAiZG8iLCAicHJveHkiLCAicmVkaXJlY3QiOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVVJMRXJyb3IsIG8ub3Blbiwgc2NoZW1lKyI6Ly9leGFtcGxlLmNvbS8iKQorCisgICAgZGVmIHRlc3RfaGFuZGxlZChzZWxmKToKKyAgICAgICAgIyBoYW5kbGVyIHJldHVybmluZyBub24tTm9uZSBtZWFucyBubyBtb3JlIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkCisgICAgICAgIG8gPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIG1ldGhfc3BlYyA9IFsKKyAgICAgICAgICAgIFsiaHR0cF9vcGVuIiwgImZ0cF9vcGVuIiwgImh0dHBfZXJyb3JfMzAyIl0sCisgICAgICAgICAgICBbImZ0cF9vcGVuIl0sCisgICAgICAgICAgICBbKCJodHRwX29wZW4iLCAicmV0dXJuIHNlbGYiKV0sCisgICAgICAgICAgICBbKCJodHRwX29wZW4iLCAicmV0dXJuIHNlbGYiKV0sCisgICAgICAgICAgICBdCisgICAgICAgIGhhbmRsZXJzID0gYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycyhvLCBtZXRoX3NwZWMpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgIHIgPSBvLm9wZW4ocmVxKQorICAgICAgICAjIFNlY29uZCAuaHR0cF9vcGVuKCkgZ2V0cyBjYWxsZWQsIHRoaXJkIGRvZXNuJ3QsIHNpbmNlIHNlY29uZCByZXR1cm5lZAorICAgICAgICAjIG5vbi1Ob25lLiAgSGFuZGxlcnMgd2l0aG91dCAuaHR0cF9vcGVuKCkgbmV2ZXIgZ2V0IGFueSBtZXRob2RzIGNhbGxlZAorICAgICAgICAjIG9uIHRoZW0uCisgICAgICAgICMgSW4gZmFjdCwgc2Vjb25kIG1vY2sgaGFuZGxlciBkZWZpbmluZyAuaHR0cF9vcGVuKCkgcmV0dXJucyBzZWxmCisgICAgICAgICMgKGluc3RlYWQgb2YgcmVzcG9uc2UpLCB3aGljaCBiZWNvbWVzIHRoZSBPcGVuZXJEaXJlY3RvcidzIHJldHVybgorICAgICAgICAjIHZhbHVlLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIsIGhhbmRsZXJzWzJdKQorICAgICAgICBjYWxscyA9IFsoaGFuZGxlcnNbMF0sICJodHRwX29wZW4iKSwgKGhhbmRsZXJzWzJdLCAiaHR0cF9vcGVuIildCisgICAgICAgIGZvciBleHBlY3RlZCwgZ290IGluIHppcChjYWxscywgby5jYWxscyk6CisgICAgICAgICAgICBoYW5kbGVyLCBuYW1lLCBhcmdzLCBrd2RzID0gZ290CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoYW5kbGVyLCBuYW1lKSwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIChyZXEsKSkKKworICAgIGRlZiB0ZXN0X2hhbmRsZXJfb3JkZXIoc2VsZik6CisgICAgICAgIG8gPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIGhhbmRsZXJzID0gW10KKyAgICAgICAgZm9yIG1ldGhzLCBoYW5kbGVyX29yZGVyIGluIFsKKyAgICAgICAgICAgIChbKCJodHRwX29wZW4iLCAicmV0dXJuIHNlbGYiKV0sIDUwMCksCisgICAgICAgICAgICAoWyJodHRwX29wZW4iXSwgMCksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgY2xhc3MgTW9ja0hhbmRsZXJTdWJjbGFzcyhNb2NrSGFuZGxlcik6IHBhc3MKKyAgICAgICAgICAgIGggPSBNb2NrSGFuZGxlclN1YmNsYXNzKG1ldGhzKQorICAgICAgICAgICAgaC5oYW5kbGVyX29yZGVyID0gaGFuZGxlcl9vcmRlcgorICAgICAgICAgICAgaGFuZGxlcnMuYXBwZW5kKGgpCisgICAgICAgICAgICBvLmFkZF9oYW5kbGVyKGgpCisKKyAgICAgICAgciA9IG8ub3BlbigiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgICMgaGFuZGxlcnMgY2FsbGVkIGluIHJldmVyc2Ugb3JkZXIsIHRoYW5rcyB0byB0aGVpciBzb3J0IG9yZGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5jYWxsc1swXVswXSwgaGFuZGxlcnNbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5jYWxsc1sxXVswXSwgaGFuZGxlcnNbMF0pCisKKyAgICBkZWYgdGVzdF9yYWlzZShzZWxmKToKKyAgICAgICAgIyByYWlzaW5nIFVSTEVycm9yIHN0b3BzIHByb2Nlc3Npbmcgb2YgcmVxdWVzdAorICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBtZXRoX3NwZWMgPSBbCisgICAgICAgICAgICBbKCJodHRwX29wZW4iLCAicmFpc2UiKV0sCisgICAgICAgICAgICBbKCJodHRwX29wZW4iLCAicmV0dXJuIHNlbGYiKV0sCisgICAgICAgICAgICBdCisgICAgICAgIGhhbmRsZXJzID0gYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycyhvLCBtZXRoX3NwZWMpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYjIuVVJMRXJyb3IsIG8ub3BlbiwgcmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8uY2FsbHMsIFsoaGFuZGxlcnNbMF0sICJodHRwX29wZW4iLCAocmVxLCksIHt9KV0pCisKKyMjICAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKKyMjICAgICAgICAgIyBYWFggdGhpcyBkb2Vzbid0IGFjdHVhbGx5IHNlZW0gdG8gYmUgdXNlZCBpbiBzdGFuZGFyZCBsaWJyYXJ5LAorIyMgICAgICAgICAjICBidXQgc2hvdWxkIHJlYWxseSBiZSB0ZXN0ZWQgYW55d2F5Li4uCisKKyAgICBkZWYgdGVzdF9odHRwX2Vycm9yKHNlbGYpOgorICAgICAgICAjIFhYWCBodHRwX2Vycm9yX2RlZmF1bHQKKyAgICAgICAgIyBodHRwIGVycm9ycyBhcmUgYSBzcGVjaWFsIGNhc2UKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgbWV0aF9zcGVjID0gWworICAgICAgICAgICAgWygiaHR0cF9vcGVuIiwgImVycm9yIDMwMiIpXSwKKyAgICAgICAgICAgIFsoImh0dHBfZXJyb3JfNDAwIiwgInJhaXNlIiksICJodHRwX29wZW4iXSwKKyAgICAgICAgICAgIFsoImh0dHBfZXJyb3JfMzAyIiwgInJldHVybiByZXNwb25zZSIpLCAiaHR0cF9lcnJvcl8zMDMiLAorICAgICAgICAgICAgICJodHRwX2Vycm9yIl0sCisgICAgICAgICAgICBbKCJodHRwX2Vycm9yXzMwMiIpXSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgaGFuZGxlcnMgPSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG8sIG1ldGhfc3BlYykKKworICAgICAgICBjbGFzcyBVbmtub3duOgorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6IHJldHVybiBUcnVlCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgIHIgPSBvLm9wZW4ocmVxKQorICAgICAgICBhc3NlcnQgbGVuKG8uY2FsbHMpID09IDIKKyAgICAgICAgY2FsbHMgPSBbKGhhbmRsZXJzWzBdLCAiaHR0cF9vcGVuIiwgKHJlcSwpKSwKKyAgICAgICAgICAgICAgICAgKGhhbmRsZXJzWzJdLCAiaHR0cF9lcnJvcl8zMDIiLAorICAgICAgICAgICAgICAgICAgKHJlcSwgVW5rbm93bigpLCAzMDIsICIiLCB7fSkpXQorICAgICAgICBmb3IgZXhwZWN0ZWQsIGdvdCBpbiB6aXAoY2FsbHMsIG8uY2FsbHMpOgorICAgICAgICAgICAgaGFuZGxlciwgbWV0aG9kX25hbWUsIGFyZ3MgPSBleHBlY3RlZAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaGFuZGxlciwgbWV0aG9kX25hbWUpLCBnb3RbOjJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBnb3RbMl0pCisKKyAgICBkZWYgdGVzdF9wcm9jZXNzb3JzKHNlbGYpOgorICAgICAgICAjICpfcmVxdWVzdCAvICpfcmVzcG9uc2UgbWV0aG9kcyBnZXQgY2FsbGVkIGFwcHJvcHJpYXRlbHkKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgbWV0aF9zcGVjID0gWworICAgICAgICAgICAgWygiaHR0cF9yZXF1ZXN0IiwgInJldHVybiByZXF1ZXN0IiksCisgICAgICAgICAgICAgKCJodHRwX3Jlc3BvbnNlIiwgInJldHVybiByZXNwb25zZSIpXSwKKyAgICAgICAgICAgIFsoImh0dHBfcmVxdWVzdCIsICJyZXR1cm4gcmVxdWVzdCIpLAorICAgICAgICAgICAgICgiaHR0cF9yZXNwb25zZSIsICJyZXR1cm4gcmVzcG9uc2UiKV0sCisgICAgICAgICAgICBdCisgICAgICAgIGhhbmRsZXJzID0gYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycyhvLCBtZXRoX3NwZWMpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgIHIgPSBvLm9wZW4ocmVxKQorICAgICAgICAjIHByb2Nlc3NvciBtZXRob2RzIGFyZSBjYWxsZWQgb24gKmFsbCogaGFuZGxlcnMgdGhhdCBkZWZpbmUgdGhlbSwKKyAgICAgICAgIyBub3QganVzdCB0aGUgZmlyc3QgaGFuZGxlciB0aGF0IGhhbmRsZXMgdGhlIHJlcXVlc3QKKyAgICAgICAgY2FsbHMgPSBbCisgICAgICAgICAgICAoaGFuZGxlcnNbMF0sICJodHRwX3JlcXVlc3QiKSwgKGhhbmRsZXJzWzFdLCAiaHR0cF9yZXF1ZXN0IiksCisgICAgICAgICAgICAoaGFuZGxlcnNbMF0sICJodHRwX3Jlc3BvbnNlIiksIChoYW5kbGVyc1sxXSwgImh0dHBfcmVzcG9uc2UiKV0KKworICAgICAgICBmb3IgaSwgKGhhbmRsZXIsIG5hbWUsIGFyZ3MsIGt3ZHMpIGluIGVudW1lcmF0ZShvLmNhbGxzKToKKyAgICAgICAgICAgIGlmIGkgPCAyOgorICAgICAgICAgICAgICAgICMgKl9yZXF1ZXN0CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaGFuZGxlciwgbmFtZSksIGNhbGxzW2ldKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFyZ3MpLCAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShhcmdzWzBdLCBSZXF1ZXN0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjICpfcmVzcG9uc2UKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChoYW5kbGVyLCBuYW1lKSwgY2FsbHNbaV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYXJncyksIDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGFyZ3NbMF0sIFJlcXVlc3QpCisgICAgICAgICAgICAgICAgIyByZXNwb25zZSBmcm9tIG9wZW5lci5vcGVuIGlzIE5vbmUsIGJlY2F1c2UgdGhlcmUncyBubworICAgICAgICAgICAgICAgICMgaGFuZGxlciB0aGF0IGRlZmluZXMgaHR0cF9vcGVuIHRvIGhhbmRsZSBpdAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhcmdzWzFdIGlzIE5vbmUgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShhcmdzWzFdLCBNb2NrUmVzcG9uc2UpKQorCisKK2RlZiBzYW5lcGF0aG5hbWUydXJsKHBhdGgpOgorICAgIGltcG9ydCB1cmxsaWIKKyAgICB1cmxwYXRoID0gdXJsbGliLnBhdGhuYW1lMnVybChwYXRoKQorICAgIGlmIG9zLm5hbWUgPT0gIm50IiBhbmQgdXJscGF0aC5zdGFydHN3aXRoKCIvLy8iKToKKyAgICAgICAgdXJscGF0aCA9IHVybHBhdGhbMjpdCisgICAgIyBYWFggZG9uJ3QgYXNrIG1lIGFib3V0IHRoZSBtYWMuLi4KKyAgICByZXR1cm4gdXJscGF0aAorCitjbGFzcyBIYW5kbGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZnRwKHNlbGYpOgorICAgICAgICBjbGFzcyBNb2NrRlRQV3JhcHBlcjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKTogc2VsZi5kYXRhID0gZGF0YQorICAgICAgICAgICAgZGVmIHJldHJmaWxlKHNlbGYsIGZpbGVuYW1lLCBmaWxldHlwZSk6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgc2VsZi5maWxldHlwZSA9IGZpbGVuYW1lLCBmaWxldHlwZQorICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLmRhdGEpLCBsZW4oc2VsZi5kYXRhKQorICAgICAgICAgICAgZGVmIGNsb3NlKHNlbGYpOiBwYXNzCisKKyAgICAgICAgY2xhc3MgTnVsbEZUUEhhbmRsZXIodXJsbGliMi5GVFBIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKTogc2VsZi5kYXRhID0gZGF0YQorICAgICAgICAgICAgZGVmIGNvbm5lY3RfZnRwKHNlbGYsIHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgICAgICAgICAgc2VsZi51c2VyLCBzZWxmLnBhc3N3ZCA9IHVzZXIsIHBhc3N3ZAorICAgICAgICAgICAgICAgIHNlbGYuaG9zdCwgc2VsZi5wb3J0ID0gaG9zdCwgcG9ydAorICAgICAgICAgICAgICAgIHNlbGYuZGlycyA9IGRpcnMKKyAgICAgICAgICAgICAgICBzZWxmLmZ0cHdyYXBwZXIgPSBNb2NrRlRQV3JhcHBlcihzZWxmLmRhdGEpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZnRwd3JhcHBlcgorCisgICAgICAgIGltcG9ydCBmdHBsaWIKKyAgICAgICAgZGF0YSA9ICJyaGV1bSByaGFwb25pY3VtIgorICAgICAgICBoID0gTnVsbEZUUEhhbmRsZXIoZGF0YSkKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCisKKyAgICAgICAgZm9yIHVybCwgaG9zdCwgcG9ydCwgdXNlciwgcGFzc3dkLCB0eXBlXywgZGlycywgZmlsZW5hbWUsIG1pbWV0eXBlIGluIFsKKyAgICAgICAgICAgICgiZnRwOi8vbG9jYWxob3N0L2Zvby9iYXIvYmF6Lmh0bWwiLAorICAgICAgICAgICAgICJsb2NhbGhvc3QiLCBmdHBsaWIuRlRQX1BPUlQsICIiLCAiIiwgIkkiLAorICAgICAgICAgICAgIFsiZm9vIiwgImJhciJdLCAiYmF6Lmh0bWwiLCAidGV4dC9odG1sIiksCisgICAgICAgICAgICAoImZ0cDovL3BhcnJvdEBsb2NhbGhvc3QvZm9vL2Jhci9iYXouaHRtbCIsCisgICAgICAgICAgICAgImxvY2FsaG9zdCIsIGZ0cGxpYi5GVFBfUE9SVCwgInBhcnJvdCIsICIiLCAiSSIsCisgICAgICAgICAgICAgWyJmb28iLCAiYmFyIl0sICJiYXouaHRtbCIsICJ0ZXh0L2h0bWwiKSwKKyAgICAgICAgICAgICgiZnRwOi8vJTI1cGFycm90QGxvY2FsaG9zdC9mb28vYmFyL2Jhei5odG1sIiwKKyAgICAgICAgICAgICAibG9jYWxob3N0IiwgZnRwbGliLkZUUF9QT1JULCAiJXBhcnJvdCIsICIiLCAiSSIsCisgICAgICAgICAgICAgWyJmb28iLCAiYmFyIl0sICJiYXouaHRtbCIsICJ0ZXh0L2h0bWwiKSwKKyAgICAgICAgICAgICgiZnRwOi8vJTI1NDJwYXJyb3RAbG9jYWxob3N0L2Zvby9iYXIvYmF6Lmh0bWwiLAorICAgICAgICAgICAgICJsb2NhbGhvc3QiLCBmdHBsaWIuRlRQX1BPUlQsICIlNDJwYXJyb3QiLCAiIiwgIkkiLAorICAgICAgICAgICAgIFsiZm9vIiwgImJhciJdLCAiYmF6Lmh0bWwiLCAidGV4dC9odG1sIiksCisgICAgICAgICAgICAoImZ0cDovL2xvY2FsaG9zdDo4MC9mb28vYmFyLyIsCisgICAgICAgICAgICAgImxvY2FsaG9zdCIsIDgwLCAiIiwgIiIsICJEIiwKKyAgICAgICAgICAgICBbImZvbyIsICJiYXIiXSwgIiIsIE5vbmUpLAorICAgICAgICAgICAgKCJmdHA6Ly9sb2NhbGhvc3QvYmF6LmdpZjt0eXBlPWEiLAorICAgICAgICAgICAgICJsb2NhbGhvc3QiLCBmdHBsaWIuRlRQX1BPUlQsICIiLCAiIiwgIkEiLAorICAgICAgICAgICAgIFtdLCAiYmF6LmdpZiIsIE5vbmUpLCAgIyBYWFggcmVhbGx5IHRoaXMgc2hvdWxkIGd1ZXNzIGltYWdlL2dpZgorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsKQorICAgICAgICAgICAgcmVxLnRpbWVvdXQgPSBOb25lCisgICAgICAgICAgICByID0gaC5mdHBfb3BlbihyZXEpCisgICAgICAgICAgICAjIGZ0cCBhdXRoZW50aWNhdGlvbiBub3QgeWV0IGltcGxlbWVudGVkIGJ5IEZUUEhhbmRsZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC51c2VyLCB1c2VyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnBhc3N3ZCwgcGFzc3dkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmhvc3QsIHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3QpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnBvcnQsIHBvcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZGlycywgZGlycykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5mdHB3cmFwcGVyLmZpbGVuYW1lLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5mdHB3cmFwcGVyLmZpbGV0eXBlLCB0eXBlXykKKyAgICAgICAgICAgIGhlYWRlcnMgPSByLmluZm8oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzLmdldCgiQ29udGVudC10eXBlIiksIG1pbWV0eXBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoaGVhZGVyc1siQ29udGVudC1sZW5ndGgiXSksIGxlbihkYXRhKSkKKworICAgIGRlZiB0ZXN0X2ZpbGUoc2VsZik6CisgICAgICAgIGltcG9ydCByZmM4MjIsIHNvY2tldAorICAgICAgICBoID0gdXJsbGliMi5GaWxlSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgIFRFU1RGTiA9IHRlc3Rfc3VwcG9ydC5URVNURk4KKyAgICAgICAgdXJscGF0aCA9IHNhbmVwYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKFRFU1RGTikpCisgICAgICAgIHRvd3JpdGUgPSAiaGVsbG8sIHdvcmxkXG4iCisgICAgICAgIHVybHMgPSBbCisgICAgICAgICAgICAiZmlsZTovL2xvY2FsaG9zdCVzIiAlIHVybHBhdGgsCisgICAgICAgICAgICAiZmlsZTovLyVzIiAlIHVybHBhdGgsCisgICAgICAgICAgICAiZmlsZTovLyVzJXMiICUgKHNvY2tldC5nZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSwgdXJscGF0aCksCisgICAgICAgICAgICBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvY2FsYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICBleGNlcHQgc29ja2V0LmdhaWVycm9yOgorICAgICAgICAgICAgbG9jYWxhZGRyID0gJycKKyAgICAgICAgaWYgbG9jYWxhZGRyOgorICAgICAgICAgICAgdXJscy5hcHBlbmQoImZpbGU6Ly8lcyVzIiAlIChsb2NhbGFkZHIsIHVybHBhdGgpKQorCisgICAgICAgIGZvciB1cmwgaW4gdXJsczoKKyAgICAgICAgICAgIGYgPSBvcGVuKFRFU1RGTiwgIndiIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUodG93cml0ZSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgICAgIHIgPSBoLmZpbGVfb3BlbihSZXF1ZXN0KHVybCkpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gci5yZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IHIuaW5mbygpCisgICAgICAgICAgICAgICAgICAgIHJlc3B1cmwgPSByLmdldHVybCgpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgci5jbG9zZSgpCisgICAgICAgICAgICAgICAgc3RhdHMgPSBvcy5zdGF0KFRFU1RGTikKKyAgICAgICAgICAgICAgICBtb2RpZmllZCA9IHJmYzgyMi5mb3JtYXRkYXRlKHN0YXRzLnN0X210aW1lKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB0b3dyaXRlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWyJDb250ZW50LXR5cGUiXSwgInRleHQvcGxhaW4iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWyJDb250ZW50LWxlbmd0aCJdLCAiMTMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoZWFkZXJzWyJMYXN0LW1vZGlmaWVkIl0sIG1vZGlmaWVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwdXJsLCB1cmwpCisKKyAgICAgICAgZm9yIHVybCBpbiBbCisgICAgICAgICAgICAiZmlsZTovL2xvY2FsaG9zdDo4MCVzIiAlIHVybHBhdGgsCisgICAgICAgICAgICAiZmlsZTovLy9maWxlX2RvZXNfbm90X2V4aXN0LnR4dCIsCisgICAgICAgICAgICAiZmlsZTovLyVzOjgwJXMvJXMiICUgKHNvY2tldC5nZXRob3N0YnluYW1lKCdsb2NhbGhvc3QnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MuZ2V0Y3dkKCksIFRFU1RGTiksCisgICAgICAgICAgICAiZmlsZTovL3NvbWVyYW5kb21ob3N0Lm9udGhlaW50ZXJuZXQuY29tJXMvJXMiICUKKyAgICAgICAgICAgIChvcy5nZXRjd2QoKSwgVEVTVEZOKSwKKyAgICAgICAgICAgIF06CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAid2IiKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZi53cml0ZSh0b3dyaXRlKQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5VUkxFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmZpbGVfb3BlbiwgUmVxdWVzdCh1cmwpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoVEVTVEZOKQorCisgICAgICAgIGggPSB1cmxsaWIyLkZpbGVIYW5kbGVyKCkKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCisgICAgICAgICMgWFhYWCB3aHkgZG9lcyAvLyBtZWFuIGZ0cCAoYW5kIC8vLyBtZWFuIG5vdCBmdHAhKSwgYW5kIHdoZXJlCisgICAgICAgICMgIGlzIGZpbGU6IHNjaGVtZSBzcGVjaWZpZWQ/ICBJIHRoaW5rIHRoaXMgaXMgcmVhbGx5IGEgYnVnLCBhbmQKKyAgICAgICAgIyAgd2hhdCB3YXMgaW50ZW5kZWQgd2FzIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gVVJMcyBsaWtlOgorICAgICAgICAjIGZpbGU6L2JsYWgudHh0IChhIGZpbGUpCisgICAgICAgICMgZmlsZTovL2xvY2FsaG9zdC9ibGFoLnR4dCAoYSBmaWxlKQorICAgICAgICAjIGZpbGU6Ly8vYmxhaC50eHQgKGEgZmlsZSkKKyAgICAgICAgIyBmaWxlOi8vZnRwLmV4YW1wbGUuY29tL2JsYWgudHh0IChhbiBmdHAgVVJMKQorICAgICAgICBmb3IgdXJsLCBmdHAgaW4gWworICAgICAgICAgICAgKCJmaWxlOi8vZnRwLmV4YW1wbGUuY29tLy9mb28udHh0IiwgVHJ1ZSksCisgICAgICAgICAgICAoImZpbGU6Ly9mdHAuZXhhbXBsZS5jb20vLy9mb28udHh0IiwgRmFsc2UpLAorIyBYWFhYIGJ1ZzogZmFpbHMgd2l0aCBPU0Vycm9yLCBzaG91bGQgYmUgVVJMRXJyb3IKKyAgICAgICAgICAgICgiZmlsZTovL2Z0cC5leGFtcGxlLmNvbS9mb28udHh0IiwgRmFsc2UpLAorICAgICAgICAgICAgKCJmaWxlOi8vc29tZWhvc3QvL2Zvby9zb21ldGhpbmcudHh0IiwgVHJ1ZSksCisgICAgICAgICAgICAoImZpbGU6Ly9sb2NhbGhvc3QvL2Zvby9zb21ldGhpbmcudHh0IiwgRmFsc2UpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGguZmlsZV9vcGVuKHJlcSkKKyAgICAgICAgICAgICMgWFhYWCByZW1vdmUgT1NFcnJvciB3aGVuIGJ1ZyBmaXhlZAorICAgICAgICAgICAgZXhjZXB0ICh1cmxsaWIyLlVSTEVycm9yLCBPU0Vycm9yKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZ0cCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8ucmVxIGlzIHJlcSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS50eXBlLCAiZnRwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnR5cGUgPT0gImZ0cCIsIGZ0cCkKKworICAgIGRlZiB0ZXN0X2h0dHAoc2VsZik6CisKKyAgICAgICAgaCA9IHVybGxpYjIuQWJzdHJhY3RIVFRQSGFuZGxlcigpCisgICAgICAgIG8gPSBoLnBhcmVudCA9IE1vY2tPcGVuZXIoKQorCisgICAgICAgIHVybCA9ICJodHRwOi8vZXhhbXBsZS5jb20vIgorICAgICAgICBmb3IgbWV0aG9kLCBkYXRhIGluIFsoIkdFVCIsIE5vbmUpLCAoIlBPU1QiLCAiYmxhaCIpXToKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsLCBkYXRhLCB7IkZvbyI6ICJiYXIifSkKKyAgICAgICAgICAgIHJlcS50aW1lb3V0ID0gTm9uZQorICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJTcGFtIiwgImVnZ3MiKQorICAgICAgICAgICAgaHR0cCA9IE1vY2tIVFRQQ2xhc3MoKQorICAgICAgICAgICAgciA9IGguZG9fb3BlbihodHRwLCByZXEpCisKKyAgICAgICAgICAgICMgcmVzdWx0IGF0dHJpYnV0ZXMKKyAgICAgICAgICAgIHIucmVhZDsgci5yZWFkbGluZSAgIyB3cmFwcGVkIE1vY2tGaWxlIG1ldGhvZHMKKyAgICAgICAgICAgIHIuaW5mbzsgci5nZXR1cmwgICMgYWRkaW5mb3VybCBtZXRob2RzCisgICAgICAgICAgICByLmNvZGUsIHIubXNnID09IDIwMCwgIk9LIiAgIyBhZGRlZCBmcm9tIE1vY2tIVFRQQ2xhc3MuZ2V0cmVwbHkoKQorICAgICAgICAgICAgaGRycyA9IHIuaW5mbygpCisgICAgICAgICAgICBoZHJzLmdldDsgaGRycy5oYXNfa2V5ICAjIHIuaW5mbygpIGdpdmVzIGRpY3QgZnJvbSAuZ2V0cmVwbHkoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLmdldHVybCgpLCB1cmwpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHR0cC5ob3N0LCAiZXhhbXBsZS5jb20iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwLmxldmVsLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwLm1ldGhvZCwgbWV0aG9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwLnNlbGVjdG9yLCAiLyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHAucmVxX2hlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoIkNvbm5lY3Rpb24iLCAiY2xvc2UiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiRm9vIiwgImJhciIpLCAoIlNwYW0iLCAiZWdncyIpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaHR0cC5kYXRhLCBkYXRhKQorCisgICAgICAgICMgY2hlY2sgc29ja2V0LmVycm9yIGNvbnZlcnRlZCB0byBVUkxFcnJvcgorICAgICAgICBodHRwLnJhaXNlX29uX2VuZGhlYWRlcnMgPSBUcnVlCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYjIuVVJMRXJyb3IsIGguZG9fb3BlbiwgaHR0cCwgcmVxKQorCisgICAgICAgICMgY2hlY2sgYWRkaW5nIG9mIHN0YW5kYXJkIGhlYWRlcnMKKyAgICAgICAgby5hZGRoZWFkZXJzID0gWygiU3BhbSIsICJlZ2dzIildCisgICAgICAgIGZvciBkYXRhIGluICIiLCBOb25lOiAgIyBQT1NULCBHRVQKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHA6Ly9leGFtcGxlLmNvbS8iLCBkYXRhKQorICAgICAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIikKKyAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQorICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOiAgIyBHRVQKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJDb250ZW50LWxlbmd0aCIsIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJDb250ZW50LXR5cGUiLCByZXEudW5yZWRpcmVjdGVkX2hkcnMpCisgICAgICAgICAgICBlbHNlOiAgIyBQT1NUCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtbGVuZ3RoIl0sICIwIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC10eXBlIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgICAgICAgICAgIyBYWFggdGhlIGRldGFpbHMgb2YgSG9zdCBjb3VsZCBiZSBiZXR0ZXIgdGVzdGVkCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siSG9zdCJdLCAiZXhhbXBsZS5jb20iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIlNwYW0iXSwgImVnZ3MiKQorCisgICAgICAgICAgICAjIGRvbid0IGNsb2JiZXIgZXhpc3RpbmcgaGVhZGVycworICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJDb250ZW50LWxlbmd0aCIsICJmb28iKQorICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJDb250ZW50LXR5cGUiLCAiYmFyIikKKyAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiSG9zdCIsICJiYXoiKQorICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJTcGFtIiwgImZvbyIpCisgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LWxlbmd0aCJdLCAiZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LXR5cGUiXSwgImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siSG9zdCJdLCAiYmF6IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJTcGFtIl0sICJmb28iKQorCisgICAgZGVmIHRlc3RfaHR0cF9kb3VibGVzbGFzaChzZWxmKToKKyAgICAgICAgIyBDaGVja3MgdGhhdCB0aGUgcHJlc2VuY2Ugb2YgYW4gdW5uZWNlc3NhcnkgZG91YmxlIHNsYXNoIGluIGEgdXJsIGRvZXNuJ3QgYnJlYWsgYW55dGhpbmcKKyAgICAgICAgIyBQcmV2aW91c2x5LCBhIGRvdWJsZSBzbGFzaCBkaXJlY3RseSBhZnRlciB0aGUgaG9zdCBjb3VsZCBjYXVzZSBpbmNvcnJlY3QgcGFyc2luZyBvZiB0aGUgdXJsCisgICAgICAgIGggPSB1cmxsaWIyLkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICBkYXRhID0gIiIKKyAgICAgICAgZHNfdXJscyA9IFsKKyAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vZm9vL2Jhci9iYXouaHRtbCIsCisgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tLy9mb28vYmFyL2Jhei5odG1sIiwKKyAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vZm9vLy9iYXIvYmF6Lmh0bWwiLAorICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9mb28vYmFyLy9iYXouaHRtbCIsCisgICAgICAgIF0KKworICAgICAgICBmb3IgZHNfdXJsIGluIGRzX3VybHM6CisgICAgICAgICAgICBkc19yZXEgPSBSZXF1ZXN0KGRzX3VybCwgZGF0YSkKKworICAgICAgICAgICAgIyBDaGVjayB3aGV0aGVyIGhvc3QgaXMgZGV0ZXJtaW5lZCBjb3JyZWN0bHkgaWYgdGhlcmUgaXMgbm8gcHJveHkKKyAgICAgICAgICAgIG5wX2RzX3JlcSA9IGguZG9fcmVxdWVzdF8oZHNfcmVxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChucF9kc19yZXEudW5yZWRpcmVjdGVkX2hkcnNbIkhvc3QiXSwiZXhhbXBsZS5jb20iKQorCisgICAgICAgICAgICAjIENoZWNrIHdoZXRoZXIgaG9zdCBpcyBkZXRlcm1pbmVkIGNvcnJlY3RseSBpZiB0aGVyZSBpcyBhIHByb3h5CisgICAgICAgICAgICBkc19yZXEuc2V0X3Byb3h5KCJzb21lcHJveHk6MzEyOCIsTm9uZSkKKyAgICAgICAgICAgIHBfZHNfcmVxID0gaC5kb19yZXF1ZXN0Xyhkc19yZXEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBfZHNfcmVxLnVucmVkaXJlY3RlZF9oZHJzWyJIb3N0Il0sImV4YW1wbGUuY29tIikKKworICAgIGRlZiB0ZXN0X2ZpeHBhdGhfaW5fd2VpcmR1cmxzKHNlbGYpOgorICAgICAgICAjIElzc3VlNDQ5MzogdXJsbGliMiB0byBzdXBwbHkgJy8nIHdoZW4gdG8gdXJscyB3aGVyZSBwYXRoIGRvZXMgbm90CisgICAgICAgICMgc3RhcnQgd2l0aCcvJworCisgICAgICAgIGggPSB1cmxsaWIyLkFic3RyYWN0SFRUUEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICB3ZWlyZF91cmwgPSAnaHR0cDovL3d3dy5weXRob24ub3JnP2dldHNwYW0nCisgICAgICAgIHJlcSA9IFJlcXVlc3Qod2VpcmRfdXJsKQorICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdyZXEuZ2V0X2hvc3QoKSwnd3d3LnB5dGhvbi5vcmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfc2VsZWN0b3IoKSwnLz9nZXRzcGFtJykKKworICAgICAgICB1cmxfd2l0aG91dF9wYXRoID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZycKKyAgICAgICAgcmVxID0gUmVxdWVzdCh1cmxfd2l0aG91dF9wYXRoKQorICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdyZXEuZ2V0X2hvc3QoKSwnd3d3LnB5dGhvbi5vcmcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld3JlcS5nZXRfc2VsZWN0b3IoKSwnJykKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgaCA9IHVybGxpYjIuSFRUUEVycm9yUHJvY2Vzc29yKCkKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCisKKyAgICAgICAgdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS8iCisgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsKQorICAgICAgICAjIGFsbCAyeHggYXJlIHBhc3NlZCB0aHJvdWdoCisgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCB7fSwgIiIsIHVybCkKKyAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyIGlzIG5ld3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCisgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAyLCAiQWNjZXB0ZWQiLCB7fSwgIiIsIHVybCkKKyAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyIGlzIG5ld3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCisgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjA2LCAiUGFydGlhbCBjb250ZW50Iiwge30sICIiLCB1cmwpCisgICAgICAgIG5ld3IgPSBoLmh0dHBfcmVzcG9uc2UocmVxLCByKQorICAgICAgICBzZWxmLmFzc2VydFRydWUociBpcyBuZXdyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIobywgInByb3RvIikpICAjIG8uZXJyb3Igbm90IGNhbGxlZAorICAgICAgICAjIGFueXRoaW5nIGVsc2UgY2FsbHMgby5lcnJvciAoYW5kIE1vY2tPcGVuZXIgcmV0dXJucyBOb25lLCBoZXJlKQorICAgICAgICByID0gTW9ja1Jlc3BvbnNlKDUwMiwgIkJhZCBnYXRld2F5Iiwge30sICIiLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLmh0dHBfcmVzcG9uc2UocmVxLCByKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucHJvdG8sICJodHRwIikgICMgby5lcnJvciBjYWxsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmFyZ3MsIChyZXEsIHIsIDUwMiwgIkJhZCBnYXRld2F5Iiwge30pKQorCisgICAgZGVmIHRlc3RfY29va2llcyhzZWxmKToKKyAgICAgICAgY2ogPSBNb2NrQ29va2llSmFyKCkKKyAgICAgICAgaCA9IHVybGxpYjIuSFRUUENvb2tpZVByb2Nlc3NvcihjaikKKyAgICAgICAgbyA9IGgucGFyZW50ID0gTW9ja09wZW5lcigpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2V4YW1wbGUuY29tLyIpCisgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCB7fSwgIiIpCisgICAgICAgIG5ld3JlcSA9IGguaHR0cF9yZXF1ZXN0KHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNqLmFjaF9yZXEgaXMgcmVxIGlzIG5ld3JlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X29yaWdpbl9yZXFfaG9zdCgpLCAiZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlcS5pc191bnZlcmlmaWFibGUoKSkKKyAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjai5lY19yZXEgaXMgcmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2ouZWNfciBpcyByIGlzIG5ld3IpCisKKyAgICBkZWYgdGVzdF9yZWRpcmVjdChzZWxmKToKKyAgICAgICAgZnJvbV91cmwgPSAiaHR0cDovL2V4YW1wbGUuY29tL2EuaHRtbCIKKyAgICAgICAgdG9fdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS9iLmh0bWwiCisgICAgICAgIGggPSB1cmxsaWIyLkhUVFBSZWRpcmVjdEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKworICAgICAgICAjIG9yZGluYXJ5IHJlZGlyZWN0IGJlaGF2aW91cgorICAgICAgICBmb3IgY29kZSBpbiAzMDEsIDMwMiwgMzAzLCAzMDc6CisgICAgICAgICAgICBmb3IgZGF0YSBpbiBOb25lLCAiYmxhaFxuYmxhaFxuIjoKKyAgICAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKGgsICJodHRwX2Vycm9yXyVzIiAlIGNvZGUpCisgICAgICAgICAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCwgZGF0YSkKKyAgICAgICAgICAgICAgICByZXEuYWRkX2hlYWRlcigiTm9uc2Vuc2UiLCAidmlraW5nPXdpdGhob2xkIikKKyAgICAgICAgICAgICAgICByZXEudGltZW91dCA9IHNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVAorICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCJDb250ZW50LUxlbmd0aCIsIHN0cihsZW4oZGF0YSkpKQorICAgICAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigiU3BhbSIsICJzcGFtIikKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZChyZXEsIE1vY2tGaWxlKCksIGNvZGUsICJCbGFoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tIZWFkZXJzKHsibG9jYXRpb24iOiB0b191cmx9KSkKKyAgICAgICAgICAgICAgICBleGNlcHQgdXJsbGliMi5IVFRQRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgMzA3IGluIHJlc3BvbnNlIHRvIFBPU1QgcmVxdWlyZXMgdXNlciBPSworICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY29kZSA9PSAzMDcgYW5kIGRhdGEgaXMgbm90IE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLnJlcS5nZXRfZnVsbF91cmwoKSwgdG9fdXJsKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLnJlcS5nZXRfbWV0aG9kKCksICJHRVQiKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvLnJlcS5oYXNfZGF0YSgpKQorCisgICAgICAgICAgICAgICAgIyBub3cgaXQncyBhIEdFVCwgdGhlcmUgc2hvdWxkIG5vdCBiZSBoZWFkZXJzIHJlZ2FyZGluZyBjb250ZW50CisgICAgICAgICAgICAgICAgIyAocG9zc2libHkgZHJhZ2dlZCBmcm9tIGJlZm9yZSBiZWluZyBhIFBPU1QpCisgICAgICAgICAgICAgICAgaGVhZGVycyA9IFt4Lmxvd2VyKCkgZm9yIHggaW4gby5yZXEuaGVhZGVyc10KKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKCJjb250ZW50LWxlbmd0aCIsIGhlYWRlcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbigiY29udGVudC10eXBlIiwgaGVhZGVycykKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5yZXEuaGVhZGVyc1siTm9uc2Vuc2UiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWtpbmc9d2l0aGhvbGQiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIlNwYW0iLCBvLnJlcS5oZWFkZXJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oIlNwYW0iLCBvLnJlcS51bnJlZGlyZWN0ZWRfaGRycykKKworICAgICAgICAjIGxvb3AgZGV0ZWN0aW9uCisgICAgICAgIHJlcSA9IFJlcXVlc3QoZnJvbV91cmwpCisgICAgICAgIHJlcS50aW1lb3V0ID0gc29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUCisgICAgICAgIGRlZiByZWRpcmVjdChoLCByZXEsIHVybD10b191cmwpOgorICAgICAgICAgICAgaC5odHRwX2Vycm9yXzMwMihyZXEsIE1vY2tGaWxlKCksIDMwMiwgIkJsYWgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2NrSGVhZGVycyh7ImxvY2F0aW9uIjogdXJsfSkpCisgICAgICAgICMgTm90ZSB0aGF0IHRoZSAqb3JpZ2luYWwqIHJlcXVlc3Qgc2hhcmVzIHRoZSBzYW1lIHJlY29yZCBvZgorICAgICAgICAjIHJlZGlyZWN0aW9ucyB3aXRoIHRoZSBzdWItcmVxdWVzdHMgY2F1c2VkIGJ5IHRoZSByZWRpcmVjdGlvbnMuCisKKyAgICAgICAgIyBkZXRlY3QgaW5maW5pdGUgbG9vcCByZWRpcmVjdCBvZiBhIFVSTCB0byBpdHNlbGYKKyAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCwgb3JpZ2luX3JlcV9ob3N0PSJleGFtcGxlLmNvbSIpCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICByZXEudGltZW91dCA9IHNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVAorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIHJlZGlyZWN0KGgsIHJlcSwgImh0dHA6Ly9leGFtcGxlLmNvbS8iKQorICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvcjoKKyAgICAgICAgICAgICMgZG9uJ3Qgc3RvcCB1bnRpbCBtYXhfcmVwZWF0cywgYmVjYXVzZSBjb29raWVzIG1heSBpbnRyb2R1Y2Ugc3RhdGUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIHVybGxpYjIuSFRUUFJlZGlyZWN0SGFuZGxlci5tYXhfcmVwZWF0cykKKworICAgICAgICAjIGRldGVjdCBlbmRsZXNzIG5vbi1yZXBlYXRpbmcgY2hhaW4gb2YgcmVkaXJlY3RzCisgICAgICAgIHJlcSA9IFJlcXVlc3QoZnJvbV91cmwsIG9yaWdpbl9yZXFfaG9zdD0iZXhhbXBsZS5jb20iKQorICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgcmVxLnRpbWVvdXQgPSBzb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgICAgICByZWRpcmVjdChoLCByZXEsICJodHRwOi8vZXhhbXBsZS5jb20vJWQiICUgY291bnQpCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliMi5IVFRQUmVkaXJlY3RIYW5kbGVyLm1heF9yZWRpcmVjdGlvbnMpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX3JlZGlyZWN0KHNlbGYpOgorICAgICAgICBmcm9tX3VybCA9ICJodHRwOi8vZXhhbXBsZS5jb20vYS5odG1sIgorICAgICAgICB2YWxpZF9zY2hlbWVzID0gWydodHRwJywgJ2h0dHBzJywgJ2Z0cCddCisgICAgICAgIGludmFsaWRfc2NoZW1lcyA9IFsnZmlsZScsICdpbWFwJywgJ2xkYXAnXQorICAgICAgICBzY2hlbWVsZXNzX3VybCA9ICJleGFtcGxlLmNvbS9iLmh0bWwiCisgICAgICAgIGggPSB1cmxsaWIyLkhUVFBSZWRpcmVjdEhhbmRsZXIoKQorICAgICAgICBvID0gaC5wYXJlbnQgPSBNb2NrT3BlbmVyKCkKKyAgICAgICAgcmVxID0gUmVxdWVzdChmcm9tX3VybCkKKyAgICAgICAgcmVxLnRpbWVvdXQgPSBzb2NrZXQuX0dMT0JBTF9ERUZBVUxUX1RJTUVPVVQKKworICAgICAgICBmb3Igc2NoZW1lIGluIGludmFsaWRfc2NoZW1lczoKKyAgICAgICAgICAgIGludmFsaWRfdXJsID0gc2NoZW1lICsgJzovLycgKyBzY2hlbWVsZXNzX3VybAorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5IVFRQRXJyb3IsIGguaHR0cF9lcnJvcl8zMDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEsIE1vY2tGaWxlKCksIDMwMiwgIlNlY3VyaXR5IExvb3Bob2xlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tIZWFkZXJzKHsibG9jYXRpb24iOiBpbnZhbGlkX3VybH0pKQorCisgICAgICAgIGZvciBzY2hlbWUgaW4gdmFsaWRfc2NoZW1lczoKKyAgICAgICAgICAgIHZhbGlkX3VybCA9IHNjaGVtZSArICc6Ly8nICsgc2NoZW1lbGVzc191cmwKKyAgICAgICAgICAgIGguaHR0cF9lcnJvcl8zMDIocmVxLCBNb2NrRmlsZSgpLCAzMDIsICJUaGF0J3MgZmluZSIsCisgICAgICAgICAgICAgICAgTW9ja0hlYWRlcnMoeyJsb2NhdGlvbiI6IHZhbGlkX3VybH0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLnJlcS5nZXRfZnVsbF91cmwoKSwgdmFsaWRfdXJsKQorCisgICAgZGVmIHRlc3RfY29va2llX3JlZGlyZWN0KHNlbGYpOgorICAgICAgICAjIGNvb2tpZXMgc2hvdWxkbid0IGxlYWsgaW50byByZWRpcmVjdGVkIHJlcXVlc3RzCisgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBDb29raWVKYXIKKworICAgICAgICBmcm9tIHRlc3QudGVzdF9jb29raWVsaWIgaW1wb3J0IGludGVyYWN0X25ldHNjYXBlCisKKyAgICAgICAgY2ogPSBDb29raWVKYXIoKQorICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjaiwgImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIiwgInNwYW09ZWdncyIpCisgICAgICAgIGhoID0gTW9ja0hUVFBIYW5kbGVyKDMwMiwgIkxvY2F0aW9uOiBodHRwOi8vd3d3LmNyYWNrZXIuY29tL1xyXG5cclxuIikKKyAgICAgICAgaGRlaCA9IHVybGxpYjIuSFRUUERlZmF1bHRFcnJvckhhbmRsZXIoKQorICAgICAgICBocmggPSB1cmxsaWIyLkhUVFBSZWRpcmVjdEhhbmRsZXIoKQorICAgICAgICBjcCA9IHVybGxpYjIuSFRUUENvb2tpZVByb2Nlc3NvcihjaikKKyAgICAgICAgbyA9IGJ1aWxkX3Rlc3Rfb3BlbmVyKGhoLCBoZGVoLCBocmgsIGNwKQorICAgICAgICBvLm9wZW4oImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoaC5yZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisKKyAgICBkZWYgdGVzdF9yZWRpcmVjdF9mcmFnbWVudChzZWxmKToKKyAgICAgICAgcmVkaXJlY3RlZF91cmwgPSAnaHR0cDovL3d3dy5leGFtcGxlLmNvbS9pbmRleC5odG1sI09LXHJcblxyXG4nCisgICAgICAgIGhoID0gTW9ja0hUVFBIYW5kbGVyKDMwMiwgJ0xvY2F0aW9uOiAnICsgcmVkaXJlY3RlZF91cmwpCisgICAgICAgIGhkZWggPSB1cmxsaWIyLkhUVFBEZWZhdWx0RXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaHJoID0gdXJsbGliMi5IVFRQUmVkaXJlY3RIYW5kbGVyKCkKKyAgICAgICAgbyA9IGJ1aWxkX3Rlc3Rfb3BlbmVyKGhoLCBoZGVoLCBocmgpCisgICAgICAgIGZwID0gby5vcGVuKCdodHRwOi8vd3d3LmV4YW1wbGUuY29tJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcC5nZXR1cmwoKSwgcmVkaXJlY3RlZF91cmwuc3RyaXAoKSkKKworICAgIGRlZiB0ZXN0X3Byb3h5KHNlbGYpOgorICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBwaCA9IHVybGxpYjIuUHJveHlIYW5kbGVyKGRpY3QoaHR0cD0icHJveHkuZXhhbXBsZS5jb206MzEyOCIpKQorICAgICAgICBvLmFkZF9oYW5kbGVyKHBoKQorICAgICAgICBtZXRoX3NwZWMgPSBbCisgICAgICAgICAgICBbKCJodHRwX29wZW4iLCAicmV0dXJuIHJlc3BvbnNlIildCisgICAgICAgICAgICBdCisgICAgICAgIGhhbmRsZXJzID0gYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycyhvLCBtZXRoX3NwZWMpCisKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgImFjbWUuZXhhbXBsZS5jb20iKQorICAgICAgICByID0gby5vcGVuKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInByb3h5LmV4YW1wbGUuY29tOjMxMjgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWyhoYW5kbGVyc1swXSwgImh0dHBfb3BlbiIpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBbdHVwWzA6Ml0gZm9yIHR1cCBpbiBvLmNhbGxzXSkKKworICAgIGRlZiB0ZXN0X3Byb3h5X25vX3Byb3h5KHNlbGYpOgorICAgICAgICBvcy5lbnZpcm9uWydub19wcm94eSddID0gJ3B5dGhvbi5vcmcnCisgICAgICAgIG8gPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBoID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoZGljdChodHRwPSJwcm94eS5leGFtcGxlLmNvbSIpKQorICAgICAgICBvLmFkZF9oYW5kbGVyKHBoKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnBlcmwub3JnLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9ob3N0KCksICJ3d3cucGVybC5vcmciKQorICAgICAgICByID0gby5vcGVuKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInByb3h5LmV4YW1wbGUuY29tIikKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5weXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInd3dy5weXRob24ub3JnIikKKyAgICAgICAgciA9IG8ub3BlbihyZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9ob3N0KCksICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIGRlbCBvcy5lbnZpcm9uWydub19wcm94eSddCisKKworICAgIGRlZiB0ZXN0X3Byb3h5X2h0dHBzKHNlbGYpOgorICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBwaCA9IHVybGxpYjIuUHJveHlIYW5kbGVyKGRpY3QoaHR0cHM9J3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKSkKKyAgICAgICAgby5hZGRfaGFuZGxlcihwaCkKKyAgICAgICAgbWV0aF9zcGVjID0gWworICAgICAgICAgICAgWygiaHR0cHNfb3BlbiIsInJldHVybiByZXNwb25zZSIpXQorICAgICAgICBdCisgICAgICAgIGhhbmRsZXJzID0gYWRkX29yZGVyZWRfbW9ja19oYW5kbGVycyhvLCBtZXRoX3NwZWMpCisgICAgICAgIHJlcSA9IFJlcXVlc3QoImh0dHBzOi8vd3d3LmV4YW1wbGUuY29tLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9ob3N0KCksICJ3d3cuZXhhbXBsZS5jb20iKQorICAgICAgICByID0gby5vcGVuKHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hvc3QoKSwgInByb3h5LmV4YW1wbGUuY29tOjMxMjgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFsoaGFuZGxlcnNbMF0sICJodHRwc19vcGVuIildLAorICAgICAgICAgICAgICAgICAgICAgICAgIFt0dXBbMDoyXSBmb3IgdHVwIGluIG8uY2FsbHNdKQorCisgICAgZGVmIHRlc3RfcHJveHlfaHR0cHNfcHJveHlfYXV0aG9yaXphdGlvbihzZWxmKToKKyAgICAgICAgbyA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGggPSB1cmxsaWIyLlByb3h5SGFuZGxlcihkaWN0KGh0dHBzPSdwcm94eS5leGFtcGxlLmNvbTozMTI4JykpCisgICAgICAgIG8uYWRkX2hhbmRsZXIocGgpCisgICAgICAgIGh0dHBzX2hhbmRsZXIgPSBNb2NrSFRUUFNIYW5kbGVyKCkKKyAgICAgICAgby5hZGRfaGFuZGxlcihodHRwc19oYW5kbGVyKQorICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwczovL3d3dy5leGFtcGxlLmNvbS8iKQorICAgICAgICByZXEuYWRkX2hlYWRlcigiUHJveHktQXV0aG9yaXphdGlvbiIsIkZvb0JhciIpCisgICAgICAgIHJlcS5hZGRfaGVhZGVyKCJVc2VyLUFnZW50IiwiR3JhaWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAid3d3LmV4YW1wbGUuY29tIikKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVxLl90dW5uZWxfaG9zdCkKKyAgICAgICAgciA9IG8ub3BlbihyZXEpCisgICAgICAgICMgVmVyaWZ5IFByb3h5LUF1dGhvcml6YXRpb24gZ2V0cyB0dW5uZWxlZCB0byByZXF1ZXN0LgorICAgICAgICAjIGh0dHBzY29ubiByZXFfaGVhZGVycyBkbyBub3QgaGF2ZSB0aGUgUHJveHktQXV0aG9yaXphdGlvbiBoZWFkZXIgYnV0CisgICAgICAgICMgdGhlIHJlcSB3aWxsIGhhdmUuCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oKCJQcm94eS1BdXRob3JpemF0aW9uIiwiRm9vQmFyIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHNfaGFuZGxlci5odHRwY29ubi5yZXFfaGVhZGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRJbigoIlVzZXItQWdlbnQiLCJHcmFpbCIpLAorICAgICAgICAgICAgICAgICAgICAgIGh0dHBzX2hhbmRsZXIuaHR0cGNvbm4ucmVxX2hlYWRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3ROb25lKHJlcS5fdHVubmVsX2hvc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF9ob3N0KCksICJwcm94eS5leGFtcGxlLmNvbTozMTI4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZ2V0X2hlYWRlcigiUHJveHktYXV0aG9yaXphdGlvbiIpLCJGb29CYXIiKQorCisgICAgZGVmIHRlc3RfYmFzaWNfYXV0aChzZWxmLCBxdW90ZV9jaGFyPSciJyk6CisgICAgICAgIG9wZW5lciA9IE9wZW5lckRpcmVjdG9yKCkKKyAgICAgICAgcGFzc3dvcmRfbWFuYWdlciA9IE1vY2tQYXNzd29yZE1hbmFnZXIoKQorICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLkhUVFBCYXNpY0F1dGhIYW5kbGVyKHBhc3N3b3JkX21hbmFnZXIpCisgICAgICAgIHJlYWxtID0gIkFDTUUgV2lkZ2V0IFN0b3JlIgorICAgICAgICBodHRwX2hhbmRsZXIgPSBNb2NrSFRUUEhhbmRsZXIoCisgICAgICAgICAgICA0MDEsICdXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0lcyVzJXNcclxuXHJcbicgJQorICAgICAgICAgICAgKHF1b3RlX2NoYXIsIHJlYWxtLCBxdW90ZV9jaGFyKSApCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihhdXRoX2hhbmRsZXIpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihodHRwX2hhbmRsZXIpCisgICAgICAgIHNlbGYuX3Rlc3RfYmFzaWNfYXV0aChvcGVuZXIsIGF1dGhfaGFuZGxlciwgIkF1dGhvcml6YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS9wcm90ZWN0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tL3Byb3RlY3RlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisgICAgZGVmIHRlc3RfYmFzaWNfYXV0aF93aXRoX3NpbmdsZV9xdW90ZWRfcmVhbG0oc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9iYXNpY19hdXRoKHF1b3RlX2NoYXI9IiciKQorCisgICAgZGVmIHRlc3RfYmFzaWNfYXV0aF93aXRoX3VucXVvdGVkX3JlYWxtKHNlbGYpOgorICAgICAgICBvcGVuZXIgPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBhc3N3b3JkX21hbmFnZXIgPSBNb2NrUGFzc3dvcmRNYW5hZ2VyKCkKKyAgICAgICAgYXV0aF9oYW5kbGVyID0gdXJsbGliMi5IVFRQQmFzaWNBdXRoSGFuZGxlcihwYXNzd29yZF9tYW5hZ2VyKQorICAgICAgICByZWFsbSA9ICJBQ01FIFdpZGdldCBTdG9yZSIKKyAgICAgICAgaHR0cF9oYW5kbGVyID0gTW9ja0hUVFBIYW5kbGVyKAorICAgICAgICAgICAgNDAxLCAnV1dXLUF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09JXNcclxuXHJcbicgJSByZWFsbSkKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGF1dGhfaGFuZGxlcikKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGh0dHBfaGFuZGxlcikKKyAgICAgICAgbXNnID0gIkJhc2ljIEF1dGggUmVhbG0gd2FzIHVucXVvdGVkIgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygobXNnLCBVc2VyV2FybmluZykpOgorICAgICAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYXV0aF9oYW5kbGVyLCAiQXV0aG9yaXphdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhbG0sIGh0dHBfaGFuZGxlciwgcGFzc3dvcmRfbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vcHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vcHJvdGVjdGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdF9wcm94eV9iYXNpY19hdXRoKHNlbGYpOgorICAgICAgICBvcGVuZXIgPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBoID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoZGljdChodHRwPSJwcm94eS5leGFtcGxlLmNvbTozMTI4IikpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihwaCkKKyAgICAgICAgcGFzc3dvcmRfbWFuYWdlciA9IE1vY2tQYXNzd29yZE1hbmFnZXIoKQorICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLlByb3h5QmFzaWNBdXRoSGFuZGxlcihwYXNzd29yZF9tYW5hZ2VyKQorICAgICAgICByZWFsbSA9ICJBQ01FIE5ldHdvcmtzIgorICAgICAgICBodHRwX2hhbmRsZXIgPSBNb2NrSFRUUEhhbmRsZXIoCisgICAgICAgICAgICA0MDcsICdQcm94eS1BdXRoZW50aWNhdGU6IEJhc2ljIHJlYWxtPSIlcyJcclxuXHJcbicgJSByZWFsbSkKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGF1dGhfaGFuZGxlcikKKyAgICAgICAgb3BlbmVyLmFkZF9oYW5kbGVyKGh0dHBfaGFuZGxlcikKKyAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYXV0aF9oYW5kbGVyLCAiUHJveHktYXV0aG9yaXphdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbSwgaHR0cF9oYW5kbGVyLCBwYXNzd29yZF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tOjMxMjgvcHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm94eS5leGFtcGxlLmNvbTozMTI4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0X2Jhc2ljX2FuZF9kaWdlc3RfYXV0aF9oYW5kbGVycyhzZWxmKToKKyAgICAgICAgIyBIVFRQRGlnZXN0QXV0aEhhbmRsZXIgcmFpc2VkIGFuIGV4Y2VwdGlvbiBpZiBpdCBjb3VsZG4ndCBoYW5kbGUgYSA0MCoKKyAgICAgICAgIyByZXNwb25zZSAoaHR0cDovL3B5dGhvbi5vcmcvc2YvMTQ3OTMwMiksIHdoZXJlIGl0IHNob3VsZCBpbnN0ZWFkCisgICAgICAgICMgcmV0dXJuIE5vbmUgdG8gYWxsb3cgYW5vdGhlciBoYW5kbGVyIChlc3BlY2lhbGx5CisgICAgICAgICMgSFRUUEJhc2ljQXV0aEhhbmRsZXIpIHRvIGhhbmRsZSB0aGUgcmVzcG9uc2UuCisKKyAgICAgICAgIyBBbHNvIChodHRwOi8vcHl0aG9uLm9yZy9zZi8xNDc5NzAyNywgUkZDIDI2MTcgc2VjdGlvbiAxLjIpLCB3ZSBtdXN0CisgICAgICAgICMgdHJ5IGRpZ2VzdCBmaXJzdCAoc2luY2UgaXQncyB0aGUgc3Ryb25nZXN0IGF1dGggc2NoZW1lKSwgc28gd2UgcmVjb3JkCisgICAgICAgICMgb3JkZXIgb2YgY2FsbHMgaGVyZSB0byBjaGVjayBkaWdlc3QgY29tZXMgZmlyc3Q6CisgICAgICAgIGNsYXNzIFJlY29yZGluZ09wZW5lckRpcmVjdG9yKE9wZW5lckRpcmVjdG9yKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBPcGVuZXJEaXJlY3Rvci5fX2luaXRfXyhzZWxmKQorICAgICAgICAgICAgICAgIHNlbGYucmVjb3JkZWQgPSBbXQorICAgICAgICAgICAgZGVmIHJlY29yZChzZWxmLCBpbmZvKToKKyAgICAgICAgICAgICAgICBzZWxmLnJlY29yZGVkLmFwcGVuZChpbmZvKQorICAgICAgICBjbGFzcyBUZXN0RGlnZXN0QXV0aEhhbmRsZXIodXJsbGliMi5IVFRQRGlnZXN0QXV0aEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGh0dHBfZXJyb3JfNDAxKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJlY29yZCgiZGlnZXN0IikKKyAgICAgICAgICAgICAgICB1cmxsaWIyLkhUVFBEaWdlc3RBdXRoSGFuZGxlci5odHRwX2Vycm9yXzQwMShzZWxmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3ZHMpCisgICAgICAgIGNsYXNzIFRlc3RCYXNpY0F1dGhIYW5kbGVyKHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIpOgorICAgICAgICAgICAgZGVmIGh0dHBfZXJyb3JfNDAxKHNlbGYsICphcmdzLCAqKmt3ZHMpOgorICAgICAgICAgICAgICAgIHNlbGYucGFyZW50LnJlY29yZCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIuaHR0cF9lcnJvcl80MDEoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3ZHMpCisKKyAgICAgICAgb3BlbmVyID0gUmVjb3JkaW5nT3BlbmVyRGlyZWN0b3IoKQorICAgICAgICBwYXNzd29yZF9tYW5hZ2VyID0gTW9ja1Bhc3N3b3JkTWFuYWdlcigpCisgICAgICAgIGRpZ2VzdF9oYW5kbGVyID0gVGVzdERpZ2VzdEF1dGhIYW5kbGVyKHBhc3N3b3JkX21hbmFnZXIpCisgICAgICAgIGJhc2ljX2hhbmRsZXIgPSBUZXN0QmFzaWNBdXRoSGFuZGxlcihwYXNzd29yZF9tYW5hZ2VyKQorICAgICAgICByZWFsbSA9ICJBQ01FIE5ldHdvcmtzIgorICAgICAgICBodHRwX2hhbmRsZXIgPSBNb2NrSFRUUEhhbmRsZXIoCisgICAgICAgICAgICA0MDEsICdXV1ctQXV0aGVudGljYXRlOiBCYXNpYyByZWFsbT0iJXMiXHJcblxyXG4nICUgcmVhbG0pCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihiYXNpY19oYW5kbGVyKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoZGlnZXN0X2hhbmRsZXIpCisgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihodHRwX2hhbmRsZXIpCisKKyAgICAgICAgIyBjaGVjayBiYXNpYyBhdXRoIGlzbid0IGJsb2NrZWQgYnkgZGlnZXN0IGhhbmRsZXIgZmFpbGluZworICAgICAgICBzZWxmLl90ZXN0X2Jhc2ljX2F1dGgob3BlbmVyLCBiYXNpY19oYW5kbGVyLCAiQXV0aG9yaXphdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbSwgaHR0cF9oYW5kbGVyLCBwYXNzd29yZF9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tL3Byb3RlY3RlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vcHJvdGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgIyBjaGVjayBkaWdlc3Qgd2FzIHRyaWVkIGJlZm9yZSBiYXNpYyAodHdpY2UsIGJlY2F1c2UKKyAgICAgICAgIyBfdGVzdF9iYXNpY19hdXRoIGNhbGxlZCAub3BlbigpIHR3aWNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZW5lci5yZWNvcmRlZCwgWyJkaWdlc3QiLCAiYmFzaWMiXSoyKQorCisgICAgZGVmIF90ZXN0X2Jhc2ljX2F1dGgoc2VsZiwgb3BlbmVyLCBhdXRoX2hhbmRsZXIsIGF1dGhfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxtLCBodHRwX2hhbmRsZXIsIHBhc3N3b3JkX21hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdF91cmwsIHByb3RlY3RlZF91cmwpOgorICAgICAgICBpbXBvcnQgYmFzZTY0CisgICAgICAgIHVzZXIsIHBhc3N3b3JkID0gIndpbGUiLCAiY295b3RlIgorCisgICAgICAgICMgLmFkZF9wYXNzd29yZCgpIGZlZCB0aHJvdWdoIHRvIHBhc3N3b3JkIG1hbmFnZXIKKyAgICAgICAgYXV0aF9oYW5kbGVyLmFkZF9wYXNzd29yZChyZWFsbSwgcmVxdWVzdF91cmwsIHVzZXIsIHBhc3N3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxtLCBwYXNzd29yZF9tYW5hZ2VyLnJlYWxtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcXVlc3RfdXJsLCBwYXNzd29yZF9tYW5hZ2VyLnVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1c2VyLCBwYXNzd29yZF9tYW5hZ2VyLnVzZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFzc3dvcmQsIHBhc3N3b3JkX21hbmFnZXIucGFzc3dvcmQpCisKKyAgICAgICAgciA9IG9wZW5lci5vcGVuKHJlcXVlc3RfdXJsKQorCisgICAgICAgICMgc2hvdWxkIGhhdmUgYXNrZWQgdGhlIHBhc3N3b3JkIG1hbmFnZXIgZm9yIHRoZSB1c2VybmFtZS9wYXNzd29yZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhc3N3b3JkX21hbmFnZXIudGFyZ2V0X3JlYWxtLCByZWFsbSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXNzd29yZF9tYW5hZ2VyLnRhcmdldF91cmwsIHByb3RlY3RlZF91cmwpCisKKyAgICAgICAgIyBleHBlY3Qgb25lIHJlcXVlc3Qgd2l0aG91dCBhdXRob3JpemF0aW9uLCB0aGVuIG9uZSB3aXRoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGh0dHBfaGFuZGxlci5yZXF1ZXN0cyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaHR0cF9oYW5kbGVyLnJlcXVlc3RzWzBdLmhhc19oZWFkZXIoYXV0aF9oZWFkZXIpKQorICAgICAgICB1c2VycGFzcyA9ICclczolcycgJSAodXNlciwgcGFzc3dvcmQpCisgICAgICAgIGF1dGhfaGRyX3ZhbHVlID0gJ0Jhc2ljICcrYmFzZTY0LmVuY29kZXN0cmluZyh1c2VycGFzcykuc3RyaXAoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGh0dHBfaGFuZGxlci5yZXF1ZXN0c1sxXS5nZXRfaGVhZGVyKGF1dGhfaGVhZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoX2hkcl92YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChodHRwX2hhbmRsZXIucmVxdWVzdHNbMV0udW5yZWRpcmVjdGVkX2hkcnNbYXV0aF9oZWFkZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhfaGRyX3ZhbHVlKQorICAgICAgICAjIGlmIHRoZSBwYXNzd29yZCBtYW5hZ2VyIGNhbid0IGZpbmQgYSBwYXNzd29yZCwgdGhlIGhhbmRsZXIgd29uJ3QKKyAgICAgICAgIyBoYW5kbGUgdGhlIEhUVFAgYXV0aCBlcnJvcgorICAgICAgICBwYXNzd29yZF9tYW5hZ2VyLnVzZXIgPSBwYXNzd29yZF9tYW5hZ2VyLnBhc3N3b3JkID0gTm9uZQorICAgICAgICBodHRwX2hhbmRsZXIucmVzZXQoKQorICAgICAgICByID0gb3BlbmVyLm9wZW4ocmVxdWVzdF91cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGh0dHBfaGFuZGxlci5yZXF1ZXN0cyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaHR0cF9oYW5kbGVyLnJlcXVlc3RzWzBdLmhhc19oZWFkZXIoYXV0aF9oZWFkZXIpKQorCitjbGFzcyBNaXNjVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfYnVpbGRfb3BlbmVyKHNlbGYpOgorICAgICAgICBjbGFzcyBNeUhUVFBIYW5kbGVyKHVybGxpYjIuSFRUUEhhbmRsZXIpOiBwYXNzCisgICAgICAgIGNsYXNzIEZvb0hhbmRsZXIodXJsbGliMi5CYXNlSGFuZGxlcik6CisgICAgICAgICAgICBkZWYgZm9vX29wZW4oc2VsZik6IHBhc3MKKyAgICAgICAgY2xhc3MgQmFySGFuZGxlcih1cmxsaWIyLkJhc2VIYW5kbGVyKToKKyAgICAgICAgICAgIGRlZiBiYXJfb3BlbihzZWxmKTogcGFzcworCisgICAgICAgIGJ1aWxkX29wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyCisKKyAgICAgICAgbyA9IGJ1aWxkX29wZW5lcihGb29IYW5kbGVyLCBCYXJIYW5kbGVyKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCBGb29IYW5kbGVyKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCBCYXJIYW5kbGVyKQorCisgICAgICAgICMgY2FuIHRha2UgYSBtaXggb2YgY2xhc3NlcyBhbmQgaW5zdGFuY2VzCisgICAgICAgIG8gPSBidWlsZF9vcGVuZXIoRm9vSGFuZGxlciwgQmFySGFuZGxlcigpKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCBGb29IYW5kbGVyKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCBCYXJIYW5kbGVyKQorCisgICAgICAgICMgc3ViY2xhc3NlcyBvZiBkZWZhdWx0IGhhbmRsZXJzIG92ZXJyaWRlIGRlZmF1bHQgaGFuZGxlcnMKKyAgICAgICAgbyA9IGJ1aWxkX29wZW5lcihNeUhUVFBIYW5kbGVyKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCBNeUhUVFBIYW5kbGVyKQorCisgICAgICAgICMgYSBwYXJ0aWN1bGFyIGNhc2Ugb2Ygb3ZlcnJpZGluZzogZGVmYXVsdCBoYW5kbGVycyBjYW4gYmUgcGFzc2VkCisgICAgICAgICMgaW4gZXhwbGljaXRseQorICAgICAgICBvID0gYnVpbGRfb3BlbmVyKCkKKyAgICAgICAgc2VsZi5vcGVuZXJfaGFzX2hhbmRsZXIobywgdXJsbGliMi5IVFRQSGFuZGxlcikKKyAgICAgICAgbyA9IGJ1aWxkX29wZW5lcih1cmxsaWIyLkhUVFBIYW5kbGVyKQorICAgICAgICBzZWxmLm9wZW5lcl9oYXNfaGFuZGxlcihvLCB1cmxsaWIyLkhUVFBIYW5kbGVyKQorICAgICAgICBvID0gYnVpbGRfb3BlbmVyKHVybGxpYjIuSFRUUEhhbmRsZXIoKSkKKyAgICAgICAgc2VsZi5vcGVuZXJfaGFzX2hhbmRsZXIobywgdXJsbGliMi5IVFRQSGFuZGxlcikKKworICAgICAgICAjIElzc3VlMjY3MDogbXVsdGlwbGUgaGFuZGxlcnMgc2hhcmluZyB0aGUgc2FtZSBiYXNlIGNsYXNzCisgICAgICAgIGNsYXNzIE15T3RoZXJIVFRQSGFuZGxlcih1cmxsaWIyLkhUVFBIYW5kbGVyKTogcGFzcworICAgICAgICBvID0gYnVpbGRfb3BlbmVyKE15SFRUUEhhbmRsZXIsIE15T3RoZXJIVFRQSGFuZGxlcikKKyAgICAgICAgc2VsZi5vcGVuZXJfaGFzX2hhbmRsZXIobywgTXlIVFRQSGFuZGxlcikKKyAgICAgICAgc2VsZi5vcGVuZXJfaGFzX2hhbmRsZXIobywgTXlPdGhlckhUVFBIYW5kbGVyKQorCisgICAgZGVmIG9wZW5lcl9oYXNfaGFuZGxlcihzZWxmLCBvcGVuZXIsIGhhbmRsZXJfY2xhc3MpOgorICAgICAgICBmb3IgaCBpbiBvcGVuZXIuaGFuZGxlcnM6CisgICAgICAgICAgICBpZiBoLl9fY2xhc3NfXyA9PSBoYW5kbGVyX2NsYXNzOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRmFsc2UpCisKK2NsYXNzIFJlcXVlc3RUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0ID0gdXJsbGliMi5SZXF1ZXN0KCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvfmplcmVteS8iKQorICAgICAgICBzZWxmLnBvc3QgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly93d3cucHl0aG9uLm9yZy9+amVyZW15LyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzPXsiWC1UZXN0IjogInRlc3QifSkKKworICAgIGRlZiB0ZXN0X21ldGhvZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiUE9TVCIsIHNlbGYucG9zdC5nZXRfbWV0aG9kKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkdFVCIsIHNlbGYuZ2V0LmdldF9tZXRob2QoKSkKKworICAgIGRlZiB0ZXN0X2FkZF9kYXRhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuZ2V0Lmhhc19kYXRhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkdFVCIsIHNlbGYuZ2V0LmdldF9tZXRob2QoKSkKKyAgICAgICAgc2VsZi5nZXQuYWRkX2RhdGEoInNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5nZXQuaGFzX2RhdGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiUE9TVCIsIHNlbGYuZ2V0LmdldF9tZXRob2QoKSkKKworICAgIGRlZiB0ZXN0X2dldF9mdWxsX3VybChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiaHR0cDovL3d3dy5weXRob24ub3JnL35qZXJlbXkvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldC5nZXRfZnVsbF91cmwoKSkKKworICAgIGRlZiB0ZXN0X3NlbGVjdG9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIvfmplcmVteS8iLCBzZWxmLmdldC5nZXRfc2VsZWN0b3IoKSkKKyAgICAgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiLyIsIHJlcS5nZXRfc2VsZWN0b3IoKSkKKworICAgIGRlZiB0ZXN0X2dldF90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJodHRwIiwgc2VsZi5nZXQuZ2V0X3R5cGUoKSkKKworICAgIGRlZiB0ZXN0X2dldF9ob3N0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ3d3cucHl0aG9uLm9yZyIsIHNlbGYuZ2V0LmdldF9ob3N0KCkpCisKKyAgICBkZWYgdGVzdF9nZXRfaG9zdF91bnF1b3RlKHNlbGYpOgorICAgICAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly93d3cuJTcweXRob24ub3JnLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInd3dy5weXRob24ub3JnIiwgcmVxLmdldF9ob3N0KCkpCisKKyAgICBkZWYgdGVzdF9wcm94eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmdldC5oYXNfcHJveHkoKSkKKyAgICAgICAgc2VsZi5nZXQuc2V0X3Byb3h5KCJ3d3cucGVybC5vcmciLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmdldC5oYXNfcHJveHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgid3d3LnB5dGhvbi5vcmciLCBzZWxmLmdldC5nZXRfb3JpZ2luX3JlcV9ob3N0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInd3dy5wZXJsLm9yZyIsIHNlbGYuZ2V0LmdldF9ob3N0KCkpCisKKyAgICBkZWYgdGVzdF93cmFwcGVkX3VybChzZWxmKToKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiPFVSTDpodHRwOi8vd3d3LnB5dGhvbi5vcmc+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgid3d3LnB5dGhvbi5vcmciLCByZXEuZ2V0X2hvc3QoKSkKKworICAgIGRlZiB0ZXN0X3VybF9mcmFnbWVudChzZWxmKToKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5weXRob24ub3JnLz9xcz1xdWVyeSNmcmFnbWVudD10cnVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiLz9xcz1xdWVyeSIsIHJlcS5nZXRfc2VsZWN0b3IoKSkKKyAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5weXRob24ub3JnLyNmdW49dHJ1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIi8iLCByZXEuZ2V0X3NlbGVjdG9yKCkpCisKKyAgICAgICAgIyBJc3N1ZSAxMTcwMzogZ2V0dXJsKCkgb21pdHMgZnJhZ21lbnQgaW4gdGhlIG9yaWdpbmFsIFVSTC4KKyAgICAgICAgdXJsID0gJ2h0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91cmxsaWIyLmh0bWwjT0snCisgICAgICAgIHJlcSA9IFJlcXVlc3QodXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfZnVsbF91cmwoKSwgdXJsKQorCisgICAgZGVmIHRlc3RfSFRUUEVycm9yX2ludGVyZmFjZShzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIElzc3VlIDEzMjExIHJldmVhbHMgdGhhdCBIVFRQRXJyb3IgZGlkbid0IGltcGxlbWVudCB0aGUgVVJMRXJyb3IKKyAgICAgICAgaW50ZXJmYWNlIGV2ZW4gdGhvdWdoIEhUVFBFcnJvciBpcyBhIHN1YmNsYXNzIG9mIFVSTEVycm9yLgorCisgICAgICAgID4+PiBlcnIgPSB1cmxsaWIyLkhUVFBFcnJvcihtc2c9J3NvbWV0aGluZyBiYWQgaGFwcGVuZWQnLCB1cmw9Tm9uZSwgY29kZT1Ob25lLCBoZHJzPU5vbmUsIGZwPU5vbmUpCisgICAgICAgID4+PiBhc3NlcnQgaGFzYXR0cihlcnIsICdyZWFzb24nKQorICAgICAgICA+Pj4gZXJyLnJlYXNvbgorICAgICAgICAnc29tZXRoaW5nIGJhZCBoYXBwZW5lZCcKKyAgICAgICAgIiIiCisKKyAgICBkZWYgdGVzdF9IVFRQRXJyb3JfaW50ZXJmYWNlX2NhbGwoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBJc3N1ZSAxNTcwMT0gLSBIVFRQRXJyb3IgaW50ZXJmYWNlIGhhcyBpbmZvIG1ldGhvZCBhdmFpbGFibGUgZnJvbSBVUkxFcnJvci4KKyAgICAgICAgIiIiCisgICAgICAgIGVyciA9IHVybGxpYjIuSFRUUEVycm9yKG1zZz0nc29tZXRoaW5nIGJhZCBoYXBwZW5lZCcsIHVybD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlPU5vbmUsIGhkcnM9J0NvbnRlbnQtTGVuZ3RoOjQyJywgZnA9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZXJyLCAncmVhc29uJykpCisgICAgICAgIGFzc2VydCBoYXNhdHRyKGVyciwgJ3JlYXNvbicpCisgICAgICAgIGFzc2VydCBoYXNhdHRyKGVyciwgJ2luZm8nKQorICAgICAgICBhc3NlcnQgY2FsbGFibGUoZXJyLmluZm8pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVyci5pbmZvKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJlcnIuaW5mbygpIGZhaWxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmluZm8oKSwgIkNvbnRlbnQtTGVuZ3RoOjQyIikKKworZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF91cmxsaWIyCisgICAgdGVzdF9zdXBwb3J0LnJ1bl9kb2N0ZXN0KHRlc3RfdXJsbGliMiwgdmVyYm9zZSkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodXJsbGliMiwgdmVyYm9zZSkKKyAgICB0ZXN0cyA9IChUcml2aWFsVGVzdHMsCisgICAgICAgICAgICAgT3BlbmVyRGlyZWN0b3JUZXN0cywKKyAgICAgICAgICAgICBIYW5kbGVyVGVzdHMsCisgICAgICAgICAgICAgTWlzY1Rlc3RzLAorICAgICAgICAgICAgIFJlcXVlc3RUZXN0cykKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KCp0ZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTJiYzdmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmFlNGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgwMmY2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKQEAgLTAsMCArMSw1NTIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgdXJscGFyc2UKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGhhc2hsaWIKKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworbWltZXRvb2xzID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ21pbWV0b29scycsIGRlcHJlY2F0ZWQ9VHJ1ZSkKK3RocmVhZGluZyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd0aHJlYWRpbmcnKQorCisjIExvb3BiYWNrIGh0dHAgc2VydmVyIGluZnJhc3RydWN0dXJlCisKK2NsYXNzIExvb3BiYWNrSHR0cFNlcnZlcihCYXNlSFRUUFNlcnZlci5IVFRQU2VydmVyKToKKyAgICAiIiJIVFRQIHNlcnZlciB3LyBhIGZldyBtb2RpZmljYXRpb25zIHRoYXQgbWFrZSBpdCB1c2VmdWwgZm9yCisgICAgbG9vcGJhY2sgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcyk6CisgICAgICAgIEJhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXIuX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0SGFuZGxlckNsYXNzKQorCisgICAgICAgICMgU2V0IHRoZSB0aW1lb3V0IG9mIG91ciBsaXN0ZW5pbmcgc29ja2V0IHJlYWxseSBsb3cgc28KKyAgICAgICAgIyB0aGF0IHdlIGNhbiBzdG9wIHRoZSBzZXJ2ZXIgZWFzaWx5LgorICAgICAgICBzZWxmLnNvY2tldC5zZXR0aW1lb3V0KDEuMCkKKworICAgIGRlZiBnZXRfcmVxdWVzdChzZWxmKToKKyAgICAgICAgIiIiQmFzZUhUVFBTZXJ2ZXIgbWV0aG9kLCBvdmVycmlkZGVuLiIiIgorCisgICAgICAgIHJlcXVlc3QsIGNsaWVudF9hZGRyZXNzID0gc2VsZi5zb2NrZXQuYWNjZXB0KCkKKworICAgICAgICAjIEl0J3MgYSBsb29wYmFjayBjb25uZWN0aW9uLCBzbyBzZXR0aW5nIHRoZSB0aW1lb3V0CisgICAgICAgICMgcmVhbGx5IGxvdyBzaG91bGRuJ3QgYWZmZWN0IGFueXRoaW5nLCBidXQgc2hvdWxkIG1ha2UKKyAgICAgICAgIyBkZWFkbG9ja3MgbGVzcyBsaWtlbHkgdG8gb2NjdXIuCisgICAgICAgIHJlcXVlc3Quc2V0dGltZW91dCgxMC4wKQorCisgICAgICAgIHJldHVybiAocmVxdWVzdCwgY2xpZW50X2FkZHJlc3MpCisKK2NsYXNzIExvb3BiYWNrSHR0cFNlcnZlclRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICAiIiJTdG9wcGFibGUgdGhyZWFkIHRoYXQgcnVucyBhIGxvb3BiYWNrIGh0dHAgc2VydmVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlcXVlc3RfaGFuZGxlcik6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5fc3RvcCA9IEZhbHNlCisgICAgICAgIHNlbGYucmVhZHkgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICByZXF1ZXN0X2hhbmRsZXIucHJvdG9jb2xfdmVyc2lvbiA9ICJIVFRQLzEuMCIKKyAgICAgICAgc2VsZi5odHRwZCA9IExvb3BiYWNrSHR0cFNlcnZlcigoJzEyNy4wLjAuMScsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlcikKKyAgICAgICAgI3ByaW50ICJTZXJ2aW5nIEhUVFAgb24gJXMgcG9ydCAlcyIgJSAoc2VsZi5odHRwZC5zZXJ2ZXJfbmFtZSwKKyAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5odHRwZC5zZXJ2ZXJfcG9ydCkKKyAgICAgICAgc2VsZi5wb3J0ID0gc2VsZi5odHRwZC5zZXJ2ZXJfcG9ydAorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICIiIlN0b3BzIHRoZSB3ZWJzZXJ2ZXIgaWYgaXQncyBjdXJyZW50bHkgcnVubmluZy4iIiIKKworICAgICAgICAjIFNldCB0aGUgc3RvcCBmbGFnLgorICAgICAgICBzZWxmLl9zdG9wID0gVHJ1ZQorCisgICAgICAgIHNlbGYuam9pbigpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWR5LnNldCgpCisgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9zdG9wOgorICAgICAgICAgICAgc2VsZi5odHRwZC5oYW5kbGVfcmVxdWVzdCgpCisKKyMgQXV0aGVudGljYXRpb24gaW5mcmFzdHJ1Y3R1cmUKKworY2xhc3MgRGlnZXN0QXV0aEhhbmRsZXI6CisgICAgIiIiSGFuZGxlciBmb3IgcGVyZm9ybWluZyBkaWdlc3QgYXV0aGVudGljYXRpb24uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3JlcXVlc3RfbnVtID0gMAorICAgICAgICBzZWxmLl9ub25jZXMgPSBbXQorICAgICAgICBzZWxmLl91c2VycyA9IHt9CisgICAgICAgIHNlbGYuX3JlYWxtX25hbWUgPSAiVGVzdCBSZWFsbSIKKyAgICAgICAgc2VsZi5fcW9wID0gImF1dGgiCisKKyAgICBkZWYgc2V0X3FvcChzZWxmLCBxb3ApOgorICAgICAgICBzZWxmLl9xb3AgPSBxb3AKKworICAgIGRlZiBzZXRfdXNlcnMoc2VsZiwgdXNlcnMpOgorICAgICAgICBhc3NlcnQgaXNpbnN0YW5jZSh1c2VycywgZGljdCkKKyAgICAgICAgc2VsZi5fdXNlcnMgPSB1c2VycworCisgICAgZGVmIHNldF9yZWFsbShzZWxmLCByZWFsbSk6CisgICAgICAgIHNlbGYuX3JlYWxtX25hbWUgPSByZWFsbQorCisgICAgZGVmIF9nZW5lcmF0ZV9ub25jZShzZWxmKToKKyAgICAgICAgc2VsZi5fcmVxdWVzdF9udW0gKz0gMQorICAgICAgICBub25jZSA9IGhhc2hsaWIubWQ1KHN0cihzZWxmLl9yZXF1ZXN0X251bSkpLmhleGRpZ2VzdCgpCisgICAgICAgIHNlbGYuX25vbmNlcy5hcHBlbmQobm9uY2UpCisgICAgICAgIHJldHVybiBub25jZQorCisgICAgZGVmIF9jcmVhdGVfYXV0aF9kaWN0KHNlbGYsIGF1dGhfc3RyKToKKyAgICAgICAgZmlyc3Rfc3BhY2VfaW5kZXggPSBhdXRoX3N0ci5maW5kKCIgIikKKyAgICAgICAgYXV0aF9zdHIgPSBhdXRoX3N0cltmaXJzdF9zcGFjZV9pbmRleCsxOl0KKworICAgICAgICBwYXJ0cyA9IGF1dGhfc3RyLnNwbGl0KCIsIikKKworICAgICAgICBhdXRoX2RpY3QgPSB7fQorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIG5hbWUsIHZhbHVlID0gcGFydC5zcGxpdCgiPSIpCisgICAgICAgICAgICBuYW1lID0gbmFtZS5zdHJpcCgpCisgICAgICAgICAgICBpZiB2YWx1ZVswXSA9PSAnIicgYW5kIHZhbHVlWy0xXSA9PSAnIic6CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxOi0xXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN0cmlwKCkKKyAgICAgICAgICAgIGF1dGhfZGljdFtuYW1lXSA9IHZhbHVlCisgICAgICAgIHJldHVybiBhdXRoX2RpY3QKKworICAgIGRlZiBfdmFsaWRhdGVfYXV0aChzZWxmLCBhdXRoX2RpY3QsIHBhc3N3b3JkLCBtZXRob2QsIHVyaSk6CisgICAgICAgIGZpbmFsX2RpY3QgPSB7fQorICAgICAgICBmaW5hbF9kaWN0LnVwZGF0ZShhdXRoX2RpY3QpCisgICAgICAgIGZpbmFsX2RpY3RbInBhc3N3b3JkIl0gPSBwYXNzd29yZAorICAgICAgICBmaW5hbF9kaWN0WyJtZXRob2QiXSA9IG1ldGhvZAorICAgICAgICBmaW5hbF9kaWN0WyJ1cmkiXSA9IHVyaQorICAgICAgICBIQTFfc3RyID0gIiUodXNlcm5hbWUpczolKHJlYWxtKXM6JShwYXNzd29yZClzIiAlIGZpbmFsX2RpY3QKKyAgICAgICAgSEExID0gaGFzaGxpYi5tZDUoSEExX3N0cikuaGV4ZGlnZXN0KCkKKyAgICAgICAgSEEyX3N0ciA9ICIlKG1ldGhvZClzOiUodXJpKXMiICUgZmluYWxfZGljdAorICAgICAgICBIQTIgPSBoYXNobGliLm1kNShIQTJfc3RyKS5oZXhkaWdlc3QoKQorICAgICAgICBmaW5hbF9kaWN0WyJIQTEiXSA9IEhBMQorICAgICAgICBmaW5hbF9kaWN0WyJIQTIiXSA9IEhBMgorICAgICAgICByZXNwb25zZV9zdHIgPSAiJShIQTEpczolKG5vbmNlKXM6JShuYylzOiIgXAorICAgICAgICAgICAgICAgICAgICAgICAiJShjbm9uY2UpczolKHFvcClzOiUoSEEyKXMiICUgZmluYWxfZGljdAorICAgICAgICByZXNwb25zZSA9IGhhc2hsaWIubWQ1KHJlc3BvbnNlX3N0cikuaGV4ZGlnZXN0KCkKKworICAgICAgICByZXR1cm4gcmVzcG9uc2UgPT0gYXV0aF9kaWN0WyJyZXNwb25zZSJdCisKKyAgICBkZWYgX3JldHVybl9hdXRoX2NoYWxsZW5nZShzZWxmLCByZXF1ZXN0X2hhbmRsZXIpOgorICAgICAgICByZXF1ZXN0X2hhbmRsZXIuc2VuZF9yZXNwb25zZSg0MDcsICJQcm94eSBBdXRoZW50aWNhdGlvbiBSZXF1aXJlZCIpCisgICAgICAgIHJlcXVlc3RfaGFuZGxlci5zZW5kX2hlYWRlcigiQ29udGVudC1UeXBlIiwgInRleHQvaHRtbCIpCisgICAgICAgIHJlcXVlc3RfaGFuZGxlci5zZW5kX2hlYWRlcigKKyAgICAgICAgICAgICdQcm94eS1BdXRoZW50aWNhdGUnLCAnRGlnZXN0IHJlYWxtPSIlcyIsICcKKyAgICAgICAgICAgICdxb3A9IiVzIiwnCisgICAgICAgICAgICAnbm9uY2U9IiVzIiwgJyAlIFwKKyAgICAgICAgICAgIChzZWxmLl9yZWFsbV9uYW1lLCBzZWxmLl9xb3AsIHNlbGYuX2dlbmVyYXRlX25vbmNlKCkpKQorICAgICAgICAjIFhYWDogTm90IHN1cmUgaWYgd2UncmUgc3VwcG9zZWQgdG8gYWRkIHRoaXMgbmV4dCBoZWFkZXIgb3IKKyAgICAgICAgIyBub3QuCisgICAgICAgICNyZXF1ZXN0X2hhbmRsZXIuc2VuZF9oZWFkZXIoJ0Nvbm5lY3Rpb24nLCAnY2xvc2UnKQorICAgICAgICByZXF1ZXN0X2hhbmRsZXIuZW5kX2hlYWRlcnMoKQorICAgICAgICByZXF1ZXN0X2hhbmRsZXIud2ZpbGUud3JpdGUoIlByb3h5IEF1dGhlbnRpY2F0aW9uIFJlcXVpcmVkLiIpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGhhbmRsZV9yZXF1ZXN0KHNlbGYsIHJlcXVlc3RfaGFuZGxlcik6CisgICAgICAgICIiIlBlcmZvcm1zIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBvbiB0aGUgZ2l2ZW4gSFRUUCByZXF1ZXN0CisgICAgICAgIGhhbmRsZXIuICBSZXR1cm5zIFRydWUgaWYgYXV0aGVudGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIEZhbHNlCisgICAgICAgIG90aGVyd2lzZS4KKworICAgICAgICBJZiBubyB1c2VycyBoYXZlIGJlZW4gc2V0LCB0aGVuIGRpZ2VzdCBhdXRoIGlzIGVmZmVjdGl2ZWx5CisgICAgICAgIGRpc2FibGVkIGFuZCB0aGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gVHJ1ZS4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbGVuKHNlbGYuX3VzZXJzKSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBpZiAnUHJveHktQXV0aG9yaXphdGlvbicgbm90IGluIHJlcXVlc3RfaGFuZGxlci5oZWFkZXJzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl9hdXRoX2NoYWxsZW5nZShyZXF1ZXN0X2hhbmRsZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhdXRoX2RpY3QgPSBzZWxmLl9jcmVhdGVfYXV0aF9kaWN0KAorICAgICAgICAgICAgICAgIHJlcXVlc3RfaGFuZGxlci5oZWFkZXJzWydQcm94eS1BdXRob3JpemF0aW9uJ10KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBhdXRoX2RpY3RbInVzZXJuYW1lIl0gaW4gc2VsZi5fdXNlcnM6CisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBzZWxmLl91c2Vyc1sgYXV0aF9kaWN0WyJ1c2VybmFtZSJdIF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl9hdXRoX2NoYWxsZW5nZShyZXF1ZXN0X2hhbmRsZXIpCisgICAgICAgICAgICBpZiBub3QgYXV0aF9kaWN0LmdldCgibm9uY2UiKSBpbiBzZWxmLl9ub25jZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl9hdXRoX2NoYWxsZW5nZShyZXF1ZXN0X2hhbmRsZXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX25vbmNlcy5yZW1vdmUoYXV0aF9kaWN0WyJub25jZSJdKQorCisgICAgICAgICAgICBhdXRoX3ZhbGlkYXRlZCA9IEZhbHNlCisKKyAgICAgICAgICAgICMgTVNJRSB1c2VzIHNob3J0X3BhdGggaW4gaXRzIHZhbGlkYXRpb24sIGJ1dCBQeXRob24ncworICAgICAgICAgICAgIyB1cmxsaWIyIHVzZXMgdGhlIGZ1bGwgcGF0aCwgc28gd2UncmUgZ29pbmcgdG8gc2VlIGlmCisgICAgICAgICAgICAjIGVpdGhlciBvZiB0aGVtIHdvcmtzIGhlcmUuCisKKyAgICAgICAgICAgIGZvciBwYXRoIGluIFtyZXF1ZXN0X2hhbmRsZXIucGF0aCwgcmVxdWVzdF9oYW5kbGVyLnNob3J0X3BhdGhdOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3ZhbGlkYXRlX2F1dGgoYXV0aF9kaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X2hhbmRsZXIuY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBhdXRoX3ZhbGlkYXRlZCA9IFRydWUKKworICAgICAgICAgICAgaWYgbm90IGF1dGhfdmFsaWRhdGVkOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZXR1cm5fYXV0aF9jaGFsbGVuZ2UocmVxdWVzdF9oYW5kbGVyKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworIyBQcm94eSB0ZXN0IGluZnJhc3RydWN0dXJlCisKK2NsYXNzIEZha2VQcm94eUhhbmRsZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisgICAgIiIiVGhpcyBpcyBhICdmYWtlIHByb3h5JyB0aGF0IG1ha2VzIGl0IGxvb2sgbGlrZSB0aGUgZW50aXJlCisgICAgaW50ZXJuZXQgaGFzIGdvbmUgZG93biBkdWUgdG8gYSBzdWRkZW4gem9tYmllIGludmFzaW9uLiAgSXQgbWFpbgorICAgIHV0aWxpdHkgaXMgaW4gcHJvdmlkaW5nIHVzIHdpdGggYXV0aGVudGljYXRpb24gc3VwcG9ydCBmb3IKKyAgICB0ZXN0aW5nLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpZ2VzdF9hdXRoX2hhbmRsZXIsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICMgVGhpcyBoYXMgdG8gYmUgc2V0IGJlZm9yZSBjYWxsaW5nIG91ciBwYXJlbnQncyBfX2luaXRfXygpLCB3aGljaCB3aWxsCisgICAgICAgICMgdHJ5IHRvIGNhbGwgZG9fR0VUKCkuCisgICAgICAgIHNlbGYuZGlnZXN0X2F1dGhfaGFuZGxlciA9IGRpZ2VzdF9hdXRoX2hhbmRsZXIKKyAgICAgICAgQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgbG9nX21lc3NhZ2Uoc2VsZiwgZm9ybWF0LCAqYXJncyk6CisgICAgICAgICMgVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgZm9yIGRlYnVnZ2luZy4KKyAgICAgICAgI3N5cy5zdGRlcnIud3JpdGUoZm9ybWF0ICUgYXJncykKKyAgICAgICAgcGFzcworCisgICAgZGVmIGRvX0dFVChzZWxmKToKKyAgICAgICAgKHNjbSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkgPSB1cmxwYXJzZS51cmxwYXJzZSgKKyAgICAgICAgICAgIHNlbGYucGF0aCwgJ2h0dHAnKQorICAgICAgICBzZWxmLnNob3J0X3BhdGggPSBwYXRoCisgICAgICAgIGlmIHNlbGYuZGlnZXN0X2F1dGhfaGFuZGxlci5oYW5kbGVfcmVxdWVzdChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZSgyMDAsICJPSyIpCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC9odG1sIikKKyAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZSgiWW91J3ZlIHJlYWNoZWQgJXMhPEJSPiIgJSBzZWxmLnBhdGgpCisgICAgICAgICAgICBzZWxmLndmaWxlLndyaXRlKCJPdXIgYXBvbG9naWVzLCBidXQgb3VyIHNlcnZlciBpcyBkb3duIGR1ZSB0byAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYSBzdWRkZW4gem9tYmllIGludmFzaW9uLiIpCisKKyMgVGVzdCBjYXNlcworCitjbGFzcyBCYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fdGhyZWFkcyA9IHRlc3Rfc3VwcG9ydC50aHJlYWRpbmdfc2V0dXAoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudGhyZWFkaW5nX2NsZWFudXAoKnNlbGYuX3RocmVhZHMpCisKKworY2xhc3MgUHJveHlBdXRoVGVzdHMoQmFzZVRlc3RDYXNlKToKKyAgICBVUkwgPSAiaHR0cDovL2xvY2FsaG9zdCIKKworICAgIFVTRVIgPSAidGVzdGVyIgorICAgIFBBU1NXRCA9ICJ0ZXN0MTIzIgorICAgIFJFQUxNID0gIlRlc3RSZWFsbSIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc3VwZXIoUHJveHlBdXRoVGVzdHMsIHNlbGYpLnNldFVwKCkKKyAgICAgICAgc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyID0gRGlnZXN0QXV0aEhhbmRsZXIoKQorICAgICAgICBzZWxmLmRpZ2VzdF9hdXRoX2hhbmRsZXIuc2V0X3VzZXJzKHtzZWxmLlVTRVI6IHNlbGYuUEFTU1dEfSkKKyAgICAgICAgc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyLnNldF9yZWFsbShzZWxmLlJFQUxNKQorICAgICAgICBkZWYgY3JlYXRlX2Zha2VfcHJveHlfaGFuZGxlcigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgcmV0dXJuIEZha2VQcm94eUhhbmRsZXIoc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyLCAqYXJncywgKiprd2FyZ3MpCisKKyAgICAgICAgc2VsZi5zZXJ2ZXIgPSBMb29wYmFja0h0dHBTZXJ2ZXJUaHJlYWQoY3JlYXRlX2Zha2VfcHJveHlfaGFuZGxlcikKKyAgICAgICAgc2VsZi5zZXJ2ZXIuc3RhcnQoKQorICAgICAgICBzZWxmLnNlcnZlci5yZWFkeS53YWl0KCkKKyAgICAgICAgcHJveHlfdXJsID0gImh0dHA6Ly8xMjcuMC4wLjE6JWQiICUgc2VsZi5zZXJ2ZXIucG9ydAorICAgICAgICBoYW5kbGVyID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoeyJodHRwIiA6IHByb3h5X3VybH0pCisgICAgICAgIHNlbGYucHJveHlfZGlnZXN0X2hhbmRsZXIgPSB1cmxsaWIyLlByb3h5RGlnZXN0QXV0aEhhbmRsZXIoKQorICAgICAgICBzZWxmLm9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKGhhbmRsZXIsIHNlbGYucHJveHlfZGlnZXN0X2hhbmRsZXIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorICAgICAgICBzdXBlcihQcm94eUF1dGhUZXN0cywgc2VsZikudGVhckRvd24oKQorCisgICAgZGVmIHRlc3RfcHJveHlfd2l0aF9iYWRfcGFzc3dvcmRfcmFpc2VzX2h0dHBlcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5wcm94eV9kaWdlc3RfaGFuZGxlci5hZGRfcGFzc3dvcmQoc2VsZi5SRUFMTSwgc2VsZi5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVVNFUiwgc2VsZi5QQVNTV0QrImJhZCIpCisgICAgICAgIHNlbGYuZGlnZXN0X2F1dGhfaGFuZGxlci5zZXRfcW9wKCJhdXRoIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXJsbGliMi5IVFRQRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbmVyLm9wZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVVJMKQorCisgICAgZGVmIHRlc3RfcHJveHlfd2l0aF9ub19wYXNzd29yZF9yYWlzZXNfaHR0cGVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmRpZ2VzdF9hdXRoX2hhbmRsZXIuc2V0X3FvcCgiYXV0aCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVybGxpYjIuSFRUUEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9wZW5lci5vcGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLlVSTCkKKworICAgIGRlZiB0ZXN0X3Byb3h5X3FvcF9hdXRoX3dvcmtzKHNlbGYpOgorICAgICAgICBzZWxmLnByb3h5X2RpZ2VzdF9oYW5kbGVyLmFkZF9wYXNzd29yZChzZWxmLlJFQUxNLCBzZWxmLlVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5VU0VSLCBzZWxmLlBBU1NXRCkKKyAgICAgICAgc2VsZi5kaWdlc3RfYXV0aF9oYW5kbGVyLnNldF9xb3AoImF1dGgiKQorICAgICAgICByZXN1bHQgPSBzZWxmLm9wZW5lci5vcGVuKHNlbGYuVVJMKQorICAgICAgICB3aGlsZSByZXN1bHQucmVhZCgpOgorICAgICAgICAgICAgcGFzcworICAgICAgICByZXN1bHQuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfcHJveHlfcW9wX2F1dGhfaW50X3dvcmtzX29yX3Rocm93c191cmxlcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5wcm94eV9kaWdlc3RfaGFuZGxlci5hZGRfcGFzc3dvcmQoc2VsZi5SRUFMTSwgc2VsZi5VUkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuVVNFUiwgc2VsZi5QQVNTV0QpCisgICAgICAgIHNlbGYuZGlnZXN0X2F1dGhfaGFuZGxlci5zZXRfcW9wKCJhdXRoLWludCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYub3BlbmVyLm9wZW4oc2VsZi5VUkwpCisgICAgICAgIGV4Y2VwdCB1cmxsaWIyLlVSTEVycm9yOgorICAgICAgICAgICAgIyBJdCdzIG9rYXkgaWYgd2UgZG9uJ3Qgc3VwcG9ydCBhdXRoLWludCwgYnV0IHdlIGNlcnRhaW5seQorICAgICAgICAgICAgIyBzaG91bGRuJ3QgcmVjZWl2ZSBhbnkga2luZCBvZiBleGNlcHRpb24gaGVyZSBvdGhlciB0aGFuCisgICAgICAgICAgICAjIGEgVVJMRXJyb3IuCisgICAgICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHdoaWxlIHJlc3VsdC5yZWFkKCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgcmVzdWx0LmNsb3NlKCkKKworCitkZWYgR2V0UmVxdWVzdEhhbmRsZXIocmVzcG9uc2VzKToKKworICAgIGNsYXNzIEZha2VIVFRQUmVxdWVzdEhhbmRsZXIoQmFzZUhUVFBTZXJ2ZXIuQmFzZUhUVFBSZXF1ZXN0SGFuZGxlcik6CisKKyAgICAgICAgc2VydmVyX3ZlcnNpb24gPSAiVGVzdEhUVFAvIgorICAgICAgICByZXF1ZXN0cyA9IFtdCisgICAgICAgIGhlYWRlcnNfcmVjZWl2ZWQgPSBbXQorICAgICAgICBwb3J0ID0gODAKKworICAgICAgICBkZWYgZG9fR0VUKHNlbGYpOgorICAgICAgICAgICAgYm9keSA9IHNlbGYuc2VuZF9oZWFkKCkKKyAgICAgICAgICAgIGlmIGJvZHk6CisgICAgICAgICAgICAgICAgc2VsZi53ZmlsZS53cml0ZShib2R5KQorCisgICAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgorICAgICAgICAgICAgY29udGVudF9sZW5ndGggPSBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10KKyAgICAgICAgICAgIHBvc3RfZGF0YSA9IHNlbGYucmZpbGUucmVhZChpbnQoY29udGVudF9sZW5ndGgpKQorICAgICAgICAgICAgc2VsZi5kb19HRVQoKQorICAgICAgICAgICAgc2VsZi5yZXF1ZXN0cy5hcHBlbmQocG9zdF9kYXRhKQorCisgICAgICAgIGRlZiBzZW5kX2hlYWQoc2VsZik6CisgICAgICAgICAgICBGYWtlSFRUUFJlcXVlc3RIYW5kbGVyLmhlYWRlcnNfcmVjZWl2ZWQgPSBzZWxmLmhlYWRlcnMKKyAgICAgICAgICAgIHNlbGYucmVxdWVzdHMuYXBwZW5kKHNlbGYucGF0aCkKKyAgICAgICAgICAgIHJlc3BvbnNlX2NvZGUsIGhlYWRlcnMsIGJvZHkgPSByZXNwb25zZXMucG9wKDApCisKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXNwb25zZShyZXNwb25zZV9jb2RlKQorCisgICAgICAgICAgICBmb3IgKGhlYWRlciwgdmFsdWUpIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcihoZWFkZXIsIHZhbHVlICUgc2VsZi5wb3J0KQorICAgICAgICAgICAgaWYgYm9keToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9wbGFpbicpCisgICAgICAgICAgICAgICAgc2VsZi5lbmRfaGVhZGVycygpCisgICAgICAgICAgICAgICAgcmV0dXJuIGJvZHkKKyAgICAgICAgICAgIHNlbGYuZW5kX2hlYWRlcnMoKQorCisgICAgICAgIGRlZiBsb2dfbWVzc2FnZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKworICAgIHJldHVybiBGYWtlSFRUUFJlcXVlc3RIYW5kbGVyCisKKworY2xhc3MgVGVzdFVybG9wZW4oQmFzZVRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB1cmxsaWIyLnVybG9wZW4gdXNpbmcgdGhlIG5ldHdvcmsuCisKKyAgICBUaGVzZSB0ZXN0cyBhcmUgbm90IGV4aGF1c3RpdmUuICBBc3N1bWluZyB0aGF0IHRlc3RpbmcgdXNpbmcgZmlsZXMgZG9lcyBhCisgICAgZ29vZCBqb2Igb3ZlcmFsbCBvZiBzb21lIG9mIHRoZSBiYXNpYyBpbnRlcmZhY2UgZmVhdHVyZXMuICBUaGVyZSBhcmUgbm8KKyAgICB0ZXN0cyBleGVyY2lzaW5nIHRoZSBvcHRpb25hbCAnZGF0YScgYW5kICdwcm94aWVzJyBhcmd1bWVudHMuICBObyB0ZXN0cworICAgIGZvciB0cmFuc3BhcmVudCByZWRpcmVjdGlvbiBoYXZlIGJlZW4gd3JpdHRlbi4KKyAgICAiIiIKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcHJveHlfaGFuZGxlciA9IHVybGxpYjIuUHJveHlIYW5kbGVyKHt9KQorICAgICAgICBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcihwcm94eV9oYW5kbGVyKQorICAgICAgICB1cmxsaWIyLmluc3RhbGxfb3BlbmVyKG9wZW5lcikKKyAgICAgICAgc3VwZXIoVGVzdFVybG9wZW4sIHNlbGYpLnNldFVwKCkKKworICAgIGRlZiBzdGFydF9zZXJ2ZXIoc2VsZiwgcmVzcG9uc2VzKToKKyAgICAgICAgaGFuZGxlciA9IEdldFJlcXVlc3RIYW5kbGVyKHJlc3BvbnNlcykKKworICAgICAgICBzZWxmLnNlcnZlciA9IExvb3BiYWNrSHR0cFNlcnZlclRocmVhZChoYW5kbGVyKQorICAgICAgICBzZWxmLnNlcnZlci5zdGFydCgpCisgICAgICAgIHNlbGYuc2VydmVyLnJlYWR5LndhaXQoKQorICAgICAgICBwb3J0ID0gc2VsZi5zZXJ2ZXIucG9ydAorICAgICAgICBoYW5kbGVyLnBvcnQgPSBwb3J0CisgICAgICAgIHJldHVybiBoYW5kbGVyCisKKworICAgIGRlZiB0ZXN0X3JlZGlyZWN0aW9uKHNlbGYpOgorICAgICAgICBleHBlY3RlZF9yZXNwb25zZSA9ICdXZSBnb3QgaGVyZS4uLicKKyAgICAgICAgcmVzcG9uc2VzID0gWworICAgICAgICAgICAgKDMwMiwgWygnTG9jYXRpb24nLCAnaHR0cDovL2xvY2FsaG9zdDolcy9zb21ld2hlcmVfZWxzZScpXSwgJycpLAorICAgICAgICAgICAgKDIwMCwgW10sIGV4cGVjdGVkX3Jlc3BvbnNlKQorICAgICAgICBdCisKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKHJlc3BvbnNlcykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gdXJsbGliMi51cmxvcGVuKCdodHRwOi8vbG9jYWxob3N0OiVzLycgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGV4cGVjdGVkX3Jlc3BvbnNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLnJlcXVlc3RzLCBbJy8nLCAnL3NvbWV3aGVyZV9lbHNlJ10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworCisgICAgZGVmIHRlc3RfNDA0KHNlbGYpOgorICAgICAgICBleHBlY3RlZF9yZXNwb25zZSA9ICdCYWQgYmFkIGJhZC4uLicKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoNDA0LCBbXSwgZXhwZWN0ZWRfcmVzcG9uc2UpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuKCdodHRwOi8vbG9jYWxob3N0OiVzL3dlZWJsZScgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBleGNlcHQgdXJsbGliMi5VUkxFcnJvciwgZjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnNDA0IHNob3VsZCByYWlzZSBVUkxFcnJvcicpCisKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZXhwZWN0ZWRfcmVzcG9uc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXIucmVxdWVzdHMsIFsnL3dlZWJsZSddKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKworICAgIGRlZiB0ZXN0XzIwMChzZWxmKToKKyAgICAgICAgZXhwZWN0ZWRfcmVzcG9uc2UgPSAncHljb24gMjAwOC4uLicKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoMjAwLCBbXSwgZXhwZWN0ZWRfcmVzcG9uc2UpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gdXJsbGliMi51cmxvcGVuKCdodHRwOi8vbG9jYWxob3N0OiVzL2JpemFycmUnICUgaGFuZGxlci5wb3J0KQorICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCBleHBlY3RlZF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFuZGxlci5yZXF1ZXN0cywgWycvYml6YXJyZSddKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF8yMDBfd2l0aF9wYXJhbWV0ZXJzKHNlbGYpOgorICAgICAgICBleHBlY3RlZF9yZXNwb25zZSA9ICdweWNvbiAyMDA4Li4uJworICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCBleHBlY3RlZF9yZXNwb25zZSldKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6JXMvYml6YXJyZScgJSBoYW5kbGVyLnBvcnQsICdnZXQ9d2l0aF9mZWVsaW5nJykKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgZXhwZWN0ZWRfcmVzcG9uc2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhbmRsZXIucmVxdWVzdHMsIFsnL2JpemFycmUnLCAnZ2V0PXdpdGhfZmVlbGluZyddKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKworICAgIGRlZiB0ZXN0X3NlbmRpbmdfaGVhZGVycyhzZWxmKToKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoMjAwLCBbXSwgIndlIGRvbid0IGNhcmUiKV0pCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVxID0gdXJsbGliMi5SZXF1ZXN0KCJodHRwOi8vbG9jYWxob3N0OiVzLyIgJSBoYW5kbGVyLnBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz17J1JhbmdlJzogJ2J5dGVzPTIwLTM5J30pCisgICAgICAgICAgICB1cmxsaWIyLnVybG9wZW4ocmVxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYW5kbGVyLmhlYWRlcnNfcmVjZWl2ZWRbJ1JhbmdlJ10sICdieXRlcz0yMC0zOScpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLnNlcnZlci5zdG9wKCkKKworICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgorICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCAid2UgZG9uJ3QgY2FyZSIpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBmb3IgYXR0ciBpbiAoInJlYWQiLCAiY2xvc2UiLCAiaW5mbyIsICJnZXR1cmwiKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihvcGVuX3VybCwgYXR0ciksICJvYmplY3QgcmV0dXJuZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1cmxvcGVuIGxhY2tzIHRoZSAlcyBhdHRyaWJ1dGUiICUgYXR0cikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3Blbl91cmwucmVhZCgpLCAiY2FsbGluZyAncmVhZCcgZmFpbGVkIikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgorICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCAid2UgZG9uJ3QgY2FyZSIpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm9fb2JqLCBtaW1ldG9vbHMuTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmVkIGJ5ICdpbmZvJyBpcyBub3QgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBvZiBtaW1ldG9vbHMuTWVzc2FnZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldHN1YnR5cGUoKSwgInBsYWluIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisgICAgZGVmIHRlc3RfZ2V0dXJsKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBzYW1lIFVSTCBhcyBvcGVuZWQgaXMgcmV0dXJuZWQgYnkgZ2V0dXJsLgorICAgICAgICBoYW5kbGVyID0gc2VsZi5zdGFydF9zZXJ2ZXIoWygyMDAsIFtdLCAid2UgZG9uJ3QgY2FyZSIpXSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICB1cmwgPSBvcGVuX3VybC5nZXR1cmwoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmwsICJodHRwOi8vbG9jYWxob3N0OiVzIiAlIGhhbmRsZXIucG9ydCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuc2VydmVyLnN0b3AoKQorCisKKyAgICBkZWYgdGVzdF9iYWRfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgcHJvcGVyIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBjb25uZWN0aW5nIHRvIGEgYm9ndXMKKyAgICAgICAgIyBhZGRyZXNzLgorCisgICAgICAgICMgYXMgaW5kaWNhdGVkIGJ5IHRoZSBjb21tZW50IGJlbG93LCB0aGlzIG1pZ2h0IGZhaWwgd2l0aCBzb21lIElTUCwKKyAgICAgICAgIyBzbyB3ZSBydW4gdGhlIHRlc3Qgb25seSB3aGVuIC11bmV0d29yay8tdWFsbCBpcyBzcGVjaWZpZWQgdG8KKyAgICAgICAgIyBtaXRpZ2F0ZSB0aGUgcHJvYmxlbSBhIGJpdCAoc2VlICMxNzU2NCkKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJlcXVpcmVzKCduZXR3b3JrJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBHaXZlbiB0aGF0IGJvdGggVmVyaVNpZ24gYW5kIHZhcmlvdXMgSVNQcyBoYXZlIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgdGhlIHBhc3Qgb3IgYXJlIHByZXNlbnRseSBoaWphY2tpbmcgdmFyaW91cyBpbnZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIG5hbWUgcmVxdWVzdHMgaW4gYW4gYXR0ZW1wdCB0byBib29zdCB0cmFmZmljCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgdG8gdGhlaXIgb3duIHNpdGVzLCBmaW5kaW5nIGEgZG9tYWluIG5hbWUgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHRoaXMgdGVzdCBpcyBkaWZmaWN1bHQuICBSRkMyNjA2IGxlYWRzIG9uZSB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAjIGJlbGlldmUgdGhhdCAnLmludmFsaWQnIHNob3VsZCB3b3JrLCBidXQgZXhwZXJpZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAjIHNlZW1lZCB0byBpbmRpY2F0ZSBvdGhlcndpc2UuICBTaW5nbGUgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgVExEcyBhcmUgbGlrZWx5IHRvIHJlbWFpbiBpbnZhbGlkLCBzbyB0aGlzIHNlZW1zIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgYmUgdGhlIGJlc3QgY2hvaWNlLiBUaGUgdHJhaWxpbmcgJy4nIHByZXZlbnRzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyByZWxhdGVkIHByb2JsZW06IFRoZSBub3JtYWwgRE5TIHJlc29sdmVyIGFwcGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgZG9tYWluIG5hbWVzIGZyb20gdGhlIHNlYXJjaCBwYXRoIGlmIHRoZXJlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgbm8gJy4nIHRoZSBlbmQgYW5kLCBhbmQgaWYgb25lIG9mIHRob3NlIGRvbWFpbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbXBsZW1lbnRzIGEgJyonIHJ1bGUgYSByZXN1bHQgaXMgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgSG93ZXZlciwgbm9uZSBvZiB0aGlzIHdpbGwgcHJldmVudCB0aGUgdGVzdCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFpbGluZyBpZiB0aGUgSVNQIGhpamFja3MgYWxsIGludmFsaWQgZG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVxdWVzdHMuICBUaGUgcmVhbCBzb2x1dGlvbiB3b3VsZCBiZSB0byBiZSBhYmxlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgcGFyYW1ldGVyaXplIHRoZSBmcmFtZXdvcmsgd2l0aCBhIG1vY2sgcmVzb2x2ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly9zYWRmbGtqc2FzZi5pLm52YWxpLmQuLyIpCisKKyAgICBkZWYgdGVzdF9pdGVyYXRpb24oc2VsZik6CisgICAgICAgIGV4cGVjdGVkX3Jlc3BvbnNlID0gInB5Y29uIDIwMDguLi4iCisgICAgICAgIGhhbmRsZXIgPSBzZWxmLnN0YXJ0X3NlcnZlcihbKDIwMCwgW10sIGV4cGVjdGVkX3Jlc3BvbnNlKV0pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSB1cmxsaWIyLnVybG9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6JXMiICUgaGFuZGxlci5wb3J0KQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gZGF0YToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGV4cGVjdGVkX3Jlc3BvbnNlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisKKyAgICBkZWYgenRlc3RfbGluZV9pdGVyYXRpb24oc2VsZik6CisgICAgICAgIGxpbmVzID0gWyJXZVxuIiwgImdvdFxuIiwgImhlcmVcbiIsICJ2ZXJ5bG9uZyAiICogODE5MiArICJcbiJdCisgICAgICAgIGV4cGVjdGVkX3Jlc3BvbnNlID0gIiIuam9pbihsaW5lcykKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuc3RhcnRfc2VydmVyKFsoMjAwLCBbXSwgZXhwZWN0ZWRfcmVzcG9uc2UpXSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCisgICAgICAgICAgICBmb3IgaW5kZXgsIGxpbmUgaW4gZW51bWVyYXRlKGRhdGEpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgbGluZXNbaW5kZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZldGNoZWQgbGluZSBudW1iZXIgJXMgZG9lc24ndCBtYXRjaCBleHBlY3RlZDpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgRXhwZWN0ZWQgbGVuZ3RoIHdhcyAlcywgZ290ICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5kZXgsIGxlbihsaW5lc1tpbmRleF0pLCBsZW4obGluZSkpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5zZXJ2ZXIuc3RvcCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5kZXggKyAxLCBsZW4obGluZXMpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgIyBXZSB3aWxsIE5PVCBkZXBlbmQgb24gdGhlIG5ldHdvcmsgcmVzb3VyY2UgZmxhZworICAgICMgKExpYi90ZXN0L3JlZ3J0ZXN0LnB5IC11IG5ldHdvcmspIHNpbmNlIGFsbCB0ZXN0cyBoZXJlIGFyZSBvbmx5CisgICAgIyBsb2NhbGhvc3QuICBIb3dldmVyLCBpZiB0aGlzIGlzIGEgYmFkIHJhdGlvbmFsZSwgdGhlbiB1bmNvbW1lbnQKKyAgICAjIHRoZSBuZXh0IGxpbmUuCisgICAgI3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygibmV0d29yayIpCisKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFByb3h5QXV0aFRlc3RzLCBUZXN0VXJsb3BlbikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGYwZDM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTliNGIyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3M2FjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKQEAgLTAsMCArMSwzMzIgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF91cmxsaWIyIGltcG9ydCBzYW5lcGF0aG5hbWUydXJsCisKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB1cmxsaWIyCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworVElNRU9VVCA9IDYwICAjIHNlY29uZHMKKworCitkZWYgX3JldHJ5X3RocmljZShmdW5jLCBleGMsICphcmdzLCAqKmt3YXJncyk6CisgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgZXhjZXB0IGV4YywgbGFzdF9leGM6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICByYWlzZQorICAgIHJhaXNlIGxhc3RfZXhjCisKK2RlZiBfd3JhcF93aXRoX3JldHJ5X3RocmljZShmdW5jLCBleGMpOgorICAgIGRlZiB3cmFwcGVkKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHJldHVybiBfcmV0cnlfdGhyaWNlKGZ1bmMsIGV4YywgKmFyZ3MsICoqa3dhcmdzKQorICAgIHJldHVybiB3cmFwcGVkCisKKyMgQ29ubmVjdGluZyB0byByZW1vdGUgaG9zdHMgaXMgZmxha3kuICBNYWtlIGl0IG1vcmUgcm9idXN0IGJ5IHJldHJ5aW5nCisjIHRoZSBjb25uZWN0aW9uIHNldmVyYWwgdGltZXMuCitfdXJsb3Blbl93aXRoX3JldHJ5ID0gX3dyYXBfd2l0aF9yZXRyeV90aHJpY2UodXJsbGliMi51cmxvcGVuLCB1cmxsaWIyLlVSTEVycm9yKQorCisKK2NsYXNzIEF1dGhUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIiIiVGVzdHMgdXJsbGliMiBhdXRoZW50aWNhdGlvbiBmZWF0dXJlcy4iIiIKKworIyMgRGlzYWJsZWQgYXQgdGhlIG1vbWVudCBzaW5jZSB0aGVyZSBpcyBubyBwYWdlIHVuZGVyIHB5dGhvbi5vcmcgd2hpY2gKKyMjIGNvdWxkIGJlIHVzZWQgdG8gSFRUUCBhdXRoZW50aWNhdGlvbi4KKyMKKyMgICAgZGVmIHRlc3RfYmFzaWNfYXV0aChzZWxmKToKKyMgICAgICAgIGltcG9ydCBodHRwbGliCisjCisjICAgICAgICB0ZXN0X3VybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvdGVzdC90ZXN0X3VybGxpYjIvYmFzaWNfYXV0aCIKKyMgICAgICAgIHRlc3RfaG9zdHBvcnQgPSAid3d3LnB5dGhvbi5vcmciCisjICAgICAgICB0ZXN0X3JlYWxtID0gJ1Rlc3QgUmVhbG0nCisjICAgICAgICB0ZXN0X3VzZXIgPSAndGVzdC50ZXN0X3VybGxpYjJuZXQnCisjICAgICAgICB0ZXN0X3Bhc3N3b3JkID0gJ2JsYWgnCisjCisjICAgICAgICAjIGZhaWx1cmUKKyMgICAgICAgIHRyeToKKyMgICAgICAgICAgICBfdXJsb3Blbl93aXRoX3JldHJ5KHRlc3RfdXJsKQorIyAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCBleGM6CisjICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGMuY29kZSwgNDAxKQorIyAgICAgICAgZWxzZToKKyMgICAgICAgICAgICBzZWxmLmZhaWwoInVybG9wZW4oKSBzaG91bGQgaGF2ZSBmYWlsZWQgd2l0aCA0MDEiKQorIworIyAgICAgICAgIyBzdWNjZXNzCisjICAgICAgICBhdXRoX2hhbmRsZXIgPSB1cmxsaWIyLkhUVFBCYXNpY0F1dGhIYW5kbGVyKCkKKyMgICAgICAgIGF1dGhfaGFuZGxlci5hZGRfcGFzc3dvcmQodGVzdF9yZWFsbSwgdGVzdF9ob3N0cG9ydCwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF91c2VyLCB0ZXN0X3Bhc3N3b3JkKQorIyAgICAgICAgb3BlbmVyID0gdXJsbGliMi5idWlsZF9vcGVuZXIoYXV0aF9oYW5kbGVyKQorIyAgICAgICAgZiA9IG9wZW5lci5vcGVuKCdodHRwOi8vbG9jYWxob3N0LycpCisjICAgICAgICByZXNwb25zZSA9IF91cmxvcGVuX3dpdGhfcmV0cnkoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorIworIyAgICAgICAgIyBUaGUgJ3VzZXJpbmZvJyBVUkwgY29tcG9uZW50IGlzIGRlcHJlY2F0ZWQgYnkgUkZDIDM5ODYgZm9yIHNlY3VyaXR5CisjICAgICAgICAjIHJlYXNvbnMsIGxldCdzIG5vdCBpbXBsZW1lbnQgaXQhICAoaXQncyBhbHJlYWR5IGltcGxlbWVudGVkIGZvciBwcm94eQorIyAgICAgICAgIyBzcGVjaWZpY2F0aW9uIHN0cmluZ3MgKHRoYXQgaXMsIFVSTHMgb3IgYXV0aG9yaXRpZXMgc3BlY2lmeWluZyBhCisjICAgICAgICAjIHByb3h5KSwgc28gd2UgbXVzdCBrZWVwIHRoYXQpCisjICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhodHRwbGliLkludmFsaWRVUkwsCisjICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIyLnVybG9wZW4sICJodHRwOi8vZXZpbDp0aGluZ0BleGFtcGxlLmNvbSIpCisKKworY2xhc3MgQ2xvc2VTb2NrZXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICBpbXBvcnQgaHR0cGxpYgorCisgICAgICAgICMgY2FsbGluZyAuY2xvc2UoKSBvbiB1cmxsaWIyJ3MgcmVzcG9uc2Ugb2JqZWN0cyBzaG91bGQgY2xvc2UgdGhlCisgICAgICAgICMgdW5kZXJseWluZyBzb2NrZXQKKworICAgICAgICAjIGRlbHZlIGRlZXAgaW50byByZXNwb25zZSB0byBmZXRjaCBzb2NrZXQuX3NvY2tldG9iamVjdAorICAgICAgICByZXNwb25zZSA9IF91cmxvcGVuX3dpdGhfcmV0cnkoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICBhYnVzZWRfZmlsZW9iamVjdCA9IHJlc3BvbnNlLmZwCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnVzZWRfZmlsZW9iamVjdC5fX2NsYXNzX18gaXMgc29ja2V0Ll9maWxlb2JqZWN0KQorICAgICAgICBodHRwcmVzcG9uc2UgPSBhYnVzZWRfZmlsZW9iamVjdC5fc29jaworICAgICAgICBzZWxmLmFzc2VydFRydWUoaHR0cHJlc3BvbnNlLl9fY2xhc3NfXyBpcyBodHRwbGliLkhUVFBSZXNwb25zZSkKKyAgICAgICAgZmlsZW9iamVjdCA9IGh0dHByZXNwb25zZS5mcAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZW9iamVjdC5fX2NsYXNzX18gaXMgc29ja2V0Ll9maWxlb2JqZWN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmlsZW9iamVjdC5jbG9zZWQpCisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVvYmplY3QuY2xvc2VkKQorCitjbGFzcyBPdGhlck5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiAwOiAgIyBmb3IgZGVidWdnaW5nCisgICAgICAgICAgICBpbXBvcnQgbG9nZ2luZworICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2luZy5nZXRMb2dnZXIoInRlc3RfdXJsbGliMm5ldCIpCisgICAgICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihsb2dnaW5nLlN0cmVhbUhhbmRsZXIoKSkKKworICAgICMgWFhYIFRoZSByZXN0IG9mIHRoZXNlIHRlc3RzIGFyZW4ndCB2ZXJ5IGdvb2QgLS0gdGhleSBkb24ndCBjaGVjayBtdWNoLgorICAgICMgVGhleSBkbyBzb21ldGltZXMgY2F0Y2ggc29tZSBtYWpvciBkaXNhc3RlcnMsIHRob3VnaC4KKworICAgIGRlZiB0ZXN0X2Z0cChzZWxmKToKKyAgICAgICAgdXJscyA9IFsKKyAgICAgICAgICAgICdmdHA6Ly9mdHAua2VybmVsLm9yZy9wdWIvbGludXgva2VybmVsL1JFQURNRScsCisgICAgICAgICAgICAnZnRwOi8vZnRwLmtlcm5lbC5vcmcvcHViL2xpbnV4L2tlcm5lbC9ub24tZXhpc3RlbnQtZmlsZScsCisgICAgICAgICAgICAjJ2Z0cDovL2Z0cC5rZXJuZWwub3JnL3B1Yi9sZWVub3gva2VybmVsL3Rlc3QnLAorICAgICAgICAgICAgJ2Z0cDovL2dhdGVrZWVwZXIucmVzZWFyY2guY29tcGFxLmNvbS9wdWIvREVDL1NSQycKKyAgICAgICAgICAgICAgICAnL3Jlc2VhcmNoLXJlcG9ydHMvMDBSRUFETUUtTGVnYWwtUnVsZXMtUmVncycsCisgICAgICAgICAgICBdCisgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpKQorCisgICAgZGVmIHRlc3RfZmlsZShzZWxmKToKKyAgICAgICAgVEVTVEZOID0gdGVzdF9zdXBwb3J0LlRFU1RGTgorICAgICAgICBmID0gb3BlbihURVNURk4sICd3JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi53cml0ZSgnaGkgdGhlcmVcbicpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHVybHMgPSBbCisgICAgICAgICAgICAgICAgJ2ZpbGU6JytzYW5lcGF0aG5hbWUydXJsKG9zLnBhdGguYWJzcGF0aChURVNURk4pKSwKKyAgICAgICAgICAgICAgICAoJ2ZpbGU6Ly8vbm9uc2Vuc2VuYW1lL2V0Yy9wYXNzd2QnLCBOb25lLCB1cmxsaWIyLlVSTEVycm9yKSwKKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBzZWxmLl90ZXN0X3VybHModXJscywgc2VsZi5fZXh0cmFfaGFuZGxlcnMoKSwgcmV0cnk9VHJ1ZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXJsbGliMi51cmxvcGVuLCcuL3JlbGF0aXZlX3BhdGgvdG8vZmlsZScpCisKKyAgICAjIFhYWCBGb2xsb3dpbmcgdGVzdCBkZXBlbmRzIG9uIG1hY2hpbmUgY29uZmlndXJhdGlvbnMgdGhhdCBhcmUgaW50ZXJuYWwKKyAgICAjIHRvIENOUkkuICBOZWVkIHRvIHNldCB1cCBhIHB1YmxpYyBzZXJ2ZXIgd2l0aCB0aGUgcmlnaHQgYXV0aGVudGljYXRpb24KKyAgICAjIGNvbmZpZ3VyYXRpb24gZm9yIHRlc3QgcHVycG9zZXMuCisKKyMjICAgICBkZWYgdGVzdF9jbnJpKHNlbGYpOgorIyMgICAgICAgICBpZiBzb2NrZXQuZ2V0aG9zdG5hbWUoKSA9PSAnYml0ZGlkZGxlJzoKKyMjICAgICAgICAgICAgIGxvY2FsaG9zdCA9ICdiaXRkaWRkbGUuY25yaS5yZXN0b24udmEudXMnCisjIyAgICAgICAgIGVsaWYgc29ja2V0LmdldGhvc3RuYW1lKCkgPT0gJ2JpdGRpZGRsZS5jb25jZW50cmljLm5ldCc6CisjIyAgICAgICAgICAgICBsb2NhbGhvc3QgPSAnbG9jYWxob3N0JworIyMgICAgICAgICBlbHNlOgorIyMgICAgICAgICAgICAgbG9jYWxob3N0ID0gTm9uZQorIyMgICAgICAgICBpZiBsb2NhbGhvc3QgaXMgbm90IE5vbmU6CisjIyAgICAgICAgICAgICB1cmxzID0gWworIyMgICAgICAgICAgICAgICAgICdmaWxlOi8vJXMvZXRjL3Bhc3N3ZCcgJSBsb2NhbGhvc3QsCisjIyAgICAgICAgICAgICAgICAgJ2h0dHA6Ly8lcy9zaW1wbGUvJyAlIGxvY2FsaG9zdCwKKyMjICAgICAgICAgICAgICAgICAnaHR0cDovLyVzL2RpZ2VzdC8nICUgbG9jYWxob3N0LAorIyMgICAgICAgICAgICAgICAgICdodHRwOi8vJXMvbm90L2ZvdW5kLmgnICUgbG9jYWxob3N0LAorIyMgICAgICAgICAgICAgICAgIF0KKworIyMgICAgICAgICAgICAgYmF1dGggPSBIVFRQQmFzaWNBdXRoSGFuZGxlcigpCisjIyAgICAgICAgICAgICBiYXV0aC5hZGRfcGFzc3dvcmQoJ2Jhc2ljX3Rlc3RfcmVhbG0nLCBsb2NhbGhvc3QsICdqaHlsdG9uJywKKyMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncGFzc3dvcmQnKQorIyMgICAgICAgICAgICAgZGF1dGggPSBIVFRQRGlnZXN0QXV0aEhhbmRsZXIoKQorIyMgICAgICAgICAgICAgZGF1dGguYWRkX3Bhc3N3b3JkKCdkaWdlc3RfdGVzdF9yZWFsbScsIGxvY2FsaG9zdCwgJ2poeWx0b24nLAorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXNzd29yZCcpCisKKyMjICAgICAgICAgICAgIHNlbGYuX3Rlc3RfdXJscyh1cmxzLCBzZWxmLl9leHRyYV9oYW5kbGVycygpK1tiYXV0aCwgZGF1dGhdKQorCisgICAgZGVmIHRlc3RfdXJsd2l0aGZyYWcoc2VsZik6CisgICAgICAgIHVybHdpdGhfZnJhZyA9ICJodHRwOi8vZG9jcy5weXRob24ub3JnLzIvZ2xvc3NhcnkuaHRtbCNnbG9zc2FyeSIKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybHdpdGhfZnJhZyk6CisgICAgICAgICAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QodXJsd2l0aF9mcmFnKQorICAgICAgICAgICAgcmVzID0gdXJsbGliMi51cmxvcGVuKHJlcSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLmdldHVybCgpLAorICAgICAgICAgICAgICAgICAgICAiaHR0cDovL2RvY3MucHl0aG9uLm9yZy8yL2dsb3NzYXJ5Lmh0bWwjZ2xvc3NhcnkiKQorCisgICAgZGVmIHRlc3RfZmlsZW5vKHNlbGYpOgorICAgICAgICByZXEgPSB1cmxsaWIyLlJlcXVlc3QoImh0dHA6Ly93d3cucHl0aG9uLm9yZyIpCisgICAgICAgIG9wZW5lciA9IHVybGxpYjIuYnVpbGRfb3BlbmVyKCkKKyAgICAgICAgcmVzID0gb3BlbmVyLm9wZW4ocmVxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXMuZmlsZW5vKCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJIVFRQUmVzcG9uc2Ugb2JqZWN0IHNob3VsZCByZXR1cm4gYSB2YWxpZCBmaWxlbm8iKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcmVzLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X2N1c3RvbV9oZWFkZXJzKHNlbGYpOgorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5leGFtcGxlLmNvbSIKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybCk6CisgICAgICAgICAgICBvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcigpCisgICAgICAgICAgICByZXF1ZXN0ID0gdXJsbGliMi5SZXF1ZXN0KHVybCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVxdWVzdC5oZWFkZXJfaXRlbXMoKSkKKyAgICAgICAgICAgIG9wZW5lci5vcGVuKHJlcXVlc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVxdWVzdC5oZWFkZXJfaXRlbXMoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXF1ZXN0Lmhhc19oZWFkZXIoJ1VzZXItYWdlbnQnKSkKKyAgICAgICAgICAgIHJlcXVlc3QuYWRkX2hlYWRlcignVXNlci1BZ2VudCcsJ1Rlc3QtQWdlbnQnKQorICAgICAgICAgICAgb3BlbmVyLm9wZW4ocmVxdWVzdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdC5nZXRfaGVhZGVyKCdVc2VyLWFnZW50JyksJ1Rlc3QtQWdlbnQnKQorCisgICAgZGVmIHRlc3Rfc2l0ZXNfbm9fY29ubmVjdGlvbl9jbG9zZShzZWxmKToKKyAgICAgICAgIyBTb21lIHNpdGVzIGRvIG5vdCBzZW5kIENvbm5lY3Rpb246IGNsb3NlIGhlYWRlci4KKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aG9zZSB3b3JrIHByb3Blcmx5LiAoI2lzc3VlMTI1NzYpCisKKyAgICAgICAgVVJMID0gJ2h0dHA6Ly93d3cuaW1kYi5jb20nICMgTm8gQ29ubmVjdGlvbjpjbG9zZQorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQoVVJMKToKKyAgICAgICAgICAgIHJlcSA9IHVybGxpYjIudXJsb3BlbihVUkwpCisgICAgICAgICAgICByZXMgPSByZXEucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzKQorCisgICAgZGVmIF90ZXN0X3VybHMoc2VsZiwgdXJscywgaGFuZGxlcnMsIHJldHJ5PVRydWUpOgorICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICBpbXBvcnQgbG9nZ2luZworICAgICAgICBkZWJ1ZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCJ0ZXN0X3VybGxpYjIiKS5kZWJ1ZworCisgICAgICAgIHVybG9wZW4gPSB1cmxsaWIyLmJ1aWxkX29wZW5lcigqaGFuZGxlcnMpLm9wZW4KKyAgICAgICAgaWYgcmV0cnk6CisgICAgICAgICAgICB1cmxvcGVuID0gX3dyYXBfd2l0aF9yZXRyeV90aHJpY2UodXJsb3BlbiwgdXJsbGliMi5VUkxFcnJvcikKKworICAgICAgICBmb3IgdXJsIGluIHVybHM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHVybCwgdHVwbGUpOgorICAgICAgICAgICAgICAgIHVybCwgcmVxLCBleHBlY3RlZF9lcnIgPSB1cmwKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVxID0gZXhwZWN0ZWRfZXJyID0gTm9uZQorICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHVybCk6CisgICAgICAgICAgICAgICAgZGVidWcodXJsKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZiA9IHVybG9wZW4odXJsLCByZXEsIFRJTUVPVVQpCisgICAgICAgICAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhlcnIpCisgICAgICAgICAgICAgICAgICAgIGlmIGV4cGVjdGVkX2VycjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9ICgiRGlkbid0IGdldCBleHBlY3RlZCBlcnJvcihzKSAlcyBmb3IgJXMgJXMsIGdvdCAlczogJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfZXJyLCB1cmwsIHJlcSwgdHlwZShlcnIpLCBlcnIpKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGVyciwgZXhwZWN0ZWRfZXJyLCBtc2cpCisgICAgICAgICAgICAgICAgZXhjZXB0IHVybGxpYjIuVVJMRXJyb3IgYXMgZXJyOgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGVyclswXSwgc29ja2V0LnRpbWVvdXQpOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiPHRpbWVvdXQ6ICVzPiIgJSB1cmwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCh1cmwpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWcoInJlYWQgJWQgYnl0ZXMiICUgbGVuKGJ1ZikpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIjx0aW1lb3V0OiAlcz4iICUgdXJsCisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgZGVidWcoIioqKioqKioqIG5leHQgdXJsIGNvbWluZyB1cC4uLiIpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDAuMSkKKworICAgIGRlZiBfZXh0cmFfaGFuZGxlcnMoc2VsZik6CisgICAgICAgIGhhbmRsZXJzID0gW10KKworICAgICAgICBjZmggPSB1cmxsaWIyLkNhY2hlRlRQSGFuZGxlcigpCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjZmguY2xlYXJfY2FjaGUpCisgICAgICAgIGNmaC5zZXRUaW1lb3V0KDEpCisgICAgICAgIGhhbmRsZXJzLmFwcGVuZChjZmgpCisKKyAgICAgICAgcmV0dXJuIGhhbmRsZXJzCisKKworY2xhc3MgVGltZW91dFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2h0dHBfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnIgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQodXJsLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAgICAgdSA9IF91cmxvcGVuX3dpdGhfcmV0cnkodXJsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuZnAuX3NvY2suZnAuX3NvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF9odHRwX2RlZmF1bHRfdGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmciCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCh1cmwpOgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDYwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHVybCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuZnAuX3NvY2suZnAuX3NvY2suZ2V0dGltZW91dCgpLCA2MCkKKworICAgIGRlZiB0ZXN0X2h0dHBfbm9fdGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHVybCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmciCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCh1cmwpOgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDYwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHVybCwgdGltZW91dD1Ob25lKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmZwLl9zb2NrLmZwLl9zb2NrLmdldHRpbWVvdXQoKSBpcyBOb25lKQorCisgICAgZGVmIHRlc3RfaHR0cF90aW1lb3V0KHNlbGYpOgorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnIgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC50cmFuc2llbnRfaW50ZXJuZXQodXJsKToKKyAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHVybCwgdGltZW91dD0xMjApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuZnAuX3NvY2suZnAuX3NvY2suZ2V0dGltZW91dCgpLCAxMjApCisKKyAgICBGVFBfSE9TVCA9ICJmdHA6Ly9mdHAubWlycm9yLm5sL3B1Yi9nbnUvIgorCisgICAgZGVmIHRlc3RfZnRwX2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHNlbGYuRlRQX0hPU1QsIHRpbWVvdXQ9Tm9uZSk6CisgICAgICAgICAgICB1ID0gX3VybG9wZW5fd2l0aF9yZXRyeShzZWxmLkZUUF9IT1NUKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuZnAuZnAuX3NvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF9mdHBfZGVmYXVsdF90aW1lb3V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHNlbGYuRlRQX0hPU1QpOgorICAgICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDYwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHUgPSBfdXJsb3Blbl93aXRoX3JldHJ5KHNlbGYuRlRQX0hPU1QpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmZwLmZwLl9zb2NrLmdldHRpbWVvdXQoKSwgNjApCisKKyAgICBkZWYgdGVzdF9mdHBfbm9fdGltZW91dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldChzZWxmLkZUUF9IT1NUKToKKyAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCg2MCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB1ID0gX3VybG9wZW5fd2l0aF9yZXRyeShzZWxmLkZUUF9IT1NULCB0aW1lb3V0PU5vbmUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dChOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUuZnAuZnAuX3NvY2suZ2V0dGltZW91dCgpIGlzIE5vbmUpCisKKyAgICBkZWYgdGVzdF9mdHBfdGltZW91dChzZWxmKToKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQudHJhbnNpZW50X2ludGVybmV0KHNlbGYuRlRQX0hPU1QpOgorICAgICAgICAgICAgdSA9IF91cmxvcGVuX3dpdGhfcmV0cnkoc2VsZi5GVFBfSE9TVCwgdGltZW91dD02MCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5mcC5mcC5fc29jay5nZXR0aW1lb3V0KCksIDYwKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoIm5ldHdvcmsiKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQXV0aFRlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJOZXR3b3JrVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zZVNvY2tldFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Y5YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2Y5YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkODgzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxsaWJuZXQucHkKQEAgLTAsMCArMSwyMTMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCB1cmxsaWIKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKKworbWltZXRvb2xzID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoIm1pbWV0b29scyIsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworCitkZWYgX29wZW5fd2l0aF9yZXRyeShmdW5jLCBob3N0LCAqYXJncywgKiprd2FyZ3MpOgorICAgICMgQ29ubmVjdGluZyB0byByZW1vdGUgaG9zdHMgaXMgZmxha3kuICBNYWtlIGl0IG1vcmUgcm9idXN0CisgICAgIyBieSByZXRyeWluZyB0aGUgY29ubmVjdGlvbiBzZXZlcmFsIHRpbWVzLgorICAgIGZvciBpIGluIHJhbmdlKDMpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZnVuYyhob3N0LCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBsYXN0X2V4YzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJhaXNlCisgICAgcmFpc2UgbGFzdF9leGMKKworCitjbGFzcyBVUkxUaW1lb3V0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBUSU1FT1VUID0gMTAuMAorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoc2VsZi5USU1FT1VUKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoTm9uZSkKKworICAgIGRlZiB0ZXN0VVJMcmVhZChzZWxmKToKKyAgICAgICAgZiA9IF9vcGVuX3dpdGhfcmV0cnkodXJsbGliLnVybG9wZW4sICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgeCA9IGYucmVhZCgpCisKK2NsYXNzIHVybG9wZW5OZXR3b3JrVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIHVybGxpYi51cmxvcGVuIHVzaW5nIHRoZSBuZXR3b3JrLgorCisgICAgVGhlc2UgdGVzdHMgYXJlIG5vdCBleGhhdXN0aXZlLiAgQXNzdW1pbmcgdGhhdCB0ZXN0aW5nIHVzaW5nIGZpbGVzIGRvZXMgYQorICAgIGdvb2Qgam9iIG92ZXJhbGwgb2Ygc29tZSBvZiB0aGUgYmFzaWMgaW50ZXJmYWNlIGZlYXR1cmVzLiAgVGhlcmUgYXJlIG5vCisgICAgdGVzdHMgZXhlcmNpc2luZyB0aGUgb3B0aW9uYWwgJ2RhdGEnIGFuZCAncHJveGllcycgYXJndW1lbnRzLiAgTm8gdGVzdHMKKyAgICBmb3IgdHJhbnNwYXJlbnQgcmVkaXJlY3Rpb24gaGF2ZSBiZWVuIHdyaXR0ZW4uCisKKyAgICBzZXRVcCBpcyBub3QgdXNlZCBmb3IgYWx3YXlzIGNvbnN0cnVjdGluZyBhIGNvbm5lY3Rpb24gdG8KKyAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvIHNpbmNlIHRoZXJlIGEgZmV3IHRlc3RzIHRoYXQgZG9uJ3QgdXNlIHRoYXQgYWRkcmVzcworICAgIGFuZCBtYWtpbmcgYSBjb25uZWN0aW9uIGlzIGV4cGVuc2l2ZSBlbm91Z2ggdG8gd2FycmFudCBtaW5pbWl6aW5nIHVubmVlZGVkCisgICAgY29ubmVjdGlvbnMuCisKKyAgICAiIiIKKworICAgIGRlZiB1cmxvcGVuKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIF9vcGVuX3dpdGhfcmV0cnkodXJsbGliLnVybG9wZW4sICphcmdzKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgU2ltcGxlIHRlc3QgZXhwZWN0ZWQgdG8gcGFzcy4KKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICBmb3IgYXR0ciBpbiAoInJlYWQiLCAicmVhZGxpbmUiLCAicmVhZGxpbmVzIiwgImZpbGVubyIsICJjbG9zZSIsCisgICAgICAgICAgICAgICAgICAgICAiaW5mbyIsICJnZXR1cmwiKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9wZW5fdXJsLCBhdHRyKSwgIm9iamVjdCByZXR1cm5lZCBmcm9tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsb3BlbiBsYWNrcyB0aGUgJXMgYXR0cmlidXRlIiAlIGF0dHIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVuX3VybC5yZWFkKCksICJjYWxsaW5nICdyZWFkJyBmYWlsZWQiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVzKHNlbGYpOgorICAgICAgICAjIFRlc3QgYm90aCByZWFkbGluZSBhbmQgcmVhZGxpbmVzLgorICAgICAgICBvcGVuX3VybCA9IHNlbGYudXJsb3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShvcGVuX3VybC5yZWFkbGluZSgpLCBiYXNlc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZSBkaWQgbm90IHJldHVybiBhIHN0cmluZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uob3Blbl91cmwucmVhZGxpbmVzKCksIGxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRsaW5lcyBkaWQgbm90IHJldHVybiBhIGxpc3QiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfaW5mbyhzZWxmKToKKyAgICAgICAgIyBUZXN0ICdpbmZvJy4KKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGluZm9fb2JqLCBtaW1ldG9vbHMuTWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmVkIGJ5ICdpbmZvJyBpcyBub3QgYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZSBvZiBtaW1ldG9vbHMuTWVzc2FnZSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldHN1YnR5cGUoKSwgImh0bWwiKQorCisgICAgZGVmIHRlc3RfZ2V0dXJsKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBzYW1lIFVSTCBhcyBvcGVuZWQgaXMgcmV0dXJuZWQgYnkgZ2V0dXJsLgorICAgICAgICBVUkwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnLyIKKyAgICAgICAgb3Blbl91cmwgPSBzZWxmLnVybG9wZW4oVVJMKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBnb3R0ZW5fdXJsID0gb3Blbl91cmwuZ2V0dXJsKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIG9wZW5fdXJsLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3R0ZW5fdXJsLCBVUkwpCisKKyAgICBkZWYgdGVzdF9nZXRjb2RlKHNlbGYpOgorICAgICAgICAjIHRlc3QgZ2V0Y29kZSgpIHdpdGggdGhlIGZhbmN5IG9wZW5lciB0byBnZXQgNDA0IGVycm9yIGNvZGVzCisgICAgICAgIFVSTCA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcvWFhYaW52YWxpZFhYWCIKKyAgICAgICAgb3Blbl91cmwgPSB1cmxsaWIuRmFuY3lVUkxvcGVuZXIoKS5vcGVuKFVSTCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29kZSA9IG9wZW5fdXJsLmdldGNvZGUoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvZGUsIDQwNCkKKworICAgIGRlZiB0ZXN0X2ZpbGVubyhzZWxmKToKKyAgICAgICAgaWYgKHN5cy5wbGF0Zm9ybSBpbiAoJ3dpbjMyJywpIG9yCisgICAgICAgICAgICAgICAgbm90IGhhc2F0dHIob3MsICdmZG9wZW4nKSk6CisgICAgICAgICAgICAjIE9uIFdpbmRvd3MsIHNvY2tldCBoYW5kbGVzIGFyZSBub3QgZmlsZSBkZXNjcmlwdG9yczsgdGhpcworICAgICAgICAgICAgIyB0ZXN0IGNhbid0IHBhc3Mgb24gV2luZG93cy4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIE1ha2Ugc3VyZSBmZCByZXR1cm5lZCBieSBmaWxlbm8gaXMgdmFsaWQuCisgICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgZmQgPSBvcGVuX3VybC5maWxlbm8oKQorICAgICAgICBGSUxFID0gb3MuZmRvcGVuKGZkKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRklMRS5yZWFkKCksICJyZWFkaW5nIGZyb20gZmlsZSBjcmVhdGVkIHVzaW5nIGZkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGJ5IGZpbGVubyBmYWlsZWQiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRklMRS5jbG9zZSgpCisKKyAgICBkZWYgdGVzdF9iYWRfYWRkcmVzcyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgcHJvcGVyIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiBjb25uZWN0aW5nIHRvIGEgYm9ndXMKKyAgICAgICAgIyBhZGRyZXNzLgorICAgICAgICBib2d1c19kb21haW4gPSAic2FkZmxranNhc2YuaS5udmFsaS5kIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShib2d1c19kb21haW4pCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFRoaXMgaGFwcGVucyB3aXRoIHNvbWUgb3ZlcnplYWxvdXMgRE5TIHByb3ZpZGVycyBzdWNoIGFzIE9wZW5ETlMKKyAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoIiVyIHNob3VsZCBub3QgcmVzb2x2ZSBmb3IgdGVzdCB0byB3b3JrIiAlIGJvZ3VzX2RvbWFpbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTRiBwYXRjaCA4MDk5MTU6ICBJbiBTZXAgMjAwMywgVmVyaVNpZ24gc3RhcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAjIGhpZ2hqYWNraW5nIGludmFsaWQgLmNvbSBhbmQgLm5ldCBhZGRyZXNzZXMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyBib29zdCB0cmFmZmljIHRvIHRoZWlyIG93biBzaXRlLiAgVGhpcyB0ZXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RhcnRlZCBmYWlsaW5nIHRoZW4uICBPbmUgaG9wZXMgdGhlIC5pbnZhbGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgZG9tYWluIHdpbGwgYmUgc3BhcmVkIHRvIHNlcnZlIGl0cyBkZWZpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICMgcHVycG9zZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIyB1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly93d3cuc2FkZmxranNhc2FkZi5jb20vIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnVybG9wZW4sICJodHRwOi8vc2FkZmxranNhc2YuaS5udmFsaS5kLyIpCisKK2NsYXNzIHVybHJldHJpZXZlTmV0d29ya1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0cyB1cmxsaWIudXJscmV0cmlldmUgdXNpbmcgdGhlIG5ldHdvcmsuIiIiCisKKyAgICBkZWYgdXJscmV0cmlldmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gX29wZW5fd2l0aF9yZXRyeSh1cmxsaWIudXJscmV0cmlldmUsICphcmdzKQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgVGVzdCBiYXNpYyBmdW5jdGlvbmFsaXR5LgorICAgICAgICBmaWxlX2xvY2F0aW9uLGluZm8gPSBzZWxmLnVybHJldHJpZXZlKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZpbGVfbG9jYXRpb24pLCAiZmlsZSBsb2NhdGlvbiByZXR1cm5lZCBieSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgdXJscmV0cmlldmUgaXMgbm90IGEgdmFsaWQgcGF0aCIpCisgICAgICAgIEZJTEUgPSBmaWxlKGZpbGVfbG9jYXRpb24pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGSUxFLnJlYWQoKSwgInJlYWRpbmcgZnJvbSB0aGUgZmlsZSBsb2NhdGlvbiByZXR1cm5lZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5IHVybHJldHJpZXZlIGZhaWxlZCIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBGSUxFLmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnVubGluayhmaWxlX2xvY2F0aW9uKQorCisgICAgZGVmIHRlc3Rfc3BlY2lmaWVkX3BhdGgoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgc3BlY2lmeWluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGZpbGUgdG8gd3JpdGUgdG8gd29ya3MuCisgICAgICAgIGZpbGVfbG9jYXRpb24saW5mbyA9IHNlbGYudXJscmV0cmlldmUoImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5URVNURk4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9sb2NhdGlvbiwgdGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZpbGVfbG9jYXRpb24pKQorICAgICAgICBGSUxFID0gZmlsZShmaWxlX2xvY2F0aW9uKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRklMRS5yZWFkKCksICJyZWFkaW5nIGZyb20gdGVtcG9yYXJ5IGZpbGUgZmFpbGVkIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIEZJTEUuY2xvc2UoKQorICAgICAgICAgICAgb3MudW5saW5rKGZpbGVfbG9jYXRpb24pCisKKyAgICBkZWYgdGVzdF9oZWFkZXIoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIGhlYWRlciByZXR1cm5lZCBhcyAybmQgdmFsdWUgZnJvbSB1cmxyZXRyaWV2ZSBpcyBnb29kLgorICAgICAgICBmaWxlX2xvY2F0aW9uLCBoZWFkZXIgPSBzZWxmLnVybHJldHJpZXZlKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKKyAgICAgICAgb3MudW5saW5rKGZpbGVfbG9jYXRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShoZWFkZXIsIG1pbWV0b29scy5NZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgbWltZXRvb2xzLk1lc3NhZ2UiKQorCisgICAgZGVmIHRlc3RfZGF0YV9oZWFkZXIoc2VsZik6CisgICAgICAgIGxvZ28gPSAiaHR0cDovL3d3dy5weXRob24ub3JnL2NvbW11bml0eS9sb2dvcy9weXRob24tbG9nby1tYXN0ZXItdjMtVE0ucG5nIgorICAgICAgICBmaWxlX2xvY2F0aW9uLCBmaWxlaGVhZGVycyA9IHNlbGYudXJscmV0cmlldmUobG9nbykKKyAgICAgICAgb3MudW5saW5rKGZpbGVfbG9jYXRpb24pCisgICAgICAgIGRhdGV2YWx1ZSA9IGZpbGVoZWFkZXJzLmdldGhlYWRlcignRGF0ZScpCisgICAgICAgIGRhdGVmb3JtYXQgPSAnJWEsICVkICViICVZICVIOiVNOiVTIEdNVCcKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGltZS5zdHJwdGltZShkYXRldmFsdWUsIGRhdGVmb3JtYXQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdEYXRlIHZhbHVlIG5vdCBpbiAlciBmb3JtYXQnLCBkYXRlZm9ybWF0KQorCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5yZXF1aXJlcygnbmV0d29yaycpCisgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygKKyAgICAgICAgICAgICgidXJsbGliLnVybG9wZW4uLiBoYXMgYmVlbiByZW1vdmVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVVJMVGltZW91dFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsb3Blbk5ldHdvcmtUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxyZXRyaWV2ZU5ldHdvcmtUZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYm5ldC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwMTMzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYm5ldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYm5ldC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwMTMzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybGxpYm5ldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJscGFyc2UucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxwYXJzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmViZmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXJscGFyc2UucHkKQEAgLTAsMCArMSw1NzEgQEAKKyMhIC91c3IvYmluL2VudiBweXRob24KKworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IHVybHBhcnNlCisKK1JGQzE4MDhfQkFTRSA9ICJodHRwOi8vYS9iL2MvZDtwP3EjZiIKK1JGQzIzOTZfQkFTRSA9ICJodHRwOi8vYS9iL2MvZDtwP3EiCitSRkMzOTg2X0JBU0UgPSAnaHR0cDovL2EvYi9jL2Q7cD9xJworU0lNUExFX0JBU0UgID0gJ2h0dHA6Ly9hL2IvYy9kJworCisjIEEgbGlzdCBvZiB0ZXN0IGNhc2VzLiAgRWFjaCB0ZXN0IGNhc2UgaXMgYSB0d28tdHVwbGUgdGhhdCBjb250YWlucworIyBhIHN0cmluZyB3aXRoIHRoZSBxdWVyeSBhbmQgYSBkaWN0aW9uYXJ5IHdpdGggdGhlIGV4cGVjdGVkIHJlc3VsdC4KKworcGFyc2VfcXNsX3Rlc3RfY2FzZXMgPSBbCisgICAgKCIiLCBbXSksCisgICAgKCImIiwgW10pLAorICAgICgiJiYiLCBbXSksCisgICAgKCI9IiwgWygnJywgJycpXSksCisgICAgKCI9YSIsIFsoJycsICdhJyldKSwKKyAgICAoImEiLCBbKCdhJywgJycpXSksCisgICAgKCJhPSIsIFsoJ2EnLCAnJyldKSwKKyAgICAoImE9IiwgWygnYScsICcnKV0pLAorICAgICgiJmE9YiIsIFsoJ2EnLCAnYicpXSksCisgICAgKCJhPWErYiZiPWIrYyIsIFsoJ2EnLCAnYSBiJyksICgnYicsICdiIGMnKV0pLAorICAgICgiYT0xJmE9MiIsIFsoJ2EnLCAnMScpLCAoJ2EnLCAnMicpXSksCitdCisKK2NsYXNzIFVybFBhcnNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrUm91bmR0cmlwcyhzZWxmLCB1cmwsIHBhcnNlZCwgc3BsaXQpOgorICAgICAgICByZXN1bHQgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBwYXJzZWQpCisgICAgICAgIHQgPSAocmVzdWx0LnNjaGVtZSwgcmVzdWx0Lm5ldGxvYywgcmVzdWx0LnBhdGgsCisgICAgICAgICAgICAgcmVzdWx0LnBhcmFtcywgcmVzdWx0LnF1ZXJ5LCByZXN1bHQuZnJhZ21lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgcGFyc2VkKQorICAgICAgICAjIHB1dCBpdCBiYWNrIHRvZ2V0aGVyIGFuZCBpdCBzaG91bGQgYmUgdGhlIHNhbWUKKyAgICAgICAgcmVzdWx0MiA9IHVybHBhcnNlLnVybHVucGFyc2UocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDIsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQyLCByZXN1bHQuZ2V0dXJsKCkpCisKKyAgICAgICAgIyB0aGUgcmVzdWx0IG9mIGdldHVybCgpIGlzIGEgZml4cG9pbnQ7IHdlIGNhbiBhbHdheXMgcGFyc2UgaXQKKyAgICAgICAgIyBhZ2FpbiB0byBnZXQgdGhlIHNhbWUgcmVzdWx0OgorICAgICAgICByZXN1bHQzID0gdXJscGFyc2UudXJscGFyc2UocmVzdWx0LmdldHVybCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuZ2V0dXJsKCksIHJlc3VsdC5nZXR1cmwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLCAgICAgICAgICByZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5zY2hlbWUsICAgcmVzdWx0LnNjaGVtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLm5ldGxvYywgICByZXN1bHQubmV0bG9jKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGF0aCwgICAgIHJlc3VsdC5wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGFyYW1zLCAgIHJlc3VsdC5wYXJhbXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5xdWVyeSwgICAgcmVzdWx0LnF1ZXJ5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuZnJhZ21lbnQsIHJlc3VsdC5mcmFnbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnVzZXJuYW1lLCByZXN1bHQudXNlcm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXNzd29yZCwgcmVzdWx0LnBhc3N3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuaG9zdG5hbWUsIHJlc3VsdC5ob3N0bmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBvcnQsICAgICByZXN1bHQucG9ydCkKKworICAgICAgICAjIGNoZWNrIHRoZSByb3VuZHRyaXAgdXNpbmcgdXJsc3BsaXQoKSBhcyB3ZWxsCisgICAgICAgIHJlc3VsdCA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHNwbGl0KQorICAgICAgICB0ID0gKHJlc3VsdC5zY2hlbWUsIHJlc3VsdC5uZXRsb2MsIHJlc3VsdC5wYXRoLAorICAgICAgICAgICAgIHJlc3VsdC5xdWVyeSwgcmVzdWx0LmZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHNwbGl0KQorICAgICAgICByZXN1bHQyID0gdXJscGFyc2UudXJsdW5zcGxpdChyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MiwgdXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDIsIHJlc3VsdC5nZXR1cmwoKSkKKworICAgICAgICAjIGNoZWNrIHRoZSBmaXhwb2ludCBwcm9wZXJ0eSBvZiByZS1wYXJzaW5nIHRoZSByZXN1bHQgb2YgZ2V0dXJsKCkKKyAgICAgICAgcmVzdWx0MyA9IHVybHBhcnNlLnVybHNwbGl0KHJlc3VsdC5nZXR1cmwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmdldHVybCgpLCByZXN1bHQuZ2V0dXJsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MywgICAgICAgICAgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuc2NoZW1lLCAgIHJlc3VsdC5zY2hlbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5uZXRsb2MsICAgcmVzdWx0Lm5ldGxvYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhdGgsICAgICByZXN1bHQucGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnF1ZXJ5LCAgICByZXN1bHQucXVlcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5mcmFnbWVudCwgcmVzdWx0LmZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMudXNlcm5hbWUsIHJlc3VsdC51c2VybmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhc3N3b3JkLCByZXN1bHQucGFzc3dvcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5ob3N0bmFtZSwgcmVzdWx0Lmhvc3RuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucG9ydCwgICAgIHJlc3VsdC5wb3J0KQorCisgICAgZGVmIHRlc3RfcXNsKHNlbGYpOgorICAgICAgICBmb3Igb3JpZywgZXhwZWN0IGluIHBhcnNlX3FzbF90ZXN0X2Nhc2VzOgorICAgICAgICAgICAgcmVzdWx0ID0gdXJscGFyc2UucGFyc2VfcXNsKG9yaWcsIGtlZXBfYmxhbmtfdmFsdWVzPVRydWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0LCAiRXJyb3IgcGFyc2luZyAlciIgJSBvcmlnKQorICAgICAgICAgICAgZXhwZWN0X3dpdGhvdXRfYmxhbmtzID0gW3YgZm9yIHYgaW4gZXhwZWN0IGlmIGxlbih2WzFdKV0KKyAgICAgICAgICAgIHJlc3VsdCA9IHVybHBhcnNlLnBhcnNlX3FzbChvcmlnLCBrZWVwX2JsYW5rX3ZhbHVlcz1GYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBleHBlY3Rfd2l0aG91dF9ibGFua3MsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nICVyIiAlIG9yaWcpCisKKworICAgIGRlZiB0ZXN0X3JvdW5kdHJpcHMoc2VsZik6CisgICAgICAgIHRlc3RjYXNlcyA9IFsKKyAgICAgICAgICAgICgnZmlsZTovLy90bXAvanVuay50eHQnLAorICAgICAgICAgICAgICgnZmlsZScsICcnLCAnL3RtcC9qdW5rLnR4dCcsICcnLCAnJywgJycpLAorICAgICAgICAgICAgICgnZmlsZScsICcnLCAnL3RtcC9qdW5rLnR4dCcsICcnLCAnJykpLAorICAgICAgICAgICAgKCdpbWFwOi8vbWFpbC5weXRob24ub3JnL21ib3gxJywKKyAgICAgICAgICAgICAoJ2ltYXAnLCAnbWFpbC5weXRob24ub3JnJywgJy9tYm94MScsICcnLCAnJywgJycpLAorICAgICAgICAgICAgICgnaW1hcCcsICdtYWlsLnB5dGhvbi5vcmcnLCAnL21ib3gxJywgJycsICcnKSksCisgICAgICAgICAgICAoJ21tczovL3dtcy5zeXMuaGluZXQubmV0L2N0cy9EcmFtYS8wOTAwNjI1MTEwMC5hc2YnLAorICAgICAgICAgICAgICgnbW1zJywgJ3dtcy5zeXMuaGluZXQubmV0JywgJy9jdHMvRHJhbWEvMDkwMDYyNTExMDAuYXNmJywKKyAgICAgICAgICAgICAgJycsICcnLCAnJyksCisgICAgICAgICAgICAgKCdtbXMnLCAnd21zLnN5cy5oaW5ldC5uZXQnLCAnL2N0cy9EcmFtYS8wOTAwNjI1MTEwMC5hc2YnLAorICAgICAgICAgICAgICAnJywgJycpKSwKKyAgICAgICAgICAgICgnbmZzOi8vc2VydmVyL3BhdGgvdG8vZmlsZS50eHQnLAorICAgICAgICAgICAgICgnbmZzJywgJ3NlcnZlcicsICcvcGF0aC90by9maWxlLnR4dCcsICAnJywgJycsICcnKSwKKyAgICAgICAgICAgICAoJ25mcycsICdzZXJ2ZXInLCAnL3BhdGgvdG8vZmlsZS50eHQnLCAnJywgJycpKSwKKyAgICAgICAgICAgICgnc3ZuK3NzaDovL3N2bi56b3BlLm9yZy9yZXBvcy9tYWluL1pDb25maWcvdHJ1bmsvJywKKyAgICAgICAgICAgICAoJ3N2bitzc2gnLCAnc3ZuLnpvcGUub3JnJywgJy9yZXBvcy9tYWluL1pDb25maWcvdHJ1bmsvJywKKyAgICAgICAgICAgICAgJycsICcnLCAnJyksCisgICAgICAgICAgICAgKCdzdm4rc3NoJywgJ3N2bi56b3BlLm9yZycsICcvcmVwb3MvbWFpbi9aQ29uZmlnL3RydW5rLycsCisgICAgICAgICAgICAgICcnLCAnJykpLAorICAgICAgICAgICAgKCdnaXQrc3NoOi8vZ2l0QGdpdGh1Yi5jb20vdXNlci9wcm9qZWN0LmdpdCcsCisgICAgICAgICAgICAoJ2dpdCtzc2gnLCAnZ2l0QGdpdGh1Yi5jb20nLCcvdXNlci9wcm9qZWN0LmdpdCcsCisgICAgICAgICAgICAgJycsJycsJycpLAorICAgICAgICAgICAgKCdnaXQrc3NoJywgJ2dpdEBnaXRodWIuY29tJywnL3VzZXIvcHJvamVjdC5naXQnLAorICAgICAgICAgICAgICcnLCAnJykpCisgICAgICAgICAgICBdCisgICAgICAgIGZvciB1cmwsIHBhcnNlZCwgc3BsaXQgaW4gdGVzdGNhc2VzOgorICAgICAgICAgICAgc2VsZi5jaGVja1JvdW5kdHJpcHModXJsLCBwYXJzZWQsIHNwbGl0KQorCisgICAgZGVmIHRlc3RfaHR0cF9yb3VuZHRyaXBzKHNlbGYpOgorICAgICAgICAjIHVybHBhcnNlLnVybHNwbGl0IHRyZWF0cyAnaHR0cDonIGFzIGFuIG9wdGltaXplZCBzcGVjaWFsIGNhc2UsCisgICAgICAgICMgc28gd2UgdGVzdCBib3RoICdodHRwOicgYW5kICdodHRwczonIGluIGFsbCB0aGUgZm9sbG93aW5nLgorICAgICAgICAjIFRocmVlIGNoZWVycyBmb3Igd2hpdGUgYm94IGtub3dsZWRnZSEKKyAgICAgICAgdGVzdGNhc2VzID0gWworICAgICAgICAgICAgKCc6Ly93d3cucHl0aG9uLm9yZycsCisgICAgICAgICAgICAgKCd3d3cucHl0aG9uLm9yZycsICcnLCAnJywgJycsICcnKSwKKyAgICAgICAgICAgICAoJ3d3dy5weXRob24ub3JnJywgJycsICcnLCAnJykpLAorICAgICAgICAgICAgKCc6Ly93d3cucHl0aG9uLm9yZyNhYmMnLAorICAgICAgICAgICAgICgnd3d3LnB5dGhvbi5vcmcnLCAnJywgJycsICcnLCAnYWJjJyksCisgICAgICAgICAgICAgKCd3d3cucHl0aG9uLm9yZycsICcnLCAnJywgJ2FiYycpKSwKKyAgICAgICAgICAgICgnOi8vd3d3LnB5dGhvbi5vcmc/cT1hYmMnLAorICAgICAgICAgICAgICgnd3d3LnB5dGhvbi5vcmcnLCAnJywgJycsICdxPWFiYycsICcnKSwKKyAgICAgICAgICAgICAoJ3d3dy5weXRob24ub3JnJywgJycsICdxPWFiYycsICcnKSksCisgICAgICAgICAgICAoJzovL3d3dy5weXRob24ub3JnLyNhYmMnLAorICAgICAgICAgICAgICgnd3d3LnB5dGhvbi5vcmcnLCAnLycsICcnLCAnJywgJ2FiYycpLAorICAgICAgICAgICAgICgnd3d3LnB5dGhvbi5vcmcnLCAnLycsICcnLCAnYWJjJykpLAorICAgICAgICAgICAgKCc6Ly9hL2IvYy9kO3A/cSNmJywKKyAgICAgICAgICAgICAoJ2EnLCAnL2IvYy9kJywgJ3AnLCAncScsICdmJyksCisgICAgICAgICAgICAgKCdhJywgJy9iL2MvZDtwJywgJ3EnLCAnZicpKSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHNjaGVtZSBpbiAoJ2h0dHAnLCAnaHR0cHMnKToKKyAgICAgICAgICAgIGZvciB1cmwsIHBhcnNlZCwgc3BsaXQgaW4gdGVzdGNhc2VzOgorICAgICAgICAgICAgICAgIHVybCA9IHNjaGVtZSArIHVybAorICAgICAgICAgICAgICAgIHBhcnNlZCA9IChzY2hlbWUsKSArIHBhcnNlZAorICAgICAgICAgICAgICAgIHNwbGl0ID0gKHNjaGVtZSwpICsgc3BsaXQKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrUm91bmR0cmlwcyh1cmwsIHBhcnNlZCwgc3BsaXQpCisKKyAgICBkZWYgY2hlY2tKb2luKHNlbGYsIGJhc2UsIHJlbHVybCwgZXhwZWN0ZWQpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybGpvaW4oYmFzZSwgcmVsdXJsKSwgZXhwZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGJhc2UsIHJlbHVybCwgZXhwZWN0ZWQpKQorCisgICAgZGVmIHRlc3RfdW5wYXJzZV9wYXJzZShzZWxmKToKKyAgICAgICAgZm9yIHUgaW4gWydQeXRob24nLCAnLi9QeXRob24nLCd4LW5ld3NjaGVtZTovL2Zvby5jb20vc3R1ZmYnLCd4Oi8veScsJ3g6L3knLCd4Oi8nLCcvJyxdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmx1bnNwbGl0KHVybHBhcnNlLnVybHNwbGl0KHUpKSwgdSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJsdW5wYXJzZSh1cmxwYXJzZS51cmxwYXJzZSh1KSksIHUpCisKKyAgICBkZWYgdGVzdF9SRkMxODA4KHNlbGYpOgorICAgICAgICAjICJub3JtYWwiIGNhc2VzIGZyb20gUkZDIDE4MDg6CisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2c6aCcsICdnOmgnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnJywgJ2h0dHA6Ly9hL2IvYy9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi9nJywgJ2h0dHA6Ly9hL2IvYy9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZy8nLCAnaHR0cDovL2EvYi9jL2cvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnL2cnLCAnaHR0cDovL2EvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy8vZycsICdodHRwOi8vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2c/eScsICdodHRwOi8vYS9iL2MvZz95JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZz95Ly4veCcsICdodHRwOi8vYS9iL2MvZz95Ly4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJyNzJywgJ2h0dHA6Ly9hL2IvYy9kO3A/cSNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZyNzJywgJ2h0dHA6Ly9hL2IvYy9nI3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnI3MvLi94JywgJ2h0dHA6Ly9hL2IvYy9nI3MvLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZz95I3MnLCAnaHR0cDovL2EvYi9jL2c/eSNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZzt4JywgJ2h0dHA6Ly9hL2IvYy9nO3gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnO3g/eSNzJywgJ2h0dHA6Ly9hL2IvYy9nO3g/eSNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLicsICdodHRwOi8vYS9iL2MvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi8nLCAnaHR0cDovL2EvYi9jLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy4uJywgJ2h0dHA6Ly9hL2IvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi4vJywgJ2h0dHA6Ly9hL2IvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi4vZycsICdodHRwOi8vYS9iL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLi8uLicsICdodHRwOi8vYS8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLi8uLi8nLCAnaHR0cDovL2EvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi4vLi4vZycsICdodHRwOi8vYS9nJykKKworICAgICAgICAjICJhYm5vcm1hbCIgY2FzZXMgZnJvbSBSRkMgMTgwODoKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnJywgJ2h0dHA6Ly9hL2IvYy9kO3A/cSNmJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi4vLi4vLi4vZycsICdodHRwOi8vYS8uLi9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLi4vLi4vLi4vLi4vZycsICdodHRwOi8vYS8uLi8uLi9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLy4vZycsICdodHRwOi8vYS8uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcvLi4vZycsICdodHRwOi8vYS8uLi9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZy4nLCAnaHR0cDovL2EvYi9jL2cuJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnLmcnLCAnaHR0cDovL2EvYi9jLy5nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZy4uJywgJ2h0dHA6Ly9hL2IvYy9nLi4nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuLmcnLCAnaHR0cDovL2EvYi9jLy4uZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJy4vLi4vZycsICdodHRwOi8vYS9iL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICcuL2cvLicsICdodHRwOi8vYS9iL2MvZy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdnLy4vaCcsICdodHRwOi8vYS9iL2MvZy9oJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMTgwOF9CQVNFLCAnZy8uLi9oJywgJ2h0dHA6Ly9hL2IvYy9oJykKKworICAgICAgICAjIFJGQyAxODA4IGFuZCBSRkMgMTYzMCBkaXNhZ3JlZSBvbiB0aGVzZSAoYWNjb3JkaW5nIHRvIFJGQyAxODA4KSwKKyAgICAgICAgIyBzbyB3ZSdsbCBub3QgYWN0dWFsbHkgcnVuIHRoZXNlIHRlc3RzICh3aGljaCBleHBlY3QgMTgwOCBiZWhhdmlvcikuCisgICAgICAgICNzZWxmLmNoZWNrSm9pbihSRkMxODA4X0JBU0UsICdodHRwOmcnLCAnaHR0cDpnJykKKyAgICAgICAgI3NlbGYuY2hlY2tKb2luKFJGQzE4MDhfQkFTRSwgJ2h0dHA6JywgJ2h0dHA6JykKKworICAgIGRlZiB0ZXN0X1JGQzIzNjgoc2VsZik6CisgICAgICAgICMgSXNzdWUgMTE0Njc6IHBhdGggdGhhdCBzdGFydHMgd2l0aCBhIG51bWJlciBpcyBub3QgcGFyc2VkIGNvcnJlY3RseQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHBhcnNlKCdtYWlsdG86MTMzN0BleGFtcGxlLm9yZycpLAorICAgICAgICAgICAgICAgICgnbWFpbHRvJywgJycsICcxMzM3QGV4YW1wbGUub3JnJywgJycsICcnLCAnJykpCisKKyAgICBkZWYgdGVzdF9SRkMyMzk2KHNlbGYpOgorICAgICAgICAjIGNhc2VzIGZyb20gUkZDIDIzOTYKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZzpoJywgJ2c6aCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cnLCAnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuL2cnLCAnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnLycsICdodHRwOi8vYS9iL2MvZy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcvZycsICdodHRwOi8vYS9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLy9nJywgJ2h0dHA6Ly9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZz95JywgJ2h0dHA6Ly9hL2IvYy9nP3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcjcycsICdodHRwOi8vYS9iL2MvZDtwP3EjcycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cjcycsICdodHRwOi8vYS9iL2MvZyNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZz95I3MnLCAnaHR0cDovL2EvYi9jL2c/eSNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZzt4JywgJ2h0dHA6Ly9hL2IvYy9nO3gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnO3g/eSNzJywgJ2h0dHA6Ly9hL2IvYy9nO3g/eSNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLicsICdodHRwOi8vYS9iL2MvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi8nLCAnaHR0cDovL2EvYi9jLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4uJywgJ2h0dHA6Ly9hL2IvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi4vJywgJ2h0dHA6Ly9hL2IvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi4vZycsICdodHRwOi8vYS9iL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLi8uLicsICdodHRwOi8vYS8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLi8uLi8nLCAnaHR0cDovL2EvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi4vLi4vZycsICdodHRwOi8vYS9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnJywgUkZDMjM5Nl9CQVNFKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLi8uLi8uLi9nJywgJ2h0dHA6Ly9hLy4uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuLi8uLi8uLi8uLi9nJywgJ2h0dHA6Ly9hLy4uLy4uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcvLi9nJywgJ2h0dHA6Ly9hLy4vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy8uLi9nJywgJ2h0dHA6Ly9hLy4uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnLicsICdodHRwOi8vYS9iL2MvZy4nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICcuZycsICdodHRwOi8vYS9iL2MvLmcnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnLi4nLCAnaHR0cDovL2EvYi9jL2cuLicpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4uZycsICdodHRwOi8vYS9iL2MvLi5nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnLi8uLi9nJywgJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJy4vZy8uJywgJ2h0dHA6Ly9hL2IvYy9nLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cvLi9oJywgJ2h0dHA6Ly9hL2IvYy9nL2gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnLy4uL2gnLCAnaHR0cDovL2EvYi9jL2gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnO3g9MS8uL3knLCAnaHR0cDovL2EvYi9jL2c7eD0xL3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnO3g9MS8uLi95JywgJ2h0dHA6Ly9hL2IvYy95JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMjM5Nl9CQVNFLCAnZz95Ly4veCcsICdodHRwOi8vYS9iL2MvZz95Ly4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2c/eS8uLi94JywgJ2h0dHA6Ly9hL2IvYy9nP3kvLi4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJ2cjcy8uL3gnLCAnaHR0cDovL2EvYi9jL2cjcy8uL3gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMyMzk2X0JBU0UsICdnI3MvLi4veCcsICdodHRwOi8vYS9iL2MvZyNzLy4uL3gnKQorCisgICAgZGVmIHRlc3RfUkZDMzk4NihzZWxmKToKKyAgICAgICAgIyBUZXN0IGNhc2VzIGZyb20gUkZDMzk4NgorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICc/eScsJ2h0dHA6Ly9hL2IvYy9kO3A/eScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzIzOTZfQkFTRSwgJzt4JywgJ2h0dHA6Ly9hL2IvYy87eCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2c6aCcsJ2c6aCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2cnLCdodHRwOi8vYS9iL2MvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4vZycsJ2h0dHA6Ly9hL2IvYy9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZy8nLCdodHRwOi8vYS9iL2MvZy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcvZycsJ2h0dHA6Ly9hL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcvL2cnLCdodHRwOi8vZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJz95JywnaHR0cDovL2EvYi9jL2Q7cD95JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZz95JywnaHR0cDovL2EvYi9jL2c/eScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJyNzJywnaHR0cDovL2EvYi9jL2Q7cD9xI3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnI3MnLCdodHRwOi8vYS9iL2MvZyNzJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZz95I3MnLCdodHRwOi8vYS9iL2MvZz95I3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICc7eCcsJ2h0dHA6Ly9hL2IvYy87eCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2c7eCcsJ2h0dHA6Ly9hL2IvYy9nO3gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnO3g/eSNzJywnaHR0cDovL2EvYi9jL2c7eD95I3MnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcnLCdodHRwOi8vYS9iL2MvZDtwP3EnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcuJywnaHR0cDovL2EvYi9jLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4vJywnaHR0cDovL2EvYi9jLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4uJywnaHR0cDovL2EvYi8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcuLi8nLCdodHRwOi8vYS9iLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4uL2cnLCdodHRwOi8vYS9iL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcuLi8uLicsJ2h0dHA6Ly9hLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4uLy4uLycsJ2h0dHA6Ly9hLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4uLy4uL2cnLCdodHRwOi8vYS9nJykKKworICAgICAgICAjQWJub3JtYWwgRXhhbXBsZXMKKworICAgICAgICAjIFRoZSAnYWJub3JtYWwgc2NlbmFyaW9zJyBhcmUgaW5jb21wYXRpYmxlIHdpdGggUkZDMjk4NiBwYXJzaW5nCisgICAgICAgICMgVGVzdHMgYXJlIGhlcmUgZm9yIHJlZmVyZW5jZS4KKworICAgICAgICAjc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi4vLi4vLi4vZycsJ2h0dHA6Ly9hL2cnKQorICAgICAgICAjc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLi4vLi4vLi4vLi4vZycsJ2h0dHA6Ly9hL2cnKQorICAgICAgICAjc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLy4vZycsJ2h0dHA6Ly9hL2cnKQorICAgICAgICAjc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnLy4uL2cnLCdodHRwOi8vYS9nJykKKworICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnLicsJ2h0dHA6Ly9hL2IvYy9nLicpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy5nJywnaHR0cDovL2EvYi9jLy5nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZy4uJywnaHR0cDovL2EvYi9jL2cuLicpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJy4uZycsJ2h0dHA6Ly9hL2IvYy8uLmcnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcuLy4uL2cnLCdodHRwOi8vYS9iL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICcuL2cvLicsJ2h0dHA6Ly9hL2IvYy9nLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2cvLi9oJywnaHR0cDovL2EvYi9jL2cvaCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2cvLi4vaCcsJ2h0dHA6Ly9hL2IvYy9oJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oUkZDMzk4Nl9CQVNFLCAnZzt4PTEvLi95JywnaHR0cDovL2EvYi9jL2c7eD0xL3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnO3g9MS8uLi95JywnaHR0cDovL2EvYi9jL3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnP3kvLi94JywnaHR0cDovL2EvYi9jL2c/eS8uL3gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdnP3kvLi4veCcsJ2h0dHA6Ly9hL2IvYy9nP3kvLi4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2cjcy8uL3gnLCdodHRwOi8vYS9iL2MvZyNzLy4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2cjcy8uLi94JywnaHR0cDovL2EvYi9jL2cjcy8uLi94JykKKyAgICAgICAgI3NlbGYuY2hlY2tKb2luKFJGQzM5ODZfQkFTRSwgJ2h0dHA6ZycsJ2h0dHA6ZycpICMgc3RyaWN0IHBhcnNlcgorICAgICAgICBzZWxmLmNoZWNrSm9pbihSRkMzOTg2X0JBU0UsICdodHRwOmcnLCdodHRwOi8vYS9iL2MvZycpICMgcmVsYXhlZCBwYXJzZXIKKworICAgICAgICAjIFRlc3QgZm9yIGlzc3VlOTcyMQorICAgICAgICBzZWxmLmNoZWNrSm9pbignaHR0cDovL2EvYi9jL2RlJywgJzt4JywnaHR0cDovL2EvYi9jLzt4JykKKworICAgIGRlZiB0ZXN0X3VybGpvaW5zKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2c6aCcsJ2c6aCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnaHR0cDpnJywnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2h0dHA6JywnaHR0cDovL2EvYi9jL2QnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2cnLCdodHRwOi8vYS9iL2MvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi9nJywnaHR0cDovL2EvYi9jL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2cvJywnaHR0cDovL2EvYi9jL2cvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcvZycsJ2h0dHA6Ly9hL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy8vZycsJ2h0dHA6Ly9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICc/eScsJ2h0dHA6Ly9hL2IvYy9kP3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2c/eScsJ2h0dHA6Ly9hL2IvYy9nP3knKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2c/eS8uL3gnLCdodHRwOi8vYS9iL2MvZz95Ly4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLicsJ2h0dHA6Ly9hL2IvYy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy4vJywnaHR0cDovL2EvYi9jLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi4nLCdodHRwOi8vYS9iLycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi4vJywnaHR0cDovL2EvYi8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy4uL2cnLCdodHRwOi8vYS9iL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy4uLy4uJywnaHR0cDovL2EvJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICcuLi8uLi9nJywnaHR0cDovL2EvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi4vLi4vLi4vZycsJ2h0dHA6Ly9hLy4uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy4vLi4vZycsJ2h0dHA6Ly9hL2IvZycpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnLi9nLy4nLCdodHRwOi8vYS9iL2MvZy8nKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJy8uL2cnLCdodHRwOi8vYS8uL2cnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2cvLi9oJywnaHR0cDovL2EvYi9jL2cvaCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnZy8uLi9oJywnaHR0cDovL2EvYi9jL2gnKQorICAgICAgICBzZWxmLmNoZWNrSm9pbihTSU1QTEVfQkFTRSwgJ2h0dHA6ZycsJ2h0dHA6Ly9hL2IvYy9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICdodHRwOicsJ2h0dHA6Ly9hL2IvYy9kJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICdodHRwOj95JywnaHR0cDovL2EvYi9jL2Q/eScpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKFNJTVBMRV9CQVNFLCAnaHR0cDpnP3knLCdodHRwOi8vYS9iL2MvZz95JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oU0lNUExFX0JBU0UsICdodHRwOmc/eS8uL3gnLCdodHRwOi8vYS9iL2MvZz95Ly4veCcpCisgICAgICAgIHNlbGYuY2hlY2tKb2luKCdodHRwOi8vLycsICcuLicsJ2h0dHA6Ly8vJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oJycsICdodHRwOi8vYS9iL2MvZz95Ly4veCcsJ2h0dHA6Ly9hL2IvYy9nP3kvLi94JykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oJycsICdodHRwOi8vYS8uL2cnLCAnaHR0cDovL2EvLi9nJykKKyAgICAgICAgc2VsZi5jaGVja0pvaW4oJ3N2bjovL3BhdGh0b3JlcG8vZGlyMScsJ2RpcjInLCdzdm46Ly9wYXRodG9yZXBvL2RpcjInKQorICAgICAgICBzZWxmLmNoZWNrSm9pbignc3ZuK3NzaDovL3BhdGh0b3JlcG8vZGlyMScsJ2RpcjInLCdzdm4rc3NoOi8vcGF0aHRvcmVwby9kaXIyJykKKworICAgIGRlZiB0ZXN0X1JGQzI3MzIoc2VsZik6CisgICAgICAgIGZvciB1cmwsIGhvc3RuYW1lLCBwb3J0IGluIFsKKyAgICAgICAgICAgICgnaHR0cDovL1Rlc3QucHl0aG9uLm9yZzo1NDMyL2Zvby8nLCAndGVzdC5weXRob24ub3JnJywgNTQzMiksCisgICAgICAgICAgICAoJ2h0dHA6Ly8xMi4zNC41Ni43ODo1NDMyL2Zvby8nLCAnMTIuMzQuNTYuNzgnLCA1NDMyKSwKKyAgICAgICAgICAgICgnaHR0cDovL1s6OjFdOjU0MzIvZm9vLycsICc6OjEnLCA1NDMyKSwKKyAgICAgICAgICAgICgnaHR0cDovL1tkZWFkOmJlZWY6OjFdOjU0MzIvZm9vLycsICdkZWFkOmJlZWY6OjEnLCA1NDMyKSwKKyAgICAgICAgICAgICgnaHR0cDovL1tkZWFkOmJlZWY6Ol06NTQzMi9mb28vJywgJ2RlYWQ6YmVlZjo6JywgNTQzMiksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bZGVhZDpiZWVmOmNhZmU6NTQxNzphZmZlOjhGQTM6ZGVhZjpmZWVkXTo1NDMyL2Zvby8nLAorICAgICAgICAgICAgICdkZWFkOmJlZWY6Y2FmZTo1NDE3OmFmZmU6OGZhMzpkZWFmOmZlZWQnLCA1NDMyKSwKKyAgICAgICAgICAgICgnaHR0cDovL1s6OjEyLjM0LjU2Ljc4XTo1NDMyL2Zvby8nLCAnOjoxMi4zNC41Ni43OCcsIDU0MzIpLAorICAgICAgICAgICAgKCdodHRwOi8vWzo6ZmZmZjoxMi4zNC41Ni43OF06NTQzMi9mb28vJywKKyAgICAgICAgICAgICAnOjpmZmZmOjEyLjM0LjU2Ljc4JywgNTQzMiksCisgICAgICAgICAgICAoJ2h0dHA6Ly9UZXN0LnB5dGhvbi5vcmcvZm9vLycsICd0ZXN0LnB5dGhvbi5vcmcnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovLzEyLjM0LjU2Ljc4L2Zvby8nLCAnMTIuMzQuNTYuNzgnLCBOb25lKSwKKyAgICAgICAgICAgICgnaHR0cDovL1s6OjFdL2Zvby8nLCAnOjoxJywgTm9uZSksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bZGVhZDpiZWVmOjoxXS9mb28vJywgJ2RlYWQ6YmVlZjo6MScsIE5vbmUpLAorICAgICAgICAgICAgKCdodHRwOi8vW2RlYWQ6YmVlZjo6XS9mb28vJywgJ2RlYWQ6YmVlZjo6JywgTm9uZSksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bZGVhZDpiZWVmOmNhZmU6NTQxNzphZmZlOjhGQTM6ZGVhZjpmZWVkXS9mb28vJywKKyAgICAgICAgICAgICAnZGVhZDpiZWVmOmNhZmU6NTQxNzphZmZlOjhmYTM6ZGVhZjpmZWVkJywgTm9uZSksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bOjoxMi4zNC41Ni43OF0vZm9vLycsICc6OjEyLjM0LjU2Ljc4JywgTm9uZSksCisgICAgICAgICAgICAoJ2h0dHA6Ly9bOjpmZmZmOjEyLjM0LjU2Ljc4XS9mb28vJywKKyAgICAgICAgICAgICAnOjpmZmZmOjEyLjM0LjU2Ljc4JywgTm9uZSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgdXJscGFyc2VkID0gdXJscGFyc2UudXJscGFyc2UodXJsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgodXJscGFyc2VkLmhvc3RuYW1lLCB1cmxwYXJzZWQucG9ydCkgLCAoaG9zdG5hbWUsIHBvcnQpKQorCisgICAgICAgIGZvciBpbnZhbGlkX3VybCBpbiBbCisgICAgICAgICAgICAgICAgJ2h0dHA6Ly86OjEyLjM0LjU2Ljc4XS8nLAorICAgICAgICAgICAgICAgICdodHRwOi8vWzo6MS9mb28vJywKKyAgICAgICAgICAgICAgICAnZnRwOi8vWzo6MS9mb28vYmFkXS9iYWQnLAorICAgICAgICAgICAgICAgICdodHRwOi8vWzo6MS9mb28vYmFkXS9iYWQnLAorICAgICAgICAgICAgICAgICdodHRwOi8vWzo6ZmZmZjoxMi4zNC41Ni43OCddOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXJscGFyc2UudXJscGFyc2UsIGludmFsaWRfdXJsKQorCisgICAgZGVmIHRlc3RfdXJsZGVmcmFnKHNlbGYpOgorICAgICAgICBmb3IgdXJsLCBkZWZyYWcsIGZyYWcgaW4gWworICAgICAgICAgICAgKCdodHRwOi8vcHl0aG9uLm9yZyNmcmFnJywgJ2h0dHA6Ly9weXRob24ub3JnJywgJ2ZyYWcnKSwKKyAgICAgICAgICAgICgnaHR0cDovL3B5dGhvbi5vcmcnLCAnaHR0cDovL3B5dGhvbi5vcmcnLCAnJyksCisgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnLyNmcmFnJywgJ2h0dHA6Ly9weXRob24ub3JnLycsICdmcmFnJyksCisgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnLycsICdodHRwOi8vcHl0aG9uLm9yZy8nLCAnJyksCisgICAgICAgICAgICAoJ2h0dHA6Ly9weXRob24ub3JnLz9xI2ZyYWcnLCAnaHR0cDovL3B5dGhvbi5vcmcvP3EnLCAnZnJhZycpLAorICAgICAgICAgICAgKCdodHRwOi8vcHl0aG9uLm9yZy8/cScsICdodHRwOi8vcHl0aG9uLm9yZy8/cScsICcnKSwKKyAgICAgICAgICAgICgnaHR0cDovL3B5dGhvbi5vcmcvcCNmcmFnJywgJ2h0dHA6Ly9weXRob24ub3JnL3AnLCAnZnJhZycpLAorICAgICAgICAgICAgKCdodHRwOi8vcHl0aG9uLm9yZy9wP3EnLCAnaHR0cDovL3B5dGhvbi5vcmcvcD9xJywgJycpLAorICAgICAgICAgICAgKFJGQzE4MDhfQkFTRSwgJ2h0dHA6Ly9hL2IvYy9kO3A/cScsICdmJyksCisgICAgICAgICAgICAoUkZDMjM5Nl9CQVNFLCAnaHR0cDovL2EvYi9jL2Q7cD9xJywgJycpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJsZGVmcmFnKHVybCksIChkZWZyYWcsIGZyYWcpKQorCisgICAgZGVmIHRlc3RfdXJsc3BsaXRfYXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgdXJsID0gIkhUVFA6Ly9XV1cuUFlUSE9OLk9SRy9kb2MvI2ZyYWciCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zY2hlbWUsICJodHRwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgIldXVy5QWVRIT04uT1JHIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhdGgsICIvZG9jLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5xdWVyeSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5mcmFnbWVudCwgImZyYWciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAudXNlcm5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmhvc3RuYW1lLCAid3d3LnB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKyAgICAgICAgIyBnZXR1cmwoKSB3b24ndCByZXR1cm4gZXhhY3RseSB0aGUgb3JpZ2luYWwgVVJMIGluIHRoaXMgY2FzZQorICAgICAgICAjIHNpbmNlIHRoZSBzY2hlbWUgaXMgYWx3YXlzIGNhc2Utbm9ybWFsaXplZAorICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmwpCisKKyAgICAgICAgdXJsID0gImh0dHA6Ly9Vc2VyOlBhc3NAd3d3LnB5dGhvbi5vcmc6MDgwL2RvYy8/cXVlcnk9eWVzI2ZyYWciCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5zY2hlbWUsICJodHRwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgIlVzZXI6UGFzc0B3d3cucHl0aG9uLm9yZzowODAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGF0aCwgIi9kb2MvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnF1ZXJ5LCAicXVlcnk9eWVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmZyYWdtZW50LCAiZnJhZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC51c2VybmFtZSwgIlVzZXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGFzc3dvcmQsICJQYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmhvc3RuYW1lLCAid3d3LnB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgODApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJsKQorCisgICAgICAgICMgQWRkcmVzc2luZyBpc3N1ZTE2OTgsIHdoaWNoIHN1Z2dlc3RzIFVzZXJuYW1lIGNhbiBjb250YWluCisgICAgICAgICMgIkAiIGNoYXJhY3RlcnMuICBUaG91Z2ggbm90IFJGQyBjb21wbGlhbnQsIG1hbnkgZnRwIHNpdGVzIGFsbG93CisgICAgICAgICMgYW5kIHJlcXVlc3QgZW1haWwgYWRkcmVzc2VzIGFzIHVzZXJuYW1lcy4KKworICAgICAgICB1cmwgPSAiaHR0cDovL1VzZXJAZXhhbXBsZS5jb206UGFzc0B3d3cucHl0aG9uLm9yZzowODAvZG9jLz9xdWVyeT15ZXMjZnJhZyIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnNjaGVtZSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiVXNlckBleGFtcGxlLmNvbTpQYXNzQHd3dy5weXRob24ub3JnOjA4MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXRoLCAiL2RvYy8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucXVlcnksICJxdWVyeT15ZXMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZnJhZ21lbnQsICJmcmFnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCAiVXNlckBleGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgIlBhc3MiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsICJ3d3cucHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCA4MCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmwpCisKKyAgICAgICAgIyBWZXJpZnkgYW4gaWxsZWdhbCBwb3J0IG9mIHZhbHVlIGdyZWF0ZXIgdGhhbiA2NTUzNSBpcyBzZXQgYXMgTm9uZQorICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnOjY1NTM2IgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQodXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2lzc3VlMTQwNzIoc2VsZik6CisgICAgICAgIHAxID0gdXJscGFyc2UudXJsc3BsaXQoJ3RlbDorMzEtNjQxMDQ0MTUzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhdGgsICcrMzEtNjQxMDQ0MTUzJykKKworICAgICAgICBwMiA9IHVybHBhcnNlLnVybHNwbGl0KCd0ZWw6KzMxNjQxMDQ0MTUzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMi5zY2hlbWUsICd0ZWwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAyLnBhdGgsICcrMzE2NDEwNDQxNTMnKQorCisgICAgICAgICMgQXNzZXJ0IGZvciB1cmxwYXJzZQorICAgICAgICBwMSA9IHVybHBhcnNlLnVybHBhcnNlKCd0ZWw6KzMxLTY0MTA0NDE1MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnKzMxLTY0MTA0NDE1MycpCisKKyAgICAgICAgcDIgPSB1cmxwYXJzZS51cmxwYXJzZSgndGVsOiszMTY0MTA0NDE1MycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDIuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMi5wYXRoLCAnKzMxNjQxMDQ0MTUzJykKKworCisgICAgZGVmIHRlc3RfdGVsdXJsX3BhcmFtcyhzZWxmKToKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxwYXJzZSgndGVsOjEyMy00O3Bob25lLWNvbnRleHQ9KzEtNjUwLTUxNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnMTIzLTQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhcmFtcywgJ3Bob25lLWNvbnRleHQ9KzEtNjUwLTUxNicpCisKKyAgICAgICAgcDEgPSB1cmxwYXJzZS51cmxwYXJzZSgndGVsOisxLTIwMS01NTUtMDEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEuc2NoZW1lLCAndGVsJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXRoLCAnKzEtMjAxLTU1NS0wMTIzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXJhbXMsICcnKQorCisgICAgICAgIHAxID0gdXJscGFyc2UudXJscGFyc2UoJ3RlbDo3MDQyO3Bob25lLWNvbnRleHQ9ZXhhbXBsZS5jb20nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnNjaGVtZSwgJ3RlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGF0aCwgJzcwNDInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnBhcmFtcywgJ3Bob25lLWNvbnRleHQ9ZXhhbXBsZS5jb20nKQorCisgICAgICAgIHAxID0gdXJscGFyc2UudXJscGFyc2UoJ3RlbDo4NjMtMTIzNDtwaG9uZS1jb250ZXh0PSsxLTkxNC01NTUnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAxLnNjaGVtZSwgJ3RlbCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEucGF0aCwgJzg2My0xMjM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMS5wYXJhbXMsICdwaG9uZS1jb250ZXh0PSsxLTkxNC01NTUnKQorCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX2JhZF9wb3J0KHNlbGYpOgorICAgICAgICAiIiJDaGVjayBoYW5kbGluZyBvZiBub24taW50ZWdlciBwb3J0cy4iIiIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCisKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHBhcnNlKCJodHRwOi8vd3d3LmV4YW1wbGUubmV0OmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJ3d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBwLnBvcnQpCisKKyAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzX3dpdGhvdXRfbmV0bG9jKHNlbGYpOgorICAgICAgICAjIFRoaXMgZXhhbXBsZSBpcyBzdHJhaWdodCBmcm9tIFJGQyAzMjYxLiAgSXQgbG9va3MgbGlrZSBpdAorICAgICAgICAjIHNob3VsZCBhbGxvdyB0aGUgdXNlcm5hbWUsIGhvc3RuYW1lLCBhbmQgcG9ydCB0byBiZSBmaWxsZWQKKyAgICAgICAgIyBpbiwgYnV0IGRvZXNuJ3QuICBTaW5jZSBpdCdzIGEgVVJJIGFuZCBkb2Vzbid0IHVzZSB0aGUKKyAgICAgICAgIyBzY2hlbWU6Ly9uZXRsb2Mgc3ludGF4LCB0aGUgbmV0bG9jIGFuZCByZWxhdGVkIGF0dHJpYnV0ZXMKKyAgICAgICAgIyBzaG91bGQgYmUgbGVmdCBlbXB0eS4KKyAgICAgICAgdXJpID0gInNpcDphbGljZUBhdGxhbnRhLmNvbTttYWRkcj0yMzkuMjU1LjI1NS4xO3R0bD0xNSIKKyAgICAgICAgcCA9IHVybHBhcnNlLnVybHNwbGl0KHVyaSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC51c2VybmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhc3N3b3JkLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuaG9zdG5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3J0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVyaSkKKworICAgICAgICBwID0gdXJscGFyc2UudXJscGFyc2UodXJpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGFzc3dvcmQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5ob3N0bmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJpKQorCisgICAgZGVmIHRlc3RfY2FjaGluZyhzZWxmKToKKyAgICAgICAgIyBUZXN0IGNhc2UgZm9yIGJ1ZyAjMTMxMzExOQorICAgICAgICB1cmkgPSAiaHR0cDovL2V4YW1wbGUuY29tL2RvYy8iCisgICAgICAgIHVuaWNvZGVfdXJpID0gdW5pY29kZSh1cmkpCisKKyAgICAgICAgdXJscGFyc2UudXJscGFyc2UodW5pY29kZV91cmkpCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShwLnNjaGVtZSksIHR5cGUodXJpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHAuaG9zdG5hbWUpLCB0eXBlKHVyaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShwLnBhdGgpLCB0eXBlKHVyaSkpCisKKyAgICBkZWYgdGVzdF9ub3NsYXNoKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE2Mzc6IGh0dHA6Ly9mb28uY29tP3F1ZXJ5IGlzIGxlZ2FsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoImh0dHA6Ly9leGFtcGxlLmNvbT9ibGFoYmxhaD0vZm9vIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgKCdodHRwJywgJ2V4YW1wbGUuY29tJywgJycsICcnLCAnYmxhaGJsYWg9L2ZvbycsICcnKSkKKworICAgIGRlZiB0ZXN0X2FueXNjaGVtZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSA3OTA0OiBzMzovL2Zvby5jb20vc3R1ZmYgaGFzIG5ldGxvYyAiZm9vLmNvbSIuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoInMzOi8vZm9vLmNvbS9zdHVmZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgnczMnLCdmb28uY29tJywnL3N0dWZmJywnJywnJywnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoIngtbmV3c2NoZW1lOi8vZm9vLmNvbS9zdHVmZiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgneC1uZXdzY2hlbWUnLCdmb28uY29tJywnL3N0dWZmJywnJywnJywnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoIngtbmV3c2NoZW1lOi8vZm9vLmNvbS9zdHVmZj9xdWVyeSNmcmFnbWVudCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICgneC1uZXdzY2hlbWUnLCdmb28uY29tJywnL3N0dWZmJywnJywncXVlcnknLCdmcmFnbWVudCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHBhcnNlKCJ4LW5ld3NjaGVtZTovL2Zvby5jb20vc3R1ZmY/cXVlcnkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoJ3gtbmV3c2NoZW1lJywnZm9vLmNvbScsJy9zdHVmZicsJycsJ3F1ZXJ5JywnJykpCisKKyAgICBkZWYgdGVzdF93aXRob3V0c2NoZW1lKHNlbGYpOgorICAgICAgICAjIFRlc3QgdXJscGFyc2Ugd2l0aG91dCBzY2hlbWUKKyAgICAgICAgIyBJc3N1ZSA3NTQwMTY6IHVybHBhcnNlIGdvZXMgd3Jvbmcgd2l0aCBJUDpwb3J0IHdpdGhvdXQgc2NoZW1lCisgICAgICAgICMgUkZDIDE4MDggc3BlY2lmaWVzIHRoYXQgbmV0bG9jIHNob3VsZCBzdGFydCB3aXRoIC8vLCB1cmxwYXJzZSBleHBlY3RzCisgICAgICAgICMgdGhlIHNhbWUsIG90aGVyd2lzZSBpdCBjbGFzc2lmaWVzIHRoZSBwb3J0aW9uIG9mIHVybCBhcyBwYXRoLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHBhcnNlKCJwYXRoIiksCisgICAgICAgICAgICAgICAgKCcnLCcnLCdwYXRoJywnJywnJywnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoIi8vd3d3LnB5dGhvbi5vcmc6ODAiKSwKKyAgICAgICAgICAgICAgICAoJycsJ3d3dy5weXRob24ub3JnOjgwJywnJywnJywnJywnJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoImh0dHA6Ly93d3cucHl0aG9uLm9yZzo4MCIpLAorICAgICAgICAgICAgICAgICgnaHR0cCcsJ3d3dy5weXRob24ub3JnOjgwJywnJywnJywnJywnJykpCisKKyAgICBkZWYgdGVzdF9wb3J0c2VwYXJhdG9yKHNlbGYpOgorICAgICAgICAjIElzc3VlIDc1NDAxNiBtYWtlcyBjaGFuZ2VzIGZvciBwb3J0IHNlcGFyYXRvciAnOicgZnJvbSBzY2hlbWUgc2VwYXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXJscGFyc2UudXJscGFyc2UoInBhdGg6ODAiKSwKKyAgICAgICAgICAgICAgICAoJycsJycsJ3BhdGg6ODAnLCcnLCcnLCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgiaHR0cDoiKSwoJ2h0dHAnLCcnLCcnLCcnLCcnLCcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cmxwYXJzZS51cmxwYXJzZSgiaHR0cHM6IiksKCdodHRwcycsJycsJycsJycsJycsJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybHBhcnNlKCJodHRwOi8vd3d3LnB5dGhvbi5vcmc6ODAiKSwKKyAgICAgICAgICAgICAgICAoJ2h0dHAnLCd3d3cucHl0aG9uLm9yZzo4MCcsJycsJycsJycsJycpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVcmxQYXJzZVRlc3RDYXNlKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxwYXJzZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxwYXJzZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MTY2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybHBhcnNlLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxwYXJzZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91cmxwYXJzZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5MTY2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VybHBhcnNlLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJkaWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Y2VjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weQpAQCAtMCwwICsxLDM1MCBAQAorIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJEaWN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0LCBtYXBwaW5nX3Rlc3RzCitpbXBvcnQgVXNlckRpY3QKKworZDAgPSB7fQorZDEgPSB7Im9uZSI6IDF9CitkMiA9IHsib25lIjogMSwgInR3byI6IDJ9CitkMyA9IHsib25lIjogMSwgInR3byI6IDMsICJ0aHJlZSI6IDV9CitkNCA9IHsib25lIjogTm9uZSwgInR3byI6IE5vbmV9CitkNSA9IHsib25lIjogMSwgInR3byI6IDF9CisKK2NsYXNzIFVzZXJEaWN0VGVzdChtYXBwaW5nX3Rlc3RzLlRlc3RIYXNoTWFwcGluZ1Byb3RvY29sKToKKyAgICB0eXBlMnRlc3QgPSBVc2VyRGljdC5JdGVyYWJsZVVzZXJEaWN0CisKKyAgICBkZWYgdGVzdF9hbGwoc2VsZik6CisgICAgICAgICMgVGVzdCBjb25zdHJ1Y3RvcnMKKyAgICAgICAgdSA9IFVzZXJEaWN0LlVzZXJEaWN0KCkKKyAgICAgICAgdTAgPSBVc2VyRGljdC5Vc2VyRGljdChkMCkKKyAgICAgICAgdTEgPSBVc2VyRGljdC5Vc2VyRGljdChkMSkKKyAgICAgICAgdTIgPSBVc2VyRGljdC5JdGVyYWJsZVVzZXJEaWN0KGQyKQorCisgICAgICAgIHV1ID0gVXNlckRpY3QuVXNlckRpY3QodSkKKyAgICAgICAgdXUwID0gVXNlckRpY3QuVXNlckRpY3QodTApCisgICAgICAgIHV1MSA9IFVzZXJEaWN0LlVzZXJEaWN0KHUxKQorICAgICAgICB1dTIgPSBVc2VyRGljdC5Vc2VyRGljdCh1MikKKworICAgICAgICAjIGtleXdvcmQgYXJnIGNvbnN0cnVjdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3Qob25lPTEsIHR3bz0yKSwgZDIpCisgICAgICAgICMgaXRlbSBzZXF1ZW5jZSBjb25zdHJ1Y3RvcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVzZXJEaWN0LlVzZXJEaWN0KFsoJ29uZScsMSksICgndHdvJywyKV0pLCBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVc2VyRGljdC5Vc2VyRGljdChkaWN0PVsoJ29uZScsMSksICgndHdvJywyKV0pLCBkMikKKyAgICAgICAgIyBib3RoIHRvZ2V0aGVyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QoWygnb25lJywxKSwgKCd0d28nLDIpXSwgdHdvPTMsIHRocmVlPTUpLCBkMykKKworICAgICAgICAjIGFsdGVybmF0ZSBjb25zdHJ1Y3RvcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVzZXJEaWN0LlVzZXJEaWN0LmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSwgZDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QoKS5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSksIGQ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVzZXJEaWN0LlVzZXJEaWN0LmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpLCAxKSwgZDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QoKS5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSwgMSksIGQ1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodTEuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpIGlzIG5vdCB1MSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHUxLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSwgVXNlckRpY3QuVXNlckRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh1Mi5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSksIFVzZXJEaWN0Lkl0ZXJhYmxlVXNlckRpY3QpCisKKyAgICAgICAgIyBUZXN0IF9fcmVwcl9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHUwKSwgc3RyKGQwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKHUxKSwgcmVwcihkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcih1MiksIHJlcHIoZDIpKQorCisgICAgICAgICMgVGVzdCBfX2NtcF9fIGFuZCBfX2xlbl9fCisgICAgICAgIGFsbCA9IFtkMCwgZDEsIGQyLCB1LCB1MCwgdTEsIHUyLCB1dSwgdXUwLCB1dTEsIHV1Ml0KKyAgICAgICAgZm9yIGEgaW4gYWxsOgorICAgICAgICAgICAgZm9yIGIgaW4gYWxsOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGEsIGIpLCBjbXAobGVuKGEpLCBsZW4oYikpKQorCisgICAgICAgICMgVGVzdCBfX2dldGl0ZW1fXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyWyJvbmUiXSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHUxLl9fZ2V0aXRlbV9fLCAidHdvIikKKworICAgICAgICAjIFRlc3QgX19zZXRpdGVtX18KKyAgICAgICAgdTMgPSBVc2VyRGljdC5Vc2VyRGljdCh1MikKKyAgICAgICAgdTNbInR3byJdID0gMgorICAgICAgICB1M1sidGhyZWUiXSA9IDMKKworICAgICAgICAjIFRlc3QgX19kZWxpdGVtX18KKyAgICAgICAgZGVsIHUzWyJ0aHJlZSJdCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCB1My5fX2RlbGl0ZW1fXywgInRocmVlIikKKworICAgICAgICAjIFRlc3QgY2xlYXIKKyAgICAgICAgdTMuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUzLCB7fSkKKworICAgICAgICAjIFRlc3QgY29weSgpCisgICAgICAgIHUyYSA9IHUyLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyYSwgdTIpCisgICAgICAgIHUyYiA9IFVzZXJEaWN0LlVzZXJEaWN0KHg9NDIsIHk9MjMpCisgICAgICAgIHUyYyA9IHUyYi5jb3B5KCkgIyBtYWtpbmcgYSBjb3B5IG9mIGEgVXNlckRpY3QgaXMgc3BlY2lhbCBjYXNlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyYiwgdTJjKQorCisgICAgICAgIGNsYXNzIE15VXNlckRpY3QoVXNlckRpY3QuVXNlckRpY3QpOgorICAgICAgICAgICAgZGVmIGRpc3BsYXkoc2VsZik6IHByaW50IHNlbGYKKworICAgICAgICBtMiA9IE15VXNlckRpY3QodTIpCisgICAgICAgIG0yYSA9IG0yLmNvcHkoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0yYSwgbTIpCisKKyAgICAgICAgIyBTRiBidWcgIzQ3NjYxNiAtLSBjb3B5KCkgb2YgVXNlckRpY3Qgc3ViY2xhc3Mgc2hhcmVkIGRhdGEKKyAgICAgICAgbTJbJ2ZvbyddID0gJ2JhcicKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChtMmEsIG0yKQorCisgICAgICAgICMgVGVzdCBrZXlzLCBpdGVtcywgdmFsdWVzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIua2V5cygpLCBkMi5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIuaXRlbXMoKSwgZDIuaXRlbXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Mi52YWx1ZXMoKSwgZDIudmFsdWVzKCkpCisKKyAgICAgICAgIyBUZXN0IGhhc19rZXkgYW5kICJpbiIuCisgICAgICAgIGZvciBpIGluIHUyLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaSwgdTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgaW4gdTEsIGkgaW4gZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkgaW4gdTAsIGkgaW4gZDApCisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja19weTNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUyLmhhc19rZXkoaSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1MS5oYXNfa2V5KGkpLCBkMS5oYXNfa2V5KGkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuaGFzX2tleShpKSwgZDAuaGFzX2tleShpKSkKKworICAgICAgICAjIFRlc3QgdXBkYXRlCisgICAgICAgIHQgPSBVc2VyRGljdC5Vc2VyRGljdCgpCisgICAgICAgIHQudXBkYXRlKHUyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHUyKQorICAgICAgICBjbGFzcyBJdGVtczoKKyAgICAgICAgICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCgieCIsIDQyKSwgKCJ5IiwgMjMpKQorICAgICAgICB0ID0gVXNlckRpY3QuVXNlckRpY3QoKQorICAgICAgICB0LnVwZGF0ZShJdGVtcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHsieCI6IDQyLCAieSI6IDIzfSkKKworICAgICAgICAjIFRlc3QgZ2V0CisgICAgICAgIGZvciBpIGluIHUyLmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIuZ2V0KGkpLCB1MltpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTEuZ2V0KGkpLCBkMS5nZXQoaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUwLmdldChpKSwgZDAuZ2V0KGkpKQorCisgICAgICAgICMgVGVzdCAiaW4iIGl0ZXJhdGlvbi4KKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKDIwKToKKyAgICAgICAgICAgIHUyW2ldID0gc3RyKGkpCisgICAgICAgIGlrZXlzID0gW10KKyAgICAgICAgZm9yIGsgaW4gdTI6CisgICAgICAgICAgICBpa2V5cy5hcHBlbmQoaykKKyAgICAgICAga2V5cyA9IHUyLmtleXMoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChpa2V5cyksIHNldChrZXlzKSkKKworICAgICAgICAjIFRlc3Qgc2V0ZGVmYXVsdAorICAgICAgICB0ID0gVXNlckRpY3QuVXNlckRpY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2V0ZGVmYXVsdCgieCIsIDQyKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0Lmhhc19rZXkoIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LnNldGRlZmF1bHQoIngiLCAyMyksIDQyKQorCisgICAgICAgICMgVGVzdCBwb3AKKyAgICAgICAgdCA9IFVzZXJEaWN0LlVzZXJEaWN0KHg9NDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5wb3AoIngiKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCB0LnBvcCwgIngiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQucG9wKCJ4IiwgMSksIDEpCisgICAgICAgIHRbIngiXSA9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5wb3AoIngiLCAxKSwgNDIpCisKKyAgICAgICAgIyBUZXN0IHBvcGl0ZW0KKyAgICAgICAgdCA9IFVzZXJEaWN0LlVzZXJEaWN0KHg9NDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5wb3BpdGVtKCksICgieCIsIDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHQucG9waXRlbSkKKworICAgIGRlZiB0ZXN0X21pc3Npbmcoc2VsZik6CisgICAgICAgICMgTWFrZSBzdXJlIFVzZXJEaWN0IGRvZXNuJ3QgaGF2ZSBhIF9fbWlzc2luZ19fIG1ldGhvZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2F0dHIoVXNlckRpY3QsICJfX21pc3NpbmdfXyIpLCBGYWxzZSkKKyAgICAgICAgIyBUZXN0IHNldmVyYWwgY2FzZXM6CisgICAgICAgICMgKEQpIHN1YmNsYXNzIGRlZmluZXMgX19taXNzaW5nX18gbWV0aG9kIHJldHVybmluZyBhIHZhbHVlCisgICAgICAgICMgKEUpIHN1YmNsYXNzIGRlZmluZXMgX19taXNzaW5nX18gbWV0aG9kIHJhaXNpbmcgUnVudGltZUVycm9yCisgICAgICAgICMgKEYpIHN1YmNsYXNzIHNldHMgX19taXNzaW5nX18gaW5zdGFuY2UgdmFyaWFibGUgKG5vIGVmZmVjdCkKKyAgICAgICAgIyAoRykgc3ViY2xhc3MgZG9lc24ndCBkZWZpbmUgX19taXNzaW5nX18gYXQgYSBhbGwKKyAgICAgICAgY2xhc3MgRChVc2VyRGljdC5Vc2VyRGljdCk6CisgICAgICAgICAgICBkZWYgX19taXNzaW5nX18oc2VsZiwga2V5KToKKyAgICAgICAgICAgICAgICByZXR1cm4gNDIKKyAgICAgICAgZCA9IEQoezE6IDIsIDM6IDR9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFszXSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigyLCBkKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDIsIGQua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMl0sIDQyKQorICAgICAgICBjbGFzcyBFKFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihrZXkpCisgICAgICAgIGUgPSBFKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZVs0Ml0KKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIuYXJncywgKDQyLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImVbNDJdIGRpZG4ndCByYWlzZSBSdW50aW1lRXJyb3IiKQorICAgICAgICBjbGFzcyBGKFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICAjIEFuIGluc3RhbmNlIHZhcmlhYmxlIF9fbWlzc2luZ19fIHNob3VsZCBoYXZlIG5vIGVmZmVjdAorICAgICAgICAgICAgICAgIHNlbGYuX19taXNzaW5nX18gPSBsYW1iZGEga2V5OiBOb25lCisgICAgICAgICAgICAgICAgVXNlckRpY3QuVXNlckRpY3QuX19pbml0X18oc2VsZikKKyAgICAgICAgZiA9IEYoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmWzQyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3MsICg0MiwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJmWzQyXSBkaWRuJ3QgcmFpc2UgS2V5RXJyb3IiKQorICAgICAgICBjbGFzcyBHKFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZyA9IEcoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBnWzQyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3IsIGVycjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyLmFyZ3MsICg0MiwpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJnWzQyXSBkaWRuJ3QgcmFpc2UgS2V5RXJyb3IiKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBUZXN0IERpY3QgTWl4aW4KKworY2xhc3MgU2VxRGljdChVc2VyRGljdC5EaWN0TWl4aW4pOgorICAgICIiIkRpY3Rpb25hcnkgbG9va2FsaWtlIGltcGxlbWVudGVkIHdpdGggbGlzdHMuCisKKyAgICBVc2VkIHRvIHRlc3QgYW5kIGRlbW9uc3RyYXRlIERpY3RNaXhpbgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdGhlcj1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYua2V5bGlzdCA9IFtdCisgICAgICAgIHNlbGYudmFsdWVsaXN0ID0gW10KKyAgICAgICAgaWYgb3RoZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgKGtleSwgdmFsdWUpIGluIG90aGVyOgorICAgICAgICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCisgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgc2VsZltrZXldID0gdmFsdWUKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaSA9IHNlbGYua2V5bGlzdC5pbmRleChrZXkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsdWVsaXN0W2ldCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpID0gc2VsZi5rZXlsaXN0LmluZGV4KGtleSkKKyAgICAgICAgICAgIHNlbGYudmFsdWVsaXN0W2ldID0gdmFsdWUKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBzZWxmLmtleWxpc3QuYXBwZW5kKGtleSkKKyAgICAgICAgICAgIHNlbGYudmFsdWVsaXN0LmFwcGVuZCh2YWx1ZSkKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaSA9IHNlbGYua2V5bGlzdC5pbmRleChrZXkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IKKyAgICAgICAgc2VsZi5rZXlsaXN0LnBvcChpKQorICAgICAgICBzZWxmLnZhbHVlbGlzdC5wb3AoaSkKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5rZXlsaXN0KQorICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICBkID0gc2VsZi5fX2NsYXNzX18oKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgZFtrZXldID0gdmFsdWUKKyAgICAgICAgcmV0dXJuIGQKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbWtleXMoY2xzLCBrZXlzLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgZCA9IGNscygpCisgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgIGRba2V5XSA9IHZhbHVlCisgICAgICAgIHJldHVybiBkCisKK2NsYXNzIFVzZXJEaWN0TWl4aW5UZXN0KG1hcHBpbmdfdGVzdHMuVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgdHlwZTJ0ZXN0ID0gU2VxRGljdAorCisgICAgZGVmIHRlc3RfYWxsKHNlbGYpOgorICAgICAgICAjIyBTZXR1cCB0ZXN0IGFuZCB2ZXJpZnkgd29ya2luZyBvZiB0aGUgdGVzdCBjbGFzcworCisgICAgICAgICMgY2hlY2sgaW5pdAorICAgICAgICBzID0gU2VxRGljdCgpCisKKyAgICAgICAgIyBleGVyY2lzZSBzZXRpdGVtCisgICAgICAgIHNbMTBdID0gJ3RlbicKKyAgICAgICAgc1syMF0gPSAndHdlbnR5JworICAgICAgICBzWzMwXSA9ICd0aGlydHknCisKKyAgICAgICAgIyBleGVyY2lzZSBkZWxpdGVtCisgICAgICAgIGRlbCBzWzIwXQorICAgICAgICAjIGNoZWNrIGdldGl0ZW0gYW5kIHNldGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzWzEwXSwgJ3RlbicpCisgICAgICAgICMgY2hlY2sga2V5cygpIGFuZCBkZWxpdGVtCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5rZXlzKCksIFsxMCwgMzBdKQorCisgICAgICAgICMjIE5vdywgdGVzdCB0aGUgRGljdE1peGluIG1ldGhvZHMgb25lIGJ5IG9uZQorICAgICAgICAjIGhhc19rZXkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaGFzX2tleSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgcy5oYXNfa2V5KDIwKSkKKworICAgICAgICAjIF9fY29udGFpbnNfXworICAgICAgICBzZWxmLmFzc2VydEluKDEwLCBzKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDIwLCBzKQorCisgICAgICAgICMgX19pdGVyX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbayBmb3IgayBpbiBzXSwgWzEwLCAzMF0pCisKKyAgICAgICAgIyBfX2xlbl9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCAyKQorCisgICAgICAgICMgaXRlcml0ZW1zCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzLml0ZXJpdGVtcygpKSwgWygxMCwndGVuJyksICgzMCwgJ3RoaXJ0eScpXSkKKworICAgICAgICAjIGl0ZXJrZXlzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzLml0ZXJrZXlzKCkpLCBbMTAsIDMwXSkKKworICAgICAgICAjIGl0ZXJ2YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHMuaXRlcnZhbHVlcygpKSwgWyd0ZW4nLCAndGhpcnR5J10pCisKKyAgICAgICAgIyB2YWx1ZXMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlcygpLCBbJ3RlbicsICd0aGlydHknXSkKKworICAgICAgICAjIGl0ZW1zCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5pdGVtcygpLCBbKDEwLCd0ZW4nKSwgKDMwLCAndGhpcnR5JyldKQorCisgICAgICAgICMgZ2V0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXQoMTApLCAndGVuJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldCgxNSwnZmlmdGVlbicpLCAnZmlmdGVlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXQoMTUpLCBOb25lKQorCisgICAgICAgICMgc2V0ZGVmYXVsdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc2V0ZGVmYXVsdCg0MCwgJ2ZvcnR5JyksICdmb3J0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5zZXRkZWZhdWx0KDEwLCAnbnVsbCcpLCAndGVuJykKKyAgICAgICAgZGVsIHNbNDBdCisKKyAgICAgICAgIyBwb3AKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnBvcCgxMCksICd0ZW4nKQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEwLCBzKQorICAgICAgICBzWzEwXSA9ICd0ZW4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5wb3AoIngiLCAxKSwgMSkKKyAgICAgICAgc1sieCJdID0gNDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnBvcCgieCIsIDEpLCA0MikKKworICAgICAgICAjIHBvcGl0ZW0KKyAgICAgICAgaywgdiA9IHMucG9waXRlbSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oaywgcykKKyAgICAgICAgc1trXSA9IHYKKworICAgICAgICAjIGNsZWFyCisgICAgICAgIHMuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgMCkKKworICAgICAgICAjIGVtcHR5IHBvcGl0ZW0KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHMucG9waXRlbSkKKworICAgICAgICAjIHVwZGF0ZQorICAgICAgICBzLnVwZGF0ZSh7MTA6ICd0ZW4nLCAyMDondHdlbnR5J30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc1sxMF0sICd0ZW4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMjBdLCAndHdlbnR5JykKKworICAgICAgICAjIGNtcAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHsxMDogJ3RlbicsIDIwOid0d2VudHknfSkKKyAgICAgICAgdCA9IFNlcURpY3QoKQorICAgICAgICB0WzIwXSA9ICd0d2VudHknCisgICAgICAgIHRbMTBdID0gJ3RlbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCB0KQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgVXNlckRpY3RUZXN0LAorICAgICAgICBVc2VyRGljdE1peGluVGVzdAorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmRpY3QucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmRpY3QucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDk1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmRpY3QucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmRpY3QucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmZDk1ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VyZGljdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmxpc3QucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VybGlzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjYwMWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcmxpc3QucHkKQEAgLTAsMCArMSw2MSBAQAorIyBDaGVjayBldmVyeSBwYXRoIHRocm91Z2ggZXZlcnkgbWV0aG9kIG9mIFVzZXJMaXN0CisKK2Zyb20gVXNlckxpc3QgaW1wb3J0IFVzZXJMaXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgbGlzdF90ZXN0cworCitjbGFzcyBVc2VyTGlzdFRlc3QobGlzdF90ZXN0cy5Db21tb25UZXN0KToKKyAgICB0eXBlMnRlc3QgPSBVc2VyTGlzdAorCisgICAgZGVmIHRlc3RfZ2V0c2xpY2Uoc2VsZik6CisgICAgICAgIHN1cGVyKFVzZXJMaXN0VGVzdCwgc2VsZikudGVzdF9nZXRzbGljZSgpCisgICAgICAgIGwgPSBbMCwgMSwgMiwgMywgNF0KKyAgICAgICAgdSA9IHNlbGYudHlwZTJ0ZXN0KGwpCisgICAgICAgIGZvciBpIGluIHJhbmdlKC0zLCA2KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVs6aV0sIGxbOmldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1W2k6XSwgbFtpOl0pCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoLTMsIDYpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVtpOmpdLCBsW2k6al0pCisKKyAgICBkZWYgdGVzdF9hZGRfc3BlY2lhbHMoc2VsZik6CisgICAgICAgIHUgPSBVc2VyTGlzdCgic3BhbSIpCisgICAgICAgIHUyID0gdSArICJlZ2dzIgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyLCBsaXN0KCJzcGFtZWdncyIpKQorCisgICAgZGVmIHRlc3RfcmFkZF9zcGVjaWFscyhzZWxmKToKKyAgICAgICAgdSA9IFVzZXJMaXN0KCJlZ2dzIikKKyAgICAgICAgdTIgPSAic3BhbSIgKyB1CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIGxpc3QoInNwYW1lZ2dzIikpCisgICAgICAgIHUyID0gdS5fX3JhZGRfXyhVc2VyTGlzdCgic3BhbSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUyLCBsaXN0KCJzcGFtZWdncyIpKQorCisgICAgZGVmIHRlc3RfaWFkZChzZWxmKToKKyAgICAgICAgc3VwZXIoVXNlckxpc3RUZXN0LCBzZWxmKS50ZXN0X2lhZGQoKQorICAgICAgICB1ID0gWzAsIDFdCisgICAgICAgIHUgKz0gVXNlckxpc3QoWzAsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIFswLCAxLCAwLCAxXSkKKworICAgIGRlZiB0ZXN0X21peGVkY21wKHNlbGYpOgorICAgICAgICB1ID0gc2VsZi50eXBlMnRlc3QoWzAsIDFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUsIFswLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh1LCBbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodSwgWzAsIDJdKQorCisgICAgZGVmIHRlc3RfbWl4ZWRhZGQoc2VsZik6CisgICAgICAgIHUgPSBzZWxmLnR5cGUydGVzdChbMCwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSArIFtdLCB1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKyBbMl0sIFswLCAxLCAyXSkKKworICAgIGRlZiB0ZXN0X2dldGl0ZW1vdmVyd3JpdGVpdGVyKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IF9fZ2V0aXRlbV9fIG92ZXJyaWRlcyAqYXJlKiByZWNvZ25pemVkIGJ5IF9faXRlcl9fCisgICAgICAgIGNsYXNzIFQoc2VsZi50eXBlMnRlc3QpOgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0cihrZXkpICsgJyEhIScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVyKFQoKDEsMikpKS5uZXh0KCksICIwISEhIikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3B5M2tfd2FybmluZ3MoCisgICAgICAgICAgICAoIi4rX18oZ2V0fHNldHxkZWwpc2xpY2VfXyBoYXMgYmVlbiByZW1vdmVkIiwgRGVwcmVjYXRpb25XYXJuaW5nKSk6CisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVXNlckxpc3RUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VybGlzdC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VybGlzdC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExODM0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJsaXN0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VybGlzdC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2VybGlzdC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExODM0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJsaXN0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjI1OTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQpAQCAtMCwwICsxLDE0NyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIFVzZXJTdHJpbmcgaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUgbmF0aXZlIGJ1aWx0aW4gc3RyaW5nIHR5cGUuCisjIFVzZXJTdHJpbmcgaW5zdGFuY2VzIHNob3VsZCBiZWhhdmUgc2ltaWxhciB0byBidWlsdGluIHN0cmluZyBvYmplY3RzLgorCitpbXBvcnQgc3RyaW5nCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydCwgc3RyaW5nX3Rlc3RzCitmcm9tIFVzZXJTdHJpbmcgaW1wb3J0IFVzZXJTdHJpbmcsIE11dGFibGVTdHJpbmcKK2ltcG9ydCB3YXJuaW5ncworCitjbGFzcyBVc2VyU3RyaW5nVGVzdCgKKyAgICBzdHJpbmdfdGVzdHMuQ29tbW9uVGVzdCwKKyAgICBzdHJpbmdfdGVzdHMuTWl4aW5TdHJVbmljb2RlVXNlclN0cmluZ1Rlc3QsCisgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyU3RyaW5nVXNlclN0cmluZ1Rlc3QsCisgICAgc3RyaW5nX3Rlc3RzLk1peGluU3RyVXNlclN0cmluZ1Rlc3QKKyAgICApOgorCisgICAgdHlwZTJ0ZXN0ID0gVXNlclN0cmluZworCisgICAgIyBPdmVyd3JpdGUgdGhlIHRocmVlIHRlc3RpbmcgbWV0aG9kcywgYmVjYXVzZSBVc2VyU3RyaW5nCisgICAgIyBjYW4ndCBjb3BlIHdpdGggYXJndW1lbnRzIHByb3BhZ2F0ZWQgdG8gVXNlclN0cmluZworICAgICMgKGFuZCB3ZSBkb24ndCB0ZXN0IHdpdGggc3ViY2xhc3NlcykKKyAgICBkZWYgY2hlY2tlcXVhbChzZWxmLCByZXN1bHQsIG9iamVjdCwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICByZXN1bHQgPSBzZWxmLmZpeHR5cGUocmVzdWx0KQorICAgICAgICBvYmplY3QgPSBzZWxmLmZpeHR5cGUob2JqZWN0KQorICAgICAgICAjIHdlIGRvbid0IGZpeCB0aGUgYXJndW1lbnRzLCBiZWNhdXNlIFVzZXJTdHJpbmcgY2FuJ3QgY29wZSB3aXRoIGl0CisgICAgICAgIHJlYWxyZXN1bHQgPSBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkoKmFyZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICByZXN1bHQsCisgICAgICAgICAgICByZWFscmVzdWx0CisgICAgICAgICkKKworICAgIGRlZiBjaGVja3JhaXNlcyhzZWxmLCBleGMsIG9iamVjdCwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBvYmplY3QgPSBzZWxmLmZpeHR5cGUob2JqZWN0KQorICAgICAgICAjIHdlIGRvbid0IGZpeCB0aGUgYXJndW1lbnRzLCBiZWNhdXNlIFVzZXJTdHJpbmcgY2FuJ3QgY29wZSB3aXRoIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgZXhjLAorICAgICAgICAgICAgZ2V0YXR0cihvYmplY3QsIG1ldGhvZG5hbWUpLAorICAgICAgICAgICAgKmFyZ3MKKyAgICAgICAgKQorCisgICAgZGVmIGNoZWNrY2FsbChzZWxmLCBvYmplY3QsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgb2JqZWN0ID0gc2VsZi5maXh0eXBlKG9iamVjdCkKKyAgICAgICAgIyB3ZSBkb24ndCBmaXggdGhlIGFyZ3VtZW50cywgYmVjYXVzZSBVc2VyU3RyaW5nIGNhbid0IGNvcGUgd2l0aCBpdAorICAgICAgICBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkoKmFyZ3MpCisKK2NsYXNzIE11dGFibGVTdHJpbmdUZXN0KFVzZXJTdHJpbmdUZXN0KToKKyAgICB0eXBlMnRlc3QgPSBNdXRhYmxlU3RyaW5nCisKKyAgICAjIE11dGFibGVTdHJpbmdzIGNhbiBiZSBoYXNoZWQgPT4gZGVhY3RpdmF0ZSB0ZXN0CisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3Rfc2V0aXRlbShzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KCJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzLl9fc2V0aXRlbV9fLCAtNCwgImJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHMuX19zZXRpdGVtX18sIDMsICJiYXIiKQorICAgICAgICBzWy0xXSA9ICJiYXIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImZvYmFyIikKKyAgICAgICAgc1swXSA9ICJiYXIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImJhcm9iYXIiKQorCisgICAgZGVmIHRlc3RfZGVsaXRlbShzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KCJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBzLl9fZGVsaXRlbV9fLCAtNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcy5fX2RlbGl0ZW1fXywgMykKKyAgICAgICAgZGVsIHNbLTFdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImZvIikKKyAgICAgICAgZGVsIHNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAibyIpCisgICAgICAgIGRlbCBzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgIiIpCisKKyAgICBkZWYgdGVzdF9zZXRzbGljZShzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KCJmb28iKQorICAgICAgICBzWzpdID0gImJhciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiYmFyIikKKyAgICAgICAgc1sxOjJdID0gImZvbyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiYmZvb3IiKQorICAgICAgICBzWzE6LTFdID0gVXNlclN0cmluZygiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImJhciIpCisgICAgICAgIHNbMDoxMF0gPSA0MgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICI0MiIpCisKKyAgICBkZWYgdGVzdF9kZWxzbGljZShzZWxmKToKKyAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KCJmb29iYXIiKQorICAgICAgICBkZWwgc1szOjEwXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJmb28iKQorICAgICAgICBkZWwgc1stMToxMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiZm8iKQorCisgICAgZGVmIHRlc3RfZXh0ZW5kZWRfc2V0X2RlbF9zbGljZShzZWxmKToKKyAgICAgICAgaW5kaWNlcyA9ICgwLCBOb25lLCAxLCAzLCAxOSwgMTAwLCAtMSwgLTIsIC0zMSwgLTEwMCkKKyAgICAgICAgb3JpZyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cworICAgICAgICBmb3Igc3RhcnQgaW4gaW5kaWNlczoKKyAgICAgICAgICAgIGZvciBzdG9wIGluIGluZGljZXM6CisgICAgICAgICAgICAgICAgIyBVc2UgaW5kaWNlc1sxOl0gd2hlbiBNdXRhYmxlU3RyaW5nIGNhbiBoYW5kbGUgcmVhbAorICAgICAgICAgICAgICAgICMgZXh0ZW5kZWQgc2xpY2VzCisgICAgICAgICAgICAgICAgZm9yIHN0ZXAgaW4gKE5vbmUsIDEsIC0xKToKKyAgICAgICAgICAgICAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KG9yaWcpCisgICAgICAgICAgICAgICAgICAgIEwgPSBsaXN0KG9yaWcpCisgICAgICAgICAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYSBzbGljZSBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICMgYnV0IHdpdGggKGhvcGVmdWxseSkgZGlmZmVyZW50IGRhdGEuCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBMW3N0YXJ0OnN0b3A6c3RlcF0KKyAgICAgICAgICAgICAgICAgICAgZGF0YS5yZXZlcnNlKCkKKyAgICAgICAgICAgICAgICAgICAgTFtzdGFydDpzdG9wOnN0ZXBdID0gZGF0YQorICAgICAgICAgICAgICAgICAgICBzW3N0YXJ0OnN0b3A6c3RlcF0gPSAiIi5qb2luKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgIiIuam9pbihMKSkKKworICAgICAgICAgICAgICAgICAgICBkZWwgTFtzdGFydDpzdG9wOnN0ZXBdCisgICAgICAgICAgICAgICAgICAgIGRlbCBzW3N0YXJ0OnN0b3A6c3RlcF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiIi5qb2luKEwpKQorCisgICAgZGVmIHRlc3RfaW1tdXRhYmxlKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoImZvb2JhciIpCisgICAgICAgIHMyID0gcy5pbW11dGFibGUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHMyKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoczIsIFVzZXJTdHJpbmcpCisKKyAgICBkZWYgdGVzdF9pYWRkKHNlbGYpOgorICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoImZvbyIpCisgICAgICAgIHMgKz0gImJhciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiZm9vYmFyIikKKyAgICAgICAgcyArPSBVc2VyU3RyaW5nKCJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJmb29iYXJiYXoiKQorICAgICAgICBzICs9IDQyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImZvb2JhcmJhejQyIikKKworICAgIGRlZiB0ZXN0X2ltdWwoc2VsZik6CisgICAgICAgIHMgPSBzZWxmLnR5cGUydGVzdCgiZm9vIikKKyAgICAgICAgcyAqPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgImZvbyIpCisgICAgICAgIHMgKj0gMgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsICJmb29mb28iKQorICAgICAgICBzICo9IC0xCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgIiIpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCAiLipNdXRhYmxlU3RyaW5nIGhhcyBiZWVuIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLipfXyhnZXR8c2V0fGRlbClzbGljZV9fIGhhcyBiZWVuIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVXNlclN0cmluZ1Rlc3QsIE11dGFibGVTdHJpbmdUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZmEyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhZmEyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDQ2YjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weQpAQCAtMCwwICsxLDIwMSBAQAorIiIiCitUZXN0cyBmb3IgdXUgbW9kdWxlLgorTmljayBNYXRoZXdzb24KKyIiIgorCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2ltcG9ydCBzeXMsIG9zLCB1dSwgY1N0cmluZ0lPCitpbXBvcnQgdXUKKworcGxhaW50ZXh0ID0gIlRoZSBzbW9vdGgtc2NhbGVkIHB5dGhvbiBjcmVwdCBvdmVyIHRoZSBzbGVlcGluZyBkb2dcbiIKKworZW5jb2RlZHRleHQgPSAiIiJcCitNNSZBRSgnLU07Vl1UOlwiVVM4ViVMOTYwQDwnRVQ6Jl1OKCYtUjk3IVQoJl1WOTcoQD0mQUUoJy1MOTY1UAorKDo2WUcoJjFPOVBIICIiIgorCitlbmNvZGVkdGV4dHdyYXBwZWQgPSAiYmVnaW4gJTAzbyAlc1xuIiArIGVuY29kZWR0ZXh0LnJlcGxhY2UoIiUiLCAiJSUiKSArICJcbiBcbmVuZFxuIgorCitjbGFzcyBVVVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBpbnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8ocGxhaW50ZXh0KQorICAgICAgICBvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB1dS5lbmNvZGUoaW5wLCBvdXQsICJ0MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksIGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjY2LCAidDEiKSkKKyAgICAgICAgaW5wID0gY1N0cmluZ0lPLlN0cmluZ0lPKHBsYWludGV4dCkKKyAgICAgICAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdXUuZW5jb2RlKGlucCwgb3V0LCAidDEiLCAwNjQ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCBlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY0NCwgInQxIikpCisKKyAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CisgICAgICAgIGlucCA9IGNTdHJpbmdJTy5TdHJpbmdJTyhlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY2NiwgInQxIikpCisgICAgICAgIG91dCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgIHV1LmRlY29kZShpbnAsIG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQuZ2V0dmFsdWUoKSwgcGxhaW50ZXh0KQorICAgICAgICBpbnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oCisgICAgICAgICAgICAiVVVlbmNvZGVkIGZpbGVzIG1heSBjb250YWluIG1hbnkgbGluZXMsXG4iICsKKyAgICAgICAgICAgICJldmVuIHNvbWUgdGhhdCBoYXZlICdiZWdpbicgaW4gdGhlbS5cbiIgKworICAgICAgICAgICAgZW5jb2RlZHRleHR3cmFwcGVkICUgKDA2NjYsICJ0MSIpCisgICAgICAgICkKKyAgICAgICAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdXUuZGVjb2RlKGlucCwgb3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5nZXR2YWx1ZSgpLCBwbGFpbnRleHQpCisKKyAgICBkZWYgdGVzdF90cnVuY2F0ZWRpbnB1dChzZWxmKToKKyAgICAgICAgaW5wID0gY1N0cmluZ0lPLlN0cmluZ0lPKCJiZWdpbiA2NDQgdDFcbiIgKyBlbmNvZGVkdGV4dCkKKyAgICAgICAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXUuZGVjb2RlKGlucCwgb3V0KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IHV1LkVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJUcnVuY2F0ZWQgaW5wdXQgZmlsZSIpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nYmVnaW4oc2VsZik6CisgICAgICAgIGlucCA9IGNTdHJpbmdJTy5TdHJpbmdJTygiIikKKyAgICAgICAgb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXUuZGVjb2RlKGlucCwgb3V0KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJObyBleGNlcHRpb24gcmFpc2VkIikKKyAgICAgICAgZXhjZXB0IHV1LkVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJObyB2YWxpZCBiZWdpbiBsaW5lIGZvdW5kIGluIGlucHV0IGZpbGUiKQorCitjbGFzcyBVVVN0ZElPVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuc3RkaW4gPSBzeXMuc3RkaW4KKyAgICAgICAgc2VsZi5zdGRvdXQgPSBzeXMuc3Rkb3V0CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHN5cy5zdGRpbiA9IHNlbGYuc3RkaW4KKyAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuc3Rkb3V0CisKKyAgICBkZWYgdGVzdF9lbmNvZGUoc2VsZik6CisgICAgICAgIHN5cy5zdGRpbiA9IGNTdHJpbmdJTy5TdHJpbmdJTyhwbGFpbnRleHQpCisgICAgICAgIHN5cy5zdGRvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICB1dS5lbmNvZGUoIi0iLCAiLSIsICJ0MSIsIDA2NjYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBzeXMuc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICBlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY2NiwgInQxIikKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBzeXMuc3RkaW4gPSBjU3RyaW5nSU8uU3RyaW5nSU8oZW5jb2RlZHRleHR3cmFwcGVkICUgKDA2NjYsICJ0MSIpKQorICAgICAgICBzeXMuc3Rkb3V0ID0gY1N0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdXUuZGVjb2RlKCItIiwgIi0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN5cy5zdGRvdXQuZ2V0dmFsdWUoKSwgcGxhaW50ZXh0KQorCitjbGFzcyBVVUZpbGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBfa2lsbChzZWxmLCBmKToKKyAgICAgICAgIyBjbG9zZSBhbmQgcmVtb3ZlIGZpbGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCAoU3lzdGVtRXhpdCwgS2V5Ym9hcmRJbnRlcnJ1cHQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy51bmxpbmsoZi5uYW1lKQorICAgICAgICBleGNlcHQgKFN5c3RlbUV4aXQsIEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi50bXBpbiAgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOICsgImkiCisgICAgICAgIHNlbGYudG1wb3V0ID0gdGVzdF9zdXBwb3J0LlRFU1RGTiArICJvIgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi50bXBpbgorICAgICAgICBkZWwgc2VsZi50bXBvdXQKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZmluID0gZm91dCA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhzZWxmLnRtcGluKQorICAgICAgICAgICAgZmluID0gb3BlbihzZWxmLnRtcGluLCAnd2InKQorICAgICAgICAgICAgZmluLndyaXRlKHBsYWludGV4dCkKKyAgICAgICAgICAgIGZpbi5jbG9zZSgpCisKKyAgICAgICAgICAgIGZpbiA9IG9wZW4oc2VsZi50bXBpbiwgJ3JiJykKKyAgICAgICAgICAgIGZvdXQgPSBvcGVuKHNlbGYudG1wb3V0LCAndycpCisgICAgICAgICAgICB1dS5lbmNvZGUoZmluLCBmb3V0LCBzZWxmLnRtcGluLCBtb2RlPTA2NDQpCisgICAgICAgICAgICBmaW4uY2xvc2UoKQorICAgICAgICAgICAgZm91dC5jbG9zZSgpCisKKyAgICAgICAgICAgIGZvdXQgPSBvcGVuKHNlbGYudG1wb3V0LCAncicpCisgICAgICAgICAgICBzID0gZm91dC5yZWFkKCkKKyAgICAgICAgICAgIGZvdXQuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY0NCwgc2VsZi50bXBpbikpCisKKyAgICAgICAgICAgICMgaW5fZmlsZSBhbmQgb3V0X2ZpbGUgYXMgZmlsZW5hbWVzCisgICAgICAgICAgICB1dS5lbmNvZGUoc2VsZi50bXBpbiwgc2VsZi50bXBvdXQsIHNlbGYudG1waW4sIG1vZGU9MDY0NCkKKyAgICAgICAgICAgIGZvdXQgPSBvcGVuKHNlbGYudG1wb3V0LCAncicpCisgICAgICAgICAgICBzID0gZm91dC5yZWFkKCkKKyAgICAgICAgICAgIGZvdXQuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBlbmNvZGVkdGV4dHdyYXBwZWQgJSAoMDY0NCwgc2VsZi50bXBpbikpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2tpbGwoZmluKQorICAgICAgICAgICAgc2VsZi5fa2lsbChmb3V0KQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBmID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKHNlbGYudG1waW4pCisgICAgICAgICAgICBmID0gb3BlbihzZWxmLnRtcGluLCAndycpCisgICAgICAgICAgICBmLndyaXRlKGVuY29kZWR0ZXh0d3JhcHBlZCAlICgwNjQ0LCBzZWxmLnRtcG91dCkpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBpbiwgJ3InKQorICAgICAgICAgICAgdXUuZGVjb2RlKGYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBvdXQsICdyJykKKyAgICAgICAgICAgIHMgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHBsYWludGV4dCkKKyAgICAgICAgICAgICMgWFhYIGlzIHRoZXJlIGFuIHhwIHdheSB0byB2ZXJpZnkgdGhlIG1vZGU/CisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9raWxsKGYpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGYgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoc2VsZi50bXBpbikKKyAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYudG1waW4sICd3JykKKyAgICAgICAgICAgIGYud3JpdGUoZW5jb2RlZHRleHR3cmFwcGVkICUgKDA2NDQsIHNlbGYudG1wb3V0KSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICB1dS5kZWNvZGUoc2VsZi50bXBpbikKKworICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBvdXQsICdyJykKKyAgICAgICAgICAgIHMgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHBsYWludGV4dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2tpbGwoZikKKworICAgIGRlZiB0ZXN0X2RlY29kZXR3aWNlKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0IGRlY29kZSgpIHdpbGwgcmVmdXNlIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlCisgICAgICAgIGYgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oZW5jb2RlZHRleHR3cmFwcGVkICUgKDA2NDQsIHNlbGYudG1wb3V0KSkKKworICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBpbiwgJ3InKQorICAgICAgICAgICAgdXUuZGVjb2RlKGYpCisgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi50bXBpbiwgJ3InKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModXUuRXJyb3IsIHV1LmRlY29kZSwgZikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fa2lsbChmKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChVVVRlc3QsIFVVU3RkSU9UZXN0LCBVVUZpbGVUZXN0KQorCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXUucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYmVlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXUucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYmVlM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF91dS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1aWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwMzA4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1aWQucHkKQEAgLTAsMCArMSw0ODIgQEAKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHV1aWQKKworZGVmIGltcG9ydGFibGUobmFtZSk6CisgICAgdHJ5OgorICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0OgorICAgICAgICByZXR1cm4gRmFsc2UKKworY2xhc3MgVGVzdFVVSUQoVGVzdENhc2UpOgorICAgIGxhc3Rfbm9kZSA9IE5vbmUKKyAgICBzb3VyY2Uybm9kZSA9IHt9CisKKyAgICBkZWYgdGVzdF9VVUlEKHNlbGYpOgorICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYXNjZW5kaW5nID0gW10KKyAgICAgICAgZm9yIChzdHJpbmcsIGN1cmx5LCBoZXgsIGJ5dGVzLCBieXRlc19sZSwgZmllbGRzLCBpbnRlZ2VyLCB1cm4sCisgICAgICAgICAgICAgdGltZSwgY2xvY2tfc2VxLCB2YXJpYW50LCB2ZXJzaW9uKSBpbiBbCisgICAgICAgICAgICAoJzAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMCcsCisgICAgICAgICAgICAgJ3swMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB9JywKKyAgICAgICAgICAgICAnMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLAorICAgICAgICAgICAgICdcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMCcsCisgICAgICAgICAgICAgJ1wwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwJywKKyAgICAgICAgICAgICAoMCwgMCwgMCwgMCwgMCwgMCksCisgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJywKKyAgICAgICAgICAgICAwLCAwLCB1dWlkLlJFU0VSVkVEX05DUywgTm9uZSksCisgICAgICAgICAgICAoJzAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZicsCisgICAgICAgICAgICAgJ3swMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGZ9JywKKyAgICAgICAgICAgICAnMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYnLAorICAgICAgICAgICAgICdcMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHRcblx4MGJceDBjXHgwZFx4MGVceDBmJywKKyAgICAgICAgICAgICAnXHgwM1x4MDJceDAxXDBceDA1XHgwNFx4MDdceDA2XHgwOFx0XG5ceDBiXHgwY1x4MGRceDBlXHgwZicsCisgICAgICAgICAgICAgKDB4MDAwMTAyMDNMLCAweDA0MDUsIDB4MDYwNywgOCwgOSwgMHgwYTBiMGMwZDBlMGZMKSwKKyAgICAgICAgICAgICAweDAwMDEwMjAzMDQwNTA2MDcwODA5MGEwYjBjMGQwZTBmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJywKKyAgICAgICAgICAgICAweDYwNzA0MDUwMDAxMDIwM0wsIDB4ODA5LCB1dWlkLlJFU0VSVkVEX05DUywgTm9uZSksCisgICAgICAgICAgICAoJzAyZDllNmQ1LTk0NjctMzgyZS04ZjliLTkzMDBhNjRhYzNjZCcsCisgICAgICAgICAgICAgJ3swMmQ5ZTZkNS05NDY3LTM4MmUtOGY5Yi05MzAwYTY0YWMzY2R9JywKKyAgICAgICAgICAgICAnMDJkOWU2ZDU5NDY3MzgyZThmOWI5MzAwYTY0YWMzY2QnLAorICAgICAgICAgICAgICdceDAyXHhkOVx4ZTZceGQ1XHg5NFx4NjdceDM4XHgyZVx4OGZceDliXHg5M1x4MDBceGE2XHg0YVx4YzNceGNkJywKKyAgICAgICAgICAgICAnXHhkNVx4ZTZceGQ5XHgwMlx4NjdceDk0XHgyZVx4MzhceDhmXHg5Ylx4OTNceDAwXHhhNlx4NGFceGMzXHhjZCcsCisgICAgICAgICAgICAgKDB4MDJkOWU2ZDVMLCAweDk0NjcsIDB4MzgyZSwgMHg4ZiwgMHg5YiwgMHg5MzAwYTY0YWMzY2RMKSwKKyAgICAgICAgICAgICAweDAyZDllNmQ1OTQ2NzM4MmU4ZjliOTMwMGE2NGFjM2NkTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6MDJkOWU2ZDUtOTQ2Ny0zODJlLThmOWItOTMwMGE2NGFjM2NkJywKKyAgICAgICAgICAgICAweDgyZTk0NjcwMmQ5ZTZkNUwsIDB4ZjliLCB1dWlkLlJGQ180MTIyLCAzKSwKKyAgICAgICAgICAgICgnMTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JywKKyAgICAgICAgICAgICAnezEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OH0nLAorICAgICAgICAgICAgICcxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3OCcsCisgICAgICAgICAgICAgJ1x4MTJceDM0XHg1Nlx4NzgnKjQsCisgICAgICAgICAgICAgJ1x4NzhceDU2XHgzNFx4MTJceDM0XHgxMlx4NzhceDU2XHgxMlx4MzRceDU2XHg3OFx4MTJceDM0XHg1Nlx4NzgnLAorICAgICAgICAgICAgICgweDEyMzQ1Njc4LCAweDEyMzQsIDB4NTY3OCwgMHgxMiwgMHgzNCwgMHg1Njc4MTIzNDU2NzgpLAorICAgICAgICAgICAgIDB4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcsCisgICAgICAgICAgICAgMHg2NzgxMjM0MTIzNDU2NzhMLCAweDEyMzQsIHV1aWQuUkVTRVJWRURfTkNTLCBOb25lKSwKKyAgICAgICAgICAgICgnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnezZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOH0nLAorICAgICAgICAgICAgICc2YmE3YjgxMDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ1x4NmJceGE3XHhiOFx4MTBceDlkXHhhZFx4MTFceGQxXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICdceDEwXHhiOFx4YTdceDZiXHhhZFx4OWRceGQxXHgxMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxMEwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTA5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODEwTCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ3s2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzh9JywKKyAgICAgICAgICAgICAnNmJhN2I4MTE5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICdceDZiXHhhN1x4YjhceDExXHg5ZFx4YWRceDExXHhkMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAnXHgxMVx4YjhceGE3XHg2Ylx4YWRceDlkXHhkMVx4MTFceDgwXHhiNFx4MDBceGMwXHg0Zlx4ZDRceDMwXHhjOCcsCisgICAgICAgICAgICAgKDB4NmJhN2I4MTFMLCAweDlkYWQsIDB4MTFkMSwgMHg4MCwgMHhiNCwgMHgwMGMwNGZkNDMwYzhMKSwKKyAgICAgICAgICAgICAweDZiYTdiODExOWRhZDExZDE4MGI0MDBjMDRmZDQzMGM4TCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6NmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAweDFkMTlkYWQ2YmE3YjgxMUwsIDB4YjQsIHV1aWQuUkZDXzQxMjIsIDEpLAorICAgICAgICAgICAgKCc2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgICd7NmJhN2I4MTItOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4fScsCisgICAgICAgICAgICAgJzZiYTdiODEyOWRhZDExZDE4MGI0MDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnXHg2Ylx4YTdceGI4XHgxMlx4OWRceGFkXHgxMVx4ZDFceDgwXHhiNFx4MDBceGMwXHg0Zlx4ZDRceDMwXHhjOCcsCisgICAgICAgICAgICAgJ1x4MTJceGI4XHhhN1x4NmJceGFkXHg5ZFx4ZDFceDExXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICgweDZiYTdiODEyTCwgMHg5ZGFkLCAweDExZDEsIDB4ODAsIDB4YjQsIDB4MDBjMDRmZDQzMGM4TCksCisgICAgICAgICAgICAgMHg2YmE3YjgxMjlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjZiYTdiODEyLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgMHgxZDE5ZGFkNmJhN2I4MTJMLCAweGI0LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnNmJhN2I4MTQtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnezZiYTdiODE0LTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOH0nLAorICAgICAgICAgICAgICc2YmE3YjgxNDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ1x4NmJceGE3XHhiOFx4MTRceDlkXHhhZFx4MTFceGQxXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICdceDE0XHhiOFx4YTdceDZiXHhhZFx4OWRceGQxXHgxMVx4ODBceGI0XHgwMFx4YzBceDRmXHhkNFx4MzBceGM4JywKKyAgICAgICAgICAgICAoMHg2YmE3YjgxNEwsIDB4OWRhZCwgMHgxMWQxLCAweDgwLCAweGI0LCAweDAwYzA0ZmQ0MzBjOEwpLAorICAgICAgICAgICAgIDB4NmJhN2I4MTQ5ZGFkMTFkMTgwYjQwMGMwNGZkNDMwYzhMLAorICAgICAgICAgICAgICd1cm46dXVpZDo2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnLAorICAgICAgICAgICAgIDB4MWQxOWRhZDZiYTdiODE0TCwgMHhiNCwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJzdkNDQ0ODQwLTlkYzAtMTFkMS1iMjQ1LTVmZmRjZTc0ZmFkMicsCisgICAgICAgICAgICAgJ3s3ZDQ0NDg0MC05ZGMwLTExZDEtYjI0NS01ZmZkY2U3NGZhZDJ9JywKKyAgICAgICAgICAgICAnN2Q0NDQ4NDA5ZGMwMTFkMWIyNDU1ZmZkY2U3NGZhZDInLAorICAgICAgICAgICAgICdceDdkXHg0NFx4NDhceDQwXHg5ZFx4YzBceDExXHhkMVx4YjJceDQ1XHg1Zlx4ZmRceGNlXHg3NFx4ZmFceGQyJywKKyAgICAgICAgICAgICAnXHg0MFx4NDhceDQ0XHg3ZFx4YzBceDlkXHhkMVx4MTFceGIyXHg0NVx4NWZceGZkXHhjZVx4NzRceGZhXHhkMicsCisgICAgICAgICAgICAgKDB4N2Q0NDQ4NDBMLCAweDlkYzAsIDB4MTFkMSwgMHhiMiwgMHg0NSwgMHg1ZmZkY2U3NGZhZDJMKSwKKyAgICAgICAgICAgICAweDdkNDQ0ODQwOWRjMDExZDFiMjQ1NWZmZGNlNzRmYWQyTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6N2Q0NDQ4NDAtOWRjMC0xMWQxLWIyNDUtNWZmZGNlNzRmYWQyJywKKyAgICAgICAgICAgICAweDFkMTlkYzA3ZDQ0NDg0MEwsIDB4MzI0NSwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJ2U5MDI4OTNhLTlkMjItM2M3ZS1hN2I4LWQ2ZTMxM2I3MWQ5ZicsCisgICAgICAgICAgICAgJ3tlOTAyODkzYS05ZDIyLTNjN2UtYTdiOC1kNmUzMTNiNzFkOWZ9JywKKyAgICAgICAgICAgICAnZTkwMjg5M2E5ZDIyM2M3ZWE3YjhkNmUzMTNiNzFkOWYnLAorICAgICAgICAgICAgICdceGU5XHgwMlx4ODlceDNhXHg5ZFx4MjJceDNjXHg3ZVx4YTdceGI4XHhkNlx4ZTNceDEzXHhiN1x4MWRceDlmJywKKyAgICAgICAgICAgICAnXHgzYVx4ODlceDAyXHhlOVx4MjJceDlkXHg3ZVx4M2NceGE3XHhiOFx4ZDZceGUzXHgxM1x4YjdceDFkXHg5ZicsCisgICAgICAgICAgICAgKDB4ZTkwMjg5M2FMLCAweDlkMjIsIDB4M2M3ZSwgMHhhNywgMHhiOCwgMHhkNmUzMTNiNzFkOWZMKSwKKyAgICAgICAgICAgICAweGU5MDI4OTNhOWQyMjNjN2VhN2I4ZDZlMzEzYjcxZDlmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmJywKKyAgICAgICAgICAgICAweGM3ZTlkMjJlOTAyODkzYUwsIDB4MjdiOCwgdXVpZC5SRkNfNDEyMiwgMyksCisgICAgICAgICAgICAoJ2ViNDI0MDI2LTZmNTQtNGVmOC1hNGQwLWJiNjU4YTFmYzZjZicsCisgICAgICAgICAgICAgJ3tlYjQyNDAyNi02ZjU0LTRlZjgtYTRkMC1iYjY1OGExZmM2Y2Z9JywKKyAgICAgICAgICAgICAnZWI0MjQwMjY2ZjU0NGVmOGE0ZDBiYjY1OGExZmM2Y2YnLAorICAgICAgICAgICAgICdceGViXHg0Mlx4NDBceDI2XHg2Zlx4NTRceDRlXHhmOFx4YTRceGQwXHhiYlx4NjVceDhhXHgxZlx4YzZceGNmJywKKyAgICAgICAgICAgICAnXHgyNlx4NDBceDQyXHhlYlx4NTRceDZmXHhmOFx4NGVceGE0XHhkMFx4YmJceDY1XHg4YVx4MWZceGM2XHhjZicsCisgICAgICAgICAgICAgKDB4ZWI0MjQwMjZMLCAweDZmNTQsIDB4NGVmOCwgMHhhNCwgMHhkMCwgMHhiYjY1OGExZmM2Y2ZMKSwKKyAgICAgICAgICAgICAweGViNDI0MDI2NmY1NDRlZjhhNGQwYmI2NThhMWZjNmNmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZWI0MjQwMjYtNmY1NC00ZWY4LWE0ZDAtYmI2NThhMWZjNmNmJywKKyAgICAgICAgICAgICAweGVmODZmNTRlYjQyNDAyNkwsIDB4MjRkMCwgdXVpZC5SRkNfNDEyMiwgNCksCisgICAgICAgICAgICAoJ2Y4MWQ0ZmFlLTdkZWMtMTFkMC1hNzY1LTAwYTBjOTFlNmJmNicsCisgICAgICAgICAgICAgJ3tmODFkNGZhZS03ZGVjLTExZDAtYTc2NS0wMGEwYzkxZTZiZjZ9JywKKyAgICAgICAgICAgICAnZjgxZDRmYWU3ZGVjMTFkMGE3NjUwMGEwYzkxZTZiZjYnLAorICAgICAgICAgICAgICdceGY4XHgxZFx4NGZceGFlXHg3ZFx4ZWNceDExXHhkMFx4YTdceDY1XHgwMFx4YTBceGM5XHgxZVx4NmJceGY2JywKKyAgICAgICAgICAgICAnXHhhZVx4NGZceDFkXHhmOFx4ZWNceDdkXHhkMFx4MTFceGE3XHg2NVx4MDBceGEwXHhjOVx4MWVceDZiXHhmNicsCisgICAgICAgICAgICAgKDB4ZjgxZDRmYWVMLCAweDdkZWMsIDB4MTFkMCwgMHhhNywgMHg2NSwgMHgwMGEwYzkxZTZiZjZMKSwKKyAgICAgICAgICAgICAweGY4MWQ0ZmFlN2RlYzExZDBhNzY1MDBhMGM5MWU2YmY2TCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZjgxZDRmYWUtN2RlYy0xMWQwLWE3NjUtMDBhMGM5MWU2YmY2JywKKyAgICAgICAgICAgICAweDFkMDdkZWNmODFkNGZhZUwsIDB4Mjc2NSwgdXVpZC5SRkNfNDEyMiwgMSksCisgICAgICAgICAgICAoJ2ZmZmVmZGZjLWZmZmUtZmZmZS1mZmZlLWZmZmVmZGZjZmJmYScsCisgICAgICAgICAgICAgJ3tmZmZlZmRmYy1mZmZlLWZmZmUtZmZmZS1mZmZlZmRmY2ZiZmF9JywKKyAgICAgICAgICAgICAnZmZmZWZkZmNmZmZlZmZmZWZmZmVmZmZlZmRmY2ZiZmEnLAorICAgICAgICAgICAgICdceGZmXHhmZVx4ZmRceGZjXHhmZlx4ZmVceGZmXHhmZVx4ZmZceGZlXHhmZlx4ZmVceGZkXHhmY1x4ZmJceGZhJywKKyAgICAgICAgICAgICAnXHhmY1x4ZmRceGZlXHhmZlx4ZmVceGZmXHhmZVx4ZmZceGZmXHhmZVx4ZmZceGZlXHhmZFx4ZmNceGZiXHhmYScsCisgICAgICAgICAgICAgKDB4ZmZmZWZkZmNMLCAweGZmZmUsIDB4ZmZmZSwgMHhmZiwgMHhmZSwgMHhmZmZlZmRmY2ZiZmFMKSwKKyAgICAgICAgICAgICAweGZmZmVmZGZjZmZmZWZmZmVmZmZlZmZmZWZkZmNmYmZhTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZmZmZWZkZmMtZmZmZS1mZmZlLWZmZmUtZmZmZWZkZmNmYmZhJywKKyAgICAgICAgICAgICAweGZmZWZmZmVmZmZlZmRmY0wsIDB4M2ZmZSwgdXVpZC5SRVNFUlZFRF9GVVRVUkUsIE5vbmUpLAorICAgICAgICAgICAgKCdmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYnLAorICAgICAgICAgICAgICd7ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmfScsCisgICAgICAgICAgICAgJ2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmJywKKyAgICAgICAgICAgICAnXHhmZicqMTYsCisgICAgICAgICAgICAgJ1x4ZmYnKjE2LAorICAgICAgICAgICAgICgweGZmZmZmZmZmTCwgMHhmZmZmTCwgMHhmZmZmTCwgMHhmZiwgMHhmZiwgMHhmZmZmZmZmZmZmZmZMKSwKKyAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmJywKKyAgICAgICAgICAgICAweGZmZmZmZmZmZmZmZmZmZkwsIDB4M2ZmZiwgdXVpZC5SRVNFUlZFRF9GVVRVUkUsIE5vbmUpLAorICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWl2YWxlbnRzID0gW10KKyAgICAgICAgICAgICMgQ29uc3RydWN0IGVhY2ggVVVJRCBpbiBzZXZlcmFsIGRpZmZlcmVudCB3YXlzLgorICAgICAgICAgICAgZm9yIHUgaW4gW3V1aWQuVVVJRChzdHJpbmcpLCB1dWlkLlVVSUQoY3VybHkpLCB1dWlkLlVVSUQoaGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICB1dWlkLlVVSUQoYnl0ZXM9Ynl0ZXMpLCB1dWlkLlVVSUQoYnl0ZXNfbGU9Ynl0ZXNfbGUpLAorICAgICAgICAgICAgICAgICAgICAgIHV1aWQuVVVJRChmaWVsZHM9ZmllbGRzKSwgdXVpZC5VVUlEKGludD1pbnRlZ2VyKSwKKyAgICAgICAgICAgICAgICAgICAgICB1dWlkLlVVSUQodXJuKV06CisgICAgICAgICAgICAgICAgIyBUZXN0IGFsbCBjb252ZXJzaW9ucyBhbmQgcHJvcGVydGllcyBvZiB0aGUgVVVJRCBvYmplY3QuCisgICAgICAgICAgICAgICAgZXF1YWwoc3RyKHUpLCBzdHJpbmcpCisgICAgICAgICAgICAgICAgZXF1YWwoaW50KHUpLCBpbnRlZ2VyKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuYnl0ZXMsIGJ5dGVzKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuYnl0ZXNfbGUsIGJ5dGVzX2xlKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuZmllbGRzLCBmaWVsZHMpCisgICAgICAgICAgICAgICAgZXF1YWwodS50aW1lX2xvdywgZmllbGRzWzBdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudGltZV9taWQsIGZpZWxkc1sxXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnRpbWVfaGlfdmVyc2lvbiwgZmllbGRzWzJdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIGZpZWxkc1szXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmNsb2NrX3NlcV9sb3csIGZpZWxkc1s0XSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1Lm5vZGUsIGZpZWxkc1s1XSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmhleCwgaGV4KQorICAgICAgICAgICAgICAgIGVxdWFsKHUuaW50LCBpbnRlZ2VyKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudXJuLCB1cm4pCisgICAgICAgICAgICAgICAgZXF1YWwodS50aW1lLCB0aW1lKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuY2xvY2tfc2VxLCBjbG9ja19zZXEpCisgICAgICAgICAgICAgICAgZXF1YWwodS52YXJpYW50LCB2YXJpYW50KQorICAgICAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgdmVyc2lvbikKKyAgICAgICAgICAgICAgICBlcXVpdmFsZW50cy5hcHBlbmQodSkKKworICAgICAgICAgICAgIyBEaWZmZXJlbnQgY29uc3RydWN0aW9uIG1ldGhvZHMgc2hvdWxkIGdpdmUgdGhlIHNhbWUgVVVJRC4KKyAgICAgICAgICAgIGZvciB1IGluIGVxdWl2YWxlbnRzOgorICAgICAgICAgICAgICAgIGZvciB2IGluIGVxdWl2YWxlbnRzOgorICAgICAgICAgICAgICAgICAgICBlcXVhbCh1LCB2KQorICAgICAgICAgICAgYXNjZW5kaW5nLmFwcGVuZCh1KQorCisgICAgICAgICMgVGVzdCBjb21wYXJpc29uIG9mIFVVSURzLgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYXNjZW5kaW5nKSk6CisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4oYXNjZW5kaW5nKSk6CisgICAgICAgICAgICAgICAgZXF1YWwoY21wKGksIGopLCBjbXAoYXNjZW5kaW5nW2ldLCBhc2NlbmRpbmdbal0pKQorCisgICAgICAgICMgVGVzdCBzb3J0aW5nIG9mIFVVSURzIChhYm92ZSBsaXN0IGlzIGluIGFzY2VuZGluZyBvcmRlcikuCisgICAgICAgIHJlc29ydGVkID0gYXNjZW5kaW5nWzpdCisgICAgICAgIHJlc29ydGVkLnJldmVyc2UoKQorICAgICAgICByZXNvcnRlZC5zb3J0KCkKKyAgICAgICAgZXF1YWwoYXNjZW5kaW5nLCByZXNvcnRlZCkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIGJhZHZhbHVlID0gbGFtYmRhIGY6IHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYpCisgICAgICAgIGJhZHR5cGUgPSBsYW1iZGEgZjogc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmKQorCisgICAgICAgICMgQmFkbHkgZm9ybWVkIGhleCBzdHJpbmdzLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnJykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCdhYmMnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1NjcnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4OScpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4ejIzNDU2NzgnKSkKKworICAgICAgICAjIEJhZGx5IGZvcm1lZCBieXRlcy4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9J2FiYycpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChieXRlcz0nXDAnKjE1KSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9J1wwJyoxNykpCisKKyAgICAgICAgIyBCYWRseSBmb3JtZWQgYnl0ZXNfbGUuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzX2xlPSdhYmMnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXNfbGU9J1wwJyoxNSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzX2xlPSdcMCcqMTcpKQorCisgICAgICAgICMgQmFkbHkgZm9ybWVkIGZpZWxkcy4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgxLCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDEsIDIsIDMsIDQsIDUpKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgxLCAyLCAzLCA0LCA1LCA2LCA3KSkpCisKKyAgICAgICAgIyBGaWVsZCB2YWx1ZXMgb3V0IG9mIHJhbmdlLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KC0xLCAwLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMHgxMDAwMDAwMDBMLCAwLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgLTEsIDAsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAweDEwMDAwTCwgMCwgMCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIC0xLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMHgxMDAwMEwsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAtMSwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDB4MTAwTCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDAsIC0xLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgMHgxMDBMLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgMCwgLTEpKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAwLCAwLCAweDEwMDAwMDAwMDAwMDBMKSkpCisKKyAgICAgICAgIyBWZXJzaW9uIG51bWJlciBvdXQgb2YgcmFuZ2UuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcwMCcqMTYsIHZlcnNpb249MCkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCcwMCcqMTYsIHZlcnNpb249NikpCisKKyAgICAgICAgIyBJbnRlZ2VyIHZhbHVlIG91dCBvZiByYW5nZS4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoaW50PS0xKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoaW50PTE8PDEyOEwpKQorCisgICAgICAgICMgTXVzdCBzdXBwbHkgZXhhY3RseSBvbmUgb2YgaGV4LCBieXRlcywgZmllbGRzLCBpbnQuCisgICAgICAgIGgsIGIsIGYsIGkgPSAnMDAnKjE2LCAnXDAnKjE2LCAoMCwgMCwgMCwgMCwgMCwgMCksIDAKKyAgICAgICAgdXVpZC5VVUlEKGgpCisgICAgICAgIHV1aWQuVVVJRChoZXg9aCkKKyAgICAgICAgdXVpZC5VVUlEKGJ5dGVzPWIpCisgICAgICAgIHV1aWQuVVVJRChieXRlc19sZT1iKQorICAgICAgICB1dWlkLlVVSUQoZmllbGRzPWYpCisgICAgICAgIHV1aWQuVVVJRChpbnQ9aSkKKworICAgICAgICAjIFdyb25nIG51bWJlciBvZiBhcmd1bWVudHMgKHBvc2l0aW9uYWwpLgorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYiwgYikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYiwgYiwgZikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYiwgYiwgZiwgaSkpCisKKyAgICAgICAgIyBEdXBsaWNhdGUgYXJndW1lbnRzLgorICAgICAgICBmb3IgaGggaW4gW1tdLCBbKCdoZXgnLCBoKV1dOgorICAgICAgICAgICAgZm9yIGJiIGluIFtbXSwgWygnYnl0ZXMnLCBiKV1dOgorICAgICAgICAgICAgICAgIGZvciBiYmxlIGluIFtbXSwgWygnYnl0ZXNfbGUnLCBiKV1dOgorICAgICAgICAgICAgICAgICAgICBmb3IgaWkgaW4gW1tdLCBbKCdpbnQnLCBpKV1dOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGZmIGluIFtbXSwgWygnZmllbGRzJywgZildXToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzID0gZGljdChoaCArIGJiICsgYmJsZSArIGlpICsgZmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgKiphcmdzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsZW4oYXJncykgIT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRCgqKmFyZ3MpKQorCisgICAgICAgICMgSW1tdXRhYmlsaXR5LgorICAgICAgICB1ID0gdXVpZC5VVUlEKGgpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdoZXgnLCBoKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2J5dGVzJywgYikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdieXRlc19sZScsIGIpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAnZmllbGRzJywgZikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdpbnQnLCBpKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ3RpbWVfbG93JywgMCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICd0aW1lX21pZCcsIDApKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogc2V0YXR0cih1LCAndGltZV9oaV92ZXJzaW9uJywgMCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICd0aW1lX2hpX3ZlcnNpb24nLCAwKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2Nsb2NrX3NlcV9oaV92YXJpYW50JywgMCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdjbG9ja19zZXFfbG93JywgMCkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdub2RlJywgMCkpCisKKyAgICBkZWYgY2hlY2tfbm9kZShzZWxmLCBub2RlLCBzb3VyY2UpOgorICAgICAgICBtZXNzYWdlID0gIiUwMTJ4IGlzIG5vdCBhbiBSRkMgNDEyMiBub2RlIElEIiAlIG5vZGUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPCBub2RlLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm9kZSA8ICgxTCA8PCA0OCksIG1lc3NhZ2UpCisKKyAgICAgICAgVGVzdFVVSUQuc291cmNlMm5vZGVbc291cmNlXSA9IG5vZGUKKyAgICAgICAgaWYgVGVzdFVVSUQubGFzdF9ub2RlOgorICAgICAgICAgICAgaWYgVGVzdFVVSUQubGFzdF9ub2RlICE9IG5vZGU6CisgICAgICAgICAgICAgICAgbXNnID0gImRpZmZlcmVudCBzb3VyY2VzIGRpc2FncmVlIG9uIG5vZGU6XG4iCisgICAgICAgICAgICAgICAgZm9yIHMsIG4gaW4gVGVzdFVVSUQuc291cmNlMm5vZGUuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIG1zZyArPSAiICAgIGZyb20gc291cmNlICVyLCBub2RlIHdhcyAlMDEyeFxuIiAlIChzLCBuKQorICAgICAgICAgICAgICAgICMgVGhlcmUncyBhY3R1YWxseSBubyByZWFzb24gdG8gZXhwZWN0IHRoZSBNQUMgYWRkcmVzc2VzCisgICAgICAgICAgICAgICAgIyB0byBhZ3JlZSBhY3Jvc3MgdmFyaW91cyBtZXRob2RzIC0tIGUuZy4sIGEgYm94IG1heSBoYXZlCisgICAgICAgICAgICAgICAgIyBtdWx0aXBsZSBuZXR3b3JrIGludGVyZmFjZXMsIGFuZCBkaWZmZXJlbnQgd2F5cyBvZiBnZXR0aW5nCisgICAgICAgICAgICAgICAgIyBhIE1BQyBhZGRyZXNzIG1heSBmYXZvciBkaWZmZXJlbnQgSFcuCisgICAgICAgICAgICAgICAgIyNzZWxmLmZhaWwobXNnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVGVzdFVVSUQubGFzdF9ub2RlID0gbm9kZQorCisgICAgZGVmIHRlc3RfaWZjb25maWdfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgICAgICAgICAgbm9kZSA9IHV1aWQuX2lmY29uZmlnX2dldG5vZGUoKQorICAgICAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZSwgJ2lmY29uZmlnJykKKworICAgIGRlZiB0ZXN0X2lwY29uZmlnX2dldG5vZGUoc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBvcy5uYW1lID09ICdudCc6CisgICAgICAgICAgICBub2RlID0gdXVpZC5faXBjb25maWdfZ2V0bm9kZSgpCisgICAgICAgICAgICBpZiBub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZShub2RlLCAnaXBjb25maWcnKQorCisgICAgZGVmIHRlc3RfbmV0Ymlvc19nZXRub2RlKHNlbGYpOgorICAgICAgICBpZiBpbXBvcnRhYmxlKCd3aW4zMnduZXQnKSBhbmQgaW1wb3J0YWJsZSgnbmV0YmlvcycpOgorICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKHV1aWQuX25ldGJpb3NfZ2V0bm9kZSgpLCAnbmV0YmlvcycpCisKKyAgICBkZWYgdGVzdF9yYW5kb21fZ2V0bm9kZShzZWxmKToKKyAgICAgICAgbm9kZSA9IHV1aWQuX3JhbmRvbV9nZXRub2RlKCkKKyAgICAgICAgIyBMZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgZmlyc3Qgb2N0ZXQgbXVzdCBiZSBzZXQuCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlICYgMHgwMTAwMDAwMDAwMDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlIDwgKDFMIDw8IDQ4KSkKKworICAgIGRlZiB0ZXN0X3VuaXhkbGxfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgaW1wb3J0YWJsZSgnY3R5cGVzJykgYW5kIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHRyeTogIyBJc3N1ZXMgMTQ4MSwgMzU4MTogX3V1aWRfZ2VuZXJhdGVfdGltZSgpIG1pZ2h0IGJlIE5vbmUuCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKHV1aWQuX3VuaXhkbGxfZ2V0bm9kZSgpLCAndW5peGRsbCcpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X3dpbmRsbF9nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgaW1wb3J0YWJsZSgnY3R5cGVzJykgYW5kIG9zLm5hbWUgPT0gJ250JzoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZSh1dWlkLl93aW5kbGxfZ2V0bm9kZSgpLCAnd2luZGxsJykKKworICAgIGRlZiB0ZXN0X2dldG5vZGUoc2VsZik6CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgbm9kZTEgPSB1dWlkLmdldG5vZGUoKQorICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZTEsICJnZXRub2RlMSIpCisKKyAgICAgICAgIyBUZXN0IGl0IGFnYWluIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS4KKyAgICAgICAgbm9kZTIgPSB1dWlkLmdldG5vZGUoKQorICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZTIsICJnZXRub2RlMiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub2RlMSwgbm9kZTIpCisKKyAgICBkZWYgdGVzdF91dWlkMShzZWxmKToKKyAgICAgICAgIyB1dWlkMSByZXF1aXJlcyBjdHlwZXMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdXVpZDEoKSBnZW5lcmF0ZXMgVVVJRHMgdGhhdCBhcmUgYWN0dWFsbHkgdmVyc2lvbiAxLgorICAgICAgICBmb3IgdSBpbiBbdXVpZC51dWlkMSgpIGZvciBpIGluIHJhbmdlKDEwKV06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDEpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGdlbmVyYXRlZCBVVUlEcyBhcmUgYWN0dWFsbHkgdW5pcXVlLgorICAgICAgICB1dWlkcyA9IHt9CisgICAgICAgIGZvciB1IGluIFt1dWlkLnV1aWQxKCkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldOgorICAgICAgICAgICAgdXVpZHNbdV0gPSAxCisgICAgICAgIGVxdWFsKGxlbih1dWlkcy5rZXlzKCkpLCAxMDAwKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdXBwbGllZCBub2RlIElEIGFwcGVhcnMgaW4gdGhlIFVVSUQuCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDApCisgICAgICAgIGVxdWFsKHUubm9kZSwgMCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4ZmZmZmZmZmZmZmZmKQorICAgICAgICBlcXVhbCh1Lm5vZGUsIDB4ZmZmZmZmZmZmZmZmKQorCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdXBwbGllZCBjbG9jayBzZXF1ZW5jZSBhcHBlYXJzIGluIHRoZSBVVUlELgorICAgICAgICB1ID0gdXVpZC51dWlkMSgweDEyMzQ1Njc4OWFiYywgMCkKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfCB1LmNsb2NrX3NlcV9sb3csIDApCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4MTIzNDU2Nzg5YWJjLCAweDEyMzQpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHgxMjM0NTY3ODlhYmMpCisgICAgICAgIGVxdWFsKCgodS5jbG9ja19zZXFfaGlfdmFyaWFudCAmIDB4M2YpIDw8IDgpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1LmNsb2NrX3NlcV9sb3csIDB4MTIzNCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMsIDB4M2ZmZikKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIHUuY2xvY2tfc2VxX2xvdywgMHgzZmZmKQorCisgICAgZGVmIHRlc3RfdXVpZDMoc2VsZik6CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgVGVzdCBzb21lIGtub3duIHZlcnNpb24tMyBVVUlEcy4KKyAgICAgICAgZm9yIHUsIHYgaW4gWyh1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9VUkwsICdodHRwOi8vcHl0aG9uLm9yZy8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAnOWZlOGU4YzQtYWFhOC0zMmE5LWE1NWMtNDUzNWE4OGI3NDhkJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9PSUQsICcxLjMuNi4xJyksCisgICAgICAgICAgICAgICAgICAgICAgJ2RkMWExY2VmLTEzZDUtMzY4YS1hZDgyLWVjYTcxYWNkNGNkMScpLAorICAgICAgICAgICAgICAgICAgICAgKHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfWDUwMCwgJ2M9Y2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnNjU4ZDMwMDItZGI2Yi0zMDQwLWExZDEtOGRkZDdkMTg5YTRkJyksCisgICAgICAgICAgICAgICAgICAgIF06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDMpCisgICAgICAgICAgICBlcXVhbCh1LCB1dWlkLlVVSUQodikpCisgICAgICAgICAgICBlcXVhbChzdHIodSksIHYpCisKKyAgICBkZWYgdGVzdF91dWlkNChzZWxmKToKKyAgICAgICAgIyB1dWlkNCByZXF1aXJlcyBjdHlwZXMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdXVpZDQoKSBnZW5lcmF0ZXMgVVVJRHMgdGhhdCBhcmUgYWN0dWFsbHkgdmVyc2lvbiA0LgorICAgICAgICBmb3IgdSBpbiBbdXVpZC51dWlkNCgpIGZvciBpIGluIHJhbmdlKDEwKV06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDQpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIGdlbmVyYXRlZCBVVUlEcyBhcmUgYWN0dWFsbHkgdW5pcXVlLgorICAgICAgICB1dWlkcyA9IHt9CisgICAgICAgIGZvciB1IGluIFt1dWlkLnV1aWQ0KCkgZm9yIGkgaW4gcmFuZ2UoMTAwMCldOgorICAgICAgICAgICAgdXVpZHNbdV0gPSAxCisgICAgICAgIGVxdWFsKGxlbih1dWlkcy5rZXlzKCkpLCAxMDAwKQorCisgICAgZGVmIHRlc3RfdXVpZDUoc2VsZik6CisgICAgICAgIGVxdWFsID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgICMgVGVzdCBzb21lIGtub3duIHZlcnNpb24tNSBVVUlEcy4KKyAgICAgICAgZm9yIHUsIHYgaW4gWyh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnODg2MzEzZTEtM2I4YS01MzcyLTliOTAtMGM5YWVlMTk5ZTVkJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9VUkwsICdodHRwOi8vcHl0aG9uLm9yZy8nKSwKKyAgICAgICAgICAgICAgICAgICAgICAnNGM1NjVmMGQtM2Y1YS01ODkwLWI0MWItMjBjZjQ3NzAxYzVlJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9PSUQsICcxLjMuNi4xJyksCisgICAgICAgICAgICAgICAgICAgICAgJzE0NDdmYTYxLTUyNzctNWZlZi1hOWIzLWZiYzZlNDRmNGFmMycpLAorICAgICAgICAgICAgICAgICAgICAgKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfWDUwMCwgJ2M9Y2EnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnY2M5NTdkZDEtYTk3Mi01MzQ5LTk4Y2QtODc0MTkwMDAyNzk4JyksCisgICAgICAgICAgICAgICAgICAgIF06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDUpCisgICAgICAgICAgICBlcXVhbCh1LCB1dWlkLlVVSUQodikpCisgICAgICAgICAgICBlcXVhbChzdHIodSksIHYpCisKKyAgICBkZWYgdGVzdElzc3VlODYyMShzZWxmKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgaWYgb3MubmFtZSAhPSAncG9zaXgnOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBPbiBhdCBsZWFzdCBzb21lIHZlcnNpb25zIG9mIE9TWCB1dWlkLnV1aWQ0IGdlbmVyYXRlcworICAgICAgICAjIHRoZSBzYW1lIHNlcXVlbmNlIG9mIFVVSURzIGluIHRoZSBwYXJlbnQgYW5kIGFueQorICAgICAgICAjIGNoaWxkcmVuIHN0YXJ0ZWQgdXNpbmcgZm9yay4KKyAgICAgICAgZmRzID0gb3MucGlwZSgpCisgICAgICAgIHBpZCA9IG9zLmZvcmsoKQorICAgICAgICBpZiBwaWQgPT0gMDoKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkc1swXSkKKyAgICAgICAgICAgIHZhbHVlID0gdXVpZC51dWlkNCgpCisgICAgICAgICAgICBvcy53cml0ZShmZHNbMV0sIHZhbHVlLmhleCkKKyAgICAgICAgICAgIG9zLl9leGl0KDApCisKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkc1sxXSkKKyAgICAgICAgICAgIHBhcmVudF92YWx1ZSA9IHV1aWQudXVpZDQoKS5oZXgKKyAgICAgICAgICAgIG9zLndhaXRwaWQocGlkLCAwKQorICAgICAgICAgICAgY2hpbGRfdmFsdWUgPSBvcy5yZWFkKGZkc1swXSwgMTAwKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHBhcmVudF92YWx1ZSwgY2hpbGRfdmFsdWUpCisKKworCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVGVzdFVVSUQpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1aWQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNzlmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1aWQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1aWQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfdXVpZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNzlmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3V1aWQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUwNzgzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQzLnB5CkBAIC0wLDAgKzEsMzkgQEAKKyIiIlRoaXMgdGVzdCBjaGVja3MgZm9yIGNvcnJlY3Qgd2FpdDMoKSBiZWhhdmlvci4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdC5mb3JrX3dhaXQgaW1wb3J0IEZvcmtXYWl0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KKwordHJ5OgorICAgIG9zLmZvcmsKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSB1bml0dGVzdC5Ta2lwVGVzdCwgIm9zLmZvcmsgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF93YWl0MyIKKwordHJ5OgorICAgIG9zLndhaXQzCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgdW5pdHRlc3QuU2tpcFRlc3QsICJvcy53YWl0MyBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X3dhaXQzIgorCitjbGFzcyBXYWl0M1Rlc3QoRm9ya1dhaXQpOgorICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICMgd2FpdDMoKSBzaG91bGRuJ3QgaGFuZywgYnV0IHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBzZWVtIHRvIGhhbmcKKyAgICAgICAgICAgICMgaW4gdGhlIGZvcmtpbmcgdGVzdHMuICBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZml4IHRoZSBwcm9ibGVtLgorICAgICAgICAgICAgc3BpZCwgc3RhdHVzLCBydXNhZ2UgPSBvcy53YWl0Myhvcy5XTk9IQU5HKQorICAgICAgICAgICAgaWYgc3BpZCA9PSBjcGlkOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1c2FnZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChXYWl0M1Rlc3QpCisgICAgcmVhcF9jaGlsZHJlbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjgyOTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjgyOTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQ0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0YTExYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQ0LnB5CkBAIC0wLDAgKzEsMzIgQEAKKyIiIlRoaXMgdGVzdCBjaGVja3MgZm9yIGNvcnJlY3Qgd2FpdDQoKSBiZWhhdmlvci4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCitmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX3VuaXR0ZXN0LCByZWFwX2NoaWxkcmVuLCBnZXRfYXR0cmlidXRlCisKKyMgSWYgZWl0aGVyIG9mIHRoZXNlIGRvIG5vdCBleGlzdCwgc2tpcCB0aGlzIHRlc3QuCitnZXRfYXR0cmlidXRlKG9zLCAnZm9yaycpCitnZXRfYXR0cmlidXRlKG9zLCAnd2FpdDQnKQorCisKK2NsYXNzIFdhaXQ0VGVzdChGb3JrV2FpdCk6CisgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgIyB3YWl0NCgpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZworICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQ0KGNwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1c2FnZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChXYWl0NFRlc3QpCisgICAgcmVhcF9jaGlsZHJlbigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQ0LnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQ0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGUzOWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQ0LnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhaXQ0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGUzOWZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FpdDQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhcm5pbmdzLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwMmVkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CkBAIC0wLDAgKzEsNzYxIEBACitmcm9tIGNvbnRleHRsaWIgaW1wb3J0IGNvbnRleHRtYW5hZ2VyCitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgb3MKK2ltcG9ydCBTdHJpbmdJTworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgc3VicHJvY2VzcworZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gdGVzdC5zY3JpcHRfaGVscGVyIGltcG9ydCBhc3NlcnRfcHl0aG9uX29rCisKK2ltcG9ydCB3YXJuaW5nX3Rlc3RzCisKK2ltcG9ydCB3YXJuaW5ncyBhcyBvcmlnaW5hbF93YXJuaW5ncworCitweV93YXJuaW5ncyA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfZnJlc2hfbW9kdWxlKCd3YXJuaW5ncycsIGJsb2NrZWQ9Wydfd2FybmluZ3MnXSkKK2Nfd2FybmluZ3MgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X2ZyZXNoX21vZHVsZSgnd2FybmluZ3MnLCBmcmVzaD1bJ193YXJuaW5ncyddKQorCitAY29udGV4dG1hbmFnZXIKK2RlZiB3YXJuaW5nc19zdGF0ZShtb2R1bGUpOgorICAgICIiIlVzZSBhIHNwZWNpZmljIHdhcm5pbmdzIGltcGxlbWVudGF0aW9uIGluIHdhcm5pbmdfdGVzdHMuIiIiCisgICAgZ2xvYmFsIF9fd2FybmluZ3JlZ2lzdHJ5X18KKyAgICBmb3IgdG9fY2xlYXIgaW4gKHN5cywgd2FybmluZ190ZXN0cyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRvX2NsZWFyLl9fd2FybmluZ3JlZ2lzdHJ5X18uY2xlYXIoKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgdHJ5OgorICAgICAgICBfX3dhcm5pbmdyZWdpc3RyeV9fLmNsZWFyKCkKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgb3JpZ2luYWxfd2FybmluZ3MgPSB3YXJuaW5nX3Rlc3RzLndhcm5pbmdzCisgICAgb3JpZ2luYWxfZmlsdGVycyA9IG1vZHVsZS5maWx0ZXJzCisgICAgdHJ5OgorICAgICAgICBtb2R1bGUuZmlsdGVycyA9IG9yaWdpbmFsX2ZpbHRlcnNbOl0KKyAgICAgICAgbW9kdWxlLnNpbXBsZWZpbHRlcigib25jZSIpCisgICAgICAgIHdhcm5pbmdfdGVzdHMud2FybmluZ3MgPSBtb2R1bGUKKyAgICAgICAgeWllbGQKKyAgICBmaW5hbGx5OgorICAgICAgICB3YXJuaW5nX3Rlc3RzLndhcm5pbmdzID0gb3JpZ2luYWxfd2FybmluZ3MKKyAgICAgICAgbW9kdWxlLmZpbHRlcnMgPSBvcmlnaW5hbF9maWx0ZXJzCisKKworY2xhc3MgQmFzZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiQmFzaWMgYm9va2tlZXBpbmcgcmVxdWlyZWQgZm9yIHRlc3RpbmcuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgVGhlIF9fd2FybmluZ3JlZ2lzdHJ5X18gbmVlZHMgdG8gYmUgaW4gYSBwcmlzdGluZSBzdGF0ZSBmb3IgdGVzdHMKKyAgICAgICAgIyB0byB3b3JrIHByb3Blcmx5LgorICAgICAgICBpZiAnX193YXJuaW5ncmVnaXN0cnlfXycgaW4gZ2xvYmFscygpOgorICAgICAgICAgICAgZGVsIGdsb2JhbHMoKVsnX193YXJuaW5ncmVnaXN0cnlfXyddCisgICAgICAgIGlmIGhhc2F0dHIod2FybmluZ190ZXN0cywgJ19fd2FybmluZ3JlZ2lzdHJ5X18nKToKKyAgICAgICAgICAgIGRlbCB3YXJuaW5nX3Rlc3RzLl9fd2FybmluZ3JlZ2lzdHJ5X18KKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICdfX3dhcm5pbmdyZWdpc3RyeV9fJyk6CisgICAgICAgICAgICBkZWwgc3lzLl9fd2FybmluZ3JlZ2lzdHJ5X18KKyAgICAgICAgIyBUaGUgJ3dhcm5pbmdzJyBtb2R1bGUgbXVzdCBiZSBleHBsaWNpdGx5IHNldCBzbyB0aGF0IHRoZSBwcm9wZXIKKyAgICAgICAgIyBpbnRlcmFjdGlvbiBiZXR3ZWVuIF93YXJuaW5ncyBhbmQgJ3dhcm5pbmdzJyBjYW4gYmUgY29udHJvbGxlZC4KKyAgICAgICAgc3lzLm1vZHVsZXNbJ3dhcm5pbmdzJ10gPSBzZWxmLm1vZHVsZQorICAgICAgICBzdXBlcihCYXNlVGVzdCwgc2VsZikuc2V0VXAoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMubW9kdWxlc1snd2FybmluZ3MnXSA9IG9yaWdpbmFsX3dhcm5pbmdzCisgICAgICAgIHN1cGVyKEJhc2VUZXN0LCBzZWxmKS50ZWFyRG93bigpCisKKworY2xhc3MgRmlsdGVyVGVzdHMob2JqZWN0KToKKworICAgICIiIlRlc3RpbmcgdGhlIGZpbHRlcmluZyBmdW5jdGlvbmFsaXR5LiIiIgorCisgICAgZGVmIHRlc3RfZXJyb3Ioc2VsZik6CisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCBzZWxmLm1vZHVsZS53YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRmlsdGVyVGVzdHMudGVzdF9lcnJvciIpCisKKyAgICBkZWYgdGVzdF9pZ25vcmUoc2VsZik6CisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKCJGaWx0ZXJUZXN0cy50ZXN0X2lnbm9yZSIsIFVzZXJXYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisKKyAgICBkZWYgdGVzdF9hbHdheXMoc2VsZik6CisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBtZXNzYWdlID0gIkZpbHRlclRlc3RzLnRlc3RfYWx3YXlzIgorICAgICAgICAgICAgc2VsZi5tb2R1bGUud2FybihtZXNzYWdlLCBVc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLCB3Wy0xXS5tZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUud2FybihtZXNzYWdlLCBVc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3Wy0xXS5tZXNzYWdlLCBtZXNzYWdlKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJkZWZhdWx0IiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBtZXNzYWdlID0gVXNlcldhcm5pbmcoIkZpbHRlclRlc3RzLnRlc3RfZGVmYXVsdCIpCisgICAgICAgICAgICBmb3IgeCBpbiB4cmFuZ2UoMik6CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2FybihtZXNzYWdlLCBVc2VyV2FybmluZykKKyAgICAgICAgICAgICAgICBpZiB4ID09IDA6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICAgICAgZGVsIHdbOl0KKyAgICAgICAgICAgICAgICBlbGlmIHggPT0gMToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibG9vcCB2YXJpYW50IHVuaGFuZGxlZCIpCisKKyAgICBkZWYgdGVzdF9tb2R1bGUoc2VsZik6CisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygibW9kdWxlIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBtZXNzYWdlID0gVXNlcldhcm5pbmcoIkZpbHRlclRlc3RzLnRlc3RfbW9kdWxlIikKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4obWVzc2FnZSwgVXNlcldhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdbLTFdLm1lc3NhZ2UsIG1lc3NhZ2UpCisgICAgICAgICAgICBkZWwgd1s6XQorICAgICAgICAgICAgc2VsZi5tb2R1bGUud2FybihtZXNzYWdlLCBVc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAwKQorCisgICAgZGVmIHRlc3Rfb25jZShzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJvbmNlIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBtZXNzYWdlID0gVXNlcldhcm5pbmcoIkZpbHRlclRlc3RzLnRlc3Rfb25jZSIpCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIFVzZXJXYXJuaW5nLCAidGVzdF93YXJuaW5ncy5weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKKyAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIFVzZXJXYXJuaW5nLCAidGVzdF93YXJuaW5ncy5weSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHcpLCAwKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgInRlc3Rfd2FybmluZ3MyLnB5IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisKKyAgICBkZWYgdGVzdF9pbmhlcml0YW5jZShzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIGNhdGVnb3J5PVdhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVc2VyV2FybmluZywgc2VsZi5tb2R1bGUud2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpbHRlclRlc3RzLnRlc3RfaW5oZXJpdGFuY2UiLCBVc2VyV2FybmluZykKKworICAgIGRlZiB0ZXN0X29yZGVyaW5nKHNlbGYpOgorICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kPVRydWUpCisgICAgICAgICAgICBkZWwgd1s6XQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4oIkZpbHRlclRlc3RzLnRlc3Rfb3JkZXJpbmciLCBVc2VyV2FybmluZykKKyAgICAgICAgICAgIGV4Y2VwdCBVc2VyV2FybmluZzoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm9yZGVyIGhhbmRsaW5nIGZvciBhY3Rpb25zIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3KSwgMCkKKworICAgIGRlZiB0ZXN0X2ZpbHRlcndhcm5pbmdzKHNlbGYpOgorICAgICAgICAjIFRlc3QgZmlsdGVyd2FybmluZ3MoKS4KKyAgICAgICAgIyBJbXBsaWNpdGx5IGFsc28gdGVzdHMgcmVzZXR3YXJuaW5ncygpLgorICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsICIiLCBXYXJuaW5nLCAiIiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCBzZWxmLm1vZHVsZS53YXJuLCAnY29udmVydCB0byBlcnJvcicpCisKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgdGV4dCA9ICdoYW5kbGUgbm9ybWFsbHknCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3Wy0xXS5jYXRlZ29yeSBpcyBVc2VyV2FybmluZykKKworICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIiLCBXYXJuaW5nLCAiIiwgMCkKKyAgICAgICAgICAgIHRleHQgPSAnZmlsdGVyZWQgb3V0JworICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzdHIod1stMV0ubWVzc2FnZSksIHRleHQpCisKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLnJlc2V0d2FybmluZ3MoKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgImhleCoiLCBXYXJuaW5nLCAiIiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCBzZWxmLm1vZHVsZS53YXJuLCAnaGV4L29jdCcpCisgICAgICAgICAgICB0ZXh0ID0gJ25vbm1hdGNoaW5nIHRleHQnCisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgdGV4dCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3Wy0xXS5jYXRlZ29yeSBpcyBVc2VyV2FybmluZykKKworY2xhc3MgQ0ZpbHRlclRlc3RzKEJhc2VUZXN0LCBGaWx0ZXJUZXN0cyk6CisgICAgbW9kdWxlID0gY193YXJuaW5ncworCitjbGFzcyBQeUZpbHRlclRlc3RzKEJhc2VUZXN0LCBGaWx0ZXJUZXN0cyk6CisgICAgbW9kdWxlID0gcHlfd2FybmluZ3MKKworCitjbGFzcyBXYXJuVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdCB3YXJuaW5ncy53YXJuKCkgYW5kIHdhcm5pbmdzLndhcm5fZXhwbGljaXQoKS4iIiIKKworICAgIGRlZiB0ZXN0X21lc3NhZ2Uoc2VsZik6CisgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuc2ltcGxlZmlsdGVyKCJvbmNlIikKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDQpOgorICAgICAgICAgICAgICAgIHRleHQgPSAnbXVsdGkgJWQnICVpICAjIERpZmZlcmVudCB0ZXh0IG9uIGVhY2ggY2FsbC4KKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1stMV0ubWVzc2FnZSksIHRleHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdbLTFdLmNhdGVnb3J5IGlzIFVzZXJXYXJuaW5nKQorCisgICAgZGVmIHRlc3RfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIHdpdGggd2FybmluZ3Nfc3RhdGUoc2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIoInNwYW0xIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUod1stMV0uZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdfdGVzdHMucHkiKQorICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMub3V0ZXIoInNwYW0yIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUod1stMV0uZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdfdGVzdHMucHkiKQorCisgICAgZGVmIHRlc3Rfc3RhY2tsZXZlbChzZWxmKToKKyAgICAgICAgIyBUZXN0IHN0YWNrbGV2ZWwgYXJndW1lbnQKKyAgICAgICAgIyBtYWtlIHN1cmUgYWxsIG1lc3NhZ2VzIGFyZSBkaWZmZXJlbnQsIHNvIHRoZSB3YXJuaW5nIHdvbid0IGJlIHNraXBwZWQKKyAgICAgICAgd2l0aCB3YXJuaW5nc19zdGF0ZShzZWxmLm1vZHVsZSk6CisgICAgICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcigic3BhbTMiLCBzdGFja2xldmVsPTEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmJhc2VuYW1lKHdbLTFdLmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3YXJuaW5nX3Rlc3RzLnB5IikKKyAgICAgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLm91dGVyKCJzcGFtNCIsIHN0YWNrbGV2ZWw9MSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUod1stMV0uZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdfdGVzdHMucHkiKQorCisgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcigic3BhbTUiLCBzdGFja2xldmVsPTIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmJhc2VuYW1lKHdbLTFdLmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3dhcm5pbmdzLnB5IikKKyAgICAgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLm91dGVyKCJzcGFtNiIsIHN0YWNrbGV2ZWw9MikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUod1stMV0uZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm5pbmdfdGVzdHMucHkiKQorICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMub3V0ZXIoInNwYW02LjUiLCBzdGFja2xldmVsPTMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcy5wYXRoLmJhc2VuYW1lKHdbLTFdLmZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3dhcm5pbmdzLnB5IikKKworICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIoInNwYW03Iiwgc3RhY2tsZXZlbD05OTk5KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MucGF0aC5iYXNlbmFtZSh3Wy0xXS5maWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3lzIikKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZmlsZW5hbWVfbm90X21haW4oc2VsZik6CisgICAgICAgICMgSWYgX19maWxlX18gaXMgbm90IHNwZWNpZmllZCBhbmQgX19tYWluX18gaXMgbm90IHRoZSBtb2R1bGUgbmFtZSwKKyAgICAgICAgIyB0aGVuIF9fZmlsZV9fIHNob3VsZCBiZSBzZXQgdG8gdGhlIG1vZHVsZSBuYW1lLgorICAgICAgICBmaWxlbmFtZSA9IHdhcm5pbmdfdGVzdHMuX19maWxlX18KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHdhcm5pbmdfdGVzdHMuX19maWxlX18KKyAgICAgICAgICAgIHdpdGggd2FybmluZ3Nfc3RhdGUoc2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIoInNwYW04Iiwgc3RhY2tsZXZlbD0xKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdbLTFdLmZpbGVuYW1lLCB3YXJuaW5nX3Rlc3RzLl9fbmFtZV9fKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd2FybmluZ190ZXN0cy5fX2ZpbGVfXyA9IGZpbGVuYW1lCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2ZpbGVuYW1lX21haW5fd2l0aF9hcmd2KHNlbGYpOgorICAgICAgICAjIElmIF9fZmlsZV9fIGlzIG5vdCBzcGVjaWZpZWQgYW5kIHRoZSBjYWxsZXIgaXMgX19tYWluX18gYW5kIHN5cy5hcmd2CisgICAgICAgICMgZXhpc3RzLCB0aGVuIHVzZSBzeXMuYXJndlswXSBhcyB0aGUgZmlsZS4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAnYXJndicpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbGVuYW1lID0gd2FybmluZ190ZXN0cy5fX2ZpbGVfXworICAgICAgICBtb2R1bGVfbmFtZSA9IHdhcm5pbmdfdGVzdHMuX19uYW1lX18KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHdhcm5pbmdfdGVzdHMuX19maWxlX18KKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19uYW1lX18gPSAnX19tYWluX18nCisgICAgICAgICAgICB3aXRoIHdhcm5pbmdzX3N0YXRlKHNlbGYubW9kdWxlKToKKyAgICAgICAgICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLmlubmVyKCdzcGFtOScsIHN0YWNrbGV2ZWw9MSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5maWxlbmFtZSwgc3lzLmFyZ3ZbMF0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fID0gZmlsZW5hbWUKKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19uYW1lX18gPSBtb2R1bGVfbmFtZQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZV9tYWluX3dpdGhvdXRfYXJndihzZWxmKToKKyAgICAgICAgIyBJZiBfX2ZpbGVfXyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgY2FsbGVyIGlzIF9fbWFpbl9fLCBhbmQgc3lzLmFyZ3YKKyAgICAgICAgIyBpcyBub3Qgc2V0LCB0aGVuICdfX21haW5fXycgaXMgdGhlIGZpbGUgbmFtZS4KKyAgICAgICAgZmlsZW5hbWUgPSB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fCisgICAgICAgIG1vZHVsZV9uYW1lID0gd2FybmluZ190ZXN0cy5fX25hbWVfXworICAgICAgICBhcmd2ID0gc3lzLmFyZ3YKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVsIHdhcm5pbmdfdGVzdHMuX19maWxlX18KKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19uYW1lX18gPSAnX19tYWluX18nCisgICAgICAgICAgICBkZWwgc3lzLmFyZ3YKKyAgICAgICAgICAgIHdpdGggd2FybmluZ3Nfc3RhdGUoc2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIoJ3NwYW0xMCcsIHN0YWNrbGV2ZWw9MSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5maWxlbmFtZSwgJ19fbWFpbl9fJykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuX19maWxlX18gPSBmaWxlbmFtZQorICAgICAgICAgICAgd2FybmluZ190ZXN0cy5fX25hbWVfXyA9IG1vZHVsZV9uYW1lCisgICAgICAgICAgICBzeXMuYXJndiA9IGFyZ3YKKworICAgIGRlZiB0ZXN0X21pc3NpbmdfZmlsZW5hbWVfbWFpbl93aXRoX2FyZ3ZfZW1wdHlfc3RyaW5nKHNlbGYpOgorICAgICAgICAjIElmIF9fZmlsZV9fIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjYWxsZXIgaXMgX19tYWluX18sIGFuZCBzeXMuYXJndlswXQorICAgICAgICAjIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHRoZW4gJ19fbWFpbl9fIGlzIHRoZSBmaWxlIG5hbWUuCisgICAgICAgICMgVGVzdHMgaXNzdWUgMjc0My4KKyAgICAgICAgZmlsZV9uYW1lID0gd2FybmluZ190ZXN0cy5fX2ZpbGVfXworICAgICAgICBtb2R1bGVfbmFtZSA9IHdhcm5pbmdfdGVzdHMuX19uYW1lX18KKyAgICAgICAgYXJndiA9IHN5cy5hcmd2CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fCisgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLl9fbmFtZV9fID0gJ19fbWFpbl9fJworICAgICAgICAgICAgc3lzLmFyZ3YgPSBbJyddCisgICAgICAgICAgICB3aXRoIHdhcm5pbmdzX3N0YXRlKHNlbGYubW9kdWxlKToKKyAgICAgICAgICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlPXNlbGYubW9kdWxlKSBhcyB3OgorICAgICAgICAgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLmlubmVyKCdzcGFtMTEnLCBzdGFja2xldmVsPTEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0uZmlsZW5hbWUsICdfX21haW5fXycpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLl9fZmlsZV9fID0gZmlsZV9uYW1lCisgICAgICAgICAgICB3YXJuaW5nX3Rlc3RzLl9fbmFtZV9fID0gbW9kdWxlX25hbWUKKyAgICAgICAgICAgIHN5cy5hcmd2ID0gYXJndgorCisgICAgZGVmIHRlc3Rfd2Fybl9leHBsaWNpdF90eXBlX2Vycm9ycyhzZWxmKToKKyAgICAgICAgIyB3YXJuX2V4cGxpY2l0KCkgc2hvdWxkIGVycm9yIG91dCBncmFjZWZ1bGx5IGlmIGl0IGlzIGdpdmVuIG9iamVjdHMKKyAgICAgICAgIyBvZiB0aGUgd3JvbmcgdHlwZXMuCisgICAgICAgICMgbGluZW5vIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBVc2VyV2FybmluZywgTm9uZSwgTm9uZSkKKyAgICAgICAgIyBFaXRoZXIgJ21lc3NhZ2UnIG5lZWRzIHRvIGJlIGFuIGluc3RhbmNlIG9mIFdhcm5pbmcgb3IgJ2NhdGVnb3J5JworICAgICAgICAjIG5lZWRzIHRvIGJlIGEgc3ViY2xhc3MuCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLCBOb25lLCBOb25lLCAxKQorICAgICAgICAjICdyZWdpc3RyeScgbXVzdCBiZSBhIGRpY3Qgb3IgTm9uZS4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgV2FybmluZywgTm9uZSwgMSwgcmVnaXN0cnk9NDIpCisKKyAgICBkZWYgdGVzdF9iYWRfc3RyKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDY0MTUKKyAgICAgICAgIyBXYXJuaW5ncyBpbnN0YW5jZSB3aXRoIGEgYmFkIGZvcm1hdCBzdHJpbmcgZm9yIF9fc3RyX18gc2hvdWxkIG5vdAorICAgICAgICAjIHRyaWdnZXIgYSBidXMgZXJyb3IuCisgICAgICAgIGNsYXNzIEJhZFN0cldhcm5pbmcoV2FybmluZyk6CisgICAgICAgICAgICAiIiJXYXJuaW5nIHdpdGggYSBiYWQgZm9ybWF0IHN0cmluZyBmb3IgX19zdHJfXy4iIiIKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAoIkEgYmFkIGZvcm1hdHRlZCBzdHJpbmcgJShlcnIpIiAlCisgICAgICAgICAgICAgICAgICAgICAgICB7ImVyciIgOiAidGhlcmUgaXMgbm8gJShlcnIpcyJ9KQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKEJhZFN0cldhcm5pbmcoKSkKKworCitjbGFzcyBDV2FyblRlc3RzKEJhc2VUZXN0LCBXYXJuVGVzdHMpOgorICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKKworICAgICMgQXMgYW4gZWFybHkgYWRvcHRlciwgd2Ugc2FuaXR5IGNoZWNrIHRoZQorICAgICMgdGVzdF9zdXBwb3J0LmltcG9ydF9mcmVzaF9tb2R1bGUgdXRpbGl0eSBmdW5jdGlvbgorICAgIGRlZiB0ZXN0X2FjY2VsZXJhdGVkKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9yaWdpbmFsX3dhcm5pbmdzIGlzIHNlbGYubW9kdWxlKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIoc2VsZi5tb2R1bGUud2FybiwgJ2Z1bmNfY29kZScpKQorCitjbGFzcyBQeVdhcm5UZXN0cyhCYXNlVGVzdCwgV2FyblRlc3RzKToKKyAgICBtb2R1bGUgPSBweV93YXJuaW5ncworCisgICAgIyBBcyBhbiBlYXJseSBhZG9wdGVyLCB3ZSBzYW5pdHkgY2hlY2sgdGhlCisgICAgIyB0ZXN0X3N1cHBvcnQuaW1wb3J0X2ZyZXNoX21vZHVsZSB1dGlsaXR5IGZ1bmN0aW9uCisgICAgZGVmIHRlc3RfcHVyZV9weXRob24oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3JpZ2luYWxfd2FybmluZ3MgaXMgc2VsZi5tb2R1bGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNlbGYubW9kdWxlLndhcm4sICdmdW5jX2NvZGUnKSkKKworCitjbGFzcyBXQ21kTGluZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2ltcHJvcGVyX2lucHV0KHNlbGYpOgorICAgICAgICAjIFVzZXMgdGhlIHByaXZhdGUgX3NldG9wdGlvbigpIGZ1bmN0aW9uIHRvIHRlc3QgdGhlIHBhcnNpbmcKKyAgICAgICAgIyBvZiBjb21tYW5kLWxpbmUgd2FybmluZyBhcmd1bWVudHMKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5tb2R1bGUuX09wdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuX3NldG9wdGlvbiwgJzE6MjozOjQ6NTo2JykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYubW9kdWxlLl9PcHRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLl9zZXRvcHRpb24sICdib2d1czo6V2FybmluZycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLm1vZHVsZS5fT3B0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5fc2V0b3B0aW9uLCAnaWdub3JlOjI6OjQ6LTUnKQorICAgICAgICAgICAgc2VsZi5tb2R1bGUuX3NldG9wdGlvbignZXJyb3I6Oldhcm5pbmc6OjAnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVXNlcldhcm5pbmcsIHNlbGYubW9kdWxlLndhcm4sICdjb252ZXJ0IHRvIGVycm9yJykKKworICAgIGRlZiB0ZXN0X2ltcHJvcGVyX29wdGlvbihzZWxmKToKKyAgICAgICAgIyBTYW1lIGFzIGFib3ZlLCBidXQgY2hlY2sgdGhhdCB0aGUgbWVzc2FnZSBpcyBwcmludGVkIG91dCB3aGVuCisgICAgICAgICMgdGhlIGludGVycHJldGVyIGlzIGV4ZWN1dGVkLiBUaGlzIGFsc28gY2hlY2tzIHRoYXQgb3B0aW9ucyBhcmUKKyAgICAgICAgIyBhY3R1YWxseSBwYXJzZWQgYXQgYWxsLgorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCItV3h4eCIsICItYyIsICJwYXNzIikKKyAgICAgICAgc2VsZi5hc3NlcnRJbihiIkludmFsaWQgLVcgb3B0aW9uIGlnbm9yZWQ6IGludmFsaWQgYWN0aW9uOiAneHh4JyIsIGVycikKKworICAgIGRlZiB0ZXN0X3dhcm5pbmdzX2Jvb3RzdHJhcChzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IHRoZSB3YXJuaW5ncyBtb2R1bGUgZG9lcyBnZXQgbG9hZGVkIHdoZW4gLVc8c29tZSBvcHRpb24+CisgICAgICAgICMgaXMgdXNlZCAoc2VlIGlzc3VlICMxMDM3MiBmb3IgYW4gZXhhbXBsZSBvZiBzaWxlbnQgYm9vdHN0cmFwIGZhaWx1cmUpLgorICAgICAgICByYywgb3V0LCBlcnIgPSBhc3NlcnRfcHl0aG9uX29rKCItV2kiLCAiLWMiLAorICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddLndhcm4oJ2ZvbycsIFJ1bnRpbWVXYXJuaW5nKSIpCisgICAgICAgICMgJy1XaScgd2FzIG9ic2VydmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3V0LnN0cmlwKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYidSdW50aW1lV2FybmluZycsIGVycikKKworY2xhc3MgQ1dDbWRMaW5lVGVzdHMoQmFzZVRlc3QsIFdDbWRMaW5lVGVzdHMpOgorICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKKworY2xhc3MgUHlXQ21kTGluZVRlc3RzKEJhc2VUZXN0LCBXQ21kTGluZVRlc3RzKToKKyAgICBtb2R1bGUgPSBweV93YXJuaW5ncworCisKK2NsYXNzIF9XYXJuaW5nc1Rlc3RzKEJhc2VUZXN0KToKKworICAgICIiIlRlc3RzIHNwZWNpZmljIHRvIHRoZSBfd2FybmluZ3MgbW9kdWxlLiIiIgorCisgICAgbW9kdWxlID0gY193YXJuaW5ncworCisgICAgZGVmIHRlc3RfZmlsdGVyKHNlbGYpOgorICAgICAgICAjIEV2ZXJ5dGhpbmcgc2hvdWxkIGZ1bmN0aW9uIGV2ZW4gaWYgJ2ZpbHRlcnMnIGlzIG5vdCBpbiB3YXJuaW5ncy4KKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCAiIiwgV2FybmluZywgIiIsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVc2VyV2FybmluZywgc2VsZi5tb2R1bGUud2FybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnZlcnQgdG8gZXJyb3InKQorICAgICAgICAgICAgZGVsIHNlbGYubW9kdWxlLmZpbHRlcnMKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCBzZWxmLm1vZHVsZS53YXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29udmVydCB0byBlcnJvcicpCisKKyAgICBkZWYgdGVzdF9vbmNlcmVnaXN0cnkoc2VsZik6CisgICAgICAgICMgUmVwbGFjaW5nIG9yIHJlbW92aW5nIHRoZSBvbmNlcmVnaXN0cnkgc2hvdWxkIGJlIG9rYXkuCisgICAgICAgIGdsb2JhbCBfX3dhcm5pbmdyZWdpc3RyeV9fCisgICAgICAgIG1lc3NhZ2UgPSBVc2VyV2FybmluZygnb25jZXJlZ2lzdHJ5IHRlc3QnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcmlnaW5hbF9yZWdpc3RyeSA9IHNlbGYubW9kdWxlLm9uY2VyZWdpc3RyeQorICAgICAgICAgICAgX193YXJuaW5ncmVnaXN0cnlfXyA9IHt9CisgICAgICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKHJlY29yZD1UcnVlLAorICAgICAgICAgICAgICAgICAgICBtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoIm9uY2UiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIFVzZXJXYXJuaW5nLCAiZmlsZSIsIDQyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICBkZWwgd1s6XQorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQobWVzc2FnZSwgVXNlcldhcm5pbmcsICJmaWxlIiwgNDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisgICAgICAgICAgICAgICAgIyBUZXN0IHRoZSByZXNldHRpbmcgb2Ygb25jZXJlZ2lzdHJ5LgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLm9uY2VyZWdpc3RyeSA9IHt9CisgICAgICAgICAgICAgICAgX193YXJuaW5ncmVnaXN0cnlfXyA9IHt9CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybignb25jZXJlZ2lzdHJ5IHRlc3QnKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod1stMV0ubWVzc2FnZS5hcmdzLCBtZXNzYWdlLmFyZ3MpCisgICAgICAgICAgICAgICAgIyBSZW1vdmFsIG9mIG9uY2VyZWdpc3RyeSBpcyBva2F5LgorICAgICAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICAgICAgZGVsIHNlbGYubW9kdWxlLm9uY2VyZWdpc3RyeQorICAgICAgICAgICAgICAgIF9fd2FybmluZ3JlZ2lzdHJ5X18gPSB7fQorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQobWVzc2FnZSwgVXNlcldhcm5pbmcsICJmaWxlIiwgNDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5vbmNlcmVnaXN0cnkgPSBvcmlnaW5hbF9yZWdpc3RyeQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9hY3Rpb24oc2VsZik6CisgICAgICAgICMgUmVwbGFjaW5nIG9yIHJlbW92aW5nIGRlZmF1bHRhY3Rpb24gc2hvdWxkIGJlIG9rYXkuCisgICAgICAgIG1lc3NhZ2UgPSBVc2VyV2FybmluZygiZGVmYXVsdGFjdGlvbiB0ZXN0IikKKyAgICAgICAgb3JpZ2luYWwgPSBzZWxmLm1vZHVsZS5kZWZhdWx0YWN0aW9uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3JpZ2luYWxfd2FybmluZ3MuY2F0Y2hfd2FybmluZ3MocmVjb3JkPVRydWUsCisgICAgICAgICAgICAgICAgICAgIG1vZHVsZT1zZWxmLm1vZHVsZSkgYXMgdzoKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5yZXNldHdhcm5pbmdzKCkKKyAgICAgICAgICAgICAgICByZWdpc3RyeSA9IHt9CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgIjx0ZXN0PiIsIDQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeT1yZWdpc3RyeSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdbLTFdLm1lc3NhZ2UsIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVnaXN0cnkpLCAxKQorICAgICAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICAgICAgIyBUZXN0IHJlbW92YWwuCisgICAgICAgICAgICAgICAgZGVsIHNlbGYubW9kdWxlLmRlZmF1bHRhY3Rpb24KKyAgICAgICAgICAgICAgICBfX3dhcm5pbmdyZWdpc3RyeV9fID0ge30KKyAgICAgICAgICAgICAgICByZWdpc3RyeSA9IHt9CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgIjx0ZXN0PiIsIDQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RyeT1yZWdpc3RyeSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdbLTFdLm1lc3NhZ2UsIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVnaXN0cnkpLCAxKQorICAgICAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICAgICAgIyBUZXN0IHNldHRpbmcuCisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuZGVmYXVsdGFjdGlvbiA9ICJpZ25vcmUiCisgICAgICAgICAgICAgICAgX193YXJuaW5ncmVnaXN0cnlfXyA9IHt9CisgICAgICAgICAgICAgICAgcmVnaXN0cnkgPSB7fQorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm5fZXhwbGljaXQobWVzc2FnZSwgVXNlcldhcm5pbmcsICI8dGVzdD4iLCA0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnk9cmVnaXN0cnkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odyksIDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5kZWZhdWx0YWN0aW9uID0gb3JpZ2luYWwKKworICAgIGRlZiB0ZXN0X3Nob3d3YXJuaW5nX21pc3Npbmcoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHNob3d3YXJuaW5nKCkgbWlzc2luZyBpcyBva2F5LgorICAgICAgICB0ZXh0ID0gJ2RlbCBzaG93d2FybmluZyB0ZXN0JworICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNhcHR1cmVkX291dHB1dCgnc3RkZXJyJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4odGV4dCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEluKHRleHQsIHJlc3VsdCkKKworICAgIGRlZiB0ZXN0X3Nob3d3YXJuaW5nX25vdF9jYWxsYWJsZShzZWxmKToKKyAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImFsd2F5cyIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQorICAgICAgICAgICAgb2xkX3Nob3d3YXJuaW5nID0gc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIHNlbGYubW9kdWxlLnNob3d3YXJuaW5nID0gMjMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYubW9kdWxlLndhcm4sICJXYXJuaW5nISIpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLnNob3d3YXJuaW5nID0gb2xkX3Nob3d3YXJuaW5nCisKKyAgICBkZWYgdGVzdF9zaG93X3dhcm5pbmdfb3V0cHV0KHNlbGYpOgorICAgICAgICAjIFdpdGggc2hvd2FybmluZygpIG1pc3NpbmcsIG1ha2Ugc3VyZSB0aGF0IG91dHB1dCBpcyBva2F5LgorICAgICAgICB0ZXh0ID0gJ3Rlc3Qgc2hvd193YXJuaW5nJworICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CisgICAgICAgICAgICBzZWxmLm1vZHVsZS5maWx0ZXJ3YXJuaW5ncygiYWx3YXlzIiwgY2F0ZWdvcnk9VXNlcldhcm5pbmcpCisgICAgICAgICAgICBkZWwgc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNhcHR1cmVkX291dHB1dCgnc3RkZXJyJykgYXMgc3RyZWFtOgorICAgICAgICAgICAgICAgIHdhcm5pbmdfdGVzdHMuaW5uZXIodGV4dCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzdHJlYW0uZ2V0dmFsdWUoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5jb3VudCgnXG4nKSwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRvbyBtYW55IG5ld2xpbmVzIGluICVyIiAlIHJlc3VsdCkKKyAgICAgICAgZmlyc3RfbGluZSwgc2Vjb25kX2xpbmUgPSByZXN1bHQuc3BsaXQoJ1xuJywgMSkKKyAgICAgICAgZXhwZWN0ZWRfZmlsZSA9IG9zLnBhdGguc3BsaXRleHQod2FybmluZ190ZXN0cy5fX2ZpbGVfXylbMF0gKyAnLnB5JworICAgICAgICBmaXJzdF9saW5lX3BhcnRzID0gZmlyc3RfbGluZS5yc3BsaXQoJzonLCAzKQorICAgICAgICBwYXRoLCBsaW5lLCB3YXJuaW5nX2NsYXNzLCBtZXNzYWdlID0gZmlyc3RfbGluZV9wYXJ0cworICAgICAgICBsaW5lID0gaW50KGxpbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZmlsZSwgcGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3YXJuaW5nX2NsYXNzLCAnICcgKyBVc2VyV2FybmluZy5fX25hbWVfXykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCAnICcgKyB0ZXh0KQorICAgICAgICBleHBlY3RlZF9saW5lID0gJyAgJyArIGxpbmVjYWNoZS5nZXRsaW5lKHBhdGgsIGxpbmUpLnN0cmlwKCkgKyAnXG4nCisgICAgICAgIGFzc2VydCBleHBlY3RlZF9saW5lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX2xpbmUsIGV4cGVjdGVkX2xpbmUpCisKKyAgICBkZWYgdGVzdF9maWxlbmFtZV9ub25lKHNlbGYpOgorICAgICAgICAjIGlzc3VlICMxMjQ2NzogcmFjZSBjb25kaXRpb24gaWYgYSB3YXJuaW5nIGlzIGVtaXR0ZWQgYXQgc2h1dGRvd24KKyAgICAgICAgZ2xvYmFsc19kaWN0ID0gZ2xvYmFscygpCisgICAgICAgIG9sZGZpbGUgPSBnbG9iYWxzX2RpY3RbJ19fZmlsZV9fJ10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhtb2R1bGU9c2VsZi5tb2R1bGUpIGFzIHc6CisgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImFsd2F5cyIsIGNhdGVnb3J5PVVzZXJXYXJuaW5nKQorICAgICAgICAgICAgICAgIGdsb2JhbHNfZGljdFsnX19maWxlX18nXSA9IE5vbmUKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKCd0ZXN0JywgVXNlcldhcm5pbmcpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBnbG9iYWxzX2RpY3RbJ19fZmlsZV9fJ10gPSBvbGRmaWxlCisKKworY2xhc3MgV2FybmluZ3NEaXNwbGF5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIiIiVGVzdCB0aGUgZGlzcGxheWluZyBvZiB3YXJuaW5ncyBhbmQgdGhlIGFiaWxpdHkgdG8gb3ZlcmxvYWQgZnVuY3Rpb25zCisgICAgcmVsYXRlZCB0byBkaXNwbGF5aW5nIHdhcm5pbmdzLiIiIgorCisgICAgZGVmIHRlc3RfZm9ybWF0d2FybmluZyhzZWxmKToKKyAgICAgICAgbWVzc2FnZSA9ICJtc2ciCisgICAgICAgIGNhdGVnb3J5ID0gV2FybmluZworICAgICAgICBmaWxlX25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KHdhcm5pbmdfdGVzdHMuX19maWxlX18pWzBdICsgJy5weScKKyAgICAgICAgbGluZV9udW0gPSAzCisgICAgICAgIGZpbGVfbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVfbmFtZSwgbGluZV9udW0pLnN0cmlwKCkKKyAgICAgICAgZm9ybWF0ID0gIiVzOiVzOiAlczogJXNcbiAgJXNcbiIKKyAgICAgICAgZXhwZWN0ID0gZm9ybWF0ICUgKGZpbGVfbmFtZSwgbGluZV9udW0sIGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbGluZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHNlbGYubW9kdWxlLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LCBmaWxlX25hbWUsIGxpbmVfbnVtKSkKKyAgICAgICAgIyBUZXN0IHRoZSAnbGluZScgYXJndW1lbnQuCisgICAgICAgIGZpbGVfbGluZSArPSAiIGZvciB0aGUgd2luISIKKyAgICAgICAgZXhwZWN0ID0gZm9ybWF0ICUgKGZpbGVfbmFtZSwgbGluZV9udW0sIGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbGluZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3QsIHNlbGYubW9kdWxlLmZvcm1hdHdhcm5pbmcobWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5LCBmaWxlX25hbWUsIGxpbmVfbnVtLCBmaWxlX2xpbmUpKQorCisgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmcoc2VsZik6CisgICAgICAgIGZpbGVfbmFtZSA9IG9zLnBhdGguc3BsaXRleHQod2FybmluZ190ZXN0cy5fX2ZpbGVfXylbMF0gKyAnLnB5JworICAgICAgICBsaW5lX251bSA9IDMKKyAgICAgICAgZXhwZWN0ZWRfZmlsZV9saW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZV9uYW1lLCBsaW5lX251bSkuc3RyaXAoKQorICAgICAgICBtZXNzYWdlID0gJ21zZycKKyAgICAgICAgY2F0ZWdvcnkgPSBXYXJuaW5nCisgICAgICAgIGZpbGVfb2JqZWN0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBleHBlY3QgPSBzZWxmLm1vZHVsZS5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfbnVtKQorICAgICAgICBzZWxmLm1vZHVsZS5zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZV9uYW1lLCBsaW5lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9vYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSwgZXhwZWN0KQorICAgICAgICAjIFRlc3QgJ2xpbmUnIGFyZ3VtZW50LgorICAgICAgICBleHBlY3RlZF9maWxlX2xpbmUgKz0gImZvciB0aGUgd2luISIKKyAgICAgICAgZXhwZWN0ID0gc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bSwgZXhwZWN0ZWRfZmlsZV9saW5lKQorICAgICAgICBmaWxlX29iamVjdCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVfbmFtZSwgbGluZV9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfb2JqZWN0LCBleHBlY3RlZF9maWxlX2xpbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBmaWxlX29iamVjdC5nZXR2YWx1ZSgpKQorCitjbGFzcyBDV2FybmluZ3NEaXNwbGF5VGVzdHMoQmFzZVRlc3QsIFdhcm5pbmdzRGlzcGxheVRlc3RzKToKKyAgICBtb2R1bGUgPSBjX3dhcm5pbmdzCisKK2NsYXNzIFB5V2FybmluZ3NEaXNwbGF5VGVzdHMoQmFzZVRlc3QsIFdhcm5pbmdzRGlzcGxheVRlc3RzKToKKyAgICBtb2R1bGUgPSBweV93YXJuaW5ncworCisKK2NsYXNzIENhdGNoV2FybmluZ1Rlc3RzKEJhc2VUZXN0KToKKworICAgICIiIlRlc3QgY2F0Y2hfd2FybmluZ3MoKS4iIiIKKworICAgIGRlZiB0ZXN0X2NhdGNoX3dhcm5pbmdzX3Jlc3RvcmUoc2VsZik6CisgICAgICAgIHdtb2QgPSBzZWxmLm1vZHVsZQorICAgICAgICBvcmlnX2ZpbHRlcnMgPSB3bW9kLmZpbHRlcnMKKyAgICAgICAgb3JpZ19zaG93d2FybmluZyA9IHdtb2Quc2hvd3dhcm5pbmcKKyAgICAgICAgIyBFbnN1cmUgYm90aCBzaG93d2FybmluZyBhbmQgZmlsdGVycyBhcmUgcmVzdG9yZWQgd2hlbiByZWNvcmRpbmcKKyAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kLCByZWNvcmQ9VHJ1ZSk6CisgICAgICAgICAgICB3bW9kLmZpbHRlcnMgPSB3bW9kLnNob3d3YXJuaW5nID0gb2JqZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgICMgU2FtZSB0ZXN0LCBidXQgd2l0aCByZWNvcmRpbmcgZGlzYWJsZWQKKyAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kLCByZWNvcmQ9RmFsc2UpOgorICAgICAgICAgICAgd21vZC5maWx0ZXJzID0gd21vZC5zaG93d2FybmluZyA9IG9iamVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQorCisgICAgZGVmIHRlc3RfY2F0Y2hfd2FybmluZ3NfcmVjb3JkaW5nKHNlbGYpOgorICAgICAgICB3bW9kID0gc2VsZi5tb2R1bGUKKyAgICAgICAgIyBFbnN1cmUgd2FybmluZ3MgYXJlIHJlY29yZGVkIHdoZW4gcmVxdWVzdGVkCisgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPVRydWUpIGFzIHc6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcsIFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodykgaXMgbGlzdCkKKyAgICAgICAgICAgIHdtb2Quc2ltcGxlZmlsdGVyKCJhbHdheXMiKQorICAgICAgICAgICAgd21vZC53YXJuKCJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1stMV0ubWVzc2FnZSksICJmb28iKQorICAgICAgICAgICAgd21vZC53YXJuKCJiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1stMV0ubWVzc2FnZSksICJiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1swXS5tZXNzYWdlKSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3WzFdLm1lc3NhZ2UpLCAiYmFyIikKKyAgICAgICAgICAgIGRlbCB3WzpdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcsIFtdKQorICAgICAgICAjIEVuc3VyZSB3YXJuaW5ncyBhcmUgbm90IHJlY29yZGVkIHdoZW4gbm90IHJlcXVlc3RlZAorICAgICAgICBvcmlnX3Nob3d3YXJuaW5nID0gd21vZC5zaG93d2FybmluZworICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXdtb2QsIHJlY29yZD1GYWxzZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3IGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQorCisgICAgZGVmIHRlc3RfY2F0Y2hfd2FybmluZ3NfcmVlbnRyeV9ndWFyZChzZWxmKToKKyAgICAgICAgd21vZCA9IHNlbGYubW9kdWxlCisgICAgICAgICMgRW5zdXJlIGNhdGNoX3dhcm5pbmdzIGlzIHByb3RlY3RlZCBhZ2FpbnN0IGluY29ycmVjdCB1c2FnZQorICAgICAgICB4ID0gd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPVRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgeC5fX2V4aXRfXykKKyAgICAgICAgd2l0aCB4OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB4Ll9fZW50ZXJfXykKKyAgICAgICAgIyBTYW1lIHRlc3QsIGJ1dCB3aXRoIHJlY29yZGluZyBkaXNhYmxlZAorICAgICAgICB4ID0gd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPUZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHguX19leGl0X18pCisgICAgICAgIHdpdGggeDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgeC5fX2VudGVyX18pCisKKyAgICBkZWYgdGVzdF9jYXRjaF93YXJuaW5nc19kZWZhdWx0cyhzZWxmKToKKyAgICAgICAgd21vZCA9IHNlbGYubW9kdWxlCisgICAgICAgIG9yaWdfZmlsdGVycyA9IHdtb2QuZmlsdGVycworICAgICAgICBvcmlnX3Nob3d3YXJuaW5nID0gd21vZC5zaG93d2FybmluZworICAgICAgICAjIEVuc3VyZSBkZWZhdWx0IGJlaGF2aW91ciBpcyBub3QgdG8gcmVjb3JkIHdhcm5pbmdzCisgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3IGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBub3Qgb3JpZ19maWx0ZXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG9yaWdfZmlsdGVycykKKyAgICAgICAgaWYgd21vZCBpcyBzeXMubW9kdWxlc1snd2FybmluZ3MnXToKKyAgICAgICAgICAgICMgRW5zdXJlIHRoZSBkZWZhdWx0IG1vZHVsZSBpcyB0aGlzIG9uZQorICAgICAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKCkgYXMgdzoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodyBpcyBOb25lKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBub3Qgb3JpZ19maWx0ZXJzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCisKKyAgICBkZWYgdGVzdF9jaGVja193YXJuaW5ncyhzZWxmKToKKyAgICAgICAgIyBFeHBsaWNpdCB0ZXN0cyBmb3IgdGhlIHRlc3Rfc3VwcG9ydCBjb252ZW5pZW5jZSB3cmFwcGVyCisgICAgICAgIHdtb2QgPSBzZWxmLm1vZHVsZQorICAgICAgICBpZiB3bW9kIGlzIG5vdCBzeXMubW9kdWxlc1snd2FybmluZ3MnXToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncyhxdWlldD1GYWxzZSkgYXMgdzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody53YXJuaW5ncywgW10pCisgICAgICAgICAgICB3bW9kLnNpbXBsZWZpbHRlcigiYWx3YXlzIikKKyAgICAgICAgICAgIHdtb2Qud2FybigiZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHcubWVzc2FnZSksICJmb28iKQorICAgICAgICAgICAgd21vZC53YXJuKCJiYXIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIody5tZXNzYWdlKSwgImJhciIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Lndhcm5pbmdzWzBdLm1lc3NhZ2UpLCAiZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHcud2FybmluZ3NbMV0ubWVzc2FnZSksICJiYXIiKQorICAgICAgICAgICAgdy5yZXNldCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcud2FybmluZ3MsIFtdKQorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCk6CisgICAgICAgICAgICAjIGRlZmF1bHRzIHRvIHF1aWV0PVRydWUgd2l0aG91dCBhcmd1bWVudAorICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoJ2ZvbycsIFVzZXJXYXJuaW5nKSk6CisgICAgICAgICAgICB3bW9kLndhcm4oImZvbyIpCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvcik6CisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygoJycsIFJ1bnRpbWVXYXJuaW5nKSk6CisgICAgICAgICAgICAgICAgIyBkZWZhdWx0cyB0byBxdWlldD1GYWxzZSB3aXRoIGFyZ3VtZW50CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEFzc2VydGlvbkVycm9yKToKKyAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgnZm9vJywgUnVudGltZVdhcm5pbmcpKToKKyAgICAgICAgICAgICAgICB3bW9kLndhcm4oImZvbyIpCisKKworY2xhc3MgQ0NhdGNoV2FybmluZ1Rlc3RzKENhdGNoV2FybmluZ1Rlc3RzKToKKyAgICBtb2R1bGUgPSBjX3dhcm5pbmdzCisKK2NsYXNzIFB5Q2F0Y2hXYXJuaW5nVGVzdHMoQ2F0Y2hXYXJuaW5nVGVzdHMpOgorICAgIG1vZHVsZSA9IHB5X3dhcm5pbmdzCisKKworY2xhc3MgRW52aXJvbm1lbnRWYXJpYWJsZVRlc3RzKEJhc2VUZXN0KToKKworICAgIGRlZiB0ZXN0X3NpbmdsZV93YXJuaW5nKHNlbGYpOgorICAgICAgICBuZXdlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBuZXdlbnZbIlBZVEhPTldBUk5JTkdTIl0gPSAiaWdub3JlOjpEZXByZWNhdGlvbldhcm5pbmciCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKKyAgICAgICAgICAgICAgICAiLWMiLCAiaW1wb3J0IHN5czsgc3lzLnN0ZG91dC53cml0ZShzdHIoc3lzLndhcm5vcHRpb25zKSkiXSwKKyAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBlbnY9bmV3ZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuY29tbXVuaWNhdGUoKVswXSwgIlsnaWdub3JlOjpEZXByZWNhdGlvbldhcm5pbmcnXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC53YWl0KCksIDApCisKKyAgICBkZWYgdGVzdF9jb21tYV9zZXBhcmF0ZWRfd2FybmluZ3Moc2VsZik6CisgICAgICAgIG5ld2VudiA9IG9zLmVudmlyb24uY29weSgpCisgICAgICAgIG5ld2VudlsiUFlUSE9OV0FSTklOR1MiXSA9ICgiaWdub3JlOjpEZXByZWNhdGlvbldhcm5pbmcsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZTo6VW5pY29kZVdhcm5pbmciKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCisgICAgICAgICAgICAgICAgIi1jIiwgImltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoc3RyKHN5cy53YXJub3B0aW9ucykpIl0sCisgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgZW52PW5ld2VudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmNvbW11bmljYXRlKClbMF0sCisgICAgICAgICAgICAgICAgIlsnaWdub3JlOjpEZXByZWNhdGlvbldhcm5pbmcnLCAnaWdub3JlOjpVbmljb2RlV2FybmluZyddIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgMCkKKworICAgIGRlZiB0ZXN0X2VudnZhcl9hbmRfY29tbWFuZF9saW5lKHNlbGYpOgorICAgICAgICBuZXdlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgICBuZXdlbnZbIlBZVEhPTldBUk5JTkdTIl0gPSAiaWdub3JlOjpEZXByZWNhdGlvbldhcm5pbmciCisgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwgIi1XIiAiaWdub3JlOjpVbmljb2RlV2FybmluZyIsCisgICAgICAgICAgICAgICAgIi1jIiwgImltcG9ydCBzeXM7IHN5cy5zdGRvdXQud3JpdGUoc3RyKHN5cy53YXJub3B0aW9ucykpIl0sCisgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwgZW52PW5ld2VudikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmNvbW11bmljYXRlKClbMF0sCisgICAgICAgICAgICAgICAgIlsnaWdub3JlOjpVbmljb2RlV2FybmluZycsICdpZ25vcmU6OkRlcHJlY2F0aW9uV2FybmluZyddIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgMCkKKworY2xhc3MgQ0Vudmlyb25tZW50VmFyaWFibGVUZXN0cyhFbnZpcm9ubWVudFZhcmlhYmxlVGVzdHMpOgorICAgIG1vZHVsZSA9IGNfd2FybmluZ3MKKworY2xhc3MgUHlFbnZpcm9ubWVudFZhcmlhYmxlVGVzdHMoRW52aXJvbm1lbnRWYXJpYWJsZVRlc3RzKToKKyAgICBtb2R1bGUgPSBweV93YXJuaW5ncworCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBweV93YXJuaW5ncy5vbmNlcmVnaXN0cnkuY2xlYXIoKQorICAgIGNfd2FybmluZ3Mub25jZXJlZ2lzdHJ5LmNsZWFyKCkKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENGaWx0ZXJUZXN0cywgUHlGaWx0ZXJUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1dhcm5UZXN0cywgUHlXYXJuVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENXQ21kTGluZVRlc3RzLCBQeVdDbWRMaW5lVGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9XYXJuaW5nc1Rlc3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDV2FybmluZ3NEaXNwbGF5VGVzdHMsIFB5V2FybmluZ3NEaXNwbGF5VGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDYXRjaFdhcm5pbmdUZXN0cywgUHlDYXRjaFdhcm5pbmdUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0Vudmlyb25tZW50VmFyaWFibGVUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFbnZpcm9ubWVudFZhcmlhYmxlVGVzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhcm5pbmdzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhcm5pbmdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWFhYmZkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhcm5pbmdzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhcm5pbmdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWEzNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2FybmluZ3MucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dhdmUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZjVmYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5CkBAIC0wLDAgKzEsNDUgQEAKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CitpbXBvcnQgb3MKK2ltcG9ydCB3YXZlCitpbXBvcnQgdW5pdHRlc3QKKworbmNoYW5uZWxzID0gMgorc2FtcHdpZHRoID0gMgorZnJhbWVyYXRlID0gODAwMAorbmZyYW1lcyA9IDEwMAorCitjbGFzcyBUZXN0V2F2ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZiA9IE5vbmUKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5mIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pdChzZWxmKToKKyAgICAgICAgc2VsZi5mID0gd2F2ZS5vcGVuKFRFU1RGTiwgJ3diJykKKyAgICAgICAgc2VsZi5mLnNldG5jaGFubmVscyhuY2hhbm5lbHMpCisgICAgICAgIHNlbGYuZi5zZXRzYW1wd2lkdGgoc2FtcHdpZHRoKQorICAgICAgICBzZWxmLmYuc2V0ZnJhbWVyYXRlKGZyYW1lcmF0ZSkKKyAgICAgICAgc2VsZi5mLnNldG5mcmFtZXMobmZyYW1lcykKKyAgICAgICAgb3V0cHV0ID0gJ1wwJyAqIG5mcmFtZXMgKiBuY2hhbm5lbHMgKiBzYW1wd2lkdGgKKyAgICAgICAgc2VsZi5mLndyaXRlZnJhbWVzKG91dHB1dCkKKyAgICAgICAgc2VsZi5mLmNsb3NlKCkKKworICAgICAgICBzZWxmLmYgPSB3YXZlLm9wZW4oVEVTVEZOLCAncmInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5jaGFubmVscywgc2VsZi5mLmdldG5jaGFubmVscygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXB3aWR0aCwgc2VsZi5mLmdldHNhbXB3aWR0aCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZyYW1lcmF0ZSwgc2VsZi5mLmdldGZyYW1lcmF0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5mcmFtZXMsIHNlbGYuZi5nZXRuZnJhbWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5mLnJlYWRmcmFtZXMobmZyYW1lcyksIG91dHB1dCkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChUZXN0V2F2ZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2F2ZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2IzYjZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2F2ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2F2ZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93YXZlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2IzYjZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2F2ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3JlZi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtyZWYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4NmNiNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtyZWYucHkKQEAgLTAsMCArMSwxMzk1IEBACitpbXBvcnQgZ2MKK2ltcG9ydCBzeXMKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IFVzZXJMaXN0CitpbXBvcnQgd2Vha3JlZgoraW1wb3J0IG9wZXJhdG9yCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgVXNlZCBpbiBSZWZlcmVuY2VzVGVzdENhc2UudGVzdF9yZWZfY3JlYXRlZF9kdXJpbmdfZGVsKCkgLgorcmVmX2Zyb21fZGVsID0gTm9uZQorCitjbGFzcyBDOgorICAgIGRlZiBtZXRob2Qoc2VsZik6CisgICAgICAgIHBhc3MKKworCitjbGFzcyBDYWxsYWJsZToKKyAgICBiYXIgPSBOb25lCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgeCk6CisgICAgICAgIHNlbGYuYmFyID0geAorCisKK2RlZiBjcmVhdGVfZnVuY3Rpb24oKToKKyAgICBkZWYgZigpOiBwYXNzCisgICAgcmV0dXJuIGYKKworZGVmIGNyZWF0ZV9ib3VuZF9tZXRob2QoKToKKyAgICByZXR1cm4gQygpLm1ldGhvZAorCitkZWYgY3JlYXRlX3VuYm91bmRfbWV0aG9kKCk6CisgICAgcmV0dXJuIEMubWV0aG9kCisKKworY2xhc3MgT2JqZWN0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmcpOgorICAgICAgICBzZWxmLmFyZyA9IGFyZworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8T2JqZWN0ICVyPiIgJSBzZWxmLmFyZworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBPYmplY3QpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnID09IG90aGVyLmFyZworICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgT2JqZWN0KToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZyAhPSBvdGhlci5hcmcKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICByZXR1cm4gaGFzaChzZWxmLmFyZykKKworY2xhc3MgUmVmQ3ljbGU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmN5Y2xlID0gc2VsZgorCisKK2NsYXNzIFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jYmNhbGxlZCA9IDAKKworICAgIGRlZiBjYWxsYmFjayhzZWxmLCByZWYpOgorICAgICAgICBzZWxmLmNiY2FsbGVkICs9IDEKKworCitjbGFzcyBSZWZlcmVuY2VzVGVzdENhc2UoVGVzdEJhc2UpOgorCisgICAgZGVmIHRlc3RfYmFzaWNfcmVmKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2Jhc2ljX3JlZihDKQorICAgICAgICBzZWxmLmNoZWNrX2Jhc2ljX3JlZihjcmVhdGVfZnVuY3Rpb24pCisgICAgICAgIHNlbGYuY2hlY2tfYmFzaWNfcmVmKGNyZWF0ZV9ib3VuZF9tZXRob2QpCisgICAgICAgIHNlbGYuY2hlY2tfYmFzaWNfcmVmKGNyZWF0ZV91bmJvdW5kX21ldGhvZCkKKworICAgICAgICAjIEp1c3QgbWFrZSBzdXJlIHRoZSB0cF9yZXByIGhhbmRsZXIgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24uCisgICAgICAgICMgTGl2ZSByZWZlcmVuY2U6CisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihvKQorICAgICAgICByZXByKHdyKQorICAgICAgICAjIERlYWQgcmVmZXJlbmNlOgorICAgICAgICBkZWwgbworICAgICAgICByZXByKHdyKQorCisgICAgZGVmIHRlc3RfYmFzaWNfY2FsbGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfYmFzaWNfY2FsbGJhY2soQykKKyAgICAgICAgc2VsZi5jaGVja19iYXNpY19jYWxsYmFjayhjcmVhdGVfZnVuY3Rpb24pCisgICAgICAgIHNlbGYuY2hlY2tfYmFzaWNfY2FsbGJhY2soY3JlYXRlX2JvdW5kX21ldGhvZCkKKyAgICAgICAgc2VsZi5jaGVja19iYXNpY19jYWxsYmFjayhjcmVhdGVfdW5ib3VuZF9tZXRob2QpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9jYWxsYmFja3Moc2VsZik6CisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICBkZWwgbworICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmMSgpIGlzIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgcmVmZXJlbmNlIHRvIGJlIGludmFsaWRhdGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZjIoKSBpcyBOb25lLAorICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHJlZmVyZW5jZSB0byBiZSBpbnZhbGlkYXRlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNiY2FsbGVkID09IDIsCisgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2sgbm90IGNhbGxlZCB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpbWVzIikKKworICAgIGRlZiB0ZXN0X211bHRpcGxlX3NlbGZyZWZfY2FsbGJhY2tzKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSBhbGwgcmVmZXJlbmNlcyBhcmUgaW52YWxpZGF0ZWQgYmVmb3JlIGNhbGxiYWNrcyBhcmUgY2FsbGVkCisgICAgICAgICMKKyAgICAgICAgIyBXaGF0J3MgaW1wb3J0YW50IGhlcmUgaXMgdGhhdCB3ZSdyZSB1c2luZyB0aGUgZmlyc3QKKyAgICAgICAgIyByZWZlcmVuY2UgaW4gdGhlIGNhbGxiYWNrIGludm9rZWQgb24gdGhlIHNlY29uZCByZWZlcmVuY2UKKyAgICAgICAgIyAodGhlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCByZWYgaXMgY2xlYW5lZCB1cCBmaXJzdCkuICBUaGlzCisgICAgICAgICMgdGVzdHMgdGhhdCBhbGwgcmVmZXJlbmNlcyB0byB0aGUgb2JqZWN0IGFyZSBpbnZhbGlkYXRlZAorICAgICAgICAjIGJlZm9yZSBhbnkgb2YgdGhlIGNhbGxiYWNrcyBhcmUgaW52b2tlZCwgc28gdGhhdCB3ZSBvbmx5CisgICAgICAgICMgaGF2ZSBvbmUgaW52b2NhdGlvbiBvZiBfd2Vha3JlZi5jOmNsZWFudXBfaGVscGVyKCkgYWN0aXZlCisgICAgICAgICMgZm9yIGEgcGFydGljdWxhciBvYmplY3QgYXQgYSB0aW1lLgorICAgICAgICAjCisgICAgICAgIGRlZiBjYWxsYmFjayhvYmplY3QsIHNlbGY9c2VsZik6CisgICAgICAgICAgICBzZWxmLnJlZigpCisgICAgICAgIGMgPSBDKCkKKyAgICAgICAgc2VsZi5yZWYgPSB3ZWFrcmVmLnJlZihjLCBjYWxsYmFjaykKKyAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKGMsIGNhbGxiYWNrKQorICAgICAgICBkZWwgYworCisgICAgZGVmIHRlc3RfcHJveHlfcmVmKHNlbGYpOgorICAgICAgICBvID0gQygpCisgICAgICAgIG8uYmFyID0gMQorICAgICAgICByZWYxID0gd2Vha3JlZi5wcm94eShvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICByZWYyID0gd2Vha3JlZi5wcm94eShvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICBkZWwgbworCisgICAgICAgIGRlZiBjaGVjayhwcm94eSk6CisgICAgICAgICAgICBwcm94eS5iYXIKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3ZWFrcmVmLlJlZmVyZW5jZUVycm9yLCBjaGVjaywgcmVmMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2Vha3JlZi5SZWZlcmVuY2VFcnJvciwgY2hlY2ssIHJlZjIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IsIGJvb2wsIHdlYWtyZWYucHJveHkoQygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2JjYWxsZWQgPT0gMikKKworICAgIGRlZiBjaGVja19iYXNpY19yZWYoc2VsZiwgZmFjdG9yeSk6CisgICAgICAgIG8gPSBmYWN0b3J5KCkKKyAgICAgICAgcmVmID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIG5vdCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgIndlYWsgcmVmZXJlbmNlIHRvIGxpdmUgb2JqZWN0IHNob3VsZCBiZSBsaXZlIikKKyAgICAgICAgbzIgPSByZWYoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyBvMiwKKyAgICAgICAgICAgICAgICAgICAgICI8cmVmPigpIHNob3VsZCByZXR1cm4gb3JpZ2luYWwgb2JqZWN0IGlmIGxpdmUiKQorCisgICAgZGVmIGNoZWNrX2Jhc2ljX2NhbGxiYWNrKHNlbGYsIGZhY3RvcnkpOgorICAgICAgICBzZWxmLmNiY2FsbGVkID0gMAorICAgICAgICBvID0gZmFjdG9yeSgpCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIGRlbCBvCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmNiY2FsbGVkID09IDEsCisgICAgICAgICAgICAgICAgICAgICAiY2FsbGJhY2sgZGlkIG5vdCBwcm9wZXJseSBzZXQgJ2NiY2FsbGVkJyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInJlZjIgc2hvdWxkIGJlIGRlYWQgYWZ0ZXIgZGVsZXRpbmcgb2JqZWN0IHJlZmVyZW5jZSIpCisKKyAgICBkZWYgdGVzdF9yZWZfcmV1c2Uoc2VsZik6CisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8pCisgICAgICAgICMgY3JlYXRlIGEgcHJveHkgdG8gbWFrZSBzdXJlIHRoYXQgdGhlcmUncyBhbiBpbnRlcnZlbmluZyBjcmVhdGlvbgorICAgICAgICAjIGJldHdlZW4gdGhlc2UgdHdvOyBpdCBzaG91bGQgbWFrZSBubyBkaWZmZXJlbmNlCisgICAgICAgIHByb3h5ID0gd2Vha3JlZi5wcm94eShvKQorICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZjEgaXMgcmVmMiwKKyAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2Ugb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBiZSByZS11c2VkIikKKworICAgICAgICBvID0gQygpCisgICAgICAgIHByb3h5ID0gd2Vha3JlZi5wcm94eShvKQorICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYxIGlzIHJlZjIsCisgICAgICAgICAgICAgICAgICAgICAicmVmZXJlbmNlIG9iamVjdCB3L291dCBjYWxsYmFjayBzaG91bGQgYmUgcmUtdXNlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAyLAorICAgICAgICAgICAgICAgICAgICAgIndyb25nIHdlYWsgcmVmIGNvdW50IGZvciBvYmplY3QiKQorICAgICAgICBkZWwgcHJveHkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDEsCisgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgd2VhayByZWYgY291bnQgZm9yIG9iamVjdCBhZnRlciBkZWxldGluZyBwcm94eSIpCisKKyAgICBkZWYgdGVzdF9wcm94eV9yZXVzZShzZWxmKToKKyAgICAgICAgbyA9IEMoKQorICAgICAgICBwcm94eTEgPSB3ZWFrcmVmLnByb3h5KG8pCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKG8pCisgICAgICAgIHByb3h5MiA9IHdlYWtyZWYucHJveHkobykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5MSBpcyBwcm94eTIsCisgICAgICAgICAgICAgICAgICAgICAicHJveHkgb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBoYXZlIGJlZW4gcmUtdXNlZCIpCisKKyAgICBkZWYgdGVzdF9iYXNpY19wcm94eShzZWxmKToKKyAgICAgICAgbyA9IEMoKQorICAgICAgICBzZWxmLmNoZWNrX3Byb3h5KG8sIHdlYWtyZWYucHJveHkobykpCisKKyAgICAgICAgTCA9IFVzZXJMaXN0LlVzZXJMaXN0KCkKKyAgICAgICAgcCA9IHdlYWtyZWYucHJveHkoTCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwLCAicHJveHkgZm9yIGVtcHR5IFVzZXJMaXN0IHNob3VsZCBiZSBmYWxzZSIpCisgICAgICAgIHAuYXBwZW5kKDEyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihMKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAsICJwcm94eSBmb3Igbm9uLWVtcHR5IFVzZXJMaXN0IHNob3VsZCBiZSB0cnVlIikKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgcFs6XSA9IFsyLCAzXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihMKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocCksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMywgcCwgInByb3h5IGRpZG4ndCBzdXBwb3J0IF9fY29udGFpbnNfXygpIHByb3Blcmx5IikKKyAgICAgICAgcFsxXSA9IDUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMWzFdLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMV0sIDUpCisgICAgICAgIEwyID0gVXNlckxpc3QuVXNlckxpc3QoTCkKKyAgICAgICAgcDIgPSB3ZWFrcmVmLnByb3h5KEwyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIHAyKQorICAgICAgICAjIyBzZWxmLmFzc2VydEVxdWFsKHJlcHIoTDIpLCByZXByKHAyKSkKKyAgICAgICAgTDMgPSBVc2VyTGlzdC5Vc2VyTGlzdChyYW5nZSgxMCkpCisgICAgICAgIHAzID0gd2Vha3JlZi5wcm94eShMMykKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfcHkza193YXJuaW5ncygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1s6XSwgcDNbOl0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEwzWzU6XSwgcDNbNTpdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMM1s6NV0sIHAzWzo1XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTDNbMjo1XSwgcDNbMjo1XSkKKworICAgIGRlZiB0ZXN0X3Byb3h5X3VuaWNvZGUoc2VsZik6CisgICAgICAgICMgU2VlIGJ1ZyA1MDM3CisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIgorICAgICAgICAgICAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiB1InVuaWNvZGUiCisgICAgICAgIGluc3RhbmNlID0gQygpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIl9fdW5pY29kZV9fIiwgZGlyKHdlYWtyZWYucHJveHkoaW5zdGFuY2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKHdlYWtyZWYucHJveHkoaW5zdGFuY2UpKSwgdSJ1bmljb2RlIikKKworICAgIGRlZiB0ZXN0X3Byb3h5X2luZGV4KHNlbGYpOgorICAgICAgICBjbGFzcyBDOgorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMTAKKyAgICAgICAgbyA9IEMoKQorICAgICAgICBwID0gd2Vha3JlZi5wcm94eShvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wZXJhdG9yLmluZGV4KHApLCAxMCkKKworICAgIGRlZiB0ZXN0X3Byb3h5X2RpdihzZWxmKToKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiA0MgorICAgICAgICAgICAgZGVmIF9faWZsb29yZGl2X18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHJldHVybiAyMQorICAgICAgICBvID0gQygpCisgICAgICAgIHAgPSB3ZWFrcmVmLnByb3h5KG8pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCAvLyA1LCA0MikKKyAgICAgICAgcCAvLz0gNQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAsIDIxKQorCisgICAgIyBUaGUgUHlXZWFrcmVmXyogQyBBUEkgaXMgZG9jdW1lbnRlZCBhcyBhbGxvd2luZyBlaXRoZXIgTlVMTCBvcgorICAgICMgTm9uZSBhcyB0aGUgdmFsdWUgZm9yIHRoZSBjYWxsYmFjaywgd2hlcmUgZWl0aGVyIG1lYW5zICJubworICAgICMgY2FsbGJhY2siLiAgVGhlICJubyBjYWxsYmFjayIgcmVmIGFuZCBwcm94eSBvYmplY3RzIGFyZSBzdXBwb3NlZAorICAgICMgdG8gYmUgc2hhcmVkIHNvIGxvbmcgYXMgdGhleSBleGlzdCBieSBhbGwgY2FsbGVycyBzbyBsb25nIGFzCisgICAgIyB0aGV5IGFyZSBhY3RpdmUuICBJbiBQeXRob24gMi4zLjMgYW5kIGVhcmxpZXIsIHRoaXMgZ3VhcmFudGVlCisgICAgIyB3YXMgbm90IGhvbm9yZWQsIGFuZCB3YXMgYnJva2VuIGluIGRpZmZlcmVudCB3YXlzIGZvcgorICAgICMgUHlXZWFrcmVmX05ld1JlZigpIGFuZCBQeVdlYWtyZWZfTmV3UHJveHkoKS4gIChUd28gdGVzdHMuKQorCisgICAgZGVmIHRlc3Rfc2hhcmVkX3JlZl93aXRob3V0X2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3NoYXJlZF93aXRob3V0X2NhbGxiYWNrKHdlYWtyZWYucmVmKQorCisgICAgZGVmIHRlc3Rfc2hhcmVkX3Byb3h5X3dpdGhvdXRfY2FsbGJhY2soc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfc2hhcmVkX3dpdGhvdXRfY2FsbGJhY2sod2Vha3JlZi5wcm94eSkKKworICAgIGRlZiBjaGVja19zaGFyZWRfd2l0aG91dF9jYWxsYmFjayhzZWxmLCBtYWtlcmVmKToKKyAgICAgICAgbyA9IE9iamVjdCgxKQorICAgICAgICBwMSA9IG1ha2VyZWYobywgTm9uZSkKKyAgICAgICAgcDIgPSBtYWtlcmVmKG8sIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwMSBpcyBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTm9uZSBpbiB0aGUgQyBBUEkiKQorICAgICAgICBkZWwgcDEsIHAyCisgICAgICAgIHAxID0gbWFrZXJlZihvKQorICAgICAgICBwMiA9IG1ha2VyZWYobywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiY2FsbGJhY2tzIHdlcmUgTlVMTCwgTm9uZSBpbiB0aGUgQyBBUEkiKQorICAgICAgICBkZWwgcDEsIHAyCisgICAgICAgIHAxID0gbWFrZXJlZihvKQorICAgICAgICBwMiA9IG1ha2VyZWYobykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiYm90aCBjYWxsYmFja3Mgd2VyZSBOVUxMIGluIHRoZSBDIEFQSSIpCisgICAgICAgIGRlbCBwMSwgcDIKKyAgICAgICAgcDEgPSBtYWtlcmVmKG8sIE5vbmUpCisgICAgICAgIHAyID0gbWFrZXJlZihvKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocDEgaXMgcDIsICJjYWxsYmFja3Mgd2VyZSBOb25lLCBOVUxMIGluIHRoZSBDIEFQSSIpCisKKyAgICBkZWYgdGVzdF9jYWxsYWJsZV9wcm94eShzZWxmKToKKyAgICAgICAgbyA9IENhbGxhYmxlKCkKKyAgICAgICAgcmVmMSA9IHdlYWtyZWYucHJveHkobykKKworICAgICAgICBzZWxmLmNoZWNrX3Byb3h5KG8sIHJlZjEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocmVmMSkgaXMgd2Vha3JlZi5DYWxsYWJsZVByb3h5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICJwcm94eSBpcyBub3Qgb2YgY2FsbGFibGUgdHlwZSIpCisgICAgICAgIHJlZjEoJ3R3aW5raWVzIScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvLmJhciA9PSAndHdpbmtpZXMhJywKKyAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRocm91Z2ggcHJveHkgbm90IHBhc3NlZCB0aHJvdWdoIHRvIG9yaWdpbmFsIikKKyAgICAgICAgcmVmMSh4PSdTcGxhdC4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoby5iYXIgPT0gJ1NwbGF0LicsCisgICAgICAgICAgICAgICAgICAgICAiY2FsbCB0aHJvdWdoIHByb3h5IG5vdCBwYXNzZWQgdGhyb3VnaCB0byBvcmlnaW5hbCIpCisKKyAgICAgICAgIyBleHBlY3QgZHVlIHRvIHRvbyBmZXcgYXJncworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHJlZjEpCisKKyAgICAgICAgIyBleHBlY3QgZHVlIHRvIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByZWYxLCAxLCAyLCAzKQorCisgICAgZGVmIGNoZWNrX3Byb3h5KHNlbGYsIG8sIHByb3h5KToKKyAgICAgICAgby5mb28gPSAxCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5mb28gPT0gMSwKKyAgICAgICAgICAgICAgICAgICAgICJwcm94eSBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBhZGRpdGlvbiIpCisgICAgICAgIG8uZm9vID0gMgorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkuZm9vID09IDIsCisgICAgICAgICAgICAgICAgICAgICAicHJveHkgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uIikKKyAgICAgICAgZGVsIG8uZm9vCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihwcm94eSwgJ2ZvbycpLAorICAgICAgICAgICAgICAgICAgICAgInByb3h5IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIHJlbW92YWwiKQorCisgICAgICAgIHByb3h5LmZvbyA9IDEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8uZm9vID09IDEsCisgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIGFkZGl0aW9uIHZpYSBwcm94eSIpCisgICAgICAgIHByb3h5LmZvbyA9IDIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICAgICAgby5mb28gPT0gMiwKKyAgICAgICAgICAgICJvYmplY3QgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgbW9kaWZpY2F0aW9uIHZpYSBwcm94eSIpCisgICAgICAgIGRlbCBwcm94eS5mb28KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKG8sICdmb28nKSwKKyAgICAgICAgICAgICAgICAgICAgICJvYmplY3QgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgcmVtb3ZhbCB2aWEgcHJveHkiKQorCisgICAgZGVmIHRlc3RfcHJveHlfZGVsZXRpb24oc2VsZik6CisgICAgICAgICMgVGVzdCBjbGVhcmluZyBvZiBTRiBidWcgIzc2Mjg5MQorICAgICAgICBjbGFzcyBGb286CisgICAgICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgICAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgYWNjZXNzb3IpOgorICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gYWNjZXNzb3IKKyAgICAgICAgZyA9IEZvbygpCisgICAgICAgIGYgPSB3ZWFrcmVmLnByb3h5KGcpCisgICAgICAgIGRlbCBmWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZXN1bHQsIDApCisKKyAgICBkZWYgdGVzdF9wcm94eV9ib29sKHNlbGYpOgorICAgICAgICAjIFRlc3QgY2xlYXJpbmcgb2YgU0YgYnVnICMxMTcwNzY2CisgICAgICAgIGNsYXNzIExpc3QobGlzdCk6IHBhc3MKKyAgICAgICAgbHlzdCA9IExpc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2wod2Vha3JlZi5wcm94eShseXN0KSksIGJvb2wobHlzdCkpCisKKyAgICBkZWYgdGVzdF9nZXR3ZWFrcmVmY291bnQoc2VsZik6CisgICAgICAgIG8gPSBDKCkKKyAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8pCisgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJnb3Qgd3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlIG9iamVjdHMiKQorCisgICAgICAgIHByb3h5MSA9IHdlYWtyZWYucHJveHkobykKKyAgICAgICAgcHJveHkyID0gd2Vha3JlZi5wcm94eShvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gNCwKKyAgICAgICAgICAgICAgICAgICAgICJnb3Qgd3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlIG9iamVjdHMiKQorCisgICAgICAgIGRlbCByZWYxLCByZWYyLCBwcm94eTEsIHByb3h5MgorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICJ3ZWFrIHJlZmVyZW5jZSBvYmplY3RzIG5vdCB1bmxpbmtlZCBmcm9tIgorICAgICAgICAgICAgICAgICAgICAgIiByZWZlcmVudCB3aGVuIGRpc2NhcmRlZC4iKQorCisgICAgICAgICMgYXNzdW1lcyBpbnRzIGRvIG5vdCBzdXBwb3J0IHdlYWtyZWZzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudCgxKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgImdvdCB3cm9uZyBudW1iZXIgb2Ygd2VhayByZWZlcmVuY2Ugb2JqZWN0cyBmb3IgaW50IikKKworICAgIGRlZiB0ZXN0X2dldHdlYWtyZWZzKHNlbGYpOgorICAgICAgICBvID0gQygpCisgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQorICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKKyAgICAgICAgZGVsIHJlZjEKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW3JlZjJdLAorICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBkb2VzIG5vdCBtYXRjaCIpCisKKyAgICAgICAgbyA9IEMoKQorICAgICAgICByZWYxID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKKyAgICAgICAgcmVmMiA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCisgICAgICAgIGRlbCByZWYyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pID09IFtyZWYxXSwKKyAgICAgICAgICAgICAgICAgICAgICJsaXN0IG9mIHJlZnMgZG9lcyBub3QgbWF0Y2giKQorCisgICAgICAgIGRlbCByZWYxCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pID09IFtdLAorICAgICAgICAgICAgICAgICAgICAgImxpc3Qgb2YgcmVmcyBub3QgY2xlYXJlZCIpCisKKyAgICAgICAgIyBhc3N1bWVzIGludHMgZG8gbm90IHN1cHBvcnQgd2Vha3JlZnMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMoMSkgPT0gW10sCisgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIGRvZXMgbm90IG1hdGNoIGZvciBpbnQiKQorCisgICAgZGVmIHRlc3RfbmV3c3R5bGVfbnVtYmVyX29wcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRihmbG9hdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGYgPSBGKDIuMCkKKyAgICAgICAgcCA9IHdlYWtyZWYucHJveHkoZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAgKyAxLjAgPT0gMy4wKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMS4wICsgcCA9PSAzLjApICAjIHRoaXMgdXNlZCB0byBTRUdWCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja3NfcHJvdGVjdGVkKHNlbGYpOgorICAgICAgICAjIENhbGxiYWNrcyBwcm90ZWN0ZWQgZnJvbSBhbHJlYWR5LXNldCBleGNlcHRpb25zPworICAgICAgICAjIFJlZ3Jlc3Npb24gdGVzdCBmb3IgU0YgYnVnICM0Nzg1MzQuCisgICAgICAgIGNsYXNzIEJvZ3VzRXJyb3IoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGF0YSA9IHt9CisgICAgICAgIGRlZiByZW1vdmUoayk6CisgICAgICAgICAgICBkZWwgZGF0YVtrXQorICAgICAgICBkZWYgZW5jYXBzdWxhdGUoKToKKyAgICAgICAgICAgIGYgPSBsYW1iZGEgOiAoKQorICAgICAgICAgICAgZGF0YVt3ZWFrcmVmLnJlZihmLCByZW1vdmUpXSA9IE5vbmUKKyAgICAgICAgICAgIHJhaXNlIEJvZ3VzRXJyb3IKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5jYXBzdWxhdGUoKQorICAgICAgICBleGNlcHQgQm9ndXNFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhjZXB0aW9uIG5vdCBwcm9wZXJseSByZXN0b3JlZCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVuY2Fwc3VsYXRlKCkKKyAgICAgICAgZXhjZXB0IEJvZ3VzRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImV4Y2VwdGlvbiBub3QgcHJvcGVybHkgcmVzdG9yZWQiKQorCisgICAgZGVmIHRlc3Rfc2ZfYnVnXzg0MDgyOShzZWxmKToKKyAgICAgICAgIyAid2Vha3JlZiBjYWxsYmFja3MgYW5kIGdjIGNvcnJ1cHQgbWVtb3J5IgorICAgICAgICAjIHN1YnR5cGVfZGVhbGxvYyBlcnJvbmVvdXNseSBleHBvc2VkIGEgbmV3LXN0eWxlIGluc3RhbmNlCisgICAgICAgICMgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcyBvZiBnZXR0aW5nIGRlYWxsb2NhdGVkIHRvIGdjLAorICAgICAgICAjIGNhdXNpbmcgZG91YmxlLWRlYWxsb2NhdGlvbiBpZiB0aGUgaW5zdGFuY2UgaGFkIGEgd2Vha3JlZgorICAgICAgICAjIGNhbGxiYWNrIHRoYXQgdHJpZ2dlcmVkIGdjLgorICAgICAgICAjIElmIHRoZSBidWcgZXhpc3RzLCB0aGVyZSBwcm9iYWJseSB3b24ndCBiZSBhbiBvYnZpb3VzIHN5bXB0b20KKyAgICAgICAgIyBpbiBhIHJlbGVhc2UgYnVpbGQuICBJbiBhIGRlYnVnIGJ1aWxkLCBhIHNlZ2ZhdWx0IHdpbGwgb2NjdXIKKyAgICAgICAgIyB3aGVuIHRoZSBzZWNvbmQgYXR0ZW1wdCB0byByZW1vdmUgdGhlIGluc3RhbmNlIGZyb20gdGhlICJsaXN0CisgICAgICAgICMgb2YgYWxsIG9iamVjdHMiIG9jY3Vycy4KKworICAgICAgICBpbXBvcnQgZ2MKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYyA9IEMoKQorICAgICAgICB3ciA9IHdlYWtyZWYucmVmKGMsIGxhbWJkYSBpZ25vcmU6IGdjLmNvbGxlY3QoKSkKKyAgICAgICAgZGVsIGMKKworICAgICAgICAjIFRoZXJlIGVuZGV0aCB0aGUgZmlyc3QgcGFydC4gIEl0IGdldHMgd29yc2UuCisgICAgICAgIGRlbCB3cgorCisgICAgICAgIGMxID0gQygpCisgICAgICAgIGMxLmkgPSBDKCkKKyAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihjMS5pLCBsYW1iZGEgaWdub3JlOiBnYy5jb2xsZWN0KCkpCisKKyAgICAgICAgYzIgPSBDKCkKKyAgICAgICAgYzIuYzEgPSBjMQorICAgICAgICBkZWwgYzEgICMgc3RpbGwgYWxpdmUgYmVjYXVzZSBjMiBwb2ludHMgdG8gaXQKKworICAgICAgICAjIE5vdyB3aGVuIHN1YnR5cGVfZGVhbGxvYyBnZXRzIGNhbGxlZCBvbiBjMiwgaXQncyBub3QgZW5vdWdoIGp1c3QKKyAgICAgICAgIyB0aGF0IGMyIGlzIGltbXVuZSBmcm9tIGdjIHdoaWxlIHRoZSB3ZWFrcmVmIGNhbGxiYWNrcyBhc3NvY2lhdGVkCisgICAgICAgICMgd2l0aCBjMiBleGVjdXRlICh0aGVyZSBhcmUgbm9uZSBpbiB0aGlzIDJuZCBoYWxmIG9mIHRoZSB0ZXN0LCBidHcpLgorICAgICAgICAjIHN1YnR5cGVfZGVhbGxvYyBnb2VzIG9uIHRvIGNhbGwgdGhlIGJhc2UgY2xhc3NlcycgZGVhbGxvY3MgdG9vLAorICAgICAgICAjIHNvIGFueSBnYyB0cmlnZ2VyZWQgYnkgd2Vha3JlZiBjYWxsYmFja3MgYXNzb2NpYXRlZCB3aXRoIGFueXRoaW5nCisgICAgICAgICMgdG9ybiBkb3duIGJ5IGEgYmFzZSBjbGFzcyBkZWFsbG9jIGNhbiBhbHNvIHRyaWdnZXIgZG91YmxlCisgICAgICAgICMgZGVhbGxvY2F0aW9uIG9mIGMyLgorICAgICAgICBkZWwgYzIKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2luX2N5Y2xlXzEoc2VsZik6CisgICAgICAgIGltcG9ydCBnYworCisgICAgICAgIGNsYXNzIEoob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBJSShvYmplY3QpOgorICAgICAgICAgICAgZGVmIGFjYWxsYmFjayhzZWxmLCBpZ25vcmUpOgorICAgICAgICAgICAgICAgIHNlbGYuSgorCisgICAgICAgIEkgPSBJSSgpCisgICAgICAgIEkuSiA9IEoKKyAgICAgICAgSS53ciA9IHdlYWtyZWYucmVmKEosIEkuYWNhbGxiYWNrKQorCisgICAgICAgICMgTm93IEogYW5kIElJIGFyZSBlYWNoIGluIGEgc2VsZi1jeWNsZSAoYXMgYWxsIG5ldy1zdHlsZSBjbGFzcworICAgICAgICAjIG9iamVjdHMgYXJlLCBzaW5jZSB0aGVpciBfX21yb19fIHBvaW50cyBiYWNrIHRvIHRoZW0pLiAgSSBob2xkcworICAgICAgICAjIGJvdGggYSB3ZWFrIHJlZmVyZW5jZSAoSS53cikgYW5kIGEgc3Ryb25nIHJlZmVyZW5jZSAoSS5KKSB0byBjbGFzcworICAgICAgICAjIEouICBJIGlzIGFsc28gaW4gYSBjeWNsZSAoSS53ciBwb2ludHMgdG8gYSB3ZWFrcmVmIHRoYXQgcmVmZXJlbmNlcworICAgICAgICAjIEkuYWNhbGxiYWNrKS4gIFdoZW4gd2UgZGVsIHRoZXNlIHRocmVlLCB0aGV5IGFsbCBiZWNvbWUgdHJhc2gsIGJ1dAorICAgICAgICAjIHRoZSBjeWNsZXMgcHJldmVudCBhbnkgb2YgdGhlbSBmcm9tIGdldHRpbmcgY2xlYW5lZCB1cCBpbW1lZGlhdGVseS4KKyAgICAgICAgIyBJbnN0ZWFkIHRoZXkgaGF2ZSB0byB3YWl0IGZvciBjeWNsaWMgZ2MgdG8gZGVkdWNlIHRoYXQgdGhleSdyZQorICAgICAgICAjIHRyYXNoLgorICAgICAgICAjCisgICAgICAgICMgZ2MgdXNlZCB0byBjYWxsIHRwX2NsZWFyIG9uIGFsbCBvZiB0aGVtLCBhbmQgdGhlIG9yZGVyIGluIHdoaWNoCisgICAgICAgICMgaXQgZG9lcyB0aGF0IGlzIHByZXR0eSBhY2NpZGVudGFsLiAgVGhlIGV4YWN0IG9yZGVyIGluIHdoaWNoIHdlCisgICAgICAgICMgYnVpbHQgdXAgdGhlc2UgdGhpbmdzIG1hbmFnZXMgdG8gcHJvdm9rZSBnYyBpbnRvIHJ1bm5pbmcgdHBfY2xlYXIKKyAgICAgICAgIyBpbiBqdXN0IHRoZSByaWdodCBvcmRlciAoSSBsYXN0KS4gIENhbGxpbmcgdHBfY2xlYXIgb24gSUkgbGVhdmVzCisgICAgICAgICMgYmVoaW5kIGFuIGluc2FuZSBjbGFzcyBvYmplY3QgKGl0cyBfX21yb19fIGJlY29tZXMgTlVMTCkuICBDYWxsaW5nCisgICAgICAgICMgdHBfY2xlYXIgb24gSiBicmVha3MgaXRzIHNlbGYtY3ljbGUsIGJ1dCBKIGRvZXNuJ3QgZ2V0IGRlbGV0ZWQKKyAgICAgICAgIyBqdXN0IHRoZW4gYmVjYXVzZSBvZiB0aGUgc3Ryb25nIHJlZmVyZW5jZSBmcm9tIEkuSi4gIENhbGxpbmcKKyAgICAgICAgIyB0cF9jbGVhciBvbiBJIHN0YXJ0cyB0byBjbGVhciBJJ3MgX19kaWN0X18sIGFuZCBqdXN0IGhhcHBlbnMgdG8KKyAgICAgICAgIyBjbGVhciBJLkogZmlyc3QgLS0gSS53ciBpcyBzdGlsbCBpbnRhY3QuICBUaGF0IHJlbW92ZXMgdGhlIGxhc3QKKyAgICAgICAgIyByZWZlcmVuY2UgdG8gSiwgd2hpY2ggdHJpZ2dlcnMgdGhlIHdlYWtyZWYgY2FsbGJhY2suICBUaGUgY2FsbGJhY2sKKyAgICAgICAgIyB0cmllcyB0byBkbyAic2VsZi5KIiwgYW5kIGluc3RhbmNlcyBvZiBuZXctc3R5bGUgY2xhc3NlcyBsb29rIHVwCisgICAgICAgICMgYXR0cmlidXRlcyAoIkoiKSBpbiB0aGUgY2xhc3MgZGljdCBmaXJzdC4gIFRoZSBjbGFzcyAoSUkpIHdhbnRzIHRvCisgICAgICAgICMgc2VhcmNoIElJLl9fbXJvX18sIGJ1dCB0aGF0J3MgTlVMTC4gICBUaGUgcmVzdWx0IHdhcyBhIHNlZ2ZhdWx0IGluCisgICAgICAgICMgYSByZWxlYXNlIGJ1aWxkLCBhbmQgYW4gYXNzZXJ0IGZhaWx1cmUgaW4gYSBkZWJ1ZyBidWlsZC4KKyAgICAgICAgZGVsIEksIEosIElJCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfaW5fY3ljbGVfMihzZWxmKToKKyAgICAgICAgaW1wb3J0IGdjCisKKyAgICAgICAgIyBUaGlzIGlzIGp1c3QgbGlrZSB0ZXN0X2NhbGxiYWNrX2luX2N5Y2xlXzEsIGV4Y2VwdCB0aGF0IElJIGlzIGFuCisgICAgICAgICMgb2xkLXN0eWxlIGNsYXNzLiAgVGhlIHN5bXB0b20gaXMgZGlmZmVyZW50IHRoZW46ICBhbiBpbnN0YW5jZSBvZiBhbgorICAgICAgICAjIG9sZC1zdHlsZSBjbGFzcyBsb29rcyBpbiBpdHMgb3duIF9fZGljdF9fIGZpcnN0LiAgJ0onIGhhcHBlbnMgdG8KKyAgICAgICAgIyBnZXQgY2xlYXJlZCBmcm9tIEkuX19kaWN0X18gYmVmb3JlICd3cicsIGFuZCAnSicgd2FzIG5ldmVyIGluIElJJ3MKKyAgICAgICAgIyBfX2RpY3RfXywgc28gdGhlIGF0dHJpYnV0ZSBpc24ndCBmb3VuZC4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQKKyAgICAgICAgIyB0aGUgb2xkLXN0eWxlIElJIGRvZXNuJ3QgaGF2ZSBhIE5VTEwgX19tcm9fXyAoaXQgZG9lc24ndCBoYXZlIGFueQorICAgICAgICAjIF9fbXJvX18pLCBzbyBubyBzZWdmYXVsdCBvY2N1cnMuICBJbnN0ZWFkIGl0IGdvdDoKKyAgICAgICAgIyAgICB0ZXN0X2NhbGxiYWNrX2luX2N5Y2xlXzIgKF9fbWFpbl9fLlJlZmVyZW5jZXNUZXN0Q2FzZSkgLi4uCisgICAgICAgICMgICAgRXhjZXB0aW9uIGV4Y2VwdGlvbnMuQXR0cmlidXRlRXJyb3I6CisgICAgICAgICMgICAiSUkgaW5zdGFuY2UgaGFzIG5vIGF0dHJpYnV0ZSAnSiciIGluIDxib3VuZCBtZXRob2QgSUkuYWNhbGxiYWNrCisgICAgICAgICMgICAgICAgb2YgPD8uSUkgaW5zdGFuY2UgYXQgMHgwMEI5QjRCOD4+IGlnbm9yZWQKKworICAgICAgICBjbGFzcyBKKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgSUk6CisgICAgICAgICAgICBkZWYgYWNhbGxiYWNrKHNlbGYsIGlnbm9yZSk6CisgICAgICAgICAgICAgICAgc2VsZi5KCisKKyAgICAgICAgSSA9IElJKCkKKyAgICAgICAgSS5KID0gSgorICAgICAgICBJLndyID0gd2Vha3JlZi5yZWYoSiwgSS5hY2FsbGJhY2spCisKKyAgICAgICAgZGVsIEksIEosIElJCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfaW5fY3ljbGVfMyhzZWxmKToKKyAgICAgICAgaW1wb3J0IGdjCisKKyAgICAgICAgIyBUaGlzIG9uZSBicm9rZSB0aGUgZmlyc3QgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgbGFzdCB0d28uICBJbiB0aGlzCisgICAgICAgICMgY2FzZSwgdGhlIG9iamVjdHMgcmVhY2hhYmxlIGZyb20gdGhlIGNhbGxiYWNrIGFyZW4ndCBhbHNvIHJlYWNoYWJsZQorICAgICAgICAjIGZyb20gdGhlIG9iamVjdCAoYzEpICp0cmlnZ2VyaW5nKiB0aGUgY2FsbGJhY2s6ICB5b3UgY2FuIGdldCB0bworICAgICAgICAjIGMxIGZyb20gYzIsIGJ1dCBub3QgdmljZS12ZXJzYS4gIFRoZSByZXN1bHQgd2FzIHRoYXQgYzIncyBfX2RpY3RfXworICAgICAgICAjIGdvdCB0cF9jbGVhcidlZCBieSB0aGUgdGltZSB0aGUgYzIuY2IgY2FsbGJhY2sgZ290IGludm9rZWQuCisKKyAgICAgICAgY2xhc3MgQzoKKyAgICAgICAgICAgIGRlZiBjYihzZWxmLCBpZ25vcmUpOgorICAgICAgICAgICAgICAgIHNlbGYubWUKKyAgICAgICAgICAgICAgICBzZWxmLmMxCisgICAgICAgICAgICAgICAgc2VsZi53cgorCisgICAgICAgIGMxLCBjMiA9IEMoKSwgQygpCisKKyAgICAgICAgYzIubWUgPSBjMgorICAgICAgICBjMi5jMSA9IGMxCisgICAgICAgIGMyLndyID0gd2Vha3JlZi5yZWYoYzEsIGMyLmNiKQorCisgICAgICAgIGRlbCBjMSwgYzIKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19pbl9jeWNsZV80KHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2MKKworICAgICAgICAjIExpa2UgdGVzdF9jYWxsYmFja19pbl9jeWNsZV8zLCBleGNlcHQgYzIgYW5kIGMxIGhhdmUgZGlmZmVyZW50CisgICAgICAgICMgY2xhc3Nlcy4gIGMyJ3MgY2xhc3MgKEMpIGlzbid0IHJlYWNoYWJsZSBmcm9tIGMxIHRoZW4sIHNvIHByb3RlY3RpbmcKKyAgICAgICAgIyBvYmplY3RzIHJlYWNoYWJsZSBmcm9tIHRoZSBkeWluZyBvYmplY3QgKGMxKSBpc24ndCBlbm91Z2ggdG8gc3RvcAorICAgICAgICAjIGMyJ3MgY2xhc3MgKEMpIGZyb20gZ2V0dGluZyB0cF9jbGVhcidlZCBiZWZvcmUgYzIuY2IgaXMgaW52b2tlZC4KKyAgICAgICAgIyBUaGUgcmVzdWx0IHdhcyBhIHNlZ2ZhdWx0IChDLl9fbXJvX18gd2FzIE5VTEwgd2hlbiB0aGUgY2FsbGJhY2sKKyAgICAgICAgIyB0cmllZCB0byBsb29rIHVwIHNlbGYubWUpLgorCisgICAgICAgIGNsYXNzIEMob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBjYihzZWxmLCBpZ25vcmUpOgorICAgICAgICAgICAgICAgIHNlbGYubWUKKyAgICAgICAgICAgICAgICBzZWxmLmMxCisgICAgICAgICAgICAgICAgc2VsZi53cgorCisgICAgICAgIGNsYXNzIEQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgYzEsIGMyID0gRCgpLCBDKCkKKworICAgICAgICBjMi5tZSA9IGMyCisgICAgICAgIGMyLmMxID0gYzEKKyAgICAgICAgYzIud3IgPSB3ZWFrcmVmLnJlZihjMSwgYzIuY2IpCisKKyAgICAgICAgZGVsIGMxLCBjMiwgQywgRAorICAgICAgICBnYy5jb2xsZWN0KCkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2luX2N5Y2xlX3Jlc3VycmVjdGlvbihzZWxmKToKKyAgICAgICAgaW1wb3J0IGdjCisKKyAgICAgICAgIyBEbyBzb21ldGhpbmcgbmFzdHkgaW4gYSB3ZWFrcmVmIGNhbGxiYWNrOiAgcmVzdXJyZWN0IG9iamVjdHMKKyAgICAgICAgIyBmcm9tIGRlYWQgY3ljbGVzLiAgRm9yIHRoaXMgdG8gYmUgYXR0ZW1wdGVkLCB0aGUgd2Vha3JlZiBhbmQKKyAgICAgICAgIyBpdHMgY2FsbGJhY2sgbXVzdCBhbHNvIGJlIHBhcnQgb2YgdGhlIGN5Y2xpYyB0cmFzaCAoZWxzZSB0aGUKKyAgICAgICAgIyBvYmplY3RzIHJlYWNoYWJsZSB2aWEgdGhlIGNhbGxiYWNrIGNvdWxkbid0IGJlIGluIGN5Y2xpYyB0cmFzaAorICAgICAgICAjIHRvIGJlZ2luIHdpdGggLS0gdGhlIGNhbGxiYWNrIHdvdWxkIGFjdCBsaWtlIGFuIGV4dGVybmFsIHJvb3QpLgorICAgICAgICAjIEJ1dCBnYyBjbGVhcnMgdHJhc2ggd2Vha3JlZnMgd2l0aCBjYWxsYmFja3MgZWFybHkgbm93LCB3aGljaAorICAgICAgICAjIGRpc2FibGVzIHRoZSBjYWxsYmFja3MsIHNvIHRoZSBjYWxsYmFja3Mgc2hvdWxkbid0IGdldCBjYWxsZWQKKyAgICAgICAgIyBhdCBhbGwgKGFuZCBzbyBub3RoaW5nIGFjdHVhbGx5IGdldHMgcmVzdXJyZWN0ZWQpLgorCisgICAgICAgIGFsaXN0ID0gW10KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLmF0dHJpYnV0ZSA9IHZhbHVlCisKKyAgICAgICAgICAgIGRlZiBhY2FsbGJhY2soc2VsZiwgaWdub3JlKToKKyAgICAgICAgICAgICAgICBhbGlzdC5hcHBlbmQoc2VsZi5jKQorCisgICAgICAgIGMxLCBjMiA9IEMoMSksIEMoMikKKyAgICAgICAgYzEuYyA9IGMyCisgICAgICAgIGMyLmMgPSBjMQorICAgICAgICBjMS53ciA9IHdlYWtyZWYucmVmKGMyLCBjMS5hY2FsbGJhY2spCisgICAgICAgIGMyLndyID0gd2Vha3JlZi5yZWYoYzEsIGMyLmFjYWxsYmFjaykKKworICAgICAgICBkZWYgQ193ZW50X2F3YXkoaWdub3JlKToKKyAgICAgICAgICAgIGFsaXN0LmFwcGVuZCgiQyB3ZW50IGF3YXkiKQorICAgICAgICB3ciA9IHdlYWtyZWYucmVmKEMsIENfd2VudF9hd2F5KQorCisgICAgICAgIGRlbCBjMSwgYzIsIEMgICAjIG1ha2UgdGhlbSBhbGwgdHJhc2gKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlzdCwgW10pICAjIGRlbCBpc24ndCBlbm91Z2ggdG8gcmVjbGFpbSBhbnl0aGluZworCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICAjIGMxLndyIGFuZCBjMi53ciB3ZXJlIHBhcnQgb2YgdGhlIGN5Y2xpYyB0cmFzaCwgc28gc2hvdWxkIGhhdmUKKyAgICAgICAgIyBiZWVuIGNsZWFyZWQgd2l0aG91dCB0aGVpciBjYWxsYmFja3MgZXhlY3V0aW5nLiAgT1RPSCwgdGhlIHdlYWtyZWYKKyAgICAgICAgIyB0byBDIGlzIGJvdW5kIHRvIGEgZnVuY3Rpb24gbG9jYWwgKHdyKSwgYW5kIHdhc24ndCB0cmFzaCwgc28gdGhhdAorICAgICAgICAjIGNhbGxiYWNrIHNob3VsZCBoYXZlIGJlZW4gaW52b2tlZCB3aGVuIEMgd2VudCBhd2F5LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaXN0LCBbIkMgd2VudCBhd2F5Il0pCisgICAgICAgICMgVGhlIHJlbWFpbmluZyB3ZWFrcmVmIHNob3VsZCBiZSBkZWFkIG5vdyAoaXRzIGNhbGxiYWNrIHJhbikuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3IoKSwgTm9uZSkKKworICAgICAgICBkZWwgYWxpc3RbOl0KKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpc3QsIFtdKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tzX29uX2NhbGxiYWNrKHNlbGYpOgorICAgICAgICBpbXBvcnQgZ2MKKworICAgICAgICAjIFNldCB1cCB3ZWFrcmVmIGNhbGxiYWNrcyAqb24qIHdlYWtyZWYgY2FsbGJhY2tzLgorICAgICAgICBhbGlzdCA9IFtdCisgICAgICAgIGRlZiBzYWZlX2NhbGxiYWNrKGlnbm9yZSk6CisgICAgICAgICAgICBhbGlzdC5hcHBlbmQoInNhZmVfY2FsbGJhY2sgY2FsbGVkIikKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgY2Ioc2VsZiwgaWdub3JlKToKKyAgICAgICAgICAgICAgICBhbGlzdC5hcHBlbmQoImNiIGNhbGxlZCIpCisKKyAgICAgICAgYywgZCA9IEMoKSwgQygpCisgICAgICAgIGMub3RoZXIgPSBkCisgICAgICAgIGQub3RoZXIgPSBjCisgICAgICAgIGNhbGxiYWNrID0gYy5jYgorICAgICAgICBjLndyID0gd2Vha3JlZi5yZWYoZCwgY2FsbGJhY2spICAgICAjIHRoaXMgd29uJ3QgdHJpZ2dlcgorICAgICAgICBkLndyID0gd2Vha3JlZi5yZWYoY2FsbGJhY2ssIGQuY2IpICAjIGRpdHRvCisgICAgICAgIGV4dGVybmFsX3dyID0gd2Vha3JlZi5yZWYoY2FsbGJhY2ssIHNhZmVfY2FsbGJhY2spICAjIGJ1dCB0aGlzIHdpbGwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVybmFsX3dyKCkgaXMgY2FsbGJhY2spCisKKyAgICAgICAgIyBUaGUgd2Vha3JlZnMgYXR0YWNoZWQgdG8gYyBhbmQgZCBzaG91bGQgZ2V0IGNsZWFyZWQsIHNvIHRoYXQKKyAgICAgICAgIyBDLmNiIGlzIG5ldmVyIGNhbGxlZC4gIEJ1dCBleHRlcm5hbF93ciBpc24ndCBwYXJ0IG9mIHRoZSBjeWNsaWMKKyAgICAgICAgIyB0cmFzaCwgYW5kIG5vIGN5Y2xpYyB0cmFzaCBpcyByZWFjaGFibGUgZnJvbSBpdCwgc28gc2FmZV9jYWxsYmFjaworICAgICAgICAjIHNob3VsZCBnZXQgaW52b2tlZCB3aGVuIHRoZSBib3VuZCBtZXRob2Qgb2JqZWN0IGNhbGxiYWNrIChjLmNiKQorICAgICAgICAjIC0tIHdoaWNoIGlzIGl0c2VsZiBhIGNhbGxiYWNrLCBhbmQgYWxzbyBwYXJ0IG9mIHRoZSBjeWNsaWMgdHJhc2ggLS0KKyAgICAgICAgIyBnZXRzIHJlY2xhaW1lZCBhdCB0aGUgZW5kIG9mIGdjLgorCisgICAgICAgIGRlbCBjYWxsYmFjaywgYywgZCwgQworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaXN0LCBbXSkgICMgZGVsIGlzbid0IGVub3VnaCB0byBjbGVhbiB1cCBjeWNsZXMKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpc3QsIFsic2FmZV9jYWxsYmFjayBjYWxsZWQiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRlcm5hbF93cigpLCBOb25lKQorCisgICAgICAgIGRlbCBhbGlzdFs6XQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlzdCwgW10pCisKKyAgICBkZWYgdGVzdF9nY19kdXJpbmdfcmVmX2NyZWF0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2djX2R1cmluZ19jcmVhdGlvbih3ZWFrcmVmLnJlZikKKworICAgIGRlZiB0ZXN0X2djX2R1cmluZ19wcm94eV9jcmVhdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19nY19kdXJpbmdfY3JlYXRpb24od2Vha3JlZi5wcm94eSkKKworICAgIGRlZiBjaGVja19nY19kdXJpbmdfY3JlYXRpb24oc2VsZiwgbWFrZXJlZik6CisgICAgICAgIHRocmVzaG9sZHMgPSBnYy5nZXRfdGhyZXNob2xkKCkKKyAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCgxLCAxLCAxKQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgY2xhc3MgQToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgY2FsbGJhY2soKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJlZmVyZW5jZWQgPSBBKCkKKworICAgICAgICBhID0gQSgpCisgICAgICAgIGEuYSA9IGEKKyAgICAgICAgYS53ciA9IG1ha2VyZWYocmVmZXJlbmNlZCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIG5vdyBtYWtlIHN1cmUgdGhlIG9iamVjdCBhbmQgdGhlIHJlZiBnZXQgbGFiZWxlZCBhcworICAgICAgICAgICAgIyBjeWNsaWMgdHJhc2g6CisgICAgICAgICAgICBhID0gQSgpCisgICAgICAgICAgICB3ZWFrcmVmLnJlZihyZWZlcmVuY2VkLCBjYWxsYmFjaykKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCgqdGhyZXNob2xkcykKKworICAgIGRlZiB0ZXN0X3JlZl9jcmVhdGVkX2R1cmluZ19kZWwoc2VsZik6CisgICAgICAgICMgQnVnICMxMzc3ODU4CisgICAgICAgICMgQSB3ZWFrcmVmIGNyZWF0ZWQgaW4gYW4gb2JqZWN0J3MgX19kZWxfXygpIHdvdWxkIGNyYXNoIHRoZQorICAgICAgICAjIGludGVycHJldGVyIHdoZW4gdGhlIHdlYWtyZWYgd2FzIGNsZWFuZWQgdXAgc2luY2UgaXQgd291bGQgcmVmZXIgdG8KKyAgICAgICAgIyBub24tZXhpc3RlbnQgbWVtb3J5LiAgVGhpcyB0ZXN0IHNob3VsZCBub3Qgc2VnZmF1bHQgdGhlIGludGVycHJldGVyLgorICAgICAgICBjbGFzcyBUYXJnZXQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIGdsb2JhbCByZWZfZnJvbV9kZWwKKyAgICAgICAgICAgICAgICByZWZfZnJvbV9kZWwgPSB3ZWFrcmVmLnJlZihzZWxmKQorCisgICAgICAgIHcgPSBUYXJnZXQoKQorCisgICAgZGVmIHRlc3RfaW5pdChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAzNjM0CisgICAgICAgICMgPHdlYWtyZWYgdG8gY2xhc3M+Ll9faW5pdF9fKCkgZG9lc24ndCBjaGVjayBlcnJvcnMgY29ycmVjdGx5CisgICAgICAgIHIgPSB3ZWFrcmVmLnJlZihFeGNlcHRpb24pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgci5fX2luaXRfXywgMCwgMCwgMCwgMCwgMCkKKyAgICAgICAgIyBObyBleGNlcHRpb24gc2hvdWxkIGJlIHJhaXNlZCBoZXJlCisgICAgICAgIGdjLmNvbGxlY3QoKQorCisgICAgZGVmIHRlc3RfY2xhc3NlcyhzZWxmKToKKyAgICAgICAgIyBDaGVjayB0aGF0IGJvdGggb2xkLXN0eWxlIGNsYXNzZXMgYW5kIG5ldy1zdHlsZSBjbGFzc2VzCisgICAgICAgICMgYXJlIHdlYWtyZWZhYmxlLgorICAgICAgICBjbGFzcyBBKG9iamVjdCk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIEI6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGwgPSBbXQorICAgICAgICB3ZWFrcmVmLnJlZihpbnQpCisgICAgICAgIGEgPSB3ZWFrcmVmLnJlZihBLCBsLmFwcGVuZCkKKyAgICAgICAgQSA9IE5vbmUKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSgpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwsIFthXSkKKyAgICAgICAgYiA9IHdlYWtyZWYucmVmKEIsIGwuYXBwZW5kKQorICAgICAgICBCID0gTm9uZQorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobCwgW2EsIGJdKQorCisgICAgZGVmIHRlc3RfZXF1YWxpdHkoc2VsZik6CisgICAgICAgICMgQWxpdmUgd2Vha3JlZnMgZGVmZXIgZXF1YWxpdHkgdGVzdGluZyB0byB0aGVpciB1bmRlcmx5aW5nIG9iamVjdC4KKyAgICAgICAgeCA9IE9iamVjdCgxKQorICAgICAgICB5ID0gT2JqZWN0KDEpCisgICAgICAgIHogPSBPYmplY3QoMikKKyAgICAgICAgYSA9IHdlYWtyZWYucmVmKHgpCisgICAgICAgIGIgPSB3ZWFrcmVmLnJlZih5KQorICAgICAgICBjID0gd2Vha3JlZi5yZWYoeikKKyAgICAgICAgZCA9IHdlYWtyZWYucmVmKHgpCisgICAgICAgICMgTm90ZSBob3cgd2UgZGlyZWN0bHkgdGVzdCB0aGUgb3BlcmF0b3JzIGhlcmUsIHRvIHN0cmVzcyBib3RoCisgICAgICAgICMgX19lcV9fIGFuZCBfX25lX18uCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGEgPT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShhICE9IGQpCisgICAgICAgIGRlbCB4LCB5LCB6CisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBmb3IgciBpbiBhLCBiLCBjOgorICAgICAgICAgICAgIyBTYW5pdHkgY2hlY2sKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXMocigpLCBOb25lKQorICAgICAgICAjIERlYWQgd2Vha3JlZnMgY29tcGFyZSBieSBpZGVudGl0eTogd2hldGhlciBgYWAgYW5kIGBkYCBhcmUgdGhlCisgICAgICAgICMgc2FtZSB3ZWFrcmVmIG9iamVjdCBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHNpbmNlIHRoZXkgcG9pbnRlZAorICAgICAgICAjIHRvIHRoZSBzYW1lIG9yaWdpbmFsIG9iamVjdCBhbmQgZGlkbid0IGhhdmUgYSBjYWxsYmFjay4KKyAgICAgICAgIyAoc2VlIGlzc3VlICMxNjQ1MykuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoYSA9PSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGEgPT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgIT0gYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhID09IGQsIGEgaXMgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICE9IGQsIGEgaXMgbm90IGQpCisKKyAgICBkZWYgdGVzdF9oYXNoaW5nKHNlbGYpOgorICAgICAgICAjIEFsaXZlIHdlYWtyZWZzIGhhc2ggdGhlIHNhbWUgYXMgdGhlIHVuZGVybHlpbmcgb2JqZWN0CisgICAgICAgIHggPSBPYmplY3QoNDIpCisgICAgICAgIHkgPSBPYmplY3QoNDIpCisgICAgICAgIGEgPSB3ZWFrcmVmLnJlZih4KQorICAgICAgICBiID0gd2Vha3JlZi5yZWYoeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDQyKSkKKyAgICAgICAgZGVsIHgsIHkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgICMgRGVhZCB3ZWFrcmVmczoKKyAgICAgICAgIyAtIHJldGFpbiB0aGVpciBoYXNoIGlzIHRoZXkgd2VyZSBoYXNoZWQgd2hlbiBhbGl2ZTsKKyAgICAgICAgIyAtIG90aGVyd2lzZSwgY2Fubm90IGJlIGhhc2hlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBiKQorCisgICAgZGVmIHRlc3RfdHJhc2hjYW5fMTY2MDIoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzE2NjAyOiB3aGVuIGEgd2Vha3JlZidzIHRhcmdldCB3YXMgcGFydCBvZiBhIGxvbmcKKyAgICAgICAgIyBkZWFsbG9jYXRpb24gY2hhaW4sIHRoZSB0cmFzaGNhbiBtZWNoYW5pc20gY291bGQgZGVsYXkgY2xlYXJpbmcKKyAgICAgICAgIyBvZiB0aGUgd2Vha3JlZiBhbmQgbWFrZSB0aGUgdGFyZ2V0IG9iamVjdCB2aXNpYmxlIGZyb20gb3V0c2lkZQorICAgICAgICAjIGNvZGUgZXZlbiB0aG91Z2ggaXRzIHJlZmNvdW50IGhhZCBkcm9wcGVkIHRvIDAuICBBIGNyYXNoIGVuc3VlZC4KKyAgICAgICAgY2xhc3MgQyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCk6CisgICAgICAgICAgICAgICAgaWYgbm90IHBhcmVudDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgd3NlbGYgPSB3ZWFrcmVmLnJlZihzZWxmKQorICAgICAgICAgICAgICAgIGRlZiBjYih3cGFyZW50KToKKyAgICAgICAgICAgICAgICAgICAgbyA9IHdzZWxmKCkKKyAgICAgICAgICAgICAgICBzZWxmLndwYXJlbnQgPSB3ZWFrcmVmLnJlZihwYXJlbnQsIGNiKQorCisgICAgICAgIGQgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKyAgICAgICAgcm9vdCA9IGMgPSBDKE5vbmUpCisgICAgICAgIGZvciBuIGluIHJhbmdlKDEwMCk6CisgICAgICAgICAgICBkW2NdID0gYyA9IEMoYykKKyAgICAgICAgZGVsIHJvb3QKKyAgICAgICAgZ2MuY29sbGVjdCgpCisKKworY2xhc3MgU3ViY2xhc3NhYmxlV2Vha3JlZlRlc3RDYXNlKFRlc3RCYXNlKToKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3JlZnMoc2VsZik6CisgICAgICAgIGNsYXNzIE15UmVmKHdlYWtyZWYucmVmKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYiwgY2FsbGJhY2s9Tm9uZSwgdmFsdWU9NDIpOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICAgICAgICAgIHN1cGVyKE15UmVmLCBzZWxmKS5fX2luaXRfXyhvYiwgY2FsbGJhY2spCisgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyKE15UmVmLCBzZWxmKS5fX2NhbGxfXygpCisgICAgICAgIG8gPSBPYmplY3QoImZvbyIpCisgICAgICAgIG1yID0gTXlSZWYobywgdmFsdWU9MjQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtcigpIGlzIG8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtci5jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXIudmFsdWUsIDI0KQorICAgICAgICBkZWwgbworICAgICAgICBzZWxmLmFzc2VydFRydWUobXIoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXIuY2FsbGVkKQorCisgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmVmc19kb250X3JlcGxhY2Vfc3RhbmRhcmRfcmVmcyhzZWxmKToKKyAgICAgICAgY2xhc3MgTXlSZWYod2Vha3JlZi5yZWYpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBvID0gT2JqZWN0KDQyKQorICAgICAgICByMSA9IE15UmVmKG8pCisgICAgICAgIHIyID0gd2Vha3JlZi5yZWYobykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGlzIG5vdCByMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pLCBbcjIsIHIxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgMikKKyAgICAgICAgcjMgPSBNeVJlZihvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pLCAzKQorICAgICAgICByZWZzID0gd2Vha3JlZi5nZXR3ZWFrcmVmcyhvKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWZzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIyIGlzIHJlZnNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocjEsIHJlZnNbMTpdKQorICAgICAgICBzZWxmLmFzc2VydEluKHIzLCByZWZzWzE6XSkKKworICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3JlZnNfZG9udF9jb25mbGF0ZV9jYWxsYmFja3Moc2VsZik6CisgICAgICAgIGNsYXNzIE15UmVmKHdlYWtyZWYucmVmKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbyA9IE9iamVjdCg0MikKKyAgICAgICAgcjEgPSBNeVJlZihvLCBpZCkKKyAgICAgICAgcjIgPSBNeVJlZihvLCBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyMSBpcyBub3QgcjIpCisgICAgICAgIHJlZnMgPSB3ZWFrcmVmLmdldHdlYWtyZWZzKG8pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocjEsIHJlZnMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocjIsIHJlZnMpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWZzX3dpdGhfc2xvdHMoc2VsZik6CisgICAgICAgIGNsYXNzIE15UmVmKHdlYWtyZWYucmVmKToKKyAgICAgICAgICAgIF9fc2xvdHNfXyA9ICJzbG90MSIsICJzbG90MiIKKyAgICAgICAgICAgIGRlZiBfX25ld19fKHR5cGUsIG9iLCBjYWxsYmFjaywgc2xvdDEsIHNsb3QyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gd2Vha3JlZi5yZWYuX19uZXdfXyh0eXBlLCBvYiwgY2FsbGJhY2spCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgb2IsIGNhbGxiYWNrLCBzbG90MSwgc2xvdDIpOgorICAgICAgICAgICAgICAgIHNlbGYuc2xvdDEgPSBzbG90MQorICAgICAgICAgICAgICAgIHNlbGYuc2xvdDIgPSBzbG90MgorICAgICAgICAgICAgZGVmIG1ldGgoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2xvdDEgKyBzZWxmLnNsb3QyCisgICAgICAgIG8gPSBPYmplY3QoNDIpCisgICAgICAgIHIgPSBNeVJlZihvLCBOb25lLCAiYWJjIiwgImRlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5zbG90MSwgImFiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5zbG90MiwgImRlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoci5tZXRoKCksICJhYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc2F0dHIociwgIl9fZGljdF9fIikpCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWZzX3dpdGhfY3ljbGUoc2VsZik6CisgICAgICAgICMgQnVnICMzMTEwCisgICAgICAgICMgQW4gaW5zdGFuY2Ugb2YgYSB3ZWFrcmVmIHN1YmNsYXNzIGNhbiBoYXZlIGF0dHJpYnV0ZXMuCisgICAgICAgICMgSWYgc3VjaCBhIHdlYWtyZWYgaG9sZHMgdGhlIG9ubHkgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGUgb2JqZWN0LAorICAgICAgICAjIGRlbGV0aW5nIHRoZSB3ZWFrcmVmIHdpbGwgZGVsZXRlIHRoZSBvYmplY3QuIEluIHRoaXMgY2FzZSwKKyAgICAgICAgIyB0aGUgY2FsbGJhY2sgbXVzdCBub3QgYmUgY2FsbGVkLCBiZWNhdXNlIHRoZSByZWYgb2JqZWN0IGlzCisgICAgICAgICMgYmVpbmcgZGVsZXRlZC4KKyAgICAgICAgY2xhc3MgTXlSZWYod2Vha3JlZi5yZWYpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgVXNlIGEgbG9jYWwgY2FsbGJhY2ssIGZvciAicmVncnRlc3QgLVI6OiIKKyAgICAgICAgIyB0byBkZXRlY3QgcmVmY291bnRpbmcgcHJvYmxlbXMKKyAgICAgICAgZGVmIGNhbGxiYWNrKHcpOgorICAgICAgICAgICAgc2VsZi5jYmNhbGxlZCArPSAxCisKKyAgICAgICAgbyA9IEMoKQorICAgICAgICByMSA9IE15UmVmKG8sIGNhbGxiYWNrKQorICAgICAgICByMS5vID0gbworICAgICAgICBkZWwgbworCisgICAgICAgIGRlbCByMSAjIFVzZWQgdG8gY3Jhc2ggaGVyZQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5jYmNhbGxlZCwgMCkKKworICAgICAgICAjIFNhbWUgdGVzdCwgd2l0aCB0d28gd2Vha3JlZnMgdG8gdGhlIHNhbWUgb2JqZWN0CisgICAgICAgICMgKHNpbmNlIGNvZGUgcGF0aHMgYXJlIGRpZmZlcmVudCkKKyAgICAgICAgbyA9IEMoKQorICAgICAgICByMSA9IE15UmVmKG8sIGNhbGxiYWNrKQorICAgICAgICByMiA9IE15UmVmKG8sIGNhbGxiYWNrKQorICAgICAgICByMS5yID0gcjIKKyAgICAgICAgcjIubyA9IG8KKyAgICAgICAgZGVsIG8KKyAgICAgICAgZGVsIHIyCisKKyAgICAgICAgZGVsIHIxICMgVXNlZCB0byBjcmFzaCBoZXJlCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNiY2FsbGVkLCAwKQorCisKK2NsYXNzIE1hcHBpbmdUZXN0Q2FzZShUZXN0QmFzZSk6CisKKyAgICBDT1VOVCA9IDEwCisKKyAgICBkZWYgY2hlY2tfbGVuX2N5Y2xlcyhzZWxmLCBkaWN0X3R5cGUsIGNvbnMpOgorICAgICAgICBOID0gMjAKKyAgICAgICAgaXRlbXMgPSBbUmVmQ3ljbGUoKSBmb3IgaSBpbiByYW5nZShOKV0KKyAgICAgICAgZGN0ID0gZGljdF90eXBlKGNvbnMobykgZm9yIG8gaW4gaXRlbXMpCisgICAgICAgICMgS2VlcCBhbiBpdGVyYXRvciBhbGl2ZQorICAgICAgICBpdCA9IGRjdC5pdGVyaXRlbXMoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVsIGl0ZW1zCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBuMSA9IGxlbihkY3QpCisgICAgICAgIGRlbCBpdAorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgbjIgPSBsZW4oZGN0KQorICAgICAgICAjIG9uZSBpdGVtIG1heSBiZSBrZXB0IGFsaXZlIGluc2lkZSB0aGUgaXRlcmF0b3IKKyAgICAgICAgc2VsZi5hc3NlcnRJbihuMSwgKDAsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG4yLCAwKQorCisgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9sZW5fY3ljbGVzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2xlbl9jeWNsZXMod2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSwgbGFtYmRhIGs6IChrLCAxKSkKKworICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2xlbl9jeWNsZXMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfbGVuX2N5Y2xlcyh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksIGxhbWJkYSBrOiAoMSwgaykpCisKKyAgICBkZWYgY2hlY2tfbGVuX3JhY2Uoc2VsZiwgZGljdF90eXBlLCBjb25zKToKKyAgICAgICAgIyBFeHRlbmRlZCBzYW5pdHkgY2hlY2tzIGZvciBsZW4oKSBpbiB0aGUgZmFjZSBvZiBjeWNsaWMgY29sbGVjdGlvbgorICAgICAgICBzZWxmLmFkZENsZWFudXAoZ2Muc2V0X3RocmVzaG9sZCwgKmdjLmdldF90aHJlc2hvbGQoKSkKKyAgICAgICAgZm9yIHRoIGluIHJhbmdlKDEsIDEwMCk6CisgICAgICAgICAgICBOID0gMjAKKyAgICAgICAgICAgIGdjLmNvbGxlY3QoMCkKKyAgICAgICAgICAgIGdjLnNldF90aHJlc2hvbGQodGgsIHRoLCB0aCkKKyAgICAgICAgICAgIGl0ZW1zID0gW1JlZkN5Y2xlKCkgZm9yIGkgaW4gcmFuZ2UoTildCisgICAgICAgICAgICBkY3QgPSBkaWN0X3R5cGUoY29ucyhvKSBmb3IgbyBpbiBpdGVtcykKKyAgICAgICAgICAgIGRlbCBpdGVtcworICAgICAgICAgICAgIyBBbGwgaXRlbXMgd2lsbCBiZSBjb2xsZWN0ZWQgYXQgbmV4dCBnYXJiYWdlIGNvbGxlY3Rpb24gcGFzcworICAgICAgICAgICAgaXQgPSBkY3QuaXRlcml0ZW1zKCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbjEgPSBsZW4oZGN0KQorICAgICAgICAgICAgZGVsIGl0CisgICAgICAgICAgICBuMiA9IGxlbihkY3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChuMSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKG4xLCBOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwobjIsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbChuMiwgbjEpCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2xlbl9yYWNlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX2xlbl9yYWNlKHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnksIGxhbWJkYSBrOiAoaywgMSkpCisKKyAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlZF9sZW5fcmFjZShzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19sZW5fcmFjZSh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksIGxhbWJkYSBrOiAoMSwgaykpCisKKyAgICBkZWYgdGVzdF93ZWFrX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgIworICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLmNvcHkoKSwgZC5pdGVtcygpLCBkW10sIGRlbCBkW10sIGxlbihkKS4KKyAgICAgICAgIworICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfdmFsdWVkX2RpY3QoKQorICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gJXIhIiAlIG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyBkaWN0W28uYXJnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgb2JqZWN0IHJldHVybmVkIGJ5IHdlYWsgZGljdCEiKQorICAgICAgICBpdGVtczEgPSBkaWN0Lml0ZW1zKCkKKyAgICAgICAgaXRlbXMyID0gZGljdC5jb3B5KCkuaXRlbXMoKQorICAgICAgICBpdGVtczEuc29ydCgpCisgICAgICAgIGl0ZW1zMi5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZW1zMSA9PSBpdGVtczIsCisgICAgICAgICAgICAgICAgICAgICAiY2xvbmluZyBvZiB3ZWFrLXZhbHVlZCBkaWN0aW9uYXJ5IGRpZCBub3Qgd29yayEiKQorICAgICAgICBkZWwgaXRlbXMxLCBpdGVtczIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkaWN0KSA9PSBzZWxmLkNPVU5UKQorICAgICAgICBkZWwgb2JqZWN0c1swXQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IChzZWxmLkNPVU5UIC0gMSksCisgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgb2JqZWN0IGRpZCBub3QgY2F1c2UgZGljdGlvbmFyeSB1cGRhdGUiKQorICAgICAgICBkZWwgb2JqZWN0cywgbworICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IDAsCisgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgdGhlIHZhbHVlcyBkaWQgbm90IGNsZWFyIHRoZSBkaWN0aW9uYXJ5IikKKyAgICAgICAgIyByZWdyZXNzaW9uIG9uIFNGIGJ1ZyAjNDQ3MTUyOgorICAgICAgICBkaWN0ID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGRpY3QuX19nZXRpdGVtX18sIDEpCisgICAgICAgIGRpY3RbMl0gPSBDKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGRpY3QuX19nZXRpdGVtX18sIDIpCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleXMoc2VsZik6CisgICAgICAgICMKKyAgICAgICAgIyAgVGhpcyBleGVyY2lzZXMgZC5jb3B5KCksIGQuaXRlbXMoKSwgZFtdID0gdiwgZFtdLCBkZWwgZFtdLAorICAgICAgICAjICBsZW4oZCksIGluIGQuCisgICAgICAgICMKKyAgICAgICAgZGljdCwgb2JqZWN0cyA9IHNlbGYubWFrZV93ZWFrX2tleWVkX2RpY3QoKQorICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZXMgdG8gJXIhIiAlIG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoby5hcmcgaXMgZGljdFtvXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgb2JqZWN0IHJldHVybmVkIGJ5IHdlYWsgZGljdCEiKQorICAgICAgICBpdGVtczEgPSBkaWN0Lml0ZW1zKCkKKyAgICAgICAgaXRlbXMyID0gZGljdC5jb3B5KCkuaXRlbXMoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KGl0ZW1zMSkgPT0gc2V0KGl0ZW1zMiksCisgICAgICAgICAgICAgICAgICAgICAiY2xvbmluZyBvZiB3ZWFrLWtleWVkIGRpY3Rpb25hcnkgZGlkIG5vdCB3b3JrISIpCisgICAgICAgIGRlbCBpdGVtczEsIGl0ZW1zMgorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IHNlbGYuQ09VTlQpCisgICAgICAgIGRlbCBvYmplY3RzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gKHNlbGYuQ09VTlQgLSAxKSwKKyAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyBvYmplY3QgZGlkIG5vdCBjYXVzZSBkaWN0aW9uYXJ5IHVwZGF0ZSIpCisgICAgICAgIGRlbCBvYmplY3RzLCBvCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gMCwKKyAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUga2V5cyBkaWQgbm90IGNsZWFyIHRoZSBkaWN0aW9uYXJ5IikKKyAgICAgICAgbyA9IE9iamVjdCg0MikKKyAgICAgICAgZGljdFtvXSA9ICJXaGF0IGlzIHRoZSBtZWFuaW5nIG9mIHRoZSB1bml2ZXJzZT8iCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obywgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigzNCwgZGljdCkKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfaXRlcnMoc2VsZik6CisgICAgICAgIGRpY3QsIG9iamVjdHMgPSBzZWxmLm1ha2Vfd2Vha19rZXllZF9kaWN0KCkKKyAgICAgICAgc2VsZi5jaGVja19pdGVycyhkaWN0KQorCisgICAgICAgICMgVGVzdCBrZXlyZWZzKCkKKyAgICAgICAgcmVmcyA9IGRpY3Qua2V5cmVmcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlZnMpLCBsZW4ob2JqZWN0cykpCisgICAgICAgIG9iamVjdHMyID0gbGlzdChvYmplY3RzKQorICAgICAgICBmb3Igd3IgaW4gcmVmczoKKyAgICAgICAgICAgIG9iID0gd3IoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihvYiwgZGljdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iXSkKKyAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2JqZWN0czIpLCAwKQorCisgICAgICAgICMgVGVzdCBpdGVya2V5cmVmcygpCisgICAgICAgIG9iamVjdHMyID0gbGlzdChvYmplY3RzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGRpY3QuaXRlcmtleXJlZnMoKSkpLCBsZW4ob2JqZWN0cykpCisgICAgICAgIGZvciB3ciBpbiBkaWN0Lml0ZXJrZXlyZWZzKCk6CisgICAgICAgICAgICBvYiA9IHdyKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4ob2IsIGRpY3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLmFyZywgZGljdFtvYl0pCisgICAgICAgICAgICBvYmplY3RzMi5yZW1vdmUob2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9iamVjdHMyKSwgMCkKKworICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2l0ZXJzKHNlbGYpOgorICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfdmFsdWVkX2RpY3QoKQorICAgICAgICBzZWxmLmNoZWNrX2l0ZXJzKGRpY3QpCisKKyAgICAgICAgIyBUZXN0IHZhbHVlcmVmcygpCisgICAgICAgIHJlZnMgPSBkaWN0LnZhbHVlcmVmcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlZnMpLCBsZW4ob2JqZWN0cykpCisgICAgICAgIG9iamVjdHMyID0gbGlzdChvYmplY3RzKQorICAgICAgICBmb3Igd3IgaW4gcmVmczoKKyAgICAgICAgICAgIG9iID0gd3IoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYiwgZGljdFtvYi5hcmddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYi5hcmcsIGRpY3Rbb2IuYXJnXS5hcmcpCisgICAgICAgICAgICBvYmplY3RzMi5yZW1vdmUob2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9iamVjdHMyKSwgMCkKKworICAgICAgICAjIFRlc3QgaXRlcnZhbHVlcmVmcygpCisgICAgICAgIG9iamVjdHMyID0gbGlzdChvYmplY3RzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsaXN0KGRpY3QuaXRlcnZhbHVlcmVmcygpKSksIGxlbihvYmplY3RzKSkKKyAgICAgICAgZm9yIHdyIGluIGRpY3QuaXRlcnZhbHVlcmVmcygpOgorICAgICAgICAgICAgb2IgPSB3cigpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLCBkaWN0W29iLmFyZ10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLmFyZywgZGljdFtvYi5hcmddLmFyZykKKyAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2JqZWN0czIpLCAwKQorCisgICAgZGVmIGNoZWNrX2l0ZXJzKHNlbGYsIGRpY3QpOgorICAgICAgICAjIGl0ZW0gaXRlcmF0b3I6CisgICAgICAgIGl0ZW1zID0gZGljdC5pdGVtcygpCisgICAgICAgIGZvciBpdGVtIGluIGRpY3QuaXRlcml0ZW1zKCk6CisgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaXRlbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihpdGVtcykgPT0gMCwgIml0ZXJpdGVtcygpIGRpZCBub3QgdG91Y2ggYWxsIGl0ZW1zIikKKworICAgICAgICAjIGtleSBpdGVyYXRvciwgdmlhIF9faXRlcl9fKCk6CisgICAgICAgIGtleXMgPSBkaWN0LmtleXMoKQorICAgICAgICBmb3IgayBpbiBkaWN0OgorICAgICAgICAgICAga2V5cy5yZW1vdmUoaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihrZXlzKSA9PSAwLCAiX19pdGVyX18oKSBkaWQgbm90IHRvdWNoIGFsbCBrZXlzIikKKworICAgICAgICAjIGtleSBpdGVyYXRvciwgdmlhIGl0ZXJrZXlzKCk6CisgICAgICAgIGtleXMgPSBkaWN0LmtleXMoKQorICAgICAgICBmb3IgayBpbiBkaWN0Lml0ZXJrZXlzKCk6CisgICAgICAgICAgICBrZXlzLnJlbW92ZShrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGtleXMpID09IDAsICJpdGVya2V5cygpIGRpZCBub3QgdG91Y2ggYWxsIGtleXMiKQorCisgICAgICAgICMgdmFsdWUgaXRlcmF0b3I6CisgICAgICAgIHZhbHVlcyA9IGRpY3QudmFsdWVzKCkKKyAgICAgICAgZm9yIHYgaW4gZGljdC5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICB2YWx1ZXMucmVtb3ZlKHYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4odmFsdWVzKSA9PSAwLAorICAgICAgICAgICAgICAgICAgICAgIml0ZXJ2YWx1ZXMoKSBkaWQgbm90IHRvdWNoIGFsbCB2YWx1ZXMiKQorCisgICAgZGVmIHRlc3RfbWFrZV93ZWFrX2tleWVkX2RpY3RfZnJvbV9kaWN0KHNlbGYpOgorICAgICAgICBvID0gT2JqZWN0KDMpCisgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KHtvOjM2NH0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0W29dID09IDM2NCkKKworICAgIGRlZiB0ZXN0X21ha2Vfd2Vha19rZXllZF9kaWN0X2Zyb21fd2Vha19rZXllZF9kaWN0KHNlbGYpOgorICAgICAgICBvID0gT2JqZWN0KDMpCisgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KHtvOjM2NH0pCisgICAgICAgIGRpY3QyID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeShkaWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdFtvXSA9PSAzNjQpCisKKyAgICBkZWYgbWFrZV93ZWFrX2tleWVkX2RpY3Qoc2VsZik6CisgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKyAgICAgICAgb2JqZWN0cyA9IG1hcChPYmplY3QsIHJhbmdlKHNlbGYuQ09VTlQpKQorICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgorICAgICAgICAgICAgZGljdFtvXSA9IG8uYXJnCisgICAgICAgIHJldHVybiBkaWN0LCBvYmplY3RzCisKKyAgICBkZWYgbWFrZV93ZWFrX3ZhbHVlZF9kaWN0KHNlbGYpOgorICAgICAgICBkaWN0ID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKKyAgICAgICAgb2JqZWN0cyA9IG1hcChPYmplY3QsIHJhbmdlKHNlbGYuQ09VTlQpKQorICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgorICAgICAgICAgICAgZGljdFtvLmFyZ10gPSBvCisgICAgICAgIHJldHVybiBkaWN0LCBvYmplY3RzCisKKyAgICBkZWYgY2hlY2tfcG9waXRlbShzZWxmLCBrbGFzcywga2V5MSwgdmFsdWUxLCBrZXkyLCB2YWx1ZTIpOgorICAgICAgICB3ZWFrZGljdCA9IGtsYXNzKCkKKyAgICAgICAgd2Vha2RpY3Rba2V5MV0gPSB2YWx1ZTEKKyAgICAgICAgd2Vha2RpY3Rba2V5Ml0gPSB2YWx1ZTIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3ZWFrZGljdCkgPT0gMikKKyAgICAgICAgaywgdiA9IHdlYWtkaWN0LnBvcGl0ZW0oKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHdlYWtkaWN0KSA9PSAxKQorICAgICAgICBpZiBrIGlzIGtleTE6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB2YWx1ZTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB2YWx1ZTIpCisgICAgICAgIGssIHYgPSB3ZWFrZGljdC5wb3BpdGVtKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3ZWFrZGljdCkgPT0gMCkKKyAgICAgICAgaWYgayBpcyBrZXkxOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgdmFsdWUxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgdmFsdWUyKQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfZGljdF9wb3BpdGVtKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3BvcGl0ZW0od2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImtleTEiLCBDKCksICJrZXkyIiwgQygpKQorCisgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9kaWN0X3BvcGl0ZW0oc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfcG9waXRlbSh3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQygpLCAidmFsdWUgMSIsIEMoKSwgInZhbHVlIDIiKQorCisgICAgZGVmIGNoZWNrX3NldGRlZmF1bHQoc2VsZiwga2xhc3MsIGtleSwgdmFsdWUxLCB2YWx1ZTIpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUxIGlzIG5vdCB2YWx1ZTIsCisgICAgICAgICAgICAgICAgICAgICAiaW52YWxpZCB0ZXN0IgorICAgICAgICAgICAgICAgICAgICAgIiAtLSB2YWx1ZSBwYXJhbWV0ZXJzIG11c3QgYmUgZGlzdGluY3Qgb2JqZWN0cyIpCisgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQorICAgICAgICBvID0gd2Vha2RpY3Quc2V0ZGVmYXVsdChrZXksIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvLCB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCB3ZWFrZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh3ZWFrZGljdC5nZXQoa2V5KSwgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydElzKHdlYWtkaWN0W2tleV0sIHZhbHVlMSkKKworICAgICAgICBvID0gd2Vha2RpY3Quc2V0ZGVmYXVsdChrZXksIHZhbHVlMikKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhvLCB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oa2V5LCB3ZWFrZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyh3ZWFrZGljdC5nZXQoa2V5KSwgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydElzKHdlYWtkaWN0W2tleV0sIHZhbHVlMSkKKworICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RpY3Rfc2V0ZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19zZXRkZWZhdWx0KHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrZXkiLCBDKCksIEMoKSkKKworICAgIGRlZiB0ZXN0X3dlYWtfa2V5ZWRfZGljdF9zZXRkZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3NldGRlZmF1bHQod2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMoKSwgInZhbHVlIDEiLCAidmFsdWUgMiIpCisKKyAgICBkZWYgY2hlY2tfdXBkYXRlKHNlbGYsIGtsYXNzLCBkaWN0KToKKyAgICAgICAgIworICAgICAgICAjICBUaGlzIGV4ZXJjaXNlcyBkLnVwZGF0ZSgpLCBsZW4oZCksIGQua2V5cygpLCBpbiBkLAorICAgICAgICAjICBkLmdldCgpLCBkW10uCisgICAgICAgICMKKyAgICAgICAgd2Vha2RpY3QgPSBrbGFzcygpCisgICAgICAgIHdlYWtkaWN0LnVwZGF0ZShkaWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih3ZWFrZGljdCksIGxlbihkaWN0KSkKKyAgICAgICAgZm9yIGsgaW4gd2Vha2RpY3Qua2V5cygpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrLCBkaWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICJteXN0ZXJpb3VzIG5ldyBrZXkgYXBwZWFyZWQgaW4gd2VhayBkaWN0IikKKyAgICAgICAgICAgIHYgPSBkaWN0LmdldChrKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyh2LCB3ZWFrZGljdFtrXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModiwgd2Vha2RpY3QuZ2V0KGspKQorICAgICAgICBmb3IgayBpbiBkaWN0LmtleXMoKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oaywgd2Vha2RpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIm9yaWdpbmFsIGtleSBkaXNhcHBlYXJlZCBpbiB3ZWFrIGRpY3QiKQorICAgICAgICAgICAgdiA9IGRpY3Rba10KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXModiwgd2Vha2RpY3Rba10pCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHYsIHdlYWtkaWN0LmdldChrKSkKKworICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RpY3RfdXBkYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3VwZGF0ZSh3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsxOiBDKCksICdhJzogQygpLCBDKCk6IEMoKX0pCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2RpY3RfdXBkYXRlKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3VwZGF0ZSh3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICB7QygpOiAxLCBDKCk6IDIsIEMoKTogM30pCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2RlbGl0ZW0oc2VsZik6CisgICAgICAgIGQgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKyAgICAgICAgbzEgPSBPYmplY3QoJzEnKQorICAgICAgICBvMiA9IE9iamVjdCgnMicpCisgICAgICAgIGRbbzFdID0gJ3NvbWV0aGluZycKKyAgICAgICAgZFtvMl0gPSAnc29tZXRoaW5nJworICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDIpCisgICAgICAgIGRlbCBkW28xXQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmtleXMoKSA9PSBbbzJdKQorCisgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfZGVsaXRlbShzZWxmKToKKyAgICAgICAgZCA9IHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSgpCisgICAgICAgIG8xID0gT2JqZWN0KCcxJykKKyAgICAgICAgbzIgPSBPYmplY3QoJzInKQorICAgICAgICBkWydzb21ldGhpbmcnXSA9IG8xCisgICAgICAgIGRbJ3NvbWV0aGluZyBlbHNlJ10gPSBvMgorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDIpCisgICAgICAgIGRlbCBkWydzb21ldGhpbmcnXQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLml0ZW1zKCkgPT0gWygnc29tZXRoaW5nIGVsc2UnLCBvMildKQorCisgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9iYWRfZGVsaXRlbShzZWxmKToKKyAgICAgICAgZCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICBvID0gT2JqZWN0KCcxJykKKyAgICAgICAgIyBBbiBhdHRlbXB0IHRvIGRlbGV0ZSBhbiBvYmplY3QgdGhhdCBpc24ndCB0aGVyZSBzaG91bGQgcmFpc2UKKyAgICAgICAgIyBLZXlFcnJvci4gIEl0IGRpZG4ndCBiZWZvcmUgMi4zLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZC5fX2RlbGl0ZW1fXywgbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQuX19nZXRpdGVtX18sIG8pCisKKyAgICAgICAgIyBJZiBhIGtleSBpc24ndCBvZiBhIHdlYWtseSByZWZlcmVuY2FibGUgdHlwZSwgX19nZXRpdGVtX18gYW5kCisgICAgICAgICMgX19zZXRpdGVtX18gcmFpc2UgVHlwZUVycm9yLiAgX19kZWxpdGVtX18gc2hvdWxkIHRvby4KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLl9fZGVsaXRlbV9fLCAgMTMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5fX2dldGl0ZW1fXywgIDEzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuX19zZXRpdGVtX18sICAxMywgMTMpCisKKyAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2Nhc2NhZGluZ19kZWxldGVzKHNlbGYpOgorICAgICAgICAjIFNGIGJ1ZyA3NDI4NjAuICBGb3Igc29tZSByZWFzb24sIGJlZm9yZSAyLjMgX19kZWxpdGVtX18gaXRlcmF0ZWQKKyAgICAgICAgIyBvdmVyIHRoZSBrZXlzIHZpYSBzZWxmLmRhdGEuaXRlcmtleXMoKS4gIElmIHRoaW5ncyB2YW5pc2hlZCBmcm9tCisgICAgICAgICMgdGhlIGRpY3QgZHVyaW5nIHRoaXMgKG9yIGdvdCBhZGRlZCksIHRoYXQgY2F1c2VkIGEgUnVudGltZUVycm9yLgorCisgICAgICAgIGQgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKyAgICAgICAgbXV0YXRlID0gRmFsc2UKKworICAgICAgICBjbGFzcyBDKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgaSk6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSA9IGkKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaChzZWxmLnZhbHVlKQorICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICAgICAgaWYgbXV0YXRlOgorICAgICAgICAgICAgICAgICAgICAjIFNpZGUgZWZmZWN0IHRoYXQgbXV0YXRlcyB0aGUgZGljdCwgYnkgcmVtb3ZpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICMgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIHRvIGEga2V5LgorICAgICAgICAgICAgICAgICAgICBkZWwgb2Jqc1stMV0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZSA9PSBvdGhlci52YWx1ZQorCisgICAgICAgIG9ianMgPSBbQyhpKSBmb3IgaSBpbiByYW5nZSg0KV0KKyAgICAgICAgZm9yIG8gaW4gb2JqczoKKyAgICAgICAgICAgIGRbb10gPSBvLnZhbHVlCisgICAgICAgIGRlbCBvICAgIyBub3cgdGhlIG9ubHkgc3Ryb25nIHJlZmVyZW5jZXMgdG8ga2V5cyBhcmUgaW4gb2JqcworICAgICAgICAjIEZpbmQgdGhlIG9yZGVyIGluIHdoaWNoIGl0ZXJrZXlzIHNlZXMgdGhlIGtleXMuCisgICAgICAgIG9ianMgPSBkLmtleXMoKQorICAgICAgICAjIFJldmVyc2UgaXQsIHNvIHRoYXQgdGhlIGl0ZXJhdGlvbiBpbXBsZW1lbnRhdGlvbiBvZiBfX2RlbGl0ZW1fXworICAgICAgICAjIGhhcyB0byBrZWVwIGxvb3BpbmcgdG8gZmluZCB0aGUgZmlyc3Qgb2JqZWN0IHdlIGRlbGV0ZS4KKyAgICAgICAgb2Jqcy5yZXZlcnNlKCkKKworICAgICAgICAjIFR1cm4gb24gbXV0YXRpb24gaW4gQy5fX2VxX18uICBUaGUgZmlyc3QgdGltZSB0aHJ1IHRoZSBsb29wLAorICAgICAgICAjIHVuZGVyIHRoZSBpdGVya2V5cygpIGJ1c2luZXNzIHRoZSBmaXJzdCBjb21wYXJpc29uIHdpbGwgZGVsZXRlCisgICAgICAgICMgdGhlIGxhc3QgaXRlbSBpdGVya2V5cygpIHdvdWxkIHNlZSwgYW5kIHRoYXQgY2F1c2VzIGEKKyAgICAgICAgIyAgICAgUnVudGltZUVycm9yOiBkaWN0aW9uYXJ5IGNoYW5nZWQgc2l6ZSBkdXJpbmcgaXRlcmF0aW9uCisgICAgICAgICMgd2hlbiB0aGUgaXRlcmtleXMoKSBsb29wIGdvZXMgYXJvdW5kIHRvIHRyeSBjb21wYXJpbmcgdGhlIG5leHQKKyAgICAgICAgIyBrZXkuICBBZnRlciB0aGlzIHdhcyBmaXhlZCwgaXQganVzdCBkZWxldGVzIHRoZSBsYXN0IG9iamVjdCAqb3VyKgorICAgICAgICAjICJmb3IgbyBpbiBvYmoiIGxvb3Agd291bGQgaGF2ZSBnb3R0ZW4gdG8uCisgICAgICAgIG11dGF0ZSA9IFRydWUKKyAgICAgICAgY291bnQgPSAwCisgICAgICAgIGZvciBvIGluIG9ianM6CisgICAgICAgICAgICBjb3VudCArPSAxCisgICAgICAgICAgICBkZWwgZFtvXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgMikKKworZnJvbSB0ZXN0IGltcG9ydCBtYXBwaW5nX3Rlc3RzCisKK2NsYXNzIFdlYWtWYWx1ZURpY3Rpb25hcnlUZXN0Q2FzZShtYXBwaW5nX3Rlc3RzLkJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CisgICAgIiIiQ2hlY2sgdGhhdCBXZWFrVmFsdWVEaWN0aW9uYXJ5IGNvbmZvcm1zIHRvIHRoZSBtYXBwaW5nIHByb3RvY29sIiIiCisgICAgX19yZWYgPSB7ImtleTEiOk9iamVjdCgxKSwgImtleTIiOk9iamVjdCgyKSwgImtleTMiOk9iamVjdCgzKX0KKyAgICB0eXBlMnRlc3QgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkKKyAgICBkZWYgX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yZWYuY29weSgpCisKK2NsYXNzIFdlYWtLZXlEaWN0aW9uYXJ5VGVzdENhc2UobWFwcGluZ190ZXN0cy5CYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wpOgorICAgICIiIkNoZWNrIHRoYXQgV2Vha0tleURpY3Rpb25hcnkgY29uZm9ybXMgdG8gdGhlIG1hcHBpbmcgcHJvdG9jb2wiIiIKKyAgICBfX3JlZiA9IHtPYmplY3QoImtleTEiKToxLCBPYmplY3QoImtleTIiKToyLCBPYmplY3QoImtleTMiKTozfQorICAgIHR5cGUydGVzdCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkKKyAgICBkZWYgX3JlZmVyZW5jZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19yZWYuY29weSgpCisKK2xpYnJlZnRlc3QgPSAiIiIgRG9jdGVzdCBmb3IgZXhhbXBsZXMgaW4gdGhlIGxpYnJhcnkgcmVmZXJlbmNlOiB3ZWFrcmVmLnJzdAorCis+Pj4gaW1wb3J0IHdlYWtyZWYKKz4+PiBjbGFzcyBEaWN0KGRpY3QpOgorLi4uICAgICBwYXNzCisuLi4KKz4+PiBvYmogPSBEaWN0KHJlZD0xLCBncmVlbj0yLCBibHVlPTMpICAgIyB0aGlzIG9iamVjdCBpcyB3ZWFrIHJlZmVyZW5jYWJsZQorPj4+IHIgPSB3ZWFrcmVmLnJlZihvYmopCis+Pj4gcHJpbnQgcigpIGlzIG9iagorVHJ1ZQorCis+Pj4gaW1wb3J0IHdlYWtyZWYKKz4+PiBjbGFzcyBPYmplY3Q6CisuLi4gICAgIHBhc3MKKy4uLgorPj4+IG8gPSBPYmplY3QoKQorPj4+IHIgPSB3ZWFrcmVmLnJlZihvKQorPj4+IG8yID0gcigpCis+Pj4gbyBpcyBvMgorVHJ1ZQorPj4+IGRlbCBvLCBvMgorPj4+IHByaW50IHIoKQorTm9uZQorCis+Pj4gaW1wb3J0IHdlYWtyZWYKKz4+PiBjbGFzcyBFeHRlbmRlZFJlZih3ZWFrcmVmLnJlZik6CisuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYiwgY2FsbGJhY2s9Tm9uZSwgKiphbm5vdGF0aW9ucyk6CisuLi4gICAgICAgICBzdXBlcihFeHRlbmRlZFJlZiwgc2VsZikuX19pbml0X18ob2IsIGNhbGxiYWNrKQorLi4uICAgICAgICAgc2VsZi5fX2NvdW50ZXIgPSAwCisuLi4gICAgICAgICBmb3IgaywgdiBpbiBhbm5vdGF0aW9ucy5pdGVyaXRlbXMoKToKKy4uLiAgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIGssIHYpCisuLi4gICAgIGRlZiBfX2NhbGxfXyhzZWxmKToKKy4uLiAgICAgICAgICcnJ1JldHVybiBhIHBhaXIgY29udGFpbmluZyB0aGUgcmVmZXJlbnQgYW5kIHRoZSBudW1iZXIgb2YKKy4uLiAgICAgICAgIHRpbWVzIHRoZSByZWZlcmVuY2UgaGFzIGJlZW4gY2FsbGVkLgorLi4uICAgICAgICAgJycnCisuLi4gICAgICAgICBvYiA9IHN1cGVyKEV4dGVuZGVkUmVmLCBzZWxmKS5fX2NhbGxfXygpCisuLi4gICAgICAgICBpZiBvYiBpcyBub3QgTm9uZToKKy4uLiAgICAgICAgICAgICBzZWxmLl9fY291bnRlciArPSAxCisuLi4gICAgICAgICAgICAgb2IgPSAob2IsIHNlbGYuX19jb3VudGVyKQorLi4uICAgICAgICAgcmV0dXJuIG9iCisuLi4KKz4+PiBjbGFzcyBBOiAgICMgbm90IGluIGRvY3MgZnJvbSBoZXJlLCBqdXN0IHRlc3RpbmcgdGhlIEV4dGVuZGVkUmVmCisuLi4gICAgIHBhc3MKKy4uLgorPj4+IGEgPSBBKCkKKz4+PiByID0gRXh0ZW5kZWRSZWYoYSwgZm9vPTEsIGJhcj0iYmF6IikKKz4+PiByLmZvbworMQorPj4+IHIuYmFyCisnYmF6JworPj4+IHIoKVsxXQorMQorPj4+IHIoKVsxXQorMgorPj4+IHIoKVswXSBpcyBhCitUcnVlCisKKworPj4+IGltcG9ydCB3ZWFrcmVmCis+Pj4gX2lkMm9ial9kaWN0ID0gd2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5KCkKKz4+PiBkZWYgcmVtZW1iZXIob2JqKToKKy4uLiAgICAgb2lkID0gaWQob2JqKQorLi4uICAgICBfaWQyb2JqX2RpY3Rbb2lkXSA9IG9iagorLi4uICAgICByZXR1cm4gb2lkCisuLi4KKz4+PiBkZWYgaWQyb2JqKG9pZCk6CisuLi4gICAgIHJldHVybiBfaWQyb2JqX2RpY3Rbb2lkXQorLi4uCis+Pj4gYSA9IEEoKSAgICAgICAgICAgICAjIGZyb20gaGVyZSwganVzdCB0ZXN0aW5nCis+Pj4gYV9pZCA9IHJlbWVtYmVyKGEpCis+Pj4gaWQyb2JqKGFfaWQpIGlzIGEKK1RydWUKKz4+PiBkZWwgYQorPj4+IHRyeToKKy4uLiAgICAgaWQyb2JqKGFfaWQpCisuLi4gZXhjZXB0IEtleUVycm9yOgorLi4uICAgICBwcmludCAnT0snCisuLi4gZWxzZToKKy4uLiAgICAgcHJpbnQgJ1dlYWtWYWx1ZURpY3Rpb25hcnkgZXJyb3InCitPSworCisiIiIKKworX190ZXN0X18gPSB7J2xpYnJlZnRlc3QnIDogbGlicmVmdGVzdH0KKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIFJlZmVyZW5jZXNUZXN0Q2FzZSwKKyAgICAgICAgTWFwcGluZ1Rlc3RDYXNlLAorICAgICAgICBXZWFrVmFsdWVEaWN0aW9uYXJ5VGVzdENhc2UsCisgICAgICAgIFdlYWtLZXlEaWN0aW9uYXJ5VGVzdENhc2UsCisgICAgICAgIFN1YmNsYXNzYWJsZVdlYWtyZWZUZXN0Q2FzZSwKKyAgICAgICAgKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdChzeXMubW9kdWxlc1tfX25hbWVfX10pCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3JlZi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrcmVmLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjY2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3JlZi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3JlZi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrcmVmLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJjY2FmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3JlZi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3NldC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtzZXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllMDkxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dlYWtzZXQucHkKQEAgLTAsMCArMSw0NTAgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKK2Zyb20gd2Vha3JlZiBpbXBvcnQgcHJveHksIHJlZiwgV2Vha1NldAoraW1wb3J0IG9wZXJhdG9yCitpbXBvcnQgY29weQoraW1wb3J0IHN0cmluZworaW1wb3J0IG9zCitmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZHJhbmdlLCBzaHVmZmxlCitpbXBvcnQgc3lzCitpbXBvcnQgd2FybmluZ3MKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IGdjCitpbXBvcnQgY29udGV4dGxpYgorCisKK2NsYXNzIEZvbzoKKyAgICBwYXNzCisKK2NsYXNzIFNvbWVDbGFzcyhvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiB0eXBlKG90aGVyKSAhPSB0eXBlKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBvdGhlci52YWx1ZSA9PSBzZWxmLnZhbHVlCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9fZXFfXyhvdGhlcikKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goKFNvbWVDbGFzcywgc2VsZi52YWx1ZSkpCisKK2NsYXNzIFJlZkN5Y2xlKG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmN5Y2xlID0gc2VsZgorCitjbGFzcyBUZXN0V2Vha1NldCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgbmVlZCB0byBrZWVwIHJlZmVyZW5jZXMgdG8gdGhlbQorICAgICAgICBzZWxmLml0ZW1zID0gW1NvbWVDbGFzcyhjKSBmb3IgYyBpbiAoJ2EnLCAnYicsICdjJyldCisgICAgICAgIHNlbGYuaXRlbXMyID0gW1NvbWVDbGFzcyhjKSBmb3IgYyBpbiAoJ3gnLCAneScsICd6JyldCisgICAgICAgIHNlbGYubGV0dGVycyA9IFtTb21lQ2xhc3MoYykgZm9yIGMgaW4gc3RyaW5nLmFzY2lpX2xldHRlcnNdCisgICAgICAgIHNlbGYuYWJfaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICdhYiddCisgICAgICAgIHNlbGYuYWJjZGVfaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICdhYmNkZSddCisgICAgICAgIHNlbGYuZGVmX2l0ZW1zID0gW1NvbWVDbGFzcyhjKSBmb3IgYyBpbiAnZGVmJ10KKyAgICAgICAgc2VsZi5hYl93ZWFrc2V0ID0gV2Vha1NldChzZWxmLmFiX2l0ZW1zKQorICAgICAgICBzZWxmLmFiY2RlX3dlYWtzZXQgPSBXZWFrU2V0KHNlbGYuYWJjZGVfaXRlbXMpCisgICAgICAgIHNlbGYuZGVmX3dlYWtzZXQgPSBXZWFrU2V0KHNlbGYuZGVmX2l0ZW1zKQorICAgICAgICBzZWxmLnMgPSBXZWFrU2V0KHNlbGYuaXRlbXMpCisgICAgICAgIHNlbGYuZCA9IGRpY3QuZnJvbWtleXMoc2VsZi5pdGVtcykKKyAgICAgICAgc2VsZi5vYmogPSBTb21lQ2xhc3MoJ0YnKQorICAgICAgICBzZWxmLmZzID0gV2Vha1NldChbc2VsZi5vYmpdKQorCisgICAgZGVmIHRlc3RfbWV0aG9kcyhzZWxmKToKKyAgICAgICAgd2Vha3NldG1ldGhvZHMgPSBkaXIoV2Vha1NldCkKKyAgICAgICAgZm9yIG1ldGhvZCBpbiBkaXIoc2V0KToKKyAgICAgICAgICAgIGlmIG1ldGhvZCA9PSAndGVzdF9jX2FwaScgb3IgbWV0aG9kLnN0YXJ0c3dpdGgoJ18nKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtZXRob2QsIHdlYWtzZXRtZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICJXZWFrU2V0IG1pc3NpbmcgbWV0aG9kICIgKyBtZXRob2QpCisKKyAgICBkZWYgdGVzdF9uZXdfb3JfaW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBXZWFrU2V0LCBbXSwgMikKKworICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5zKSwgbGVuKHNlbGYuZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuZnMpLCAxKQorICAgICAgICBkZWwgc2VsZi5vYmoKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5mcyksIDApCisKKyAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIHNlbGYucywgYyBpbiBzZWxmLmQpCisgICAgICAgICMgMSBpcyBub3Qgd2Vha3JlZidhYmxlLCBidXQgdGhhdCBUeXBlRXJyb3IgaXMgY2F1Z2h0IGJ5IF9fY29udGFpbnNfXworICAgICAgICBzZWxmLmFzc2VydE5vdEluKDEsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRJbihzZWxmLm9iaiwgc2VsZi5mcykKKyAgICAgICAgZGVsIHNlbGYub2JqCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oU29tZUNsYXNzKCdGJyksIHNlbGYuZnMpCisKKyAgICBkZWYgdGVzdF91bmlvbihzZWxmKToKKyAgICAgICAgdSA9IHNlbGYucy51bmlvbihzZWxmLml0ZW1zMikKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIHUsIGMgaW4gc2VsZi5kIG9yIGMgaW4gc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBXZWFrU2V0KHNlbGYuaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodSksIFdlYWtTZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnVuaW9uLCBbW11dKQorICAgICAgICBmb3IgQyBpbiBzZXQsIGZyb3plbnNldCwgZGljdC5mcm9ta2V5cywgbGlzdCwgdHVwbGU6CisgICAgICAgICAgICB4ID0gV2Vha1NldChzZWxmLml0ZW1zICsgc2VsZi5pdGVtczIpCisgICAgICAgICAgICBjID0gQyhzZWxmLml0ZW1zMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLnVuaW9uKGMpLCB4KQorICAgICAgICAgICAgZGVsIGMKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odSksIGxlbihzZWxmLml0ZW1zKSArIGxlbihzZWxmLml0ZW1zMikpCisgICAgICAgIHNlbGYuaXRlbXMyLnBvcCgpCisgICAgICAgIGdjLmNvbGxlY3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih1KSwgbGVuKHNlbGYuaXRlbXMpICsgbGVuKHNlbGYuaXRlbXMyKSkKKworICAgIGRlZiB0ZXN0X29yKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLnVuaW9uKHNlbGYuaXRlbXMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyB8IHNldChzZWxmLml0ZW1zMiksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIHwgZnJvemVuc2V0KHNlbGYuaXRlbXMyKSwgaSkKKworICAgIGRlZiB0ZXN0X2ludGVyc2VjdGlvbihzZWxmKToKKyAgICAgICAgcyA9IFdlYWtTZXQoc2VsZi5sZXR0ZXJzKQorICAgICAgICBpID0gcy5pbnRlcnNlY3Rpb24oc2VsZi5pdGVtczIpCisgICAgICAgIGZvciBjIGluIHNlbGYubGV0dGVyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYyBpbiBpLCBjIGluIHNlbGYuaXRlbXMyIGFuZCBjIGluIHNlbGYubGV0dGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBXZWFrU2V0KHNlbGYubGV0dGVycykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShpKSwgV2Vha1NldCkKKyAgICAgICAgZm9yIEMgaW4gc2V0LCBmcm96ZW5zZXQsIGRpY3QuZnJvbWtleXMsIGxpc3QsIHR1cGxlOgorICAgICAgICAgICAgeCA9IFdlYWtTZXQoW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuaW50ZXJzZWN0aW9uKEMoc2VsZi5pdGVtcykpLCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpKSwgbGVuKHNlbGYuaXRlbXMyKSkKKyAgICAgICAgc2VsZi5pdGVtczIucG9wKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGkpLCBsZW4oc2VsZi5pdGVtczIpKQorCisgICAgZGVmIHRlc3RfaXNkaXNqb2ludChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucy5pc2Rpc2pvaW50KFdlYWtTZXQoc2VsZi5pdGVtczIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLnMuaXNkaXNqb2ludChXZWFrU2V0KHNlbGYubGV0dGVycykpKQorCisgICAgZGVmIHRlc3RfYW5kKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLmludGVyc2VjdGlvbihzZWxmLml0ZW1zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgJiBzZXQoc2VsZi5pdGVtczIpLCBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAmIGZyb3plbnNldChzZWxmLml0ZW1zMiksIGkpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLmRpZmZlcmVuY2Uoc2VsZi5pdGVtczIpCisgICAgICAgIGZvciBjIGluIHNlbGYubGV0dGVyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYyBpbiBpLCBjIGluIHNlbGYuZCBhbmQgYyBub3QgaW4gc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBXZWFrU2V0KHNlbGYuaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoaSksIFdlYWtTZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLmRpZmZlcmVuY2UsIFtbXV0pCisKKyAgICBkZWYgdGVzdF9zdWIoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLnMuZGlmZmVyZW5jZShzZWxmLml0ZW1zMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnMgLSBzZXQoc2VsZi5pdGVtczIpLCBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyAtIGZyb3plbnNldChzZWxmLml0ZW1zMiksIGkpCisKKyAgICBkZWYgdGVzdF9zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmKToKKyAgICAgICAgaSA9IHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZShzZWxmLml0ZW1zMikKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5sZXR0ZXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjIGluIGksIChjIGluIHNlbGYuZCkgXiAoYyBpbiBzZWxmLml0ZW1zMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBXZWFrU2V0KHNlbGYuaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoaSksIFdlYWtTZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlLCBbW11dKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpKSwgbGVuKHNlbGYuaXRlbXMpICsgbGVuKHNlbGYuaXRlbXMyKSkKKyAgICAgICAgc2VsZi5pdGVtczIucG9wKCkKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGkpLCBsZW4oc2VsZi5pdGVtcykgKyBsZW4oc2VsZi5pdGVtczIpKQorCisgICAgZGVmIHRlc3RfeG9yKHNlbGYpOgorICAgICAgICBpID0gc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlKHNlbGYuaXRlbXMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucyBeIHNldChzZWxmLml0ZW1zMiksIGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zIF4gZnJvemVuc2V0KHNlbGYuaXRlbXMyKSwgaSkKKworICAgIGRlZiB0ZXN0X3N1Yl9hbmRfc3VwZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmFiX3dlYWtzZXQgPD0gc2VsZi5hYmNkZV93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5hYmNkZV93ZWFrc2V0IDw9IHNlbGYuYWJjZGVfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYWJjZGVfd2Vha3NldCA+PSBzZWxmLmFiX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hYmNkZV93ZWFrc2V0IDw9IHNlbGYuZGVmX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5hYmNkZV93ZWFrc2V0ID49IHNlbGYuZGVmX3dlYWtzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoJ2EnKS5pc3N1YnNldCgnYWJjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoJ2FiYycpLmlzc3VwZXJzZXQoJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXQoJ2EnKS5pc3N1YnNldCgnY2JzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2V0KCdjYnMnKS5pc3N1cGVyc2V0KCdhJykpCisKKyAgICBkZWYgdGVzdF9sdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYWJfd2Vha3NldCA8IHNlbGYuYWJjZGVfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFiY2RlX3dlYWtzZXQgPCBzZWxmLmRlZl93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYWJfd2Vha3NldCA8IHNlbGYuYWJfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShXZWFrU2V0KCkgPCBXZWFrU2V0KCkpCisKKyAgICBkZWYgdGVzdF9ndChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuYWJjZGVfd2Vha3NldCA+IHNlbGYuYWJfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmFiY2RlX3dlYWtzZXQgPiBzZWxmLmRlZl93ZWFrc2V0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuYWJfd2Vha3NldCA+IHNlbGYuYWJfd2Vha3NldCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShXZWFrU2V0KCkgPiBXZWFrU2V0KCkpCisKKyAgICBkZWYgdGVzdF9nYyhzZWxmKToKKyAgICAgICAgIyBDcmVhdGUgYSBuZXN0IG9mIGN5Y2xlcyB0byBleGVyY2lzZSBvdmVyYWxsIHJlZiBjb3VudCBjaGVjaworICAgICAgICBzID0gV2Vha1NldChGb28oKSBmb3IgaSBpbiByYW5nZSgxMDAwKSkKKyAgICAgICAgZm9yIGVsZW0gaW4gczoKKyAgICAgICAgICAgIGVsZW0uY3ljbGUgPSBzCisgICAgICAgICAgICBlbGVtLnN1YiA9IGVsZW0KKyAgICAgICAgICAgIGVsZW0uc2V0ID0gV2Vha1NldChbZWxlbV0pCisKKyAgICBkZWYgdGVzdF9zdWJjbGFzc193aXRoX2N1c3RvbV9oYXNoKHNlbGYpOgorICAgICAgICAjIEJ1ZyAjMTI1NzczMQorICAgICAgICBjbGFzcyBIKFdlYWtTZXQpOgorICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQoaWQoc2VsZikgJiAweDdmZmZmZmZmKQorICAgICAgICBzPUgoKQorICAgICAgICBmPXNldCgpCisgICAgICAgIGYuYWRkKHMpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocywgZikKKyAgICAgICAgZi5yZW1vdmUocykKKyAgICAgICAgZi5hZGQocykKKyAgICAgICAgZi5kaXNjYXJkKHMpCisKKyAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgorICAgICAgICBzID0gV2Vha1NldCgpCisgICAgICAgIHMuX19pbml0X18oc2VsZi5pdGVtcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzZWxmLnMpCisgICAgICAgIHMuX19pbml0X18oc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgV2Vha1NldChzZWxmLml0ZW1zMikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcy5fX2luaXRfXywgcywgMik7CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcy5fX2luaXRfXywgMSk7CisKKyAgICBkZWYgdGVzdF9jb25zdHJ1Y3Rvcl9pZGVudGl0eShzZWxmKToKKyAgICAgICAgcyA9IFdlYWtTZXQoc2VsZi5pdGVtcykKKyAgICAgICAgdCA9IFdlYWtTZXQocykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChzKSwgaWQodCkpCisKKyAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIHNlbGYucykKKworICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnMuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgV2Vha1NldChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYucyksIDApCisKKyAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgorICAgICAgICBkdXAgPSBzZWxmLnMuY29weSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBkdXApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaWQoc2VsZi5zKSwgaWQoZHVwKSkKKworICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKKyAgICAgICAgeCA9IFNvbWVDbGFzcygnUScpCisgICAgICAgIHNlbGYucy5hZGQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih4LCBzZWxmLnMpCisgICAgICAgIGR1cCA9IHNlbGYucy5jb3B5KCkKKyAgICAgICAgc2VsZi5zLmFkZCh4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucywgZHVwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5hZGQsIFtdKQorICAgICAgICBzZWxmLmZzLmFkZChGb28oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLmZzKSA9PSAxKQorICAgICAgICBzZWxmLmZzLmFkZChzZWxmLm9iaikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLmZzKSA9PSAxKQorCisgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgorICAgICAgICB4ID0gU29tZUNsYXNzKCdhJykKKyAgICAgICAgc2VsZi5zLnJlbW92ZSh4KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHgsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHNlbGYucy5yZW1vdmUsIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnJlbW92ZSwgW10pCisKKyAgICBkZWYgdGVzdF9kaXNjYXJkKHNlbGYpOgorICAgICAgICBhLCBxID0gU29tZUNsYXNzKCdhJyksIFNvbWVDbGFzcygnUScpCisgICAgICAgIHNlbGYucy5kaXNjYXJkKGEpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYSwgc2VsZi5zKQorICAgICAgICBzZWxmLnMuZGlzY2FyZChxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5kaXNjYXJkLCBbXSkKKworICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYucykpOgorICAgICAgICAgICAgZWxlbSA9IHNlbGYucy5wb3AoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihlbGVtLCBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnMucG9wKQorCisgICAgZGVmIHRlc3RfdXBkYXRlKHNlbGYpOgorICAgICAgICByZXR2YWwgPSBzZWxmLnMudXBkYXRlKHNlbGYuaXRlbXMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYuaXRlbXMgKyBzZWxmLml0ZW1zMik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMudXBkYXRlLCBbW11dKQorCisgICAgZGVmIHRlc3RfdXBkYXRlX3NldChzZWxmKToKKyAgICAgICAgc2VsZi5zLnVwZGF0ZShzZXQoc2VsZi5pdGVtczIpKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorCisgICAgZGVmIHRlc3RfaW9yKHNlbGYpOgorICAgICAgICBzZWxmLnMgfD0gc2V0KHNlbGYuaXRlbXMyKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorCisgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5zLmludGVyc2VjdGlvbl91cGRhdGUoc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIGlmIGMgaW4gc2VsZi5pdGVtczIgYW5kIGMgaW4gc2VsZi5pdGVtczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLmludGVyc2VjdGlvbl91cGRhdGUsIFtbXV0pCisKKyAgICBkZWYgdGVzdF9pYW5kKHNlbGYpOgorICAgICAgICBzZWxmLnMgJj0gc2V0KHNlbGYuaXRlbXMyKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIGlmIGMgaW4gc2VsZi5pdGVtczIgYW5kIGMgaW4gc2VsZi5pdGVtczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKKyAgICAgICAgcmV0dmFsID0gc2VsZi5zLmRpZmZlcmVuY2VfdXBkYXRlKHNlbGYuaXRlbXMyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYuaXRlbXMgKyBzZWxmLml0ZW1zMik6CisgICAgICAgICAgICBpZiBjIGluIHNlbGYuaXRlbXMgYW5kIGMgbm90IGluIHNlbGYuaXRlbXMyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuZGlmZmVyZW5jZV91cGRhdGUsIFtbXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnN5bW1ldHJpY19kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKKworICAgIGRlZiB0ZXN0X2lzdWIoc2VsZik6CisgICAgICAgIHNlbGYucyAtPSBzZXQoc2VsZi5pdGVtczIpCisgICAgICAgIGZvciBjIGluIChzZWxmLml0ZW1zICsgc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgaWYgYyBpbiBzZWxmLml0ZW1zIGFuZCBjIG5vdCBpbiBzZWxmLml0ZW1zMjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CisgICAgICAgIHJldHZhbCA9IHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5pdGVtczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQorICAgICAgICBmb3IgYyBpbiAoc2VsZi5pdGVtcyArIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgIGlmIChjIGluIHNlbGYuaXRlbXMpIF4gKGMgaW4gc2VsZi5pdGVtczIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oYywgc2VsZi5zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKGMsIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLCBbW11dKQorCisgICAgZGVmIHRlc3RfaXhvcihzZWxmKToKKyAgICAgICAgc2VsZi5zIF49IHNldChzZWxmLml0ZW1zMikKKyAgICAgICAgZm9yIGMgaW4gKHNlbGYuaXRlbXMgKyBzZWxmLml0ZW1zMik6CisgICAgICAgICAgICBpZiAoYyBpbiBzZWxmLml0ZW1zKSBeIChjIGluIHNlbGYuaXRlbXMyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluKGMsIHNlbGYucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihjLCBzZWxmLnMpCisKKyAgICBkZWYgdGVzdF9pbnBsYWNlX29uX3NlbGYoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLnMuY29weSgpCisgICAgICAgIHQgfD0gdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHNlbGYucykKKyAgICAgICAgdCAmPSB0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgc2VsZi5zKQorICAgICAgICB0IC09IHQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBXZWFrU2V0KCkpCisgICAgICAgIHQgPSBzZWxmLnMuY29weSgpCisgICAgICAgIHQgXj0gdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIFdlYWtTZXQoKSkKKworICAgIGRlZiB0ZXN0X2VxKHNlbGYpOgorICAgICAgICAjIGlzc3VlIDU5NjQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucyA9PSBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnMgPT0gV2Vha1NldChzZWxmLml0ZW1zKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnMgPT0gc2V0KHNlbGYuaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucyA9PSBsaXN0KHNlbGYuaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucyA9PSB0dXBsZShzZWxmLml0ZW1zKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnMgPT0gMSkKKworICAgIGRlZiB0ZXN0X3dlYWtfZGVzdHJveV93aGlsZV9pdGVyYXRpbmcoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzcxMDU6IGl0ZXJhdG9ycyBzaG91bGRuJ3QgY3Jhc2ggd2hlbiBhIGtleSBpcyBpbXBsaWNpdGx5IHJlbW92ZWQKKyAgICAgICAgIyBDcmVhdGUgbmV3IGl0ZW1zIHRvIGJlIHN1cmUgbm8tb25lIGVsc2UgaG9sZHMgYSByZWZlcmVuY2UKKyAgICAgICAgaXRlbXMgPSBbU29tZUNsYXNzKGMpIGZvciBjIGluICgnYScsICdiJywgJ2MnKV0KKyAgICAgICAgcyA9IFdlYWtTZXQoaXRlbXMpCisgICAgICAgIGl0ID0gaXRlcihzKQorICAgICAgICBuZXh0KGl0KSAgICAgICAgICAgICAjIFRyaWdnZXIgaW50ZXJuYWwgaXRlcmF0aW9uCisgICAgICAgICMgRGVzdHJveSBhbiBpdGVtCisgICAgICAgIGRlbCBpdGVtc1stMV0KKyAgICAgICAgZ2MuY29sbGVjdCgpICAgICMganVzdCBpbiBjYXNlCisgICAgICAgICMgV2UgaGF2ZSByZW1vdmVkIGVpdGhlciB0aGUgZmlyc3QgY29uc3VtZWQgaXRlbXMsIG9yIGFub3RoZXIgb25lCisgICAgICAgIHNlbGYuYXNzZXJ0SW4obGVuKGxpc3QoaXQpKSwgW2xlbihpdGVtcyksIGxlbihpdGVtcykgLSAxXSkKKyAgICAgICAgZGVsIGl0CisgICAgICAgICMgVGhlIHJlbW92YWwgaGFzIGJlZW4gY29tbWl0dGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMpLCBsZW4oaXRlbXMpKQorCisgICAgZGVmIHRlc3Rfd2Vha19kZXN0cm95X2FuZF9tdXRhdGVfd2hpbGVfaXRlcmF0aW5nKHNlbGYpOgorICAgICAgICAjIElzc3VlICM3MTA1OiBpdGVyYXRvcnMgc2hvdWxkbid0IGNyYXNoIHdoZW4gYSBrZXkgaXMgaW1wbGljaXRseSByZW1vdmVkCisgICAgICAgIGl0ZW1zID0gW1NvbWVDbGFzcyhjKSBmb3IgYyBpbiBzdHJpbmcuYXNjaWlfbGV0dGVyc10KKyAgICAgICAgcyA9IFdlYWtTZXQoaXRlbXMpCisgICAgICAgIEBjb250ZXh0bGliLmNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiB0ZXN0Y29udGV4dCgpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGl0ID0gaXRlcihzKQorICAgICAgICAgICAgICAgIG5leHQoaXQpCisgICAgICAgICAgICAgICAgIyBTY2hlZHVsZSBhbiBpdGVtIGZvciByZW1vdmFsIGFuZCByZWNyZWF0ZSBpdAorICAgICAgICAgICAgICAgIHUgPSBTb21lQ2xhc3Moc3RyKGl0ZW1zLnBvcCgpKSkKKyAgICAgICAgICAgICAgICBnYy5jb2xsZWN0KCkgICAgICAjIGp1c3QgaW4gY2FzZQorICAgICAgICAgICAgICAgIHlpZWxkIHUKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaXQgPSBOb25lICAgICAgICAgICAjIHNob3VsZCBjb21taXQgYWxsIHJlbW92YWxzCisKKyAgICAgICAgd2l0aCB0ZXN0Y29udGV4dCgpIGFzIHU6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUsIHMpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyB1OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHMucmVtb3ZlLCB1KQorICAgICAgICBzZWxmLmFzc2VydE5vdEluKHUsIHMpCisgICAgICAgIHdpdGggdGVzdGNvbnRleHQoKSBhcyB1OgorICAgICAgICAgICAgcy5hZGQodSkKKyAgICAgICAgc2VsZi5hc3NlcnRJbih1LCBzKQorICAgICAgICB0ID0gcy5jb3B5KCkKKyAgICAgICAgd2l0aCB0ZXN0Y29udGV4dCgpIGFzIHU6CisgICAgICAgICAgICBzLnVwZGF0ZSh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgbGVuKHQpKQorICAgICAgICB3aXRoIHRlc3Rjb250ZXh0KCkgYXMgdToKKyAgICAgICAgICAgIHMuY2xlYXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgMCkKKworICAgIGRlZiB0ZXN0X2xlbl9jeWNsZXMoc2VsZik6CisgICAgICAgIE4gPSAyMAorICAgICAgICBpdGVtcyA9IFtSZWZDeWNsZSgpIGZvciBpIGluIHJhbmdlKE4pXQorICAgICAgICBzID0gV2Vha1NldChpdGVtcykKKyAgICAgICAgZGVsIGl0ZW1zCisgICAgICAgIGl0ID0gaXRlcihzKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZ2MuY29sbGVjdCgpCisgICAgICAgIG4xID0gbGVuKHMpCisgICAgICAgIGRlbCBpdAorICAgICAgICBnYy5jb2xsZWN0KCkKKyAgICAgICAgbjIgPSBsZW4ocykKKyAgICAgICAgIyBvbmUgaXRlbSBtYXkgYmUga2VwdCBhbGl2ZSBpbnNpZGUgdGhlIGl0ZXJhdG9yCisgICAgICAgIHNlbGYuYXNzZXJ0SW4objEsICgwLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuMiwgMCkKKworICAgIGRlZiB0ZXN0X2xlbl9yYWNlKHNlbGYpOgorICAgICAgICAjIEV4dGVuZGVkIHNhbml0eSBjaGVja3MgZm9yIGxlbigpIGluIHRoZSBmYWNlIG9mIGN5Y2xpYyBjb2xsZWN0aW9uCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChnYy5zZXRfdGhyZXNob2xkLCAqZ2MuZ2V0X3RocmVzaG9sZCgpKQorICAgICAgICBmb3IgdGggaW4gcmFuZ2UoMSwgMTAwKToKKyAgICAgICAgICAgIE4gPSAyMAorICAgICAgICAgICAgZ2MuY29sbGVjdCgwKQorICAgICAgICAgICAgZ2Muc2V0X3RocmVzaG9sZCh0aCwgdGgsIHRoKQorICAgICAgICAgICAgaXRlbXMgPSBbUmVmQ3ljbGUoKSBmb3IgaSBpbiByYW5nZShOKV0KKyAgICAgICAgICAgIHMgPSBXZWFrU2V0KGl0ZW1zKQorICAgICAgICAgICAgZGVsIGl0ZW1zCisgICAgICAgICAgICAjIEFsbCBpdGVtcyB3aWxsIGJlIGNvbGxlY3RlZCBhdCBuZXh0IGdhcmJhZ2UgY29sbGVjdGlvbiBwYXNzCisgICAgICAgICAgICBpdCA9IGl0ZXIocykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBuZXh0KGl0KQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbjEgPSBsZW4ocykKKyAgICAgICAgICAgIGRlbCBpdAorICAgICAgICAgICAgbjIgPSBsZW4ocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKG4xLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwobjEsIE4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChuMiwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKG4yLCBuMSkKKworCitkZWYgdGVzdF9tYWluKHZlcmJvc2U9Tm9uZSk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0V2Vha1NldCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4odmVyYm9zZT1UcnVlKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3NldC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrc2V0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2IwZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3NldC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3NldC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93ZWFrc2V0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2IwZWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2Vha3NldC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3doaWNoZGIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3ZTMyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3doaWNoZGIucHkKQEAgLTAsMCArMSw2OCBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorIiIiVGVzdCBzY3JpcHQgZm9yIHRoZSB3aGljaGRiIG1vZHVsZQorICAgYmFzZWQgb24gdGVzdF9hbnlkYm0ucHkKKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2hpY2hkYgoraW1wb3J0IGdsb2IKKworX2ZuYW1lID0gdGVzdC50ZXN0X3N1cHBvcnQuVEVTVEZOCisKKyMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKK2FueWRibSA9IHRlc3QudGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ2FueWRibScsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKworZGVmIF9kZWxldGVfZmlsZXMoKToKKyAgICAjIHdlIGRvbid0IGtub3cgdGhlIHByZWNpc2UgbmFtZSB0aGUgdW5kZXJseWluZyBkYXRhYmFzZSB1c2VzCisgICAgIyBzbyB3ZSB1c2UgZ2xvYiB0byBsb2NhdGUgYWxsIG5hbWVzCisgICAgZm9yIGYgaW4gZ2xvYi5nbG9iKF9mbmFtZSArICIqIik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9zLnVubGluayhmKQorICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgV2hpY2hEQlRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIEFjdHVhbCB0ZXN0IG1ldGhvZHMgYXJlIGFkZGVkIHRvIG5hbWVzcGFjZQorICAgICMgYWZ0ZXIgY2xhc3MgZGVmaW5pdGlvbi4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS5fX2luaXRfXyhzZWxmLCAqYXJncykKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgX2RlbGV0ZV9maWxlcygpCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIF9kZWxldGVfZmlsZXMoKQorCitmb3IgbmFtZSBpbiBhbnlkYm0uX25hbWVzOgorICAgICMgd2UgZGVmaW5lIGEgbmV3IHRlc3QgbWV0aG9kIGZvciBlYWNoCisgICAgIyBjYW5kaWRhdGUgZGF0YWJhc2UgbW9kdWxlLgorICAgIHRyeToKKyAgICAgICAgIyBTaWxlbmNlIFB5M2sgd2FybmluZworICAgICAgICBtb2QgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKG5hbWUsIGRlcHJlY2F0ZWQ9VHJ1ZSkKKyAgICBleGNlcHQgdW5pdHRlc3QuU2tpcFRlc3Q6CisgICAgICAgIGNvbnRpbnVlCisKKyAgICBkZWYgdGVzdF93aGljaGRiX25hbWUoc2VsZiwgbmFtZT1uYW1lLCBtb2Q9bW9kKToKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIHdoaWNoZGIgY29ycmVjdGx5IGd1ZXNzZXMgbW9kdWxlIG5hbWUKKyAgICAgICAgIyBmb3IgZGF0YWJhc2VzIG9wZW5lZCB3aXRoIG1vZHVsZSBtb2QuCisgICAgICAgICMgVHJ5IHdpdGggZW1wdHkgZmlsZXMgZmlyc3QKKyAgICAgICAgZiA9IG1vZC5vcGVuKF9mbmFtZSwgJ2MnKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lLCB3aGljaGRiLndoaWNoZGIoX2ZuYW1lKSkKKyAgICAgICAgIyBOb3cgYWRkIGEga2V5CisgICAgICAgIGYgPSBtb2Qub3BlbihfZm5hbWUsICd3JykKKyAgICAgICAgZlsiMSJdID0gIjEiCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWUsIHdoaWNoZGIud2hpY2hkYihfZm5hbWUpKQorICAgIHNldGF0dHIoV2hpY2hEQlRlc3RDYXNlLCJ0ZXN0X3doaWNoZGJfJXMiICUgbmFtZSwgdGVzdF93aGljaGRiX25hbWUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0cnk6CisgICAgICAgIHRlc3QudGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChXaGljaERCVGVzdENhc2UpCisgICAgZmluYWxseToKKyAgICAgICAgX2RlbGV0ZV9maWxlcygpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3doaWNoZGIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0N2IyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3doaWNoZGIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3doaWNoZGIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2hpY2hkYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0N2IyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3doaWNoZGIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnJlZy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnJlZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDVkMDQwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2lucmVnLnB5CkBAIC0wLDAgKzEsNDU5IEBACisjIFRlc3QgdGhlIHdpbmRvd3Mgc3BlY2lmaWMgd2luMzJyZWcgbW9kdWxlLgorIyBPbmx5IHdpbjMycmVnIGZ1bmN0aW9ucyBub3QgaGl0IGhlcmU6IEZsdXNoS2V5LCBMb2FkS2V5IGFuZCBTYXZlS2V5CisKK2ltcG9ydCBvcywgc3lzLCBlcnJubworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordGhyZWFkaW5nID0gdGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoInRocmVhZGluZyIpCitmcm9tIHBsYXRmb3JtIGltcG9ydCBtYWNoaW5lCisKKyMgRG8gdGhpcyBmaXJzdCBzbyB0ZXN0IHdpbGwgYmUgc2tpcHBlZCBpZiBtb2R1bGUgZG9lc24ndCBleGlzdAordGVzdF9zdXBwb3J0LmltcG9ydF9tb2R1bGUoJ193aW5yZWcnKQorIyBOb3cgaW1wb3J0IGV2ZXJ5dGhpbmcKK2Zyb20gX3dpbnJlZyBpbXBvcnQgKgorCit0cnk6CisgICAgUkVNT1RFX05BTUUgPSBzeXMuYXJndltzeXMuYXJndi5pbmRleCgiLS1yZW1vdGUiKSsxXQorZXhjZXB0IChJbmRleEVycm9yLCBWYWx1ZUVycm9yKToKKyAgICBSRU1PVEVfTkFNRSA9IE5vbmUKKworIyB0dXBsZSBvZiAobWFqb3IsIG1pbm9yKQorV0lOX1ZFUiA9IHN5cy5nZXR3aW5kb3dzdmVyc2lvbigpWzoyXQorIyBTb21lIHRlc3RzIHNob3VsZCBvbmx5IHJ1biBvbiA2NC1iaXQgYXJjaGl0ZWN0dXJlcyB3aGVyZSBXT1c2NCB3aWxsIGJlLgorV0lONjRfTUFDSElORSA9IFRydWUgaWYgbWFjaGluZSgpID09ICJBTUQ2NCIgZWxzZSBGYWxzZQorCisjIFN0YXJ0aW5nIHdpdGggV2luZG93cyA3IGFuZCBXaW5kb3dzIFNlcnZlciAyMDA4IFIyLCBXT1c2NCBubyBsb25nZXIgdXNlcworIyByZWdpc3RyeSByZWZsZWN0aW9uIGFuZCBmb3JtZXJseSByZWZsZWN0ZWQga2V5cyBhcmUgc2hhcmVkIGluc3RlYWQuCisjIFdpbmRvd3MgNyBhbmQgV2luZG93cyBTZXJ2ZXIgMjAwOCBSMiBhcmUgdmVyc2lvbiA2LjEuIER1ZSB0byB0aGlzLCBzb21lCisjIHRlc3RzIGFyZSBvbmx5IHZhbGlkIHVwIHVudGlsIDYuMQorSEFTX1JFRkxFQ1RJT04gPSBUcnVlIGlmIFdJTl9WRVIgPCAoNiwgMSkgZWxzZSBGYWxzZQorCisjIFVzZSBhIHBlci1wcm9jZXNzIGtleSB0byBwcmV2ZW50IGNvbmN1cnJlbnQgdGVzdCBydW5zIChidWlsZGJvdCEpIGZyb20KKyMgc3RvbXBpbmcgb24gZWFjaCBvdGhlci4KK3Rlc3Rfa2V5X2Jhc2UgPSAiUHl0aG9uIFRlc3QgS2V5IFslZF0gLSBEZWxldGUgTWUiICUgKG9zLmdldHBpZCgpLCkKK3Rlc3Rfa2V5X25hbWUgPSAiU09GVFdBUkVcXCIgKyB0ZXN0X2tleV9iYXNlCisjIE9uIE9TJ2VzIHRoYXQgc3VwcG9ydCByZWZsZWN0aW9uIHdlIHNob3VsZCB0ZXN0IHdpdGggYSByZWZsZWN0ZWQga2V5Cit0ZXN0X3JlZmxlY3Rfa2V5X25hbWUgPSAiU09GVFdBUkVcXENsYXNzZXNcXCIgKyB0ZXN0X2tleV9iYXNlCisKK3Rlc3RfZGF0YSA9IFsKKyAgICAoIkludCBWYWx1ZSIsICAgICA0NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFR19EV09SRCksCisgICAgKCJTdHJpbmcgVmFsIiwgICAgIkEgc3RyaW5nIHZhbHVlIiwgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1opLAorICAgICgiU3RyaW5nRXhwYW5kIiwgICJUaGUgcGF0aCBpcyAlcGF0aCUiLCAgICAgICAgICAgICAgICAgICAgUkVHX0VYUEFORF9TWiksCisgICAgKCJNdWx0aS1zdHJpbmciLCAgWyJMb3RzIiwgIm9mIiwgInN0cmluZyIsICJ2YWx1ZXMiXSwgICAgICBSRUdfTVVMVElfU1opLAorICAgICgiUmF3IERhdGEiLCAgICAgICgiYmluYXJ5IitjaHIoMCkrImRhdGEiKSwgICAgICAgICAgICAgICAgUkVHX0JJTkFSWSksCisgICAgKCJCaWcgU3RyaW5nIiwgICAgIngiKigyKioxNC0xKSwgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUdfU1opLAorICAgICgiQmlnIEJpbmFyeSIsICAgICJ4IiooMioqMTQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVHX0JJTkFSWSksCitdCisKK2lmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgdGVzdF9kYXRhICs9IFsKKyAgICAgICAgKHVuaWNvZGUoIlVuaWNvZGUgVmFsIiksICB1bmljb2RlKCJBIFVuaWNvZGUgdmFsdWUiKSwgUkVHX1NaLCksCisgICAgICAgICgiVW5pY29kZUV4cGFuZCIsIHVuaWNvZGUoIlRoZSBwYXRoIGlzICVwYXRoJSIpLCBSRUdfRVhQQU5EX1NaKSwKKyAgICAgICAgKCJNdWx0aS11bmljb2RlIiwgW3VuaWNvZGUoIkxvdHMiKSwgdW5pY29kZSgib2YiKSwgdW5pY29kZSgidW5pY29kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pY29kZSgidmFsdWVzIildLCBSRUdfTVVMVElfU1opLAorICAgICAgICAoIk11bHRpLW1peGVkIiwgICBbdW5pY29kZSgiVW5pY29kZSIpLCB1bmljb2RlKCJhbmQiKSwgInN0cmluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsdWVzIl0sIFJFR19NVUxUSV9TWiksCisgICAgXQorCitjbGFzcyBCYXNlV2lucmVnVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSB0ZXN0IGtleSBpcyBhYnNlbnQgd2hlbiB0aGUgdGVzdAorICAgICAgICAjIHN0YXJ0cy4KKyAgICAgICAgc2VsZi5kZWxldGVfdHJlZShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKworICAgIGRlZiBkZWxldGVfdHJlZShzZWxmLCByb290LCBzdWJrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBoa2V5ID0gT3BlbktleShyb290LCBzdWJrZXksIEtFWV9BTExfQUNDRVNTKQorICAgICAgICBleGNlcHQgV2luZG93c0Vycm9yOgorICAgICAgICAgICAgIyBzdWJrZXkgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN1YnN1YmtleSA9IEVudW1LZXkoaGtleSwgMCkKKyAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICAgICAgIyBubyBtb3JlIHN1YmtleXMKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5kZWxldGVfdHJlZShoa2V5LCBzdWJzdWJrZXkpCisgICAgICAgIENsb3NlS2V5KGhrZXkpCisgICAgICAgIERlbGV0ZUtleShyb290LCBzdWJrZXkpCisKKyAgICBkZWYgX3dyaXRlX3Rlc3RfZGF0YShzZWxmLCByb290X2tleSwgQ3JlYXRlS2V5PUNyZWF0ZUtleSk6CisgICAgICAgICMgU2V0IHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGtleS4KKyAgICAgICAgU2V0VmFsdWUocm9vdF9rZXksIHRlc3Rfa2V5X25hbWUsIFJFR19TWiwgIkRlZmF1bHQgdmFsdWUiKQorICAgICAgICBrZXkgPSBDcmVhdGVLZXkocm9vdF9rZXksIHRlc3Rfa2V5X25hbWUpCisgICAgICAgICMgQ3JlYXRlIGEgc3ViLWtleQorICAgICAgICBzdWJfa2V5ID0gQ3JlYXRlS2V5KGtleSwgInN1Yl9rZXkiKQorICAgICAgICAjIEdpdmUgdGhlIHN1Yi1rZXkgc29tZSBuYW1lZCB2YWx1ZXMKKworICAgICAgICBmb3IgdmFsdWVfbmFtZSwgdmFsdWVfZGF0YSwgdmFsdWVfdHlwZSBpbiB0ZXN0X2RhdGE6CisgICAgICAgICAgICBTZXRWYWx1ZUV4KHN1Yl9rZXksIHZhbHVlX25hbWUsIDAsIHZhbHVlX3R5cGUsIHZhbHVlX2RhdGEpCisKKyAgICAgICAgIyBDaGVjayB3ZSB3cm90ZSBhcyBtYW55IGl0ZW1zIGFzIHdlIHRob3VnaHQuCisgICAgICAgIG5rZXlzLCBudmFsdWVzLCBzaW5jZV9tb2QgPSBRdWVyeUluZm9LZXkoa2V5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5rZXlzLCAxLCAiTm90IHRoZSBjb3JyZWN0IG51bWJlciBvZiBzdWIga2V5cyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnZhbHVlcywgMSwgIk5vdCB0aGUgY29ycmVjdCBudW1iZXIgb2YgdmFsdWVzIikKKyAgICAgICAgbmtleXMsIG52YWx1ZXMsIHNpbmNlX21vZCA9IFF1ZXJ5SW5mb0tleShzdWJfa2V5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5rZXlzLCAwLCAiTm90IHRoZSBjb3JyZWN0IG51bWJlciBvZiBzdWIga2V5cyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnZhbHVlcywgbGVuKHRlc3RfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHZhbHVlcyIpCisgICAgICAgICMgQ2xvc2UgdGhpcyBrZXkgdGhpcyB3YXkuLi4KKyAgICAgICAgIyAoYnV0IGJlZm9yZSB3ZSBkbywgY29weSB0aGUga2V5IGFzIGFuIGludGVnZXIgLSB0aGlzIGFsbG93cworICAgICAgICAjIHVzIHRvIHRlc3QgdGhhdCB0aGUga2V5IHJlYWxseSBnZXRzIGNsb3NlZCkuCisgICAgICAgIGludF9zdWJfa2V5ID0gaW50KHN1Yl9rZXkpCisgICAgICAgIENsb3NlS2V5KHN1Yl9rZXkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFF1ZXJ5SW5mb0tleShpbnRfc3ViX2tleSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiSXQgYXBwZWFycyB0aGUgQ2xvc2VLZXkoKSBmdW5jdGlvbiBkb2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAibm90IGNsb3NlIHRoZSBhY3R1YWwga2V5ISIpCisgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIC4uLiBhbmQgY2xvc2UgdGhhdCBrZXkgdGhhdCB3YXkgOi0pCisgICAgICAgIGludF9rZXkgPSBpbnQoa2V5KQorICAgICAgICBrZXkuQ2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBRdWVyeUluZm9LZXkoaW50X2tleSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiSXQgYXBwZWFycyB0aGUga2V5LkNsb3NlKCkgZnVuY3Rpb24gIgorICAgICAgICAgICAgICAgICAgICAgICJkb2VzIG5vdCBjbG9zZSB0aGUgYWN0dWFsIGtleSEiKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfcmVhZF90ZXN0X2RhdGEoc2VsZiwgcm9vdF9rZXksIE9wZW5LZXk9T3BlbktleSk6CisgICAgICAgICMgQ2hlY2sgd2UgY2FuIGdldCBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGtleS4KKyAgICAgICAgdmFsID0gUXVlcnlWYWx1ZShyb290X2tleSwgdGVzdF9rZXlfbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWwsICJEZWZhdWx0IHZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiUmVnaXN0cnkgZGlkbid0IGdpdmUgYmFjayB0aGUgY29ycmVjdCB2YWx1ZSIpCisKKyAgICAgICAga2V5ID0gT3BlbktleShyb290X2tleSwgdGVzdF9rZXlfbmFtZSkKKyAgICAgICAgIyBSZWFkIHRoZSBzdWIta2V5cworICAgICAgICB3aXRoIE9wZW5LZXkoa2V5LCAic3ViX2tleSIpIGFzIHN1Yl9rZXk6CisgICAgICAgICAgICAjIENoZWNrIEkgY2FuIGVudW1lcmF0ZSBvdmVyIHRoZSB2YWx1ZXMuCisgICAgICAgICAgICBpbmRleCA9IDAKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gRW51bVZhbHVlKHN1Yl9rZXksIGluZGV4KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBFbnZpcm9ubWVudEVycm9yOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZGF0YSwgdGVzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZG4ndCByZWFkIGJhY2sgdGhlIGNvcnJlY3QgdGVzdCBkYXRhIikKKyAgICAgICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmRleCwgbGVuKHRlc3RfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaWRuJ3QgcmVhZCB0aGUgY29ycmVjdCBudW1iZXIgb2YgaXRlbXMiKQorICAgICAgICAgICAgIyBDaGVjayBJIGNhbiBkaXJlY3RseSBhY2Nlc3MgZWFjaCBpdGVtCisgICAgICAgICAgICBmb3IgdmFsdWVfbmFtZSwgdmFsdWVfZGF0YSwgdmFsdWVfdHlwZSBpbiB0ZXN0X2RhdGE6CisgICAgICAgICAgICAgICAgcmVhZF92YWwsIHJlYWRfdHlwID0gUXVlcnlWYWx1ZUV4KHN1Yl9rZXksIHZhbHVlX25hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3ZhbCwgdmFsdWVfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZGlyZWN0bHkgcmVhZCB0aGUgdmFsdWUiKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZF90eXAsIHZhbHVlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGRpcmVjdGx5IHJlYWQgdGhlIHZhbHVlIikKKyAgICAgICAgc3ViX2tleS5DbG9zZSgpCisgICAgICAgICMgRW51bWVyYXRlIG91ciBtYWluIGtleS4KKyAgICAgICAgcmVhZF92YWwgPSBFbnVtS2V5KGtleSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWFkX3ZhbCwgInN1Yl9rZXkiLCAiUmVhZCBzdWJrZXkgdmFsdWUgd3JvbmciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBFbnVtS2V5KGtleSwgMSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiV2FzIGFibGUgdG8gZ2V0IGEgc2Vjb25kIGtleSB3aGVuIEkgb25seSBoYXZlIG9uZSEiKQorICAgICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBrZXkuQ2xvc2UoKQorCisgICAgZGVmIF9kZWxldGVfdGVzdF9kYXRhKHNlbGYsIHJvb3Rfa2V5KToKKyAgICAgICAga2V5ID0gT3BlbktleShyb290X2tleSwgdGVzdF9rZXlfbmFtZSwgMCwgS0VZX0FMTF9BQ0NFU1MpCisgICAgICAgIHN1Yl9rZXkgPSBPcGVuS2V5KGtleSwgInN1Yl9rZXkiLCAwLCBLRVlfQUxMX0FDQ0VTUykKKyAgICAgICAgIyBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRlbGV0ZSB0aGUgdmFsdWVzIGJlZm9yZSBkZWxldGluZworICAgICAgICAjIHRoZSBrZXkgKGFsdGhvdWdoIHN1YmtleXMgbXVzdCBub3QgZXhpc3QpLiAgV2UgZGVsZXRlIHRoZW0KKyAgICAgICAgIyBtYW51YWxseSBqdXN0IHRvIHByb3ZlIHdlIGNhbiA6LSkKKyAgICAgICAgZm9yIHZhbHVlX25hbWUsIHZhbHVlX2RhdGEsIHZhbHVlX3R5cGUgaW4gdGVzdF9kYXRhOgorICAgICAgICAgICAgRGVsZXRlVmFsdWUoc3ViX2tleSwgdmFsdWVfbmFtZSkKKworICAgICAgICBua2V5cywgbnZhbHVlcywgc2luY2VfbW9kID0gUXVlcnlJbmZvS2V5KHN1Yl9rZXkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmtleXMsIDAsICJzdWJrZXkgbm90IGVtcHR5IGJlZm9yZSBkZWxldGUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG52YWx1ZXMsIDAsICJzdWJrZXkgbm90IGVtcHR5IGJlZm9yZSBkZWxldGUiKQorICAgICAgICBzdWJfa2V5LkNsb3NlKCkKKyAgICAgICAgRGVsZXRlS2V5KGtleSwgInN1Yl9rZXkiKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgU2hvdWxkbnQgYmUgYWJsZSB0byBkZWxldGUgaXQgdHdpY2UhCisgICAgICAgICAgICBEZWxldGVLZXkoa2V5LCAic3ViX2tleSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkRlbGV0aW5nIHRoZSBrZXkgdHdpY2Ugc3VjY2VlZGVkIikKKyAgICAgICAgZXhjZXB0IEVudmlyb25tZW50RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGtleS5DbG9zZSgpCisgICAgICAgIERlbGV0ZUtleShyb290X2tleSwgdGVzdF9rZXlfbmFtZSkKKyAgICAgICAgIyBPcGVuaW5nIHNob3VsZCBub3cgZmFpbCEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAga2V5ID0gT3BlbktleShyb290X2tleSwgdGVzdF9rZXlfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiQ291bGQgb3BlbiB0aGUgbm9uLWV4aXN0ZW50IGtleSIpCisgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6ICMgVXNlIHRoaXMgZXJyb3IgbmFtZSB0aGlzIHRpbWUKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBfdGVzdF9hbGwoc2VsZiwgcm9vdF9rZXkpOgorICAgICAgICBzZWxmLl93cml0ZV90ZXN0X2RhdGEocm9vdF9rZXkpCisgICAgICAgIHNlbGYuX3JlYWRfdGVzdF9kYXRhKHJvb3Rfa2V5KQorICAgICAgICBzZWxmLl9kZWxldGVfdGVzdF9kYXRhKHJvb3Rfa2V5KQorCitjbGFzcyBMb2NhbFdpbnJlZ1Rlc3RzKEJhc2VXaW5yZWdUZXN0cyk6CisKKyAgICBkZWYgdGVzdF9yZWdpc3RyeV93b3JrcyhzZWxmKToKKyAgICAgICAgc2VsZi5fdGVzdF9hbGwoSEtFWV9DVVJSRU5UX1VTRVIpCisKKyAgICBkZWYgdGVzdF9yZWdpc3RyeV93b3Jrc19leHRlbmRlZF9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgICMgU3Vic3RpdHV0ZSB0aGUgcmVndWxhciBDcmVhdGVLZXkgYW5kIE9wZW5LZXkgY2FsbHMgd2l0aCB0aGVpcgorICAgICAgICAjIGV4dGVuZGVkIGNvdW50ZXJwYXJ0cy4KKyAgICAgICAgIyBOb3RlOiBEZWxldGVLZXlFeCBpcyBub3QgdXNlZCBoZXJlIGJlY2F1c2UgaXQgaXMgcGxhdGZvcm0gZGVwZW5kZW50CisgICAgICAgIGNrZSA9IGxhbWJkYSBrZXksIHN1Yl9rZXk6IENyZWF0ZUtleUV4KGtleSwgc3ViX2tleSwgMCwgS0VZX0FMTF9BQ0NFU1MpCisgICAgICAgIHNlbGYuX3dyaXRlX3Rlc3RfZGF0YShIS0VZX0NVUlJFTlRfVVNFUiwgY2tlKQorCisgICAgICAgIG9rZSA9IGxhbWJkYSBrZXksIHN1Yl9rZXk6IE9wZW5LZXlFeChrZXksIHN1Yl9rZXksIDAsIEtFWV9SRUFEKQorICAgICAgICBzZWxmLl9yZWFkX3Rlc3RfZGF0YShIS0VZX0NVUlJFTlRfVVNFUiwgb2tlKQorCisgICAgICAgIHNlbGYuX2RlbGV0ZV90ZXN0X2RhdGEoSEtFWV9DVVJSRU5UX1VTRVIpCisKKyAgICBkZWYgdGVzdF9jb25uZWN0X3JlZ2lzdHJ5X3RvX2xvY2FsX21hY2hpbmVfd29ya3Moc2VsZik6CisgICAgICAgICMgcGVyZm9ybSBtaW5pbWFsIENvbm5lY3RSZWdpc3RyeSB0ZXN0IHdoaWNoIGp1c3QgaW52b2tlcyBpdAorICAgICAgICBoID0gQ29ubmVjdFJlZ2lzdHJ5KE5vbmUsIEhLRVlfTE9DQUxfTUFDSElORSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChoLmhhbmRsZSwgMCkKKyAgICAgICAgaC5DbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5oYW5kbGUsIDApCisKKyAgICBkZWYgdGVzdF9pbmV4aXN0YW50X3JlbW90ZV9yZWdpc3RyeShzZWxmKToKKyAgICAgICAgY29ubmVjdCA9IGxhbWJkYTogQ29ubmVjdFJlZ2lzdHJ5KCJhYmNkZWZnaGlqa2wiLCBIS0VZX0NVUlJFTlRfVVNFUikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBjb25uZWN0KQorCisgICAgZGVmIHRlc3RfZXhwYW5kX2Vudmlyb25tZW50X3N0cmluZ3Moc2VsZik6CisgICAgICAgIHIgPSBFeHBhbmRFbnZpcm9ubWVudFN0cmluZ3ModSIld2luZGlyJVxcdGVzdCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyKSwgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCBvcy5lbnZpcm9uWyJ3aW5kaXIiXSArICJcXHRlc3QiKQorCisgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyKHNlbGYpOgorICAgICAgICAjIGVuc3VyZSB0aGF0IHRoZSBoYW5kbGUgaXMgY2xvc2VkIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBDb25uZWN0UmVnaXN0cnkoTm9uZSwgSEtFWV9MT0NBTF9NQUNISU5FKSBhcyBoOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoaC5oYW5kbGUsIDApCisgICAgICAgICAgICAgICAgcmFpc2UgV2luZG93c0Vycm9yCisgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguaGFuZGxlLCAwKQorCisgICAgZGVmIHRlc3RfY2hhbmdpbmdfdmFsdWUoc2VsZik6CisgICAgICAgICMgSXNzdWUyODEwOiBBIHJhY2UgY29uZGl0aW9uIGluIDIuNiBhbmQgMy4xIG1heSBjYXVzZQorICAgICAgICAjIEVudW1WYWx1ZSBvciBRdWVyeVZhbHVlIHRvIHJhaXNlICJXaW5kb3dzRXJyb3I6IE1vcmUgZGF0YSBpcworICAgICAgICAjIGF2YWlsYWJsZSIKKyAgICAgICAgZG9uZSA9IEZhbHNlCisKKyAgICAgICAgY2xhc3MgVmVyeUFjdGl2ZVRocmVhZCh0aHJlYWRpbmcuVGhyZWFkKToKKyAgICAgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICAgICAgd2l0aCBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpIGFzIGtleToKKyAgICAgICAgICAgICAgICAgICAgdXNlX3Nob3J0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBsb25nX3N0cmluZyA9ICd4JyoyMDAwCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBkb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICd4JyBpZiB1c2Vfc2hvcnQgZWxzZSBsb25nX3N0cmluZworICAgICAgICAgICAgICAgICAgICAgICAgdXNlX3Nob3J0ID0gbm90IHVzZV9zaG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgU2V0VmFsdWUoa2V5LCAnY2hhbmdpbmdfdmFsdWUnLCBSRUdfU1osIHMpCisKKyAgICAgICAgdGhyZWFkID0gVmVyeUFjdGl2ZVRocmVhZCgpCisgICAgICAgIHRocmVhZC5zdGFydCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQ3JlYXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdF9rZXlfbmFtZSsnXFxjaGFuZ2luZ192YWx1ZScpIGFzIGtleToKKyAgICAgICAgICAgICAgICBmb3IgXyBpbiByYW5nZSgxMDAwKToKKyAgICAgICAgICAgICAgICAgICAgbnVtX3N1YmtleXMsIG51bV92YWx1ZXMsIHQgPSBRdWVyeUluZm9LZXkoa2V5KQorICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShudW1fdmFsdWVzKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBFbnVtVmFsdWUoa2V5LCBpKQorICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlWYWx1ZShrZXksIG5hbWVbMF0pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkb25lID0gVHJ1ZQorICAgICAgICAgICAgdGhyZWFkLmpvaW4oKQorICAgICAgICAgICAgd2l0aCBPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lLCAwLCBLRVlfQUxMX0FDQ0VTUykgYXMga2V5OgorICAgICAgICAgICAgICAgIERlbGV0ZUtleShrZXksICdjaGFuZ2luZ192YWx1ZScpCisgICAgICAgICAgICBEZWxldGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpCisKKyAgICBkZWYgdGVzdF9sb25nX2tleShzZWxmKToKKyAgICAgICAgIyBJc3N1ZTI4MTAsIGluIDIuNiBhbmQgMy4xIHdoZW4gdGhlIGtleSBuYW1lIHdhcyBleGFjdGx5IDI1NgorICAgICAgICAjIGNoYXJhY3RlcnMsIEVudW1LZXkgcmFpc2VkICJXaW5kb3dzRXJyb3I6IE1vcmUgZGF0YSBpcworICAgICAgICAjIGF2YWlsYWJsZSIKKyAgICAgICAgbmFtZSA9ICd4JyoyNTYKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpIGFzIGtleToKKyAgICAgICAgICAgICAgICBTZXRWYWx1ZShrZXksIG5hbWUsIFJFR19TWiwgJ3gnKQorICAgICAgICAgICAgICAgIG51bV9zdWJrZXlzLCBudW1fdmFsdWVzLCB0ID0gUXVlcnlJbmZvS2V5KGtleSkKKyAgICAgICAgICAgICAgICBFbnVtS2V5KGtleSwgMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHdpdGggT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSwgMCwgS0VZX0FMTF9BQ0NFU1MpIGFzIGtleToKKyAgICAgICAgICAgICAgICBEZWxldGVLZXkoa2V5LCBuYW1lKQorICAgICAgICAgICAgRGVsZXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKQorCisgICAgZGVmIHRlc3RfZHluYW1pY19rZXkoc2VsZik6CisgICAgICAgICMgSXNzdWUyODEwLCB3aGVuIHRoZSB2YWx1ZSBpcyBkeW5hbWljYWxseSBnZW5lcmF0ZWQsIHRoZXNlCisgICAgICAgICMgcmFpc2UgIldpbmRvd3NFcnJvcjogTW9yZSBkYXRhIGlzIGF2YWlsYWJsZSIgaW4gMi42IGFuZCAzLjEKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgRW51bVZhbHVlKEhLRVlfUEVSRk9STUFOQ0VfREFUQSwgMCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3IgYXMgZToKKyAgICAgICAgICAgIGlmIGUuZXJybm8gaW4gKGVycm5vLkVQRVJNLCBlcnJuby5FQUNDRVMpOgorICAgICAgICAgICAgICAgIHNlbGYuc2tpcFRlc3QoImFjY2VzcyBkZW5pZWQgdG8gcmVnaXN0cnkga2V5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoYXJlIHlvdSBydW5uaW5nIGluIGEgbm9uLWludGVyYWN0aXZlIHNlc3Npb24/KSIpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBRdWVyeVZhbHVlRXgoSEtFWV9QRVJGT1JNQU5DRV9EQVRBLCBOb25lKQorCisgICAgIyBSZWZsZWN0aW9uIHJlcXVpcmVzIFhQIHg2NC9WaXN0YSBhdCBhIG1pbmltdW0uIFhQIGRvZXNuJ3QgaGF2ZSB0aGlzIHN0dWZmCisgICAgIyBvciBEZWxldGVLZXlFeCBzbyBtYWtlIHN1cmUgdGhlaXIgdXNlIHJhaXNlcyBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoV0lOX1ZFUiA8ICg1LCAyKSwgIlJlcXVpcmVzIFdpbmRvd3MgWFAiKQorICAgIGRlZiB0ZXN0X3JlZmxlY3Rpb25fdW5zdXBwb3J0ZWQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggQ3JlYXRlS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X2tleV9uYW1lKSBhcyBjazoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNrLmhhbmRsZSwgMCkKKworICAgICAgICAgICAga2V5ID0gT3BlbktleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoa2V5LmhhbmRsZSwgMCkKKworICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yKToKKyAgICAgICAgICAgICAgICBEaXNhYmxlUmVmbGVjdGlvbktleShrZXkpCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgIEVuYWJsZVJlZmxlY3Rpb25LZXkoa2V5KQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yKToKKyAgICAgICAgICAgICAgICBRdWVyeVJlZmxlY3Rpb25LZXkoa2V5KQorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yKToKKyAgICAgICAgICAgICAgICBEZWxldGVLZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIERlbGV0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKworICAgIGRlZiB0ZXN0X3NldHZhbHVlZXhfdmFsdWVfcmFuZ2Uoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgSXNzdWUgIzE0NDIwLCBhY2NlcHQgcHJvcGVyIHJhbmdlcyBmb3IgU2V0VmFsdWVFeC4KKyAgICAgICAgIyBQeTJSZWcsIHdoaWNoIGdldHMgY2FsbGVkIGJ5IFNldFZhbHVlRXgsIHdhcyB1c2luZyBQeUxvbmdfQXNMb25nLAorICAgICAgICAjIHRodXMgcmFpc2luZyBPdmVyZmxvd0Vycm9yLiBUaGUgaW1wbGVtZW50YXRpb24gbm93IHVzZXMKKyAgICAgICAgIyBQeUxvbmdfQXNVbnNpZ25lZExvbmcgdG8gbWF0Y2ggRFdPUkQncyBzaXplLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIENyZWF0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkgYXMgY2s6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChjay5oYW5kbGUsIDApCisgICAgICAgICAgICAgICAgU2V0VmFsdWVFeChjaywgInRlc3RfbmFtZSIsIE5vbmUsIFJFR19EV09SRCwgMHg4MDAwMDAwMCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIERlbGV0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKworICAgIGRlZiB0ZXN0X3F1ZXJ5dmFsdWVleF9yZXR1cm5fdmFsdWUoc2VsZik6CisgICAgICAgICMgVGVzdCBmb3IgSXNzdWUgIzE2NzU5LCByZXR1cm4gdW5zaWduZWQgaW50IGZyb20gUXVlcnlWYWx1ZUV4LgorICAgICAgICAjIFJlZzJQeSwgd2hpY2ggZ2V0cyBjYWxsZWQgYnkgUXVlcnlWYWx1ZUV4LCB3YXMgcmV0dXJuaW5nIGEgdmFsdWUKKyAgICAgICAgIyBnZW5lcmF0ZWQgYnkgUHlMb25nX0Zyb21Mb25nLiBUaGUgaW1wbG1lbnRhdGlvbiBub3cgdXNlcworICAgICAgICAjIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nIHRvIG1hdGNoIERXT1JEJ3Mgc2l6ZS4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBDcmVhdGVLZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3Rfa2V5X25hbWUpIGFzIGNrOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoY2suaGFuZGxlLCAwKQorICAgICAgICAgICAgICAgIHRlc3RfdmFsID0gMHg4MDAwMDAwMAorICAgICAgICAgICAgICAgIFNldFZhbHVlRXgoY2ssICJ0ZXN0X25hbWUiLCBOb25lLCBSRUdfRFdPUkQsIHRlc3RfdmFsKQorICAgICAgICAgICAgICAgIHJldF92YWwsIHJldF90eXBlID0gUXVlcnlWYWx1ZUV4KGNrLCAidGVzdF9uYW1lIikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldF90eXBlLCBSRUdfRFdPUkQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXRfdmFsLCB0ZXN0X3ZhbCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIERlbGV0ZUtleShIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9rZXlfbmFtZSkKKworCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKFJFTU9URV9OQU1FLCAiU2tpcHBpbmcgcmVtb3RlIHJlZ2lzdHJ5IHRlc3RzIikKK2NsYXNzIFJlbW90ZVdpbnJlZ1Rlc3RzKEJhc2VXaW5yZWdUZXN0cyk6CisKKyAgICBkZWYgdGVzdF9yZW1vdGVfcmVnaXN0cnlfd29ya3Moc2VsZik6CisgICAgICAgIHJlbW90ZV9rZXkgPSBDb25uZWN0UmVnaXN0cnkoUkVNT1RFX05BTUUsIEhLRVlfQ1VSUkVOVF9VU0VSKQorICAgICAgICBzZWxmLl90ZXN0X2FsbChyZW1vdGVfa2V5KQorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKFdJTjY0X01BQ0hJTkUsICJ4NjQgc3BlY2lmaWMgcmVnaXN0cnkgdGVzdHMiKQorY2xhc3MgV2luNjRXaW5yZWdUZXN0cyhCYXNlV2lucmVnVGVzdHMpOgorCisgICAgZGVmIHRlc3RfcmVmbGVjdGlvbl9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgICMgVGVzdCB0aGF0IHdlIGNhbiBjYWxsIHRoZSBxdWVyeSwgZW5hYmxlLCBhbmQgZGlzYWJsZSBmdW5jdGlvbnMKKyAgICAgICAgIyBvbiBhIGtleSB3aGljaCBpc24ndCBvbiB0aGUgcmVmbGVjdGlvbiBsaXN0IHdpdGggbm8gY29uc2VxdWVuY2VzLgorICAgICAgICB3aXRoIE9wZW5LZXkoSEtFWV9MT0NBTF9NQUNISU5FLCAiU29mdHdhcmUiKSBhcyBrZXk6CisgICAgICAgICAgICAjIEhLTE1cU29mdHdhcmUgaXMgcmVkaXJlY3RlZCBidXQgbm90IHJlZmxlY3RlZCBpbiBhbGwgT1NlcworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFF1ZXJ5UmVmbGVjdGlvbktleShrZXkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBFbmFibGVSZWZsZWN0aW9uS2V5KGtleSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIERpc2FibGVSZWZsZWN0aW9uS2V5KGtleSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoUXVlcnlSZWZsZWN0aW9uS2V5KGtleSkpCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUkVGTEVDVElPTiwgIk9TIGRvZXNuJ3Qgc3VwcG9ydCByZWZsZWN0aW9uIikKKyAgICBkZWYgdGVzdF9yZWZsZWN0aW9uKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCB3ZSBjYW4gY3JlYXRlLCBvcGVuLCBhbmQgZGVsZXRlIGtleXMgaW4gdGhlIDMyLWJpdAorICAgICAgICAjIGFyZWEuIEJlY2F1c2Ugd2UgYXJlIGRvaW5nIHRoaXMgaW4gYSBrZXkgd2hpY2ggZ2V0cyByZWZsZWN0ZWQsCisgICAgICAgICMgdGVzdCB0aGUgZGlmZmVyZW5jZXMgb2YgMzIgYW5kIDY0LWJpdCBrZXlzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlCisgICAgICAgICMgcmVmbGVjdGlvbiBvY2N1cnMgKGllLiB3aGVuIHRoZSBjcmVhdGVkIGtleSBpcyBjbG9zZWQpLgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIENyZWF0ZUtleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X3JlZmxlY3Rfa2V5X25hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9BTExfQUNDRVNTIHwgS0VZX1dPVzY0XzMyS0VZKSBhcyBjcmVhdGVkX2tleToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGNyZWF0ZWRfa2V5LmhhbmRsZSwgMCkKKworICAgICAgICAgICAgICAgICMgVGhlIGtleSBzaG91bGQgbm93IGJlIGF2YWlsYWJsZSBpbiB0aGUgMzItYml0IGFyZWEKKyAgICAgICAgICAgICAgICB3aXRoIE9wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX0FMTF9BQ0NFU1MgfCBLRVlfV09XNjRfMzJLRVkpIGFzIGtleToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChrZXkuaGFuZGxlLCAwKQorCisgICAgICAgICAgICAgICAgIyBXcml0ZSBhIHZhbHVlIHRvIHdoYXQgY3VycmVudGx5IGlzIG9ubHkgaW4gdGhlIDMyLWJpdCBhcmVhCisgICAgICAgICAgICAgICAgU2V0VmFsdWVFeChjcmVhdGVkX2tleSwgIiIsIDAsIFJFR19TWiwgIjMyS0VZIikKKworICAgICAgICAgICAgICAgICMgVGhlIGtleSBpcyBub3QgcmVmbGVjdGVkIHVudGlsIGNyZWF0ZWRfa2V5IGlzIGNsb3NlZC4KKyAgICAgICAgICAgICAgICAjIFRoZSA2NC1iaXQgdmVyc2lvbiBvZiB0aGUga2V5IHNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHlldC4KKyAgICAgICAgICAgICAgICBvcGVuX2ZhaWwgPSBsYW1iZGE6IE9wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX1JFQUQgfCBLRVlfV09XNjRfNjRLRVkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoV2luZG93c0Vycm9yLCBvcGVuX2ZhaWwpCisKKyAgICAgICAgICAgICMgTm93IGV4cGxpY2l0bHkgb3BlbiB0aGUgNjQtYml0IHZlcnNpb24gb2YgdGhlIGtleQorICAgICAgICAgICAgd2l0aCBPcGVuS2V5KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X3JlZmxlY3Rfa2V5X25hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgS0VZX0FMTF9BQ0NFU1MgfCBLRVlfV09XNjRfNjRLRVkpIGFzIGtleToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGtleS5oYW5kbGUsIDApCisgICAgICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIG9yaWdpbmFsIHZhbHVlIHdlIHNldCBpcyB0aGVyZQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjMyS0VZIiwgUXVlcnlWYWx1ZShrZXksICIiKSkKKyAgICAgICAgICAgICAgICAjIFNldCBhIG5ldyB2YWx1ZSwgd2hpY2ggd2lsbCBnZXQgcmVmbGVjdGVkIHRvIDMyLWJpdAorICAgICAgICAgICAgICAgIFNldFZhbHVlRXgoa2V5LCAiIiwgMCwgUkVHX1NaLCAiNjRLRVkiKQorCisgICAgICAgICAgICAjIFJlZmxlY3Rpb24gdXNlcyBhICJsYXN0LXdyaXRlciB3aW5zIHBvbGljeSwgc28gdGhlIHZhbHVlIHdlIHNldAorICAgICAgICAgICAgIyBvbiB0aGUgNjQtYml0IGtleSBzaG91bGQgYmUgdGhlIHNhbWUgb24gMzItYml0CisgICAgICAgICAgICB3aXRoIE9wZW5LZXkoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUkVBRCB8IEtFWV9XT1c2NF8zMktFWSkgYXMga2V5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjY0S0VZIiwgUXVlcnlWYWx1ZShrZXksICIiKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIERlbGV0ZUtleUV4KEhLRVlfQ1VSUkVOVF9VU0VSLCB0ZXN0X3JlZmxlY3Rfa2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlfV09XNjRfMzJLRVksIDApCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhIQVNfUkVGTEVDVElPTiwgIk9TIGRvZXNuJ3Qgc3VwcG9ydCByZWZsZWN0aW9uIikKKyAgICBkZWYgdGVzdF9kaXNhYmxlX3JlZmxlY3Rpb24oc2VsZik6CisgICAgICAgICMgTWFrZSB1c2Ugb2YgYSBrZXkgd2hpY2ggZ2V0cyByZWRpcmVjdGVkIGFuZCByZWZsZWN0ZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBDcmVhdGVLZXlFeChIS0VZX0NVUlJFTlRfVVNFUiwgdGVzdF9yZWZsZWN0X2tleV9uYW1lLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfQUxMX0FDQ0VTUyB8IEtFWV9XT1c2NF8zMktFWSkgYXMgY3JlYXRlZF9rZXk6CisgICAgICAgICAgICAgICAgIyBRdWVyeVJlZmxlY3Rpb25LZXkgcmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUga2V5IGlzIGRpc2FibGVkCisgICAgICAgICAgICAgICAgZGlzYWJsZWQgPSBRdWVyeVJlZmxlY3Rpb25LZXkoY3JlYXRlZF9rZXkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKGRpc2FibGVkKSwgYm9vbCkKKyAgICAgICAgICAgICAgICAjIEhLQ1VcU29mdHdhcmVcQ2xhc3NlcyBpcyByZWZsZWN0ZWQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZGlzYWJsZWQpCisKKyAgICAgICAgICAgICAgICBEaXNhYmxlUmVmbGVjdGlvbktleShjcmVhdGVkX2tleSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoUXVlcnlSZWZsZWN0aW9uS2V5KGNyZWF0ZWRfa2V5KSkKKworICAgICAgICAgICAgIyBUaGUga2V5IGlzIG5vdyBjbG9zZWQgYW5kIHdvdWxkIG5vcm1hbGx5IGJlIHJlZmxlY3RlZCB0byB0aGUKKyAgICAgICAgICAgICMgNjQtYml0IGFyZWEsIGJ1dCBsZXQncyBtYWtlIHN1cmUgdGhhdCBkaWRuJ3QgaGFwcGVuLgorICAgICAgICAgICAgb3Blbl9mYWlsID0gbGFtYmRhOiBPcGVuS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3JlZmxlY3Rfa2V5X25hbWUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRVlfUkVBRCB8IEtFWV9XT1c2NF82NEtFWSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvciwgb3Blbl9mYWlsKQorCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgMzItYml0IGtleSBpcyBhY3R1YWxseSB0aGVyZQorICAgICAgICAgICAgd2l0aCBPcGVuS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9SRUFEIHwgS0VZX1dPVzY0XzMyS0VZKSBhcyBrZXk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChrZXkuaGFuZGxlLCAwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgRGVsZXRlS2V5RXgoSEtFWV9DVVJSRU5UX1VTRVIsIHRlc3RfcmVmbGVjdF9rZXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9XT1c2NF8zMktFWSwgMCkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbl9udW1iZXJzKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFdpbmRvd3NFcnJvcikgYXMgY3R4OgorICAgICAgICAgICAgUXVlcnlWYWx1ZShIS0VZX0NMQVNTRVNfUk9PVCwgJ3NvbWVfdmFsdWVfdGhhdF9kb2VzX25vdF9leGlzdCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjdHguZXhjZXB0aW9uLmVycm5vLCAyKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChMb2NhbFdpbnJlZ1Rlc3RzLCBSZW1vdGVXaW5yZWdUZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpbjY0V2lucmVnVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgbm90IFJFTU9URV9OQU1FOgorICAgICAgICBwcmludCAiUmVtb3RlIHJlZ2lzdHJ5IGNhbGxzIGNhbiBiZSB0ZXN0ZWQgdXNpbmciLAorICAgICAgICBwcmludCAiJ3Rlc3Rfd2lucmVnLnB5IC0tcmVtb3RlIFxcXFxtYWNoaW5lX25hbWUnIgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5yZWcucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2lucmVnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJhYzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2lucmVnLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5yZWcucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2lucmVnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJhYzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2lucmVnLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpbnNvdW5kLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGVjZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weQpAQCAtMCwwICsxLDI1NiBAQAorIyBSaWRpY3Vsb3VzbHkgc2ltcGxlIHRlc3Qgb2YgdGhlIHdpbnNvdW5kIG1vZHVsZSBmb3IgV2luZG93cy4KKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAordGVzdF9zdXBwb3J0LnJlcXVpcmVzKCdhdWRpbycpCitpbXBvcnQgdGltZQoraW1wb3J0IG9zCitpbXBvcnQgc3VicHJvY2VzcworCit3aW5zb3VuZCA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd3aW5zb3VuZCcpCitjdHlwZXMgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgnY3R5cGVzJykKK2ltcG9ydCBfd2lucmVnCisKK2RlZiBoYXNfc291bmQoc291bmQpOgorICAgICIiIkZpbmQgb3V0IGlmIGEgcGFydGljdWxhciBldmVudCBpcyBjb25maWd1cmVkIHdpdGggYSBkZWZhdWx0IHNvdW5kIiIiCisgICAgdHJ5OgorICAgICAgICAjIEFzayB0aGUgbWl4ZXIgQVBJIGZvciB0aGUgbnVtYmVyIG9mIGRldmljZXMgaXQga25vd3MgYWJvdXQuCisgICAgICAgICMgV2hlbiB0aGVyZSBhcmUgbm8gZGV2aWNlcywgUGxheVNvdW5kIHdpbGwgZmFpbC4KKyAgICAgICAgaWYgY3R5cGVzLndpbmRsbC53aW5tbS5taXhlckdldE51bURldnMoKSBpcyAwOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAga2V5ID0gX3dpbnJlZy5PcGVuS2V5RXgoX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKKyAgICAgICAgICAgICAgICAiQXBwRXZlbnRzXFNjaGVtZXNcQXBwc1wuRGVmYXVsdFx7MH1cLkRlZmF1bHQiLmZvcm1hdChzb3VuZCkpCisgICAgICAgIHZhbHVlID0gX3dpbnJlZy5FbnVtVmFsdWUoa2V5LCAwKVsxXQorICAgICAgICBpZiB2YWx1ZSBpcyBub3QgdSIiOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgIHJldHVybiBGYWxzZQorCitjbGFzcyBCZWVwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBBcyB3aXRoIFBsYXlTb3VuZFRlc3QsIGluY29ycG9yYXRlIHRoZSBfaGF2ZV9zb3VuZGNhcmQoKSBjaGVjaworICAgICMgaW50byBvdXIgdGVzdCBtZXRob2RzLiAgSWYgdGhlcmUncyBubyBhdWRpbyBkZXZpY2UgcHJlc2VudCwKKyAgICAjIHdpbnNvdW5kLkJlZXAgcmV0dXJucyAwIGFuZCBHZXRMYXN0RXJyb3IoKSByZXR1cm5zIDEyNywgd2hpY2gKKyAgICAjIGlzOiBFUlJPUl9QUk9DX05PVF9GT1VORCAoIlRoZSBzcGVjaWZpZWQgcHJvY2VkdXJlIGNvdWxkIG5vdAorICAgICMgYmUgZm91bmQiKS4gIChGV0lXLCB2aXJ0dWFsL0h5cGVyLVYgc3lzdGVtcyBmYWxsIHVuZGVyIHRoaXMKKyAgICAjIHNjZW5hcmlvIGFzIHRoZXkgaGF2ZSBubyBzb3VuZCBkZXZpY2VzIHdoYXRzb2V2ZXIgIChub3QgZXZlbgorICAgICMgYSBsZWdhY3kgQmVlcCBkZXZpY2UpLikKKworICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aW5zb3VuZC5CZWVwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB3aW5zb3VuZC5CZWVwLCAzNiwgNzUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHdpbnNvdW5kLkJlZXAsIDMyNzY4LCA3NSkKKworICAgIGRlZiB0ZXN0X2V4dHJlbWVzKHNlbGYpOgorICAgICAgICBzZWxmLl9iZWVwKDM3LCA3NSkKKyAgICAgICAgc2VsZi5fYmVlcCgzMjc2NywgNzUpCisKKyAgICBkZWYgdGVzdF9pbmNyZWFzaW5nZnJlcXVlbmN5KHNlbGYpOgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwLCAyMDAwLCAxMDApOgorICAgICAgICAgICAgc2VsZi5fYmVlcChpLCA3NSkKKworICAgIGRlZiBfYmVlcChzZWxmLCAqYXJncyk6CisgICAgICAgICMgdGhlc2UgdGVzdHMgdXNlZCB0byB1c2UgX2hhdmVfc291bmRjYXJkKCksIGJ1dCBpdCdzIHF1aXRlCisgICAgICAgICMgcG9zc2libGUgdG8gaGF2ZSBhIHNvdW5kY2FyZCwgYW5kIHlldCBoYXZlIHRoZSBiZWVwIGRyaXZlcgorICAgICAgICAjIGRpc2FibGVkLiBTbyBiYXNpY2FsbHksIHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlcgorICAgICAgICAjIGEgYmVlcCBzaG91bGQgYmUgcHJvZHVjZWQgb3Igbm90LCBzbyBjdXJyZW50bHkgaWYgdGhlc2UKKyAgICAgICAgIyB0ZXN0cyBmYWlsIHdlJ3JlIGlnbm9yaW5nIHRoZW0KKyAgICAgICAgIworICAgICAgICAjIFhYWCB0aGUgcmlnaHQgZml4IGZvciB0aGlzIGlzIHRvIGRlZmluZSBzb21ldGhpbmcgbGlrZQorICAgICAgICAjIF9oYXZlX2VuYWJsZWRfYmVlcF9kcml2ZXIoKSBhbmQgdXNlIHRoYXQgaW5zdGVhZCBvZiB0aGUKKyAgICAgICAgIyB0cnkvZXhjZXB0IGJlbG93CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpbnNvdW5kLkJlZXAoKmFyZ3MpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKK2NsYXNzIE1lc3NhZ2VCZWVwVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHRpbWUuc2xlZXAoMC41KQorCisgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aW5zb3VuZC5NZXNzYWdlQmVlcCwgImJhZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2luc291bmQuTWVzc2FnZUJlZXAsIDQyLCA0MikKKyAgICAgICAgd2luc291bmQuTWVzc2FnZUJlZXAoKQorCisgICAgZGVmIHRlc3Rfb2soc2VsZik6CisgICAgICAgIHdpbnNvdW5kLk1lc3NhZ2VCZWVwKHdpbnNvdW5kLk1CX09LKQorCisgICAgZGVmIHRlc3RfYXN0ZXJpc2soc2VsZik6CisgICAgICAgIHdpbnNvdW5kLk1lc3NhZ2VCZWVwKHdpbnNvdW5kLk1CX0lDT05BU1RFUklTSykKKworICAgIGRlZiB0ZXN0X2V4Y2xhbWF0aW9uKHNlbGYpOgorICAgICAgICB3aW5zb3VuZC5NZXNzYWdlQmVlcCh3aW5zb3VuZC5NQl9JQ09ORVhDTEFNQVRJT04pCisKKyAgICBkZWYgdGVzdF9oYW5kKHNlbGYpOgorICAgICAgICB3aW5zb3VuZC5NZXNzYWdlQmVlcCh3aW5zb3VuZC5NQl9JQ09OSEFORCkKKworICAgIGRlZiB0ZXN0X3F1ZXN0aW9uKHNlbGYpOgorICAgICAgICB3aW5zb3VuZC5NZXNzYWdlQmVlcCh3aW5zb3VuZC5NQl9JQ09OUVVFU1RJT04pCisKKworY2xhc3MgUGxheVNvdW5kVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9lcnJvcnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2luc291bmQuUGxheVNvdW5kKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpbnNvdW5kLlBsYXlTb3VuZCwgImJhZCIsICJiYWQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICJub25lIiwgd2luc291bmQuU05EX0FTWU5DIHwgd2luc291bmQuU05EX01FTU9SWQorICAgICAgICApCisKKyAgICBAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNfc291bmQoIlN5c3RlbUFzdGVyaXNrIiksICJObyBkZWZhdWx0IFN5c3RlbUFzdGVyaXNrIikKKyAgICBkZWYgdGVzdF9hbGlhc19hc3RlcmlzayhzZWxmKToKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUFzdGVyaXNrJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtQXN0ZXJpc2snLCB3aW5zb3VuZC5TTkRfQUxJQVMKKyAgICAgICAgICAgICkKKworICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKGhhc19zb3VuZCgiU3lzdGVtRXhjbGFtYXRpb24iKSwgIk5vIGRlZmF1bHQgU3lzdGVtRXhjbGFtYXRpb24iKQorICAgIGRlZiB0ZXN0X2FsaWFzX2V4Y2xhbWF0aW9uKHNlbGYpOgorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtRXhjbGFtYXRpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1FeGNsYW1hdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzX3NvdW5kKCJTeXN0ZW1FeGl0IiksICJObyBkZWZhdWx0IFN5c3RlbUV4aXQiKQorICAgIGRlZiB0ZXN0X2FsaWFzX2V4aXQoc2VsZik6CisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1FeGl0Jywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtRXhpdCcsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzX3NvdW5kKCJTeXN0ZW1IYW5kIiksICJObyBkZWZhdWx0IFN5c3RlbUhhbmQiKQorICAgIGRlZiB0ZXN0X2FsaWFzX2hhbmQoc2VsZik6CisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1IYW5kJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtSGFuZCcsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQorCisgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzX3NvdW5kKCJTeXN0ZW1RdWVzdGlvbiIpLCAiTm8gZGVmYXVsdCBTeXN0ZW1RdWVzdGlvbiIpCisgICAgZGVmIHRlc3RfYWxpYXNfcXVlc3Rpb24oc2VsZik6CisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1RdWVzdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJ1N5c3RlbVF1ZXN0aW9uJywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9hbGlhc19mYWxsYmFjayhzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3QgY2FuJ3QgYmUgZXhwZWN0ZWQgdG8gd29yayBvbiBhbGwgc3lzdGVtcy4gIFRoZSBNUworICAgICAgICAjIFBsYXlTb3VuZCgpIGRvY3Mgc2F5OgorICAgICAgICAjCisgICAgICAgICMgICAgIElmIGl0IGNhbm5vdCBmaW5kIHRoZSBzcGVjaWZpZWQgc291bmQsIFBsYXlTb3VuZCB1c2VzIHRoZQorICAgICAgICAjICAgICBkZWZhdWx0IHN5c3RlbSBldmVudCBzb3VuZCBlbnRyeSBpbnN0ZWFkLiAgSWYgdGhlIGZ1bmN0aW9uCisgICAgICAgICMgICAgIGNhbiBmaW5kIG5laXRoZXIgdGhlIHN5c3RlbSBkZWZhdWx0IGVudHJ5IG5vciB0aGUgZGVmYXVsdAorICAgICAgICAjICAgICBzb3VuZCwgaXQgbWFrZXMgbm8gc291bmQgYW5kIHJldHVybnMgRkFMU0UuCisgICAgICAgICMKKyAgICAgICAgIyBJdCdzIGtub3duIHRvIHJldHVybiBGQUxTRSBvbiBzb21lIHJlYWwgc3lzdGVtcy4KKworICAgICAgICAjIHdpbnNvdW5kLlBsYXlTb3VuZCgnISIkJSYvKCMrKicsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgcmV0dXJuCisKKyAgICBkZWYgdGVzdF9hbGlhc19ub2ZhbGxiYWNrKHNlbGYpOgorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIGFzc2VydGluZyBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgICMgd2lsbCBnZXQgcmFpc2VkOiAgeW91IGNhbm5vdCBjb252ZXJ0IHRoaXMgdG8KKyAgICAgICAgICAgICMgc2VsZi5hc3NlcnRSYWlzZXMoLi4uKSBmb3JtLiAgVGhlIGF0dGVtcHQgbWF5IG9yIG1heSBub3QKKyAgICAgICAgICAgICMgcmFpc2UgUnVudGltZUVycm9yLCBidXQgaXQgc2hvdWxkbid0IHJhaXNlIGFueXRoaW5nIG90aGVyCisgICAgICAgICAgICAjIHRoYW4gUnVudGltZUVycm9yLCBhbmQgdGhhdCdzIGFsbCB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAgICAgIyBoZXJlLiAgVGhlIE1TIGRvY3MgYXJlbid0IGNsZWFyIGFib3V0IHdoZXRoZXIgdGhlIFNESworICAgICAgICAgICAgIyBQbGF5U291bmQoKSB3aXRoIFNORF9BTElBUyBhbmQgU05EX05PREVGQVVMVCB3aWxsIHJldHVybgorICAgICAgICAgICAgIyBUcnVlIG9yIEZhbHNlIHdoZW4gdGhlIGFsaWFzIGlzIHVua25vd24uICBPbiBUaW0ncyBXaW5YUAorICAgICAgICAgICAgIyBib3ggdG9kYXksIGl0IHJldHVybnMgVHJ1ZSAobm8gZXhjZXB0aW9uIGlzIHJhaXNlZCkuICBXaGF0CisgICAgICAgICAgICAjIHdlJ2QgcmVhbGx5IGxpa2UgdG8gdGVzdCBpcyB0aGF0IG5vIHNvdW5kIGlzIHBsYXllZCwgYnV0CisgICAgICAgICAgICAjIHRoYXQgcmVxdWlyZXMgZmlyc3Qgd2lyaW5nIGFuIGVhcmRydW0gY2xhc3MgaW50byB1bml0dGVzdAorICAgICAgICAgICAgIyA8d2luaz4uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAorICAgICAgICAgICAgICAgICAgICAnISIkJSYvKCMrKicsCisgICAgICAgICAgICAgICAgICAgIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9OT0RFRkFVTFQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJyEiJCUmLygjKyonLCB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfTk9ERUZBVUxUCisgICAgICAgICAgICApCisKKyAgICBkZWYgdGVzdF9zdG9wYXN5bmMoc2VsZik6CisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAorICAgICAgICAgICAgICAgICdTeXN0ZW1RdWVzdGlvbicsCisgICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX0FTWU5DIHwgd2luc291bmQuU05EX0xPT1AKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgJ1N5c3RlbVF1ZXN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX05PU1RPUAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZTogIyB0aGUgZmlyc3Qgc291bmQgbWlnaHQgYWxyZWFkeSBiZSBmaW5pc2hlZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZChOb25lLCB3aW5zb3VuZC5TTkRfUFVSR0UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIElzc3VlIDgzNjc6IFBsYXlTb3VuZChOb25lLCB3aW5zb3VuZC5TTkRfUFVSR0UpCisgICAgICAgICAgICAjIGRvZXMgbm90IHJhaXNlIG9uIHN5c3RlbXMgd2l0aG91dCBhIHNvdW5kIGNhcmQuCisgICAgICAgICAgICBwYXNzCisKKworZGVmIF9nZXRfY3NjcmlwdF9wYXRoKCk6CisgICAgIiIiUmV0dXJuIHRoZSBmdWxsIHBhdGggdG8gY3NjcmlwdC5leGUgb3IgTm9uZS4iIiIKKyAgICBmb3IgZGlyIGluIG9zLmVudmlyb24uZ2V0KCJQQVRIIiwgIiIpLnNwbGl0KG9zLnBhdGhzZXApOgorICAgICAgICBjc2NyaXB0X3BhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCAiY3NjcmlwdC5leGUiKQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhjc2NyaXB0X3BhdGgpOgorICAgICAgICAgICAgcmV0dXJuIGNzY3JpcHRfcGF0aAorCitfX2hhdmVfc291bmRjYXJkX2NhY2hlID0gTm9uZQorZGVmIF9oYXZlX3NvdW5kY2FyZCgpOgorICAgICIiIlJldHVybiBUcnVlIGlmZiB0aGlzIGNvbXB1dGVyIGhhcyBhIHNvdW5kY2FyZC4iIiIKKyAgICBnbG9iYWwgX19oYXZlX3NvdW5kY2FyZF9jYWNoZQorICAgIGlmIF9faGF2ZV9zb3VuZGNhcmRfY2FjaGUgaXMgTm9uZToKKyAgICAgICAgY3NjcmlwdF9wYXRoID0gX2dldF9jc2NyaXB0X3BhdGgoKQorICAgICAgICBpZiBjc2NyaXB0X3BhdGggaXMgTm9uZToKKyAgICAgICAgICAgICMgQ291bGQgbm90IGZpbmQgY3NjcmlwdC5leGUgdG8gcnVuIG91ciBWQlNjcmlwdCBoZWxwZXIuIERlZmF1bHQKKyAgICAgICAgICAgICMgdG8gVHJ1ZTogbW9zdCBjb21wdXRlcnMgdGhlc2UgZGF5cyAqZG8qIGhhdmUgYSBzb3VuZGNhcmQuCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGNoZWNrX3NjcmlwdCA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoZWNrX3NvdW5kY2FyZC52YnMiKQorICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihbY3NjcmlwdF9wYXRoLCBjaGVja19zY3JpcHRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBfX2hhdmVfc291bmRjYXJkX2NhY2hlID0gbm90IHAud2FpdCgpCisgICAgcmV0dXJuIF9faGF2ZV9zb3VuZGNhcmRfY2FjaGUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChCZWVwVGVzdCwgTWVzc2FnZUJlZXBUZXN0LCBQbGF5U291bmRUZXN0KQorCitpZiBfX25hbWVfXz09Il9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2luc291bmQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2luc291bmQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDQxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2luc291bmQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2luc291bmQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDQxNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aW5zb3VuZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd2l0aC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk2NDUxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHkKQEAgLTAsMCArMSw3NTAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJVbml0IHRlc3RzIGZvciB0aGUgd2l0aCBzdGF0ZW1lbnQgc3BlY2lmaWVkIGluIFBFUCAzNDMuIiIiCisKKworX19hdXRob3JfXyA9ICJNaWtlIEJsYW5kIgorX19lbWFpbF9fID0gIm1ibGFuZCBhdCBhY20gZG90IG9yZyIKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQorZnJvbSBjb250ZXh0bGliIGltcG9ydCBHZW5lcmF0b3JDb250ZXh0TWFuYWdlciwgY29udGV4dG1hbmFnZXIKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAorCisKK2NsYXNzIE1vY2tDb250ZXh0TWFuYWdlcihHZW5lcmF0b3JDb250ZXh0TWFuYWdlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGdlbik6CisgICAgICAgIEdlbmVyYXRvckNvbnRleHRNYW5hZ2VyLl9faW5pdF9fKHNlbGYsIGdlbikKKyAgICAgICAgc2VsZi5lbnRlcl9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5leGl0X2FyZ3MgPSBOb25lCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLmVudGVyX2NhbGxlZCA9IFRydWUKKyAgICAgICAgcmV0dXJuIEdlbmVyYXRvckNvbnRleHRNYW5hZ2VyLl9fZW50ZXJfXyhzZWxmKQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gVHJ1ZQorICAgICAgICBzZWxmLmV4aXRfYXJncyA9ICh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKQorICAgICAgICByZXR1cm4gR2VuZXJhdG9yQ29udGV4dE1hbmFnZXIuX19leGl0X18oc2VsZiwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCB0cmFjZWJhY2spCisKKworZGVmIG1vY2tfY29udGV4dG1hbmFnZXIoZnVuYyk6CisgICAgZGVmIGhlbHBlcigqYXJncywgKiprd2RzKToKKyAgICAgICAgcmV0dXJuIE1vY2tDb250ZXh0TWFuYWdlcihmdW5jKCphcmdzLCAqKmt3ZHMpKQorICAgIHJldHVybiBoZWxwZXIKKworCitjbGFzcyBNb2NrUmVzb3VyY2Uob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYueWllbGRlZCA9IEZhbHNlCisgICAgICAgIHNlbGYuc3RvcHBlZCA9IEZhbHNlCisKKworQG1vY2tfY29udGV4dG1hbmFnZXIKK2RlZiBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpOgorICAgIG1vY2sgPSBNb2NrUmVzb3VyY2UoKQorICAgIHRyeToKKyAgICAgICAgbW9jay55aWVsZGVkID0gVHJ1ZQorICAgICAgICB5aWVsZCBtb2NrCisgICAgZmluYWxseToKKyAgICAgICAgbW9jay5zdG9wcGVkID0gVHJ1ZQorCisKK2NsYXNzIE5lc3RlZChvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICptYW5hZ2Vycyk6CisgICAgICAgIHNlbGYubWFuYWdlcnMgPSBtYW5hZ2VycworICAgICAgICBzZWxmLmVudGVyZWQgPSBOb25lCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVudGVyZWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkNvbnRleHQgaXMgbm90IHJlZW50cmFudCIpCisgICAgICAgIHNlbGYuZW50ZXJlZCA9IGRlcXVlKCkKKyAgICAgICAgdmFycyA9IFtdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBtZ3IgaW4gc2VsZi5tYW5hZ2VyczoKKyAgICAgICAgICAgICAgICB2YXJzLmFwcGVuZChtZ3IuX19lbnRlcl9fKCkpCisgICAgICAgICAgICAgICAgc2VsZi5lbnRlcmVkLmFwcGVuZGxlZnQobWdyKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX2V4aXRfXygqc3lzLmV4Y19pbmZvKCkpOgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHJldHVybiB2YXJzCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKToKKyAgICAgICAgIyBCZWhhdmUgbGlrZSBuZXN0ZWQgd2l0aCBzdGF0ZW1lbnRzCisgICAgICAgICMgZmlyc3QgaW4sIGxhc3Qgb3V0CisgICAgICAgICMgTmV3IGV4Y2VwdGlvbnMgb3ZlcnJpZGUgb2xkIG9uZXMKKyAgICAgICAgZXggPSBleGNfaW5mbworICAgICAgICBmb3IgbWdyIGluIHNlbGYuZW50ZXJlZDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiBtZ3IuX19leGl0X18oKmV4KToKKyAgICAgICAgICAgICAgICAgICAgZXggPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBleCA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIHNlbGYuZW50ZXJlZCA9IE5vbmUKKyAgICAgICAgaWYgZXggaXMgbm90IGV4Y19pbmZvOgorICAgICAgICAgICAgcmFpc2UgZXhbMF0sIGV4WzFdLCBleFsyXQorCisKK2NsYXNzIE1vY2tOZXN0ZWQoTmVzdGVkKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKm1hbmFnZXJzKToKKyAgICAgICAgTmVzdGVkLl9faW5pdF9fKHNlbGYsICptYW5hZ2VycykKKyAgICAgICAgc2VsZi5lbnRlcl9jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gRmFsc2UKKyAgICAgICAgc2VsZi5leGl0X2FyZ3MgPSBOb25lCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLmVudGVyX2NhbGxlZCA9IFRydWUKKyAgICAgICAgcmV0dXJuIE5lc3RlZC5fX2VudGVyX18oc2VsZikKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgorICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gVHJ1ZQorICAgICAgICBzZWxmLmV4aXRfYXJncyA9IGV4Y19pbmZvCisgICAgICAgIHJldHVybiBOZXN0ZWQuX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKQorCisKK2NsYXNzIEZhaWx1cmVUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3ROYW1lRXJyb3Ioc2VsZik6CisgICAgICAgIGRlZiBmb29Ob3REZWNsYXJlZCgpOgorICAgICAgICAgICAgd2l0aCBmb286IHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTmFtZUVycm9yLCBmb29Ob3REZWNsYXJlZCkKKworICAgIGRlZiB0ZXN0RW50ZXJBdHRyaWJ1dGVFcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgTGFja3NFbnRlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgZm9vTGFja3NFbnRlcigpOgorICAgICAgICAgICAgZm9vID0gTGFja3NFbnRlcigpCisgICAgICAgICAgICB3aXRoIGZvbzogcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZm9vTGFja3NFbnRlcikKKworICAgIGRlZiB0ZXN0RXhpdEF0dHJpYnV0ZUVycm9yKHNlbGYpOgorICAgICAgICBjbGFzcyBMYWNrc0V4aXQob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBmb29MYWNrc0V4aXQoKToKKyAgICAgICAgICAgIGZvbyA9IExhY2tzRXhpdCgpCisgICAgICAgICAgICB3aXRoIGZvbzogcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgZm9vTGFja3NFeGl0KQorCisgICAgZGVmIGFzc2VydFJhaXNlc1N5bnRheEVycm9yKHNlbGYsIGNvZGVzdHIpOgorICAgICAgICBkZWYgc2hvdWxkUmFpc2VTeW50YXhFcnJvcihzKToKKyAgICAgICAgICAgIGNvbXBpbGUocywgJycsICdzaW5nbGUnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgc2hvdWxkUmFpc2VTeW50YXhFcnJvciwgY29kZXN0cikKKworICAgIGRlZiB0ZXN0QXNzaWdubWVudFRvTm9uZUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1N5bnRheEVycm9yKCd3aXRoIG1vY2sgYXMgTm9uZTpcbiAgcGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCisgICAgICAgICAgICAnd2l0aCBtb2NrIGFzIChOb25lKTpcbicKKyAgICAgICAgICAgICcgIHBhc3MnKQorCisgICAgZGVmIHRlc3RBc3NpZ25tZW50VG9FbXB0eVR1cGxlRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCisgICAgICAgICAgICAnd2l0aCBtb2NrIGFzICgpOlxuJworICAgICAgICAgICAgJyAgcGFzcycpCisKKyAgICBkZWYgdGVzdEFzc2lnbm1lbnRUb1R1cGxlT25seUNvbnRhaW5pbmdOb25lRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoJ3dpdGggbW9jayBhcyBOb25lLDpcbiAgcGFzcycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzU3ludGF4RXJyb3IoCisgICAgICAgICAgICAnd2l0aCBtb2NrIGFzIChOb25lLCk6XG4nCisgICAgICAgICAgICAnICBwYXNzJykKKworICAgIGRlZiB0ZXN0QXNzaWdubWVudFRvVHVwbGVDb250YWluaW5nTm9uZUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1N5bnRheEVycm9yKAorICAgICAgICAgICAgJ3dpdGggbW9jayBhcyAoZm9vLCBOb25lLCBiYXIpOlxuJworICAgICAgICAgICAgJyAgcGFzcycpCisKKyAgICBkZWYgdGVzdEVudGVyVGhyb3dzKHNlbGYpOgorICAgICAgICBjbGFzcyBFbnRlclRocm93cyhvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIkVudGVyIHRocmV3IikKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgY3QgPSBFbnRlclRocm93cygpCisgICAgICAgICAgICBzZWxmLmZvbyA9IE5vbmUKKyAgICAgICAgICAgIHdpdGggY3QgYXMgc2VsZi5mb286CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNob3VsZFRocm93KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZm9vLCBOb25lKQorCisgICAgZGVmIHRlc3RFeGl0VGhyb3dzKHNlbGYpOgorICAgICAgICBjbGFzcyBFeGl0VGhyb3dzKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoNDIpCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBFeGl0VGhyb3dzKCk6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNob3VsZFRocm93KQorCitjbGFzcyBDb250ZXh0bWFuYWdlckFzc2VydGlvbk1peGluKG9iamVjdCk6CisgICAgVEVTVF9FWENFUFRJT04gPSBSdW50aW1lRXJyb3IoInRlc3QgZXhjZXB0aW9uIikKKworICAgIGRlZiBhc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhzZWxmLCBtb2NrX21hbmFnZXIpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19tYW5hZ2VyLmVudGVyX2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtb2NrX21hbmFnZXIuZXhpdF9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tYW5hZ2VyLmV4aXRfYXJncywgTm9uZSkKKworICAgIGRlZiBhc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50cyhzZWxmLCBtb2NrX21hbmFnZXIsIGV4aXRfYXJncyk6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX21hbmFnZXIuZW50ZXJfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19tYW5hZ2VyLmV4aXRfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfbWFuYWdlci5leGl0X2FyZ3MsIGV4aXRfYXJncykKKworICAgIGRlZiBhc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3Ioc2VsZiwgbW9ja19tYW5hZ2VyKToKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX21hbmFnZXIsCisgICAgICAgICAgICAoTm9uZSwgTm9uZSwgTm9uZSkpCisKKyAgICBkZWYgYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLCBtb2NrX2dlbmVyYXRvcik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX2dlbmVyYXRvci55aWVsZGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1vY2tfZ2VuZXJhdG9yLnN0b3BwZWQpCisKKyAgICBkZWYgYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3Ioc2VsZiwgbW9ja19nZW5lcmF0b3IpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19nZW5lcmF0b3IueWllbGRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfZ2VuZXJhdG9yLnN0b3BwZWQpCisKKyAgICBkZWYgcmFpc2VUZXN0RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICByYWlzZSBzZWxmLlRFU1RfRVhDRVBUSU9OCisKKyAgICBkZWYgYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZiwgbW9ja19tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfdHlwZT1Ob25lKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfbWFuYWdlci5lbnRlcl9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2NrX21hbmFnZXIuZXhpdF9jYWxsZWQpCisgICAgICAgIGlmIGV4Y190eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vY2tfbWFuYWdlci5leGl0X2FyZ3NbMV0sIHNlbGYuVEVTVF9FWENFUFRJT04pCisgICAgICAgICAgICBleGNfdHlwZSA9IHR5cGUoc2VsZi5URVNUX0VYQ0VQVElPTikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21hbmFnZXIuZXhpdF9hcmdzWzBdLCBleGNfdHlwZSkKKyAgICAgICAgIyBUZXN0IHRoZSBfX2V4aXRfXyBhcmd1bWVudHMuIElzc3VlICM3ODUzCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtb2NrX21hbmFnZXIuZXhpdF9hcmdzWzFdLCBleGNfdHlwZSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChtb2NrX21hbmFnZXIuZXhpdF9hcmdzWzJdLCBOb25lKQorCisgICAgZGVmIGFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZiwgbW9ja19nZW5lcmF0b3IpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUobW9ja19nZW5lcmF0b3IueWllbGRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vY2tfZ2VuZXJhdG9yLnN0b3BwZWQpCisKKworY2xhc3MgTm9uZXhjZXB0aW9uYWxUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSwgQ29udGV4dG1hbmFnZXJBc3NlcnRpb25NaXhpbik6CisgICAgZGVmIHRlc3RJbmxpbmVHZW5lcmF0b3JTeW50YXgoc2VsZik6CisgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0VW5ib3VuZEdlbmVyYXRvcihzZWxmKToKKyAgICAgICAgbW9jayA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgd2l0aCBtb2NrOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtb2NrKQorCisgICAgZGVmIHRlc3RJbmxpbmVHZW5lcmF0b3JCb3VuZFN5bnRheChzZWxmKToKKyAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpIGFzIGZvbzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhmb28pCisgICAgICAgICMgRklYTUU6IEluIHRoZSBmdXR1cmUsIHdlJ2xsIHRyeSB0byBrZWVwIHRoZSBib3VuZCBuYW1lcyBmcm9tIGxlYWtpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihmb28pCisKKyAgICBkZWYgdGVzdElubGluZUdlbmVyYXRvckJvdW5kVG9FeGlzdGluZ1ZhcmlhYmxlKHNlbGYpOgorICAgICAgICBmb28gPSBOb25lCisgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSBhcyBmb286CisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoZm9vKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNOb0Vycm9yKGZvbykKKworICAgIGRlZiB0ZXN0SW5saW5lR2VuZXJhdG9yQm91bmRUb0RvdHRlZFZhcmlhYmxlKHNlbGYpOgorICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkgYXMgc2VsZi5mb286CisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoc2VsZi5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3Ioc2VsZi5mb28pCisKKyAgICBkZWYgdGVzdEJvdW5kR2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBtb2NrID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICB3aXRoIG1vY2sgYXMgZm9vOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKGZvbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9jaykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihmb28pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG1vY2spCisKKyAgICBkZWYgdGVzdE5lc3RlZFNpbmdsZVN0YXRlbWVudHMoc2VsZik6CisgICAgICAgIG1vY2tfYSA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgd2l0aCBtb2NrX2EgYXMgZm9vOgorICAgICAgICAgICAgbW9ja19iID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICAgICAgd2l0aCBtb2NrX2IgYXMgYmFyOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19hKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19iKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhmb28pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKGJhcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG1vY2tfYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3IoYmFyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2EpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoZm9vKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtb2NrX2EpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3IoZm9vKQorCisKK2NsYXNzIE5lc3RlZE5vbmV4Y2VwdGlvbmFsVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UsCisgICAgQ29udGV4dG1hbmFnZXJBc3NlcnRpb25NaXhpbik6CisgICAgZGVmIHRlc3RTaW5nbGVBcmdJbmxpbmVHZW5lcmF0b3JTeW50YXgoc2VsZik6CisgICAgICAgIHdpdGggTmVzdGVkKG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkpOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RTaW5nbGVBcmdCb3VuZFRvTm9uVHVwbGUoc2VsZik6CisgICAgICAgIG0gPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgICMgVGhpcyB3aWxsIGJpbmQgYWxsIHRoZSBhcmd1bWVudHMgdG8gbmVzdGVkKCkgaW50byBhIHNpbmdsZSBsaXN0CisgICAgICAgICMgYXNzaWduZWQgdG8gZm9vLgorICAgICAgICB3aXRoIE5lc3RlZChtKSBhcyBmb286CisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG0pCisKKyAgICBkZWYgdGVzdFNpbmdsZUFyZ0JvdW5kVG9TaW5nbGVFbGVtZW50UGFyZW50aGVzaXplZExpc3Qoc2VsZik6CisgICAgICAgIG0gPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgICMgVGhpcyB3aWxsIGJpbmQgYWxsIHRoZSBhcmd1bWVudHMgdG8gbmVzdGVkKCkgaW50byBhIHNpbmdsZSBsaXN0CisgICAgICAgICMgYXNzaWduZWQgdG8gZm9vLgorICAgICAgICB3aXRoIE5lc3RlZChtKSBhcyAoZm9vKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobSkKKworICAgIGRlZiB0ZXN0U2luZ2xlQXJnQm91bmRUb011bHRpcGxlRWxlbWVudFR1cGxlRXJyb3Ioc2VsZik6CisgICAgICAgIGRlZiBzaG91bGRUaHJvd1ZhbHVlRXJyb3IoKToKKyAgICAgICAgICAgIHdpdGggTmVzdGVkKG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkpIGFzIChmb28sIGJhcik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzaG91bGRUaHJvd1ZhbHVlRXJyb3IpCisKKyAgICBkZWYgdGVzdFNpbmdsZUFyZ1VuYm91bmQoc2VsZik6CisgICAgICAgIG1vY2tfY29udGV4dG1hbmFnZXIgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIG1vY2tfbmVzdGVkID0gTW9ja05lc3RlZChtb2NrX2NvbnRleHRtYW5hZ2VyKQorICAgICAgICB3aXRoIG1vY2tfbmVzdGVkOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2NvbnRleHRtYW5hZ2VyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX25lc3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobW9ja19jb250ZXh0bWFuYWdlcikKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobW9ja19uZXN0ZWQpCisKKyAgICBkZWYgdGVzdE11bHRpcGxlQXJnVW5ib3VuZChzZWxmKToKKyAgICAgICAgbSA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgbiA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgbyA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgbW9ja19uZXN0ZWQgPSBNb2NrTmVzdGVkKG0sIG4sIG8pCisgICAgICAgIHdpdGggbW9ja19uZXN0ZWQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG8pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfbmVzdGVkKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihuKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihvKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzTm9FcnJvcihtb2NrX25lc3RlZCkKKworICAgIGRlZiB0ZXN0TXVsdGlwbGVBcmdCb3VuZChzZWxmKToKKyAgICAgICAgbW9ja19uZXN0ZWQgPSBNb2NrTmVzdGVkKG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCksCisgICAgICAgICAgICBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpLCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpKQorICAgICAgICB3aXRoIG1vY2tfbmVzdGVkIGFzIChtLCBuLCBvKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKG4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMobykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19uZXN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3IobSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihuKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNOb0Vycm9yKG8pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNOb0Vycm9yKG1vY2tfbmVzdGVkKQorCisKK2NsYXNzIEV4Y2VwdGlvbmFsVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UsIENvbnRleHRtYW5hZ2VyQXNzZXJ0aW9uTWl4aW4pOgorICAgIGRlZiB0ZXN0U2luZ2xlUmVzb3VyY2Uoc2VsZik6CisgICAgICAgIGNtID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20gYXMgc2VsZi5yZXNvdXJjZToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKGNtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLnJlc291cmNlKQorICAgICAgICAgICAgICAgIHNlbGYucmFpc2VUZXN0RXhjZXB0aW9uKCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzaG91bGRUaHJvdykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihjbSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzV2l0aEVycm9yKHNlbGYucmVzb3VyY2UpCisKKyAgICBkZWYgdGVzdEV4Y2VwdGlvbk5vcm1hbGl6ZWQoc2VsZik6CisgICAgICAgIGNtID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20gYXMgc2VsZi5yZXNvdXJjZToKKyAgICAgICAgICAgICAgICAjIE5vdGUgdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCAxIC8vIDAgcHJvZHVjZXMgYW4gZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgIyB0aGF0IGlzIG5vdCBub3JtYWxpemVkIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgIDEgLy8gMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhaZXJvRGl2aXNpb25FcnJvciwgc2hvdWxkVGhyb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNXaXRoRXJyb3IoY20sIFplcm9EaXZpc2lvbkVycm9yKQorCisgICAgZGVmIHRlc3ROZXN0ZWRTaW5nbGVTdGF0ZW1lbnRzKHNlbGYpOgorICAgICAgICBtb2NrX2EgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIG1vY2tfYiA9IG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIG1vY2tfYSBhcyBzZWxmLmZvbzoKKyAgICAgICAgICAgICAgICB3aXRoIG1vY2tfYiBhcyBzZWxmLmJhcjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhtb2NrX2EpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19iKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoc2VsZi5mb28pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLmJhcikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yYWlzZVRlc3RFeGNlcHRpb24oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNob3VsZFRocm93KQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzV2l0aEVycm9yKG1vY2tfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihtb2NrX2IpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzV2l0aEVycm9yKHNlbGYuYmFyKQorCisgICAgZGVmIHRlc3RNdWx0aXBsZVJlc291cmNlc0luU2luZ2xlU3RhdGVtZW50KHNlbGYpOgorICAgICAgICBjbV9hID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBjbV9iID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBtb2NrX25lc3RlZCA9IE1vY2tOZXN0ZWQoY21fYSwgY21fYikKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIG1vY2tfbmVzdGVkIGFzIChzZWxmLnJlc291cmNlX2EsIHNlbGYucmVzb3VyY2VfYik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhNYW5hZ2VySW52YXJpYW50cyhjbV9hKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMoY21fYikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfbmVzdGVkKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLnJlc291cmNlX2EpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKHNlbGYucmVzb3VyY2VfYikKKyAgICAgICAgICAgICAgICBzZWxmLnJhaXNlVGVzdEV4Y2VwdGlvbigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2hvdWxkVGhyb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoTWFuYWdlckludmFyaWFudHNXaXRoRXJyb3IoY21fYSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihjbV9iKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzV2l0aEVycm9yKG1vY2tfbmVzdGVkKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZi5yZXNvdXJjZV9hKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZi5yZXNvdXJjZV9iKQorCisgICAgZGVmIHRlc3ROZXN0ZWRFeGNlcHRpb25CZWZvcmVJbm5lclN0YXRlbWVudChzZWxmKToKKyAgICAgICAgbW9ja19hID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBtb2NrX2IgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIHNlbGYuYmFyID0gTm9uZQorICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggbW9ja19hIGFzIHNlbGYuZm9vOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19hKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoR2VuZXJhdG9ySW52YXJpYW50cyhzZWxmLmZvbykKKyAgICAgICAgICAgICAgICBzZWxmLnJhaXNlVGVzdEV4Y2VwdGlvbigpCisgICAgICAgICAgICAgICAgd2l0aCBtb2NrX2IgYXMgc2VsZi5iYXI6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzaG91bGRUaHJvdykKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c1dpdGhFcnJvcihtb2NrX2EpCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLmZvbykKKworICAgICAgICAjIFRoZSBpbm5lciBzdGF0ZW1lbnQgc3R1ZmYgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiB0b3VjaGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5iYXIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobW9ja19iLmVudGVyX2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtb2NrX2IuZXhpdF9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19iLmV4aXRfYXJncywgTm9uZSkKKworICAgIGRlZiB0ZXN0TmVzdGVkRXhjZXB0aW9uQWZ0ZXJJbm5lclN0YXRlbWVudChzZWxmKToKKyAgICAgICAgbW9ja19hID0gbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKQorICAgICAgICBtb2NrX2IgPSBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBtb2NrX2EgYXMgc2VsZi5mb286CisgICAgICAgICAgICAgICAgd2l0aCBtb2NrX2IgYXMgc2VsZi5iYXI6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW5XaXRoTWFuYWdlckludmFyaWFudHMobW9ja19hKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aE1hbmFnZXJJbnZhcmlhbnRzKG1vY2tfYikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJbldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzKHNlbGYuZm9vKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEluV2l0aEdlbmVyYXRvckludmFyaWFudHMoc2VsZi5iYXIpCisgICAgICAgICAgICAgICAgc2VsZi5yYWlzZVRlc3RFeGNlcHRpb24oKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHNob3VsZFRocm93KQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aE1hbmFnZXJJbnZhcmlhbnRzV2l0aEVycm9yKG1vY2tfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhNYW5hZ2VySW52YXJpYW50c05vRXJyb3IobW9ja19iKQorICAgICAgICBzZWxmLmFzc2VydEFmdGVyV2l0aEdlbmVyYXRvckludmFyaWFudHNXaXRoRXJyb3Ioc2VsZi5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c05vRXJyb3Ioc2VsZi5iYXIpCisKKyAgICBkZWYgdGVzdFJhaXNlZFN0b3BJdGVyYXRpb24xKHNlbGYpOgorICAgICAgICAjIEZyb20gYnVnIDE0NjI0ODUKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiBjbSgpOgorICAgICAgICAgICAgeWllbGQKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uKCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RSYWlzZWRTdG9wSXRlcmF0aW9uMihzZWxmKToKKyAgICAgICAgIyBGcm9tIGJ1ZyAxNDYyNDg1CisgICAgICAgIGNsYXNzIGNtKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCB0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIGNtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigiZnJvbSB3aXRoIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBzaG91bGRUaHJvdykKKworICAgIGRlZiB0ZXN0UmFpc2VkU3RvcEl0ZXJhdGlvbjMoc2VsZik6CisgICAgICAgICMgQW5vdGhlciB2YXJpYW50IHdoZXJlIHRoZSBleGNlcHRpb24gaGFzbid0IGJlZW4gaW5zdGFudGlhdGVkCisgICAgICAgICMgRnJvbSBidWcgMTcwNTE3MAorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGNtKCk6CisgICAgICAgICAgICB5aWVsZAorCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIGl0ZXIoW10pLm5leHQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN0b3BJdGVyYXRpb24sIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RSYWlzZWRHZW5lcmF0b3JFeGl0MShzZWxmKToKKyAgICAgICAgIyBGcm9tIGJ1ZyAxNDYyNDg1CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgY20oKToKKyAgICAgICAgICAgIHlpZWxkCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIGNtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgR2VuZXJhdG9yRXhpdCgiZnJvbSB3aXRoIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhHZW5lcmF0b3JFeGl0LCBzaG91bGRUaHJvdykKKworICAgIGRlZiB0ZXN0UmFpc2VkR2VuZXJhdG9yRXhpdDIoc2VsZik6CisgICAgICAgICMgRnJvbSBidWcgMTQ2MjQ4NQorICAgICAgICBjbGFzcyBjbSAob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBHZW5lcmF0b3JFeGl0KCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEdlbmVyYXRvckV4aXQsIHNob3VsZFRocm93KQorCisgICAgZGVmIHRlc3RFcnJvcnNJbkJvb2woc2VsZik6CisgICAgICAgICMgaXNzdWU0NTg5OiBfX2V4aXRfXyByZXR1cm4gY29kZSBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgICMgd2hlbiBsb29raW5nIGF0IGl0cyB0cnV0aCB2YWx1ZS4KKworICAgICAgICBjbGFzcyBjbShvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJvb2xfY29udmVyc2lvbik6CisgICAgICAgICAgICAgICAgY2xhc3MgQm9vbDoKKyAgICAgICAgICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJvb2xfY29udmVyc2lvbigpCisgICAgICAgICAgICAgICAgc2VsZi5leGl0X3Jlc3VsdCA9IEJvb2woKQorICAgICAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMworICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIGEsIGIsIGMpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4aXRfcmVzdWx0CisKKyAgICAgICAgZGVmIHRydWVBc0Jvb2woKToKKyAgICAgICAgICAgIHdpdGggY20obGFtYmRhOiBUcnVlKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBOT1Qgc2VlIHRoaXMiKQorICAgICAgICB0cnVlQXNCb29sKCkKKworICAgICAgICBkZWYgZmFsc2VBc0Jvb2woKToKKyAgICAgICAgICAgIHdpdGggY20obGFtYmRhOiBGYWxzZSk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgcmFpc2UiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBc3NlcnRpb25FcnJvciwgZmFsc2VBc0Jvb2wpCisKKyAgICAgICAgZGVmIGZhaWxBc0Jvb2woKToKKyAgICAgICAgICAgIHdpdGggY20obGFtYmRhOiAxIC8vIDApOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIE5PVCBzZWUgdGhpcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFplcm9EaXZpc2lvbkVycm9yLCBmYWlsQXNCb29sKQorCisKK2NsYXNzIE5vbkxvY2FsRmxvd0NvbnRyb2xUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdFdpdGhCcmVhayhzZWxmKToKKyAgICAgICAgY291bnRlciA9IDAKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGNvdW50ZXIgKz0gMQorICAgICAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpOgorICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTAKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY291bnRlciArPSAxMDAgIyBOb3QgcmVhY2hlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvdW50ZXIsIDExKQorCisgICAgZGVmIHRlc3RXaXRoQ29udGludWUoc2VsZik6CisgICAgICAgIGNvdW50ZXIgPSAwCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICBjb3VudGVyICs9IDEKKyAgICAgICAgICAgIGlmIGNvdW50ZXIgPiAyOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgY291bnRlciArPSAxMAorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBjb3VudGVyICs9IDEwMCAjIE5vdCByZWFjaGVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnRlciwgMTIpCisKKyAgICBkZWYgdGVzdFdpdGhSZXR1cm4oc2VsZik6CisgICAgICAgIGRlZiBmb28oKToKKyAgICAgICAgICAgIGNvdW50ZXIgPSAwCisgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMQorICAgICAgICAgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKToKKyAgICAgICAgICAgICAgICAgICAgY291bnRlciArPSAxMAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY291bnRlcgorICAgICAgICAgICAgICAgIGNvdW50ZXIgKz0gMTAwICMgTm90IHJlYWNoZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28oKSwgMTEpCisKKyAgICBkZWYgdGVzdFdpdGhZaWVsZChzZWxmKToKKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpOgorICAgICAgICAgICAgICAgIHlpZWxkIDEyCisgICAgICAgICAgICAgICAgeWllbGQgMTMKKyAgICAgICAgeCA9IGxpc3QoZ2VuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgWzEyLCAxM10pCisKKyAgICBkZWYgdGVzdFdpdGhSYWlzZShzZWxmKToKKyAgICAgICAgY291bnRlciA9IDAKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY291bnRlciArPSAxCisgICAgICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCk6CisgICAgICAgICAgICAgICAgY291bnRlciArPSAxMAorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorICAgICAgICAgICAgY291bnRlciArPSAxMDAgIyBOb3QgcmVhY2hlZAorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudGVyLCAxMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IHJhaXNlIFJ1bnRpbWVFcnJvciIpCisKKworY2xhc3MgQXNzaWdubWVudFRhcmdldFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0U2luZ2xlQ29tcGxleFRhcmdldChzZWxmKToKKyAgICAgICAgdGFyZ2V0cyA9IHsxOiBbMCwgMSwgMl19CisgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSBhcyB0YXJnZXRzWzFdWzBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJnZXRzLmtleXMoKSwgWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJnZXRzWzFdWzBdLl9fY2xhc3NfXywgTW9ja1Jlc291cmNlKQorICAgICAgICB3aXRoIG1vY2tfY29udGV4dG1hbmFnZXJfZ2VuZXJhdG9yKCkgYXMgdGFyZ2V0cy52YWx1ZXMoKVswXVsxXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyZ2V0cy5rZXlzKCksIFsxXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyZ2V0c1sxXVsxXS5fX2NsYXNzX18sIE1vY2tSZXNvdXJjZSkKKyAgICAgICAgd2l0aCBtb2NrX2NvbnRleHRtYW5hZ2VyX2dlbmVyYXRvcigpIGFzIHRhcmdldHNbMl06CisgICAgICAgICAgICBrZXlzID0gdGFyZ2V0cy5rZXlzKCkKKyAgICAgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGtleXMsIFsxLCAyXSkKKyAgICAgICAgY2xhc3MgQzogcGFzcworICAgICAgICBibGFoID0gQygpCisgICAgICAgIHdpdGggbW9ja19jb250ZXh0bWFuYWdlcl9nZW5lcmF0b3IoKSBhcyBibGFoLmZvbzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzYXR0cihibGFoLCAiZm9vIiksIFRydWUpCisKKyAgICBkZWYgdGVzdE11bHRpcGxlQ29tcGxleFRhcmdldHMoc2VsZik6CisgICAgICAgIGNsYXNzIEM6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOiByZXR1cm4gMSwgMiwgMworICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHQsIHYsIHRiKTogcGFzcworICAgICAgICB0YXJnZXRzID0gezE6IFswLCAxLCAyXX0KKyAgICAgICAgd2l0aCBDKCkgYXMgKHRhcmdldHNbMV1bMF0sIHRhcmdldHNbMV1bMV0sIHRhcmdldHNbMV1bMl0pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJnZXRzLCB7MTogWzEsIDIsIDNdfSkKKyAgICAgICAgd2l0aCBDKCkgYXMgKHRhcmdldHMudmFsdWVzKClbMF1bMl0sIHRhcmdldHMudmFsdWVzKClbMF1bMV0sIHRhcmdldHMudmFsdWVzKClbMF1bMF0pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJnZXRzLCB7MTogWzMsIDIsIDFdfSkKKyAgICAgICAgd2l0aCBDKCkgYXMgKHRhcmdldHNbMV0sIHRhcmdldHNbMl0sIHRhcmdldHNbM10pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YXJnZXRzLCB7MTogMSwgMjogMiwgMzogM30pCisgICAgICAgIGNsYXNzIEI6IHBhc3MKKyAgICAgICAgYmxhaCA9IEIoKQorICAgICAgICB3aXRoIEMoKSBhcyAoYmxhaC5vbmUsIGJsYWgudHdvLCBibGFoLnRocmVlKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmxhaC5vbmUsIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJsYWgudHdvLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChibGFoLnRocmVlLCAzKQorCisKK2NsYXNzIEV4aXRTd2FsbG93c0V4Y2VwdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0RXhpdFRydWVTd2FsbG93c0V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgY2xhc3MgQWZyaWNhblN3YWxsb3c6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdCwgdiwgdGIpOiByZXR1cm4gVHJ1ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIEFmcmljYW5Td2FsbG93KCk6CisgICAgICAgICAgICAgICAgMSAvLyAwCisgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiWmVyb0RpdmlzaW9uRXJyb3Igc2hvdWxkIGhhdmUgYmVlbiBzd2FsbG93ZWQiKQorCisgICAgZGVmIHRlc3RFeGl0RmFsc2VEb2VzbnRTd2FsbG93RXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBjbGFzcyBFdXJvcGVhblN3YWxsb3c6CisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdCwgdiwgdGIpOiByZXR1cm4gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBFdXJvcGVhblN3YWxsb3coKToKKyAgICAgICAgICAgICAgICAxIC8vIDAKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJaZXJvRGl2aXNpb25FcnJvciBzaG91bGQgaGF2ZSBiZWVuIHJhaXNlZCIpCisKKworY2xhc3MgTmVzdGVkV2l0aCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBjbGFzcyBEdW1teShvYmplY3QpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9Tm9uZSwgZ29iYmxlPUZhbHNlKToKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBzZWxmCisgICAgICAgICAgICBzZWxmLnZhbHVlID0gdmFsdWUKKyAgICAgICAgICAgIHNlbGYuZ29iYmxlID0gZ29iYmxlCisgICAgICAgICAgICBzZWxmLmVudGVyX2NhbGxlZCA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmV4aXRfY2FsbGVkID0gRmFsc2UKKworICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5lbnRlcl9jYWxsZWQgPSBUcnVlCisgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorCisgICAgICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqZXhjX2luZm8pOgorICAgICAgICAgICAgc2VsZi5leGl0X2NhbGxlZCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuZXhjX2luZm8gPSBleGNfaW5mbworICAgICAgICAgICAgaWYgc2VsZi5nb2JibGU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGNsYXNzIEluaXRSYWlzZXMob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYpOiByYWlzZSBSdW50aW1lRXJyb3IoKQorCisgICAgY2xhc3MgRW50ZXJSYWlzZXMob2JqZWN0KToKKyAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKTogcmFpc2UgUnVudGltZUVycm9yKCkKKyAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6IHBhc3MKKworICAgIGNsYXNzIEV4aXRSYWlzZXMob2JqZWN0KToKKyAgICAgICAgZGVmIF9fZW50ZXJfXyhzZWxmKTogcGFzcworICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgKmV4Y19pbmZvKTogcmFpc2UgUnVudGltZUVycm9yKCkKKworICAgIGRlZiB0ZXN0Tm9FeGNlcHRpb25zKHNlbGYpOgorICAgICAgICB3aXRoIHNlbGYuRHVtbXkoKSBhcyBhLCBzZWxmLkR1bW15KCkgYXMgYjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLmVudGVyX2NhbGxlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiLmVudGVyX2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEuZXhpdF9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiLmV4aXRfY2FsbGVkKQorCisgICAgZGVmIHRlc3RFeGNlcHRpb25JbkV4cHJMaXN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuRHVtbXkoKSBhcyBhLCBzZWxmLkluaXRSYWlzZXMoKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEuZW50ZXJfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5leGl0X2NhbGxlZCkKKworICAgIGRlZiB0ZXN0RXhjZXB0aW9uSW5FbnRlcihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLkR1bW15KCkgYXMgYSwgc2VsZi5FbnRlclJhaXNlcygpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnYm9keSBvZiBiYWQgd2l0aCBleGVjdXRlZCcpCisgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ1J1bnRpbWVFcnJvciBub3QgcmVyYWlzZWQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5lbnRlcl9jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhLmV4aXRfY2FsbGVkKQorCisgICAgZGVmIHRlc3RFeGNlcHRpb25JbkV4aXQoc2VsZik6CisgICAgICAgIGJvZHlfZXhlY3V0ZWQgPSBGYWxzZQorICAgICAgICB3aXRoIHNlbGYuRHVtbXkoZ29iYmxlPVRydWUpIGFzIGEsIHNlbGYuRXhpdFJhaXNlcygpOgorICAgICAgICAgICAgYm9keV9leGVjdXRlZCA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEuZW50ZXJfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYS5leGl0X2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvZHlfZXhlY3V0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYS5leGNfaW5mb1swXSwgTm9uZSkKKworICAgIGRlZiB0ZXN0RW50ZXJSZXR1cm5zVHVwbGUoc2VsZik6CisgICAgICAgIHdpdGggc2VsZi5EdW1teSh2YWx1ZT0oMSwyKSkgYXMgKGExLCBhMiksIFwKKyAgICAgICAgICAgICBzZWxmLkR1bW15KHZhbHVlPSgxMCwgMjApKSBhcyAoYjEsIGIyKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgYTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGEyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgYjEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIwLCBiMikKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChGYWlsdXJlVGVzdENhc2UsIE5vbmV4Y2VwdGlvbmFsVGVzdENhc2UsCisgICAgICAgICAgICAgICAgIE5lc3RlZE5vbmV4Y2VwdGlvbmFsVGVzdENhc2UsIEV4Y2VwdGlvbmFsVGVzdENhc2UsCisgICAgICAgICAgICAgICAgIE5vbkxvY2FsRmxvd0NvbnRyb2xUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgQXNzaWdubWVudFRhcmdldFRlc3RDYXNlLAorICAgICAgICAgICAgICAgICBFeGl0U3dhbGxvd3NFeGNlcHRpb25UZXN0Q2FzZSwKKyAgICAgICAgICAgICAgICAgTmVzdGVkV2l0aCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aXRoLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjViM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aXRoLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dpdGgucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjViM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93aXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93c2dpcmVmLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd3NnaXJlZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2Q0Yzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rfd3NnaXJlZi5weQpAQCAtMCwwICsxLDU2MCBAQAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzICAgICMgQmFja3dhcmQgY29tcGF0IGZvciAyLjEKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIHdzZ2lyZWYudXRpbCBpbXBvcnQgc2V0dXBfdGVzdGluZ19kZWZhdWx0cworZnJvbSB3c2dpcmVmLmhlYWRlcnMgaW1wb3J0IEhlYWRlcnMKK2Zyb20gd3NnaXJlZi5oYW5kbGVycyBpbXBvcnQgQmFzZUhhbmRsZXIsIEJhc2VDR0lIYW5kbGVyCitmcm9tIHdzZ2lyZWYgaW1wb3J0IHV0aWwKK2Zyb20gd3NnaXJlZi52YWxpZGF0ZSBpbXBvcnQgdmFsaWRhdG9yCitmcm9tIHdzZ2lyZWYuc2ltcGxlX3NlcnZlciBpbXBvcnQgV1NHSVNlcnZlciwgV1NHSVJlcXVlc3RIYW5kbGVyLCBkZW1vX2FwcAorZnJvbSB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIgaW1wb3J0IG1ha2Vfc2VydmVyCitmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBTb2NrZXRTZXJ2ZXIgaW1wb3J0IEJhc2VTZXJ2ZXIKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKK2NsYXNzIE1vY2tTZXJ2ZXIoV1NHSVNlcnZlcik6CisgICAgIiIiTm9uLXNvY2tldCBIVFRQIHNlcnZlciIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzKToKKyAgICAgICAgQmFzZVNlcnZlci5fX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcykKKyAgICAgICAgc2VsZi5zZXJ2ZXJfYmluZCgpCisKKyAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CisgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLnNlcnZlcl9hZGRyZXNzCisgICAgICAgIHNlbGYuc2VydmVyX25hbWUgPSBob3N0CisgICAgICAgIHNlbGYuc2VydmVyX3BvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuc2V0dXBfZW52aXJvbigpCisKKworY2xhc3MgTW9ja0hhbmRsZXIoV1NHSVJlcXVlc3RIYW5kbGVyKToKKyAgICAiIiJOb24tc29ja2V0IEhUVFAgaGFuZGxlciIiIgorICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gc2VsZi5yZXF1ZXN0CisgICAgICAgIHNlbGYucmZpbGUsIHNlbGYud2ZpbGUgPSBzZWxmLmNvbm5lY3Rpb24KKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHBhc3MKKworCitkZWYgaGVsbG9fYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgorICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCBbCisgICAgICAgICgnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpLAorICAgICAgICAoJ0RhdGUnLCdNb24sIDA1IEp1biAyMDA2IDE4OjQ5OjU0IEdNVCcpCisgICAgXSkKKyAgICByZXR1cm4gWyJIZWxsbywgd29ybGQhIl0KKworZGVmIHJ1bl9hbW9jayhhcHA9aGVsbG9fYXBwLCBkYXRhPSJHRVQgLyBIVFRQLzEuMFxuXG4iKToKKyAgICBzZXJ2ZXIgPSBtYWtlX3NlcnZlcigiIiwgODAsIGFwcCwgTW9ja1NlcnZlciwgTW9ja0hhbmRsZXIpCisgICAgaW5wLCBvdXQsIGVyciwgb2xkZXJyID0gU3RyaW5nSU8oZGF0YSksIFN0cmluZ0lPKCksIFN0cmluZ0lPKCksIHN5cy5zdGRlcnIKKyAgICBzeXMuc3RkZXJyID0gZXJyCisKKyAgICB0cnk6CisgICAgICAgIHNlcnZlci5maW5pc2hfcmVxdWVzdCgoaW5wLG91dCksICgiMTI3LjAuMC4xIiw4ODg4KSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMuc3RkZXJyID0gb2xkZXJyCisKKyAgICByZXR1cm4gb3V0LmdldHZhbHVlKCksIGVyci5nZXR2YWx1ZSgpCisKKworZGVmIGNvbXBhcmVfZ2VuZXJpY19pdGVyKG1ha2VfaXQsbWF0Y2gpOgorICAgICIiIlV0aWxpdHkgdG8gY29tcGFyZSBhIGdlbmVyaWMgMi4xLzIuMisgaXRlcmF0b3Igd2l0aCBhbiBpdGVyYWJsZQorCisgICAgSWYgcnVubmluZyB1bmRlciBQeXRob24gMi4yKywgdGhpcyB0ZXN0cyB0aGUgaXRlcmF0b3IgdXNpbmcgaXRlcigpL25leHQoKSwKKyAgICBhcyB3ZWxsIGFzIF9fZ2V0aXRlbV9fLiAgJ21ha2VfaXQnIG11c3QgYmUgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBmcmVzaAorICAgIGl0ZXJhdG9yIHRvIGJlIHRlc3RlZCAoc2luY2UgdGhpcyBtYXkgdGVzdCB0aGUgaXRlcmF0b3IgdHdpY2UpLiIiIgorCisgICAgaXQgPSBtYWtlX2l0KCkKKyAgICBuID0gMAorICAgIGZvciBpdGVtIGluIG1hdGNoOgorICAgICAgICBpZiBub3QgaXRbbl09PWl0ZW06IHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgICAgIG4rPTEKKyAgICB0cnk6CisgICAgICAgIGl0W25dCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVG9vIG1hbnkgaXRlbXMgZnJvbSBfX2dldGl0ZW1fXyIsaXQpCisKKyAgICB0cnk6CisgICAgICAgIGl0ZXIsIFN0b3BJdGVyYXRpb24KKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyBPbmx5IHRlc3QgaXRlciBtb2RlIHVuZGVyIDIuMisKKyAgICAgICAgaXQgPSBtYWtlX2l0KCkKKyAgICAgICAgaWYgbm90IGl0ZXIoaXQpIGlzIGl0OiByYWlzZSBBc3NlcnRpb25FcnJvcgorICAgICAgICBmb3IgaXRlbSBpbiBtYXRjaDoKKyAgICAgICAgICAgIGlmIG5vdCBpdC5uZXh0KCk9PWl0ZW06IHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGl0Lm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUb28gbWFueSBpdGVtcyBmcm9tIC5uZXh0KCkiLGl0KQorCisKK2NsYXNzIEludGVncmF0aW9uVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGNoZWNrX2hlbGxvKHNlbGYsIG91dCwgaGFzX2xlbmd0aD1UcnVlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQsCisgICAgICAgICAgICAiSFRUUC8xLjAgMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJTZXJ2ZXI6IFdTR0lTZXJ2ZXIvMC4xIFB5dGhvbi8iK3N5cy52ZXJzaW9uLnNwbGl0KClbMF0rIlxyXG4iCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIKKyAgICAgICAgICAgICJEYXRlOiBNb24sIDA1IEp1biAyMDA2IDE4OjQ5OjU0IEdNVFxyXG4iICsKKyAgICAgICAgICAgIChoYXNfbGVuZ3RoIGFuZCAgIkNvbnRlbnQtTGVuZ3RoOiAxM1xyXG4iIG9yICIiKSArCisgICAgICAgICAgICAiXHJcbiIKKyAgICAgICAgICAgICJIZWxsbywgd29ybGQhIgorICAgICAgICApCisKKyAgICBkZWYgdGVzdF9wbGFpbl9oZWxsbyhzZWxmKToKKyAgICAgICAgb3V0LCBlcnIgPSBydW5fYW1vY2soKQorICAgICAgICBzZWxmLmNoZWNrX2hlbGxvKG91dCkKKworICAgIGRlZiB0ZXN0X3ZhbGlkYXRlZF9oZWxsbyhzZWxmKToKKyAgICAgICAgb3V0LCBlcnIgPSBydW5fYW1vY2sodmFsaWRhdG9yKGhlbGxvX2FwcCkpCisgICAgICAgICMgdGhlIG1pZGRsZXdhcmUgZG9lc24ndCBzdXBwb3J0IGxlbigpLCBzbyBjb250ZW50LWxlbmd0aCBpc24ndCB0aGVyZQorICAgICAgICBzZWxmLmNoZWNrX2hlbGxvKG91dCwgaGFzX2xlbmd0aD1GYWxzZSkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV92YWxpZGF0aW9uX2Vycm9yKHNlbGYpOgorICAgICAgICBkZWYgYmFkX2FwcChlbnZpcm9uLHN0YXJ0X3Jlc3BvbnNlKToKKyAgICAgICAgICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCAoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKSkKKyAgICAgICAgICAgIHJldHVybiBbIkhlbGxvLCB3b3JsZCEiXQorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayh2YWxpZGF0b3IoYmFkX2FwcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdXQuZW5kc3dpdGgoCisgICAgICAgICAgICAiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuICBQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4iCisgICAgICAgICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBlcnIuc3BsaXRsaW5lcygpWy0yXSwKKyAgICAgICAgICAgICJBc3NlcnRpb25FcnJvcjogSGVhZGVycyAoKCdDb250ZW50LVR5cGUnLCAndGV4dC9wbGFpbicpKSBtdXN0IgorICAgICAgICAgICAgIiBiZSBvZiB0eXBlIGxpc3Q6IDx0eXBlICd0dXBsZSc+IgorICAgICAgICApCisKKworY2xhc3MgVXRpbGl0eVRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiBjaGVja1NoaWZ0KHNlbGYsc25faW4scGlfaW4scGFydCxzbl9vdXQscGlfb3V0KToKKyAgICAgICAgZW52ID0geydTQ1JJUFRfTkFNRSc6c25faW4sJ1BBVEhfSU5GTyc6cGlfaW59CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbnYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5zaGlmdF9wYXRoX2luZm8oZW52KSxwYXJ0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudlsnUEFUSF9JTkZPJ10scGlfb3V0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudlsnU0NSSVBUX05BTUUnXSxzbl9vdXQpCisgICAgICAgIHJldHVybiBlbnYKKworICAgIGRlZiBjaGVja0RlZmF1bHQoc2VsZiwga2V5LCB2YWx1ZSwgYWx0PU5vbmUpOgorICAgICAgICAjIENoZWNrIGRlZmF1bHRpbmcgd2hlbiBlbXB0eQorICAgICAgICBlbnYgPSB7fQorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52KQorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBTdHJpbmdJTyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZW52W2tleV0sIFN0cmluZ0lPKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZba2V5XSwgdmFsdWUpCisKKyAgICAgICAgIyBDaGVjayBleGlzdGluZyB2YWx1ZQorICAgICAgICBlbnYgPSB7a2V5OmFsdH0KKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVudltrZXldIGlzIGFsdCkKKworICAgIGRlZiBjaGVja0Nyb3NzRGVmYXVsdChzZWxmLGtleSx2YWx1ZSwqKmt3KToKKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGt3W2tleV0sdmFsdWUpCisKKyAgICBkZWYgY2hlY2tBcHBVUkkoc2VsZix1cmksKiprdyk6CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhrdykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmFwcGxpY2F0aW9uX3VyaShrdyksdXJpKQorCisgICAgZGVmIGNoZWNrUmVxVVJJKHNlbGYsdXJpLHF1ZXJ5PTEsKiprdyk6CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhrdykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLnJlcXVlc3RfdXJpKGt3LHF1ZXJ5KSx1cmkpCisKKyAgICBkZWYgY2hlY2tGVyhzZWxmLHRleHQsc2l6ZSxtYXRjaCk6CisKKyAgICAgICAgZGVmIG1ha2VfaXQodGV4dD10ZXh0LHNpemU9c2l6ZSk6CisgICAgICAgICAgICByZXR1cm4gdXRpbC5GaWxlV3JhcHBlcihTdHJpbmdJTyh0ZXh0KSxzaXplKQorCisgICAgICAgIGNvbXBhcmVfZ2VuZXJpY19pdGVyKG1ha2VfaXQsbWF0Y2gpCisKKyAgICAgICAgaXQgPSBtYWtlX2l0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpdC5maWxlbGlrZS5jbG9zZWQpCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gaXQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpdC5maWxlbGlrZS5jbG9zZWQpCisKKyAgICAgICAgaXQuY2xvc2UoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXQuZmlsZWxpa2UuY2xvc2VkKQorCisgICAgZGVmIHRlc3RTaW1wbGVTaGlmdHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnJywnLycsICcnLCAnLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsJy94JywgJ3gnLCAnL3gnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvJywnJywgTm9uZSwgJy8nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYScsJy94L3knLCAneCcsICcvYS94JywgJy95JykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYScsJy94LycsICAneCcsICcvYS94JywgJy8nKQorCisgICAgZGVmIHRlc3ROb3JtYWxpemVkU2hpZnRzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4uL3knLCAnLi4nLCAnL2EnLCAnL3knKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsICcvLi4veScsICcuLicsICcnLCAnL3knKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy95JywgJ3knLCAnL2EvYi95JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvL3kvJywgJ3knLCAnL2EvYi95JywgJy8nKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4veScsICd5JywgJy9hL2IveScsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4veS8nLCAneScsICcvYS9iL3knLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLy8uLy4uLy95Ly4vLycsICcuLicsICcvYScsICcveS8nKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy8vJywgJycsICcvYS9iLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnLy4vLycsICcnLCAnL2EvYi8nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy94Ly8nLCAneCcsICcvYS9iL3gnLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLicsIE5vbmUsICcvYS9iJywgJycpCisKKyAgICBkZWYgdGVzdERlZmF1bHRzKHNlbGYpOgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBbCisgICAgICAgICAgICAoJ1NFUlZFUl9OQU1FJywnMTI3LjAuMC4xJyksCisgICAgICAgICAgICAoJ1NFUlZFUl9QT1JUJywgJzgwJyksCisgICAgICAgICAgICAoJ1NFUlZFUl9QUk9UT0NPTCcsJ0hUVFAvMS4wJyksCisgICAgICAgICAgICAoJ0hUVFBfSE9TVCcsJzEyNy4wLjAuMScpLAorICAgICAgICAgICAgKCdSRVFVRVNUX01FVEhPRCcsJ0dFVCcpLAorICAgICAgICAgICAgKCdTQ1JJUFRfTkFNRScsJycpLAorICAgICAgICAgICAgKCdQQVRIX0lORk8nLCcvJyksCisgICAgICAgICAgICAoJ3dzZ2kudmVyc2lvbicsICgxLDApKSwKKyAgICAgICAgICAgICgnd3NnaS5ydW5fb25jZScsIDApLAorICAgICAgICAgICAgKCd3c2dpLm11bHRpdGhyZWFkJywgMCksCisgICAgICAgICAgICAoJ3dzZ2kubXVsdGlwcm9jZXNzJywgMCksCisgICAgICAgICAgICAoJ3dzZ2kuaW5wdXQnLCBTdHJpbmdJTygiIikpLAorICAgICAgICAgICAgKCd3c2dpLmVycm9ycycsIFN0cmluZ0lPKCkpLAorICAgICAgICAgICAgKCd3c2dpLnVybF9zY2hlbWUnLCdodHRwJyksCisgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmNoZWNrRGVmYXVsdChrZXksdmFsdWUpCisKKyAgICBkZWYgdGVzdENyb3NzRGVmYXVsdHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ0hUVFBfSE9TVCcsImZvby5iYXIiLFNFUlZFUl9OQU1FPSJmb28uYmFyIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJywiaHR0cHMiLEhUVFBTPSJvbiIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHBzIixIVFRQUz0iMSIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHBzIixIVFRQUz0ieWVzIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJywiaHR0cCIsSFRUUFM9ImZvbyIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ1NFUlZFUl9QT1JUJywiODAiLEhUVFBTPSJmb28iKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCdTRVJWRVJfUE9SVCcsIjQ0MyIsSFRUUFM9Im9uIikKKworICAgIGRlZiB0ZXN0R3Vlc3NTY2hlbWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoe30pLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6ImZvbyJ9KSwgImh0dHAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiJvbiJ9KSwgImh0dHBzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7J0hUVFBTJzoieWVzIn0pLCAiaHR0cHMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiIxIn0pLCAiaHR0cHMiKQorCisgICAgZGVmIHRlc3RBcHBVUklzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vMTI3LjAuMC4xLyIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbSIsIFNDUklQVF9OQU1FPSIvc3BhbSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly9zcGFtLmV4YW1wbGUuY29tOjIwNzEvIiwKKyAgICAgICAgICAgIEhUVFBfSE9TVD0ic3BhbS5leGFtcGxlLmNvbToyMDcxIiwgU0VSVkVSX1BPUlQ9IjIwNzEiKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vc3BhbS5leGFtcGxlLmNvbS8iLAorICAgICAgICAgICAgU0VSVkVSX05BTUU9InNwYW0uZXhhbXBsZS5jb20iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vMTI3LjAuMC4xLyIsCisgICAgICAgICAgICBIVFRQX0hPU1Q9IjEyNy4wLjAuMSIsIFNFUlZFUl9OQU1FPSJzcGFtLmV4YW1wbGUuY29tIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cHM6Ly8xMjcuMC4wLjEvIiwgSFRUUFM9Im9uIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovLzEyNy4wLjAuMTo4MDAwLyIsIFNFUlZFUl9QT1JUPSI4MDAwIiwKKyAgICAgICAgICAgIEhUVFBfSE9TVD1Ob25lKQorCisgICAgZGVmIHRlc3RSZXFVUklzKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xLyIpCisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbSIsIFNDUklQVF9OQU1FPSIvc3BhbSIpCisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbW1pdHkvc3BhbSIsCisgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbSIpCisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbW1pdHkvc3BhbTtoYW0iLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW07aGFtIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtO2Nvb2tpZT0xMjM0LDU2NzgiLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW07Y29va2llPTEyMzQsNTY3OCIpCisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbW1pdHkvc3BhbT9zYXk9bmkiLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW0iLFFVRVJZX1NUUklORz0ic2F5PW5pIikKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS9zcGFtbWl0eS9zcGFtIiwgMCwKKyAgICAgICAgICAgIFNDUklQVF9OQU1FPSIvc3BhbW1pdHkiLCBQQVRIX0lORk89Ii9zcGFtIixRVUVSWV9TVFJJTkc9InNheT1uaSIpCisKKyAgICBkZWYgdGVzdEZpbGVXcmFwcGVyKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrRlcoInh5eiIqNTAsIDEyMCwgWyJ4eXoiKjQwLCJ4eXoiKjEwXSkKKworICAgIGRlZiB0ZXN0SG9wQnlIb3Aoc2VsZik6CisgICAgICAgIGZvciBob3AgaW4gKAorICAgICAgICAgICAgIkNvbm5lY3Rpb24gS2VlcC1BbGl2ZSBQcm94eS1BdXRoZW50aWNhdGUgUHJveHktQXV0aG9yaXphdGlvbiAiCisgICAgICAgICAgICAiVEUgVHJhaWxlcnMgVHJhbnNmZXItRW5jb2RpbmcgVXBncmFkZSIKKyAgICAgICAgKS5zcGxpdCgpOgorICAgICAgICAgICAgZm9yIGFsdCBpbiBob3AsIGhvcC50aXRsZSgpLCBob3AudXBwZXIoKSwgaG9wLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHV0aWwuaXNfaG9wX2J5X2hvcChhbHQpKQorCisgICAgICAgICMgTm90IGNvbXByZWhlbnNpdmUsIGp1c3QgYSBmZXcgcmFuZG9tIGhlYWRlciBuYW1lcworICAgICAgICBmb3IgaG9wIGluICgKKyAgICAgICAgICAgICJBY2NlcHQgQ2FjaGUtQ29udHJvbCBEYXRlIFByYWdtYSBUcmFpbGVyIFZpYSBXYXJuaW5nIgorICAgICAgICApLnNwbGl0KCk6CisgICAgICAgICAgICBmb3IgYWx0IGluIGhvcCwgaG9wLnRpdGxlKCksIGhvcC51cHBlcigpLCBob3AubG93ZXIoKToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHV0aWwuaXNfaG9wX2J5X2hvcChhbHQpKQorCitjbGFzcyBIZWFkZXJUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdE1hcHBpbmdJbnRlcmZhY2Uoc2VsZik6CisgICAgICAgIHRlc3QgPSBbKCd4JywneScpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihIZWFkZXJzKFtdKSksMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oSGVhZGVycyh0ZXN0WzpdKSksMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLmtleXMoKSwgWyd4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS52YWx1ZXMoKSwgWyd5J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS5pdGVtcygpLCB0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKEhlYWRlcnModGVzdCkuaXRlbXMoKSBpcyB0ZXN0KSAgIyBtdXN0IGJlIGNvcHkhCisKKyAgICAgICAgaD1IZWFkZXJzKFtdKQorICAgICAgICBkZWwgaFsnZm9vJ10gICAjIHNob3VsZCBub3QgcmFpc2UgYW4gZXJyb3IKKworICAgICAgICBoWydGb28nXSA9ICdiYXInCisgICAgICAgIGZvciBtIGluIGguaGFzX2tleSwgaC5fX2NvbnRhaW5zX18sIGguZ2V0LCBoLmdldF9hbGwsIGguX19nZXRpdGVtX186CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSgnZm9vJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSgnRm9vJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSgnRk9PJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG0oJ2JhcicpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFsnZm9vJ10sJ2JhcicpCisgICAgICAgIGhbJ2ZvbyddID0gJ2JheicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoWydGT08nXSwnYmF6JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmdldF9hbGwoJ2ZvbycpLFsnYmF6J10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmdldCgiZm9vIiwid2hlZSIpLCAiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmdldCgiem9vIiwid2hlZSIpLCAid2hlZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zZXRkZWZhdWx0KCJmb28iLCJ3aGVlIiksICJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc2V0ZGVmYXVsdCgiem9vIiwid2hlZSIpLCAid2hlZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFsiZm9vIl0sImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFsiem9vIl0sIndoZWUiKQorCisgICAgZGVmIHRlc3RSZXF1aXJlTGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBIZWFkZXJzLCAiZm9vIikKKworCisgICAgZGVmIHRlc3RFeHRyYXMoc2VsZik6CisgICAgICAgIGggPSBIZWFkZXJzKFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihoKSwnXHJcbicpCisKKyAgICAgICAgaC5hZGRfaGVhZGVyKCdmb28nLCdiYXInLGJhej0ic3BhbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFsnZm9vJ10sICdiYXI7IGJhej0ic3BhbSInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihoKSwnZm9vOiBiYXI7IGJhej0ic3BhbSJcclxuXHJcbicpCisKKyAgICAgICAgaC5hZGRfaGVhZGVyKCdGb28nLCdiYXInLGNoZWVzZT1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZ2V0X2FsbCgnZm9vJyksCisgICAgICAgICAgICBbJ2JhcjsgYmF6PSJzcGFtIicsICdiYXI7IGNoZWVzZSddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGgpLAorICAgICAgICAgICAgJ2ZvbzogYmFyOyBiYXo9InNwYW0iXHJcbicKKyAgICAgICAgICAgICdGb286IGJhcjsgY2hlZXNlXHJcbicKKyAgICAgICAgICAgICdcclxuJworICAgICAgICApCisKKworY2xhc3MgRXJyb3JIYW5kbGVyKEJhc2VDR0lIYW5kbGVyKToKKyAgICAiIiJTaW1wbGUgaGFuZGxlciBzdWJjbGFzcyBmb3IgdGVzdGluZyBCYXNlSGFuZGxlciIiIgorCisgICAgIyBCYXNlSGFuZGxlciByZWNvcmRzIHRoZSBPUyBlbnZpcm9ubWVudCBhdCBpbXBvcnQgdGltZSwgYnV0IGVudnZhcnMKKyAgICAjIG1pZ2h0IGhhdmUgYmVlbiBjaGFuZ2VkIGxhdGVyIGJ5IG90aGVyIHRlc3RzLCB3aGljaCB0cmlwcyB1cAorICAgICMgSGFuZGxlclRlc3RzLnRlc3RFbnZpcm9uKCkuCisgICAgb3NfZW52aXJvbiA9IGRpY3Qob3MuZW52aXJvbi5pdGVtcygpKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsKiprdyk6CisgICAgICAgIHNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCisgICAgICAgIEJhc2VDR0lIYW5kbGVyLl9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwgU3RyaW5nSU8oJycpLCBTdHJpbmdJTygpLCBTdHJpbmdJTygpLCBrdywKKyAgICAgICAgICAgIG11bHRpdGhyZWFkPVRydWUsIG11bHRpcHJvY2Vzcz1UcnVlCisgICAgICAgICkKKworY2xhc3MgVGVzdEhhbmRsZXIoRXJyb3JIYW5kbGVyKToKKyAgICAiIiJTaW1wbGUgaGFuZGxlciBzdWJjbGFzcyBmb3IgdGVzdGluZyBCYXNlSGFuZGxlciwgdy9lcnJvciBwYXNzdGhydSIiIgorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgcmFpc2UgICAjIGZvciB0ZXN0aW5nLCB3ZSB3YW50IHRvIHNlZSB3aGF0J3MgaGFwcGVuaW5nCisKKworY2xhc3MgSGFuZGxlclRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiBjaGVja0Vudmlyb25BdHRycyhzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgZW52ID0gaGFuZGxlci5lbnZpcm9uCisgICAgICAgIGZvciBhdHRyIGluIFsKKyAgICAgICAgICAgICd2ZXJzaW9uJywnbXVsdGl0aHJlYWQnLCdtdWx0aXByb2Nlc3MnLCdydW5fb25jZScsJ2ZpbGVfd3JhcHBlcicKKyAgICAgICAgXToKKyAgICAgICAgICAgIGlmIGF0dHI9PSdmaWxlX3dyYXBwZXInIGFuZCBoYW5kbGVyLndzZ2lfZmlsZV93cmFwcGVyIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihoYW5kbGVyLCd3c2dpXycrYXR0ciksZW52Wyd3c2dpLicrYXR0cl0pCisKKyAgICBkZWYgY2hlY2tPU0Vudmlyb24oc2VsZixoYW5kbGVyKToKKyAgICAgICAgZW1wdHkgPSB7fTsgc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbXB0eSkKKyAgICAgICAgZW52ID0gaGFuZGxlci5lbnZpcm9uCisgICAgICAgIGZyb20gb3MgaW1wb3J0IGVudmlyb24KKyAgICAgICAgZm9yIGssdiBpbiBlbnZpcm9uLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBrIG5vdCBpbiBlbXB0eToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudltrXSx2KQorICAgICAgICBmb3Igayx2IGluIGVtcHR5Lml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKGssIGVudikKKworICAgIGRlZiB0ZXN0RW52aXJvbihzZWxmKToKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKFg9IlkiKQorICAgICAgICBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBzZWxmLmNoZWNrRW52aXJvbkF0dHJzKGgpCisgICAgICAgIHNlbGYuY2hlY2tPU0Vudmlyb24oaCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmVudmlyb25bIlgiXSwiWSIpCisKKyAgICBkZWYgdGVzdENHSUVudmlyb24oc2VsZik6CisgICAgICAgIGggPSBCYXNlQ0dJSGFuZGxlcihOb25lLE5vbmUsTm9uZSx7fSkKKyAgICAgICAgaC5zZXR1cF9lbnZpcm9uKCkKKyAgICAgICAgZm9yIGtleSBpbiAnd3NnaS51cmxfc2NoZW1lJywgJ3dzZ2kuaW5wdXQnLCAnd3NnaS5lcnJvcnMnOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihrZXksIGguZW52aXJvbikKKworICAgIGRlZiB0ZXN0U2NoZW1lKHNlbGYpOgorICAgICAgICBoPVRlc3RIYW5kbGVyKEhUVFBTPSJvbiIpOyBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10sJ2h0dHBzJykKKyAgICAgICAgaD1UZXN0SGFuZGxlcigpOyBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10sJ2h0dHAnKQorCisgICAgZGVmIHRlc3RBYnN0cmFjdE1ldGhvZHMoc2VsZik6CisgICAgICAgIGggPSBCYXNlSGFuZGxlcigpCisgICAgICAgIGZvciBuYW1lIGluIFsKKyAgICAgICAgICAgICdfZmx1c2gnLCdnZXRfc3RkaW4nLCdnZXRfc3RkZXJyJywnYWRkX2NnaV92YXJzJworICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoTm90SW1wbGVtZW50ZWRFcnJvciwgZ2V0YXR0cihoLG5hbWUpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBoLl93cml0ZSwgInRlc3QiKQorCisgICAgZGVmIHRlc3RDb250ZW50TGVuZ3RoKHNlbGYpOgorICAgICAgICAjIERlbW8gb25lIHJlYXNvbiBpdGVyYXRpb24gaXMgYmV0dGVyIHRoYW4gd3JpdGUoKS4uLiAgOykKKworICAgICAgICBkZWYgdHJpdmlhbF9hcHAxKGUscyk6CisgICAgICAgICAgICBzKCcyMDAgT0snLFtdKQorICAgICAgICAgICAgcmV0dXJuIFtlWyd3c2dpLnVybF9zY2hlbWUnXV0KKworICAgICAgICBkZWYgdHJpdmlhbF9hcHAyKGUscyk6CisgICAgICAgICAgICBzKCcyMDAgT0snLFtdKShlWyd3c2dpLnVybF9zY2hlbWUnXSkKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIGRlZiB0cml2aWFsX2FwcDQoZSxzKToKKyAgICAgICAgICAgICMgU2ltdWxhdGUgYSByZXNwb25zZSB0byBhIEhFQUQgcmVxdWVzdAorICAgICAgICAgICAgcygnMjAwIE9LJyxbKCdDb250ZW50LUxlbmd0aCcsICcxMjM0NScpXSkKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIGggPSBUZXN0SGFuZGxlcigpCisgICAgICAgIGgucnVuKHRyaXZpYWxfYXBwMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogNFxyXG4iCisgICAgICAgICAgICAiXHJcbiIKKyAgICAgICAgICAgICJodHRwIikKKworICAgICAgICBoID0gVGVzdEhhbmRsZXIoKQorICAgICAgICBoLnJ1bih0cml2aWFsX2FwcDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICJTdGF0dXM6IDIwMCBPS1xyXG4iCisgICAgICAgICAgICAiXHJcbiIKKyAgICAgICAgICAgICJodHRwIikKKworCisgICAgICAgIGggPSBUZXN0SGFuZGxlcigpCisgICAgICAgIGgucnVuKHRyaXZpYWxfYXBwNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgYidTdGF0dXM6IDIwMCBPS1xyXG4nCisgICAgICAgICAgICBiJ0NvbnRlbnQtTGVuZ3RoOiAxMjM0NVxyXG4nCisgICAgICAgICAgICBiJ1xyXG4nKQorCisgICAgZGVmIHRlc3RCYXNpY0Vycm9yT3V0cHV0KHNlbGYpOgorCisgICAgICAgIGRlZiBub25fZXJyb3JfYXBwKGUscyk6CisgICAgICAgICAgICBzKCcyMDAgT0snLFtdKQorICAgICAgICAgICAgcmV0dXJuIFtdCisKKyAgICAgICAgZGVmIGVycm9yX2FwcChlLHMpOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRoaXMgc2hvdWxkIGJlIGNhdWdodCBieSBoYW5kbGVyIikKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4obm9uX2Vycm9yX2FwcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogMFxyXG4iCisgICAgICAgICAgICAiXHJcbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRlcnIuZ2V0dmFsdWUoKSwiIikKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4oZXJyb3JfYXBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAlc1xyXG4iCisgICAgICAgICAgICAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogJWRcclxuIgorICAgICAgICAgICAgIlxyXG4lcyIgJSAoaC5lcnJvcl9zdGF0dXMsbGVuKGguZXJyb3JfYm9keSksaC5lcnJvcl9ib2R5KSkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGguc3RkZXJyLmdldHZhbHVlKCkuZmluZCgiQXNzZXJ0aW9uRXJyb3IiKSwgLTEpCisKKyAgICBkZWYgdGVzdEVycm9yQWZ0ZXJPdXRwdXQoc2VsZik6CisgICAgICAgIE1TRyA9ICJTb21lIG91dHB1dCBoYXMgYmVlbiBzZW50IgorICAgICAgICBkZWYgZXJyb3JfYXBwKGUscyk6CisgICAgICAgICAgICBzKCIyMDAgT0siLFtdKShNU0cpCisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IGhhbmRsZXIiKQorCisgICAgICAgIGggPSBFcnJvckhhbmRsZXIoKQorICAgICAgICBoLnJ1bihlcnJvcl9hcHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICJTdGF0dXM6IDIwMCBPS1xyXG4iCisgICAgICAgICAgICAiXHJcbiIrTVNHKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGguc3RkZXJyLmdldHZhbHVlKCkuZmluZCgiQXNzZXJ0aW9uRXJyb3IiKSwgLTEpCisKKyAgICBkZWYgdGVzdEhlYWRlckZvcm1hdHMoc2VsZik6CisKKyAgICAgICAgZGVmIG5vbl9lcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBzdGRwYXQgPSAoCisgICAgICAgICAgICByIkhUVFAvJXMgMjAwIE9LXHJcbiIKKyAgICAgICAgICAgIHIiRGF0ZTogXHd7M30sIFsgMDEyM11cZCBcd3szfSBcZHs0fSBcZFxkOlxkXGQ6XGRcZCBHTVRcclxuIgorICAgICAgICAgICAgciIlcyIgciJDb250ZW50LUxlbmd0aDogMFxyXG4iIHIiXHJcbiIKKyAgICAgICAgKQorICAgICAgICBzaG9ydHBhdCA9ICgKKyAgICAgICAgICAgICJTdGF0dXM6IDIwMCBPS1xyXG4iICJDb250ZW50LUxlbmd0aDogMFxyXG4iICJcclxuIgorICAgICAgICApCisKKyAgICAgICAgZm9yIHNzdyBpbiAiRm9vQmFyLzEuMCIsIE5vbmU6CisgICAgICAgICAgICBzdyA9IHNzdyBhbmQgIlNlcnZlcjogJXNcclxuIiAlIHNzdyBvciAiIgorCisgICAgICAgICAgICBmb3IgdmVyc2lvbiBpbiAiMS4wIiwgIjEuMSI6CisgICAgICAgICAgICAgICAgZm9yIHByb3RvIGluICJIVFRQLzAuOSIsICJIVFRQLzEuMCIsICJIVFRQLzEuMSI6CisKKyAgICAgICAgICAgICAgICAgICAgaCA9IFRlc3RIYW5kbGVyKFNFUlZFUl9QUk9UT0NPTD1wcm90bykKKyAgICAgICAgICAgICAgICAgICAgaC5vcmlnaW5fc2VydmVyID0gRmFsc2UKKyAgICAgICAgICAgICAgICAgICAgaC5odHRwX3ZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIGguc2VydmVyX3NvZnR3YXJlID0gc3N3CisgICAgICAgICAgICAgICAgICAgIGgucnVuKG5vbl9lcnJvcl9hcHApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2hvcnRwYXQsaC5zdGRvdXQuZ2V0dmFsdWUoKSkKKworICAgICAgICAgICAgICAgICAgICBoID0gVGVzdEhhbmRsZXIoU0VSVkVSX1BST1RPQ09MPXByb3RvKQorICAgICAgICAgICAgICAgICAgICBoLm9yaWdpbl9zZXJ2ZXIgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIGguaHR0cF92ZXJzaW9uID0gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBoLnNlcnZlcl9zb2Z0d2FyZSA9IHNzdworICAgICAgICAgICAgICAgICAgICBoLnJ1bihub25fZXJyb3JfYXBwKQorICAgICAgICAgICAgICAgICAgICBpZiBwcm90bz09IkhUVFAvMC45IjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwiIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5tYXRjaChzdGRwYXQlKHZlcnNpb24sc3cpLCBoLnN0ZG91dC5nZXR2YWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RkcGF0JSh2ZXJzaW9uLHN3KSwgaC5zdGRvdXQuZ2V0dmFsdWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKworICAgIGRlZiB0ZXN0Q2xvc2VPbkVycm9yKHNlbGYpOgorICAgICAgICBzaWRlX2VmZmVjdHMgPSB7J2Nsb3NlX2NhbGxlZCc6IEZhbHNlfQorICAgICAgICBNU0cgPSBiIlNvbWUgb3V0cHV0IGhhcyBiZWVuIHNlbnQiCisgICAgICAgIGRlZiBlcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoIjIwMCBPSyIsW10pKE1TRykKKyAgICAgICAgICAgIGNsYXNzIENyYXNoeUl0ZXJhYmxlKG9iamVjdCk6CisgICAgICAgICAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgYidibGFoJworICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRoaXMgc2hvdWxkIGJlIGNhdWdodCBieSBoYW5kbGVyIikKKworICAgICAgICAgICAgICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgICAgICAgICAgICAgc2lkZV9lZmZlY3RzWydjbG9zZV9jYWxsZWQnXSA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiBDcmFzaHlJdGVyYWJsZSgpCisKKyAgICAgICAgaCA9IEVycm9ySGFuZGxlcigpCisgICAgICAgIGgucnVuKGVycm9yX2FwcCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWRlX2VmZmVjdHNbJ2Nsb3NlX2NhbGxlZCddLCBUcnVlKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KF9fbmFtZV9fKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93c2dpcmVmLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dzZ2lyZWYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzI0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93c2dpcmVmLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93c2dpcmVmLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3dzZ2lyZWYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzI0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF93c2dpcmVmLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94ZHJsaWIucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94ZHJsaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhODg4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weQpAQCAtMCwwICsxLDU4IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCB4ZHJsaWIKKworY2xhc3MgWERSVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF94ZHIoc2VsZik6CisgICAgICAgIHAgPSB4ZHJsaWIuUGFja2VyKCkKKworICAgICAgICBzID0gJ2hlbGxvIHdvcmxkJworICAgICAgICBhID0gWyd3aGF0JywgJ2lzJywgJ2hhcG5pbicsICdkb2N0b3InXQorCisgICAgICAgIHAucGFja19pbnQoNDIpCisgICAgICAgIHAucGFja19pbnQoLTE3KQorICAgICAgICBwLnBhY2tfdWludCg5KQorICAgICAgICBwLnBhY2tfYm9vbChUcnVlKQorICAgICAgICBwLnBhY2tfYm9vbChGYWxzZSkKKyAgICAgICAgcC5wYWNrX3VoeXBlcig0NUwpCisgICAgICAgIHAucGFja19mbG9hdCgxLjkpCisgICAgICAgIHAucGFja19kb3VibGUoMS45KQorICAgICAgICBwLnBhY2tfc3RyaW5nKHMpCisgICAgICAgIHAucGFja19saXN0KHJhbmdlKDUpLCBwLnBhY2tfdWludCkKKyAgICAgICAgcC5wYWNrX2FycmF5KGEsIHAucGFja19zdHJpbmcpCisKKyAgICAgICAgIyBub3cgdmVyaWZ5CisgICAgICAgIGRhdGEgPSBwLmdldF9idWZmZXIoKQorICAgICAgICB1cCA9IHhkcmxpYi5VbnBhY2tlcihkYXRhKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAuZ2V0X3Bvc2l0aW9uKCksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfaW50KCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja19pbnQoKSwgLTE3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVwLnVucGFja191aW50KCksIDkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1cC51bnBhY2tfYm9vbCgpIGlzIFRydWUpCisKKyAgICAgICAgIyByZW1lbWJlciBwb3NpdGlvbgorICAgICAgICBwb3MgPSB1cC5nZXRfcG9zaXRpb24oKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXAudW5wYWNrX2Jvb2woKSBpcyBGYWxzZSkKKworICAgICAgICAjIHJld2luZCBhbmQgdW5wYWNrIGFnYWluCisgICAgICAgIHVwLnNldF9wb3NpdGlvbihwb3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX3VoeXBlcigpLCA0NUwpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodXAudW5wYWNrX2Zsb2F0KCksIDEuOSkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCh1cC51bnBhY2tfZG91YmxlKCksIDEuOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfc3RyaW5nKCksIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX2xpc3QodXAudW5wYWNrX3VpbnQpLCByYW5nZSg1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfYXJyYXkodXAudW5wYWNrX3N0cmluZyksIGEpCisgICAgICAgIHVwLmRvbmUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFT0ZFcnJvciwgdXAudW5wYWNrX3VpbnQpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFhEUlRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94ZHJsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2EzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94ZHJsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hkcmxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94ZHJsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlY2EzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94ZHJsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTE2MWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5CkBAIC0wLDAgKzEsMTkwNyBAQAorIyB4bWwuZXRyZWUgdGVzdC4gIFRoaXMgZmlsZSBjb250YWlucyBlbm91Z2ggdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQKKyMgYWxsIGluY2x1ZGVkIGNvbXBvbmVudHMgd29yayBhcyB0aGV5IHNob3VsZC4KKyMgTGFyZ2UgcGFydHMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSB1cHN0cmVhbSB0ZXN0IHN1aXRlLgorCisjIElNUE9SVEFOVDogdGhlIHNhbWUgZG9jdGVzdHMgYXJlIHJ1biBmcm9tICJ0ZXN0X3htbF9ldHJlZV9jIiBpbgorIyBvcmRlciB0byBlbnN1cmUgY29uc2lzdGVuY3kgYmV0d2VlbiB0aGUgQyBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlCisjIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KKyMKKyMgRm9yIHRoaXMgcHVycG9zZSwgdGhlIG1vZHVsZS1sZXZlbCAiRVQiIHN5bWJvbCBpcyB0ZW1wb3JhcmlseQorIyBtb25rZXktcGF0Y2hlZCB3aGVuIHJ1bm5pbmcgdGhlICJ0ZXN0X3htbF9ldHJlZV9jIiB0ZXN0IHN1aXRlLgorIyBEb24ndCByZS1pbXBvcnQgInhtbC5ldHJlZS5FbGVtZW50VHJlZSIgbW9kdWxlIGluIHRoZSBkb2NzdHJpbmcsCisjIGV4Y2VwdCBpZiB0aGUgdGVzdCBpcyBzcGVjaWZpYyB0byB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uLgorCitpbXBvcnQgc3lzCitpbXBvcnQgY2dpCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBmaW5kZmlsZQorCitmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKKworU0lNUExFX1hNTEZJTEUgPSBmaW5kZmlsZSgic2ltcGxlLnhtbCIsIHN1YmRpcj0ieG1sdGVzdGRhdGEiKQorU0lNUExFX05TX1hNTEZJTEUgPSBmaW5kZmlsZSgic2ltcGxlLW5zLnhtbCIsIHN1YmRpcj0ieG1sdGVzdGRhdGEiKQorCitTQU1QTEVfWE1MID0gIiIiXAorPGJvZHk+CisgIDx0YWcgY2xhc3M9J2EnPnRleHQ8L3RhZz4KKyAgPHRhZyBjbGFzcz0nYicgLz4KKyAgPHNlY3Rpb24+CisgICAgPHRhZyBjbGFzcz0nYicgaWQ9J2lubmVyJz5zdWJ0ZXh0PC90YWc+CisgIDwvc2VjdGlvbj4KKzwvYm9keT4KKyIiIgorCitTQU1QTEVfU0VDVElPTiA9ICIiIlwKKzxzZWN0aW9uPgorICA8dGFnIGNsYXNzPSdiJyBpZD0naW5uZXInPnN1YnRleHQ8L3RhZz4KKyAgPG5leHR0YWcgLz4KKyAgPG5leHRzZWN0aW9uPgorICAgIDx0YWcgLz4KKyAgPC9uZXh0c2VjdGlvbj4KKzwvc2VjdGlvbj4KKyIiIgorCitTQU1QTEVfWE1MX05TID0gIiIiCis8Ym9keSB4bWxucz0iaHR0cDovL2VmZmJvdC5vcmcvbnMiPgorICA8dGFnPnRleHQ8L3RhZz4KKyAgPHRhZyAvPgorICA8c2VjdGlvbj4KKyAgICA8dGFnPnN1YnRleHQ8L3RhZz4KKyAgPC9zZWN0aW9uPgorPC9ib2R5PgorIiIiCisKKworZGVmIHNhbml0eSgpOgorICAgICIiIgorICAgIEltcG9ydCBzYW5pdHkuCisKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFBhdGgKKyAgICAiIiIKKworZGVmIGNoZWNrX21ldGhvZChtZXRob2QpOgorICAgIGlmIG5vdCBoYXNhdHRyKG1ldGhvZCwgJ19fY2FsbF9fJyk6CisgICAgICAgIHByaW50IG1ldGhvZCwgIm5vdCBjYWxsYWJsZSIKKworZGVmIHNlcmlhbGl6ZShlbGVtLCB0b19zdHJpbmc9VHJ1ZSwgKipvcHRpb25zKToKKyAgICBpbXBvcnQgU3RyaW5nSU8KKyAgICBmaWxlID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgIHRyZWUgPSBFVC5FbGVtZW50VHJlZShlbGVtKQorICAgIHRyZWUud3JpdGUoZmlsZSwgKipvcHRpb25zKQorICAgIGlmIHRvX3N0cmluZzoKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0dmFsdWUoKQorICAgIGVsc2U6CisgICAgICAgIGZpbGUuc2VlaygwKQorICAgICAgICByZXR1cm4gZmlsZQorCitkZWYgc3VtbWFyaXplKGVsZW0pOgorICAgIGlmIGVsZW0udGFnID09IEVULkNvbW1lbnQ6CisgICAgICAgIHJldHVybiAiPENvbW1lbnQ+IgorICAgIHJldHVybiBlbGVtLnRhZworCitkZWYgc3VtbWFyaXplX2xpc3Qoc2VxKToKKyAgICByZXR1cm4gW3N1bW1hcml6ZShlbGVtKSBmb3IgZWxlbSBpbiBzZXFdCisKK2RlZiBub3JtYWxpemVfY3JsZih0cmVlKToKKyAgICBmb3IgZWxlbSBpbiB0cmVlLml0ZXIoKToKKyAgICAgICAgaWYgZWxlbS50ZXh0OgorICAgICAgICAgICAgZWxlbS50ZXh0ID0gZWxlbS50ZXh0LnJlcGxhY2UoIlxyXG4iLCAiXG4iKQorICAgICAgICBpZiBlbGVtLnRhaWw6CisgICAgICAgICAgICBlbGVtLnRhaWwgPSBlbGVtLnRhaWwucmVwbGFjZSgiXHJcbiIsICJcbiIpCisKK2RlZiBjaGVja19zdHJpbmcoc3RyaW5nKToKKyAgICBsZW4oc3RyaW5nKQorICAgIGZvciBjaGFyIGluIHN0cmluZzoKKyAgICAgICAgaWYgbGVuKGNoYXIpICE9IDE6CisgICAgICAgICAgICBwcmludCAiZXhwZWN0ZWQgb25lLWNoYXJhY3RlciBzdHJpbmcsIGdvdCAlciIgJSBjaGFyCisgICAgbmV3X3N0cmluZyA9IHN0cmluZyArICIiCisgICAgbmV3X3N0cmluZyA9IHN0cmluZyArICIgIgorICAgIHN0cmluZ1s6MF0KKworZGVmIGNoZWNrX21hcHBpbmcobWFwcGluZyk6CisgICAgbGVuKG1hcHBpbmcpCisgICAga2V5cyA9IG1hcHBpbmcua2V5cygpCisgICAgaXRlbXMgPSBtYXBwaW5nLml0ZW1zKCkKKyAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgIGl0ZW0gPSBtYXBwaW5nW2tleV0KKyAgICBtYXBwaW5nWyJrZXkiXSA9ICJ2YWx1ZSIKKyAgICBpZiBtYXBwaW5nWyJrZXkiXSAhPSAidmFsdWUiOgorICAgICAgICBwcmludCAiZXhwZWN0ZWQgdmFsdWUgc3RyaW5nLCBnb3QgJXIiICUgbWFwcGluZ1sia2V5Il0KKworZGVmIGNoZWNrX2VsZW1lbnQoZWxlbWVudCk6CisgICAgaWYgbm90IEVULmlzZWxlbWVudChlbGVtZW50KToKKyAgICAgICAgcHJpbnQgIm5vdCBhbiBlbGVtZW50IgorICAgIGlmIG5vdCBoYXNhdHRyKGVsZW1lbnQsICJ0YWciKToKKyAgICAgICAgcHJpbnQgIm5vIHRhZyBtZW1iZXIiCisgICAgaWYgbm90IGhhc2F0dHIoZWxlbWVudCwgImF0dHJpYiIpOgorICAgICAgICBwcmludCAibm8gYXR0cmliIG1lbWJlciIKKyAgICBpZiBub3QgaGFzYXR0cihlbGVtZW50LCAidGV4dCIpOgorICAgICAgICBwcmludCAibm8gdGV4dCBtZW1iZXIiCisgICAgaWYgbm90IGhhc2F0dHIoZWxlbWVudCwgInRhaWwiKToKKyAgICAgICAgcHJpbnQgIm5vIHRhaWwgbWVtYmVyIgorCisgICAgY2hlY2tfc3RyaW5nKGVsZW1lbnQudGFnKQorICAgIGNoZWNrX21hcHBpbmcoZWxlbWVudC5hdHRyaWIpCisgICAgaWYgZWxlbWVudC50ZXh0IGlzIG5vdCBOb25lOgorICAgICAgICBjaGVja19zdHJpbmcoZWxlbWVudC50ZXh0KQorICAgIGlmIGVsZW1lbnQudGFpbCBpcyBub3QgTm9uZToKKyAgICAgICAgY2hlY2tfc3RyaW5nKGVsZW1lbnQudGFpbCkKKyAgICBmb3IgZWxlbSBpbiBlbGVtZW50OgorICAgICAgICBjaGVja19lbGVtZW50KGVsZW0pCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZWxlbWVudCB0cmVlIHRlc3RzCisKK2RlZiBpbnRlcmZhY2UoKToKKyAgICByIiIiCisgICAgVGVzdCBlbGVtZW50IHRyZWUgaW50ZXJmYWNlLgorCisgICAgPj4+IGVsZW1lbnQgPSBFVC5FbGVtZW50KCJ0YWciKQorICAgID4+PiBjaGVja19lbGVtZW50KGVsZW1lbnQpCisgICAgPj4+IHRyZWUgPSBFVC5FbGVtZW50VHJlZShlbGVtZW50KQorICAgID4+PiBjaGVja19lbGVtZW50KHRyZWUuZ2V0cm9vdCgpKQorCisgICAgPj4+IGVsZW1lbnQgPSBFVC5FbGVtZW50KCJ0XHhlNGciLCBrZXk9InZhbHVlIikKKyAgICA+Pj4gdHJlZSA9IEVULkVsZW1lbnRUcmVlKGVsZW1lbnQpCisgICAgPj4+IHJlcHIoZWxlbWVudCkgICAjIGRvY3Rlc3Q6ICtFTExJUFNJUworICAgICI8RWxlbWVudCAndFxceGU0ZycgYXQgMHguLi4+IgorICAgID4+PiBlbGVtZW50ID0gRVQuRWxlbWVudCgidGFnIiwga2V5PSJ2YWx1ZSIpCisKKyAgICBNYWtlIHN1cmUgYWxsIHN0YW5kYXJkIGVsZW1lbnQgbWV0aG9kcyBleGlzdC4KKworICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5hcHBlbmQpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LmV4dGVuZCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuaW5zZXJ0KQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5yZW1vdmUpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LmdldGNoaWxkcmVuKQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5maW5kKQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5pdGVyZmluZCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuZmluZGFsbCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuZmluZHRleHQpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LmNsZWFyKQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5nZXQpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50LnNldCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQua2V5cykKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuaXRlbXMpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50Lml0ZXIpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50Lml0ZXJ0ZXh0KQorICAgID4+PiBjaGVja19tZXRob2QoZWxlbWVudC5nZXRpdGVyYXRvcikKKworICAgIFRoZXNlIG1ldGhvZHMgcmV0dXJuIGFuIGl0ZXJhYmxlLiBTZWUgYnVnIDY0NzIuCisKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuaXRlcigidGFnIikubmV4dCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKGVsZW1lbnQuaXRlcmZpbmQoInRhZyIpLm5leHQpCisgICAgPj4+IGNoZWNrX21ldGhvZChlbGVtZW50Lml0ZXJmaW5kKCIqIikubmV4dCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKHRyZWUuaXRlcigidGFnIikubmV4dCkKKyAgICA+Pj4gY2hlY2tfbWV0aG9kKHRyZWUuaXRlcmZpbmQoInRhZyIpLm5leHQpCisgICAgPj4+IGNoZWNrX21ldGhvZCh0cmVlLml0ZXJmaW5kKCIqIikubmV4dCkKKworICAgIFRoZXNlIGFsaWFzZXMgYXJlIHByb3ZpZGVkOgorCisgICAgPj4+IGFzc2VydCBFVC5YTUwgPT0gRVQuZnJvbXN0cmluZworICAgID4+PiBhc3NlcnQgRVQuUEkgPT0gRVQuUHJvY2Vzc2luZ0luc3RydWN0aW9uCisgICAgPj4+IGFzc2VydCBFVC5YTUxQYXJzZXIgPT0gRVQuWE1MVHJlZUJ1aWxkZXIKKyAgICAiIiIKKworZGVmIHNpbXBsZW9wcygpOgorICAgICIiIgorICAgIEJhc2ljIG1ldGhvZCBzYW5pdHkgY2hlY2tzLgorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoIjxib2R5Pjx0YWcvPjwvYm9keT4iKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPGJvZHk+PHRhZyAvPjwvYm9keT4nCisgICAgPj4+IGUgPSBFVC5FbGVtZW50KCJ0YWcyIikKKyAgICA+Pj4gZWxlbS5hcHBlbmQoZSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzxib2R5Pjx0YWcgLz48dGFnMiAvPjwvYm9keT4nCisgICAgPj4+IGVsZW0ucmVtb3ZlKGUpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8Ym9keT48dGFnIC8+PC9ib2R5PicKKyAgICA+Pj4gZWxlbS5pbnNlcnQoMCwgZSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzxib2R5Pjx0YWcyIC8+PHRhZyAvPjwvYm9keT4nCisgICAgPj4+IGVsZW0ucmVtb3ZlKGUpCisgICAgPj4+IGVsZW0uZXh0ZW5kKFtlXSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzxib2R5Pjx0YWcgLz48dGFnMiAvPjwvYm9keT4nCisgICAgPj4+IGVsZW0ucmVtb3ZlKGUpCisKKyAgICA+Pj4gZWxlbWVudCA9IEVULkVsZW1lbnQoInRhZyIsIGtleT0idmFsdWUiKQorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudCkgIyAxCisgICAgJzx0YWcga2V5PSJ2YWx1ZSIgLz4nCisgICAgPj4+IHN1YmVsZW1lbnQgPSBFVC5FbGVtZW50KCJzdWJ0YWciKQorICAgID4+PiBlbGVtZW50LmFwcGVuZChzdWJlbGVtZW50KQorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudCkgIyAyCisgICAgJzx0YWcga2V5PSJ2YWx1ZSI+PHN1YnRhZyAvPjwvdGFnPicKKyAgICA+Pj4gZWxlbWVudC5pbnNlcnQoMCwgc3ViZWxlbWVudCkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW1lbnQpICMgMworICAgICc8dGFnIGtleT0idmFsdWUiPjxzdWJ0YWcgLz48c3VidGFnIC8+PC90YWc+JworICAgID4+PiBlbGVtZW50LnJlbW92ZShzdWJlbGVtZW50KQorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudCkgIyA0CisgICAgJzx0YWcga2V5PSJ2YWx1ZSI+PHN1YnRhZyAvPjwvdGFnPicKKyAgICA+Pj4gZWxlbWVudC5yZW1vdmUoc3ViZWxlbWVudCkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW1lbnQpICMgNQorICAgICc8dGFnIGtleT0idmFsdWUiIC8+JworICAgID4+PiBlbGVtZW50LnJlbW92ZShzdWJlbGVtZW50KQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBsaXN0LnJlbW92ZSh4KTogeCBub3QgaW4gbGlzdAorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudCkgIyA2CisgICAgJzx0YWcga2V5PSJ2YWx1ZSIgLz4nCisgICAgPj4+IGVsZW1lbnRbMDowXSA9IFtzdWJlbGVtZW50LCBzdWJlbGVtZW50LCBzdWJlbGVtZW50XQorICAgID4+PiBzZXJpYWxpemUoZWxlbWVudFsxXSkKKyAgICAnPHN1YnRhZyAvPicKKyAgICA+Pj4gZWxlbWVudFsxOjldID09IFtlbGVtZW50WzFdLCBlbGVtZW50WzJdXQorICAgIFRydWUKKyAgICA+Pj4gZWxlbWVudFs6OToyXSA9PSBbZWxlbWVudFswXSwgZWxlbWVudFsyXV0KKyAgICBUcnVlCisgICAgPj4+IGRlbCBlbGVtZW50WzE6Ml0KKyAgICA+Pj4gc2VyaWFsaXplKGVsZW1lbnQpCisgICAgJzx0YWcga2V5PSJ2YWx1ZSI+PHN1YnRhZyAvPjxzdWJ0YWcgLz48L3RhZz4nCisgICAgIiIiCisKK2RlZiBjZGF0YSgpOgorICAgICIiIgorICAgIFRlc3QgQ0RBVEEgaGFuZGxpbmcgKGV0YykuCisKKyAgICA+Pj4gc2VyaWFsaXplKEVULlhNTCgiPHRhZz5oZWxsbzwvdGFnPiIpKQorICAgICc8dGFnPmhlbGxvPC90YWc+JworICAgID4+PiBzZXJpYWxpemUoRVQuWE1MKCI8dGFnPiYjMTA0OyYjMTAxOyYjMTA4OyYjMTA4OyYjMTExOzwvdGFnPiIpKQorICAgICc8dGFnPmhlbGxvPC90YWc+JworICAgID4+PiBzZXJpYWxpemUoRVQuWE1MKCI8dGFnPjwhW0NEQVRBW2hlbGxvXV0+PC90YWc+IikpCisgICAgJzx0YWc+aGVsbG88L3RhZz4nCisgICAgIiIiCisKKyMgT25seSB3aXRoIFB5dGhvbiBpbXBsZW1lbnRhdGlvbgorZGVmIHNpbXBsZWZpbmQoKToKKyAgICAiIiIKKyAgICBUZXN0IGZpbmQgbWV0aG9kcyB1c2luZyB0aGUgZWxlbWVudHBhdGggZmFsbGJhY2suCisKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCisKKyAgICA+Pj4gQ3VycmVudEVsZW1lbnRQYXRoID0gRWxlbWVudFRyZWUuRWxlbWVudFBhdGgKKyAgICA+Pj4gRWxlbWVudFRyZWUuRWxlbWVudFBhdGggPSBFbGVtZW50VHJlZS5fU2ltcGxlRWxlbWVudFBhdGgoKQorICAgID4+PiBlbGVtID0gRWxlbWVudFRyZWUuWE1MKFNBTVBMRV9YTUwpCisgICAgPj4+IGVsZW0uZmluZCgidGFnIikudGFnCisgICAgJ3RhZycKKyAgICA+Pj4gRWxlbWVudFRyZWUuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgidGFnIikudGFnCisgICAgJ3RhZycKKyAgICA+Pj4gZWxlbS5maW5kdGV4dCgidGFnIikKKyAgICAndGV4dCcKKyAgICA+Pj4gZWxlbS5maW5kdGV4dCgidG9nIikKKyAgICA+Pj4gZWxlbS5maW5kdGV4dCgidG9nIiwgImRlZmF1bHQiKQorICAgICdkZWZhdWx0JworICAgID4+PiBFbGVtZW50VHJlZS5FbGVtZW50VHJlZShlbGVtKS5maW5kdGV4dCgidGFnIikKKyAgICAndGV4dCcKKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJ0YWciKSkKKyAgICBbJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3RhZyIpKQorICAgIFsndGFnJywgJ3RhZycsICd0YWcnXQorCisgICAgUGF0aCBzeW50YXggZG9lc24ndCB3b3JrIGluIHRoaXMgY2FzZS4KKworICAgID4+PiBlbGVtLmZpbmQoInNlY3Rpb24vdGFnIikKKyAgICA+Pj4gZWxlbS5maW5kdGV4dCgic2VjdGlvbi90YWciKQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInNlY3Rpb24vdGFnIikpCisgICAgW10KKworICAgID4+PiBFbGVtZW50VHJlZS5FbGVtZW50UGF0aCA9IEN1cnJlbnRFbGVtZW50UGF0aAorICAgICIiIgorCitkZWYgZmluZCgpOgorICAgICIiIgorICAgIFRlc3QgZmluZCBtZXRob2RzIChpbmNsdWRpbmcgeHBhdGggc3ludGF4KS4KKworICAgID4+PiBlbGVtID0gRVQuWE1MKFNBTVBMRV9YTUwpCisgICAgPj4+IGVsZW0uZmluZCgidGFnIikudGFnCisgICAgJ3RhZycKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgidGFnIikudGFnCisgICAgJ3RhZycKKyAgICA+Pj4gZWxlbS5maW5kKCJzZWN0aW9uL3RhZyIpLnRhZworICAgICd0YWcnCisgICAgPj4+IGVsZW0uZmluZCgiLi90YWciKS50YWcKKyAgICAndGFnJworICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kKCIuL3RhZyIpLnRhZworICAgICd0YWcnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmQoIi90YWciKS50YWcKKyAgICAndGFnJworICAgID4+PiBlbGVtWzJdID0gRVQuWE1MKFNBTVBMRV9TRUNUSU9OKQorICAgID4+PiBlbGVtLmZpbmQoInNlY3Rpb24vbmV4dHRhZyIpLnRhZworICAgICduZXh0dGFnJworICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kKCJzZWN0aW9uL3RhZyIpLnRhZworICAgICd0YWcnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmQoInRvZyIpCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmQoInRvZy9mb28iKQorICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJ0YWciKQorICAgICd0ZXh0JworICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJzZWN0aW9uL25leHR0YWciKQorICAgICcnCisgICAgPj4+IGVsZW0uZmluZHRleHQoInNlY3Rpb24vbmV4dHRhZyIsICJkZWZhdWx0IikKKyAgICAnJworICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJ0b2ciKQorICAgID4+PiBlbGVtLmZpbmR0ZXh0KCJ0b2ciLCAiZGVmYXVsdCIpCisgICAgJ2RlZmF1bHQnCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmR0ZXh0KCJ0YWciKQorICAgICd0ZXh0JworICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kdGV4dCgidG9nL2ZvbyIpCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmR0ZXh0KCJ0b2cvZm9vIiwgImRlZmF1bHQiKQorICAgICdkZWZhdWx0JworICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kdGV4dCgiLi90YWciKQorICAgICd0ZXh0JworICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kdGV4dCgiL3RhZyIpCisgICAgJ3RleHQnCisgICAgPj4+IGVsZW0uZmluZHRleHQoInNlY3Rpb24vdGFnIikKKyAgICAnc3VidGV4dCcKKyAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZHRleHQoInNlY3Rpb24vdGFnIikKKyAgICAnc3VidGV4dCcKKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuIikpCisgICAgWydib2R5J10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJ0YWciKSkKKyAgICBbJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInRvZyIpKQorICAgIFtdCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgidG9nL2ZvbyIpKQorICAgIFtdCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiKiIpKQorICAgIFsndGFnJywgJ3RhZycsICdzZWN0aW9uJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuLy90YWciKSkKKyAgICBbJ3RhZycsICd0YWcnLCAndGFnJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgic2VjdGlvbi90YWciKSkKKyAgICBbJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgic2VjdGlvbi8vdGFnIikpCisgICAgWyd0YWcnLCAndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJzZWN0aW9uLyoiKSkKKyAgICBbJ3RhZycsICduZXh0dGFnJywgJ25leHRzZWN0aW9uJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJzZWN0aW9uLy8qIikpCisgICAgWyd0YWcnLCAnbmV4dHRhZycsICduZXh0c2VjdGlvbicsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoInNlY3Rpb24vLi8vKiIpKQorICAgIFsndGFnJywgJ25leHR0YWcnLCAnbmV4dHNlY3Rpb24nLCAndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIqLyoiKSkKKyAgICBbJ3RhZycsICduZXh0dGFnJywgJ25leHRzZWN0aW9uJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIqLy8qIikpCisgICAgWyd0YWcnLCAnbmV4dHRhZycsICduZXh0c2VjdGlvbicsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIiovdGFnIikpCisgICAgWyd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIiovLi90YWciKSkKKyAgICBbJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi90YWciKSkKKyAgICBbJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3RhZyIpKQorICAgIFsndGFnJywgJ3RhZycsICd0YWcnLCAndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuLy4vdGFnIikpCisgICAgWyd0YWcnLCAndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuLy90YWdbQGNsYXNzXSIpKQorICAgIFsndGFnJywgJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3RhZ1tAY2xhc3M9J2EnXSIpKQorICAgIFsndGFnJ10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCIuLy90YWdbQGNsYXNzPSdiJ10iKSkKKyAgICBbJ3RhZycsICd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3RhZ1tAaWRdIikpCisgICAgWyd0YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3NlY3Rpb25bdGFnXSIpKQorICAgIFsnc2VjdGlvbiddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi8vc2VjdGlvbltlbGVtZW50XSIpKQorICAgIFtdCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgiLi4vdGFnIikpCisgICAgW10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJzZWN0aW9uLy4uL3RhZyIpKQorICAgIFsndGFnJywgJ3RhZyddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmRhbGwoIi4vdGFnIikpCisgICAgWyd0YWcnLCAndGFnJ10KKworICAgIEZvbGxvd2luZyBleGFtcGxlIGlzIGludmFsaWQgaW4gMS4yLgorICAgIEEgbGVhZGluZyAnKicgaXMgYXNzdW1lZCBpbiAxLjMuCisKKyAgICA+Pj4gZWxlbS5maW5kYWxsKCJzZWN0aW9uLy8iKSA9PSBlbGVtLmZpbmRhbGwoInNlY3Rpb24vLyoiKQorICAgIFRydWUKKworICAgIEVUJ3MgUGF0aCBtb2R1bGUgaGFuZGxlcyB0aGlzIGNhc2UgaW5jb3JyZWN0bHk7IHRoaXMgZ2l2ZXMKKyAgICBhIHdhcm5pbmcgaW4gMS4zLCBhbmQgdGhlIGJlaGF2aW91ciB3aWxsIGJlIG1vZGlmaWVkIGluIDEuNC4KKworICAgID4+PiBzdW1tYXJpemVfbGlzdChFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kYWxsKCIvdGFnIikpCisgICAgWyd0YWcnLCAndGFnJ10KKworICAgID4+PiBlbGVtID0gRVQuWE1MKFNBTVBMRV9YTUxfTlMpCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGVsZW0uZmluZGFsbCgidGFnIikpCisgICAgW10KKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZWxlbS5maW5kYWxsKCJ7aHR0cDovL2VmZmJvdC5vcmcvbnN9dGFnIikpCisgICAgWyd7aHR0cDovL2VmZmJvdC5vcmcvbnN9dGFnJywgJ3todHRwOi8vZWZmYm90Lm9yZy9uc310YWcnXQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtLmZpbmRhbGwoIi4vL3todHRwOi8vZWZmYm90Lm9yZy9uc310YWciKSkKKyAgICBbJ3todHRwOi8vZWZmYm90Lm9yZy9uc310YWcnLCAne2h0dHA6Ly9lZmZib3Qub3JnL25zfXRhZycsICd7aHR0cDovL2VmZmJvdC5vcmcvbnN9dGFnJ10KKyAgICAiIiIKKworZGVmIGZpbGVfaW5pdCgpOgorICAgICIiIgorICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKworICAgID4+PiBzdHJpbmdmaWxlID0gU3RyaW5nSU8uU3RyaW5nSU8oU0FNUExFX1hNTCkKKyAgICA+Pj4gdHJlZSA9IEVULkVsZW1lbnRUcmVlKGZpbGU9c3RyaW5nZmlsZSkKKyAgICA+Pj4gdHJlZS5maW5kKCJ0YWciKS50YWcKKyAgICAndGFnJworICAgID4+PiB0cmVlLmZpbmQoInNlY3Rpb24vdGFnIikudGFnCisgICAgJ3RhZycKKworICAgID4+PiB0cmVlID0gRVQuRWxlbWVudFRyZWUoZmlsZT1TSU1QTEVfWE1MRklMRSkKKyAgICA+Pj4gdHJlZS5maW5kKCJlbGVtZW50IikudGFnCisgICAgJ2VsZW1lbnQnCisgICAgPj4+IHRyZWUuZmluZCgiZWxlbWVudC8uLi9lbXB0eS1lbGVtZW50IikudGFnCisgICAgJ2VtcHR5LWVsZW1lbnQnCisgICAgIiIiCisKK2RlZiBiYWRfZmluZCgpOgorICAgICIiIgorICAgIENoZWNrIGJhZCBvciB1bnN1cHBvcnRlZCBwYXRoIGV4cHJlc3Npb25zLgorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTCkKKyAgICA+Pj4gZWxlbS5maW5kYWxsKCIvdGFnIikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgU3ludGF4RXJyb3I6IGNhbm5vdCB1c2UgYWJzb2x1dGUgcGF0aCBvbiBlbGVtZW50CisgICAgIiIiCisKK2RlZiBwYXRoX2NhY2hlKCk6CisgICAgIiIiCisgICAgQ2hlY2sgdGhhdCB0aGUgcGF0aCBjYWNoZSBiZWhhdmVzIHNhbmVseS4KKworICAgID4+PiBlbGVtID0gRVQuWE1MKFNBTVBMRV9YTUwpCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDEwKTogRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgnLi8nK3N0cihpKSkKKyAgICA+Pj4gY2FjaGVfbGVuXzEwID0gbGVuKEVULkVsZW1lbnRQYXRoLl9jYWNoZSkKKyAgICA+Pj4gZm9yIGkgaW4gcmFuZ2UoMTApOiBFVC5FbGVtZW50VHJlZShlbGVtKS5maW5kKCcuLycrc3RyKGkpKQorICAgID4+PiBsZW4oRVQuRWxlbWVudFBhdGguX2NhY2hlKSA9PSBjYWNoZV9sZW5fMTAKKyAgICBUcnVlCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDIwKTogRVQuRWxlbWVudFRyZWUoZWxlbSkuZmluZCgnLi8nK3N0cihpKSkKKyAgICA+Pj4gbGVuKEVULkVsZW1lbnRQYXRoLl9jYWNoZSkgPiBjYWNoZV9sZW5fMTAKKyAgICBUcnVlCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDYwMCk6IEVULkVsZW1lbnRUcmVlKGVsZW0pLmZpbmQoJy4vJytzdHIoaSkpCisgICAgPj4+IGxlbihFVC5FbGVtZW50UGF0aC5fY2FjaGUpIDwgNTAwCisgICAgVHJ1ZQorICAgICIiIgorCitkZWYgY29weSgpOgorICAgICIiIgorICAgIFRlc3QgY29weSBoYW5kbGluZyAoZXRjKS4KKworICAgID4+PiBpbXBvcnQgY29weQorICAgID4+PiBlMSA9IEVULlhNTCgiPHRhZz5oZWxsbzxmb28vPjwvdGFnPiIpCisgICAgPj4+IGUyID0gY29weS5jb3B5KGUxKQorICAgID4+PiBlMyA9IGNvcHkuZGVlcGNvcHkoZTEpCisgICAgPj4+IGUxLmZpbmQoImZvbyIpLnRhZyA9ICJiYXIiCisgICAgPj4+IHNlcmlhbGl6ZShlMSkKKyAgICAnPHRhZz5oZWxsbzxiYXIgLz48L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlMikKKyAgICAnPHRhZz5oZWxsbzxiYXIgLz48L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlMykKKyAgICAnPHRhZz5oZWxsbzxmb28gLz48L3RhZz4nCisKKyAgICAiIiIKKworZGVmIGF0dHJpYigpOgorICAgICIiIgorICAgIFRlc3QgYXR0cmlidXRlIGhhbmRsaW5nLgorCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJ0YWciKQorICAgID4+PiBlbGVtLmdldCgia2V5IikgIyAxLjEKKyAgICA+Pj4gZWxlbS5nZXQoImtleSIsICJkZWZhdWx0IikgIyAxLjIKKyAgICAnZGVmYXVsdCcKKyAgICA+Pj4gZWxlbS5zZXQoImtleSIsICJ2YWx1ZSIpCisgICAgPj4+IGVsZW0uZ2V0KCJrZXkiKSAjIDEuMworICAgICd2YWx1ZScKKworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgidGFnIiwga2V5PSJ2YWx1ZSIpCisgICAgPj4+IGVsZW0uZ2V0KCJrZXkiKSAjIDIuMQorICAgICd2YWx1ZScKKyAgICA+Pj4gZWxlbS5hdHRyaWIgIyAyLjIKKyAgICB7J2tleSc6ICd2YWx1ZSd9CisKKyAgICA+Pj4gYXR0cmliID0geyJrZXkiOiAidmFsdWUifQorICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgidGFnIiwgYXR0cmliKQorICAgID4+PiBhdHRyaWIuY2xlYXIoKSAjIGNoZWNrIGZvciBhbGlhc2luZyBpc3N1ZXMKKyAgICA+Pj4gZWxlbS5nZXQoImtleSIpICMgMy4xCisgICAgJ3ZhbHVlJworICAgID4+PiBlbGVtLmF0dHJpYiAjIDMuMgorICAgIHsna2V5JzogJ3ZhbHVlJ30KKworICAgID4+PiBhdHRyaWIgPSB7ImtleSI6ICJ2YWx1ZSJ9CisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJ0YWciLCAqKmF0dHJpYikKKyAgICA+Pj4gYXR0cmliLmNsZWFyKCkgIyBjaGVjayBmb3IgYWxpYXNpbmcgaXNzdWVzCisgICAgPj4+IGVsZW0uZ2V0KCJrZXkiKSAjIDQuMQorICAgICd2YWx1ZScKKyAgICA+Pj4gZWxlbS5hdHRyaWIgIyA0LjIKKyAgICB7J2tleSc6ICd2YWx1ZSd9CisKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoInRhZyIsIHsia2V5IjogIm90aGVyIn0sIGtleT0idmFsdWUiKQorICAgID4+PiBlbGVtLmdldCgia2V5IikgIyA1LjEKKyAgICAndmFsdWUnCisgICAgPj4+IGVsZW0uYXR0cmliICMgNS4yCisgICAgeydrZXknOiAndmFsdWUnfQorCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCd0ZXN0JykKKyAgICA+Pj4gZWxlbS50ZXh0ID0gImFhIgorICAgID4+PiBlbGVtLnNldCgndGVzdGEnLCAndGVzdHZhbCcpCisgICAgPj4+IGVsZW0uc2V0KCd0ZXN0YicsICd0ZXN0MicpCisgICAgPj4+IEVULnRvc3RyaW5nKGVsZW0pCisgICAgJzx0ZXN0IHRlc3RhPSJ0ZXN0dmFsIiB0ZXN0Yj0idGVzdDIiPmFhPC90ZXN0PicKKyAgICA+Pj4gc29ydGVkKGVsZW0ua2V5cygpKQorICAgIFsndGVzdGEnLCAndGVzdGInXQorICAgID4+PiBzb3J0ZWQoZWxlbS5pdGVtcygpKQorICAgIFsoJ3Rlc3RhJywgJ3Rlc3R2YWwnKSwgKCd0ZXN0YicsICd0ZXN0MicpXQorICAgID4+PiBlbGVtLmF0dHJpYlsndGVzdGInXQorICAgICd0ZXN0MicKKyAgICA+Pj4gZWxlbS5hdHRyaWJbJ3Rlc3RiJ10gPSAndGVzdDEnCisgICAgPj4+IGVsZW0uYXR0cmliWyd0ZXN0YyddID0gJ3Rlc3QyJworICAgID4+PiBFVC50b3N0cmluZyhlbGVtKQorICAgICc8dGVzdCB0ZXN0YT0idGVzdHZhbCIgdGVzdGI9InRlc3QxIiB0ZXN0Yz0idGVzdDIiPmFhPC90ZXN0PicKKyAgICAiIiIKKworZGVmIG1ha2VlbGVtZW50KCk6CisgICAgIiIiCisgICAgVGVzdCBtYWtlZWxlbWVudCBoYW5kbGluZy4KKworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgidGFnIikKKyAgICA+Pj4gYXR0cmliID0geyJrZXkiOiAidmFsdWUifQorICAgID4+PiBzdWJlbGVtID0gZWxlbS5tYWtlZWxlbWVudCgic3VidGFnIiwgYXR0cmliKQorICAgID4+PiBpZiBzdWJlbGVtLmF0dHJpYiBpcyBhdHRyaWI6CisgICAgLi4uICAgICBwcmludCAiYXR0cmliIGFsaWFzaW5nIgorICAgID4+PiBlbGVtLmFwcGVuZChzdWJlbGVtKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZz48c3VidGFnIGtleT0idmFsdWUiIC8+PC90YWc+JworCisgICAgPj4+IGVsZW0uY2xlYXIoKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZyAvPicKKyAgICA+Pj4gZWxlbS5hcHBlbmQoc3ViZWxlbSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWc+PHN1YnRhZyBrZXk9InZhbHVlIiAvPjwvdGFnPicKKyAgICA+Pj4gZWxlbS5leHRlbmQoW3N1YmVsZW0sIHN1YmVsZW1dKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZz48c3VidGFnIGtleT0idmFsdWUiIC8+PHN1YnRhZyBrZXk9InZhbHVlIiAvPjxzdWJ0YWcga2V5PSJ2YWx1ZSIgLz48L3RhZz4nCisgICAgPj4+IGVsZW1bOl0gPSBbc3ViZWxlbV0KKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWc+PHN1YnRhZyBrZXk9InZhbHVlIiAvPjwvdGFnPicKKyAgICA+Pj4gZWxlbVs6XSA9IHR1cGxlKFtzdWJlbGVtXSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWc+PHN1YnRhZyBrZXk9InZhbHVlIiAvPjwvdGFnPicKKworICAgICIiIgorCitkZWYgcGFyc2VmaWxlKCk6CisgICAgIiIiCisgICAgVGVzdCBwYXJzaW5nIGZyb20gZmlsZS4KKworICAgID4+PiB0cmVlID0gRVQucGFyc2UoU0lNUExFX1hNTEZJTEUpCisgICAgPj4+IG5vcm1hbGl6ZV9jcmxmKHRyZWUpCisgICAgPj4+IHRyZWUud3JpdGUoc3lzLnN0ZG91dCkKKyAgICA8cm9vdD4KKyAgICAgICA8ZWxlbWVudCBrZXk9InZhbHVlIj50ZXh0PC9lbGVtZW50PgorICAgICAgIDxlbGVtZW50PnRleHQ8L2VsZW1lbnQ+dGFpbAorICAgICAgIDxlbXB0eS1lbGVtZW50IC8+CisgICAgPC9yb290PgorICAgID4+PiB0cmVlID0gRVQucGFyc2UoU0lNUExFX05TX1hNTEZJTEUpCisgICAgPj4+IG5vcm1hbGl6ZV9jcmxmKHRyZWUpCisgICAgPj4+IHRyZWUud3JpdGUoc3lzLnN0ZG91dCkKKyAgICA8bnMwOnJvb3QgeG1sbnM6bnMwPSJuYW1lc3BhY2UiPgorICAgICAgIDxuczA6ZWxlbWVudCBrZXk9InZhbHVlIj50ZXh0PC9uczA6ZWxlbWVudD4KKyAgICAgICA8bnMwOmVsZW1lbnQ+dGV4dDwvbnMwOmVsZW1lbnQ+dGFpbAorICAgICAgIDxuczA6ZW1wdHktZWxlbWVudCAvPgorICAgIDwvbnMwOnJvb3Q+CisKKyAgICA+Pj4gd2l0aCBvcGVuKFNJTVBMRV9YTUxGSUxFKSBhcyBmOgorICAgIC4uLiAgICAgZGF0YSA9IGYucmVhZCgpCisKKyAgICA+Pj4gcGFyc2VyID0gRVQuWE1MUGFyc2VyKCkKKyAgICA+Pj4gcGFyc2VyLnZlcnNpb24gICMgZG9jdGVzdDogK0VMTElQU0lTCisgICAgJ0V4cGF0IC4uLicKKyAgICA+Pj4gcGFyc2VyLmZlZWQoZGF0YSkKKyAgICA+Pj4gcHJpbnQgc2VyaWFsaXplKHBhcnNlci5jbG9zZSgpKQorICAgIDxyb290PgorICAgICAgIDxlbGVtZW50IGtleT0idmFsdWUiPnRleHQ8L2VsZW1lbnQ+CisgICAgICAgPGVsZW1lbnQ+dGV4dDwvZWxlbWVudD50YWlsCisgICAgICAgPGVtcHR5LWVsZW1lbnQgLz4KKyAgICA8L3Jvb3Q+CisKKyAgICA+Pj4gcGFyc2VyID0gRVQuWE1MVHJlZUJ1aWxkZXIoKSAjIDEuMiBjb21wYXRpYmlsaXR5CisgICAgPj4+IHBhcnNlci5mZWVkKGRhdGEpCisgICAgPj4+IHByaW50IHNlcmlhbGl6ZShwYXJzZXIuY2xvc2UoKSkKKyAgICA8cm9vdD4KKyAgICAgICA8ZWxlbWVudCBrZXk9InZhbHVlIj50ZXh0PC9lbGVtZW50PgorICAgICAgIDxlbGVtZW50PnRleHQ8L2VsZW1lbnQ+dGFpbAorICAgICAgIDxlbXB0eS1lbGVtZW50IC8+CisgICAgPC9yb290PgorCisgICAgPj4+IHRhcmdldCA9IEVULlRyZWVCdWlsZGVyKCkKKyAgICA+Pj4gcGFyc2VyID0gRVQuWE1MUGFyc2VyKHRhcmdldD10YXJnZXQpCisgICAgPj4+IHBhcnNlci5mZWVkKGRhdGEpCisgICAgPj4+IHByaW50IHNlcmlhbGl6ZShwYXJzZXIuY2xvc2UoKSkKKyAgICA8cm9vdD4KKyAgICAgICA8ZWxlbWVudCBrZXk9InZhbHVlIj50ZXh0PC9lbGVtZW50PgorICAgICAgIDxlbGVtZW50PnRleHQ8L2VsZW1lbnQ+dGFpbAorICAgICAgIDxlbXB0eS1lbGVtZW50IC8+CisgICAgPC9yb290PgorICAgICIiIgorCitkZWYgcGFyc2VsaXRlcmFsKCk6CisgICAgIiIiCisgICAgPj4+IGVsZW1lbnQgPSBFVC5YTUwoIjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIpCisgICAgPj4+IEVULkVsZW1lbnRUcmVlKGVsZW1lbnQpLndyaXRlKHN5cy5zdGRvdXQpCisgICAgPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+CisgICAgPj4+IGVsZW1lbnQgPSBFVC5mcm9tc3RyaW5nKCI8aHRtbD48Ym9keT50ZXh0PC9ib2R5PjwvaHRtbD4iKQorICAgID4+PiBFVC5FbGVtZW50VHJlZShlbGVtZW50KS53cml0ZShzeXMuc3Rkb3V0KQorICAgIDxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPgorICAgID4+PiBzZXF1ZW5jZSA9IFsiPGh0bWw+PGJvZHk+IiwgInRleHQ8L2JvIiwgImR5PjwvaHRtbD4iXQorICAgID4+PiBlbGVtZW50ID0gRVQuZnJvbXN0cmluZ2xpc3Qoc2VxdWVuY2UpCisgICAgPj4+IHByaW50IEVULnRvc3RyaW5nKGVsZW1lbnQpCisgICAgPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+CisgICAgPj4+IHByaW50ICIiLmpvaW4oRVQudG9zdHJpbmdsaXN0KGVsZW1lbnQpKQorICAgIDxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPgorICAgID4+PiBFVC50b3N0cmluZyhlbGVtZW50LCAiYXNjaWkiKQorICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdhc2NpaSc/PlxcbjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIKKyAgICA+Pj4gXywgaWRzID0gRVQuWE1MSUQoIjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIpCisgICAgPj4+IGxlbihpZHMpCisgICAgMAorICAgID4+PiBfLCBpZHMgPSBFVC5YTUxJRCgiPGh0bWw+PGJvZHkgaWQ9J2JvZHknPnRleHQ8L2JvZHk+PC9odG1sPiIpCisgICAgPj4+IGxlbihpZHMpCisgICAgMQorICAgID4+PiBpZHNbImJvZHkiXS50YWcKKyAgICAnYm9keScKKyAgICAiIiIKKworZGVmIGl0ZXJwYXJzZSgpOgorICAgICIiIgorICAgIFRlc3QgaXRlcnBhcnNlIGludGVyZmFjZS4KKworICAgID4+PiBpdGVycGFyc2UgPSBFVC5pdGVycGFyc2UKKworICAgID4+PiBjb250ZXh0ID0gaXRlcnBhcnNlKFNJTVBMRV9YTUxGSUxFKQorICAgID4+PiBhY3Rpb24sIGVsZW0gPSBuZXh0KGNvbnRleHQpCisgICAgPj4+IHByaW50IGFjdGlvbiwgZWxlbS50YWcKKyAgICBlbmQgZWxlbWVudAorICAgID4+PiBmb3IgYWN0aW9uLCBlbGVtIGluIGNvbnRleHQ6CisgICAgLi4uICAgcHJpbnQgYWN0aW9uLCBlbGVtLnRhZworICAgIGVuZCBlbGVtZW50CisgICAgZW5kIGVtcHR5LWVsZW1lbnQKKyAgICBlbmQgcm9vdAorICAgID4+PiBjb250ZXh0LnJvb3QudGFnCisgICAgJ3Jvb3QnCisKKyAgICA+Pj4gY29udGV4dCA9IGl0ZXJwYXJzZShTSU1QTEVfTlNfWE1MRklMRSkKKyAgICA+Pj4gZm9yIGFjdGlvbiwgZWxlbSBpbiBjb250ZXh0OgorICAgIC4uLiAgIHByaW50IGFjdGlvbiwgZWxlbS50YWcKKyAgICBlbmQge25hbWVzcGFjZX1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9ZWxlbWVudAorICAgIGVuZCB7bmFtZXNwYWNlfWVtcHR5LWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1yb290CisKKyAgICA+Pj4gZXZlbnRzID0gKCkKKyAgICA+Pj4gY29udGV4dCA9IGl0ZXJwYXJzZShTSU1QTEVfWE1MRklMRSwgZXZlbnRzKQorICAgID4+PiBmb3IgYWN0aW9uLCBlbGVtIGluIGNvbnRleHQ6CisgICAgLi4uICAgcHJpbnQgYWN0aW9uLCBlbGVtLnRhZworCisgICAgPj4+IGV2ZW50cyA9ICgpCisgICAgPj4+IGNvbnRleHQgPSBpdGVycGFyc2UoU0lNUExFX1hNTEZJTEUsIGV2ZW50cz1ldmVudHMpCisgICAgPj4+IGZvciBhY3Rpb24sIGVsZW0gaW4gY29udGV4dDoKKyAgICAuLi4gICBwcmludCBhY3Rpb24sIGVsZW0udGFnCisKKyAgICA+Pj4gZXZlbnRzID0gKCJzdGFydCIsICJlbmQiKQorICAgID4+PiBjb250ZXh0ID0gaXRlcnBhcnNlKFNJTVBMRV9YTUxGSUxFLCBldmVudHMpCisgICAgPj4+IGZvciBhY3Rpb24sIGVsZW0gaW4gY29udGV4dDoKKyAgICAuLi4gICBwcmludCBhY3Rpb24sIGVsZW0udGFnCisgICAgc3RhcnQgcm9vdAorICAgIHN0YXJ0IGVsZW1lbnQKKyAgICBlbmQgZWxlbWVudAorICAgIHN0YXJ0IGVsZW1lbnQKKyAgICBlbmQgZWxlbWVudAorICAgIHN0YXJ0IGVtcHR5LWVsZW1lbnQKKyAgICBlbmQgZW1wdHktZWxlbWVudAorICAgIGVuZCByb290CisKKyAgICA+Pj4gZXZlbnRzID0gKCJzdGFydCIsICJlbmQiLCAic3RhcnQtbnMiLCAiZW5kLW5zIikKKyAgICA+Pj4gY29udGV4dCA9IGl0ZXJwYXJzZShTSU1QTEVfTlNfWE1MRklMRSwgZXZlbnRzKQorICAgID4+PiBmb3IgYWN0aW9uLCBlbGVtIGluIGNvbnRleHQ6CisgICAgLi4uICAgaWYgYWN0aW9uIGluICgic3RhcnQiLCAiZW5kIik6CisgICAgLi4uICAgICBwcmludCBhY3Rpb24sIGVsZW0udGFnCisgICAgLi4uICAgZWxzZToKKyAgICAuLi4gICAgIHByaW50IGFjdGlvbiwgZWxlbQorICAgIHN0YXJ0LW5zICgnJywgJ25hbWVzcGFjZScpCisgICAgc3RhcnQge25hbWVzcGFjZX1yb290CisgICAgc3RhcnQge25hbWVzcGFjZX1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9ZWxlbWVudAorICAgIHN0YXJ0IHtuYW1lc3BhY2V9ZWxlbWVudAorICAgIGVuZCB7bmFtZXNwYWNlfWVsZW1lbnQKKyAgICBzdGFydCB7bmFtZXNwYWNlfWVtcHR5LWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1lbXB0eS1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9cm9vdAorICAgIGVuZC1ucyBOb25lCisKKyAgICA+Pj4gZXZlbnRzID0gKCJzdGFydCIsICJlbmQiLCAiYm9ndXMiKQorICAgID4+PiB3aXRoIG9wZW4oU0lNUExFX1hNTEZJTEUsICJyYiIpIGFzIGY6CisgICAgLi4uICAgICBpdGVycGFyc2UoZiwgZXZlbnRzKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiB1bmtub3duIGV2ZW50ICdib2d1cycKKworICAgID4+PiBpbXBvcnQgU3RyaW5nSU8KKworICAgID4+PiBzb3VyY2UgPSBTdHJpbmdJTy5TdHJpbmdJTygKKyAgICAuLi4gICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+XFxuIgorICAgIC4uLiAgICAgIjxib2R5IHhtbG5zPSdodHRwOi8vJiMyMzM7ZmZib3Qub3JnL25zJ1xcbiIKKyAgICAuLi4gICAgICIgICAgICB4bWxuczpjbFxceGU5PSdodHRwOi8vZWZmYm90Lm9yZy9ucyc+dGV4dDwvYm9keT5cXG4iKQorICAgID4+PiBldmVudHMgPSAoInN0YXJ0LW5zIiwpCisgICAgPj4+IGNvbnRleHQgPSBpdGVycGFyc2Uoc291cmNlLCBldmVudHMpCisgICAgPj4+IGZvciBhY3Rpb24sIGVsZW0gaW4gY29udGV4dDoKKyAgICAuLi4gICAgIHByaW50IGFjdGlvbiwgZWxlbQorICAgIHN0YXJ0LW5zICgnJywgdSdodHRwOi8vXFx4ZTlmZmJvdC5vcmcvbnMnKQorICAgIHN0YXJ0LW5zICh1J2NsXFx4ZTknLCAnaHR0cDovL2VmZmJvdC5vcmcvbnMnKQorCisgICAgPj4+IHNvdXJjZSA9IFN0cmluZ0lPLlN0cmluZ0lPKCI8ZG9jdW1lbnQgLz5qdW5rIikKKyAgICA+Pj4gdHJ5OgorICAgIC4uLiAgIGZvciBhY3Rpb24sIGVsZW0gaW4gaXRlcnBhcnNlKHNvdXJjZSk6CisgICAgLi4uICAgICBwcmludCBhY3Rpb24sIGVsZW0udGFnCisgICAgLi4uIGV4Y2VwdCBFVC5QYXJzZUVycm9yLCB2OgorICAgIC4uLiAgIHByaW50IHYKKyAgICBlbmQgZG9jdW1lbnQKKyAgICBqdW5rIGFmdGVyIGRvY3VtZW50IGVsZW1lbnQ6IGxpbmUgMSwgY29sdW1uIDEyCisgICAgIiIiCisKK2RlZiB3cml0ZWZpbGUoKToKKyAgICAiIiIKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoInRhZyIpCisgICAgPj4+IGVsZW0udGV4dCA9ICJ0ZXh0IgorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZz50ZXh0PC90YWc+JworICAgID4+PiBFVC5TdWJFbGVtZW50KGVsZW0sICJzdWJ0YWciKS50ZXh0ID0gInN1YnRleHQiCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnPnRleHQ8c3VidGFnPnN1YnRleHQ8L3N1YnRhZz48L3RhZz4nCisKKyAgICBUZXN0IHRhZyBzdXBwcmVzc2lvbgorICAgID4+PiBlbGVtLnRhZyA9IE5vbmUKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJ3RleHQ8c3VidGFnPnN1YnRleHQ8L3N1YnRhZz4nCisgICAgPj4+IGVsZW0uaW5zZXJ0KDAsIEVULkNvbW1lbnQoImNvbW1lbnQiKSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICAgICAjIGFzc3VtZXMgMS4zCisgICAgJ3RleHQ8IS0tY29tbWVudC0tPjxzdWJ0YWc+c3VidGV4dDwvc3VidGFnPicKKyAgICA+Pj4gZWxlbVswXSA9IEVULlBJKCJrZXkiLCAidmFsdWUiKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAndGV4dDw/a2V5IHZhbHVlPz48c3VidGFnPnN1YnRleHQ8L3N1YnRhZz4nCisgICAgIiIiCisKK2RlZiBjdXN0b21fYnVpbGRlcigpOgorICAgICIiIgorICAgIFRlc3QgcGFyc2VyIHcuIGN1c3RvbSBidWlsZGVyLgorCisgICAgPj4+IHdpdGggb3BlbihTSU1QTEVfWE1MRklMRSkgYXMgZjoKKyAgICAuLi4gICAgIGRhdGEgPSBmLnJlYWQoKQorICAgID4+PiBjbGFzcyBCdWlsZGVyOgorICAgIC4uLiAgICAgZGVmIHN0YXJ0KHNlbGYsIHRhZywgYXR0cmliKToKKyAgICAuLi4gICAgICAgICBwcmludCAic3RhcnQiLCB0YWcKKyAgICAuLi4gICAgIGRlZiBlbmQoc2VsZiwgdGFnKToKKyAgICAuLi4gICAgICAgICBwcmludCAiZW5kIiwgdGFnCisgICAgLi4uICAgICBkZWYgZGF0YShzZWxmLCB0ZXh0KToKKyAgICAuLi4gICAgICAgICBwYXNzCisgICAgPj4+IGJ1aWxkZXIgPSBCdWlsZGVyKCkKKyAgICA+Pj4gcGFyc2VyID0gRVQuWE1MUGFyc2VyKHRhcmdldD1idWlsZGVyKQorICAgID4+PiBwYXJzZXIuZmVlZChkYXRhKQorICAgIHN0YXJ0IHJvb3QKKyAgICBzdGFydCBlbGVtZW50CisgICAgZW5kIGVsZW1lbnQKKyAgICBzdGFydCBlbGVtZW50CisgICAgZW5kIGVsZW1lbnQKKyAgICBzdGFydCBlbXB0eS1lbGVtZW50CisgICAgZW5kIGVtcHR5LWVsZW1lbnQKKyAgICBlbmQgcm9vdAorCisgICAgPj4+IHdpdGggb3BlbihTSU1QTEVfTlNfWE1MRklMRSkgYXMgZjoKKyAgICAuLi4gICAgIGRhdGEgPSBmLnJlYWQoKQorICAgID4+PiBjbGFzcyBCdWlsZGVyOgorICAgIC4uLiAgICAgZGVmIHN0YXJ0KHNlbGYsIHRhZywgYXR0cmliKToKKyAgICAuLi4gICAgICAgICBwcmludCAic3RhcnQiLCB0YWcKKyAgICAuLi4gICAgIGRlZiBlbmQoc2VsZiwgdGFnKToKKyAgICAuLi4gICAgICAgICBwcmludCAiZW5kIiwgdGFnCisgICAgLi4uICAgICBkZWYgZGF0YShzZWxmLCB0ZXh0KToKKyAgICAuLi4gICAgICAgICBwYXNzCisgICAgLi4uICAgICBkZWYgcGkoc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAuLi4gICAgICAgICBwcmludCAicGkiLCB0YXJnZXQsIHJlcHIoZGF0YSkKKyAgICAuLi4gICAgIGRlZiBjb21tZW50KHNlbGYsIGRhdGEpOgorICAgIC4uLiAgICAgICAgIHByaW50ICJjb21tZW50IiwgcmVwcihkYXRhKQorICAgID4+PiBidWlsZGVyID0gQnVpbGRlcigpCisgICAgPj4+IHBhcnNlciA9IEVULlhNTFBhcnNlcih0YXJnZXQ9YnVpbGRlcikKKyAgICA+Pj4gcGFyc2VyLmZlZWQoZGF0YSkKKyAgICBwaSBwaSAnZGF0YScKKyAgICBjb21tZW50ICcgY29tbWVudCAnCisgICAgc3RhcnQge25hbWVzcGFjZX1yb290CisgICAgc3RhcnQge25hbWVzcGFjZX1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9ZWxlbWVudAorICAgIHN0YXJ0IHtuYW1lc3BhY2V9ZWxlbWVudAorICAgIGVuZCB7bmFtZXNwYWNlfWVsZW1lbnQKKyAgICBzdGFydCB7bmFtZXNwYWNlfWVtcHR5LWVsZW1lbnQKKyAgICBlbmQge25hbWVzcGFjZX1lbXB0eS1lbGVtZW50CisgICAgZW5kIHtuYW1lc3BhY2V9cm9vdAorCisgICAgIiIiCisKK2RlZiBnZXRjaGlsZHJlbigpOgorICAgICIiIgorICAgIFRlc3QgRWxlbWVudC5nZXRjaGlsZHJlbigpCisKKyAgICA+Pj4gd2l0aCBvcGVuKFNJTVBMRV9YTUxGSUxFLCAiciIpIGFzIGY6CisgICAgLi4uICAgICB0cmVlID0gRVQucGFyc2UoZikKKyAgICA+Pj4gZm9yIGVsZW0gaW4gdHJlZS5nZXRyb290KCkuaXRlcigpOgorICAgIC4uLiAgICAgc3VtbWFyaXplX2xpc3QoZWxlbS5nZXRjaGlsZHJlbigpKQorICAgIFsnZWxlbWVudCcsICdlbGVtZW50JywgJ2VtcHR5LWVsZW1lbnQnXQorICAgIFtdCisgICAgW10KKyAgICBbXQorICAgID4+PiBmb3IgZWxlbSBpbiB0cmVlLmdldGl0ZXJhdG9yKCk6CisgICAgLi4uICAgICBzdW1tYXJpemVfbGlzdChlbGVtLmdldGNoaWxkcmVuKCkpCisgICAgWydlbGVtZW50JywgJ2VsZW1lbnQnLCAnZW1wdHktZWxlbWVudCddCisgICAgW10KKyAgICBbXQorICAgIFtdCisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTChTQU1QTEVfWE1MKQorICAgID4+PiBsZW4oZWxlbS5nZXRjaGlsZHJlbigpKQorICAgIDMKKyAgICA+Pj4gbGVuKGVsZW1bMl0uZ2V0Y2hpbGRyZW4oKSkKKyAgICAxCisgICAgPj4+IGVsZW1bOl0gPT0gZWxlbS5nZXRjaGlsZHJlbigpCisgICAgVHJ1ZQorICAgID4+PiBjaGlsZDEgPSBlbGVtWzBdCisgICAgPj4+IGNoaWxkMiA9IGVsZW1bMl0KKyAgICA+Pj4gZGVsIGVsZW1bMToyXQorICAgID4+PiBsZW4oZWxlbS5nZXRjaGlsZHJlbigpKQorICAgIDIKKyAgICA+Pj4gY2hpbGQxID09IGVsZW1bMF0KKyAgICBUcnVlCisgICAgPj4+IGNoaWxkMiA9PSBlbGVtWzFdCisgICAgVHJ1ZQorICAgID4+PiBlbGVtWzA6Ml0gPSBbY2hpbGQyLCBjaGlsZDFdCisgICAgPj4+IGNoaWxkMiA9PSBlbGVtWzBdCisgICAgVHJ1ZQorICAgID4+PiBjaGlsZDEgPT0gZWxlbVsxXQorICAgIFRydWUKKyAgICA+Pj4gY2hpbGQxID09IGVsZW1bMF0KKyAgICBGYWxzZQorICAgID4+PiBlbGVtLmNsZWFyKCkKKyAgICA+Pj4gZWxlbS5nZXRjaGlsZHJlbigpCisgICAgW10KKyAgICAiIiIKKworZGVmIHdyaXRlc3RyaW5nKCk6CisgICAgIiIiCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoIjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIpCisgICAgPj4+IEVULnRvc3RyaW5nKGVsZW0pCisgICAgJzxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPicKKyAgICA+Pj4gZWxlbSA9IEVULmZyb21zdHJpbmcoIjxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPiIpCisgICAgPj4+IEVULnRvc3RyaW5nKGVsZW0pCisgICAgJzxodG1sPjxib2R5PnRleHQ8L2JvZHk+PC9odG1sPicKKyAgICAiIiIKKworZGVmIGNoZWNrX2VuY29kaW5nKGVuY29kaW5nKToKKyAgICAiIiIKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoImFzY2lpIikKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoInVzLWFzY2lpIikKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoImlzby04ODU5LTEiKQorICAgID4+PiBjaGVja19lbmNvZGluZygiaXNvLTg4NTktMTUiKQorICAgID4+PiBjaGVja19lbmNvZGluZygiY3A0MzciKQorICAgID4+PiBjaGVja19lbmNvZGluZygibWFjLXJvbWFuIikKKyAgICAiIiIKKyAgICBFVC5YTUwoIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9JyVzJz8+PHhtbCAvPiIgJSBlbmNvZGluZykKKworZGVmIGVuY29kaW5nKCk6CisgICAgciIiIgorICAgIFRlc3QgZW5jb2RpbmcgaXNzdWVzLgorCisgICAgPj4+IGVsZW0gPSBFVC5FbGVtZW50KCJ0YWciKQorICAgID4+PiBlbGVtLnRleHQgPSB1ImFiYyIKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pCisgICAgJzx0YWc+YWJjPC90YWc+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAnPHRhZz5hYmM8L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0idXMtYXNjaWkiKQorICAgICc8dGFnPmFiYzwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJpc28tODg1OS0xIikKKyAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/PlxuPHRhZz5hYmM8L3RhZz4iCisKKyAgICA+Pj4gZWxlbS50ZXh0ID0gIjwmXCJcJz4iCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnPiZsdDsmYW1wOyJcJyZndDs8L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0idXRmLTgiKQorICAgICc8dGFnPiZsdDsmYW1wOyJcJyZndDs8L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0idXMtYXNjaWkiKSAjIGNkYXRhIGNoYXJhY3RlcnMKKyAgICAnPHRhZz4mbHQ7JmFtcDsiXCcmZ3Q7PC90YWc+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9Imlzby04ODU5LTEiKQorICAgICc8P3htbCB2ZXJzaW9uPVwnMS4wXCcgZW5jb2Rpbmc9XCdpc28tODg1OS0xXCc/PlxuPHRhZz4mbHQ7JmFtcDsiXCcmZ3Q7PC90YWc+JworCisgICAgPj4+IGVsZW0uYXR0cmliWyJrZXkiXSA9ICI8JlwiXCc+IgorICAgID4+PiBlbGVtLnRleHQgPSBOb25lCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnIGtleT0iJmx0OyZhbXA7JnF1b3Q7XCcmZ3Q7IiAvPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJ1dGYtOCIpCisgICAgJzx0YWcga2V5PSImbHQ7JmFtcDsmcXVvdDtcJyZndDsiIC8+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9InVzLWFzY2lpIikKKyAgICAnPHRhZyBrZXk9IiZsdDsmYW1wOyZxdW90O1wnJmd0OyIgLz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0iaXNvLTg4NTktMSIpCisgICAgJzw/eG1sIHZlcnNpb249XCcxLjBcJyBlbmNvZGluZz1cJ2lzby04ODU5LTFcJz8+XG48dGFnIGtleT0iJmx0OyZhbXA7JnF1b3Q7XCcmZ3Q7IiAvPicKKworICAgID4+PiBlbGVtLnRleHQgPSB1J1x4ZTVceGY2XHhmNjw+JworICAgID4+PiBlbGVtLmF0dHJpYi5jbGVhcigpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKQorICAgICc8dGFnPiYjMjI5OyYjMjQ2OyYjMjQ2OyZsdDsmZ3Q7PC90YWc+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9InV0Zi04IikKKyAgICAnPHRhZz5ceGMzXHhhNVx4YzNceGI2XHhjM1x4YjYmbHQ7Jmd0OzwvdGFnPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJ1cy1hc2NpaSIpCisgICAgJzx0YWc+JiMyMjk7JiMyNDY7JiMyNDY7Jmx0OyZndDs8L3RhZz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0iaXNvLTg4NTktMSIpCisgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz5cbjx0YWc+XHhlNVx4ZjZceGY2Jmx0OyZndDs8L3RhZz4iCisKKyAgICA+Pj4gZWxlbS5hdHRyaWJbImtleSJdID0gdSdceGU1XHhmNlx4ZjY8PicKKyAgICA+Pj4gZWxlbS50ZXh0ID0gTm9uZQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkKKyAgICAnPHRhZyBrZXk9IiYjMjI5OyYjMjQ2OyYjMjQ2OyZsdDsmZ3Q7IiAvPicKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0sIGVuY29kaW5nPSJ1dGYtOCIpCisgICAgJzx0YWcga2V5PSJceGMzXHhhNVx4YzNceGI2XHhjM1x4YjYmbHQ7Jmd0OyIgLz4nCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtLCBlbmNvZGluZz0idXMtYXNjaWkiKQorICAgICc8dGFnIGtleT0iJiMyMjk7JiMyNDY7JiMyNDY7Jmx0OyZndDsiIC8+JworICAgID4+PiBzZXJpYWxpemUoZWxlbSwgZW5jb2Rpbmc9Imlzby04ODU5LTEiKQorICAgICc8P3htbCB2ZXJzaW9uPVwnMS4wXCcgZW5jb2Rpbmc9XCdpc28tODg1OS0xXCc/PlxuPHRhZyBrZXk9Ilx4ZTVceGY2XHhmNiZsdDsmZ3Q7IiAvPicKKyAgICAiIiIKKworZGVmIG1ldGhvZHMoKToKKyAgICByIiIiCisgICAgVGVzdCBzZXJpYWxpemF0aW9uIG1ldGhvZHMuCisKKyAgICA+Pj4gZSA9IEVULlhNTCgiPGh0bWw+PGxpbmsvPjxzY3JpcHQ+MSAmbHQ7IDI8L3NjcmlwdD48L2h0bWw+IikKKyAgICA+Pj4gZS50YWlsID0gIlxuIgorICAgID4+PiBzZXJpYWxpemUoZSkKKyAgICAnPGh0bWw+PGxpbmsgLz48c2NyaXB0PjEgJmx0OyAyPC9zY3JpcHQ+PC9odG1sPlxuJworICAgID4+PiBzZXJpYWxpemUoZSwgbWV0aG9kPU5vbmUpCisgICAgJzxodG1sPjxsaW5rIC8+PHNjcmlwdD4xICZsdDsgMjwvc2NyaXB0PjwvaHRtbD5cbicKKyAgICA+Pj4gc2VyaWFsaXplKGUsIG1ldGhvZD0ieG1sIikKKyAgICAnPGh0bWw+PGxpbmsgLz48c2NyaXB0PjEgJmx0OyAyPC9zY3JpcHQ+PC9odG1sPlxuJworICAgID4+PiBzZXJpYWxpemUoZSwgbWV0aG9kPSJodG1sIikKKyAgICAnPGh0bWw+PGxpbms+PHNjcmlwdD4xIDwgMjwvc2NyaXB0PjwvaHRtbD5cbicKKyAgICA+Pj4gc2VyaWFsaXplKGUsIG1ldGhvZD0idGV4dCIpCisgICAgJzEgPCAyXG4nCisgICAgIiIiCisKK2RlZiBpdGVyYXRvcnMoKToKKyAgICAiIiIKKyAgICBUZXN0IGl0ZXJhdG9ycy4KKworICAgID4+PiBlID0gRVQuWE1MKCI8aHRtbD48Ym9keT50aGlzIGlzIGEgPGk+cGFyYWdyYXBoPC9pPi48L2JvZHk+Li48L2h0bWw+IikKKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoZS5pdGVyKCkpCisgICAgWydodG1sJywgJ2JvZHknLCAnaSddCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGUuZmluZCgiYm9keSIpLml0ZXIoKSkKKyAgICBbJ2JvZHknLCAnaSddCisgICAgPj4+IHN1bW1hcml6ZShuZXh0KGUuaXRlcigpKSkKKyAgICAnaHRtbCcKKyAgICA+Pj4gIiIuam9pbihlLml0ZXJ0ZXh0KCkpCisgICAgJ3RoaXMgaXMgYSBwYXJhZ3JhcGguLi4nCisgICAgPj4+ICIiLmpvaW4oZS5maW5kKCJib2R5IikuaXRlcnRleHQoKSkKKyAgICAndGhpcyBpcyBhIHBhcmFncmFwaC4nCisgICAgPj4+IG5leHQoZS5pdGVydGV4dCgpKQorICAgICd0aGlzIGlzIGEgJworCisgICAgTWV0aG9kIGl0ZXJwYXJzZSBzaG91bGQgcmV0dXJuIGFuIGl0ZXJhdG9yLiBTZWUgYnVnIDY0NzIuCisKKyAgICA+Pj4gc291cmNlZmlsZSA9IHNlcmlhbGl6ZShlLCB0b19zdHJpbmc9RmFsc2UpCisgICAgPj4+IG5leHQoRVQuaXRlcnBhcnNlKHNvdXJjZWZpbGUpKSAgIyBkb2N0ZXN0OiArRUxMSVBTSVMKKyAgICAoJ2VuZCcsIDxFbGVtZW50ICdpJyBhdCAweC4uLj4pCisKKyAgICA+Pj4gdHJlZSA9IEVULkVsZW1lbnRUcmVlKE5vbmUpCisgICAgPj4+IHRyZWUuaXRlcigpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIEF0dHJpYnV0ZUVycm9yOiAnTm9uZVR5cGUnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdpdGVyJworICAgICIiIgorCitFTlRJVFlfWE1MID0gIiIiXAorPCFET0NUWVBFIHBvaW50cyBbCis8IUVOVElUWSAlIHVzZXItZW50aXRpZXMgU1lTVEVNICd1c2VyLWVudGl0aWVzLnhtbCc+CisldXNlci1lbnRpdGllczsKK10+Cis8ZG9jdW1lbnQ+JmVudGl0eTs8L2RvY3VtZW50PgorIiIiCisKK2RlZiBlbnRpdHkoKToKKyAgICAiIiIKKyAgICBUZXN0IGVudGl0eSBoYW5kbGluZy4KKworICAgIDEpIGdvb2QgZW50aXRpZXMKKworICAgID4+PiBlID0gRVQuWE1MKCI8ZG9jdW1lbnQgdGl0bGU9JyYjeDgyMzA7Jz50ZXN0PC9kb2N1bWVudD4iKQorICAgID4+PiBzZXJpYWxpemUoZSkKKyAgICAnPGRvY3VtZW50IHRpdGxlPSImIzMzMzI4OyI+dGVzdDwvZG9jdW1lbnQ+JworCisgICAgMikgYmFkIGVudGl0aWVzCisKKyAgICA+Pj4gRVQuWE1MKCI8ZG9jdW1lbnQ+JmVudGl0eTs8L2RvY3VtZW50PiIpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFBhcnNlRXJyb3I6IHVuZGVmaW5lZCBlbnRpdHk6IGxpbmUgMSwgY29sdW1uIDEwCisKKyAgICA+Pj4gRVQuWE1MKEVOVElUWV9YTUwpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFBhcnNlRXJyb3I6IHVuZGVmaW5lZCBlbnRpdHkgJmVudGl0eTs6IGxpbmUgNSwgY29sdW1uIDEwCisKKyAgICAzKSBjdXN0b20gZW50aXR5CisKKyAgICA+Pj4gcGFyc2VyID0gRVQuWE1MUGFyc2VyKCkKKyAgICA+Pj4gcGFyc2VyLmVudGl0eVsiZW50aXR5Il0gPSAidGV4dCIKKyAgICA+Pj4gcGFyc2VyLmZlZWQoRU5USVRZX1hNTCkKKyAgICA+Pj4gcm9vdCA9IHBhcnNlci5jbG9zZSgpCisgICAgPj4+IHNlcmlhbGl6ZShyb290KQorICAgICc8ZG9jdW1lbnQ+dGV4dDwvZG9jdW1lbnQ+JworICAgICIiIgorCitkZWYgZXJyb3IoeG1sKToKKyAgICAiIiIKKworICAgIFRlc3QgZXJyb3IgaGFuZGxpbmcuCisKKyAgICA+Pj4gaXNzdWJjbGFzcyhFVC5QYXJzZUVycm9yLCBTeW50YXhFcnJvcikKKyAgICBUcnVlCisgICAgPj4+IGVycm9yKCJmb28iKS5wb3NpdGlvbgorICAgICgxLCAwKQorICAgID4+PiBlcnJvcigiPHRhZz4mZm9vOzwvdGFnPiIpLnBvc2l0aW9uCisgICAgKDEsIDUpCisgICAgPj4+IGVycm9yKCJmb29iYXI8IikucG9zaXRpb24KKyAgICAoMSwgNikKKworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgRVQuWE1MKHhtbCkKKyAgICBleGNlcHQgRVQuUGFyc2VFcnJvcjoKKyAgICAgICAgcmV0dXJuIHN5cy5leGNfdmFsdWUKKworZGVmIG5hbWVzcGFjZSgpOgorICAgICIiIgorICAgIFRlc3QgbmFtZXNwYWNlIGlzc3Vlcy4KKworICAgIDEpIHhtbCBuYW1lc3BhY2UKKworICAgID4+PiBlbGVtID0gRVQuWE1MKCI8dGFnIHhtbDpsYW5nPSdlbicgLz4iKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAxLjEKKyAgICAnPHRhZyB4bWw6bGFuZz0iZW4iIC8+JworCisgICAgMikgb3RoZXIgIndlbGwta25vd24iIG5hbWVzcGFjZXMKKworICAgID4+PiBlbGVtID0gRVQuWE1MKCI8cmRmOlJERiB4bWxuczpyZGY9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMnIC8+IikKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMi4xCisgICAgJzxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIgLz4nCisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTCgiPGh0bWw6aHRtbCB4bWxuczpodG1sPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJyAvPiIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIDIuMgorICAgICc8aHRtbDpodG1sIHhtbG5zOmh0bWw9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiIC8+JworCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoIjxzb2FwOkVudmVsb3BlIHhtbG5zOnNvYXA9J2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW52ZWxvcGUnIC8+IikKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMi4zCisgICAgJzxuczA6RW52ZWxvcGUgeG1sbnM6bnMwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2VudmVsb3BlIiAvPicKKworICAgIDMpIHVua25vd24gbmFtZXNwYWNlcworICAgID4+PiBlbGVtID0gRVQuWE1MKFNBTVBMRV9YTUxfTlMpCisgICAgPj4+IHByaW50IHNlcmlhbGl6ZShlbGVtKQorICAgIDxuczA6Ym9keSB4bWxuczpuczA9Imh0dHA6Ly9lZmZib3Qub3JnL25zIj4KKyAgICAgIDxuczA6dGFnPnRleHQ8L25zMDp0YWc+CisgICAgICA8bnMwOnRhZyAvPgorICAgICAgPG5zMDpzZWN0aW9uPgorICAgICAgICA8bnMwOnRhZz5zdWJ0ZXh0PC9uczA6dGFnPgorICAgICAgPC9uczA6c2VjdGlvbj4KKyAgICA8L25zMDpib2R5PgorICAgICIiIgorCitkZWYgcW5hbWUoKToKKyAgICAiIiIKKyAgICBUZXN0IFFOYW1lIGhhbmRsaW5nLgorCisgICAgMSkgZGVjb3JhdGVkIHRhZ3MKKworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgie3VyaX10YWciKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAxLjEKKyAgICAnPG5zMDp0YWcgeG1sbnM6bnMwPSJ1cmkiIC8+JworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudChFVC5RTmFtZSgie3VyaX10YWciKSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMS4yCisgICAgJzxuczA6dGFnIHhtbG5zOm5zMD0idXJpIiAvPicKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoRVQuUU5hbWUoInVyaSIsICJ0YWciKSkKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMS4zCisgICAgJzxuczA6dGFnIHhtbG5zOm5zMD0idXJpIiAvPicKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoRVQuUU5hbWUoInVyaSIsICJ0YWciKSkKKyAgICA+Pj4gc3ViZWxlbSA9IEVULlN1YkVsZW1lbnQoZWxlbSwgRVQuUU5hbWUoInVyaSIsICJ0YWcxIikpCisgICAgPj4+IHN1YmVsZW0gPSBFVC5TdWJFbGVtZW50KGVsZW0sIEVULlFOYW1lKCJ1cmkiLCAidGFnMiIpKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyAxLjQKKyAgICAnPG5zMDp0YWcgeG1sbnM6bnMwPSJ1cmkiPjxuczA6dGFnMSAvPjxuczA6dGFnMiAvPjwvbnMwOnRhZz4nCisKKyAgICAyKSBkZWNvcmF0ZWQgYXR0cmlidXRlcworCisgICAgPj4+IGVsZW0uY2xlYXIoKQorICAgID4+PiBlbGVtLmF0dHJpYlsie3VyaX1rZXkiXSA9ICJ2YWx1ZSIKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMi4xCisgICAgJzxuczA6dGFnIHhtbG5zOm5zMD0idXJpIiBuczA6a2V5PSJ2YWx1ZSIgLz4nCisKKyAgICA+Pj4gZWxlbS5jbGVhcigpCisgICAgPj4+IGVsZW0uYXR0cmliW0VULlFOYW1lKCJ7dXJpfWtleSIpXSA9ICJ2YWx1ZSIKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMi4yCisgICAgJzxuczA6dGFnIHhtbG5zOm5zMD0idXJpIiBuczA6a2V5PSJ2YWx1ZSIgLz4nCisKKyAgICAzKSBkZWNvcmF0ZWQgdmFsdWVzIGFyZSBub3QgY29udmVydGVkIGJ5IGRlZmF1bHQsIGJ1dCB0aGUKKyAgICAgICBRTmFtZSB3cmFwcGVyIGNhbiBiZSB1c2VkIGZvciB2YWx1ZXMKKworICAgID4+PiBlbGVtLmNsZWFyKCkKKyAgICA+Pj4gZWxlbS5hdHRyaWJbInt1cml9a2V5Il0gPSAie3VyaX12YWx1ZSIKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgMy4xCisgICAgJzxuczA6dGFnIHhtbG5zOm5zMD0idXJpIiBuczA6a2V5PSJ7dXJpfXZhbHVlIiAvPicKKworICAgID4+PiBlbGVtLmNsZWFyKCkKKyAgICA+Pj4gZWxlbS5hdHRyaWJbInt1cml9a2V5Il0gPSBFVC5RTmFtZSgie3VyaX12YWx1ZSIpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIDMuMgorICAgICc8bnMwOnRhZyB4bWxuczpuczA9InVyaSIgbnMwOmtleT0ibnMwOnZhbHVlIiAvPicKKworICAgID4+PiBlbGVtLmNsZWFyKCkKKyAgICA+Pj4gc3ViZWxlbSA9IEVULkVsZW1lbnQoInRhZyIpCisgICAgPj4+IHN1YmVsZW0uYXR0cmliWyJ7dXJpMX1rZXkiXSA9IEVULlFOYW1lKCJ7dXJpMn12YWx1ZSIpCisgICAgPj4+IGVsZW0uYXBwZW5kKHN1YmVsZW0pCisgICAgPj4+IGVsZW0uYXBwZW5kKHN1YmVsZW0pCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIDMuMworICAgICc8bnMwOnRhZyB4bWxuczpuczA9InVyaSIgeG1sbnM6bnMxPSJ1cmkxIiB4bWxuczpuczI9InVyaTIiPjx0YWcgbnMxOmtleT0ibnMyOnZhbHVlIiAvPjx0YWcgbnMxOmtleT0ibnMyOnZhbHVlIiAvPjwvbnMwOnRhZz4nCisKKyAgICA0KSBEaXJlY3QgUU5hbWUgdGVzdHMKKworICAgID4+PiBzdHIoRVQuUU5hbWUoJ25zJywgJ3RhZycpKQorICAgICd7bnN9dGFnJworICAgID4+PiBzdHIoRVQuUU5hbWUoJ3tuc310YWcnKSkKKyAgICAne25zfXRhZycKKyAgICA+Pj4gcTEgPSBFVC5RTmFtZSgnbnMnLCAndGFnJykKKyAgICA+Pj4gcTIgPSBFVC5RTmFtZSgnbnMnLCAndGFnJykKKyAgICA+Pj4gcTEgPT0gcTIKKyAgICBUcnVlCisgICAgPj4+IHEyID0gRVQuUU5hbWUoJ25zJywgJ290aGVyLXRhZycpCisgICAgPj4+IHExID09IHEyCisgICAgRmFsc2UKKyAgICA+Pj4gcTEgPT0gJ25zOnRhZycKKyAgICBGYWxzZQorICAgID4+PiBxMSA9PSAne25zfXRhZycKKyAgICBUcnVlCisgICAgIiIiCisKK2RlZiBkb2N0eXBlX3B1YmxpYygpOgorICAgICIiIgorICAgIFRlc3QgUFVCTElDIGRvY3R5cGUuCisKKyAgICA+Pj4gZWxlbSA9IEVULlhNTCgnPCFET0NUWVBFIGh0bWwgUFVCTElDJworICAgIC4uLiAgICcgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIicKKyAgICAuLi4gICAnICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4nCisgICAgLi4uICAgJzxodG1sPnRleHQ8L2h0bWw+JykKKworICAgICIiIgorCitkZWYgeHBhdGhfdG9rZW5pemVyKHApOgorICAgICIiIgorICAgIFRlc3QgdGhlIFhQYXRoIHRva2VuaXplci4KKworICAgID4+PiAjIHRlc3RzIGZyb20gdGhlIHhtbCBzcGVjaWZpY2F0aW9uCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiKiIpCisgICAgWycqJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCJ0ZXh0KCkiKQorICAgIFsndGV4dCcsICcoKSddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiQG5hbWUiKQorICAgIFsnQCcsICduYW1lJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCJAKiIpCisgICAgWydAJywgJyonXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoInBhcmFbMV0iKQorICAgIFsncGFyYScsICdbJywgJzEnLCAnXSddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigicGFyYVtsYXN0KCldIikKKyAgICBbJ3BhcmEnLCAnWycsICdsYXN0JywgJygpJywgJ10nXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIiovcGFyYSIpCisgICAgWycqJywgJy8nLCAncGFyYSddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiL2RvYy9jaGFwdGVyWzVdL3NlY3Rpb25bMl0iKQorICAgIFsnLycsICdkb2MnLCAnLycsICdjaGFwdGVyJywgJ1snLCAnNScsICddJywgJy8nLCAnc2VjdGlvbicsICdbJywgJzInLCAnXSddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiY2hhcHRlci8vcGFyYSIpCisgICAgWydjaGFwdGVyJywgJy8vJywgJ3BhcmEnXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIi8vcGFyYSIpCisgICAgWycvLycsICdwYXJhJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCIvL29saXN0L2l0ZW0iKQorICAgIFsnLy8nLCAnb2xpc3QnLCAnLycsICdpdGVtJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCIuIikKKyAgICBbJy4nXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIi4vL3BhcmEiKQorICAgIFsnLicsICcvLycsICdwYXJhJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCIuLiIpCisgICAgWycuLiddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiLi4vQGxhbmciKQorICAgIFsnLi4nLCAnLycsICdAJywgJ2xhbmcnXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoImNoYXB0ZXJbdGl0bGVdIikKKyAgICBbJ2NoYXB0ZXInLCAnWycsICd0aXRsZScsICddJ10KKyAgICA+Pj4geHBhdGhfdG9rZW5pemVyKCJlbXBsb3llZVtAc2VjcmV0YXJ5IGFuZCBAYXNzaXN0YW50XSIpCisgICAgWydlbXBsb3llZScsICdbJywgJ0AnLCAnc2VjcmV0YXJ5JywgJycsICdhbmQnLCAnJywgJ0AnLCAnYXNzaXN0YW50JywgJ10nXQorCisgICAgPj4+ICMgYWRkaXRpb25hbCB0ZXN0cworICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIntodHRwOi8vc3BhbX1lZ2ciKQorICAgIFsne2h0dHA6Ly9zcGFtfWVnZyddCisgICAgPj4+IHhwYXRoX3Rva2VuaXplcigiLi9zcGFtLmVnZyIpCisgICAgWycuJywgJy8nLCAnc3BhbS5lZ2cnXQorICAgID4+PiB4cGF0aF90b2tlbml6ZXIoIi4vL3todHRwOi8vc3BhbX1lZ2ciKQorICAgIFsnLicsICcvLycsICd7aHR0cDovL3NwYW19ZWdnJ10KKyAgICAiIiIKKyAgICBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFBhdGgKKyAgICBvdXQgPSBbXQorICAgIGZvciBvcCwgdGFnIGluIEVsZW1lbnRQYXRoLnhwYXRoX3Rva2VuaXplcihwKToKKyAgICAgICAgb3V0LmFwcGVuZChvcCBvciB0YWcpCisgICAgcmV0dXJuIG91dAorCitkZWYgcHJvY2Vzc2luZ2luc3RydWN0aW9uKCk6CisgICAgIiIiCisgICAgVGVzdCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gZGlyZWN0bHkKKworICAgID4+PiBFVC50b3N0cmluZyhFVC5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oJ3Rlc3QnLCAnaW5zdHJ1Y3Rpb24nKSkKKyAgICAnPD90ZXN0IGluc3RydWN0aW9uPz4nCisgICAgPj4+IEVULnRvc3RyaW5nKEVULlBJKCd0ZXN0JywgJ2luc3RydWN0aW9uJykpCisgICAgJzw/dGVzdCBpbnN0cnVjdGlvbj8+JworCisgICAgSXNzdWUgIzI3NDYKKworICAgID4+PiBFVC50b3N0cmluZyhFVC5QSSgndGVzdCcsICc8dGVzdGluZyY+JykpCisgICAgJzw/dGVzdCA8dGVzdGluZyY+Pz4nCisgICAgPj4+IEVULnRvc3RyaW5nKEVULlBJKCd0ZXN0JywgdSc8dGVzdGluZyY+XHhlMycpLCAnbGF0aW4xJykKKyAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nbGF0aW4xJz8+XFxuPD90ZXN0IDx0ZXN0aW5nJj5cXHhlMz8+IgorICAgICIiIgorCisjCisjIHhpbmNsdWRlIHRlc3RzIChzYW1wbGVzIGZyb20gYXBwZW5kaXggQyBvZiB0aGUgeGluY2x1ZGUgc3BlY2lmaWNhdGlvbikKKworWElOQ0xVREUgPSB7fQorCitYSU5DTFVERVsiQzEueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkb2N1bWVudCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDxwPjEyMCBNeiBpcyBhZGVxdWF0ZSBmb3IgYW4gYXZlcmFnZSBob21lIHVzZXIuPC9wPgorICA8eGk6aW5jbHVkZSBocmVmPSJkaXNjbGFpbWVyLnhtbCIvPgorPC9kb2N1bWVudD4KKyIiIgorCitYSU5DTFVERVsiZGlzY2xhaW1lci54bWwiXSA9ICIiIlwKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPGRpc2NsYWltZXI+CisgIDxwPlRoZSBvcGluaW9ucyByZXByZXNlbnRlZCBoZXJlaW4gcmVwcmVzZW50IHRob3NlIG9mIHRoZSBpbmRpdmlkdWFsCisgIGFuZCBzaG91bGQgbm90IGJlIGludGVycHJldGVkIGFzIG9mZmljaWFsIHBvbGljeSBlbmRvcnNlZCBieSB0aGlzCisgIG9yZ2FuaXphdGlvbi48L3A+Cis8L2Rpc2NsYWltZXI+CisiIiIKKworWElOQ0xVREVbIkMyLnhtbCJdID0gIiIiXAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8ZG9jdW1lbnQgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICA8cD5UaGlzIGRvY3VtZW50IGhhcyBiZWVuIGFjY2Vzc2VkCisgIDx4aTppbmNsdWRlIGhyZWY9ImNvdW50LnR4dCIgcGFyc2U9InRleHQiLz4gdGltZXMuPC9wPgorPC9kb2N1bWVudD4KKyIiIgorCitYSU5DTFVERVsiY291bnQudHh0Il0gPSAiMzI0Mzg3IgorCitYSU5DTFVERVsiQzJiLnhtbCJdID0gIiIiXAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8ZG9jdW1lbnQgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICA8cD5UaGlzIGRvY3VtZW50IGhhcyBiZWVuIDxlbT5hY2Nlc3NlZDwvZW0+CisgIDx4aTppbmNsdWRlIGhyZWY9ImNvdW50LnR4dCIgcGFyc2U9InRleHQiLz4gdGltZXMuPC9wPgorPC9kb2N1bWVudD4KKyIiIgorCitYSU5DTFVERVsiQzMueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkb2N1bWVudCB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDxwPlRoZSBmb2xsb3dpbmcgaXMgdGhlIHNvdXJjZSBvZiB0aGUgImRhdGEueG1sIiByZXNvdXJjZTo8L3A+CisgIDxleGFtcGxlPjx4aTppbmNsdWRlIGhyZWY9ImRhdGEueG1sIiBwYXJzZT0idGV4dCIvPjwvZXhhbXBsZT4KKzwvZG9jdW1lbnQ+CisiIiIKKworWElOQ0xVREVbImRhdGEueG1sIl0gPSAiIiJcCis8P3htbCB2ZXJzaW9uPScxLjAnPz4KKzxkYXRhPgorICA8aXRlbT48IVtDREFUQVtCcm9va3MgJiBTaGllbGRzXV0+PC9pdGVtPgorPC9kYXRhPgorIiIiCisKK1hJTkNMVURFWyJDNS54bWwiXSA9ICIiIlwKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPGRpdiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgIDx4aTppbmNsdWRlIGhyZWY9ImV4YW1wbGUudHh0IiBwYXJzZT0idGV4dCI+CisgICAgPHhpOmZhbGxiYWNrPgorICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iZmFsbGJhY2stZXhhbXBsZS50eHQiIHBhcnNlPSJ0ZXh0Ij4KKyAgICAgICAgPHhpOmZhbGxiYWNrPjxhIGhyZWY9Im1haWx0bzpib2JAZXhhbXBsZS5vcmciPlJlcG9ydCBlcnJvcjwvYT48L3hpOmZhbGxiYWNrPgorICAgICAgPC94aTppbmNsdWRlPgorICAgIDwveGk6ZmFsbGJhY2s+CisgIDwveGk6aW5jbHVkZT4KKzwvZGl2PgorIiIiCisKK1hJTkNMVURFWyJkZWZhdWx0LnhtbCJdID0gIiIiXAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8ZG9jdW1lbnQgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICA8cD5FeGFtcGxlLjwvcD4KKyAgPHhpOmluY2x1ZGUgaHJlZj0ie30iLz4KKzwvZG9jdW1lbnQ+CisiIiIuZm9ybWF0KGNnaS5lc2NhcGUoU0lNUExFX1hNTEZJTEUsIFRydWUpKQorCitkZWYgeGluY2x1ZGVfbG9hZGVyKGhyZWYsIHBhcnNlPSJ4bWwiLCBlbmNvZGluZz1Ob25lKToKKyAgICB0cnk6CisgICAgICAgIGRhdGEgPSBYSU5DTFVERVtocmVmXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcmFpc2UgSU9FcnJvcigicmVzb3VyY2Ugbm90IGZvdW5kIikKKyAgICBpZiBwYXJzZSA9PSAieG1sIjoKKyAgICAgICAgZnJvbSB4bWwuZXRyZWUuRWxlbWVudFRyZWUgaW1wb3J0IFhNTAorICAgICAgICByZXR1cm4gWE1MKGRhdGEpCisgICAgcmV0dXJuIGRhdGEKKworZGVmIHhpbmNsdWRlKCk6CisgICAgciIiIgorICAgIEJhc2ljIGluY2x1c2lvbiBleGFtcGxlIChYSW5jbHVkZSBDLjEpCisKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQorCisgICAgPj4+IGRvY3VtZW50ID0geGluY2x1ZGVfbG9hZGVyKCJDMS54bWwiKQorICAgID4+PiBFbGVtZW50SW5jbHVkZS5pbmNsdWRlKGRvY3VtZW50LCB4aW5jbHVkZV9sb2FkZXIpCisgICAgPj4+IHByaW50IHNlcmlhbGl6ZShkb2N1bWVudCkgIyBDMQorICAgIDxkb2N1bWVudD4KKyAgICAgIDxwPjEyMCBNeiBpcyBhZGVxdWF0ZSBmb3IgYW4gYXZlcmFnZSBob21lIHVzZXIuPC9wPgorICAgICAgPGRpc2NsYWltZXI+CisgICAgICA8cD5UaGUgb3BpbmlvbnMgcmVwcmVzZW50ZWQgaGVyZWluIHJlcHJlc2VudCB0aG9zZSBvZiB0aGUgaW5kaXZpZHVhbAorICAgICAgYW5kIHNob3VsZCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMgb2ZmaWNpYWwgcG9saWN5IGVuZG9yc2VkIGJ5IHRoaXMKKyAgICAgIG9yZ2FuaXphdGlvbi48L3A+CisgICAgPC9kaXNjbGFpbWVyPgorICAgIDwvZG9jdW1lbnQ+CisKKyAgICBUZXh0dWFsIGluY2x1c2lvbiBleGFtcGxlIChYSW5jbHVkZSBDLjIpCisKKyAgICA+Pj4gZG9jdW1lbnQgPSB4aW5jbHVkZV9sb2FkZXIoIkMyLnhtbCIpCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIHhpbmNsdWRlX2xvYWRlcikKKyAgICA+Pj4gcHJpbnQgc2VyaWFsaXplKGRvY3VtZW50KSAjIEMyCisgICAgPGRvY3VtZW50PgorICAgICAgPHA+VGhpcyBkb2N1bWVudCBoYXMgYmVlbiBhY2Nlc3NlZAorICAgICAgMzI0Mzg3IHRpbWVzLjwvcD4KKyAgICA8L2RvY3VtZW50PgorCisgICAgVGV4dHVhbCBpbmNsdXNpb24gYWZ0ZXIgc2libGluZyBlbGVtZW50IChiYXNlZCBvbiBtb2RpZmllZCBYSW5jbHVkZSBDLjIpCisKKyAgICA+Pj4gZG9jdW1lbnQgPSB4aW5jbHVkZV9sb2FkZXIoIkMyYi54bWwiKQorICAgID4+PiBFbGVtZW50SW5jbHVkZS5pbmNsdWRlKGRvY3VtZW50LCB4aW5jbHVkZV9sb2FkZXIpCisgICAgPj4+IHByaW50KHNlcmlhbGl6ZShkb2N1bWVudCkpICMgQzJiCisgICAgPGRvY3VtZW50PgorICAgICAgPHA+VGhpcyBkb2N1bWVudCBoYXMgYmVlbiA8ZW0+YWNjZXNzZWQ8L2VtPgorICAgICAgMzI0Mzg3IHRpbWVzLjwvcD4KKyAgICA8L2RvY3VtZW50PgorCisgICAgVGV4dHVhbCBpbmNsdXNpb24gb2YgWE1MIGV4YW1wbGUgKFhJbmNsdWRlIEMuMykKKworICAgID4+PiBkb2N1bWVudCA9IHhpbmNsdWRlX2xvYWRlcigiQzMueG1sIikKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgeGluY2x1ZGVfbG9hZGVyKQorICAgID4+PiBwcmludCBzZXJpYWxpemUoZG9jdW1lbnQpICMgQzMKKyAgICA8ZG9jdW1lbnQ+CisgICAgICA8cD5UaGUgZm9sbG93aW5nIGlzIHRoZSBzb3VyY2Ugb2YgdGhlICJkYXRhLnhtbCIgcmVzb3VyY2U6PC9wPgorICAgICAgPGV4YW1wbGU+Jmx0Oz94bWwgdmVyc2lvbj0nMS4wJz8mZ3Q7CisgICAgJmx0O2RhdGEmZ3Q7CisgICAgICAmbHQ7aXRlbSZndDsmbHQ7IVtDREFUQVtCcm9va3MgJmFtcDsgU2hpZWxkc11dJmd0OyZsdDsvaXRlbSZndDsKKyAgICAmbHQ7L2RhdGEmZ3Q7CisgICAgPC9leGFtcGxlPgorICAgIDwvZG9jdW1lbnQ+CisKKyAgICBGYWxsYmFjayBleGFtcGxlIChYSW5jbHVkZSBDLjUpCisgICAgTm90ZSEgRmFsbGJhY2sgc3VwcG9ydCBpcyBub3QgeWV0IGltcGxlbWVudGVkCisKKyAgICA+Pj4gZG9jdW1lbnQgPSB4aW5jbHVkZV9sb2FkZXIoIkM1LnhtbCIpCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIHhpbmNsdWRlX2xvYWRlcikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgSU9FcnJvcjogcmVzb3VyY2Ugbm90IGZvdW5kCisgICAgPj4+ICMgcHJpbnQgc2VyaWFsaXplKGRvY3VtZW50KSAjIEM1CisgICAgIiIiCisKK2RlZiB4aW5jbHVkZV9kZWZhdWx0KCk6CisgICAgIiIiCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQorCisgICAgPj4+IGRvY3VtZW50ID0geGluY2x1ZGVfbG9hZGVyKCJkZWZhdWx0LnhtbCIpCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQpCisgICAgPj4+IHByaW50IHNlcmlhbGl6ZShkb2N1bWVudCkgIyBkZWZhdWx0CisgICAgPGRvY3VtZW50PgorICAgICAgPHA+RXhhbXBsZS48L3A+CisgICAgICA8cm9vdD4KKyAgICAgICA8ZWxlbWVudCBrZXk9InZhbHVlIj50ZXh0PC9lbGVtZW50PgorICAgICAgIDxlbGVtZW50PnRleHQ8L2VsZW1lbnQ+dGFpbAorICAgICAgIDxlbXB0eS1lbGVtZW50IC8+CisgICAgPC9yb290PgorICAgIDwvZG9jdW1lbnQ+CisgICAgIiIiCisKKyMKKyMgYmFkbHkgZm9ybWF0dGVkIHhpOmluY2x1ZGUgdGFncworCitYSU5DTFVERV9CQUQgPSB7fQorCitYSU5DTFVERV9CQURbIkIxLnhtbCJdID0gIiIiXAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8ZG9jdW1lbnQgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICA8cD4xMjAgTXogaXMgYWRlcXVhdGUgZm9yIGFuIGF2ZXJhZ2UgaG9tZSB1c2VyLjwvcD4KKyAgPHhpOmluY2x1ZGUgaHJlZj0iZGlzY2xhaW1lci54bWwiIHBhcnNlPSJCQURfVFlQRSIvPgorPC9kb2N1bWVudD4KKyIiIgorCitYSU5DTFVERV9CQURbIkIyLnhtbCJdID0gIiIiXAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8ZGl2IHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8eGk6ZmFsbGJhY2s+PC94aTpmYWxsYmFjaz4KKzwvZGl2PgorIiIiCisKK2RlZiB4aW5jbHVkZV9mYWlsdXJlcygpOgorICAgIHIiIiIKKyAgICBUZXN0IGZhaWx1cmUgdG8gbG9jYXRlIGluY2x1ZGVkIFhNTCBmaWxlLgorCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQorCisgICAgPj4+IGRlZiBub25lX2xvYWRlcihocmVmLCBwYXJzZXIsIGVuY29kaW5nPU5vbmUpOgorICAgIC4uLiAgICAgcmV0dXJuIE5vbmUKKworICAgID4+PiBkb2N1bWVudCA9IEVULlhNTChYSU5DTFVERVsiQzEueG1sIl0pCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIGxvYWRlcj1ub25lX2xvYWRlcikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgRmF0YWxJbmNsdWRlRXJyb3I6IGNhbm5vdCBsb2FkICdkaXNjbGFpbWVyLnhtbCcgYXMgJ3htbCcKKworICAgIFRlc3QgZmFpbHVyZSB0byBsb2NhdGUgaW5jbHVkZWQgdGV4dCBmaWxlLgorCisgICAgPj4+IGRvY3VtZW50ID0gRVQuWE1MKFhJTkNMVURFWyJDMi54bWwiXSkKKyAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgbG9hZGVyPW5vbmVfbG9hZGVyKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBGYXRhbEluY2x1ZGVFcnJvcjogY2Fubm90IGxvYWQgJ2NvdW50LnR4dCcgYXMgJ3RleHQnCisKKyAgICBUZXN0IGJhZCBwYXJzZSB0eXBlLgorCisgICAgPj4+IGRvY3VtZW50ID0gRVQuWE1MKFhJTkNMVURFX0JBRFsiQjEueG1sIl0pCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIGxvYWRlcj1ub25lX2xvYWRlcikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgRmF0YWxJbmNsdWRlRXJyb3I6IHVua25vd24gcGFyc2UgdHlwZSBpbiB4aTppbmNsdWRlIHRhZyAoJ0JBRF9UWVBFJykKKworICAgIFRlc3QgeGk6ZmFsbGJhY2sgb3V0c2lkZSB4aTppbmNsdWRlLgorCisgICAgPj4+IGRvY3VtZW50ID0gRVQuWE1MKFhJTkNMVURFX0JBRFsiQjIueG1sIl0pCisgICAgPj4+IEVsZW1lbnRJbmNsdWRlLmluY2x1ZGUoZG9jdW1lbnQsIGxvYWRlcj1ub25lX2xvYWRlcikKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgRmF0YWxJbmNsdWRlRXJyb3I6IHhpOmZhbGxiYWNrIHRhZyBtdXN0IGJlIGNoaWxkIG9mIHhpOmluY2x1ZGUgKCd7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZX1mYWxsYmFjaycpCisgICAgIiIiCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgcmVwb3J0ZWQgYnVncworCitkZWYgYnVnX3htbHRvb2xraXQyMSgpOgorICAgICIiIgorCisgICAgbWFyc2hhbGxlciBnaXZlcyBvYnNjdXJlIGVycm9ycyBmb3Igbm9uLXN0cmluZyB2YWx1ZXMKKworICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgxMjMpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIHRhZworICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBUeXBlRXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgMTIzICh0eXBlIGludCkKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoImVsZW0iKQorICAgID4+PiBlbGVtLnRleHQgPSAxMjMKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgdGV4dAorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBUeXBlRXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgMTIzICh0eXBlIGludCkKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoImVsZW0iKQorICAgID4+PiBlbGVtLnRhaWwgPSAxMjMKKyAgICA+Pj4gc2VyaWFsaXplKGVsZW0pICMgdGFpbAorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBUeXBlRXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgMTIzICh0eXBlIGludCkKKyAgICA+Pj4gZWxlbSA9IEVULkVsZW1lbnQoImVsZW0iKQorICAgID4+PiBlbGVtLnNldCgxMjMsICIxMjMiKQorICAgID4+PiBzZXJpYWxpemUoZWxlbSkgIyBhdHRyaWJ1dGUga2V5CisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFR5cGVFcnJvcjogY2Fubm90IHNlcmlhbGl6ZSAxMjMgKHR5cGUgaW50KQorICAgID4+PiBlbGVtID0gRVQuRWxlbWVudCgiZWxlbSIpCisgICAgPj4+IGVsZW0uc2V0KCIxMjMiLCAxMjMpCisgICAgPj4+IHNlcmlhbGl6ZShlbGVtKSAjIGF0dHJpYnV0ZSB2YWx1ZQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBUeXBlRXJyb3I6IGNhbm5vdCBzZXJpYWxpemUgMTIzICh0eXBlIGludCkKKworICAgICIiIgorCitkZWYgYnVnX3htbHRvb2xraXQyNSgpOgorICAgICIiIgorCisgICAgdHlwbyBpbiBFbGVtZW50VHJlZS5maW5kdGV4dAorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoU0FNUExFX1hNTCkKKyAgICA+Pj4gdHJlZSA9IEVULkVsZW1lbnRUcmVlKGVsZW0pCisgICAgPj4+IHRyZWUuZmluZHRleHQoInRhZyIpCisgICAgJ3RleHQnCisgICAgPj4+IHRyZWUuZmluZHRleHQoInNlY3Rpb24vdGFnIikKKyAgICAnc3VidGV4dCcKKworICAgICIiIgorCitkZWYgYnVnX3htbHRvb2xraXQyOCgpOgorICAgICIiIgorCisgICAgLi8vdGFnIGNhdXNlcyBleGNlcHRpb25zCisKKyAgICA+Pj4gdHJlZSA9IEVULlhNTCgiPGRvYz48dGFibGU+PHRib2R5Lz48L3RhYmxlPjwvZG9jPiIpCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KHRyZWUuZmluZGFsbCgiLi8vdGhlYWQiKSkKKyAgICBbXQorICAgID4+PiBzdW1tYXJpemVfbGlzdCh0cmVlLmZpbmRhbGwoIi4vL3Rib2R5IikpCisgICAgWyd0Ym9keSddCisKKyAgICAiIiIKKworZGVmIGJ1Z194bWx0b29sa2l0WDEoKToKKyAgICAiIiIKKworICAgIGR1bXAoKSBkb2Vzbid0IGZsdXNoIHRoZSBvdXRwdXQgYnVmZmVyCisKKyAgICA+Pj4gdHJlZSA9IEVULlhNTCgiPGRvYz48dGFibGU+PHRib2R5Lz48L3RhYmxlPjwvZG9jPiIpCisgICAgPj4+IEVULmR1bXAodHJlZSk7IHN5cy5zdGRvdXQud3JpdGUoInRhaWwiKQorICAgIDxkb2M+PHRhYmxlPjx0Ym9keSAvPjwvdGFibGU+PC9kb2M+CisgICAgdGFpbAorCisgICAgIiIiCisKK2RlZiBidWdfeG1sdG9vbGtpdDM5KCk6CisgICAgIiIiCisKKyAgICBub24tYXNjaWkgZWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzIGRvZXNuJ3Qgd29yaworCisgICAgPj4+IHRyZWUgPSBFVC5YTUwoIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz48dFx4ZTRnIC8+IikKKyAgICA+Pj4gRVQudG9zdHJpbmcodHJlZSwgInV0Zi04IikKKyAgICAnPHRcXHhjM1xceGE0ZyAvPicKKworICAgID4+PiB0cmVlID0gRVQuWE1MKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdpc28tODg1OS0xJz8+PHRhZyBceGU0dHRyPSd2JiMyMjg7bHVlJyAvPiIpCisgICAgPj4+IHRyZWUuYXR0cmliCisgICAge3UnXFx4ZTR0dHInOiB1J3ZcXHhlNGx1ZSd9CisgICAgPj4+IEVULnRvc3RyaW5nKHRyZWUsICJ1dGYtOCIpCisgICAgJzx0YWcgXFx4YzNcXHhhNHR0cj0idlxceGMzXFx4YTRsdWUiIC8+JworCisgICAgPj4+IHRyZWUgPSBFVC5YTUwoIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz48dFx4ZTRnPnRleHQ8L3RceGU0Zz4iKQorICAgID4+PiBFVC50b3N0cmluZyh0cmVlLCAidXRmLTgiKQorICAgICc8dFxceGMzXFx4YTRnPnRleHQ8L3RcXHhjM1xceGE0Zz4nCisKKyAgICA+Pj4gdHJlZSA9IEVULkVsZW1lbnQodSJ0XHUwMGU0ZyIpCisgICAgPj4+IEVULnRvc3RyaW5nKHRyZWUsICJ1dGYtOCIpCisgICAgJzx0XFx4YzNcXHhhNGcgLz4nCisKKyAgICA+Pj4gdHJlZSA9IEVULkVsZW1lbnQoInRhZyIpCisgICAgPj4+IHRyZWUuc2V0KHUiXHUwMGU0dHRyIiwgdSJ2XHUwMGU0bHVlIikKKyAgICA+Pj4gRVQudG9zdHJpbmcodHJlZSwgInV0Zi04IikKKyAgICAnPHRhZyBcXHhjM1xceGE0dHRyPSJ2XFx4YzNcXHhhNGx1ZSIgLz4nCisKKyAgICAiIiIKKworZGVmIGJ1Z194bWx0b29sa2l0NTQoKToKKyAgICAiIiIKKworICAgIHByb2JsZW1zIGhhbmRsaW5nIGludGVybmFsbHkgZGVmaW5lZCBlbnRpdGllcworCisgICAgPj4+IGUgPSBFVC5YTUwoIjwhRE9DVFlQRSBkb2MgWzwhRU5USVRZIGxkb3RzICcmI3g4MjMwOyc+XT48ZG9jPiZsZG90czs8L2RvYz4iKQorICAgID4+PiBzZXJpYWxpemUoZSkKKyAgICAnPGRvYz4mIzMzMzI4OzwvZG9jPicKKworICAgICIiIgorCitkZWYgYnVnX3htbHRvb2xraXQ1NSgpOgorICAgICIiIgorCisgICAgbWFrZSBzdXJlIHdlJ3JlIHJlcG9ydGluZyB0aGUgZmlyc3QgZXJyb3IsIG5vdCB0aGUgbGFzdAorCisgICAgPj4+IGUgPSBFVC5YTUwoIjwhRE9DVFlQRSBkb2MgU1lTVEVNICdkb2MuZHRkJz48ZG9jPiZsZG90czsmbmRvdHM7JnJkb3RzOzwvZG9jPiIpCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgIFBhcnNlRXJyb3I6IHVuZGVmaW5lZCBlbnRpdHkgJmxkb3RzOzogbGluZSAxLCBjb2x1bW4gMzYKKworICAgICIiIgorCitjbGFzcyBFeGNlcHRpb25GaWxlOgorICAgIGRlZiByZWFkKHNlbGYsIHgpOgorICAgICAgICByYWlzZSBJT0Vycm9yCisKK2RlZiB4bWx0b29sa2l0NjAoKToKKyAgICAiIiIKKworICAgIEhhbmRsZSBjcmFzaCBpbiBzdHJlYW0gc291cmNlLgorICAgID4+PiB0cmVlID0gRVQucGFyc2UoRXhjZXB0aW9uRmlsZSgpKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBJT0Vycm9yCisKKyAgICAiIiIKKworWE1MVE9PTEtJVDYyX0RPQyA9ICIiIjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgcGF0ZW50LWFwcGxpY2F0aW9uLXB1YmxpY2F0aW9uIFNZU1RFTSAicGFwLXYxNS0yMDAxLTAxLTMxLmR0ZCIgW10+Cis8cGF0ZW50LWFwcGxpY2F0aW9uLXB1YmxpY2F0aW9uPgorPHN1YmRvYy1hYnN0cmFjdD4KKzxwYXJhZ3JhcGggaWQ9IkEtMDAwMSIgbHZsPSIwIj5BIG5ldyBjdWx0aXZhciBvZiBCZWdvbmlhIHBsYW50IG5hbWVkICZsc3F1bztCQ1Q5ODAxQkVHJnJzcXVvOy48L3BhcmFncmFwaD4KKzwvc3ViZG9jLWFic3RyYWN0PgorPC9wYXRlbnQtYXBwbGljYXRpb24tcHVibGljYXRpb24+IiIiCisKKworZGVmIHhtbHRvb2xraXQ2MigpOgorICAgICIiIgorCisgICAgRG9uJ3QgY3Jhc2ggd2hlbiB1c2luZyBjdXN0b20gZW50aXRpZXMuCisKKyAgICA+Pj4geG1sdG9vbGtpdDYyKCkKKyAgICB1J0EgbmV3IGN1bHRpdmFyIG9mIEJlZ29uaWEgcGxhbnQgbmFtZWQgXHUyMDE4QkNUOTgwMUJFR1x1MjAxOS4nCisKKyAgICAiIiIKKyAgICBFTlRJVElFUyA9IHt1J3JzcXVvJzogdSdcdTIwMTknLCB1J2xzcXVvJzogdSdcdTIwMTgnfQorICAgIHBhcnNlciA9IEVULlhNTFRyZWVCdWlsZGVyKCkKKyAgICBwYXJzZXIuZW50aXR5LnVwZGF0ZShFTlRJVElFUykKKyAgICBwYXJzZXIuZmVlZChYTUxUT09MS0lUNjJfRE9DKQorICAgIHQgPSBwYXJzZXIuY2xvc2UoKQorICAgIHJldHVybiB0LmZpbmQoJy4vL3BhcmFncmFwaCcpLnRleHQKKworZGVmIHhtbHRvb2xraXQ2MygpOgorICAgICIiIgorCisgICAgQ2hlY2sgcmVmZXJlbmNlIGxlYWsuCisgICAgPj4+IHhtbHRvb2xraXQ2MygpCisgICAgPj4+IGNvdW50ID0gc3lzLmdldHJlZmNvdW50KE5vbmUpCisgICAgPj4+IGZvciBpIGluIHJhbmdlKDEwMDApOgorICAgIC4uLiAgICAgeG1sdG9vbGtpdDYzKCkKKyAgICA+Pj4gc3lzLmdldHJlZmNvdW50KE5vbmUpIC0gY291bnQKKyAgICAwCisKKyAgICAiIiIKKyAgICB0cmVlID0gRVQuVHJlZUJ1aWxkZXIoKQorICAgIHRyZWUuc3RhcnQoInRhZyIsIHt9KQorICAgIHRyZWUuZGF0YSgidGV4dCIpCisgICAgdHJlZS5lbmQoInRhZyIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitkZWYgYnVnXzIwMDcwOF9uZXdsaW5lKCk6CisgICAgciIiIgorCisgICAgUHJlc2VydmUgbmV3bGluZXMgaW4gYXR0cmlidXRlcy4KKworICAgID4+PiBlID0gRVQuRWxlbWVudCgnU29tZVRhZycsIHRleHQ9ImRlZiBfZigpOlxuICByZXR1cm4gM1xuIikKKyAgICA+Pj4gRVQudG9zdHJpbmcoZSkKKyAgICAnPFNvbWVUYWcgdGV4dD0iZGVmIF9mKCk6JiMxMDsgIHJldHVybiAzJiMxMDsiIC8+JworICAgID4+PiBFVC5YTUwoRVQudG9zdHJpbmcoZSkpLmdldCgidGV4dCIpCisgICAgJ2RlZiBfZigpOlxuICByZXR1cm4gM1xuJworICAgID4+PiBFVC50b3N0cmluZyhFVC5YTUwoRVQudG9zdHJpbmcoZSkpKQorICAgICc8U29tZVRhZyB0ZXh0PSJkZWYgX2YoKTomIzEwOyAgcmV0dXJuIDMmIzEwOyIgLz4nCisKKyAgICAiIiIKKworZGVmIGJ1Z18yMDA3MDhfY2xvc2UoKToKKyAgICAiIiIKKworICAgIFRlc3QgZGVmYXVsdCBidWlsZGVyLgorICAgID4+PiBwYXJzZXIgPSBFVC5YTUxQYXJzZXIoKSAjIGRlZmF1bHQKKyAgICA+Pj4gcGFyc2VyLmZlZWQoIjxlbGVtZW50PnNvbWUgdGV4dDwvZWxlbWVudD4iKQorICAgID4+PiBzdW1tYXJpemUocGFyc2VyLmNsb3NlKCkpCisgICAgJ2VsZW1lbnQnCisKKyAgICBUZXN0IGN1c3RvbSBidWlsZGVyLgorICAgID4+PiBjbGFzcyBFY2hvVGFyZ2V0OgorICAgIC4uLiAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgIC4uLiAgICAgICAgIHJldHVybiBFVC5FbGVtZW50KCJlbGVtZW50IikgIyBzaW11bGF0ZSByb290CisgICAgPj4+IHBhcnNlciA9IEVULlhNTFBhcnNlcihFY2hvVGFyZ2V0KCkpCisgICAgPj4+IHBhcnNlci5mZWVkKCI8ZWxlbWVudD5zb21lIHRleHQ8L2VsZW1lbnQ+IikKKyAgICA+Pj4gc3VtbWFyaXplKHBhcnNlci5jbG9zZSgpKQorICAgICdlbGVtZW50JworCisgICAgIiIiCisKK2RlZiBidWdfMjAwNzA5X2RlZmF1bHRfbmFtZXNwYWNlKCk6CisgICAgIiIiCisKKyAgICA+Pj4gZSA9IEVULkVsZW1lbnQoIntkZWZhdWx0fWVsZW0iKQorICAgID4+PiBzID0gRVQuU3ViRWxlbWVudChlLCAie2RlZmF1bHR9ZWxlbSIpCisgICAgPj4+IHNlcmlhbGl6ZShlLCBkZWZhdWx0X25hbWVzcGFjZT0iZGVmYXVsdCIpICMgMQorICAgICc8ZWxlbSB4bWxucz0iZGVmYXVsdCI+PGVsZW0gLz48L2VsZW0+JworCisgICAgPj4+IGUgPSBFVC5FbGVtZW50KCJ7ZGVmYXVsdH1lbGVtIikKKyAgICA+Pj4gcyA9IEVULlN1YkVsZW1lbnQoZSwgIntkZWZhdWx0fWVsZW0iKQorICAgID4+PiBzID0gRVQuU3ViRWxlbWVudChlLCAie25vdC1kZWZhdWx0fWVsZW0iKQorICAgID4+PiBzZXJpYWxpemUoZSwgZGVmYXVsdF9uYW1lc3BhY2U9ImRlZmF1bHQiKSAjIDIKKyAgICAnPGVsZW0geG1sbnM9ImRlZmF1bHQiIHhtbG5zOm5zMT0ibm90LWRlZmF1bHQiPjxlbGVtIC8+PG5zMTplbGVtIC8+PC9lbGVtPicKKworICAgID4+PiBlID0gRVQuRWxlbWVudCgie2RlZmF1bHR9ZWxlbSIpCisgICAgPj4+IHMgPSBFVC5TdWJFbGVtZW50KGUsICJ7ZGVmYXVsdH1lbGVtIikKKyAgICA+Pj4gcyA9IEVULlN1YkVsZW1lbnQoZSwgImVsZW0iKSAjIHVucHJlZml4ZWQgbmFtZQorICAgID4+PiBzZXJpYWxpemUoZSwgZGVmYXVsdF9uYW1lc3BhY2U9ImRlZmF1bHQiKSAjIDMKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogY2Fubm90IHVzZSBub24tcXVhbGlmaWVkIG5hbWVzIHdpdGggZGVmYXVsdF9uYW1lc3BhY2Ugb3B0aW9uCisKKyAgICAiIiIKKworZGVmIGJ1Z18yMDA3MDlfcmVnaXN0ZXJfbmFtZXNwYWNlKCk6CisgICAgIiIiCisKKyAgICA+Pj4gRVQudG9zdHJpbmcoRVQuRWxlbWVudCgie2h0dHA6Ly9uYW1lc3BhY2UuaW52YWxpZC9kb2VzL25vdC9leGlzdC99dGl0bGUiKSkKKyAgICAnPG5zMDp0aXRsZSB4bWxuczpuczA9Imh0dHA6Ly9uYW1lc3BhY2UuaW52YWxpZC9kb2VzL25vdC9leGlzdC8iIC8+JworICAgID4+PiBFVC5yZWdpc3Rlcl9uYW1lc3BhY2UoImZvbyIsICJodHRwOi8vbmFtZXNwYWNlLmludmFsaWQvZG9lcy9ub3QvZXhpc3QvIikKKyAgICA+Pj4gRVQudG9zdHJpbmcoRVQuRWxlbWVudCgie2h0dHA6Ly9uYW1lc3BhY2UuaW52YWxpZC9kb2VzL25vdC9leGlzdC99dGl0bGUiKSkKKyAgICAnPGZvbzp0aXRsZSB4bWxuczpmb289Imh0dHA6Ly9uYW1lc3BhY2UuaW52YWxpZC9kb2VzL25vdC9leGlzdC8iIC8+JworCisgICAgQW5kIHRoZSBEdWJsaW4gQ29yZSBuYW1lc3BhY2UgaXMgaW4gdGhlIGRlZmF1bHQgbGlzdDoKKworICAgID4+PiBFVC50b3N0cmluZyhFVC5FbGVtZW50KCJ7aHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS99dGl0bGUiKSkKKyAgICAnPGRjOnRpdGxlIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgLz4nCisKKyAgICAiIiIKKworZGVmIGJ1Z18yMDA3MDlfZWxlbWVudF9jb21tZW50KCk6CisgICAgIiIiCisKKyAgICBOb3Qgc3VyZSBpZiB0aGlzIGNhbiBiZSBmaXhlZCwgcmVhbGx5IChzaW5jZSB0aGUgc2VyaWFsaXplciBuZWVkcworICAgIEVULkNvbW1lbnQsIG5vdCBjRVQuY29tbWVudCkuCisKKyAgICA+Pj4gYSA9IEVULkVsZW1lbnQoJ2EnKQorICAgID4+PiBhLmFwcGVuZChFVC5Db21tZW50KCdmb28nKSkKKyAgICA+Pj4gYVswXS50YWcgPT0gRVQuQ29tbWVudAorICAgIFRydWUKKworICAgID4+PiBhID0gRVQuRWxlbWVudCgnYScpCisgICAgPj4+IGEuYXBwZW5kKEVULlBJKCdmb28nKSkKKyAgICA+Pj4gYVswXS50YWcgPT0gRVQuUEkKKyAgICBUcnVlCisKKyAgICAiIiIKKworZGVmIGJ1Z18yMDA3MDlfZWxlbWVudF9pbnNlcnQoKToKKyAgICAiIiIKKworICAgID4+PiBhID0gRVQuRWxlbWVudCgnYScpCisgICAgPj4+IGIgPSBFVC5TdWJFbGVtZW50KGEsICdiJykKKyAgICA+Pj4gYyA9IEVULlN1YkVsZW1lbnQoYSwgJ2MnKQorICAgID4+PiBkID0gRVQuRWxlbWVudCgnZCcpCisgICAgPj4+IGEuaW5zZXJ0KDAsIGQpCisgICAgPj4+IHN1bW1hcml6ZV9saXN0KGEpCisgICAgWydkJywgJ2InLCAnYyddCisgICAgPj4+IGEuaW5zZXJ0KC0xLCBkKQorICAgID4+PiBzdW1tYXJpemVfbGlzdChhKQorICAgIFsnZCcsICdiJywgJ2QnLCAnYyddCisKKyAgICAiIiIKKworZGVmIGJ1Z18yMDA3MDlfaXRlcl9jb21tZW50KCk6CisgICAgIiIiCisKKyAgICA+Pj4gYSA9IEVULkVsZW1lbnQoJ2EnKQorICAgID4+PiBiID0gRVQuU3ViRWxlbWVudChhLCAnYicpCisgICAgPj4+IGNvbW1lbnRfYiA9IEVULkNvbW1lbnQoIlRFU1QtYiIpCisgICAgPj4+IGIuYXBwZW5kKGNvbW1lbnRfYikKKyAgICA+Pj4gc3VtbWFyaXplX2xpc3QoYS5pdGVyKEVULkNvbW1lbnQpKQorICAgIFsnPENvbW1lbnQ+J10KKworICAgICIiIgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHJlcG9ydGVkIG9uIGJ1Z3MucHl0aG9uLm9yZworCitkZWYgYnVnXzE1MzQ2MzAoKToKKyAgICAiIiIKKworICAgID4+PiBib2IgPSBFVC5UcmVlQnVpbGRlcigpCisgICAgPj4+IGUgPSBib2IuZGF0YSgiZGF0YSIpCisgICAgPj4+IGUgPSBib2Iuc3RhcnQoInRhZyIsIHt9KQorICAgID4+PiBlID0gYm9iLmVuZCgidGFnIikKKyAgICA+Pj4gZSA9IGJvYi5jbG9zZSgpCisgICAgPj4+IHNlcmlhbGl6ZShlKQorICAgICc8dGFnIC8+JworCisgICAgIiIiCisKK2RlZiBjaGVja19pc3N1ZTYyMzMoKToKKyAgICAiIiIKKworICAgID4+PiBlID0gRVQuWE1MKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSd1dGYtOCc/Pjxib2R5PnRcXHhjM1xceGEzZzwvYm9keT4iKQorICAgID4+PiBFVC50b3N0cmluZyhlLCAnYXNjaWknKQorICAgICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdhc2NpaSc/Plxcbjxib2R5PnQmIzIyNztnPC9ib2R5PiIKKyAgICA+Pj4gZSA9IEVULlhNTCgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvLTg4NTktMSc/Pjxib2R5PnRcXHhlM2c8L2JvZHk+IikKKyAgICA+Pj4gRVQudG9zdHJpbmcoZSwgJ2FzY2lpJykKKyAgICAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nYXNjaWknPz5cXG48Ym9keT50JiMyMjc7ZzwvYm9keT4iCisKKyAgICAiIiIKKworZGVmIGNoZWNrX2lzc3VlMzE1MSgpOgorICAgICIiIgorCisgICAgPj4+IGUgPSBFVC5YTUwoJzxwcmVmaXg6bG9jYWxuYW1lIHhtbG5zOnByZWZpeD0iJHtzdHVmZn0iLz4nKQorICAgID4+PiBlLnRhZworICAgICd7JHtzdHVmZn19bG9jYWxuYW1lJworICAgID4+PiB0ID0gRVQuRWxlbWVudFRyZWUoZSkKKyAgICA+Pj4gRVQudG9zdHJpbmcoZSkKKyAgICAnPG5zMDpsb2NhbG5hbWUgeG1sbnM6bnMwPSIke3N0dWZmfSIgLz4nCisKKyAgICAiIiIKKworZGVmIGNoZWNrX2lzc3VlNjU2NSgpOgorICAgICIiIgorCisgICAgPj4+IGVsZW0gPSBFVC5YTUwoIjxib2R5Pjx0YWcvPjwvYm9keT4iKQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtKQorICAgIFsndGFnJ10KKyAgICA+Pj4gbmV3ZWxlbSA9IEVULlhNTChTQU1QTEVfWE1MKQorICAgID4+PiBlbGVtWzpdID0gbmV3ZWxlbVs6XQorICAgID4+PiBzdW1tYXJpemVfbGlzdChlbGVtKQorICAgIFsndGFnJywgJ3RhZycsICdzZWN0aW9uJ10KKworICAgICIiIgorCitkZWYgY2hlY2tfaHRtbF9lbXB0eV9lbGVtc19zZXJpYWxpemF0aW9uKHNlbGYpOgorICAgICMgaXNzdWUgMTU5NzAKKyAgICAjIGZyb20gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQwMS9pbmRleC9lbGVtZW50cy5odG1sCisgICAgIiIiCisKKyAgICA+Pj4gZW1wdHlfZWxlbXMgPSBbJ0FSRUEnLCAnQkFTRScsICdCQVNFRk9OVCcsICdCUicsICdDT0wnLCAnRlJBTUUnLCAnSFInLAorICAgIC4uLiAgICAgICAgICAgICAgICAnSU1HJywgJ0lOUFVUJywgJ0lTSU5ERVgnLCAnTElOSycsICdNRVRBJywgJ1BBUkFNJ10KKyAgICA+Pj4gZWxlbXMgPSAnJy5qb2luKCc8JXMgLz4nICUgZWxlbSBmb3IgZWxlbSBpbiBlbXB0eV9lbGVtcykKKyAgICA+Pj4gc2VyaWFsaXplKEVULlhNTCgnPGh0bWw+JXM8L2h0bWw+JyAlIGVsZW1zKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PEFSRUE+PEJBU0U+PEJBU0VGT05UPjxCUj48Q09MPjxGUkFNRT48SFI+PElNRz48SU5QVVQ+PElTSU5ERVg+PExJTks+PE1FVEE+PFBBUkFNPjwvaHRtbD4nCisgICAgPj4+IHNlcmlhbGl6ZShFVC5YTUwoJzxodG1sPiVzPC9odG1sPicgJSBlbGVtcy5sb3dlcigpKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PGFyZWE+PGJhc2U+PGJhc2Vmb250Pjxicj48Y29sPjxmcmFtZT48aHI+PGltZz48aW5wdXQ+PGlzaW5kZXg+PGxpbms+PG1ldGE+PHBhcmFtPjwvaHRtbD4nCisgICAgPj4+IGVsZW1zID0gJycuam9pbignPCVzPjwvJXM+JyAlIChlbGVtLCBlbGVtKSBmb3IgZWxlbSBpbiBlbXB0eV9lbGVtcykKKyAgICA+Pj4gc2VyaWFsaXplKEVULlhNTCgnPGh0bWw+JXM8L2h0bWw+JyAlIGVsZW1zKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PEFSRUE+PEJBU0U+PEJBU0VGT05UPjxCUj48Q09MPjxGUkFNRT48SFI+PElNRz48SU5QVVQ+PElTSU5ERVg+PExJTks+PE1FVEE+PFBBUkFNPjwvaHRtbD4nCisgICAgPj4+IHNlcmlhbGl6ZShFVC5YTUwoJzxodG1sPiVzPC9odG1sPicgJSBlbGVtcy5sb3dlcigpKSwgbWV0aG9kPSdodG1sJykKKyAgICAnPGh0bWw+PGFyZWE+PGJhc2U+PGJhc2Vmb250Pjxicj48Y29sPjxmcmFtZT48aHI+PGltZz48aW5wdXQ+PGlzaW5kZXg+PGxpbms+PG1ldGE+PHBhcmFtPjwvaHRtbD4nCisKKyAgICAiIiIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2NsYXNzIENsZWFuQ29udGV4dChvYmplY3QpOgorICAgICIiIlByb3ZpZGUgZGVmYXVsdCBuYW1lc3BhY2UgbWFwcGluZyBhbmQgcGF0aCBjYWNoZS4iIiIKKyAgICBjaGVja3dhcm5pbmdzID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHF1aWV0PUZhbHNlKToKKyAgICAgICAgaWYgc3lzLmZsYWdzLm9wdGltaXplID49IDI6CisgICAgICAgICAgICAjIHVuZGVyIC1PTywgZG9jdGVzdHMgY2Fubm90IGJlIHJ1biBhbmQgdGhlcmVmb3JlIG5vdCBhbGwgd2FybmluZ3MKKyAgICAgICAgICAgICMgd2lsbCBiZSBlbWl0dGVkCisgICAgICAgICAgICBxdWlldCA9IFRydWUKKyAgICAgICAgZGVwcmVjYXRpb25zID0gKAorICAgICAgICAgICAgIyBTZWFyY2ggYmVoYXZpb3VyIGlzIGJyb2tlbiBpZiBzZWFyY2ggcGF0aCBzdGFydHMgd2l0aCAiLyIuCisgICAgICAgICAgICAoIlRoaXMgc2VhcmNoIGlzIGJyb2tlbiBpbiAxLjMgYW5kIGVhcmxpZXIsIGFuZCB3aWxsIGJlIGZpeGVkICIKKyAgICAgICAgICAgICAiaW4gYSBmdXR1cmUgdmVyc2lvbi4gIElmIHlvdSByZWx5IG9uIHRoZSBjdXJyZW50IGJlaGF2aW91ciwgIgorICAgICAgICAgICAgICJjaGFuZ2UgaXQgdG8gJy4rJyIsIEZ1dHVyZVdhcm5pbmcpLAorICAgICAgICAgICAgIyBFbGVtZW50LmdldGNoaWxkcmVuKCkgYW5kIEVsZW1lbnQuZ2V0aXRlcmF0b3IoKSBhcmUgZGVwcmVjYXRlZC4KKyAgICAgICAgICAgICgiVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gICIKKyAgICAgICAgICAgICAiVXNlIC4rIGluc3RlYWQuIiwgRGVwcmVjYXRpb25XYXJuaW5nKSwKKyAgICAgICAgICAgICgiVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gICIKKyAgICAgICAgICAgICAiVXNlIC4rIGluc3RlYWQuIiwgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyksCisgICAgICAgICAgICAjIFhNTFBhcnNlci5kb2N0eXBlKCkgaXMgZGVwcmVjYXRlZC4KKyAgICAgICAgICAgICgiVGhpcyBtZXRob2Qgb2YgWE1MUGFyc2VyIGlzIGRlcHJlY2F0ZWQuICBEZWZpbmUgZG9jdHlwZS4uICIKKyAgICAgICAgICAgICAibWV0aG9kIG9uIHRoZSBUcmVlQnVpbGRlciB0YXJnZXQuIiwgRGVwcmVjYXRpb25XYXJuaW5nKSkKKyAgICAgICAgc2VsZi5jaGVja3dhcm5pbmdzID0gdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCpkZXByZWNhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWlldD1xdWlldCkKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZQorICAgICAgICBzZWxmLl9uc21hcCA9IEVsZW1lbnRUcmVlLl9uYW1lc3BhY2VfbWFwCisgICAgICAgIHNlbGYuX3BhdGhfY2FjaGUgPSBFbGVtZW50VHJlZS5FbGVtZW50UGF0aC5fY2FjaGUKKyAgICAgICAgIyBDb3B5IHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBtYXBwaW5nCisgICAgICAgIEVsZW1lbnRUcmVlLl9uYW1lc3BhY2VfbWFwID0gc2VsZi5fbnNtYXAuY29weSgpCisgICAgICAgICMgQ29weSB0aGUgcGF0aCBjYWNoZSAoc2hvdWxkIGJlIGVtcHR5KQorICAgICAgICBFbGVtZW50VHJlZS5FbGVtZW50UGF0aC5fY2FjaGUgPSBzZWxmLl9wYXRoX2NhY2hlLmNvcHkoKQorICAgICAgICBzZWxmLmNoZWNrd2FybmluZ3MuX19lbnRlcl9fKCkKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZQorICAgICAgICAjIFJlc3RvcmUgbWFwcGluZyBhbmQgcGF0aCBjYWNoZQorICAgICAgICBFbGVtZW50VHJlZS5fbmFtZXNwYWNlX21hcCA9IHNlbGYuX25zbWFwCisgICAgICAgIEVsZW1lbnRUcmVlLkVsZW1lbnRQYXRoLl9jYWNoZSA9IHNlbGYuX3BhdGhfY2FjaGUKKyAgICAgICAgc2VsZi5jaGVja3dhcm5pbmdzLl9fZXhpdF9fKCphcmdzKQorCisKK2RlZiB0ZXN0X21haW4obW9kdWxlX25hbWU9J3htbC5ldHJlZS5FbGVtZW50VHJlZScpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF94bWxfZXRyZWUKKworICAgIHVzZV9weV9tb2R1bGUgPSAobW9kdWxlX25hbWUgPT0gJ3htbC5ldHJlZS5FbGVtZW50VHJlZScpCisKKyAgICAjIFRoZSBzYW1lIGRvY3Rlc3RzIGFyZSB1c2VkIGZvciBib3RoIHRoZSBQeXRob24gYW5kIHRoZSBDIGltcGxlbWVudGF0aW9ucworICAgIGFzc2VydCB0ZXN0X3htbF9ldHJlZS5FVC5fX25hbWVfXyA9PSBtb2R1bGVfbmFtZQorCisgICAgIyBYWFggdGhlIEMgbW9kdWxlIHNob3VsZCBnaXZlIHRoZSBzYW1lIHdhcm5pbmdzIGFzIHRoZSBQeXRob24gbW9kdWxlCisgICAgd2l0aCBDbGVhbkNvbnRleHQocXVpZXQ9bm90IHVzZV9weV9tb2R1bGUpOgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodGVzdF94bWxfZXRyZWUsIHZlcmJvc2l0eT1UcnVlKQorCisgICAgIyBUaGUgbW9kdWxlIHNob3VsZCBub3QgYmUgY2hhbmdlZCBieSB0aGUgdGVzdHMKKyAgICBhc3NlcnQgdGVzdF94bWxfZXRyZWUuRVQuX19uYW1lX18gPT0gbW9kdWxlX25hbWUKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhYWVmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMzAyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbF9ldHJlZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzRhNGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKQEAgLTAsMCArMSw1NSBAQAorIyB4bWwuZXRyZWUgdGVzdCBmb3IgY0VsZW1lbnRUcmVlCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBwcmVjaXNpb25iaWdtZW10ZXN0LCBfMkcKK2ltcG9ydCB1bml0dGVzdAorCitjRVQgPSB0ZXN0X3N1cHBvcnQuaW1wb3J0X21vZHVsZSgneG1sLmV0cmVlLmNFbGVtZW50VHJlZScpCisKKworIyBjRWxlbWVudFRyZWUgc3BlY2lmaWMgdGVzdHMKKworZGVmIHNhbml0eSgpOgorICAgICIiIgorICAgIEltcG9ydCBzYW5pdHkuCisKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IGNFbGVtZW50VHJlZQorICAgICIiIgorCisKK2NsYXNzIE1pc2NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBJc3N1ZSAjODY1MS4KKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV8yRyArIDEwMCwgbWVtdXNlPTEpCisgICAgZGVmIHRlc3RfbGVuZ3RoX292ZXJmbG93KHNlbGYsIHNpemUpOgorICAgICAgICBpZiBzaXplIDwgXzJHICsgMTAwOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgibm90IGVub3VnaCBmcmVlIG1lbW9yeSwgbmVlZCBhdCBsZWFzdCAyIEdCIikKKyAgICAgICAgZGF0YSA9IGIneCcgKiBzaXplCisgICAgICAgIHBhcnNlciA9IGNFVC5YTUxQYXJzZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBwYXJzZXIuZmVlZCwgZGF0YSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRhdGEgPSBOb25lCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZyb20gdGVzdCBpbXBvcnQgdGVzdF94bWxfZXRyZWUsIHRlc3RfeG1sX2V0cmVlX2MKKworICAgICMgUnVuIHRoZSB0ZXN0cyBzcGVjaWZpYyB0byB0aGUgQyBpbXBsZW1lbnRhdGlvbgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fZG9jdGVzdCh0ZXN0X3htbF9ldHJlZV9jLCB2ZXJib3NpdHk9VHJ1ZSkKKworICAgICMgQXNzaWduIHRoZSBDIGltcGxlbWVudGF0aW9uIGJlZm9yZSBydW5uaW5nIHRoZSBkb2N0ZXN0cworICAgICMgUGF0Y2ggdGhlIF9fbmFtZV9fLCB0byBwcmV2ZW50IGNvbmZ1c2lvbiB3aXRoIHRoZSBwdXJlIFB5dGhvbiB0ZXN0CisgICAgcHlFVCA9IHRlc3RfeG1sX2V0cmVlLkVUCisgICAgcHlfX25hbWVfXyA9IHRlc3RfeG1sX2V0cmVlLl9fbmFtZV9fCisgICAgdGVzdF94bWxfZXRyZWUuRVQgPSBjRVQKKyAgICBpZiBfX25hbWVfXyAhPSAnX19tYWluX18nOgorICAgICAgICB0ZXN0X3htbF9ldHJlZS5fX25hbWVfXyA9IF9fbmFtZV9fCisgICAgdHJ5OgorICAgICAgICAjIFJ1biB0aGUgc2FtZSB0ZXN0IHN1aXRlIGFzIHhtbC5ldHJlZS5FbGVtZW50VHJlZQorICAgICAgICB0ZXN0X3htbF9ldHJlZS50ZXN0X21haW4obW9kdWxlX25hbWU9J3htbC5ldHJlZS5jRWxlbWVudFRyZWUnKQorICAgIGZpbmFsbHk6CisgICAgICAgIHRlc3RfeG1sX2V0cmVlLkVUID0gcHlFVAorICAgICAgICB0ZXN0X3htbF9ldHJlZS5fX25hbWVfXyA9IHB5X19uYW1lX18KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODcwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ODcwNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sbGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1sbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2Njk3OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxsaWIucHkKQEAgLTAsMCArMSw0OCBAQAorJycnVGVzdCBtb2R1bGUgdG8gdGhlc3QgdGhlIHhtbGxpYiBtb2R1bGUuCisgICBTam9lcmQgTXVsbGVuZGVyCisnJycKKwordGVzdGRvYyA9ICIiIlwKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSd5ZXMnID8+Cis8IS0tIGNvbW1lbnRzIGFyZW4ndCBhbGxvd2VkIGJlZm9yZSB0aGUgPD94bWw/PiB0YWcsCisgICAgIGJ1dCB0aGV5IGFyZSBhbGxvd2VkIGJlZm9yZSB0aGUgPCFET0NUWVBFPiB0YWcgLS0+Cis8P3Byb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBhbGxvd2VkIGluIHRoZSBzYW1lIHBsYWNlcyBhcyBjb21tZW50cyA/PgorPCFET0NUWVBFIGdyZWV0aW5nIFsKKyAgPCFFTEVNRU5UIGdyZWV0aW5nICgjUENEQVRBKT4KK10+Cis8Z3JlZXRpbmc+SGVsbG8sIHdvcmxkITwvZ3JlZXRpbmc+CisiIiIKKworbnNkb2MgPSAiPGZvbyB4bWxucz0nVVJJJyBhdHRyPSd2YWwnLz4iCisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CitpbXBvcnQgdW5pdHRlc3QKKyMgU2lsZW5jZSBQeTNrIHdhcm5pbmcKK3htbGxpYiA9IHRlc3Rfc3VwcG9ydC5pbXBvcnRfbW9kdWxlKCd4bWxsaWInLCBkZXByZWNhdGVkPVRydWUpCisKK2NsYXNzIFhNTFBhcnNlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKKyAgICAgICAgcGFyc2VyID0geG1sbGliLlhNTFBhcnNlcigpCisgICAgICAgIGZvciBjIGluIHRlc3Rkb2M6CisgICAgICAgICAgICBwYXJzZXIuZmVlZChjKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9uYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEgoeG1sbGliLlhNTFBhcnNlcik6CisgICAgICAgICAgICBkZWYgdW5rbm93bl9zdGFydHRhZyhzZWxmLCBuYW1lLCBhdHRyKToKKyAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYuYXR0ciA9IG5hbWUsIGF0dHIKKyAgICAgICAgaD1IKCkKKyAgICAgICAgaC5mZWVkKG5zZG9jKQorICAgICAgICBoLmNsb3NlKCkKKyAgICAgICAgIyBUaGUgZGVmYXVsdCBuYW1lc3BhY2UgYXBwbGllcyB0byBlbGVtZW50cy4uLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgubmFtZSwgIlVSSSBmb28iKQorICAgICAgICAjIGJ1dCBub3QgdG8gYXR0cmlidXRlcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguYXR0ciwgeydhdHRyJzondmFsJ30pCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoWE1MUGFyc2VyVGVzdENhc2UpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbGxpYi5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzk3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxsaWIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbGxpYi5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYzk3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94bWxsaWIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbHJwYy5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbHJwYy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTY1ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5CkBAIC0wLDAgKzEsMTAyNyBAQAoraW1wb3J0IGJhc2U2NAoraW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgeG1scnBjbGliCitpbXBvcnQgU2ltcGxlWE1MUlBDU2VydmVyCitpbXBvcnQgbWltZXRvb2xzCitpbXBvcnQgaHR0cGxpYgoraW1wb3J0IHNvY2tldAoraW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgb3MKK2ltcG9ydCByZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKwordHJ5OgorICAgIGltcG9ydCB0aHJlYWRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB0aHJlYWRpbmcgPSBOb25lCisKK3RyeToKKyAgICB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgIGhhdmVfdW5pY29kZSA9IEZhbHNlCitlbHNlOgorICAgIGhhdmVfdW5pY29kZSA9IFRydWUKKworYWxpc3QgPSBbeydhc3RyaW5nJzogJ2Zvb0BiYXIuYmF6LnNwYW0nLAorICAgICAgICAgICdhZmxvYXQnOiA3MjgzLjQzLAorICAgICAgICAgICdhbmludCc6IDIqKjIwLAorICAgICAgICAgICdhc2hvcnRsb25nJzogMkwsCisgICAgICAgICAgJ2Fub3RoZXJsaXN0JzogWycuenl4LjQxJ10sCisgICAgICAgICAgJ2FiYXNlNjQnOiB4bWxycGNsaWIuQmluYXJ5KCJteSBkb2cgaGFzIGZsZWFzIiksCisgICAgICAgICAgJ2Jvb2xlYW4nOiB4bWxycGNsaWIuRmFsc2UsCisgICAgICAgICAgJ3VuaWNvZGUnOiB1J1x1NDAwMFx1NjAwMFx1ODAwMCcsCisgICAgICAgICAgdSd1a2V5XHU0MDAwJzogJ3JlZ3VsYXIgdmFsdWUnLAorICAgICAgICAgICdkYXRldGltZTEnOiB4bWxycGNsaWIuRGF0ZVRpbWUoJzIwMDUwMjEwVDExOjQxOjIzJyksCisgICAgICAgICAgJ2RhdGV0aW1lMic6IHhtbHJwY2xpYi5EYXRlVGltZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICgyMDA1LCAwMiwgMTAsIDExLCA0MSwgMjMsIDAsIDEsIC0xKSksCisgICAgICAgICAgJ2RhdGV0aW1lMyc6IHhtbHJwY2xpYi5EYXRlVGltZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGV0aW1lLmRhdGV0aW1lKDIwMDUsIDAyLCAxMCwgMTEsIDQxLCAyMykpLAorICAgICAgICAgIH1dCisKK2NsYXNzIFhNTFJQQ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X2R1bXBfbG9hZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4bWxycGNsaWIubG9hZHMoeG1scnBjbGliLmR1bXBzKChhbGlzdCwpKSlbMF1bMF0pCisKKyAgICBkZWYgdGVzdF9kdW1wX2JhcmVfZGF0ZXRpbWUoc2VsZik6CisgICAgICAgICMgVGhpcyBjaGVja3MgdGhhdCBhbiB1bndyYXBwZWQgZGF0ZXRpbWUuZGF0ZSBvYmplY3QgY2FuIGJlIGhhbmRsZWQKKyAgICAgICAgIyBieSB0aGUgbWFyc2hhbGxpbmcgY29kZS4gIFRoaXMgY2FuJ3QgYmUgZG9uZSB2aWEgdGVzdF9kdW1wX2xvYWQoKQorICAgICAgICAjIHNpbmNlIHdpdGggdXNlX2RhdGV0aW1lIHNldCB0byAxIHRoZSB1bm1hcnNoYWxsZXIgd291bGQgY3JlYXRlCisgICAgICAgICMgZGF0ZXRpbWUgb2JqZWN0cyBmb3IgdGhlICdkYXRldGltZVsxMjNdJyBrZXlzIGFzIHdlbGwKKyAgICAgICAgZHQgPSBkYXRldGltZS5kYXRldGltZSgyMDA1LCAwMiwgMTAsIDExLCA0MSwgMjMpCisgICAgICAgIHMgPSB4bWxycGNsaWIuZHVtcHMoKGR0LCkpCisgICAgICAgIChuZXdkdCwpLCBtID0geG1scnBjbGliLmxvYWRzKHMsIHVzZV9kYXRldGltZT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2R0LCBkdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBOb25lKQorCisgICAgICAgIChuZXdkdCwpLCBtID0geG1scnBjbGliLmxvYWRzKHMsIHVzZV9kYXRldGltZT0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2R0LCB4bWxycGNsaWIuRGF0ZVRpbWUoJzIwMDUwMjEwVDExOjQxOjIzJykpCisKKyAgICBkZWYgdGVzdF9kYXRldGltZV9iZWZvcmVfMTkwMChzZWxmKToKKyAgICAgICAgIyBzYW1lIGFzIGJlZm9yZSBidXQgd2l0aCBhIGRhdGUgYmVmb3JlIDE5MDAKKyAgICAgICAgZHQgPSBkYXRldGltZS5kYXRldGltZSgxLCAwMiwgMTAsIDExLCA0MSwgMjMpCisgICAgICAgIHMgPSB4bWxycGNsaWIuZHVtcHMoKGR0LCkpCisgICAgICAgIChuZXdkdCwpLCBtID0geG1scnBjbGliLmxvYWRzKHMsIHVzZV9kYXRldGltZT0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2R0LCBkdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtLCBOb25lKQorCisgICAgICAgIChuZXdkdCwpLCBtID0geG1scnBjbGliLmxvYWRzKHMsIHVzZV9kYXRldGltZT0wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2R0LCB4bWxycGNsaWIuRGF0ZVRpbWUoJzAwMDEwMjEwVDExOjQxOjIzJykpCisKKyAgICBkZWYgdGVzdF9jbXBfZGF0ZXRpbWVfRGF0ZVRpbWUoc2VsZik6CisgICAgICAgIG5vdyA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCisgICAgICAgIGR0ID0geG1scnBjbGliLkRhdGVUaW1lKG5vdy50aW1ldHVwbGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR0ID09IG5vdykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdyA9PSBkdCkKKyAgICAgICAgdGhlbiA9IG5vdyArIGRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aGVuID49IGR0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQgPCB0aGVuKQorCisgICAgZGVmIHRlc3RfYnVnXzExNjQ5MTIgKHNlbGYpOgorICAgICAgICBkID0geG1scnBjbGliLkRhdGVUaW1lKCkKKyAgICAgICAgKChuZXdfZCwpLCBkdW1teSkgPSB4bWxycGNsaWIubG9hZHMoeG1scnBjbGliLmR1bXBzKChkLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHJlc3BvbnNlPVRydWUpKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobmV3X2QudmFsdWUsIHN0cikKKworICAgICAgICAjIENoZWNrIHRoYXQgdGhlIG91dHB1dCBvZiBkdW1wcygpIGlzIHN0aWxsIGFuIDgtYml0IHN0cmluZworICAgICAgICBzID0geG1scnBjbGliLmR1bXBzKChuZXdfZCwpLCBtZXRob2RyZXNwb25zZT1UcnVlKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uocywgc3RyKQorCisgICAgZGVmIHRlc3RfbmV3c3R5bGVfY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFQob2JqZWN0KToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdCA9IFQoKQorICAgICAgICB0LnggPSAxMDAKKyAgICAgICAgdC55ID0gIkhlbGxvIgorICAgICAgICAoKHQyLCksIGR1bW15KSA9IHhtbHJwY2xpYi5sb2Fkcyh4bWxycGNsaWIuZHVtcHMoKHQsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIsIHQuX19kaWN0X18pCisKKyAgICBkZWYgdGVzdF9kdW1wX2JpZ19sb25nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB4bWxycGNsaWIuZHVtcHMsICgyTCoqOTksKSkKKworICAgIGRlZiB0ZXN0X2R1bXBfYmFkX2RpY3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeG1scnBjbGliLmR1bXBzLCAoeygxLDIsMyk6IDF9LCkpCisKKyAgICBkZWYgdGVzdF9kdW1wX3JlY3Vyc2l2ZV9zZXEoc2VsZik6CisgICAgICAgIGwgPSBbMSwyLDNdCisgICAgICAgIHQgPSBbMyw0LDUsbF0KKyAgICAgICAgbC5hcHBlbmQodCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4bWxycGNsaWIuZHVtcHMsIChsLCkpCisKKyAgICBkZWYgdGVzdF9kdW1wX3JlY3Vyc2l2ZV9kaWN0KHNlbGYpOgorICAgICAgICBkID0geycxJzoxLCAnMic6MX0KKyAgICAgICAgdCA9IHsnMyc6MywgJ2QnOmR9CisgICAgICAgIGRbJ3QnXSA9IHQKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4bWxycGNsaWIuZHVtcHMsIChkLCkpCisKKyAgICBkZWYgdGVzdF9kdW1wX2JpZ19pbnQoc2VsZik6CisgICAgICAgIGlmIHN5cy5tYXhpbnQgPiAyTCoqMzEtMToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhtbHJwY2xpYi5kdW1wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQoMkwqKjM0KSwpKQorCisgICAgICAgIHhtbHJwY2xpYi5kdW1wcygoeG1scnBjbGliLk1BWElOVCwgeG1scnBjbGliLk1JTklOVCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhtbHJwY2xpYi5kdW1wcywgKHhtbHJwY2xpYi5NQVhJTlQrMSwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB4bWxycGNsaWIuZHVtcHMsICh4bWxycGNsaWIuTUlOSU5ULTEsKSkKKworICAgICAgICBkZWYgZHVtbXlfd3JpdGUocyk6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgbSA9IHhtbHJwY2xpYi5NYXJzaGFsbGVyKCkKKyAgICAgICAgbS5kdW1wX2ludCh4bWxycGNsaWIuTUFYSU5ULCBkdW1teV93cml0ZSkKKyAgICAgICAgbS5kdW1wX2ludCh4bWxycGNsaWIuTUlOSU5ULCBkdW1teV93cml0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbS5kdW1wX2ludCwgeG1scnBjbGliLk1BWElOVCsxLCBkdW1teV93cml0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbS5kdW1wX2ludCwgeG1scnBjbGliLk1JTklOVC0xLCBkdW1teV93cml0ZSkKKworCisgICAgZGVmIHRlc3RfZHVtcF9ub25lKHNlbGYpOgorICAgICAgICB2YWx1ZSA9IGFsaXN0ICsgW05vbmVdCisgICAgICAgIGFyZzEgPSAoYWxpc3QgKyBbTm9uZV0sKQorICAgICAgICBzdHJnID0geG1scnBjbGliLmR1bXBzKGFyZzEsIGFsbG93X25vbmU9VHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB4bWxycGNsaWIubG9hZHMoc3RyZylbMF1bMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeG1scnBjbGliLmR1bXBzLCAoYXJnMSwpKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9lbmNvZGluZ19pc3N1ZXMoc2VsZik6CisgICAgICAgICMgU0YgYnVnICMxMTE1OTg5OiB3cm9uZyBkZWNvZGluZyBpbiAnX3N0cmluZ2lmeScKKyAgICAgICAgdXRmOCA9ICIiIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzby04ODU5LTEnPz4KKyAgICAgICAgICAgICAgICAgIDxwYXJhbXM+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhbT48dmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgPHN0cmluZz5hYmMgXHg5NTwvc3RyaW5nPgorICAgICAgICAgICAgICAgICAgICAgIDwvdmFsdWU+PC9wYXJhbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmFtPjx2YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICA8c3RydWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZGVmIFx4OTY8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT48c3RyaW5nPmdoaSBceDk3PC9zdHJpbmc+PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N0cnVjdD4KKyAgICAgICAgICAgICAgICAgICAgICA8L3ZhbHVlPjwvcGFyYW0+CisgICAgICAgICAgICAgICAgICA8L3BhcmFtcz4KKyAgICAgICAgICAgICAgICAgICIiIgorCisgICAgICAgICMgc3lzLnNldGRlZmF1bHRlbmNvZGluZygpIG5vcm1hbGx5IGRvZXNuJ3QgZXhpc3QgYWZ0ZXIgc2l0ZS5weSBpcworICAgICAgICAjIGxvYWRlZC4gIEltcG9ydCBhIHRlbXBvcmFyeSBmcmVzaCBjb3B5IHRvIGdldCBhY2Nlc3MgdG8gaXQKKyAgICAgICAgIyBidXQgdGhlbiByZXN0b3JlIHRoZSBvcmlnaW5hbCBjb3B5IHRvIGF2b2lkIG1lc3Npbmcgd2l0aAorICAgICAgICAjIG90aGVyIHBvdGVudGlhbGx5IG1vZGlmaWVkIHN5cyBtb2R1bGUgYXR0cmlidXRlcworICAgICAgICBvbGRfZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuQ2xlYW5JbXBvcnQoJ3N5cycpOgorICAgICAgICAgICAgaW1wb3J0IHN5cyBhcyB0ZW1wX3N5cworICAgICAgICAgICAgdGVtcF9zeXMuc2V0ZGVmYXVsdGVuY29kaW5nKCJpc28tODg1OS0xIikKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAocywgZCksIG0gPSB4bWxycGNsaWIubG9hZHModXRmOCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgdGVtcF9zeXMuc2V0ZGVmYXVsdGVuY29kaW5nKG9sZF9lbmNvZGluZykKKworICAgICAgICBpdGVtcyA9IGQuaXRlbXMoKQorICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMsIHUiYWJjIFx4OTUiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHMsIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW1zLCBbKHUiZGVmIFx4OTYiLCB1ImdoaSBceDk3IildKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGl0ZW1zWzBdWzBdLCB1bmljb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGl0ZW1zWzBdWzFdLCB1bmljb2RlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCAiYWJjIFx4YzJceDk1IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFsoImRlZiBceGMyXHg5NiIsICJnaGkgXHhjMlx4OTciKV0pCisKKworY2xhc3MgSGVscGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VzY2FwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4bWxycGNsaWIuZXNjYXBlKCJhJmIiKSwgImEmYW1wO2IiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHhtbHJwY2xpYi5lc2NhcGUoImE8YiIpLCAiYSZsdDtiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4bWxycGNsaWIuZXNjYXBlKCJhPmIiKSwgImEmZ3Q7YiIpCisKK2NsYXNzIEZhdWx0VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgIGYgPSB4bWxycGNsaWIuRmF1bHQoNDIsICdUZXN0IEZhdWx0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGYpLCAiPEZhdWx0IDQyOiAnVGVzdCBGYXVsdCc+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGYpLCBzdHIoZikpCisKKyAgICBkZWYgdGVzdF9kdW1wX2ZhdWx0KHNlbGYpOgorICAgICAgICBmID0geG1scnBjbGliLkZhdWx0KDQyLCAnVGVzdCBGYXVsdCcpCisgICAgICAgIHMgPSB4bWxycGNsaWIuZHVtcHMoKGYsKSkKKyAgICAgICAgKG5ld2YsKSwgbSA9IHhtbHJwY2xpYi5sb2FkcyhzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5ld2YsIHsnZmF1bHRDb2RlJzogNDIsICdmYXVsdFN0cmluZyc6ICdUZXN0IEZhdWx0J30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobSwgTm9uZSkKKworICAgICAgICBzID0geG1scnBjbGliLk1hcnNoYWxsZXIoKS5kdW1wcyhmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWxycGNsaWIuRmF1bHQsIHhtbHJwY2xpYi5sb2FkcywgcykKKworCitjbGFzcyBEYXRlVGltZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9kZWZhdWx0KHNlbGYpOgorICAgICAgICB0ID0geG1scnBjbGliLkRhdGVUaW1lKCkKKworICAgIGRlZiB0ZXN0X3RpbWUoc2VsZik6CisgICAgICAgIGQgPSAxMTgxMzk5OTMwLjAzNjk1MgorICAgICAgICB0ID0geG1scnBjbGliLkRhdGVUaW1lKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCB0aW1lLnN0cmZ0aW1lKCIlWSVtJWRUJUg6JU06JVMiLCB0aW1lLmxvY2FsdGltZShkKSkpCisKKyAgICBkZWYgdGVzdF90aW1lX3R1cGxlKHNlbGYpOgorICAgICAgICBkID0gKDIwMDcsNiw5LDEwLDM4LDUwLDUsMTYwLDApCisgICAgICAgIHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksICcyMDA3MDYwOVQxMDozODo1MCcpCisKKyAgICBkZWYgdGVzdF90aW1lX3N0cnVjdChzZWxmKToKKyAgICAgICAgZCA9IHRpbWUubG9jYWx0aW1lKDExODEzOTk5MzAuMDM2OTUyKQorICAgICAgICB0ID0geG1scnBjbGliLkRhdGVUaW1lKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAgdGltZS5zdHJmdGltZSgiJVklbSVkVCVIOiVNOiVTIiwgZCkpCisKKyAgICBkZWYgdGVzdF9kYXRldGltZV9kYXRldGltZShzZWxmKToKKyAgICAgICAgZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMDcsMSwyLDMsNCw1KQorICAgICAgICB0ID0geG1scnBjbGliLkRhdGVUaW1lKGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQpLCAnMjAwNzAxMDJUMDM6MDQ6MDUnKQorCisgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKKyAgICAgICAgZCA9IGRhdGV0aW1lLmRhdGV0aW1lKDIwMDcsMSwyLDMsNCw1KQorICAgICAgICB0ID0geG1scnBjbGliLkRhdGVUaW1lKGQpCisgICAgICAgIHZhbCA9IjxEYXRlVGltZSAnMjAwNzAxMDJUMDM6MDQ6MDUnIGF0ICV4PiIgJSBpZCh0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodCksIHZhbCkKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZCA9ICcgMjAwNzA5MDhUMDc6MTE6MTMgICcKKyAgICAgICAgdDEgPSB4bWxycGNsaWIuRGF0ZVRpbWUoKQorICAgICAgICB0MS5kZWNvZGUoZCkKKyAgICAgICAgdHJlZiA9IHhtbHJwY2xpYi5EYXRlVGltZShkYXRldGltZS5kYXRldGltZSgyMDA3LDksOCw3LDExLDEzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdHJlZikKKworICAgICAgICB0MiA9IHhtbHJwY2xpYi5fZGF0ZXRpbWUoZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdHJlZikKKworY2xhc3MgQmluYXJ5VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2RlZmF1bHQoc2VsZik6CisgICAgICAgIHQgPSB4bWxycGNsaWIuQmluYXJ5KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodCksICcnKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nKHNlbGYpOgorICAgICAgICBkID0gJ1x4MDFceDAyXHgwM2FiYzEyM1x4ZmZceGZlJworICAgICAgICB0ID0geG1scnBjbGliLkJpbmFyeShkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih0KSwgZCkKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZCA9ICdceDAxXHgwMlx4MDNhYmMxMjNceGZmXHhmZScKKyAgICAgICAgZGUgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKGQpCisgICAgICAgIHQxID0geG1scnBjbGliLkJpbmFyeSgpCisgICAgICAgIHQxLmRlY29kZShkZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodDEpLCBkKQorCisgICAgICAgIHQyID0geG1scnBjbGliLl9iaW5hcnkoZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHQyKSwgZCkKKworCitBRERSID0gUE9SVCA9IFVSTCA9IE5vbmUKKworIyBUaGUgZXZ0IGlzIHNldCB0d2ljZS4gIEZpcnN0IHdoZW4gdGhlIHNlcnZlciBpcyByZWFkeSB0byBzZXJ2ZS4KKyMgU2Vjb25kIHdoZW4gdGhlIHNlcnZlciBoYXMgYmVlbiBzaHV0ZG93bi4gIFRoZSB1c2VyIG11c3QgY2xlYXIKKyMgdGhlIGV2ZW50IGFmdGVyIGl0IGhhcyBiZWVuIHNldCB0aGUgZmlyc3QgdGltZSB0byBjYXRjaCB0aGUgc2Vjb25kIHNldC4KK2RlZiBodHRwX3NlcnZlcihldnQsIG51bXJlcXVlc3RzLCByZXF1ZXN0SGFuZGxlcj1Ob25lKToKKyAgICBjbGFzcyBUZXN0SW5zdGFuY2VDbGFzczoKKyAgICAgICAgZGVmIGRpdihzZWxmLCB4LCB5KToKKyAgICAgICAgICAgIHJldHVybiB4IC8vIHkKKworICAgICAgICBkZWYgX21ldGhvZEhlbHAoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBpZiBuYW1lID09ICdkaXYnOgorICAgICAgICAgICAgICAgIHJldHVybiAnVGhpcyBpcyB0aGUgZGl2IGZ1bmN0aW9uJworCisgICAgZGVmIG15X2Z1bmN0aW9uKCk6CisgICAgICAgICcnJ1RoaXMgaXMgbXkgZnVuY3Rpb24nJycKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGNsYXNzIE15WE1MUlBDU2VydmVyKFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXIpOgorICAgICAgICBkZWYgZ2V0X3JlcXVlc3Qoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0aGUgc29ja2V0IGlzIGFsd2F5cyBub24tYmxvY2tpbmcuICBPbiBMaW51eCwgc29ja2V0CisgICAgICAgICAgICAjIGF0dHJpYnV0ZXMgYXJlIG5vdCBpbmhlcml0ZWQgbGlrZSB0aGV5IGFyZSBvbiAqQlNEIGFuZCBXaW5kb3dzLgorICAgICAgICAgICAgcywgcG9ydCA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICBzLnNldGJsb2NraW5nKFRydWUpCisgICAgICAgICAgICByZXR1cm4gcywgcG9ydAorCisgICAgaWYgbm90IHJlcXVlc3RIYW5kbGVyOgorICAgICAgICByZXF1ZXN0SGFuZGxlciA9IFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcgorICAgIHNlcnYgPSBNeVhNTFJQQ1NlcnZlcigoImxvY2FsaG9zdCIsIDApLCByZXF1ZXN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nUmVxdWVzdHM9RmFsc2UsIGJpbmRfYW5kX2FjdGl2YXRlPUZhbHNlKQorICAgIHRyeToKKyAgICAgICAgc2Vydi5zb2NrZXQuc2V0dGltZW91dCgzKQorICAgICAgICBzZXJ2LnNlcnZlcl9iaW5kKCkKKyAgICAgICAgZ2xvYmFsIEFERFIsIFBPUlQsIFVSTAorICAgICAgICBBRERSLCBQT1JUID0gc2Vydi5zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgICAgICAjY29ubmVjdCB0byBJUCBhZGRyZXNzIGRpcmVjdGx5LiAgVGhpcyBhdm9pZHMgc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKCkKKyAgICAgICAgI3RyeWluZyB0byBjb25uZWN0IHRvICJsb2NhbGhvc3QiIHVzaW5nIGFsbCBhZGRyZXNzIGZhbWlsaWVzLCB3aGljaAorICAgICAgICAjY2F1c2VzIHNsb3dkb3duIGUuZy4gb24gdmlzdGEgd2hpY2ggc3VwcG9ydHMgQUZfSU5FVDYuICBUaGUgc2VydmVyIGxpc3RlbnMKKyAgICAgICAgI29uIEFGX0lORVQgb25seS4KKyAgICAgICAgVVJMID0gImh0dHA6Ly8lczolZCIlKEFERFIsIFBPUlQpCisgICAgICAgIHNlcnYuc2VydmVyX2FjdGl2YXRlKCkKKyAgICAgICAgc2Vydi5yZWdpc3Rlcl9pbnRyb3NwZWN0aW9uX2Z1bmN0aW9ucygpCisgICAgICAgIHNlcnYucmVnaXN0ZXJfbXVsdGljYWxsX2Z1bmN0aW9ucygpCisgICAgICAgIHNlcnYucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorICAgICAgICBzZXJ2LnJlZ2lzdGVyX2Z1bmN0aW9uKGxhbWJkYSB4LHk6IHgreSwgJ2FkZCcpCisgICAgICAgIHNlcnYucmVnaXN0ZXJfZnVuY3Rpb24obXlfZnVuY3Rpb24pCisgICAgICAgIHNlcnYucmVnaXN0ZXJfaW5zdGFuY2UoVGVzdEluc3RhbmNlQ2xhc3MoKSkKKyAgICAgICAgZXZ0LnNldCgpCisKKyAgICAgICAgIyBoYW5kbGUgdXAgdG8gJ251bXJlcXVlc3RzJyByZXF1ZXN0cworICAgICAgICB3aGlsZSBudW1yZXF1ZXN0cyA+IDA6CisgICAgICAgICAgICBzZXJ2LmhhbmRsZV9yZXF1ZXN0KCkKKyAgICAgICAgICAgIG51bXJlcXVlc3RzIC09IDEKKworICAgIGV4Y2VwdCBzb2NrZXQudGltZW91dDoKKyAgICAgICAgcGFzcworICAgIGZpbmFsbHk6CisgICAgICAgIHNlcnYuc29ja2V0LmNsb3NlKCkKKyAgICAgICAgUE9SVCA9IE5vbmUKKyAgICAgICAgZXZ0LnNldCgpCisKK2RlZiBodHRwX211bHRpX3NlcnZlcihldnQsIG51bXJlcXVlc3RzLCByZXF1ZXN0SGFuZGxlcj1Ob25lKToKKyAgICBjbGFzcyBUZXN0SW5zdGFuY2VDbGFzczoKKyAgICAgICAgZGVmIGRpdihzZWxmLCB4LCB5KToKKyAgICAgICAgICAgIHJldHVybiB4IC8vIHkKKworICAgICAgICBkZWYgX21ldGhvZEhlbHAoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBpZiBuYW1lID09ICdkaXYnOgorICAgICAgICAgICAgICAgIHJldHVybiAnVGhpcyBpcyB0aGUgZGl2IGZ1bmN0aW9uJworCisgICAgZGVmIG15X2Z1bmN0aW9uKCk6CisgICAgICAgICcnJ1RoaXMgaXMgbXkgZnVuY3Rpb24nJycKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgIGNsYXNzIE15WE1MUlBDU2VydmVyKFNpbXBsZVhNTFJQQ1NlcnZlci5NdWx0aVBhdGhYTUxSUENTZXJ2ZXIpOgorICAgICAgICBkZWYgZ2V0X3JlcXVlc3Qoc2VsZik6CisgICAgICAgICAgICAjIEVuc3VyZSB0aGUgc29ja2V0IGlzIGFsd2F5cyBub24tYmxvY2tpbmcuICBPbiBMaW51eCwgc29ja2V0CisgICAgICAgICAgICAjIGF0dHJpYnV0ZXMgYXJlIG5vdCBpbmhlcml0ZWQgbGlrZSB0aGV5IGFyZSBvbiAqQlNEIGFuZCBXaW5kb3dzLgorICAgICAgICAgICAgcywgcG9ydCA9IHNlbGYuc29ja2V0LmFjY2VwdCgpCisgICAgICAgICAgICBzLnNldGJsb2NraW5nKFRydWUpCisgICAgICAgICAgICByZXR1cm4gcywgcG9ydAorCisgICAgaWYgbm90IHJlcXVlc3RIYW5kbGVyOgorICAgICAgICByZXF1ZXN0SGFuZGxlciA9IFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcgorICAgIGNsYXNzIE15UmVxdWVzdEhhbmRsZXIocmVxdWVzdEhhbmRsZXIpOgorICAgICAgICBycGNfcGF0aHMgPSBbXQorCisgICAgc2VydiA9IE15WE1MUlBDU2VydmVyKCgibG9jYWxob3N0IiwgMCksIE15UmVxdWVzdEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ1JlcXVlc3RzPUZhbHNlLCBiaW5kX2FuZF9hY3RpdmF0ZT1GYWxzZSkKKyAgICBzZXJ2LnNvY2tldC5zZXR0aW1lb3V0KDMpCisgICAgc2Vydi5zZXJ2ZXJfYmluZCgpCisgICAgdHJ5OgorICAgICAgICBnbG9iYWwgQUREUiwgUE9SVCwgVVJMCisgICAgICAgIEFERFIsIFBPUlQgPSBzZXJ2LnNvY2tldC5nZXRzb2NrbmFtZSgpCisgICAgICAgICNjb25uZWN0IHRvIElQIGFkZHJlc3MgZGlyZWN0bHkuICBUaGlzIGF2b2lkcyBzb2NrZXQuY3JlYXRlX2Nvbm5lY3Rpb24oKQorICAgICAgICAjdHJ5aW5nIHRvIGNvbm5lY3QgdG8gImxvY2FsaG9zdCIgdXNpbmcgYWxsIGFkZHJlc3MgZmFtaWxpZXMsIHdoaWNoCisgICAgICAgICNjYXVzZXMgc2xvd2Rvd24gZS5nLiBvbiB2aXN0YSB3aGljaCBzdXBwb3J0cyBBRl9JTkVUNi4gIFRoZSBzZXJ2ZXIgbGlzdGVucworICAgICAgICAjb24gQUZfSU5FVCBvbmx5LgorICAgICAgICBVUkwgPSAiaHR0cDovLyVzOiVkIiUoQUREUiwgUE9SVCkKKyAgICAgICAgc2Vydi5zZXJ2ZXJfYWN0aXZhdGUoKQorICAgICAgICBwYXRocyA9IFsiL2ZvbyIsICIvZm9vL2JhciJdCisgICAgICAgIGZvciBwYXRoIGluIHBhdGhzOgorICAgICAgICAgICAgZCA9IHNlcnYuYWRkX2Rpc3BhdGNoZXIocGF0aCwgU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ0Rpc3BhdGNoZXIoKSkKKyAgICAgICAgICAgIGQucmVnaXN0ZXJfaW50cm9zcGVjdGlvbl9mdW5jdGlvbnMoKQorICAgICAgICAgICAgZC5yZWdpc3Rlcl9tdWx0aWNhbGxfZnVuY3Rpb25zKCkKKyAgICAgICAgc2Vydi5nZXRfZGlzcGF0Y2hlcihwYXRoc1swXSkucmVnaXN0ZXJfZnVuY3Rpb24ocG93KQorICAgICAgICBzZXJ2LmdldF9kaXNwYXRjaGVyKHBhdGhzWzFdKS5yZWdpc3Rlcl9mdW5jdGlvbihsYW1iZGEgeCx5OiB4K3ksICdhZGQnKQorICAgICAgICBldnQuc2V0KCkKKworICAgICAgICAjIGhhbmRsZSB1cCB0byAnbnVtcmVxdWVzdHMnIHJlcXVlc3RzCisgICAgICAgIHdoaWxlIG51bXJlcXVlc3RzID4gMDoKKyAgICAgICAgICAgIHNlcnYuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICAgICAgbnVtcmVxdWVzdHMgLT0gMQorCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwYXNzCisgICAgZmluYWxseToKKyAgICAgICAgc2Vydi5zb2NrZXQuY2xvc2UoKQorICAgICAgICBQT1JUID0gTm9uZQorICAgICAgICBldnQuc2V0KCkKKworIyBUaGlzIGZ1bmN0aW9uIHByZXZlbnRzIGVycm9ycyBsaWtlOgorIyAgICA8UHJvdG9jb2xFcnJvciBmb3IgbG9jYWxob3N0OjU3NTI3L1JQQzI6IDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3I+CitkZWYgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpOgorICAgICcnJ1JldHVybnMgVHJ1ZSBpZiB0aGUgZ2l2ZW4gUHJvdG9jb2xFcnJvciBpcyB0aGUgcHJvZHVjdCBvZiBhIHNlcnZlci1zaWRlCisgICAgICAgZXhjZXB0aW9uIGNhdXNlZCBieSB0aGUgJ3RlbXBvcmFyaWx5IHVuYXZhaWxhYmxlJyByZXNwb25zZSBzb21ldGltZXMKKyAgICAgICBnaXZlbiBieSBvcGVyYXRpb25zIG9uIG5vbi1ibG9ja2luZyBzb2NrZXRzLicnJworCisgICAgIyBzb21ldGltZXMgd2UgZ2V0IGEgLTEgZXJyb3IgY29kZSBhbmQvb3IgZW1wdHkgaGVhZGVycworICAgIHRyeToKKyAgICAgICAgaWYgZS5lcnJjb2RlID09IC0xIG9yIGUuaGVhZGVycyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgZXhjX21lc3MgPSBlLmhlYWRlcnMuZ2V0KCdYLWV4Y2VwdGlvbicpCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAjIElnbm9yZSBzb2NrZXQuZXJyb3JzIGhlcmUuCisgICAgICAgIGV4Y19tZXNzID0gc3RyKGUpCisKKyAgICBpZiBleGNfbWVzcyBhbmQgJ3RlbXBvcmFyaWx5IHVuYXZhaWxhYmxlJyBpbiBleGNfbWVzcy5sb3dlcigpOgorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgcmV0dXJuIEZhbHNlCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKHRocmVhZGluZywgJ1RocmVhZGluZyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0LicpCitjbGFzcyBCYXNlU2VydmVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIHJlcXVlc3RIYW5kbGVyID0gTm9uZQorICAgIHJlcXVlc3RfY291bnQgPSAxCisgICAgdGhyZWFkRnVuYyA9IHN0YXRpY21ldGhvZChodHRwX3NlcnZlcikKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBlbmFibGUgdHJhY2ViYWNrIHJlcG9ydGluZworICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDU2VydmVyLl9zZW5kX3RyYWNlYmFja19oZWFkZXIgPSBUcnVlCisKKyAgICAgICAgc2VsZi5ldnQgPSB0aHJlYWRpbmcuRXZlbnQoKQorICAgICAgICAjIHN0YXJ0IHNlcnZlciB0aHJlYWQgdG8gaGFuZGxlIHJlcXVlc3RzCisgICAgICAgIHNlcnZfYXJncyA9IChzZWxmLmV2dCwgc2VsZi5yZXF1ZXN0X2NvdW50LCBzZWxmLnJlcXVlc3RIYW5kbGVyKQorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1zZWxmLnRocmVhZEZ1bmMsIGFyZ3M9c2Vydl9hcmdzKS5zdGFydCgpCisKKyAgICAgICAgIyB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGJlIHJlYWR5CisgICAgICAgIHNlbGYuZXZ0LndhaXQoMTApCisgICAgICAgIHNlbGYuZXZ0LmNsZWFyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyB3YWl0IG9uIHRoZSBzZXJ2ZXIgdGhyZWFkIHRvIHRlcm1pbmF0ZQorICAgICAgICBzZWxmLmV2dC53YWl0KDEwKQorCisgICAgICAgICMgZGlzYWJsZSB0cmFjZWJhY2sgcmVwb3J0aW5nCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXIuX3NlbmRfdHJhY2ViYWNrX2hlYWRlciA9IEZhbHNlCisKKyMgTk9URTogVGhlIHRlc3RzIGluIFNpbXBsZVNlcnZlclRlc3RDYXNlIHdpbGwgaWdub3JlIGZhaWx1cmVzIGNhdXNlZCBieQorIyAidGVtcG9yYXJpbHkgdW5hdmFpbGFibGUiIGV4Y2VwdGlvbnMgcmFpc2VkIGluIFNpbXBsZVhNTFJQQ1NlcnZlci4gIFRoaXMKKyMgY29uZGl0aW9uIG9jY3VycyBpbmZyZXF1ZW50bHkgb24gc29tZSBwbGF0Zm9ybXMsIGZyZXF1ZW50bHkgb24gb3RoZXJzLCBhbmQKKyMgaXMgYXBwYXJlbnRseSBjYXVzZWQgYnkgdXNpbmcgU2ltcGxlWE1MUlBDU2VydmVyIHdpdGggYSBub24tYmxvY2tpbmcgc29ja2V0CisjIElmIHRoZSBzZXJ2ZXIgY2xhc3MgaXMgdXBkYXRlZCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgdG8gaGFuZGxlIHRoaXMKKyMgc2l0dWF0aW9uIG1vcmUgZ3JhY2VmdWxseSwgdGhlc2UgdGVzdHMgc2hvdWxkIGJlIG1vZGlmaWVkIGFwcHJvcHJpYXRlbHkuCisKK2NsYXNzIFNpbXBsZVNlcnZlclRlc3RDYXNlKEJhc2VTZXJ2ZXJUZXN0Q2FzZSk6CisgICAgZGVmIHRlc3Rfc2ltcGxlMShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKToKKyAgICAgICAgICAgICAgICAjIHByb3RvY29sIGVycm9yOyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGVzdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzXG4lcyIgJSAoZSwgZ2V0YXR0cihlLCAiaGVhZGVycyIsICIiKSkpCisKKyAgICBkZWYgdGVzdF9ub25hc2NpaShzZWxmKToKKyAgICAgICAgc3RhcnRfc3RyaW5nID0gJ1BcTntMQVRJTiBTTUFMTCBMRVRURVIgWSBXSVRIIENJUkNVTUZMRVh9dCcKKyAgICAgICAgZW5kX3N0cmluZyA9ICdoXE57TEFUSU4gU01BTEwgTEVUVEVSIE8gV0lUSCBIT1JOfW4nCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYWRkKHN0YXJ0X3N0cmluZywgZW5kX3N0cmluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X3N0cmluZyArIGVuZF9zdHJpbmcpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvcikgYXMgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0IHVuYXZhaWxhYmxlIGVycm9ycy4KKyAgICAgICAgICAgIGlmIG5vdCBpc191bmF2YWlsYWJsZV9leGNlcHRpb24oZSk6CisgICAgICAgICAgICAgICAgIyBwcm90b2NvbCBlcnJvcjsgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRlc3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlc1xuJXMiICUgKGUsIGdldGF0dHIoZSwgImhlYWRlcnMiLCAiIikpKQorCisgICAgZGVmIHRlc3RfdW5pY29kZV9ob3N0KHNlbGYpOgorICAgICAgICBzZXJ2ZXIgPSB4bWxycGNsaWIuU2VydmVyUHJveHkodSJodHRwOi8vJXM6JWQvUlBDMiIlKEFERFIsIFBPUlQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlcnZlci5hZGQoImEiLCB1Ilx4ZTkiKSwgdSJhXHhlOSIpCisKKyAgICAjIFtjaF0gVGhlIHRlc3QgNDA0IGlzIGNhdXNpbmcgbG90cyBvZiBmYWxzZSBhbGFybXMuCisgICAgZGVmIFhYWHRlc3RfNDA0KHNlbGYpOgorICAgICAgICAjIHNlbmQgUE9TVCB3aXRoIGh0dHBsaWIsIGl0IHNob3VsZCByZXR1cm4gNDA0IGhlYWRlciBhbmQKKyAgICAgICAgIyAnTm90IEZvdW5kJyBtZXNzYWdlLgorICAgICAgICBjb25uID0gaHR0cGxpYi5IVFRQQ29ubmVjdGlvbihBRERSLCBQT1JUKQorICAgICAgICBjb25uLnJlcXVlc3QoJ1BPU1QnLCAnL3RoaXMtaXMtbm90LXZhbGlkJykKKyAgICAgICAgcmVzcG9uc2UgPSBjb25uLmdldHJlc3BvbnNlKCkKKyAgICAgICAgY29ubi5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5zdGF0dXMsIDQwNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNwb25zZS5yZWFzb24sICdOb3QgRm91bmQnKQorCisgICAgZGVmIHRlc3RfaW50cm9zcGVjdGlvbjEoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAgICAgbWV0aCA9IHAuc3lzdGVtLmxpc3RNZXRob2RzKCkKKyAgICAgICAgICAgIGV4cGVjdGVkX21ldGhvZHMgPSBzZXQoWydwb3cnLCAnZGl2JywgJ215X2Z1bmN0aW9uJywgJ2FkZCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc3lzdGVtLmxpc3RNZXRob2RzJywgJ3N5c3RlbS5tZXRob2RIZWxwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeXN0ZW0ubWV0aG9kU2lnbmF0dXJlJywgJ3N5c3RlbS5tdWx0aWNhbGwnXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KG1ldGgpLCBleHBlY3RlZF9tZXRob2RzKQorICAgICAgICBleGNlcHQgKHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yLCBzb2NrZXQuZXJyb3IpLCBlOgorICAgICAgICAgICAgIyBpZ25vcmUgZmFpbHVyZXMgZHVlIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQgJ3VuYXZhaWxhYmxlJyBlcnJvcnMKKyAgICAgICAgICAgIGlmIG5vdCBpc191bmF2YWlsYWJsZV9leGNlcHRpb24oZSk6CisgICAgICAgICAgICAgICAgIyBwcm90b2NvbCBlcnJvcjsgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRlc3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlc1xuJXMiICUgKGUsIGdldGF0dHIoZSwgImhlYWRlcnMiLCAiIikpKQorCisgICAgZGVmIHRlc3RfaW50cm9zcGVjdGlvbjIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgdGVzdCBfbWV0aG9kSGVscCgpCisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIGRpdmhlbHAgPSBwLnN5c3RlbS5tZXRob2RIZWxwKCdkaXYnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZoZWxwLCAnVGhpcyBpcyB0aGUgZGl2IGZ1bmN0aW9uJykKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSwgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0ICd1bmF2YWlsYWJsZScgZXJyb3JzCisgICAgICAgICAgICBpZiBub3QgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpOgorICAgICAgICAgICAgICAgICMgcHJvdG9jb2wgZXJyb3I7IHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0ZXN0IG91dHB1dAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXNcbiVzIiAlIChlLCBnZXRhdHRyKGUsICJoZWFkZXJzIiwgIiIpKSkKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0X2ludHJvc3BlY3Rpb24zKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHRlc3QgbmF0aXZlIGRvYworICAgICAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICAgICBteWZ1bmN0aW9uID0gcC5zeXN0ZW0ubWV0aG9kSGVscCgnbXlfZnVuY3Rpb24nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChteWZ1bmN0aW9uLCAnVGhpcyBpcyBteSBmdW5jdGlvbicpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKToKKyAgICAgICAgICAgICAgICAjIHByb3RvY29sIGVycm9yOyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGVzdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzXG4lcyIgJSAoZSwgZ2V0YXR0cihlLCAiaGVhZGVycyIsICIiKSkpCisKKyAgICBkZWYgdGVzdF9pbnRyb3NwZWN0aW9uNChzZWxmKToKKyAgICAgICAgIyB0aGUgU2ltcGxlWE1MUlBDU2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBzaWduYXR1cmVzLCBidXQKKyAgICAgICAgIyBhdCBsZWFzdCBjaGVjayB0aGF0IHdlIGNhbiB0cnkgbWFraW5nIHRoZSBjYWxsCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAgICAgZGl2c2lnID0gcC5zeXN0ZW0ubWV0aG9kU2lnbmF0dXJlKCdkaXYnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXZzaWcsICdzaWduYXR1cmVzIG5vdCBzdXBwb3J0ZWQnKQorICAgICAgICBleGNlcHQgKHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yLCBzb2NrZXQuZXJyb3IpLCBlOgorICAgICAgICAgICAgIyBpZ25vcmUgZmFpbHVyZXMgZHVlIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQgJ3VuYXZhaWxhYmxlJyBlcnJvcnMKKyAgICAgICAgICAgIGlmIG5vdCBpc191bmF2YWlsYWJsZV9leGNlcHRpb24oZSk6CisgICAgICAgICAgICAgICAgIyBwcm90b2NvbCBlcnJvcjsgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRlc3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlc1xuJXMiICUgKGUsIGdldGF0dHIoZSwgImhlYWRlcnMiLCAiIikpKQorCisgICAgZGVmIHRlc3RfbXVsdGljYWxsKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIG11bHRpY2FsbCA9IHhtbHJwY2xpYi5NdWx0aUNhbGwocCkKKyAgICAgICAgICAgIG11bHRpY2FsbC5hZGQoMiwzKQorICAgICAgICAgICAgbXVsdGljYWxsLnBvdyg2LDgpCisgICAgICAgICAgICBtdWx0aWNhbGwuZGl2KDEyNyw0MikKKyAgICAgICAgICAgIGFkZF9yZXN1bHQsIHBvd19yZXN1bHQsIGRpdl9yZXN1bHQgPSBtdWx0aWNhbGwoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZGRfcmVzdWx0LCAyKzMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvd19yZXN1bHQsIDYqKjgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpdl9yZXN1bHQsIDEyNy8vNDIpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKToKKyAgICAgICAgICAgICAgICAjIHByb3RvY29sIGVycm9yOyBwcm92aWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGVzdCBvdXRwdXQKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIiVzXG4lcyIgJSAoZSwgZ2V0YXR0cihlLCAiaGVhZGVycyIsICIiKSkpCisKKyAgICBkZWYgdGVzdF9ub25fZXhpc3RpbmdfbXVsdGljYWxsKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIG11bHRpY2FsbCA9IHhtbHJwY2xpYi5NdWx0aUNhbGwocCkKKyAgICAgICAgICAgIG11bHRpY2FsbC50aGlzX2lzX25vdF9leGlzdHMoKQorICAgICAgICAgICAgcmVzdWx0ID0gbXVsdGljYWxsKCkKKworICAgICAgICAgICAgIyByZXN1bHQucmVzdWx0cyBjb250YWluczsKKyAgICAgICAgICAgICMgW3snZmF1bHRDb2RlJzogMSwgJ2ZhdWx0U3RyaW5nJzogJzx0eXBlIFwnZXhjZXB0aW9ucy5FeGNlcHRpb25cJz46JworICAgICAgICAgICAgIyAgICdtZXRob2QgInRoaXNfaXNfbm90X2V4aXN0cyIgaXMgbm90IHN1cHBvcnRlZCc+fV0KKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQucmVzdWx0c1swXVsnZmF1bHRDb2RlJ10sIDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5yZXN1bHRzWzBdWydmYXVsdFN0cmluZyddLAorICAgICAgICAgICAgICAgICc8dHlwZSBcJ2V4Y2VwdGlvbnMuRXhjZXB0aW9uXCc+Om1ldGhvZCAidGhpc19pc19ub3RfZXhpc3RzIiAnCisgICAgICAgICAgICAgICAgJ2lzIG5vdCBzdXBwb3J0ZWQnKQorICAgICAgICBleGNlcHQgKHhtbHJwY2xpYi5Qcm90b2NvbEVycm9yLCBzb2NrZXQuZXJyb3IpLCBlOgorICAgICAgICAgICAgIyBpZ25vcmUgZmFpbHVyZXMgZHVlIHRvIG5vbi1ibG9ja2luZyBzb2NrZXQgJ3VuYXZhaWxhYmxlJyBlcnJvcnMKKyAgICAgICAgICAgIGlmIG5vdCBpc191bmF2YWlsYWJsZV9leGNlcHRpb24oZSk6CisgICAgICAgICAgICAgICAgIyBwcm90b2NvbCBlcnJvcjsgcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGluIHRlc3Qgb3V0cHV0CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlc1xuJXMiICUgKGUsIGdldGF0dHIoZSwgImhlYWRlcnMiLCAiIikpKQorCisgICAgZGVmIHRlc3RfZG90dGVkX2F0dHJpYnV0ZShzZWxmKToKKyAgICAgICAgIyBSYWlzZXMgYW4gQXR0cmlidXRlRXJyb3IgYmVjYXVzZSBwcml2YXRlIG1ldGhvZHMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlWE1MUlBDU2VydmVyLnJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZSwgc3RyLCAnX19hZGQnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShTaW1wbGVYTUxSUENTZXJ2ZXIucmVzb2x2ZV9kb3R0ZWRfYXR0cmlidXRlKHN0ciwgJ3RpdGxlJykpCisgICAgICAgICMgR2V0IHRoZSB0ZXN0IHRvIHJ1biBmYXN0ZXIgYnkgc2VuZGluZyBhIHJlcXVlc3Qgd2l0aCB0ZXN0X3NpbXBsZTEuCisgICAgICAgICMgVGhpcyBhdm9pZHMgd2FpdGluZyBmb3IgdGhlIHNvY2tldCB0aW1lb3V0LgorICAgICAgICBzZWxmLnRlc3Rfc2ltcGxlMSgpCisKKyAgICBkZWYgdGVzdF9wYXJ0aWFsX3Bvc3Qoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCBhIHBhcnRpYWwgUE9TVCBkb2Vzbid0IG1ha2UgdGhlIHNlcnZlciBsb29wOiBpc3N1ZSAjMTQwMDEuCisgICAgICAgIGNvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEFERFIsIFBPUlQpCisgICAgICAgIGNvbm4ucmVxdWVzdCgnUE9TVCcsICcvUlBDMiBIVFRQLzEuMFxyXG5Db250ZW50LUxlbmd0aDogMTAwXHJcblxyXG5ieWUnKQorICAgICAgICBjb25uLmNsb3NlKCkKKworY2xhc3MgTXVsdGlQYXRoU2VydmVyVGVzdENhc2UoQmFzZVNlcnZlclRlc3RDYXNlKToKKyAgICB0aHJlYWRGdW5jID0gc3RhdGljbWV0aG9kKGh0dHBfbXVsdGlfc2VydmVyKQorICAgIHJlcXVlc3RfY291bnQgPSAyCisgICAgZGVmIHRlc3RfcGF0aDEoc2VsZik6CisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKyIvZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh4bWxycGNsaWIuRmF1bHQsIHAuYWRkLCA2LCA4KQorICAgIGRlZiB0ZXN0X3BhdGgyKHNlbGYpOgorICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCsiL2Zvby9iYXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYWRkKDYsOCksIDYrOCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1scnBjbGliLkZhdWx0LCBwLnBvdywgNiwgOCkKKworI0EgdGVzdCBjYXNlIHRoYXQgdmVyaWZpZXMgdGhhdCBhIHNlcnZlciB1c2luZyB0aGUgSFRUUC8xLjEga2VlcC1hbGl2ZSBtZWNoYW5pc20KKyNkb2VzIGluZGVlZCBzZXJ2ZSBzdWJzZXF1ZW50IHJlcXVlc3RzIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24KK2NsYXNzIEJhc2VLZWVwYWxpdmVTZXJ2ZXJUZXN0Q2FzZShCYXNlU2VydmVyVGVzdENhc2UpOgorICAgICNhIHJlcXVlc3QgaGFuZGxlciB0aGF0IHN1cHBvcnRzIGtlZXAtYWxpdmUgYW5kIGxvZ3MgcmVxdWVzdHMgaW50byBhCisgICAgI2NsYXNzIHZhcmlhYmxlCisgICAgY2xhc3MgUmVxdWVzdEhhbmRsZXIoU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1JlcXVlc3RIYW5kbGVyKToKKyAgICAgICAgcGFyZW50Q2xhc3MgPSBTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIKKyAgICAgICAgcHJvdG9jb2xfdmVyc2lvbiA9ICdIVFRQLzEuMScKKyAgICAgICAgbXlSZXF1ZXN0cyA9IFtdCisgICAgICAgIGRlZiBoYW5kbGUoc2VsZik6CisgICAgICAgICAgICBzZWxmLm15UmVxdWVzdHMuYXBwZW5kKFtdKQorICAgICAgICAgICAgc2VsZi5yZXFpZHggPSBsZW4oc2VsZi5teVJlcXVlc3RzKS0xCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnRDbGFzcy5oYW5kbGUoc2VsZikKKyAgICAgICAgZGVmIGhhbmRsZV9vbmVfcmVxdWVzdChzZWxmKToKKyAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYucGFyZW50Q2xhc3MuaGFuZGxlX29uZV9yZXF1ZXN0KHNlbGYpCisgICAgICAgICAgICBzZWxmLm15UmVxdWVzdHNbc2VsZi5yZXFpZHhdLmFwcGVuZChzZWxmLnJhd19yZXF1ZXN0bGluZSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIHJlcXVlc3RIYW5kbGVyID0gUmVxdWVzdEhhbmRsZXIKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICNjbGVhciByZXF1ZXN0IGxvZworICAgICAgICBzZWxmLlJlcXVlc3RIYW5kbGVyLm15UmVxdWVzdHMgPSBbXQorICAgICAgICByZXR1cm4gQmFzZVNlcnZlclRlc3RDYXNlLnNldFVwKHNlbGYpCisKKyNBIHRlc3QgY2FzZSB0aGF0IHZlcmlmaWVzIHRoYXQgYSBzZXJ2ZXIgdXNpbmcgdGhlIEhUVFAvMS4xIGtlZXAtYWxpdmUgbWVjaGFuaXNtCisjZG9lcyBpbmRlZWQgc2VydmUgc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uCitjbGFzcyBLZWVwYWxpdmVTZXJ2ZXJUZXN0Q2FzZTEoQmFzZUtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMKQorICAgICAgICAjZG8gdGhyZWUgcmVxdWVzdHMuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisKKyAgICAgICAgI3RoZXkgc2hvdWxkIGhhdmUgYWxsIGJlZW4gaGFuZGxlZCBieSBhIHNpbmdsZSByZXF1ZXN0IGhhbmRsZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5SZXF1ZXN0SGFuZGxlci5teVJlcXVlc3RzKSwgMSkKKworICAgICAgICAjY2hlY2sgdGhhdCB3ZSBkaWQgYXQgbGVhc3QgdHdvICh0aGUgdGhpcmQgbWF5IGJlIHBlbmRpbmcgYXBwZW5kCisgICAgICAgICNkdWUgdG8gdGhyZWFkIHNjaGVkdWxpbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGxlbihzZWxmLlJlcXVlc3RIYW5kbGVyLm15UmVxdWVzdHNbLTFdKSwgMikKKworI3Rlc3Qgc3BlY2lhbCBhdHRyaWJ1dGUgYWNjZXNzIG9uIHRoZSBzZXJ2ZXJwcm94eSwgdGhyb3VnaCB0aGUgX19jYWxsX18KKyNmdW5jdGlvbi4KK2NsYXNzIEtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlMihCYXNlS2VlcGFsaXZlU2VydmVyVGVzdENhc2UpOgorICAgICNhc2sgZm9yIHR3byBrZWVwYWxpdmUgcmVxdWVzdHMgdG8gYmUgaGFuZGxlZC4KKyAgICByZXF1ZXN0X2NvdW50PTIKKworICAgIGRlZiB0ZXN0X2Nsb3NlKHNlbGYpOgorICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgI2RvIHNvbWUgcmVxdWVzdHMgd2l0aCBjbG9zZS4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgcCgiY2xvc2UiKSgpICN0aGlzIHNob3VsZCB0cmlnZ2VyIGEgbmV3IGtlZXAtYWxpdmUgcmVxdWVzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorCisgICAgICAgICN0aGV5IHNob3VsZCBoYXZlIGFsbCBiZWVuIHR3byByZXF1ZXN0IGhhbmRsZXJzLCBlYWNoIGhhdmluZyBsb2dnZWQgYXQgbGVhc3QKKyAgICAgICAgI3R3byBjb21wbGV0ZSByZXF1ZXN0cworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLlJlcXVlc3RIYW5kbGVyLm15UmVxdWVzdHMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbChsZW4oc2VsZi5SZXF1ZXN0SGFuZGxlci5teVJlcXVlc3RzWy0xXSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKGxlbihzZWxmLlJlcXVlc3RIYW5kbGVyLm15UmVxdWVzdHNbLTJdKSwgMikKKworICAgIGRlZiB0ZXN0X3RyYW5zcG9ydChzZWxmKToKKyAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICNkbyBzb21lIHJlcXVlc3RzIHdpdGggY2xvc2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgcCgidHJhbnNwb3J0IikuY2xvc2UoKSAjc2FtZSBhcyBhYm92ZSwgcmVhbGx5LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG93KDYsOCksIDYqKjgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYuUmVxdWVzdEhhbmRsZXIubXlSZXF1ZXN0cyksIDIpCisKKyNBIHRlc3QgY2FzZSB0aGF0IHZlcmlmaWVzIHRoYXQgZ3ppcCBlbmNvZGluZyB3b3JrcyBpbiBib3RoIGRpcmVjdGlvbnMKKyMoZm9yIGEgcmVxdWVzdCBhbmQgdGhlIHJlc3BvbnNlKQorY2xhc3MgR3ppcFNlcnZlclRlc3RDYXNlKEJhc2VTZXJ2ZXJUZXN0Q2FzZSk6CisgICAgI2EgcmVxdWVzdCBoYW5kbGVyIHRoYXQgc3VwcG9ydHMga2VlcC1hbGl2ZSBhbmQgbG9ncyByZXF1ZXN0cyBpbnRvIGEKKyAgICAjY2xhc3MgdmFyaWFibGUKKyAgICBjbGFzcyBSZXF1ZXN0SGFuZGxlcihTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIpOgorICAgICAgICBwYXJlbnRDbGFzcyA9IFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlcgorICAgICAgICBwcm90b2NvbF92ZXJzaW9uID0gJ0hUVFAvMS4xJworCisgICAgICAgIGRlZiBkb19QT1NUKHNlbGYpOgorICAgICAgICAgICAgI3N0b3JlIGNvbnRlbnQgb2YgbGFzdCByZXF1ZXN0IGluIGNsYXNzCisgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5jb250ZW50X2xlbmd0aCA9IGludChzZWxmLmhlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJlbnRDbGFzcy5kb19QT1NUKHNlbGYpCisgICAgcmVxdWVzdEhhbmRsZXIgPSBSZXF1ZXN0SGFuZGxlcgorCisgICAgY2xhc3MgVHJhbnNwb3J0KHhtbHJwY2xpYi5UcmFuc3BvcnQpOgorICAgICAgICAjY3VzdG9tIHRyYW5zcG9ydCwgc3RvcmVzIHRoZSByZXNwb25zZSBsZW5ndGggZm9yIG91ciBwZXJ1c2FsCisgICAgICAgIGZha2VfZ3ppcCA9IEZhbHNlCisgICAgICAgIGRlZiBwYXJzZV9yZXNwb25zZShzZWxmLCByZXNwb25zZSk6CisgICAgICAgICAgICBzZWxmLnJlc3BvbnNlX2xlbmd0aD1pbnQocmVzcG9uc2UuZ2V0aGVhZGVyKCJjb250ZW50LWxlbmd0aCIsIDApKQorICAgICAgICAgICAgcmV0dXJuIHhtbHJwY2xpYi5UcmFuc3BvcnQucGFyc2VfcmVzcG9uc2Uoc2VsZiwgcmVzcG9uc2UpCisKKyAgICAgICAgZGVmIHNlbmRfY29udGVudChzZWxmLCBjb25uZWN0aW9uLCBib2R5KToKKyAgICAgICAgICAgIGlmIHNlbGYuZmFrZV9nemlwOgorICAgICAgICAgICAgICAgICNhZGQgYSBsb25lIGd6aXAgaGVhZGVyIHRvIGluZHVjZSBkZWNvZGUgZXJyb3IgcmVtb3RlbHkKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnB1dGhlYWRlcigiQ29udGVudC1FbmNvZGluZyIsICJnemlwIikKKyAgICAgICAgICAgIHJldHVybiB4bWxycGNsaWIuVHJhbnNwb3J0LnNlbmRfY29udGVudChzZWxmLCBjb25uZWN0aW9uLCBib2R5KQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBCYXNlU2VydmVyVGVzdENhc2Uuc2V0VXAoc2VsZikKKworICAgIGRlZiB0ZXN0X2d6aXBfcmVxdWVzdChzZWxmKToKKyAgICAgICAgdCA9IHNlbGYuVHJhbnNwb3J0KCkKKyAgICAgICAgdC5lbmNvZGVfdGhyZXNob2xkID0gTm9uZQorICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCwgdHJhbnNwb3J0PXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgYSA9IHNlbGYuUmVxdWVzdEhhbmRsZXIuY29udGVudF9sZW5ndGgKKyAgICAgICAgdC5lbmNvZGVfdGhyZXNob2xkID0gMCAjdHVybiBvbiByZXF1ZXN0IGVuY29kaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgYiA9IHNlbGYuUmVxdWVzdEhhbmRsZXIuY29udGVudF9sZW5ndGgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGE+YikKKworICAgIGRlZiB0ZXN0X2JhZF9nemlwX3JlcXVlc3Qoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLlRyYW5zcG9ydCgpCisgICAgICAgIHQuZW5jb2RlX3RocmVzaG9sZCA9IE5vbmUKKyAgICAgICAgdC5mYWtlX2d6aXAgPSBUcnVlCisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMLCB0cmFuc3BvcnQ9dCkKKyAgICAgICAgY20gPSBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5jb21waWxlKHIiXGI0MDBcYiIpKQorICAgICAgICB3aXRoIGNtOgorICAgICAgICAgICAgcC5wb3coNiwgOCkKKworICAgIGRlZiB0ZXN0X2dzaXBfcmVzcG9uc2Uoc2VsZik6CisgICAgICAgIHQgPSBzZWxmLlRyYW5zcG9ydCgpCisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoVVJMLCB0cmFuc3BvcnQ9dCkKKyAgICAgICAgb2xkID0gc2VsZi5yZXF1ZXN0SGFuZGxlci5lbmNvZGVfdGhyZXNob2xkCisgICAgICAgIHNlbGYucmVxdWVzdEhhbmRsZXIuZW5jb2RlX3RocmVzaG9sZCA9IE5vbmUgI25vIGVuY29kaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgYSA9IHQucmVzcG9uc2VfbGVuZ3RoCisgICAgICAgIHNlbGYucmVxdWVzdEhhbmRsZXIuZW5jb2RlX3RocmVzaG9sZCA9IDAgI2Fsd2F5cyBlbmNvZGUKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvdyg2LDgpLCA2Kio4KQorICAgICAgICBiID0gdC5yZXNwb25zZV9sZW5ndGgKKyAgICAgICAgc2VsZi5yZXF1ZXN0SGFuZGxlci5lbmNvZGVfdGhyZXNob2xkID0gb2xkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhPmIpCisKKyNUZXN0IHNwZWNpYWwgYXR0cmlidXRlcyBvZiB0aGUgU2VydmVyUHJveHkgb2JqZWN0CitjbGFzcyBTZXJ2ZXJQcm94eVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLnNldFVwKHNlbGYpCisgICAgICAgIGlmIHRocmVhZGluZzoKKyAgICAgICAgICAgIHNlbGYudXJsID0gVVJMCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFdpdGhvdXQgdGhyZWFkaW5nLCBodHRwX3NlcnZlcigpIGFuZCBodHRwX211bHRpX3NlcnZlcigpIHdpbGwgbm90CisgICAgICAgICAgICAjIGJlIGV4ZWN1dGVkIGFuZCBVUkwgaXMgc3RpbGwgZXF1YWwgdG8gTm9uZS4gJ2h0dHA6Ly8nIGlzIGEganVzdAorICAgICAgICAgICAgIyBlbm91Z2ggdG8gY2hvb3NlIHRoZSBzY2hlbWUgKEhUVFApCisgICAgICAgICAgICBzZWxmLnVybCA9ICdodHRwOi8vJworCisgICAgZGVmIHRlc3RfY2xvc2Uoc2VsZik6CisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoc2VsZi51cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCgnY2xvc2UnKSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfdHJhbnNwb3J0KHNlbGYpOgorICAgICAgICB0ID0geG1scnBjbGliLlRyYW5zcG9ydCgpCisgICAgICAgIHAgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoc2VsZi51cmwsIHRyYW5zcG9ydD10KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAoJ3RyYW5zcG9ydCcpLCB0KQorCisjIFRoaXMgaXMgYSBjb250cml2ZWQgd2F5IHRvIG1ha2UgYSBmYWlsdXJlIG9jY3VyIG9uIHRoZSBzZXJ2ZXIgc2lkZQorIyBpbiBvcmRlciB0byB0ZXN0IHRoZSBfc2VuZF90cmFjZWJhY2tfaGVhZGVyIGZsYWcgb24gdGhlIHNlcnZlcgorY2xhc3MgRmFpbGluZ01lc3NhZ2VDbGFzcyhtaW1ldG9vbHMuTWVzc2FnZSk6CisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGtleSA9IGtleS5sb3dlcigpCisgICAgICAgIGlmIGtleSA9PSAnY29udGVudC1sZW5ndGgnOgorICAgICAgICAgICAgcmV0dXJuICdJIGFtIGJyb2tlbicKKyAgICAgICAgcmV0dXJuIG1pbWV0b29scy5NZXNzYWdlLl9fZ2V0aXRlbV9fKHNlbGYsIGtleSkKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh0aHJlYWRpbmcsICdUaHJlYWRpbmcgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdC4nKQorY2xhc3MgRmFpbGluZ1NlcnZlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZXZ0ID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgIyBzdGFydCBzZXJ2ZXIgdGhyZWFkIHRvIGhhbmRsZSByZXF1ZXN0cworICAgICAgICBzZXJ2X2FyZ3MgPSAoc2VsZi5ldnQsIDEpCisgICAgICAgIHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PWh0dHBfc2VydmVyLCBhcmdzPXNlcnZfYXJncykuc3RhcnQoKQorCisgICAgICAgICMgd2FpdCBmb3IgdGhlIHNlcnZlciB0byBiZSByZWFkeQorICAgICAgICBzZWxmLmV2dC53YWl0KCkKKyAgICAgICAgc2VsZi5ldnQuY2xlYXIoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAjIHdhaXQgb24gdGhlIHNlcnZlciB0aHJlYWQgdG8gdGVybWluYXRlCisgICAgICAgIHNlbGYuZXZ0LndhaXQoKQorICAgICAgICAjIHJlc2V0IGZsYWcKKyAgICAgICAgU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1NlcnZlci5fc2VuZF90cmFjZWJhY2tfaGVhZGVyID0gRmFsc2UKKyAgICAgICAgIyByZXNldCBtZXNzYWdlIGNsYXNzCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlci5NZXNzYWdlQ2xhc3MgPSBtaW1ldG9vbHMuTWVzc2FnZQorCisgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhhdCBmbGFnIGlzIGZhbHNlIGJ5IGRlZmF1bHQKKyAgICAgICAgZmxhZ3ZhbCA9IFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENTZXJ2ZXIuX3NlbmRfdHJhY2ViYWNrX2hlYWRlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsYWd2YWwsIEZhbHNlKQorCisgICAgICAgICMgZW5hYmxlIHRyYWNlYmFjayByZXBvcnRpbmcKKyAgICAgICAgU2ltcGxlWE1MUlBDU2VydmVyLlNpbXBsZVhNTFJQQ1NlcnZlci5fc2VuZF90cmFjZWJhY2tfaGVhZGVyID0gVHJ1ZQorCisgICAgICAgICMgdGVzdCBhIGNhbGwgdGhhdCBzaG91bGRuJ3QgZmFpbCBqdXN0IGFzIGEgc21va2UgdGVzdAorICAgICAgICB0cnk6CisgICAgICAgICAgICBwID0geG1scnBjbGliLlNlcnZlclByb3h5KFVSTCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wb3coNiw4KSwgNioqOCkKKyAgICAgICAgZXhjZXB0ICh4bWxycGNsaWIuUHJvdG9jb2xFcnJvciwgc29ja2V0LmVycm9yKSwgZToKKyAgICAgICAgICAgICMgaWdub3JlIGZhaWx1cmVzIGR1ZSB0byBub24tYmxvY2tpbmcgc29ja2V0ICd1bmF2YWlsYWJsZScgZXJyb3JzCisgICAgICAgICAgICBpZiBub3QgaXNfdW5hdmFpbGFibGVfZXhjZXB0aW9uKGUpOgorICAgICAgICAgICAgICAgICMgcHJvdG9jb2wgZXJyb3I7IHByb3ZpZGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBpbiB0ZXN0IG91dHB1dAorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXNcbiVzIiAlIChlLCBnZXRhdHRyKGUsICJoZWFkZXJzIiwgIiIpKSkKKworICAgIGRlZiB0ZXN0X2ZhaWxfbm9faW5mbyhzZWxmKToKKyAgICAgICAgIyB1c2UgdGhlIGJyb2tlbiBtZXNzYWdlIGNsYXNzCisgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5TaW1wbGVYTUxSUENSZXF1ZXN0SGFuZGxlci5NZXNzYWdlQ2xhc3MgPSBGYWlsaW5nTWVzc2FnZUNsYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICAgICBwLnBvdyg2LDgpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKSBhbmQgaGFzYXR0cihlLCAiaGVhZGVycyIpOgorICAgICAgICAgICAgICAgICMgVGhlIHR3byBzZXJ2ZXItc2lkZSBlcnJvciBoZWFkZXJzIHNob3VsZG4ndCBiZSBzZW50IGJhY2sgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGUuaGVhZGVycy5nZXQoIlgtZXhjZXB0aW9uIikgaXMgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZS5oZWFkZXJzLmdldCgiWC10cmFjZWJhY2siKSBpcyBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdQcm90b2NvbEVycm9yIG5vdCByYWlzZWQnKQorCisgICAgZGVmIHRlc3RfZmFpbF93aXRoX2luZm8oc2VsZik6CisgICAgICAgICMgdXNlIHRoZSBicm9rZW4gbWVzc2FnZSBjbGFzcworICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDUmVxdWVzdEhhbmRsZXIuTWVzc2FnZUNsYXNzID0gRmFpbGluZ01lc3NhZ2VDbGFzcworCisgICAgICAgICMgQ2hlY2sgdGhhdCBlcnJvcnMgaW4gdGhlIHNlcnZlciBzZW5kIGJhY2sgZXhjZXB0aW9uL3RyYWNlYmFjaworICAgICAgICAjIGluZm8gd2hlbiBmbGFnIGlzIHNldAorICAgICAgICBTaW1wbGVYTUxSUENTZXJ2ZXIuU2ltcGxlWE1MUlBDU2VydmVyLl9zZW5kX3RyYWNlYmFja19oZWFkZXIgPSBUcnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHhtbHJwY2xpYi5TZXJ2ZXJQcm94eShVUkwpCisgICAgICAgICAgICBwLnBvdyg2LDgpCisgICAgICAgIGV4Y2VwdCAoeG1scnBjbGliLlByb3RvY29sRXJyb3IsIHNvY2tldC5lcnJvciksIGU6CisgICAgICAgICAgICAjIGlnbm9yZSBmYWlsdXJlcyBkdWUgdG8gbm9uLWJsb2NraW5nIHNvY2tldCAndW5hdmFpbGFibGUnIGVycm9ycworICAgICAgICAgICAgaWYgbm90IGlzX3VuYXZhaWxhYmxlX2V4Y2VwdGlvbihlKSBhbmQgaGFzYXR0cihlLCAiaGVhZGVycyIpOgorICAgICAgICAgICAgICAgICMgV2Ugc2hvdWxkIGdldCBlcnJvciBpbmZvIGluIHRoZSByZXNwb25zZQorICAgICAgICAgICAgICAgIGV4cGVjdGVkX2VyciA9ICJpbnZhbGlkIGxpdGVyYWwgZm9yIGludCgpIHdpdGggYmFzZSAxMDogJ0kgYW0gYnJva2VuJyIKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuaGVhZGVycy5nZXQoIngtZXhjZXB0aW9uIiksIGV4cGVjdGVkX2VycikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZS5oZWFkZXJzLmdldCgieC10cmFjZWJhY2siKSBpcyBub3QgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnUHJvdG9jb2xFcnJvciBub3QgcmFpc2VkJykKKworY2xhc3MgQ0dJSGFuZGxlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY2dpID0gU2ltcGxlWE1MUlBDU2VydmVyLkNHSVhNTFJQQ1JlcXVlc3RIYW5kbGVyKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jZ2kgPSBOb25lCisKKyAgICBkZWYgdGVzdF9jZ2lfZ2V0KHNlbGYpOgorICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5FbnZpcm9ubWVudFZhckd1YXJkKCkgYXMgZW52OgorICAgICAgICAgICAgZW52WydSRVFVRVNUX01FVEhPRCddID0gJ0dFVCcKKyAgICAgICAgICAgICMgaWYgdGhlIG1ldGhvZCBpcyBHRVQgYW5kIG5vIHJlcXVlc3RfdGV4dCBpcyBnaXZlbiwgaXQgcnVucyBoYW5kbGVfZ2V0CisgICAgICAgICAgICAjIGdldCBzeXNvdXQgb3V0cHV0CisgICAgICAgICAgICB3aXRoIHRlc3Rfc3VwcG9ydC5jYXB0dXJlZF9zdGRvdXQoKSBhcyBkYXRhX291dDoKKyAgICAgICAgICAgICAgICBzZWxmLmNnaS5oYW5kbGVfcmVxdWVzdCgpCisKKyAgICAgICAgICAgICMgcGFyc2UgU3RhdHVzIGhlYWRlcgorICAgICAgICAgICAgZGF0YV9vdXQuc2VlaygwKQorICAgICAgICAgICAgaGFuZGxlID0gZGF0YV9vdXQucmVhZCgpCisgICAgICAgICAgICBzdGF0dXMgPSBoYW5kbGUuc3BsaXQoKVsxXQorICAgICAgICAgICAgbWVzc2FnZSA9ICcgJy5qb2luKGhhbmRsZS5zcGxpdCgpWzI6NF0pCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAnNDAwJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgJ0JhZCBSZXF1ZXN0JykKKworCisgICAgZGVmIHRlc3RfY2dpX3htbHJwY19yZXNwb25zZShzZWxmKToKKyAgICAgICAgZGF0YSA9ICIiIjw/eG1sIHZlcnNpb249JzEuMCc/PgorICAgICAgICA8bWV0aG9kQ2FsbD4KKyAgICAgICAgICAgIDxtZXRob2ROYW1lPnRlc3RfbWV0aG9kPC9tZXRob2ROYW1lPgorICAgICAgICAgICAgPHBhcmFtcz4KKyAgICAgICAgICAgICAgICA8cGFyYW0+CisgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT48c3RyaW5nPmZvbzwvc3RyaW5nPjwvdmFsdWU+CisgICAgICAgICAgICAgICAgPC9wYXJhbT4KKyAgICAgICAgICAgICAgICA8cGFyYW0+CisgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT48c3RyaW5nPmJhcjwvc3RyaW5nPjwvdmFsdWU+CisgICAgICAgICAgICAgICAgPC9wYXJhbT4KKyAgICAgICAgICAgIDwvcGFyYW1zPgorICAgICAgICA8L21ldGhvZENhbGw+CisgICAgICAgICIiIgorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnYsIFwKKyAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfc3Rkb3V0KCkgYXMgZGF0YV9vdXQsIFwKKyAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfc3RkaW4oKSBhcyBkYXRhX2luOgorICAgICAgICAgICAgZGF0YV9pbi53cml0ZShkYXRhKQorICAgICAgICAgICAgZGF0YV9pbi5zZWVrKDApCisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfTEVOR1RIJ10gPSBzdHIobGVuKGRhdGEpKQorICAgICAgICAgICAgc2VsZi5jZ2kuaGFuZGxlX3JlcXVlc3QoKQorICAgICAgICBkYXRhX291dC5zZWVrKDApCisKKyAgICAgICAgIyB3aWxsIHJlc3BvbmQgZXhjZXB0aW9uLCBpZiBzbywgb3VyIGdvYWwgaXMgYWNoaWV2ZWQgOykKKyAgICAgICAgaGFuZGxlID0gZGF0YV9vdXQucmVhZCgpCisKKyAgICAgICAgIyBzdGFydCB3aXRoIDQ0dGggY2hhciBzbyBhcyBub3QgdG8gZ2V0IGh0dHAgaGVhZGVyLCB3ZSBqdXN0IG5lZWQgb25seSB4bWwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoeG1scnBjbGliLkZhdWx0LCB4bWxycGNsaWIubG9hZHMsIGhhbmRsZVs0NDpdKQorCisgICAgICAgICMgQWxzbyB0ZXN0IHRoZSBjb250ZW50LWxlbmd0aCByZXR1cm5lZCAgYnkgaGFuZGxlX3JlcXVlc3QKKyAgICAgICAgIyBVc2luZyB0aGUgc2FtZSB0ZXN0IG1ldGhvZCBpbm9yZGVyIHRvIGF2b2lkIGFsbCB0aGUgZGF0YXBhc3NpbmcKKyAgICAgICAgIyBib2lsZXJwbGF0ZSBjb2RlLgorICAgICAgICAjIFRlc3QgZm9yIGJ1ZzogaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTUwNDAKKworICAgICAgICBjb250ZW50ID0gaGFuZGxlW2hhbmRsZS5maW5kKCI8P3htbCIpOl0KKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgaW50KHJlLnNlYXJjaCgnQ29udGVudC1MZW5ndGg6IChcZCspJywgaGFuZGxlKS5ncm91cCgxKSksCisgICAgICAgICAgICBsZW4oY29udGVudCkpCisKKworY2xhc3MgRmFrZVNvY2tldDoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kYXRhID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorCisgICAgZGVmIHNlbmQoc2VsZiwgYnVmKToKKyAgICAgICAgc2VsZi5kYXRhLndyaXRlKGJ1ZikKKyAgICAgICAgcmV0dXJuIGxlbihidWYpCisKKyAgICBkZWYgc2VuZGFsbChzZWxmLCBidWYpOgorICAgICAgICBzZWxmLmRhdGEud3JpdGUoYnVmKQorCisgICAgZGVmIGdldHZhbHVlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLmdldHZhbHVlKCkKKworICAgIGRlZiBtYWtlZmlsZShzZWxmLCB4PSdyJywgeT0tMSk6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEZha2VUcmFuc3BvcnQoeG1scnBjbGliLlRyYW5zcG9ydCk6CisgICAgIiIiQSBUcmFuc3BvcnQgaW5zdGFuY2UgdGhhdCByZWNvcmRzIGluc3RlYWQgb2Ygc2VuZGluZyBhIHJlcXVlc3QuCisKKyAgICBUaGlzIGNsYXNzIHJlcGxhY2VzIHRoZSBhY3R1YWwgc29ja2V0IHVzZWQgYnkgaHR0cGxpYiB3aXRoIGEKKyAgICBGYWtlU29ja2V0IG9iamVjdCB0aGF0IHJlY29yZHMgdGhlIHJlcXVlc3QuICBJdCBkb2Vzbid0IHByb3ZpZGUgYQorICAgIHJlc3BvbnNlLgorICAgICIiIgorCisgICAgZGVmIG1ha2VfY29ubmVjdGlvbihzZWxmLCBob3N0KToKKyAgICAgICAgY29ubiA9IHhtbHJwY2xpYi5UcmFuc3BvcnQubWFrZV9jb25uZWN0aW9uKHNlbGYsIGhvc3QpCisgICAgICAgIGNvbm4uc29jayA9IHNlbGYuZmFrZV9zb2NrZXQgPSBGYWtlU29ja2V0KCkKKyAgICAgICAgcmV0dXJuIGNvbm4KKworY2xhc3MgVHJhbnNwb3J0U3ViY2xhc3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgaXNzdWVfcmVxdWVzdChzZWxmLCB0cmFuc3BvcnRfY2xhc3MpOgorICAgICAgICAiIiJSZXR1cm4gYW4gSFRUUCByZXF1ZXN0IG1hZGUgdmlhIHRyYW5zcG9ydF9jbGFzcy4iIiIKKyAgICAgICAgdHJhbnNwb3J0ID0gdHJhbnNwb3J0X2NsYXNzKCkKKyAgICAgICAgcHJveHkgPSB4bWxycGNsaWIuU2VydmVyUHJveHkoImh0dHA6Ly9leGFtcGxlLmNvbS8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BvcnQ9dHJhbnNwb3J0KQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcm94eS5wb3coNiwgOCkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiB0cmFuc3BvcnQuZmFrZV9zb2NrZXQuZ2V0dmFsdWUoKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIHRlc3RfY3VzdG9tX3VzZXJfYWdlbnQoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RUcmFuc3BvcnQoRmFrZVRyYW5zcG9ydCk6CisKKyAgICAgICAgICAgIGRlZiBzZW5kX3VzZXJfYWdlbnQoc2VsZiwgY29ubik6CisgICAgICAgICAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5zZW5kX3VzZXJfYWdlbnQoc2VsZiwgY29ubikKKyAgICAgICAgICAgICAgICBjb25uLnB1dGhlYWRlcigiWC1UZXN0IiwgInRlc3RfY3VzdG9tX3VzZXJfYWdlbnQiKQorCisgICAgICAgIHJlcSA9IHNlbGYuaXNzdWVfcmVxdWVzdChUZXN0VHJhbnNwb3J0KQorICAgICAgICBzZWxmLmFzc2VydEluKCJYLVRlc3Q6IHRlc3RfY3VzdG9tX3VzZXJfYWdlbnRcclxuIiwgcmVxKQorCisgICAgZGVmIHRlc3Rfc2VuZF9ob3N0KHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0VHJhbnNwb3J0KEZha2VUcmFuc3BvcnQpOgorCisgICAgICAgICAgICBkZWYgc2VuZF9ob3N0KHNlbGYsIGNvbm4sIGhvc3QpOgorICAgICAgICAgICAgICAgIHhtbHJwY2xpYi5UcmFuc3BvcnQuc2VuZF9ob3N0KHNlbGYsIGNvbm4sIGhvc3QpCisgICAgICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoIlgtVGVzdCIsICJ0ZXN0X3NlbmRfaG9zdCIpCisKKyAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oIlgtVGVzdDogdGVzdF9zZW5kX2hvc3RcclxuIiwgcmVxKQorCisgICAgZGVmIHRlc3Rfc2VuZF9yZXF1ZXN0KHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0VHJhbnNwb3J0KEZha2VUcmFuc3BvcnQpOgorCisgICAgICAgICAgICBkZWYgc2VuZF9yZXF1ZXN0KHNlbGYsIGNvbm4sIHVybCwgYm9keSk6CisgICAgICAgICAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5zZW5kX3JlcXVlc3Qoc2VsZiwgY29ubiwgdXJsLCBib2R5KQorICAgICAgICAgICAgICAgIGNvbm4ucHV0aGVhZGVyKCJYLVRlc3QiLCAidGVzdF9zZW5kX3JlcXVlc3QiKQorCisgICAgICAgIHJlcSA9IHNlbGYuaXNzdWVfcmVxdWVzdChUZXN0VHJhbnNwb3J0KQorICAgICAgICBzZWxmLmFzc2VydEluKCJYLVRlc3Q6IHRlc3Rfc2VuZF9yZXF1ZXN0XHJcbiIsIHJlcSkKKworICAgIGRlZiB0ZXN0X3NlbmRfY29udGVudChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdFRyYW5zcG9ydChGYWtlVHJhbnNwb3J0KToKKworICAgICAgICAgICAgZGVmIHNlbmRfY29udGVudChzZWxmLCBjb25uLCBib2R5KToKKyAgICAgICAgICAgICAgICBjb25uLnB1dGhlYWRlcigiWC1UZXN0IiwgInRlc3Rfc2VuZF9jb250ZW50IikKKyAgICAgICAgICAgICAgICB4bWxycGNsaWIuVHJhbnNwb3J0LnNlbmRfY29udGVudChzZWxmLCBjb25uLCBib2R5KQorCisgICAgICAgIHJlcSA9IHNlbGYuaXNzdWVfcmVxdWVzdChUZXN0VHJhbnNwb3J0KQorICAgICAgICBzZWxmLmFzc2VydEluKCJYLVRlc3Q6IHRlc3Rfc2VuZF9jb250ZW50XHJcbiIsIHJlcSkKKworQHRlc3Rfc3VwcG9ydC5yZWFwX3RocmVhZHMKK2RlZiB0ZXN0X21haW4oKToKKyAgICB4bWxycGNfdGVzdHMgPSBbWE1MUlBDVGVzdENhc2UsIEhlbHBlclRlc3RDYXNlLCBEYXRlVGltZVRlc3RDYXNlLAorICAgICAgICAgQmluYXJ5VGVzdENhc2UsIEZhdWx0VGVzdENhc2UsIFRyYW5zcG9ydFN1YmNsYXNzVGVzdENhc2VdCisgICAgeG1scnBjX3Rlc3RzLmFwcGVuZChTaW1wbGVTZXJ2ZXJUZXN0Q2FzZSkKKyAgICB4bWxycGNfdGVzdHMuYXBwZW5kKEtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlMSkKKyAgICB4bWxycGNfdGVzdHMuYXBwZW5kKEtlZXBhbGl2ZVNlcnZlclRlc3RDYXNlMikKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBnemlwCisgICAgICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoR3ppcFNlcnZlclRlc3RDYXNlKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcyAjZ3ppcCBub3Qgc3VwcG9ydGVkIGluIHRoaXMgYnVpbGQKKyAgICB4bWxycGNfdGVzdHMuYXBwZW5kKE11bHRpUGF0aFNlcnZlclRlc3RDYXNlKQorICAgIHhtbHJwY190ZXN0cy5hcHBlbmQoU2VydmVyUHJveHlUZXN0Q2FzZSkKKyAgICB4bWxycGNfdGVzdHMuYXBwZW5kKEZhaWxpbmdTZXJ2ZXJUZXN0Q2FzZSkKKyAgICB4bWxycGNfdGVzdHMuYXBwZW5kKENHSUhhbmRsZXJUZXN0Q2FzZSkKKworICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnhtbHJwY190ZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbHJwYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwZTAxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbHJwYy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeG1scnBjLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbHJwYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEwZTAxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3htbHJwYy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHBpY2tsZS5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hwaWNrbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMzYTMzZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hwaWNrbGUucHkKQEAgLTAsMCArMSwyNjQgQEAKKyMgdGVzdF9waWNrbGUgZHVtcHMgYW5kIGxvYWRzIHBpY2tsZXMgdmlhIHBpY2tsZS5weS4KKyMgdGVzdF9jcGlja2xlIGRvZXMgdGhlIHNhbWUsIGJ1dCB2aWEgdGhlIGNQaWNrbGUgbW9kdWxlLgorIyBUaGlzIHRlc3QgY292ZXJzIHRoZSBvdGhlciB0d28gY2FzZXMsIG1ha2luZyBwaWNrbGVzIHdpdGggb25lIG1vZHVsZSBhbmQKKyMgbG9hZGluZyB0aGVtIHZpYSB0aGUgb3RoZXIuIEl0IGFsc28gdGVzdHMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAorIyBwcmV2aW91cyB2ZXJzaW9uIG9mIFB5dGhvbiBieSBib3VuY2luZyBwaWNrbGVkIG9iamVjdHMgdGhyb3VnaCBQeXRob24gMi40CisjIGFuZCBQeXRob24gMi41IHJ1bm5pbmcgdGhpcyBmaWxlLgorCitpbXBvcnQgY1BpY2tsZQoraW1wb3J0IG9zCitpbXBvcnQgb3MucGF0aAoraW1wb3J0IHBpY2tsZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CisKKyMgTW9zdCBkaXN0cm8tc3VwcGxpZWQgUHl0aG9ucyBkb24ndCBpbmNsdWRlIHRoZSB0ZXN0cworIyBvciB0ZXN0IHN1cHBvcnQgZmlsZXMsIGFuZCBzb21lIGRvbid0IGluY2x1ZGUgYSB3YXkgdG8gZ2V0IHRoZXNlIGJhY2sgZXZlbiBpZgorIyB5b3UncmUgd2lsbCB0byBpbnN0YWxsIGV4dHJhIHBhY2thZ2VzIChsaWtlIFVidW50dSkuIERvaW5nIHRoaW5ncyBsaWtlIHRoaXMKKyMgInByb3ZpZGVzIiBhIHBpY2tsZXRlc3RlciBtb2R1bGUgZm9yIG9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbiB0aGF0IG1heSBiZQorIyBpbnN0YWxsZWQgd2l0aG91dCBpdC4gTm90ZSB0aGF0IG9uZSBvdGhlciBkZXNpZ24gZm9yIHRoaXMgaW52b2x2ZXMgbWVzc2luZworIyB3aXRoIHN5cy5wYXRoLCB3aGljaCBpcyBsZXNzIHByZWNpc2UuCittb2RfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGlja2xldGVzdGVyLnB5IikpCitwaWNrbGV0ZXN0ZXIgPSB0eXBlcy5Nb2R1bGVUeXBlKCJ0ZXN0LnBpY2tsZXRlc3RlciIpCitleGVjIGNvbXBpbGUob3Blbihtb2RfcGF0aCkucmVhZCgpLCBtb2RfcGF0aCwgJ2V4ZWMnKSBpbiBwaWNrbGV0ZXN0ZXIuX19kaWN0X18KK0Fic3RyYWN0UGlja2xlVGVzdHMgPSBwaWNrbGV0ZXN0ZXIuQWJzdHJhY3RQaWNrbGVUZXN0cworaWYgcGlja2xldGVzdGVyLl9fbmFtZV9fIGluIHN5cy5tb2R1bGVzOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiRGlkIG5vdCBleHBlY3QgdG8gZmluZCB0ZXN0LnBpY2tsZXRlc3RlciBsb2FkZWQiKQorc3lzLm1vZHVsZXNbcGlja2xldGVzdGVyLl9fbmFtZV9fXSA9IHBpY2tsZXRlc3RlcgorCisKK2NsYXNzIER1bXBDUGlja2xlX0xvYWRQaWNrbGUoQWJzdHJhY3RQaWNrbGVUZXN0cyk6CisKKyAgICBlcnJvciA9IEtleUVycm9yCisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wLCBmYXN0PUZhbHNlKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gY1BpY2tsZS5kdW1wcyhhcmcsIHByb3RvKQorCisgICAgZGVmIGxvYWRzKHNlbGYsIGJ1Zik6CisgICAgICAgICMgSWdub3JlIGZhc3QKKyAgICAgICAgcmV0dXJuIHBpY2tsZS5sb2FkcyhidWYpCisKK2NsYXNzIER1bXBQaWNrbGVfTG9hZENQaWNrbGUoQWJzdHJhY3RQaWNrbGVUZXN0cyk6CisKKyAgICBlcnJvciA9IGNQaWNrbGUuQmFkUGlja2xlR2V0CisKKyAgICBkZWYgZHVtcHMoc2VsZiwgYXJnLCBwcm90bz0wLCBmYXN0PUZhbHNlKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gcGlja2xlLmR1bXBzKGFyZywgcHJvdG8pCisKKyAgICBkZWYgbG9hZHMoc2VsZiwgYnVmKToKKyAgICAgICAgIyBJZ25vcmUgZmFzdAorICAgICAgICByZXR1cm4gY1BpY2tsZS5sb2FkcyhidWYpCisKK2RlZiBoYXZlX3B5dGhvbl92ZXJzaW9uKG5hbWUpOgorICAgICIiIkNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWUgaXMgYSB2YWxpZCBQeXRob24gYmluYXJ5IGFuZCBoYXMKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC4KKworICAgIFRoaXMgcmVzcGVjdHMgeW91ciBQQVRILgorCisgICAgQXJnczoKKyAgICAgICAgbmFtZTogc2hvcnQgc3RyaW5nIG5hbWUgb2YgYSBQeXRob24gYmluYXJ5IHN1Y2ggYXMgInB5dGhvbjIuNCIuCisKKyAgICBSZXR1cm5zOgorICAgICAgICBUcnVlIGlmIHRoZSBuYW1lIGlzIHZhbGlkLCBGYWxzZSBvdGhlcndpc2UuCisgICAgIiIiCisgICAgcmV0dXJuIG9zLnN5c3RlbShuYW1lICsgIiAtYyAnaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0JyIpID09IDAKKworCitjbGFzcyBBYnN0cmFjdENvbXBhdFRlc3RzKEFic3RyYWN0UGlja2xlVGVzdHMpOgorCisgICAgbW9kdWxlID0gTm9uZQorICAgIHB5dGhvbiA9IE5vbmUKKyAgICBlcnJvciA9IE5vbmUKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucHl0aG9uKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tb2R1bGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmVycm9yKQorCisgICAgZGVmIHNlbmRfdG9fd29ya2VyKHNlbGYsIHB5dGhvbiwgb2JqLCBwcm90byk6CisgICAgICAgICIiIkJvdW5jZSBhIHBpY2tsZWQgb2JqZWN0IHRocm91Z2ggYW5vdGhlciB2ZXJzaW9uIG9mIFB5dGhvbi4KKworICAgICAgICBUaGlzIHdpbGwgcGlja2xlIHRoZSBvYmplY3QsIHNlbmQgaXQgdG8gYSBjaGlsZCBwcm9jZXNzIHdoZXJlIGl0IHdpbGwgYmUKKyAgICAgICAgdW5waWNrbGVkLCB0aGVuIHJlcGlja2xlZCBhbmQgc2VudCBiYWNrIHRvIHRoZSBwYXJlbnQgcHJvY2Vzcy4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgcHl0aG9uOiB0aGUgbmFtZSBvZiB0aGUgUHl0aG9uIGJpbmFyeSB0byBzdGFydC4KKyAgICAgICAgICAgIG9iajogb2JqZWN0IHRvIHBpY2tsZS4KKyAgICAgICAgICAgIHByb3RvOiBwaWNrbGUgcHJvdG9jb2wgbnVtYmVyIHRvIHVzZS4KKworICAgICAgICBSZXR1cm5zOgorICAgICAgICAgICAgVGhlIHBpY2tsZWQgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBjaGlsZCBwcm9jZXNzLgorICAgICAgICAiIiIKKyAgICAgICAgIyBQcmV2ZW50IHRoZSBzdWJwcm9jZXNzIGZyb20gcGlja2luZyB1cCBpbnZhbGlkIC5weWMgZmlsZXMuCisgICAgICAgIHRhcmdldCA9IF9fZmlsZV9fCisgICAgICAgIGlmIHRhcmdldFstMV0gaW4gKCJjIiwgIm8iKToKKyAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldFs6LTFdCisKKyAgICAgICAgZGF0YSA9IHNlbGYubW9kdWxlLmR1bXBzKChwcm90bywgb2JqKSwgcHJvdG8pCisgICAgICAgIHdvcmtlciA9IHN1YnByb2Nlc3MuUG9wZW4oW3B5dGhvbiwgdGFyZ2V0LCAid29ya2VyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkZXJyPXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgc3Rkb3V0LCBzdGRlcnIgPSB3b3JrZXIuY29tbXVuaWNhdGUoZGF0YSkKKyAgICAgICAgaWYgd29ya2VyLnJldHVybmNvZGUgIT0gMDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcihzdGRlcnIpCisgICAgICAgIHJldHVybiBzdGRvdXQKKworICAgIGRlZiBkdW1wcyhzZWxmLCBhcmcsIHByb3RvPTAsIGZhc3Q9RmFsc2UpOgorICAgICAgICByZXR1cm4gc2VsZi5zZW5kX3RvX3dvcmtlcihzZWxmLnB5dGhvbiwgYXJnLCBwcm90bykKKworICAgIGRlZiBsb2FkcyhzZWxmLCBpbnB1dCk6CisgICAgICAgIHJldHVybiBzZWxmLm1vZHVsZS5sb2FkcyhpbnB1dCkKKworICAgICMgVGhlc2UgdGVzdHMgYXJlIGRpc2FibGVkIGJlY2F1c2UgdGhleSByZXF1aXJlIHNvbWUgc3BlY2lhbCBzZXR1cAorICAgICMgb24gdGhlIHdvcmtlciB0aGF0J3MgaGFyZCB0byBrZWVwIGluIHN5bmMuCisgICAgZGVmIHRlc3RfZ2xvYmFsX2V4dDEoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2dsb2JhbF9leHQyKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9nbG9iYWxfZXh0NChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgIyBUaGlzIGlzIGEgY3V0LWRvd24gdmVyc2lvbiBvZiBwaWNrbGV0ZXN0ZXIncyB0ZXN0X2Zsb2F0LiBCYWNrd2FyZHMKKyAgICAjIGNvbXBhdGliaWxpdHkgZm9yIHRoZSB2YWx1ZXMgaW4gZm9yX2Jpbl9wcm90b3Mgd2FzIGV4cGxpY2l0bHkgYnJva2VuIGluCisgICAgIyByNjg5MDMgdG8gZml4IGEgYnVnLgorICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgorICAgICAgICBmb3JfYmluX3Byb3RvcyA9IFs0Ljk0ZS0zMjQsIDFlLTMxMF0KKyAgICAgICAgbmVnX2Zvcl9iaW5fcHJvdG9zID0gWy14IGZvciB4IGluIGZvcl9iaW5fcHJvdG9zXQorICAgICAgICB0ZXN0X3ZhbHVlcyA9IFswLjAsIDdlLTMwOCwgNi42MjZlLTM0LCAwLjEsIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgMy4xNCwgMjYzLjQ0NTgyMDYyMzc0MDUzLCA2LjAyMmUyMywgMWUzMF0KKyAgICAgICAgdGVzdF9wcm90bzBfdmFsdWVzID0gdGVzdF92YWx1ZXMgKyBbLXggZm9yIHggaW4gdGVzdF92YWx1ZXNdCisgICAgICAgIHRlc3RfdmFsdWVzID0gdGVzdF9wcm90bzBfdmFsdWVzICsgZm9yX2Jpbl9wcm90b3MgKyBuZWdfZm9yX2Jpbl9wcm90b3MKKworICAgICAgICBmb3IgdmFsdWUgaW4gdGVzdF9wcm90bzBfdmFsdWVzOgorICAgICAgICAgICAgcGlja2xlID0gc2VsZi5kdW1wcyh2YWx1ZSwgMCkKKyAgICAgICAgICAgIGdvdCA9IHNlbGYubG9hZHMocGlja2xlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgZ290KQorCisgICAgICAgIGZvciBwcm90byBpbiBwaWNrbGV0ZXN0ZXIucHJvdG9jb2xzWzE6XToKKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB0ZXN0X3ZhbHVlczoKKyAgICAgICAgICAgICAgICBwaWNrbGUgPSBzZWxmLmR1bXBzKHZhbHVlLCBwcm90bykKKyAgICAgICAgICAgICAgICBnb3QgPSBzZWxmLmxvYWRzKHBpY2tsZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBnb3QpCisKKyAgICAjIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdhcyBleHBsaWNpdGx5IGJyb2tlbiBpbiByNjc5MzQgdG8gZml4IGEgYnVnLgorICAgIGRlZiB0ZXN0X3VuaWNvZGVfaGlnaF9wbGFuZShzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgIyBUaGlzIHRlc3RzIGEgZml4IHRoYXQncyBpbiAyLjcgb25seQorICAgIGRlZiB0ZXN0X2R5bmFtaWNfY2xhc3Moc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGlmIHRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CisgICAgICAgICMgVGhpcyBpcyBhIGN1dC1kb3duIHZlcnNpb24gb2YgcGlja2xldGVzdGVyJ3MgdGVzdF91bmljb2RlLiBCYWNrd2FyZHMKKyAgICAgICAgIyBjb21wYXRpYmlsaXR5IHdhcyBleHBsaWNpdGx5IGJyb2tlbiBpbiByNjc5MzQgdG8gZml4IGEgYnVnLgorICAgICAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgorICAgICAgICAgICAgZW5kY2FzZXMgPSBbdScnLCB1JzxcXHU+JywgdSc8XFxcdTEyMzQ+JywgdSc8XG4+JywgdSc8XFw+J10KKyAgICAgICAgICAgIGZvciBwcm90byBpbiBwaWNrbGV0ZXN0ZXIucHJvdG9jb2xzOgorICAgICAgICAgICAgICAgIGZvciB1IGluIGVuZGNhc2VzOgorICAgICAgICAgICAgICAgICAgICBwID0gc2VsZi5kdW1wcyh1LCBwcm90bykKKyAgICAgICAgICAgICAgICAgICAgdTIgPSBzZWxmLmxvYWRzKHApCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTIsIHUpCisKKworZGVmIHJ1bl9jb21wYXRfdGVzdChweXRob25fbmFtZSk6CisgICAgcmV0dXJuICh0ZXN0X3N1cHBvcnQuaXNfcmVzb3VyY2VfZW5hYmxlZCgieHBpY2tsZSIpIGFuZAorICAgICAgICAgICAgaGF2ZV9weXRob25fdmVyc2lvbihweXRob25fbmFtZSkpCisKKworIyBUZXN0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggUHl0aG9uIDIuNC4KK2lmIG5vdCBydW5fY29tcGF0X3Rlc3QoInB5dGhvbjIuNCIpOgorICAgIGNsYXNzIENQaWNrbGVQeXRob24yNENvbXBhdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIHBhc3MKK2Vsc2U6CisgICAgY2xhc3MgQ1BpY2tsZVB5dGhvbjI0Q29tcGF0KEFic3RyYWN0Q29tcGF0VGVzdHMpOgorCisgICAgICAgIG1vZHVsZSA9IGNQaWNrbGUKKyAgICAgICAgcHl0aG9uID0gInB5dGhvbjIuNCIKKyAgICAgICAgZXJyb3IgPSBjUGlja2xlLkJhZFBpY2tsZUdldAorCisgICAgICAgICMgRGlzYWJsZSB0aGVzZSB0ZXN0cyBmb3IgUHl0aG9uIDIuNC4gTWFraW5nIHRoZW0gcGFzcyB3b3VsZCByZXF1aXJlCisgICAgICAgICMgbm9udHJpdmlhbGx5IG1vbmtleXBhdGNoaW5nIHRoZSBwaWNrbGV0ZXN0ZXIgbW9kdWxlIGluIHRoZSB3b3JrZXIuCisgICAgICAgIGRlZiB0ZXN0X3JlZHVjZV9jYWxsc19iYXNlKHNlbGYpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiB0ZXN0X3JlZHVjZV9leF9jYWxsc19iYXNlKHNlbGYpOgorICAgICAgICAgICAgcGFzcworCitjbGFzcyBQaWNrbGVQeXRob24yNENvbXBhdChDUGlja2xlUHl0aG9uMjRDb21wYXQpOgorCisgICAgbW9kdWxlID0gcGlja2xlCisgICAgZXJyb3IgPSBLZXlFcnJvcgorCisKKyMgVGVzdCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjUuCitpZiBub3QgcnVuX2NvbXBhdF90ZXN0KCJweXRob24yLjUiKToKKyAgICBjbGFzcyBDUGlja2xlUHl0aG9uMjVDb21wYXQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBwYXNzCitlbHNlOgorICAgIGNsYXNzIENQaWNrbGVQeXRob24yNUNvbXBhdChBYnN0cmFjdENvbXBhdFRlc3RzKToKKworICAgICAgICBtb2R1bGUgPSBjUGlja2xlCisgICAgICAgIHB5dGhvbiA9ICJweXRob24yLjUiCisgICAgICAgIGVycm9yID0gY1BpY2tsZS5CYWRQaWNrbGVHZXQKKworY2xhc3MgUGlja2xlUHl0aG9uMjVDb21wYXQoQ1BpY2tsZVB5dGhvbjI1Q29tcGF0KToKKworICAgIG1vZHVsZSA9IHBpY2tsZQorICAgIGVycm9yID0gS2V5RXJyb3IKKworCisjIFRlc3QgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi42LgoraWYgbm90IHJ1bl9jb21wYXRfdGVzdCgicHl0aG9uMi42Iik6CisgICAgY2xhc3MgQ1BpY2tsZVB5dGhvbjI2Q29tcGF0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgcGFzcworZWxzZToKKyAgICBjbGFzcyBDUGlja2xlUHl0aG9uMjZDb21wYXQoQWJzdHJhY3RDb21wYXRUZXN0cyk6CisKKyAgICAgICAgbW9kdWxlID0gY1BpY2tsZQorICAgICAgICBweXRob24gPSAicHl0aG9uMi42IgorICAgICAgICBlcnJvciA9IGNQaWNrbGUuQmFkUGlja2xlR2V0CisKK2NsYXNzIFBpY2tsZVB5dGhvbjI2Q29tcGF0KENQaWNrbGVQeXRob24yNkNvbXBhdCk6CisKKyAgICBtb2R1bGUgPSBwaWNrbGUKKyAgICBlcnJvciA9IEtleUVycm9yCisKKworZGVmIHdvcmtlcl9tYWluKGluX3N0cmVhbSwgb3V0X3N0cmVhbSk6CisgICAgbWVzc2FnZSA9IGNQaWNrbGUubG9hZChpbl9zdHJlYW0pCisgICAgcHJvdG9jb2wsIG9iaiA9IG1lc3NhZ2UKKyAgICBjUGlja2xlLmR1bXAob2JqLCBvdXRfc3RyZWFtLCBwcm90b2NvbCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgaWYgbm90IHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCJ4cGlja2xlIik6CisgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgInRlc3RfeHBpY2tsZSAtLSBza2lwcGluZyBiYWNrd2FyZHMgY29tcGF0IHRlc3RzLiIKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiVXNlICdyZWdydGVzdC5weSAtdSB4cGlja2xlJyB0byBydW4gdGhlbS4iCisgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorCisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgRHVtcENQaWNrbGVfTG9hZFBpY2tsZSwKKyAgICAgICAgRHVtcFBpY2tsZV9Mb2FkQ1BpY2tsZSwKKyAgICAgICAgQ1BpY2tsZVB5dGhvbjI0Q29tcGF0LAorICAgICAgICBDUGlja2xlUHl0aG9uMjVDb21wYXQsCisgICAgICAgIENQaWNrbGVQeXRob24yNkNvbXBhdCwKKyAgICAgICAgUGlja2xlUHl0aG9uMjRDb21wYXQsCisgICAgICAgIFBpY2tsZVB5dGhvbjI1Q29tcGF0LAorICAgICAgICBQaWNrbGVQeXRob24yNkNvbXBhdCwKKyAgICApCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgaWYgIndvcmtlciIgaW4gc3lzLmFyZ3Y6CisgICAgICAgIHdvcmtlcl9tYWluKHN5cy5zdGRpbiwgc3lzLnN0ZG91dCkKKyAgICBlbHNlOgorICAgICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHBpY2tsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cGlja2xlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJkYjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHBpY2tsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHBpY2tsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cGlja2xlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTJkYjNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHBpY2tsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHJhbmdlLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfeHJhbmdlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzBlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cmFuZ2UucHkKQEAgLTAsMCArMSwyMTggQEAKKyMgUHl0aG9uIHRlc3Qgc2V0IC0tIGJ1aWx0LWluIGZ1bmN0aW9ucworCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQsIHVuaXR0ZXN0CitpbXBvcnQgc3lzCitpbXBvcnQgcGlja2xlCitpbXBvcnQgaXRlcnRvb2xzCisKK2ltcG9ydCB3YXJuaW5ncword2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJpbnRlZ2VyIGFyZ3VtZW50IGV4cGVjdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgInVuaXR0ZXN0IikKKworIyBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMgKDMgYXJncyBvbmx5KSwgZm9yIGNvbXBhcmlzb24KK2RlZiBweXJhbmdlKHN0YXJ0LCBzdG9wLCBzdGVwKToKKyAgICBpZiAoc3RhcnQgLSBzdG9wKSAvLyBzdGVwIDwgMDoKKyAgICAgICAgIyByZXBsYWNlIHN0b3Agd2l0aCBuZXh0IGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlIG9mIGludGVnZXJzCisgICAgICAgICMgdGhhdCBhcmUgY29uZ3J1ZW50IHRvIHN0YXJ0IG1vZHVsbyBzdGVwLgorICAgICAgICBzdG9wICs9IChzdGFydCAtIHN0b3ApICUgc3RlcAorICAgICAgICB3aGlsZSBzdGFydCAhPSBzdG9wOgorICAgICAgICAgICAgeWllbGQgc3RhcnQKKyAgICAgICAgICAgIHN0YXJ0ICs9IHN0ZXAKKworZGVmIHB5cmFuZ2VfcmV2ZXJzZWQoc3RhcnQsIHN0b3AsIHN0ZXApOgorICAgIHN0b3AgKz0gKHN0YXJ0IC0gc3RvcCkgJSBzdGVwCisgICAgcmV0dXJuIHB5cmFuZ2Uoc3RvcCAtIHN0ZXAsIHN0YXJ0IC0gc3RlcCwgLXN0ZXApCisKKworY2xhc3MgWHJhbmdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIGFzc2VydF9pdGVyYXRvcnNfZXF1YWwoc2VsZiwgeHMsIHlzLCB0ZXN0X2lkLCBsaW1pdD1Ob25lKToKKyAgICAgICAgIyBjaGVjayB0aGF0IGFuIGl0ZXJhdG9yIHhzIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHJlc3VsdHMgeXMsCisgICAgICAgICMgdXAgdG8gYSBnaXZlbiBsaW1pdC4KKyAgICAgICAgaWYgbGltaXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB4cyA9IGl0ZXJ0b29scy5pc2xpY2UoeHMsIGxpbWl0KQorICAgICAgICAgICAgeXMgPSBpdGVydG9vbHMuaXNsaWNlKHlzLCBsaW1pdCkKKyAgICAgICAgc2VudGluZWwgPSBvYmplY3QoKQorICAgICAgICBwYWlycyA9IGl0ZXJ0b29scy5pemlwX2xvbmdlc3QoeHMsIHlzLCBmaWxsdmFsdWU9c2VudGluZWwpCisgICAgICAgIGZvciBpLCAoeCwgeSkgaW4gZW51bWVyYXRlKHBhaXJzKToKKyAgICAgICAgICAgIGlmIHggPT0geToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB4ID09IHNlbnRpbmVsOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne306IGl0ZXJhdG9yIGVuZGVkIHVuZXhwZWN0ZWRseSAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdhdCBwb3NpdGlvbiB7fTsgZXhwZWN0ZWQge30nLmZvcm1hdCh0ZXN0X2lkLCBpLCB5KSkKKyAgICAgICAgICAgIGVsaWYgeSA9PSBzZW50aW5lbDoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ3t9OiB1bmV4cGVjdGVkIGV4Y2VzcyBlbGVtZW50IHt9IGF0ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uIHt9Jy5mb3JtYXQodGVzdF9pZCwgeCwgaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne306IHdyb25nIGVsZW1lbnQgYXQgcG9zaXRpb24ge307JworICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwZWN0ZWQge30sIGdvdCB7fScuZm9ybWF0KHRlc3RfaWQsIGksIHksIHgpKQorCisgICAgZGVmIGFzc2VydF94cmFuZ2VzX2VxdWl2YWxlbnQoc2VsZiwgeCwgeSk6CisgICAgICAgICMgQ2hlY2sgdGhhdCB0d28geHJhbmdlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGluIHRoZSBzZW5zZSBvZiB0aGUKKyAgICAgICAgIyBhc3NvY2lhdGVkIHNlcXVlbmNlcyBiZWluZyB0aGUgc2FtZS4gIFdlIHdhbnQgdG8gdXNlIHRoaXMgZm9yIGxhcmdlCisgICAgICAgICMgeHJhbmdlIG9iamVjdHMsIHNvIGluc3RlYWQgb2YgY29udmVydGluZyB0byBsaXN0cyBhbmQgY29tcGFyaW5nCisgICAgICAgICMgZGlyZWN0bHkgd2UgZG8gYSBudW1iZXIgb2YgaW5kaXJlY3QgY2hlY2tzLgorICAgICAgICBpZiBsZW4oeCkgIT0gbGVuKHkpOgorICAgICAgICAgICAgc2VsZi5mYWlsKCd7fSBhbmQge30gaGF2ZSBkaWZmZXJlbnQgJworICAgICAgICAgICAgICAgICAgICAgICdsZW5ndGhzOiB7fSBhbmQge30gJy5mb3JtYXQoeCwgeSwgbGVuKHgpLCBsZW4oeSkpKQorICAgICAgICBpZiBsZW4oeCkgPj0gMToKKyAgICAgICAgICAgIGlmIHhbMF0gIT0geVswXToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ3t9IGFuZCB7fSBoYXZlIGRpZmZlcmVudCBpbml0aWFsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRzOiB7fSBhbmQge30gJy5mb3JtYXQoeCwgeSwgeFswXSwgeVswXSkpCisgICAgICAgICAgICBpZiB4Wy0xXSAhPSB5Wy0xXToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ3t9IGFuZCB7fSBoYXZlIGRpZmZlcmVudCBmaW5hbCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICdlbGVtZW50czoge30gYW5kIHt9ICcuZm9ybWF0KHgsIHksIHhbLTFdLCB5Wy0xXSkpCisgICAgICAgIGlmIGxlbih4KSA+PSAyOgorICAgICAgICAgICAgeF9zdGVwID0geFsxXSAtIHhbMF0KKyAgICAgICAgICAgIHlfc3RlcCA9IHlbMV0gLSB5WzBdCisgICAgICAgICAgICBpZiB4X3N0ZXAgIT0geV9zdGVwOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgne30gYW5kIHt9IGhhdmUgZGlmZmVyZW50IHN0ZXA6ICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3t9IGFuZCB7fSAnLmZvcm1hdCh4LCB5LCB4X3N0ZXAsIHlfc3RlcCkpCisKKyAgICBkZWYgdGVzdF94cmFuZ2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoMykpLCBbMCwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoMSwgNSkpLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoMCkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSgtMykpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHhyYW5nZSgxLCAxMCwgMykpLCBbMSwgNCwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoNSwgLTUsIC0zKSksIFs1LCAyLCAtMSwgLTRdKQorCisgICAgICAgIGEgPSAxMAorICAgICAgICBiID0gMTAwCisgICAgICAgIGMgPSA1MAorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoYSwgYSsyKSksIFthLCBhKzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeHJhbmdlKGErMiwgYSwgLTFMKSksIFthKzIsIGErMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoYSs0LCBhLCAtMikpLCBbYSs0LCBhKzJdKQorCisgICAgICAgIHNlcSA9IGxpc3QoeHJhbmdlKGEsIGIsIGMpKQorICAgICAgICBzZWxmLmFzc2VydEluKGEsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihiLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCisKKyAgICAgICAgc2VxID0gbGlzdCh4cmFuZ2UoYiwgYSwgLWMpKQorICAgICAgICBzZWxmLmFzc2VydEluKGIsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbihhLCBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCisKKyAgICAgICAgc2VxID0gbGlzdCh4cmFuZ2UoLWEsIC1iLCAtYykpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oLWEsIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigtYiwgc2VxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXEpLCAyKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgeHJhbmdlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHhyYW5nZSwgMSwgMiwgMywgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgeHJhbmdlLCAxLCAyLCAwKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhyYW5nZSwgMTAqKjEwMCwgMTAqKjEwMSwgMTAqKjEwMSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHhyYW5nZSwgMCwgInNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHhyYW5nZSwgMCwgNDIsICJzcGFtIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih4cmFuZ2UoMCwgc3lzLm1heGludCwgc3lzLm1heGludC0xKSksIDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeHJhbmdlLCAtc3lzLm1heGludCwgc3lzLm1heGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgeHJhbmdlLCAwLCAyKnN5cy5tYXhpbnQpCisKKyAgICAgICAgciA9IHhyYW5nZSgtc3lzLm1heGludCwgc3lzLm1heGludCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ociksIHN5cy5tYXhpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhyYW5nZSwgLXN5cy5tYXhpbnQtMSwgc3lzLm1heGludCwgMikKKworICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgorICAgICAgICB0ZXN0Y2FzZXMgPSBbKDEzLCksICgwLCAxMSksICgtMjIsIDEwKSwgKDIwLCAzLCAtMSksCisgICAgICAgICAgICAgICAgICAgICAoMTMsIDIxLCAzKSwgKC0yLCAyLCAyKV0KKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBmb3IgdCBpbiB0ZXN0Y2FzZXM6CisgICAgICAgICAgICAgICAgciA9IHhyYW5nZSgqdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QocGlja2xlLmxvYWRzKHBpY2tsZS5kdW1wcyhyLCBwcm90bykpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QocikpCisKKyAgICAgICAgTSA9IG1pbihzeXMubWF4aW50LCBzeXMubWF4c2l6ZSkKKyAgICAgICAgbGFyZ2VfdGVzdGNhc2VzID0gdGVzdGNhc2VzICsgWworICAgICAgICAgICAgKDAsIE0sIDEpLAorICAgICAgICAgICAgKE0sIDAsIC0xKSwKKyAgICAgICAgICAgICgwLCBNLCBNIC0gMSksCisgICAgICAgICAgICAoTSAvLyAyLCBNLCAxKSwKKyAgICAgICAgICAgICgwLCAtTSwgLTEpLAorICAgICAgICAgICAgKDAsIC1NLCAxIC0gTSksCisgICAgICAgICAgICAoLU0sIE0sIDIpLAorICAgICAgICAgICAgKC1NLCBNLCAxMDI0KSwKKyAgICAgICAgICAgICgtTSwgTSwgMTA1ODUpLAorICAgICAgICAgICAgKE0sIC1NLCAtMiksCisgICAgICAgICAgICAoTSwgLU0sIC0xMDI0KSwKKyAgICAgICAgICAgIChNLCAtTSwgLTEwNTg1KSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHByb3RvIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBmb3IgdCBpbiBsYXJnZV90ZXN0Y2FzZXM6CisgICAgICAgICAgICAgICAgciA9IHhyYW5nZSgqdCkKKyAgICAgICAgICAgICAgICByX291dCA9IHBpY2tsZS5sb2FkcyhwaWNrbGUuZHVtcHMociwgcHJvdG8pKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0X3hyYW5nZXNfZXF1aXZhbGVudChyX291dCwgcikKKworICAgIGRlZiB0ZXN0X3JlcHIoc2VsZik6CisgICAgICAgICMgQ2hlY2sgdGhhdCByZXByIG9mIGFuIHhyYW5nZSBpcyBhIHZhbGlkIHJlcHJlc2VudGF0aW9uCisgICAgICAgICMgb2YgdGhhdCB4cmFuZ2UuCisKKyAgICAgICAgIyBWYWxpZCB4cmFuZ2VzIGhhdmUgYXQgbW9zdCBtaW4oc3lzLm1heGludCwgc3lzLm1heHNpemUpIGVsZW1lbnRzLgorICAgICAgICBNID0gbWluKHN5cy5tYXhpbnQsIHN5cy5tYXhzaXplKQorCisgICAgICAgIHRlc3RjYXNlcyA9IFsKKyAgICAgICAgICAgICgxMywpLAorICAgICAgICAgICAgKDAsIDExKSwKKyAgICAgICAgICAgICgtMjIsIDEwKSwKKyAgICAgICAgICAgICgyMCwgMywgLTEpLAorICAgICAgICAgICAgKDEzLCAyMSwgMyksCisgICAgICAgICAgICAoLTIsIDIsIDIpLAorICAgICAgICAgICAgKDAsIE0sIDEpLAorICAgICAgICAgICAgKE0sIDAsIC0xKSwKKyAgICAgICAgICAgICgwLCBNLCBNIC0gMSksCisgICAgICAgICAgICAoTSAvLyAyLCBNLCAxKSwKKyAgICAgICAgICAgICgwLCAtTSwgLTEpLAorICAgICAgICAgICAgKDAsIC1NLCAxIC0gTSksCisgICAgICAgICAgICAoLU0sIE0sIDIpLAorICAgICAgICAgICAgKC1NLCBNLCAxMDI0KSwKKyAgICAgICAgICAgICgtTSwgTSwgMTA1ODUpLAorICAgICAgICAgICAgKE0sIC1NLCAtMiksCisgICAgICAgICAgICAoTSwgLU0sIC0xMDI0KSwKKyAgICAgICAgICAgIChNLCAtTSwgLTEwNTg1KSwKKyAgICAgICAgICAgIF0KKyAgICAgICAgZm9yIHQgaW4gdGVzdGNhc2VzOgorICAgICAgICAgICAgciA9IHhyYW5nZSgqdCkKKyAgICAgICAgICAgIHJfb3V0ID0gZXZhbChyZXByKHIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfeHJhbmdlc19lcXVpdmFsZW50KHIsIHJfb3V0KQorCisgICAgZGVmIHRlc3RfcmFuZ2VfaXRlcmF0b3JzKHNlbGYpOgorICAgICAgICAjIHNlZSBpc3N1ZSA3Mjk4CisgICAgICAgIGxpbWl0cyA9IFtiYXNlICsgamlnZ2xlCisgICAgICAgICAgICAgICAgICBmb3IgTSBpbiAoMioqMzIsIDIqKjY0KQorICAgICAgICAgICAgICAgICAgZm9yIGJhc2UgaW4gKC1NLCAtTS8vMiwgMCwgTS8vMiwgTSkKKyAgICAgICAgICAgICAgICAgIGZvciBqaWdnbGUgaW4gKC0yLCAtMSwgMCwgMSwgMildCisgICAgICAgIHRlc3RfcmFuZ2VzID0gWyhzdGFydCwgZW5kLCBzdGVwKQorICAgICAgICAgICAgICAgICAgICAgICBmb3Igc3RhcnQgaW4gbGltaXRzCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBlbmQgaW4gbGltaXRzCisgICAgICAgICAgICAgICAgICAgICAgIGZvciBzdGVwIGluICgtMioqNjMsIC0yKiozMSwgLTIsIC0xLCAxLCAyKV0KKworICAgICAgICBmb3Igc3RhcnQsIGVuZCwgc3RlcCBpbiB0ZXN0X3JhbmdlczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpdGVyMSA9IHhyYW5nZShzdGFydCwgZW5kLCBzdGVwKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVyMiA9IHB5cmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCkKKyAgICAgICAgICAgICAgICB0ZXN0X2lkID0gInhyYW5nZSh7fSwge30sIHt9KSIuZm9ybWF0KHN0YXJ0LCBlbmQsIHN0ZXApCisgICAgICAgICAgICAgICAgIyBjaGVjayBmaXJzdCAxMDAgZW50cmllcworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2l0ZXJhdG9yc19lcXVhbChpdGVyMSwgaXRlcjIsIHRlc3RfaWQsIGxpbWl0PTEwMCkKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGl0ZXIxID0gcmV2ZXJzZWQoeHJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXApKQorICAgICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpdGVyMiA9IHB5cmFuZ2VfcmV2ZXJzZWQoc3RhcnQsIGVuZCwgc3RlcCkKKyAgICAgICAgICAgICAgICB0ZXN0X2lkID0gInJldmVyc2VkKHhyYW5nZSh7fSwge30sIHt9KSkiLmZvcm1hdChzdGFydCwgZW5kLCBzdGVwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2l0ZXJhdG9yc19lcXVhbChpdGVyMSwgaXRlcjIsIHRlc3RfaWQsIGxpbWl0PTEwMCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFhyYW5nZVRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hyYW5nZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cmFuZ2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTQ1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cmFuZ2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3hyYW5nZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cmFuZ2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzOTQ1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF94cmFuZ2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGUucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllM2EyOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5CkBAIC0wLDAgKzEsMTUzOCBAQAorIyBXZSBjYW4gdGVzdCBwYXJ0IG9mIHRoZSBtb2R1bGUgd2l0aG91dCB6bGliLgordHJ5OgorICAgIGltcG9ydCB6bGliCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgemxpYiA9IE5vbmUKKworaW1wb3J0IG9zCitpbXBvcnQgaW8KK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgc2h1dGlsCitpbXBvcnQgc3RydWN0CitpbXBvcnQgemlwZmlsZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlGaWxlCitmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZGludCwgcmFuZG9tCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBza2lwVW5sZXNzCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgVEVTVEZOX1VOSUNPREUsIFRFU1RGTl9FTkNPRElORywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX3VuaXR0ZXN0LCBmaW5kZmlsZSwgdW5saW5rCit0cnk6CisgICAgVEVTVEZOX1VOSUNPREUuZW5jb2RlKFRFU1RGTl9FTkNPRElORykKK2V4Y2VwdCAoVW5pY29kZUVycm9yLCBUeXBlRXJyb3IpOgorICAgICMgRWl0aGVyIHRoZSBmaWxlIHN5c3RlbSBlbmNvZGluZyBpcyBOb25lLCBvciB0aGUgZmlsZSBuYW1lCisgICAgIyBjYW5ub3QgYmUgZW5jb2RlZCBpbiB0aGUgZmlsZSBzeXN0ZW0gZW5jb2RpbmcuCisgICAgVEVTVEZOX1VOSUNPREUgPSBOb25lCisKK1RFU1RGTjIgPSBURVNURk4gKyAiMiIKK1RFU1RGTkRJUiA9IFRFU1RGTiArICJkIgorRklYRURURVNUX1NJWkUgPSAxMDAwCisKK1NNQUxMX1RFU1RfREFUQSA9IFsoJ196aXB0ZXN0MScsICcxcTJ3M2U0cjV0JyksCisgICAgICAgICAgICAgICAgICAgKCd6aXB0ZXN0MmRpci9femlwdGVzdDInLCAncWF3c2VkcmZ0ZycpLAorICAgICAgICAgICAgICAgICAgICgnemlwdGVzdDJkaXIvemlwdGVzdDNkaXIvX3ppcHRlc3QzJywgJ2F6c3hkY2Z2Z2InKSwKKyAgICAgICAgICAgICAgICAgICAoJ3ppcHRlc3QyZGlyL3ppcHRlc3QzZGlyL3ppcHRlc3Q0ZGlyL196aXB0ZXN0MycsICc2eTd1OGk5bzBwJyldCisKKworY2xhc3MgVGVzdHNXaXRoU291cmNlRmlsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmxpbmVfZ2VuID0gWyJaaXBmaWxlIHRlc3QgbGluZSAlZC4gcmFuZG9tIGZsb2F0OiAlZiIgJSAoaSwgcmFuZG9tKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKEZJWEVEVEVTVF9TSVpFKV0KKyAgICAgICAgc2VsZi5kYXRhID0gJ1xuJy5qb2luKHNlbGYubGluZV9nZW4pICsgJ1xuJworCisgICAgICAgICMgTWFrZSBhIHNvdXJjZSBmaWxlIHdpdGggc29tZSBsaW5lcworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKworICAgIGRlZiBtYWtlX3Rlc3RfYXJjaGl2ZShzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgImFub3RoZXIubmFtZSIpCisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQorCisgICAgZGVmIHppcF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIiwgY29tcHJlc3Npb24pIGFzIHppcGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKFRFU1RGTiksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgiYW5vdGhlci5uYW1lIiksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgic3RyZmlsZSIpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgICAgICMgUHJpbnQgdGhlIFpJUCBkaXJlY3RvcnkKKyAgICAgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBmcAorICAgICAgICAgICAgICAgIHppcGZwLnByaW50ZGlyKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorCisgICAgICAgICAgICBkaXJlY3RvcnkgPSBmcC5nZXR2YWx1ZSgpCisgICAgICAgICAgICBsaW5lcyA9IGRpcmVjdG9yeS5zcGxpdGxpbmVzKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgNCkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignRmlsZSBOYW1lJywgbGluZXNbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdNb2RpZmllZCcsIGxpbmVzWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignU2l6ZScsIGxpbmVzWzBdKQorCisgICAgICAgICAgICBmbiwgZGF0ZSwgdGltZV8sIHNpemUgPSBsaW5lc1sxXS5zcGxpdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZuLCAnYW5vdGhlci5uYW1lJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLnN0cnB0aW1lKGRhdGUsICclWS0lbS0lZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUuc3RycHRpbWUodGltZV8sICclSDolTTolUycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplLCBzdHIobGVuKHNlbGYuZGF0YSkpKQorCisgICAgICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAorICAgICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKFRFU1RGTiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJhbm90aGVyLm5hbWUiLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0cmZpbGUiLCBuYW1lcykKKworICAgICAgICAgICAgIyBDaGVjayBpbmZvbGlzdAorICAgICAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCisgICAgICAgICAgICBuYW1lcyA9IFtpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmFtZXMpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihURVNURk4sIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiYW5vdGhlci5uYW1lIiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJzdHJmaWxlIiwgbmFtZXMpCisgICAgICAgICAgICBmb3IgaSBpbiBpbmZvczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAgICAgIyBjaGVjayBnZXRpbmZvCisgICAgICAgICAgICBmb3Igbm0gaW4gKFRFU1RGTiwgImFub3RoZXIubmFtZSIsICJzdHJmaWxlIik6CisgICAgICAgICAgICAgICAgaW5mbyA9IHppcGZwLmdldGluZm8obm0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvLmZpbGVuYW1lLCBubSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRlc3R6aXAgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgICAgIHppcGZwLnRlc3R6aXAoKQorCisgICAgZGVmIHRlc3Rfc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgZGVmIHppcF9vcGVuX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBkYXRhMSA9IFtdCisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oVEVTVEZOKSBhcyB6aXBvcGVuMToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICByZWFkX2RhdGEgPSB6aXBvcGVuMS5yZWFkKDI1NikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRfZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHppcGRhdGExLmFwcGVuZChyZWFkX2RhdGEpCisKKyAgICAgICAgICAgIHppcGRhdGEyID0gW10KKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbigiYW5vdGhlci5uYW1lIikgYXMgemlwb3BlbjI6CisgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICAgICAgcmVhZF9kYXRhID0gemlwb3BlbjIucmVhZCgyNTYpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkX2RhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICB6aXBkYXRhMi5hcHBlbmQocmVhZF9kYXRhKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4oemlwZGF0YTEpLCBzZWxmLmRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4oemlwZGF0YTIpLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgdGVzdF9vcGVuX3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9vcGVuX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgZGVmIHRlc3Rfb3Blbl92aWFfemlwX2luZm8oc2VsZik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigibmFtZSIsICJmb28iKQorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoIm5hbWUiLCAiYmFyIikKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCisgICAgICAgICAgICBkYXRhID0gIiIKKyAgICAgICAgICAgIGZvciBpbmZvIGluIGluZm9zOgorICAgICAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihpbmZvKSBhcyBmOgorICAgICAgICAgICAgICAgICAgICBkYXRhICs9IGYucmVhZCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YSA9PSAiZm9vYmFyIiBvciBkYXRhID09ICJiYXJmb28iKQorICAgICAgICAgICAgZGF0YSA9ICIiCisgICAgICAgICAgICBmb3IgaW5mbyBpbiBpbmZvczoKKyAgICAgICAgICAgICAgICBkYXRhICs9IHppcGZwLnJlYWQoaW5mbykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhID09ICJmb29iYXIiIG9yIGRhdGEgPT0gImJhcmZvbyIpCisKKyAgICBkZWYgemlwX3JhbmRvbV9vcGVuX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBkYXRhMSA9IFtdCisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oVEVTVEZOKSBhcyB6aXBvcGVuMToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICByZWFkX2RhdGEgPSB6aXBvcGVuMS5yZWFkKHJhbmRpbnQoMSwgMTAyNCkpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkX2RhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICB6aXBkYXRhMS5hcHBlbmQocmVhZF9kYXRhKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmpvaW4oemlwZGF0YTEpLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgdGVzdF9yYW5kb21fb3Blbl9zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmFuZG9tX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF91bml2ZXJhbF9yZWFkYWhlYWRzKHNlbGYpOgorICAgICAgICBmID0gU3RyaW5nSU8oKQorCisgICAgICAgIGRhdGEgPSAnYVxyXG4nICogMTYgKiAxMDI0CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICd3JywgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKFRFU1RGTiwgZGF0YSkKKworICAgICAgICBkYXRhMiA9ICcnCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICdyJykgYXMgemlwZnA6CisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oVEVTVEZOLCAnclUnKSBhcyB6aXBvcGVuOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHppcG9wZW46CisgICAgICAgICAgICAgICAgICAgIGRhdGEyICs9IGxpbmUKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIGRhdGEyLnJlcGxhY2UoJ1xuJywgJ1xyXG4nKSkKKworICAgIGRlZiB6aXBfcmVhZGxpbmVfcmVhZF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oVEVTVEZOKSBhcyB6aXBvcGVuOgorICAgICAgICAgICAgICAgIGRhdGEgPSAnJworICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKKworICAgICAgICAgICAgICAgICAgICByZWFkID0gemlwb3Blbi5yZWFkKDEwMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNlbGYuZGF0YSkKKworICAgIGRlZiB6aXBfcmVhZGxpbmVfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKFRFU1RGTikgYXMgemlwb3BlbjoKKyAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmxpbmVfZ2VuOgorICAgICAgICAgICAgICAgICAgICBsaW5lZGF0YSA9IHppcG9wZW4ucmVhZGxpbmUoKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVkYXRhLCBsaW5lICsgJ1xuJykKKworICAgIGRlZiB6aXBfcmVhZGxpbmVzX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihURVNURk4pIGFzIHpvOgorICAgICAgICAgICAgICAgIHppcGxpbmVzID0gem8ucmVhZGxpbmVzKCkKKyAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgemlwbGluZXMpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGxpbmUsIGxpbmUgKyAnXG4nKQorCisgICAgZGVmIHppcF9pdGVybGluZXNfdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIGxpbmUsIHppcGxpbmUgaW4gemlwKHNlbGYubGluZV9nZW4sIHppcGZwLm9wZW4oVEVTVEZOKSk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBsaW5lLCBsaW5lICsgJ1xuJykKKworICAgIGRlZiB0ZXN0X3JlYWRsaW5lX3JlYWRfc3RvcmVkKHNlbGYpOgorICAgICAgICAjIElzc3VlICM3NjEwOiBjYWxscyB0byByZWFkbGluZSgpIGludGVybGVhdmVkIHdpdGggY2FsbHMgdG8gcmVhZCgpLgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3JlYWRsaW5lX3JlYWRfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZV9zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmVhZGxpbmVfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXNfc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3JlYWRsaW5lc190ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIGRlZiB0ZXN0X2l0ZXJsaW5lc19zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfaXRlcmxpbmVzX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3Rfb3Blbl9kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9vcGVuX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfcmFuZG9tX29wZW5fZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmFuZG9tX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9yZWFkbGluZV9yZWFkX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICAjIElzc3VlICM3NjEwOiBjYWxscyB0byByZWFkbGluZSgpIGludGVybGVhdmVkIHdpdGggY2FsbHMgdG8gcmVhZCgpLgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3JlYWRsaW5lX3JlYWRfdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9yZWFkbGluZV9kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9yZWFkbGluZV90ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRsaW5lc19kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9yZWFkbGluZXNfdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9pdGVybGluZXNfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfaXRlcmxpbmVzX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfbG93X2NvbXByZXNzaW9uKHNlbGYpOgorICAgICAgICAiIiJDaGVjayBmb3IgY2FzZXMgd2hlcmUgY29tcHJlc3NlZCBkYXRhIGlzIGxhcmdlciB0aGFuIG9yaWdpbmFsLiIiIgorICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigic3RyZmlsZSIsICcxMicpCisKKyAgICAgICAgIyBHZXQgYW4gb3BlbiBvYmplY3QgZm9yIHN0cmZpbGUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkgYXMgemlwZnA6CisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oInN0cmZpbGUiKSBhcyBvcGVub2JqOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Blbm9iai5yZWFkKDEpLCAnMScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGVub2JqLnJlYWQoMSksICcyJykKKworICAgIGRlZiB0ZXN0X2Fic29sdXRlX2FyY25hbWVzKHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICIvYWJzb2x1dGUiKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAubmFtZWxpc3QoKSwgWyJhYnNvbHV0ZSJdKQorCisgICAgZGVmIHRlc3RfYXBwZW5kX3RvX3ppcF9maWxlKHNlbGYpOgorICAgICAgICAiIiJUZXN0IGFwcGVuZGluZyB0byBhbiBleGlzdGluZyB6aXBmaWxlLiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiYSIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigic3RyZmlsZSIsIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAubmFtZWxpc3QoKSwgW1RFU1RGTiwgInN0cmZpbGUiXSkKKworICAgIGRlZiB0ZXN0X2FwcGVuZF90b19ub25femlwX2ZpbGUoc2VsZik6CisgICAgICAgICIiIlRlc3QgYXBwZW5kaW5nIHRvIGFuIGV4aXN0aW5nIGZpbGUgdGhhdCBpcyBub3QgYSB6aXBmaWxlLiIiIgorICAgICAgICAjIE5PVEU6IHRoaXMgdGVzdCBmYWlscyBpZiBsZW4oZCkgPCAyMiBiZWNhdXNlIG9mIHRoZSBmaXJzdAorICAgICAgICAjIGxpbmUgImZwaW4uc2VlaygtMjIsIDIpIiBpbiBfRW5kUmVjRGF0YQorICAgICAgICBkYXRhID0gJ0kgYW0gbm90IGEgWmlwRmlsZSEnKjEwCisgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAnd2InKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZShkYXRhKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJhIiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQorCisgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAncmInKSBhcyBmOgorICAgICAgICAgICAgZi5zZWVrKGxlbihkYXRhKSkKKyAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5uYW1lbGlzdCgpLCBbVEVTVEZOXSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfbmV3bGluZV9hdF9lbmQoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgVEVTVEZOKQorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOMiwgJ2EnKSBhcyBmOgorICAgICAgICAgICAgZi53cml0ZSgiXHJcblwwMFwwMFwwMCIpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoemlwZnAsIHppcGZpbGUuWmlwRmlsZSkKKworICAgIGRlZiB0ZXN0X2lnbm9yZXNfc3R1ZmZfYXBwZW5kZWRfcGFzdF9jb21tZW50cyhzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAuY29tbWVudCA9IGIidGhpcyBpcyBhIGNvbW1lbnQiCisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTjIsICdhJykgYXMgZjoKKyAgICAgICAgICAgIGYud3JpdGUoImFiY2RlZlxyXG4iKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHppcGZwLCB6aXBmaWxlLlppcEZpbGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLmNvbW1lbnQsIGIidGhpcyBpcyBhIGNvbW1lbnQiKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfZGVmYXVsdF9uYW1lKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGNhbGxpbmcgWmlwRmlsZS53cml0ZSB3aXRob3V0IGFyY25hbWUgc3BlY2lmaWVkCisgICAgICAgIHByb2R1Y2VzIHRoZSBleHBlY3RlZCByZXN1bHQuIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IikgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoVEVTVEZOKSwgb3BlbihURVNURk4pLnJlYWQoKSkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9wZXJfZmlsZV9jb21wcmVzc2lvbihzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBmaWxlcyB3aXRoaW4gYSBaaXAgYXJjaGl2ZSBjYW4gaGF2ZSBkaWZmZXJlbnQKKyAgICAgICAgY29tcHJlc3Npb24gb3B0aW9ucy4iIiIKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgJ3N0b3JlbWUnLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICdkZWZsYXRlbWUnLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKyAgICAgICAgICAgIHNpbmZvID0gemlwZnAuZ2V0aW5mbygnc3RvcmVtZScpCisgICAgICAgICAgICBkaW5mbyA9IHppcGZwLmdldGluZm8oJ2RlZmxhdGVtZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpbmZvLmNvbXByZXNzX3R5cGUsIHppcGZpbGUuWklQX1NUT1JFRCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGluZm8uY29tcHJlc3NfdHlwZSwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVzdF93cml0ZV90b19yZWFkb25seShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCB0cnlpbmcgdG8gY2FsbCB3cml0ZSgpIG9uIGEgcmVhZG9ubHkgWmlwRmlsZSBvYmplY3QKKyAgICAgICAgcmFpc2VzIGEgUnVudGltZUVycm9yLiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJ3IikgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigic29tZWZpbGUudHh0IiwgImJvZ3VzIikKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGZwLndyaXRlLCBURVNURk4pCisKKyAgICBkZWYgdGVzdF9leHRyYWN0KHNlbGYpOgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX1NUT1JFRCkgYXMgemlwZnA6CisgICAgICAgICAgICBmb3IgZnBhdGgsIGZkYXRhIGluIFNNQUxMX1RFU1RfREFUQToKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZXN0cihmcGF0aCwgZmRhdGEpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBmcGF0aCwgZmRhdGEgaW4gU01BTExfVEVTVF9EQVRBOgorICAgICAgICAgICAgICAgIHdyaXR0ZW5maWxlID0gemlwZnAuZXh0cmFjdChmcGF0aCkKKworICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIGl0IHdhcyB3cml0dGVuIHRvIHRoZSByaWdodCBwbGFjZQorICAgICAgICAgICAgICAgIGNvcnJlY3RmaWxlID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBmcGF0aCkKKyAgICAgICAgICAgICAgICBjb3JyZWN0ZmlsZSA9IG9zLnBhdGgubm9ybXBhdGgoY29ycmVjdGZpbGUpCisKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXR0ZW5maWxlLCBjb3JyZWN0ZmlsZSkKKworICAgICAgICAgICAgICAgICMgbWFrZSBzdXJlIGNvcnJlY3QgZGF0YSBpcyBpbiBjb3JyZWN0IGZpbGUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZkYXRhLCBvcGVuKHdyaXR0ZW5maWxlLCAicmIiKS5yZWFkKCkpCisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKHdyaXR0ZW5maWxlKQorCisgICAgICAgICMgcmVtb3ZlIHRoZSB0ZXN0IGZpbGUgc3ViZGlyZWN0b3JpZXMKKyAgICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICd6aXB0ZXN0MmRpcicpKQorCisgICAgZGVmIHRlc3RfZXh0cmFjdF9hbGwoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBmcGF0aCwgZmRhdGEgaW4gU01BTExfVEVTVF9EQVRBOgorICAgICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKGZwYXRoLCBmZGF0YSkKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgemlwZnAuZXh0cmFjdGFsbCgpCisgICAgICAgICAgICBmb3IgZnBhdGgsIGZkYXRhIGluIFNNQUxMX1RFU1RfREFUQToKKyAgICAgICAgICAgICAgICBvdXRmaWxlID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCBmcGF0aCkKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmRhdGEsIG9wZW4ob3V0ZmlsZSwgInJiIikucmVhZCgpKQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShvdXRmaWxlKQorCisgICAgICAgICMgcmVtb3ZlIHRoZSB0ZXN0IGZpbGUgc3ViZGlyZWN0b3JpZXMKKyAgICAgICAgc2h1dGlsLnJtdHJlZShvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICd6aXB0ZXN0MmRpcicpKQorCisgICAgZGVmIGNoZWNrX2ZpbGUoc2VsZiwgZmlsZW5hbWUsIGNvbnRlbnQpOgorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpKQorICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBjb250ZW50KQorCisgICAgQHNraXBVbmxlc3MoVEVTVEZOX1VOSUNPREUsICJObyBVbmljb2RlIGZpbGVzeXN0ZW0gc2VtYW50aWNzIG9uIHRoaXMgcGxhdGZvcm0uIikKKyAgICBkZWYgdGVzdF9leHRyYWN0X3VuaWNvZGVfZmlsZW5hbWVzKHNlbGYpOgorICAgICAgICBmbmFtZXMgPSBbdSdmb28udHh0Jywgb3MucGF0aC5iYXNlbmFtZShURVNURk5fVU5JQ09ERSldCisgICAgICAgIGNvbnRlbnQgPSAnVGVzdCBmb3IgdW5pY29kZSBmaWxlbmFtZScKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIGZuYW1lIGluIGZuYW1lczoKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZXN0cihmbmFtZSwgY29udGVudCkKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIGZuYW1lIGluIGZuYW1lczoKKyAgICAgICAgICAgICAgICB3cml0dGVuZmlsZSA9IHppcGZwLmV4dHJhY3QoZm5hbWUpCisKKyAgICAgICAgICAgICAgICAjIG1ha2Ugc3VyZSBpdCB3YXMgd3JpdHRlbiB0byB0aGUgcmlnaHQgcGxhY2UKKyAgICAgICAgICAgICAgICBjb3JyZWN0ZmlsZSA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgZm5hbWUpCisgICAgICAgICAgICAgICAgY29ycmVjdGZpbGUgPSBvcy5wYXRoLm5vcm1wYXRoKGNvcnJlY3RmaWxlKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JpdHRlbmZpbGUsIGNvcnJlY3RmaWxlKQorCisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKHdyaXR0ZW5maWxlLCBjb250ZW50KQorICAgICAgICAgICAgICAgIG9zLnJlbW92ZSh3cml0dGVuZmlsZSkKKworICAgIGRlZiB0ZXN0X2V4dHJhY3RfaGFja2Vyc19hcmNuYW1lcyhzZWxmKToKKyAgICAgICAgaGFja25hbWVzID0gWworICAgICAgICAgICAgKCcuLi9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICgnZm9vLy4uL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAoJ2Zvby8uLi8uLi9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgKCdmb28vYmFyLy4uJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICgnLi8uLi9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICgnL2Zvby9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgKCcvZm9vLy4uL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAoJy9mb28vLi4vLi4vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgXQorICAgICAgICBpZiBvcy5wYXRoLnNlcCA9PSAnXFwnOgorICAgICAgICAgICAgaGFja25hbWVzLmV4dGVuZChbCisgICAgICAgICAgICAgICAgKHInLi5cZm9vXGJhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInLi5cL2Zvb1wvYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidmb28vXC4uXC9iYXInLCAnZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ2Zvb1wvLi4vXGJhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInQzpmb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidDOi9mb28vYmFyJywgJ2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocidDOi8vZm9vL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInQzpcZm9vXGJhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInLy9jb25reS9tb3VudHBvaW50L2Zvby9iYXInLCAnY29ua3kvbW91bnRwb2ludC9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInXFxjb25reVxtb3VudHBvaW50XGZvb1xiYXInLCAnY29ua3kvbW91bnRwb2ludC9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInLy8vY29ua3kvbW91bnRwb2ludC9mb28vYmFyJywgJ2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ1xcXGNvbmt5XG1vdW50cG9pbnRcZm9vXGJhcicsICdjb25reS9tb3VudHBvaW50L2Zvby9iYXInKSwKKyAgICAgICAgICAgICAgICAocicvL2Nvbmt5Ly9tb3VudHBvaW50L2Zvby9iYXInLCAnY29ua3kvbW91bnRwb2ludC9mb28vYmFyJyksCisgICAgICAgICAgICAgICAgKHInXFxjb25reVxcbW91bnRwb2ludFxmb29cYmFyJywgJ2Nvbmt5L21vdW50cG9pbnQvZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJy8vPy9DOi9mb28vYmFyJywgJ18vQ18vZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ1xcP1xDOlxmb29cYmFyJywgJ18vQ18vZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ0M6Ly4uL0M6L2Zvby9iYXInLCAnQ18vZm9vL2JhcicpLAorICAgICAgICAgICAgICAgIChyJ2E6YlxjPGQ+ZXxmImc/aCppJywgJ2IvY19kX2VfZl9nX2hfaScpLAorICAgICAgICAgICAgICAgICgnLi4vLi4vZm9vLi4vLi4vYmEuLnInLCAnZm9vL2JhLi5yJyksCisgICAgICAgICAgICBdKQorICAgICAgICBlbHNlOiAgIyBVbml4CisgICAgICAgICAgICBoYWNrbmFtZXMuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAoJy8vZm9vL2JhcicsICdmb28vYmFyJyksCisgICAgICAgICAgICAgICAgKCcuLi8uLi9mb28uLi8uLi9iYS4ucicsICdmb28uLi9iYS4ucicpLAorICAgICAgICAgICAgICAgIChyJ2Zvby8uLlxiYXInLCByJ2Zvby8uLlxiYXInKSwKKyAgICAgICAgICAgIF0pCisKKyAgICAgICAgZm9yIGFyY25hbWUsIGZpeGVkbmFtZSBpbiBoYWNrbmFtZXM6CisgICAgICAgICAgICBjb250ZW50ID0gYidmb29iYXInICsgYXJjbmFtZS5lbmNvZGUoKQorICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3cnLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGZwOgorICAgICAgICAgICAgICAgIHppbmZvID0gemlwZmlsZS5aaXBJbmZvKCkKKyAgICAgICAgICAgICAgICAjIHByZXNlcnZlIGJhY2tzbGFzaGVzCisgICAgICAgICAgICAgICAgemluZm8uZmlsZW5hbWUgPSBhcmNuYW1lCisgICAgICAgICAgICAgICAgemluZm8uZXh0ZXJuYWxfYXR0ciA9IDBvNjAwIDw8IDE2CisgICAgICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoemluZm8sIGNvbnRlbnQpCisKKyAgICAgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLnJlcGxhY2Uob3Muc2VwLCAiLyIpCisgICAgICAgICAgICB0YXJnZXRwYXRoID0gb3MucGF0aC5qb2luKCd0YXJnZXQnLCAnc3ViZGlyJywgJ3N1YnN1YicpCisgICAgICAgICAgICBjb3JyZWN0ZmlsZSA9IG9zLnBhdGguam9pbih0YXJnZXRwYXRoLCAqZml4ZWRuYW1lLnNwbGl0KCcvJykpCisKKyAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICdyJykgYXMgemlwZnA6CisgICAgICAgICAgICAgICAgd3JpdHRlbmZpbGUgPSB6aXBmcC5leHRyYWN0KGFyY25hbWUsIHRhcmdldHBhdGgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cml0dGVuZmlsZSwgY29ycmVjdGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9ImV4dHJhY3QgJXIiICUgYXJjbmFtZSkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmlsZShjb3JyZWN0ZmlsZSwgY29udGVudCkKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoJ3RhcmdldCcpCisKKyAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICdyJykgYXMgemlwZnA6CisgICAgICAgICAgICAgICAgemlwZnAuZXh0cmFjdGFsbCh0YXJnZXRwYXRoKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKGNvcnJlY3RmaWxlLCBjb250ZW50KQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZSgndGFyZ2V0JykKKworICAgICAgICAgICAgY29ycmVjdGZpbGUgPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICpmaXhlZG5hbWUuc3BsaXQoJy8nKSkKKworICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3InKSBhcyB6aXBmcDoKKyAgICAgICAgICAgICAgICB3cml0dGVuZmlsZSA9IHppcGZwLmV4dHJhY3QoYXJjbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyaXR0ZW5maWxlLCBjb3JyZWN0ZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZz0iZXh0cmFjdCAlciIgJSBhcmNuYW1lKQorICAgICAgICAgICAgc2VsZi5jaGVja19maWxlKGNvcnJlY3RmaWxlLCBjb250ZW50KQorICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShmaXhlZG5hbWUuc3BsaXQoJy8nKVswXSkKKworICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgJ3InKSBhcyB6aXBmcDoKKyAgICAgICAgICAgICAgICB6aXBmcC5leHRyYWN0YWxsKCkKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfZmlsZShjb3JyZWN0ZmlsZSwgY29udGVudCkKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZml4ZWRuYW1lLnNwbGl0KCcvJylbMF0pCisKKyAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4yKQorCisgICAgZGVmIHRlc3Rfd3JpdGVzdHJfY29tcHJlc3Npb24oc2VsZik6CisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IikKKyAgICAgICAgemlwZnAud3JpdGVzdHIoImEudHh0IiwgImhlbGxvIHdvcmxkIiwgY29tcHJlc3NfdHlwZT16aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgIGlmIHpsaWI6CisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigiYi50eHQiLCAiaGVsbG8gd29ybGQiLCBjb21wcmVzc190eXBlPXppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgICAgIGluZm8gPSB6aXBmcC5nZXRpbmZvKCdhLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5mby5jb21wcmVzc190eXBlLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICAgICAgaWYgemxpYjoKKyAgICAgICAgICAgIGluZm8gPSB6aXBmcC5nZXRpbmZvKCdiLnR4dCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uY29tcHJlc3NfdHlwZSwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKworICAgIGRlZiB6aXBfdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgd3JpdGVzdHIgY3JlYXRlcyBmaWxlcyB3aXRoIG1vZGUgMDYwMCwKKyAgICAgICAgIyB3aGVuIGl0IGlzIHBhc3NlZCBhIG5hbWUgcmF0aGVyIHRoYW4gYSBaaXBJbmZvIGluc3RhbmNlLgorCisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICB6aW5mbyA9IHppcGZwLmdldGluZm8oJ3N0cmZpbGUnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aW5mby5leHRlcm5hbF9hdHRyLCAwNjAwIDw8IDE2KQorCisgICAgZGVmIHRlc3Rfd3JpdGVzdHJfcGVybWlzc2lvbnMoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfdGVzdF93cml0ZXN0cl9wZXJtaXNzaW9ucyhmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCB0aGUgemlwZmlsZSBpcyBjbG9zZWQgYWZ0ZXIgdGhlICd3aXRoJyBibG9jay4iIiIKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBmcGF0aCwgZmRhdGEgaW4gU01BTExfVEVTVF9EQVRBOgorICAgICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKGZwYXRoLCBmZGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoemlwZnAuZnAgaXMgbm90IE5vbmUsICd6aXBmcCBpcyBub3Qgb3BlbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6aXBmcC5mcCBpcyBOb25lLCAnemlwZnAgaXMgbm90IGNsb3NlZCcpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh6aXBmcC5mcCBpcyBub3QgTm9uZSwgJ3ppcGZwIGlzIG5vdCBvcGVuJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHppcGZwLmZwIGlzIE5vbmUsICd6aXBmcCBpcyBub3QgY2xvc2VkJykKKworICAgIGRlZiB0ZXN0X2Nsb3NlX29uX2V4Y2VwdGlvbihzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCB0aGUgemlwZmlsZSBpcyBjbG9zZWQgaWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCBpbiB0aGUKKyAgICAgICAgJ3dpdGgnIGJsb2NrLiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIpIGFzIHppcGZwOgorICAgICAgICAgICAgZm9yIGZwYXRoLCBmZGF0YSBpbiBTTUFMTF9URVNUX0RBVEE6CisgICAgICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoZnBhdGgsIGZkYXRhKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIikgYXMgemlwZnAyOgorICAgICAgICAgICAgICAgIHJhaXNlIHppcGZpbGUuQmFkWmlwZmlsZSgpCisgICAgICAgIGV4Y2VwdCB6aXBmaWxlLkJhZFppcGZpbGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoemlwZnAyLmZwIGlzIE5vbmUsICd6aXBmcCBpcyBub3QgY2xvc2VkJykKKworICAgIGRlZiB0ZXN0X2FkZF9maWxlX2JlZm9yZV8xOTgwKHNlbGYpOgorICAgICAgICAjIFNldCBhdGltZSBhbmQgbXRpbWUgdG8gMTk3MC0wMS0wMQorICAgICAgICBvcy51dGltZShURVNURk4sICgwLCAwKSkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHppcGZwLndyaXRlLCBURVNURk4pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgIHVubGluayhURVNURk4yKQorCisKK2NsYXNzIFRlc3RaaXA2NEluU21hbGxGaWxlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGVzZSB0ZXN0cyB0ZXN0IHRoZSBaSVA2NCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgdXNpbmcgbGFyZ2UgZmlsZXMsCisgICAgIyBzZWUgdGVzdF96aXBmaWxlNjQgZm9yIHByb3BlciB0ZXN0cy4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fbGltaXQgPSB6aXBmaWxlLlpJUDY0X0xJTUlUCisgICAgICAgIHppcGZpbGUuWklQNjRfTElNSVQgPSA1CisKKyAgICAgICAgbGluZV9nZW4gPSAoIlRlc3Qgb2YgemlwZmlsZSBsaW5lICVkLiIgJSBpCisgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIEZJWEVEVEVTVF9TSVpFKSkKKyAgICAgICAgc2VsZi5kYXRhID0gJ1xuJy5qb2luKGxpbmVfZ2VuKQorCisgICAgICAgICMgTWFrZSBhIHNvdXJjZSBmaWxlIHdpdGggc29tZSBsaW5lcworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKworICAgIGRlZiBsYXJnZV9maWxlX2V4Y2VwdGlvbl90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkxhcmdlWmlwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZwLndyaXRlLCBURVNURk4sICJhbm90aGVyLm5hbWUiKQorCisgICAgZGVmIGxhcmdlX2ZpbGVfZXhjZXB0aW9uX3Rlc3QyKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkxhcmdlWmlwRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHppcGZwLndyaXRlc3RyLCAiYW5vdGhlci5uYW1lIiwgc2VsZi5kYXRhKQorCisgICAgZGVmIHRlc3RfbGFyZ2VfZmlsZV9leGNlcHRpb24oc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5sYXJnZV9maWxlX2V4Y2VwdGlvbl90ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKyAgICAgICAgICAgIHNlbGYubGFyZ2VfZmlsZV9leGNlcHRpb25fdGVzdDIoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgZGVmIHppcF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgIyBDcmVhdGUgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24sIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICJhbm90aGVyLm5hbWUiKQorICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCBURVNURk4pCisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigic3RyZmlsZSIsIHNlbGYuZGF0YSkKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIiwgY29tcHJlc3Npb24pIGFzIHppcGZwOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKFRFU1RGTiksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgiYW5vdGhlci5uYW1lIiksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgic3RyZmlsZSIpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgICAgICMgUHJpbnQgdGhlIFpJUCBkaXJlY3RvcnkKKyAgICAgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBmcAorICAgICAgICAgICAgICAgIHppcGZwLnByaW50ZGlyKCkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorCisgICAgICAgICAgICBkaXJlY3RvcnkgPSBmcC5nZXR2YWx1ZSgpCisgICAgICAgICAgICBsaW5lcyA9IGRpcmVjdG9yeS5zcGxpdGxpbmVzKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpbmVzKSwgNCkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignRmlsZSBOYW1lJywgbGluZXNbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCdNb2RpZmllZCcsIGxpbmVzWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbignU2l6ZScsIGxpbmVzWzBdKQorCisgICAgICAgICAgICBmbiwgZGF0ZSwgdGltZV8sIHNpemUgPSBsaW5lc1sxXS5zcGxpdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZuLCAnYW5vdGhlci5uYW1lJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLnN0cnB0aW1lKGRhdGUsICclWS0lbS0lZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUuc3RycHRpbWUodGltZV8sICclSDolTTolUycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplLCBzdHIobGVuKHNlbGYuZGF0YSkpKQorCisgICAgICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAorICAgICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihuYW1lcyksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKFRFU1RGTiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJhbm90aGVyLm5hbWUiLCBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oInN0cmZpbGUiLCBuYW1lcykKKworICAgICAgICAgICAgIyBDaGVjayBpbmZvbGlzdAorICAgICAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCisgICAgICAgICAgICBuYW1lcyA9IFtpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obmFtZXMpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihURVNURk4sIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbigiYW5vdGhlci5uYW1lIiwgbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJzdHJmaWxlIiwgbmFtZXMpCisgICAgICAgICAgICBmb3IgaSBpbiBpbmZvczoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGkuZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAgICAgIyBjaGVjayBnZXRpbmZvCisgICAgICAgICAgICBmb3Igbm0gaW4gKFRFU1RGTiwgImFub3RoZXIubmFtZSIsICJzdHJmaWxlIik6CisgICAgICAgICAgICAgICAgaW5mbyA9IHppcGZwLmdldGluZm8obm0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvLmZpbGVuYW1lLCBubSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm8uZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRlc3R6aXAgZG9lc24ndCByYWlzZSBhbiBleGNlcHRpb24KKyAgICAgICAgICAgIHppcGZwLnRlc3R6aXAoKQorCisgICAgZGVmIHRlc3Rfc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVzdF9hYnNvbHV0ZV9hcmNuYW1lcyhzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICIvYWJzb2x1dGUiKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJyIiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAubmFtZWxpc3QoKSwgWyJhYnNvbHV0ZSJdKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB6aXBmaWxlLlpJUDY0X0xJTUlUID0gc2VsZi5fbGltaXQKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgdW5saW5rKFRFU1RGTjIpCisKKworY2xhc3MgUHlaaXBGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3dyaXRlX3B5ZmlsZShzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikgYXMgemlwZnA6CisgICAgICAgICAgICBmbiA9IF9fZmlsZV9fCisgICAgICAgICAgICBpZiBmbi5lbmRzd2l0aCgnLnB5YycpIG9yIGZuLmVuZHN3aXRoKCcucHlvJyk6CisgICAgICAgICAgICAgICAgZm4gPSBmbls6LTFdCisKKyAgICAgICAgICAgIHppcGZwLndyaXRlcHkoZm4pCisKKyAgICAgICAgICAgIGJuID0gb3MucGF0aC5iYXNlbmFtZShmbikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYm4sIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYm4gKyAnbycgaW4gemlwZnAubmFtZWxpc3QoKSBvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJuICsgJ2MnIGluIHppcGZwLm5hbWVsaXN0KCkpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikgYXMgemlwZnA6CisgICAgICAgICAgICBmbiA9IF9fZmlsZV9fCisgICAgICAgICAgICBpZiBmbi5lbmRzd2l0aCgoJy5weWMnLCAnLnB5bycpKToKKyAgICAgICAgICAgICAgICBmbiA9IGZuWzotMV0KKworICAgICAgICAgICAgemlwZnAud3JpdGVweShmbiwgInRlc3RwYWNrYWdlIikKKworICAgICAgICAgICAgYm4gPSAiJXMvJXMiICUgKCJ0ZXN0cGFja2FnZSIsIG9zLnBhdGguYmFzZW5hbWUoZm4pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RJbihibiwgemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShibiArICdvJyBpbiB6aXBmcC5uYW1lbGlzdCgpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKKworICAgIGRlZiB0ZXN0X3dyaXRlX3B5dGhvbl9wYWNrYWdlKHNlbGYpOgorICAgICAgICBpbXBvcnQgZW1haWwKKyAgICAgICAgcGFja2FnZWRpciA9IG9zLnBhdGguZGlybmFtZShlbWFpbC5fX2ZpbGVfXykKKworICAgICAgICB3aXRoIHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlcHkocGFja2FnZWRpcikKKworICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBjb3VwbGUgb2YgbW9kdWxlcyBhdCBkaWZmZXJlbnQgbGV2ZWxzIG9mIHRoZQorICAgICAgICAgICAgIyBoaWVyYXJjaHkKKyAgICAgICAgICAgIG5hbWVzID0gemlwZnAubmFtZWxpc3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdlbWFpbC9fX2luaXRfXy5weW8nIGluIG5hbWVzIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsL19faW5pdF9fLnB5YycgaW4gbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2VtYWlsL21pbWUvdGV4dC5weW8nIGluIG5hbWVzIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VtYWlsL21pbWUvdGV4dC5weWMnIGluIG5hbWVzKQorCisgICAgZGVmIHRlc3Rfd3JpdGVfcHl0aG9uX2RpcmVjdG9yeShzZWxmKToKKyAgICAgICAgb3MubWtkaXIoVEVTVEZOMikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBvcGVuKG9zLnBhdGguam9pbihURVNURk4yLCAibW9kMS5weSIpLCAidyIpIGFzIGZwOgorICAgICAgICAgICAgICAgIGZwLndyaXRlKCJwcmludCg0MilcbiIpCisKKyAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIm1vZDIucHkiKSwgInciKSBhcyBmcDoKKyAgICAgICAgICAgICAgICBmcC53cml0ZSgicHJpbnQoNDIgKiA0MilcbiIpCisKKyAgICAgICAgICAgIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIm1vZDIudHh0IiksICJ3IikgYXMgZnA6CisgICAgICAgICAgICAgICAgZnAud3JpdGUoImJsYSBibGEgYmxhXG4iKQorCisgICAgICAgICAgICB6aXBmcCAgPSB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikKKyAgICAgICAgICAgIHppcGZwLndyaXRlcHkoVEVTVEZOMikKKworICAgICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ21vZDEucHljJyBpbiBuYW1lcyBvciAnbW9kMS5weW8nIGluIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdtb2QyLnB5YycgaW4gbmFtZXMgb3IgJ21vZDIucHlvJyBpbiBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ21vZDIudHh0JywgbmFtZXMpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOMikKKworICAgIGRlZiB0ZXN0X3dyaXRlX25vbl9weWZpbGUoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5QeVppcEZpbGUoVGVtcG9yYXJ5RmlsZSgpLCAidyIpIGFzIHppcGZwOgorICAgICAgICAgICAgb3BlbihURVNURk4sICd3Jykud3JpdGUoJ21vc3QgZGVmaW5pdGVseSBub3QgYSBweXRob24gZmlsZScpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGZwLndyaXRlcHksIFRFU1RGTikKKyAgICAgICAgICAgIG9zLnJlbW92ZShURVNURk4pCisKKworY2xhc3MgT3RoZXJUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgemlwc193aXRoX2JhZF9jcmMgPSB7CisgICAgICAgIHppcGZpbGUuWklQX1NUT1JFRDogKAorICAgICAgICAgICAgYidQS1wwMDNcMDA0XDAyNFwwXDBcMFwwXDAgXDIxM1wyMTI7OnInCisgICAgICAgICAgICBiJ1wyNTNcMzc3XGZcMFwwXDBcZlwwXDBcMFwwMDVcMFwwXDAwMGFmJworICAgICAgICAgICAgYidpbGVoZWxsbyxBd29ybGRQJworICAgICAgICAgICAgYidLXDAwMVwwMDJcMDI0XDAwM1wwMjRcMFwwXDBcMFwwIFwyMTNcMjEyOzonCisgICAgICAgICAgICBiJ3JcMjUzXDM3N1xmXDBcMFwwXGZcMFwwXDBcMDA1XDBcMFwwXDAnCisgICAgICAgICAgICBiJ1wwXDBcMFwwXDBcMFwwXDIwMFwwMDFcMFwwXDBcMDAwYWZpJworICAgICAgICAgICAgYidsZVBLXDAwNVwwMDZcMFwwXDBcMFwwMDFcMFwwMDFcMDAwM1wwMDAnCisgICAgICAgICAgICBiJ1wwXDAvXDBcMFwwXDBcMCcpLAorICAgICAgICB6aXBmaWxlLlpJUF9ERUZMQVRFRDogKAorICAgICAgICAgICAgYidQS1x4MDNceDA0XHgxNFx4MDBceDAwXHgwMFx4MDhceDAwbn1ceDBjPUZBJworICAgICAgICAgICAgYidLRVx4MTBceDAwXHgwMFx4MDBuXHgwMFx4MDBceDAwXHgwNVx4MDBceDAwXHgwMGFmJworICAgICAgICAgICAgYidpbGVceGNiSFx4Y2RceGM5XHhjOVcoXHhjZi9ceGNhSVx4YzlceGEwJworICAgICAgICAgICAgYic9XHgxM1x4MDBQS1x4MDFceDAyXHgxNFx4MDNceDE0XHgwMFx4MDBceDAwXHgwOFx4MDBuJworICAgICAgICAgICAgYid9XHgwYz1GQUtFXHgxMFx4MDBceDAwXHgwMG5ceDAwXHgwMFx4MDBceDA1JworICAgICAgICAgICAgYidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ODBceDAxXHgwMFx4MDBceDAwJworICAgICAgICAgICAgYidceDAwYWZpbGVQS1x4MDVceDA2XHgwMFx4MDBceDAwXHgwMFx4MDFceDAwJworICAgICAgICAgICAgYidceDAxXHgwMDNceDAwXHgwMFx4MDAzXHgwMFx4MDBceDAwXHgwMFx4MDAnKSwKKyAgICB9CisKKyAgICBkZWYgdGVzdF91bmljb2RlX2ZpbGVuYW1lcyhzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCAidyIpIGFzIHpmOgorICAgICAgICAgICAgemYud3JpdGVzdHIodSJmb28udHh0IiwgIlRlc3QgZm9yIHVuaWNvZGUgZmlsZW5hbWUiKQorICAgICAgICAgICAgemYud3JpdGVzdHIodSJceGY2LnR4dCIsICJUZXN0IGZvciB1bmljb2RlIGZpbGVuYW1lIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh6Zi5pbmZvbGlzdCgpWzBdLmZpbGVuYW1lLCB1bmljb2RlKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgInIiKSBhcyB6ZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemYuZmlsZWxpc3RbMF0uZmlsZW5hbWUsICJmb28udHh0IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemYuZmlsZWxpc3RbMV0uZmlsZW5hbWUsIHUiXHhmNi50eHQiKQorCisgICAgZGVmIHRlc3RfY3JlYXRlX25vbl9leGlzdGVudF9maWxlX2Zvcl9hcHBlbmQoc2VsZik6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKFRFU1RGTik6CisgICAgICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQorCisgICAgICAgIGZpbGVuYW1lID0gJ3Rlc3RmaWxlLnR4dCcKKyAgICAgICAgY29udGVudCA9ICdoZWxsbywgd29ybGQuIHRoaXMgaXMgc29tZSBjb250ZW50LicKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICdhJykgYXMgemY6CisgICAgICAgICAgICAgICAgemYud3JpdGVzdHIoZmlsZW5hbWUsIGNvbnRlbnQpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdDb3VsZCBub3QgYXBwZW5kIGRhdGEgdG8gYSBub24tZXhpc3RlbnQgemlwIGZpbGUuJykKKworICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoVEVTVEZOKSkKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICdyJykgYXMgemY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpmLnJlYWQoZmlsZW5hbWUpLCBjb250ZW50KQorCisgICAgZGVmIHRlc3RfY2xvc2VfZXJyb25lb3VzX2ZpbGUoc2VsZik6CisgICAgICAgICMgVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IHRoZSBaaXBGaWxlIGNvbnN0cnVjdG9yIGNsb3NlcyB0aGUgZmlsZSBvYmplY3QKKyAgICAgICAgIyBpdCBvcGVucyBpZiB0aGVyZSdzIGFuIGVycm9yIGluIHRoZSBmaWxlLiAgSWYgaXQgZG9lc24ndCwgdGhlCisgICAgICAgICMgdHJhY2ViYWNrIGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBaaXBGaWxlIG9iamVjdCBhbmQsIGluZGlyZWN0bHksCisgICAgICAgICMgdGhlIGZpbGUgb2JqZWN0LgorICAgICAgICAjIE9uIFdpbmRvd3MsIHRoaXMgY2F1c2VzIHRoZSBvcy51bmxpbmsoKSBjYWxsIHRvIGZhaWwgYmVjYXVzZSB0aGUKKyAgICAgICAgIyB1bmRlcmx5aW5nIGZpbGUgaXMgc3RpbGwgb3Blbi4gIFRoaXMgaXMgU0YgYnVnICM0MTIyMTQuCisgICAgICAgICMKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKCJ0aGlzIGlzIG5vdCBhIGxlZ2FsIHppcCBmaWxlXG4iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB6ZiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4pCisgICAgICAgIGV4Y2VwdCB6aXBmaWxlLkJhZFppcGZpbGU6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVzdF9pc196aXBfZXJyb25lb3VzX2ZpbGUoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgaXNfemlwZmlsZSgpIGNvcnJlY3RseSBpZGVudGlmaWVzIG5vbi16aXAgZmlsZXMuIiIiCisgICAgICAgICMgLSBwYXNzaW5nIGEgZmlsZW5hbWUKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInciKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKCJ0aGlzIGlzIG5vdCBhIGxlZ2FsIHppcCBmaWxlXG4iKQorICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoVEVTVEZOKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNoaykKKyAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlIG9iamVjdAorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2hrKQorICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGZwLndyaXRlKCJ0aGlzIGlzIG5vdCBhIGxlZ2FsIHppcCBmaWxlXG4iKQorICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoZnApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2hrKQorICAgICAgICBmcC5zZWVrKDAsIDApCisgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjaGspCisKKyAgICBkZWYgdGVzdF9kYW1hZ2VkX3ppcGZpbGUoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgemlwZmlsZXMgd2l0aCBtaXNzaW5nIGJ5dGVzIGF0IHRoZSBlbmQgcmFpc2UgQmFkWmlwRmlsZS4iIiIKKyAgICAgICAgIyAtIENyZWF0ZSBhIHZhbGlkIHppcCBmaWxlCisgICAgICAgIGZwID0gaW8uQnl0ZXNJTygpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGZwLCBtb2RlPSJ3IikgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoImZvby50eHQiLCBiIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICB6aXBmaWxlZGF0YSA9IGZwLmdldHZhbHVlKCkKKworICAgICAgICAjIC0gTm93IGNyZWF0ZSBjb3BpZXMgb2YgaXQgbWlzc2luZyB0aGUgbGFzdCBOIGJ5dGVzIGFuZCBtYWtlIHN1cmUKKyAgICAgICAgIyAgIGEgQmFkWmlwRmlsZSBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gd2UgdHJ5IHRvIG9wZW4gaXQKKyAgICAgICAgZm9yIE4gaW4gcmFuZ2UobGVuKHppcGZpbGVkYXRhKSk6CisgICAgICAgICAgICBmcCA9IGlvLkJ5dGVzSU8oemlwZmlsZWRhdGFbOk5dKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5CYWRaaXBmaWxlLCB6aXBmaWxlLlppcEZpbGUsIGZwKQorCisgICAgZGVmIHRlc3RfaXNfemlwX3ZhbGlkX2ZpbGUoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgaXNfemlwZmlsZSgpIGNvcnJlY3RseSBpZGVudGlmaWVzIHppcCBmaWxlcy4iIiIKKyAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlbmFtZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InciKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKKyAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKFRFU1RGTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaykKKyAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlIG9iamVjdAorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaGspCisgICAgICAgICAgICBmcC5zZWVrKDAsIDApCisgICAgICAgICAgICB6aXBfY29udGVudHMgPSBmcC5yZWFkKCkKKyAgICAgICAgIyAtIHBhc3NpbmcgYSBmaWxlLWxpa2Ugb2JqZWN0CisgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICBmcC53cml0ZSh6aXBfY29udGVudHMpCisgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNoaykKKyAgICAgICAgZnAuc2VlaygwLCAwKQorICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoZnApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaGspCisKKyAgICBkZWYgdGVzdF9ub25fZXhpc3RlbnRfZmlsZV9yYWlzZXNfSU9FcnJvcihzZWxmKToKKyAgICAgICAgIyBtYWtlIHN1cmUgd2UgZG9uJ3QgcmFpc2UgYW4gQXR0cmlidXRlRXJyb3Igd2hlbiBhIHBhcnRpYWxseS1jb25zdHJ1Y3RlZAorICAgICAgICAjIFppcEZpbGUgaW5zdGFuY2UgaXMgZmluYWxpemVkOyB0aGlzIHRlc3RzIGZvciByZWdyZXNzaW9uIG9uIFNGIHRyYWNrZXIKKyAgICAgICAgIyBidWcgIzQwMzg3MS4KKworICAgICAgICAjIFRoZSBidWcgd2UncmUgdGVzdGluZyBmb3IgY2F1c2VkIGFuIEF0dHJpYnV0ZUVycm9yIHRvIGJlIHJhaXNlZAorICAgICAgICAjIHdoZW4gYSBaaXBGaWxlIGluc3RhbmNlIHdhcyBjcmVhdGVkIGZvciBhIGZpbGUgdGhhdCBkaWQgbm90CisgICAgICAgICMgZXhpc3Q7IHRoZSAuZnAgbWVtYmVyIHdhcyBub3QgaW5pdGlhbGl6ZWQgYnV0IHdhcyBuZWVkZWQgYnkgdGhlCisgICAgICAgICMgX19kZWxfXygpIG1ldGhvZC4gIFNpbmNlIHRoZSBBdHRyaWJ1dGVFcnJvciBpcyBpbiB0aGUgX19kZWxfXygpLAorICAgICAgICAjIGl0IGlzIGlnbm9yZWQsIGJ1dCB0aGUgdXNlciBzaG91bGQgYmUgc3VmZmljaWVudGx5IGFubm95ZWQgYnkKKyAgICAgICAgIyB0aGUgbWVzc2FnZSBvbiB0aGUgb3V0cHV0IHRoYXQgcmVncmVzc2lvbiB3aWxsIGJlIG5vdGljZWQKKyAgICAgICAgIyBxdWlja2x5LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJT0Vycm9yLCB6aXBmaWxlLlppcEZpbGUsIFRFU1RGTikKKworICAgIGRlZiB0ZXN0X2VtcHR5X2ZpbGVfcmFpc2VzX0JhZFppcEZpbGUoc2VsZik6CisgICAgICAgIHdpdGggb3BlbihURVNURk4sICd3JykgYXMgZjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5CYWRaaXBmaWxlLCB6aXBmaWxlLlppcEZpbGUsIFRFU1RGTikKKworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAndycpIGFzIGZwOgorICAgICAgICAgICAgZnAud3JpdGUoInNob3J0IGZpbGUiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkJhZFppcGZpbGUsIHppcGZpbGUuWmlwRmlsZSwgVEVTVEZOKQorCisgICAgZGVmIHRlc3RfY2xvc2VkX3ppcF9yYWlzZXNfUnVudGltZUVycm9yKHNlbGYpOgorICAgICAgICAiIiJWZXJpZnkgdGhhdCB0ZXN0emlwKCkgZG9lc24ndCBzd2FsbG93IGluYXBwcm9wcmlhdGUgZXhjZXB0aW9ucy4iIiIKKyAgICAgICAgZGF0YSA9IFN0cmluZ0lPKCkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZGF0YSwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorCisgICAgICAgICMgVGhpcyBpcyBjb3JyZWN0OyBjYWxsaW5nIC5yZWFkIG9uIGEgY2xvc2VkIFppcEZpbGUgc2hvdWxkIHJhaXNlCisgICAgICAgICMgYSBSdW50aW1lRXJyb3IsIGFuZCBzbyBzaG91bGQgY2FsbGluZyAudGVzdHppcC4gIEFuIGVhcmxpZXIKKyAgICAgICAgIyB2ZXJzaW9uIG9mIC50ZXN0emlwIHdvdWxkIHN3YWxsb3cgdGhpcyBleGNlcHRpb24gKGFuZCBhbnkgb3RoZXIpCisgICAgICAgICMgYW5kIHJlcG9ydCB0aGF0IHRoZSBmaXJzdCBmaWxlIGluIHRoZSBhcmNoaXZlIHdhcyBjb3JydXB0LgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYucmVhZCwgImZvby50eHQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIHppcGYudGVzdHppcCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLndyaXRlc3RyLCAiYm9ndXMudHh0IiwgImJvZ3VzIikKKyAgICAgICAgb3BlbihURVNURk4sICd3Jykud3JpdGUoJ3ppcGZpbGUgdGVzdCBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLndyaXRlLCBURVNURk4pCisKKyAgICBkZWYgdGVzdF9iYWRfY29uc3RydWN0b3JfbW9kZShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBiYWQgbW9kZXMgcGFzc2VkIHRvIFppcEZpbGUgY29uc3RydWN0b3IgYXJlIGNhdWdodC4iIiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmaWxlLlppcEZpbGUsIFRFU1RGTiwgInEiKQorCisgICAgZGVmIHRlc3RfYmFkX29wZW5fbW9kZShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBiYWQgbW9kZXMgcGFzc2VkIHRvIFppcEZpbGUub3BlbiBhcmUgY2F1Z2h0LiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InciKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAjIHJlYWQgdGhlIGRhdGEgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGlzIHRoZXJlCisgICAgICAgICAgICB6aXBmLnJlYWQoImZvby50eHQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLm9wZW4sICJmb28udHh0IiwgInEiKQorCisgICAgZGVmIHRlc3RfcmVhZDAoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgY2FsbGluZyByZWFkKDApIG9uIGEgWmlwRXh0RmlsZSBvYmplY3QgcmV0dXJucyBhbiBlbXB0eQorICAgICAgICBzdHJpbmcgYW5kIGRvZXNuJ3QgYWR2YW5jZSBmaWxlIHBvaW50ZXIuIiIiCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICAgICAgIyByZWFkIHRoZSBkYXRhIHRvIG1ha2Ugc3VyZSB0aGUgZmlsZSBpcyB0aGVyZQorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oImZvby50eHQiKSBhcyBmOgorICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShGSVhFRFRFU1RfU0laRSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKDApLCAnJykKKworICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKKworICAgIGRlZiB0ZXN0X29wZW5fbm9uX2V4aXN0ZW50X2l0ZW0oc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgYXR0ZW1wdGluZyB0byBjYWxsIG9wZW4oKSBmb3IgYW4gaXRlbSB0aGF0IGRvZXNuJ3QKKyAgICAgICAgZXhpc3QgaW4gdGhlIGFyY2hpdmUgcmFpc2VzIGEgUnVudGltZUVycm9yLiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InciKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHppcGYub3BlbiwgImZvby50eHQiLCAiciIpCisKKyAgICBkZWYgdGVzdF9iYWRfY29tcHJlc3Npb25fbW9kZShzZWxmKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCBiYWQgY29tcHJlc3Npb24gbWV0aG9kcyBwYXNzZWQgdG8gWmlwRmlsZS5vcGVuIGFyZQorICAgICAgICBjYXVnaHQuIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgemlwZmlsZS5aaXBGaWxlLCBURVNURk4sICJ3IiwgLTEpCisKKyAgICBkZWYgdGVzdF91bnN1cHBvcnRlZF9jb21wcmVzc2lvbihzZWxmKToKKyAgICAgICAgIyBkYXRhIGlzIGRlY2xhcmVkIGFzIHNocnVuaywgYnV0IGFjdHVhbGx5IGRlZmxhdGVkCisgICAgICAgIGRhdGEgPSAoYidQS1x4MDNceDA0Llx4MDBceDAwXHgwMFx4MDFceDAwXHhlNENceGExQFx4MDBceDAwXHgwMCcKKyAgICAgICAgYidceDAwXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxXHgwMFx4MDBceDAweFx4MDNceDAwUEtceDAxJworICAgICAgICBiJ1x4MDIuXHgwMy5ceDAwXHgwMFx4MDBceDAxXHgwMFx4ZTRDXHhhMUBceDAwXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwJworICAgICAgICBiJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICBiJ1x4ODBceDAxXHgwMFx4MDBceDAwXHgwMHhQS1x4MDVceDA2XHgwMFx4MDBceDAwXHgwMFx4MDFceDAwXHgwMVx4MDAnCisgICAgICAgIGInL1x4MDBceDAwXHgwMCFceDAwXHgwMFx4MDBceDAwXHgwMCcpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlvLkJ5dGVzSU8oZGF0YSksICdyJykgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIHppcGYub3BlbiwgJ3gnKQorCisgICAgZGVmIHRlc3RfbnVsbF9ieXRlX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGEgZmlsZW5hbWUgY29udGFpbmluZyBhIG51bGwgYnl0ZSBpcyBwcm9wZXJseQorICAgICAgICB0ZXJtaW5hdGVkLiIiIgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InciKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dFx4MDBxcXEiLCAiTywgZm9yIGEgTXVzZSBvZiBGaXJlISIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYubmFtZWxpc3QoKSwgWydmb28udHh0J10pCisKKyAgICBkZWYgdGVzdF9zdHJ1Y3Rfc2l6ZXMoc2VsZik6CisgICAgICAgICIiIkNoZWNrIHRoYXQgWklQIGludGVybmFsIHN0cnVjdHVyZSBzaXplcyBhcmUgY2FsY3VsYXRlZCBjb3JyZWN0bHkuIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZmlsZS5zaXplRW5kQ2VudERpciwgMjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZmlsZS5zaXplQ2VudHJhbERpciwgNDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZmlsZS5zaXplRW5kQ2VudERpcjY0LCA1NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmaWxlLnNpemVFbmRDZW50RGlyNjRMb2NhdG9yLCAyMCkKKworICAgIGRlZiB0ZXN0X2NvbW1lbnRzKHNlbGYpOgorICAgICAgICAiIiJDaGVjayB0aGF0IGNvbW1lbnRzIG9uIHRoZSBhcmNoaXZlIGFyZSBoYW5kbGVkIHByb3Blcmx5LiIiIgorCisgICAgICAgICMgY2hlY2sgZGVmYXVsdCBjb21tZW50IGlzIGVtcHR5CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYuY29tbWVudCwgJycpCisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGYuY29tbWVudCwgJycpCisKKyAgICAgICAgIyBjaGVjayBhIHNpbXBsZSBzaG9ydCBjb21tZW50CisgICAgICAgIGNvbW1lbnQgPSAnQnJhdmVseSB0YWtpbmcgdG8gaGlzIGZlZXQsIGhlIGJlYXQgYSB2ZXJ5IGJyYXZlIHJldHJlYXQuJworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InciKSBhcyB6aXBmOgorICAgICAgICAgICAgemlwZi5jb21tZW50ID0gY29tbWVudAorICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCBjb21tZW50KQorCisgICAgICAgICMgY2hlY2sgYSBjb21tZW50IG9mIG1heCBsZW5ndGgKKyAgICAgICAgY29tbWVudDIgPSAnJy5qb2luKFsnJWQnICUgKGkqKjMgJSAxMCkgZm9yIGkgaW4geHJhbmdlKCgxIDw8IDE2KS0xKV0pCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBjb21tZW50MgorICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKKworICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmLmNvbW1lbnQsIGNvbW1lbnQyKQorCisgICAgICAgICMgY2hlY2sgYSBjb21tZW50IHRoYXQgaXMgdG9vIGxvbmcgaXMgdHJ1bmNhdGVkCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBjb21tZW50MiArICdvb3BzJworICAgICAgICAgICAgemlwZi53cml0ZXN0cigiZm9vLnR4dCIsICJPLCBmb3IgYSBNdXNlIG9mIEZpcmUhIikKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCBjb21tZW50MikKKworICAgIGRlZiB0ZXN0X2NoYW5nZV9jb21tZW50X2luX2VtcHR5X2FyY2hpdmUoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgImEiLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHppcGYuZmlsZWxpc3QpCisgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBiInRoaXMgaXMgYSBjb21tZW50IgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCBiInRoaXMgaXMgYSBjb21tZW50IikKKworICAgIGRlZiB0ZXN0X2NoYW5nZV9jb21tZW50X2luX25vbmVtcHR5X2FyY2hpdmUoc2VsZik6CisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgInciLCB6aXBmaWxlLlpJUF9TVE9SRUQpIGFzIHppcGY6CisgICAgICAgICAgICB6aXBmLndyaXRlc3RyKCJmb28udHh0IiwgIk8sIGZvciBhIE11c2Ugb2YgRmlyZSEiKQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICJhIiwgemlwZmlsZS5aSVBfU1RPUkVEKSBhcyB6aXBmOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHppcGYuZmlsZWxpc3QpCisgICAgICAgICAgICB6aXBmLmNvbW1lbnQgPSBiInRoaXMgaXMgYSBjb21tZW50IgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4sICJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZi5jb21tZW50LCBiInRoaXMgaXMgYSBjb21tZW50IikKKworICAgIGRlZiBjaGVja190ZXN0emlwX3dpdGhfYmFkX2NyYyhzZWxmLCBjb21wcmVzc2lvbik6CisgICAgICAgICIiIlRlc3RzIHRoYXQgZmlsZXMgd2l0aCBiYWQgQ1JDcyByZXR1cm4gdGhlaXIgbmFtZSBmcm9tIHRlc3R6aXAuIiIiCisgICAgICAgIHppcGRhdGEgPSBzZWxmLnppcHNfd2l0aF9iYWRfY3JjW2NvbXByZXNzaW9uXQorCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlvLkJ5dGVzSU8oemlwZGF0YSksIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAgICAgIyB0ZXN0emlwIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpcnN0IGNvcnJ1cHQgZmlsZSwgb3IgTm9uZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWZpbGUnLCB6aXBmLnRlc3R6aXAoKSkKKworICAgIGRlZiB0ZXN0X3Rlc3R6aXBfd2l0aF9iYWRfY3JjX3N0b3JlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja190ZXN0emlwX3dpdGhfYmFkX2NyYyh6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfdGVzdHppcF93aXRoX2JhZF9jcmNfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tfdGVzdHppcF93aXRoX2JhZF9jcmMoemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgY2hlY2tfcmVhZF93aXRoX2JhZF9jcmMoc2VsZiwgY29tcHJlc3Npb24pOgorICAgICAgICAiIiJUZXN0cyB0aGF0IGZpbGVzIHdpdGggYmFkIENSQ3MgcmFpc2UgYSBCYWRaaXBmaWxlIGV4Y2VwdGlvbiB3aGVuIHJlYWQuIiIiCisgICAgICAgIHppcGRhdGEgPSBzZWxmLnppcHNfd2l0aF9iYWRfY3JjW2NvbXByZXNzaW9uXQorCisgICAgICAgICMgVXNpbmcgWmlwRmlsZS5yZWFkKCkKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW8uQnl0ZXNJTyh6aXBkYXRhKSwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkJhZFppcGZpbGUsIHppcGYucmVhZCwgJ2FmaWxlJykKKworICAgICAgICAjIFVzaW5nIFppcEV4dEZpbGUucmVhZCgpCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGlvLkJ5dGVzSU8oemlwZGF0YSksIG1vZGU9InIiKSBhcyB6aXBmOgorICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ2FmaWxlJywgJ3InKSBhcyBjb3JydXB0X2ZpbGU6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5CYWRaaXBmaWxlLCBjb3JydXB0X2ZpbGUucmVhZCkKKworICAgICAgICAjIFNhbWUgd2l0aCBzbWFsbCByZWFkcyAoaW4gb3JkZXIgdG8gZXhlcmNpc2UgdGhlIGJ1ZmZlcmluZyBsb2dpYykKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW8uQnl0ZXNJTyh6aXBkYXRhKSwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICB3aXRoIHppcGYub3BlbignYWZpbGUnLCAncicpIGFzIGNvcnJ1cHRfZmlsZToKKyAgICAgICAgICAgICAgICBjb3JydXB0X2ZpbGUuTUlOX1JFQURfU0laRSA9IDIKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGZpbGUuQmFkWmlwZmlsZSk6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGNvcnJ1cHRfZmlsZS5yZWFkKDIpOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIHRlc3RfcmVhZF93aXRoX2JhZF9jcmNfc3RvcmVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3JlYWRfd2l0aF9iYWRfY3JjKHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9yZWFkX3dpdGhfYmFkX2NyY19kZWZsYXRlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19yZWFkX3dpdGhfYmFkX2NyYyh6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiBjaGVja19yZWFkX3JldHVybl9zaXplKHNlbGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgIyBJc3N1ZSAjOTgzNzogWmlwRXh0RmlsZS5yZWFkKCkgc2hvdWxkbid0IHJldHVybiBtb3JlIGJ5dGVzCisgICAgICAgICMgdGhhbiByZXF1ZXN0ZWQuCisgICAgICAgIGZvciB0ZXN0X3NpemUgaW4gKDEsIDQwOTUsIDQwOTYsIDQwOTcsIDE2Mzg0KToKKyAgICAgICAgICAgIGZpbGVfc2l6ZSA9IHRlc3Rfc2l6ZSArIDEKKyAgICAgICAgICAgIGp1bmsgPSBiJycuam9pbihzdHJ1Y3QucGFjaygnQicsIHJhbmRpbnQoMCwgMjU1KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgeCBpbiByYW5nZShmaWxlX3NpemUpKQorICAgICAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoaW8uQnl0ZXNJTygpLCAidyIsIGNvbXByZXNzaW9uKSBhcyB6aXBmOgorICAgICAgICAgICAgICAgIHppcGYud3JpdGVzdHIoJ2ZvbycsIGp1bmspCisgICAgICAgICAgICAgICAgd2l0aCB6aXBmLm9wZW4oJ2ZvbycsICdyJykgYXMgZnA6CisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGZwLnJlYWQodGVzdF9zaXplKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCB0ZXN0X3NpemUpCisKKyAgICBkZWYgdGVzdF9yZWFkX3JldHVybl9zaXplX3N0b3JlZChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja19yZWFkX3JldHVybl9zaXplKHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9yZWFkX3JldHVybl9zaXplX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBzZWxmLmNoZWNrX3JlYWRfcmV0dXJuX3NpemUoemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVzdF9lbXB0eV96aXBmaWxlKHNlbGYpOgorICAgICAgICAjIENoZWNrIHRoYXQgY3JlYXRpbmcgYSBmaWxlIGluICd3JyBvciAnYScgbW9kZSBhbmQgY2xvc2luZyB3aXRob3V0CisgICAgICAgICMgYWRkaW5nIGFueSBmaWxlcyB0byB0aGUgYXJjaGl2ZXMgY3JlYXRlcyBhIHZhbGlkIGVtcHR5IFpJUCBmaWxlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpIGFzIHppcGY6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHppcGYgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJyIikKKyAgICAgICAgZXhjZXB0IHppcGZpbGUuQmFkWmlwZmlsZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVW5hYmxlIHRvIGNyZWF0ZSBlbXB0eSBaSVAgZmlsZSBpbiAndycgbW9kZSIpCisKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJhIikgYXMgemlwZjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgemlwZiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4sIG1vZGU9InIiKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlVuYWJsZSB0byBjcmVhdGUgZW1wdHkgWklQIGZpbGUgaW4gJ2EnIG1vZGUiKQorCisgICAgZGVmIHRlc3Rfb3Blbl9lbXB0eV9maWxlKHNlbGYpOgorICAgICAgICAjIElzc3VlIDE3MTA3MDM6IENoZWNrIHRoYXQgb3BlbmluZyBhIGZpbGUgd2l0aCBsZXNzIHRoYW4gMjIgYnl0ZXMKKyAgICAgICAgIyByYWlzZXMgYSBCYWRaaXBmaWxlIGV4Y2VwdGlvbiAocmF0aGVyIHRoYW4gdGhlIHByZXZpb3VzbHkgdW5oZWxwZnVsCisgICAgICAgICMgSU9FcnJvcikKKyAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgJ3cnKSBhcyBmOgorICAgICAgICAgICAgcGFzcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkJhZFppcGZpbGUsIHppcGZpbGUuWmlwRmlsZSwgVEVTVEZOLCAncicpCisKKyAgICBkZWYgdGVzdF9jcmVhdGVfemlwaW5mb19iZWZvcmVfMTk4MChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgemlwZmlsZS5aaXBJbmZvLCAnc2V2ZW50aWVzJywgKDE5NzksIDEsIDEsIDAsIDAsIDApKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB1bmxpbmsoVEVTVEZOKQorICAgICAgICB1bmxpbmsoVEVTVEZOMikKKworCitjbGFzcyBEZWNyeXB0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIkNoZWNrIHRoYXQgWklQIGRlY3J5cHRpb24gd29ya3MuIFNpbmNlIHRoZSBsaWJyYXJ5IGRvZXMgbm90CisgICAgc3VwcG9ydCBlbmNyeXB0aW9uIGF0IHRoZSBtb21lbnQsIHdlIHVzZSBhIHByZS1nZW5lcmF0ZWQgZW5jcnlwdGVkCisgICAgWklQIGZpbGUuIiIiCisKKyAgICBkYXRhID0gKAorICAgICdQS1x4MDNceDA0XHgxNFx4MDBceDAxXHgwMFx4MDBceDAwblx4OTJpLiN5XHhlZj8mXHgwMFx4MDBceDAwXHgxYVx4MDAnCisgICAgJ1x4MDBceDAwXHgwOFx4MDBceDAwXHgwMHRlc3QudHh0XHhmYVx4MTBceGEwZ2x5fFx4ZmEtXHhjNVx4YzA9XHhmOXknCisgICAgJ1x4MThceGUwXHhhOHJceGIzWn1MZ1x4YmNceGFlXHhmOXxceDliXHgxOVx4ZTRceDhiXHhiYVx4YmIpXHg4Y1x4YjBceGRibCcKKyAgICAnUEtceDAxXHgwMlx4MTRceDAwXHgxNFx4MDBceDAxXHgwMFx4MDBceDAwblx4OTJpLiN5XHhlZj8mXHgwMFx4MDBceDAwJworICAgICdceDFhXHgwMFx4MDBceDAwXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAxXHgwMCBceDAwXHhiNlx4ODEnCisgICAgJ1x4MDBceDAwXHgwMFx4MDB0ZXN0LnR4dFBLXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwXHgwMVx4MDBceDAxXHgwMDZceDAwJworICAgICdceDAwXHgwMExceDAwXHgwMFx4MDBceDAwXHgwMCcgKQorICAgIGRhdGEyID0gKAorICAgICdQS1x4MDNceDA0XHgxNFx4MDBcdFx4MDBceDA4XHgwMFx4Y2Z9Mzh4dVx4YWFceGIyXHgxNFx4MDBceDAwXHgwMFx4MDBceDAyJworICAgICdceDAwXHgwMFx4MDRceDAwXHgxNVx4MDB6ZXJvVVRcdFx4MDBceDAzXHhkNlx4OGJceDkyR1x4ZGFceDhiXHg5MkdVeFx4MDQnCisgICAgJ1x4MDBceGU4XHgwM1x4ZThceDAzXHhjNzxNXHhiNWFceGNlWFx4YTNZJlx4OGJ7b0VceGQ3XHg5ZFx4OGNceDk4XHgwMlx4YzAnCisgICAgJ1BLXHgwN1x4MDh4dVx4YWFceGIyXHgxNFx4MDBceDAwXHgwMFx4MDBceDAyXHgwMFx4MDBQS1x4MDFceDAyXHgxN1x4MDMnCisgICAgJ1x4MTRceDAwXHRceDAwXHgwOFx4MDBceGNmfTM4eHVceGFhXHhiMlx4MTRceDAwXHgwMFx4MDBceDAwXHgwMlx4MDBceDAwJworICAgICdceDA0XHgwMFxyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhhNFx4ODFceDAwXHgwMFx4MDBceDAwemUnCisgICAgJ3JvVVRceDA1XHgwMFx4MDNceGQ2XHg4Ylx4OTJHVXhceDAwXHgwMFBLXHgwNVx4MDZceDAwXHgwMFx4MDBceDAwXHgwMScKKyAgICAnXHgwMFx4MDFceDAwP1x4MDBceDAwXHgwMFtceDAwXHgwMFx4MDBceDAwXHgwMCcgKQorCisgICAgcGxhaW4gPSAnemlwZmlsZS5weSBlbmNyeXB0aW9uIHRlc3QnCisgICAgcGxhaW4yID0gJ1x4MDAnKjUxMgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKyAgICAgICAgc2VsZi56aXAgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCAiciIpCisgICAgICAgIHdpdGggb3BlbihURVNURk4yLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YTIpCisgICAgICAgIHNlbGYuemlwMiA9IHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuemlwLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKyAgICAgICAgc2VsZi56aXAyLmNsb3NlKCkKKyAgICAgICAgb3MudW5saW5rKFRFU1RGTjIpCisKKyAgICBkZWYgdGVzdF9ub19wYXNzd29yZChzZWxmKToKKyAgICAgICAgIyBSZWFkaW5nIHRoZSBlbmNyeXB0ZWQgZmlsZSB3aXRob3V0IHBhc3N3b3JkCisgICAgICAgICMgbXVzdCBnZW5lcmF0ZSBhIFJ1blRpbWUgZXhjZXB0aW9uCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi56aXAucmVhZCwgInRlc3QudHh0IikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzZWxmLnppcDIucmVhZCwgInplcm8iKQorCisgICAgZGVmIHRlc3RfYmFkX3Bhc3N3b3JkKHNlbGYpOgorICAgICAgICBzZWxmLnppcC5zZXRwYXNzd29yZCgicGVybCIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgc2VsZi56aXAucmVhZCwgInRlc3QudHh0IikKKyAgICAgICAgc2VsZi56aXAyLnNldHBhc3N3b3JkKCJwZXJsIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBzZWxmLnppcDIucmVhZCwgInplcm8iKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2dvb2RfcGFzc3dvcmQoc2VsZik6CisgICAgICAgIHNlbGYuemlwLnNldHBhc3N3b3JkKCJweXRob24iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuemlwLnJlYWQoInRlc3QudHh0IiksIHNlbGYucGxhaW4pCisgICAgICAgIHNlbGYuemlwMi5zZXRwYXNzd29yZCgiMTIzNDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuemlwMi5yZWFkKCJ6ZXJvIiksIHNlbGYucGxhaW4yKQorCisKK2NsYXNzIFRlc3RzV2l0aFJhbmRvbUJpbmFyeUZpbGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGRhdGFjb3VudCA9IHJhbmRpbnQoMTYsIDY0KSoxMDI0ICsgcmFuZGludCgxLCAxMDI0KQorICAgICAgICBzZWxmLmRhdGEgPSAnJy5qb2luKHN0cnVjdC5wYWNrKCc8ZicsIHJhbmRvbSgpKnJhbmRpbnQoLTEwMDAsIDEwMDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShkYXRhY291bnQpKQorCisgICAgICAgICMgTWFrZSBhIHNvdXJjZSBmaWxlIHdpdGggc29tZSBsaW5lcworICAgICAgICB3aXRoIG9wZW4oVEVTVEZOLCAid2IiKSBhcyBmcDoKKyAgICAgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgdW5saW5rKFRFU1RGTikKKyAgICAgICAgdW5saW5rKFRFU1RGTjIpCisKKyAgICBkZWYgbWFrZV90ZXN0X2FyY2hpdmUoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICJhbm90aGVyLm5hbWUiKQorICAgICAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCBURVNURk4pCisKKyAgICBkZWYgemlwX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICB0ZXN0ZGF0YSA9IHppcGZwLnJlYWQoVEVTVEZOKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGVzdGRhdGEpLCBsZW4oc2VsZi5kYXRhKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGRhdGEsIHNlbGYuZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgiYW5vdGhlci5uYW1lIiksIHNlbGYuZGF0YSkKKworICAgIGRlZiB0ZXN0X3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF90ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgaW8uQnl0ZXNJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgemlwX29wZW5fdGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgIHNlbGYubWFrZV90ZXN0X2FyY2hpdmUoZiwgY29tcHJlc3Npb24pCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGRhdGExID0gW10KKyAgICAgICAgICAgIHdpdGggemlwZnAub3BlbihURVNURk4pIGFzIHppcG9wZW4xOgorICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJlYWRfZGF0YSA9IHppcG9wZW4xLnJlYWQoMjU2KQorICAgICAgICAgICAgICAgICAgICBpZiBub3QgcmVhZF9kYXRhOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgemlwZGF0YTEuYXBwZW5kKHJlYWRfZGF0YSkKKworICAgICAgICAgICAgemlwZGF0YTIgPSBbXQorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKCJhbm90aGVyLm5hbWUiKSBhcyB6aXBvcGVuMjoKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICByZWFkX2RhdGEgPSB6aXBvcGVuMi5yZWFkKDI1NikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWRfZGF0YToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHppcGRhdGEyLmFwcGVuZChyZWFkX2RhdGEpCisKKyAgICAgICAgICAgIHRlc3RkYXRhMSA9ICcnLmpvaW4oemlwZGF0YTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXN0ZGF0YTEpLCBsZW4oc2VsZi5kYXRhKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGRhdGExLCBzZWxmLmRhdGEpCisKKyAgICAgICAgICAgIHRlc3RkYXRhMiA9ICcnLmpvaW4oemlwZGF0YTIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXN0ZGF0YTIpLCBsZW4oc2VsZi5kYXRhKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdGRhdGEyLCBzZWxmLmRhdGEpCisKKyAgICBkZWYgdGVzdF9vcGVuX3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9vcGVuX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X29wZW5fZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIGlvLkJ5dGVzSU8oKSk6CisgICAgICAgICAgICBzZWxmLnppcF9vcGVuX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgemlwX3JhbmRvbV9vcGVuX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICB6aXBkYXRhMSA9IFtdCisgICAgICAgICAgICB3aXRoIHppcGZwLm9wZW4oVEVTVEZOKSBhcyB6aXBvcGVuMToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICByZWFkX2RhdGEgPSB6aXBvcGVuMS5yZWFkKHJhbmRpbnQoMSwgMTAyNCkpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkX2RhdGE6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICB6aXBkYXRhMS5hcHBlbmQocmVhZF9kYXRhKQorCisgICAgICAgICAgICB0ZXN0ZGF0YSA9ICcnLmpvaW4oemlwZGF0YTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0ZXN0ZGF0YSksIGxlbihzZWxmLmRhdGEpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0ZGF0YSwgc2VsZi5kYXRhKQorCisgICAgZGVmIHRlc3RfcmFuZG9tX29wZW5fc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwX3JhbmRvbV9vcGVuX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JhbmRvbV9vcGVuX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBpby5CeXRlc0lPKCkpOgorICAgICAgICAgICAgc2VsZi56aXBfcmFuZG9tX29wZW5fdGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworCitAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCitjbGFzcyBUZXN0c1dpdGhNdWx0aXBsZU9wZW5zKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAidyIsIHppcGZpbGUuWklQX0RFRkxBVEVEKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIHppcGZwLndyaXRlc3RyKCdvbmVzJywgJzEnKkZJWEVEVEVTVF9TSVpFKQorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoJ3R3b3MnLCAnMicqRklYRURURVNUX1NJWkUpCisKKyAgICBkZWYgdGVzdF9zYW1lX2ZpbGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgKHdoZW4gdGhlIFppcEZpbGUgaXMgaW4gY29udHJvbCBvZiBjcmVhdGluZyBmaWxlIG9iamVjdHMpCisgICAgICAgICMgbXVsdGlwbGUgb3BlbigpIGNhbGxzIGNhbiBiZSBtYWRlIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHpvcGVuMSA9IHppcGYub3Blbignb25lcycpCisgICAgICAgICAgICB6b3BlbjIgPSB6aXBmLm9wZW4oJ29uZXMnKQorICAgICAgICAgICAgZGF0YTEgPSB6b3BlbjEucmVhZCg1MDApCisgICAgICAgICAgICBkYXRhMiA9IHpvcGVuMi5yZWFkKDUwMCkKKyAgICAgICAgICAgIGRhdGExICs9IHpvcGVuMS5yZWFkKDUwMCkKKyAgICAgICAgICAgIGRhdGEyICs9IHpvcGVuMi5yZWFkKDUwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTEsIGRhdGEyKQorCisgICAgZGVmIHRlc3RfZGlmZmVyZW50X2ZpbGUoc2VsZik6CisgICAgICAgICMgVmVyaWZ5IHRoYXQgKHdoZW4gdGhlIFppcEZpbGUgaXMgaW4gY29udHJvbCBvZiBjcmVhdGluZyBmaWxlIG9iamVjdHMpCisgICAgICAgICMgbXVsdGlwbGUgb3BlbigpIGNhbGxzIGNhbiBiZSBtYWRlIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBlYWNoIG90aGVyLgorICAgICAgICB3aXRoIHppcGZpbGUuWmlwRmlsZShURVNURk4yLCBtb2RlPSJyIikgYXMgemlwZjoKKyAgICAgICAgICAgIHdpdGggemlwZi5vcGVuKCdvbmVzJykgYXMgem9wZW4xLCB6aXBmLm9wZW4oJ3R3b3MnKSBhcyB6b3BlbjI6CisgICAgICAgICAgICAgICAgZGF0YTEgPSB6b3BlbjEucmVhZCg1MDApCisgICAgICAgICAgICAgICAgZGF0YTIgPSB6b3BlbjIucmVhZCg1MDApCisgICAgICAgICAgICAgICAgZGF0YTEgKz0gem9wZW4xLnJlYWQoNTAwKQorICAgICAgICAgICAgICAgIGRhdGEyICs9IHpvcGVuMi5yZWFkKDUwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTEsICcxJypGSVhFRFRFU1RfU0laRSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YTIsICcyJypGSVhFRFRFU1RfU0laRSkKKworICAgIGRlZiB0ZXN0X2ludGVybGVhdmVkKHNlbGYpOgorICAgICAgICAjIFZlcmlmeSB0aGF0ICh3aGVuIHRoZSBaaXBGaWxlIGlzIGluIGNvbnRyb2wgb2YgY3JlYXRpbmcgZmlsZSBvYmplY3RzKQorICAgICAgICAjIG11bHRpcGxlIG9wZW4oKSBjYWxscyBjYW4gYmUgbWFkZSB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlci4KKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoVEVTVEZOMiwgbW9kZT0iciIpIGFzIHppcGY6CisgICAgICAgICAgICB3aXRoIHppcGYub3Blbignb25lcycpIGFzIHpvcGVuMSwgemlwZi5vcGVuKCd0d29zJykgYXMgem9wZW4yOgorICAgICAgICAgICAgICAgIGRhdGExID0gem9wZW4xLnJlYWQoNTAwKQorICAgICAgICAgICAgICAgIGRhdGEyID0gem9wZW4yLnJlYWQoNTAwKQorICAgICAgICAgICAgICAgIGRhdGExICs9IHpvcGVuMS5yZWFkKDUwMCkKKyAgICAgICAgICAgICAgICBkYXRhMiArPSB6b3BlbjIucmVhZCg1MDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGExLCAnMScqRklYRURURVNUX1NJWkUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEyLCAnMicqRklYRURURVNUX1NJWkUpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHVubGluayhURVNURk4yKQorCisKK2NsYXNzIFRlc3RXaXRoRGlyZWN0b3J5KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIG9zLm1rZGlyKFRFU1RGTjIpCisKKyAgICBkZWYgdGVzdF9leHRyYWN0X2RpcihzZWxmKToKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZmluZGZpbGUoInppcGRpci56aXAiKSkgYXMgemlwZjoKKyAgICAgICAgICAgIHppcGYuZXh0cmFjdGFsbChURVNURk4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgImEiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKG9zLnBhdGguam9pbihURVNURk4yLCAiYSIsICJiIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKFRFU1RGTjIsICJhIiwgImIiLCAiYyIpKSkKKworICAgIGRlZiB0ZXN0X2J1Z182MDUwKHNlbGYpOgorICAgICAgICAjIEV4dHJhY3Rpb24gc2hvdWxkIHN1Y2NlZWQgaWYgZGlyZWN0b3JpZXMgYWxyZWFkeSBleGlzdAorICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgImEiKSkKKyAgICAgICAgc2VsZi50ZXN0X2V4dHJhY3RfZGlyKCkKKworICAgIGRlZiB0ZXN0X3N0b3JlX2RpcihzZWxmKToKKyAgICAgICAgb3MubWtkaXIob3MucGF0aC5qb2luKFRFU1RGTjIsICJ4IikpCisgICAgICAgIHppcGYgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCAidyIpCisgICAgICAgIHppcGYud3JpdGUob3MucGF0aC5qb2luKFRFU1RGTjIsICJ4IiksICJ4IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHppcGYuZmlsZWxpc3RbMF0uZmlsZW5hbWUuZW5kc3dpdGgoIngvIikpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOMikKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoVEVTVEZOKToKKyAgICAgICAgICAgIHVubGluayhURVNURk4pCisKKworY2xhc3MgVW5pdmVyc2FsTmV3bGluZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYubGluZV9nZW4gPSBbIlRlc3Qgb2YgemlwZmlsZSBsaW5lICVkLiIgJSBpCisgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKEZJWEVEVEVTVF9TSVpFKV0KKyAgICAgICAgc2VsZi5zZXBzID0gKCdccicsICdcclxuJywgJ1xuJykKKyAgICAgICAgc2VsZi5hcmNkYXRhLCBzZWxmLmFyY2ZpbGVzID0ge30sIHt9CisgICAgICAgIGZvciBuLCBzIGluIGVudW1lcmF0ZShzZWxmLnNlcHMpOgorICAgICAgICAgICAgc2VsZi5hcmNkYXRhW3NdID0gcy5qb2luKHNlbGYubGluZV9nZW4pICsgcworICAgICAgICAgICAgc2VsZi5hcmNmaWxlc1tzXSA9ICclcy0lZCcgJSAoVEVTVEZOLCBuKQorICAgICAgICAgICAgb3BlbihzZWxmLmFyY2ZpbGVzW3NdLCAid2IiKS53cml0ZShzZWxmLmFyY2RhdGFbc10pCisKKyAgICBkZWYgbWFrZV90ZXN0X2FyY2hpdmUoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikgYXMgemlwZnA6CisgICAgICAgICAgICBmb3IgZm4gaW4gc2VsZi5hcmNmaWxlcy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZShmbiwgZm4pCisKKyAgICBkZWYgcmVhZF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKGZuLCAiclUiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgemlwZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hcmNkYXRhW3NlcF0sIHppcGRhdGEpCisKKyAgICBkZWYgcmVhZGxpbmVfcmVhZF90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJyIikKKyAgICAgICAgZm9yIHNlcCwgZm4gaW4gc2VsZi5hcmNmaWxlcy5pdGVtcygpOgorICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKGZuLCAiclUiKSBhcyB6aXBvcGVuOgorICAgICAgICAgICAgICAgIGRhdGEgPSAnJworICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIHJlYWQgPSB6aXBvcGVuLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IHJlYWQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHJlYWQKKworICAgICAgICAgICAgICAgICAgICByZWFkID0gemlwb3Blbi5yZWFkKDUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZWFkOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSByZWFkCisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgc2VsZi5hcmNkYXRhWydcbiddKQorCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgIGRlZiByZWFkbGluZV90ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKGZuLCAiclUiKSBhcyB6aXBvcGVuOgorICAgICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLmxpbmVfZ2VuOgorICAgICAgICAgICAgICAgICAgICAgICAgbGluZWRhdGEgPSB6aXBvcGVuLnJlYWRsaW5lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZWRhdGEsIGxpbmUgKyAnXG4nKQorCisgICAgZGVmIHJlYWRsaW5lc190ZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgc2VsZi5tYWtlX3Rlc3RfYXJjaGl2ZShmLCBjb21wcmVzc2lvbikKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHdpdGggemlwZmlsZS5aaXBGaWxlKGYsICJyIikgYXMgemlwZnA6CisgICAgICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgd2l0aCB6aXBmcC5vcGVuKGZuLCAiclUiKSBhcyBmcDoKKyAgICAgICAgICAgICAgICAgICAgemlwbGluZXMgPSBmcC5yZWFkbGluZXMoKQorICAgICAgICAgICAgICAgIGZvciBsaW5lLCB6aXBsaW5lIGluIHppcChzZWxmLmxpbmVfZ2VuLCB6aXBsaW5lcyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwbGluZSwgbGluZSArICdcbicpCisKKyAgICBkZWYgaXRlcmxpbmVzX3Rlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICBzZWxmLm1ha2VfdGVzdF9hcmNoaXZlKGYsIGNvbXByZXNzaW9uKQorCisgICAgICAgICMgUmVhZCB0aGUgWklQIGFyY2hpdmUKKyAgICAgICAgd2l0aCB6aXBmaWxlLlppcEZpbGUoZiwgInIiKSBhcyB6aXBmcDoKKyAgICAgICAgICAgIGZvciBzZXAsIGZuIGluIHNlbGYuYXJjZmlsZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmb3IgbGluZSwgemlwbGluZSBpbiB6aXAoc2VsZi5saW5lX2dlbiwgemlwZnAub3BlbihmbiwgInJVIikpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGxpbmUsIGxpbmUgKyAnXG4nKQorCisgICAgZGVmIHRlc3RfcmVhZF9zdG9yZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVfcmVhZF9zdG9yZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzc2MTA6IGNhbGxzIHRvIHJlYWRsaW5lKCkgaW50ZXJsZWF2ZWQgd2l0aCBjYWxscyB0byByZWFkKCkuCisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkbGluZV9yZWFkX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgZGVmIHRlc3RfcmVhZGxpbmVfc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYucmVhZGxpbmVfdGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBkZWYgdGVzdF9yZWFkbGluZXNfc3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYucmVhZGxpbmVzX3Rlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgZGVmIHRlc3RfaXRlcmxpbmVzX3N0b3JlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLml0ZXJsaW5lc190ZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIEBza2lwVW5sZXNzKHpsaWIsICJyZXF1aXJlcyB6bGliIikKKyAgICBkZWYgdGVzdF9yZWFkX2RlZmxhdGVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYucmVhZF90ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRsaW5lX3JlYWRfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgICMgSXNzdWUgIzc2MTA6IGNhbGxzIHRvIHJlYWRsaW5lKCkgaW50ZXJsZWF2ZWQgd2l0aCBjYWxscyB0byByZWFkKCkuCisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkbGluZV9yZWFkX3Rlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBAc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCisgICAgZGVmIHRlc3RfcmVhZGxpbmVfZGVmbGF0ZWQoc2VsZik6CisgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgorICAgICAgICAgICAgc2VsZi5yZWFkbGluZV90ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X3JlYWRsaW5lc19kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLnJlYWRsaW5lc190ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgQHNraXBVbmxlc3MoemxpYiwgInJlcXVpcmVzIHpsaWIiKQorICAgIGRlZiB0ZXN0X2l0ZXJsaW5lc19kZWZsYXRlZChzZWxmKToKKyAgICAgICAgZm9yIGYgaW4gKFRFU1RGTjIsIFRlbXBvcmFyeUZpbGUoKSwgU3RyaW5nSU8oKSk6CisgICAgICAgICAgICBzZWxmLml0ZXJsaW5lc190ZXN0KGYsIHppcGZpbGUuWklQX0RFRkxBVEVEKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBmb3Igc2VwLCBmbiBpbiBzZWxmLmFyY2ZpbGVzLml0ZW1zKCk6CisgICAgICAgICAgICBvcy5yZW1vdmUoZm4pCisgICAgICAgIHVubGluayhURVNURk4pCisgICAgICAgIHVubGluayhURVNURk4yKQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdHNXaXRoU291cmNlRmlsZSwgVGVzdFppcDY0SW5TbWFsbEZpbGVzLCBPdGhlclRlc3RzLAorICAgICAgICAgICAgICAgICBQeVppcEZpbGVUZXN0cywgRGVjcnlwdGlvblRlc3RzLCBUZXN0c1dpdGhNdWx0aXBsZU9wZW5zLAorICAgICAgICAgICAgICAgICBUZXN0V2l0aERpcmVjdG9yeSwgVW5pdmVyc2FsTmV3bGluZVRlc3RzLAorICAgICAgICAgICAgICAgICBUZXN0c1dpdGhSYW5kb21CaW5hcnlGaWxlcykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk3ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzk3ZDBkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwZmlsZTY0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZjNkY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlNjQucHkKQEAgLTAsMCArMSwxMjQgQEAKKyMgVGVzdHMgb2YgdGhlIGZ1bGwgWklQNjQgZnVuY3Rpb25hbGl0eSBvZiB6aXBmaWxlCisjIFRoZSB0ZXN0X3N1cHBvcnQucmVxdWlyZXMgY2FsbCBpcyB0aGUgb25seSByZWFzb24gZm9yIGtlZXBpbmcgdGhpcyBzZXBhcmF0ZQorIyBmcm9tIHRlc3RfemlwZmlsZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyBYWFgobm5vcndpdHopOiBkaXNhYmxlIHRoaXMgdGVzdCBieSBsb29raW5nIGZvciBleHRyYSBsYXJnZmlsZSByZXNvdXJjZQorIyB3aGljaCBkb2Vzbid0IGV4aXN0LiAgVGhpcyB0ZXN0IHRha2VzIG92ZXIgMzAgbWludXRlcyB0byBydW4gaW4gZ2VuZXJhbAorIyBhbmQgcmVxdWlyZXMgbW9yZSBkaXNrIHNwYWNlIHRoYW4gbW9zdCBvZiB0aGUgYnVpbGRib3RzLgordGVzdF9zdXBwb3J0LnJlcXVpcmVzKAorICAgICAgICAnZXh0cmFsYXJnZWZpbGUnLAorICAgICAgICAndGVzdCByZXF1aXJlcyBsb2FkcyBvZiBkaXNrLXNwYWNlIGJ5dGVzIGFuZCBhIGxvbmcgdGltZSB0byBydW4nCisgICAgKQorCisjIFdlIGNhbiB0ZXN0IHBhcnQgb2YgdGhlIG1vZHVsZSB3aXRob3V0IHpsaWIuCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCitpbXBvcnQgemlwZmlsZSwgb3MsIHVuaXR0ZXN0CitpbXBvcnQgdGltZQoraW1wb3J0IHN5cworCitmcm9tIHRlbXBmaWxlIGltcG9ydCBUZW1wb3JhcnlGaWxlCisKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CisKK1RFU1RGTjIgPSBURVNURk4gKyAiMiIKKworIyBIb3cgbXVjaCB0aW1lIGluIHNlY29uZHMgY2FuIHBhc3MgYmVmb3JlIHdlIHByaW50IGEgJ1N0aWxsIHdvcmtpbmcnIG1lc3NhZ2UuCitfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwgPSA1ICogNjAKKworY2xhc3MgVGVzdHNXaXRoU291cmNlRmlsZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIENyZWF0ZSB0ZXN0IGRhdGEuCisgICAgICAgICMgeHJhbmdlKCkgaXMgaW1wb3J0YW50IGhlcmUgLS0gZG9uJ3Qgd2FudCB0byBjcmVhdGUgaW1tb3J0YWwgc3BhY2UKKyAgICAgICAgIyBmb3IgYSBtaWxsaW9uIGludHMuCisgICAgICAgIGxpbmVfZ2VuID0gKCJUZXN0IG9mIHppcGZpbGUgbGluZSAlZC4iICUgaSBmb3IgaSBpbiB4cmFuZ2UoMTAwMDAwMCkpCisgICAgICAgIHNlbGYuZGF0YSA9ICdcbicuam9pbihsaW5lX2dlbikKKworICAgICAgICAjIEFuZCB3cml0ZSBpdCB0byBhIGZpbGUuCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICJ3YiIpCisgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIHppcFRlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICAjIENyZWF0ZSB0aGUgWklQIGFyY2hpdmUuCisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24sIGFsbG93WmlwNjQ9VHJ1ZSkKKworICAgICAgICAjIEl0IHdpbGwgY29udGFpbiBlbm91Z2ggY29waWVzIG9mIHNlbGYuZGF0YSB0byByZWFjaCBhYm91dCA2R0Igb2YKKyAgICAgICAgIyByYXcgZGF0YSB0byBzdG9yZS4KKyAgICAgICAgZmlsZWNvdW50ID0gNioxMDI0KiozIC8vIGxlbihzZWxmLmRhdGEpCisKKyAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgZm9yIG51bSBpbiByYW5nZShmaWxlY291bnQpOgorICAgICAgICAgICAgemlwZnAud3JpdGVzdHIoInRlc3RmbiVkIiAlIG51bSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAgICAgICAgICAgICcgIHppcFRlc3Qgc3RpbGwgd3JpdGluZyAlZCBvZiAlZCwgYmUgcGF0aWVudC4uLicgJQorICAgICAgICAgICAgICAgICAgIChudW0sIGZpbGVjb3VudCkpCisgICAgICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKQorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKGZpbGVjb3VudCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoInRlc3RmbiVkIiAlIG51bSksIHNlbGYuZGF0YSkKKyAgICAgICAgICAgICMgUHJpbnQgc3RpbGwgd29ya2luZyBtZXNzYWdlIHNpbmNlIHRoaXMgdGVzdCBjYW4gYmUgcmVhbGx5IHNsb3cKKyAgICAgICAgICAgIGlmIG5leHRfdGltZSA8PSB0aW1lLnRpbWUoKToKKyAgICAgICAgICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAgICAgICAgIHByaW50ID4+c3lzLl9fc3Rkb3V0X18sICgKKyAgICAgICAgICAgICAgICAgICAnICB6aXBUZXN0IHN0aWxsIHJlYWRpbmcgJWQgb2YgJWQsIGJlIHBhdGllbnQuLi4nICUKKyAgICAgICAgICAgICAgICAgICAobnVtLCBmaWxlY291bnQpKQorICAgICAgICAgICAgICAgIHN5cy5fX3N0ZG91dF9fLmZsdXNoKCkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RTdG9yZWQoc2VsZik6CisgICAgICAgICMgVHJ5IHRoZSB0ZW1wIGZpbGUgZmlyc3QuICBJZiB3ZSBkbyBURVNURk4yIGZpcnN0LCB0aGVuIGl0IGhvZ3MKKyAgICAgICAgIyBnaWdhYnl0ZXMgb2YgZGlzayBzcGFjZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LgorICAgICAgICBmb3IgZiBpbiBUZW1wb3JhcnlGaWxlKCksIFRFU1RGTjI6CisgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfU1RPUkVEKQorCisgICAgaWYgemxpYjoKKyAgICAgICAgZGVmIHRlc3REZWZsYXRlZChzZWxmKToKKyAgICAgICAgICAgICMgVHJ5IHRoZSB0ZW1wIGZpbGUgZmlyc3QuICBJZiB3ZSBkbyBURVNURk4yIGZpcnN0LCB0aGVuIGl0IGhvZ3MKKyAgICAgICAgICAgICMgZ2lnYWJ5dGVzIG9mIGRpc2sgc3BhY2UgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgdGVzdC4KKyAgICAgICAgICAgIGZvciBmIGluIFRlbXBvcmFyeUZpbGUoKSwgVEVTVEZOMjoKKyAgICAgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZvciBmbmFtZSBpbiBURVNURk4sIFRFU1RGTjI6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmbmFtZSk6CisgICAgICAgICAgICAgICAgb3MucmVtb3ZlKGZuYW1lKQorCisKK2NsYXNzIE90aGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0TW9yZVRoYW42NGtGaWxlcyhzZWxmKToKKyAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgbW9yZSB0aGFuIDY0ayBmaWxlcyBjYW4gYmUgYWRkZWQgdG8gYW4gYXJjaGl2ZSwKKyAgICAgICAgIyBhbmQgdGhhdCB0aGUgcmVzdWx0aW5nIGFyY2hpdmUgY2FuIGJlIHJlYWQgcHJvcGVybHkgYnkgWmlwRmlsZQorICAgICAgICB6aXBmID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgbW9kZT0idyIpCisgICAgICAgIHppcGYuZGVidWcgPSAxMDAKKyAgICAgICAgbnVtZmlsZXMgPSAoMSA8PCAxNikgKiAzLzIKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKG51bWZpbGVzKToKKyAgICAgICAgICAgIHppcGYud3JpdGVzdHIoImZvbyUwOGQiICUgaSwgIiVkIiAlIChpKiozICUgNTcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih6aXBmLm5hbWVsaXN0KCkpLCBudW1maWxlcykKKyAgICAgICAgemlwZi5jbG9zZSgpCisKKyAgICAgICAgemlwZjIgPSB6aXBmaWxlLlppcEZpbGUoVEVTVEZOLCBtb2RlPSJyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oemlwZjIubmFtZWxpc3QoKSksIG51bWZpbGVzKQorICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobnVtZmlsZXMpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmMi5yZWFkKCJmb28lMDhkIiAlIGkpLCAiJWQiICUgKGkqKjMgJSA1NykpCisgICAgICAgIHppcGYuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RGTikKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNURk4yKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RzV2l0aFNvdXJjZUZpbGUsIE90aGVyVGVzdHMpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGU2NC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlNjQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmI3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlNjQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGZpbGU2NC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlNjQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNmI3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBmaWxlNjQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjY3MzhhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5CkBAIC0wLDAgKzEsNDcyIEBACitpbXBvcnQgc3lzCitpbXBvcnQgb3MKK2ltcG9ydCBtYXJzaGFsCitpbXBvcnQgaW1wCitpbXBvcnQgc3RydWN0CitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Citmcm9tIHRlc3QudGVzdF9pbXBvcnRob29rcyBpbXBvcnQgSW1wb3J0SG9va3NCYXNlVGVzdENhc2UsIHRlc3Rfc3JjLCB0ZXN0X2NvCisKKyMgc29tZSB0ZXN0cyBjYW4gYmUgcmFuIGV2ZW4gd2l0aG91dCB6bGliCit0cnk6CisgICAgaW1wb3J0IHpsaWIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICB6bGliID0gTm9uZQorCitmcm9tIHppcGZpbGUgaW1wb3J0IFppcEZpbGUsIFppcEluZm8sIFpJUF9TVE9SRUQsIFpJUF9ERUZMQVRFRAorCitpbXBvcnQgemlwaW1wb3J0CitpbXBvcnQgbGluZWNhY2hlCitpbXBvcnQgZG9jdGVzdAoraW1wb3J0IGluc3BlY3QKK2ltcG9ydCBTdHJpbmdJTworZnJvbSB0cmFjZWJhY2sgaW1wb3J0IGV4dHJhY3RfdGIsIGV4dHJhY3Rfc3RhY2ssIHByaW50X3RiCityYWlzZV9zcmMgPSAnZGVmIGRvX3JhaXNlKCk6IHJhaXNlIFR5cGVFcnJvclxuJworCitkZWYgbWFrZV9weWMoY28sIG10aW1lKToKKyAgICBkYXRhID0gbWFyc2hhbC5kdW1wcyhjbykKKyAgICBpZiB0eXBlKG10aW1lKSBpcyB0eXBlKDAuMCk6CisgICAgICAgICMgTWFjIG10aW1lcyBuZWVkIGEgYml0IG9mIHNwZWNpYWwgY2FzaW5nCisgICAgICAgIGlmIG10aW1lIDwgMHg3ZmZmZmZmZjoKKyAgICAgICAgICAgIG10aW1lID0gaW50KG10aW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXRpbWUgPSBpbnQoLTB4MTAwMDAwMDAwTCArIGxvbmcobXRpbWUpKQorICAgIHB5YyA9IGltcC5nZXRfbWFnaWMoKSArIHN0cnVjdC5wYWNrKCI8aSIsIGludChtdGltZSkpICsgZGF0YQorICAgIHJldHVybiBweWMKKworZGVmIG1vZHVsZV9wYXRoX3RvX2RvdHRlZF9uYW1lKHBhdGgpOgorICAgIHJldHVybiBwYXRoLnJlcGxhY2Uob3Muc2VwLCAnLicpCisKK05PVyA9IHRpbWUudGltZSgpCit0ZXN0X3B5YyA9IG1ha2VfcHljKHRlc3RfY28sIE5PVykKKworCitpZiBfX2RlYnVnX186CisgICAgcHljX2V4dCA9ICIucHljIgorZWxzZToKKyAgICBweWNfZXh0ID0gIi5weW8iCisKKworVEVTVE1PRCA9ICJ6aXB0ZXN0bW9kdWxlIgorVEVTVFBBQ0sgPSAiemlwdGVzdHBhY2thZ2UiCitURVNUUEFDSzIgPSAiemlwdGVzdHBhY2thZ2UyIgorVEVNUF9aSVAgPSBvcy5wYXRoLmFic3BhdGgoImp1bms5NTE0MiIgKyBvcy5leHRzZXAgKyAiemlwIikKKworCitjbGFzcyBVbmNvbXByZXNzZWRaaXBJbXBvcnRUZXN0Q2FzZShJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZSk6CisKKyAgICBjb21wcmVzc2lvbiA9IFpJUF9TVE9SRUQKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIyBXZSdyZSByZXVzaW5nIHRoZSB6aXAgYXJjaGl2ZSBwYXRoLCBzbyB3ZSBtdXN0IGNsZWFyIHRoZQorICAgICAgICAjIGNhY2hlZCBkaXJlY3RvcnkgaW5mbyBhbmQgbGluZWNhY2hlCisgICAgICAgIGxpbmVjYWNoZS5jbGVhcmNhY2hlKCkKKyAgICAgICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNsZWFyKCkKKyAgICAgICAgSW1wb3J0SG9va3NCYXNlVGVzdENhc2Uuc2V0VXAoc2VsZikKKworICAgIGRlZiBkb1Rlc3Qoc2VsZiwgZXhwZWN0ZWRfZXh0LCBmaWxlcywgKm1vZHVsZXMsICoqa3cpOgorICAgICAgICB6ID0gWmlwRmlsZShURU1QX1pJUCwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbmFtZSwgKG10aW1lLCBkYXRhKSBpbiBmaWxlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHppbmZvID0gWmlwSW5mbyhuYW1lLCB0aW1lLmxvY2FsdGltZShtdGltZSkpCisgICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICB6LndyaXRlc3RyKHppbmZvLCBkYXRhKQorICAgICAgICAgICAgei5jbG9zZSgpCisKKyAgICAgICAgICAgIHN0dWZmID0ga3cuZ2V0KCJzdHVmZiIsIE5vbmUpCisgICAgICAgICAgICBpZiBzdHVmZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIFByZXBlbmQgJ3N0dWZmJyB0byB0aGUgc3RhcnQgb2YgdGhlIHppcGZpbGUKKyAgICAgICAgICAgICAgICBmID0gb3BlbihURU1QX1pJUCwgInJiIikKKyAgICAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKworICAgICAgICAgICAgICAgIGYgPSBvcGVuKFRFTVBfWklQLCAid2IiKQorICAgICAgICAgICAgICAgIGYud3JpdGUoc3R1ZmYpCisgICAgICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgVEVNUF9aSVApCisKKyAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oIi4iLmpvaW4obW9kdWxlcyksIGdsb2JhbHMoKSwgbG9jYWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiX19kdW1teV9fIl0pCisKKyAgICAgICAgICAgIGNhbGwgPSBrdy5nZXQoJ2NhbGwnKQorICAgICAgICAgICAgaWYgY2FsbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjYWxsKG1vZCkKKworICAgICAgICAgICAgaWYgZXhwZWN0ZWRfZXh0OgorICAgICAgICAgICAgICAgIGZpbGUgPSBtb2QuZ2V0X2ZpbGUoKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZSwgb3MucGF0aC5qb2luKFRFTVBfWklQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm1vZHVsZXMpICsgZXhwZWN0ZWRfZXh0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgei5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUoVEVNUF9aSVApCisKKyAgICBkZWYgdGVzdEFGYWtlWmxpYihzZWxmKToKKyAgICAgICAgIworICAgICAgICAjIFRoaXMgY291bGQgY2F1c2UgYSBzdGFjayBvdmVyZmxvdyBiZWZvcmU6IGltcG9ydGluZyB6bGliLnB5CisgICAgICAgICMgZnJvbSBhIGNvbXByZXNzZWQgYXJjaGl2ZSB3b3VsZCBjYXVzZSB6bGliIHRvIGJlIGltcG9ydGVkCisgICAgICAgICMgd2hpY2ggd291bGQgZmluZCB6bGliLnB5IGluIHRoZSBhcmNoaXZlLCB3aGljaCB3b3VsZC4uLiBldGMuCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIHRlc3QgKm11c3QqIGJlIGV4ZWN1dGVkIGZpcnN0OiBpdCBtdXN0IGJlIHRoZSBmaXJzdCBvbmUKKyAgICAgICAgIyB0byB0cmlnZ2VyIHppcGltcG9ydCB0byBpbXBvcnQgemxpYiAoemlwaW1wb3J0IGNhY2hlcyB0aGUKKyAgICAgICAgIyB6bGliLmRlY29tcHJlc3MgZnVuY3Rpb24gb2JqZWN0LCBhZnRlciB3aGljaCB0aGUgcHJvYmxlbSBiZWluZworICAgICAgICAjIHRlc3RlZCBoZXJlIHdvdWxkbid0IGJlIGEgcHJvYmxlbSBhbnltb3JlLi4uCisgICAgICAgICMgKEhlbmNlIHRoZSAnQScgaW4gdGhlIHRlc3QgbWV0aG9kIG5hbWU6IHRvIG1ha2UgaXQgdGhlIGZpcnN0CisgICAgICAgICMgaXRlbSBpbiBhIGxpc3Qgc29ydGVkIGJ5IG5hbWUsIGxpa2UgdW5pdHRlc3QubWFrZVN1aXRlKCkgZG9lcy4pCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIHRlc3QgZmFpbHMgb24gcGxhdGZvcm1zIG9uIHdoaWNoIHRoZSB6bGliIG1vZHVsZSBpcworICAgICAgICAjIHN0YXRpY2FsbHkgbGlua2VkLCBidXQgdGhlIHByb2JsZW0gaXQgdGVzdHMgZm9yIGNhbid0CisgICAgICAgICMgb2NjdXIgaW4gdGhhdCBjYXNlIChidWlsdGluIG1vZHVsZXMgYXJlIGFsd2F5cyBmb3VuZCBmaXJzdCksCisgICAgICAgICMgc28gd2UnbGwgc2ltcGx5IHNraXAgaXQgdGhlbi4gQnVnICM3NjU0NTYuCisgICAgICAgICMKKyAgICAgICAgaWYgInpsaWIiIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiAiemxpYiIgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbInpsaWIiXQorICAgICAgICBmaWxlcyA9IHsiemxpYi5weSI6IChOT1csIHRlc3Rfc3JjKX0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5kb1Rlc3QoIi5weSIsIGZpbGVzLCAiemxpYiIpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGlmIHNlbGYuY29tcHJlc3Npb24gIT0gWklQX0RFRkxBVEVEOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgdGVzdCB0byBub3QgcmFpc2UgSW1wb3J0RXJyb3IiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5jb21wcmVzc2lvbiAhPSBaSVBfU1RPUkVEOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgdGVzdCB0byByYWlzZSBJbXBvcnRFcnJvciIpCisKKyAgICBkZWYgdGVzdFB5KHNlbGYpOgorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QoIi5weSIsIGZpbGVzLCBURVNUTU9EKQorCisgICAgZGVmIHRlc3RQeWMoc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5Yyl9CisgICAgICAgIHNlbGYuZG9UZXN0KHB5Y19leHQsIGZpbGVzLCBURVNUTU9EKQorCisgICAgZGVmIHRlc3RCb3RoKHNlbGYpOgorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKSwKKyAgICAgICAgICAgICAgICAgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QocHljX2V4dCwgZmlsZXMsIFRFU1RNT0QpCisKKyAgICBkZWYgdGVzdEVtcHR5UHkoc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgIiIpfQorICAgICAgICBzZWxmLmRvVGVzdChOb25lLCBmaWxlcywgVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0QmFkTWFnaWMoc2VsZik6CisgICAgICAgICMgbWFrZSBweWMgbWFnaWMgd29yZCBpbnZhbGlkLCBmb3JjaW5nIGxvYWRpbmcgZnJvbSAucHkKKyAgICAgICAgbTAgPSBvcmQodGVzdF9weWNbMF0pCisgICAgICAgIG0wIF49IDB4MDQgICMgZmxpcCBhbiBhcmJpdHJhcnkgYml0CisgICAgICAgIGJhZG1hZ2ljX3B5YyA9IGNocihtMCkgKyB0ZXN0X3B5Y1sxOl0KKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCB0ZXN0X3NyYyksCisgICAgICAgICAgICAgICAgIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCBiYWRtYWdpY19weWMpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QpCisKKyAgICBkZWYgdGVzdEJhZE1hZ2ljMihzZWxmKToKKyAgICAgICAgIyBtYWtlIHB5YyBtYWdpYyB3b3JkIGludmFsaWQsIGNhdXNpbmcgYW4gSW1wb3J0RXJyb3IKKyAgICAgICAgbTAgPSBvcmQodGVzdF9weWNbMF0pCisgICAgICAgIG0wIF49IDB4MDQgICMgZmxpcCBhbiBhcmJpdHJhcnkgYml0CisgICAgICAgIGJhZG1hZ2ljX3B5YyA9IGNocihtMCkgKyB0ZXN0X3B5Y1sxOl0KKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArIHB5Y19leHQ6IChOT1csIGJhZG1hZ2ljX3B5Yyl9CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZCBJbXBvcnRFcnJvcjsgaW1wb3J0IGZyb20gYmFkIHB5YyIpCisKKyAgICBkZWYgdGVzdEJhZE1UaW1lKHNlbGYpOgorICAgICAgICB0MyA9IG9yZCh0ZXN0X3B5Y1s3XSkKKyAgICAgICAgdDMgXj0gMHgwMiAgIyBmbGlwIHRoZSBzZWNvbmQgYml0IC0tIG5vdCB0aGUgZmlyc3QgYXMgdGhhdCBvbmUKKyAgICAgICAgICAgICAgICAgICAgIyBpc24ndCBzdG9yZWQgaW4gdGhlIC5weSdzIG10aW1lIGluIHRoZSB6aXAgYXJjaGl2ZS4KKyAgICAgICAgYmFkdGltZV9weWMgPSB0ZXN0X3B5Y1s6N10gKyBjaHIodDMpICsgdGVzdF9weWNbODpdCisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpLAorICAgICAgICAgICAgICAgICBURVNUTU9EICsgcHljX2V4dDogKE5PVywgYmFkdGltZV9weWMpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QpCisKKyAgICBkZWYgdGVzdFBhY2thZ2Uoc2VsZik6CisgICAgICAgIHBhY2tkaXIgPSBURVNUUEFDSyArIG9zLnNlcAorICAgICAgICBmaWxlcyA9IHtwYWNrZGlyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKKyAgICAgICAgICAgICAgICAgcGFja2RpciArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5Yyl9CisgICAgICAgIHNlbGYuZG9UZXN0KHB5Y19leHQsIGZpbGVzLCBURVNUUEFDSywgVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0RGVlcFBhY2thZ2Uoc2VsZik6CisgICAgICAgIHBhY2tkaXIgPSBURVNUUEFDSyArIG9zLnNlcAorICAgICAgICBwYWNrZGlyMiA9IHBhY2tkaXIgKyBURVNUUEFDSzIgKyBvcy5zZXAKKyAgICAgICAgZmlsZXMgPSB7cGFja2RpciArICJfX2luaXRfXyIgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCisgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgIl9faW5pdF9fIiArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKSwKKyAgICAgICAgICAgICAgICAgcGFja2RpcjIgKyBURVNUTU9EICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpfQorICAgICAgICBzZWxmLmRvVGVzdChweWNfZXh0LCBmaWxlcywgVEVTVFBBQ0ssIFRFU1RQQUNLMiwgVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0WmlwSW1wb3J0ZXJNZXRob2RzKHNlbGYpOgorICAgICAgICBwYWNrZGlyID0gVEVTVFBBQ0sgKyBvcy5zZXAKKyAgICAgICAgcGFja2RpcjIgPSBwYWNrZGlyICsgVEVTVFBBQ0syICsgb3Muc2VwCisgICAgICAgIGZpbGVzID0ge3BhY2tkaXIgKyAiX19pbml0X18iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpLAorICAgICAgICAgICAgICAgICBwYWNrZGlyMiArICJfX2luaXRfXyIgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5YyksCisgICAgICAgICAgICAgICAgIHBhY2tkaXIyICsgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHRlc3RfcHljKX0KKworICAgICAgICB6ID0gWmlwRmlsZShURU1QX1pJUCwgInciKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgbmFtZSwgKG10aW1lLCBkYXRhKSBpbiBmaWxlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHppbmZvID0gWmlwSW5mbyhuYW1lLCB0aW1lLmxvY2FsdGltZShtdGltZSkpCisgICAgICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KKyAgICAgICAgICAgICAgICB6LndyaXRlc3RyKHppbmZvLCBkYXRhKQorICAgICAgICAgICAgei5jbG9zZSgpCisKKyAgICAgICAgICAgIHppID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5hcmNoaXZlLCBURU1QX1pJUCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShURVNUUEFDSyksIFRydWUpCisgICAgICAgICAgICBtb2QgPSB6aS5sb2FkX21vZHVsZShURVNUUEFDSykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZ2V0X2ZpbGVuYW1lKFRFU1RQQUNLKSwgbW9kLl9fZmlsZV9fKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmlzX3BhY2thZ2UocGFja2RpciArICdfX2luaXRfXycpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShwYWNrZGlyICsgVEVTVFBBQ0syKSwgVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShwYWNrZGlyMiArIFRFU1RNT0QpLCBGYWxzZSkKKworICAgICAgICAgICAgbW9kX3BhdGggPSBwYWNrZGlyMiArIFRFU1RNT0QKKyAgICAgICAgICAgIG1vZF9uYW1lID0gbW9kdWxlX3BhdGhfdG9fZG90dGVkX25hbWUobW9kX3BhdGgpCisgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZF9uYW1lKQorICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbbW9kX25hbWVdCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmdldF9zb3VyY2UoVEVTVFBBQ0spLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfc291cmNlKG1vZF9wYXRoKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZ2V0X2ZpbGVuYW1lKG1vZF9wYXRoKSwgbW9kLl9fZmlsZV9fKQorICAgICAgICAgICAgIyBUbyBwYXNzIGluIHRoZSBtb2R1bGUgbmFtZSBpbnN0ZWFkIG9mIHRoZSBwYXRoLCB3ZSBtdXN0IHVzZSB0aGUgcmlnaHQgaW1wb3J0ZXIKKyAgICAgICAgICAgIGxvYWRlciA9IG1vZC5fX2xvYWRlcl9fCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5nZXRfc291cmNlKG1vZF9uYW1lKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldF9maWxlbmFtZShtb2RfbmFtZSksIG1vZC5fX2ZpbGVfXykKKworICAgICAgICAgICAgIyB0ZXN0IHByZWZpeCBhbmQgYXJjaGl2ZXBhdGggbWVtYmVycworICAgICAgICAgICAgemkyID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQICsgb3Muc2VwICsgVEVTVFBBQ0spCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppMi5hcmNoaXZlLCBURU1QX1pJUCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkyLnByZWZpeCwgVEVTVFBBQ0sgKyBvcy5zZXApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB6LmNsb3NlKCkKKyAgICAgICAgICAgIG9zLnJlbW92ZShURU1QX1pJUCkKKworICAgIGRlZiB0ZXN0WmlwSW1wb3J0ZXJNZXRob2RzSW5TdWJEaXJlY3Rvcnkoc2VsZik6CisgICAgICAgIHBhY2tkaXIgPSBURVNUUEFDSyArIG9zLnNlcAorICAgICAgICBwYWNrZGlyMiA9IHBhY2tkaXIgKyBURVNUUEFDSzIgKyBvcy5zZXAKKyAgICAgICAgZmlsZXMgPSB7cGFja2RpcjIgKyAiX19pbml0X18iICsgcHljX2V4dDogKE5PVywgdGVzdF9weWMpLAorICAgICAgICAgICAgICAgICBwYWNrZGlyMiArIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCB0ZXN0X3B5Yyl9CisKKyAgICAgICAgeiA9IFppcEZpbGUoVEVNUF9aSVAsICJ3IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZm9yIG5hbWUsIChtdGltZSwgZGF0YSkgaW4gZmlsZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICB6aW5mbyA9IFppcEluZm8obmFtZSwgdGltZS5sb2NhbHRpbWUobXRpbWUpKQorICAgICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCisgICAgICAgICAgICAgICAgei53cml0ZXN0cih6aW5mbywgZGF0YSkKKyAgICAgICAgICAgIHouY2xvc2UoKQorCisgICAgICAgICAgICB6aSA9IHppcGltcG9ydC56aXBpbXBvcnRlcihURU1QX1pJUCArIG9zLnNlcCArIHBhY2tkaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmFyY2hpdmUsIFRFTVBfWklQKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5wcmVmaXgsIHBhY2tkaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppLmlzX3BhY2thZ2UoVEVTVFBBQ0syKSwgVHJ1ZSkKKyAgICAgICAgICAgIG1vZCA9IHppLmxvYWRfbW9kdWxlKFRFU1RQQUNLMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZ2V0X2ZpbGVuYW1lKFRFU1RQQUNLMiksIG1vZC5fX2ZpbGVfXykKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5pc19wYWNrYWdlKFRFU1RQQUNLMiArIG9zLnNlcCArICdfX2luaXRfXycpLCBGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuaXNfcGFja2FnZShURVNUUEFDSzIgKyBvcy5zZXAgKyBURVNUTU9EKSwgRmFsc2UpCisKKyAgICAgICAgICAgIG1vZF9wYXRoID0gVEVTVFBBQ0syICsgb3Muc2VwICsgVEVTVE1PRAorICAgICAgICAgICAgbW9kX25hbWUgPSBtb2R1bGVfcGF0aF90b19kb3R0ZWRfbmFtZShtb2RfcGF0aCkKKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kX25hbWUpCisgICAgICAgICAgICBtb2QgPSBzeXMubW9kdWxlc1ttb2RfbmFtZV0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZ2V0X3NvdXJjZShURVNUUEFDSzIpLCBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aS5nZXRfc291cmNlKG1vZF9wYXRoKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemkuZ2V0X2ZpbGVuYW1lKG1vZF9wYXRoKSwgbW9kLl9fZmlsZV9fKQorICAgICAgICAgICAgIyBUbyBwYXNzIGluIHRoZSBtb2R1bGUgbmFtZSBpbnN0ZWFkIG9mIHRoZSBwYXRoLCB3ZSBtdXN0IHVzZSB0aGUgcmlnaHQgaW1wb3J0ZXIKKyAgICAgICAgICAgIGxvYWRlciA9IG1vZC5fX2xvYWRlcl9fCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5nZXRfc291cmNlKG1vZF9uYW1lKSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldF9maWxlbmFtZShtb2RfbmFtZSksIG1vZC5fX2ZpbGVfXykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHouY2xvc2UoKQorICAgICAgICAgICAgb3MucmVtb3ZlKFRFTVBfWklQKQorCisgICAgZGVmIHRlc3RHZXREYXRhKHNlbGYpOgorICAgICAgICB6ID0gWmlwRmlsZShURU1QX1pJUCwgInciKQorICAgICAgICB6LmNvbXByZXNzaW9uID0gc2VsZi5jb21wcmVzc2lvbgorICAgICAgICB0cnk6CisgICAgICAgICAgICBuYW1lID0gInRlc3RkYXRhLmRhdCIKKyAgICAgICAgICAgIGRhdGEgPSAiIi5qb2luKFtjaHIoeCkgZm9yIHggaW4gcmFuZ2UoMjU2KV0pICogNTAwCisgICAgICAgICAgICB6LndyaXRlc3RyKG5hbWUsIGRhdGEpCisgICAgICAgICAgICB6LmNsb3NlKCkKKyAgICAgICAgICAgIHppID0gemlwaW1wb3J0LnppcGltcG9ydGVyKFRFTVBfWklQKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCB6aS5nZXRfZGF0YShuYW1lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ3ppcGltcG9ydGVyIG9iamVjdCcsIHJlcHIoemkpKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgei5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUoVEVNUF9aSVApCisKKyAgICBkZWYgdGVzdEltcG9ydGVyQXR0cihzZWxmKToKKyAgICAgICAgc3JjID0gIiIiaWYgMTogICMgaW5kZW50IGhhY2sKKyAgICAgICAgZGVmIGdldF9maWxlKCk6CisgICAgICAgICAgICByZXR1cm4gX19maWxlX18KKyAgICAgICAgaWYgX19sb2FkZXJfXy5nZXRfZGF0YSgic29tZS5kYXRhIikgIT0gInNvbWUgZGF0YSI6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvciwgImJhZCBkYXRhIlxuIiIiCisgICAgICAgIHB5YyA9IG1ha2VfcHljKGNvbXBpbGUoc3JjLCAiPD8/Pz4iLCAiZXhlYyIpLCBOT1cpCisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCBweWMpLAorICAgICAgICAgICAgICAgICAic29tZS5kYXRhIjogKE5PVywgInNvbWUgZGF0YSIpfQorICAgICAgICBzZWxmLmRvVGVzdChweWNfZXh0LCBmaWxlcywgVEVTVE1PRCkKKworICAgIGRlZiB0ZXN0SW1wb3J0X1dpdGhTdHVmZihzZWxmKToKKyAgICAgICAgIyB0cnkgaW1wb3J0aW5nIGZyb20gYSB6aXBmaWxlIHdoaWNoIGNvbnRhaW5zIGFkZGl0aW9uYWwKKyAgICAgICAgIyBzdHVmZiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlCisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgdGVzdF9zcmMpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QsCisgICAgICAgICAgICAgICAgICAgIHN0dWZmPSJTb21lIFN0dWZmIiozMSkKKworICAgIGRlZiBhc3NlcnRNb2R1bGVTb3VyY2Uoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnNwZWN0LmdldHNvdXJjZShtb2R1bGUpLCB0ZXN0X3NyYykKKworICAgIGRlZiB0ZXN0R2V0U291cmNlKHNlbGYpOgorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QoIi5weSIsIGZpbGVzLCBURVNUTU9ELCBjYWxsPXNlbGYuYXNzZXJ0TW9kdWxlU291cmNlKQorCisgICAgZGVmIHRlc3RHZXRDb21waWxlZFNvdXJjZShzZWxmKToKKyAgICAgICAgcHljID0gbWFrZV9weWMoY29tcGlsZSh0ZXN0X3NyYywgIjw/Pz8+IiwgImV4ZWMiKSwgTk9XKQorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKSwKKyAgICAgICAgICAgICAgICAgVEVTVE1PRCArIHB5Y19leHQ6IChOT1csIHB5Yyl9CisgICAgICAgIHNlbGYuZG9UZXN0KHB5Y19leHQsIGZpbGVzLCBURVNUTU9ELCBjYWxsPXNlbGYuYXNzZXJ0TW9kdWxlU291cmNlKQorCisgICAgZGVmIHJ1bkRvY3Rlc3Qoc2VsZiwgY2FsbGJhY2spOgorICAgICAgICBmaWxlcyA9IHtURVNUTU9EICsgIi5weSI6IChOT1csIHRlc3Rfc3JjKSwKKyAgICAgICAgICAgICAgICAgInh5ei50eHQiOiAoTk9XLCAiPj4+IGxvZy5hcHBlbmQoVHJ1ZSlcbiIpfQorICAgICAgICBzZWxmLmRvVGVzdCgiLnB5IiwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9Y2FsbGJhY2spCisKKyAgICBkZWYgZG9Eb2N0ZXN0RmlsZShzZWxmLCBtb2R1bGUpOgorICAgICAgICBsb2cgPSBbXQorICAgICAgICBvbGRfbWFzdGVyLCBkb2N0ZXN0Lm1hc3RlciA9IGRvY3Rlc3QubWFzdGVyLCBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRvY3Rlc3QudGVzdGZpbGUoCisgICAgICAgICAgICAgICAgJ3h5ei50eHQnLCBwYWNrYWdlPW1vZHVsZSwgbW9kdWxlX3JlbGF0aXZlPVRydWUsCisgICAgICAgICAgICAgICAgZ2xvYnM9bG9jYWxzKCkKKyAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGRvY3Rlc3QubWFzdGVyID0gb2xkX21hc3RlcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvZyxbVHJ1ZV0pCisKKyAgICBkZWYgdGVzdERvY3Rlc3RGaWxlKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bkRvY3Rlc3Qoc2VsZi5kb0RvY3Rlc3RGaWxlKQorCisgICAgZGVmIGRvRG9jdGVzdFN1aXRlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIGxvZyA9IFtdCisgICAgICAgIGRvY3Rlc3QuRG9jRmlsZVRlc3QoCisgICAgICAgICAgICAneHl6LnR4dCcsIHBhY2thZ2U9bW9kdWxlLCBtb2R1bGVfcmVsYXRpdmU9VHJ1ZSwKKyAgICAgICAgICAgIGdsb2JzPWxvY2FscygpCisgICAgICAgICkucnVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2csW1RydWVdKQorCisgICAgZGVmIHRlc3REb2N0ZXN0U3VpdGUoc2VsZik6CisgICAgICAgIHNlbGYucnVuRG9jdGVzdChzZWxmLmRvRG9jdGVzdFN1aXRlKQorCisgICAgZGVmIGRvVHJhY2ViYWNrKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZHVsZS5kb19yYWlzZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl0udGJfbmV4dAorCisgICAgICAgICAgICBmLGxubyxuLGxpbmUgPSBleHRyYWN0X3RiKHRiLCAxKVswXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCByYWlzZV9zcmMuc3RyaXAoKSkKKworICAgICAgICAgICAgZixsbm8sbixsaW5lID0gZXh0cmFjdF9zdGFjayh0Yi50Yl9mcmFtZSwgMSlbMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgcmFpc2Vfc3JjLnN0cmlwKCkpCisKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBwcmludF90Yih0YiwgMSwgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHZhbHVlKCkuZW5kc3dpdGgocmFpc2Vfc3JjKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUaGlzIG91Z2h0IHRvIGJlIGltcG9zc2libGUiKQorCisgICAgZGVmIHRlc3RUcmFjZWJhY2soc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgcmFpc2Vfc3JjKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QoTm9uZSwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9c2VsZi5kb1RyYWNlYmFjaykKKworCitAdW5pdHRlc3Quc2tpcFVubGVzcyh6bGliLCAicmVxdWlyZXMgemxpYiIpCitjbGFzcyBDb21wcmVzc2VkWmlwSW1wb3J0VGVzdENhc2UoVW5jb21wcmVzc2VkWmlwSW1wb3J0VGVzdENhc2UpOgorICAgIGNvbXByZXNzaW9uID0gWklQX0RFRkxBVEVECisKKworY2xhc3MgQmFkRmlsZVppcEltcG9ydFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgYXNzZXJ0WmlwRmFpbHVyZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHppcGltcG9ydC5aaXBJbXBvcnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaWxlbmFtZSkKKworICAgIGRlZiB0ZXN0Tm9GaWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFppcEZhaWx1cmUoJ0FkZmpka0ZKS0RGSmpka2xmanMnKQorCisgICAgZGVmIHRlc3RFbXB0eUZpbGVuYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFppcEZhaWx1cmUoJycpCisKKyAgICBkZWYgdGVzdEJhZEFyZ3Moc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgemlwaW1wb3J0LnppcGltcG9ydGVyLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHppcGltcG9ydC56aXBpbXBvcnRlciwgVEVTVE1PRCwga3dkPU5vbmUpCisKKyAgICBkZWYgdGVzdEZpbGVuYW1lVG9vTG9uZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRaaXBGYWlsdXJlKCdBJyAqIDMzMDAwKQorCisgICAgZGVmIHRlc3RFbXB0eUZpbGUoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVE1PRCkKKyAgICAgICAgb3BlbihURVNUTU9ELCAndysnKS5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0WmlwRmFpbHVyZShURVNUTU9EKQorCisgICAgZGVmIHRlc3RGaWxlVW5yZWFkYWJsZShzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNUTU9EKQorICAgICAgICBmZCA9IG9zLm9wZW4oVEVTVE1PRCwgb3MuT19DUkVBVCwgMDAwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0WmlwRmFpbHVyZShURVNUTU9EKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBJZiB3ZSBsZWF2ZSAidGhlIHJlYWQtb25seSBiaXQiIHNldCBvbiBXaW5kb3dzLCBub3RoaW5nIGNhbgorICAgICAgICAgICAgIyBkZWxldGUgVEVTVE1PRCwgYW5kIGxhdGVyIHRlc3RzIHN1ZmZlciBib2d1cyBmYWlsdXJlcy4KKyAgICAgICAgICAgIG9zLmNobW9kKFRFU1RNT0QsIDA2NjYpCisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQudW5saW5rKFRFU1RNT0QpCisKKyAgICBkZWYgdGVzdE5vdFppcEZpbGUoc2VsZik6CisgICAgICAgIHRlc3Rfc3VwcG9ydC51bmxpbmsoVEVTVE1PRCkKKyAgICAgICAgZnAgPSBvcGVuKFRFU1RNT0QsICd3KycpCisgICAgICAgIGZwLndyaXRlKCdhJyAqIDIyKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0WmlwRmFpbHVyZShURVNUTU9EKQorCisgICAgIyBYWFg6IGRpc2FibGVkIHVudGlsIHRoaXMgd29ya3Mgb24gQmlnLWVuZGlhbiBtYWNoaW5lcworICAgIGRlZiBfdGVzdEJvZ3VzWmlwRmlsZShzZWxmKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNUTU9EKQorICAgICAgICBmcCA9IG9wZW4oVEVTVE1PRCwgJ3crJykKKyAgICAgICAgZnAud3JpdGUoc3RydWN0LnBhY2soJz1JJywgMHgwNjA1NEI1MCkpCisgICAgICAgIGZwLndyaXRlKCdhJyAqIDE4KQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHogPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoVEVTVE1PRCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHouZmluZF9tb2R1bGUsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHoubG9hZF9tb2R1bGUsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHouaXNfcGFja2FnZSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5nZXRfY29kZSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5nZXRfZGF0YSwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgei5nZXRfc291cmNlLCBOb25lKQorCisgICAgICAgICAgICBlcnJvciA9IHppcGltcG9ydC5aaXBJbXBvcnRFcnJvcgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6LmZpbmRfbW9kdWxlKCdhYmMnKSwgTm9uZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3IsIHoubG9hZF9tb2R1bGUsICdhYmMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3IsIHouZ2V0X2NvZGUsICdhYmMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSU9FcnJvciwgei5nZXRfZGF0YSwgJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhlcnJvciwgei5nZXRfc291cmNlLCAnYWJjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9yLCB6LmlzX3BhY2thZ2UsICdhYmMnKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgemlwaW1wb3J0Ll96aXBfZGlyZWN0b3J5X2NhY2hlLmNsZWFyKCkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdHJ5OgorICAgICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICAgICAgICBVbmNvbXByZXNzZWRaaXBJbXBvcnRUZXN0Q2FzZSwKKyAgICAgICAgICAgICAgQ29tcHJlc3NlZFppcEltcG9ydFRlc3RDYXNlLAorICAgICAgICAgICAgICBCYWRGaWxlWmlwSW1wb3J0VGVzdENhc2UsCisgICAgICAgICAgICApCisgICAgZmluYWxseToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnVubGluayhURVNUTU9EKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzAzYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzYzODlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiNjE3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQpAQCAtMCwwICsxLDI1MCBAQAorIyBUaGlzIHRlc3QgbW9kdWxlIGNvdmVycyBzdXBwb3J0IGluIHZhcmlvdXMgcGFydHMgb2YgdGhlIHN0YW5kYXJkIGxpYnJhcnkKKyMgZm9yIHdvcmtpbmcgd2l0aCBtb2R1bGVzIGxvY2F0ZWQgaW5zaWRlIHppcGZpbGVzCisjIFRoZSB0ZXN0cyBhcmUgY2VudHJhbGlzZWQgaW4gdGhpcyBmYXNoaW9uIHRvIG1ha2UgaXQgZWFzeSB0byBkcm9wIHRoZW0KKyMgaWYgYSBwbGF0Zm9ybSBkb2Vzbid0IHN1cHBvcnQgemlwaW1wb3J0CitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2ltcG9ydCBvcworaW1wb3J0IG9zLnBhdGgKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IHppcGZpbGUKK2ltcG9ydCB6aXBpbXBvcnQKK2ltcG9ydCBkb2N0ZXN0CitpbXBvcnQgaW5zcGVjdAoraW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IHBkYgoraW1wb3J0IHdhcm5pbmdzCitmcm9tIHRlc3Quc2NyaXB0X2hlbHBlciBpbXBvcnQgKHNwYXduX3B5dGhvbiwga2lsbF9weXRob24sIHJ1bl9weXRob24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBfZGlyLCBtYWtlX3NjcmlwdCwgbWFrZV96aXBfc2NyaXB0KQorCit2ZXJib3NlID0gdGVzdC50ZXN0X3N1cHBvcnQudmVyYm9zZQorCisjIExpYnJhcnkgbW9kdWxlcyBjb3ZlcmVkIGJ5IHRoaXMgdGVzdCBzZXQKKyMgIHBkYiAoSXNzdWUgNDIwMSkKKyMgIGluc3BlY3QgKElzc3VlIDQyMjMpCisjICBkb2N0ZXN0IChJc3N1ZSA0MTk3KQorCisjIE90aGVyIHRlc3QgbW9kdWxlcyB3aXRoIHppcGltcG9ydCByZWxhdGVkIHRlc3RzCisjICB0ZXN0X3ppcGltcG9ydCAob2YgY291cnNlISkKKyMgIHRlc3RfY21kX2xpbmVfc2NyaXB0IChjb3ZlcnMgdGhlIHppcGltcG9ydCBzdXBwb3J0IGluIHJ1bnB5KQorCisjIFJldHJpZXZlIHNvbWUgaGVscGVycyBmcm9tIG90aGVyIHRlc3QgY2FzZXMKK2Zyb20gdGVzdCBpbXBvcnQgKHRlc3RfZG9jdGVzdCwgc2FtcGxlX2RvY3Rlc3QsIHNhbXBsZV9kb2N0ZXN0X25vX2RvY3Rlc3RzLAorICAgICAgICAgICAgICAgICAgc2FtcGxlX2RvY3Rlc3Rfbm9fZG9jc3RyaW5ncykKK2Zyb20gdGVzdC50ZXN0X2ltcG9ydGhvb2tzIGltcG9ydCBJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZQorCisKK2RlZiBfcnVuX29iamVjdF9kb2N0ZXN0KG9iaiwgbW9kdWxlKToKKyAgICAjIERpcmVjdCBkb2N0ZXN0IG91dHB1dCAobm9ybWFsbHkganVzdCBlcnJvcnMpIHRvIHJlYWwgc3Rkb3V0OyBkb2N0ZXN0CisgICAgIyBvdXRwdXQgc2hvdWxkbid0IGJlIGNvbXBhcmVkIGJ5IHJlZ3J0ZXN0LgorICAgIHNhdmVfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgIHN5cy5zdGRvdXQgPSB0ZXN0LnRlc3Rfc3VwcG9ydC5nZXRfb3JpZ2luYWxfc3Rkb3V0KCkKKyAgICB0cnk6CisgICAgICAgIGZpbmRlciA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcih2ZXJib3NlPXZlcmJvc2UsIHJlY3Vyc2U9RmFsc2UpCisgICAgICAgIHJ1bm5lciA9IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgICMgVXNlIHRoZSBvYmplY3QncyBmdWxseSBxdWFsaWZpZWQgbmFtZSBpZiBpdCBoYXMgb25lCisgICAgICAgICMgT3RoZXJ3aXNlLCB1c2UgdGhlIG1vZHVsZSdzIG5hbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9ICIlcy4lcyIgJSAob2JqLl9fbW9kdWxlX18sIG9iai5fX25hbWVfXykKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgbmFtZSA9IG1vZHVsZS5fX25hbWVfXworICAgICAgICBmb3IgZXhhbXBsZSBpbiBmaW5kZXIuZmluZChvYmosIG5hbWUsIG1vZHVsZSk6CisgICAgICAgICAgICBydW5uZXIucnVuKGV4YW1wbGUpCisgICAgICAgIGYsIHQgPSBydW5uZXIuZmFpbHVyZXMsIHJ1bm5lci50cmllcworICAgICAgICBpZiBmOgorICAgICAgICAgICAgcmFpc2UgdGVzdC50ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCgiJWQgb2YgJWQgZG9jdGVzdHMgZmFpbGVkIiAlIChmLCB0KSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnZG9jdGVzdCAoJXMpIC4uLiAlZCB0ZXN0cyB3aXRoIHplcm8gZmFpbHVyZXMnICUgKG1vZHVsZS5fX25hbWVfXywgdCkKKyAgICByZXR1cm4gZiwgdAorCisKKworY2xhc3MgWmlwU3VwcG9ydFRlc3RzKEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlKToKKyAgICAjIFdlIHVzZSB0aGUgSW1wb3J0SG9va3NCYXNlVGVzdENhc2UgdG8gcmVzdG9yZQorICAgICMgdGhlIHN0YXRlIG9mIHRoZSBpbXBvcnQgcmVsYXRlZCBpbmZvcm1hdGlvbgorICAgICMgaW4gdGhlIHN5cyBtb2R1bGUgYWZ0ZXIgZWFjaCB0ZXN0CisgICAgIyBXZSBhbHNvIGNsZWFyIHRoZSBsaW5lY2FjaGUgYW5kIHppcGltcG9ydCBjYWNoZQorICAgICMganVzdCB0byBhdm9pZCBhbnkgYm9ndXMgZXJyb3JzIGR1ZSB0byBuYW1lIHJldXNlIGluIHRoZSB0ZXN0cworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgbGluZWNhY2hlLmNsZWFyY2FjaGUoKQorICAgICAgICB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGUuY2xlYXIoKQorICAgICAgICBJbXBvcnRIb29rc0Jhc2VUZXN0Q2FzZS5zZXRVcChzZWxmKQorCisKKyAgICBkZWYgdGVzdF9pbnNwZWN0X2dldHNvdXJjZV9pc3N1ZTQyMjMoc2VsZik6CisgICAgICAgIHRlc3Rfc3JjID0gImRlZiBmb28oKTogcGFzc1xuIgorICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgZDoKKyAgICAgICAgICAgIGluaXRfbmFtZSA9IG1ha2Vfc2NyaXB0KGQsICdfX2luaXRfXycsIHRlc3Rfc3JjKQorICAgICAgICAgICAgbmFtZV9pbl96aXAgPSBvcy5wYXRoLmpvaW4oJ3ppcF9wa2cnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShpbml0X25hbWUpKQorICAgICAgICAgICAgemlwX25hbWUsIHJ1bl9uYW1lID0gbWFrZV96aXBfc2NyaXB0KGQsICd0ZXN0X3ppcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X25hbWUsIG5hbWVfaW5femlwKQorICAgICAgICAgICAgb3MucmVtb3ZlKGluaXRfbmFtZSkKKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCB6aXBfbmFtZSkKKyAgICAgICAgICAgIGltcG9ydCB6aXBfcGtnCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlKHppcF9wa2cuZm9vKSwgdGVzdF9zcmMpCisKKyAgICBkZWYgdGVzdF9kb2N0ZXN0X2lzc3VlNDE5NyhzZWxmKToKKyAgICAgICAgIyBUbyBhdm9pZCBoYXZpbmcgdG8ga2VlcCB0d28gY29waWVzIG9mIHRoZSBkb2N0ZXN0IG1vZHVsZSdzCisgICAgICAgICMgdW5pdCB0ZXN0cyBpbiBzeW5jLCB0aGlzIHRlc3Qgd29ya3MgYnkgdGFraW5nIHRoZSBzb3VyY2Ugb2YKKyAgICAgICAgIyB0ZXN0X2RvY3Rlc3QgaXRzZWxmLCByZXdyaXRpbmcgaXQgYSBiaXQgdG8gY29wZSB3aXRoIGEgbmV3CisgICAgICAgICMgbG9jYXRpb24sIGFuZCB0aGVuIHRocm93aW5nIGl0IGluIGEgemlwIGZpbGUgdG8gbWFrZSBzdXJlCisgICAgICAgICMgZXZlcnl0aGluZyBzdGlsbCB3b3JrcyBjb3JyZWN0bHkKKyAgICAgICAgdGVzdF9zcmMgPSBpbnNwZWN0LmdldHNvdXJjZSh0ZXN0X2RvY3Rlc3QpCisgICAgICAgIHRlc3Rfc3JjID0gdGVzdF9zcmMucmVwbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X2RvY3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJpbXBvcnQgdGVzdF96aXBwZWRfZG9jdGVzdCBhcyB0ZXN0X2RvY3Rlc3QiKQorICAgICAgICB0ZXN0X3NyYyA9IHRlc3Rfc3JjLnJlcGxhY2UoInRlc3QudGVzdF9kb2N0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3ppcHBlZF9kb2N0ZXN0IikKKyAgICAgICAgdGVzdF9zcmMgPSB0ZXN0X3NyYy5yZXBsYWNlKCJ0ZXN0LnNhbXBsZV9kb2N0ZXN0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGVfemlwcGVkX2RvY3Rlc3QiKQorICAgICAgICAjIFRoZSBzYW1wbGUgZG9jdGVzdCBmaWxlcyByZXdyaXR0ZW4gdG8gaW5jbHVkZSBpbiB0aGUgemlwcGVkIHZlcnNpb24uCisgICAgICAgIHNhbXBsZV9zb3VyY2VzID0ge30KKyAgICAgICAgZm9yIG1vZCBpbiBbc2FtcGxlX2RvY3Rlc3QsIHNhbXBsZV9kb2N0ZXN0X25vX2RvY3Rlc3RzLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVfZG9jdGVzdF9ub19kb2NzdHJpbmdzXToKKyAgICAgICAgICAgIHNyYyA9IGluc3BlY3QuZ2V0c291cmNlKG1vZCkKKyAgICAgICAgICAgIHNyYyA9IHNyYy5yZXBsYWNlKCJ0ZXN0LnRlc3RfZG9jdGVzdCIsICJ0ZXN0X3ppcHBlZF9kb2N0ZXN0IikKKyAgICAgICAgICAgICMgUmV3cml0ZSB0aGUgbW9kdWxlIG5hbWUgc28gdGhhdCwgZm9yIGV4YW1wbGUsCisgICAgICAgICAgICAjICJ0ZXN0LnNhbXBsZV9kb2N0ZXN0IiBiZWNvbWVzICJzYW1wbGVfemlwcGVkX2RvY3Rlc3QiLgorICAgICAgICAgICAgbW9kX25hbWUgPSBtb2QuX19uYW1lX18uc3BsaXQoIi4iKVstMV0KKyAgICAgICAgICAgIG1vZF9uYW1lID0gbW9kX25hbWUucmVwbGFjZSgic2FtcGxlXyIsICJzYW1wbGVfemlwcGVkXyIpCisgICAgICAgICAgICBzYW1wbGVfc291cmNlc1ttb2RfbmFtZV0gPSBzcmMKKworICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgZDoKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gbWFrZV9zY3JpcHQoZCwgJ3Rlc3RfemlwcGVkX2RvY3Rlc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3NyYykKKyAgICAgICAgICAgIHppcF9uYW1lLCBydW5fbmFtZSA9IG1ha2VfemlwX3NjcmlwdChkLCAndGVzdF96aXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X25hbWUpCisgICAgICAgICAgICB6ID0gemlwZmlsZS5aaXBGaWxlKHppcF9uYW1lLCAnYScpCisgICAgICAgICAgICBmb3IgbW9kX25hbWUsIHNyYyBpbiBzYW1wbGVfc291cmNlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIHoud3JpdGVzdHIobW9kX25hbWUgKyAiLnB5Iiwgc3JjKQorICAgICAgICAgICAgei5jbG9zZSgpCisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHppcF9maWxlID0gemlwZmlsZS5aaXBGaWxlKHppcF9uYW1lLCAncicpCisgICAgICAgICAgICAgICAgcHJpbnQgJ0NvbnRlbnRzIG9mICVyOicgJSB6aXBfbmFtZQorICAgICAgICAgICAgICAgIHppcF9maWxlLnByaW50ZGlyKCkKKyAgICAgICAgICAgICAgICB6aXBfZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBvcy5yZW1vdmUoc2NyaXB0X25hbWUpCisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgemlwX25hbWUpCisgICAgICAgICAgICBpbXBvcnQgdGVzdF96aXBwZWRfZG9jdGVzdAorICAgICAgICAgICAgIyBTb21lIG9mIHRoZSBkb2MgdGVzdHMgZGVwZW5kIG9uIHRoZSBjb2xvY2F0ZWQgdGV4dCBmaWxlcworICAgICAgICAgICAgIyB3aGljaCBhcmVuJ3QgYXZhaWxhYmxlIHRvIHRoZSB6aXBwZWQgdmVyc2lvbiAodGhlIGRvY3Rlc3QKKyAgICAgICAgICAgICMgbW9kdWxlIGN1cnJlbnRseSByZXF1aXJlcyByZWFsIGZpbGVuYW1lcyBmb3Igbm9uLWVtYmVkZGVkCisgICAgICAgICAgICAjIHRlc3RzKS4gU28gd2UncmUgZm9yY2VkIHRvIGJlIHNlbGVjdGl2ZSBhYm91dCB3aGljaCB0ZXN0cworICAgICAgICAgICAgIyB0byBydW4uCisgICAgICAgICAgICAjIGRvY3Rlc3QgY291bGQgcmVhbGx5IHVzZSBzb21lIEFQSXMgd2hpY2ggdGFrZSBhIHRleHQKKyAgICAgICAgICAgICMgc3RyaW5nIG9yIGEgZmlsZSBvYmplY3QgaW5zdGVhZCBvZiBhIGZpbGVuYW1lLi4uCisgICAgICAgICAgICBrbm93bl9nb29kX3Rlc3RzID0gWworICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlQ2xhc3MsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVDbGFzcy5OZXN0ZWRDbGFzcywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LlNhbXBsZUNsYXNzLk5lc3RlZENsYXNzLl9faW5pdF9fLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlQ2xhc3MuX19pbml0X18sCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVDbGFzcy5hX2NsYXNzbWV0aG9kLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlQ2xhc3MuYV9wcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LlNhbXBsZUNsYXNzLmFfc3RhdGljbWV0aG9kLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlQ2xhc3MuZG91YmxlLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlQ2xhc3MuZ2V0LAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QuU2FtcGxlTmV3U3R5bGVDbGFzcywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LlNhbXBsZU5ld1N0eWxlQ2xhc3MuX19pbml0X18sCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC5TYW1wbGVOZXdTdHlsZUNsYXNzLmRvdWJsZSwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LlNhbXBsZU5ld1N0eWxlQ2xhc3MuZ2V0LAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3Qub2xkX3Rlc3QxLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3Qub2xkX3Rlc3QyLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3Qub2xkX3Rlc3QzLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3Qub2xkX3Rlc3Q0LAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3Quc2FtcGxlX2Z1bmMsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3QsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3RQYXJzZXIsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3RSdW5uZXIuYmFzaWNzLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF9Eb2NUZXN0UnVubmVyLmV4Y2VwdGlvbnMsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3RSdW5uZXIub3B0aW9uX2RpcmVjdGl2ZXMsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3RSdW5uZXIub3B0aW9uZmxhZ3MsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3RSdW5uZXIudmVyYm9zZV9mbGFnLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF9FeGFtcGxlLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF9kZWJ1ZywKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZSwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfcGRiX3NldF90cmFjZV9uZXN0ZWQsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X3Rlc3Rzb3VyY2UsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X3RyYWlsaW5nX3NwYWNlX2luX3Rlc3QsCisgICAgICAgICAgICAgICAgdGVzdF96aXBwZWRfZG9jdGVzdC50ZXN0X0RvY1Rlc3RTdWl0ZSwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jVGVzdEZpbmRlciwKKyAgICAgICAgICAgIF0KKyAgICAgICAgICAgICMgVGhlc2UgcmVtYWluaW5nIHRlc3RzIGFyZSB0aGUgb25lcyB3aGljaCBuZWVkIGFjY2VzcworICAgICAgICAgICAgIyB0byB0aGUgZGF0YSBmaWxlcywgc28gd2UgZG9uJ3QgcnVuIHRoZW0KKyAgICAgICAgICAgIGZhaWxfZHVlX3RvX21pc3NpbmdfZGF0YV9maWxlcyA9IFsKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfRG9jRmlsZVN1aXRlLAorICAgICAgICAgICAgICAgIHRlc3RfemlwcGVkX2RvY3Rlc3QudGVzdF90ZXN0ZmlsZSwKKyAgICAgICAgICAgICAgICB0ZXN0X3ppcHBlZF9kb2N0ZXN0LnRlc3RfdW5pdHRlc3RfcmVwb3J0ZmxhZ3MsCisgICAgICAgICAgICBdCisgICAgICAgICAgICAjIE5lZWRlZCBmb3IgdGVzdF9Eb2NUZXN0UGFyc2VyIGFuZCB0ZXN0X2RlYnVnCisgICAgICAgICAgICBkZXByZWNhdGlvbnMgPSBbXQorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICMgSWdub3JlIGFsbCB3YXJuaW5ncyBhYm91dCB0aGUgdXNlIG9mIGNsYXNzIFRlc3RlciBpbiB0aGlzIG1vZHVsZS4KKyAgICAgICAgICAgICAgICBkZXByZWNhdGlvbnMuYXBwZW5kKCgiY2xhc3MgVGVzdGVyIGlzIGRlcHJlY2F0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpKQorICAgICAgICAgICAgaWYgc3lzLnB5M2t3YXJuaW5nOgorICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9ucyArPSBbCisgICAgICAgICAgICAgICAgICAgICgiYmFja3F1b3RlIG5vdCBzdXBwb3J0ZWQiLCBTeW50YXhXYXJuaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgKCJleGVjZmlsZS4uIG5vdCBzdXBwb3J0ZWQiLCBEZXByZWNhdGlvbldhcm5pbmcpXQorICAgICAgICAgICAgd2l0aCB0ZXN0LnRlc3Rfc3VwcG9ydC5jaGVja193YXJuaW5ncygqZGVwcmVjYXRpb25zKToKKyAgICAgICAgICAgICAgICBmb3Igb2JqIGluIGtub3duX2dvb2RfdGVzdHM6CisgICAgICAgICAgICAgICAgICAgIF9ydW5fb2JqZWN0X2RvY3Rlc3Qob2JqLCB0ZXN0X3ppcHBlZF9kb2N0ZXN0KQorCisgICAgZGVmIHRlc3RfZG9jdGVzdF9tYWluX2lzc3VlNDE5NyhzZWxmKToKKyAgICAgICAgdGVzdF9zcmMgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXAorICAgICAgICAgICAgICAgICAgICBjbGFzcyBUZXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgIj4+PiAnbGluZSAyJyIKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZG9jdGVzdAorICAgICAgICAgICAgICAgICAgICBkb2N0ZXN0LnRlc3Rtb2QoKQorICAgICAgICAgICAgICAgICAgICAiIiIpCisgICAgICAgIHBhdHRlcm4gPSAnRmlsZSAiJXMiLCBsaW5lIDIsIGluICVzJworICAgICAgICB3aXRoIHRlbXBfZGlyKCkgYXMgZDoKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gbWFrZV9zY3JpcHQoZCwgJ3NjcmlwdCcsIHRlc3Rfc3JjKQorICAgICAgICAgICAgZXhpdF9jb2RlLCBkYXRhID0gcnVuX3B5dGhvbihzY3JpcHRfbmFtZSkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gcGF0dGVybiAlIChzY3JpcHRfbmFtZSwgIl9fbWFpbl9fLlRlc3QiKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiRXhwZWN0ZWQgbGluZSIsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgcHJpbnQgIkdvdCBzdGRvdXQ6IgorICAgICAgICAgICAgICAgIHByaW50IGRhdGEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXhwZWN0ZWQsIGRhdGEpCisgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBtYWtlX3ppcF9zY3JpcHQoZCwgInRlc3RfemlwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdF9uYW1lLCAnX19tYWluX18ucHknKQorICAgICAgICAgICAgZXhpdF9jb2RlLCBkYXRhID0gcnVuX3B5dGhvbih6aXBfbmFtZSkKKyAgICAgICAgICAgIGV4cGVjdGVkID0gcGF0dGVybiAlIChydW5fbmFtZSwgIl9fbWFpbl9fLlRlc3QiKQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiRXhwZWN0ZWQgbGluZSIsIGV4cGVjdGVkCisgICAgICAgICAgICAgICAgcHJpbnQgIkdvdCBzdGRvdXQ6IgorICAgICAgICAgICAgICAgIHByaW50IGRhdGEKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZXhwZWN0ZWQsIGRhdGEpCisKKyAgICBkZWYgdGVzdF9wZGJfaXNzdWU0MjAxKHNlbGYpOgorICAgICAgICB0ZXN0X3NyYyA9IHRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgICAgICAgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHBkYgorICAgICAgICAgICAgICAgICAgICBwZGIucnVuY2FsbChmKQorICAgICAgICAgICAgICAgICAgICAiIiIpCisgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBkOgorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBtYWtlX3NjcmlwdChkLCAnc2NyaXB0JywgdGVzdF9zcmMpCisgICAgICAgICAgICBwID0gc3Bhd25fcHl0aG9uKHNjcmlwdF9uYW1lKQorICAgICAgICAgICAgcC5zdGRpbi53cml0ZSgnbFxuJykKKyAgICAgICAgICAgIGRhdGEgPSBraWxsX3B5dGhvbihwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihzY3JpcHRfbmFtZSwgZGF0YSkKKyAgICAgICAgICAgIHppcF9uYW1lLCBydW5fbmFtZSA9IG1ha2VfemlwX3NjcmlwdChkLCAidGVzdF96aXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X25hbWUsICdfX21haW5fXy5weScpCisgICAgICAgICAgICBwID0gc3Bhd25fcHl0aG9uKHppcF9uYW1lKQorICAgICAgICAgICAgcC5zdGRpbi53cml0ZSgnbFxuJykKKyAgICAgICAgICAgIGRhdGEgPSBraWxsX3B5dGhvbihwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihydW5fbmFtZSwgZGF0YSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFppcFN1cHBvcnRUZXN0cykKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGRiMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNWE3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RfemxpYi5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkZmZkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHkKQEAgLTAsMCArMSw2MDkgQEAKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QsIGltcG9ydF9tb2R1bGUsIHVubGluaywgcmVxdWlyZXMKK2ltcG9ydCBiaW5hc2NpaQoraW1wb3J0IHJhbmRvbQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcHJlY2lzaW9uYmlnbWVtdGVzdCwgXzFHLCBfNEcKK2ltcG9ydCBzeXMKKwordHJ5OgorICAgIGltcG9ydCBtbWFwCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgbW1hcCA9IE5vbmUKKworemxpYiA9IGltcG9ydF9tb2R1bGUoJ3psaWInKQorCisKK2NsYXNzIENoZWNrc3VtVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgY2hlY2tzdW0gdGVzdCBjYXNlcworICAgIGRlZiB0ZXN0X2NyYzMyc3RhcnQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMigiIiksIHpsaWIuY3JjMzIoIiIsIDApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoemxpYi5jcmMzMigiYWJjIiwgMHhmZmZmZmZmZikpCisKKyAgICBkZWYgdGVzdF9jcmMzMmVtcHR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuY3JjMzIoIiIsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuY3JjMzIoIiIsIDEpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuY3JjMzIoIiIsIDQzMiksIDQzMikKKworICAgIGRlZiB0ZXN0X2FkbGVyMzJzdGFydChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmFkbGVyMzIoIiIpLCB6bGliLmFkbGVyMzIoIiIsIDEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoemxpYi5hZGxlcjMyKCJhYmMiLCAweGZmZmZmZmZmKSkKKworICAgIGRlZiB0ZXN0X2FkbGVyMzJlbXB0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmFkbGVyMzIoIiIsIDApLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuYWRsZXIzMigiIiwgMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5hZGxlcjMyKCIiLCA0MzIpLCA0MzIpCisKKyAgICBkZWYgYXNzZXJ0RXF1YWwzMihzZWxmLCBzZWVuLCBleHBlY3RlZCk6CisgICAgICAgICMgMzItYml0IHZhbHVlcyBtYXNrZWQgLS0gY2hlY2tzdW1zIG9uIDMyLSB2cyA2NC0gYml0IG1hY2hpbmVzCisgICAgICAgICMgVGhpcyBpcyBpbXBvcnRhbnQgaWYgYml0IDMxICgweDA4MDAwMDAwTCkgaXMgc2V0LgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlZW4gJiAweDBGRkZGRkZGRkwsIGV4cGVjdGVkICYgMHgwRkZGRkZGRkZMKQorCisgICAgZGVmIHRlc3RfcGVuZ3VpbnMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwzMih6bGliLmNyYzMyKCJwZW5ndWluIiwgMCksIDB4MGU1YzFhMTIwTCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbDMyKHpsaWIuY3JjMzIoInBlbmd1aW4iLCAxKSwgMHg0M2I2YWE5NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbDMyKHpsaWIuYWRsZXIzMigicGVuZ3VpbiIsIDApLCAweDBiY2YwMmY2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsMzIoemxpYi5hZGxlcjMyKCJwZW5ndWluIiwgMSksIDB4MGJkNjAyZjcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmNyYzMyKCJwZW5ndWluIiksIHpsaWIuY3JjMzIoInBlbmd1aW4iLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmFkbGVyMzIoInBlbmd1aW4iKSx6bGliLmFkbGVyMzIoInBlbmd1aW4iLDEpKQorCisgICAgZGVmIHRlc3RfYWJjZGVmZ2hpamtsbW5vcChzZWxmKToKKyAgICAgICAgIiIidGVzdCBpc3N1ZTEyMDIgY29tcGxpYW5jZTogc2lnbmVkIGNyYzMyLCBhZGxlcjMyIGluIDIueCIiIgorICAgICAgICBmb28gPSAnYWJjZGVmZ2hpamtsbW5vcCcKKyAgICAgICAgIyBleHBsaWNpdGx5IHRlc3Qgc2lnbmVkIGJlaGF2aW9yCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMihmb28pLCAtMTgwODA4ODk0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmNyYzMyKCdzcGFtJyksIDExMzg0MjU2NjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5hZGxlcjMyKGZvbytmb28pLCAtNzIxNDE2OTQzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuYWRsZXIzMignc3BhbScpLCA3MjI4NjY0MikKKworICAgIGRlZiB0ZXN0X3NhbWVfYXNfYmluYXNjaWlfY3JjMzIoc2VsZik6CisgICAgICAgIGZvbyA9ICdhYmNkZWZnaGlqa2xtbm9wJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbmFzY2lpLmNyYzMyKGZvbyksIHpsaWIuY3JjMzIoZm9vKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW5hc2NpaS5jcmMzMignc3BhbScpLCB6bGliLmNyYzMyKCdzcGFtJykpCisKKyAgICBkZWYgdGVzdF9uZWdhdGl2ZV9jcmNfaXZfaW5wdXQoc2VsZik6CisgICAgICAgICMgVGhlIHJhbmdlIG9mIHZhbGlkIGlucHV0IHZhbHVlcyBmb3IgdGhlIGNyYyBzdGF0ZSBzaG91bGQgYmUKKyAgICAgICAgIyAtMioqMzEgdGhyb3VnaCAyKiozMi0xIHRvIGFsbG93IGlucHV0cyBhcnRpZmljYWxseSBjb25zdHJhaW5lZAorICAgICAgICAjIHRvIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuY3JjMzIoJ2hhbScsIC0xKSwgemxpYi5jcmMzMignaGFtJywgMHhmZmZmZmZmZkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuY3JjMzIoJ3NwYW0nLCAtMzE0MTU5MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgemxpYi5jcmMzMignc3BhbScsICAweGZmZDAxMDI3TCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5jcmMzMignc3BhbScsIC0oMioqMzEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB6bGliLmNyYzMyKCdzcGFtJywgICgyKiozMSkpKQorCisKK2NsYXNzIEV4Y2VwdGlvblRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIG1ha2Ugc3VyZSB3ZSBnZW5lcmF0ZSBzb21lIGV4cGVjdGVkIGVycm9ycworICAgIGRlZiB0ZXN0X2JhZGxldmVsKHNlbGYpOgorICAgICAgICAjIHNwZWNpZnlpbmcgY29tcHJlc3Npb24gbGV2ZWwgb3V0IG9mIHJhbmdlIGNhdXNlcyBhbiBlcnJvcgorICAgICAgICAjIChidXQgLTEgaXMgWl9ERUZBVUxUX0NPTVBSRVNTSU9OIGFuZCBhcHBhcmVudGx5IHRoZSB6bGliCisgICAgICAgICMgYWNjZXB0cyAwIHRvbykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemxpYi5lcnJvciwgemxpYi5jb21wcmVzcywgJ0VSUk9SJywgMTApCisKKyAgICBkZWYgdGVzdF9iYWRjb21wcmVzc29iaihzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgZmFpbHVyZSBvbiBidWlsZGluZyBjb21wcmVzcyBvYmplY3Qgd2l0aCBiYWQgcGFyYW1zCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHpsaWIuY29tcHJlc3NvYmosIDEsIHpsaWIuREVGTEFURUQsIDApCisgICAgICAgICMgc3BlY2lmeWluZyB0b3RhbCBiaXRzIHRvbyBsYXJnZSBjYXVzZXMgYW4gZXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKKyAgICAgICAgICAgICAgICB6bGliLmNvbXByZXNzb2JqLCAxLCB6bGliLkRFRkxBVEVELCB6bGliLk1BWF9XQklUUyArIDEpCisKKyAgICBkZWYgdGVzdF9iYWRkZWNvbXByZXNzb2JqKHNlbGYpOgorICAgICAgICAjIHZlcmlmeSBmYWlsdXJlIG9uIGJ1aWxkaW5nIGRlY29tcHJlc3Mgb2JqZWN0IHdpdGggYmFkIHBhcmFtcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB6bGliLmRlY29tcHJlc3NvYmosIC0xKQorCisgICAgZGVmIHRlc3RfZGVjb21wcmVzc29ial9iYWRmbHVzaChzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgZmFpbHVyZSBvbiBjYWxsaW5nIGRlY29tcHJlc3NvYmouZmx1c2ggd2l0aCBiYWQgcGFyYW1zCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHpsaWIuZGVjb21wcmVzc29iaigpLmZsdXNoLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB6bGliLmRlY29tcHJlc3NvYmooKS5mbHVzaCwgLTEpCisKKworY2xhc3MgQmFzZUNvbXByZXNzVGVzdENhc2Uob2JqZWN0KToKKyAgICBkZWYgY2hlY2tfYmlnX2NvbXByZXNzX2J1ZmZlcihzZWxmLCBzaXplLCBjb21wcmVzc19mdW5jKToKKyAgICAgICAgXzFNID0gMTAyNCAqIDEwMjQKKyAgICAgICAgZm10ID0gIiUlMCVkeCIgJSAoMiAqIF8xTSkKKyAgICAgICAgIyBHZW5lcmF0ZSAxME1CIHdvcnRoIG9mIHJhbmRvbSwgYW5kIGV4cGFuZCBpdCBieSByZXBlYXRpbmcgaXQuCisgICAgICAgICMgVGhlIGFzc3VtcHRpb24gaXMgdGhhdCB6bGliJ3MgbWVtb3J5IGlzIG5vdCBiaWcgZW5vdWdoIHRvIGV4cGxvaXQKKyAgICAgICAgIyBzdWNoIHNwcmVhZCBvdXQgcmVkdW5kYW5jeS4KKyAgICAgICAgZGF0YSA9ICcnLmpvaW4oW2JpbmFzY2lpLmEyYl9oZXgoZm10ICUgcmFuZG9tLmdldHJhbmRiaXRzKDggKiBfMU0pKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApXSkKKyAgICAgICAgZGF0YSA9IGRhdGEgKiAoc2l6ZSAvLyBsZW4oZGF0YSkgKyAxKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb21wcmVzc19mdW5jKGRhdGEpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAjIFJlbGVhc2UgbWVtb3J5CisgICAgICAgICAgICBkYXRhID0gTm9uZQorCisgICAgZGVmIGNoZWNrX2JpZ19kZWNvbXByZXNzX2J1ZmZlcihzZWxmLCBzaXplLCBkZWNvbXByZXNzX2Z1bmMpOgorICAgICAgICBkYXRhID0gJ3gnICogc2l6ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb21wcmVzc2VkID0gemxpYi5jb21wcmVzcyhkYXRhLCAxKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBSZWxlYXNlIG1lbW9yeQorICAgICAgICAgICAgZGF0YSA9IE5vbmUKKyAgICAgICAgZGF0YSA9IGRlY29tcHJlc3NfZnVuYyhjb21wcmVzc2VkKQorICAgICAgICAjIFNhbml0eSBjaGVjaworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkYXRhKSwgc2l6ZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRhdGEuc3RyaXAoJ3gnKSksIDApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkYXRhID0gTm9uZQorCisKK2NsYXNzIENvbXByZXNzVGVzdENhc2UoQmFzZUNvbXByZXNzVGVzdENhc2UsIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAjIFRlc3QgY29tcHJlc3Npb24gaW4gb25lIGdvICh3aG9sZSBtZXNzYWdlIGNvbXByZXNzaW9uKQorICAgIGRlZiB0ZXN0X3NwZWVjaChzZWxmKToKKyAgICAgICAgeCA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyh4KSwgSEFNTEVUX1NDRU5FKQorCisgICAgZGVmIHRlc3Rfc3BlZWNoMTI4KHNlbGYpOgorICAgICAgICAjIGNvbXByZXNzIG1vcmUgZGF0YQorICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FICogMTI4CisgICAgICAgIHggPSB6bGliLmNvbXByZXNzKGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKHgpLCBkYXRhKQorCisgICAgZGVmIHRlc3RfaW5jb21wbGV0ZV9zdHJlYW0oc2VsZik6CisgICAgICAgICMgQW4gdXNlZnVsIGVycm9yIG1lc3NhZ2UgaXMgZ2l2ZW4KKyAgICAgICAgeCA9IHpsaWIuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCh6bGliLmVycm9yLAorICAgICAgICAgICAgIkVycm9yIC01IHdoaWxlIGRlY29tcHJlc3NpbmcgZGF0YTogaW5jb21wbGV0ZSBvciB0cnVuY2F0ZWQgc3RyZWFtIiwKKyAgICAgICAgICAgIHpsaWIuZGVjb21wcmVzcywgeFs6LTFdKQorCisgICAgIyBNZW1vcnkgdXNlIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRha2VzIGludG8gYWNjb3VudCBvdmVyYWxsb2NhdGlvbgorCisgICAgQHByZWNpc2lvbmJpZ21lbXRlc3Qoc2l6ZT1fMUcgKyAxMDI0ICogMTAyNCwgbWVtdXNlPTMpCisgICAgZGVmIHRlc3RfYmlnX2NvbXByZXNzX2J1ZmZlcihzZWxmLCBzaXplKToKKyAgICAgICAgY29tcHJlc3MgPSBsYW1iZGEgczogemxpYi5jb21wcmVzcyhzLCAxKQorICAgICAgICBzZWxmLmNoZWNrX2JpZ19jb21wcmVzc19idWZmZXIoc2l6ZSwgY29tcHJlc3MpCisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV8xRyArIDEwMjQgKiAxMDI0LCBtZW11c2U9MikKKyAgICBkZWYgdGVzdF9iaWdfZGVjb21wcmVzc19idWZmZXIoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYuY2hlY2tfYmlnX2RlY29tcHJlc3NfYnVmZmVyKHNpemUsIHpsaWIuZGVjb21wcmVzcykKKworCitjbGFzcyBDb21wcmVzc09iamVjdFRlc3RDYXNlKEJhc2VDb21wcmVzc1Rlc3RDYXNlLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUZXN0IGNvbXByZXNzaW9uIG9iamVjdAorICAgIGRlZiB0ZXN0X3BhaXIoc2VsZik6CisgICAgICAgICMgc3RyYWlnaHRmb3J3YXJkIGNvbXByZXNzL2RlY29tcHJlc3Mgb2JqZWN0cworICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FICogMTI4CisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgIHgxID0gY28uY29tcHJlc3MoZGF0YSkKKyAgICAgICAgeDIgPSBjby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHpsaWIuZXJyb3IsIGNvLmZsdXNoKSAjIHNlY29uZCBmbHVzaCBzaG91bGQgbm90IHdvcmsKKyAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgeTEgPSBkY28uZGVjb21wcmVzcyh4MSArIHgyKQorICAgICAgICB5MiA9IGRjby5mbHVzaCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgeTEgKyB5MikKKworICAgIGRlZiB0ZXN0X2NvbXByZXNzb3B0aW9ucyhzZWxmKToKKyAgICAgICAgIyBzcGVjaWZ5IGxvdHMgb2Ygb3B0aW9ucyB0byBjb21wcmVzc29iaigpCisgICAgICAgIGxldmVsID0gMgorICAgICAgICBtZXRob2QgPSB6bGliLkRFRkxBVEVECisgICAgICAgIHdiaXRzID0gLTEyCisgICAgICAgIG1lbWxldmVsID0gOQorICAgICAgICBzdHJhdGVneSA9IHpsaWIuWl9GSUxURVJFRAorICAgICAgICBjbyA9IHpsaWIuY29tcHJlc3NvYmoobGV2ZWwsIG1ldGhvZCwgd2JpdHMsIG1lbWxldmVsLCBzdHJhdGVneSkKKyAgICAgICAgeDEgPSBjby5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCisgICAgICAgIHgyID0gY28uZmx1c2goKQorICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmood2JpdHMpCisgICAgICAgIHkxID0gZGNvLmRlY29tcHJlc3MoeDEgKyB4MikKKyAgICAgICAgeTIgPSBkY28uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhBTUxFVF9TQ0VORSwgeTEgKyB5MikKKworICAgIGRlZiB0ZXN0X2NvbXByZXNzaW5jcmVtZW50YWwoc2VsZik6CisgICAgICAgICMgY29tcHJlc3Mgb2JqZWN0IGluIHN0ZXBzLCBkZWNvbXByZXNzIG9iamVjdCBhcyBvbmUtc2hvdAorICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FICogMTI4CisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgIGJ1ZnMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSksIDI1Nik6CisgICAgICAgICAgICBidWZzLmFwcGVuZChjby5jb21wcmVzcyhkYXRhW2k6aSsyNTZdKSkKKyAgICAgICAgYnVmcy5hcHBlbmQoY28uZmx1c2goKSkKKyAgICAgICAgY29tYnVmID0gJycuam9pbihidWZzKQorCisgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIHkxID0gZGNvLmRlY29tcHJlc3MoJycuam9pbihidWZzKSkKKyAgICAgICAgeTIgPSBkY28uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHkxICsgeTIpCisKKyAgICBkZWYgdGVzdF9kZWNvbXBpbmMoc2VsZiwgZmx1c2g9RmFsc2UsIHNvdXJjZT1Ob25lLCBjeD0yNTYsIGRjeD02NCk6CisgICAgICAgICMgY29tcHJlc3Mgb2JqZWN0IGluIHN0ZXBzLCBkZWNvbXByZXNzIG9iamVjdCBpbiBzdGVwcworICAgICAgICBzb3VyY2UgPSBzb3VyY2Ugb3IgSEFNTEVUX1NDRU5FCisgICAgICAgIGRhdGEgPSBzb3VyY2UgKiAxMjgKKyAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKCkKKyAgICAgICAgYnVmcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihkYXRhKSwgY3gpOgorICAgICAgICAgICAgYnVmcy5hcHBlbmQoY28uY29tcHJlc3MoZGF0YVtpOmkrY3hdKSkKKyAgICAgICAgYnVmcy5hcHBlbmQoY28uZmx1c2goKSkKKyAgICAgICAgY29tYnVmID0gJycuam9pbihidWZzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgemxpYi5kZWNvbXByZXNzKGNvbWJ1ZikpCisKKyAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgYnVmcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihjb21idWYpLCBkY3gpOgorICAgICAgICAgICAgYnVmcy5hcHBlbmQoZGNvLmRlY29tcHJlc3MoY29tYnVmW2k6aStkY3hdKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIGRjby51bmNvbnN1bWVkX3RhaWwsICMjIyMjIyMjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoQSkgdWN0IHNob3VsZCBiZSAnJzogbm90ICVkIGxvbmciICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbihkY28udW5jb25zdW1lZF90YWlsKSkKKyAgICAgICAgaWYgZmx1c2g6CisgICAgICAgICAgICBidWZzLmFwcGVuZChkY28uZmx1c2goKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgY2h1bmsgPSBkY28uZGVjb21wcmVzcygnJykKKyAgICAgICAgICAgICAgICBpZiBjaHVuazoKKyAgICAgICAgICAgICAgICAgICAgYnVmcy5hcHBlbmQoY2h1bmspCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgZGNvLnVuY29uc3VtZWRfdGFpbCwgIyMjIyMjIyMKKyAgICAgICAgICAgICAgICAgICAgICAgICAiKEIpIHVjdCBzaG91bGQgYmUgJyc6IG5vdCAlZCBsb25nIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oZGNvLnVuY29uc3VtZWRfdGFpbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbihidWZzKSkKKyAgICAgICAgIyBGYWlsdXJlIG1lYW5zOiAiZGVjb21wcmVzc29iaiB3aXRoIGluaXQgb3B0aW9ucyBmYWlsZWQiCisKKyAgICBkZWYgdGVzdF9kZWNvbXBpbmNmbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi50ZXN0X2RlY29tcGluYyhmbHVzaD1UcnVlKQorCisgICAgZGVmIHRlc3RfZGVjb21waW1heChzZWxmLCBzb3VyY2U9Tm9uZSwgY3g9MjU2LCBkY3g9NjQpOgorICAgICAgICAjIGNvbXByZXNzIGluIHN0ZXBzLCBkZWNvbXByZXNzIGluIGxlbmd0aC1yZXN0cmljdGVkIHN0ZXBzCisgICAgICAgIHNvdXJjZSA9IHNvdXJjZSBvciBIQU1MRVRfU0NFTkUKKyAgICAgICAgIyBDaGVjayBhIGRlY29tcHJlc3Npb24gb2JqZWN0IHdpdGggbWF4X2xlbmd0aCBzcGVjaWZpZWQKKyAgICAgICAgZGF0YSA9IHNvdXJjZSAqIDEyOAorICAgICAgICBjbyA9IHpsaWIuY29tcHJlc3NvYmooKQorICAgICAgICBidWZzID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGRhdGEpLCBjeCk6CisgICAgICAgICAgICBidWZzLmFwcGVuZChjby5jb21wcmVzcyhkYXRhW2k6aStjeF0pKQorICAgICAgICBidWZzLmFwcGVuZChjby5mbHVzaCgpKQorICAgICAgICBjb21idWYgPSAnJy5qb2luKGJ1ZnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgemxpYi5kZWNvbXByZXNzKGNvbWJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbXByZXNzZWQgZGF0YSBmYWlsdXJlJykKKworICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBidWZzID0gW10KKyAgICAgICAgY2IgPSBjb21idWYKKyAgICAgICAgd2hpbGUgY2I6CisgICAgICAgICAgICAjbWF4X2xlbmd0aCA9IDEgKyBsZW4oY2IpLy8xMAorICAgICAgICAgICAgY2h1bmsgPSBkY28uZGVjb21wcmVzcyhjYiwgZGN4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oY2h1bmspID4gZGN4LAorICAgICAgICAgICAgICAgICAgICAnY2h1bmsgdG9vIGJpZyAoJWQ+JWQpJyAlIChsZW4oY2h1bmspLCBkY3gpKQorICAgICAgICAgICAgYnVmcy5hcHBlbmQoY2h1bmspCisgICAgICAgICAgICBjYiA9IGRjby51bmNvbnN1bWVkX3RhaWwKKyAgICAgICAgYnVmcy5hcHBlbmQoZGNvLmZsdXNoKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbihidWZzKSwgJ1dyb25nIGRhdGEgcmV0cmlldmVkJykKKworICAgIGRlZiB0ZXN0X2RlY29tcHJlc3NtYXhsZW4oc2VsZiwgZmx1c2g9RmFsc2UpOgorICAgICAgICAjIENoZWNrIGEgZGVjb21wcmVzc2lvbiBvYmplY3Qgd2l0aCBtYXhfbGVuZ3RoIHNwZWNpZmllZAorICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FICogMTI4CisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaigpCisgICAgICAgIGJ1ZnMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSksIDI1Nik6CisgICAgICAgICAgICBidWZzLmFwcGVuZChjby5jb21wcmVzcyhkYXRhW2k6aSsyNTZdKSkKKyAgICAgICAgYnVmcy5hcHBlbmQoY28uZmx1c2goKSkKKyAgICAgICAgY29tYnVmID0gJycuam9pbihidWZzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHpsaWIuZGVjb21wcmVzcyhjb21idWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wcmVzc2VkIGRhdGEgZmFpbHVyZScpCisKKyAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgYnVmcyA9IFtdCisgICAgICAgIGNiID0gY29tYnVmCisgICAgICAgIHdoaWxlIGNiOgorICAgICAgICAgICAgbWF4X2xlbmd0aCA9IDEgKyBsZW4oY2IpLy8xMAorICAgICAgICAgICAgY2h1bmsgPSBkY28uZGVjb21wcmVzcyhjYiwgbWF4X2xlbmd0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKGNodW5rKSA+IG1heF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmsgdG9vIGJpZyAoJWQ+JWQpJyAlIChsZW4oY2h1bmspLG1heF9sZW5ndGgpKQorICAgICAgICAgICAgYnVmcy5hcHBlbmQoY2h1bmspCisgICAgICAgICAgICBjYiA9IGRjby51bmNvbnN1bWVkX3RhaWwKKyAgICAgICAgaWYgZmx1c2g6CisgICAgICAgICAgICBidWZzLmFwcGVuZChkY28uZmx1c2goKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdoaWxlIGNodW5rOgorICAgICAgICAgICAgICAgIGNodW5rID0gZGNvLmRlY29tcHJlc3MoJycsIG1heF9sZW5ndGgpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oY2h1bmspID4gbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmsgdG9vIGJpZyAoJWQ+JWQpJyAlIChsZW4oY2h1bmspLG1heF9sZW5ndGgpKQorICAgICAgICAgICAgICAgIGJ1ZnMuYXBwZW5kKGNodW5rKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsICcnLmpvaW4oYnVmcyksICdXcm9uZyBkYXRhIHJldHJpZXZlZCcpCisKKyAgICBkZWYgdGVzdF9kZWNvbXByZXNzbWF4bGVuZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9kZWNvbXByZXNzbWF4bGVuKGZsdXNoPVRydWUpCisKKyAgICBkZWYgdGVzdF9tYXhsZW5taXNjKHNlbGYpOgorICAgICAgICAjIE1pc2MgdGVzdHMgb2YgbWF4X2xlbmd0aAorICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkY28uZGVjb21wcmVzcywgIiIsIC0xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBkY28udW5jb25zdW1lZF90YWlsKQorCisgICAgZGVmIHRlc3RfY2xlYXJfdW5jb25zdW1lZF90YWlsKHNlbGYpOgorICAgICAgICAjIElzc3VlICMxMjA1MDogY2FsbGluZyBkZWNvbXByZXNzKCkgd2l0aG91dCBwcm92aWRpbmcgbWF4X2xlbmd0aAorICAgICAgICAjIHNob3VsZCBjbGVhciB0aGUgdW5jb25zdW1lZF90YWlsIGF0dHJpYnV0ZS4KKyAgICAgICAgY2RhdGEgPSAieFx4OWNLTEpceDA2XHgwMFx4MDJNXHgwMSIgICAgICMgImFiYyIKKyAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgZGRhdGEgPSBkY28uZGVjb21wcmVzcyhjZGF0YSwgMSkKKyAgICAgICAgZGRhdGEgKz0gZGNvLmRlY29tcHJlc3MoZGNvLnVuY29uc3VtZWRfdGFpbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY28udW5jb25zdW1lZF90YWlsLCAiIikKKworICAgIGRlZiB0ZXN0X2ZsdXNoZXMoc2VsZik6CisgICAgICAgICMgVGVzdCBmbHVzaCgpIHdpdGggdGhlIHZhcmlvdXMgb3B0aW9ucywgdXNpbmcgYWxsIHRoZQorICAgICAgICAjIGRpZmZlcmVudCBsZXZlbHMgaW4gb3JkZXIgdG8gcHJvdmlkZSBtb3JlIHZhcmlhdGlvbnMuCisgICAgICAgIHN5bmNfb3B0ID0gWydaX05PX0ZMVVNIJywgJ1pfU1lOQ19GTFVTSCcsICdaX0ZVTExfRkxVU0gnXQorICAgICAgICBzeW5jX29wdCA9IFtnZXRhdHRyKHpsaWIsIG9wdCkgZm9yIG9wdCBpbiBzeW5jX29wdAorICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHpsaWIsIG9wdCldCisgICAgICAgIGRhdGEgPSBIQU1MRVRfU0NFTkUgKiA4CisKKyAgICAgICAgZm9yIHN5bmMgaW4gc3luY19vcHQ6CisgICAgICAgICAgICBmb3IgbGV2ZWwgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgICAgIG9iaiA9IHpsaWIuY29tcHJlc3NvYmooIGxldmVsICkKKyAgICAgICAgICAgICAgICBhID0gb2JqLmNvbXByZXNzKCBkYXRhWzozMDAwXSApCisgICAgICAgICAgICAgICAgYiA9IG9iai5mbHVzaCggc3luYyApCisgICAgICAgICAgICAgICAgYyA9IG9iai5jb21wcmVzcyggZGF0YVszMDAwOl0gKQorICAgICAgICAgICAgICAgIGQgPSBvYmouZmx1c2goKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5kZWNvbXByZXNzKCcnLmpvaW4oW2EsYixjLGRdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCAoIkRlY29tcHJlc3MgZmFpbGVkOiBmbHVzaCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vZGU9JWksIGxldmVsPSVpIikgJSAoc3luYywgbGV2ZWwpKQorICAgICAgICAgICAgICAgIGRlbCBvYmoKKworICAgIGRlZiB0ZXN0X29kZF9mbHVzaChzZWxmKToKKyAgICAgICAgIyBUZXN0IGZvciBvZGQgZmx1c2hpbmcgYnVncyBub3RlZCBpbiAyLjAsIGFuZCBob3BlZnVsbHkgZml4ZWQgaW4gMi4xCisgICAgICAgIGltcG9ydCByYW5kb20KKworICAgICAgICBpZiBoYXNhdHRyKHpsaWIsICdaX1NZTkNfRkxVU0gnKToKKyAgICAgICAgICAgICMgVGVzdGluZyBvbiAxN0sgb2YgInJhbmRvbSIgZGF0YQorCisgICAgICAgICAgICAjIENyZWF0ZSBjb21wcmVzc29yIGFuZCBkZWNvbXByZXNzb3Igb2JqZWN0cworICAgICAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9CRVNUX0NPTVBSRVNTSU9OKQorICAgICAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKworICAgICAgICAgICAgIyBUcnkgMTdLIG9mIGRhdGEKKyAgICAgICAgICAgICMgZ2VuZXJhdGUgcmFuZG9tIGRhdGEgc3RyZWFtCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBJbiAyLjMgYW5kIGxhdGVyLCBXaWNobWFubkhpbGwgaXMgdGhlIFJORyBvZiB0aGUgYnVnIHJlcG9ydAorICAgICAgICAgICAgICAgIGdlbiA9IHJhbmRvbS5XaWNobWFubkhpbGwoKQorICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgIyAyLjIgY2FsbGVkIGl0IFJhbmRvbQorICAgICAgICAgICAgICAgICAgICBnZW4gPSByYW5kb20uUmFuZG9tKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgb3RoZXJzIG1pZ2h0IHNpbXBseSBoYXZlIGEgc2luZ2xlIFJORworICAgICAgICAgICAgICAgICAgICBnZW4gPSByYW5kb20KKyAgICAgICAgICAgIGdlbi5zZWVkKDEpCisgICAgICAgICAgICBkYXRhID0gZ2VuYmxvY2soMSwgMTcgKiAxMDI0LCBnZW5lcmF0b3I9Z2VuKQorCisgICAgICAgICAgICAjIGNvbXByZXNzLCBzeW5jLWZsdXNoLCBhbmQgZGVjb21wcmVzcworICAgICAgICAgICAgZmlyc3QgPSBjby5jb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgc2Vjb25kID0gY28uZmx1c2goemxpYi5aX1NZTkNfRkxVU0gpCisgICAgICAgICAgICBleHBhbmRlZCA9IGRjby5kZWNvbXByZXNzKGZpcnN0ICsgc2Vjb25kKQorCisgICAgICAgICAgICAjIGlmIGRlY29tcHJlc3NlZCBkYXRhIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBpbnB1dCBkYXRhLCBjaG9rZS4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwYW5kZWQsIGRhdGEsICIxN0sgcmFuZG9tIHNvdXJjZSBkb2Vzbid0IG1hdGNoIikKKworICAgIGRlZiB0ZXN0X2VtcHR5X2ZsdXNoKHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBjYWxsaW5nIC5mbHVzaCgpIG9uIHVudXNlZCBvYmplY3RzIHdvcmtzLgorICAgICAgICAjIChCdWcgIzEwODMxMTAgLS0gY2FsbGluZyAuZmx1c2goKSBvbiBkZWNvbXByZXNzIG9iamVjdHMKKyAgICAgICAgIyBjYXVzZWQgYSBjb3JlIGR1bXAuKQorCisgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfQkVTVF9DT01QUkVTU0lPTikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvLmZsdXNoKCkpICAjIFJldHVybnMgYSB6bGliIGhlYWRlcgorICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby5mbHVzaCgpLCAiIikgIyBSZXR1cm5zIG5vdGhpbmcKKworICAgIGRlZiB0ZXN0X2RlY29tcHJlc3NfaW5jb21wbGV0ZV9zdHJlYW0oc2VsZik6CisgICAgICAgICMgVGhpcyBpcyAnZm9vJywgZGVmbGF0ZWQKKyAgICAgICAgeCA9ICd4XHg5Y0tceGNiXHhjZlx4MDdceDAwXHgwMlx4ODJceDAxRScKKyAgICAgICAgIyBGb3IgdGhlIHJlY29yZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyh4KSwgJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHpsaWIuZXJyb3IsIHpsaWIuZGVjb21wcmVzcywgeFs6LTVdKQorICAgICAgICAjIE9taXR0aW5nIHRoZSBzdHJlYW0gZW5kIHdvcmtzIHdpdGggZGVjb21wcmVzc29yIG9iamVjdHMKKyAgICAgICAgIyAoc2VlIGlzc3VlICM4NjcyKS4KKyAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgeSA9IGRjby5kZWNvbXByZXNzKHhbOi01XSkKKyAgICAgICAgeSArPSBkY28uZmx1c2goKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksICdmb28nKQorCisgICAgZGVmIHRlc3RfZmx1c2hfd2l0aF9mcmVlZF9pbnB1dChzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAjMTY0MTE6IGRlY29tcHJlc3NvciBhY2Nlc3NlcyBpbnB1dCB0byBsYXN0IGRlY29tcHJlc3MoKSBjYWxsCisgICAgICAgICMgaW4gZmx1c2goKSwgZXZlbiBpZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBmcmVlZCBpbiB0aGUgbWVhbndoaWxlLgorICAgICAgICBpbnB1dDEgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCisgICAgICAgIGlucHV0MiA9ICdRV0VSVFlVSU9QQVNERkdISktMWlhDVkJOTScKKyAgICAgICAgZGF0YSA9IHpsaWIuY29tcHJlc3MoaW5wdXQxKQorICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICBkY28uZGVjb21wcmVzcyhkYXRhLCAxKQorICAgICAgICBkZWwgZGF0YQorICAgICAgICBkYXRhID0gemxpYi5jb21wcmVzcyhpbnB1dDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLmZsdXNoKCksIGlucHV0MVsxOl0pCisKKyAgICBpZiBoYXNhdHRyKHpsaWIuY29tcHJlc3NvYmooKSwgImNvcHkiKToKKyAgICAgICAgZGVmIHRlc3RfY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QKKyAgICAgICAgICAgIGRhdGEwID0gSEFNTEVUX1NDRU5FCisgICAgICAgICAgICBkYXRhMSA9IEhBTUxFVF9TQ0VORS5zd2FwY2FzZSgpCisgICAgICAgICAgICBjMCA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0JFU1RfQ09NUFJFU1NJT04pCisgICAgICAgICAgICBidWZzMCA9IFtdCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoYzAuY29tcHJlc3MoZGF0YTApKQorCisgICAgICAgICAgICBjMSA9IGMwLmNvcHkoKQorICAgICAgICAgICAgYnVmczEgPSBidWZzMFs6XQorCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoYzAuY29tcHJlc3MoZGF0YTApKQorICAgICAgICAgICAgYnVmczAuYXBwZW5kKGMwLmZsdXNoKCkpCisgICAgICAgICAgICBzMCA9ICcnLmpvaW4oYnVmczApCisKKyAgICAgICAgICAgIGJ1ZnMxLmFwcGVuZChjMS5jb21wcmVzcyhkYXRhMSkpCisgICAgICAgICAgICBidWZzMS5hcHBlbmQoYzEuZmx1c2goKSkKKyAgICAgICAgICAgIHMxID0gJycuam9pbihidWZzMSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczApLGRhdGEwK2RhdGEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczEpLGRhdGEwK2RhdGExKQorCisgICAgICAgIGRlZiB0ZXN0X2JhZGNvbXByZXNzY29weShzZWxmKToKKyAgICAgICAgICAgICMgVGVzdCBjb3B5aW5nIGEgY29tcHJlc3Npb24gb2JqZWN0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZQorICAgICAgICAgICAgYyA9IHpsaWIuY29tcHJlc3NvYmooKQorICAgICAgICAgICAgYy5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCisgICAgICAgICAgICBjLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGMuY29weSkKKworICAgIGRlZiB0ZXN0X2RlY29tcHJlc3NfdW51c2VkX2RhdGEoc2VsZik6CisgICAgICAgICMgUmVwZWF0ZWQgY2FsbHMgdG8gZGVjb21wcmVzcygpIGFmdGVyIEVPRiBzaG91bGQgYWNjdW11bGF0ZSBkYXRhIGluCisgICAgICAgICMgZGNvLnVudXNlZF9kYXRhLCBpbnN0ZWFkIG9mIGp1c3Qgc3RvcmluZyB0aGUgYXJnIHRvIHRoZSBsYXN0IGNhbGwuCisgICAgICAgIHNvdXJjZSA9IGInYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCisgICAgICAgIHJlbWFpbmRlciA9IGInMDEyMzQ1Njc4OScKKyAgICAgICAgeSA9IHpsaWIuY29tcHJlc3Moc291cmNlKQorICAgICAgICB4ID0geSArIHJlbWFpbmRlcgorICAgICAgICBmb3IgbWF4bGVuIGluIDAsIDEwMDA6CisgICAgICAgICAgICBmb3Igc3RlcCBpbiAxLCAyLCBsZW4oeSksIGxlbih4KToKKyAgICAgICAgICAgICAgICBkY28gPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICAgICAgICAgIGRhdGEgPSBiJycKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oeCksIHN0ZXApOgorICAgICAgICAgICAgICAgICAgICBpZiBpIDwgbGVuKHkpOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY28udW51c2VkX2RhdGEsIGInJykKKyAgICAgICAgICAgICAgICAgICAgaWYgbWF4bGVuID09IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IGRjby5kZWNvbXByZXNzKHhbaSA6IGkgKyBzdGVwXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLnVuY29uc3VtZWRfdGFpbCwgYicnKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBkY28uZGVjb21wcmVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNvLnVuY29uc3VtZWRfdGFpbCArIHhbaSA6IGkgKyBzdGVwXSwgbWF4bGVuKQorICAgICAgICAgICAgICAgIGRhdGEgKz0gZGNvLmZsdXNoKCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGEsIHNvdXJjZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby51bmNvbnN1bWVkX3RhaWwsIGInJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRjby51bnVzZWRfZGF0YSwgcmVtYWluZGVyKQorCisgICAgaWYgaGFzYXR0cih6bGliLmRlY29tcHJlc3NvYmooKSwgImNvcHkiKToKKyAgICAgICAgZGVmIHRlc3RfZGVjb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICAgICAjIFRlc3QgY29weWluZyBhIGRlY29tcHJlc3Npb24gb2JqZWN0CisgICAgICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FCisgICAgICAgICAgICBjb21wID0gemxpYi5jb21wcmVzcyhkYXRhKQorCisgICAgICAgICAgICBkMCA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgICAgICBidWZzMCA9IFtdCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzozMl0pKQorCisgICAgICAgICAgICBkMSA9IGQwLmNvcHkoKQorICAgICAgICAgICAgYnVmczEgPSBidWZzMFs6XQorCisgICAgICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzMyOl0pKQorICAgICAgICAgICAgczAgPSAnJy5qb2luKGJ1ZnMwKQorCisgICAgICAgICAgICBidWZzMS5hcHBlbmQoZDEuZGVjb21wcmVzcyhjb21wWzMyOl0pKQorICAgICAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLHMxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxkYXRhKQorCisgICAgICAgIGRlZiB0ZXN0X2JhZGRlY29tcHJlc3Njb3B5KHNlbGYpOgorICAgICAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBjb21wcmVzc2lvbiBvYmplY3QgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlCisgICAgICAgICAgICBkYXRhID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCisgICAgICAgICAgICBkID0gemxpYi5kZWNvbXByZXNzb2JqKCkKKyAgICAgICAgICAgIGQuZGVjb21wcmVzcyhkYXRhKQorICAgICAgICAgICAgZC5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBkLmNvcHkpCisKKyAgICAjIE1lbW9yeSB1c2Ugb2YgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdGFrZXMgaW50byBhY2NvdW50IG92ZXJhbGxvY2F0aW9uCisKKyAgICBAcHJlY2lzaW9uYmlnbWVtdGVzdChzaXplPV8xRyArIDEwMjQgKiAxMDI0LCBtZW11c2U9MykKKyAgICBkZWYgdGVzdF9iaWdfY29tcHJlc3NfYnVmZmVyKHNlbGYsIHNpemUpOgorICAgICAgICBjID0gemxpYi5jb21wcmVzc29iaigxKQorICAgICAgICBjb21wcmVzcyA9IGxhbWJkYSBzOiBjLmNvbXByZXNzKHMpICsgYy5mbHVzaCgpCisgICAgICAgIHNlbGYuY2hlY2tfYmlnX2NvbXByZXNzX2J1ZmZlcihzaXplLCBjb21wcmVzcykKKworICAgIEBwcmVjaXNpb25iaWdtZW10ZXN0KHNpemU9XzFHICsgMTAyNCAqIDEwMjQsIG1lbXVzZT0yKQorICAgIGRlZiB0ZXN0X2JpZ19kZWNvbXByZXNzX2J1ZmZlcihzZWxmLCBzaXplKToKKyAgICAgICAgZCA9IHpsaWIuZGVjb21wcmVzc29iaigpCisgICAgICAgIGRlY29tcHJlc3MgPSBsYW1iZGEgczogZC5kZWNvbXByZXNzKHMpICsgZC5mbHVzaCgpCisgICAgICAgIHNlbGYuY2hlY2tfYmlnX2RlY29tcHJlc3NfYnVmZmVyKHNpemUsIGRlY29tcHJlc3MpCisKKworZGVmIGdlbmJsb2NrKHNlZWQsIGxlbmd0aCwgc3RlcD0xMDI0LCBnZW5lcmF0b3I9cmFuZG9tKToKKyAgICAiIiJsZW5ndGgtYnl0ZSBzdHJlYW0gb2YgcmFuZG9tIGRhdGEgZnJvbSBhIHNlZWQgKGluIHN0ZXAtYnl0ZSBibG9ja3MpLiIiIgorICAgIGlmIHNlZWQgaXMgbm90IE5vbmU6CisgICAgICAgIGdlbmVyYXRvci5zZWVkKHNlZWQpCisgICAgcmFuZGludCA9IGdlbmVyYXRvci5yYW5kaW50CisgICAgaWYgbGVuZ3RoIDwgc3RlcCBvciBzdGVwIDwgMjoKKyAgICAgICAgc3RlcCA9IGxlbmd0aAorICAgIGJsb2NrcyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuZ3RoLCBzdGVwKToKKyAgICAgICAgYmxvY2tzLmFwcGVuZCgnJy5qb2luKFtjaHIocmFuZGludCgwLDI1NSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHggaW4gcmFuZ2Uoc3RlcCldKSkKKyAgICByZXR1cm4gJycuam9pbihibG9ja3MpWzpsZW5ndGhdCisKKworCitkZWYgY2hvb3NlX2xpbmVzKHNvdXJjZSwgbnVtYmVyLCBzZWVkPU5vbmUsIGdlbmVyYXRvcj1yYW5kb20pOgorICAgICIiIlJldHVybiBhIGxpc3Qgb2YgbnVtYmVyIGxpbmVzIHJhbmRvbWx5IGNob3NlbiBmcm9tIHRoZSBzb3VyY2UiIiIKKyAgICBpZiBzZWVkIGlzIG5vdCBOb25lOgorICAgICAgICBnZW5lcmF0b3Iuc2VlZChzZWVkKQorICAgIHNvdXJjZXMgPSBzb3VyY2Uuc3BsaXQoJ1xuJykKKyAgICByZXR1cm4gW2dlbmVyYXRvci5jaG9pY2Uoc291cmNlcykgZm9yIG4gaW4gcmFuZ2UobnVtYmVyKV0KKworCisKK0hBTUxFVF9TQ0VORSA9ICIiIgorTEFFUlRFUworCisgICAgICAgTywgZmVhciBtZSBub3QuCisgICAgICAgSSBzdGF5IHRvbyBsb25nOiBidXQgaGVyZSBteSBmYXRoZXIgY29tZXMuCisKKyAgICAgICBFbnRlciBQT0xPTklVUworCisgICAgICAgQSBkb3VibGUgYmxlc3NpbmcgaXMgYSBkb3VibGUgZ3JhY2UsCisgICAgICAgT2NjYXNpb24gc21pbGVzIHVwb24gYSBzZWNvbmQgbGVhdmUuCisKK0xPUkQgUE9MT05JVVMKKworICAgICAgIFlldCBoZXJlLCBMYWVydGVzISBhYm9hcmQsIGFib2FyZCwgZm9yIHNoYW1lIQorICAgICAgIFRoZSB3aW5kIHNpdHMgaW4gdGhlIHNob3VsZGVyIG9mIHlvdXIgc2FpbCwKKyAgICAgICBBbmQgeW91IGFyZSBzdGF5J2QgZm9yLiBUaGVyZTsgbXkgYmxlc3Npbmcgd2l0aCB0aGVlIQorICAgICAgIEFuZCB0aGVzZSBmZXcgcHJlY2VwdHMgaW4gdGh5IG1lbW9yeQorICAgICAgIFNlZSB0aG91IGNoYXJhY3Rlci4gR2l2ZSB0aHkgdGhvdWdodHMgbm8gdG9uZ3VlLAorICAgICAgIE5vciBhbnkgdW5wcm9wb3J0aW9uZWQgdGhvdWdodCBoaXMgYWN0LgorICAgICAgIEJlIHRob3UgZmFtaWxpYXIsIGJ1dCBieSBubyBtZWFucyB2dWxnYXIuCisgICAgICAgVGhvc2UgZnJpZW5kcyB0aG91IGhhc3QsIGFuZCB0aGVpciBhZG9wdGlvbiB0cmllZCwKKyAgICAgICBHcmFwcGxlIHRoZW0gdG8gdGh5IHNvdWwgd2l0aCBob29wcyBvZiBzdGVlbDsKKyAgICAgICBCdXQgZG8gbm90IGR1bGwgdGh5IHBhbG0gd2l0aCBlbnRlcnRhaW5tZW50CisgICAgICAgT2YgZWFjaCBuZXctaGF0Y2gnZCwgdW5mbGVkZ2VkIGNvbXJhZGUuIEJld2FyZQorICAgICAgIE9mIGVudHJhbmNlIHRvIGEgcXVhcnJlbCwgYnV0IGJlaW5nIGluLAorICAgICAgIEJlYXIndCB0aGF0IHRoZSBvcHBvc2VkIG1heSBiZXdhcmUgb2YgdGhlZS4KKyAgICAgICBHaXZlIGV2ZXJ5IG1hbiB0aHkgZWFyLCBidXQgZmV3IHRoeSB2b2ljZTsKKyAgICAgICBUYWtlIGVhY2ggbWFuJ3MgY2Vuc3VyZSwgYnV0IHJlc2VydmUgdGh5IGp1ZGdtZW50LgorICAgICAgIENvc3RseSB0aHkgaGFiaXQgYXMgdGh5IHB1cnNlIGNhbiBidXksCisgICAgICAgQnV0IG5vdCBleHByZXNzJ2QgaW4gZmFuY3k7IHJpY2gsIG5vdCBnYXVkeTsKKyAgICAgICBGb3IgdGhlIGFwcGFyZWwgb2Z0IHByb2NsYWltcyB0aGUgbWFuLAorICAgICAgIEFuZCB0aGV5IGluIEZyYW5jZSBvZiB0aGUgYmVzdCByYW5rIGFuZCBzdGF0aW9uCisgICAgICAgQXJlIG9mIGEgbW9zdCBzZWxlY3QgYW5kIGdlbmVyb3VzIGNoaWVmIGluIHRoYXQuCisgICAgICAgTmVpdGhlciBhIGJvcnJvd2VyIG5vciBhIGxlbmRlciBiZTsKKyAgICAgICBGb3IgbG9hbiBvZnQgbG9zZXMgYm90aCBpdHNlbGYgYW5kIGZyaWVuZCwKKyAgICAgICBBbmQgYm9ycm93aW5nIGR1bGxzIHRoZSBlZGdlIG9mIGh1c2JhbmRyeS4KKyAgICAgICBUaGlzIGFib3ZlIGFsbDogdG8gdGhpbmUgb3duc2VsZiBiZSB0cnVlLAorICAgICAgIEFuZCBpdCBtdXN0IGZvbGxvdywgYXMgdGhlIG5pZ2h0IHRoZSBkYXksCisgICAgICAgVGhvdSBjYW5zdCBub3QgdGhlbiBiZSBmYWxzZSB0byBhbnkgbWFuLgorICAgICAgIEZhcmV3ZWxsOiBteSBibGVzc2luZyBzZWFzb24gdGhpcyBpbiB0aGVlIQorCitMQUVSVEVTCisKKyAgICAgICBNb3N0IGh1bWJseSBkbyBJIHRha2UgbXkgbGVhdmUsIG15IGxvcmQuCisKK0xPUkQgUE9MT05JVVMKKworICAgICAgIFRoZSB0aW1lIGludml0ZXMgeW91OyBnbzsgeW91ciBzZXJ2YW50cyB0ZW5kLgorCitMQUVSVEVTCisKKyAgICAgICBGYXJld2VsbCwgT3BoZWxpYTsgYW5kIHJlbWVtYmVyIHdlbGwKKyAgICAgICBXaGF0IEkgaGF2ZSBzYWlkIHRvIHlvdS4KKworT1BIRUxJQQorCisgICAgICAgJ1RpcyBpbiBteSBtZW1vcnkgbG9jaydkLAorICAgICAgIEFuZCB5b3UgeW91cnNlbGYgc2hhbGwga2VlcCB0aGUga2V5IG9mIGl0LgorCitMQUVSVEVTCisKKyAgICAgICBGYXJld2VsbC4KKyIiIgorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoCisgICAgICAgIENoZWNrc3VtVGVzdENhc2UsCisgICAgICAgIEV4Y2VwdGlvblRlc3RDYXNlLAorICAgICAgICBDb21wcmVzc1Rlc3RDYXNlLAorICAgICAgICBDb21wcmVzc09iamVjdFRlc3RDYXNlCisgICAgKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96bGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNWU1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96bGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96bGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0X3psaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNWU1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdF96bGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGFsbC5weSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0YWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNWNmMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGFsbC5weQpAQCAtMCwwICsxLDEwIEBACisjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLS0geW91IHNob3VsZCB1c2UgcmVncnRlc3QgaW5zdGVhZCBvZiB0aGlzIG1vZHVsZS4KK2Zyb20gd2FybmluZ3MgaW1wb3J0IHdhcm5weTNrCit3YXJucHkzaygidGhlIHRlc3QudGVzdGFsbCBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCBpbiBQeXRob24gMy4wIiwKKyAgICAgICAgICAgIHN0YWNrbGV2ZWw9MikKK2RlbCB3YXJucHkzaworCisKK2ltcG9ydCBzeXMsIHJlZ3J0ZXN0CitzeXMuYXJndlsxOl0gPSBbIi12diJdCityZWdydGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0YWxsLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0YWxsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmNmM2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RhbGwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0YWxsLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0YWxsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmNmM2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RhbGwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0Y29kZWMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGNvZGVjLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYTc1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGNvZGVjLnB5CkBAIC0wLDAgKzEsNDggQEAKKyIiIiBUZXN0IENvZGVjcyAodXNlZCBieSB0ZXN0X2NoYXJtYXBjb2RlYykKKworV3JpdHRlbiBieSBNYXJjLUFuZHJlIExlbWJ1cmcgKG1hbEBsZW1idXJnLmNvbSkuCisKKyhjKSBDb3B5cmlnaHQgMjAwMCBHdWlkbyB2YW4gUm9zc3VtLgorCisiIiIjIgoraW1wb3J0IGNvZGVjcworCisjIyMgQ29kZWMgQVBJcworCitjbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorCisgICAgZGVmIGVuY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2VuY29kZShpbnB1dCxlcnJvcnMsZW5jb2RpbmdfbWFwKQorCisgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CisKKyAgICAgICAgcmV0dXJuIGNvZGVjcy5jaGFybWFwX2RlY29kZShpbnB1dCxlcnJvcnMsZGVjb2RpbmdfbWFwKQorCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgcGFzcworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgcGFzcworCisjIyMgZW5jb2RpbmdzIG1vZHVsZSBBUEkKKworZGVmIGdldHJlZ2VudHJ5KCk6CisKKyAgICByZXR1cm4gKENvZGVjKCkuZW5jb2RlLENvZGVjKCkuZGVjb2RlLFN0cmVhbVJlYWRlcixTdHJlYW1Xcml0ZXIpCisKKyMjIyBEZWNvZGluZyBNYXAKKworZGVjb2RpbmdfbWFwID0gY29kZWNzLm1ha2VfaWRlbnRpdHlfZGljdChyYW5nZSgyNTYpKQorZGVjb2RpbmdfbWFwLnVwZGF0ZSh7CisgICAgICAgIDB4Nzg6IHUiYWJjIiwgIyAxLW4gZGVjb2RpbmcgbWFwcGluZworICAgICAgICAiYWJjIjogMHgwMDc4LCMgMS1uIGVuY29kaW5nIG1hcHBpbmcKKyAgICAgICAgMHgwMTogTm9uZSwgICAjIGRlY29kaW5nIG1hcHBpbmcgdG8gPHVuZGVmaW5lZD4KKyAgICAgICAgMHg3OTogdSIiLCAgICAjIGRlY29kaW5nIG1hcHBpbmcgdG8gPHJlbW92ZSBjaGFyYWN0ZXI+Cit9KQorCisjIyMgRW5jb2RpbmcgTWFwCisKK2VuY29kaW5nX21hcCA9IHt9Citmb3Igayx2IGluIGRlY29kaW5nX21hcC5pdGVtcygpOgorICAgIGVuY29kaW5nX21hcFt2XSA9IGsKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0Y29kZWMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rjb2RlYy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzOTg2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0Y29kZWMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0Y29kZWMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3Rjb2RlYy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgzOTg2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0Y29kZWMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0aW1nLnV1ZSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0aW1nLnV1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWI3MTNlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RpbWcudXVlCkBAIC0wLDAgKzEsMTE3MCBAQAorYmVnaW4gNzU1IHRlc3QucmF3aW1nCitNX19fWV4vXEEkUTNfKjFMQ19RTDQnL1w7JUFTXyVRKDZfUVA3Jj9cQiZBV18nQTw3X1FUNSYvXDckQTNfCitNJjEwOF9RODQlT1w3JTE/XyRRIDZfUTwzJy9cOiRRX18nMTw7X1IkOiZPXDUkUTdfJyFEOF9TSFctT1xcCitNLkNXXzE0MSpfVEUpMy9dLzNVK18nMURBX1IsPClPXEInIjNfMjQ5LF9UPSQyT10kMEQ3Xy4zPFpfVDEiCitNMT9dLjMkX180NF0yX1FEMicvXDslIVtfKjI0TV9VMTY2X101NVVTXzU1PTxfVVE+OF9dPDdGL18lMSQ5CitNX1FINidPXEIoMkNfNjVBPl9VNTg3P104NyVbXzY1TT5fUUA1Jl9cQCciM18lUTg8X1UlMzQ/XTw2RTdfCitNNVU5L19VLTE0X1w6JUFfXydBSEJfVEEmMi9cXS9DQ18yNEkkX1JERypPXEInQjtfKSIsSV9VSTs3L107CitNNjU7XzdFQTZfWCVcPy9eIT9HV183RV1AX1UhNDVPXTQ1VVNfNFU1Ol9VKTQ2X10uNCU/XzJUVTRfVDkoCitNM19dIzE0U18xJEUvX1RBKTQvXSgxVFtfMUQ9Ll9USS81P10pMkUnXzIkPS5fVC0lMy9dKTJVK18yJEUwCitNX1Q5JzNPXSMxJE9fMEQxLF9UISIyT10jMTRTXzFERS5fVDUoMz9dJDFUU18wJC0oX1QxJzMvXSEwVENfCitNMFQpKF9TXF4xL10jMERDXzA0LShfU0RcMD9cWzAkN18wI10lX1NZIDE/XFovJCdfLkNRIV9TSFwwP1xbCitNLlNbXy9TVSBfUTQzJU9cRShSO18lUTQ4X1MwUi0/XDclMUNfKVI0SF9RMDIlP1wyJCEvXyUhKDVfUSwxCitNJS9cNSRRO19ePltVX1NYVC9PXEYnIk9fJ1FEQV9RRDQmL1w2JDE3XyUxIDRfUTwyJU9cOiUxR18mISw3CitNX1E0MCUvXDgkUT9fJVEwM19RPDMlP1w6JTFPXycxPD9fUUw0J09cTClSV18oMVQ/X1FQNyZfXDUkUTtfCitNJ0FQP19RVDsnT1w8JkFXXzAzXSJfVEUnMk9cOiVBW18nQUhDX1FUOCcvXDglITtfJyFAOl9RXDsnP1xACitNJlFfXyhBVEFfUjA/KF9cSChSP18mMSw7X1FANCcvXD0nUjNfMlRdMV9UVS80T10wNCUvXzQ1JTRfVTE0CitNNV9cNyRRT18mMTQ9X1JcTSwvXUk6NjtfNTU5N19VJTM0P10xNCRfXychPD1fUiw8Ki9cOCUxT182JUE1CitNX1VBODU/XTs2JS9fNSUhMl9RTDcoL1w7JkInXzYlOThfVU06NF9dOzY1M18pMihBX1IkPSk/XDwmMV9fCitNN1VVQF9UPSUxX1xNKlJXXyhCIEJfUkBHKU9dMjRUV18+N1lYX1kmMUNPXU86RlNfNVU9Ol9VKTQ1X10xCitNNFU7XzQlKTdfVFkvNU9dKTQlO18yJF01X1QxKDQvXSUxRSdfMURBMF9UPSk0L10mMiRfXzEkOS1fVCUjCitNMk9dJDFEV18wNC0qX1QhIjI/XSAwREdfMDQtKl9UMSYzP10hMFRLXy9EJSZfVCklMk9dITEkR18xJD0sCitNX1QlIzJPXSEwVEtfLzNdJl9UISIyP10gMEQ/Xy9EISVfU10hMU9cXjAkN18uM00gX1NUXzEvXFwvRC9fCitNLkNRIV9TVFsvT1xXLTM/XyxDIFJfUyBOLC9cTSoyT18pQihEX1E4MiUvXDckUTdfJTEgNF9RKC0kP1w3CitNJEE7XyUxIDRfUTgxJT9fX10/S18rUjROX1Q8XjJfXEEnIitfJkE0OV9RODElP1w1JCEzXyYhLDdfUTgxCitNJT9cNiQxN18lMSA0X1FAMyVfXDckMUdfJVEoOF9QVCgjL11WPEczXzI0MSpfUUQ1JV9cOiYhL18mITQ0CitNX1EoMCRfXDUkUTtfJTEsNl9RLDElL1wzJDEzXyMwTC5fUUQ1Jz9cPSYyK18nMUA8X1FANCVPXDMjUSdfCitNJSEgMl9RPDIlT1w2JDE3XyYxMDhfUVA3Jl9cNCQhQ18lUSw7X1FYOyg/XD0mUVtfKDFcQV9TJE8sP1xfCitNLzNfXzMkSSxfUTwzJl9cOSUxV18pMixGX1UlMTNPXTE0VSdfM1UpLF9VKTIzX1w9JiFTXyhRUEZfUUg3CitNJz9dOTY1O181NTUyX1U5MzNPXTg1JTtfJlE8QF9RRDgnX104NVU7XzY1STRfVUE5NE9cRShSN18nIUxBCitNX1FMOigvXTw2VidfNzVRQl9WJUA5T1w3JUFTXykiMEdfVT04Nj9dMDQkV181VSUvX1VZNjUvXTY0RSNfCitNPkdVV19WIUM3P103NjU/XzVFPThfVFExNU9dKzNVP18yRSE6X1Q9KjVPXS40JUNfMkRRM19UPSk0L10nCitNMjUjXzE0PS5fVDkoM19dJzI1I18xJDktX1NZIDFfXSAwREdfLlNVJF9ULSUzL10gMFRDXzA0MSlfVEktCitNNE9cXjA0O18vVCUoX1NdITIvXF4wJD9fMEQxK19TWSAxP1xeMCQ3Xy9UJSZfU1kgMT9cWi5DV18sQyhVCitNX1JUTSwvXEcpUktfKlJES19SQEYqL1xKKiJLXyhSJENfUjRBKF9cSSkyP18oQVhAX1JYSisvXDklIUNfCitNJSBcM19RQDMlX1wzI0ErXyYhLDdfX0tRXD9cQCVRW18mUTA8X1FMNiZPXDgkUT9fJTEgNF9RNDAlL1w1CitNJCEzXyUxIDRfUTQwJS9cNCNRL18lUSg2X1E8MyU/XDckQTtfJFBYMl9RQDMmP1w8JTFfXyYhLDdfUTQyCitNJD9cNCQhK18kMFwyX1EoMCRfXDMkMTNfJFEkNF9RLDElL1w0JEE3XyVBKDpfUVA4KD9cOyVBS18nIUA6CitNX1FcOyc/XDslUUdfJVEoNl9RNDAlL1w1JCEzXyUgXDNfUSwvJV9cNyRRT18nQUQ/X1FcOSc/XD0mMU9fCitNKFIgP19SPEQoX1xBJ0FXXyVBKDpfUUA0Jy9cQCdCJ18yVE0oX1RVLzMvXS40REtfM0RdKF9RUDgmT1w+CitNJVInXyZRQD5fVTk2NF9dOjZFP183JUU0X1VFNTVfXDglIVdfJkFEQF9WIT85P109N0VfXzg2KUNfU1RcCitNMF9cNiVRW18mUVRCX1YlQjo/XUI4Rk9fODYlTF9RPDcoL1xCKFJLXzNFITVfVS01Nk9dNzRFQ18pUVxDCitNX1I0RChfXTs2VUNfNzVZOF9WTUo6P141RFk3X0EoIiJfVUU2NT9dODYlT180VTU6X1UhMjY/XS40JT9fCitNMlRVNF9URSs0T10rMzUzXzFURTBfVCkkMl9dJDFEV18xJDktX1QtJTMvXSEwVEtfMDQtKl9TWSExT10gCitNMFRDXzAkLShfVCUkMj9cXC9EN18vM10mX1NUXzFPXF4wJD9fLzNdJF9TUF4wX1xdL1QzXy4jSF9fUyhQCitNLF9cSioiS18qUkRLX1JARiovXEgpQkNfKjI8SV9SPEUpX1xEKEIzXylSLEVfUkBEKU9cSSkyP18qMjRHCitNX1I0QCkvXDgkUT9fJVEoNl9RQDMlX1w0I1EvX15fK1JfUjg7KC9cOyRBR18lUSw1X1FAMyVfXDUkITNfCitNJTEgNF9RNDAlL1w1JCEzXyUxIDRfUTAvJF9cNyRBO18lUSw1X1E8MyU/XDUkITNfJiEkO19TMEouP1w6CitNJFFPXyUxIDRfUTAvJT9cMSNRK18kQSAzX1EkLyRPXC8jMSNfIzBUMF9RIDAkX1w/JyIrXyZRPD9fUTgxCitNJT9cNSQxL18kUFwxX1EwMCRPXDIjMSdfJFBYMl9RKC0kP1wzI0ErXyQxIDdfUTwzJl9cOCRBS18mMSQ1CitNX1FENCVPXE0qIkNfMTQkX19TVFouP1w2JEFLXyYhMD1fUkRGKy9dMjQ1I18zNSUvX1UlMzQvXTI0VFdfCitNKVIwQ19SIDwpP1w9JyIrXzZVVTtfVi1COD9dPTZVQ185Vi1FX1FENSdPXDomIidfNkVJQ19WKUM6T11ICitNOjcjXzE0NTBfUTQ2Jz9cOiciJ183VV1IX1YxRDtfXUI4RldfJEEoPV9RTDspL11BOEZHXzdGIUhfViU/CitNOi9cPyZSL18nIVhDX1NZIC9PXFouI0tfJ0FQP19SQEUqX106NTUjXzglTTZfVzlSPC9dRDg2I181RUE7CitNX1U9OTcvXTo3JidfNDUtOF9UUTE1X10qM0U7XzE0RTFfVEEqND9dJTFUW18xNDktX1QtJTMvXSUxVFtfCitNMEQ1Kl9TUF8xL1xdMCQ3XzA0MSlfU1UgMT9cXjAkP18vI1klX1NQXjE/XFguQ19fLkNEX19SUEssP1xJCitNKiJbXytCUE5fUkhIKk9cSioiS18pUjRHX1JERyo/XEUoUjdfKiI4SF9SNEMpP1xGKEIzXylSLEVfUig+CitNKC9cRSgyL18pQiRFX1IsPihPXFcsQztfKSFcQ19RODElP19cXC8vXydBMDdfUyRJKy9cTClSR18nITw7CitNX1EwLyRfXDUkITNfJSBcM19RNDAlL1w1JCEzXyUgXDNfUTwyJU9cMyNRQ18lUSg4X1FAMyVfXDgkMUdfCitNJFBQM19RPDElP1w1JCEzXyQxJDRfUSgwJF9cMiQhL18kMFwyX1EkLyRPXDAkIS9fIzBcMl9RNDMlT1xACitNJlFfXyUxLDZfUSgwJF9cMSNRK18kMFwyX1EkLyRPXDAjQSdfJDBcMl9RIC4kP1wxJEEvXyYhPD5fUUA0CitNJy9cQScxX18kMFwxX1RJJjEvXTU0JEtfKFIoQV9RLDEmT1w1JFFTXysyUFJfVS00NT9dLTQlN181RUU+CitNX1VZPThfXFArMy9fJyFAQF9RPDgnX10+OFZHXzhGJUhfVilBOV9dQzhGR18mITg/X1E8NCgvXT43VjtfCitNOCYlSF9WIUE6L100NUVPXyZRSEFfUUA3J09dRTkmS185NjFKX1VdPjkvXDklUiNfJyFIQ19UVS00L1xRCitNLFMjXylSPEpfUUw6KD9cOSYhW18wNCBfX1JUSytPXEAnIjNfKVIwSl9UIF0uL10iL0QjXygxWERfUVw/CitNKE9dRDk1X19ASC1dX1k6NUUvXUc5NkNfNTVFO19VNTg3P10uNCU/XzJESTNfVEEnM09dJjFUW18xND0uCitNX1QlJjMvXF4wVENfMCQ1Kl9TWSMyL1xdMEQ/Xy9EISNfU1heMD9cVC0jP18rUlxSX1JQSis/XEsqMlNfCitNKkJAS19SSEgqX1xLKjJPXyoiOEhfUkRHKj9cSClCQ18qMjxKX1I4RClfXEUoUjtfKTIsRl9SOEQpT1xECitNKEIzXykiKERfUjBCKS9cRChCM18pIihEX1IoQChPXEYpIjtfJEBYMF9fX1ZeP1xAJiFPXydBRDtfUUQ1CitNJV9cOSUhQ18lUSg2X1FQNyZfXDklIUNfJUEkNV9RODElP1w1JCEzXyYhLDdfUTwxJT9cQCZRT18lUTAzCitNX1E8NCZPXD4oIjdfJ0IgQ19SQEwrT1w7J1InXyQxJDRfUSQxJS9cMCQhL18kISAzX1EoMCRfXDMjQStfCitNJkEwOF9XIUg7L1w3JEE7XyRBIDNfUSQvJE9cMSNRK18kMFwyX1EgLiQ/XDEjUStfJCBYMV9RRDknL10vCitNMlUvXy1TKFhfUixAJl9cXS5TL181VSEkX1VJMDA/XT41VE9fJkE0O19RQDQnL1xYLUNHXy8jTFpfU1khCitNME9dMTRVQ180NSk5X1JQTS0vXD8mUi9fJVFAP19WJUY7L11IOVZbXzs2UVJfVl1OPT9cNiUhV18mUUBECitNX1VVOzkvXUY5RkdfOVZBSV9VTTo4L1w4JUFfXyZBREBfVi1DOU9dSDpGQ185NjlHX1E4NScvXDQkUUtfCitNNUU9OF9VXUE3T102NUVHXyVBNDxfUUQ4J09dIC9TW18pUjRIX1FINidPXEInUjdfOVYtQV9WJTw4L1w8CitNJiIjXygyIEZfVD0lMV9cPichW18qIjhIX1VZPDdPXVo9NyNfSjomPV9XPVI9L107NiVbXzUlNTxfVFkuCitNNV9dJDFEW18vNC0rX1NAWzAvXFkvJCdfK1MoV19SREwsP1xLKjJTXytSSE5fUlRIKy9cTSoiU18qUkRMCitNX1JASCpfXEYpQkdfKUI4SV9SOEYqP1xFKTJDXyoiQEtfUjxHKk9cRylSS18pIjBHX1IwRClfXEUpMkNfCitNKiI4SF9SPEUpX1xFKFI3XykyLEVfUjRDKT9cRShSN18qIjhIX1IoQChPXE0qMk9fXi8jU19SREQpT1w9CitNJjFPXyZRRDtfV1FXPl9cNiQxN18mQTQ5X1FENCYvXDgkUT9fJiEsN19RXDonT1xGKDI3XzJUNSNfWSIrCitNQT9eK0I4M18nUVxCX1YpRzsvXTI2JUtfMkRZMF9TPFcuT1xLKzMjXyoiSE1fUjBGKj9cOichX18lMTQ4CitNX1EwNCVfXDklIUNfJFBUMV9RKDAkX1wzJDEzXyQwXDJfUSQvJE9cMCNBJ18kMFwyX1EkLyRPXDAjQSdfCitNJDBYNF9TWFgwL1w9JVFPXylSLDtfVEklLj9dPjREL187JUUnX1c1QDUvXEkoMjdfLEJUU19UMSAwT10iCitNMCNXXzU1ISpfVSUsMU9dJzBEK18uQzRZX1FcOyhfXDcmIV9fNFVBPl9VLTI2P10vM0UzXzVVOT1fUUA2CitNJ19cWy4kM18sUlxYX1VNOTZfXTs3JTtfNiU5OV9RSDcoX1w5JiFfXzZVUT1fVV1DNl9dQDhGI18mITw9CitNX1FIOSdfXT84NV9fOCYpP19VWT44P1w4JVFbXyVRODxfVDUkMF9cVi0jP18mITA8X1FUOigvXUs5RjtfCitNOzZBTl9RRDUnT1w8JlIrXztWUVJfUVQ6KC9cQygyM181VTU3X1I4QCkvXEwpIkNfNERVLV9VTTY1T14gCitNPldPX0E4IiJfVDEgME9cVCxDM18pIjBHX1FcPikvXDsmQiNfJEEkN19SKEIpP1xIKUJHXypSRExfUyhQCitNLF9cUi0jP18tU0RcX1NEWy9PXFovI19fLjNNIF9TQFovX1xWLiNXXy0zPFxfUyhULV9cTCtDJ18qIkhNCitNX1I8SSsvXEoqIktfKiI4SF9SQEYqL1xIKUJDXylSNEdfUjxFKV9cRikiO18qIjhIX1FENSVfX1xdLz9fCitNKVIoRF9RRDcmP1w2JVFDX0RJIjNfUVw6J09cOCRRP18mISw3X1E8MiVPXDQkQTdfJTEsNl9RRDQmL10kCitNLyNDX0VZJidfWUY4RD9fIVEsN19NK0ZeX1peU00/XlZNKz9fUDtGXV9WNUM5P11HOkZPXzc2IUFfUyxWCitNLV9cRCoyR18oMjhGX1IgQykvXEMpIjdfKEIgQl9RVDsnT1w4JUFHXyVBMDdfUSAuJD9cMyNBK18kUFgyCitNX1EoLSQ/XEInMidfL1NEXV9SUEYpL10+NVRPXzpWJTZfVVUvMC9dXDklN18/RjE5X1JUPihPXEgoUkdfCitNLVMsVV9TWFstT11FNkRfXzg1PSlfVT0sMT9cXC1DM18mQTg+X1E8OCdfXFwvVDNfLzNRIl9RWDsoP1w8CitNJlInXyNQVDZfUjhCKl9cTShCP18pMig9X1VJPDRfXTM0NTNfJlFARF9RRDkoT105NyVXXzVVUTZfVUk8CitNNj9cOSYxU18mMUA+X1VZQjgvXU88Nl9fOSYxR19RQDcnT1w8JlInXy9UJF9fUkRJKy9cOSUxV18nMURBCitNX1NcXS9fXD0mQiNfJjE0Pl9RPDYnP1xRLCM7XyZRQD5fUVA6Jz9dSjo2Q18oQVxLX1IgPSo/XTAyVF9fCitNMyQ5JF9SSEInT1xIKCFTXzNUSSVfVkFFOC9eKUE4P182JTk5X1RFJzJPXDUlIUtfMjRRMV9UOSkzT1xcCitNL1QzXzAkLShfU1khMU9dIjE0S18xNEEtX1QhIzIvXSExJEdfL1QhJ19TSFswT1xcLzQzXy4zTSBfU0xdCitNMC9cXS9UK18rUyRUX1JMTCs/XEwqQlNfKjI8SV9SREcqP1xIKUJDXyoiOEhfUkBGKi9cPSZRV18lQSg0CitNX187UlwvXF8uQ0tfKzJMTV9SPEcqT146RilPXyYhLDdfUUAzJV9cOSUhQ18nIUA6X1E0MyU/XDonMVtfCitNJiE4OV9RXDsmP146RThfX0Y5Mi5fXTs5Vk9fL1RdN19ULSMzX1xXKFJPXytPXCNfOEU5N19UPSIwT11fCitNQDdfXzhFXT5fVS0zNC9dIjBDX18sUyxQX1JYTipfXFguUzdfLSM4U19STE0qX1xDKFI7XychRDhfUTgzCitNJE9cMSMhI18lMSA2X1IgOSY/XSUwU1NfNUUtKF9WVUM1P14gPEYvXzxWNTZfVlk8M09dTzZUV183NFkvCitNX1VNNzdfXEgqUyNfMTQoXV9WPTs0T11GNjRTXzZVISVfVEkmMS9cQydSP18mQUA7X1U1NTRPXD4nMVNfCitNJkE0NV9RRDYnL1w4JVFbXydRRD1fVEBOKD9dKi4iS180RS0sX1Q5JTJfXEAmUj9fJVFEQV9VWUc7P11CCitNOVZTXzomPUZfUVQ6KC9cOyZSO18wRDEsX1NAWi8/XE0rIy9fJiE4P19RODUmX1xcMDNXXyMwXDJfUTAxCitNJz9cOCVBX18kMUQ9X1Q1JzMvXDglMU9fJSE4O19UUS4zL1w6JiFPXyhSIEZfVjlEOU9cTCojJ18nUUxDCitNX1ZBRjovXT02RiNfKFIgRl9UOSQxX1xBJ1IrXykiKEVfVSEqMi9dJS9TV18xRDEnX1E0NSdPXUI5JkdfCitNNCRdNV9UUSs0P10pMiRbXzI0TTBfVDkoMz9cXzA0O18wJCknX1RVLDRPXFUtI0tfLCJcVV9SVEwsT1xLCitNKkMjXypSSFBfUkhJK19cSSoiW18pUjxKX1JESipfXEkqQk9fKjJIS19STEkrL1xJKVJLXypCQEtfUUw5CitNJy9cOSUxP19cXzdSX1NQXi8vXEEnUidfQ1hKLl9UXS00L1w2JSE/XyVRNDhfUTQzJU9cQyZRX18mMTA4CitNX1FUQCg/XDYmITtfJlFcPV9ZIjFCX15CRlk3X1U8Xy1fXTsrUk9fNVI8N19UXEskX1xXJ09fXj5ESS9fCitNJSBcMV9RRDomX1w7JVFHXyYhLDNfUUQ0JS9cPiYxR18lQSQxX1I0RigvXFItMl9fMCQsXV9UKSUvX1xSCitNLEJfXytCWEtfUiRAJ19cMSNRJ18oIUw7X1QxIi5fXSQwMztfNyUpJF9XSUs3T10zMSM/XzBDLEZfVS0iCitNLT9dOjJUT18nQUQ/X1IsRSovXTIzND9fOzYpN19WNTgyX11LN0UnXzk1UTVfVSktND9dLjJUS186RkFDCitNX1E0MSRfXDYkQTNfJkE8PV9RODMmP1xKJ0FfXzYjVExfVFRYKU9dSDdVQ187RklMX1FYNyg/XEAnUjtfCitNNFVNP19WJUU5X14pQig/XyUhJDdfUTwzJy9eIkAoL18/WCVeX1YtQzlPXDglQV9fJSEsOV9UWSwxX1w2CitNJFErXyYxND5fUUA3J09cOCgiM181JTk7X1EsMCVPXEAoQj9fNjVJO19RLDImL1xIKVJbXzkmMUdfUzBQCitNLj9cPyZSL185VjVHX1YlPjkvXDMkITtfNVU1OF9RWDwnX1xDKDIzXzk2LUZfUVA7KD9cNiVBX18xVEk1CitNX1IgPCdPXUQ3VV9fQEdVXV9VVTg2L10uMyRfXzJESS1fVF0vNE9dJjFER18wJCknX1QpJDI/XF4wJDdfCitNLzNdJF9TWSAxP1xZLlQjXy9EISVfU1RfMS9cXS80I18vU10iX1NYXjA/XF8vVCtfL0NZIV9TUFwvX1xTCitNLFM7XygiIENfUUg2Ji9fXF5PP18qUkBHX1FANiYvXDsmMVNfKzJUUF9RQDgmX1w2JUFHXyUhMDdfUVg9CitNKS9cNCVBT18lMUA5X1JERig/XD4nUiNfQ1haLV9ZWjhEL18zU0xHX1RcTylfXTcrUV9fM1JMM19SXDZdCitNX1ouN0YvXDgkQTtfJjFEPF9RQDMlX1w8JiFLXyZBODhfUVA4Jk9cNyRRN18kMSgzX1FUPidfXDsnMUtfCitNKSI8QV9RUEAmL10gMFNXXykyPERfUTQ3JT9cPiZBQ18yND0gX1U5MzIvXUk3VSdfPiY5PF9VQSgvT10lCitNLiJXXzREPFxfVikzNF9cOiRBO18mIUg4X1cpTDkvXUU2VSdfOzYhM19WSToyT11TOUVPXzU1IStfVkVHCitNOC9dOjYlJ18kUFgwX1E0MCUvXDUkQUNfJ1FIPF9UNFYsP107L0JTXzJDID1fWTomPz9eJj9XX18pIVRECitNX1JERisvXUI6JktfPydeIF9YRipCX1w3JSFLXyZRODxfV01XPT9dTzw2Q184RjFBX1FIOSgvXDclQVNfCitNMTQgW19UXSkxX1w7JTFXXyUxPDxfUUhCKU9cWS5UI18mMTg8X1EwNiZfXScyNFNfI1EgN19RUDwpP10wCitNNEU/Xy1DJF1fUVw7KF9dQTdWJ182JTU7X1EsMCVPXTg1RUdfJ0FQP19RXD0oL1xbLkQjXyYhPD1fUTAxCitNJV9cNiRRR18mMTA4X1EoLCQvXEopIkNfMkQxKF9VKTA0T11UPEczXzclSTxfVUE2Ni9dKzM1K18xVEkvCitNX1Q5KTNPXSIxNEtfL1QpJ19TTF4wX1xYLlQjXyxTOFtfUlhQLT9cTiszL18rQlRTX1JYTSxfXEsrMyNfCitNKlJUUF9SWFAsX1xLKzMjXyghWEBfX19UXT9cTylSS18mMUQ8X1dNXj9fXjNFKTdfJVE8Ol9RVD0oL11JCitNOTY/Xzs2UVJfUSg1Jk9cRilSQ18nITAwX1JQSCpPXjBCWE9fRikyLF9cWy1RT180VD0jX1Q8UyxfXTswCitNU09fKlArU19JSUo9X1FYNydPXDsmIVtfJTEoOF9RNDYlX1wzJSE3XyVBPDhfUSAxJE9cLiMxL18nIUxBCitNX1FAOSZPXD4oIVtfKiJUR19TUSEuX1xLLCJTXypTIExfUlxLKj9dIS8jO181VSUnX1ZBPjQvXUI0JDtfCitNNCQgVl9UNForX109NFRDXzdVKS1fUTQwJE9cMCQhL187RkVDX1ZRQjYvXVs7RidfPjZNPF9YMVc6T11DCitNNyU7XzglUTRfVyVMOU9cPiVBR18lMSA2X1EoMCRfXEAmMUdfNSQkWV9WJSMrP100LVI3X0QnVVVfWF4nCitNQT9cSykiT184JV1FX1UhNDVPXTA0VTNfMyRVLl9QPCYjL1xDKDIzXzE0JF9fVSk2Mz9cRioiN18nQVRDCitNX1FANyc/XS0xRCNfNiUhLl9RTDYnL1w3JUFTXyojIFRfVTk4Nz9cOyYhW18lITg7X1QxJjI/XDQlQU9fCitNJzFUSF9UMSYyX1xNKlMzXydRUEJfVFksM09dLzMlK18lISQ3X1VBNjY/XD4nIV9fJUEwN19RJCwkL1w6CitNJUFDXyYhLDVfUiQ6Jk9cOyVBU18kUFw3X1FMNydfXD0mMidfJyFIPV9SID4oP1w/JzIjXzRFITNfVl1RCitNPS9dNTY1T18zNSUzX1RJLjQvXSMyJFdfL1QxKV9TWSMyL1xfMSRHXzAkJShfVC0iMj9dIjA0Q18wRCUoCitNX1NUXzEvXF0wNC9fLkNZIF9TOFovL1w1JFE3X15PK1VfUzBPLT9cRChSR187VklKX1k6MkQvXD4mMVdfCitNKzJATF9aIjVFL14rP1dPXycxPDtfUUg5J19cPSZRV18nMVg/X1k2MEQvXj5FOFtfU1xLJV9dOy9TX184CitNU1xfX1UsSyZfXUMsUV9ePUUpM18mQTQ3X1FUOSZfXDUkUTdfJVE0N19RQDYmL1w6JiFLXyRRJDNfUSwxCitNJF9cOyYxT18nIUg8X1FQOicvXEcrIjtfLjNYXF9SSE8rX1xGKyJDXy0zME1fUlxKKS9dKzEzV182VS0pCitNX1ddUzpPXS0wM0NfMTNMUV9UVSUuX11QOFU7XygxRDVfUlxLKz9dLzEjV188RjU4X1dVUDhfXV08Rj9fCitNQUdNUF9XIUg3T11FOEU/XzxHIUhfUzhSLS9cPCYxX18mUUQ7X1JUSChPXFoqIVtfOEQoTF9UQE8nT15eCitNS1pLXzo2JT9fUyRNK19dQzlWR184NlFNX1VFPzg/XTQ2RVNfLVNUX19TTSEwX1xMLEMzXzNVLTVfUSQzCitNJU9cLSMxI18oIVhBX1NQWS0vXi1CKENfKDFMQ19SLEApT1xRLUNPXzdGIUVfUTgzJj9cOSZSI18yRE0sCitNX1IgPShfXDwmIiNfKUIwR19SJD8oT1w8JkFXXzIkOSlfVEkoMl9cNCQxP180NFk0X1FcPChPXDAjMS9fCitNJUEkNV9RQDMlX1w0I1EvXyZRODpfUUQ2Jy9cNSRBQ18lQSw5X1FYOyg/XDolUVdfJSEkN19RTDgnT1w7CitNJiFbXykyLEVfUjRDKT9dJzE0P189Ny1VX1VdPzhPXS40JTdfMkRRMV9ULSUyT10hMFRDXy9EISVfU1BeCitNMF9cWy80K18sMyxWX1MkUy1PXFQtQ0dfK1MkVF9RRDcmT19YXC8vXzFUKShfUkxKLC9cPyZBS187Vj1FCitNX1IwPyhfXEAoQjdfKCIgPV9SJD4mP1w1JFE7XyZBRD9fUVw3Jk9cTisiW19DOEIoX1laNUNPXy9STDdfCitNVExPK19dPy5TT188VExbX1VMSyVfWiI3RV9cRCdSJ18nMUQ7X1E4NCVPXDclMT9fJjE8OV9RSDgmT1wzCitNJDEvXyRBIDJfUUg4Jk9cPCZBU18mQUA6X1I8TClPXFcvI0tfKkJcT19SNEspX1xPLDJbXyoiOENfU1BZCitNLS9dJC9TR18xU1xdX1FMMiRPXEMnIVNfJ0FEOV9TLEopL10kLyNDXzREVS1fVkE/Nj9dRjZFJ188Njk7CitNX1dJTTgvXiU9VkNfPjclR19WOUM2L11MOlYjXy0zLFBfUiA+KD9cQigiK18qIjBCX1JUPiYvXSYqUUtfCitNLiIkNV9dMyZQX140QyhLXydBSDhfVVU/Ny9dQTsmP182RiE8X1VdRTg/XUk7Vk9fNzYtP19TVSMvX10qCitNM1RfXyQxLDZfUFwvJE9cNiUhP18tUzBPX1RRJzFfXEAmQitfJiE0O19TMFkvT108N0YvXzY1OTxfUyBSCitNLV9dMDQ1K18kQFw1X1IgPCkvXDclMUNfJUEwN19RTDknL1w2JSE/XyghWEFfUTQyJi9cRCgyP18lISQ3CitNX1FYOyg/XDolMUdfJkE0OV9RODElP1w0I1EvXyVRMDpfUTgzJj9cOCUxT18lMSg4X1E4MyY/XDQkMT9fCitNJUEsOV9RRDYnL1w0JCFDXyghUERfUTQxJj9cQydSP18tMzhXX1UtNTRfXUU5VjdfMkRRKl9USSwzX10kCitNMURHXzA0LSZfU1kgMF9dIjEkP18vVCUkX1NMXTAvXF4wJC9fLjNEXF9fT1NdT1xHKEJDXygyIEZfWFopCitNQj9dVTtWV18qQjRJX1FANiY/Xl1NWzdfTzs2UV9RUDcmX1w4JVFXXyYxNDdfUTQzJT9eMkM4V19HSTYuCitNX1xLJVAvXzZTXF9fVz0zNF9dUzJTT18yUUwnX0gpPjdfUVw6Jy9cNyRRN18lMSw1X1E4NCVPXDklUUdfCitNJyFIPF9RLDEkX1wzJDEvXyZBQDpfUUw5Jl9cOyYxT18pIkRDX1M0Wi4vXE4sUy9fKUJQSF9TMFUrX1xMCitNKjIzXzJUOSBfVEUjLl9dQzY1N182NSUtX1RJJTAvXFktQydfLCJQTl9SMEIpP1w4JUFHXyYhODlfUUw3CitNJj9cPyZRR18rIjQ/X1ghVjsvXUc2VVNfOEVROl9WRUY4P10gLzNTXydBSDxfUUQ3Jj9cVCxCX18pUVA7CitNX1RIUylfXFkpMVdfUktWXF9YLVk9P1xAJjFHXysiSExfUyxaLk9dKDJUU18qMkhLX1YlQjhfXV0/R19fCitNJDEoM19bLlVOL1w7JzIjXyVBODlfUVA6Jz9cSSlCJ19PO0JYX1YhOjhPXDsmIVtfLEM8XF9TQFovX1w/CitNJyIrXyoiSE9fVCEhME9cNyUhS18pUixLX1EsMSUvXCwiQFdfLEMgU19RODQlX1wyJCEvXydRUEJfUUA1CitNJl9cMyQhO18kMFg0X1FAMyVfXDklIUNfJUEkNV9RNDAlL1wyI1E3XyZBPD1fUSwwJU9cMiNRN18mMTg8CitNX1EkLiUvXDolUVdfJFEgNl9RODImT1w3JFFPXyUxJDlfUTgyJk9cPycyI18rIkhNX1JUSytPXTI0JS9fCitNMjRJK19UNSgyP10kMVRDXzBUOSdfU10hMS9cXjAkL18wNC0mX1QpJDFfXSAwRDdfX19DW19SKD8pP1w1CitNJUFXXydRUDtfU1BWLS9cQCZRX18oUVRBX1JYPydfXEclUTNfKEFIPl9RLDUmT1wxJSE3XzAkJSJfWEImCitNQF9eO0U4V19RXCpdX107L1NfXz1VLTNfVl0nLV9dJyVQP14+RVk/XychPDlfUTgyJS9cNCRBM18kIFgwCitNX1E0MyU/XD0mUVdfJFEkM19RPDUlX1w5JVFHXywiWFBfUUg4Jk9cRSpCO18sQzxVX1MsWC4vXEQqQjtfCitNLyNAUF9SQEQnL11POyY/XzhFUTRfV11VPD9dTDhVU187NkE8X1chSjgvXVU6Ri9fPEY5PV9XLUY2X11KCitNNyUvXzREWSxfVSkuNC9dPTYlL187NjE9X1ZJPjg/XSUuQ19fJ1FIOl9SWEorL1w7JTFHXyVRLDVfUjBDCitNKE9cPyZBU18tIjQ/X1I8OSVPXTc0RTNfPlctUV9SND0oL1xFKSJLXylCSExfUiBAKF9cSClCR18mMTg8CitNX1ZBRzs/XEAnUjdfRylaQV9RPDknL1w6JkFXXycxTD5fUiw+Jj9fJFA8I186Jj1NX1IsQClPXDcmQV9fCitNJVFEPl9RKC8lP1w4JVFXXypSUE1fUVQ7J09cQCciM18kUSQ0X1E4NCVfXFUsUztfIzBMLl9RODQlX1xRCitNK0MzXy4jMFxfUUg2J09cOyVRX18lUSg2X1FINSY/XDYkMTdfJTEgNF9RODMmP1w3JSFLXyUhJDdfUTgzCitNJj9cMSNBM18kMFg0X1E4MyY/XDUkQUNfJUEsOV9RTDknL1w5JVFLXyYxPDlfUSQtJT9cMyNRP18uIzBcCitNX1JMSCtPXEcqMlNfPEc5VF9VKTQ0T10qMzRbXzEkQSpfVDEmMj9dIzE0Q18xRDkpX1Q5KDJfX19cTy9fCitNKkI0SV9SIEIqP10iL0QjXzBTTFlfUzRPLF9cNyUhS19EWE4uX1lKMkQvXEopMkdfJVFEPl9RUDonL1xJCitNKUI3X0NYWidfWTY1Qy9fJFBLV19VTFssX103KlI/XzpTXFtfUzwrIV9aJj1GX1xHKSIvXyVBKDRfUTwyCitNJU9cMyQxM18lUTQ3X1E4NCVPXDUkUTdfJTEsNV9RQDYmL1xDKDIvXyZRRDtfUjBIKU9cWS9DU18rUzBSCitNX1IwSSlfXFsuU0NfJlIsTV9TOSY4L10jM1ZLXy0zSTNfUyBaM09cXTNVV18rI1EsX1I8TC9PXEssRCNfCitNLkQxL19VWUI6T11IOVY7XztGPU9fWCFZPF9eJD5GX188VjE+X1leN0U/XS8zNF9fMjQ9JF9RXDsnP1w8CitNJiFLXyhSNEhfU1kqNF9cNiszK18zVilOX1haSE0/XDwpMjdfKTIgQF9TUF8wL10oMzRPXzVFOTNfVFUsCitNMl9dLDM0W19MSzJXX1FAOygvXlRLWy9fJ0FQPl9RXEIoX1w+JkFTXygxXDxfW0ZVTF9dODRVP18lQTQ8CitNX1EoLyU/XDIkIS9fJCBYMV9RODQlX1w/JzIjXyUxLDZfUTQzJU9cNCRBN18kUSQ0X1EkLyRPXDMkMTNfCitNJEEgM19TPFMuX1xSK0M/XycxREJfUUg2J19cMiNRN18lUTQ4X1E8NSYvXDclMUNfI1BUMF9SID4oP1w3CitNJTFDXyQgWDFfUUg4Jl9cNCRBN18lISg1X1EwMiU/XDMkQUdfJFEoOF9RMDQlX1wzJSE3XyUhNDxfUSAuCitNJV9dMTNVK18nUVA7X1ZZTzwvXUY5JidfQTghWl9VMTM0T10sNCUrXzE0RStfVEEoMl9dKjIkT18xVDUoCitNX19fUFsvXFstIzNfKjJIS19UVScxP1xVKzJPXy1DIFRfUUg3Jz9dOTQ1M184VU05X1I8QilPXDsnMitfCitNKUIwRl9TOFMsT14vQ0g/X0YpQi9fXDMiTz9fOVQ8X19VXFMrX11LL1NPXyVOS0dfSko6RF9UXSwyX1w1CitNJDEvXyVBJDVfUSwxJS9cNyUxP18lQTA2X1E0MyU/XDUkUTdfJUEwNl9RWDwnT1w6JiFLXyhCOERfU0BdCitNLl9cUC0zL18oUkBGX1M0WS1fXDcnUkdfIlE8Ul9QUDMtX1woJFMrXypTUUpfUVhZPU9cSTJXV18pVSIhCitNX1NZTEdPXEw2SFNfLEVOLF9UNUhEL10uOUhXXzMlMT5fWT4tQE9dVzpWK18uIyhQX1NdIDA/XSgyJDdfCitNOkZZRV9WSU45T11VQFg7Xy5VVVFfV1ZPUS9eQFFeI18+KipSX1c2JEEvXiQ+V09fMFNdIV9RTEMoL1xNCitNLFJfXzBUQSZfVzVaPk9eWFAsK18lMVxDX1tWW09PXDwmQVNfJkFUPl9RWDonL1w1JiErX01aRkZfWU4gCitNQU9cNCNRN18kMSQ0X1EwMiU/XDQkQTdfJCBYMV9RMDIlP1wzJDEzXyRRJDRfUSQvJE9cMiQhL18lMSw2CitNX1EsMSUvXDQkQTdfJ0FMQV9RLC8lX1wxIzE3XyQgUDRfUSQvJE9cOiYhT18mMTw6X1FANiY/XDIkIS9fCitNJzFMPl9RMDIlP1w6JiFPXyRAXDVfUSgvJT9cNSRBQ18lMSg4X1EsMiYvXDEkUUNfJFE0Ol9RPDknT1wxCitNJEFHXyRRKDhfUyhQLE9cPycxS19IOVI8X1heJEBfXUg3JT9fOUVVPV9WITw3T10+NkVTXzJEOShfVSUtCitNM19dMjQlL19fXzNUX1JQRyo/XD4oIjdfKDFYPV9SWEYpL10sMURLXyhSIEZfUjg+KD9cSihCI18nMUA8CitNX1FAOidfXDwmQVNfPUctUl9YLiI+X144RihfX08rSlVfXUMwU09fPlRdK19WPFstX1w2Wk4/XkpJSjNfCitNMVQxI19RODIlL1w3JEE7XyVRNDhfUUg4Jk9cNyUxP18mITg4X1E8NSVfXDclMT9fJlFEO19RVDsnP1w/CitNKFInXywzOFRfUyxYLU9cPShCI18uIzhRX1IwQidfXD8nIitfJUEsP19RMDEqL1xQLVU3XydTJTVfUiBWCitNNy9cTzUnP18uVkotX1JVOkBPXD4xNl9fKyU1WV9SWSg7X11cQFhHX0dJIiFfVlFANV9dJTAzX18rQyRSCitNX1JITypfXT84VUtfQDddWl9VVUY7P105PykvXztZWlZfWV8hVl9eI0k7R19IOjpLX1MsTCsvXFQtMztfCitNNTVJOF9XWiA/P11MOlZLXyoyUE1fWiJESU9dPjhWQ19QTCMjX1EsMSRfXDAkUTNfJ0FIPF9SLEEmT15YCitNS1pHX0JXUVxfUTwxJT9cNiUhP18lISg1X1EwMiU/XDMkMTNfJFEkNF9RLDElL1wyJCEvXyRBIDNfUSwxCitNJS9cMiQhL18kUSQ0X1FIOCZfXSkxVEtfJTEsNl9RIC4kP1wyJCEvXyRBIDNfUiA+KD9cQigiL18oUiRECitNX1E8NSYvXSQwRDdfJSEoNV9RIC4kP1w0JCFDXyRAWDZfUUg2J09cRyhST18sMlhUX1NAUy4/XS4yJSNfCitNODVJRF9RJC4mX1w0JDFXXychQEBfVChdMD9eTUoqS19MSkpIX1dNTzpPXUw5NjdfQlgqIl9XIUc5X11MCitNOTY3XzclPTdfVCxeME9fX14/S18pUjhNX1JITy5fXFUtI0tfKiIoQF9VPTE1P1w+JlInX0VJJjNfWzJMCitNSk9cXi4zV18jQSA1X1FIOCZPXD4mUUtfQCdZV19ZNjNCX15cTks3X1VdJy9fXU8wU19fN1MsT19QSz5WCitNX1pWSUlfXEQoMiNfJkE4OF9RNDAlL1wzJDEzXyYxPDlfUTw1JV9cOCVBQ18lUTQ3X1E8NSVfXDsmMU9fCitNJ1FUP19RXEMoP1xPLVMzXy4jVFtfUVBBJ19cVC4jS18nUiRGX1FIPSdPXDElQVNfJVFITF9RPEIoX10jCitNNiUrXz44XjdfWTpRTy9dXEYqI183R0IjX1QtNzk/XSg5NydfLEQ9RF9XRVs+P142QSc7XzwmNTpfVE0nCitNMT9dIjE0O18sMzhSX1haL0IvXVo9VztfJyFERl9UJTo8P14hTCwrX0Y8NzlfWFJXUj9eSk47R18uIzRUCitNX1NEXi9PXUQ6Nj9fUzxHJ19YXipCT1w8JiFLX0NIWjFfViVDOi9eRkkqP18kUSw2X1MgUy0vXEUoQidfCitNREg6IV9WMT82P1w7JzFLXyZRPDlfUUQ0Ji9cPSZRW18lMSw2X1EoMCRfXDIkIS9fJEEgM19RJC8kT1wxCitNI1ErXyRBIDNfUSgwJF9cLSJQW18mUUQ8X1UhLzU/XSgxVFdfJSEoNV9RKDAkX1wvIzEjXyQgWDFfUUg4CitNJl9cNyUxQ18kMFwyX1BAJiI/XDIkIS9fJkE0OV9UOSIyT1xfLzQ7Xy5DSSVfUSQvJi9cUiozI18wIzRaCitNX1hFXkBfXTgxVSdfOjVVTF9WMTo6X11XO0dPXztWQU9fWi4+SC9ePUVZN18yRD0iX1U1MzU/XzZSTE9fCitNNlUtMV9USSMwX1w6JTE3XychODpfX19YXF9dIS80O180VUFKX1EwMiU/XEQpIidfO1YxSV9RPDQmT1wzCitNJSE3XyohVDxfUTgwJS9cNyVBU18mQTg4X1heKkJPXV8+JytfRzk+L19aVktJT18yVCxXX1YtIyxfXT8rCitNUV9eTUoqL19KWkZGX1FENiU/XDslUUdfJkE0OV9RLDElL1w3JTFDXyQwXDJfUTAyJT9cNSRBQ18lQTA3CitNX1E4NCVPXFkuIz9fKSIsQl9SRFgtL1xVLjM/XyYxVDtfUlxULC9cRShCQ18nMVw8X1EwOihPXDcmU09fCitNJyFYQV9VTTk1T14rRilXX0I6LkZfWDY5Rz9dRTs2X182Jik/X1U9TzsvXEUwRytfPidVW19YTVU8X11PCitNOTVLXzNURSdfUjBFKU9cQykyK19HOTItX1VVTDw/XD8rRDdfJCJNI19XVkVOT147Ul4/X0g8U0RfW1MgCitNUE9dMDFUP18qMjxJX1YhRDhPXy5SLDtfRjkyNF9RTDkmX15bTltbXzJEUTFfW0JXT09cOSZRW184Ji1ECitNX1FANCRPXEEnMU9fKUIkQV9RRDQlT1w0I1E3XyYhODlfUihAKF9cPSZRW18kQSAzX1EkLyRPXDIkIS9fCitNJUEwN19RLDElL1wxI1EnXyQwXDFfUFQrI09cPCYxX18sU00rX1EoMidfXDUjUS9fJEEsNF9RIDAkX1w4CitNJUFHXykiKEVfUTw1Ji9cOCVBQ18lUTQ3X1FANCVPXDolMT9fJyE8PV9QVC8lT1wnIyErXyIgPC5fUSwuCitNJE9cPCZBP18nUUwzX1dZSTlfXV04RytfMiJZKV9VLF01X10iLUNfX0M4KiFfVTkxND9cWS5TW18rMlxUCitNX1xbIlBfXE4sUydfMyRVLl9RVDgnL1w3JSFLX19fM1FfU0RULk9cNyVSM18pQiRFX1JESyovXV08Rz9fCitNJkE8PV9YSitDL15SSVo7XzwmSU5fUSwyJi9cOiVBQ18lUSgyX1c9UDpPXjtFOFdfTis6UV9bVl1OT18hCitNT0tHX0o6Jj1fWVI6RT9ePEZJP18pMihBX1IgPCdPXDwlUU9fJFEkNF9RSDgmX1wzJDEzXyVRNDhfUTw0CitNJk9cNyUxQ18oIVhAX1FEOCVfXD8nQVdfKkNEVV9TPFsuP1w4JyFLXytDOFJfUjxCKU9cRylBX18pIkRVCitNX1FQRjJfXDQmUidfL1NMWV9YMilDT143SypbX0A5OjhfV0ImQT9dRTs2R183NzFPX1IxITw/XVk/R1NfCitNRTddXV9XPU04T10oMEQjXyoySEtfUixFKE9eP0QoT18mMixHX1M5PzxPXTtDOkNfOTkuT19VVjFMT10wCitNPzlPX0pLIlpfVV01Ni9cTCpCU18lIUA2X10jKlIvXkBGWU9fJ0FQPl9bIlBMX10iMSRHX0xLIlNfUUg6CitNJz9dUz03Q18lMSg4X1FYQikvXEUqMk9fJSEwN19RLC4kT1w2JSE/XyZBQDtfUTw1Ji9cMiQhL18lMSw2CitNX1EsMSUvXDAjQSdfJDBcMl9RJC8kP1wxI1EnXyNQVDBfUUw4J09cPylDU18lIThFX1FUOCZPXEUoIjNfCitNJEEgM19RRDcmT1xMKkJXXycxTD5fUTw1JV9cNSRRN18zNEUrX1JERClPXDokQTtfJUEoNF9RKDEkL1xBCitNJ1IrXyQxODxfUUA+KC9cTCoyQ18nUSw2X1YxOjs/XDskQktfQygiNV9YJVY/P10lLyNTXygxWD1fU1EgCitNL09cUCxDI19TXDMjX1MgVSxfXScyJEdfKCFMP19RSDgmX19fXF8rXyoiIENfUjBBKV9cQSchU18vVCReCitNX1cxSTtPXDAjMS9fKTI4R19TNEoqP1xHKDI3XyUhLDlfUUw3Jj9dOzVFO185ViE6X1oiOkRPXkVIWVtfCitNQCg2IV9ZUj1FX14yRChPXz1HRVNfV0FYPT9cNyUhL18mITA2X1E8MiVPXDEjUStfJUEwN19RMDIlP1w3CitNJTFDXyUxKDhfUTg0JV9cQygyL18mUUg5X1FQOyZPXEctQytfLiNQWl9RQDwmT1xPLlNDXykyKEFfUzhQCitNKU9cRisjU18nQj0wX1E0OyhfXEInQVNfNSVNO19VMUc5X11UQkhHXz5YWihfViFKOD9dOTwmT18rRE1bCitNX1c9XD5PXjlAWCdfPTZNQF9XOVA7T1xKKlJTXywjKE9fWF4uQF9dSjhGI18jIjxSX1cmSFAvXiNMPFdfCitNOEk6V19XRkJQL15TTFtTXztGKUNfUjBCKS9cTixDI19TXEcnX1leOkZPXEwqQlNfSUo6SV9SSEwsP15RCitNSzpPXyZRQDdfVilDOk9cRykjJ18vI0UlX1IkQio/XDQkUUdfJDEkNF9RLDElL1w2JSE/XyRBIDNfUSwxCitNJS9cOiYhT18lUTQ4X1EkLyRPXDEjUStfJEEgMl9RKDAkT1wwI0EnXychRD9fUVBDMD9cKiMxX18kIEwrCitNX1JAQyk/XDglMU9fJjE8Ol9SMEIpP1xAJ0InXycxTD1fUihAKE9dSjlGQ18pQiRDX1EsLydfXDgmIi9fCitNJTFAPV9RSEUsL1w+KUNLXy4zVSVfUjxCJz9cVStSP187Jk1KX1BQLSNPXkRISV9fLTMgS19SJDwnL1w2CitNJiE7Xy9ELF9fVFEqMT9fJU47N18xVFEqX1JYTywvXDklIUNfJiE4OV9fR01bT1xHJ1IrXyVBJDVfUVg7CitNJk9cPScxS19GSFoxX1JARSpfXEgqMktfLDJER19SSEUpX1w1JEFDXyhCIEJfV1lZPj9dOzVFI19IWUozCitNX1kyMkM/XU49NltfRDk6MF9XSV09X11OPTZbXzxHLU1fUTAxJC9cOSUhQ18mMTA4X1E4NCVfXDglQUdfCitNJiE4OV9RRDcmT1w5JVFLXyVBMDdfUiA+KC9cNyVBN18mUUg5X1I8UywvXFQuMz9fJUFIOF9TQF4wL1xBCitNJ1FTXydBPDFfVDkuN09cRCs1U18mQUxGX1IgPiZfXEYtIy9fQUlOPV9XLilCX11BPVc3XzZWMT1fVVlVCitNPC9cTjNXS18+J1FeX1lSJ0BPXUc2RFdfQkgpXl9RXEAoP1xPLDJfX0FYWiJfWkY1Qz9dMDYmK185KTJJCitNX1dGSFAvXjtTPkNfNldSM19bUldPP14iPUc/XydSIEFfU0xeL19fL1I8P19KKiZBX1MkTyw/XE8rUytfCitNKkJET19VUTg1T1w9JkFHXzBUKShfUEQoJT9cPSVCK18oIUhCX1FENicvXDAkUTNfJTE0OF9RMDIlP1wxCitNI1ErXyVBMDdfUVw9KC9cNiUhP18kMFwyX1EkLyRPXDIkIS9fJEEgMl9RKDAkX1w1JEFDXycyLSNfUSQ2CitNLC9cMSNRK18lUSQ1X1JERStPXEcpIktfLCJUU19SWEwrX1xRK1MnXylCMEZfUVg6Jy9dIi8zX18oQjReCitNX1RJMTlfXDQnQlNfKFMtLV9USTY9P1wrIyFXXygxRDVfViU8Mk9dIy9DR18mISw1X1oqPUdfXEopIlNfCitNJkE0O19RNDclP10pMyQ7XzQkXShfWlJCR09cOScxT18mIUQ6X1JARio/XFArQyNfX19LWV9STEMpX1wyCitNJDE/XychVD5fV0VXPS9eRkVZQ18lMSw1X1JETStfXltNOy9fRyk+OV9RQDMmP1w9JlFbXyVRKDJfVDUpCitNMD9eSEc5O19BOC1eX1Y1TzlPXiVDOC9fOycxSl9WPU85P11JOzY3XyVRNDdfUUg3Jz9cOiYhT18mITg4CitNX1FMOSZfXD4nIVtfJyFIPF9RQDYmL1w6JiFLXyZBQDpfUUA2Ji9cNyYhR18qIlxPX1MoWy5fXDQmMUdfCitNLTMgXF9SKEYnP1xAJUFfXycyRFBfUiRWOy9cNiUiM18oQVw+X1IkTS0vXipJKj9fQElWRF9VVVQ+P10mCitNNERfXzQ2SU9fUlU1Py9dVD44T19EOCFSX1ctQDVPXj5ESFdfKDIoQ19RXDsnP14yQkg7X0lZVjJfWUZKCitNTV9dVkhLU19GLDM4X1pHLVhPXEouVENfQiguI19ZVjhEX1w+J0InXzJUSTBfXDcgUE9eTklKR18uQ0BaCitNX1NAWy8vXSszRF9fL0QtI19RSD0nT14iP0gjXyYhRDpfUUQ5Jy9cPCchX18kUSw2X1EwNCVfXDYlQUdfCitNJUE4OV9RSDonP1xdLzQjXydRXEJfUUQ5Jy9cPydSK18jQFgxX1EwLiVPXDQjUS9fJDBcMl9RKDAmP1w4CitNKENXXyhCSTZfUTg8LU9cOCYiJ181JFFHX1QgXjFfXEspUl9fJlFIQV9YLiE/T10yM1RbXyZBODhfUjxCCitNKU9cLSRCM18nIixRX1MoVTAvXUc7OC9fPUgmQF9RXEQtT1w9JUE7Xy4iVEZfUiw/Jz9cPSVBO19LOj5FCitNX1JMSCtPXD8mUi9fJSEoNF9WKUM3P1w7JlFDXyxTJExfUUw4JV9cNSRRO18qMlRLX1FANiYvX19eLz9fCitNMFNMX19RXD4pL1w1JUE/XykyNEJfWyZFSU9cOyYxT18mMUw+X1FEMyQ/XDYkMS9fJyE8PV9RTDknL14yCitNQzhXXzE0RSFfWio3RC9dXz83Q183JjU+X1Y5TTk/XUA5VV9fODZBQF9WMUg4L1w4JUFDXyYxODxfUTg0CitNJV9cNiUhO18mQUA6X1FUOyc/XDYlITtfJTEsNV9RKDAkT1w5JVFHXyVRNDdfUTw4Jj9cRisyV18tI1RdCitNX1EwOSY/XFMsI1NfKDJAPl9RSDAmP1wpJEFHXyZSRUFfUUw3KV9cRygxX18mIUg9X1MxKzJPXiVIOjNfCitNOSdBXF9UVTY1T10yOjZDXyxVQVdfVyVSPz9eN0AmV19BNz1OX1pCQEdPXEEnUitfJ1FUP19YVipBP15ICitNSDk3X0Q6Kk9fUjUvOj9eU1NeM19NPEs8X1EsPSlfXipBN19fQFghW19RWEIpL105NlYjX09bTl1fW1ZZCitNTl9cTCwzJ18tJCBfX1MwXS8/XSw2JT9fKSI8SF9ZMixDX1w5JDEzXyVBMDdfUUg6Jz9cMCQhL18mIUA7CitNX1E0NSYvXD4nQidfJ0FYQV9ULSMxT1xKKkJXXygiIENfUkhKKz9cMiRBN18lIFg2X1EwLyRfXC4jIF9fCitNJFEkOl9RNEEvL1w6KTUzXyciPSpfUyhVM09dQjUnS19AJ1onX1BUMCU/XDUkQVtfJCBULF9VIS0zL1w5CitNJTE/XyghTD9fVC0iMi9dNjUlO184VVE8X1o6QkpPXU47VztfJUEwN19RRDIkT1xRKTInXydRSDpfUUw0CitNJS9eSUhaJ18lISQ3X1EsLyVfXC8jMF9fOEYtPV9ZTjtGL1xdLzNLXycxTD1fUUw5Jy9cTStCQ18mQTg4CitNX19fWF1fXSwxJENfKTIwSl9RWD8oL1xPLSMjX09bOlZfUUQ3Jj9cRCkiP19MWk5JX1tKVU1fXDslQVNfCitNJDBcMl9RWDkmP1w/KFFPX0g5Oi9fWCFePj9cVC8jQ18uM1xbX1JUUytfXFUuUz9fNzYhOl9RQDYmL1w0CitNJDE/XyUhKDVfUSwxJF9cNSRRN18lMSw1X1E0MyU/XDMkMS9fJSEoNF9RRDcmP1w5JVFHXyVBPDhfUiRICitNKi9cUS5DS18kQTw3X1JUTS4vXEMqUidfKFFEQl9RXEUrP1w/KzY3Xy1DNSZfUzxYLE9cXzAzW18sU0BSCitNX1lGRUkvXjlJOkdfO0c1VV9UXUU4X1xTNjdHXz0nUjBfWEIgP09eJkA4J19LKjpKX1FMNicvXD4nIVtfCitNQzhaKF9ZVjhDL10oNjY7XzFWVihfWl8vWT9dVENKL18xJTE+X1gyJEA/XjlGSTNfKVJUT19TIFUuT15QCitNS0sjX1BbXyFfVjFJOj9dPDomP189J01bX1gyKUI/XjFDWSdfSioiQ19RQDMlP1w1JFE7XyZBSD1fUSAwCitNJF9cNyVRS18jQFgxX1E4NiY/XD0nMiNfJ0FYQV9RXD8oT1w5JjFTXyYxRDxfUFwvJE9cMyMxN18kUFgyCitNX1EgLiQ/XDQkQU9fJTFYVl9RREM0L1w7KTRLXyUhRFdfVjUvPy9dXj44N18kIUA6X1FIOilfXD0mMU9fCitNNTUpMV9SQEQpT1xQKlJfXylSLEVfUig4Jl9cUikyS18+NyFXX1QkVi0/XUA1RUdfJDBYNF9RMDAkT1w2CitNJEEzXyYxKDJfWTYvQz9cNSRBQ18lISA4X1E8NSVfXT03RUNfR0laO19TJFIsX1w8JyFfXycxTD1fVE0qCitNMF9eJ0EoL19fXzdSX1QgWi9PXDsnIi9fJiFEOl9XQVo9X15cTTs3XyZBQDpfUTQzJU9cRidRX18mQTg4CitNX1E4MyY/XD0nIitfQlg6Jl9SSEspL149RShXX0BYJVxfUlxXLS9cSCsyT18mMVw7X1JUUytfXTM2NSdfCitNJiE4OF9RMDElX1w0JEE3XyUxLDVfUTAyJS9cMyQxL18lISg0X1E0MyU/XDQkQTNfJjE8OV9RRDcmP1w3CitNJiFHXyhCPEdfUlBVLT9cOygiI18tMzxfX1E4PiZPXD0lMUdfJjFcR19SMFY7T1w5J1JfXylCSEJfUlRQCitNKk9cVisyO18uUzhWX1ZVUDw/XSYzVF9fLCUlQ19RTTBBT1w7LlcvXy4kXVpfVVFIPV9eWkxLO18oQVRDCitNX1IgPCdPXi1DWDtfSEleNF9VLUA6X10rOygvXzFWTiBfUiUiNi9cQS1EK18qMkxJX1leQUdPXyNRTD9fCitNQShGLl9cLyRRP15fTytPXzZFVT5fW1sjUF9cXjA0K19TPEcrX1YlOTcvXjdDWStfJjE8OV9SNEUqL1w5CitNJjFTXyRRLDZfUTw3Jk9cMCQhL18nQVhBX1IsQylPXEgqIk9fJjFEPF9RTDsnT1w1JTFDXyQhIDNfUSwuCitNJS9cMyNBK18kQSAzX1FMOig/XDUnIyNfJkIlK19ROD0wP1w7JyNPXzlEXVlfVy1QPz9cSi0zO18nUiBLCitNX1dVWj4/XScxJC9fJiEwNl9SVEgrL10nMERDXzEzTSRfVCxUL19eJD8oO184NS00X1omOUc/XDQkQU9fCitNJFE0OF9RLDEkX1w8JVE/X0VZJi9fUFQrI09cNSRBQ18mITw2X1Y1RjgvXUs6NjtfLTM4V19RSDwoP1w0CitNJEEzXzUlKSpfW1ZaTj9fX11PI181NF0zX1M0WjFPXEgpMk9fKSIgPl9bJk5LP1w5JTE/XyZBNDlfViU2CitNNT9dQzY1N18mUTw1X1FUPCZfXEonIVdfKiJEQl9ZNjRCP14nQigrXykyUExfUVxGKU9cPilCL18qQyhOCitNX1RJNjM/XDgmMUtfJUEkN19RLDElL1w2JSE/XyVBMDdfUTg0JV9cMyQxM18lISg0X1EwMiUvXDYlITtfCitNJjE8OV9RPDUlX1w/KEIvXylTLFJfUEwyJE9cTS0zK18jUSRAX1FMOCRfXDcoMlNfJjMhRV9RWEEsX1xBCitNJ1FDXysiSEVfU1BaKl9cRyhBV18yRDxcX1gqKEEvXEMwRjNfKyU+JV9RUSBCX1xNM0k7XzI2PV1fXCJOCitNTE9cOidSM18oUUQ8X1kiMEA/Xj5HKTdfQyhaM19ZRkRKX143SFsrXzFVQUVfU0kmMk9eLkFIK19KKjZECitNX11XNVYvXjNGKUNfSjpKS19cJl9PL15aTjtDX1YtLzdfW0pWTS9fKVBMK188VllOX1g2IkA/XE8rQldfCitNJiFIPV9RSDwnX1wyJEE3XyYhODlfUFQuI19dODZVU180NTE1X1IoRSlPXEAnQidfKSIoRV9RVDsnT1wzCitNJDEzXyVBIDRfUTAvJF9cMSNRK18lITA3X1FURi9PXDwoVSdfJSFVIl9RUEAvL1xOJ0NLXzg2OVJfVUU+CitNN09dSzs2S19FOS4uX1UlLTJfXDckQTtfKyJAUF9RWD0oX1xSKlMrXy5DJFhfV1lZP19dNDJUT19KOiJACitNX1FQNyY/XDglQUdfJFEoOF9RRDQlT15FR1lXXyYhLDdfUTQzJU9cOiYxQ19AOCVYX1lGNkQ/XFwuIztfCitNKUIoRF9RRDglX10zMzQvX1ArVlxfX19UXC9dXT1HO18mMUhBX1EgLiQ/XihBKCtfSko+Rl9RWDonL1w9CitNJiFTXz0mRUhfVllGOS9cOiUxN18nMUw9X1JcRypPXDcoIUdfLUNUU19TSSIvT1xGKzJXXyhSOEdfUUQ9CitNJl9cSStCS18xRSEnX1FMPCc/XDklIUtfJTEsNl9RQDYmP1w4JUFHXyYhODlfUTAyJT9cNiUhO18lMSw1CitNX1E4NCVPXDklUUdfJTEsNV9RWEEoT1xDK1JbXyQhPDdfUkxTLC9cNCVCN18mUUAzX1EwPio/XDksNkNfCitNK1MtKF9UQSYwX1xEKSInXysyTENfU0hQLF9cWSxST18vU1RaX1IxIDhPXEw1WDdfJ0Q6MV9SSStEX10kCitNN1c/X01aNklfUSw6Jk9cQiVRU19DOSFeX1ouQEUvXVg8JltfUDs2WF9dKytVP1w8J0I7Xy4jTFxfWzZICitNSF9eSUkqM19WPF8yX1dWIkBPXjtHSV9fUkw3IF9bSlRMT188VE03X1IrWlpfXFsmUS9dXj43R19CODolCitNX1FcPic/XDcmMVNfJTE8Ol9RJDElL1w3JTFDXyUhNDZfUFgvJC9cXzAkJ18nQVxAX1I8RSovXEUoUjtfCitNKCFYQV9RMDIlP1w2JCEzXyUgXDNfUFwtJC9cLyNRK18nIjRdX1FMQTQ/XDMnRCNfJUFMVF9SXEAuP11JCitNO0dLXzkmRUlfVkFKOV9eKUFYK180RFksX1IwPyhfXFwuJCNfMUQ1K19RJCokP1xaLDNDX0MoPi1fVi06CitNNk9eQkY5R18nUUg8X1E4NCVfXDMkQUNfJyE8OV9aSkRIT1xUK1MvXyZBQDtfUjxGKT9dXz9XO18/N0lVCitNX1NcViwvXEspQidfJ1FINF9VOSwwP18rUDwzX19fM1FfWiY2RT9cOiVRO18nQUg8X1M8VCxfXlZMWytfCitNJUEoNF9RXDonT1w+JjFfXyUxKDhfUTw5KC9cNCZCK189VyFXX1FQRCgvXipDWEdfPjdZXF9TNSEwL1xZCitNMEQrXy40LSBfU00mMD9dIjNEN18kQSw0X1FENCZPXDUkUTtfJTEsNl9RODQlX1w3JTFDXyUhKDVfUTg0CitNJU9cNyUxP18lQTA2X1FENyY/XDglQUNfJzIgQV9SKE4rP1xAKVI/XysjMFFfUSw1KS9cPCYxM18iUTRACitNX1FIUjpfXDknUzdfMCNcXl9UISIwL1xLLCJLXydRUEJfUzhUKz9cVy4zO18nUzk5X1JFN0EvXDoxSSNfCitNKlRKMl9TRTI7X15RR1onXyVBWDpfUjg7KC9eKkJXW19JOV43X1ZBOjZfX0pWPUdfWi1DPF9TRFQtT11ZCitNPjc7X1U8RyRfWjY+R09fOFMsX19DOSoyX1dSI0BfXyhRS19fTztCU19eIzdVX18qUDtPX09bPlVfWEolCitNQT9dUTtGV18rQlRMX1FIPCdfXDYmIU9fJSEwN19RQDYmP1wvIzBfXyRRJDNfUSwxJF9cRChCM18nQVA/CitNX1FQOic/XDklUUtfJSEoNV9RNC8kX1w0I1EvXyQgWDFfUSwzJU9cOCdST18nUjUlX1EkNyw/XDolUldfCitNNiRFQl9WMUk9P11EOjZHXzVFQTVfWDYjP09dMTM0T18mQTQ5X1UpLjVPXV8/SDNfP1dBX19YIVc/T15WCitNTDs/X0E3UVxfWjo9Rz9cPCVRR18nIUg9X1FQOyg/XDwlUUdfSzo+RV9YOiFBP1xbLjNTXytSWE1fWDomCitNPz9ePUZJN18yNDRdX1FIOCRfXDomITdfLSJUR19bWlhPL19fXk9LX08rJlBfUjxCKE9cRCgiK18pIVw/CitNX1hWKkI/XC8iUFdfJTEgNF9bKkhJL15XSlo/XydRPDVfUVA5Ji9cPyUxQ18oIjBCX1k6NkRfXT84Ri9fCitNLSQpIV9TQSYxP1xaMjQ3Xy9EVShfVC0vMU9cMSUhN18mUTg8X1EsMSUvXDglQUdfJjE8Ol9RPDUmL1w0CitNJEE3XyYxPDlfUTg0JU9cPCZBU18lMSw1X1FANiYvXDwoMidfKUMoUV9SKEkqP1xFKyJTXyYxVExfUVw7CitNJj9cLiUyJ18oM01UX1FIPy4vXEcpQjdfKlJUSl9TMFstL1xVLiNHXytTLEtfUyRWLC9cPCw1L18qVTokCitNX1E5JENPXE4zOTdfLiUlVF9aTjhGL1w6KEFfXydBMDdfV1FbPS9eQkZJO184JTE3X143N1YvX0tXLVdfCitNK0JISF9cIyFOX15QSjovX0oqJkFfXVMtVD9eJkJYT184NklKX103NFM/Xl1OSzdfV11HN19cTyRPT15cCitNTVsrX0M4QipfViE9Ny9cUyxDJ18mQVA/X1E4OCc/XDQlIT9fJiE4OV9RKDAkX1wyJCEvXyRRJDRfUjhECitNKU9cPidCJ18mQUg9X1EwNCVfXDEkMTNfJSBcM19RMC8kX1wzJDEzXyRBKDVfUTw6Jl9cOicyW18jMSRACitNX1FAMShPXEUmQldfKVJUVV9TOFsuP100NUUvXzU1KS1fVTEwM09cOSUhQ180NFk0X1JYSyw/XEInMi9fCitNK0I0TF9WWUk7X10tMSQzX0tKNkVfUUAzJT9cNSRRO18jQFQ0X1EwLyRfXkxJWj9fPydBWl9TQFYuL1xQCitNLCJXX0VJOi1fWiY8RU9dLDJEL18nQVg7X1IsQShfXEgoUi9fTVs2WF9fX1FbP15KR0onXygxWERfUUg6CitNJz9eJUAoI19NSyZRX1EoLiQvXDglQUdfJzE4Nl9STEQpL1w5JTE/XyUxPDpfVkFCOU9cNSchU19GSVY+CitNX1NIXS9PXE4vU19fLDQpIl9TMSYxL1xaMyRDXzJFLSxfUTA1JU9cNiRRR18nITg6X1FENyZPXD4nIV9fCitNJTEsNl9RLDElL1w2JSE/XyUhKDVfUVA6Jz9cOiYhT18lMTQ4X1FIPigvXEIrUyNfJkIoRF9SKEorT1wzCitNJzI/XyhBWEBfUUg9Kj9cQS5HN18pIjkhX1JIRSgvXTE0NDtfLlNMTl9VQTkzL1xRLSJDXydCID1fUUBPCitNMy9cPzJHM18iMzldX1JJK0UvXEIvVl9fUSpeS19RMDgoL1xGKDFPXz0nMVFfWkJDRz9dKS9TT19aTU87CitNX18rPFc/XEIoIVdfR1k+NV9dOydRX15ZTjs7X1ZcXzBfWUI5Rk9dNjclW19TXEMoX1tKUkwvXzpUTSNfCitNUEtKWF9bTlNLX15FRlozXzREVS1fUihAJz9cPicyM18lITg7X1E8NSYvXDwmIUtfJCBUM19RLDAlT1wzCitNJDEzXypSREtfUkxLK09cOSZSI18lITg7X1EkMyYvXEQpMjtfLTM4V19TWF8wL10rMyRXXyoiOElfUTg4CitNJl9cTCwzJ185RkFGX1UhNDRPXFwvQ09fNVUpLV9WUUA2X11fPFZTXzxGSUhfUVg5Jz9dMDJEW18oMVBCCitNX1EgKiRPXEwpQltfOyY5Tl9VUTM0X15NSSozXyZBNDdfUTw1Ji9cLyNRS18kQSQ+X1IoPypfXDYjUUdfCitNJTEwOl9RPDgmP15CRzlXX0lJWjxfVEkoMD9dJjEjV18zREUjX1UpLDEvXV89Vy9fX18jTF9bJkVKL1w+CitNJlInXyZRTD5fUjRAKC9dVTwnI18mMTQ3X1EkLyRPXkpIWi9fTEpOS19RPDMlP1wzJTFDXydBSDxfUiRJCitNKU9eUUtKV19QO1JcX1c9XEA/XSk0NTdfMFRNLV9UKSsyX10qM1RHXyVRNDdfUSwwJU9cMiQhL18mQUA7CitNX1EwMiU/XDUkUTtfJFEkNF9RMDQlX1wyJEE3XyYxRDxfUUg6Jz9cOCYhT18mUVxBX1IgTStPXEIqQlNfCitNKFJES19RSEUrL1xDKTIvXykyOFFfUjkiPl9cPykjW18pUixBX1M0ViwvXScxM1dfNUU5K19UVS8xT1xBCitNKFInXyUyUSlfUiErPT9cKS1HV18pRD4wX1FQWTo/XlFHKUNfJTFEQV9SOEEmX10zNFUjX0cpPjFfVCBWCitNLE9fTlddX19bXUc6X1MgTipfXzlUPF9fV10jMF9XTVk9T187UzxbX0dZVj9fVDUpMl9fM1QsX19LOk5ICitNX103M1QvXlxOSz9fSFlaOV9aRj9KL1xUK1JfXychSDdfUzRYLz9cPihSL18lQUg4X1NAWi1fXFMrUydfCitNJkE4OF9XIU07L10mMSQnXyoiPEZfUzBWLS9eQkkqK18oUjRDX1VdQTdPXSozJEdfMDQtIF9TXSEvT105CitNNlVDXzNEWStfViU8NV9eOUM4Q19NWjZBX1xCVEwvXzFOKy9fVDs2Tl9cVlRJX100MFNXXyhRSEFfVTUvCitNNV9dWDxHS18+JyVbX1dZV0A/Xk5JWydfSileP19aXkZJT1w6JTE/XyVRNDhfUTw5KC9cNCUyI18oUihTCitNX1FINytPXDolUldfJFEgQl9RRDUpP1w0IyFLXyQgUDRfUzBRLC9cXy9DL18yVEBcX1NAVitfX19cXl9fCitNTVpOTl9RNDImL1w3JVFLXz03IVBfU1RYLi9cNiRBM18mITg5X1I4PydfXDslITNfJlE8OV9RNDcmT10qCitNMjRDXy0jUFhfXC5bTj9fSlZdT19YLScyX14rMFUvXzlSLENfVFwvIF9ZXjpFL1w/JlFXXyUxKDhfUSwzCitNJU9cOCVBR18kUSQ0X1FENyZPXDUkUTtfJCEgM19RIDIlP1w5JlFbXyVRRDxfUTQ1Ji9cOScxX18oIlROCitNX1IsSys/XEgqUlNfJzJIT19SNEspX1xMK0M7XykkJVdfUjRLMT9cQydSJ18pIjhEX1NcXS1PXTE0NENfCitNNzVZN19RQDkmT1wuKSQzXyY0MU5fUDhTPk9cSDI5K18nQ01LX1tORkhPXEApIlNfKTIgOl9UTSsyL15BCitNRyk7Xy5DIExfXjc2VU9fUFZNT18tQzBRX11DMFNPXz5TXF9fRkk6NF9dWy9UL15FSDovXzJEUS9fXSMpCitNUj9eTElKM19VLFssX1wiWk4vXyRPK0NfTzsuXF9TKE0rP1xSLCJXXzIkOShfWU47Ri9eOEVJJ18vM0xUCitNX1pGRUhfXFMrUldfS1pSR19UIF4tX148Rkk3Xy4zSFRfVzVWPC9cRyoiK18xNEUhX1M4WixPXSQyJCNfCitNMEQ4Xl9UOSwxL100NCRDX1JLPk9fXEpSSj9fKUw6Q19QWkZAX1tSQUVPXzVOKlNfT1pSQl9ULFcsX1w+CitNJjFXXzFUKShfUTwzJT9cPyZRV18pMiRDX1QoXjAvXF8tUzdfSFlKOl9RTDYmL1w3JTFDXyUhJDdfUTwzCitNJy9cLSMhR18lIShFX1FUOSxfXDwmIytfJlFAT19RNDIqL1w/JkMzXylCLFBfUzBSKz9cVCxCT180JTUzCitNX19fVlxPXyFNKy9fJ1FYRF9RKDQlX1w9JjE/XykhXD9fUiQ9J19cNSRRO18tIkRIX1QsWC1fXD8mQVNfCitNJkFIPV9UMSYxL1xQLiMzX1BbRlVfXyc8Vk9fR1ZdP19YPTcxX11XMFJfXzlTPDtfR0k+MV9SLEAnX1w2CitNJiFXXyVRTD1fUVxCKF9cPScyI18oIiBDX1IoQik/XEUqMk9fKTJMTV9SOEwrT1xKLCMrXysjIFJfUyhYCitNLk9cRSxDL18pQyRSX1JITys/XD8qQydfKTMgSV9SNEcrT1xEL1c3XyozJStfUjBCKS9cRyoiR18xVD0kCitNX1UxNTNfXTI1NF9fKUJAS19QXEQwL1w4MFZfXyFDKVxfUjknQ19cQy9GV19OKj5HX1MgTy0/XEspQidfCitNLFMkTl9aIjtFP1xUKyJDX1pdUz1fXl85Vk9cTCoyQ19VTFctX11PLFMvXVs8Vl9fVVw7Jl9bIktKX10qCitNMkRXX1ZdLzFfW0pPS09fKk9bW19RO0JXX1w6XE4vXylPXENfKyJASl9cIlxOT11aPScrX0w6UkdfU1RYCitNLE9eKkA3S18zRFElX1Y1PjYvXixBR1tfMSQkVl9aJkBGP1xOK1JDX0pKRkJfUlBLKS9dPjglP18wJDBbCitNX1QtJy9PXSExM1NfNiVdM19aNj5ET18pS1o7X1E6Sj9fXEpSSj9fKkxKR19RWyJEX1xKU0lfXFsrUk9fCitNL0NIXF9RXD0oL1xNKkJHXzIkRSNfVEkrMT9dMjRUV180RS0tX1RRKDFPXSsxRDtfJjE0N19RNDUmL1w3CitNJEEzXyVAWDhfUTgwJ09cNyUxW18lQSxKX1E0MSpfXDclMl9fJkFMVF9SJDovL1w+JiJTXycxUDtfUjRECitNKF9eKEBYP19fXytSX1xWXE1PXEAnUjtfJUFMQV9ULSEvT1xFKSIvXyVBMDZfUUg4Jl9eLD9XW19GSFItCitNX1IkNyZPXEAmUidfLkNcX19TNFctP15fTks3X1wuJzxfXlc/Vy9fQ1U9K19WTEsnX14nMVNPXlJKWjdfCitNL1QkX19SXFouX1xOLkNHXyszRFhfUlRZLi9cTi5DR18rU0xaX1JUWC4/XE4uM0tfLSNdIF9TKF0vT1xOCitNLlNTXytTUF1fUjhTLS9cQCsyW18nMlhEX1IkRS0vXDsqQkdfLCNAWl9SNF09L1xILFRTXydSIEFfUkRGCitNKT9cSSoyO18yRFUnX1NIXi1PXFYtU0NfJVIkUF9RXFs5X1wwLygjXydEIV9fUkhdOV9eP0ZaL18wU0BXCitNX1I8RSovXEspQiNfR1lWNl9TLE4qP19LVy1XX1tdQzlfUkxGKk9fL1FcT19ZLFsvX1tST0pPXylPW09fCitNTVsmT19UWSsyT187VExTX00qUkhfXEcgUC9fNlFcK19ULCJdX1xXJVI/XEgqIk9fUjwmX19dLyVQT18hCitNTztPXy4zVFVfWiY4RD9cSyxCO19NKlJCX1QsXSxfXi5DOCtfSClaN19VVTs1L15MSVonXzBDTFVfVV0/CitNNU9dKTMkI184Ji03X1U1ODMvXSkzJCNfUFs+Tl9dMllMT15MRUhbX09aOj9fXicoUF9fOlA8I19UW1ZfCitNX1FMNCUvXD8nIU9fN1VVOl9SOEQnX1xbL1NXXysiXFBfU0xeL19cVy5DT18uM1RbX1VZQDdPXT84JidfCitNMlRNLl9RMDAmL1w0I1FPXyNRMDBfUUQ3Kk9cNiQyV18lUSxNX1E0NCw/XDMkQz9fLjM1K19TLFIuP10kCitNMUQzXzBUNSNfXScoUi9fX1xfP19TS1JZX1FcPCo/XDwnUk9fMyRFKF9RUDsmT1w5JVFHXyYxPDpfUVA2CitNJ09cQCZCK18nITw9X1FANiY/XSczJFNfLzNcXV9bXlpNP19MVz1DX1wtVzdfXSJdTV9fSFVdJ19YLScrCitNX1pOSkhfXFkwJCNfK1NMX19SQFAsT1xMLTM3XyozNFRfUkBULF9cRyxTK18pIlxQX1IsTitfXEMrQl9fCitNKEJUTl9SOFEsT1xLLUM/XypDNFZfUjxSLF9cTC1CV18tNDU5X1EgPilfXD8oMjNfKzRBXl9SSFQzX1xDCitNKFI7XysiQEpfUlxNKU9dODVUU184Vik3X1VRODVPXC0lQj9fIyI5MV9RJFo/L1w+MSgrXylTRT9fWypNCitNTF9cSylCQ18nQVRDX1IwPyY/XjxHKS9fLDJcSF9eW0JXP19RVl1TXy4zPFpfXEskUi9fP1MsU19OOlJHCitNX1wmV0xfXyBOS0NfNERdLl9dSzFSX15cTSsjX05LLlNfXFMjTz9fNlIsN19TTDsqX1I0RSovXyxRLCtfCitNVkxTKV9VTTM0P1xZLiMnX1A7VlVfUihHJl9eID83K18uM1BQX1s+XEwvXT02JStfSTlaOF9ZQi9CP11ZCitNOzZDXzEkMFtfVSk1Mj9dKjM0J18xNEBcX1YlQTVPXyZOKl9fW10vLF9eIydQL19FUktfX1wtPzBfXSsjCitNUF9cQCVBX18lMSA2X1FANCVPXEUoQidfK1JUSl9RODMkT1xVLDMvXzBTXSFfUUg2Ji9cRigyJ182JS0zCitNX1c1UDxPXitBOEdfJEFUOF9RQDQuX1xMJ1VLXychSSFfUUA5LE9cMyQiV18mMThaX1I8RTFPXFIsJCNfCitNKUI0S19SPEcqT1xIKjJLX1YsSytfX1tPXC9fJk0rI18vQ1ElX1IwSCwvXDglQS9fJiE8Nl9RNDMlP1w1CitNJFE7X0hJVj9fWl5HSk9cOSUhQ18lQTg5X1I0SipPXFUtUzdfTTsiS19dUy1SL19AVD0nX0NYOiZfVklFCitNOT9dPTclT18yNF0rX1JMVi1fXE4uQ19fK0M4Wl9SSFMsX1xKLUM3XylDKFFfUihOKz9cRiwzK18oQlROCitNX1IoTStPXEMrQl9fJUFYQF9RTEMpP1w9KTI/XygiQEpfUlxRKi9cRDAlT18jITxPX1IkPSdfXEAuVydfCitNKSJVK19RSDknX1xDJ0IrXydRTDlfU0RXLC9dKjIkI18zJD0nX1E0OStPXDwrNSdfJzM9Q19SRSA6T1w/CitNKjQzXzZFMThfUkBFKl9cPygiP18nQUg8X1IwQikvXEgpQi9fWU1TOF9eXzxXL10jMFQ7XzpWOUpfXUMpCitNUj9eX0xKV19NWlZJX1wyXk8vXTEzRFdfVFxLJF9bVlNLX15ISTozX1JMNl9fWyZFSD9fJE8sI18rMlRQCitNX1s+T0s/Xz5ULFdfLFJAR19aJjxFT100NSRPXzpGST9fXCJWSy9cVi5SX19HOio2X1QkXy4vXltOSy9fCitNMDNcWF9aWklIX100NSRPXy5TWFJfVTk5Mz9dMjU0R18zRFUiX10/J09PX1RVPF9fWkxfKF9dOl9OT15JCitNRVkvXzIjXF9fUSwwJU9cNSRBQ18mMTA4X1E8MyU/XFArMlNfJUEsMl9RVDkmX1xHKFI3XyYhMDZfUVA5CitNJi9cTSoiQ18zREUrX1lONUY/XC8iU19fSVorLF9bOlNPX15OSF1DXyUhJFxfUiA+L19cSSlEL184Ri1OCitNX1NIWy8vXEYpQkdfKSIsSl9SUEwrX18yUkxDX19fK01fWDFSOi9cNiUhP18lITg7X1VZPTVPXSkxVDNfCitNJyFAOl9RUDcmX1xCJTEzXycxJCxfUUw2JU9cNCUhP18kUUA4X1JETSpfXktJSjtfV10jK19bKktKX1xQCitNLSM7XypDKFRfUkxYLj9cSi1DL18rU1BdX1JIVi5fXEssUz9fKjMoUl9SRFUtL1xELCJfXykjIE9fUkhSCitNLS9cSixDM18oIkBKX1FAQykvXDooQjNfKCI4SF9SQE4sL1xGKyJbXysiUENfUVBbNz9cJyRSW18nMTQ4CitNX1FUVzwvXEcsVStfKVI0SF9RWDknX1xEJ1IvXydRUDtfUjBDKE9cSClCR18oUVBDX1FUOykvXEMoUlNfCitNKFIgP19RUD0qL1xIKFI/XylCNEtfUlBILC9cUysjL18rQkRNX1M8VS4vXzVTLFNfWi07M19YWi9EL145CitNRSlDX1UsNyVfXD5YTF9eTkkqI19RS1pcX1VZOTY/XyxQS1tfRChKKF9UPSgyP18nUTwjXyxCSEhfXFMkCitNUi9cRCkiP19OKyJMX11DKlFfXy5QPCNfQSdVV19SKEQmX18qUUtbXzIjUFVfWlJMSF9eTEsqL18sIlxICitNX1pOTEk/XFcuUy9fRCkqKV9TXF8tL10kMTNDXzw3JURfVjlHNk9eMUJYL19WLDZfX11bIk9fXklEOFtfCitNKVFAOF9SRD0oL1wyIzBfXyQwXCxfUkxLJy9cUi0xX18sMzA9X1JcUyc/XE4sIldfLEMsVF9TJFIsX1xRCitNLEMvXypCREhfUTQzJT9cOCVBQ18zRFEvX1E0OC5fXkFHKztfOUYlPF9aPkJOT1w8JlNfXyhSKF9fVU07CitNO09cUy4jK18uM1RVX1IgPyk/XEsqIzNfOTYxSl9cQyJQL19UWk8zXzVUOSZfUjRBKj9cOycyN18nMVA7CitNX1FENyZPXDsmIVtfJlE8QF9RUDgoP1w7JVFfXyYxODxfUUQ3Jk9cQCdCJ18mUUg5X1FIOCU/XFIqIk9fCitNVkxbKl9URTI0T1xVLzQnXy0zVF9fUyRcLz9cTy1TR18qQyhUX1I8Tyw/XD8pUkdfJlIsRV9RREEoX1w5CitNKDIvXygiMEZfUVA+KD9cNycxX18mMiRDX1FIRSlPXD4qMktfKDJQTV9SJEwrP1xOLTJHXy1URUVfUSQ5CitNKj9cOiYxQ18oQlEuX1JMVDE/XEAoQiNfJ0FIQ19RXEEpT1xCKTI7XyhSOEdfUkBNKz9cUC0zL18sQzRWCitNX1MwUy4/XFwuJCdfL0M4WV9VQTMzT14mP0dLX00qQktfXCZcT09eRkZZM18xVDEqX14zPVc/X1JWXTtfCitNPjcxVF9dSzJVP185UixDX1QrTllfWClaPU9fJE4rR18pQiRDX1wrIVAvXTAzRSdfLSM4W19bXl1PX10/CitNNzVfX08rJlhfUkxHKj9eW0xKU19XTFsrX1YlOTVfXFYtMltfUjw2XV9WPUY3X1xfLkMzX1BbSlRfU0RXCitNLC9eTkhJV187Jjk+X1NIWitfXVQ9Jj9fOjY9OF9YIVs6P11XO1VPXz0nIUFfUlhJKS9cQCZRT18kUFgyCitNX1EkMCVPXDMlITdfJiE0O19RQDIlT1w3JEBTXy1TJEFfU0xXKD9cVC0iJ18tQzBMX1E8NiU/XEQoQjNfCitNKSIoRF9SJD8oP1w3JTFDXyRBIDNfUSwzJU9cPygyM18hQEhQX1M8TjhfXlRIXUdfMTNBS19VJSw5L1w8CitNJjI3Xy9EJSZfUUxAJ09cTSwyX19HOVZGX1dNWUI/XEoqUytfUSteWl9fI0ZbX10iK0I7Xy1STERfUzBLCitNKT9cXCsyP18xMzhQX1NASygvXSQuIkdfM0NUUF9VNSItT105MiNDXzpVTShfVzk8M09eIzlUU19AVlkxCitNX1g1XD0/X0FTXFNfUkw7KF9TPFkvT1xDKjJPXyhSTE1fUlBSLS9cRysyX18pMkxNX1IoSCpPXDooIitfCitNKFJES19QXDUlX1xDKTJDXyNRJDRfUUxBKF9cOSgyL18mUixFX1FcRyo/XEIqQlNfKTJUT19SRF0rT11ICitNO1dPXylSLFNfUVRGKz9cQCo0J18pMy0qX1E4QSxPXF0uI1tfMFNcXV9XIUw6T15GR0lTX1JbWl1fXTcqCitNUj9fRlVdJ19bPT8vX15bM1RPX01WLTtfWj07LF9dRylPX1xHKSIvXyoiTFBfWiI3RC9dODRVN19ZLU87CitNX15TNFQ/XVo9NzdfVDxHLF9dQydRX185UUw7XyhSID9fW15aTy9dLjNFJ19AWCVcX1lKNkUvXjtGOU9fCitNUlw/JV9XOVc8P18hTitDXypCOEhfW0pRSl9fQFQsV19MKkJGX1wnIE4/XUg5JVNfLyM8UV9aSkhIP10zCitNM0RDXy1DME1fXCJbTT9cUitCO19QO1pTX1dJVzpfXVs+NktfP1dFSV9XUVY5T1xcLkMvXy0jRFVfUFw1CitNJD9cQCkiK18mUVA9X1IoQChPXEgpQkNfKVI4RV9SQEYoP1xXLTMjXycxSDVfUjBAJ09dKjFUO18kQSAzCitNX1EoMCRfXDclMUNfJEEgM19RODQlX1w1JFE7XyQxJDRfUUA6Jz9cXTBDW18oUjxWX1VRPjxfXj1EOFNfCitNOyYtPV9USSUxP14xRSk3XyxTUFxfVDkrMj9eMUQ5S18nQVBMX1JASSwvXjBDWENfX15fQl9bUjI6T15ZCitNQ1YnX0s4RTxfWlojNT9eV0JVX19NKEU5X1syKzVfXldCVUdfTyhZO19bPio1L15XQlUvX084RTdfWkYgCitNNU9eMT41W19WLEpbX14zMVJfXEwrMltfJFE0Ol9RKDYmL1w2JkFTXyRRNDhfUkBKKz9cMCRBN18pUkRMCitNX1FEOydPXEYqIk9fJSE4OV9SNEcqT1wxJFE7XyZSJENfUUhCKS9cPykyP18oMjxJX1IsSSpfXEkrUydfCitNKyNMWl9SIEIqP1xAK0Q/Xy5ERUxfUkRZOT9dMzdYM19TTEM2X11fLVI/X0lULE9fXC0zMV9fNzlVT19VCitNVj07X1xNOzlfXzM2VS9fS1UsX19YXU8/X1hWL0dPXy9RXE9fM0NQWF9TKFEtX1w3KEJHX0dJQi5fVzVLCitNOV9fRVY9U19cLUM1X1dVWD4vXypQTDdfVjxDKF9dWypRT14qQTdfX1NcPyNfVz1VPE9fKlFLW18/Rz1RCitNX1haKkIvXyhPW0NfO1ZdRl9bXldMX1xDKCFfX05bJk1fXVsuUl9dXz1XN18zVFknX1NIVitPXyFOSzNfCitNPzdNVF9TJFAqP15TS0pDXzM0USVfV0FWO09eIT42X189VylGX1dZWjpfXVs9JjtfOyY5PF9RXD0nX10wCitNMyRLXzRUTSdfUiQ7Jj9cQCZRT18rQkRNX1NQXC4/XTA0VFdfLSM8WF9RXEMoP1w7JzIrXyRAWDZfUVA4CitNJk9cOyYxU18mMTg8X1FINyc/XDYkUUdfJiE4OV9RQDYmP1w2JUFHXyYhSD1fVSEkNj9dJS9EQ184JVk5CitNX1tGR0w/XE4oUkNfR0lOOl9ZXkBIP1xDKUI/XyoiUEpfWEYpRE9cRykzN18pUkBPX1MwWC1PX19cLi9fCitNUylVTV9cSjo5X18rRyY3X1BZMTpfXDo0Nl9fIkQlP19QOF04X1wiMzVfXyBDVVNfUDhRNl9bWjA0X15JCitNPzRPXzFCXDhfViVDOD9fLFE8N19XPSctX1FYRylfXDAlMUtfJzFcRF9RUEAoT1w4JkFXXylSRExfUTA4CitNJk9cRypSV18mMVQ/X1JESytPXDUlUUtfKiJIT19RKDQmP1w9KCI3XydCKERfUixIKi9cTCwzJ18sQ0BaCitNX1JMUC0/XF0wVE9fSDoqTV9SQF02T109OUhfX1Y8Uz9fXyM5Vk9fVVU8T19cLUc6X18jOlYvX1FWPTtfCitNW01TOF9eX0BWX19NWD1DX1hdQzdfVVVFQT9cXjQ5P18rNFFcX1tXI1RfXTAxJD9fM0RRNV9RVEgrX14/CitNRjhfXz9HNU9fXjc5Vy9fTFRdK180RF0uX1QoXS9fXzhSPEdfWU0nLF9ZSi9BL18rUDs/XypCQEFfW15ZCitNS19eLkE3W189VylMX1w6Xk0vXT43RSdfQCdJUl9SKEAmX15RSkozX1gsWytfWDFZPi9eSEhZV19NOyZJCitNX1MoUCovXFYtMltfTztSVV9aMj9GT1xDKSFXX0Y5Ni1fVyVFNy9dVTtGK186Vjk6X1dFVDovXEAnMUNfCitNJzFcQl9RRDclL1xeLzM7XywjLE1fVFUzM19dRzk2P184Rik/X1Q5KzE/XEkrQltfKEJESV9SSE0sT1w4CitNJVFbXyZRRDtfWUoyRT9eQEYpT19IWU4+X1paRko/XlNKSktfTlsqUl9bUlVNP18kT1tfX1EsWl1fVU1ACitNNk9dODY2I19KWy5PX1JMTSwvXjZESUtfLDJQUF9TOFItL11XPTc/X0I4RjRfUjBCLE9cPSdCN18rMyxVCitNX19fVFtPXzRGVidfUylZUV9bWiUwX18iRFVXX09ZITZfXDI1Nl9fIEQ1P19PWSU3X1teLDVfXyFENStfCitNREZRJV9SVDsjP108NFUvXzgmITdfXSsnUC9fPVNMX18qUyRTX1JUUi4vXF4wJDdfKTJES19SOEgqX1xNCitNLFM3XyhCSExfUjBMK09cNichW18rIyBSX1EwNiY/XEkqUyNfJSEsOV9TMFMuP1xBJ1IrXyYhWEBfUixLCitNKz9cRitDK18qUyBWX1NAVC1PXzRSPFtfWCxfN19eRzdVL19NVj0nX1w9SzVfXyc5VU9fU1ZNR19eLVM5CitNX18vN1RfX0FSPDtfXi4vP19aLjlFP1xWLFQjXyk1Mi5fUVhTQD9cSzRYS19QPCstX1U9MDVfXEcmIi9fCitNPSdBWl9ZXjdDP14nQEdXX1c9LzZfXVspU09cOScxX19GOT45X1xbIFA/XzhRXD9fOUVFNF9cXylQP1xICitNKVI7XzE0KF1fWClbPT9cXi8jN182VUkzX1QkXC1fXDMkMFNfIyBIJ19aSkJIL18uUFwrX1ErUlhfVSEuCitNMV9dIDEjT182RTEsX1s6Skk/XSowU1dfKyJURl9bPlBJL14iPiZLX0U4TiBfWTIpP09dQTY0X18rUlRKCitNX1NAWzAvXUE4VjtfOEY1P19VLTQzP1xSLDJLXzMkSSNfUlhMKj9cUi0jK18oUkhKX1FEPSdfXDsnMiNfCitNJVFEPF9RXEEpL1xNK1MrX0VYVilfWiY0Q19eQ0VJJ19GWFopX1k2LEFPXjFCKCtfQygtXV9YUiM/P14kCitNPzc/XypCOEhfViVBOk9eVkxLT18sQlhWX1haK0Q/XDYlIT9fJCBYMF9YNV9AX11aPTgnXypCRFpfUkRJCitNLE9dLDQ1O19fXydLX1w2LDRPXyBERjdfU1k5NF9cKjM3P18pRjYrX1IpQUFfXDY1N09fKkVVO19SKUVJCitNX1YhJSgvXEYmQTdfKEFQQF9SJD8qL10vM1RTX1NcLlxfXj82VU9cTyxTN18lUURAX1FUPChPXEMpUkdfCitNJlFUQF9SLEkqX1xQLiNLXyoiXE9fUUA9Jz9cSytCX18mIUQ6X1NMXC1PXSYyNC9fKjMgUF9RREMpX1w8CitNKFJfXyhSOFFfUzhTLj9fMVIsQ19aLTsyX15XOlUvX1ZXXUtfXi1fOl9fKzxVL19TVy0/X11dTzhfXzs3CitNVV9fTFUtJ19RSyZPX1I0OScvXE8qMydfOUZBT19RIDQqP1xBNVknXykjTihfUi0sQi9eXU88U183VUE/CitNX1ZBNzlfXD8oQj9fSElKMF9ZIitBT189VF07X1Y8Ry1fU0khMD9fJVBMJ19XTE8rX1xGXU9PXFotUztfCitNJyFUPl9RWDsoP1xHKEI7XykiIEJfUVA6Jy9cOSZBT18oIVRDX1FAOCZfXDclMUNfPDY9Sl9YTiNBT14+CitNRjlHXz0nIU5fWk5ISF9fLk8rQ18rQkBAX1JcUik/XydPOltfR1hdXF9ZTi4/P14xQignXzc1UTtfVFkxCitNNU9cWTA0T18tM10qX1NEXjEvXEksMltfK1M8U19TWSMvX1xcL0NPXyhSKEFfUlhTLF9cRytTJ18qMlhTCitNX1FUQShfXEEpUkdfJ1I8SV9STFguP11COSY/XzxHIVNfVlVLO09dSDlGR184JjFGX1VBPjgvXTQ2RVNfCitNNCU5OF9VJTI0X10vM0U3XzlGOVVfWl5JTV9dWD0nV19CKDYrX1g6JEFfXklJWkdfQkgyKF9XXVpBT1xFCitNKSM3Xy4jQSFfVlFOPD9fX10uW19VWVlEX1xaQDxfXzZHNU9fUzlVSl9cSjk5L18sRlY7X1M5UUdfWzovCitNN09dQC9TX18nMSBDX1FcQSdfXTY0JENfOkYxSF9TXSAuP18zUVwjX1ldLzVfU0BaLz9cPSciL18mMTg8CitNX1JUUSxfXFYuI09fKVJUT19SRFEsX1xNLEMrXyUhQDZfUzRXLT9dJTEkL18rQlxQX1EwNCVfXDsnMiNfCitNKkJQT19VLS41L18vUSxHX1pdQzhfXzM9Vi9fV1ctN19dXVcyX187PFRfX1lXPUtfXC0/Ml9eXzhUX19KCitNVT0nX0lJMjFfV0VRPS9cUytDM18rMlxXX1ZZVD9PXU07VytfJ0IgT19RQSxBP1xBLyhHXykkUipfW1pfCitNUk9dXD1XP18oUSxBX1EgMyYvXjpESENfQVgpXV9dIyZSP18/UjxPX0ZZVjtfXEclUF9fNFEsJ19WPEslCitNX1NMUy1PXDUlUVtfJiFAO19SNEMpT1w+J0InXygyLEZfUkRNK19cSCpDJ18zRSU2X1E0NiVfXjFCOD9fCitNVFwjIF9dIl1PP15ERikzXzMkLF1fVC0kLz9dMzVUW19CSDFcX1lSK0E/XUk4VidfNkVJPV9TUSQzT1xXCitNMSU3Xy1UPTtfUyUiNj9cWjI1U18sU1EjX1JIUCxPXEEpUkdfLUNIXF9RODgmX1xHKVJLXyxDQFpfUyxfCitNMF9cSyxDQ18rQ0heX1JQVy4vXDkoMi9fKiJQTl9dSzJVP187VE0rX1g9QzhfXVs1VT9fSFY9S19ZXTc3CitNX15DNlYvX0dVPT9fXS4vQ19dMylTT11YPFdfX0wqVllfV0lWP09eID84L19MWyZUX1pWS0s/XiI/KCNfCitNQSdeK19SPEYtX1xFKTJbXzsmSUxfX19SWj9fP0omW19RKUVNX11WRjlPXydGVkdfU0lJSF9cLjA2X15fCitNREZHXzAhXFdfUyRCMD9cLSUhM18nMUw9X1lGKUAvXi1AN1NfM0RNIF9dOylRL19RVl1TXy0jPFhfUiA/CitNKT9cOiVRV18rIyBSX1EsNSZPXEEpMj9fJyIsQ19TIFUsP10kMjQvXyxDKE9fUUg4JT9cSClSW18mUTw/CitNX1ZZRTsvXz1TTStfXS1bPF9fRz9XL19YVy1DX19eIzxfX0M8Vi9fWFdNN19dXV82X18nOFY/X1FVXTNfCitNO0VJNl9TJEgoT1xNKVFfXysiQEpfUlREJ09cSigxS18tMyBLX1JAQiZPXDwnMkNfJzRSIl9SQSZEL1xGCitNMzhDX088KyhfWTo0Qz9cRCYyI18mIUg/X1heKT9fXidBJ19fUlwrIl9dVyRRP15cTTs3X1IsKyBfXSckCitNT19fOVErX182NFErX1JATCtPXEIpUj9fJ1IoQ19RPDomX1w/KSIzXytTOFZfUSw4Jz9cMyYxT18lMUQ3CitNX1M8UisvXy5QO1NfUDtGVV9TRFssT11bQSc/X0NYVihfUlhAJz9cPCUhK18jMVA8X1JdIDNPXFUxNTdfCitNLVRNQV9TKSc4X1xOMFVfXyw0OT5fUyUiNj9cVC8kO18lQUA7X1EwNic/XFotU1dfJjE4PF9RPDknT1xPCitNLVNPXycyRE1fUiRKLD9cQywzM18oUyBRX1MgUi0/XEspMkdfWV0vL19fKztVT19PVk03X11eKz1fXz9CCitNV09fWlk+J19dPiM7X18/Qlc/X11YTU9fU1tGWl9WQUI6T15JSlsjX0Q4VjVfV1lbQD9eWE07T19JWjZICitNX1ZVRzpfXVo9WC9fKFIwVV9SQEksL1xJKVJHX19fN0tfXUZFOy9fLUlHU19WSjFBX1xKQTgvXyVFNVtfCitNTzkxQ19RXC0gL1xAJiNLXywiSSZfUkhJLC9cXC8jR18zVEklX1NEVCtPXF0tMydfVSwzIV9eVzlVP1xWCitNLlNHXyhSQE1fUjBEKV9cTSxDK18lQUg4X1MkUyw/XF8vQ1dfKzMoUl9SKEYqL1xHKjJTXycxQD5fVlFGCitNOS9fJE1bK19bTTszX18nN1UvX1ZXPUNfXF1bOV9fJz5WL19YV11LX1tNTzNfX0c8Vi9fQlRdL180REkuCitNX1FUOykvXEwtVENfJyIoTF9WTUI2X1xAKyRHXyoyMERfUjxJKU9cUy81K18pUjxUX1FATTFPXF06KVNfCitNLFVCOV9SVStAX18kUU03X0dJWjtfUVQ1Ji9cOSVRS19ASDVZX1g+JUBPXylPW09fVUxDJV9bUk9NL11KCitNOCYvX1Q8NyFfXFJdTi9dTTlWN18pQkBLX1IoRys/XFYuM1tfKUJITF9USS40L1xbL1QnXzFUUSxfU0xeCitNL19cQCgyK18nUVQ/X107KlM/XyZPK19fJkE4OF9RWDonL1xRLUNPXypCMEhfUTg+KE9cTi9UV18sM104CitNX1NFIzM/XF00JitfLCQxQF9SOFMxT1wxJVFfXy5EPThfUlhZMS9cPSZBR18qUyBcX1JQTCtfXUE4NjNfCitNKyMwXl9TPSExP1xAKyJPXysjNFtfUjBRLU9cSy1TT18pQlBOX1JUSys/X0dWLS9fW11LNV9fKz1WP19VCitNV11XX14uJ0JfXztAV09fVlg9V19eLic8X19fR1gvX0ZVPTdfPEclWF9aVk9NL145RSlLXzw2UVJfWyJLCitNTD9eSEhaR19AR1VfX1VJPDkvXD8pQzNfLCMkWF9YTixDP19dXC5PX1g6TVFfXFpDPF9fPUhVW19WSj1LCitNX1pWJTpfXEgmUTtfJiEsN19RICklP1w4JFFHXy1DLE5fU0RUK19cUSoyP18mUTw1X1MgSylPXytPO0tfCitNWz1POF9TRF4vT1w8KDI/XyghXEVfUyRXK19dJzJUK18sUzBOX1FQOSYvXEkpMj9fKVIgQF9YVV8/L184CitNUFtbX1tNQy9fXz89VS9fW1ddP19cXVc0X19DPlU/X1RXTTdfXE4rOF9fN0JWL19BU1xPX1YsNytfU1EkCitNNS9cTTA1N18uVDU6X1I9ITsvXDcoIltfR1kuJF9SIFE1P107NzYzXyVRWERfUUxTNk9cQywkR18kQlEtCitNX1I9NkM/XEw2OUdfLDRWJl9bWl5TP15OTCpXXzAjQFtfUUQ0Ji9eIUEnQ19AJ1lbX1w6XE4vXzVRTCdfCitNTkpaUV9YJVk/P18mTztXX1I7Vl5fVDEgME9cLyUxP18mIUhBX1IsRyo/XDMlUUdfJSFAOl9RQDwnT1wxCitNJSE3XydBXEBfUyRPLD9cWS0zP18tQyRXX1NAWTAvXFcuNCNfJyFMQl9SOE8rX1xCKDI/XycySFdfUlReCitNNU9cUS9FJ18pMkhPX1FYSC1fXSUzVjNfRUk2O19aWklJL11XP0hLXywjSShfWypNSz9cWS9UR18wNCkjCitNX10nLVNfXFAtI1NfLTNVIV9RTEQpL1xMLFNHXygiVFJfUyRdMD9cOCdCI18lMTg3X11fMFJfX1JXPUNfCitNXT1POF9fRzxWX19XVl1XX11NVz5fXyM5Vk9fT1ZNQ19bXUc3X1lKLkQ/XiRBSFdfSipOUF9aIjtHX11GCitNODY3X0sqPktfWjpBST9dUztHI18kMSg9X1IgRi1PXE4rQz9fSDlWP19fU1BaX189SVZXX1JKIVJfXDo3CitNNz9eTkQnS18uMihTX1FYNy0/XEspJCtfKiIkU19RUDcnP1w/JkFLXyghRDlfUUgzJk9cPSYhU18qMjRDCitNX1xbIk8/X1NXLT9fL1NUWl9TRFcuP11BNkVLXy1DQFVfUVA8Jj9cRykyK18rUkhKX1lCLEE/XkZFSFdfCitNVFtWVF9eXzNSX19FU1w7X1wtQy9fXlcxUj9fTFVMV19cTTszX14rKVIvXlJIKVdfTio6Q19UOFotT182CitNU01DXy0kPTlfUzEuNy9cWy9ER18uJToiX1FcPyhPXlFGR1dfKTNNQl9ULSUzL1xaL1NfXycjJTRfUThACitNLS9cQCxEW18lU0FNX1I9LEM/XEwwJ0tfTltHKV9YKipBT1xEKCIrXyYhLDdfVz1aO09dVj0nJ19NOk5HCitNX10/J09PXl5MOyNfOCVNP19VKS0zX15QSkpbX0IoSi9fUiRGKl9cPCdSM18mMVQ/X1JUUSxfXFItQ0NfCitNKVJMTV9SNEYpX1w+JyFbXydRTD1fWUY0RU9cWC1TV18xRE0xX1JcVC5PXDckUU9fKCIwQl9SJD4pL1xBCitNK0NPXywkITBfU0RbMF9eSUhKK19IKipRX1RVNzlPXVs+V1tfWU4jPl9ZKjlJX1xWL1RXX1BbQldfU0BdCitNMF9cWS9DU19TLEMmX1M8WTA/XFovVDNfJkIkQV9TIFUuX1wzJkIjXydCLEhfUlBKKz9cSSgyM19ZXS8vCitNX15XOFRfX0tWPTdfXE4zQV9fS0RXL19WVz07X1w9UzdfXVssUi9fSVVdR18yNC0rX1dSJUMvXjhGWiNfCitNSTouRV9USSYyL15ESCorX0hJWkBfV0VTPV9cRylTM18oUkBaX1JQTC1fXk1JOkNfX18rSV9dRkM6T18gCitNRVZXXz81UFhfUVQ7JU9cMSNBT18lISQ+X1FEMSk/XFQrRCtfJCBUOV9RODQlX1w4JFFHXyUgVDVfUSgvCitNJT9cSyoiP19RO05XX18jNlM/XktISU9fOlY1Q19SLDklP1xFKCIzXyYxMDpfUSwuJC9cPCVRP18kQFQtCitNX1IoPSdfXD8mIV9fKFFQRF9SSD8nT1xUKSInXy4iLEFfUlg8Jj9cRyYxS18oQVQ/X1FUQigvXVU+Nz9fCitNMFQ1I19dOzFUX106OldPXyZCOEpfUTg5KS9cRjNIO18mQVxLX1cpQjRPXD0tJVtfPFctXF9VOTUzT1xCCitNLCQ/XzcmKUxfUkRQMU9cKydUU18oQ1FbX1JAWj0vXlhNPD9fNzYtP19TPFguP1w0JEE3Xz0nOU1fVSkwCitNMz9dRzdVT19UPCpcX1tKT0tPXSoyJEtfQig2JF9YQiNBX10qMyUnXysjJFZfUlRQLT9cRSoyT18qMkxOCitNX1IkQylPXDMlQT9fJlFUO19RXD0nX1w/JlFXX0JYMiRfUyxTLU9cUS0jR18qUlxRX1FAMyVfXDQkQF9fCitNKCFMP19RUEYsL1xAKyMvX087PltfXkM7Vk9dXD84W18vJFE2X1clWD9PXz9WTVtfLVNVLV9TOF0yX18nCitNTls/XzA0OSxfU0RfLl9fOFRNI18sQyxaX1MoVS5PXEsrUydfKlJUVF9SSEosX1w7JzIrX08rMlhfWDFYCitNPl9fQ1NMR19EN1VVX1NYVStfXSYxI19fXE4nNF9ZXic+L15MRkhTX0BXPU5fXV8wVS9dITAkP183NjlNCitNX1QhIzIvXjtGOU9fJjE0N19ZSjZGL15HSFo3XzwmTU9fUihCLD9cRSojS18rUlxYX1paRkpPX19bTTtfCitNUVlNU19TWD4hL1w8JTE3XyYxMDhfUTQwJS9cNyRBO18lQSQ1X1EsMSUvXDYlIT9fJTEsNl9RNDMlT1w0CitNJEEzXyUhLDlfUUQ0Ji9eXkxKW19aLTctX1ZJPTYvXEUnIVNfMkQgXF9USSUxP1w5JTE/XyVBKDRfUUg2CitNJi9dMTJUX18tMlxTX1I4QCkvXFksUz9fJUEkNV9RPDIlT1w5JSFDXyZBNDlfUUw5Jy9cNSYxT18uRDEhCitNX1UlNjQvXFItVC9fWy1PLl9TNSM2L1xHKFInXyQhOEZfUzE6Qz9cOyZSS180VCBYX1FUSTFPXDknIltfCitNJkFIPV9RND0sP1w7KTMjXycyIFlfUSA8Lj9cQy1WM18oI1VXX1pWUVFPXjJDOF9fKzJcVF9RODkmT11QCitNPEZfXy0jNE9fVEEmL19fK05bQ19LWjZIX1JESyo/XSAuUzdfTlsuT19YRiRBL11dP0dfXyoyVE9fUUw/CitNKD9cPiZSJ18pUihEX1RBIy8/XDkmQTNfJDEkNF9SREcqT14mP0dTXytSVFBfUSw2Jl9cMCRRM18qQlhMCitNX1Y9Rjk/XFAsMytfJzIgRV9TRF4xL1xVLFM7XysyUEtfVCEjNT9cUTA0S19ASSIvX11XOVZfXFAtJEdfCitNLUQhL19bXldMX1xVLkQjXy8kJF9fXFcpUV9cTywzQ18tQzxeX1NYXjFfXEcqQzdfKTI0Ul9RREIqL14nCitNQEgzX006WlVfXVszUi9eJjw2N180VSknX1JUTCk/Xz9ULE9fQ0dFTV9aRjhCL11IOSVTX1RMKyZfU10hCitNMi9cVi5EK18wVCkoX1lCNkYvXEInQiNfRTkmM19ZPjNFP11KOiZPXykyNFBfUiRDLE9cVC0jP19LOkJOCitNX19fTVgvXEwnUFtfJ1FQQl9RVDooL1xBJ0FXXydBRD1fUUQ0Ji9cOSUhQ18lQTA3X1IgPig/XE8rMyNfCitNLVM0WF9TRFswL1xfMCQ/XzVFJTdfXDpZTS9fTlZdL19CR1FZX1Q0Vi5PXEklUUdfJUBcL19RLC8kP1w4CitNJSE7XzclQTpfVk1FOj9dPTVVT18yJCkmX1VNNTY/XTU0JTNfJTEgNF9RWDknP1wyIzEnX0M4PiVfWlZFCitNSF9eXU4rL19OKyJMX1o2REpfXyJMOjNfNEYpXF9SLEAnX1wzJjIvXzFFTitfUUQ7KF9dPjRUQ18kUUBRCitNX1FIPCpfXDIkQTdfJUFUS19SSFMuT1w1JVJTXyNBNElfUSA7Lz9cQzA3R19IWkZfX1hKIkFPXEkoMk9fCitNJTEsNl9WOUU5L1xCKEFfXyxTME5fWFolP19eQkcpS18lUTQ3X1JIRyhPXihAJ1NfQyg2JV9RXDonL1w5CitNJVFLXyVBMDZfUTA0JV9cOCUxM18sMjg/X1Y1PTY/XTg0VT9fLSMoVV9YQiA/T101NDRfX0AoKV9fWDooCitNQT9cVy8jQ18mIUxAX1YtQzlPXU46NkdfTCpSTl9bVlpOP11XPVZbXy5TWSNfU0EjMS9dXEIoN19XLUM6CitNX1NEXTRPXFEuVEtfT0s6Ul9TLFgvT1xeMFQnX1NcTylfUyhULl9dIjBUS18tUz0gX1JUUC5fXEUqIy9fCitNKFJUUV9bUlNMX15WSlsjX1gtLyZfWEFOOC9dMjIzT184RUEtX18nPFVfXi8+RltfRyhdXl9WRUM2X180CitNUSxDXy4jSSFfU0BcMS9cXi80L19EKFowX1IgPCdPXT42RVNfLSMgUl9WVUs7T1xGKUMnXygyLFJfUyxTCitNLU9eT0pLI19eLT9IX1FAOiYvXDYkQU9fJiBYN19RMDIlL1w1JCEzXyRQWDJfUUAzJV9cWS1TS18vU1UgCitNX1RJKDJfXSUwVDtfMCQpKV9ULSUzP10nMERDX1QrXllfXlc3U19eJD03O18oIUA8X1FQNyY/XDckUTdfCitNJiEwNl9SXEsrP10sMiRLXzZVNTlfVFEmMk9cNCNBK18oUVRBX1MkTCwvXSAuU19fJkE0OV9RMC8kX15aCitNS1pDX1E7JklfWiIpQS9eIDsmQ186Vi1GX1tCRkYvXFMxRjNfJiFEOl9RKDcnL1xDKUUjXyUxQD1fVVE4CitNMj9cOiYiT18nMVRIX1FIOCZPXDYmIiNfKFJQUl9RODYpP1w0JUFbXyYhUFFfUihaOl9eNEVaQ19JKU47CitNX1QsXjBPXDwlQUtfMDNRIF9RSDgmT1w7JzFLXzJEQSBfWiY+Rj9cOiVBQ18rIkxKX1QhIC8/XFIrUltfCitNJFBcMV9RSDUmP1w+JlFLXyoiUEpfVkVJOU9dQjRER19NWkpFX1wqWk9PXEUoIjNfOVVdPV9ZXjdEX19CCitNV01TXzw3LVFfVE0vND9cVi4jV183VUk1X1YpNjQ/XS8zNSNfNiUpNl9UVS0wT10rMkRHXyYxUD1fVzVeCitNP09fPVY9T18vJCE1X1JIVDBfXl9NWy9fMSRFL19TQF0uX18vUlxHXyoyTFJfU1ReMT9dIDAkR18qUlhZCitNX1I4TC0vXDkpIjdfUDs6VV9cKlJNT19DVSxbXz01VTRfVSEmLl9dOzQ0L19aXTMvX1ddTDgvXitARydfCitNOUYhOF9dMyJRT10hMFRLXy5DWSZfVDUkMk9dXj8nW18oUVxBX1FcOyc/XEInQiNfOjY9Sl9RQDgoX1w1CitNJVI7XzMkUS9fWypNTD9fWVYvP18lQSQ1X1IkMSU/XD0jUUNfJSEoNV9RNDAlL1w4JFE/XyVRKDhfUFgpCitNIz9cVSwjM18xRDEnX1UhLTRfXSYxVStfNUVFRF9UUSczP18mTTpfX1ldKy5fWFFfP09cOyYxT18lMUA5CitNX1E0MyU/XDglITtfJkE4OF9RODIlL1wxIlBfXyNAQCxfUiA6J09cOyUxR18lIFwzX1IgOydfXDQjUS9fCitNJ0FEPV9TXF4sX15dTSo7X1ArKklfW1JWS09fJ09bT19KSU4uX1RBOz4/XTM0JTtfJkFcP19STEYyT1w8CitNJ0InXzYlOSdfUVg4KU9cPycyO18mMTw6X1EwNCc/XEUrIytfJFE4Ql9QUC0lL1w6JkI/XyMhSSFfVDkmCitNND9fIE47L18pQkBGX1FYOSc/XDYkMTdfJUE4OV9RKDUlT1xFKUFfXzVFLS5fUiw/KD9cQShSJ18pIkRFCitNX1NdJDBPXD8oUidfNFUlM19WWUw6P14qQjhDXycxXD1fWE1YO09fKE0rI19VTD8rX1IsPSg/XTo1JStfCitNUFtWW19eKzpXP14hP0gzXyoiSFFfUiA7KD9dUTk2J18/Ry1MX1NIXDA/XDckQUNfNiU5Ll9TMFEsL1xaCitNLiNPXzs3JVNfXUc2VT9cWi9VJ18sM00pX1wqWk1PXSAxNE9fLjNYXF9cQyNQX1xHKlJXXy9EISNfVDknCitNM09cSCpTO18sQzheX1E8QihfXyNOOzdfUUsyVl9dPy5SL10yMFNXXzBDWFZfVSEoL09fTFUtJ188JiU0CitNX1c5Ujc/XUE2VS9fVTwvJ19UNSgzP1xZLzQ3Xy1DLFlfVl1NPC9cRSgyL18nQUg8X1IgPCdPXVU8VztfCitNQCdeLF9SUE0vT1xRLFNDX0wqTk9fXlc7Wj9cQiYiK18jUSA3X1EgMiVfXDolMT9fJjEwNl9RNDAkT1w5CitNJSE7XyghSDhfUyhOKy9dKjE0R18uUzxfX1RNKDUvXSkyNTtfLjM0Xl9bRkxKX11LNzVbXzJULF9fVl1KCitNOS9dPzZVR18lUSg2X1Q1IDEvXkNHSitfJjEwOF9SND8oX10pMFQ/X0EnWiJfVl1JOz9dRzg2N185ViVFCitNX1ghWj9PXD4mIVNfK1JIRF9aRj9FP14vQDdDXzpWLTlfVyVANk9eMkM4Q18wJS1FX1IkOSlfXDkmMVNfCitNKFIkVF9SIEEqL11GODVPXyVBKDpfUVw/Kk9cNiVCJ18nQVhJX1I8Si1PXE0sI1NfJSEwQV9RMDMoL1w3CitNJjJbXydSJElfWD4kQF9cNiYhV18mMUA+X1I8RSovXFArQydfJzFMPl9RWD0nL1xNKyJPXy0jLFJfVCkhCitNMC9cTisyU18qUlRKX1dBXT1fXkBHST9fQ0hCJl9eIzVWT1w7JyFXXzs1US9fXVcoUF9fTVU9S18sMkRNCitNX1QkXC8vXlVNWzdfWE1DO19YOiRBX1xSLkNbXycxTERfVklEOi9dSDk2I180NTkwX1ZFRzhPXSQwM1NfCitNOFVdPV9SNEIoP14pQjhTX1hdVztfU1EgM19cXDFFM19NWypNX1QlJjMvXF0wJCdfSClaQV9TIFotX10gCitNMUQrXzI0QS5fUzhZMS9cSSpDN18oQkhMX1wyWU4vXyRNO0dfVjxXKF9UVSQvP10hLlMvXzREPSBfXjMzCitNVF9dPDREQ185VjEzX1U9KjE/XzVQLDtfMSQ9LF9YJiRCP11WPDc/XzYlKTpfVTUwNS9cPSZBR18nMUA+CitNX1ZdSjtPXVE7N1dfKiJFIl9SUE4tT11JOyZXX1hNQ0FfUkBDKV9cPighW18sUyRMX1M8Uyw/XSEvM09fCitNM1RJJV9VNTAyT10mMDNPXzAzWFlfVDkkMD9cXC5DU18qQkRQX1MoUy9PXFgtQ19fLEJMS19dNyhRX15ICitNR1lHXz1HIUhfVkVEN19cPSYhS18oIUw/X1EoLSQ/XVA6Vl9fJzE8O19UJFsvX1w7JTFHXzY1LTdfUTgwCitNJS9cRSdSL186Ni1HX1FUNyZfXD0nQUNfOTYtPF9ZIilAX147RkkvX0M3TVhfWjo8Ri9cXzQlW18lMSxDCitNX1FEOydPXEAnQydfJjFEQl9SNEMoL1xNKlMzXysyVFhfUkxLLU9cRSkzI18oIiRMX1I4RyxPXDQlIV9fCitNJFEgPF9RQDcqL1w8JzJDXzZVVUBfUixCKi9cRChBX18tQyxOX1Q5Iy9PXSIvU0tfL0NQWV9RWD4mX1xfCitNL1NTXzBULSBfUjBCKS9cPygxX18vVDEgX1Y9RDdfXy1SLC9fWk1PQF9SPEcqT1xdLTJPX1VcOyBfXy87CitNWC9cRydSL18tIlxPX1tCVU0vX0FVPUNfRVk+Ol9UTTU2P1w2JiFfXylSQElfVlVMOT9dKzNUP184Ri08CitNX1JISyk/XT85JiNfNDVFNl9YSi5EL19BVl1HXy9ULTJfU1EmNS9eWk07I18wNDksX1QhIzEvXytSPFNfCitNLiQlIV9UJSYxT10qMjUjXywzMF9fUkBKLE9cRCsiW19QW0JXX1taT0xfXy9RTDtfMFNcXV9TTFktT10uCitNMiQ7X1YtIzNfVD0nMS9dMDRUV18yNDklX10vIlJPXTE1JUdfTUtGXl9WRUQ6T15ER0o7XylCJEVfVklHCitNOU9eQUcqK188NlFQX1c9U0BfXEwrNDtfK0MgWF9WJUA3X19HVk1HXy9DQFZfUzhVLS9cWS1TR18vM10nCitNX1FYQSsvXDsmQiNfKFFcQV9TKEsqX1xVLCMrXy5TPFlfU0xaLj9cUyxTO18rMlRWX1M8WTA/XEoqIk9fCitNOkVVPF9VSS8yL11WO0YzX0FHXVlfUVg5Jl9cOCRRP18nMUA8X1FUOCcvXDslMUdfNyU5Ol9RWDgnL1w6CitNJSFDXydBQDxfUjxBKT9cRigiM18oQVBAX1E0LiNPXj5EOSNfLFIwRF9SMDkmL1xHJjFLXzNEPSFfU0EjCitNM09cOiRSM18lITQ2X1E8NClfXEkrIz9fLDMsVl9SMEQrX1w9JzJDXygyJExfUVA8KV9cNCVBW18kISA5CitNX1EsMSZPXDMjUUNfJUEsQF9RPDopP1xIKzMvXy8jSF1fU1xdLk9cXS5TO18vM0xWX1NcXS4vXFErUydfCitNJ0FQP19RSDgmX1w8JkFXXychSD1fUTw3Jk9cOCZRU19CWD4lX10jKFEvX0lVXU9fKjI4TF9TNFMrT180CitNUVwrX1tdPzxfUlhGKk9cUSsiU19NSyZRX15HOVc/XjhGKU9fNiY5SV9ZUkRLT1wzJUFPXzNEWStfV01dCitNPk9dNzYlR18qUlRQX1JEUy1fXFgxVFNfQFhCLV9dTzVUX10gMSUvXy40LTFfWE4mQD9cXjBUR18xREUqCitNX1xPKVMvXFEuI1tfMEQ1Kl9TWF0xL1xJKyM/Xy0zPF9fUkBQLE9fIU1LN19PSl5TX10vMVNPXSMwVCNfCitNMDQ9I19VSTo1X18sUkw/XzNVJS5fVUE9Nj9dOzc1S19UK18lX1RJLTRPXlRNW1NfOkY1S19ZUjZHT1xGCitNKDI3X0lKLkJfWVY4R09dSjk2R189NyYhX1JESjBfXFItI1NfQjgyKF9dQzBXT1wzJUI/Xy40PTxfUSQ+CitNLl9dITMmN18qIl0lX1FMPSsvXDwnIj9fKDFIQl9SVEYrP1xQKlMnXyxTJFRfUzBPLF9cXzA0O18tQ0EgCitNX1NIWC5fXzhSPEdfUytWV19XRU44X11ZOzZDXyZBNDdfViE7N19dMTMlI18lUSg2X1IoPCgvXEUnUi9fCitNM0RBLF9VSTQ2L14gPkdbXywiSE5fUTgwJS9cVywzN18mMTw5X1FQOCZPXEInMV9fJ1FUP19RMDAkT1xOCitNKjIvXy80NS9fUTAqJj9cMyQxM18kUSBCX1IkRCtfXEAoMkNfJyFQRV9RPDcoL1w8JyI3XyZBSENfUihCCitNKl9cOyZSM18lQTA9X1E8MycvXDUkQVtfJSEwQV9RNDkoP10oMjRLXzI0TSlfUkhNK09cPCdSI18mQVQ+CitNX1FAOidfXDglUVtfJkE4Pl9RWD8pT1xGKTJPXy4jSF1fUVBBKD9cWi5TU19PK0ZUX14/NVY/XEYoIkNfCitNK0MoUF9cKlZMP19VVz4jXypCKEZfUlxKKk9eU0sqU19WLE8qX1oqPUg/XTc6Vl9fRloqTl9ZPjlIP1xHCitNKUJTXydBVENfUihGK09dRTlGV19MOzsiX1Q5PTo/XiJCWSdfVl03M19ULSY0T1xaMSUrX0xaWklfVC0lCitNMy9cWy9DX19PS1JfX1MkVi8vXFsvNDdfMCNZJ19SPEssX1xOLCNDXykyVE9fWCVZPV9eW0tbK19XLEsmCitNX11bK1E/Xz5TPD9fVzxHIV9eKylQT18wTls7X1YsMyBfXSZaTT9fP1I8T180VTk7X1o2SEs/XTc0RUNfCitNQkg6Ll9SNEApL15CR1lbX0ZZOjpfVjVAOS9dUDtHW18pUkEhX1MsVS8/XU48V0dfWV0zRF9SLD0qX1xQCitNLkRDXyZSIFJfUiRGLi9cOCZSU18lMTRAX1FMNicvXDklMT9fJyFAOl9SPEMpP1xVLDMvXzBTUFxfUzhRCitNLV9cUSwjP18rQkBMX1Y1PTZfXVA6Ni9fMyREXl9UWSsxT1xCJzFfXyYxLDdfUTwxJT9cNCNBK18mISg2CitNX1IsPSg/XDkkUT9fJUEgNF9RXDQmP1w3I1EvXyVRJDVfUUg1Jj9cNiQxL18pIVxBX1IwPyg/XEQnUidfCitNJEEgMl9RUDckT1wsJDFXXyNRLEJfUSguJV9cOCRRX18lQSQ9X1FQNyhfXDwmQi9fJVE4PV9RODUnL1w5CitNJiFfXycxVEZfUUw7KU9cOyZSO18lMTRAX1EoMCY/XDMkMUtfJUE0O19SUE0rT1xOLCMvXyYxTD5fUixFCitNKi9cRioiT18oIkBKX1JITiwvXE0rMyNfKlJcUV9SREoqX1xPK1MrXydCKERfVC0oMz9dJTJEQ19UK18lCitNX1JcRis/XEgqMktfS0oqPV9fNz1YL1xJKDI3XysiPElfW1JQTF9fMlQ8S19MWipNX1RJRzxPXVJBSEtfCitNMjVRRF9WWVdBP10yNEVfXzUlUUxfU1kqND9dWERKN18zRkFWX1dKIEBPXztUXF9fOiY9VF9TIFsxT15ACitNR0k7XzAjXSZfU00hMF9eXk5LU18rIlxUX1NEWzBPXSsyNStfKlJYWV9SNEgsX1xDK1MvX0A3UVxfXD5cCitNUD9eR0RYT19POi42X1siNkIvXyFKKT9fUismP19cVlJIP18hSTk/X1I7KkZfXU8nUF9dOjclX19LSyJYCitNX1VBNTZfXVU8N0dfKVIoRl9ZTjlFT14vQlhXXzc1QTpfVk1LPk9cSSskN18tIzBdX1ZBPThPX01WPi9fCitNKEFAQV9RVDwoX1w9JyIvXyoyLEtfUUAyJk9cOCRRP18nUVQ/X1IwQChPXD4mQVNfJyFAOl9RSDYmL1w+CitNJVE/XykyIEZfU1RcMF9cRigiM19IWUY8X1syTksvXilBSCdfKyJESF9RWDgnL1w0I0ErX0taRk1fUUw1CitNJj9dUDpGW18qIihGX1VNNTY/XFcsMzdfRjhaM19WMTw4L14iPygjXyRQWDJfUTQwJE9cRigyL18pUihECitNX1FcOicvXC4jQSdfJUEoNF9RKD4sX1xILTUrXyRBJD5fUSgvJl9cNCQxV18lUTBAX1FMOCkvXD4mUj9fCitNJ1FQSF9RSDcoX1xAJ0I/XydRVEZfUUg4KD9cMiQhR18kMSA3X1EoMSYvXDMkQUNfJSEsOV9SJEMpT1w+CitNKCIvXy5DUF9fU0hcL19cNCZBU18tU0RcX1UhKzNfXjRCOFtfOlYxS19YKV1AX10iMCQvXzhWJUNfWjZDCitNSC9fSVZNT18qUjRJX1JYTipfXy1QO1NfXE1LPV9SOD4oT1xJKSI7X0wqIkhfXCMgTz9eWko7R18sVFE9CitNX1Y5VT5fXU9BKSNfO0g6OV9VRVhCT11SRCo7XztZIjxfViotR19cSC8kS19ASDInX11DMFMvXS4zNUtfCitNLjQxL19VUT41P1xaLlQrXyxTPFlfVylTPS9cUCxTQ18vI1klX1QkXzIvXFItNCNfKlJQV19SME4sT15bCitNTEsrX1M8IyVfXCJMSS9eV0c5I19MWUYrX1wuSkY/XyRKSTdfUzpeOl9cLkRET18pTClfX1gsRyRfVzFVCitNPU9eSUpLJ183VUk+X1Y5QjpPXEUoIjNfRTkuMF9YUihCT11FOCYrXz03NiRfUlRQMj9cUCwjR19LWkJICitNX15HPFlfXDskMUtfKUFcRl9SIDsnX1xCJzIvXykhXEVfUjxEKk9cTSpDI18mISw3X1FUOSZfXDckUTdfCitNJTEkM19RPDAkL1w8JVFXXy8zUSNfUjA+KE9dIixDS18sMiBGX1IkNSVPXEYmUiNfJyEsOl9RVDcmX10tCitNMVRPXyZBMDhfUTwxJT9cPCVBS18qQjBIX1FQNiZPXD4kUUNfJSBQMF9RUDYmT1w3JEE7XyVBJDNfUVQ4CitNJk9cRyhCM18nUUg8X1FMOScvXD4mQUNfJEFISl9ROD0sP1w3JVIrXyZRTEZfUUw7KU9cOyZSO18nIUhDCitNX1FUOykvXD4nIjdfKjI8UF9SWEssP1xQKzMvXyVRMDpfUSwwJU9cMyRRO18kQSg1X1E0NCZfXDQkQU9fCitNKEIwSV9TWSAwX1xKKyJfXypCUE9fUlhOLD9dNDVFR18wVDUoX1E8LyRfXDckUU9fLSMsWl9TJEwsL10rCitNMUQ7X0o6KjxfXk84Vi9cSilCQ18rMkhFX1xGXU1PX0tUXTtfKzI0SV9TKE0rX15TSSpHXz8oKVpfW05RCitNTl9dIDUmK19EWEIvX1taXVJPXSI1VkdfMVcqJF9UPV1BX15UT1w7XzglQUxfUlkjM19dTj43S19XTTsyCitNX1RFKDU/XE0uJC9fKyMwSl9UVS41P1xbLzQjXytTKFNfUjxMLD9cWS5UK18yREExX1MoVTAvXEsrIz9fCitNJlIsR19ZUjBEP18sTzwrX1BaXkdfW1pERV9eXUhZN19PWjo1X1w6TkZfXyVKWUNfUSo6Nl9cMk1IL18/CitNUUwnXzw3IU9fWy5TTU9dMTMkW182NS07X1I4QSk/XjBDSE9fQigyJl9WOUE4X11GOUc3XypSWSdfUyhSCitNLl9eSEgqL19ZPU9MX1MwTC1PXE0pUl9fJ0FMQV9SSEwsP1xDKTJTXygxXEhfUlhJLT9cPyZCI18nQUg8CitNX1FAMyU/XDolQUNfKUIkQ19SNEMpT10hMCQ7XylSLEVfUUAzJj9cNyUxQ18lQTw4X1EwNiZfXDAiUF9fCitNJkEwOF9RRDMlX1w5JFE/XyRAUDBfUUg0Ji9cMyMxJ18mUTQ5X1FMMyVfXDEiMFdfJDBML19RJCwkL1w2CitNJDEvXychPDlfUiw+KC9cQydCI18nMUA6X1IsPCVPXDwnQi9fKiIsSV9RWDooT1w9JzI7XycxVEZfUVA9CitNKi9cTCpTK18sQyRXX1IgPyk/XDglUVdfJkE8PV9RSDcnP1w5JUFTXyVRMDpfUTw3Jk9cPSciK18pQjRMCitNX1FUOilPXDclQVNfN0VZQV9TIFAsX10sMyRfXytCSExfUVRAKD9cWjBEM18mMUw+X1E0NydfXDwnIjdfCitNJFE4N19WLT83P18kTzs/X1pNSzdfUkhGKi9cRygxX19MSjo/X14vK1NPXFAqIlNfLCJQTl9cLldMX11OCitNPVcjX05bNllfU10yNy9eMEQ5K19QTDMpX1M8XTM/XFkwNTdfPkgmJ19dMyxST11IOic/Xy8kOTVfU1EiCitNMS9dVDsmQ18zJE04X1JYWTEvXDEmUStfKEIwSV9TQFovP1w1JkFLXylCTFBfU0RcMD9dKTIkX18sQzheCitNX1MwVTAvXEApMktfSloqQl9cOldPL15MRlk3X0pJMitfWkIzQV9eP0JXV19FWEFbX1k+JT5fXVs6JiNfCitNQkdRU19ePzJTP11DOFYjX0paTk5fVEklMT9dKDE0T18oIUw/X1gpXz9PXUk5Nj9fOSVdQ19VVT07L1xDCitNKVNXXy8jVSRfWTYwRU9fRFQ+P18qMjhMX1MgVjAvXFYsU19fKFIsTF9RLDQnX1wzJSFfXy5TUSdfUkxECitNKy9cTisiW18vUzBTX1VJMjVPXTk2NVNfLSM8WF9SVFIsT1xGKTIzXyhBVD9fUjRAKE9cQicxX18pMiBCCitNX1JQRClfXEQnIV9fKjIkRF9STEMpT1xJKSI7XyhRWEBfUkBDKT9cRigyL18pQiRBX1IkPCcvXEQnUV9fCitNKSFcP19RSDUlP1xCJzFXXylSKEJfUjA/J19cQiZBW18oUVA8X1IkPyhPXDgoMytfJCE8SV9RWD4pX1xMCitNKjJfXygiIElfUVg7KV9cNiQxV18lUSg+X1E8MidPXDYlIVdfJjE8QF9RVDspL1w/JzI7XyZBSENfUTw3CitNKC9cPCciN18sUyxcX1U9NDZPXEoqIk9fJCBYMV9RSDgmX11AOCVXXz4nSVdfU1BfMC9cNSVRS18nQiBFCitNX1QtIDFPXDkpQj9fNjVNPl9cNlJMT19SVT0nXy1SPE9fUixDKU9eKUJYK19SWz5ZX1M0SitfXFErUydfCitNU0wqWV9WXVVBP18sUDwjXy5UQTlfWSIuRD9fKlE8N18tI1ktX1JcWzJPXVk/R1tfVl07MV9WVU8/T1xSCitNMEU3XyszTFpfVTEyMl9dMjQ1W18sQ1EqX1FEPSdfXDUmMU9fLEM4WF9TSF4wL1xaL1Q3Xy8zXSJfVFEuCitNND9cUC0jU18pMkxVX1IkRCo/XUs6Jj9fTlsiVV9dLyhRX18tUFtfX1UsSyZfXVMyU09fRVY9N19aLUs3CitNX143N1UvX0pXLUdfXU4rPl9VUT43L11MO0cnXykiJEBfU0xZLl9cPycyI18xRDEnX1FIOCZfXTs2RidfCitNJ0FcUF9SMEcuL1xULiNLX0BIIiJfXiczW19cSyszN18yJSU/X1JYUC9fXDonMkNfKUJIWV9RVEEsL1wwCitNJSIvXzVVITpfVkVLO09eXkwrJ19RK0cgX1Y1RTtPXS40JUNfMURFLl9SSEUpX1xFJ0FbXygxSDpfUiw8CitNJy9cQychU18qIiRBX1IkOiZPXEkoQitfK0I8R19TJEoqT1xGJ1FfXypCLENfUlRGKU9cSikyN18pUihCCitNX1JUSCovXEspQjtfLSJcT19SREQpL1xFKCIjXygxUDxfUVxBJ19dLC9TW18vIzRfX1QtR0MvXTQ7KFdfCitNIzEwSF9RPDQoL1w3JTFbXyYhNEFfUSwwJy9cOCUyJ18nMUhGX1FINykvXD8nIkdfJjE4Q19SID0qT1xUCitNLENPXyoyQE9fVEEnM09cPydCN18nQVA/X1EsMSUvXC8jMSNfIlBELF9RPDImL10iLiNPXydBMDBfUUA6CitNJV9cNiVRI18tQzROX1IkWCxfXS03Vi9fL1QlKF9dPyhQX1xSKVJbXychXERfU0EiLi9dRTY1S18tMlxTCitNX1NAVC1PXypPSzdfKTJMW19cXyRQX1xWMFUzX0Y5PjpfXFcoUi9dIDJFR18uNDU0X1ZJUzxfXVM8Jk9fCitNPzdeLl9TJSA0X1xUMCNfXzFUNF5fVTk1OE9cQisjS18vRCkkX1NEXS9fXF8wVDdfLzQlI19TUSExX1xXCitNLjNTXy9EISNfUyBULy9cRyszP18oMjBJX1I0Ryk/XkJHKiNfWU0nL19fT0JXP19YV11LX15OJzxfX1dGCitNWD9fWlhdW19eLic8X19HQlc/X1RWLUtfOzZNTV9SOEYqP1xYLTMjX0RZKjFfUjRDKT9cQigiK18oMVxBCitNX1UtMjY/XE4rVCNfKSI8WF9TOFovL10vMzRfX1hNJ0lfUzBTLk9dNTcmQ18oIVxMX1FQOyhPXEIoIkdfCitNKDFcSF9SJD8qL1xSK0M/XyZRWENfXSMhUT9fOVItK183JU1MX1RRLzgvXF8vVENfKlIsRl9STEAnX1xMCitNKSIrXyoyJD9fUkxDKD9cTClCM18rUkRHX1JEQyg/XEYoIVtfKSFQOl9SVEUoX1xOKUIzXysyNENfUlxICitNKi9cVCtSX18oUVg+X1JUSCovXFUsIyNfJ0FEOV9SVEgqL1xEJ1FfXykiKERfWE1ePj9dJS1TQ18pQzE1CitNX1EoPi5fXDgmMktfJUEsP19RODUoT1w+JzJLXyZBSEVfUVg+Kj9cOCYiL18lISw6X1MoUS4vXD8nQjdfCitNKCFcRl9RWDwnX1w+JyFfXychSD1fUjxFKi9cSSlSS18kUSQ0X1IkPyhPXEYpIj9fJyFMQV9WKTY0T18jCitNTEpTXzhWRUtfUVhZLk9cKikiP18nRD0sX1YyJUQ/XTo/OEtfSFpaSV9TOFEsX1xNKiJbX01LSlJfXFJaCitNTy9dJy8kJ18qMjxJX1xKXk0/XSQyRUtfVTxLKV9TQSU1T14rQjhTX1IsLyNfVCksNl9cVzBVK18qQzhVCitNX1RRKjE/XiNBOTNfKSJZIl9SOFIsP10hL1NDXzNUWTtfUUxFLF9cUC0jO18qQlhQX1JcUy0/XEcqUldfCitNKjJYVF9SXFEtL1xLKzMjXyszJFlfUkhQLk9cQSkiR18pIkBGX1M0VS4vXyhOS09fUUsyVl9cJk9MP15dCitNSlpXX0s5XkBfWiY1RU9eQUU5O19GOFYuX1ktWD9PXSoxNEdfLUMwVl9VLS4yL11OO0ZPXyZBRDhfUjhFCitNKS9dQjg2I182JT0+X1JASS5PXEQpU0NfLSNAWl9UQSYyL19BU14vXywyUFBfUihDKk9cUitDO18pMiBCCitNX1EwLyRfXD4mMVdfLDJQUF9ULF8xX1xIKkJfX1MrXyRfXUcoVE9dODVGR18xREU7X1QtIzNPXEkoMjdfCitNKkFcPl9TMEkqL1xOKFIrXypSID9fUyBIKS9cTClSK18tIlxKX1JAQydPXFIqQjtfLEI8Rl9SXEQoX1xOCitNKFIrXyoyKEJfUkhFKT9cPCVRP18lUSgyX1FUOCZPXD0mIUtfJzFAOF9STEYpT1w9JUFXX0E3SVNfVzlJCitNNy9dJy4kL18sQkRaX1I0PiovXD4mQi9fJkFERl9RRDopP1w4JiInXyoyRFJfUyRRLk9cSysiV18oUihBCitNX1IkPyg/XD8nMV9fJ1FUQF9RUDonP1w3JTFDXy0zMFpfUTw0Jk9cNSUxQ18nUiBBX1JcSSs/XEMpIjdfCitNNFRJJF9YNVY8L11NPSdLXzVZJkdfVEIoSV9cUDwoX18uRjooX1JIUDFPXVA2RU9fLVIoR19SMEEpX15WCitNS1pHX1QrRlpfViU0Nj9cTysyX19TPCZYX1ZJSz1PXzpUPSdfMDRNOl9VIS40P18gT0wjXzFFIT9fU1kqCitNNj9cNyhSK18xRDEhX1gyIkRPXEQrM1tfKyM0VV9SNEInP10rMkU/XysjNSNfU0RcMD9cWi9EI18xNEUrCitNX1MsWS5fXFcvJCdfLDMsVl9RJDMlT1xRLUNTXykiPFJfUixGKl9cOygiI18sIyxUX1suTktPXzVTTFtfCitNVjxfMl9dPzBUL19AVC0zX1ktKzZfXCZQTU9eUkhaP19bXTc4X11bM1YvXUs5RkNfPSZdSV9SUE4qX1xHCitNKUI3X0A3XVpfVk1JOS9dJjE0T18qMkxaX1FIPStPXFEtMz9fMTQ5J19dWzFYX1xIKCJLXyghTD9fUiQ9CitNKT9cQicyL18mUTg6X1FcOidPXEgoUj9fJlFAPl9RRDUlX15FR0lbX1ZMXzZfVC0jM09cXC8kT18wI0koCitNX1MkSiw/XEcoIiNfKFFQPF9STEQpL1xGJ1FfXysiLENfUzRMKy9cWCtSX18sIjxHX1MoSypfXEspIjNfCitNKVIgQF9STEQpL1xLKFI/XyUxIDRfUTQ1Ji9cOyUxR18nITQ8X1FQNyZfXEAmIU9fKlIoQl9SLEEoX11SCitNOzY/XzFTVE9fWiYzRC9fMlE9I184RU1HX1FEOik/XD4oMlNfLFMoWF9SNEMpT1xAJ0InXydBUD9fUixACitNJ19cQSdBV18oMVBAX1IkPChPXEYnUjtfJ0FEPV9RUDsoT1xPLFNPX0ZJJjhfWVJBSD9cVjNUW18xNV1ICitNX1NIVzEvXjNAWE9fTjpKTl9WJTo4P19EVz4/Xz9IJjJfVCUpNz9cTipDK19GWTo6X1xfIE5PXFcrIydfCitNKlJATl9bOklJL15dS0pfXz83KVlfUkBDKF9fJU47I19GWSYtX1xDJ1NPXSwzRTdfJUEwNl9XXiFCL10jCitNMzVPXy5EOTVfUVRMKi9dLDNFL19DWEo8X1JAUjFPXD8oUjdfMkRNLF9RWEAqL1xIKlNTXy5TVSRfUzBYCitNLk9dIjIkS18uVCUjX1JYUS1PXE4sMztfKjJQUV9SSE0sT1xGKlMnXyoiTFBfUzBWLj9cRCkyO19QS0JNCitNX1s+Q0ZfX0BSPDNfQldFT19aIi1BP15bSlpDXzhVTTlfVS0rMD9fRlUtI19YTFcrX1k6K0JPXFUuQ0tfCitNLFNAXV9SJD4nP14wQkgrXz5XRVFfUjhGKj9cRSojM18qUlhfX1UtMjYvXiVBOCtfVixPPV9SWEYsL1xRCitNKyMjXydRTENfUUw3J19cQidSN18nMUhAX1MgTSxfXFEsM0tfJVEwOl9TPFAsL19DVS1HXy5TQSRfU1xfCitNM09cXi4kO18sUlBTX1I4PydfXEcoIiNfKzI4Rl9SOD8nX1xWK0MnXyxCSE1fUzhOLD9cQiZBV18nQTw3CitNX1JIQyhfXEkoQitfKjIoQl9SNEApL1w+JlInXychRD9fUVQ6KC9cSChSR18qUjhKX1JMQylPXE0pIjNfCitNKSIsQl9WPUU4L11GODVPXyohVDxfWypHS09dUzs3N18pQjxOX1FUPChfXEInMidfKCFMP19RWDknP1xBCitNJyIjXyhRWERfUig9KF9cPyZCI18mQTA8X1I0PyhfXEEnIiNfKUI0TF9STE8tX15CRjlHX0laRkxfV1I5CitNST9dPEFZX18wI001X1ZFMzovXk9HSkdfOiVZQV9dUy9TT14tQ0k3Xy5UTTVfUz0iMF9eLkNZI19VPDsgCitNX1NYUy4vXEcpIktfRikuLl9ZXjREX142QkhXXydBRDtfXDpaTF9cWiwiU19PW1slX1QlIzJPXT43JVtfCitNLSM4XV9TUSc0T1xcMlUnXydSRD9fVDUoME9eNUUpT18qMlxZX1VRPzkvXDsoIjdfK0M5IF9RQEIsL1xdCitNMURTXy0jSFxfVCEiMT9cOSVRS18lUUQ+X1JUUC0/XEkrIydfK0MkVl9SJEYrL1xCKTJLXytDIFNfU0RaCitNLl9eXk0qR19LOUYxX14rK1FPXiw+RyNfRihBXl9cIlRLP11fPFZTX0opNilfXj83VS9fLk9MK18xM0hfCitNX1JcUi1fXSExRDtfMFQkXF9YVi1AL11FOVVbXypCREhfUlRNLi9dVz0oO18xQ10nX1tOUU0vX0FVLjtfCitNLEJIVF9SNEApL1w2JEFLXyYxQD9fUVw+KT9cPSciL18oIVxGX1FYPipfXEcqIl9fOTVZPl9dXzBUP1xXCitNLTNbXywjIF9fVDBeMy9dIi5UK18rMjhGX1I0PidPXEUnQVtfKEFMO19TIEorT1w5JSFDXyUxIDRfUTwyCitNJU9cOiRBN18oQUw7X1JMRCkvXEspIjNfLUMkUV9SND0oL11ePEc3Xzg1RTxfUjA/KF9cQSciI18qUixGCitNX1JcRilPXEcpQjdfNzYlP19XUiA/T146RFkvXytSNEhfUVw7Jz9cOSZBT18nUUg8X1IgOidPXEInIiNfCitNJ1FEPV9SLD0oP1w4JFE/XychPDtfUVQ6Jj9dNDREX19DWEosX1RdKjNPXD8nQjdfLzQlKV9VPTw2L18gCitNUEw3X1RdJ0FfW1JXUj9cQyciV18yNC0xX103LlYvX0pXPVNfWk07OF9aPjxKP10qMEU7Xy8iLFRfVz1OCitNPT9fI00qW18yVCElX1IkPikvXUw6VktfLCJMRl9ZTi5DP1xJKFI/X04qVkZfUkA+Jk9dSTomX18xJDktCitNX1FMPylfXFcwJFtfMURdQF9TXSIzT1wwIzFLXyIwIDJfUig3K09cLiFRR18qMjBQX1FMOykvXFEtJCNfCitNKiJcXV9SMEYrP1w5JjFTXzI0RSxfUTA0JV9cOycyK18qMlBRX1JcUi1fXE4sMztfKSJET19SLEYqX1xGCitNKiJPXy8zWF9fW1pUSj9eU0dZP19ZTF8qX1kuIT1fXi4+Vy9fUDsqTV9WRT82X10+NERHX1tNXzpfXjMzCitNVF9fN1IsR18xNCEkX1NEWi5fXEMoMVtfODVdOl9STFArT1xJKzJPXzFURTFfUzBUMV9cVCtTT19UTDsvCitNX10zJFYvXSUvRDtfKFIgRl9SJD8qL1xXLVQrXy4zSSVfVS00N19cRilCX18qIkBTX1FcPyovXSgwJC9fCitNV0xfL19ULF8yL10jMFUrXy8jRSZfVCBbMD9cRCchX18qMiBAX1MoSSo/XFMqQktfJjEsN19RSDUmX1w+CitNJjFfXycxQDxfUUwzJU9cQCYxR18pMVg+X1JAQSg/XFAqIjNfRDhCIl9dPyhQX11KN0VLXylSKERfUiQ7CitNJ19cSCgiL18sMkBIX1IwQidfXT44Vi9fOEY5SF9YSiVBP10wMiQ7XyghVDxfUVw9J19cQychU18pMVRBCitNX1IkOydfXEYoIjNfKkIoRV9UXSkxX14xQ0hHX0cpPjFfWzJQSi9cViwzJ18sIkxPX1ddXkE/XFQuJCNfCitNOSY5RF9bTlZOT188VU1bX1UtMzFfW1cjT19eS0w7L19VLSc3X15TO1ZfX1JXLTNfTjs2V19TXTA1T1w1CitNKSIzXz1XQVlfW0pNSi9dPTRVO18nQVA/X1FUPCZfXjBCSENfMTNEVV9SLD4oT15FRjkzX0BHRVlfUlxRCitNLj9cUi0jU18rMzUlX1NJJTVPXCgjUi9fKTFUWF9WSURHT10xM0kjXy4jQVFfUUA7Mk9cOiRCV18rUkRfCitNX1EwMSkvXDclUitfJiEsN19RTDgnT1xBKDIzX0oqQktfUkxOLF9cTCtDL18tQ0ReX1JQTi0/XEMqIltfCitNJ0IkRl9SNEcqT1xTLDMvX1ArOkxfWyo/RV9fPlFML19EWCVXX1g1VDtPXk1GWV9fOyZJTF9YKVs9P19ECitNVV07X1hcWyxfWyI/R19eW0xLK18pUjRIX1JcSitPXFQsMyNfKCI4SF9VXUY5T1xMLSNbXyxDPSlfUyBQCitNLl9fM1JdN19VPEdCX1Q9KzM/XEcsU1NfJSFYTV9TIFAvP1w+J1JLXyZBTEZfUjA9KV9cOCQxQ18mMSw7CitNX1JYRytfX0RVPUdfMVQhKl9TVF0zL1xWLUQvXzNUSTBfUkg+KV9cSSciJ18rMiw/X1JcQykvXDolIUNfCitNKEFQQF9SKD0nX1xKKEI3XylSIEBfUkRCKE9cSykiM18qMihCX1MwSilPXUU5RiNfWC0vMl9YJU88P1xFCitNJzIjXykxVEBfUlBFKT9cSikiK18qUjxFX1VdPzhPXTk3Ri9fJyE8OV9cQlxOL1xFJ0FbXyhSIEZfUig8CitNKC9cNSNAW18mMTA4X1ZBQzlfXEgnQUtfS1oiOl9cJl9NX18kTisvX1ArKk9fUzRULF9cQydSJ18mUTw/CitNX1M8WjE/XS00JEtfUjwvJ19eMzdYT19GVV1DXzk1XTVfVkFANy9fQ1UtQ19cTV8/X18vPVZfXyVPLC9fCitNLyQlLV9SNEQqX1xeLUMzXzY1LTFfVlFHOV9cQScxX188Nj1DX1JMQCdfXEUnUi9fJ0FURF9ZLidCL1xRCitNLCM/XzA0UT1fU0RdMy9cXDIkV18hQExHX1Y5Q0YvXFktRjtfJiEgTF9RTCwnT1w+JCFHXydROD1fUUw5CitNLF9dNzVYI180RSlZX1BcLydPXEUoIiNfK0MwXF9ULSEwX187VE0rXypCRFBfUlhNLS9cVi4kI18qUlhZCitNX1I4SixPXEEpIkdfKlJETF9TSFUtX15fTCpLX1VMLl1fXlc4VU9ePkJYL19BOCFUX11DIFNfXSAzRT9fCitNK0FUQ19XOVZBP182UVw/Xy4jIFNfVl1MPE9cVS0jT18tMyBSX1tOU0tfXjBFWSNfMDQxJV9VST06L1xTCitNLiRLXytSTFRfWjI9Sj9fJlA9R18sQzRaX1FQQCovXDMkQV9fJlE8OV9RLDMlT1w2JVFbXychPENfUVA3CitNJz9cMiNBO18qQjBMX10jJFFfXTMzJTtfMCQhL19UJSEzT10wMlUnXysiKEVfUkw/KE9dLDA0I18tUlBLCitNX1VBLTMvXjdDWFdfLSJUTV9SMD8oP1xGJ1FfXypSMERfUkxEKS9cSCgyJ18sQkBEX1hGKkEvX0FVLS9fCitNQldFW19SLDsnT1xFJzIjXypSMERfUlRHKT9cTSoyP184JiFDX1UtODc/XEcoQjNfRlkmLV9SMD0nP1w6CitNJVFXXyhRWEJfWUIsQV9eRkZZS181VSEwX1JQQCcvXl5MSltfQDguIV9aXkVKL186U10zXyxDIFJfUjRBCitNKF9cPyZSL18tQ0UkX1NYXy4/XylPW09fWE0vNF9eLzZUP10xM1Q/Xy8jQFZfXFMhUU9fR1YtU19dPV89CitNX1xTI1JPXFgvNEdfJlFIQV9TKEoqL1xXLDJfXzBDVF1fUUQ1JV9cQSZBS18pMVg+X1IgPCdPXEAnMi9fCitNPkcpUF9TUF4xP10nNVY/Xy5UNTNfU0UiME9cOyVDK186NTokX1E0LCc/XDMlIU9fJEBYNl9RODAmL1w0CitNJDFbXyVROD1fUEgmJU9cUSpUJ18mMTQ+X1I0PCcvXF8wVE9fMjQ9KV9dOzFUP1xAJ1I3XytCVFNfUyRTCitNLk9cTixDS18sIzRbX1I0SCs/XFArQydfKDFQPl9YTVs8T18hSzo3X1o9MzBfWUIlPl9dUTs2N19SWzssCitNX1E8SS1fXEYnQkNfJ1I0VV9cPl9PP1xNKiJLXzEjXSVfUlRJLD9cWCwzJ19HWTYrX1g2JD8/Xi1CSEdfCitNOUY5T19SSE0vT10lMDRHX1ErVydfXUsjWC9cRSciL18mISQ4X1IkMCZPXEEmQidfJlFMRF9SKEgsL1xNCitNLCNPXykyMEpfUlhNLS9dNTQ1R19VTFMvX1QoWzE/XFsuVEtfNFUtQF9VLS41L1xQKiI7XygxNDhfUlBACitNKD9dLjEzX19PWy5MX11TL1JPXSYvQ1NfKiIoRl9SLDsnT1xJKEIrXykxWD5fUkRCKE9cUyoyN19COEokCitNX11bMVQvXkBDSSNfKiIgQ19SPD8oT1xIKDInXysiOERfUyBMKk9dPzdWK183NilHX1I0QChPXlBISUdfCitNOTVBM19aOj5HL15GRylDX1BbPlBfWVo2RS9cSChSN18qQihFX1U9KDIvXjRESF9fV00rNV9eKzNWL1xPCitNK0JXXykiIEJfUig+KU9cVy5EN18vNCEhX1tSVExPXzpSXE9fWE1bPF9VNTo1L1xVLFM3XzglRUBfWi44CitNRz9fTVVdQ19TTDcsX1NRITM/XDwmUitfOEVJOF9VNS8zP1w6JTE3XyhRXEFfUiQ/KD9cPCZBU18nUVQ/CitNX1FcPSdfXTgzNFNfMiRFMF9UOTM5L10hMiU7XylRVFBfU1RLKz9eS0RIJ189RUk3X1VIXS8vXjg9NltfCitNQTYlN19YMUI3X1xLJiErX0VIJV9fWj4xRF9cNCFAL18tUkRGX1QpJDMvXSkyRE9fVT0rMV9RUD4oP1xMCitNKzJbXy9UKSdfUyBVLl9cTCwzP18pIjxMX1FQOic/XDwlUUdfQic5TF9cJktIT19KVSxTX0U4IVRfVz1PCitNOT9fNU89K18mIkhYX1JQRStfXEMsI1dfSSoiPl9SUEgqT1xcLVNXXytSQFJfVCBYLU9eQEUoN19AR0VTCitNX1hFXT9PXT82Vi9fKUJEVV9TTFowL15cTVtXX1MrUzhfUkRKLD9cNCdSO18mUVREX1IoQis/XEUqQztfCitNLyQxLl9RLDooL1xFKSJLXypSSFBfU0RWLy9cPyYhQ18vM0UiX1NMWzJPXSoyRUdfNFUhNl9STEMoP1xYCitNKyJXXypBWEFfUkxEJ09eN0JYK19WLFMlX1VFLjM/XEopQkNfKCFMPV9SSEMoX1xKKFIvXyoiJEFfUyBGCitNKE9eKUJIM19XTScwX1oyMkUvXEgoIi9fKVFcQl9SSEMoX1xLKTIvXytSREdfVlVOO19dQDk2S18pQiRDCitNX1oyMUE/XyBLOjdfUVtOVF9cNllML18oTls7X0pKLkNfUkBFKl9cRShSO18xQ0BVX1s+UEpPXz9ULSNfCitNWk1PPF9TMFEsL1xEKCIrXydBSEJfUzxaMT9dJjNFK185RVlBX10vJ1JPXVs+N09fPkdVXl9XNVs/P11ICitNOTZPX0tKLkhfXy9BV09fOFM9M18yNFk6X1FEOig/XEgoQiNfKUFcP19SOEEoP1xBJzFfXychUD9fUiA+CitNKD9cQSdSJ18nQUw6X1Q4Vy1fXSEuVC9fMVRdP19VOTs5X10sM0U3XyMwLCxfUkw0J19cUigyP18lMEg3CitNX1IkNCdfXEclUV9fJjBUNl9SJDooT1w4IlFDXylBQEdfUiA6KE9eNkJIT18xJCkrX1Q9KDI/XzFULF9fCitNKyJYUV9UUS4zL1w5JyFXXygiNEpfU1EhMV9cSStDL18yJC0nX11bNlY/Xik+Jk9fUDpOQl9eRzNSX144CitNQSc7Xz9XMUlfXT5bU19cPCtDQ18rIjRMX1I4US8vXjFEKF9fKjI4RV9TOFAtL1xJKFJPXzFTXFtfWU4rCitNPl9eMUFHX19EOC4kX1RFJDJPXEIpMyNfKFIsRl9aWkxLT189U047XylSTFNfU00pNi9cRypTL18tQzhTCitNX1QpIC8/XF8uU0dfJlEsMV9SUE0pX1xNLFJfXzY2JT1fXTcyVD9cWC40I18rMyBcX1NIVzEvXUk5JkNfCitNKyIoRV9SWEQpX1xGJ1FfXylCKEBfU1RcLT9fN1JcP187JU07X1I4PydfXEEnQVdfKVIgQF9SXEYpT1xNCitNKDIrXy0yQEdfWFouQl9fPlQ9I19MWipCX1JERCkvXEQnUV9fKiIsQ19SSEUpP1xYLCJbXzk2PUVfVilJCitNOj9cQicyJ19GOFIhX1wuUkxPXiM/JztfOjY9Ql9eNzZWT15NSDorXyoyOEVfUjRAKC9cWCxSV19POzJOCitNX10zKFEvX0RXLUtfLiM0VF9SMEAoT1xAJyIzXyxDNSBfU1klMT9fIkxbL19TK15eX15fRFhfXVE6RztfCitNMVUtPF9VWT04X15ZSlpTX1o9SzRfXjcwVT9dJTE1K18mIUhBX1IwPyg/XEYoQjNfKFFcQV9SIDwnT1xACitNJyFbXygxVD9fUig+KC9cPiZBU18tMjxIX1RNJjMvXTU4Jk9fNDVNRV9UPS03P1xIKiM/XzglVU9fVylOCitNRS9cQyhDR18kISA/X1BULSZPXCoiMTtfJlFEWl9SUEc0P1xZLSU7XydSJEhfWj5FSE9dOTU1W18wRDUmCitNX107M1RPXEsrMyNfLiNIWF9TNFctL1xSLTNLXywjJFxfUkBQLS9fJk5LT19ZXUM9X1k1Xz1PXylMKk9fCitNWTxTK19ZWiY9X11bPDY/X1VcIzNfUiBTL19cQSZSL18rUzRfX1YpRjovXEUpUjdfLDJQTl9SJEApX10uCitNMUQzX0InRUxfWEFdPU9eMUBIL18yVDErX1IsRSsvXFUtM0NfSDlSPF9cMyNUL1w+JyFHXyhRTD9fUTw7CitNJj9cPykxP18vRCxXX1NFIi0/XE0uQldfKFJYO19SKSIrP11JQ1gjX1FMNyRfVEUkMk9dIC9EP18tMlxXCitNX1QgWS4/XE4oQi9fKTFMPl9STEQpL1xFKDFfXygiMDxfXEMjT09eIzwnI18sQjBFX1IwPSc/XEcoIiNfCitNLFJISl9SVEEoT1xQKFIrX0FYPiRfXUstUy9eX0tKW18qMjBEX1IwPydfXE0qIkNfLCJMS19TOE4rL11FCitNOVY3XzdWOUZfUiw+KE9dVjsmJ186RVU8X1hSKkBfXixDWEdfWV1DPF9bIkRJP1xPKyJPXylCJEFfUkxKCitNKF9eTUlKI19SK0pXX15PQFdfXFErQldfKFFcQV9RTDcnX1xQLFNbXy8kLSNfW15OS09eX0wrI19cTjdECitNX1ZZSD1PXSk1RidfNUU9Pl9bKkZKP19BVTxbX1ldKzdfU1xfMy9cQChCR18pMiBCX1IsPyg/XEMnUidfCitNKCFQPl9SIDwnT1xBJzFfXyhBWEBfUVg6Jy9cSyhSJ18yNE0uX1Q5MjZfXTo5NlNfMSRdOl9TRSMzT1xKCitNLDNfXyxDJS5fUyBHOF9cVCpGX18vUzlcX1VNMUZPXDglNEdfOTVeK19UJF03P1xZMDRPX0U5MjNfVUE0CitNNz9dLDNVI19WPTs1X1MgUi1fXFAsMytfMjRNKV9TIFIuP1xRLENXXylSXFNfXC5XTi9fRFU9S18/RyVMCitNX1wiS0o/XzxSPEdfQUcpTl9XPU45X180Tz0jXyUiPFNfUjQ/KV9cVzAkW18uM10nX1IkQylPXFArIzNfCitNKDIwT19UUSgyT11YOkYnXz1GTURfWSohQD9dJi80M18oUjBLX1NYXC9fXlZKWktfT1wzKl9TWSgtX1xWCitNMEMvXytUIFBfVFFDNC9cWTUkL18jIkQ3X1NZPzM/XFMzQ1dfLyVJKl9ZQk1IP185VDxXXzJUPS9fUzBVCitNMC9cTSpDO18wU1kgX1I4PSc/XEUmUVtfKVIgQF9SPEMoP10uM1RDX1Q8PyNfWVIpQj9cRicxV18oQVQ9CitNX1I8QCgvXEwoUi9fK0IoQ19TKEUpL11bPldDX1VcSylfXEJXTV9cSChSL18pMiBAX1I8QihPXEkpIjNfCitNK0I4RF9TVF8vP109OSYzXydRSD5fV01QOT9dSDY1R19MSk5FX1lOOUUvX0RVPUdfTVpOTF9TLFArX1xHCitNKEIrXygyKDtfWlpJSF9eTUdZU19ZPUM3X1MsTitPXEUoMi9fKSIgSF9TRFwxX1xZL0NbX1AqVk1fWj42CitNRU9fTlddX184VVVLX1NBKTVPXSMxVF9fSloiRV9eJzRTX19GVD07Xy8zVSpfUiBCKj9cSChSN18pQihECitNX1I0QShfXEInQiNfKEFYQF9SKD4oL1xCJ0IjXyhBWEBfUiw7JV9dMTQkX18vJDUsX1hCKkQ/XitCOE9fCitNMjRdMV9TTSczL10gMiUrXz4nSV9fVDknM09cSCtDQ18nIjRTX1RRNTU/XVk+R09fUVwnKV9TRF4yT14rCitNQjhPXzNUTTRfVCklMU9fKVFMN18rUyBXX1JESSsvXjhGOUtfLyNZJl9TPFgwX1xPLVNPX09LKlNfXiszCitNVi9dVzxGU19SO1pXX11fMlM/XjlDWE9fRkk2L19dWydWT1xVMiUzXylCIEhfU0kiMy9cTixTQ186JkVKCitNX1QoXTA/XFUtI09fNERRKl9bNklIT109NiVDX0QoMidfU0hVLl9cQSoiW18wVDUoX1pGREkvXyZSLF9fCitNK0Q0Ul9UUU81X11VQ1dLXyojXExfUiBMKl9cUS5DL18tVDBZX1JAVC8/XF8wRTNfUkwrJV9ePzhUT1xbCitNLlQzXy8kIS9fVE0pNj9dJjBES18rQjBHX1JUQylPXEcnQVtfLCJISF9WLTw1T18+VCxXX0o5QjhfUjhDCitNKE9cQSdBV18pUiBAX1JYRSk/XE4oQi9fLDIwQ19UMSUvX183UixDX1MrTltfUkBDKF9cRSgiI18pIVw/CitNX1I4QSg/XE4pUj9fKlJES19TSF8vX1w/JkFbXztVXTZfV11POy9eMUIoK19JKV46X15DOVZPXlpLSl9fCitNKzJISV9SLD4nT1xEKTFbX0taRkFfWS4nQF9fQlU9M18vQ0RZX1IsPyg/XEMoIjtfMSQ9Ml9UMSgyT15cCitNSypHX0RYKiJfXj84Vi9eIz84T18tVEE2X1VdQjs/XjxFKUNfVkxbKV9eOzRVT1xWLVQrXytDIFdfUkBECitNKU9cRyhSN18oQVhAX1IsPyg/XEInQiNfKEFYQF9SJD0nX1xDJ1InXyohVDxfVD0jMT9dMTQlO19QK0cgCitNX15LOVhfXT01Rj9fLzQpNF9UKSk2X11dPUgjX006RlJfXj89Wy9dNDRGN184NiVQX1hSIkJfX0BUXUNfCitNLyNdJF9YWjBDT10wM0U/XzBENSZfXFsrUk9cSCozI18qUkhQX1hGKENPXFMtI19fK0MgWF9SWFYuT18kCitNTitHX1lNOzpfXSchTi9fM046U19VWz5PX1xSUEsvXjlDODtfVjwzN19SLFEwL1xFKDJHXylCTFFfV0FYCitNPT9ePUYpK19EKE4rX1ghWz5fXihAN09fOVYhOl9VUT05L141RCkzXyoiSE1fUz0jMV9cWzEkM185Rk1LCitNX11bO1NfXE0qQkdfLCJYV19TQF4uT11fP0hPXzlELipfWi1bS19dJSskT19KSEpdX1dNOEYvXzNQTFNfCitNWy1LMF9USSYzX1xeL0RPXzRVKT9fU1RcMF9cSyhSJ18rUixEX1MgRCk/XF4tIyNfPEY5P19dPyhQX15MCitNRzlXXypSLEZfUiA7Jz9cRydSK18sUkhKX1JcRChfXFEpMiNfQjg+IF9dVytSL18yUDwnXylCJEFfUjA/CitNJ19cSChSL18qUjhGX1JAQylfXEkpIkNfKUIkRV9RXDonT11TOFYjX0MoIVtfV0lXPE9eR0g5X19YPS8wCitNX1xKX09PXE8rIk9fKTIgQl9SUEgpT18kTUo/Xz02VUlfXj8+V09cWi0zN18pUixFX1IwQik/XTI1NiNfCitNMSQ9M19bSktJP11VOVYzX1o9TzxfWTYpRE9dIDJFQ183JV1KX1ouO0dPXj9GKUNfWi1PNl9ULSMzT1xOCitNLDNTXypCOEhfUjhCKS9cQydSJ18pIiBCX1IoPigvXEInQiNfKCFQPl9SKD4oL1w3JCFDXyoyWFRfXEslCitNUl9eXE0rQ19XLS8zX1UlNTkvXEEqMy9fMCQ9M19WUU49P143Q0hbX1csVzJfVFkxNz9dTDtHN189VlVQCitNX11XLlRfXSQxVStfQUhOK19WJT86L1xeMDQrX1FMJyFfUjxGKz9cSypDJ19EWSY6X1M8WDBfXFcuQ19fCitNKUJQVl9bQktKT18tTjtPX01aKjZfXDJIRk9eW0dJK19QOjY3X1lOKj5PXzRSLT9fK0JZIV9SJEMqX1xZCitNLTM/X0M3UVZfXUsjTV9dIS0zO18pUixFX1YhPjY/XiRBN19fQihCK19ZMi9EX11QPDcrXzJFLTNfVTU6CitNNk9eJ0I4U19aK08/X1hBLkgvXkY5LSdfUVlTMl9VUSg0P1xVJjMvXzFTIFtfUzROKi9eKT83R19GSEY0CitNX10zKFEvX01WTTNfNFRdN19TPFcxL100NFYjXzZVSUFfUkhCKC9cSydSI18rUixEX1NUUytfXiM9VyNfCitNVSw3IF9cMlVNP1xLKFI7XyghTD1fUkRBKS9cVCpST18sMjhFX1NQUCpfXipCKCdfVyxLJ19dMyNQX1xOCitNKjJHXylCJEFfUiw+J09cSikyN18pUihGX1FINSY/XEEnIiNfJyE8O19VMSQwP142Qkg3XzhWITtfWkZDCitNSD9fO1M8S19VPEspX1MkTis/XEgoUjdfKzJER19cNldKL10+NUUrX1ktTztfU1BXLV9cRyhSN18nMUw+CitNX1QhIzNPXFsvREtfTComO19VXTEzT19EVU0/X0s6JkpfVCktNi9dMzVVX183RT03X1glWj5PX0RVXStfCitNM1RdOl9SVFAuX1xEKCIrXykyJENfUiw/KD9cRCgiK18oQVhAX1IsPyg/XEYoQjNfKDFUP19STEMoP1xTCitNLDJTXzc0WS5fWkI+Rk9fN1NcV18zVS1CX1JMUy8/XSAxVS9fNyVZRV9YXiZBT19GVV1TXzI0UThfVSk0CitNNl9dQzY1U19WTE8wX1NIXTIvXV5AWC9fODVdSF9URSwzP18+Vj1HXytSWFVfUlxOLT9eNERJT18vI1UoCitNX1NVIDE/XE4tI1tfTUpGSF9cIkxLT15KRDhLX0hIQV1fWko0Qy9eWUdZM19DR11SX1xLI1NfXFAsU1tfCitNKFI4R19YVV9AL14zQDdXX1dMTyVfVEhcLz9cPCVBW18oMVxCX1VRPjZfXUs7VldfPSclUF9XXV4/P11XCitNPydLXzlWTUlfVVVAOD9fRlE9O187REFJX11SVVYvX1tYTVdfNTRBLV9SREIrL1xJKUMrXy0zNSBfV0lTCitNOV9eNUM3V19SW15aX14zMFMvXScxJEtfLFMtIF9TQFcxL102NTVTXyoyJD9fUyhGKV9cUylSQ18tIkhGCitNX1kmJT9PXzlSTDdfUTs6Vl9STEMpT1xCJzFfXykxVEBfUlhFKT9cSyghX18tQkhFX1gqID4/XzJQK1dfCitNVEwnIV9SREQpL1xFKCIjXylCJEFfUig9Jz9cPCVRT18lQSQ1X1E8MiVPXDslQUtfMTM0Ul9aPjtFT10uCitNMlQ7X0lKIj5fXVcvUy9fN1MsT18sIlRMX1I4QShfXFIrQlNfUSs6R19VNS0yP19CVj1HXy5DNFVfUjhCCitNKS9cOiYhT18oUjhRX1QpJTQ/XkZFWSdfNEQxIV9eJzNVL15XSysvXy8kQTFfVTk7OD9eOURZJ19EKEYpCitNX15HPFVfXSYxRSdfLiNNJl9SPEMpP1xHKFI3XykyJENfUjhCKS9cTSoyT19LSkpMX1IsPyg/XEgpIjtfCitNOzYhNV9YLVs6X14+QVdPXzwmLThfXUsyVC9dMzVWO18rMzRfX1Q1LDYvXTo3Ji9fPzcxVF9eRzpXX10lCitNMiUzXzNVJThfViE2Nj9fPlNdM18xJD0yX1haM0RfXVQ8R09fMTRBKV9cRyRRL1xULFNLXysiTFJfWUo4CitNSD9cUy0jX18uI00gX1IwSi0vXktHSVdfS0lKPF9YWV09X11QOSVXXzBDTFVfWSokPl9dWzomI19SW18oCitNX1QkXzA/XFgsUltfOUVNOl9TWFwuP1xKKyJLXy1DMFZfUiA9KF9cVi1TQ189J0FWX1ZJTTxPXjlFSTdfCitNOiY5Q19XIVU8P100NUUvXzUlNS9fXkM7VU9dOzQ0P19ZLT8yX14rLlVfXT40RS9fLSMkRV9SUEgpT10kCitNLlQrXz5GWUVfWFolPV9fKU8rT19XPEclX1QkXzA/XFEsM1tfMSQxMV9UQSczT1xQKkJDXypBWD9fUyxHCitNKi9cVytCQ19GKFYmX11DKVEvXzNQTCtfKkIoRV9SLD4oL1xGJ0InXysyMERfUlhGKS9cVisyP187RkVDCitNX11LKFE/Xy9PS1tfKlI4Rl9SNEAoL1xEJ1FfXyoiLENfUTAvJF9cNCQhK18lQSQ1X1FAMyVfXFApQitfCitNTEo2QF9ULSEuT15aTCpTX1RcPyNfXVMxVC9cVCtSX18pUihEX1NAVCxPXl9MWjNfMjNcW19eNzlWT10iCitNLzNfXylCKERfUiA7J19cQylDJ18wRC0uX1pCPEVfXFQqIjNfV00nMF9cOllPT1xcMiUnXzVFVUNfWTYwCitNQl9eO0UpM19aXVs5X1UhMDZfXF0wJE9fKUIkQ19SPEMpP1xJKTI/XzVFKTRfVj1COS9dMzNVJ18oUVhCCitNX1JMRyo/XEopQjNfMVQ9JF9WPTg3L14kQDg/X1YtIzNfVUFAOk9dLTVFV18yJF07X1U1OjgvXVQ6Vk9fCitNWU1HPl9ULSY0T100NlYnXzFDWSFfXU8vVE9dIDFFI188Jy1UX1ZFSDtfXScyRE9fR0lKPF9TMFYuX1xNCitNKyMrX0lKKktfUzhZMS9cTyxDP18rQzBeX1leMkQ/XlFHWidfOlVdOl9VUTc0P11IOjYvXztGSUJfV1VLCitNOV9fI0xLQ19VTFMoX10mX08vXVY4NV9fSkomQV9SMEMqP1xfLVNPXylCMEFfWE4uQi9dRzsmS180NTU9CitNX1clUDtfXV4/Jz9fNVVFNl9VITEyX10zNDRHX1hdLypfVj04NF9fQVRNK19ZPSMrX1ZRQDg/XFEqQydfCitNLjMsW19TUFgwP14rQEdPXz9HNU5fW1pSSz9fQFMsM18zNDktX1NMXTMvXSkyVUtfLkM4X19TIEgqX1xMCitNKTI3XytSSEVfUlxKKS9eL0JYL19TPCZaX10rIE8/XE4pMjdfKSFcP19SREIoT1xKKFIvXyoiJEFfUjxECitNJ19dRDZVN19QSy5OX1xTIE5fXE0pMi9fKUFcP19SMD0nP1xKKFIvXyhRRENfUiw8Jy9cQCYyJ18qIiRLCitNX1FcRCgvXl1JSidfPldNUF9cIktJX18mUDtTX1ZdLzFfUzBNKz9cRCdSJ18vMzRTX1pKREUvXTUyNDdfCitNWV1DOV9USSQyL1xJKFI/XyhBUEBfUiA+KV9cTStTM19CKDYkX1QgWixPX0JVLSdfUjtDIF9UTTQ4T10kCitNMjU3X0U4Xi1fWi48Ry9fRlUtI183JTVBX1NIWzFPXE0pUk9fLCJITl9aSkVJX1xbLUM7X0FXTVxfWU4yCitNRj9cQScyN18oQVBAX1IsPSZfXEsrMktfLVJYTl9SIDsnX18wUTxLXzVWJUVfVE03N09dKTQlU180VU0/CitNX1ZVSDovXz5UXUNfMCQtL19TXSs1L1xULEMzX1M8OyZfU1EhMz9dKjFUO184JiVCX1QtKDM/XTAyVF9fCitNKzMkU19SVE0sL15KSSpTXzA0NS1fU00gMT9cSSwzT182RSkwX10jJFE/XipDOFtfP1deIl9ZXj1JT102CitNNzYvXytDPF5fU0xdME9cTilSP18sMkBIX1syR0hPXEopMj9fKCIgSV9UUScyP14nQSdHX0k6MjlfVj1MCitNOi9dTD0nQ184VzleX1g6KEM/XiJAR19fMVQ1Il9VSTU0L184UitbXzw2KTxfXVcvUy9fRlRMS189VklJCitNX1M0TSw/XF8uI19fMFNVJV9WPUA2T11OOVYnX0sqKj5fXVsrUT9dTTlGW18wVDE1X1U5NzovXScwRFtfCitNKzI0SF9SVEYpT1xLKUInXy1DJEtfVlFIOC9fKU87O19VLCpfX1JMQihPXEQnUV9fKUFcP19SVEYpT1xKCitNKFIvXysyPEVfVEkiL09cSighU19SW15bX1JMQihPXEQnMVdfKEFMO19STEQpL1xFJVFfXyhRTDdfUig7CitNKE9cTilCR18oIiQ6X1xaUktPXVM8Rj9fUFpGRl9bQlNLT189VT0vXy1CXE9fUiw+KC9cXy1TN19FOF1fCitNX1chRDgvXzpSXFNfOTVdQ19SREMpX1xDJzInXyghWEdfU1RfMS9dJTBEJ19NOl5HX11DKlFfXzFQLENfCitNMDRJOF9VMTk5P14wQkhDX0gpRjlfXi8xUz9dVzwnU18xRD0yX1JAQyk/XEopMj9fSyo2RV9ZMixCT14rCitNP0dXX0cpJjZfUjRAKU9cSihCN18/VzFTX1VJPDZPXyRPO1dfTUsuUl9bUk5NT10tNTVfXzBEUTpfVEUuCitNOC9dJzNFM188NlFMX14rN1cvXSwzVU9fLjQ1Ll9YMiJBL186VF0vXy4zWSpfU1ReL19dNzY1U18vM10mCitNX1JARys/XDQmIUtfKSIwR19bTlVPP10iMURbXzA0OStfUyRZMF9eMUI4P19XXS80X1U9ST1fXFczNi9fCitNKVNRNV9TISU3P10oNycjXyVSJE9fUVQ/KE9cRikyM180JDUqX1MgRytPXD8mQVtfSTleN19bIkVHT14uCitNQVgnXzs2XU1fVllWPk9dNjooU18yJSVCX1UhOjJfXSwzJEdfNFRZLl9dPyhOX11aOyYvX1Y8VyZfXjcyCitNUi9eIDxGX18qQiRBX1QkWS8/XSkwREdfOkYtPV9WPUI3P10vMVQ3X1RcMl9fViU8OC9cWS8kP184VjlSCitNX1QtIDFPXE4pUj9fKlIwRF9SWEkpL1xIKFFXXzxWXUdfW1ZRSk9fNlEsJ18qUihCX1IkPCcvXEMnIVNfCitNKkIsQ19STEQpL1xTKkJLXygxUDxfUjA/J19fLFAsJ18rMjBEX1I0PidPXEcoIiNfKiIkQV9SQD0nL1xCCitNKDFLXyVBOENfUkRFKz9cPCcxP19SSlZJX1ctUDk/XyxMKldfTCpCRF9dXzdVP1xWK1JfXykhXEFfUyBICitNKU9dWDxGK19BJ0FUX11bL1QvXUw5RktfKiIoRl9SOEApL1w9JlIzXy9EISVfU1BZLi9eVUtaP19YPS8wCitNX103JFMvXSw1Ni9fMSRFNV9YMV4/L14qQFgvX1VMMyBfWEojQ19dJzIlL18rIkBKX1JcSCovXk9JKi9fCitNSllWOl9YPVc9L15CRUk/XytSRE1fUkxDKD9eSkRJN180NEUsX1xOX1AvXl9MKyNfTio+TV9VQUE5X10rCitNNVYjXy9UOTRfVD0vNF9dMjM0V19XLSc2X1UtNjhPXSMzVUNfQSgqJF9dMy1TP1xdMERbXycyLEVfUlxRCitNLU9dLzNVQ18pQjxOX1NJIDBPXEgqIk9fT0tDIF9USS41T1xSLVNTXywzRSNfV1VVPF9fOVM8W18tJC0wCitNX1I8WzNfXSE1JlNfLDNdNl9WJUI8X1xDJyI7XytCNEVfUkBBKD9dQDYlU18sQkhOX1xLIk9PXkJFWSNfCitNQkhCI19UXTM0P1xdMEQrXzxXTV1fU0krNj9dQTgmO182NVEwX1UhLjFfXUM2VSdfVEw6V19WRT01L183CitNUiwrX1hMXyVfWDVXPS9cTChSL18sUkxOX1Q0XzBfXUg4VVtfLDJUS19SND4nT182UjwzX0FILiJfVUlACitNOE9eL0VZT184Ri1EX1JMRilPXE4pUj9fKzI0QV9STEYoP11BNzU3X0hZPjBfXTMiT19cSSgiI18oQVQ9CitNX1IwPSc/XEspIjNfK1JASF9SWEUpP1xCJ0FTXzNUVShfXE8gT19cTSkiM18oUVA8X1JMRCkvXE0pQjtfCitNKDE0Pl9VNTg4X1xAKSUnXy1TIT9fUVg8J19fJ0paP188RklAX1w+TUpPXjRDWEtfVy0nMF9TQE8rX1xECitNJ1InXypCKEBfVVU2Mi9dVjpGN19WXFMtX1g1XUAvXEgoQjtfKCFIPl9RRDkoT1xeL1Q7Xy4zQFdfWzZPCitNSV9fM1FMJ19WLD8tX1QtLTYvXSUyVTdfP0c5VF9VRTQ1L18oTjszX0I4LitfVF0yNz9cRShSN18rIjxHCitNX1pGPUY/XlNJKV9fRkhOJl9aTj1HT1xEJyFfXysyOEZfUyRGKl9dIjI0R19HSipAX1pWS0lPXUI2RUNfCitNMyVBN19UNTE1T10hMiUzXzMlMThfVChfL09fRVY9U18xREU1X1QpLDVPXUs6Nk9fUkwvI19TQF0yP1xKCitNLDM/XyQxKDlfVEEoND9dKTJVK18wND0pX1JISis/XldMO0dfLyQhKF9SUFEtT1xQLUNbXz5XNVNfXUsuCitNU19cQykyS18nIiRHX1UtNjhPXEkpIyNfKEFUQV9SKEAnP1xEKEFXXyhCPEVfVUk5Ni9dTTk2L19XPScsCitNX1sqSEkvXSw0VS9fLENYXV9YRjBEL10+ODY7Xzw3QUxfWSooP09eMkFIJ18/Ry1MX1paQkRfXyxRW09fCitNNyUlKl9aOjJDT19BUjwjX0Y4QihfUyRJKy9cWC0zT18xI1UlX1I4QSg/XEAnUVtfK0JQTl9bXlZML14oCitNQFgvXy8kKSRfVjlSPU9dTzw3Q18rUkhKX1MkRik/XEsoIV9fKSIgPl9VTTk0T10iLjMvX1QsKl9fUyBICitNKU9cQiZRT18pMVg+X1MgSSo/XEgoMidfKkIsQ19SXEkoP14wQjdPX1I7VlhfUkxEKS9cQicxV18qIixDCitNX1JERCkvXEsoQkdfNiYpP19SIEk2L1xcLyY/XychWDxfW1ZISF9dQjRER19NWkpFX1cxUTsvXz1TLFNfCitNL0M0VV9SLEEoX1xIKCIvXy9DQFZfU0xUK09dRzZVU19FKE4rX1JMRCkvXD4mMV9fJkFIQ19TUSAyL1xcCitNLkNTX0lZTjZfXD5ZTC9fO1I8V18yJSE6X1RFMDdPXS8xVE9fKEIkR19VISUvT14hPldfXzBEKS9fUVQ7CitNJ09cRycyI19JSUI1X10nJU9PXkpGST9fTUo+R19TJEgqL1xHKFI3Xy1DUF5fVFEwNE9dODUlO19JSVo8CitNX1M0Wi1PXEIqUk9fMiUlOF9UOS83P10wNDVTX0FYRixfXi80Vi9dMjQmI18tVCUrX1VdQDg/Xl5OW0tfCitNLUNFJV9SQEstX1xfMDRHXzFEQS9fVDUoMz9dKDNFI18qMkRMX1pWSUw/XSkyNStfLDNAXl9TJFUtX10rCitNMjQ7X1JcKyJfUjRAKE9cQiZBV19OOlZQX1JAQyk/XEAnMi9fJyFMQV9RODYmP1xFKiJHX0xaUkZfXUMrCitNUU9fQlVNK19OWz5VX1QpJzFfXVA9RytfNEVBNF9TRF4wX19DVV0vX1tdUzRfXlM5VD9fU1gtQ19eXj8/CitNX1wyW00/XSUuUz9fPkZRSV9dMl5NP146Qkg/XysyOEZfU1xdMC9cVitTO18nIVQ+X1NQWy5PXjREKFtfCitNTDo2QF9XIUg7L1xHKVMzXzBEQThfVjlEPS9cRScyI18rQixCX1JUQig/XEUoMV9fKTIsPl9SIDglL18vCitNUEwnXysyOEZfUVw4Ji9cQiZRT18qMihCX1JcSCovXE0pQjtfLCJIQl9ZLiw/T18sUCtPXypSMERfUig9CitNJz9cRSgiI18rMkBIX1JMQihPXT85JVtfN0Y1U19VSTo5P1w7JjEzX1BKVkhfVDxZLC9eRkc5P184NV06CitNX11bLVM/XSQuU09fKEIgQl9RWDknP1xOKlJLXyxCWExfVz1PPE9eQkY5R18rMjhGX1IkPChPXD4nQj9fCitNMDQ9MV9UPScyT147RDhXX006RkJfXUsoUk9dMjZGM18xJFFAX1FcPipfXDYmUiNfNFRRJl9WNT85X1xJCitNKSMjXypCKEZfU0BJKz9eTEVZN19WPEMiX1k+JUBPXVk6RktfKlIoQl9SPEMpP1xPLEM/XzNFJTZfUzxXCitNLk9eJkA4L18nIVxAX1BcNSVfXSs0NUdfMCQ9M19UPSg0X14pQlhbX1ZcUzBfVDUjNF9cVzA0T18oQixECitNX1NAVS0vXEwrU09fLzQhLF9UKSQzL10sM0U3XzJUWTNfVCkoMk9cRSkyQ19MOlZVX1QlITJPXE8sU09fCitNLUNEXl9URSsyP14wQlhXXygxVD9fUlxIKi9cWCtSX18wQ1RdX1RBJjIvXUo5NjdfRDhGJ19aRj1GP19LCitNVy07X1U8QyNfVUkwMy9dUzs2T186Jj1GX1RdNDRPXF4xRC9fM0UpMF9cPlJLP19YVz07X149WzdfX1tDCitNVy9fXVktV19QKypTX1JMQylPXEEmUUdfSzlKMF9aPjhEX1xQKkJDXzA0IF9fUzhRLF9dJTJUV18xJEEmCitNX1kmKEBPXjpDKEdfQ0guKF9SUEouT10kMTVTXzw2VV1fUkxDKU9cTShCJ18sIjREX1FYOiYvXD4nIT9fCitNJkEwMl9cQl9PX1xHKEIzXyhBVD1fUiQ6Jk9cRygiI18qUjBEX1JYRylfXE0pUV9fQVghUl9cXyNPT1xICitNKDInXyghTDtfUjhBKD9cRigyJ18pQjBBX1VRQDdPXUc7JktfOSYtQl9SKD4nL15dSiovXy1SVENfWVY4CitNRE9cXS5TO19XTFctX1YlODYvXEMoMi9fKiIsRV9TOFMrT14gPlc3XzMkMSBfWkpCSC9cSihSL18oIUxBCitNX1FEOShPXF0xJSNfLzNZJV9YXidBP105MzRHX1gsWzJfVDEsNU9dIDIlQ18rQkRPX1RJJjIvXiE+JytfCitNKDIkTF9TNFIvT1xIKFI3XywyPEpfWiYxQ09fIEw6T19KKTozX1s2RklPXEwoUi9fKUIoRF9TPFkwL10uCitNNCU/XyYhSD9fVFkuND9cPigiN18wJC0oX1RRMDYvXFswNE9fM0UhOF9WSUw7X180UTxHXy5TRSlfUkRTCitNLz9dJzIkR187VlFLX1I0SC0vXFMtRCtfL0QhKF9VUT45P10rM0UvXy0jSFxfUVA8J19ePkZKK18xRDkvCitNX1JQTy5fXE4sIz9fLDMwVV9UTSo0L15LSSozX1ZcWy1fXkc4Vi9fS1dNV19YTTMxX1teTUo/XjVBJ1tfCitNPVYxPF9ePzJTP19NVl0/X1RcTydfXTsrUk9fM1NcV18vVCkjX1ZdUTtfX0pWXTtfXj1bN19fX0RXP19fCitNWT1bX19eNz5fX19HWC9eQkQ5P18oUUw/X1FENCUvXiw+VltfSSkyK19SNEAoL1xeLlNLXzEjXF9fUz0hCitNMT9dJDI0N19DSC1cX1heIT9PXklIKiNfL1NRKF9TWSA1P104NEYjXytCPEdfUlRBKE9cTShCJ18qQjRACitNX1FQOiU/XUc4RVdfUltfIF9SSEUpX1xBJyFbXydRQDhfUjxAKC9cUipST18rIjRFX1JQSCgvXiE/JyNfCitNUVtOVl9SREIoT1xBJyFTXyhRWD5fUlhJKj9cSCoiN184JilFX1Y1SzlfXUQ5Jj9fKEFUPV9cKk5JT1xfCitNLSJXX0BYKVtfUUw8JU9fOlJcU188RjlHX1JERSlfXFAqIjNfNERJIF9XSVE4X106M1RDX0taMkNfUyRMCitNKy9cPCVRV18rIkhTX1NFIzM/XEkqQydfP1c5Vl9SOEAnT182UjxbXzJEVThfVDUoNF9eJz8nT183RUE2CitNX1JAQCdPXSwzVUtfLkNRJF9RWDonL1xLKUJDX0c5KjFfWypHSC9eXEpKO19POlpOX1JQQyhfXEYoQjNfCitNLTM4XV9VOTg4L1xAKEJHXychWENfWFItRS9dKjMlL18wJCUoX1Y5RzxPXSYyNTNfO0chU19aXkNJL10lCitNMFUvXyojIFpfVkFKOz9cWi4jT18pMkBUX1I4SS0/XSAwREtfNUVBP19ULSUyT1xXLzNfXysyVFBfVkVFCitNOz9cXzAkP18sIyRcX1M0Vy9PXSYyRFNfK1MkVl9XWVI7T15AQlhHX1Q7RlZfVzVCNy9fOFJNK182JFk4CitNX1JAQSpfXEAmUidfWj0zMl9eJy9SX10lL0NDXzNEOSJfVFUtMk9dXT8nT19XLF8uX19DOVRfX19aPidfCitNX147P19fX0dYL19fWU1fX18+Mz1fWVIkQz9cSiZCK18wM0xZX1dVTDdPXVs6VidfKSFcQ19UJFktX10iCitNLkNDXytTQF5fUyhVLU9eK0BHT18+NlFHX1taVEwvXFYtM1NfM1UpRF9UUSg2L1xLKFI7XypSJERfUlxDCitNKS9cTCgxS18qQjA8X1dBUDlPXzJRXCNfLEJAS19SIDonT1xBJjFTXytSOEZfUlhDKE9cTikyN18pUixBCitNX1ZNSjdfXlhLWkdfKiIkQV9SJDwnT1xDJ0FbXysiQEZfUlBDKF9dQjhWM184Rk1LX1YlRDk/XEAnQU9fCitNTkpGO19SND0mX11XPidHXyYhPDZfXDJdTz9eNEFIP18qIiA+X1I4PiZPXTs0ND9fOTVRLl9WKT41T15ZCitNSypPXypSSElfUjg/KU9cOSUxW18uJCUoX1I8Ris/XFAqQltfKUJARl9XTVM8P1xfLlQzXy0zTStfVTE1CitNNy9dLzQ1M18xNE0zX1RRMjcvXFouNCNfJ0FAPF9STEMpT15RSVovX0opVjZfW0JERy9eV0laM18rMihHCitNX1I0PyhfXFArUzdfM0RdNl9SMEYrT11MO1dLXzc1WUlfVTk/OT9dNTQ1R18tUzUlX1QhKjY/XFcvI1NfCitNKzJMRl9TXSAyX1xHK1NfXytTOSRfUyRWME9cPCdCV18mQVRIX1QxJjNPXFwvRC9fLTM0WF9TUF8xL1xFCitNKSJLXypCPE1fU10hMU9cVC4kI18tQ0BfX1NAWi9fXEYpQkdfSCk6J19cNk1KT19HVCwvX0hZLV9fXS8nCitNUi9cXi1TX18pMVxHX1JEQihPX0tUXTtfVTwvJV9ULF8wP11IOkZXXzRVVUFfWzZRS19fWFg9U19fLjdACitNX19fR1dPX19ZPVNfX147PV9fX0RXP19fWi4nX01ZVkBfUyQ/KD9dKS8zR189RiU1X1ddTThfXEInMidfCitNLUJYTF9TXFctP1xEKUJXXykiKERfV1VZPD9dTTg1U19LKiI8X1MoTi1PXTY2VldfMjRFOF9TJEwrT1xICitNJ0InXywiMEVfUyxIKD9cTioiI187NjU7X1xGXk1fXFMqMlNfKCFIPl9SJDknL1xQKVI/XytSMENfUlxGCitNKU9cQScxT183VVkzX1haJT9fXEcoIiNfKFFYQF9RXDomT1xKKUIzXysyMERfVUU6Nl9dOjhWL186NlFNCitNX1FYPShfXlFJOVtfJ1E8Ol9TPFcuT10jMCNPX087NlNfWi43Ri9cSihCN18qMixBX1U1LDE/XS4xU09fCitNOzZNRF9cOllOL1xOKzJTXyghREBfUkRFK09dMDMlU18rQlhXX1E0PSY/XSQvU0dfOyYhPF9TQFMuP10pCitNNCVbXzE0WTxfVCUmMy9dIjIlK18vRDUxX1QhJDMvXD0mUVdfKTFYPl9bIkRHX148QygvX00qIjhfWy5DCitNSC9cSSdCL18pIVhCX1M4VS5fXTU1VVtfKlMkWV9VWUY8L10/OCZPXzc2OUxfVUU1Nz9cTyszV18uJCksCitNX1NEXS5fXkhKOi9fKSJMUV9RWEgvP1xGKzQnXycyKE5fUVRCKV9cUC1DQ18uM1EhX1FEOydPXDomQVdfCitNLVNIX19SSEkrX1xCJ1I3Xy5DUSFfUkxPLV9cUi0jT18rUyRWX1M8Vy5PXjxEWCtfUUpWSF9eQzBQP15ECitNRFdTX1MrXl5fU0xULl9cQSdSQ18pQiRHX143MFMvXy9QO1tfNkVRP19TRF0vX14gPjdHX1w+IzpfX09CCitNVT9fX1ktR19fXjdBX19fQ1dfX19ZPVtfX143PF9fV0RXP15GRDhXXytCKD5fU1xYLE9dRDQ0N189Rjk8CitNX1FINSY/XSAuIztfLCJARl9SREUrP1xFKFI3XzomQT9fVU0yMy9eWEpKP18sIkhSX1RZMThfXSYyJT9fCitNLCJMTV9STEEpL1xUKiJHXywiND5fUkBCJk9eLUE3T19RS05UX1JYRClfXD8mMVdfJ1E8Ol9SUEMoX1xNCitNKEInXysiLENfUjhCKC9cWi4yW183VTkwX1I4PydfXD8mQVNfKiIsQ19SIDwmT1xNKSIzXzRVMTVfVVlHCitNOV9dQjk2O18oIVRDX1pKOURfXFgqUktfNkUxMl9XJUs4X15USko7X0lZTjxfUjhAKS9cRihSK182NSksCitNX1QsXSxfXVY9Jl9fUltaXV9SREgpX1xBJkInXyghUEVfU0ReMk9dIDBEN19ASCFYX1lCLkJPXEAnMi9fCitNNkVRRF9UQS82X10tNVY3XzA0NS1fVC0mNE9dLDVGM18zNTU/X1IgQShPXE8qMj9fSjlWNl9aKixAX15MCitNRUhbX0hZLjBfUkQ+KF9cRCdCK18qQlBRX1RFMDVPXSs1JU9fMlU1P19VITE3L108OTZPX01bLltfVCRfCitNM19cSStTR19FWS47X1IoPyk/XEstNCNfKUJYXl9RSD4rP1xBKCI7X0E4IiBfVFkyNC9cVS5DQ18mMUw+CitNX1NEWC9PXSExJEdfJ0FUQ19TNFIuL1xBKFJDXyoiUFRfUjRHK09cXC9EL18vQ1khX1lGLz5fXyFJSV9fCitNWSxOWl9ZRiY7T18zUFtLX0VIQilfUyxNLD9cRyhCM19ZXSsmX1w6XU1fXS81VU9fODY9SV9eJyxUP19WCitNV01PX19OPztfX19IV19fW1dNV19QWjZHX19TQFcvX19ZXVtfX147P19bLkRHT1xGJ0FLXy4zME5fVT0qCitNLz9dUThVS18mISg2X1MoSSo/XEYnMVdfKiIkSV9RVDkmX10rMyQ3XzQ0QSFfXEJWTF9cSCdCP184NjFVCitNX1Q1KDUvXFgsUy9fKVFUQF9TLEcqT1xTKiInXypSND1fVllFN09eX00qV18sQkRJX1IkPCdPXD8lUUtfCitNKlIoQl9TJEYpP1xKKDInXylSJD9fUkhIKC9cXy4jK18oIUA7X1IgOyc/XEcoQitfKTIkP19SSEMoX10vCitNNCUnXzc2OUZfViVEOT9cQydCK19JWTIqX1ZZPTVfXTw0JD9fPCY5O19aSj5GP15TSTo7XylSKEZfUjBACitNKE9dKTEjX18sQlRHX1ctUTtPXytQK19fKyJESF9SLD0oP1xBJzI3XyhSXFZfU0hcLk9dSjc1Q18oUVhACitNX1QxKTU/XSMyRTtfMDRFM19ULS02L10vNEVXXzJVITxfVE01OS9dLDVWK18oMjBFX1JUSChfXkdFWFtfCitNTko2OV9aNi9BX10kLUMvXylRVEBfUjhAKS9cTitDJ18vJC0pX1Q9MDVfXUM5Vl9fSEoqS19VMT05L1xOCitNKlMnXy0zMSFfUzRaMU9cOiYiQ18uMz0nX1JIUjBPXDwoIkNfKCIgQ19YUihBT11HNlU7X0JIWiZfWDorCitNQV9dXD8nX18tU0ReX1RZMTVPXDsnMitfKkI8TV9TOFgvP1w/KFJPXyszKFhfUyxVLk9cXy9UK19BV0lHCitNX1taQ0YvXzZOWktfQFchOF9cNk1JL15BREhXXywySEpfUkhDKF9fSVM8X19RW0snX1MwWTRPXF8vVTNfCitNNCQxPV9VRTM5X11ANyZTXzpWPVdfV01GPE9eLj1HT19fLis/X19fSFc/X19aTidfSFkqMl9SQDwnP1xYCitNLCJbXzIjWFRfVjk6NT9cOyRBK18qUixGX1IsPSg/XEspMkdfKEFYQF9TWFstT10jLVMjX1JLNlNfUlhGCitNKk9dLTNFR185VjFQX1MkSSk/XE8oUjNfKkFQRF9STEInL1xFJ0FDXzsmLTxfWy5ISD9cVisyV18nUUg8CitNX1FQNCVfXE0pIjNfKzIoQV9SVEQpL1xFJ0FbXygxWDlfUkxKKF9cNiRBM18nQUQ9X1JEQSkvXEYnMVdfCitNKiIwQl9TXSEvX11AOjZHXzhWPUlfUiA+KD9eQEM4J184JSEmX1NETSlPXT81NE9fRCgxX19bNkhJX1xGCitNJ0InXylBUD9fUzRQLE9cTisiW184NVU/X1w+Xk9PXE4pMjdfKFFYQF9SJD8oT1w7JzIrXy1DPF5fVFUxCitNNj9cXjEkW18rQyhaX1RFLzY/XSIyNTdfMTRZPF9UISo1P10mNCVPXy9EQTNfVEUzN09cQShSQ18qMiQ9CitNX1pCOENPXlhJOU9fOkVJN19YNVg9X1xCJlFPXykiKERfUkBDKF9cVC4zX18wREEyX1siR0lfXkVIKiNfCitNMjRZOl9UVSszP1xYLkQrXygyTFpfU0EjNS9cSCw0K18nMVRIX1JERCovXkFHOU9fNiUtJ19aPjxEP14pCitNQjdbXzc1TThfXT8xVj9cWS8kJ18yVFkzX1IkQyovXE0rUzNfKzJcVF9SSE4tT1xLLCM7Xy4jTSBfU10hCitNMS9dSzdVI19LOUImX1tKQkRfXUM0RDNfTFlSPV9SXEMpT1xAKDIrXylCJENfXlMwVF9eW0tLL185VylZCitNX1Q9KDNfX0ZWLiNfWj1HQV9eSzpYT19GVU1bX1lNR0RfXVMsVS9fWlk+J19fXkM7X19fRlZfXkNFKTdfCitNKFFEPF9SXEgqL10gLVMjXzglOTJfUUgxJD9cRidCJ18oIUg+X1IwPihPXD4mQVNfKzJMSF9SLDslX18iCitNTFpXXy4zNFNfVCknMy9dTDwnK18tQlhMX1JYQihfXFEpMkNfLFJIRF9SMD0lX1xRKiInX0RYQiFfU0RQCitNLC9cQSchW18nUTw6X1JIQSg/XFApMjNfK1I4Rl9SND4nT1w4JSErXychSDdfUTQwJS9cOyVBS18pQVhBCitNX1JAPydfXEopQjNfMTQ9JV9WLUw7L11AOSY7XyghXEVfWElYO09dMDBDR18qUVw7X1Q0Wyw/XVU6NjNfCitNTkpWTF9SREEpL1xGJlIrXytSQE9fUVA+KD9cLyRBL180NE0pX1JEQCgvXEEnIVtfKCFYQV9RTD0oT1xJCitNKkMnXy8kIShfVDksNU9cTSwzR182RiFKX1NdJjRPXSk0RiNfMzU9Ql9ULS02L10iMyU/XzQ1TUZfUiRDCitNKi9cSihCI19JKTotX1RIXCxfXik/R1dfJiBcL19SMD8oP1xBJyIjXzQkPSdfVCkkMj9dJTJVL185VV09CitNX1cpTTs/XF0wRFtfK1JUT19TXSEyP10lNEY3XysjOSVfUkBILD9dMTIkQ19NKyJOX1YxOzUvXl1LKV9fCitNSFheJ19VPTg0P11IOzZHX09bVyBfUyhULj9dLzQ1O18oMixIX1MgUi1fXEsrMytfKDIsS19SVE8tT1xaCitNLyQnXy1DOFlfVjE7NS9eIzxWR18/RllFX1dRUTpPXE4oIidfKTFUQF9SLEEoX1xIKFI3X1wtOzNfXDZYCitNTV9dNzc1X18sQlRNX19HPVY/X19YPU9fX14nO19fX0JXL19fWU1fX19eO0JfX19KWF9fX1o+I19fXjc+CitNX1oiMUU/XEImQVtfKjIwRl9TKEspP103MzRHXychLDNfUjQ9KC9cPiYhU18nQTg6X1FMNyY/XEQpMjtfCitNJ0FEO19bVlBKX1xRK1JTXzY2JUVfWConQy9cWCwjL18tIkBJX1JcRChfXFEqIitfJ0E4Ml9UKFksT10zCitNMiQnXypSKEJfUig9J19cPiVBR18qQiRBX1JIPydPXEsoUidfKTFYPl9RMC8kP1w3JEE7XyUxIDZfUTAvCitNJF9cRScyI18qUihCX1JMRyk/XEorIktfOVchUF9WRU07X1w/J0I3Xz8mUUNfVUkuMV9cUSlCN18xI0xUCitNX1VRMDJfXyJNOzNfKyIwR19SOD0pL1xDJzInXyoyPERfV1FVO19dTjkmI18oMUA4X1FUOCZPXDglQUdfCitNJyFYQ19RODcnT10gMSRTXzQ1PUFfUihGK09dLDRFU18vVDkyX1Q9MDdPXF0xVStfMTRdOl9UMS42P10pCitNNFVbXylSNE5fUkQ9J09dODMkN19BJ01VX1FYOSY/XEcoUjdfKFFYQl9SJDwoT11QODYnX0NIRi1fVCUmCitNMy9dPTYlL19IWV49X1NRITM/XE8rMl9fLkNRJF9UNS43L1xKKlMrXzglSThfWkI9Ry9dOzVFI19QKy5ICitNX1o2MkFPXi9AV0tfMERJJl9VLTs1X11QPEcjXy1DPF5fVFkvNU9cSCpCX18uQ1EhX1JQTixfXD4oIkNfCitNKCIkSF9TTFowL1xEKEI3XydBSDhfVChaLU9dMDE0M18oMVQ/X1I0QShfXEInQiNfKFFcQV9SOEIpL19JCitNVS0jX0hZVjtfVlFUPU9dMjM0X19dPV89X19LQVgvX1tYTidfX043RF9fX0lYT19fWj4rX19eS0JfX19LCitNWU9fX1peO19FOEItX1IkOCdfXEEnIiNfKkI0QF9USSIwL1w1I0BbXykhUD9fUVQ3Jl9cQCYhT18nQUw6CitNX1JARClPXTMzJFNfTSo+Rl9TKFAsT11BOiZbXzJEXTVfUlxHKl9cUyoiP18rQjBAX1JcRSg/XDslMS9fCitNK0JAQF9TXFcrP1w7JFEnXyoyMEZfUVg5Jl9cSyhCK18sMjhFX1JEQCgvXEgoIi9fJUEgNF9RUDYnT1wzCitNI0EzXyUgXDNfUiQ8J09cRSdBW18qQjRFX1NAWi4vXUk8RytfOFY9SV9RTDooP11OOEVHXzg1NTBfUyBHCitNKV9cWy1SX18tUlhHX1w+WU1PXFEqMlNfKTIgQl9TTFYsP14rQEdPXzo1RS9fUVQxIz9cSSgiI18qQjRHCitNX1MwUi0/XDcmMVtfKSI0TF9URS01P102NyY7XzEkSTRfVF00OC9cWjA0V18wRE05X1UtOjlPXSMzNUNfCitNMUUlPF9UWTc5P1xCJ0I/XysiKEVfVzVLOV9cOyVBJ18pQihEX1IgPig/XEEnIiNfJzE4PV9ZSi1DL19ACitNVi1PXy9EJSZfViE7NU9eOEUpK18tM00jX1MgUCxfXSszVT9fJkFcRV9YTilBT15RSVovXzhVSTpfWkpECitNRy9eOkJXW19JWUIrX1Y1RTcvXFwyREdfKlM8VF9UXTQ0L10gMEQ/XzRFNTpfUUw9KE9cWi4zX18qQlBRCitNX1IsRCpfXEcpUyNfMFQlJF9STEcqP1xFKDIvXy4zKFJfXCZZTy9cSioiT18nQVhBX1IkQCdfXEgoUi9fCitNKjIwRF9bSktKX11TPCZfXzc2NUlfUlxJKz9fVlgtQ19fPi84X19fSFc/X19aXiNfXl4zP19fX0tZX19fCitNWk47X19eV0dfX1dKWS9eLT8oO18oITw+X1FUOydPXD8mQVNfLjMwVl9RPDMlP1w8JiFLXydBSDxfUiw/CitNJz9dUztGR19NKk5FX1UhIy9PXTIyRENfKjI8SV9UMSwzT10jMiRXXywiTE1fUkhDKF9cRidRX18qMihCCitNX1FAMiVPXEMoIU9fKTI0OF9RODIkL1xDJ0IrXydBSDxfUkxEKS9cTCkiK18pUihEX1I8QilPXDYkMTdfCitNJTEgNF9RMDAkT1w8JiFLXykiIEJfUjBAKE9cSihCN18rMkxNX1ZBUTw/XT05JjNfJ0FMQV9VOS8wX11SCitNOSYnXyhBVEFfU0BeLk9cQydBQ19RKz5SX1JcRypPXEMoIV9fPzc1U19SLDYlP1xFJzFPXyhBVEFfUjA8CitNJ19cSCgyJ18oMVRFX1FAOCg/XEEoMktfMVRBM19UWTE3P10tNFYvXzFEWT5fVDUtNz9cWjBFK182VV1OCitNX1RdOTlfXSc1Ri9fM1VBRl9SPEYrP1xEJ1IvXyghTD9fUjA/KF9cRikiO18nQUg8X1FMNyY/XDckQTNfCitNTks6VF9dWzFVT10lMSRLXzZFKS5fWT4xQ19cWS4zU187VyFXX1UhMDY/XUU6JkdfP1ddXF9YIVg9L15cCitNSlo3X0dZMi1fWT4sQT9dRDclQ18xVFUpX1M9IjBfXEotMztfLSNMW19YLilBP10pM1UnXykyMEpfUyhPCitNLT9cQShSQ18pUlRPX1IsRCtfXFovI0dfWS4nQF9STEgrT1xBJyFbX0lJTjpfUiQ5Jy9cPyciK18rQkxKCitNX1ouQUY/XjxGOTNfVUxHKF9bRk1KP19BVV0vX14uO0NfX09CVl9fX1ldW19fXj8+X19fSFdfX19aTitfCitNX15PQ19fW0pYT19fWl4vX19OT0NfV1VMPU9cPiUxU18mITg5X1FAMyU/XE0qIktfJiEwNl9RSDYmL1w8CitNJiFLXzY1ISpfU0BPKj9cVCtCU18wM1BeX1Q1IDBPXEIoIi9fMDRFLV9VOTs4P1xIKFI3XypSMERfUjg/CitNJ19cTCkyN18lQSA0X1FINyVPXDwmQTdfJTEkM19RODIlL1w7JVFHXylBXD9fUlhGKS9cRidRX18pMiBCCitNX1E4MSRfXDslQUNfKTIgQF9SREQpL1xGKDInXylCJEFfUjw/KE9cRikiO185VyFQX1YtSjpPXD4mUidfCitNM0Q8W19WXUE3T1w7JUFLXzAkNSVfUUw6Jj9dRzhFU18pQjA/X1FYPygvXDckQTtfKEFIPl9SJD8oT1xBCitNJ0IzXygxRDxfUig7Jl9cOyVRX18oIihKX1NEWzBfXF8xNF9fMkUlPV9UKSs2P1xaMFUnXzFEXT1fVTk/CitNOz9cXzMlR18yJTVCX1RFNDdfXS01VidfLVM4XF9SQEMpX1xAJlFfXyghTD9fWCVZPy9cSSgyM18nITw5CitNX1FMNyY/Xj5GKTtfS0leRF9ULSUyT103NERXX0Q4SipfVEEiMU9fQ1U9V19ZPUtBX1kmL0YvXTw1JT9fCitNTypSQ19bUklHP11dPlczXzI0USZfU10kME9cWTFUO18rQzxXX1NFIjBPXi5FOTdfK0M0VV9TPF0vX1xZCitNLiNbXyYhNDtfUyRTLi9cVS5TV18qQkxWX1UhLjJfXzxVPTdfKTI4TV9RODcmL1xXLCMjXylSJEVfUUAzCitNJV9cPighV185VklEX1dFVjw/X0BULD9fU0tCT19fU0RWX19YV003X18uKzlfX19GVz9fX1ldW19fXkM/CitNX19fSlhPX19aXi9fX05LQl9fW0pYT19fWl4vXztFVUdfUiQ4J19cMyQxM18mMTA2X1IgOyc/XDUkMS9fCitNJkE4OF9RSDYmL1xEJyFLXyohXD9fVCxeL09cXS8jT18wU1UhX1FYOyg/XSk0JTtfM0UpOl9TOFAtL1xJCitNKEIrXypSMERfUkhDKF9cNiRBM18lMSw1X1EsMSRfXDQkQTNfJEBYMF9SIDwnT1xDJyFTXy0iUEpfUjg/CitNJ19cSShCK18pIVQ9X1JAQSg/XEkoUidfKjIsQV9SREMoP1xMKUIzXypCKEVfUlhMK09dQjpWT185NlFMCitNX1IgPShfXFstIkNfQUdBVV9RQDMlX1w3JVEzXzdVVThfVUk4ND9cQychU18mQUA7X1IoPSg/XEMmUV9fCitNKCFMP19SKD0oX1xAJiFPXyoyKEJfUjRBKj9cRClCW18rQzBcX1NNIzM/XFwxRSdfMERRN19USTQ3X10kCitNM0VHXzFVJTxfU1koNU9dITIlM183RVlHX1kmM0YvXSEvVCtfKEFUQV9SREQqL1xFKCIzXzNULSZfUkA5CitNJz9cPiVBR18nQUg8X11TNFRPX1BXXjdfMFQ1Kl9WNUM3T14iQCgrXzglST5fXkM2Vk9fSVc9W19WLSs6CitNX15bQFg/Xl1LSidfQkgpWF9UVS8zP1xYMDQnXy4kPSdfUlxZLz9dJTJES19COSYuX1MgWS4/XSEzJFdfCitNL1Q9K19SLEIqL14/RyorXyxTNFpfUlBULU9cUSxDV183NUU3X147OFY/XSowNENfRikqMF9ZRjRDX14vCitNQ0hXX0M4TihfVjFJOV9dPTkmM185RjU+X15XPVRfX1ZXLSdfX11fNV9fW0NWL19fWU1XX19eOz1fX19FCitNVy9fX1otX19fXk9DX19TSFgvX1pZTVtfX05LQl9fX0pYT106MjUvXygxQD9fUUw5Jy9cPSYhS18mISw1CitNX1E0MSRfXDYkQTNfJUEoNF9RVDYnP1xFJ1IvXy8jPFdfVDUiLz9cPCUhQ18mQTg+X1RVMzZfXSgyVTtfCitNL1NEXV9SPEAoL1xCJlFPXyoiJEFfUTQyJD9cMyQxM18mITg5X1EoMCRPXDMjUSdfJzFEO19SND4nT1xSCitNKkJDXyoyJD9fUyBIKU9cSihCI18rIjBCX1JAQCcvXE8pUi9fK0I4Ql9SSEInT1xKKFIvXyhSJENfVUlDCitNOF9dQzpGS18pMihIX1MgSSc/XjhCSD9fLTMgVF9XNVA6T10lMEM/XyhRTDdfUVAtJE9cQiZBV18oMUw5CitNX1I8PCZfXEEnMU9fJ1FIPl9SLDsnT1xFJ0FbXykyJElfUzBWL09cVC5EK18wVE01X1NVJzRPXFUvVEdfCitNMCRJNF9UXTk4X1xYMERTXywzTSlfU1heMz9eS0g6T19JKVpCX1NMVi5PXEYoMjdfKDFQQF9RUDcmX10yCitNMFQ/XyxCLEdfUig4Jl9cLyMwX19KOVo9X14vMlYvXTs3NitfNyVJNV9XJVY9T11BNyYjX1ktKzRfXi85CitNVT9fSFguM19OSlZIX1hBXjwvXSw0NE9fLkNcX19TXScyP1xBK1MrXzQ1OTxfWEIsQk9cVi8jQ18wVE0tCitNX1NJJjJPXFowRDtfJ1FYRF9dQzVWX1xWLiNXXytDOFhfUlxQLl9dPTY1P19aPT85X1VVKzM/X0BUPE9fCitNR0kyKV9VXUA2P109NyU3XzYlVT1fVTlCOD9dTztGP19bLV80X18/P1VPX11XPTdfXl1fN19fU0JWP19fCis+WU1XX19OMztfX19HV09fX1pOK19eXj8/X19bSlhPX11aPidfX15DQQorIAorZW5kCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdGltZ3IudXVlIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RpbWdyLnV1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmU5NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RpbWdyLnV1ZQpAQCAtMCwwICsxLDExNzAgQEAKK2JlZ2luIDc1NSB0ZXN0LnJhd2ltZy5yZXYKK01fVUkpNF9cQSYhX18mUUQ8X1FUOCZPXDgkUTdfJTEkM19RODIlL1w2JEEzXycxOD1fUjQ/KF9cXC1TP18KK00xNChdX1FQNCYvXDolQVtfMzUtO19UQSs1T1xfLjNXXylSIEBfUig7Jl9cSCgyJ18lMSgxX1EsMSUvXDgKK00lQUdfJEEgMl9RLC8kP1w9JjFPXykxWD5fUyhKKi9cSSgxX18sIkBGX1JIQigvXEwpIitfKiIgPF9SXEcKK00oX1xOKUIrXypCKD5fUkhDKF9cQygyL182Ri1DX1YtSjpPXEUoQkNfLCJEPV9ZQipBX1xVLCMzXz03IUoKK01fVDUiLV9cQyZRP18nIFQyX1IoOic/XEEmUUdfKVFQO19SJD0mX1w/JkFbXyhRTD5fUjQ+J09cRSgyR18KK00tIzheX1MwWjBPXSMyVTdfLzQ9Ml9TNF8yP10gMkUzXzNVRUNfU0EiMy9cUS5UR18vQ1ktX1pOQUpfXkQKK01HSitfLlM4Wl9SOEEpP1xBJyIjXychPDtfVSkjMV9cUihSP18oQUA7X1BcLSNfXklHSVdfWF0rOF9VTT0KK004T108NkU3Xzw3OVZfViU8OC9fRFRNM19YXUc1X15DQFkvXlpLOkNfQidZUF9UUTEyX1xaL1NfXy9UPSkKK01fUiRPLE9dMTVFU19CKFIqX1M4XC4vXSMyVFdfLkQ5Kl9TSSIxT1w/J0IzX1YtNztfUzhYLz9cTi1DQ18KK00rUyBbX1VVOTVfX0lVXUdfNzRNLV9eIzFSX14+RShHXzdWITlfVVU8NT9dODc1V181RilBX1ZdTjlfX0wKK01XXTNfXV1fNl9fVz1VP19bV10/X18uKzlfX19GVz9fXlktT19fXj8+X19fSlhPX1tZXV9fX05LQl9fV0kKK01YP19fWi4nXztFVUdfUiQ4J19cMyQxM18mMTA2X1IgOyc/XDUkMS9fJkE4OF9RSDYmL1xEJyFLXyohXD8KK01fVCxeL09cXS8jT18wU1UhX1FYOyg/XSk0JTtfM0UpOl9TOFAtL1xJKEIrXypSMERfUkhDKF9cNiRBM18KK00lMSw1X1EsMSRfXDQkQTNfJEBYMF9SIDwnT1xDJyFTXy0iUEpfUjg/J19cSShCK18pIVQ9X1JAQSg/XEkKK00oUidfKjIsQV9SREMoP1xMKUIzXypCKEVfUlhMK09dQjpWT185NlFMX1IgPShfXFstIkNfQUdBVV9RQDMKK00lX1w3JVEzXzdVVThfVUk4ND9cQychU18mQUA7X1IoPSg/XEMmUV9fKCFMP19SKD0oX1xAJiFPXyoyKEIKK01fUjRBKj9cRClCW18rQzBcX1NNIzM/XFwxRSdfMERRN19USTQ3X10kM0VHXzFVJTxfU1koNU9dITIlM18KK003RVlHX1kmM0YvXSEvVCtfKEFUQV9SREQqL1xFKCIzXzNULSZfUkA5Jz9cPiVBR18nQUg8X11TNFRPX1AKK01XXjdfMFQ1Kl9WNUM3T14iQCgrXzglST5fXkM2Vk9fSVc9W19WLSs6X15bQFg/Xl1LSidfQkgpWF9UVS8KK00zP1xYMDQnXy4kPSdfUlxZLz9dJTJES19COSYuX1MgWS4/XSEzJFdfL1Q9K19SLEIqL14/RyorXyxTNFoKK01fUlBULU9cUSxDV183NUU3X147OFY/XSowNENfRikqMF9ZRjRDX14vQ0hXX0M4TihfVjFJOV9dPTkmM18KK005RjU+X15XPVRfX1ZXLSdfX11fNV9fW0NWL19fWU1XX19eOz1fX19FVy9fX1otX19fXk9DX19TSFgvX1oKK01ZTVtfX05LQl9fX0pYT11dOyc7XydBNDxfUUA2Jj9cOCRRN18rMkBKX1FANCVPXDolQUNfJyFAOl9VRTAKK00yT1xYK1JHXy0iWExfVCRcL09dJTAkK18oQiBDX1QlKTM/XTY2VidfKiIsRV9STEQpL1xGJ1FfXysiNEUKK01fUTgwJS9cOiVRO18nIUg1X1E0MSRfXDYkQTNfJlE8OV9SOD8nX1xOKUIzXylBXD9fUjRAKE9cNiQxL18KK00mUTg4X1I0QCgvXEkpIjNfKUIkQV9SOEEoP1xHJ1IrXylCMEZfVj1QPC9dQzpGS18nQUxBX1RZJy5fXU8KK004NVtfJlE4Ol9UISUxP1w7JkFHXzlWKTxfUjhEJ19cPidSI18lUSg2X1IoOidPXEEnUitfKDFYRF9SJDkKK00nL1xCJlFPXyZRPD9fUiBCKk9cWS5UL18vVDUvX1RJMTc/XSIyVUdfLkQtMV9UOS83P102N1ZXXy9UUTkKK01fVEE1OE9dKTUlX18zNT1BX1M8Vi8vXEgoUj9fKCFMP19SIDsnX14hPjdTXyoyJERfUVA3Jj9cOyVRR18KK01HSUI2X1paP0kvXSMxNEtfNVUpLV9ZJipCT10oMEQ7X1hdNz1fXjc6WD9eMUNZQ183JTE3X1tSTEhfXlwKK01KOVdfPzdNVF9URSwxT1xfMSQrXy40PSZfUlhXLV9cWTBEK19DSTY1X1JYVS0/XFcvM19fLjNAXl9RQDUKK00mX1xRLFNDXy0zTF1fUkhLLU9dMDNET19XLTc1X1I0Ris/XDYlUUNfLVMgUF9SPEEpP1w4JFE/XydCID0KK01fVj1KOS9dWT1HJ19YLSMnX1xaWEtfX1xZLU9fXi1bNV9fU0JWP19fWU1XX19ePz5fX19IV19fX1pOK18KK01fXk9DX19bSlhPX15aTitfX15PQ19YVVxBT1xAJVFbXycxTD5fUVw6Jy9cWS0jO18lUSw1X1FQOCZPXD4KK00mQVNfKFFcPV9XLU46P15USlo3XzQkLF5fVSkqMi9cSSlSR18xJFEuX1QtKDM/XFAqUldfKkIsQ19SOD8KK00nX1xJKEIrXyYhKDZfUixAJl9cRSkxQ18lQSgwX1IsPihPXD4mQVNfKlIwRF9SUEQoT1xHKEIzXylSKEYKK01fUTgxJT9cNSQhM18lISAyX1FQOCZPXEQoIitfKSIgQl9SSEIpP1xNKlJXXzonJVFfVVVEOS9cPiZSJ18KK001RF0jX1cpRDg/XEInMidfLiNYWl9SLD4mL18kTVsrXytSPEpfUixAJ19dXT03L18oUTg1X1I0PSZfXEIKK00nMidfKSFQP19SQEEoP1xBJzI3XyYhQEFfUiRBKk9dJzIlL18zRSU9X1RVMzhfXSYzRVtfMTRVPV9TSSIKK000T107N1ZbXzNVRUdfVD02OF9dLzYmO18pUjhNX1IwPyhfXEAmUV9fKSFcQ19SOEQpT1w+JkFTXyZRPDkKK01fUTwyJS9eWk1LM19XTSc2X1Q1JDJPXTo0RFtfRVkmL19TRFkvL11PPCc/XzQlITlfVjVIOj9dXz9XU18KK01AJ0FUX1tSS0k/Xj9FKFdfRVhSJV9WMTw2L10nMzRHXy1UKSNfUkhVLU9cVC5TT19AWEYlX1RFLzQ/XEUKK00pIktfLEJcVV9SJEMqL1xHKzJfXyhSME9fU0hcLj9fRFg+I18qUkBOX1IkPCdPXkZGWUtfKDFEPF9RXDwKK00oT1xOKlJLX0haJjlfWVI5RS9fNlI8Q19OOlZJX14nN1RfX1hZTi9fXl4rO19fX0dXT19fWV1bX19eQz8KK01fX19KWE9fX1peL19fTktCX19fS1hfX15aXi9fRThCLV9SJDgnX1xBJyIjXypCNEBfVEkiMC9cNSNAW18KK00pIVA/X1FUNyZfXEAmIU9fJ0FMOl9SQEQpT10zMyRTX00qPkZfUyhQLE9dQTomW18yRF01X1JcRypfXFMKK00qIj9fK0IwQF9SXEUoP1w7JTEvXytCQEBfU1xXKz9cOyRRJ18qMjBGX1FYOSZfXEsoQitfLDI4RV9SREAKK00oL1xIKCIvXyVBIDRfUVA2J09cMyNBM18lIFwzX1IkPCdPXEUnQVtfKkI0RV9TQFouL11JPEcrXzhWPUkKK01fUUw6KD9dTjhFR184NTUwX1MgRylfXFstUl9fLVJYR19cPllNT1xRKjJTXykyIEJfU0xWLD9eK0BHT18KK006NUUvX1FUMSM/XEkoIiNfKkI0R19TMFItP1w3JjFbXykiNExfVEUtNT9dNjcmO18xJEk0X1RdNDgvXFoKK00wNFdfMERNOV9VLTo5T10jMzVDXzFFJTxfVFk3OT9cQidCP18rIihFX1c1SzlfXDslQSdfKUIoRF9SID4KK00oP1xBJyIjXycxOD1fWUotQy9fQFYtT18vRCUmX1YhOzVPXjhFKStfLTNNI19TIFAsX10rM1U/XyZBXEUKK01fWE4pQU9eUUlaL184VUk6X1pKREcvXjpCV1tfSVlCK19WNUU3L1xcMkRHXypTPFRfVF00NC9dIDBEP18KK000RTU6X1FMPShPXFouM19fKkJQUV9SLEQqX1xHKVMjXzBUJSRfUkxHKj9cRSgyL18uMyhSX1wmWU8vXEoKK00qIk9fJ0FYQV9SJEAnX1xIKFIvXyoyMERfW0pLSl9dUzwmX183NjVJX1JcSSs/X1ZYLUNfXz4vOF9fX0gKK01XP19fWl4jX15eMz9fX19LWV9fX1pOO19fXldHX19XSlkvXkBEOTdfKEFIPl9SREQpT1xSKlI3XzVUVSkKK01fUVAzJF9cRScyI18nQUA8X1FYNiZPXDslUUdfKSI0Rl9RWDkmX15dTCpPXywyXExfVUVBOT9eIkFYU18KK00uIyBTX1MwSCo/XE8pIi9fLDJAQl9RWDYkT10iLjMrXzRUQSFfUkxCKE9cQicxX18nQTg5X1JIQSg/XEoKK00nUVtfKlIsQV9SND4nT1w0I1EnXyVRKDZfUTQwJU9cNCNRL18pMVRAX1JMQihPXEspUjdfKkJQSl9WPVAKK008L11JOzZfXydRWEVfV1FMOF9dOjNEP18sMjhFX1QwWy0vXTw0JE9fUEs2VF9SUEQpX1xGJzIzXyhRVEEKK01fUkRHKS9dXD02X187RjFAX1IkOCYvXD0mIUtfJiE4OV9RUD4oX1w2JVFbXzAkMSxfVSU3OD9cQilCW18KK00zJSk8X1NdJjRPXSc0JVtfLzQ9Ml9UNS82T10kM0VHXzI1LT5fUjxFK09cSScxW182JFElX1gxWz0/XD4KK00mMUdfKVIsRV9SLD4oT1xBJyIrXzwmJUFfWFopQz9dITFEU183NUEzX1ouP0c/XFwwNFdfK1JUT19TSFwKK00xL10lM0VTXypCTFJfViE6Ni9eSEc5U182VTkwX1wiU0ovXkVESDtfQ1gtWl9UKSoxT10zNlU/XzwnKVAKK01fUzhXL09dLjNVO18qIkhPX1NIXDA/XEwrQy9fJ0IgSF9SIEEqL1xbLkQjXykiKEVfUVg6Ji9dIi5DO18KK000JDUkX1IkPSdfXEUoMi9fKEFYQF9SLD8oP1xGKEIzX1o9MzBfWi49Rl9dTD0nO180RFUvX183P1c/X1oKK01YPiNfXl4rQV9fW0VZL19fWj4rX19eR0JfX19KWE9fX1peO19fXk9GX1ouNEU/XEMmMVNfK1JASF9UIFcKK00sL11ANUUrXyZBJDFfUjg+KD9cQCZBW18pIVhCX1FYOicvXE0qUkNfKFFMN19cKlNLP1xZLTMvXzBEPSwKK01fVlFQPE9cVitCU18rQihDX1MkRSovXFMqQjNfKSFUN19TJEgoP14zQignXy4zIFBfUiQ8J09cPyVRS18KK00qQiRBX1MgRSkvXE8pQjtfKTFYPl9RQDQkT1w8JkE/XyUxIDRfUUw2Jk9cRidCJ18qIVw/X1JIRikvXSUKK00xVDdfOFZRTF9WIUQ5T1xAJ1I3X0JHQU5fVSEiLj9cSydRT18xM0xRX1c1STkvXlpLOlNfKjIkRF9SODsKK00oT1xPKiJfXychWEFfUFwyJF9dMTJUR18qMiBAX1IkPCdPXEAnQidfJlFUQl9SREosP1xcMCRDXzFEUTYKK01fUlRRLj9dOjgmS18vVDkyX1RFMjgvXS01VitfMFRVOF9UKSw1X10xNlY7XygyLEhfUkhCKC9eREVIV18KK00yQ1BTX1hFXj8/XDgjUF9fKSFcQV9SJDwoL10wMVQ/XzBEMSlfVDUrNF9dRzdVV188RlVNX1NVIjNPXE8KK00rMl9fL1QlKV9UNTI5P1xMLUQ3XyoiQFFfVSUoMi9eVEwqW185JU00X1tWTEdfXkNDWD9fNVVBMV9WQU0KK006P15fTzwjXyxDMFlfVF0xNU9cQShSQ18sIyhXX1JMTSxPXEEoUk9fKzJcVl9TSFwwP1xWLUNHXzklTTQKK01fWC1TOj9dXjtGN18/JyVKX1JYQCg/XEUnMiNfKFIkQ19SQEMpP19QVU0vX1E7QldfVT09N19cUisyV18KK01ePVc5X19fQVZfX19YPU9fX14rPF9fX0ZXX19fWU4rX19eS0NfX19JWC9fX1k9W19IWSoyX1JAPCc/XFgKK00sIltfMiNYVF9WOTo1P1w7JEErXypSLEZfUiw9KD9cSykyR18oQVhAX1NYWy1PXSMtUyNfUks2U19SWEYKK00qT10tM0VHXzlWMVBfUyRJKT9cTyhSM18qQVBEX1JMQicvXEUnQUNfOyYtPF9bLkhIP1xWKzJXXydRSDwKK01fUVA0JV9cTSkiM18rMihBX1JURCkvXEUnQVtfKDFYOV9STEooX1w2JEEzXydBRD1fUkRBKS9cRicxV18KK00qIjBCX1NdIS9fXUA6NkdfOFY9SV9SID4oP15AQzgnXzglISZfU0RNKU9dPzU0T19EKDFfX1s2SElfXEYKK00nQidfKUFQP19TNFAsT1xOKyJbXzg1VT9fXD5eT09cTikyN18oUVhAX1IkPyhPXDsnMitfLUM8Xl9UVTEKK002P1xeMSRbXytDKFpfVEUvNj9dIjI1N18xNFk8X1QhKjU/XSY0JU9fL0RBM19URTM3T1xBKFJDXyoyJD0KK01fWkI4Q09eWEk5T186RUk3X1g1WD1fXEImUU9fKSIoRF9SQEMoX1xULjNfXzBEQTJfWyJHSV9eRUgqI18KK00yNFk6X1RVKzM/XFguRCtfKDJMWl9TQSM1L1xILDQrXycxVEhfUkREKi9eQUc5T182JS0nX1o+PEQ/XikKK01CN1tfNzVNOF9dPzFWP1xZLyQnXzJUWTNfUiRDKi9cTStTM18rMlxUX1JITi1PXEssIztfLiNNIF9TXSEKK00xL11LN1UjX0s5QiZfW0pCRF9dQzREM19MWVI9X1JcQylPXEAoMitfKUIkQ19eUzBUX15bS0svXzlXKVkKK01fVD0oM19fRlYuI19aPUdBX15LOlhPX0ZVTVtfWU1HRF9dUyxVL19aWT4nX19eQztfX19GVl9eU0kpW18KK00pQVg6X1NEVCtPXTcyQ1dfPDYtOl9RQDIlT1xSKjJHXylBVD1fUkBBKj9cPSYxT18yVFElX1UlKDA/XygKK01NSy9fKiFYR19WJUQ9P10lMiUzXy4jLFNfUjw9KC9cUylSS18sUkBBX1JMRSc/XU45NVtfT1syTV9TKEkKK00qP1xBJyFbXydRPDpfUkxCKE9cUSlCN18qQiRBX1I8QSdfXEoqIiNfL1NAUl9SIDgmX1xAJlFXXylSKEIKK01fUjRBJ19cSihSL18zVSExX1VVRjlPXUE5JjdfKFFYQl9aPjRCT11ONzU/XzclISdfVyFGNl9eSkdJR18KK01MWjZGX1I8QilPXEQoIitfMjQwX19TKE0pX11TPDZbX1JcIl9fUlBJKi9cQycyJ18oMVRFX1IsTy1PXFoKK00vI0tfOkVVOF9SLD4oL10kMjU3XzBUSTZfVCUpNF9dIzM1Q18zVSk9X1RNMDcvXSs1NjNfMyU9Ql9SJEQKK00pP1xNKiIvX0lZPi5fW0pFRj9eRUNYP18xIzhTX1I8PSgvXEYoIjNfK0JYUV9TUSMyP10nNCU/XzhWPU8KK01fWipCSl9dNDc2M18rQkxRX1M0VDA/XFUuRDtfJkFASF9TRFcxX1xKLEQrXyciIEhfUiBAKF9eLEIoO18KK005VU02X1hKLkFPXiZCWD9fPydRX19TPFkvT10uNDU7XyZRVEJfUkhHKz9cVi4jV18nUixLX1JUUi4vXFMKK00tM0tfL1NdIl9YPVo5X15eSFlDX1VLTkpfWC1QNi9fJUs6M19IOSotX1MkSipPXEooUi9fWjxXL19cPloKK01RX1xULjUrXy9TXTRfVSEkNz9dOTRWP184JVFMX1ZNRz1fXVs5RytfQ0c5W19fU0JXX19fWi1XX19eS0EKK01fWjoxQz9cTihBW18vU0BSX1YxMTE/XVY5RVNfJkE0OV9UIFgtT1xQKiI7XyoyNE1fUjRDKT9dSDolX18KK002VSksX1tCSklfXFAqQytfM0UlQ19UOSg1X1xQKlJXXypSJERfUzBIKj9cUCkxW18qIig6X1hWJT5fXyYKK01OWzNfK0IwR19RXDknP1w/JVFLXysiLENfUlRCKD9cTChSL18pQihAX1NIWStPXT81RSNfKUFcP19RXDoKK00nL1xIKFIvXyghUDpfUlREKS9dMzUlN183Rj1HX1YpRTlPXEAnMi9fSklGM19TQEsqT106NSUrXzw2TUMKK01fWzJKSU9eR0ZZU18pQiBEX1I4QyhPXTk0RFNfMFNUU19XOVQ7X18rT0tXXyoyQEdfUiQ6KD9cQCciN18KK00uM1kqX1QhIjE/XiJAJ0NfRihaKl9SID0oX106NyYzXzIkXTtfVFU3OT9dITE0V18wVDkyX1RRNjkvXS0KK001NV9fKCIkQl9SXEkpX15JRzk7X0hIUiNfWlI2Q09eQ0RZI18qMVhDX1IwPihPXEorIydfMjUhNl9UTTQKK002X10rNTVfXzQlJTxfVVFFOl9eV0xbT18wM10vX1JETy4/XjdEWU9fKEFcRV9STFUwL1xGK0NbXyZBWE0KK01fUiRAKU9eJUAoI18zRSkwX1M0Wi4vXDkmUVtfLjNAXl9UJSQyP1w+JzIvXy0zKFhfUiRDKi9cSCsjM18KK00pMjxOX1NQXjBfXF4vRCdfRjhdW19cJkZHX19EUltLX0Y4OU5fXS8jTk9eNkIoR18sUlRRX1I8QikvX0cKK01UTDtfUUtWV19UXTc2X11BOVZHX1g8UzFfXzs+Vl9fXlldT19fXkM/X19PPlc/XyNJOj9fXy4jPF9fX0cKK01XT19fWU1fX01ZVkBfUyQ/KD9dKS8zR189RiU1X1ddTThfXEInMidfLUJYTF9TXFctP1xEKUJXXykiKEQKK01fV1VZPD9dTTg1U19LKiI8X1MoTi1PXTY2VldfMjRFOF9TJEwrT1xIJ0InXywiMEVfUyxIKD9cTioiI18KK007NjU7X1xGXk1fXFMqMlNfKCFIPl9SJDknL1xQKVI/XytSMENfUlxGKU9cQScxT183VVkzX1haJT9fXEcKK00oIiNfKFFYQF9RXDomT1xKKUIzXysyMERfVUU6Nl9dOjhWL186NlFNX1FYPShfXlFJOVtfJ1E8Ol9TPFcKK00uT10jMCNPX087NlNfWi43Ri9cSihCN18qMixBX1U1LDE/XS4xU09fOzZNRF9cOllOL1xOKzJTXyghREAKK01fUkRFK09dMDMlU18rQlhXX1E0PSY/XSQvU0dfOyYhPF9TQFMuP10pNCVbXzE0WTxfVCUmMy9dIjIlK18KK00vRDUxX1QhJDMvXD0mUVdfKTFYPl9bIkRHX148QygvX00qIjhfWy5DSC9cSSdCL18pIVhCX1M4VS5fXTUKK001VVtfKlMkWV9VWUY8L10/OCZPXzc2OUxfVUU1Nz9cTyszV18uJCksX1NEXS5fXkhKOi9fKSJMUV9RWEgKK00vP1xGKzQnXycyKE5fUVRCKV9cUC1DQ18uM1EhX1FEOydPXDomQVdfLVNIX19SSEkrX1xCJ1I3Xy5DUSEKK01fUkxPLV9cUi0jT18rUyRWX1M8Vy5PXjxEWCtfUUpWSF9eQzBQP15ERFdTX1MrXl5fU0xULl9cQSdSQ18KK00pQiRHX143MFMvXy9QO1tfNkVRP19TRF0vX14gPjdHX1w+IzpfX09CVT9fX1ktR19fXjdBX19fQ1dfX18KK01ZPVtfX143PF9fV0RXP148QShXXypBSEJfVCRbLj9dXTslW18+Vk1BX1IwPyhfXSEuMz9fMENIWF9SXFgKK00vT1xSLTM7X0JYKVtfV0VMOV9eXk0rI18tQzRcX1RdMjkvXSwyJUNfKlIsRl9STEEpL1xPKFIzXysiJDoKK01fUkhEJy9dWDwmO19UTD8gX1MoSCpfXEAmQVtfKDFEPF9SXEYpT1xOKFIrXytCNEVfUjxDKD9dSzpFX18KK01OKl5JX1JAQSg/XEEnIVtfKFFYPl9SUEgpT1xMKFIvXzhGLURfVilLOl9dQTkmN18oIVg7X1tKSUZfXEUKK00nMU9fPVdBWV9RQDclT18kTztXX0UoOidfUkBAJ09cRidBS182VSUnX1Y1PDNPXUI3RTtfTjpSS19STEoKK00qP1xGJ1I7XyYxND5fU0EhMi9cRylCV18sIkhOX1I4SClPXVs8VydfL1NNJF9TNFsyX100NTVTXzNVJTQKK01fVDUrNF9dLDRFU18uQ0UgX1FYOCcvXEsoUjtfTDo+Q19aQj1FT15YSSlTX01aPkRfUlRCKV9cRSdSL18KK00sIlxVX1RZLzVPXEQpQltfOyZdWl9VVT46P102N1Y3XzU1JTlfUzxVMT9dIDJFR18tU1BcX1JUSylPXF8KK00wJE9fKVJcX19SXFYxL1xRLUQrXychWE1fUUg9Ki9dJDFEW18vI1kjX1M0VS4vXFwvVDNfKTIwSl9SSEcKK00rP1xfMDQ7Xy0jQSBfUzhYL19cWC5DX18pQjhJX1oiNkFfXyVLOktfWV0jI19aLjM/X18zUVxDXy9DPF8KK01fUjQ/KV9cSShCK19aXS82X103I1E/XSMvVCdfOiZJTV9VLT04P15VTDpfX14uJzxfX1NFWC9fX1ldW18KK01fXjc8X19fRlc/X19ZLVdfX15DQV9aKjFFX1xDJlFfXyYxMDRfWFFbO09eREUoT18pMiBAX1NYWy5PXSQKK00vU19fLVQlJV9UMSkxP14uQFdTX0NYJV5fWkZASC9cXy8kQ18vRCE1X1VBMjgvXE4pUj9fKzIkQl9SVEIKK00oP1xKKTIjXychSDVfVj1CNz9fK09cI18qQjRHX1IkPCdPXD8mIUNfKVIgQF9TKEsqX1xMKTI3XysiQEAKK01fWCVcPC9fJ05bO18qMihCX1IkPCcvXEMnQVtfK0JESV9SQEgpP11AOEY3Xzk2TUdfVjFEOV9cQicxV18KK01QSlpGX1NcVCs/XiNAR09fJlFQNl9dSytTL11SOUY/XyoyNEdfUyBIKS9dMjJEI18+RyVDX1VJLzIvXk8KK01JKi9fLDJQTF9RUDcnP1xMKkMvXy40LS1fUkRKLD9dXz1HO18pQiA+X107KVNPXSozNUNfMTRBM19YPVwKK00+X10+NiU7XyoiID5fVFEvNk9cWi8kM18nQUg8X1JMRiovXj1ESSdfTEo+QF9bUkpJT15dS0pbXysiLEMKK01fUjhCKS9cVS1DV181RUFAX1IgQio/XDwnQi9fQyhWNF9USSw0X10gMDRDXzlGPVJfVDkpNS9dTjwnL18KK01LWi5EX1Q1IzRfXEgsI0tfOiZJTV9TSFguX1xFKiMzXylCRFVfVCEiMk9dNjYlX18wVDUqX1M8XS9fXE0KK00rMyNfOjY1TV9TXSAxX1xQLDNTXy0zPF5fVDkqMy9cTywzO18/RylOX1oiK0I/XzFOOztfPTYpPF9dQyoKK01UT104M0VDXyoiJEtfUiA7KD9fSVUtK19YPF8rX1Q0Xi4vXS4xRCtfMzRVKl9XVVw+X188U1xbX14tRzMKK01fX19JWD9fX1lNX19fXj9AX19fRldfX11ZLVdfUCsqU19STEMpT1xBJlFHX0s5SjBfWj44RF9cUCpCQ18KK00wNCBfX1M4USxfXSUyVFdfMSRBJl9ZJihAT146QyhHX0NILihfUlBKLk9dJDE1U188NlVdX1JMQylPXE0KK00oQidfLCI0RF9RWDomL1w+JyE/XyZBMDJfXEJfT19cRyhCM18oQVQ9X1IkOiZPXEcoIiNfKlIwRF9SWEcKK00pX1xNKVFfX0FYIVJfXF8jT09cSCgyJ18oIUw7X1I4QSg/XEYoMidfKUIwQV9VUUA3T11HOyZLXzkmLUIKK01fUig+Jy9eXUoqL18tUlRDX1lWOERPXF0uUztfV0xXLV9WJTg2L1xDKDIvXyoiLEVfUzhTK09eID5XN18KK00zJDEgX1pKQkgvXEooUi9fKCFMQV9RRDkoT1xdMSUjXy8zWSVfWF4nQT9dOTM0R19YLFsyX1QxLDVPXSAKK00yJUNfK0JET19USSYyL14hPicrXygyJExfUzRSL09cSChSN18sMjxKX1omMUNPXyBMOk9fSik6M19bNkYKK01JT1xMKFIvXylCKERfUzxZMC9dLjQlP18mIUg/X1RZLjQ/XD4oIjdfMCQtKF9UUTA2L1xbMDRPXzNFITgKK01fVklMO19fNFE8R18uU0UpX1JEUy8/XScyJEdfO1ZRS19SNEgtL1xTLUQrXy9EIShfVVE+OT9dKzNFL18KK00tI0hcX1FQPCdfXj5GSitfMUQ5L19SUE8uX1xOLCM/XywzMFVfVE0qNC9eS0kqM19WXFstX15HOFYvX0sKK01XTVdfWE0zMV9bXk1KP141QSdbXz1WMTxfXj8yUz9fTVZdP19UXE8nX107K1JPXzNTXFdfL1QpI19WXVEKK007X19KVl07X149WzdfX19EVz9fX1k9W19fXjc+X19fR1gvXyROWzdfMTNMV19XSUw6P180T0s3X0ZISicKK01fUlRGKU9cXy80I18tQlxWX1FQPSdPXFwuU0tfRSkiLl9bJkVIL11QOiZTXylSPFRfVCkoNi9dRjknM18KK00pMVRAX1JYQyhPXE0oQidfKTIkP19SNEMnT1xAJiEzX1NcKyFfUlRGKU9cPyYhQ18oQUw7X1JEQihPXE8KK00qIkNfKzI4Rl9TIEooT14zQydbX1MsIltfUkxEKS9cQicxV18pMiBAX1JUSCovXEsoQitfN1YxPl9VWUUKK008X106NkY3XyZRRDRfXCpNSi9dJy4zI19JSVY3X1YlPzZPXz5TPFdfMSNMW19SKEAoT1w+JjFXXytCTEoKK01fUyhOKy9dVztXK19ISUY5X1JURilPXEEnIitfJ0FYR19UJSc0P10nMVRLX0ZZJi1fWzZJSE9fOlIsS18KK000RUlEX1QxLDgvXD8nQk9fJUFMQF9VLSwxT11FN1Y/XyoyMFBfUkhCKU9cWCoyV19LKT41X11HKFBPXjcKK01BOCtfPjZJSl9STEIoT1xHKFI3XytTKFdfVFkxNU9cVy1TS19BSCYjX1FQPygvXC8lMT9fMlUlOV9UIScKK000X10nMiUvX0I4Ti5fXU8sVC9dJTBVL18tVCUrX1IoQykvXFgtMzNfKyJcW19TVSAzL10iMSRTXzMkWTUKK01fVE0uNF9dIjIkS18pMjRIX1smTU0/XSEwNEtfK1MsW19TOFkvT10pMlRHX0QoTi1fUiQ9J19cTyoiQ18KK00uIlxPX1QoXS8/XSgxRENfOkY1RV9ZJilBX15JRzlHX1pdUzZfXTcoUF9dOjQkU188VlVLX1ZBRzlPXS8KK001JStfL0Q5I19UWTI0L18nTEpXX14tVzZfX0c+VV9fXlhdU19fPjM9X1xTJ05fXTw0NEtfSUkqLl9eJykKK01QL145QihDXywyRExfU0BVLl9dJC80N18pQiRBX1IgPydPXE4rIltfT1s6UF9YQiNAX1xcMEQzXzlHKVYKK01fVl1RPi9cTypCS18sMjhFX1JMQCdfXEQoIVtfNlVFMl9UKFksX18wUEtfXywiQEZfUig7Jl9cRSdBW18KK00sIkRJX1JAQSg/XEooUi9fK1JEQV9ZIik+X18pTztDXypSMERfUig9Jz9cSChSL18qMjBEX1JMQio/XTgKK004RV9fKCJFOF9TUFw5X1w8J0FTX086QkNfVikyMj9eV0pKN189JyVMX11XLFMvXF4tMzdfKFIkQ19SQEAKK00oX1xeLiM7Xy5TME5fVj07Ny9eNEJYT18qUjBEX1FYOSdfXDomQi9fLyQhKF9TUFovL15HRlk7X1FbRlAKK01fXU8pUz9dKDQlS18yNSE+X1RdJzJfXEIoMj9fNCQ0Xl9YJVs/X10iMERfXycxTD5fUjw9KC9eRkYpN18KK01UPDZeX1pKOkVfXlZJWj9fLDJASF9SPEMpP1xWLyNbXzMlITJfVUE0NU9eRkdJU18tM0hWX1IoSypfXSgKK000NUNfMURdPV9VITE3L14nQjhTX1hdMzhfVSkwOC9cVzA0T183ViFBX1taW05PXFYuNDdfKiJMV19TXSEKK00yP10mMiRfXzE0QS1fVEEuNC9cSSoyU19LOkZRX1RFKTRPXFEuI1tfLDM0V19UTSkxT18rUEwrXykyIEIKK01fUig6Jz9eWUs7I18qIixFX1IgPShfXDwmUidfJUE4OV9SNEgqP15TSyo7X1YsTyZfXis2VE9eW01bN18KK00wRD0nX1chVjxPXTI2JTNfLjNZI19eLzdUX19PVy0zX1stRzFfXy9AVi9fW1ldX19UTDpXX1ZFPTUvXzcKK01SLCtfWExfJV9YNVc9L1xMKFIvXyxSTE5fVDRfMF9dSDhVW18sMlRLX1I0PidPXzZSPDNfQUguIl9VSUAKK004T14vRVlPXzhGLURfUkxGKU9cTilSP18rMjRBX1JMRig/XUE3NTdfSFk+MF9dMyJPX1xJKCIjXyhBVD0KK01fUjA9Jz9cSykiM18rUkBIX1JYRSk/XEInQVNfM1RVKF9cTyBPX1xNKSIzXyhRUDxfUkxEKS9cTSlCO18KK00oMTQ+X1U1ODhfXEApJSdfLVMhP19RWDwnX18nSlo/XzxGSUBfXD5NSk9eNENYS19XLScwX1NATytfXEQKK00nUidfKkIoQF9VVTYyL11WOkY3X1ZcUy1fWDVdQC9cSChCO18oIUg+X1FEOShPXF4vVDtfLjNAV19bNk8KK01JX18zUUwnX1YsPy1fVC0tNi9dJTJVN18/RzlUX1VFNDUvXyhOOzNfQjguK19UXTI3P1xFKFI3XysiPEcKK01fWkY9Rj9eU0kpX19GSE4mX1pOPUdPXEQnIV9fKzI4Rl9TJEYqX10iMjRHX0dKKkBfWlZLSU9dQjZFQ18KK00zJUE3X1Q1MTVPXSEyJTNfMyUxOF9UKF8vT19FVj1TXzFERTVfVCksNU9dSzo2T19STC8jX1NAXTI/XEoKK00sMz9fJDEoOV9UQSg0P10pMlUrXzA0PSlfUkhKKz9eV0w7R18vJCEoX1JQUS1PXFAtQ1tfPlc1U19dSy4KK01TX1xDKTJLXyciJEdfVS02OE9cSSkjI18oQVRBX1IoQCc/XEQoQVdfKEI8RV9VSTk2L11NOTYvX1c9JywKK01fWypISS9dLDRVL18sQ1hdX1hGMEQvXT44NjtfPDdBTF9ZKig/T14yQUgnXz9HLUxfWlpCRF9fN1IrT18KK00+RlFDX11HLVFPX0VUTENfQCcpT19SSEEoP10hLjNXXzI0KSlfVklDNz9dRzhFV18zVD0lX10vJE9fXUEKK003JiNfLjNRJ19WLUY8T10jMCQ7XytCPEdfUkxEKS9cTioyM18qIiw9X1ctTzlfXl1MOktfVUwzIV9STEIKK00oT1xBJyFTXyhRUDxfUkhDKF9cSykiM18sUkhKX1IkPCcvXEQnUV9fUywjIV9SVEQpL1xFJ0FbXylSIEAKK01fUkBBKD9cSCcxU18oQiQ6X1E4NihfXEkpMldfJyFUN19cSk1KP11TPCY3X1MrIk1fWyJISS9fP1VdN18KK00tQlxPX1IwPyg/XFAqIjtfPicpQl9YMVg9L18+U10jXzsmOUpfUkBCKU9cRigiM18nMUxEX1NZIDE/XFwKK00uM0NfTTpeR19eJzNUL181USxTXzMlNUNfVDEpNT9eJD9HU19CSC4jX107JFAvXipAWF9fMVRBM19SUEgKK00qT1xPKiJDX0taMkNfWk49Rk9eJz1XM19ISTo3X1JcSSs/XEsoUidfSkkqNV9VJSkzL18rT1wjX09bIlAKK01fW0JHSz9dODg2P18yVT1AX1NdJjUvXSczVS9fNERVLV9dUzFVT10zNUYrXzBUXThfWDIiQS9fNFM8V18KK00vNCkuX1FUQyk/XE8sMztfM1RdOF9SOEcrT1xaMCQrXyoiQEtfW1pYUC9dKjNFO18sQzxcX1MkWTBfXV0KK009Ny9fVjxXLl9TMSM0L1xHLlRfXzA1MUxfUyRfNU9dQThHL18oUVBGX1JYRSk/XEgoMidfOCVBPF9TKEoKK00rT18qUEtbX0hJPjBfWEooQF9dLzRVJ18vNCkiX1ctWz8/XFoyVUdfODYhRl9VRTw0L10wM0Q/XzhVTTEKK01fXUMoT09dUThFU19XPF8sX147MlJPXVc6RkdfLTJUUV9TXFgvX10jLzQ3XzlWITpfVllHOD9eTEhJW18KK01XTE8lX1ZVRjtPXSMxJTdfNUU9SF9UPSIzT1xNKTJDXysyOEZfUkxGKD9cViwyT187JkFAX1xGXU1PXzQKK01QS19fKlIoQl9SMD8nX1xGJ1FfXysyOEZfUkhDKF9cTSlSN18yRCheX1JIQCcvXytPW09fKlIoQl9SMD0KK00nP1xCJlFPXypSMERfUjQ3J19cQyZRP18oQUxCX1JYRio/XEAoMUtfU0sqTl9XLVI5X18jSjo7X04rLk4KK01fXVc1VF9cVitSX18oUVhAX1NcVy0/XjVDV19fPCYxQF9dSytTL11FN1YvXyoyLEdfUiw9KD9cQCdCP18KK00vM10kX1Q1IjA/XlVLWj9fVixLJ19dJyBSL10hMkVDXzUlRUVfWSIqQi9eQEY5R19YXSctX1c9UD8vXSYKK00xVStfKiIsRV9SSEUpX15MSTo3X0UoUipfWE1ePz9ePEQ5O18pMiBGX1JIQik/XV89Jy9fNkVROl9cMl0KK01PP15WTFsrX08qWlZfVFU1N19dIjMlS18yNFlAX1Q9LjUvXVE7JlNfWE0/PF9UUS82X1xZMTRbX0EoKiQKK01fXUszVF9cWS9ES18vM1hfX1U9OTcvXF0vVDtfKiI8TV9RMDgmT1xEKSI/X05bNl1fVCkmM09dITFET18KK00sM0UjX1kmKUFfXz9UXTNfNVZFV19TPS04X1xHLyU3XywkNT1fVEE8PC9cNygyX18nMVxCX1I4RSkvXTAKK00xNEtfLCI8Tl9RXDonT15FR1k/X0wqNj5fWFonQD9dTTtWV187RzlaX1U5SEMvXSg0NitfNCVJK19UUSwKK00yP10zM0RbX1hdLypfVj04NF9fQVRNK19ZPSMrX1ZRQDg/XFEqQydfLjMsW19TUFgwP14rQEdPXz9HNU4KK01fW1pSSz9fQFMsM18zNDktX1NMXTMvXSkyVUtfLkM4X19TIEgqX1xMKTI3XytSSEVfUlxKKS9eL0JYL18KK01TPCZaX10rIE8/XE4pMjdfKSFcP19SREIoT1xKKFIvXyoiJEFfUjxEJ19dRDZVN19QSy5OX1xTIE5fXE0KK00pMi9fKUFcP19SMD0nP1xKKFIvXyhRRENfUiw8Jy9cQCYyJ18qIiRLX1FcRCgvXl1JSidfPldNUF9cIksKK01JX18mUDtTX1ZdLzFfUzBNKz9cRCdSJ18vMzRTX1pKREUvXTUyNDdfWV1DOV9USSQyL1xJKFI/XyhBUEAKK01fUiA+KV9cTStTM19CKDYkX1QgWixPX0JVLSdfUjtDIF9UTTQ4T10kMjU3X0U4Xi1fWi48Ry9fRlUtI18KK003JTVBX1NIWzFPXE0pUk9fLCJITl9aSkVJX1xbLUM7X0FXTVxfWU4yRj9cQScyN18oQVBAX1IsPSZfXEsKK00rMktfLVJYTl9SIDsnX18wUTxLXzVWJUVfVE03N09dKTQlU180VU0/X1ZVSDovXz5UXUNfMCQtL19TXSsKK001L1xULEMzX1M8OyZfU1EhMz9dKjFUO184JiVCX1QtKDM/XTAyVF9fKzMkU19SVE0sL15KSSpTXzA0NS0KK01fU00gMT9cSSwzT182RSkwX10jJFE/XipDOFtfP1deIl9ZXj1JT102NzYvXytDPF5fU0xdME9cTilSP18KK00sMkBIX1syR0hPXEopMj9fKCIgSV9UUScyP14nQSdHX0k6MjlfVj1MOi9dTD0nQ184VzleX1g6KEM/XiIKK01AR19fMVQ1Il9VSTU0L19IVl07XzZVJSdfXjM3VE9fQlNNP183RSkzX1MwUSk/XEwqIjtfMSNNIl9XSU4KK005P14uQTc/X1I7UltfXVcpUT9dIS9UJ18sMyReX1QxJDQ/XSgxVFtfLCJISF9SSD4nX1xTKVJDXy1SWEgKK01fWUItQU9fOFI8M19UXCsiX1JIQik/XEMnQiNfKUFYQV9SVEQpL1xOKUIzXy1CVEdfVllJOF9fOlIsN18KK01TW1peX1JMRilPXEUoIiNfKSFcP19SQEMoX1w0I1EvXyUhIDJfUTgxJT9cOCRRP18sIjhCX1sqRUgvXSMKK00wM0tfTksiTF9dLydQX188VD0jXy0iXE9fUjxCKS9cWC0jK19PWy5EX1REXy5fX0VWPUtfMENUX19SOEIKK00pL1xAJlFfXyhSOFFfVCkjM09eSEcpP18tIkBEX11bMVQvXyZOO1tfLyRBMV9VOT04X141RChPX0ZZMjQKK01fXk8+Vj9dMDQlT18vNCErX1I4QShfXEcoUjdfKjI0R19VOTI1L11HOEYzXzRUXTFfUiw+KE9cSylSR18KK00qQjhEX1Q9JzEvXUc2JVNfQSgmJ19dQzBUX104OCZLXzM1OT1fVEEvNl9dNTZGI189Jk1LX147OVdPXSMKK00xRStfNSVNQV9UOF4wP187U10rXzAkOTBfVyFTPS9dSTomX18xVEkrX1laOkcvXFQtQ09fKzJQUl9aOkIKK01KX1xWLjQzXytTKFdfUlhUL09eP0RJJ19MOV5BX1ZNPzZPXTw1VSdfOiZFQ19WWUo4T11dOlY/X1BbKlgKK01fXTssUi9fMU9bU189RiU/X1pKQUg/XEQoUkdfL1M8W19SOEQoP14rQ0hDXzlWUUpfVSU1Nz9dUTwmX18KK00/R1FXX1U9OTVPXTA0NE9fNFUlKV9eOyVVT11OMiZHX1crNzhfX09CVz9dNTIkV18qMihMX1JERixPXFUKK00tNCNfPkctR19ZNi0/P18rT1tLX1ktIyxfVD0kMk9cUyxUI18uIz0kX1U5NTcvXEkoMV9fLEI4R19TLEcKK00qL1xUKkI7X0Q4NV5fXUcqUT9fJU1LO18qUixGX1IoPSdfXEUnMiNfK0I0RV9STEAnX1xWKkI3X0BIIVkKK01fXSsgTz9fMlA8J18qMjBEX1I0QCgvXEYoMidfKEFUPV9RUDcmX1w2JDE3XyVRKDZfUUw2Jk9dJS0zK18KK01JWU42X1RZKzFPXkZIKVtfVzxfLF9dPyxSX1xQKzJTXylCJENfUyhOKy9fJE1KP181NFUpX14rOVY/XFoKK00tMzdfKUIoRF9RSDgmX1xDKUMnXzBENTFfWjo3RD9dMjEkJ19YPS80X1s+TExfXFwyJSdfNUVNQV9ZRjMKK01EP14wQjhHX1o9UzdfVDkmND9cWC5UO18pUixFX1I8Qyk/XEUoMi9fKUIoRF9SVEkqX15OSkpTXyhRXEEKK01fUkBEKU9dTTglN19AV01LX1laJz5fXVA4VUNfVk0rMF9VLTc5T1xNLTNfXzE0UThfVUk8OF9dXT0nM18KK01aPUs/X1Q1KDUvXS80NUNfOCU5OV9dWy9VL10kMVUrX0NJLjNfVzFSPl9dJTIkR19SPDMkX1MwUy5PXEwKK00qUytfRklCQV9TLFQvX1xYLlQjXykiSFRfWk4+Rz9eTkZJU19DR1VXX1chRDc/XSIuUzdfREgxW19XTUgKK004L18rT1xDXzAzXSFfU0BTK09dRjZVS18vQ1BZX1JITCpPXFYtIztfKCFUQ19TOFcuL11UPic7XzpGVVIKK01fWUY2RT9dSDlGL188JzVRX1UxNjRfXTQ1NF9fWitPP19YQS5IL15GOS0nX1FZUzJfVVEoND9cVSYzL18KK00xUyBbX1M0TiovXik/N0dfRkhGNF9dMyhRL19NVk0zXzRUXTdfUzxXMS9dNDRWI182VUlBX1JIQigvXEsKK00nUiNfK1IsRF9TVFMrX14jPVcjX1UsNyBfXDJVTT9cSyhSO18oIUw9X1JEQSkvXFQqUk9fLDI4RV9TUFAKK00qX14qQignX1csSydfXTMjUF9cTioyR18pQiRBX1IsPidPXEopMjdfKVIoRl9RSDUmP1xBJyIjXychPDsKK01fVTEkMD9eNkJIN184ViE7X1pGQ0g/XztTPEtfVTxLKV9TJE4rP1xIKFI3XysyREdfXDZXSi9dPjVFK18KK01ZLU87X1NQVy1fXEcoUjdfJzFMPl9UISMzT1xbL0RLX0wqJjtfVV0xM09fRFVNP19LOiZKX1QpLTYvXTMKK001VV9fN0U9N19YJVo+T19EVV0rXzNUXTpfUlRQLl9cRCgiK18pMiRDX1IsPyg/XEQoIitfKEFYQF9SLD8KK00oP1xGKEIzXygxVD9fUkxDKD9cUywyU183NFkuX1pCPkZPXzdTXFdfM1UtQl9STFMvP10gMVUvXzclWUUKK01fWF4mQU9fRlVdU18yNFE4X1UpNDZfXUM2NVNfVkxPMF9TSF0yL11eQFgvXzg1XUhfVEUsMz9fPlY9R18KK00rUlhVX1JcTi0/XjRESU9fLyNVKF9TVSAxP1xOLSNbX01KRkhfXCJMS09eSkQ4S19ISEFdX1pKNEMvXlkKK01HWTNfQ0ddUl9cSyNTX1xQLFNbXyhSOEdfWFVfQC9eM0A3V19XTE8lX1RIXC8/XDwlQVtfKDFcQl9VUT4KK002X11LO1ZXXz0nJVBfV11ePz9dVz8nS185Vk1JX1VVQDg/Xz5WXF9fKzJISV9TIE4tX1xYL0NLXz9XWisKK01fVjkjQk9eQz5aX18xMlErX1pKKk8/XVs2KUNfVFwrLF9eUzpUL10qMURfXy9DWStfVS0yN19cXS8kL18KK00qUixBX1JcQykvXFApIjdfL0MwUF9XKUY3X183UiwvX0spVj1fUkxDKU9cQCZRV18pUVxCX1MsSipPXE8KK00pIi9fLDI0QF9YRidAL189UlxDX1RMJyFfUjhBKD9cRCdRX18qIixDX1JMRilPXEgoUj9fKjIwSF9SOEEKK00pP1w/JkFbXzxWLUBfWFIgPl9dWj1XK19JWiY/X14nM1QvXypPW1tfK1JQS19SNEAoT1xMKiI7X1ErOkcKK01fVzVNOj9fR1dNW18uQzRVX1I8Qyk/XEQoQjdfNEU1QF9UMSc0X15aSlo3Xz02PURfXkc7Vy9eNUI5K18KK00wJEk4X1VRPzpPXkNGWVtfR1lCOF9eQztVT10jMFRbXytDJFxfUkhGKi9cRihCM18oUVxBX1IwQChPXEIKK00nQiNfKEFYQF9SIDwnT1xCJ0IjXyVRIDhfUkROLS9fKlE8T19PKzJYX11TM1RfXTE1NjNfKDJEU19UIScKK000X11MO0c3X0VYWi5fXVMtVE9dLjQ1V187JllVX1c9TTwvXz1TTS9fMSQ9Ml9YOitCX11BN1ZDXy9EJSIKK01fXDshUD9cRylCV18qUkhRX1kuMUZPXFcuJC9fLVNIX19SOEwtT15YSlpLX1M7RltfWz5CRU9fJEopS18KK01OWVoyX1wmRUVfXjtCR0tfVSxDN19SWE4wP1xBKFJPXy4zNFdfWFVcPU9fOlBbP18wMzRWX1I8Qyk/XUAKK003RUdfQSg1X19YQihCX140Q1kvXzwnJVJfVEkzNF9dNTZFS19BWEYsX1w7KFNfXE4xMytfMyZdN19XNi8KK00+T1xIL1JTXygiUEtfUyRaLF9cVzEjR18qIzBdX1NdIjUvXypQTDdfWV1DMl9TTFsxL1xcMCRfXzJURTkKK01fVDkiMk9cTikiP18rMixGX1I8PidPXFAqQkNfOFVRNl9dWzBTP15JRilDXylCLEJfUiQ+Jz9cRygiI18KK00rQjRFX1JYQihfXFEpIi9fMSQ0X19dPyhSL18sTltPXyoiLENfUjRAKC9cRCdRX18pQiRBX1JYRylfXEsKK00qMk9fLkNcX19RXDonT11PN1U7Xz9WXUxfWSYoQE9eREdZS19aLUc6X1tKTktfXE0qQkdfKFFYPl9SMEUKK00nT15PSjonX0RYPiNfXis1VS9cXi4zR18oUVxBX1IsQClPXSQxVStfMSRBKl9bUkxKP14zQEgrX1ldQzgKK01fWC1dQl9cVzIlO183VilNX1lSNEYvXzpTTEdfWU0zNl9TOFcwT1xOLCM/XyoiMEZfUjxDKT9cQidCI18KK00oUVxBX1IoPigvXEInQiNfKDFUP19SLD8oP1xIJzFTXzFULSVfVSUwNU9fIE48I19aTUdDX1VVNjlfXF0KK00wRTNfMERFO19XVVZAL15VSjsrX1ldV0xfVTEyOT9dQTg3I19DKCorX14jM1YvXFwvVDNfQ0kiLl9VIS4KK001X10iMTQ7X1NMTypfUkBJLC9cSypDI19COEIuX1MsVC9fXE4sI0NfK0M4Wl9cMlhOP19GVU1LX1Q8JlgKK01fXS5ZSy9fN01aX19TKyJMX1lGLUFPXzlRLT9fKFMlIF9SNEEqP1xGKlMnXz4nQVVfWVY4RE9eMEJYT18KK01AJ01bX1hCIT5fXUc4JUtfNyVVRF9ZNjBFL1xIKkJXXy1ULSdfU00kMS9dRjpWT19PXDMqX1NZKC1fXFYKK00wQy9fK1QgUF9UUUM0L1xZNSQvXyMiRDdfU1k/Mz9cUzNDV18vJUkqX1lCTUg/XzlUPFdfMlQ9L19TMFUKK00wL1xNKkM7XzBTWSBfUjg9Jz9cRSZRW18pUiBAX1I8Qyg/XS4zVENfVDw/I19ZUilCP1xGJzFXXyhBVD0KK01fUjxAKC9cTChSL18rQihDX1MoRSkvXVs+V0NfVVxLKV9cQldNX1xIKFIvXykyIEBfUjxCKE9cSSkiM18KK00rQjhEX1NUXy8/XT05JjNfJ1FIPl9XTVA5P11INjVHX0xKTkVfWU45RS9fRFU9R19NWk5MX1MsUCtfXEcKK00oQitfKDIoO19aWklIX15NR1lTX1k9QzdfUyxOK09cRSgyL18pIiBIX1NEXDFfXFkvQ1tfUCpWTV9aPjYKK01FT19OV11fXzhVVUtfU0EpNU9dIzFUX19KWiJFX14nNFNfX0ZUPTtfLzNVKl9SIEIqP1xIKFI3XylCKEQKK01fUjRBKF9cQidCI18oQVhAX1IoPigvXEInQiNfKEFYQF9SLDslX10xNCRfXy8kNSxfWEIqRD9eK0I4T18KK00yNF0xX1NNJzMvXSAyJStfPidJX19UOSczT1xIK0NDXyciNFNfVFE1NT9dWT5HT19RXCcpX1NEXjJPXisKK01COE9fM1RNNF9UKSUxT18pUUw3XytTIFdfUkRJKy9eOEY5S18vI1kmX1M8WDBfXE8tU09fT0sqU19eKzMKK01WL11XPEZTX1I7WldfXV8yUz9eOUNYT19GSTYvX11bJ1ZPXFUyJTNfKUIgSF9TSSIzL1xOLFNDXzomRUoKK01fVChdMD9cVS0jT180RFEqX1s2SUhPXT02JUNfRCgyJ19TSFUuX1xBKiJbXzBUNShfWkZESS9fJFBdI18KK00nQVA5X1IsOydfXDcmUUdfJ1I0N19TWSMtX1xZMEM3XyszSE1fUixOJl9cQjBCV186OF4gX1w7JVEvXSkKK00xJEtfMCNZJ19TNE8tX10gLjNHXytCKENfUjQ7J09cSykiM18pMiQ/X1IgRCcvXyhQW1tfQFchUF9TKEQKK00pP1xEJzFXXylSIEBfUyxKKk9cTSgyK18sIixCX1g+J0EvXzpTPFNfT1paTl9SREQpL1xEJ1FfXysyQEgKK01fUyBLKl9cVitCU185Nj1FX1VdRjlPXEMnQitfPUZRQV9WST03L14sQkgvX0MoXilfXj84Vy9eUEkqN18KK00rUlBLX1I4QSg/XEsqQi9fSzo6QF9cQlpNX19LWC1fXywyWE1fUiw/KD9cOyVRX18sIyxeX1NRIzBfXl8KK01LSltfT1siUF9fK0VZL11OOic7XzI1OUFfVTk3N09eUklKR19YPTcuX14/MlVfXF8vVFNfKCIoSV9SNEAKK00oT1xDJ1InXyhRXEFfUiA8J09cQCchW18oMVQ/X1IoPigvXD4mQVNfKlIsQV9URSszT10mNEVPXzZGNUwKK01fVDEvNk9cWTBUW18qQyRfX1MoUTNPXFApVi9fLSJJT19TXFY/L107NDlLXyYhNSlfVjU/Ql9dIS81V18KK00uNCUrX1k2NERfXTg1JVdfMyRdMF9dRzZVP1xQLEM/XywjJFJfVEUrMj9cUCxDR18sMyhdX1I8TyxfXyMKK01NW0NfWS03Ol9XWVE7L18gSlpHX1csRylfWDlSO09dVztGP19VK1cwX1EwRyxfXEUnUj9fLVQhLl9TRF8KK00xX1xBKFI7XywiUFRfUiREK19dLDIkS18+JklBX1c5SzkvXjJAOCdfMUNVJF9SLEQqX1xeLyNfX01KTkoKK01fXVcuWU9cRypTL18uVEU4X1I8SyxfXFYtQy9fMEQgXV9TXFsuP1w7JFEnXysiVEdfUlRTK19dOTg1V18KK01VPSsxX1NAWTAvXE0sI1NfLkM9JF9WRUQ6L1xMKEI3XytCMEdfUjg/J19cRihCI18vM1BVX10/K1FfXUwKK002VU9fKUFcP19SJD4nP1xHKCIjXytSOEZfUlRBKE9cVSoiP19DSForX11bMVQvXlNISitfKjIwRF9SMD8KK00nX1xIKFIvXypCNEVfU0BQK09dRTlWN184RkVJX1IoPSg/XjlDKCdfUFsqUl9YLVw9T11JOVYrX1k9OzoKK01fWlZBSE9cSSlCN18pMiBAX1NAUys/Xl1NKltfVSxDJF9eMzxWT1xYLTMzXykiIEJfUiA8KS9cUi00I18KK00vRDUlX1wqU0xfXyxPW1tfW14zQ19XJUo9T10nNFVTXzdFVUNfW0ZLSy9fSVZNM19ZPSM1X1Q1JTRPXDgKK00mQidfKSFcQV9SOEIpL1xDJ1InXyghUD5fUiA8J09cQScxX18oQVhAX1FYOicvXFUpUkNfMlQ5LF9VNUAKK006X10xNlY3XzFUVT1fUkBILV9dQDc2X188Rlo0X1IsQi4/XDAkIV9fIzBUOl9QSCklT1w7JjNLXysiPTEKK01fU0RUNU9cPygyQ19JWjZCX1VFNTdPXSIxNDtfVU0vMl9STE0sL1xYLkNDXy0zPFRfUyhVLk9cUCwzU18KK00qIyBUX1w6Wk5fX0dWLVdfRTddVl9cRlBKX19FUyxPX0dIOVdfV01ROV9fN1AtL18oIyxfX1IkOyhfXE8KK00tM19fOEY5SF9SNEcpP1xRKyJbXygyIEdfVFkmMS9eKD42U19CJ1VWX1kmIkBfXSsxJE9fKFI0TF9TNFUKK00uL15BRylTX1MrUzhfUkRKLD9cNCdSO18mUVREX1IoQis/XEUqQztfLyQxLl9RLDooL1xFKSJLXypSSFAKK01fU0RWLy9cPyYhQ18vM0UiX1NMWzJPXSoyRUdfNFUhNl9STEMoP1xYKyJXXypBWEFfUkxEJ09eN0JYK18KK01WLFMlX1VFLjM/XEopQkNfKCFMPV9SSEMoX1xKKFIvXyoiJEFfUyBGKE9eKUJIM19XTScwX1oyMkUvXEgKK00oIi9fKVFcQl9SSEMoX1xLKTIvXytSREdfVlVOO19dQDk2S18pQiRDX1oyMUE/XyBLOjdfUVtOVF9cNlkKK01ML18oTls7X0pKLkNfUkBFKl9cRShSO18xQ0BVX1s+UEpPXz9ULSNfWk1PPF9TMFEsL1xEKCIrXydBSEIKK01fUzxaMT9dJjNFK185RVlBX10vJ1JPXVs+N09fPkdVXl9XNVs/P11IOTZPX0tKLkhfXy9BV09fOFM9M18KK00yNFk6X1FEOig/XEgoQiNfKUFcP19SOEEoP1xBJzFfXychUD9fUiA+KD9cQSdSJ18nQUw6X1Q4Vy1fXSEKK00uVC9fMVRdP19VOTs5X10sM0U3XyMwLCxfUkw0J19cUigyP18lMEg3X1IkNCdfXEclUV9fJjBUNl9SJDoKK00oT1w4IlFDXylBQEdfUiA6KE9eNkJIT18xJCkrX1Q9KDI/XzFULF9fKyJYUV9UUS4zL1w5JyFXXygiNEoKK01fU1EhMV9cSStDL18yJC0nX11bNlY/Xik+Jk9fUDpOQl9eRzNSX144QSc7Xz9XMUlfXT5bU19cPCtDQ18KK00rIjRMX1I4US8vXjFEKF9fKjI4RV9TOFAtL1xJKFJPXzFTXFtfWU4rPl9eMUFHX19EOC4kX1RFJDJPXEIKK00pMyNfKFIsRl9aWkxLT186UF4jXykxUENfUUAxJi9cQSQhS18oMUhBX1FMOykvXEIqIyNfKzMgW19SNEQKK00qT1xOKzMzXzU1JTlfXTssU19dIi5UN18uU00qX1UtMzgvXTMzRTNfLCJARl9SJDUmL1xMKCInXzNENF8KK01fW15TSy9fPFNcS18xQ1hcX1JAQilPXEMmUVtfKjIoQl9SND4nT1xJKEIrXyxSREVfWEYqQS9fPlQ9I18KK01IKFowX1JAQChfXEcnUitfKiIkQV9SUEYpL1xQKyJLXzdVXUJfVVVCOV9cRSgiK19MKio5X1Y1ODRfXkYKK01HSVNfSUlSOF9cLldML14+RUkzXyoiLEVfUkhCKT9dNzIkQ19FKSovX11bMlU/X0JUXUNfK1JYTV9SMEAKK00oT1xCJ0I7Xy1TSSVfU1UgMD9eXE0rK19WTE8rX14rPlcvXTU2RTNfLTMsVV9WITk4L15DRilXX1s9PzgKK01fXFslUy9cXDA0V18nIUxCX1YpOjYvXTUzVFdfJkE0NV9SLD8oP1xBJ1InXychSDxfUVw9J19cPycxX18KK002JFUsX1RBKTQvXSY0VjNfMDRBNl9SPD0sL1xdKlJXX0pZKiFfVzk6NV9dOi8zU19GJzVOX1g1QTVfXiQKK004RV9fKlFAMl9ZOiE/X15HRDkvXyUgOCNfUzxJKU9dIjEkU18yNEkrX103MlQ/XDwnQidfKyJUTl9TXSIKK00xX1xQLTNPXysjJFdfUjBHKy9cPCZBV18nITw5X1hBVjsvXyFKWitfWk0zLF9ZNiA9L11XO1Y3X1U7VzIKK01fUUBKLi9cTCkyX18oUyBdX1oyQEdPXEwqIktfLyM8XV9SXEgsT10gLiM7X0gpMiVfWClZPF9eKT83W18KK003VU1DX1I4SS0/XFsuRCNfTys+XV9cOyFWP1xSLTNLXyciIEhfUSwyJ19cOyVRR18kUSw2X1E4NydPXDwKK00lUi9fJyE8PV9RKC4lT1xKKSJTX1QsMydfVS0sNU9dIDAkX18wNCUuX1UhKzQ/XEwoQjdfKlFcQl9UUSEKK00wL1xXKyJPXzYkVSxfWT4vQz9cVCsyV18pIVxBX1I4PydfXEspIjNfKlIwRF9SQEEoP1xSKiIzX0I4SiQKK01fXic0VF9eKz43T18oUUw+X1I0PSgvXEspIjNfKzI8RV9SVEkpX11AOCYvXzRVQT1fUjxCKS9eO0Q4V18KK00pIVQ9X1FINyc/XEMnQitfRihSJ19aOjtGT103NCUjXysiIDxfW1pSS09eIUBYJ19LWjZIX11LL1UvXFIKK00sIytfKTIkQ19RXDsoX1xWLjQzXy9DXFlfXEZfTl9fQlRdM19YXTsxX1UlLzFfXFwuIztfUywnJl9ePzgKK01XL19VV11XX1MsLypfU0BdMj9cOyZCJ18sQkhIX1M8UStfXSIvM1dfJjE0N19SJDomT1xFJ0FbXyghUD4KK01fUiA9KF9dWjxHI18vI1klX1Q9NzlfXFsxNS9fLjQpIl9RTDYsT11JNUgzXyUwUD1fUSw0Jl9cMiNBO18KK00lQSA4X1EwMSdPXDclQVdfIkA4Nl9TJEswP1w5JTFbXykxUDxfU10jMl9dKTFUR19VTScxX1IgPyk/XE4KK00rMy9fLDMsWl9SWFIuT1xQLTNPXykyQE1fUyBOLD9cQSchW19CV01SX1wmTUk/X0lVLSNfRig1W19XJU0KK005P18rTUxTXyVSRFdfUjg+Ki9cPykzN19RW15dX1JUSCpPXSQvVDdfKzJEUV9TQFEsP14/RThPX0E4MV0KK01fWFYqQj9dRjlGX18qQlReX1Q1ITI/XyRPPD9fVTxHQl9UPSszP1xHLFNTXyUhWE1fUyBQLz9cPidSS18KK00mQUxGX1IwPSlfXDgkMUNfJjEsO19SWEcrX19EVT1HXzFUISpfU1RdMy9cVi1EL18zVEkwX1JIPilfXEkKK00nIidfKzIsP19SXEMpL1w6JSFDXyhBUEBfUig9J19cSihCN18pUiBAX1JEQihPXEspIjNfKjIoQl9TMEoKK00pT11FOUYjX1gtLzJfWCVPPD9cRScyI18pMVRAX1JQRSk/XEopIitfKlI8RV9VXT84T105N0YvXychPDkKK01fXEJcTi9cRSdBW18oUiBGX1IoPCgvXDUjQFtfJjEwOF9WQUM5X1xIJ0FLX0taIjpfXCZfTV9fJE4rL18KK01QKypPX1M0VCxfXEMnUidfJlE8P19TPFoxP10tNCRLX1I8LydfXjM3WE9fRlVdQ185NV01X1ZBQDcvX0MKK01VLUNfXE1fP19fLz1WX18lTywvXy8kJS1fUjREKl9cXi1DM182NS0xX1ZRRzlfXEEnMV9fPDY9Q19STEAKK00nX1xFJ1IvXydBVERfWS4nQi9cUSwjP18wNFE9X1NEXTMvXFwyJFdfIUBMR19WOUNGL1xZLUY7XyYhIEwKK01fUUwsJ09cPiQhR18nUTg9X1FMOSxfXTc1WCNfNEUpWV9QXC8nT1xFKCIjXytDMFxfVC0hMF9fO1RNK18KK00qQkRQX1JYTS0vXFYuJCNfKlJYWV9SOEosT1xBKSJHXypSRExfU0hVLV9eX0wqS19VTC5dX15XOFVPXj4KK01CWC9fQTghVF9dQyBTX10gM0U/XytBVENfVzlWQT9fNlFcP18uIyBTX1ZdTDxPXFUtI09fLTMgUl9bTlMKK01LX14wRVkjXzA0MSVfVUk9Oi9cUy4kS18rUkxUX1oyPUo/XzRRLUNfMTNZJl9SLEApT1xBJ1JDXy1TPSIKK01fU0RaMT9dMzUlX18pQjhPX1JASCxfXD8nUkNfMiQhI19dWy9TX10jL1RDXzBULTJfU1BZMU9dIC5UJ18KK00pIVA/X1JEQCgvXFIqMkdfLFJISl9RRDMlX1w6JTFPXydBRD9fUVQ4Jy9cOyRRO18oIUQ5X1I0PidPXEgKK00oMidfLCJARF9ZJihAT183UiwvXzpFWTpfUjxCKS9cQSZRX18qIiBDX1MkSCovXEQoQV9fN0YtQ19WKUYKK006L14qQTg3XzQkQSZfUiA9Jy9cPycxX18oUVA8X1I0PSg/XEEmUV9fKUIgRF9SSEIpP10vMjQ/X0Q4WikKK01fWVI3RD9eVEwqQ18tQyRRX1MgSytfXV8/SDdfLSNBIF9WMUY5L15bTUtLX1ctOz5fXTM0VD9eXVBbX18KK01KWyZTX10zMVVfX0xWXU9fXE1TNF9bRlVNX1xfNCU7XyUyMERfVz1YPj9eWks6Q183NS02X1FYPCdfXD0KK00nIU9fRChKKF9UNFktP1xDJ0IrX0k5RjRfWClZPj9cTywzR18sQzBcX1JUVTE/XFoxNTtfIiBcQ19SND0KK00uL11KOSlbXzQ0WjBfU0BYPD9cOCZUS18mQShNX1JcSS9fXDQkMjNfJVE8Ql9RQDMlX1w7JiFbXygyJEQKK01fWkJISl9cSytDL18rIlhTX1M4WS9PXEwrQzdfKFJATl9RWEEpT1xFKVJLXyxTJFNfXCJWSy9eUkdZP18KK01XTDsjX1kuIT1fXiU9JltfSzlOP19WUUo7L14iPlc3X1ktPzZfXi8uUy9eUEdZX19OWypSX1I8RSovXE8KK00qQltfLSMkUF9SIEYqL10/OUY7XysjMF5fUyhXMj9cUCwjT19UXE81X14nNFlPXFIqQzNfKTIgRF9RODIKK00mT1w5JiFfXydRWEVfUVQ8KF9cQCdSO18nQVhLX1I8SCtfXUU3RVtfV10jMV9TPFUvT1xQLCNfXzEjWSwKK01fVChbME9cTSlCO18pMVg+X1I0PidPXEImUU9fLCJITl9RRDQmL1w1JCEzXyVRKDZfUUgyJT9cQiZRT18KK00qUjBEX1JMRCkvXFYsMydfKTFUQF9XWVI9P11BNjVTXykhXENfUiQ8KC9cSyhSO18rUjhGX1I8Rik/XT0KK004NV9fPyghXl9ZSjNEX1xPKTJDXydRTD1fUUQ6Jl9cPyZBU18oIUg+X1IoPCgvXD8mMVdfKFFUQV9RQDMKK00lX1w8JVFPXycxSDlfVTEyM19eL0JIU18zVEkuX1FcPik/XF0wNEdfNVVROF9cIyJRP18zVD4nX08rPykKK01fUiw8Kz9dKTBVJ19VPFs4X15LPVcvX0pVTUNfSVlSSV9USSI1T1xcKFMzXz1WWVVfXC5US09dKzAkN18KK00oMVhEX1ZRSzpPXFAqUjtfRlhaLV9SREMpX15YSzo7XyohWDpfVkVIO19dJDFEV18mUVxHX1M9IDNPXSYKK00zViNfL1QpLl9RIC0mT1wpICErXyhBPE5fUFgnJj9cSSkjI18mUUxEX1MkVDAvXEgrU1dfKSI4TV9RRDkKK00nL10pMjRTXyUhMDdfUUw9KE9cSSsjJ18rUyhXX1JYUS1PXEQqMl9fKFI4S19SOEgqX1xdL0NfX09LMkkKK01fWy4/RV9fRlNcS19EWCVXX1hZWzxfXyFMSldfOjVdO19VWTIyP19OV11LX1ktLzNfXT8oUj9dJTAkM18KK00uM0hbX1IsQSdPXUE3VUtfKlMgTl9SRE0qX10nMjUnXy0jMSdfUzBPLl9fMlFMX19WLE89X1JYRiwvXFEKK00rIyNfJ1FMQ19RTDcnX1xCJ1I3XycxSEBfUyBNLF9cUSwzS18lUTA6X1M8UCwvX0NVLUdfLlNBJF9TXF8KK00zT1xeLiQ7XyxSUFNfUjg/J19cRygiI18rMjhGX1I4PydfXFYrQydfLEJITV9TOE4sP1xCJkFXXydBPDcKK01fUkhDKF9cSShCK18qMihCX1I0QCkvXD4mUidfJyFEP19RVDooL1xIKFJHXypSOEpfUkxDKU9cTSkiM18KK00pIixCX1Y9RTgvXUY4NU9fKiFUPF9bKkdLT11TOzc3XylCPE5fUVQ8KF9cQicyJ18oIUw/X1FYOSc/XEEKK00nIiNfKFFYRF9SKD0oX1w/JkIjXyZBMDxfUjQ/KF9cQSciI18pQjRMX1JMTy1fXkJGOUdfSVpGTF9XUjkKK01JP108QVlfXzAjTTVfVkUzOi9eT0dKR186JVlBX11TL1NPXi1DSTdfLlRNNV9TPSIwX14uQ1kjX1U8OyAKK01fU1hTLi9cRykiS19GKS4uX1leNERfXjZCSFdfJ0FEO19cOlpMX1xaLCJTX09bWyVfVCUjMk9dPjclW18KK00tIzhdX1NRJzRPXFwyVSdfJ1JEP19UNSgwT141RSlPXyoyXFlfVVE/OS9cOygiN18rQzkgX1FAQiwvXF0KK00xRFNfLSNIXF9UISIxP1w5JVFLXyVRRD5fUlRQLT9cSSsjJ18rQyRWX1IkRisvXEIpMktfK0MgU19TRFoKK00uX15eTSpHX0s5RjFfXisrUU9eLD5HI19GKEFeX1wiVEs/XV88VlNfSik2KV9ePzdVL18uT0wrXzEzSF8KK01fUlxSLV9dITFEO18wVCRcX1hWLUAvXUU5VVtfKkJESF9SVE0uL11XPSg7XzFDXSdfW05RTS9fPlQ+L18KK00qIiBKX1IgOydfXEEnMjdfKEFUQ19RTDYmT1w/JkFbXyoiLEdfUUw4J09cOSUxP19JOVo+X11LL1VPXSMKK00wVFtfLyNRK19UIFoyL1xRKkMnXylSIEBfUiw8Jy9cSykiM18pQVw/X1JQQyhfXFUrIlNfLiJcT19TIEcKK00pX1xSKlJPXypSMERfUjxAKC9cSykiM18qUixHX1E0MCUvXDUlMUNfJlE0OV9RUDUnL1w8JVFPXyghQDsKK01fUkxCKE9cQygyL188RlVHX1Q8XStfXkFEWSNfVEw3MF9WKTs5X1w5JkI3XydCJExfUyxSLi9cRShSO18KK00oIVhBX1FYPCdfXEMoIV9fKDFYPV9SJDwoL1xBJyIrXylBXEZfUVg5Jz9cPCZSK18rUyxbX1lKMUYvXjwKK01IOidfLURdLl9UNT86L1xaLVQzX0RYLitfW0ZKS09dQTZGJ19ZLVdHX1daIURPXSEyNVdfK0JIUl9ZTjYKK01GT18vUCtLXy1SUFFfUkxIK09eVko6M19POlpPX1dVUj4/XEgoUi9fUTtGUF9ZTjFDP18oUVxbXzMkWTUKK01fUTg0JU9dX0A4Q18wVFU7X1NJJjU/XD0rIkNfMyRZM19YXipHL1xILEQ7XydSLEVfVEkrMy9cPigiQ18KK00qIkxcX1NMXTEvXFQuI0tfMERBKl9TTSEwX1xOLDM7XytDJFZfUkRMLD9cSiszK18pQkxRX1JASywvXFQKK00tQ0dfKSI0Rl9cKlhLP15XSFlPX1gsRyRfWE1ZO19eQEM4N19OWk5IX1YtOzY/XTMyVCdfWU0zMF9eKy0KK01SX142QlhLXy0zSFpfUyxYLz9cQSdBV19EKEoiX1dNWTw/XEYpQkdfKTJAVF9STE4vX10zNEVDX0E4NiIKK01fXicvWF9cUSsjI18oQixKX1MoTi1PXEUoIitfJSBcM19RWDknP1xRKyMjXzBTXSdfUkBKK19fLE9cM18KK01WPEMyX1VBNjo/XSYyNU9fMFQtLl9SREEpP1xKJ1FbXy0iREhfUlhDKE9cSyghX18sIkBEX1JQRyhPXFQKK00rUktfKiIsPl9TKEopT1xSKVI7XytSMENfUlhDKE9cSShCK18qQjRFX1FQNyVfXDckQStfJzFAOl9RVDgKK00mT1w9JiFDXypSOEZfUVQ2Jz9eJT5HL189RkU8X1Q8WDBfXFIqM0tfKTFYSF9RWDooX1w6JjI7XyYxSEUKK01fUUA4KD9cSSozK18sMyRaX1JMTCs/XEMoQidfKDFcQV9RXD0nX1w/JzIjXychSD1fUTw1Ji9cVS0jS18KK00lUTA6X1E0NSYvXD8oIidfK1JETV9SLEQpP10zMkQzX0E3OVBfVlVUPk9dN0Q6P18yKEJHX1MhUENfXFoKK005SENfKkMhJl9XITo2X1xXKEI/XykiJEdfWzpPSj9fME47S184NTE5X1JcTStfXy1QO0NfOkZNVl9dSzEKK01UP10hMlVLXzQkWTFfXCJeUC9dJjQlX18vREk5X1E8QyhPXSYxJCdfQSgqMl9SME0vT1xMLTM3XykyKD0KK01fVE0qNV9cTC00L18uM1EhX1NIXjAvXSUyNE9fLFNEW19TPFwwP1xRLFM7XyQxLDZfUyRWLy9cRClTK18KK00oUjhLX1FMQCgvXFAsUzNfTFpaTl9dNy5TT185U10rX1VdIzBfXiMwVS9fRFRNO19QOyJWX1sqQ0lfX08KK01VPUNfV00vOF9WTUY6L11UO1ZHXysiWEtfUjxGKT9eIT9XS186VkVEX1Q5JTJfXEkqU0tfJkFUTl9TJFUKK00tX10lMUQ/X1hNJ0lfUzBTLk9dNTcmQ18oIVxMX1FQOyhPXEIoIkdfKDFcSF9SJD8qL1xSK0M/XyZRWEMKK01fXSMhUT9fOVItK183JU1MX1RRLzgvXF8vVENfKlIsRl9STEAnX1xMKSIrXyoyJD9fUkxDKD9cTClCM18KK00rUkRHX1JEQyg/XEYoIVtfKSFQOl9SVEUoX1xOKUIzXysyNENfUlxIKi9cVCtSX18oUVg+X1JUSCovXFUKK00sIyNfJ0FEOV9SVEgqL1xEJ1FfXykiKERfWE1ePj9dJS1TQ18pQzE1X1EoPi5fXDgmMktfJUEsP19RODUKK00oT1w+JzJLXyZBSEVfUVg+Kj9cOCYiL18lISw6X1MoUS4vXD8nQjdfKCFcRl9RWDwnX1w+JyFfXychSD0KK01fUjxFKi9cSSlSS18kUSQ0X1IkPyhPXEYpIj9fJyFMQV9WKTY0T18jTEpTXzhWRUtfUVhZLk9cKikiP18KK00nRD0sX1YyJUQ/XTo/OEtfSFpaSV9TOFEsX1xNKiJbX01LSlJfXFJaTy9dJy8kJ18qMjxJX1xKXk0/XSQKK00yRUtfVTxLKV9TQSU1T14rQjhTX1IsLyNfVCksNl9cVzBVK18qQzhVX1RRKjE/XiNBOTNfKSJZIl9SOFIKK00sP10hL1NDXzNUWTtfUUxFLF9cUC0jO18qQlhQX1JcUy0/XEcqUldfKjJYVF9SXFEtL1xLKzMjXyszJFkKK01fUkhQLk9cQSkiR18pIkBGX1M0VS4vXyhOS09fUUsyVl9cJk9MP15dSlpXX0s5XkBfWiY1RU9eQUU5O18KK01GOFYuX1ktWD9PXSoxNEdfLUMwVl9VLS4yL11OO0ZPXyZBRDhfUjhFKS9dQjg2I182JT0+X1JASS5PXEQKK00pU0NfLSNAWl9UQSYyL19BVF5fXypSVFVfVEExN19cTiwjX18mQVRIX1I4Si4/XD0oMyNfJCEwQ19VPTAKK002T11JOlZbX09LIlFfXDJZUC9dRTk2W18zRSE4X1Q5KTNPXEopMj9fKTFYPl9SJDomT1xDJyFTXyhRUDwKK01fUkBBKD9cQSZBS18qMihCX1JYRylfXFEqQktfKUFcP19SSEMoX1xNKUI7XypCNEVfUjxCKE9cTSoiQ18KK00qUjhGX1MwTytfXEkpIjNfKTIgQF9SJDwnL1w/KDFfXzMjXF5fU1BVL19dIzlYU181JlItX1BUNCovXDcKK00lIiNfJVE0Pl9RQDUoP1wzJCFTXyYhNEFfUVQ6KU9cOiVSM18nUVBJX1FENihfXEAnMktfLSMoW19SREgKK00rX10oMVRbXydRWEVfUVg8J19cMyQxM18jUFQwX1BMKSMvXDckQUNfMENAW19RWDQkL1w4JkE/XyVBPDAKK01fUzhVK09cQS4jL18zNV1DX1NdITIvXzdSLC9fLEI8Tl9RUD8pL1xYMENDXzk1RTpfUzRPLF9cWC0jO18KK01SS1pVX1I0Sy5fXy9RLC9fLUQtNF9ZRjdGT18tUixDXzAkSTlfU0UlNS9dSjxXL188VyFLX1dVX0NPXFEKK00wJS9fLSQgX19UPSUvT102NTYrXyhCUFpfU1kiMS9cWS8zX18vVC0lX1NVITBfXFwwND9fLVNEXF9TWSAKK00wX1xQLSNTXylSVFdfUiREKj9cRSlSN19ISVJAX147MVNfX1tYTVdfXi1fOl9fS0FXL19dWU4nX15OLz4KK01fX0NBVy9fWVhNV19dLUM6X1ZVSzs/XEYpQkdfLiM0UF9ZLjJEP1xFKFI3XyhCIEJfUiQ/KD9dMzRFR18KK00rQl0gX1IwRy4vXFYuQ1NfM1RVL19eMzFZX1xJKUJTXywjOSBfUzhTL19cQyhSU18kUTA/X1EsNCdfXFsKK00vJD9fKlIwTF9SWEwrT1xfLSMvXzZFKTZfVUU5Ny9cVC1TQ18rMyhSX1I4RSkvXEInMV9fKTIgQl9SKD0KK00nX1xFKCIrXysiMEdfUjA8J19cSSgyM18qUixGX1JERClPXEMnQiNfKiIsRV9SOEEoX1xGKDInXygxUDwKK01fUjA/J19cRCdRX18mQTQ1X1IoPSc/XEcoQitfKSFcP19SKDonT1xDJyFTXygxXEJfUUBBLE9cMCVSR18KK00nQVhHX1JQSStfXEAoIkdfJ0FMR19RODEnP1w3JEFbXyVRKD5fUTg0Jz9cOSVSI18nMUxEX1FcPSlPXDoKK00mQi9fJVE8QF9RUDwpP1xTLFNTXzVVMTpfUkhIKl9cMCNBJ18mQUA7X1YhQDc/XVg+Rz9fLyNdIF9RNDcKK00mT1w+KCI3XzBUISZfUURGKV9dOTZVW19ROypSX18rNVQ/XFcpUl9fKFIsRl9YRitAT18rTVtHXy0ySE8KK01fUyRPLD9fLlBLR187VzYlX1xTIVAvXFsyJUdfRChaMV9cSyVRP1xUL0RXXytTTSpfV0VeP09fO1VNJ18KK007Nl1eX1MpIjU/XE0uU0tfNSUpK19VKTE3T1xSLyRLXyYxVD9fUTQ5Jl9cUi1DQ18uQ1kgX1NIXzE/XF0KK00vVCtfMyRZMV9TIFQvL1xFKlM3XygyMElfVk1IOV9eW0wrN19UXEMnX1xXI09fXzRSTDtfVy0rLl9eNzkKK01VP19IVk0/X1k9PzRfXks8Vj9fVlhNW183JVk8X1ZRTjw/XEQoMiNfLlNEW19RXD0oL10mMSQ/XyZBQDsKK01fVU06OD9cPidTI18pIjxYX1MwWC5PXiJAKCtfWT1PTF9TMEwtT1xNKVJfXydBTEFfUkhMLD9cQykyU18KK00oMVxIX1JYSS0/XD8mQiNfJ0FIPF9RQDMlP1w6JUFDXylCJENfUjRDKU9dITAkO18pUixFX1FAMyY/XDcKK00lMUNfJUE8OF9RMDYmX1wwIlBfXyZBMDhfUUQzJV9cOSRRP18kQFAwX1FINCYvXDMjMSdfJlE0OV9RTDMKK00lX1wxIjBXXyQwTC9fUSQsJC9cNiQxL18nITw5X1IsPigvXEMnQiNfJzFAOl9SLDwlT1w8J0IvXyoiLEkKK01fUVg6KE9cPScyO18nMVRGX1FQPSovXEwqUytfLEMkV19SID8pP1w4JVFXXyZBPD1fUUg3Jz9cOSVBU18KK00lUTA6X1E8NyZPXD0nIitfKUI0TF9RVDopT1w3JUFTXzdFWUFfUyBQLF9dLDMkX18rQkhMX1FUQCg/XFoKK00wRDNfJjFMPl9RNDcnX1w8JyI3XyRRODdfVi0/Nz9fJE87P19aTUs3X1JIRiovXEcoMV9fTEo6P19eLysKK01TT1xQKiJTXywiUE5fXC5XTF9dTj1XI19OWzZZX1NdMjcvXjBEOStfUEwzKV9TPF0zP1xZMDU3Xz5IJicKK01fXTMsUk9dSDonP18vJDk1X1NRIjEvXVQ7JkNfMyRNOF9SWFkxL1wxJlErXyhCMElfU0BaLz9cNSZBS18KK00pQkxQX1NEXDA/XSkyJF9fLEM4Xl9TMFUwL1xAKTJLX0paKkJfXDpXTy9eTEZZN19KSTIrX1pCM0FfXj8KK01CV1dfRVhBW19ZPiU+X11bOiYjX0JHUVNfXj8yUz9dQzhWI19KWk5OX1RJJTE/XSgxNE9fKCFMP19YKV8KK00/T11JOTY/XzklXUNfVVU9Oy9cQylTV18vI1UkX1k2MEVPX0lXLj9fJlEkOl9SOD8pT1xAJlFfXyhBVEMKK01fUjA/KT9cRykiS18rMkhQX1FAMyVfXD0mMU9fJVEsNV9RNDEkX1w3JCEjXychPD1fU1RcMF9cRCdCK18KK00wQyhaX1MkQClPXEElMTtfKUFMQF9RUDMmT1w9JVFPXzM0PStfUUg0Ji9cNyQxN18nITg6X1JIRCovXDwKK00lQUtfJ0EsOF9RMCwkL1w8JUFLXyVRKDZfUTgxJF9cPSYhS18pUihEX1FcOicvXDsmMVNfJ0FIOF9RKDoKK00qT1w2JzMnXyVRPEJfUUw7KU9cOyZSO18mUUxGX1FQOihfXD0mUjNfJ0FQRV9SREcsL1xOKlMnXywiVFMKK01fUTw0Jk9cMyQhO18kUSw2X1EoMiU/XDUlIU9fJSEoO19SKEQqP1xeMCQvXypCUE9fUkhMK19cTitDJ18KK001JTk5X1QtJTIvXDcjUS9fJVEsO19TMFMuT1xRKyMjXzJUOSZfWkZCRy9fS1YtQ18qQjhIX1JUSik/XykKK01POztfWl0vNl9SVEUqP1xSKzJfX0xaMklfV1IiPk9eW0w7T18wJTFCX1kuKENfXl5PPEtfMEU9SV9UPVIKK01BL10nPzg/X00rXyZfViE4Oy9cTjBUX187R0VaX11bNlRPXSkyJTdfKzNBI19SUFQqT10tM0U3Xy5TVSAKK01fUlxSLF9cRysjJ18uM00iX1RJKDQ/XFItNCNfKlJQV19RTEMpX148RCknX1MrVyJfXC5PSV9eXkkpP18KK01POi41X1teRkU/XyZLSU9fUTpOOF9cMkZFT18kSzojX1dcOyFfVyVQO19eU0xbO180NFEuX1VFMzZfXEYKK00oMjdfRChaK19YQiRBT11GODYvXzlGOVVfUkxOMV9cUixDT19KKiJDX15XOVhfXEImIidfJzFQQ19RVDwKK00oX1xJKFJPXyYhKDpfUUAzJV9cPycxX18pIiBCX1FYOicvXDwmIUtfJkE4OF9RWDclX1xFKCI7Xy8zUSMKK01fUjhAKS9eQ0Y5U19NKlpMX1hGJkA/XEwqMkNfJ0FAPF9RMC4kT15PSjpXXyZRNDlfVyFKO09cSChCO18KK002VTU5X1M8US0/XjlDSS9fOSVRQF9YKVxAL1wzI0ErXyUxIDJfUjhBKF9cRyhCM18nUUg8X1BYLiQ/XDYKK00kQTNfJEFYU19SQFU0T1wyJDFbXyRAXDtfUTAxJz9cNyUiI18mUUBEX1FYOylfXD8nIkNfJkE8Q19SID4KK00pX1w/JzI7XyZBQEFfUSgwJj9cMSQhP18kQSQ4X1EsMiYvXDQkUUdfKDIsRl9RWEAoX1xaLyNfXy5DUF8KK01fUTA6Jy9cVy4zU180JE0vX1kyKUNPXUs5Jk9fQEdWI19UKSAwX11DODYvX0k6LkBfXkc6Vl9cSykyR18KK00rQlhLX1xXIU8vX1JWTVdfKUFYQl9SREQpT15QSCpDX1AsIl1fW0pJTj9cUzMlV185RzVbX1ZeJEQvXU4KK01BSUdfNjdCKl9XKjBJT11PRClTXzhIVj9fUkBcMk9eIkEoP19WLSMsX1RZLTZPXFkxJF9fNyVZNV9TSFsKK00wT1xTLVNHXzxHLVRfUyBTLi9cXC9EN18wM10oX1MoVTAvXEsrIz9fKSJYUl9bTlJMT18tUCw3X1AqUkQKK01fWz49RC9eU0Y4T19QWko5X1wySkU/Xy1LWUtfUFoyMl9cRlBHX19AUjwzXz0nNVZfWkZKTD9dPzZFW18KK005RilKX1I0QCkvXjVEWSNfQyhCKl9WNUA4T11VPTgzXyszISlfUyBQLj9eT0oqQ19ZXTNEX1IsPSpfXFAKK00uRENfJlIgUl9SJEYuL1w4JlJTXyUxNEBfUUw2Jy9cOSUxP18nIUA6X1I8Qyk/XFUsMy9fMFNQXF9TOFEKK00tX1xRLCM/XytCQExfVjU9Nl9dUDo2L18zJEReX1RZKzFPXEInMV9fJjEsN19RPDElP1w0I0ErXyYhKDYKK01fUiw9KD9cOSRRP18lQSA0X1FcNCY/XDcjUS9fJVEkNV9RSDUmP1w2JDEvXykhXEFfUjA/KD9cRCdSJ18KK00kQSAyX1FQNyRPXCwkMVdfI1EsQl9RKC4lX1w4JFFfXyVBJD1fUVA3KF9cPCZCL18lUTg9X1E4NScvXDkKK00mIV9fJzFURl9RTDspT1w7JlI7XyUxNEBfUSgwJj9cMyQxS18lQTQ7X1JQTStPXE4sIy9fJjFMPl9SLEUKK00qL1xGKiJPXygiQEpfUkhOLC9cTSszI18qUlxRX1JESipfXE8rUytfJ0IoRF9ULSgzP10lMkRDX1QrXyUKK01fUlxGKz9cSCoyS19LSio9X183PVgvXEkoMjdfKyI8SV9bUlBMX18yVDxLX0xaKk1fVElHPE9dUkFIS18KK00yNVFEX1ZZV0E/XTI0RV9fNSVRTF9TWSo0P11YREo3XzNGQVZfV0ogQE9fO1RcX186Jj1UX1MgWzFPXkAKK01HSTtfMCNdJl9TTSEwX15eTktTXysiXFRfU0RbME9dKzI1K18qUlhZX1I0SCxfXEMrUy9fQDdRXF9cPlwKK01QP15HRFhPX086LjZfWyI2Qi9fIUopP19SKyY/X1xWUkg/XyFJOT9fUjsqRl9dTydQX106NyVfX0tLIlgKK01fVUE1Nl9dVTw3R18pUihGX1lOOUVPXi9CWFdfNzVBOl9WTUs+T1xJKyQ3Xy0jMF1fVkE9OE9fOFQtW18KK00kUThHX1NFJzcvXDEnQ09fMDRRRV9SQE8xP1w7JzJTXychUEdfUiQ6KE9cTSlCV18sIkxRX1MsUS0vXFQKK00rUy9fL1QlJl9TOFgwL1xaLiNPX1YsRylfXFJdTV9dWTtGL18+NlVIX1FINSVfXUA2VV9fNDRRMF9RPDIKK00lT1xCJyIjXykxXENfVFkoMy9dOjUlQ19AJ0leX1MgSitPXDYkITNfLVMkVV9RRDcmP1w8JiFLXyhBVD8KK01fUVw9J19cNCQhK18rQkRDX1NVJTNfXDQiQUdfJFEkNF9RLDAoT1xBKSJfXygiJEhfUVA8KT9cNyVSI18KK00nIVBFX1FIOihfXEIoQk9fJlFMRF9RODQnP1w3JFFTXyUxKD5fUTA0KD9cNSYyJ18yJEUqX1RFKzI/XEoKK00rMltfJyFcQF9RSD0nT1w4JkFfXyYhPD5fUUg2J09cPidSO18pQjRLX1NAWi8/XDwoMidfLkNMXF9bUlkKK01NL19HVT1HXylCIEhfUlhSLC9fIk1LJ19dPVdAX1JIQilPXE8qQktfTFpSTF9dQytST15CRzonXzVWTU8KK01fWU5CS09eN0Y6J18pUjhMX1FYPShfXEIpQltfOTY5TV9bJlZQT10mNzZHX0BITjFfXU81VF9dIzFFK18KK00uRDEyX1suTko/XSMxNFNfLlNYX19bWlxPX1xRLUNTXy5TVSVfVCBeMV9cRypTL18rQyBYX1I0TStfXiEKK00+Nz9fTlpeUl9dUypRT18+Ulw3X1dMVydfXVcpUD9fQlI8K19UK05WX11DJFAvXzFOSzdfV1xHK19VLTYKK002X15FSipXXzVVKThfWEomQ09cRSgiM19ISV4+X1lONkZPXUU4JjNfPCZZXl9SPEgwP1xTLTNXXztHLVkKK01fXj86Vj9cXi4jO18tQzRUX1NEVy4/XF0vVD9fJ0IkTF9RTDooL1xDJ1InXyxCTEtfUzRQLE9cWy1TR18KK00uU0hZX1MsUy1PXE0rMztfLVNFIV9SSEgqX11KNzVTXzZEXShfVzlOOS9eJj9XR18nQUQ7X1FAMyVfXD0KK00mIVNfJzFAPF9RTDUmP108NUVLXydBQDxfUUg0Ji9cPiYhU18pUiRFX1I4QCkvXEInIiNfJTBYLl9ZWjEKK01EL1xTKSIzXykhRDhfUjw5Jk9dLjFUJ18uJC0uX1FIMykvXDQlMTtfJVEwR19SREwtX1xRLFM7XykiME8KK01fUVQ9Ki9cQSgyU18nIVBHX1EwNidPXDAkIUdfJFEkOl9RLC8mL1w2JFIjXyVRSEVfUkBNLF9cXC5DV18KK00vU1RaX1NUWy1PXF0uUztfL1NUWF9TJE8sP1w+JyFfXyZBQDtfUVA6Jz9cPCZBV18lUTw6X1FAOycvXisKK01BWDdfVCxDJF9eRzdWX1xJKUJTXy0zLE5fXTMnUE9fT1VdU18rQjhKX1MkTCsvXlZMOydfWj1HPV9ZQjgKK01GX104OUZHX0cqMk5fUSw2Jl9dLjNET18+V1VaX1U9ODY/XEsrMyNfKjMsV19TQSczL14jQihXX1ZdNzMKK01fVCEkNF9cWTBVJ19CWDohX1NZIzI/XSYyNEtfUlxHLF9TJFgvT10iMTRLXy9DVSRfUkRMLV9cVS1TX18KK00qIyBSX1wmVk0/Xl5LWy9fVF0nLl9ULSMwL10hMVQvXzZFSTdfXFMqUV9dLzQ0W182JVU5X1VNPTZPXzAKK01PXDdfMkRVMl9bMldPL11KOTZPX0cpOj5fUjhBKT9eRkhaK19HOUI+X1ZJRTo/XVU8OCdfKjJJI19TKFQKK00vL14pQShDX1hNQ0FfUkBDKV9cPighW18sUyRMX1M8Uyw/XSEvM09fM1RJJV9VNTAyT10mMDNPXzAzWFkKK01fVDkkMD9cXC5DU18qQkRQX1MoUy9PXFgtQ19fLEJMS19dNyhRX15IR1lHXz1HIUhfVkVEN19cPSYhS18KK00oIUw/X1EoLSQ/XVA6Vl9fJzE8O19UJFsvX1w7JTFHXzY1LTdfUTgwJS9cRSdSL186Ni1HX1FUNyZfXD0KK00nQUNfOTYtPF9ZIilAX147RkkvX0M3TVhfWjo8Ri9cXzQlW18lMSxDX1FEOydPXEAnQydfJjFEQl9SNEMKK00oL1xNKlMzXysyVFhfUkxLLU9cRSkzI18oIiRMX1I4RyxPXDQlIV9fJFEgPF9RQDcqL1w8JzJDXzZVVUAKK01fUixCKi9cRChBX18tQyxOX1Q5Iy9PXSIvU0tfL0NQWV9RWD4mX1xfL1NTXzBULSBfUjBCKS9cPygxX18KK00vVDEgX1Y9RDdfXy1SLC9fWk1PQF9SPEcqT1xdLTJPX1VcOyBfXy87WC9cRydSL18tIlxPX1tCVU0vX0EKK01VPUNfRVk+Ol9UTTU2P1w2JiFfXylSQElfVlVMOT9dKzNUP184Ri08X1JISyk/XT85JiNfNDVFNl9YSi4KK01EL19BVl1HXy9ULTJfU1EmNS9eWk07I18wNDksX1QhIzEvXytSPFNfLiQlIV9UJSYxT10qMjUjXywzMF8KK01fUkBKLE9cRCsiW19QW0JXX1taT0xfXy9RTDtfMFNcXV9TTFktT10uMiQ7X1YtIzNfVD0nMS9dMDRUV18KK00yNDklX10vIlJPXTE1JUdfTUtGXl9WRUQ6T15ER0o7XylCJEVfVklHOU9eQUcqK188NlFQX1c9U0BfXEwKK00rNDtfK0MgWF9WJUA3X19NVl5HXyhBQEJfUFwwJV9cMCRBP18mQTQ3X1FENCVPXDUkIStfJjEwNl9SIDoKK00mL1xSK0JTXzJENSlfU0xXL19dKzIlM18yNEU2X1NEVS9PXllLKk9fOlVVPl9UTSMvX11POkYzXzdVTTkKK01fUTwyJU9dJTAkM19IWVpCX1FENCYvXEUnUi9fMjQtJ19YMV5AT11POjZXXzlWJUVfVj1BOT9eID5HW18KK00nQUA8X1JcSikvXklHWTdfQ1glWF9WTUM2P11ROCVLX0RIVihfVCEzOT9cQSYyP18mMUQ8X1IsQS0vXEAKK00oMkNfOUYlO19RODImT1w/J1JLXyVBOEFfUVg+Kj9cRypDO18rMyBcX1EwNCg/XDQkUiNfJVFETl9RXEEKK00qP14nQSgvXyVBQD1fUUQ4J09cRykyQ18sIlhRX1FUOydPXD4nMVNfKzJQS19TMFMsT10iMDQjXytCVEwKK01fUkxNKk9dWD83P19IKVo3X1haKEFPX0BVPUtfJlFQPV9WVTwzX189UiwvX1s9NzpfUyRJKz9dIS8jU18KK01NOz5VX14rOFZfXiZBKD9fLENIXl9RVDspL11KOSZDXzomNUBfVSU2NC9dSTlWK18xJCRcX1YtPzc/XEUKK00oQidfQjhGLF9eLz1WX1xcMCRfXy8kOTRfWz5SSz9dITFEU18vNCEhX1oiPkg/XFAuQz9fMCQ5Il9URSgKK00zT1xWLjQzXyoySFVfUihKKy9fJE47Q19RKzZZX11HLVIvXS0xI1dfMDNMU19VKScwL19EVF0vXzclKSgKK01fVj1ENF9dNzJEN19VPCMmX1QxJzMvXiFBKEdfPUclV19VQTI2T101NCUzXycxSDlfUVQ4J09dTzpGW18KK008NlVdX1JASTBPXEwrQztfOjZRTV9fRzhdX1w2JDE3XygxJDVfUVQvJi9cNCRBN18lMSA0X1FAMyVfXDcKK00kQUNfI0BELV9TNFAtL10mMSQ/XzQkVTNfVDknNE9dNjY2M18zJD0tX1w6VUtfX0dUTFtfQyddXl9RTDkKK00mX1w1JiFHXyUxLDVfUUA0JU9cOiVBQ18lQSg0X1EkKyNfXC4iIFNfKCFIPl9RTDUmP1w0I1EvXyghTD8KK01fUTAvJF9cPiYxV18vU1hTX1tWVElPXyBMSkdfTys6Tl9cPl9OX15KRlhbXzIlTVlfVS0wNU9cOidRX18KK00qUjkqX1FQPig/XTg1RD9fJ0FARl9RXD0pT1w5JVFLXyUhMD1fUjRMLE9cMyVCK18jIFQ0X1FIOilfXCwKK00mRCdfMUQ5MV9cIllMX1xGKiI7XydBRD1fUTgxJT9cNiVBR18kQTQ2X1I0RidfXTY0VFtfKFFcQV9SJEMKK00oP1xEKjI3Xy9UMSJfUVxDKD9dMzQ1L187RlFJX1hKKUIvXD0nUVdfQldBTl9cQlRML182UVxPXyhRVEEKK01fVUk0NE9fI087T19YTUs9X1glXkEvXEgqQydfKCFMQV9XJUU4P11ePFZTXy5DUSFfUTwyJi9dODVEW18KK00tIyRQX1NIWC5fXU08Ny9fVj07NV9TSF80P1xRLlRHX1BLSlZfVCElMl9cWS9DU19SLC8jX1I8Sys/XF4KK00wJC9fMUQ9Ll9SQEstT1xSLUNbXyVSKENfXC5ZTT9fJk0rO19VXFsoX1UpIy8/XSIvQztfNCRAXl9eUzQKK01UP11QODUzXz1HKT1fViU7NF9fNVBcP18xNEEtX1NEXTE/XFYsU0dfO1ZVUF9SNEEoX1w+JkFTXyghUD4KK01fVzVTPU9eID9YU18rIlReX1MkUy4vXlBKWl9fXi0/SF9RQDomL1w2JEFPXyYgWDdfUTAyJS9cNSQhM18KK00kUFgyX1FAMyVfXFktU0tfL1NVIF9USSgyX10lMFQ7XzAkKSlfVC0lMz9dJzBEQ19UK15ZX15XN1NfXiQKK009NztfKCFAPF9RUDcmP1w3JFE3XyYhMDZfUlxLKz9dLDIkS182VTU5X1RRJjJPXDQjQStfKFFUQV9TJEwKK00sL10gLlNfXyZBNDlfUTAvJF9eWktaQ19ROyZJX1oiKUEvXiA7JkNfOlYtRl9bQkZGL1xTMUYzXyYhRDoKK01fUSg3Jy9cQylFI18lMUA9X1VRODI/XDomIk9fJzFUSF9RSDgmT1w2JiIjXyhSUFJfUTg2KT9cNCVBW18KK00mIVBRX1IoWjpfXjRFWkNfSSlOO19ULF4wT1w8JUFLXzAzUSBfUUg4Jk9cOycxS18yREEgX1omPkY/XDoKK00lQUNfKyJMSl9UISAvP1xSK1JbXyRQXDFfUUg1Jj9cPiZRS18qIlBKX1ZFSTlPXUI0REdfTVpKRV9cKloKK01PT1xFKCIzXzlVXT1fWV43RF9fQldNU188Ny1RX1RNLzQ/XFYuI1dfN1VJNV9WKTY0P10vMzUjXzYlKTYKK01fVFUtME9dKzJER18mMVA9X1c1Xj9PXz1WPU9fLyQhNV9SSFQwX15fTVsvXzEkRS9fU0BdLl9fL1JcR18KK00qMkxSX1NUXjE/XSAwJEdfKlJYWV9SOEwtL1w5KSI3X1A7OlVfXCpSTU9fQ1UsW189NVU0X1UhJi5fXTsKK000NC9fWl0zL19XXUw4L14rQEcnXzlGIThfXTMiUU9dITBUS18uQ1kmX1Q1JDJPXV4/J1tfKFFcQV9RXDsKK00nP1xCJ0IjXzo2PUpfUUA4KF9cNSVSO18zJFEvX1sqTUw/X19bPiNfKyFcLl9RXDwoT1w9JkIjXygxWD0KK01fUVg5Jz9cOSUhQ18mMTA4X1E4NCVfXEAnQidfK1JUUF9TPFUuL1xZLlQjXy9UISdfVTkxNV9fJk47M18KK01bTU8zX1hJXD4/XSUtQ0tfKjE8OV9ROC8jX1wzI1EnXyYhMDZfVVE4Nk9dSzk2R183NT07X1RBIjFPXTsKK001NUdfNTUhNF9RNDAlL1w+JjFXXyRAVDFfWFYnQT9eTUk6L19PO0JTX1tCUEsvXkVJKk9fUEsmRF9VKUIKK00/L1xDKCFfXyRRRENfVDk7Ql9cOSZSL183RS0oX1EsOCw/XDonIk9fJEEoNV9ROD0qX1xKLFNLXyUxPEwKK01fUFg1Kj9cMCZTV18oVCVZX1ouSU9fXipASDtfKjIkS19RNDMlT11GOTYzXyhCKD9fUyxUK09eLkE3X18KK01ISVI6X1E8NSVfXEopUitfQighXF9YUiVBP1w/JkFTXyYxPDpfUTg0JU9cNCUhP18mITQ0X1MkRidfXUUKK003NUdfNiUtN19TMFItP14oQCdbXzU1JS9fWCIiP19eJkIoN18tU1BYX1FAOygvXUM4VjtfO0ZFSV9bIkwKK01LT15dTktHXz1XPU5fU0xeMF9cWDBUM18/KEIlX11TOFZPXFkvNStfLDNNKl9bWlZMT1xTLiNbXy9ELSEKK01fXF8rUj9cUi0jT18wRC0qX1M8VzAvXE0sI09fKTJAU19SLE0sP15cTFsvX01KTlBfXiMzUU9eKDtGI18KK000RERbX1YpODM/X1FXLT9fQ1dJTl9ZUi8/T11JOFVPX1UsMyhfU0BaMD9cWC8kM18vQ1UjX1kiLkQvXEAKK00nIVtfN0VJPF9TMFAsT11NOlZbXylCOFFfUiRDLE9cUyxTO19LWkpQX19fTlVPXydGVy9fL0FYJF9RUDUKK00lP1w5JSFDXyUxIDRfUTwyJU9cNiQxN18kUSQ0X1E4NCVfXDUkUTtfJTEsNl9RMDIlL1w0JFFHXyYxMDgKK01fW1pSS09fSFU8V186RVU4X1I0PCcvXSowI1NfMkQ1JV9RRDUlX1w2JEEzXyZBODhfVSUrM19cVStTL18KK00pQiBEX1NEUy1fXDYkMTdfJVEoNl9RRDQmL1w6JTFHXyZRRDxfUTQ5Jl9cWjEkJ180NTkwX1MoVzBfX0wKK01WXFtfLTQtOF9SPEMoP1wwJUI7Xy0lSi1fUUw7Kk9dMzAjQ18nMkUmX1FEPCtPXDomQVdfJTFUUV9RTEUKK00sL1w9KCNHXyQhUFlfUixXOS9cQC83P19LOycmX1kqLUNfXE0rUzNfJUFEOl9XIVI7X1xULTJfXzIkOF8KK01fXE5bTi9eT0k6Q18qMkxJX1QgWy0/XltMWl9fQjgyJF9XVV4/X1xJKzJfXyZRXEFfUVg7KD9cRyhCM18KK00yJCxdX1FEOiUvXDEkMTNfKjI8Sl9YOV4/L1xPKzMjXyRRODtfUSAzJS9cSitCU185VjlFX1MgUSxPXD0KK00oIjdfLjNZJF9TNFMtT1xNKyJPXzAkLTVfUyUhMk9eIkQoX19XPUc7X1MgVDI/XFYwJF9fT1s+U19TNFoKK00wL1xcMDNfX1M8RydfUlxRLi9cVi1TW18vQ1knX1I8Si0/XEUpMytfJjIoSF9YPiJBL15VS0s3X1dNLygKK01fWDlROT9dMzREP18rMlBFX11fMFJfXi4+NldfSjlCKF9WQUQ3L18yUEw7Xy9UJShfUzhaME9dIzBEQ18KK01GKTo4X1IoPigvXjVEOS9fRVkuNV9WSUg6X1xFKTMjXygyLFJfUzBULV9eTUoqW19fXytJX11GQzpPXyAKK01FVldfPzVQWF9RVDslT1wxI0FPXyUhJD5fUUQxKT9cVCtEK18kIFQ5X1E4NCVfXDgkUUdfJSBUNV9RKC8KK00lP1xLKiI/X1E7TldfXyM2Uz9eS0hJT186VjVDX1IsOSU/XEUoIjNfJjEwOl9RLC4kL1w8JVE/XyRAVC0KK01fUig9J19cPyYhX18oUVBEX1JIPydPXFQpIidfLiIsQV9SWDwmP1xHJjFLXyhBVD9fUVRCKC9dVT43P18KK00wVDUjX107MVRfXTo6V09fJkI4Sl9RODkpL1xGM0g7XyZBXEtfVylCNE9cPS0lW188Vy1cX1U5NTNPXEIKK00sJD9fNyYpTF9SRFAxT1wrJ1RTXyhDUVtfUkBaPS9eWE08P183Ni0/X1M8WC4/XDQkQTdfPSc5TV9VKTAKK00zP11HN1VPX1Q8KlxfW0pPS09dKjIkS19CKDYkX1hCI0FfXSozJSdfKyMkVl9SVFAtP1xFKjJPXyoyTE4KK01fUiRDKU9cMyVBP18mUVQ7X1FcPSdfXD8mUVdfQlgyJF9TLFMtT1xRLSNHXypSXFFfUUAzJV9cNCRAX18KK00oIUw/X1FQRiwvXEArIy9fTzs+W19eQztWT11cPzhbXy8kUTZfVyVYP09fP1ZNW18tU1UtX1M4XTJfXycKK01OWz9fMDQ5LF9TRF8uX184VE0jXyxDLFpfUyhVLk9cSytTJ18qUlRUX1JISixfXDsnMitfTysyWF9YMVgKK00+X19DU0xHX0Q3VVVfU1hVK19dJjEjX19cTic0X1leJz4vXkxGSFNfQFc9Tl9dXzBVL10hMCQ/Xzc2OU0KK01fVCEjMi9eO0Y5T18mMTQ3X1lKNkYvXkdIWjdfPCZNT19SKEIsP1xFKiNLXytSXFhfWlpGSk9fXFwuT18KK01XOj1NX1xKQDxPXyZFVVdfS0khWl9TREIsX1w+JVM3XypSMSJfUkBBLF9cPCVRV18nUUg6X1IgOSY/XDoKK00kUUtfJzFAPF9SREUoX18uUEtXX1xdUzdfU1xdLk9cWS1TR184NUk6X1M4WC0/XDwnIUdfKVI0Ql9SXEoKK00qT144Qyg3X0lJOi1fXS5dTS9fT1RcT19ZPF8mX18jOFNfX01UPEdfWy07LV9fKzZUX19CUjxDX0xKIj0KK01fW0JGSF9dJi5DO19VTFs4X1MxJzY/XFQzRVNfLlNZKV9TQTZAT1w/J1IrX0w5SV1fUjRbOE9dIzE0U18KK00uQ1xfX1FQUTUvXDYoIzNfKCMpLl9RPFg7P1xHMyhXXyskIVpfW05ZUj9eIkJIO18pIiBCX1FAMyVfXVcKK00+RltfPUcxUV9bNktJX183UVtbX09LJlBfViE7N19dMjM0X19MKkpOX1hCKkNfXEEpQk9fJyFcRF9RRD0KK00nX1xNLDMvXyxDOFhfUjxLKz9cRSlCP18nQVA+X1FcOyc/XjlFKTtfLiM8XV9UOSs0P1xPLSNLXyVRLDsKK01fUiBEKE9cQSdCM18oMlhbX1MhIDQvXFkuVC9fSjoqQl9aIkJMP10tNVY7Xz5XTV5fXjtAV09eMkY6P18KK00tQ10tX1wuWE1fXFgvNC9fLjNYXF9cUyhRT1xXLjQnXy5DXSRfUUhBKD9cUC0zT18kUUhAX1FYQyovXEwKK00qQldfKjIkRF9ePzNTX19NVi0vX1pdRzVfXytEWD9fWlktU19dTVc2X18nPFVfXz5TLENfWj0/OV9URSMKK00yX11cQThTX0YpTkBfWjZDST9dKjFEQ19JKiJCX1oqPkgvXVk8Vz9fKVI8VF9SLEguT1xMKyM/X0s6NkgKK01fX1dQWl9fQUpXJ19TSi1TX11WQzdPXzpJVk9fSzg1S19SQDslT1w4JFE/XyQgRDVfUUAzJj9cVixSW18KK00uMzBPX1MkSSlfXDslUTdfLCJMRl9cTl1OT19NVl1DXy4zWF5fUVBBKV9cQCdSN18sMzxPX1Q9KzBPXFMKK00tIltfJyFEOF9SREUpX1xHKCIjX0M3XVxfXUMjT09fTlYsX19dXVc0X19PP1VfX1NXPTNfXi1bNV9fMz4KK01VP19SWE1DX10+KzhfXicvUl9fOFE8T18vJDE0X1JVITU/XFsxNUtfKVQlTF9RPEArT14/RFgzXygjJTUKK01fVU09OS9cNydCM18mUy06X1IsUDI/XDIrJFdfKVU6LV9SUTlGP1xRMzg7X09LWy1fWlpQSz9dIC4jT18KK00mMTA4X1gmJD4vXiA/R09fUUtSWF9dNyZQP15aS0snX0A3RV1fXDpdTz9fKU87W18xJCEiX1BcNSVfXDgKK00mQidfKFI8SV9RLDcmP1w0JiFLXyYhUD5fUSQ0JT9cPidSI18sMlxRX1NEVS1fXFYsMz9fLiNFIF9TPFkKK00wL1w8JlIrXylCXE9fUihBKV9cPSpDP18rM1k2X1MkXjQ/XEUqQl9fJ0JAV19UNS85L142RTlPX0tKRkQKK01fVz1eQk9cUC5EQ19MSlZNX1NEXzI/XSEwRC9fVDxXL19TIFQvL1xVLzQnXyZSMERfUlBTLj9cQCszK18KK00sM1UhX1FAPigvXDUlQT9fV10jK19fKz1WL19VVl1DX149UztfXz87Vz9fVlc9W19cLUc6X15fOlYvX08KK01WPT9fRkhaMV9YMiZDP15ISlsjX0gpTj9fVjlBOT9eTElaT19JSiZFX1ctTjwvXDEkQVdfKCI4Vl9SWE4KK00tX15BRzlfX19fN0tfXUZFOy9fLUlHU19WSjFBX1xKQTgvXyVFNVtfTzkxQ19RXC0gL1xAJiNLXywiSSYKK01fUkhJLC9cXC8jR18zVEklX1NEVCtPXF0tMydfVSwzIV9eVzlVP1xWLlNHXyhSQE1fUjBEKV9cTSxDK18KK00lQUg4X1MkUyw/XF8vQ1dfKzMoUl9SKEYqL1xHKjJTXycxQD5fVlFGOS9fJE1bK19bTTszX18nN1UvX1YKK01XPUNfXF1bOV9fJz5WL19YV11LX1tNTzNfX0c8Vi9fQlRdL180REkuX1FUOykvXEwtVENfJyIoTF9WTUIKK002X1xAKyRHXyoyMERfUjxJKU9cUy81K18pUjxUX1FATTFPXF06KVNfLFVCOV9SVStAX18kUU03X0dJWjsKK01fUVQ1Ji9cOSVRS19ASDVZX1g+JUBPXylPW09fVUxDJV9bUk9NL11KOCYvX1Q8NyFfXFJdTi9dTTlWN18KK00pQkBLX1IoRys/XFYuM1tfKUJITF9USS40L1xbL1QnXzFUUSxfU0xeL19cQCgyK18nUVQ/X107KlM/XyYKK01PK19fJkE4OF9RWDonL1xRLUNPXypCMEhfUTg+KE9cTi9UV18sM104X1NFIzM/XF00JitfLCQxQF9SOFMKK00xT1wxJVFfXy5EPThfUlhZMS9cPSZBR18qUyBcX1JQTCtfXUE4NjNfKyMwXl9TPSExP1xAKyJPXysjNFsKK01fUjBRLU9cSy1TT18pQlBOX1JUSys/X0dWLS9fW11LNV9fKz1WP19VV11XX14uJ0JfXztAV09fVlg9V18KK01eLic8X19fR1gvX0ZVPTdfPEclWF9aVk9NL145RSlLXzw2UVJfWyJLTD9eSEhaR19AR1VfX1VJPDkvXD8KK00pQzNfLCMkWF9YTixDP19fXE5HX1daQU5fXDI5Oz9fPUlGO19RWU1JX1xaOjovXyNEJU9fT1kpSV9UID8KK00tX1xRKEQnXyMxMDRfUVQ7Jz9eOUI4I19DOCVcX1RZKzAvXzZSPDNfXD1PPF9TMFcuL1xAJ1I3XyZBPD0KK01fUlBQLE9cMyUxS18oMjRHX1FQQyhfXFAtMydfMSRFI19TKFIrX1w6JiE3XyoiPE5fUUw3J19dTjk2U18KK01XPFsyX18zPlcvX1lXXVNfXi1TOF9fX0BXL19YVy1DX14tWzVfXz8/VU9fUVYtR19cPT80X1ZZOjVPXFEKK00qIitfKzI8P19SUEgqT1xNKSFbXypCJDpfUzRQKl9cSChBS18nIVRIX1FVLEBPXEgxSSNfKURWKF9bVyIKK01SL142RShXXykhREBfUUA6J19eL0I3X19BWDFfX1xPIlBPXz1RLDdfTys2VV9cQyJQL18xUStfX1Y8Ml8KK01fVUUsMl9cSCsiW18oQjxHX1FcQihfXDcmQU9fJ1IwRF9SXFYtT1wzJiFXXyRRRDtfUTQ5JV9cVyxCU18KK01TTCZcX1wmWU0/XFkuUytfPlgxV19YXi1CL1xOKCFXXychMDJfUFQ8Jy9cTzAkW18tNDU1X1M9Kzg/XFIKK00xVi9fK0QtP19TJSY3T1xRMEVHXy0jUSZfUTg4Jl9cNCVBV18uQzxdX1FENicvXDcmMVtfK1M8W19RVEkKK00rP1xBKkMnXyhTJFRfUixQLD9cUCxDN18qUjRJX14/M1NfX1JWXTtfW11LNV9fP0JXP19XWE1bX15ON0EKK01fXzdAVl9fV1hNV19fPis7X1xeWU5PXUg4RktfSjpOUF9ZJi1FP11ePlgnX04rNltfWj5FSi9dTTlWT18KK00+Rz4jX1IsRC0/XEgqMyNfKjI8SV9fX1RbT183R0YzX1NKIVNfXTo9Nl9fLUc2S19SSUVEX1xSOzlPXy0KK01HJj9fTUhdPl9WIF8vX1w9JCIvXydSJD9fVTkwMi9dSjkmQ18vVCBZX10vJ1AvX0dUXTdfLiNIXV9RVDwKK00oX1w5JUFTXyszJFNfUzhYLl9cRysyX18qMyRTX1JUUixPXDQmITtfLTM8VV9UNSQwX1xOK1MjXyUhMDcKK01fUUw9KC9cSisiX180VFk0X1xfJFI/X0tWLUNfXS1XOF9fPzxVP19XVz0rX11NUzNfX0c9Vk9fUFVdK18KK01bXUMzX15LNVQ/XkZFKSdfPjclVF9TLE4tL1xNK1M/XztHMV5fVlVPPE9cPigiX18mJFIlX1IkXEI/XEQKK00zKEtfT0tfKl9XUVc9X1xDJFInXyQhLDhfWUoyQi9eJ0BHV19ULDspX11fKVJfXjtHOU9fUjw3I19dMyQKK01QP185Ukw3Xy5TLFZfUTQ3J09cOCYhT18pMixGX1FYPig/XEEoUjtfKjJUT19SQEosP10uNDU7XyUxODcKK01fWSYpQV9fM1AsI19UK1ZdX1oyOEUvXSwwU1dfMFQwXV9VLTczT14qQSdTX0coTiVfVkVDOD9dOjZFV18KK00vJDEuX1M9JDU/XFcxVU9fLDQpOV9TSSk3L1xTLyQvXypDIFJfUiRHKj9cVi5DU18lQUA7X1I8RypPXFIKK00uI0tfLFNdI19STFIuL1xOLkNbXysjPFhfUURBKF9cSCsiW19WTSs1X11PMlRPX0FWLUNfV003NV9eQzkKK01WT19HVT0/X1otOzhfXj81VV9fVFheL19VLEcuX1dBUz9fXlBLO0dfPkc5Xl9YIV1AX15TTDszX0s6Tk0KK01fWClcQC9eJD9YT18pUjhXX1I0RStPXUw6RlNfX18nS19cNiw0T18gREY3X1NZOTRfXCozNz9fKUY2K18KK01SKUFBX1w2NTdPXypFVTtfUilFSV9WISUoL1xGJkE3XyhBUEBfUiQ/Ki9dLzNUU19TXC5cX14/NlVPXE8KK00sUzdfJVFEQF9RVDwoT1xDKVJHXyZRVEBfUixJKl9cUC4jS18qIlxPX1FAPSc/XEsrQl9fJiFEOl9TTFwKK00tT10mMjQvXyozIFBfUURDKV9cPChSX18oUjhRX1M4Uy4/XzFSLENfWi07Ml9eVzpVL19WV11LX14tXzoKK01fXys8VS9fU1ctP19dXU84X187N1VfX0xVLSdfUUsmT19SNDknL1xPKjMnXzlGQU9fUSA0Kj9cQTVZJ18KK00pI04oX1ItLEIvXl1PPFNfN1VBP19WQTc5X1w/KEI/X0hJSjBfWSIrQU9fPVRdO19WPEctX1NJITA/XyUKK01QTCdfV0xPK19cRl1PT1xaLVM7XychVD5fUVg7KD9cRyhCO18pIiBCX1FQOicvXDkmQU9fKCFUQ19RQDgKK00mX1w3JTFDXzw2PUpfWE4jQU9ePkY5R189JyFOX1pOSEhfXy5PK0NfK0JAQF9SXFIpP18nTzpbX0dYXVwKK01fWU4uPz9eMUIoJ183NVE7X1RZMTVPXFkwNE9fLTNdKl9TRF4xL1xJLDJbXytTPFNfU1kjL19cXC9DT18KK00oUihBX1JYUyxfXEcrUydfKjJYU19RVEEoX1xBKVJHXydSPElfUkxYLj9dQjkmP188RyFTX1ZVSztPXUgKK005RkdfOCYxRl9VQT44L100NkVTXzQlOThfVSUyNF9dLzNFN185RjlVX1peSU1fXVg9J1dfQig2K19YOiQKK01BX15JSVpHX0JIMihfV11aQU9cRSkjN18uI0EhX1ZRTjw/X19dLltfVSlNQV9cUj48P15eQTQvX1BJLT0KK01fW14wNU9fJEU1T19QKSU3X1teMTVfXl9DJT9fUDklMl9ZKUwxP1xNJlBXXzclLTNfViFANV9fMlFcI18KK01XPFsvX1JMUSxfXE0sQ0NfL0QhJV9SNEkqX1xGKiJPXyszLFVfUihKKy9cRCsiW18lQVA+X1JQUCxPXDQKK00lQUdfKjJMUF9RMDMmP1xULFNHXygxXEJfUUA+KC9cQypSV18pQlhSX1JMUC1PXFgtIztfVSxHLl9eIy8KK01VX19JVV0zX1s9RzFfXyc6VT9fUVY9O19cXUs5X19DPFY/X1NVXS9fWDxHJl9fQ0NXX15DRjk3Xy1DLSAKK01fUjU0Q09cPixYJ18qVS4qX1wnIlM/XTc0JT9fKVFAQ19XMVg+T14/RVhXX0FYKV1fXVczVU9fPlI8W18KK00mMVQ/X1lGN0Y/Xy5QLCdfViw/J19WOTk1L18vUjwnXyoiPEZfVDUiLz9eIj5XN18vQ1BVX1VNOjRfXSEKK00vIz9fJFEkLF9QUCohX15KSEojX1NMLyJfXDJcTi9dMDNEP18wJDBbX1VJNDMvXlZKSjdfMkQsXV9SUE0KK00pT15XTCozX0BHQUpfWTYrQC9eNEI3W184NUUvX1JcTSpPXFguVCNfODYtRl9WKUU3X10zNSRXXyxDJEoKK01fVFEqMF9cTisiR18sQzBSX1IsSipPXDknMV9fJlFUQF9RPDknL1w/KDIzXysyXFJfWT4tQj9eQUUoX18KK01IWToxX1lOLkI/XjVDKDtfRDhCIl9YUiM/P14sQFdXX0EnVVdfUkhGKi9dQTg2S19NSypbX1MoTi1PXi4KK01CWSdfJUEwN19RIC4kL14lP1gvXz5HNiFfUkhJLk9cSSozK18zJSU2X19fUFhfXyxHNldfUklJR19cTjwKK005P18jRSVLX1FJMTtfXCowNV9fIUNVQ19QKS03X1wiLzcvXyFDJTtfT0khM19aRV0yX10mK1FDXzg2LUEKK01fXFMlUT9fPVQ8V18nQjxHX1EgNSZPXD0nUjNfJyIgQl9RQDonP1xHKjJTXyUhQDpfUjxLKz9cOScxX18KK00qMkxOX1E0NyZPXEgqQl9fJEEwOV9RVEApP1w+KEIzXyhSQEhfUlBRLD9cUi4jS18qUyBVX1NVIzJfXkEKK01ISldfKiNVOl9VVUZDX185Uy1fX1wtRzpfXzc1Ul9fUFY9S19cLUs4X18nOVVPX05XLUNfW14jO19eV0EKK01WL19DVi0/Xzc2NiVfU1kxRV9cTTMnU19PPC8zX1UhJDFfXS4zJTdfJzJAT19ZXjlDX11ePTZfX1k9RzwKK01fXlMzVE9dMjNUW18wQ1RfX11DKVI/X0ZUPFNfRkheJF9cTyFNX1xKKiInX09bRk9fWFolP09dVzxGU18KK01RS1pUX1VZPjQ/XiA+RytfKEIgO19bJkpJL19AU0xPX0EnRVhfWkJDRz9eVUw6R18sQyBIX1M4VStPXl0KK01PKzdfSSleOl9SLEQnP145RThXXzw2NTxfVzVOOE9dSzlFS18+NzFIX1IgPSYvXD0nUitfJjE8NF9TWF0KK00tT1xQLFJXXzM1LS9fVj1FOV9dQjhFX18xRE0lX1JETitPXEIqMkdfKkJUUl9RQDcnT1w7JjFPX0ZJKjUKK01fWiI4Rl9eQ0ZZW19LSjpJX1suSkpPXltMSytfTys2VV9cMl9PX18kU0tXXzZWITpfVUE5OC9eS0xaX18KK00qUlRQX1k6MkZPXFErIyNfLUMoVF9XPVU9X14pQjkzXykiKFJfUVQ+KT9cTSxTN19fXl9CX1tSMjpPXlkKK01DVidfSzhFPF9aWiM1P15XQlVfX00oRTlfWzIrNV9eV0JVR19PKFk7X1s+KjUvXldCVS9fTzhFN19aRiAKK001T14xPjVbX1YsSltfXjMxUl9cTCsyW18kUTQ6X1EoNiYvXDYmQVNfJFE0OF9SQEorP1wwJEE3XylSREwKK01fUUQ7J09cRioiT18lITg5X1I0RypPXDEkUTtfJlIkQ19RSEIpL1w/KTI/XygyPElfUixJKl9cSStTJ18KK00rI0xaX1IgQio/XEArRD9fLkRFTF9SRFk5P10zN1gzX1NMQzZfXV8tUj9fSVQsT19cLTMxX183OVVPX1UKK01WPTtfXE07OV9fMzZVL19LVSxfX1hdTz9fWFYvR09fL1FcT18zQ1BYX1MoUS1fXDcoQkdfR0lCLl9XNUsKK005X19FVj1TX1wtQzVfV1VYPi9fKlBMN19WPEMoX11bKlFPXipBN19fU1w/I19XPVU8T18qUUtbXz9HPVEKK01fWFoqQi9fKE9bQ187Vl1GX1teV0xfXEMoIV9fTlsmTV9dWy5SX11fPVc3XzNUWSdfU0hWK09fIU5LM18KK00/N01UX1MkUCo/XlNLSkNfMzRRJV9XQVY7T14hPjZfXz1XKUZfV1laOl9dWz0mO187Jjk8X1FcPSdfXTAKK00zJEtfNFRNJ19SJDsmP1xAJlFPXytCRE1fU1BcLj9dMDRUV18tIzxYX1FcQyg/XDsnMitfJEBYNl9RUDgKK00mT1w7JjFTXyYxODxfUUg3Jz9cNiRRR18mITg5X1FANiY/XDYlQUdfJiFIPV9VISQ2P10lL0RDXzglWTkKK01fW0ZHTD9cTihSQ19HSU46X1leQEg/XEMpQj9fKiJQSl9YRilET1xHKTM3XylSQE9fUzBYLU9fUFlOX18KK00wQlhGX1M8SykvXFQqUjdfLyJUR19UNFYsL1xYKlIjXzEjQElfVFhdLC9dNTBDO182NEBYX1ZNOzIvXVYKK003JFtfQFY9LF9YLU40P14lPyc3X1g8XyxfXEsmUi9cVy4zW18oUkRLX1IsSys/XEwsQzNfKVJUT19SNEsKK00rP1xCKiJLXyZCIEJfUixJKl9cLyUxP18oUjRIX1BcMSUvXDsoMi9fJjIkQ19RTEMpP1w/KVJHXyhCSEwKK01fUjRNK19cSS8yW186Jl1bX1I8QyxfXD0pQldfKCJFIV9SNFMyT1w2KDMrXy8zQF5fVCxfLz9dUDsmS18KK01JSVo8X1xOXk8/XzVSTEdfWU0/MV9eVzdTX19OVF0rX1s9QzZfXkc2Uy9fOVI7X18pUjBDX1JASywvXkAKK01FWSNfNiUtNV9eMztWX19MVS0nXz5HNVVfXScpUy9fOFFcP19WPDsmX1IsQCdfXl9OS1NfM0RZMV9YLiEKK00/L146RUkzX0ZZRjtfXE8nUT9dVj1XJ19QO0JYX1JIRiovXlpMOk9fWC0jLV9bIkhJT18hUCtHXzomMTwKK01fU1BXLD9eSkoqJ180VFkoX1M4VCs/XyBOWzdfLEJYRl9cJl5MX11aPVZPXz5XRUpfV11ZOj9dXD1GO18KK00vI0hTX1MwWS0/XC8lMSdfKCIwQl9RTDwnP1xCKCIrXyoiOEhfUjxGKT9cSClCJ18tUzRQX1FUOiU/XEQKK00oIVtfMkQ9Jl9RKDAkX1wyJCEvXyVRNDhfUSgwJF9cNiUhP18lMSw2X1EkMSUvXDgmQVdfLzQoXl9SLEcKK00tT108N0cvX0c5JixfVlFDNz9dKjE0N19EOTI1X1MsXC8vXSYyVEdfRDkmOl9RWDwrL1xIKjMjX0QoXigKK01fXzNKXS9dNzFEO18pMiRJX1FMPSk/XD0nIU9fJjE8Ol9RTDgnT1w7JVIjXychQEFfUUw3J19cOSVBU18KK00mMTw6X1IgPig/XDsmQUdfJkFANV9TKEgqX186U0xLXzI1KTJfUzRdMD9cVS8zX18sM1BdX1JcVy4/XEoKK00sQzNfKVJcUV9RXEcqP1w7KFI3XyYyJENfUURBKF9cQCkiO18nIVhBX1E8PSdfXDkoMi9fJkI0Rl9RWEkKK00qT1xBKyJXXygyUE1fUlhVKj9cVzI2N18kMURJX1FIOSYvXEIrJFtfKlMxJV9SIEIoL1w+JkIvXydSJEYKK01fUihFKU9cQylCP18qIlRNX1MgVSxfXFItMztfLSMsWV9TUFgwP1xeLUNHXzYlLS5fWDlePk9eVEoqT18KK01QO1JeX1o6O0UvXScxJEtfWS1XPV9fKztVT11ZPSczX1ZNKzVfXUcoUi9fME5bR19AR0lWX1wyWE4/XEYKK00oMi9fUEwnIF9VIS40P1xULUNPX09bVl9fVV09N19eXEw7Q18qUjxJX1tOUksvXz5TTE9fODVFN19TOFUKK00rT18pUTtXXzlWOT9fU1xaLS9fI05LM18uMzxQX1paQkc/XUw5RVtfLkNIT19XMVQ5X11JOVVDX0AnTUkKK01fVz1PNl9dVDwmJ18rQkREX1IgOyZfXDMjQStfJDEgNl9RLDQlP1w4JTFPXyYhKDZfUTwyIy9cVywyJ18KK00uUzxBX1MwVCg/XFYtIlNfJVE4NV9SMEIpL1xEKEIzXygxXEFfUTw1Ji9cMiQhL18kUSw2X1FcQSkvXCYKK00iQyNfLVJZQ19bMkNWP10lLiZPXzQ0UURfUVA5KT9cXjA0O18mUiA+X1JUUStfXj1HOjtfPldGKV9SSEsKK00sT18kT1tLX19fK01fWDFSOi9cNiUhP18lITg7X1VZPTVPXSkxVDNfJyFAOl9RUDcmX1xCJTEzXycxJCwKK01fUUw2JU9cNCUhP18kUUA4X1JETSpfXktJSjtfV10jK19bKktKX1xQLSM7XypDKFRfUkxYLj9cSi1DL18KK00rU1BdX1JIVi5fXEssUz9fKjMoUl9SRFUtL1xELCJfXykjIE9fUkhSLS9cSixDM18oIkBKX1FAQykvXDoKK00oQjNfKCI4SF9SQE4sL1xGKyJbXysiUENfUVBbNz9cJyRSW18nMTQ4X1FUVzwvXEcsVStfKVI0SF9RWDkKK00nX1xEJ1IvXydRUDtfUjBDKE9cSClCR18oUVBDX1FUOykvXEMoUlNfKFIgP19RUD0qL1xIKFI/XylCNEsKK01fUlBILC9cUysjL18rQkRNX1M8VS4vXzVTLFNfWi07M19YWi9EL145RSlDX1UsNyVfXD5YTF9eTkkqI18KK01RS1pcX1VZOTY/XyxQS1tfRChKKF9UPSgyP18nUTwjXyxCSEhfXFMkUi9cRCkiP19OKyJMX11DKlFfXy4KK01QPCNfQSdVV19SKEQmX18qUUtbXzIjUFVfWlJMSF9eTEsqL18sIlxIX1pOTEk/XFcuUy9fRCkqKV9TXF8KK00tL10kMTNDXzw3JURfVjlHNk9eMUJYL19WLDZfX11bIk9fXklEOFtfKVFAOF9SRD0oL1wyIzBfXyQwXCwKK01fUkxLJy9cUi0xX18sMzA9X1JcUyc/XE4sIldfLEMsVF9TJFIsX1xRLEMvXypCREhfUTQzJT9cOCVBQ18KK00zRFEvX1E0OC5fXkFHKztfOUYlPF9aPkJOT1w8JlNfXyhSKF9fVU07O09cUy4jK18uM1RVX1IgPyk/XEsKK00qIzNfOTYxSl9cQyJQL19eW18jX1FLMlBfU1hcMT9cRCojI18mITgzX1FANyVPXDUkUTdfJTEsNl9aKj0KK01HX15PSVpLXyYxMDhfUTg2Jj9cRSpCS18tMzxVX1s2UEpfXzxTPENfWC0nMV9YXiZBT11KOTY3Xzc1UTsKK01fVEUvMl9cSy1DP18rQ0hfX1JYVi5PXEosUy9fKkM4VV9SOFIsP1xCK0JXXylDJFJfUihNK09cQisyW18KK00oUlhPX1E4PigvXDsoUjdfJzI0R19SIEgqT1xPLDJDXykkITtfUFA3K19cQScxX18oI01RX1IwTTJfXDoKK00mMV9fKFFYQl9RXDsmP1xZLVMjXzJEQSBfVFEnMV9cNSYyW18nIlUxX1FUVzhfXEkwJktfJ1JFJF9VSTQKK002L1xIKTJPXydSIEdfUVg6Jy9cRChCM18qIjhDX147PFYvX09XLVNfMFQtJl9WTUY6T184UjxHX09bKk0KK01fWz5NSj9fJE9LU180NFktX10vKlEvXl1MWl9fSio2RF9cSyVPX15RSTonX1ErUyBfUlRNLC9eV0taV18KK01XTSMtX1MsSClfXkFHKTtfNSUxK19WSUo3X18gTUpTXy1DTE9fWVZCRU9dIS9TQ19OW0pTX1QkXy4vXk4KK01KOi9fNSUxK19TTF4sT102NjRXXzRFNSlfVFktME9fN1FbW19dLTcvX15LL1IvXzZPW0tfSjk+M19UQF8KK00vX1wzJCE7XyUxKDhfUUQ0Ji9cNyRRN18sIlRMX1E4MyRPXD0mMU9fKVIsRV9RQDQlT1w8JjFDXysyQEgKK01fVFkpMl9eO0U5R18jUExfX1o+QlMvXlZMW19fS0ovOF9RMDEvL1xAJ0NfXyoyOSNfVilDO09cWi5TU18KK00pQjhJX1IwQypPXEwrIl9fVExLKF9fX1NdX18uTytHXydRUElfUVA/Kl9dLDI0Q18nIUw6X1FENyY/XDkKK00lUUtfJyE4Pl9SIDooT1w8JVFXXyYhODlfVD0sMy9cXS9TV19PW0pVX15TPVYvX1BXPT9fVCtWV19eQzcKK01UP19AVDxPX0paSkNfU0UgMC9cTy5TX18qIyBSX1JQVS0/XEktMzNfKiMwU19SPFMsT1xEK1MjXyhSWE8KK01fUixOK19cQisyW18pQyRSX1JMVi1fXEotMztfKVMoU19SUFYrP1xVMTVHXyQhWEdfUVxBKS9cTTInW18KK00qQzEvX1IsQylPXEwqIktfK1JURl9VQTczL11DOEU/XzclQTZfUFQ2KV9cLClFJ18kM0lcX1FZJEBPXEcKK00uNV9fTEpWU19STEYqL1w+JzIvXykhXDlfWVI8RF9cUStSQ19bTis9X18nO1cvXFktU0tfUkwzKF9dXywKK01TL15ZSyo/X1A7PlNfXCJaTi9dMjNUW19WTScrX1tSVEwvXlpMWy9fUywuXV9dOyhRP18uUUxLXykyNEgKK01fXFMkUE9fOlMsR182VS0xX1NEWCw/XyFPOzdfKEI8O19YIV08T1xZLyMjX01bUlBfVVU4NE9eRUdJQ18KK01GKF4pX1dFTTovXSQxI09fNEU1KV9USS0wP10lMiNTXzg2JTZfXDpYS19fT1RcU19YLD8gX143Kk9fX1AKK01VXSNfVEwvI19SIDYnX1w1JCE7XyYhMDZfUjRCKD9cTysyS18lQSwyX1M0USxfXSMvVCdfJkE4OF9SOEEKK00oP104NFUvXz03IVJfWE4lQj9cMicxQ18mITBbX1JQPzZPXDwmRCdfJiFEUl9RLDArP1w5JUNLXylSNSYKK01fUyhQMC9cRikyT18pUjxKX1JASSpPXzhSTE9fX18rUl9cVlxNT1xAJ1I7XyVBTEFfVC0hL09cRSkiL18KK00lQTA2X1FIOCZfXiw/V1tfRkhSLV9SJDcmT1xAJlInXy5DXF9fUzRXLT9eX05LN19cLic8X15XP1cvX0MKK01VPStfVkxLJ19eJzFTT15SSlo3Xy9UJF9fUlxaLl9cTi5DR18rM0RYX1JUWS4vXE4uQ0dfK1NMWl9SVFgKK00uP1xOLjNLXy0jXSBfUyhdL09cTi5TU18rU1BdX1I4Uy0vXEArMltfJzJYRF9SJEUtL1w7KkJHXywjQFoKK01fUjRdPS9cSCxUU18nUiBBX1JERik/XEkqMjtfMkRVJ19TSF4tT1xWLVNDXyVSJFBfUVxbOV9cMC8oI18KK00nRCFfX1JIXTlfXj9GWi9fMFNAV19SPEUqL1xLKUIjX0dZVjZfUyxOKj9fS1ctV19bXUM5X1JMRipPXy8KK01RXE9fWSxbL19bUk9KT18pT1tPX01bJk9fVFkrMk9fO1RMU19NKlJIX1xHIFAvXzZRXCtfVCwiXV9cVyUKK01SP1xIKiJPX1I8Jl9fXS8lUE9fIU87T18uM1RVX1omOEQ/XEssQjtfTSpSQl9ULF0sX14uQzgrX0gpWjcKK01fVVU7NS9eTElaJ18wQ0xVX1VdPzVPXSkzJCNfOCYtN19VNTgzL10pMyQjX1BbPk5fXTJZTE9eTEVIW18KK01PWjo/X14nKFBfXzpQPCNfVFtWX19RTDQlL1w/JyFPXzdVVTpfUjhEJ19cWy9TV18rIlxQX1NMXi9fXFcKK00uQ09fLjNUW19VWUA3T10/OCYnXzJUTS5fUTAwJi9cNCNRT18jUTAwX1FENypPXDYkMldfJVEsTV9RNDQKK00sP1wzJEM/Xy4zNStfUyxSLj9dJDFEM18wVDUjX10nKFIvX19dTytfUDsyU19RXD4pL1wyJSE/XycxRDcKK01fUjA/J19cQScxX18lMSw2X1MwSSovXSMuIz9fJ1FIPF9RSDonP10kMUQzXywjQFRfXC5ZTT9fUVctS18KK01ZXU83X14nNVQ/Xz1ULE9fVjxXJl9ZWjdEP1xDKCFfXyVBQD1fUTw7Jz9cPyhCL18nMVRAX1IgQChfXEIKK00oQjdfKTJES19SNEsrP1xGKyJbXypDIFJfUlBQLE9cUi4jS18pMyhTX1I4USxPXEorUldfJ1JIUV9SNFAKK00qP1xFKVJbXykjXVVfUkRRMl9cRChCM18pUkBJX1Q9JzEvXTQ1NF9fNEU1L19SOEgqX1wvKSQjXyYkLU8KK01fUDhSPy9cRjFYX18oU1lNX1tCR0lfXFArUzdfKlI4QV9TLFErT15ARlk3Xy0iUEhfXk88Vz9fT1Y9S18KK00rIkRIX107LVM/XztTLFNfPlctT19dPyZRT15QSlpPXzJESS1fXU8zVD9eWktaW19SS15eX1w2WE1fXyYKK01PK0NfUjtfKF9SUEgqT18gTytLXz5HMVJfWyZMSV9cXS4jK19CSCVaX1RZLDE/XUU3RUNfQyg5Xl9UMSEKK00tT15BSClHXytCXEhfWkpJSE9cTCpSM183RiE3X1QhJC5fXSMxU1tfMDQ0XF9VQT80X15FR0krX1I6XkYKK01fXDZKR19fKkxKR19SSypJX1w+UEkvXypMWj9fLlJcS19TWFovL1w/JzIjXysySElfVEEpMF9dKjJUN18KK000RS0tX1UpMzM/XSwyJDtfMlQ5Jl9RRDUlX1w1JTFDXyVRKDRfUTguJi9cNiQhW18lUTQ+X1E4MypPXDUKK00kMk9fJVE0T19RSDstL1xBJkNTXydBQExfUVQ8Jl9cRSkiL19CKC4nX19fU1tfXldKWltfJTEoOF9RPDcKK00mT11VPCcjXy8zQFhfUTgyJS9cOCVBR18pQVw/X1FMNCUvXDslUUdfJTE8Ol9USSkyL1xULyNDX1BbTlkKK01fXks7Vl9fQFQ9K19YTSM0X11HKFIvXzNQXCNfR1lKNF9RXDsnP1w1JEFDXyRRLDZfUUA2Jj9cMyQxM18KK00mMTw6X1E0MyVPXDAkIS9fJCEoNV9RRDsnT1w3JjFTXyUxNDhfUUQ9J19cQCsyW18oUkxNX1JASysvXD0KK00qQl9fKTJMR19SUE4tT1xEMDc/XykyTSVfUiw/KD9cRClCM18vU1RWX1UlMTIvXT03RT9fJiFEOl9QWEQKK00xL1w5MSZbXyFDLVpfUkEpRE9cPi5WT19OWjpCX1IgRCsvXEUoIUtfMlRNKF9aJjxFT1xaLCJTX1k9OzYKK01fXyM6Vl9cVi0jJ19WLSMuX11bL1NfXjpFSTNfV0xfMF9aNkFIX10qMyRfX1QsRylfWlJGSS9fNFNMU18KK01QK0pYX1wyXE4vXl1MW1NfLEJUTV9TKFArP10oMURDX0ZZTjhfWUI2RD9cXS5TM19KOjZDX1MsTys/Xk8KK01LKj9fMCNYV19ZUjpFP1xZLkMzXz03OVBfUjxIKE9dJTI0J18tQ0hSX1QxKDAvXSIxQ1tfMURRJF9VMTAKK00yL18qTVpfX1JLKklfXEZRSi9fI0o6I19PKiY2X102WEsvXl9LKitfMFM8U19RWDknP10nMERDXyVRLDUKK01fUVw7Jz9cRSgyL18wQ1kgX1NcVy0/XkNGSUtfJlE4OF9RPDUmL1w0JDE/XyVRLDxfUFQsJj9cNCRCN18KK00nMURTX1FQOCxPXDsmIl9fJTEoSF9RXDotL1xGKFMjXy0jKE1fUzBSKl9dMDU1L19fXyNMX1smRUovXD4KK00mUidfJlFMPl9SNEAoL11VPCcjXyYxNDdfUSQvJE9eSkhaL19MSk5LX1E8MyU/XDMlMUNfJ0FIPF9SJEkKK00pT15RS0pXX1A7UlxfVz1cQD9dKTQ1N18wVE0tX1QpKzJfXSozVEdfJVE0N19RLDAlT1wyJCEvXyZBQDsKK01fUTAyJT9cNSRRO18kUSQ0X1EwNCVfXDIkQTdfJjFEPF9RSDonP1w4JiFPXyZRXEFfUiBNK09cQipCU18KK00oUkRLX1FIRSsvXEMpMi9fKTI4UV9SOSI+X1w/KSNbXylSLEFfUzRWLC9dJzEzV181RTkrX1RVLzFPXEEKK00oUidfJTJRKV9SISs9P1wpLUdXXylEPjBfUVBZOj9eUUcpQ18lMURBX1I4QSZfXTM0VSNfRyk+MV9UIFYKK00sT19OV11fX1tdRzpfUyBOKl9fOVQ8X19XXSMwX1dNWT1PXztTPFtfR1lWP19UNSkyX18zVCxfX0s6TkgKK01fXTczVC9eXE5LP19IWVo5X1pGP0ovXFQrUl9fJyFIN19TNFgvP1w+KFIvXyVBSDhfU0BaLV9cUytTJ18KK00mQTg4X1chTTsvXSYxJCdfKiI8Rl9TMFYtL15CSSorXyhSNENfVV1BN09dKjMkR18wNC0gX1NdIS9PXTkKK002VUNfM0RZK19WJTw1X145QzhDX01aNkFfXEJUTC9fMU4rL19UOzZOX1xWVElfXTQwU1dfKFFIQV9VNS8KK001X11YPEdLXz4nJVtfV1lXQD9eTklbJ19KKV4/X1peRklPXDolMT9fJVE0OF9RPDkoL1w0JTIjXyhSKFMKK01fUUg3K09cOiVSV18kUSBCX1FENSk/XDQjIUtfJCBQNF9TMFEsL1xfL0MvXzJUQFxfU0BWK19fX1w+V18KK01KSVpBX1IkPikvXDomQVdfQTgiIF9bOlFMP1wyI0EjXyYhODlfUVQ2JU9cSykiM18mMTQ3X1E0NyZPXUgKK004RjtfJTFQPF9ZSj1HT1xaLzNbXytDXF9fUyUiME9cVDFEM18uRFEoX1RJMzMvXDQlMTtfJUEsOV9RUDYKK00mT1w5JVFLXydBUD9fUTQzJU9cMyQxM18lQTA3X1EwMiU/XDwmQVdfJkFAO19RNDUmL1w6J0IjXyhCXFAKK01fUUhCKS9cQipCW18kUVRHX1IoPigvXDonMkdfKDNJVV9SMEYwP1xKKTIjXzQ1JSZfU0xbK09dODY0U18KK00sMzBIX1FYQCc/XDgrVFNfJ1RJVF9QRFY/P1xKMlkzXyhDXU9fXDJPSl9cNCYiI18pQiQ7X1cxVDw/XkgKK01IWVdfMjNcW19eSztWX19SVy1XXyhCID1fWV43RT9fNlFcP19OO0ZWX11PL1QvXjhGOUtfNUVRPl9cXygKK01SL15aTEsjX1ZNKzBfXCpaTi9eW0xaX19JOU5EX1UpLTM/XEIoIVdfJ0FURF9RMDYmX1w3JTFDXychQDoKK01fUSAtJF9cMyQhO18kUSQ0X1JMSSpfXEsqUltfJjFMQF9RMDYmX1wxJFFDXykiNEZfUzRWLV9cXi9UI18KK00yVFEtX1JARio/XDYmIU9fKyMkUV9WOUg5T10wNSUrXy8jWFtfVT0yMz9dTDglT18/Vy1MX1cpSjovXD4KK00mMVdfNCRJLl9SJDwoT1wwIkErXysiOE5fVlFGO09dPDRVL19LOjJEX1FINSVfXDclMUNfI1BcOl9RKDEKK00nT1xCJ1JPXyVAXDlfUTQ0Jk9cNyYhR19ISVY9X1o6PkcvXSoyJCdfMUQwXV9UWSkwX10yMyQzXz9XPVMKK01fX19aXk9eXEw7I18pUihCX1IwQChPXEQnUV9fQzhKKV9QXCsjP1w1JCEzX0xKQkRfWz5LSV9cPyVRN18KK00nIUQ4X1FcNSYvXEApIitfRUk6M19VXUI4X1xUMEQnXy4kOSVfU0kpMT9cXjM0Q18wVF0mX1EkNCU/XDsKK00lQVNfJFEkNF9RQDYmP1w5JVFLXyVRNDhfUTAyJT9cOSVRR18lQTA2X1FQOicvXDUkUTdfJiE4OF9RUEEKK00oP1xGLEMnXyhCRElfUjRMKy9cOScyU18nUUw5X1BYNSg/XEEuVzNfJkFcWF9SPEYpP1xLKzJLXy0jTFQKK01fUzRYLj9cTyxST18sMzhQX1FQUTRfXEs1SDNfJUQyLl9SWS1FP1xYNDczX0pZQjhfUUhCJ19cPiUhP18KK00/J01UX1oqOkVPXUA1JT9fWT0/OF9eTzxXP1xOKkJDX1AsJltfWyJJSF9eSEg6J19XLFcxX1g6K0JfXUEKK006RktfVT0zLV9bVlpNP18/Vj0/X1JcMl5fW1JXTE9eLUIoS184JVU8X1MsUiw/XDonIV9fJUFAPV9RMDQKK00lX1w4JUFHXyRBIDNfUSgwJF9cMyQxM18pQjBGX1FYPig/XDomQVdfJSEwN19RJDElL1w0I1EvXyUgXDMKK01fUSwxJS9cMiRBN18lUUg7X1FIPStPXC0kMiNfJiEkQl9SNDorP1xHKzM3Xy1DTFlfVTE2NF9dNTREV18KK001JSEuX1FENCYvXTEzRTNfK0JMUV9SKD0oX1xOKTJTXztGRU9fVFUkMS9eTkk6N18mISw1X1E0MyVPXC4KK00jMTNfJSBcM19aUkdJX11cPidLXy4jOFhfUyBQKz9eNkVIV19IOVI2X1RRKjBfXD4nQU9fKFIkQ19SQEMKK00oX15XTTtDX19fM1FfWiY2RT9cOiVRO18nQUg8X1M8VCxfXlZMWytfJUEoNF9RXDonT1w+JjFfXyUxKDgKK01fUTw5KC9cNCZCK189VyFXX1FQRCgvXipDWEdfPjdZXF9TNSEwL1xZMEQrXy40LSBfU00mMD9dIjNEN18KK00kQSw0X1FENCZPXDUkUTtfJTEsNl9RODQlX1w3JTFDXyUhKDVfUTg0JU9cNyUxP18lQTA2X1FENyY/XDgKK00lQUNfJzIgQV9SKE4rP1xAKVI/XysjMFFfUSw1KS9cPCYxM18iUTRAX1FIUjpfXDknUzdfMCNcXl9UISIKK00wL1xLLCJLXydRUEJfUzhUKz9cVy4zO18nUzk5X1JFN0EvXDoxSSNfKlRKMl9TRTI7X15RR1onXyVBWDoKK01fUjg7KC9eKkJXW19JOV43X1ZBOjZfX0pWPUdfWi1DPF9TRFQtT11ZPjc7X1U8RyRfWjY+R09fOFMsX18KK01DOSoyX1dSI0BfXyhRS19fTztCU19eIzdVX18qUDtPX09bPlVfWEolQT9dUTtGV18rQlRMX1FIPCdfXDYKK00mIU9fJSEwN19RQDYmP1wvIzBfXyRRJDNfUSwxJF9cRChCM18nQVA/X1FQOic/XDklUUtfJSEoNV9RNC8KK00kX1w0I1EvXyQgWDFfUSwzJU9cOCdST18nUjUlX1EkNyw/XDolUldfNiRFQl9WMUk9P11EOjZHXzVFQTUKK01fWDYjP09dMTM0T18mQTQ5X1UpLjVPXV8/SDNfP1dBX19YIVc/T15WTDs/X0E3UVxfWjo9Rz9cPCVRR18KK00nIUg9X1FQOyg/XDwlUUdfSzo+RV9YOiFBP1xbLjNTXytSWE1fWDomPz9ePUZJN18yNDRdX1FIOCRfXDoKK00mITdfLSJUR19bWlhPL19fXS8jXz83OVZfUUQ6KD9cMCNBJ19CKDIiX1pKR0lPXD4mQVNfJzFAPF9XMUkKK006L11OOUYzXyZBNDVfUVQ7Jz9cTylSS18lUiA5X1M4XSxfXFowQ1tfKUJUTV9SLEYpX1w5JzFPXyoyWEoKK01fVDkwMV9cOychV18mMTA6X1E0MyVPXDglQUdfJiE4OV9RQDYmP1w0JEE3XyVBMDZfUTQzJT9cNiUhO18KK00mMTw5X1E0MyU/XD4oMitfKFJcTl9RIDclX1xLLFMjXyUhOEVfUUw4JF9cNCdCR18mMyVIX1JcUzIvXSgKK00xRC9fKSIwQV9SVEsoX1xaLCMvXy4zLEtfU1xdLk9cRDAmK18rJT4lX1FZJkQ/XEoyWS9fMSVdV19bPkUKK01KP1wzJkFLXyhBPDxfWFYwP09eQ0gpM18+JyFOX1wmVU4vXzJSXTdfJyFYRl9TQFsvL15VSiovX0o6MkQKK01fXUcvVE9dXUBIK19GWVo/X1xLJVAvXlpNKytfVy0rNV9cQl5OT18uUUwzXz9HRVlfWEYmQT9cPydBV18KK00lUUQ8X1E0NyZPXDEkMTNfJVE0OF9RMDUlT1wuI1EjXy9UISFfUVg/KC9cRykyQ18pMixGX1IgPig/XDQKK00kQTdfJUEgNF9RMC8kX1wvIzEjXyNQXDJfUVBFLz9cOyg1J18kUVkgX1E4Oy0vXE8oI0dfOjZZWl9WMUkKK006P11IOkY/X0I4PiJfVSkuMy9cRCdSL18vI0EgX1Q5JTJfXDEiQSdfLkMkWF9YUidDP11DNkVLX0hJRjkKK01fUVw6Jy9cNiUhP18kUSg4X1FQNyY/XkpJKitfLSJcU19RSDgmX1xHKUI3Xz9XXVZfV1VaPT9cXy1DI18KK00qUjhBX1FcOiUvXTYzJCdfUlwnJF9fX1ZcL101M1UvXy0zSSZfUkBFKl9cRCghW19MOlpNX1FENSVfXDoKK00lMUdfODU5NV9WLTk1P1w7JVE3XycxUDtfUkg8Jz9cSCoyK19FOTIpX1g+KEBPXEUrIlNfJ1I4Rl9RWEYKK00oX1xKLEJbXzJFOS1fUUA5Jk9cNiQxP18kUSQ0X1E4NCVfXDYlIT9fJUEwN19RLDElL1w0JEEzXyUhKDQKK01fUTg0JU9cOSVRR18lUTQ3X1FcQihfXEcsUytfIlEoMl9SVFUsT1wvJDIjXyZRQDNfUTxBKy9cOSwmN18KK00nQiRTX1IkPyYvXEwqQjdfLyNIS19SPEInP10qMVNTX0BIQiRfUi0iOS9cTDVYN18nJCIrX1JVLkVPXSkKK005V1dfUCpaUl9RSD8pL1xDJjFTX0QpIiFfWVo8RT9eLENJL19GOjJLX1k+Q0xPXSc2JjdfLkQ5Kl9YWiYKK01AT15ISTozX1c9NzhfWS44Ri9eSUpKT19QO15cX1tKWU4vXzhUXT9fTks6VF9cRyJQT11TO0ZbX0E4KiEKK01fUlxOKz9cOCZBV18mQVA/X1EoMiU/XDglQUdfIzBYL19VQTs3L10xNSU3XyhCNEZfUiA+KD9cRChCN18KK00nMUw+X1EsMSUvXDYkITNfJSBcM19RJC8kT1w0JSE/XycyOF5fUVBDND9cNCc0K18nIiBcX1JYPi5PXUEKK005RytfNjVZPl9WTU06T141RFhbXzQ0VStfUTwyJU9cTCojI18nQVRDX1MoSyxPXFosM0NfP0dFX19VMSsKK00yX15JSCojXychPDlfUUA2Jj9cMyRBQ18mMTA2X1o2P0c/XDgkUT9fJTEsNl9RSDkmL14hQDdDX0Y5OjEKK01fU1BYLU9cRihCM18mMUA3X1UtLTBfXyBPO1NfX183Ul9UIFovT1w7JyIvXyYhRDpfV0FaPV9eXE07N18KK00mQUA6X1E0MyVPXEYnUV9fJkE4OF9RODMmP1w9JyIrX0JYOiZfUkhLKS9ePUUoV19AWCVcX1JcVy0vXEgKK00rMk9fJjFcO19SVFMrX10zNjUnXyYhODhfUTAxJV9cNCRBN18lMSw1X1EwMiUvXDMkMS9fJSEoNF9RNDMKK00lP1w0JEEzXyYxPDlfUUQ3Jj9cNyYhR18oQjxHX1JQVS0/XDsoIiNfLTM8X19ROD4mT1w9JTFHXyYxXEcKK01fUjBWO09cOSdSX18pQkhCX1JUUCpPXFYrMjtfLlM4Vl9WVVA8P10mM1RfXywlJUNfUU0wQU9cOy5XL18KK00uJF1aX1VRSD1fXlpMSztfKEFUQ19SIDwnT14tQ1g7X0hJXjRfVS1AOl9dKzsoL18xVk4gX1IlIjYvXEEKK00tRCtfKjJMSV9ZXkFHT18jUUw/X0EoRi5fXC8kUT9eX08rT182RVU+X1tbI1BfXF4wNCtfUzxHK19WJTkKK003L143Q1krXyYxPDlfUjRFKi9cOSYxU18kUSw2X1E8NyZPXDAkIS9fJ0FYQV9SLEMpT1xIKiJPXyYxRDwKK01fUUw7J09cNSUxQ18kISAzX1EsLiUvXDMjQStfJEEgM19RTDooP1w1JyMjXyZCJStfUTg9MD9cOycjT18KK005RF1ZX1ctUD8/XEotMztfJ1IgS19XVVo+P10nMSQvXyYhMDZfUlRIKy9dJzBEQ18xM00kX1QsVC9fXiQKK00/KDtfODUtNF9aJjlHP1w0JEFPXyRRNDhfUSwxJF9cPCVRP19FWSYvX1BUKyNPXDUkQUNfJiE8Nl9WNUYKK004L11LOjY7Xy0zOFdfUUg8KD9cNCRBM181JSkqX1tWWk4/X19eLz9fMyQxKF9SNEQqT1w+J1IjXytTMFAKK01fW15WTU9cOSVRR18pIjBHX1suS0o/XlpNOz9fJlE4PF9RJC8kT1w+JjFHXydSLDtfWiY2Q19eID9HR18KK00tI1BYX1NEXy5fXE0sUl9fLTNMV19VVUA2T1w4JUFDXyUhJDdfUTAyJT9cMyQxL18lMSw1X1E0MyU/XDUKK00kUTdfJFEkM19RMDIlL1w5JVFHXyYxPDlfUTg3Ji9cQSoiQ18sM0haX1EoNyVfXE0rM0NfKFJMQV9SLDkKK00oT1w/KTJXXydSVUVfUzhVMU9cVy4jK18vVCReX1MsWCxPXjlJOjNfRjo2SV9WWVU9P10vOTYvXyxVRVkKK01fVzFcRC9eKEAnW19BSCYhX1pSRkpPXDslQVNfJ0FQPl9YVi5CL149RihTXzIlRUZfVD1NQi9eT1NeN18KK009KFpDX1QxNDdPXiRBKCdfRjlKNF9SPE0rX1xQLTNLX0wqWlBfXC5fUD9dRDo2R183JkFHX1cxWz5fXiQKK01COEdfRDheMV9aQkBIX1w4JFE3XyUxLDZfUUg6Jz9cMCQhL18lUTw6X1BYLiQ/XDYlQUdfJzFUQF9RWD4KK00oP1w/J1IrXyYxRDxfUUQ5Jy9cLyNRK18kUFQ1X1EsLiRPXDAjQSdfJSEoO19RND4tT1w5KFUjXyZSNSoKK01fUTA5LV9dRTNXU18/R0YlX1EgOCZPXDomQj9fJzFEO19VNTI0P1xIKSI7XywiTE9fUjxDKT9cQiYhT18KK00sQjRKX1dFUD1fXSEtQzdfOCU5OV9RJC4lL1w0JCErXyVBKDRfUUQyJE9eNUNYV18lMSg4X1EwMCYvXDcKK00lMT9fNzVZOF9ZWj5GX1xRLEMvXychUD9fUVQ7Jz9dKzJEL19BWDIjX19fWF1fXSMuU19fJ1FYRF9RNDYKK00lX1xFKTIrX0w6NkZfUUw5Jl9cOSZRW18mMSwxX1E4MSRfXDwlUVdfJlFEPF9ZKi1DP10lMjQnX0hJPjAKK01fV11dPi9dPDk1W185RlVFX1YhRzdfXUE6JiNfOSZBQF9RQDYmL1w5JUFTXyVBMDdfUTg0JU9cOiYhS18KK00nMUw9X1E4NCVPXDUkUTdfJEEgMl9RRDcmP1w3JTE/XyVRQDlfUjhNKz9cVC8zV18lIUQ5X1MsUC8vXEEKK00qIVtfJkEgOV9QRDImP1w7KjYnXyZRPEdfUjxBJ19cOCZBV18tJE0qX1g2QUkvXUQ+J1NfMzU5Nl9VKUkKK006L1xTNic/Xzw3KV1fWT4gOz9eJT1WW19KKiI+X1IkPyhPXD8nMV9fQzhKJV9aQkFFP14xSEpfXyk0XUkKK01fWy8vWS9eVVJNU18kUVRHX1hKJT9fXiNAJ09fJ0IoRF9VRTs4L15fTltXX087RltfUlBRLD9cVDAjX18KK00tI1RdX1RRODVfXEQpUkNfRShSL19RRDElL1w2JSE/XyZBSD1fUSAwJF9cOCYhT18lMTQ4X1FYPig/XD4KK00nQidfMFQtJl9SSEorP1xAKCIvXypCSE1fUSgyJT9cNCNBO18lIFwzX1BYLCNfXDMkMUtfJTIkXF9RSEUKK001L1w8KVRLXyxDNS5fVik0Pk9eID9IP18jMSA1X1E0MidPXDAjMFNfNCRVLF9RRDUlX1xAJlFfXzBUKSgKK01fVTk0NU9dQzclU19JSipKX1ZZTz1PXDYlIT9fJjEoMl9TJEUoP1w/JkFLXyZRMDRfWkZDSD9cNCQxP18KK00kUFw3X1BcLSNfXUI4VVdfRllOOF9TVF0uT1w9JlFXXyZRRDxfUlROKi9cOiVBQ19fX0tZX1JMQylfXDIKK00kMT9fJyFUPl9XRVc9L15GRVlDXyUxLDVfUkRNK19eW007L19HKT45X1FAMyY/XD0mUVtfJVEoMl9UNSkKK00wP15IRzk7X0E4LV5fVjVPOU9eJUM4L187JzFKX1Y9Tzk/XUk7NjdfJVE0N19RSDcnP1w6JiFPXyYhODgKK01fUUw5Jl9cPichW18nIUg8X1FANiYvXDomIUtfJkFAOl9RQDYmL1w3JiFHXyoiXE9fUyhbLl9cNCYxR18KK00tMyBcX1IoRic/XEAlQV9fJzJEUF9SJFY7L1w2JSIzXyhBXD5fUiRNLS9eKkkqP19ASVZEX1VVVD4/XSYKK000RF9fNDZJT19SVTU/L11UPjhPX0Q4IVJfVy1ANU9ePkRIV18oMihDX1FcOyc/XjJCSDtfSVlWMl9ZRkoKK01NX11WSEtTX0YsMzhfWkctWE9cSi5UQ19CKC4jX1lWOERfXD4nQidfMlRJMF9cNyBQT15OSUpHXy5DQFoKK01fU0BbLy9dKzNEX18vRC0jX1FIPSdPXiI/SCNfJiFEOl9RRDknL1w8JyFfXyRRLDZfUTA0JV9cNiVBR18KK00lQTg5X1FIOic/XF0vNCNfJ1FcQl9RRDknL1w/J1IrXyNAWDFfUTAuJU9cNCNRL18kMFwyX1EoMCY/XDgKK00oQ1dfKEJJNl9RODwtT1w4JiInXzUkUUdfVCBeMV9cSylSX18mUUhBX1guIT9PXTIzVFtfJkE4OF9SPEIKK00pT1wtJEIzXyciLFFfUyhVMC9dRzs4L189SCZAX1FcRC1PXD0lQTtfLiJURl9SLD8nP1w9JUE7X0s6PkUKK01fUkxIK09cPyZSL18lISg0X1YpQzc/XDsmUUNfLFMkTF9RTDglX1w1JFE7XyoyVEtfUUA2Ji9fWVs+W18KK00pUVxCX1E4MSU/XD4mUUtfJzFUOl9ZSi5EP1xIKTJPXyoiREpfUyRJKV9cSikyP18lMSg4X1IoQChPXV4KK00+N0dfNlU5MF9aLjpEX140REhXXztHNU5fWSY2RC9dWj83P187RzVOX1cpUzs/XDQkMSNfJjEwOF9RRDQKK00mL1w2JSE/XyYhODlfUUA2Jj9cOSVRS18mMTw6X1E4NCVfXEAnQiNfJVE4NV9RTDomP1xHLFMjXy0jRFcKK01fUTg6Ji9cWC9EI18oMVw8X1FYNyQ/XSYzRVtfKSJVPF9RSDspT1xAJ0FPXylDMFNfWDo7Rz9dU0I4T18KK004Nz1VX1VNRDc/XT49NyNfK0RdWl9XQVw/T148QVgrXzlVSS1fWEoiP09cPygiJ18rUyRPX1g+LkBPXkkKK01FOFdfNCVBQl9WMjRKP11ZSiwjX0ZcV0hfVU1cRF9eXE1bV19ARzlXX1FcQCg/XFsvQ19fU1xHJ19aQkEKK01IP1xRK1MnXytSXFJfUkhJK19dPDYlO18nMUg5X1QtIjIvXCkiITdfJzE4Ql9SIDooT1w5JUFTXyQhLDQKK01fUTQ1Ji9cNCRBN18kMFwyX1E4NCVfXD8nMiNfJUEwN19RJC8kT1wxI1ErXyRBIDNfUSgwJE9cMiQhL18KK00lMSg4X1FUQzBfXDElQyNfJDBcMl9RPDElP1xJKTJbXylSMEpfUyBNLF9cTisiX18sMlxRX1I4RClPXD4KK00mQVNfMENUX19SKEUvT10qNDY/XyUhWExfUixTMz9dKjVHN18iUFA9X1IkOSU/XUE3JEtfMFNYWV9RQDMKK00lP15CRzlfXypCMExfUUg1Jl9cNSVRN18yNFEmX1UhLzIvXkxISVtfJjFUO19RQDkmT1xIKUJHXywiWFAKK01fX19TXE9cSCgiL18pIiRHX1IkPCcvXF8wM1tfPSZFTl9RIC0kX1xFKUI/Xy0ySElfUjxBKT9cNCRRR18KK00mUTw5X1VNNjVPXUc4JUtfSClKMl9aNkNHT14gQTgnX0cpVjdfWSowQl9dVj43L18+J0FVX1E8NCRfXDgKK00lITtfJVEoNl9RJC8kT1w2JSE/XyUhKDVfUTw1Ji9cNSRBQ18lQTA3X1IsQShfXDsmQUdfJyFMOl9SPFYKK00sT1xYLyNLXyYhUDpfUlxbLi9cRShCJ18tQyBGX1I4TC8vXD4pVSNfJTFMQ19SKD4nL100NlVPXzUmPUcKK01fVzIqQj9dW0NIQ184JklBX1VFUDpfXE4yV09fPVdRWl9ZRiNAP11VOlYjXz1HIU5fUkhLKy9cUCxCX18KK01DWFojX1ZJQjgvXCwpUytfPDpDIF9YLlFTP11CRUs/Xz46KyBfWy5TTy9dTjhGL18pIihEX1JYUiwvXy8KK01SPD9fR1lKOl9SUEorL15GSUpHXypCUFFfWyZNSl9cOyYhP184Ri1KX1I8RCw/XFwuNDdfKDIoSV9RMDMKK00mP1wxJDEzXyRRJDRfUTg0JV9cMiQhL18kUSQ0X1FIOCZfXDclMUNfJDBcMl9RJC8kT1wyJCErXyRBIDIKK01fUSAuJD9cPCYxX18nIi0hX1BILSdfXDAiUE9fKiIsRV9RQDUmX1w5JVFLXykiKEVfUiA+KD9cPSZRV18KK00oQiBCX1ZJRjovXEYoMi9fJFBcP19RQDgoX1w1JiFXXyZCNFBfUVhGLk9cWS80N18pUig9X1M0TylfXUwKK006VktfIyBULl9aMkJHX1xVLCJPXygxUDxfUTg4JU9cXjBTX18zJEklX1w2WU0/XSczJEtfK0JcUF9RRDQKK00mL1w4JUFHX19fM1FfU0RULk9cNyVSM18pQiRFX1JESyovXV08Rz9fJkE8PV9YSitDL15SSVo7XzwmSU4KK01fUSwyJi9cOiVBQ18lUSgyX1c9UDpPXjtFOFdfTis6UV9bVl1OT18hT0tHX0o6Jj1fWVI6RT9ePEZJP18KK00pMihBX1IgPCdPXDwlUU9fJFEkNF9RSDgmX1wzJDEzXyVRNDhfUTw0Jk9cNyUxQ18oIVhAX1FEOCVfXD8KK00nQVdfKkNEVV9TPFsuP1w4JyFLXytDOFJfUjxCKU9cRylBX18pIkRVX1FQRjJfXDQmUidfL1NMWV9YMikKK01DT143SypbX0A5OjhfV0ImQT9dRTs2R183NzFPX1IxITw/XVk/R1NfRTddXV9XPU04T10oMEQjXyoySEsKK01fUixFKE9eP0QoT18mMixHX1M5PzxPXTtDOkNfOTkuT19VVjFMT10wPzlPX0pLIlpfVV01Ni9cTCpCU18KK00lIUA2X10jKlIvXkBGWU9fJ0FQPl9bIlBMX10iMSRHX0xLIlNfUUg6Jz9dUz03Q18lMSg4X1FYQikvXEUKK00qMk9fJSEwN19RLC4kT1w2JSE/XyZBQDtfUTw1Ji9cMiQhL18lMSw2X1EsMSUvXDAjQSdfJDBcMl9RJC8KK00kP1wxI1EnXyNQVDBfUUw4J09cPylDU18lIThFX1FUOCZPXEUoIjNfJEEgM19RRDcmT1xMKkJXXycxTD4KK01fUTw1JV9cNSRRN18zNEUrX1JERClPXDokQTtfJUEoNF9RKDEkL1xBJ1IrXyQxODxfUUA+KC9cTCoyQ18KK00nUSw2X1YxOjs/XDskQktfQygiNV9YJVY/P10lLyNTXygxWD1fU1EgL09cUCxDI19TXDMjX1MgVSxfXScKK00yJEdfKCFMP19RSDgmX19fXi8vXzAzVSZfVS04Ok9cNCRBN18pIjBBX1ZdRDo/XDclIUtfJFEwNV9SQD0KK00nL1w2JCEzXyVRODxfUUg2Ji9eL0JIS18/V0FSX1lWN0NfXk1KWjtfVE0jLV9dQzBTL183Ulw/X0s6QkMKK01fWk5JSU9cOSVBN18mUTw5X1FINSY/XDMkMTNfJVE0OF9RJC8kT1w0JEE3XyUxKDhfUTg0JV9cNiUhO18KK00uM0BXX1IwQyhPXEkuIzNfLTNEV19RRD0mX1xPLSMjXykyKEhfUVQ/Jy9cNCZCK18lUUxbX1FQPig/XTsKK002NTtfQllCPV9YRkNJT14lRjlXXzk2VU9fVUFCN19dNztWU18pNClSX1dBXT5fXis9Ny9fO1Y1Ol9UXSkKK00xX1xEKTI7XyhSNEJfWVY0Qz9dPTsnJ18nUlklX1EgSzBfXV1JO0tfRlxPR19aJyxZL15cUCwrXzQkPScKK01fUkRHKj9dQDkmK19TTEMmX1lGNEUvXDsmMU9fTltOXl9USSw0P15YTVtbXyYxTD5fViFDOS9cOCUhK18KK00oMVQ7X1I4QSg/XDklITtfJSBcNV9RQDYmP1xCKCIvXycxTD5fUSgwJF9cMSNRK18kQSAzX1E4NCVfXDMKK00kMTNfJDBcMV9RJC8kP1wtIlBbXychRD9fUyxbMl9cMiRBX18lMFwzX1EoMyUvXDAkIS9fJiE4OV9SMEIKK00pP1w3JTFDXyYhODhfUTw1JV9cOCUhO18mQTQ3X1FQNyc/XC0jUTtfIVBQMl9QQCcjT1wzI0ErXychSDcKK01fUVw7JF9dXjo2P18/NilSX1RATjI/XTMvNT9fMEM4X19YViJAP102NDUnXy4zTF5fUlRPLS9fLlBML18KK00rQyxRX1RRLTNPXD0mIVNfJVEwOl9fX1leT1xHKUJXXypCXFtfUzRULk9cSChCI181VSU1X1FYOyg/XjYKK01EOS9fTSpSSl9TWFkvP1wuJCE3XyZBQDpfUVg7Jk9eID9HP19FOS4rX1tSWk0/XzdUPF9fVl0jL19dPywKK01SX18iTVs7X0s6RkdfUjBBKC9cOiVBQ18lMSA0X1EsMSUvXDklUUdfJVE0N19RQDYmL1w3JTE/XyVRNDcKK01fUUw5Jl9cPycxX18nUixBX1JcVy0vXFgvM09fJyIkP19TMFguT1w/KDI7XyZBVD5fUSQ2Jy9cNyZCU18KK00lUihDX1QtODRPXVlDWT9fRUsmXF9XUjhIL10+PigvXzBVPUVfVEFFPD9cUjFWM18+N01ZX1k6JD1PXVAKK005NUtfMlQ9JV9UKSUxT1xRLUMrX0NIXihfV0lXPU9cPCYyO18wNUlRX1gmUFBPXjlRPUdfQys/KV9aSlkKK01OP1xYLTMzXy4zWF5fVjFJOV9fLVI8P19DWEoqX1FQOCZPXi5DSSdfODYtSF9aOkRJX1wzJFE7XywjLFQKK01fUjRCKD9eMkFIJ185JV05X1FMPSZPXDslUUdfJjEwOF9RVDsnT1w1JFE7XyRBIDNfUSgwJF9cMiQhL18KK00kMFwyX1EkLyRPXDIkIS9fJEEgM19QVCsjT1w7JjFTXzQkXTVfVEEnMz9cNCRBN18kQSAzX1BcLSQvXDAKK00jQSdfJkFAO19RPDUmL1wxI1ErXyIgOClfUSgwJF9cOiUxR18xRCkqX1NcXTFPXFouRDdfJDBcOF9TKEkKK00sL10gLTNLX0I3WiNfVUEnND9dSTc2U185JUlLX1c9Tj5fXU86Jl9fSFlaQF9ZVjdFP10qMVQrXzU1LTUKK01fXTsqUl9dOzRVJ18yRC0jX1FINSU/XDwlQUtfX18zVF9SUEcqP1w+KCI3XygxWD1fUlhGKS9dLDFES18KK00oUiBGX1I4Pig/XEooQiNfJzFAPF9RQDonX1w8JkFTXz1HLVJfWC4iPl9eOEYoX19PK0pVX11DMFNPXz4KK01UXStfVjxbLV9cNlpOP15KSUozXzFUMSNfUTgyJS9cNyRBO18lUTQ4X1FIOCZPXDclMT9fJiE4OF9RPDUKK00lX1w3JTE/XyZRRDtfUVQ7Jz9cPyhSJ18sMzhUX1MsWC1PXD0oQiNfLiM4UV9SMEInX1w/JyIrXyVBLD8KK01fUTAxKi9cUC1VN18nUyU1X1IgVjcvXE81Jz9fLlZKLV9SVTpAT1w+MTZfXyslNVlfUlkoO19dXEBYR18KK01HSSIhX1ZRQDVfXSUwM19fK0MkUl9SSE8qX10/OFVLX0A3XVpfVVVGOz9dOT8pL187WVpWX1lfIVZfXiMKK01JO0dfSDo6S19TLEwrL1xULTM7XzU1SThfV1ogPz9dTDpWS18qMlBNX1oiRElPXT44VkNfUEwjI19RLDEKK00kX1wwJFEzXydBSDxfUixBJk9eWEtaR19CV1FcX1E8MSU/XDYlIT9fJSEoNV9RMDIlP1wzJDEzXyRRJDQKK01fUSwxJS9cMiQhL18kQSAzX1EsMSUvXDIkIS9fJFEkNF9RSDgmX10pMVRLXyUxLDZfUSAuJD9cMiQhL18KK00kQSAzX1IgPig/XEIoIi9fKFIkRF9RPDUmL10kMEQ3XyUhKDVfUSAuJD9cNCQhQ18kQFg2X1FINidPXEcKK00oUk9fLDJYVF9TQFMuP10uMiUjXzg1SURfUSQuJl9cNCQxV18nIUBAX1QoXTA/Xk1KKktfTEpKSF9XTU8KK006T11MOTY3X0JYKiJfVyFHOV9dTDk2N183JT03X1QsXjBPX19cLlNfLlMwVF9SREoqX10tMVQ3Xy0yVEsKK01fUzhQLS9cOiVRV182NSU0X1YtOzY/XEcoQjtfJlFUQl9SOEQpT1xWLFMrX0NYWidfWUI4Q19fJFBLV18KK01WPScvX10/LFJfXzpTXFtfUTtKWV9aSkZJL10vMyRPXyUxJDNfUTgxJT9cMyQxM18lUTQ3X1E4NCVPXDUKK00kUTdfJTEsNV9RODQlT1w+JyFbXyZBQDpfUihGKS9cWC8zT18sIzRTX1IsSClPXFUuMz9fJVFcSV9QTDcKK00sT1wsJFM/XyIhLFJfUkxcOk9cPi43O18qNE1dX1I9MEA/XF47KVtfKyVKLF9TKTtDL10lOikjXzNGOi0KK01fVFE0N09eN0M4K189Vk1CX1NAUiwvXF8wJCdfMiRBJV9WSU45P11KO0Y7Xz04LiZfU009PD9dXUtcM18KK01ILD9AX1dCQkxPXVVBKDNfQSdNW19ULF8wP1w7KFIjXyszLE9fVC0oMU9dVT5HS19OLCMiX1E0PyhfXl0KK01OW1tfJyFIPF9RSD0nT1w+JkFTXyUxQDJfWz5JSU9eO0AoO18lIFw1X1EkMSUvXDQkQTdfJSEoNV9RIC4KK00kP1w0JEE3XyRRJDRfUSwxJS9cMSNRK18kQSAzX1E0MyVPXDMkMTNfJSEoNV9RWDsoP1wzI1E/XyQwVDUKK01fUSAsJS9cMSNRK18mQUA7X1FENyZPXDglQUdfJEEgM19RVDsnT1w0JEE3XyZBQDtfUSgvJT9cMiNRN18KK00lMSg4X1E0MiYvXDMkQUNfJDEsOF9RLDUmT1w3JjFbXyQxKDlfUSwyJi9cUiwjK18nUVQ6X1omPEcvXi8KK01BKC9fOiVRN19WOT03P11ANyVbXzdFSTxfVEkmMi9dMTM0X180RSEzX19fUlxfXEopMkdfKCIoSV9UKF4KK00wL10jLlNHXy0yXFNfUTw0Jk9eM0JYW19GSSowX1JIRSo/XDcmMVtfJyFIPF9SREYpP14vQ0g/X0U5NiwKK01fXDMiTz9fNlNMU19VPEspX11LL1NPXy1QTCdfSDlWO19SPEQoX1w2JEEzXyVRKDZfUSwxJS9cNyUxP18KK00lQTA2X1E0MyU/XDUkUTdfJiE4OF9SLEEoX1w7JjFPXykiQEZfU0ReLy9cTy0jK18pIkRHX1NMWy4vXDsKK00oUldfLUQ5QF9ULS86T1xVLkUvXywjSS5fU1UvNz9cTC8kU18pUlBeX1JMUjAvXFoxJF9fN0YpSl9WQUcKK005T11OOVZfX0AnRVNfWDFaO19dUzklW19HWT41X1RdLTNfXSkxVDNfJ1FMPV9RUDgmT1xDKTJDXy9ESTMKK01fUThNLE9dLzhGW19DSkJVX1FQRSk/XEUoIiNfLyNdIF9UQS0yX102NUUvXzM0UStfVFEtM09eUk0rP18KK00mIUxAX1syT0xfXD4nIVtfJ1IoQ19RWDonL1xBJ1FTX047NlNfVUEzNV9cNiUxU18kQFw1X1EoMCRfXDAKK00jQSdfJUEwN19RXD0oL1w1JFE7XyUxLDZfUTAyJT9cMyQxM18kMFwyX1EsMSUvXDIkIS9fLVMsW19TKE4KK00tX1w9JjIrXyZBOD9fUSgvJT9cNyUxQ18lUTQ4X1E8NSYvXC8jMSNfKCFYQV9RPDUmL1wwI0EnXyZBQDsKK01fUTAyJT9cNCRBN18lISg1X1EsMiY/XDMkQUNfJSEwN19RLDQlP1w0JTFTXyQgWDdfVSUvNE9cPychT18KK007Rl1QX1Y5RDg/XiVAJ0tfNSUtMl9UUTA0T10lMjRPXzIkQStfVEkoMl9dJzE0Q19fX0NbX1IoPyk/XDUKK00lQVdfJ1FQO19TUFYtL1xAJlFfXyhRVEFfUlg/J19cRyVRM18oQUg+X1EsNSZPXDElITdfMCQlIl9YQiYKK01AX147RThXX1FcKl1fXTsvU19fPVUtM19WXSctX10nJVA/Xj5FWT9fJyE8OV9RODIlL1w0JEEzXyQgWDAKK01fUTQzJT9cPSZRV18kUSQzX1E8NSVfXDklUUdfLCJYUF9RSDgmT1xFKkI7XyxDPFVfUyxYLi9cRCpCO18KK00vI0BQX1JARCcvXU87Jj9fOEVRNF9XXVU8P11MOFVTXzs2QTxfVyFKOC9dVTpGL188Rjk9X1ctRjZfXUoKK003JS9fNERZLF9VKS40L109NiUvXzs2MT1fVkk+OD9dJS5DX18nUUg6X1JYSisvXDslMUdfJVEsNV9SMEMKK00oT1w/JkFTXy0iND9fUjw5JU9dNzRFM18+Vy1RX1I0PSgvXEUpIktfKUJITF9SIEAoX1xIKUJHXyYxODwKK01fVkFHOz9cQCdSN19HKVpBX1E8OScvXDomQVdfJzFMPl9SLD4mP18kUDwjXzomPU1fUixAKU9cNyZBX18KK00lUUQ+X1EoLyU/XDglUVdfKlJQTV9RVDsnT1xAJyIzXyRRJDRfUTg0JV9cVSxTO18jMEwuX1E4NCVfXFEKK00rQzNfLiMwXF9RSDYnT1w7JVFfXyVRKDZfUUg1Jj9cNiQxN18lMSA0X1E4MyY/XDclIUtfJSEkN19RODMKK00mP1wxI0EzXyQwWDRfUTgzJj9cNSRBQ18lQSw5X1FMOScvXDklUUtfJjE8OV9RJC0lP1wzI1E/Xy4jMFwKK01fUkxIK09cRyoyU188RzlUX1UpNDRPXSozNFtfMSRBKl9UMSYyP10jMTRDXzFEOSlfVDkoMl9fW1xfO18KK00pUihIX1IkQClPXi5COEdfPTZdTV9SSEUqP1w4JUFHX087PlVfW1ZVTD9cPCVRT18mITw9X1FENSVfXDUKK00kUTdfREhWLV9ZWjVDT18qUTwjX1VMXy9fXVc0VS9fPFRMW19UTDshX1oiN0VfXD8mQVNfJVEsNV9RNDMKK00lP1w2JSE7XyYxPDlfUVA6Jy9cMyQxL18kUSQzX1FIOCZPXDsmMU9fJlFEO19SMEkoX1xVLkNDXytDLFMKK01fUjhMKi9cVC0yX18rIkREX1RNJjAvXSkwU09fOFVFNV9VRTEzP10qMTQjXy4zOFFfUyBMK09cRChCN18KK00mITg5X1FANiY/XDslUUdfJ1FMOV9SUEUnX14gPUZTXzlVTTxfVik8Nk9dSTlGJ18wI1RcX1FYOicvXDkKK00lUUdfLSMoT19SPDwmX10qLFI/Xy4yND1fXEpdTy9eIz43N18oIUQ5X1JQSisvXFMuQ0tfMiRNLF9SREoKK00qX11BOEYvXz83WV9fUSQyJF9eU007Q18mUVRAX1E4NiY/XDwmQVdfKjI4QV9bVlhOL11ANkYrXyZRQD4KK01fUyhXLy9cWC5DX18nUVBCX1JASitfXSAwNCtfJVEwOl9SPEMqX1wzJDEzXyMgSC1fUyhQLF9cNiUhP18KK00kQSAzX1FcPChPXDglMU9fJFEgNl9RJC4lL1w4JFE/XyYxMDhfUTgxJT9cNSQhM18kQFw1X1FINyc/XDMKK00kITtfJEBcNV9RRDYnL1wxI0EzXyZBPD1fUSwwJU9cNiRBS18lUSw7X1E0MSY/XDYkQUtfJ1FUQF9SUEoKK00rP1xNKlJbXzRFITNfVEUqMl9dJTIkR18xJD0oX1QtJjFfXF8wNDNfL0QhI19UJSMxT10iMSQ/XzAkKSUKK01fX0NQXF9dJzBEQ18qUkhQX1FcOiZPXU85VjdfKSFcQ19SIEIpP1xAKCFXXygxWDlfUTQzJU9cOiYxX18KK00nUTw6X1JYTCtPXi1CKENfR0k2Ll9cXypRP18yUlxPX1VcWy5fXVMyU09fNlJMN19IKT43X1IwPyg/XD0KK00mMU9fJUEwNl9RPDUlX1w5JVFHXyZBQDpfUSwxJF9cMiQhK18mQUA6X1FQOicvXDomIUtfKVJQRl9TPFwKK00uT1xKK1JfXykyTEdfUlxRK09cSClCL18vI0RUX1QwXy4/XScvU1dfJlEoMl9SLDwnL1w+JjFHXyxSSEQKK01fVDBcLi9dMjM0V186JV05X1Y5OjQ/XVE5RU9fPkZVQF9YNVc6L11ZPDY/XzlGLThfVlFLOC9cVSxTI18KK00oIVhBX1IoQChPXEgpIitfKzFYOF9UOEsmT1xYKDE3X1UsOyNfWTIsQk9cPiZBQ183NV08X1YlTDlfXToKK004JVNfN1Y1QV9WRU86X109OFVfXy80LF9fVEkvM19cMSRRO18jUFwyX1E4NCVfXFctIl9fMyQ9J19SIDoKK00oT1w4JTFPXy0jRF5fVVE+OF9dOTVFU18sIyhXX1UhMTRPXDIjUTdfKCFQRF9RPDUmL1w2JSE/XyZRRDwKK01fUTg0JV9cQCdCJ18lMSg4X1IwQSlfXDQkMT9fJ0FMQV9RSDUmP1w6JTFHXyVBJDVfUTAvJF9cNyUhS18KK00lQSw5X1FANSZfXDUkQUNfJUEsOV9RMDElX1w2JFFHXyYxODxfUTAwJi9cQCciM18lMSQ5X1IsPylfXFUKK00tQz9fNFU1M19WNUc5P10qMyRLXzJEUS9fVDEmMj9dITBUO18vRCEjX1QpJDFfXF8wNDNfLlNVIF9TWSAKK00wX1xZLjNTX15PK1VfUzBPLT9cRChSR187VklKX1k6MkQvXD4mMVdfKzJATF9aIjVFL14rP1dPXycxPDsKK01fUUg5J19cPSZRV18nMVg/X1k2MEQvXj5FOFtfU1xLJV9dOy9TX184U1xfX1UsSyZfXUMsUV9ePUUpM18KK00mQTQ3X1FUOSZfXDUkUTdfJVE0N19RQDYmL1w6JiFLXyRRJDNfUSwxJF9cOyYxT18nIUg8X1FQOicvXEcKK00rIjtfLjNYXF9SSE8rX1xGKyJDXy0zME1fUlxKKS9dKzEzV182VS0pX1ddUzpPXS0wM0NfMTNMUV9UVSUKK00uX11QOFU7XygxRDVfUlxLKz9dLzEjV188RjU4X1dVUDhfXV08Rj9fQUdNUF9XIUg3T11FOEU/XzxHIUgKK01fUzhSLS9cPCYxX18mUUQ7X1JUSChPXFoqIVtfOEQoTF9UQE8nT15eS1pLXzo2JT9fUyRNK19dQzlWR18KK004NlFNX1VFPzg/XTQ2RVNfLVNUX19TTSEwX1xMLEMzXzNVLTVfUSQzJU9cLSMxI18oIVhBX1NQWS0vXi0KK01CKENfKDFMQ19SLEApT1xRLUNPXzdGIUVfUTgzJj9cOSZSI18yRE0sX1IgPShfXDwmIiNfKUIwR19SJD8KK00oT1w8JkFXXzIkOSlfVEkoMl9cNCQxP180NFk0X1FcPChPXDAjMS9fJUEkNV9RQDMlX1w0I1EvXyZRODoKK01fUUQ2Jy9cNSRBQ18lQSw5X1FYOyg/XDolUVdfJSEkN19RTDgnT1w7JiFbXykyLEVfUjRDKT9dJzE0P18KK009Ny1VX1VdPzhPXS40JTdfMkRRMV9ULSUyT10hMFRDXy9EISVfU1BeMF9cWy80K18sMyxWX1MkUy1PXFQKK00tQ0dfK1MkVF9RRDcmT19fXS83XytSPEpfUUQ5Jy9dWz9HX19EWTI1X1E8NyZPXD0nMiNfOjY1R19WVUwKK008T1wyJTFLXylCPEhfUVA0JC9cTCoiS19EKE4rX1lCNEMvXy5TPDtfVS0nMF9dJyxTL182VCxbX1JMIlwKK01fWjo6Rz9cPiVRW18mUUA+X1E0MiYvXDUlQT9fJFEwNV9RODcmL1wwJDErXyNAVDNfUVA7KD9cOCYxS18KK00nQiA+X1JATSlfXFwwM09fKlMgTF9STFArL1xPKlJHXzAzUFZfVT0xMV9dSDdFI184RSEmX1UhIC1PXSUKK00uQl9fNzUtKF9VXTIzP1w1JCErXyQhIDNfVllJOF9dTDhFQ18+VllBX1dFSzcvXiQ9VktfOFVRNl9WITwKK001L11ROyY7XydBODlfUTQwJU9cMiQhL18oIUQ5X1UxIS4/XUEwUldfNSM8RV9ZIV09P14vQVg3XypSMEsKK01fViE/OT9dMDUlO180JS00X1RRLTNPXCchQFNfKFIkRF9UNSEvX10yNURXXylCQEVfUVg9KF9cOCVRV18KK00zNDkgX1VBMDNPXDslQVNfJVE4PF9SQFAtL102NiVXXyZRQD5fUTA2Jl9dJDFER18lITg7X1FUPSovXSQKK00xRE9fKzJMVF9RXDwoT10uMyRbXzNUUTJfUTAxJV9dODVFR18nQVA/X1E4NCVfXDEjISNfJkE4OF9RQDMKK00lP1xBJkFLXyZRODxfUSwvJV9cOyVRX18nMURBX1FQOic/XEAnQidfJ1FUQF9VKTA0X11PPDczXzU1RTsKK01fVFUxNF9dKjNFI18wVEEtX1NdJDI/XF4wVENfL1QxKV9UISEyL10jMERHXzBEJShfVCkhMi9cXS9UM18KK00vNCUjX1NIXjAvXFYuQ1NfJTEsNV9fU1pdX1xLKiI/XyYhODhfUUw5Jy9cTSszI18mIUA7X1E4NiY/XDQKK00lIT9fJ0FURF9RMDYmX1w1JiFHXyoyOEFfUVg/KC9eL0NIV19HSUIwX10vLlI/XzNSXEdfVTxPJ19dLyoKK01RL18rUTtXX0hZPjhfUUAyJU9cOSYxU18mISw3X1FQOCZPXDolQUNfJyFAOl9RPDMlP1wxJEEvXycxWD8KK01fUUw9Jk9cRClSJ18nIiA4X1QhIy8/XEUpUjNfJTE8NV9RWDomL10pMVQjXzVFLShfVkU/ND9dWDlFU18KK002JEBeX1Q0WCs/XTIxU1NfOEUtM19RSDIlT1w4JkFDXzxGUURfVjU7ND9dTTglL186RUkqX1ctRjZfXTUKK000JE9fOjY9QF9VSTg0P1wzI0EjXyUxIDRfUTQyJi9cPyZBU18xMzhRX1VMXisvXSosIVdfRUg5XV9YOV8KK00/X1xEJzIzXyoyOExfVilIOk9dXD9YI19COEorX1E8NCZPXDslQVNfPlc9VV9WXVE6L11COSYnXyZBREAKK01fUTw2Jy9dJTAjT18zVEUnX1FMNSc/XDUlUVNfJkIoRl9TRFswL1w5JUFTXyUhODtfVD0pMy9cLyQhP18KK00nIVBFX1UhMjVfXFYsM1dfJ1FMQ19WJT84P104NTVPXyRRIDZfVUE2Nj9cPichX18nUVRAX1NMWjAvXDgKK00lUVdfJSEkN19RODMmP1w5JSFDXyRAUDBfUkhEKi9dKjEkQ180RSEyX1cxUj0vXTw2RVNfNiU5OF9UTS0KK000T10nMkRfXzFERS5fVCklMk9cXzBEP18uU1kjX1NAWzAvXFMtQ09fK0MgVV9SWE0sX1xOKzMvXytCVFMKK01fUkxNLC9cSyszI18rQyBTX1JMTSwvXEAnQiNfXF83Ul9TUF4vL1xBJ1InX0NYSi5fVF0tNC9cNiUhP18KK00lUTQ4X1E0MyVPXEMmUV9fJjEwOF9RVEAoP1w2JiE7XyZRXD1fWSIxQl9eQkZZN19VPF8tX107K1JPXzUKK01SPDdfVFxLJF9cVydPX14+REkvXyUgXDFfUUQ6Jl9cOyVRR18mISwzX1FENCUvXD4mMUdfJUEkMV9SNEYKK00oL1xSLTJfXzAkLF1fVCklL19cUixCX18rQlhLX1IkQCdfXDEjUSdfKCFMO19UMSIuX10kMDM7XzclKSQKK01fV0lLN09dMzEjP18wQyxGX1UtIi0/XToyVE9fJ0FEP19SLEUqL10yMzQ/Xzs2KTdfVjU4Ml9dSzdFJ18KK005NVE1X1UpLTQ/XS4yVEtfOkZBQ19RNDEkX1w2JEEzXyZBPD1fUTgzJj9cSidBX182I1RMX1RUWClPXUgKK003VUNfO0ZJTF9RWDcoP1xAJ1I7XzRVTT9fViVFOV9eKUIoP18lISQ3X1E8MycvXiJAKC9fP1glXl9WLUMKK005T1w4JUFfXyUhLDlfVFksMV9cNiRRK18mMTQ+X1FANydPXDgoIjNfNSU5O19RLDAlT1xAKEI/XzY1STsKK01fUSwyJi9cSClSW185JjFHX1MwUC4/XD8mUi9fOVY1R19WJT45L1wzJCE7XzVVNThfUVg8J19cQygyM18KK005Ni1GX1FQOyg/XDYlQV9fMVRJNV9SIDwnT11EN1VfX0BHVV1fVVU4Ni9dLjMkX18yREktX1RdLzRPXSYKK00xREdfMCQpJ19UKSQyP1xeMCQ3Xy8zXSRfU1kgMT9cWS5UI18vRCElX1NUXzEvXF0vNCNfL1NdIl9TWF4KK00wP1xfL1QrXy9DWSFfU1BcL19cUyxTO18oIiBDX1FINiYvX1ZcTyNfL1NIWl9SVEsrP1xHKVJLX0ZJQjsKK01fUUAzJV9cOCRRP18mMTA4X1FQOCZPXDUkUTdfJkFUPl9RQDYmP1w/JlFHX0ZJNi9fWUY0Q09fNlY9S18KK01TXS81X10jMFRfXy1SLEtfUltfIF9WKTY1X10nMEQrXz9YJV9fVik/N09dMzRVI18wRChfX1MsUywvXE4KK00rQk9fLiNMVV9TMFYsX1xLKzJPXyhSLEZfUVA5Ji9cNiRRK18kMFAwX1E0MCVPXEAmMUdfMTQsXF9VOTMKK00yL11NOFU3X0AnKUNfVy1FNU9dTjckW187VU0tX1VVLjNfXTs1VV9fKiJMUF9UNSIvP11HNlUrXzlFRSwKK01fVU0wMT9dKjFEM18oUVxHX1FIOCZfXTU1NStfJ0FUPF9RSDUlP1w5JUFTXyYhPD5fUVw5Jz9dKCtCJ18KK00yQ0BKX1UpMzMvXSYxNE9fKCFMR19RPDkoP10+OVZXXzhGPUxfVkFHOU9cPSZCI18mUUxGX1QpJDMvXFgKK00uQ1dfKzJQU19RQDYnX1w2JTFPXy8kJF1fUFQvJE9cNCQxV18mITg/X1EkOSc/XSUxVFNfJiE0O19RMDYKK00mX10sM0RTXyZBQDtfUixAKU9dRjkmO18rIkBRX1FcOyhfXUg5RkNfNzVJQF9SLEApT10mMSQ/XygxXEIKK01fUjBCKT9dMDJEQ18xM1xdX1Q5JDFfXDUlMVtfOEYxSV9VIS81P10sMlUnXzI0QS5fVEUrNC9dJjIkV18KK00vVCUmX1QhIjFfXS0zJStfLTMwWl9TIE8tP1xNKyMrXypSSFBfUkxKLC9cSioyX18qMkBOX1I8RypPXEkKK00qQk9fKjJIS19SREoqX1xLKjJTXyoyPEpfUkhIKl9cOyYxU18mMTQ3X19TVF1fXEcoQjNfJjE8OV9RODcKK00mL14yRCkvXydRSD5fUUAzJV9cOCRRP18lUSg2X1EwMiU/XDUkUTtfJjEwOF9UMFwuL143RDg/X0Y5QjEKK01fXCckUT9eVE47W19LWy5VX1s6VE1fXyFOO1dfOTYtRV9WPUo6X109OCYnXyxTOFdfUjBJKj9cQSlCO18KK00oIixEX1IsRCk/XEIoIitfJzFMPl9RQDYmP1w2JSE/XyQgWDFfUSwuJE9cMyNBK18kQFQxX1IoPSg/XF8KK00uM1dfKyI4RF9VWTcyX11LODU7Xzc0XSBfV1FENT9dXjklR18rMVhCX1JAQyo/XFcsUzdfL0NMVl9WNToKK00zX11BNVRHXzVUUSVfU1BWLS9cOiVBW18lUUA/X1NQXzEvXF0vJCtfJ0FMQV9RUDsoP1wvIzE7XylCKEsKK01fUlRCKV9cRShBV182RVEzX1UtMTUvXDsmIjNfJjFEQl9VRTw3P103NyU7XzZFUTlfUUQ5Jy9cOSYhW18KK003RilAX1ZdUTtfXUQ5Jj9fJiE8Pl9RUDsoP1xfMDNfXyoyRExfUUQ1Jz9cPSYyJ18vU1RfX1FUOigvXDkKK00lMVtfJVE4PV9TJFAtT1w7JiFbXychSD1fVklJOi9cQidST18oIVRJX1UhKzNfXSwxRDNfKkIoPl9SQEAKK00nL10vMkQ3XzomNUBfWEYlQV9dODVFR18yND0qX1E0NCZPXSkzJSdfMURFLl9TUF8xL10gMFRDXy9EJSYKK01fVCklMk9dJTIkV18wJC0oX1QlJDI/XF8wJD9fLkNNIl9TUF0xL1xZLlQjXy5TVSBfU1RfME9cTywzM18KK00qUlBNX1JQSisvXEkpUkdfKjI8SV9SQEYqL1xIKUJDXyoiOEhfUVQ7Jz9cNiRBM19eLyNTX1JERClPXD0KK00mMU9fJlFEO19XUVc+X1w2JDE3XyZBNDlfUUQ0Ji9cOCRRP18mISw3X1FcOidPXEYoMjdfMlQ1I19ZIisKK01BP14rQjgzXydRXEJfVilHOy9dMjYlS18yRFkwX1M8Vy5PXEsrMyNfKiJITV9SMEYqP1w6JyFfXyUxNDgKK01fUTA0JV9cOSUhQ18kUFQxX1EoMCRfXDMkMTNfJDBcMl9RJC8kT1wwI0EnXyQwXDJfUSQvJE9cMCNBJ18KK00kMFg0X1NYWDAvXD0lUU9fKVIsO19USSUuP10+NEQvXzslRSdfVzVANS9cSSgyN18sQlRTX1QxIDBPXSIKK00wI1dfNTUhKl9VJSwxT10nMEQrXy5DNFlfUVw7KF9cNyYhX180VUE+X1UtMjY/XS8zRTNfNVU5PV9RQDYKK00nX1xbLiQzXyxSXFhfVU05Nl9dOzclO182JTk5X1FINyhfXDkmIV9fNlVRPV9VXUM2X11AOEYjXyYhPD0KK01fUUg5J19dPzg1X184Jik/X1VZPjg/XDglUVtfJVE4PF9UNSQwX1xWLSM/XyYhMDxfUVQ6KC9dSzlGO18KK007NkFOX1FENSdPXDwmUitfO1ZRUl9RVDooL1xDKDIzXzVVNTdfUjhAKS9cTCkiQ180RFUtX1VNNjVPXiAKK00+V09fQTgiIl9UMSAwT1xULEMzXykiMEdfUVw+KS9cOyZCI18kQSQ3X1IoQik/XEgpQkdfKlJETF9TKFAKK00sX1xSLSM/Xy1TRFxfU0RbL09cWi8jX18uM00gX1NAWi9fXFYuI1dfLTM8XF9TKFQtX1xMK0MnXyoiSE0KK01fUjxJKy9cSioiS18qIjhIX1JARiovXEgpQkNfKVI0R19SPEUpX1xGKSI7XyoiOEhfUUQ1JV9fX11PR18KK00oIUA7X1FYOSZfXDklMT9fJjEwOF9RPDIlT1w8JVFPXyYxMDhfUTgxJT9cNiQxN18lMSA0X1FAMyVfXDcKK00kMTdfKCFMO19RPDQkX1w3JSFLXydCIEVfUVhAKF9cSCsiW18mUVxBX1EkMSUvXDEkMTNfJCEgM19RIDAKK00kX1wyJCEvXyRQWDJfUUg0Ji9dUDomU18lUSg2X1EoMCRfXDEjUStfJDBcMl9RJC8kT1wwI0EnXyQwXDIKK01fUSAuJD9cOSYxU18zVE0zX1M8Ui4vXEMoIU9fLzNMU19VPTAxL106NCQnXzdFPStfUUg1Jl9cOCUhU18KK00uIzhZX1NQWy5PXF4wNCtfNDUtOF9VJTI2P1xMKzMzXydRTENfUTw4J19dQTlGU186Jj1OX1ZVTDxPXU8KK007RzdfJUEwPV9RTDgpL109NlYzXzlGOUlfVj1IOj9dOzZGI18mITg/X1FIOSgvXUM4VjtfOiZJSF9WNUYKK005X1w2JTFTXyUhLDpfVTk3Ni9dPzg1W181RTk5X1E4NScvXDkmIVtfMCNcXl9SPEUqL1w6JUFbXyhBXEUKK01fVj1DOD9dQTcmI18nIUBAX1IkQClPXScxND9fJ0FQPl9SQEYqL10+NyVbXz5HNVBfWkZBRz9dVzxHM18KK002VUE+X1UxNTcvXS4zRT9fMSQ5Ll9TVSMyX1xYLlQjXy4zUSFfUlxSLV9cSSsjJ18qUkRMX1JcSitPXE0KK00qIlNfKzJATF9STEkrL1xIKiJPXylCOElfUjhGKj9cRilCR18pMjRIX1JASCpfXEcpUktfKVI8Sl9SMEQKK00pX1xEKSI/XykyNEhfUkBGKi9cRykyP18pMixFX1I0Qyk/XEUoUjdfKTIsRV9SQEYqL1xCKCIrXysyREsKK01fX1NQXF9cPiUhP18sMkRMX1JQRyo/XDwlUU9fJSBcM19RNDAlL1w0I1EvXyUxIDRfUTQwJS9cNCNRL18KK00lUSg2X1EsLyYvXDckQUNfJiEsN19RQDEmP1wzIyEvXyVRJDVfUTQwJS9cMSQxM18kQSAzX1EoMCRfXDEKK00jUStfJDBcMl9RIDAkX1wtI1ErXyUxLDZfUiA7J19cNSRRO18kQSAzX1EkLyRPXDEjUStfJDBcMl9RIC4KK00kP1wxI1ErXyQgWDFfUSQyJF9cOCVRW18mITA8X1IkPSdfXDEjUSdfMkQ5JF9VNTAyT1xDKEInXyRRJDoKK01fUTQzJy9cTSsjK180VTE1X1RVMDU/XTY2NVtfN0VVQ19TIE0sX1w8JiIjXyVRQD9fVVlDOj9dQjg2Q18KK004RiVHX1YtQjo/XDglQV9fJVEwQF9VWT85T11AODZDXzgmJUhfVTE2Nl9cOyZCJ18mITw+X1Y1RDpPXUUKK005JktfN1VZRF9RRDcoL1w8JkIvXzM0VTBfUyRTLC9cRylSS18mUUhBX1FEOCdPXSEwI19fKzJMTl9SIDwKK00pL1xHKSJLXzAjVFhfVCheMC9cQSdCM18nUVxCX1YxRTdfXiJAV1dfRUk2NF9WPUU6L101NjVPXzU1QT0KK01fVFkwNV9dKjJFL18yJD0uX1Q5JzNPXSUxVFtfMDQ5LF9TWSMyL10gMTRLXy9ELShfU1UiMV9cXjAkL18KK00vQ1khX1MwVC1fXE8rUytfKyJITV9STEkrL1xKKiJPXypCQEtfUkxJKl9cSClCQ18qMjxJX1JARiovXEkKK00pUktfKUIwR19SNEMpT1xFKFI7XylCMEZfUjBCKS9cRChCM18pIihEX1IwQikvXEQoQjNfKEIgQl9SOEQKK00pT1wyI0EjX15fK1JfUjg7KC9cOyRBR18lUSw1X1FAMyVfXDUkITNfJTEgNF9RNDAlL1w1JCEzXyUxIDQKK01fUTAvJF9cNyRBO18lUSw1X1E8MyU/XDUkITNfJiEkO19TMEouP1w6JFFPXyUxIDRfUTAvJT9cMSNRK18KK00kQSAzX1EkLyRPXC8jMSNfIzBUMF9RIDAkX1w/JyIrXyZRPD9fUTgxJT9cNSQxL18kUFwxX1EwMCRPXDIKK00jMSdfJFBYMl9RKC0kP1wzI0ErXyQxIDdfUTwzJl9cOCRBS18mMSQ1X1FENCVPXE0qIkNfMTQkX19TVFoKK00uP1w2JEFLXyYhMD1fUkRGKy9dMjQ1I18zNSUvX1UlMzQvXTI0VFdfKVIwQ19SIDwpP1w9JyIrXzZVVTsKK01fVi1COD9dPTZVQ185Vi1FX1FENSdPXDomIidfNkVJQ19WKUM6T11IOjcjXzE0NTBfUTQ2Jz9cOiciJ18KK003VV1IX1YxRDtfXUI4RldfJEEoPV9RTDspL11BOEZHXzdGIUhfViU/Oi9cPyZSL18nIVhDX1NZIC9PXFoKK00uI0tfJ0FQP19SQEUqX106NTUjXzglTTZfVzlSPC9dRDg2I181RUE7X1U9OTcvXTo3JidfNDUtOF9UUTEKK001X10qM0U7XzE0RTFfVEEqND9dJTFUW18xNDktX1QtJTMvXSUxVFtfMEQ1Kl9TUF8xL1xdMCQ3XzA0MSkKK01fU1UgMT9cXjAkP18vI1klX1NQXjE/XFguQ19fLkNEX19SUEssP1xJKiJbXytCUE5fUkhIKk9cSioiS18KK00pUjRHX1JERyo/XEUoUjdfKiI4SF9SNEMpP1xGKEIzXylSLEVfUig+KC9cRSgyL18pQiRFX1IsPihPXFcKK00sQztfKSFcQ19RODElP19aXD8nXyghPD5fUUw0Jy9cOyVBS18mISw3X1E0MCUvXDUkITNfJTEgNF9RNDAKK00lL1w1JCEzXyUgXDNfUTwyJU9cNyRRN18lUSg2X1EsLiRPXDgkUUdfJyE0P19RQDMlX1w1JEEnXyUhIDIKK01fUSQvJE9cMiQhL18kUSQ0X1EsMSUvXDMkMTNfJSEoNV9RODImT1w8JiInXyZRODpfUVA4Jk9cPyZRV18KK00mUTw5X1E8MiVPXDUkITNfJTEgNF9RMC8kX1wzI1E/XyVRLDtfUVg5J19cPyYxV18nMUQ7X1IsQCdfXEcKK00pIi9fKDFYPV9RODImT1w4JSFTXyghWEFfVE0rMi9dLTNUU18zRSkqX1RZLzIvXDwmIUtfJ0E8QV9RTDgKK00nT102NUUvXzZFSTdfVVE5NS9dOTU1P18mITA9X1FIOSgvXUA3VjdfNzVZP19WJUI4X1xdLyQvXyVBPD4KK01fUUw9KE9dQThGR184RilLX1YlQTsvXDclUiNfKEIsSl9UWTA1P10zNTVLXzVVKThfUjw/KF9cRSkiL18KK002VU04X1VVPjYvXUs6RkdfRTkuNV9YMiBAT105NUU3XzYlQTtfVS01Nk9dMDRFR18zRSE3X1RNLTUvXSkKK00yVStfMlRVNF9UPSk0L10iMSRPXzEkOS1fVDEmMz9dIzE0U18wNC0qX1QlIzJPXF4wNDtfMCQtKF9UISMKK00yL10hMSRHXy8jWSVfU1RfMU9cXS9UO18vRCEnX1NUXzEvXFwvRC9fLzNdJF9TQFovX1xSLCMvXypCQEoKK01fUkxJKl9cSClCQ18qIjhIX1JERyo/XEcpMj9fKSIoRF9SPEMpP1xIKSI7XyoyNEdfUkRFKV9cRSgiM18KK00mISw3X1E8MiVPXDgkUT9fJSBcM19fX1VeT1xPKTJbXzFTWStfUiQ8KE9cOiUxR18lQSQ1X1E0MCUvXDgKK00kUT9fJUEkNV9RODElP1w1JCEzXyYhLDdfUTwxJj9cNyRBQ18jMEAsX1c5Uj0vXSkxJEtfJjE0N19RSDgKK00kX1w4JTEzXyRBIDNfUTQzJU9cNSRRO18kUSQ0X1EsMSUvXC0iUFtfJjE0PV9RVDkoT1w9JiFTXyYhMDYKK01fUSwvJD9cNCQhK18lUSg2X1E4MSU/XDklIUNfJyE8O19RMDAmL1w3JFFPXydBTEFfUVQ7J09cQSdSJ18KK00sMlxRX1NcXS9fXSwyRFNfJVEsO19RRDUnP1xFKFI7XzQ1JS5fVSUzND9dLzREU180RSkvX1FUOCcvXEMKK00nIjtfJkE8PV9VRTk1T101NTUrXzVFLS5fVUE0NU9cOyVSI18mMUA/X1VBNzVPXTk2RTNfNiVFMl9SNEMKK00pP1w8JlInXyZRSEBfVVE7OD9dPTcmK184NiFGX1E8NicvXEQpIj9fNVVBOV9VITAzP103NDRfXzdFOTQKK01fVTkyNC9dWj83P184Ji09X1U9OTVfXTY1VUNfMyUlNl9UTS81X10qNCVLXzFUSTZfVFkwNi9dKjMlL18KK00xVEUwX1Q9KTQvXSUxVFtfMURBL19UPSk0L10kMURXXy9EISdfVCEiMj9cWy80M18wVDUsX1QhIzIvXSEKK00xJEdfMkRVMl9TWSExT1xfMDRDXy9UJShfU1kgMV9dIjEkT18vRCElX1NZIDE/XF8wNDtfL0QhJV9TSFoKK00vP1xSLEM3XysyVFBfUjxHKk9cSyoyT18qIjhIX1JISCpPXEMoMi9fKTIkQ19SREUpX1xCJ0IjXytCSEwKK01fUUQ0Ji9cNCNRL18mISw3X1EsLiRPXDgkUT9fXj5bVV9TWFQvT1xGJyJPXydRREFfUUQ0Ji9cNiQxN18KK00lMSA0X1E8MiVPXDolMUdfJiEsN19RNDAlL1w4JFE/XyVRMDNfUTwzJT9cOiUxT18nMTw/X1FMNCdPXEwKK00pUldfKDFUP19RUDcmX1w1JFE7XydBUD9fUVQ7J09cPCZBV18wM10iX1RFJzJPXDolQVtfJ0FIQ19RVDgKK00nL1w4JSE7XychQDpfUVw7Jz9cQCZRX18oQVRBX1IwPyhfXEgoUj9fJjEsO19RQDQnL1w9J1IzXzJUXTEKK01fVFUvNE9dMDQlL180NSU0X1UxNDVfXDckUU9fJjE0PV9SXE0sL11JOjY7XzU1OTdfVSUzND9dMTQkX18KK00nITw9X1IsPCovXDglMU9fNiVBNV9VQTg1P107NiUvXzUlITJfUUw3KC9cOyZCJ182JTk4X1VNOjRfXTsKK002NTNfKTIoQV9SJD0pP1w8JjFfXzdVVUBfVD0lMV9cTSpSV18oQiBCX1JARylPXTI0VFdfPjdZWF9ZJjEKK01DT11POkZTXzVVPTpfVSk0NV9dMTRVO180JSk3X1RZLzVPXSk0JTtfMiRdNV9UMSg0L10lMUUnXzFEQTAKK01fVD0pNC9dJjIkX18xJDktX1QlIzJPXSQxRFdfMDQtKl9UISIyP10gMERHXzA0LSpfVDEmMz9dITBUS18KK00vRCUmX1QpJTJPXSExJEdfMSQ9LF9UJSMyT10hMFRLXy8zXSZfVCEiMj9dIDBEP18vRCElX1NdITFPXF4KK00wJDdfLjNNIF9TVF8xL1xcL0QvXy5DUSFfU1RbL09cVy0zP18sQyBSX1MgTiwvXE0qMk9fKUIoRF9RODIKK00lL1w3JFE3XyUxIDRfUSgtJD9cNyRBO18lMSA0X1E4MSU/X19eP0NfKDEsNF9SRDsoX1w7JSFTXyZRODwKK01fUTwyJU9cPCVRR18oQUg9X1FYNyVfXD0lMUNfJVEoNF9RRDQmL1w2JSE7XyVRNDdfUSwwJU9cNyRRU18KK00mQSw/X1FUNyZfXEEmQUtfJTEsNV9RUDkmL1xaLVM7Xy8jSF1fVDUkMk9dKTI0U18zVF0yX1FUOSg/XEMKK00nIjtfKEFQRF9URSYzL10nMSRLXzEkKSVfU0RXLk9dJDBEN18zRFEvX1UlLzRPXDkkQVNfJlEwPl9SREUKK00rP100NUVPXzU1PTxfVTU3Ny9dPDdGL183JVlDX1E0MSY/XDolQVtfKEIkSF9VRTg3T101NiVXXzYlUT4KK01fVUU7N09cOCUxT18oIVBEX1E8NicvXTE0VSdfNyVJNV9VPTYzX10zNDUvXyZBOD9fUVg6KE9dKDFEQ18KK00vM1hYX1RFKjEvXEkpUktfKEFYRl9SMEMqP106NlVTXzZVRTZfVVk4NU9eIT8nU19AN1ldX1VZPzgvXTAKK001JTtfNSU9PF9VLTU2T10yNSVPXzNFITdfVE0tNS9dJjIkX18wVDUsX1QxKTNfXSgyNSNfMiQ9Ll9UOScKK00zT10qM1U3XzI0STFfVEEnM09dIzE0U18yNE0yX1RBKTQvXSYxVFtfMFQxK19UKSQzL10gMERLXzBUNSwKK01fVDkpM09dJTIkV18xJD0sX1QhIzIvXSQxVFNfMDQtKF9ULSIyL1xfL0QzXzBUKShfVCUjMi9cWS8kJ18KK00uVCElX1QgXzE/XF4wJDdfLkNRIV9TSFwwP1xaLyQnXy5TTF5fU1xdMC9cNSRRO18pMixGX1E8NSYvXFQKKz4sQzdfJVE0OF9SPEUqL1w0JEE3XyRBIDNfUTAyJT9cMyQxM18lMSw2CisgCitlbmQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC90ZXN0cmdiLnV1ZSBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0cmdiLnV1ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTg4ZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rlc3RyZ2IudXVlCkBAIC0wLDAgKzEsOTcxIEBACitiZWdpbiA2NDQgdGVzdC5yZ2IKK00gPUghIDAgIyAnVCA6MCAjICAgICAgICAgL1wgICAgIDNGRUU9Nz1FKCUtUDo2NUc5NlFTPScpQTg3MCAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK00gICAgICAgICAgICAgICAgICAgICAgICAgIE84ICAgLTZAICAjTVQgICEhQCAgIDFXMCAgJFVIICAhMzYKK00gICA2NUAgICVdRCAgIUU5ICAgOlcgICAnJVwgICFXPyAgID84QCAgKC40ICAiKUggICBDWkAgICk2TCAKK00gIjtKICAgSDsgICAqPlwgICJNUiAgIExdMCAgK0dAICAiX1ogICBRPzAgICxQICAgIzIjICAgViFAICAKK00tWEQgICNEKyAgIFpDQCAgLyEgICAjVjMgICBfJUAgIDApRCAgJCg8ICAhI0dQICAxMiggICQ6RSAgISgKK00qICAgMjpMICAkTE4gICEsTDAgIDNDLCAgJF5WICAhMS4wICA0S1AgICUwXyAgITVQQCAgNVQ0ICAlQygKK00gICE6MlAgIDZcWCAgJVUxICAhPlUgICA4JTwgICYnOiAgIUM3MCAgOS4gICAmOUMgICFHWUAgIDo2RCAKK00gJktMICAhTDtQICA7PyggICZdVSAgIVBeICAgPEdMICAnL14gICFVQDAgID1QMCAgJ0InICAhWiJAICAKK00+WFQgICdUMCAgIV5EUCAgQCE4ICAoJjkgICIjJyAgIEEpRCAgKDg8ICAiJ0dQICBCMiggIChKQyAgIiwKK00pICAgQzo8ICAoXEogICIwSzAgIERDICAgKS5TICAiNS1AICBFSzQgIClAVSAgIjlMUCAgRlMoICApUlMKK00gICI+LSAgIEdbLCAgKiROICAiQklQICBJIkAgICo2RSAgIkcpQCAgSiooICAgUTggICAtVlAgICNVWCAKK00gISM/ICAgMjcgICAkXUAgICE1NiAgIDZVUCAgJiVEICAhRzogICA7NzAgICcuICAgIVlAICAgP1hQICAKK00oNjggICIrSCAgIEQ6UCAgKT5IICAiPUogICBIWzAgICpHICAgIk9TICAgTT1AICArT0AgICMhWyAgIFEKK01fQCAgLFgkICAjNCQgICBWQVAgIC4gRCAgI0YsICAgWyNQICAvKSQgICNYNCAgIF9FUCAgMDFIICAkKj0KK00gICEkKCAgIDE6LCAgJDxGICAhKEowICAyQlAgICROTyAgIS0sMCAgM0swICAlIFcgICExTkAgIDRTVCAKK00gJTMgICAhNjBQICA1XDggICVFKSAgITpTICAgNyRcICAlVzIgICE/NTAgIDgtQCAgJik7ICAhQ1dAICAKK005NiQgICY7RCAgIUg5UCAgOj5IICAmTU0gICFMXCAgIDtHLCAgJl9WICAhUT4wICA8T1AgICcxXyAgIVYKK00gQCAgPVg0ICAnRCggICFaQlAgID8gWCAgJ1YxICAhXyUgICBAKTwgICgoOiAgIiNGUCAgQTFIICAoOj0KK00gICIoKCAgIEI6LCAgKExEICAiLEkwICBDQkAgICheSyAgIjErQCAgREskICApMFQgICI1TVAgIEVTOCAKK00gKUJWICAiOi0gICBGWywgIClUVCAgIj5MUCAgSCMwICAqJkwgICJDKiAgIEkqPCAgKjhGICAiR0kgICAKK01KMiQgICBTOSAgIC43ICAgI11cICAhJT4gICAyVlAgICUlPCAgITc2ICAgNzYgICAmLUQgICFJOyAgIDsKK01XQCAgJzVcICAhW0EgICBAOSAgICg+PCAgIi1JICAgRFsgICApRkQgICI/SyAgIEk7QCAgKk8kICAiUVQKK00gICBNXVAgICtXRCAgIyNcICAgUj9QICAtICggICM2JSAgIFciICAgLihIICAjSC0gICBbRCAgIC8xKCAKK00gI1o1ICAhICYgICAwOUwgICQsPiAgISRIMCAgMUIwICAkPkcgICEpKkAgIDJKVCAgJFBQICAhLUxAICAKK00zUzQgICUiWCAgITIuUCAgNFtYICAlNSEgICE2USAgIDYkPCAgJUcqICAhOzMwICA3LSAgICVZMyAgIT8KK01VQCAgODVEICAmKzwgICFEN1AgIDk+KCAgJj1FICAhSFogICA6RkwgICZPTiAgIU08MCAgO08wICAnIVcKK00gICFRXkAgIDxXVCAgJzQgICAhVkBQICA+IDggICdGKSAgIVsjICAgPyhcICAnWDIgICFfRTAgIEAxQCAKK00gKCo7ICAiJCZAICBBOUwgICg8PiAgIihIMCAgQkIwICAoTkMgICItKUAgIENKRCAgKSBMICAiMUtQICAKK01EUyggICkyVSAgIjYuICAgRVs8ICApRFcgICI6TTAgIEcjMCAgKVZVICAiPy0gICBIKzQgICooSyAgIkMKK01KMCAgSTI4ICAqOkcgICJIKFAgIEo6KCAgICIgICAgIEAwICAgKCQgICAhXyAgICA/UCAgICdYICAgIiAKK00gICAgQDAgICAoICAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiAgICAgQDAgICAnXCAKK00gICIgICAgIEAwICAgKCQgICAiISAgICBAMCAgICggICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAKK00gKCAgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICAKK01AMCAgICgkICAgIiEgICAgQCAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEKK00gICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAKK00gICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAKK00gKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgP1AgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICAKK01AMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEKK00gICAgP1AgICAoJCAgICFeICAgIEAwICAgJ1wgICAiISAgICA/QCAgICdcICAgIiEgICAgQDAgICAoJCAKK00gICFfICAgID9QICAgJ1wgICAiICAgICBAMCAgICggICAgIiEgICAgQDAgICAnXCAgICIhICAgIEAwICAKK00gKCQgICAiISAgICBAMCAgICdcICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICAKK01AMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEKK00gICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAKK00gICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAKK00gKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICAKK01AMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICA/UCAgICgkICAgIiEKK00gICAgQDAgICAoJCAgICFfICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAKK00gICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIV8gICAgQDAgICAnXCAgICIhICAgID9QICAKK00gKCQgICAiISAgICBAMCAgICgkICAgIV8gICAgP1AgICAnXCAgICIgICAgIEAwICAgKCAgICAiISAgICAKK01AMCAgICggICAgIiEgICAgQDAgICAoJCAgICIhICAgID9QICAgKCQgICAiISAgICBAMCAgICgkICAgIiEKK00gICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQCAgICAoJCAKK00gICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAKK00gKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICAKK01AMCAgICgkICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEKK00gICAgQDAgICAoJCAgICIhICAgIEAwICAgKCQgICAiISAgICBAMCAgICgkICAgIiEgICAgQDAgICAoJCAKK00gICIhICAgID9QICAgKCQgICAiISAgICBAMCAgICdcICAgIiEgICAgQDAgICAoJCAgICIhICAgIEAwICAKK00gKCQgICAiISAgICA/MCAgICdYICAgIVwgICAgPzAgICAnXCAgICFfICAgID9QICAgJ0QgICAhXCAgICAKK00/UCAgICdcICAgIV8gICAgP1AgICAoJ0peITBDJyFQNiYxVDcmITA4JUE8NichXDsmQTQ4LUNVKjMlKEEKK00pQjEsMkQ0WjE0XTInIVhNNlVRPDhWLDknQkE+NzVZPiZSMDw0NTUvNFFcQjIjQSQqQjhJNyU5Nj8nVUAKK001RVE6NlU9NDNUUS80JFkuNTUlLjMlKTAzRE0sMkRRLjM0USgzJEEoMSRBKDAwLSUgVCYrL0QgNilBQFUKK00mIkA1JFE0ISUgJDYgLldZJFFMNCVBKDcmQTw1JEEwNCUxIDMkUTw6JFFEVy5EMSkzUUQ8JyQ5JDBDPSIKK00zJFwyJSI1NjVVPT43QSQ2KDVBODclTDUnITkzNkU5MSVBSSYvREhHJ0ItOzY1QVw/RV00NVU1NDQkVSgKK00xNEUpMVQ9LzJEPSUyVEUnMSQxIjE0RSgxVC0nMFQoXjBELFwwI10gIFNSKy5TVDMoUTRSJTI0MiQhKCEKK00kMCQzIC5XXygyRDsmUTw8KEFYPSVRRDYlUSw3JkFUQSUxUFovJDUpM1FUQyhERScxI0UkM0UkOSZSRTQKK001NTU8NyE0OihFRTU2JUQ4KCE9MTclPTMmQVkoLzRESShCMTo2VVohQDVZMDUlLTIzRE0mMFQxKDIkOSoKK00yNEEjMjRBJjBUKSAwVDklMSQhJDA0LF8wVCRZLlQgXiBTSisuU1w1KTE8VCVSPDQkQTAhJFAkNSAvT1UKK00vQkxBJiE0NCVBRDclITwzJTFMPydCVD8mUTg/J0FVIjJBWEMnITg6JzFcQShSPDsnIjExNEUtNDVRTD0KK00sJjk3NDRcPSohTTU1NS0yKCIlODRVMEEpMV1AMVJUQilEVVhDRlE6NVU5NzVFOTU0JSUwNCRdLTJEVSoKK00yNEUqMzRJJjJERSwyREkmMjQ9JTFENSAxJC0hL0M8UiwiTEQlITQ0JDE4ISUgJDUgKztOLSFQOSUhJDAKK00kQTQzJCEsNCRRNDclIjw9JVEsPCZRSF8xUTg6JiEwOCZRTD0nUiwzJSFdLzNVITE1ISw1KzZFNjRVIDcKK00nITQjNiwpMCVRSTY2RURCJzFFPTEyTEApVS1eRDZJNzUlLTIzVSEvMiQ5KDI0QSYwVDkjMEQpIzFELSEKK00xNDEnMFQsXzBEKSAwNCBbL1NYXC5TNFArQkRCJEEsMCMxKCEkICQxIC9PWS9COD8mMTg1JVFIOCUxQDcKK00lUUg9JlJQQSchND4nMVEhMjFIPicxQDwnUiBCKSJAOSYhVSszNSExNSE8OStWRTU0NSQ8KFFBODYlTTQKK00mUU04NlVMRSgxUT8xUlRCKiUpWUQ2XTc0RSUwM0RFKDEkNSYxVDkkMDQxITAkISExJCReMEQlJDA0JF0KK00wJCBeL1NYWS8zUFovMzxSLCJURiVBPDUkQTwhJTAkNiAvT1orRExCJjE0NCVRNDUlITw5JiBRVDJBPDMKK00lISw2JUEwNCNBVEInITgxJEE4NSYhTDgmUiQ+KDMkXzMhTD0pRFkxMyRcPClBVTY0RFk2KCFdNjUlKEUKK00oMiFBOEY4PClVRS0zVTEwPVVVNzYlOTc2RTk4NFUhMDNEXTAzND0pMSRRKDI1KSYyJEEnMlQ1JTFENF0KK00tMyBKKlJASihSLEcoIlA4JFE8ISRAJDcgLi9VKTNYPCUxJDAkUSQxJCEsMSRAQVIxITQ4JTEgMyRRJDEKK00iUTQ5JiEwLyQhKDElITwwJFFMOydSXF0yQSw1KFUlMzRFKDgnIT05NTUtNCVRQTc2RURDJlFJOzcmIDYKK00pJUEwNDU5Mj82LTk1VSUvNCRJMDMkRSkxVEEpMUQhIi80NSMxJFQjMDk1IDEkISAwNCBaLEJURyoyOEgKK00oMiRFJ0JINCNRLCEjQCQzIC9PXytUPEEmQTg1JiE4NiUxQDclUFVWMjFEOiYhKDUlMSwzIzFEPScxQDMKK00lITw2JjFQNCVRWD0oMyRfMyE8OSk1JTEzVSg9KFFJOTU1OTgmUUU4NjVARSchTTw3NiQ3KSU9MDVVWTYKK00+RiE3NURRKzJEPS4yRD0nMTQ5JzEjWSAuVC0gMDRIXi9TXF4wQ1heL1NYWixCVEcqUkBKKFI0SShCWDkKK00lIUAhJFAkOCAoN1EnQVA6JVA0NEMhLDYlMTgyJjFcNyQxKDIkUCw0WEE0OigxSDonMUQ2JSEwMyVRTD8KK00nMUw/KFFUOiciJSgzJEkoJkIkPjRVPTQ1UVRAOTVdQzBRWEI6Nk1MKCJJNTZFQEMoVUE4Ojk2IjU1TToKK002NT00NEUxMDJUVS0zJEkqMURBKDI0NSYxRD0kMFQwXyxSSEsqIkBJKVIwRSlCPEcpITw2IDE8ISRQIiUKK01cMTw0JUEsJSQoUC8kQSwyI0EsNSRRKDAjUSAjJDhUMiRBQDYmIUw3JEEgMCNQXDMgUUcyKCIwPiRBMD4KK00yVF0yM1FANyYlOTo2NTQ0JjVdPjhDUDcnNilCODE8QzQlNTInUjE7N0ZKM0AlOTg1NSkwMzRNLTI0MSYKK00xRDUjMFQlIzBUMF4vU10gL1NYXy5DIEgqMjhGKVI0QihSMEUpMiAzJEAkMyAwXCBBP0hAJlFMOCExNiEKK00lICw3QiEsOCchQDUlISQyIFEvQiUhODwmUVA/JlE8NSUxMDMlUVg/JzIsRygxODgoJE0tM0RYPCdBTTYKK002RVE5JiFJQDc2JF0lQU1BOEYkNyhEWTM1UjxFNlVVS0U4MTk2JS0wM0RNKTJUPSIxJDEjMDQkXjAkISEKK00vI1RdL0NUXC8zQFIqQkxIKiJERykiPEgqMkRFJiE8ISYgJDQgKDdSKCFENSVQNDRcMSw2JTE0NCZTRDsKK00lITQyJFEoMCQhLEInUTQzJDEoMSRBJDIlUUw6JTE4SC9TRDonMlEwM1UhLShSNEI2ViU4OTFYQThWSVAKK000IVRBOiZdTScyMUk6JkBDKFNYWidSTTA1RyFANlVRQTYlPTY0NSUuMzRRLjJEMSUyNDUnMTQ0Xy9TJE4KK00rQkhKKVJERSoiNEQpMiBDKTIoViAyLCElMCIlXEFMMiRRLCUkLyQvJEEsMyQhJEokUSAvI1EgLyMwVDAKK00nITwxJDBcMCMwWC0jQSAzJEEkNCokJFokQTBGNDUlMzRSMDwnJVVCNlYsNSYlSUM6NDQ2JyVdRDhBKDsKK004RiE/JlFZIC4hUEU1NU1SODVBOTclLTEzREUqMVQ5JTFUNF8wJDEgMCNYXi5DREsqIlBIKiI0RyhSOEMKK00oQiw+KDIkPixAJD8gMSQgQT9MRiZRPDghMTYhJSAsN1sxNDgtIUg1JSEkMiQwXC0kIVw7JUE0MyUhKDMKK00kQSwxJVFAOSYyVSUvMTg4KjUpLTQ1KEcoIVU7OFVVRyYxSTo4RkElJTFJPzkmKDImViU+ODFcPC9DSD4KK00qJUlAPUYxNjVVSTEzJEklMiQ1JTBUNSIvI1UhLzNYXC8jQForIkROKkJIRyoyNEgpMjhHKEI0RihTPCEKK00pICQ2IClbUyVSUEkmUSw0JFEwNCRRODgmITw5JFE0NCUhLDMkQSgzJEE4PyVBLCMkS0wxJEEkMydBUD8KK00kNDEqKDFIPCxFNTU3RixTKCFdSTomPUknUiFGOiZBOygxWUo6RjBAKFUgUCpCJD4vUlhEKkNBICkiKT8KK00/OTFINlVVNzRQLS5CVFEoMkRBJzBUJFcsQlRMIFJOJSoiREgqQjwjKUA0REAyKCEpQCQwIClbUCUiREcKK00lUFwwI1EgMCNRKC8kQSwxIyEkMCQxIDAjUFwwI1EsOyRRICMjW0wuI1BYMiVRMD0jVDkwKEEkMyslMTAKK002NVRNJiFBQzg2JUIlQTE/ODYlNiZBPUQ5JVg3JkRUUylRSDgwIkw8KSNUXidBXUVAWTVFNjVBMDJALScKK01FRDkjMTQtIjAjWFQrUkhJKiJASSlCPEYpUjBDKFIwJShIJEAgMjAhI0AiPl8hWFErIVA0JTEwNSUxMDcKK00kUTw4JiEsNyUxJDIkQSQxJCBUNSghNDIgUSc0JCEkMCQxQDgoMSUqNTIsMyUyVTMzNTk+LCFQNzdGKUIKK004UUA3N0YhQDUhTDg5NjU/JjFRLSwyPDsmNCRNKCI9IDBCJD85KCo2OVU1NTNESSgxRDUhL0QgXi8zWF4KK00tIlxMKlJISipSQEkqIkRGKTI0RiEyMiEoQCRGIDEoIEVPRDsmUTw4JUFMOCUxNDQlUTQ7JFFIRShSWEEKK00lITAjJFg0MiYmUDYkUCwyUTEkMiQxUTMuIUxTMSQlKyZRUFkuRCk4NjMwQydWUU48RzQ9KSYxSTo2ID8KK00oJjlIOVFQOjYlWTknIVheKiFYRTg2IEApRDw+KiVZUEc3MT43JT0uMlQhIS1TJEwrQCxMQDJMIyo4REgKK00qUkhKKVI8SCoiPCQpOCRIIDIoISpQIjZdQUA5JTEwMiVRMDEkMSAzJDFMNCUiIEArIVwxJDAsMEEwWDQKK006ISgwIFBfKSNAXC4mNExSKCNNMDQlPDUlIzhbMDUtMisxTDg5Rj1MO0EwODZWOUg2QTg5OFZJRiUxLTcKK004NTg1JiNcRSVBXUM3IUBAMTFQRjcnNkE8RUE1M0Q5Iy5TUFIrIkRKKiJASSogLEZCMjRIKVI8RCkiNEYKK00pMDBDQDI4ISggJEkgKVtfKCFYOSYxPDwmMTg2JTFANyghPDcnQVhIJlEkMSQhIDIkUUlQJVEoIyQ8RDAKK00kMSA5M1M8Qy81PTo3QUg4LiNQXjQ1JEwnUT1BOiZVTyVBTT05Rj07JiFJQzomNDYlJTk/NUE4OTAiPDoKK00oRj1BJyIlJydCQT4+SkVXNlUxLjEjVFguMlxJKlJcTSsyTEggUjopKTJARylSMEQpMkBHISI2ISogJEIKK00gMlQgXT8sRiZRTVslMUQ4JVE8Pik0LiVBIilMNkUgWiwiVEknUUA3JiEkMyUhKDIkMSgyJDExICZRTFkKK00wVD00KTMtIi80SSYwQ0RDJ1VZOTUlVD8xI0E7NUVEQydVVTs4IVQ/N1VdQSdBUSMtUVBAOUZYPihHKEAKK00pJTxEKiRVNj5YKSItIjxEKCE8RSoyUFMtU1BeL1QgXy8zUFcsMlRMKkAsSEBSPEcpQCRIIDE8IF0/IEQKK00mMUVXJDE0NCRRLDooNDYrQjFdRzYkWFcrMkhGJyE0NCUgVDAkMFwvI0BcLyNAWFglUi0lNEVFQCgyVSAKK00wJSEsMEM0OyYlQTIzRTg2LiJdOTclODcmJVFDOEE8OTg2KT4lUTkkLSEwOjlGQDUmVlA6KDU0QCkkVTYKK00+WCEgLEIwPiZBJEIpQkRQLSNEWy8jTFouIzxUK0JISSogLEZAUjRFKSAkRiAxNCBdP0BJJzFNXCVBSDkKK00mIUA/KUROMEJRXUI0REhXKlJARCZBNDQmMSwyJFEkMSQhJDEkISReJzI9KjdGUVUqMykkMEU1MTFTSD8KK00lVS0zM1U8OC5TLTs2VUA6JjVNPzghQDo3ViE+JiE9JS1BQD06VlQ5JyZcPShVPEYrJSk7QCg1JC0iMD8KK00mUShCKiJMUixDPFkuQ0RYLUM0UisiQEcqQCxIQFI8RylAJEggMUQgXi88RCYxQjMnQTw3JUE0NiYjQicKK01EPDZeTTs+XTk2TUEtUkRGKSI0QidBRDckMSgyJDIkXSkkTTYwJTU5KEJEVS1EXSkxMzA+J1QxIigyJDYKK00qUjw9NFUwRChFVTY2MVA+OCZdRydCJF8rIVRBL1IgPiczOD4nNkBLKjRdJCdBUSU4KD05MkFJMTNEMSgKK00xREktMiRFJzBEMSAwJChUKzJQSSowLEggMVQhJSAiQF0iKDclWSA6JFEsMiRBLDQvKSY4UStGU00rRUMKK006RiBWKjI4QykiIDslQTAjI0lALSczREY1ViUvOSYwPihTLFs2RT0sLUE4OC9TUDsmUFQjKEgxPDQxQDkKK00gVVJTJjFBQjw2MDcmVCRJJTFEXSZBNDYsIUA6OjFcPTJUOEIoJElFQTU5JyUkUSkvVC0hMTRBIzEkIFsKK00vM0xdL1MkTCpCPEcgUjghJlAkMiAvQ1wpUUQ2REFcOCYhPDQlMUUkRVlHIU0qXlZQNjVHNzMsRCgyIEMKK00oQVQ4JUEgMyRRKEIvUlE+OlVVXD9CVEgtU1lFODU8XCZBPFwvMVg8I1I4TSk1STMmUUU5NVVIOSY1WU8KK005IUA8L1JEOSczXD0mMTxRJlFRSihCITAzIkhIM1ZCKTYkRDUyNDhcMCNZIjE0ISEvU0hcLjNMXStSTEwKK00qMkQjKiAkPSAxOCBdPyBaKzJKOyVRPDgmQTQ+JjFGL0NNSzVUXEsgNVQpXzdFIF8sIkxVLFJMRiYhKDAKK00lQURcMiU1QzVEWS0zVVxQLzUpLDE0MEcmVSg8JTFQPicyJEozJExHKDZVTDlCIEYzI1RTJ1FMXSRBVD8KK00nNFA7JlRQOylGOFEoVkFAKUQ8Qik0QF0xUVlJNTUlLjQkVSYxVShaLTMoUCwiXE4qQCxLQFJQSipQJDwKK00gMTwgUE8oWipSPjgkUSw0JiEsPSVBTjVFLUczVCxCXzVEKiE3VS0iLFJYWy1CVEMmMSwsJCFFIzRWLVIKK005NVE7M0U8SzBFTTk0JDg/JiU0PSUxODcmMlhYNFQ0OyYwLUdMIUg7MSNITCVBNSEjUSQ2JjQ8NSVEWDgKK00oJjBIJlY5OigkMD8oREhfMSE1RDNUTSgyVEEhMERQVCtSUEoqQkRIKVAsSkBSREcqICQ5IDE0IF0/OF8KK00rMj46JiFAOSchNDomIV46Rj07L1QsVys4RD1fOEUtIixSWFgtIkxDJyE4MSUyISU1RlYgPFZZTzc1TEgKK00xNj1GNlRIQyZFND4mQUQ4J1RBKjREOEAlVVlCOiFUOzBDQE0mIThcIzEwOCQ0NDglJFA6KFY4TCdWQT0KK00oVDhBKSUhJTFBNUI0JFEpMjQ4XzAkVFUsIlRLKlJISSlQLElAUkxJKkAkOyAxRCBeXyhcKDhZMCVRQDYKK00nUUBBJUFWK0U8VypRPDJfRFEkOyYxLDQmMSRAK1NUXytSTD8kMUxbLUQxPi1SOFUyUVxIMVU9KzQ1NTEKK00yRiwzJSFUOSdSUEY2JlBBKUVdR0FRPDxAV1lGJ1FFJyRBWD4pJUw2KVVMOCtGPFkoVj1EJUVAPykmOEEKK00nVTQ+N1dVODNUVTIyND0pMTQxJTAkNSQwJCkhMEQkXy1AJEMgMUAgXl80XidYSS0lITQzJlEwQCYhXjEKK01GXF8rUjxLJ0RAXDolUSw0JjEkRi00LSUsQlhAI1FNIjA1KUsxIy0iMlFERTM2KTg3RVEtMlZAMSRBPDMKK00nQ1RYN1ZINydVTUVCISQzQCglQyVBLSwkUTQ3KCU4MChFSDIpVjBQJlY1PiQlNDwoNiw7JURIPDdXVTgKK00zJEkvMUQpJDAjXSAuVCBfLzNcXi9TWFwsUCRAIDE4IF5fLFwoOF0vJUE8NShRRD0lQU4wSE03NlU9Ly0KK01HQTA5JlFAOSdBOEUsRCEiLEJYQSQyISQxJVFaNFQpMzZBWEM0RlVFOlY1MjNGSDUlQUg2KkVBLTomWD4KK00oJS1BQjEwN0BHXUMmITEuJUFEOCYlMDMoJUQzKiYwVCdWPUEkVTw+KFY0PCVEPEA5KCk9M0RJLzFEISIKK00vQ1ReLjNYXS8zXF4vU1hcLFAkQCAxSCBdPzxHJiFQUCZRRDcpIUw5KDIiLUQsRylRXDJdRiE4PCVRSDgKK00mQTQzJ1FIQSYjVEQlMUEgMiUlPC9CVFw0UTg4OSUlMzJFTSs4JSQwJSFAPCwyUD0/N1xEKyZKIEJRSDwKK009NkFBKCFQWzFRVDwpRCA8JlRQNyk1PF0oViU7JUVEPygkID0lUUQ4JCJBKDRHMTw2JSkvM0RJJzBUIFsKK00tMCxTQFMgUCxQJFAgMiAgXT9ISCVBRE0mITg0JzE4OClBXi5GLFsrUlxLJUVRKDkkUUA2JiEsMidBVEcKK00oJCxHJVFJJzRVXUYyI0EnNFEoOjslTUA2RjkwOVVALiQhKDotQ1hQQUdcPSlGQV9CQTA2PVclRCYxOSAKK00yMTQ3KENMNiVERDAnJShRJlVdNSQlODwnM0g3JDEsNCMiMSQ0Jyk6NURVKjI0NSIvQ0xWLCA0TUAzICEKK00rMCQ+IC8zXCpRQDsrMUA2JSFYNCUyRD5DWVszVF03M1JaLDgmMUA8JkFQNyQxVDspIVEgKTE0PjI1OUkKK00+JUElNEYoOiYnKUU7NklTNTZFOiRRNDUnVDU7Mkk6JikiRUI/KEQ3JldNTzhBSDcxNFw7JTFIWSYxMScKK00jUVEwLUFdQTYhLTgnQVxbJiEwNiYxKEoyRSlUNyVBKzFUOSIvU0xYLFAwTkBSTEsrQCRLIDIgIF5fNEoKK00nJ141JkIhRzxBSEgkIkorQyw7MFMsWlxHMVg+JiE8NSYhKDMoMUg+KVNMTCsiRFYxVSEmLUJdKDMxKDMKK004VUFBNyZJNjUmODklQSw5LjJURT04NEs5NTk0M0BQRC9UVEUoUVUgM0FQPC0lVD4mVEQ7KiRMVChEWTIKK00lVUQ/JVEgOCUxSDwlUVxBJzIkQDRXMTs0VSEtMjRBKTIkRSgyJDEjMCAkXCAxNCBeXzBHJjdaNCVRVUUKK007ITRHJSJCK0UsVzFTLSMgRkE8OCRBODQlUSQtJlFEQCs0JFAsIkxcNDVZMDAjSTM0QSAwOjYpTjpXPTwKK003JlA2JCEgOTA0LFc/ODxEN1UxMzMwOEEwNThIJzE9JjQhODYsJUA4JUQ4Nic0OEsnJFEsJDU4PCUgUDYKK00kUUg2I1E8OSZBWD00JyU5NDRZKDEkLSQwNCkhMDNdIS9AJFogMSwgXl9cTyY3TjMlUVVJOzEoRiciUjAKK01GLFs0VD07KklBWDslMTQzJUEgLichQD4qI1BLKlJdITVWQUI0JDU9N1E0MDtGUVs+ODFDOCckPiUxKEAKK001JiU0RChcSzglITAzIDxDMTUoRidBQS02IUw3KiU4OyUkMDQnNDBNJ1RZLyUlQD4lQSQ6JiIkOyRRTD0KK00nIiA/NEZdNTM0SSMvU1hfMCQtIjBDVF0uQCRWIDE0IF5fNFUqNkowJzJSND5RTD8nMV4wQ0w3L1NcOycKK01FITw7JTE8OCZBLDMmUVA8KUNQTyoiVEQvNEVKLiMkWzVBNE0vNUFDOVchPjVWQFQnUUxCJ0JQPkpFXE8KK006NlVBNyNdIy0lNDYkIiRUQiIsRi5WNDkoJFBDKCI8Qic0RSslVTBCJFE0NyRRSDwmIURBJzE8PidCNEUKK00xVzVCNTUlKjIkNSMwQzhWLjAkVCAxSCBeXyhPKFZKMiYyQjU/UTw5JlFaMEU8Sy9TXEssRSE0OSRRNDYKK00mISQxJjFIOisjWE8rIzBKMTUtUzAzTSU4UURLMSY1UDxHTUg4RyBSJjFESCokKE9LViRNOVZRPzZDVSEKK00sRSwzIzFYWUIhTEAtRiAzJlRMPSYiMD8mRDkoJDRYPCMxJDMjUTg2JEEsOyVRJDgmIixDMTctPzQkUSUKK00wVCBeLzMsUy1AJFEgMTwgXl9IVCkmXjYnQlZAQlFUOicxVjVHTF82Vi0zOEcxSD0lMTw4JkEsMyZRUDwKK00pU0RKKUM0TzJVTV8zNDUtPCIkTzNXKV0/ODlQOTcoVichTE0uRikoT0ZEUThWJTk1IzxbKyRcMSMyIFwKK01DMiRDLDVYNiY0SEAnIjhBJyRBKiUlJD8kITg4JSFMOSUxOD4mQTA7JlI0RTFXNT8zREkjMDNYXC5TJFEKK00tICRPIDFEIF5fLSgsIUlFKFI0PSYxOD8mQlooQ0w3K1NMWyVFUiQ7JUE8OSZBLDImQVA6KUNITylSWEMKK00tI0RdJEFQOSkjQS02NSU7OCZBRzYmIFAoMihCJiFINVBYSDg3Jj08ODZNPy9UXDYkQTxPMVIoOy9GLTwKK00tVSg1KSFANychPEEmIjw3KDFEOSUxLDomMUw4JjE8OSchQEQmMjxXNFY1KjNURSYwVD0kMCAlIyAzUCAKK01eXyEiKkFJRydSKEAnQSw5JVJSKEU8SytTTSsqRVFcOSUhNDcmISQwJiFIOCsjUE8qUyRGLjNcXyRBUDkKK00qQ1EtN1VJRjs3PVE4VkxTJ0IgRCdCTEFRSFA6N1ZRQDk2XUMwVFwzI1EwVDFRSDUuNVk2LEUkLychNDQKK00mMTA+JEIkMSZRNDUkMFw0JFE0MiRRJDMlQSA8JDFcVjU2PSwzJDkjMCQxIS8wJSAgM0QgXl9BJypRXU8KK00pIiBAKDE0OidSWi1HTF8yVV1TNkgiMD0lQTw5JkEsMiZBUDopUzxKKTJcSC8kMScmUiw+LFQxMjomOVEKK00+SDVZOUZQVSgiKEgrNDhYVSkwPjc2JTo3VkU9LzRIMSNROFczIiA4LSVROSwlIDIoITw2JlE4QCUyMDQKK00nQUg6JUEwNyVBQDUlQTA2JjEwQCUyLFU0VjUqMkQxIS9EKF8uUCReIDNEIEtPOEgpSEVNKjFGVUwxTD0KK00lUTYtQ0wjL1UsWyFFUVA1JTE4OSchLDMmQUw7KFNAUyoiXEQwI001MzQgUStCNCQmPEQ/OyVROjgzUDwKK00mMlw7KVFWXD0xREwuRFBLOFdcM04iIDknMiZYOEFYXC9SKE8wQUhLJSBUUyVRLEImUTg0JVFANSUhND0KK00lQTQ8JSFUNiZBTDkmQiBNK0UtKzI0QScxJC0mIDQ8ITEwI1tcUihAQjZcRSVLPlUlUTw1JFhWNVE8XzQKK01UTDo3JkEsMyUhPDokMSQ4JjFESS5DLEwtMkUmMFVFMTEzOEwoQTg2JVFMRT1FTTw5Q1Q6JVMoPCxSNl0KK00+MURKLkRMSjhHWDJNMVQ2JkI6WDZBQFcuQVBKMDEwQyQwSFAlISA8JTEgLiRRMDEkIFw3JCBcNiNBPDAKK00kQSwxJEFUSipVISoyJD0mMDQhIyA0MCEwQCNbXlI8QUNHNEomK1ZdJyFAOSU5Kj5STTs9Vy0qQCdRPDUKK00lQUQ8JFEsOiZRTEQtMlhGLSJRKzI2LTkyQ0RQKSFAOCZRXExAJj1COjQgPiYzMEcyQ0cqQFIgTCxUQEkKK004N1QxTFFMNiciRl04IUxSLiFcSDAhPEckUFBSJUEoPyYhLDEmIUQ2JTEoOiRRKDkkMUgzJUE8NSVBXEwKK00rNSkpMTQxIy9TWSEgNCghMCAjW15SND0mUzA/KDFcNCdBSDUwSC4tTzxfNFM8JjcmMTA0JCE0PSRRPDkKK00sIUhGLTNARiwhUUc1JyU8NyYhQzc1TTMzJSEzNzYkXyZCUDklMig8J1E5NDwyIEorIixJJyZURUgxUD0KK00nQUcgOzI4PydBND0rMVhEJSE8ViNBPFQvIVg/JUFENSUhRDolUUQ0JSFEOCYxUDomMTQ3LyJYTD0lKS4KK00yREUoIDREITJQI1teIVw2JyM4OycxXDcmQTQ0MDg6NVBMXzRUPDY3JVEoMiNBLDskMTQ3K0FASi1TQEoKK00uIjFMNyc1QzomSUo5Rjk8M0RZODklWFomQkg1JFIsOikxRTI8UVREKkIgRiVGPD9HQUQ6JlFbITlSIDoKK00mMFw3KyFMPCQxMFMiUTBOLSE4NyRBNDEkISw0JDEsLiNBLDIkUUQ3JVBULy0iQEk9RTEtMiQ5JSA0OCEKK00yICNbX1IoNSdTUEAoUlhHKEEsMTAoQjtRXTs9Vl0mPichODQkITQ9JFE8OSwhSEUsQyxELyJBTzhHXUwKK007NyFVPEctSjRFKT07NkklJ1JYOyVSMD8tIj03PlI0RSlCIEgmNkBARyE8OicyLyQ6Iiw3JVEoOCpRVEAKK00kUThVIzE4US4hSDslUUg2JTE4NyUhODEkMTg1JUFMOSYxJDMuIkxHPEUpKjEkMSMgRDggWD8sSSo0IFkKK00sUUouRCJEPiciNidDK1csUjxbIUZSLDQlQTA3JUE0NSYiLDspQ1BSKVNATTgmSTMzRVUsL0QhLzpGOU8KK008Vl0+RTRdJCcxSEg0UylOTTI0QDAkTTMyVFpXKCssPihRUDxMVTw8JTEsMSVSIDYlQTQ0JEEwMy5TPEIKK00nUTQjJig0MCgxQDEmUCw1QzFEOCVRNDwlVSg7PCYlWjRFKCMyUCUoIC4nUikyKF4uUlw0QlkoRSYxSEYKK01DSTciU0xLL1BJVEQkQSgxJTEwMyRROEEmMkBeLSJEWyhUOS8uQ0kvLyJQUjEmKUc5V0VaOSk9LTFRTDgKK00pNEhNOEpARSgjXS01RFEtTSFOTyciKDonWzUzJTBcMCNBMD0kUSwyJDBcMSQjLE4mMTgvIFE2JSMxWDUKK00jQUAlJEhUNCUhNC4zUVFPOSghMzQkRSggNEAhMTAjQV9SSEAwRCxVJVkuOipBPDwqOF41US07NVZMVkEKK00pUTg3JFE8NiUxNDgoUUxELjJcRC5RTFYwUzRQLzJQRypTST46JlogQScuPzNURD8nIixeJUReLiciNFwKK00yJTktMysoOE0hWD8nQiZZNiE4MiRBIDYnUTQ1JSEsMSRRKFcsQVQ6JEAsN0EwXEAlUSA6IFEyLyRRLDQKK00kUTAwNDFdTjlINTQzJDUoIDRIITFQI0pbIzBLMTJMVCc1MTkpQihGLEg+L088XytTS0ZEMlEsNSUhPDYKK00lMTQ2J0FIRC5TLEYtUkRSLVMpSj1HViFHSFIsRChVPkBGKFAwNDVFOUg5UVEuIlJBJ00hKCJdJj5MKEMKK01PQVA+JyEqRkFBNDQlMTQxJTEwNCRBLDYlITRBJVE0NCRBTDomMSw+JTFMNSUwMDhDMUg+JjFAUiZJUiMKK001VVU+NyRAITNQJTMgKTtQLSJJJyszIDc0NUxCJzIwU0NJQyJUPFMvTko5LCBRJzElMTAzJFEwPCYiOF0KK00tMkBZJ1E8MyRTUFkyVSFMNkVNSDlFMi06UykgMiZZTkBVVk9RWiokPlNcQyxUQVpQIV5bJkFUOiYqRiAKK00jUSQyJEBYMiQxJC8kISwxJEFMLyMwUC8mITw2JCFMMiYgXC8gUSouJFE0OSRBKFAnOVIkNyVVPDZEOCEKK00zMCUwIC9PXy5SRS0tMzg6NjYsRyZSOFZDWUMkVj0/OlE6SS8lMTgzJVE4NSUxOD4mQihYLCIsVSVQTCwKK00iIkw+KjI8XisjKSUzRFI3PVNAXzImSUo9M01dSCdBVUEkLDsrNC1VTiE2XSchSD4lOz47JSEkNCUhIDQKK00kUSwxJEE0MyUhWDMkMSAxJkFEOCRBVDQmQSgyJTE0MyQxLDckMSxSJ1omLzomOUA3REghNDAlMiAtL1QKK00qMjQ9KSRIRigyIDwnUVFSPlheVVNNKy1OOjEjJSE4OCZBPDglUTw7JzIkVC1CIFEnUig/KiU1NTcnPi0KK01ARl1ZO1hGITVTXFIqVUlaOzkuVlZbRksrIzk4PzZITUlGQyMkUTA8JkpFXCUxPDUlMCw0STEsMyUhLDQKK00mVEg2JDEsMygyLEQmJDQ1JDFANidCTFQuNSFEJlFUQDA6Skg6RjYiOVY0ITVQJSIgLS9UKVIgPilEOEAKK00nQig4JkFJU0BJQlpULS8uTko5JCRBKDUmITQ2JTE0OSZSLFYuIihWKEFQMyQzPFEtRTFKNkQ1NTIoLjAKK004JCRRK1YtXzlHUj5QOjZGKyM1OkAmTExJJi8gJDEsOig6XVwkMTAyJEAsMUkxIDAkMSAxJiQ8MyNBIDAKK00nQiBBJTQoMiNBIC4lQixOLFRBOiNBJDgvOkJKO1Y2IjlWNCE1UCReIC0vXyshWEErRFBDKUJIPSYhUVYKK01AWUJcVi1bOVE6SSclQTw3JkE8OCVRPDsnMVxRLFFUWCkhXDYlIyA/KCJcWysxWEwrR1I+OyQ0TipFXiEKK003NUVPR1guQSxTMTU/RlBJSCVbIiRRID4oW0IrJVE4NCUgLDNJMSgyJFEoMyZERDUkISgyKCIoQyVUMDQKK00kITAyJkI8US4kWUEkMTA8MEpWUj5WUis8JlAhNyAlIyAtL1orM0xaKCU0QURaSF0lMUg6PVhOVVNcXysKK01NSjxAJiEwNCYxPDglUTw7J1IkVC5RXFopQVg8KyItMkVbUkBAVjVROSdFVjZENSYsSEFWKUcnIlY8RlkKK00tI1lHUVhIOkQ2QkclQzBBQDVEOiYxQD4lQCwzSTEoMiRRLC4nJTUtJTEsMCQxTDgkQEQzJjRJJjExQFAKK00uSC0xOyZNWztaIjUwRTcrNDQsISUwJDogLS9ZKUJcVChFJDtEOlBZJCFAOz9JLlpUPSMsTVpEQSVBIDEKK00lUTQ2JTE0OScyLFcvMiRYKDFUNiZCKThDWyY4PiU9RTFXTiQ5ND0lLUhdVyY1SlBROz5ZLTNZSVI4SDgKK01DRi5EJFMsQkFFXD0lUTA7JFAsMEkwXC8kISArJjRdJyRBIC0jQUA1I1A4MCU0KF0uQFxJLTdZJzc1SU4KK006KVo3MVUvKjRULCElMCQ2IC0vXylSSFUqJTw+RUswXiNBSD5AKTZcVV1PN1BKVEQmQTQzJjE8OCVRPDsKK00nUVxPLiFQVCdRSDElUT0jPjk5XDdELSgsR0Y2PCRNIiw4WVonJCYhRjhSSi4jRURTOFw8Q0YmRiRTIEUKK01ERjA7JlFEPSUwLDJJMSQxJEEoLSZVISglISgvJCFINyQwQDImRDhfLkEkUjAoRTg6NjFXO1ouPTJFNzYKK002VEghJkAkPCAvT1MxRkg1KDZEOiUxUDQnIUIqPEheRlM8UydIWjg1JjFENCYhKDUmITw2LVIoVC1RTFAKK00qIVBCLlIlNkc6Oj07VV1MPEdNUzZEPEYoSFVRMTQuWlleMyIxUkVCUUkwO09FJl4nRjAyJlIkNiUxREMKK00nQSwyJFE8NCQxJC4nVEw/JFEwMyYyNDgmITw2JVFUNiRAWDIlUS1HPERFNy9YJTEvQzMjLDRYIScgJDoKK00gL09YLzVAMikmMDQlIVQwJUE6Kj4pPktULSMrSipENiVRNDElMFwyJEEwNC4iLFguMVRUKEFcOiZRWTkKK01GKi45OzYpTzBHVVU5NERFKTkxTCtCTkVSXFMgMVI9RFIpMDlOVFJXJlYsNCcyJDQjUThAJlEgLyQhMDEKK00jUFwrJjNMMiNRLDAlQig1JUE0NCUxPC8jIDwuJkFNSThCWF0tSCkxLlJfIixUVCEmICQ0IC9PXzA1LDQKK00pJlw3JFJANiVRSi8/WVZNVE1DN0s6TDkmUUgzJVEkNCUxODYuMjBJLTFETykxVDQlUVE7QlhGJTk1QTcKK00pN0IrO1RcRChZVT0nUSFdRlomXDQiRUBTSUQ7TlRKWCY2IDgoMjg5JSFAQicxKDEkQTgzJDEkLScjLDIKK00lMSgwJiIwNyYhPDgmQVAtIVBAMychXV4/NEEzMEhVNi4yVy4rRFAhJzAkNyAvT1EuQjBFKic8PUMqOU4KK00mIUAyOkhWUU5LRj1FOTxBJ0FMNCZRMDgmQUBAJVFUVS4xSFIpQVxVMlIkWUNKWjhBNkVPPDdRXThEIEsKK00oSExHPEpCT0xJTlo2IlA2UilMPkxURlMnN0A4KSJMNyRBPDsmISw2JSEkMiQxJDAnQ1BFJkIwMyZCVD4KK00lUTUrKUE4NCQiKDwoIkA2OzJKNT8zUD0vQyMjLFREISdQJDsgLT9ULSE8QSpXKDdCWj1KJEE4MjwpNlYKK01PO1pBRklIQichPDEmISQ1JSE0PiYhWFkuUVBWKEI4SSlBTFtCOlI2QUZVVDA3WV87NChKKTkgQzdYVjMKK01EN1ZQNTJIOFJJTDxMJDJQJkc0MihCRDQjQTA4JTEgMyQwWCMjWiQtJiI4NiYiIDAlUkg7JTEtKSkhKDIKK00kMVw2J0JEMzZBKiA9Q1A+MCMrJC00QCEmUCQ4IClPXy4xPEYqN1Q6QkspUCRRSDc9WU5YTzwmSUcpUEUKK00oIVAzJkEsIyVbREAmMVxKLVFATilSPEQnITBfQSk+IT4mNT0pJ0Y1PVRASShZXDktRU1FNzUiSjdSUDQKK01UKiA+TCQqUiZHLDUnQjQ0JFE4OiVRKDUkUSAjJDokLyZRXDQnMjQyJjJQPSVRNS0qMUg2JEIkMSYiUD8KK005IU4sQDQ0QS8jIy8sJDwhKCAkOiAtO1IoUjw8L0ZYMylSREUmMUU2NkkqPkA5Pis8VzQzJUE4MiVRNDgKK00mITxDJjFIUi5BSFgoMjhcNCIsPDZWPilCJiVLPldKITgmWEwrWC1ALEwjLU1cIlw4UjBQUVlITEozJksKK00lVkhRMTJEOSUhMDckUTA7JiAwMkgxJD8wMVwrKTFMOikyJD0oRkBDJ1IsPSwjSSUnMj1KI0lcSychOF8KK00xOzUqLCAkOCAxRCBeXyxAKDFRITowVEYqQiQzJVU5QEZKLiVHOSFZPiEwNCRAXDQkQTQyJSIkOiZTOFwKK00nI0xCLCJQRyZRWTs5WEouOkchKz8oLUs8IkxSQ0YoR0orJjZISy1CKEMrKUZCSkYrKlQ4OFIwWShBLDEKK00kMTAwJDFANSNQXDAkIFg5KFBUKyhRNDcoQVg7KCY4QSNRQDgpMjhdKEJdSyM6KFAnIUEjMktFLCtQJDQKK00gMTggXl9cSCkiJF89ISBFLTI8NCZVTUdIKjYgRykpVj4hPDglUSQ2JSE8NSVCLDsnIjxYJiJcRS1COD4KK00lMik0NScxWzglRE49WUVVPUJIUENWSCw8OC1CPjstTikiWy9HUlJGKkskOzhCPFwoMTAxJFE4MiRRSDcKK00kMSQyJEEgPCcgSDAqIUA5KSIgPShGSEYkUUA1JkFYWSlTNUwjKjBVKDE4XjMsNScrQCQ5IDFAIF5eWEIKK00lMUg6RDJMSilSPDgoR0UwRFhVTkQnPU47MSA4JiE8OSYxSDolUiA1JjMgVyYkIDwkNVk8KUFMU0c4TVUKK003NyFaP0gpLT9CJE9ASFVCSjwjSERbVVcoM18nSDMkUitVODkyITRCKEFQNCYhNDIlUiA3JEEoMyRBLDgKK00wUyAyJTJYSixSXFEpQVBfL0Y8TDM3ND0lNEhZJTlcTCZRNSYyKVg7JkAkSSAzICBFTlQ/JDFMPUNCNEkKK00qMjQyKCdFNkZJKVVFR1VVPFEkIyUrXDYlQTw3JSFYNiZDLFkmQ1g/JVRYTSZRWFRGWEVXOSc1Lz8oPToKK01AQiBRQ0k1OEUqQy0/Kz1WKCNbKUgyXE8qNUA6MEBANiZBODMlMSgvJSFUNCNQXCMkKiAyKFE4LyQyNEQKK00rMlBPKSFIXSk1JD4sVTgsJjVQXiRZVEQlMT0sM1ooPSYwJEYgMlggVi9ERyVBWD1GQkBILDJINShHWTsKK01IWTFORDdJTjxBMDkmMTg4JiFEOSVCIDcmUjxUJUNAQSdEOEQmQiBGQUctQTZVWE4+KVFHQkFcT0FaRTAKK005J0Y7NltSIidTTy9KIyRPKkVQPTBQRD0oIUQwJTEwMSVBXDYkMSQjJEogNScxJDElUkRHLCJYUSlBWSIKK00oREg0KFRIKyg2JSMmKihKJkE1KTQqUDkmICRIIDMgIF5fREclUVlURiE0T0xZRDknQSkhRUdZRkBWSUUKK005MTw9JlFAOydBUDgmQUg4JjJcWyYzUD0nUyFMKSFYVElaMVkzVl1cQlcpNkMyLD1BSSpXTy1DQjIoLjMKK00oNSMiSjNIXDNULD5AIUg8J1E4NyYxRD0wIig8KEEkNiRRKDkvNThWKDY9JytSJV4zQUBGKSMlIEBaIFYKK00lQjg9JUo0TihRMT0mIlA3JUAkSyAxQCBeX0hDJDFVV0VRLE1NOTwzJlEpKUc4LU9DNzFPOzE0NyYhODkKK00nIUg2JiFANiYiXFsmMyBGJUJEViUhXE1JKVVUNEZJNT44IUBEQig7QklWSkhMMy0uWC44J0RLIElDQFsKK00zRCw9P0FEOSchLDQlQTg6LzFcOSdQWC4jUFwwKEJIPCYkUF4pUUohM1E4QiRCLFU7OCREJUJUPyVKPEgKK00mUSlDJlMkOCRQJE0gMTggXl9cSyRBUVlJQTRJTllQOCcxPSVKKDVFQTZRRzoxPDomQUA7J0FQOCZBSDgKK00lUkBSJSM0QighVEElQihBQkgpPTFFJE09KSVTR0IkP0RKPjk9SUJJKkhCPSdETyVLQ0hYMlNYOkBBQDkKK00nISw0JUE4Oi8xXDknUFg0JSEkMiYiKDYmJTEgKlFOIzRBSEcjMVBSOVc4PyczQEMnOlRLJ1ExQiZTLDsKK00lMCRJIDFAIF5fPF8pITxCSUFMPiQxLD0nKFUhRCdBPjk1XUA4IUA8JVE4OicxODUkQUQ3JjJUXSYzUD4KK00mMUVBKVFcPTJKMVw1RkFXPzZVTkdCKD9BOTZPOj4zPClXXVspJiJdTlMkXy81PEhDUTA3JzEsOyYiJEEKK00xQlRDKzE0NiRQXDovJTEqM0dKJyUxWCwzITw/MiU5PEpHODckQiQ6JSokNyVQXT1GI0g9JyAkSCAxQCAKK01eX0BbJ0E4RUkxRDskUSQ3JjhVKUVXVUU7Nj1IOiE4NiUhMDgmUTAzJCE8NSYiVF0mMyBIJCEoSSVSJDoKK00yWiVYNUZFODxIIVdIIVw9QkomQjNcXyonODYgKEVOW04zJSAvNUBHQyEkNCZBIDglMVg+MFJIQCpBKC4KK00jUFAxKDI0Ry01MV4kISgtMzE0OzBFMTxIRlw0JEI0OiUqLDEjUFVDRlNUOyYwJE4gMTggXl9dIydRNEUKK01MMUw5JjE4PCZZKSVIR108OUYhQTkhQDklQTg6JzE4NSRBRDclUjhUJSMsQSZARDsmUjw4LSg1RDM1KFMKK008OT4lSiIkP0M6QjEpOy5VJFhKIydFRl9PMlBULSRQREUhRDYmQSA4JTFYPjBSSEAqQSg0JSBYMyUxSDwKK00sRiogIzE0MDQhREAwVTlDSUZYNiYzJD8mWkQ0JFBdQkZTVD0mUCRNIDFIIEY/PSgqQiBQTUFER0o7PDwKK00kQUQ7Q1dEWC5SXFc2QUA3JTEsIyU9XDMlIUQ5JiJAWiVTQEEoQlVFMUMoXixKMkk9Ni1ZRCdaIUpBUD4KK01CKFFGQi42QzdIJjQrU0pQUDZFRz5YRjFIUTQ2JzEsOiQxREAoMig8JyEoNSRBJDstRSEqLVdSJSZCPDsKK000MjhPKTFMSj1TNTklISg0JEhUOCYhPThGUyw/JzAlIyA4LCBGP0EkKSFcVE1BPERKWzQ2I1FEQ0VHWFwKK00vUyxbOCE4MSRBJCMkWCgxJEAsN1ZCQFolUlRLJjI0TS0zQSEuKjZFPTY1OT8oIiFJQTg8Q0lBOTs8Xi4KK001KDI6KzM2Tk9WRUg+WEYvSCEsMyZBIDcjQTg9J0FcOSYwXC0jQFgyJ0IsRSY0XVkmIUg5NEIwSyhRQEUKK008Izk2I0EgMiRIXDIkITU+R0MoPCZQJSogODAgRj9dLCkxWE9PUURETFtIOyQxWD9IOCBULjJUVTcxQDQKK00lISwjJT1cMyUhRDklQiRRJEJUQyhRXD8tQzxfLFlGOTtEXFM9KEImSyFMPkM5VSgxWl1UMSgyOSlTIlAKK01QVjE8PSgyMUohQDUmQSA3I0E4PSdBXDkmMFwzJFEgNCUxRDslJjVeJCFIPTUyQFApUihSPjQlQCQxMDYKK00mOTQ1JSE9PUdDJDwnMCUrIDg8IEdPKF4oUUlXTTFINidRQDkoSDhEQzdQVCpRTE80MUA3JTE0NCRRMDUKK00lICw5VkI8VSgjXDomMj1OK1IoSilDOVEzVi4mPFdJV01CLD5BSTFLQFghODBCRj5RWFslTlVbIzBMTTwKK01EQURIJyE4OiRSJEYqUVA+JiEsNCRBLEEsJE0hLldFXS1CTVkwUThMMiQwX0FFMj0mUUAzJVhcLiYhOUAKK005QzxBJSAlKiA7RCBeXzRaJyFFWk0xQDMnUTgzJyg4S0UoJFcrMVxTNjE4MSRBLDIkMSgzJEE8NyYiPFUKK00oIzw+JTFcVidSSFArMzlQM1UlMC5UXUhMQVQ8Q1ldQDsmTSItQk5BUUhHJE8lVyMwPEU5Q1E8RSYxLDcKK00kIVhDKiFEOyUxIC4jQSA6JyIkPSckXVAtMiFaMSEwSDBDTFQ/JS45JEE0MSVZJCskQT1GOjM4PCRAJTIKK00gO0ggXl9dICZRQVhPIUg1KUFINic4TEpHOCxPKiFETTRRQDQlITQ0JFEwNSUhRDklUihMJlM0NicxREQKK00mMjhNLUNNTTFDIDsmU0E8TkIoQEM6KTMyVDxBKDJGP1BYMyNPVUpeL0xVQUVRREUmMSw3JCFYQyohRDsKK00lMSAzJFEoOyUxSDYmVjlTKkFdXTFRQE0xVDUjQSYmQSUhLDMnKTwtJTFBRTpTNDolICU0IDtUIEYvITMKK00xQkw+SzE8OTU1NDUmUVRCQjgoTClCLE4zMUg3JSAsNyBRMz0lQUQ3KFMoMixCIDMrJjRTJiI0SyczUiQKK005KDYrRUdWUikhUiFFOS5LTEY1KkBKMzhGKk5cTi0+VFBGWiErMVQ/JTFELzclNEYoMjQ+JSEwMyRBPF4KK000NChcLkcpPjpIWSslQyBDLENBXzJaIDkmMUA2RzE8NiYnQjEtQjA3IDQsIU8gIjhdRFxaKTIiTiUxNTYKK002MTw8JyJGNEIiUEYpQyk2JjEkMSBRM0AkMSgyJSE8NShDLDItMSQ4KDMgQSdSSFooRD4oMEU9IDNGPk4KK00nUUYwRyhaREhVQSZBSjc1RipKX049LlZQRloiK0FIPCRBOC42VTBFJ0IoOyQxIC8jUTBGKFFUQCdGOT4KK007OS0tJEJAPSpTJVkyWiA3JUEoNEdRLDMmOCY2LiIoOCA0VCFPMCI4X1U0VSoiMlEmMUlBOFFMPSpCQjUKK01BUjQ/J0JJKiYhODMgUTtAJFEwNCVBRDcnUjwrKzBcOyVRRD4oMlBcKVRKIihSUDwrNEcgJkIuMEdIUjkKK01FVDxaQ0pDPURaRyFOTUJaUjcuJStRQDokQUAtNiUkQigiMD0kUTg0JDEwPSchMDwrRiU5Olk1MSVSUD4KK00sQ0leNSpEPCYhLDlJMUA1JkgmOS8iODkgNSwhUCAiOFwnOEEkOCpGJyFRSDkhND0qQURTL0JURyZSSScKK00nMUg2IFFHQCUxODUlQUQ1KEJYNywiNDMqNkEoMFIkQyxSTFo4SDYxRFc+SSZBUV5FJlpYVTI4XEhaMzIKK01ASV8gTE02WlEnRiUnMVA6JSFANiQkJEAqIjhBJTEwMyQhKF00NCBULjdJSTlYKSwoVCErJDNCLTZJRDwKK00lUUA5SEMsOyk3OVUsIiQ0IDQkIVEgIjhdJzg6I0gyRyZBQUk5QTQ7KVIgXTBCVEYnMlkwJyEwMyBRO0AKK00kQTAzJSE8MygyXDcsUTg4J0MkUzFCMEssIyxdMCU9JjJVXkUmQT4wSCciVVJRWFtKKjMvQElbJU0tKl4KK01RR0YmJ0FENyQxNDUjVCA/KTIsPiRBIC8jMFxFKDFYOygmWUk6SD0uJ1NBJSJDJic2SUQ6JSEoN0kiXDgKK00pR11aLUI4OiA0UCFQMCI4X1dUOSQoQkonQVVUO0FIPStRPFYuQjhDJjJFJiZRRDUgUUNAJSE4NSVBRDUKK00nQiwwKlEwOyUhRE8yIjBNLkNEXykiUD4qRDJXJFIqLUhXQyFUQVBYTTpHOT85TypOTVMoU0daKSdRPDUKK00kMTw0I0NcPilSNEAlITg0I1BcPCZRLDYrVkVEOihFMikjUSYkM0osOFooPyVBLDxKQzA6KVddXS9STD8KK00gNTghUlAjW1w5NDYnIy5SJSFYPyYiIEI9UiIpPyQhIjAkJSUlIUg2JUE8OCUxODclQUQ4KDJURywyMDQKK00oJkxVL0QgSihCVFY2ODIwREZeQSZCIV5FVU85VyM5VlEpWy9ESC5fTF0+W004NU0rIVw7JVFELyRRLEQKK00nUVQ6JTEsMyQxOEsxMyRNOEc1STU3WSsmNTokP1daVz8pVDknMiQ5STg0XCs3VjUvMSw1IDI8IU8gI1sKK01dKTg3JkMyUyRBSDkkQUQ6PCIyLz9EJSIwVDkuJFEwMyRRMDUkQTA1JSE8NigiWEctITQ5JTMoPy9UKFAKK00nIzBZLUU9JjJFKj8nQU4rR1VLOVYjMVlSOVssREgvJk4tPyFNWDVOKzFQOCUhOC0kMSRCJyFINyRAXC8KK00jQSw/KTE8NzI2RUk2KC0tJTRZXj4nPlE/KVQ3JkFMN0lYJFkrSDo6MTFAOCAyVCFOICNOX1okOidDPlYKK00lQVw+JTE8ND1RUio+MzRZLjNNIiRBRDUlMTg3JSE4NyVBRDgnMihAKyEsPCJRSDkwJCBLJ1M4VydSRDoKK00qU0ZRJUI6Kkk2Q0paI0VZVTo3OEM3UyhPPiMqT1hJUStBSDYlIUAvJFEsRCdBUDklITQ0JCEsOCdRJDoKK002JjFENUg1MSZFKV8/WCJWQTo4JCcoRk1BQ0xPQUlVKSZBSCEtICZeIC9PWkwiKEInWEQtJSoyRyUxQDgKK00oSS1DMDQ1JTIkODUnITA5JkFANSYxODwlMUBBLDJETCshREE9I0BFKkMwWSpTITNBKFo1PSlAPyVXMjYKK001XUM9KitOQ0g9Jis6TFZVVVtaUkJFUFEnUVQ3JjEsMyUiOEEnMTw0JFEsNCUxTE4oIihNLTNFMzM0WDgKK001IyRDKyZdJEkxNDYlIS5HPkNATUM5OSMmUiwhKFAmWCAvT1pMMihAJ1hIKyQqQkslUUQ1KSk5QjBEOSkKK00zNFw0JUEkNiVRNDIlUTA6JFE4QSxCREwnMUw1LlFcRiszTFgsUzhRNUQxLTQ5QEIlJ046NS0/PCpMJkkKK01IPFYrOk0yWlY8MldCJVRSJyFANCVBIDAkMjA+JkEwMSNQXDEkQUg9JDEkOiszTTY0RSA0M0JMPSk2RSQKK01JMSwzIzBeRz4jOFBFSVEqJ0IkIShQJlUgL09fTyI8RCkoVC8lOypXJ1FQPygpOT8tI0BaL0QsMSZRLDgKK00mMTw0JjE4PCUxQDwpQihFJjFcLigxSEcqUzBVK1MkPCpROE4uKkw6J0dSQjguN0srTCJQSi1SJjg9Nl0KK01XXE5cQzYgUyZBODQmISgyJFI4PiZBMDElITAzJEE8OiMxQEUpUzk0NTUwOTQyWEIrRlktS0FANSNBMkwKK00/I0BQRUolLCdCLCEqICZXIC9PTUgyMD1AKyQwJjE4RCVRSUYnKVheL1QpJDIkUDYmMUg6J1E4NCVRND0KK00mUUBALCIwTilSIEk9NCRAMUJZLCohVSw9J1Y0O1pMQCZXJj0uXU89Jzk3J01NIjo3TEJQVCtCT0kkVD0KK00pIUw4JkEsNiUiTE4oIUw4KUM9IDMyRDssNjkyLlRVOzsmQD0zQigyK0ZZM0khPDgmQVhLJjFIOUc5USEKK00vNCwhMSAlUyAvT1FHQVg6QCskLiVBOEQlMT1CJylUXS9UKSYzJSw1JFE4NychLDElISg6JiE0PitSKEoKK00nMVg9LkI4RTQzTTktIiBPMkM5Ky9aXDgoNzJDL11PPCgpPydOPF45NyxCUlRLSlNGVFRAJzE4NSYgVDAKK00kMkRLJlE4MykzOF8zIjg4LDZBNC9FKUA8Vkg5MkFQKilGOTNJITQ1I1EkPyNRMDhHOVkoMSREITMgJVcKK00gL09fSkIkOkE7ODImIVRLJjE1SCU5SForQyRULkRINCVBUDknQTQzJUEwPCZBNDooQUhCJFIoOigyMEoKK000M004LDFYOCdQREooTDA0KUcySDI+S1IoSV82Tj1OODVMXlpWTCpbSTUoQidBMDcnISAzJFJMSyYxMDEKK00pIzReMlJANismOTAvJT1MP1coPjQiJDArJlE8SzFINyNRKEIlQTQ3SEo5KjFEWCE0QCVfIC9PTEoiJD4KK00oJyA3JEouSyUxQDwpSlZcQDU1LTJURDclQSw7JTE4NCVRNDwnMUxBK0JQSysiLFE+U1hBLCNVKzFCJSkKK009N1YwOjlAQSZVIjEsTV86KlxfMD1MWj8yXF5IVCs+OUoiXDcvMiw4LVMkODskJEYtKihDN0RFIC9FQSsKK001WEJBTCsuTklTVEE1V0lbQDsmP0lBPDgoIiBTK0JUQikxSDQsIywhLyAkTyAvT1BJMUw7KCcgNSNaLksKK00kUTQ6KjpaXD8lJSsyVFw1JCEgOCRBLDElISg5JkFAPysySEkpMjRGMEIwQy1ENTYzUixMMlM5Jy45UDkKK00oNS43LU1fOStNJzA+PFY9Mj0iS1RbSj5HUlw6LiIsOi5CXDY7NDBHLUowRTg0USMwNU0uNyhWRU0rQlUKK01NJCw6M1cpUT1aPj9JQTQ1JjE0QiVRPDAlMFAsLDNYITIgJFYgL09fTDFYOyk3NDkkOkpSJVEsPig7JyEKK009VEUjMERINyRRKDolITQzJSEoOSZBQDsoIihDJkIsRSlBXEctND02MzIkNSggREYnKyQ1KUUuPDAuW08KK00sLUc/Pl1OPzE9Lk1VO1JDSjMwPC0xWDYuIyw6PCQ4SC0qKEM3VEkhL1VFLjg5RldSLScxUzUwQzU3QVgKK00/SlpIS1FINyVRMEMmQUgzJjEwMC0jXCEyUCRYIC9PT0tBQDo8I0A0JjFcNCYxSSguK0c7VE0zKFApMD0KK00mITg5JSFINiRRND4nIUA/K0JUTCtSPFY9VDRBKSM5KDVRSSQ7R0oyOlooTCZEQjYrLTs7LDxbL0UtIkMKK00zXEZEUytCWE8iVE0yKUIxLSosTUlTPjUtJyBCMDMpIC9EMShLWkZISCk6TEhDLD0yITQ9KFQgVUZBQDgKK00lUVA5KTMsUitSQFQsIlQhKlAlMyAvT1NKUSg3PCNAMiVBXDQlUT0pLytPO1Q9IyhQWUg7JEEsNiQxPDMKK00kISg7JjE0PSsyTEsqQkxOMDJMPylDVTE3QUREMSMtKS5aOEQoJE48LC07Oi0tIy9FTF5BMyxGRlNLSlwKK01MUlRQMUlONi5aNE9LI1o6Lkc4SDIzSSgxRFEwTVsqUUo6JlhLIzw5MEEsOygzWFdGQTg1JDEsLCRBRDgKK00mISg6KFMoISxAJTUgL09fTVE0Nz0zVDYmIjg7JlE1Ki0sL0pYLis5VFlcPyUxLDgkUUQ1JCEgOSVRNDkKK00oIixIJzI0TCkiNEMpI10xNzFALiYwOEgnS0xAKTROQS5ON1AtTUM+Rk1aRTJNIkxVLCMkTzMoUjIpTjgKK00vOkRTS1QiPC43NEcxMzkkMEQ5NFJMSylQW1M1T1QsPjFRPD8pNChfSFFMNyUhPC0lIVQ8JlE0PylDMCEKK00tICUwIC9PUkxSMDclUVw/JUJAVychVSQtKzc6VV0nK1FJJD8nMVRDKCIsRSpSVE4sQyhaLFMoTSwyRE4KK009NExEKjQxLzNSTSA7V1IvOzo8VSgyWjUqLVc6KixXLDtcOkszPSZOT0s+WFIiSlo8SjxSPkQ1OD9DOjkKK00qKihENVNMXi8lLjJJSV5JSjoyRypTUEAqNC0lMzRVJjFBPDglIUA+J0JISytTMFwrIUwhKFAmJyAvT1YKK01NIVg0JjFcPSRSRFgmQUkmLitHPFZdNzBTOTxAJiFMQicyIEIqMkxMLCMgWCxDJE8qQyBHL1MkQiokPTUKK001MkBEMFMpJy9KPE8pQyY7Ky1TOSo8Vyw8XDpLMk0uT09bQlxPUkJcPSpQWEA0UT5BRCZAK1pESzgkMScKK00xNV4+S1pKUkxLIlMrU0g9KkRFKzRVLSgxQTQ1JEBYMCUxLDElMUw6JiFQISkgJiMgL09fUDFcMicyMEEKK00lMzEjJ1FJJCwsL1FZXic9VjlYQyVBPD8nMiBCKTI0RipCUFIpMjhKJ1I0RSkiREQpVD00NEI4LyYgOEYKK00oW0BQKlMuQC0uT08rLTs7Pl0+UDJNTlpSTDcmUjJTID5LJF1CRFlFQyQyQStKSEw3RCEjMDVCRVI8NyoKK01STD8qLlNYPys0QSo0RSksMlFENSVRODYlUTg1JVFIQSdBVCEpMCYoIC9PUk1COEEvQiw2JldaLSZCJF8KK00tOzc8Vy0rJ1NKNF8uU0RYLiNEWi4zSSAvQ1BdLSJYRC0iRFo9JFBBKTI5Jy1DQFA5WCFfOVosVyoiIjYKK00qPVc5KkxPL0pLTk8yTFJIUCwqXVIyTl9QS0xVRDI6QixYKjc1KiRVNUQhNzMkIk5MSFo/UFwiXyUhTToKK00nU1RQL1NMWzdGJS4mIUwwKkJUTSwzPSsuNDAhMFAnKCAvT1JPIVw7MDIwNCYnXiwlUUxfLVtLQVddNyoKK01UOk0hLkNIWS4zSFsuI0RfLzNMXCxSVE4pMkhYLzMsQClCRS0vQzxBLlNRIC85TFgpMjo9K01TOClMPy4KK01LW15RMl0qTFAsPyBRMkMhUTtUXUYjKkwvOFY+Nlo8WzdUUUM2JFJXTjk6RlIsJl0lIVE9KSNcTy9DSF0KK004JiErJCBcNCVRJDMlIShVLEQ4ITEwJyggL09fUzIgNjBSNDYmSFI6KDIgWi07X1BbPi86WDsoXytSWE0KK00rMlhPKzJYVCxCWE8pQiA9KDFMUCkyQD8qMkUqLkM4NydRID4qSV0jKVJOPyxeT08qXF9ETyxGVzNNTlQKK01SPTswUzJDKVRcJFlIMk5UMFhaQDc6USI3VEVANTRHI1UqUl9YPUszJlFdPylDTEwuUzxZN0VdKyUhMC8KK00mMTg3JTEsWSxUMCEwUCcxIC9PV04yREsyIUg5JkFYQicxRSwvOzc4VVs/MVJaLSAvUyhVLSMsUiwiXE8KK00rQyhXLUMsTTYyPEQ/RFxGKkI5LDVVOEc0N1IiN1ssSChRRjMqLVc8LkxDLElbLlgzTE5QTFtXJVJCQyIKK01SNSRRTTFNUiwrITJGKEVILlRFIS8lOk9TLCJfVCwsPyVBOEEqQShTMDFAQTRXKikmI006MDMoTS5EOSAKK00qUkghKkAnKyAvT1NPIVA/MjFMNyVRODolUTksL1tLPVc7VzdUOkkgLlMgVS0zMFMrUlhOKzMkVi0zKFYKK00xMVhBMiMwQyoiVTc4RUA2KUNJJC46VEYnMV48K14rOy1cMyxLKz5aM10mVExcLyhRQjckUyUsWE8yPV0KK00vK1E4R0hdTTElNS0yJiZYVFw/KlVcLDYkITBCKzEsUS9ROEE0VyIlJzEwPyZBRDAlQjRQKTI8ISowJyoKK00gL09fU0FcPDMhUDkmMVBAJyFBJy87X0xcLSNIWCpMWStSQEwqMkBHKSIsQyhCOEsqQjxMLTEgPysySEMKK00rIl04OFVQLSMhJD4pWyhLJ0IyPCw+W1EuPEs/TjwnIDRNSlxOTFM2U0I3LFZFTFlQMiogLjs9PUk5QVkKK00xJSkqMTYnJlteI0VcLShAJTFARStROFUwUUhGNic2KyRBQEwnIUAzJjI8UilCPCEqICc4IC9PUEwkNFAKK00kUTg1JUleSiYhREotOk8oVDg5RTZUTFcvU0hTLTMkTSxCWE4rUiBFKVJISDZSXD88NEw/KEFEUDAkPE4KK000Ni1KMSVASylRUEQoXUM8MUZLKUs6RlwzPDJPSSteQVAjIk1TMj42MlVeTCtZOFhMU0JDMlMpLTI0Kl4KK01TXEJaRFNcNiYhQDUrISg7KTE4OCokTjkvXFJfViNQXzBWWFwqMkghK1AnKCAvT09NI1BIJUE8MyRZVkcKK00lIThKLVsjLVQ4OUU3JFxWLkM4Uy1DKE4sMlRNK0FYQykyQFEwITw9LlJUOSdBTFcyJDw5KzM9ICo1MEUKK00oIUhCKU1TPDBWOylMSlZeM0xKU0k8NkVPIlZPVCJCPDUmSlYuWihfTkNeSTUjWTk1NFcnVTxeX0VTXDAKK00kQTAzKzEsOShRMDkqJEY1IloqU0hRJD4pRixbKUIsISsgJyogL09eUUNYRCYhQDUlOipPJjE4RS07NzwKK01YKF1KNzRESytCWEoqQjhCKUIoQihRODsnMiBPKSBQQSgiMDooUVxZMkRQNSchVEknVUhIJ1FYRCouO08KK00wVk84T1s/JDQ9Ll1KLEpRUSJWV1dDLkE1JksgLUlVIU5UJk41I002NERbN10uSzZKNEAzJTFENywhOD0KK00pUUA8KzRaOyNaPlZLQTBAKjYoWilCMCErICcyIC9PTTohPDs1RDA6JlEwLCVBPDgqWjsrSlM4VC4zLF0KK00uUzxSLSJcTy0jMEopIjBILCJYQzcyWDg8JShIJ1IsOyhCREMpIlA/KiI8SywjLE0uLFMzRClDJUxaIlwKK002O1ooMjwgSFIiPkxRXCFXJltYVUhaLEhJMy4pLSNBRDZILl9PWFg4KCBcLCchXD0nMlRULFMsSCUxQS8KK00uWzk8TkNcXztDKFUpMzAhOkAnICAvT1I8QTA2NzQ8OCVRNDElQTA4Kzo7MEpTMFIuIzhcLUMsUi0zIFAKK00sQyhIKFIoRitCUEwuUSw1LVMsRSYxXDwoUjg8JlIsQCcyLEUqIlBJLTxTNkNZMyVOKjJeNjwqKjIsNEoKK01RIjJQUkwlXSksOFxLKlBPSyNOMi9UNVE5WE8lUEkkOCcwVC8qUzRULFMgUyxDKEkkUTksJilRQUhBTEIKK002U0BdJ1JAITkgJyIgL09fQSE4NDdERDwnIig9JlEwMyo6Tz9MQyBKKlJITypCTEkqMjBEKkJIQCYhSEAKK00qIjhMJyA8PScyPEcnQjA/KSJAQycyLEMnIkBGKyMsTi1dN0hDSUc0UVpbJjdMUjAxXDxSUyIyWFYsWiQKK00oTEkoSypQUEpTPjAvVDFROUknOFdKREcqMSgxKlMoUStSWFIsMyRKJTFBLiU6JUZJUVBDNlMsWSgiTCEKK005MCcoIC4zVDFCREUmUUg+KCIkPychSEEmMTRLUkUpIS9TVFktIyRJKTIsQylCJD8oUjhKKzJUSTkyRDgKK00zRDRAKFI4RilSVFMtQ0UhLjRZWkpbWjQyTVc2PS03KE43OlkoXCExLltdP04iRkxSVTxOTzVcVE0jIj0KK003Ql1HNiZFOzgyMDskQTg1JlE4LCBSJjQrITREKSIkOCRROEQsJi85OlYwRTFBWE9JSEQhLEAmWiAvT0oKK00xQiQ9JyE8OCVRQDclQTw+JkFASFNFKF0vM1BXLEJcRyhSJEEpIVg9KDI0SSsiUFUyMUQ5KyMwQiZCJEUKK00pQlRVLTMsWC1FLV5KK1I7MS1XOz0tKyhOV0pYKDwlLi1LVT1MMj5SU0VEVVE2OFpOQz5COUNJVDlXTU8KK008IkQ7I0EgNCUxKDIsMzxULSE4QihBXDUkISxBIkJaQy4kUDkwMiBRRzdEISpQJl8gL09UNVI0OycxRDsKK00mUVA7JjFEQCZRSFJWRERVLTMkTypCPD8mUUQ5KCFQNyYxSD4oMiROLVEkOihCTEAnQVxCKFJAUCxDMFwKK00vRUImTSwmRjFeM1I+PUs5VCgrJClMKTAtK10/TyJOW1dGJFZSNjxfUFNGTjsjSVQ6OCFXPSJYQCRRJDMKK00mIUA3LVNMVC1BPEQpIiQ3JEEsPyFDPlQxNSQ8L0FMTUc3TCEqQCckIC9PTylCMEUpUyBAKjMgVi4kQS4KK00zJSVVUyxAXipSVFQrUlRKKEJMNyohMEMoUjRJKyJcTj5TLE0wNEhSL0NVSkcrVylUPF8yVUxSXyhTIjAKK001PU8xPTxTJ1FBXlw0N1I0Rlw1UU4iQktTOjpZNyMmQTIiVlUpSy1LOkZFRixTNDEoQVRCKiI0QSwhND4KK00xQSwzJiEsNyVBMD0vQzlTQyVVJUUzUSlGQlAhLCAmKCAuJ0YrQkxLKzM4Sy4jVSIyJU08OVZZXFNcOFkKK00qMkxSKzJMSCgiRDUpMSRBKDIsRypCVF07UixGKjMsQS4jXUxHS1sqVV0/M1YtOykpIk43NF1PND08RycKK01RQiJaM0gmNkY8PVdOIjpRVCpDIDkjPkgzQzJbK0tZVz43RVYuQ0Q1KSFQQCBSOjctMUhAMVEgMCUxIDQKK00kUSQ6MEI9PkQ2LSVFI1ErRDFQISowJi8gL09QMEM8VC8kNFgxJFk1NjZNVkBYLiVYPEhXKFIsTClSNEIKK00mQiwvKFBcOyYxTD8oQjRJOiI8PSgiNDYvNC1QSUxPNVlOV05bPkc5KVJCQDYuM0w+TSc4VjIuXzNILjoKK01GXE1WUDJKWlgrIyE6I1JKNFM7ICxMJVo+V11cLyMwLyghTEIqIjxILVFURDJBKDIlUSg2JTEkOC8yLTwKK01HNlEqRDMtJkQxWCEqICYwIC5PQjpGJTw1NV05NVVFOzUlLTc1RVpbUlJYOiYhUDgrMTRMJ0JMOSpBOEMKK00pIjxJKlMkWio0PUw5ODM2UjxPMVVNOzlVLF8/R0xMWC1SRi45XVM1Piw3KFFHXyM8S1lRQitBRkxRXk0KK01SVzUnK0sxVCo6QSU7Rl1GOlY5PCdUSScmMUxNLjRUWCgyKDYmQVA8JzAwOUMhVTkyJUZRKilKQSlSSjIKK00tMCRPIDM4IFsuXjJDWEYjQlhGK0JYWipCWEYgPjxLMSsxNDYmQTRKJEJEOyohOEckUiRCKTI8SStTTEIKK00rRERZN1xDLVQtMzlWPTs2VS1OL1FTUFEoSUFLVj1BWFBMQypBPD1VUUc+Kk9WXlcoKycuPVRYVk5HTFAKK01LRFFWPjcpWj0mOD0zJEw7JlJEXDRTPEMnMFg4JjE4NyRQLDZDIUkkL0VaRyhZTkApQlIpKTAkSCAzQCAKK01eX15cTjpWTk1bMlRNW1JXTVtWSUQ9Q0QrISwyJUEsSCQiPDkpQTBFJDFMOidSJEMqMlBAKCNISTRcWz8KK01aPyNVXT8rVFpeLi1TVFhSJVlZVVk/IV1STUc+QkxdV1JHWi5SJl5fKFtPPj9UXFpQN1RRTFRVWEA3PV4KK00+VlA/NCUsQSgiWFw0IzA/JlEoPCZRRDolQUA4JUFBMDE2IlkrSVo/KFJCKSlQJEcgMzAgXl4tTTlWNToKK002VT04NVVRNjRUTDg4PDctKVFIRChBVEwmQlQ/K0FITyYyNEQqIyRaLTROTTZIXz9WTE86Vi07OFZdQzcKK01BOT1cVFQ9NStYXU9XLSkuL1xHLEErPEFLV1lMTSUlUiZaMys+KVZJKiJaVUZBVi03Jik6OiFAQiUjOE0KK00zVj0/MTJYSSxBWDtFOU4+SjpKUk07Xl02RiJPLClIUC0nPjQsQCRFIDM0IF5fIj1GSVI0RSkiL0RYXiwKK01EJ1RPOFw3MSlRND8oIUhJJiJMPSpRPEolIiBCKiMkWCwkLkIvNjssVj03OVZNRzxYLic4OTUlLFBUMSwKK00qKUVVVj0tLy88RzFDXCRITjg1Uk9FWVooKksuPjouUSwjNlxHUjI1OTZZRj0hVD8lU1RTNFY1QjJSWEkKK00rMTw5RElCO0lKSlJNO18uOCVGUys5KEwsRzYpKEAkPiAzLCBeX18sUkxPI1FMKyFQLCMhT0pFJjg8Uz0KK00nQSA9JyFARyUiPDkqMTRIJEFUPihSUFIqU1ZBKiVXOVwvN1BcLydOW15XQzczWE1PNSEuJzldXlk+UTIKK00wTUNGRkxMSk9YWVdRRVogKEsnQEEqQlUsQzpdSSIuOTw3NUs+MiA9JjNYUDM2PUIxQkRCKkFAO0ZKIkMKK01LSy5bTywzJDZVQksqWThRLUc+KSkgJD0gMlQgQV5ZQTw0LT01RUwjNV8lMjEwVTM1XCMvLFNBJSpSTFUKK00rIlg+LEFEUCYzREIoIlRSLUM7LlVdMzFVPTs5Vj0vJldZNSBDSCYqUzU8Qz5IVV1VTFg/RjwnJzUsJEYKK00vNzRVNFM8LCFaIyJOJDxbMyo0XSlKMUpAJ1kvKkQhRjdUVEowUkRSKkFcQCciMFJCOF4xQjg6Ij83VVcKK00qJkpbLUkkNyQoLiEuQCRSIDU4IF5fMjtHSDYzRCk2MUQ4UjE7IU0zOCw/LiwzKSAqMkBTKkJQPCwhOEsKK00kUyw/J0JMTiwjMylTXT85Vk1HOlctPylYWURTNSMtM1BFIDg+KT4iVFxEPUVcIyc2PERHMEdMXDZDUDEKK00iSisjTyRZJDUqSSMrOyFYQlhFOSszTUM5NTBRMkJQVCpBVD0mMiRPQzkyNkNIUihAWC1dKUYmUitITDQKK00jR11VKjAkSSA1JCBeX180UytbIk9cMyBPW18hREJVPDgtKz0qUlReKTI4TShCMDYrITBJJSMwQSYiLEYKK00qU0M0WC5HTVw/J1NeLy9BXiosVikxWEtQNTxHPSleJ1c9WDlGPFs4OUxcSDE4KF42VCQzIypLLlElISAKK002SzkqKys+IkU5MUErU0FBOEUsUjMiWFIoUUQ7JVFcTUVaJkNGWTYxQyhSJCpGJlYsSFg2JCg1WipAJEkKK00gNFAgXl5NMjk1MT04RiU+NUZEQCUyIEgzK1M2LTIgQioyIEsuQlw9K1FIVjBTIEcrUyRZUi0rNFZNSzQKK01VXUM3VDpcPCw2XElEOEIoUyVdRylZIiZVTFUhUDxOXi1BWEEpQig8JlIsOyYmSiZGNlpDTiIgRUtHUV0KK01ANU02MlRJJCtDLF8uUiRTLDMsQyoyRFk5Vy1OOjY5QDclQTM1NzZXPzhOJ0o4QiYtMCUhIDckIF5fJiwKK01ESTozRjlCNUVZRSUmQVA/M1wvNixRRDwpUVRJLiJcPStBRFwyMyBDKFI4U1ItOzpXXV88Vy1PN1UrJDkKK00qNkA0NVNNLE81QTcoSUorVFxFIVBMTl0tUVQ7KEIgOiZBVDglNj4jRjciSE8iQFJPOF4uQiVRMTAzXF4KK00sMz0jL0IoUytSWEEpUjxYOSchSzlGMT42RTkyM0Y6ST0oNiRJWDFaKSAkWCA2WCBeX18lUCxfIlI8QyUKK01STEFAKUIoQTNcX0crUTw9KFFMQywiQDgqUUBbMUJEOSciLFZUPkNNXU9DUlxfP1ZbLDhFK1Y4MCgyMEMKK01PNV1IJ1oqMFc9RFpRPVspLkFQPilSMDwmMiA4JVcmK0dHMktTQlhPUVleO0Q1VS4uMzRZKjJcXi8iLE4KK00pUkQ9KDFcSzhHKU06JiE4NSUhMTNWOk8+KEImSjhJXykwJFggNlAgXl5ZRDxVTUo5JjlHN0NcQydUQUgKK00uPCM1LzIsPCxTTE8sUyg2LTQsUCVSIE81LEc4Vi03MlRdSzJUXSYxPSMwVz9HKE9BOEYqUkc8QSYoQV0KK01SPE47UFwnJS1BWDspQiRGK1MlNiVYPyBPOTBdLzRZXEE2JT0zRTU7NjVRIyxCRFwmUkhaMFNAXi4iLE4KK01VPSs4VT1LN1YtP0NTR15ZP0guVEs4IistUCROIDZQIF5fMj5IKVY9RjlOPENTXDAoNSFEMCw/My5BUDYKK00sM0BNLDMoOC1UME8lIVRMM0wzOFc9Uz1XLVc3Vi02NDwyWE89JlxAMyNRLE9XPDMkWSoiUUxGPVE8MyoKK00sUTw4KFFYQysySTElSEcgTzlBIzElPiRCVi06MSQxJzBERFwsIjxaJiI8WC9TKFotUiRMVE0rOFU9RzUKK01VTTdDUjcuTT1HVlFKV1FfKUAkRSA2SCBeX183U007LVJMUy1NRiA9J1U5Si9dL0cuIVQ5KzM4RyoyVDQKK00tNDROJSFMSjRcX0tdLz9XXU9HUFteSkY+MyxNO0ZUPiYiJERPR1BDJClKJ1QtXjtSPTM5LlE0OCkxWEEKK00qMkEuJTknM1QqMSwwVS4qRyZFOi8jPFcsM0hTKkIkViVCPFIsUkxOKyFESFZNT0FXTkNHWi4/VFUnQlAKK00+SCJTSzgqJClQJEUgNlAgXl5FTjs2OUk6JU1JLVQkNCc4IVwwLDM8LiI0PSxBSEcoUyUjK1E0TidWUzIKK01XLVM4Vy1DNVVNRzQ1Qig/KkFYOipRSEhASSIoUihUQCdXXV9QTDZVUCteXzJSWEcoUUxELUFUOyVSUlwKK01NMylXQiFUMickWTU4Ni0/N0VFJiZRVF0nIVhbKzMkVCwzNElTXTs1Vz1bQVZdVztORkpQRTgmW0omTiMKK00tMCRQIDJEIF5fKkhGOjo7RkkiMidSKDQmWEYhMlxHOy1RXDcsITRFKFM1KSxBQEclVjcuV01fPFgtUz4KK01XXUM3NkJARyoiMEEsIig9MyQ5LVBJMDkmSEYkUEwyVVBMMyQzIlBHKEFIRC1BQDkmMyshTjNOJEMyIDQKK00nJCElMlQ9IzFEKFwmIThXJUFEVyoySFEsIyhFVF1POlhOK0VYLitCTjYqS0M3TlVJNj1XKSAkSSAyPCAKK01eX18/US1XJ1NMLl8wIyQtJzlGLTNNO1EtIiA6KyEsQScjISQsQUhIJlZbPV0vR1hfX0NYXV8nUTtDJE0KK00rIlRKLTJAPCcyQEZPOThEJiheJ1JdVlxSLSc5NjJAQidRPD8rUSwzJTM/LlAzRVtDUlg8IzJcVS1TKE4KK00sMyRUJUEwWiYxPE8nMiRDKFMgS1lfK09dXz9aXT8/XVNWQklEN1pYSVZVWihQJEggMkQgXl5NTD8mJUAKK003RiwgLkQ4UC40NE4sPCc1LjJURyxBQFEvMyhIKyFZRExNLzRWLUc4Vk0vOFRUWEQyIlE7MjIwRjRDMSYKK01HKUYjVTlMOCZHRiJOXDZUOFwmWDkyTE0vQlEwMDRQXyhBXy1PUUA8LlJAQjM1QS04RiEmJ1VBJCYzUE8KK005I1klKlNMVi5SWE1UXTc5Vz4rPlc9U0BVN0JURkcqUUo3XUQtICRYIDhUIF5fNkVJSjJBRTkwLSYiSEkKK00vJEhULTwzOS5SQEQsQUhTL0MoRioxQUZNXTs3Vz1bPlddTzxUVEg7LVIpQisiMEkvMjxNOiVBK1FJWDUKK00lWDYlT1xCTzgsNl05UkBHLjJJLi9UUF4oMVcqTyE4Oi1CMD4vU10jNCQwUyVUPFkmQyBMODMxISsjNFEKK00tUlBLVi1LPVdeJ0BYPidHVTcmT0UmUktIV1U8KUAkUSA4UCBeX185Uz1LKlE7VD8oIyBKLyRcWS89M00KK00tQixEKzE4US9SVEIpUVVMUS5bUV1PL1FeLltZWEUoPSshUUsoIkRHLFI8OC8zLE1RKVg9JjgqJ1I9OlwKK006TScsOzI4Qi1COSouVDxbKCFfNlFBSD4sMkg2K0MkWS8zIEYkM0hOJzJMTDgyUFcoIlBEKlI4TVleX1IKK01dP0NWXU9DX1lHKk1GNyZQSigpOidQJFAgOEwgXl5NUTxVWUs6UTg3JTFETitSPDUpS0s4L0I8RStUKE4KK00mIjxAPytbL1UtPzRVPTc4VixPKzUlNTo7IlokNTYwRDZERS1DOUYmUzpUWyYnQVtOLCZRPztWXjBBPEEKK00qMUQ6J0E0QCwzPFcwJCBCK1I8VzVFJE8tVjI7SShJKEs0RSNTU1EhKSNEUjAyIDdSXUM4Vl1XPlZNQzcKK01EOFZQR1Y2S0k3ID0tQCRXIDlcIF5fIktIWi5HQTFMMyIxLFMtIkQ3KltXOy9CJD8tVExUJjI0QD9cLzgKK01XPV89V01bQlhMXyUxJCUlMDIiMyw1VD4sUyBMNUVFLU9LIFglKDFeTyw6Tj47Vl0wITQ6KVE8OCchMD8KK00rUzRRLjNEOytSJEovQ1hKKiReNUo3WFpLM10iUzMwXSkjLE0vMVg2VC1XO1ctTz1WPUs5Q0g6S0ZWJkcKK01INlgyKUAkTiA5VCBeX1dBU01XOksyQDgkIUBWLjMkOywsT00uMVBALDQ8UyciREdDPUNOXV9PU14vM1IKK01dPic4LyJUWylRPj8oJUw3JlIsMilSUFFPSlkgJjgmIFFNNlpAPDspMSBcOChRLDQmISQ+LDNEVi4jPDwKK00pQig9KzMkRSdENjZLRzxQTENFIVQzIFUmUlBALDFANVdfK1VePz9WXC5fT0ZIMkhIJjpMSUcsMSggJE4KK00gOiQgXl5NTTxFVVosUzUiLFFUOiYxSDwoW1c3LkNFOi0xREIqSDYtTSxPJlNcRy1UXEI9SFM7ODY1USkKK01AQildOERQXzUjMS47OFVaUjg4QiVWWVFJW1pQN1ReTkNSTEQnUyxYKzI8Pic5OF00M0g7KEIwWzQkLkIKK01MNjleV0o9LU1ULFxRRCUkKDNMQCoiVERTXS81WD1TNlVcQzkyWFJASTRCQkgnPFQuQCRXIDpAIF5fIkcKK01IKT4wKEE8RCgxPDomMSw4KTwrPC8zPTouIVBFKkhSNk89Ly9WLSc2VUxGQElDSy4xVFheNUFeOi5UNF8KK00sMiBSLiRRIE44SEAkV0lUSlw+UTZUVkpCQjg/JzMkVipSODwmWTBXMlMwMykhWE4wI05CSEU9W1gpRF8KK01OI1ReUiNEXygzNDooUkhBVF1DOVkuMz1XLFM3MFg2O0hUOkBHRyxHKiAkTCA6NCBeX1M9Ukw6Ti4xWEsKK00qIVA/KCFIPSo8W1MvU0VBLUFQRytZQkZUXl9FXC5XTFxOKlJOJDs2LSMwWy4hXlEpNCxaJyE4QCVSPEwKK01OWChEJic9Vk09Pl44JSpQQiIkPCYyVFIpUjQ+J1lEWDFCXDcoIiRBLCNGSUgkVVtZSShWUFNAWVMjPFoKK00mQyAzJ0JQSVleV0tcT0tWXD1bSTI3UjhJNEpESEdERyhQJEwgOlQgXl5FSjszQDYmUVhFMEFENyYxNDUKK00pWz8tRlYsNSkhSDAlUFQ/J1IwPigyJDkmQVxAPVQvMz5SSERBQk0yN0dRLjFWUSYzJ01UUVVcWSU2VS0KK002W1JOMkgyJzQzOFUqUlhGJVFMPyc4MFYuMyQ3I1FcUCxbTzpDRTleV0RVK01UUFtUI0haLDMwUyhLQVsKK01SNzRPL10xWEMmWzQxVlUoRlE+OEk2XFEuQCRYIDpIIF5fKkNFVVA7I0EkMStAVDQkUFQvKitPNkhGNDkKK00oITAuJVBUPSYhUD8pIiw8JjFUQj40NzE6Ujg5M0FdQi0nLTUsJihQJ1NQWk02LFgkRzkwN1wqTzIoNiMKK00zIyRQKjJMQyVBVD0mWDBTLSJcMyRBTEYrKz87PzRRWFZDVF1OVDhfVEMsVStSVEonOzFYU0dUVTEuJicKK01GRz8wMCY5I0YxNjZIVkxCKiAkTyA6OCBeX185UCdUPSQxMDktISA2JiEwMipcN1BKVkxDKTFEMychKEIKK00nUixKLSNATilSKD09NC82NkFINilBSVInNy02KEVQSSJSKEhOJVRXJScxMjldJloySEIoMkJQTSkyREEKK00kUUw/J1hMUywyTDglIiA8KCtXSD8jUVFXUzxWUVQkWVYjKFIqUkxKJltSJFhZJF4xTyo/SygvPzA1VSAKK01GUUY6SVcgQikwJE8gOlggXl05UyEhNDglITg1JSE8NiVBMDkmKlstNiFQXDExPDQmJFxTKSM8NSVBQDkKK00nIU0hNCQvLjYiJEZDMkhYMUJYPSwzIFkuNjFXUUhcVCZGXE8vW0JIKjM2T0EnXE8oMiRELzEwNCpHUFAKK00mUTBMOTMoRTEjOEs1NEovVlRFL0xUIF9RU0BeMVM0UiooMlVSJjUnKTxNTUIlUyYyJCkoRiIiM0U2TFAKK00sQCRXIDpYIF5eWjsnQTQ0JCEoMSQxMDMkUSgzJSsrNTcxUSAxMTQyJURMTygjLDEkQTA1JjFFJDVDPzsKK00wUiw2NkFNICoxUDonMjRAJyM8XUw4VE8mNyhVMUtORSpTTlNBJ1hNJ1FMQjBRSDEpV1hNJUEsTjlDJEAKK00vQyxMMFQmMFYzMSBNU0khUjMkVy9CSEUoSCpOVFclMistIVlGJjMiMDNJIkVBWjFEVkBFKFAkVCA6QCAKK01eX18nL0FQOSUxPDYkUTg1JTEwNCY7W0g6QjUqMkFENiZFJFUpQ0Q2JVFEOiZRNFo0MytMLTI8MC0hTTMKK00nMUQ6JTFMPSQiLEBLOShNJUcgVDIsTk8qNCJbQjdUSSZRWEcyIUQxKjg4TyRRIEo5UyA9LjM0TTAjJiIKK01XMyBWT1M0XFMyXFYvQjxFJjg+VVdIOTMrPV4uSjZDMi9TOSNGIio1RVZIRSgwJFQgOlQgXl4gLihCID0KK00nMUA4JVIkUC4kISc1WzMzPjNIOSNRJDY2RkU7MUVFNCUhVDFBOi5TSypORD8hXENCUi0oLDJMNSpTSEwKK00qM1VZT1g4SyVGMD8rR146JVIpXEExUDolQTw0J1VFNy03WS8/WDRYKCY5SUtLRU4wVDIlVkUpKkxDWSEKK01SM00qMCNMUyw7LlBRRiBbMz09Tj9FTygwNDEjRCFZPCxGWFEsQCRWIDsgIEFOVD8nIUg+JjAsNFxBWE0KK00tM00gNDtHOz8jODcjUFw0NiY1NzBFNTAkIUQtQVo2WEwqMlE4QiA5NlFNMyYhUDInMyw3JTFNIUo4KEEKK00kVjRCLSg2PCUyPiBBMUg3JSEwNSlFVTMsSCExQEhAXCZWLUlLK0lXL0QuKFYjVFtNQ0EjUlMxIy1TIEgKK00rOy5LVFZZKTYtUVpDVi8kLkNQXUNBUTosJkxGKFAkUyA6SCBeX1xMJ1FUQSdBRDklQiBPLVNEXzVMO04KK01CRDRJJUEsODcmTT0yJU01JTFYMkM6Vl1OKjciNEIsMzFBRT4kUUgyJUJINSNBIENIWEhJJTY4QixYWkIKK00lUkooQyFcOSVBMDgsNjU4LShBNUAoOFcmJi1OTCtVVy5TQVxXI0RRT0MsXlNTKSItUlRFKFtSVlgoQTIKK004TyYvRyZHNC4jQF5EIiE+LSZURigwJFMgOlwgXl5AOCZRPDQlISg3LkQhKzFERS0yK0cvPUFQOSUxOE0KK00yRUUqJEIkUC9RRDNKKkYkOiY6ODkhSDw0IVUpKlJAOigjKEUnQyVLSilNIiZEIDomRCI5JiJIXStBJDkKK00mQklGMjo2XiklVjNXJyUxLzU1MTQlOSIyMVVeVlU1I0xUXFtSMyklMjNEVCk7NlZTRTBbMFxdQDw1QyYKK00yRDkqP0IkPSgmSEMpQCUvIDskIF5dPDokQFgyJCBYMy1TVSgwVCklMEtfNz0xQDckUTBLMiU1JiNBVEwKK00uUTQvS1smKTsmLkYxQUQ3KUFBOCYhVDgmIlA2JUFQWkVZTF4lQ1A4JzRCPiVCTSArUFw1JlJRSTRKSloKK00oJV43V0ctLy4lSTYzNSktMkFRXlY0IFRNVERdUlJMXjAiWEwpKzpSVSVVJjQ9MUxARiMiMFNZJD8hXDsKK00nRjw4JVAlLCA6VCBeX0A4JUFANCUxLDguM10qMTQhIzFdI01BIiA8JVFATzMlTSwlIixRMCFINE5MNkAKK01AJk5YLFFAMihRNTwmQVQ6JUIsNiUhQEJFKjEjJyQkOiZUSkEmQlEgLEEsOidCQUk4Sz8iKTY+P1hHJSsKK00tRV1CM1VBLTJRRVVXM1BKT1QwWFNSRF0wIkxGJjwnIlhXNTA2Xk1fQlY7NDAzSSU/Qiw/KEZEOCUwJSwKK00gOyggXl88NSUxQDUlITw4IzMxJzRVKUQzOl8uP0FMOSUxODglIFwsJ0FEMydRLD0sWjpJS0tOLj41OD8KK00yQiUnKUI4OiczKEIlIj0hNDssRicxNDklQV0uKDIkRTBCJTM6OEA9O0sjKyg1KltXODBRKDYlTDAxQS4KK00sI01TVTUlKU1ETFxQUlUjM0M4XihbNlZSI1RWL00lNDc1LyczNDRZPCIsPCdHOiwvQCRYIDpcIF5dQDEKK00kMFwyJCEsMiIzISQzND05MVs3Mj9RRDgkUTA2JEBMKCZBNC8mUFw5L0syUk1LXjs2VSA/KUFZNiYhVDcKK00lIlA2IzFIOjFLREgmMSQ2JTI5MydSLEkxIi0xOyhEPz4rMycnNTJdVkdYSiZWNVMvISk2LDNBUVVDXFsKK01ORDReUFJNIDFSTFYoS0ZUU0QsXjItMUE8RU8jMiNUUzsyJDonJy1fKzAkUyA6TCBeX0Q2KDFUNCUxQDcKK00jQzUmNCQ5NjMsO0dDIUw1JTFAOiVBJC4oIUw0KCEwPi9bVyBPLD5KMiUsOipRUTgnQVw5JSI0MyMhSCwKK00xTCBGJ0E4NiRCNTYoUiREL1FdMztISD1CXEM2KFVLI1hIJEgoJyVeLkE9OC0jSU1WM0hRUEQgWVIiPF4KK00xQkBSJVwvJlVVKSI0LlFQPUYnNTEzRFY7UjQ+KCc2ICsgJFEgOyAgQE5EQiBRP1YlQSg2JiJRKS9VMTYKK00vSk0+L1YxOSVEMkImIi0nQEZVRTk3WDwpKTVYNjVKKDkyPDwtIkE7JkJIQSozOFwoMiBOKjgsPSdCQFEKK00nQVBLLEQgTCpHPjdBTUg9M1wvOiszUlVWWDxeKSZBQDQmKFw3MiYsVlRdNEs0USFIMz0iM0QwVSsrQlkKK01SI1RTMC0tKDRUNyYzKEVXNkUwOSdGWV0wQCRWIDZUIF5dTDgkISg1JSEgNCZCWSUtVEEpLTpRPTBWSTsKK00kRCI+JSFdIz9GRUE4N0g4KkleIThWIi00UUQ5KDIlQSRBXDYnQkhQJSEsOSg4MDgmIjROJlFUTCxUJE0KK00rN1Y+Qi00PDcsQzUqM1JXVigwWiZWMUU1Rj0hN1IqKVc0ISZMRDkgR0NJJjIjREoqS0ZVUzQwWzFdLTIKK005JEsgMVgxUTRFIDomJklNKjAkTiA2UCBeXlRCI1EgOiYxNDkoIykqLlRNKS47RUsyVl0/JVQ2QyYyNSkKK01BJl1HOVggPitaRi86VyYyMCIkOShSIUYlQVw2J0I8TSUhMDcnWDw2JjI8UCcxWE0tJChOKldCQENOIDsKK007PVdNLDQmVVhIOFInNklINDZFJDhSNilYU1BcTVQkXUgjISAyMzhJKEwzJFY0VSE0TjE8OVU/NTEoJVYKK002JTQ9JzZdUSogJEwgNkQgXl4kRydCUFEuVDUqLlNFIS8jIF4vUk8nRjZBPyZBXDE7UUxfJjU8NChWPDsKK00mJVIjRFdCODdCLD4sMihALSNAViwiUFInUVBIKiYgSCdSWF4uQ0Q7LyQgRCdUIT9QXiBKKlwjQChSXlQKK01WKUk5J1JFRTFVUEU4JTowVjUpNEwkUSRTJCUmNCNcUitLPlNRQ1RWMU0tJDM0Nyo2O1lKSUI1RkhHIiMKK00xQCRYIDVcIF5dQEMoIyRTLzRJMDAzWSQuQkRTLUJPKEdXIUQmIUwtOlE8WyU1LDAnViw3J0YuKUZHTjwKK000ISw7J0FEQypSVEspMiRHJSEgNyc1VEIoQy0jL1NQPi9ULEIoNDFEUi1MRy08OzsnUl5VVTk9NSYiQUwKK00zVixLOSVGLlZULSZNNDkjUjQlJjIzMEorK0JPUUNcWTItISc0VDsiNStFREdCJUdHJlFTKzAkUCA2ICAKK01eXihIJ0MsVzA0XTUxRCUmLyJIUi4jKzVKJzlJJzIgMjwhVSEmVUQ2KTZEPSc2NjBGWFZGL1E0OSghREUKK00rMlRLKTIgRiUhLDgnJUxDKSM5JjBDWD4vVCxEJ1NdR1M+SEcvPT9TKVMyWFg5PSslQj1NMlYoSjdVJioKK01YM1xcTkQlIFJTQSEyQyRIKSwuXlNULFszTUEnNCRHMzQ7OUlJIjlKSDclVysgJE4gNiQgXl1EVi0jRScKK00rIiBBKlMoWS4zOFYwMk08MiYxWSZRPDwnIUU6JyFAPCkyMEAjSSBEJiFJITNCMDYpUzxWK1JATClRWDkKK00mQUBAKTMsXS5DOFYuIyQ/JlFUPSZBUiVRLUxMK0wrPCpCUlFXOU1JS0FNKz5FRFAtVFItVFUtMUA0RSoKK01TI1kqMSM8XyxLNlNTRCEjNVw9LjY1SyU0S1FLR0I2QkdGRiEwUCRcIDhAIF5dSFgtMzxfKDFIPypTIFcKK00uQyxNLjJBPTNWWV8mMSw4JiE1NiYhMDgoMiA8I0kkRCYxRScwUSw1JSJQUykhVEEnITgwJDBcMyZCVFoKK00vM0xbLzJcPCYhSDolUU4nUi08RixcPzcpQlJRVjlBRkkhOS4/NUBNLFQ+KFU0MSNBRC0pUjNBJS8yUFcKK00sKzpPVDQtJzZMSTE3NVZfMzs9RUVCJkNGJjVRKkAkVCA4MCBeXjxeLUNEXSdBTEMsQzRbLlMsTS1SSUoKK002RzomJ0FAPScxTTwnQUg+KVI4QiU5WFMpIj0uLiFINCVSRFEpIVRBJyEwMCRRLDYlUkBcL1NUXS9TJD4KK00mQVA8JVFCK1QuREktPTNPK0MmVlo5QThHIS0uPlU8SyozQiNWVCBZQlNZJlJTJSIvQkRVKiwmXlRULSEKK002TFEvNiVPMDJLMUpHIjpGRzZJVSowJFIgOEQgXl1YRzcjTUUxMlBHKEJUUS0jLSYwI08pTVYtSCVVXTAKK00lQiBDMyVBXitBMFUmMUg/J1EoQzNRRDQoQlxIKTIgRShSTEQnMVA+KDIlKjIyWEAnQVw+J0I4Sy8yJFwKK01NLURILCsnQClCSkxSSiVPS0okTChSWU1QRkYxVFUpMko0UF9PU1ElMVMsWCtXPlJRTDcnUDwqVlArNysKK002WlU4Q0IyPkZGMV4wMCRdIDdEIF5dIDYxUVksK1FUPCZCOEssMl0hLiNDKU82WU0lNU0sJEFQPzIlMVoKK00qQSBRJVFAPScxIEkxMEgxJCIwQSchPDwmQig7JSEsMiUhRSkyUlQ/JzFINyVBXEUuQiRbTj00QCxLOz0KK00oQkpMUllVS0hJREYnMjlGTUVWK1U0OSRLRDReTyM4XS9CTFArN0ZPUkxPLVI8RltRK0spNUpBMkFCIj8KK01FRiFOKiAkVSA3LCBeXUAzLjElISohTDwoMlRQLFMwXy1DSzhTJ0VZJkYhMSVSKEUzRUogLCE4VyYxUEIKK00nUTBOLzEwMyRSJEAnITw8JkIoOyVBPDUlITUoMjJIPCZBQDgmQVhGLiFQWk8uPEYrTCtVKkJeU1YqKTcKK01GWTxHJ0IpRUw0OiJWVCxaTFQsW09DJFswIjxOKTgmW1ctWz5XPiswVi0nPzRaNTdCQjZCRlY1UClQJFMKK00gNlggSD4wSzIjKFgrIiA8JVFIRSxTUFctUlE7OFNZJidRPDUkQThBJVEwOSRRNDkkUCxBQyEoMicyKDcKK00nUVRDKFFUPCdQLEZSIiA5JkFMTixRWEgqUkhQLCMkSyxCMS0yLDRNKklXQCkyRlNSSlVSQkYyJTdWUTEKK01JNzoiU1cxJkVEOSNPIzEiNENEUyxXUyFCWTooRVleQUVaOyM3W0E7PjI6NkM1SVoxMCRdIDYoIEg9MD0KK00uQiBGJlE0NiUxQEMsM1BRLCJBPTo0RSsnMSwxI0EoPSRRIDQjUSQ1JDAsP1VRIDckMSwuJFEkNyZBODUKK00mIVQ7JlE0MCQxNE0sIUxFKiJATisyXEorUikoMktcRio6Kz0oMj5QVDopR0FFUVc0RVEqREZCIFRWPFsKK01HQ10hTkJcWzIyWEgrV1JcRFouNkorJlJJOysnNyshNTwyKjlCVUFLKyAkVCA1VCBIPjxDLCFMQSYhNDsKK00mMVBHLTQsViwyWUU8JFEuKEFENyUhQEMmMTg/JVE8OiVALERVUSg8IyBcMiYhODwnITw2JjFUOyZRNDIKK00kUThMK0FEQylCIEorMkxJK1FZIzE9IE8qKltVKjJSXFRLLSo8REVONEUwXj4kWVpWVkBQSCQgW09CUFkKK00yUkxFKFgnJ0lbVlBQPEMtUDxHOzZKWTg9Mj47Q1VVSyowJFQgNkAgXl4sQShSLEsmQTw/KEFQOiYhPEYKK00wUjI8SygkSCchKk0mNlhGNjM2MzgoIDIkQixEJyEkNCxVKD4mUVRAKSI8SChSPEYoMUQ3JiFAOSlCLF8KK00vUVBcM1hZS0BULUNILUxJKltTPShCOkhPO0U9PlkiOUJKOjxHVEonUyVJLzU0KFk9I0ElMiQgVyxLKyUKK01JKSIrRjk2OkRJXyQ9SyU+OkIyMEJGKiQyMCRZIDpAIF5dRDgnIVBDJEEsPSghSDglQTxALyIiOUtIOEkKK00mIFpJJTZIQjUzJi43J1AuJCIkQiZAWDInQzQxI1EkNCYhTDwlUVg9JiEgMCQxKDMoUiBcLyFIWTJYRUQKK00/NCFBSF1IRStMJzonQjJAUCpFLD04MiY+KSIwQzNSJFQkVSQ3Q0xXPFMsXi9TNEwrSysgSylWOUpKSk8KK01JKyMpPTpJOjhCIjNCJiFVLCAkUCA6QCBeXlRCJzFUSSYhQD8pIVg8JkFYRS8yOkNNKERMJ0EyTyZXIEgKK002Uz45OSgoMyUyOEcnUFg2JEJAMiRBMDcmUVg/JkIgPyZBKDEkQSw0KDFYWi5BMFc0KTFLQEQpQ0k+REsKK00rTFdSKUJGUFArSFM5Rl1ONjcpTzhCQiJWJFhZNyNIUzxDIFwwMyhLKStPLVArPlNQXDMtUFxHQD0qRT8KK005QjY1QyY1VSswJFAgOlwgSj48OilBXEMpMkhQJVFMNSRRID0wUihaKUE4QCZBTSsmITQ6KiFIOCQhSDYKK00kUUhEJyFQOCpDJEIgUjsvKFIwRSwjJFMmQTg2JTFMOyo0LE8rUyU5MiEsOy5DISZHLUBIKTs7NioyXkkKK00+S01CQ1xJSUEoPyY7JF1aVEU1IypFNSAsUyUiNDQgVylZJyJJWT41RTlOOEVKIyE7WzkuNlI2K0FGLVUKK00xUCRbIDosIEo9UDEnUUw9J1IwSiRRRDMkMSA3LyFYUighNDskUT0nJSEkNikhODMjITgyJDFAQiZBRDoKK00mQVQ3IFFPLyZBTDwpUkxNJSEgMyRBMDIpJCBMKyJZNjEwXDMsUlEmSE1ARipLVzMpMlZEQEslNEIrVTcKK008R1ZfNiQtWVVEQFgtJFhdLEJQWzIjNEwoWSJdS1oyQ0lKWktJSlcmPCstLDRSJi5BJiVGK0AkUiA6ICAKK01KPkQ7KUIgQikiPE0mIVQ3JTE8PC8yMSIsMiRGJyFVLSZBPDwqQVA+JSFQNyVBVEcnUUw+JEE4NyBRTy8KK00nIVQ+KjJYUCVRLDMkQTQ0KENYSipCWTQwUTw3LSMlK0o+TEorPEdLKzMqUz8rTSBEW1kiMVQ+VDgiWU4KK01XRERNKyRUWytSPFkyQyhLJllTLFBbWl1PXDslUSwzPzw7LTE2MjowQiY5RipQJFIgOkAgS15QVitSJFEKK00rIkBVKCFQNSYiLEYxQjQ5JiFAOyNRQDclUSA4JDFENyMwXDAkUURAKCFINihSREIpQjhILEM8RSBRVykKK00nIUg6KEJQRicmJFMzUlBBMSFYPykxPT1NXTxIJ1lfLisiWlM8K0U8RExFLTU4Pyo9VTUkOiVBJCRCRF0KK00mQyEhM1NZICpKKlxFOE4nPzdNWzgnLy04KlklMlFdXjlWLUwvMCUkIDk4IEo9TEwpUUxMKTFcSSZBSDMKK00lQiRDMCIsMyUxPDYiUTAzJFBQNCMxNDMiMEwsJDE8PidBQDwnQiw6IFFWIypTJD8gUT8pJUEwNyciNDoKK00lRVhQMyJIQDBBTDcnITk/Tz1IRig6OysqIlJXPVs1MkQ8MF0wOCcsOiQ5IjskTFkmUjBaJkJMXDIjOFUKK00pOipXRlkyM0JYQiU6J1MyOFpNJTExTV85NV09KVAkXSA5ICBHPjRUKzFYSihSJE4nUVg4JkI4RTAyPDgKK00lUTg0JCFIOSYxKDokUUw7IFEnOyVBUEMoUVRDJyJAPicxVDwrIyhAJiFIOiYxPDcnMjg9JVVYUDMiWD0KK00uQUQ1JyEtQ1EuSEopWytDLCMjIztLTF9ELChXLjdLNDojUFw9JFBOJDIoWCUyOFkyMyhUKCpPJksqSkgKK01HWT43PlhLRzhaTSoyIiIiOjYxPShQJFwgOTQgXl48TDAjXEwnUV0nKyJYUzVFUFgsQjA/KEFcQilRXEQKK00pQjhAKTIsQSchXD8lMVRCJ1FYPChDKEkpUlxJKVFUPidBVEApIjhDKCI0XDZCTDEmVVVXMCFIRTFCPT4KK01MTSRPKUgqWStTJllBPCE5RDw1LTJHWzE/RTRaMlVZKidRTFgwJDUiNDNQVSo2PlVRW18mU003N1UtRz4KK003JyRALlIhJyZWJFAuICRaIDgoIF5dJEYtQyxDJSEwXCkiUFQ0RURXLEI0PSghVEApIVBBKFIwPihSJEEKK00nIVw/JTFUQidRSDwnUiQ3J0JEQCZRJDIkQTA3JlFUOiVRUFM1IkAuJiYhWi9RPEAwIjk7TE00RyhYTlcKK00qQl8iPTwlKENMNF4uV1s2O1QoWzRFJFwnMURWL0NcXzNDMEspJkJQUiwvKlRNRzpVXVNCN0ZYQS4xVSQKK00mJUg/KVAkWCA4ICBeXjBJLCM4QyRRLFsqUlhfNkVEVCsyOEIpMihFKyIwSSpSREMqIjhGKDIwRCZCKEcKK00pIihDKDFAMCdCUEAnQTg3JVE4OScxXDolUVBTNVJIMCZGIVgvITQ+MFFFOVE/KFcoWEcrLTMnLjtcUFsKK01ELEhUK1dHOzszKE01JShSJjE0Ui5DSF0zIyBFKDZOW1RcVzRXLjdIWT5LVjcmUEQuUV0mJkVMPikgJFQKK00gOCggXl5cVTdTXEguMyBDNkZaUVAmWTgzQjw+JkFQPCgxSEIpUkg/KFI4RShCQEYrUjBAJyFcXi9YUi0KK00qIiA+KDFQQSlCMEkoUkhbK1RYRSdRMDAjIUBbJCE8MCtDLUMyLCxOKSNBOixTOlUuXC00RkxBOTUnLUsKK01DRSxfL0YoWjEjXSUwVDxcMFNQVyoyNkBTXVc6Vy4nPlctVzo7MkRQRDI0Qig1RSAuICRcIDRcIF5dLE0KK000MyA9KkIkNDQmTlBONjUwMjI0PiZBUDwoMUhCKVJIPyhSOEUoQkBGK1IwQCciJF8tNj1MJSEwNSUxIDUKK00mQTw8JUFUUiokPD4nISQtIjEoWCUhSDctM0E/MDxARydUKTkrUzJeKlwxI0VcQSoxNy1QP1QhIDE1NEwKK00wQ1UjMDQkWTAjME0pIj48VD4rP1g+O0NYPis4OlI4VURCLEAnVShPKVAkWiA0VCBeXiRLMiJYOilBVDAKK001VkZeUSY1LjFCSEUoMixDKiIkSStDJEYqQlRKKVJUSy0iREUoMV0sLyQtNCMxPDcmISw4JzFIPyYyIFQKK00qNEA/J0EsLyJRPSInQUA2LUIlLS9dPFInI0FFLTNDKik8XFZGPFUgLjZJUz8zJFQxVThCL0NEXy8zUFcKK00vQyBHKDI2QllPT1heT1daXi9HVDsyOFhEUjRCKDUsTikgJFYgNFwgXl5EWjoiUEIqMkBILVIvJVRGUUAKK00yIjg/KEFcQSkiPEEnQUhDKSIsSCtRWEgsIURIJ1IxWS4lNFsqQVxCKkI0SShRSFgpMjg/J1FUSCpBMEIKK00pUiUySyZMWilUUjFCSkRTK0sqXDAyRlU2TEU2QywtOzRDNSVFJChRLiVMUy1DIFUrMzBULCNEWioyOFgKK01OWzpRSzoiNkVIWV4yMzkoOlFARDglWFouICRaIDRAIF5dJFM3IVw7KCFcPytBWyFSJU0vL1IsQCkiJEMKK00pQkRDKCFQRSlCNEgrUVhILCFESCdSKV4tUzA+JjEsNScxSD4mISxRJ0FcPCchSEUpUSQ/KSFNNkxGRFkKK00pJD4lPzpYUSorSlovIj5eMkxJJUI8LSwwUzkqQTJYUi9UWEUtIlhTKlJYUSszJFApIkBVTksyT0pZXjUKK01FOFVYMTMxLjtBREU4NTxJKVAkWCA0OCBeXihUNTIgPChCJEEsQU8wVjVRLC9STEsrIkRLKyJcSSlCME0KK00rQlRPLSIsTS0xWE0pIjIrMTI4MiYhODYnQUg+JiEwUidSID4nQVBHKjEsQSlBUUJQViw+IkFZRDZKLFYKK00rOzssMVJHKjEtNFhCXEEiLVJJLEBSMEYwNFw7LCJITylSRE8qUlRKKDIwVVIsOyFPOlZBSDlGMzJDOTMKK007QUhGOEVASCkgJFQgNEAgXl4sUCpDOEIkUVRQMVJfJFRGRTszQjQ+KiIoPykiKEonQjhGKFIoQikxPDIKK00mQUg4KUFVUzckLFoqIixGKTIkUi5CVEEoMVxAJzFAWiZBQEErMjUkPCdKR0lYXigxRUxHKVpGWjYyXlgKK009TSU6NDwhPzYyKSFEQ1hVJzU9IzA0ISsuVCRWJUNQUipSIFRLTFsyVC0zNk1KPzhWJkFJKlI1WjkkTFoKK00rQCRXIDQ8IEgsXEwoUlhAI1FETC9SSl9SJTkpMFIkPyoyLEAqIjxPKFJIRykiLEIpMTwyIFFDOClBOVoKK006M0BJJ0FIOSZBQEksMlBCJ1FUPSZBNFQlITRAKjIxKj1HMjFCJyFGLCVIQig6Xlk1IlchOl0lKzNLWTAKK00yQi0kQEJUVShESFUvI1kpLjNQUyRTOEcpQiBTS0xbL1QtIzJMKi81VFY5TytCOV86NDRLJzAkVSA0OCAKK01ILiRRKEMoRSUhWFEwUkMsVjVBJjBSREotIlhLLCJQVCojKFIrUlhJKkFQNyBRVzgqUVYlPUQ8UikxWDoKK00mMUBJLDJMQygxXD8nITxVJVE0PytSLTNBNlU3MiMgWipHIFcpKzswODJfLTpNSSE0LCEmL0E9JkEiMEwKK00pNExMLjNJJSxTPFEkMyREKFFMUExdNzlVXiNEUDsrT1dGTVQrIj4hOlQ4SSZAJFEgNDQgXl4sSidSNEMKK00mQVhHJ0E+PlVEWSsyIyRAJyIwPyhSUE8pUkxEKCIwRyUhQDknIUw7KEItRytZIzA5UjRMLiI4QSdRXD0KK00oIihGJzIoW0YqJS46JDIrS0YnR0RFVFJGS0hRK0oyTz4yLlBDPFk1JUhBOzUyQTNHJDhFMyJAXDEjSSoKK00wUzhWLDMoUSwjREZLOU8kO1g2SDY0JzBSWEhaLzFWIjwyRFQvUCU4IDgoIEdNJEAmUVQ9JUFIQyYhNj4KK01TVCxcLkJIQCciMD8oUlBPKVJMRCgiMEMkICw1VkE8OChCJU0vOS8lNlFIQSxCLD4nIiA+JyFQPyYxTFMKK01EOiUvN1M+I0pFSz1ANERKRUwgTCoqRk48Qi5ZRDw9LiUoJS0xQlEuQkMoQzJSIEsvM0EoMDMkUSsiVEsKK00qUzhFTiovKT44Vks2VE80UzhMWi4hWio+MjhIK0AlMiA4NCBMPVhIKCIkQiZRXEgmUUZFVkQsXDAjJEcKK00oUkxGKyM0WCwjKEspUkxLJTE0OychUEAqUi1SMVonMjhBRD4sUjRAJ0IsIyg8PEYnQVBPRklQVjEzSjMKK01ONidEP0QkTkZcXFcqWzpdPzJDJUZcQSwlR10jLkFVLENSQD8yQVhILlMxIi5SWE4qMkhGKiMwRFBLP0AKK01CWiJbOFUvRlhJOFUsUiYwPlI4RSpQJTMgODQgXl1UUCwiLD8pMiBTLkFIUFY0MS4xQyw/KCI4PywyVFEKK00nMTxDKEIoRCgxXEAqMkhGKSIpQDZRUk49MlhDKDFcPSgiMEMoIVBDKCJQV0Y6UkVHVTVISjYnLkU1NSMKK01ELCBYKkhaM0MxTlMrLDUqN0NVMjQxXSJGU0VEKTQgUDMjUSUmQVhVLDM4TCpDLFtKOScmPCdaTTsoRzQKK01QQ1xXMUNSIDdCQFhBQCUnIDswIF5cTEYrIUw3J1FITSwxMFBVI0BfLiJQPygiOD8rQkhOJkE8QyhCKEAKK00mUUQ6KFI4QykiLUU4MVZHOzI8PCcxTDknIVg9JkEwPyciNE9GOkY5QVNNM0dFWy9DRE0iQ1w4UykpLjQKK01CQUZaLCtZIzcjOScyUkUoRSJdPygjOEIxQ0kiJVFEUCsjJEYpMyBaTSlHKz5IQlQ8WTc3T0NIUjFEJi0KK005UkRNPSAkXyA7JCBeXUBOLDFcOyhBVFAsMTxXWFNMXy9DLEYpUlRGLUMoVihBWEoqMkRFJ0FQPSoiTEsKK00rMjFHOUJCUjxSOD0oQiA+KDIsQidRSEUoMjhLSEo9XDckIUlLVkM8QzNMV0NNNF4pWUI/RUFbJi5LXSEKK003QzBcLyFdJUUyRTwmUlg4LzMxICYxPE0qMlhBKEJYWU9KV0JDKUMgP1pDR1NENE8wNC4tOTJITT1QJSYKK00gO0wgXl44VCkhSD8pMixGKlJdPlQzWF8zJChGJ0FYOytBQDQlQTQ7KSIwUSgnNTwoUiBGKUI1Pz9JLEgKK00nMUw8J0IgPSgxPDsmNF4sM0I1KTYsN0FSMlUxVi1TOEo1OFQ9OlklKSZIRkMyPkYmRl0tKVRZQDNBSDIKK00rQURQKSQgXSsxUSwlUihRLVM4TypSTF9KOT8qPVcuTTZURzpUXEUkLlFZOitCTTExUCRbIDxcIEpNMEoKK00oISg4J0FQPydCQT5UIzRQL0NMRidBWDsqQTAwJEEoOykiMFEnNyk5J1FQQylCOUFAKSxFJlAsOlNBUDkKK00nMSw3JkUqKjJBWSE3LCsxTVFRI1NNVzZHJChDO0sxICdGTEtDQi5NJ0ZBJidUIS8wQFQgJVA8RCZTME8KK00pQUUpJSFUTCxDJEkpQkBeTSlfL0A3TlI3VSs/VFxBIC5CJT8sIlUpLSAkTyA8OCBeXiRSKTE4OSdRVEAKK00nQj1FV1M8UDEkKE0pMjRCLCFENSVRSEIqUkxWKTdZQSkiJEsrUj09PylITydRRD8oIig/KFFAPCc1Mi8KK00zUVxdNVwjM08iLSlVPktKSVRIXD1cLSsoNlBQRlJGWComRSQmUz0mL1EgKShAWEkmUyRIKSFFKSUhTEkKK00rUlhEKFI4XU9LL0ZEWFshOjVbTlktPSUuMi1BKlJFJy0gJFQgPSggXl1BJilCQSIxNVxPLFJBI1NUQTIKK00xRCQ/KCJESiVRTD8nITg5J0IkREBMLTopIVxDKiFdQzooNSYnIVw8KDFcRCk0PilEOkBRK1g1IDkrSz4KK01UO15TVV1PNE1VOEQ+OkE2J1FOKC0yKjQ+M0RcMTU4Qy4pWjA8NEhNL1IwQiVRWERKUyxTL0M0TilCSFMKK01LKT8jPVZaPzsnNzZTKV5SKiJYUComOF4yMCRbID00IF5cMF4oIVxXLkUwRiohXSBTU10jLjNMPCgiREoKK00kUTQ5JiEsOSdCJEhCLEE+KEFMQCoiKUM5SDUoJzFUPCcxTEAoREYuRVsgUSpXWFg5Szs2VSwuUVQ9TzwKK01NNSBEPipVMychUiouMVo5PjMkVC00NC8nNjEuLiFMMioxJDckUUBBSiJYTi4yWEgoMjxRTUlfJkA3MjsKK006R083U0leUikySFEpRjhULVAkUCA8TCBeXTElKFIkVy41LEYqIV0oV0QtIy8kIEQqMyhTJjFIPicxTEAKK00pMkBQRD09SilSJEgsMjE+OEhJMCghXEMpMiRGKkReMUcrMFYsJ1xUOStPPFUrVktVLlNSTjNcNT1bST0KK00nQVYwMTIuRUBCXFIrM0goKTZJMS4hQDorUTA3JiFMQUoiTEwtQlBDJ0I0U1ArKz5EWDZNOygrRFhbIlsKK00pUlxUKCVcTCxAJFAgPSwgXl4pLS8iVF0qQjhHJiFMT1Y0SSwwVSBHKDFcRCYiID8pMiBCKSIoRjgtKVEKK00oIiBFKEI1QjhRRlgnQjhAI0FBRyZJSldMWlxTKDFdJTJMP0JWJTU8Vi1fO1BUVEstJSVHJ1YsPyhSMigKK00tVVUsMzI+ODlCUD4mMVRTQCdEPigjUSNUQyBUMCNEUioyUFdKS1c2QFczLzVSLiVRUy1SLlMqT0QkNUgKK00yQCRUIDpEIF5cRSssUVhQJ1FMPSQxLEdVNCBdLURIPiciLEMlIVA9KEIgQikiKEo5TS1PJzFURSkiPT8KK003QT5cJ0IgPCNBMUMnSiJfTisoVCdRPFo0LC83VVVdQFUtXz1PJCRELUUtRyc2PEAnUVYnLCRQXTIgTUMKK00tQSAsJCE4OTVVKC8oIzEhVEJETS4iWEopIkRVTCwvOEJYIyAzQVVWUVMhTC0jIlNFVDE9LiAkSyA5VCAKK01eXTUnKVEwUCdBSEQmIUROWSQ8XS1EXEoqMlRPJkIoQipCPEkqUkRUOT4iISkyNEwqQk0/NjFTKCkyLEIKK00lMUVIKipfIVEsIFUoUUxXMzxHRFlGNUhYXytTUTNQRS9FRUwoNyRLKTFaMyw0JFkvIDlGLjFAOydBXDsKK001VSgvKTJZI1ZSSE4tQkxGKDJMWk9dO01HSDc4MCJZVlVDQU8tMzZbRCQlOixQJE8gOjAgXl1EWiohXDkKK00lQVhDJzE4TFFVOS8zRSRFKEQgSzMoVE0oMVxEKSIkREEtLVsnQiBEKTI9QzcyMi0nMVRCQVlJMCcqWiEKK01KLTBSKFItJC47TzRUNDxWUU1TPVJEREEqIlxdJVFIPidCLVAxNj0zMEMqJCcxTDYmIVg9JUQkPickTSkKK01UMjRTLkNIWyszJD48SjcwPlY3LC1SQFVPMkklLDMmKz84RU8vQCUpIDw8IEFMJFUoISg3JFAsN1xAWEQKK01RJFEgMDRMQidUJEwzOFxNJ1FcRCkiJEhCTTFZJlFURClSRUA2IioxJzE8PkMpTTAoKyojSTxcUCgxTFkKK00vW18zVURcWFA9Qz9QU1Q6KkMkXSUxSD4nIVVSL0U9JTBBOTYjITAuJCEkNiFCTDUnJC0nVDFcTSxTKFUKK00qIlg8PlpXNEE2VlYqMVhFT1JAXyozJjVBKElGKzAlISA7VCBeXDhSJyEsOyRRODwnIShKVCUtIDA1IEwKK00qVFBXNik8VCkiOEsqUkBSQj4mKyhSNEsrMlVANFI+OykhSENGKjk3KytaIUtdSFIpMVxWL0xHQlhVJFwKK01TLj9VUyNAOyxDPSImMiRFKCIhWi8kPFsuMU1JJTEsMiVBMDciQyQ5KTNdKVVCIE4sMlhQKTMgQUJcJ0kKK01GJycrJVI4P1FSVSQrM0I/QThVRipAJSUgPDAgXl4gQyYhSEEpIyBbKkMxOVNUNSo4JTBGJiIkX0ssSFwKK00pQVhCJ0IoRUEtIjAoUihBKSJJQjlSKjk0WVI4TCkwRSk0Qi9VPUBNKEI5JTA7KytXJTBVOClXOFMkVEIKK002JFQ1KDIkPCdRXSw0JjE2LCJWITVTUU41VVwyP1ksIylEUStUMiROMVNMVyshVDk7KissPSY3Mi4iXF0KK01HQkhdLEM6JTxXWUMtMCUgIDtUIF5cLDwkMSA6JlJAUCkiVTFTI0xbNFRYSCUyISVMXFxeKEFMQidCKEkKK01CTSYuKCFcQSlCUT84QiJCNilaPE1ZOEMoREIyVE0sTighWFowKzMrV0VIUzY5QzdRNCQ7NkRcNSdRXDoKK00nMVUtMjUtKCcyTjI2Q1VVODYoOEA5JCYqNDEqVEFYTTBDNFEpUUg3PUpPNEAmXl0qQjRQSCJAVyojQjQKK00+N1U7KjAkWiA7PCBeXUhFJiIkQSZSKE0pMlk1VUQoWzRVLFAoMlEuT11RJioiLEkpMkRTQj1aQCoiPEgKK00rIyE/NzI2UDk6OkZQWVhIKkU+NFdOKE8pIihXLztTOlhFNFU4Ki9NU0NQPDhFNDooUiQ8J1FdODIkOSEKK00pU1ZLPUVKOEE4MEtFSjw0LVQpKVUxUEwvUyBMKSFQPEIsJ0pFNz81JiJQQ0kiUFwrVCJAQEhFPylAJFsKK00gO1AgXl1AUSlCME0tRFhAKkMgXCYkKSo2NThBKzIkPkBMNS0qIVRDKFIkQkEtIjQoUihDKFI9TzpCLiUKK01JOzJQTUosSylDNkpULVBQKEIpJTRGJyo+V1ldOlpDPlUlSEEoIVxBJ1FcQSgxSFcwVV1HNTBQPylRPD8KK00nUThCJiI8QkJUTSlTUyUsJzJJJyxUPzk6WisrPUZHLy4iUFxDUjRUKlNNWz9YMSosICRGIDpYIF5bUEoKK00nUVRCKkQwOikiSFYmI0RbMkUgQyshWERCXFEuKUFMQyhSJEZCTSYyKCFcQykyRU45MiYxSztOWU5aLEUKK00oU0JQVC1MUSghSFozRVsnPjdVWzk6L0FTNFg6KEFcQScxUD4nUUxXLlRdOzNALDQoMEg0JVBUOiJRQDoKK01CRCkoVCJZLiciNSErRC82PipPM0EnMlsrQjRRRCI4UChTXitBSC0kKTAkQyA6UCBeXFBJJSFMQikzUDMKK00pMkxZJ1NUWzJFLEsuIkhLRV1BOSpCIEoqQkBQQj1aRCoiPEoqUl1NOCI6RFAsPyVSKkhIKTQ6V1deSFQKK00pIVhXMUY7Mz5XSVU6KltTViREOSoiOEYoMVBAKDFZJjA0PTYzIFRLLEE0QSlRREEmIjhARUQxJ1QyUSwKK00mMiBcKjRDPkI8J0lGJ183JyJQRkQyRFYqND47RDklKShAJEMgOlggXl44UzYjLFMvM0QxKVJdPVQ0IFwKK00xJkBFKVFcQC08PTsnUVRAKUIoR0JdIkIpIVxDKTJZRToyJiFMRzlCVkooRSgiVk5RLUhUKEIxIDE7Ll4KK01YVzk8OFpTNFU1KEEoMjBBJ0FYPyghUEgzJk1FNzM9T0UjRD8mQThaNDU4SEhFWSZUQyBYLSNIXC0rTz0KK009Sk8rPVY/My9SLF86IjROKVQxTD1ILSsrICRYIDlQIF5cWEsyMkxWMCNMMyszLUFUQ0RQLVYwQikhXEIKK00vLE07J1FYQClCJEhDTSZCKSFcQykzIUc6MVYsTEdRR1VKJEYoIy5UUi1QVSghUFUxOy5fWSZJMzc6TzoKK01UJDQ6J1IoPychUD0nQUhHMUYhOzMyQT07QigwIzBEOSlTMEFJNTUlVFJUWi1TNFEsK0s4P1sjLEFHJyAKK00sUUxVOUI8TCgkOVk/OCkkKTAkVSA5UCBeXVRHLlI8VjBDXDsrIlU5VTNATS5GREwrQjhGLz09TClCJEcKK00rUlRVQ01aUyoyMEgqQ0FFOEIqOVBYLUlZOlRJKTNCXVUuMFgpIiBSL0wrLFtXJSc3S0dJWTQ0OCkiOEMKK00oIiBBKEFYVTJVNTExUkFAPEIsMCMwSDsrI0Q/SVVFIlVCTFgtMyhQKiw7R0U8R0VHR083KCIkTzhCNFEKK00oNFooQiklKyhQJFUgOiQgXl0gOSdRRDctUzRNJlJWIFEkSSctU0RDJ0IwPycrWVApMVRAKkIoQkEsUk4KK00pIVxIKlJRRTlCKUE3KC4pVyo0SygyLkBNXVxNKDFcXjBaWlBZJzlBN0pHLlVUUEkoQiRBJ0FYPyghUEEKK00zRU1MNkRYXzNGLU8/KUkpQlVVK0RVVTBVMzxSMjNEXSxbQzo7KkcpO0Y/MCxSPS4xUjhUK1RJQTkoJSQKK00qUCRfIDpIIF5cLDwmUUxFMFQoWitEKi9RNDBeK1NEQiZSMEEpLC1QKSFUQCpCJENBXFZOKSFcSCpSWUcKK005QVlMNzhKL1YqMEwoMkpGTk4gTidRPFMwWlpQWTZBNjVaOzVUQ1xCKCFcPychUD0nQUhDMlUpRTNULFEKK00sMjxKLUUkNTdTVSFFJTEvVUMoUTJTKFIrWz81PDpPKTxGWl0pUV0gL1IsTCkkQUo6WCRdKSAkXCA6TCAKK01eXDA+KFE8Py9DRE0oUilJUURFIC00IE4pMkxFKCxCIyxCMEcsUlRQQV1KXyoyME0sIzlFN1ItVjpIUiwKK01ZWyBPKUJOTVIuTFEoUUxQLyteX1xGWSk1SytBWVNcQCkyLEMoIiBBKEFYSzI0OToxI0RKLEMgVC9VTDgKK005NCRZRTVBLFYzIFAyMyBRKVwvRD9MIzxBRz80JSI0Vy4yJFAoNFFYPUkpJihQJF4gOzggUVxIVyxTITAKK00wUT0tLzRKQVM0XSAtRCA9J0IgQTIsLiknMVRAKFIsRD4sRlcoUiBCKSIwXTkhWUU2OjY0VjpQTyhBTkMKK01HLTxOKFJBJy9KVjZXVk02M1o3L1VESEkpMjBDITIiTyVUXSxEOE0xMyUpXzNDQFM1N08pMkhNNDFMNFcKK00rKUkmMFNOU1YmUldTOE4vVkUwSDMjQUowM00qSEVCJy5SWCEyICZEICw/JDIkKSA4VTBJN1RZOks9JScKK00tMkheJzFMQChUXydCMVQ9KCIsQik3TypNUixAKEIwRi9WMDo8JUZLRj02SywiKEJKOV84K0IkQC8jWk0KK01FTV09MjQ+QFUtJF0oQixCKDA0PktRTTAxOEopM1Q9KD5EPE4pNTVaUDNaKTJUNyYsIkY5L0NAV0xNLVIKK01PTSovRTw9KCgkKFM6M1RUMypFOEEjNEggNDQhSSAjJ09TWFYrVFBZIyNYUy8pQzkyUzBNMFI4RSlSPS4KK01UOVBGKEI8TCtDKVtVXEBIKTI8SStDVT0nV01ITElPRE1TLEcoOlpNWTMsRSkjRFlQKj9OOFNBI0peJ0YKK00vMiBIKUI0JShKXEM0M1IoQlREWzAnQSYqIVEsPjw8WUJUXSJSMlxJRiNQVytbW0I9XEc/RjlLPi0yOFoKK00rRkEiLTUqVTc5IFooMCUjIDpEIF5cXFI1V0hMKlMsWS81MyVURDEvNjRIRylBWEg1TFY4KEFUQCkyLEMKK00vXEJbKFIgPygyPEsvUVk2OygqOlZKXEknQVpBQF0wWSgyOTIySkYiVihNNjs5QylVRChXKUI0QCgyIEAKK00nUiQ8MTU7IFhWPTQ2WCJSWyY1UEJdQSRDRT0mUkMgUENDXFguS0c6TipST0soOzcwIkRRPTkqKz5XTToKK005KTBNMVAlJCA2TCBeXEElO1hcXysjSSQtJCsiViNNIDI0KEQoUVhKNy0iOChRWEApMihEMTxCWyhSID8KK00oMjxJL1FJPztYQj9WOlhKJ0I2SUFdNFknUiEnMipSIlYnVSg4STMuVSM8UCkiLD4nUVg+JzFcPTBVIlkKK01WNTkiMjc6SVc1KUFATSxfRCRZJVJSREpCIzBQLUtDNlA7RldMKFckLDIkSz4pQis+WCVANzkgSjBQJSQKK00gNkwgXlw4TjMnNEgoIyRXKiNfKllTTFwyVDhOKzI8UDhdWkkpQiRHK0JYUTEtPywqIjREKUJYSy5BXU8KK00/WSZEWitITShSMk9EXiheKFItJDErUjNZWCxXN1lTOllDOE4qIjxCKFIoQigyLEgxVScgWkVUXTBHVlUKK01ZVTFBQy4gXENFISJTQkBLQjMsTitMM0ZUPS83UylHOShSNEY+KVYwQChBRzcpNEgtUCRbIDY4IF5cXEkKK00tU0orQkpdK085QyxUJF0rN1QsQSkiNFA3XC49KUFUQipCLEBALEMhKDFcQylCPEgpMVlAPlcqP1QrWEsKK00oQjpHOj1YVSkyNUA0WjVEVykpODpJWjhVRFhcKiIwQShCIEAnQiA4LSxOWFRWMFM0VzYuVEVVVTwtLTIKK01CVkEiUDJUUUZELF8tSkpbRUlKMkVXSzcwMkxXPUs8Vik1RV9CWS1SNFAlOiA4UCBeXUxKK0NZXjBXTEwKK01CRUMiVkQ4XjRDUEMoUjBUOUxCPShRTD8qQjBFQVxPISgxXEMpQixEKDFJQ0AnPkFUW1xMKCJCVjs9WFUKK00oUik1MVpNR1ZYRSo3WU44VlQsUSlCKD8oIVg+JyFYMCtMNlRUVTRJMVZaLlM1JU47PFknQlVdIVAyOEoKK01EM0BaKypOWUhKQj5JOEsoK0IsVT8sLFUoVVolQihdUTRQJTogOEQgXl1YTSwjQV85Si0lSkdPM1skSF4KK000U1RLK1MgXjxNPkwqUiBHLFJcUUI9VzIpQjBIKlJASSlBXVNDJ0pHWDxITykyUyQ9PjxaKVIxMjErSVUKK01aOTUgNyouP1okLE4qQjhDKSIoQigiKDcqPEpcVyUkQTAmUjdXJFlMPV1VJEFGJF5RQjxLRFM8VylLQy0KK01NXDJbUDlPNCtCJFlDPUkhKVYiJEIpMVAyQCU1IDg8IF5dXkBUPSkxLFNMSD45MyRVJT0kOCYkQCgiME8KK008LCJVKUFURCpSNEtAPD8jKjIkPikyODkoIU0hQTVOQVJMRE0pMj5INE1MVykxWS4ySU0uVVpJODdVPVoKK01URUhbKEIsQShCIEEpIVxBKyRaOlM2KF00VjYmVyVBOzctIShAVkEtVjM0VUZUQSUvSkJOQkdWLEUnKy8KK00vQj4gPzw0XSdCKTs7NyFdPkAlSSA2JCBeW00uOSlRKCYzIE4/OEcoVkRcVzRVSEInUixTPVw2VShRTEEKK00qUjhQQixLIyoyJD4pMig1JyE9JEJGIkNTPEhOKFJGVzVNTFcoUU0jL0olMVVKJS01VT1aVVRcUCgiJD8KK00oIVg/KEFUQyw0Wj5TVSxTMVVaJlVUUTQ2PExdQFVdLFYyWE5EQ1UgLSpGTEQ4QjRHV18jLFI5X0A8TFwKK00lQV0+O1clXj8gJUsgNiAgXl5CKElMPTwtNDxVQjlLNFs1LFc1JUxKKlJcXUBdMyQqUiBJLSMkXEJNUzQKK00rQjhDKkI8OigxUTRFRi5JVl00USoiVyU3TjBcKVFVIC5bIT9ZKlUiNFVaIVkkXE0pIjRDKSIoQylCJEsKK00sVVZIVVRcSzAlUi9ZREUyOF1IWj9GJSlXQlxPRSNQXStLOyBKSipKTjhbKiwiLi1EXVkqJyIlPDpXMV8KK009UCVHIDVUIF5dOUlWLVUtKyMpIDlXVlpTJEkgMSVQPylSQEY/TDZWKUFcQCkxXEU+O1chKSIgQScxTDUKK00lQUhSRUQ6PlMsTEwoUlJHMj1EVSkhTFE0OSUhVSstMTg5JilVVSUmKTI0QykiTkwoMjk1OldNOFQmOF8KK002Ji1UV1UxODY9MTJEV00pUSNIUkgzXSAtKVY8PVVUVT5WIygwMlk6LjJIVihTQVY8STVDPDAlMyA0XCAKK01eXDUoTT4pKChCOFU8WFZfVCQwUy1VNEEpQjxKQTxKVihRVD0pMiBKQCwjISkiIEEnMTwxJEE4VUZUTkAKK01TXFBNKDJaVjM9RFUoQUBGMTk9JFRaUSg2WS4pVyQ4WyhSLEEoQkZKJ1IxQD5YPUNURTxVMyVRVFZEQTEKK001TF0nRFcpKFEjLEtGIzBbKklaOj82MFtBJkJfL1MtOy8iUFQnMz1YOzk5Rj0wJTYgNTQgXl45TlcvTTUKK00qMkRVPkk3K1kkPFMuJThJLEMsVEQ9RyUqUihFK0JMVkBNKzIqMjRGKEFQNiVRTSVJVFpGVz08UClDKyQKK001PihaKUFIQzBKOTJYOzxcNUlGMFo0OFgpUjxFKUJWTihSQU1AWVlQVkUsTTE1SV1aNDUvOC1ZJENHMSUKK01SMzBMRkMsWCkqTk5DRyEiREdPKzAzQUYvQkhWKCM5VDpJRUg8ICk0IC9PNjFdKzc0UjRGMEY1V05cNSEKK00vRSUuKiFcSCooOyRQQjRAKDIwRClWLyVPQjhAJ1IsMyRBNDcoSiBaSywvMCtSMFJJI086L1IwPyw0WjcKK00pLSJeNDYuK0UtRTsyUixFKVUxRDQyKEkpJDE8QV0tSjc1TUA6XVkyODQnMjQnMU8yWVBbLEpNJC1TWjEKK01INUkxOFYpR04sQlw3WiRJLlImKDpFVU89VTghMlAlKSAvTzs0PT8uNEMkSC5WWiVPLERfLDQxJypBWEcKK00rSFcpUEIoPidCMEYrNkcoT0I4QCdSLC8kISQzKUo1IUwsPzErUihUTFNfOS8yKDspRC48Ki0mWTIlVjAKK01FLVkwMCIkQyk1KUIzUVhHKUQ9OEA9IUA1RF06Ol1FJjZTWy8xRy1IMklIVisqKFksQzIyR1VdNzo2SUsKK01MTFJfODokQy1SMi47JTVQPyVEIjQwI1taJU9EWEVYVCskMVpDTEc9MDMlJDIjIEosUz44Vi0sSihSOE0KK00rQzlOVkxcSykyMEglITA2JiMiUjBbSzNXIzBHLitdKVk0KEYoIi0iSiMzPlFDUTZFOU9LNCNURilSRTYKK005VSxDKlJJJzlYMzg2JFUoNTczRjBVMSZWVCFQOjQ+Pi0iVkYtQlxOR1slSzcmQU4/PC82VDc6SikjXEYKK01CVj0xPDdZNyA1ICE0UCNbUkUvMlJWJFEuVCVbO0pXJDM0UTovUkxFKTIyI05LVEUnUihDKDFdNUtLTEMKK00nUVRDKFFQQSpSIkE8Kj5cVDJUQSxZMSVWNEBHKCI8VEEjKzFQJik1QzlTMDg0OEsrSjxWPylERSghTEoKK00rQV8qOTVZPDdWQzgzVTBUUURVJjhEVS8sUyJMMzQ0WzQsNi5ASjlDL0QoRyoqKEcqNEVZRjZBWD9IVV8KK00gNCghNCAjW1RVQzJUJiBKLFNCIj07KywxQ1UrLUJARSpCSitQPCBFJ1IoQygyMTtMXCBFJ1FUQyYxUDkKK00oMjJGPlpPIVRSVD8tOjEpViQwQychWE9BM0s0TiUxKUNZUzQ1M0xHKko0Vj5ZKD0nIVRNK0FPJTg1PTAKK002VkMzMFRMUlFEJSc4NEErLDJWRDE0IFE0TDItP1lVPS1TVEcqKjxFKCQ+JEkmUVQ9SEIiIDQ0ITUwI1sKK01YVj9BWTZQUS4zUis/S1tAMzNNKS5DIEwrUl4vUz0oTikiREoqIj1EUExQTSlCMEooUixAKiFeXT5cIyYKK01WUzBELzpJNVlUSEkoQiBNQiQjQlI0TSRFOi9GNyNITSwqSFtBWUxBKEIsSy1SIzA1VE0pNFZXPjAjXFQKK01TM1EqOCQtMCsyVkowM0xJNk0iKj9ZXTYrQ0xOLDswSigkUidJNj1MOFg6IiA0PCE2QCNbT0VTLFJGRFEKK00vVDU6ODlbJTtFNUgzQkBGKDJNQE1LXEInUVxGKFI0XicrTEInMUxEJ1E8QioxSk45WjpOVFJcQC03XUAKK01TJixHKDI9JDA6PydSJUFFQilHLT8lKEUpWjYqPzk4Rik3LTpPOypWN1VJQDUmUzw2VFokVFRIXzckOE0KK00mQj5dM0RNI0FdMVc4VTU9PCJcQikkSE4nST4+QDZVWkMmKSsgNEQhM0AjW1ImKy9URkhNLiNVQDlaKysKK005RDE3MEI0RilDJUhPPChCJ1FcRihSPSIoK1xCJzFMRCVRTDspQiZSPEpGU1UyXD4tWF1EUlVcQycxWF8KK00wSl8qUCRJOUJJRzE8JDxDKTo2LD9JJEAoRzE8TzsuTjU0US4zRlM3M1Q2IlRTWF42M1xHJiIyVTFEOFkKK01CPS1JMzNRJTciJD8pNDRHJkleRUFWXVY6JSU6IDRQITNAI1tWJyc9WUc8VS9ULUc7SlM+OzQtNjFSVE0KK00qUzlMUj0wSykiOE0qQlUqKkxMSykiKEspMixCK0IjLjxcLlhXMzhDL1k1UFZGNEkoUiBdMTs3OFQ0JTQKK01EKiNDPVQ4SCpKUjRCWVBFKkddOlErOlwzNCkpMVcnQjMjRiRWQ0RdNVNUSCUiMlswRCRRRD1dNy1SPFAKK00yITw9KUUgUCdaNlBDRlVONURBMCA0UCE0UCNbTlYvJlImXEEvNEU9NzQ2XzgkPVIxQjxEKSFVR0pMJEIKK00nIVBDKSJIPCdcJEQnQiBBJyFIQysxPkk5OlZEVTJcQSlGKVRUJkhGKSIxJS4qPzBTJi01PygvIENVLEoKK00qKi46PSk8TSg5NSxQKyJNOVYhNDRUVzY4RUIkUzRYRS1FQE4wQk8gNUNRIzxcWTAzVlE2PFI4RSg1UE4KK01PSSIjNDQpXTY2OTAgNDwhNDAjW1ImUy1URyhBLjQpQzhEPyQ3I1FGMCI8RCoyLU9MPDBCJyFQQykiSDwKK00nXCBEJ0IgQScyJDYpMVZNPCsiSFVSXD8qJylYU1Y4QighTSAuOl8zUSU1KT9ILyRAVEBIKioyPT1ZOEkKK00oWSkpT1siRzg1PSYzVFcxNUReIlM0KEMsNFxHMCJCWDNDPFk9PFUjLlUwXzhBUEUoNUBKUEk+KDRUKVsKK00yViE8IDRYITZQI1tVV0s5WTggSjA0RUo5VF8zODNFQzBSWEsrQkFTTz04SygyLEoqUyxBKSxQTSkyPEgKK00qIig2KjFTKjxcUlBXUzhELCdCJFdGUEgpQVReLys3QVU0USRBKEs2QkQ8TCtaXktBWihPKlpJMVJbXlgKK002JExfMVUrPDRULiRVI1Q9K1RcRi5CQl4yQyhRPz1EVClUJFE4MixOKiYgUlJKKiozU1VTLkYlOSA1ICEKK004UCNbTVUzIlE3MEMrRC0+KlFbJEBGKjs5IjhHKDIlNUQrXEAnMVREKiI0PDIrXEQnIjBGJ0YtMTdRXkcKK004KkoqVCJcQSgkQUVTOCBGJ0IpJi1aPyFTNUE1PSUyVEJVVEUpWUY/QUlYPylCTSlIKjk4NVU5NDYjWzwKK001NTlLUFREVyY1JTIyMlZZMiM4XjxcXEopVihQKDFUPSk1QUNTKjEzLzkhRjsnWiEgNlAhRFAjW1FFVygKK01TVzxDKlNdQysxWylAViI3OFI4RykyOT1FXChAJzFURCoiND4zPCBEJyIwRiU1QEQsIVJLOkpWL1QyXD8KK00oRTlKUydUQiZBRF8uKl8mUVRVKz1FMllAVShDKVlWREJZVDwpQjkpSEpNOjYlJSg1I185MjRRSVBTVFEKK00kREErMVJKUTAjJFY9PFhFKDU4RCcyIEIpVUVFVDpBMy9JIUE+KEImIDcsIUhAI1tURkc3WEg0TCxUNUgKK00sMjc2QUVKLzhCTE4rMk1BSF0wSShCMEsrUlhCM1xMTShSTE0oNTRALVFbJzxMPjRXI0BEKkVVVlZYNEgKK00oIUReLjs3M1YkLSU/RUcoQjRcRSsqRlNGSkxEKzMlIkdKVUIzJDUhMyQrRTFEKUtSQ0BKJDRBKTAySlcKK00vIlBQPl1IQyclLEkoQihEKEVJTVc7KSwsSEU+PDkqMiA3WCFLQCNbTlRKLlAoQEwuVDRBJ0JaUEBUMVYKK00+IkhFJ1FZMixbXEYmUVhJKDIsQT5bQEQnMixEKjVdODlRUkMyOjVMUyM0QyhTOE43KExEJ1ItKC8pOlAKK01TNUk+MlI8Xj9UXD4oKTZeRVo8SCkzWTI1SVBWKlVBPTcoUzg4JE1BTkQ0VzI0XS00IlJRNENYVzFMKEIKK00nOyBFKFIkOSo6OyZUSzUnPEUxI1RdMzEgPUAhV1AjW1FVJjJSOEBJLTNUQSdSUlZAVClSPDJIRigiITkKK00uPChIJlFYSSgyLElCO1REJzIsRChGKEkvIVpINEpJUVMjNEEoI0BUNlhMRCYxSSAuSU5ZUjUhMDFSJSUKK00+VCg7JzlDJUZKPEgoU1EwNSlYWipVJS80OEc0NCQlQE5TREswNEEoM0JGSTIzQFUyPChAJkpUQycxTDYKK00qKlMrVUs9Jz1FQF5VXVM5ID4gIVlQI1tTJVJGWDlEUS4kMEYoIlpfQiNRRjtSXFEqUjE7ME0gUChCNFAKK00qIkhPRCxESyhCQEkqVUBALyFSXThLPVRXM1hDKiNYWzlZMEsnQUhcLyo/J1ZUQSkzUikwQDQoPSlaOzEKK01KSzhRKVM5LDYqOFUoREEmNCg/QzRDPT9PQzhIL1Q5JTIiRk0yMyRRMlxMRShLREgoIVA2KTsvOFhLTSIKK008JShZWF5fTCA/LCFeUCNbTTM9SU04PEYwIzg+LkhaQDsjMTg9IiBCKDFcPiUsJEYmIUxCKiI4Qj9LTEQKK00nMiBIKEVZUzkxMkgsKT06UzNMQicySEw8SURGKEI9MTJIVkJSRjFAKlIhJjlTIEYrOTciQEZIQikzPTYKK00uSCxAJVVFMzRYWzA0VExELSNNLDMlNTMyQkJVMkNMXjI4VD8qIlxdMiY2J0Y9OyMzJk1GNEQtMEs9OzcKK00gPVAhVzAjW05TTUxPSEhGLzJcPS5ZIkU6Ij0oOSFUQyhCJEMmLChGJiFMQioiOEpDLCBEJzIgSChGMUUKK002QUZNLjlVP1MzTEAmMkxOO1lERichWScxWSZJUiVJLCdBTSw3UjBCKjk/KEE2SEIoUykxLVgkPyU1JScKK00yKE8sMFQkQy0yXSAxJFkuMiI2TTAzLFkyWEw9KiJcXTFGNilHPVMoNCZVRzUkOTJMTVc+ID4sIVkgI1sKK01RJDVaVSlITS9TODwvKTJRPCI9IjlCNE4rMjRFKCxcTSdSKEkrUlRQRFxQSyhCNE0qVV0+NkFPIjFaOUEKK01XRDBCJ0JYUj1aKE0oMVkhMVlOVVZFKSQnUTkzOTJESi4qUzlFV0RLKVJdLi1YODwjVE0gMVhHOzEzPEIKK00uIlBdMERRKzBCNlEwMlxWMjkgQStTQSIyJkoxSj5PNTZHLUgzU1kuUV9DWSA/WCFfMCJCTFI4OUQpLEgKK00vUy0tMUgqKUIjSTw/MjhBKSFANyRLXEQnMUhAKSI8PzxLWEEmUCxBVUVZSjhBUkMoWShWUzVAQykyWVUKK00wKiBDKDIpMDE4NSlURTk4K1RBUisjWEUqSFpLRFo4QykkITcnVSRFMiVBKzYmXykyM1UpOlMxIjImNTMKK00vIV5CM1NMVy01IkRTPUM9VDpFXjcsVzdRXEstMFZfNlVdVz4gPVghWCAjW0xCLDtGSUBKMCMlKzIoQiwKK01AUkklOzIsQikxSDwlK1xCJzFIQCkiPEdALCxBJlIkQSkmIUw4UVpIKzlAW1M1QEEoUy1bMSooQyZRRSQKK00vSD0tU0RRKCo0OVgoMyhDKVkmUUVKOEMoQ0UwJkRYQDBVISE0JlMlLjMtKDsiQFYwJVkuLkFSOjFCXFAKK00tJEpEU01DPlUqViQ5LSs7UlxPLzBHJztXTjNFID40IVlQIkJQIkxBSzo8UDAzOSUxKSY6Q0JRJDwyTE0KK00sIVg+JkxARyhCJEcqUlhNQVxcSCggLEZVJVFHOSIqXS1ZVF1XRiRDKiM6IDMqSEooIURdLzhdOVgkMSAKK00rREohKDM0SCw6JyBKKzRMKUM9LiYkWD4wJFBbM0ZLNC5SRSc7UjRTL0VRKy0hUj4xQlBOLDROS1ZeR0sKK01YS141PV4/TVRdOzMvVl9KXjAzXyAvTjcnUTFOQlIgWi9UNSU/J1pAMiU1QClSKEEoITU9UCI8PiYiIEsKK00pMiFQTUIoPCdCREU5Nj1HJzo4TT5ROyw5UjxEMCYtKEhSUD0sVFRRPUFbLjYlLVs1QVk6MSFQSEQ6IkYKK01LQixELzYgSShZMTMyJyk0PFoxMy5GVFstIzUqN1RIXywmVScvI1ksLUZaKU1FUzI2IkxBVExMWDBESVsKK01TTS9BV14gIVdQJz0gL04xJlExW0UiIFsvVCUpQFgmQC8kITIpUiRCKTFJQk9SNDwmIiBLKTJBXE5SKDwKK00nQkRIOEZNRCc6WFRAQVMrOUI0SDJHJS9JIlA3KkQsSj1CIykzNEFcNiIhLy8hSEZESj5KS0IsQi1FQEIKK00nSFUsMDY9KTwqLSMsJkhYKiJFIjYkNF0rNjUgLDM9Kiw3KitONisqM0IkO1UsXF4xRFVcU11HSVlOPCEKK01ZQCdEIC9CQihRRixJIjReMSM9JENIXkkvU1k4K0JUTSpBUUdSUkhBJ1I8UisiUiFRUkRBKFJYSDgmNUQKK00oTChfQFFPOjxCRFA0R0k6S1MkPCsjREk/Ujs2MkQ2JzdCQSwuQVhLRzsqXE8yUEYtNThAJyhRKjAmOSYKK007Sl0lKiZAWikyOSA1RCxXKzZEXywjNSYrV1pAVDc3ODYiQEBaPiUlM0RVXVcvQCRfUCddIC9OLShDRT4KK004MixXLiNYVj5WPlAvJjE4KUIwRCZBUUZQIkw+JyI4QikyJT9KMiQ+J0I4QzkmTUUmWUw7PjE6XUFRWDoKK00xVFk2SlJERidEQE0rQjlRMSRNPDUlLTwwIVBGSFk6PEkiPEMtNThOPkZFRTY0NTkvIjkrL1QxIisyQS4KK00wU0EkKkJVJjAjXF8qOD5KUFdfKC9SPEJVTDUhOzYmT1cuIz5XLVQhVzAnQSAvTiQmQ01MOlFcWS5DQFUKK01ARlJULTUpKChSJEMoMjFQUVJAOiYyOEMpMi1KS1IkPCdCQEM4Vk1EJ0pEPT4hPl1BQiA+NDVRPksiSD8KK00lNCRGKkJBUy5TTTU0NE0yLjFAQ0lZVkRJUig/K1RcRjtVWT80MzUqLyJNICtTOFYnQVUmL0M0XykiPSEKK00uI0BaKUk6TVQpLyctUVxCVFwsXzpFVlFYPjdHWT44IVkgJ0ggL0I8KkQlXT5SMSEwQlxSQldGXi1EXSwKK00qUkxPKyJJWFRDKEAoMlxOK0I9S04iQEEoUlBMOEYpQSgrSEU9UUMkRSJARjZWNUJOMkxGJjNARywiOVsKK00vUzU0M1Q1LC5BWEtMOkJYTVJURSwkWEQ7JVU2NTM9IC1SVF8pUlxRJyFJJC8jNFwpMkhfLSM4WClKIyUKK01ZWi8zL0I0SVpdNSM6JS5VXi9QJV9QI1tIIiRZNTYsQSsjNE0pJyU8RyM5TTYiWEEpMiRANls8TCdBUEcKK00oUjg7NFdcQCghSEQpJU1DOzIuPiZDSFtMWUBFKDQ0WzkrQEwoIlk8LVFEWTcjRT43JFEyNDRQPSdJXiMKK01GKiBDKENNPi43IUs7JVRdMyNOQywzVSErQjxYMDFYPS9SXEUwMzxbLUNKIkosJVxPQ0xIKVxSXjdTXVkKK01WTTc5WD1fPiA9UCFXMCNbRzFcXTg2VD0rQzxGKEdFQUgiWTsyMlA+KSJASDk7WEkmQURHKSI4PTdINEAKK00nQUhGKSVJQzshVkUlUz0gTTk8QihUUSc6W0RNJjI1LCtBVF84Iy0wM0Q5KDE0MDsnSjIsSCosPidDNTcKK00sNjlAOUU0TTBDVkkqUkBNKEIoVi8hTDouQkQ/LyJcVCwzPjNLPSIzT1MwPyg9IyE3I1VZWC4rRFk+L0UKK00gPjQhWSAjV01TJSk9R1xCLUNcRCknVU1LIyk2MjMkSCwjLE47PERTKCIkUCtSXEE3WFhHKFFcSis1RToKK006MVpRJ1M9I086LEoqNTUuOzw4TigiRTArQTUkOyNBKTE0JSIvRCA9KTsiPE0rLEkpIzk1KlVZPzc1RE8KK00uI0ZIKSFYRicxVFAuMUQ6LVJIQi5CTFIrUz48UU5CRFMjTEEpTjcvNkNGIFw/TCVfUCddIC9OLSdDKSUKK003IURWKUJURTdUUkcsRi03KzIwSSdBSVtNIjw9JkIsQShSIE40IVw8KFFIRDU2PUYoWSxKNEYuRkciMEIKK00zIy1PTzI8QSk0SSU+KEhDOSVNRTM1KUQ3UihHRUguLkQiLEIsNTk7N1VRS05UXFlGUjUgL0JURkAlIFgKK00nQ1kpKFNASC0iWSMwN04/TkZaWkIzJERRSz07Oj0nO1ZdXz1JXVAhV0AnPyAvTjEoQ0ExOUE0WCoiNEMKK006JSpKKkUlKCpSJEgpMiolTlIwOSVSLEIoUihZNUFcOihRUEQ1Jj1FJzlESzUmTkpGUiBDNENVVE9CQDoKK00nI1kiQChYPTckXTcxNDk2NTIkSUc4UjZEUVg+KyUhNDU1JUVMU1xPRFFcVStBWEBAJShaJlNBJCczKEMKK00rIjxeL0heRlJYOyNCIlRCVEtVNzlcUz5ZXkM+ST4gIVlQJ0YgL05GK0NdRD1BSSAsIkRFOiVOWCwkWSYKK00sIkxULCJCLVFCWD8nUlBNKyI4WjdSOD8qIiBNNFVZQigqSFg2RyZUSVI4RjY0LVZSUkRBKCNFIEBJQEAKK002REEtMDQtLDMyIE9KOipMSFJERCpERSsyVSE8TVQkSUVSKEspQUhBQTRYVSYzRSEnQzRBKiI0XC9JRyEKK01ZKUczRUMsR1lcOS84PidWX09fW1BfUCJfUCNbR0FITi81SDYqMVRJJlQ1IUxSPVU1IyxAKkIkPTdKVEkKK00nQUhCKTIkPygjKDsnMig/KFUlRjkyKio1VD07Rjo4RihDXEc7S1xIKDI0Vi5FQEA1NTkzNiVVPDkmKEUKK00oWFo5QVMsQCkjJSk1Vl5LOSMlITFCQScwQkBDQUU6JkFXXF41QihNLzJMWC5EKUdGKkk4SShUSihcXycKK000RTE9OVZRVzxHTz8gPVQhWDAjW0khWFQyRiwyKjFUQSY0UShNQVlEMiMsPSlSQEU5OzBJJyE8QilCJEEKK00qI0A4JlIoQShVIUY5IVo0NzUhRkdKNEIoJDBNPDwgSScxVE8vJVQ+MjRJKTM1KTA1NTxEKik+RUNTOD0KK00oIlkjNCY+QjcyTFQuQUBXLEIgQEIlTi5CV1BZNDFURy4iLFItM11aSFtNUEs5KEooXFZaLjNdJDRVUUcKK005RztCID5AIVpAI1tMUjhZNVckOCxCOEgnNE0xUiJBQTEzQEcsUyxLO0tcUigxXEssMkhHKkNcQCgiPEUKK00qRF09ODIuRztFUVBKSyxHKSREUjxcTEwoUiRDLkZIQzEkLSEwVF0rMlRQQSs6PlpJNDBHKUJYXDFWLkIKK001IlhVLTFIWSpBUEBDJj4qQUdQVzNBTEotQVxNLFNeJ09NOiNROiRRKk5HJy0jXTA2NiFLPlhbXCBPXCAKK01eWSg9K0MxNSRCOEEqMiBWLCssSjY3IEUpIjA8JiVSQSsxUDcpIiREJ0FEQyUhVEQnMihfOjZEQUA0OEYKK00yV15HKDFcUitFXl4pMiBCKENZOTNDSTk1NVE1NlUtPiohVi5GVT1XJlIwQy9VKkdIJUktMENJNDBCQEgKK01GVD4xP0VDOTA1LEgtIzBWLUQhJDQoOjMxKVRGKEIvM0xXRS9YLidCV04zNFgwKzsgL04yJyMgXjZBKEMKK00nMjQ+LlM+VSlEWUQqMiw8KEFZQ0oiVDolIjBCKSFYPipBKDkoMVREMDZFRydIVTArNTYkSiFYPCwiUT0KK01PQjQ+J1FUVzQ0MFIzVEUuMkUhKDRSLEFGKjU6PiFMQihTRShJWiEuMlNISzBTJD0pKVUzRyhFO1QzUS4KK00oUlxPK0MgWzA1XjhIRSo8KFIkQVQqWVIyLUM5Vk07OVMuNCFaICdGIClKQyojQSg5QUxLKFJMQi9ELyoKK00rRFVHLDJcSipSNUxMUzg/JyAsTVdCNEEqUTg+KjI4SC9WIUMoKiFALjVeME0yOEYtMllBUVJYQygxTFYKK00zM1hOMjQpJTAkOF4yMiRJSitBSkEyKEQqIzEiTCo1KTMzQEEuIkA9KjolOElYRT1VU0UrKDJUTSpCTFgKK00vVk5NTkYuUytSIEZbK01HMV47SVpOO0ZXL0giX1AjW0UxUEgsJSgxKDFYQiciQDdLMy0sPEJQQyoiMDcKK00oOCRQJ0FIQSkiOD4kQTw0JkIkPykkNUw5QjVOLjFMUTkqUEQoQlxBJFREQCdCJEIsNEE2LjZJMjgmKTgKK001VjhIKChUUz8wXEEoJD0pNFVVTTNCXSk5NDRRMipZNEdYPTE6PCBZNUJAVyxCTFYwM0U0OjY1SigyIEMKK00pPS5XN1JXOVZdTzxXXitDID4gIVdAI1tFIURILVU4MSdBSD4mQkw7TFM1JzwiWEIpMkg9KihAUCchPEEKK00pMjg+JSFIMCVBWD8pRD1MOSFdWDBBXFs6OlRBJlJAPiRETEAnIVg9KkQhLCw2ISY0RT0tMyVMQyhJOFwKK00/QFw/JyQ9JDJVXU0wQlUhNEM4SDIrITtLKF04OztUVDQyLFIrMixPLyM5OzxWWVEoIVRBKF06WDcyVz0KK01YPidCWU47SiA+RCFZMCNVSFIsTzAmIDopQiBEJ0JUQ1BDRSI7IzhOLDMsRCw5LFkoMVxKLCJcRSYhUDUKK00mUjhIKkQ1QzgiIio0Ik0lPTtISSlCXDwjVSRJKDIgOyozUSYrNUhfMjRVIzBFJEEqSjEqQjFARCg1ISIKK00xNj1SLzJcXzEyUEg0OzFETzotNzorXFIzUiRQKlIkTS5DOURAV1lcK0I0QyovIyU1UytZIi9cIF4pND4KK00pQjUpJFIgPCZBREYmWkxMOThQUyoyLEIkQykhKEFcOSgxWEEnQSQ2JUEsQChCNEo8JlxFOFQ8RS0kTlQKK00pUjBBKSZdQCYhSDkoUVksODJZPDRFWTI2RUU+K0FZJT0xREUoQilBQzRRM0c0VE8xJVBSNilRMEooOVoKK00xRT1QL0U4TzAzLEgqJCBFJiM5JCdSLEAoMjMwRlc5L1c+I0FZIC9CIE44IF5ZJDopIk0tJFFUOCVBPEUKK00mOyBPODg8UCoiMEglQ0UoKEFUNigxXEMnQFwyJCBcPShCPEw8JlQ+OyRYRi5VIlUpIVQ9KVc1RCYhQDYKK00nQT0kNVI5MjFFISczVFkzKTFVLD5RREMnQVFBQjQ5OEdUJE0vJFhLNklVNkxZKiMyRU1SLVRcSi8iWEAKK00oM0hCJkNJJScyJD4nUis0RzcxLVdeJ0JZPkdJWkArSyAvQkAoQkRSNVFQRSdBWDspIVpdLDVGIi4jME8KK00sMVkiNFJMQidCSEoqUjQ0JVE0NCkyTEsqRj1JJ1dROiw0MTxQQlBGKFJFXDtCJD0mIVA2MCUkQjMjXScKK00vNDUkMjI8STYoMD4pUixBPChZITc6LFwrU0klKkYiSDZcIkVDVCkzPCM5LiojSEwnQiBbKSFZIjQiJEUKK00oQixGWjotTDRPN1peX1glX1AjW0MxXEAoJCAuJ1FMOyZCOSxJQylONTJMRygiJDMoIlQxKUFMQikyIEMKK00lIVg0JFFYPikzQVI6MiU5NCI8TylbOEwoQyVbM1BUQClTND4rJTVGNSYhLTY2OTg3JjRHKTY8MSkiJEAKK00nOFM7MUU6MjBTLTcpODpDNklRXkJVUSktJSEnNkIoXywyTFAxIkRDLEtQSygxXEMpKk1POjJXOFYtV0AKK01XXj9GID48IVkgI1tCIUA8KTQoLichPDgmUjEsSVMhSDNSPEgpIjQ1KiM8MykhREIpQiBAJCE4LiNRUD4KK00pM0lSOVFJQjUyPFcrS0RJKCM6IjYxJEApMyg5KTRVPDJFMSEyVUktNDU8PihGTDYoQVg8JUhXODA1TjQKK00uUyEvJ1hGRzZKMitGJjUqLVUxIjUxVFkrIjBHMDI8QSxLREgnQiBDKSpNUDkyR0BYXkNLWS5PSiA+VCEKK01aQCNZRTIkQSpESDUpIVRAJ0JBM00jKUEyQlxTK0JcOytDXDsqMVhLLDJESCVBUDMlIiRFKkNBSThRTU4KK004MyBbLVw8USkzTis6MVRJKkMwNykkRTYxJFxaMEUtIzFEWEIrJzQ7KUIgQSc5S0AvRiI4LTMhKyZITlEKK004Wko6SVY0XCpUXSA0QUxaKkIsRzBSTEUuPCRKJ0IkSCo7SVM3Ml9WXz9fX15QL18gP1QgXlg4PidBUFYKK00lMUg8JzZGRS9EQEkzRFRNKFFcQiVBTDgkIig8KSIoRClBNDQkQUhCKEI0TTw2MEEwViRBLkFCUipBXVMKK00lMUxBJ1IkRSgySTM3Ni0+NzUpTjlWLUYrMiw/KFI4PCYxMlRVREkuQ1NRVzY2RVw9KjYtQTVBKTBTOFsKK01BNSRKLTJATytTR0ArQVo6JyIoSkY5MyhKPS9DVl1bPldeK0NYQCtDIC9NXCVRTDotISw4JkFdTkpULSoKK00pVFEoKlIsPyhBKEApMSg+JkIwRChCKDEkISA4KCIgQipXJUQmVF1EJzNYPk1SPEA9MTg9JzFQQScxQEEKK00yJSUzM0RVIjdVRTY2Ijg/JlFcRCZBPDJNTSUkNEkkWTwlIUg/V0JLRShRPDM0KFUuWEUvKSJcQysyMFwKK01YMkA8RlFEPCpaJjlSOlc3WU4rR1leQ0paXkgiWlAjVUMyID0nU0Q3JyFYQzxbMTA0QkUkMFMgSilCRDgKK00oUjQ2KFFYSysiPEclQTQ0JyIwRCpCVUg3MVk2PEIoWChcME8oV1RDKTIoRCoiJDgoND0uMzQ5JS5FTS8KK00xVFxHKSIgRClBWDslW0s+MTVKNy42XTA5N14gTyleNzkkPFcqQzIjMjI0UigyPEMuTjBLKDo4QSdSWkMKK01HLTpZWD9DWyE/XiFfQCdfID9YIF5XODwmMTRKJUFAOjJCREwvRChDMzYkRSkhXEUlITg1JFEwOSdSMD8KK00oQSw4KCIwQSgyKEY8JkhBLlVYOjExRTwnUiA2J0IoRCchTD8qRC0vNzVFMTc2VTk4RV1BLyI8PydXUEQKK00mMUY2SSRJLUJEOz1YOUE3SFlVVDFEKSYtVCo1LTNcXiZTQF0tRE81KzFAUCkxPD05JycnS11PNVY9Vz4KK01XXitDWEAnQiA+LCBeVlA1JUEsSCUhODg0IlxOLyQgQDI1TEMpIVxFJCE8OiQxKDcnUjg/KCEkNigiMEEKK00oMVxEPCZIOzFWJDYxMUlCKSFcMiZBXD4mMUw3KENNJTQ0TSMzVV0sNTUxNy1CLDsmV0RBJVE+OEdUNTIKK01CRCs1VkhdNEsqRVszJDEnLVQqNS0zVFglMyxbKlRbNSlBPFAoMSxAOkc7ME4uMz5YTjtHWi5LS1pAJ0oKK00gPkwgTFdUPiYhQE0mIUg8NjNAVDA0NEIwNThIKlI4TCVBSDwlMTg7KUJYRikxODspMkRGKUI8RjlWLD4KK00zRlw7MCFNRylBWDcoQCxBT1IoOygjRF8yRChaMUU4XzIkRS0tUkBAKCgkSSchTj5LRC03RDRDQ1k5JTwKK01PK1FdMjNcWStDRi4rQzxZJiMkVSpFIzwpMThXKVFAPjlXR0BTT1NYXyA3X0A/WCFfQCdfICldRydRMDYKK00nMSw4JiFIPy9DTSEoNTk6LSIoRChRMDUkUTAwJ0FQSidSKD0hIic4KSI0TjpWUEMqJzQ3JSVBMSchTEEKK00nUVxDJlIoSStDUS00NT0/NjVRNjUmPjgwQiRIKSQ4PSYxUzJZNEk+QEVbOldNS0FIN0EtMDQ8XTJIWFkKK00zNExISENIVi81PzkyKSIvQzhBRzklWzNUPTc4Vz1XPFdeL0BXQCtCICohPSYhJDQmUSQ2JUFQPy9DUF0KK00mVSEyLCIoRChRKDMkMSguJyFQTCdSKD0oMCxDViI4QismTUwnMzFYJFE9PTYhUDgnMUw7JzFAQigyOFQKK00wVDksNSRZMTIkQT5EU1w9KSIhIyYxODpVLV0lOFghOlVNVzJYKloiM1QlJy40SjEuNFEnKElQVS0jKTkKK01WJCYyRShaKzo2MUVXPVM/WF47Rlk+Q0taLjgiWkAiQDtCJDMmMiA1JkFIRCokLF0wUVkpM0M4SSpSSDYKK00lMSw0JEIgQy0iOEkpIkAjKj0kTCpCWUI5MiBbQUFANzdVSEMmQihDKCIoQCoyNEQrQ0xcMERJJDFTWSEKK003SSUhKEJERTNSQD4nTVNQMFY2IjguQ0lWLlpdQkRUWC4iXSVCMyEhL1IuPyxSUFE3PjkqRilGL0M2MT0KK005TldWX19YJV9YK1xeQCdeID9cIE0lLD8nIUg1JFEwNCcyLFcvMUA+NlU4XSghTEEkMTA5JEEkOydCQD8KK00pQiBCJyIsQidCLEM4VkhIJzg8VDpDPDckQVQ5JlFMIydMMEkvRCk1NERFNDhUUSkzOk5CLkI0QCZUPEcKK00mUF49ViYpNT1GIzRVPjJIPCRMXzIzKTxCQ0EtMkQ4RFZTVFguVT85MzxOKTY1NT04Nj80VU03N1Y9VzsKK01XTis/WEArQSAvTSkmIUQ4JFEkMiRBOD8tVCg0JUUtKy4yIDsoMSgxJUEgLyYxWEooMkBCKSIgRylCKEMKK00oNi1KKEJGKiwnISImUFQ6JlFQPSZBTD4oMzhaMlQ8XzJFRSIuU1pBR0M4QSchPSMoUUAtR00pPTZHOTwKK01UTUdASzdZMS9UPE81SFBcMlQ5IidNNFgtQyE5VVRPMUUmITw3NilOV11fPVdeK0ZZLj9KWV5IIVowJ0gKK00gL006KDFMPSYhNDYlQVRFLyQ0PCZEVSgvUjxCKiE0MyYhKDMnMjRSKjMgSisiQE8rQkhKKFVJQykzIjgKK00tNzUlKFFQQigyPEEnUixFKTMwVDBTVFUwJFxYLDNaS0kjTEYoMVEyLEIoL0o+LTs3JyVBWS4vSE5IQSwKK0guQ1xBNDhAVjBTSFonXUBWK0JdPVo1V0BHRV09NiU5T1svP11eX1NfX09fX15fWCFfMCdfICAgIAorIAorZW5kCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdHRhci50YXIgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGVzdHRhci50YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwMTgyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90ZXN0dGFyLnRhcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weSBiL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YjgwZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weQpAQCAtMCwwICsxLDI1IEBACisjIEhlbHBlciBzY3JpcHQgZm9yIHRlc3RfdGVtcGZpbGUucHkuICBhcmd2WzJdIGlzIHRoZSBudW1iZXIgb2YgYSBmaWxlCisjIGRlc2NyaXB0b3Igd2hpY2ggc2hvdWxkIF9ub3RfIGJlIG9wZW4uICBDaGVjayB0aGlzIGJ5IGF0dGVtcHRpbmcgdG8KKyMgd3JpdGUgdG8gaXQgLS0gaWYgd2Ugc3VjY2VlZCwgc29tZXRoaW5nIGlzIHdyb25nLgorCitpbXBvcnQgc3lzCitpbXBvcnQgb3MKKwordmVyYm9zZSA9IChzeXMuYXJndlsxXSA9PSAndicpCit0cnk6CisgICAgZmQgPSBpbnQoc3lzLmFyZ3ZbMl0pCisKKyAgICB0cnk6CisgICAgICAgIG9zLndyaXRlKGZkLCAiYmxhdCIpCisgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAjIFN1Y2Nlc3MgLS0gY291bGQgbm90IHdyaXRlIHRvIGZkLgorICAgICAgICBzeXMuZXhpdCgwKQorICAgIGVsc2U6CisgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJmZCAlZCBpcyBvcGVuIGluIGNoaWxkIiAlIGZkKQorICAgICAgICBzeXMuZXhpdCgxKQorCitleGNlcHQgU3RhbmRhcmRFcnJvcjoKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICByYWlzZQorICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0OGVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdGZfaW5oZXJpdF9jaGVjay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0OGVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90Zl9pbmhlcml0X2NoZWNrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1MDg3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5weQpAQCAtMCwwICsxLDQyIEBACisjIFRoaXMgaXMgYSBoZWxwZXIgbW9kdWxlIGZvciB0ZXN0X3RocmVhZGVkX2ltcG9ydC4gIFRoZSB0ZXN0IGltcG9ydHMgdGhpcworIyBtb2R1bGUsIGFuZCB0aGlzIG1vZHVsZSB0cmllcyB0byBydW4gdmFyaW91cyBQeXRob24gbGlicmFyeSBmdW5jdGlvbnMgaW4KKyMgdGhlaXIgb3duIHRocmVhZCwgYXMgYSBzaWRlIGVmZmVjdCBvZiBiZWluZyBpbXBvcnRlZC4gIElmIHRoZSBzcGF3bmVkCisjIHRocmVhZCBkb2Vzbid0IGNvbXBsZXRlIGluIFRJTUVPVVQgc2Vjb25kcywgYW4gImFwcGVhcmVkIHRvIGhhbmciIG1lc3NhZ2UKKyMgaXMgYXBwZW5kZWQgdG8gdGhlIG1vZHVsZS1nbG9iYWwgYGVycm9yc2AgbGlzdC4gIFRoYXQgbGlzdCByZW1haW5zIGVtcHR5CisjIGlmIChhbmQgb25seSBpZikgYWxsIGZ1bmN0aW9ucyB0ZXN0ZWQgY29tcGxldGUuCisKK1RJTUVPVVQgPSAxMAorCitpbXBvcnQgdGhyZWFkaW5nCisKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IG9zLnBhdGgKKworZXJyb3JzID0gW10KKworIyBUaGlzIGNsYXNzIG1lcmVseSBydW5zIGEgZnVuY3Rpb24gaW4gaXRzIG93biB0aHJlYWQgVC4gIFRoZSB0aHJlYWQgaW1wb3J0aW5nCisjIHRoaXMgbW9kdWxlIGhvbGRzIHRoZSBpbXBvcnQgbG9jaywgc28gaWYgdGhlIGZ1bmN0aW9uIGNhbGxlZCBieSBUIHRyaWVzCisjIHRvIGRvIGl0cyBvd24gaW1wb3J0cyBpdCB3aWxsIGJsb2NrIHdhaXRpbmcgZm9yIHRoaXMgbW9kdWxlJ3MgaW1wb3J0CisjIHRvIGNvbXBsZXRlLgorY2xhc3MgV29ya2VyKHRocmVhZGluZy5UaHJlYWQpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jdGlvbiwgYXJncyk6CisgICAgICAgIHRocmVhZGluZy5UaHJlYWQuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5mdW5jdGlvbiA9IGZ1bmN0aW9uCisgICAgICAgIHNlbGYuYXJncyA9IGFyZ3MKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuZnVuY3Rpb24oKnNlbGYuYXJncykKKworZm9yIG5hbWUsIGZ1bmMsIGFyZ3MgaW4gWworICAgICAgICAjIEJ1ZyAxNDczNzY6ICBUZW1wb3JhcnlGaWxlIGh1bmcgb24gV2luZG93cywgc3RhcnRpbmcgaW4gUHl0aG9uIDIuNC4KKyAgICAgICAgKCJ0ZW1wZmlsZS5UZW1wb3JhcnlGaWxlIiwgdGVtcGZpbGUuVGVtcG9yYXJ5RmlsZSwgKCkpLAorCisgICAgICAgICMgVGhlIHJlYWwgY2F1c2UgZm9yIGJ1ZyAxNDczNzY6ICBudHBhdGguYWJzcGF0aCgpIGNhdXNlZCB0aGUgaGFuZy4KKyAgICAgICAgKCJvcy5wYXRoLmFic3BhdGgiLCBvcy5wYXRoLmFic3BhdGgsICgnLicsKSksCisgICAgICAgIF06CisKKyAgICB0ID0gV29ya2VyKGZ1bmMsIGFyZ3MpCisgICAgdC5zdGFydCgpCisgICAgdC5qb2luKFRJTUVPVVQpCisgICAgaWYgdC5pc19hbGl2ZSgpOgorICAgICAgICBlcnJvcnMuYXBwZW5kKCIlcyBhcHBlYXJlZCB0byBoYW5nIiAlIG5hbWUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RocmVhZGVkX2ltcG9ydF9oYW5nZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY0ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RocmVhZGVkX2ltcG9ydF9oYW5nZXJzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RocmVhZGVkX2ltcG9ydF9oYW5nZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY0ZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RocmVhZGVkX2ltcG9ydF9oYW5nZXJzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGltZV9oYXNobGliLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3RpbWVfaGFzaGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmY3MDdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RpbWVfaGFzaGxpYi5weQpAQCAtMCwwICsxLDg3IEBACisjIEl0J3MgaW50ZW5kZWQgdGhhdCB0aGlzIHNjcmlwdCBiZSBydW4gYnkgaGFuZC4gIEl0IHJ1bnMgc3BlZWQgdGVzdHMgb24KKyMgaGFzaGxpYiBmdW5jdGlvbnM7IGl0IGRvZXMgbm90IHRlc3QgZm9yIGNvcnJlY3RuZXNzLgorCitpbXBvcnQgc3lzLCB0aW1lCitpbXBvcnQgaGFzaGxpYgorCisKK2RlZiBjcmVhdG9yRnVuYygpOgorICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgImVlaywgY3JlYXRvckZ1bmMgbm90IG92ZXJyaWRkZW4iCisKK2RlZiB0ZXN0X3NjYWxlZF9tc2coc2NhbGUsIG5hbWUpOgorICAgIGl0ZXJhdGlvbnMgPSAxMDYyMDEvc2NhbGUgKiAyMAorICAgIGxvbmdTdHIgPSAnWicqc2NhbGUKKworICAgIGxvY2FsQ0YgPSBjcmVhdG9yRnVuYworICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICBmb3IgZiBpbiB4cmFuZ2UoaXRlcmF0aW9ucyk6CisgICAgICAgIHggPSBsb2NhbENGKGxvbmdTdHIpLmRpZ2VzdCgpCisgICAgZW5kID0gdGltZS50aW1lKCkKKworICAgIHByaW50ICgnJTIuMmYnICUgKGVuZC1zdGFydCkpLCAic2Vjb25kcyIsIGl0ZXJhdGlvbnMsICJ4IiwgbGVuKGxvbmdTdHIpLCAiYnl0ZXMiLCBuYW1lCisKK2RlZiB0ZXN0X2NyZWF0ZSgpOgorICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKKyAgICBmb3IgZiBpbiB4cmFuZ2UoMjAwMDApOgorICAgICAgICBkID0gY3JlYXRvckZ1bmMoKQorICAgIGVuZCA9IHRpbWUudGltZSgpCisKKyAgICBwcmludCAoJyUyLjJmJyAlIChlbmQtc3RhcnQpKSwgInNlY29uZHMiLCAnWzIwMDAwIGNyZWF0aW9uc10nCisKK2RlZiB0ZXN0X3plcm8oKToKKyAgICBzdGFydCA9IHRpbWUudGltZSgpCisgICAgZm9yIGYgaW4geHJhbmdlKDIwMDAwKToKKyAgICAgICAgeCA9IGNyZWF0b3JGdW5jKCkuZGlnZXN0KCkKKyAgICBlbmQgPSB0aW1lLnRpbWUoKQorCisgICAgcHJpbnQgKCclMi4yZicgJSAoZW5kLXN0YXJ0KSksICJzZWNvbmRzIiwgJ1syMDAwMCAiIiBkaWdlc3RzXScKKworCisKK2hOYW1lID0gc3lzLmFyZ3ZbMV0KKworIworIyBzZXR1cCBvdXIgY3JlYXRvckZ1bmMgdG8gdGVzdCB0aGUgcmVxdWVzdGVkIGhhc2gKKyMKK2lmIGhOYW1lIGluICgnX21kNScsICdfc2hhJyk6CisgICAgZXhlYyAnaW1wb3J0ICcraE5hbWUKKyAgICBleGVjICdjcmVhdG9yRnVuYyA9ICcraE5hbWUrJy5uZXcnCisgICAgcHJpbnQgInRlc3Rpbmcgc3BlZWQgb2Ygb2xkIiwgaE5hbWUsICJsZWdhY3kgaW50ZXJmYWNlIgorZWxpZiBoTmFtZSA9PSAnX2hhc2hsaWInIGFuZCBsZW4oc3lzLmFyZ3YpID4gMzoKKyAgICBpbXBvcnQgX2hhc2hsaWIKKyAgICBleGVjICdjcmVhdG9yRnVuYyA9IF9oYXNobGliLiVzJyAlIHN5cy5hcmd2WzJdCisgICAgcHJpbnQgInRlc3Rpbmcgc3BlZWQgb2YgX2hhc2hsaWIuJXMiICUgc3lzLmFyZ3ZbMl0sIGdldGF0dHIoX2hhc2hsaWIsIHN5cy5hcmd2WzJdKQorZWxpZiBoTmFtZSA9PSAnX2hhc2hsaWInIGFuZCBsZW4oc3lzLmFyZ3YpID09IDM6CisgICAgaW1wb3J0IF9oYXNobGliCisgICAgZXhlYyAnY3JlYXRvckZ1bmMgPSBsYW1iZGEgeD1faGFzaGxpYi5uZXcgOiB4KCVyKScgJSBzeXMuYXJndlsyXQorICAgIHByaW50ICJ0ZXN0aW5nIHNwZWVkIG9mIF9oYXNobGliLm5ldyglcikiICUgc3lzLmFyZ3ZbMl0KK2VsaWYgaGFzYXR0cihoYXNobGliLCBoTmFtZSkgYW5kIGNhbGxhYmxlKGdldGF0dHIoaGFzaGxpYiwgaE5hbWUpKToKKyAgICBjcmVhdG9yRnVuYyA9IGdldGF0dHIoaGFzaGxpYiwgaE5hbWUpCisgICAgcHJpbnQgInRlc3Rpbmcgc3BlZWQgb2YgaGFzaGxpYi4iK2hOYW1lLCBnZXRhdHRyKGhhc2hsaWIsIGhOYW1lKQorZWxzZToKKyAgICBleGVjICJjcmVhdG9yRnVuYyA9IGxhbWJkYSB4PWhhc2hsaWIubmV3IDogeCglcikiICUgaE5hbWUKKyAgICBwcmludCAidGVzdGluZyBzcGVlZCBvZiBoYXNobGliLm5ldyglcikiICUgaE5hbWUKKwordHJ5OgorICAgIHRlc3RfY3JlYXRlKCkKK2V4Y2VwdCBWYWx1ZUVycm9yOgorICAgIHByaW50CisgICAgcHJpbnQgInBhc3MgYXJndW1lbnQocykgbmFtaW5nIHRoZSBoYXNoIHRvIHJ1biBhIHNwZWVkIHRlc3Qgb246IgorICAgIHByaW50ICIgJ19tZDUnIGFuZCAnX3NoYScgdGVzdCB0aGUgbGVnYWN5IGJ1aWx0aW4gbWQ1IGFuZCBzaGEiCisgICAgcHJpbnQgIiAnX2hhc2hsaWInICdvcGVuc3NsX2hOYW1lJyAnZmFzdCcgdGVzdHMgdGhlIGJ1aWx0aW4gX2hhc2hsaWIiCisgICAgcHJpbnQgIiAnX2hhc2hsaWInICdoTmFtZScgdGVzdHMgYnVpbHRpbiBfaGFzaGxpYi5uZXcoc2hhRk9PKSIKKyAgICBwcmludCAiICdoTmFtZScgdGVzdHMgdGhlIGhhc2hsaWIuaE5hbWUoKSBpbXBsZW1lbnRhdGlvbiBpZiBpdCBleGlzdHMiCisgICAgcHJpbnQgIiAgICAgICAgIG90aGVyd2lzZSBpdCB1c2VzIGhhc2hsaWIubmV3KGhOYW1lKS4iCisgICAgcHJpbnQKKyAgICByYWlzZQorCit0ZXN0X3plcm8oKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTEwNjIwMSwgbmFtZT0nW2h1Z2UgZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTEwNjIwLCBuYW1lPSdbbGFyZ2UgZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTEwNjIsIG5hbWU9J1ttZWRpdW0gZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTQyNCwgbmFtZT0nWzQqc21hbGwgZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTMzNiwgbmFtZT0nWzMqc21hbGwgZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTIxMiwgbmFtZT0nWzIqc21hbGwgZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTEwNiwgbmFtZT0nW3NtYWxsIGRhdGFdJykKK3Rlc3Rfc2NhbGVkX21zZyhzY2FsZT1jcmVhdG9yRnVuYygpLmRpZ2VzdF9zaXplLCBuYW1lPSdbZGlnZXN0X3NpemUgZGF0YV0nKQordGVzdF9zY2FsZWRfbXNnKHNjYWxlPTEwLCBuYW1lPSdbdGlueSBkYXRhXScpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGltZV9oYXNobGliLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC90aW1lX2hhc2hsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmIwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGltZV9oYXNobGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdGltZV9oYXNobGliLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC90aW1lX2hhc2hsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MmIwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3QvdGltZV9oYXNobGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdG9rZW5pemVfdGVzdHMudHh0IGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rva2VuaXplX3Rlc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWYzYmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3Rva2VuaXplX3Rlc3RzLnR4dApAQCAtMCwwICsxLDE3OCBAQAorIyBUZXN0cyBmb3IgdGhlICd0b2tlbml6ZScgbW9kdWxlLgorIyBMYXJnZSBiaXRzIHN0b2xlbiBmcm9tIHRlc3RfZ3JhbW1hci5weS4gCisKKyMgQ29tbWVudHMKKyIjIgorIycKKyMiCisjXAorICAgICAgICMKKyAgICAjIGFiYworJycnIworIycnJworCit4ID0gMSAgIworCisjIEJhbGFuY2luZyBjb250aW51YXRpb24KKworYSA9ICgzLCA0LAorICA1LCA2KQoreSA9IFszLCA0LAorICA1XQoreiA9IHsnYSc6NSwKKyAgJ2InOjZ9Cit4ID0gKGxlbihgeWApICsgNSp4IC0gYVsKKyAgIDMgXQorICAgLSB4ICsgbGVuKHsKKyAgIH0KKyAgICApCisgICkKKworIyBCYWNrc2xhc2ggbWVhbnMgbGluZSBjb250aW51YXRpb246Cit4ID0gMSBcCisrIDEKKworIyBCYWNrc2xhc2ggZG9lcyBub3QgbWVhbnMgY29udGludWF0aW9uIGluIGNvbW1lbnRzIDpcCit4ID0gMAorCisjIE9yZGluYXJ5IGludGVnZXJzCisweGZmIDw+IDI1NQorMDM3NyA8PiAyNTUKKzIxNDc0ODM2NDcgICAhPSAwMTc3Nzc3Nzc3NzcKKy0yMTQ3NDgzNjQ3LTEgIT0gMDIwMDAwMDAwMDAwCiswMzc3Nzc3Nzc3NzcgIT0gLTEKKzB4ZmZmZmZmZmYgIT0gLTEKKworIyBMb25nIGludGVnZXJzCit4ID0gMEwKK3ggPSAwbAoreCA9IDB4ZmZmZmZmZmZmZmZmZmZmZkwKK3ggPSAweGZmZmZmZmZmZmZmZmZmZmZsCit4ID0gMDc3Nzc3Nzc3Nzc3Nzc3Nzc3TAoreCA9IDA3Nzc3Nzc3Nzc3Nzc3Nzc3N2wKK3ggPSAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTBMCit4ID0gMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwbAorCisjIEZsb2F0aW5nLXBvaW50IG51bWJlcnMKK3ggPSAzLjE0Cit4ID0gMzE0LgoreCA9IDAuMzE0CisjIFhYWCB4ID0gMDAwLjMxNAoreCA9IC4zMTQKK3ggPSAzZTE0Cit4ID0gM0UxNAoreCA9IDNlLTE0Cit4ID0gM2UrMTQKK3ggPSAzLmUxNAoreCA9IC4zZTE0Cit4ID0gMy4xZTQKKworIyBTdHJpbmcgbGl0ZXJhbHMKK3ggPSAnJzsgeSA9ICIiOworeCA9ICdcJyc7IHkgPSAiJyI7Cit4ID0gJyInOyB5ID0gIlwiIjsKK3ggPSAiZG9lc24ndCBcInNocmlua1wiIGRvZXMgaXQiCit5ID0gJ2RvZXNuXCd0ICJzaHJpbmsiIGRvZXMgaXQnCit4ID0gImRvZXMgXCJzaHJpbmtcIiBkb2Vzbid0IGl0IgoreSA9ICdkb2VzICJzaHJpbmsiIGRvZXNuXCd0IGl0JworeCA9ICIiIgorVGhlICJxdWljayIKK2Jyb3duIGZveAoranVtcHMgb3ZlcgordGhlICdsYXp5JyBkb2cuCisiIiIKK3kgPSAnXG5UaGUgInF1aWNrIlxuYnJvd24gZm94XG5qdW1wcyBvdmVyXG50aGUgXCdsYXp5XCcgZG9nLlxuJworeSA9ICcnJworVGhlICJxdWljayIKK2Jyb3duIGZveAoranVtcHMgb3ZlcgordGhlICdsYXp5JyBkb2cuCisnJyc7Cit5ID0gIlxuXAorVGhlIFwicXVpY2tcIlxuXAorYnJvd24gZm94XG5cCitqdW1wcyBvdmVyXG5cCit0aGUgJ2xhenknIGRvZy5cblwKKyI7Cit5ID0gJ1xuXAorVGhlIFwicXVpY2tcIlxuXAorYnJvd24gZm94XG5cCitqdW1wcyBvdmVyXG5cCit0aGUgXCdsYXp5XCcgZG9nLlxuXAorJzsKK3ggPSByJ1xcJyArIFInXFwnCit4ID0gcidcJycgKyAnJworeSA9IHInJycKK2ZvbyBiYXIgXFwKK2JheicnJyArIFInJycKK2ZvbycnJworeSA9IHIiIiJmb28KK2JhciBcXCBiYXoKKyIiIiArIFInJydzcGFtCisnJycKK3ggPSB1J2FiYycgKyBVJ0FCQycKK3kgPSB1ImFiYyIgKyBVIkFCQyIKK3ggPSB1cidhYmMnICsgVXInQUJDJyArIHVSJ0FCQycgKyBVUidBQkMnCit5ID0gdXIiYWJjIiArIFVyIkFCQyIgKyB1UiJBQkMiICsgVVIiQUJDIgoreCA9IHVyJ1xcJyArIFVSJ1xcJworeCA9IHVyJ1wnJyArICcnCit5ID0gdXInJycKK2ZvbyBiYXIgXFwKK2JheicnJyArIFVSJycnCitmb28nJycKK3kgPSBVciIiImZvbworYmFyIFxcIGJhegorIiIiICsgdVInJydzcGFtCisnJycKKworIyBJbmRlbnRhdGlvbgoraWYgMToKKyAgICB4ID0gMgoraWYgMToKKyAgICAgICAgeCA9IDIKK2lmIDE6CisgICAgd2hpbGUgMDoKKyAgICAgaWYgMDoKKyAgICAgICAgICAgeCA9IDIKKyAgICAgeCA9IDIKK2lmIDA6CisgIGlmIDI6CisgICB3aGlsZSAwOgorICAgICAgICBpZiAxOgorICAgICAgICAgIHggPSAyCisKKyMgT3BlcmF0b3JzCisKK2RlZiBkMjIoYSwgYiwgYz0xLCBkPTIpOiBwYXNzCitkZWYgZDAxdihhPTEsICpyZXN0dCwgKipyZXN0ZCk6IHBhc3MKKworKHgsIHkpIDw+ICh7J2EnOjF9LCB7J2InOjJ9KQorCisjIGNvbXBhcmlzb24KK2lmIDEgPCAxID4gMSA9PSAxID49IDEgPD0gMSA8PiAxICE9IDEgaW4gMSBub3QgaW4gMSBpcyAxIGlzIG5vdCAxOiBwYXNzCisKKyMgYmluYXJ5Cit4ID0gMSAmIDEKK3ggPSAxIF4gMQoreCA9IDEgfCAxCisKKyMgc2hpZnQKK3ggPSAxIDw8IDEgPj4gMQorCisjIGFkZGl0aXZlCit4ID0gMSAtIDEgKyAxIC0gMSArIDEKKworIyBtdWx0aXBsaWNhdGl2ZQoreCA9IDEgLyAxICogMSAlIDEKKworIyB1bmFyeQoreCA9IH4xIF4gMSAmIDEgfCAxICYgMSBeIC0xCit4ID0gLTEqMS8xICsgMSoxIC0gLS0tMSoxCisKKyMgc2VsZWN0b3IKK2ltcG9ydCBzeXMsIHRpbWUKK3ggPSBzeXMubW9kdWxlc1sndGltZSddLnRpbWUoKQorCitAc3RhdGljbWV0aG9kCitkZWYgZm9vKCk6IHBhc3MKKwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ZhNGYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvX19pbml0X18ucHkKQEAgLTAsMCArMSw0IEBACisiIiJUaGlzIHBhY2thZ2UgY29udGFpbnMgbW9kdWxlcyB0aGF0IGhlbHAgdGVzdGluZyB0aGUgdHJhY2UucHkgbW9kdWxlLiBOb3RlCit0aGF0IHRoZSBleGFjdCBsb2NhdGlvbiBvZiBmdW5jdGlvbnMgaW4gdGhlc2UgbW9kdWxlcyBpcyBpbXBvcnRhbnQsIGFzIHRyYWNlLnB5Cit0YWtlcyB0aGUgcmVhbCBsaW5lIG51bWJlcnMgaW50byBhY2NvdW50LgorIiIiCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ODdmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1ODdmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC90cmFjZWRtb2R1bGVzL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5IGIvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvdGVzdG1vZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI3NzZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvdGVzdG1vZC5weQpAQCAtMCwwICsxLDkgQEAKK2RlZiBmdW5jKHgpOgorICAgIGIgPSB4ICsgMQorICAgIHJldHVybiBiICsgMgorCitkZWYgZnVuYzIoKToKKyAgICAiIiJUZXN0IGZ1bmN0aW9uIGZvciBpc3N1ZSA5OTM2ICIiIgorICAgIHJldHVybiAoMSwKKyAgICAgICAgICAgIDIsCisgICAgICAgICAgICAzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvdGVzdG1vZC5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk2OWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvdGVzdG1vZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvdGVzdG1vZC5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3QvdHJhY2VkbW9kdWxlcy90ZXN0bW9kLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk2OWNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3RyYWNlZG1vZHVsZXMvdGVzdG1vZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3dhcm5pbmdfdGVzdHMucHkgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2FybmluZ190ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDUxOWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3dhcm5pbmdfdGVzdHMucHkKQEAgLTAsMCArMSw5IEBACisjIEhlbHBlciBtb2R1bGUgZm9yIHRlc3RpbmcgdGhlIHNraXBtb2R1bGVzIGFyZ3VtZW50IG9mIHdhcm5pbmdzLndhcm4oKQorCitpbXBvcnQgd2FybmluZ3MKKworZGVmIG91dGVyKG1lc3NhZ2UsIHN0YWNrbGV2ZWw9MSk6CisgICAgaW5uZXIobWVzc2FnZSwgc3RhY2tsZXZlbCkKKworZGVmIGlubmVyKG1lc3NhZ2UsIHN0YWNrbGV2ZWw9MSk6CisgICAgd2FybmluZ3Mud2FybihtZXNzYWdlLCBzdGFja2xldmVsPXN0YWNrbGV2ZWwpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvd2FybmluZ190ZXN0cy5weWMgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2FybmluZ190ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkZDA4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC93YXJuaW5nX3Rlc3RzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvd2FybmluZ190ZXN0cy5weW8gYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2FybmluZ190ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkZDA4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC93YXJuaW5nX3Rlc3RzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weSBiL2xpYi9weXRob24yLjcvdGVzdC93aW5fY29uc29sZV9oYW5kbGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmNlZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weQpAQCAtMCwwICsxLDQ5IEBACisiIiJTY3JpcHQgdXNlZCB0byB0ZXN0IG9zLmtpbGwgb24gV2luZG93cywgZm9yIGlzc3VlICMxMjIwMjEyCisKK1RoaXMgc2NyaXB0IGlzIHN0YXJ0ZWQgYXMgYSBzdWJwcm9jZXNzIGluIHRlc3Rfb3MgYW5kIGlzIHVzZWQgdG8gdGVzdCB0aGUKK0NUUkxfQ19FVkVOVCBhbmQgQ1RSTF9CUkVBS19FVkVOVCBzaWduYWxzLCB3aGljaCByZXF1aXJlcyBhIGN1c3RvbSBoYW5kbGVyCit0byBiZSB3cml0dGVuIGludG8gdGhlIGtpbGwgdGFyZ2V0LgorCitTZWUgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNjg1MDQ5JTI4dj1WUy44NSUyOS5hc3B4IGZvciBhCitzaW1pbGFyIGV4YW1wbGUgaW4gQy4KKyIiIgorCitmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMsIFdJTkZVTkNUWVBFCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgY3R5cGVzCitpbXBvcnQgbW1hcAoraW1wb3J0IHN5cworCisjIEZ1bmN0aW9uIHByb3RvdHlwZSBmb3IgdGhlIGhhbmRsZXIgZnVuY3Rpb24uIFJldHVybnMgQk9PTCwgdGFrZXMgYSBEV09SRC4KK0hhbmRsZXJSb3V0aW5lID0gV0lORlVOQ1RZUEUod2ludHlwZXMuQk9PTCwgd2ludHlwZXMuRFdPUkQpCisKK2RlZiBfY3RybF9oYW5kbGVyKHNpZyk6CisgICAgIiIiSGFuZGxlIGEgc2lnIGV2ZW50IGFuZCByZXR1cm4gMCB0byB0ZXJtaW5hdGUgdGhlIHByb2Nlc3MiIiIKKyAgICBpZiBzaWcgPT0gc2lnbmFsLkNUUkxfQ19FVkVOVDoKKyAgICAgICAgcGFzcworICAgIGVsaWYgc2lnID09IHNpZ25hbC5DVFJMX0JSRUFLX0VWRU5UOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQoIlVOS05PV04gRVZFTlQiKQorICAgIHJldHVybiAwCisKK2N0cmxfaGFuZGxlciA9IEhhbmRsZXJSb3V0aW5lKF9jdHJsX2hhbmRsZXIpCisKKworU2V0Q29uc29sZUN0cmxIYW5kbGVyID0gY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5TZXRDb25zb2xlQ3RybEhhbmRsZXIKK1NldENvbnNvbGVDdHJsSGFuZGxlci5hcmd0eXBlcyA9IChIYW5kbGVyUm91dGluZSwgd2ludHlwZXMuQk9PTCkKK1NldENvbnNvbGVDdHJsSGFuZGxlci5yZXN0eXBlID0gd2ludHlwZXMuQk9PTAorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgICMgQWRkIG91ciBjb25zb2xlIGNvbnRyb2wgaGFuZGxpbmcgZnVuY3Rpb24gd2l0aCB2YWx1ZSAxCisgICAgaWYgbm90IFNldENvbnNvbGVDdHJsSGFuZGxlcihjdHJsX2hhbmRsZXIsIDEpOgorICAgICAgICBwcmludCgiVW5hYmxlIHRvIGFkZCBTZXRDb25zb2xlQ3RybEhhbmRsZXIiKQorICAgICAgICBleGl0KC0xKQorCisgICAgIyBBd2FrZW4gbWFpbCBwcm9jZXNzCisgICAgbSA9IG1tYXAubW1hcCgtMSwgMSwgc3lzLmFyZ3ZbMV0pCisgICAgbVswXSA9ICcxJworCisgICAgIyBEbyBub3RoaW5nIGJ1dCB3YWl0IGZvciB0aGUgc2lnbmFsCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3dpbl9jb25zb2xlX2hhbmRsZXIucHljIGIvbGliL3B5dGhvbjIuNy90ZXN0L3dpbl9jb25zb2xlX2hhbmRsZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWMzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3dpbl9jb25zb2xlX2hhbmRsZXIucHlvIGIvbGliL3B5dGhvbjIuNy90ZXN0L3dpbl9jb25zb2xlX2hhbmRsZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZWMzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rlc3Qvd2luX2NvbnNvbGVfaGFuZGxlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3dyb25nY2VydC5wZW0gYi9saWIvcHl0aG9uMi43L3Rlc3Qvd3JvbmdjZXJ0LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjkyZjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3dyb25nY2VydC5wZW0KQEAgLTAsMCArMSwzMiBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJQ1hBSUJBQUtCZ1FDODlaTnhqVGdXZ3E3WjFnMHRKNjV3K2s3bE5BajVJZ2pMYjE1NVVrVXJ6MFhzSERuSAorRmxic1ZVZzJYdGs2K2JvMlVFWUl6TjdjSW01SW1wbXlXLzJ6MEoxSURWRGx2UjJ4SjY1OXhyRTB2NWMyY0I2VAorZjlsbk5Ud3BTb2VLMjROZDdKd3E0ajl2azk1ZkxyZHFzQnEwL0tWbHNDWGVpeFMvQ2FxcWR1WGZ2d0lEQVFBQgorQW9HQVFGa280dXlDZ3pmeHI0RXpiNE1wNXBOM05wcW55NStKZXkzcjhFalNBWDlPZ24rQ05ZZ29CY2R0RmdicQorMXlpZi8wc0s3b2hHQkpVOUZVQ0F3cnFOQkk5WkhCNnJjeTdkeCtnVUxPbVJCR2NrbG4xbzVTMStzbVZkbU9zVworN3pVVkxCVkJ5S3VOV3FUWUZsemZWZDZzNGlpWHRBRTJpSG4zR0N5WWRsSUN3ckVDUVFEaE1RVnhIZDNFRmJ6ZworU0ZtSkJUQVJsWjJHS0EzYzFnL2g5L1hia0VQUTkvUndJM3ZuakoyUmFTbmpsZm9MbDhUT2NmMHVPR2JPRXlGZQorMTlSdkNMWGpBa0VBMXMrVUU1emlGK1lWa1czV29sRENRMmtRNVdHOStjY2ZOZWJmaDZiNjdCN0xuNWlHMFNiZwora3k5Y2pzTzNqYk1KUXRsekFRbkgxODUwb1JENUdpNTFkUUpBSWJIQ0RMRFpVOU9rMVRJK0kyQmhWdUE2RjY2NgorbEVaN1RlWmFKU1lxMzRPYVVZVWRyd0c5T2Rxd1o5c3k5TFVhdjRFU3p1MmxoRVFjaENKcktNbjIzUUpBUmVxcworWkxIVWVUamZYa1ZrN2RIaFdQV1NsVVo2QWhtSWxBL0FRN1BheWcyLzh3TS9Ka1pFSkVQdkdWeWttczlpUFVydgorZnJBRFJyK2hBR2U0M0lld25RSkJBSldLWmxsUGdLdUVCUHdvRWxkSE5TOG5SdTYxRDdIenhFelEyeG5maitOaworMmZnZjFNQXp6VFJzaWtmR0VOaFZzVldlcU9jaWpXYjZnNWdzeUNtbFJwYz0KKy0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUNzRENDQWhtZ0F3SUJBZ0lKQU9xWU9ZRkpmRUVvTUEwR0NTcUdTSWIzRFFFQkJRVUFNRVV4Q3pBSkJnTlYKK0JBWVRBa0ZWTVJNd0VRWURWUVFJRXdwVGIyMWxMVk4wWVhSbE1TRXdId1lEVlFRS0V4aEpiblJsY201bGRDQlgKK2FXUm5hWFJ6SUZCMGVTQk1kR1F3SGhjTk1EZ3dOakkyTVRneE5UVXlXaGNOTURrd05qSTJNVGd4TlRVeVdqQkYKK01Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQk1LVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2hNWVNXNTAKK1pYSnVaWFFnVjJsa1oybDBjeUJRZEhrZ1RIUmtNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0IKK2dRQzg5Wk54alRnV2dxN1oxZzB0SjY1dytrN2xOQWo1SWdqTGIxNTVVa1VyejBYc0hEbkhGbGJzVlVnMlh0azYKKytibzJVRVlJek43Y0ltNUltcG15Vy8yejBKMUlEVkRsdlIyeEo2NTl4ckUwdjVjMmNCNlRmOWxuTlR3cFNvZUsKKzI0TmQ3SndxNGo5dms5NWZMcmRxc0JxMC9LVmxzQ1hlaXhTL0NhcXFkdVhmdndJREFRQUJvNEduTUlHa01CMEcKK0ExVWREZ1FXQkJUY3RNdEkzRU85T2pMSTB4OVpvMmlma3dJaU5qQjFCZ05WSFNNRWJqQnNnQlRjdE10STNFTzkKK09qTEkweDlabzJpZmt3SWlOcUZKcEVjd1JURUxNQWtHQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xOdmJXVXQKK1UzUmhkR1V4SVRBZkJnTlZCQW9UR0VsdWRHVnlibVYwSUZkcFpHZHBkSE1nVUhSNUlFeDBaSUlKQU9xWU9ZRkoKK2ZFRW9NQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ1lFQVF3YTdqeWEvRGZoYURuN0UKK3VzUGtwZ0lYOFdDTDJCMVNxblJUWEVaZkJQUFZxL2NVbUZHeUVWUlZBVHlTUnVNd2k4UFhiVmNPaFhYdW9jQSsKKzQzVytpSXNEOXBYYXBDWmhoT2VyQ3ExOFRDMWRXSzk4dkxVc29LOFBNakI2ZTVIL084YnFvanYwRWVDK2Z5Q3cKK2VTSGo1anBDOGlaS2pDSEJuK21BaTRjUTUxND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0ZGF0YS9zaW1wbGUtbnMueG1sIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3NpbXBsZS1ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmMzRiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0ZGF0YS9zaW1wbGUtbnMueG1sCkBAIC0wLDAgKzEsNyBAQAorPD9waSBkYXRhPz4KKzwhLS0gY29tbWVudCAtLT4KKzxyb290IHhtbG5zPSduYW1lc3BhY2UnPgorICAgPGVsZW1lbnQga2V5PSd2YWx1ZSc+dGV4dDwvZWxlbWVudD4KKyAgIDxlbGVtZW50PnRleHQ8L2VsZW1lbnQ+dGFpbAorICAgPGVtcHR5LWVsZW1lbnQvPgorPC9yb290PgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3NpbXBsZS54bWwgYi9saWIvcHl0aG9uMi43L3Rlc3QveG1sdGVzdGRhdGEvc2ltcGxlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODhjMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3NpbXBsZS54bWwKQEAgLTAsMCArMSw2IEBACis8IS0tIGNvbW1lbnQgLS0+Cis8cm9vdD4KKyAgIDxlbGVtZW50IGtleT0ndmFsdWUnPnRleHQ8L2VsZW1lbnQ+CisgICA8ZWxlbWVudD50ZXh0PC9lbGVtZW50PnRhaWwKKyAgIDxlbXB0eS1lbGVtZW50Lz4KKzwvcm9vdD4KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0ZGF0YS90ZXN0LnhtbCBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0ZGF0YS90ZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWY5MmZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3Rlc3QueG1sCkBAIC0wLDAgKzEsMTE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzxIVE1MIHhtbG5zOnBwPSJodHRwOi8vd3d3Lmlzb2dlbi5jb20vcGF1bC9wb3N0LXByb2Nlc3NvciI+Cis8VElUTEU+SW50cm9kdWN0aW9uIHRvIFhTTDwvVElUTEU+Cis8SDE+SW50cm9kdWN0aW9uIHRvIFhTTDwvSDE+CisJCisKKwkKKwkJPEhSLz4KKwkJPEgyPk92ZXJ2aWV3Cis8L0gyPgorCQk8VUw+CisJCQorCTxMST4xLkludHJvPC9MST4KKworCTxMST4yLkhpc3Rvcnk8L0xJPgorCisJPExJPjMuWFNMIEJhc2ljczwvTEk+CisKKwk8TEk+THVuY2g8L0xJPgorCisJPExJPjQuQW4gWE1MIERhdGEgTW9kZWw8L0xJPgorCisJPExJPjUuWFNMIFBhdHRlcm5zPC9MST4KKworCTxMST42LlhTTCBUZW1wbGF0ZXM8L0xJPgorCisJPExJPjcuWFNMIEZvcm1hdHRpbmcgTW9kZWwKKzwvTEk+CisKKwkJPC9VTD4KKwkKKworCisJCisKKwkKKwkJPEhSLz4KKwkJPEgyPkludHJvPC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+V2hvIGFtIEk/PC9MST4KKworCTxMST5XaG8gYXJlIHlvdT88L0xJPgorCisJPExJPldoeSBhcmUgd2UgaGVyZT8KKzwvTEk+CisKKwkJPC9VTD4KKwkKKworCisJCisKKwkKKwkJPEhSLz4KKwkJPEgyPkhpc3Rvcnk6IFhNTCBhbmQgU0dNTDwvSDI+CisJCTxVTD4KKwkJCisJPExJPlhNTCBpcyBhIHN1YnNldCBvZiBTR01MLjwvTEk+CisKKwk8TEk+U0dNTCBhbGxvd3MgdGhlIHNlcGFyYXRpb24gb2YgYWJzdHJhY3QgY29udGVudCBmcm9tIGZvcm1hdHRpbmcuPC9MST4KKworCTxMST5BbHNvIG9uZSBvZiBYTUwncyBwcmltYXJ5IHZpcnR1ZXMgKGluIHRoZSBkb2MgcHVibGlzaGluZyBkb21haW4pLgorPC9MST4KKworCQk8L1VMPgorCQorCisKKwkKKworCQorCQk8SFIvPgorCQk8SDI+SGlzdG9yeTogV2hhdCBhcmUgc3R5bGVzaGVldHM/PC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+U3R5bGVzaGVldHMgc3BlY2lmeSB0aGUgZm9ybWF0dGluZyBvZiBTR01ML1hNTCBkb2N1bWVudHMuPC9MST4KKworCTxMST5TdHlsZXNoZWV0cyBwdXQgdGhlICZxdW90O3N0eWxlJnF1b3Q7IGJhY2sgaW50byBkb2N1bWVudHMuPC9MST4KKworCTxMST5OZXcgWW9yayBUaW1lcyBjb250ZW50K05ZVCBTdHlsZXNoZWV0ID0gTllUIHBhcGVyCis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorCisJCisJCTxIUi8+CisJCTxIMj5IaXN0b3J5OiBGT1NJPC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+Rk9TSTogJnF1b3Q7Rm9ybWF0dGVkIE91dHB1dCBTcGVjaWZpY2F0aW9uIEluc3RhbmNlJnF1b3Q7Cis8VUw+CisJPExJPk1JTC1TVEQtMjgwMDEKKwk8L0xJPgorCisJPExJPkZPU0kncyBhcmUgU0dNTCBkb2N1bWVudHMKKwk8L0xJPgorCisJPExJPkEgc3R5bGVzaGVldCBmb3IgYW5vdGhlciBkb2N1bWVudAorCTwvTEk+Cis8L1VMPjwvTEk+CisKKwk8TEk+T2Jzb2xldGUgYnV0IGltcGxlbWVudGVkLi4uCis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorPC9IVE1MPgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RkYXRhL3Rlc3QueG1sLm91dCBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0ZGF0YS90ZXN0LnhtbC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRhYjFhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0ZGF0YS90ZXN0LnhtbC5vdXQKQEAgLTAsMCArMSwxMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz4KKzxIVE1MIHhtbG5zOnBwPSJodHRwOi8vd3d3Lmlzb2dlbi5jb20vcGF1bC9wb3N0LXByb2Nlc3NvciI+Cis8VElUTEU+SW50cm9kdWN0aW9uIHRvIFhTTDwvVElUTEU+Cis8SDE+SW50cm9kdWN0aW9uIHRvIFhTTDwvSDE+CisJCisKKwkKKwkJPEhSPjwvSFI+CisJCTxIMj5PdmVydmlldworPC9IMj4KKwkJPFVMPgorCQkKKwk8TEk+MS5JbnRybzwvTEk+CisKKwk8TEk+Mi5IaXN0b3J5PC9MST4KKworCTxMST4zLlhTTCBCYXNpY3M8L0xJPgorCisJPExJPkx1bmNoPC9MST4KKworCTxMST40LkFuIFhNTCBEYXRhIE1vZGVsPC9MST4KKworCTxMST41LlhTTCBQYXR0ZXJuczwvTEk+CisKKwk8TEk+Ni5YU0wgVGVtcGxhdGVzPC9MST4KKworCTxMST43LlhTTCBGb3JtYXR0aW5nIE1vZGVsCis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorCisJCisJCTxIUj48L0hSPgorCQk8SDI+SW50cm88L0gyPgorCQk8VUw+CisJCQorCTxMST5XaG8gYW0gST88L0xJPgorCisJPExJPldobyBhcmUgeW91PzwvTEk+CisKKwk8TEk+V2h5IGFyZSB3ZSBoZXJlPworPC9MST4KKworCQk8L1VMPgorCQorCisKKwkKKworCQorCQk8SFI+PC9IUj4KKwkJPEgyPkhpc3Rvcnk6IFhNTCBhbmQgU0dNTDwvSDI+CisJCTxVTD4KKwkJCisJPExJPlhNTCBpcyBhIHN1YnNldCBvZiBTR01MLjwvTEk+CisKKwk8TEk+U0dNTCBhbGxvd3MgdGhlIHNlcGFyYXRpb24gb2YgYWJzdHJhY3QgY29udGVudCBmcm9tIGZvcm1hdHRpbmcuPC9MST4KKworCTxMST5BbHNvIG9uZSBvZiBYTUwncyBwcmltYXJ5IHZpcnR1ZXMgKGluIHRoZSBkb2MgcHVibGlzaGluZyBkb21haW4pLgorPC9MST4KKworCQk8L1VMPgorCQorCisKKwkKKworCQorCQk8SFI+PC9IUj4KKwkJPEgyPkhpc3Rvcnk6IFdoYXQgYXJlIHN0eWxlc2hlZXRzPzwvSDI+CisJCTxVTD4KKwkJCisJPExJPlN0eWxlc2hlZXRzIHNwZWNpZnkgdGhlIGZvcm1hdHRpbmcgb2YgU0dNTC9YTUwgZG9jdW1lbnRzLjwvTEk+CisKKwk8TEk+U3R5bGVzaGVldHMgcHV0IHRoZSAic3R5bGUiIGJhY2sgaW50byBkb2N1bWVudHMuPC9MST4KKworCTxMST5OZXcgWW9yayBUaW1lcyBjb250ZW50K05ZVCBTdHlsZXNoZWV0ID0gTllUIHBhcGVyCis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorCisJCisJCTxIUj48L0hSPgorCQk8SDI+SGlzdG9yeTogRk9TSTwvSDI+CisJCTxVTD4KKwkJCisJPExJPkZPU0k6ICJGb3JtYXR0ZWQgT3V0cHV0IFNwZWNpZmljYXRpb24gSW5zdGFuY2UiCis8VUw+CisJPExJPk1JTC1TVEQtMjgwMDEKKwk8L0xJPgorCisJPExJPkZPU0kncyBhcmUgU0dNTCBkb2N1bWVudHMKKwk8L0xJPgorCisJPExJPkEgc3R5bGVzaGVldCBmb3IgYW5vdGhlciBkb2N1bWVudAorCTwvTEk+Cis8L1VMPjwvTEk+CisKKwk8TEk+T2Jzb2xldGUgYnV0IGltcGxlbWVudGVkLi4uCis8L0xJPgorCisJCTwvVUw+CisJCisKKworCQorPC9IVE1MPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0cy5weSBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjAzNzA5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5CkBAIC0wLDAgKzEsMjEgQEAKKyMgQ29udmVuaWVuY2UgdGVzdCBtb2R1bGUgdG8gcnVuIGFsbCBvZiB0aGUgWE1MLXJlbGF0ZWQgdGVzdHMgaW4gdGhlCisjIHN0YW5kYXJkIGxpYnJhcnkuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAorCit0ZXN0LnRlc3Rfc3VwcG9ydC52ZXJib3NlID0gMAorCitkZWYgcnVudGVzdChuYW1lKToKKyAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbmFtZV0KKyAgICBpZiBoYXNhdHRyKG1vZHVsZSwgInRlc3RfbWFpbiIpOgorICAgICAgICBtb2R1bGUudGVzdF9tYWluKCkKKworcnVudGVzdCgidGVzdC50ZXN0X21pbmlkb20iKQorcnVudGVzdCgidGVzdC50ZXN0X3B5ZXhwYXQiKQorcnVudGVzdCgidGVzdC50ZXN0X3NheCIpCitydW50ZXN0KCJ0ZXN0LnRlc3RfeG1sX2V0cmVlIikKK3J1bnRlc3QoInRlc3QudGVzdF94bWxfZXRyZWVfYyIpCitydW50ZXN0KCJ0ZXN0LnRlc3RfeG1sbGliIikKK3J1bnRlc3QoInRlc3QudGVzdF94bWxycGMiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5YyBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0cy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjODMzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0cy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3htbHRlc3RzLnB5byBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0cy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjODMzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGVzdC94bWx0ZXN0cy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXN0L3ppcGRpci56aXAgYi9saWIvcHl0aG9uMi43L3Rlc3QvemlwZGlyLnppcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzIxZDdhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXN0L3ppcGRpci56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXh0d3JhcC5weSBiL2xpYi9weXRob24yLjcvdGV4dHdyYXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJlYTBiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGV4dHdyYXAucHkKQEAgLTAsMCArMSw0MjUgQEAKKyIiIlRleHQgd3JhcHBpbmcgYW5kIGZpbGxpbmcuCisiIiIKKworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBHcmVnb3J5IFAuIFdhcmQuCisjIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4KKyMgV3JpdHRlbiBieSBHcmVnIFdhcmQgPGd3YXJkQHB5dGhvbi5uZXQ+CisKK19fcmV2aXNpb25fXyA9ICIkSWQkIgorCitpbXBvcnQgc3RyaW5nLCByZQorCit0cnk6CisgICAgX3VuaWNvZGUgPSB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgICMgSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgVW5pY29kZSBzdXBwb3J0LCB0aGUgdW5pY29kZSB0eXBlCisgICAgIyB3aWxsIG5vdCBleGlzdC4gRmFrZSBvbmUuCisgICAgY2xhc3MgX3VuaWNvZGUob2JqZWN0KToKKyAgICAgICAgcGFzcworCisjIERvIHRoZSByaWdodCB0aGluZyB3aXRoIGJvb2xlYW4gdmFsdWVzIGZvciBhbGwga25vd24gUHl0aG9uIHZlcnNpb25zCisjIChzbyB0aGlzIG1vZHVsZSBjYW4gYmUgY29waWVkIHRvIHByb2plY3RzIHRoYXQgZG9uJ3QgZGVwZW5kIG9uIFB5dGhvbgorIyAyLjMsIGUuZy4gT3B0aWsgYW5kIERvY3V0aWxzKSBieSB1bmNvbW1lbnRpbmcgdGhlIGJsb2NrIG9mIGNvZGUgYmVsb3cuCisjdHJ5OgorIyAgICBUcnVlLCBGYWxzZQorI2V4Y2VwdCBOYW1lRXJyb3I6CisjICAgIChUcnVlLCBGYWxzZSkgPSAoMSwgMCkKKworX19hbGxfXyA9IFsnVGV4dFdyYXBwZXInLCAnd3JhcCcsICdmaWxsJywgJ2RlZGVudCddCisKKyMgSGFyZGNvZGUgdGhlIHJlY29nbml6ZWQgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHRoZSBVUy1BU0NJSQorIyB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuICBUaGUgbWFpbiByZWFzb24gZm9yIGRvaW5nIHRoaXMgaXMgdGhhdCBpbgorIyBJU08tODg1OS0xLCAweGEwIGlzIG5vbi1icmVha2luZyB3aGl0ZXNwYWNlLCBzbyBpbiBjZXJ0YWluIGxvY2FsZXMKKyMgdGhhdCBjaGFyYWN0ZXIgd2luZHMgdXAgaW4gc3RyaW5nLndoaXRlc3BhY2UuICBSZXNwZWN0aW5nCisjIHN0cmluZy53aGl0ZXNwYWNlIGluIHRob3NlIGNhc2VzIHdvdWxkIDEpIG1ha2UgdGV4dHdyYXAgdHJlYXQgMHhhMCB0aGUKKyMgc2FtZSBhcyBhbnkgb3RoZXIgd2hpdGVzcGFjZSBjaGFyLCB3aGljaCBpcyBjbGVhcmx5IHdyb25nIChpdCdzIGEKKyMgKm5vbi1icmVha2luZyogc3BhY2UpLCAyKSBwb3NzaWJseSBjYXVzZSBwcm9ibGVtcyB3aXRoIFVuaWNvZGUsCisjIHNpbmNlIDB4YTAgaXMgbm90IGluIHJhbmdlKDEyOCkuCitfd2hpdGVzcGFjZSA9ICdcdFxuXHgwYlx4MGNcciAnCisKK2NsYXNzIFRleHRXcmFwcGVyOgorICAgICIiIgorICAgIE9iamVjdCBmb3Igd3JhcHBpbmcvZmlsbGluZyB0ZXh0LiAgVGhlIHB1YmxpYyBpbnRlcmZhY2UgY29uc2lzdHMgb2YKKyAgICB0aGUgd3JhcCgpIGFuZCBmaWxsKCkgbWV0aG9kczsgdGhlIG90aGVyIG1ldGhvZHMgYXJlIGp1c3QgdGhlcmUgZm9yCisgICAgc3ViY2xhc3NlcyB0byBvdmVycmlkZSBpbiBvcmRlciB0byB0d2VhayB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuCisgICAgSWYgeW91IHdhbnQgdG8gY29tcGxldGVseSByZXBsYWNlIHRoZSBtYWluIHdyYXBwaW5nIGFsZ29yaXRobSwKKyAgICB5b3UnbGwgcHJvYmFibHkgaGF2ZSB0byBvdmVycmlkZSBfd3JhcF9jaHVua3MoKS4KKworICAgIFNldmVyYWwgaW5zdGFuY2UgYXR0cmlidXRlcyBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB3cmFwcGluZzoKKyAgICAgIHdpZHRoIChkZWZhdWx0OiA3MCkKKyAgICAgICAgdGhlIG1heGltdW0gd2lkdGggb2Ygd3JhcHBlZCBsaW5lcyAodW5sZXNzIGJyZWFrX2xvbmdfd29yZHMKKyAgICAgICAgaXMgZmFsc2UpCisgICAgICBpbml0aWFsX2luZGVudCAoZGVmYXVsdDogIiIpCisgICAgICAgIHN0cmluZyB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIHRoZSBmaXJzdCBsaW5lIG9mIHdyYXBwZWQKKyAgICAgICAgb3V0cHV0LiAgQ291bnRzIHRvd2FyZHMgdGhlIGxpbmUncyB3aWR0aC4KKyAgICAgIHN1YnNlcXVlbnRfaW5kZW50IChkZWZhdWx0OiAiIikKKyAgICAgICAgc3RyaW5nIHRoYXQgd2lsbCBiZSBwcmVwZW5kZWQgdG8gYWxsIGxpbmVzIHNhdmUgdGhlIGZpcnN0CisgICAgICAgIG9mIHdyYXBwZWQgb3V0cHV0OyBhbHNvIGNvdW50cyB0b3dhcmRzIGVhY2ggbGluZSdzIHdpZHRoLgorICAgICAgZXhwYW5kX3RhYnMgKGRlZmF1bHQ6IHRydWUpCisgICAgICAgIEV4cGFuZCB0YWJzIGluIGlucHV0IHRleHQgdG8gc3BhY2VzIGJlZm9yZSBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgICAgIEVhY2ggdGFiIHdpbGwgYmVjb21lIDEgLi4gOCBzcGFjZXMsIGRlcGVuZGluZyBvbiBpdHMgcG9zaXRpb24gaW4KKyAgICAgICAgaXRzIGxpbmUuICBJZiBmYWxzZSwgZWFjaCB0YWIgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgICAgICByZXBsYWNlX3doaXRlc3BhY2UgKGRlZmF1bHQ6IHRydWUpCisgICAgICAgIFJlcGxhY2UgYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBpbiB0aGUgaW5wdXQgdGV4dCBieSBzcGFjZXMKKyAgICAgICAgYWZ0ZXIgdGFiIGV4cGFuc2lvbi4gIE5vdGUgdGhhdCBpZiBleHBhbmRfdGFicyBpcyBmYWxzZSBhbmQKKyAgICAgICAgcmVwbGFjZV93aGl0ZXNwYWNlIGlzIHRydWUsIGV2ZXJ5IHRhYiB3aWxsIGJlIGNvbnZlcnRlZCB0byBhCisgICAgICAgIHNpbmdsZSBzcGFjZSEKKyAgICAgIGZpeF9zZW50ZW5jZV9lbmRpbmdzIChkZWZhdWx0OiBmYWxzZSkKKyAgICAgICAgRW5zdXJlIHRoYXQgc2VudGVuY2UtZW5kaW5nIHB1bmN0dWF0aW9uIGlzIGFsd2F5cyBmb2xsb3dlZAorICAgICAgICBieSB0d28gc3BhY2VzLiAgT2ZmIGJ5IGRlZmF1bHQgYmVjYXVzZSB0aGUgYWxnb3JpdGhtIGlzCisgICAgICAgICh1bmF2b2lkYWJseSkgaW1wZXJmZWN0LgorICAgICAgYnJlYWtfbG9uZ193b3JkcyAoZGVmYXVsdDogdHJ1ZSkKKyAgICAgICAgQnJlYWsgd29yZHMgbG9uZ2VyIHRoYW4gJ3dpZHRoJy4gIElmIGZhbHNlLCB0aG9zZSB3b3JkcyB3aWxsIG5vdAorICAgICAgICBiZSBicm9rZW4sIGFuZCBzb21lIGxpbmVzIG1pZ2h0IGJlIGxvbmdlciB0aGFuICd3aWR0aCcuCisgICAgICBicmVha19vbl9oeXBoZW5zIChkZWZhdWx0OiB0cnVlKQorICAgICAgICBBbGxvdyBicmVha2luZyBoeXBoZW5hdGVkIHdvcmRzLiBJZiB0cnVlLCB3cmFwcGluZyB3aWxsIG9jY3VyCisgICAgICAgIHByZWZlcmFibHkgb24gd2hpdGVzcGFjZXMgYW5kIHJpZ2h0IGFmdGVyIGh5cGhlbnMgcGFydCBvZgorICAgICAgICBjb21wb3VuZCB3b3Jkcy4KKyAgICAgIGRyb3Bfd2hpdGVzcGFjZSAoZGVmYXVsdDogdHJ1ZSkKKyAgICAgICAgRHJvcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbGluZXMuCisgICAgIiIiCisKKyAgICB3aGl0ZXNwYWNlX3RyYW5zID0gc3RyaW5nLm1ha2V0cmFucyhfd2hpdGVzcGFjZSwgJyAnICogbGVuKF93aGl0ZXNwYWNlKSkKKworICAgIHVuaWNvZGVfd2hpdGVzcGFjZV90cmFucyA9IHt9CisgICAgdXNwYWNlID0gb3JkKHUnICcpCisgICAgZm9yIHggaW4gbWFwKG9yZCwgX3doaXRlc3BhY2UpOgorICAgICAgICB1bmljb2RlX3doaXRlc3BhY2VfdHJhbnNbeF0gPSB1c3BhY2UKKworICAgICMgVGhpcyBmdW5reSBsaXR0bGUgcmVnZXggaXMganVzdCB0aGUgdHJpY2sgZm9yIHNwbGl0dGluZworICAgICMgdGV4dCB1cCBpbnRvIHdvcmQtd3JhcHBhYmxlIGNodW5rcy4gIEUuZy4KKyAgICAjICAgIkhlbGxvIHRoZXJlIC0tIHlvdSBnb29mLWJhbGwsIHVzZSB0aGUgLWIgb3B0aW9uISIKKyAgICAjIHNwbGl0cyBpbnRvCisgICAgIyAgIEhlbGxvLyAvdGhlcmUvIC8tLS8gL3lvdS8gL2dvb2YtL2JhbGwsLyAvdXNlLyAvdGhlLyAvLWIvIC9vcHRpb24hCisgICAgIyAoYWZ0ZXIgc3RyaXBwaW5nIG91dCBlbXB0eSBzdHJpbmdzKS4KKyAgICB3b3Jkc2VwX3JlID0gcmUuY29tcGlsZSgKKyAgICAgICAgcicoXHMrfCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbnkgd2hpdGVzcGFjZQorICAgICAgICByJ1teXHNcd10qXHcrW14wLTlcV10tKD89XHcrW14wLTlcV10pfCcgICAjIGh5cGhlbmF0ZWQgd29yZHMKKyAgICAgICAgcicoPzw9W1x3XCFcIlwnXCZcLlwsXD9dKS17Mix9KD89XHcpKScpICAgIyBlbS1kYXNoCisKKyAgICAjIFRoaXMgbGVzcyBmdW5reSBsaXR0bGUgcmVnZXgganVzdCBzcGxpdCBvbiByZWNvZ25pemVkIHNwYWNlcy4gRS5nLgorICAgICMgICAiSGVsbG8gdGhlcmUgLS0geW91IGdvb2YtYmFsbCwgdXNlIHRoZSAtYiBvcHRpb24hIgorICAgICMgc3BsaXRzIGludG8KKyAgICAjICAgSGVsbG8vIC90aGVyZS8gLy0tLyAveW91LyAvZ29vZi1iYWxsLC8gL3VzZS8gL3RoZS8gLy1iLyAvb3B0aW9uIS8KKyAgICB3b3Jkc2VwX3NpbXBsZV9yZSA9IHJlLmNvbXBpbGUocicoXHMrKScpCisKKyAgICAjIFhYWCB0aGlzIGlzIG5vdCBsb2NhbGUtIG9yIGNoYXJzZXQtYXdhcmUgLS0gc3RyaW5nLmxvd2VyY2FzZQorICAgICMgaXMgVVMtQVNDSUkgb25seSAoYW5kIHRoZXJlZm9yZSBFbmdsaXNoLW9ubHkpCisgICAgc2VudGVuY2VfZW5kX3JlID0gcmUuY29tcGlsZShyJ1slc10nICAgICAgICAgICAgICAjIGxvd2VyY2FzZSBsZXR0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInW1wuXCFcP10nICAgICAgICAgICMgc2VudGVuY2UtZW5kaW5nIHB1bmN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcidbXCJcJ10/JyAgICAgICAgICAgIyBvcHRpb25hbCBlbmQtb2YtcXVvdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHInXFonICAgICAgICAgICAgICAgICMgZW5kIG9mIGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIHN0cmluZy5sb3dlcmNhc2UpCisKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLAorICAgICAgICAgICAgICAgICB3aWR0aD03MCwKKyAgICAgICAgICAgICAgICAgaW5pdGlhbF9pbmRlbnQ9IiIsCisgICAgICAgICAgICAgICAgIHN1YnNlcXVlbnRfaW5kZW50PSIiLAorICAgICAgICAgICAgICAgICBleHBhbmRfdGFicz1UcnVlLAorICAgICAgICAgICAgICAgICByZXBsYWNlX3doaXRlc3BhY2U9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgZml4X3NlbnRlbmNlX2VuZGluZ3M9RmFsc2UsCisgICAgICAgICAgICAgICAgIGJyZWFrX2xvbmdfd29yZHM9VHJ1ZSwKKyAgICAgICAgICAgICAgICAgZHJvcF93aGl0ZXNwYWNlPVRydWUsCisgICAgICAgICAgICAgICAgIGJyZWFrX29uX2h5cGhlbnM9VHJ1ZSk6CisgICAgICAgIHNlbGYud2lkdGggPSB3aWR0aAorICAgICAgICBzZWxmLmluaXRpYWxfaW5kZW50ID0gaW5pdGlhbF9pbmRlbnQKKyAgICAgICAgc2VsZi5zdWJzZXF1ZW50X2luZGVudCA9IHN1YnNlcXVlbnRfaW5kZW50CisgICAgICAgIHNlbGYuZXhwYW5kX3RhYnMgPSBleHBhbmRfdGFicworICAgICAgICBzZWxmLnJlcGxhY2Vfd2hpdGVzcGFjZSA9IHJlcGxhY2Vfd2hpdGVzcGFjZQorICAgICAgICBzZWxmLmZpeF9zZW50ZW5jZV9lbmRpbmdzID0gZml4X3NlbnRlbmNlX2VuZGluZ3MKKyAgICAgICAgc2VsZi5icmVha19sb25nX3dvcmRzID0gYnJlYWtfbG9uZ193b3JkcworICAgICAgICBzZWxmLmRyb3Bfd2hpdGVzcGFjZSA9IGRyb3Bfd2hpdGVzcGFjZQorICAgICAgICBzZWxmLmJyZWFrX29uX2h5cGhlbnMgPSBicmVha19vbl9oeXBoZW5zCisKKyAgICAgICAgIyByZWNvbXBpbGUgdGhlIHJlZ2V4ZXMgZm9yIFVuaWNvZGUgbW9kZSAtLSBkb25lIGluIHRoaXMgY2x1bXN5IHdheSBmb3IKKyAgICAgICAgIyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBiZWNhdXNlIGl0J3MgcmF0aGVyIGNvbW1vbiB0byBtb25rZXktcGF0Y2gKKyAgICAgICAgIyB0aGUgVGV4dFdyYXBwZXIgY2xhc3MnIHdvcmRzZXBfcmUgYXR0cmlidXRlLgorICAgICAgICBzZWxmLndvcmRzZXBfcmVfdW5pID0gcmUuY29tcGlsZShzZWxmLndvcmRzZXBfcmUucGF0dGVybiwgcmUuVSkKKyAgICAgICAgc2VsZi53b3Jkc2VwX3NpbXBsZV9yZV91bmkgPSByZS5jb21waWxlKAorICAgICAgICAgICAgc2VsZi53b3Jkc2VwX3NpbXBsZV9yZS5wYXR0ZXJuLCByZS5VKQorCisKKyAgICAjIC0tIFByaXZhdGUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICMgKHBvc3NpYmx5IHVzZWZ1bCBmb3Igc3ViY2xhc3NlcyB0byBvdmVycmlkZSkKKworICAgIGRlZiBfbXVuZ2Vfd2hpdGVzcGFjZShzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiX211bmdlX3doaXRlc3BhY2UodGV4dCA6IHN0cmluZykgLT4gc3RyaW5nCisKKyAgICAgICAgTXVuZ2Ugd2hpdGVzcGFjZSBpbiB0ZXh0OiBleHBhbmQgdGFicyBhbmQgY29udmVydCBhbGwgb3RoZXIKKyAgICAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHRvIHNwYWNlcy4gIEVnLiAiIGZvb1x0YmFyXG5cbmJheiIKKyAgICAgICAgYmVjb21lcyAiIGZvbyAgICBiYXIgIGJheiIuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmV4cGFuZF90YWJzOgorICAgICAgICAgICAgdGV4dCA9IHRleHQuZXhwYW5kdGFicygpCisgICAgICAgIGlmIHNlbGYucmVwbGFjZV93aGl0ZXNwYWNlOgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXh0LCBzdHIpOgorICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRyYW5zbGF0ZShzZWxmLndoaXRlc3BhY2VfdHJhbnMpCisgICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGV4dCwgX3VuaWNvZGUpOgorICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnRyYW5zbGF0ZShzZWxmLnVuaWNvZGVfd2hpdGVzcGFjZV90cmFucykKKyAgICAgICAgcmV0dXJuIHRleHQKKworCisgICAgZGVmIF9zcGxpdChzZWxmLCB0ZXh0KToKKyAgICAgICAgIiIiX3NwbGl0KHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddCisKKyAgICAgICAgU3BsaXQgdGhlIHRleHQgdG8gd3JhcCBpbnRvIGluZGl2aXNpYmxlIGNodW5rcy4gIENodW5rcyBhcmUKKyAgICAgICAgbm90IHF1aXRlIHRoZSBzYW1lIGFzIHdvcmRzOyBzZWUgX3dyYXBfY2h1bmtzKCkgZm9yIGZ1bGwKKyAgICAgICAgZGV0YWlscy4gIEFzIGFuIGV4YW1wbGUsIHRoZSB0ZXh0CisgICAgICAgICAgTG9vaywgZ29vZi1iYWxsIC0tIHVzZSB0aGUgLWIgb3B0aW9uIQorICAgICAgICBicmVha3MgaW50byB0aGUgZm9sbG93aW5nIGNodW5rczoKKyAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLScsICdiYWxsJywgJyAnLCAnLS0nLCAnICcsCisgICAgICAgICAgJ3VzZScsICcgJywgJ3RoZScsICcgJywgJy1iJywgJyAnLCAnb3B0aW9uIScKKyAgICAgICAgaWYgYnJlYWtfb25faHlwaGVucyBpcyBUcnVlLCBvciBpbjoKKyAgICAgICAgICAnTG9vaywnLCAnICcsICdnb29mLWJhbGwnLCAnICcsICctLScsICcgJywKKyAgICAgICAgICAndXNlJywgJyAnLCAndGhlJywgJyAnLCAnLWInLCAnICcsIG9wdGlvbiEnCisgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UodGV4dCwgX3VuaWNvZGUpOgorICAgICAgICAgICAgaWYgc2VsZi5icmVha19vbl9oeXBoZW5zOgorICAgICAgICAgICAgICAgIHBhdCA9IHNlbGYud29yZHNlcF9yZV91bmkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGF0ID0gc2VsZi53b3Jkc2VwX3NpbXBsZV9yZV91bmkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHNlbGYuYnJlYWtfb25faHlwaGVuczoKKyAgICAgICAgICAgICAgICBwYXQgPSBzZWxmLndvcmRzZXBfcmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGF0ID0gc2VsZi53b3Jkc2VwX3NpbXBsZV9yZQorICAgICAgICBjaHVua3MgPSBwYXQuc3BsaXQodGV4dCkKKyAgICAgICAgY2h1bmtzID0gZmlsdGVyKE5vbmUsIGNodW5rcykgICMgcmVtb3ZlIGVtcHR5IGNodW5rcworICAgICAgICByZXR1cm4gY2h1bmtzCisKKyAgICBkZWYgX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKHNlbGYsIGNodW5rcyk6CisgICAgICAgICIiIl9maXhfc2VudGVuY2VfZW5kaW5ncyhjaHVua3MgOiBbc3RyaW5nXSkKKworICAgICAgICBDb3JyZWN0IGZvciBzZW50ZW5jZSBlbmRpbmdzIGJ1cmllZCBpbiAnY2h1bmtzJy4gIEVnLiB3aGVuIHRoZQorICAgICAgICBvcmlnaW5hbCB0ZXh0IGNvbnRhaW5zICIuLi4gZm9vLlxuQmFyIC4uLiIsIG11bmdlX3doaXRlc3BhY2UoKQorICAgICAgICBhbmQgc3BsaXQoKSB3aWxsIGNvbnZlcnQgdGhhdCB0byBbLi4uLCAiZm9vLiIsICIgIiwgIkJhciIsIC4uLl0KKyAgICAgICAgd2hpY2ggaGFzIG9uZSB0b28gZmV3IHNwYWNlczsgdGhpcyBtZXRob2Qgc2ltcGx5IGNoYW5nZXMgdGhlIG9uZQorICAgICAgICBzcGFjZSB0byB0d28uCisgICAgICAgICIiIgorICAgICAgICBpID0gMAorICAgICAgICBwYXRzZWFyY2ggPSBzZWxmLnNlbnRlbmNlX2VuZF9yZS5zZWFyY2gKKyAgICAgICAgd2hpbGUgaSA8IGxlbihjaHVua3MpLTE6CisgICAgICAgICAgICBpZiBjaHVua3NbaSsxXSA9PSAiICIgYW5kIHBhdHNlYXJjaChjaHVua3NbaV0pOgorICAgICAgICAgICAgICAgIGNodW5rc1tpKzFdID0gIiAgIgorICAgICAgICAgICAgICAgIGkgKz0gMgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpICs9IDEKKworICAgIGRlZiBfaGFuZGxlX2xvbmdfd29yZChzZWxmLCByZXZlcnNlZF9jaHVua3MsIGN1cl9saW5lLCBjdXJfbGVuLCB3aWR0aCk6CisgICAgICAgICIiIl9oYW5kbGVfbG9uZ193b3JkKGNodW5rcyA6IFtzdHJpbmddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGluZSA6IFtzdHJpbmddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJfbGVuIDogaW50LCB3aWR0aCA6IGludCkKKworICAgICAgICBIYW5kbGUgYSBjaHVuayBvZiB0ZXh0IChtb3N0IGxpa2VseSBhIHdvcmQsIG5vdCB3aGl0ZXNwYWNlKSB0aGF0CisgICAgICAgIGlzIHRvbyBsb25nIHRvIGZpdCBpbiBhbnkgbGluZS4KKyAgICAgICAgIiIiCisgICAgICAgICMgRmlndXJlIG91dCB3aGVuIGluZGVudCBpcyBsYXJnZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHdpZHRoLCBhbmQgbWFrZQorICAgICAgICAjIHN1cmUgYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBpcyBzdHJpcHBlZCBvZmYgb24gZXZlcnkgcGFzcworICAgICAgICBpZiB3aWR0aCA8IDE6CisgICAgICAgICAgICBzcGFjZV9sZWZ0ID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3BhY2VfbGVmdCA9IHdpZHRoIC0gY3VyX2xlbgorCisgICAgICAgICMgSWYgd2UncmUgYWxsb3dlZCB0byBicmVhayBsb25nIHdvcmRzLCB0aGVuIGRvIHNvOiBwdXQgYXMgbXVjaAorICAgICAgICAjIG9mIHRoZSBuZXh0IGNodW5rIG9udG8gdGhlIGN1cnJlbnQgbGluZSBhcyB3aWxsIGZpdC4KKyAgICAgICAgaWYgc2VsZi5icmVha19sb25nX3dvcmRzOgorICAgICAgICAgICAgY3VyX2xpbmUuYXBwZW5kKHJldmVyc2VkX2NodW5rc1stMV1bOnNwYWNlX2xlZnRdKQorICAgICAgICAgICAgcmV2ZXJzZWRfY2h1bmtzWy0xXSA9IHJldmVyc2VkX2NodW5rc1stMV1bc3BhY2VfbGVmdDpdCisKKyAgICAgICAgIyBPdGhlcndpc2UsIHdlIGhhdmUgdG8gcHJlc2VydmUgdGhlIGxvbmcgd29yZCBpbnRhY3QuICBPbmx5IGFkZAorICAgICAgICAjIGl0IHRvIHRoZSBjdXJyZW50IGxpbmUgaWYgdGhlcmUncyBub3RoaW5nIGFscmVhZHkgdGhlcmUgLS0KKyAgICAgICAgIyB0aGF0IG1pbmltaXplcyBob3cgbXVjaCB3ZSB2aW9sYXRlIHRoZSB3aWR0aCBjb25zdHJhaW50LgorICAgICAgICBlbGlmIG5vdCBjdXJfbGluZToKKyAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChyZXZlcnNlZF9jaHVua3MucG9wKCkpCisKKyAgICAgICAgIyBJZiB3ZSdyZSBub3QgYWxsb3dlZCB0byBicmVhayBsb25nIHdvcmRzLCBhbmQgdGhlcmUncyBhbHJlYWR5CisgICAgICAgICMgdGV4dCBvbiB0aGUgY3VycmVudCBsaW5lLCBkbyBub3RoaW5nLiAgTmV4dCB0aW1lIHRocm91Z2ggdGhlCisgICAgICAgICMgbWFpbiBsb29wIG9mIF93cmFwX2NodW5rcygpLCB3ZSdsbCB3aW5kIHVwIGhlcmUgYWdhaW4sIGJ1dAorICAgICAgICAjIGN1cl9sZW4gd2lsbCBiZSB6ZXJvLCBzbyB0aGUgbmV4dCBsaW5lIHdpbGwgYmUgZW50aXJlbHkKKyAgICAgICAgIyBkZXZvdGVkIHRvIHRoZSBsb25nIHdvcmQgdGhhdCB3ZSBjYW4ndCBoYW5kbGUgcmlnaHQgbm93LgorCisgICAgZGVmIF93cmFwX2NodW5rcyhzZWxmLCBjaHVua3MpOgorICAgICAgICAiIiJfd3JhcF9jaHVua3MoY2h1bmtzIDogW3N0cmluZ10pIC0+IFtzdHJpbmddCisKKyAgICAgICAgV3JhcCBhIHNlcXVlbmNlIG9mIHRleHQgY2h1bmtzIGFuZCByZXR1cm4gYSBsaXN0IG9mIGxpbmVzIG9mCisgICAgICAgIGxlbmd0aCAnc2VsZi53aWR0aCcgb3IgbGVzcy4gIChJZiAnYnJlYWtfbG9uZ193b3JkcycgaXMgZmFsc2UsCisgICAgICAgIHNvbWUgbGluZXMgbWF5IGJlIGxvbmdlciB0aGFuIHRoaXMuKSAgQ2h1bmtzIGNvcnJlc3BvbmQgcm91Z2hseQorICAgICAgICB0byB3b3JkcyBhbmQgdGhlIHdoaXRlc3BhY2UgYmV0d2VlbiB0aGVtOiBlYWNoIGNodW5rIGlzCisgICAgICAgIGluZGl2aXNpYmxlIChtb2R1bG8gJ2JyZWFrX2xvbmdfd29yZHMnKSwgYnV0IGEgbGluZSBicmVhayBjYW4KKyAgICAgICAgY29tZSBiZXR3ZWVuIGFueSB0d28gY2h1bmtzLiAgQ2h1bmtzIHNob3VsZCBub3QgaGF2ZSBpbnRlcm5hbAorICAgICAgICB3aGl0ZXNwYWNlOyBpZS4gYSBjaHVuayBpcyBlaXRoZXIgYWxsIHdoaXRlc3BhY2Ugb3IgYSAid29yZCIuCisgICAgICAgIFdoaXRlc3BhY2UgY2h1bmtzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZgorICAgICAgICBsaW5lcywgYnV0IGFwYXJ0IGZyb20gdGhhdCB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGxpbmVzID0gW10KKyAgICAgICAgaWYgc2VsZi53aWR0aCA8PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCB3aWR0aCAlciAobXVzdCBiZSA+IDApIiAlIHNlbGYud2lkdGgpCisKKyAgICAgICAgIyBBcnJhbmdlIGluIHJldmVyc2Ugb3JkZXIgc28gaXRlbXMgY2FuIGJlIGVmZmljaWVudGx5IHBvcHBlZAorICAgICAgICAjIGZyb20gYSBzdGFjayBvZiBjaHVja3MuCisgICAgICAgIGNodW5rcy5yZXZlcnNlKCkKKworICAgICAgICB3aGlsZSBjaHVua3M6CisKKyAgICAgICAgICAgICMgU3RhcnQgdGhlIGxpc3Qgb2YgY2h1bmtzIHRoYXQgd2lsbCBtYWtlIHVwIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICAgICAgICAjIGN1cl9sZW4gaXMganVzdCB0aGUgbGVuZ3RoIG9mIGFsbCB0aGUgY2h1bmtzIGluIGN1cl9saW5lLgorICAgICAgICAgICAgY3VyX2xpbmUgPSBbXQorICAgICAgICAgICAgY3VyX2xlbiA9IDAKKworICAgICAgICAgICAgIyBGaWd1cmUgb3V0IHdoaWNoIHN0YXRpYyBzdHJpbmcgd2lsbCBwcmVmaXggdGhpcyBsaW5lLgorICAgICAgICAgICAgaWYgbGluZXM6CisgICAgICAgICAgICAgICAgaW5kZW50ID0gc2VsZi5zdWJzZXF1ZW50X2luZGVudAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbmRlbnQgPSBzZWxmLmluaXRpYWxfaW5kZW50CisKKyAgICAgICAgICAgICMgTWF4aW11bSB3aWR0aCBmb3IgdGhpcyBsaW5lLgorICAgICAgICAgICAgd2lkdGggPSBzZWxmLndpZHRoIC0gbGVuKGluZGVudCkKKworICAgICAgICAgICAgIyBGaXJzdCBjaHVuayBvbiBsaW5lIGlzIHdoaXRlc3BhY2UgLS0gZHJvcCBpdCwgdW5sZXNzIHRoaXMKKyAgICAgICAgICAgICMgaXMgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSB0ZXh0IChpZS4gbm8gbGluZXMgc3RhcnRlZCB5ZXQpLgorICAgICAgICAgICAgaWYgc2VsZi5kcm9wX3doaXRlc3BhY2UgYW5kIGNodW5rc1stMV0uc3RyaXAoKSA9PSAnJyBhbmQgbGluZXM6CisgICAgICAgICAgICAgICAgZGVsIGNodW5rc1stMV0KKworICAgICAgICAgICAgd2hpbGUgY2h1bmtzOgorICAgICAgICAgICAgICAgIGwgPSBsZW4oY2h1bmtzWy0xXSkKKworICAgICAgICAgICAgICAgICMgQ2FuIGF0IGxlYXN0IHNxdWVlemUgdGhpcyBjaHVuayBvbnRvIHRoZSBjdXJyZW50IGxpbmUuCisgICAgICAgICAgICAgICAgaWYgY3VyX2xlbiArIGwgPD0gd2lkdGg6CisgICAgICAgICAgICAgICAgICAgIGN1cl9saW5lLmFwcGVuZChjaHVua3MucG9wKCkpCisgICAgICAgICAgICAgICAgICAgIGN1cl9sZW4gKz0gbAorCisgICAgICAgICAgICAgICAgIyBOb3BlLCB0aGlzIGxpbmUgaXMgZnVsbC4KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICAjIFRoZSBjdXJyZW50IGxpbmUgaXMgZnVsbCwgYW5kIHRoZSBuZXh0IGNodW5rIGlzIHRvbyBiaWcgdG8KKyAgICAgICAgICAgICMgZml0IG9uICphbnkqIGxpbmUgKG5vdCBqdXN0IHRoaXMgb25lKS4KKyAgICAgICAgICAgIGlmIGNodW5rcyBhbmQgbGVuKGNodW5rc1stMV0pID4gd2lkdGg6CisgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2xvbmdfd29yZChjaHVua3MsIGN1cl9saW5lLCBjdXJfbGVuLCB3aWR0aCkKKworICAgICAgICAgICAgIyBJZiB0aGUgbGFzdCBjaHVuayBvbiB0aGlzIGxpbmUgaXMgYWxsIHdoaXRlc3BhY2UsIGRyb3AgaXQuCisgICAgICAgICAgICBpZiBzZWxmLmRyb3Bfd2hpdGVzcGFjZSBhbmQgY3VyX2xpbmUgYW5kIGN1cl9saW5lWy0xXS5zdHJpcCgpID09ICcnOgorICAgICAgICAgICAgICAgIGRlbCBjdXJfbGluZVstMV0KKworICAgICAgICAgICAgIyBDb252ZXJ0IGN1cnJlbnQgbGluZSBiYWNrIHRvIGEgc3RyaW5nIGFuZCBzdG9yZSBpdCBpbiBsaXN0CisgICAgICAgICAgICAjIG9mIGFsbCBsaW5lcyAocmV0dXJuIHZhbHVlKS4KKyAgICAgICAgICAgIGlmIGN1cl9saW5lOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChpbmRlbnQgKyAnJy5qb2luKGN1cl9saW5lKSkKKworICAgICAgICByZXR1cm4gbGluZXMKKworCisgICAgIyAtLSBQdWJsaWMgaW50ZXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIGRlZiB3cmFwKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJ3cmFwKHRleHQgOiBzdHJpbmcpIC0+IFtzdHJpbmddCisKKyAgICAgICAgUmVmb3JtYXQgdGhlIHNpbmdsZSBwYXJhZ3JhcGggaW4gJ3RleHQnIHNvIGl0IGZpdHMgaW4gbGluZXMgb2YKKyAgICAgICAgbm8gbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkCisgICAgICAgIGxpbmVzLiAgVGFicyBpbiAndGV4dCcgYXJlIGV4cGFuZGVkIHdpdGggc3RyaW5nLmV4cGFuZHRhYnMoKSwKKyAgICAgICAgYW5kIGFsbCBvdGhlciB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBuZXdsaW5lKSBhcmUKKyAgICAgICAgY29udmVydGVkIHRvIHNwYWNlLgorICAgICAgICAiIiIKKyAgICAgICAgdGV4dCA9IHNlbGYuX211bmdlX3doaXRlc3BhY2UodGV4dCkKKyAgICAgICAgY2h1bmtzID0gc2VsZi5fc3BsaXQodGV4dCkKKyAgICAgICAgaWYgc2VsZi5maXhfc2VudGVuY2VfZW5kaW5nczoKKyAgICAgICAgICAgIHNlbGYuX2ZpeF9zZW50ZW5jZV9lbmRpbmdzKGNodW5rcykKKyAgICAgICAgcmV0dXJuIHNlbGYuX3dyYXBfY2h1bmtzKGNodW5rcykKKworICAgIGRlZiBmaWxsKHNlbGYsIHRleHQpOgorICAgICAgICAiIiJmaWxsKHRleHQgOiBzdHJpbmcpIC0+IHN0cmluZworCisgICAgICAgIFJlZm9ybWF0IHRoZSBzaW5nbGUgcGFyYWdyYXBoIGluICd0ZXh0JyB0byBmaXQgaW4gbGluZXMgb2Ygbm8KKyAgICAgICAgbW9yZSB0aGFuICdzZWxmLndpZHRoJyBjb2x1bW5zLCBhbmQgcmV0dXJuIGEgbmV3IHN0cmluZworICAgICAgICBjb250YWluaW5nIHRoZSBlbnRpcmUgd3JhcHBlZCBwYXJhZ3JhcGguCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gIlxuIi5qb2luKHNlbGYud3JhcCh0ZXh0KSkKKworCisjIC0tIENvbnZlbmllbmNlIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZGVmIHdyYXAodGV4dCwgd2lkdGg9NzAsICoqa3dhcmdzKToKKyAgICAiIiJXcmFwIGEgc2luZ2xlIHBhcmFncmFwaCBvZiB0ZXh0LCByZXR1cm5pbmcgYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuCisKKyAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgc28gaXQgZml0cyBpbiBsaW5lcyBvZiBubworICAgIG1vcmUgdGhhbiAnd2lkdGgnIGNvbHVtbnMsIGFuZCByZXR1cm4gYSBsaXN0IG9mIHdyYXBwZWQgbGluZXMuICBCeQorICAgIGRlZmF1bHQsIHRhYnMgaW4gJ3RleHQnIGFyZSBleHBhbmRlZCB3aXRoIHN0cmluZy5leHBhbmR0YWJzKCksIGFuZAorICAgIGFsbCBvdGhlciB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBuZXdsaW5lKSBhcmUgY29udmVydGVkIHRvCisgICAgc3BhY2UuICBTZWUgVGV4dFdyYXBwZXIgY2xhc3MgZm9yIGF2YWlsYWJsZSBrZXl3b3JkIGFyZ3MgdG8gY3VzdG9taXplCisgICAgd3JhcHBpbmcgYmVoYXZpb3VyLgorICAgICIiIgorICAgIHcgPSBUZXh0V3JhcHBlcih3aWR0aD13aWR0aCwgKiprd2FyZ3MpCisgICAgcmV0dXJuIHcud3JhcCh0ZXh0KQorCitkZWYgZmlsbCh0ZXh0LCB3aWR0aD03MCwgKiprd2FyZ3MpOgorICAgICIiIkZpbGwgYSBzaW5nbGUgcGFyYWdyYXBoIG9mIHRleHQsIHJldHVybmluZyBhIG5ldyBzdHJpbmcuCisKKyAgICBSZWZvcm1hdCB0aGUgc2luZ2xlIHBhcmFncmFwaCBpbiAndGV4dCcgdG8gZml0IGluIGxpbmVzIG9mIG5vIG1vcmUKKyAgICB0aGFuICd3aWR0aCcgY29sdW1ucywgYW5kIHJldHVybiBhIG5ldyBzdHJpbmcgY29udGFpbmluZyB0aGUgZW50aXJlCisgICAgd3JhcHBlZCBwYXJhZ3JhcGguICBBcyB3aXRoIHdyYXAoKSwgdGFicyBhcmUgZXhwYW5kZWQgYW5kIG90aGVyCisgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGNvbnZlcnRlZCB0byBzcGFjZS4gIFNlZSBUZXh0V3JhcHBlciBjbGFzcyBmb3IKKyAgICBhdmFpbGFibGUga2V5d29yZCBhcmdzIHRvIGN1c3RvbWl6ZSB3cmFwcGluZyBiZWhhdmlvdXIuCisgICAgIiIiCisgICAgdyA9IFRleHRXcmFwcGVyKHdpZHRoPXdpZHRoLCAqKmt3YXJncykKKyAgICByZXR1cm4gdy5maWxsKHRleHQpCisKKworIyAtLSBMb29zZWx5IHJlbGF0ZWQgZnVuY3Rpb25hbGl0eSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK193aGl0ZXNwYWNlX29ubHlfcmUgPSByZS5jb21waWxlKCdeWyBcdF0rJCcsIHJlLk1VTFRJTElORSkKK19sZWFkaW5nX3doaXRlc3BhY2VfcmUgPSByZS5jb21waWxlKCcoXlsgXHRdKikoPzpbXiBcdFxuXSknLCByZS5NVUxUSUxJTkUpCisKK2RlZiBkZWRlbnQodGV4dCk6CisgICAgIiIiUmVtb3ZlIGFueSBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlIGZyb20gZXZlcnkgbGluZSBpbiBgdGV4dGAuCisKKyAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIG1ha2UgdHJpcGxlLXF1b3RlZCBzdHJpbmdzIGxpbmUgdXAgd2l0aCB0aGUgbGVmdAorICAgIGVkZ2Ugb2YgdGhlIGRpc3BsYXksIHdoaWxlIHN0aWxsIHByZXNlbnRpbmcgdGhlbSBpbiB0aGUgc291cmNlIGNvZGUKKyAgICBpbiBpbmRlbnRlZCBmb3JtLgorCisgICAgTm90ZSB0aGF0IHRhYnMgYW5kIHNwYWNlcyBhcmUgYm90aCB0cmVhdGVkIGFzIHdoaXRlc3BhY2UsIGJ1dCB0aGV5CisgICAgYXJlIG5vdCBlcXVhbDogdGhlIGxpbmVzICIgIGhlbGxvIiBhbmQgIlx0aGVsbG8iIGFyZQorICAgIGNvbnNpZGVyZWQgdG8gaGF2ZSBubyBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlLiAgKFRoaXMgYmVoYXZpb3VyIGlzCisgICAgbmV3IGluIFB5dGhvbiAyLjU7IG9sZGVyIHZlcnNpb25zIG9mIHRoaXMgbW9kdWxlIGluY29ycmVjdGx5CisgICAgZXhwYW5kZWQgdGFicyBiZWZvcmUgc2VhcmNoaW5nIGZvciBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlLikKKyAgICAiIiIKKyAgICAjIExvb2sgZm9yIHRoZSBsb25nZXN0IGxlYWRpbmcgc3RyaW5nIG9mIHNwYWNlcyBhbmQgdGFicyBjb21tb24gdG8KKyAgICAjIGFsbCBsaW5lcy4KKyAgICBtYXJnaW4gPSBOb25lCisgICAgdGV4dCA9IF93aGl0ZXNwYWNlX29ubHlfcmUuc3ViKCcnLCB0ZXh0KQorICAgIGluZGVudHMgPSBfbGVhZGluZ193aGl0ZXNwYWNlX3JlLmZpbmRhbGwodGV4dCkKKyAgICBmb3IgaW5kZW50IGluIGluZGVudHM6CisgICAgICAgIGlmIG1hcmdpbiBpcyBOb25lOgorICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50CisKKyAgICAgICAgIyBDdXJyZW50IGxpbmUgbW9yZSBkZWVwbHkgaW5kZW50ZWQgdGhhbiBwcmV2aW91cyB3aW5uZXI6CisgICAgICAgICMgbm8gY2hhbmdlIChwcmV2aW91cyB3aW5uZXIgaXMgc3RpbGwgb24gdG9wKS4KKyAgICAgICAgZWxpZiBpbmRlbnQuc3RhcnRzd2l0aChtYXJnaW4pOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgQ3VycmVudCBsaW5lIGNvbnNpc3RlbnQgd2l0aCBhbmQgbm8gZGVlcGVyIHRoYW4gcHJldmlvdXMgd2lubmVyOgorICAgICAgICAjIGl0J3MgdGhlIG5ldyB3aW5uZXIuCisgICAgICAgIGVsaWYgbWFyZ2luLnN0YXJ0c3dpdGgoaW5kZW50KToKKyAgICAgICAgICAgIG1hcmdpbiA9IGluZGVudAorCisgICAgICAgICMgQ3VycmVudCBsaW5lIGFuZCBwcmV2aW91cyB3aW5uZXIgaGF2ZSBubyBjb21tb24gd2hpdGVzcGFjZToKKyAgICAgICAgIyB0aGVyZSBpcyBubyBtYXJnaW4uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtYXJnaW4gPSAiIgorICAgICAgICAgICAgYnJlYWsKKworICAgICMgc2FuaXR5IGNoZWNrICh0ZXN0aW5nL2RlYnVnZ2luZyBvbmx5KQorICAgIGlmIDAgYW5kIG1hcmdpbjoKKyAgICAgICAgZm9yIGxpbmUgaW4gdGV4dC5zcGxpdCgiXG4iKToKKyAgICAgICAgICAgIGFzc2VydCBub3QgbGluZSBvciBsaW5lLnN0YXJ0c3dpdGgobWFyZ2luKSwgXAorICAgICAgICAgICAgICAgICAgICJsaW5lID0gJXIsIG1hcmdpbiA9ICVyIiAlIChsaW5lLCBtYXJnaW4pCisKKyAgICBpZiBtYXJnaW46CisgICAgICAgIHRleHQgPSByZS5zdWIocicoP20pXicgKyBtYXJnaW4sICcnLCB0ZXh0KQorICAgIHJldHVybiB0ZXh0CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgI3ByaW50IGRlZGVudCgiXHRmb29cblx0YmFyIikKKyAgICAjcHJpbnQgZGVkZW50KCIgIFx0aGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIpCisgICAgcHJpbnQgZGVkZW50KCJIZWxsbyB0aGVyZS5cbiAgVGhpcyBpcyBpbmRlbnRlZC4iKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXh0d3JhcC5weWMgYi9saWIvcHl0aG9uMi43L3RleHR3cmFwLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjIxMGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXh0d3JhcC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90ZXh0d3JhcC5weW8gYi9saWIvcHl0aG9uMi43L3RleHR3cmFwLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDk0N2RhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90ZXh0d3JhcC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy90aGlzLnB5IGIvbGliL3B5dGhvbjIuNy90aGlzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NzU0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RoaXMucHkKQEAgLTAsMCArMSwyOCBAQAorcyA9ICIiIkd1ciBNcmEgYnMgQ2xndWJhLCBvbCBHdnogQ3JncmVmCisKK09ybmhndnNoeSB2ZiBvcmdncmUgZ3VuYSBodHlsLgorUmtjeXZwdmcgdmYgb3JnZ3JlIGd1bmEgdnpjeXZwdmcuCitGdnpjeXIgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3lyay4KK1BiemN5cmsgdmYgb3JnZ3JlIGd1bmEgcGJ6Y3l2cG5ncnEuCitTeW5nIHZmIG9yZ2dyZSBndW5hIGFyZmdycS4KK0ZjbmVmciB2ZiBvcmdncmUgZ3VuYSBxcmFmci4KK0VybnFub3Z5dmdsIHBiaGFnZi4KK0ZjcnB2bnkgcG5mcmYgbmVyYSdnIGZjcnB2bnkgcmFiaHR1IGdiIG9lcm54IGd1ciBlaHlyZi4KK055Z3ViaHR1IGNlbnBndnBueXZnbCBvcm5nZiBjaGV2Z2wuCitSZWViZWYgZnViaHlxIGFyaXJlIGNuZmYgZnZ5cmFneWwuCitIYXlyZmYgcmtjeXZwdmd5bCBmdnlyYXBycS4KK1ZhIGd1ciBzbnByIGJzIG56b3Z0aHZnbCwgZXJzaGZyIGd1ciBncnpjZ25ndmJhIGdiIHRocmZmLgorR3VyZXIgZnViaHlxIG9yIGJhci0tIG5hcSBjZXJzcmVub3lsIGJheWwgYmFyIC0tYm9pdmJoZiBqbmwgZ2IgcWIgdmcuCitOeWd1Ymh0dSBndW5nIGpubCB6bmwgYWJnIG9yIGJvaXZiaGYgbmcgc3ZlZmcgaGF5cmZmIGxiaCdlciBRaGdwdS4KK0FiaiB2ZiBvcmdncmUgZ3VuYSBhcmlyZS4KK055Z3ViaHR1IGFyaXJlIHZmIGJzZ3JhIG9yZ2dyZSBndW5hICpldnR1ZyogYWJqLgorVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHVuZXEgZ2IgcmtjeW52YSwgdmcnZiBuIG9ucSB2cXJuLgorVnMgZ3VyIHZ6Y3lyenJhZ25ndmJhIHZmIHJuZmwgZ2IgcmtjeW52YSwgdmcgem5sIG9yIG4gdGJicSB2cXJuLgorQW56cmZjbnByZiBuZXIgYmFyIHViYXh2YXQgdGVybmcgdnFybiAtLSB5cmcnZiBxYiB6YmVyIGJzIGd1YmZyISIiIgorCitkID0ge30KK2ZvciBjIGluICg2NSwgOTcpOgorICAgIGZvciBpIGluIHJhbmdlKDI2KToKKyAgICAgICAgZFtjaHIoaStjKV0gPSBjaHIoKGkrMTMpICUgMjYgKyBjKQorCitwcmludCAiIi5qb2luKFtkLmdldChjLCBjKSBmb3IgYyBpbiBzXSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGhpcy5weWMgYi9saWIvcHl0aG9uMi43L3RoaXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTZlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RoaXMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGhpcy5weW8gYi9saWIvcHl0aG9uMi43L3RoaXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxOTZlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3RoaXMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGhyZWFkaW5nLnB5IGIvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI1NDQ4YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGhyZWFkaW5nLnB5CkBAIC0wLDAgKzEsMTMyOSBAQAorIiIiVGhyZWFkIG1vZHVsZSBlbXVsYXRpbmcgYSBzdWJzZXQgb2YgSmF2YSdzIHRocmVhZGluZyBtb2RlbC4iIiIKKworaW1wb3J0IHN5cyBhcyBfc3lzCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZGVsIF9zeXMubW9kdWxlc1tfX25hbWVfX10KKyAgICByYWlzZQorCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUgYXMgX2RlcXVlCitmcm9tIHRpbWUgaW1wb3J0IHRpbWUgYXMgX3RpbWUsIHNsZWVwIGFzIF9zbGVlcAorZnJvbSB0cmFjZWJhY2sgaW1wb3J0IGZvcm1hdF9leGMgYXMgX2Zvcm1hdF9leGMKKworIyBOb3RlIHJlZ2FyZGluZyBQRVAgOCBjb21wbGlhbnQgYWxpYXNlcworIyAgVGhpcyB0aHJlYWRpbmcgbW9kZWwgd2FzIG9yaWdpbmFsbHkgaW5zcGlyZWQgYnkgSmF2YSwgYW5kIGluaGVyaXRlZAorIyB0aGUgY29udmVudGlvbiBvZiBjYW1lbENhc2UgZnVuY3Rpb24gYW5kIG1ldGhvZCBuYW1lcyBmcm9tIHRoYXQKKyMgbGFuZ3VhZ2UuIFdoaWxlIHRob3NlIG5hbWVzIGFyZSBub3QgaW4gYW55IGltbWluZW50IGRhbmdlciBvZiBiZWluZworIyBkZXByZWNhdGVkLCBzdGFydGluZyB3aXRoIFB5dGhvbiAyLjYsIHRoZSBtb2R1bGUgbm93IHByb3ZpZGVzIGEKKyMgUEVQIDggY29tcGxpYW50IGFsaWFzIGZvciBhbnkgc3VjaCBtZXRob2QgbmFtZS4KKyMgVXNpbmcgdGhlIG5ldyBQRVAgOCBjb21wbGlhbnQgbmFtZXMgYWxzbyBmYWNpbGl0YXRlcyBzdWJzdGl0dXRpb24KKyMgd2l0aCB0aGUgbXVsdGlwcm9jZXNzaW5nIG1vZHVsZSwgd2hpY2ggZG9lc24ndCBwcm92aWRlIHRoZSBvbGQKKyMgSmF2YSBpbnNwaXJlZCBuYW1lcy4KKworCisjIFJlbmFtZSBzb21lIHN0dWZmIHNvICJmcm9tIHRocmVhZGluZyBpbXBvcnQgKiIgaXMgc2FmZQorX19hbGxfXyA9IFsnYWN0aXZlQ291bnQnLCAnYWN0aXZlX2NvdW50JywgJ0NvbmRpdGlvbicsICdjdXJyZW50VGhyZWFkJywKKyAgICAgICAgICAgJ2N1cnJlbnRfdGhyZWFkJywgJ2VudW1lcmF0ZScsICdFdmVudCcsCisgICAgICAgICAgICdMb2NrJywgJ1JMb2NrJywgJ1NlbWFwaG9yZScsICdCb3VuZGVkU2VtYXBob3JlJywgJ1RocmVhZCcsCisgICAgICAgICAgICdUaW1lcicsICdzZXRwcm9maWxlJywgJ3NldHRyYWNlJywgJ2xvY2FsJywgJ3N0YWNrX3NpemUnXQorCitfc3RhcnRfbmV3X3RocmVhZCA9IHRocmVhZC5zdGFydF9uZXdfdGhyZWFkCitfYWxsb2NhdGVfbG9jayA9IHRocmVhZC5hbGxvY2F0ZV9sb2NrCitfZ2V0X2lkZW50ID0gdGhyZWFkLmdldF9pZGVudAorVGhyZWFkRXJyb3IgPSB0aHJlYWQuZXJyb3IKK2RlbCB0aHJlYWQKKworCisjIHN5cy5leGNfY2xlYXIgaXMgdXNlZCB0byB3b3JrIGFyb3VuZCB0aGUgZmFjdCB0aGF0IGV4Y2VwdCBibG9ja3MKKyMgZG9uJ3QgZnVsbHkgY2xlYXIgdGhlIGV4Y2VwdGlvbiB1bnRpbCAzLjAuCit3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygnaWdub3JlJywgY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlPSd0aHJlYWRpbmcnLCBtZXNzYWdlPSdzeXMuZXhjX2NsZWFyJykKKworIyBEZWJ1ZyBzdXBwb3J0IChhZGFwdGVkIGZyb20gaWhvb2tzLnB5KS4KKyMgQWxsIHRoZSBtYWpvciBjbGFzc2VzIGhlcmUgZGVyaXZlIGZyb20gX1ZlcmJvc2UuICBXZSBmb3JjZSB0aGF0IHRvCisjIGJlIGEgbmV3LXN0eWxlIGNsYXNzIHNvIHRoYXQgYWxsIHRoZSBtYWpvciBjbGFzc2VzIGhlcmUgYXJlIG5ldy1zdHlsZS4KKyMgVGhpcyBoZWxwcyBkZWJ1Z2dpbmcgKHR5cGUoaW5zdGFuY2UpIGlzIG1vcmUgcmV2ZWFsaW5nIGZvciBpbnN0YW5jZXMKKyMgb2YgbmV3LXN0eWxlIGNsYXNzZXMpLgorCitfVkVSQk9TRSA9IEZhbHNlCisKK2lmIF9fZGVidWdfXzoKKworICAgIGNsYXNzIF9WZXJib3NlKG9iamVjdCk6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgICAgICBpZiB2ZXJib3NlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdmVyYm9zZSA9IF9WRVJCT1NFCisgICAgICAgICAgICBzZWxmLl9fdmVyYm9zZSA9IHZlcmJvc2UKKworICAgICAgICBkZWYgX25vdGUoc2VsZiwgZm9ybWF0LCAqYXJncyk6CisgICAgICAgICAgICBpZiBzZWxmLl9fdmVyYm9zZToKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgJSBhcmdzCisgICAgICAgICAgICAgICAgIyBJc3N1ZSAjNDE4ODogY2FsbGluZyBjdXJyZW50X3RocmVhZCgpIGNhbiBpbmN1ciBhbiBpbmZpbml0ZQorICAgICAgICAgICAgICAgICMgcmVjdXJzaW9uIGlmIGl0IGhhcyB0byBjcmVhdGUgYSBEdW1teVRocmVhZCBvbiB0aGUgZmx5LgorICAgICAgICAgICAgICAgIGlkZW50ID0gX2dldF9pZGVudCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBuYW1lID0gX2FjdGl2ZVtpZGVudF0ubmFtZQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9ICI8T1MgdGhyZWFkICVkPiIgJSBpZGVudAorICAgICAgICAgICAgICAgIGZvcm1hdCA9ICIlczogJXNcbiIgJSAobmFtZSwgZm9ybWF0KQorICAgICAgICAgICAgICAgIF9zeXMuc3RkZXJyLndyaXRlKGZvcm1hdCkKKworZWxzZToKKyAgICAjIERpc2FibGUgdGhpcyB3aGVuIHVzaW5nICJweXRob24gLU8iCisgICAgY2xhc3MgX1ZlcmJvc2Uob2JqZWN0KToKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBfbm90ZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKyMgU3VwcG9ydCBmb3IgcHJvZmlsZSBhbmQgdHJhY2UgaG9va3MKKworX3Byb2ZpbGVfaG9vayA9IE5vbmUKK190cmFjZV9ob29rID0gTm9uZQorCitkZWYgc2V0cHJvZmlsZShmdW5jKToKKyAgICAiIiJTZXQgYSBwcm9maWxlIGZ1bmN0aW9uIGZvciBhbGwgdGhyZWFkcyBzdGFydGVkIGZyb20gdGhlIHRocmVhZGluZyBtb2R1bGUuCisKKyAgICBUaGUgZnVuYyB3aWxsIGJlIHBhc3NlZCB0byBzeXMuc2V0cHJvZmlsZSgpIGZvciBlYWNoIHRocmVhZCwgYmVmb3JlIGl0cworICAgIHJ1bigpIG1ldGhvZCBpcyBjYWxsZWQuCisKKyAgICAiIiIKKyAgICBnbG9iYWwgX3Byb2ZpbGVfaG9vaworICAgIF9wcm9maWxlX2hvb2sgPSBmdW5jCisKK2RlZiBzZXR0cmFjZShmdW5jKToKKyAgICAiIiJTZXQgYSB0cmFjZSBmdW5jdGlvbiBmb3IgYWxsIHRocmVhZHMgc3RhcnRlZCBmcm9tIHRoZSB0aHJlYWRpbmcgbW9kdWxlLgorCisgICAgVGhlIGZ1bmMgd2lsbCBiZSBwYXNzZWQgdG8gc3lzLnNldHRyYWNlKCkgZm9yIGVhY2ggdGhyZWFkLCBiZWZvcmUgaXRzIHJ1bigpCisgICAgbWV0aG9kIGlzIGNhbGxlZC4KKworICAgICIiIgorICAgIGdsb2JhbCBfdHJhY2VfaG9vaworICAgIF90cmFjZV9ob29rID0gZnVuYworCisjIFN5bmNocm9uaXphdGlvbiBjbGFzc2VzCisKK0xvY2sgPSBfYWxsb2NhdGVfbG9jaworCitkZWYgUkxvY2soKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyByZWVudHJhbnQgbG9jay4KKworICAgIEEgcmVlbnRyYW50IGxvY2sgbXVzdCBiZSByZWxlYXNlZCBieSB0aGUgdGhyZWFkIHRoYXQgYWNxdWlyZWQgaXQuIE9uY2UgYQorICAgIHRocmVhZCBoYXMgYWNxdWlyZWQgYSByZWVudHJhbnQgbG9jaywgdGhlIHNhbWUgdGhyZWFkIG1heSBhY3F1aXJlIGl0IGFnYWluCisgICAgd2l0aG91dCBibG9ja2luZzsgdGhlIHRocmVhZCBtdXN0IHJlbGVhc2UgaXQgb25jZSBmb3IgZWFjaCB0aW1lIGl0IGhhcworICAgIGFjcXVpcmVkIGl0LgorCisgICAgIiIiCisgICAgcmV0dXJuIF9STG9jaygqYXJncywgKiprd2FyZ3MpCisKK2NsYXNzIF9STG9jayhfVmVyYm9zZSk6CisgICAgIiIiQSByZWVudHJhbnQgbG9jayBtdXN0IGJlIHJlbGVhc2VkIGJ5IHRoZSB0aHJlYWQgdGhhdCBhY3F1aXJlZCBpdC4gT25jZSBhCisgICAgICAgdGhyZWFkIGhhcyBhY3F1aXJlZCBhIHJlZW50cmFudCBsb2NrLCB0aGUgc2FtZSB0aHJlYWQgbWF5IGFjcXVpcmUgaXQKKyAgICAgICBhZ2FpbiB3aXRob3V0IGJsb2NraW5nOyB0aGUgdGhyZWFkIG11c3QgcmVsZWFzZSBpdCBvbmNlIGZvciBlYWNoIHRpbWUgaXQKKyAgICAgICBoYXMgYWNxdWlyZWQgaXQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgX1ZlcmJvc2UuX19pbml0X18oc2VsZiwgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5fX2Jsb2NrID0gX2FsbG9jYXRlX2xvY2soKQorICAgICAgICBzZWxmLl9fb3duZXIgPSBOb25lCisgICAgICAgIHNlbGYuX19jb3VudCA9IDAKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgb3duZXIgPSBzZWxmLl9fb3duZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3duZXIgPSBfYWN0aXZlW293bmVyXS5uYW1lCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmV0dXJuICI8JXMgb3duZXI9JXIgY291bnQ9JWQ+IiAlICgKKyAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgb3duZXIsIHNlbGYuX19jb3VudCkKKworICAgIGRlZiBhY3F1aXJlKHNlbGYsIGJsb2NraW5nPTEpOgorICAgICAgICAiIiJBY3F1aXJlIGEgbG9jaywgYmxvY2tpbmcgb3Igbm9uLWJsb2NraW5nLgorCisgICAgICAgIFdoZW4gaW52b2tlZCB3aXRob3V0IGFyZ3VtZW50czogaWYgdGhpcyB0aHJlYWQgYWxyZWFkeSBvd25zIHRoZSBsb2NrLAorICAgICAgICBpbmNyZW1lbnQgdGhlIHJlY3Vyc2lvbiBsZXZlbCBieSBvbmUsIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwKKyAgICAgICAgaWYgYW5vdGhlciB0aHJlYWQgb3ducyB0aGUgbG9jaywgYmxvY2sgdW50aWwgdGhlIGxvY2sgaXMgdW5sb2NrZWQuIE9uY2UKKyAgICAgICAgdGhlIGxvY2sgaXMgdW5sb2NrZWQgKG5vdCBvd25lZCBieSBhbnkgdGhyZWFkKSwgdGhlbiBncmFiIG93bmVyc2hpcCwgc2V0CisgICAgICAgIHRoZSByZWN1cnNpb24gbGV2ZWwgdG8gb25lLCBhbmQgcmV0dXJuLiBJZiBtb3JlIHRoYW4gb25lIHRocmVhZCBpcworICAgICAgICBibG9ja2VkIHdhaXRpbmcgdW50aWwgdGhlIGxvY2sgaXMgdW5sb2NrZWQsIG9ubHkgb25lIGF0IGEgdGltZSB3aWxsIGJlCisgICAgICAgIGFibGUgdG8gZ3JhYiBvd25lcnNoaXAgb2YgdGhlIGxvY2suIFRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZSBpbiB0aGlzCisgICAgICAgIGNhc2UuCisKKyAgICAgICAgV2hlbiBpbnZva2VkIHdpdGggdGhlIGJsb2NraW5nIGFyZ3VtZW50IHNldCB0byB0cnVlLCBkbyB0aGUgc2FtZSB0aGluZworICAgICAgICBhcyB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywgYW5kIHJldHVybiB0cnVlLgorCisgICAgICAgIFdoZW4gaW52b2tlZCB3aXRoIHRoZSBibG9ja2luZyBhcmd1bWVudCBzZXQgdG8gZmFsc2UsIGRvIG5vdCBibG9jay4gSWYgYQorICAgICAgICBjYWxsIHdpdGhvdXQgYW4gYXJndW1lbnQgd291bGQgYmxvY2ssIHJldHVybiBmYWxzZSBpbW1lZGlhdGVseTsKKyAgICAgICAgb3RoZXJ3aXNlLCBkbyB0aGUgc2FtZSB0aGluZyBhcyB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywgYW5kCisgICAgICAgIHJldHVybiB0cnVlLgorCisgICAgICAgICIiIgorICAgICAgICBtZSA9IF9nZXRfaWRlbnQoKQorICAgICAgICBpZiBzZWxmLl9fb3duZXIgPT0gbWU6CisgICAgICAgICAgICBzZWxmLl9fY291bnQgPSBzZWxmLl9fY291bnQgKyAxCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuYWNxdWlyZSglcyk6IHJlY3Vyc2l2ZSBzdWNjZXNzIiwgc2VsZiwgYmxvY2tpbmcpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByYyA9IHNlbGYuX19ibG9jay5hY3F1aXJlKGJsb2NraW5nKQorICAgICAgICBpZiByYzoKKyAgICAgICAgICAgIHNlbGYuX19vd25lciA9IG1lCisgICAgICAgICAgICBzZWxmLl9fY291bnQgPSAxCisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuYWNxdWlyZSglcyk6IGluaXRpYWwgc3VjY2VzcyIsIHNlbGYsIGJsb2NraW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLmFjcXVpcmUoJXMpOiBmYWlsdXJlIiwgc2VsZiwgYmxvY2tpbmcpCisgICAgICAgIHJldHVybiByYworCisgICAgX19lbnRlcl9fID0gYWNxdWlyZQorCisgICAgZGVmIHJlbGVhc2Uoc2VsZik6CisgICAgICAgICIiIlJlbGVhc2UgYSBsb2NrLCBkZWNyZW1lbnRpbmcgdGhlIHJlY3Vyc2lvbiBsZXZlbC4KKworICAgICAgICBJZiBhZnRlciB0aGUgZGVjcmVtZW50IGl0IGlzIHplcm8sIHJlc2V0IHRoZSBsb2NrIHRvIHVubG9ja2VkIChub3Qgb3duZWQKKyAgICAgICAgYnkgYW55IHRocmVhZCksIGFuZCBpZiBhbnkgb3RoZXIgdGhyZWFkcyBhcmUgYmxvY2tlZCB3YWl0aW5nIGZvciB0aGUKKyAgICAgICAgbG9jayB0byBiZWNvbWUgdW5sb2NrZWQsIGFsbG93IGV4YWN0bHkgb25lIG9mIHRoZW0gdG8gcHJvY2VlZC4gSWYgYWZ0ZXIKKyAgICAgICAgdGhlIGRlY3JlbWVudCB0aGUgcmVjdXJzaW9uIGxldmVsIGlzIHN0aWxsIG5vbnplcm8sIHRoZSBsb2NrIHJlbWFpbnMKKyAgICAgICAgbG9ja2VkIGFuZCBvd25lZCBieSB0aGUgY2FsbGluZyB0aHJlYWQuCisKKyAgICAgICAgT25seSBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gdGhlIGNhbGxpbmcgdGhyZWFkIG93bnMgdGhlIGxvY2suIEEKKyAgICAgICAgUnVudGltZUVycm9yIGlzIHJhaXNlZCBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgbG9jayBpcworICAgICAgICB1bmxvY2tlZC4KKworICAgICAgICBUaGVyZSBpcyBubyByZXR1cm4gdmFsdWUuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX19vd25lciAhPSBfZ2V0X2lkZW50KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNhbm5vdCByZWxlYXNlIHVuLWFjcXVpcmVkIGxvY2siKQorICAgICAgICBzZWxmLl9fY291bnQgPSBjb3VudCA9IHNlbGYuX19jb3VudCAtIDEKKyAgICAgICAgaWYgbm90IGNvdW50OgorICAgICAgICAgICAgc2VsZi5fX293bmVyID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fX2Jsb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLnJlbGVhc2UoKTogZmluYWwgcmVsZWFzZSIsIHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMucmVsZWFzZSgpOiBub24tZmluYWwgcmVsZWFzZSIsIHNlbGYpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdCwgdiwgdGIpOgorICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisgICAgIyBJbnRlcm5hbCBtZXRob2RzIHVzZWQgYnkgY29uZGl0aW9uIHZhcmlhYmxlcworCisgICAgZGVmIF9hY3F1aXJlX3Jlc3RvcmUoc2VsZiwgY291bnRfb3duZXIpOgorICAgICAgICBjb3VudCwgb3duZXIgPSBjb3VudF9vd25lcgorICAgICAgICBzZWxmLl9fYmxvY2suYWNxdWlyZSgpCisgICAgICAgIHNlbGYuX19jb3VudCA9IGNvdW50CisgICAgICAgIHNlbGYuX19vd25lciA9IG93bmVyCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLl9hY3F1aXJlX3Jlc3RvcmUoKSIsIHNlbGYpCisKKyAgICBkZWYgX3JlbGVhc2Vfc2F2ZShzZWxmKToKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuX3JlbGVhc2Vfc2F2ZSgpIiwgc2VsZikKKyAgICAgICAgY291bnQgPSBzZWxmLl9fY291bnQKKyAgICAgICAgc2VsZi5fX2NvdW50ID0gMAorICAgICAgICBvd25lciA9IHNlbGYuX19vd25lcgorICAgICAgICBzZWxmLl9fb3duZXIgPSBOb25lCisgICAgICAgIHNlbGYuX19ibG9jay5yZWxlYXNlKCkKKyAgICAgICAgcmV0dXJuIChjb3VudCwgb3duZXIpCisKKyAgICBkZWYgX2lzX293bmVkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX293bmVyID09IF9nZXRfaWRlbnQoKQorCisKK2RlZiBDb25kaXRpb24oKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJGYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBjb25kaXRpb24gdmFyaWFibGUgb2JqZWN0LgorCisgICAgQSBjb25kaXRpb24gdmFyaWFibGUgYWxsb3dzIG9uZSBvciBtb3JlIHRocmVhZHMgdG8gd2FpdCB1bnRpbCB0aGV5IGFyZQorICAgIG5vdGlmaWVkIGJ5IGFub3RoZXIgdGhyZWFkLgorCisgICAgSWYgdGhlIGxvY2sgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kIG5vdCBOb25lLCBpdCBtdXN0IGJlIGEgTG9jayBvciBSTG9jaworICAgIG9iamVjdCwgYW5kIGl0IGlzIHVzZWQgYXMgdGhlIHVuZGVybHlpbmcgbG9jay4gT3RoZXJ3aXNlLCBhIG5ldyBSTG9jayBvYmplY3QKKyAgICBpcyBjcmVhdGVkIGFuZCB1c2VkIGFzIHRoZSB1bmRlcmx5aW5nIGxvY2suCisKKyAgICAiIiIKKyAgICByZXR1cm4gX0NvbmRpdGlvbigqYXJncywgKiprd2FyZ3MpCisKK2NsYXNzIF9Db25kaXRpb24oX1ZlcmJvc2UpOgorICAgICIiIkNvbmRpdGlvbiB2YXJpYWJsZXMgYWxsb3cgb25lIG9yIG1vcmUgdGhyZWFkcyB0byB3YWl0IHVudGlsIHRoZXkgYXJlCisgICAgICAgbm90aWZpZWQgYnkgYW5vdGhlciB0aHJlYWQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9jaz1Ob25lLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICBfVmVyYm9zZS5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorICAgICAgICBpZiBsb2NrIGlzIE5vbmU6CisgICAgICAgICAgICBsb2NrID0gUkxvY2soKQorICAgICAgICBzZWxmLl9fbG9jayA9IGxvY2sKKyAgICAgICAgIyBFeHBvcnQgdGhlIGxvY2sncyBhY3F1aXJlKCkgYW5kIHJlbGVhc2UoKSBtZXRob2RzCisgICAgICAgIHNlbGYuYWNxdWlyZSA9IGxvY2suYWNxdWlyZQorICAgICAgICBzZWxmLnJlbGVhc2UgPSBsb2NrLnJlbGVhc2UKKyAgICAgICAgIyBJZiB0aGUgbG9jayBkZWZpbmVzIF9yZWxlYXNlX3NhdmUoKSBhbmQvb3IgX2FjcXVpcmVfcmVzdG9yZSgpLAorICAgICAgICAjIHRoZXNlIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyAod2hpY2gganVzdCBjYWxsCisgICAgICAgICMgcmVsZWFzZSgpIGFuZCBhY3F1aXJlKCkgb24gdGhlIGxvY2spLiAgRGl0dG8gZm9yIF9pc19vd25lZCgpLgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9yZWxlYXNlX3NhdmUgPSBsb2NrLl9yZWxlYXNlX3NhdmUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9hY3F1aXJlX3Jlc3RvcmUgPSBsb2NrLl9hY3F1aXJlX3Jlc3RvcmUKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9pc19vd25lZCA9IGxvY2suX2lzX293bmVkCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fX3dhaXRlcnMgPSBbXQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19sb2NrLl9fZW50ZXJfXygpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2xvY2suX19leGl0X18oKmFyZ3MpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPENvbmRpdGlvbiglcywgJWQpPiIgJSAoc2VsZi5fX2xvY2ssIGxlbihzZWxmLl9fd2FpdGVycykpCisKKyAgICBkZWYgX3JlbGVhc2Vfc2F2ZShzZWxmKToKKyAgICAgICAgc2VsZi5fX2xvY2sucmVsZWFzZSgpICAgICAgICAgICAjIE5vIHN0YXRlIHRvIHNhdmUKKworICAgIGRlZiBfYWNxdWlyZV9yZXN0b3JlKHNlbGYsIHgpOgorICAgICAgICBzZWxmLl9fbG9jay5hY3F1aXJlKCkgICAgICAgICAgICMgSWdub3JlIHNhdmVkIHN0YXRlCisKKyAgICBkZWYgX2lzX293bmVkKHNlbGYpOgorICAgICAgICAjIFJldHVybiBUcnVlIGlmIGxvY2sgaXMgb3duZWQgYnkgY3VycmVudF90aHJlYWQuCisgICAgICAgICMgVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9ubHkgaWYgX19sb2NrIGRvZXNuJ3QgaGF2ZSBfaXNfb3duZWQoKS4KKyAgICAgICAgaWYgc2VsZi5fX2xvY2suYWNxdWlyZSgwKToKKyAgICAgICAgICAgIHNlbGYuX19sb2NrLnJlbGVhc2UoKQorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiV2FpdCB1bnRpbCBub3RpZmllZCBvciB1bnRpbCBhIHRpbWVvdXQgb2NjdXJzLgorCisgICAgICAgIElmIHRoZSBjYWxsaW5nIHRocmVhZCBoYXMgbm90IGFjcXVpcmVkIHRoZSBsb2NrIHdoZW4gdGhpcyBtZXRob2QgaXMKKyAgICAgICAgY2FsbGVkLCBhIFJ1bnRpbWVFcnJvciBpcyByYWlzZWQuCisKKyAgICAgICAgVGhpcyBtZXRob2QgcmVsZWFzZXMgdGhlIHVuZGVybHlpbmcgbG9jaywgYW5kIHRoZW4gYmxvY2tzIHVudGlsIGl0IGlzCisgICAgICAgIGF3YWtlbmVkIGJ5IGEgbm90aWZ5KCkgb3Igbm90aWZ5QWxsKCkgY2FsbCBmb3IgdGhlIHNhbWUgY29uZGl0aW9uCisgICAgICAgIHZhcmlhYmxlIGluIGFub3RoZXIgdGhyZWFkLCBvciB1bnRpbCB0aGUgb3B0aW9uYWwgdGltZW91dCBvY2N1cnMuIE9uY2UKKyAgICAgICAgYXdha2VuZWQgb3IgdGltZWQgb3V0LCBpdCByZS1hY3F1aXJlcyB0aGUgbG9jayBhbmQgcmV0dXJucy4KKworICAgICAgICBXaGVuIHRoZSB0aW1lb3V0IGFyZ3VtZW50IGlzIHByZXNlbnQgYW5kIG5vdCBOb25lLCBpdCBzaG91bGQgYmUgYQorICAgICAgICBmbG9hdGluZyBwb2ludCBudW1iZXIgc3BlY2lmeWluZyBhIHRpbWVvdXQgZm9yIHRoZSBvcGVyYXRpb24gaW4gc2Vjb25kcworICAgICAgICAob3IgZnJhY3Rpb25zIHRoZXJlb2YpLgorCisgICAgICAgIFdoZW4gdGhlIHVuZGVybHlpbmcgbG9jayBpcyBhbiBSTG9jaywgaXQgaXMgbm90IHJlbGVhc2VkIHVzaW5nIGl0cworICAgICAgICByZWxlYXNlKCkgbWV0aG9kLCBzaW5jZSB0aGlzIG1heSBub3QgYWN0dWFsbHkgdW5sb2NrIHRoZSBsb2NrIHdoZW4gaXQKKyAgICAgICAgd2FzIGFjcXVpcmVkIG11bHRpcGxlIHRpbWVzIHJlY3Vyc2l2ZWx5LiBJbnN0ZWFkLCBhbiBpbnRlcm5hbCBpbnRlcmZhY2UKKyAgICAgICAgb2YgdGhlIFJMb2NrIGNsYXNzIGlzIHVzZWQsIHdoaWNoIHJlYWxseSB1bmxvY2tzIGl0IGV2ZW4gd2hlbiBpdCBoYXMKKyAgICAgICAgYmVlbiByZWN1cnNpdmVseSBhY3F1aXJlZCBzZXZlcmFsIHRpbWVzLiBBbm90aGVyIGludGVybmFsIGludGVyZmFjZSBpcworICAgICAgICB0aGVuIHVzZWQgdG8gcmVzdG9yZSB0aGUgcmVjdXJzaW9uIGxldmVsIHdoZW4gdGhlIGxvY2sgaXMgcmVhY3F1aXJlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX2lzX293bmVkKCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNhbm5vdCB3YWl0IG9uIHVuLWFjcXVpcmVkIGxvY2siKQorICAgICAgICB3YWl0ZXIgPSBfYWxsb2NhdGVfbG9jaygpCisgICAgICAgIHdhaXRlci5hY3F1aXJlKCkKKyAgICAgICAgc2VsZi5fX3dhaXRlcnMuYXBwZW5kKHdhaXRlcikKKyAgICAgICAgc2F2ZWRfc3RhdGUgPSBzZWxmLl9yZWxlYXNlX3NhdmUoKQorICAgICAgICB0cnk6ICAgICMgcmVzdG9yZSBzdGF0ZSBubyBtYXR0ZXIgd2hhdCAoZS5nLiwgS2V5Ym9hcmRJbnRlcnJ1cHQpCisgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgd2FpdGVyLmFjcXVpcmUoKQorICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMud2FpdCgpOiBnb3QgaXQiLCBzZWxmKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEJhbGFuY2luZyBhY3Q6ICBXZSBjYW4ndCBhZmZvcmQgYSBwdXJlIGJ1c3kgbG9vcCwgc28gd2UKKyAgICAgICAgICAgICAgICAjIGhhdmUgdG8gc2xlZXA7IGJ1dCBpZiB3ZSBzbGVlcCB0aGUgd2hvbGUgdGltZW91dCB0aW1lLAorICAgICAgICAgICAgICAgICMgd2UnbGwgYmUgdW5yZXNwb25zaXZlLiAgVGhlIHNjaGVtZSBoZXJlIHNsZWVwcyB2ZXJ5CisgICAgICAgICAgICAgICAgIyBsaXR0bGUgYXQgZmlyc3QsIGxvbmdlciBhcyB0aW1lIGdvZXMgb24sIGJ1dCBuZXZlciBsb25nZXIKKyAgICAgICAgICAgICAgICAjIHRoYW4gMjAgdGltZXMgcGVyIHNlY29uZCAob3IgdGhlIHRpbWVvdXQgdGltZSByZW1haW5pbmcpLgorICAgICAgICAgICAgICAgIGVuZHRpbWUgPSBfdGltZSgpICsgdGltZW91dAorICAgICAgICAgICAgICAgIGRlbGF5ID0gMC4wMDA1ICMgNTAwIHVzIC0+IGluaXRpYWwgZGVsYXkgb2YgMSBtcworICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICAgICAgICAgIGdvdGl0ID0gd2FpdGVyLmFjcXVpcmUoMCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZ290aXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBlbmR0aW1lIC0gX3RpbWUoKQorICAgICAgICAgICAgICAgICAgICBpZiByZW1haW5pbmcgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gbWluKGRlbGF5ICogMiwgcmVtYWluaW5nLCAuMDUpCisgICAgICAgICAgICAgICAgICAgIF9zbGVlcChkZWxheSkKKyAgICAgICAgICAgICAgICBpZiBub3QgZ290aXQ6CisgICAgICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLndhaXQoJXMpOiB0aW1lZCBvdXQiLCBzZWxmLCB0aW1lb3V0KQorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fd2FpdGVycy5yZW1vdmUod2FpdGVyKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy53YWl0KCVzKTogZ290IGl0Iiwgc2VsZiwgdGltZW91dCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2FjcXVpcmVfcmVzdG9yZShzYXZlZF9zdGF0ZSkKKworICAgIGRlZiBub3RpZnkoc2VsZiwgbj0xKToKKyAgICAgICAgIiIiV2FrZSB1cCBvbmUgb3IgbW9yZSB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24sIGlmIGFueS4KKworICAgICAgICBJZiB0aGUgY2FsbGluZyB0aHJlYWQgaGFzIG5vdCBhY3F1aXJlZCB0aGUgbG9jayB3aGVuIHRoaXMgbWV0aG9kIGlzCisgICAgICAgIGNhbGxlZCwgYSBSdW50aW1lRXJyb3IgaXMgcmFpc2VkLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHdha2VzIHVwIGF0IG1vc3QgbiBvZiB0aGUgdGhyZWFkcyB3YWl0aW5nIGZvciB0aGUgY29uZGl0aW9uCisgICAgICAgIHZhcmlhYmxlOyBpdCBpcyBhIG5vLW9wIGlmIG5vIHRocmVhZHMgYXJlIHdhaXRpbmcuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9pc19vd25lZCgpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjYW5ub3Qgbm90aWZ5IG9uIHVuLWFjcXVpcmVkIGxvY2siKQorICAgICAgICBfX3dhaXRlcnMgPSBzZWxmLl9fd2FpdGVycworICAgICAgICB3YWl0ZXJzID0gX193YWl0ZXJzWzpuXQorICAgICAgICBpZiBub3Qgd2FpdGVyczoKKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5ub3RpZnkoKTogbm8gd2FpdGVycyIsIHNlbGYpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fbm90ZSgiJXMubm90aWZ5KCk6IG5vdGlmeWluZyAlZCB3YWl0ZXIlcyIsIHNlbGYsIG4sCisgICAgICAgICAgICAgICAgICAgbiE9MSBhbmQgInMiIG9yICIiKQorICAgICAgICBmb3Igd2FpdGVyIGluIHdhaXRlcnM6CisgICAgICAgICAgICB3YWl0ZXIucmVsZWFzZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX193YWl0ZXJzLnJlbW92ZSh3YWl0ZXIpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgbm90aWZ5QWxsKHNlbGYpOgorICAgICAgICAiIiJXYWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb25kaXRpb24uCisKKyAgICAgICAgSWYgdGhlIGNhbGxpbmcgdGhyZWFkIGhhcyBub3QgYWNxdWlyZWQgdGhlIGxvY2sgd2hlbiB0aGlzIG1ldGhvZAorICAgICAgICBpcyBjYWxsZWQsIGEgUnVudGltZUVycm9yIGlzIHJhaXNlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5ub3RpZnkobGVuKHNlbGYuX193YWl0ZXJzKSkKKworICAgIG5vdGlmeV9hbGwgPSBub3RpZnlBbGwKKworCitkZWYgU2VtYXBob3JlKCphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBzZW1hcGhvcmUuCisKKyAgICBTZW1hcGhvcmVzIG1hbmFnZSBhIGNvdW50ZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgcmVsZWFzZSgpIGNhbGxzIG1pbnVzCisgICAgdGhlIG51bWJlciBvZiBhY3F1aXJlKCkgY2FsbHMsIHBsdXMgYW4gaW5pdGlhbCB2YWx1ZS4gVGhlIGFjcXVpcmUoKSBtZXRob2QKKyAgICBibG9ja3MgaWYgbmVjZXNzYXJ5IHVudGlsIGl0IGNhbiByZXR1cm4gd2l0aG91dCBtYWtpbmcgdGhlIGNvdW50ZXIKKyAgICBuZWdhdGl2ZS4gSWYgbm90IGdpdmVuLCB2YWx1ZSBkZWZhdWx0cyB0byAxLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9TZW1hcGhvcmUoKmFyZ3MsICoqa3dhcmdzKQorCitjbGFzcyBfU2VtYXBob3JlKF9WZXJib3NlKToKKyAgICAiIiJTZW1hcGhvcmVzIG1hbmFnZSBhIGNvdW50ZXIgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YgcmVsZWFzZSgpIGNhbGxzCisgICAgICAgbWludXMgdGhlIG51bWJlciBvZiBhY3F1aXJlKCkgY2FsbHMsIHBsdXMgYW4gaW5pdGlhbCB2YWx1ZS4gVGhlIGFjcXVpcmUoKQorICAgICAgIG1ldGhvZCBibG9ja3MgaWYgbmVjZXNzYXJ5IHVudGlsIGl0IGNhbiByZXR1cm4gd2l0aG91dCBtYWtpbmcgdGhlIGNvdW50ZXIKKyAgICAgICBuZWdhdGl2ZS4gSWYgbm90IGdpdmVuLCB2YWx1ZSBkZWZhdWx0cyB0byAxLgorCisgICAgIiIiCisKKyAgICAjIEFmdGVyIFRpbSBQZXRlcnMnIHNlbWFwaG9yZSBjbGFzcywgYnV0IG5vdCBxdWl0ZSB0aGUgc2FtZSAobm8gbWF4aW11bSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZT0xLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICBpZiB2YWx1ZSA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJzZW1hcGhvcmUgaW5pdGlhbCB2YWx1ZSBtdXN0IGJlID49IDAiKQorICAgICAgICBfVmVyYm9zZS5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorICAgICAgICBzZWxmLl9fY29uZCA9IENvbmRpdGlvbihMb2NrKCkpCisgICAgICAgIHNlbGYuX192YWx1ZSA9IHZhbHVlCisKKyAgICBkZWYgYWNxdWlyZShzZWxmLCBibG9ja2luZz0xKToKKyAgICAgICAgIiIiQWNxdWlyZSBhIHNlbWFwaG9yZSwgZGVjcmVtZW50aW5nIHRoZSBpbnRlcm5hbCBjb3VudGVyIGJ5IG9uZS4KKworICAgICAgICBXaGVuIGludm9rZWQgd2l0aG91dCBhcmd1bWVudHM6IGlmIHRoZSBpbnRlcm5hbCBjb3VudGVyIGlzIGxhcmdlciB0aGFuCisgICAgICAgIHplcm8gb24gZW50cnksIGRlY3JlbWVudCBpdCBieSBvbmUgYW5kIHJldHVybiBpbW1lZGlhdGVseS4gSWYgaXQgaXMgemVybworICAgICAgICBvbiBlbnRyeSwgYmxvY2ssIHdhaXRpbmcgdW50aWwgc29tZSBvdGhlciB0aHJlYWQgaGFzIGNhbGxlZCByZWxlYXNlKCkgdG8KKyAgICAgICAgbWFrZSBpdCBsYXJnZXIgdGhhbiB6ZXJvLiBUaGlzIGlzIGRvbmUgd2l0aCBwcm9wZXIgaW50ZXJsb2NraW5nIHNvIHRoYXQKKyAgICAgICAgaWYgbXVsdGlwbGUgYWNxdWlyZSgpIGNhbGxzIGFyZSBibG9ja2VkLCByZWxlYXNlKCkgd2lsbCB3YWtlIGV4YWN0bHkgb25lCisgICAgICAgIG9mIHRoZW0gdXAuIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgcGljayBvbmUgYXQgcmFuZG9tLCBzbyB0aGUgb3JkZXIgaW4KKyAgICAgICAgd2hpY2ggYmxvY2tlZCB0aHJlYWRzIGFyZSBhd2FrZW5lZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbi4gVGhlcmUgaXMgbm8KKyAgICAgICAgcmV0dXJuIHZhbHVlIGluIHRoaXMgY2FzZS4KKworICAgICAgICBXaGVuIGludm9rZWQgd2l0aCBibG9ja2luZyBzZXQgdG8gdHJ1ZSwgZG8gdGhlIHNhbWUgdGhpbmcgYXMgd2hlbiBjYWxsZWQKKyAgICAgICAgd2l0aG91dCBhcmd1bWVudHMsIGFuZCByZXR1cm4gdHJ1ZS4KKworICAgICAgICBXaGVuIGludm9rZWQgd2l0aCBibG9ja2luZyBzZXQgdG8gZmFsc2UsIGRvIG5vdCBibG9jay4gSWYgYSBjYWxsIHdpdGhvdXQKKyAgICAgICAgYW4gYXJndW1lbnQgd291bGQgYmxvY2ssIHJldHVybiBmYWxzZSBpbW1lZGlhdGVseTsgb3RoZXJ3aXNlLCBkbyB0aGUKKyAgICAgICAgc2FtZSB0aGluZyBhcyB3aGVuIGNhbGxlZCB3aXRob3V0IGFyZ3VtZW50cywgYW5kIHJldHVybiB0cnVlLgorCisgICAgICAgICIiIgorICAgICAgICByYyA9IEZhbHNlCisgICAgICAgIHdpdGggc2VsZi5fX2NvbmQ6CisgICAgICAgICAgICB3aGlsZSBzZWxmLl9fdmFsdWUgPT0gMDoKKyAgICAgICAgICAgICAgICBpZiBub3QgYmxvY2tpbmc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5hY3F1aXJlKCVzKTogYmxvY2tlZCB3YWl0aW5nLCB2YWx1ZT0lcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgYmxvY2tpbmcsIHNlbGYuX192YWx1ZSkKKyAgICAgICAgICAgICAgICBzZWxmLl9fY29uZC53YWl0KCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fX3ZhbHVlID0gc2VsZi5fX3ZhbHVlIC0gMQorICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXMuYWNxdWlyZTogc3VjY2VzcywgdmFsdWU9JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIHNlbGYuX192YWx1ZSkKKyAgICAgICAgICAgICAgICByYyA9IFRydWUKKyAgICAgICAgcmV0dXJuIHJjCisKKyAgICBfX2VudGVyX18gPSBhY3F1aXJlCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiUmVsZWFzZSBhIHNlbWFwaG9yZSwgaW5jcmVtZW50aW5nIHRoZSBpbnRlcm5hbCBjb3VudGVyIGJ5IG9uZS4KKworICAgICAgICBXaGVuIHRoZSBjb3VudGVyIGlzIHplcm8gb24gZW50cnkgYW5kIGFub3RoZXIgdGhyZWFkIGlzIHdhaXRpbmcgZm9yIGl0CisgICAgICAgIHRvIGJlY29tZSBsYXJnZXIgdGhhbiB6ZXJvIGFnYWluLCB3YWtlIHVwIHRoYXQgdGhyZWFkLgorCisgICAgICAgICIiIgorICAgICAgICB3aXRoIHNlbGYuX19jb25kOgorICAgICAgICAgICAgc2VsZi5fX3ZhbHVlID0gc2VsZi5fX3ZhbHVlICsgMQorICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLnJlbGVhc2U6IHN1Y2Nlc3MsIHZhbHVlPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsIHNlbGYuX192YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuX19jb25kLm5vdGlmeSgpCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdCwgdiwgdGIpOgorICAgICAgICBzZWxmLnJlbGVhc2UoKQorCisKK2RlZiBCb3VuZGVkU2VtYXBob3JlKCphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBib3VuZGVkIHNlbWFwaG9yZS4KKworICAgIEEgYm91bmRlZCBzZW1hcGhvcmUgY2hlY2tzIHRvIG1ha2Ugc3VyZSBpdHMgY3VycmVudCB2YWx1ZSBkb2Vzbid0IGV4Y2VlZCBpdHMKKyAgICBpbml0aWFsIHZhbHVlLiBJZiBpdCBkb2VzLCBWYWx1ZUVycm9yIGlzIHJhaXNlZC4gSW4gbW9zdCBzaXR1YXRpb25zCisgICAgc2VtYXBob3JlcyBhcmUgdXNlZCB0byBndWFyZCByZXNvdXJjZXMgd2l0aCBsaW1pdGVkIGNhcGFjaXR5LgorCisgICAgSWYgdGhlIHNlbWFwaG9yZSBpcyByZWxlYXNlZCB0b28gbWFueSB0aW1lcyBpdCdzIGEgc2lnbiBvZiBhIGJ1Zy4gSWYgbm90CisgICAgZ2l2ZW4sIHZhbHVlIGRlZmF1bHRzIHRvIDEuCisKKyAgICBMaWtlIHJlZ3VsYXIgc2VtYXBob3JlcywgYm91bmRlZCBzZW1hcGhvcmVzIG1hbmFnZSBhIGNvdW50ZXIgcmVwcmVzZW50aW5nCisgICAgdGhlIG51bWJlciBvZiByZWxlYXNlKCkgY2FsbHMgbWludXMgdGhlIG51bWJlciBvZiBhY3F1aXJlKCkgY2FsbHMsIHBsdXMgYW4KKyAgICBpbml0aWFsIHZhbHVlLiBUaGUgYWNxdWlyZSgpIG1ldGhvZCBibG9ja3MgaWYgbmVjZXNzYXJ5IHVudGlsIGl0IGNhbiByZXR1cm4KKyAgICB3aXRob3V0IG1ha2luZyB0aGUgY291bnRlciBuZWdhdGl2ZS4gSWYgbm90IGdpdmVuLCB2YWx1ZSBkZWZhdWx0cyB0byAxLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9Cb3VuZGVkU2VtYXBob3JlKCphcmdzLCAqKmt3YXJncykKKworY2xhc3MgX0JvdW5kZWRTZW1hcGhvcmUoX1NlbWFwaG9yZSk6CisgICAgIiIiQSBib3VuZGVkIHNlbWFwaG9yZSBjaGVja3MgdG8gbWFrZSBzdXJlIGl0cyBjdXJyZW50IHZhbHVlIGRvZXNuJ3QgZXhjZWVkCisgICAgICAgaXRzIGluaXRpYWwgdmFsdWUuIElmIGl0IGRvZXMsIFZhbHVlRXJyb3IgaXMgcmFpc2VkLiBJbiBtb3N0IHNpdHVhdGlvbnMKKyAgICAgICBzZW1hcGhvcmVzIGFyZSB1c2VkIHRvIGd1YXJkIHJlc291cmNlcyB3aXRoIGxpbWl0ZWQgY2FwYWNpdHkuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWU9MSwgdmVyYm9zZT1Ob25lKToKKyAgICAgICAgX1NlbWFwaG9yZS5fX2luaXRfXyhzZWxmLCB2YWx1ZSwgdmVyYm9zZSkKKyAgICAgICAgc2VsZi5faW5pdGlhbF92YWx1ZSA9IHZhbHVlCisKKyAgICBkZWYgcmVsZWFzZShzZWxmKToKKyAgICAgICAgIiIiUmVsZWFzZSBhIHNlbWFwaG9yZSwgaW5jcmVtZW50aW5nIHRoZSBpbnRlcm5hbCBjb3VudGVyIGJ5IG9uZS4KKworICAgICAgICBXaGVuIHRoZSBjb3VudGVyIGlzIHplcm8gb24gZW50cnkgYW5kIGFub3RoZXIgdGhyZWFkIGlzIHdhaXRpbmcgZm9yIGl0CisgICAgICAgIHRvIGJlY29tZSBsYXJnZXIgdGhhbiB6ZXJvIGFnYWluLCB3YWtlIHVwIHRoYXQgdGhyZWFkLgorCisgICAgICAgIElmIHRoZSBudW1iZXIgb2YgcmVsZWFzZXMgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGFjcXVpcmVzLAorICAgICAgICByYWlzZSBhIFZhbHVlRXJyb3IuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuX1NlbWFwaG9yZV9fdmFsdWUgPj0gc2VsZi5faW5pdGlhbF92YWx1ZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlNlbWFwaG9yZSByZWxlYXNlZCB0b28gbWFueSB0aW1lcyIpCisgICAgICAgIHJldHVybiBfU2VtYXBob3JlLnJlbGVhc2Uoc2VsZikKKworCitkZWYgRXZlbnQoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAiIiJBIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IGV2ZW50LgorCisgICAgRXZlbnRzIG1hbmFnZSBhIGZsYWcgdGhhdCBjYW4gYmUgc2V0IHRvIHRydWUgd2l0aCB0aGUgc2V0KCkgbWV0aG9kIGFuZCByZXNldAorICAgIHRvIGZhbHNlIHdpdGggdGhlIGNsZWFyKCkgbWV0aG9kLiBUaGUgd2FpdCgpIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIGZsYWcgaXMKKyAgICB0cnVlLgorCisgICAgIiIiCisgICAgcmV0dXJuIF9FdmVudCgqYXJncywgKiprd2FyZ3MpCisKK2NsYXNzIF9FdmVudChfVmVyYm9zZSk6CisgICAgIiIiQSBmYWN0b3J5IGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBldmVudCBvYmplY3QuIEFuIGV2ZW50IG1hbmFnZXMgYQorICAgICAgIGZsYWcgdGhhdCBjYW4gYmUgc2V0IHRvIHRydWUgd2l0aCB0aGUgc2V0KCkgbWV0aG9kIGFuZCByZXNldCB0byBmYWxzZQorICAgICAgIHdpdGggdGhlIGNsZWFyKCkgbWV0aG9kLiBUaGUgd2FpdCgpIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIGZsYWcgaXMgdHJ1ZS4KKworICAgICIiIgorCisgICAgIyBBZnRlciBUaW0gUGV0ZXJzJyBldmVudCBjbGFzcyAod2l0aG91dCBpc19wb3N0ZWQoKSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPU5vbmUpOgorICAgICAgICBfVmVyYm9zZS5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorICAgICAgICBzZWxmLl9fY29uZCA9IENvbmRpdGlvbihMb2NrKCkpCisgICAgICAgIHNlbGYuX19mbGFnID0gRmFsc2UKKworICAgIGRlZiBfcmVzZXRfaW50ZXJuYWxfbG9ja3Moc2VsZik6CisgICAgICAgICMgcHJpdmF0ZSEgIGNhbGxlZCBieSBUaHJlYWQuX3Jlc2V0X2ludGVybmFsX2xvY2tzIGJ5IF9hZnRlcl9mb3JrKCkKKyAgICAgICAgc2VsZi5fX2NvbmQuX19pbml0X18oKQorCisgICAgZGVmIGlzU2V0KHNlbGYpOgorICAgICAgICAnUmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGludGVybmFsIGZsYWcgaXMgdHJ1ZS4nCisgICAgICAgIHJldHVybiBzZWxmLl9fZmxhZworCisgICAgaXNfc2V0ID0gaXNTZXQKKworICAgIGRlZiBzZXQoc2VsZik6CisgICAgICAgICIiIlNldCB0aGUgaW50ZXJuYWwgZmxhZyB0byB0cnVlLgorCisgICAgICAgIEFsbCB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoZSBmbGFnIHRvIGJlY29tZSB0cnVlIGFyZSBhd2FrZW5lZC4gVGhyZWFkcworICAgICAgICB0aGF0IGNhbGwgd2FpdCgpIG9uY2UgdGhlIGZsYWcgaXMgdHJ1ZSB3aWxsIG5vdCBibG9jayBhdCBhbGwuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9fZmxhZyA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX19jb25kLm5vdGlmeV9hbGwoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fX2NvbmQucmVsZWFzZSgpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICIiIlJlc2V0IHRoZSBpbnRlcm5hbCBmbGFnIHRvIGZhbHNlLgorCisgICAgICAgIFN1YnNlcXVlbnRseSwgdGhyZWFkcyBjYWxsaW5nIHdhaXQoKSB3aWxsIGJsb2NrIHVudGlsIHNldCgpIGlzIGNhbGxlZCB0bworICAgICAgICBzZXQgdGhlIGludGVybmFsIGZsYWcgdG8gdHJ1ZSBhZ2Fpbi4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fX2NvbmQuYWNxdWlyZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX19mbGFnID0gRmFsc2UKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX19jb25kLnJlbGVhc2UoKQorCisgICAgZGVmIHdhaXQoc2VsZiwgdGltZW91dD1Ob25lKToKKyAgICAgICAgIiIiQmxvY2sgdW50aWwgdGhlIGludGVybmFsIGZsYWcgaXMgdHJ1ZS4KKworICAgICAgICBJZiB0aGUgaW50ZXJuYWwgZmxhZyBpcyB0cnVlIG9uIGVudHJ5LCByZXR1cm4gaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwKKyAgICAgICAgYmxvY2sgdW50aWwgYW5vdGhlciB0aHJlYWQgY2FsbHMgc2V0KCkgdG8gc2V0IHRoZSBmbGFnIHRvIHRydWUsIG9yIHVudGlsCisgICAgICAgIHRoZSBvcHRpb25hbCB0aW1lb3V0IG9jY3Vycy4KKworICAgICAgICBXaGVuIHRoZSB0aW1lb3V0IGFyZ3VtZW50IGlzIHByZXNlbnQgYW5kIG5vdCBOb25lLCBpdCBzaG91bGQgYmUgYQorICAgICAgICBmbG9hdGluZyBwb2ludCBudW1iZXIgc3BlY2lmeWluZyBhIHRpbWVvdXQgZm9yIHRoZSBvcGVyYXRpb24gaW4gc2Vjb25kcworICAgICAgICAob3IgZnJhY3Rpb25zIHRoZXJlb2YpLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGludGVybmFsIGZsYWcgb24gZXhpdCwgc28gaXQgd2lsbCBhbHdheXMgcmV0dXJuCisgICAgICAgIFRydWUgZXhjZXB0IGlmIGEgdGltZW91dCBpcyBnaXZlbiBhbmQgdGhlIG9wZXJhdGlvbiB0aW1lcyBvdXQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuX19jb25kLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX2ZsYWc6CisgICAgICAgICAgICAgICAgc2VsZi5fX2NvbmQud2FpdCh0aW1lb3V0KQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19mbGFnCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9fY29uZC5yZWxlYXNlKCkKKworIyBIZWxwZXIgdG8gZ2VuZXJhdGUgbmV3IHRocmVhZCBuYW1lcworX2NvdW50ZXIgPSAwCitkZWYgX25ld25hbWUodGVtcGxhdGU9IlRocmVhZC0lZCIpOgorICAgIGdsb2JhbCBfY291bnRlcgorICAgIF9jb3VudGVyID0gX2NvdW50ZXIgKyAxCisgICAgcmV0dXJuIHRlbXBsYXRlICUgX2NvdW50ZXIKKworIyBBY3RpdmUgdGhyZWFkIGFkbWluaXN0cmF0aW9uCitfYWN0aXZlX2xpbWJvX2xvY2sgPSBfYWxsb2NhdGVfbG9jaygpCitfYWN0aXZlID0ge30gICAgIyBtYXBzIHRocmVhZCBpZCB0byBUaHJlYWQgb2JqZWN0CitfbGltYm8gPSB7fQorCisKKyMgTWFpbiBjbGFzcyBmb3IgdGhyZWFkcworCitjbGFzcyBUaHJlYWQoX1ZlcmJvc2UpOgorICAgICIiIkEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgdGhyZWFkIG9mIGNvbnRyb2wuCisKKyAgICBUaGlzIGNsYXNzIGNhbiBiZSBzYWZlbHkgc3ViY2xhc3NlZCBpbiBhIGxpbWl0ZWQgZmFzaGlvbi4KKworICAgICIiIgorICAgIF9faW5pdGlhbGl6ZWQgPSBGYWxzZQorICAgICMgTmVlZCB0byBzdG9yZSBhIHJlZmVyZW5jZSB0byBzeXMuZXhjX2luZm8gZm9yIHByaW50aW5nCisgICAgIyBvdXQgZXhjZXB0aW9ucyB3aGVuIGEgdGhyZWFkIHRyaWVzIHRvIHVzZSBhIGdsb2JhbCB2YXIuIGR1cmluZyBpbnRlcnAuCisgICAgIyBzaHV0ZG93biBhbmQgdGh1cyByYWlzZXMgYW4gZXhjZXB0aW9uIGFib3V0IHRyeWluZyB0byBwZXJmb3JtIHNvbWUKKyAgICAjIG9wZXJhdGlvbiBvbi93aXRoIGEgTm9uZVR5cGUKKyAgICBfX2V4Y19pbmZvID0gX3N5cy5leGNfaW5mbworICAgICMgS2VlcCBzeXMuZXhjX2NsZWFyIHRvbyB0byBjbGVhciB0aGUgZXhjZXB0aW9uIGp1c3QgYmVmb3JlCisgICAgIyBhbGxvd2luZyAuam9pbigpIHRvIHJldHVybi4KKyAgICBfX2V4Y19jbGVhciA9IF9zeXMuZXhjX2NsZWFyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXA9Tm9uZSwgdGFyZ2V0PU5vbmUsIG5hbWU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgYXJncz0oKSwga3dhcmdzPU5vbmUsIHZlcmJvc2U9Tm9uZSk6CisgICAgICAgICIiIlRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgd2l0aCBrZXl3b3JkIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFyZToKKworICAgICAgICAqZ3JvdXAqIHNob3VsZCBiZSBOb25lOyByZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbiB3aGVuIGEgVGhyZWFkR3JvdXAKKyAgICAgICAgY2xhc3MgaXMgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKnRhcmdldCogaXMgdGhlIGNhbGxhYmxlIG9iamVjdCB0byBiZSBpbnZva2VkIGJ5IHRoZSBydW4oKQorICAgICAgICBtZXRob2QuIERlZmF1bHRzIHRvIE5vbmUsIG1lYW5pbmcgbm90aGluZyBpcyBjYWxsZWQuCisKKyAgICAgICAgKm5hbWUqIGlzIHRoZSB0aHJlYWQgbmFtZS4gQnkgZGVmYXVsdCwgYSB1bmlxdWUgbmFtZSBpcyBjb25zdHJ1Y3RlZCBvZgorICAgICAgICB0aGUgZm9ybSAiVGhyZWFkLU4iIHdoZXJlIE4gaXMgYSBzbWFsbCBkZWNpbWFsIG51bWJlci4KKworICAgICAgICAqYXJncyogaXMgdGhlIGFyZ3VtZW50IHR1cGxlIGZvciB0aGUgdGFyZ2V0IGludm9jYXRpb24uIERlZmF1bHRzIHRvICgpLgorCisgICAgICAgICprd2FyZ3MqIGlzIGEgZGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyBmb3IgdGhlIHRhcmdldAorICAgICAgICBpbnZvY2F0aW9uLiBEZWZhdWx0cyB0byB7fS4KKworICAgICAgICBJZiBhIHN1YmNsYXNzIG92ZXJyaWRlcyB0aGUgY29uc3RydWN0b3IsIGl0IG11c3QgbWFrZSBzdXJlIHRvIGludm9rZQorICAgICAgICB0aGUgYmFzZSBjbGFzcyBjb25zdHJ1Y3RvciAoVGhyZWFkLl9faW5pdF9fKCkpIGJlZm9yZSBkb2luZyBhbnl0aGluZworICAgICAgICBlbHNlIHRvIHRoZSB0aHJlYWQuCisKKyIiIgorICAgICAgICBhc3NlcnQgZ3JvdXAgaXMgTm9uZSwgImdyb3VwIGFyZ3VtZW50IG11c3QgYmUgTm9uZSBmb3Igbm93IgorICAgICAgICBfVmVyYm9zZS5fX2luaXRfXyhzZWxmLCB2ZXJib3NlKQorICAgICAgICBpZiBrd2FyZ3MgaXMgTm9uZToKKyAgICAgICAgICAgIGt3YXJncyA9IHt9CisgICAgICAgIHNlbGYuX190YXJnZXQgPSB0YXJnZXQKKyAgICAgICAgc2VsZi5fX25hbWUgPSBzdHIobmFtZSBvciBfbmV3bmFtZSgpKQorICAgICAgICBzZWxmLl9fYXJncyA9IGFyZ3MKKyAgICAgICAgc2VsZi5fX2t3YXJncyA9IGt3YXJncworICAgICAgICBzZWxmLl9fZGFlbW9uaWMgPSBzZWxmLl9zZXRfZGFlbW9uKCkKKyAgICAgICAgc2VsZi5fX2lkZW50ID0gTm9uZQorICAgICAgICBzZWxmLl9fc3RhcnRlZCA9IEV2ZW50KCkKKyAgICAgICAgc2VsZi5fX3N0b3BwZWQgPSBGYWxzZQorICAgICAgICBzZWxmLl9fYmxvY2sgPSBDb25kaXRpb24oTG9jaygpKQorICAgICAgICBzZWxmLl9faW5pdGlhbGl6ZWQgPSBUcnVlCisgICAgICAgICMgc3lzLnN0ZGVyciBpcyBub3Qgc3RvcmVkIGluIHRoZSBjbGFzcyBsaWtlCisgICAgICAgICMgc3lzLmV4Y19pbmZvIHNpbmNlIGl0IGNhbiBiZSBjaGFuZ2VkIGJldHdlZW4gaW5zdGFuY2VzCisgICAgICAgIHNlbGYuX19zdGRlcnIgPSBfc3lzLnN0ZGVycgorCisgICAgZGVmIF9yZXNldF9pbnRlcm5hbF9sb2NrcyhzZWxmKToKKyAgICAgICAgIyBwcml2YXRlISAgQ2FsbGVkIGJ5IF9hZnRlcl9mb3JrKCkgdG8gcmVzZXQgb3VyIGludGVybmFsIGxvY2tzIGFzCisgICAgICAgICMgdGhleSBtYXkgYmUgaW4gYW4gaW52YWxpZCBzdGF0ZSBsZWFkaW5nIHRvIGEgZGVhZGxvY2sgb3IgY3Jhc2guCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgJ19UaHJlYWRfX2Jsb2NrJyk6ICAjIER1bW15VGhyZWFkIGRlbGV0ZXMgc2VsZi5fX2Jsb2NrCisgICAgICAgICAgICBzZWxmLl9fYmxvY2suX19pbml0X18oKQorICAgICAgICBzZWxmLl9fc3RhcnRlZC5fcmVzZXRfaW50ZXJuYWxfbG9ja3MoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIF9ibG9jayhzZWxmKToKKyAgICAgICAgIyB1c2VkIGJ5IGEgdW5pdHRlc3QKKyAgICAgICAgcmV0dXJuIHNlbGYuX19ibG9jaworCisgICAgZGVmIF9zZXRfZGFlbW9uKHNlbGYpOgorICAgICAgICAjIE92ZXJyaWRkZW4gaW4gX01haW5UaHJlYWQgYW5kIF9EdW1teVRocmVhZAorICAgICAgICByZXR1cm4gY3VycmVudF90aHJlYWQoKS5kYWVtb24KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgYXNzZXJ0IHNlbGYuX19pbml0aWFsaXplZCwgIlRocmVhZC5fX2luaXRfXygpIHdhcyBub3QgY2FsbGVkIgorICAgICAgICBzdGF0dXMgPSAiaW5pdGlhbCIKKyAgICAgICAgaWYgc2VsZi5fX3N0YXJ0ZWQuaXNfc2V0KCk6CisgICAgICAgICAgICBzdGF0dXMgPSAic3RhcnRlZCIKKyAgICAgICAgaWYgc2VsZi5fX3N0b3BwZWQ6CisgICAgICAgICAgICBzdGF0dXMgPSAic3RvcHBlZCIKKyAgICAgICAgaWYgc2VsZi5fX2RhZW1vbmljOgorICAgICAgICAgICAgc3RhdHVzICs9ICIgZGFlbW9uIgorICAgICAgICBpZiBzZWxmLl9faWRlbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzdGF0dXMgKz0gIiAlcyIgJSBzZWxmLl9faWRlbnQKKyAgICAgICAgcmV0dXJuICI8JXMoJXMsICVzKT4iICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9fbmFtZSwgc3RhdHVzKQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICAiIiJTdGFydCB0aGUgdGhyZWFkJ3MgYWN0aXZpdHkuCisKKyAgICAgICAgSXQgbXVzdCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIHBlciB0aHJlYWQgb2JqZWN0LiBJdCBhcnJhbmdlcyBmb3IgdGhlCisgICAgICAgIG9iamVjdCdzIHJ1bigpIG1ldGhvZCB0byBiZSBpbnZva2VkIGluIGEgc2VwYXJhdGUgdGhyZWFkIG9mIGNvbnRyb2wuCisKKyAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCByYWlzZSBhIFJ1bnRpbWVFcnJvciBpZiBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugb24gdGhlCisgICAgICAgIHNhbWUgdGhyZWFkIG9iamVjdC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuX19pbml0aWFsaXplZDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigidGhyZWFkLl9faW5pdF9fKCkgbm90IGNhbGxlZCIpCisgICAgICAgIGlmIHNlbGYuX19zdGFydGVkLmlzX3NldCgpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJ0aHJlYWRzIGNhbiBvbmx5IGJlIHN0YXJ0ZWQgb25jZSIpCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLnN0YXJ0KCk6IHN0YXJ0aW5nIHRocmVhZCIsIHNlbGYpCisgICAgICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgorICAgICAgICAgICAgX2xpbWJvW3NlbGZdID0gc2VsZgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfc3RhcnRfbmV3X3RocmVhZChzZWxmLl9fYm9vdHN0cmFwLCAoKSkKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgorICAgICAgICAgICAgICAgIGRlbCBfbGltYm9bc2VsZl0KKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIHNlbGYuX19zdGFydGVkLndhaXQoKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIiTWV0aG9kIHJlcHJlc2VudGluZyB0aGUgdGhyZWFkJ3MgYWN0aXZpdHkuCisKKyAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBhIHN1YmNsYXNzLiBUaGUgc3RhbmRhcmQgcnVuKCkgbWV0aG9kCisgICAgICAgIGludm9rZXMgdGhlIGNhbGxhYmxlIG9iamVjdCBwYXNzZWQgdG8gdGhlIG9iamVjdCdzIGNvbnN0cnVjdG9yIGFzIHRoZQorICAgICAgICB0YXJnZXQgYXJndW1lbnQsIGlmIGFueSwgd2l0aCBzZXF1ZW50aWFsIGFuZCBrZXl3b3JkIGFyZ3VtZW50cyB0YWtlbgorICAgICAgICBmcm9tIHRoZSBhcmdzIGFuZCBrd2FyZ3MgYXJndW1lbnRzLCByZXNwZWN0aXZlbHkuCisKKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYuX190YXJnZXQ6CisgICAgICAgICAgICAgICAgc2VsZi5fX3RhcmdldCgqc2VsZi5fX2FyZ3MsICoqc2VsZi5fX2t3YXJncykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICMgQXZvaWQgYSByZWZjeWNsZSBpZiB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcgYSBmdW5jdGlvbiB3aXRoCisgICAgICAgICAgICAjIGFuIGFyZ3VtZW50IHRoYXQgaGFzIGEgbWVtYmVyIHRoYXQgcG9pbnRzIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBkZWwgc2VsZi5fX3RhcmdldCwgc2VsZi5fX2FyZ3MsIHNlbGYuX19rd2FyZ3MKKworICAgIGRlZiBfX2Jvb3RzdHJhcChzZWxmKToKKyAgICAgICAgIyBXcmFwcGVyIGFyb3VuZCB0aGUgcmVhbCBib290c3RyYXAgY29kZSB0aGF0IGlnbm9yZXMKKyAgICAgICAgIyBleGNlcHRpb25zIGR1cmluZyBpbnRlcnByZXRlciBjbGVhbnVwLiAgVGhvc2UgdHlwaWNhbGx5CisgICAgICAgICMgaGFwcGVuIHdoZW4gYSBkYWVtb24gdGhyZWFkIHdha2VzIHVwIGF0IGFuIHVuZm9ydHVuYXRlCisgICAgICAgICMgbW9tZW50LCBmaW5kcyB0aGUgd29ybGQgYXJvdW5kIGl0IGRlc3Ryb3llZCwgYW5kIHJhaXNlcyBzb21lCisgICAgICAgICMgcmFuZG9tIGV4Y2VwdGlvbiAqKiogd2hpbGUgdHJ5aW5nIHRvIHJlcG9ydCB0aGUgZXhjZXB0aW9uIGluCisgICAgICAgICMgX19ib290c3RyYXBfaW5uZXIoKSBiZWxvdyAqKiouICBUaG9zZSByYW5kb20gZXhjZXB0aW9ucworICAgICAgICAjIGRvbid0IGhlbHAgYW55Ym9keSwgYW5kIHRoZXkgY29uZnVzZSB1c2Vycywgc28gd2Ugc3VwcHJlc3MKKyAgICAgICAgIyB0aGVtLiAgV2Ugc3VwcHJlc3MgdGhlbSBvbmx5IHdoZW4gaXQgYXBwZWFycyB0aGF0IHRoZSB3b3JsZAorICAgICAgICAjIGluZGVlZCBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZCwgc28gdGhhdCBleGNlcHRpb25zIGluCisgICAgICAgICMgX19ib290c3RyYXBfaW5uZXIoKSBkdXJpbmcgbm9ybWFsIGJ1c2luZXNzIGhvdXJzIGFyZSBwcm9wZXJseQorICAgICAgICAjIHJlcG9ydGVkLiAgQWxzbywgd2Ugb25seSBzdXBwcmVzcyB0aGVtIGZvciBkYWVtb25pYyB0aHJlYWRzOworICAgICAgICAjIGlmIGEgbm9uLWRhZW1vbmljIGVuY291bnRlcnMgdGhpcywgc29tZXRoaW5nIGVsc2UgaXMgd3JvbmcuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX19ib290c3RyYXBfaW5uZXIoKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBpZiBzZWxmLl9fZGFlbW9uaWMgYW5kIF9zeXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgX3NldF9pZGVudChzZWxmKToKKyAgICAgICAgc2VsZi5fX2lkZW50ID0gX2dldF9pZGVudCgpCisKKyAgICBkZWYgX19ib290c3RyYXBfaW5uZXIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3NldF9pZGVudCgpCisgICAgICAgICAgICBzZWxmLl9fc3RhcnRlZC5zZXQoKQorICAgICAgICAgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgICAgICAgICAgX2FjdGl2ZVtzZWxmLl9faWRlbnRdID0gc2VsZgorICAgICAgICAgICAgICAgIGRlbCBfbGltYm9bc2VsZl0KKyAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5fX2Jvb3RzdHJhcCgpOiB0aHJlYWQgc3RhcnRlZCIsIHNlbGYpCisKKyAgICAgICAgICAgIGlmIF90cmFjZV9ob29rOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLl9fYm9vdHN0cmFwKCk6IHJlZ2lzdGVyaW5nIHRyYWNlIGhvb2siLCBzZWxmKQorICAgICAgICAgICAgICAgIF9zeXMuc2V0dHJhY2UoX3RyYWNlX2hvb2spCisgICAgICAgICAgICBpZiBfcHJvZmlsZV9ob29rOgorICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLl9fYm9vdHN0cmFwKCk6IHJlZ2lzdGVyaW5nIHByb2ZpbGUgaG9vayIsIHNlbGYpCisgICAgICAgICAgICAgICAgX3N5cy5zZXRwcm9maWxlKF9wcm9maWxlX2hvb2spCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bigpCisgICAgICAgICAgICBleGNlcHQgU3lzdGVtRXhpdDoKKyAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLl9fYm9vdHN0cmFwKCk6IHJhaXNlZCBTeXN0ZW1FeGl0Iiwgc2VsZikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX25vdGUoIiVzLl9fYm9vdHN0cmFwKCk6IHVuaGFuZGxlZCBleGNlcHRpb24iLCBzZWxmKQorICAgICAgICAgICAgICAgICMgSWYgc3lzLnN0ZGVyciBpcyBubyBtb3JlIChtb3N0IGxpa2VseSBmcm9tIGludGVycHJldGVyCisgICAgICAgICAgICAgICAgIyBzaHV0ZG93bikgdXNlIHNlbGYuX19zdGRlcnIuICBPdGhlcndpc2Ugc3RpbGwgdXNlIHN5cyAoYXMgaW4KKyAgICAgICAgICAgICAgICAjIF9zeXMpIGluIGNhc2Ugc3lzLnN0ZGVyciB3YXMgcmVkZWZpbmVkIHNpbmNlIHRoZSBjcmVhdGlvbiBvZgorICAgICAgICAgICAgICAgICMgc2VsZi4KKyAgICAgICAgICAgICAgICBpZiBfc3lzOgorICAgICAgICAgICAgICAgICAgICBfc3lzLnN0ZGVyci53cml0ZSgiRXhjZXB0aW9uIGluIHRocmVhZCAlczpcbiVzXG4iICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYubmFtZSwgX2Zvcm1hdF9leGMoKSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBEbyB0aGUgYmVzdCBqb2IgcG9zc2libGUgdy9vIGEgaHVnZSBhbXQuIG9mIGNvZGUgdG8KKyAgICAgICAgICAgICAgICAgICAgIyBhcHByb3hpbWF0ZSBhIHRyYWNlYmFjayAoY29kZSBpZGVhcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICMgTGliL3RyYWNlYmFjay5weSkKKyAgICAgICAgICAgICAgICAgICAgZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RiID0gc2VsZi5fX2V4Y19pbmZvKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQ+PnNlbGYuX19zdGRlcnIsICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIGluIHRocmVhZCAiICsgc2VsZi5uYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIChtb3N0IGxpa2VseSByYWlzZWQgZHVyaW5nIGludGVycHJldGVyIHNodXRkb3duKToiKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQ+PnNlbGYuX19zdGRlcnIsICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOiIpCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBleGNfdGI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQ+PnNlbGYuX19zdGRlcnIsICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgRmlsZSAiJXMiLCBsaW5lICVzLCBpbiAlcycgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhjX3RiLnRiX2ZyYW1lLmZfY29kZS5jb19maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y190Yi50Yl9saW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNfdGIudGJfZnJhbWUuZl9jb2RlLmNvX25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y190YiA9IGV4Y190Yi50Yl9uZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludD4+c2VsZi5fX3N0ZGVyciwgKCIlczogJXMiICUgKGV4Y190eXBlLCBleGNfdmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IGV4Y190YiBnZXRzIGRlbGV0ZWQgc2luY2UgaXQgaXMgYSBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgIyBob2c7IGRlbGV0aW5nIGV2ZXJ5dGhpbmcgZWxzZSBpcyBqdXN0IGZvciB0aG9yb3VnaG5lc3MKKyAgICAgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdGIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5fX2Jvb3RzdHJhcCgpOiBub3JtYWwgcmV0dXJuIiwgc2VsZikKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgIyBQcmV2ZW50IGEgcmFjZSBpbgorICAgICAgICAgICAgICAgICMgdGVzdF90aHJlYWRpbmcudGVzdF9ub19yZWZjeWNsZV90aHJvdWdoX3RhcmdldCB3aGVuCisgICAgICAgICAgICAgICAgIyB0aGUgZXhjZXB0aW9uIGtlZXBzIHRoZSB0YXJnZXQgYWxpdmUgcGFzdCB3aGVuIHdlCisgICAgICAgICAgICAgICAgIyBhc3NlcnQgdGhhdCBpdCdzIGRlYWQuCisgICAgICAgICAgICAgICAgc2VsZi5fX2V4Y19jbGVhcigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICB3aXRoIF9hY3RpdmVfbGltYm9fbG9jazoKKyAgICAgICAgICAgICAgICBzZWxmLl9fc3RvcCgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIFdlIGRvbid0IGNhbGwgc2VsZi5fX2RlbGV0ZSgpIGJlY2F1c2UgaXQgYWxzbworICAgICAgICAgICAgICAgICAgICAjIGdyYWJzIF9hY3RpdmVfbGltYm9fbG9jay4KKyAgICAgICAgICAgICAgICAgICAgZGVsIF9hY3RpdmVbX2dldF9pZGVudCgpXQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9fc3RvcChzZWxmKToKKyAgICAgICAgIyBEdW1teVRocmVhZHMgZGVsZXRlIHNlbGYuX19ibG9jaywgYnV0IHRoZXkgaGF2ZSBubyB3YWl0ZXJzIHRvCisgICAgICAgICMgbm90aWZ5IGFueXdheSAoam9pbigpIGlzIGZvcmJpZGRlbiBvbiB0aGVtKS4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ19UaHJlYWRfX2Jsb2NrJyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fX2Jsb2NrLmFjcXVpcmUoKQorICAgICAgICBzZWxmLl9fc3RvcHBlZCA9IFRydWUKKyAgICAgICAgc2VsZi5fX2Jsb2NrLm5vdGlmeV9hbGwoKQorICAgICAgICBzZWxmLl9fYmxvY2sucmVsZWFzZSgpCisKKyAgICBkZWYgX19kZWxldGUoc2VsZik6CisgICAgICAgICJSZW1vdmUgY3VycmVudCB0aHJlYWQgZnJvbSB0aGUgZGljdCBvZiBjdXJyZW50bHkgcnVubmluZyB0aHJlYWRzLiIKKworICAgICAgICAjIE5vdGVzIGFib3V0IHJ1bm5pbmcgd2l0aCBkdW1teV90aHJlYWQ6CisgICAgICAgICMKKyAgICAgICAgIyBNdXN0IHRha2UgY2FyZSB0byBub3QgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGR1bW15X3RocmVhZCBpcyBiZWluZworICAgICAgICAjIHVzZWQgKGFuZCB0aHVzIHRoaXMgbW9kdWxlIGlzIGJlaW5nIHVzZWQgYXMgYW4gaW5zdGFuY2Ugb2YKKyAgICAgICAgIyBkdW1teV90aHJlYWRpbmcpLiAgZHVtbXlfdGhyZWFkLmdldF9pZGVudCgpIGFsd2F5cyByZXR1cm5zIC0xIHNpbmNlCisgICAgICAgICMgdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkIGlmIGR1bW15X3RocmVhZCBpcyBiZWluZyB1c2VkLiAgVGh1cworICAgICAgICAjIGxlbihfYWN0aXZlKSBpcyBhbHdheXMgPD0gMSBoZXJlLCBhbmQgYW55IFRocmVhZCBpbnN0YW5jZSBjcmVhdGVkCisgICAgICAgICMgb3ZlcndyaXRlcyB0aGUgKGlmIGFueSkgdGhyZWFkIGN1cnJlbnRseSByZWdpc3RlcmVkIGluIF9hY3RpdmUuCisgICAgICAgICMKKyAgICAgICAgIyBBbiBpbnN0YW5jZSBvZiBfTWFpblRocmVhZCBpcyBhbHdheXMgY3JlYXRlZCBieSAndGhyZWFkaW5nJy4gIFRoaXMKKyAgICAgICAgIyBnZXRzIG92ZXJ3cml0dGVuIHRoZSBpbnN0YW50IGFuIGluc3RhbmNlIG9mIFRocmVhZCBpcyBjcmVhdGVkOyBib3RoCisgICAgICAgICMgdGhyZWFkcyByZXR1cm4gLTEgZnJvbSBkdW1teV90aHJlYWQuZ2V0X2lkZW50KCkgYW5kIHRodXMgaGF2ZSB0aGUKKyAgICAgICAgIyBzYW1lIGtleSBpbiB0aGUgZGljdC4gIFNvIHdoZW4gdGhlIF9NYWluVGhyZWFkIGluc3RhbmNlIGNyZWF0ZWQgYnkKKyAgICAgICAgIyAndGhyZWFkaW5nJyB0cmllcyB0byBjbGVhbiBpdHNlbGYgdXAgd2hlbiBhdGV4aXQgY2FsbHMgdGhpcyBtZXRob2QKKyAgICAgICAgIyBpdCBnZXRzIGEgS2V5RXJyb3IgaWYgYW5vdGhlciBUaHJlYWQgaW5zdGFuY2Ugd2FzIGNyZWF0ZWQuCisgICAgICAgICMKKyAgICAgICAgIyBUaGlzIGFsbCBtZWFucyB0aGF0IEtleUVycm9yIGZyb20gdHJ5aW5nIHRvIGRlbGV0ZSBzb21ldGhpbmcgZnJvbQorICAgICAgICAjIF9hY3RpdmUgaWYgZHVtbXlfdGhyZWFkaW5nIGlzIGJlaW5nIHVzZWQgaXMgYSByZWQgaGVycmluZy4gIEJ1dAorICAgICAgICAjIHNpbmNlIGl0IGlzbid0IGlmIGR1bW15X3RocmVhZGluZyBpcyAqbm90KiBiZWluZyB1c2VkIHRoZW4gZG9uJ3QKKyAgICAgICAgIyBoaWRlIHRoZSBleGNlcHRpb24uCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgICAgICAgICAgZGVsIF9hY3RpdmVbX2dldF9pZGVudCgpXQorICAgICAgICAgICAgICAgICMgVGhlcmUgbXVzdCBub3QgYmUgYW55IHB5dGhvbiBjb2RlIGJldHdlZW4gdGhlIHByZXZpb3VzIGxpbmUKKyAgICAgICAgICAgICAgICAjIGFuZCBhZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZC4gIE90aGVyd2lzZSBhIHRyYWNpbmcgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICAjIGNvdWxkIHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrIGFnYWluIGluIHRoZSBzYW1lIHRocmVhZCwgKGluCisgICAgICAgICAgICAgICAgIyBjdXJyZW50X3RocmVhZCgpKSwgYW5kIHdvdWxkIGJsb2NrLgorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBpZiAnZHVtbXlfdGhyZWFkaW5nJyBub3QgaW4gX3N5cy5tb2R1bGVzOgorICAgICAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgam9pbihzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICAiIiJXYWl0IHVudGlsIHRoZSB0aHJlYWQgdGVybWluYXRlcy4KKworICAgICAgICBUaGlzIGJsb2NrcyB0aGUgY2FsbGluZyB0aHJlYWQgdW50aWwgdGhlIHRocmVhZCB3aG9zZSBqb2luKCkgbWV0aG9kIGlzCisgICAgICAgIGNhbGxlZCB0ZXJtaW5hdGVzIC0tIGVpdGhlciBub3JtYWxseSBvciB0aHJvdWdoIGFuIHVuaGFuZGxlZCBleGNlcHRpb24KKyAgICAgICAgb3IgdW50aWwgdGhlIG9wdGlvbmFsIHRpbWVvdXQgb2NjdXJzLgorCisgICAgICAgIFdoZW4gdGhlIHRpbWVvdXQgYXJndW1lbnQgaXMgcHJlc2VudCBhbmQgbm90IE5vbmUsIGl0IHNob3VsZCBiZSBhCisgICAgICAgIGZsb2F0aW5nIHBvaW50IG51bWJlciBzcGVjaWZ5aW5nIGEgdGltZW91dCBmb3IgdGhlIG9wZXJhdGlvbiBpbiBzZWNvbmRzCisgICAgICAgIChvciBmcmFjdGlvbnMgdGhlcmVvZikuIEFzIGpvaW4oKSBhbHdheXMgcmV0dXJucyBOb25lLCB5b3UgbXVzdCBjYWxsCisgICAgICAgIGlzQWxpdmUoKSBhZnRlciBqb2luKCkgdG8gZGVjaWRlIHdoZXRoZXIgYSB0aW1lb3V0IGhhcHBlbmVkIC0tIGlmIHRoZQorICAgICAgICB0aHJlYWQgaXMgc3RpbGwgYWxpdmUsIHRoZSBqb2luKCkgY2FsbCB0aW1lZCBvdXQuCisKKyAgICAgICAgV2hlbiB0aGUgdGltZW91dCBhcmd1bWVudCBpcyBub3QgcHJlc2VudCBvciBOb25lLCB0aGUgb3BlcmF0aW9uIHdpbGwKKyAgICAgICAgYmxvY2sgdW50aWwgdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgorCisgICAgICAgIEEgdGhyZWFkIGNhbiBiZSBqb2luKCllZCBtYW55IHRpbWVzLgorCisgICAgICAgIGpvaW4oKSByYWlzZXMgYSBSdW50aW1lRXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIGpvaW4gdGhlIGN1cnJlbnQKKyAgICAgICAgdGhyZWFkIGFzIHRoYXQgd291bGQgY2F1c2UgYSBkZWFkbG9jay4gSXQgaXMgYWxzbyBhbiBlcnJvciB0byBqb2luKCkgYQorICAgICAgICB0aHJlYWQgYmVmb3JlIGl0IGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGF0dGVtcHRzIHRvIGRvIHNvIHJhaXNlcyB0aGUgc2FtZQorICAgICAgICBleGNlcHRpb24uCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLl9faW5pdGlhbGl6ZWQ6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoIlRocmVhZC5fX2luaXRfXygpIG5vdCBjYWxsZWQiKQorICAgICAgICBpZiBub3Qgc2VsZi5fX3N0YXJ0ZWQuaXNfc2V0KCk6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNhbm5vdCBqb2luIHRocmVhZCBiZWZvcmUgaXQgaXMgc3RhcnRlZCIpCisgICAgICAgIGlmIHNlbGYgaXMgY3VycmVudF90aHJlYWQoKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiY2Fubm90IGpvaW4gY3VycmVudCB0aHJlYWQiKQorCisgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fc3RvcHBlZDoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5qb2luKCk6IHdhaXRpbmcgdW50aWwgdGhyZWFkIHN0b3BzIiwgc2VsZikKKyAgICAgICAgc2VsZi5fX2Jsb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiB0aW1lb3V0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYuX19zdG9wcGVkOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYmxvY2sud2FpdCgpCisgICAgICAgICAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5qb2luKCk6IHRocmVhZCBzdG9wcGVkIiwgc2VsZikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVhZGxpbmUgPSBfdGltZSgpICsgdGltZW91dAorICAgICAgICAgICAgICAgIHdoaWxlIG5vdCBzZWxmLl9fc3RvcHBlZDoKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSBkZWFkbGluZSAtIF90aW1lKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGVsYXkgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5qb2luKCk6IHRpbWVkIG91dCIsIHNlbGYpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBzZWxmLl9fYmxvY2sud2FpdChkZWxheSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCIlcy5qb2luKCk6IHRocmVhZCBzdG9wcGVkIiwgc2VsZikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX19ibG9jay5yZWxlYXNlKCkKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBuYW1lKHNlbGYpOgorICAgICAgICAiIiJBIHN0cmluZyB1c2VkIGZvciBpZGVudGlmaWNhdGlvbiBwdXJwb3NlcyBvbmx5LgorCisgICAgICAgIEl0IGhhcyBubyBzZW1hbnRpY3MuIE11bHRpcGxlIHRocmVhZHMgbWF5IGJlIGdpdmVuIHRoZSBzYW1lIG5hbWUuIFRoZQorICAgICAgICBpbml0aWFsIG5hbWUgaXMgc2V0IGJ5IHRoZSBjb25zdHJ1Y3Rvci4KKworICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYuX19pbml0aWFsaXplZCwgIlRocmVhZC5fX2luaXRfXygpIG5vdCBjYWxsZWQiCisgICAgICAgIHJldHVybiBzZWxmLl9fbmFtZQorCisgICAgQG5hbWUuc2V0dGVyCisgICAgZGVmIG5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIGFzc2VydCBzZWxmLl9faW5pdGlhbGl6ZWQsICJUaHJlYWQuX19pbml0X18oKSBub3QgY2FsbGVkIgorICAgICAgICBzZWxmLl9fbmFtZSA9IHN0cihuYW1lKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGlkZW50KHNlbGYpOgorICAgICAgICAiIiJUaHJlYWQgaWRlbnRpZmllciBvZiB0aGlzIHRocmVhZCBvciBOb25lIGlmIGl0IGhhcyBub3QgYmVlbiBzdGFydGVkLgorCisgICAgICAgIFRoaXMgaXMgYSBub256ZXJvIGludGVnZXIuIFNlZSB0aGUgdGhyZWFkLmdldF9pZGVudCgpIGZ1bmN0aW9uLiBUaHJlYWQKKyAgICAgICAgaWRlbnRpZmllcnMgbWF5IGJlIHJlY3ljbGVkIHdoZW4gYSB0aHJlYWQgZXhpdHMgYW5kIGFub3RoZXIgdGhyZWFkIGlzCisgICAgICAgIGNyZWF0ZWQuIFRoZSBpZGVudGlmaWVyIGlzIGF2YWlsYWJsZSBldmVuIGFmdGVyIHRoZSB0aHJlYWQgaGFzIGV4aXRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYuX19pbml0aWFsaXplZCwgIlRocmVhZC5fX2luaXRfXygpIG5vdCBjYWxsZWQiCisgICAgICAgIHJldHVybiBzZWxmLl9faWRlbnQKKworICAgIGRlZiBpc0FsaXZlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gd2hldGhlciB0aGUgdGhyZWFkIGlzIGFsaXZlLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHJldHVybnMgVHJ1ZSBqdXN0IGJlZm9yZSB0aGUgcnVuKCkgbWV0aG9kIHN0YXJ0cyB1bnRpbCBqdXN0CisgICAgICAgIGFmdGVyIHRoZSBydW4oKSBtZXRob2QgdGVybWluYXRlcy4gVGhlIG1vZHVsZSBmdW5jdGlvbiBlbnVtZXJhdGUoKQorICAgICAgICByZXR1cm5zIGEgbGlzdCBvZiBhbGwgYWxpdmUgdGhyZWFkcy4KKworICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0IHNlbGYuX19pbml0aWFsaXplZCwgIlRocmVhZC5fX2luaXRfXygpIG5vdCBjYWxsZWQiCisgICAgICAgIHJldHVybiBzZWxmLl9fc3RhcnRlZC5pc19zZXQoKSBhbmQgbm90IHNlbGYuX19zdG9wcGVkCisKKyAgICBpc19hbGl2ZSA9IGlzQWxpdmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBkYWVtb24oc2VsZik6CisgICAgICAgICIiIkEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB0aHJlYWQgaXMgYSBkYWVtb24gdGhyZWFkIChUcnVlKSBvciBub3QgKEZhbHNlKS4KKworICAgICAgICBUaGlzIG11c3QgYmUgc2V0IGJlZm9yZSBzdGFydCgpIGlzIGNhbGxlZCwgb3RoZXJ3aXNlIFJ1bnRpbWVFcnJvciBpcworICAgICAgICByYWlzZWQuIEl0cyBpbml0aWFsIHZhbHVlIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBjcmVhdGluZyB0aHJlYWQ7IHRoZQorICAgICAgICBtYWluIHRocmVhZCBpcyBub3QgYSBkYWVtb24gdGhyZWFkIGFuZCB0aGVyZWZvcmUgYWxsIHRocmVhZHMgY3JlYXRlZCBpbgorICAgICAgICB0aGUgbWFpbiB0aHJlYWQgZGVmYXVsdCB0byBkYWVtb24gPSBGYWxzZS4KKworICAgICAgICBUaGUgZW50aXJlIFB5dGhvbiBwcm9ncmFtIGV4aXRzIHdoZW4gbm8gYWxpdmUgbm9uLWRhZW1vbiB0aHJlYWRzIGFyZQorICAgICAgICBsZWZ0LgorCisgICAgICAgICIiIgorICAgICAgICBhc3NlcnQgc2VsZi5fX2luaXRpYWxpemVkLCAiVGhyZWFkLl9faW5pdF9fKCkgbm90IGNhbGxlZCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19kYWVtb25pYworCisgICAgQGRhZW1vbi5zZXR0ZXIKKyAgICBkZWYgZGFlbW9uKHNlbGYsIGRhZW1vbmljKToKKyAgICAgICAgaWYgbm90IHNlbGYuX19pbml0aWFsaXplZDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiVGhyZWFkLl9faW5pdF9fKCkgbm90IGNhbGxlZCIpCisgICAgICAgIGlmIHNlbGYuX19zdGFydGVkLmlzX3NldCgpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJjYW5ub3Qgc2V0IGRhZW1vbiBzdGF0dXMgb2YgYWN0aXZlIHRocmVhZCIpOworICAgICAgICBzZWxmLl9fZGFlbW9uaWMgPSBkYWVtb25pYworCisgICAgZGVmIGlzRGFlbW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYWVtb24KKworICAgIGRlZiBzZXREYWVtb24oc2VsZiwgZGFlbW9uaWMpOgorICAgICAgICBzZWxmLmRhZW1vbiA9IGRhZW1vbmljCisKKyAgICBkZWYgZ2V0TmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorCisgICAgZGVmIHNldE5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworIyBUaGUgdGltZXIgY2xhc3Mgd2FzIGNvbnRyaWJ1dGVkIGJ5IEl0YW1hciBTaHR1bGwtVHJhdXJpbmcKKworZGVmIFRpbWVyKCphcmdzLCAqKmt3YXJncyk6CisgICAgIiIiRmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgYSBUaW1lciBvYmplY3QuCisKKyAgICBUaW1lcnMgY2FsbCBhIGZ1bmN0aW9uIGFmdGVyIGEgc3BlY2lmaWVkIG51bWJlciBvZiBzZWNvbmRzOgorCisgICAgICAgIHQgPSBUaW1lcigzMC4wLCBmLCBhcmdzPVtdLCBrd2FyZ3M9e30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmNhbmNlbCgpICAgICAjIHN0b3AgdGhlIHRpbWVyJ3MgYWN0aW9uIGlmIGl0J3Mgc3RpbGwgd2FpdGluZworCisgICAgIiIiCisgICAgcmV0dXJuIF9UaW1lcigqYXJncywgKiprd2FyZ3MpCisKK2NsYXNzIF9UaW1lcihUaHJlYWQpOgorICAgICIiIkNhbGwgYSBmdW5jdGlvbiBhZnRlciBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kczoKKworICAgICAgICAgICAgdCA9IFRpbWVyKDMwLjAsIGYsIGFyZ3M9W10sIGt3YXJncz17fSkKKyAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgdC5jYW5jZWwoKSAgICAgIyBzdG9wIHRoZSB0aW1lcidzIGFjdGlvbiBpZiBpdCdzIHN0aWxsIHdhaXRpbmcKKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGludGVydmFsLCBmdW5jdGlvbiwgYXJncz1bXSwga3dhcmdzPXt9KToKKyAgICAgICAgVGhyZWFkLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuaW50ZXJ2YWwgPSBpbnRlcnZhbAorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gZnVuY3Rpb24KKyAgICAgICAgc2VsZi5hcmdzID0gYXJncworICAgICAgICBzZWxmLmt3YXJncyA9IGt3YXJncworICAgICAgICBzZWxmLmZpbmlzaGVkID0gRXZlbnQoKQorCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgIiIiU3RvcCB0aGUgdGltZXIgaWYgaXQgaGFzbid0IGZpbmlzaGVkIHlldCIiIgorICAgICAgICBzZWxmLmZpbmlzaGVkLnNldCgpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLmZpbmlzaGVkLndhaXQoc2VsZi5pbnRlcnZhbCkKKyAgICAgICAgaWYgbm90IHNlbGYuZmluaXNoZWQuaXNfc2V0KCk6CisgICAgICAgICAgICBzZWxmLmZ1bmN0aW9uKCpzZWxmLmFyZ3MsICoqc2VsZi5rd2FyZ3MpCisgICAgICAgIHNlbGYuZmluaXNoZWQuc2V0KCkKKworIyBTcGVjaWFsIHRocmVhZCBjbGFzcyB0byByZXByZXNlbnQgdGhlIG1haW4gdGhyZWFkCisjIFRoaXMgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQgdGhyb3VnaCBhbiBleGl0IGhhbmRsZXIKKworY2xhc3MgX01haW5UaHJlYWQoVGhyZWFkKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVGhyZWFkLl9faW5pdF9fKHNlbGYsIG5hbWU9Ik1haW5UaHJlYWQiKQorICAgICAgICBzZWxmLl9UaHJlYWRfX3N0YXJ0ZWQuc2V0KCkKKyAgICAgICAgc2VsZi5fc2V0X2lkZW50KCkKKyAgICAgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgICAgICBfYWN0aXZlW19nZXRfaWRlbnQoKV0gPSBzZWxmCisKKyAgICBkZWYgX3NldF9kYWVtb24oc2VsZik6CisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIF9leGl0ZnVuYyhzZWxmKToKKyAgICAgICAgc2VsZi5fVGhyZWFkX19zdG9wKCkKKyAgICAgICAgdCA9IF9waWNrU29tZU5vbkRhZW1vblRocmVhZCgpCisgICAgICAgIGlmIHQ6CisgICAgICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiJXM6IHdhaXRpbmcgZm9yIG90aGVyIHRocmVhZHMiLCBzZWxmKQorICAgICAgICB3aGlsZSB0OgorICAgICAgICAgICAgdC5qb2luKCkKKyAgICAgICAgICAgIHQgPSBfcGlja1NvbWVOb25EYWVtb25UaHJlYWQoKQorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBzZWxmLl9ub3RlKCIlczogZXhpdGluZyIsIHNlbGYpCisgICAgICAgIHNlbGYuX1RocmVhZF9fZGVsZXRlKCkKKworZGVmIF9waWNrU29tZU5vbkRhZW1vblRocmVhZCgpOgorICAgIGZvciB0IGluIGVudW1lcmF0ZSgpOgorICAgICAgICBpZiBub3QgdC5kYWVtb24gYW5kIHQuaXNfYWxpdmUoKToKKyAgICAgICAgICAgIHJldHVybiB0CisgICAgcmV0dXJuIE5vbmUKKworCisjIER1bW15IHRocmVhZCBjbGFzcyB0byByZXByZXNlbnQgdGhyZWFkcyBub3Qgc3RhcnRlZCBoZXJlLgorIyBUaGVzZSBhcmVuJ3QgZ2FyYmFnZSBjb2xsZWN0ZWQgd2hlbiB0aGV5IGRpZSwgbm9yIGNhbiB0aGV5IGJlIHdhaXRlZCBmb3IuCisjIElmIHRoZXkgaW52b2tlIGFueXRoaW5nIGluIHRocmVhZGluZy5weSB0aGF0IGNhbGxzIGN1cnJlbnRfdGhyZWFkKCksIHRoZXkKKyMgbGVhdmUgYW4gZW50cnkgaW4gdGhlIF9hY3RpdmUgZGljdCBmb3JldmVyIGFmdGVyLgorIyBUaGVpciBwdXJwb3NlIGlzIHRvIHJldHVybiAqc29tZXRoaW5nKiBmcm9tIGN1cnJlbnRfdGhyZWFkKCkuCisjIFRoZXkgYXJlIG1hcmtlZCBhcyBkYWVtb24gdGhyZWFkcyBzbyB3ZSB3b24ndCB3YWl0IGZvciB0aGVtCisjIHdoZW4gd2UgZXhpdCAoY29uZm9ybSBwcmV2aW91cyBzZW1hbnRpY3MpLgorCitjbGFzcyBfRHVtbXlUaHJlYWQoVGhyZWFkKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgVGhyZWFkLl9faW5pdF9fKHNlbGYsIG5hbWU9X25ld25hbWUoIkR1bW15LSVkIikpCisKKyAgICAgICAgIyBUaHJlYWQuX19ibG9jayBjb25zdW1lcyBhbiBPUy1sZXZlbCBsb2NraW5nIHByaW1pdGl2ZSwgd2hpY2gKKyAgICAgICAgIyBjYW4gbmV2ZXIgYmUgdXNlZCBieSBhIF9EdW1teVRocmVhZC4gIFNpbmNlIGEgX0R1bW15VGhyZWFkCisgICAgICAgICMgaW5zdGFuY2UgaXMgaW1tb3J0YWwsIHRoYXQncyBiYWQsIHNvIHJlbGVhc2UgdGhpcyByZXNvdXJjZS4KKyAgICAgICAgZGVsIHNlbGYuX1RocmVhZF9fYmxvY2sKKworICAgICAgICBzZWxmLl9UaHJlYWRfX3N0YXJ0ZWQuc2V0KCkKKyAgICAgICAgc2VsZi5fc2V0X2lkZW50KCkKKyAgICAgICAgd2l0aCBfYWN0aXZlX2xpbWJvX2xvY2s6CisgICAgICAgICAgICBfYWN0aXZlW19nZXRfaWRlbnQoKV0gPSBzZWxmCisKKyAgICBkZWYgX3NldF9kYWVtb24oc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgam9pbihzZWxmLCB0aW1lb3V0PU5vbmUpOgorICAgICAgICBhc3NlcnQgRmFsc2UsICJjYW5ub3Qgam9pbiBhIGR1bW15IHRocmVhZCIKKworCisjIEdsb2JhbCBBUEkgZnVuY3Rpb25zCisKK2RlZiBjdXJyZW50VGhyZWFkKCk6CisgICAgIiIiUmV0dXJuIHRoZSBjdXJyZW50IFRocmVhZCBvYmplY3QsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGNhbGxlcidzIHRocmVhZCBvZiBjb250cm9sLgorCisgICAgSWYgdGhlIGNhbGxlcidzIHRocmVhZCBvZiBjb250cm9sIHdhcyBub3QgY3JlYXRlZCB0aHJvdWdoIHRoZSB0aHJlYWRpbmcKKyAgICBtb2R1bGUsIGEgZHVtbXkgdGhyZWFkIG9iamVjdCB3aXRoIGxpbWl0ZWQgZnVuY3Rpb25hbGl0eSBpcyByZXR1cm5lZC4KKworICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIF9hY3RpdmVbX2dldF9pZGVudCgpXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgIyNwcmludCAiY3VycmVudF90aHJlYWQoKTogbm8gY3VycmVudCB0aHJlYWQgZm9yIiwgX2dldF9pZGVudCgpCisgICAgICAgIHJldHVybiBfRHVtbXlUaHJlYWQoKQorCitjdXJyZW50X3RocmVhZCA9IGN1cnJlbnRUaHJlYWQKKworZGVmIGFjdGl2ZUNvdW50KCk6CisgICAgIiIiUmV0dXJuIHRoZSBudW1iZXIgb2YgVGhyZWFkIG9iamVjdHMgY3VycmVudGx5IGFsaXZlLgorCisgICAgVGhlIHJldHVybmVkIGNvdW50IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIGxpc3QgcmV0dXJuZWQgYnkKKyAgICBlbnVtZXJhdGUoKS4KKworICAgICIiIgorICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgorICAgICAgICByZXR1cm4gbGVuKF9hY3RpdmUpICsgbGVuKF9saW1ibykKKworYWN0aXZlX2NvdW50ID0gYWN0aXZlQ291bnQKKworZGVmIF9lbnVtZXJhdGUoKToKKyAgICAjIFNhbWUgYXMgZW51bWVyYXRlKCksIGJ1dCB3aXRob3V0IHRoZSBsb2NrLiBJbnRlcm5hbCB1c2Ugb25seS4KKyAgICByZXR1cm4gX2FjdGl2ZS52YWx1ZXMoKSArIF9saW1iby52YWx1ZXMoKQorCitkZWYgZW51bWVyYXRlKCk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgVGhyZWFkIG9iamVjdHMgY3VycmVudGx5IGFsaXZlLgorCisgICAgVGhlIGxpc3QgaW5jbHVkZXMgZGFlbW9uaWMgdGhyZWFkcywgZHVtbXkgdGhyZWFkIG9iamVjdHMgY3JlYXRlZCBieQorICAgIGN1cnJlbnRfdGhyZWFkKCksIGFuZCB0aGUgbWFpbiB0aHJlYWQuIEl0IGV4Y2x1ZGVzIHRlcm1pbmF0ZWQgdGhyZWFkcyBhbmQKKyAgICB0aHJlYWRzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gc3RhcnRlZC4KKworICAgICIiIgorICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgorICAgICAgICByZXR1cm4gX2FjdGl2ZS52YWx1ZXMoKSArIF9saW1iby52YWx1ZXMoKQorCitmcm9tIHRocmVhZCBpbXBvcnQgc3RhY2tfc2l6ZQorCisjIENyZWF0ZSB0aGUgbWFpbiB0aHJlYWQgb2JqZWN0LAorIyBhbmQgbWFrZSBpdCBhdmFpbGFibGUgZm9yIHRoZSBpbnRlcnByZXRlcgorIyAoUHlfTWFpbikgYXMgdGhyZWFkaW5nLl9zaHV0ZG93bi4KKworX3NodXRkb3duID0gX01haW5UaHJlYWQoKS5fZXhpdGZ1bmMKKworIyBnZXQgdGhyZWFkLWxvY2FsIGltcGxlbWVudGF0aW9uLCBlaXRoZXIgZnJvbSB0aGUgdGhyZWFkCisjIG1vZHVsZSwgb3IgZnJvbSB0aGUgcHl0aG9uIGZhbGxiYWNrCisKK3RyeToKKyAgICBmcm9tIHRocmVhZCBpbXBvcnQgX2xvY2FsIGFzIGxvY2FsCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBfdGhyZWFkaW5nX2xvY2FsIGltcG9ydCBsb2NhbAorCisKK2RlZiBfYWZ0ZXJfZm9yaygpOgorICAgICMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgUHl0aG9uL2NldmFsLmM6UHlFdmFsX1JlSW5pdFRocmVhZHMgd2hpY2gKKyAgICAjIGlzIGNhbGxlZCBmcm9tIFB5T1NfQWZ0ZXJGb3JrLiAgSGVyZSB3ZSBjbGVhbnVwIHRocmVhZGluZyBtb2R1bGUgc3RhdGUKKyAgICAjIHRoYXQgc2hvdWxkIG5vdCBleGlzdCBhZnRlciBhIGZvcmsuCisKKyAgICAjIFJlc2V0IF9hY3RpdmVfbGltYm9fbG9jaywgaW4gY2FzZSB3ZSBmb3JrZWQgd2hpbGUgdGhlIGxvY2sgd2FzIGhlbGQKKyAgICAjIGJ5IGFub3RoZXIgKG5vbi1mb3JrZWQpIHRocmVhZC4gIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU4NzQ5MDAKKyAgICBnbG9iYWwgX2FjdGl2ZV9saW1ib19sb2NrCisgICAgX2FjdGl2ZV9saW1ib19sb2NrID0gX2FsbG9jYXRlX2xvY2soKQorCisgICAgIyBmb3JrKCkgb25seSBjb3BpZWQgdGhlIGN1cnJlbnQgdGhyZWFkOyBjbGVhciByZWZlcmVuY2VzIHRvIG90aGVycy4KKyAgICBuZXdfYWN0aXZlID0ge30KKyAgICBjdXJyZW50ID0gY3VycmVudF90aHJlYWQoKQorICAgIHdpdGggX2FjdGl2ZV9saW1ib19sb2NrOgorICAgICAgICBmb3IgdGhyZWFkIGluIF9hY3RpdmUuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgIyBBbnkgbG9jay9jb25kaXRpb24gdmFyaWFibGUgbWF5IGJlIGN1cnJlbnRseSBsb2NrZWQgb3IgaW4gYW4KKyAgICAgICAgICAgICMgaW52YWxpZCBzdGF0ZSwgc28gd2UgcmVpbml0aWFsaXplIHRoZW0uCisgICAgICAgICAgICBpZiBoYXNhdHRyKHRocmVhZCwgJ19yZXNldF9pbnRlcm5hbF9sb2NrcycpOgorICAgICAgICAgICAgICAgIHRocmVhZC5fcmVzZXRfaW50ZXJuYWxfbG9ja3MoKQorICAgICAgICAgICAgaWYgdGhyZWFkIGlzIGN1cnJlbnQ6CisgICAgICAgICAgICAgICAgIyBUaGVyZSBpcyBvbmx5IG9uZSBhY3RpdmUgdGhyZWFkLiBXZSByZXNldCB0aGUgaWRlbnQgdG8KKyAgICAgICAgICAgICAgICAjIGl0cyBuZXcgdmFsdWUgc2luY2UgaXQgY2FuIGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBpZGVudCA9IF9nZXRfaWRlbnQoKQorICAgICAgICAgICAgICAgIHRocmVhZC5fVGhyZWFkX19pZGVudCA9IGlkZW50CisgICAgICAgICAgICAgICAgbmV3X2FjdGl2ZVtpZGVudF0gPSB0aHJlYWQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBBbGwgdGhlIG90aGVycyBhcmUgYWxyZWFkeSBzdG9wcGVkLgorICAgICAgICAgICAgICAgIHRocmVhZC5fVGhyZWFkX19zdG9wKCkKKworICAgICAgICBfbGltYm8uY2xlYXIoKQorICAgICAgICBfYWN0aXZlLmNsZWFyKCkKKyAgICAgICAgX2FjdGl2ZS51cGRhdGUobmV3X2FjdGl2ZSkKKyAgICAgICAgYXNzZXJ0IGxlbihfYWN0aXZlKSA9PSAxCisKKworIyBTZWxmLXRlc3QgY29kZQorCitkZWYgX3Rlc3QoKToKKworICAgIGNsYXNzIEJvdW5kZWRRdWV1ZShfVmVyYm9zZSk6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxpbWl0KToKKyAgICAgICAgICAgIF9WZXJib3NlLl9faW5pdF9fKHNlbGYpCisgICAgICAgICAgICBzZWxmLm1vbiA9IFJMb2NrKCkKKyAgICAgICAgICAgIHNlbGYucmMgPSBDb25kaXRpb24oc2VsZi5tb24pCisgICAgICAgICAgICBzZWxmLndjID0gQ29uZGl0aW9uKHNlbGYubW9uKQorICAgICAgICAgICAgc2VsZi5saW1pdCA9IGxpbWl0CisgICAgICAgICAgICBzZWxmLnF1ZXVlID0gX2RlcXVlKCkKKworICAgICAgICBkZWYgcHV0KHNlbGYsIGl0ZW0pOgorICAgICAgICAgICAgc2VsZi5tb24uYWNxdWlyZSgpCisgICAgICAgICAgICB3aGlsZSBsZW4oc2VsZi5xdWV1ZSkgPj0gc2VsZi5saW1pdDoKKyAgICAgICAgICAgICAgICBzZWxmLl9ub3RlKCJwdXQoJXMpOiBxdWV1ZSBmdWxsIiwgaXRlbSkKKyAgICAgICAgICAgICAgICBzZWxmLndjLndhaXQoKQorICAgICAgICAgICAgc2VsZi5xdWV1ZS5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgIHNlbGYuX25vdGUoInB1dCglcyk6IGFwcGVuZGVkLCBsZW5ndGggbm93ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaXRlbSwgbGVuKHNlbGYucXVldWUpKQorICAgICAgICAgICAgc2VsZi5yYy5ub3RpZnkoKQorICAgICAgICAgICAgc2VsZi5tb24ucmVsZWFzZSgpCisKKyAgICAgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgICAgIHNlbGYubW9uLmFjcXVpcmUoKQorICAgICAgICAgICAgd2hpbGUgbm90IHNlbGYucXVldWU6CisgICAgICAgICAgICAgICAgc2VsZi5fbm90ZSgiZ2V0KCk6IHF1ZXVlIGVtcHR5IikKKyAgICAgICAgICAgICAgICBzZWxmLnJjLndhaXQoKQorICAgICAgICAgICAgaXRlbSA9IHNlbGYucXVldWUucG9wbGVmdCgpCisgICAgICAgICAgICBzZWxmLl9ub3RlKCJnZXQoKTogZ290ICVzLCAlZCBsZWZ0IiwgaXRlbSwgbGVuKHNlbGYucXVldWUpKQorICAgICAgICAgICAgc2VsZi53Yy5ub3RpZnkoKQorICAgICAgICAgICAgc2VsZi5tb24ucmVsZWFzZSgpCisgICAgICAgICAgICByZXR1cm4gaXRlbQorCisgICAgY2xhc3MgUHJvZHVjZXJUaHJlYWQoVGhyZWFkKToKKworICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcXVldWUsIHF1b3RhKToKKyAgICAgICAgICAgIFRocmVhZC5fX2luaXRfXyhzZWxmLCBuYW1lPSJQcm9kdWNlciIpCisgICAgICAgICAgICBzZWxmLnF1ZXVlID0gcXVldWUKKyAgICAgICAgICAgIHNlbGYucXVvdGEgPSBxdW90YQorCisgICAgICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgICAgICBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZG9tCisgICAgICAgICAgICBjb3VudGVyID0gMAorICAgICAgICAgICAgd2hpbGUgY291bnRlciA8IHNlbGYucXVvdGE6CisgICAgICAgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCisgICAgICAgICAgICAgICAgc2VsZi5xdWV1ZS5wdXQoIiVzLiVkIiAlIChzZWxmLm5hbWUsIGNvdW50ZXIpKQorICAgICAgICAgICAgICAgIF9zbGVlcChyYW5kb20oKSAqIDAuMDAwMDEpCisKKworICAgIGNsYXNzIENvbnN1bWVyVGhyZWFkKFRocmVhZCk6CisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHF1ZXVlLCBjb3VudCk6CisgICAgICAgICAgICBUaHJlYWQuX19pbml0X18oc2VsZiwgbmFtZT0iQ29uc3VtZXIiKQorICAgICAgICAgICAgc2VsZi5xdWV1ZSA9IHF1ZXVlCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gY291bnQKKworICAgICAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAgICAgd2hpbGUgc2VsZi5jb3VudCA+IDA6CisgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYucXVldWUuZ2V0KCkKKyAgICAgICAgICAgICAgICBwcmludCBpdGVtCisgICAgICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgLSAxCisKKyAgICBOUCA9IDMKKyAgICBRTCA9IDQKKyAgICBOSSA9IDUKKworICAgIFEgPSBCb3VuZGVkUXVldWUoUUwpCisgICAgUCA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoTlApOgorICAgICAgICB0ID0gUHJvZHVjZXJUaHJlYWQoUSwgTkkpCisgICAgICAgIHQubmFtZSA9ICgiUHJvZHVjZXItJWQiICUgKGkrMSkpCisgICAgICAgIFAuYXBwZW5kKHQpCisgICAgQyA9IENvbnN1bWVyVGhyZWFkKFEsIE5JKk5QKQorICAgIGZvciB0IGluIFA6CisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICBfc2xlZXAoMC4wMDAwMDEpCisgICAgQy5zdGFydCgpCisgICAgZm9yIHQgaW4gUDoKKyAgICAgICAgdC5qb2luKCkKKyAgICBDLmpvaW4oKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIF90ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGhyZWFkaW5nLnB5YyBiL2xpYi9weXRob24yLjcvdGhyZWFkaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDQwYTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGhyZWFkaW5nLnB5byBiL2xpYi9weXRob24yLjcvdGhyZWFkaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjI0NWU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90aHJlYWRpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGltZWl0LnB5IGIvbGliL3B5dGhvbjIuNy90aW1laXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5ZTgxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdGltZWl0LnB5CkBAIC0wLDAgKzEsMzMwIEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyIiIlRvb2wgZm9yIG1lYXN1cmluZyBleGVjdXRpb24gdGltZSBvZiBzbWFsbCBjb2RlIHNuaXBwZXRzLgorCitUaGlzIG1vZHVsZSBhdm9pZHMgYSBudW1iZXIgb2YgY29tbW9uIHRyYXBzIGZvciBtZWFzdXJpbmcgZXhlY3V0aW9uCit0aW1lcy4gIFNlZSBhbHNvIFRpbSBQZXRlcnMnIGludHJvZHVjdGlvbiB0byB0aGUgQWxnb3JpdGhtcyBjaGFwdGVyIGluCit0aGUgUHl0aG9uIENvb2tib29rLCBwdWJsaXNoZWQgYnkgTydSZWlsbHkuCisKK0xpYnJhcnkgdXNhZ2U6IHNlZSB0aGUgVGltZXIgY2xhc3MuCisKK0NvbW1hbmQgbGluZSB1c2FnZToKKyAgICBweXRob24gdGltZWl0LnB5IFstbiBOXSBbLXIgTl0gWy1zIFNdIFstdF0gWy1jXSBbLWhdIFstLV0gW3N0YXRlbWVudF0KKworT3B0aW9uczoKKyAgLW4vLS1udW1iZXIgTjogaG93IG1hbnkgdGltZXMgdG8gZXhlY3V0ZSAnc3RhdGVtZW50JyAoZGVmYXVsdDogc2VlIGJlbG93KQorICAtci8tLXJlcGVhdCBOOiBob3cgbWFueSB0aW1lcyB0byByZXBlYXQgdGhlIHRpbWVyIChkZWZhdWx0IDMpCisgIC1zLy0tc2V0dXAgUzogc3RhdGVtZW50IHRvIGJlIGV4ZWN1dGVkIG9uY2UgaW5pdGlhbGx5IChkZWZhdWx0ICdwYXNzJykKKyAgLXQvLS10aW1lOiB1c2UgdGltZS50aW1lKCkgKGRlZmF1bHQgb24gVW5peCkKKyAgLWMvLS1jbG9jazogdXNlIHRpbWUuY2xvY2soKSAoZGVmYXVsdCBvbiBXaW5kb3dzKQorICAtdi8tLXZlcmJvc2U6IHByaW50IHJhdyB0aW1pbmcgcmVzdWx0czsgcmVwZWF0IGZvciBtb3JlIGRpZ2l0cyBwcmVjaXNpb24KKyAgLWgvLS1oZWxwOiBwcmludCB0aGlzIHVzYWdlIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLS06IHNlcGFyYXRlIG9wdGlvbnMgZnJvbSBzdGF0ZW1lbnQsIHVzZSB3aGVuIHN0YXRlbWVudCBzdGFydHMgd2l0aCAtCisgIHN0YXRlbWVudDogc3RhdGVtZW50IHRvIGJlIHRpbWVkIChkZWZhdWx0ICdwYXNzJykKKworQSBtdWx0aS1saW5lIHN0YXRlbWVudCBtYXkgYmUgZ2l2ZW4gYnkgc3BlY2lmeWluZyBlYWNoIGxpbmUgYXMgYQorc2VwYXJhdGUgYXJndW1lbnQ7IGluZGVudGVkIGxpbmVzIGFyZSBwb3NzaWJsZSBieSBlbmNsb3NpbmcgYW4KK2FyZ3VtZW50IGluIHF1b3RlcyBhbmQgdXNpbmcgbGVhZGluZyBzcGFjZXMuICBNdWx0aXBsZSAtcyBvcHRpb25zIGFyZQordHJlYXRlZCBzaW1pbGFybHkuCisKK0lmIC1uIGlzIG5vdCBnaXZlbiwgYSBzdWl0YWJsZSBudW1iZXIgb2YgbG9vcHMgaXMgY2FsY3VsYXRlZCBieSB0cnlpbmcKK3N1Y2Nlc3NpdmUgcG93ZXJzIG9mIDEwIHVudGlsIHRoZSB0b3RhbCB0aW1lIGlzIGF0IGxlYXN0IDAuMiBzZWNvbmRzLgorCitUaGUgZGlmZmVyZW5jZSBpbiBkZWZhdWx0IHRpbWVyIGZ1bmN0aW9uIGlzIGJlY2F1c2Ugb24gV2luZG93cywKK2Nsb2NrKCkgaGFzIG1pY3Jvc2Vjb25kIGdyYW51bGFyaXR5IGJ1dCB0aW1lKCkncyBncmFudWxhcml0eSBpcyAxLzYwdGgKK29mIGEgc2Vjb25kOyBvbiBVbml4LCBjbG9jaygpIGhhcyAxLzEwMHRoIG9mIGEgc2Vjb25kIGdyYW51bGFyaXR5IGFuZAordGltZSgpIGlzIG11Y2ggbW9yZSBwcmVjaXNlLiAgT24gZWl0aGVyIHBsYXRmb3JtLCB0aGUgZGVmYXVsdCB0aW1lcgorZnVuY3Rpb25zIG1lYXN1cmUgd2FsbCBjbG9jayB0aW1lLCBub3QgdGhlIENQVSB0aW1lLiAgVGhpcyBtZWFucyB0aGF0CitvdGhlciBwcm9jZXNzZXMgcnVubmluZyBvbiB0aGUgc2FtZSBjb21wdXRlciBtYXkgaW50ZXJmZXJlIHdpdGggdGhlCit0aW1pbmcuICBUaGUgYmVzdCB0aGluZyB0byBkbyB3aGVuIGFjY3VyYXRlIHRpbWluZyBpcyBuZWNlc3NhcnkgaXMgdG8KK3JlcGVhdCB0aGUgdGltaW5nIGEgZmV3IHRpbWVzIGFuZCB1c2UgdGhlIGJlc3QgdGltZS4gIFRoZSAtciBvcHRpb24gaXMKK2dvb2QgZm9yIHRoaXM7IHRoZSBkZWZhdWx0IG9mIDMgcmVwZXRpdGlvbnMgaXMgcHJvYmFibHkgZW5vdWdoIGluIG1vc3QKK2Nhc2VzLiAgT24gVW5peCwgeW91IGNhbiB1c2UgY2xvY2soKSB0byBtZWFzdXJlIENQVSB0aW1lLgorCitOb3RlOiB0aGVyZSBpcyBhIGNlcnRhaW4gYmFzZWxpbmUgb3ZlcmhlYWQgYXNzb2NpYXRlZCB3aXRoIGV4ZWN1dGluZyBhCitwYXNzIHN0YXRlbWVudC4gIFRoZSBjb2RlIGhlcmUgZG9lc24ndCB0cnkgdG8gaGlkZSBpdCwgYnV0IHlvdSBzaG91bGQKK2JlIGF3YXJlIG9mIGl0LiAgVGhlIGJhc2VsaW5lIG92ZXJoZWFkIGNhbiBiZSBtZWFzdXJlZCBieSBpbnZva2luZyB0aGUKK3Byb2dyYW0gd2l0aG91dCBhcmd1bWVudHMuCisKK1RoZSBiYXNlbGluZSBvdmVyaGVhZCBkaWZmZXJzIGJldHdlZW4gUHl0aG9uIHZlcnNpb25zISAgQWxzbywgdG8KK2ZhaXJseSBjb21wYXJlIG9sZGVyIFB5dGhvbiB2ZXJzaW9ucyB0byBQeXRob24gMi4zLCB5b3UgbWF5IHdhbnQgdG8KK3VzZSBweXRob24gLU8gZm9yIHRoZSBvbGRlciB2ZXJzaW9ucyB0byBhdm9pZCB0aW1pbmcgU0VUX0xJTkVOTworaW5zdHJ1Y3Rpb25zLgorIiIiCisKK2ltcG9ydCBnYworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKK3RyeToKKyAgICBpbXBvcnQgaXRlcnRvb2xzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBNdXN0IGJlIGFuIG9sZGVyIFB5dGhvbiB2ZXJzaW9uIChzZWUgdGltZWl0KCkgYmVsb3cpCisgICAgaXRlcnRvb2xzID0gTm9uZQorCitfX2FsbF9fID0gWyJUaW1lciJdCisKK2R1bW15X3NyY19uYW1lID0gIjx0aW1laXQtc3JjPiIKK2RlZmF1bHRfbnVtYmVyID0gMTAwMDAwMAorZGVmYXVsdF9yZXBlYXQgPSAzCisKK2lmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgorICAgICMgT24gV2luZG93cywgdGhlIGJlc3QgdGltZXIgaXMgdGltZS5jbG9jaygpCisgICAgZGVmYXVsdF90aW1lciA9IHRpbWUuY2xvY2sKK2Vsc2U6CisgICAgIyBPbiBtb3N0IG90aGVyIHBsYXRmb3JtcyB0aGUgYmVzdCB0aW1lciBpcyB0aW1lLnRpbWUoKQorICAgIGRlZmF1bHRfdGltZXIgPSB0aW1lLnRpbWUKKworIyBEb24ndCBjaGFuZ2UgdGhlIGluZGVudGF0aW9uIG9mIHRoZSB0ZW1wbGF0ZTsgdGhlIHJlaW5kZW50KCkgY2FsbHMKKyMgaW4gVGltZXIuX19pbml0X18oKSBkZXBlbmQgb24gc2V0dXAgYmVpbmcgaW5kZW50ZWQgNCBzcGFjZXMgYW5kIHN0bXQKKyMgYmVpbmcgaW5kZW50ZWQgOCBzcGFjZXMuCit0ZW1wbGF0ZSA9ICIiIgorZGVmIGlubmVyKF9pdCwgX3RpbWVyKToKKyAgICAlKHNldHVwKXMKKyAgICBfdDAgPSBfdGltZXIoKQorICAgIGZvciBfaSBpbiBfaXQ6CisgICAgICAgICUoc3RtdClzCisgICAgX3QxID0gX3RpbWVyKCkKKyAgICByZXR1cm4gX3QxIC0gX3QwCisiIiIKKworZGVmIHJlaW5kZW50KHNyYywgaW5kZW50KToKKyAgICAiIiJIZWxwZXIgdG8gcmVpbmRlbnQgYSBtdWx0aS1saW5lIHN0YXRlbWVudC4iIiIKKyAgICByZXR1cm4gc3JjLnJlcGxhY2UoIlxuIiwgIlxuIiArICIgIippbmRlbnQpCisKK2RlZiBfdGVtcGxhdGVfZnVuYyhzZXR1cCwgZnVuYyk6CisgICAgIiIiQ3JlYXRlIGEgdGltZXIgZnVuY3Rpb24uIFVzZWQgaWYgdGhlICJzdGF0ZW1lbnQiIGlzIGEgY2FsbGFibGUuIiIiCisgICAgZGVmIGlubmVyKF9pdCwgX3RpbWVyLCBfZnVuYz1mdW5jKToKKyAgICAgICAgc2V0dXAoKQorICAgICAgICBfdDAgPSBfdGltZXIoKQorICAgICAgICBmb3IgX2kgaW4gX2l0OgorICAgICAgICAgICAgX2Z1bmMoKQorICAgICAgICBfdDEgPSBfdGltZXIoKQorICAgICAgICByZXR1cm4gX3QxIC0gX3QwCisgICAgcmV0dXJuIGlubmVyCisKK2NsYXNzIFRpbWVyOgorICAgICIiIkNsYXNzIGZvciB0aW1pbmcgZXhlY3V0aW9uIHNwZWVkIG9mIHNtYWxsIGNvZGUgc25pcHBldHMuCisKKyAgICBUaGUgY29uc3RydWN0b3IgdGFrZXMgYSBzdGF0ZW1lbnQgdG8gYmUgdGltZWQsIGFuIGFkZGl0aW9uYWwKKyAgICBzdGF0ZW1lbnQgdXNlZCBmb3Igc2V0dXAsIGFuZCBhIHRpbWVyIGZ1bmN0aW9uLiAgQm90aCBzdGF0ZW1lbnRzCisgICAgZGVmYXVsdCB0byAncGFzcyc7IHRoZSB0aW1lciBmdW5jdGlvbiBpcyBwbGF0Zm9ybS1kZXBlbmRlbnQgKHNlZQorICAgIG1vZHVsZSBkb2Mgc3RyaW5nKS4KKworICAgIFRvIG1lYXN1cmUgdGhlIGV4ZWN1dGlvbiB0aW1lIG9mIHRoZSBmaXJzdCBzdGF0ZW1lbnQsIHVzZSB0aGUKKyAgICB0aW1laXQoKSBtZXRob2QuICBUaGUgcmVwZWF0KCkgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgdG8gY2FsbAorICAgIHRpbWVpdCgpIG11bHRpcGxlIHRpbWVzIGFuZCByZXR1cm4gYSBsaXN0IG9mIHJlc3VsdHMuCisKKyAgICBUaGUgc3RhdGVtZW50cyBtYXkgY29udGFpbiBuZXdsaW5lcywgYXMgbG9uZyBhcyB0aGV5IGRvbid0IGNvbnRhaW4KKyAgICBtdWx0aS1saW5lIHN0cmluZyBsaXRlcmFscy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdG10PSJwYXNzIiwgc2V0dXA9InBhc3MiLCB0aW1lcj1kZWZhdWx0X3RpbWVyKToKKyAgICAgICAgIiIiQ29uc3RydWN0b3IuICBTZWUgY2xhc3MgZG9jIHN0cmluZy4iIiIKKyAgICAgICAgc2VsZi50aW1lciA9IHRpbWVyCisgICAgICAgIG5zID0ge30KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzdG10LCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHN0bXQgPSByZWluZGVudChzdG10LCA4KQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzZXR1cCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgc2V0dXAgPSByZWluZGVudChzZXR1cCwgNCkKKyAgICAgICAgICAgICAgICBzcmMgPSB0ZW1wbGF0ZSAlIHsnc3RtdCc6IHN0bXQsICdzZXR1cCc6IHNldHVwfQorICAgICAgICAgICAgZWxpZiBoYXNhdHRyKHNldHVwLCAnX19jYWxsX18nKToKKyAgICAgICAgICAgICAgICBzcmMgPSB0ZW1wbGF0ZSAlIHsnc3RtdCc6IHN0bXQsICdzZXR1cCc6ICdfc2V0dXAoKSd9CisgICAgICAgICAgICAgICAgbnNbJ19zZXR1cCddID0gc2V0dXAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigic2V0dXAgaXMgbmVpdGhlciBhIHN0cmluZyBub3IgY2FsbGFibGUiKQorICAgICAgICAgICAgc2VsZi5zcmMgPSBzcmMgIyBTYXZlIGZvciB0cmFjZWJhY2sgZGlzcGxheQorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoc3JjLCBkdW1teV9zcmNfbmFtZSwgImV4ZWMiKQorICAgICAgICAgICAgZXhlYyBjb2RlIGluIGdsb2JhbHMoKSwgbnMKKyAgICAgICAgICAgIHNlbGYuaW5uZXIgPSBuc1siaW5uZXIiXQorICAgICAgICBlbGlmIGhhc2F0dHIoc3RtdCwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICBzZWxmLnNyYyA9IE5vbmUKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2V0dXAsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIF9zZXR1cCA9IHNldHVwCisgICAgICAgICAgICAgICAgZGVmIHNldHVwKCk6CisgICAgICAgICAgICAgICAgICAgIGV4ZWMgX3NldHVwIGluIGdsb2JhbHMoKSwgbnMKKyAgICAgICAgICAgIGVsaWYgbm90IGhhc2F0dHIoc2V0dXAsICdfX2NhbGxfXycpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInNldHVwIGlzIG5laXRoZXIgYSBzdHJpbmcgbm9yIGNhbGxhYmxlIikKKyAgICAgICAgICAgIHNlbGYuaW5uZXIgPSBfdGVtcGxhdGVfZnVuYyhzZXR1cCwgc3RtdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInN0bXQgaXMgbmVpdGhlciBhIHN0cmluZyBub3IgY2FsbGFibGUiKQorCisgICAgZGVmIHByaW50X2V4YyhzZWxmLCBmaWxlPU5vbmUpOgorICAgICAgICAiIiJIZWxwZXIgdG8gcHJpbnQgYSB0cmFjZWJhY2sgZnJvbSB0aGUgdGltZWQgY29kZS4KKworICAgICAgICBUeXBpY2FsIHVzZToKKworICAgICAgICAgICAgdCA9IFRpbWVyKC4uLikgICAgICAgIyBvdXRzaWRlIHRoZSB0cnkvZXhjZXB0CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdC50aW1laXQoLi4uKSAgICAjIG9yIHQucmVwZWF0KC4uLikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICB0LnByaW50X2V4YygpCisKKyAgICAgICAgVGhlIGFkdmFudGFnZSBvdmVyIHRoZSBzdGFuZGFyZCB0cmFjZWJhY2sgaXMgdGhhdCBzb3VyY2UgbGluZXMKKyAgICAgICAgaW4gdGhlIGNvbXBpbGVkIHRlbXBsYXRlIHdpbGwgYmUgZGlzcGxheWVkLgorCisgICAgICAgIFRoZSBvcHRpb25hbCBmaWxlIGFyZ3VtZW50IGRpcmVjdHMgd2hlcmUgdGhlIHRyYWNlYmFjayBpcworICAgICAgICBzZW50OyBpdCBkZWZhdWx0cyB0byBzeXMuc3RkZXJyLgorICAgICAgICAiIiIKKyAgICAgICAgaW1wb3J0IGxpbmVjYWNoZSwgdHJhY2ViYWNrCisgICAgICAgIGlmIHNlbGYuc3JjIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZWNhY2hlLmNhY2hlW2R1bW15X3NyY19uYW1lXSA9IChsZW4oc2VsZi5zcmMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNyYy5zcGxpdCgiXG4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXlfc3JjX25hbWUpCisgICAgICAgICMgZWxzZSB0aGUgc291cmNlIGlzIGFscmVhZHkgc3RvcmVkIHNvbWV3aGVyZSBlbHNlCisKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YyhmaWxlPWZpbGUpCisKKyAgICBkZWYgdGltZWl0KHNlbGYsIG51bWJlcj1kZWZhdWx0X251bWJlcik6CisgICAgICAgICIiIlRpbWUgJ251bWJlcicgZXhlY3V0aW9ucyBvZiB0aGUgbWFpbiBzdGF0ZW1lbnQuCisKKyAgICAgICAgVG8gYmUgcHJlY2lzZSwgdGhpcyBleGVjdXRlcyB0aGUgc2V0dXAgc3RhdGVtZW50IG9uY2UsIGFuZAorICAgICAgICB0aGVuIHJldHVybnMgdGhlIHRpbWUgaXQgdGFrZXMgdG8gZXhlY3V0ZSB0aGUgbWFpbiBzdGF0ZW1lbnQKKyAgICAgICAgYSBudW1iZXIgb2YgdGltZXMsIGFzIGEgZmxvYXQgbWVhc3VyZWQgaW4gc2Vjb25kcy4gIFRoZQorICAgICAgICBhcmd1bWVudCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRocm91Z2ggdGhlIGxvb3AsIGRlZmF1bHRpbmcKKyAgICAgICAgdG8gb25lIG1pbGxpb24uICBUaGUgbWFpbiBzdGF0ZW1lbnQsIHRoZSBzZXR1cCBzdGF0ZW1lbnQgYW5kCisgICAgICAgIHRoZSB0aW1lciBmdW5jdGlvbiB0byBiZSB1c2VkIGFyZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgaXRlcnRvb2xzOgorICAgICAgICAgICAgaXQgPSBpdGVydG9vbHMucmVwZWF0KE5vbmUsIG51bWJlcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGl0ID0gW05vbmVdICogbnVtYmVyCisgICAgICAgIGdjb2xkID0gZ2MuaXNlbmFibGVkKCkKKyAgICAgICAgZ2MuZGlzYWJsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRpbWluZyA9IHNlbGYuaW5uZXIoaXQsIHNlbGYudGltZXIpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBnY29sZDoKKyAgICAgICAgICAgICAgICBnYy5lbmFibGUoKQorICAgICAgICByZXR1cm4gdGltaW5nCisKKyAgICBkZWYgcmVwZWF0KHNlbGYsIHJlcGVhdD1kZWZhdWx0X3JlcGVhdCwgbnVtYmVyPWRlZmF1bHRfbnVtYmVyKToKKyAgICAgICAgIiIiQ2FsbCB0aW1laXQoKSBhIGZldyB0aW1lcy4KKworICAgICAgICBUaGlzIGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgdGltZWl0KCkKKyAgICAgICAgcmVwZWF0ZWRseSwgcmV0dXJuaW5nIGEgbGlzdCBvZiByZXN1bHRzLiAgVGhlIGZpcnN0IGFyZ3VtZW50CisgICAgICAgIHNwZWNpZmllcyBob3cgbWFueSB0aW1lcyB0byBjYWxsIHRpbWVpdCgpLCBkZWZhdWx0aW5nIHRvIDM7CisgICAgICAgIHRoZSBzZWNvbmQgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSB0aW1lciBhcmd1bWVudCwgZGVmYXVsdGluZworICAgICAgICB0byBvbmUgbWlsbGlvbi4KKworICAgICAgICBOb3RlOiBpdCdzIHRlbXB0aW5nIHRvIGNhbGN1bGF0ZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24KKyAgICAgICAgZnJvbSB0aGUgcmVzdWx0IHZlY3RvciBhbmQgcmVwb3J0IHRoZXNlLiAgSG93ZXZlciwgdGhpcyBpcyBub3QKKyAgICAgICAgdmVyeSB1c2VmdWwuICBJbiBhIHR5cGljYWwgY2FzZSwgdGhlIGxvd2VzdCB2YWx1ZSBnaXZlcyBhCisgICAgICAgIGxvd2VyIGJvdW5kIGZvciBob3cgZmFzdCB5b3VyIG1hY2hpbmUgY2FuIHJ1biB0aGUgZ2l2ZW4gY29kZQorICAgICAgICBzbmlwcGV0OyBoaWdoZXIgdmFsdWVzIGluIHRoZSByZXN1bHQgdmVjdG9yIGFyZSB0eXBpY2FsbHkgbm90CisgICAgICAgIGNhdXNlZCBieSB2YXJpYWJpbGl0eSBpbiBQeXRob24ncyBzcGVlZCwgYnV0IGJ5IG90aGVyCisgICAgICAgIHByb2Nlc3NlcyBpbnRlcmZlcmluZyB3aXRoIHlvdXIgdGltaW5nIGFjY3VyYWN5LiAgU28gdGhlIG1pbigpCisgICAgICAgIG9mIHRoZSByZXN1bHQgaXMgcHJvYmFibHkgdGhlIG9ubHkgbnVtYmVyIHlvdSBzaG91bGQgYmUKKyAgICAgICAgaW50ZXJlc3RlZCBpbi4gIEFmdGVyIHRoYXQsIHlvdSBzaG91bGQgbG9vayBhdCB0aGUgZW50aXJlCisgICAgICAgIHZlY3RvciBhbmQgYXBwbHkgY29tbW9uIHNlbnNlIHJhdGhlciB0aGFuIHN0YXRpc3RpY3MuCisgICAgICAgICIiIgorICAgICAgICByID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UocmVwZWF0KToKKyAgICAgICAgICAgIHQgPSBzZWxmLnRpbWVpdChudW1iZXIpCisgICAgICAgICAgICByLmFwcGVuZCh0KQorICAgICAgICByZXR1cm4gcgorCitkZWYgdGltZWl0KHN0bXQ9InBhc3MiLCBzZXR1cD0icGFzcyIsIHRpbWVyPWRlZmF1bHRfdGltZXIsCisgICAgICAgICAgIG51bWJlcj1kZWZhdWx0X251bWJlcik6CisgICAgIiIiQ29udmVuaWVuY2UgZnVuY3Rpb24gdG8gY3JlYXRlIFRpbWVyIG9iamVjdCBhbmQgY2FsbCB0aW1laXQgbWV0aG9kLiIiIgorICAgIHJldHVybiBUaW1lcihzdG10LCBzZXR1cCwgdGltZXIpLnRpbWVpdChudW1iZXIpCisKK2RlZiByZXBlYXQoc3RtdD0icGFzcyIsIHNldHVwPSJwYXNzIiwgdGltZXI9ZGVmYXVsdF90aW1lciwKKyAgICAgICAgICAgcmVwZWF0PWRlZmF1bHRfcmVwZWF0LCBudW1iZXI9ZGVmYXVsdF9udW1iZXIpOgorICAgICIiIkNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBUaW1lciBvYmplY3QgYW5kIGNhbGwgcmVwZWF0IG1ldGhvZC4iIiIKKyAgICByZXR1cm4gVGltZXIoc3RtdCwgc2V0dXAsIHRpbWVyKS5yZXBlYXQocmVwZWF0LCBudW1iZXIpCisKK2RlZiBtYWluKGFyZ3M9Tm9uZSk6CisgICAgIiIiTWFpbiBwcm9ncmFtLCB1c2VkIHdoZW4gcnVuIGFzIGEgc2NyaXB0LgorCisgICAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50IHNwZWNpZmllcyB0aGUgY29tbWFuZCBsaW5lIHRvIGJlIHBhcnNlZCwKKyAgICBkZWZhdWx0aW5nIHRvIHN5cy5hcmd2WzE6XS4KKworICAgIFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gZXhpdCBjb2RlIHRvIGJlIHBhc3NlZCB0byBzeXMuZXhpdCgpOyBpdAorICAgIG1heSBiZSBOb25lIHRvIGluZGljYXRlIHN1Y2Nlc3MuCisKKyAgICBXaGVuIGFuIGV4Y2VwdGlvbiBoYXBwZW5zIGR1cmluZyB0aW1pbmcsIGEgdHJhY2ViYWNrIGlzIHByaW50ZWQgdG8KKyAgICBzdGRlcnIgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgMS4gIEV4Y2VwdGlvbnMgYXQgb3RoZXIgdGltZXMKKyAgICAoaW5jbHVkaW5nIHRoZSB0ZW1wbGF0ZSBjb21waWxhdGlvbikgYXJlIG5vdCBjYXVnaHQuCisgICAgIiIiCisgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisgICAgaW1wb3J0IGdldG9wdAorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJncywgIm46czpyOnRjdmgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIm51bWJlcj0iLCAic2V0dXA9IiwgInJlcGVhdD0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWUiLCAiY2xvY2siLCAidmVyYm9zZSIsICJoZWxwIl0pCisgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgZXJyOgorICAgICAgICBwcmludCBlcnIKKyAgICAgICAgcHJpbnQgInVzZSAtaC8tLWhlbHAgZm9yIGNvbW1hbmQgbGluZSBoZWxwIgorICAgICAgICByZXR1cm4gMgorICAgIHRpbWVyID0gZGVmYXVsdF90aW1lcgorICAgIHN0bXQgPSAiXG4iLmpvaW4oYXJncykgb3IgInBhc3MiCisgICAgbnVtYmVyID0gMCAjIGF1dG8tZGV0ZXJtaW5lCisgICAgc2V0dXAgPSBbXQorICAgIHJlcGVhdCA9IGRlZmF1bHRfcmVwZWF0CisgICAgdmVyYm9zZSA9IDAKKyAgICBwcmVjaXNpb24gPSAzCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyBpbiAoIi1uIiwgIi0tbnVtYmVyIik6CisgICAgICAgICAgICBudW1iZXIgPSBpbnQoYSkKKyAgICAgICAgaWYgbyBpbiAoIi1zIiwgIi0tc2V0dXAiKToKKyAgICAgICAgICAgIHNldHVwLmFwcGVuZChhKQorICAgICAgICBpZiBvIGluICgiLXIiLCAiLS1yZXBlYXQiKToKKyAgICAgICAgICAgIHJlcGVhdCA9IGludChhKQorICAgICAgICAgICAgaWYgcmVwZWF0IDw9IDA6CisgICAgICAgICAgICAgICAgcmVwZWF0ID0gMQorICAgICAgICBpZiBvIGluICgiLXQiLCAiLS10aW1lIik6CisgICAgICAgICAgICB0aW1lciA9IHRpbWUudGltZQorICAgICAgICBpZiBvIGluICgiLWMiLCAiLS1jbG9jayIpOgorICAgICAgICAgICAgdGltZXIgPSB0aW1lLmNsb2NrCisgICAgICAgIGlmIG8gaW4gKCItdiIsICItLXZlcmJvc2UiKToKKyAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJlY2lzaW9uICs9IDEKKyAgICAgICAgICAgIHZlcmJvc2UgKz0gMQorICAgICAgICBpZiBvIGluICgiLWgiLCAiLS1oZWxwIik6CisgICAgICAgICAgICBwcmludCBfX2RvY19fLAorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICBzZXR1cCA9ICJcbiIuam9pbihzZXR1cCkgb3IgInBhc3MiCisgICAgIyBJbmNsdWRlIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgc28gdGhhdCBsb2NhbCBpbXBvcnRzIHdvcmsgKHN5cy5wYXRoCisgICAgIyBjb250YWlucyB0aGUgZGlyZWN0b3J5IG9mIHRoaXMgc2NyaXB0LCByYXRoZXIgdGhhbiB0aGUgY3VycmVudAorICAgICMgZGlyZWN0b3J5KQorICAgIGltcG9ydCBvcworICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCisgICAgdCA9IFRpbWVyKHN0bXQsIHNldHVwLCB0aW1lcikKKyAgICBpZiBudW1iZXIgPT0gMDoKKyAgICAgICAgIyBkZXRlcm1pbmUgbnVtYmVyIHNvIHRoYXQgMC4yIDw9IHRvdGFsIHRpbWUgPCAyLjAKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMTApOgorICAgICAgICAgICAgbnVtYmVyID0gMTAqKmkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB4ID0gdC50aW1laXQobnVtYmVyKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHQucHJpbnRfZXhjKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiJWQgbG9vcHMgLT4gJS4qZyBzZWNzIiAlIChudW1iZXIsIHByZWNpc2lvbiwgeCkKKyAgICAgICAgICAgIGlmIHggPj0gMC4yOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgdHJ5OgorICAgICAgICByID0gdC5yZXBlYXQocmVwZWF0LCBudW1iZXIpCisgICAgZXhjZXB0OgorICAgICAgICB0LnByaW50X2V4YygpCisgICAgICAgIHJldHVybiAxCisgICAgYmVzdCA9IG1pbihyKQorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICJyYXcgdGltZXM6IiwgIiAiLmpvaW4oWyIlLipnIiAlIChwcmVjaXNpb24sIHgpIGZvciB4IGluIHJdKQorICAgIHByaW50ICIlZCBsb29wcywiICUgbnVtYmVyLAorICAgIHVzZWMgPSBiZXN0ICogMWU2IC8gbnVtYmVyCisgICAgaWYgdXNlYyA8IDEwMDA6CisgICAgICAgIHByaW50ICJiZXN0IG9mICVkOiAlLipnIHVzZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLCB1c2VjKQorICAgIGVsc2U6CisgICAgICAgIG1zZWMgPSB1c2VjIC8gMTAwMAorICAgICAgICBpZiBtc2VjIDwgMTAwMDoKKyAgICAgICAgICAgIHByaW50ICJiZXN0IG9mICVkOiAlLipnIG1zZWMgcGVyIGxvb3AiICUgKHJlcGVhdCwgcHJlY2lzaW9uLCBtc2VjKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VjID0gbXNlYyAvIDEwMDAKKyAgICAgICAgICAgIHByaW50ICJiZXN0IG9mICVkOiAlLipnIHNlYyBwZXIgbG9vcCIgJSAocmVwZWF0LCBwcmVjaXNpb24sIHNlYykKKyAgICByZXR1cm4gTm9uZQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGltZWl0LnB5YyBiL2xpYi9weXRob24yLjcvdGltZWl0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmM4NTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90aW1laXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdGltZWl0LnB5byBiL2xpYi9weXRob24yLjcvdGltZWl0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmM4NTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90aW1laXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9haWZmLnB5IGIvbGliL3B5dGhvbjIuNy90b2FpZmYucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyYjgwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9haWZmLnB5CkBAIC0wLDAgKzEsMTEwIEBACisiIiJDb252ZXJ0ICJhcmJpdHJhcnkiIHNvdW5kIGZpbGVzIHRvIEFJRkYgKEFwcGxlIGFuZCBTR0kncyBhdWRpbyBmb3JtYXQpLgorCitJbnB1dCBtYXkgYmUgY29tcHJlc3NlZC4KK1VuY29tcHJlc3NlZCBmaWxlIHR5cGUgbWF5IGJlIEFJRkYsIFdBViwgVk9DLCA4U1ZYLCBOZVhUL1N1biwgYW5kIG90aGVycy4KK0FuIGV4Y2VwdGlvbiBpcyByYWlzZWQgaWYgdGhlIGZpbGUgaXMgbm90IG9mIGEgcmVjb2duaXplZCB0eXBlLgorUmV0dXJuZWQgZmlsZW5hbWUgaXMgZWl0aGVyIHRoZSBpbnB1dCBmaWxlbmFtZSBvciBhIHRlbXBvcmFyeSBmaWxlbmFtZTsKK2luIHRoZSBsYXR0ZXIgY2FzZSB0aGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgaXQgaXMgcmVtb3ZlZC4KK090aGVyIHRlbXBvcmFyeSBmaWxlcyB1c2VkIGFyZSByZW1vdmVkIGJ5IHRoZSBmdW5jdGlvbi4KKyIiIgorZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKK3dhcm5weTNrKCJ0aGUgdG9haWZmIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworaW1wb3J0IG9zCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBwaXBlcworaW1wb3J0IHNuZGhkcgorCitfX2FsbF9fID0gWyJlcnJvciIsICJ0b2FpZmYiXQorCit0YWJsZSA9IHt9CisKK3QgPSBwaXBlcy5UZW1wbGF0ZSgpCit0LmFwcGVuZCgnc294IC10IGF1IC0gLXQgYWlmZiAtciA4MDAwIC0nLCAnLS0nKQordGFibGVbJ2F1J10gPSB0CisKKyMgWFhYIFRoZSBmb2xsb3dpbmcgaXMgYWN0dWFsbHkgc3ViLW9wdGltYWwuCisjIFhYWCBUaGUgSENPTSBzYW1wbGluZyByYXRlIGNhbiBiZSAyMmssIDIyay8yLCAyMmsvMyBvciAyMmsvNC4KKyMgWFhYIFdlIG11c3QgZm9yY2UgdGhlIG91dHB1dCBzYW1wbGluZyByYXRlIGVsc2UgdGhlIFNHSSB3b24ndCBwbGF5CisjIFhYWCBmaWxlcyBzYW1wbGVkIGF0IDUuNWsgb3IgNy4zMzNrOyBob3dldmVyIHRoaXMgbWVhbnMgdGhhdCBmaWxlcworIyBYWFggc2FtcGxlZCBhdCAxMWsgYXJlIHVubmVjZXNzYXJpbHkgZXhwYW5kZWQuCisjIFhYWCBTaW1pbGFyIGNvbW1lbnRzIGFwcGx5IHRvIHNvbWUgb3RoZXIgZmlsZSB0eXBlcy4KK3QgPSBwaXBlcy5UZW1wbGF0ZSgpCit0LmFwcGVuZCgnc294IC10IGhjb20gLSAtdCBhaWZmIC1yIDIyMDUwIC0nLCAnLS0nKQordGFibGVbJ2hjb20nXSA9IHQKKwordCA9IHBpcGVzLlRlbXBsYXRlKCkKK3QuYXBwZW5kKCdzb3ggLXQgdm9jIC0gLXQgYWlmZiAtciAxMTAyNSAtJywgJy0tJykKK3RhYmxlWyd2b2MnXSA9IHQKKwordCA9IHBpcGVzLlRlbXBsYXRlKCkKK3QuYXBwZW5kKCdzb3ggLXQgd2F2IC0gLXQgYWlmZiAtJywgJy0tJykKK3RhYmxlWyd3YXYnXSA9IHQKKwordCA9IHBpcGVzLlRlbXBsYXRlKCkKK3QuYXBwZW5kKCdzb3ggLXQgOHN2eCAtIC10IGFpZmYgLXIgMTYwMDAgLScsICctLScpCit0YWJsZVsnOHN2eCddID0gdAorCit0ID0gcGlwZXMuVGVtcGxhdGUoKQordC5hcHBlbmQoJ3NveCAtdCBzbmR0IC0gLXQgYWlmZiAtciAxNjAwMCAtJywgJy0tJykKK3RhYmxlWydzbmR0J10gPSB0CisKK3QgPSBwaXBlcy5UZW1wbGF0ZSgpCit0LmFwcGVuZCgnc294IC10IHNuZHIgLSAtdCBhaWZmIC1yIDE2MDAwIC0nLCAnLS0nKQordGFibGVbJ3NuZHInXSA9IHQKKwordW5jb21wcmVzcyA9IHBpcGVzLlRlbXBsYXRlKCkKK3VuY29tcHJlc3MuYXBwZW5kKCd1bmNvbXByZXNzJywgJy0tJykKKworCitjbGFzcyBlcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworZGVmIHRvYWlmZihmaWxlbmFtZSk6CisgICAgdGVtcHMgPSBbXQorICAgIHJldCA9IE5vbmUKKyAgICB0cnk6CisgICAgICAgIHJldCA9IF90b2FpZmYoZmlsZW5hbWUsIHRlbXBzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGZvciB0ZW1wIGluIHRlbXBzWzpdOgorICAgICAgICAgICAgaWYgdGVtcCAhPSByZXQ6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsodGVtcCkKKyAgICAgICAgICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICB0ZW1wcy5yZW1vdmUodGVtcCkKKyAgICByZXR1cm4gcmV0CisKK2RlZiBfdG9haWZmKGZpbGVuYW1lLCB0ZW1wcyk6CisgICAgaWYgZmlsZW5hbWVbLTI6XSA9PSAnLlonOgorICAgICAgICAoZmQsIGZuYW1lKSA9IHRlbXBmaWxlLm1rc3RlbXAoKQorICAgICAgICBvcy5jbG9zZShmZCkKKyAgICAgICAgdGVtcHMuYXBwZW5kKGZuYW1lKQorICAgICAgICBzdHMgPSB1bmNvbXByZXNzLmNvcHkoZmlsZW5hbWUsIGZuYW1lKQorICAgICAgICBpZiBzdHM6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgZmlsZW5hbWUgKyAnOiB1bmNvbXByZXNzIGZhaWxlZCcKKyAgICBlbHNlOgorICAgICAgICBmbmFtZSA9IGZpbGVuYW1lCisgICAgdHJ5OgorICAgICAgICBmdHlwZSA9IHNuZGhkci53aGF0aGRyKGZuYW1lKQorICAgICAgICBpZiBmdHlwZToKKyAgICAgICAgICAgIGZ0eXBlID0gZnR5cGVbMF0gIyBBbGwgd2UncmUgaW50ZXJlc3RlZCBpbgorICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgIGlmIHR5cGUobXNnKSA9PSB0eXBlKCgpKSBhbmQgbGVuKG1zZykgPT0gMiBhbmQgXAorICAgICAgICAgICAgICAgIHR5cGUobXNnWzBdKSA9PSB0eXBlKDApIGFuZCB0eXBlKG1zZ1sxXSkgPT0gdHlwZSgnJyk6CisgICAgICAgICAgICBtc2cgPSBtc2dbMV0KKyAgICAgICAgaWYgdHlwZShtc2cpICE9IHR5cGUoJycpOgorICAgICAgICAgICAgbXNnID0gcmVwcihtc2cpCisgICAgICAgIHJhaXNlIGVycm9yLCBmaWxlbmFtZSArICc6ICcgKyBtc2cKKyAgICBpZiBmdHlwZSA9PSAnYWlmZic6CisgICAgICAgIHJldHVybiBmbmFtZQorICAgIGlmIGZ0eXBlIGlzIE5vbmUgb3Igbm90IGZ0eXBlIGluIHRhYmxlOgorICAgICAgICByYWlzZSBlcnJvciwgJyVzOiB1bnN1cHBvcnRlZCBhdWRpbyBmaWxlIHR5cGUgJXInICUgKGZpbGVuYW1lLCBmdHlwZSkKKyAgICAoZmQsIHRlbXApID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgb3MuY2xvc2UoZmQpCisgICAgdGVtcHMuYXBwZW5kKHRlbXApCisgICAgc3RzID0gdGFibGVbZnR5cGVdLmNvcHkoZm5hbWUsIHRlbXApCisgICAgaWYgc3RzOgorICAgICAgICByYWlzZSBlcnJvciwgZmlsZW5hbWUgKyAnOiBjb252ZXJzaW9uIHRvIGFpZmYgZmFpbGVkJworICAgIHJldHVybiB0ZW1wCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RvYWlmZi5weWMgYi9saWIvcHl0aG9uMi43L3RvYWlmZi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxZGI4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9haWZmLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RvYWlmZi5weW8gYi9saWIvcHl0aG9uMi43L3RvYWlmZi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQxZGI4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9haWZmLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rva2VuLnB5IGIvbGliL3B5dGhvbjIuNy90b2tlbi5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNGFiZjYyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90b2tlbi5weQpAQCAtMCwwICsxLDE0MiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiJUb2tlbiBjb25zdGFudHMgKGZyb20gInRva2VuLmgiKS4iIiIKKworIyAgVGhpcyBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkOyBwbGVhc2UgZG9uJ3QgbXVjayBpdCB1cCEKKyMKKyMgIFRvIHVwZGF0ZSB0aGUgc3ltYm9scyBpbiB0aGlzIGZpbGUsICdjZCcgdG8gdGhlIHRvcCBkaXJlY3Rvcnkgb2YKKyMgIHRoZSBweXRob24gc291cmNlIHRyZWUgYWZ0ZXIgYnVpbGRpbmcgdGhlIGludGVycHJldGVyIGFuZCBydW46CisjCisjICAgIC4vcHl0aG9uIExpYi90b2tlbi5weQorCisjLS1zdGFydCBjb25zdGFudHMtLQorRU5ETUFSS0VSID0gMAorTkFNRSA9IDEKK05VTUJFUiA9IDIKK1NUUklORyA9IDMKK05FV0xJTkUgPSA0CitJTkRFTlQgPSA1CitERURFTlQgPSA2CitMUEFSID0gNworUlBBUiA9IDgKK0xTUUIgPSA5CitSU1FCID0gMTAKK0NPTE9OID0gMTEKK0NPTU1BID0gMTIKK1NFTUkgPSAxMworUExVUyA9IDE0CitNSU5VUyA9IDE1CitTVEFSID0gMTYKK1NMQVNIID0gMTcKK1ZCQVIgPSAxOAorQU1QRVIgPSAxOQorTEVTUyA9IDIwCitHUkVBVEVSID0gMjEKK0VRVUFMID0gMjIKK0RPVCA9IDIzCitQRVJDRU5UID0gMjQKK0JBQ0tRVU9URSA9IDI1CitMQlJBQ0UgPSAyNgorUkJSQUNFID0gMjcKK0VRRVFVQUwgPSAyOAorTk9URVFVQUwgPSAyOQorTEVTU0VRVUFMID0gMzAKK0dSRUFURVJFUVVBTCA9IDMxCitUSUxERSA9IDMyCitDSVJDVU1GTEVYID0gMzMKK0xFRlRTSElGVCA9IDM0CitSSUdIVFNISUZUID0gMzUKK0RPVUJMRVNUQVIgPSAzNgorUExVU0VRVUFMID0gMzcKK01JTkVRVUFMID0gMzgKK1NUQVJFUVVBTCA9IDM5CitTTEFTSEVRVUFMID0gNDAKK1BFUkNFTlRFUVVBTCA9IDQxCitBTVBFUkVRVUFMID0gNDIKK1ZCQVJFUVVBTCA9IDQzCitDSVJDVU1GTEVYRVFVQUwgPSA0NAorTEVGVFNISUZURVFVQUwgPSA0NQorUklHSFRTSElGVEVRVUFMID0gNDYKK0RPVUJMRVNUQVJFUVVBTCA9IDQ3CitET1VCTEVTTEFTSCA9IDQ4CitET1VCTEVTTEFTSEVRVUFMID0gNDkKK0FUID0gNTAKK09QID0gNTEKK0VSUk9SVE9LRU4gPSA1MgorTl9UT0tFTlMgPSA1MworTlRfT0ZGU0VUID0gMjU2CisjLS1lbmQgY29uc3RhbnRzLS0KKwordG9rX25hbWUgPSB7fQorZm9yIF9uYW1lLCBfdmFsdWUgaW4gZ2xvYmFscygpLml0ZW1zKCk6CisgICAgaWYgdHlwZShfdmFsdWUpIGlzIHR5cGUoMCk6CisgICAgICAgIHRva19uYW1lW192YWx1ZV0gPSBfbmFtZQorZGVsIF9uYW1lLCBfdmFsdWUKKworCitkZWYgSVNURVJNSU5BTCh4KToKKyAgICByZXR1cm4geCA8IE5UX09GRlNFVAorCitkZWYgSVNOT05URVJNSU5BTCh4KToKKyAgICByZXR1cm4geCA+PSBOVF9PRkZTRVQKKworZGVmIElTRU9GKHgpOgorICAgIHJldHVybiB4ID09IEVORE1BUktFUgorCisKK2RlZiBtYWluKCk6CisgICAgaW1wb3J0IHJlCisgICAgaW1wb3J0IHN5cworICAgIGFyZ3MgPSBzeXMuYXJndlsxOl0KKyAgICBpbkZpbGVOYW1lID0gYXJncyBhbmQgYXJnc1swXSBvciAiSW5jbHVkZS90b2tlbi5oIgorICAgIG91dEZpbGVOYW1lID0gIkxpYi90b2tlbi5weSIKKyAgICBpZiBsZW4oYXJncykgPiAxOgorICAgICAgICBvdXRGaWxlTmFtZSA9IGFyZ3NbMV0KKyAgICB0cnk6CisgICAgICAgIGZwID0gb3BlbihpbkZpbGVOYW1lKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBlcnI6CisgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoIkkvTyBlcnJvcjogJXNcbiIgJSBzdHIoZXJyKSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBsaW5lcyA9IGZwLnJlYWQoKS5zcGxpdCgiXG4iKQorICAgIGZwLmNsb3NlKCkKKyAgICBwcm9nID0gcmUuY29tcGlsZSgKKyAgICAgICAgIiNkZWZpbmVbIFx0XVsgXHRdKihbQS1aMC05XVtBLVowLTlfXSopWyBcdF1bIFx0XSooWzAtOV1bMC05XSopIiwKKyAgICAgICAgcmUuSUdOT1JFQ0FTRSkKKyAgICB0b2tlbnMgPSB7fQorICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBtYXRjaCA9IHByb2cubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBuYW1lLCB2YWwgPSBtYXRjaC5ncm91cCgxLCAyKQorICAgICAgICAgICAgdmFsID0gaW50KHZhbCkKKyAgICAgICAgICAgIHRva2Vuc1t2YWxdID0gbmFtZSAgICAgICAgICAjIHJldmVyc2Ugc28gd2UgY2FuIHNvcnQgdGhlbS4uLgorICAgIGtleXMgPSB0b2tlbnMua2V5cygpCisgICAga2V5cy5zb3J0KCkKKyAgICAjIGxvYWQgdGhlIG91dHB1dCBza2VsZXRvbiBmcm9tIHRoZSB0YXJnZXQ6CisgICAgdHJ5OgorICAgICAgICBmcCA9IG9wZW4ob3V0RmlsZU5hbWUpCisgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiSS9PIGVycm9yOiAlc1xuIiAlIHN0cihlcnIpKQorICAgICAgICBzeXMuZXhpdCgyKQorICAgIGZvcm1hdCA9IGZwLnJlYWQoKS5zcGxpdCgiXG4iKQorICAgIGZwLmNsb3NlKCkKKyAgICB0cnk6CisgICAgICAgIHN0YXJ0ID0gZm9ybWF0LmluZGV4KCIjLS1zdGFydCBjb25zdGFudHMtLSIpICsgMQorICAgICAgICBlbmQgPSBmb3JtYXQuaW5kZXgoIiMtLWVuZCBjb25zdGFudHMtLSIpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoInRhcmdldCBkb2VzIG5vdCBjb250YWluIGZvcm1hdCBtYXJrZXJzIikKKyAgICAgICAgc3lzLmV4aXQoMykKKyAgICBsaW5lcyA9IFtdCisgICAgZm9yIHZhbCBpbiBrZXlzOgorICAgICAgICBsaW5lcy5hcHBlbmQoIiVzID0gJWQiICUgKHRva2Vuc1t2YWxdLCB2YWwpKQorICAgIGZvcm1hdFtzdGFydDplbmRdID0gbGluZXMKKyAgICB0cnk6CisgICAgICAgIGZwID0gb3BlbihvdXRGaWxlTmFtZSwgJ3cnKQorICAgIGV4Y2VwdCBJT0Vycm9yLCBlcnI6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIkkvTyBlcnJvcjogJXNcbiIgJSBzdHIoZXJyKSkKKyAgICAgICAgc3lzLmV4aXQoNCkKKyAgICBmcC53cml0ZSgiXG4iLmpvaW4oZm9ybWF0KSkKKyAgICBmcC5jbG9zZSgpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9rZW4ucHljIGIvbGliL3B5dGhvbjIuNy90b2tlbi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyZTFhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9rZW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9rZW4ucHlvIGIvbGliL3B5dGhvbjIuNy90b2tlbi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyZTFhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdG9rZW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdG9rZW5pemUucHkgYi9saWIvcHl0aG9uMi43L3Rva2VuaXplLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhN2IwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rva2VuaXplLnB5CkBAIC0wLDAgKzEsNDI2IEBACisiIiJUb2tlbml6YXRpb24gaGVscCBmb3IgUHl0aG9uIHByb2dyYW1zLgorCitnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpIGlzIGEgZ2VuZXJhdG9yIHRoYXQgYnJlYWtzIGEgc3RyZWFtIG9mCit0ZXh0IGludG8gUHl0aG9uIHRva2Vucy4gIEl0IGFjY2VwdHMgYSByZWFkbGluZS1saWtlIG1ldGhvZCB3aGljaCBpcyBjYWxsZWQKK3JlcGVhdGVkbHkgdG8gZ2V0IHRoZSBuZXh0IGxpbmUgb2YgaW5wdXQgKG9yICIiIGZvciBFT0YpLiAgSXQgZ2VuZXJhdGVzCis1LXR1cGxlcyB3aXRoIHRoZXNlIG1lbWJlcnM6CisKKyAgICB0aGUgdG9rZW4gdHlwZSAoc2VlIHRva2VuLnB5KQorICAgIHRoZSB0b2tlbiAoYSBzdHJpbmcpCisgICAgdGhlIHN0YXJ0aW5nIChyb3csIGNvbHVtbikgaW5kaWNlcyBvZiB0aGUgdG9rZW4gKGEgMi10dXBsZSBvZiBpbnRzKQorICAgIHRoZSBlbmRpbmcgKHJvdywgY29sdW1uKSBpbmRpY2VzIG9mIHRoZSB0b2tlbiAoYSAyLXR1cGxlIG9mIGludHMpCisgICAgdGhlIG9yaWdpbmFsIGxpbmUgKHN0cmluZykKKworSXQgaXMgZGVzaWduZWQgdG8gbWF0Y2ggdGhlIHdvcmtpbmcgb2YgdGhlIFB5dGhvbiB0b2tlbml6ZXIgZXhhY3RseSwgZXhjZXB0Cit0aGF0IGl0IHByb2R1Y2VzIENPTU1FTlQgdG9rZW5zIGZvciBjb21tZW50cyBhbmQgZ2l2ZXMgdHlwZSBPUCBmb3IgYWxsCitvcGVyYXRvcnMKKworT2xkZXIgZW50cnkgcG9pbnRzCisgICAgdG9rZW5pemVfbG9vcChyZWFkbGluZSwgdG9rZW5lYXRlcikKKyAgICB0b2tlbml6ZShyZWFkbGluZSwgdG9rZW5lYXRlcj1wcmludHRva2VuKQorYXJlIHRoZSBzYW1lLCBleGNlcHQgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIHRva2VucywgdG9rZW5lYXRlciBpcyBhIGNhbGxiYWNrCitmdW5jdGlvbiB0byB3aGljaCB0aGUgNSBmaWVsZHMgZGVzY3JpYmVkIGFib3ZlIGFyZSBwYXNzZWQgYXMgNSBhcmd1bWVudHMsCitlYWNoIHRpbWUgYSBuZXcgdG9rZW4gaXMgZm91bmQuIiIiCisKK19fYXV0aG9yX18gPSAnS2EtUGluZyBZZWUgPHBpbmdAbGZ3Lm9yZz4nCitfX2NyZWRpdHNfXyA9ICgnR3ZSLCBFU1IsIFRpbSBQZXRlcnMsIFRob21hcyBXb3V0ZXJzLCBGcmVkIERyYWtlLCAnCisgICAgICAgICAgICAgICAnU2tpcCBNb250YW5hcm8sIFJheW1vbmQgSGV0dGluZ2VyJykKKworaW1wb3J0IHN0cmluZywgcmUKK2Zyb20gdG9rZW4gaW1wb3J0ICoKKworaW1wb3J0IHRva2VuCitfX2FsbF9fID0gW3ggZm9yIHggaW4gZGlyKHRva2VuKSBpZiBub3QgeC5zdGFydHN3aXRoKCJfIildCitfX2FsbF9fICs9IFsiQ09NTUVOVCIsICJ0b2tlbml6ZSIsICJnZW5lcmF0ZV90b2tlbnMiLCAiTkwiLCAidW50b2tlbml6ZSJdCitkZWwgeAorZGVsIHRva2VuCisKK0NPTU1FTlQgPSBOX1RPS0VOUwordG9rX25hbWVbQ09NTUVOVF0gPSAnQ09NTUVOVCcKK05MID0gTl9UT0tFTlMgKyAxCit0b2tfbmFtZVtOTF0gPSAnTkwnCitOX1RPS0VOUyArPSAyCisKK2RlZiBncm91cCgqY2hvaWNlcyk6IHJldHVybiAnKCcgKyAnfCcuam9pbihjaG9pY2VzKSArICcpJworZGVmIGFueSgqY2hvaWNlcyk6IHJldHVybiBncm91cCgqY2hvaWNlcykgKyAnKicKK2RlZiBtYXliZSgqY2hvaWNlcyk6IHJldHVybiBncm91cCgqY2hvaWNlcykgKyAnPycKKworV2hpdGVzcGFjZSA9IHInWyBcZlx0XSonCitDb21tZW50ID0gcicjW15cclxuXSonCitJZ25vcmUgPSBXaGl0ZXNwYWNlICsgYW55KHInXFxccj9cbicgKyBXaGl0ZXNwYWNlKSArIG1heWJlKENvbW1lbnQpCitOYW1lID0gcidbYS16QS1aX11cdyonCisKK0hleG51bWJlciA9IHInMFt4WF1bXGRhLWZBLUZdK1tsTF0/JworT2N0bnVtYmVyID0gcicoMFtvT11bMC03XSspfCgwWzAtN10qKVtsTF0/JworQmlubnVtYmVyID0gcicwW2JCXVswMV0rW2xMXT8nCitEZWNudW1iZXIgPSByJ1sxLTldXGQqW2xMXT8nCitJbnRudW1iZXIgPSBncm91cChIZXhudW1iZXIsIEJpbm51bWJlciwgT2N0bnVtYmVyLCBEZWNudW1iZXIpCitFeHBvbmVudCA9IHInW2VFXVstK10/XGQrJworUG9pbnRmbG9hdCA9IGdyb3VwKHInXGQrXC5cZConLCByJ1wuXGQrJykgKyBtYXliZShFeHBvbmVudCkKK0V4cGZsb2F0ID0gcidcZCsnICsgRXhwb25lbnQKK0Zsb2F0bnVtYmVyID0gZ3JvdXAoUG9pbnRmbG9hdCwgRXhwZmxvYXQpCitJbWFnbnVtYmVyID0gZ3JvdXAocidcZCtbakpdJywgRmxvYXRudW1iZXIgKyByJ1tqSl0nKQorTnVtYmVyID0gZ3JvdXAoSW1hZ251bWJlciwgRmxvYXRudW1iZXIsIEludG51bWJlcikKKworIyBUYWlsIGVuZCBvZiAnIHN0cmluZy4KK1NpbmdsZSA9IHIiW14nXFxdKig/OlxcLlteJ1xcXSopKiciCisjIFRhaWwgZW5kIG9mICIgc3RyaW5nLgorRG91YmxlID0gcidbXiJcXF0qKD86XFwuW14iXFxdKikqIicKKyMgVGFpbCBlbmQgb2YgJycnIHN0cmluZy4KK1NpbmdsZTMgPSByIlteJ1xcXSooPzooPzpcXC58Jyg/IScnKSlbXidcXF0qKSonJyciCisjIFRhaWwgZW5kIG9mICIiIiBzdHJpbmcuCitEb3VibGUzID0gcidbXiJcXF0qKD86KD86XFwufCIoPyEiIikpW14iXFxdKikqIiIiJworVHJpcGxlID0gZ3JvdXAoIlt1VWJCXT9bclJdPycnJyIsICdbdVViQl0/W3JSXT8iIiInKQorIyBTaW5nbGUtbGluZSAnIG9yICIgc3RyaW5nLgorU3RyaW5nID0gZ3JvdXAociJbdVViQl0/W3JSXT8nW15cbidcXF0qKD86XFwuW15cbidcXF0qKSonIiwKKyAgICAgICAgICAgICAgIHInW3VVYkJdP1tyUl0/IlteXG4iXFxdKig/OlxcLlteXG4iXFxdKikqIicpCisKKyMgQmVjYXVzZSBvZiBsZWZ0bW9zdC10aGVuLWxvbmdlc3QgbWF0Y2ggc2VtYW50aWNzLCBiZSBzdXJlIHRvIHB1dCB0aGUKKyMgbG9uZ2VzdCBvcGVyYXRvcnMgZmlyc3QgKGUuZy4sIGlmID0gY2FtZSBiZWZvcmUgPT0sID09IHdvdWxkIGdldAorIyByZWNvZ25pemVkIGFzIHR3byBpbnN0YW5jZXMgb2YgPSkuCitPcGVyYXRvciA9IGdyb3VwKHIiXCpcKj0/IiwgciI+Pj0/IiwgciI8PD0/IiwgciI8PiIsIHIiIT0iLAorICAgICAgICAgICAgICAgICByIi8vPT8iLAorICAgICAgICAgICAgICAgICByIlsrXC0qLyUmfF49PD5dPT8iLAorICAgICAgICAgICAgICAgICByIn4iKQorCitCcmFja2V0ID0gJ1tdWygpe31dJworU3BlY2lhbCA9IGdyb3VwKHInXHI/XG4nLCByJ1s6Oy4sYEBdJykKK0Z1bm55ID0gZ3JvdXAoT3BlcmF0b3IsIEJyYWNrZXQsIFNwZWNpYWwpCisKK1BsYWluVG9rZW4gPSBncm91cChOdW1iZXIsIEZ1bm55LCBTdHJpbmcsIE5hbWUpCitUb2tlbiA9IElnbm9yZSArIFBsYWluVG9rZW4KKworIyBGaXJzdCAob3Igb25seSkgbGluZSBvZiAnIG9yICIgc3RyaW5nLgorQ29udFN0ciA9IGdyb3VwKHIiW3VVYkJdP1tyUl0/J1teXG4nXFxdKig/OlxcLlteXG4nXFxdKikqIiArCisgICAgICAgICAgICAgICAgZ3JvdXAoIiciLCByJ1xcXHI/XG4nKSwKKyAgICAgICAgICAgICAgICByJ1t1VWJCXT9bclJdPyJbXlxuIlxcXSooPzpcXC5bXlxuIlxcXSopKicgKworICAgICAgICAgICAgICAgIGdyb3VwKCciJywgcidcXFxyP1xuJykpCitQc2V1ZG9FeHRyYXMgPSBncm91cChyJ1xcXHI/XG58XFonLCBDb21tZW50LCBUcmlwbGUpCitQc2V1ZG9Ub2tlbiA9IFdoaXRlc3BhY2UgKyBncm91cChQc2V1ZG9FeHRyYXMsIE51bWJlciwgRnVubnksIENvbnRTdHIsIE5hbWUpCisKK3Rva2VucHJvZywgcHNldWRvcHJvZywgc2luZ2xlM3Byb2csIGRvdWJsZTNwcm9nID0gbWFwKAorICAgIHJlLmNvbXBpbGUsIChUb2tlbiwgUHNldWRvVG9rZW4sIFNpbmdsZTMsIERvdWJsZTMpKQorZW5kcHJvZ3MgPSB7IiciOiByZS5jb21waWxlKFNpbmdsZSksICciJzogcmUuY29tcGlsZShEb3VibGUpLAorICAgICAgICAgICAgIicnJyI6IHNpbmdsZTNwcm9nLCAnIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAicicnJyI6IHNpbmdsZTNwcm9nLCAnciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgInUnJyciOiBzaW5nbGUzcHJvZywgJ3UiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJ1cicnJyI6IHNpbmdsZTNwcm9nLCAndXIiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJSJycnIjogc2luZ2xlM3Byb2csICdSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiVScnJyI6IHNpbmdsZTNwcm9nLCAnVSIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgInVSJycnIjogc2luZ2xlM3Byb2csICd1UiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIlVyJycnIjogc2luZ2xlM3Byb2csICdVciIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgIlVSJycnIjogc2luZ2xlM3Byb2csICdVUiIiIic6IGRvdWJsZTNwcm9nLAorICAgICAgICAgICAgImInJyciOiBzaW5nbGUzcHJvZywgJ2IiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJicicnJyI6IHNpbmdsZTNwcm9nLCAnYnIiIiInOiBkb3VibGUzcHJvZywKKyAgICAgICAgICAgICJCJycnIjogc2luZ2xlM3Byb2csICdCIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiYlInJyciOiBzaW5nbGUzcHJvZywgJ2JSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiQnInJyciOiBzaW5nbGUzcHJvZywgJ0JyIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAiQlInJyciOiBzaW5nbGUzcHJvZywgJ0JSIiIiJzogZG91YmxlM3Byb2csCisgICAgICAgICAgICAncic6IE5vbmUsICdSJzogTm9uZSwgJ3UnOiBOb25lLCAnVSc6IE5vbmUsCisgICAgICAgICAgICAnYic6IE5vbmUsICdCJzogTm9uZX0KKwordHJpcGxlX3F1b3RlZCA9IHt9Citmb3IgdCBpbiAoIicnJyIsICciIiInLAorICAgICAgICAgICJyJycnIiwgJ3IiIiInLCAiUicnJyIsICdSIiIiJywKKyAgICAgICAgICAidScnJyIsICd1IiIiJywgIlUnJyciLCAnVSIiIicsCisgICAgICAgICAgInVyJycnIiwgJ3VyIiIiJywgIlVyJycnIiwgJ1VyIiIiJywKKyAgICAgICAgICAidVInJyciLCAndVIiIiInLCAiVVInJyciLCAnVVIiIiInLAorICAgICAgICAgICJiJycnIiwgJ2IiIiInLCAiQicnJyIsICdCIiIiJywKKyAgICAgICAgICAiYnInJyciLCAnYnIiIiInLCAiQnInJyciLCAnQnIiIiInLAorICAgICAgICAgICJiUicnJyIsICdiUiIiIicsICJCUicnJyIsICdCUiIiIicpOgorICAgIHRyaXBsZV9xdW90ZWRbdF0gPSB0CitzaW5nbGVfcXVvdGVkID0ge30KK2ZvciB0IGluICgiJyIsICciJywKKyAgICAgICAgICAiciciLCAnciInLCAiUiciLCAnUiInLAorICAgICAgICAgICJ1JyIsICd1IicsICJVJyIsICdVIicsCisgICAgICAgICAgInVyJyIsICd1ciInLCAiVXInIiwgJ1VyIicsCisgICAgICAgICAgInVSJyIsICd1UiInLCAiVVInIiwgJ1VSIicsCisgICAgICAgICAgImInIiwgJ2IiJywgIkInIiwgJ0IiJywKKyAgICAgICAgICAiYnInIiwgJ2JyIicsICJCciciLCAnQnIiJywKKyAgICAgICAgICAiYlInIiwgJ2JSIicsICJCUiciLCAnQlIiJyApOgorICAgIHNpbmdsZV9xdW90ZWRbdF0gPSB0CisKK3RhYnNpemUgPSA4CisKK2NsYXNzIFRva2VuRXJyb3IoRXhjZXB0aW9uKTogcGFzcworCitjbGFzcyBTdG9wVG9rZW5pemluZyhFeGNlcHRpb24pOiBwYXNzCisKK2RlZiBwcmludHRva2VuKHR5cGUsIHRva2VuLCBzcm93X3Njb2wsIGVyb3dfZWNvbCwgbGluZSk6ICMgZm9yIHRlc3RpbmcKKyAgICBzcm93LCBzY29sID0gc3Jvd19zY29sCisgICAgZXJvdywgZWNvbCA9IGVyb3dfZWNvbAorICAgIHByaW50ICIlZCwlZC0lZCwlZDpcdCVzXHQlcyIgJSBcCisgICAgICAgIChzcm93LCBzY29sLCBlcm93LCBlY29sLCB0b2tfbmFtZVt0eXBlXSwgcmVwcih0b2tlbikpCisKK2RlZiB0b2tlbml6ZShyZWFkbGluZSwgdG9rZW5lYXRlcj1wcmludHRva2VuKToKKyAgICAiIiIKKyAgICBUaGUgdG9rZW5pemUoKSBmdW5jdGlvbiBhY2NlcHRzIHR3byBwYXJhbWV0ZXJzOiBvbmUgcmVwcmVzZW50aW5nIHRoZQorICAgIGlucHV0IHN0cmVhbSwgYW5kIG9uZSBwcm92aWRpbmcgYW4gb3V0cHV0IG1lY2hhbmlzbSBmb3IgdG9rZW5pemUoKS4KKworICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIsIHJlYWRsaW5lLCBtdXN0IGJlIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHByb3ZpZGVzCisgICAgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSByZWFkbGluZSgpIG1ldGhvZCBvZiBidWlsdC1pbiBmaWxlIG9iamVjdHMuCisgICAgRWFjaCBjYWxsIHRvIHRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIG9uZSBsaW5lIG9mIGlucHV0IGFzIGEgc3RyaW5nLgorCisgICAgVGhlIHNlY29uZCBwYXJhbWV0ZXIsIHRva2VuZWF0ZXIsIG11c3QgYWxzbyBiZSBhIGNhbGxhYmxlIG9iamVjdC4gSXQgaXMKKyAgICBjYWxsZWQgb25jZSBmb3IgZWFjaCB0b2tlbiwgd2l0aCBmaXZlIGFyZ3VtZW50cywgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICB0dXBsZXMgZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlX3Rva2VucygpLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgdG9rZW5pemVfbG9vcChyZWFkbGluZSwgdG9rZW5lYXRlcikKKyAgICBleGNlcHQgU3RvcFRva2VuaXppbmc6CisgICAgICAgIHBhc3MKKworIyBiYWNrd2FyZHMgY29tcGF0aWJsZSBpbnRlcmZhY2UKK2RlZiB0b2tlbml6ZV9sb29wKHJlYWRsaW5lLCB0b2tlbmVhdGVyKToKKyAgICBmb3IgdG9rZW5faW5mbyBpbiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpOgorICAgICAgICB0b2tlbmVhdGVyKCp0b2tlbl9pbmZvKQorCitjbGFzcyBVbnRva2VuaXplcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi50b2tlbnMgPSBbXQorICAgICAgICBzZWxmLnByZXZfcm93ID0gMQorICAgICAgICBzZWxmLnByZXZfY29sID0gMAorCisgICAgZGVmIGFkZF93aGl0ZXNwYWNlKHNlbGYsIHN0YXJ0KToKKyAgICAgICAgcm93LCBjb2wgPSBzdGFydAorICAgICAgICBhc3NlcnQgcm93IDw9IHNlbGYucHJldl9yb3cKKyAgICAgICAgY29sX29mZnNldCA9IGNvbCAtIHNlbGYucHJldl9jb2wKKyAgICAgICAgaWYgY29sX29mZnNldDoKKyAgICAgICAgICAgIHNlbGYudG9rZW5zLmFwcGVuZCgiICIgKiBjb2xfb2Zmc2V0KQorCisgICAgZGVmIHVudG9rZW5pemUoc2VsZiwgaXRlcmFibGUpOgorICAgICAgICBmb3IgdCBpbiBpdGVyYWJsZToKKyAgICAgICAgICAgIGlmIGxlbih0KSA9PSAyOgorICAgICAgICAgICAgICAgIHNlbGYuY29tcGF0KHQsIGl0ZXJhYmxlKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0b2tfdHlwZSwgdG9rZW4sIHN0YXJ0LCBlbmQsIGxpbmUgPSB0CisgICAgICAgICAgICBzZWxmLmFkZF93aGl0ZXNwYWNlKHN0YXJ0KQorICAgICAgICAgICAgc2VsZi50b2tlbnMuYXBwZW5kKHRva2VuKQorICAgICAgICAgICAgc2VsZi5wcmV2X3Jvdywgc2VsZi5wcmV2X2NvbCA9IGVuZAorICAgICAgICAgICAgaWYgdG9rX3R5cGUgaW4gKE5FV0xJTkUsIE5MKToKKyAgICAgICAgICAgICAgICBzZWxmLnByZXZfcm93ICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLnByZXZfY29sID0gMAorICAgICAgICByZXR1cm4gIiIuam9pbihzZWxmLnRva2VucykKKworICAgIGRlZiBjb21wYXQoc2VsZiwgdG9rZW4sIGl0ZXJhYmxlKToKKyAgICAgICAgc3RhcnRsaW5lID0gRmFsc2UKKyAgICAgICAgaW5kZW50cyA9IFtdCisgICAgICAgIHRva3NfYXBwZW5kID0gc2VsZi50b2tlbnMuYXBwZW5kCisgICAgICAgIHRva251bSwgdG9rdmFsID0gdG9rZW4KKyAgICAgICAgaWYgdG9rbnVtIGluIChOQU1FLCBOVU1CRVIpOgorICAgICAgICAgICAgdG9rdmFsICs9ICcgJworICAgICAgICBpZiB0b2tudW0gaW4gKE5FV0xJTkUsIE5MKToKKyAgICAgICAgICAgIHN0YXJ0bGluZSA9IFRydWUKKyAgICAgICAgcHJldnN0cmluZyA9IEZhbHNlCisgICAgICAgIGZvciB0b2sgaW4gaXRlcmFibGU6CisgICAgICAgICAgICB0b2tudW0sIHRva3ZhbCA9IHRva1s6Ml0KKworICAgICAgICAgICAgaWYgdG9rbnVtIGluIChOQU1FLCBOVU1CRVIpOgorICAgICAgICAgICAgICAgIHRva3ZhbCArPSAnICcKKworICAgICAgICAgICAgIyBJbnNlcnQgYSBzcGFjZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBzdHJpbmdzCisgICAgICAgICAgICBpZiB0b2tudW0gPT0gU1RSSU5HOgorICAgICAgICAgICAgICAgIGlmIHByZXZzdHJpbmc6CisgICAgICAgICAgICAgICAgICAgIHRva3ZhbCA9ICcgJyArIHRva3ZhbAorICAgICAgICAgICAgICAgIHByZXZzdHJpbmcgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZXZzdHJpbmcgPSBGYWxzZQorCisgICAgICAgICAgICBpZiB0b2tudW0gPT0gSU5ERU5UOgorICAgICAgICAgICAgICAgIGluZGVudHMuYXBwZW5kKHRva3ZhbCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0b2tudW0gPT0gREVERU5UOgorICAgICAgICAgICAgICAgIGluZGVudHMucG9wKCkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiB0b2tudW0gaW4gKE5FV0xJTkUsIE5MKToKKyAgICAgICAgICAgICAgICBzdGFydGxpbmUgPSBUcnVlCisgICAgICAgICAgICBlbGlmIHN0YXJ0bGluZSBhbmQgaW5kZW50czoKKyAgICAgICAgICAgICAgICB0b2tzX2FwcGVuZChpbmRlbnRzWy0xXSkKKyAgICAgICAgICAgICAgICBzdGFydGxpbmUgPSBGYWxzZQorICAgICAgICAgICAgdG9rc19hcHBlbmQodG9rdmFsKQorCitkZWYgdW50b2tlbml6ZShpdGVyYWJsZSk6CisgICAgIiIiVHJhbnNmb3JtIHRva2VucyBiYWNrIGludG8gUHl0aG9uIHNvdXJjZSBjb2RlLgorCisgICAgRWFjaCBlbGVtZW50IHJldHVybmVkIGJ5IHRoZSBpdGVyYWJsZSBtdXN0IGJlIGEgdG9rZW4gc2VxdWVuY2UKKyAgICB3aXRoIGF0IGxlYXN0IHR3byBlbGVtZW50cywgYSB0b2tlbiBudW1iZXIgYW5kIHRva2VuIHZhbHVlLiAgSWYKKyAgICBvbmx5IHR3byB0b2tlbnMgYXJlIHBhc3NlZCwgdGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgcG9vci4KKworICAgIFJvdW5kLXRyaXAgaW52YXJpYW50IGZvciBmdWxsIGlucHV0OgorICAgICAgICBVbnRva2VuaXplZCBzb3VyY2Ugd2lsbCBtYXRjaCBpbnB1dCBzb3VyY2UgZXhhY3RseQorCisgICAgUm91bmQtdHJpcCBpbnZhcmlhbnQgZm9yIGxpbWl0ZWQgaW50cHV0OgorICAgICAgICAjIE91dHB1dCB0ZXh0IHdpbGwgdG9rZW5pemUgdGhlIGJhY2sgdG8gdGhlIGlucHV0CisgICAgICAgIHQxID0gW3Rva1s6Ml0gZm9yIHRvayBpbiBnZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSldCisgICAgICAgIG5ld2NvZGUgPSB1bnRva2VuaXplKHQxKQorICAgICAgICByZWFkbGluZSA9IGl0ZXIobmV3Y29kZS5zcGxpdGxpbmVzKDEpKS5uZXh0CisgICAgICAgIHQyID0gW3Rva1s6Ml0gZm9yIHRvayBpbiBnZW5lcmF0ZV90b2tlbnMocmVhZGxpbmUpXQorICAgICAgICBhc3NlcnQgdDEgPT0gdDIKKyAgICAiIiIKKyAgICB1dCA9IFVudG9rZW5pemVyKCkKKyAgICByZXR1cm4gdXQudW50b2tlbml6ZShpdGVyYWJsZSkKKworZGVmIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSk6CisgICAgIiIiCisgICAgVGhlIGdlbmVyYXRlX3Rva2VucygpIGdlbmVyYXRvciByZXF1aXJlcyBvbmUgYXJnbWVudCwgcmVhZGxpbmUsIHdoaWNoCisgICAgbXVzdCBiZSBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCBwcm92aWRlcyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgdGhlCisgICAgcmVhZGxpbmUoKSBtZXRob2Qgb2YgYnVpbHQtaW4gZmlsZSBvYmplY3RzLiBFYWNoIGNhbGwgdG8gdGhlIGZ1bmN0aW9uCisgICAgc2hvdWxkIHJldHVybiBvbmUgbGluZSBvZiBpbnB1dCBhcyBhIHN0cmluZy4gIEFsdGVybmF0ZWx5LCByZWFkbGluZQorICAgIGNhbiBiZSBhIGNhbGxhYmxlIGZ1bmN0aW9uIHRlcm1pbmF0aW5nIHdpdGggU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgcmVhZGxpbmUgPSBvcGVuKG15ZmlsZSkubmV4dCAgICAjIEV4YW1wbGUgb2YgYWx0ZXJuYXRlIHJlYWRsaW5lCisKKyAgICBUaGUgZ2VuZXJhdG9yIHByb2R1Y2VzIDUtdHVwbGVzIHdpdGggdGhlc2UgbWVtYmVyczogdGhlIHRva2VuIHR5cGU7IHRoZQorICAgIHRva2VuIHN0cmluZzsgYSAyLXR1cGxlIChzcm93LCBzY29sKSBvZiBpbnRzIHNwZWNpZnlpbmcgdGhlIHJvdyBhbmQKKyAgICBjb2x1bW4gd2hlcmUgdGhlIHRva2VuIGJlZ2lucyBpbiB0aGUgc291cmNlOyBhIDItdHVwbGUgKGVyb3csIGVjb2wpIG9mCisgICAgaW50cyBzcGVjaWZ5aW5nIHRoZSByb3cgYW5kIGNvbHVtbiB3aGVyZSB0aGUgdG9rZW4gZW5kcyBpbiB0aGUgc291cmNlOworICAgIGFuZCB0aGUgbGluZSBvbiB3aGljaCB0aGUgdG9rZW4gd2FzIGZvdW5kLiBUaGUgbGluZSBwYXNzZWQgaXMgdGhlCisgICAgbG9naWNhbCBsaW5lOyBjb250aW51YXRpb24gbGluZXMgYXJlIGluY2x1ZGVkLgorICAgICIiIgorICAgIGxudW0gPSBwYXJlbmxldiA9IGNvbnRpbnVlZCA9IDAKKyAgICBuYW1lY2hhcnMsIG51bWNoYXJzID0gc3RyaW5nLmFzY2lpX2xldHRlcnMgKyAnXycsICcwMTIzNDU2Nzg5JworICAgIGNvbnRzdHIsIG5lZWRjb250ID0gJycsIDAKKyAgICBjb250bGluZSA9IE5vbmUKKyAgICBpbmRlbnRzID0gWzBdCisKKyAgICB3aGlsZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBsb29wIG92ZXIgbGluZXMgaW4gc3RyZWFtCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmUgPSByZWFkbGluZSgpCisgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgorICAgICAgICAgICAgbGluZSA9ICcnCisgICAgICAgIGxudW0gKz0gMQorICAgICAgICBwb3MsIG1heCA9IDAsIGxlbihsaW5lKQorCisgICAgICAgIGlmIGNvbnRzdHI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVkIHN0cmluZworICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVG9rZW5FcnJvciwgKCJFT0YgaW4gbXVsdGktbGluZSBzdHJpbmciLCBzdHJzdGFydCkKKyAgICAgICAgICAgIGVuZG1hdGNoID0gZW5kcHJvZy5tYXRjaChsaW5lKQorICAgICAgICAgICAgaWYgZW5kbWF0Y2g6CisgICAgICAgICAgICAgICAgcG9zID0gZW5kID0gZW5kbWF0Y2guZW5kKDApCisgICAgICAgICAgICAgICAgeWllbGQgKFNUUklORywgY29udHN0ciArIGxpbmVbOmVuZF0sCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0LCAobG51bSwgZW5kKSwgY29udGxpbmUgKyBsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRzdHIsIG5lZWRjb250ID0gJycsIDAKKyAgICAgICAgICAgICAgICBjb250bGluZSA9IE5vbmUKKyAgICAgICAgICAgIGVsaWYgbmVlZGNvbnQgYW5kIGxpbmVbLTI6XSAhPSAnXFxcbicgYW5kIGxpbmVbLTM6XSAhPSAnXFxcclxuJzoKKyAgICAgICAgICAgICAgICB5aWVsZCAoRVJST1JUT0tFTiwgY29udHN0ciArIGxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCwgKGxudW0sIGxlbihsaW5lKSksIGNvbnRsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRzdHIgPSAnJworICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gTm9uZQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbnRzdHIgPSBjb250c3RyICsgbGluZQorICAgICAgICAgICAgICAgIGNvbnRsaW5lID0gY29udGxpbmUgKyBsaW5lCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBlbGlmIHBhcmVubGV2ID09IDAgYW5kIG5vdCBjb250aW51ZWQ6ICAjIG5ldyBzdGF0ZW1lbnQKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgICAgICAgICAgY29sdW1uID0gMAorICAgICAgICAgICAgd2hpbGUgcG9zIDwgbWF4OiAgICAgICAgICAgICAgICAgICAjIG1lYXN1cmUgbGVhZGluZyB3aGl0ZXNwYWNlCisgICAgICAgICAgICAgICAgaWYgbGluZVtwb3NdID09ICcgJzoKKyAgICAgICAgICAgICAgICAgICAgY29sdW1uICs9IDEKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmVbcG9zXSA9PSAnXHQnOgorICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAoY29sdW1uLy90YWJzaXplICsgMSkqdGFic2l6ZQorICAgICAgICAgICAgICAgIGVsaWYgbGluZVtwb3NdID09ICdcZic6CisgICAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IDAKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIHBvcyArPSAxCisgICAgICAgICAgICBpZiBwb3MgPT0gbWF4OgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgIGlmIGxpbmVbcG9zXSBpbiAnI1xyXG4nOiAgICAgICAgICAgIyBza2lwIGNvbW1lbnRzIG9yIGJsYW5rIGxpbmVzCisgICAgICAgICAgICAgICAgaWYgbGluZVtwb3NdID09ICcjJzoKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudF90b2tlbiA9IGxpbmVbcG9zOl0ucnN0cmlwKCdcclxuJykKKyAgICAgICAgICAgICAgICAgICAgbmxfcG9zID0gcG9zICsgbGVuKGNvbW1lbnRfdG9rZW4pCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChDT01NRU5ULCBjb21tZW50X3Rva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxudW0sIHBvcyksIChsbnVtLCBwb3MgKyBsZW4oY29tbWVudF90b2tlbikpLCBsaW5lKQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoTkwsIGxpbmVbbmxfcG9zOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgbmxfcG9zKSwgKGxudW0sIGxlbihsaW5lKSksIGxpbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKChOTCwgQ09NTUVOVClbbGluZVtwb3NdID09ICcjJ10sIGxpbmVbcG9zOl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG51bSwgcG9zKSwgKGxudW0sIGxlbihsaW5lKSksIGxpbmUpCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgY29sdW1uID4gaW5kZW50c1stMV06ICAgICAgICAgICAjIGNvdW50IGluZGVudHMgb3IgZGVkZW50cworICAgICAgICAgICAgICAgIGluZGVudHMuYXBwZW5kKGNvbHVtbikKKyAgICAgICAgICAgICAgICB5aWVsZCAoSU5ERU5ULCBsaW5lWzpwb3NdLCAobG51bSwgMCksIChsbnVtLCBwb3MpLCBsaW5lKQorICAgICAgICAgICAgd2hpbGUgY29sdW1uIDwgaW5kZW50c1stMV06CisgICAgICAgICAgICAgICAgaWYgY29sdW1uIG5vdCBpbiBpbmRlbnRzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJbmRlbnRhdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgInVuaW5kZW50IGRvZXMgbm90IG1hdGNoIGFueSBvdXRlciBpbmRlbnRhdGlvbiBsZXZlbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAoIjx0b2tlbml6ZT4iLCBsbnVtLCBwb3MsIGxpbmUpKQorICAgICAgICAgICAgICAgIGluZGVudHMgPSBpbmRlbnRzWzotMV0KKyAgICAgICAgICAgICAgICB5aWVsZCAoREVERU5ULCAnJywgKGxudW0sIHBvcyksIChsbnVtLCBwb3MpLCBsaW5lKQorCisgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29udGludWVkIHN0YXRlbWVudAorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVG9rZW5FcnJvciwgKCJFT0YgaW4gbXVsdGktbGluZSBzdGF0ZW1lbnQiLCAobG51bSwgMCkpCisgICAgICAgICAgICBjb250aW51ZWQgPSAwCisKKyAgICAgICAgd2hpbGUgcG9zIDwgbWF4OgorICAgICAgICAgICAgcHNldWRvbWF0Y2ggPSBwc2V1ZG9wcm9nLm1hdGNoKGxpbmUsIHBvcykKKyAgICAgICAgICAgIGlmIHBzZXVkb21hdGNoOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzY2FuIGZvciB0b2tlbnMKKyAgICAgICAgICAgICAgICBzdGFydCwgZW5kID0gcHNldWRvbWF0Y2guc3BhbigxKQorICAgICAgICAgICAgICAgIHNwb3MsIGVwb3MsIHBvcyA9IChsbnVtLCBzdGFydCksIChsbnVtLCBlbmQpLCBlbmQKKyAgICAgICAgICAgICAgICBpZiBzdGFydCA9PSBlbmQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgdG9rZW4sIGluaXRpYWwgPSBsaW5lW3N0YXJ0OmVuZF0sIGxpbmVbc3RhcnRdCisKKyAgICAgICAgICAgICAgICBpZiBpbml0aWFsIGluIG51bWNoYXJzIG9yIFwKKyAgICAgICAgICAgICAgICAgICAoaW5pdGlhbCA9PSAnLicgYW5kIHRva2VuICE9ICcuJyk6ICAgICAgIyBvcmRpbmFyeSBudW1iZXIKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKE5VTUJFUiwgdG9rZW4sIHNwb3MsIGVwb3MsIGxpbmUpCisgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsIGluICdcclxuJzoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgKE5MIGlmIHBhcmVubGV2ID4gMCBlbHNlIE5FV0xJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgPT0gJyMnOgorICAgICAgICAgICAgICAgICAgICBhc3NlcnQgbm90IHRva2VuLmVuZHN3aXRoKCJcbiIpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChDT01NRU5ULCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIHRva2VuIGluIHRyaXBsZV9xdW90ZWQ6CisgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSBlbmRwcm9nc1t0b2tlbl0KKyAgICAgICAgICAgICAgICAgICAgZW5kbWF0Y2ggPSBlbmRwcm9nLm1hdGNoKGxpbmUsIHBvcykKKyAgICAgICAgICAgICAgICAgICAgaWYgZW5kbWF0Y2g6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhbGwgb24gb25lIGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGVuZG1hdGNoLmVuZCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW4gPSBsaW5lW3N0YXJ0OnBvc10KKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIChTVFJJTkcsIHRva2VuLCBzcG9zLCAobG51bSwgcG9zKSwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0YXJ0ID0gKGxudW0sIHN0YXJ0KSAgICAgICAgICAgIyBtdWx0aXBsZSBsaW5lcworICAgICAgICAgICAgICAgICAgICAgICAgY29udHN0ciA9IGxpbmVbc3RhcnQ6XQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGxpbmUgPSBsaW5lCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsaWYgaW5pdGlhbCBpbiBzaW5nbGVfcXVvdGVkIG9yIFwKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5bOjJdIGluIHNpbmdsZV9xdW90ZWQgb3IgXAorICAgICAgICAgICAgICAgICAgICB0b2tlbls6M10gaW4gc2luZ2xlX3F1b3RlZDoKKyAgICAgICAgICAgICAgICAgICAgaWYgdG9rZW5bLTFdID09ICdcbic6ICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdGFydCA9IChsbnVtLCBzdGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2cgPSAoZW5kcHJvZ3NbaW5pdGlhbF0gb3IgZW5kcHJvZ3NbdG9rZW5bMV1dIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZHByb2dzW3Rva2VuWzJdXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRzdHIsIG5lZWRjb250ID0gbGluZVtzdGFydDpdLCAxCisgICAgICAgICAgICAgICAgICAgICAgICBjb250bGluZSA9IGxpbmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3JkaW5hcnkgc3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCAoU1RSSU5HLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgaW4gbmFtZWNoYXJzOiAgICAgICAgICAgICAgICAgIyBvcmRpbmFyeSBuYW1lCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIChOQU1FLCB0b2tlbiwgc3BvcywgZXBvcywgbGluZSkKKyAgICAgICAgICAgICAgICBlbGlmIGluaXRpYWwgPT0gJ1xcJzogICAgICAgICAgICAgICAgICAgICAgIyBjb250aW51ZWQgc3RtdAorICAgICAgICAgICAgICAgICAgICBjb250aW51ZWQgPSAxCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaWYgaW5pdGlhbCBpbiAnKFt7JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVubGV2ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBpbml0aWFsIGluICcpXX0nOgorICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW5sZXYgLT0gMQorICAgICAgICAgICAgICAgICAgICB5aWVsZCAoT1AsIHRva2VuLCBzcG9zLCBlcG9zLCBsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCAoRVJST1JUT0tFTiwgbGluZVtwb3NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxudW0sIHBvcyksIChsbnVtLCBwb3MrMSksIGxpbmUpCisgICAgICAgICAgICAgICAgcG9zICs9IDEKKworICAgIGZvciBpbmRlbnQgaW4gaW5kZW50c1sxOl06ICAgICAgICAgICAgICAgICAjIHBvcCByZW1haW5pbmcgaW5kZW50IGxldmVscworICAgICAgICB5aWVsZCAoREVERU5ULCAnJywgKGxudW0sIDApLCAobG51bSwgMCksICcnKQorICAgIHlpZWxkIChFTkRNQVJLRVIsICcnLCAobG51bSwgMCksIChsbnVtLCAwKSwgJycpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6ICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0aW5nCisgICAgaW1wb3J0IHN5cworICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICB0b2tlbml6ZShvcGVuKHN5cy5hcmd2WzFdKS5yZWFkbGluZSkKKyAgICBlbHNlOgorICAgICAgICB0b2tlbml6ZShzeXMuc3RkaW4ucmVhZGxpbmUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rva2VuaXplLnB5YyBiL2xpYi9weXRob24yLjcvdG9rZW5pemUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhM2I2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rva2VuaXplLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3Rva2VuaXplLnB5byBiL2xpYi9weXRob24yLjcvdG9rZW5pemUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTY2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3Rva2VuaXplLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RyYWNlLnB5IGIvbGliL3B5dGhvbjIuNy90cmFjZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGExM2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90cmFjZS5weQpAQCAtMCwwICsxLDgxOSBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMgcG9ydGlvbnMgY29weXJpZ2h0IDIwMDEsIEF1dG9ub21vdXMgWm9uZXMgSW5kdXN0cmllcywgSW5jLiwgYWxsIHJpZ2h0cy4uLgorIyBlcnIuLi4gIHJlc2VydmVkIGFuZCBvZmZlcmVkIHRvIHRoZSBwdWJsaWMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorIyBQeXRob24gMi4yIGxpY2Vuc2UuCisjIEF1dGhvcjogWm9va28gTydXaGllbGFjcm9ueAorIyBodHRwOi8vem9va28uY29tLworIyBtYWlsdG86em9va29Aem9va28uY29tCisjCisjIENvcHlyaWdodCAyMDAwLCBNb2phbSBNZWRpYSwgSW5jLiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgQXV0aG9yOiBTa2lwIE1vbnRhbmFybworIworIyBDb3B5cmlnaHQgMTk5OSwgQmlvcmVhc29uLCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorIyBBdXRob3I6IEFuZHJldyBEYWxrZQorIworIyBDb3B5cmlnaHQgMTk5NS0xOTk3LCBBdXRvbWF0cml4LCBJbmMuLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorIyBBdXRob3I6IFNraXAgTW9udGFuYXJvCisjCisjIENvcHlyaWdodCAxOTkxLTE5OTUsIFN0aWNodGluZyBNYXRoZW1hdGlzY2ggQ2VudHJ1bSwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBQeXRob24gc29mdHdhcmUgYW5kCisjIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIHdpdGhvdXQgZmVlIGlzIGhlcmVieQorIyBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4gYWxsIGNvcGllcywKKyMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluCisjIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgbmVpdGhlciBBdXRvbWF0cml4LAorIyBCaW9yZWFzb24gb3IgTW9qYW0gTWVkaWEgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0bworIyBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4KKyMKKyIiInByb2dyYW0vbW9kdWxlIHRvIHRyYWNlIFB5dGhvbiBwcm9ncmFtIG9yIGZ1bmN0aW9uIGV4ZWN1dGlvbgorCitTYW1wbGUgdXNlLCBjb21tYW5kIGxpbmU6CisgIHRyYWNlLnB5IC1jIC1mIGNvdW50cyAtLWlnbm9yZS1kaXIgJyRwcmVmaXgnIHNwYW0ucHkgZWdncworICB0cmFjZS5weSAtdCAtLWlnbm9yZS1kaXIgJyRwcmVmaXgnIHNwYW0ucHkgZWdncworICB0cmFjZS5weSAtLXRyYWNrY2FsbHMgc3BhbS5weSBlZ2dzCisKK1NhbXBsZSB1c2UsIHByb2dyYW1tYXRpY2FsbHkKKyAgaW1wb3J0IHN5cworCisgICMgY3JlYXRlIGEgVHJhY2Ugb2JqZWN0LCB0ZWxsaW5nIGl0IHdoYXQgdG8gaWdub3JlLCBhbmQgd2hldGhlciB0bworICAjIGRvIHRyYWNpbmcgb3IgbGluZS1jb3VudGluZyBvciBib3RoLgorICB0cmFjZXIgPSB0cmFjZS5UcmFjZShpZ25vcmVkaXJzPVtzeXMucHJlZml4LCBzeXMuZXhlY19wcmVmaXgsXSwgdHJhY2U9MCwKKyAgICAgICAgICAgICAgICAgICAgY291bnQ9MSkKKyAgIyBydW4gdGhlIG5ldyBjb21tYW5kIHVzaW5nIHRoZSBnaXZlbiB0cmFjZXIKKyAgdHJhY2VyLnJ1bignbWFpbigpJykKKyAgIyBtYWtlIGEgcmVwb3J0LCBwbGFjaW5nIG91dHB1dCBpbiAvdG1wCisgIHIgPSB0cmFjZXIucmVzdWx0cygpCisgIHIud3JpdGVfcmVzdWx0cyhzaG93X21pc3Npbmc9VHJ1ZSwgY292ZXJkaXI9Ii90bXAiKQorIiIiCisKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitpbXBvcnQgdGltZQoraW1wb3J0IHRva2VuCitpbXBvcnQgdG9rZW5pemUKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgZ2MKK2ltcG9ydCBkaXMKK3RyeToKKyAgICBpbXBvcnQgY1BpY2tsZQorICAgIHBpY2tsZSA9IGNQaWNrbGUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBpbXBvcnQgcGlja2xlCisKK3RyeToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX3NldHRyYWNlID0gc3lzLnNldHRyYWNlCisKKyAgICBkZWYgX3Vuc2V0dHJhY2UoKToKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCitlbHNlOgorICAgIGRlZiBfc2V0dHJhY2UoZnVuYyk6CisgICAgICAgIHRocmVhZGluZy5zZXR0cmFjZShmdW5jKQorICAgICAgICBzeXMuc2V0dHJhY2UoZnVuYykKKworICAgIGRlZiBfdW5zZXR0cmFjZSgpOgorICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgdGhyZWFkaW5nLnNldHRyYWNlKE5vbmUpCisKK2RlZiB1c2FnZShvdXRmaWxlKToKKyAgICBvdXRmaWxlLndyaXRlKCIiIlVzYWdlOiAlcyBbT1BUSU9OU10gPGZpbGU+IFtBUkdTXQorCitNZXRhLW9wdGlvbnM6CistLWhlbHAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAgdGhlbiBleGl0LgorLS12ZXJzaW9uICAgICAgICAgICAgIE91dHB1dCB2ZXJzaW9uIGluZm9ybWF0aW9uIHRoZW4gZXhpdC4KKworT3RoZXJ3aXNlLCBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHRocmVlIG9wdGlvbnMgbXVzdCBiZSBnaXZlbjoKKy10LCAtLXRyYWNlICAgICAgICAgICBQcmludCBlYWNoIGxpbmUgdG8gc3lzLnN0ZG91dCBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCistYywgLS1jb3VudCAgICAgICAgICAgQ291bnQgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxpbmUgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgd3JpdGUgdGhlIGNvdW50cyB0byA8bW9kdWxlPi5jb3ZlciBmb3IgZWFjaAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBleGVjdXRlZCwgaW4gdGhlIG1vZHVsZSdzIGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyBgLS1jb3ZlcmRpcicsIGAtLWZpbGUnLCBgLS1uby1yZXBvcnQnIGJlbG93LgorLWwsIC0tbGlzdGZ1bmNzICAgICAgIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZnVuY3Rpb25zIGFyZSBleGVjdXRlZCBhdCBsZWFzdAorICAgICAgICAgICAgICAgICAgICAgIG9uY2UgYW5kIHdyaXRlIHRoZSByZXN1bHRzIHRvIHN5cy5zdGRvdXQgYWZ0ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBleGl0cy4KKy1ULCAtLXRyYWNrY2FsbHMgICAgICBLZWVwIHRyYWNrIG9mIGNhbGxlci9jYWxsZWQgcGFpcnMgYW5kIHdyaXRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgdG8gc3lzLnN0ZG91dCBhZnRlciB0aGUgcHJvZ3JhbSBleGl0cy4KKy1yLCAtLXJlcG9ydCAgICAgICAgICBHZW5lcmF0ZSBhIHJlcG9ydCBmcm9tIGEgY291bnRzIGZpbGU7IGRvIG5vdCBleGVjdXRlCisgICAgICAgICAgICAgICAgICAgICAgYW55IGNvZGUuICBgLS1maWxlJyBtdXN0IHNwZWNpZnkgdGhlIHJlc3VsdHMgZmlsZSB0bworICAgICAgICAgICAgICAgICAgICAgIHJlYWQsIHdoaWNoIG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgaW4gYSBwcmV2aW91cyBydW4KKyAgICAgICAgICAgICAgICAgICAgICB3aXRoIGAtLWNvdW50IC0tZmlsZT1GSUxFJy4KKworTW9kaWZpZXJzOgorLWYsIC0tZmlsZT08ZmlsZT4gICAgIEZpbGUgdG8gYWNjdW11bGF0ZSBjb3VudHMgb3ZlciBzZXZlcmFsIHJ1bnMuCistUiwgLS1uby1yZXBvcnQgICAgICAgRG8gbm90IGdlbmVyYXRlIHRoZSBjb3ZlcmFnZSByZXBvcnQgZmlsZXMuCisgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIGlmIHlvdSB3YW50IHRvIGFjY3VtdWxhdGUgb3ZlciBzZXZlcmFsIHJ1bnMuCistQywgLS1jb3ZlcmRpcj08ZGlyPiAgRGlyZWN0b3J5IHdoZXJlIHRoZSByZXBvcnQgZmlsZXMuICBUaGUgY292ZXJhZ2UKKyAgICAgICAgICAgICAgICAgICAgICByZXBvcnQgZm9yIDxwYWNrYWdlPi48bW9kdWxlPiBpcyB3cml0dGVuIHRvIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICA8ZGlyPi88cGFja2FnZT4vPG1vZHVsZT4uY292ZXIuCistbSwgLS1taXNzaW5nICAgICAgICAgQW5ub3RhdGUgZXhlY3V0YWJsZSBsaW5lcyB0aGF0IHdlcmUgbm90IGV4ZWN1dGVkCisgICAgICAgICAgICAgICAgICAgICAgd2l0aCAnPj4+Pj4+ICcuCistcywgLS1zdW1tYXJ5ICAgICAgICAgV3JpdGUgYSBicmllZiBzdW1tYXJ5IG9uIHN0ZG91dCBmb3IgZWFjaCBmaWxlLgorICAgICAgICAgICAgICAgICAgICAgIChDYW4gb25seSBiZSB1c2VkIHdpdGggLS1jb3VudCBvciAtLXJlcG9ydC4pCistZywgLS10aW1pbmcgICAgICAgICAgUHJlZml4IGVhY2ggbGluZSB3aXRoIHRoZSB0aW1lIHNpbmNlIHRoZSBwcm9ncmFtIHN0YXJ0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgT25seSB1c2VkIHdoaWxlIHRyYWNpbmcuCisKK0ZpbHRlcnMsIG1heSBiZSByZXBlYXRlZCBtdWx0aXBsZSB0aW1lczoKKy0taWdub3JlLW1vZHVsZT08bW9kPiBJZ25vcmUgdGhlIGdpdmVuIG1vZHVsZShzKSBhbmQgaXRzIHN1Ym1vZHVsZXMKKyAgICAgICAgICAgICAgICAgICAgICAoaWYgaXQgaXMgYSBwYWNrYWdlKS4gIEFjY2VwdHMgY29tbWEgc2VwYXJhdGVkCisgICAgICAgICAgICAgICAgICAgICAgbGlzdCBvZiBtb2R1bGUgbmFtZXMKKy0taWdub3JlLWRpcj08ZGlyPiAgICBJZ25vcmUgZmlsZXMgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSAobXVsdGlwbGUKKyAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyBjYW4gYmUgam9pbmVkIGJ5IG9zLnBhdGhzZXApLgorIiIiICUgc3lzLmFyZ3ZbMF0pCisKK1BSQUdNQV9OT0NPVkVSID0gIiNwcmFnbWEgTk8gQ09WRVIiCisKKyMgU2ltcGxlIHJ4IHRvIGZpbmQgbGluZXMgd2l0aCBubyBjb2RlLgorcnhfYmxhbmsgPSByZS5jb21waWxlKHInXlxzKigjLiopPyQnKQorCitjbGFzcyBJZ25vcmU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZXMgPSBOb25lLCBkaXJzID0gTm9uZSk6CisgICAgICAgIHNlbGYuX21vZHMgPSBtb2R1bGVzIG9yIFtdCisgICAgICAgIHNlbGYuX2RpcnMgPSBkaXJzIG9yIFtdCisKKyAgICAgICAgc2VsZi5fZGlycyA9IG1hcChvcy5wYXRoLm5vcm1wYXRoLCBzZWxmLl9kaXJzKQorICAgICAgICBzZWxmLl9pZ25vcmUgPSB7ICc8c3RyaW5nPic6IDEgfQorCisgICAgZGVmIG5hbWVzKHNlbGYsIGZpbGVuYW1lLCBtb2R1bGVuYW1lKToKKyAgICAgICAgaWYgbW9kdWxlbmFtZSBpbiBzZWxmLl9pZ25vcmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faWdub3JlW21vZHVsZW5hbWVdCisKKyAgICAgICAgIyBoYXZlbid0IHNlZW4gdGhpcyBvbmUgYmVmb3JlLCBzbyBzZWUgaWYgdGhlIG1vZHVsZSBuYW1lIGlzCisgICAgICAgICMgb24gdGhlIGlnbm9yZSBsaXN0LiAgTmVlZCB0byB0YWtlIHNvbWUgY2FyZSBzaW5jZSBpZ25vcmluZworICAgICAgICAjICJjbXAiIG11c24ndCBtZWFuIGlnbm9yaW5nICJjbXBjYWNoZSIgYnV0IGlnbm9yaW5nCisgICAgICAgICMgIlNwYW0iIG11c3QgYWxzbyBtZWFuIGlnbm9yaW5nICJTcGFtLkVnZ3MiLgorICAgICAgICBmb3IgbW9kIGluIHNlbGYuX21vZHM6CisgICAgICAgICAgICBpZiBtb2QgPT0gbW9kdWxlbmFtZTogICMgSWRlbnRpY2FsIG5hbWVzLCBzbyBpZ25vcmUKKyAgICAgICAgICAgICAgICBzZWxmLl9pZ25vcmVbbW9kdWxlbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIG1vZHVsZSBpcyBhIHByb3BlciBzdWJtb2R1bGUgb2Ygc29tZXRoaW5nIG9uCisgICAgICAgICAgICAjIHRoZSBpZ25vcmUgbGlzdAorICAgICAgICAgICAgbiA9IGxlbihtb2QpCisgICAgICAgICAgICAjICh3aWxsIG5vdCBvdmVyZmxvdyBzaW5jZSBpZiB0aGUgZmlyc3QgbiBjaGFyYWN0ZXJzIGFyZSB0aGUKKyAgICAgICAgICAgICMgc2FtZSBhbmQgdGhlIG5hbWUgaGFzIG5vdCBhbHJlYWR5IG9jY3VycmVkLCB0aGVuIHRoZSBzaXplCisgICAgICAgICAgICAjIG9mICJuYW1lIiBpcyBncmVhdGVyIHRoYW4gdGhhdCBvZiAibW9kIikKKyAgICAgICAgICAgIGlmIG1vZCA9PSBtb2R1bGVuYW1lWzpuXSBhbmQgbW9kdWxlbmFtZVtuXSA9PSAnLic6CisgICAgICAgICAgICAgICAgc2VsZi5faWdub3JlW21vZHVsZW5hbWVdID0gMQorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgIyBOb3cgY2hlY2sgdGhhdCBfX2ZpbGVfXyBpc24ndCBpbiBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzCisgICAgICAgIGlmIGZpbGVuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAjIG11c3QgYmUgYSBidWlsdC1pbiwgc28gd2UgbXVzdCBpZ25vcmUKKyAgICAgICAgICAgIHNlbGYuX2lnbm9yZVttb2R1bGVuYW1lXSA9IDEKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgIyBJZ25vcmUgYSBmaWxlIHdoZW4gaXQgY29udGFpbnMgb25lIG9mIHRoZSBpZ25vcmFibGUgcGF0aHMKKyAgICAgICAgZm9yIGQgaW4gc2VsZi5fZGlyczoKKyAgICAgICAgICAgICMgVGhlICcrIG9zLnNlcCcgaXMgdG8gZW5zdXJlIHRoYXQgZCBpcyBhIHBhcmVudCBkaXJlY3RvcnksCisgICAgICAgICAgICAjIGFzIGNvbXBhcmVkIHRvIGNhc2VzIGxpa2U6CisgICAgICAgICAgICAjICBkID0gIi91c3IvbG9jYWwiCisgICAgICAgICAgICAjICBmaWxlbmFtZSA9ICIvdXNyL2xvY2FsLnB5IgorICAgICAgICAgICAgIyBvcgorICAgICAgICAgICAgIyAgZCA9ICIvdXNyL2xvY2FsLnB5IgorICAgICAgICAgICAgIyAgZmlsZW5hbWUgPSAiL3Vzci9sb2NhbC5weSIKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lLnN0YXJ0c3dpdGgoZCArIG9zLnNlcCk6CisgICAgICAgICAgICAgICAgc2VsZi5faWdub3JlW21vZHVsZW5hbWVdID0gMQorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgIyBUcmllZCB0aGUgZGlmZmVyZW50IHdheXMsIHNvIHdlIGRvbid0IGlnbm9yZSB0aGlzIG1vZHVsZQorICAgICAgICBzZWxmLl9pZ25vcmVbbW9kdWxlbmFtZV0gPSAwCisgICAgICAgIHJldHVybiAwCisKK2RlZiBtb2RuYW1lKHBhdGgpOgorICAgICIiIlJldHVybiBhIHBsYXVzaWJsZSBtb2R1bGUgbmFtZSBmb3IgdGhlIHBhdGNoLiIiIgorCisgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKKyAgICBmaWxlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChiYXNlKQorICAgIHJldHVybiBmaWxlbmFtZQorCitkZWYgZnVsbG1vZG5hbWUocGF0aCk6CisgICAgIiIiUmV0dXJuIGEgcGxhdXNpYmxlIG1vZHVsZSBuYW1lIGZvciB0aGUgcGF0aC4iIiIKKworICAgICMgSWYgdGhlIGZpbGUgJ3BhdGgnIGlzIHBhcnQgb2YgYSBwYWNrYWdlLCB0aGVuIHRoZSBmaWxlbmFtZSBpc24ndAorICAgICMgZW5vdWdoIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGl0LiAgVHJ5IHRvIGRvIHRoZSByaWdodCB0aGluZyBieQorICAgICMgbG9va2luZyBpbiBzeXMucGF0aCBmb3IgdGhlIGxvbmdlc3QgbWF0Y2hpbmcgcHJlZml4LiAgV2UnbGwKKyAgICAjIGFzc3VtZSB0aGF0IHRoZSByZXN0IGlzIHRoZSBwYWNrYWdlIG5hbWUuCisKKyAgICBjb21wYXJlcGF0aCA9IG9zLnBhdGgubm9ybWNhc2UocGF0aCkKKyAgICBsb25nZXN0ID0gIiIKKyAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgorICAgICAgICBkaXIgPSBvcy5wYXRoLm5vcm1jYXNlKGRpcikKKyAgICAgICAgaWYgY29tcGFyZXBhdGguc3RhcnRzd2l0aChkaXIpIGFuZCBjb21wYXJlcGF0aFtsZW4oZGlyKV0gPT0gb3Muc2VwOgorICAgICAgICAgICAgaWYgbGVuKGRpcikgPiBsZW4obG9uZ2VzdCk6CisgICAgICAgICAgICAgICAgbG9uZ2VzdCA9IGRpcgorCisgICAgaWYgbG9uZ2VzdDoKKyAgICAgICAgYmFzZSA9IHBhdGhbbGVuKGxvbmdlc3QpICsgMTpdCisgICAgZWxzZToKKyAgICAgICAgYmFzZSA9IHBhdGgKKyAgICAjIHRoZSBkcml2ZSBsZXR0ZXIgaXMgbmV2ZXIgcGFydCBvZiB0aGUgbW9kdWxlIG5hbWUKKyAgICBkcml2ZSwgYmFzZSA9IG9zLnBhdGguc3BsaXRkcml2ZShiYXNlKQorICAgIGJhc2UgPSBiYXNlLnJlcGxhY2Uob3Muc2VwLCAiLiIpCisgICAgaWYgb3MuYWx0c2VwOgorICAgICAgICBiYXNlID0gYmFzZS5yZXBsYWNlKG9zLmFsdHNlcCwgIi4iKQorICAgIGZpbGVuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2UpCisgICAgcmV0dXJuIGZpbGVuYW1lLmxzdHJpcCgiLiIpCisKK2NsYXNzIENvdmVyYWdlUmVzdWx0czoKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY291bnRzPU5vbmUsIGNhbGxlZGZ1bmNzPU5vbmUsIGluZmlsZT1Ob25lLAorICAgICAgICAgICAgICAgICBjYWxsZXJzPU5vbmUsIG91dGZpbGU9Tm9uZSk6CisgICAgICAgIHNlbGYuY291bnRzID0gY291bnRzCisgICAgICAgIGlmIHNlbGYuY291bnRzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmNvdW50cyA9IHt9CisgICAgICAgIHNlbGYuY291bnRlciA9IHNlbGYuY291bnRzLmNvcHkoKSAjIG1hcCAoZmlsZW5hbWUsIGxpbmVubykgdG8gY291bnQKKyAgICAgICAgc2VsZi5jYWxsZWRmdW5jcyA9IGNhbGxlZGZ1bmNzCisgICAgICAgIGlmIHNlbGYuY2FsbGVkZnVuY3MgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2FsbGVkZnVuY3MgPSB7fQorICAgICAgICBzZWxmLmNhbGxlZGZ1bmNzID0gc2VsZi5jYWxsZWRmdW5jcy5jb3B5KCkKKyAgICAgICAgc2VsZi5jYWxsZXJzID0gY2FsbGVycworICAgICAgICBpZiBzZWxmLmNhbGxlcnMgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuY2FsbGVycyA9IHt9CisgICAgICAgIHNlbGYuY2FsbGVycyA9IHNlbGYuY2FsbGVycy5jb3B5KCkKKyAgICAgICAgc2VsZi5pbmZpbGUgPSBpbmZpbGUKKyAgICAgICAgc2VsZi5vdXRmaWxlID0gb3V0ZmlsZQorICAgICAgICBpZiBzZWxmLmluZmlsZToKKyAgICAgICAgICAgICMgVHJ5IHRvIG1lcmdlIGV4aXN0aW5nIGNvdW50cyBmaWxlLgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvdW50cywgY2FsbGVkZnVuY3MsIGNhbGxlcnMgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICBwaWNrbGUubG9hZChvcGVuKHNlbGYuaW5maWxlLCAncmInKSkKKyAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZShzZWxmLl9fY2xhc3NfXyhjb3VudHMsIGNhbGxlZGZ1bmNzLCBjYWxsZXJzKSkKKyAgICAgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgRU9GRXJyb3IsIFZhbHVlRXJyb3IpLCBlcnI6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgKCJTa2lwcGluZyBjb3VudHMgZmlsZSAlcjogJXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuaW5maWxlLCBlcnIpKQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBvdGhlcik6CisgICAgICAgICIiIk1lcmdlIGluIHRoZSBkYXRhIGZyb20gYW5vdGhlciBDb3ZlcmFnZVJlc3VsdHMiIiIKKyAgICAgICAgY291bnRzID0gc2VsZi5jb3VudHMKKyAgICAgICAgY2FsbGVkZnVuY3MgPSBzZWxmLmNhbGxlZGZ1bmNzCisgICAgICAgIGNhbGxlcnMgPSBzZWxmLmNhbGxlcnMKKyAgICAgICAgb3RoZXJfY291bnRzID0gb3RoZXIuY291bnRzCisgICAgICAgIG90aGVyX2NhbGxlZGZ1bmNzID0gb3RoZXIuY2FsbGVkZnVuY3MKKyAgICAgICAgb3RoZXJfY2FsbGVycyA9IG90aGVyLmNhbGxlcnMKKworICAgICAgICBmb3Iga2V5IGluIG90aGVyX2NvdW50cy5rZXlzKCk6CisgICAgICAgICAgICBjb3VudHNba2V5XSA9IGNvdW50cy5nZXQoa2V5LCAwKSArIG90aGVyX2NvdW50c1trZXldCisKKyAgICAgICAgZm9yIGtleSBpbiBvdGhlcl9jYWxsZWRmdW5jcy5rZXlzKCk6CisgICAgICAgICAgICBjYWxsZWRmdW5jc1trZXldID0gMQorCisgICAgICAgIGZvciBrZXkgaW4gb3RoZXJfY2FsbGVycy5rZXlzKCk6CisgICAgICAgICAgICBjYWxsZXJzW2tleV0gPSAxCisKKyAgICBkZWYgd3JpdGVfcmVzdWx0cyhzZWxmLCBzaG93X21pc3Npbmc9VHJ1ZSwgc3VtbWFyeT1GYWxzZSwgY292ZXJkaXI9Tm9uZSk6CisgICAgICAgICIiIgorICAgICAgICBAcGFyYW0gY292ZXJkaXIKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYuY2FsbGVkZnVuY3M6CisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgImZ1bmN0aW9ucyBjYWxsZWQ6IgorICAgICAgICAgICAgY2FsbHMgPSBzZWxmLmNhbGxlZGZ1bmNzLmtleXMoKQorICAgICAgICAgICAgY2FsbHMuc29ydCgpCisgICAgICAgICAgICBmb3IgZmlsZW5hbWUsIG1vZHVsZW5hbWUsIGZ1bmNuYW1lIGluIGNhbGxzOgorICAgICAgICAgICAgICAgIHByaW50ICgiZmlsZW5hbWU6ICVzLCBtb2R1bGVuYW1lOiAlcywgZnVuY25hbWU6ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAlIChmaWxlbmFtZSwgbW9kdWxlbmFtZSwgZnVuY25hbWUpKQorCisgICAgICAgIGlmIHNlbGYuY2FsbGVyczoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAiY2FsbGluZyByZWxhdGlvbnNoaXBzOiIKKyAgICAgICAgICAgIGNhbGxzID0gc2VsZi5jYWxsZXJzLmtleXMoKQorICAgICAgICAgICAgY2FsbHMuc29ydCgpCisgICAgICAgICAgICBsYXN0ZmlsZSA9IGxhc3RjZmlsZSA9ICIiCisgICAgICAgICAgICBmb3IgKChwZmlsZSwgcG1vZCwgcGZ1bmMpLCAoY2ZpbGUsIGNtb2QsIGNmdW5jKSkgaW4gY2FsbHM6CisgICAgICAgICAgICAgICAgaWYgcGZpbGUgIT0gbGFzdGZpbGU6CisgICAgICAgICAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIqKioiLCBwZmlsZSwgIioqKiIKKyAgICAgICAgICAgICAgICAgICAgbGFzdGZpbGUgPSBwZmlsZQorICAgICAgICAgICAgICAgICAgICBsYXN0Y2ZpbGUgPSAiIgorICAgICAgICAgICAgICAgIGlmIGNmaWxlICE9IHBmaWxlIGFuZCBsYXN0Y2ZpbGUgIT0gY2ZpbGU6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIgIC0tPiIsIGNmaWxlCisgICAgICAgICAgICAgICAgICAgIGxhc3RjZmlsZSA9IGNmaWxlCisgICAgICAgICAgICAgICAgcHJpbnQgIiAgICAlcy4lcyAtPiAlcy4lcyIgJSAocG1vZCwgcGZ1bmMsIGNtb2QsIGNmdW5jKQorCisgICAgICAgICMgdHVybiB0aGUgY291bnRzIGRhdGEgKCIoZmlsZW5hbWUsIGxpbmVubykgPSBjb3VudCIpIGludG8gc29tZXRoaW5nCisgICAgICAgICMgYWNjZXNzaWJsZSBvbiBhIHBlci1maWxlIGJhc2lzCisgICAgICAgIHBlcl9maWxlID0ge30KKyAgICAgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8gaW4gc2VsZi5jb3VudHMua2V5cygpOgorICAgICAgICAgICAgbGluZXNfaGl0ID0gcGVyX2ZpbGVbZmlsZW5hbWVdID0gcGVyX2ZpbGUuZ2V0KGZpbGVuYW1lLCB7fSkKKyAgICAgICAgICAgIGxpbmVzX2hpdFtsaW5lbm9dID0gc2VsZi5jb3VudHNbKGZpbGVuYW1lLCBsaW5lbm8pXQorCisgICAgICAgICMgYWNjdW11bGF0ZSBzdW1tYXJ5IGluZm8sIGlmIG5lZWRlZAorICAgICAgICBzdW1zID0ge30KKworICAgICAgICBmb3IgZmlsZW5hbWUsIGNvdW50IGluIHBlcl9maWxlLml0ZXJpdGVtcygpOgorICAgICAgICAgICAgIyBza2lwIHNvbWUgImZpbGVzIiB3ZSBkb24ndCBjYXJlIGFib3V0Li4uCisgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAiPHN0cmluZz4iOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBmaWxlbmFtZS5zdGFydHN3aXRoKCI8ZG9jdGVzdCAiKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICBpZiBmaWxlbmFtZS5lbmRzd2l0aCgoIi5weWMiLCAiLnB5byIpKToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KKworICAgICAgICAgICAgaWYgY292ZXJkaXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkKKyAgICAgICAgICAgICAgICBtb2R1bGVuYW1lID0gbW9kbmFtZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGlyID0gY292ZXJkaXIKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZGlyKToKKyAgICAgICAgICAgICAgICAgICAgb3MubWFrZWRpcnMoZGlyKQorICAgICAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBmdWxsbW9kbmFtZShmaWxlbmFtZSkKKworICAgICAgICAgICAgIyBJZiBkZXNpcmVkLCBnZXQgYSBsaXN0IG9mIHRoZSBsaW5lIG51bWJlcnMgd2hpY2ggcmVwcmVzZW50CisgICAgICAgICAgICAjIGV4ZWN1dGFibGUgY29udGVudCAocmV0dXJuZWQgYXMgYSBkaWN0IGZvciBiZXR0ZXIgbG9va3VwIHNwZWVkKQorICAgICAgICAgICAgaWYgc2hvd19taXNzaW5nOgorICAgICAgICAgICAgICAgIGxub3RhYiA9IGZpbmRfZXhlY3V0YWJsZV9saW5lbm9zKGZpbGVuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsbm90YWIgPSB7fQorCisgICAgICAgICAgICBzb3VyY2UgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZW5hbWUpCisgICAgICAgICAgICBjb3ZlcnBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBtb2R1bGVuYW1lICsgIi5jb3ZlciIpCisgICAgICAgICAgICBuX2hpdHMsIG5fbGluZXMgPSBzZWxmLndyaXRlX3Jlc3VsdHNfZmlsZShjb3ZlcnBhdGgsIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxub3RhYiwgY291bnQpCisKKyAgICAgICAgICAgIGlmIHN1bW1hcnkgYW5kIG5fbGluZXM6CisgICAgICAgICAgICAgICAgcGVyY2VudCA9IDEwMCAqIG5faGl0cyAvLyBuX2xpbmVzCisgICAgICAgICAgICAgICAgc3Vtc1ttb2R1bGVuYW1lXSA9IG5fbGluZXMsIHBlcmNlbnQsIG1vZHVsZW5hbWUsIGZpbGVuYW1lCisKKyAgICAgICAgaWYgc3VtbWFyeSBhbmQgc3VtczoKKyAgICAgICAgICAgIG1vZHMgPSBzdW1zLmtleXMoKQorICAgICAgICAgICAgbW9kcy5zb3J0KCkKKyAgICAgICAgICAgIHByaW50ICJsaW5lcyAgIGNvdiUgICBtb2R1bGUgICAocGF0aCkiCisgICAgICAgICAgICBmb3IgbSBpbiBtb2RzOgorICAgICAgICAgICAgICAgIG5fbGluZXMsIHBlcmNlbnQsIG1vZHVsZW5hbWUsIGZpbGVuYW1lID0gc3Vtc1ttXQorICAgICAgICAgICAgICAgIHByaW50ICIlNWQgICAlM2QlJSAgICVzICAgKCVzKSIgJSBzdW1zW21dCisKKyAgICAgICAgaWYgc2VsZi5vdXRmaWxlOgorICAgICAgICAgICAgIyB0cnkgYW5kIHN0b3JlIGNvdW50cyBhbmQgbW9kdWxlIGluZm8gaW50byBzZWxmLm91dGZpbGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBwaWNrbGUuZHVtcCgoc2VsZi5jb3VudHMsIHNlbGYuY2FsbGVkZnVuY3MsIHNlbGYuY2FsbGVycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbihzZWxmLm91dGZpbGUsICd3YicpLCAxKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiQ2FuJ3Qgc2F2ZSBjb3VudHMgZmlsZXMgYmVjYXVzZSAlcyIgJSBlcnIKKworICAgIGRlZiB3cml0ZV9yZXN1bHRzX2ZpbGUoc2VsZiwgcGF0aCwgbGluZXMsIGxub3RhYiwgbGluZXNfaGl0KToKKyAgICAgICAgIiIiUmV0dXJuIGEgY292ZXJhZ2UgcmVzdWx0cyBmaWxlIGluIHBhdGguIiIiCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3V0ZmlsZSA9IG9wZW4ocGF0aCwgInciKQorICAgICAgICBleGNlcHQgSU9FcnJvciwgZXJyOgorICAgICAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgKCJ0cmFjZTogQ291bGQgbm90IG9wZW4gJXIgZm9yIHdyaXRpbmc6ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItIHNraXBwaW5nIiAlIChwYXRoLCBlcnIpKQorICAgICAgICAgICAgcmV0dXJuIDAsIDAKKworICAgICAgICBuX2xpbmVzID0gMAorICAgICAgICBuX2hpdHMgPSAwCisgICAgICAgIGZvciBpLCBsaW5lIGluIGVudW1lcmF0ZShsaW5lcyk6CisgICAgICAgICAgICBsaW5lbm8gPSBpICsgMQorICAgICAgICAgICAgIyBkbyB0aGUgYmxhbmsvY29tbWVudCBtYXRjaCB0byB0cnkgdG8gbWFyayBtb3JlIGxpbmVzCisgICAgICAgICAgICAjIChoZWxwIHRoZSByZWFkZXIgZmluZCBzdHVmZiB0aGF0IGhhc24ndCBiZWVuIGNvdmVyZWQpCisgICAgICAgICAgICBpZiBsaW5lbm8gaW4gbGluZXNfaGl0OgorICAgICAgICAgICAgICAgIG91dGZpbGUud3JpdGUoIiU1ZDogIiAlIGxpbmVzX2hpdFtsaW5lbm9dKQorICAgICAgICAgICAgICAgIG5faGl0cyArPSAxCisgICAgICAgICAgICAgICAgbl9saW5lcyArPSAxCisgICAgICAgICAgICBlbGlmIHJ4X2JsYW5rLm1hdGNoKGxpbmUpOgorICAgICAgICAgICAgICAgIG91dGZpbGUud3JpdGUoIiAgICAgICAiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGxpbmVzIHByZWNlZGVkIGJ5IG5vIG1hcmtzIHdlcmVuJ3QgaGl0CisgICAgICAgICAgICAgICAgIyBIaWdobGlnaHQgdGhlbSBpZiBzbyBpbmRpY2F0ZWQsIHVubGVzcyB0aGUgbGluZSBjb250YWlucworICAgICAgICAgICAgICAgICMgI3ByYWdtYTogTk8gQ09WRVIKKyAgICAgICAgICAgICAgICBpZiBsaW5lbm8gaW4gbG5vdGFiIGFuZCBub3QgUFJBR01BX05PQ09WRVIgaW4gbGluZXNbaV06CisgICAgICAgICAgICAgICAgICAgIG91dGZpbGUud3JpdGUoIj4+Pj4+PiAiKQorICAgICAgICAgICAgICAgICAgICBuX2xpbmVzICs9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvdXRmaWxlLndyaXRlKCIgICAgICAgIikKKyAgICAgICAgICAgIG91dGZpbGUud3JpdGUobGluZXNbaV0uZXhwYW5kdGFicyg4KSkKKyAgICAgICAgb3V0ZmlsZS5jbG9zZSgpCisKKyAgICAgICAgcmV0dXJuIG5faGl0cywgbl9saW5lcworCitkZWYgZmluZF9saW5lc19mcm9tX2NvZGUoY29kZSwgc3Rycyk6CisgICAgIiIiUmV0dXJuIGRpY3Qgd2hlcmUga2V5cyBhcmUgbGluZXMgaW4gdGhlIGxpbmUgbnVtYmVyIHRhYmxlLiIiIgorICAgIGxpbmVub3MgPSB7fQorCisgICAgZm9yIF8sIGxpbmVubyBpbiBkaXMuZmluZGxpbmVzdGFydHMoY29kZSk6CisgICAgICAgIGlmIGxpbmVubyBub3QgaW4gc3RyczoKKyAgICAgICAgICAgIGxpbmVub3NbbGluZW5vXSA9IDEKKworICAgIHJldHVybiBsaW5lbm9zCisKK2RlZiBmaW5kX2xpbmVzKGNvZGUsIHN0cnMpOgorICAgICIiIlJldHVybiBsaW5lbm8gZGljdCBmb3IgYWxsIGNvZGUgb2JqZWN0cyByZWFjaGFibGUgZnJvbSBjb2RlLiIiIgorICAgICMgZ2V0IGFsbCBvZiB0aGUgbGluZW5vIGluZm9ybWF0aW9uIGZyb20gdGhlIGNvZGUgb2YgdGhpcyBzY29wZSBsZXZlbAorICAgIGxpbmVub3MgPSBmaW5kX2xpbmVzX2Zyb21fY29kZShjb2RlLCBzdHJzKQorCisgICAgIyBhbmQgY2hlY2sgdGhlIGNvbnN0YW50cyBmb3IgcmVmZXJlbmNlcyB0byBvdGhlciBjb2RlIG9iamVjdHMKKyAgICBmb3IgYyBpbiBjb2RlLmNvX2NvbnN0czoKKyAgICAgICAgaWYgaW5zcGVjdC5pc2NvZGUoYyk6CisgICAgICAgICAgICAjIGZpbmQgYW5vdGhlciBjb2RlIG9iamVjdCwgc28gcmVjdXJzZSBpbnRvIGl0CisgICAgICAgICAgICBsaW5lbm9zLnVwZGF0ZShmaW5kX2xpbmVzKGMsIHN0cnMpKQorICAgIHJldHVybiBsaW5lbm9zCisKK2RlZiBmaW5kX3N0cmluZ3MoZmlsZW5hbWUpOgorICAgICIiIlJldHVybiBhIGRpY3Qgb2YgcG9zc2libGUgZG9jc3RyaW5nIHBvc2l0aW9ucy4KKworICAgIFRoZSBkaWN0IG1hcHMgbGluZSBudW1iZXJzIHRvIHN0cmluZ3MuICBUaGVyZSBpcyBhbiBlbnRyeSBmb3IKKyAgICBsaW5lIHRoYXQgY29udGFpbnMgb25seSBhIHN0cmluZyBvciBhIHBhcnQgb2YgYSB0cmlwbGUtcXVvdGVkCisgICAgc3RyaW5nLgorICAgICIiIgorICAgIGQgPSB7fQorICAgICMgSWYgdGhlIGZpcnN0IHRva2VuIGlzIGEgc3RyaW5nLCB0aGVuIGl0J3MgdGhlIG1vZHVsZSBkb2NzdHJpbmcuCisgICAgIyBBZGQgdGhpcyBzcGVjaWFsIGNhc2Ugc28gdGhhdCB0aGUgdGVzdCBpbiB0aGUgbG9vcCBwYXNzZXMuCisgICAgcHJldl90dHlwZSA9IHRva2VuLklOREVOVAorICAgIGYgPSBvcGVuKGZpbGVuYW1lKQorICAgIGZvciB0dHlwZSwgdHN0ciwgc3RhcnQsIGVuZCwgbGluZSBpbiB0b2tlbml6ZS5nZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSk6CisgICAgICAgIGlmIHR0eXBlID09IHRva2VuLlNUUklORzoKKyAgICAgICAgICAgIGlmIHByZXZfdHR5cGUgPT0gdG9rZW4uSU5ERU5UOgorICAgICAgICAgICAgICAgIHNsaW5lLCBzY29sID0gc3RhcnQKKyAgICAgICAgICAgICAgICBlbGluZSwgZWNvbCA9IGVuZAorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNsaW5lLCBlbGluZSArIDEpOgorICAgICAgICAgICAgICAgICAgICBkW2ldID0gMQorICAgICAgICBwcmV2X3R0eXBlID0gdHR5cGUKKyAgICBmLmNsb3NlKCkKKyAgICByZXR1cm4gZAorCitkZWYgZmluZF9leGVjdXRhYmxlX2xpbmVub3MoZmlsZW5hbWUpOgorICAgICIiIlJldHVybiBkaWN0IHdoZXJlIGtleXMgYXJlIGxpbmUgbnVtYmVycyBpbiB0aGUgbGluZSBudW1iZXIgdGFibGUuIiIiCisgICAgdHJ5OgorICAgICAgICBwcm9nID0gb3BlbihmaWxlbmFtZSwgInJVIikucmVhZCgpCisgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgcHJpbnQgPj4gc3lzLnN0ZGVyciwgKCJOb3QgcHJpbnRpbmcgY292ZXJhZ2UgZGF0YSBmb3IgJXI6ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZmlsZW5hbWUsIGVycikpCisgICAgICAgIHJldHVybiB7fQorICAgIGNvZGUgPSBjb21waWxlKHByb2csIGZpbGVuYW1lLCAiZXhlYyIpCisgICAgc3RycyA9IGZpbmRfc3RyaW5ncyhmaWxlbmFtZSkKKyAgICByZXR1cm4gZmluZF9saW5lcyhjb2RlLCBzdHJzKQorCitjbGFzcyBUcmFjZToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY291bnQ9MSwgdHJhY2U9MSwgY291bnRmdW5jcz0wLCBjb3VudGNhbGxlcnM9MCwKKyAgICAgICAgICAgICAgICAgaWdub3JlbW9kcz0oKSwgaWdub3JlZGlycz0oKSwgaW5maWxlPU5vbmUsIG91dGZpbGU9Tm9uZSwKKyAgICAgICAgICAgICAgICAgdGltaW5nPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIEBwYXJhbSBjb3VudCB0cnVlIGlmZiBpdCBzaG91bGQgY291bnQgbnVtYmVyIG9mIHRpbWVzIGVhY2gKKyAgICAgICAgICAgICAgICAgICAgIGxpbmUgaXMgZXhlY3V0ZWQKKyAgICAgICAgQHBhcmFtIHRyYWNlIHRydWUgaWZmIGl0IHNob3VsZCBwcmludCBvdXQgZWFjaCBsaW5lIHRoYXQgaXMKKyAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGNvdW50ZWQKKyAgICAgICAgQHBhcmFtIGNvdW50ZnVuY3MgdHJ1ZSBpZmYgaXQgc2hvdWxkIGp1c3Qgb3V0cHV0IGEgbGlzdCBvZgorICAgICAgICAgICAgICAgICAgICAgKGZpbGVuYW1lLCBtb2R1bGVuYW1lLCBmdW5jbmFtZSwpIGZvciBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2VyZSBjYWxsZWQgYXQgbGVhc3Qgb25jZTsgIFRoaXMgb3ZlcnJpZGVzCisgICAgICAgICAgICAgICAgICAgICBgY291bnQnIGFuZCBgdHJhY2UnCisgICAgICAgIEBwYXJhbSBpZ25vcmVtb2RzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgbW9kdWxlcyB0byBpZ25vcmUKKyAgICAgICAgQHBhcmFtIGlnbm9yZWRpcnMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBkaXJlY3RvcmllcyB0byBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgIGFsbCBvZiB0aGUgKHJlY3Vyc2l2ZSkgY29udGVudHMgb2YKKyAgICAgICAgQHBhcmFtIGluZmlsZSBmaWxlIGZyb20gd2hpY2ggdG8gcmVhZCBzdG9yZWQgY291bnRzIHRvIGJlCisgICAgICAgICAgICAgICAgICAgICBhZGRlZCBpbnRvIHRoZSByZXN1bHRzCisgICAgICAgIEBwYXJhbSBvdXRmaWxlIGZpbGUgaW4gd2hpY2ggdG8gd3JpdGUgdGhlIHJlc3VsdHMKKyAgICAgICAgQHBhcmFtIHRpbWluZyB0cnVlIGlmZiB0aW1pbmcgaW5mb3JtYXRpb24gYmUgZGlzcGxheWVkCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmluZmlsZSA9IGluZmlsZQorICAgICAgICBzZWxmLm91dGZpbGUgPSBvdXRmaWxlCisgICAgICAgIHNlbGYuaWdub3JlID0gSWdub3JlKGlnbm9yZW1vZHMsIGlnbm9yZWRpcnMpCisgICAgICAgIHNlbGYuY291bnRzID0ge30gICAjIGtleXMgYXJlIChmaWxlbmFtZSwgbGluZW51bWJlcikKKyAgICAgICAgc2VsZi5ibGFiYmVkID0ge30gIyBmb3IgZGVidWdnaW5nCisgICAgICAgIHNlbGYucGF0aHRvYmFzZW5hbWUgPSB7fSAjIGZvciBtZW1vaXppbmcgb3MucGF0aC5iYXNlbmFtZQorICAgICAgICBzZWxmLmRvbm90aGluZyA9IDAKKyAgICAgICAgc2VsZi50cmFjZSA9IHRyYWNlCisgICAgICAgIHNlbGYuX2NhbGxlZGZ1bmNzID0ge30KKyAgICAgICAgc2VsZi5fY2FsbGVycyA9IHt9CisgICAgICAgIHNlbGYuX2NhbGxlcl9jYWNoZSA9IHt9CisgICAgICAgIHNlbGYuc3RhcnRfdGltZSA9IE5vbmUKKyAgICAgICAgaWYgdGltaW5nOgorICAgICAgICAgICAgc2VsZi5zdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICAgICAgaWYgY291bnRjYWxsZXJzOgorICAgICAgICAgICAgc2VsZi5nbG9iYWx0cmFjZSA9IHNlbGYuZ2xvYmFsdHJhY2VfdHJhY2tjYWxsZXJzCisgICAgICAgIGVsaWYgY291bnRmdW5jczoKKyAgICAgICAgICAgIHNlbGYuZ2xvYmFsdHJhY2UgPSBzZWxmLmdsb2JhbHRyYWNlX2NvdW50ZnVuY3MKKyAgICAgICAgZWxpZiB0cmFjZSBhbmQgY291bnQ6CisgICAgICAgICAgICBzZWxmLmdsb2JhbHRyYWNlID0gc2VsZi5nbG9iYWx0cmFjZV9sdAorICAgICAgICAgICAgc2VsZi5sb2NhbHRyYWNlID0gc2VsZi5sb2NhbHRyYWNlX3RyYWNlX2FuZF9jb3VudAorICAgICAgICBlbGlmIHRyYWNlOgorICAgICAgICAgICAgc2VsZi5nbG9iYWx0cmFjZSA9IHNlbGYuZ2xvYmFsdHJhY2VfbHQKKyAgICAgICAgICAgIHNlbGYubG9jYWx0cmFjZSA9IHNlbGYubG9jYWx0cmFjZV90cmFjZQorICAgICAgICBlbGlmIGNvdW50OgorICAgICAgICAgICAgc2VsZi5nbG9iYWx0cmFjZSA9IHNlbGYuZ2xvYmFsdHJhY2VfbHQKKyAgICAgICAgICAgIHNlbGYubG9jYWx0cmFjZSA9IHNlbGYubG9jYWx0cmFjZV9jb3VudAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBBaGVtIC0tIGRvIG5vdGhpbmc/ICBPa2F5LgorICAgICAgICAgICAgc2VsZi5kb25vdGhpbmcgPSAxCisKKyAgICBkZWYgcnVuKHNlbGYsIGNtZCk6CisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBkaWN0ID0gX19tYWluX18uX19kaWN0X18KKyAgICAgICAgc2VsZi5ydW5jdHgoY21kLCBkaWN0LCBkaWN0KQorCisgICAgZGVmIHJ1bmN0eChzZWxmLCBjbWQsIGdsb2JhbHM9Tm9uZSwgbG9jYWxzPU5vbmUpOgorICAgICAgICBpZiBnbG9iYWxzIGlzIE5vbmU6IGdsb2JhbHMgPSB7fQorICAgICAgICBpZiBsb2NhbHMgaXMgTm9uZTogbG9jYWxzID0ge30KKyAgICAgICAgaWYgbm90IHNlbGYuZG9ub3RoaW5nOgorICAgICAgICAgICAgX3NldHRyYWNlKHNlbGYuZ2xvYmFsdHJhY2UpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWMgY21kIGluIGdsb2JhbHMsIGxvY2FscworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbm90IHNlbGYuZG9ub3RoaW5nOgorICAgICAgICAgICAgICAgIF91bnNldHRyYWNlKCkKKworICAgIGRlZiBydW5mdW5jKHNlbGYsIGZ1bmMsICphcmdzLCAqKmt3KToKKyAgICAgICAgcmVzdWx0ID0gTm9uZQorICAgICAgICBpZiBub3Qgc2VsZi5kb25vdGhpbmc6CisgICAgICAgICAgICBzeXMuc2V0dHJhY2Uoc2VsZi5nbG9iYWx0cmFjZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gZnVuYygqYXJncywgKiprdykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRvbm90aGluZzoKKyAgICAgICAgICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGZpbGVfbW9kdWxlX2Z1bmN0aW9uX29mKHNlbGYsIGZyYW1lKToKKyAgICAgICAgY29kZSA9IGZyYW1lLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgaWYgZmlsZW5hbWU6CisgICAgICAgICAgICBtb2R1bGVuYW1lID0gbW9kbmFtZShmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZHVsZW5hbWUgPSBOb25lCisKKyAgICAgICAgZnVuY25hbWUgPSBjb2RlLmNvX25hbWUKKyAgICAgICAgY2xzbmFtZSA9IE5vbmUKKyAgICAgICAgaWYgY29kZSBpbiBzZWxmLl9jYWxsZXJfY2FjaGU6CisgICAgICAgICAgICBpZiBzZWxmLl9jYWxsZXJfY2FjaGVbY29kZV0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY2xzbmFtZSA9IHNlbGYuX2NhbGxlcl9jYWNoZVtjb2RlXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY2FsbGVyX2NhY2hlW2NvZGVdID0gTm9uZQorICAgICAgICAgICAgIyMgdXNlIG9mIGdjLmdldF9yZWZlcnJlcnMoKSB3YXMgc3VnZ2VzdGVkIGJ5IE1pY2hhZWwgSHVkc29uCisgICAgICAgICAgICAjIGFsbCBmdW5jdGlvbnMgd2hpY2ggcmVmZXIgdG8gdGhpcyBjb2RlIG9iamVjdAorICAgICAgICAgICAgZnVuY3MgPSBbZiBmb3IgZiBpbiBnYy5nZXRfcmVmZXJyZXJzKGNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaW5zcGVjdC5pc2Z1bmN0aW9uKGYpXQorICAgICAgICAgICAgIyByZXF1aXJlIGxlbihmdW5jKSA9PSAxIHRvIGF2b2lkIGFtYmlndWl0eSBjYXVzZWQgYnkgY2FsbHMgdG8KKyAgICAgICAgICAgICMgbmV3LmZ1bmN0aW9uKCk6ICJJbiB0aGUgZmFjZSBvZiBhbWJpZ3VpdHksIHJlZnVzZSB0aGUKKyAgICAgICAgICAgICMgdGVtcHRhdGlvbiB0byBndWVzcy4iCisgICAgICAgICAgICBpZiBsZW4oZnVuY3MpID09IDE6CisgICAgICAgICAgICAgICAgZGljdHMgPSBbZCBmb3IgZCBpbiBnYy5nZXRfcmVmZXJyZXJzKGZ1bmNzWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGQsIGRpY3QpXQorICAgICAgICAgICAgICAgIGlmIGxlbihkaWN0cykgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyA9IFtjIGZvciBjIGluIGdjLmdldF9yZWZlcnJlcnMoZGljdHNbMF0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoYywgIl9fYmFzZXNfXyIpXQorICAgICAgICAgICAgICAgICAgICBpZiBsZW4oY2xhc3NlcykgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZGl0dG8gZm9yIG5ldy5jbGFzc29iaigpCisgICAgICAgICAgICAgICAgICAgICAgICBjbHNuYW1lID0gY2xhc3Nlc1swXS5fX25hbWVfXworICAgICAgICAgICAgICAgICAgICAgICAgIyBjYWNoZSB0aGUgcmVzdWx0IC0gYXNzdW1wdGlvbiBpcyB0aGF0IG5ldy4qIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAjIG5vdCBjYWxsZWQgbGF0ZXIgdG8gZGlzdHVyYiB0aGlzIHJlbGF0aW9uc2hpcAorICAgICAgICAgICAgICAgICAgICAgICAgIyBfY2FsbGVyX2NhY2hlIGNvdWxkIGJlIGZsdXNoZWQgaWYgZnVuY3Rpb25zIGluCisgICAgICAgICAgICAgICAgICAgICAgICAjIHRoZSBuZXcgbW9kdWxlIGdldCBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYWxsZXJfY2FjaGVbY29kZV0gPSBjbHNuYW1lCisgICAgICAgIGlmIGNsc25hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmdW5jbmFtZSA9ICIlcy4lcyIgJSAoY2xzbmFtZSwgZnVuY25hbWUpCisKKyAgICAgICAgcmV0dXJuIGZpbGVuYW1lLCBtb2R1bGVuYW1lLCBmdW5jbmFtZQorCisgICAgZGVmIGdsb2JhbHRyYWNlX3RyYWNrY2FsbGVycyhzZWxmLCBmcmFtZSwgd2h5LCBhcmcpOgorICAgICAgICAiIiJIYW5kbGVyIGZvciBjYWxsIGV2ZW50cy4KKworICAgICAgICBBZGRzIGluZm9ybWF0aW9uIGFib3V0IHdobyBjYWxsZWQgd2hvIHRvIHRoZSBzZWxmLl9jYWxsZXJzIGRpY3QuCisgICAgICAgICIiIgorICAgICAgICBpZiB3aHkgPT0gJ2NhbGwnOgorICAgICAgICAgICAgIyBYWFggU2hvdWxkIGRvIGEgYmV0dGVyIGpvYiBvZiBpZGVudGlmeWluZyBtZXRob2RzCisgICAgICAgICAgICB0aGlzX2Z1bmMgPSBzZWxmLmZpbGVfbW9kdWxlX2Z1bmN0aW9uX29mKGZyYW1lKQorICAgICAgICAgICAgcGFyZW50X2Z1bmMgPSBzZWxmLmZpbGVfbW9kdWxlX2Z1bmN0aW9uX29mKGZyYW1lLmZfYmFjaykKKyAgICAgICAgICAgIHNlbGYuX2NhbGxlcnNbKHBhcmVudF9mdW5jLCB0aGlzX2Z1bmMpXSA9IDEKKworICAgIGRlZiBnbG9iYWx0cmFjZV9jb3VudGZ1bmNzKHNlbGYsIGZyYW1lLCB3aHksIGFyZyk6CisgICAgICAgICIiIkhhbmRsZXIgZm9yIGNhbGwgZXZlbnRzLgorCisgICAgICAgIEFkZHMgKGZpbGVuYW1lLCBtb2R1bGVuYW1lLCBmdW5jbmFtZSkgdG8gdGhlIHNlbGYuX2NhbGxlZGZ1bmNzIGRpY3QuCisgICAgICAgICIiIgorICAgICAgICBpZiB3aHkgPT0gJ2NhbGwnOgorICAgICAgICAgICAgdGhpc19mdW5jID0gc2VsZi5maWxlX21vZHVsZV9mdW5jdGlvbl9vZihmcmFtZSkKKyAgICAgICAgICAgIHNlbGYuX2NhbGxlZGZ1bmNzW3RoaXNfZnVuY10gPSAxCisKKyAgICBkZWYgZ2xvYmFsdHJhY2VfbHQoc2VsZiwgZnJhbWUsIHdoeSwgYXJnKToKKyAgICAgICAgIiIiSGFuZGxlciBmb3IgY2FsbCBldmVudHMuCisKKyAgICAgICAgSWYgdGhlIGNvZGUgYmxvY2sgYmVpbmcgZW50ZXJlZCBpcyB0byBiZSBpZ25vcmVkLCByZXR1cm5zIGBOb25lJywKKyAgICAgICAgZWxzZSByZXR1cm5zIHNlbGYubG9jYWx0cmFjZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdoeSA9PSAnY2FsbCc6CisgICAgICAgICAgICBjb2RlID0gZnJhbWUuZl9jb2RlCisgICAgICAgICAgICBmaWxlbmFtZSA9IGZyYW1lLmZfZ2xvYmFscy5nZXQoJ19fZmlsZV9fJywgTm9uZSkKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgICAgICMgWFhYIG1vZG5hbWUoKSBkb2Vzbid0IHdvcmsgcmlnaHQgZm9yIHBhY2thZ2VzLCBzbworICAgICAgICAgICAgICAgICMgdGhlIGlnbm9yZSBzdXBwb3J0IHdvbid0IHdvcmsgcmlnaHQgZm9yIHBhY2thZ2VzCisgICAgICAgICAgICAgICAgbW9kdWxlbmFtZSA9IG1vZG5hbWUoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgaWYgbW9kdWxlbmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWdub3JlX2l0ID0gc2VsZi5pZ25vcmUubmFtZXMoZmlsZW5hbWUsIG1vZHVsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBpZ25vcmVfaXQ6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLnRyYWNlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICgiIC0tLSBtb2R1bGVuYW1lOiAlcywgZnVuY25hbWU6ICVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIChtb2R1bGVuYW1lLCBjb2RlLmNvX25hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9jYWx0cmFjZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGxvY2FsdHJhY2VfdHJhY2VfYW5kX2NvdW50KHNlbGYsIGZyYW1lLCB3aHksIGFyZyk6CisgICAgICAgIGlmIHdoeSA9PSAibGluZSI6CisgICAgICAgICAgICAjIHJlY29yZCB0aGUgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBvZiBldmVyeSB0cmFjZQorICAgICAgICAgICAgZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIGxpbmVubyA9IGZyYW1lLmZfbGluZW5vCisgICAgICAgICAgICBrZXkgPSBmaWxlbmFtZSwgbGluZW5vCisgICAgICAgICAgICBzZWxmLmNvdW50c1trZXldID0gc2VsZi5jb3VudHMuZ2V0KGtleSwgMCkgKyAxCisKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhcnRfdGltZToKKyAgICAgICAgICAgICAgICBwcmludCAnJS4yZicgJSAodGltZS50aW1lKCkgLSBzZWxmLnN0YXJ0X3RpbWUpLAorICAgICAgICAgICAgYm5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorICAgICAgICAgICAgcHJpbnQgIiVzKCVkKTogJXMiICUgKGJuYW1lLCBsaW5lbm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykpLAorICAgICAgICByZXR1cm4gc2VsZi5sb2NhbHRyYWNlCisKKyAgICBkZWYgbG9jYWx0cmFjZV90cmFjZShzZWxmLCBmcmFtZSwgd2h5LCBhcmcpOgorICAgICAgICBpZiB3aHkgPT0gImxpbmUiOgorICAgICAgICAgICAgIyByZWNvcmQgdGhlIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgb2YgZXZlcnkgdHJhY2UKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICBsaW5lbm8gPSBmcmFtZS5mX2xpbmVubworCisgICAgICAgICAgICBpZiBzZWxmLnN0YXJ0X3RpbWU6CisgICAgICAgICAgICAgICAgcHJpbnQgJyUuMmYnICUgKHRpbWUudGltZSgpIC0gc2VsZi5zdGFydF90aW1lKSwKKyAgICAgICAgICAgIGJuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSkKKyAgICAgICAgICAgIHByaW50ICIlcyglZCk6ICVzIiAlIChibmFtZSwgbGluZW5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pKSwKKyAgICAgICAgcmV0dXJuIHNlbGYubG9jYWx0cmFjZQorCisgICAgZGVmIGxvY2FsdHJhY2VfY291bnQoc2VsZiwgZnJhbWUsIHdoeSwgYXJnKToKKyAgICAgICAgaWYgd2h5ID09ICJsaW5lIjoKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCisgICAgICAgICAgICBsaW5lbm8gPSBmcmFtZS5mX2xpbmVubworICAgICAgICAgICAga2V5ID0gZmlsZW5hbWUsIGxpbmVubworICAgICAgICAgICAgc2VsZi5jb3VudHNba2V5XSA9IHNlbGYuY291bnRzLmdldChrZXksIDApICsgMQorICAgICAgICByZXR1cm4gc2VsZi5sb2NhbHRyYWNlCisKKyAgICBkZWYgcmVzdWx0cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIENvdmVyYWdlUmVzdWx0cyhzZWxmLmNvdW50cywgaW5maWxlPXNlbGYuaW5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGZpbGU9c2VsZi5vdXRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlZGZ1bmNzPXNlbGYuX2NhbGxlZGZ1bmNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxlcnM9c2VsZi5fY2FsbGVycykKKworZGVmIF9lcnJfZXhpdChtc2cpOgorICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiAlc1xuIiAlIChzeXMuYXJndlswXSwgbXNnKSkKKyAgICBzeXMuZXhpdCgxKQorCitkZWYgbWFpbihhcmd2PU5vbmUpOgorICAgIGltcG9ydCBnZXRvcHQKKworICAgIGlmIGFyZ3YgaXMgTm9uZToKKyAgICAgICAgYXJndiA9IHN5cy5hcmd2CisgICAgdHJ5OgorICAgICAgICBvcHRzLCBwcm9nX2FyZ3YgPSBnZXRvcHQuZ2V0b3B0KGFyZ3ZbMTpdLCAidGNyUmY6ZDptc0M6bFRnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImhlbHAiLCAidmVyc2lvbiIsICJ0cmFjZSIsICJjb3VudCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXBvcnQiLCAibm8tcmVwb3J0IiwgInN1bW1hcnkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZT0iLCAibWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmUtbW9kdWxlPSIsICJpZ25vcmUtZGlyPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3ZlcmRpcj0iLCAibGlzdGZ1bmNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRyYWNrY2FsbHMiLCAidGltaW5nIl0pCisKKyAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIiVzOiAlc1xuIiAlIChzeXMuYXJndlswXSwgbXNnKSkKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiVHJ5IGAlcyAtLWhlbHAnIGZvciBtb3JlIGluZm9ybWF0aW9uXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgJSBzeXMuYXJndlswXSkKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIHRyYWNlID0gMAorICAgIGNvdW50ID0gMAorICAgIHJlcG9ydCA9IDAKKyAgICBub19yZXBvcnQgPSAwCisgICAgY291bnRzX2ZpbGUgPSBOb25lCisgICAgbWlzc2luZyA9IDAKKyAgICBpZ25vcmVfbW9kdWxlcyA9IFtdCisgICAgaWdub3JlX2RpcnMgPSBbXQorICAgIGNvdmVyZGlyID0gTm9uZQorICAgIHN1bW1hcnkgPSAwCisgICAgbGlzdGZ1bmNzID0gRmFsc2UKKyAgICBjb3VudGNhbGxlcnMgPSBGYWxzZQorICAgIHRpbWluZyA9IEZhbHNlCisKKyAgICBmb3Igb3B0LCB2YWwgaW4gb3B0czoKKyAgICAgICAgaWYgb3B0ID09ICItLWhlbHAiOgorICAgICAgICAgICAgdXNhZ2Uoc3lzLnN0ZG91dCkKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAgICAgaWYgb3B0ID09ICItLXZlcnNpb24iOgorICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgidHJhY2UgMi4wXG4iKQorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKworICAgICAgICBpZiBvcHQgPT0gIi1UIiBvciBvcHQgPT0gIi0tdHJhY2tjYWxscyI6CisgICAgICAgICAgICBjb3VudGNhbGxlcnMgPSBUcnVlCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLWwiIG9yIG9wdCA9PSAiLS1saXN0ZnVuY3MiOgorICAgICAgICAgICAgbGlzdGZ1bmNzID0gVHJ1ZQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi1nIiBvciBvcHQgPT0gIi0tdGltaW5nIjoKKyAgICAgICAgICAgIHRpbWluZyA9IFRydWUKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItdCIgb3Igb3B0ID09ICItLXRyYWNlIjoKKyAgICAgICAgICAgIHRyYWNlID0gMQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi1jIiBvciBvcHQgPT0gIi0tY291bnQiOgorICAgICAgICAgICAgY291bnQgPSAxCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLXIiIG9yIG9wdCA9PSAiLS1yZXBvcnQiOgorICAgICAgICAgICAgcmVwb3J0ID0gMQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi1SIiBvciBvcHQgPT0gIi0tbm8tcmVwb3J0IjoKKyAgICAgICAgICAgIG5vX3JlcG9ydCA9IDEKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItZiIgb3Igb3B0ID09ICItLWZpbGUiOgorICAgICAgICAgICAgY291bnRzX2ZpbGUgPSB2YWwKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItbSIgb3Igb3B0ID09ICItLW1pc3NpbmciOgorICAgICAgICAgICAgbWlzc2luZyA9IDEKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgb3B0ID09ICItQyIgb3Igb3B0ID09ICItLWNvdmVyZGlyIjoKKyAgICAgICAgICAgIGNvdmVyZGlyID0gdmFsCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLXMiIG9yIG9wdCA9PSAiLS1zdW1tYXJ5IjoKKyAgICAgICAgICAgIHN1bW1hcnkgPSAxCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9wdCA9PSAiLS1pZ25vcmUtbW9kdWxlIjoKKyAgICAgICAgICAgIGZvciBtb2QgaW4gdmFsLnNwbGl0KCIsIik6CisgICAgICAgICAgICAgICAgaWdub3JlX21vZHVsZXMuYXBwZW5kKG1vZC5zdHJpcCgpKQorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBpZiBvcHQgPT0gIi0taWdub3JlLWRpciI6CisgICAgICAgICAgICBmb3IgcyBpbiB2YWwuc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgICAgICAgICAgcyA9IG9zLnBhdGguZXhwYW5kdmFycyhzKQorICAgICAgICAgICAgICAgICMgc2hvdWxkIEkgYWxzbyBjYWxsIGV4cGFuZHVzZXI/IChhZnRlciBhbGwsIGNvdWxkIHVzZSAkSE9NRSkKKworICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoIiRwcmVmaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICJsaWIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJweXRob24iICsgc3lzLnZlcnNpb25bOjNdKSkKKyAgICAgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCIkZXhlY19wcmVmaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgImxpYiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10pKQorICAgICAgICAgICAgICAgIHMgPSBvcy5wYXRoLm5vcm1wYXRoKHMpCisgICAgICAgICAgICAgICAgaWdub3JlX2RpcnMuYXBwZW5kKHMpCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGFzc2VydCAwLCAiU2hvdWxkIG5ldmVyIGdldCBoZXJlIgorCisgICAgaWYgbGlzdGZ1bmNzIGFuZCAoY291bnQgb3IgdHJhY2UpOgorICAgICAgICBfZXJyX2V4aXQoImNhbm5vdCBzcGVjaWZ5IGJvdGggLS1saXN0ZnVuY3MgYW5kICgtLXRyYWNlIG9yIC0tY291bnQpIikKKworICAgIGlmIG5vdCAoY291bnQgb3IgdHJhY2Ugb3IgcmVwb3J0IG9yIGxpc3RmdW5jcyBvciBjb3VudGNhbGxlcnMpOgorICAgICAgICBfZXJyX2V4aXQoIm11c3Qgc3BlY2lmeSBvbmUgb2YgLS10cmFjZSwgLS1jb3VudCwgLS1yZXBvcnQsICIKKyAgICAgICAgICAgICAgICAgICItLWxpc3RmdW5jcywgb3IgLS10cmFja2NhbGxzIikKKworICAgIGlmIHJlcG9ydCBhbmQgbm9fcmVwb3J0OgorICAgICAgICBfZXJyX2V4aXQoImNhbm5vdCBzcGVjaWZ5IGJvdGggLS1yZXBvcnQgYW5kIC0tbm8tcmVwb3J0IikKKworICAgIGlmIHJlcG9ydCBhbmQgbm90IGNvdW50c19maWxlOgorICAgICAgICBfZXJyX2V4aXQoIi0tcmVwb3J0IHJlcXVpcmVzIGEgLS1maWxlIikKKworICAgIGlmIG5vX3JlcG9ydCBhbmQgbGVuKHByb2dfYXJndikgPT0gMDoKKyAgICAgICAgX2Vycl9leGl0KCJtaXNzaW5nIG5hbWUgb2YgZmlsZSB0byBydW4iKQorCisgICAgIyBldmVyeXRoaW5nIGlzIHJlYWR5CisgICAgaWYgcmVwb3J0OgorICAgICAgICByZXN1bHRzID0gQ292ZXJhZ2VSZXN1bHRzKGluZmlsZT1jb3VudHNfZmlsZSwgb3V0ZmlsZT1jb3VudHNfZmlsZSkKKyAgICAgICAgcmVzdWx0cy53cml0ZV9yZXN1bHRzKG1pc3NpbmcsIHN1bW1hcnk9c3VtbWFyeSwgY292ZXJkaXI9Y292ZXJkaXIpCisgICAgZWxzZToKKyAgICAgICAgc3lzLmFyZ3YgPSBwcm9nX2FyZ3YKKyAgICAgICAgcHJvZ25hbWUgPSBwcm9nX2FyZ3ZbMF0KKyAgICAgICAgc3lzLnBhdGhbMF0gPSBvcy5wYXRoLnNwbGl0KHByb2duYW1lKVswXQorCisgICAgICAgIHQgPSBUcmFjZShjb3VudCwgdHJhY2UsIGNvdW50ZnVuY3M9bGlzdGZ1bmNzLAorICAgICAgICAgICAgICAgICAgY291bnRjYWxsZXJzPWNvdW50Y2FsbGVycywgaWdub3JlbW9kcz1pZ25vcmVfbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgIGlnbm9yZWRpcnM9aWdub3JlX2RpcnMsIGluZmlsZT1jb3VudHNfZmlsZSwKKyAgICAgICAgICAgICAgICAgIG91dGZpbGU9Y291bnRzX2ZpbGUsIHRpbWluZz10aW1pbmcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpdGggb3Blbihwcm9nbmFtZSkgYXMgZnA6CisgICAgICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUoZnAucmVhZCgpLCBwcm9nbmFtZSwgJ2V4ZWMnKQorICAgICAgICAgICAgIyB0cnkgdG8gZW11bGF0ZSBfX21haW5fXyBuYW1lc3BhY2UgYXMgbXVjaCBhcyBwb3NzaWJsZQorICAgICAgICAgICAgZ2xvYnMgPSB7CisgICAgICAgICAgICAgICAgJ19fZmlsZV9fJzogcHJvZ25hbWUsCisgICAgICAgICAgICAgICAgJ19fbmFtZV9fJzogJ19fbWFpbl9fJywKKyAgICAgICAgICAgICAgICAnX19wYWNrYWdlX18nOiBOb25lLAorICAgICAgICAgICAgICAgICdfX2NhY2hlZF9fJzogTm9uZSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQucnVuY3R4KGNvZGUsIGdsb2JzLCBnbG9icykKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGVycjoKKyAgICAgICAgICAgIF9lcnJfZXhpdCgiQ2Fubm90IHJ1biBmaWxlICVyIGJlY2F1c2U6ICVzIiAlIChzeXMuYXJndlswXSwgZXJyKSkKKyAgICAgICAgZXhjZXB0IFN5c3RlbUV4aXQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0cyA9IHQucmVzdWx0cygpCisKKyAgICAgICAgaWYgbm90IG5vX3JlcG9ydDoKKyAgICAgICAgICAgIHJlc3VsdHMud3JpdGVfcmVzdWx0cyhtaXNzaW5nLCBzdW1tYXJ5PXN1bW1hcnksIGNvdmVyZGlyPWNvdmVyZGlyKQorCitpZiBfX25hbWVfXz09J19fbWFpbl9fJzoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHJhY2UucHljIGIvbGliL3B5dGhvbjIuNy90cmFjZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkxZTZmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHJhY2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHJhY2UucHlvIGIvbGliL3B5dGhvbjIuNy90cmFjZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmZmVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHJhY2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5IGIvbGliL3B5dGhvbjIuNy90cmFjZWJhY2sucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExN2QzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5CkBAIC0wLDAgKzEsMzE5IEBACisiIiJFeHRyYWN0LCBmb3JtYXQgYW5kIHByaW50IGluZm9ybWF0aW9uIGFib3V0IFB5dGhvbiBzdGFjayB0cmFjZXMuIiIiCisKK2ltcG9ydCBsaW5lY2FjaGUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcworCitfX2FsbF9fID0gWydleHRyYWN0X3N0YWNrJywgJ2V4dHJhY3RfdGInLCAnZm9ybWF0X2V4Y2VwdGlvbicsCisgICAgICAgICAgICdmb3JtYXRfZXhjZXB0aW9uX29ubHknLCAnZm9ybWF0X2xpc3QnLCAnZm9ybWF0X3N0YWNrJywKKyAgICAgICAgICAgJ2Zvcm1hdF90YicsICdwcmludF9leGMnLCAnZm9ybWF0X2V4YycsICdwcmludF9leGNlcHRpb24nLAorICAgICAgICAgICAncHJpbnRfbGFzdCcsICdwcmludF9zdGFjaycsICdwcmludF90YicsICd0Yl9saW5lbm8nXQorCitkZWYgX3ByaW50KGZpbGUsIHN0cj0nJywgdGVybWluYXRvcj0nXG4nKToKKyAgICBmaWxlLndyaXRlKHN0cit0ZXJtaW5hdG9yKQorCisKK2RlZiBwcmludF9saXN0KGV4dHJhY3RlZF9saXN0LCBmaWxlPU5vbmUpOgorICAgICIiIlByaW50IHRoZSBsaXN0IG9mIHR1cGxlcyBhcyByZXR1cm5lZCBieSBleHRyYWN0X3RiKCkgb3IKKyAgICBleHRyYWN0X3N0YWNrKCkgYXMgYSBmb3JtYXR0ZWQgc3RhY2sgdHJhY2UgdG8gdGhlIGdpdmVuIGZpbGUuIiIiCisgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgIGZvciBmaWxlbmFtZSwgbGluZW5vLCBuYW1lLCBsaW5lIGluIGV4dHJhY3RlZF9saXN0OgorICAgICAgICBfcHJpbnQoZmlsZSwKKyAgICAgICAgICAgICAgICcgIEZpbGUgIiVzIiwgbGluZSAlZCwgaW4gJXMnICUgKGZpbGVuYW1lLGxpbmVubyxuYW1lKSkKKyAgICAgICAgaWYgbGluZToKKyAgICAgICAgICAgIF9wcmludChmaWxlLCAnICAgICVzJyAlIGxpbmUuc3RyaXAoKSkKKworZGVmIGZvcm1hdF9saXN0KGV4dHJhY3RlZF9saXN0KToKKyAgICAiIiJGb3JtYXQgYSBsaXN0IG9mIHRyYWNlYmFjayBlbnRyeSB0dXBsZXMgZm9yIHByaW50aW5nLgorCisgICAgR2l2ZW4gYSBsaXN0IG9mIHR1cGxlcyBhcyByZXR1cm5lZCBieSBleHRyYWN0X3RiKCkgb3IKKyAgICBleHRyYWN0X3N0YWNrKCksIHJldHVybiBhIGxpc3Qgb2Ygc3RyaW5ncyByZWFkeSBmb3IgcHJpbnRpbmcuCisgICAgRWFjaCBzdHJpbmcgaW4gdGhlIHJlc3VsdGluZyBsaXN0IGNvcnJlc3BvbmRzIHRvIHRoZSBpdGVtIHdpdGggdGhlCisgICAgc2FtZSBpbmRleCBpbiB0aGUgYXJndW1lbnQgbGlzdC4gIEVhY2ggc3RyaW5nIGVuZHMgaW4gYSBuZXdsaW5lOworICAgIHRoZSBzdHJpbmdzIG1heSBjb250YWluIGludGVybmFsIG5ld2xpbmVzIGFzIHdlbGwsIGZvciB0aG9zZSBpdGVtcworICAgIHdob3NlIHNvdXJjZSB0ZXh0IGxpbmUgaXMgbm90IE5vbmUuCisgICAgIiIiCisgICAgbGlzdCA9IFtdCisgICAgZm9yIGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUgaW4gZXh0cmFjdGVkX2xpc3Q6CisgICAgICAgIGl0ZW0gPSAnICBGaWxlICIlcyIsIGxpbmUgJWQsIGluICVzXG4nICUgKGZpbGVuYW1lLGxpbmVubyxuYW1lKQorICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgaXRlbSA9IGl0ZW0gKyAnICAgICVzXG4nICUgbGluZS5zdHJpcCgpCisgICAgICAgIGxpc3QuYXBwZW5kKGl0ZW0pCisgICAgcmV0dXJuIGxpc3QKKworCitkZWYgcHJpbnRfdGIodGIsIGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisgICAgIiIiUHJpbnQgdXAgdG8gJ2xpbWl0JyBzdGFjayB0cmFjZSBlbnRyaWVzIGZyb20gdGhlIHRyYWNlYmFjayAndGInLgorCisgICAgSWYgJ2xpbWl0JyBpcyBvbWl0dGVkIG9yIE5vbmUsIGFsbCBlbnRyaWVzIGFyZSBwcmludGVkLiAgSWYgJ2ZpbGUnCisgICAgaXMgb21pdHRlZCBvciBOb25lLCB0aGUgb3V0cHV0IGdvZXMgdG8gc3lzLnN0ZGVycjsgb3RoZXJ3aXNlCisgICAgJ2ZpbGUnIHNob3VsZCBiZSBhbiBvcGVuIGZpbGUgb3IgZmlsZS1saWtlIG9iamVjdCB3aXRoIGEgd3JpdGUoKQorICAgIG1ldGhvZC4KKyAgICAiIiIKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgaWYgbGltaXQgaXMgTm9uZToKKyAgICAgICAgaWYgaGFzYXR0cihzeXMsICd0cmFjZWJhY2tsaW1pdCcpOgorICAgICAgICAgICAgbGltaXQgPSBzeXMudHJhY2ViYWNrbGltaXQKKyAgICBuID0gMAorICAgIHdoaWxlIHRiIGlzIG5vdCBOb25lIGFuZCAobGltaXQgaXMgTm9uZSBvciBuIDwgbGltaXQpOgorICAgICAgICBmID0gdGIudGJfZnJhbWUKKyAgICAgICAgbGluZW5vID0gdGIudGJfbGluZW5vCisgICAgICAgIGNvID0gZi5mX2NvZGUKKyAgICAgICAgZmlsZW5hbWUgPSBjby5jb19maWxlbmFtZQorICAgICAgICBuYW1lID0gY28uY29fbmFtZQorICAgICAgICBfcHJpbnQoZmlsZSwKKyAgICAgICAgICAgICAgICcgIEZpbGUgIiVzIiwgbGluZSAlZCwgaW4gJXMnICUgKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUpKQorICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZShmaWxlbmFtZSkKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGYuZl9nbG9iYWxzKQorICAgICAgICBpZiBsaW5lOiBfcHJpbnQoZmlsZSwgJyAgICAnICsgbGluZS5zdHJpcCgpKQorICAgICAgICB0YiA9IHRiLnRiX25leHQKKyAgICAgICAgbiA9IG4rMQorCitkZWYgZm9ybWF0X3RiKHRiLCBsaW1pdCA9IE5vbmUpOgorICAgICIiIkEgc2hvcnRoYW5kIGZvciAnZm9ybWF0X2xpc3QoZXh0cmFjdF9zdGFjayhmLCBsaW1pdCkpLiIiIgorICAgIHJldHVybiBmb3JtYXRfbGlzdChleHRyYWN0X3RiKHRiLCBsaW1pdCkpCisKK2RlZiBleHRyYWN0X3RiKHRiLCBsaW1pdCA9IE5vbmUpOgorICAgICIiIlJldHVybiBsaXN0IG9mIHVwIHRvIGxpbWl0IHByZS1wcm9jZXNzZWQgZW50cmllcyBmcm9tIHRyYWNlYmFjay4KKworICAgIFRoaXMgaXMgdXNlZnVsIGZvciBhbHRlcm5hdGUgZm9ybWF0dGluZyBvZiBzdGFjayB0cmFjZXMuICBJZgorICAgICdsaW1pdCcgaXMgb21pdHRlZCBvciBOb25lLCBhbGwgZW50cmllcyBhcmUgZXh0cmFjdGVkLiAgQQorICAgIHByZS1wcm9jZXNzZWQgc3RhY2sgdHJhY2UgZW50cnkgaXMgYSBxdWFkcnVwbGUgKGZpbGVuYW1lLCBsaW5lCisgICAgbnVtYmVyLCBmdW5jdGlvbiBuYW1lLCB0ZXh0KSByZXByZXNlbnRpbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQgaXMKKyAgICB1c3VhbGx5IHByaW50ZWQgZm9yIGEgc3RhY2sgdHJhY2UuICBUaGUgdGV4dCBpcyBhIHN0cmluZyB3aXRoCisgICAgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBzdHJpcHBlZDsgaWYgdGhlIHNvdXJjZSBpcyBub3QKKyAgICBhdmFpbGFibGUgaXQgaXMgTm9uZS4KKyAgICAiIiIKKyAgICBpZiBsaW1pdCBpcyBOb25lOgorICAgICAgICBpZiBoYXNhdHRyKHN5cywgJ3RyYWNlYmFja2xpbWl0Jyk6CisgICAgICAgICAgICBsaW1pdCA9IHN5cy50cmFjZWJhY2tsaW1pdAorICAgIGxpc3QgPSBbXQorICAgIG4gPSAwCisgICAgd2hpbGUgdGIgaXMgbm90IE5vbmUgYW5kIChsaW1pdCBpcyBOb25lIG9yIG4gPCBsaW1pdCk6CisgICAgICAgIGYgPSB0Yi50Yl9mcmFtZQorICAgICAgICBsaW5lbm8gPSB0Yi50Yl9saW5lbm8KKyAgICAgICAgY28gPSBmLmZfY29kZQorICAgICAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCisgICAgICAgIG5hbWUgPSBjby5jb19uYW1lCisgICAgICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKGZpbGVuYW1lKQorICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubywgZi5mX2dsb2JhbHMpCisgICAgICAgIGlmIGxpbmU6IGxpbmUgPSBsaW5lLnN0cmlwKCkKKyAgICAgICAgZWxzZTogbGluZSA9IE5vbmUKKyAgICAgICAgbGlzdC5hcHBlbmQoKGZpbGVuYW1lLCBsaW5lbm8sIG5hbWUsIGxpbmUpKQorICAgICAgICB0YiA9IHRiLnRiX25leHQKKyAgICAgICAgbiA9IG4rMQorICAgIHJldHVybiBsaXN0CisKKworZGVmIHByaW50X2V4Y2VwdGlvbihldHlwZSwgdmFsdWUsIHRiLCBsaW1pdD1Ob25lLCBmaWxlPU5vbmUpOgorICAgICIiIlByaW50IGV4Y2VwdGlvbiB1cCB0byAnbGltaXQnIHN0YWNrIHRyYWNlIGVudHJpZXMgZnJvbSAndGInIHRvICdmaWxlJy4KKworICAgIFRoaXMgZGlmZmVycyBmcm9tIHByaW50X3RiKCkgaW4gdGhlIGZvbGxvd2luZyB3YXlzOiAoMSkgaWYKKyAgICB0cmFjZWJhY2sgaXMgbm90IE5vbmUsIGl0IHByaW50cyBhIGhlYWRlciAiVHJhY2ViYWNrIChtb3N0IHJlY2VudAorICAgIGNhbGwgbGFzdCk6IjsgKDIpIGl0IHByaW50cyB0aGUgZXhjZXB0aW9uIHR5cGUgYW5kIHZhbHVlIGFmdGVyIHRoZQorICAgIHN0YWNrIHRyYWNlOyAoMykgaWYgdHlwZSBpcyBTeW50YXhFcnJvciBhbmQgdmFsdWUgaGFzIHRoZQorICAgIGFwcHJvcHJpYXRlIGZvcm1hdCwgaXQgcHJpbnRzIHRoZSBsaW5lIHdoZXJlIHRoZSBzeW50YXggZXJyb3IKKyAgICBvY2N1cnJlZCB3aXRoIGEgY2FyZXQgb24gdGhlIG5leHQgbGluZSBpbmRpY2F0aW5nIHRoZSBhcHByb3hpbWF0ZQorICAgIHBvc2l0aW9uIG9mIHRoZSBlcnJvci4KKyAgICAiIiIKKyAgICBpZiBmaWxlIGlzIE5vbmU6CisgICAgICAgIGZpbGUgPSBzeXMuc3RkZXJyCisgICAgaWYgdGI6CisgICAgICAgIF9wcmludChmaWxlLCAnVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOicpCisgICAgICAgIHByaW50X3RiKHRiLCBsaW1pdCwgZmlsZSkKKyAgICBsaW5lcyA9IGZvcm1hdF9leGNlcHRpb25fb25seShldHlwZSwgdmFsdWUpCisgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgIF9wcmludChmaWxlLCBsaW5lLCAnJykKKworZGVmIGZvcm1hdF9leGNlcHRpb24oZXR5cGUsIHZhbHVlLCB0YiwgbGltaXQgPSBOb25lKToKKyAgICAiIiJGb3JtYXQgYSBzdGFjayB0cmFjZSBhbmQgdGhlIGV4Y2VwdGlvbiBpbmZvcm1hdGlvbi4KKworICAgIFRoZSBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50cworICAgIHRvIHByaW50X2V4Y2VwdGlvbigpLiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2Ygc3RyaW5ncywgZWFjaAorICAgIGVuZGluZyBpbiBhIG5ld2xpbmUgYW5kIHNvbWUgY29udGFpbmluZyBpbnRlcm5hbCBuZXdsaW5lcy4gIFdoZW4KKyAgICB0aGVzZSBsaW5lcyBhcmUgY29uY2F0ZW5hdGVkIGFuZCBwcmludGVkLCBleGFjdGx5IHRoZSBzYW1lIHRleHQgaXMKKyAgICBwcmludGVkIGFzIGRvZXMgcHJpbnRfZXhjZXB0aW9uKCkuCisgICAgIiIiCisgICAgaWYgdGI6CisgICAgICAgIGxpc3QgPSBbJ1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KTpcbiddCisgICAgICAgIGxpc3QgPSBsaXN0ICsgZm9ybWF0X3RiKHRiLCBsaW1pdCkKKyAgICBlbHNlOgorICAgICAgICBsaXN0ID0gW10KKyAgICBsaXN0ID0gbGlzdCArIGZvcm1hdF9leGNlcHRpb25fb25seShldHlwZSwgdmFsdWUpCisgICAgcmV0dXJuIGxpc3QKKworZGVmIGZvcm1hdF9leGNlcHRpb25fb25seShldHlwZSwgdmFsdWUpOgorICAgICIiIkZvcm1hdCB0aGUgZXhjZXB0aW9uIHBhcnQgb2YgYSB0cmFjZWJhY2suCisKKyAgICBUaGUgYXJndW1lbnRzIGFyZSB0aGUgZXhjZXB0aW9uIHR5cGUgYW5kIHZhbHVlIHN1Y2ggYXMgZ2l2ZW4gYnkKKyAgICBzeXMubGFzdF90eXBlIGFuZCBzeXMubGFzdF92YWx1ZS4gVGhlIHJldHVybiB2YWx1ZSBpcyBhIGxpc3Qgb2YKKyAgICBzdHJpbmdzLCBlYWNoIGVuZGluZyBpbiBhIG5ld2xpbmUuCisKKyAgICBOb3JtYWxseSwgdGhlIGxpc3QgY29udGFpbnMgYSBzaW5nbGUgc3RyaW5nOyBob3dldmVyLCBmb3IKKyAgICBTeW50YXhFcnJvciBleGNlcHRpb25zLCBpdCBjb250YWlucyBzZXZlcmFsIGxpbmVzIHRoYXQgKHdoZW4KKyAgICBwcmludGVkKSBkaXNwbGF5IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIHRoZSBzeW50YXgKKyAgICBlcnJvciBvY2N1cnJlZC4KKworICAgIFRoZSBtZXNzYWdlIGluZGljYXRpbmcgd2hpY2ggZXhjZXB0aW9uIG9jY3VycmVkIGlzIGFsd2F5cyB0aGUgbGFzdAorICAgIHN0cmluZyBpbiB0aGUgbGlzdC4KKworICAgICIiIgorCisgICAgIyBBbiBpbnN0YW5jZSBzaG91bGQgbm90IGhhdmUgYSBtZWFuaW5nZnVsIHZhbHVlIHBhcmFtZXRlciwgYnV0CisgICAgIyBzb21ldGltZXMgZG9lcywgcGFydGljdWxhcmx5IGZvciBzdHJpbmcgZXhjZXB0aW9ucywgc3VjaCBhcworICAgICMgPj4+IHJhaXNlIHN0cmluZzEsIHN0cmluZzIgICMgZGVwcmVjYXRlZAorICAgICMKKyAgICAjIENsZWFyIHRoZXNlIG91dCBmaXJzdCBiZWNhdXNlIGlzc3VidHlwZShzdHJpbmcxLCBTeW50YXhFcnJvcikKKyAgICAjIHdvdWxkIHJhaXNlIGFub3RoZXIgZXhjZXB0aW9uIGFuZCBtYXNrIHRoZSBvcmlnaW5hbCBwcm9ibGVtLgorICAgIGlmIChpc2luc3RhbmNlKGV0eXBlLCBCYXNlRXhjZXB0aW9uKSBvcgorICAgICAgICBpc2luc3RhbmNlKGV0eXBlLCB0eXBlcy5JbnN0YW5jZVR5cGUpIG9yCisgICAgICAgIGV0eXBlIGlzIE5vbmUgb3IgdHlwZShldHlwZSkgaXMgc3RyKToKKyAgICAgICAgcmV0dXJuIFtfZm9ybWF0X2ZpbmFsX2V4Y19saW5lKGV0eXBlLCB2YWx1ZSldCisKKyAgICBzdHlwZSA9IGV0eXBlLl9fbmFtZV9fCisKKyAgICBpZiBub3QgaXNzdWJjbGFzcyhldHlwZSwgU3ludGF4RXJyb3IpOgorICAgICAgICByZXR1cm4gW19mb3JtYXRfZmluYWxfZXhjX2xpbmUoc3R5cGUsIHZhbHVlKV0KKworICAgICMgSXQgd2FzIGEgc3ludGF4IGVycm9yOyBzaG93IGV4YWN0bHkgd2hlcmUgdGhlIHByb2JsZW0gd2FzIGZvdW5kLgorICAgIGxpbmVzID0gW10KKyAgICB0cnk6CisgICAgICAgIG1zZywgKGZpbGVuYW1lLCBsaW5lbm8sIG9mZnNldCwgYmFkbGluZSkgPSB2YWx1ZS5hcmdzCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUgb3IgIjxzdHJpbmc+IgorICAgICAgICBsaW5lcy5hcHBlbmQoJyAgRmlsZSAiJXMiLCBsaW5lICVkXG4nICUgKGZpbGVuYW1lLCBsaW5lbm8pKQorICAgICAgICBpZiBiYWRsaW5lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbGluZXMuYXBwZW5kKCcgICAgJXNcbicgJSBiYWRsaW5lLnN0cmlwKCkpCisgICAgICAgICAgICBpZiBvZmZzZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgY2FyZXRzcGFjZSA9IGJhZGxpbmUucnN0cmlwKCdcbicpWzpvZmZzZXRdLmxzdHJpcCgpCisgICAgICAgICAgICAgICAgIyBub24tc3BhY2Ugd2hpdGVzcGFjZSAobGlrZXMgdGFicykgbXVzdCBiZSBrZXB0IGZvciBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gKChjLmlzc3BhY2UoKSBhbmQgYyBvciAnICcpIGZvciBjIGluIGNhcmV0c3BhY2UpCisgICAgICAgICAgICAgICAgIyBvbmx5IHRocmVlIHNwYWNlcyB0byBhY2NvdW50IGZvciBvZmZzZXQxID09IHBvcyAwCisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCcgICAlc15cbicgJSAnJy5qb2luKGNhcmV0c3BhY2UpKQorICAgICAgICB2YWx1ZSA9IG1zZworCisgICAgbGluZXMuYXBwZW5kKF9mb3JtYXRfZmluYWxfZXhjX2xpbmUoc3R5cGUsIHZhbHVlKSkKKyAgICByZXR1cm4gbGluZXMKKworZGVmIF9mb3JtYXRfZmluYWxfZXhjX2xpbmUoZXR5cGUsIHZhbHVlKToKKyAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGEgc2luZ2xlIGxpbmUgLS0gbm9ybWFsIGNhc2UgZm9yIGZvcm1hdF9leGNlcHRpb25fb25seSIiIgorICAgIHZhbHVlc3RyID0gX3NvbWVfc3RyKHZhbHVlKQorICAgIGlmIHZhbHVlIGlzIE5vbmUgb3Igbm90IHZhbHVlc3RyOgorICAgICAgICBsaW5lID0gIiVzXG4iICUgZXR5cGUKKyAgICBlbHNlOgorICAgICAgICBsaW5lID0gIiVzOiAlc1xuIiAlIChldHlwZSwgdmFsdWVzdHIpCisgICAgcmV0dXJuIGxpbmUKKworZGVmIF9zb21lX3N0cih2YWx1ZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gc3RyKHZhbHVlKQorICAgIGV4Y2VwdCBFeGNlcHRpb246CisgICAgICAgIHBhc3MKKyAgICB0cnk6CisgICAgICAgIHZhbHVlID0gdW5pY29kZSh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHZhbHVlLmVuY29kZSgiYXNjaWkiLCAiYmFja3NsYXNocmVwbGFjZSIpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgcGFzcworICAgIHJldHVybiAnPHVucHJpbnRhYmxlICVzIG9iamVjdD4nICUgdHlwZSh2YWx1ZSkuX19uYW1lX18KKworCitkZWYgcHJpbnRfZXhjKGxpbWl0PU5vbmUsIGZpbGU9Tm9uZSk6CisgICAgIiIiU2hvcnRoYW5kIGZvciAncHJpbnRfZXhjZXB0aW9uKHN5cy5leGNfdHlwZSwgc3lzLmV4Y192YWx1ZSwgc3lzLmV4Y190cmFjZWJhY2ssIGxpbWl0LCBmaWxlKScuCisgICAgKEluIGZhY3QsIGl0IHVzZXMgc3lzLmV4Y19pbmZvKCkgdG8gcmV0cmlldmUgdGhlIHNhbWUgaW5mb3JtYXRpb24KKyAgICBpbiBhIHRocmVhZC1zYWZlIHdheS4pIiIiCisgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgIHRyeToKKyAgICAgICAgZXR5cGUsIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIHByaW50X2V4Y2VwdGlvbihldHlwZSwgdmFsdWUsIHRiLCBsaW1pdCwgZmlsZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBldHlwZSA9IHZhbHVlID0gdGIgPSBOb25lCisKKworZGVmIGZvcm1hdF9leGMobGltaXQ9Tm9uZSk6CisgICAgIiIiTGlrZSBwcmludF9leGMoKSBidXQgcmV0dXJuIGEgc3RyaW5nLiIiIgorICAgIHRyeToKKyAgICAgICAgZXR5cGUsIHZhbHVlLCB0YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgIHJldHVybiAnJy5qb2luKGZvcm1hdF9leGNlcHRpb24oZXR5cGUsIHZhbHVlLCB0YiwgbGltaXQpKQorICAgIGZpbmFsbHk6CisgICAgICAgIGV0eXBlID0gdmFsdWUgPSB0YiA9IE5vbmUKKworCitkZWYgcHJpbnRfbGFzdChsaW1pdD1Ob25lLCBmaWxlPU5vbmUpOgorICAgICIiIlRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yICdwcmludF9leGNlcHRpb24oc3lzLmxhc3RfdHlwZSwKKyAgICBzeXMubGFzdF92YWx1ZSwgc3lzLmxhc3RfdHJhY2ViYWNrLCBsaW1pdCwgZmlsZSknLiIiIgorICAgIGlmIG5vdCBoYXNhdHRyKHN5cywgImxhc3RfdHlwZSIpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJubyBsYXN0IGV4Y2VwdGlvbiIpCisgICAgaWYgZmlsZSBpcyBOb25lOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgIHByaW50X2V4Y2VwdGlvbihzeXMubGFzdF90eXBlLCBzeXMubGFzdF92YWx1ZSwgc3lzLmxhc3RfdHJhY2ViYWNrLAorICAgICAgICAgICAgICAgICAgICBsaW1pdCwgZmlsZSkKKworCitkZWYgcHJpbnRfc3RhY2soZj1Ob25lLCBsaW1pdD1Ob25lLCBmaWxlPU5vbmUpOgorICAgICIiIlByaW50IGEgc3RhY2sgdHJhY2UgZnJvbSBpdHMgaW52b2NhdGlvbiBwb2ludC4KKworICAgIFRoZSBvcHRpb25hbCAnZicgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGUKKyAgICBzdGFjayBmcmFtZSBhdCB3aGljaCB0byBzdGFydC4gVGhlIG9wdGlvbmFsICdsaW1pdCcgYW5kICdmaWxlJworICAgIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yIHByaW50X2V4Y2VwdGlvbigpLgorICAgICIiIgorICAgIGlmIGYgaXMgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgZiA9IHN5cy5leGNfaW5mbygpWzJdLnRiX2ZyYW1lLmZfYmFjaworICAgIHByaW50X2xpc3QoZXh0cmFjdF9zdGFjayhmLCBsaW1pdCksIGZpbGUpCisKK2RlZiBmb3JtYXRfc3RhY2soZj1Ob25lLCBsaW1pdD1Ob25lKToKKyAgICAiIiJTaG9ydGhhbmQgZm9yICdmb3JtYXRfbGlzdChleHRyYWN0X3N0YWNrKGYsIGxpbWl0KSknLiIiIgorICAgIGlmIGYgaXMgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgZiA9IHN5cy5leGNfaW5mbygpWzJdLnRiX2ZyYW1lLmZfYmFjaworICAgIHJldHVybiBmb3JtYXRfbGlzdChleHRyYWN0X3N0YWNrKGYsIGxpbWl0KSkKKworZGVmIGV4dHJhY3Rfc3RhY2soZj1Ob25lLCBsaW1pdCA9IE5vbmUpOgorICAgICIiIkV4dHJhY3QgdGhlIHJhdyB0cmFjZWJhY2sgZnJvbSB0aGUgY3VycmVudCBzdGFjayBmcmFtZS4KKworICAgIFRoZSByZXR1cm4gdmFsdWUgaGFzIHRoZSBzYW1lIGZvcm1hdCBhcyBmb3IgZXh0cmFjdF90YigpLiAgVGhlCisgICAgb3B0aW9uYWwgJ2YnIGFuZCAnbGltaXQnIGFyZ3VtZW50cyBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgYXMgZm9yCisgICAgcHJpbnRfc3RhY2soKS4gIEVhY2ggaXRlbSBpbiB0aGUgbGlzdCBpcyBhIHF1YWRydXBsZSAoZmlsZW5hbWUsCisgICAgbGluZSBudW1iZXIsIGZ1bmN0aW9uIG5hbWUsIHRleHQpLCBhbmQgdGhlIGVudHJpZXMgYXJlIGluIG9yZGVyCisgICAgZnJvbSBvbGRlc3QgdG8gbmV3ZXN0IHN0YWNrIGZyYW1lLgorICAgICIiIgorICAgIGlmIGYgaXMgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IKKyAgICAgICAgZXhjZXB0IFplcm9EaXZpc2lvbkVycm9yOgorICAgICAgICAgICAgZiA9IHN5cy5leGNfaW5mbygpWzJdLnRiX2ZyYW1lLmZfYmFjaworICAgIGlmIGxpbWl0IGlzIE5vbmU6CisgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAndHJhY2ViYWNrbGltaXQnKToKKyAgICAgICAgICAgIGxpbWl0ID0gc3lzLnRyYWNlYmFja2xpbWl0CisgICAgbGlzdCA9IFtdCisgICAgbiA9IDAKKyAgICB3aGlsZSBmIGlzIG5vdCBOb25lIGFuZCAobGltaXQgaXMgTm9uZSBvciBuIDwgbGltaXQpOgorICAgICAgICBsaW5lbm8gPSBmLmZfbGluZW5vCisgICAgICAgIGNvID0gZi5mX2NvZGUKKyAgICAgICAgZmlsZW5hbWUgPSBjby5jb19maWxlbmFtZQorICAgICAgICBuYW1lID0gY28uY29fbmFtZQorICAgICAgICBsaW5lY2FjaGUuY2hlY2tjYWNoZShmaWxlbmFtZSkKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGYuZl9nbG9iYWxzKQorICAgICAgICBpZiBsaW5lOiBsaW5lID0gbGluZS5zdHJpcCgpCisgICAgICAgIGVsc2U6IGxpbmUgPSBOb25lCisgICAgICAgIGxpc3QuYXBwZW5kKChmaWxlbmFtZSwgbGluZW5vLCBuYW1lLCBsaW5lKSkKKyAgICAgICAgZiA9IGYuZl9iYWNrCisgICAgICAgIG4gPSBuKzEKKyAgICBsaXN0LnJldmVyc2UoKQorICAgIHJldHVybiBsaXN0CisKK2RlZiB0Yl9saW5lbm8odGIpOgorICAgICIiIkNhbGN1bGF0ZSBjb3JyZWN0IGxpbmUgbnVtYmVyIG9mIHRyYWNlYmFjayBnaXZlbiBpbiB0Yi4KKworICAgIE9ic29sZXRlIGluIDIuMy4KKyAgICAiIiIKKyAgICByZXR1cm4gdGIudGJfbGluZW5vCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RyYWNlYmFjay5weWMgYi9saWIvcHl0aG9uMi43L3RyYWNlYmFjay5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjMTRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3RyYWNlYmFjay5weW8gYi9saWIvcHl0aG9uMi43L3RyYWNlYmFjay5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjMTRjMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHJhY2ViYWNrLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3R0eS5weSBiL2xpYi9weXRob24yLjcvdHR5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MmViNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3R0eS5weQpAQCAtMCwwICsxLDM2IEBACisiIiJUZXJtaW5hbCB1dGlsaXRpZXMuIiIiCisKKyMgQXV0aG9yOiBTdGVlbiBMdW1ob2x0LgorCitmcm9tIHRlcm1pb3MgaW1wb3J0ICoKKworX19hbGxfXyA9IFsic2V0cmF3IiwgInNldGNicmVhayJdCisKKyMgSW5kZXhlcyBmb3IgdGVybWlvcyBsaXN0LgorSUZMQUcgPSAwCitPRkxBRyA9IDEKK0NGTEFHID0gMgorTEZMQUcgPSAzCitJU1BFRUQgPSA0CitPU1BFRUQgPSA1CitDQyA9IDYKKworZGVmIHNldHJhdyhmZCwgd2hlbj1UQ1NBRkxVU0gpOgorICAgICIiIlB1dCB0ZXJtaW5hbCBpbnRvIGEgcmF3IG1vZGUuIiIiCisgICAgbW9kZSA9IHRjZ2V0YXR0cihmZCkKKyAgICBtb2RlW0lGTEFHXSA9IG1vZGVbSUZMQUddICYgfihCUktJTlQgfCBJQ1JOTCB8IElOUENLIHwgSVNUUklQIHwgSVhPTikKKyAgICBtb2RlW09GTEFHXSA9IG1vZGVbT0ZMQUddICYgfihPUE9TVCkKKyAgICBtb2RlW0NGTEFHXSA9IG1vZGVbQ0ZMQUddICYgfihDU0laRSB8IFBBUkVOQikKKyAgICBtb2RlW0NGTEFHXSA9IG1vZGVbQ0ZMQUddIHwgQ1M4CisgICAgbW9kZVtMRkxBR10gPSBtb2RlW0xGTEFHXSAmIH4oRUNITyB8IElDQU5PTiB8IElFWFRFTiB8IElTSUcpCisgICAgbW9kZVtDQ11bVk1JTl0gPSAxCisgICAgbW9kZVtDQ11bVlRJTUVdID0gMAorICAgIHRjc2V0YXR0cihmZCwgd2hlbiwgbW9kZSkKKworZGVmIHNldGNicmVhayhmZCwgd2hlbj1UQ1NBRkxVU0gpOgorICAgICIiIlB1dCB0ZXJtaW5hbCBpbnRvIGEgY2JyZWFrIG1vZGUuIiIiCisgICAgbW9kZSA9IHRjZ2V0YXR0cihmZCkKKyAgICBtb2RlW0xGTEFHXSA9IG1vZGVbTEZMQUddICYgfihFQ0hPIHwgSUNBTk9OKQorICAgIG1vZGVbQ0NdW1ZNSU5dID0gMQorICAgIG1vZGVbQ0NdW1ZUSU1FXSA9IDAKKyAgICB0Y3NldGF0dHIoZmQsIHdoZW4sIG1vZGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3R0eS5weWMgYi9saWIvcHl0aG9uMi43L3R0eS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYWZiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHR5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3R0eS5weW8gYi9saWIvcHl0aG9uMi43L3R0eS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYWZiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdHR5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3R5cGVzLnB5IGIvbGliL3B5dGhvbjIuNy90eXBlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjkwZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy90eXBlcy5weQpAQCAtMCwwICsxLDg0IEBACisiIiJEZWZpbmUgbmFtZXMgZm9yIGFsbCB0eXBlIHN5bWJvbHMga25vd24gaW4gdGhlIHN0YW5kYXJkIGludGVycHJldGVyLgorCitUeXBlcyB0aGF0IGFyZSBwYXJ0IG9mIG9wdGlvbmFsIG1vZHVsZXMgKGUuZy4gYXJyYXkpIGFyZSBub3QgbGlzdGVkLgorIiIiCitpbXBvcnQgc3lzCisKKyMgSXRlcmF0b3JzIGluIFB5dGhvbiBhcmVuJ3QgYSBtYXR0ZXIgb2YgdHlwZSBidXQgb2YgcHJvdG9jb2wuICBBIGxhcmdlCisjIGFuZCBjaGFuZ2luZyBudW1iZXIgb2YgYnVpbHRpbiB0eXBlcyBpbXBsZW1lbnQgKnNvbWUqIGZsYXZvciBvZgorIyBpdGVyYXRvci4gIERvbid0IGNoZWNrIHRoZSB0eXBlISAgVXNlIGhhc2F0dHIgdG8gY2hlY2sgZm9yIGJvdGgKKyMgIl9faXRlcl9fIiBhbmQgIm5leHQiIGF0dHJpYnV0ZXMgaW5zdGVhZC4KKworTm9uZVR5cGUgPSB0eXBlKE5vbmUpCitUeXBlVHlwZSA9IHR5cGUKK09iamVjdFR5cGUgPSBvYmplY3QKKworSW50VHlwZSA9IGludAorTG9uZ1R5cGUgPSBsb25nCitGbG9hdFR5cGUgPSBmbG9hdAorQm9vbGVhblR5cGUgPSBib29sCit0cnk6CisgICAgQ29tcGxleFR5cGUgPSBjb21wbGV4CitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKKworU3RyaW5nVHlwZSA9IHN0cgorCisjIFN0cmluZ1R5cGVzIGlzIGFscmVhZHkgb3V0ZGF0ZWQuICBJbnN0ZWFkIG9mIHdyaXRpbmcgInR5cGUoeCkgaW4KKyMgdHlwZXMuU3RyaW5nVHlwZXMiLCB5b3Ugc2hvdWxkIHVzZSAiaXNpbnN0YW5jZSh4LCBiYXNlc3RyaW5nKSIuICBCdXQKKyMgd2Uga2VlcCBhcm91bmQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQeXRob24gMi4yLgordHJ5OgorICAgIFVuaWNvZGVUeXBlID0gdW5pY29kZQorICAgIFN0cmluZ1R5cGVzID0gKFN0cmluZ1R5cGUsIFVuaWNvZGVUeXBlKQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBTdHJpbmdUeXBlcyA9IChTdHJpbmdUeXBlLCkKKworQnVmZmVyVHlwZSA9IGJ1ZmZlcgorCitUdXBsZVR5cGUgPSB0dXBsZQorTGlzdFR5cGUgPSBsaXN0CitEaWN0VHlwZSA9IERpY3Rpb25hcnlUeXBlID0gZGljdAorCitkZWYgX2YoKTogcGFzcworRnVuY3Rpb25UeXBlID0gdHlwZShfZikKK0xhbWJkYVR5cGUgPSB0eXBlKGxhbWJkYTogTm9uZSkgICAgICAgICAjIFNhbWUgYXMgRnVuY3Rpb25UeXBlCitDb2RlVHlwZSA9IHR5cGUoX2YuZnVuY19jb2RlKQorCitkZWYgX2coKToKKyAgICB5aWVsZCAxCitHZW5lcmF0b3JUeXBlID0gdHlwZShfZygpKQorCitjbGFzcyBfQzoKKyAgICBkZWYgX20oc2VsZik6IHBhc3MKK0NsYXNzVHlwZSA9IHR5cGUoX0MpCitVbmJvdW5kTWV0aG9kVHlwZSA9IHR5cGUoX0MuX20pICAgICAgICAgIyBTYW1lIGFzIE1ldGhvZFR5cGUKK194ID0gX0MoKQorSW5zdGFuY2VUeXBlID0gdHlwZShfeCkKK01ldGhvZFR5cGUgPSB0eXBlKF94Ll9tKQorCitCdWlsdGluRnVuY3Rpb25UeXBlID0gdHlwZShsZW4pCitCdWlsdGluTWV0aG9kVHlwZSA9IHR5cGUoW10uYXBwZW5kKSAgICAgIyBTYW1lIGFzIEJ1aWx0aW5GdW5jdGlvblR5cGUKKworTW9kdWxlVHlwZSA9IHR5cGUoc3lzKQorRmlsZVR5cGUgPSBmaWxlCitYUmFuZ2VUeXBlID0geHJhbmdlCisKK3RyeToKKyAgICByYWlzZSBUeXBlRXJyb3IKK2V4Y2VwdCBUeXBlRXJyb3I6CisgICAgdGIgPSBzeXMuZXhjX2luZm8oKVsyXQorICAgIFRyYWNlYmFja1R5cGUgPSB0eXBlKHRiKQorICAgIEZyYW1lVHlwZSA9IHR5cGUodGIudGJfZnJhbWUpCisgICAgZGVsIHRiCisKK1NsaWNlVHlwZSA9IHNsaWNlCitFbGxpcHNpc1R5cGUgPSB0eXBlKEVsbGlwc2lzKQorCitEaWN0UHJveHlUeXBlID0gdHlwZShUeXBlVHlwZS5fX2RpY3RfXykKK05vdEltcGxlbWVudGVkVHlwZSA9IHR5cGUoTm90SW1wbGVtZW50ZWQpCisKKyMgRm9yIEp5dGhvbiwgdGhlIGZvbGxvd2luZyB0d28gdHlwZXMgYXJlIGlkZW50aWNhbAorR2V0U2V0RGVzY3JpcHRvclR5cGUgPSB0eXBlKEZ1bmN0aW9uVHlwZS5mdW5jX2NvZGUpCitNZW1iZXJEZXNjcmlwdG9yVHlwZSA9IHR5cGUoRnVuY3Rpb25UeXBlLmZ1bmNfZ2xvYmFscykKKworZGVsIHN5cywgX2YsIF9nLCBfQywgX3ggICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3R5cGVzLnB5YyBiL2xpYi9weXRob24yLjcvdHlwZXMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWM1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3R5cGVzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3R5cGVzLnB5byBiL2xpYi9weXRob24yLjcvdHlwZXMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MWM1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3R5cGVzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDFhM2YwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDY5IEBACisiIiIKK1B5dGhvbiB1bml0IHRlc3RpbmcgZnJhbWV3b3JrLCBiYXNlZCBvbiBFcmljaCBHYW1tYSdzIEpVbml0IGFuZCBLZW50IEJlY2sncworU21hbGx0YWxrIHRlc3RpbmcgZnJhbWV3b3JrLgorCitUaGlzIG1vZHVsZSBjb250YWlucyB0aGUgY29yZSBmcmFtZXdvcmsgY2xhc3NlcyB0aGF0IGZvcm0gdGhlIGJhc2lzIG9mCitzcGVjaWZpYyB0ZXN0IGNhc2VzIGFuZCBzdWl0ZXMgKFRlc3RDYXNlLCBUZXN0U3VpdGUgZXRjLiksIGFuZCBhbHNvIGEKK3RleHQtYmFzZWQgdXRpbGl0eSBjbGFzcyBmb3IgcnVubmluZyB0aGUgdGVzdHMgYW5kIHJlcG9ydGluZyB0aGUgcmVzdWx0cworIChUZXh0VGVzdFJ1bm5lcikuCisKK1NpbXBsZSB1c2FnZToKKworICAgIGltcG9ydCB1bml0dGVzdAorCisgICAgY2xhc3MgSW50ZWdlckFyaXRobWVudGljVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICBkZWYgdGVzdEFkZChzZWxmKTogICMjIHRlc3QgbWV0aG9kIG5hbWVzIGJlZ2luICd0ZXN0KicKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEgKyAyKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCArIDEsIDEpCisgICAgICAgIGRlZiB0ZXN0TXVsdGlwbHkoc2VsZik6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCgwICogMTApLCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoNSAqIDgpLCA0MCkKKworICAgIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgICAgIHVuaXR0ZXN0Lm1haW4oKQorCitGdXJ0aGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGUgYnVuZGxlZCBkb2N1bWVudGF0aW9uLCBhbmQgZnJvbQorCisgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS91bml0dGVzdC5odG1sCisKK0NvcHlyaWdodCAoYykgMTk5OS0yMDAzIFN0ZXZlIFB1cmNlbGwKK0NvcHlyaWdodCAoYykgMjAwMy0yMDEwIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCitUaGlzIG1vZHVsZSBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IG1heSByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQoraXQgdW5kZXIgdGhlIHNhbWUgdGVybXMgYXMgUHl0aG9uIGl0c2VsZiwgc28gbG9uZyBhcyB0aGlzIGNvcHlyaWdodCBtZXNzYWdlCithbmQgZGlzY2xhaW1lciBhcmUgcmV0YWluZWQgaW4gdGhlaXIgb3JpZ2luYWwgZm9ybS4KKworSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgVE8gQU5ZIFBBUlRZIEZPUiBESVJFQ1QsIElORElSRUNULAorU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIEFSSVNJTkcgT1VUIE9GIFRIRSBVU0UgT0YKK1RISVMgQ09ERSwgRVZFTiBJRiBUSEUgQVVUSE9SIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gKK0RBTUFHRS4KKworVEhFIEFVVEhPUiBTUEVDSUZJQ0FMTFkgRElTQ0xBSU1TIEFOWSBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKK0xJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBCitQQVJUSUNVTEFSIFBVUlBPU0UuICBUSEUgQ09ERSBQUk9WSURFRCBIRVJFVU5ERVIgSVMgT04gQU4gIkFTIElTIiBCQVNJUywKK0FORCBUSEVSRSBJUyBOTyBPQkxJR0FUSU9OIFdIQVRTT0VWRVIgVE8gUFJPVklERSBNQUlOVEVOQU5DRSwKK1NVUFBPUlQsIFVQREFURVMsIEVOSEFOQ0VNRU5UUywgT1IgTU9ESUZJQ0FUSU9OUy4KKyIiIgorCitfX2FsbF9fID0gWydUZXN0UmVzdWx0JywgJ1Rlc3RDYXNlJywgJ1Rlc3RTdWl0ZScsCisgICAgICAgICAgICdUZXh0VGVzdFJ1bm5lcicsICdUZXN0TG9hZGVyJywgJ0Z1bmN0aW9uVGVzdENhc2UnLCAnbWFpbicsCisgICAgICAgICAgICdkZWZhdWx0VGVzdExvYWRlcicsICdTa2lwVGVzdCcsICdza2lwJywgJ3NraXBJZicsICdza2lwVW5sZXNzJywKKyAgICAgICAgICAgJ2V4cGVjdGVkRmFpbHVyZScsICdUZXh0VGVzdFJlc3VsdCcsICdpbnN0YWxsSGFuZGxlcicsCisgICAgICAgICAgICdyZWdpc3RlclJlc3VsdCcsICdyZW1vdmVSZXN1bHQnLCAncmVtb3ZlSGFuZGxlciddCisKKyMgRXhwb3NlIG9ic29sZXRlIGZ1bmN0aW9ucyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKK19fYWxsX18uZXh0ZW5kKFsnZ2V0VGVzdENhc2VOYW1lcycsICdtYWtlU3VpdGUnLCAnZmluZFRlc3RDYXNlcyddKQorCitfX3VuaXR0ZXN0ID0gVHJ1ZQorCitmcm9tIC5yZXN1bHQgaW1wb3J0IFRlc3RSZXN1bHQKK2Zyb20gLmNhc2UgaW1wb3J0IChUZXN0Q2FzZSwgRnVuY3Rpb25UZXN0Q2FzZSwgU2tpcFRlc3QsIHNraXAsIHNraXBJZiwKKyAgICAgICAgICAgICAgICAgICBza2lwVW5sZXNzLCBleHBlY3RlZEZhaWx1cmUpCitmcm9tIC5zdWl0ZSBpbXBvcnQgQmFzZVRlc3RTdWl0ZSwgVGVzdFN1aXRlCitmcm9tIC5sb2FkZXIgaW1wb3J0IChUZXN0TG9hZGVyLCBkZWZhdWx0VGVzdExvYWRlciwgbWFrZVN1aXRlLCBnZXRUZXN0Q2FzZU5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgZmluZFRlc3RDYXNlcykKK2Zyb20gLm1haW4gaW1wb3J0IFRlc3RQcm9ncmFtLCBtYWluCitmcm9tIC5ydW5uZXIgaW1wb3J0IFRleHRUZXN0UnVubmVyLCBUZXh0VGVzdFJlc3VsdAorZnJvbSAuc2lnbmFscyBpbXBvcnQgaW5zdGFsbEhhbmRsZXIsIHJlZ2lzdGVyUmVzdWx0LCByZW1vdmVSZXN1bHQsIHJlbW92ZUhhbmRsZXIKKworIyBkZXByZWNhdGVkCitfVGV4dFRlc3RSZXN1bHQgPSBUZXh0VGVzdFJlc3VsdApkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTkyZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTkyZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19tYWluX18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMyMDA1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19tYWluX18ucHkKQEAgLTAsMCArMSwxMiBAQAorIiIiTWFpbiBlbnRyeSBwb2ludCIiIgorCitpbXBvcnQgc3lzCitpZiBzeXMuYXJndlswXS5lbmRzd2l0aCgiX19tYWluX18ucHkiKToKKyAgICBzeXMuYXJndlswXSA9ICJweXRob24gLW0gdW5pdHRlc3QiCisKK19fdW5pdHRlc3QgPSBUcnVlCisKK2Zyb20gLm1haW4gaW1wb3J0IG1haW4sIFRlc3RQcm9ncmFtLCBVU0FHRV9BU19NQUlOCitUZXN0UHJvZ3JhbS5VU0FHRSA9IFVTQUdFX0FTX01BSU4KKworbWFpbihtb2R1bGU9Tm9uZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19tYWluX18ucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5MGYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19tYWluX18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19tYWluX18ucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9fX21haW5fXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5MGYyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvX19tYWluX18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGNiNDRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9jYXNlLnB5CkBAIC0wLDAgKzEsMTA3NiBAQAorIiIiVGVzdCBjYXNlIGltcGxlbWVudGF0aW9uIiIiCisKK2ltcG9ydCBjb2xsZWN0aW9ucworaW1wb3J0IHN5cworaW1wb3J0IGZ1bmN0b29scworaW1wb3J0IGRpZmZsaWIKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCByZQoraW1wb3J0IHR5cGVzCitpbXBvcnQgd2FybmluZ3MKKworZnJvbSAuIGltcG9ydCByZXN1bHQKK2Zyb20gLnV0aWwgaW1wb3J0ICgKKyAgICBzdHJjbGFzcywgc2FmZV9yZXByLCB1bm9yZGVyYWJsZV9saXN0X2RpZmZlcmVuY2UsCisgICAgX2NvdW50X2RpZmZfYWxsX3B1cnBvc2UsIF9jb3VudF9kaWZmX2hhc2hhYmxlCispCisKKworX191bml0dGVzdCA9IFRydWUKKworCitESUZGX09NSVRURUQgPSAoJ1xuRGlmZiBpcyAlcyBjaGFyYWN0ZXJzIGxvbmcuICcKKyAgICAgICAgICAgICAgICAgJ1NldCBzZWxmLm1heERpZmYgdG8gTm9uZSB0byBzZWUgaXQuJykKKworY2xhc3MgU2tpcFRlc3QoRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBSYWlzZSB0aGlzIGV4Y2VwdGlvbiBpbiBhIHRlc3QgdG8gc2tpcCBpdC4KKworICAgIFVzdWFsbHkgeW91IGNhbiB1c2UgVGVzdENhc2Uuc2tpcFRlc3QoKSBvciBvbmUgb2YgdGhlIHNraXBwaW5nIGRlY29yYXRvcnMKKyAgICBpbnN0ZWFkIG9mIHJhaXNpbmcgdGhpcyBkaXJlY3RseS4KKyAgICAiIiIKKyAgICBwYXNzCisKK2NsYXNzIF9FeHBlY3RlZEZhaWx1cmUoRXhjZXB0aW9uKToKKyAgICAiIiIKKyAgICBSYWlzZSB0aGlzIHdoZW4gYSB0ZXN0IGlzIGV4cGVjdGVkIHRvIGZhaWwuCisKKyAgICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleGNfaW5mbyk6CisgICAgICAgIHN1cGVyKF9FeHBlY3RlZEZhaWx1cmUsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5leGNfaW5mbyA9IGV4Y19pbmZvCisKK2NsYXNzIF9VbmV4cGVjdGVkU3VjY2VzcyhFeGNlcHRpb24pOgorICAgICIiIgorICAgIFRoZSB0ZXN0IHdhcyBzdXBwb3NlZCB0byBmYWlsLCBidXQgaXQgZGlkbid0IQorICAgICIiIgorICAgIHBhc3MKKworZGVmIF9pZChvYmopOgorICAgIHJldHVybiBvYmoKKworZGVmIHNraXAocmVhc29uKToKKyAgICAiIiIKKyAgICBVbmNvbmRpdGlvbmFsbHkgc2tpcCBhIHRlc3QuCisgICAgIiIiCisgICAgZGVmIGRlY29yYXRvcih0ZXN0X2l0ZW0pOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0ZXN0X2l0ZW0sICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpKToKKyAgICAgICAgICAgIEBmdW5jdG9vbHMud3JhcHModGVzdF9pdGVtKQorICAgICAgICAgICAgZGVmIHNraXBfd3JhcHBlcigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIHJhaXNlIFNraXBUZXN0KHJlYXNvbikKKyAgICAgICAgICAgIHRlc3RfaXRlbSA9IHNraXBfd3JhcHBlcgorCisgICAgICAgIHRlc3RfaXRlbS5fX3VuaXR0ZXN0X3NraXBfXyA9IFRydWUKKyAgICAgICAgdGVzdF9pdGVtLl9fdW5pdHRlc3Rfc2tpcF93aHlfXyA9IHJlYXNvbgorICAgICAgICByZXR1cm4gdGVzdF9pdGVtCisgICAgcmV0dXJuIGRlY29yYXRvcgorCitkZWYgc2tpcElmKGNvbmRpdGlvbiwgcmVhc29uKToKKyAgICAiIiIKKyAgICBTa2lwIGEgdGVzdCBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUuCisgICAgIiIiCisgICAgaWYgY29uZGl0aW9uOgorICAgICAgICByZXR1cm4gc2tpcChyZWFzb24pCisgICAgcmV0dXJuIF9pZAorCitkZWYgc2tpcFVubGVzcyhjb25kaXRpb24sIHJlYXNvbik6CisgICAgIiIiCisgICAgU2tpcCBhIHRlc3QgdW5sZXNzIHRoZSBjb25kaXRpb24gaXMgdHJ1ZS4KKyAgICAiIiIKKyAgICBpZiBub3QgY29uZGl0aW9uOgorICAgICAgICByZXR1cm4gc2tpcChyZWFzb24pCisgICAgcmV0dXJuIF9pZAorCisKK2RlZiBleHBlY3RlZEZhaWx1cmUoZnVuYyk6CisgICAgQGZ1bmN0b29scy53cmFwcyhmdW5jKQorICAgIGRlZiB3cmFwcGVyKCphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICAgICAgcmFpc2UgX0V4cGVjdGVkRmFpbHVyZShzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgcmFpc2UgX1VuZXhwZWN0ZWRTdWNjZXNzCisgICAgcmV0dXJuIHdyYXBwZXIKKworCitjbGFzcyBfQXNzZXJ0UmFpc2VzQ29udGV4dChvYmplY3QpOgorICAgICIiIkEgY29udGV4dCBtYW5hZ2VyIHVzZWQgdG8gaW1wbGVtZW50IFRlc3RDYXNlLmFzc2VydFJhaXNlcyogbWV0aG9kcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBleHBlY3RlZCwgdGVzdF9jYXNlLCBleHBlY3RlZF9yZWdleHA9Tm9uZSk6CisgICAgICAgIHNlbGYuZXhwZWN0ZWQgPSBleHBlY3RlZAorICAgICAgICBzZWxmLmZhaWx1cmVFeGNlcHRpb24gPSB0ZXN0X2Nhc2UuZmFpbHVyZUV4Y2VwdGlvbgorICAgICAgICBzZWxmLmV4cGVjdGVkX3JlZ2V4cCA9IGV4cGVjdGVkX3JlZ2V4cAorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlLCB0Yik6CisgICAgICAgIGlmIGV4Y190eXBlIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZXhjX25hbWUgPSBzZWxmLmV4cGVjdGVkLl9fbmFtZV9fCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgZXhjX25hbWUgPSBzdHIoc2VsZi5leHBlY3RlZCkKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiezB9IG5vdCByYWlzZWQiLmZvcm1hdChleGNfbmFtZSkpCisgICAgICAgIGlmIG5vdCBpc3N1YmNsYXNzKGV4Y190eXBlLCBzZWxmLmV4cGVjdGVkKToKKyAgICAgICAgICAgICMgbGV0IHVuZXhwZWN0ZWQgZXhjZXB0aW9ucyBwYXNzIHRocm91Z2gKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBzZWxmLmV4Y2VwdGlvbiA9IGV4Y192YWx1ZSAjIHN0b3JlIGZvciBsYXRlciByZXRyaWV2YWwKKyAgICAgICAgaWYgc2VsZi5leHBlY3RlZF9yZWdleHAgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgZXhwZWN0ZWRfcmVnZXhwID0gc2VsZi5leHBlY3RlZF9yZWdleHAKKyAgICAgICAgaWYgaXNpbnN0YW5jZShleHBlY3RlZF9yZWdleHAsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgZXhwZWN0ZWRfcmVnZXhwID0gcmUuY29tcGlsZShleHBlY3RlZF9yZWdleHApCisgICAgICAgIGlmIG5vdCBleHBlY3RlZF9yZWdleHAuc2VhcmNoKHN0cihleGNfdmFsdWUpKToKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbignIiVzIiBkb2VzIG5vdCBtYXRjaCAiJXMiJyAlCisgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfcmVnZXhwLnBhdHRlcm4sIHN0cihleGNfdmFsdWUpKSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworCitjbGFzcyBUZXN0Q2FzZShvYmplY3QpOgorICAgICIiIkEgY2xhc3Mgd2hvc2UgaW5zdGFuY2VzIGFyZSBzaW5nbGUgdGVzdCBjYXNlcy4KKworICAgIEJ5IGRlZmF1bHQsIHRoZSB0ZXN0IGNvZGUgaXRzZWxmIHNob3VsZCBiZSBwbGFjZWQgaW4gYSBtZXRob2QgbmFtZWQKKyAgICAncnVuVGVzdCcuCisKKyAgICBJZiB0aGUgZml4dHVyZSBtYXkgYmUgdXNlZCBmb3IgbWFueSB0ZXN0IGNhc2VzLCBjcmVhdGUgYXMKKyAgICBtYW55IHRlc3QgbWV0aG9kcyBhcyBhcmUgbmVlZGVkLiBXaGVuIGluc3RhbnRpYXRpbmcgc3VjaCBhIFRlc3RDYXNlCisgICAgc3ViY2xhc3MsIHNwZWNpZnkgaW4gdGhlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB0aGUgbmFtZSBvZiB0aGUgdGVzdCBtZXRob2QKKyAgICB0aGF0IHRoZSBpbnN0YW5jZSBpcyB0byBleGVjdXRlLgorCisgICAgVGVzdCBhdXRob3JzIHNob3VsZCBzdWJjbGFzcyBUZXN0Q2FzZSBmb3IgdGhlaXIgb3duIHRlc3RzLiBDb25zdHJ1Y3Rpb24KKyAgICBhbmQgZGVjb25zdHJ1Y3Rpb24gb2YgdGhlIHRlc3QncyBlbnZpcm9ubWVudCAoJ2ZpeHR1cmUnKSBjYW4gYmUKKyAgICBpbXBsZW1lbnRlZCBieSBvdmVycmlkaW5nIHRoZSAnc2V0VXAnIGFuZCAndGVhckRvd24nIG1ldGhvZHMgcmVzcGVjdGl2ZWx5LgorCisgICAgSWYgaXQgaXMgbmVjZXNzYXJ5IHRvIG92ZXJyaWRlIHRoZSBfX2luaXRfXyBtZXRob2QsIHRoZSBiYXNlIGNsYXNzCisgICAgX19pbml0X18gbWV0aG9kIG11c3QgYWx3YXlzIGJlIGNhbGxlZC4gSXQgaXMgaW1wb3J0YW50IHRoYXQgc3ViY2xhc3NlcworICAgIHNob3VsZCBub3QgY2hhbmdlIHRoZSBzaWduYXR1cmUgb2YgdGhlaXIgX19pbml0X18gbWV0aG9kLCBzaW5jZSBpbnN0YW5jZXMKKyAgICBvZiB0aGUgY2xhc3NlcyBhcmUgaW5zdGFudGlhdGVkIGF1dG9tYXRpY2FsbHkgYnkgcGFydHMgb2YgdGhlIGZyYW1ld29yaworICAgIGluIG9yZGVyIHRvIGJlIHJ1bi4KKworICAgIFdoZW4gc3ViY2xhc3NpbmcgVGVzdENhc2UsIHlvdSBjYW4gc2V0IHRoZXNlIGF0dHJpYnV0ZXM6CisgICAgKiBmYWlsdXJlRXhjZXB0aW9uOiBkZXRlcm1pbmVzIHdoaWNoIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCB3aGVuCisgICAgICAgIHRoZSBpbnN0YW5jZSdzIGFzc2VydGlvbiBtZXRob2RzIGZhaWw7IHRlc3QgbWV0aG9kcyByYWlzaW5nIHRoaXMKKyAgICAgICAgZXhjZXB0aW9uIHdpbGwgYmUgZGVlbWVkIHRvIGhhdmUgJ2ZhaWxlZCcgcmF0aGVyIHRoYW4gJ2Vycm9yZWQnLgorICAgICogbG9uZ01lc3NhZ2U6IGRldGVybWluZXMgd2hldGhlciBsb25nIG1lc3NhZ2VzIChpbmNsdWRpbmcgcmVwciBvZgorICAgICAgICBvYmplY3RzIHVzZWQgaW4gYXNzZXJ0IG1ldGhvZHMpIHdpbGwgYmUgcHJpbnRlZCBvbiBmYWlsdXJlIGluICphZGRpdGlvbioKKyAgICAgICAgdG8gYW55IGV4cGxpY2l0IG1lc3NhZ2UgcGFzc2VkLgorICAgICogbWF4RGlmZjogc2V0cyB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSBkaWZmIGluIGZhaWx1cmUgbWVzc2FnZXMKKyAgICAgICAgYnkgYXNzZXJ0IG1ldGhvZHMgdXNpbmcgZGlmZmxpYi4gSXQgaXMgbG9va2VkIHVwIGFzIGFuIGluc3RhbmNlCisgICAgICAgIGF0dHJpYnV0ZSBzbyBjYW4gYmUgY29uZmlndXJlZCBieSBpbmRpdmlkdWFsIHRlc3RzIGlmIHJlcXVpcmVkLgorICAgICIiIgorCisgICAgZmFpbHVyZUV4Y2VwdGlvbiA9IEFzc2VydGlvbkVycm9yCisKKyAgICBsb25nTWVzc2FnZSA9IEZhbHNlCisKKyAgICBtYXhEaWZmID0gODAqOAorCisgICAgIyBJZiBhIHN0cmluZyBpcyBsb25nZXIgdGhhbiBfZGlmZlRocmVzaG9sZCwgdXNlIG5vcm1hbCBjb21wYXJpc29uIGluc3RlYWQKKyAgICAjIG9mIGRpZmZsaWIuICBTZWUgIzExNzYzLgorICAgIF9kaWZmVGhyZXNob2xkID0gMioqMTYKKworICAgICMgQXR0cmlidXRlIHVzZWQgYnkgVGVzdFN1aXRlIGZvciBjbGFzc1NldFVwCisKKyAgICBfY2xhc3NTZXR1cEZhaWxlZCA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgorICAgICAgICAiIiJDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHRoYXQgd2lsbCB1c2UgdGhlIG5hbWVkIHRlc3QKKyAgICAgICAgICAgbWV0aG9kIHdoZW4gZXhlY3V0ZWQuIFJhaXNlcyBhIFZhbHVlRXJyb3IgaWYgdGhlIGluc3RhbmNlIGRvZXMKKyAgICAgICAgICAgbm90IGhhdmUgYSBtZXRob2Qgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLl90ZXN0TWV0aG9kTmFtZSA9IG1ldGhvZE5hbWUKKyAgICAgICAgc2VsZi5fcmVzdWx0Rm9yRG9DbGVhbnVwcyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdE1ldGhvZCA9IGdldGF0dHIoc2VsZiwgbWV0aG9kTmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigibm8gc3VjaCB0ZXN0IG1ldGhvZCBpbiAlczogJXMiICUKKyAgICAgICAgICAgICAgICAgIChzZWxmLl9fY2xhc3NfXywgbWV0aG9kTmFtZSkpCisgICAgICAgIHNlbGYuX3Rlc3RNZXRob2REb2MgPSB0ZXN0TWV0aG9kLl9fZG9jX18KKyAgICAgICAgc2VsZi5fY2xlYW51cHMgPSBbXQorCisgICAgICAgICMgTWFwIHR5cGVzIHRvIGN1c3RvbSBhc3NlcnRFcXVhbCBmdW5jdGlvbnMgdGhhdCB3aWxsIGNvbXBhcmUKKyAgICAgICAgIyBpbnN0YW5jZXMgb2Ygc2FpZCB0eXBlIGluIG1vcmUgZGV0YWlsIHRvIGdlbmVyYXRlIGEgbW9yZSB1c2VmdWwKKyAgICAgICAgIyBlcnJvciBtZXNzYWdlLgorICAgICAgICBzZWxmLl90eXBlX2VxdWFsaXR5X2Z1bmNzID0ge30KKyAgICAgICAgc2VsZi5hZGRUeXBlRXF1YWxpdHlGdW5jKGRpY3QsICdhc3NlcnREaWN0RXF1YWwnKQorICAgICAgICBzZWxmLmFkZFR5cGVFcXVhbGl0eUZ1bmMobGlzdCwgJ2Fzc2VydExpc3RFcXVhbCcpCisgICAgICAgIHNlbGYuYWRkVHlwZUVxdWFsaXR5RnVuYyh0dXBsZSwgJ2Fzc2VydFR1cGxlRXF1YWwnKQorICAgICAgICBzZWxmLmFkZFR5cGVFcXVhbGl0eUZ1bmMoc2V0LCAnYXNzZXJ0U2V0RXF1YWwnKQorICAgICAgICBzZWxmLmFkZFR5cGVFcXVhbGl0eUZ1bmMoZnJvemVuc2V0LCAnYXNzZXJ0U2V0RXF1YWwnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFkZFR5cGVFcXVhbGl0eUZ1bmModW5pY29kZSwgJ2Fzc2VydE11bHRpTGluZUVxdWFsJykKKyAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKKyAgICAgICAgICAgICMgTm8gdW5pY29kZSBzdXBwb3J0IGluIHRoaXMgYnVpbGQKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBhZGRUeXBlRXF1YWxpdHlGdW5jKHNlbGYsIHR5cGVvYmosIGZ1bmN0aW9uKToKKyAgICAgICAgIiIiQWRkIGEgdHlwZSBzcGVjaWZpYyBhc3NlcnRFcXVhbCBzdHlsZSBmdW5jdGlvbiB0byBjb21wYXJlIGEgdHlwZS4KKworICAgICAgICBUaGlzIG1ldGhvZCBpcyBmb3IgdXNlIGJ5IFRlc3RDYXNlIHN1YmNsYXNzZXMgdGhhdCBuZWVkIHRvIHJlZ2lzdGVyCisgICAgICAgIHRoZWlyIG93biB0eXBlIGVxdWFsaXR5IGZ1bmN0aW9ucyB0byBwcm92aWRlIG5pY2VyIGVycm9yIG1lc3NhZ2VzLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICB0eXBlb2JqOiBUaGUgZGF0YSB0eXBlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBvbiB3aGVuIGJvdGggdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIGFyZSBvZiB0aGUgc2FtZSB0eXBlIGluIGFzc2VydEVxdWFsKCkuCisgICAgICAgICAgICBmdW5jdGlvbjogVGhlIGNhbGxhYmxlIHRha2luZyB0d28gYXJndW1lbnRzIGFuZCBhbiBvcHRpb25hbAorICAgICAgICAgICAgICAgICAgICBtc2c9IGFyZ3VtZW50IHRoYXQgcmFpc2VzIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiB3aXRoIGEKKyAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUgdHdvIGFyZ3VtZW50cyBhcmUgbm90IGVxdWFsLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fdHlwZV9lcXVhbGl0eV9mdW5jc1t0eXBlb2JqXSA9IGZ1bmN0aW9uCisKKyAgICBkZWYgYWRkQ2xlYW51cChzZWxmLCBmdW5jdGlvbiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiQWRkIGEgZnVuY3Rpb24sIHdpdGggYXJndW1lbnRzLCB0byBiZSBjYWxsZWQgd2hlbiB0aGUgdGVzdCBpcworICAgICAgICBjb21wbGV0ZWQuIEZ1bmN0aW9ucyBhZGRlZCBhcmUgY2FsbGVkIG9uIGEgTElGTyBiYXNpcyBhbmQgYXJlCisgICAgICAgIGNhbGxlZCBhZnRlciB0ZWFyRG93biBvbiB0ZXN0IGZhaWx1cmUgb3Igc3VjY2Vzcy4KKworICAgICAgICBDbGVhbnVwIGl0ZW1zIGFyZSBjYWxsZWQgZXZlbiBpZiBzZXRVcCBmYWlscyAodW5saWtlIHRlYXJEb3duKS4iIiIKKyAgICAgICAgc2VsZi5fY2xlYW51cHMuYXBwZW5kKChmdW5jdGlvbiwgYXJncywga3dhcmdzKSkKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgIkhvb2sgbWV0aG9kIGZvciBzZXR0aW5nIHVwIHRoZSB0ZXN0IGZpeHR1cmUgYmVmb3JlIGV4ZXJjaXNpbmcgaXQuIgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICJIb29rIG1ldGhvZCBmb3IgZGVjb25zdHJ1Y3RpbmcgdGhlIHRlc3QgZml4dHVyZSBhZnRlciB0ZXN0aW5nIGl0LiIKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgIkhvb2sgbWV0aG9kIGZvciBzZXR0aW5nIHVwIGNsYXNzIGZpeHR1cmUgYmVmb3JlIHJ1bm5pbmcgdGVzdHMgaW4gdGhlIGNsYXNzLiIKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICJIb29rIG1ldGhvZCBmb3IgZGVjb25zdHJ1Y3RpbmcgdGhlIGNsYXNzIGZpeHR1cmUgYWZ0ZXIgcnVubmluZyBhbGwgdGVzdHMgaW4gdGhlIGNsYXNzLiIKKworICAgIGRlZiBjb3VudFRlc3RDYXNlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBkZWZhdWx0VGVzdFJlc3VsdChzZWxmKToKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5UZXN0UmVzdWx0KCkKKworICAgIGRlZiBzaG9ydERlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIGEgb25lLWxpbmUgZGVzY3JpcHRpb24gb2YgdGhlIHRlc3QsIG9yIE5vbmUgaWYgbm8KKyAgICAgICAgZGVzY3JpcHRpb24gaGFzIGJlZW4gcHJvdmlkZWQuCisKKyAgICAgICAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZgorICAgICAgICB0aGUgc3BlY2lmaWVkIHRlc3QgbWV0aG9kJ3MgZG9jc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgZG9jID0gc2VsZi5fdGVzdE1ldGhvZERvYworICAgICAgICByZXR1cm4gZG9jIGFuZCBkb2Muc3BsaXQoIlxuIilbMF0uc3RyaXAoKSBvciBOb25lCisKKworICAgIGRlZiBpZChzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcy4lcyIgJSAoc3RyY2xhc3Moc2VsZi5fX2NsYXNzX18pLCBzZWxmLl90ZXN0TWV0aG9kTmFtZSkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiB0eXBlKHNlbGYpIGlzIG5vdCB0eXBlKG90aGVyKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgICAgIHJldHVybiBzZWxmLl90ZXN0TWV0aG9kTmFtZSA9PSBvdGhlci5fdGVzdE1ldGhvZE5hbWUKKworICAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goKHR5cGUoc2VsZiksIHNlbGYuX3Rlc3RNZXRob2ROYW1lKSkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzICglcykiICUgKHNlbGYuX3Rlc3RNZXRob2ROYW1lLCBzdHJjbGFzcyhzZWxmLl9fY2xhc3NfXykpCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPCVzIHRlc3RNZXRob2Q9JXM+IiAlIFwKKyAgICAgICAgICAgICAgIChzdHJjbGFzcyhzZWxmLl9fY2xhc3NfXyksIHNlbGYuX3Rlc3RNZXRob2ROYW1lKQorCisgICAgZGVmIF9hZGRTa2lwKHNlbGYsIHJlc3VsdCwgcmVhc29uKToKKyAgICAgICAgYWRkU2tpcCA9IGdldGF0dHIocmVzdWx0LCAnYWRkU2tpcCcsIE5vbmUpCisgICAgICAgIGlmIGFkZFNraXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhZGRTa2lwKHNlbGYsIHJlYXNvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlRlc3RSZXN1bHQgaGFzIG5vIGFkZFNraXAgbWV0aG9kLCBza2lwcyBub3QgcmVwb3J0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZywgMikKKyAgICAgICAgICAgIHJlc3VsdC5hZGRTdWNjZXNzKHNlbGYpCisKKyAgICBkZWYgcnVuKHNlbGYsIHJlc3VsdD1Ob25lKToKKyAgICAgICAgb3JpZ19yZXN1bHQgPSByZXN1bHQKKyAgICAgICAgaWYgcmVzdWx0IGlzIE5vbmU6CisgICAgICAgICAgICByZXN1bHQgPSBzZWxmLmRlZmF1bHRUZXN0UmVzdWx0KCkKKyAgICAgICAgICAgIHN0YXJ0VGVzdFJ1biA9IGdldGF0dHIocmVzdWx0LCAnc3RhcnRUZXN0UnVuJywgTm9uZSkKKyAgICAgICAgICAgIGlmIHN0YXJ0VGVzdFJ1biBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzdGFydFRlc3RSdW4oKQorCisgICAgICAgIHNlbGYuX3Jlc3VsdEZvckRvQ2xlYW51cHMgPSByZXN1bHQKKyAgICAgICAgcmVzdWx0LnN0YXJ0VGVzdChzZWxmKQorCisgICAgICAgIHRlc3RNZXRob2QgPSBnZXRhdHRyKHNlbGYsIHNlbGYuX3Rlc3RNZXRob2ROYW1lKQorICAgICAgICBpZiAoZ2V0YXR0cihzZWxmLl9fY2xhc3NfXywgIl9fdW5pdHRlc3Rfc2tpcF9fIiwgRmFsc2UpIG9yCisgICAgICAgICAgICBnZXRhdHRyKHRlc3RNZXRob2QsICJfX3VuaXR0ZXN0X3NraXBfXyIsIEZhbHNlKSk6CisgICAgICAgICAgICAjIElmIHRoZSBjbGFzcyBvciBtZXRob2Qgd2FzIHNraXBwZWQuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2tpcF93aHkgPSAoZ2V0YXR0cihzZWxmLl9fY2xhc3NfXywgJ19fdW5pdHRlc3Rfc2tpcF93aHlfXycsICcnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGdldGF0dHIodGVzdE1ldGhvZCwgJ19fdW5pdHRlc3Rfc2tpcF93aHlfXycsICcnKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRTa2lwKHJlc3VsdCwgc2tpcF93aHkpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHJlc3VsdC5zdG9wVGVzdChzZWxmKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBGYWxzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc2V0VXAoKQorICAgICAgICAgICAgZXhjZXB0IFNraXBUZXN0IGFzIGU6CisgICAgICAgICAgICAgICAgc2VsZi5fYWRkU2tpcChyZXN1bHQsIHN0cihlKSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihzZWxmLCBzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB0ZXN0TWV0aG9kKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEZhaWx1cmUoc2VsZiwgc3lzLmV4Y19pbmZvKCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IF9FeHBlY3RlZEZhaWx1cmUgYXMgZToKKyAgICAgICAgICAgICAgICAgICAgYWRkRXhwZWN0ZWRGYWlsdXJlID0gZ2V0YXR0cihyZXN1bHQsICdhZGRFeHBlY3RlZEZhaWx1cmUnLCBOb25lKQorICAgICAgICAgICAgICAgICAgICBpZiBhZGRFeHBlY3RlZEZhaWx1cmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRFeHBlY3RlZEZhaWx1cmUoc2VsZiwgZS5leGNfaW5mbykKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIlRlc3RSZXN1bHQgaGFzIG5vIGFkZEV4cGVjdGVkRmFpbHVyZSBtZXRob2QsIHJlcG9ydGluZyBhcyBwYXNzZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRTdWNjZXNzKHNlbGYpCisgICAgICAgICAgICAgICAgZXhjZXB0IF9VbmV4cGVjdGVkU3VjY2VzczoKKyAgICAgICAgICAgICAgICAgICAgYWRkVW5leHBlY3RlZFN1Y2Nlc3MgPSBnZXRhdHRyKHJlc3VsdCwgJ2FkZFVuZXhwZWN0ZWRTdWNjZXNzJywgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgYWRkVW5leHBlY3RlZFN1Y2Nlc3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBhZGRVbmV4cGVjdGVkU3VjY2VzcyhzZWxmKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3Mud2FybigiVGVzdFJlc3VsdCBoYXMgbm8gYWRkVW5leHBlY3RlZFN1Y2Nlc3MgbWV0aG9kLCByZXBvcnRpbmcgYXMgZmFpbHVyZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRGYWlsdXJlKHNlbGYsIHN5cy5leGNfaW5mbygpKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBTa2lwVGVzdCBhcyBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9hZGRTa2lwKHJlc3VsdCwgc3RyKGUpKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVycm9yKHNlbGYsIHN5cy5leGNfaW5mbygpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBUcnVlCisKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVhckRvd24oKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRFcnJvcihzZWxmLCBzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IEZhbHNlCisKKyAgICAgICAgICAgIGNsZWFuVXBTdWNjZXNzID0gc2VsZi5kb0NsZWFudXBzKCkKKyAgICAgICAgICAgIHN1Y2Nlc3MgPSBzdWNjZXNzIGFuZCBjbGVhblVwU3VjY2VzcworICAgICAgICAgICAgaWYgc3VjY2VzczoKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkU3VjY2VzcyhzZWxmKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgcmVzdWx0LnN0b3BUZXN0KHNlbGYpCisgICAgICAgICAgICBpZiBvcmlnX3Jlc3VsdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHN0b3BUZXN0UnVuID0gZ2V0YXR0cihyZXN1bHQsICdzdG9wVGVzdFJ1bicsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgc3RvcFRlc3RSdW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHN0b3BUZXN0UnVuKCkKKworICAgIGRlZiBkb0NsZWFudXBzKHNlbGYpOgorICAgICAgICAiIiJFeGVjdXRlIGFsbCBjbGVhbnVwIGZ1bmN0aW9ucy4gTm9ybWFsbHkgY2FsbGVkIGZvciB5b3UgYWZ0ZXIKKyAgICAgICAgdGVhckRvd24uIiIiCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX3Jlc3VsdEZvckRvQ2xlYW51cHMKKyAgICAgICAgb2sgPSBUcnVlCisgICAgICAgIHdoaWxlIHNlbGYuX2NsZWFudXBzOgorICAgICAgICAgICAgZnVuY3Rpb24sIGFyZ3MsIGt3YXJncyA9IHNlbGYuX2NsZWFudXBzLnBvcCgtMSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmdW5jdGlvbigqYXJncywgKiprd2FyZ3MpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBvayA9IEZhbHNlCisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEVycm9yKHNlbGYsIHN5cy5leGNfaW5mbygpKQorICAgICAgICByZXR1cm4gb2sKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuKCphcmdzLCAqKmt3ZHMpCisKKyAgICBkZWYgZGVidWcoc2VsZik6CisgICAgICAgICIiIlJ1biB0aGUgdGVzdCB3aXRob3V0IGNvbGxlY3RpbmcgZXJyb3JzIGluIGEgVGVzdFJlc3VsdCIiIgorICAgICAgICBzZWxmLnNldFVwKCkKKyAgICAgICAgZ2V0YXR0cihzZWxmLCBzZWxmLl90ZXN0TWV0aG9kTmFtZSkoKQorICAgICAgICBzZWxmLnRlYXJEb3duKCkKKyAgICAgICAgd2hpbGUgc2VsZi5fY2xlYW51cHM6CisgICAgICAgICAgICBmdW5jdGlvbiwgYXJncywga3dhcmdzID0gc2VsZi5fY2xlYW51cHMucG9wKC0xKQorICAgICAgICAgICAgZnVuY3Rpb24oKmFyZ3MsICoqa3dhcmdzKQorCisgICAgZGVmIHNraXBUZXN0KHNlbGYsIHJlYXNvbik6CisgICAgICAgICIiIlNraXAgdGhpcyB0ZXN0LiIiIgorICAgICAgICByYWlzZSBTa2lwVGVzdChyZWFzb24pCisKKyAgICBkZWYgZmFpbChzZWxmLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkZhaWwgaW1tZWRpYXRlbHksIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuIiIiCisgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbihtc2cpCisKKyAgICBkZWYgYXNzZXJ0RmFsc2Uoc2VsZiwgZXhwciwgbXNnPU5vbmUpOgorICAgICAgICAiIiJDaGVjayB0aGF0IHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLiIiIgorICAgICAgICBpZiBleHByOgorICAgICAgICAgICAgbXNnID0gc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csICIlcyBpcyBub3QgZmFsc2UiICUgc2FmZV9yZXByKGV4cHIpKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZykKKworICAgIGRlZiBhc3NlcnRUcnVlKHNlbGYsIGV4cHIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiQ2hlY2sgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyB0cnVlLiIiIgorICAgICAgICBpZiBub3QgZXhwcjoKKyAgICAgICAgICAgIG1zZyA9IHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCAiJXMgaXMgbm90IHRydWUiICUgc2FmZV9yZXByKGV4cHIpKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZykKKworICAgIGRlZiBfZm9ybWF0TWVzc2FnZShzZWxmLCBtc2csIHN0YW5kYXJkTXNnKToKKyAgICAgICAgIiIiSG9ub3VyIHRoZSBsb25nTWVzc2FnZSBhdHRyaWJ1dGUgd2hlbiBnZW5lcmF0aW5nIGZhaWx1cmUgbWVzc2FnZXMuCisgICAgICAgIElmIGxvbmdNZXNzYWdlIGlzIEZhbHNlIHRoaXMgbWVhbnM6CisgICAgICAgICogVXNlIG9ubHkgYW4gZXhwbGljaXQgbWVzc2FnZSBpZiBpdCBpcyBwcm92aWRlZAorICAgICAgICAqIE90aGVyd2lzZSB1c2UgdGhlIHN0YW5kYXJkIG1lc3NhZ2UgZm9yIHRoZSBhc3NlcnQKKworICAgICAgICBJZiBsb25nTWVzc2FnZSBpcyBUcnVlOgorICAgICAgICAqIFVzZSB0aGUgc3RhbmRhcmQgbWVzc2FnZQorICAgICAgICAqIElmIGFuIGV4cGxpY2l0IG1lc3NhZ2UgaXMgcHJvdmlkZWQsIHBsdXMgJyA6ICcgYW5kIHRoZSBleHBsaWNpdCBtZXNzYWdlCisgICAgICAgICIiIgorICAgICAgICBpZiBub3Qgc2VsZi5sb25nTWVzc2FnZToKKyAgICAgICAgICAgIHJldHVybiBtc2cgb3Igc3RhbmRhcmRNc2cKKyAgICAgICAgaWYgbXNnIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc3RhbmRhcmRNc2cKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBkb24ndCBzd2l0Y2ggdG8gJ3t9JyBmb3JtYXR0aW5nIGluIFB5dGhvbiAyLlgKKyAgICAgICAgICAgICMgaXQgY2hhbmdlcyB0aGUgd2F5IHVuaWNvZGUgaW5wdXQgaXMgaGFuZGxlZAorICAgICAgICAgICAgcmV0dXJuICclcyA6ICVzJyAlIChzdGFuZGFyZE1zZywgbXNnKQorICAgICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuICAnJXMgOiAlcycgJSAoc2FmZV9yZXByKHN0YW5kYXJkTXNnKSwgc2FmZV9yZXByKG1zZykpCisKKworICAgIGRlZiBhc3NlcnRSYWlzZXMoc2VsZiwgZXhjQ2xhc3MsIGNhbGxhYmxlT2JqPU5vbmUsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgICIiIkZhaWwgdW5sZXNzIGFuIGV4Y2VwdGlvbiBvZiBjbGFzcyBleGNDbGFzcyBpcyByYWlzZWQKKyAgICAgICAgICAgYnkgY2FsbGFibGVPYmogd2hlbiBpbnZva2VkIHdpdGggYXJndW1lbnRzIGFyZ3MgYW5kIGtleXdvcmQKKyAgICAgICAgICAgYXJndW1lbnRzIGt3YXJncy4gSWYgYSBkaWZmZXJlbnQgdHlwZSBvZiBleGNlcHRpb24gaXMKKyAgICAgICAgICAgcmFpc2VkLCBpdCB3aWxsIG5vdCBiZSBjYXVnaHQsIGFuZCB0aGUgdGVzdCBjYXNlIHdpbGwgYmUKKyAgICAgICAgICAgZGVlbWVkIHRvIGhhdmUgc3VmZmVyZWQgYW4gZXJyb3IsIGV4YWN0bHkgYXMgZm9yIGFuCisgICAgICAgICAgIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLgorCisgICAgICAgICAgIElmIGNhbGxlZCB3aXRoIGNhbGxhYmxlT2JqIG9taXR0ZWQgb3IgTm9uZSwgd2lsbCByZXR1cm4gYQorICAgICAgICAgICBjb250ZXh0IG9iamVjdCB1c2VkIGxpa2UgdGhpczo6CisKKyAgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFNvbWVFeGNlcHRpb24pOgorICAgICAgICAgICAgICAgICAgICBkb19zb21ldGhpbmcoKQorCisgICAgICAgICAgIFRoZSBjb250ZXh0IG1hbmFnZXIga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlIGV4Y2VwdGlvbiBhcworICAgICAgICAgICB0aGUgJ2V4Y2VwdGlvbicgYXR0cmlidXRlLiBUaGlzIGFsbG93cyB5b3UgdG8gaW5zcGVjdCB0aGUKKyAgICAgICAgICAgZXhjZXB0aW9uIGFmdGVyIHRoZSBhc3NlcnRpb246OgorCisgICAgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFNvbWVFeGNlcHRpb24pIGFzIGNtOgorICAgICAgICAgICAgICAgICAgIGRvX3NvbWV0aGluZygpCisgICAgICAgICAgICAgICB0aGVfZXhjZXB0aW9uID0gY20uZXhjZXB0aW9uCisgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRoZV9leGNlcHRpb24uZXJyb3JfY29kZSwgMykKKyAgICAgICAgIiIiCisgICAgICAgIGNvbnRleHQgPSBfQXNzZXJ0UmFpc2VzQ29udGV4dChleGNDbGFzcywgc2VsZikKKyAgICAgICAgaWYgY2FsbGFibGVPYmogaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0CisgICAgICAgIHdpdGggY29udGV4dDoKKyAgICAgICAgICAgIGNhbGxhYmxlT2JqKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBfZ2V0QXNzZXJ0RXF1YWxpdHlGdW5jKHNlbGYsIGZpcnN0LCBzZWNvbmQpOgorICAgICAgICAiIiJHZXQgYSBkZXRhaWxlZCBjb21wYXJpc29uIGZ1bmN0aW9uIGZvciB0aGUgdHlwZXMgb2YgdGhlIHR3byBhcmdzLgorCisgICAgICAgIFJldHVybnM6IEEgY2FsbGFibGUgYWNjZXB0aW5nIChmaXJzdCwgc2Vjb25kLCBtc2c9Tm9uZSkgdGhhdCB3aWxsCisgICAgICAgIHJhaXNlIGEgZmFpbHVyZSBleGNlcHRpb24gaWYgZmlyc3QgIT0gc2Vjb25kIHdpdGggYSB1c2VmdWwgaHVtYW4KKyAgICAgICAgcmVhZGFibGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhvc2UgdHlwZXMuCisgICAgICAgICIiIgorICAgICAgICAjCisgICAgICAgICMgTk9URShncmVnb3J5LnAuc21pdGgpOiBJIGNvbnNpZGVyZWQgaXNpbnN0YW5jZShmaXJzdCwgdHlwZShzZWNvbmQpKQorICAgICAgICAjIGFuZCB2aWNlIHZlcnNhLiAgSSBvcHRlZCBmb3IgdGhlIGNvbnNlcnZhdGl2ZSBhcHByb2FjaCBpbiBjYXNlCisgICAgICAgICMgc3ViY2xhc3NlcyBhcmUgbm90IGludGVuZGVkIHRvIGJlIGNvbXBhcmVkIGluIGRldGFpbCB0byB0aGVpciBzdXBlcgorICAgICAgICAjIGNsYXNzIGluc3RhbmNlcyB1c2luZyBhIHR5cGUgZXF1YWxpdHkgZnVuYy4gIFRoaXMgbWVhbnMgdGVzdGluZworICAgICAgICAjIHN1YnR5cGVzIHdvbid0IGF1dG9tYWdpY2FsbHkgdXNlIHRoZSBkZXRhaWxlZCBjb21wYXJpc29uLiAgQ2FsbGVycworICAgICAgICAjIHNob3VsZCB1c2UgdGhlaXIgdHlwZSBzcGVjaWZpYyBhc3NlcnRTcGFtRXF1YWwgbWV0aG9kIHRvIGNvbXBhcmUKKyAgICAgICAgIyBzdWJjbGFzc2VzIGlmIHRoZSBkZXRhaWxlZCBjb21wYXJpc29uIGlzIGRlc2lyZWQgYW5kIGFwcHJvcHJpYXRlLgorICAgICAgICAjIFNlZSB0aGUgZGlzY3Vzc2lvbiBpbiBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMjU3OC4KKyAgICAgICAgIworICAgICAgICBpZiB0eXBlKGZpcnN0KSBpcyB0eXBlKHNlY29uZCk6CisgICAgICAgICAgICBhc3NlcnRlciA9IHNlbGYuX3R5cGVfZXF1YWxpdHlfZnVuY3MuZ2V0KHR5cGUoZmlyc3QpKQorICAgICAgICAgICAgaWYgYXNzZXJ0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShhc3NlcnRlciwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgICAgIGFzc2VydGVyID0gZ2V0YXR0cihzZWxmLCBhc3NlcnRlcikKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNzZXJ0ZXIKKworICAgICAgICByZXR1cm4gc2VsZi5fYmFzZUFzc2VydEVxdWFsCisKKyAgICBkZWYgX2Jhc2VBc3NlcnRFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIlRoZSBkZWZhdWx0IGFzc2VydEVxdWFsIGltcGxlbWVudGF0aW9uLCBub3QgdHlwZSBzcGVjaWZpYy4iIiIKKyAgICAgICAgaWYgbm90IGZpcnN0ID09IHNlY29uZDoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzICE9ICVzJyAlIChzYWZlX3JlcHIoZmlyc3QpLCBzYWZlX3JlcHIoc2Vjb25kKSkKKyAgICAgICAgICAgIG1zZyA9IHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykKKyAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbihtc2cpCisKKyAgICBkZWYgYXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCwgbXNnPU5vbmUpOgorICAgICAgICAiIiJGYWlsIGlmIHRoZSB0d28gb2JqZWN0cyBhcmUgdW5lcXVhbCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSAnPT0nCisgICAgICAgICAgIG9wZXJhdG9yLgorICAgICAgICAiIiIKKyAgICAgICAgYXNzZXJ0aW9uX2Z1bmMgPSBzZWxmLl9nZXRBc3NlcnRFcXVhbGl0eUZ1bmMoZmlyc3QsIHNlY29uZCkKKyAgICAgICAgYXNzZXJ0aW9uX2Z1bmMoZmlyc3QsIHNlY29uZCwgbXNnPW1zZykKKworICAgIGRlZiBhc3NlcnROb3RFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkZhaWwgaWYgdGhlIHR3byBvYmplY3RzIGFyZSBlcXVhbCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSAnIT0nCisgICAgICAgICAgIG9wZXJhdG9yLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IGZpcnN0ICE9IHNlY29uZDoKKyAgICAgICAgICAgIG1zZyA9IHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCAnJXMgPT0gJXMnICUgKHNhZmVfcmVwcihmaXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKHNlY29uZCkpKQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZykKKworCisgICAgZGVmIGFzc2VydEFsbW9zdEVxdWFsKHNlbGYsIGZpcnN0LCBzZWNvbmQsIHBsYWNlcz1Ob25lLCBtc2c9Tm9uZSwgZGVsdGE9Tm9uZSk6CisgICAgICAgICIiIkZhaWwgaWYgdGhlIHR3byBvYmplY3RzIGFyZSB1bmVxdWFsIGFzIGRldGVybWluZWQgYnkgdGhlaXIKKyAgICAgICAgICAgZGlmZmVyZW5jZSByb3VuZGVkIHRvIHRoZSBnaXZlbiBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMKKyAgICAgICAgICAgKGRlZmF1bHQgNykgYW5kIGNvbXBhcmluZyB0byB6ZXJvLCBvciBieSBjb21wYXJpbmcgdGhhdCB0aGUKKyAgICAgICAgICAgYmV0d2VlbiB0aGUgdHdvIG9iamVjdHMgaXMgbW9yZSB0aGFuIHRoZSBnaXZlbiBkZWx0YS4KKworICAgICAgICAgICBOb3RlIHRoYXQgZGVjaW1hbCBwbGFjZXMgKGZyb20gemVybykgYXJlIHVzdWFsbHkgbm90IHRoZSBzYW1lCisgICAgICAgICAgIGFzIHNpZ25pZmljYW50IGRpZ2l0cyAobWVhc3VyZWQgZnJvbSB0aGUgbW9zdCBzaWduZmljYW50IGRpZ2l0KS4KKworICAgICAgICAgICBJZiB0aGUgdHdvIG9iamVjdHMgY29tcGFyZSBlcXVhbCB0aGVuIHRoZXkgd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgIGNvbXBhcmUgYWxtb3N0IGVxdWFsLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZmlyc3QgPT0gc2Vjb25kOgorICAgICAgICAgICAgIyBzaG9ydGN1dAorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lIGFuZCBwbGFjZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNwZWNpZnkgZGVsdGEgb3IgcGxhY2VzIG5vdCBib3RoIikKKworICAgICAgICBpZiBkZWx0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGFicyhmaXJzdCAtIHNlY29uZCkgPD0gZGVsdGE6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzICE9ICVzIHdpdGhpbiAlcyBkZWx0YScgJSAoc2FmZV9yZXByKGZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKHNlY29uZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVwcihkZWx0YSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwbGFjZXMgPSA3CisKKyAgICAgICAgICAgIGlmIHJvdW5kKGFicyhzZWNvbmQtZmlyc3QpLCBwbGFjZXMpID09IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzICE9ICVzIHdpdGhpbiAlciBwbGFjZXMnICUgKHNhZmVfcmVwcihmaXJzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKHNlY29uZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VzKQorICAgICAgICBtc2cgPSBzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpCisgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbihtc2cpCisKKyAgICBkZWYgYXNzZXJ0Tm90QWxtb3N0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCwgcGxhY2VzPU5vbmUsIG1zZz1Ob25lLCBkZWx0YT1Ob25lKToKKyAgICAgICAgIiIiRmFpbCBpZiB0aGUgdHdvIG9iamVjdHMgYXJlIGVxdWFsIGFzIGRldGVybWluZWQgYnkgdGhlaXIKKyAgICAgICAgICAgZGlmZmVyZW5jZSByb3VuZGVkIHRvIHRoZSBnaXZlbiBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMKKyAgICAgICAgICAgKGRlZmF1bHQgNykgYW5kIGNvbXBhcmluZyB0byB6ZXJvLCBvciBieSBjb21wYXJpbmcgdGhhdCB0aGUKKyAgICAgICAgICAgYmV0d2VlbiB0aGUgdHdvIG9iamVjdHMgaXMgbGVzcyB0aGFuIHRoZSBnaXZlbiBkZWx0YS4KKworICAgICAgICAgICBOb3RlIHRoYXQgZGVjaW1hbCBwbGFjZXMgKGZyb20gemVybykgYXJlIHVzdWFsbHkgbm90IHRoZSBzYW1lCisgICAgICAgICAgIGFzIHNpZ25pZmljYW50IGRpZ2l0cyAobWVhc3VyZWQgZnJvbSB0aGUgbW9zdCBzaWduZmljYW50IGRpZ2l0KS4KKworICAgICAgICAgICBPYmplY3RzIHRoYXQgYXJlIGVxdWFsIGF1dG9tYXRpY2FsbHkgZmFpbC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGRlbHRhIGlzIG5vdCBOb25lIGFuZCBwbGFjZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInNwZWNpZnkgZGVsdGEgb3IgcGxhY2VzIG5vdCBib3RoIikKKyAgICAgICAgaWYgZGVsdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgKGZpcnN0ID09IHNlY29uZCkgYW5kIGFicyhmaXJzdCAtIHNlY29uZCkgPiBkZWx0YToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzID09ICVzIHdpdGhpbiAlcyBkZWx0YScgJSAoc2FmZV9yZXByKGZpcnN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKHNlY29uZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVwcihkZWx0YSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwbGFjZXMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwbGFjZXMgPSA3CisgICAgICAgICAgICBpZiBub3QgKGZpcnN0ID09IHNlY29uZCkgYW5kIHJvdW5kKGFicyhzZWNvbmQtZmlyc3QpLCBwbGFjZXMpICE9IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICclcyA9PSAlcyB3aXRoaW4gJXIgcGxhY2VzJyAlIChzYWZlX3JlcHIoZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FmZV9yZXByKHNlY29uZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZXMpCisKKyAgICAgICAgbXNnID0gc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKQorICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24obXNnKQorCisgICAgIyBTeW5vbnltcyBmb3IgYXNzZXJ0aW9uIG1ldGhvZHMKKworICAgICMgVGhlIHBsdXJhbHMgYXJlIHVuZG9jdW1lbnRlZC4gIEtlZXAgdGhlbSB0aGF0IHdheSB0byBkaXNjb3VyYWdlIHVzZS4KKyAgICAjIERvIG5vdCBhZGQgbW9yZS4gIERvIG5vdCByZW1vdmUuCisgICAgIyBHb2luZyB0aHJvdWdoIGEgZGVwcmVjYXRpb24gY3ljbGUgb24gdGhlc2Ugd291bGQgYW5ub3kgbWFueSBwZW9wbGUuCisgICAgYXNzZXJ0RXF1YWxzID0gYXNzZXJ0RXF1YWwKKyAgICBhc3NlcnROb3RFcXVhbHMgPSBhc3NlcnROb3RFcXVhbAorICAgIGFzc2VydEFsbW9zdEVxdWFscyA9IGFzc2VydEFsbW9zdEVxdWFsCisgICAgYXNzZXJ0Tm90QWxtb3N0RXF1YWxzID0gYXNzZXJ0Tm90QWxtb3N0RXF1YWwKKyAgICBhc3NlcnRfID0gYXNzZXJ0VHJ1ZQorCisgICAgIyBUaGVzZSBmYWlsKiBhc3NlcnRpb24gbWV0aG9kIG5hbWVzIGFyZSBwZW5kaW5nIGRlcHJlY2F0aW9uIGFuZCB3aWxsCisgICAgIyBiZSBhIERlcHJlY2F0aW9uV2FybmluZyBpbiAzLjI7IGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUyNTc4CisgICAgZGVmIF9kZXByZWNhdGUob3JpZ2luYWxfZnVuYyk6CisgICAgICAgIGRlZiBkZXByZWNhdGVkX2Z1bmMoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgJ1BsZWFzZSB1c2UgezB9IGluc3RlYWQuJy5mb3JtYXQob3JpZ2luYWxfZnVuYy5fX25hbWVfXyksCisgICAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgMikKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbF9mdW5jKCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgcmV0dXJuIGRlcHJlY2F0ZWRfZnVuYworCisgICAgZmFpbFVubGVzc0VxdWFsID0gX2RlcHJlY2F0ZShhc3NlcnRFcXVhbCkKKyAgICBmYWlsSWZFcXVhbCA9IF9kZXByZWNhdGUoYXNzZXJ0Tm90RXF1YWwpCisgICAgZmFpbFVubGVzc0FsbW9zdEVxdWFsID0gX2RlcHJlY2F0ZShhc3NlcnRBbG1vc3RFcXVhbCkKKyAgICBmYWlsSWZBbG1vc3RFcXVhbCA9IF9kZXByZWNhdGUoYXNzZXJ0Tm90QWxtb3N0RXF1YWwpCisgICAgZmFpbFVubGVzcyA9IF9kZXByZWNhdGUoYXNzZXJ0VHJ1ZSkKKyAgICBmYWlsVW5sZXNzUmFpc2VzID0gX2RlcHJlY2F0ZShhc3NlcnRSYWlzZXMpCisgICAgZmFpbElmID0gX2RlcHJlY2F0ZShhc3NlcnRGYWxzZSkKKworICAgIGRlZiBhc3NlcnRTZXF1ZW5jZUVxdWFsKHNlbGYsIHNlcTEsIHNlcTIsIG1zZz1Ob25lLCBzZXFfdHlwZT1Ob25lKToKKyAgICAgICAgIiIiQW4gZXF1YWxpdHkgYXNzZXJ0aW9uIGZvciBvcmRlcmVkIHNlcXVlbmNlcyAobGlrZSBsaXN0cyBhbmQgdHVwbGVzKS4KKworICAgICAgICBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZnVuY3Rpb24sIGEgdmFsaWQgb3JkZXJlZCBzZXF1ZW5jZSB0eXBlIGlzIG9uZQorICAgICAgICB3aGljaCBjYW4gYmUgaW5kZXhlZCwgaGFzIGEgbGVuZ3RoLCBhbmQgaGFzIGFuIGVxdWFsaXR5IG9wZXJhdG9yLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBzZXExOiBUaGUgZmlyc3Qgc2VxdWVuY2UgdG8gY29tcGFyZS4KKyAgICAgICAgICAgIHNlcTI6IFRoZSBzZWNvbmQgc2VxdWVuY2UgdG8gY29tcGFyZS4KKyAgICAgICAgICAgIHNlcV90eXBlOiBUaGUgZXhwZWN0ZWQgZGF0YXR5cGUgb2YgdGhlIHNlcXVlbmNlcywgb3IgTm9uZSBpZiBubworICAgICAgICAgICAgICAgICAgICBkYXRhdHlwZSBzaG91bGQgYmUgZW5mb3JjZWQuCisgICAgICAgICAgICBtc2c6IE9wdGlvbmFsIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUgaW5zdGVhZCBvZiBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMuCisgICAgICAgICIiIgorICAgICAgICBpZiBzZXFfdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlcV90eXBlX25hbWUgPSBzZXFfdHlwZS5fX25hbWVfXworICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VxMSwgc2VxX3R5cGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbignRmlyc3Qgc2VxdWVuY2UgaXMgbm90IGEgJXM6ICVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlcV90eXBlX25hbWUsIHNhZmVfcmVwcihzZXExKSkpCisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzZXEyLCBzZXFfdHlwZSk6CisgICAgICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKCdTZWNvbmQgc2VxdWVuY2UgaXMgbm90IGEgJXM6ICVzJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgKHNlcV90eXBlX25hbWUsIHNhZmVfcmVwcihzZXEyKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZXFfdHlwZV9uYW1lID0gInNlcXVlbmNlIgorCisgICAgICAgIGRpZmZlcmluZyA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGVuMSA9IGxlbihzZXExKQorICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICBkaWZmZXJpbmcgPSAnRmlyc3QgJXMgaGFzIG5vIGxlbmd0aC4gICAgTm9uLXNlcXVlbmNlPycgJSAoCisgICAgICAgICAgICAgICAgICAgIHNlcV90eXBlX25hbWUpCisKKyAgICAgICAgaWYgZGlmZmVyaW5nIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgbGVuMiA9IGxlbihzZXEyKQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgIGRpZmZlcmluZyA9ICdTZWNvbmQgJXMgaGFzIG5vIGxlbmd0aC4gICAgTm9uLXNlcXVlbmNlPycgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICBzZXFfdHlwZV9uYW1lKQorCisgICAgICAgIGlmIGRpZmZlcmluZyBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VxMSA9PSBzZXEyOgorICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICAgICBzZXExX3JlcHIgPSBzYWZlX3JlcHIoc2VxMSkKKyAgICAgICAgICAgIHNlcTJfcmVwciA9IHNhZmVfcmVwcihzZXEyKQorICAgICAgICAgICAgaWYgbGVuKHNlcTFfcmVwcikgPiAzMDoKKyAgICAgICAgICAgICAgICBzZXExX3JlcHIgPSBzZXExX3JlcHJbOjMwXSArICcuLi4nCisgICAgICAgICAgICBpZiBsZW4oc2VxMl9yZXByKSA+IDMwOgorICAgICAgICAgICAgICAgIHNlcTJfcmVwciA9IHNlcTJfcmVwcls6MzBdICsgJy4uLicKKyAgICAgICAgICAgIGVsZW1lbnRzID0gKHNlcV90eXBlX25hbWUuY2FwaXRhbGl6ZSgpLCBzZXExX3JlcHIsIHNlcTJfcmVwcikKKyAgICAgICAgICAgIGRpZmZlcmluZyA9ICclc3MgZGlmZmVyOiAlcyAhPSAlc1xuJyAlIGVsZW1lbnRzCisKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShtaW4obGVuMSwgbGVuMikpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaXRlbTEgPSBzZXExW2ldCisgICAgICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEluZGV4RXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJpbmcgKz0gKCdcblVuYWJsZSB0byBpbmRleCBlbGVtZW50ICVkIG9mIGZpcnN0ICVzXG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLCBzZXFfdHlwZV9uYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaXRlbTIgPSBzZXEyW2ldCisgICAgICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEluZGV4RXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJpbmcgKz0gKCdcblVuYWJsZSB0byBpbmRleCBlbGVtZW50ICVkIG9mIHNlY29uZCAlc1xuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSwgc2VxX3R5cGVfbmFtZSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICAgICAgICAgICAgICBpZiBpdGVtMSAhPSBpdGVtMjoKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyaW5nICs9ICgnXG5GaXJzdCBkaWZmZXJpbmcgZWxlbWVudCAlZDpcbiVzXG4lc1xuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaSwgaXRlbTEsIGl0ZW0yKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgKGxlbjEgPT0gbGVuMiBhbmQgc2VxX3R5cGUgaXMgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgdHlwZShzZXExKSAhPSB0eXBlKHNlcTIpKToKKyAgICAgICAgICAgICAgICAgICAgIyBUaGUgc2VxdWVuY2VzIGFyZSB0aGUgc2FtZSwgYnV0IGhhdmUgZGlmZmVyaW5nIHR5cGVzLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgaWYgbGVuMSA+IGxlbjI6CisgICAgICAgICAgICAgICAgZGlmZmVyaW5nICs9ICgnXG5GaXJzdCAlcyBjb250YWlucyAlZCBhZGRpdGlvbmFsICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2VsZW1lbnRzLlxuJyAlIChzZXFfdHlwZV9uYW1lLCBsZW4xIC0gbGVuMikpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBkaWZmZXJpbmcgKz0gKCdGaXJzdCBleHRyYSBlbGVtZW50ICVkOlxuJXNcbicgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW4yLCBzZXExW2xlbjJdKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgKFR5cGVFcnJvciwgSW5kZXhFcnJvciwgTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICAgICAgICAgIGRpZmZlcmluZyArPSAoJ1VuYWJsZSB0byBpbmRleCBlbGVtZW50ICVkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnb2YgZmlyc3QgJXNcbicgJSAobGVuMiwgc2VxX3R5cGVfbmFtZSkpCisgICAgICAgICAgICBlbGlmIGxlbjEgPCBsZW4yOgorICAgICAgICAgICAgICAgIGRpZmZlcmluZyArPSAoJ1xuU2Vjb25kICVzIGNvbnRhaW5zICVkIGFkZGl0aW9uYWwgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWxlbWVudHMuXG4nICUgKHNlcV90eXBlX25hbWUsIGxlbjIgLSBsZW4xKSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGRpZmZlcmluZyArPSAoJ0ZpcnN0IGV4dHJhIGVsZW1lbnQgJWQ6XG4lc1xuJyAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxlbjEsIHNlcTJbbGVuMV0pKQorICAgICAgICAgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBJbmRleEVycm9yLCBOb3RJbXBsZW1lbnRlZEVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyaW5nICs9ICgnVW5hYmxlIHRvIGluZGV4IGVsZW1lbnQgJWQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdvZiBzZWNvbmQgJXNcbicgJSAobGVuMSwgc2VxX3R5cGVfbmFtZSkpCisgICAgICAgIHN0YW5kYXJkTXNnID0gZGlmZmVyaW5nCisgICAgICAgIGRpZmZNc2cgPSAnXG4nICsgJ1xuJy5qb2luKAorICAgICAgICAgICAgZGlmZmxpYi5uZGlmZihwcHJpbnQucGZvcm1hdChzZXExKS5zcGxpdGxpbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBwcmludC5wZm9ybWF0KHNlcTIpLnNwbGl0bGluZXMoKSkpCisgICAgICAgIHN0YW5kYXJkTXNnID0gc2VsZi5fdHJ1bmNhdGVNZXNzYWdlKHN0YW5kYXJkTXNnLCBkaWZmTXNnKQorICAgICAgICBtc2cgPSBzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpCisgICAgICAgIHNlbGYuZmFpbChtc2cpCisKKyAgICBkZWYgX3RydW5jYXRlTWVzc2FnZShzZWxmLCBtZXNzYWdlLCBkaWZmKToKKyAgICAgICAgbWF4X2RpZmYgPSBzZWxmLm1heERpZmYKKyAgICAgICAgaWYgbWF4X2RpZmYgaXMgTm9uZSBvciBsZW4oZGlmZikgPD0gbWF4X2RpZmY6CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZSArIGRpZmYKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2UgKyAoRElGRl9PTUlUVEVEICUgbGVuKGRpZmYpKQorCisgICAgZGVmIGFzc2VydExpc3RFcXVhbChzZWxmLCBsaXN0MSwgbGlzdDIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiQSBsaXN0LXNwZWNpZmljIGVxdWFsaXR5IGFzc2VydGlvbi4KKworICAgICAgICBBcmdzOgorICAgICAgICAgICAgbGlzdDE6IFRoZSBmaXJzdCBsaXN0IHRvIGNvbXBhcmUuCisgICAgICAgICAgICBsaXN0MjogVGhlIHNlY29uZCBsaXN0IHRvIGNvbXBhcmUuCisgICAgICAgICAgICBtc2c6IE9wdGlvbmFsIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUgaW5zdGVhZCBvZiBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChsaXN0MSwgbGlzdDIsIG1zZywgc2VxX3R5cGU9bGlzdCkKKworICAgIGRlZiBhc3NlcnRUdXBsZUVxdWFsKHNlbGYsIHR1cGxlMSwgdHVwbGUyLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkEgdHVwbGUtc3BlY2lmaWMgZXF1YWxpdHkgYXNzZXJ0aW9uLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICB0dXBsZTE6IFRoZSBmaXJzdCB0dXBsZSB0byBjb21wYXJlLgorICAgICAgICAgICAgdHVwbGUyOiBUaGUgc2Vjb25kIHR1cGxlIHRvIGNvbXBhcmUuCisgICAgICAgICAgICBtc2c6IE9wdGlvbmFsIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUgaW5zdGVhZCBvZiBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwodHVwbGUxLCB0dXBsZTIsIG1zZywgc2VxX3R5cGU9dHVwbGUpCisKKyAgICBkZWYgYXNzZXJ0U2V0RXF1YWwoc2VsZiwgc2V0MSwgc2V0MiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJBIHNldC1zcGVjaWZpYyBlcXVhbGl0eSBhc3NlcnRpb24uCisKKyAgICAgICAgQXJnczoKKyAgICAgICAgICAgIHNldDE6IFRoZSBmaXJzdCBzZXQgdG8gY29tcGFyZS4KKyAgICAgICAgICAgIHNldDI6IFRoZSBzZWNvbmQgc2V0IHRvIGNvbXBhcmUuCisgICAgICAgICAgICBtc2c6IE9wdGlvbmFsIG1lc3NhZ2UgdG8gdXNlIG9uIGZhaWx1cmUgaW5zdGVhZCBvZiBhIGxpc3Qgb2YKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMuCisKKyAgICAgICAgYXNzZXJ0U2V0RXF1YWwgdXNlcyBkdWNrdHlwaW5nIHRvIHN1cHBvcnQgZGlmZmVyZW50IHR5cGVzIG9mIHNldHMsIGFuZAorICAgICAgICBpcyBvcHRpbWl6ZWQgZm9yIHNldHMgc3BlY2lmaWNhbGx5IChwYXJhbWV0ZXJzIG11c3Qgc3VwcG9ydCBhCisgICAgICAgIGRpZmZlcmVuY2UgbWV0aG9kKS4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpZmZlcmVuY2UxID0gc2V0MS5kaWZmZXJlbmNlKHNldDIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2ludmFsaWQgdHlwZSB3aGVuIGF0dGVtcHRpbmcgc2V0IGRpZmZlcmVuY2U6ICVzJyAlIGUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnZmlyc3QgYXJndW1lbnQgZG9lcyBub3Qgc3VwcG9ydCBzZXQgZGlmZmVyZW5jZTogJXMnICUgZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBkaWZmZXJlbmNlMiA9IHNldDIuZGlmZmVyZW5jZShzZXQxKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdpbnZhbGlkIHR5cGUgd2hlbiBhdHRlbXB0aW5nIHNldCBkaWZmZXJlbmNlOiAlcycgJSBlKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ3NlY29uZCBhcmd1bWVudCBkb2VzIG5vdCBzdXBwb3J0IHNldCBkaWZmZXJlbmNlOiAlcycgJSBlKQorCisgICAgICAgIGlmIG5vdCAoZGlmZmVyZW5jZTEgb3IgZGlmZmVyZW5jZTIpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBpZiBkaWZmZXJlbmNlMToKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnSXRlbXMgaW4gdGhlIGZpcnN0IHNldCBidXQgbm90IHRoZSBzZWNvbmQ6JykKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGRpZmZlcmVuY2UxOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChyZXByKGl0ZW0pKQorICAgICAgICBpZiBkaWZmZXJlbmNlMjoKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnSXRlbXMgaW4gdGhlIHNlY29uZCBzZXQgYnV0IG5vdCB0aGUgZmlyc3Q6JykKKyAgICAgICAgICAgIGZvciBpdGVtIGluIGRpZmZlcmVuY2UyOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChyZXByKGl0ZW0pKQorCisgICAgICAgIHN0YW5kYXJkTXNnID0gJ1xuJy5qb2luKGxpbmVzKQorICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRJbihzZWxmLCBtZW1iZXIsIGNvbnRhaW5lciwgbXNnPU5vbmUpOgorICAgICAgICAiIiJKdXN0IGxpa2Ugc2VsZi5hc3NlcnRUcnVlKGEgaW4gYiksIGJ1dCB3aXRoIGEgbmljZXIgZGVmYXVsdCBtZXNzYWdlLiIiIgorICAgICAgICBpZiBtZW1iZXIgbm90IGluIGNvbnRhaW5lcjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIG5vdCBmb3VuZCBpbiAlcycgJSAoc2FmZV9yZXByKG1lbWJlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVwcihjb250YWluZXIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0Tm90SW4oc2VsZiwgbWVtYmVyLCBjb250YWluZXIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSnVzdCBsaWtlIHNlbGYuYXNzZXJ0VHJ1ZShhIG5vdCBpbiBiKSwgYnV0IHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIG1lbWJlciBpbiBjb250YWluZXI6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICclcyB1bmV4cGVjdGVkbHkgZm91bmQgaW4gJXMnICUgKHNhZmVfcmVwcihtZW1iZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlcHIoY29udGFpbmVyKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydElzKHNlbGYsIGV4cHIxLCBleHByMiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJKdXN0IGxpa2Ugc2VsZi5hc3NlcnRUcnVlKGEgaXMgYiksIGJ1dCB3aXRoIGEgbmljZXIgZGVmYXVsdCBtZXNzYWdlLiIiIgorICAgICAgICBpZiBleHByMSBpcyBub3QgZXhwcjI6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICclcyBpcyBub3QgJXMnICUgKHNhZmVfcmVwcihleHByMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYWZlX3JlcHIoZXhwcjIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0SXNOb3Qoc2VsZiwgZXhwcjEsIGV4cHIyLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkp1c3QgbGlrZSBzZWxmLmFzc2VydFRydWUoYSBpcyBub3QgYiksIGJ1dCB3aXRoIGEgbmljZXIgZGVmYXVsdCBtZXNzYWdlLiIiIgorICAgICAgICBpZiBleHByMSBpcyBleHByMjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJ3VuZXhwZWN0ZWRseSBpZGVudGljYWw6ICVzJyAlIChzYWZlX3JlcHIoZXhwcjEpLCkKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydERpY3RFcXVhbChzZWxmLCBkMSwgZDIsIG1zZz1Ob25lKToKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGQxLCBkaWN0LCAnRmlyc3QgYXJndW1lbnQgaXMgbm90IGEgZGljdGlvbmFyeScpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShkMiwgZGljdCwgJ1NlY29uZCBhcmd1bWVudCBpcyBub3QgYSBkaWN0aW9uYXJ5JykKKworICAgICAgICBpZiBkMSAhPSBkMjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzICE9ICVzJyAlIChzYWZlX3JlcHIoZDEsIFRydWUpLCBzYWZlX3JlcHIoZDIsIFRydWUpKQorICAgICAgICAgICAgZGlmZiA9ICgnXG4nICsgJ1xuJy5qb2luKGRpZmZsaWIubmRpZmYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChkMSkuc3BsaXRsaW5lcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHByaW50LnBmb3JtYXQoZDIpLnNwbGl0bGluZXMoKSkpKQorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSBzZWxmLl90cnVuY2F0ZU1lc3NhZ2Uoc3RhbmRhcmRNc2csIGRpZmYpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoc2VsZiwgZXhwZWN0ZWQsIGFjdHVhbCwgbXNnPU5vbmUpOgorICAgICAgICAiIiJDaGVja3Mgd2hldGhlciBhY3R1YWwgaXMgYSBzdXBlcnNldCBvZiBleHBlY3RlZC4iIiIKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIG1pc21hdGNoZWQgPSBbXQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBleHBlY3RlZC5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gYWN0dWFsOgorICAgICAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKGtleSkKKyAgICAgICAgICAgIGVsaWYgdmFsdWUgIT0gYWN0dWFsW2tleV06CisgICAgICAgICAgICAgICAgbWlzbWF0Y2hlZC5hcHBlbmQoJyVzLCBleHBlY3RlZDogJXMsIGFjdHVhbDogJXMnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2FmZV9yZXByKGtleSksIHNhZmVfcmVwcih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVwcihhY3R1YWxba2V5XSkpKQorCisgICAgICAgIGlmIG5vdCAobWlzc2luZyBvciBtaXNtYXRjaGVkKToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHN0YW5kYXJkTXNnID0gJycKKyAgICAgICAgaWYgbWlzc2luZzoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJ01pc3Npbmc6ICVzJyAlICcsJy5qb2luKHNhZmVfcmVwcihtKSBmb3IgbSBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcpCisgICAgICAgIGlmIG1pc21hdGNoZWQ6CisgICAgICAgICAgICBpZiBzdGFuZGFyZE1zZzoKKyAgICAgICAgICAgICAgICBzdGFuZGFyZE1zZyArPSAnOyAnCisgICAgICAgICAgICBzdGFuZGFyZE1zZyArPSAnTWlzbWF0Y2hlZCB2YWx1ZXM6ICVzJyAlICcsJy5qb2luKG1pc21hdGNoZWQpCisKKyAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0SXRlbXNFcXVhbChzZWxmLCBleHBlY3RlZF9zZXEsIGFjdHVhbF9zZXEsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiQW4gdW5vcmRlcmVkIHNlcXVlbmNlIHNwZWNpZmljIGNvbXBhcmlzb24uIEl0IGFzc2VydHMgdGhhdAorICAgICAgICBhY3R1YWxfc2VxIGFuZCBleHBlY3RlZF9zZXEgaGF2ZSB0aGUgc2FtZSBlbGVtZW50IGNvdW50cy4KKyAgICAgICAgRXF1aXZhbGVudCB0bzo6CisKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ291bnRlcihpdGVyKGFjdHVhbF9zZXEpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlcihpdGVyKGV4cGVjdGVkX3NlcSkpKQorCisgICAgICAgIEFzc2VydHMgdGhhdCBlYWNoIGVsZW1lbnQgaGFzIHRoZSBzYW1lIGNvdW50IGluIGJvdGggc2VxdWVuY2VzLgorICAgICAgICBFeGFtcGxlOgorICAgICAgICAgICAgLSBbMCwgMSwgMV0gYW5kIFsxLCAwLCAxXSBjb21wYXJlIGVxdWFsLgorICAgICAgICAgICAgLSBbMCwgMCwgMV0gYW5kIFswLCAxXSBjb21wYXJlIHVuZXF1YWwuCisgICAgICAgICIiIgorICAgICAgICBmaXJzdF9zZXEsIHNlY29uZF9zZXEgPSBsaXN0KGV4cGVjdGVkX3NlcSksIGxpc3QoYWN0dWFsX3NlcSkKKyAgICAgICAgd2l0aCB3YXJuaW5ncy5jYXRjaF93YXJuaW5ncygpOgorICAgICAgICAgICAgaWYgc3lzLnB5M2t3YXJuaW5nOgorICAgICAgICAgICAgICAgICMgU2lsZW5jZSBQeTNrIHdhcm5pbmcgcmFpc2VkIGR1cmluZyB0aGUgc29ydGluZworICAgICAgICAgICAgICAgIGZvciBfbXNnIGluIFsiKGNvZGV8ZGljdHx0eXBlKSBpbmVxdWFsaXR5IGNvbXBhcmlzb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1aWx0aW5fZnVuY3Rpb25fb3JfbWV0aG9kIG9yZGVyIGNvbXBhcmlzb25zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBhcmluZyB1bmVxdWFsIHR5cGVzIl06CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLCBfbXNnLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZmlyc3QgPSBjb2xsZWN0aW9ucy5Db3VudGVyKGZpcnN0X3NlcSkKKyAgICAgICAgICAgICAgICBzZWNvbmQgPSBjb2xsZWN0aW9ucy5Db3VudGVyKHNlY29uZF9zZXEpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICMgSGFuZGxlIGNhc2Ugd2l0aCB1bmhhc2hhYmxlIGVsZW1lbnRzCisgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMgPSBfY291bnRfZGlmZl9hbGxfcHVycG9zZShmaXJzdF9zZXEsIHNlY29uZF9zZXEpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGZpcnN0ID09IHNlY29uZDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZGlmZmVyZW5jZXMgPSBfY291bnRfZGlmZl9oYXNoYWJsZShmaXJzdF9zZXEsIHNlY29uZF9zZXEpCisKKyAgICAgICAgaWYgZGlmZmVyZW5jZXM6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICdFbGVtZW50IGNvdW50cyB3ZXJlIG5vdCBlcXVhbDpcbicKKyAgICAgICAgICAgIGxpbmVzID0gWydGaXJzdCBoYXMgJWQsIFNlY29uZCBoYXMgJWQ6ICAlcicgJSBkaWZmIGZvciBkaWZmIGluIGRpZmZlcmVuY2VzXQorICAgICAgICAgICAgZGlmZk1zZyA9ICdcbicuam9pbihsaW5lcykKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gc2VsZi5fdHJ1bmNhdGVNZXNzYWdlKHN0YW5kYXJkTXNnLCBkaWZmTXNnKQorICAgICAgICAgICAgbXNnID0gc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKQorICAgICAgICAgICAgc2VsZi5mYWlsKG1zZykKKworICAgIGRlZiBhc3NlcnRNdWx0aUxpbmVFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkFzc2VydCB0aGF0IHR3byBtdWx0aS1saW5lIHN0cmluZ3MgYXJlIGVxdWFsLiIiIgorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlyc3QsIGJhc2VzdHJpbmcsCisgICAgICAgICAgICAgICAgJ0ZpcnN0IGFyZ3VtZW50IGlzIG5vdCBhIHN0cmluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWNvbmQsIGJhc2VzdHJpbmcsCisgICAgICAgICAgICAgICAgJ1NlY29uZCBhcmd1bWVudCBpcyBub3QgYSBzdHJpbmcnKQorCisgICAgICAgIGlmIGZpcnN0ICE9IHNlY29uZDoKKyAgICAgICAgICAgICMgZG9uJ3QgdXNlIGRpZmZsaWIgaWYgdGhlIHN0cmluZ3MgYXJlIHRvbyBsb25nCisgICAgICAgICAgICBpZiAobGVuKGZpcnN0KSA+IHNlbGYuX2RpZmZUaHJlc2hvbGQgb3IKKyAgICAgICAgICAgICAgICBsZW4oc2Vjb25kKSA+IHNlbGYuX2RpZmZUaHJlc2hvbGQpOgorICAgICAgICAgICAgICAgIHNlbGYuX2Jhc2VBc3NlcnRFcXVhbChmaXJzdCwgc2Vjb25kLCBtc2cpCisgICAgICAgICAgICBmaXJzdGxpbmVzID0gZmlyc3Quc3BsaXRsaW5lcyhUcnVlKQorICAgICAgICAgICAgc2Vjb25kbGluZXMgPSBzZWNvbmQuc3BsaXRsaW5lcyhUcnVlKQorICAgICAgICAgICAgaWYgbGVuKGZpcnN0bGluZXMpID09IDEgYW5kIGZpcnN0LnN0cmlwKCdcclxuJykgPT0gZmlyc3Q6CisgICAgICAgICAgICAgICAgZmlyc3RsaW5lcyA9IFtmaXJzdCArICdcbiddCisgICAgICAgICAgICAgICAgc2Vjb25kbGluZXMgPSBbc2Vjb25kICsgJ1xuJ10KKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzICE9ICVzJyAlIChzYWZlX3JlcHIoZmlyc3QsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhZmVfcmVwcihzZWNvbmQsIFRydWUpKQorICAgICAgICAgICAgZGlmZiA9ICdcbicgKyAnJy5qb2luKGRpZmZsaWIubmRpZmYoZmlyc3RsaW5lcywgc2Vjb25kbGluZXMpKQorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSBzZWxmLl90cnVuY2F0ZU1lc3NhZ2Uoc3RhbmRhcmRNc2csIGRpZmYpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRMZXNzKHNlbGYsIGEsIGIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSnVzdCBsaWtlIHNlbGYuYXNzZXJ0VHJ1ZShhIDwgYiksIGJ1dCB3aXRoIGEgbmljZXIgZGVmYXVsdCBtZXNzYWdlLiIiIgorICAgICAgICBpZiBub3QgYSA8IGI6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICclcyBub3QgbGVzcyB0aGFuICVzJyAlIChzYWZlX3JlcHIoYSksIHNhZmVfcmVwcihiKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydExlc3NFcXVhbChzZWxmLCBhLCBiLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkp1c3QgbGlrZSBzZWxmLmFzc2VydFRydWUoYSA8PSBiKSwgYnV0IHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIG5vdCBhIDw9IGI6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICclcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJyAlIChzYWZlX3JlcHIoYSksIHNhZmVfcmVwcihiKSkKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydEdyZWF0ZXIoc2VsZiwgYSwgYiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJKdXN0IGxpa2Ugc2VsZi5hc3NlcnRUcnVlKGEgPiBiKSwgYnV0IHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIG5vdCBhID4gYjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIG5vdCBncmVhdGVyIHRoYW4gJXMnICUgKHNhZmVfcmVwcihhKSwgc2FmZV9yZXByKGIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0R3JlYXRlckVxdWFsKHNlbGYsIGEsIGIsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiSnVzdCBsaWtlIHNlbGYuYXNzZXJ0VHJ1ZShhID49IGIpLCBidXQgd2l0aCBhIG5pY2VyIGRlZmF1bHQgbWVzc2FnZS4iIiIKKyAgICAgICAgaWYgbm90IGEgPj0gYjoKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIG5vdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnICUgKHNhZmVfcmVwcihhKSwgc2FmZV9yZXByKGIpKQorICAgICAgICAgICAgc2VsZi5mYWlsKHNlbGYuX2Zvcm1hdE1lc3NhZ2UobXNnLCBzdGFuZGFyZE1zZykpCisKKyAgICBkZWYgYXNzZXJ0SXNOb25lKHNlbGYsIG9iaiwgbXNnPU5vbmUpOgorICAgICAgICAiIiJTYW1lIGFzIHNlbGYuYXNzZXJ0VHJ1ZShvYmogaXMgTm9uZSksIHdpdGggYSBuaWNlciBkZWZhdWx0IG1lc3NhZ2UuIiIiCisgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0YW5kYXJkTXNnID0gJyVzIGlzIG5vdCBOb25lJyAlIChzYWZlX3JlcHIob2JqKSwpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRJc05vdE5vbmUoc2VsZiwgb2JqLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkluY2x1ZGVkIGZvciBzeW1tZXRyeSB3aXRoIGFzc2VydElzTm9uZS4iIiIKKyAgICAgICAgaWYgb2JqIGlzIE5vbmU6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICd1bmV4cGVjdGVkbHkgTm9uZScKKyAgICAgICAgICAgIHNlbGYuZmFpbChzZWxmLl9mb3JtYXRNZXNzYWdlKG1zZywgc3RhbmRhcmRNc2cpKQorCisgICAgZGVmIGFzc2VydElzSW5zdGFuY2Uoc2VsZiwgb2JqLCBjbHMsIG1zZz1Ob25lKToKKyAgICAgICAgIiIiU2FtZSBhcyBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShvYmosIGNscykpLCB3aXRoIGEgbmljZXIKKyAgICAgICAgZGVmYXVsdCBtZXNzYWdlLiIiIgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvYmosIGNscyk6CisgICAgICAgICAgICBzdGFuZGFyZE1zZyA9ICclcyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgJXInICUgKHNhZmVfcmVwcihvYmopLCBjbHMpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnROb3RJc0luc3RhbmNlKHNlbGYsIG9iaiwgY2xzLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkluY2x1ZGVkIGZvciBzeW1tZXRyeSB3aXRoIGFzc2VydElzSW5zdGFuY2UuIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob2JqLCBjbHMpOgorICAgICAgICAgICAgc3RhbmRhcmRNc2cgPSAnJXMgaXMgYW4gaW5zdGFuY2Ugb2YgJXInICUgKHNhZmVfcmVwcihvYmopLCBjbHMpCisgICAgICAgICAgICBzZWxmLmZhaWwoc2VsZi5fZm9ybWF0TWVzc2FnZShtc2csIHN0YW5kYXJkTXNnKSkKKworICAgIGRlZiBhc3NlcnRSYWlzZXNSZWdleHAoc2VsZiwgZXhwZWN0ZWRfZXhjZXB0aW9uLCBleHBlY3RlZF9yZWdleHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYWJsZV9vYmo9Tm9uZSwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgIiIiQXNzZXJ0cyB0aGF0IHRoZSBtZXNzYWdlIGluIGEgcmFpc2VkIGV4Y2VwdGlvbiBtYXRjaGVzIGEgcmVnZXhwLgorCisgICAgICAgIEFyZ3M6CisgICAgICAgICAgICBleHBlY3RlZF9leGNlcHRpb246IEV4Y2VwdGlvbiBjbGFzcyBleHBlY3RlZCB0byBiZSByYWlzZWQuCisgICAgICAgICAgICBleHBlY3RlZF9yZWdleHA6IFJlZ2V4cCAocmUgcGF0dGVybiBvYmplY3Qgb3Igc3RyaW5nKSBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICB0byBiZSBmb3VuZCBpbiBlcnJvciBtZXNzYWdlLgorICAgICAgICAgICAgY2FsbGFibGVfb2JqOiBGdW5jdGlvbiB0byBiZSBjYWxsZWQuCisgICAgICAgICAgICBhcmdzOiBFeHRyYSBhcmdzLgorICAgICAgICAgICAga3dhcmdzOiBFeHRyYSBrd2FyZ3MuCisgICAgICAgICIiIgorICAgICAgICBjb250ZXh0ID0gX0Fzc2VydFJhaXNlc0NvbnRleHQoZXhwZWN0ZWRfZXhjZXB0aW9uLCBzZWxmLCBleHBlY3RlZF9yZWdleHApCisgICAgICAgIGlmIGNhbGxhYmxlX29iaiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQKKyAgICAgICAgd2l0aCBjb250ZXh0OgorICAgICAgICAgICAgY2FsbGFibGVfb2JqKCphcmdzLCAqKmt3YXJncykKKworICAgIGRlZiBhc3NlcnRSZWdleHBNYXRjaGVzKHNlbGYsIHRleHQsIGV4cGVjdGVkX3JlZ2V4cCwgbXNnPU5vbmUpOgorICAgICAgICAiIiJGYWlsIHRoZSB0ZXN0IHVubGVzcyB0aGUgdGV4dCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWRfcmVnZXhwLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGV4cGVjdGVkX3JlZ2V4cCA9IHJlLmNvbXBpbGUoZXhwZWN0ZWRfcmVnZXhwKQorICAgICAgICBpZiBub3QgZXhwZWN0ZWRfcmVnZXhwLnNlYXJjaCh0ZXh0KToKKyAgICAgICAgICAgIG1zZyA9IG1zZyBvciAiUmVnZXhwIGRpZG4ndCBtYXRjaCIKKyAgICAgICAgICAgIG1zZyA9ICclczogJXIgbm90IGZvdW5kIGluICVyJyAlIChtc2csIGV4cGVjdGVkX3JlZ2V4cC5wYXR0ZXJuLCB0ZXh0KQorICAgICAgICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKG1zZykKKworICAgIGRlZiBhc3NlcnROb3RSZWdleHBNYXRjaGVzKHNlbGYsIHRleHQsIHVuZXhwZWN0ZWRfcmVnZXhwLCBtc2c9Tm9uZSk6CisgICAgICAgICIiIkZhaWwgdGhlIHRlc3QgaWYgdGhlIHRleHQgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uLiIiIgorICAgICAgICBpZiBpc2luc3RhbmNlKHVuZXhwZWN0ZWRfcmVnZXhwLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVnZXhwID0gcmUuY29tcGlsZSh1bmV4cGVjdGVkX3JlZ2V4cCkKKyAgICAgICAgbWF0Y2ggPSB1bmV4cGVjdGVkX3JlZ2V4cC5zZWFyY2godGV4dCkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBtc2cgPSBtc2cgb3IgIlJlZ2V4cCBtYXRjaGVkIgorICAgICAgICAgICAgbXNnID0gJyVzOiAlciBtYXRjaGVzICVyIGluICVyJyAlIChtc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRbbWF0Y2guc3RhcnQoKTptYXRjaC5lbmQoKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWRfcmVnZXhwLnBhdHRlcm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQpCisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24obXNnKQorCisKK2NsYXNzIEZ1bmN0aW9uVGVzdENhc2UoVGVzdENhc2UpOgorICAgICIiIkEgdGVzdCBjYXNlIHRoYXQgd3JhcHMgYSB0ZXN0IGZ1bmN0aW9uLgorCisgICAgVGhpcyBpcyB1c2VmdWwgZm9yIHNsaXBwaW5nIHByZS1leGlzdGluZyB0ZXN0IGZ1bmN0aW9ucyBpbnRvIHRoZQorICAgIHVuaXR0ZXN0IGZyYW1ld29yay4gT3B0aW9uYWxseSwgc2V0LXVwIGFuZCB0aWR5LXVwIGZ1bmN0aW9ucyBjYW4gYmUKKyAgICBzdXBwbGllZC4gQXMgd2l0aCBUZXN0Q2FzZSwgdGhlIHRpZHktdXAgKCd0ZWFyRG93bicpIGZ1bmN0aW9uIHdpbGwKKyAgICBhbHdheXMgYmUgY2FsbGVkIGlmIHRoZSBzZXQtdXAgKCdzZXRVcCcpIGZ1bmN0aW9uIHJhbiBzdWNjZXNzZnVsbHkuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGVzdEZ1bmMsIHNldFVwPU5vbmUsIHRlYXJEb3duPU5vbmUsIGRlc2NyaXB0aW9uPU5vbmUpOgorICAgICAgICBzdXBlcihGdW5jdGlvblRlc3RDYXNlLCBzZWxmKS5fX2luaXRfXygpCisgICAgICAgIHNlbGYuX3NldFVwRnVuYyA9IHNldFVwCisgICAgICAgIHNlbGYuX3RlYXJEb3duRnVuYyA9IHRlYXJEb3duCisgICAgICAgIHNlbGYuX3Rlc3RGdW5jID0gdGVzdEZ1bmMKKyAgICAgICAgc2VsZi5fZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9zZXRVcEZ1bmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9zZXRVcEZ1bmMoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl90ZWFyRG93bkZ1bmMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl90ZWFyRG93bkZ1bmMoKQorCisgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgIHNlbGYuX3Rlc3RGdW5jKCkKKworICAgIGRlZiBpZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Rlc3RGdW5jLl9fbmFtZV9fCisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKKyAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAorCisgICAgICAgIHJldHVybiBzZWxmLl9zZXRVcEZ1bmMgPT0gb3RoZXIuX3NldFVwRnVuYyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fdGVhckRvd25GdW5jID09IG90aGVyLl90ZWFyRG93bkZ1bmMgYW5kIFwKKyAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RGdW5jID09IG90aGVyLl90ZXN0RnVuYyBhbmQgXAorICAgICAgICAgICAgICAgc2VsZi5fZGVzY3JpcHRpb24gPT0gb3RoZXIuX2Rlc2NyaXB0aW9uCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKCh0eXBlKHNlbGYpLCBzZWxmLl9zZXRVcEZ1bmMsIHNlbGYuX3RlYXJEb3duRnVuYywKKyAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3Rlc3RGdW5jLCBzZWxmLl9kZXNjcmlwdGlvbikpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICIlcyAoJXMpIiAlIChzdHJjbGFzcyhzZWxmLl9fY2xhc3NfXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVzdEZ1bmMuX19uYW1lX18pCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPCVzIHRlYz0lcz4iICUgKHN0cmNsYXNzKHNlbGYuX19jbGFzc19fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZXN0RnVuYykKKworICAgIGRlZiBzaG9ydERlc2NyaXB0aW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9kZXNjcmlwdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kZXNjcmlwdGlvbgorICAgICAgICBkb2MgPSBzZWxmLl90ZXN0RnVuYy5fX2RvY19fCisgICAgICAgIHJldHVybiBkb2MgYW5kIGRvYy5zcGxpdCgiXG4iKVswXS5zdHJpcCgpIG9yIE5vbmUKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2Nhc2UucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGVhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2Nhc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvY2FzZS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2Nhc2UucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGVhZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2Nhc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9sb2FkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4ZjUzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5CkBAIC0wLDAgKzEsMzE0IEBACisiIiJMb2FkaW5nIHVuaXR0ZXN0cy4iIiIKKworaW1wb3J0IG9zCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0cmFjZWJhY2sKK2ltcG9ydCB0eXBlcworCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgY21wX3RvX2tleSBhcyBfQ21wVG9LZXkKK2Zyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaAorCitmcm9tIC4gaW1wb3J0IGNhc2UsIHN1aXRlCisKK19fdW5pdHRlc3QgPSBUcnVlCisKKyMgd2hhdCBhYm91dCAucHljIG9yIC5weW8gKGV0YykKKyMgd2Ugd291bGQgbmVlZCB0byBhdm9pZCBsb2FkaW5nIHRoZSBzYW1lIHRlc3RzIG11bHRpcGxlIHRpbWVzCisjIGZyb20gJy5weScsICcucHljJyAqYW5kKiAnLnB5bycKK1ZBTElEX01PRFVMRV9OQU1FID0gcmUuY29tcGlsZShyJ1tfYS16XVx3KlwucHkkJywgcmUuSUdOT1JFQ0FTRSkKKworCitkZWYgX21ha2VfZmFpbGVkX2ltcG9ydF90ZXN0KG5hbWUsIHN1aXRlQ2xhc3MpOgorICAgIG1lc3NhZ2UgPSAnRmFpbGVkIHRvIGltcG9ydCB0ZXN0IG1vZHVsZTogJXNcbiVzJyAlIChuYW1lLCB0cmFjZWJhY2suZm9ybWF0X2V4YygpKQorICAgIHJldHVybiBfbWFrZV9mYWlsZWRfdGVzdCgnTW9kdWxlSW1wb3J0RmFpbHVyZScsIG5hbWUsIEltcG9ydEVycm9yKG1lc3NhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZUNsYXNzKQorCitkZWYgX21ha2VfZmFpbGVkX2xvYWRfdGVzdHMobmFtZSwgZXhjZXB0aW9uLCBzdWl0ZUNsYXNzKToKKyAgICByZXR1cm4gX21ha2VfZmFpbGVkX3Rlc3QoJ0xvYWRUZXN0c0ZhaWx1cmUnLCBuYW1lLCBleGNlcHRpb24sIHN1aXRlQ2xhc3MpCisKK2RlZiBfbWFrZV9mYWlsZWRfdGVzdChjbGFzc25hbWUsIG1ldGhvZG5hbWUsIGV4Y2VwdGlvbiwgc3VpdGVDbGFzcyk6CisgICAgZGVmIHRlc3RGYWlsdXJlKHNlbGYpOgorICAgICAgICByYWlzZSBleGNlcHRpb24KKyAgICBhdHRycyA9IHttZXRob2RuYW1lOiB0ZXN0RmFpbHVyZX0KKyAgICBUZXN0Q2xhc3MgPSB0eXBlKGNsYXNzbmFtZSwgKGNhc2UuVGVzdENhc2UsKSwgYXR0cnMpCisgICAgcmV0dXJuIHN1aXRlQ2xhc3MoKFRlc3RDbGFzcyhtZXRob2RuYW1lKSwpKQorCisKK2NsYXNzIFRlc3RMb2FkZXIob2JqZWN0KToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIHRlc3RzIGFjY29yZGluZyB0byB2YXJpb3VzIGNyaXRlcmlhCisgICAgYW5kIHJldHVybmluZyB0aGVtIHdyYXBwZWQgaW4gYSBUZXN0U3VpdGUKKyAgICAiIiIKKyAgICB0ZXN0TWV0aG9kUHJlZml4ID0gJ3Rlc3QnCisgICAgc29ydFRlc3RNZXRob2RzVXNpbmcgPSBjbXAKKyAgICBzdWl0ZUNsYXNzID0gc3VpdGUuVGVzdFN1aXRlCisgICAgX3RvcF9sZXZlbF9kaXIgPSBOb25lCisKKyAgICBkZWYgbG9hZFRlc3RzRnJvbVRlc3RDYXNlKHNlbGYsIHRlc3RDYXNlQ2xhc3MpOgorICAgICAgICAiIiJSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgY29udGFpbmVkIGluIHRlc3RDYXNlQ2xhc3MiIiIKKyAgICAgICAgaWYgaXNzdWJjbGFzcyh0ZXN0Q2FzZUNsYXNzLCBzdWl0ZS5UZXN0U3VpdGUpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJUZXN0IGNhc2VzIHNob3VsZCBub3QgYmUgZGVyaXZlZCBmcm9tIFRlc3RTdWl0ZS4iIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBNYXliZSB5b3UgbWVhbnQgdG8gZGVyaXZlIGZyb20gVGVzdENhc2U/IikKKyAgICAgICAgdGVzdENhc2VOYW1lcyA9IHNlbGYuZ2V0VGVzdENhc2VOYW1lcyh0ZXN0Q2FzZUNsYXNzKQorICAgICAgICBpZiBub3QgdGVzdENhc2VOYW1lcyBhbmQgaGFzYXR0cih0ZXN0Q2FzZUNsYXNzLCAncnVuVGVzdCcpOgorICAgICAgICAgICAgdGVzdENhc2VOYW1lcyA9IFsncnVuVGVzdCddCisgICAgICAgIGxvYWRlZF9zdWl0ZSA9IHNlbGYuc3VpdGVDbGFzcyhtYXAodGVzdENhc2VDbGFzcywgdGVzdENhc2VOYW1lcykpCisgICAgICAgIHJldHVybiBsb2FkZWRfc3VpdGUKKworICAgIGRlZiBsb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYsIG1vZHVsZSwgdXNlX2xvYWRfdGVzdHM9VHJ1ZSk6CisgICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIGdpdmVuIG1vZHVsZSIiIgorICAgICAgICB0ZXN0cyA9IFtdCisgICAgICAgIGZvciBuYW1lIGluIGRpcihtb2R1bGUpOgorICAgICAgICAgICAgb2JqID0gZ2V0YXR0cihtb2R1bGUsIG5hbWUpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgdHlwZSkgYW5kIGlzc3ViY2xhc3Mob2JqLCBjYXNlLlRlc3RDYXNlKToKKyAgICAgICAgICAgICAgICB0ZXN0cy5hcHBlbmQoc2VsZi5sb2FkVGVzdHNGcm9tVGVzdENhc2Uob2JqKSkKKworICAgICAgICBsb2FkX3Rlc3RzID0gZ2V0YXR0cihtb2R1bGUsICdsb2FkX3Rlc3RzJywgTm9uZSkKKyAgICAgICAgdGVzdHMgPSBzZWxmLnN1aXRlQ2xhc3ModGVzdHMpCisgICAgICAgIGlmIHVzZV9sb2FkX3Rlc3RzIGFuZCBsb2FkX3Rlc3RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBsb2FkX3Rlc3RzKHNlbGYsIHRlc3RzLCBOb25lKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICByZXR1cm4gX21ha2VfZmFpbGVkX2xvYWRfdGVzdHMobW9kdWxlLl9fbmFtZV9fLCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN1aXRlQ2xhc3MpCisgICAgICAgIHJldHVybiB0ZXN0cworCisgICAgZGVmIGxvYWRUZXN0c0Zyb21OYW1lKHNlbGYsIG5hbWUsIG1vZHVsZT1Ob25lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGdpdmVuIGEgc3RyaW5nIHNwZWNpZmllci4KKworICAgICAgICBUaGUgbmFtZSBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8gYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhCisgICAgICAgIHRlc3QgbWV0aG9kIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2gKKyAgICAgICAgcmV0dXJucyBhIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4KKworICAgICAgICBUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgdGhlIG5hbWVzIHJlbGF0aXZlIHRvIGEgZ2l2ZW4gbW9kdWxlLgorICAgICAgICAiIiIKKyAgICAgICAgcGFydHMgPSBuYW1lLnNwbGl0KCcuJykKKyAgICAgICAgaWYgbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICBwYXJ0c19jb3B5ID0gcGFydHNbOl0KKyAgICAgICAgICAgIHdoaWxlIHBhcnRzX2NvcHk6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBfX2ltcG9ydF9fKCcuJy5qb2luKHBhcnRzX2NvcHkpKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZGVsIHBhcnRzX2NvcHlbLTFdCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwYXJ0c19jb3B5OgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIHBhcnRzID0gcGFydHNbMTpdCisgICAgICAgIG9iaiA9IG1vZHVsZQorICAgICAgICBmb3IgcGFydCBpbiBwYXJ0czoKKyAgICAgICAgICAgIHBhcmVudCwgb2JqID0gb2JqLCBnZXRhdHRyKG9iaiwgcGFydCkKKworICAgICAgICBpZiBpc2luc3RhbmNlKG9iaiwgdHlwZXMuTW9kdWxlVHlwZSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5sb2FkVGVzdHNGcm9tTW9kdWxlKG9iaikKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgdHlwZSkgYW5kIGlzc3ViY2xhc3Mob2JqLCBjYXNlLlRlc3RDYXNlKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShvYmopCisgICAgICAgIGVsaWYgKGlzaW5zdGFuY2Uob2JqLCB0eXBlcy5VbmJvdW5kTWV0aG9kVHlwZSkgYW5kCisgICAgICAgICAgICAgIGlzaW5zdGFuY2UocGFyZW50LCB0eXBlKSBhbmQKKyAgICAgICAgICAgICAgaXNzdWJjbGFzcyhwYXJlbnQsIGNhc2UuVGVzdENhc2UpKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3MoW3BhcmVudChvYmouX19uYW1lX18pXSkKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG9iaiwgc3VpdGUuVGVzdFN1aXRlKToKKyAgICAgICAgICAgIHJldHVybiBvYmoKKyAgICAgICAgZWxpZiBoYXNhdHRyKG9iaiwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICB0ZXN0ID0gb2JqKCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdCwgc3VpdGUuVGVzdFN1aXRlKToKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVzdAorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKHRlc3QsIGNhc2UuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3MoW3Rlc3RdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImNhbGxpbmcgJXMgcmV0dXJuZWQgJXMsIG5vdCBhIHRlc3QiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9iaiwgdGVzdCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImRvbid0IGtub3cgaG93IHRvIG1ha2UgdGVzdCBmcm9tOiAlcyIgJSBvYmopCisKKyAgICBkZWYgbG9hZFRlc3RzRnJvbU5hbWVzKHNlbGYsIG5hbWVzLCBtb2R1bGU9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBmb3VuZCB1c2luZyB0aGUgZ2l2ZW4gc2VxdWVuY2UKKyAgICAgICAgb2Ygc3RyaW5nIHNwZWNpZmllcnMuIFNlZSAnbG9hZFRlc3RzRnJvbU5hbWUoKScuCisgICAgICAgICIiIgorICAgICAgICBzdWl0ZXMgPSBbc2VsZi5sb2FkVGVzdHNGcm9tTmFtZShuYW1lLCBtb2R1bGUpIGZvciBuYW1lIGluIG5hbWVzXQorICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKHN1aXRlcykKKworICAgIGRlZiBnZXRUZXN0Q2FzZU5hbWVzKHNlbGYsIHRlc3RDYXNlQ2xhc3MpOgorICAgICAgICAiIiJSZXR1cm4gYSBzb3J0ZWQgc2VxdWVuY2Ugb2YgbWV0aG9kIG5hbWVzIGZvdW5kIHdpdGhpbiB0ZXN0Q2FzZUNsYXNzCisgICAgICAgICIiIgorICAgICAgICBkZWYgaXNUZXN0TWV0aG9kKGF0dHJuYW1lLCB0ZXN0Q2FzZUNsYXNzPXRlc3RDYXNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4PXNlbGYudGVzdE1ldGhvZFByZWZpeCk6CisgICAgICAgICAgICByZXR1cm4gYXR0cm5hbWUuc3RhcnRzd2l0aChwcmVmaXgpIGFuZCBcCisgICAgICAgICAgICAgICAgaGFzYXR0cihnZXRhdHRyKHRlc3RDYXNlQ2xhc3MsIGF0dHJuYW1lKSwgJ19fY2FsbF9fJykKKyAgICAgICAgdGVzdEZuTmFtZXMgPSBmaWx0ZXIoaXNUZXN0TWV0aG9kLCBkaXIodGVzdENhc2VDbGFzcykpCisgICAgICAgIGlmIHNlbGYuc29ydFRlc3RNZXRob2RzVXNpbmc6CisgICAgICAgICAgICB0ZXN0Rm5OYW1lcy5zb3J0KGtleT1fQ21wVG9LZXkoc2VsZi5zb3J0VGVzdE1ldGhvZHNVc2luZykpCisgICAgICAgIHJldHVybiB0ZXN0Rm5OYW1lcworCisgICAgZGVmIGRpc2NvdmVyKHNlbGYsIHN0YXJ0X2RpciwgcGF0dGVybj0ndGVzdCoucHknLCB0b3BfbGV2ZWxfZGlyPU5vbmUpOgorICAgICAgICAiIiJGaW5kIGFuZCByZXR1cm4gYWxsIHRlc3QgbW9kdWxlcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhcnQKKyAgICAgICAgZGlyZWN0b3J5LCByZWN1cnNpbmcgaW50byBzdWJkaXJlY3RvcmllcyB0byBmaW5kIHRoZW0uIE9ubHkgdGVzdCBmaWxlcworICAgICAgICB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIHdpbGwgYmUgbG9hZGVkLiAoVXNpbmcgc2hlbGwgc3R5bGUgcGF0dGVybgorICAgICAgICBtYXRjaGluZy4pCisKKyAgICAgICAgQWxsIHRlc3QgbW9kdWxlcyBtdXN0IGJlIGltcG9ydGFibGUgZnJvbSB0aGUgdG9wIGxldmVsIG9mIHRoZSBwcm9qZWN0LgorICAgICAgICBJZiB0aGUgc3RhcnQgZGlyZWN0b3J5IGlzIG5vdCB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSB0aGVuIHRoZSB0b3AKKyAgICAgICAgbGV2ZWwgZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkIHNlcGFyYXRlbHkuCisKKyAgICAgICAgSWYgYSB0ZXN0IHBhY2thZ2UgbmFtZSAoZGlyZWN0b3J5IHdpdGggJ19faW5pdF9fLnB5JykgbWF0Y2hlcyB0aGUKKyAgICAgICAgcGF0dGVybiB0aGVuIHRoZSBwYWNrYWdlIHdpbGwgYmUgY2hlY2tlZCBmb3IgYSAnbG9hZF90ZXN0cycgZnVuY3Rpb24uIElmCisgICAgICAgIHRoaXMgZXhpc3RzIHRoZW4gaXQgd2lsbCBiZSBjYWxsZWQgd2l0aCBsb2FkZXIsIHRlc3RzLCBwYXR0ZXJuLgorCisgICAgICAgIElmIGxvYWRfdGVzdHMgZXhpc3RzIHRoZW4gZGlzY292ZXJ5IGRvZXMgICpub3QqIHJlY3Vyc2UgaW50byB0aGUgcGFja2FnZSwKKyAgICAgICAgbG9hZF90ZXN0cyBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyBhbGwgdGVzdHMgaW4gdGhlIHBhY2thZ2UuCisKKyAgICAgICAgVGhlIHBhdHRlcm4gaXMgZGVsaWJlcmF0ZWx5IG5vdCBzdG9yZWQgYXMgYSBsb2FkZXIgYXR0cmlidXRlIHNvIHRoYXQKKyAgICAgICAgcGFja2FnZXMgY2FuIGNvbnRpbnVlIGRpc2NvdmVyeSB0aGVtc2VsdmVzLiB0b3BfbGV2ZWxfZGlyIGlzIHN0b3JlZCBzbworICAgICAgICBsb2FkX3Rlc3RzIGRvZXMgbm90IG5lZWQgdG8gcGFzcyB0aGlzIGFyZ3VtZW50IGluIHRvIGxvYWRlci5kaXNjb3ZlcigpLgorICAgICAgICAiIiIKKyAgICAgICAgc2V0X2ltcGxpY2l0X3RvcCA9IEZhbHNlCisgICAgICAgIGlmIHRvcF9sZXZlbF9kaXIgaXMgTm9uZSBhbmQgc2VsZi5fdG9wX2xldmVsX2RpciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICMgbWFrZSB0b3BfbGV2ZWxfZGlyIG9wdGlvbmFsIGlmIGNhbGxlZCBmcm9tIGxvYWRfdGVzdHMgaW4gYSBwYWNrYWdlCisgICAgICAgICAgICB0b3BfbGV2ZWxfZGlyID0gc2VsZi5fdG9wX2xldmVsX2RpcgorICAgICAgICBlbGlmIHRvcF9sZXZlbF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNldF9pbXBsaWNpdF90b3AgPSBUcnVlCisgICAgICAgICAgICB0b3BfbGV2ZWxfZGlyID0gc3RhcnRfZGlyCisKKyAgICAgICAgdG9wX2xldmVsX2RpciA9IG9zLnBhdGguYWJzcGF0aCh0b3BfbGV2ZWxfZGlyKQorCisgICAgICAgIGlmIG5vdCB0b3BfbGV2ZWxfZGlyIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgIyBhbGwgdGVzdCBtb2R1bGVzIG11c3QgYmUgaW1wb3J0YWJsZSBmcm9tIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5CisgICAgICAgICAgICAjIHNob3VsZCB3ZSAqdW5jb25kaXRpb25hbGx5KiBwdXQgdGhlIHN0YXJ0IGRpcmVjdG9yeSBpbiBmaXJzdAorICAgICAgICAgICAgIyBpbiBzeXMucGF0aCB0byBtaW5pbWlzZSBsaWtlbGlob29kIG9mIGNvbmZsaWN0cyBiZXR3ZWVuIGluc3RhbGxlZAorICAgICAgICAgICAgIyBtb2R1bGVzIGFuZCBkZXZlbG9wbWVudCB2ZXJzaW9ucz8KKyAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCB0b3BfbGV2ZWxfZGlyKQorICAgICAgICBzZWxmLl90b3BfbGV2ZWxfZGlyID0gdG9wX2xldmVsX2RpcgorCisgICAgICAgIGlzX25vdF9pbXBvcnRhYmxlID0gRmFsc2UKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcihvcy5wYXRoLmFic3BhdGgoc3RhcnRfZGlyKSk6CisgICAgICAgICAgICBzdGFydF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoc3RhcnRfZGlyKQorICAgICAgICAgICAgaWYgc3RhcnRfZGlyICE9IHRvcF9sZXZlbF9kaXI6CisgICAgICAgICAgICAgICAgaXNfbm90X2ltcG9ydGFibGUgPSBub3Qgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKHN0YXJ0X2RpciwgJ19faW5pdF9fLnB5JykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHN1cHBvcnQgZm9yIGRpc2NvdmVyeSBmcm9tIGRvdHRlZCBtb2R1bGUgbmFtZXMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKHN0YXJ0X2RpcikKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBpc19ub3RfaW1wb3J0YWJsZSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGhlX21vZHVsZSA9IHN5cy5tb2R1bGVzW3N0YXJ0X2Rpcl0KKyAgICAgICAgICAgICAgICB0b3BfcGFydCA9IHN0YXJ0X2Rpci5zcGxpdCgnLicpWzBdCisgICAgICAgICAgICAgICAgc3RhcnRfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZSgodGhlX21vZHVsZS5fX2ZpbGVfXykpKQorICAgICAgICAgICAgICAgIGlmIHNldF9pbXBsaWNpdF90b3A6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RvcF9sZXZlbF9kaXIgPSBzZWxmLl9nZXRfZGlyZWN0b3J5X2NvbnRhaW5pbmdfbW9kdWxlKHRvcF9wYXJ0KQorICAgICAgICAgICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUodG9wX2xldmVsX2RpcikKKworICAgICAgICBpZiBpc19ub3RfaW1wb3J0YWJsZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCdTdGFydCBkaXJlY3RvcnkgaXMgbm90IGltcG9ydGFibGU6ICVyJyAlIHN0YXJ0X2RpcikKKworICAgICAgICB0ZXN0cyA9IGxpc3Qoc2VsZi5fZmluZF90ZXN0cyhzdGFydF9kaXIsIHBhdHRlcm4pKQorICAgICAgICByZXR1cm4gc2VsZi5zdWl0ZUNsYXNzKHRlc3RzKQorCisgICAgZGVmIF9nZXRfZGlyZWN0b3J5X2NvbnRhaW5pbmdfbW9kdWxlKHNlbGYsIG1vZHVsZV9uYW1lKToKKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCisgICAgICAgIGZ1bGxfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChtb2R1bGUuX19maWxlX18pCisKKyAgICAgICAgaWYgb3MucGF0aC5iYXNlbmFtZShmdWxsX3BhdGgpLmxvd2VyKCkuc3RhcnRzd2l0aCgnX19pbml0X18ucHknKToKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKGZ1bGxfcGF0aCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGhlcmUgd2UgaGF2ZSBiZWVuIGdpdmVuIGEgbW9kdWxlIHJhdGhlciB0aGFuIGEgcGFja2FnZSAtIHNvCisgICAgICAgICAgICAjIGFsbCB3ZSBjYW4gZG8gaXMgc2VhcmNoIHRoZSAqc2FtZSogZGlyZWN0b3J5IHRoZSBtb2R1bGUgaXMgaW4KKyAgICAgICAgICAgICMgc2hvdWxkIGFuIGV4Y2VwdGlvbiBiZSByYWlzZWQgaW5zdGVhZAorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguZGlybmFtZShmdWxsX3BhdGgpCisKKyAgICBkZWYgX2dldF9uYW1lX2Zyb21fcGF0aChzZWxmLCBwYXRoKToKKyAgICAgICAgcGF0aCA9IG9zLnBhdGguc3BsaXRleHQob3MucGF0aC5ub3JtcGF0aChwYXRoKSlbMF0KKworICAgICAgICBfcmVscGF0aCA9IG9zLnBhdGgucmVscGF0aChwYXRoLCBzZWxmLl90b3BfbGV2ZWxfZGlyKQorICAgICAgICBhc3NlcnQgbm90IG9zLnBhdGguaXNhYnMoX3JlbHBhdGgpLCAiUGF0aCBtdXN0IGJlIHdpdGhpbiB0aGUgcHJvamVjdCIKKyAgICAgICAgYXNzZXJ0IG5vdCBfcmVscGF0aC5zdGFydHN3aXRoKCcuLicpLCAiUGF0aCBtdXN0IGJlIHdpdGhpbiB0aGUgcHJvamVjdCIKKworICAgICAgICBuYW1lID0gX3JlbHBhdGgucmVwbGFjZShvcy5wYXRoLnNlcCwgJy4nKQorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIF9nZXRfbW9kdWxlX2Zyb21fbmFtZShzZWxmLCBuYW1lKToKKyAgICAgICAgX19pbXBvcnRfXyhuYW1lKQorICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXNbbmFtZV0KKworICAgIGRlZiBfbWF0Y2hfcGF0aChzZWxmLCBwYXRoLCBmdWxsX3BhdGgsIHBhdHRlcm4pOgorICAgICAgICAjIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHVzZSBhbHRlcm5hdGl2ZSBtYXRjaGluZyBzdHJhdGVneQorICAgICAgICByZXR1cm4gZm5tYXRjaChwYXRoLCBwYXR0ZXJuKQorCisgICAgZGVmIF9maW5kX3Rlc3RzKHNlbGYsIHN0YXJ0X2RpciwgcGF0dGVybik6CisgICAgICAgICIiIlVzZWQgYnkgZGlzY292ZXJ5LiBZaWVsZHMgdGVzdCBzdWl0ZXMgaXQgbG9hZHMuIiIiCisgICAgICAgIHBhdGhzID0gb3MubGlzdGRpcihzdGFydF9kaXIpCisKKyAgICAgICAgZm9yIHBhdGggaW4gcGF0aHM6CisgICAgICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4oc3RhcnRfZGlyLCBwYXRoKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZnVsbF9wYXRoKToKKyAgICAgICAgICAgICAgICBpZiBub3QgVkFMSURfTU9EVUxFX05BTUUubWF0Y2gocGF0aCk6CisgICAgICAgICAgICAgICAgICAgICMgdmFsaWQgUHl0aG9uIGlkZW50aWZpZXJzIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fbWF0Y2hfcGF0aChwYXRoLCBmdWxsX3BhdGgsIHBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICMgaWYgdGhlIHRlc3QgZmlsZSBtYXRjaGVzLCBsb2FkIGl0CisgICAgICAgICAgICAgICAgbmFtZSA9IHNlbGYuX2dldF9uYW1lX2Zyb21fcGF0aChmdWxsX3BhdGgpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBzZWxmLl9nZXRfbW9kdWxlX2Zyb21fbmFtZShuYW1lKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgX21ha2VfZmFpbGVkX2ltcG9ydF90ZXN0KG5hbWUsIHNlbGYuc3VpdGVDbGFzcykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtb2RfZmlsZSA9IG9zLnBhdGguYWJzcGF0aChnZXRhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJywgZnVsbF9wYXRoKSkKKyAgICAgICAgICAgICAgICAgICAgcmVhbHBhdGggPSBvcy5wYXRoLnNwbGl0ZXh0KG1vZF9maWxlKVswXQorICAgICAgICAgICAgICAgICAgICBmdWxscGF0aF9ub2V4dCA9IG9zLnBhdGguc3BsaXRleHQoZnVsbF9wYXRoKVswXQorICAgICAgICAgICAgICAgICAgICBpZiByZWFscGF0aC5sb3dlcigpICE9IGZ1bGxwYXRoX25vZXh0Lmxvd2VyKCk6CisgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfZGlyID0gb3MucGF0aC5kaXJuYW1lKHJlYWxwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgbW9kX25hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoZnVsbF9wYXRoKSlbMF0KKyAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX2RpciA9IG9zLnBhdGguZGlybmFtZShmdWxsX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICBtc2cgPSAoIiVyIG1vZHVsZSBpbmNvcnJlY3RseSBpbXBvcnRlZCBmcm9tICVyLiBFeHBlY3RlZCAlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJcyB0aGlzIG1vZHVsZSBnbG9iYWxseSBpbnN0YWxsZWQ/IikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKG1zZyAlIChtb2RfbmFtZSwgbW9kdWxlX2RpciwgZXhwZWN0ZWRfZGlyKSkKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgc2VsZi5sb2FkVGVzdHNGcm9tTW9kdWxlKG1vZHVsZSkKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihmdWxsX3BhdGgpOgorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZnVsbF9wYXRoLCAnX19pbml0X18ucHknKSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBsb2FkX3Rlc3RzID0gTm9uZQorICAgICAgICAgICAgICAgIHRlc3RzID0gTm9uZQorICAgICAgICAgICAgICAgIGlmIGZubWF0Y2gocGF0aCwgcGF0dGVybik6CisgICAgICAgICAgICAgICAgICAgICMgb25seSBjaGVjayBsb2FkX3Rlc3RzIGlmIHRoZSBwYWNrYWdlIGRpcmVjdG9yeSBpdHNlbGYgbWF0Y2hlcyB0aGUgZmlsdGVyCisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzZWxmLl9nZXRfbmFtZV9mcm9tX3BhdGgoZnVsbF9wYXRoKQorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlID0gc2VsZi5fZ2V0X21vZHVsZV9mcm9tX25hbWUobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgbG9hZF90ZXN0cyA9IGdldGF0dHIocGFja2FnZSwgJ2xvYWRfdGVzdHMnLCBOb25lKQorICAgICAgICAgICAgICAgICAgICB0ZXN0cyA9IHNlbGYubG9hZFRlc3RzRnJvbU1vZHVsZShwYWNrYWdlLCB1c2VfbG9hZF90ZXN0cz1GYWxzZSkKKworICAgICAgICAgICAgICAgIGlmIGxvYWRfdGVzdHMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgaWYgdGVzdHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHRlc3RzIGxvYWRlZCBmcm9tIHBhY2thZ2UgZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdGVzdHMKKyAgICAgICAgICAgICAgICAgICAgIyByZWN1cnNlIGludG8gdGhlIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgZm9yIHRlc3QgaW4gc2VsZi5fZmluZF90ZXN0cyhmdWxsX3BhdGgsIHBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdGVzdAorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGxvYWRfdGVzdHMoc2VsZiwgdGVzdHMsIHBhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgICAgICAgICB5aWVsZCBfbWFrZV9mYWlsZWRfbG9hZF90ZXN0cyhwYWNrYWdlLl9fbmFtZV9fLCBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWl0ZUNsYXNzKQorCitkZWZhdWx0VGVzdExvYWRlciA9IFRlc3RMb2FkZXIoKQorCisKK2RlZiBfbWFrZUxvYWRlcihwcmVmaXgsIHNvcnRVc2luZywgc3VpdGVDbGFzcz1Ob25lKToKKyAgICBsb2FkZXIgPSBUZXN0TG9hZGVyKCkKKyAgICBsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgPSBzb3J0VXNpbmcKKyAgICBsb2FkZXIudGVzdE1ldGhvZFByZWZpeCA9IHByZWZpeAorICAgIGlmIHN1aXRlQ2xhc3M6CisgICAgICAgIGxvYWRlci5zdWl0ZUNsYXNzID0gc3VpdGVDbGFzcworICAgIHJldHVybiBsb2FkZXIKKworZGVmIGdldFRlc3RDYXNlTmFtZXModGVzdENhc2VDbGFzcywgcHJlZml4LCBzb3J0VXNpbmc9Y21wKToKKyAgICByZXR1cm4gX21ha2VMb2FkZXIocHJlZml4LCBzb3J0VXNpbmcpLmdldFRlc3RDYXNlTmFtZXModGVzdENhc2VDbGFzcykKKworZGVmIG1ha2VTdWl0ZSh0ZXN0Q2FzZUNsYXNzLCBwcmVmaXg9J3Rlc3QnLCBzb3J0VXNpbmc9Y21wLAorICAgICAgICAgICAgICBzdWl0ZUNsYXNzPXN1aXRlLlRlc3RTdWl0ZSk6CisgICAgcmV0dXJuIF9tYWtlTG9hZGVyKHByZWZpeCwgc29ydFVzaW5nLCBzdWl0ZUNsYXNzKS5sb2FkVGVzdHNGcm9tVGVzdENhc2UodGVzdENhc2VDbGFzcykKKworZGVmIGZpbmRUZXN0Q2FzZXMobW9kdWxlLCBwcmVmaXg9J3Rlc3QnLCBzb3J0VXNpbmc9Y21wLAorICAgICAgICAgICAgICAgICAgc3VpdGVDbGFzcz1zdWl0ZS5UZXN0U3VpdGUpOgorICAgIHJldHVybiBfbWFrZUxvYWRlcihwcmVmaXgsIHNvcnRVc2luZywgc3VpdGVDbGFzcykubG9hZFRlc3RzRnJvbU1vZHVsZShtb2R1bGUpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2xvYWRlci5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2xvYWRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNmMzdiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2xvYWRlci5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L2xvYWRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0ZDcyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbG9hZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L21haW4ucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L21haW4ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI1MzY3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weQpAQCAtMCwwICsxLDIzNiBAQAorIiIiVW5pdHRlc3QgbWFpbiBwcm9ncmFtIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IHR5cGVzCisKK2Zyb20gLiBpbXBvcnQgbG9hZGVyLCBydW5uZXIKK2Zyb20gLnNpZ25hbHMgaW1wb3J0IGluc3RhbGxIYW5kbGVyCisKK19fdW5pdHRlc3QgPSBUcnVlCisKK0ZBSUxGQVNUICAgICA9ICIgIC1mLCAtLWZhaWxmYXN0ICAgU3RvcCBvbiBmaXJzdCBmYWlsdXJlXG4iCitDQVRDSEJSRUFLICAgPSAiICAtYywgLS1jYXRjaCAgICAgIENhdGNoIGNvbnRyb2wtQyBhbmQgZGlzcGxheSByZXN1bHRzXG4iCitCVUZGRVJPVVRQVVQgPSAiICAtYiwgLS1idWZmZXIgICAgIEJ1ZmZlciBzdGRvdXQgYW5kIHN0ZGVyciBkdXJpbmcgdGVzdCBydW5zXG4iCisKK1VTQUdFX0FTX01BSU4gPSAiIiJcCitVc2FnZTogJShwcm9nTmFtZSlzIFtvcHRpb25zXSBbdGVzdHNdCisKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgICAgICAgU2hvdyB0aGlzIG1lc3NhZ2UKKyAgLXYsIC0tdmVyYm9zZSAgICBWZXJib3NlIG91dHB1dAorICAtcSwgLS1xdWlldCAgICAgIE1pbmltYWwgb3V0cHV0CislKGZhaWxmYXN0KXMlKGNhdGNoYnJlYWspcyUoYnVmZmVyKXMKK0V4YW1wbGVzOgorICAlKHByb2dOYW1lKXMgdGVzdF9tb2R1bGUgICAgICAgICAgICAgICAtIHJ1biB0ZXN0cyBmcm9tIHRlc3RfbW9kdWxlCisgICUocHJvZ05hbWUpcyBtb2R1bGUuVGVzdENsYXNzICAgICAgICAgIC0gcnVuIHRlc3RzIGZyb20gbW9kdWxlLlRlc3RDbGFzcworICAlKHByb2dOYW1lKXMgbW9kdWxlLkNsYXNzLnRlc3RfbWV0aG9kICAtIHJ1biBzcGVjaWZpZWQgdGVzdCBtZXRob2QKKworW3Rlc3RzXSBjYW4gYmUgYSBsaXN0IG9mIGFueSBudW1iZXIgb2YgdGVzdCBtb2R1bGVzLCBjbGFzc2VzIGFuZCB0ZXN0CittZXRob2RzLgorCitBbHRlcm5hdGl2ZSBVc2FnZTogJShwcm9nTmFtZSlzIGRpc2NvdmVyIFtvcHRpb25zXQorCitPcHRpb25zOgorICAtdiwgLS12ZXJib3NlICAgIFZlcmJvc2Ugb3V0cHV0CislKGZhaWxmYXN0KXMlKGNhdGNoYnJlYWspcyUoYnVmZmVyKXMgIC1zIGRpcmVjdG9yeSAgICAgRGlyZWN0b3J5IHRvIHN0YXJ0IGRpc2NvdmVyeSAoJy4nIGRlZmF1bHQpCisgIC1wIHBhdHRlcm4gICAgICAgUGF0dGVybiB0byBtYXRjaCB0ZXN0IGZpbGVzICgndGVzdCoucHknIGRlZmF1bHQpCisgIC10IGRpcmVjdG9yeSAgICAgVG9wIGxldmVsIGRpcmVjdG9yeSBvZiBwcm9qZWN0IChkZWZhdWx0IHRvCisgICAgICAgICAgICAgICAgICAgc3RhcnQgZGlyZWN0b3J5KQorCitGb3IgdGVzdCBkaXNjb3ZlcnkgYWxsIHRlc3QgbW9kdWxlcyBtdXN0IGJlIGltcG9ydGFibGUgZnJvbSB0aGUgdG9wCitsZXZlbCBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QuCisiIiIKKworVVNBR0VfRlJPTV9NT0RVTEUgPSAiIiJcCitVc2FnZTogJShwcm9nTmFtZSlzIFtvcHRpb25zXSBbdGVzdF0gWy4uLl0KKworT3B0aW9uczoKKyAgLWgsIC0taGVscCAgICAgICBTaG93IHRoaXMgbWVzc2FnZQorICAtdiwgLS12ZXJib3NlICAgIFZlcmJvc2Ugb3V0cHV0CisgIC1xLCAtLXF1aWV0ICAgICAgTWluaW1hbCBvdXRwdXQKKyUoZmFpbGZhc3QpcyUoY2F0Y2hicmVhaylzJShidWZmZXIpcworRXhhbXBsZXM6CisgICUocHJvZ05hbWUpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHJ1biBkZWZhdWx0IHNldCBvZiB0ZXN0cworICAlKHByb2dOYW1lKXMgTXlUZXN0U3VpdGUgICAgICAgICAgICAgICAgICAgLSBydW4gc3VpdGUgJ015VGVzdFN1aXRlJworICAlKHByb2dOYW1lKXMgTXlUZXN0Q2FzZS50ZXN0U29tZXRoaW5nICAgICAgLSBydW4gTXlUZXN0Q2FzZS50ZXN0U29tZXRoaW5nCisgICUocHJvZ05hbWUpcyBNeVRlc3RDYXNlICAgICAgICAgICAgICAgICAgICAtIHJ1biBhbGwgJ3Rlc3QqJyB0ZXN0IG1ldGhvZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gTXlUZXN0Q2FzZQorIiIiCisKKworCitjbGFzcyBUZXN0UHJvZ3JhbShvYmplY3QpOgorICAgICIiIkEgY29tbWFuZC1saW5lIHByb2dyYW0gdGhhdCBydW5zIGEgc2V0IG9mIHRlc3RzOyB0aGlzIGlzIHByaW1hcmlseQorICAgICAgIGZvciBtYWtpbmcgdGVzdCBtb2R1bGVzIGNvbnZlbmllbnRseSBleGVjdXRhYmxlLgorICAgICIiIgorICAgIFVTQUdFID0gVVNBR0VfRlJPTV9NT0RVTEUKKworICAgICMgZGVmYXVsdHMgZm9yIHRlc3RpbmcKKyAgICBmYWlsZmFzdCA9IGNhdGNoYnJlYWsgPSBidWZmZXIgPSBwcm9nTmFtZSA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGU9J19fbWFpbl9fJywgZGVmYXVsdFRlc3Q9Tm9uZSwgYXJndj1Ob25lLAorICAgICAgICAgICAgICAgICAgICB0ZXN0UnVubmVyPU5vbmUsIHRlc3RMb2FkZXI9bG9hZGVyLmRlZmF1bHRUZXN0TG9hZGVyLAorICAgICAgICAgICAgICAgICAgICBleGl0PVRydWUsIHZlcmJvc2l0eT0xLCBmYWlsZmFzdD1Ob25lLCBjYXRjaGJyZWFrPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcj1Ob25lKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShtb2R1bGUsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgc2VsZi5tb2R1bGUgPSBfX2ltcG9ydF9fKG1vZHVsZSkKKyAgICAgICAgICAgIGZvciBwYXJ0IGluIG1vZHVsZS5zcGxpdCgnLicpWzE6XToKKyAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZSA9IGdldGF0dHIoc2VsZi5tb2R1bGUsIHBhcnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm1vZHVsZSA9IG1vZHVsZQorICAgICAgICBpZiBhcmd2IGlzIE5vbmU6CisgICAgICAgICAgICBhcmd2ID0gc3lzLmFyZ3YKKworICAgICAgICBzZWxmLmV4aXQgPSBleGl0CisgICAgICAgIHNlbGYuZmFpbGZhc3QgPSBmYWlsZmFzdAorICAgICAgICBzZWxmLmNhdGNoYnJlYWsgPSBjYXRjaGJyZWFrCisgICAgICAgIHNlbGYudmVyYm9zaXR5ID0gdmVyYm9zaXR5CisgICAgICAgIHNlbGYuYnVmZmVyID0gYnVmZmVyCisgICAgICAgIHNlbGYuZGVmYXVsdFRlc3QgPSBkZWZhdWx0VGVzdAorICAgICAgICBzZWxmLnRlc3RSdW5uZXIgPSB0ZXN0UnVubmVyCisgICAgICAgIHNlbGYudGVzdExvYWRlciA9IHRlc3RMb2FkZXIKKyAgICAgICAgc2VsZi5wcm9nTmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoYXJndlswXSkKKyAgICAgICAgc2VsZi5wYXJzZUFyZ3MoYXJndikKKyAgICAgICAgc2VsZi5ydW5UZXN0cygpCisKKyAgICBkZWYgdXNhZ2VFeGl0KHNlbGYsIG1zZz1Ob25lKToKKyAgICAgICAgaWYgbXNnOgorICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgIHVzYWdlID0geydwcm9nTmFtZSc6IHNlbGYucHJvZ05hbWUsICdjYXRjaGJyZWFrJzogJycsICdmYWlsZmFzdCc6ICcnLAorICAgICAgICAgICAgICAgICAnYnVmZmVyJzogJyd9CisgICAgICAgIGlmIHNlbGYuZmFpbGZhc3QgIT0gRmFsc2U6CisgICAgICAgICAgICB1c2FnZVsnZmFpbGZhc3QnXSA9IEZBSUxGQVNUCisgICAgICAgIGlmIHNlbGYuY2F0Y2hicmVhayAhPSBGYWxzZToKKyAgICAgICAgICAgIHVzYWdlWydjYXRjaGJyZWFrJ10gPSBDQVRDSEJSRUFLCisgICAgICAgIGlmIHNlbGYuYnVmZmVyICE9IEZhbHNlOgorICAgICAgICAgICAgdXNhZ2VbJ2J1ZmZlciddID0gQlVGRkVST1VUUFVUCisgICAgICAgIHByaW50IHNlbGYuVVNBR0UgJSB1c2FnZQorICAgICAgICBzeXMuZXhpdCgyKQorCisgICAgZGVmIHBhcnNlQXJncyhzZWxmLCBhcmd2KToKKyAgICAgICAgaWYgbGVuKGFyZ3YpID4gMSBhbmQgYXJndlsxXS5sb3dlcigpID09ICdkaXNjb3Zlcic6CisgICAgICAgICAgICBzZWxmLl9kb19kaXNjb3ZlcnkoYXJndlsyOl0pCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpbXBvcnQgZ2V0b3B0CisgICAgICAgIGxvbmdfb3B0cyA9IFsnaGVscCcsICd2ZXJib3NlJywgJ3F1aWV0JywgJ2ZhaWxmYXN0JywgJ2NhdGNoJywgJ2J1ZmZlciddCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KGFyZ3ZbMTpdLCAnaEh2cWZjYicsIGxvbmdfb3B0cykKKyAgICAgICAgICAgIGZvciBvcHQsIHZhbHVlIGluIG9wdGlvbnM6CisgICAgICAgICAgICAgICAgaWYgb3B0IGluICgnLWgnLCctSCcsJy0taGVscCcpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVzYWdlRXhpdCgpCisgICAgICAgICAgICAgICAgaWYgb3B0IGluICgnLXEnLCctLXF1aWV0Jyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyYm9zaXR5ID0gMAorICAgICAgICAgICAgICAgIGlmIG9wdCBpbiAoJy12JywnLS12ZXJib3NlJyk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudmVyYm9zaXR5ID0gMgorICAgICAgICAgICAgICAgIGlmIG9wdCBpbiAoJy1mJywnLS1mYWlsZmFzdCcpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmZhaWxmYXN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxmYXN0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAjIFNob3VsZCB0aGlzIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiAtZiBpcyBub3QgdmFsaWQ/CisgICAgICAgICAgICAgICAgaWYgb3B0IGluICgnLWMnLCctLWNhdGNoJyk6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuY2F0Y2hicmVhayBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYXRjaGJyZWFrID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAjIFNob3VsZCB0aGlzIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiAtYyBpcyBub3QgdmFsaWQ/CisgICAgICAgICAgICAgICAgaWYgb3B0IGluICgnLWInLCctLWJ1ZmZlcicpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmJ1ZmZlciBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXIgPSBUcnVlCisgICAgICAgICAgICAgICAgICAgICMgU2hvdWxkIHRoaXMgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIC1iIGlzIG5vdCB2YWxpZD8KKyAgICAgICAgICAgIGlmIGxlbihhcmdzKSA9PSAwIGFuZCBzZWxmLmRlZmF1bHRUZXN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBjcmVhdGVUZXN0cyB3aWxsIGxvYWQgdGVzdHMgZnJvbSBzZWxmLm1vZHVsZQorICAgICAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gTm9uZQorICAgICAgICAgICAgZWxpZiBsZW4oYXJncykgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYudGVzdE5hbWVzID0gYXJncworICAgICAgICAgICAgICAgIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgICAgICAgICAgICAgICAgICMgdG8gc3VwcG9ydCBweXRob24gLW0gdW5pdHRlc3QgLi4uCisgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlID0gTm9uZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3ROYW1lcyA9IChzZWxmLmRlZmF1bHRUZXN0LCkKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlVGVzdHMoKQorICAgICAgICBleGNlcHQgZ2V0b3B0LmVycm9yLCBtc2c6CisgICAgICAgICAgICBzZWxmLnVzYWdlRXhpdChtc2cpCisKKyAgICBkZWYgY3JlYXRlVGVzdHMoc2VsZik6CisgICAgICAgIGlmIHNlbGYudGVzdE5hbWVzIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRlc3QgPSBzZWxmLnRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLm1vZHVsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGVzdCA9IHNlbGYudGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoc2VsZi50ZXN0TmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlKQorCisgICAgZGVmIF9kb19kaXNjb3Zlcnkoc2VsZiwgYXJndiwgTG9hZGVyPU5vbmUpOgorICAgICAgICBpZiBMb2FkZXIgaXMgTm9uZToKKyAgICAgICAgICAgIExvYWRlciA9IGxhbWJkYTogc2VsZi50ZXN0TG9hZGVyCisKKyAgICAgICAgIyBoYW5kbGUgY29tbWFuZCBsaW5lIGFyZ3MgZm9yIHRlc3QgZGlzY292ZXJ5CisgICAgICAgIHNlbGYucHJvZ05hbWUgPSAnJXMgZGlzY292ZXInICUgc2VsZi5wcm9nTmFtZQorICAgICAgICBpbXBvcnQgb3B0cGFyc2UKKyAgICAgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnByb2cgPSBzZWxmLnByb2dOYW1lCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCctdicsICctLXZlcmJvc2UnLCBkZXN0PSd2ZXJib3NlJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVmVyYm9zZSBvdXRwdXQnLCBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgICAgICBpZiBzZWxmLmZhaWxmYXN0ICE9IEZhbHNlOgorICAgICAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1mJywgJy0tZmFpbGZhc3QnLCBkZXN0PSdmYWlsZmFzdCcsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdTdG9wIG9uIGZpcnN0IGZhaWwgb3IgZXJyb3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICAgICAgaWYgc2VsZi5jYXRjaGJyZWFrICE9IEZhbHNlOgorICAgICAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1jJywgJy0tY2F0Y2gnLCBkZXN0PSdjYXRjaGJyZWFrJywgZGVmYXVsdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0NhdGNoIGN0cmwtQyBhbmQgZGlzcGxheSByZXN1bHRzIHNvIGZhcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgICAgICBpZiBzZWxmLmJ1ZmZlciAhPSBGYWxzZToKKyAgICAgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCctYicsICctLWJ1ZmZlcicsIGRlc3Q9J2J1ZmZlcicsIGRlZmF1bHQ9RmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdCdWZmZXIgc3Rkb3V0IGFuZCBzdGRlcnIgZHVyaW5nIHRlc3RzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcycsICctLXN0YXJ0LWRpcmVjdG9yeScsIGRlc3Q9J3N0YXJ0JywgZGVmYXVsdD0nLicsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkRpcmVjdG9yeSB0byBzdGFydCBkaXNjb3ZlcnkgKCcuJyBkZWZhdWx0KSIpCisgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcCcsICctLXBhdHRlcm4nLCBkZXN0PSdwYXR0ZXJuJywgZGVmYXVsdD0ndGVzdCoucHknLAorICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXR0ZXJuIHRvIG1hdGNoIHRlc3RzICgndGVzdCoucHknIGRlZmF1bHQpIikKKyAgICAgICAgcGFyc2VyLmFkZF9vcHRpb24oJy10JywgJy0tdG9wLWxldmVsLWRpcmVjdG9yeScsIGRlc3Q9J3RvcCcsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nVG9wIGxldmVsIGRpcmVjdG9yeSBvZiBwcm9qZWN0IChkZWZhdWx0cyB0byBzdGFydCBkaXJlY3RvcnkpJykKKworICAgICAgICBvcHRpb25zLCBhcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoYXJndikKKyAgICAgICAgaWYgbGVuKGFyZ3MpID4gMzoKKyAgICAgICAgICAgIHNlbGYudXNhZ2VFeGl0KCkKKworICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gemlwKCgnc3RhcnQnLCAncGF0dGVybicsICd0b3AnKSwgYXJncyk6CisgICAgICAgICAgICBzZXRhdHRyKG9wdGlvbnMsIG5hbWUsIHZhbHVlKQorCisgICAgICAgICMgb25seSBzZXQgb3B0aW9ucyBmcm9tIHRoZSBwYXJzaW5nIGhlcmUKKyAgICAgICAgIyBpZiB0aGV5IHdlcmVuJ3Qgc2V0IGV4cGxpY2l0bHkgaW4gdGhlIGNvbnN0cnVjdG9yCisgICAgICAgIGlmIHNlbGYuZmFpbGZhc3QgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuZmFpbGZhc3QgPSBvcHRpb25zLmZhaWxmYXN0CisgICAgICAgIGlmIHNlbGYuY2F0Y2hicmVhayBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5jYXRjaGJyZWFrID0gb3B0aW9ucy5jYXRjaGJyZWFrCisgICAgICAgIGlmIHNlbGYuYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlciA9IG9wdGlvbnMuYnVmZmVyCisKKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlOgorICAgICAgICAgICAgc2VsZi52ZXJib3NpdHkgPSAyCisKKyAgICAgICAgc3RhcnRfZGlyID0gb3B0aW9ucy5zdGFydAorICAgICAgICBwYXR0ZXJuID0gb3B0aW9ucy5wYXR0ZXJuCisgICAgICAgIHRvcF9sZXZlbF9kaXIgPSBvcHRpb25zLnRvcAorCisgICAgICAgIGxvYWRlciA9IExvYWRlcigpCisgICAgICAgIHNlbGYudGVzdCA9IGxvYWRlci5kaXNjb3ZlcihzdGFydF9kaXIsIHBhdHRlcm4sIHRvcF9sZXZlbF9kaXIpCisKKyAgICBkZWYgcnVuVGVzdHMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2F0Y2hicmVhazoKKyAgICAgICAgICAgIGluc3RhbGxIYW5kbGVyKCkKKyAgICAgICAgaWYgc2VsZi50ZXN0UnVubmVyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRlc3RSdW5uZXIgPSBydW5uZXIuVGV4dFRlc3RSdW5uZXIKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLnRlc3RSdW5uZXIsICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZXN0UnVubmVyID0gc2VsZi50ZXN0UnVubmVyKHZlcmJvc2l0eT1zZWxmLnZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWxmYXN0PXNlbGYuZmFpbGZhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXI9c2VsZi5idWZmZXIpCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgICMgZGlkbid0IGFjY2VwdCB0aGUgdmVyYm9zaXR5LCBidWZmZXIgb3IgZmFpbGZhc3QgYXJndW1lbnRzCisgICAgICAgICAgICAgICAgdGVzdFJ1bm5lciA9IHNlbGYudGVzdFJ1bm5lcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGl0IGlzIGFzc3VtZWQgdG8gYmUgYSBUZXN0UnVubmVyIGluc3RhbmNlCisgICAgICAgICAgICB0ZXN0UnVubmVyID0gc2VsZi50ZXN0UnVubmVyCisgICAgICAgIHNlbGYucmVzdWx0ID0gdGVzdFJ1bm5lci5ydW4oc2VsZi50ZXN0KQorICAgICAgICBpZiBzZWxmLmV4aXQ6CisgICAgICAgICAgICBzeXMuZXhpdChub3Qgc2VsZi5yZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorCittYWluID0gVGVzdFByb2dyYW0KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L21haW4ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTE2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L21haW4ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvbWFpbi5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L21haW4ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NTE2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L21haW4ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcmVzdWx0LnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjMTdkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcmVzdWx0LnB5CkBAIC0wLDAgKzEsMTkzIEBACisiIiJUZXN0IHJlc3VsdCBvYmplY3QiIiIKKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgdHJhY2ViYWNrCisKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2Zyb20gLiBpbXBvcnQgdXRpbAorZnJvbSBmdW5jdG9vbHMgaW1wb3J0IHdyYXBzCisKK19fdW5pdHRlc3QgPSBUcnVlCisKK2RlZiBmYWlsZmFzdChtZXRob2QpOgorICAgIEB3cmFwcyhtZXRob2QpCisgICAgZGVmIGlubmVyKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgaWYgZ2V0YXR0cihzZWxmLCAnZmFpbGZhc3QnLCBGYWxzZSk6CisgICAgICAgICAgICBzZWxmLnN0b3AoKQorICAgICAgICByZXR1cm4gbWV0aG9kKHNlbGYsICphcmdzLCAqKmt3KQorICAgIHJldHVybiBpbm5lcgorCitTVERPVVRfTElORSA9ICdcblN0ZG91dDpcbiVzJworU1RERVJSX0xJTkUgPSAnXG5TdGRlcnI6XG4lcycKKworCitjbGFzcyBUZXN0UmVzdWx0KG9iamVjdCk6CisgICAgIiIiSG9sZGVyIGZvciB0ZXN0IHJlc3VsdCBpbmZvcm1hdGlvbi4KKworICAgIFRlc3QgcmVzdWx0cyBhcmUgYXV0b21hdGljYWxseSBtYW5hZ2VkIGJ5IHRoZSBUZXN0Q2FzZSBhbmQgVGVzdFN1aXRlCisgICAgY2xhc3NlcywgYW5kIGRvIG5vdCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgbWFuaXB1bGF0ZWQgYnkgd3JpdGVycyBvZiB0ZXN0cy4KKworICAgIEVhY2ggaW5zdGFuY2UgaG9sZHMgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXN0cyBydW4sIGFuZCBjb2xsZWN0aW9ucyBvZgorICAgIGZhaWx1cmVzIGFuZCBlcnJvcnMgdGhhdCBvY2N1cnJlZCBhbW9uZyB0aG9zZSB0ZXN0IHJ1bnMuIFRoZSBjb2xsZWN0aW9ucworICAgIGNvbnRhaW4gdHVwbGVzIG9mICh0ZXN0Y2FzZSwgZXhjZXB0aW9uaW5mbyksIHdoZXJlIGV4Y2VwdGlvbmluZm8gaXMgdGhlCisgICAgZm9ybWF0dGVkIHRyYWNlYmFjayBvZiB0aGUgZXJyb3IgdGhhdCBvY2N1cnJlZC4KKyAgICAiIiIKKyAgICBfcHJldmlvdXNUZXN0Q2xhc3MgPSBOb25lCisgICAgX3Rlc3RSdW5FbnRlcmVkID0gRmFsc2UKKyAgICBfbW9kdWxlU2V0VXBGYWlsZWQgPSBGYWxzZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW09Tm9uZSwgZGVzY3JpcHRpb25zPU5vbmUsIHZlcmJvc2l0eT1Ob25lKToKKyAgICAgICAgc2VsZi5mYWlsZmFzdCA9IEZhbHNlCisgICAgICAgIHNlbGYuZmFpbHVyZXMgPSBbXQorICAgICAgICBzZWxmLmVycm9ycyA9IFtdCisgICAgICAgIHNlbGYudGVzdHNSdW4gPSAwCisgICAgICAgIHNlbGYuc2tpcHBlZCA9IFtdCisgICAgICAgIHNlbGYuZXhwZWN0ZWRGYWlsdXJlcyA9IFtdCisgICAgICAgIHNlbGYudW5leHBlY3RlZFN1Y2Nlc3NlcyA9IFtdCisgICAgICAgIHNlbGYuc2hvdWxkU3RvcCA9IEZhbHNlCisgICAgICAgIHNlbGYuYnVmZmVyID0gRmFsc2UKKyAgICAgICAgc2VsZi5fc3Rkb3V0X2J1ZmZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5fc3RkZXJyX2J1ZmZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5fb3JpZ2luYWxfc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICBzZWxmLl9vcmlnaW5hbF9zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgIHNlbGYuX21pcnJvck91dHB1dCA9IEZhbHNlCisKKyAgICBkZWYgcHJpbnRFcnJvcnMoc2VsZik6CisgICAgICAgICJDYWxsZWQgYnkgVGVzdFJ1bm5lciBhZnRlciB0ZXN0IHJ1biIKKworICAgIGRlZiBzdGFydFRlc3Qoc2VsZiwgdGVzdCk6CisgICAgICAgICJDYWxsZWQgd2hlbiB0aGUgZ2l2ZW4gdGVzdCBpcyBhYm91dCB0byBiZSBydW4iCisgICAgICAgIHNlbGYudGVzdHNSdW4gKz0gMQorICAgICAgICBzZWxmLl9taXJyb3JPdXRwdXQgPSBGYWxzZQorICAgICAgICBzZWxmLl9zZXR1cFN0ZG91dCgpCisKKyAgICBkZWYgX3NldHVwU3Rkb3V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuX3N0ZGVycl9idWZmZXIgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9zdGRlcnJfYnVmZmVyID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgICAgIHNlbGYuX3N0ZG91dF9idWZmZXIgPSBTdHJpbmdJTygpCisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5fc3Rkb3V0X2J1ZmZlcgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuX3N0ZGVycl9idWZmZXIKKworICAgIGRlZiBzdGFydFRlc3RSdW4oc2VsZik6CisgICAgICAgICIiIkNhbGxlZCBvbmNlIGJlZm9yZSBhbnkgdGVzdHMgYXJlIGV4ZWN1dGVkLgorCisgICAgICAgIFNlZSBzdGFydFRlc3QgZm9yIGEgbWV0aG9kIGNhbGxlZCBiZWZvcmUgZWFjaCB0ZXN0LgorICAgICAgICAiIiIKKworICAgIGRlZiBzdG9wVGVzdChzZWxmLCB0ZXN0KToKKyAgICAgICAgIiIiQ2FsbGVkIHdoZW4gdGhlIGdpdmVuIHRlc3QgaGFzIGJlZW4gcnVuIiIiCisgICAgICAgIHNlbGYuX3Jlc3RvcmVTdGRvdXQoKQorICAgICAgICBzZWxmLl9taXJyb3JPdXRwdXQgPSBGYWxzZQorCisgICAgZGVmIF9yZXN0b3JlU3Rkb3V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuX21pcnJvck91dHB1dDoKKyAgICAgICAgICAgICAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKKyAgICAgICAgICAgICAgICBlcnJvciA9IHN5cy5zdGRlcnIuZ2V0dmFsdWUoKQorICAgICAgICAgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG91dHB1dC5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSAnXG4nCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX29yaWdpbmFsX3N0ZG91dC53cml0ZShTVERPVVRfTElORSAlIG91dHB1dCkKKyAgICAgICAgICAgICAgICBpZiBlcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IGVycm9yLmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gJ1xuJworICAgICAgICAgICAgICAgICAgICBzZWxmLl9vcmlnaW5hbF9zdGRlcnIud3JpdGUoU1RERVJSX0xJTkUgJSBlcnJvcikKKworICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHNlbGYuX29yaWdpbmFsX3N0ZG91dAorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuX29yaWdpbmFsX3N0ZGVycgorICAgICAgICAgICAgc2VsZi5fc3Rkb3V0X2J1ZmZlci5zZWVrKDApCisgICAgICAgICAgICBzZWxmLl9zdGRvdXRfYnVmZmVyLnRydW5jYXRlKCkKKyAgICAgICAgICAgIHNlbGYuX3N0ZGVycl9idWZmZXIuc2VlaygwKQorICAgICAgICAgICAgc2VsZi5fc3RkZXJyX2J1ZmZlci50cnVuY2F0ZSgpCisKKyAgICBkZWYgc3RvcFRlc3RSdW4oc2VsZik6CisgICAgICAgICIiIkNhbGxlZCBvbmNlIGFmdGVyIGFsbCB0ZXN0cyBhcmUgZXhlY3V0ZWQuCisKKyAgICAgICAgU2VlIHN0b3BUZXN0IGZvciBhIG1ldGhvZCBjYWxsZWQgYWZ0ZXIgZWFjaCB0ZXN0LgorICAgICAgICAiIiIKKworICAgIEBmYWlsZmFzdAorICAgIGRlZiBhZGRFcnJvcihzZWxmLCB0ZXN0LCBlcnIpOgorICAgICAgICAiIiJDYWxsZWQgd2hlbiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuICdlcnInIGlzIGEgdHVwbGUgb2YgdmFsdWVzIGFzCisgICAgICAgIHJldHVybmVkIGJ5IHN5cy5leGNfaW5mbygpLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5lcnJvcnMuYXBwZW5kKCh0ZXN0LCBzZWxmLl9leGNfaW5mb190b19zdHJpbmcoZXJyLCB0ZXN0KSkpCisgICAgICAgIHNlbGYuX21pcnJvck91dHB1dCA9IFRydWUKKworICAgIEBmYWlsZmFzdAorICAgIGRlZiBhZGRGYWlsdXJlKHNlbGYsIHRlc3QsIGVycik6CisgICAgICAgICIiIkNhbGxlZCB3aGVuIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4gJ2VycicgaXMgYSB0dXBsZSBvZiB2YWx1ZXMgYXMKKyAgICAgICAgcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCkuIiIiCisgICAgICAgIHNlbGYuZmFpbHVyZXMuYXBwZW5kKCh0ZXN0LCBzZWxmLl9leGNfaW5mb190b19zdHJpbmcoZXJyLCB0ZXN0KSkpCisgICAgICAgIHNlbGYuX21pcnJvck91dHB1dCA9IFRydWUKKworICAgIGRlZiBhZGRTdWNjZXNzKHNlbGYsIHRlc3QpOgorICAgICAgICAiQ2FsbGVkIHdoZW4gYSB0ZXN0IGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IgorICAgICAgICBwYXNzCisKKyAgICBkZWYgYWRkU2tpcChzZWxmLCB0ZXN0LCByZWFzb24pOgorICAgICAgICAiIiJDYWxsZWQgd2hlbiBhIHRlc3QgaXMgc2tpcHBlZC4iIiIKKyAgICAgICAgc2VsZi5za2lwcGVkLmFwcGVuZCgodGVzdCwgcmVhc29uKSkKKworICAgIGRlZiBhZGRFeHBlY3RlZEZhaWx1cmUoc2VsZiwgdGVzdCwgZXJyKToKKyAgICAgICAgIiIiQ2FsbGVkIHdoZW4gYW4gZXhwZWN0ZWQgZmFpbHVyZS9lcnJvciBvY2N1cmVkLiIiIgorICAgICAgICBzZWxmLmV4cGVjdGVkRmFpbHVyZXMuYXBwZW5kKAorICAgICAgICAgICAgKHRlc3QsIHNlbGYuX2V4Y19pbmZvX3RvX3N0cmluZyhlcnIsIHRlc3QpKSkKKworICAgIEBmYWlsZmFzdAorICAgIGRlZiBhZGRVbmV4cGVjdGVkU3VjY2VzcyhzZWxmLCB0ZXN0KToKKyAgICAgICAgIiIiQ2FsbGVkIHdoZW4gYSB0ZXN0IHdhcyBleHBlY3RlZCB0byBmYWlsLCBidXQgc3VjY2VlZC4iIiIKKyAgICAgICAgc2VsZi51bmV4cGVjdGVkU3VjY2Vzc2VzLmFwcGVuZCh0ZXN0KQorCisgICAgZGVmIHdhc1N1Y2Nlc3NmdWwoc2VsZik6CisgICAgICAgICJUZWxscyB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlc3VsdCB3YXMgYSBzdWNjZXNzIgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZmFpbHVyZXMpID09IGxlbihzZWxmLmVycm9ycykgPT0gMAorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgICJJbmRpY2F0ZXMgdGhhdCB0aGUgdGVzdHMgc2hvdWxkIGJlIGFib3J0ZWQiCisgICAgICAgIHNlbGYuc2hvdWxkU3RvcCA9IFRydWUKKworICAgIGRlZiBfZXhjX2luZm9fdG9fc3RyaW5nKHNlbGYsIGVyciwgdGVzdCk6CisgICAgICAgICIiIkNvbnZlcnRzIGEgc3lzLmV4Y19pbmZvKCktc3R5bGUgdHVwbGUgb2YgdmFsdWVzIGludG8gYSBzdHJpbmcuIiIiCisgICAgICAgIGV4Y3R5cGUsIHZhbHVlLCB0YiA9IGVycgorICAgICAgICAjIFNraXAgdGVzdCBydW5uZXIgdHJhY2ViYWNrIGxldmVscworICAgICAgICB3aGlsZSB0YiBhbmQgc2VsZi5faXNfcmVsZXZhbnRfdGJfbGV2ZWwodGIpOgorICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisKKyAgICAgICAgaWYgZXhjdHlwZSBpcyB0ZXN0LmZhaWx1cmVFeGNlcHRpb246CisgICAgICAgICAgICAjIFNraXAgYXNzZXJ0KigpIHRyYWNlYmFjayBsZXZlbHMKKyAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYuX2NvdW50X3JlbGV2YW50X3RiX2xldmVscyh0YikKKyAgICAgICAgICAgIG1zZ0xpbmVzID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb24oZXhjdHlwZSwgdmFsdWUsIHRiLCBsZW5ndGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtc2dMaW5lcyA9IHRyYWNlYmFjay5mb3JtYXRfZXhjZXB0aW9uKGV4Y3R5cGUsIHZhbHVlLCB0YikKKworICAgICAgICBpZiBzZWxmLmJ1ZmZlcjoKKyAgICAgICAgICAgIG91dHB1dCA9IHN5cy5zdGRvdXQuZ2V0dmFsdWUoKQorICAgICAgICAgICAgZXJyb3IgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkKKyAgICAgICAgICAgIGlmIG91dHB1dDoKKyAgICAgICAgICAgICAgICBpZiBub3Qgb3V0cHV0LmVuZHN3aXRoKCdcbicpOgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgKz0gJ1xuJworICAgICAgICAgICAgICAgIG1zZ0xpbmVzLmFwcGVuZChTVERPVVRfTElORSAlIG91dHB1dCkKKyAgICAgICAgICAgIGlmIGVycm9yOgorICAgICAgICAgICAgICAgIGlmIG5vdCBlcnJvci5lbmRzd2l0aCgnXG4nKToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgKz0gJ1xuJworICAgICAgICAgICAgICAgIG1zZ0xpbmVzLmFwcGVuZChTVERFUlJfTElORSAlIGVycm9yKQorICAgICAgICByZXR1cm4gJycuam9pbihtc2dMaW5lcykKKworCisgICAgZGVmIF9pc19yZWxldmFudF90Yl9sZXZlbChzZWxmLCB0Yik6CisgICAgICAgIHJldHVybiAnX191bml0dGVzdCcgaW4gdGIudGJfZnJhbWUuZl9nbG9iYWxzCisKKyAgICBkZWYgX2NvdW50X3JlbGV2YW50X3RiX2xldmVscyhzZWxmLCB0Yik6CisgICAgICAgIGxlbmd0aCA9IDAKKyAgICAgICAgd2hpbGUgdGIgYW5kIG5vdCBzZWxmLl9pc19yZWxldmFudF90Yl9sZXZlbCh0Yik6CisgICAgICAgICAgICBsZW5ndGggKz0gMQorICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgICAgIHJldHVybiBsZW5ndGgKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgiPCVzIHJ1bj0laSBlcnJvcnM9JWkgZmFpbHVyZXM9JWk+IiAlCisgICAgICAgICAgICAgICAodXRpbC5zdHJjbGFzcyhzZWxmLl9fY2xhc3NfXyksIHNlbGYudGVzdHNSdW4sIGxlbihzZWxmLmVycm9ycyksCisgICAgICAgICAgICAgICAgbGVuKHNlbGYuZmFpbHVyZXMpKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcmVzdWx0LnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcmVzdWx0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmFjZTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcmVzdWx0LnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcmVzdWx0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmFjZTliCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9yZXN1bHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9ydW5uZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYzMmZlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5CkBAIC0wLDAgKzEsMTk2IEBACisiIiJSdW5uaW5nIHRlc3RzIiIiCisKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCisKK2Zyb20gLiBpbXBvcnQgcmVzdWx0Citmcm9tIC5zaWduYWxzIGltcG9ydCByZWdpc3RlclJlc3VsdAorCitfX3VuaXR0ZXN0ID0gVHJ1ZQorCisKK2NsYXNzIF9Xcml0ZWxuRGVjb3JhdG9yKG9iamVjdCk6CisgICAgIiIiVXNlZCB0byBkZWNvcmF0ZSBmaWxlLWxpa2Ugb2JqZWN0cyB3aXRoIGEgaGFuZHkgJ3dyaXRlbG4nIG1ldGhvZCIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLHN0cmVhbSk6CisgICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGF0dHIgaW4gKCdzdHJlYW0nLCAnX19nZXRzdGF0ZV9fJyk6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcihhdHRyKQorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLnN0cmVhbSxhdHRyKQorCisgICAgZGVmIHdyaXRlbG4oc2VsZiwgYXJnPU5vbmUpOgorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBzZWxmLndyaXRlKGFyZykKKyAgICAgICAgc2VsZi53cml0ZSgnXG4nKSAjIHRleHQtbW9kZSBzdHJlYW1zIHRyYW5zbGF0ZSB0byBcclxuIGlmIG5lZWRlZAorCisKK2NsYXNzIFRleHRUZXN0UmVzdWx0KHJlc3VsdC5UZXN0UmVzdWx0KToKKyAgICAiIiJBIHRlc3QgcmVzdWx0IGNsYXNzIHRoYXQgY2FuIHByaW50IGZvcm1hdHRlZCB0ZXh0IHJlc3VsdHMgdG8gYSBzdHJlYW0uCisKKyAgICBVc2VkIGJ5IFRleHRUZXN0UnVubmVyLgorICAgICIiIgorICAgIHNlcGFyYXRvcjEgPSAnPScgKiA3MAorICAgIHNlcGFyYXRvcjIgPSAnLScgKiA3MAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZGVzY3JpcHRpb25zLCB2ZXJib3NpdHkpOgorICAgICAgICBzdXBlcihUZXh0VGVzdFJlc3VsdCwgc2VsZikuX19pbml0X18oc3RyZWFtLCBkZXNjcmlwdGlvbnMsIHZlcmJvc2l0eSkKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBzdHJlYW0KKyAgICAgICAgc2VsZi5zaG93QWxsID0gdmVyYm9zaXR5ID4gMQorICAgICAgICBzZWxmLmRvdHMgPSB2ZXJib3NpdHkgPT0gMQorICAgICAgICBzZWxmLmRlc2NyaXB0aW9ucyA9IGRlc2NyaXB0aW9ucworCisgICAgZGVmIGdldERlc2NyaXB0aW9uKHNlbGYsIHRlc3QpOgorICAgICAgICBkb2NfZmlyc3RfbGluZSA9IHRlc3Quc2hvcnREZXNjcmlwdGlvbigpCisgICAgICAgIGlmIHNlbGYuZGVzY3JpcHRpb25zIGFuZCBkb2NfZmlyc3RfbGluZToKKyAgICAgICAgICAgIHJldHVybiAnXG4nLmpvaW4oKHN0cih0ZXN0KSwgZG9jX2ZpcnN0X2xpbmUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHN0cih0ZXN0KQorCisgICAgZGVmIHN0YXJ0VGVzdChzZWxmLCB0ZXN0KToKKyAgICAgICAgc3VwZXIoVGV4dFRlc3RSZXN1bHQsIHNlbGYpLnN0YXJ0VGVzdCh0ZXN0KQorICAgICAgICBpZiBzZWxmLnNob3dBbGw6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShzZWxmLmdldERlc2NyaXB0aW9uKHRlc3QpKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIiAuLi4gIikKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLmZsdXNoKCkKKworICAgIGRlZiBhZGRTdWNjZXNzKHNlbGYsIHRlc3QpOgorICAgICAgICBzdXBlcihUZXh0VGVzdFJlc3VsdCwgc2VsZikuYWRkU3VjY2Vzcyh0ZXN0KQorICAgICAgICBpZiBzZWxmLnNob3dBbGw6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJvayIpCisgICAgICAgIGVsaWYgc2VsZi5kb3RzOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoJy4nKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorCisgICAgZGVmIGFkZEVycm9yKHNlbGYsIHRlc3QsIGVycik6CisgICAgICAgIHN1cGVyKFRleHRUZXN0UmVzdWx0LCBzZWxmKS5hZGRFcnJvcih0ZXN0LCBlcnIpCisgICAgICAgIGlmIHNlbGYuc2hvd0FsbDoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIkVSUk9SIikKKyAgICAgICAgZWxpZiBzZWxmLmRvdHM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgnRScpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCisKKyAgICBkZWYgYWRkRmFpbHVyZShzZWxmLCB0ZXN0LCBlcnIpOgorICAgICAgICBzdXBlcihUZXh0VGVzdFJlc3VsdCwgc2VsZikuYWRkRmFpbHVyZSh0ZXN0LCBlcnIpCisgICAgICAgIGlmIHNlbGYuc2hvd0FsbDoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIkZBSUwiKQorICAgICAgICBlbGlmIHNlbGYuZG90czoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCdGJykKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLmZsdXNoKCkKKworICAgIGRlZiBhZGRTa2lwKHNlbGYsIHRlc3QsIHJlYXNvbik6CisgICAgICAgIHN1cGVyKFRleHRUZXN0UmVzdWx0LCBzZWxmKS5hZGRTa2lwKHRlc3QsIHJlYXNvbikKKyAgICAgICAgaWYgc2VsZi5zaG93QWxsOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigic2tpcHBlZCB7MCFyfSIuZm9ybWF0KHJlYXNvbikpCisgICAgICAgIGVsaWYgc2VsZi5kb3RzOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoInMiKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorCisgICAgZGVmIGFkZEV4cGVjdGVkRmFpbHVyZShzZWxmLCB0ZXN0LCBlcnIpOgorICAgICAgICBzdXBlcihUZXh0VGVzdFJlc3VsdCwgc2VsZikuYWRkRXhwZWN0ZWRGYWlsdXJlKHRlc3QsIGVycikKKyAgICAgICAgaWYgc2VsZi5zaG93QWxsOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiZXhwZWN0ZWQgZmFpbHVyZSIpCisgICAgICAgIGVsaWYgc2VsZi5kb3RzOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIngiKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0uZmx1c2goKQorCisgICAgZGVmIGFkZFVuZXhwZWN0ZWRTdWNjZXNzKHNlbGYsIHRlc3QpOgorICAgICAgICBzdXBlcihUZXh0VGVzdFJlc3VsdCwgc2VsZikuYWRkVW5leHBlY3RlZFN1Y2Nlc3ModGVzdCkKKyAgICAgICAgaWYgc2VsZi5zaG93QWxsOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigidW5leHBlY3RlZCBzdWNjZXNzIikKKyAgICAgICAgZWxpZiBzZWxmLmRvdHM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgidSIpCisgICAgICAgICAgICBzZWxmLnN0cmVhbS5mbHVzaCgpCisKKyAgICBkZWYgcHJpbnRFcnJvcnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZG90cyBvciBzZWxmLnNob3dBbGw6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCkKKyAgICAgICAgc2VsZi5wcmludEVycm9yTGlzdCgnRVJST1InLCBzZWxmLmVycm9ycykKKyAgICAgICAgc2VsZi5wcmludEVycm9yTGlzdCgnRkFJTCcsIHNlbGYuZmFpbHVyZXMpCisKKyAgICBkZWYgcHJpbnRFcnJvckxpc3Qoc2VsZiwgZmxhdm91ciwgZXJyb3JzKToKKyAgICAgICAgZm9yIHRlc3QsIGVyciBpbiBlcnJvcnM6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKHNlbGYuc2VwYXJhdG9yMSkKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIiVzOiAlcyIgJSAoZmxhdm91cixzZWxmLmdldERlc2NyaXB0aW9uKHRlc3QpKSkKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oc2VsZi5zZXBhcmF0b3IyKQorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigiJXMiICUgZXJyKQorCisKK2NsYXNzIFRleHRUZXN0UnVubmVyKG9iamVjdCk6CisgICAgIiIiQSB0ZXN0IHJ1bm5lciBjbGFzcyB0aGF0IGRpc3BsYXlzIHJlc3VsdHMgaW4gdGV4dHVhbCBmb3JtLgorCisgICAgSXQgcHJpbnRzIG91dCB0aGUgbmFtZXMgb2YgdGVzdHMgYXMgdGhleSBhcmUgcnVuLCBlcnJvcnMgYXMgdGhleQorICAgIG9jY3VyLCBhbmQgYSBzdW1tYXJ5IG9mIHRoZSByZXN1bHRzIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QgcnVuLgorICAgICIiIgorICAgIHJlc3VsdGNsYXNzID0gVGV4dFRlc3RSZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW09c3lzLnN0ZGVyciwgZGVzY3JpcHRpb25zPVRydWUsIHZlcmJvc2l0eT0xLAorICAgICAgICAgICAgICAgICBmYWlsZmFzdD1GYWxzZSwgYnVmZmVyPUZhbHNlLCByZXN1bHRjbGFzcz1Ob25lKToKKyAgICAgICAgc2VsZi5zdHJlYW0gPSBfV3JpdGVsbkRlY29yYXRvcihzdHJlYW0pCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb25zID0gZGVzY3JpcHRpb25zCisgICAgICAgIHNlbGYudmVyYm9zaXR5ID0gdmVyYm9zaXR5CisgICAgICAgIHNlbGYuZmFpbGZhc3QgPSBmYWlsZmFzdAorICAgICAgICBzZWxmLmJ1ZmZlciA9IGJ1ZmZlcgorICAgICAgICBpZiByZXN1bHRjbGFzcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0Y2xhc3MgPSByZXN1bHRjbGFzcworCisgICAgZGVmIF9tYWtlUmVzdWx0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5yZXN1bHRjbGFzcyhzZWxmLnN0cmVhbSwgc2VsZi5kZXNjcmlwdGlvbnMsIHNlbGYudmVyYm9zaXR5KQorCisgICAgZGVmIHJ1bihzZWxmLCB0ZXN0KToKKyAgICAgICAgIlJ1biB0aGUgZ2l2ZW4gdGVzdCBjYXNlIG9yIHRlc3Qgc3VpdGUuIgorICAgICAgICByZXN1bHQgPSBzZWxmLl9tYWtlUmVzdWx0KCkKKyAgICAgICAgcmVnaXN0ZXJSZXN1bHQocmVzdWx0KQorICAgICAgICByZXN1bHQuZmFpbGZhc3QgPSBzZWxmLmZhaWxmYXN0CisgICAgICAgIHJlc3VsdC5idWZmZXIgPSBzZWxmLmJ1ZmZlcgorICAgICAgICBzdGFydFRpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICBzdGFydFRlc3RSdW4gPSBnZXRhdHRyKHJlc3VsdCwgJ3N0YXJ0VGVzdFJ1bicsIE5vbmUpCisgICAgICAgIGlmIHN0YXJ0VGVzdFJ1biBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHN0YXJ0VGVzdFJ1bigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3QocmVzdWx0KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3RvcFRlc3RSdW4gPSBnZXRhdHRyKHJlc3VsdCwgJ3N0b3BUZXN0UnVuJywgTm9uZSkKKyAgICAgICAgICAgIGlmIHN0b3BUZXN0UnVuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHN0b3BUZXN0UnVuKCkKKyAgICAgICAgc3RvcFRpbWUgPSB0aW1lLnRpbWUoKQorICAgICAgICB0aW1lVGFrZW4gPSBzdG9wVGltZSAtIHN0YXJ0VGltZQorICAgICAgICByZXN1bHQucHJpbnRFcnJvcnMoKQorICAgICAgICBpZiBoYXNhdHRyKHJlc3VsdCwgJ3NlcGFyYXRvcjInKToKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4ocmVzdWx0LnNlcGFyYXRvcjIpCisgICAgICAgIHJ1biA9IHJlc3VsdC50ZXN0c1J1bgorICAgICAgICBzZWxmLnN0cmVhbS53cml0ZWxuKCJSYW4gJWQgdGVzdCVzIGluICUuM2ZzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJ1biwgcnVuICE9IDEgYW5kICJzIiBvciAiIiwgdGltZVRha2VuKSkKKyAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGVsbigpCisKKyAgICAgICAgZXhwZWN0ZWRGYWlscyA9IHVuZXhwZWN0ZWRTdWNjZXNzZXMgPSBza2lwcGVkID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHRzID0gbWFwKGxlbiwgKHJlc3VsdC5leHBlY3RlZEZhaWx1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQudW5leHBlY3RlZFN1Y2Nlc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNraXBwZWQpKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBleHBlY3RlZEZhaWxzLCB1bmV4cGVjdGVkU3VjY2Vzc2VzLCBza2lwcGVkID0gcmVzdWx0cworCisgICAgICAgIGluZm9zID0gW10KKyAgICAgICAgaWYgbm90IHJlc3VsdC53YXNTdWNjZXNzZnVsKCk6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiRkFJTEVEIikKKyAgICAgICAgICAgIGZhaWxlZCwgZXJyb3JlZCA9IG1hcChsZW4sIChyZXN1bHQuZmFpbHVyZXMsIHJlc3VsdC5lcnJvcnMpKQorICAgICAgICAgICAgaWYgZmFpbGVkOgorICAgICAgICAgICAgICAgIGluZm9zLmFwcGVuZCgiZmFpbHVyZXM9JWQiICUgZmFpbGVkKQorICAgICAgICAgICAgaWYgZXJyb3JlZDoKKyAgICAgICAgICAgICAgICBpbmZvcy5hcHBlbmQoImVycm9ycz0lZCIgJSBlcnJvcmVkKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIk9LIikKKyAgICAgICAgaWYgc2tpcHBlZDoKKyAgICAgICAgICAgIGluZm9zLmFwcGVuZCgic2tpcHBlZD0lZCIgJSBza2lwcGVkKQorICAgICAgICBpZiBleHBlY3RlZEZhaWxzOgorICAgICAgICAgICAgaW5mb3MuYXBwZW5kKCJleHBlY3RlZCBmYWlsdXJlcz0lZCIgJSBleHBlY3RlZEZhaWxzKQorICAgICAgICBpZiB1bmV4cGVjdGVkU3VjY2Vzc2VzOgorICAgICAgICAgICAgaW5mb3MuYXBwZW5kKCJ1bmV4cGVjdGVkIHN1Y2Nlc3Nlcz0lZCIgJSB1bmV4cGVjdGVkU3VjY2Vzc2VzKQorICAgICAgICBpZiBpbmZvczoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlbG4oIiAoJXMpIiAlICgiLCAiLmpvaW4oaW5mb3MpLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiXG4iKQorICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3J1bm5lci5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3J1bm5lci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0M2JlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3J1bm5lci5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3J1bm5lci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA0M2JlMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvcnVubmVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3NpZ25hbHMucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3NpZ25hbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNWZjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weQpAQCAtMCwwICsxLDcxIEBACitpbXBvcnQgc2lnbmFsCitpbXBvcnQgd2Vha3JlZgorCitmcm9tIGZ1bmN0b29scyBpbXBvcnQgd3JhcHMKKworX191bml0dGVzdCA9IFRydWUKKworCitjbGFzcyBfSW50ZXJydXB0SGFuZGxlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWZhdWx0X2hhbmRsZXIpOgorICAgICAgICBzZWxmLmNhbGxlZCA9IEZhbHNlCisgICAgICAgIHNlbGYub3JpZ2luYWxfaGFuZGxlciA9IGRlZmF1bHRfaGFuZGxlcgorICAgICAgICBpZiBpc2luc3RhbmNlKGRlZmF1bHRfaGFuZGxlciwgaW50KToKKyAgICAgICAgICAgIGlmIGRlZmF1bHRfaGFuZGxlciA9PSBzaWduYWwuU0lHX0RGTDoKKyAgICAgICAgICAgICAgICAjIFByZXRlbmQgaXQncyBzaWduYWwuZGVmYXVsdF9pbnRfaGFuZGxlciBpbnN0ZWFkLgorICAgICAgICAgICAgICAgIGRlZmF1bHRfaGFuZGxlciA9IHNpZ25hbC5kZWZhdWx0X2ludF9oYW5kbGVyCisgICAgICAgICAgICBlbGlmIGRlZmF1bHRfaGFuZGxlciA9PSBzaWduYWwuU0lHX0lHTjoKKyAgICAgICAgICAgICAgICAjIE5vdCBxdWl0ZSB0aGUgc2FtZSB0aGluZyBhcyBTSUdfSUdOLCBidXQgdGhlIGNsb3Nlc3Qgd2UKKyAgICAgICAgICAgICAgICAjIGNhbiBtYWtlIGl0OiBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIGRlZiBkZWZhdWx0X2hhbmRsZXIodW51c2VkX3NpZ251bSwgdW51c2VkX2ZyYW1lKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoImV4cGVjdGVkIFNJR0lOVCBzaWduYWwgaGFuZGxlciB0byBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaWduYWwuU0lHX0lHTiwgc2lnbmFsLlNJR19ERkwsIG9yIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2FsbGFibGUgb2JqZWN0IikKKyAgICAgICAgc2VsZi5kZWZhdWx0X2hhbmRsZXIgPSBkZWZhdWx0X2hhbmRsZXIKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzaWdudW0sIGZyYW1lKToKKyAgICAgICAgaW5zdGFsbGVkX2hhbmRsZXIgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgIGlmIGluc3RhbGxlZF9oYW5kbGVyIGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgIyBpZiB3ZSBhcmVuJ3QgdGhlIGluc3RhbGxlZCBoYW5kbGVyLCB0aGVuIGRlbGVnYXRlIGltbWVkaWF0ZWx5CisgICAgICAgICAgICAjIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIKKyAgICAgICAgICAgIHNlbGYuZGVmYXVsdF9oYW5kbGVyKHNpZ251bSwgZnJhbWUpCisKKyAgICAgICAgaWYgc2VsZi5jYWxsZWQ6CisgICAgICAgICAgICBzZWxmLmRlZmF1bHRfaGFuZGxlcihzaWdudW0sIGZyYW1lKQorICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKyAgICAgICAgZm9yIHJlc3VsdCBpbiBfcmVzdWx0cy5rZXlzKCk6CisgICAgICAgICAgICByZXN1bHQuc3RvcCgpCisKK19yZXN1bHRzID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSgpCitkZWYgcmVnaXN0ZXJSZXN1bHQocmVzdWx0KToKKyAgICBfcmVzdWx0c1tyZXN1bHRdID0gMQorCitkZWYgcmVtb3ZlUmVzdWx0KHJlc3VsdCk6CisgICAgcmV0dXJuIGJvb2woX3Jlc3VsdHMucG9wKHJlc3VsdCwgTm9uZSkpCisKK19pbnRlcnJ1cHRfaGFuZGxlciA9IE5vbmUKK2RlZiBpbnN0YWxsSGFuZGxlcigpOgorICAgIGdsb2JhbCBfaW50ZXJydXB0X2hhbmRsZXIKKyAgICBpZiBfaW50ZXJydXB0X2hhbmRsZXIgaXMgTm9uZToKKyAgICAgICAgZGVmYXVsdF9oYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICBfaW50ZXJydXB0X2hhbmRsZXIgPSBfSW50ZXJydXB0SGFuZGxlcihkZWZhdWx0X2hhbmRsZXIpCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgX2ludGVycnVwdF9oYW5kbGVyKQorCisKK2RlZiByZW1vdmVIYW5kbGVyKG1ldGhvZD1Ob25lKToKKyAgICBpZiBtZXRob2QgaXMgbm90IE5vbmU6CisgICAgICAgIEB3cmFwcyhtZXRob2QpCisgICAgICAgIGRlZiBpbm5lcigqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgaW5pdGlhbCA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgICAgIHJlbW92ZUhhbmRsZXIoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2QoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdJTlQsIGluaXRpYWwpCisgICAgICAgIHJldHVybiBpbm5lcgorCisgICAgZ2xvYmFsIF9pbnRlcnJ1cHRfaGFuZGxlcgorICAgIGlmIF9pbnRlcnJ1cHRfaGFuZGxlciBpcyBub3QgTm9uZToKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBfaW50ZXJydXB0X2hhbmRsZXIub3JpZ2luYWxfaGFuZGxlcikKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3NpZ25hbHMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTk4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3NpZ25hbHMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc2lnbmFscy5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3NpZ25hbHMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTk4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3NpZ25hbHMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc3VpdGUucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3N1aXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2FmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3N1aXRlLnB5CkBAIC0wLDAgKzEsMzAzIEBACisiIiJUZXN0U3VpdGUiIiIKKworaW1wb3J0IHN5cworCitmcm9tIC4gaW1wb3J0IGNhc2UKK2Zyb20gLiBpbXBvcnQgdXRpbAorCitfX3VuaXR0ZXN0ID0gVHJ1ZQorCisKK2RlZiBfY2FsbF9pZl9leGlzdHMocGFyZW50LCBhdHRyKToKKyAgICBmdW5jID0gZ2V0YXR0cihwYXJlbnQsIGF0dHIsIGxhbWJkYTogTm9uZSkKKyAgICBmdW5jKCkKKworCitjbGFzcyBCYXNlVGVzdFN1aXRlKG9iamVjdCk6CisgICAgIiIiQSBzaW1wbGUgdGVzdCBzdWl0ZSB0aGF0IGRvZXNuJ3QgcHJvdmlkZSBjbGFzcyBvciBtb2R1bGUgc2hhcmVkIGZpeHR1cmVzLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0cz0oKSk6CisgICAgICAgIHNlbGYuX3Rlc3RzID0gW10KKyAgICAgICAgc2VsZi5hZGRUZXN0cyh0ZXN0cykKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8JXMgdGVzdHM9JXM+IiAlICh1dGlsLnN0cmNsYXNzKHNlbGYuX19jbGFzc19fKSwgbGlzdChzZWxmKSkKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgorICAgICAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYpID09IGxpc3Qob3RoZXIpCisKKyAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCisKKyAgICAjIENhbid0IGd1YXJhbnRlZSBoYXNoIGludmFyaWFudCwgc28gZmxhZyBhcyB1bmhhc2hhYmxlCisgICAgX19oYXNoX18gPSBOb25lCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBpdGVyKHNlbGYuX3Rlc3RzKQorCisgICAgZGVmIGNvdW50VGVzdENhc2VzKHNlbGYpOgorICAgICAgICBjYXNlcyA9IDAKKyAgICAgICAgZm9yIHRlc3QgaW4gc2VsZjoKKyAgICAgICAgICAgIGNhc2VzICs9IHRlc3QuY291bnRUZXN0Q2FzZXMoKQorICAgICAgICByZXR1cm4gY2FzZXMKKworICAgIGRlZiBhZGRUZXN0KHNlbGYsIHRlc3QpOgorICAgICAgICAjIHNhbml0eSBjaGVja3MKKyAgICAgICAgaWYgbm90IGhhc2F0dHIodGVzdCwgJ19fY2FsbF9fJyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInt9IGlzIG5vdCBjYWxsYWJsZSIuZm9ybWF0KHJlcHIodGVzdCkpKQorICAgICAgICBpZiBpc2luc3RhbmNlKHRlc3QsIHR5cGUpIGFuZCBpc3N1YmNsYXNzKHRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhc2UuVGVzdENhc2UsIFRlc3RTdWl0ZSkpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJUZXN0Q2FzZXMgYW5kIFRlc3RTdWl0ZXMgbXVzdCBiZSBpbnN0YW50aWF0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmUgcGFzc2luZyB0aGVtIHRvIGFkZFRlc3QoKSIpCisgICAgICAgIHNlbGYuX3Rlc3RzLmFwcGVuZCh0ZXN0KQorCisgICAgZGVmIGFkZFRlc3RzKHNlbGYsIHRlc3RzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0cywgYmFzZXN0cmluZyk6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoInRlc3RzIG11c3QgYmUgYW4gaXRlcmFibGUgb2YgdGVzdHMsIG5vdCBhIHN0cmluZyIpCisgICAgICAgIGZvciB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgc2VsZi5hZGRUZXN0KHRlc3QpCisKKyAgICBkZWYgcnVuKHNlbGYsIHJlc3VsdCk6CisgICAgICAgIGZvciB0ZXN0IGluIHNlbGY6CisgICAgICAgICAgICBpZiByZXN1bHQuc2hvdWxkU3RvcDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGVzdChyZXN1bHQpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2RzKToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuKCphcmdzLCAqKmt3ZHMpCisKKyAgICBkZWYgZGVidWcoc2VsZik6CisgICAgICAgICIiIlJ1biB0aGUgdGVzdHMgd2l0aG91dCBjb2xsZWN0aW5nIGVycm9ycyBpbiBhIFRlc3RSZXN1bHQiIiIKKyAgICAgICAgZm9yIHRlc3QgaW4gc2VsZjoKKyAgICAgICAgICAgIHRlc3QuZGVidWcoKQorCisKK2NsYXNzIFRlc3RTdWl0ZShCYXNlVGVzdFN1aXRlKToKKyAgICAiIiJBIHRlc3Qgc3VpdGUgaXMgYSBjb21wb3NpdGUgdGVzdCBjb25zaXN0aW5nIG9mIGEgbnVtYmVyIG9mIFRlc3RDYXNlcy4KKworICAgIEZvciB1c2UsIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBUZXN0U3VpdGUsIHRoZW4gYWRkIHRlc3QgY2FzZSBpbnN0YW5jZXMuCisgICAgV2hlbiBhbGwgdGVzdHMgaGF2ZSBiZWVuIGFkZGVkLCB0aGUgc3VpdGUgY2FuIGJlIHBhc3NlZCB0byBhIHRlc3QKKyAgICBydW5uZXIsIHN1Y2ggYXMgVGV4dFRlc3RSdW5uZXIuIEl0IHdpbGwgcnVuIHRoZSBpbmRpdmlkdWFsIHRlc3QgY2FzZXMKKyAgICBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLCBhZ2dyZWdhdGluZyB0aGUgcmVzdWx0cy4gV2hlbgorICAgIHN1YmNsYXNzaW5nLCBkbyBub3QgZm9yZ2V0IHRvIGNhbGwgdGhlIGJhc2UgY2xhc3MgY29uc3RydWN0b3IuCisgICAgIiIiCisKKyAgICBkZWYgcnVuKHNlbGYsIHJlc3VsdCwgZGVidWc9RmFsc2UpOgorICAgICAgICB0b3BMZXZlbCA9IEZhbHNlCisgICAgICAgIGlmIGdldGF0dHIocmVzdWx0LCAnX3Rlc3RSdW5FbnRlcmVkJywgRmFsc2UpIGlzIEZhbHNlOgorICAgICAgICAgICAgcmVzdWx0Ll90ZXN0UnVuRW50ZXJlZCA9IHRvcExldmVsID0gVHJ1ZQorCisgICAgICAgIGZvciB0ZXN0IGluIHNlbGY6CisgICAgICAgICAgICBpZiByZXN1bHQuc2hvdWxkU3RvcDoKKyAgICAgICAgICAgICAgICBicmVhaworCisgICAgICAgICAgICBpZiBfaXNub3RzdWl0ZSh0ZXN0KToKKyAgICAgICAgICAgICAgICBzZWxmLl90ZWFyRG93blByZXZpb3VzQ2xhc3ModGVzdCwgcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZU1vZHVsZUZpeHR1cmUodGVzdCwgcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuX2hhbmRsZUNsYXNzU2V0VXAodGVzdCwgcmVzdWx0KQorICAgICAgICAgICAgICAgIHJlc3VsdC5fcHJldmlvdXNUZXN0Q2xhc3MgPSB0ZXN0Ll9fY2xhc3NfXworCisgICAgICAgICAgICAgICAgaWYgKGdldGF0dHIodGVzdC5fX2NsYXNzX18sICdfY2xhc3NTZXR1cEZhaWxlZCcsIEZhbHNlKSBvcgorICAgICAgICAgICAgICAgICAgICBnZXRhdHRyKHJlc3VsdCwgJ19tb2R1bGVTZXRVcEZhaWxlZCcsIEZhbHNlKSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGlmIG5vdCBkZWJ1ZzoKKyAgICAgICAgICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGVzdC5kZWJ1ZygpCisKKyAgICAgICAgaWYgdG9wTGV2ZWw6CisgICAgICAgICAgICBzZWxmLl90ZWFyRG93blByZXZpb3VzQ2xhc3MoTm9uZSwgcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5faGFuZGxlTW9kdWxlVGVhckRvd24ocmVzdWx0KQorICAgICAgICAgICAgcmVzdWx0Ll90ZXN0UnVuRW50ZXJlZCA9IEZhbHNlCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBkZWJ1ZyhzZWxmKToKKyAgICAgICAgIiIiUnVuIHRoZSB0ZXN0cyB3aXRob3V0IGNvbGxlY3RpbmcgZXJyb3JzIGluIGEgVGVzdFJlc3VsdCIiIgorICAgICAgICBkZWJ1ZyA9IF9EZWJ1Z1Jlc3VsdCgpCisgICAgICAgIHNlbGYucnVuKGRlYnVnLCBUcnVlKQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiBfaGFuZGxlQ2xhc3NTZXRVcChzZWxmLCB0ZXN0LCByZXN1bHQpOgorICAgICAgICBwcmV2aW91c0NsYXNzID0gZ2V0YXR0cihyZXN1bHQsICdfcHJldmlvdXNUZXN0Q2xhc3MnLCBOb25lKQorICAgICAgICBjdXJyZW50Q2xhc3MgPSB0ZXN0Ll9fY2xhc3NfXworICAgICAgICBpZiBjdXJyZW50Q2xhc3MgPT0gcHJldmlvdXNDbGFzczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiByZXN1bHQuX21vZHVsZVNldFVwRmFpbGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGdldGF0dHIoY3VycmVudENsYXNzLCAiX191bml0dGVzdF9za2lwX18iLCBGYWxzZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXJyZW50Q2xhc3MuX2NsYXNzU2V0dXBGYWlsZWQgPSBGYWxzZQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgIyB0ZXN0IG1heSBhY3R1YWxseSBiZSBhIGZ1bmN0aW9uCisgICAgICAgICAgICAjIHNvIGl0cyBjbGFzcyB3aWxsIGJlIGEgYnVpbHRpbi10eXBlCisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2V0VXBDbGFzcyA9IGdldGF0dHIoY3VycmVudENsYXNzLCAnc2V0VXBDbGFzcycsIE5vbmUpCisgICAgICAgIGlmIHNldFVwQ2xhc3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY2FsbF9pZl9leGlzdHMocmVzdWx0LCAnX3NldHVwU3Rkb3V0JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZXRVcENsYXNzKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHJlc3VsdCwgX0RlYnVnUmVzdWx0KToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICBjdXJyZW50Q2xhc3MuX2NsYXNzU2V0dXBGYWlsZWQgPSBUcnVlCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdXRpbC5zdHJjbGFzcyhjdXJyZW50Q2xhc3MpCisgICAgICAgICAgICAgICAgZXJyb3JOYW1lID0gJ3NldFVwQ2xhc3MgKCVzKScgJSBjbGFzc05hbWUKKyAgICAgICAgICAgICAgICBzZWxmLl9hZGRDbGFzc09yTW9kdWxlTGV2ZWxFeGNlcHRpb24ocmVzdWx0LCBlLCBlcnJvck5hbWUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIF9jYWxsX2lmX2V4aXN0cyhyZXN1bHQsICdfcmVzdG9yZVN0ZG91dCcpCisKKyAgICBkZWYgX2dldF9wcmV2aW91c19tb2R1bGUoc2VsZiwgcmVzdWx0KToKKyAgICAgICAgcHJldmlvdXNNb2R1bGUgPSBOb25lCisgICAgICAgIHByZXZpb3VzQ2xhc3MgPSBnZXRhdHRyKHJlc3VsdCwgJ19wcmV2aW91c1Rlc3RDbGFzcycsIE5vbmUpCisgICAgICAgIGlmIHByZXZpb3VzQ2xhc3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwcmV2aW91c01vZHVsZSA9IHByZXZpb3VzQ2xhc3MuX19tb2R1bGVfXworICAgICAgICByZXR1cm4gcHJldmlvdXNNb2R1bGUKKworCisgICAgZGVmIF9oYW5kbGVNb2R1bGVGaXh0dXJlKHNlbGYsIHRlc3QsIHJlc3VsdCk6CisgICAgICAgIHByZXZpb3VzTW9kdWxlID0gc2VsZi5fZ2V0X3ByZXZpb3VzX21vZHVsZShyZXN1bHQpCisgICAgICAgIGN1cnJlbnRNb2R1bGUgPSB0ZXN0Ll9fY2xhc3NfXy5fX21vZHVsZV9fCisgICAgICAgIGlmIGN1cnJlbnRNb2R1bGUgPT0gcHJldmlvdXNNb2R1bGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBzZWxmLl9oYW5kbGVNb2R1bGVUZWFyRG93bihyZXN1bHQpCisKKyAgICAgICAgcmVzdWx0Ll9tb2R1bGVTZXRVcEZhaWxlZCA9IEZhbHNlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW2N1cnJlbnRNb2R1bGVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXRVcE1vZHVsZSA9IGdldGF0dHIobW9kdWxlLCAnc2V0VXBNb2R1bGUnLCBOb25lKQorICAgICAgICBpZiBzZXRVcE1vZHVsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jYWxsX2lmX2V4aXN0cyhyZXN1bHQsICdfc2V0dXBTdGRvdXQnKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNldFVwTW9kdWxlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIF9EZWJ1Z1Jlc3VsdCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgcmVzdWx0Ll9tb2R1bGVTZXRVcEZhaWxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICBlcnJvck5hbWUgPSAnc2V0VXBNb2R1bGUgKCVzKScgJSBjdXJyZW50TW9kdWxlCisgICAgICAgICAgICAgICAgc2VsZi5fYWRkQ2xhc3NPck1vZHVsZUxldmVsRXhjZXB0aW9uKHJlc3VsdCwgZSwgZXJyb3JOYW1lKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBfY2FsbF9pZl9leGlzdHMocmVzdWx0LCAnX3Jlc3RvcmVTdGRvdXQnKQorCisgICAgZGVmIF9hZGRDbGFzc09yTW9kdWxlTGV2ZWxFeGNlcHRpb24oc2VsZiwgcmVzdWx0LCBleGNlcHRpb24sIGVycm9yTmFtZSk6CisgICAgICAgIGVycm9yID0gX0Vycm9ySG9sZGVyKGVycm9yTmFtZSkKKyAgICAgICAgYWRkU2tpcCA9IGdldGF0dHIocmVzdWx0LCAnYWRkU2tpcCcsIE5vbmUpCisgICAgICAgIGlmIGFkZFNraXAgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2UoZXhjZXB0aW9uLCBjYXNlLlNraXBUZXN0KToKKyAgICAgICAgICAgIGFkZFNraXAoZXJyb3IsIHN0cihleGNlcHRpb24pKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzdWx0LmFkZEVycm9yKGVycm9yLCBzeXMuZXhjX2luZm8oKSkKKworICAgIGRlZiBfaGFuZGxlTW9kdWxlVGVhckRvd24oc2VsZiwgcmVzdWx0KToKKyAgICAgICAgcHJldmlvdXNNb2R1bGUgPSBzZWxmLl9nZXRfcHJldmlvdXNfbW9kdWxlKHJlc3VsdCkKKyAgICAgICAgaWYgcHJldmlvdXNNb2R1bGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiByZXN1bHQuX21vZHVsZVNldFVwRmFpbGVkOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbcHJldmlvdXNNb2R1bGVdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRlYXJEb3duTW9kdWxlID0gZ2V0YXR0cihtb2R1bGUsICd0ZWFyRG93bk1vZHVsZScsIE5vbmUpCisgICAgICAgIGlmIHRlYXJEb3duTW9kdWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2NhbGxfaWZfZXhpc3RzKHJlc3VsdCwgJ19zZXR1cFN0ZG91dCcpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVhckRvd25Nb2R1bGUoKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzdWx0LCBfRGVidWdSZXN1bHQpOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9ICd0ZWFyRG93bk1vZHVsZSAoJXMpJyAlIHByZXZpb3VzTW9kdWxlCisgICAgICAgICAgICAgICAgc2VsZi5fYWRkQ2xhc3NPck1vZHVsZUxldmVsRXhjZXB0aW9uKHJlc3VsdCwgZSwgZXJyb3JOYW1lKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBfY2FsbF9pZl9leGlzdHMocmVzdWx0LCAnX3Jlc3RvcmVTdGRvdXQnKQorCisgICAgZGVmIF90ZWFyRG93blByZXZpb3VzQ2xhc3Moc2VsZiwgdGVzdCwgcmVzdWx0KToKKyAgICAgICAgcHJldmlvdXNDbGFzcyA9IGdldGF0dHIocmVzdWx0LCAnX3ByZXZpb3VzVGVzdENsYXNzJywgTm9uZSkKKyAgICAgICAgY3VycmVudENsYXNzID0gdGVzdC5fX2NsYXNzX18KKyAgICAgICAgaWYgY3VycmVudENsYXNzID09IHByZXZpb3VzQ2xhc3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZ2V0YXR0cihwcmV2aW91c0NsYXNzLCAnX2NsYXNzU2V0dXBGYWlsZWQnLCBGYWxzZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZ2V0YXR0cihyZXN1bHQsICdfbW9kdWxlU2V0VXBGYWlsZWQnLCBGYWxzZSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgZ2V0YXR0cihwcmV2aW91c0NsYXNzLCAiX191bml0dGVzdF9za2lwX18iLCBGYWxzZSk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB0ZWFyRG93bkNsYXNzID0gZ2V0YXR0cihwcmV2aW91c0NsYXNzLCAndGVhckRvd25DbGFzcycsIE5vbmUpCisgICAgICAgIGlmIHRlYXJEb3duQ2xhc3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBfY2FsbF9pZl9leGlzdHMocmVzdWx0LCAnX3NldHVwU3Rkb3V0JykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB0ZWFyRG93bkNsYXNzKCkKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShyZXN1bHQsIF9EZWJ1Z1Jlc3VsdCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gdXRpbC5zdHJjbGFzcyhwcmV2aW91c0NsYXNzKQorICAgICAgICAgICAgICAgIGVycm9yTmFtZSA9ICd0ZWFyRG93bkNsYXNzICglcyknICUgY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgc2VsZi5fYWRkQ2xhc3NPck1vZHVsZUxldmVsRXhjZXB0aW9uKHJlc3VsdCwgZSwgZXJyb3JOYW1lKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBfY2FsbF9pZl9leGlzdHMocmVzdWx0LCAnX3Jlc3RvcmVTdGRvdXQnKQorCisKK2NsYXNzIF9FcnJvckhvbGRlcihvYmplY3QpOgorICAgICIiIgorICAgIFBsYWNlaG9sZGVyIGZvciBhIFRlc3RDYXNlIGluc2lkZSBhIHJlc3VsdC4gQXMgZmFyIGFzIGEgVGVzdFJlc3VsdAorICAgIGlzIGNvbmNlcm5lZCwgdGhpcyBsb29rcyBleGFjdGx5IGxpa2UgYSB1bml0IHRlc3QuIFVzZWQgdG8gaW5zZXJ0CisgICAgYXJiaXRyYXJ5IGVycm9ycyBpbnRvIGEgdGVzdCBzdWl0ZSBydW4uCisgICAgIiIiCisgICAgIyBJbnNwaXJlZCBieSB0aGUgRXJyb3JIb2xkZXIgZnJvbSBUd2lzdGVkOgorICAgICMgaHR0cDovL3R3aXN0ZWRtYXRyaXguY29tL3RyYWMvYnJvd3Nlci90cnVuay90d2lzdGVkL3RyaWFsL3J1bm5lci5weQorCisgICAgIyBhdHRyaWJ1dGUgdXNlZCBieSBUZXN0UmVzdWx0Ll9leGNfaW5mb190b19zdHJpbmcKKyAgICBmYWlsdXJlRXhjZXB0aW9uID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRlc2NyaXB0aW9uKToKKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uCisKKyAgICBkZWYgaWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRlc2NyaXB0aW9uCisKKyAgICBkZWYgc2hvcnREZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8RXJyb3JIb2xkZXIgZGVzY3JpcHRpb249JXI+IiAlIChzZWxmLmRlc2NyaXB0aW9uLCkKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5pZCgpCisKKyAgICBkZWYgcnVuKHNlbGYsIHJlc3VsdCk6CisgICAgICAgICMgY291bGQgY2FsbCByZXN1bHQuYWRkRXJyb3IoLi4uKSAtIGJ1dCB0aGlzIHRlc3QtbGlrZSBvYmplY3QKKyAgICAgICAgIyBzaG91bGRuJ3QgYmUgcnVuIGFueXdheQorICAgICAgICBwYXNzCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgcmVzdWx0KToKKyAgICAgICAgcmV0dXJuIHNlbGYucnVuKHJlc3VsdCkKKworICAgIGRlZiBjb3VudFRlc3RDYXNlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIF9pc25vdHN1aXRlKHRlc3QpOgorICAgICJBIGNydWRlIHdheSB0byB0ZWxsIGFwYXJ0IHRlc3RjYXNlcyBhbmQgc3VpdGVzIHdpdGggZHVjay10eXBpbmciCisgICAgdHJ5OgorICAgICAgICBpdGVyKHRlc3QpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBfRGVidWdSZXN1bHQob2JqZWN0KToKKyAgICAiVXNlZCBieSB0aGUgVGVzdFN1aXRlIHRvIGhvbGQgcHJldmlvdXMgY2xhc3Mgd2hlbiBydW5uaW5nIGluIGRlYnVnLiIKKyAgICBfcHJldmlvdXNUZXN0Q2xhc3MgPSBOb25lCisgICAgX21vZHVsZVNldFVwRmFpbGVkID0gRmFsc2UKKyAgICBzaG91bGRTdG9wID0gRmFsc2UKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zdWl0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmZjlkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc3VpdGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC9zdWl0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNmZjlkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3Qvc3VpdGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWI3MzBiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjEgQEAKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKKworaGVyZSA9IG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKK2xvYWRlciA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyCisKK2RlZiBzdWl0ZSgpOgorICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBmb3IgZm4gaW4gb3MubGlzdGRpcihoZXJlKToKKyAgICAgICAgaWYgZm4uc3RhcnRzd2l0aCgidGVzdCIpIGFuZCBmbi5lbmRzd2l0aCgiLnB5Iik6CisgICAgICAgICAgICBtb2RuYW1lID0gInVuaXR0ZXN0LnRlc3QuIiArIGZuWzotM10KKyAgICAgICAgICAgIF9faW1wb3J0X18obW9kbmFtZSkKKyAgICAgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZG5hbWVdCisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG1vZHVsZSkpCisgICAgcmV0dXJuIHN1aXRlCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSJzdWl0ZSIpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTY3NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTY3NzA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmMTRlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9kdW1teS5weQpAQCAtMCwwICsxIEBACisjIEVtcHR5IG1vZHVsZSBmb3IgdGVzdGluZyB0aGUgbG9hZGluZyBvZiBtb2R1bGVzCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L2R1bW15LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRkMmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L2R1bW15LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvZHVtbXkucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L2R1bW15LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTRkMmVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L2R1bW15LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3Qvc3VwcG9ydC5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxY2YwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3Qvc3VwcG9ydC5weQpAQCAtMCwwICsxLDExOSBAQAoraW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdEhhc2hpbmcob2JqZWN0KToKKyAgICAiIiJVc2VkIGFzIGEgbWl4aW4gZm9yIFRlc3RDYXNlIiIiCisKKyAgICAjIENoZWNrIGZvciBhIHZhbGlkIF9faGFzaF9fIGltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfaGFzaChzZWxmKToKKyAgICAgICAgZm9yIG9ial8xLCBvYmpfMiBpbiBzZWxmLmVxX3BhaXJzOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIG5vdCBoYXNoKG9ial8xKSA9PSBoYXNoKG9ial8yKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCIlciBhbmQgJXIgZG8gbm90IGhhc2ggZXF1YWwiICUgKG9ial8xLCBvYmpfMikpCisgICAgICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJQcm9ibGVtIGhhc2hpbmcgJXIgYW5kICVyOiAlcyIgJSAob2JqXzEsIG9ial8yLCBlKSkKKworICAgICAgICBmb3Igb2JqXzEsIG9ial8yIGluIHNlbGYubmVfcGFpcnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgaGFzaChvYmpfMSkgPT0gaGFzaChvYmpfMik6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiJXMgYW5kICVzIGhhc2ggZXF1YWwsIGJ1dCBzaG91bGRuJ3QiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvYmpfMSwgb2JqXzIpKQorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiUHJvYmxlbSBoYXNoaW5nICVzIGFuZCAlczogJXMiICUgKG9ial8xLCBvYmpfMiwgZSkpCisKKworY2xhc3MgVGVzdEVxdWFsaXR5KG9iamVjdCk6CisgICAgIiIiVXNlZCBhcyBhIG1peGluIGZvciBUZXN0Q2FzZSIiIgorCisgICAgIyBDaGVjayBmb3IgYSB2YWxpZCBfX2VxX18gaW1wbGVtZW50YXRpb24KKyAgICBkZWYgdGVzdF9lcShzZWxmKToKKyAgICAgICAgZm9yIG9ial8xLCBvYmpfMiBpbiBzZWxmLmVxX3BhaXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvYmpfMSwgb2JqXzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9ial8yLCBvYmpfMSkKKworICAgICMgQ2hlY2sgZm9yIGEgdmFsaWQgX19uZV9fIGltcGxlbWVudGF0aW9uCisgICAgZGVmIHRlc3RfbmUoc2VsZik6CisgICAgICAgIGZvciBvYmpfMSwgb2JqXzIgaW4gc2VsZi5uZV9wYWlyczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwob2JqXzEsIG9ial8yKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvYmpfMiwgb2JqXzEpCisKKworY2xhc3MgTG9nZ2luZ1Jlc3VsdCh1bml0dGVzdC5UZXN0UmVzdWx0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbG9nKToKKyAgICAgICAgc2VsZi5fZXZlbnRzID0gbG9nCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLl9faW5pdF9fKCkKKworICAgIGRlZiBzdGFydFRlc3Qoc2VsZiwgdGVzdCk6CisgICAgICAgIHNlbGYuX2V2ZW50cy5hcHBlbmQoJ3N0YXJ0VGVzdCcpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLnN0YXJ0VGVzdCh0ZXN0KQorCisgICAgZGVmIHN0YXJ0VGVzdFJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnc3RhcnRUZXN0UnVuJykKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1Jlc3VsdCwgc2VsZikuc3RhcnRUZXN0UnVuKCkKKworICAgIGRlZiBzdG9wVGVzdChzZWxmLCB0ZXN0KToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnc3RvcFRlc3QnKQorICAgICAgICBzdXBlcihMb2dnaW5nUmVzdWx0LCBzZWxmKS5zdG9wVGVzdCh0ZXN0KQorCisgICAgZGVmIHN0b3BUZXN0UnVuKHNlbGYpOgorICAgICAgICBzZWxmLl9ldmVudHMuYXBwZW5kKCdzdG9wVGVzdFJ1bicpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLnN0b3BUZXN0UnVuKCkKKworICAgIGRlZiBhZGRGYWlsdXJlKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnYWRkRmFpbHVyZScpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLmFkZEZhaWx1cmUoKmFyZ3MpCisKKyAgICBkZWYgYWRkU3VjY2VzcyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2V2ZW50cy5hcHBlbmQoJ2FkZFN1Y2Nlc3MnKQorICAgICAgICBzdXBlcihMb2dnaW5nUmVzdWx0LCBzZWxmKS5hZGRTdWNjZXNzKCphcmdzKQorCisgICAgZGVmIGFkZEVycm9yKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnYWRkRXJyb3InKQorICAgICAgICBzdXBlcihMb2dnaW5nUmVzdWx0LCBzZWxmKS5hZGRFcnJvcigqYXJncykKKworICAgIGRlZiBhZGRTa2lwKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnYWRkU2tpcCcpCisgICAgICAgIHN1cGVyKExvZ2dpbmdSZXN1bHQsIHNlbGYpLmFkZFNraXAoKmFyZ3MpCisKKyAgICBkZWYgYWRkRXhwZWN0ZWRGYWlsdXJlKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnYWRkRXhwZWN0ZWRGYWlsdXJlJykKKyAgICAgICAgc3VwZXIoTG9nZ2luZ1Jlc3VsdCwgc2VsZikuYWRkRXhwZWN0ZWRGYWlsdXJlKCphcmdzKQorCisgICAgZGVmIGFkZFVuZXhwZWN0ZWRTdWNjZXNzKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fZXZlbnRzLmFwcGVuZCgnYWRkVW5leHBlY3RlZFN1Y2Nlc3MnKQorICAgICAgICBzdXBlcihMb2dnaW5nUmVzdWx0LCBzZWxmKS5hZGRVbmV4cGVjdGVkU3VjY2VzcygqYXJncykKKworCitjbGFzcyBSZXN1bHRXaXRoTm9TdGFydFRlc3RSdW5TdG9wVGVzdFJ1bihvYmplY3QpOgorICAgICIiIkFuIG9iamVjdCBob25vdXJpbmcgVGVzdFJlc3VsdCBiZWZvcmUgc3RhcnRUZXN0UnVuL3N0b3BUZXN0UnVuLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWx1cmVzID0gW10KKyAgICAgICAgc2VsZi5lcnJvcnMgPSBbXQorICAgICAgICBzZWxmLnRlc3RzUnVuID0gMAorICAgICAgICBzZWxmLnNraXBwZWQgPSBbXQorICAgICAgICBzZWxmLmV4cGVjdGVkRmFpbHVyZXMgPSBbXQorICAgICAgICBzZWxmLnVuZXhwZWN0ZWRTdWNjZXNzZXMgPSBbXQorICAgICAgICBzZWxmLnNob3VsZFN0b3AgPSBGYWxzZQorCisgICAgZGVmIHN0YXJ0VGVzdChzZWxmLCB0ZXN0KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHN0b3BUZXN0KHNlbGYsIHRlc3QpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgYWRkRXJyb3Ioc2VsZiwgdGVzdCk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBhZGRGYWlsdXJlKHNlbGYsIHRlc3QpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgYWRkU3VjY2VzcyhzZWxmLCB0ZXN0KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHdhc1N1Y2Nlc3NmdWwoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3Qvc3VwcG9ydC5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3Qvc3VwcG9ydC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1M2YyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3Qvc3VwcG9ydC5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3Qvc3VwcG9ydC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk1M2YyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC9zdXBwb3J0LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYXNzZXJ0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWJhNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYXNzZXJ0aW9ucy5weQpAQCAtMCwwICsxLDI4NiBAQAoraW1wb3J0IGRhdGV0aW1lCisKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3RfQXNzZXJ0aW9ucyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfQWxtb3N0RXF1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMS4wMDAwMDAwMSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsKDEuMDAwMDAwMSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwsIDEuMDAwMDAwMSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90QWxtb3N0RXF1YWwsIDEuMDAwMDAwMDEsIDEuMCkKKworICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEuMSwgMS4wLCBwbGFjZXM9MCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsLCAxLjEsIDEuMCwgcGxhY2VzPTEpCisKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgwLCAuMSsuMWosIHBsYWNlcz0wKQorICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsKDAsIC4xKy4xaiwgcGxhY2VzPTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCwgMCwgLjErLjFqLCBwbGFjZXM9MSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEFsbW9zdEVxdWFsLCAwLCAuMSsuMWosIHBsYWNlcz0wKQorCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoZmxvYXQoJ2luZicpLCBmbG9hdCgnaW5mJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQoJ2luZicpLCBmbG9hdCgnaW5mJykpCisKKyAgICBkZWYgdGVzdF9BbW9zdEVxdWFsV2l0aERlbHRhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEuMSwgMS4wLCBkZWx0YT0wLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoMS4wLCAxLjEsIGRlbHRhPTAuNSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCgxLjEsIDEuMCwgZGVsdGE9MC4wNSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCgxLjAsIDEuMSwgZGVsdGE9MC4wNSkKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMSwgMS4wLCBkZWx0YT0wLjA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0Tm90QWxtb3N0RXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMSwgMS4wLCBkZWx0YT0wLjUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmFzc2VydEFsbW9zdEVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEsIDEuMCwgcGxhY2VzPTIsIGRlbHRhPTIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xLCAxLjAsIHBsYWNlcz0yLCBkZWx0YT0yKQorCisgICAgICAgIGZpcnN0ID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKKyAgICAgICAgc2Vjb25kID0gZmlyc3QgKyBkYXRldGltZS50aW1lZGVsdGEoc2Vjb25kcz0xMCkKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChmaXJzdCwgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhPWRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTIwKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RBbG1vc3RFcXVhbChmaXJzdCwgc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhPWRhdGV0aW1lLnRpbWVkZWx0YShzZWNvbmRzPTUpKQorCisgICAgZGVmIHRlc3RfYXNzZXJ0UmFpc2VzKHNlbGYpOgorICAgICAgICBkZWYgX3JhaXNlKGUpOgorICAgICAgICAgICAgcmFpc2UgZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgX3JhaXNlLCBLZXlFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIF9yYWlzZSwgS2V5RXJyb3IoImtleSIpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBOb25lKQorICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCJLZXlFcnJvciBub3QgcmFpc2VkIiwgZS5hcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJhc3NlcnRSYWlzZXMoKSBkaWRuJ3QgZmFpbCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBfcmFpc2UsIFZhbHVlRXJyb3IpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJhc3NlcnRSYWlzZXMoKSBkaWRuJ3QgbGV0IGV4Y2VwdGlvbiBwYXNzIHRocm91Z2giKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKSBhcyBjbToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICBzZWxmLmFzc2VydElzKGNtLmV4Y2VwdGlvbiwgZSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yKCJrZXkiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oIktleUVycm9yIG5vdCByYWlzZWQiLCBlLmFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoImFzc2VydFJhaXNlcygpIGRpZG4ndCBmYWlsIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiYXNzZXJ0UmFpc2VzKCkgZGlkbid0IGxldCBleGNlcHRpb24gcGFzcyB0aHJvdWdoIikKKworICAgIGRlZiB0ZXN0QXNzZXJ0Tm90UmVnZXhwTWF0Y2hlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnROb3RSZWdleHBNYXRjaGVzKCdBbGEgbWEga290YScsIHIncisnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdFJlZ2V4cE1hdGNoZXMoJ0FsYSBtYSBrb3RhJywgcidrLnQnLCAnTWVzc2FnZScpCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24sIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEluKCIna290JyIsIGUuYXJnc1swXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJ01lc3NhZ2UnLCBlLmFyZ3NbMF0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydE5vdFJlZ2V4cE1hdGNoZXMgc2hvdWxkIGhhdmUgZmFpbGVkLicpCisKKworY2xhc3MgVGVzdExvbmdNZXNzYWdlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJUZXN0IHRoYXQgdGhlIGluZGl2aWR1YWwgYXNzZXJ0cyBob25vdXIgbG9uZ01lc3NhZ2UuCisgICAgVGhpcyBhY3R1YWxseSB0ZXN0cyBhbGwgdGhlIG1lc3NhZ2UgYmVoYXZpb3VyIGZvcgorICAgIGFzc2VydHMgdGhhdCB1c2UgbG9uZ01lc3NhZ2UuIiIiCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3RhYmxlVGVzdEZhbHNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGxvbmdNZXNzYWdlID0gRmFsc2UKKyAgICAgICAgICAgIGZhaWx1cmVFeGNlcHRpb24gPSBzZWxmLmZhaWx1cmVFeGNlcHRpb24KKworICAgICAgICAgICAgZGVmIHRlc3RUZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBUZXN0YWJsZVRlc3RUcnVlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGxvbmdNZXNzYWdlID0gVHJ1ZQorICAgICAgICAgICAgZmFpbHVyZUV4Y2VwdGlvbiA9IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbgorCisgICAgICAgICAgICBkZWYgdGVzdFRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHNlbGYudGVzdGFibGVUcnVlID0gVGVzdGFibGVUZXN0VHJ1ZSgndGVzdFRlc3QnKQorICAgICAgICBzZWxmLnRlc3RhYmxlRmFsc2UgPSBUZXN0YWJsZVRlc3RGYWxzZSgndGVzdFRlc3QnKQorCisgICAgZGVmIHRlc3REZWZhdWx0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHVuaXR0ZXN0LlRlc3RDYXNlLmxvbmdNZXNzYWdlKQorCisgICAgZGVmIHRlc3RfZm9ybWF0TXNnKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGVzdGFibGVGYWxzZS5fZm9ybWF0TWVzc2FnZShOb25lLCAiZm9vIiksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGVzdGFibGVGYWxzZS5fZm9ybWF0TWVzc2FnZSgiZm9vIiwgImJhciIpLCAiZm9vIikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudGVzdGFibGVUcnVlLl9mb3JtYXRNZXNzYWdlKE5vbmUsICJmb28iKSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50ZXN0YWJsZVRydWUuX2Zvcm1hdE1lc3NhZ2UoImZvbyIsICJiYXIiKSwgImJhciA6IGZvbyIpCisKKyAgICAgICAgIyBUaGlzIGJsb3dzIHVwIGlmIF9mb3JtYXRNZXNzYWdlIHVzZXMgc3RyaW5nIGNvbmNhdGVuYXRpb24KKyAgICAgICAgc2VsZi50ZXN0YWJsZVRydWUuX2Zvcm1hdE1lc3NhZ2Uob2JqZWN0KCksICdmb28nKQorCisgICAgZGVmIHRlc3RfZm9ybWF0TWVzc2FnZV91bmljb2RlX2Vycm9yKHNlbGYpOgorICAgICAgICBvbmUgPSAnJy5qb2luKGNocihpKSBmb3IgaSBpbiByYW5nZSgyNTUpKQorICAgICAgICAjIHRoaXMgdXNlZCB0byBjYXVzZSBhIFVuaWNvZGVEZWNvZGVFcnJvciBjb25zdHJ1Y3RpbmcgbXNnCisgICAgICAgIHNlbGYudGVzdGFibGVUcnVlLl9mb3JtYXRNZXNzYWdlKG9uZSwgdSdcdUZGRkQnKQorCisgICAgZGVmIGFzc2VydE1lc3NhZ2VzKHNlbGYsIG1ldGhvZE5hbWUsIGFyZ3MsIGVycm9ycyk6CisgICAgICAgIGRlZiBnZXRNZXRob2QoaSk6CisgICAgICAgICAgICB1c2VUZXN0YWJsZUZhbHNlICA9IGkgPCAyCisgICAgICAgICAgICBpZiB1c2VUZXN0YWJsZUZhbHNlOgorICAgICAgICAgICAgICAgIHRlc3QgPSBzZWxmLnRlc3RhYmxlRmFsc2UKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGVzdCA9IHNlbGYudGVzdGFibGVUcnVlCisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cih0ZXN0LCBtZXRob2ROYW1lKQorCisgICAgICAgIGZvciBpLCBleHBlY3RlZF9yZWdleHAgaW4gZW51bWVyYXRlKGVycm9ycyk6CisgICAgICAgICAgICB0ZXN0TWV0aG9kID0gZ2V0TWV0aG9kKGkpCisgICAgICAgICAgICBrd2FyZ3MgPSB7fQorICAgICAgICAgICAgd2l0aE1zZyA9IGkgJSAyCisgICAgICAgICAgICBpZiB3aXRoTXNnOgorICAgICAgICAgICAgICAgIGt3YXJncyA9IHsibXNnIjogIm9vcHMifQorCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVnZXhwPWV4cGVjdGVkX3JlZ2V4cCk6CisgICAgICAgICAgICAgICAgdGVzdE1ldGhvZCgqYXJncywgKiprd2FyZ3MpCisKKyAgICBkZWYgdGVzdEFzc2VydFRydWUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydFRydWUnLCAoRmFsc2UsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl5GYWxzZSBpcyBub3QgdHJ1ZSQiLCAiXm9vcHMkIiwgIl5GYWxzZSBpcyBub3QgdHJ1ZSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXkZhbHNlIGlzIG5vdCB0cnVlIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0RmFsc2Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydEZhbHNlJywgKFRydWUsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl5UcnVlIGlzIG5vdCBmYWxzZSQiLCAiXm9vcHMkIiwgIl5UcnVlIGlzIG5vdCBmYWxzZSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXlRydWUgaXMgbm90IGZhbHNlIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0Tm90RXF1YWwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydE5vdEVxdWFsJywgKDEsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXjEgPT0gMSQiLCAiXm9vcHMkIiwgIl4xID09IDEkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4xID09IDEgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBbG1vc3RFcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0QWxtb3N0RXF1YWwnLCAoMSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJeMSAhPSAyIHdpdGhpbiA3IHBsYWNlcyQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4xICE9IDIgd2l0aGluIDcgcGxhY2VzJCIsICJeMSAhPSAyIHdpdGhpbiA3IHBsYWNlcyA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdE5vdEFsbW9zdEVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnROb3RBbG1vc3RFcXVhbCcsICgxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl4xID09IDEgd2l0aGluIDcgcGxhY2VzJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXjEgPT0gMSB3aXRoaW4gNyBwbGFjZXMkIiwgIl4xID09IDEgd2l0aGluIDcgcGxhY2VzIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0X2Jhc2VBc3NlcnRFcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnX2Jhc2VBc3NlcnRFcXVhbCcsICgxLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl4xICE9IDIkIiwgIl5vb3BzJCIsICJeMSAhPSAyJCIsICJeMSAhPSAyIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0U2VxdWVuY2VFcXVhbChzZWxmKToKKyAgICAgICAgIyBFcnJvciBtZXNzYWdlcyBhcmUgbXVsdGlsaW5lIHNvIG5vdCB0ZXN0aW5nIG9uIGZ1bGwgbWVzc2FnZQorICAgICAgICAjIGFzc2VydFR1cGxlRXF1YWwgYW5kIGFzc2VydExpc3RFcXVhbCBkZWxlZ2F0ZSB0byB0aGlzIG1ldGhvZAorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRTZXF1ZW5jZUVxdWFsJywgKFtdLCBbTm9uZV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXCsgXFtOb25lXF0kIiwgIl5vb3BzJCIsIHIiXCsgXFtOb25lXF0kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciJcKyBcW05vbmVcXSA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFzc2VydFNldEVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRTZXRFcXVhbCcsIChzZXQoKSwgc2V0KFtOb25lXSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiTm9uZSQiLCAiXm9vcHMkIiwgIk5vbmUkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vbmUgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRJbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0SW4nLCAoTm9uZSwgW10pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnXk5vbmUgbm90IGZvdW5kIGluIFxbXF0kJywgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdeTm9uZSBub3QgZm91bmQgaW4gXFtcXSQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXk5vbmUgbm90IGZvdW5kIGluIFxbXF0gOiBvb3BzJCddKQorCisgICAgZGVmIHRlc3RBc3NlcnROb3RJbihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0Tm90SW4nLCAoTm9uZSwgW05vbmVdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJ15Ob25lIHVuZXhwZWN0ZWRseSBmb3VuZCBpbiBcW05vbmVcXSQnLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ15Ob25lIHVuZXhwZWN0ZWRseSBmb3VuZCBpbiBcW05vbmVcXSQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXk5vbmUgdW5leHBlY3RlZGx5IGZvdW5kIGluIFxbTm9uZVxdIDogb29wcyQnXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0RGljdEVxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnREaWN0RXF1YWwnLCAoe30sIHsna2V5JzogJ3ZhbHVlJ30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyIlwrIFx7J2tleSc6ICd2YWx1ZSdcfSQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwrIFx7J2tleSc6ICd2YWx1ZSdcfSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCsgXHsna2V5JzogJ3ZhbHVlJ1x9IDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnREaWN0Q29udGFpbnNTdWJzZXQnLCAoeydrZXknOiAndmFsdWUnfSwge30pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXk1pc3Npbmc6ICdrZXknJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXk1pc3Npbmc6ICdrZXknJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeTWlzc2luZzogJ2tleScgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRNdWx0aUxpbmVFcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0TXVsdGlMaW5lRXF1YWwnLCAoIiIsICJmb28iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbciJcKyBmb28kIiwgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXCsgZm9vJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIiXCsgZm9vIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0TGVzcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0TGVzcycsICgyLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl4yIG5vdCBsZXNzIHRoYW4gMSQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4yIG5vdCBsZXNzIHRoYW4gMSQiLCAiXjIgbm90IGxlc3MgdGhhbiAxIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0TGVzc0VxdWFsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydE1lc3NhZ2VzKCdhc3NlcnRMZXNzRXF1YWwnLCAoMiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJeMiBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEkIiwgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeMiBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4yIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMSA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFzc2VydEdyZWF0ZXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydEdyZWF0ZXInLCAoMSwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJeMSBub3QgZ3JlYXRlciB0aGFuIDIkIiwgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeMSBub3QgZ3JlYXRlciB0aGFuIDIkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4xIG5vdCBncmVhdGVyIHRoYW4gMiA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFzc2VydEdyZWF0ZXJFcXVhbChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0R3JlYXRlckVxdWFsJywgKDEsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXjEgbm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyJCIsICJeb29wcyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXjEgbm90IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAyJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeMSBub3QgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDIgOiBvb3BzJCJdKQorCisgICAgZGVmIHRlc3RBc3NlcnRJc05vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydElzTm9uZScsICgnbm90IE5vbmUnLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJeJ25vdCBOb25lJyBpcyBub3QgTm9uZSQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl4nbm90IE5vbmUnIGlzIG5vdCBOb25lJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJeJ25vdCBOb25lJyBpcyBub3QgTm9uZSA6IG9vcHMkIl0pCisKKyAgICBkZWYgdGVzdEFzc2VydElzTm90Tm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRNZXNzYWdlcygnYXNzZXJ0SXNOb3ROb25lJywgKE5vbmUsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl51bmV4cGVjdGVkbHkgTm9uZSQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl51bmV4cGVjdGVkbHkgTm9uZSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXnVuZXhwZWN0ZWRseSBOb25lIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0SXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydElzJywgKE5vbmUsICdmb28nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIl5Ob25lIGlzIG5vdCAnZm9vJyQiLCAiXm9vcHMkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl5Ob25lIGlzIG5vdCAnZm9vJyQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXk5vbmUgaXMgbm90ICdmb28nIDogb29wcyQiXSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0SXNOb3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0TWVzc2FnZXMoJ2Fzc2VydElzTm90JywgKE5vbmUsIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiXnVuZXhwZWN0ZWRseSBpZGVudGljYWw6IE5vbmUkIiwgIl5vb3BzJCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJedW5leHBlY3RlZGx5IGlkZW50aWNhbDogTm9uZSQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXnVuZXhwZWN0ZWRseSBpZGVudGljYWw6IE5vbmUgOiBvb3BzJCJdKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2QwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Fzc2VydGlvbnMucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmN2QwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9hc3NlcnRpb25zLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9icmVhay5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjkxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9icmVhay5weQpAQCAtMCwwICsxLDI4NCBAQAoraW1wb3J0IGdjCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCB3ZWFrcmVmCisKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCisKK2ltcG9ydCB1bml0dGVzdAorCisKK0B1bml0dGVzdC5za2lwVW5sZXNzKGhhc2F0dHIob3MsICdraWxsJyksICJUZXN0IHJlcXVpcmVzIG9zLmtpbGwiKQorQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0id2luMzIiLCAiVGVzdCBjYW5ub3QgcnVuIG9uIFdpbmRvd3MiKQorQHVuaXR0ZXN0LnNraXBJZihzeXMucGxhdGZvcm0gPT0gJ2ZyZWVic2Q2JywgIlRlc3Qga2lsbHMgcmVncnRlc3Qgb24gZnJlZWJzZDYgIgorICAgICJpZiB0aHJlYWRzIGhhdmUgYmVlbiB1c2VkIikKK2NsYXNzIFRlc3RCcmVhayh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgaW50X2hhbmRsZXIgPSBOb25lCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuX2RlZmF1bHRfaGFuZGxlciA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgaWYgc2VsZi5pbnRfaGFuZGxlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgc2VsZi5pbnRfaGFuZGxlcikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSU5ULCBzZWxmLl9kZWZhdWx0X2hhbmRsZXIpCisgICAgICAgIHVuaXR0ZXN0LnNpZ25hbHMuX3Jlc3VsdHMgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KCkKKyAgICAgICAgdW5pdHRlc3Quc2lnbmFscy5faW50ZXJydXB0X2hhbmRsZXIgPSBOb25lCisKKworICAgIGRlZiB0ZXN0SW5zdGFsbEhhbmRsZXIoc2VsZik6CisgICAgICAgIGRlZmF1bHRfaGFuZGxlciA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCksIGRlZmF1bHRfaGFuZGxlcikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdJTlQpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiS2V5Ym9hcmRJbnRlcnJ1cHQgbm90IGhhbmRsZWQiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdC5zaWduYWxzLl9pbnRlcnJ1cHRfaGFuZGxlci5jYWxsZWQpCisKKyAgICBkZWYgdGVzdFJlZ2lzdGVyUmVzdWx0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdW5pdHRlc3QucmVnaXN0ZXJSZXN1bHQocmVzdWx0KQorCisgICAgICAgIGZvciByZWYgaW4gdW5pdHRlc3Quc2lnbmFscy5fcmVzdWx0czoKKyAgICAgICAgICAgIGlmIHJlZiBpcyByZXN1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgcmVmIGlzIG5vdCByZXN1bHQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJvZGQgb2JqZWN0IGluIHJlc3VsdCBzZXQiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyZXN1bHQgbm90IGZvdW5kIikKKworCisgICAgZGVmIHRlc3RJbnRlcnJ1cHRDYXVnaHQoc2VsZik6CisgICAgICAgIGRlZmF1bHRfaGFuZGxlciA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorICAgICAgICB1bml0dGVzdC5yZWdpc3RlclJlc3VsdChyZXN1bHQpCisKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpLCBkZWZhdWx0X2hhbmRsZXIpCisKKyAgICAgICAgZGVmIHRlc3QocmVzdWx0KToKKyAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgICAgIHJlc3VsdC5icmVha0NhdWdodCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc2hvdWxkU3RvcCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0KHJlc3VsdCkKKyAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJLZXlib2FyZEludGVycnVwdCBub3QgaGFuZGxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuYnJlYWtDYXVnaHQpCisKKworICAgIGRlZiB0ZXN0U2Vjb25kSW50ZXJydXB0KHNlbGYpOgorICAgICAgICAjIENhbid0IHVzZSBza2lwSWYgZGVjb3JhdG9yIGJlY2F1c2UgdGhlIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlCisgICAgICAgICMgYmVlbiBjaGFuZ2VkIGFmdGVyIGRlZmluaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICBpZiBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpID09IHNpZ25hbC5TSUdfSUdOOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGVzdCByZXF1aXJlcyBTSUdJTlQgdG8gbm90IGJlIGlnbm9yZWQiKQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdW5pdHRlc3QuaW5zdGFsbEhhbmRsZXIoKQorICAgICAgICB1bml0dGVzdC5yZWdpc3RlclJlc3VsdChyZXN1bHQpCisKKyAgICAgICAgZGVmIHRlc3QocmVzdWx0KToKKyAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICAgICAgICAgIHJlc3VsdC5icmVha0NhdWdodCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc2hvdWxkU3RvcCkKKyAgICAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHSU5UKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTZWNvbmQgS2V5Ym9hcmRJbnRlcnJ1cHQgbm90IHJhaXNlZCIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdChyZXN1bHQpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2Vjb25kIEtleWJvYXJkSW50ZXJydXB0IG5vdCByYWlzZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LmJyZWFrQ2F1Z2h0KQorCisKKyAgICBkZWYgdGVzdFR3b1Jlc3VsdHMoc2VsZik6CisgICAgICAgIHVuaXR0ZXN0Lmluc3RhbGxIYW5kbGVyKCkKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdW5pdHRlc3QucmVnaXN0ZXJSZXN1bHQocmVzdWx0KQorICAgICAgICBuZXdfaGFuZGxlciA9IHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCkKKworICAgICAgICByZXN1bHQyID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHVuaXR0ZXN0LnJlZ2lzdGVyUmVzdWx0KHJlc3VsdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgbmV3X2hhbmRsZXIpCisKKyAgICAgICAgcmVzdWx0MyA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIGRlZiB0ZXN0KHJlc3VsdCk6CisgICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdJTlQpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGVzdChyZXN1bHQpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiS2V5Ym9hcmRJbnRlcnJ1cHQgbm90IGhhbmRsZWQiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc2hvdWxkU3RvcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdDIuc2hvdWxkU3RvcCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQzLnNob3VsZFN0b3ApCisKKworICAgIGRlZiB0ZXN0SGFuZGxlclJlcGxhY2VkQnV0Q2FsbGVkKHNlbGYpOgorICAgICAgICAjIENhbid0IHVzZSBza2lwSWYgZGVjb3JhdG9yIGJlY2F1c2UgdGhlIHNpZ25hbCBoYW5kbGVyIG1heSBoYXZlCisgICAgICAgICMgYmVlbiBjaGFuZ2VkIGFmdGVyIGRlZmluaW5nIHRoaXMgbWV0aG9kLgorICAgICAgICBpZiBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpID09IHNpZ25hbC5TSUdfSUdOOgorICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgidGVzdCByZXF1aXJlcyBTSUdJTlQgdG8gbm90IGJlIGlnbm9yZWQiKQorICAgICAgICAjIElmIG91ciBoYW5kbGVyIGhhcyBiZWVuIHJlcGxhY2VkIChpcyBubyBsb25nZXIgaW5zdGFsbGVkKSBidXQgaXMKKyAgICAgICAgIyBjYWxsZWQgYnkgdGhlICpuZXcqIGhhbmRsZXIsIHRoZW4gaXQgaXNuJ3Qgc2FmZSB0byBkZWxheSB0aGUKKyAgICAgICAgIyBTSUdJTlQgYW5kIHdlIHNob3VsZCBpbW1lZGlhdGVseSBkZWxlZ2F0ZSB0byB0aGUgZGVmYXVsdCBoYW5kbGVyCisgICAgICAgIHVuaXR0ZXN0Lmluc3RhbGxIYW5kbGVyKCkKKworICAgICAgICBoYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICBkZWYgbmV3X2hhbmRsZXIoZnJhbWUsIHNpZ251bSk6CisgICAgICAgICAgICBoYW5kbGVyKGZyYW1lLCBzaWdudW0pCisgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0lOVCwgbmV3X2hhbmRsZXIpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgICAgIG9zLmtpbGwocGlkLCBzaWduYWwuU0lHSU5UKQorICAgICAgICBleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJlcGxhY2VkIGJ1dCBkZWxlZ2F0ZWQgaGFuZGxlciBkb2Vzbid0IHJhaXNlIGludGVycnVwdCIpCisKKyAgICBkZWYgdGVzdFJ1bm5lcihzZWxmKToKKyAgICAgICAgIyBDcmVhdGluZyBhIFRleHRUZXN0UnVubmVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIGFyZ3VtZW50IHNob3VsZAorICAgICAgICAjIHJlZ2lzdGVyIHRoZSBUZXh0VGVzdFJlc3VsdCBpdCBjcmVhdGVzCisgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHN0cmVhbT1TdHJpbmdJTygpKQorCisgICAgICAgIHJlc3VsdCA9IHJ1bm5lci5ydW4odW5pdHRlc3QuVGVzdFN1aXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ocmVzdWx0LCB1bml0dGVzdC5zaWduYWxzLl9yZXN1bHRzKQorCisgICAgZGVmIHRlc3RXZWFrUmVmZXJlbmNlcyhzZWxmKToKKyAgICAgICAgIyBDYWxsaW5nIHJlZ2lzdGVyUmVzdWx0IG9uIGEgcmVzdWx0IHNob3VsZCBub3Qga2VlcCBpdCBhbGl2ZQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdW5pdHRlc3QucmVnaXN0ZXJSZXN1bHQocmVzdWx0KQorCisgICAgICAgIHJlZiA9IHdlYWtyZWYucmVmKHJlc3VsdCkKKyAgICAgICAgZGVsIHJlc3VsdAorCisgICAgICAgICMgRm9yIG5vbi1yZWZlcmVuY2UgY291bnRpbmcgaW1wbGVtZW50YXRpb25zCisgICAgICAgIGdjLmNvbGxlY3QoKTtnYy5jb2xsZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vbmUocmVmKCkpCisKKworICAgIGRlZiB0ZXN0UmVtb3ZlUmVzdWx0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgdW5pdHRlc3QucmVnaXN0ZXJSZXN1bHQocmVzdWx0KQorCisgICAgICAgIHVuaXR0ZXN0Lmluc3RhbGxIYW5kbGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0LnJlbW92ZVJlc3VsdChyZXN1bHQpKQorCisgICAgICAgICMgU2hvdWxkIHRoaXMgcmFpc2UgYW4gZXJyb3IgaW5zdGVhZD8KKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh1bml0dGVzdC5yZW1vdmVSZXN1bHQodW5pdHRlc3QuVGVzdFJlc3VsdCgpKSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdJTlQpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdC5zaG91bGRTdG9wKQorCisgICAgZGVmIHRlc3RNYWluSW5zdGFsbHNIYW5kbGVyKHNlbGYpOgorICAgICAgICBmYWlsZmFzdCA9IG9iamVjdCgpCisgICAgICAgIHRlc3QgPSBvYmplY3QoKQorICAgICAgICB2ZXJib3NpdHkgPSBvYmplY3QoKQorICAgICAgICByZXN1bHQgPSBvYmplY3QoKQorICAgICAgICBkZWZhdWx0X2hhbmRsZXIgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpCisKKyAgICAgICAgY2xhc3MgRmFrZVJ1bm5lcihvYmplY3QpOgorICAgICAgICAgICAgaW5pdEFyZ3MgPSBbXQorICAgICAgICAgICAgcnVuQXJncyA9IFtdCisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgICAgICBzZWxmLmluaXRBcmdzLmFwcGVuZCgoYXJncywga3dhcmdzKSkKKyAgICAgICAgICAgIGRlZiBydW4oc2VsZiwgdGVzdCk6CisgICAgICAgICAgICAgICAgc2VsZi5ydW5BcmdzLmFwcGVuZCh0ZXN0KQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICBjbGFzcyBQcm9ncmFtKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYXRjaGJyZWFrKToKKyAgICAgICAgICAgICAgICBzZWxmLmV4aXQgPSBGYWxzZQorICAgICAgICAgICAgICAgIHNlbGYudmVyYm9zaXR5ID0gdmVyYm9zaXR5CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsZmFzdCA9IGZhaWxmYXN0CisgICAgICAgICAgICAgICAgc2VsZi5jYXRjaGJyZWFrID0gY2F0Y2hicmVhaworICAgICAgICAgICAgICAgIHNlbGYudGVzdFJ1bm5lciA9IEZha2VSdW5uZXIKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3QgPSB0ZXN0CisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBOb25lCisKKyAgICAgICAgcCA9IFByb2dyYW0oRmFsc2UpCisgICAgICAgIHAucnVuVGVzdHMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci5pbml0QXJncywgWygoKSwgeydidWZmZXInOiBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyYm9zaXR5JzogdmVyYm9zaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmFpbGZhc3QnOiBmYWlsZmFzdH0pXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLnJ1bkFyZ3MsIFt0ZXN0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnJlc3VsdCwgcmVzdWx0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgZGVmYXVsdF9oYW5kbGVyKQorCisgICAgICAgIEZha2VSdW5uZXIuaW5pdEFyZ3MgPSBbXQorICAgICAgICBGYWtlUnVubmVyLnJ1bkFyZ3MgPSBbXQorICAgICAgICBwID0gUHJvZ3JhbShUcnVlKQorICAgICAgICBwLnJ1blRlc3RzKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZha2VSdW5uZXIuaW5pdEFyZ3MsIFsoKCksIHsnYnVmZmVyJzogTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZlcmJvc2l0eSc6IHZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZhaWxmYXN0JzogZmFpbGZhc3R9KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci5ydW5BcmdzLCBbdGVzdF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5yZXN1bHQsIHJlc3VsdCkKKworICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCksIGRlZmF1bHRfaGFuZGxlcikKKworICAgIGRlZiB0ZXN0UmVtb3ZlSGFuZGxlcihzZWxmKToKKyAgICAgICAgZGVmYXVsdF9oYW5kbGVyID0gc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKQorICAgICAgICB1bml0dGVzdC5pbnN0YWxsSGFuZGxlcigpCisgICAgICAgIHVuaXR0ZXN0LnJlbW92ZUhhbmRsZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCksIGRlZmF1bHRfaGFuZGxlcikKKworICAgICAgICAjIGNoZWNrIHRoYXQgY2FsbGluZyByZW1vdmVIYW5kbGVyIG11bHRpcGxlIHRpbWVzIGhhcyBubyBpbGwtZWZmZWN0CisgICAgICAgIHVuaXR0ZXN0LnJlbW92ZUhhbmRsZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpZ25hbC5nZXRzaWduYWwoc2lnbmFsLlNJR0lOVCksIGRlZmF1bHRfaGFuZGxlcikKKworICAgIGRlZiB0ZXN0UmVtb3ZlSGFuZGxlckFzRGVjb3JhdG9yKHNlbGYpOgorICAgICAgICBkZWZhdWx0X2hhbmRsZXIgPSBzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpCisgICAgICAgIHVuaXR0ZXN0Lmluc3RhbGxIYW5kbGVyKCkKKworICAgICAgICBAdW5pdHRlc3QucmVtb3ZlSGFuZGxlcgorICAgICAgICBkZWYgdGVzdCgpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaWduYWwuZ2V0c2lnbmFsKHNpZ25hbC5TSUdJTlQpLCBkZWZhdWx0X2hhbmRsZXIpCisKKyAgICAgICAgdGVzdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2lnbmFsLmdldHNpZ25hbChzaWduYWwuU0lHSU5UKSwgZGVmYXVsdF9oYW5kbGVyKQorCitAdW5pdHRlc3Quc2tpcFVubGVzcyhoYXNhdHRyKG9zLCAna2lsbCcpLCAiVGVzdCByZXF1aXJlcyBvcy5raWxsIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09IndpbjMyIiwgIlRlc3QgY2Fubm90IHJ1biBvbiBXaW5kb3dzIikKK0B1bml0dGVzdC5za2lwSWYoc3lzLnBsYXRmb3JtID09ICdmcmVlYnNkNicsICJUZXN0IGtpbGxzIHJlZ3J0ZXN0IG9uIGZyZWVic2Q2ICIKKyAgICAiaWYgdGhyZWFkcyBoYXZlIGJlZW4gdXNlZCIpCitjbGFzcyBUZXN0QnJlYWtEZWZhdWx0SW50SGFuZGxlcihUZXN0QnJlYWspOgorICAgIGludF9oYW5kbGVyID0gc2lnbmFsLmRlZmF1bHRfaW50X2hhbmRsZXIKKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2tpbGwnKSwgIlRlc3QgcmVxdWlyZXMgb3Mua2lsbCIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSJ3aW4zMiIsICJUZXN0IGNhbm5vdCBydW4gb24gV2luZG93cyIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnZnJlZWJzZDYnLCAiVGVzdCBraWxscyByZWdydGVzdCBvbiBmcmVlYnNkNiAiCisgICAgImlmIHRocmVhZHMgaGF2ZSBiZWVuIHVzZWQiKQorY2xhc3MgVGVzdEJyZWFrU2lnbmFsSWdub3JlZChUZXN0QnJlYWspOgorICAgIGludF9oYW5kbGVyID0gc2lnbmFsLlNJR19JR04KKworQHVuaXR0ZXN0LnNraXBVbmxlc3MoaGFzYXR0cihvcywgJ2tpbGwnKSwgIlRlc3QgcmVxdWlyZXMgb3Mua2lsbCIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSJ3aW4zMiIsICJUZXN0IGNhbm5vdCBydW4gb24gV2luZG93cyIpCitAdW5pdHRlc3Quc2tpcElmKHN5cy5wbGF0Zm9ybSA9PSAnZnJlZWJzZDYnLCAiVGVzdCBraWxscyByZWdydGVzdCBvbiBmcmVlYnNkNiAiCisgICAgImlmIHRocmVhZHMgaGF2ZSBiZWVuIHVzZWQiKQorY2xhc3MgVGVzdEJyZWFrU2lnbmFsRGVmYXVsdChUZXN0QnJlYWspOgorICAgIGludF9oYW5kbGVyID0gc2lnbmFsLlNJR19ERkwKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgzY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2JyZWFrLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTgzY2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfYnJlYWsucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X2Nhc2UucHkgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MmIwMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5CkBAIC0wLDAgKzEsMTEyNCBAQAoraW1wb3J0IGRpZmZsaWIKK2ltcG9ydCBwcHJpbnQKK2ltcG9ydCBwaWNrbGUKK2ltcG9ydCByZQoraW1wb3J0IHN5cworCitmcm9tIGNvcHkgaW1wb3J0IGRlZXBjb3B5Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSAuc3VwcG9ydCBpbXBvcnQgKAorICAgIFRlc3RFcXVhbGl0eSwgVGVzdEhhc2hpbmcsIExvZ2dpbmdSZXN1bHQsIFJlc3VsdFdpdGhOb1N0YXJ0VGVzdFJ1blN0b3BUZXN0UnVuCispCisKKworY2xhc3MgVGVzdChvYmplY3QpOgorICAgICJLZWVwIHRoZXNlIFRlc3RDYXNlIGNsYXNzZXMgb3V0IG9mIHRoZSBtYWluIG5hbWVzcGFjZSIKKworICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGRlZiBydW5UZXN0KHNlbGYpOiBwYXNzCisgICAgICAgIGRlZiB0ZXN0MShzZWxmKTogcGFzcworCisgICAgY2xhc3MgQmFyKEZvbyk6CisgICAgICAgIGRlZiB0ZXN0MihzZWxmKTogcGFzcworCisgICAgY2xhc3MgTG9nZ2luZ1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgIiIiQSB0ZXN0IGNhc2Ugd2hpY2ggbG9ncyBpdHMgY2FsbHMuIiIiCisKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGV2ZW50cyk6CisgICAgICAgICAgICBzdXBlcihUZXN0LkxvZ2dpbmdUZXN0Q2FzZSwgc2VsZikuX19pbml0X18oJ3Rlc3QnKQorICAgICAgICAgICAgc2VsZi5ldmVudHMgPSBldmVudHMKKworICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICBzZWxmLmV2ZW50cy5hcHBlbmQoJ3NldFVwJykKKworICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgIHNlbGYuZXZlbnRzLmFwcGVuZCgndGVzdCcpCisKKyAgICAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5ldmVudHMuYXBwZW5kKCd0ZWFyRG93bicpCisKKworY2xhc3MgVGVzdF9UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSwgVGVzdEVxdWFsaXR5LCBUZXN0SGFzaGluZyk6CisKKyAgICAjIyMgU2V0IHVwIGF0dHJpYnV0ZXMgdXNlZCBieSBpbmhlcml0ZWQgdGVzdHMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAjIFVzZWQgYnkgVGVzdEhhc2hpbmcudGVzdF9oYXNoIGFuZCBUZXN0RXF1YWxpdHkudGVzdF9lcQorICAgIGVxX3BhaXJzID0gWyhUZXN0LkZvbygndGVzdDEnKSwgVGVzdC5Gb28oJ3Rlc3QxJykpXQorCisgICAgIyBVc2VkIGJ5IFRlc3RFcXVhbGl0eS50ZXN0X25lCisgICAgbmVfcGFpcnMgPSBbKFRlc3QuRm9vKCd0ZXN0MScpLCBUZXN0LkZvbygncnVuVGVzdCcpKQorICAgICAgICAgICAgICAgLChUZXN0LkZvbygndGVzdDEnKSwgVGVzdC5CYXIoJ3Rlc3QxJykpCisgICAgICAgICAgICAgICAsKFRlc3QuRm9vKCd0ZXN0MScpLCBUZXN0LkJhcigndGVzdDInKSldCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIC9TZXQgdXAgYXR0cmlidXRlcyB1c2VkIGJ5IGluaGVyaXRlZCB0ZXN0cworCisKKyAgICAjICJjbGFzcyBUZXN0Q2FzZShbbWV0aG9kTmFtZV0pIgorICAgICMgLi4uCisgICAgIyAiRWFjaCBpbnN0YW5jZSBvZiBUZXN0Q2FzZSB3aWxsIHJ1biBhIHNpbmdsZSB0ZXN0IG1ldGhvZDogdGhlCisgICAgIyBtZXRob2QgbmFtZWQgbWV0aG9kTmFtZS4iCisgICAgIyAuLi4KKyAgICAjICJtZXRob2ROYW1lIGRlZmF1bHRzIHRvICJydW5UZXN0Ii4iCisgICAgIworICAgICMgTWFrZSBzdXJlIGl0IHJlYWxseSBpcyBvcHRpb25hbCwgYW5kIHRoYXQgaXQgZGVmYXVsdHMgdG8gdGhlIHByb3BlcgorICAgICMgdGhpbmcuCisgICAgZGVmIHRlc3RfaW5pdF9fbm9fdGVzdF9uYW1lKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBydW5UZXN0KHNlbGYpOiByYWlzZSBUeXBlRXJyb3IoKQorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6IHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRlc3QoKS5pZCgpWy0xMzpdLCAnLlRlc3QucnVuVGVzdCcpCisKKyAgICAjICJjbGFzcyBUZXN0Q2FzZShbbWV0aG9kTmFtZV0pIgorICAgICMgLi4uCisgICAgIyAiRWFjaCBpbnN0YW5jZSBvZiBUZXN0Q2FzZSB3aWxsIHJ1biBhIHNpbmdsZSB0ZXN0IG1ldGhvZDogdGhlCisgICAgIyBtZXRob2QgbmFtZWQgbWV0aG9kTmFtZS4iCisgICAgZGVmIHRlc3RfaW5pdF9fdGVzdF9uYW1lX192YWxpZChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgcnVuVGVzdChzZWxmKTogcmFpc2UgVHlwZUVycm9yKCkKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUZXN0KCd0ZXN0JykuaWQoKVstMTA6XSwgJy5UZXN0LnRlc3QnKQorCisgICAgIyAiY2xhc3MgVGVzdENhc2UoW21ldGhvZE5hbWVdKSIKKyAgICAjIC4uLgorICAgICMgIkVhY2ggaW5zdGFuY2Ugb2YgVGVzdENhc2Ugd2lsbCBydW4gYSBzaW5nbGUgdGVzdCBtZXRob2Q6IHRoZQorICAgICMgbWV0aG9kIG5hbWVkIG1ldGhvZE5hbWUuIgorICAgIGRlZiB0ZXN0X2luaXRfX3Rlc3RfbmFtZV9faW52YWxpZChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgcnVuVGVzdChzZWxmKTogcmFpc2UgVHlwZUVycm9yKCkKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOiBwYXNzCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgVGVzdCgndGVzdGZvbycpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAjICJSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGUgdGhpcyB0ZXN0IG9iamVjdC4gRm9yCisgICAgIyBUZXN0Q2FzZSBpbnN0YW5jZXMsIHRoaXMgd2lsbCBhbHdheXMgYmUgMSIKKyAgICBkZWYgdGVzdF9jb3VudFRlc3RDYXNlcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOiBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGb28oJ3Rlc3QnKS5jb3VudFRlc3RDYXNlcygpLCAxKQorCisgICAgIyAiUmV0dXJuIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGVzdCByZXN1bHQgb2JqZWN0IHRvIGJlIHVzZWQgdG8gcnVuIHRoaXMKKyAgICAjIHRlc3QuIEZvciBUZXN0Q2FzZSBpbnN0YW5jZXMsIHRoaXMgd2lsbCBhbHdheXMgYmUKKyAgICAjIHVuaXR0ZXN0LlRlc3RSZXN1bHQ7ICBzdWJjbGFzc2VzIG9mIFRlc3RDYXNlIHNob3VsZAorICAgICMgb3ZlcnJpZGUgdGhpcyBhcyBuZWNlc3NhcnkuIgorICAgIGRlZiB0ZXN0X2RlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJlc3VsdCA9IEZvbygpLmRlZmF1bHRUZXN0UmVzdWx0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIHVuaXR0ZXN0LlRlc3RSZXN1bHQpCisKKyAgICAjICJXaGVuIGEgc2V0VXAoKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlIHRlc3QgcnVubmVyIHdpbGwgcnVuIHRoYXQgbWV0aG9kCisgICAgIyBwcmlvciB0byBlYWNoIHRlc3QuIExpa2V3aXNlLCBpZiBhIHRlYXJEb3duKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZQorICAgICMgdGVzdCBydW5uZXIgd2lsbCBpbnZva2UgdGhhdCBtZXRob2QgYWZ0ZXIgZWFjaCB0ZXN0LiBJbiB0aGUgZXhhbXBsZSwKKyAgICAjIHNldFVwKCkgd2FzIHVzZWQgdG8gY3JlYXRlIGEgZnJlc2ggc2VxdWVuY2UgZm9yIGVhY2ggdGVzdC4iCisgICAgIworICAgICMgTWFrZSBzdXJlIHRoZSBwcm9wZXIgY2FsbCBvcmRlciBpcyBtYWludGFpbmVkLCBldmVuIGlmIHNldFVwKCkgcmFpc2VzCisgICAgIyBhbiBleGNlcHRpb24uCisgICAgZGVmIHRlc3RfcnVuX2NhbGxfb3JkZXJfX2Vycm9yX2luX3NldFVwKHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKworICAgICAgICBjbGFzcyBGb28oVGVzdC5Mb2dnaW5nVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZvbywgc2VsZikuc2V0VXAoKQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigncmFpc2VkIGJ5IEZvby5zZXRVcCcpCisKKyAgICAgICAgRm9vKGV2ZW50cykucnVuKHJlc3VsdCkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdCcsICdzZXRVcCcsICdhZGRFcnJvcicsICdzdG9wVGVzdCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldpdGggYSB0ZW1wb3JhcnkgcmVzdWx0IHN0b3BUZXN0UnVuIGlzIGNhbGxlZCB3aGVuIHNldFVwIGVycm9ycy4KKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fc2V0VXBfZGVmYXVsdF9yZXN1bHQoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisKKyAgICAgICAgY2xhc3MgRm9vKFRlc3QuTG9nZ2luZ1Rlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBkZWZhdWx0VGVzdFJlc3VsdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9nZ2luZ1Jlc3VsdChzZWxmLmV2ZW50cykKKworICAgICAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZvbywgc2VsZikuc2V0VXAoKQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigncmFpc2VkIGJ5IEZvby5zZXRVcCcpCisKKyAgICAgICAgRm9vKGV2ZW50cykucnVuKCkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdFJ1bicsICdzdGFydFRlc3QnLCAnc2V0VXAnLCAnYWRkRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAnc3RvcFRlc3QnLCAnc3RvcFRlc3RSdW4nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAjICJXaGVuIGEgc2V0VXAoKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlIHRlc3QgcnVubmVyIHdpbGwgcnVuIHRoYXQgbWV0aG9kCisgICAgIyBwcmlvciB0byBlYWNoIHRlc3QuIExpa2V3aXNlLCBpZiBhIHRlYXJEb3duKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZQorICAgICMgdGVzdCBydW5uZXIgd2lsbCBpbnZva2UgdGhhdCBtZXRob2QgYWZ0ZXIgZWFjaCB0ZXN0LiBJbiB0aGUgZXhhbXBsZSwKKyAgICAjIHNldFVwKCkgd2FzIHVzZWQgdG8gY3JlYXRlIGEgZnJlc2ggc2VxdWVuY2UgZm9yIGVhY2ggdGVzdC4iCisgICAgIworICAgICMgTWFrZSBzdXJlIHRoZSBwcm9wZXIgY2FsbCBvcmRlciBpcyBtYWludGFpbmVkLCBldmVuIGlmIHRoZSB0ZXN0IHJhaXNlcworICAgICMgYW4gZXJyb3IgKGFzIG9wcG9zZWQgdG8gYSBmYWlsdXJlKS4KKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fdGVzdChzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisKKyAgICAgICAgY2xhc3MgRm9vKFRlc3QuTG9nZ2luZ1Rlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZvbywgc2VsZikudGVzdCgpCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdyYWlzZWQgYnkgRm9vLnRlc3QnKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICdhZGRFcnJvcicsICd0ZWFyRG93bicsCisgICAgICAgICAgICAgICAgICAgICdzdG9wVGVzdCddCisgICAgICAgIEZvbyhldmVudHMpLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldpdGggYSBkZWZhdWx0IHJlc3VsdCwgYW4gZXJyb3IgaW4gdGhlIHRlc3Qgc3RpbGwgcmVzdWx0cyBpbiBzdG9wVGVzdFJ1bgorICAgICMgYmVpbmcgY2FsbGVkLiIKKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fdGVzdF9kZWZhdWx0X3Jlc3VsdChzZWxmKToKKyAgICAgICAgZXZlbnRzID0gW10KKworICAgICAgICBjbGFzcyBGb28oVGVzdC5Mb2dnaW5nVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIGRlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBMb2dnaW5nUmVzdWx0KHNlbGYuZXZlbnRzKQorCisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBzdXBlcihGb28sIHNlbGYpLnRlc3QoKQorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigncmFpc2VkIGJ5IEZvby50ZXN0JykKKworICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0UnVuJywgJ3N0YXJ0VGVzdCcsICdzZXRVcCcsICd0ZXN0JywgJ2FkZEVycm9yJywKKyAgICAgICAgICAgICAgICAgICAgJ3RlYXJEb3duJywgJ3N0b3BUZXN0JywgJ3N0b3BUZXN0UnVuJ10KKyAgICAgICAgRm9vKGV2ZW50cykucnVuKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2hlbiBhIHNldFVwKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZSB0ZXN0IHJ1bm5lciB3aWxsIHJ1biB0aGF0IG1ldGhvZAorICAgICMgcHJpb3IgdG8gZWFjaCB0ZXN0LiBMaWtld2lzZSwgaWYgYSB0ZWFyRG93bigpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUKKyAgICAjIHRlc3QgcnVubmVyIHdpbGwgaW52b2tlIHRoYXQgbWV0aG9kIGFmdGVyIGVhY2ggdGVzdC4gSW4gdGhlIGV4YW1wbGUsCisgICAgIyBzZXRVcCgpIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGZyZXNoIHNlcXVlbmNlIGZvciBlYWNoIHRlc3QuIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGNhbGwgb3JkZXIgaXMgbWFpbnRhaW5lZCwgZXZlbiBpZiB0aGUgdGVzdCBzaWduYWxzCisgICAgIyBhIGZhaWx1cmUgKGFzIG9wcG9zZWQgdG8gYW4gZXJyb3IpLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19mYWlsdXJlX2luX3Rlc3Qoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGNsYXNzIEZvbyhUZXN0LkxvZ2dpbmdUZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBzdXBlcihGb28sIHNlbGYpLnRlc3QoKQorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgncmFpc2VkIGJ5IEZvby50ZXN0JykKKworICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ3NldFVwJywgJ3Rlc3QnLCAnYWRkRmFpbHVyZScsICd0ZWFyRG93bicsCisgICAgICAgICAgICAgICAgICAgICdzdG9wVGVzdCddCisgICAgICAgIEZvbyhldmVudHMpLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldoZW4gYSB0ZXN0IGZhaWxzIHdpdGggYSBkZWZhdWx0IHJlc3VsdCBzdG9wVGVzdFJ1biBpcyBzdGlsbCBjYWxsZWQuIgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19mYWlsdXJlX2luX3Rlc3RfZGVmYXVsdF9yZXN1bHQoc2VsZik6CisKKyAgICAgICAgY2xhc3MgRm9vKFRlc3QuTG9nZ2luZ1Rlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBkZWZhdWx0VGVzdFJlc3VsdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9nZ2luZ1Jlc3VsdChzZWxmLmV2ZW50cykKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHN1cGVyKEZvbywgc2VsZikudGVzdCgpCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdyYWlzZWQgYnkgRm9vLnRlc3QnKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3RSdW4nLCAnc3RhcnRUZXN0JywgJ3NldFVwJywgJ3Rlc3QnLCAnYWRkRmFpbHVyZScsCisgICAgICAgICAgICAgICAgICAgICd0ZWFyRG93bicsICdzdG9wVGVzdCcsICdzdG9wVGVzdFJ1biddCisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIEZvbyhldmVudHMpLnJ1bigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldoZW4gYSBzZXRVcCgpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUgdGVzdCBydW5uZXIgd2lsbCBydW4gdGhhdCBtZXRob2QKKyAgICAjIHByaW9yIHRvIGVhY2ggdGVzdC4gTGlrZXdpc2UsIGlmIGEgdGVhckRvd24oKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlCisgICAgIyB0ZXN0IHJ1bm5lciB3aWxsIGludm9rZSB0aGF0IG1ldGhvZCBhZnRlciBlYWNoIHRlc3QuIEluIHRoZSBleGFtcGxlLAorICAgICMgc2V0VXAoKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBmcmVzaCBzZXF1ZW5jZSBmb3IgZWFjaCB0ZXN0LiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhlIHByb3BlciBjYWxsIG9yZGVyIGlzIG1haW50YWluZWQsIGV2ZW4gaWYgdGVhckRvd24oKSByYWlzZXMKKyAgICAjIGFuIGV4Y2VwdGlvbi4KKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fdGVhckRvd24oc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGNsYXNzIEZvbyhUZXN0LkxvZ2dpbmdUZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICAgICAgICAgc3VwZXIoRm9vLCBzZWxmKS50ZWFyRG93bigpCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdyYWlzZWQgYnkgRm9vLnRlYXJEb3duJykKKworICAgICAgICBGb28oZXZlbnRzKS5ydW4ocmVzdWx0KQorICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ3NldFVwJywgJ3Rlc3QnLCAndGVhckRvd24nLCAnYWRkRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAnc3RvcFRlc3QnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAjICJXaGVuIHRlYXJEb3duIGVycm9ycyB3aXRoIGEgZGVmYXVsdCByZXN1bHQgc3RvcFRlc3RSdW4gaXMgc3RpbGwgY2FsbGVkLiIKKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fdGVhckRvd25fZGVmYXVsdF9yZXN1bHQoc2VsZik6CisKKyAgICAgICAgY2xhc3MgRm9vKFRlc3QuTG9nZ2luZ1Rlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBkZWZhdWx0VGVzdFJlc3VsdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9nZ2luZ1Jlc3VsdChzZWxmLmV2ZW50cykKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgICAgICAgICBzdXBlcihGb28sIHNlbGYpLnRlYXJEb3duKCkKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3JhaXNlZCBieSBGb28udGVhckRvd24nKQorCisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIEZvbyhldmVudHMpLnJ1bigpCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3RSdW4nLCAnc3RhcnRUZXN0JywgJ3NldFVwJywgJ3Rlc3QnLCAndGVhckRvd24nLAorICAgICAgICAgICAgICAgICAgICAnYWRkRXJyb3InLCAnc3RvcFRlc3QnLCAnc3RvcFRlc3RSdW4nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAjICJUZXN0Q2FzZS5ydW4oKSBzdGlsbCB3b3JrcyB3aGVuIHRoZSBkZWZhdWx0VGVzdFJlc3VsdCBpcyBhIFRlc3RSZXN1bHQKKyAgICAjIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBzdGFydFRlc3RSdW4gYW5kIHN0b3BUZXN0UnVuLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX2RlZmF1bHRfcmVzdWx0KHNlbGYpOgorCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgZGVmYXVsdFRlc3RSZXN1bHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFdpdGhOb1N0YXJ0VGVzdFJ1blN0b3BUZXN0UnVuKCkKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBGb28oJ3Rlc3QnKS5ydW4oKQorCisgICAgIyAiVGhpcyBjbGFzcyBhdHRyaWJ1dGUgZ2l2ZXMgdGhlIGV4Y2VwdGlvbiByYWlzZWQgYnkgdGhlIHRlc3QoKSBtZXRob2QuCisgICAgIyBJZiBhIHRlc3QgZnJhbWV3b3JrIG5lZWRzIHRvIHVzZSBhIHNwZWNpYWxpemVkIGV4Y2VwdGlvbiwgcG9zc2libHkgdG8KKyAgICAjIGNhcnJ5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIGl0IG11c3Qgc3ViY2xhc3MgdGhpcyBleGNlcHRpb24gaW4KKyAgICAjIG9yZGVyIHRvIGBgcGxheSBmYWlyJycgd2l0aCB0aGUgZnJhbWV3b3JrLiAgVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhpcworICAgICMgYXR0cmlidXRlIGlzIEFzc2VydGlvbkVycm9yIgorICAgIGRlZiB0ZXN0X2ZhaWx1cmVFeGNlcHRpb25fX2RlZmF1bHQoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKEZvbygndGVzdCcpLmZhaWx1cmVFeGNlcHRpb24gaXMgQXNzZXJ0aW9uRXJyb3IpCisKKyAgICAjICJUaGlzIGNsYXNzIGF0dHJpYnV0ZSBnaXZlcyB0aGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgdGVzdCgpIG1ldGhvZC4KKyAgICAjIElmIGEgdGVzdCBmcmFtZXdvcmsgbmVlZHMgdG8gdXNlIGEgc3BlY2lhbGl6ZWQgZXhjZXB0aW9uLCBwb3NzaWJseSB0bworICAgICMgY2FycnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiwgaXQgbXVzdCBzdWJjbGFzcyB0aGlzIGV4Y2VwdGlvbiBpbgorICAgICMgb3JkZXIgdG8gYGBwbGF5IGZhaXInJyB3aXRoIHRoZSBmcmFtZXdvcmsuIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSBUZXN0Q2FzZS5ydW4oKSByZXNwZWN0cyB0aGUgZGVzaWduYXRlZCBmYWlsdXJlRXhjZXB0aW9uCisgICAgZGVmIHRlc3RfZmFpbHVyZUV4Y2VwdGlvbl9fc3ViY2xhc3NpbmdfX2V4cGxpY2l0X3JhaXNlKHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKworICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCkKKworICAgICAgICAgICAgZmFpbHVyZUV4Y2VwdGlvbiA9IFJ1bnRpbWVFcnJvcgorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGb28oJ3Rlc3QnKS5mYWlsdXJlRXhjZXB0aW9uIGlzIFJ1bnRpbWVFcnJvcikKKworCisgICAgICAgIEZvbygndGVzdCcpLnJ1bihyZXN1bHQpCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnYWRkRmFpbHVyZScsICdzdG9wVGVzdCddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIlRoaXMgY2xhc3MgYXR0cmlidXRlIGdpdmVzIHRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoZSB0ZXN0KCkgbWV0aG9kLgorICAgICMgSWYgYSB0ZXN0IGZyYW1ld29yayBuZWVkcyB0byB1c2UgYSBzcGVjaWFsaXplZCBleGNlcHRpb24sIHBvc3NpYmx5IHRvCisgICAgIyBjYXJyeSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBpdCBtdXN0IHN1YmNsYXNzIHRoaXMgZXhjZXB0aW9uIGluCisgICAgIyBvcmRlciB0byBgYHBsYXkgZmFpcicnIHdpdGggdGhlIGZyYW1ld29yay4iCisgICAgIworICAgICMgTWFrZSBzdXJlIFRlc3RDYXNlLnJ1bigpIHJlc3BlY3RzIHRoZSBkZXNpZ25hdGVkIGZhaWx1cmVFeGNlcHRpb24KKyAgICBkZWYgdGVzdF9mYWlsdXJlRXhjZXB0aW9uX19zdWJjbGFzc2luZ19faW1wbGljaXRfcmFpc2Uoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoImZvbyIpCisKKyAgICAgICAgICAgIGZhaWx1cmVFeGNlcHRpb24gPSBSdW50aW1lRXJyb3IKKworICAgICAgICBzZWxmLmFzc2VydFRydWUoRm9vKCd0ZXN0JykuZmFpbHVyZUV4Y2VwdGlvbiBpcyBSdW50aW1lRXJyb3IpCisKKworICAgICAgICBGb28oJ3Rlc3QnKS5ydW4ocmVzdWx0KQorICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ2FkZEZhaWx1cmUnLCAnc3RvcFRlc3QnXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICAjICJUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIgorICAgIGRlZiB0ZXN0X3NldFVwKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICMgLi4uIGFuZCBub3RoaW5nIHNob3VsZCBoYXBwZW4KKyAgICAgICAgRm9vKCkuc2V0VXAoKQorCisgICAgIyAiVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLiIKKyAgICBkZWYgdGVzdF90ZWFyRG93bihzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBydW5UZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIC4uLiBhbmQgbm90aGluZyBzaG91bGQgaGFwcGVuCisgICAgICAgIEZvbygpLnRlYXJEb3duKCkKKworICAgICMgIlJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyB0aGUgc3BlY2lmaWMgdGVzdCBjYXNlLiIKKyAgICAjCisgICAgIyBCZWNhdXNlIG9mIHRoZSB2YWd1ZSBuYXR1cmUgb2YgdGhlIGRvY3MsIEknbSBub3QgZ29pbmcgdG8gbG9jayB0aGlzCisgICAgIyB0ZXN0IGRvd24gdG9vIG11Y2guIFJlYWxseSBhbGwgdGhhdCBjYW4gYmUgYXNzZXJ0ZWQgaXMgdGhhdCB0aGUgaWQoKQorICAgICMgd2lsbCBiZSBhIHN0cmluZyAoZWl0aGVyIDgtYnl0ZSBvciB1bmljb2RlIC0tIGFnYWluLCBiZWNhdXNlIHRoZSBkb2NzCisgICAgIyBqdXN0IHNheSAic3RyaW5nIikKKyAgICBkZWYgdGVzdF9pZChzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBydW5UZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoRm9vKCkuaWQoKSwgYmFzZXN0cmluZykKKworICAgICMgIklmIHJlc3VsdCBpcyBvbWl0dGVkIG9yIE5vbmUsIGEgdGVtcG9yYXJ5IHJlc3VsdCBvYmplY3QgaXMgY3JlYXRlZAorICAgICMgYW5kIHVzZWQsIGJ1dCBpcyBub3QgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxlci4gQXMgVGVzdENhc2Ugb3ducyB0aGUKKyAgICAjIHRlbXBvcmFyeSByZXN1bHQgc3RhcnRUZXN0UnVuIGFuZCBzdG9wVGVzdFJ1biBhcmUgY2FsbGVkLgorCisgICAgZGVmIHRlc3RfcnVuX191c2VzX2RlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKCd0ZXN0JykKKworICAgICAgICAgICAgZGVmIGRlZmF1bHRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKworICAgICAgICAjIE1ha2UgcnVuKCkgZmluZCBhIHJlc3VsdCBvYmplY3Qgb24gaXRzIG93bgorICAgICAgICBGb28oJ3Rlc3QnKS5ydW4oKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3RSdW4nLCAnc3RhcnRUZXN0JywgJ3Rlc3QnLCAnYWRkU3VjY2VzcycsCisgICAgICAgICAgICAnc3RvcFRlc3QnLCAnc3RvcFRlc3RSdW4nXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdFNob3J0RGVzY3JpcHRpb25XaXRob3V0RG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShzZWxmLnNob3J0RGVzY3JpcHRpb24oKSkKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0U2hvcnREZXNjcmlwdGlvbldpdGhPbmVMaW5lRG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJUZXN0cyBzaG9ydERlc2NyaXB0aW9uKCkgZm9yIGEgbWV0aG9kIHdpdGggYSBkb2NzdHJpbmcuIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgc2VsZi5zaG9ydERlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAgICAgJ1Rlc3RzIHNob3J0RGVzY3JpcHRpb24oKSBmb3IgYSBtZXRob2Qgd2l0aCBhIGRvY3N0cmluZy4nKQorCisgICAgQHVuaXR0ZXN0LnNraXBJZihzeXMuZmxhZ3Mub3B0aW1pemUgPj0gMiwKKyAgICAgICAgICAgICAgICAgICAgICJEb2NzdHJpbmdzIGFyZSBvbWl0dGVkIHdpdGggLU8yIGFuZCBhYm92ZSIpCisgICAgZGVmIHRlc3RTaG9ydERlc2NyaXB0aW9uV2l0aE11bHRpTGluZURvY3N0cmluZyhzZWxmKToKKyAgICAgICAgIiIiVGVzdHMgc2hvcnREZXNjcmlwdGlvbigpIGZvciBhIG1ldGhvZCB3aXRoIGEgbG9uZ2VyIGRvY3N0cmluZy4KKworICAgICAgICBUaGlzIG1ldGhvZCBlbnN1cmVzIHRoYXQgb25seSB0aGUgZmlyc3QgbGluZSBvZiBhIGRvY3N0cmluZyBpcworICAgICAgICByZXR1cm5lZCB1c2VkIGluIHRoZSBzaG9ydCBkZXNjcmlwdGlvbiwgbm8gbWF0dGVyIGhvdyBsb25nIHRoZQorICAgICAgICB3aG9sZSB0aGluZyBpcy4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgc2VsZi5zaG9ydERlc2NyaXB0aW9uKCksCisgICAgICAgICAgICAgICAgICdUZXN0cyBzaG9ydERlc2NyaXB0aW9uKCkgZm9yIGEgbWV0aG9kIHdpdGggYSBsb25nZXIgJworICAgICAgICAgICAgICAgICAnZG9jc3RyaW5nLicpCisKKyAgICBkZWYgdGVzdEFkZFR5cGVFcXVhbGl0eUZ1bmMoc2VsZik6CisgICAgICAgIGNsYXNzIFNhZFNuYWtlKG9iamVjdCk6CisgICAgICAgICAgICAiIiJEdW1teSBjbGFzcyBmb3IgdGVzdF9hZGRUeXBlRXF1YWxpdHlGdW5jLiIiIgorICAgICAgICBzMSwgczIgPSBTYWRTbmFrZSgpLCBTYWRTbmFrZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoczEsIHMyKQorICAgICAgICBkZWYgQWxsU25ha2VzQ3JlYXRlZEVxdWFsKGEsIGIsIG1zZz1Ob25lKToKKyAgICAgICAgICAgIHJldHVybiB0eXBlKGEpIGlzIHR5cGUoYikgaXMgU2FkU25ha2UKKyAgICAgICAgc2VsZi5hZGRUeXBlRXF1YWxpdHlGdW5jKFNhZFNuYWtlLCBBbGxTbmFrZXNDcmVhdGVkRXF1YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczEsIHMyKQorICAgICAgICAjIE5vIHRoaXMgZG9lc24ndCBjbGVhbiB1cCBhbmQgcmVtb3ZlIHRoZSBTYWRTbmFrZSBlcXVhbGl0eSBmdW5jCisgICAgICAgICMgZnJvbSB0aGlzIFRlc3RDYXNlIGluc3RhbmNlIGJ1dCBzaW5jZSBpdHMgYSBsb2NhbCBub3RoaW5nIGVsc2UKKyAgICAgICAgIyB3aWxsIGV2ZXIgbm90aWNlIHRoYXQuCisKKyAgICBkZWYgdGVzdEFzc2VydElzKHNlbGYpOgorICAgICAgICB0aGluZyA9IG9iamVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXModGhpbmcsIHRoaW5nKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXMsIHRoaW5nLCBvYmplY3QoKSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0SXNOb3Qoc2VsZik6CisgICAgICAgIHRoaW5nID0gb2JqZWN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdCh0aGluZywgb2JqZWN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJc05vdCwgdGhpbmcsIHRoaW5nKQorCisgICAgZGVmIHRlc3RBc3NlcnRJc0luc3RhbmNlKHNlbGYpOgorICAgICAgICB0aGluZyA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0aGluZywgbGlzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydElzSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLCBkaWN0KQorCisgICAgZGVmIHRlc3RBc3NlcnROb3RJc0luc3RhbmNlKHNlbGYpOgorICAgICAgICB0aGluZyA9IFtdCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SXNJbnN0YW5jZSh0aGluZywgZGljdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydE5vdElzSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaW5nLCBsaXN0KQorCisgICAgZGVmIHRlc3RBc3NlcnRJbihzZWxmKToKKyAgICAgICAgYW5pbWFscyA9IHsnbW9ua2V5JzogJ2JhbmFuYScsICdjb3cnOiAnZ3Jhc3MnLCAnc2VhbCc6ICdmaXNoJ30KKworICAgICAgICBzZWxmLmFzc2VydEluKCdhJywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4oMiwgWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydEluKCdtb25rZXknLCBhbmltYWxzKQorCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ2QnLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbigwLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oJ290dGVyJywgYW5pbWFscykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SW4sICd4JywgJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJbiwgNCwgWzEsIDIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SW4sICdlbGVwaGFudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hbHMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydE5vdEluLCAnYycsICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0Tm90SW4sIDEsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydE5vdEluLCAnY293JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWFscykKKworICAgIGRlZiB0ZXN0QXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7fSwge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHt9LCB7J2EnOiAxfSkKKyAgICAgICAgc2VsZi5hc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoeydhJzogMX0sIHsnYSc6IDF9KQorICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7J2EnOiAxfSwgeydhJzogMSwgJ2InOiAyfSkKKyAgICAgICAgc2VsZi5hc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoeydhJzogMSwgJ2InOiAyfSwgeydhJzogMSwgJ2InOiAyfSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7MTogIm9uZSJ9LCB7fSkKKworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbik6CisgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RDb250YWluc1N1YnNldCh7J2EnOiAyfSwgeydhJzogMX0pCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24pOgorICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoeydjJzogMX0sIHsnYSc6IDF9KQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHsnYSc6IDEsICdjJzogMX0sIHsnYSc6IDF9KQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RGljdENvbnRhaW5zU3Vic2V0KHsnYSc6IDEsICdjJzogMX0sIHsnYSc6IDF9KQorCisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgiIiwgVW5pY29kZVdhcm5pbmcpKToKKyAgICAgICAgICAgIG9uZSA9ICcnLmpvaW4oY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NSkpCisgICAgICAgICAgICAjIHRoaXMgdXNlZCB0byBjYXVzZSBhIFVuaWNvZGVEZWNvZGVFcnJvciBjb25zdHJ1Y3RpbmcgdGhlIGZhaWx1cmUgbXNnCisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbik6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnREaWN0Q29udGFpbnNTdWJzZXQoeydmb28nOiBvbmV9LCB7J2Zvbyc6IHUnXHVGRkZEJ30pCisKKyAgICBkZWYgdGVzdEFzc2VydEVxdWFsKHNlbGYpOgorICAgICAgICBlcXVhbF9wYWlycyA9IFsKKyAgICAgICAgICAgICAgICAoKCksICgpKSwKKyAgICAgICAgICAgICAgICAoe30sIHt9KSwKKyAgICAgICAgICAgICAgICAoW10sIFtdKSwKKyAgICAgICAgICAgICAgICAoc2V0KCksIHNldCgpKSwKKyAgICAgICAgICAgICAgICAoZnJvemVuc2V0KCksIGZyb3plbnNldCgpKV0KKyAgICAgICAgZm9yIGEsIGIgaW4gZXF1YWxfcGFpcnM6CisgICAgICAgICAgICAjIFRoaXMgbWVzcyBvZiB0cnkgZXhjZXB0cyBpcyB0byB0ZXN0IHRoZSBhc3NlcnRFcXVhbCBiZWhhdmlvcgorICAgICAgICAgICAgIyBpdHNlbGYuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBiKQorICAgICAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydEVxdWFsKCVyLCAlcikgZmFpbGVkJyAlIChhLCBiKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIsIG1zZz0nZm9vJykKKyAgICAgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb246CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCdhc3NlcnRFcXVhbCglciwgJXIpIHdpdGggbXNnPSBmYWlsZWQnICUgKGEsIGIpKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYiwgJ2ZvbycpCisgICAgICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgnYXNzZXJ0RXF1YWwoJXIsICVyKSB3aXRoIHRoaXJkIHBhcmFtZXRlciBmYWlsZWQnICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGEsIGIpKQorCisgICAgICAgIHVuZXF1YWxfcGFpcnMgPSBbCisgICAgICAgICAgICAgICAoKCksIFtdKSwKKyAgICAgICAgICAgICAgICh7fSwgc2V0KCkpLAorICAgICAgICAgICAgICAgKHNldChbNCwxXSksIGZyb3plbnNldChbNCwyXSkpLAorICAgICAgICAgICAgICAgKGZyb3plbnNldChbNCw1XSksIHNldChbMiwzXSkpLAorICAgICAgICAgICAgICAgKHNldChbMyw0XSksIHNldChbNSw0XSkpXQorICAgICAgICBmb3IgYSwgYiBpbiB1bmVxdWFsX3BhaXJzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEVxdWFsLCBhLCBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEVxdWFsLCBhLCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0RXF1YWwsIGEsIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J2ZvbycpCisKKyAgICBkZWYgdGVzdEVxdWFsaXR5KHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydExpc3RFcXVhbChbXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHVwbGVFcXVhbCgoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgKCkpCisKKyAgICAgICAgYSA9IFswLCAnYScsIFtdXQorICAgICAgICBiID0gW10KKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXModW5pdHRlc3QuVGVzdENhc2UuZmFpbHVyZUV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwsIGEsIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVuaXR0ZXN0LlRlc3RDYXNlLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0TGlzdEVxdWFsLCB0dXBsZShhKSwgdHVwbGUoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVuaXR0ZXN0LlRlc3RDYXNlLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbCwgYSwgdHVwbGUoYikpCisKKyAgICAgICAgYi5leHRlbmQoYSkKKyAgICAgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoYSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUdXBsZUVxdWFsKHR1cGxlKGEpLCB0dXBsZShiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKGEsIHR1cGxlKGIpKQorICAgICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwodHVwbGUoYSksIGIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExpc3RFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYSwgdHVwbGUoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRUdXBsZUVxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZShhKSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExpc3RFcXVhbCwgTm9uZSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFR1cGxlRXF1YWwsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlKGIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSwgdHVwbGUoYikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMaXN0RXF1YWwsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRUdXBsZUVxdWFsLCAxLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSkKKworICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbCh7fSwge30pCisKKyAgICAgICAgYyA9IHsgJ3gnOiAxIH0KKyAgICAgICAgZCA9IHt9CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHVuaXR0ZXN0LlRlc3RDYXNlLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsLCBjLCBkKQorCisgICAgICAgIGQudXBkYXRlKGMpCisgICAgICAgIHNlbGYuYXNzZXJ0RGljdEVxdWFsKGMsIGQpCisKKyAgICAgICAgZFsneCddID0gMAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh1bml0dGVzdC5UZXN0Q2FzZS5mYWlsdXJlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydERpY3RFcXVhbCwgYywgZCwgJ1RoZXNlIGFyZSB1bmVxdWFsJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0RGljdEVxdWFsLCBOb25lLCBkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0RGljdEVxdWFsLCBbXSwgZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydERpY3RFcXVhbCwgMSwgMSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0U2VxdWVuY2VFcXVhbE1heERpZmYoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5tYXhEaWZmLCA4MCo4KQorICAgICAgICBzZXExID0gJ2EnICsgJ3gnICogODAqKjIKKyAgICAgICAgc2VxMiA9ICdiJyArICd4JyAqIDgwKioyCisgICAgICAgIGRpZmYgPSAnXG4nLmpvaW4oZGlmZmxpYi5uZGlmZihwcHJpbnQucGZvcm1hdChzZXExKS5zcGxpdGxpbmVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcHJpbnQucGZvcm1hdChzZXEyKS5zcGxpdGxpbmVzKCkpKQorICAgICAgICAjIHRoZSArMSBpcyB0aGUgbGVhZGluZyBcbiBhZGRlZCBieSBhc3NlcnRTZXF1ZW5jZUVxdWFsCisgICAgICAgIG9taXR0ZWQgPSB1bml0dGVzdC5jYXNlLkRJRkZfT01JVFRFRCAlIChsZW4oZGlmZikgKyAxLCkKKworICAgICAgICBzZWxmLm1heERpZmYgPSBsZW4oZGlmZikvLzIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKHNlcTEsIHNlcTIpCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIG1zZyA9IGUuYXJnc1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdhc3NlcnRTZXF1ZW5jZUVxdWFsIGRpZCBub3QgZmFpbC4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG1zZykgPCBsZW4oZGlmZikpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ob21pdHRlZCwgbXNnKQorCisgICAgICAgIHNlbGYubWF4RGlmZiA9IGxlbihkaWZmKSAqIDIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKHNlcTEsIHNlcTIpCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIG1zZyA9IGUuYXJnc1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdhc3NlcnRTZXF1ZW5jZUVxdWFsIGRpZCBub3QgZmFpbC4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG1zZykgPiBsZW4oZGlmZikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ob21pdHRlZCwgbXNnKQorCisgICAgICAgIHNlbGYubWF4RGlmZiA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKHNlcTEsIHNlcTIpCisgICAgICAgIGV4Y2VwdCBzZWxmLmZhaWx1cmVFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAgIG1zZyA9IGUuYXJnc1swXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCdhc3NlcnRTZXF1ZW5jZUVxdWFsIGRpZCBub3QgZmFpbC4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG1zZykgPiBsZW4oZGlmZikpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4ob21pdHRlZCwgbXNnKQorCisgICAgZGVmIHRlc3RUcnVuY2F0ZU1lc3NhZ2Uoc2VsZik6CisgICAgICAgIHNlbGYubWF4RGlmZiA9IDEKKyAgICAgICAgbWVzc2FnZSA9IHNlbGYuX3RydW5jYXRlTWVzc2FnZSgnZm9vJywgJ2JhcicpCisgICAgICAgIG9taXR0ZWQgPSB1bml0dGVzdC5jYXNlLkRJRkZfT01JVFRFRCAlIGxlbignYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCAnZm9vJyArIG9taXR0ZWQpCisKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQorICAgICAgICBtZXNzYWdlID0gc2VsZi5fdHJ1bmNhdGVNZXNzYWdlKCdmb28nLCAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCAnZm9vYmFyJykKKworICAgICAgICBzZWxmLm1heERpZmYgPSA0CisgICAgICAgIG1lc3NhZ2UgPSBzZWxmLl90cnVuY2F0ZU1lc3NhZ2UoJ2ZvbycsICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsICdmb29iYXInKQorCisgICAgZGVmIHRlc3RBc3NlcnREaWN0RXF1YWxUcnVuY2F0ZXMoc2VsZik6CisgICAgICAgIHRlc3QgPSB1bml0dGVzdC5UZXN0Q2FzZSgnYXNzZXJ0RXF1YWwnKQorICAgICAgICBkZWYgdHJ1bmNhdGUobXNnLCBkaWZmKToKKyAgICAgICAgICAgIHJldHVybiAnZm9vJworICAgICAgICB0ZXN0Ll90cnVuY2F0ZU1lc3NhZ2UgPSB0cnVuY2F0ZQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXN0LmFzc2VydERpY3RFcXVhbCh7fSwgezE6IDB9KQorICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJ2ZvbycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydERpY3RFcXVhbCBkaWQgbm90IGZhaWwnKQorCisgICAgZGVmIHRlc3RBc3NlcnRNdWx0aUxpbmVFcXVhbFRydW5jYXRlcyhzZWxmKToKKyAgICAgICAgdGVzdCA9IHVuaXR0ZXN0LlRlc3RDYXNlKCdhc3NlcnRFcXVhbCcpCisgICAgICAgIGRlZiB0cnVuY2F0ZShtc2csIGRpZmYpOgorICAgICAgICAgICAgcmV0dXJuICdmb28nCisgICAgICAgIHRlc3QuX3RydW5jYXRlTWVzc2FnZSA9IHRydW5jYXRlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3QuYXNzZXJ0TXVsdGlMaW5lRXF1YWwoJ2ZvbycsICdiYXInKQorICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJ2ZvbycpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoJ2Fzc2VydE11bHRpTGluZUVxdWFsIGRpZCBub3QgZmFpbCcpCisKKyAgICBkZWYgdGVzdEFzc2VydEVxdWFsX2RpZmZUaHJlc2hvbGQoc2VsZik6CisgICAgICAgICMgY2hlY2sgdGhyZXNob2xkIHZhbHVlCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGlmZlRocmVzaG9sZCwgMioqMTYpCisgICAgICAgICMgZGlzYWJsZSBtYWREaWZmIHRvIGdldCBkaWZmIG1hcmtlcnMKKyAgICAgICAgc2VsZi5tYXhEaWZmID0gTm9uZQorCisgICAgICAgICMgc2V0IGEgbG93ZXIgdGhyZXNob2xkIHZhbHVlIGFuZCBhZGQgYSBjbGVhbnVwIHRvIHJlc3RvcmUgaXQKKyAgICAgICAgb2xkX3RocmVzaG9sZCA9IHNlbGYuX2RpZmZUaHJlc2hvbGQKKyAgICAgICAgc2VsZi5fZGlmZlRocmVzaG9sZCA9IDIqKjgKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGxhbWJkYTogc2V0YXR0cihzZWxmLCAnX2RpZmZUaHJlc2hvbGQnLCBvbGRfdGhyZXNob2xkKSkKKworICAgICAgICAjIHVuZGVyIHRoZSB0aHJlc2hvbGQ6IGRpZmYgbWFya2VyICheKSBpbiBlcnJvciBtZXNzYWdlCisgICAgICAgIHMgPSB1J3gnICogKDIqKjcpCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uKSBhcyBjbToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyArICdhJywgcyArICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRJbignXicsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMgKyAnYScsIHMgKyAnYScpCisKKyAgICAgICAgIyBvdmVyIHRoZSB0aHJlc2hvbGQ6IGRpZmYgbm90IHVzZWQgYW5kIG1hcmtlciAoXikgbm90IGluIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgcyA9IHUneCcgKiAoMioqOSkKKyAgICAgICAgIyBpZiB0aGUgcGF0aCB0aGF0IHVzZXMgZGlmZmxpYiBpcyB0YWtlbiwgX3RydW5jYXRlTWVzc2FnZSB3aWxsIGJlCisgICAgICAgICMgY2FsbGVkIC0tIHJlcGxhY2UgaXQgd2l0aCBleHBsb2RpbmdUcnVuY2F0aW9uIHRvIHZlcmlmeSB0aGF0IHRoaXMKKyAgICAgICAgIyBkb2Vzbid0IGhhcHBlbgorICAgICAgICBkZWYgZXhwbG9kaW5nVHJ1bmNhdGlvbihtZXNzYWdlLCBkaWZmKToKKyAgICAgICAgICAgIHJhaXNlIFN5c3RlbUVycm9yKCd0aGlzIHNob3VsZCBub3QgYmUgcmFpc2VkJykKKyAgICAgICAgb2xkX3RydW5jYXRlID0gc2VsZi5fdHJ1bmNhdGVNZXNzYWdlCisgICAgICAgIHNlbGYuX3RydW5jYXRlTWVzc2FnZSA9IGV4cGxvZGluZ1RydW5jYXRpb24KKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKGxhbWJkYTogc2V0YXR0cihzZWxmLCAnX3RydW5jYXRlTWVzc2FnZScsIG9sZF90cnVuY2F0ZSkpCisKKyAgICAgICAgczEsIHMyID0gcyArICdhJywgcyArICdiJworICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbikgYXMgY206CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLCBzMikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RJbignXicsIHN0cihjbS5leGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihjbS5leGNlcHRpb24pLCAnJXIgIT0gJXInICUgKHMxLCBzMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyArICdhJywgcyArICdhJykKKworICAgIGRlZiB0ZXN0QXNzZXJ0SXRlbXNFcXVhbChzZWxmKToKKyAgICAgICAgYSA9IG9iamVjdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChbMSwgMiwgM10sIFszLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKFsnZm9vJywgJ2JhcicsICdiYXonXSwgWydiYXInLCAnYmF6JywgJ2ZvbyddKQorICAgICAgICBzZWxmLmFzc2VydEl0ZW1zRXF1YWwoW2EsIGEsIDIsIDIsIDNdLCAoYSwgMiwgMywgYSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChbMSwgIjIiLCAiYSIsICJhIl0sIFsiYSIsICIyIiwgVHJ1ZSwgImEiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEl0ZW1zRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLCAyXSArIFszXSAqIDEwMCwgWzFdICogMTAwICsgWzIsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsICIyIiwgImEiLCAiYSJdLCBbImEiLCAiMiIsIFRydWUsIDFdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwXSwgWzEwLCAxMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbMTAsIDExXSwgWzEwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEl0ZW1zRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMCwgMTEsIDEwXSwgWzEwLCAxMV0pCisKKyAgICAgICAgIyBUZXN0IHRoYXQgc2VxdWVuY2VzIG9mIHVuaGFzaGFibGUgb2JqZWN0cyBjYW4gYmUgdGVzdGVkIGZvciBzYW1lbmVzczoKKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKFtbMSwgMl0sIFszLCA0XSwgMF0sIFtGYWxzZSwgWzMsIDRdLCBbMSwgMl1dKQorICAgICAgICAjIFRlc3QgdGhhdCBpdGVyYXRvciBvZiB1bmhhc2hhYmxlIG9iamVjdHMgY2FuIGJlIHRlc3RlZCBmb3Igc2FtZW5lc3M6CisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChpdGVyKFsxLCAyLCBbXSwgMywgNF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcihbMSwgMiwgW10sIDMsIDRdKSkKKworICAgICAgICAjIGhhc2hhYmxlIHR5cGVzLCBidXQgbm90IG9yZGVyYWJsZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtkaXZtb2QsICd4JywgMSwgNWosIDJqLCBmcm96ZW5zZXQoKV0pCisgICAgICAgICMgY29tcGFyaW5nIGRpY3RzCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChbeydhJzogMX0sIHsnYic6IDJ9XSwgW3snYic6IDJ9LCB7J2EnOiAxfV0pCisgICAgICAgICMgY29tcGFyaW5nIGhldGVyb2dlbm91cyBub24taGFzaGFibGUgc2VxdWVuY2VzCisgICAgICAgIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbChbMSwgJ3gnLCBkaXZtb2QsIFtdXSwgW2Rpdm1vZCwgW10sICd4JywgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2Rpdm1vZCwgW10sICd4JywgMSwgNWosIDJqLCBzZXQoKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbWzFdXSwgW1syXV0pCisKKyAgICAgICAgIyBTYW1lIGVsZW1lbnRzLCBidXQgbm90IHNhbWUgc2VxdWVuY2UgbGVuZ3RoCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJdGVtc0VxdWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbMSwgMSwgMl0sIFsyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEl0ZW1zRXF1YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsxLCAxLCAiMiIsICJhIiwgImEiXSwgWyIyIiwgIjIiLCBUcnVlLCAiYSJdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0SXRlbXNFcXVhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIHsnYic6IDJ9LCBOb25lLCBUcnVlXSwgW3snYic6IDJ9LCBUcnVlLCBOb25lXSkKKworICAgICAgICAjIFNhbWUgZWxlbWVudHMgd2hpY2ggZG9uJ3QgcmVsaWFibHkgY29tcGFyZSwgaW4KKyAgICAgICAgIyBkaWZmZXJlbnQgb3JkZXIsIHNlZSBpc3N1ZSAxMDI0MgorICAgICAgICBhID0gW3syLDR9LCB7MSwyfV0KKyAgICAgICAgYiA9IGFbOjotMV0KKyAgICAgICAgc2VsZi5hc3NlcnRJdGVtc0VxdWFsKGEsIGIpCisKKyAgICAgICAgIyB0ZXN0IHV0aWxpdHkgZnVuY3Rpb25zIHN1cHBvcnRpbmcgYXNzZXJ0SXRlbXNFcXVhbCgpCisKKyAgICAgICAgZGlmZnMgPSBzZXQodW5pdHRlc3QudXRpbC5fY291bnRfZGlmZl9hbGxfcHVycG9zZSgnYWFhYmNjZCcsICdhYmJiY2NlJykpCisgICAgICAgIGV4cGVjdGVkID0geygzLDEsJ2EnKSwgKDEsMywnYicpLCAoMSwwLCdkJyksICgwLDEsJ2UnKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWZmcywgZXhwZWN0ZWQpCisKKyAgICAgICAgZGlmZnMgPSB1bml0dGVzdC51dGlsLl9jb3VudF9kaWZmX2FsbF9wdXJwb3NlKFtbXV0sIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpZmZzLCBbKDEsIDAsIFtdKV0pCisKKyAgICAgICAgZGlmZnMgPSBzZXQodW5pdHRlc3QudXRpbC5fY291bnRfZGlmZl9oYXNoYWJsZSgnYWFhYmNjZCcsICdhYmJiY2NlJykpCisgICAgICAgIGV4cGVjdGVkID0geygzLDEsJ2EnKSwgKDEsMywnYicpLCAoMSwwLCdkJyksICgwLDEsJ2UnKX0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWZmcywgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdEFzc2VydFNldEVxdWFsKHNlbGYpOgorICAgICAgICBzZXQxID0gc2V0KCkKKyAgICAgICAgc2V0MiA9IHNldCgpCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoc2V0MSwgc2V0MikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2V0RXF1YWwsIE5vbmUsIHNldDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXRFcXVhbCwgW10sIHNldDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXRFcXVhbCwgc2V0MSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFNldEVxdWFsLCBzZXQxLCBbXSkKKworICAgICAgICBzZXQxID0gc2V0KFsnYSddKQorICAgICAgICBzZXQyID0gc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFNldEVxdWFsLCBzZXQxLCBzZXQyKQorCisgICAgICAgIHNldDEgPSBzZXQoWydhJ10pCisgICAgICAgIHNldDIgPSBzZXQoWydhJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0U2V0RXF1YWwoc2V0MSwgc2V0MikKKworICAgICAgICBzZXQxID0gc2V0KFsnYSddKQorICAgICAgICBzZXQyID0gc2V0KFsnYScsICdiJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXRFcXVhbCwgc2V0MSwgc2V0MikKKworICAgICAgICBzZXQxID0gc2V0KFsnYSddKQorICAgICAgICBzZXQyID0gZnJvemVuc2V0KFsnYScsICdiJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRTZXRFcXVhbCwgc2V0MSwgc2V0MikKKworICAgICAgICBzZXQxID0gc2V0KFsnYScsICdiJ10pCisgICAgICAgIHNldDIgPSBmcm96ZW5zZXQoWydhJywgJ2InXSkKKyAgICAgICAgc2VsZi5hc3NlcnRTZXRFcXVhbChzZXQxLCBzZXQyKQorCisgICAgICAgIHNldDEgPSBzZXQoKQorICAgICAgICBzZXQyID0gImZvbyIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydFNldEVxdWFsLCBzZXQxLCBzZXQyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2V0RXF1YWwsIHNldDIsIHNldDEpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgYW55IHN0cmluZyBmb3JtYXR0aW5nIGlzIHR1cGxlLXNhZmUKKyAgICAgICAgc2V0MSA9IHNldChbKDAsIDEpLCAoMiwgMyldKQorICAgICAgICBzZXQyID0gc2V0KFsoNCwgNSldKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0U2V0RXF1YWwsIHNldDEsIHNldDIpCisKKyAgICBkZWYgdGVzdEluZXF1YWxpdHkoc2VsZik6CisgICAgICAgICMgVHJ5IGludHMKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKDIsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygxLCAyKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgxLCAyKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgxLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgMSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsIDEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwsIDEsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCAyLCAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgMSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3NFcXVhbCwgMiwgMSkKKworICAgICAgICAjIFRyeSBGbG9hdHMKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyKDEuMSwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCgxLjEsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoMS4wLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcygxLjAsIDEuMSkKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwoMS4wLCAxLjEpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKDEuMCwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgMS4wLCAxLjEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyLCAxLjAsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCwgMS4wLCAxLjEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCAxLjEsIDEuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3MsIDEuMCwgMS4wKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzc0VxdWFsLCAxLjEsIDEuMCkKKworICAgICAgICAjIFRyeSBTdHJpbmdzCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcignYnVnJywgJ2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKCdidWcnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoJ2FudCcsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydExlc3MoJ2FudCcsICdidWcnKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgnYW50JywgJ2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzc0VxdWFsKCdhbnQnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsICdhbnQnLCAnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsICdhbnQnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCwgJ2FudCcsICdidWcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgJ2J1ZycsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgJ2FudCcsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzc0VxdWFsLCAnYnVnJywgJ2FudCcpCisKKyAgICAgICAgIyBUcnkgVW5pY29kZQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIodSdidWcnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsKHUnYnVnJywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCh1J2FudCcsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKHUnYW50JywgdSdidWcnKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCh1J2FudCcsIHUnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzRXF1YWwodSdhbnQnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyLCB1J2FudCcsIHUnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsIHUnYW50JywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlckVxdWFsLCB1J2FudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3MsIHUnYnVnJywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgdSdhbnQnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzRXF1YWwsIHUnYnVnJywgdSdhbnQnKQorCisgICAgICAgICMgVHJ5IE1peGVkIFN0cmluZy9Vbmljb2RlCisgICAgICAgIHNlbGYuYXNzZXJ0R3JlYXRlcignYnVnJywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydEdyZWF0ZXIodSdidWcnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoJ2J1ZycsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwodSdidWcnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwoJ2FudCcsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRHcmVhdGVyRXF1YWwodSdhbnQnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRMZXNzKCdhbnQnLCB1J2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0TGVzcyh1J2FudCcsICdidWcnKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgnYW50JywgdSdidWcnKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCh1J2FudCcsICdidWcnKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCgnYW50JywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydExlc3NFcXVhbCh1J2FudCcsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgJ2FudCcsIHUnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXIsIHUnYW50JywgJ2J1ZycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRHcmVhdGVyLCAnYW50JywgdSdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0R3JlYXRlciwgdSdhbnQnLCAnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCwgJ2FudCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHUnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydEdyZWF0ZXJFcXVhbCwgdSdhbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVnJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3MsICdidWcnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzLCB1J2J1ZycsICdhbnQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0TGVzcywgJ2FudCcsIHUnYW50JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydExlc3MsIHUnYW50JywgJ2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzRXF1YWwsICdidWcnLCB1J2FudCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRMZXNzRXF1YWwsIHUnYnVnJywgJ2FudCcpCisKKyAgICBkZWYgdGVzdEFzc2VydE11bHRpTGluZUVxdWFsKHNlbGYpOgorICAgICAgICBzYW1wbGVfdGV4dCA9IGIiIiJcCitodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuMy9saWIvbW9kdWxlLXVuaXR0ZXN0Lmh0bWwKK3Rlc3QgY2FzZQorICAgIEEgdGVzdCBjYXNlIGlzIHRoZSBzbWFsbGVzdCB1bml0IG9mIHRlc3RpbmcuIFsuLi5dCisiIiIKKyAgICAgICAgcmV2aXNlZF9zYW1wbGVfdGV4dCA9IGIiIiJcCitodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuNC4xL2xpYi9tb2R1bGUtdW5pdHRlc3QuaHRtbAordGVzdCBjYXNlCisgICAgQSB0ZXN0IGNhc2UgaXMgdGhlIHNtYWxsZXN0IHVuaXQgb2YgdGVzdGluZy4gWy4uLl0gWW91IG1heSBwcm92aWRlIHlvdXIKKyAgICBvd24gaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBzdWJjbGFzcyBmcm9tIFRlc3RDYXNlLCBvZiBjb3Vyc2UuCisiIiIKKyAgICAgICAgc2FtcGxlX3RleHRfZXJyb3IgPSBiIiIiXAorLSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jLzIuMy9saWIvbW9kdWxlLXVuaXR0ZXN0Lmh0bWwKKz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKysgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8yLjQuMS9saWIvbW9kdWxlLXVuaXR0ZXN0Lmh0bWwKKz8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXgorICB0ZXN0IGNhc2UKKy0gICAgIEEgdGVzdCBjYXNlIGlzIHRoZSBzbWFsbGVzdCB1bml0IG9mIHRlc3RpbmcuIFsuLi5dCisrICAgICBBIHRlc3QgY2FzZSBpcyB0aGUgc21hbGxlc3QgdW5pdCBvZiB0ZXN0aW5nLiBbLi4uXSBZb3UgbWF5IHByb3ZpZGUgeW91cgorPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKysrKysrKysrKysrKysrKysrKysKKysgICAgIG93biBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IHN1YmNsYXNzIGZyb20gVGVzdENhc2UsIG9mIGNvdXJzZS4KKyIiIgorICAgICAgICBzZWxmLm1heERpZmYgPSBOb25lCisgICAgICAgIGZvciB0eXBlX2NoYW5nZXIgaW4gKGxhbWJkYSB4OiB4LCBsYW1iZGEgeDogeC5kZWNvZGUoJ3V0ZjgnKSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRNdWx0aUxpbmVFcXVhbCh0eXBlX2NoYW5nZXIoc2FtcGxlX3RleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9jaGFuZ2VyKHJldmlzZWRfc2FtcGxlX3RleHQpKQorICAgICAgICAgICAgZXhjZXB0IHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgICAgICAjIG5lZWQgdG8gcmVtb3ZlIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBlcnJvciBtZXNzYWdlCisgICAgICAgICAgICAgICAgZXJyb3IgPSBzdHIoZSkuZW5jb2RlKCd1dGY4Jykuc3BsaXQoJ1xuJywgMSlbMV0KKworICAgICAgICAgICAgICAgICMgYXNzZXJ0TXVsdGlMaW5lRXF1YWwgaXMgaG9va2VkIHVwIGFzIHRoZSBkZWZhdWx0IGZvcgorICAgICAgICAgICAgICAgICMgdW5pY29kZSBzdHJpbmdzIC0gc28gd2UgY2FuJ3QgdXNlIGl0IGZvciB0aGlzIGNoZWNrCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNhbXBsZV90ZXh0X2Vycm9yID09IGVycm9yKQorCisgICAgZGVmIHRlc3RBc2VydEVxdWFsU2luZ2xlTGluZShzZWxmKToKKyAgICAgICAgc2FtcGxlX3RleHQgPSB1ImxhZGVuIHN3YWxsb3dzIGZseSBzbG93bHkiCisgICAgICAgIHJldmlzZWRfc2FtcGxlX3RleHQgPSB1InVubGFkZW4gc3dhbGxvd3MgZmx5IHF1aWNrbHkiCisgICAgICAgIHNhbXBsZV90ZXh0X2Vycm9yID0gIiIiXAorLSBsYWRlbiBzd2FsbG93cyBmbHkgc2xvd2x5Cis/ICAgICAgICAgICAgICAgICAgICBeXl5eCisrIHVubGFkZW4gc3dhbGxvd3MgZmx5IHF1aWNrbHkKKz8gKysgICAgICAgICAgICAgICAgICAgXl5eXl4KKyIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXBsZV90ZXh0LCByZXZpc2VkX3NhbXBsZV90ZXh0KQorICAgICAgICBleGNlcHQgc2VsZi5mYWlsdXJlRXhjZXB0aW9uIGFzIGU6CisgICAgICAgICAgICBlcnJvciA9IHN0cihlKS5zcGxpdCgnXG4nLCAxKVsxXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNhbXBsZV90ZXh0X2Vycm9yID09IGVycm9yKQorCisgICAgZGVmIHRlc3RBc3NlcnRJc05vbmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGYuZmFpbHVyZUV4Y2VwdGlvbiwgc2VsZi5hc3NlcnRJc05vbmUsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzTm90Tm9uZSgnRGpab1Bsb0dlYXJzIG9uIFJhaWxzJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCBzZWxmLmFzc2VydElzTm90Tm9uZSwgTm9uZSkKKworICAgIGRlZiB0ZXN0QXNzZXJ0UmVnZXhwTWF0Y2hlcyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSZWdleHBNYXRjaGVzKCdhc2RmYWJhc2RmJywgcidhYisnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLmZhaWx1cmVFeGNlcHRpb24sIHNlbGYuYXNzZXJ0UmVnZXhwTWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NhYWFzJywgcidhYWFhJykKKworICAgIGRlZiB0ZXN0QXNzZXJ0UmFpc2VzUmVnZXhwKHNlbGYpOgorICAgICAgICBjbGFzcyBFeGNlcHRpb25Nb2NrKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgZGVmIFN0dWIoKToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbk1vY2soJ1dlIGV4cGVjdCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoRXhjZXB0aW9uTW9jaywgcmUuY29tcGlsZSgnZXhwZWN0JCcpLCBTdHViKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChFeGNlcHRpb25Nb2NrLCAnZXhwZWN0JCcsIFN0dWIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKEV4Y2VwdGlvbk1vY2ssIHUnZXhwZWN0JCcsIFN0dWIpCisKKyAgICBkZWYgdGVzdEFzc2VydE5vdFJhaXNlc1JlZ2V4cChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCAnXkV4Y2VwdGlvbiBub3QgcmFpc2VkJCcsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAsIEV4Y2VwdGlvbiwgcmUuY29tcGlsZSgneCcpLAorICAgICAgICAgICAgICAgIGxhbWJkYTogTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCAnXkV4Y2VwdGlvbiBub3QgcmFpc2VkJCcsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAsIEV4Y2VwdGlvbiwgJ3gnLAorICAgICAgICAgICAgICAgIGxhbWJkYTogTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsdXJlRXhjZXB0aW9uLCAnXkV4Y2VwdGlvbiBub3QgcmFpc2VkJCcsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAsIEV4Y2VwdGlvbiwgdSd4JywKKyAgICAgICAgICAgICAgICBsYW1iZGE6IE5vbmUpCisKKyAgICBkZWYgdGVzdEFzc2VydFJhaXNlc1JlZ2V4cE1pc21hdGNoKHNlbGYpOgorICAgICAgICBkZWYgU3R1YigpOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdVbmV4cGVjdGVkJykKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgciciXF5FeHBlY3RlZFwkIiBkb2VzIG5vdCBtYXRjaCAiVW5leHBlY3RlZCInLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwLCBFeGNlcHRpb24sICdeRXhwZWN0ZWQkJywKKyAgICAgICAgICAgICAgICBTdHViKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWx1cmVFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgciciXF5FeHBlY3RlZFwkIiBkb2VzIG5vdCBtYXRjaCAiVW5leHBlY3RlZCInLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwLCBFeGNlcHRpb24sIHUnXkV4cGVjdGVkJCcsCisgICAgICAgICAgICAgICAgU3R1YikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCisgICAgICAgICAgICAgICAgc2VsZi5mYWlsdXJlRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIHInIlxeRXhwZWN0ZWRcJCIgZG9lcyBub3QgbWF0Y2ggIlVuZXhwZWN0ZWQiJywKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCwgRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIHJlLmNvbXBpbGUoJ15FeHBlY3RlZCQnKSwgU3R1YikKKworICAgIGRlZiB0ZXN0QXNzZXJ0UmFpc2VzRXhjVmFsdWUoc2VsZik6CisgICAgICAgIGNsYXNzIEV4Y2VwdGlvbk1vY2soRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgU3R1Yihmb28pOgorICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uTW9jayhmb28pCisgICAgICAgIHYgPSAicGFydGljdWxhciB2YWx1ZSIKKworICAgICAgICBjdHggPSBzZWxmLmFzc2VydFJhaXNlcyhFeGNlcHRpb25Nb2NrKQorICAgICAgICB3aXRoIGN0eDoKKyAgICAgICAgICAgIFN0dWIodikKKyAgICAgICAgZSA9IGN0eC5leGNlcHRpb24KKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGUsIEV4Y2VwdGlvbk1vY2spCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5hcmdzWzBdLCB2KQorCisgICAgZGVmIHRlc3RTeW5vbnltQXNzZXJ0TWV0aG9kTmFtZXMoc2VsZik6CisgICAgICAgICIiIlRlc3QgdW5kb2N1bWVudGVkIG1ldGhvZCBuYW1lIHN5bm9ueW1zLgorCisgICAgICAgIFBsZWFzZSBkbyBub3QgdXNlIHRoZXNlIG1ldGhvZHMgbmFtZXMgaW4geW91ciBvd24gY29kZS4KKworICAgICAgICBUaGlzIHRlc3QgY29uZmlybXMgdGhlaXIgY29udGludWVkIGV4aXN0ZW5jZSBhbmQgZnVuY3Rpb25hbGl0eQorICAgICAgICBpbiBvcmRlciB0byBhdm9pZCBicmVha2luZyBleGlzdGluZyBjb2RlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoMywgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoMywgMykKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMoMi4wLCAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90QWxtb3N0RXF1YWxzKDMuMCwgNS4wKQorICAgICAgICBzZWxmLmFzc2VydF8oVHJ1ZSkKKworICAgIGRlZiB0ZXN0UGVuZGluZ0RlcHJlY2F0aW9uTWV0aG9kTmFtZXMoc2VsZik6CisgICAgICAgICIiIlRlc3QgZmFpbCogbWV0aG9kcyBwZW5kaW5nIGRlcHJlY2F0aW9uLCB0aGV5IHdpbGwgd2FybiBpbiAzLjIuCisKKyAgICAgICAgRG8gbm90IHVzZSB0aGVzZSBtZXRob2RzLiAgVGhleSB3aWxsIGdvIGF3YXkgaW4gMy4zLgorICAgICAgICAiIiIKKyAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2hlY2tfd2FybmluZ3MoKToKKyAgICAgICAgICAgIHNlbGYuZmFpbElmRXF1YWwoMywgNSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIDMpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NBbG1vc3RFcXVhbCgyLjAsIDIuMCkKKyAgICAgICAgICAgIHNlbGYuZmFpbElmQWxtb3N0RXF1YWwoMy4wLCA1LjApCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoVHJ1ZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYSBfOiAzLjE0ICsgdSdzcGFtJykKKyAgICAgICAgICAgIHNlbGYuZmFpbElmKEZhbHNlKQorCisgICAgZGVmIHRlc3REZWVwY29weShzZWxmKToKKyAgICAgICAgIyBJc3N1ZTogNTY2MAorICAgICAgICBjbGFzcyBUZXN0YWJsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3ROb3RoaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0ZXN0ID0gVGVzdGFibGVUZXN0KCd0ZXN0Tm90aGluZycpCisKKyAgICAgICAgIyBUaGlzIHNob3VsZG4ndCBibG93IHVwCisgICAgICAgIGRlZXBjb3B5KHRlc3QpCisKKyAgICBkZWYgdGVzdEtleWJvYXJkSW50ZXJydXB0KHNlbGYpOgorICAgICAgICBkZWYgX3JhaXNlKHNlbGY9Tm9uZSk6CisgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdAorICAgICAgICBkZWYgbm90aGluZyhzZWxmKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBUZXN0MSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0ZXN0X3NvbWV0aGluZyA9IF9yYWlzZQorCisgICAgICAgIGNsYXNzIFRlc3QyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHNldFVwID0gX3JhaXNlCisgICAgICAgICAgICB0ZXN0X3NvbWV0aGluZyA9IG5vdGhpbmcKKworICAgICAgICBjbGFzcyBUZXN0Myh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0ZXN0X3NvbWV0aGluZyA9IG5vdGhpbmcKKyAgICAgICAgICAgIHRlYXJEb3duID0gX3JhaXNlCisKKyAgICAgICAgY2xhc3MgVGVzdDQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Rfc29tZXRoaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHNlbGYuYWRkQ2xlYW51cChfcmFpc2UpCisKKyAgICAgICAgZm9yIGtsYXNzIGluIChUZXN0MSwgVGVzdDIsIFRlc3QzLCBUZXN0NCk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleWJvYXJkSW50ZXJydXB0KToKKyAgICAgICAgICAgICAgICBrbGFzcygndGVzdF9zb21ldGhpbmcnKS5ydW4oKQorCisgICAgZGVmIHRlc3RTeXN0ZW1FeGl0KHNlbGYpOgorICAgICAgICBkZWYgX3JhaXNlKHNlbGY9Tm9uZSk6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FeGl0CisgICAgICAgIGRlZiBub3RoaW5nKHNlbGYpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFRlc3QxKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRlc3Rfc29tZXRoaW5nID0gX3JhaXNlCisKKyAgICAgICAgY2xhc3MgVGVzdDIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgc2V0VXAgPSBfcmFpc2UKKyAgICAgICAgICAgIHRlc3Rfc29tZXRoaW5nID0gbm90aGluZworCisgICAgICAgIGNsYXNzIFRlc3QzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRlc3Rfc29tZXRoaW5nID0gbm90aGluZworICAgICAgICAgICAgdGVhckRvd24gPSBfcmFpc2UKKworICAgICAgICBjbGFzcyBUZXN0NCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9zb21ldGhpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5hZGRDbGVhbnVwKF9yYWlzZSkKKworICAgICAgICBmb3Iga2xhc3MgaW4gKFRlc3QxLCBUZXN0MiwgVGVzdDMsIFRlc3Q0KToKKyAgICAgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICAgICAga2xhc3MoJ3Rlc3Rfc29tZXRoaW5nJykucnVuKHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDEpCisKKyAgICBkZWYgdGVzdFBpY2tsZShzZWxmKToKKyAgICAgICAgIyBJc3N1ZSAxMDMyNgorCisgICAgICAgICMgQ2FuJ3QgdXNlIFRlc3RDYXNlIGNsYXNzZXMgZGVmaW5lZCBpbiBUZXN0IGNsYXNzIGFzCisgICAgICAgICMgcGlja2xlIGRvZXMgbm90IHdvcmsgd2l0aCBpbm5lciBjbGFzc2VzCisgICAgICAgIHRlc3QgPSB1bml0dGVzdC5UZXN0Q2FzZSgncnVuJykKKyAgICAgICAgZm9yIHByb3RvY29sIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisKKyAgICAgICAgICAgICMgYmxldyB1cCBwcmlvciB0byBmaXgKKyAgICAgICAgICAgIHBpY2tsZWRfdGVzdCA9IHBpY2tsZS5kdW1wcyh0ZXN0LCBwcm90b2NvbD1wcm90b2NvbCkKKworICAgICAgICAgICAgdW5waWNrbGVkX3Rlc3QgPSBwaWNrbGUubG9hZHMocGlja2xlZF90ZXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0LCB1bnBpY2tsZWRfdGVzdCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfY2FzZS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJjZTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfY2FzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfY2FzZS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9jYXNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTJjZTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfY2FzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMDMxYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHkKQEAgLTAsMCArMSwzNzYgQEAKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKK2ltcG9ydCB1bml0dGVzdAorCisKK2NsYXNzIFRlc3REaXNjb3ZlcnkodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyBIZWF2aWx5IG1vY2tlZCB0ZXN0cyBzbyBJIGNhbiBhdm9pZCBoaXR0aW5nIHRoZSBmaWxlc3lzdGVtCisgICAgZGVmIHRlc3RfZ2V0X25hbWVfZnJvbV9wYXRoKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICBsb2FkZXIuX3RvcF9sZXZlbF9kaXIgPSAnL2ZvbycKKyAgICAgICAgbmFtZSA9IGxvYWRlci5fZ2V0X25hbWVfZnJvbV9wYXRoKCcvZm9vL2Jhci9iYXoucHknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWUsICdiYXIuYmF6JykKKworICAgICAgICBpZiBub3QgX19kZWJ1Z19fOgorICAgICAgICAgICAgIyBhc3NlcnRzIGFyZSBvZmYKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICAgICAgbG9hZGVyLl9nZXRfbmFtZV9mcm9tX3BhdGgoJy9iYXIvYmF6LnB5JykKKworICAgIGRlZiB0ZXN0X2ZpbmRfdGVzdHMoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIG9yaWdpbmFsX2xpc3RkaXIgPSBvcy5saXN0ZGlyCisgICAgICAgIGRlZiByZXN0b3JlX2xpc3RkaXIoKToKKyAgICAgICAgICAgIG9zLmxpc3RkaXIgPSBvcmlnaW5hbF9saXN0ZGlyCisgICAgICAgIG9yaWdpbmFsX2lzZmlsZSA9IG9zLnBhdGguaXNmaWxlCisgICAgICAgIGRlZiByZXN0b3JlX2lzZmlsZSgpOgorICAgICAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBvcmlnaW5hbF9pc2ZpbGUKKyAgICAgICAgb3JpZ2luYWxfaXNkaXIgPSBvcy5wYXRoLmlzZGlyCisgICAgICAgIGRlZiByZXN0b3JlX2lzZGlyKCk6CisgICAgICAgICAgICBvcy5wYXRoLmlzZGlyID0gb3JpZ2luYWxfaXNkaXIKKworICAgICAgICBwYXRoX2xpc3RzID0gW1sndGVzdDEucHknLCAndGVzdDIucHknLCAnbm90X2FfdGVzdC5weScsICd0ZXN0X2RpcicsCisgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmZvbycsICd0ZXN0LW5vdC1hLW1vZHVsZS5weScsICdhbm90aGVyX2RpciddLAorICAgICAgICAgICAgICAgICAgICAgIFsndGVzdDMucHknLCAndGVzdDQucHknLCBdXQorICAgICAgICBvcy5saXN0ZGlyID0gbGFtYmRhIHBhdGg6IHBhdGhfbGlzdHMucG9wKDApCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2xpc3RkaXIpCisKKyAgICAgICAgZGVmIGlzZGlyKHBhdGgpOgorICAgICAgICAgICAgcmV0dXJuIHBhdGguZW5kc3dpdGgoJ2RpcicpCisgICAgICAgIG9zLnBhdGguaXNkaXIgPSBpc2RpcgorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9pc2RpcikKKworICAgICAgICBkZWYgaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgIyBhbm90aGVyX2RpciBpcyBub3QgYSBwYWNrYWdlIGFuZCBzbyBzaG91bGRuJ3QgYmUgcmVjdXJzZWQgaW50bworICAgICAgICAgICAgcmV0dXJuIG5vdCBwYXRoLmVuZHN3aXRoKCdkaXInKSBhbmQgbm90ICdhbm90aGVyX2RpcicgaW4gcGF0aAorICAgICAgICBvcy5wYXRoLmlzZmlsZSA9IGlzZmlsZQorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZV9pc2ZpbGUpCisKKyAgICAgICAgbG9hZGVyLl9nZXRfbW9kdWxlX2Zyb21fbmFtZSA9IGxhbWJkYSBwYXRoOiBwYXRoICsgJyBtb2R1bGUnCisgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlID0gbGFtYmRhIG1vZHVsZTogbW9kdWxlICsgJyB0ZXN0cycKKworICAgICAgICB0b3BfbGV2ZWwgPSBvcy5wYXRoLmFic3BhdGgoJy9mb28nKQorICAgICAgICBsb2FkZXIuX3RvcF9sZXZlbF9kaXIgPSB0b3BfbGV2ZWwKKyAgICAgICAgc3VpdGUgPSBsaXN0KGxvYWRlci5fZmluZF90ZXN0cyh0b3BfbGV2ZWwsICd0ZXN0Ki5weScpKQorCisgICAgICAgIGV4cGVjdGVkID0gW25hbWUgKyAnIG1vZHVsZSB0ZXN0cycgZm9yIG5hbWUgaW4KKyAgICAgICAgICAgICAgICAgICAgKCd0ZXN0MScsICd0ZXN0MicpXQorICAgICAgICBleHBlY3RlZC5leHRlbmQoWygndGVzdF9kaXIuJXMnICUgbmFtZSkgKyAnIG1vZHVsZSB0ZXN0cycgZm9yIG5hbWUgaW4KKyAgICAgICAgICAgICAgICAgICAgKCd0ZXN0MycsICd0ZXN0NCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZSwgZXhwZWN0ZWQpCisKKyAgICBkZWYgdGVzdF9maW5kX3Rlc3RzX3dpdGhfcGFja2FnZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgb3JpZ2luYWxfbGlzdGRpciA9IG9zLmxpc3RkaXIKKyAgICAgICAgZGVmIHJlc3RvcmVfbGlzdGRpcigpOgorICAgICAgICAgICAgb3MubGlzdGRpciA9IG9yaWdpbmFsX2xpc3RkaXIKKyAgICAgICAgb3JpZ2luYWxfaXNmaWxlID0gb3MucGF0aC5pc2ZpbGUKKyAgICAgICAgZGVmIHJlc3RvcmVfaXNmaWxlKCk6CisgICAgICAgICAgICBvcy5wYXRoLmlzZmlsZSA9IG9yaWdpbmFsX2lzZmlsZQorICAgICAgICBvcmlnaW5hbF9pc2RpciA9IG9zLnBhdGguaXNkaXIKKyAgICAgICAgZGVmIHJlc3RvcmVfaXNkaXIoKToKKyAgICAgICAgICAgIG9zLnBhdGguaXNkaXIgPSBvcmlnaW5hbF9pc2RpcgorCisgICAgICAgIGRpcmVjdG9yaWVzID0gWydhX2RpcmVjdG9yeScsICd0ZXN0X2RpcmVjdG9yeScsICd0ZXN0X2RpcmVjdG9yeTInXQorICAgICAgICBwYXRoX2xpc3RzID0gW2RpcmVjdG9yaWVzLCBbXSwgW10sIFtdXQorICAgICAgICBvcy5saXN0ZGlyID0gbGFtYmRhIHBhdGg6IHBhdGhfbGlzdHMucG9wKDApCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2xpc3RkaXIpCisKKyAgICAgICAgb3MucGF0aC5pc2RpciA9IGxhbWJkYSBwYXRoOiBUcnVlCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2lzZGlyKQorCisgICAgICAgIG9zLnBhdGguaXNmaWxlID0gbGFtYmRhIHBhdGg6IG9zLnBhdGguYmFzZW5hbWUocGF0aCkgbm90IGluIGRpcmVjdG9yaWVzCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2lzZmlsZSkKKworICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIHBhdGhzID0gW10KKyAgICAgICAgICAgIGxvYWRfdGVzdHNfYXJncyA9IFtdCisKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoKToKKyAgICAgICAgICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQocGF0aCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpID09ICd0ZXN0X2RpcmVjdG9yeSc6CisgICAgICAgICAgICAgICAgICAgIGRlZiBsb2FkX3Rlc3RzKGxvYWRlciwgdGVzdHMsIHBhdHRlcm4pOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkX3Rlc3RzX2FyZ3MuYXBwZW5kKChsb2FkZXIsIHRlc3RzLCBwYXR0ZXJuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbG9hZF90ZXN0cycKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkX3Rlc3RzID0gbG9hZF90ZXN0cworCisgICAgICAgICAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoID09IG90aGVyLnBhdGgKKworICAgICAgICAgICAgIyBTaWxlbmNlIHB5M2sgd2FybmluZworICAgICAgICAgICAgX19oYXNoX18gPSBOb25lCisKKyAgICAgICAgbG9hZGVyLl9nZXRfbW9kdWxlX2Zyb21fbmFtZSA9IGxhbWJkYSBuYW1lOiBNb2R1bGUobmFtZSkKKyAgICAgICAgZGVmIGxvYWRUZXN0c0Zyb21Nb2R1bGUobW9kdWxlLCB1c2VfbG9hZF90ZXN0cyk6CisgICAgICAgICAgICBpZiB1c2VfbG9hZF90ZXN0czoKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24oJ3VzZV9sb2FkX3Rlc3RzIHNob3VsZCBiZSBGYWxzZSBmb3IgcGFja2FnZXMnKQorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS5wYXRoICsgJyBtb2R1bGUgdGVzdHMnCisgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlID0gbG9hZFRlc3RzRnJvbU1vZHVsZQorCisgICAgICAgIGxvYWRlci5fdG9wX2xldmVsX2RpciA9ICcvZm9vJworICAgICAgICAjIHRoaXMgdGltZSBubyAnLnB5JyBvbiB0aGUgcGF0dGVybiBzbyB0aGF0IGl0IGNhbiBtYXRjaAorICAgICAgICAjIGEgdGVzdCBwYWNrYWdlCisgICAgICAgIHN1aXRlID0gbGlzdChsb2FkZXIuX2ZpbmRfdGVzdHMoJy9mb28nLCAndGVzdConKSkKKworICAgICAgICAjIFdlIHNob3VsZCBoYXZlIGxvYWRlZCB0ZXN0cyBmcm9tIHRoZSB0ZXN0X2RpcmVjdG9yeSBwYWNrYWdlIGJ5IGNhbGxpbmcgbG9hZF90ZXN0cworICAgICAgICAjIGFuZCBkaXJlY3RseSBmcm9tIHRoZSB0ZXN0X2RpcmVjdG9yeTIgcGFja2FnZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnbG9hZF90ZXN0cycsICd0ZXN0X2RpcmVjdG9yeTInICsgJyBtb2R1bGUgdGVzdHMnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNb2R1bGUucGF0aHMsIFsndGVzdF9kaXJlY3RvcnknLCAndGVzdF9kaXJlY3RvcnkyJ10pCisKKyAgICAgICAgIyBsb2FkX3Rlc3RzIHNob3VsZCBoYXZlIGJlZW4gY2FsbGVkIG9uY2Ugd2l0aCBsb2FkZXIsIHRlc3RzIGFuZCBwYXR0ZXJuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTW9kdWxlLmxvYWRfdGVzdHNfYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbKGxvYWRlciwgJ3Rlc3RfZGlyZWN0b3J5JyArICcgbW9kdWxlIHRlc3RzJywgJ3Rlc3QqJyldKQorCisgICAgZGVmIHRlc3RfZGlzY292ZXIoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIG9yaWdpbmFsX2lzZmlsZSA9IG9zLnBhdGguaXNmaWxlCisgICAgICAgIG9yaWdpbmFsX2lzZGlyID0gb3MucGF0aC5pc2RpcgorICAgICAgICBkZWYgcmVzdG9yZV9pc2ZpbGUoKToKKyAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlID0gb3JpZ2luYWxfaXNmaWxlCisKKyAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBsYW1iZGEgcGF0aDogRmFsc2UKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfaXNmaWxlKQorCisgICAgICAgIG9yaWdfc3lzX3BhdGggPSBzeXMucGF0aFs6XQorICAgICAgICBkZWYgcmVzdG9yZV9wYXRoKCk6CisgICAgICAgICAgICBzeXMucGF0aFs6XSA9IG9yaWdfc3lzX3BhdGgKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVfcGF0aCkKKworICAgICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmFic3BhdGgob3MucGF0aC5ub3JtcGF0aCgnL2ZvbycpKQorICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yKToKKyAgICAgICAgICAgIGxvYWRlci5kaXNjb3ZlcignL2Zvby9iYXInLCB0b3BfbGV2ZWxfZGlyPScvZm9vJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5fdG9wX2xldmVsX2RpciwgZnVsbF9wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEluKGZ1bGxfcGF0aCwgc3lzLnBhdGgpCisKKyAgICAgICAgb3MucGF0aC5pc2ZpbGUgPSBsYW1iZGEgcGF0aDogVHJ1ZQorICAgICAgICBvcy5wYXRoLmlzZGlyID0gbGFtYmRhIHBhdGg6IFRydWUKKworICAgICAgICBkZWYgcmVzdG9yZV9pc2RpcigpOgorICAgICAgICAgICAgb3MucGF0aC5pc2RpciA9IG9yaWdpbmFsX2lzZGlyCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX2lzZGlyKQorCisgICAgICAgIF9maW5kX3Rlc3RzX2FyZ3MgPSBbXQorICAgICAgICBkZWYgX2ZpbmRfdGVzdHMoc3RhcnRfZGlyLCBwYXR0ZXJuKToKKyAgICAgICAgICAgIF9maW5kX3Rlc3RzX2FyZ3MuYXBwZW5kKChzdGFydF9kaXIsIHBhdHRlcm4pKQorICAgICAgICAgICAgcmV0dXJuIFsndGVzdHMnXQorICAgICAgICBsb2FkZXIuX2ZpbmRfdGVzdHMgPSBfZmluZF90ZXN0cworICAgICAgICBsb2FkZXIuc3VpdGVDbGFzcyA9IHN0cgorCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmRpc2NvdmVyKCcvZm9vL2Jhci9iYXonLCAncGF0dGVybicsICcvZm9vL2JhcicpCisKKyAgICAgICAgdG9wX2xldmVsX2RpciA9IG9zLnBhdGguYWJzcGF0aCgnL2Zvby9iYXInKQorICAgICAgICBzdGFydF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoJy9mb28vYmFyL2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUsICJbJ3Rlc3RzJ10iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5fdG9wX2xldmVsX2RpciwgdG9wX2xldmVsX2RpcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfZmluZF90ZXN0c19hcmdzLCBbKHN0YXJ0X2RpciwgJ3BhdHRlcm4nKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0SW4odG9wX2xldmVsX2Rpciwgc3lzLnBhdGgpCisKKyAgICBkZWYgdGVzdF9kaXNjb3Zlcl93aXRoX21vZHVsZXNfdGhhdF9mYWlsX3RvX2ltcG9ydChzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgbGlzdGRpciA9IG9zLmxpc3RkaXIKKyAgICAgICAgb3MubGlzdGRpciA9IGxhbWJkYSBfOiBbJ3Rlc3RfdGhpc19kb2VzX25vdF9leGlzdC5weSddCisgICAgICAgIGlzZmlsZSA9IG9zLnBhdGguaXNmaWxlCisgICAgICAgIG9zLnBhdGguaXNmaWxlID0gbGFtYmRhIF86IFRydWUKKyAgICAgICAgb3JpZ19zeXNfcGF0aCA9IHN5cy5wYXRoWzpdCisgICAgICAgIGRlZiByZXN0b3JlKCk6CisgICAgICAgICAgICBvcy5wYXRoLmlzZmlsZSA9IGlzZmlsZQorICAgICAgICAgICAgb3MubGlzdGRpciA9IGxpc3RkaXIKKyAgICAgICAgICAgIHN5cy5wYXRoWzpdID0gb3JpZ19zeXNfcGF0aAorICAgICAgICBzZWxmLmFkZENsZWFudXAocmVzdG9yZSkKKworICAgICAgICBzdWl0ZSA9IGxvYWRlci5kaXNjb3ZlcignLicpCisgICAgICAgIHNlbGYuYXNzZXJ0SW4ob3MuZ2V0Y3dkKCksIHN5cy5wYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLmNvdW50VGVzdENhc2VzKCksIDEpCisgICAgICAgIHRlc3QgPSBsaXN0KGxpc3Qoc3VpdGUpWzBdKVswXSAjIGV4dHJhY3QgdGVzdCBmcm9tIHN1aXRlCisKKyAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvcik6CisgICAgICAgICAgICB0ZXN0LnRlc3RfdGhpc19kb2VzX25vdF9leGlzdCgpCisKKyAgICBkZWYgdGVzdF9jb21tYW5kX2xpbmVfaGFuZGxpbmdfcGFyc2VBcmdzKHNlbGYpOgorICAgICAgICAjIEhhaGEgLSB0YWtlIHRoYXQgdW5pbnN0YW50aWFibGUgY2xhc3MKKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorCisgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICBkZWYgZG9fZGlzY292ZXJ5KGFyZ3YpOgorICAgICAgICAgICAgYXJncy5leHRlbmQoYXJndikKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5ID0gZG9fZGlzY292ZXJ5CisgICAgICAgIHByb2dyYW0ucGFyc2VBcmdzKFsnc29tZXRoaW5nJywgJ2Rpc2NvdmVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgW10pCisKKyAgICAgICAgcHJvZ3JhbS5wYXJzZUFyZ3MoWydzb21ldGhpbmcnLCAnZGlzY292ZXInLCAnZm9vJywgJ2JhciddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZ3MsIFsnZm9vJywgJ2JhciddKQorCisgICAgZGVmIHRlc3RfY29tbWFuZF9saW5lX2hhbmRsaW5nX2RvX2Rpc2NvdmVyeV90b29fbWFueV9hcmd1bWVudHMoc2VsZik6CisgICAgICAgIGNsYXNzIFN0b3AoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZGVmIHVzYWdlRXhpdCgpOgorICAgICAgICAgICAgcmFpc2UgU3RvcAorCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS51c2FnZUV4aXQgPSB1c2FnZUV4aXQKKyAgICAgICAgcHJvZ3JhbS50ZXN0TG9hZGVyID0gTm9uZQorCisgICAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3RvcCk6CisgICAgICAgICAgICAjIHRvbyBtYW55IGFyZ3MKKyAgICAgICAgICAgIHByb2dyYW0uX2RvX2Rpc2NvdmVyeShbJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91ciddKQorCisKKyAgICBkZWYgdGVzdF9jb21tYW5kX2xpbmVfaGFuZGxpbmdfZG9fZGlzY292ZXJ5X3VzZXNfZGVmYXVsdF9sb2FkZXIoc2VsZik6CisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKworICAgICAgICBjbGFzcyBMb2FkZXIob2JqZWN0KToKKyAgICAgICAgICAgIGFyZ3MgPSBbXQorICAgICAgICAgICAgZGVmIGRpc2NvdmVyKHNlbGYsIHN0YXJ0X2RpciwgcGF0dGVybiwgdG9wX2xldmVsX2Rpcik6CisgICAgICAgICAgICAgICAgc2VsZi5hcmdzLmFwcGVuZCgoc3RhcnRfZGlyLCBwYXR0ZXJuLCB0b3BfbGV2ZWxfZGlyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gJ3Rlc3RzJworCisgICAgICAgIHByb2dyYW0udGVzdExvYWRlciA9IExvYWRlcigpCisgICAgICAgIHByb2dyYW0uX2RvX2Rpc2NvdmVyeShbJy12J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTG9hZGVyLmFyZ3MsIFsoJy4nLCAndGVzdCoucHknLCBOb25lKV0pCisKKyAgICBkZWYgdGVzdF9jb21tYW5kX2xpbmVfaGFuZGxpbmdfZG9fZGlzY292ZXJ5X2NhbGxzX2xvYWRlcihzZWxmKToKKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorCisgICAgICAgIGNsYXNzIExvYWRlcihvYmplY3QpOgorICAgICAgICAgICAgYXJncyA9IFtdCisgICAgICAgICAgICBkZWYgZGlzY292ZXIoc2VsZiwgc3RhcnRfZGlyLCBwYXR0ZXJuLCB0b3BfbGV2ZWxfZGlyKToKKyAgICAgICAgICAgICAgICBzZWxmLmFyZ3MuYXBwZW5kKChzdGFydF9kaXIsIHBhdHRlcm4sIHRvcF9sZXZlbF9kaXIpKQorICAgICAgICAgICAgICAgIHJldHVybiAndGVzdHMnCisKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnLXYnXSwgTG9hZGVyPUxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnZlcmJvc2l0eSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnRlc3QsICd0ZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTG9hZGVyLmFyZ3MsIFsoJy4nLCAndGVzdCoucHknLCBOb25lKV0pCisKKyAgICAgICAgTG9hZGVyLmFyZ3MgPSBbXQorICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCisgICAgICAgIHByb2dyYW0uX2RvX2Rpc2NvdmVyeShbJy0tdmVyYm9zZSddLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnLicsICd0ZXN0Ki5weScsIE5vbmUpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFtdLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnLicsICd0ZXN0Ki5weScsIE5vbmUpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnZmlzaCddLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnZmlzaCcsICd0ZXN0Ki5weScsIE5vbmUpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnZmlzaCcsICdlZ2dzJ10sIExvYWRlcj1Mb2FkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS50ZXN0LCAndGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExvYWRlci5hcmdzLCBbKCdmaXNoJywgJ2VnZ3MnLCBOb25lKV0pCisKKyAgICAgICAgTG9hZGVyLmFyZ3MgPSBbXQorICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCisgICAgICAgIHByb2dyYW0uX2RvX2Rpc2NvdmVyeShbJ2Zpc2gnLCAnZWdncycsICdoYW0nXSwgTG9hZGVyPUxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnRlc3QsICd0ZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTG9hZGVyLmFyZ3MsIFsoJ2Zpc2gnLCAnZWdncycsICdoYW0nKV0pCisKKyAgICAgICAgTG9hZGVyLmFyZ3MgPSBbXQorICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCisgICAgICAgIHByb2dyYW0uX2RvX2Rpc2NvdmVyeShbJy1zJywgJ2Zpc2gnXSwgTG9hZGVyPUxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnRlc3QsICd0ZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTG9hZGVyLmFyZ3MsIFsoJ2Zpc2gnLCAndGVzdCoucHknLCBOb25lKV0pCisKKyAgICAgICAgTG9hZGVyLmFyZ3MgPSBbXQorICAgICAgICBwcm9ncmFtID0gb2JqZWN0Ll9fbmV3X18odW5pdHRlc3QuVGVzdFByb2dyYW0pCisgICAgICAgIHByb2dyYW0uX2RvX2Rpc2NvdmVyeShbJy10JywgJ2Zpc2gnXSwgTG9hZGVyPUxvYWRlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnRlc3QsICd0ZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTG9hZGVyLmFyZ3MsIFsoJy4nLCAndGVzdCoucHknLCAnZmlzaCcpXSkKKworICAgICAgICBMb2FkZXIuYXJncyA9IFtdCisgICAgICAgIHByb2dyYW0gPSBvYmplY3QuX19uZXdfXyh1bml0dGVzdC5UZXN0UHJvZ3JhbSkKKyAgICAgICAgcHJvZ3JhbS5fZG9fZGlzY292ZXJ5KFsnLXAnLCAnZmlzaCddLCBMb2FkZXI9TG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udGVzdCwgJ3Rlc3RzJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMb2FkZXIuYXJncywgWygnLicsICdmaXNoJywgTm9uZSldKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHByb2dyYW0uZmFpbGZhc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvZ3JhbS5jYXRjaGJyZWFrKQorCisgICAgICAgIExvYWRlci5hcmdzID0gW10KKyAgICAgICAgcHJvZ3JhbSA9IG9iamVjdC5fX25ld19fKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKQorICAgICAgICBwcm9ncmFtLl9kb19kaXNjb3ZlcnkoWyctcCcsICdlZ2dzJywgJy1zJywgJ2Zpc2gnLCAnLXYnLCAnLWYnLCAnLWMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRlcj1Mb2FkZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS50ZXN0LCAndGVzdHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExvYWRlci5hcmdzLCBbKCdmaXNoJywgJ2VnZ3MnLCBOb25lKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS52ZXJib3NpdHksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm9ncmFtLmZhaWxmYXN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZ3JhbS5jYXRjaGJyZWFrKQorCisgICAgZGVmIHRlc3RfZGV0ZWN0X21vZHVsZV9jbGFzaChzZWxmKToKKyAgICAgICAgY2xhc3MgTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICBfX2ZpbGVfXyA9ICdiYXIvZm9vLnB5JworICAgICAgICBzeXMubW9kdWxlc1snZm9vJ10gPSBNb2R1bGUKKyAgICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5hYnNwYXRoKCdmb28nKQorICAgICAgICBvcmlnaW5hbF9saXN0ZGlyID0gb3MubGlzdGRpcgorICAgICAgICBvcmlnaW5hbF9pc2ZpbGUgPSBvcy5wYXRoLmlzZmlsZQorICAgICAgICBvcmlnaW5hbF9pc2RpciA9IG9zLnBhdGguaXNkaXIKKworICAgICAgICBkZWYgY2xlYW51cCgpOgorICAgICAgICAgICAgb3MubGlzdGRpciA9IG9yaWdpbmFsX2xpc3RkaXIKKyAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlID0gb3JpZ2luYWxfaXNmaWxlCisgICAgICAgICAgICBvcy5wYXRoLmlzZGlyID0gb3JpZ2luYWxfaXNkaXIKKyAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1snZm9vJ10KKyAgICAgICAgICAgIGlmIGZ1bGxfcGF0aCBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICAgICBzeXMucGF0aC5yZW1vdmUoZnVsbF9wYXRoKQorICAgICAgICBzZWxmLmFkZENsZWFudXAoY2xlYW51cCkKKworICAgICAgICBkZWYgbGlzdGRpcihfKToKKyAgICAgICAgICAgIHJldHVybiBbJ2Zvby5weSddCisgICAgICAgIGRlZiBpc2ZpbGUoXyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBkZWYgaXNkaXIoXyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBvcy5saXN0ZGlyID0gbGlzdGRpcgorICAgICAgICBvcy5wYXRoLmlzZmlsZSA9IGlzZmlsZQorICAgICAgICBvcy5wYXRoLmlzZGlyID0gaXNkaXIKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICBtb2RfZGlyID0gb3MucGF0aC5hYnNwYXRoKCdiYXInKQorICAgICAgICBleHBlY3RlZF9kaXIgPSBvcy5wYXRoLmFic3BhdGgoJ2ZvbycpCisgICAgICAgIG1zZyA9IHJlLmVzY2FwZShyIidmb28nIG1vZHVsZSBpbmNvcnJlY3RseSBpbXBvcnRlZCBmcm9tICVyLiBFeHBlY3RlZCAlci4gIgorICAgICAgICAgICAgICAgICJJcyB0aGlzIG1vZHVsZSBnbG9iYWxseSBpbnN0YWxsZWQ/IiAlIChtb2RfZGlyLCBleHBlY3RlZF9kaXIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKKyAgICAgICAgICAgIEltcG9ydEVycm9yLCAnXiVzJCcgJSBtc2csIGxvYWRlci5kaXNjb3ZlciwKKyAgICAgICAgICAgIHN0YXJ0X2Rpcj0nZm9vJywgcGF0dGVybj0nZm9vLnB5JworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3lzLnBhdGhbMF0sIGZ1bGxfcGF0aCkKKworCisgICAgZGVmIHRlc3RfZGlzY292ZXJ5X2Zyb21fZG90dGVkX3BhdGgoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRlc3RzID0gW3NlbGZdCisgICAgICAgIGV4cGVjdGVkUGF0aCA9IG9zLnBhdGguYWJzcGF0aChvcy5wYXRoLmRpcm5hbWUodW5pdHRlc3QudGVzdC5fX2ZpbGVfXykpCisKKyAgICAgICAgc2VsZi53YXNSdW4gPSBGYWxzZQorICAgICAgICBkZWYgX2ZpbmRfdGVzdHMoc3RhcnRfZGlyLCBwYXR0ZXJuKToKKyAgICAgICAgICAgIHNlbGYud2FzUnVuID0gVHJ1ZQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGFydF9kaXIsIGV4cGVjdGVkUGF0aCkKKyAgICAgICAgICAgIHJldHVybiB0ZXN0cworICAgICAgICBsb2FkZXIuX2ZpbmRfdGVzdHMgPSBfZmluZF90ZXN0cworICAgICAgICBzdWl0ZSA9IGxvYWRlci5kaXNjb3ZlcigndW5pdHRlc3QudGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLndhc1J1bikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5fdGVzdHMsIHRlc3RzKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgzM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9kaXNjb3ZlcnkucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgzM2I5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZGlzY292ZXJ5LnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZnVuY3Rpb250ZXN0Y2FzZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2RkODc4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZnVuY3Rpb250ZXN0Y2FzZS5weQpAQCAtMCwwICsxLDE0OCBAQAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gLnN1cHBvcnQgaW1wb3J0IExvZ2dpbmdSZXN1bHQKKworCitjbGFzcyBUZXN0X0Z1bmN0aW9uVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyAiUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgcmVwcmVzZW50ZWQgYnkgdGhlIHRoaXMgdGVzdCBvYmplY3QuIEZvcgorICAgICMgVGVzdENhc2UgaW5zdGFuY2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIDEiCisgICAgZGVmIHRlc3RfY291bnRUZXN0Q2FzZXMoc2VsZik6CisgICAgICAgIHRlc3QgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3QuY291bnRUZXN0Q2FzZXMoKSwgMSkKKworICAgICMgIldoZW4gYSBzZXRVcCgpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUgdGVzdCBydW5uZXIgd2lsbCBydW4gdGhhdCBtZXRob2QKKyAgICAjIHByaW9yIHRvIGVhY2ggdGVzdC4gTGlrZXdpc2UsIGlmIGEgdGVhckRvd24oKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlCisgICAgIyB0ZXN0IHJ1bm5lciB3aWxsIGludm9rZSB0aGF0IG1ldGhvZCBhZnRlciBlYWNoIHRlc3QuIEluIHRoZSBleGFtcGxlLAorICAgICMgc2V0VXAoKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBmcmVzaCBzZXF1ZW5jZSBmb3IgZWFjaCB0ZXN0LiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhlIHByb3BlciBjYWxsIG9yZGVyIGlzIG1haW50YWluZWQsIGV2ZW4gaWYgc2V0VXAoKSByYWlzZXMKKyAgICAjIGFuIGV4Y2VwdGlvbi4KKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fc2V0VXAoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGRlZiBzZXRVcCgpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgnc2V0VXAnKQorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdyYWlzZWQgYnkgc2V0VXAnKQorCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCd0ZXN0JykKKworICAgICAgICBkZWYgdGVhckRvd24oKToKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3RlYXJEb3duJykKKworICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ3NldFVwJywgJ2FkZEVycm9yJywgJ3N0b3BUZXN0J10KKyAgICAgICAgdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZSh0ZXN0LCBzZXRVcCwgdGVhckRvd24pLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldoZW4gYSBzZXRVcCgpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUgdGVzdCBydW5uZXIgd2lsbCBydW4gdGhhdCBtZXRob2QKKyAgICAjIHByaW9yIHRvIGVhY2ggdGVzdC4gTGlrZXdpc2UsIGlmIGEgdGVhckRvd24oKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlCisgICAgIyB0ZXN0IHJ1bm5lciB3aWxsIGludm9rZSB0aGF0IG1ldGhvZCBhZnRlciBlYWNoIHRlc3QuIEluIHRoZSBleGFtcGxlLAorICAgICMgc2V0VXAoKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBmcmVzaCBzZXF1ZW5jZSBmb3IgZWFjaCB0ZXN0LiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhlIHByb3BlciBjYWxsIG9yZGVyIGlzIG1haW50YWluZWQsIGV2ZW4gaWYgdGhlIHRlc3QgcmFpc2VzCisgICAgIyBhbiBlcnJvciAoYXMgb3Bwb3NlZCB0byBhIGZhaWx1cmUpLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19lcnJvcl9pbl90ZXN0KHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKworICAgICAgICBkZWYgc2V0VXAoKToKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3NldFVwJykKKworICAgICAgICBkZWYgdGVzdCgpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgndGVzdCcpCisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ3JhaXNlZCBieSB0ZXN0JykKKworICAgICAgICBkZWYgdGVhckRvd24oKToKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3RlYXJEb3duJykKKworICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ3NldFVwJywgJ3Rlc3QnLCAnYWRkRXJyb3InLCAndGVhckRvd24nLAorICAgICAgICAgICAgICAgICAgICAnc3RvcFRlc3QnXQorICAgICAgICB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKHRlc3QsIHNldFVwLCB0ZWFyRG93bikucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiV2hlbiBhIHNldFVwKCkgbWV0aG9kIGlzIGRlZmluZWQsIHRoZSB0ZXN0IHJ1bm5lciB3aWxsIHJ1biB0aGF0IG1ldGhvZAorICAgICMgcHJpb3IgdG8gZWFjaCB0ZXN0LiBMaWtld2lzZSwgaWYgYSB0ZWFyRG93bigpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUKKyAgICAjIHRlc3QgcnVubmVyIHdpbGwgaW52b2tlIHRoYXQgbWV0aG9kIGFmdGVyIGVhY2ggdGVzdC4gSW4gdGhlIGV4YW1wbGUsCisgICAgIyBzZXRVcCgpIHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGZyZXNoIHNlcXVlbmNlIGZvciBlYWNoIHRlc3QuIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSB0aGUgcHJvcGVyIGNhbGwgb3JkZXIgaXMgbWFpbnRhaW5lZCwgZXZlbiBpZiB0aGUgdGVzdCBzaWduYWxzCisgICAgIyBhIGZhaWx1cmUgKGFzIG9wcG9zZWQgdG8gYW4gZXJyb3IpLgorICAgIGRlZiB0ZXN0X3J1bl9jYWxsX29yZGVyX19mYWlsdXJlX2luX3Rlc3Qoc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGRlZiBzZXRVcCgpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgnc2V0VXAnKQorCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCd0ZXN0JykKKyAgICAgICAgICAgIHNlbGYuZmFpbCgncmFpc2VkIGJ5IHRlc3QnKQorCisgICAgICAgIGRlZiB0ZWFyRG93bigpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgndGVhckRvd24nKQorCisgICAgICAgIGV4cGVjdGVkID0gWydzdGFydFRlc3QnLCAnc2V0VXAnLCAndGVzdCcsICdhZGRGYWlsdXJlJywgJ3RlYXJEb3duJywKKyAgICAgICAgICAgICAgICAgICAgJ3N0b3BUZXN0J10KKyAgICAgICAgdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZSh0ZXN0LCBzZXRVcCwgdGVhckRvd24pLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBleHBlY3RlZCkKKworICAgICMgIldoZW4gYSBzZXRVcCgpIG1ldGhvZCBpcyBkZWZpbmVkLCB0aGUgdGVzdCBydW5uZXIgd2lsbCBydW4gdGhhdCBtZXRob2QKKyAgICAjIHByaW9yIHRvIGVhY2ggdGVzdC4gTGlrZXdpc2UsIGlmIGEgdGVhckRvd24oKSBtZXRob2QgaXMgZGVmaW5lZCwgdGhlCisgICAgIyB0ZXN0IHJ1bm5lciB3aWxsIGludm9rZSB0aGF0IG1ldGhvZCBhZnRlciBlYWNoIHRlc3QuIEluIHRoZSBleGFtcGxlLAorICAgICMgc2V0VXAoKSB3YXMgdXNlZCB0byBjcmVhdGUgYSBmcmVzaCBzZXF1ZW5jZSBmb3IgZWFjaCB0ZXN0LiIKKyAgICAjCisgICAgIyBNYWtlIHN1cmUgdGhlIHByb3BlciBjYWxsIG9yZGVyIGlzIG1haW50YWluZWQsIGV2ZW4gaWYgdGVhckRvd24oKSByYWlzZXMKKyAgICAjIGFuIGV4Y2VwdGlvbi4KKyAgICBkZWYgdGVzdF9ydW5fY2FsbF9vcmRlcl9fZXJyb3JfaW5fdGVhckRvd24oc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGRlZiBzZXRVcCgpOgorICAgICAgICAgICAgZXZlbnRzLmFwcGVuZCgnc2V0VXAnKQorCisgICAgICAgIGRlZiB0ZXN0KCk6CisgICAgICAgICAgICBldmVudHMuYXBwZW5kKCd0ZXN0JykKKworICAgICAgICBkZWYgdGVhckRvd24oKToKKyAgICAgICAgICAgIGV2ZW50cy5hcHBlbmQoJ3RlYXJEb3duJykKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigncmFpc2VkIGJ5IHRlYXJEb3duJykKKworICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0JywgJ3NldFVwJywgJ3Rlc3QnLCAndGVhckRvd24nLCAnYWRkRXJyb3InLAorICAgICAgICAgICAgICAgICAgICAnc3RvcFRlc3QnXQorICAgICAgICB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKHRlc3QsIHNldFVwLCB0ZWFyRG93bikucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgIyAiUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzcGVjaWZpYyB0ZXN0IGNhc2UuIgorICAgICMKKyAgICAjIEJlY2F1c2Ugb2YgdGhlIHZhZ3VlIG5hdHVyZSBvZiB0aGUgZG9jcywgSSdtIG5vdCBnb2luZyB0byBsb2NrIHRoaXMKKyAgICAjIHRlc3QgZG93biB0b28gbXVjaC4gUmVhbGx5IGFsbCB0aGF0IGNhbiBiZSBhc3NlcnRlZCBpcyB0aGF0IHRoZSBpZCgpCisgICAgIyB3aWxsIGJlIGEgc3RyaW5nIChlaXRoZXIgOC1ieXRlIG9yIHVuaWNvZGUgLS0gYWdhaW4sIGJlY2F1c2UgdGhlIGRvY3MKKyAgICAjIGp1c3Qgc2F5ICJzdHJpbmciKQorICAgIGRlZiB0ZXN0X2lkKHNlbGYpOgorICAgICAgICB0ZXN0ID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHRlc3QuaWQoKSwgYmFzZXN0cmluZykKKworICAgICMgIlJldHVybnMgYSBvbmUtbGluZSBkZXNjcmlwdGlvbiBvZiB0aGUgdGVzdCwgb3IgTm9uZSBpZiBubyBkZXNjcmlwdGlvbgorICAgICMgaGFzIGJlZW4gcHJvdmlkZWQuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHJldHVybnMKKyAgICAjIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSB0ZXN0IG1ldGhvZCdzIGRvY3N0cmluZywgaWYgYXZhaWxhYmxlLCBvciBOb25lLiIKKyAgICBkZWYgdGVzdF9zaG9ydERlc2NyaXB0aW9uX19ub19kb2NzdHJpbmcoc2VsZik6CisgICAgICAgIHRlc3QgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3Quc2hvcnREZXNjcmlwdGlvbigpLCBOb25lKQorCisgICAgIyAiUmV0dXJucyBhIG9uZS1saW5lIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXN0LCBvciBOb25lIGlmIG5vIGRlc2NyaXB0aW9uCisgICAgIyBoYXMgYmVlbiBwcm92aWRlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgcmV0dXJucworICAgICMgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHRlc3QgbWV0aG9kJ3MgZG9jc3RyaW5nLCBpZiBhdmFpbGFibGUsIG9yIE5vbmUuIgorICAgIGRlZiB0ZXN0X3Nob3J0RGVzY3JpcHRpb25fX3NpbmdsZWxpbmVfZG9jc3RyaW5nKHNlbGYpOgorICAgICAgICBkZXNjID0gInRoaXMgdGVzdHMgZm9vIgorICAgICAgICB0ZXN0ID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUsIGRlc2NyaXB0aW9uPWRlc2MpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXN0LnNob3J0RGVzY3JpcHRpb24oKSwgInRoaXMgdGVzdHMgZm9vIikKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZnVuY3Rpb250ZXN0Y2FzZS5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhjNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZnVuY3Rpb250ZXN0Y2FzZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZnVuY3Rpb250ZXN0Y2FzZS5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9mdW5jdGlvbnRlc3RjYXNlLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzhjNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfZnVuY3Rpb250ZXN0Y2FzZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NDRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHkKQEAgLTAsMCArMSwxMjg2IEBACitpbXBvcnQgc3lzCitpbXBvcnQgdHlwZXMKKworCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0X1Rlc3RMb2FkZXIodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZQorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIFRlc3RDYXNlLWRlcml2ZWQKKyAgICAjIGNsYXNzIHRlc3RDYXNlQ2xhc3MiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbVRlc3RDYXNlKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIGZvb19iYXIoc2VsZik6IHBhc3MKKworICAgICAgICB0ZXN0cyA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCd0ZXN0XzEnKSwgRm9vKCd0ZXN0XzInKV0pCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShGb28pLCB0ZXN0cykKKworICAgICMgIlJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBjb250YWluZWQgaW4gdGhlIFRlc3RDYXNlLWRlcml2ZWQKKyAgICAjIGNsYXNzIHRlc3RDYXNlQ2xhc3MiCisgICAgIworICAgICMgTWFrZSBzdXJlIGl0IGRvZXMgdGhlIHJpZ2h0IHRoaW5nIGV2ZW4gaWYgbm8gdGVzdHMgd2VyZSBmb3VuZAorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21UZXN0Q2FzZV9fbm9fbWF0Y2hlcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBmb29fYmFyKHNlbGYpOiBwYXNzCisKKyAgICAgICAgZW1wdHlfc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UoRm9vKSwgZW1wdHlfc3VpdGUpCisKKyAgICAjICJSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgY29udGFpbmVkIGluIHRoZSBUZXN0Q2FzZS1kZXJpdmVkCisgICAgIyBjbGFzcyB0ZXN0Q2FzZUNsYXNzIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyBpZiBsb2FkVGVzdHNGcm9tVGVzdENhc2UoKSBpcyBnaXZlbiBhbiBvYmplY3QKKyAgICAjIHRoYXQgaXNuJ3QgYSBzdWJjbGFzcyBvZiBUZXN0Q2FzZT8gU3BlY2lmaWNhbGx5LCB3aGF0IGhhcHBlbnMKKyAgICAjIGlmIHRlc3RDYXNlQ2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBUZXN0U3VpdGU/CisgICAgIworICAgICMgVGhpcyBpcyBjaGVja2VkIGZvciBzcGVjaWZpY2FsbHkgaW4gdGhlIGNvZGUsIHNvIHdlIGJldHRlciBhZGQgYQorICAgICMgdGVzdCBmb3IgaXQuCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbVRlc3RDYXNlX19UZXN0U3VpdGVfc3ViY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIE5vdEFUZXN0Q2FzZSh1bml0dGVzdC5UZXN0U3VpdGUpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKE5vdEFUZXN0Q2FzZSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgnU2hvdWxkIHJhaXNlIFR5cGVFcnJvcicpCisKKyAgICAjICJSZXR1cm4gYSBzdWl0ZSBvZiBhbGwgdGVzdHMgY2FzZXMgY29udGFpbmVkIGluIHRoZSBUZXN0Q2FzZS1kZXJpdmVkCisgICAgIyBjbGFzcyB0ZXN0Q2FzZUNsYXNzIgorICAgICMKKyAgICAjIE1ha2Ugc3VyZSBsb2FkVGVzdHNGcm9tVGVzdENhc2UoKSBwaWNrcyB1cCB0aGUgZGVmYXVsdCB0ZXN0IG1ldGhvZAorICAgICMgbmFtZSAoYXMgc3BlY2lmaWVkIGJ5IFRlc3RDYXNlKSwgZXZlbiB0aG91Z2ggdGhlIG1ldGhvZCBuYW1lIGRvZXMKKyAgICAjIG5vdCBtYXRjaCB0aGUgZGVmYXVsdCBUZXN0TG9hZGVyLnRlc3RNZXRob2RQcmVmaXggc3RyaW5nCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbVRlc3RDYXNlX19kZWZhdWx0X21ldGhvZF9uYW1lKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHJ1blRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICAjIFRoaXMgaGFzIHRvIGJlIGZhbHNlIGZvciB0aGUgdGVzdCB0byBzdWNjZWVkCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ3J1blRlc3QnLnN0YXJ0c3dpdGgobG9hZGVyLnRlc3RNZXRob2RQcmVmaXgpKQorCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShGb28pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtGb28oJ3J1blRlc3QnKV0pCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIC9UZXN0cyBmb3IgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tVGVzdENhc2UKKworICAgICMjIyBUZXN0cyBmb3IgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgIyAiVGhpcyBtZXRob2Qgc2VhcmNoZXMgYG1vZHVsZWAgZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tIFRlc3RDYXNlIgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21Nb2R1bGVfX1Rlc3RDYXNlX3N1YmNsYXNzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICBleHBlY3RlZCA9IFtsb2FkZXIuc3VpdGVDbGFzcyhbTXlUZXN0Q2FzZSgndGVzdCcpXSldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIGV4cGVjdGVkKQorCisgICAgIyAiVGhpcyBtZXRob2Qgc2VhcmNoZXMgYG1vZHVsZWAgZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tIFRlc3RDYXNlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyBpZiBubyB0ZXN0cyBhcmUgZm91bmQgKG5vIFRlc3RDYXNlIGluc3RhbmNlcyk/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU1vZHVsZV9fbm9fVGVzdENhc2VfaW5zdGFuY2VzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW10pCisKKyAgICAjICJUaGlzIG1ldGhvZCBzZWFyY2hlcyBgbW9kdWxlYCBmb3IgY2xhc3NlcyBkZXJpdmVkIGZyb20gVGVzdENhc2UiCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIGlmIG5vIHRlc3RzIGFyZSBmb3VuZCAoVGVzdENhc2VzIGluc3RhbmNlcywgYnV0IG5vIHRlc3RzKT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTW9kdWxlX19ub19UZXN0Q2FzZV90ZXN0cyhzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW2xvYWRlci5zdWl0ZUNsYXNzKCldKQorCisgICAgIyAiVGhpcyBtZXRob2Qgc2VhcmNoZXMgYG1vZHVsZWAgZm9yIGNsYXNzZXMgZGVyaXZlZCBmcm9tIFRlc3RDYXNlInMKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgaWYgbG9hZFRlc3RzRnJvbU1vZHVsZSgpIGlzIGdpdmVuIHNvbWV0aGluZyBvdGhlcgorICAgICMgdGhhbiBhIG1vZHVsZT8KKyAgICAjCisgICAgIyBYWFggQ3VycmVudGx5LCBpdCBzdWNjZWVkcyBhbnl3YXkuIFRoaXMgZmxleGliaWxpdHkKKyAgICAjIHNob3VsZCBlaXRoZXIgYmUgZG9jdW1lbnRlZCBvciBsb2FkVGVzdHNGcm9tTW9kdWxlKCkgc2hvdWxkCisgICAgIyByYWlzZSBhIFR5cGVFcnJvcgorICAgICMKKyAgICAjIFhYWCBDZXJ0YWluIHBlb3BsZSBhcmUgdXNpbmcgdGhpcyBiZWhhdmlvdXIuIFdlJ2xsIGFkZCBhIHRlc3QgZm9yIGl0CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU1vZHVsZV9fbm90X2FfbW9kdWxlKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBOb3RBTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICB0ZXN0XzIgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoTm90QU1vZHVsZSkKKworICAgICAgICByZWZlcmVuY2UgPSBbdW5pdHRlc3QuVGVzdFN1aXRlKFtNeVRlc3RDYXNlKCd0ZXN0JyldKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgcmVmZXJlbmNlKQorCisKKyAgICAjIENoZWNrIHRoYXQgbG9hZFRlc3RzRnJvbU1vZHVsZSBob25vcnMgKG9yIG5vdCkgYSBtb2R1bGUKKyAgICAjIHdpdGggYSBsb2FkX3Rlc3RzIGZ1bmN0aW9uLgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21Nb2R1bGVfX2xvYWRfdGVzdHMoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIG0udGVzdGNhc2VfMSA9IE15VGVzdENhc2UKKworICAgICAgICBsb2FkX3Rlc3RzX2FyZ3MgPSBbXQorICAgICAgICBkZWYgbG9hZF90ZXN0cyhsb2FkZXIsIHRlc3RzLCBwYXR0ZXJuKToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZSh0ZXN0cywgdW5pdHRlc3QuVGVzdFN1aXRlKQorICAgICAgICAgICAgbG9hZF90ZXN0c19hcmdzLmV4dGVuZCgobG9hZGVyLCB0ZXN0cywgcGF0dGVybikpCisgICAgICAgICAgICByZXR1cm4gdGVzdHMKKyAgICAgICAgbS5sb2FkX3Rlc3RzID0gbG9hZF90ZXN0cworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgdW5pdHRlc3QuVGVzdFN1aXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRfdGVzdHNfYXJncywgW2xvYWRlciwgc3VpdGUsIE5vbmVdKQorCisgICAgICAgIGxvYWRfdGVzdHNfYXJncyA9IFtdCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUobSwgdXNlX2xvYWRfdGVzdHM9RmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZF90ZXN0c19hcmdzLCBbXSkKKworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21Nb2R1bGVfX2ZhdWx0eV9sb2FkX3Rlc3RzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisKKyAgICAgICAgZGVmIGxvYWRfdGVzdHMobG9hZGVyLCB0ZXN0cywgcGF0dGVybik6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ3NvbWUgZmFpbHVyZScpCisgICAgICAgIG0ubG9hZF90ZXN0cyA9IGxvYWRfdGVzdHMKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIHVuaXR0ZXN0LlRlc3RTdWl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5jb3VudFRlc3RDYXNlcygpLCAxKQorICAgICAgICB0ZXN0ID0gbGlzdChzdWl0ZSlbMF0KKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cChUeXBlRXJyb3IsICJzb21lIGZhaWx1cmUiLCB0ZXN0Lm0pCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIC9UZXN0cyBmb3IgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKCkKKworICAgICMjIyBUZXN0cyBmb3IgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgpCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBJcyBWYWx1ZUVycm9yIHJhaXNlZCBpbiByZXNwb25zZSB0byBhbiBlbXB0eSBuYW1lPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19lbXB0eV9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJycpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJFbXB0eSBtb2R1bGUgbmFtZSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUgZmFpbGVkIHRvIHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiB0aGUgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnM/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX21hbGZvcm1lZF9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICAjIFhYWCBTaG91bGQgdGhpcyByYWlzZSBWYWx1ZUVycm9yIG9yIEltcG9ydEVycm9yPworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ2FiYyAoKSAvLycpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUgZmFpbGVkIHRvIHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvIGEKKyAgICAjIG1vZHVsZSIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiBhIG1vZHVsZSBieSB0aGF0IG5hbWUgY2FuJ3QgYmUgZm91bmQ/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX3Vua25vd25fbW9kdWxlX25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnc2Rhc2Zhc2Zhc2RmJykKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJObyBtb2R1bGUgbmFtZWQgc2Rhc2Zhc2Zhc2RmIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgSW1wb3J0RXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiB0aGUgbW9kdWxlIGlzIGZvdW5kLCBidXQgdGhlIGF0dHJpYnV0ZSBjYW4ndD8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fdW5rbm93bl9hdHRyX25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndW5pdHRlc3Quc2Rhc2Zhc2Zhc2RmJykKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICInbW9kdWxlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc2Rhc2Zhc2Zhc2RmJyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUgZmFpbGVkIHRvIHJhaXNlIEF0dHJpYnV0ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIHdoZW4gd2UgcHJvdmlkZSB0aGUgbW9kdWxlLCBidXQgdGhlIGF0dHJpYnV0ZSBjYW4ndCBiZQorICAgICMgZm91bmQ/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX3JlbGF0aXZlX3Vua25vd25fbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdzZGFzZmFzZmFzZGYnLCB1bml0dGVzdCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICInbW9kdWxlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc2Rhc2Zhc2Zhc2RmJyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUgZmFpbGVkIHRvIHJhaXNlIEF0dHJpYnV0ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIyAuLi4KKyAgICAjICJUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgbmFtZSByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbW9kdWxlIgorICAgICMKKyAgICAjIERvZXMgbG9hZFRlc3RzRnJvbU5hbWUgcmFpc2UgVmFsdWVFcnJvciB3aGVuIHBhc3NlZCBhbiBlbXB0eQorICAgICMgbmFtZSByZWxhdGl2ZSB0byBhIHByb3ZpZGVkIG1vZHVsZT8KKyAgICAjCisgICAgIyBYWFggU2hvdWxkIHByb2JhYmx5IHJhaXNlIGEgVmFsdWVFcnJvciBpbnN0ZWFkIG9mIGFuIEF0dHJpYnV0ZUVycm9yCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX3JlbGF0aXZlX2VtcHR5X25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnJywgdW5pdHRlc3QpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRmFpbGVkIHRvIHJhaXNlIEF0dHJpYnV0ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIyAuLi4KKyAgICAjICJUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgbmFtZSByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbW9kdWxlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIGFuIGltcG9zc2libGUgbmFtZSBpcyBnaXZlbiwgcmVsYXRpdmUgdG8gdGhlIHByb3ZpZGVkCisgICAgIyBgbW9kdWxlYD8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfbWFsZm9ybWVkX25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgICMgWFhYIFNob3VsZCB0aGlzIHJhaXNlIEF0dHJpYnV0ZUVycm9yIG9yIFZhbHVlRXJyb3I/CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnYWJjICgpIC8vJywgdW5pdHRlc3QpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUgZmFpbGVkIHRvIHJhaXNlIFZhbHVlRXJyb3IiKQorCisgICAgIyAiVGhlIG1ldGhvZCBvcHRpb25hbGx5IHJlc29sdmVzIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG1vZHVsZSIKKyAgICAjCisgICAgIyBEb2VzIGxvYWRUZXN0c0Zyb21OYW1lIHJhaXNlIFR5cGVFcnJvciB3aGVuIHRoZSBgbW9kdWxlYCBhcmd1bWVudAorICAgICMgaXNuJ3QgYSBtb2R1bGUgb2JqZWN0PworICAgICMKKyAgICAjIFhYWCBBY2NlcHRzIHRoZSBub3QtYS1tb2R1bGUgb2JqZWN0LCBpZ25vcm5pbmcgdGhlIG9iamVjdCdzIHR5cGUKKyAgICAjIFRoaXMgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiBvciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGNoYW5nZWQKKyAgICAjCisgICAgIyBYWFggU29tZSBwZW9wbGUgYXJlIHJlbHlpbmcgb24gdGhpcywgc28ga2VlcCBpdCBmb3Igbm93CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX3JlbGF0aXZlX25vdF9hX21vZHVsZShzZWxmKToKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgTm90QU1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgdGVzdF8yID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndGVzdF8yJywgTm90QU1vZHVsZSkKKworICAgICAgICByZWZlcmVuY2UgPSBbTXlUZXN0Q2FzZSgndGVzdCcpXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCByZWZlcmVuY2UpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMKKyAgICAjIERvZXMgaXQgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBuYW1lIHJlc29sdmVzIHRvIGFuIGludmFsaWQKKyAgICAjIG9iamVjdD8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfYmFkX29iamVjdChzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBtLnRlc3RjYXNlXzEgPSBvYmplY3QoKQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ3Rlc3RjYXNlXzEnLCBtKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgVHlwZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heQorICAgICMgcmVzb2x2ZSBlaXRoZXIgdG8gLi4uIGEgdGVzdCBjYXNlIGNsYXNzIgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19yZWxhdGl2ZV9UZXN0Q2FzZV9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndGVzdGNhc2VfMScsIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtNeVRlc3RDYXNlKCd0ZXN0JyldKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfVGVzdFN1aXRlKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbTXlUZXN0Q2FzZSgndGVzdCcpXSkKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ3Rlc3RzdWl0ZScsIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW015VGVzdENhc2UoJ3Rlc3QnKV0pCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8KKyAgICAjIC4uLiBhIHRlc3QgbWV0aG9kIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcyIKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfdGVzdG1ldGhvZChzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndGVzdGNhc2VfMS50ZXN0JywgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbTXlUZXN0Q2FzZSgndGVzdCcpXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIworICAgICMgRG9lcyBsb2FkVGVzdHNGcm9tTmFtZSgpIHJhaXNlIHRoZSBwcm9wZXIgZXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvCisgICAgIyByZXNvbHZlICJhIHRlc3QgbWV0aG9kIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcyIgdGhhdCBkb2Vzbid0IGV4aXN0CisgICAgIyBmb3IgdGhlIGdpdmVuIG5hbWUgKHJlbGF0aXZlIHRvIGEgcHJvdmlkZWQgbW9kdWxlKT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfaW52YWxpZF90ZXN0bWV0aG9kKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgndGVzdGNhc2VfMS50ZXN0Zm9vJywgbSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJ0eXBlIG9iamVjdCAnTXlUZXN0Q2FzZScgaGFzIG5vIGF0dHJpYnV0ZSAndGVzdGZvbyciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhIC4uLiBUZXN0U3VpdGUgaW5zdGFuY2UiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX2NhbGxhYmxlX19UZXN0U3VpdGUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgdGVzdGNhc2VfMSA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICB0ZXN0Y2FzZV8yID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisgICAgICAgIGRlZiByZXR1cm5fVGVzdFN1aXRlKCk6CisgICAgICAgICAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0Y2FzZV8xLCB0ZXN0Y2FzZV8yXSkKKyAgICAgICAgbS5yZXR1cm5fVGVzdFN1aXRlID0gcmV0dXJuX1Rlc3RTdWl0ZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgncmV0dXJuX1Rlc3RTdWl0ZScsIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFt0ZXN0Y2FzZV8xLCB0ZXN0Y2FzZV8yXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYSBUZXN0Q2FzZSAuLi4gaW5zdGFuY2UiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVfX2NhbGxhYmxlX19UZXN0Q2FzZV9pbnN0YW5jZShzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICB0ZXN0Y2FzZV8xID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisgICAgICAgIGRlZiByZXR1cm5fVGVzdENhc2UoKToKKyAgICAgICAgICAgIHJldHVybiB0ZXN0Y2FzZV8xCisgICAgICAgIG0ucmV0dXJuX1Rlc3RDYXNlID0gcmV0dXJuX1Rlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdyZXR1cm5fVGVzdENhc2UnLCBtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbdGVzdGNhc2VfMV0pCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8KKyAgICAjIC4uLiBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEgVGVzdENhc2UgLi4uIGluc3RhbmNlIgorICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICNPdmVycmlkZSB0aGUgc3VpdGVDbGFzcyBhdHRyaWJ1dGUgdG8gZW5zdXJlIHRoYXQgdGhlIHN1aXRlQ2xhc3MKKyAgICAjYXR0cmlidXRlIGlzIHVzZWQKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fY2FsbGFibGVfX1Rlc3RDYXNlX2luc3RhbmNlX1Byb3BlclN1aXRlQ2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFN1YlRlc3RTdWl0ZSh1bml0dGVzdC5UZXN0U3VpdGUpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIHRlc3RjYXNlXzEgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgZGVmIHJldHVybl9UZXN0Q2FzZSgpOgorICAgICAgICAgICAgcmV0dXJuIHRlc3RjYXNlXzEKKyAgICAgICAgbS5yZXR1cm5fVGVzdENhc2UgPSByZXR1cm5fVGVzdENhc2UKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnN1aXRlQ2xhc3MgPSBTdWJUZXN0U3VpdGUKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ3JldHVybl9UZXN0Q2FzZScsIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFt0ZXN0Y2FzZV8xXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgdGVzdCBtZXRob2Qgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzIgorICAgICMqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICNPdmVycmlkZSB0aGUgc3VpdGVDbGFzcyBhdHRyaWJ1dGUgdG8gZW5zdXJlIHRoYXQgdGhlIHN1aXRlQ2xhc3MKKyAgICAjYXR0cmlidXRlIGlzIHVzZWQKKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fcmVsYXRpdmVfdGVzdG1ldGhvZF9Qcm9wZXJTdWl0ZUNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBTdWJUZXN0U3VpdGUodW5pdHRlc3QuVGVzdFN1aXRlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc3VpdGVDbGFzcz1TdWJUZXN0U3VpdGUKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ3Rlc3RjYXNlXzEudGVzdCcsIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW015VGVzdENhc2UoJ3Rlc3QnKV0pCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSAuLi4gdG8KKyAgICAjIC4uLiBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyBpZiB0aGUgY2FsbGFibGUgcmV0dXJucyBzb21ldGhpbmcgZWxzZT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZV9fY2FsbGFibGVfX3dyb25nX3R5cGUoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgZGVmIHJldHVybl93cm9uZygpOgorICAgICAgICAgICAgcmV0dXJuIDYKKyAgICAgICAgbS5yZXR1cm5fd3JvbmcgPSByZXR1cm5fd3JvbmcKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdyZXR1cm5fd3JvbmcnLCBtKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lIGZhaWxlZCB0byByYWlzZSBUeXBlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBjYW4gcmVmZXIgdG8gbW9kdWxlcyBhbmQgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QgYmVlbgorICAgICMgaW1wb3J0ZWQ7IHRoZXkgd2lsbCBiZSBpbXBvcnRlZCBhcyBhIHNpZGUtZWZmZWN0IgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lX19tb2R1bGVfbm90X2xvYWRlZChzZWxmKToKKyAgICAgICAgIyBXZSdyZSBnb2luZyB0byB0cnkgdG8gbG9hZCB0aGlzIG1vZHVsZSBhcyBhIHNpZGUtZWZmZWN0LCBzbyBpdAorICAgICAgICAjIGJldHRlciBub3QgYmUgbG9hZGVkIGJlZm9yZSB3ZSB0cnkuCisgICAgICAgICMKKyAgICAgICAgbW9kdWxlX25hbWUgPSAndW5pdHRlc3QudGVzdC5kdW1teScKKyAgICAgICAgc3lzLm1vZHVsZXMucG9wKG1vZHVsZV9uYW1lLCBOb25lKQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZShtb2R1bGVfbmFtZSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtdKQorCisgICAgICAgICAgICAjIG1vZHVsZSBzaG91bGQgbm93IGJlIGxvYWRlZCwgdGhhbmtzIHRvIGxvYWRUZXN0c0Zyb21OYW1lKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4obW9kdWxlX25hbWUsIHN5cy5tb2R1bGVzKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgbW9kdWxlX25hbWUgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZHVsZV9uYW1lXQorCisgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworICAgICMjIyBUZXN0cyBmb3IgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgpCisKKyAgICAjIyMgVGVzdHMgZm9yIFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKCkKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAjICJTaW1pbGFyIHRvIGxvYWRUZXN0c0Zyb21OYW1lKCksIGJ1dCB0YWtlcyBhIHNlcXVlbmNlIG9mIG5hbWVzIHJhdGhlcgorICAgICMgdGhhbiBhIHNpbmdsZSBuYW1lLiIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgaWYgdGhhdCBzZXF1ZW5jZSBvZiBuYW1lcyBpcyBlbXB0eT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX2VtcHR5X25hbWVfbGlzdChzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFtdKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbXSkKKworICAgICMgIlNpbWlsYXIgdG8gbG9hZFRlc3RzRnJvbU5hbWUoKSwgYnV0IHRha2VzIGEgc2VxdWVuY2Ugb2YgbmFtZXMgcmF0aGVyCisgICAgIyB0aGFuIGEgc2luZ2xlIG5hbWUuIgorICAgICMgLi4uCisgICAgIyAiVGhlIG1ldGhvZCBvcHRpb25hbGx5IHJlc29sdmVzIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG1vZHVsZSIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgaWYgdGhhdCBzZXF1ZW5jZSBvZiBuYW1lcyBpcyBlbXB0eT8KKyAgICAjCisgICAgIyBYWFggU2hvdWxkIHRoaXMgcmFpc2UgYSBWYWx1ZUVycm9yIG9yIGp1c3QgcmV0dXJuIGFuIGVtcHR5IFRlc3RTdWl0ZT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3JlbGF0aXZlX2VtcHR5X25hbWVfbGlzdChzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFtdLCB1bml0dGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW10pCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMKKyAgICAjIElzIFZhbHVlRXJyb3IgcmFpc2VkIGluIHJlc3BvbnNlIHRvIGFuIGVtcHR5IG5hbWU/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19lbXB0eV9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnJ10pCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJFbXB0eSBtb2R1bGUgbmFtZSIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzIGZhaWxlZCB0byByYWlzZSBWYWx1ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIHdoZW4gcHJlc2VudGVkIHdpdGggYW4gaW1wb3NzaWJsZSBtb2R1bGUgbmFtZT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX21hbGZvcm1lZF9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICAjIFhYWCBTaG91bGQgdGhpcyByYWlzZSBWYWx1ZUVycm9yIG9yIEltcG9ydEVycm9yPworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnYWJjICgpIC8vJ10pCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzIGZhaWxlZCB0byByYWlzZSBWYWx1ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIworICAgICMgV2hhdCBoYXBwZW5zIHdoZW4gbm8gbW9kdWxlIGNhbiBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIG5hbWU/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX191bmtub3duX21vZHVsZV9uYW1lKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnc2Rhc2Zhc2Zhc2RmJ10pCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGUpLCAiTm8gbW9kdWxlIG5hbWVkIHNkYXNmYXNmYXNkZiIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzIGZhaWxlZCB0byByYWlzZSBJbXBvcnRFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIHRoZSBtb2R1bGUgY2FuIGJlIGZvdW5kLCBidXQgbm90IHRoZSBhdHRyaWJ1dGU/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX191bmtub3duX2F0dHJfbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ3VuaXR0ZXN0LnNkYXNmYXNmYXNkZicsICd1bml0dGVzdCddKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIidtb2R1bGUnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzZGFzZmFzZmFzZGYnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMgZmFpbGVkIHRvIHJhaXNlIEF0dHJpYnV0ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIyAuLi4KKyAgICAjICJUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgbmFtZSByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbW9kdWxlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIGdpdmVuIGFuIHVua25vd24gYXR0cmlidXRlIG9uIGEgc3BlY2lmaWVkIGBtb2R1bGVgCisgICAgIyBhcmd1bWVudD8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3Vua25vd25fbmFtZV9yZWxhdGl2ZV8xKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnc2Rhc2Zhc2Zhc2RmJ10sIHVuaXR0ZXN0KQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgIidtb2R1bGUnIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICdzZGFzZmFzZmFzZGYnIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSBmYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjIC4uLgorICAgICMgIlRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBuYW1lIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBtb2R1bGUiCisgICAgIworICAgICMgRG8gdW5rbm93biBhdHRyaWJ1dGVzIChyZWxhdGl2ZSB0byBhIHByb3ZpZGVkIG1vZHVsZSkgc3RpbGwgcmFpc2UgYW4KKyAgICAjIGV4Y2VwdGlvbiBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiB2YWxpZCBhdHRyaWJ1dGUgbmFtZXM/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX191bmtub3duX25hbWVfcmVsYXRpdmVfMihzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ1Rlc3RDYXNlJywgJ3NkYXNmYXNmYXNkZiddLCB1bml0dGVzdCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICInbW9kdWxlJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnc2Rhc2Zhc2Zhc2RmJyIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUgZmFpbGVkIHRvIHJhaXNlIEF0dHJpYnV0ZUVycm9yIikKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIGVpdGhlciB0bworICAgICMgYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFRlc3RTdWl0ZSBpbnN0YW5jZSwgYSB0ZXN0IG1ldGhvZAorICAgICMgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzLCBvciBhIGNhbGxhYmxlIG9iamVjdCB3aGljaCByZXR1cm5zIGEKKyAgICAjIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZS4iCisgICAgIyAuLi4KKyAgICAjICJUaGUgbWV0aG9kIG9wdGlvbmFsbHkgcmVzb2x2ZXMgbmFtZSByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gbW9kdWxlIgorICAgICMKKyAgICAjIFdoYXQgaGFwcGVucyB3aGVuIGZhY2VkIHdpdGggdGhlIGVtcHR5IHN0cmluZz8KKyAgICAjCisgICAgIyBYWFggVGhpcyBjdXJyZW50bHkgcmFpc2VzIEF0dHJpYnV0ZUVycm9yLCB0aG91Z2ggVmFsdWVFcnJvciBpcyBwcm9iYWJseQorICAgICMgbW9yZSBhcHByb3ByaWF0ZQorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fcmVsYXRpdmVfZW1wdHlfbmFtZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJyddLCB1bml0dGVzdCkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgVmFsdWVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIG5hbWUgaXMgYSBgYGRvdHRlZCBuYW1lJycgdGhhdCBtYXkgcmVzb2x2ZSBlaXRoZXIgdG8KKyAgICAjIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSBUZXN0U3VpdGUgaW5zdGFuY2UsIGEgdGVzdCBtZXRob2QKKyAgICAjIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhCisgICAgIyBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UuIgorICAgICMgLi4uCisgICAgIyAiVGhlIG1ldGhvZCBvcHRpb25hbGx5IHJlc29sdmVzIG5hbWUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIG1vZHVsZSIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiBwcmVzZW50ZWQgd2l0aCBhbiBpbXBvc3NpYmxlIGF0dHJpYnV0ZSBuYW1lPworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fcmVsYXRpdmVfbWFsZm9ybWVkX25hbWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgICMgWFhYIFNob3VsZCB0aGlzIHJhaXNlIEF0dHJpYnV0ZUVycm9yIG9yIFZhbHVlRXJyb3I/CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydhYmMgKCkgLy8nXSwgdW5pdHRlc3QpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzIGZhaWxlZCB0byByYWlzZSBWYWx1ZUVycm9yIikKKworICAgICMgIlRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBuYW1lIHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBtb2R1bGUiCisgICAgIworICAgICMgRG9lcyBsb2FkVGVzdHNGcm9tTmFtZXMoKSBtYWtlIHN1cmUgdGhlIHByb3ZpZGVkIGBtb2R1bGVgIGlzIGluIGZhY3QKKyAgICAjIGEgbW9kdWxlPworICAgICMKKyAgICAjIFhYWCBUaGlzIHZhbGlkYXRpb24gaXMgY3VycmVudGx5IG5vdCBkb25lLiBUaGlzIGZsZXhpYmlsaXR5IHNob3VsZAorICAgICMgZWl0aGVyIGJlIGRvY3VtZW50ZWQgb3IgYSBUeXBlRXJyb3Igc2hvdWxkIGJlIHJhaXNlZC4KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX3JlbGF0aXZlX25vdF9hX21vZHVsZShzZWxmKToKKyAgICAgICAgY2xhc3MgTXlUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdChzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgY2xhc3MgTm90QU1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgdGVzdF8yID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWyd0ZXN0XzInXSwgTm90QU1vZHVsZSkKKworICAgICAgICByZWZlcmVuY2UgPSBbdW5pdHRlc3QuVGVzdFN1aXRlKFtNeVRlc3RDYXNlKCd0ZXN0JyldKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgcmVmZXJlbmNlKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgZWl0aGVyIHRvCisgICAgIyBhIG1vZHVsZSwgYSB0ZXN0IGNhc2UgY2xhc3MsIGEgVGVzdFN1aXRlIGluc3RhbmNlLCBhIHRlc3QgbWV0aG9kCisgICAgIyB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYQorICAgICMgVGVzdENhc2Ugb3IgVGVzdFN1aXRlIGluc3RhbmNlLiIKKyAgICAjCisgICAgIyBEb2VzIGl0IHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbmFtZSByZXNvbHZlcyB0byBhbiBpbnZhbGlkCisgICAgIyBvYmplY3Q/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19yZWxhdGl2ZV9iYWRfb2JqZWN0KHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIG0udGVzdGNhc2VfMSA9IG9iamVjdCgpCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWyd0ZXN0Y2FzZV8xJ10sIG0pCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBUeXBlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSB0ZXN0IGNhc2UgY2xhc3MiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19yZWxhdGl2ZV9UZXN0Q2FzZV9zdWJjbGFzcyhzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWyd0ZXN0Y2FzZV8xJ10sIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgZXhwZWN0ZWQgPSBsb2FkZXIuc3VpdGVDbGFzcyhbTXlUZXN0Q2FzZSgndGVzdCcpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW2V4cGVjdGVkXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgVGVzdFN1aXRlIGluc3RhbmNlIgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fcmVsYXRpdmVfVGVzdFN1aXRlKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbTXlUZXN0Q2FzZSgndGVzdCcpXSkKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsndGVzdHN1aXRlJ10sIG0pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWl0ZSwgbG9hZGVyLnN1aXRlQ2xhc3MpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW20udGVzdHN1aXRlXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0byAuLi4gYQorICAgICMgdGVzdCBtZXRob2Qgd2l0aGluIGEgdGVzdCBjYXNlIGNsYXNzIgorICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fcmVsYXRpdmVfdGVzdG1ldGhvZChzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBNeVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgbS50ZXN0Y2FzZV8xID0gTXlUZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWyd0ZXN0Y2FzZV8xLnRlc3QnXSwgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICByZWZfc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW015VGVzdENhc2UoJ3Rlc3QnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtyZWZfc3VpdGVdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvIC4uLiBhCisgICAgIyB0ZXN0IG1ldGhvZCB3aXRoaW4gYSB0ZXN0IGNhc2UgY2xhc3MiCisgICAgIworICAgICMgRG9lcyB0aGUgbWV0aG9kIGdyYWNlZnVsbHkgaGFuZGxlIG5hbWVzIHRoYXQgaW5pdGlhbGx5IGxvb2sgbGlrZSB0aGV5CisgICAgIyByZXNvbHZlIHRvICJhIHRlc3QgbWV0aG9kIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcyIgYnV0IGRvbid0PworICAgIGRlZiB0ZXN0X2xvYWRUZXN0c0Zyb21OYW1lc19fcmVsYXRpdmVfaW52YWxpZF90ZXN0bWV0aG9kKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIE15VGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBtLnRlc3RjYXNlXzEgPSBNeVRlc3RDYXNlCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWyd0ZXN0Y2FzZV8xLnRlc3Rmb28nXSwgbSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZSksICJ0eXBlIG9iamVjdCAnTXlUZXN0Q2FzZScgaGFzIG5vIGF0dHJpYnV0ZSAndGVzdGZvbyciKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgQXR0cmlidXRlRXJyb3IiKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhIC4uLiBUZXN0U3VpdGUgaW5zdGFuY2UiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19jYWxsYWJsZV9fVGVzdFN1aXRlKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIHRlc3RjYXNlXzEgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgdGVzdGNhc2VfMiA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICBkZWYgcmV0dXJuX1Rlc3RTdWl0ZSgpOgorICAgICAgICAgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdGNhc2VfMSwgdGVzdGNhc2VfMl0pCisgICAgICAgIG0ucmV0dXJuX1Rlc3RTdWl0ZSA9IHJldHVybl9UZXN0U3VpdGUKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsncmV0dXJuX1Rlc3RTdWl0ZSddLCBtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorCisgICAgICAgIGV4cGVjdGVkID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0Y2FzZV8xLCB0ZXN0Y2FzZV8yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW2V4cGVjdGVkXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYSBUZXN0Q2FzZSAuLi4gaW5zdGFuY2UiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19jYWxsYWJsZV9fVGVzdENhc2VfaW5zdGFuY2Uoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgdGVzdGNhc2VfMSA9IHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorICAgICAgICBkZWYgcmV0dXJuX1Rlc3RDYXNlKCk6CisgICAgICAgICAgICByZXR1cm4gdGVzdGNhc2VfMQorICAgICAgICBtLnJldHVybl9UZXN0Q2FzZSA9IHJldHVybl9UZXN0Q2FzZQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydyZXR1cm5fVGVzdENhc2UnXSwgbSkKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKworICAgICAgICByZWZfc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3Rlc3RjYXNlXzFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qoc3VpdGUpLCBbcmVmX3N1aXRlXSkKKworICAgICMgIlRoZSBzcGVjaWZpZXIgbmFtZSBpcyBhIGBgZG90dGVkIG5hbWUnJyB0aGF0IG1heSByZXNvbHZlIC4uLiB0bworICAgICMgLi4uIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYSBUZXN0Q2FzZSBvciBUZXN0U3VpdGUgaW5zdGFuY2UiCisgICAgIworICAgICMgQXJlIHN0YXRpY21ldGhvZHMgaGFuZGxlZCBjb3JyZWN0bHk/CisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19jYWxsYWJsZV9fY2FsbF9zdGF0aWNtZXRob2Qoc2VsZik6CisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgVGVzdDEodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3RjYXNlXzEgPSBUZXN0MSgndGVzdCcpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgZm9vKCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRlc3RjYXNlXzEKKyAgICAgICAgbS5Gb28gPSBGb28KKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc3VpdGUgPSBsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnRm9vLmZvbyddLCBtKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3VpdGUsIGxvYWRlci5zdWl0ZUNsYXNzKQorCisgICAgICAgIHJlZl9zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdGNhc2VfMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFtyZWZfc3VpdGVdKQorCisgICAgIyAiVGhlIHNwZWNpZmllciBuYW1lIGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUgLi4uIHRvCisgICAgIyAuLi4gYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2ggcmV0dXJucyBhIFRlc3RDYXNlIG9yIFRlc3RTdWl0ZSBpbnN0YW5jZSIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgd2hlbiB0aGUgY2FsbGFibGUgcmV0dXJucyBzb21ldGhpbmcgZWxzZT8KKyAgICBkZWYgdGVzdF9sb2FkVGVzdHNGcm9tTmFtZXNfX2NhbGxhYmxlX193cm9uZ190eXBlKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGRlZiByZXR1cm5fd3JvbmcoKToKKyAgICAgICAgICAgIHJldHVybiA2CisgICAgICAgIG0ucmV0dXJuX3dyb25nID0gcmV0dXJuX3dyb25nCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoWydyZXR1cm5fd3JvbmcnXSwgbSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMgZmFpbGVkIHRvIHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAjICJUaGUgc3BlY2lmaWVyIGNhbiByZWZlciB0byBtb2R1bGVzIGFuZCBwYWNrYWdlcyB3aGljaCBoYXZlIG5vdCBiZWVuCisgICAgIyBpbXBvcnRlZDsgdGhleSB3aWxsIGJlIGltcG9ydGVkIGFzIGEgc2lkZS1lZmZlY3QiCisgICAgZGVmIHRlc3RfbG9hZFRlc3RzRnJvbU5hbWVzX19tb2R1bGVfbm90X2xvYWRlZChzZWxmKToKKyAgICAgICAgIyBXZSdyZSBnb2luZyB0byB0cnkgdG8gbG9hZCB0aGlzIG1vZHVsZSBhcyBhIHNpZGUtZWZmZWN0LCBzbyBpdAorICAgICAgICAjIGJldHRlciBub3QgYmUgbG9hZGVkIGJlZm9yZSB3ZSB0cnkuCisgICAgICAgICMKKyAgICAgICAgbW9kdWxlX25hbWUgPSAndW5pdHRlc3QudGVzdC5kdW1teScKKyAgICAgICAgc3lzLm1vZHVsZXMucG9wKG1vZHVsZV9uYW1lLCBOb25lKQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWl0ZSA9IGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoW21vZHVsZV9uYW1lXSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN1aXRlLCBsb2FkZXIuc3VpdGVDbGFzcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFt1bml0dGVzdC5UZXN0U3VpdGUoKV0pCisKKyAgICAgICAgICAgICMgbW9kdWxlIHNob3VsZCBub3cgYmUgbG9hZGVkLCB0aGFua3MgdG8gbG9hZFRlc3RzRnJvbU5hbWUoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihtb2R1bGVfbmFtZSwgc3lzLm1vZHVsZXMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBtb2R1bGVfbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kdWxlX25hbWVdCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIC9UZXN0cyBmb3IgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tTmFtZXMoKQorCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoKQorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgIlJldHVybiBhIHNvcnRlZCBzZXF1ZW5jZSBvZiBtZXRob2QgbmFtZXMgZm91bmQgd2l0aGluIHRlc3RDYXNlQ2xhc3MiCisgICAgIworICAgICMgVGVzdC5mb29iYXIgaXMgZGVmaW5lZCB0byBtYWtlIHN1cmUgZ2V0VGVzdENhc2VOYW1lcygpIHJlc3BlY3RzCisgICAgIyBsb2FkZXIudGVzdE1ldGhvZFByZWZpeAorICAgIGRlZiB0ZXN0X2dldFRlc3RDYXNlTmFtZXMoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIGZvb2JhcihzZWxmKTogcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoVGVzdCksIFsndGVzdF8xJywgJ3Rlc3RfMiddKQorCisgICAgIyAiUmV0dXJuIGEgc29ydGVkIHNlcXVlbmNlIG9mIG1ldGhvZCBuYW1lcyBmb3VuZCB3aXRoaW4gdGVzdENhc2VDbGFzcyIKKyAgICAjCisgICAgIyBEb2VzIGdldFRlc3RDYXNlTmFtZXMoKSBiZWhhdmUgYXBwcm9wcmlhdGVseSBpZiBubyB0ZXN0cyBhcmUgZm91bmQ/CisgICAgZGVmIHRlc3RfZ2V0VGVzdENhc2VOYW1lc19fbm9fdGVzdHMoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIGZvb2JhcihzZWxmKTogcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoVGVzdCksIFtdKQorCisgICAgIyAiUmV0dXJuIGEgc29ydGVkIHNlcXVlbmNlIG9mIG1ldGhvZCBuYW1lcyBmb3VuZCB3aXRoaW4gdGVzdENhc2VDbGFzcyIKKyAgICAjCisgICAgIyBBcmUgbm90LVRlc3RDYXNlcyBoYW5kbGVkIGdyYWNlZnVsbHk/CisgICAgIworICAgICMgWFhYIFRoaXMgc2hvdWxkIHJhaXNlIGEgVHlwZUVycm9yLCBub3QgcmV0dXJuIGEgbGlzdAorICAgICMKKyAgICAjIFhYWCBJdCdzIHRvbyBsYXRlIGluIHRoZSAyLjUgcmVsZWFzZSBjeWNsZSB0byBmaXggdGhpcywgYnV0IGl0IHNob3VsZAorICAgICMgcHJvYmFibHkgYmUgcmV2aXNpdGVkIGZvciAyLjYKKyAgICBkZWYgdGVzdF9nZXRUZXN0Q2FzZU5hbWVzX19ub3RfYV9UZXN0Q2FzZShzZWxmKToKKyAgICAgICAgY2xhc3MgQmFkQ2FzZShpbnQpOgorICAgICAgICAgICAgZGVmIHRlc3RfZm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbmFtZXMgPSBsb2FkZXIuZ2V0VGVzdENhc2VOYW1lcyhCYWRDYXNlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZXMsIFsndGVzdF9mb28nXSkKKworICAgICMgIlJldHVybiBhIHNvcnRlZCBzZXF1ZW5jZSBvZiBtZXRob2QgbmFtZXMgZm91bmQgd2l0aGluIHRlc3RDYXNlQ2xhc3MiCisgICAgIworICAgICMgTWFrZSBzdXJlIGluaGVyaXRlZCBuYW1lcyBhcmUgaGFuZGxlZC4KKyAgICAjCisgICAgIyBUZXN0UC5mb29iYXIgaXMgZGVmaW5lZCB0byBtYWtlIHN1cmUgZ2V0VGVzdENhc2VOYW1lcygpIHJlc3BlY3RzCisgICAgIyBsb2FkZXIudGVzdE1ldGhvZFByZWZpeAorICAgIGRlZiB0ZXN0X2dldFRlc3RDYXNlTmFtZXNfX2luaGVyaXRhbmNlKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0UCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vYmFyKHNlbGYpOiBwYXNzCisKKyAgICAgICAgY2xhc3MgVGVzdEMoVGVzdFApOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMyhzZWxmKTogcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorCisgICAgICAgIG5hbWVzID0gWyd0ZXN0XzEnLCAndGVzdF8yJywgJ3Rlc3RfMyddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoVGVzdEMpLCBuYW1lcykKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1Rlc3RzIGZvciBUZXN0TG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoKQorCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLnRlc3RNZXRob2RQcmVmaXgKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAjICJTdHJpbmcgZ2l2aW5nIHRoZSBwcmVmaXggb2YgbWV0aG9kIG5hbWVzIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMKKyAgICAjIHRlc3QgbWV0aG9kcyIKKyAgICAjCisgICAgIyBJbXBsaWNpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpcyB0aGF0IHRlc3RNZXRob2RQcmVmaXggaXMgcmVzcGVjdGVkIGJ5CisgICAgIyBhbGwgbG9hZFRlc3RzRnJvbSogbWV0aG9kcy4KKyAgICBkZWYgdGVzdF90ZXN0TWV0aG9kUHJlZml4X19sb2FkVGVzdHNGcm9tVGVzdENhc2Uoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworCisgICAgICAgIHRlc3RzXzEgPSB1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygnZm9vX2JhcicpXSkKKyAgICAgICAgdGVzdHNfMiA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCd0ZXN0XzEnKSwgRm9vKCd0ZXN0XzInKV0pCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID0gJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEZvbyksIHRlc3RzXzEpCisKKyAgICAgICAgbG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPSAndGVzdCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEZvbyksIHRlc3RzXzIpCisKKyAgICAjICJTdHJpbmcgZ2l2aW5nIHRoZSBwcmVmaXggb2YgbWV0aG9kIG5hbWVzIHdoaWNoIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMKKyAgICAjIHRlc3QgbWV0aG9kcyIKKyAgICAjCisgICAgIyBJbXBsaWNpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpcyB0aGF0IHRlc3RNZXRob2RQcmVmaXggaXMgcmVzcGVjdGVkIGJ5CisgICAgIyBhbGwgbG9hZFRlc3RzRnJvbSogbWV0aG9kcy4KKyAgICBkZWYgdGVzdF90ZXN0TWV0aG9kUHJlZml4X19sb2FkVGVzdHNGcm9tTW9kdWxlKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIHRlc3RzXzEgPSBbdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ2Zvb19iYXInKV0pXQorICAgICAgICB0ZXN0c18yID0gW3VuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCd0ZXN0XzEnKSwgRm9vKCd0ZXN0XzInKV0pXQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIudGVzdE1ldGhvZFByZWZpeCA9ICdmb28nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChsb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShtKSksIHRlc3RzXzEpCisKKyAgICAgICAgbG9hZGVyLnRlc3RNZXRob2RQcmVmaXggPSAndGVzdCcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pKSwgdGVzdHNfMikKKworICAgICMgIlN0cmluZyBnaXZpbmcgdGhlIHByZWZpeCBvZiBtZXRob2QgbmFtZXMgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcworICAgICMgdGVzdCBtZXRob2RzIgorICAgICMKKyAgICAjIEltcGxpY2l0IGluIHRoZSBkb2N1bWVudGF0aW9uIGlzIHRoYXQgdGVzdE1ldGhvZFByZWZpeCBpcyByZXNwZWN0ZWQgYnkKKyAgICAjIGFsbCBsb2FkVGVzdHNGcm9tKiBtZXRob2RzLgorICAgIGRlZiB0ZXN0X3Rlc3RNZXRob2RQcmVmaXhfX2xvYWRUZXN0c0Zyb21OYW1lKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIHRlc3RzXzEgPSB1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygnZm9vX2JhcicpXSkKKyAgICAgICAgdGVzdHNfMiA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCd0ZXN0XzEnKSwgRm9vKCd0ZXN0XzInKV0pCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID0gJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ0ZvbycsIG0pLCB0ZXN0c18xKQorCisgICAgICAgIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID0gJ3Rlc3QnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKCdGb28nLCBtKSwgdGVzdHNfMikKKworICAgICMgIlN0cmluZyBnaXZpbmcgdGhlIHByZWZpeCBvZiBtZXRob2QgbmFtZXMgd2hpY2ggd2lsbCBiZSBpbnRlcnByZXRlZCBhcworICAgICMgdGVzdCBtZXRob2RzIgorICAgICMKKyAgICAjIEltcGxpY2l0IGluIHRoZSBkb2N1bWVudGF0aW9uIGlzIHRoYXQgdGVzdE1ldGhvZFByZWZpeCBpcyByZXNwZWN0ZWQgYnkKKyAgICAjIGFsbCBsb2FkVGVzdHNGcm9tKiBtZXRob2RzLgorICAgIGRlZiB0ZXN0X3Rlc3RNZXRob2RQcmVmaXhfX2xvYWRUZXN0c0Zyb21OYW1lcyhzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIGZvb19iYXIoc2VsZik6IHBhc3MKKyAgICAgICAgbS5Gb28gPSBGb28KKworICAgICAgICB0ZXN0c18xID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygnZm9vX2JhcicpXSldKQorICAgICAgICB0ZXN0c18yID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXSkKKyAgICAgICAgdGVzdHNfMiA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdHNfMl0pCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID0gJ2ZvbycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWVzKFsnRm9vJ10sIG0pLCB0ZXN0c18xKQorCisgICAgICAgIGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID0gJ3Rlc3QnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ0ZvbyddLCBtKSwgdGVzdHNfMikKKworICAgICMgIlRoZSBkZWZhdWx0IHZhbHVlIGlzICd0ZXN0JyIKKyAgICBkZWYgdGVzdF90ZXN0TWV0aG9kUHJlZml4X19kZWZhdWx0X3ZhbHVlKHNlbGYpOgorICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvYWRlci50ZXN0TWV0aG9kUHJlZml4ID09ICd0ZXN0JykKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1Rlc3RzIGZvciBUZXN0TG9hZGVyLnRlc3RNZXRob2RQcmVmaXgKKworICAgICMjIyBUZXN0cyBmb3IgVGVzdExvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgIkZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gY29tcGFyZSBtZXRob2QgbmFtZXMgd2hlbiBzb3J0aW5nIHRoZW0gaW4KKyAgICAjIGdldFRlc3RDYXNlTmFtZXMoKSBhbmQgYWxsIHRoZSBsb2FkVGVzdHNGcm9tWCgpIG1ldGhvZHMiCisgICAgZGVmIHRlc3Rfc29ydFRlc3RNZXRob2RzVXNpbmdfX2xvYWRUZXN0c0Zyb21UZXN0Q2FzZShzZWxmKToKKyAgICAgICAgZGVmIHJldmVyc2VkX2NtcCh4LCB5KToKKyAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnNvcnRUZXN0TWV0aG9kc1VzaW5nID0gcmV2ZXJzZWRfY21wCisKKyAgICAgICAgdGVzdHMgPSBsb2FkZXIuc3VpdGVDbGFzcyhbRm9vKCd0ZXN0XzInKSwgRm9vKCd0ZXN0XzEnKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShGb28pLCB0ZXN0cykKKworICAgICMgIkZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gY29tcGFyZSBtZXRob2QgbmFtZXMgd2hlbiBzb3J0aW5nIHRoZW0gaW4KKyAgICAjIGdldFRlc3RDYXNlTmFtZXMoKSBhbmQgYWxsIHRoZSBsb2FkVGVzdHNGcm9tWCgpIG1ldGhvZHMiCisgICAgZGVmIHRlc3Rfc29ydFRlc3RNZXRob2RzVXNpbmdfX2xvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZik6CisgICAgICAgIGRlZiByZXZlcnNlZF9jbXAoeCwgeSk6CisgICAgICAgICAgICByZXR1cm4gLWNtcCh4LCB5KQorCisgICAgICAgIG0gPSB0eXBlcy5Nb2R1bGVUeXBlKCdtJykKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKyAgICAgICAgbS5Gb28gPSBGb28KKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnNvcnRUZXN0TWV0aG9kc1VzaW5nID0gcmV2ZXJzZWRfY21wCisKKyAgICAgICAgdGVzdHMgPSBbbG9hZGVyLnN1aXRlQ2xhc3MoW0ZvbygndGVzdF8yJyksIEZvbygndGVzdF8xJyldKV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pKSwgdGVzdHMpCisKKyAgICAjICJGdW5jdGlvbiB0byBiZSB1c2VkIHRvIGNvbXBhcmUgbWV0aG9kIG5hbWVzIHdoZW4gc29ydGluZyB0aGVtIGluCisgICAgIyBnZXRUZXN0Q2FzZU5hbWVzKCkgYW5kIGFsbCB0aGUgbG9hZFRlc3RzRnJvbVgoKSBtZXRob2RzIgorICAgIGRlZiB0ZXN0X3NvcnRUZXN0TWV0aG9kc1VzaW5nX19sb2FkVGVzdHNGcm9tTmFtZShzZWxmKToKKyAgICAgICAgZGVmIHJldmVyc2VkX2NtcCh4LCB5KToKKyAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgPSByZXZlcnNlZF9jbXAKKworICAgICAgICB0ZXN0cyA9IGxvYWRlci5zdWl0ZUNsYXNzKFtGb28oJ3Rlc3RfMicpLCBGb28oJ3Rlc3RfMScpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUoJ0ZvbycsIG0pLCB0ZXN0cykKKworICAgICMgIkZ1bmN0aW9uIHRvIGJlIHVzZWQgdG8gY29tcGFyZSBtZXRob2QgbmFtZXMgd2hlbiBzb3J0aW5nIHRoZW0gaW4KKyAgICAjIGdldFRlc3RDYXNlTmFtZXMoKSBhbmQgYWxsIHRoZSBsb2FkVGVzdHNGcm9tWCgpIG1ldGhvZHMiCisgICAgZGVmIHRlc3Rfc29ydFRlc3RNZXRob2RzVXNpbmdfX2xvYWRUZXN0c0Zyb21OYW1lcyhzZWxmKToKKyAgICAgICAgZGVmIHJldmVyc2VkX2NtcCh4LCB5KToKKyAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgPSByZXZlcnNlZF9jbXAKKworICAgICAgICB0ZXN0cyA9IFtsb2FkZXIuc3VpdGVDbGFzcyhbRm9vKCd0ZXN0XzInKSwgRm9vKCd0ZXN0XzEnKV0pXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ0ZvbyddLCBtKSksIHRlc3RzKQorCisgICAgIyAiRnVuY3Rpb24gdG8gYmUgdXNlZCB0byBjb21wYXJlIG1ldGhvZCBuYW1lcyB3aGVuIHNvcnRpbmcgdGhlbSBpbgorICAgICMgZ2V0VGVzdENhc2VOYW1lcygpIgorICAgICMKKyAgICAjIERvZXMgaXQgYWN0dWFsbHkgYWZmZWN0IGdldFRlc3RDYXNlTmFtZXMoKT8KKyAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fZ2V0VGVzdENhc2VOYW1lcyhzZWxmKToKKyAgICAgICAgZGVmIHJldmVyc2VkX2NtcCh4LCB5KToKKyAgICAgICAgICAgIHJldHVybiAtY21wKHgsIHkpCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnNvcnRUZXN0TWV0aG9kc1VzaW5nID0gcmV2ZXJzZWRfY21wCisKKyAgICAgICAgdGVzdF9uYW1lcyA9IFsndGVzdF8yJywgJ3Rlc3RfMSddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmdldFRlc3RDYXNlTmFtZXMoRm9vKSwgdGVzdF9uYW1lcykKKworICAgICMgIlRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBidWlsdC1pbiBjbXAoKSBmdW5jdGlvbiIKKyAgICBkZWYgdGVzdF9zb3J0VGVzdE1ldGhvZHNVc2luZ19fZGVmYXVsdF92YWx1ZShzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgaXMgY21wKQorCisgICAgIyAiaXQgY2FuIGJlIHNldCB0byBOb25lIHRvIGRpc2FibGUgdGhlIHNvcnQuIgorICAgICMKKyAgICAjIFhYWCBIb3cgaXMgdGhpcyBkaWZmZXJlbnQgZnJvbSByZWFzc2lnbmluZyBjbXA/IEFyZSB0aGUgdGVzdHMgcmV0dXJuZWQKKyAgICAjIGluIGEgcmFuZG9tIG9yZGVyIG9yIHNvbWV0aGluZz8gVGhpcyBiZWhhdmlvdXIgc2hvdWxkIGRpZQorICAgIGRlZiB0ZXN0X3NvcnRUZXN0TWV0aG9kc1VzaW5nX19Ob25lKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc29ydFRlc3RNZXRob2RzVXNpbmcgPSBOb25lCisKKyAgICAgICAgdGVzdF9uYW1lcyA9IFsndGVzdF8yJywgJ3Rlc3RfMSddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0KGxvYWRlci5nZXRUZXN0Q2FzZU5hbWVzKEZvbykpLCBzZXQodGVzdF9uYW1lcykpCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIC9UZXN0cyBmb3IgVGVzdExvYWRlci5zb3J0VGVzdE1ldGhvZHNVc2luZworCisgICAgIyMjIFRlc3RzIGZvciBUZXN0TG9hZGVyLnN1aXRlQ2xhc3MKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAjICJDYWxsYWJsZSBvYmplY3QgdGhhdCBjb25zdHJ1Y3RzIGEgdGVzdCBzdWl0ZSBmcm9tIGEgbGlzdCBvZiB0ZXN0cy4iCisgICAgZGVmIHRlc3Rfc3VpdGVDbGFzc19fbG9hZFRlc3RzRnJvbVRlc3RDYXNlKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIGZvb19iYXIoc2VsZik6IHBhc3MKKworICAgICAgICB0ZXN0cyA9IFtGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXQorCisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBsb2FkZXIuc3VpdGVDbGFzcyA9IGxpc3QKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKEZvbyksIHRlc3RzKQorCisgICAgIyBJdCBpcyBpbXBsaWNpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgVGVzdExvYWRlci5zdWl0ZUNsYXNzIHRoYXQKKyAgICAjIGFsbCBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb20qIG1ldGhvZHMgcmVzcGVjdCBpdC4gTGV0J3MgbWFrZSBzdXJlCisgICAgZGVmIHRlc3Rfc3VpdGVDbGFzc19fbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmKToKKyAgICAgICAgbSA9IHR5cGVzLk1vZHVsZVR5cGUoJ20nKQorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIGZvb19iYXIoc2VsZik6IHBhc3MKKyAgICAgICAgbS5Gb28gPSBGb28KKworICAgICAgICB0ZXN0cyA9IFtbRm9vKCd0ZXN0XzEnKSwgRm9vKCd0ZXN0XzInKV1dCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5zdWl0ZUNsYXNzID0gbGlzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKG0pLCB0ZXN0cykKKworICAgICMgSXQgaXMgaW1wbGljaXQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIFRlc3RMb2FkZXIuc3VpdGVDbGFzcyB0aGF0CisgICAgIyBhbGwgVGVzdExvYWRlci5sb2FkVGVzdHNGcm9tKiBtZXRob2RzIHJlc3BlY3QgaXQuIExldCdzIG1ha2Ugc3VyZQorICAgIGRlZiB0ZXN0X3N1aXRlQ2xhc3NfX2xvYWRUZXN0c0Zyb21OYW1lKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIHRlc3RzID0gW0ZvbygndGVzdF8xJyksIEZvbygndGVzdF8yJyldCisKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisgICAgICAgIGxvYWRlci5zdWl0ZUNsYXNzID0gbGlzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSgnRm9vJywgbSksIHRlc3RzKQorCisgICAgIyBJdCBpcyBpbXBsaWNpdCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgVGVzdExvYWRlci5zdWl0ZUNsYXNzIHRoYXQKKyAgICAjIGFsbCBUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb20qIG1ldGhvZHMgcmVzcGVjdCBpdC4gTGV0J3MgbWFrZSBzdXJlCisgICAgZGVmIHRlc3Rfc3VpdGVDbGFzc19fbG9hZFRlc3RzRnJvbU5hbWVzKHNlbGYpOgorICAgICAgICBtID0gdHlwZXMuTW9kdWxlVHlwZSgnbScpCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF8yKHNlbGYpOiBwYXNzCisgICAgICAgICAgICBkZWYgZm9vX2JhcihzZWxmKTogcGFzcworICAgICAgICBtLkZvbyA9IEZvbworCisgICAgICAgIHRlc3RzID0gW1tGb28oJ3Rlc3RfMScpLCBGb28oJ3Rlc3RfMicpXV0KKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5UZXN0TG9hZGVyKCkKKyAgICAgICAgbG9hZGVyLnN1aXRlQ2xhc3MgPSBsaXN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lcyhbJ0ZvbyddLCBtKSwgdGVzdHMpCisKKyAgICAjICJUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgVGVzdFN1aXRlIGNsYXNzIgorICAgIGRlZiB0ZXN0X3N1aXRlQ2xhc3NfX2RlZmF1bHRfdmFsdWUoc2VsZik6CisgICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LlRlc3RMb2FkZXIoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9hZGVyLnN1aXRlQ2xhc3MgaXMgdW5pdHRlc3QuVGVzdFN1aXRlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQ4MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9sb2FkZXIucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmQ4MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfbG9hZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9wcm9ncmFtLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ5MDk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weQpAQCAtMCwwICsxLDI1NSBAQAorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisKK2ltcG9ydCBvcworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKKworY2xhc3MgVGVzdF9UZXN0UHJvZ3JhbSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kaXNjb3ZlcnlfZnJvbV9kb3R0ZWRfcGF0aChzZWxmKToKKyAgICAgICAgbG9hZGVyID0gdW5pdHRlc3QuVGVzdExvYWRlcigpCisKKyAgICAgICAgdGVzdHMgPSBbc2VsZl0KKyAgICAgICAgZXhwZWN0ZWRQYXRoID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZSh1bml0dGVzdC50ZXN0Ll9fZmlsZV9fKSkKKworICAgICAgICBzZWxmLndhc1J1biA9IEZhbHNlCisgICAgICAgIGRlZiBfZmluZF90ZXN0cyhzdGFydF9kaXIsIHBhdHRlcm4pOgorICAgICAgICAgICAgc2VsZi53YXNSdW4gPSBUcnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXJ0X2RpciwgZXhwZWN0ZWRQYXRoKQorICAgICAgICAgICAgcmV0dXJuIHRlc3RzCisgICAgICAgIGxvYWRlci5fZmluZF90ZXN0cyA9IF9maW5kX3Rlc3RzCisgICAgICAgIHN1aXRlID0gbG9hZGVyLmRpc2NvdmVyKCd1bml0dGVzdC50ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYud2FzUnVuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLl90ZXN0cywgdGVzdHMpCisKKyAgICAjIEhvcnJpYmxlIHdoaXRlIGJveCB0ZXN0CisgICAgZGVmIHRlc3ROb0V4aXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IG9iamVjdCgpCisgICAgICAgIHRlc3QgPSBvYmplY3QoKQorCisgICAgICAgIGNsYXNzIEZha2VSdW5uZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBydW4oc2VsZiwgdGVzdCk6CisgICAgICAgICAgICAgICAgc2VsZi50ZXN0ID0gdGVzdAorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICBydW5uZXIgPSBGYWtlUnVubmVyKCkKKworICAgICAgICBvbGRQYXJzZUFyZ3MgPSB1bml0dGVzdC5UZXN0UHJvZ3JhbS5wYXJzZUFyZ3MKKyAgICAgICAgZGVmIHJlc3RvcmVQYXJzZUFyZ3MoKToKKyAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtLnBhcnNlQXJncyA9IG9sZFBhcnNlQXJncworICAgICAgICB1bml0dGVzdC5UZXN0UHJvZ3JhbS5wYXJzZUFyZ3MgPSBsYW1iZGEgKmFyZ3M6IE5vbmUKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmVQYXJzZUFyZ3MpCisKKyAgICAgICAgZGVmIHJlbW92ZVRlc3QoKToKKyAgICAgICAgICAgIGRlbCB1bml0dGVzdC5UZXN0UHJvZ3JhbS50ZXN0CisgICAgICAgIHVuaXR0ZXN0LlRlc3RQcm9ncmFtLnRlc3QgPSB0ZXN0CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZW1vdmVUZXN0KQorCisgICAgICAgIHByb2dyYW0gPSB1bml0dGVzdC5UZXN0UHJvZ3JhbSh0ZXN0UnVubmVyPXJ1bm5lciwgZXhpdD1GYWxzZSwgdmVyYm9zaXR5PTIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcm9ncmFtLnJlc3VsdCwgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJ1bm5lci50ZXN0LCB0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udmVyYm9zaXR5LCAyKQorCisgICAgY2xhc3MgRm9vQmFyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgZGVmIHRlc3RQYXNzKHNlbGYpOgorICAgICAgICAgICAgYXNzZXJ0IFRydWUKKyAgICAgICAgZGVmIHRlc3RGYWlsKHNlbGYpOgorICAgICAgICAgICAgYXNzZXJ0IEZhbHNlCisKKyAgICBjbGFzcyBGb29CYXJMb2FkZXIodW5pdHRlc3QuVGVzdExvYWRlcik6CisgICAgICAgICIiIlRlc3QgbG9hZGVyIHRoYXQgcmV0dXJucyBhIHN1aXRlIGNvbnRhaW5pbmcgRm9vQmFyLiIiIgorICAgICAgICBkZWYgbG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLCBtb2R1bGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3VpdGVDbGFzcygKKyAgICAgICAgICAgICAgICBbc2VsZi5sb2FkVGVzdHNGcm9tVGVzdENhc2UoVGVzdF9UZXN0UHJvZ3JhbS5Gb29CYXIpXSkKKworCisgICAgZGVmIHRlc3RfTm9uRXhpdChzZWxmKToKKyAgICAgICAgcHJvZ3JhbSA9IHVuaXR0ZXN0Lm1haW4oZXhpdD1GYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndj1bImZvb2JhciJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHN0cmVhbT1TdHJpbmdJTygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdExvYWRlcj1zZWxmLkZvb0JhckxvYWRlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihwcm9ncmFtLCAncmVzdWx0JykpCisKKworICAgIGRlZiB0ZXN0X0V4aXQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgU3lzdGVtRXhpdCwKKyAgICAgICAgICAgIHVuaXR0ZXN0Lm1haW4sCisgICAgICAgICAgICBhcmd2PVsiZm9vYmFyIl0sCisgICAgICAgICAgICB0ZXN0UnVubmVyPXVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHN0cmVhbT1TdHJpbmdJTygpKSwKKyAgICAgICAgICAgIGV4aXQ9VHJ1ZSwKKyAgICAgICAgICAgIHRlc3RMb2FkZXI9c2VsZi5Gb29CYXJMb2FkZXIoKSkKKworCisgICAgZGVmIHRlc3RfRXhpdEFzRGVmYXVsdChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBTeXN0ZW1FeGl0LAorICAgICAgICAgICAgdW5pdHRlc3QubWFpbiwKKyAgICAgICAgICAgIGFyZ3Y9WyJmb29iYXIiXSwKKyAgICAgICAgICAgIHRlc3RSdW5uZXI9dW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3RyZWFtPVN0cmluZ0lPKCkpLAorICAgICAgICAgICAgdGVzdExvYWRlcj1zZWxmLkZvb0JhckxvYWRlcigpKQorCisKK2NsYXNzIEluaXRpYWxpc2FibGVQcm9ncmFtKHVuaXR0ZXN0LlRlc3RQcm9ncmFtKToKKyAgICBleGl0ID0gRmFsc2UKKyAgICByZXN1bHQgPSBOb25lCisgICAgdmVyYm9zaXR5ID0gMQorICAgIGRlZmF1bHRUZXN0ID0gTm9uZQorICAgIHRlc3RSdW5uZXIgPSBOb25lCisgICAgdGVzdExvYWRlciA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyCisgICAgcHJvZ05hbWUgPSAndGVzdCcKKyAgICB0ZXN0ID0gJ3Rlc3QnCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgcGFzcworCitSRVNVTFQgPSBvYmplY3QoKQorCitjbGFzcyBGYWtlUnVubmVyKG9iamVjdCk6CisgICAgaW5pdEFyZ3MgPSBOb25lCisgICAgdGVzdCA9IE5vbmUKKyAgICByYWlzZUVycm9yID0gRmFsc2UKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3YXJncyk6CisgICAgICAgIEZha2VSdW5uZXIuaW5pdEFyZ3MgPSBrd2FyZ3MKKyAgICAgICAgaWYgRmFrZVJ1bm5lci5yYWlzZUVycm9yOgorICAgICAgICAgICAgRmFrZVJ1bm5lci5yYWlzZUVycm9yID0gRmFsc2UKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorCisgICAgZGVmIHJ1bihzZWxmLCB0ZXN0KToKKyAgICAgICAgRmFrZVJ1bm5lci50ZXN0ID0gdGVzdAorICAgICAgICByZXR1cm4gUkVTVUxUCisKK2NsYXNzIFRlc3RDb21tYW5kTGluZUFyZ3ModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLnByb2dyYW0gPSBJbml0aWFsaXNhYmxlUHJvZ3JhbSgpCisgICAgICAgIHNlbGYucHJvZ3JhbS5jcmVhdGVUZXN0cyA9IGxhbWJkYTogTm9uZQorICAgICAgICBGYWtlUnVubmVyLmluaXRBcmdzID0gTm9uZQorICAgICAgICBGYWtlUnVubmVyLnRlc3QgPSBOb25lCisgICAgICAgIEZha2VSdW5uZXIucmFpc2VFcnJvciA9IEZhbHNlCisKKyAgICBkZWYgdGVzdEhlbHBBbmRVbmtub3duKHNlbGYpOgorICAgICAgICBwcm9ncmFtID0gc2VsZi5wcm9ncmFtCisgICAgICAgIGRlZiB1c2FnZUV4aXQobXNnPU5vbmUpOgorICAgICAgICAgICAgcHJvZ3JhbS5tc2cgPSBtc2cKKyAgICAgICAgICAgIHByb2dyYW0uZXhpdCA9IFRydWUKKyAgICAgICAgcHJvZ3JhbS51c2FnZUV4aXQgPSB1c2FnZUV4aXQKKworICAgICAgICBmb3Igb3B0IGluICctaCcsICctSCcsICctLWhlbHAnOgorICAgICAgICAgICAgcHJvZ3JhbS5leGl0ID0gRmFsc2UKKyAgICAgICAgICAgIHByb2dyYW0ucGFyc2VBcmdzKFtOb25lLCBvcHRdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2dyYW0uZXhpdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHByb2dyYW0ubXNnKQorCisgICAgICAgIHByb2dyYW0ucGFyc2VBcmdzKFtOb25lLCAnLSQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb2dyYW0uZXhpdCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdE5vbmUocHJvZ3JhbS5tc2cpCisKKyAgICBkZWYgdGVzdFZlcmJvc2l0eShzZWxmKToKKyAgICAgICAgcHJvZ3JhbSA9IHNlbGYucHJvZ3JhbQorCisgICAgICAgIGZvciBvcHQgaW4gJy1xJywgJy0tcXVpZXQnOgorICAgICAgICAgICAgcHJvZ3JhbS52ZXJib3NpdHkgPSAxCisgICAgICAgICAgICBwcm9ncmFtLnBhcnNlQXJncyhbTm9uZSwgb3B0XSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvZ3JhbS52ZXJib3NpdHksIDApCisKKyAgICAgICAgZm9yIG9wdCBpbiAnLXYnLCAnLS12ZXJib3NlJzoKKyAgICAgICAgICAgIHByb2dyYW0udmVyYm9zaXR5ID0gMQorICAgICAgICAgICAgcHJvZ3JhbS5wYXJzZUFyZ3MoW05vbmUsIG9wdF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByb2dyYW0udmVyYm9zaXR5LCAyKQorCisgICAgZGVmIHRlc3RCdWZmZXJDYXRjaEZhaWxmYXN0KHNlbGYpOgorICAgICAgICBwcm9ncmFtID0gc2VsZi5wcm9ncmFtCisgICAgICAgIGZvciBhcmcsIGF0dHIgaW4gKCgnYnVmZmVyJywgJ2J1ZmZlcicpLCAoJ2ZhaWxmYXN0JywgJ2ZhaWxmYXN0JyksCisgICAgICAgICAgICAgICAgICAgICAgKCdjYXRjaCcsICdjYXRjaGJyZWFrJykpOgorICAgICAgICAgICAgaWYgYXR0ciA9PSAnY2F0Y2gnIGFuZCBub3QgaGFzSW5zdGFsbEhhbmRsZXI6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgc2hvcnRfb3B0ID0gJy0lcycgJSBhcmdbMF0KKyAgICAgICAgICAgIGxvbmdfb3B0ID0gJy0tJXMnICUgYXJnCisgICAgICAgICAgICBmb3Igb3B0IGluIHNob3J0X29wdCwgbG9uZ19vcHQ6CisgICAgICAgICAgICAgICAgc2V0YXR0cihwcm9ncmFtLCBhdHRyLCBOb25lKQorCisgICAgICAgICAgICAgICAgcHJvZ3JhbS5wYXJzZUFyZ3MoW05vbmUsIG9wdF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdldGF0dHIocHJvZ3JhbSwgYXR0cikpCisKKyAgICAgICAgICAgIGZvciBvcHQgaW4gc2hvcnRfb3B0LCBsb25nX29wdDoKKyAgICAgICAgICAgICAgICBub3Rfbm9uZSA9IG9iamVjdCgpCisgICAgICAgICAgICAgICAgc2V0YXR0cihwcm9ncmFtLCBhdHRyLCBub3Rfbm9uZSkKKworICAgICAgICAgICAgICAgIHByb2dyYW0ucGFyc2VBcmdzKFtOb25lLCBvcHRdKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0YXR0cihwcm9ncmFtLCBhdHRyKSwgbm90X25vbmUpCisKKyAgICBkZWYgdGVzdFJ1blRlc3RzUnVubmVyQ2xhc3Moc2VsZik6CisgICAgICAgIHByb2dyYW0gPSBzZWxmLnByb2dyYW0KKworICAgICAgICBwcm9ncmFtLnRlc3RSdW5uZXIgPSBGYWtlUnVubmVyCisgICAgICAgIHByb2dyYW0udmVyYm9zaXR5ID0gJ3ZlcmJvc2l0eScKKyAgICAgICAgcHJvZ3JhbS5mYWlsZmFzdCA9ICdmYWlsZmFzdCcKKyAgICAgICAgcHJvZ3JhbS5idWZmZXIgPSAnYnVmZmVyJworCisgICAgICAgIHByb2dyYW0ucnVuVGVzdHMoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci5pbml0QXJncywgeyd2ZXJib3NpdHknOiAndmVyYm9zaXR5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmYWlsZmFzdCc6ICdmYWlsZmFzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYnVmZmVyJzogJ2J1ZmZlcid9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEZha2VSdW5uZXIudGVzdCwgJ3Rlc3QnKQorICAgICAgICBzZWxmLmFzc2VydElzKHByb2dyYW0ucmVzdWx0LCBSRVNVTFQpCisKKyAgICBkZWYgdGVzdFJ1blRlc3RzUnVubmVySW5zdGFuY2Uoc2VsZik6CisgICAgICAgIHByb2dyYW0gPSBzZWxmLnByb2dyYW0KKworICAgICAgICBwcm9ncmFtLnRlc3RSdW5uZXIgPSBGYWtlUnVubmVyKCkKKyAgICAgICAgRmFrZVJ1bm5lci5pbml0QXJncyA9IE5vbmUKKworICAgICAgICBwcm9ncmFtLnJ1blRlc3RzKCkKKworICAgICAgICAjIEEgbmV3IEZha2VSdW5uZXIgc2hvdWxkIG5vdCBoYXZlIGJlZW4gaW5zdGFudGlhdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKEZha2VSdW5uZXIuaW5pdEFyZ3MpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChGYWtlUnVubmVyLnRlc3QsICd0ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhwcm9ncmFtLnJlc3VsdCwgUkVTVUxUKQorCisgICAgZGVmIHRlc3RSdW5UZXN0c09sZFJ1bm5lckNsYXNzKHNlbGYpOgorICAgICAgICBwcm9ncmFtID0gc2VsZi5wcm9ncmFtCisKKyAgICAgICAgRmFrZVJ1bm5lci5yYWlzZUVycm9yID0gVHJ1ZQorICAgICAgICBwcm9ncmFtLnRlc3RSdW5uZXIgPSBGYWtlUnVubmVyCisgICAgICAgIHByb2dyYW0udmVyYm9zaXR5ID0gJ3ZlcmJvc2l0eScKKyAgICAgICAgcHJvZ3JhbS5mYWlsZmFzdCA9ICdmYWlsZmFzdCcKKyAgICAgICAgcHJvZ3JhbS5idWZmZXIgPSAnYnVmZmVyJworICAgICAgICBwcm9ncmFtLnRlc3QgPSAndGVzdCcKKworICAgICAgICBwcm9ncmFtLnJ1blRlc3RzKCkKKworICAgICAgICAjIElmIGluaXRpYWxpemluZyByYWlzZXMgYSB0eXBlIGVycm9yIGl0IHNob3VsZCBiZSByZXRyaWVkCisgICAgICAgICMgd2l0aG91dCB0aGUgbmV3IGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci5pbml0QXJncywge30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFrZVJ1bm5lci50ZXN0LCAndGVzdCcpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMocHJvZ3JhbS5yZXN1bHQsIFJFU1VMVCkKKworICAgIGRlZiB0ZXN0Q2F0Y2hCcmVha0luc3RhbGxzSGFuZGxlcihzZWxmKToKKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbJ3VuaXR0ZXN0Lm1haW4nXQorICAgICAgICBvcmlnaW5hbCA9IG1vZHVsZS5pbnN0YWxsSGFuZGxlcgorICAgICAgICBkZWYgcmVzdG9yZSgpOgorICAgICAgICAgICAgbW9kdWxlLmluc3RhbGxIYW5kbGVyID0gb3JpZ2luYWwKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHJlc3RvcmUpCisKKyAgICAgICAgc2VsZi5pbnN0YWxsZWQgPSBGYWxzZQorICAgICAgICBkZWYgZmFrZUluc3RhbGxIYW5kbGVyKCk6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxlZCA9IFRydWUKKyAgICAgICAgbW9kdWxlLmluc3RhbGxIYW5kbGVyID0gZmFrZUluc3RhbGxIYW5kbGVyCisKKyAgICAgICAgcHJvZ3JhbSA9IHNlbGYucHJvZ3JhbQorICAgICAgICBwcm9ncmFtLmNhdGNoYnJlYWsgPSBUcnVlCisKKyAgICAgICAgcHJvZ3JhbS50ZXN0UnVubmVyID0gRmFrZVJ1bm5lcgorCisgICAgICAgIHByb2dyYW0ucnVuVGVzdHMoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5pbnN0YWxsZWQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Byb2dyYW0ucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwZTQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Byb2dyYW0ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Byb2dyYW0ucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcHJvZ3JhbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc1YTM2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Byb2dyYW0ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjY4YzFkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcmVzdWx0LnB5CkBAIC0wLDAgKzEsNTY3IEBACitpbXBvcnQgc3lzCitpbXBvcnQgdGV4dHdyYXAKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorCitpbXBvcnQgdHJhY2ViYWNrCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBUZXN0X1Rlc3RSZXN1bHQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICMgTm90ZTogdGhlcmUgYXJlIG5vdCBzZXBhcmF0ZSB0ZXN0cyBmb3IgVGVzdFJlc3VsdC53YXNTdWNjZXNzZnVsKCksCisgICAgIyBUZXN0UmVzdWx0LmVycm9ycywgVGVzdFJlc3VsdC5mYWlsdXJlcywgVGVzdFJlc3VsdC50ZXN0c1J1biBvcgorICAgICMgVGVzdFJlc3VsdC5zaG91bGRTdG9wIGJlY2F1c2UgdGhlc2Ugb25seSBoYXZlIG1lYW5pbmcgaW4gdGVybXMgb2YKKyAgICAjIG90aGVyIFRlc3RSZXN1bHQgbWV0aG9kcy4KKyAgICAjCisgICAgIyBBY2NvcmRpbmdseSwgdGVzdHMgZm9yIHRoZSBhZm9yZW5hbWVkIGF0dHJpYnV0ZXMgYXJlIGluY29ycG9yYXRlZAorICAgICMgaW4gd2l0aCB0aGUgdGVzdHMgZm9yIHRoZSBkZWZpbmluZyBtZXRob2RzLgorICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNob3VsZFN0b3AsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydElzTm9uZShyZXN1bHQuX3N0ZG91dF9idWZmZXIpCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb25lKHJlc3VsdC5fc3RkZXJyX2J1ZmZlcikKKworCisgICAgIyAiVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBzaWduYWwgdGhhdCB0aGUgc2V0IG9mIHRlc3RzIGJlaW5nCisgICAgIyBydW4gc2hvdWxkIGJlIGFib3J0ZWQgYnkgc2V0dGluZyB0aGUgVGVzdFJlc3VsdCdzIHNob3VsZFN0b3AKKyAgICAjIGF0dHJpYnV0ZSB0byBUcnVlLiIKKyAgICBkZWYgdGVzdF9zdG9wKHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKworICAgICAgICByZXN1bHQuc3RvcCgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2hvdWxkU3RvcCwgVHJ1ZSkKKworICAgICMgIkNhbGxlZCB3aGVuIHRoZSB0ZXN0IGNhc2UgdGVzdCBpcyBhYm91dCB0byBiZSBydW4uIFRoZSBkZWZhdWx0CisgICAgIyBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgaW5jcmVtZW50cyB0aGUgaW5zdGFuY2UncyB0ZXN0c1J1biBjb3VudGVyLiIKKyAgICBkZWYgdGVzdF9zdGFydFRlc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0ZXN0ID0gRm9vKCd0ZXN0XzEnKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3QodGVzdCkKKworICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5mYWlsdXJlcyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zaG91bGRTdG9wLCBGYWxzZSkKKworICAgICAgICByZXN1bHQuc3RvcFRlc3QodGVzdCkKKworICAgICMgIkNhbGxlZCBhZnRlciB0aGUgdGVzdCBjYXNlIHRlc3QgaGFzIGJlZW4gZXhlY3V0ZWQsIHJlZ2FyZGxlc3Mgb2YKKyAgICAjIHRoZSBvdXRjb21lLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuIgorICAgIGRlZiB0ZXN0X3N0b3BUZXN0KHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdCA9IEZvbygndGVzdF8xJykKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKworICAgICAgICByZXN1bHQuc3RhcnRUZXN0KHRlc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC53YXNTdWNjZXNzZnVsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZmFpbHVyZXMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2hvdWxkU3RvcCwgRmFsc2UpCisKKyAgICAgICAgcmVzdWx0LnN0b3BUZXN0KHRlc3QpCisKKyAgICAgICAgIyBTYW1lIHRlc3RzIGFzIGFib3ZlOyBtYWtlIHN1cmUgbm90aGluZyBoYXMgY2hhbmdlZAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5mYWlsdXJlcyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zaG91bGRTdG9wLCBGYWxzZSkKKworICAgICMgIkNhbGxlZCBiZWZvcmUgYW5kIGFmdGVyIHRlc3RzIGFyZSBydW4uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4iCisgICAgZGVmIHRlc3Rfc3RhcnRUZXN0UnVuX3N0b3BUZXN0UnVuKHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0LnN0YXJ0VGVzdFJ1bigpCisgICAgICAgIHJlc3VsdC5zdG9wVGVzdFJ1bigpCisKKyAgICAjICJhZGRTdWNjZXNzKHRlc3QpIgorICAgICMgLi4uCisgICAgIyAiQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSB0ZXN0IHN1Y2NlZWRzIgorICAgICMgLi4uCisgICAgIyAid2FzU3VjY2Vzc2Z1bCgpIC0gUmV0dXJucyBUcnVlIGlmIGFsbCB0ZXN0cyBydW4gc28gZmFyIGhhdmUgcGFzc2VkLAorICAgICMgb3RoZXJ3aXNlIHJldHVybnMgRmFsc2UiCisgICAgIyAuLi4KKyAgICAjICJ0ZXN0c1J1biAtIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgcnVuIHNvIGZhci4iCisgICAgIyAuLi4KKyAgICAjICJlcnJvcnMgLSBBIGxpc3QgY29udGFpbmluZyAyLXR1cGxlcyBvZiBUZXN0Q2FzZSBpbnN0YW5jZXMgYW5kCisgICAgIyBmb3JtYXR0ZWQgdHJhY2ViYWNrcy4gRWFjaCB0dXBsZSByZXByZXNlbnRzIGEgdGVzdCB3aGljaCByYWlzZWQgYW4KKyAgICAjIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLiBDb250YWlucyBmb3JtYXR0ZWQKKyAgICAjIHRyYWNlYmFja3MgaW5zdGVhZCBvZiBzeXMuZXhjX2luZm8oKSByZXN1bHRzLiIKKyAgICAjIC4uLgorICAgICMgImZhaWx1cmVzIC0gQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgVGVzdENhc2UgaW5zdGFuY2VzIGFuZAorICAgICMgZm9ybWF0dGVkIHRyYWNlYmFja3MuIEVhY2ggdHVwbGUgcmVwcmVzZW50cyBhIHRlc3Qgd2hlcmUgYSBmYWlsdXJlIHdhcworICAgICMgZXhwbGljaXRseSBzaWduYWxsZWQgdXNpbmcgdGhlIFRlc3RDYXNlLmZhaWwqKCkgb3IgVGVzdENhc2UuYXNzZXJ0KigpCisgICAgIyBtZXRob2RzLiBDb250YWlucyBmb3JtYXR0ZWQgdHJhY2ViYWNrcyBpbnN0ZWFkCisgICAgIyBvZiBzeXMuZXhjX2luZm8oKSByZXN1bHRzLiIKKyAgICBkZWYgdGVzdF9hZGRTdWNjZXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgdGVzdCA9IEZvbygndGVzdF8xJykKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKworICAgICAgICByZXN1bHQuc3RhcnRUZXN0KHRlc3QpCisgICAgICAgIHJlc3VsdC5hZGRTdWNjZXNzKHRlc3QpCisgICAgICAgIHJlc3VsdC5zdG9wVGVzdCh0ZXN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNob3VsZFN0b3AsIEZhbHNlKQorCisgICAgIyAiYWRkRmFpbHVyZSh0ZXN0LCBlcnIpIgorICAgICMgLi4uCisgICAgIyAiQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSB0ZXN0IHNpZ25hbHMgYSBmYWlsdXJlLiBlcnIgaXMgYSB0dXBsZSBvZgorICAgICMgdGhlIGZvcm0gcmV0dXJuZWQgYnkgc3lzLmV4Y19pbmZvKCk6ICh0eXBlLCB2YWx1ZSwgdHJhY2ViYWNrKSIKKyAgICAjIC4uLgorICAgICMgIndhc1N1Y2Nlc3NmdWwoKSAtIFJldHVybnMgVHJ1ZSBpZiBhbGwgdGVzdHMgcnVuIHNvIGZhciBoYXZlIHBhc3NlZCwKKyAgICAjIG90aGVyd2lzZSByZXR1cm5zIEZhbHNlIgorICAgICMgLi4uCisgICAgIyAidGVzdHNSdW4gLSBUaGUgdG90YWwgbnVtYmVyIG9mIHRlc3RzIHJ1biBzbyBmYXIuIgorICAgICMgLi4uCisgICAgIyAiZXJyb3JzIC0gQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgVGVzdENhc2UgaW5zdGFuY2VzIGFuZAorICAgICMgZm9ybWF0dGVkIHRyYWNlYmFja3MuIEVhY2ggdHVwbGUgcmVwcmVzZW50cyBhIHRlc3Qgd2hpY2ggcmFpc2VkIGFuCisgICAgIyB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4gQ29udGFpbnMgZm9ybWF0dGVkCisgICAgIyB0cmFjZWJhY2tzIGluc3RlYWQgb2Ygc3lzLmV4Y19pbmZvKCkgcmVzdWx0cy4iCisgICAgIyAuLi4KKyAgICAjICJmYWlsdXJlcyAtIEEgbGlzdCBjb250YWluaW5nIDItdHVwbGVzIG9mIFRlc3RDYXNlIGluc3RhbmNlcyBhbmQKKyAgICAjIGZvcm1hdHRlZCB0cmFjZWJhY2tzLiBFYWNoIHR1cGxlIHJlcHJlc2VudHMgYSB0ZXN0IHdoZXJlIGEgZmFpbHVyZSB3YXMKKyAgICAjIGV4cGxpY2l0bHkgc2lnbmFsbGVkIHVzaW5nIHRoZSBUZXN0Q2FzZS5mYWlsKigpIG9yIFRlc3RDYXNlLmFzc2VydCooKQorICAgICMgbWV0aG9kcy4gQ29udGFpbnMgZm9ybWF0dGVkIHRyYWNlYmFja3MgaW5zdGVhZAorICAgICMgb2Ygc3lzLmV4Y19pbmZvKCkgcmVzdWx0cy4iCisgICAgZGVmIHRlc3RfYWRkRmFpbHVyZShzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3QgPSBGb28oJ3Rlc3RfMScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRlc3QuZmFpbCgiZm9vIikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZXhjX2luZm9fdHVwbGUgPSBzeXMuZXhjX2luZm8oKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3QodGVzdCkKKyAgICAgICAgcmVzdWx0LmFkZEZhaWx1cmUodGVzdCwgZXhjX2luZm9fdHVwbGUpCisgICAgICAgIHJlc3VsdC5zdG9wVGVzdCh0ZXN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5mYWlsdXJlcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5zaG91bGRTdG9wLCBGYWxzZSkKKworICAgICAgICB0ZXN0X2Nhc2UsIGZvcm1hdHRlZF9leGMgPSByZXN1bHQuZmFpbHVyZXNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfY2FzZSBpcyB0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZm9ybWF0dGVkX2V4Yywgc3RyKQorCisgICAgIyAiYWRkRXJyb3IodGVzdCwgZXJyKSIKKyAgICAjIC4uLgorICAgICMgIkNhbGxlZCB3aGVuIHRoZSB0ZXN0IGNhc2UgdGVzdCByYWlzZXMgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gZXJyCisgICAgIyBpcyBhIHR1cGxlIG9mIHRoZSBmb3JtIHJldHVybmVkIGJ5IHN5cy5leGNfaW5mbygpOgorICAgICMgKHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spIgorICAgICMgLi4uCisgICAgIyAid2FzU3VjY2Vzc2Z1bCgpIC0gUmV0dXJucyBUcnVlIGlmIGFsbCB0ZXN0cyBydW4gc28gZmFyIGhhdmUgcGFzc2VkLAorICAgICMgb3RoZXJ3aXNlIHJldHVybnMgRmFsc2UiCisgICAgIyAuLi4KKyAgICAjICJ0ZXN0c1J1biAtIFRoZSB0b3RhbCBudW1iZXIgb2YgdGVzdHMgcnVuIHNvIGZhci4iCisgICAgIyAuLi4KKyAgICAjICJlcnJvcnMgLSBBIGxpc3QgY29udGFpbmluZyAyLXR1cGxlcyBvZiBUZXN0Q2FzZSBpbnN0YW5jZXMgYW5kCisgICAgIyBmb3JtYXR0ZWQgdHJhY2ViYWNrcy4gRWFjaCB0dXBsZSByZXByZXNlbnRzIGEgdGVzdCB3aGljaCByYWlzZWQgYW4KKyAgICAjIHVuZXhwZWN0ZWQgZXhjZXB0aW9uLiBDb250YWlucyBmb3JtYXR0ZWQKKyAgICAjIHRyYWNlYmFja3MgaW5zdGVhZCBvZiBzeXMuZXhjX2luZm8oKSByZXN1bHRzLiIKKyAgICAjIC4uLgorICAgICMgImZhaWx1cmVzIC0gQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgVGVzdENhc2UgaW5zdGFuY2VzIGFuZAorICAgICMgZm9ybWF0dGVkIHRyYWNlYmFja3MuIEVhY2ggdHVwbGUgcmVwcmVzZW50cyBhIHRlc3Qgd2hlcmUgYSBmYWlsdXJlIHdhcworICAgICMgZXhwbGljaXRseSBzaWduYWxsZWQgdXNpbmcgdGhlIFRlc3RDYXNlLmZhaWwqKCkgb3IgVGVzdENhc2UuYXNzZXJ0KigpCisgICAgIyBtZXRob2RzLiBDb250YWlucyBmb3JtYXR0ZWQgdHJhY2ViYWNrcyBpbnN0ZWFkCisgICAgIyBvZiBzeXMuZXhjX2luZm8oKSByZXN1bHRzLiIKKyAgICBkZWYgdGVzdF9hZGRFcnJvcihzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHRlc3QgPSBGb28oJ3Rlc3RfMScpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGV4Y19pbmZvX3R1cGxlID0gc3lzLmV4Y19pbmZvKCkKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKworICAgICAgICByZXN1bHQuc3RhcnRUZXN0KHRlc3QpCisgICAgICAgIHJlc3VsdC5hZGRFcnJvcih0ZXN0LCBleGNfaW5mb190dXBsZSkKKyAgICAgICAgcmVzdWx0LnN0b3BUZXN0KHRlc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNob3VsZFN0b3AsIEZhbHNlKQorCisgICAgICAgIHRlc3RfY2FzZSwgZm9ybWF0dGVkX2V4YyA9IHJlc3VsdC5lcnJvcnNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRlc3RfY2FzZSBpcyB0ZXN0KQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZm9ybWF0dGVkX2V4Yywgc3RyKQorCisgICAgZGVmIHRlc3RHZXREZXNjcmlwdGlvbldpdGhvdXREb2NzdHJpbmcoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRleHRUZXN0UmVzdWx0KE5vbmUsIFRydWUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgcmVzdWx0LmdldERlc2NyaXB0aW9uKHNlbGYpLAorICAgICAgICAgICAgICAgICd0ZXN0R2V0RGVzY3JpcHRpb25XaXRob3V0RG9jc3RyaW5nICgnICsgX19uYW1lX18gKworICAgICAgICAgICAgICAgICcuVGVzdF9UZXN0UmVzdWx0KScpCisKKyAgICBAdW5pdHRlc3Quc2tpcElmKHN5cy5mbGFncy5vcHRpbWl6ZSA+PSAyLAorICAgICAgICAgICAgICAgICAgICAgIkRvY3N0cmluZ3MgYXJlIG9taXR0ZWQgd2l0aCAtTzIgYW5kIGFib3ZlIikKKyAgICBkZWYgdGVzdEdldERlc2NyaXB0aW9uV2l0aE9uZUxpbmVEb2NzdHJpbmcoc2VsZik6CisgICAgICAgICIiIlRlc3RzIGdldERlc2NyaXB0aW9uKCkgZm9yIGEgbWV0aG9kIHdpdGggYSBkb2NzdHJpbmcuIiIiCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRleHRUZXN0UmVzdWx0KE5vbmUsIFRydWUsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICAgICAgcmVzdWx0LmdldERlc2NyaXB0aW9uKHNlbGYpLAorICAgICAgICAgICAgICAgKCd0ZXN0R2V0RGVzY3JpcHRpb25XaXRoT25lTGluZURvY3N0cmluZyAnCisgICAgICAgICAgICAgICAgJygnICsgX19uYW1lX18gKyAnLlRlc3RfVGVzdFJlc3VsdClcbicKKyAgICAgICAgICAgICAgICAnVGVzdHMgZ2V0RGVzY3JpcHRpb24oKSBmb3IgYSBtZXRob2Qgd2l0aCBhIGRvY3N0cmluZy4nKSkKKworICAgIEB1bml0dGVzdC5za2lwSWYoc3lzLmZsYWdzLm9wdGltaXplID49IDIsCisgICAgICAgICAgICAgICAgICAgICAiRG9jc3RyaW5ncyBhcmUgb21pdHRlZCB3aXRoIC1PMiBhbmQgYWJvdmUiKQorICAgIGRlZiB0ZXN0R2V0RGVzY3JpcHRpb25XaXRoTXVsdGlMaW5lRG9jc3RyaW5nKHNlbGYpOgorICAgICAgICAiIiJUZXN0cyBnZXREZXNjcmlwdGlvbigpIGZvciBhIG1ldGhvZCB3aXRoIGEgbG9uZ2VyIGRvY3N0cmluZy4KKyAgICAgICAgVGhlIHNlY29uZCBsaW5lIG9mIHRoZSBkb2NzdHJpbmcuCisgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXh0VGVzdFJlc3VsdChOb25lLCBUcnVlLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgICAgIHJlc3VsdC5nZXREZXNjcmlwdGlvbihzZWxmKSwKKyAgICAgICAgICAgICAgICgndGVzdEdldERlc2NyaXB0aW9uV2l0aE11bHRpTGluZURvY3N0cmluZyAnCisgICAgICAgICAgICAgICAgJygnICsgX19uYW1lX18gKyAnLlRlc3RfVGVzdFJlc3VsdClcbicKKyAgICAgICAgICAgICAgICAnVGVzdHMgZ2V0RGVzY3JpcHRpb24oKSBmb3IgYSBtZXRob2Qgd2l0aCBhIGxvbmdlciAnCisgICAgICAgICAgICAgICAgJ2RvY3N0cmluZy4nKSkKKworICAgIGRlZiB0ZXN0U3RhY2tGcmFtZVRyaW1taW5nKHNlbGYpOgorICAgICAgICBjbGFzcyBGcmFtZShvYmplY3QpOgorICAgICAgICAgICAgY2xhc3MgdGJfZnJhbWUob2JqZWN0KToKKyAgICAgICAgICAgICAgICBmX2dsb2JhbHMgPSB7fQorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQuX2lzX3JlbGV2YW50X3RiX2xldmVsKEZyYW1lKSkKKworICAgICAgICBGcmFtZS50Yl9mcmFtZS5mX2dsb2JhbHNbJ19fdW5pdHRlc3QnXSA9IFRydWUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5faXNfcmVsZXZhbnRfdGJfbGV2ZWwoRnJhbWUpKQorCisgICAgZGVmIHRlc3RGYWlsRmFzdChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJlc3VsdC5fZXhjX2luZm9fdG9fc3RyaW5nID0gbGFtYmRhICpfOiAnJworICAgICAgICByZXN1bHQuZmFpbGZhc3QgPSBUcnVlCisgICAgICAgIHJlc3VsdC5hZGRFcnJvcihOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LnNob3VsZFN0b3ApCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJlc3VsdC5fZXhjX2luZm9fdG9fc3RyaW5nID0gbGFtYmRhICpfOiAnJworICAgICAgICByZXN1bHQuZmFpbGZhc3QgPSBUcnVlCisgICAgICAgIHJlc3VsdC5hZGRGYWlsdXJlKE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc2hvdWxkU3RvcCkKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0Ll9leGNfaW5mb190b19zdHJpbmcgPSBsYW1iZGEgKl86ICcnCisgICAgICAgIHJlc3VsdC5mYWlsZmFzdCA9IFRydWUKKyAgICAgICAgcmVzdWx0LmFkZFVuZXhwZWN0ZWRTdWNjZXNzKE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuc2hvdWxkU3RvcCkKKworICAgIGRlZiB0ZXN0RmFpbEZhc3RTZXRCeVJ1bm5lcihzZWxmKToKKyAgICAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3RyZWFtPVN0cmluZ0lPKCksIGZhaWxmYXN0PVRydWUpCisgICAgICAgIGRlZiB0ZXN0KHJlc3VsdCk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LmZhaWxmYXN0KQorICAgICAgICBydW5uZXIucnVuKHRlc3QpCisKKworY2xhc3NEaWN0ID0gZGljdCh1bml0dGVzdC5UZXN0UmVzdWx0Ll9fZGljdF9fKQorZm9yIG0gaW4gKCdhZGRTa2lwJywgJ2FkZEV4cGVjdGVkRmFpbHVyZScsICdhZGRVbmV4cGVjdGVkU3VjY2VzcycsCisgICAgICAgICAgICdfX2luaXRfXycpOgorICAgIGRlbCBjbGFzc0RpY3RbbV0KKworZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbT1Ob25lLCBkZXNjcmlwdGlvbnM9Tm9uZSwgdmVyYm9zaXR5PU5vbmUpOgorICAgIHNlbGYuZmFpbHVyZXMgPSBbXQorICAgIHNlbGYuZXJyb3JzID0gW10KKyAgICBzZWxmLnRlc3RzUnVuID0gMAorICAgIHNlbGYuc2hvdWxkU3RvcCA9IEZhbHNlCisgICAgc2VsZi5idWZmZXIgPSBGYWxzZQorCitjbGFzc0RpY3RbJ19faW5pdF9fJ10gPSBfX2luaXRfXworT2xkUmVzdWx0ID0gdHlwZSgnT2xkUmVzdWx0JywgKG9iamVjdCwpLCBjbGFzc0RpY3QpCisKK2NsYXNzIFRlc3RfT2xkVGVzdFJlc3VsdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgYXNzZXJ0T2xkUmVzdWx0V2FybmluZyhzZWxmLCB0ZXN0LCBmYWlsdXJlcyk6CisgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LmNoZWNrX3dhcm5pbmdzKCgiVGVzdFJlc3VsdCBoYXMgbm8gYWRkLisgbWV0aG9kLCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lV2FybmluZykpOgorICAgICAgICAgICAgcmVzdWx0ID0gT2xkUmVzdWx0KCkKKyAgICAgICAgICAgIHRlc3QucnVuKHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5mYWlsdXJlcyksIGZhaWx1cmVzKQorCisgICAgZGVmIHRlc3RPbGRUZXN0UmVzdWx0KHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0U2tpcChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCdmb29iYXInKQorICAgICAgICAgICAgQHVuaXR0ZXN0LmV4cGVjdGVkRmFpbHVyZQorICAgICAgICAgICAgZGVmIHRlc3RFeHBlY3RlZEZhaWwoc2VsZik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yCisgICAgICAgICAgICBAdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCisgICAgICAgICAgICBkZWYgdGVzdFVuZXhwZWN0ZWRTdWNjZXNzKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmb3IgdGVzdF9uYW1lLCBzaG91bGRfcGFzcyBpbiAoKCd0ZXN0U2tpcCcsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0RXhwZWN0ZWRGYWlsJywgVHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ3Rlc3RVbmV4cGVjdGVkU3VjY2VzcycsIEZhbHNlKSk6CisgICAgICAgICAgICB0ZXN0ID0gVGVzdCh0ZXN0X25hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydE9sZFJlc3VsdFdhcm5pbmcodGVzdCwgaW50KG5vdCBzaG91bGRfcGFzcykpCisKKyAgICBkZWYgdGVzdE9sZFRlc3RUZXN1bHRTZXR1cChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgnbm8gcmVhc29uJykKKyAgICAgICAgICAgIGRlZiB0ZXN0Rm9vKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5hc3NlcnRPbGRSZXN1bHRXYXJuaW5nKFRlc3QoJ3Rlc3RGb28nKSwgMCkKKworICAgIGRlZiB0ZXN0T2xkVGVzdFJlc3VsdENsYXNzKHNlbGYpOgorICAgICAgICBAdW5pdHRlc3Quc2tpcCgnbm8gcmVhc29uJykKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdEZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYXNzZXJ0T2xkUmVzdWx0V2FybmluZyhUZXN0KCd0ZXN0Rm9vJyksIDApCisKKyAgICBkZWYgdGVzdE9sZFJlc3VsdFdpdGhSdW5uZXIoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RGb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcihyZXN1bHRjbGFzcz1PbGRSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW09U3RyaW5nSU8oKSkKKyAgICAgICAgIyBUaGlzIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIFRleHRUZXN0UnVubmVyIGNhbid0IGhhbmRsZSBvbGQKKyAgICAgICAgIyB0ZXN0IHJlc3VsdCBvYmplY3RzCisgICAgICAgIHJ1bm5lci5ydW4oVGVzdCgndGVzdEZvbycpKQorCisKK2NsYXNzIE1vY2tUcmFjZWJhY2sob2JqZWN0KToKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF9leGNlcHRpb24oKl8pOgorICAgICAgICByZXR1cm4gWydBIHRyYWNlYmFjayddCisKK2RlZiByZXN0b3JlX3RyYWNlYmFjaygpOgorICAgIHVuaXR0ZXN0LnJlc3VsdC50cmFjZWJhY2sgPSB0cmFjZWJhY2sKKworCitjbGFzcyBUZXN0T3V0cHV0QnVmZmVyaW5nKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fcmVhbF9vdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHNlbGYuX3JlYWxfZXJyID0gc3lzLnN0ZGVycgorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzeXMuc3Rkb3V0ID0gc2VsZi5fcmVhbF9vdXQKKyAgICAgICAgc3lzLnN0ZGVyciA9IHNlbGYuX3JlYWxfZXJyCisKKyAgICBkZWYgdGVzdEJ1ZmZlck91dHB1dE9mZihzZWxmKToKKyAgICAgICAgcmVhbF9vdXQgPSBzZWxmLl9yZWFsX291dAorICAgICAgICByZWFsX2VyciA9IHNlbGYuX3JlYWxfZXJyCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0LmJ1ZmZlcikKKworICAgICAgICBzZWxmLmFzc2VydElzKHJlYWxfb3V0LCBzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydElzKHJlYWxfZXJyLCBzeXMuc3RkZXJyKQorCisgICAgICAgIHJlc3VsdC5zdGFydFRlc3Qoc2VsZikKKworICAgICAgICBzZWxmLmFzc2VydElzKHJlYWxfb3V0LCBzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydElzKHJlYWxfZXJyLCBzeXMuc3RkZXJyKQorCisgICAgZGVmIHRlc3RCdWZmZXJPdXRwdXRTdGFydFRlc3RBZGRTdWNjZXNzKHNlbGYpOgorICAgICAgICByZWFsX291dCA9IHNlbGYuX3JlYWxfb3V0CisgICAgICAgIHJlYWxfZXJyID0gc2VsZi5fcmVhbF9lcnIKKworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXN1bHQuYnVmZmVyKQorCisgICAgICAgIHJlc3VsdC5idWZmZXIgPSBUcnVlCisKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhyZWFsX291dCwgc3lzLnN0ZG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJcyhyZWFsX2Vyciwgc3lzLnN0ZGVycikKKworICAgICAgICByZXN1bHQuc3RhcnRUZXN0KHNlbGYpCisKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChyZWFsX291dCwgc3lzLnN0ZG91dCkKKyAgICAgICAgc2VsZi5hc3NlcnRJc05vdChyZWFsX2Vyciwgc3lzLnN0ZGVycikKKyAgICAgICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKHN5cy5zdGRvdXQsIFN0cmluZ0lPKQorICAgICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2Uoc3lzLnN0ZGVyciwgU3RyaW5nSU8pCisgICAgICAgIHNlbGYuYXNzZXJ0SXNOb3Qoc3lzLnN0ZG91dCwgc3lzLnN0ZGVycikKKworICAgICAgICBvdXRfc3RyZWFtID0gc3lzLnN0ZG91dAorICAgICAgICBlcnJfc3RyZWFtID0gc3lzLnN0ZGVycgorCisgICAgICAgIHJlc3VsdC5fb3JpZ2luYWxfc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICByZXN1bHQuX29yaWdpbmFsX3N0ZGVyciA9IFN0cmluZ0lPKCkKKworICAgICAgICBwcmludCAnZm9vJworICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAnYmFyJworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0X3N0cmVhbS5nZXR2YWx1ZSgpLCAnZm9vXG4nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVycl9zdHJlYW0uZ2V0dmFsdWUoKSwgJ2JhclxuJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5fb3JpZ2luYWxfc3Rkb3V0LmdldHZhbHVlKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5fb3JpZ2luYWxfc3RkZXJyLmdldHZhbHVlKCksICcnKQorCisgICAgICAgIHJlc3VsdC5hZGRTdWNjZXNzKHNlbGYpCisgICAgICAgIHJlc3VsdC5zdG9wVGVzdChzZWxmKQorCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3lzLnN0ZG91dCwgcmVzdWx0Ll9vcmlnaW5hbF9zdGRvdXQpCisgICAgICAgIHNlbGYuYXNzZXJ0SXMoc3lzLnN0ZGVyciwgcmVzdWx0Ll9vcmlnaW5hbF9zdGRlcnIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuX29yaWdpbmFsX3N0ZG91dC5nZXR2YWx1ZSgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuX29yaWdpbmFsX3N0ZGVyci5nZXR2YWx1ZSgpLCAnJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dF9zdHJlYW0uZ2V0dmFsdWUoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyX3N0cmVhbS5nZXR2YWx1ZSgpLCAnJykKKworCisgICAgZGVmIGdldFN0YXJ0ZWRSZXN1bHQoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICByZXN1bHQuYnVmZmVyID0gVHJ1ZQorICAgICAgICByZXN1bHQuc3RhcnRUZXN0KHNlbGYpCisgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiB0ZXN0QnVmZmVyT3V0cHV0QWRkRXJyb3JPckZhaWx1cmUoc2VsZik6CisgICAgICAgIHVuaXR0ZXN0LnJlc3VsdC50cmFjZWJhY2sgPSBNb2NrVHJhY2ViYWNrCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChyZXN0b3JlX3RyYWNlYmFjaykKKworICAgICAgICBmb3IgbWVzc2FnZV9hdHRyLCBhZGRfYXR0ciwgaW5jbHVkZV9lcnJvciBpbiBbCisgICAgICAgICAgICAoJ2Vycm9ycycsICdhZGRFcnJvcicsIFRydWUpLAorICAgICAgICAgICAgKCdmYWlsdXJlcycsICdhZGRGYWlsdXJlJywgRmFsc2UpLAorICAgICAgICAgICAgKCdlcnJvcnMnLCAnYWRkRXJyb3InLCBUcnVlKSwKKyAgICAgICAgICAgICgnZmFpbHVyZXMnLCAnYWRkRmFpbHVyZScsIEZhbHNlKQorICAgICAgICBdOgorICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5nZXRTdGFydGVkUmVzdWx0KCkKKyAgICAgICAgICAgIGJ1ZmZlcmVkX291dCA9IHN5cy5zdGRvdXQKKyAgICAgICAgICAgIGJ1ZmZlcmVkX2VyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgIHJlc3VsdC5fb3JpZ2luYWxfc3Rkb3V0ID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgcmVzdWx0Ll9vcmlnaW5hbF9zdGRlcnIgPSBTdHJpbmdJTygpCisKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRvdXQsICdmb28nCisgICAgICAgICAgICBpZiBpbmNsdWRlX2Vycm9yOgorICAgICAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICdiYXInCisKKworICAgICAgICAgICAgYWRkRnVuY3Rpb24gPSBnZXRhdHRyKHJlc3VsdCwgYWRkX2F0dHIpCisgICAgICAgICAgICBhZGRGdW5jdGlvbihzZWxmLCAoTm9uZSwgTm9uZSwgTm9uZSkpCisgICAgICAgICAgICByZXN1bHQuc3RvcFRlc3Qoc2VsZikKKworICAgICAgICAgICAgcmVzdWx0X2xpc3QgPSBnZXRhdHRyKHJlc3VsdCwgbWVzc2FnZV9hdHRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0X2xpc3QpLCAxKQorCisgICAgICAgICAgICB0ZXN0LCBtZXNzYWdlID0gcmVzdWx0X2xpc3RbMF0KKyAgICAgICAgICAgIGV4cGVjdGVkT3V0TWVzc2FnZSA9IHRleHR3cmFwLmRlZGVudCgiIiIKKyAgICAgICAgICAgICAgICBTdGRvdXQ6CisgICAgICAgICAgICAgICAgZm9vCisgICAgICAgICAgICAiIiIpCisgICAgICAgICAgICBleHBlY3RlZEVyck1lc3NhZ2UgPSAnJworICAgICAgICAgICAgaWYgaW5jbHVkZV9lcnJvcjoKKyAgICAgICAgICAgICAgICBleHBlY3RlZEVyck1lc3NhZ2UgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiCisgICAgICAgICAgICAgICAgU3RkZXJyOgorICAgICAgICAgICAgICAgIGJhcgorICAgICAgICAgICAgIiIiKQorICAgICAgICAgICAgZXhwZWN0ZWRGdWxsTWVzc2FnZSA9ICdBIHRyYWNlYmFjayVzJXMnICUgKGV4cGVjdGVkT3V0TWVzc2FnZSwgZXhwZWN0ZWRFcnJNZXNzYWdlKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydElzKHRlc3QsIHNlbGYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5fb3JpZ2luYWxfc3Rkb3V0LmdldHZhbHVlKCksIGV4cGVjdGVkT3V0TWVzc2FnZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0Ll9vcmlnaW5hbF9zdGRlcnIuZ2V0dmFsdWUoKSwgZXhwZWN0ZWRFcnJNZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRNdWx0aUxpbmVFcXVhbChtZXNzYWdlLCBleHBlY3RlZEZ1bGxNZXNzYWdlKQorCisgICAgZGVmIHRlc3RCdWZmZXJTZXR1cENsYXNzKHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0LmJ1ZmZlciA9IFRydWUKKworICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIDEvLzAKKyAgICAgICAgICAgIGRlZiB0ZXN0X2ZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfZm9vJyldKQorICAgICAgICBzdWl0ZShyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorCisgICAgZGVmIHRlc3RCdWZmZXJUZWFyRG93bkNsYXNzKHNlbGYpOgorICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcmVzdWx0LmJ1ZmZlciA9IFRydWUKKworICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIDEvLzAKKyAgICAgICAgICAgIGRlZiB0ZXN0X2ZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtGb28oJ3Rlc3RfZm9vJyldKQorICAgICAgICBzdWl0ZShyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorCisgICAgZGVmIHRlc3RCdWZmZXJTZXRVcE1vZHVsZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHJlc3VsdC5idWZmZXIgPSBUcnVlCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X2ZvbyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgMS8vMAorCisgICAgICAgIEZvby5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgc3lzLm1vZHVsZXNbJ01vZHVsZSddID0gTW9kdWxlCisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChzeXMubW9kdWxlcy5wb3AsICdNb2R1bGUnKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCd0ZXN0X2ZvbycpXSkKKyAgICAgICAgc3VpdGUocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMSkKKworICAgIGRlZiB0ZXN0QnVmZmVyVGVhckRvd25Nb2R1bGUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICByZXN1bHQuYnVmZmVyID0gVHJ1ZQorCisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9mb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bk1vZHVsZSgpOgorICAgICAgICAgICAgICAgIDEvLzAKKworICAgICAgICBGb28uX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIHN5cy5tb2R1bGVzWydNb2R1bGUnXSA9IE1vZHVsZQorICAgICAgICBzZWxmLmFkZENsZWFudXAoc3lzLm1vZHVsZXMucG9wLCAnTW9kdWxlJykKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW0ZvbygndGVzdF9mb28nKV0pCisgICAgICAgIHN1aXRlKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDEpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDc4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3Jlc3VsdC5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDc4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9yZXN1bHQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWNlZmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3RfcnVubmVyLnB5CkBAIC0wLDAgKzEsMjY2IEBACitpbXBvcnQgdW5pdHRlc3QKKworZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitpbXBvcnQgcGlja2xlCisKK2Zyb20gLnN1cHBvcnQgaW1wb3J0IExvZ2dpbmdSZXN1bHQsIFJlc3VsdFdpdGhOb1N0YXJ0VGVzdFJ1blN0b3BUZXN0UnVuCisKKworY2xhc3MgVGVzdENsZWFuVXAodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RDbGVhblVwKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0YWJsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3ROb3RoaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICB0ZXN0ID0gVGVzdGFibGVUZXN0KCd0ZXN0Tm90aGluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGVzdC5fY2xlYW51cHMsIFtdKQorCisgICAgICAgIGNsZWFudXBzID0gW10KKworICAgICAgICBkZWYgY2xlYW51cDEoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIGNsZWFudXBzLmFwcGVuZCgoMSwgYXJncywga3dhcmdzKSkKKworICAgICAgICBkZWYgY2xlYW51cDIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgICAgIGNsZWFudXBzLmFwcGVuZCgoMiwgYXJncywga3dhcmdzKSkKKworICAgICAgICB0ZXN0LmFkZENsZWFudXAoY2xlYW51cDEsIDEsIDIsIDMsIGZvdXI9J2hlbGxvJywgZml2ZT0nZ29vZGJ5ZScpCisgICAgICAgIHRlc3QuYWRkQ2xlYW51cChjbGVhbnVwMikKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRlc3QuX2NsZWFudXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsoY2xlYW51cDEsICgxLCAyLCAzKSwgZGljdChmb3VyPSdoZWxsbycsIGZpdmU9J2dvb2RieWUnKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGVhbnVwMiwgKCksIHt9KV0pCisKKyAgICAgICAgcmVzdWx0ID0gdGVzdC5kb0NsZWFudXBzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNsZWFudXBzLCBbKDIsICgpLCB7fSksICgxLCAoMSwgMiwgMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0KGZvdXI9J2hlbGxvJywgZml2ZT0nZ29vZGJ5ZScpKV0pCisKKyAgICBkZWYgdGVzdENsZWFuVXBXaXRoRXJyb3JzKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0YWJsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3ROb3RoaW5nKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBNb2NrUmVzdWx0KG9iamVjdCk6CisgICAgICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICAgICAgZGVmIGFkZEVycm9yKHNlbGYsIHRlc3QsIGV4Y19pbmZvKToKKyAgICAgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoKHRlc3QsIGV4Y19pbmZvKSkKKworICAgICAgICByZXN1bHQgPSBNb2NrUmVzdWx0KCkKKyAgICAgICAgdGVzdCA9IFRlc3RhYmxlVGVzdCgndGVzdE5vdGhpbmcnKQorICAgICAgICB0ZXN0Ll9yZXN1bHRGb3JEb0NsZWFudXBzID0gcmVzdWx0CisKKyAgICAgICAgZXhjMSA9IEV4Y2VwdGlvbignZm9vJykKKyAgICAgICAgZXhjMiA9IEV4Y2VwdGlvbignYmFyJykKKyAgICAgICAgZGVmIGNsZWFudXAxKCk6CisgICAgICAgICAgICByYWlzZSBleGMxCisKKyAgICAgICAgZGVmIGNsZWFudXAyKCk6CisgICAgICAgICAgICByYWlzZSBleGMyCisKKyAgICAgICAgdGVzdC5hZGRDbGVhbnVwKGNsZWFudXAxKQorICAgICAgICB0ZXN0LmFkZENsZWFudXAoY2xlYW51cDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0ZXN0LmRvQ2xlYW51cHMoKSkKKworICAgICAgICAodGVzdDEsIChUeXBlMSwgaW5zdGFuY2UxLCBfKSksICh0ZXN0MiwgKFR5cGUyLCBpbnN0YW5jZTIsIF8pKSA9IHJldmVyc2VkKE1vY2tSZXN1bHQuZXJyb3JzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh0ZXN0MSwgVHlwZTEsIGluc3RhbmNlMSksICh0ZXN0LCBFeGNlcHRpb24sIGV4YzEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh0ZXN0MiwgVHlwZTIsIGluc3RhbmNlMiksICh0ZXN0LCBFeGNlcHRpb24sIGV4YzIpKQorCisgICAgZGVmIHRlc3RDbGVhbnVwSW5SdW4oc2VsZik6CisgICAgICAgIGJsb3dVcCA9IEZhbHNlCisgICAgICAgIG9yZGVyaW5nID0gW10KKworICAgICAgICBjbGFzcyBUZXN0YWJsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgnc2V0VXAnKQorICAgICAgICAgICAgICAgIGlmIGJsb3dVcDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdmb28nKQorCisgICAgICAgICAgICBkZWYgdGVzdE5vdGhpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCd0ZXN0JykKKworICAgICAgICAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgndGVhckRvd24nKQorCisgICAgICAgIHRlc3QgPSBUZXN0YWJsZVRlc3QoJ3Rlc3ROb3RoaW5nJykKKworICAgICAgICBkZWYgY2xlYW51cDEoKToKKyAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgnY2xlYW51cDEnKQorICAgICAgICBkZWYgY2xlYW51cDIoKToKKyAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgnY2xlYW51cDInKQorICAgICAgICB0ZXN0LmFkZENsZWFudXAoY2xlYW51cDEpCisgICAgICAgIHRlc3QuYWRkQ2xlYW51cChjbGVhbnVwMikKKworICAgICAgICBkZWYgc3VjY2Vzcyhzb21lX3Rlc3QpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb21lX3Rlc3QsIHRlc3QpCisgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3N1Y2Nlc3MnKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICByZXN1bHQuYWRkU3VjY2VzcyA9IHN1Y2Nlc3MKKworICAgICAgICB0ZXN0LnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkZXJpbmcsIFsnc2V0VXAnLCAndGVzdCcsICd0ZWFyRG93bicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xlYW51cDInLCAnY2xlYW51cDEnLCAnc3VjY2VzcyddKQorCisgICAgICAgIGJsb3dVcCA9IFRydWUKKyAgICAgICAgb3JkZXJpbmcgPSBbXQorICAgICAgICB0ZXN0ID0gVGVzdGFibGVUZXN0KCd0ZXN0Tm90aGluZycpCisgICAgICAgIHRlc3QuYWRkQ2xlYW51cChjbGVhbnVwMSkKKyAgICAgICAgdGVzdC5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yZGVyaW5nLCBbJ3NldFVwJywgJ2NsZWFudXAxJ10pCisKKyAgICBkZWYgdGVzdFRlc3RDYXNlRGVidWdFeGVjdXRlc0NsZWFudXBzKHNlbGYpOgorICAgICAgICBvcmRlcmluZyA9IFtdCisKKyAgICAgICAgY2xhc3MgVGVzdGFibGVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3NldFVwJykKKyAgICAgICAgICAgICAgICBzZWxmLmFkZENsZWFudXAoY2xlYW51cDEpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0Tm90aGluZyhzZWxmKToKKyAgICAgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3Rlc3QnKQorCisgICAgICAgICAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCd0ZWFyRG93bicpCisKKyAgICAgICAgdGVzdCA9IFRlc3RhYmxlVGVzdCgndGVzdE5vdGhpbmcnKQorCisgICAgICAgIGRlZiBjbGVhbnVwMSgpOgorICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCdjbGVhbnVwMScpCisgICAgICAgICAgICB0ZXN0LmFkZENsZWFudXAoY2xlYW51cDIpCisgICAgICAgIGRlZiBjbGVhbnVwMigpOgorICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCdjbGVhbnVwMicpCisKKyAgICAgICAgdGVzdC5kZWJ1ZygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkZXJpbmcsIFsnc2V0VXAnLCAndGVzdCcsICd0ZWFyRG93bicsICdjbGVhbnVwMScsICdjbGVhbnVwMiddKQorCisKK2NsYXNzIFRlc3RfVGV4dFRlc3RSdW5uZXIodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICIiIlRlc3RzIGZvciBUZXh0VGVzdFJ1bm5lci4iIiIKKworICAgIGRlZiB0ZXN0X2luaXQoc2VsZik6CisgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShydW5uZXIuZmFpbGZhc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocnVubmVyLmJ1ZmZlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5uZXIudmVyYm9zaXR5LCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocnVubmVyLmRlc2NyaXB0aW9ucykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5uZXIucmVzdWx0Y2xhc3MsIHVuaXR0ZXN0LlRleHRUZXN0UmVzdWx0KQorCisKKyAgICBkZWYgdGVzdF9tdWx0aXBsZV9pbmhlcml0YW5jZShzZWxmKToKKyAgICAgICAgY2xhc3MgQVJlc3VsdCh1bml0dGVzdC5UZXN0UmVzdWx0KToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGRlc2NyaXB0aW9ucywgdmVyYm9zaXR5KToKKyAgICAgICAgICAgICAgICBzdXBlcihBUmVzdWx0LCBzZWxmKS5fX2luaXRfXyhzdHJlYW0sIGRlc2NyaXB0aW9ucywgdmVyYm9zaXR5KQorCisgICAgICAgIGNsYXNzIEFUZXh0UmVzdWx0KHVuaXR0ZXN0LlRleHRUZXN0UmVzdWx0LCBBUmVzdWx0KToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICAjIFRoaXMgdXNlZCB0byByYWlzZSBhbiBleGNlcHRpb24gZHVlIHRvIFRleHRUZXN0UmVzdWx0IG5vdCBwYXNzaW5nCisgICAgICAgICMgb24gYXJndW1lbnRzIGluIGl0cyBfX2luaXRfXyBzdXBlciBjYWxsCisgICAgICAgIEFUZXh0UmVzdWx0KE5vbmUsIE5vbmUsIE5vbmUpCisKKworICAgIGRlZiB0ZXN0QnVmZmVyQW5kRmFpbGZhc3Qoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RGb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXN1bHQgPSB1bml0dGVzdC5UZXN0UmVzdWx0KCkKKyAgICAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoc3RyZWFtPVN0cmluZ0lPKCksIGZhaWxmYXN0PVRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyPVRydWUpCisgICAgICAgICMgVXNlIG91ciByZXN1bHQgb2JqZWN0CisgICAgICAgIHJ1bm5lci5fbWFrZVJlc3VsdCA9IGxhbWJkYTogcmVzdWx0CisgICAgICAgIHJ1bm5lci5ydW4oVGVzdCgndGVzdEZvbycpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuZmFpbGZhc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuYnVmZmVyKQorCisgICAgZGVmIHRlc3RSdW5uZXJSZWdpc3RlcnNSZXN1bHQoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RGb28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBvcmlnaW5hbFJlZ2lzdGVyUmVzdWx0ID0gdW5pdHRlc3QucnVubmVyLnJlZ2lzdGVyUmVzdWx0CisgICAgICAgIGRlZiBjbGVhbnVwKCk6CisgICAgICAgICAgICB1bml0dGVzdC5ydW5uZXIucmVnaXN0ZXJSZXN1bHQgPSBvcmlnaW5hbFJlZ2lzdGVyUmVzdWx0CisgICAgICAgIHNlbGYuYWRkQ2xlYW51cChjbGVhbnVwKQorCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcihzdHJlYW09U3RyaW5nSU8oKSkKKyAgICAgICAgIyBVc2Ugb3VyIHJlc3VsdCBvYmplY3QKKyAgICAgICAgcnVubmVyLl9tYWtlUmVzdWx0ID0gbGFtYmRhOiByZXN1bHQKKworICAgICAgICBzZWxmLndhc1JlZ2lzdGVyZWQgPSAwCisgICAgICAgIGRlZiBmYWtlUmVnaXN0ZXJSZXN1bHQodGhpc1Jlc3VsdCk6CisgICAgICAgICAgICBzZWxmLndhc1JlZ2lzdGVyZWQgKz0gMQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aGlzUmVzdWx0LCByZXN1bHQpCisgICAgICAgIHVuaXR0ZXN0LnJ1bm5lci5yZWdpc3RlclJlc3VsdCA9IGZha2VSZWdpc3RlclJlc3VsdAorCisgICAgICAgIHJ1bm5lci5ydW4odW5pdHRlc3QuVGVzdFN1aXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53YXNSZWdpc3RlcmVkLCAxKQorCisgICAgZGVmIHRlc3Rfd29ya3Nfd2l0aF9yZXN1bHRfd2l0aG91dF9zdGFydFRlc3RSdW5fc3RvcFRlc3RSdW4oc2VsZik6CisgICAgICAgIGNsYXNzIE9sZFRleHRSZXN1bHQoUmVzdWx0V2l0aE5vU3RhcnRUZXN0UnVuU3RvcFRlc3RSdW4pOgorICAgICAgICAgICAgc2VwYXJhdG9yMiA9ICcnCisgICAgICAgICAgICBkZWYgcHJpbnRFcnJvcnMoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFJ1bm5lcih1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcik6CisgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICAgICAgICAgc3VwZXIoUnVubmVyLCBzZWxmKS5fX2luaXRfXyhTdHJpbmdJTygpKQorCisgICAgICAgICAgICBkZWYgX21ha2VSZXN1bHQoc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIE9sZFRleHRSZXN1bHQoKQorCisgICAgICAgIHJ1bm5lciA9IFJ1bm5lcigpCisgICAgICAgIHJ1bm5lci5ydW4odW5pdHRlc3QuVGVzdFN1aXRlKCkpCisKKyAgICBkZWYgdGVzdF9zdGFydFRlc3RSdW5fc3RvcFRlc3RSdW5fY2FsbGVkKHNlbGYpOgorICAgICAgICBjbGFzcyBMb2dnaW5nVGV4dFJlc3VsdChMb2dnaW5nUmVzdWx0KToKKyAgICAgICAgICAgIHNlcGFyYXRvcjIgPSAnJworICAgICAgICAgICAgZGVmIHByaW50RXJyb3JzKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBMb2dnaW5nUnVubmVyKHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKToKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBldmVudHMpOgorICAgICAgICAgICAgICAgIHN1cGVyKExvZ2dpbmdSdW5uZXIsIHNlbGYpLl9faW5pdF9fKFN0cmluZ0lPKCkpCisgICAgICAgICAgICAgICAgc2VsZi5fZXZlbnRzID0gZXZlbnRzCisKKyAgICAgICAgICAgIGRlZiBfbWFrZVJlc3VsdChzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9nZ2luZ1RleHRSZXN1bHQoc2VsZi5fZXZlbnRzKQorCisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJ1bm5lciA9IExvZ2dpbmdSdW5uZXIoZXZlbnRzKQorICAgICAgICBydW5uZXIucnVuKHVuaXR0ZXN0LlRlc3RTdWl0ZSgpKQorICAgICAgICBleHBlY3RlZCA9IFsnc3RhcnRUZXN0UnVuJywgJ3N0b3BUZXN0UnVuJ10KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIGV4cGVjdGVkKQorCisgICAgZGVmIHRlc3RfcGlja2xlX3VucGlja2xlKHNlbGYpOgorICAgICAgICAjIElzc3VlICM3MTk3OiBhIFRleHRUZXN0UnVubmVyIHNob3VsZCBiZSAodW4pcGlja2xlYWJsZS4gVGhpcyBpcworICAgICAgICAjIHJlcXVpcmVkIGJ5IHRlc3RfbXVsdGlwcm9jZXNzaW5nIHVuZGVyIFdpbmRvd3MgKGluIHZlcmJvc2UgbW9kZSkuCisgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPIGFzIFBpY2tsZWFibGVJTworICAgICAgICAjIGNTdHJpbmdJTyBvYmplY3RzIGFyZSBub3QgcGlja2xlYWJsZSwgYnV0IFN0cmluZ0lPIG9iamVjdHMgYXJlLgorICAgICAgICBzdHJlYW0gPSBQaWNrbGVhYmxlSU8oImZvbyIpCisgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHN0cmVhbSkKKyAgICAgICAgZm9yIHByb3RvY29sIGluIHJhbmdlKHBpY2tsZS5ISUdIRVNUX1BST1RPQ09MICsgMSk6CisgICAgICAgICAgICBzID0gcGlja2xlLmR1bXBzKHJ1bm5lciwgcHJvdG9jb2w9cHJvdG9jb2wpCisgICAgICAgICAgICBvYmogPSBwaWNrbGUubG9hZHMocykKKyAgICAgICAgICAgICMgU3RyaW5nSU8gb2JqZWN0cyBuZXZlciBjb21wYXJlIGVxdWFsLCBhIGNoZWFwIHRlc3QgaW5zdGVhZC4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2JqLnN0cmVhbS5nZXR2YWx1ZSgpLCBzdHJlYW0uZ2V0dmFsdWUoKSkKKworICAgIGRlZiB0ZXN0X3Jlc3VsdGNsYXNzKHNlbGYpOgorICAgICAgICBkZWYgTW9ja1Jlc3VsdENsYXNzKCphcmdzKToKKyAgICAgICAgICAgIHJldHVybiBhcmdzCisgICAgICAgIFNUUkVBTSA9IG9iamVjdCgpCisgICAgICAgIERFU0NSSVBUSU9OUyA9IG9iamVjdCgpCisgICAgICAgIFZFUkJPU0lUWSA9IG9iamVjdCgpCisgICAgICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKFNUUkVBTSwgREVTQ1JJUFRJT05TLCBWRVJCT1NJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdGNsYXNzPU1vY2tSZXN1bHRDbGFzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5uZXIucmVzdWx0Y2xhc3MsIE1vY2tSZXN1bHRDbGFzcykKKworICAgICAgICBleHBlY3RlZHJlc3VsdCA9IChydW5uZXIuc3RyZWFtLCBERVNDUklQVElPTlMsIFZFUkJPU0lUWSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChydW5uZXIuX21ha2VSZXN1bHQoKSwgZXhwZWN0ZWRyZXN1bHQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weWMgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9ydW5uZXIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzRhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9ydW5uZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3J1bm5lci5weW8gYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9ydW5uZXIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NzRhMmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9ydW5uZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NldHVwcy5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NldHVwcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU2ODE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2V0dXBzLnB5CkBAIC0wLDAgKzEsNTA4IEBACitpbXBvcnQgc3lzCisKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgdW5pdHRlc3QKKworCitkZWYgcmVzdWx0RmFjdG9yeSgqXyk6CisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorCisKK2NsYXNzIFRlc3RTZXR1cHModW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIGdldFJ1bm5lcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKHJlc3VsdGNsYXNzPXJlc3VsdEZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW09U3RyaW5nSU8oKSkKKyAgICBkZWYgcnVuVGVzdHMoc2VsZiwgKmNhc2VzKToKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICBmb3IgY2FzZSBpbiBjYXNlczoKKyAgICAgICAgICAgIHRlc3RzID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKGNhc2UpCisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0cyh0ZXN0cykKKworICAgICAgICBydW5uZXIgPSBzZWxmLmdldFJ1bm5lcigpCisKKyAgICAgICAgIyBjcmVhdGluZyBhIG5lc3RlZCBzdWl0ZSBleHBvc2VzIHNvbWUgcG90ZW50aWFsIGJ1Z3MKKyAgICAgICAgcmVhbFN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgcmVhbFN1aXRlLmFkZFRlc3Qoc3VpdGUpCisgICAgICAgICMgYWRkaW5nIGVtcHR5IHN1aXRlcyB0byB0aGUgZW5kIGV4cG9zZXMgcG90ZW50aWFsIGJ1Z3MKKyAgICAgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5UZXN0U3VpdGUoKSkKKyAgICAgICAgcmVhbFN1aXRlLmFkZFRlc3QodW5pdHRlc3QuVGVzdFN1aXRlKCkpCisgICAgICAgIHJldHVybiBydW5uZXIucnVuKHJlYWxTdWl0ZSkKKworICAgIGRlZiB0ZXN0X3NldHVwX2NsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHNldFVwQ2FsbGVkID0gMAorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3Quc2V0VXBDYWxsZWQgKz0gMQorICAgICAgICAgICAgICAgIHVuaXR0ZXN0LlRlc3RDYXNlLnNldFVwQ2xhc3MoKQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ydW5UZXN0cyhUZXN0KQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVGVzdC5zZXRVcENhbGxlZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAwKQorCisgICAgZGVmIHRlc3RfdGVhcmRvd25fY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgdGVhckRvd25DYWxsZWQgPSAwCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC50ZWFyRG93bkNhbGxlZCArPSAxCisgICAgICAgICAgICAgICAgdW5pdHRlc3QuVGVzdENhc2UudGVhckRvd25DbGFzcygpCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUZXN0LnRlYXJEb3duQ2FsbGVkLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisKKyAgICBkZWYgdGVzdF90ZWFyZG93bl9jbGFzc190d29fY2xhc3NlcyhzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0ZWFyRG93bkNhbGxlZCA9IDAKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBUZXN0LnRlYXJEb3duQ2FsbGVkICs9IDEKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS50ZWFyRG93bkNsYXNzKCkKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFRlc3QyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHRlYXJEb3duQ2FsbGVkID0gMAorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QyLnRlYXJEb3duQ2FsbGVkICs9IDEKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0Q2FzZS50ZWFyRG93bkNsYXNzKCkKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuVGVzdHMoVGVzdCwgVGVzdDIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUZXN0LnRlYXJEb3duQ2FsbGVkLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRlc3QyLnRlYXJEb3duQ2FsbGVkLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisKKyAgICBkZWYgdGVzdF9lcnJvcl9pbl9zZXR1cGNsYXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBCcm9rZW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZvbycpCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKEJyb2tlblRlc3QpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorICAgICAgICBlcnJvciwgXyA9IHJlc3VsdC5lcnJvcnNbMF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAnc2V0VXBDbGFzcyAoJXMuQnJva2VuVGVzdCknICUgX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9lcnJvcl9pbl90ZWFyZG93bl9jbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0b3JuRG93biA9IDAKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBUZXN0LnRvcm5Eb3duICs9IDEKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ2ZvbycpCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBUZXN0Mih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB0b3JuRG93biA9IDAKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBUZXN0Mi50b3JuRG93biArPSAxCisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmb28nKQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ydW5UZXN0cyhUZXN0LCBUZXN0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRlc3QudG9ybkRvd24sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVGVzdDIudG9ybkRvd24sIDEpCisKKyAgICAgICAgZXJyb3IsIF8gPSByZXN1bHQuZXJyb3JzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgJ3RlYXJEb3duQ2xhc3MgKCVzLlRlc3QpJyAlIF9fbmFtZV9fKQorCisgICAgZGVmIHRlc3RfY2xhc3Nfbm90X3Rvcm5kb3duX3doZW5fc2V0dXBfZmFpbHMoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgdG9ybkRvd24gPSBGYWxzZQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QudG9ybkRvd24gPSBUcnVlCisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmb28nKQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLnJ1blRlc3RzKFRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoVGVzdC50b3JuRG93bikKKworICAgIGRlZiB0ZXN0X2NsYXNzX25vdF9zZXR1cF9vcl90b3JuZG93bl93aGVuX3NraXBwZWQoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgY2xhc3NTZXRVcCA9IEZhbHNlCisgICAgICAgICAgICB0b3JuRG93biA9IEZhbHNlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC5jbGFzc1NldFVwID0gVHJ1ZQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QudG9ybkRvd24gPSBUcnVlCisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIFRlc3QgPSB1bml0dGVzdC5za2lwKCJob3AiKShUZXN0KQorICAgICAgICBzZWxmLnJ1blRlc3RzKFRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoVGVzdC5jbGFzc1NldFVwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFRlc3QudG9ybkRvd24pCisKKyAgICBkZWYgdGVzdF9zZXR1cF90ZWFyZG93bl9vcmRlcl93aXRoX3BhdGhvbG9naWNhbF9zdWl0ZShzZWxmKToKKyAgICAgICAgcmVzdWx0cyA9IFtdCisKKyAgICAgICAgY2xhc3MgTW9kdWxlMShvYmplY3QpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ01vZHVsZTEuc2V0VXBNb2R1bGUnKQorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ01vZHVsZTEudGVhckRvd25Nb2R1bGUnKQorCisgICAgICAgIGNsYXNzIE1vZHVsZTIob2JqZWN0KToKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcE1vZHVsZSgpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdNb2R1bGUyLnNldFVwTW9kdWxlJykKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bk1vZHVsZSgpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdNb2R1bGUyLnRlYXJEb3duTW9kdWxlJykKKworICAgICAgICBjbGFzcyBUZXN0MSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3NldHVwIDEnKQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCd0ZWFyZG93biAxJykKKyAgICAgICAgICAgIGRlZiB0ZXN0T25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdUZXN0MS50ZXN0T25lJykKKyAgICAgICAgICAgIGRlZiB0ZXN0VHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdUZXN0MS50ZXN0VHdvJykKKworICAgICAgICBjbGFzcyBUZXN0Mih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3NldHVwIDInKQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCd0ZWFyZG93biAyJykKKyAgICAgICAgICAgIGRlZiB0ZXN0T25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdUZXN0Mi50ZXN0T25lJykKKyAgICAgICAgICAgIGRlZiB0ZXN0VHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdUZXN0Mi50ZXN0VHdvJykKKworICAgICAgICBjbGFzcyBUZXN0Myh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgcmVzdWx0cy5hcHBlbmQoJ3NldHVwIDMnKQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCd0ZWFyZG93biAzJykKKyAgICAgICAgICAgIGRlZiB0ZXN0T25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdUZXN0My50ZXN0T25lJykKKyAgICAgICAgICAgIGRlZiB0ZXN0VHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlc3VsdHMuYXBwZW5kKCdUZXN0My50ZXN0VHdvJykKKworICAgICAgICBUZXN0MS5fX21vZHVsZV9fID0gVGVzdDIuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIFRlc3QzLl9fbW9kdWxlX18gPSAnTW9kdWxlMicKKyAgICAgICAgc3lzLm1vZHVsZXNbJ01vZHVsZSddID0gTW9kdWxlMQorICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlMiddID0gTW9kdWxlMgorCisgICAgICAgIGZpcnN0ID0gdW5pdHRlc3QuVGVzdFN1aXRlKChUZXN0MSgndGVzdE9uZScpLCkpCisgICAgICAgIHNlY29uZCA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgoVGVzdDEoJ3Rlc3RUd28nKSwpKQorICAgICAgICB0aGlyZCA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgoVGVzdDIoJ3Rlc3RPbmUnKSwpKQorICAgICAgICBmb3VydGggPSB1bml0dGVzdC5UZXN0U3VpdGUoKFRlc3QyKCd0ZXN0VHdvJyksKSkKKyAgICAgICAgZmlmdGggPSB1bml0dGVzdC5UZXN0U3VpdGUoKFRlc3QzKCd0ZXN0T25lJyksKSkKKyAgICAgICAgc2l4dGggPSB1bml0dGVzdC5UZXN0U3VpdGUoKFRlc3QzKCd0ZXN0VHdvJyksKSkKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKGZpcnN0LCBzZWNvbmQsIHRoaXJkLCBmb3VydGgsIGZpZnRoLCBzaXh0aCkpCisKKyAgICAgICAgcnVubmVyID0gc2VsZi5nZXRSdW5uZXIoKQorICAgICAgICByZXN1bHQgPSBydW5uZXIucnVuKHN1aXRlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFsnTW9kdWxlMS5zZXRVcE1vZHVsZScsICdzZXR1cCAxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Rlc3QxLnRlc3RPbmUnLCAnVGVzdDEudGVzdFR3bycsICd0ZWFyZG93biAxJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NldHVwIDInLCAnVGVzdDIudGVzdE9uZScsICdUZXN0Mi50ZXN0VHdvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RlYXJkb3duIDInLCAnTW9kdWxlMS50ZWFyRG93bk1vZHVsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdNb2R1bGUyLnNldFVwTW9kdWxlJywgJ3NldHVwIDMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnVGVzdDMudGVzdE9uZScsICdUZXN0My50ZXN0VHdvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RlYXJkb3duIDMnLCAnTW9kdWxlMi50ZWFyRG93bk1vZHVsZSddKQorCisgICAgZGVmIHRlc3Rfc2V0dXBfbW9kdWxlKHNlbGYpOgorICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIG1vZHVsZVNldHVwID0gMAorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgTW9kdWxlLm1vZHVsZVNldHVwICs9IDEKKworICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBUZXN0Ll9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTW9kdWxlLm1vZHVsZVNldHVwLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisKKyAgICBkZWYgdGVzdF9lcnJvcl9pbl9zZXR1cF9tb2R1bGUoc2VsZik6CisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgbW9kdWxlU2V0dXAgPSAwCisgICAgICAgICAgICBtb2R1bGVUb3JuRG93biA9IDAKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcE1vZHVsZSgpOgorICAgICAgICAgICAgICAgIE1vZHVsZS5tb2R1bGVTZXR1cCArPSAxCisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdmb28nKQorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgTW9kdWxlLm1vZHVsZVRvcm5Eb3duICs9IDEKKworICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGNsYXNzU2V0VXAgPSBGYWxzZQorICAgICAgICAgICAgY2xhc3NUb3JuRG93biA9IEZhbHNlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC5jbGFzc1NldFVwID0gVHJ1ZQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QuY2xhc3NUb3JuRG93biA9IFRydWUKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFRlc3QyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBUZXN0Ll9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBUZXN0Mi5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgc3lzLm1vZHVsZXNbJ01vZHVsZSddID0gTW9kdWxlCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ydW5UZXN0cyhUZXN0LCBUZXN0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNb2R1bGUubW9kdWxlU2V0dXAsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTW9kdWxlLm1vZHVsZVRvcm5Eb3duLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShUZXN0LmNsYXNzU2V0VXApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoVGVzdC5jbGFzc1Rvcm5Eb3duKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMSkKKyAgICAgICAgZXJyb3IsIF8gPSByZXN1bHQuZXJyb3JzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGVycm9yKSwgJ3NldFVwTW9kdWxlIChNb2R1bGUpJykKKworICAgIGRlZiB0ZXN0X3Rlc3RjYXNlX3dpdGhfbWlzc2luZ19tb2R1bGUoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIHN5cy5tb2R1bGVzLnBvcCgnTW9kdWxlJywgTm9uZSkKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCAyKQorCisgICAgZGVmIHRlc3RfdGVhcmRvd25fbW9kdWxlKHNlbGYpOgorICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIG1vZHVsZVRvcm5Eb3duID0gMAorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHRlYXJEb3duTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgTW9kdWxlLm1vZHVsZVRvcm5Eb3duICs9IDEKKworICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBUZXN0Ll9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKworICAgICAgICByZXN1bHQgPSBzZWxmLnJ1blRlc3RzKFRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTW9kdWxlLm1vZHVsZVRvcm5Eb3duLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisKKyAgICBkZWYgdGVzdF9lcnJvcl9pbl90ZWFyZG93bl9tb2R1bGUoc2VsZik6CisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgbW9kdWxlVG9ybkRvd24gPSAwCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25Nb2R1bGUoKToKKyAgICAgICAgICAgICAgICBNb2R1bGUubW9kdWxlVG9ybkRvd24gKz0gMQorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignZm9vJykKKworICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGNsYXNzU2V0VXAgPSBGYWxzZQorICAgICAgICAgICAgY2xhc3NUb3JuRG93biA9IEZhbHNlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgVGVzdC5jbGFzc1NldFVwID0gVHJ1ZQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIFRlc3QuY2xhc3NUb3JuRG93biA9IFRydWUKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGNsYXNzIFRlc3QyKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X29uZShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdF90d28oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBUZXN0Ll9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBUZXN0Mi5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgc3lzLm1vZHVsZXNbJ01vZHVsZSddID0gTW9kdWxlCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ydW5UZXN0cyhUZXN0LCBUZXN0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChNb2R1bGUubW9kdWxlVG9ybkRvd24sIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnRlc3RzUnVuLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVGVzdC5jbGFzc1NldFVwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVGVzdC5jbGFzc1Rvcm5Eb3duKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZXJyb3JzKSwgMSkKKyAgICAgICAgZXJyb3IsIF8gPSByZXN1bHQuZXJyb3JzWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGVycm9yKSwgJ3RlYXJEb3duTW9kdWxlIChNb2R1bGUpJykKKworICAgIGRlZiB0ZXN0X3NraXB0ZXN0X2luX3NldHVwY2xhc3Moc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdmb28nKQorICAgICAgICAgICAgZGVmIHRlc3Rfb25lKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0X3R3byhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ydW5UZXN0cyhUZXN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LmVycm9ycyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5za2lwcGVkKSwgMSkKKyAgICAgICAgc2tpcHBlZCA9IHJlc3VsdC5za2lwcGVkWzBdWzBdCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHNraXBwZWQpLCAnc2V0VXBDbGFzcyAoJXMuVGVzdCknICUgX19uYW1lX18pCisKKyAgICBkZWYgdGVzdF9za2lwdGVzdF9pbl9zZXR1cG1vZHVsZShzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBkZWYgdGVzdF9vbmUoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVmIHRlc3RfdHdvKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcE1vZHVsZSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIHVuaXR0ZXN0LlNraXBUZXN0KCdmb28nKQorCisgICAgICAgIFRlc3QuX19tb2R1bGVfXyA9ICdNb2R1bGUnCisgICAgICAgIHN5cy5tb2R1bGVzWydNb2R1bGUnXSA9IE1vZHVsZQorCisgICAgICAgIHJlc3VsdCA9IHNlbGYucnVuVGVzdHMoVGVzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuc2tpcHBlZCksIDEpCisgICAgICAgIHNraXBwZWQgPSByZXN1bHQuc2tpcHBlZFswXVswXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihza2lwcGVkKSwgJ3NldFVwTW9kdWxlIChNb2R1bGUpJykKKworICAgIGRlZiB0ZXN0X3N1aXRlX2RlYnVnX2V4ZWN1dGVzX3NldHVwc19hbmRfdGVhcmRvd25zKHNlbGYpOgorICAgICAgICBvcmRlcmluZyA9IFtdCisKKyAgICAgICAgY2xhc3MgTW9kdWxlKG9iamVjdCk6CisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBNb2R1bGUoKToKKyAgICAgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3NldFVwTW9kdWxlJykKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bk1vZHVsZSgpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgndGVhckRvd25Nb2R1bGUnKQorCisgICAgICAgIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgc2V0VXBDbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIG9yZGVyaW5nLmFwcGVuZCgnc2V0VXBDbGFzcycpCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bkNsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgb3JkZXJpbmcuYXBwZW5kKCd0ZWFyRG93bkNsYXNzJykKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NvbWV0aGluZyhzZWxmKToKKyAgICAgICAgICAgICAgICBvcmRlcmluZy5hcHBlbmQoJ3Rlc3Rfc29tZXRoaW5nJykKKworICAgICAgICBUZXN0Ll9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKworICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0KQorICAgICAgICBzdWl0ZS5kZWJ1ZygpCisgICAgICAgIGV4cGVjdGVkT3JkZXIgPSBbJ3NldFVwTW9kdWxlJywgJ3NldFVwQ2xhc3MnLCAndGVzdF9zb21ldGhpbmcnLCAndGVhckRvd25DbGFzcycsICd0ZWFyRG93bk1vZHVsZSddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JkZXJpbmcsIGV4cGVjdGVkT3JkZXIpCisKKyAgICBkZWYgdGVzdF9zdWl0ZV9kZWJ1Z19wcm9wYWdhdGVzX2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIGNsYXNzIE1vZHVsZShvYmplY3QpOgorICAgICAgICAgICAgQHN0YXRpY21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwTW9kdWxlKCk6CisgICAgICAgICAgICAgICAgaWYgcGhhc2UgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCdzZXRVcE1vZHVsZScpCisgICAgICAgICAgICBAc3RhdGljbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25Nb2R1bGUoKToKKyAgICAgICAgICAgICAgICBpZiBwaGFzZSA9PSAxOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3RlYXJEb3duTW9kdWxlJykKKworICAgICAgICBjbGFzcyBUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEBjbGFzc21ldGhvZAorICAgICAgICAgICAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICAgICAgICAgICAgICBpZiBwaGFzZSA9PSAyOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ3NldFVwQ2xhc3MnKQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIGlmIHBoYXNlID09IDM6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigndGVhckRvd25DbGFzcycpCisgICAgICAgICAgICBkZWYgdGVzdF9zb21ldGhpbmcoc2VsZik6CisgICAgICAgICAgICAgICAgaWYgcGhhc2UgPT0gNDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKCd0ZXN0X3NvbWV0aGluZycpCisKKyAgICAgICAgVGVzdC5fX21vZHVsZV9fID0gJ01vZHVsZScKKyAgICAgICAgc3lzLm1vZHVsZXNbJ01vZHVsZSddID0gTW9kdWxlCisKKyAgICAgICAgX3N1aXRlID0gdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbVRlc3RDYXNlKFRlc3QpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgc3VpdGUuYWRkVGVzdChfc3VpdGUpCisKKyAgICAgICAgbWVzc2FnZXMgPSAoJ3NldFVwTW9kdWxlJywgJ3RlYXJEb3duTW9kdWxlJywgJ3NldFVwQ2xhc3MnLCAndGVhckRvd25DbGFzcycsICd0ZXN0X3NvbWV0aGluZycpCisgICAgICAgIGZvciBwaGFzZSwgbXNnIGluIGVudW1lcmF0ZShtZXNzYWdlcyk6CisgICAgICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKEV4Y2VwdGlvbiwgbXNnKToKKyAgICAgICAgICAgICAgICBzdWl0ZS5kZWJ1ZygpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zZXR1cHMucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2V0dXBzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzEzNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2V0dXBzLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zZXR1cHMucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2V0dXBzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzEzNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2V0dXBzLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9za2lwcGluZy5weSBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjM5ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9za2lwcGluZy5weQpAQCAtMCwwICsxLDE2OCBAQAoraW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gLnN1cHBvcnQgaW1wb3J0IExvZ2dpbmdSZXN1bHQKKworCitjbGFzcyBUZXN0X1Rlc3RTa2lwcGluZyh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9za2lwcGluZyhzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X3NraXBfbWUoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5za2lwVGVzdCgic2tpcCIpCisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorICAgICAgICB0ZXN0ID0gRm9vKCJ0ZXN0X3NraXBfbWUiKQorICAgICAgICB0ZXN0LnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZlbnRzLCBbJ3N0YXJ0VGVzdCcsICdhZGRTa2lwJywgJ3N0b3BUZXN0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNraXBwZWQsIFsodGVzdCwgInNraXAiKV0pCisKKyAgICAgICAgIyBUcnkgbGV0dGluZyBzZXRVcCBza2lwIHRoZSB0ZXN0IG5vdy4KKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnNraXBUZXN0KCJ0ZXN0aW5nIikKKyAgICAgICAgICAgIGRlZiB0ZXN0X25vdGhpbmcoc2VsZik6IHBhc3MKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3Rfbm90aGluZyIpCisgICAgICAgIHRlc3QucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsIFsnc3RhcnRUZXN0JywgJ2FkZFNraXAnLCAnc3RvcFRlc3QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0LCAidGVzdGluZyIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudGVzdHNSdW4sIDEpCisKKyAgICBkZWYgdGVzdF9za2lwcGluZ19kZWNvcmF0b3JzKHNlbGYpOgorICAgICAgICBvcF90YWJsZSA9ICgodW5pdHRlc3Quc2tpcFVubGVzcywgRmFsc2UsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAodW5pdHRlc3Quc2tpcElmLCBUcnVlLCBGYWxzZSkpCisgICAgICAgIGZvciBkZWNvLCBkb19za2lwLCBkb250X3NraXAgaW4gb3BfdGFibGU6CisgICAgICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgICAgIEBkZWNvKGRvX3NraXAsICJ0ZXN0aW5nIikKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9za2lwKHNlbGYpOiBwYXNzCisKKyAgICAgICAgICAgICAgICBAZGVjbyhkb250X3NraXAsICJ0ZXN0aW5nIikKKyAgICAgICAgICAgICAgICBkZWYgdGVzdF9kb250X3NraXAoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIHRlc3RfZG9fc2tpcCA9IEZvbygidGVzdF9za2lwIikKKyAgICAgICAgICAgIHRlc3RfZG9udF9za2lwID0gRm9vKCJ0ZXN0X2RvbnRfc2tpcCIpCisgICAgICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdF9kb19za2lwLCB0ZXN0X2RvbnRfc2tpcF0pCisgICAgICAgICAgICBldmVudHMgPSBbXQorICAgICAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisgICAgICAgICAgICBzdWl0ZS5ydW4ocmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocmVzdWx0LnNraXBwZWQpLCAxKQorICAgICAgICAgICAgZXhwZWN0ZWQgPSBbJ3N0YXJ0VGVzdCcsICdhZGRTa2lwJywgJ3N0b3BUZXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICdzdGFydFRlc3QnLCAnYWRkU3VjY2VzcycsICdzdG9wVGVzdCddCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNraXBwZWQsIFsodGVzdF9kb19za2lwLCAidGVzdGluZyIpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorCisgICAgZGVmIHRlc3Rfc2tpcF9jbGFzcyhzZWxmKToKKyAgICAgICAgQHVuaXR0ZXN0LnNraXAoInRlc3RpbmciKQorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICByZWNvcmQuYXBwZW5kKDEpCisgICAgICAgIHJlY29yZCA9IFtdCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB0ZXN0ID0gRm9vKCJ0ZXN0XzEiKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdF0pCisgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNraXBwZWQsIFsodGVzdCwgInRlc3RpbmciKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLCBbXSkKKworICAgIGRlZiB0ZXN0X3NraXBfbm9uX3VuaXR0ZXN0X2NsYXNzX29sZF9zdHlsZShzZWxmKToKKyAgICAgICAgQHVuaXR0ZXN0LnNraXAoInRlc3RpbmciKQorICAgICAgICBjbGFzcyBNaXhpbjoKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgICAgICAgICAgcmVjb3JkLmFwcGVuZCgxKQorICAgICAgICBjbGFzcyBGb28oTWl4aW4sIHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgcmVjb3JkID0gW10KKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3RfMSIpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0XSkKKyAgICAgICAgc3VpdGUucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0LCAidGVzdGluZyIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZWNvcmQsIFtdKQorCisgICAgZGVmIHRlc3Rfc2tpcF9ub25fdW5pdHRlc3RfY2xhc3NfbmV3X3N0eWxlKHNlbGYpOgorICAgICAgICBAdW5pdHRlc3Quc2tpcCgidGVzdGluZyIpCisgICAgICAgIGNsYXNzIE1peGluKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgdGVzdF8xKHNlbGYpOgorICAgICAgICAgICAgICAgIHJlY29yZC5hcHBlbmQoMSkKKyAgICAgICAgY2xhc3MgRm9vKE1peGluLCB1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHJlY29yZCA9IFtdCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB0ZXN0ID0gRm9vKCJ0ZXN0XzEiKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdF0pCisgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNraXBwZWQsIFsodGVzdCwgInRlc3RpbmciKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVjb3JkLCBbXSkKKworICAgIGRlZiB0ZXN0X2V4cGVjdGVkX2ZhaWx1cmUoc2VsZik6CisgICAgICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICBAdW5pdHRlc3QuZXhwZWN0ZWRGYWlsdXJlCisgICAgICAgICAgICBkZWYgdGVzdF9kaWUoc2VsZik6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJoZWxwIG1lISIpCisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorICAgICAgICB0ZXN0ID0gRm9vKCJ0ZXN0X2RpZSIpCisgICAgICAgIHRlc3QucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgWydzdGFydFRlc3QnLCAnYWRkRXhwZWN0ZWRGYWlsdXJlJywgJ3N0b3BUZXN0J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmV4cGVjdGVkRmFpbHVyZXNbMF1bMF0sIHRlc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQud2FzU3VjY2Vzc2Z1bCgpKQorCisgICAgZGVmIHRlc3RfdW5leHBlY3RlZF9zdWNjZXNzKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgQHVuaXR0ZXN0LmV4cGVjdGVkRmFpbHVyZQorICAgICAgICAgICAgZGVmIHRlc3RfZGllKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXZlbnRzID0gW10KKyAgICAgICAgcmVzdWx0ID0gTG9nZ2luZ1Jlc3VsdChldmVudHMpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3RfZGllIikKKyAgICAgICAgdGVzdC5ydW4ocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBbJ3N0YXJ0VGVzdCcsICdhZGRVbmV4cGVjdGVkU3VjY2VzcycsICdzdG9wVGVzdCddKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJlc3VsdC5mYWlsdXJlcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudW5leHBlY3RlZFN1Y2Nlc3NlcywgW3Rlc3RdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkKKworICAgIGRlZiB0ZXN0X3NraXBfZG9lc250X3J1bl9zZXR1cChzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIHdhc1NldFVwID0gRmFsc2UKKyAgICAgICAgICAgIHdhc1Rvcm5Eb3duID0gRmFsc2UKKyAgICAgICAgICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgICAgICAgICBGb28ud2FzU2V0VXAgPSBUcnVlCisgICAgICAgICAgICBkZWYgdG9ybkRvd24oc2VsZik6CisgICAgICAgICAgICAgICAgRm9vLndhc1Rvcm5Eb3duID0gVHJ1ZQorICAgICAgICAgICAgQHVuaXR0ZXN0LnNraXAoJ3Rlc3RpbmcnKQorICAgICAgICAgICAgZGVmIHRlc3RfMShzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHRlc3QgPSBGb28oInRlc3RfMSIpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt0ZXN0XSkKKyAgICAgICAgc3VpdGUucnVuKHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuc2tpcHBlZCwgWyh0ZXN0LCAidGVzdGluZyIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShGb28ud2FzU2V0VXApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRm9vLndhc1Rvcm5Eb3duKQorCisgICAgZGVmIHRlc3RfZGVjb3JhdGVkX3NraXAoc2VsZik6CisgICAgICAgIGRlZiBkZWNvcmF0b3IoZnVuYyk6CisgICAgICAgICAgICBkZWYgaW5uZXIoKmEpOgorICAgICAgICAgICAgICAgIHJldHVybiBmdW5jKCphKQorICAgICAgICAgICAgcmV0dXJuIGlubmVyCisKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIEBkZWNvcmF0b3IKKyAgICAgICAgICAgIEB1bml0dGVzdC5za2lwKCd0ZXN0aW5nJykKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHJlc3VsdCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICB0ZXN0ID0gRm9vKCJ0ZXN0XzEiKQorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbdGVzdF0pCisgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LnNraXBwZWQsIFsodGVzdCwgInRlc3RpbmciKV0pCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5YyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE4ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5byBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3NraXBwaW5nLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmE4ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc2tpcHBpbmcucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3N1aXRlLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc3VpdGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmYjUyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdW5pdHRlc3QvdGVzdC90ZXN0X3N1aXRlLnB5CkBAIC0wLDAgKzEsMzY3IEBACitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IHN5cworZnJvbSAuc3VwcG9ydCBpbXBvcnQgTG9nZ2luZ1Jlc3VsdCwgVGVzdEVxdWFsaXR5CisKKworIyMjIFN1cHBvcnQgY29kZSBmb3IgVGVzdF9UZXN0U3VpdGUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworY2xhc3MgVGVzdChvYmplY3QpOgorICAgIGNsYXNzIEZvbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgZGVmIHRlc3RfMihzZWxmKTogcGFzcworICAgICAgICBkZWYgdGVzdF8zKHNlbGYpOiBwYXNzCisgICAgICAgIGRlZiBydW5UZXN0KHNlbGYpOiBwYXNzCisKK2RlZiBfbWtfVGVzdFN1aXRlKCpuYW1lcyk6CisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZShUZXN0LkZvbyhuKSBmb3IgbiBpbiBuYW1lcykKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKK2NsYXNzIFRlc3RfVGVzdFN1aXRlKHVuaXR0ZXN0LlRlc3RDYXNlLCBUZXN0RXF1YWxpdHkpOgorCisgICAgIyMjIFNldCB1cCBhdHRyaWJ1dGVzIG5lZWRlZCBieSBpbmhlcml0ZWQgdGVzdHMKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICAjIFVzZWQgYnkgVGVzdEVxdWFsaXR5LnRlc3RfZXEKKyAgICBlcV9wYWlycyA9IFsodW5pdHRlc3QuVGVzdFN1aXRlKCksIHVuaXR0ZXN0LlRlc3RTdWl0ZSgpKSwKKyAgICAgICAgICAgICAgICAodW5pdHRlc3QuVGVzdFN1aXRlKCksIHVuaXR0ZXN0LlRlc3RTdWl0ZShbXSkpLAorICAgICAgICAgICAgICAgKF9ta19UZXN0U3VpdGUoJ3Rlc3RfMScpLCBfbWtfVGVzdFN1aXRlKCd0ZXN0XzEnKSldCisKKyAgICAjIFVzZWQgYnkgVGVzdEVxdWFsaXR5LnRlc3RfbmUKKyAgICBuZV9wYWlycyA9IFsodW5pdHRlc3QuVGVzdFN1aXRlKCksIF9ta19UZXN0U3VpdGUoJ3Rlc3RfMScpKSwKKyAgICAgICAgICAgICAgICAodW5pdHRlc3QuVGVzdFN1aXRlKFtdKSwgX21rX1Rlc3RTdWl0ZSgndGVzdF8xJykpLAorICAgICAgICAgICAgICAgIChfbWtfVGVzdFN1aXRlKCd0ZXN0XzEnLCAndGVzdF8yJyksIF9ta19UZXN0U3VpdGUoJ3Rlc3RfMScsICd0ZXN0XzMnKSksCisgICAgICAgICAgICAgICAgKF9ta19UZXN0U3VpdGUoJ3Rlc3RfMScpLCBfbWtfVGVzdFN1aXRlKCd0ZXN0XzInKSldCisKKyAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisgICAgIyMjIC9TZXQgdXAgYXR0cmlidXRlcyBuZWVkZWQgYnkgaW5oZXJpdGVkIHRlc3RzCisKKyAgICAjIyMgVGVzdHMgZm9yIFRlc3RTdWl0ZS5fX2luaXRfXworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICAgICMgImNsYXNzIFRlc3RTdWl0ZShbdGVzdHNdKSIKKyAgICAjCisgICAgIyBUaGUgdGVzdHMgaXRlcmFibGUgc2hvdWxkIGJlIG9wdGlvbmFsCisgICAgZGVmIHRlc3RfaW5pdF9fdGVzdHNfb3B0aW9uYWwoc2VsZik6CisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLmNvdW50VGVzdENhc2VzKCksIDApCisKKyAgICAjICJjbGFzcyBUZXN0U3VpdGUoW3Rlc3RzXSkiCisgICAgIyAuLi4KKyAgICAjICJJZiB0ZXN0cyBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMKKyAgICAjIG9yIG90aGVyIHRlc3Qgc3VpdGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBzdWl0ZSBpbml0aWFsbHkiCisgICAgIworICAgICMgVGVzdFN1aXRlIHNob3VsZCBkZWFsIHdpdGggZW1wdHkgdGVzdHMgaXRlcmFibGVzIGJ5IGFsbG93aW5nIHRoZQorICAgICMgY3JlYXRpb24gb2YgYW4gZW1wdHkgc3VpdGUKKyAgICBkZWYgdGVzdF9pbml0X19lbXB0eV90ZXN0cyhzZWxmKToKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW10pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5jb3VudFRlc3RDYXNlcygpLCAwKQorCisgICAgIyAiY2xhc3MgVGVzdFN1aXRlKFt0ZXN0c10pIgorICAgICMgLi4uCisgICAgIyAiSWYgdGVzdHMgaXMgZ2l2ZW4sIGl0IG11c3QgYmUgYW4gaXRlcmFibGUgb2YgaW5kaXZpZHVhbCB0ZXN0IGNhc2VzCisgICAgIyBvciBvdGhlciB0ZXN0IHN1aXRlcyB0aGF0IHdpbGwgYmUgdXNlZCB0byBidWlsZCB0aGUgc3VpdGUgaW5pdGlhbGx5IgorICAgICMKKyAgICAjIFRlc3RTdWl0ZSBzaG91bGQgYWxsb3cgYW55IGl0ZXJhYmxlIHRvIHByb3ZpZGUgdGVzdHMKKyAgICBkZWYgdGVzdF9pbml0X190ZXN0c19mcm9tX2FueV9pdGVyYWJsZShzZWxmKToKKyAgICAgICAgZGVmIHRlc3RzKCk6CisgICAgICAgICAgICB5aWVsZCB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgICAgIHlpZWxkIHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorCisgICAgICAgIHN1aXRlXzEgPSB1bml0dGVzdC5UZXN0U3VpdGUodGVzdHMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZV8xLmNvdW50VGVzdENhc2VzKCksIDIpCisKKyAgICAgICAgc3VpdGVfMiA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShzdWl0ZV8xKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlXzIuY291bnRUZXN0Q2FzZXMoKSwgMikKKworICAgICAgICBzdWl0ZV8zID0gdW5pdHRlc3QuVGVzdFN1aXRlKHNldChzdWl0ZV8xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZV8zLmNvdW50VGVzdENhc2VzKCksIDIpCisKKyAgICAjICJjbGFzcyBUZXN0U3VpdGUoW3Rlc3RzXSkiCisgICAgIyAuLi4KKyAgICAjICJJZiB0ZXN0cyBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMKKyAgICAjIG9yIG90aGVyIHRlc3Qgc3VpdGVzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBzdWl0ZSBpbml0aWFsbHkiCisgICAgIworICAgICMgRG9lcyBUZXN0U3VpdGUoKSBhbHNvIGFsbG93IG90aGVyIFRlc3RTdWl0ZSgpIGluc3RhbmNlcyB0byBiZSBwcmVzZW50CisgICAgIyBpbiB0aGUgdGVzdHMgaXRlcmFibGU/CisgICAgZGVmIHRlc3RfaW5pdF9fVGVzdFN1aXRlX2luc3RhbmNlc19pbl90ZXN0cyhzZWxmKToKKyAgICAgICAgZGVmIHRlc3RzKCk6CisgICAgICAgICAgICBmdGMgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgICAgIHlpZWxkIHVuaXR0ZXN0LlRlc3RTdWl0ZShbZnRjXSkKKyAgICAgICAgICAgIHlpZWxkIHVuaXR0ZXN0LkZ1bmN0aW9uVGVzdENhc2UobGFtYmRhOiBOb25lKQorCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKHRlc3RzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMikKKworICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyAgICAjIyMgL1Rlc3RzIGZvciBUZXN0U3VpdGUuX19pbml0X18KKworICAgICMgQ29udGFpbmVyIHR5cGVzIHNob3VsZCBzdXBwb3J0IHRoZSBpdGVyIHByb3RvY29sCisgICAgZGVmIHRlc3RfaXRlcihzZWxmKToKKyAgICAgICAgdGVzdDEgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgdGVzdDIgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKHRlc3QxLCB0ZXN0MikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3Rlc3QxLCB0ZXN0Ml0pCisKKyAgICAjICJSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGUgdGhpcyB0ZXN0IG9iamVjdC4KKyAgICAjIC4uLnRoaXMgbWV0aG9kIGlzIGFsc28gaW1wbGVtZW50ZWQgYnkgdGhlIFRlc3RTdWl0ZSBjbGFzcywgd2hpY2ggY2FuCisgICAgIyByZXR1cm4gbGFyZ2VyIFtncmVhdGVyIHRoYW4gMV0gdmFsdWVzIgorICAgICMKKyAgICAjIFByZXN1bWFibHkgYW4gZW1wdHkgVGVzdFN1aXRlIHJldHVybnMgMD8KKyAgICBkZWYgdGVzdF9jb3VudFRlc3RDYXNlc196ZXJvX3NpbXBsZShzZWxmKToKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMCkKKworICAgICMgIlJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIHJlcHJlc2VudGVkIGJ5IHRoZSB0aGlzIHRlc3Qgb2JqZWN0LgorICAgICMgLi4udGhpcyBtZXRob2QgaXMgYWxzbyBpbXBsZW1lbnRlZCBieSB0aGUgVGVzdFN1aXRlIGNsYXNzLCB3aGljaCBjYW4KKyAgICAjIHJldHVybiBsYXJnZXIgW2dyZWF0ZXIgdGhhbiAxXSB2YWx1ZXMiCisgICAgIworICAgICMgUHJlc3VtYWJseSBhbiBlbXB0eSBUZXN0U3VpdGUgKGV2ZW4gaWYgaXQgY29udGFpbnMgb3RoZXIgZW1wdHkKKyAgICAjIFRlc3RTdWl0ZSBpbnN0YW5jZXMpIHJldHVybnMgMD8KKyAgICBkZWYgdGVzdF9jb3VudFRlc3RDYXNlc196ZXJvX25lc3RlZChzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdDEodW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKFt1bml0dGVzdC5UZXN0U3VpdGUoKV0pCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZS5jb3VudFRlc3RDYXNlcygpLCAwKQorCisgICAgIyAiUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgcmVwcmVzZW50ZWQgYnkgdGhlIHRoaXMgdGVzdCBvYmplY3QuCisgICAgIyAuLi50aGlzIG1ldGhvZCBpcyBhbHNvIGltcGxlbWVudGVkIGJ5IHRoZSBUZXN0U3VpdGUgY2xhc3MsIHdoaWNoIGNhbgorICAgICMgcmV0dXJuIGxhcmdlciBbZ3JlYXRlciB0aGFuIDFdIHZhbHVlcyIKKyAgICBkZWYgdGVzdF9jb3VudFRlc3RDYXNlc19zaW1wbGUoc2VsZik6CisgICAgICAgIHRlc3QxID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisgICAgICAgIHRlc3QyID0gdW5pdHRlc3QuRnVuY3Rpb25UZXN0Q2FzZShsYW1iZGE6IE5vbmUpCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCh0ZXN0MSwgdGVzdDIpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMikKKworICAgICMgIlJldHVybiB0aGUgbnVtYmVyIG9mIHRlc3RzIHJlcHJlc2VudGVkIGJ5IHRoZSB0aGlzIHRlc3Qgb2JqZWN0LgorICAgICMgLi4udGhpcyBtZXRob2QgaXMgYWxzbyBpbXBsZW1lbnRlZCBieSB0aGUgVGVzdFN1aXRlIGNsYXNzLCB3aGljaCBjYW4KKyAgICAjIHJldHVybiBsYXJnZXIgW2dyZWF0ZXIgdGhhbiAxXSB2YWx1ZXMiCisgICAgIworICAgICMgTWFrZSBzdXJlIHRoaXMgaG9sZHMgZm9yIG5lc3RlZCBUZXN0U3VpdGUgaW5zdGFuY2VzLCB0b28KKyAgICBkZWYgdGVzdF9jb3VudFRlc3RDYXNlc19uZXN0ZWQoc2VsZik6CisgICAgICAgIGNsYXNzIFRlc3QxKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0MShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3QyKHNlbGYpOiBwYXNzCisKKyAgICAgICAgdGVzdDIgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgdGVzdDMgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKGxhbWJkYTogTm9uZSkKKyAgICAgICAgY2hpbGQgPSB1bml0dGVzdC5UZXN0U3VpdGUoKFRlc3QxKCd0ZXN0MicpLCB0ZXN0MikpCisgICAgICAgIHBhcmVudCA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgodGVzdDMsIGNoaWxkLCBUZXN0MSgndGVzdDEnKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJlbnQuY291bnRUZXN0Q2FzZXMoKSwgNCkKKworICAgICMgIlJ1biB0aGUgdGVzdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VpdGUsIGNvbGxlY3RpbmcgdGhlIHJlc3VsdCBpbnRvCisgICAgIyB0aGUgdGVzdCByZXN1bHQgb2JqZWN0IHBhc3NlZCBhcyByZXN1bHQuIgorICAgICMKKyAgICAjIEFuZCBpZiB0aGVyZSBhcmUgbm8gdGVzdHM/IFdoYXQgdGhlbj8KKyAgICBkZWYgdGVzdF9ydW5fX2VtcHR5X3N1aXRlKHNlbGYpOgorICAgICAgICBldmVudHMgPSBbXQorICAgICAgICByZXN1bHQgPSBMb2dnaW5nUmVzdWx0KGV2ZW50cykKKworICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICAgICAgc3VpdGUucnVuKHJlc3VsdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgW10pCisKKyAgICAjICJOb3RlIHRoYXQgdW5saWtlIFRlc3RDYXNlLnJ1bigpLCBUZXN0U3VpdGUucnVuKCkgcmVxdWlyZXMgdGhlCisgICAgIyAicmVzdWx0IG9iamVjdCB0byBiZSBwYXNzZWQgaW4uIgorICAgIGRlZiB0ZXN0X3J1bl9fcmVxdWlyZXNfcmVzdWx0KHNlbGYpOgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3VpdGUucnVuKCkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiRmFpbGVkIHRvIHJhaXNlIFR5cGVFcnJvciIpCisKKyAgICAjICJSdW4gdGhlIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1aXRlLCBjb2xsZWN0aW5nIHRoZSByZXN1bHQgaW50bworICAgICMgdGhlIHRlc3QgcmVzdWx0IG9iamVjdCBwYXNzZWQgYXMgcmVzdWx0LiIKKyAgICBkZWYgdGVzdF9ydW4oc2VsZik6CisgICAgICAgIGV2ZW50cyA9IFtdCisgICAgICAgIHJlc3VsdCA9IExvZ2dpbmdSZXN1bHQoZXZlbnRzKQorCisgICAgICAgIGNsYXNzIExvZ2dpbmdDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiBydW4oc2VsZiwgcmVzdWx0KToKKyAgICAgICAgICAgICAgICBldmVudHMuYXBwZW5kKCdydW4gJXMnICUgc2VsZi5fdGVzdE1ldGhvZE5hbWUpCisKKyAgICAgICAgICAgIGRlZiB0ZXN0MShzZWxmKTogcGFzcworICAgICAgICAgICAgZGVmIHRlc3QyKHNlbGYpOiBwYXNzCisKKyAgICAgICAgdGVzdHMgPSBbTG9nZ2luZ0Nhc2UoJ3Rlc3QxJyksIExvZ2dpbmdDYXNlKCd0ZXN0MicpXQorCisgICAgICAgIHVuaXR0ZXN0LlRlc3RTdWl0ZSh0ZXN0cykucnVuKHJlc3VsdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2ZW50cywgWydydW4gdGVzdDEnLCAncnVuIHRlc3QyJ10pCisKKyAgICAjICJBZGQgYSBUZXN0Q2FzZSAuLi4gdG8gdGhlIHN1aXRlIgorICAgIGRlZiB0ZXN0X2FkZFRlc3RfX1Rlc3RDYXNlKHNlbGYpOgorICAgICAgICBjbGFzcyBGb28odW5pdHRlc3QuVGVzdENhc2UpOgorICAgICAgICAgICAgZGVmIHRlc3Qoc2VsZik6IHBhc3MKKworICAgICAgICB0ZXN0ID0gRm9vKCd0ZXN0JykKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorCisgICAgICAgIHN1aXRlLmFkZFRlc3QodGVzdCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLmNvdW50VGVzdENhc2VzKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChzdWl0ZSksIFt0ZXN0XSkKKworICAgICMgIkFkZCBhIC4uLiBUZXN0U3VpdGUgdG8gdGhlIHN1aXRlIgorICAgIGRlZiB0ZXN0X2FkZFRlc3RfX1Rlc3RTdWl0ZShzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOiBwYXNzCisKKyAgICAgICAgc3VpdGVfMiA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShbRm9vKCd0ZXN0JyldKQorCisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICAgICAgc3VpdGUuYWRkVGVzdChzdWl0ZV8yKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VpdGUuY291bnRUZXN0Q2FzZXMoKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlKSwgW3N1aXRlXzJdKQorCisgICAgIyAiQWRkIGFsbCB0aGUgdGVzdHMgZnJvbSBhbiBpdGVyYWJsZSBvZiBUZXN0Q2FzZSBhbmQgVGVzdFN1aXRlCisgICAgIyBpbnN0YW5jZXMgdG8gdGhpcyB0ZXN0IHN1aXRlLiIKKyAgICAjCisgICAgIyAiVGhpcyBpcyBlcXVpdmFsZW50IHRvIGl0ZXJhdGluZyBvdmVyIHRlc3RzLCBjYWxsaW5nIGFkZFRlc3QoKSBmb3IKKyAgICAjIGVhY2ggZWxlbWVudCIKKyAgICBkZWYgdGVzdF9hZGRUZXN0cyhzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAgICAgICAgIGRlZiB0ZXN0XzEoc2VsZik6IHBhc3MKKyAgICAgICAgICAgIGRlZiB0ZXN0XzIoc2VsZik6IHBhc3MKKworICAgICAgICB0ZXN0XzEgPSBGb28oJ3Rlc3RfMScpCisgICAgICAgIHRlc3RfMiA9IEZvbygndGVzdF8yJykKKyAgICAgICAgaW5uZXJfc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoW3Rlc3RfMl0pCisKKyAgICAgICAgZGVmIGdlbigpOgorICAgICAgICAgICAgeWllbGQgdGVzdF8xCisgICAgICAgICAgICB5aWVsZCB0ZXN0XzIKKyAgICAgICAgICAgIHlpZWxkIGlubmVyX3N1aXRlCisKKyAgICAgICAgc3VpdGVfMSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIHN1aXRlXzEuYWRkVGVzdHMoZ2VuKCkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHN1aXRlXzEpLCBsaXN0KGdlbigpKSkKKworICAgICAgICAjICJUaGlzIGlzIGVxdWl2YWxlbnQgdG8gaXRlcmF0aW5nIG92ZXIgdGVzdHMsIGNhbGxpbmcgYWRkVGVzdCgpIGZvcgorICAgICAgICAjIGVhY2ggZWxlbWVudCIKKyAgICAgICAgc3VpdGVfMiA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIGZvciB0IGluIGdlbigpOgorICAgICAgICAgICAgc3VpdGVfMi5hZGRUZXN0KHQpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWl0ZV8xLCBzdWl0ZV8yKQorCisgICAgIyAiQWRkIGFsbCB0aGUgdGVzdHMgZnJvbSBhbiBpdGVyYWJsZSBvZiBUZXN0Q2FzZSBhbmQgVGVzdFN1aXRlCisgICAgIyBpbnN0YW5jZXMgdG8gdGhpcyB0ZXN0IHN1aXRlLiIKKyAgICAjCisgICAgIyBXaGF0IGhhcHBlbnMgaWYgaXQgZG9lc24ndCBnZXQgYW4gaXRlcmFibGU/CisgICAgZGVmIHRlc3RfYWRkVGVzdF9fbm9uaXRlcmFibGUoc2VsZik6CisgICAgICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzdWl0ZS5hZGRUZXN0cyg1KQorICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJGYWlsZWQgdG8gcmFpc2UgVHlwZUVycm9yIikKKworICAgIGRlZiB0ZXN0X2FkZFRlc3RfX25vbmNhbGxhYmxlKHNlbGYpOgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VpdGUuYWRkVGVzdCwgNSkKKworICAgIGRlZiB0ZXN0X2FkZFRlc3RfX2Nhc2VzdWl0ZWNsYXNzKHNlbGYpOgorICAgICAgICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VpdGUuYWRkVGVzdCwgVGVzdF9UZXN0U3VpdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3VpdGUuYWRkVGVzdCwgdW5pdHRlc3QuVGVzdFN1aXRlKQorCisgICAgZGVmIHRlc3RfYWRkVGVzdHNfX3N0cmluZyhzZWxmKToKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN1aXRlLmFkZFRlc3RzLCAiZm9vIikKKworICAgIGRlZiB0ZXN0X2Z1bmN0aW9uX2luX3N1aXRlKHNlbGYpOgorICAgICAgICBkZWYgZihfKToKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICBzdWl0ZS5hZGRUZXN0KGYpCisKKyAgICAgICAgIyB3aGVuIHRoZSBidWcgaXMgZml4ZWQgdGhpcyBsaW5lIHdpbGwgbm90IGNyYXNoCisgICAgICAgIHN1aXRlLnJ1bih1bml0dGVzdC5UZXN0UmVzdWx0KCkpCisKKworCisgICAgZGVmIHRlc3RfYmFzZXRlc3RzdWl0ZShzZWxmKToKKyAgICAgICAgY2xhc3MgVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgICAgICAgICB3YXNTZXRVcCA9IEZhbHNlCisgICAgICAgICAgICB3YXNUb3JuRG93biA9IEZhbHNlCisgICAgICAgICAgICBAY2xhc3NtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgICAgICAgICAgICAgY2xzLndhc1NldFVwID0gVHJ1ZQorICAgICAgICAgICAgQGNsYXNzbWV0aG9kCisgICAgICAgICAgICBkZWYgdGVhckRvd25DbGFzcyhjbHMpOgorICAgICAgICAgICAgICAgIGNscy53YXNUb3JuRG93biA9IFRydWUKKyAgICAgICAgICAgIGRlZiB0ZXN0UGFzcyhzZWxmKToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkZWYgdGVzdEZhaWwoc2VsZik6CisgICAgICAgICAgICAgICAgZmFpbAorICAgICAgICBjbGFzcyBNb2R1bGUob2JqZWN0KToKKyAgICAgICAgICAgIHdhc1NldFVwID0gRmFsc2UKKyAgICAgICAgICAgIHdhc1Rvcm5Eb3duID0gRmFsc2UKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiBzZXRVcE1vZHVsZSgpOgorICAgICAgICAgICAgICAgIE1vZHVsZS53YXNTZXRVcCA9IFRydWUKKyAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKKyAgICAgICAgICAgIGRlZiB0ZWFyRG93bk1vZHVsZSgpOgorICAgICAgICAgICAgICAgIE1vZHVsZS53YXNUb3JuRG93biA9IFRydWUKKworICAgICAgICBUZXN0Ll9fbW9kdWxlX18gPSAnTW9kdWxlJworICAgICAgICBzeXMubW9kdWxlc1snTW9kdWxlJ10gPSBNb2R1bGUKKyAgICAgICAgc2VsZi5hZGRDbGVhbnVwKHN5cy5tb2R1bGVzLnBvcCwgJ01vZHVsZScpCisKKyAgICAgICAgc3VpdGUgPSB1bml0dGVzdC5CYXNlVGVzdFN1aXRlKCkKKyAgICAgICAgc3VpdGUuYWRkVGVzdHMoW1Rlc3QoJ3Rlc3RQYXNzJyksIFRlc3QoJ3Rlc3RGYWlsJyldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1aXRlLmNvdW50VGVzdENhc2VzKCksIDIpCisKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHN1aXRlLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoTW9kdWxlLndhc1NldFVwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKE1vZHVsZS53YXNUb3JuRG93bikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShUZXN0Lndhc1NldFVwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFRlc3Qud2FzVG9ybkRvd24pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5lcnJvcnMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuZmFpbHVyZXMpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC50ZXN0c1J1biwgMikKKworCisgICAgZGVmIHRlc3Rfb3ZlcnJpZGluZ19jYWxsKHNlbGYpOgorICAgICAgICBjbGFzcyBNeVN1aXRlKHVuaXR0ZXN0LlRlc3RTdWl0ZSk6CisgICAgICAgICAgICBjYWxsZWQgPSBGYWxzZQorICAgICAgICAgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZCA9IFRydWUKKyAgICAgICAgICAgICAgICB1bml0dGVzdC5UZXN0U3VpdGUuX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3cpCisKKyAgICAgICAgc3VpdGUgPSBNeVN1aXRlKCkKKyAgICAgICAgcmVzdWx0ID0gdW5pdHRlc3QuVGVzdFJlc3VsdCgpCisgICAgICAgIHdyYXBwZXIgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgICAgICB3cmFwcGVyLmFkZFRlc3Qoc3VpdGUpCisgICAgICAgIHdyYXBwZXIocmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VpdGUuY2FsbGVkKQorCisgICAgICAgICMgcmV1c2luZyByZXN1bHRzIHNob3VsZCBiZSBwZXJtaXR0ZWQgZXZlbiBpZiBhYm9taW5hYmxlCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0Ll90ZXN0UnVuRW50ZXJlZCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc3VpdGUucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc3VpdGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjJmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zdWl0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc3VpdGUucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC90ZXN0L3Rlc3Rfc3VpdGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjJmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3Rlc3QvdGVzdF9zdWl0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91bml0dGVzdC91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGEwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHkKQEAgLTAsMCArMSwxNTYgQEAKKyIiIlZhcmlvdXMgdXRpbGl0eSBmdW5jdGlvbnMuIiIiCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlLCBPcmRlcmVkRGljdAorCisKK19fdW5pdHRlc3QgPSBUcnVlCisKK19NQVhfTEVOR1RIID0gODAKK2RlZiBzYWZlX3JlcHIob2JqLCBzaG9ydD1GYWxzZSk6CisgICAgdHJ5OgorICAgICAgICByZXN1bHQgPSByZXByKG9iaikKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICByZXN1bHQgPSBvYmplY3QuX19yZXByX18ob2JqKQorICAgIGlmIG5vdCBzaG9ydCBvciBsZW4ocmVzdWx0KSA8IF9NQVhfTEVOR1RIOgorICAgICAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIHJlc3VsdFs6X01BWF9MRU5HVEhdICsgJyBbdHJ1bmNhdGVkXS4uLicKKworCitkZWYgc3RyY2xhc3MoY2xzKToKKyAgICByZXR1cm4gIiVzLiVzIiAlIChjbHMuX19tb2R1bGVfXywgY2xzLl9fbmFtZV9fKQorCitkZWYgc29ydGVkX2xpc3RfZGlmZmVyZW5jZShleHBlY3RlZCwgYWN0dWFsKToKKyAgICAiIiJGaW5kcyBlbGVtZW50cyBpbiBvbmx5IG9uZSBvciB0aGUgb3RoZXIgb2YgdHdvLCBzb3J0ZWQgaW5wdXQgbGlzdHMuCisKKyAgICBSZXR1cm5zIGEgdHdvLWVsZW1lbnQgdHVwbGUgb2YgbGlzdHMuICAgIFRoZSBmaXJzdCBsaXN0IGNvbnRhaW5zIHRob3NlCisgICAgZWxlbWVudHMgaW4gdGhlICJleHBlY3RlZCIgbGlzdCBidXQgbm90IGluIHRoZSAiYWN0dWFsIiBsaXN0LCBhbmQgdGhlCisgICAgc2Vjb25kIGNvbnRhaW5zIHRob3NlIGVsZW1lbnRzIGluIHRoZSAiYWN0dWFsIiBsaXN0IGJ1dCBub3QgaW4gdGhlCisgICAgImV4cGVjdGVkIiBsaXN0LiAgICBEdXBsaWNhdGUgZWxlbWVudHMgaW4gZWl0aGVyIGlucHV0IGxpc3QgYXJlIGlnbm9yZWQuCisgICAgIiIiCisgICAgaSA9IGogPSAwCisgICAgbWlzc2luZyA9IFtdCisgICAgdW5leHBlY3RlZCA9IFtdCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZSA9IGV4cGVjdGVkW2ldCisgICAgICAgICAgICBhID0gYWN0dWFsW2pdCisgICAgICAgICAgICBpZiBlIDwgYToKKyAgICAgICAgICAgICAgICBtaXNzaW5nLmFwcGVuZChlKQorICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgICAgIHdoaWxlIGV4cGVjdGVkW2ldID09IGU6CisgICAgICAgICAgICAgICAgICAgIGkgKz0gMQorICAgICAgICAgICAgZWxpZiBlID4gYToKKyAgICAgICAgICAgICAgICB1bmV4cGVjdGVkLmFwcGVuZChhKQorICAgICAgICAgICAgICAgIGogKz0gMQorICAgICAgICAgICAgICAgIHdoaWxlIGFjdHVhbFtqXSA9PSBhOgorICAgICAgICAgICAgICAgICAgICBqICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBleHBlY3RlZFtpXSA9PSBlOgorICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAxCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgaiArPSAxCisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGFjdHVhbFtqXSA9PSBhOgorICAgICAgICAgICAgICAgICAgICAgICAgaiArPSAxCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgbWlzc2luZy5leHRlbmQoZXhwZWN0ZWRbaTpdKQorICAgICAgICAgICAgdW5leHBlY3RlZC5leHRlbmQoYWN0dWFsW2o6XSkKKyAgICAgICAgICAgIGJyZWFrCisgICAgcmV0dXJuIG1pc3NpbmcsIHVuZXhwZWN0ZWQKKworCitkZWYgdW5vcmRlcmFibGVfbGlzdF9kaWZmZXJlbmNlKGV4cGVjdGVkLCBhY3R1YWwsIGlnbm9yZV9kdXBsaWNhdGU9RmFsc2UpOgorICAgICIiIlNhbWUgYmVoYXZpb3IgYXMgc29ydGVkX2xpc3RfZGlmZmVyZW5jZSBidXQKKyAgICBmb3IgbGlzdHMgb2YgdW5vcmRlcmFibGUgaXRlbXMgKGxpa2UgZGljdHMpLgorCisgICAgQXMgaXQgZG9lcyBhIGxpbmVhciBzZWFyY2ggcGVyIGl0ZW0gKHJlbW92ZSkgaXQKKyAgICBoYXMgTyhuKm4pIHBlcmZvcm1hbmNlLgorICAgICIiIgorICAgIG1pc3NpbmcgPSBbXQorICAgIHVuZXhwZWN0ZWQgPSBbXQorICAgIHdoaWxlIGV4cGVjdGVkOgorICAgICAgICBpdGVtID0gZXhwZWN0ZWQucG9wKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYWN0dWFsLnJlbW92ZShpdGVtKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIG1pc3NpbmcuYXBwZW5kKGl0ZW0pCisgICAgICAgIGlmIGlnbm9yZV9kdXBsaWNhdGU6CisgICAgICAgICAgICBmb3IgbHN0IGluIGV4cGVjdGVkLCBhY3R1YWw6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICAgICAgbHN0LnJlbW92ZShpdGVtKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgaWYgaWdub3JlX2R1cGxpY2F0ZToKKyAgICAgICAgd2hpbGUgYWN0dWFsOgorICAgICAgICAgICAgaXRlbSA9IGFjdHVhbC5wb3AoKQorICAgICAgICAgICAgdW5leHBlY3RlZC5hcHBlbmQoaXRlbSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgICAgICAgICBhY3R1YWwucmVtb3ZlKGl0ZW0pCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHJldHVybiBtaXNzaW5nLCB1bmV4cGVjdGVkCisKKyAgICAjIGFueXRoaW5nIGxlZnQgaW4gYWN0dWFsIGlzIHVuZXhwZWN0ZWQKKyAgICByZXR1cm4gbWlzc2luZywgYWN0dWFsCisKK19NaXNtYXRjaCA9IG5hbWVkdHVwbGUoJ01pc21hdGNoJywgJ2FjdHVhbCBleHBlY3RlZCB2YWx1ZScpCisKK2RlZiBfY291bnRfZGlmZl9hbGxfcHVycG9zZShhY3R1YWwsIGV4cGVjdGVkKToKKyAgICAnUmV0dXJucyBsaXN0IG9mIChjbnRfYWN0LCBjbnRfZXhwLCBlbGVtKSB0cmlwbGVzIHdoZXJlIHRoZSBjb3VudHMgZGlmZmVyJworICAgICMgZWxlbWVudHMgbmVlZCBub3QgYmUgaGFzaGFibGUKKyAgICBzLCB0ID0gbGlzdChhY3R1YWwpLCBsaXN0KGV4cGVjdGVkKQorICAgIG0sIG4gPSBsZW4ocyksIGxlbih0KQorICAgIE5VTEwgPSBvYmplY3QoKQorICAgIHJlc3VsdCA9IFtdCisgICAgZm9yIGksIGVsZW0gaW4gZW51bWVyYXRlKHMpOgorICAgICAgICBpZiBlbGVtIGlzIE5VTEw6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjbnRfcyA9IGNudF90ID0gMAorICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBtKToKKyAgICAgICAgICAgIGlmIHNbal0gPT0gZWxlbToKKyAgICAgICAgICAgICAgICBjbnRfcyArPSAxCisgICAgICAgICAgICAgICAgc1tqXSA9IE5VTEwKKyAgICAgICAgZm9yIGosIG90aGVyX2VsZW0gaW4gZW51bWVyYXRlKHQpOgorICAgICAgICAgICAgaWYgb3RoZXJfZWxlbSA9PSBlbGVtOgorICAgICAgICAgICAgICAgIGNudF90ICs9IDEKKyAgICAgICAgICAgICAgICB0W2pdID0gTlVMTAorICAgICAgICBpZiBjbnRfcyAhPSBjbnRfdDoKKyAgICAgICAgICAgIGRpZmYgPSBfTWlzbWF0Y2goY250X3MsIGNudF90LCBlbGVtKQorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChkaWZmKQorCisgICAgZm9yIGksIGVsZW0gaW4gZW51bWVyYXRlKHQpOgorICAgICAgICBpZiBlbGVtIGlzIE5VTEw6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBjbnRfdCA9IDAKKyAgICAgICAgZm9yIGogaW4gcmFuZ2UoaSwgbik6CisgICAgICAgICAgICBpZiB0W2pdID09IGVsZW06CisgICAgICAgICAgICAgICAgY250X3QgKz0gMQorICAgICAgICAgICAgICAgIHRbal0gPSBOVUxMCisgICAgICAgIGRpZmYgPSBfTWlzbWF0Y2goMCwgY250X3QsIGVsZW0pCisgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlmZikKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfb3JkZXJlZF9jb3VudChpdGVyYWJsZSk6CisgICAgJ1JldHVybiBkaWN0IG9mIGVsZW1lbnQgY291bnRzLCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGZpcnN0IHNlZW4nCisgICAgYyA9IE9yZGVyZWREaWN0KCkKKyAgICBmb3IgZWxlbSBpbiBpdGVyYWJsZToKKyAgICAgICAgY1tlbGVtXSA9IGMuZ2V0KGVsZW0sIDApICsgMQorICAgIHJldHVybiBjCisKK2RlZiBfY291bnRfZGlmZl9oYXNoYWJsZShhY3R1YWwsIGV4cGVjdGVkKToKKyAgICAnUmV0dXJucyBsaXN0IG9mIChjbnRfYWN0LCBjbnRfZXhwLCBlbGVtKSB0cmlwbGVzIHdoZXJlIHRoZSBjb3VudHMgZGlmZmVyJworICAgICMgZWxlbWVudHMgbXVzdCBiZSBoYXNoYWJsZQorICAgIHMsIHQgPSBfb3JkZXJlZF9jb3VudChhY3R1YWwpLCBfb3JkZXJlZF9jb3VudChleHBlY3RlZCkKKyAgICByZXN1bHQgPSBbXQorICAgIGZvciBlbGVtLCBjbnRfcyBpbiBzLml0ZW1zKCk6CisgICAgICAgIGNudF90ID0gdC5nZXQoZWxlbSwgMCkKKyAgICAgICAgaWYgY250X3MgIT0gY250X3Q6CisgICAgICAgICAgICBkaWZmID0gX01pc21hdGNoKGNudF9zLCBjbnRfdCwgZWxlbSkKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlmZikKKyAgICBmb3IgZWxlbSwgY250X3QgaW4gdC5pdGVtcygpOgorICAgICAgICBpZiBlbGVtIG5vdCBpbiBzOgorICAgICAgICAgICAgZGlmZiA9IF9NaXNtYXRjaCgwLCBjbnRfdCwgZWxlbSkKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZGlmZikKKyAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHljIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFkZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC91dGlsLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VuaXR0ZXN0L3V0aWwucHlvIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGFkZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91bml0dGVzdC91dGlsLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VybGxpYi5weSBiL2xpYi9weXRob24yLjcvdXJsbGliLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NjU1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VybGxpYi5weQpAQCAtMCwwICsxLDE2MTYgQEAKKyIiIk9wZW4gYW4gYXJiaXRyYXJ5IFVSTC4KKworU2VlIHRoZSBmb2xsb3dpbmcgZG9jdW1lbnQgZm9yIG1vcmUgaW5mbyBvbiBVUkxzOgorIk5hbWVzIGFuZCBBZGRyZXNzZXMsIFVSSXMsIFVSTHMsIFVSTnMsIFVSQ3MiLCBhdAoraHR0cDovL3d3dy53My5vcmcvcHViL1dXVy9BZGRyZXNzaW5nL092ZXJ2aWV3Lmh0bWwKKworU2VlIGFsc28gdGhlIEhUVFAgc3BlYyAoZnJvbSB3aGljaCB0aGUgZXJyb3IgY29kZXMgYXJlIGRlcml2ZWQpOgorIkhUVFAgLSBIeXBlcnRleHQgVHJhbnNmZXIgUHJvdG9jb2wiLCBhdAoraHR0cDovL3d3dy53My5vcmcvcHViL1dXVy9Qcm90b2NvbHMvCisKK1JlbGF0ZWQgc3RhbmRhcmRzIGFuZCBzcGVjczoKKy0gUkZDMTgwODogdGhlICJyZWxhdGl2ZSBVUkwiIHNwZWMuIChhdXRob3JpdGF0aXZlIHN0YXR1cykKKy0gUkZDMTczOCAtIHRoZSAiVVJMIHN0YW5kYXJkIi4gKGF1dGhvcml0YXRpdmUgc3RhdHVzKQorLSBSRkMxNjMwIC0gdGhlICJVUkkgc3BlYyIuIChpbmZvcm1hdGlvbmFsIHN0YXR1cykKKworVGhlIG9iamVjdCByZXR1cm5lZCBieSBVUkxvcGVuZXIoKS5vcGVuKGZpbGUpIHdpbGwgZGlmZmVyIHBlcgorcHJvdG9jb2wuICBBbGwgeW91IGtub3cgaXMgdGhhdCBpcyBoYXMgbWV0aG9kcyByZWFkKCksIHJlYWRsaW5lKCksCityZWFkbGluZXMoKSwgZmlsZW5vKCksIGNsb3NlKCkgYW5kIGluZm8oKS4gIFRoZSByZWFkKigpLCBmaWxlbm8oKQorYW5kIGNsb3NlKCkgbWV0aG9kcyB3b3JrIGxpa2UgdGhvc2Ugb2Ygb3BlbiBmaWxlcy4KK1RoZSBpbmZvKCkgbWV0aG9kIHJldHVybnMgYSBtaW1ldG9vbHMuTWVzc2FnZSBvYmplY3Qgd2hpY2ggY2FuIGJlCit1c2VkIHRvIHF1ZXJ5IHZhcmlvdXMgaW5mbyBhYm91dCB0aGUgb2JqZWN0LCBpZiBhdmFpbGFibGUuCisobWltZXRvb2xzLk1lc3NhZ2Ugb2JqZWN0cyBhcmUgcXVlcmllZCB3aXRoIHRoZSBnZXRoZWFkZXIoKSBtZXRob2QuKQorIiIiCisKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBvcworaW1wb3J0IHRpbWUKK2ltcG9ydCBzeXMKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCByZQorCitmcm9tIHVybHBhcnNlIGltcG9ydCB1cmxqb2luIGFzIGJhc2Vqb2luCisKK19fYWxsX18gPSBbInVybG9wZW4iLCAiVVJMb3BlbmVyIiwgIkZhbmN5VVJMb3BlbmVyIiwgInVybHJldHJpZXZlIiwKKyAgICAgICAgICAgInVybGNsZWFudXAiLCAicXVvdGUiLCAicXVvdGVfcGx1cyIsICJ1bnF1b3RlIiwgInVucXVvdGVfcGx1cyIsCisgICAgICAgICAgICJ1cmxlbmNvZGUiLCAidXJsMnBhdGhuYW1lIiwgInBhdGhuYW1lMnVybCIsICJzcGxpdHRhZyIsCisgICAgICAgICAgICJsb2NhbGhvc3QiLCAidGhpc2hvc3QiLCAiZnRwZXJyb3JzIiwgImJhc2Vqb2luIiwgInVud3JhcCIsCisgICAgICAgICAgICJzcGxpdHR5cGUiLCAic3BsaXRob3N0IiwgInNwbGl0dXNlciIsICJzcGxpdHBhc3N3ZCIsICJzcGxpdHBvcnQiLAorICAgICAgICAgICAic3BsaXRucG9ydCIsICJzcGxpdHF1ZXJ5IiwgInNwbGl0YXR0ciIsICJzcGxpdHZhbHVlIiwKKyAgICAgICAgICAgImdldHByb3hpZXMiXQorCitfX3ZlcnNpb25fXyA9ICcxLjE3JyAgICAjIFhYWCBUaGlzIHZlcnNpb24gaXMgbm90IGFsd2F5cyB1cGRhdGVkIDotKAorCitNQVhGVFBDQUNIRSA9IDEwICAgICAgICAjIFRyaW0gdGhlIGZ0cCBjYWNoZSBiZXlvbmQgdGhpcyBzaXplCisKKyMgSGVscGVyIGZvciBub24tdW5peCBzeXN0ZW1zCitpZiBvcy5uYW1lID09ICdudCc6CisgICAgZnJvbSBudHVybDJwYXRoIGltcG9ydCB1cmwycGF0aG5hbWUsIHBhdGhuYW1lMnVybAorZWxpZiBvcy5uYW1lID09ICdyaXNjb3MnOgorICAgIGZyb20gcm91cmwycGF0aCBpbXBvcnQgdXJsMnBhdGhuYW1lLCBwYXRobmFtZTJ1cmwKK2Vsc2U6CisgICAgZGVmIHVybDJwYXRobmFtZShwYXRobmFtZSk6CisgICAgICAgICIiIk9TLXNwZWNpZmljIGNvbnZlcnNpb24gZnJvbSBhIHJlbGF0aXZlIFVSTCBvZiB0aGUgJ2ZpbGUnIHNjaGVtZQorICAgICAgICB0byBhIGZpbGUgc3lzdGVtIHBhdGg7IG5vdCByZWNvbW1lbmRlZCBmb3IgZ2VuZXJhbCB1c2UuIiIiCisgICAgICAgIHJldHVybiB1bnF1b3RlKHBhdGhuYW1lKQorCisgICAgZGVmIHBhdGhuYW1lMnVybChwYXRobmFtZSk6CisgICAgICAgICIiIk9TLXNwZWNpZmljIGNvbnZlcnNpb24gZnJvbSBhIGZpbGUgc3lzdGVtIHBhdGggdG8gYSByZWxhdGl2ZSBVUkwKKyAgICAgICAgb2YgdGhlICdmaWxlJyBzY2hlbWU7IG5vdCByZWNvbW1lbmRlZCBmb3IgZ2VuZXJhbCB1c2UuIiIiCisgICAgICAgIHJldHVybiBxdW90ZShwYXRobmFtZSkKKworIyBUaGlzIHJlYWxseSBjb25zaXN0cyBvZiB0d28gcGllY2VzOgorIyAoMSkgYSBjbGFzcyB3aGljaCBoYW5kbGVzIG9wZW5pbmcgb2YgYWxsIHNvcnRzIG9mIFVSTHMKKyMgICAgIChwbHVzIGFzc29ydGVkIHV0aWxpdGllcyBldGMuKQorIyAoMikgYSBzZXQgb2YgZnVuY3Rpb25zIGZvciBwYXJzaW5nIFVSTHMKKyMgWFhYIFNob3VsZCB0aGVzZSBiZSBzZXBhcmF0ZWQgb3V0IGludG8gZGlmZmVyZW50IG1vZHVsZXM/CisKKworIyBTaG9ydGN1dCBmb3IgYmFzaWMgdXNhZ2UKK191cmxvcGVuZXIgPSBOb25lCitkZWYgdXJsb3Blbih1cmwsIGRhdGE9Tm9uZSwgcHJveGllcz1Ob25lKToKKyAgICAiIiJDcmVhdGUgYSBmaWxlLWxpa2Ugb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIFVSTCB0byByZWFkIGZyb20uIiIiCisgICAgZnJvbSB3YXJuaW5ncyBpbXBvcnQgd2FybnB5M2sKKyAgICB3YXJucHkzaygidXJsbGliLnVybG9wZW4oKSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAgaW4gIgorICAgICAgICAgICAgICJmYXZvciBvZiB1cmxsaWIyLnVybG9wZW4oKSIsIHN0YWNrbGV2ZWw9MikKKworICAgIGdsb2JhbCBfdXJsb3BlbmVyCisgICAgaWYgcHJveGllcyBpcyBub3QgTm9uZToKKyAgICAgICAgb3BlbmVyID0gRmFuY3lVUkxvcGVuZXIocHJveGllcz1wcm94aWVzKQorICAgIGVsaWYgbm90IF91cmxvcGVuZXI6CisgICAgICAgIG9wZW5lciA9IEZhbmN5VVJMb3BlbmVyKCkKKyAgICAgICAgX3VybG9wZW5lciA9IG9wZW5lcgorICAgIGVsc2U6CisgICAgICAgIG9wZW5lciA9IF91cmxvcGVuZXIKKyAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBvcGVuZXIub3Blbih1cmwpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIG9wZW5lci5vcGVuKHVybCwgZGF0YSkKK2RlZiB1cmxyZXRyaWV2ZSh1cmwsIGZpbGVuYW1lPU5vbmUsIHJlcG9ydGhvb2s9Tm9uZSwgZGF0YT1Ob25lKToKKyAgICBnbG9iYWwgX3VybG9wZW5lcgorICAgIGlmIG5vdCBfdXJsb3BlbmVyOgorICAgICAgICBfdXJsb3BlbmVyID0gRmFuY3lVUkxvcGVuZXIoKQorICAgIHJldHVybiBfdXJsb3BlbmVyLnJldHJpZXZlKHVybCwgZmlsZW5hbWUsIHJlcG9ydGhvb2ssIGRhdGEpCitkZWYgdXJsY2xlYW51cCgpOgorICAgIGlmIF91cmxvcGVuZXI6CisgICAgICAgIF91cmxvcGVuZXIuY2xlYW51cCgpCisgICAgX3NhZmVfcXVvdGVycy5jbGVhcigpCisgICAgZnRwY2FjaGUuY2xlYXIoKQorCisjIGNoZWNrIGZvciBTU0wKK3RyeToKKyAgICBpbXBvcnQgc3NsCitleGNlcHQ6CisgICAgX2hhdmVfc3NsID0gRmFsc2UKK2Vsc2U6CisgICAgX2hhdmVfc3NsID0gVHJ1ZQorCisjIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBkb3dubG9hZGVkIHNpemUgZG9lcyBub3QgbWF0Y2ggY29udGVudC1sZW5ndGgKK2NsYXNzIENvbnRlbnRUb29TaG9ydEVycm9yKElPRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlLCBjb250ZW50KToKKyAgICAgICAgSU9FcnJvci5fX2luaXRfXyhzZWxmLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmNvbnRlbnQgPSBjb250ZW50CisKK2Z0cGNhY2hlID0ge30KK2NsYXNzIFVSTG9wZW5lcjoKKyAgICAiIiJDbGFzcyB0byBvcGVuIFVSTHMuCisgICAgVGhpcyBpcyBhIGNsYXNzIHJhdGhlciB0aGFuIGp1c3QgYSBzdWJyb3V0aW5lIGJlY2F1c2Ugd2UgbWF5IG5lZWQKKyAgICBtb3JlIHRoYW4gb25lIHNldCBvZiBnbG9iYWwgcHJvdG9jb2wtc3BlY2lmaWMgb3B0aW9ucy4KKyAgICBOb3RlIC0tIHRoaXMgaXMgYSBiYXNlIGNsYXNzIGZvciB0aG9zZSB3aG8gZG9uJ3Qgd2FudCB0aGUKKyAgICBhdXRvbWF0aWMgaGFuZGxpbmcgb2YgZXJyb3JzIHR5cGUgMzAyIChyZWxvY2F0ZWQpIGFuZCA0MDEKKyAgICAoYXV0aG9yaXphdGlvbiBuZWVkZWQpLiIiIgorCisgICAgX190ZW1wZmlsZXMgPSBOb25lCisKKyAgICB2ZXJzaW9uID0gIlB5dGhvbi11cmxsaWIvJXMiICUgX192ZXJzaW9uX18KKworICAgICMgQ29uc3RydWN0b3IKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHJveGllcz1Ob25lLCAqKng1MDkpOgorICAgICAgICBpZiBwcm94aWVzIGlzIE5vbmU6CisgICAgICAgICAgICBwcm94aWVzID0gZ2V0cHJveGllcygpCisgICAgICAgIGFzc2VydCBoYXNhdHRyKHByb3hpZXMsICdoYXNfa2V5JyksICJwcm94aWVzIG11c3QgYmUgYSBtYXBwaW5nIgorICAgICAgICBzZWxmLnByb3hpZXMgPSBwcm94aWVzCisgICAgICAgIHNlbGYua2V5X2ZpbGUgPSB4NTA5LmdldCgna2V5X2ZpbGUnKQorICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IHg1MDkuZ2V0KCdjZXJ0X2ZpbGUnKQorICAgICAgICBzZWxmLmFkZGhlYWRlcnMgPSBbKCdVc2VyLUFnZW50Jywgc2VsZi52ZXJzaW9uKV0KKyAgICAgICAgc2VsZi5fX3RlbXBmaWxlcyA9IFtdCisgICAgICAgIHNlbGYuX191bmxpbmsgPSBvcy51bmxpbmsgIyBTZWUgY2xlYW51cCgpCisgICAgICAgIHNlbGYudGVtcGNhY2hlID0gTm9uZQorICAgICAgICAjIFVuZG9jdW1lbnRlZCBmZWF0dXJlOiBpZiB5b3UgYXNzaWduIHt9IHRvIHRlbXBjYWNoZSwKKyAgICAgICAgIyBpdCBpcyB1c2VkIHRvIGNhY2hlIGZpbGVzIHJldHJpZXZlZCB3aXRoCisgICAgICAgICMgc2VsZi5yZXRyaWV2ZSgpLiAgVGhpcyBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0CisgICAgICAgICMgc2luY2UgaXQgZG9lcyBub3Qgd29yayBmb3IgY2hhbmdpbmcgZG9jdW1lbnRzIChhbmQgSQorICAgICAgICAjIGhhdmVuJ3QgZ290IHRoZSBsb2dpYyB0byBjaGVjayBleHBpcmF0aW9uIGhlYWRlcnMKKyAgICAgICAgIyB5ZXQpLgorICAgICAgICBzZWxmLmZ0cGNhY2hlID0gZnRwY2FjaGUKKyAgICAgICAgIyBVbmRvY3VtZW50ZWQgZmVhdHVyZTogeW91IGNhbiB1c2UgYSBkaWZmZXJlbnQKKyAgICAgICAgIyBmdHAgY2FjaGUgYnkgYXNzaWduaW5nIHRvIHRoZSAuZnRwY2FjaGUgbWVtYmVyOworICAgICAgICAjIGluIGNhc2UgeW91IHdhbnQgbG9naWNhbGx5IGluZGVwZW5kZW50IFVSTCBvcGVuZXJzCisgICAgICAgICMgWFhYIFRoaXMgaXMgbm90IHRocmVhZHNhZmUuICBCYWguCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xlYW51cCgpCisKKyAgICBkZWYgY2xlYW51cChzZWxmKToKKyAgICAgICAgIyBUaGlzIGNvZGUgc29tZXRpbWVzIHJ1bnMgd2hlbiB0aGUgcmVzdCBvZiB0aGlzIG1vZHVsZQorICAgICAgICAjIGhhcyBhbHJlYWR5IGJlZW4gZGVsZXRlZCwgc28gaXQgY2FuJ3QgdXNlIGFueSBnbG9iYWxzCisgICAgICAgICMgb3IgaW1wb3J0IGFueXRoaW5nLgorICAgICAgICBpZiBzZWxmLl9fdGVtcGZpbGVzOgorICAgICAgICAgICAgZm9yIGZpbGUgaW4gc2VsZi5fX3RlbXBmaWxlczoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX191bmxpbmsoZmlsZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgT1NFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZGVsIHNlbGYuX190ZW1wZmlsZXNbOl0KKyAgICAgICAgaWYgc2VsZi50ZW1wY2FjaGU6CisgICAgICAgICAgICBzZWxmLnRlbXBjYWNoZS5jbGVhcigpCisKKyAgICBkZWYgYWRkaGVhZGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgIiIiQWRkIGEgaGVhZGVyIHRvIGJlIHVzZWQgYnkgdGhlIEhUVFAgaW50ZXJmYWNlIG9ubHkKKyAgICAgICAgZS5nLiB1LmFkZGhlYWRlcignQWNjZXB0JywgJ3NvdW5kL2Jhc2ljJykiIiIKKyAgICAgICAgc2VsZi5hZGRoZWFkZXJzLmFwcGVuZChhcmdzKQorCisgICAgIyBFeHRlcm5hbCBpbnRlcmZhY2UKKyAgICBkZWYgb3BlbihzZWxmLCBmdWxsdXJsLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJVc2UgVVJMb3BlbmVyKCkub3BlbihmaWxlKSBpbnN0ZWFkIG9mIG9wZW4oZmlsZSwgJ3InKS4iIiIKKyAgICAgICAgZnVsbHVybCA9IHVud3JhcCh0b0J5dGVzKGZ1bGx1cmwpKQorICAgICAgICAjIHBlcmNlbnQgZW5jb2RlIHVybCwgZml4aW5nIGxhbWUgc2VydmVyIGVycm9ycyBmb3IgZS5nLCBsaWtlIHNwYWNlCisgICAgICAgICMgd2l0aGluIHVybCBwYXRocy4KKyAgICAgICAgZnVsbHVybCA9IHF1b3RlKGZ1bGx1cmwsIHNhZmU9IiUvOj0mP34jKyEkLDsnQCgpKltdfCIpCisgICAgICAgIGlmIHNlbGYudGVtcGNhY2hlIGFuZCBmdWxsdXJsIGluIHNlbGYudGVtcGNhY2hlOgorICAgICAgICAgICAgZmlsZW5hbWUsIGhlYWRlcnMgPSBzZWxmLnRlbXBjYWNoZVtmdWxsdXJsXQorICAgICAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lLCAncmInKQorICAgICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwoZnAsIGhlYWRlcnMsIGZ1bGx1cmwpCisgICAgICAgIHVybHR5cGUsIHVybCA9IHNwbGl0dHlwZShmdWxsdXJsKQorICAgICAgICBpZiBub3QgdXJsdHlwZToKKyAgICAgICAgICAgIHVybHR5cGUgPSAnZmlsZScKKyAgICAgICAgaWYgdXJsdHlwZSBpbiBzZWxmLnByb3hpZXM6CisgICAgICAgICAgICBwcm94eSA9IHNlbGYucHJveGllc1t1cmx0eXBlXQorICAgICAgICAgICAgdXJsdHlwZSwgcHJveHlob3N0ID0gc3BsaXR0eXBlKHByb3h5KQorICAgICAgICAgICAgaG9zdCwgc2VsZWN0b3IgPSBzcGxpdGhvc3QocHJveHlob3N0KQorICAgICAgICAgICAgdXJsID0gKGhvc3QsIGZ1bGx1cmwpICMgU2lnbmFsIHNwZWNpYWwgY2FzZSB0byBvcGVuXyooKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcHJveHkgPSBOb25lCisgICAgICAgIG5hbWUgPSAnb3Blbl8nICsgdXJsdHlwZQorICAgICAgICBzZWxmLnR5cGUgPSB1cmx0eXBlCisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy0nLCAnXycpCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgaWYgcHJveHk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYub3Blbl91bmtub3duX3Byb3h5KHByb3h5LCBmdWxsdXJsLCBkYXRhKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX3Vua25vd24oZnVsbHVybCwgZGF0YSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBnZXRhdHRyKHNlbGYsIG5hbWUpKHVybCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgbmFtZSkodXJsLCBkYXRhKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBtc2c6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ3NvY2tldCBlcnJvcicsIG1zZyksIHN5cy5leGNfaW5mbygpWzJdCisKKyAgICBkZWYgb3Blbl91bmtub3duKHNlbGYsIGZ1bGx1cmwsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIk92ZXJyaWRhYmxlIGludGVyZmFjZSB0byBvcGVuIHVua25vd24gVVJMIHR5cGUuIiIiCisgICAgICAgIHR5cGUsIHVybCA9IHNwbGl0dHlwZShmdWxsdXJsKQorICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ3VybCBlcnJvcicsICd1bmtub3duIHVybCB0eXBlJywgdHlwZSkKKworICAgIGRlZiBvcGVuX3Vua25vd25fcHJveHkoc2VsZiwgcHJveHksIGZ1bGx1cmwsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIk92ZXJyaWRhYmxlIGludGVyZmFjZSB0byBvcGVuIHVua25vd24gVVJMIHR5cGUuIiIiCisgICAgICAgIHR5cGUsIHVybCA9IHNwbGl0dHlwZShmdWxsdXJsKQorICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ3VybCBlcnJvcicsICdpbnZhbGlkIHByb3h5IGZvciAlcycgJSB0eXBlLCBwcm94eSkKKworICAgICMgRXh0ZXJuYWwgaW50ZXJmYWNlCisgICAgZGVmIHJldHJpZXZlKHNlbGYsIHVybCwgZmlsZW5hbWU9Tm9uZSwgcmVwb3J0aG9vaz1Ob25lLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJyZXRyaWV2ZSh1cmwpIHJldHVybnMgKGZpbGVuYW1lLCBoZWFkZXJzKSBmb3IgYSBsb2NhbCBvYmplY3QKKyAgICAgICAgb3IgKHRlbXBmaWxlbmFtZSwgaGVhZGVycykgZm9yIGEgcmVtb3RlIG9iamVjdC4iIiIKKyAgICAgICAgdXJsID0gdW53cmFwKHRvQnl0ZXModXJsKSkKKyAgICAgICAgaWYgc2VsZi50ZW1wY2FjaGUgYW5kIHVybCBpbiBzZWxmLnRlbXBjYWNoZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRlbXBjYWNoZVt1cmxdCisgICAgICAgIHR5cGUsIHVybDEgPSBzcGxpdHR5cGUodXJsKQorICAgICAgICBpZiBmaWxlbmFtZSBpcyBOb25lIGFuZCAobm90IHR5cGUgb3IgdHlwZSA9PSAnZmlsZScpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gc2VsZi5vcGVuX2xvY2FsX2ZpbGUodXJsMSkKKyAgICAgICAgICAgICAgICBoZHJzID0gZnAuaW5mbygpCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgICAgIHJldHVybiB1cmwycGF0aG5hbWUoc3BsaXRob3N0KHVybDEpWzFdKSwgaGRycworICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmcCA9IHNlbGYub3Blbih1cmwsIGRhdGEpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhlYWRlcnMgPSBmcC5pbmZvKCkKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgICAgIHRmcCA9IG9wZW4oZmlsZW5hbWUsICd3YicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGltcG9ydCB0ZW1wZmlsZQorICAgICAgICAgICAgICAgIGdhcmJhZ2UsIHBhdGggPSBzcGxpdHR5cGUodXJsKQorICAgICAgICAgICAgICAgIGdhcmJhZ2UsIHBhdGggPSBzcGxpdGhvc3QocGF0aCBvciAiIikKKyAgICAgICAgICAgICAgICBwYXRoLCBnYXJiYWdlID0gc3BsaXRxdWVyeShwYXRoIG9yICIiKQorICAgICAgICAgICAgICAgIHBhdGgsIGdhcmJhZ2UgPSBzcGxpdGF0dHIocGF0aCBvciAiIikKKyAgICAgICAgICAgICAgICBzdWZmaXggPSBvcy5wYXRoLnNwbGl0ZXh0KHBhdGgpWzFdCisgICAgICAgICAgICAgICAgKGZkLCBmaWxlbmFtZSkgPSB0ZW1wZmlsZS5ta3N0ZW1wKHN1ZmZpeCkKKyAgICAgICAgICAgICAgICBzZWxmLl9fdGVtcGZpbGVzLmFwcGVuZChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICB0ZnAgPSBvcy5mZG9wZW4oZmQsICd3YicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmlsZW5hbWUsIGhlYWRlcnMKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnRlbXBjYWNoZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZW1wY2FjaGVbdXJsXSA9IHJlc3VsdAorICAgICAgICAgICAgICAgIGJzID0gMTAyNCo4CisgICAgICAgICAgICAgICAgc2l6ZSA9IC0xCisgICAgICAgICAgICAgICAgcmVhZCA9IDAKKyAgICAgICAgICAgICAgICBibG9ja251bSA9IDAKKyAgICAgICAgICAgICAgICBpZiAiY29udGVudC1sZW5ndGgiIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBpbnQoaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSkKKyAgICAgICAgICAgICAgICBpZiByZXBvcnRob29rOgorICAgICAgICAgICAgICAgICAgICByZXBvcnRob29rKGJsb2NrbnVtLCBicywgc2l6ZSkKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBibG9jayA9IGZwLnJlYWQoYnMpCisgICAgICAgICAgICAgICAgICAgIGlmIGJsb2NrID09ICIiOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgcmVhZCArPSBsZW4oYmxvY2spCisgICAgICAgICAgICAgICAgICAgIHRmcC53cml0ZShibG9jaykKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tudW0gKz0gMQorICAgICAgICAgICAgICAgICAgICBpZiByZXBvcnRob29rOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0aG9vayhibG9ja251bSwgYnMsIHNpemUpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHRmcC5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgIyByYWlzZSBleGNlcHRpb24gaWYgYWN0dWFsIHNpemUgZG9lcyBub3QgbWF0Y2ggY29udGVudC1sZW5ndGggaGVhZGVyCisgICAgICAgIGlmIHNpemUgPj0gMCBhbmQgcmVhZCA8IHNpemU6CisgICAgICAgICAgICByYWlzZSBDb250ZW50VG9vU2hvcnRFcnJvcigicmV0cmlldmFsIGluY29tcGxldGU6IGdvdCBvbmx5ICVpIG91dCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2YgJWkgYnl0ZXMiICUgKHJlYWQsIHNpemUpLCByZXN1bHQpCisKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgIyBFYWNoIG1ldGhvZCBuYW1lZCBvcGVuXzx0eXBlPiBrbm93cyBob3cgdG8gb3BlbiB0aGF0IHR5cGUgb2YgVVJMCisKKyAgICBkZWYgb3Blbl9odHRwKHNlbGYsIHVybCwgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiVXNlIEhUVFAgcHJvdG9jb2wuIiIiCisgICAgICAgIGltcG9ydCBodHRwbGliCisgICAgICAgIHVzZXJfcGFzc3dkID0gTm9uZQorICAgICAgICBwcm94eV9wYXNzd2Q9IE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIHN0cik6CisgICAgICAgICAgICBob3N0LCBzZWxlY3RvciA9IHNwbGl0aG9zdCh1cmwpCisgICAgICAgICAgICBpZiBob3N0OgorICAgICAgICAgICAgICAgIHVzZXJfcGFzc3dkLCBob3N0ID0gc3BsaXR1c2VyKGhvc3QpCisgICAgICAgICAgICAgICAgaG9zdCA9IHVucXVvdGUoaG9zdCkKKyAgICAgICAgICAgIHJlYWxob3N0ID0gaG9zdAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaG9zdCwgc2VsZWN0b3IgPSB1cmwKKyAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciB0aGUgcHJveHkgY29udGFpbnMgYXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbgorICAgICAgICAgICAgcHJveHlfcGFzc3dkLCBob3N0ID0gc3BsaXR1c2VyKGhvc3QpCisgICAgICAgICAgICAjIG5vdyB3ZSBwcm9jZWVkIHdpdGggdGhlIHVybCB3ZSB3YW50IHRvIG9idGFpbgorICAgICAgICAgICAgdXJsdHlwZSwgcmVzdCA9IHNwbGl0dHlwZShzZWxlY3RvcikKKyAgICAgICAgICAgIHVybCA9IHJlc3QKKyAgICAgICAgICAgIHVzZXJfcGFzc3dkID0gTm9uZQorICAgICAgICAgICAgaWYgdXJsdHlwZS5sb3dlcigpICE9ICdodHRwJzoKKyAgICAgICAgICAgICAgICByZWFsaG9zdCA9IE5vbmUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmVhbGhvc3QsIHJlc3QgPSBzcGxpdGhvc3QocmVzdCkKKyAgICAgICAgICAgICAgICBpZiByZWFsaG9zdDoKKyAgICAgICAgICAgICAgICAgICAgdXNlcl9wYXNzd2QsIHJlYWxob3N0ID0gc3BsaXR1c2VyKHJlYWxob3N0KQorICAgICAgICAgICAgICAgIGlmIHVzZXJfcGFzc3dkOgorICAgICAgICAgICAgICAgICAgICBzZWxlY3RvciA9ICIlczovLyVzJXMiICUgKHVybHR5cGUsIHJlYWxob3N0LCByZXN0KQorICAgICAgICAgICAgICAgIGlmIHByb3h5X2J5cGFzcyhyZWFsaG9zdCk6CisgICAgICAgICAgICAgICAgICAgIGhvc3QgPSByZWFsaG9zdAorCisgICAgICAgICAgICAjcHJpbnQgInByb3h5IHZpYSBodHRwOiIsIGhvc3QsIHNlbGVjdG9yCisgICAgICAgIGlmIG5vdCBob3N0OiByYWlzZSBJT0Vycm9yLCAoJ2h0dHAgZXJyb3InLCAnbm8gaG9zdCBnaXZlbicpCisKKyAgICAgICAgaWYgcHJveHlfcGFzc3dkOgorICAgICAgICAgICAgcHJveHlfcGFzc3dkID0gdW5xdW90ZShwcm94eV9wYXNzd2QpCisgICAgICAgICAgICBwcm94eV9hdXRoID0gYmFzZTY0LmI2NGVuY29kZShwcm94eV9wYXNzd2QpLnN0cmlwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb3h5X2F1dGggPSBOb25lCisKKyAgICAgICAgaWYgdXNlcl9wYXNzd2Q6CisgICAgICAgICAgICB1c2VyX3Bhc3N3ZCA9IHVucXVvdGUodXNlcl9wYXNzd2QpCisgICAgICAgICAgICBhdXRoID0gYmFzZTY0LmI2NGVuY29kZSh1c2VyX3Bhc3N3ZCkuc3RyaXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXV0aCA9IE5vbmUKKyAgICAgICAgaCA9IGh0dHBsaWIuSFRUUChob3N0KQorICAgICAgICBpZiBkYXRhIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdQT1NUJywgc2VsZWN0b3IpCisgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCisgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdHRVQnLCBzZWxlY3RvcikKKyAgICAgICAgaWYgcHJveHlfYXV0aDogaC5wdXRoZWFkZXIoJ1Byb3h5LUF1dGhvcml6YXRpb24nLCAnQmFzaWMgJXMnICUgcHJveHlfYXV0aCkKKyAgICAgICAgaWYgYXV0aDogaC5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCAnQmFzaWMgJXMnICUgYXV0aCkKKyAgICAgICAgaWYgcmVhbGhvc3Q6IGgucHV0aGVhZGVyKCdIb3N0JywgcmVhbGhvc3QpCisgICAgICAgIGZvciBhcmdzIGluIHNlbGYuYWRkaGVhZGVyczogaC5wdXRoZWFkZXIoKmFyZ3MpCisgICAgICAgIGguZW5kaGVhZGVycyhkYXRhKQorICAgICAgICBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMgPSBoLmdldHJlcGx5KCkKKyAgICAgICAgZnAgPSBoLmdldGZpbGUoKQorICAgICAgICBpZiBlcnJjb2RlID09IC0xOgorICAgICAgICAgICAgaWYgZnA6IGZwLmNsb3NlKCkKKyAgICAgICAgICAgICMgc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgSFRUUCBzdGF0dXMgbGluZQorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdodHRwIHByb3RvY29sIGVycm9yJywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ290IGEgYmFkIHN0YXR1cyBsaW5lJywgTm9uZSkKKyAgICAgICAgIyBBY2NvcmRpbmcgdG8gUkZDIDI2MTYsICIyeHgiIGNvZGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCdzCisgICAgICAgICMgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkLCB1bmRlcnN0b29kLCBhbmQgYWNjZXB0ZWQuCisgICAgICAgIGlmICgyMDAgPD0gZXJyY29kZSA8IDMwMCk6CisgICAgICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmcCwgaGVhZGVycywgImh0dHA6IiArIHVybCwgZXJyY29kZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5odHRwX2Vycm9yKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaHR0cF9lcnJvcih1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGEpCisKKyAgICBkZWYgaHR0cF9lcnJvcihzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIkhhbmRsZSBodHRwIGVycm9ycy4KKyAgICAgICAgRGVyaXZlZCBjbGFzcyBjYW4gb3ZlcnJpZGUgdGhpcywgb3IgcHJvdmlkZSBzcGVjaWZpYyBoYW5kbGVycworICAgICAgICBuYW1lZCBodHRwX2Vycm9yX0RERCB3aGVyZSBEREQgaXMgdGhlIDMtZGlnaXQgZXJyb3IgY29kZS4iIiIKKyAgICAgICAgIyBGaXJzdCBjaGVjayBpZiB0aGVyZSdzIGEgc3BlY2lmaWMgaGFuZGxlciBmb3IgdGhpcyBlcnJvcgorICAgICAgICBuYW1lID0gJ2h0dHBfZXJyb3JfJWQnICUgZXJyY29kZQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZCh1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZCh1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGEpCisgICAgICAgICAgICBpZiByZXN1bHQ6IHJldHVybiByZXN1bHQKKyAgICAgICAgcmV0dXJuIHNlbGYuaHR0cF9lcnJvcl9kZWZhdWx0KHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKworICAgIGRlZiBodHRwX2Vycm9yX2RlZmF1bHQoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKToKKyAgICAgICAgIiIiRGVmYXVsdCBlcnJvciBoYW5kbGVyOiBjbG9zZSB0aGUgY29ubmVjdGlvbiBhbmQgcmFpc2UgSU9FcnJvci4iIiIKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2h0dHAgZXJyb3InLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisKKyAgICBpZiBfaGF2ZV9zc2w6CisgICAgICAgIGRlZiBvcGVuX2h0dHBzKHNlbGYsIHVybCwgZGF0YT1Ob25lKToKKyAgICAgICAgICAgICIiIlVzZSBIVFRQUyBwcm90b2NvbC4iIiIKKworICAgICAgICAgICAgaW1wb3J0IGh0dHBsaWIKKyAgICAgICAgICAgIHVzZXJfcGFzc3dkID0gTm9uZQorICAgICAgICAgICAgcHJveHlfcGFzc3dkID0gTm9uZQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmwsIHN0cik6CisgICAgICAgICAgICAgICAgaG9zdCwgc2VsZWN0b3IgPSBzcGxpdGhvc3QodXJsKQorICAgICAgICAgICAgICAgIGlmIGhvc3Q6CisgICAgICAgICAgICAgICAgICAgIHVzZXJfcGFzc3dkLCBob3N0ID0gc3BsaXR1c2VyKGhvc3QpCisgICAgICAgICAgICAgICAgICAgIGhvc3QgPSB1bnF1b3RlKGhvc3QpCisgICAgICAgICAgICAgICAgcmVhbGhvc3QgPSBob3N0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGhvc3QsIHNlbGVjdG9yID0gdXJsCisgICAgICAgICAgICAgICAgIyBoZXJlLCB3ZSBkZXRlcm1pbmUsIHdoZXRoZXIgdGhlIHByb3h5IGNvbnRhaW5zIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBwcm94eV9wYXNzd2QsIGhvc3QgPSBzcGxpdHVzZXIoaG9zdCkKKyAgICAgICAgICAgICAgICB1cmx0eXBlLCByZXN0ID0gc3BsaXR0eXBlKHNlbGVjdG9yKQorICAgICAgICAgICAgICAgIHVybCA9IHJlc3QKKyAgICAgICAgICAgICAgICB1c2VyX3Bhc3N3ZCA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiB1cmx0eXBlLmxvd2VyKCkgIT0gJ2h0dHBzJzoKKyAgICAgICAgICAgICAgICAgICAgcmVhbGhvc3QgPSBOb25lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmVhbGhvc3QsIHJlc3QgPSBzcGxpdGhvc3QocmVzdCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVhbGhvc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3Bhc3N3ZCwgcmVhbGhvc3QgPSBzcGxpdHVzZXIocmVhbGhvc3QpCisgICAgICAgICAgICAgICAgICAgIGlmIHVzZXJfcGFzc3dkOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3IgPSAiJXM6Ly8lcyVzIiAlICh1cmx0eXBlLCByZWFsaG9zdCwgcmVzdCkKKyAgICAgICAgICAgICAgICAjcHJpbnQgInByb3h5IHZpYSBodHRwczoiLCBob3N0LCBzZWxlY3RvcgorICAgICAgICAgICAgaWYgbm90IGhvc3Q6IHJhaXNlIElPRXJyb3IsICgnaHR0cHMgZXJyb3InLCAnbm8gaG9zdCBnaXZlbicpCisgICAgICAgICAgICBpZiBwcm94eV9wYXNzd2Q6CisgICAgICAgICAgICAgICAgcHJveHlfcGFzc3dkID0gdW5xdW90ZShwcm94eV9wYXNzd2QpCisgICAgICAgICAgICAgICAgcHJveHlfYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUocHJveHlfcGFzc3dkKS5zdHJpcCgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByb3h5X2F1dGggPSBOb25lCisgICAgICAgICAgICBpZiB1c2VyX3Bhc3N3ZDoKKyAgICAgICAgICAgICAgICB1c2VyX3Bhc3N3ZCA9IHVucXVvdGUodXNlcl9wYXNzd2QpCisgICAgICAgICAgICAgICAgYXV0aCA9IGJhc2U2NC5iNjRlbmNvZGUodXNlcl9wYXNzd2QpLnN0cmlwKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXV0aCA9IE5vbmUKKyAgICAgICAgICAgIGggPSBodHRwbGliLkhUVFBTKGhvc3QsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlfZmlsZT1zZWxmLmtleV9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlPXNlbGYuY2VydF9maWxlKQorICAgICAgICAgICAgaWYgZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxlY3RvcikKKyAgICAgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykKKyAgICAgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ0dFVCcsIHNlbGVjdG9yKQorICAgICAgICAgICAgaWYgcHJveHlfYXV0aDogaC5wdXRoZWFkZXIoJ1Byb3h5LUF1dGhvcml6YXRpb24nLCAnQmFzaWMgJXMnICUgcHJveHlfYXV0aCkKKyAgICAgICAgICAgIGlmIGF1dGg6IGgucHV0aGVhZGVyKCdBdXRob3JpemF0aW9uJywgJ0Jhc2ljICVzJyAlIGF1dGgpCisgICAgICAgICAgICBpZiByZWFsaG9zdDogaC5wdXRoZWFkZXIoJ0hvc3QnLCByZWFsaG9zdCkKKyAgICAgICAgICAgIGZvciBhcmdzIGluIHNlbGYuYWRkaGVhZGVyczogaC5wdXRoZWFkZXIoKmFyZ3MpCisgICAgICAgICAgICBoLmVuZGhlYWRlcnMoZGF0YSkKKyAgICAgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycyA9IGguZ2V0cmVwbHkoKQorICAgICAgICAgICAgZnAgPSBoLmdldGZpbGUoKQorICAgICAgICAgICAgaWYgZXJyY29kZSA9PSAtMToKKyAgICAgICAgICAgICAgICBpZiBmcDogZnAuY2xvc2UoKQorICAgICAgICAgICAgICAgICMgc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgSFRUUCBzdGF0dXMgbGluZQorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnaHR0cCBwcm90b2NvbCBlcnJvcicsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnb3QgYSBiYWQgc3RhdHVzIGxpbmUnLCBOb25lKQorICAgICAgICAgICAgIyBBY2NvcmRpbmcgdG8gUkZDIDI2MTYsICIyeHgiIGNvZGUgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCdzCisgICAgICAgICAgICAjIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCwgdW5kZXJzdG9vZCwgYW5kIGFjY2VwdGVkLgorICAgICAgICAgICAgaWYgKDIwMCA8PSBlcnJjb2RlIDwgMzAwKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmcCwgaGVhZGVycywgImh0dHBzOiIgKyB1cmwsIGVycmNvZGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaHR0cF9lcnJvcih1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaHR0cF9lcnJvcih1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSkKKworICAgIGRlZiBvcGVuX2ZpbGUoc2VsZiwgdXJsKToKKyAgICAgICAgIiIiVXNlIGxvY2FsIGZpbGUgb3IgRlRQIGRlcGVuZGluZyBvbiBmb3JtIG9mIFVSTC4iIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXJsLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdmaWxlIGVycm9yJywgJ3Byb3h5IHN1cHBvcnQgZm9yIGZpbGUgcHJvdG9jb2wgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCcpCisgICAgICAgIGlmIHVybFs6Ml0gPT0gJy8vJyBhbmQgdXJsWzI6M10gIT0gJy8nIGFuZCB1cmxbMjoxMl0ubG93ZXIoKSAhPSAnbG9jYWxob3N0Lyc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX2Z0cCh1cmwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuX2xvY2FsX2ZpbGUodXJsKQorCisgICAgZGVmIG9wZW5fbG9jYWxfZmlsZShzZWxmLCB1cmwpOgorICAgICAgICAiIiJVc2UgbG9jYWwgZmlsZS4iIiIKKyAgICAgICAgaW1wb3J0IG1pbWV0eXBlcywgbWltZXRvb2xzLCBlbWFpbC51dGlscworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgaG9zdCwgZmlsZSA9IHNwbGl0aG9zdCh1cmwpCisgICAgICAgIGxvY2FsbmFtZSA9IHVybDJwYXRobmFtZShmaWxlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdGF0cyA9IG9zLnN0YXQobG9jYWxuYW1lKQorICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoZS5lcnJubywgZS5zdHJlcnJvciwgZS5maWxlbmFtZSkKKyAgICAgICAgc2l6ZSA9IHN0YXRzLnN0X3NpemUKKyAgICAgICAgbW9kaWZpZWQgPSBlbWFpbC51dGlscy5mb3JtYXRkYXRlKHN0YXRzLnN0X210aW1lLCB1c2VnbXQ9VHJ1ZSkKKyAgICAgICAgbXR5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZSh1cmwpWzBdCisgICAgICAgIGhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShTdHJpbmdJTygKKyAgICAgICAgICAgICdDb250ZW50LVR5cGU6ICVzXG5Db250ZW50LUxlbmd0aDogJWRcbkxhc3QtbW9kaWZpZWQ6ICVzXG4nICUKKyAgICAgICAgICAgIChtdHlwZSBvciAndGV4dC9wbGFpbicsIHNpemUsIG1vZGlmaWVkKSkpCisgICAgICAgIGlmIG5vdCBob3N0OgorICAgICAgICAgICAgdXJsZmlsZSA9IGZpbGUKKyAgICAgICAgICAgIGlmIGZpbGVbOjFdID09ICcvJzoKKyAgICAgICAgICAgICAgICB1cmxmaWxlID0gJ2ZpbGU6Ly8nICsgZmlsZQorICAgICAgICAgICAgZWxpZiBmaWxlWzoyXSA9PSAnLi8nOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoImxvY2FsIGZpbGUgdXJsIG1heSBzdGFydCB3aXRoIC8gb3IgZmlsZTouIFVua25vd24gdXJsIG9mIHR5cGU6ICVzIiAlIHVybCkKKyAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKG9wZW4obG9jYWxuYW1lLCAncmInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIHVybGZpbGUpCisgICAgICAgIGhvc3QsIHBvcnQgPSBzcGxpdHBvcnQoaG9zdCkKKyAgICAgICAgaWYgbm90IHBvcnQgXAorICAgICAgICAgICBhbmQgc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdCkgaW4gKGxvY2FsaG9zdCgpLCB0aGlzaG9zdCgpKToKKyAgICAgICAgICAgIHVybGZpbGUgPSBmaWxlCisgICAgICAgICAgICBpZiBmaWxlWzoxXSA9PSAnLyc6CisgICAgICAgICAgICAgICAgdXJsZmlsZSA9ICdmaWxlOi8vJyArIGZpbGUKKyAgICAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKG9wZW4obG9jYWxuYW1lLCAncmInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsIHVybGZpbGUpCisgICAgICAgIHJhaXNlIElPRXJyb3IsICgnbG9jYWwgZmlsZSBlcnJvcicsICdub3Qgb24gbG9jYWwgaG9zdCcpCisKKyAgICBkZWYgb3Blbl9mdHAoc2VsZiwgdXJsKToKKyAgICAgICAgIiIiVXNlIEZUUCBwcm90b2NvbC4iIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXJsLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdmdHAgZXJyb3InLCAncHJveHkgc3VwcG9ydCBmb3IgZnRwIHByb3RvY29sIGN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQnKQorICAgICAgICBpbXBvcnQgbWltZXR5cGVzLCBtaW1ldG9vbHMKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgICAgIGhvc3QsIHBhdGggPSBzcGxpdGhvc3QodXJsKQorICAgICAgICBpZiBub3QgaG9zdDogcmFpc2UgSU9FcnJvciwgKCdmdHAgZXJyb3InLCAnbm8gaG9zdCBnaXZlbicpCisgICAgICAgIGhvc3QsIHBvcnQgPSBzcGxpdHBvcnQoaG9zdCkKKyAgICAgICAgdXNlciwgaG9zdCA9IHNwbGl0dXNlcihob3N0KQorICAgICAgICBpZiB1c2VyOiB1c2VyLCBwYXNzd2QgPSBzcGxpdHBhc3N3ZCh1c2VyKQorICAgICAgICBlbHNlOiBwYXNzd2QgPSBOb25lCisgICAgICAgIGhvc3QgPSB1bnF1b3RlKGhvc3QpCisgICAgICAgIHVzZXIgPSB1c2VyIG9yICcnCisgICAgICAgIHBhc3N3ZCA9IHBhc3N3ZCBvciAnJworICAgICAgICBob3N0ID0gc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdCkKKyAgICAgICAgaWYgbm90IHBvcnQ6CisgICAgICAgICAgICBpbXBvcnQgZnRwbGliCisgICAgICAgICAgICBwb3J0ID0gZnRwbGliLkZUUF9QT1JUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwb3J0ID0gaW50KHBvcnQpCisgICAgICAgIHBhdGgsIGF0dHJzID0gc3BsaXRhdHRyKHBhdGgpCisgICAgICAgIHBhdGggPSB1bnF1b3RlKHBhdGgpCisgICAgICAgIGRpcnMgPSBwYXRoLnNwbGl0KCcvJykKKyAgICAgICAgZGlycywgZmlsZSA9IGRpcnNbOi0xXSwgZGlyc1stMV0KKyAgICAgICAgaWYgZGlycyBhbmQgbm90IGRpcnNbMF06IGRpcnMgPSBkaXJzWzE6XQorICAgICAgICBpZiBkaXJzIGFuZCBub3QgZGlyc1swXTogZGlyc1swXSA9ICcvJworICAgICAgICBrZXkgPSB1c2VyLCBob3N0LCBwb3J0LCAnLycuam9pbihkaXJzKQorICAgICAgICAjIFhYWCB0aHJlYWQgdW5zYWZlIQorICAgICAgICBpZiBsZW4oc2VsZi5mdHBjYWNoZSkgPiBNQVhGVFBDQUNIRToKKyAgICAgICAgICAgICMgUHJ1bmUgdGhlIGNhY2hlLCByYXRoZXIgYXJiaXRyYXJpbHkKKyAgICAgICAgICAgIGZvciBrIGluIHNlbGYuZnRwY2FjaGUua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIGsgIT0ga2V5OgorICAgICAgICAgICAgICAgICAgICB2ID0gc2VsZi5mdHBjYWNoZVtrXQorICAgICAgICAgICAgICAgICAgICBkZWwgc2VsZi5mdHBjYWNoZVtrXQorICAgICAgICAgICAgICAgICAgICB2LmNsb3NlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IGtleSBpbiBzZWxmLmZ0cGNhY2hlOgorICAgICAgICAgICAgICAgIHNlbGYuZnRwY2FjaGVba2V5XSA9IFwKKyAgICAgICAgICAgICAgICAgICAgZnRwd3JhcHBlcih1c2VyLCBwYXNzd2QsIGhvc3QsIHBvcnQsIGRpcnMpCisgICAgICAgICAgICBpZiBub3QgZmlsZTogdHlwZSA9ICdEJworICAgICAgICAgICAgZWxzZTogdHlwZSA9ICdJJworICAgICAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6CisgICAgICAgICAgICAgICAgYXR0ciwgdmFsdWUgPSBzcGxpdHZhbHVlKGF0dHIpCisgICAgICAgICAgICAgICAgaWYgYXR0ci5sb3dlcigpID09ICd0eXBlJyBhbmQgXAorICAgICAgICAgICAgICAgICAgIHZhbHVlIGluICgnYScsICdBJywgJ2knLCAnSScsICdkJywgJ0QnKToKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHZhbHVlLnVwcGVyKCkKKyAgICAgICAgICAgIChmcCwgcmV0cmxlbikgPSBzZWxmLmZ0cGNhY2hlW2tleV0ucmV0cmZpbGUoZmlsZSwgdHlwZSkKKyAgICAgICAgICAgIG10eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUoImZ0cDoiICsgdXJsKVswXQorICAgICAgICAgICAgaGVhZGVycyA9ICIiCisgICAgICAgICAgICBpZiBtdHlwZToKKyAgICAgICAgICAgICAgICBoZWFkZXJzICs9ICJDb250ZW50LVR5cGU6ICVzXG4iICUgbXR5cGUKKyAgICAgICAgICAgIGlmIHJldHJsZW4gaXMgbm90IE5vbmUgYW5kIHJldHJsZW4gPj0gMDoKKyAgICAgICAgICAgICAgICBoZWFkZXJzICs9ICJDb250ZW50LUxlbmd0aDogJWRcbiIgJSByZXRybGVuCisgICAgICAgICAgICBoZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2UoU3RyaW5nSU8oaGVhZGVycykpCisgICAgICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmcCwgaGVhZGVycywgImZ0cDoiICsgdXJsKQorICAgICAgICBleGNlcHQgZnRwZXJyb3JzKCksIG1zZzoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnZnRwIGVycm9yJywgbXNnKSwgc3lzLmV4Y19pbmZvKClbMl0KKworICAgIGRlZiBvcGVuX2RhdGEoc2VsZiwgdXJsLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJVc2UgImRhdGEiIFVSTC4iIiIKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodXJsLCBzdHIpOgorICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdkYXRhIGVycm9yJywgJ3Byb3h5IHN1cHBvcnQgZm9yIGRhdGEgcHJvdG9jb2wgY3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZCcpCisgICAgICAgICMgaWdub3JlIFBPU1RlZCBkYXRhCisgICAgICAgICMKKyAgICAgICAgIyBzeW50YXggb2YgZGF0YSBVUkxzOgorICAgICAgICAjIGRhdGF1cmwgICA6PSAiZGF0YToiIFsgbWVkaWF0eXBlIF0gWyAiO2Jhc2U2NCIgXSAiLCIgZGF0YQorICAgICAgICAjIG1lZGlhdHlwZSA6PSBbIHR5cGUgIi8iIHN1YnR5cGUgXSAqKCAiOyIgcGFyYW1ldGVyICkKKyAgICAgICAgIyBkYXRhICAgICAgOj0gKnVybGNoYXIKKyAgICAgICAgIyBwYXJhbWV0ZXIgOj0gYXR0cmlidXRlICI9IiB2YWx1ZQorICAgICAgICBpbXBvcnQgbWltZXRvb2xzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgICAgICB0cnk6CisgICAgICAgICAgICBbdHlwZSwgZGF0YV0gPSB1cmwuc3BsaXQoJywnLCAxKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsICgnZGF0YSBlcnJvcicsICdiYWQgZGF0YSBVUkwnKQorICAgICAgICBpZiBub3QgdHlwZToKKyAgICAgICAgICAgIHR5cGUgPSAndGV4dC9wbGFpbjtjaGFyc2V0PVVTLUFTQ0lJJworICAgICAgICBzZW1pID0gdHlwZS5yZmluZCgnOycpCisgICAgICAgIGlmIHNlbWkgPj0gMCBhbmQgJz0nIG5vdCBpbiB0eXBlW3NlbWk6XToKKyAgICAgICAgICAgIGVuY29kaW5nID0gdHlwZVtzZW1pKzE6XQorICAgICAgICAgICAgdHlwZSA9IHR5cGVbOnNlbWldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbmNvZGluZyA9ICcnCisgICAgICAgIG1zZyA9IFtdCisgICAgICAgIG1zZy5hcHBlbmQoJ0RhdGU6ICVzJyV0aW1lLnN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5nbXRpbWUodGltZS50aW1lKCkpKSkKKyAgICAgICAgbXNnLmFwcGVuZCgnQ29udGVudC10eXBlOiAlcycgJSB0eXBlKQorICAgICAgICBpZiBlbmNvZGluZyA9PSAnYmFzZTY0JzoKKyAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuZGVjb2Rlc3RyaW5nKGRhdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkYXRhID0gdW5xdW90ZShkYXRhKQorICAgICAgICBtc2cuYXBwZW5kKCdDb250ZW50LUxlbmd0aDogJWQnICUgbGVuKGRhdGEpKQorICAgICAgICBtc2cuYXBwZW5kKCcnKQorICAgICAgICBtc2cuYXBwZW5kKGRhdGEpCisgICAgICAgIG1zZyA9ICdcbicuam9pbihtc2cpCisgICAgICAgIGYgPSBTdHJpbmdJTyhtc2cpCisgICAgICAgIGhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShmLCAwKQorICAgICAgICAjZi5maWxlbm8gPSBOb25lICAgICAjIG5lZWRlZCBmb3IgYWRkaW5mb3VybAorICAgICAgICByZXR1cm4gYWRkaW5mb3VybChmLCBoZWFkZXJzLCB1cmwpCisKKworY2xhc3MgRmFuY3lVUkxvcGVuZXIoVVJMb3BlbmVyKToKKyAgICAiIiJEZXJpdmVkIGNsYXNzIHdpdGggaGFuZGxlcnMgZm9yIGVycm9ycyB3ZSBjYW4gaGFuZGxlIChwZXJoYXBzKS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBVUkxvcGVuZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBzZWxmLmF1dGhfY2FjaGUgPSB7fQorICAgICAgICBzZWxmLnRyaWVzID0gMAorICAgICAgICBzZWxmLm1heHRyaWVzID0gMTAKKworICAgIGRlZiBodHRwX2Vycm9yX2RlZmF1bHQoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKToKKyAgICAgICAgIiIiRGVmYXVsdCBlcnJvciBoYW5kbGluZyAtLSBkb24ndCByYWlzZSBhbiBleGNlcHRpb24uIiIiCisgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBoZWFkZXJzLCAiaHR0cDoiICsgdXJsLCBlcnJjb2RlKQorCisgICAgZGVmIGh0dHBfZXJyb3JfMzAyKHNlbGYsIHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiRXJyb3IgMzAyIC0tIHJlbG9jYXRlZCAodGVtcG9yYXJpbHkpLiIiIgorICAgICAgICBzZWxmLnRyaWVzICs9IDEKKyAgICAgICAgaWYgc2VsZi5tYXh0cmllcyBhbmQgc2VsZi50cmllcyA+PSBzZWxmLm1heHRyaWVzOgorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiaHR0cF9lcnJvcl81MDAiKToKKyAgICAgICAgICAgICAgICBtZXRoID0gc2VsZi5odHRwX2Vycm9yXzUwMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtZXRoID0gc2VsZi5odHRwX2Vycm9yX2RlZmF1bHQKKyAgICAgICAgICAgIHNlbGYudHJpZXMgPSAwCisgICAgICAgICAgICByZXR1cm4gbWV0aCh1cmwsIGZwLCA1MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWwgU2VydmVyIEVycm9yOiBSZWRpcmVjdCBSZWN1cnNpb24iLCBoZWFkZXJzKQorICAgICAgICByZXN1bHQgPSBzZWxmLnJlZGlyZWN0X2ludGVybmFsKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhKQorICAgICAgICBzZWxmLnRyaWVzID0gMAorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgcmVkaXJlY3RfaW50ZXJuYWwoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLCBkYXRhKToKKyAgICAgICAgaWYgJ2xvY2F0aW9uJyBpbiBoZWFkZXJzOgorICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVyc1snbG9jYXRpb24nXQorICAgICAgICBlbGlmICd1cmknIGluIGhlYWRlcnM6CisgICAgICAgICAgICBuZXd1cmwgPSBoZWFkZXJzWyd1cmknXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgIyBJbiBjYXNlIHRoZSBzZXJ2ZXIgc2VudCBhIHJlbGF0aXZlIFVSTCwgam9pbiB3aXRoIG9yaWdpbmFsOgorICAgICAgICBuZXd1cmwgPSBiYXNlam9pbihzZWxmLnR5cGUgKyAiOiIgKyB1cmwsIG5ld3VybCkKKworICAgICAgICAjIEZvciBzZWN1cml0eSByZWFzb25zIHdlIGRvIG5vdCBhbGxvdyByZWRpcmVjdHMgdG8gcHJvdG9jb2xzCisgICAgICAgICMgb3RoZXIgdGhhbiBIVFRQLCBIVFRQUyBvciBGVFAuCisgICAgICAgIG5ld3VybF9sb3dlciA9IG5ld3VybC5sb3dlcigpCisgICAgICAgIGlmIG5vdCAobmV3dXJsX2xvd2VyLnN0YXJ0c3dpdGgoJ2h0dHA6Ly8nKSBvcgorICAgICAgICAgICAgICAgIG5ld3VybF9sb3dlci5zdGFydHN3aXRoKCdodHRwczovLycpIG9yCisgICAgICAgICAgICAgICAgbmV3dXJsX2xvd2VyLnN0YXJ0c3dpdGgoJ2Z0cDovLycpKToKKyAgICAgICAgICAgIHJhaXNlIElPRXJyb3IoJ3JlZGlyZWN0IGVycm9yJywgZXJyY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybXNnICsgIiAtIFJlZGlyZWN0aW9uIHRvIHVybCAnJXMnIGlzIG5vdCBhbGxvd2VkIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycykKKworICAgICAgICByZXR1cm4gc2VsZi5vcGVuKG5ld3VybCkKKworICAgIGRlZiBodHRwX2Vycm9yXzMwMShzZWxmLCB1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGE9Tm9uZSk6CisgICAgICAgICIiIkVycm9yIDMwMSAtLSBhbHNvIHJlbG9jYXRlZCAocGVybWFuZW50bHkpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5odHRwX2Vycm9yXzMwMih1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGEpCisKKyAgICBkZWYgaHR0cF9lcnJvcl8zMDMoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJFcnJvciAzMDMgLS0gYWxzbyByZWxvY2F0ZWQgKGVzc2VudGlhbGx5IGlkZW50aWNhbCB0byAzMDIpLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5odHRwX2Vycm9yXzMwMih1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMsIGRhdGEpCisKKyAgICBkZWYgaHR0cF9lcnJvcl8zMDcoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJFcnJvciAzMDcgLS0gcmVsb2NhdGVkLCBidXQgdHVybiBQT1NUIGludG8gZXJyb3IuIiIiCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmh0dHBfZXJyb3JfMzAyKHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmh0dHBfZXJyb3JfZGVmYXVsdCh1cmwsIGZwLCBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisKKyAgICBkZWYgaHR0cF9lcnJvcl80MDEoc2VsZiwgdXJsLCBmcCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzLCBkYXRhPU5vbmUpOgorICAgICAgICAiIiJFcnJvciA0MDEgLS0gYXV0aGVudGljYXRpb24gcmVxdWlyZWQuCisgICAgICAgIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHMgQmFzaWMgYXV0aGVudGljYXRpb24gb25seS4iIiIKKyAgICAgICAgaWYgbm90ICd3d3ctYXV0aGVudGljYXRlJyBpbiBoZWFkZXJzOgorICAgICAgICAgICAgVVJMb3BlbmVyLmh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCB1cmwsIGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisgICAgICAgIHN0dWZmID0gaGVhZGVyc1snd3d3LWF1dGhlbnRpY2F0ZSddCisgICAgICAgIGltcG9ydCByZQorICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKCdbIFx0XSooW14gXHRdKylbIFx0XStyZWFsbT0iKFteIl0qKSInLCBzdHVmZikKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgVVJMb3BlbmVyLmh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCB1cmwsIGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisgICAgICAgIHNjaGVtZSwgcmVhbG0gPSBtYXRjaC5ncm91cHMoKQorICAgICAgICBpZiBzY2hlbWUubG93ZXIoKSAhPSAnYmFzaWMnOgorICAgICAgICAgICAgVVJMb3BlbmVyLmh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCB1cmwsIGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisgICAgICAgIG5hbWUgPSAncmV0cnlfJyArIHNlbGYudHlwZSArICdfYmFzaWNfYXV0aCcKKyAgICAgICAgaWYgZGF0YSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZixuYW1lKSh1cmwsIHJlYWxtKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZixuYW1lKSh1cmwsIHJlYWxtLCBkYXRhKQorCisgICAgZGVmIGh0dHBfZXJyb3JfNDA3KHNlbGYsIHVybCwgZnAsIGVycmNvZGUsIGVycm1zZywgaGVhZGVycywgZGF0YT1Ob25lKToKKyAgICAgICAgIiIiRXJyb3IgNDA3IC0tIHByb3h5IGF1dGhlbnRpY2F0aW9uIHJlcXVpcmVkLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIEJhc2ljIGF1dGhlbnRpY2F0aW9uIG9ubHkuIiIiCisgICAgICAgIGlmIG5vdCAncHJveHktYXV0aGVudGljYXRlJyBpbiBoZWFkZXJzOgorICAgICAgICAgICAgVVJMb3BlbmVyLmh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCB1cmwsIGZwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJjb2RlLCBlcnJtc2csIGhlYWRlcnMpCisgICAgICAgIHN0dWZmID0gaGVhZGVyc1sncHJveHktYXV0aGVudGljYXRlJ10KKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIG1hdGNoID0gcmUubWF0Y2goJ1sgXHRdKihbXiBcdF0rKVsgXHRdK3JlYWxtPSIoW14iXSopIicsIHN0dWZmKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICBVUkxvcGVuZXIuaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgc2NoZW1lLCByZWFsbSA9IG1hdGNoLmdyb3VwcygpCisgICAgICAgIGlmIHNjaGVtZS5sb3dlcigpICE9ICdiYXNpYyc6CisgICAgICAgICAgICBVUkxvcGVuZXIuaHR0cF9lcnJvcl9kZWZhdWx0KHNlbGYsIHVybCwgZnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycmNvZGUsIGVycm1zZywgaGVhZGVycykKKyAgICAgICAgbmFtZSA9ICdyZXRyeV9wcm94eV8nICsgc2VsZi50eXBlICsgJ19iYXNpY19hdXRoJworICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLG5hbWUpKHVybCwgcmVhbG0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLG5hbWUpKHVybCwgcmVhbG0sIGRhdGEpCisKKyAgICBkZWYgcmV0cnlfcHJveHlfaHR0cF9iYXNpY19hdXRoKHNlbGYsIHVybCwgcmVhbG0sIGRhdGE9Tm9uZSk6CisgICAgICAgIGhvc3QsIHNlbGVjdG9yID0gc3BsaXRob3N0KHVybCkKKyAgICAgICAgbmV3dXJsID0gJ2h0dHA6Ly8nICsgaG9zdCArIHNlbGVjdG9yCisgICAgICAgIHByb3h5ID0gc2VsZi5wcm94aWVzWydodHRwJ10KKyAgICAgICAgdXJsdHlwZSwgcHJveHlob3N0ID0gc3BsaXR0eXBlKHByb3h5KQorICAgICAgICBwcm94eWhvc3QsIHByb3h5c2VsZWN0b3IgPSBzcGxpdGhvc3QocHJveHlob3N0KQorICAgICAgICBpID0gcHJveHlob3N0LmZpbmQoJ0AnKSArIDEKKyAgICAgICAgcHJveHlob3N0ID0gcHJveHlob3N0W2k6XQorICAgICAgICB1c2VyLCBwYXNzd2QgPSBzZWxmLmdldF91c2VyX3Bhc3N3ZChwcm94eWhvc3QsIHJlYWxtLCBpKQorICAgICAgICBpZiBub3QgKHVzZXIgb3IgcGFzc3dkKTogcmV0dXJuIE5vbmUKKyAgICAgICAgcHJveHlob3N0ID0gcXVvdGUodXNlciwgc2FmZT0nJykgKyAnOicgKyBxdW90ZShwYXNzd2QsIHNhZmU9JycpICsgJ0AnICsgcHJveHlob3N0CisgICAgICAgIHNlbGYucHJveGllc1snaHR0cCddID0gJ2h0dHA6Ly8nICsgcHJveHlob3N0ICsgcHJveHlzZWxlY3RvcgorICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuKG5ld3VybCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsLCBkYXRhKQorCisgICAgZGVmIHJldHJ5X3Byb3h5X2h0dHBzX2Jhc2ljX2F1dGgoc2VsZiwgdXJsLCByZWFsbSwgZGF0YT1Ob25lKToKKyAgICAgICAgaG9zdCwgc2VsZWN0b3IgPSBzcGxpdGhvc3QodXJsKQorICAgICAgICBuZXd1cmwgPSAnaHR0cHM6Ly8nICsgaG9zdCArIHNlbGVjdG9yCisgICAgICAgIHByb3h5ID0gc2VsZi5wcm94aWVzWydodHRwcyddCisgICAgICAgIHVybHR5cGUsIHByb3h5aG9zdCA9IHNwbGl0dHlwZShwcm94eSkKKyAgICAgICAgcHJveHlob3N0LCBwcm94eXNlbGVjdG9yID0gc3BsaXRob3N0KHByb3h5aG9zdCkKKyAgICAgICAgaSA9IHByb3h5aG9zdC5maW5kKCdAJykgKyAxCisgICAgICAgIHByb3h5aG9zdCA9IHByb3h5aG9zdFtpOl0KKyAgICAgICAgdXNlciwgcGFzc3dkID0gc2VsZi5nZXRfdXNlcl9wYXNzd2QocHJveHlob3N0LCByZWFsbSwgaSkKKyAgICAgICAgaWYgbm90ICh1c2VyIG9yIHBhc3N3ZCk6IHJldHVybiBOb25lCisgICAgICAgIHByb3h5aG9zdCA9IHF1b3RlKHVzZXIsIHNhZmU9JycpICsgJzonICsgcXVvdGUocGFzc3dkLCBzYWZlPScnKSArICdAJyArIHByb3h5aG9zdAorICAgICAgICBzZWxmLnByb3hpZXNbJ2h0dHBzJ10gPSAnaHR0cHM6Ly8nICsgcHJveHlob3N0ICsgcHJveHlzZWxlY3RvcgorICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuKG5ld3VybCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsLCBkYXRhKQorCisgICAgZGVmIHJldHJ5X2h0dHBfYmFzaWNfYXV0aChzZWxmLCB1cmwsIHJlYWxtLCBkYXRhPU5vbmUpOgorICAgICAgICBob3N0LCBzZWxlY3RvciA9IHNwbGl0aG9zdCh1cmwpCisgICAgICAgIGkgPSBob3N0LmZpbmQoJ0AnKSArIDEKKyAgICAgICAgaG9zdCA9IGhvc3RbaTpdCisgICAgICAgIHVzZXIsIHBhc3N3ZCA9IHNlbGYuZ2V0X3VzZXJfcGFzc3dkKGhvc3QsIHJlYWxtLCBpKQorICAgICAgICBpZiBub3QgKHVzZXIgb3IgcGFzc3dkKTogcmV0dXJuIE5vbmUKKyAgICAgICAgaG9zdCA9IHF1b3RlKHVzZXIsIHNhZmU9JycpICsgJzonICsgcXVvdGUocGFzc3dkLCBzYWZlPScnKSArICdAJyArIGhvc3QKKyAgICAgICAgbmV3dXJsID0gJ2h0dHA6Ly8nICsgaG9zdCArIHNlbGVjdG9yCisgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3BlbihuZXd1cmwsIGRhdGEpCisKKyAgICBkZWYgcmV0cnlfaHR0cHNfYmFzaWNfYXV0aChzZWxmLCB1cmwsIHJlYWxtLCBkYXRhPU5vbmUpOgorICAgICAgICBob3N0LCBzZWxlY3RvciA9IHNwbGl0aG9zdCh1cmwpCisgICAgICAgIGkgPSBob3N0LmZpbmQoJ0AnKSArIDEKKyAgICAgICAgaG9zdCA9IGhvc3RbaTpdCisgICAgICAgIHVzZXIsIHBhc3N3ZCA9IHNlbGYuZ2V0X3VzZXJfcGFzc3dkKGhvc3QsIHJlYWxtLCBpKQorICAgICAgICBpZiBub3QgKHVzZXIgb3IgcGFzc3dkKTogcmV0dXJuIE5vbmUKKyAgICAgICAgaG9zdCA9IHF1b3RlKHVzZXIsIHNhZmU9JycpICsgJzonICsgcXVvdGUocGFzc3dkLCBzYWZlPScnKSArICdAJyArIGhvc3QKKyAgICAgICAgbmV3dXJsID0gJ2h0dHBzOi8vJyArIGhvc3QgKyBzZWxlY3RvcgorICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5vcGVuKG5ld3VybCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW4obmV3dXJsLCBkYXRhKQorCisgICAgZGVmIGdldF91c2VyX3Bhc3N3ZChzZWxmLCBob3N0LCByZWFsbSwgY2xlYXJfY2FjaGU9MCk6CisgICAgICAgIGtleSA9IHJlYWxtICsgJ0AnICsgaG9zdC5sb3dlcigpCisgICAgICAgIGlmIGtleSBpbiBzZWxmLmF1dGhfY2FjaGU6CisgICAgICAgICAgICBpZiBjbGVhcl9jYWNoZToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5hdXRoX2NhY2hlW2tleV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXV0aF9jYWNoZVtrZXldCisgICAgICAgIHVzZXIsIHBhc3N3ZCA9IHNlbGYucHJvbXB0X3VzZXJfcGFzc3dkKGhvc3QsIHJlYWxtKQorICAgICAgICBpZiB1c2VyIG9yIHBhc3N3ZDogc2VsZi5hdXRoX2NhY2hlW2tleV0gPSAodXNlciwgcGFzc3dkKQorICAgICAgICByZXR1cm4gdXNlciwgcGFzc3dkCisKKyAgICBkZWYgcHJvbXB0X3VzZXJfcGFzc3dkKHNlbGYsIGhvc3QsIHJlYWxtKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgdGhpcyBpbiBhIEdVSSBlbnZpcm9ubWVudCEiIiIKKyAgICAgICAgaW1wb3J0IGdldHBhc3MKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdXNlciA9IHJhd19pbnB1dCgiRW50ZXIgdXNlcm5hbWUgZm9yICVzIGF0ICVzOiAiICUgKHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QpKQorICAgICAgICAgICAgcGFzc3dkID0gZ2V0cGFzcy5nZXRwYXNzKCJFbnRlciBwYXNzd29yZCBmb3IgJXMgaW4gJXMgYXQgJXM6ICIgJQorICAgICAgICAgICAgICAgICh1c2VyLCByZWFsbSwgaG9zdCkpCisgICAgICAgICAgICByZXR1cm4gdXNlciwgcGFzc3dkCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCisKKyMgVXRpbGl0eSBmdW5jdGlvbnMKKworX2xvY2FsaG9zdCA9IE5vbmUKK2RlZiBsb2NhbGhvc3QoKToKKyAgICAiIiJSZXR1cm4gdGhlIElQIGFkZHJlc3Mgb2YgdGhlIG1hZ2ljIGhvc3RuYW1lICdsb2NhbGhvc3QnLiIiIgorICAgIGdsb2JhbCBfbG9jYWxob3N0CisgICAgaWYgX2xvY2FsaG9zdCBpcyBOb25lOgorICAgICAgICBfbG9jYWxob3N0ID0gc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpCisgICAgcmV0dXJuIF9sb2NhbGhvc3QKKworX3RoaXNob3N0ID0gTm9uZQorZGVmIHRoaXNob3N0KCk6CisgICAgIiIiUmV0dXJuIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBjdXJyZW50IGhvc3QuIiIiCisgICAgZ2xvYmFsIF90aGlzaG9zdAorICAgIGlmIF90aGlzaG9zdCBpcyBOb25lOgorICAgICAgICBfdGhpc2hvc3QgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICByZXR1cm4gX3RoaXNob3N0CisKK19mdHBlcnJvcnMgPSBOb25lCitkZWYgZnRwZXJyb3JzKCk6CisgICAgIiIiUmV0dXJuIHRoZSBzZXQgb2YgZXJyb3JzIHJhaXNlZCBieSB0aGUgRlRQIGNsYXNzLiIiIgorICAgIGdsb2JhbCBfZnRwZXJyb3JzCisgICAgaWYgX2Z0cGVycm9ycyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgZnRwbGliCisgICAgICAgIF9mdHBlcnJvcnMgPSBmdHBsaWIuYWxsX2Vycm9ycworICAgIHJldHVybiBfZnRwZXJyb3JzCisKK19ub2hlYWRlcnMgPSBOb25lCitkZWYgbm9oZWFkZXJzKCk6CisgICAgIiIiUmV0dXJuIGFuIGVtcHR5IG1pbWV0b29scy5NZXNzYWdlIG9iamVjdC4iIiIKKyAgICBnbG9iYWwgX25vaGVhZGVycworICAgIGlmIF9ub2hlYWRlcnMgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IG1pbWV0b29scworICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICAgICAgX25vaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKCksIDApCisgICAgICAgIF9ub2hlYWRlcnMuZnAuY2xvc2UoKSAgICMgUmVjeWNsZSBmaWxlIGRlc2NyaXB0b3IKKyAgICByZXR1cm4gX25vaGVhZGVycworCisKKyMgVXRpbGl0eSBjbGFzc2VzCisKK2NsYXNzIGZ0cHdyYXBwZXI6CisgICAgIiIiQ2xhc3MgdXNlZCBieSBvcGVuX2Z0cCgpIGZvciBjYWNoZSBvZiBvcGVuIEZUUCBjb25uZWN0aW9ucy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VyLCBwYXNzd2QsIGhvc3QsIHBvcnQsIGRpcnMsCisgICAgICAgICAgICAgICAgIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VULAorICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50PVRydWUpOgorICAgICAgICBzZWxmLnVzZXIgPSB1c2VyCisgICAgICAgIHNlbGYucGFzc3dkID0gcGFzc3dkCisgICAgICAgIHNlbGYuaG9zdCA9IGhvc3QKKyAgICAgICAgc2VsZi5wb3J0ID0gcG9ydAorICAgICAgICBzZWxmLmRpcnMgPSBkaXJzCisgICAgICAgIHNlbGYudGltZW91dCA9IHRpbWVvdXQKKyAgICAgICAgc2VsZi5yZWZjb3VudCA9IDAKKyAgICAgICAgc2VsZi5rZWVwYWxpdmUgPSBwZXJzaXN0ZW50CisgICAgICAgIHNlbGYuaW5pdCgpCisKKyAgICBkZWYgaW5pdChzZWxmKToKKyAgICAgICAgaW1wb3J0IGZ0cGxpYgorICAgICAgICBzZWxmLmJ1c3kgPSAwCisgICAgICAgIHNlbGYuZnRwID0gZnRwbGliLkZUUCgpCisgICAgICAgIHNlbGYuZnRwLmNvbm5lY3Qoc2VsZi5ob3N0LCBzZWxmLnBvcnQsIHNlbGYudGltZW91dCkKKyAgICAgICAgc2VsZi5mdHAubG9naW4oc2VsZi51c2VyLCBzZWxmLnBhc3N3ZCkKKyAgICAgICAgZm9yIGRpciBpbiBzZWxmLmRpcnM6CisgICAgICAgICAgICBzZWxmLmZ0cC5jd2QoZGlyKQorCisgICAgZGVmIHJldHJmaWxlKHNlbGYsIGZpbGUsIHR5cGUpOgorICAgICAgICBpbXBvcnQgZnRwbGliCisgICAgICAgIHNlbGYuZW5kdHJhbnNmZXIoKQorICAgICAgICBpZiB0eXBlIGluICgnZCcsICdEJyk6IGNtZCA9ICdUWVBFIEEnOyBpc2RpciA9IDEKKyAgICAgICAgZWxzZTogY21kID0gJ1RZUEUgJyArIHR5cGU7IGlzZGlyID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZ0cC52b2lkY21kKGNtZCkKKyAgICAgICAgZXhjZXB0IGZ0cGxpYi5hbGxfZXJyb3JzOgorICAgICAgICAgICAgc2VsZi5pbml0KCkKKyAgICAgICAgICAgIHNlbGYuZnRwLnZvaWRjbWQoY21kKQorICAgICAgICBjb25uID0gTm9uZQorICAgICAgICBpZiBmaWxlIGFuZCBub3QgaXNkaXI6CisgICAgICAgICAgICAjIFRyeSB0byByZXRyaWV2ZSBhcyBhIGZpbGUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjbWQgPSAnUkVUUiAnICsgZmlsZQorICAgICAgICAgICAgICAgIGNvbm4sIHJldHJsZW4gPSBzZWxmLmZ0cC5udHJhbnNmZXJjbWQoY21kKQorICAgICAgICAgICAgZXhjZXB0IGZ0cGxpYi5lcnJvcl9wZXJtLCByZWFzb246CisgICAgICAgICAgICAgICAgaWYgc3RyKHJlYXNvbilbOjNdICE9ICc1NTAnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2Z0cCBlcnJvcicsIHJlYXNvbiksIHN5cy5leGNfaW5mbygpWzJdCisgICAgICAgIGlmIG5vdCBjb25uOgorICAgICAgICAgICAgIyBTZXQgdHJhbnNmZXIgbW9kZSB0byBBU0NJSSEKKyAgICAgICAgICAgIHNlbGYuZnRwLnZvaWRjbWQoJ1RZUEUgQScpCisgICAgICAgICAgICAjIFRyeSBhIGRpcmVjdG9yeSBsaXN0aW5nLiBWZXJpZnkgdGhhdCBkaXJlY3RvcnkgZXhpc3RzLgorICAgICAgICAgICAgaWYgZmlsZToKKyAgICAgICAgICAgICAgICBwd2QgPSBzZWxmLmZ0cC5wd2QoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mdHAuY3dkKGZpbGUpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBmdHBsaWIuZXJyb3JfcGVybSwgcmVhc29uOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSU9FcnJvciwgKCdmdHAgZXJyb3InLCByZWFzb24pLCBzeXMuZXhjX2luZm8oKVsyXQorICAgICAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnRwLmN3ZChwd2QpCisgICAgICAgICAgICAgICAgY21kID0gJ0xJU1QgJyArIGZpbGUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY21kID0gJ0xJU1QnCisgICAgICAgICAgICBjb25uLCByZXRybGVuID0gc2VsZi5mdHAubnRyYW5zZmVyY21kKGNtZCkKKyAgICAgICAgc2VsZi5idXN5ID0gMQorICAgICAgICBmdHBvYmogPSBhZGRjbG9zZWhvb2soY29ubi5tYWtlZmlsZSgncmInKSwgc2VsZi5maWxlX2Nsb3NlKQorICAgICAgICBzZWxmLnJlZmNvdW50ICs9IDEKKyAgICAgICAgY29ubi5jbG9zZSgpCisgICAgICAgICMgUGFzcyBiYWNrIGJvdGggYSBzdWl0YWJseSBkZWNvcmF0ZWQgb2JqZWN0IGFuZCBhIHJldHJpZXZhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIChmdHBvYmosIHJldHJsZW4pCisKKyAgICBkZWYgZW5kdHJhbnNmZXIoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmJ1c3k6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5idXN5ID0gMAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZ0cC52b2lkcmVzcCgpCisgICAgICAgIGV4Y2VwdCBmdHBlcnJvcnMoKToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5rZWVwYWxpdmUgPSBGYWxzZQorICAgICAgICBpZiBzZWxmLnJlZmNvdW50IDw9IDA6CisgICAgICAgICAgICBzZWxmLnJlYWxfY2xvc2UoKQorCisgICAgZGVmIGZpbGVfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZW5kdHJhbnNmZXIoKQorICAgICAgICBzZWxmLnJlZmNvdW50IC09IDEKKyAgICAgICAgaWYgc2VsZi5yZWZjb3VudCA8PSAwIGFuZCBub3Qgc2VsZi5rZWVwYWxpdmU6CisgICAgICAgICAgICBzZWxmLnJlYWxfY2xvc2UoKQorCisgICAgZGVmIHJlYWxfY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZW5kdHJhbnNmZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmZ0cC5jbG9zZSgpCisgICAgICAgIGV4Y2VwdCBmdHBlcnJvcnMoKToKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgYWRkYmFzZToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBhZGRpbmZvIGFuZCBhZGRjbG9zZWhvb2suIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnApOgorICAgICAgICBzZWxmLmZwID0gZnAKKyAgICAgICAgc2VsZi5yZWFkID0gc2VsZi5mcC5yZWFkCisgICAgICAgIHNlbGYucmVhZGxpbmUgPSBzZWxmLmZwLnJlYWRsaW5lCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5mcCwgInJlYWRsaW5lcyIpOiBzZWxmLnJlYWRsaW5lcyA9IHNlbGYuZnAucmVhZGxpbmVzCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5mcCwgImZpbGVubyIpOgorICAgICAgICAgICAgc2VsZi5maWxlbm8gPSBzZWxmLmZwLmZpbGVubworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maWxlbm8gPSBsYW1iZGE6IE5vbmUKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLmZwLCAiX19pdGVyX18iKToKKyAgICAgICAgICAgIHNlbGYuX19pdGVyX18gPSBzZWxmLmZwLl9faXRlcl9fCisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuZnAsICJuZXh0Iik6CisgICAgICAgICAgICAgICAgc2VsZi5uZXh0ID0gc2VsZi5mcC5uZXh0CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPCVzIGF0ICVyIHdob3NlIGZwID0gJXI+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKHNlbGYpLCBzZWxmLmZwKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnJlYWQgPSBOb25lCisgICAgICAgIHNlbGYucmVhZGxpbmUgPSBOb25lCisgICAgICAgIHNlbGYucmVhZGxpbmVzID0gTm9uZQorICAgICAgICBzZWxmLmZpbGVubyA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5mcDogc2VsZi5mcC5jbG9zZSgpCisgICAgICAgIHNlbGYuZnAgPSBOb25lCisKK2NsYXNzIGFkZGNsb3NlaG9vayhhZGRiYXNlKToKKyAgICAiIiJDbGFzcyB0byBhZGQgYSBjbG9zZSBob29rIHRvIGFuIG9wZW4gZmlsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgY2xvc2Vob29rLCAqaG9va2FyZ3MpOgorICAgICAgICBhZGRiYXNlLl9faW5pdF9fKHNlbGYsIGZwKQorICAgICAgICBzZWxmLmNsb3NlaG9vayA9IGNsb3NlaG9vaworICAgICAgICBzZWxmLmhvb2thcmdzID0gaG9va2FyZ3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWhvb2s6CisgICAgICAgICAgICBzZWxmLmNsb3NlaG9vaygqc2VsZi5ob29rYXJncykKKyAgICAgICAgICAgIHNlbGYuY2xvc2Vob29rID0gTm9uZQorICAgICAgICAgICAgc2VsZi5ob29rYXJncyA9IE5vbmUKKyAgICAgICAgYWRkYmFzZS5jbG9zZShzZWxmKQorCitjbGFzcyBhZGRpbmZvKGFkZGJhc2UpOgorICAgICIiImNsYXNzIHRvIGFkZCBhbiBpbmZvKCkgbWV0aG9kIHRvIGFuIG9wZW4gZmlsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgaGVhZGVycyk6CisgICAgICAgIGFkZGJhc2UuX19pbml0X18oc2VsZiwgZnApCisgICAgICAgIHNlbGYuaGVhZGVycyA9IGhlYWRlcnMKKworICAgIGRlZiBpbmZvKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5oZWFkZXJzCisKK2NsYXNzIGFkZGluZm91cmwoYWRkYmFzZSk6CisgICAgIiIiY2xhc3MgdG8gYWRkIGluZm8oKSBhbmQgZ2V0dXJsKCkgbWV0aG9kcyB0byBhbiBvcGVuIGZpbGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnAsIGhlYWRlcnMsIHVybCwgY29kZT1Ob25lKToKKyAgICAgICAgYWRkYmFzZS5fX2luaXRfXyhzZWxmLCBmcCkKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gaGVhZGVycworICAgICAgICBzZWxmLnVybCA9IHVybAorICAgICAgICBzZWxmLmNvZGUgPSBjb2RlCisKKyAgICBkZWYgaW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGVhZGVycworCisgICAgZGVmIGdldGNvZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvZGUKKworICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnVybAorCisKKyMgVXRpbGl0aWVzIHRvIHBhcnNlIFVSTHMgKG1vc3Qgb2YgdGhlc2UgcmV0dXJuIE5vbmUgZm9yIG1pc3NpbmcgcGFydHMpOgorIyB1bndyYXAoJzxVUkw6dHlwZTovL2hvc3QvcGF0aD4nKSAtLT4gJ3R5cGU6Ly9ob3N0L3BhdGgnCisjIHNwbGl0dHlwZSgndHlwZTpvcGFxdWVzdHJpbmcnKSAtLT4gJ3R5cGUnLCAnb3BhcXVlc3RyaW5nJworIyBzcGxpdGhvc3QoJy8vaG9zdFs6cG9ydF0vcGF0aCcpIC0tPiAnaG9zdFs6cG9ydF0nLCAnL3BhdGgnCisjIHNwbGl0dXNlcigndXNlcls6cGFzc3dkXUBob3N0Wzpwb3J0XScpIC0tPiAndXNlcls6cGFzc3dkXScsICdob3N0Wzpwb3J0XScKKyMgc3BsaXRwYXNzd2QoJ3VzZXI6cGFzc3dkJykgLT4gJ3VzZXInLCAncGFzc3dkJworIyBzcGxpdHBvcnQoJ2hvc3Q6cG9ydCcpIC0tPiAnaG9zdCcsICdwb3J0JworIyBzcGxpdHF1ZXJ5KCcvcGF0aD9xdWVyeScpIC0tPiAnL3BhdGgnLCAncXVlcnknCisjIHNwbGl0dGFnKCcvcGF0aCN0YWcnKSAtLT4gJy9wYXRoJywgJ3RhZycKKyMgc3BsaXRhdHRyKCcvcGF0aDthdHRyMT12YWx1ZTE7YXR0cjI9dmFsdWUyOy4uLicpIC0+CisjICAgJy9wYXRoJywgWydhdHRyMT12YWx1ZTEnLCAnYXR0cjI9dmFsdWUyJywgLi4uXQorIyBzcGxpdHZhbHVlKCdhdHRyPXZhbHVlJykgLS0+ICdhdHRyJywgJ3ZhbHVlJworIyB1bnF1b3RlKCdhYmMlMjBkZWYnKSAtPiAnYWJjIGRlZicKKyMgcXVvdGUoJ2FiYyBkZWYnKSAtPiAnYWJjJTIwZGVmJykKKwordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgZGVmIF9pc191bmljb2RlKHgpOgorICAgICAgICByZXR1cm4gMAorZWxzZToKKyAgICBkZWYgX2lzX3VuaWNvZGUoeCk6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKHgsIHVuaWNvZGUpCisKK2RlZiB0b0J5dGVzKHVybCk6CisgICAgIiIidG9CeXRlcyh1IlVSTCIpIC0tPiAnVVJMJy4iIiIKKyAgICAjIE1vc3QgVVJMIHNjaGVtZXMgcmVxdWlyZSBBU0NJSS4gSWYgdGhhdCBjaGFuZ2VzLCB0aGUgY29udmVyc2lvbgorICAgICMgY2FuIGJlIHJlbGF4ZWQKKyAgICBpZiBfaXNfdW5pY29kZSh1cmwpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB1cmwgPSB1cmwuZW5jb2RlKCJBU0NJSSIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIlVSTCAiICsgcmVwcih1cmwpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGNvbnRhaW5zIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIikKKyAgICByZXR1cm4gdXJsCisKK2RlZiB1bndyYXAodXJsKToKKyAgICAiIiJ1bndyYXAoJzxVUkw6dHlwZTovL2hvc3QvcGF0aD4nKSAtLT4gJ3R5cGU6Ly9ob3N0L3BhdGgnLiIiIgorICAgIHVybCA9IHVybC5zdHJpcCgpCisgICAgaWYgdXJsWzoxXSA9PSAnPCcgYW5kIHVybFstMTpdID09ICc+JzoKKyAgICAgICAgdXJsID0gdXJsWzE6LTFdLnN0cmlwKCkKKyAgICBpZiB1cmxbOjRdID09ICdVUkw6JzogdXJsID0gdXJsWzQ6XS5zdHJpcCgpCisgICAgcmV0dXJuIHVybAorCitfdHlwZXByb2cgPSBOb25lCitkZWYgc3BsaXR0eXBlKHVybCk6CisgICAgIiIic3BsaXR0eXBlKCd0eXBlOm9wYXF1ZXN0cmluZycpIC0tPiAndHlwZScsICdvcGFxdWVzdHJpbmcnLiIiIgorICAgIGdsb2JhbCBfdHlwZXByb2cKKyAgICBpZiBfdHlwZXByb2cgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIF90eXBlcHJvZyA9IHJlLmNvbXBpbGUoJ14oW14vOl0rKTonKQorCisgICAgbWF0Y2ggPSBfdHlwZXByb2cubWF0Y2godXJsKQorICAgIGlmIG1hdGNoOgorICAgICAgICBzY2hlbWUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICByZXR1cm4gc2NoZW1lLmxvd2VyKCksIHVybFtsZW4oc2NoZW1lKSArIDE6XQorICAgIHJldHVybiBOb25lLCB1cmwKKworX2hvc3Rwcm9nID0gTm9uZQorZGVmIHNwbGl0aG9zdCh1cmwpOgorICAgICIiInNwbGl0aG9zdCgnLy9ob3N0Wzpwb3J0XS9wYXRoJykgLS0+ICdob3N0Wzpwb3J0XScsICcvcGF0aCcuIiIiCisgICAgZ2xvYmFsIF9ob3N0cHJvZworICAgIGlmIF9ob3N0cHJvZyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgX2hvc3Rwcm9nID0gcmUuY29tcGlsZSgnXi8vKFteLz9dKikoLiopJCcpCisKKyAgICBtYXRjaCA9IF9ob3N0cHJvZy5tYXRjaCh1cmwpCisgICAgaWYgbWF0Y2g6CisgICAgICAgIGhvc3RfcG9ydCA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIHBhdGggPSBtYXRjaC5ncm91cCgyKQorICAgICAgICBpZiBwYXRoIGFuZCBub3QgcGF0aC5zdGFydHN3aXRoKCcvJyk6CisgICAgICAgICAgICBwYXRoID0gJy8nICsgcGF0aAorICAgICAgICByZXR1cm4gaG9zdF9wb3J0LCBwYXRoCisgICAgcmV0dXJuIE5vbmUsIHVybAorCitfdXNlcnByb2cgPSBOb25lCitkZWYgc3BsaXR1c2VyKGhvc3QpOgorICAgICIiInNwbGl0dXNlcigndXNlcls6cGFzc3dkXUBob3N0Wzpwb3J0XScpIC0tPiAndXNlcls6cGFzc3dkXScsICdob3N0Wzpwb3J0XScuIiIiCisgICAgZ2xvYmFsIF91c2VycHJvZworICAgIGlmIF91c2VycHJvZyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgX3VzZXJwcm9nID0gcmUuY29tcGlsZSgnXiguKilAKC4qKSQnKQorCisgICAgbWF0Y2ggPSBfdXNlcnByb2cubWF0Y2goaG9zdCkKKyAgICBpZiBtYXRjaDogcmV0dXJuIG1hdGNoLmdyb3VwKDEsIDIpCisgICAgcmV0dXJuIE5vbmUsIGhvc3QKKworX3Bhc3N3ZHByb2cgPSBOb25lCitkZWYgc3BsaXRwYXNzd2QodXNlcik6CisgICAgIiIic3BsaXRwYXNzd2QoJ3VzZXI6cGFzc3dkJykgLT4gJ3VzZXInLCAncGFzc3dkJy4iIiIKKyAgICBnbG9iYWwgX3Bhc3N3ZHByb2cKKyAgICBpZiBfcGFzc3dkcHJvZyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgX3Bhc3N3ZHByb2cgPSByZS5jb21waWxlKCdeKFteOl0qKTooLiopJCcscmUuUykKKworICAgIG1hdGNoID0gX3Bhc3N3ZHByb2cubWF0Y2godXNlcikKKyAgICBpZiBtYXRjaDogcmV0dXJuIG1hdGNoLmdyb3VwKDEsIDIpCisgICAgcmV0dXJuIHVzZXIsIE5vbmUKKworIyBzcGxpdHRhZygnL3BhdGgjdGFnJykgLS0+ICcvcGF0aCcsICd0YWcnCitfcG9ydHByb2cgPSBOb25lCitkZWYgc3BsaXRwb3J0KGhvc3QpOgorICAgICIiInNwbGl0cG9ydCgnaG9zdDpwb3J0JykgLS0+ICdob3N0JywgJ3BvcnQnLiIiIgorICAgIGdsb2JhbCBfcG9ydHByb2cKKyAgICBpZiBfcG9ydHByb2cgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJlCisgICAgICAgIF9wb3J0cHJvZyA9IHJlLmNvbXBpbGUoJ14oLiopOihbMC05XSspJCcpCisKKyAgICBtYXRjaCA9IF9wb3J0cHJvZy5tYXRjaChob3N0KQorICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICByZXR1cm4gaG9zdCwgTm9uZQorCitfbnBvcnRwcm9nID0gTm9uZQorZGVmIHNwbGl0bnBvcnQoaG9zdCwgZGVmcG9ydD0tMSk6CisgICAgIiIiU3BsaXQgaG9zdCBhbmQgcG9ydCwgcmV0dXJuaW5nIG51bWVyaWMgcG9ydC4KKyAgICBSZXR1cm4gZ2l2ZW4gZGVmYXVsdCBwb3J0IGlmIG5vICc6JyBmb3VuZDsgZGVmYXVsdHMgdG8gLTEuCisgICAgUmV0dXJuIG51bWVyaWNhbCBwb3J0IGlmIGEgdmFsaWQgbnVtYmVyIGFyZSBmb3VuZCBhZnRlciAnOicuCisgICAgUmV0dXJuIE5vbmUgaWYgJzonIGJ1dCBub3QgYSB2YWxpZCBudW1iZXIuIiIiCisgICAgZ2xvYmFsIF9ucG9ydHByb2cKKyAgICBpZiBfbnBvcnRwcm9nIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfbnBvcnRwcm9nID0gcmUuY29tcGlsZSgnXiguKik6KC4qKSQnKQorCisgICAgbWF0Y2ggPSBfbnBvcnRwcm9nLm1hdGNoKGhvc3QpCisgICAgaWYgbWF0Y2g6CisgICAgICAgIGhvc3QsIHBvcnQgPSBtYXRjaC5ncm91cCgxLCAyKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgcG9ydDogcmFpc2UgVmFsdWVFcnJvciwgIm5vIGRpZ2l0cyIKKyAgICAgICAgICAgIG5wb3J0ID0gaW50KHBvcnQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgbnBvcnQgPSBOb25lCisgICAgICAgIHJldHVybiBob3N0LCBucG9ydAorICAgIHJldHVybiBob3N0LCBkZWZwb3J0CisKK19xdWVyeXByb2cgPSBOb25lCitkZWYgc3BsaXRxdWVyeSh1cmwpOgorICAgICIiInNwbGl0cXVlcnkoJy9wYXRoP3F1ZXJ5JykgLS0+ICcvcGF0aCcsICdxdWVyeScuIiIiCisgICAgZ2xvYmFsIF9xdWVyeXByb2cKKyAgICBpZiBfcXVlcnlwcm9nIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfcXVlcnlwcm9nID0gcmUuY29tcGlsZSgnXiguKilcPyhbXj9dKikkJykKKworICAgIG1hdGNoID0gX3F1ZXJ5cHJvZy5tYXRjaCh1cmwpCisgICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQorICAgIHJldHVybiB1cmwsIE5vbmUKKworX3RhZ3Byb2cgPSBOb25lCitkZWYgc3BsaXR0YWcodXJsKToKKyAgICAiIiJzcGxpdHRhZygnL3BhdGgjdGFnJykgLS0+ICcvcGF0aCcsICd0YWcnLiIiIgorICAgIGdsb2JhbCBfdGFncHJvZworICAgIGlmIF90YWdwcm9nIGlzIE5vbmU6CisgICAgICAgIGltcG9ydCByZQorICAgICAgICBfdGFncHJvZyA9IHJlLmNvbXBpbGUoJ14oLiopIyhbXiNdKikkJykKKworICAgIG1hdGNoID0gX3RhZ3Byb2cubWF0Y2godXJsKQorICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICByZXR1cm4gdXJsLCBOb25lCisKK2RlZiBzcGxpdGF0dHIodXJsKToKKyAgICAiIiJzcGxpdGF0dHIoJy9wYXRoO2F0dHIxPXZhbHVlMTthdHRyMj12YWx1ZTI7Li4uJykgLT4KKyAgICAgICAgJy9wYXRoJywgWydhdHRyMT12YWx1ZTEnLCAnYXR0cjI9dmFsdWUyJywgLi4uXS4iIiIKKyAgICB3b3JkcyA9IHVybC5zcGxpdCgnOycpCisgICAgcmV0dXJuIHdvcmRzWzBdLCB3b3Jkc1sxOl0KKworX3ZhbHVlcHJvZyA9IE5vbmUKK2RlZiBzcGxpdHZhbHVlKGF0dHIpOgorICAgICIiInNwbGl0dmFsdWUoJ2F0dHI9dmFsdWUnKSAtLT4gJ2F0dHInLCAndmFsdWUnLiIiIgorICAgIGdsb2JhbCBfdmFsdWVwcm9nCisgICAgaWYgX3ZhbHVlcHJvZyBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgX3ZhbHVlcHJvZyA9IHJlLmNvbXBpbGUoJ14oW149XSopPSguKikkJykKKworICAgIG1hdGNoID0gX3ZhbHVlcHJvZy5tYXRjaChhdHRyKQorICAgIGlmIG1hdGNoOiByZXR1cm4gbWF0Y2guZ3JvdXAoMSwgMikKKyAgICByZXR1cm4gYXR0ciwgTm9uZQorCisjIHVybHBhcnNlIGNvbnRhaW5zIGEgZHVwbGljYXRlIG9mIHRoaXMgbWV0aG9kIHRvIGF2b2lkIGEgY2lyY3VsYXIgaW1wb3J0LiAgSWYKKyMgeW91IHVwZGF0ZSB0aGlzIG1ldGhvZCwgYWxzbyB1cGRhdGUgdGhlIGNvcHkgaW4gdXJscGFyc2UuICBUaGlzIGNvZGUKKyMgZHVwbGljYXRpb24gZG9lcyBub3QgZXhpc3QgaW4gUHl0aG9uMy4KKworX2hleGRpZyA9ICcwMTIzNDU2Nzg5QUJDREVGYWJjZGVmJworX2hleHRvY2hyID0gZGljdCgoYSArIGIsIGNocihpbnQoYSArIGIsIDE2KSkpCisgICAgICAgICAgICAgICAgIGZvciBhIGluIF9oZXhkaWcgZm9yIGIgaW4gX2hleGRpZykKK19hc2NpaXJlID0gcmUuY29tcGlsZSgnKFtceDAwLVx4N2ZdKyknKQorCitkZWYgdW5xdW90ZShzKToKKyAgICAiIiJ1bnF1b3RlKCdhYmMlMjBkZWYnKSAtPiAnYWJjIGRlZicuIiIiCisgICAgaWYgX2lzX3VuaWNvZGUocyk6CisgICAgICAgIGlmICclJyBub3QgaW4gczoKKyAgICAgICAgICAgIHJldHVybiBzCisgICAgICAgIGJpdHMgPSBfYXNjaWlyZS5zcGxpdChzKQorICAgICAgICByZXMgPSBbYml0c1swXV0KKyAgICAgICAgYXBwZW5kID0gcmVzLmFwcGVuZAorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oYml0cyksIDIpOgorICAgICAgICAgICAgYXBwZW5kKHVucXVvdGUoc3RyKGJpdHNbaV0pKS5kZWNvZGUoJ2xhdGluMScpKQorICAgICAgICAgICAgYXBwZW5kKGJpdHNbaSArIDFdKQorICAgICAgICByZXR1cm4gJycuam9pbihyZXMpCisKKyAgICBiaXRzID0gcy5zcGxpdCgnJScpCisgICAgIyBmYXN0cGF0aAorICAgIGlmIGxlbihiaXRzKSA9PSAxOgorICAgICAgICByZXR1cm4gcworICAgIHJlcyA9IFtiaXRzWzBdXQorICAgIGFwcGVuZCA9IHJlcy5hcHBlbmQKKyAgICBmb3IgaXRlbSBpbiBiaXRzWzE6XToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgYXBwZW5kKF9oZXh0b2NocltpdGVtWzoyXV0pCisgICAgICAgICAgICBhcHBlbmQoaXRlbVsyOl0pCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGFwcGVuZCgnJScpCisgICAgICAgICAgICBhcHBlbmQoaXRlbSkKKyAgICByZXR1cm4gJycuam9pbihyZXMpCisKK2RlZiB1bnF1b3RlX3BsdXMocyk6CisgICAgIiIidW5xdW90ZSgnJTdlL2FiYytkZWYnKSAtPiAnfi9hYmMgZGVmJyIiIgorICAgIHMgPSBzLnJlcGxhY2UoJysnLCAnICcpCisgICAgcmV0dXJuIHVucXVvdGUocykKKworYWx3YXlzX3NhZmUgPSAoJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworICAgICAgICAgICAgICAgJ2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6JworICAgICAgICAgICAgICAgJzAxMjM0NTY3ODknICdfLi0nKQorX3NhZmVfbWFwID0ge30KK2ZvciBpLCBjIGluIHppcCh4cmFuZ2UoMjU2KSwgc3RyKGJ5dGVhcnJheSh4cmFuZ2UoMjU2KSkpKToKKyAgICBfc2FmZV9tYXBbY10gPSBjIGlmIChpIDwgMTI4IGFuZCBjIGluIGFsd2F5c19zYWZlKSBlbHNlICclezowMlh9Jy5mb3JtYXQoaSkKK19zYWZlX3F1b3RlcnMgPSB7fQorCitkZWYgcXVvdGUocywgc2FmZT0nLycpOgorICAgICIiInF1b3RlKCdhYmMgZGVmJykgLT4gJ2FiYyUyMGRlZicKKworICAgIEVhY2ggcGFydCBvZiBhIFVSTCwgZS5nLiB0aGUgcGF0aCBpbmZvLCB0aGUgcXVlcnksIGV0Yy4sIGhhcyBhCisgICAgZGlmZmVyZW50IHNldCBvZiByZXNlcnZlZCBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBiZSBxdW90ZWQuCisKKyAgICBSRkMgMjM5NiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXJzIChVUkkpOiBHZW5lcmljIFN5bnRheCBsaXN0cworICAgIHRoZSBmb2xsb3dpbmcgcmVzZXJ2ZWQgY2hhcmFjdGVycy4KKworICAgIHJlc2VydmVkICAgID0gIjsiIHwgIi8iIHwgIj8iIHwgIjoiIHwgIkAiIHwgIiYiIHwgIj0iIHwgIisiIHwKKyAgICAgICAgICAgICAgICAgICIkIiB8ICIsIgorCisgICAgRWFjaCBvZiB0aGVzZSBjaGFyYWN0ZXJzIGlzIHJlc2VydmVkIGluIHNvbWUgY29tcG9uZW50IG9mIGEgVVJMLAorICAgIGJ1dCBub3QgbmVjZXNzYXJpbHkgaW4gYWxsIG9mIHRoZW0uCisKKyAgICBCeSBkZWZhdWx0LCB0aGUgcXVvdGUgZnVuY3Rpb24gaXMgaW50ZW5kZWQgZm9yIHF1b3RpbmcgdGhlIHBhdGgKKyAgICBzZWN0aW9uIG9mIGEgVVJMLiAgVGh1cywgaXQgd2lsbCBub3QgZW5jb2RlICcvJy4gIFRoaXMgY2hhcmFjdGVyCisgICAgaXMgcmVzZXJ2ZWQsIGJ1dCBpbiB0eXBpY2FsIHVzYWdlIHRoZSBxdW90ZSBmdW5jdGlvbiBpcyBiZWluZworICAgIGNhbGxlZCBvbiBhIHBhdGggd2hlcmUgdGhlIGV4aXN0aW5nIHNsYXNoIGNoYXJhY3RlcnMgYXJlIHVzZWQgYXMKKyAgICByZXNlcnZlZCBjaGFyYWN0ZXJzLgorICAgICIiIgorICAgICMgZmFzdHBhdGgKKyAgICBpZiBub3QgczoKKyAgICAgICAgaWYgcyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdOb25lIG9iamVjdCBjYW5ub3QgYmUgcXVvdGVkJykKKyAgICAgICAgcmV0dXJuIHMKKyAgICBjYWNoZWtleSA9IChzYWZlLCBhbHdheXNfc2FmZSkKKyAgICB0cnk6CisgICAgICAgIChxdW90ZXIsIHNhZmUpID0gX3NhZmVfcXVvdGVyc1tjYWNoZWtleV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIHNhZmVfbWFwID0gX3NhZmVfbWFwLmNvcHkoKQorICAgICAgICBzYWZlX21hcC51cGRhdGUoWyhjLCBjKSBmb3IgYyBpbiBzYWZlXSkKKyAgICAgICAgcXVvdGVyID0gc2FmZV9tYXAuX19nZXRpdGVtX18KKyAgICAgICAgc2FmZSA9IGFsd2F5c19zYWZlICsgc2FmZQorICAgICAgICBfc2FmZV9xdW90ZXJzW2NhY2hla2V5XSA9IChxdW90ZXIsIHNhZmUpCisgICAgaWYgbm90IHMucnN0cmlwKHNhZmUpOgorICAgICAgICByZXR1cm4gcworICAgIHJldHVybiAnJy5qb2luKG1hcChxdW90ZXIsIHMpKQorCitkZWYgcXVvdGVfcGx1cyhzLCBzYWZlPScnKToKKyAgICAiIiJRdW90ZSB0aGUgcXVlcnkgZnJhZ21lbnQgb2YgYSBVUkw7IHJlcGxhY2luZyAnICcgd2l0aCAnKyciIiIKKyAgICBpZiAnICcgaW4gczoKKyAgICAgICAgcyA9IHF1b3RlKHMsIHNhZmUgKyAnICcpCisgICAgICAgIHJldHVybiBzLnJlcGxhY2UoJyAnLCAnKycpCisgICAgcmV0dXJuIHF1b3RlKHMsIHNhZmUpCisKK2RlZiB1cmxlbmNvZGUocXVlcnksIGRvc2VxPTApOgorICAgICIiIkVuY29kZSBhIHNlcXVlbmNlIG9mIHR3by1lbGVtZW50IHR1cGxlcyBvciBkaWN0aW9uYXJ5IGludG8gYSBVUkwgcXVlcnkgc3RyaW5nLgorCisgICAgSWYgYW55IHZhbHVlcyBpbiB0aGUgcXVlcnkgYXJnIGFyZSBzZXF1ZW5jZXMgYW5kIGRvc2VxIGlzIHRydWUsIGVhY2gKKyAgICBzZXF1ZW5jZSBlbGVtZW50IGlzIGNvbnZlcnRlZCB0byBhIHNlcGFyYXRlIHBhcmFtZXRlci4KKworICAgIElmIHRoZSBxdWVyeSBhcmcgaXMgYSBzZXF1ZW5jZSBvZiB0d28tZWxlbWVudCB0dXBsZXMsIHRoZSBvcmRlciBvZiB0aGUKKyAgICBwYXJhbWV0ZXJzIGluIHRoZSBvdXRwdXQgd2lsbCBtYXRjaCB0aGUgb3JkZXIgb2YgcGFyYW1ldGVycyBpbiB0aGUKKyAgICBpbnB1dC4KKyAgICAiIiIKKworICAgIGlmIGhhc2F0dHIocXVlcnksIml0ZW1zIik6CisgICAgICAgICMgbWFwcGluZyBvYmplY3RzCisgICAgICAgIHF1ZXJ5ID0gcXVlcnkuaXRlbXMoKQorICAgIGVsc2U6CisgICAgICAgICMgaXQncyBhIGJvdGhlciBhdCB0aW1lcyB0aGF0IHN0cmluZ3MgYW5kIHN0cmluZy1saWtlIG9iamVjdHMgYXJlCisgICAgICAgICMgc2VxdWVuY2VzLi4uCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgbm9uLXNlcXVlbmNlIGl0ZW1zIHNob3VsZCBub3Qgd29yayB3aXRoIGxlbigpCisgICAgICAgICAgICAjIG5vbi1lbXB0eSBzdHJpbmdzIHdpbGwgZmFpbCB0aGlzCisgICAgICAgICAgICBpZiBsZW4ocXVlcnkpIGFuZCBub3QgaXNpbnN0YW5jZShxdWVyeVswXSwgdHVwbGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcgorICAgICAgICAgICAgIyB6ZXJvLWxlbmd0aCBzZXF1ZW5jZXMgb2YgYWxsIHR5cGVzIHdpbGwgZ2V0IGhlcmUgYW5kIHN1Y2NlZWQsCisgICAgICAgICAgICAjIGJ1dCB0aGF0J3MgYSBtaW5vciBuaXQgLSBzaW5jZSB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICMgYWxsb3dlZCBlbXB0eSBkaWN0cyB0aGF0IHR5cGUgb2YgYmVoYXZpb3IgcHJvYmFibHkgc2hvdWxkIGJlCisgICAgICAgICAgICAjIHByZXNlcnZlZCBmb3IgY29uc2lzdGVuY3kKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHR5LHZhLHRiID0gc3lzLmV4Y19pbmZvKCkKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIm5vdCBhIHZhbGlkIG5vbi1zdHJpbmcgc2VxdWVuY2Ugb3IgbWFwcGluZyBvYmplY3QiLCB0YgorCisgICAgbCA9IFtdCisgICAgaWYgbm90IGRvc2VxOgorICAgICAgICAjIHByZXNlcnZlIG9sZCBiZWhhdmlvcgorICAgICAgICBmb3IgaywgdiBpbiBxdWVyeToKKyAgICAgICAgICAgIGsgPSBxdW90ZV9wbHVzKHN0cihrKSkKKyAgICAgICAgICAgIHYgPSBxdW90ZV9wbHVzKHN0cih2KSkKKyAgICAgICAgICAgIGwuYXBwZW5kKGsgKyAnPScgKyB2KQorICAgIGVsc2U6CisgICAgICAgIGZvciBrLCB2IGluIHF1ZXJ5OgorICAgICAgICAgICAgayA9IHF1b3RlX3BsdXMoc3RyKGspKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgorICAgICAgICAgICAgICAgIHYgPSBxdW90ZV9wbHVzKHYpCisgICAgICAgICAgICAgICAgbC5hcHBlbmQoayArICc9JyArIHYpCisgICAgICAgICAgICBlbGlmIF9pc191bmljb2RlKHYpOgorICAgICAgICAgICAgICAgICMgaXMgdGhlcmUgYSByZWFzb25hYmxlIHdheSB0byBjb252ZXJ0IHRvIEFTQ0lJPworICAgICAgICAgICAgICAgICMgZW5jb2RlIGdlbmVyYXRlcyBhIHN0cmluZywgYnV0ICJyZXBsYWNlIiBvciAiaWdub3JlIgorICAgICAgICAgICAgICAgICMgbG9zZSBpbmZvcm1hdGlvbiBhbmQgInN0cmljdCIgY2FuIHJhaXNlIFVuaWNvZGVFcnJvcgorICAgICAgICAgICAgICAgIHYgPSBxdW90ZV9wbHVzKHYuZW5jb2RlKCJBU0NJSSIsInJlcGxhY2UiKSkKKyAgICAgICAgICAgICAgICBsLmFwcGVuZChrICsgJz0nICsgdikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAjIGlzIHRoaXMgYSBzdWZmaWNpZW50IHRlc3QgZm9yIHNlcXVlbmNlLW5lc3M/CisgICAgICAgICAgICAgICAgICAgIGxlbih2KQorICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgbm90IGEgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgdiA9IHF1b3RlX3BsdXMoc3RyKHYpKQorICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZChrICsgJz0nICsgdikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIGxvb3Agb3ZlciB0aGUgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICAgICAgZm9yIGVsdCBpbiB2OgorICAgICAgICAgICAgICAgICAgICAgICAgbC5hcHBlbmQoayArICc9JyArIHF1b3RlX3BsdXMoc3RyKGVsdCkpKQorICAgIHJldHVybiAnJicuam9pbihsKQorCisjIFByb3h5IGhhbmRsaW5nCitkZWYgZ2V0cHJveGllc19lbnZpcm9ubWVudCgpOgorICAgICIiIlJldHVybiBhIGRpY3Rpb25hcnkgb2Ygc2NoZW1lIC0+IHByb3h5IHNlcnZlciBVUkwgbWFwcGluZ3MuCisKKyAgICBTY2FuIHRoZSBlbnZpcm9ubWVudCBmb3IgdmFyaWFibGVzIG5hbWVkIDxzY2hlbWU+X3Byb3h5OworICAgIHRoaXMgc2VlbXMgdG8gYmUgdGhlIHN0YW5kYXJkIGNvbnZlbnRpb24uICBJZiB5b3UgbmVlZCBhCisgICAgZGlmZmVyZW50IHdheSwgeW91IGNhbiBwYXNzIGEgcHJveGllcyBkaWN0aW9uYXJ5IHRvIHRoZQorICAgIFtGYW5jeV1VUkxvcGVuZXIgY29uc3RydWN0b3IuCisKKyAgICAiIiIKKyAgICBwcm94aWVzID0ge30KKyAgICBmb3IgbmFtZSwgdmFsdWUgaW4gb3MuZW52aXJvbi5pdGVtcygpOgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGlmIHZhbHVlIGFuZCBuYW1lWy02Ol0gPT0gJ19wcm94eSc6CisgICAgICAgICAgICBwcm94aWVzW25hbWVbOi02XV0gPSB2YWx1ZQorICAgIHJldHVybiBwcm94aWVzCisKK2RlZiBwcm94eV9ieXBhc3NfZW52aXJvbm1lbnQoaG9zdCk6CisgICAgIiIiVGVzdCBpZiBwcm94aWVzIHNob3VsZCBub3QgYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIGhvc3QuCisKKyAgICBDaGVja3MgdGhlIGVudmlyb25tZW50IGZvciBhIHZhcmlhYmxlIG5hbWVkIG5vX3Byb3h5LCB3aGljaCBzaG91bGQKKyAgICBiZSBhIGxpc3Qgb2YgRE5TIHN1ZmZpeGVzIHNlcGFyYXRlZCBieSBjb21tYXMsIG9yICcqJyBmb3IgYWxsIGhvc3RzLgorICAgICIiIgorICAgIG5vX3Byb3h5ID0gb3MuZW52aXJvbi5nZXQoJ25vX3Byb3h5JywgJycpIG9yIG9zLmVudmlyb24uZ2V0KCdOT19QUk9YWScsICcnKQorICAgICMgJyonIGlzIHNwZWNpYWwgY2FzZSBmb3IgYWx3YXlzIGJ5cGFzcworICAgIGlmIG5vX3Byb3h5ID09ICcqJzoKKyAgICAgICAgcmV0dXJuIDEKKyAgICAjIHN0cmlwIHBvcnQgb2ZmIGhvc3QKKyAgICBob3N0b25seSwgcG9ydCA9IHNwbGl0cG9ydChob3N0KQorICAgICMgY2hlY2sgaWYgdGhlIGhvc3QgZW5kcyB3aXRoIGFueSBvZiB0aGUgRE5TIHN1ZmZpeGVzCisgICAgbm9fcHJveHlfbGlzdCA9IFtwcm94eS5zdHJpcCgpIGZvciBwcm94eSBpbiBub19wcm94eS5zcGxpdCgnLCcpXQorICAgIGZvciBuYW1lIGluIG5vX3Byb3h5X2xpc3Q6CisgICAgICAgIGlmIG5hbWUgYW5kIChob3N0b25seS5lbmRzd2l0aChuYW1lKSBvciBob3N0LmVuZHN3aXRoKG5hbWUpKToKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgIyBvdGhlcndpc2UsIGRvbid0IGJ5cGFzcworICAgIHJldHVybiAwCisKKworaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nOgorICAgIGZyb20gX3NjcHJveHkgaW1wb3J0IF9nZXRfcHJveHlfc2V0dGluZ3MsIF9nZXRfcHJveGllcworCisgICAgZGVmIHByb3h5X2J5cGFzc19tYWNvc3hfc3lzY29uZihob3N0KToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBUcnVlIGlmZiB0aGlzIGhvc3Qgc2hvdWxkbid0IGJlIGFjY2Vzc2VkIHVzaW5nIGEgcHJveHkKKworICAgICAgICBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhlIE1hY09TWCBmcmFtZXdvcmsgU3lzdGVtQ29uZmlndXJhdGlvbgorICAgICAgICB0byBmZXRjaCB0aGUgcHJveHkgaW5mb3JtYXRpb24uCisgICAgICAgICIiIgorICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgaW1wb3J0IHNvY2tldAorICAgICAgICBmcm9tIGZubWF0Y2ggaW1wb3J0IGZubWF0Y2gKKworICAgICAgICBob3N0b25seSwgcG9ydCA9IHNwbGl0cG9ydChob3N0KQorCisgICAgICAgIGRlZiBpcDJudW0oaXBBZGRyKToKKyAgICAgICAgICAgIHBhcnRzID0gaXBBZGRyLnNwbGl0KCcuJykKKyAgICAgICAgICAgIHBhcnRzID0gbWFwKGludCwgcGFydHMpCisgICAgICAgICAgICBpZiBsZW4ocGFydHMpICE9IDQ6CisgICAgICAgICAgICAgICAgcGFydHMgPSAocGFydHMgKyBbMCwgMCwgMCwgMF0pWzo0XQorICAgICAgICAgICAgcmV0dXJuIChwYXJ0c1swXSA8PCAyNCkgfCAocGFydHNbMV0gPDwgMTYpIHwgKHBhcnRzWzJdIDw8IDgpIHwgcGFydHNbM10KKworICAgICAgICBwcm94eV9zZXR0aW5ncyA9IF9nZXRfcHJveHlfc2V0dGluZ3MoKQorCisgICAgICAgICMgQ2hlY2sgZm9yIHNpbXBsZSBob3N0IG5hbWVzOgorICAgICAgICBpZiAnLicgbm90IGluIGhvc3Q6CisgICAgICAgICAgICBpZiBwcm94eV9zZXR0aW5nc1snZXhjbHVkZV9zaW1wbGUnXToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIGhvc3RJUCA9IE5vbmUKKworICAgICAgICBmb3IgdmFsdWUgaW4gcHJveHlfc2V0dGluZ3MuZ2V0KCdleGNlcHRpb25zJywgKCkpOgorICAgICAgICAgICAgIyBJdGVtcyBpbiB0aGUgbGlzdCBhcmUgc3RyaW5ncyBsaWtlIHRoZXNlOiAqLmxvY2FsLCAxNjkuMjU0LzE2CisgICAgICAgICAgICBpZiBub3QgdmFsdWU6IGNvbnRpbnVlCisKKyAgICAgICAgICAgIG0gPSByZS5tYXRjaChyIihcZCsoPzpcLlxkKykqKSgvXGQrKT8iLCB2YWx1ZSkKKyAgICAgICAgICAgIGlmIG0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgaG9zdElQIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RJUCA9IHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3Rvbmx5KQorICAgICAgICAgICAgICAgICAgICAgICAgaG9zdElQID0gaXAybnVtKGhvc3RJUCkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICBiYXNlID0gaXAybnVtKG0uZ3JvdXAoMSkpCisgICAgICAgICAgICAgICAgbWFzayA9IG0uZ3JvdXAoMikKKyAgICAgICAgICAgICAgICBpZiBtYXNrIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSA4ICogKG0uZ3JvdXAoMSkuY291bnQoJy4nKSArIDEpCisKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtYXNrID0gaW50KG1hc2tbMTpdKQorICAgICAgICAgICAgICAgIG1hc2sgPSAzMiAtIG1hc2sKKworICAgICAgICAgICAgICAgIGlmIChob3N0SVAgPj4gbWFzaykgPT0gKGJhc2UgPj4gbWFzayk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgICAgIGVsaWYgZm5tYXRjaChob3N0LCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBnZXRwcm94aWVzX21hY29zeF9zeXNjb25mKCk6CisgICAgICAgICIiIlJldHVybiBhIGRpY3Rpb25hcnkgb2Ygc2NoZW1lIC0+IHByb3h5IHNlcnZlciBVUkwgbWFwcGluZ3MuCisKKyAgICAgICAgVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBNYWNPU1ggZnJhbWV3b3JrIFN5c3RlbUNvbmZpZ3VyYXRpb24KKyAgICAgICAgdG8gZmV0Y2ggdGhlIHByb3h5IGluZm9ybWF0aW9uLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIF9nZXRfcHJveGllcygpCisKKyAgICBkZWYgcHJveHlfYnlwYXNzKGhvc3QpOgorICAgICAgICBpZiBnZXRwcm94aWVzX2Vudmlyb25tZW50KCk6CisgICAgICAgICAgICByZXR1cm4gcHJveHlfYnlwYXNzX2Vudmlyb25tZW50KGhvc3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcHJveHlfYnlwYXNzX21hY29zeF9zeXNjb25mKGhvc3QpCisKKyAgICBkZWYgZ2V0cHJveGllcygpOgorICAgICAgICByZXR1cm4gZ2V0cHJveGllc19lbnZpcm9ubWVudCgpIG9yIGdldHByb3hpZXNfbWFjb3N4X3N5c2NvbmYoKQorCitlbGlmIG9zLm5hbWUgPT0gJ250JzoKKyAgICBkZWYgZ2V0cHJveGllc19yZWdpc3RyeSgpOgorICAgICAgICAiIiJSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIHNjaGVtZSAtPiBwcm94eSBzZXJ2ZXIgVVJMIG1hcHBpbmdzLgorCisgICAgICAgIFdpbjMyIHVzZXMgdGhlIHJlZ2lzdHJ5IHRvIHN0b3JlIHByb3hpZXMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHByb3hpZXMgPSB7fQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpbXBvcnQgX3dpbnJlZworICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAjIFN0ZCBtb2R1bGUsIHNvIHNob3VsZCBiZSBhcm91bmQgLSBidXQgeW91IG5ldmVyIGtub3chCisgICAgICAgICAgICByZXR1cm4gcHJveGllcworICAgICAgICB0cnk6CisgICAgICAgICAgICBpbnRlcm5ldFNldHRpbmdzID0gX3dpbnJlZy5PcGVuS2V5KF93aW5yZWcuSEtFWV9DVVJSRU5UX1VTRVIsCisgICAgICAgICAgICAgICAgcidTb2Z0d2FyZVxNaWNyb3NvZnRcV2luZG93c1xDdXJyZW50VmVyc2lvblxJbnRlcm5ldCBTZXR0aW5ncycpCisgICAgICAgICAgICBwcm94eUVuYWJsZSA9IF93aW5yZWcuUXVlcnlWYWx1ZUV4KGludGVybmV0U2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQcm94eUVuYWJsZScpWzBdCisgICAgICAgICAgICBpZiBwcm94eUVuYWJsZToKKyAgICAgICAgICAgICAgICAjIFJldHVybmVkIGFzIFVuaWNvZGUgYnV0IHByb2JsZW1zIGlmIG5vdCBjb252ZXJ0ZWQgdG8gQVNDSUkKKyAgICAgICAgICAgICAgICBwcm94eVNlcnZlciA9IHN0cihfd2lucmVnLlF1ZXJ5VmFsdWVFeChpbnRlcm5ldFNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQcm94eVNlcnZlcicpWzBdKQorICAgICAgICAgICAgICAgIGlmICc9JyBpbiBwcm94eVNlcnZlcjoKKyAgICAgICAgICAgICAgICAgICAgIyBQZXItcHJvdG9jb2wgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgZm9yIHAgaW4gcHJveHlTZXJ2ZXIuc3BsaXQoJzsnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sLCBhZGRyZXNzID0gcC5zcGxpdCgnPScsIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAjIFNlZSBpZiBhZGRyZXNzIGhhcyBhIHR5cGU6Ly8gcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCByZS5tYXRjaCgnXihbXi86XSspOi8vJywgYWRkcmVzcyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9ICclczovLyVzJyAlIChwcm90b2NvbCwgYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpZXNbcHJvdG9jb2xdID0gYWRkcmVzcworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICMgVXNlIG9uZSBzZXR0aW5nIGZvciBhbGwgcHJvdG9jb2xzCisgICAgICAgICAgICAgICAgICAgIGlmIHByb3h5U2VydmVyWzo1XSA9PSAnaHR0cDonOgorICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllc1snaHR0cCddID0gcHJveHlTZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpZXNbJ2h0dHAnXSA9ICdodHRwOi8vJXMnICUgcHJveHlTZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3hpZXNbJ2h0dHBzJ10gPSAnaHR0cHM6Ly8lcycgJSBwcm94eVNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgcHJveGllc1snZnRwJ10gPSAnZnRwOi8vJXMnICUgcHJveHlTZXJ2ZXIKKyAgICAgICAgICAgIGludGVybmV0U2V0dGluZ3MuQ2xvc2UoKQorICAgICAgICBleGNlcHQgKFdpbmRvd3NFcnJvciwgVmFsdWVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgICAgICMgRWl0aGVyIHJlZ2lzdHJ5IGtleSBub3QgZm91bmQgZXRjLCBvciB0aGUgdmFsdWUgaW4gYW4KKyAgICAgICAgICAgICMgdW5leHBlY3RlZCBmb3JtYXQuCisgICAgICAgICAgICAjIHByb3hpZXMgYWxyZWFkeSBzZXQgdXAgdG8gYmUgZW1wdHkgc28gbm90aGluZyB0byBkbworICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gcHJveGllcworCisgICAgZGVmIGdldHByb3hpZXMoKToKKyAgICAgICAgIiIiUmV0dXJuIGEgZGljdGlvbmFyeSBvZiBzY2hlbWUgLT4gcHJveHkgc2VydmVyIFVSTCBtYXBwaW5ncy4KKworICAgICAgICBSZXR1cm5zIHNldHRpbmdzIGdhdGhlcmVkIGZyb20gdGhlIGVudmlyb25tZW50LCBpZiBzcGVjaWZpZWQsCisgICAgICAgIG9yIHRoZSByZWdpc3RyeS4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIGdldHByb3hpZXNfZW52aXJvbm1lbnQoKSBvciBnZXRwcm94aWVzX3JlZ2lzdHJ5KCkKKworICAgIGRlZiBwcm94eV9ieXBhc3NfcmVnaXN0cnkoaG9zdCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGltcG9ydCBfd2lucmVnCisgICAgICAgICAgICBpbXBvcnQgcmUKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgIyBTdGQgbW9kdWxlcywgc28gc2hvdWxkIGJlIGFyb3VuZCAtIGJ1dCB5b3UgbmV2ZXIga25vdyEKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGludGVybmV0U2V0dGluZ3MgPSBfd2lucmVnLk9wZW5LZXkoX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUiwKKyAgICAgICAgICAgICAgICByJ1NvZnR3YXJlXE1pY3Jvc29mdFxXaW5kb3dzXEN1cnJlbnRWZXJzaW9uXEludGVybmV0IFNldHRpbmdzJykKKyAgICAgICAgICAgIHByb3h5RW5hYmxlID0gX3dpbnJlZy5RdWVyeVZhbHVlRXgoaW50ZXJuZXRTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb3h5RW5hYmxlJylbMF0KKyAgICAgICAgICAgIHByb3h5T3ZlcnJpZGUgPSBzdHIoX3dpbnJlZy5RdWVyeVZhbHVlRXgoaW50ZXJuZXRTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1Byb3h5T3ZlcnJpZGUnKVswXSkKKyAgICAgICAgICAgICMgXl5eXiBSZXR1cm5lZCBhcyBVbmljb2RlIGJ1dCBwcm9ibGVtcyBpZiBub3QgY29udmVydGVkIHRvIEFTQ0lJCisgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBub3QgcHJveHlFbmFibGUgb3Igbm90IHByb3h5T3ZlcnJpZGU6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAjIHRyeSB0byBtYWtlIGEgaG9zdCBsaXN0IGZyb20gbmFtZSBhbmQgSVAgYWRkcmVzcy4KKyAgICAgICAgcmF3SG9zdCwgcG9ydCA9IHNwbGl0cG9ydChob3N0KQorICAgICAgICBob3N0ID0gW3Jhd0hvc3RdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGFkZHIgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShyYXdIb3N0KQorICAgICAgICAgICAgaWYgYWRkciAhPSByYXdIb3N0OgorICAgICAgICAgICAgICAgIGhvc3QuYXBwZW5kKGFkZHIpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZxZG4gPSBzb2NrZXQuZ2V0ZnFkbihyYXdIb3N0KQorICAgICAgICAgICAgaWYgZnFkbiAhPSByYXdIb3N0OgorICAgICAgICAgICAgICAgIGhvc3QuYXBwZW5kKGZxZG4pCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgbWFrZSBhIGNoZWNrIHZhbHVlIGxpc3QgZnJvbSB0aGUgcmVnaXN0cnkgZW50cnk6IHJlcGxhY2UgdGhlCisgICAgICAgICMgJzxsb2NhbD4nIHN0cmluZyBieSB0aGUgbG9jYWxob3N0IGVudHJ5IGFuZCB0aGUgY29ycmVzcG9uZGluZworICAgICAgICAjIGNhbm9uaWNhbCBlbnRyeS4KKyAgICAgICAgcHJveHlPdmVycmlkZSA9IHByb3h5T3ZlcnJpZGUuc3BsaXQoJzsnKQorICAgICAgICAjIG5vdyBjaGVjayBpZiB3ZSBtYXRjaCBvbmUgb2YgdGhlIHJlZ2lzdHJ5IHZhbHVlcy4KKyAgICAgICAgZm9yIHRlc3QgaW4gcHJveHlPdmVycmlkZToKKyAgICAgICAgICAgIGlmIHRlc3QgPT0gJzxsb2NhbD4nOgorICAgICAgICAgICAgICAgIGlmICcuJyBub3QgaW4gcmF3SG9zdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgICAgIHRlc3QgPSB0ZXN0LnJlcGxhY2UoIi4iLCByIlwuIikgICAgICMgbWFzayBkb3RzCisgICAgICAgICAgICB0ZXN0ID0gdGVzdC5yZXBsYWNlKCIqIiwgciIuKiIpICAgICAjIGNoYW5nZSBnbG9iIHNlcXVlbmNlCisgICAgICAgICAgICB0ZXN0ID0gdGVzdC5yZXBsYWNlKCI/IiwgciIuIikgICAgICAjIGNoYW5nZSBnbG9iIGNoYXIKKyAgICAgICAgICAgIGZvciB2YWwgaW4gaG9zdDoKKyAgICAgICAgICAgICAgICAjIHByaW50ICIlcyA8LS0+ICVzIiAlKCB0ZXN0LCB2YWwgKQorICAgICAgICAgICAgICAgIGlmIHJlLm1hdGNoKHRlc3QsIHZhbCwgcmUuSSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldHVybiAwCisKKyAgICBkZWYgcHJveHlfYnlwYXNzKGhvc3QpOgorICAgICAgICAiIiJSZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIHNjaGVtZSAtPiBwcm94eSBzZXJ2ZXIgVVJMIG1hcHBpbmdzLgorCisgICAgICAgIFJldHVybnMgc2V0dGluZ3MgZ2F0aGVyZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQsIGlmIHNwZWNpZmllZCwKKyAgICAgICAgb3IgdGhlIHJlZ2lzdHJ5LgorCisgICAgICAgICIiIgorICAgICAgICBpZiBnZXRwcm94aWVzX2Vudmlyb25tZW50KCk6CisgICAgICAgICAgICByZXR1cm4gcHJveHlfYnlwYXNzX2Vudmlyb25tZW50KGhvc3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gcHJveHlfYnlwYXNzX3JlZ2lzdHJ5KGhvc3QpCisKK2Vsc2U6CisgICAgIyBCeSBkZWZhdWx0IHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAgICBnZXRwcm94aWVzID0gZ2V0cHJveGllc19lbnZpcm9ubWVudAorICAgIHByb3h5X2J5cGFzcyA9IHByb3h5X2J5cGFzc19lbnZpcm9ubWVudAorCisjIFRlc3QgYW5kIHRpbWUgcXVvdGUoKSBhbmQgdW5xdW90ZSgpCitkZWYgdGVzdDEoKToKKyAgICBzID0gJycKKyAgICBmb3IgaSBpbiByYW5nZSgyNTYpOiBzID0gcyArIGNocihpKQorICAgIHMgPSBzKjQKKyAgICB0MCA9IHRpbWUudGltZSgpCisgICAgcXMgPSBxdW90ZShzKQorICAgIHVxcyA9IHVucXVvdGUocXMpCisgICAgdDEgPSB0aW1lLnRpbWUoKQorICAgIGlmIHVxcyAhPSBzOgorICAgICAgICBwcmludCAnV3JvbmchJworICAgIHByaW50IHJlcHIocykKKyAgICBwcmludCByZXByKHFzKQorICAgIHByaW50IHJlcHIodXFzKQorICAgIHByaW50IHJvdW5kKHQxIC0gdDAsIDMpLCAnc2VjJworCisKK2RlZiByZXBvcnRob29rKGJsb2NrbnVtLCBibG9ja3NpemUsIHRvdGFsc2l6ZSk6CisgICAgIyBSZXBvcnQgZHVyaW5nIHJlbW90ZSB0cmFuc2ZlcnMKKyAgICBwcmludCAiQmxvY2sgbnVtYmVyOiAlZCwgQmxvY2sgc2l6ZTogJWQsIFRvdGFsIHNpemU6ICVkIiAlICgKKyAgICAgICAgYmxvY2tudW0sIGJsb2Nrc2l6ZSwgdG90YWxzaXplKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxsaWIucHljIGIvbGliL3B5dGhvbjIuNy91cmxsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0Y2IzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VybGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxsaWIucHlvIGIvbGliL3B5dGhvbjIuNy91cmxsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMTg4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VybGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91cmxsaWIyLnB5IGIvbGliL3B5dGhvbjIuNy91cmxsaWIyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZGViNzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VybGxpYjIucHkKQEAgLTAsMCArMSwxNDcwIEBACisiIiJBbiBleHRlbnNpYmxlIGxpYnJhcnkgZm9yIG9wZW5pbmcgVVJMcyB1c2luZyBhIHZhcmlldHkgb2YgcHJvdG9jb2xzCisKK1RoZSBzaW1wbGVzdCB3YXkgdG8gdXNlIHRoaXMgbW9kdWxlIGlzIHRvIGNhbGwgdGhlIHVybG9wZW4gZnVuY3Rpb24sCit3aGljaCBhY2NlcHRzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBVUkwgb3IgYSBSZXF1ZXN0IG9iamVjdCAoZGVzY3JpYmVkCitiZWxvdykuICBJdCBvcGVucyB0aGUgVVJMIGFuZCByZXR1cm5zIHRoZSByZXN1bHRzIGFzIGZpbGUtbGlrZQorb2JqZWN0OyB0aGUgcmV0dXJuZWQgb2JqZWN0IGhhcyBzb21lIGV4dHJhIG1ldGhvZHMgZGVzY3JpYmVkIGJlbG93LgorCitUaGUgT3BlbmVyRGlyZWN0b3IgbWFuYWdlcyBhIGNvbGxlY3Rpb24gb2YgSGFuZGxlciBvYmplY3RzIHRoYXQgZG8KK2FsbCB0aGUgYWN0dWFsIHdvcmsuICBFYWNoIEhhbmRsZXIgaW1wbGVtZW50cyBhIHBhcnRpY3VsYXIgcHJvdG9jb2wgb3IKK29wdGlvbi4gIFRoZSBPcGVuZXJEaXJlY3RvciBpcyBhIGNvbXBvc2l0ZSBvYmplY3QgdGhhdCBpbnZva2VzIHRoZQorSGFuZGxlcnMgbmVlZGVkIHRvIG9wZW4gdGhlIHJlcXVlc3RlZCBVUkwuICBGb3IgZXhhbXBsZSwgdGhlCitIVFRQSGFuZGxlciBwZXJmb3JtcyBIVFRQIEdFVCBhbmQgUE9TVCByZXF1ZXN0cyBhbmQgZGVhbHMgd2l0aAorbm9uLWVycm9yIHJldHVybnMuICBUaGUgSFRUUFJlZGlyZWN0SGFuZGxlciBhdXRvbWF0aWNhbGx5IGRlYWxzIHdpdGgKK0hUVFAgMzAxLCAzMDIsIDMwMyBhbmQgMzA3IHJlZGlyZWN0IGVycm9ycywgYW5kIHRoZSBIVFRQRGlnZXN0QXV0aEhhbmRsZXIKK2RlYWxzIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uLgorCit1cmxvcGVuKHVybCwgZGF0YT1Ob25lKSAtLSBCYXNpYyB1c2FnZSBpcyB0aGUgc2FtZSBhcyBvcmlnaW5hbAordXJsbGliLiAgcGFzcyB0aGUgdXJsIGFuZCBvcHRpb25hbGx5IGRhdGEgdG8gcG9zdCB0byBhbiBIVFRQIFVSTCwgYW5kCitnZXQgYSBmaWxlLWxpa2Ugb2JqZWN0IGJhY2suICBPbmUgZGlmZmVyZW5jZSBpcyB0aGF0IHlvdSBjYW4gYWxzbyBwYXNzCithIFJlcXVlc3QgaW5zdGFuY2UgaW5zdGVhZCBvZiBVUkwuICBSYWlzZXMgYSBVUkxFcnJvciAoc3ViY2xhc3Mgb2YKK0lPRXJyb3IpOyBmb3IgSFRUUCBlcnJvcnMsIHJhaXNlcyBhbiBIVFRQRXJyb3IsIHdoaWNoIGNhbiBhbHNvIGJlCit0cmVhdGVkIGFzIGEgdmFsaWQgcmVzcG9uc2UuCisKK2J1aWxkX29wZW5lciAtLSBGdW5jdGlvbiB0aGF0IGNyZWF0ZXMgYSBuZXcgT3BlbmVyRGlyZWN0b3IgaW5zdGFuY2UuCitXaWxsIGluc3RhbGwgdGhlIGRlZmF1bHQgaGFuZGxlcnMuICBBY2NlcHRzIG9uZSBvciBtb3JlIEhhbmRsZXJzIGFzCithcmd1bWVudHMsIGVpdGhlciBpbnN0YW5jZXMgb3IgSGFuZGxlciBjbGFzc2VzIHRoYXQgaXQgd2lsbAoraW5zdGFudGlhdGUuICBJZiBvbmUgb2YgdGhlIGFyZ3VtZW50IGlzIGEgc3ViY2xhc3Mgb2YgdGhlIGRlZmF1bHQKK2hhbmRsZXIsIHRoZSBhcmd1bWVudCB3aWxsIGJlIGluc3RhbGxlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0LgorCitpbnN0YWxsX29wZW5lciAtLSBJbnN0YWxscyBhIG5ldyBvcGVuZXIgYXMgdGhlIGRlZmF1bHQgb3BlbmVyLgorCitvYmplY3RzIG9mIGludGVyZXN0OgorCitPcGVuZXJEaXJlY3RvciAtLSBTZXRzIHVwIHRoZSBVc2VyIEFnZW50IGFzIHRoZSBQeXRob24tdXJsbGliIGNsaWVudCBhbmQgbWFuYWdlcwordGhlIEhhbmRsZXIgY2xhc3Nlcywgd2hpbGUgZGVhbGluZyB3aXRoIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisKK1JlcXVlc3QgLS0gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBzdGF0ZSBvZiBhIHJlcXVlc3QuICBUaGUKK3N0YXRlIGNhbiBiZSBhcyBzaW1wbGUgYXMgdGhlIFVSTC4gIEl0IGNhbiBhbHNvIGluY2x1ZGUgZXh0cmEgSFRUUAoraGVhZGVycywgZS5nLiBhIFVzZXItQWdlbnQuCisKK0Jhc2VIYW5kbGVyIC0tCisKK2V4Y2VwdGlvbnM6CitVUkxFcnJvciAtLSBBIHN1YmNsYXNzIG9mIElPRXJyb3IsIGluZGl2aWR1YWwgcHJvdG9jb2xzIGhhdmUgdGhlaXIgb3duCitzcGVjaWZpYyBzdWJjbGFzcy4KKworSFRUUEVycm9yIC0tIEFsc28gYSB2YWxpZCBIVFRQIHJlc3BvbnNlLCBzbyB5b3UgY2FuIHRyZWF0IGFuIEhUVFAgZXJyb3IKK2FzIGFuIGV4Y2VwdGlvbmFsIGV2ZW50IG9yIHZhbGlkIHJlc3BvbnNlLgorCitpbnRlcm5hbHM6CitCYXNlSGFuZGxlciBhbmQgcGFyZW50CitfY2FsbF9jaGFpbiBjb252ZW50aW9ucworCitFeGFtcGxlIHVzYWdlOgorCitpbXBvcnQgdXJsbGliMgorCisjIHNldCB1cCBhdXRoZW50aWNhdGlvbiBpbmZvCithdXRoaW5mbyA9IHVybGxpYjIuSFRUUEJhc2ljQXV0aEhhbmRsZXIoKQorYXV0aGluZm8uYWRkX3Bhc3N3b3JkKHJlYWxtPSdQRFEgQXBwbGljYXRpb24nLAorICAgICAgICAgICAgICAgICAgICAgIHVyaT0naHR0cHM6Ly9tYWhsZXI6ODA5Mi9zaXRlLXVwZGF0ZXMucHknLAorICAgICAgICAgICAgICAgICAgICAgIHVzZXI9J2tsZW0nLAorICAgICAgICAgICAgICAgICAgICAgIHBhc3N3ZD0nZ2VoZWltJHBhcm9sZScpCisKK3Byb3h5X3N1cHBvcnQgPSB1cmxsaWIyLlByb3h5SGFuZGxlcih7Imh0dHAiIDogImh0dHA6Ly9haGFkLWhhYW06MzEyOCJ9KQorCisjIGJ1aWxkIGEgbmV3IG9wZW5lciB0aGF0IGFkZHMgYXV0aGVudGljYXRpb24gYW5kIGNhY2hpbmcgRlRQIGhhbmRsZXJzCitvcGVuZXIgPSB1cmxsaWIyLmJ1aWxkX29wZW5lcihwcm94eV9zdXBwb3J0LCBhdXRoaW5mbywgdXJsbGliMi5DYWNoZUZUUEhhbmRsZXIpCisKKyMgaW5zdGFsbCBpdAordXJsbGliMi5pbnN0YWxsX29wZW5lcihvcGVuZXIpCisKK2YgPSB1cmxsaWIyLnVybG9wZW4oJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy8nKQorCisKKyIiIgorCisjIFhYWCBpc3N1ZXM6CisjIElmIGFuIGF1dGhlbnRpY2F0aW9uIGVycm9yIGhhbmRsZXIgdGhhdCB0cmllcyB0byBwZXJmb3JtCisjIGF1dGhlbnRpY2F0aW9uIGZvciBzb21lIHJlYXNvbiBidXQgZmFpbHMsIGhvdyBzaG91bGQgdGhlIGVycm9yIGJlCisjIHNpZ25hbGxlZD8gIFRoZSBjbGllbnQgbmVlZHMgdG8ga25vdyB0aGUgSFRUUCBlcnJvciBjb2RlLiAgQnV0IGlmCisjIHRoZSBoYW5kbGVyIGtub3dzIHRoYXQgdGhlIHByb2JsZW0gd2FzLCBlLmcuLCB0aGF0IGl0IGRpZG4ndCBrbm93CisjIHRoYXQgaGFzaCBhbGdvIHRoYXQgcmVxdWVzdGVkIGluIHRoZSBjaGFsbGVuZ2UsIGl0IHdvdWxkIGJlIGdvb2QgdG8KKyMgcGFzcyB0aGF0IGluZm9ybWF0aW9uIGFsb25nIHRvIHRoZSBjbGllbnQsIHRvby4KKyMgZnRwIGVycm9ycyBhcmVuJ3QgaGFuZGxlZCBjbGVhbmx5CisjIGNoZWNrIGRpZ2VzdCBhZ2FpbnN0IGNvcnJlY3QgKGkuZS4gbm9uLWFwYWNoZSkgaW1wbGVtZW50YXRpb24KKworIyBQb3NzaWJsZSBleHRlbnNpb25zOgorIyBjb21wbGV4IHByb3hpZXMgIFhYWCBub3Qgc3VyZSB3aGF0IGV4YWN0bHkgd2FzIG1lYW50IGJ5IHRoaXMKKyMgYWJzdHJhY3QgZmFjdG9yeSBmb3Igb3BlbmVyCisKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgaHR0cGxpYgoraW1wb3J0IG1pbWV0b29scworaW1wb3J0IG9zCitpbXBvcnQgcG9zaXhwYXRoCitpbXBvcnQgcmFuZG9tCitpbXBvcnQgcmUKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgdXJscGFyc2UKK2ltcG9ydCBiaXNlY3QKK2ltcG9ydCB3YXJuaW5ncworCit0cnk6CisgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKworZnJvbSB1cmxsaWIgaW1wb3J0ICh1bndyYXAsIHVucXVvdGUsIHNwbGl0dHlwZSwgc3BsaXRob3N0LCBxdW90ZSwKKyAgICAgYWRkaW5mb3VybCwgc3BsaXRwb3J0LCBzcGxpdHRhZywgdG9CeXRlcywKKyAgICAgc3BsaXRhdHRyLCBmdHB3cmFwcGVyLCBzcGxpdHVzZXIsIHNwbGl0cGFzc3dkLCBzcGxpdHZhbHVlKQorCisjIHN1cHBvcnQgZm9yIEZpbGVIYW5kbGVyLCBwcm94aWVzIHZpYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKK2Zyb20gdXJsbGliIGltcG9ydCBsb2NhbGhvc3QsIHVybDJwYXRobmFtZSwgZ2V0cHJveGllcywgcHJveHlfYnlwYXNzCisKKyMgdXNlZCBpbiBVc2VyLUFnZW50IGhlYWRlciBzZW50CitfX3ZlcnNpb25fXyA9IHN5cy52ZXJzaW9uWzozXQorCitfb3BlbmVyID0gTm9uZQorZGVmIHVybG9wZW4odXJsLCBkYXRhPU5vbmUsIHRpbWVvdXQ9c29ja2V0Ll9HTE9CQUxfREVGQVVMVF9USU1FT1VUKToKKyAgICBnbG9iYWwgX29wZW5lcgorICAgIGlmIF9vcGVuZXIgaXMgTm9uZToKKyAgICAgICAgX29wZW5lciA9IGJ1aWxkX29wZW5lcigpCisgICAgcmV0dXJuIF9vcGVuZXIub3Blbih1cmwsIGRhdGEsIHRpbWVvdXQpCisKK2RlZiBpbnN0YWxsX29wZW5lcihvcGVuZXIpOgorICAgIGdsb2JhbCBfb3BlbmVyCisgICAgX29wZW5lciA9IG9wZW5lcgorCisjIGRvIHRoZXNlIGVycm9yIGNsYXNzZXMgbWFrZSBzZW5zZT8KKyMgbWFrZSBzdXJlIGFsbCBvZiB0aGUgSU9FcnJvciBzdHVmZiBpcyBvdmVycmlkZGVuLiAgd2UganVzdCB3YW50IHRvIGJlCisjIHN1YnR5cGVzLgorCitjbGFzcyBVUkxFcnJvcihJT0Vycm9yKToKKyAgICAjIFVSTEVycm9yIGlzIGEgc3ViLXR5cGUgb2YgSU9FcnJvciwgYnV0IGl0IGRvZXNuJ3Qgc2hhcmUgYW55IG9mCisgICAgIyB0aGUgaW1wbGVtZW50YXRpb24uICBuZWVkIHRvIG92ZXJyaWRlIF9faW5pdF9fIGFuZCBfX3N0cl9fLgorICAgICMgSXQgc2V0cyBzZWxmLmFyZ3MgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvdGhlciBFbnZpcm9ubWVudEVycm9yCisgICAgIyBzdWJjbGFzc2VzLCBidXQgYXJncyBkb2Vzbid0IGhhdmUgdGhlIHR5cGljYWwgZm9ybWF0IHdpdGggZXJybm8gaW4KKyAgICAjIHNsb3QgMCBhbmQgc3RyZXJyb3IgaW4gc2xvdCAxLiAgVGhpcyBtYXkgYmUgYmV0dGVyIHRoYW4gbm90aGluZy4KKyAgICBkZWYgX19pbml0X18oc2VsZiwgcmVhc29uKToKKyAgICAgICAgc2VsZi5hcmdzID0gcmVhc29uLAorICAgICAgICBzZWxmLnJlYXNvbiA9IHJlYXNvbgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAnPHVybG9wZW4gZXJyb3IgJXM+JyAlIHNlbGYucmVhc29uCisKK2NsYXNzIEhUVFBFcnJvcihVUkxFcnJvciwgYWRkaW5mb3VybCk6CisgICAgIiIiUmFpc2VkIHdoZW4gSFRUUCBlcnJvciBvY2N1cnMsIGJ1dCBhbHNvIGFjdHMgbGlrZSBub24tZXJyb3IgcmV0dXJuIiIiCisgICAgX19zdXBlcl9pbml0ID0gYWRkaW5mb3VybC5fX2luaXRfXworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgY29kZSwgbXNnLCBoZHJzLCBmcCk6CisgICAgICAgIHNlbGYuY29kZSA9IGNvZGUKKyAgICAgICAgc2VsZi5tc2cgPSBtc2cKKyAgICAgICAgc2VsZi5oZHJzID0gaGRycworICAgICAgICBzZWxmLmZwID0gZnAKKyAgICAgICAgc2VsZi5maWxlbmFtZSA9IHVybAorICAgICAgICAjIFRoZSBhZGRpbmZvdXJsIGNsYXNzZXMgZGVwZW5kIG9uIGZwIGJlaW5nIGEgdmFsaWQgZmlsZQorICAgICAgICAjIG9iamVjdC4gIEluIHNvbWUgY2FzZXMsIHRoZSBIVFRQRXJyb3IgbWF5IG5vdCBoYXZlIGEgdmFsaWQKKyAgICAgICAgIyBmaWxlIG9iamVjdC4gIElmIHRoaXMgaGFwcGVucywgdGhlIHNpbXBsZXN0IHdvcmthcm91bmQgaXMgdG8KKyAgICAgICAgIyBub3QgaW5pdGlhbGl6ZSB0aGUgYmFzZSBjbGFzc2VzLgorICAgICAgICBpZiBmcCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX19zdXBlcl9pbml0KGZwLCBoZHJzLCB1cmwsIGNvZGUpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICdIVFRQIEVycm9yICVzOiAlcycgJSAoc2VsZi5jb2RlLCBzZWxmLm1zZykKKworICAgICMgc2luY2UgVVJMRXJyb3Igc3BlY2lmaWVzIGEgLnJlYXNvbiBhdHRyaWJ1dGUsIEhUVFBFcnJvciBzaG91bGQgYWxzbworICAgICMgIHByb3ZpZGUgdGhpcyBhdHRyaWJ1dGUuIFNlZSBpc3N1ZTEzMjExIGZvIGRpc2N1c3Npb24uCisgICAgQHByb3BlcnR5CisgICAgZGVmIHJlYXNvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubXNnCisKKyAgICBkZWYgaW5mbyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaGRycworCisjIGNvcGllZCBmcm9tIGNvb2tpZWxpYi5weQorX2N1dF9wb3J0X3JlID0gcmUuY29tcGlsZShyIjpcZCskIikKK2RlZiByZXF1ZXN0X2hvc3QocmVxdWVzdCk6CisgICAgIiIiUmV0dXJuIHJlcXVlc3QtaG9zdCwgYXMgZGVmaW5lZCBieSBSRkMgMjk2NS4KKworICAgIFZhcmlhdGlvbiBmcm9tIFJGQzogcmV0dXJuZWQgdmFsdWUgaXMgbG93ZXJjYXNlZCwgZm9yIGNvbnZlbmllbnQKKyAgICBjb21wYXJpc29uLgorCisgICAgIiIiCisgICAgdXJsID0gcmVxdWVzdC5nZXRfZnVsbF91cmwoKQorICAgIGhvc3QgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzFdCisgICAgaWYgaG9zdCA9PSAiIjoKKyAgICAgICAgaG9zdCA9IHJlcXVlc3QuZ2V0X2hlYWRlcigiSG9zdCIsICIiKQorCisgICAgIyByZW1vdmUgcG9ydCwgaWYgcHJlc2VudAorICAgIGhvc3QgPSBfY3V0X3BvcnRfcmUuc3ViKCIiLCBob3N0LCAxKQorICAgIHJldHVybiBob3N0Lmxvd2VyKCkKKworY2xhc3MgUmVxdWVzdDoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmwsIGRhdGE9Tm9uZSwgaGVhZGVycz17fSwKKyAgICAgICAgICAgICAgICAgb3JpZ2luX3JlcV9ob3N0PU5vbmUsIHVudmVyaWZpYWJsZT1GYWxzZSk6CisgICAgICAgICMgdW53cmFwKCc8VVJMOnR5cGU6Ly9ob3N0L3BhdGg+JykgLS0+ICd0eXBlOi8vaG9zdC9wYXRoJworICAgICAgICBzZWxmLl9fb3JpZ2luYWwgPSB1bndyYXAodXJsKQorICAgICAgICBzZWxmLl9fb3JpZ2luYWwsIHNlbGYuX19mcmFnbWVudCA9IHNwbGl0dGFnKHNlbGYuX19vcmlnaW5hbCkKKyAgICAgICAgc2VsZi50eXBlID0gTm9uZQorICAgICAgICAjIHNlbGYuX19yX3R5cGUgaXMgd2hhdCdzIGxlZnQgYWZ0ZXIgZG9pbmcgdGhlIHNwbGl0dHlwZQorICAgICAgICBzZWxmLmhvc3QgPSBOb25lCisgICAgICAgIHNlbGYucG9ydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdHVubmVsX2hvc3QgPSBOb25lCisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgc2VsZi5oZWFkZXJzID0ge30KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gaGVhZGVycy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKGtleSwgdmFsdWUpCisgICAgICAgIHNlbGYudW5yZWRpcmVjdGVkX2hkcnMgPSB7fQorICAgICAgICBpZiBvcmlnaW5fcmVxX2hvc3QgaXMgTm9uZToKKyAgICAgICAgICAgIG9yaWdpbl9yZXFfaG9zdCA9IHJlcXVlc3RfaG9zdChzZWxmKQorICAgICAgICBzZWxmLm9yaWdpbl9yZXFfaG9zdCA9IG9yaWdpbl9yZXFfaG9zdAorICAgICAgICBzZWxmLnVudmVyaWZpYWJsZSA9IHVudmVyaWZpYWJsZQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICAjIFhYWCB0aGlzIGlzIGEgZmFsbGJhY2sgbWVjaGFuaXNtIHRvIGd1YXJkIGFnYWluc3QgdGhlc2UKKyAgICAgICAgIyBtZXRob2RzIGdldHRpbmcgY2FsbGVkIGluIGEgbm9uLXN0YW5kYXJkIG9yZGVyLiAgdGhpcyBtYXkgYmUKKyAgICAgICAgIyB0b28gY29tcGxpY2F0ZWQgYW5kL29yIHVubmVjZXNzYXJ5LgorICAgICAgICAjIFhYWCBzaG91bGQgdGhlIF9fcl9YWFggYXR0cmlidXRlcyBiZSBwdWJsaWM/CisgICAgICAgIGlmIGF0dHJbOjEyXSA9PSAnX1JlcXVlc3RfX3JfJzoKKyAgICAgICAgICAgIG5hbWUgPSBhdHRyWzEyOl0KKyAgICAgICAgICAgIGlmIGhhc2F0dHIoUmVxdWVzdCwgJ2dldF8nICsgbmFtZSk6CisgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLCAnZ2V0XycgKyBuYW1lKSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZiwgYXR0cikKKyAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIGF0dHIKKworICAgIGRlZiBnZXRfbWV0aG9kKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc19kYXRhKCk6CisgICAgICAgICAgICByZXR1cm4gIlBPU1QiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIkdFVCIKKworICAgICMgWFhYIHRoZXNlIGhlbHBlciBtZXRob2RzIGFyZSBsYW1lCisKKyAgICBkZWYgYWRkX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKworICAgIGRlZiBoYXNfZGF0YShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YSBpcyBub3QgTm9uZQorCisgICAgZGVmIGdldF9kYXRhKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhCisKKyAgICBkZWYgZ2V0X2Z1bGxfdXJsKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9fZnJhZ21lbnQ6CisgICAgICAgICAgICByZXR1cm4gJyVzIyVzJyAlIChzZWxmLl9fb3JpZ2luYWwsIHNlbGYuX19mcmFnbWVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fb3JpZ2luYWwKKworICAgIGRlZiBnZXRfdHlwZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50eXBlIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnR5cGUsIHNlbGYuX19yX3R5cGUgPSBzcGxpdHR5cGUoc2VsZi5fX29yaWdpbmFsKQorICAgICAgICAgICAgaWYgc2VsZi50eXBlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVua25vd24gdXJsIHR5cGU6ICVzIiAlIHNlbGYuX19vcmlnaW5hbAorICAgICAgICByZXR1cm4gc2VsZi50eXBlCisKKyAgICBkZWYgZ2V0X2hvc3Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaG9zdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5ob3N0LCBzZWxmLl9fcl9ob3N0ID0gc3BsaXRob3N0KHNlbGYuX19yX3R5cGUpCisgICAgICAgICAgICBpZiBzZWxmLmhvc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5ob3N0ID0gdW5xdW90ZShzZWxmLmhvc3QpCisgICAgICAgIHJldHVybiBzZWxmLmhvc3QKKworICAgIGRlZiBnZXRfc2VsZWN0b3Ioc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fcl9ob3N0CisKKyAgICBkZWYgc2V0X3Byb3h5KHNlbGYsIGhvc3QsIHR5cGUpOgorICAgICAgICBpZiBzZWxmLnR5cGUgPT0gJ2h0dHBzJyBhbmQgbm90IHNlbGYuX3R1bm5lbF9ob3N0OgorICAgICAgICAgICAgc2VsZi5fdHVubmVsX2hvc3QgPSBzZWxmLmhvc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKyAgICAgICAgICAgIHNlbGYuX19yX2hvc3QgPSBzZWxmLl9fb3JpZ2luYWwKKworICAgICAgICBzZWxmLmhvc3QgPSBob3N0CisKKyAgICBkZWYgaGFzX3Byb3h5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3JfaG9zdCA9PSBzZWxmLl9fb3JpZ2luYWwKKworICAgIGRlZiBnZXRfb3JpZ2luX3JlcV9ob3N0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vcmlnaW5fcmVxX2hvc3QKKworICAgIGRlZiBpc191bnZlcmlmaWFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnVudmVyaWZpYWJsZQorCisgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwga2V5LCB2YWwpOgorICAgICAgICAjIHVzZWZ1bCBmb3Igc29tZXRoaW5nIGxpa2UgYXV0aGVudGljYXRpb24KKyAgICAgICAgc2VsZi5oZWFkZXJzW2tleS5jYXBpdGFsaXplKCldID0gdmFsCisKKyAgICBkZWYgYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoc2VsZiwga2V5LCB2YWwpOgorICAgICAgICAjIHdpbGwgbm90IGJlIGFkZGVkIHRvIGEgcmVkaXJlY3RlZCByZXF1ZXN0CisgICAgICAgIHNlbGYudW5yZWRpcmVjdGVkX2hkcnNba2V5LmNhcGl0YWxpemUoKV0gPSB2YWwKKworICAgIGRlZiBoYXNfaGVhZGVyKHNlbGYsIGhlYWRlcl9uYW1lKToKKyAgICAgICAgcmV0dXJuIChoZWFkZXJfbmFtZSBpbiBzZWxmLmhlYWRlcnMgb3IKKyAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZSBpbiBzZWxmLnVucmVkaXJlY3RlZF9oZHJzKQorCisgICAgZGVmIGdldF9oZWFkZXIoc2VsZiwgaGVhZGVyX25hbWUsIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLmhlYWRlcnMuZ2V0KAorICAgICAgICAgICAgaGVhZGVyX25hbWUsCisgICAgICAgICAgICBzZWxmLnVucmVkaXJlY3RlZF9oZHJzLmdldChoZWFkZXJfbmFtZSwgZGVmYXVsdCkpCisKKyAgICBkZWYgaGVhZGVyX2l0ZW1zKHNlbGYpOgorICAgICAgICBoZHJzID0gc2VsZi51bnJlZGlyZWN0ZWRfaGRycy5jb3B5KCkKKyAgICAgICAgaGRycy51cGRhdGUoc2VsZi5oZWFkZXJzKQorICAgICAgICByZXR1cm4gaGRycy5pdGVtcygpCisKK2NsYXNzIE9wZW5lckRpcmVjdG9yOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgY2xpZW50X3ZlcnNpb24gPSAiUHl0aG9uLXVybGxpYi8lcyIgJSBfX3ZlcnNpb25fXworICAgICAgICBzZWxmLmFkZGhlYWRlcnMgPSBbKCdVc2VyLWFnZW50JywgY2xpZW50X3ZlcnNpb24pXQorICAgICAgICAjIHNlbGYuaGFuZGxlcnMgaXMgcmV0YWluZWQgb25seSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgICAgICBzZWxmLmhhbmRsZXJzID0gW10KKyAgICAgICAgIyBtYW5hZ2UgdGhlIGluZGl2aWR1YWwgaGFuZGxlcnMKKyAgICAgICAgc2VsZi5oYW5kbGVfb3BlbiA9IHt9CisgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yID0ge30KKyAgICAgICAgc2VsZi5wcm9jZXNzX3Jlc3BvbnNlID0ge30KKyAgICAgICAgc2VsZi5wcm9jZXNzX3JlcXVlc3QgPSB7fQorCisgICAgZGVmIGFkZF9oYW5kbGVyKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihoYW5kbGVyLCAiYWRkX3BhcmVudCIpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJleHBlY3RlZCBCYXNlSGFuZGxlciBpbnN0YW5jZSwgZ290ICVyIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZShoYW5kbGVyKSkKKworICAgICAgICBhZGRlZCA9IEZhbHNlCisgICAgICAgIGZvciBtZXRoIGluIGRpcihoYW5kbGVyKToKKyAgICAgICAgICAgIGlmIG1ldGggaW4gWyJyZWRpcmVjdF9yZXF1ZXN0IiwgImRvX29wZW4iLCAicHJveHlfb3BlbiJdOgorICAgICAgICAgICAgICAgICMgb29wcywgY29pbmNpZGVudGFsIG1hdGNoCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaSA9IG1ldGguZmluZCgiXyIpCisgICAgICAgICAgICBwcm90b2NvbCA9IG1ldGhbOmldCisgICAgICAgICAgICBjb25kaXRpb24gPSBtZXRoW2krMTpdCisKKyAgICAgICAgICAgIGlmIGNvbmRpdGlvbi5zdGFydHN3aXRoKCJlcnJvciIpOgorICAgICAgICAgICAgICAgIGogPSBjb25kaXRpb24uZmluZCgiXyIpICsgaSArIDEKKyAgICAgICAgICAgICAgICBraW5kID0gbWV0aFtqKzE6XQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAga2luZCA9IGludChraW5kKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgbG9va3VwID0gc2VsZi5oYW5kbGVfZXJyb3IuZ2V0KHByb3RvY29sLCB7fSkKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lcnJvcltwcm90b2NvbF0gPSBsb29rdXAKKyAgICAgICAgICAgIGVsaWYgY29uZGl0aW9uID09ICJvcGVuIjoKKyAgICAgICAgICAgICAgICBraW5kID0gcHJvdG9jb2wKKyAgICAgICAgICAgICAgICBsb29rdXAgPSBzZWxmLmhhbmRsZV9vcGVuCisgICAgICAgICAgICBlbGlmIGNvbmRpdGlvbiA9PSAicmVzcG9uc2UiOgorICAgICAgICAgICAgICAgIGtpbmQgPSBwcm90b2NvbAorICAgICAgICAgICAgICAgIGxvb2t1cCA9IHNlbGYucHJvY2Vzc19yZXNwb25zZQorICAgICAgICAgICAgZWxpZiBjb25kaXRpb24gPT0gInJlcXVlc3QiOgorICAgICAgICAgICAgICAgIGtpbmQgPSBwcm90b2NvbAorICAgICAgICAgICAgICAgIGxvb2t1cCA9IHNlbGYucHJvY2Vzc19yZXF1ZXN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGhhbmRsZXJzID0gbG9va3VwLnNldGRlZmF1bHQoa2luZCwgW10pCisgICAgICAgICAgICBpZiBoYW5kbGVyczoKKyAgICAgICAgICAgICAgICBiaXNlY3QuaW5zb3J0KGhhbmRsZXJzLCBoYW5kbGVyKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoYW5kbGVycy5hcHBlbmQoaGFuZGxlcikKKyAgICAgICAgICAgIGFkZGVkID0gVHJ1ZQorCisgICAgICAgIGlmIGFkZGVkOgorICAgICAgICAgICAgYmlzZWN0Lmluc29ydChzZWxmLmhhbmRsZXJzLCBoYW5kbGVyKQorICAgICAgICAgICAgaGFuZGxlci5hZGRfcGFyZW50KHNlbGYpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICMgT25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgICAgICBwYXNzCisKKyAgICBkZWYgX2NhbGxfY2hhaW4oc2VsZiwgY2hhaW4sIGtpbmQsIG1ldGhfbmFtZSwgKmFyZ3MpOgorICAgICAgICAjIEhhbmRsZXJzIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiBubyBvbmUgZWxzZSBzaG91bGQgdHJ5IHRvIGhhbmRsZQorICAgICAgICAjIHRoZSByZXF1ZXN0LCBvciByZXR1cm4gTm9uZSBpZiB0aGV5IGNhbid0IGJ1dCBhbm90aGVyIGhhbmRsZXIKKyAgICAgICAgIyBjb3VsZC4gIE90aGVyd2lzZSwgdGhleSByZXR1cm4gdGhlIHJlc3BvbnNlLgorICAgICAgICBoYW5kbGVycyA9IGNoYWluLmdldChraW5kLCAoKSkKKyAgICAgICAgZm9yIGhhbmRsZXIgaW4gaGFuZGxlcnM6CisgICAgICAgICAgICBmdW5jID0gZ2V0YXR0cihoYW5kbGVyLCBtZXRoX25hbWUpCisKKyAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMoKmFyZ3MpCisgICAgICAgICAgICBpZiByZXN1bHQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIG9wZW4oc2VsZiwgZnVsbHVybCwgZGF0YT1Ob25lLCB0aW1lb3V0PXNvY2tldC5fR0xPQkFMX0RFRkFVTFRfVElNRU9VVCk6CisgICAgICAgICMgYWNjZXB0IGEgVVJMIG9yIGEgUmVxdWVzdCBvYmplY3QKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmdWxsdXJsLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHJlcSA9IFJlcXVlc3QoZnVsbHVybCwgZGF0YSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJlcSA9IGZ1bGx1cmwKKyAgICAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmVxLmFkZF9kYXRhKGRhdGEpCisKKyAgICAgICAgcmVxLnRpbWVvdXQgPSB0aW1lb3V0CisgICAgICAgIHByb3RvY29sID0gcmVxLmdldF90eXBlKCkKKworICAgICAgICAjIHByZS1wcm9jZXNzIHJlcXVlc3QKKyAgICAgICAgbWV0aF9uYW1lID0gcHJvdG9jb2wrIl9yZXF1ZXN0IgorICAgICAgICBmb3IgcHJvY2Vzc29yIGluIHNlbGYucHJvY2Vzc19yZXF1ZXN0LmdldChwcm90b2NvbCwgW10pOgorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIocHJvY2Vzc29yLCBtZXRoX25hbWUpCisgICAgICAgICAgICByZXEgPSBtZXRoKHJlcSkKKworICAgICAgICByZXNwb25zZSA9IHNlbGYuX29wZW4ocmVxLCBkYXRhKQorCisgICAgICAgICMgcG9zdC1wcm9jZXNzIHJlc3BvbnNlCisgICAgICAgIG1ldGhfbmFtZSA9IHByb3RvY29sKyJfcmVzcG9uc2UiCisgICAgICAgIGZvciBwcm9jZXNzb3IgaW4gc2VsZi5wcm9jZXNzX3Jlc3BvbnNlLmdldChwcm90b2NvbCwgW10pOgorICAgICAgICAgICAgbWV0aCA9IGdldGF0dHIocHJvY2Vzc29yLCBtZXRoX25hbWUpCisgICAgICAgICAgICByZXNwb25zZSA9IG1ldGgocmVxLCByZXNwb25zZSkKKworICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGRlZiBfb3BlbihzZWxmLCByZXEsIGRhdGE9Tm9uZSk6CisgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhbGxfY2hhaW4oc2VsZi5oYW5kbGVfb3BlbiwgJ2RlZmF1bHQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZhdWx0X29wZW4nLCByZXEpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICBwcm90b2NvbCA9IHJlcS5nZXRfdHlwZSgpCisgICAgICAgIHJlc3VsdCA9IHNlbGYuX2NhbGxfY2hhaW4oc2VsZi5oYW5kbGVfb3BlbiwgcHJvdG9jb2wsIHByb3RvY29sICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX29wZW4nLCByZXEpCisgICAgICAgIGlmIHJlc3VsdDoKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgICAgICByZXR1cm4gc2VsZi5fY2FsbF9jaGFpbihzZWxmLmhhbmRsZV9vcGVuLCAndW5rbm93bicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd1bmtub3duX29wZW4nLCByZXEpCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgcHJvdG8sICphcmdzKToKKyAgICAgICAgaWYgcHJvdG8gaW4gKCdodHRwJywgJ2h0dHBzJyk6CisgICAgICAgICAgICAjIFhYWCBodHRwW3NdIHByb3RvY29scyBhcmUgc3BlY2lhbC1jYXNlZAorICAgICAgICAgICAgZGljdCA9IHNlbGYuaGFuZGxlX2Vycm9yWydodHRwJ10gIyBodHRwcyBpcyBub3QgZGlmZmVyZW50IHRoYW4gaHR0cAorICAgICAgICAgICAgcHJvdG8gPSBhcmdzWzJdICAjIFlVQ0shCisgICAgICAgICAgICBtZXRoX25hbWUgPSAnaHR0cF9lcnJvcl8lcycgJSBwcm90bworICAgICAgICAgICAgaHR0cF9lcnIgPSAxCisgICAgICAgICAgICBvcmlnX2FyZ3MgPSBhcmdzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaWN0ID0gc2VsZi5oYW5kbGVfZXJyb3IKKyAgICAgICAgICAgIG1ldGhfbmFtZSA9IHByb3RvICsgJ19lcnJvcicKKyAgICAgICAgICAgIGh0dHBfZXJyID0gMAorICAgICAgICBhcmdzID0gKGRpY3QsIHByb3RvLCBtZXRoX25hbWUpICsgYXJncworICAgICAgICByZXN1bHQgPSBzZWxmLl9jYWxsX2NoYWluKCphcmdzKQorICAgICAgICBpZiByZXN1bHQ6CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICAgICAgaWYgaHR0cF9lcnI6CisgICAgICAgICAgICBhcmdzID0gKGRpY3QsICdkZWZhdWx0JywgJ2h0dHBfZXJyb3JfZGVmYXVsdCcpICsgb3JpZ19hcmdzCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY2FsbF9jaGFpbigqYXJncykKKworIyBYWFggcHJvYmFibHkgYWxzbyB3YW50IGFuIGFic3RyYWN0IGZhY3RvcnkgdGhhdCBrbm93cyB3aGVuIGl0IG1ha2VzCisjIHNlbnNlIHRvIHNraXAgYSBzdXBlcmNsYXNzIGluIGZhdm9yIG9mIGEgc3ViY2xhc3MgYW5kIHdoZW4gaXQgbWlnaHQKKyMgbWFrZSBzZW5zZSB0byBpbmNsdWRlIGJvdGgKKworZGVmIGJ1aWxkX29wZW5lcigqaGFuZGxlcnMpOgorICAgICIiIkNyZWF0ZSBhbiBvcGVuZXIgb2JqZWN0IGZyb20gYSBsaXN0IG9mIGhhbmRsZXJzLgorCisgICAgVGhlIG9wZW5lciB3aWxsIHVzZSBzZXZlcmFsIGRlZmF1bHQgaGFuZGxlcnMsIGluY2x1ZGluZyBzdXBwb3J0CisgICAgZm9yIEhUVFAsIEZUUCBhbmQgd2hlbiBhcHBsaWNhYmxlLCBIVFRQUy4KKworICAgIElmIGFueSBvZiB0aGUgaGFuZGxlcnMgcGFzc2VkIGFzIGFyZ3VtZW50cyBhcmUgc3ViY2xhc3NlcyBvZiB0aGUKKyAgICBkZWZhdWx0IGhhbmRsZXJzLCB0aGUgZGVmYXVsdCBoYW5kbGVycyB3aWxsIG5vdCBiZSB1c2VkLgorICAgICIiIgorICAgIGltcG9ydCB0eXBlcworICAgIGRlZiBpc2NsYXNzKG9iaik6CisgICAgICAgIHJldHVybiBpc2luc3RhbmNlKG9iaiwgKHR5cGVzLkNsYXNzVHlwZSwgdHlwZSkpCisKKyAgICBvcGVuZXIgPSBPcGVuZXJEaXJlY3RvcigpCisgICAgZGVmYXVsdF9jbGFzc2VzID0gW1Byb3h5SGFuZGxlciwgVW5rbm93bkhhbmRsZXIsIEhUVFBIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICBIVFRQRGVmYXVsdEVycm9ySGFuZGxlciwgSFRUUFJlZGlyZWN0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRlRQSGFuZGxlciwgRmlsZUhhbmRsZXIsIEhUVFBFcnJvclByb2Nlc3Nvcl0KKyAgICBpZiBoYXNhdHRyKGh0dHBsaWIsICdIVFRQUycpOgorICAgICAgICBkZWZhdWx0X2NsYXNzZXMuYXBwZW5kKEhUVFBTSGFuZGxlcikKKyAgICBza2lwID0gc2V0KCkKKyAgICBmb3Iga2xhc3MgaW4gZGVmYXVsdF9jbGFzc2VzOgorICAgICAgICBmb3IgY2hlY2sgaW4gaGFuZGxlcnM6CisgICAgICAgICAgICBpZiBpc2NsYXNzKGNoZWNrKToKKyAgICAgICAgICAgICAgICBpZiBpc3N1YmNsYXNzKGNoZWNrLCBrbGFzcyk6CisgICAgICAgICAgICAgICAgICAgIHNraXAuYWRkKGtsYXNzKQorICAgICAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNoZWNrLCBrbGFzcyk6CisgICAgICAgICAgICAgICAgc2tpcC5hZGQoa2xhc3MpCisgICAgZm9yIGtsYXNzIGluIHNraXA6CisgICAgICAgIGRlZmF1bHRfY2xhc3Nlcy5yZW1vdmUoa2xhc3MpCisKKyAgICBmb3Iga2xhc3MgaW4gZGVmYXVsdF9jbGFzc2VzOgorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoa2xhc3MoKSkKKworICAgIGZvciBoIGluIGhhbmRsZXJzOgorICAgICAgICBpZiBpc2NsYXNzKGgpOgorICAgICAgICAgICAgaCA9IGgoKQorICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaCkKKyAgICByZXR1cm4gb3BlbmVyCisKK2NsYXNzIEJhc2VIYW5kbGVyOgorICAgIGhhbmRsZXJfb3JkZXIgPSA1MDAKKworICAgIGRlZiBhZGRfcGFyZW50KHNlbGYsIHBhcmVudCk6CisgICAgICAgIHNlbGYucGFyZW50ID0gcGFyZW50CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICMgT25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfX2x0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihvdGhlciwgImhhbmRsZXJfb3JkZXIiKToKKyAgICAgICAgICAgICMgVHJ5IHRvIHByZXNlcnZlIHRoZSBvbGQgYmVoYXZpb3Igb2YgaGF2aW5nIGN1c3RvbSBjbGFzc2VzCisgICAgICAgICAgICAjIGluc2VydGVkIGFmdGVyIGRlZmF1bHQgb25lcyAod29ya3Mgb25seSBmb3IgY3VzdG9tIHVzZXIKKyAgICAgICAgICAgICMgY2xhc3NlcyB3aGljaCBhcmUgbm90IGF3YXJlIG9mIGhhbmRsZXJfb3JkZXIpLgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIHNlbGYuaGFuZGxlcl9vcmRlciA8IG90aGVyLmhhbmRsZXJfb3JkZXIKKworCitjbGFzcyBIVFRQRXJyb3JQcm9jZXNzb3IoQmFzZUhhbmRsZXIpOgorICAgICIiIlByb2Nlc3MgSFRUUCBlcnJvciByZXNwb25zZXMuIiIiCisgICAgaGFuZGxlcl9vcmRlciA9IDEwMDAgICMgYWZ0ZXIgYWxsIG90aGVyIHByb2Nlc3NpbmcKKworICAgIGRlZiBodHRwX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlKToKKyAgICAgICAgY29kZSwgbXNnLCBoZHJzID0gcmVzcG9uc2UuY29kZSwgcmVzcG9uc2UubXNnLCByZXNwb25zZS5pbmZvKCkKKworICAgICAgICAjIEFjY29yZGluZyB0byBSRkMgMjYxNiwgIjJ4eCIgY29kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50J3MKKyAgICAgICAgIyByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQsIHVuZGVyc3Rvb2QsIGFuZCBhY2NlcHRlZC4KKyAgICAgICAgaWYgbm90ICgyMDAgPD0gY29kZSA8IDMwMCk6CisgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucGFyZW50LmVycm9yKAorICAgICAgICAgICAgICAgICdodHRwJywgcmVxdWVzdCwgcmVzcG9uc2UsIGNvZGUsIG1zZywgaGRycykKKworICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGh0dHBzX3Jlc3BvbnNlID0gaHR0cF9yZXNwb25zZQorCitjbGFzcyBIVFRQRGVmYXVsdEVycm9ySGFuZGxlcihCYXNlSGFuZGxlcik6CisgICAgZGVmIGh0dHBfZXJyb3JfZGVmYXVsdChzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhkcnMpOgorICAgICAgICByYWlzZSBIVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBjb2RlLCBtc2csIGhkcnMsIGZwKQorCitjbGFzcyBIVFRQUmVkaXJlY3RIYW5kbGVyKEJhc2VIYW5kbGVyKToKKyAgICAjIG1heGltdW0gbnVtYmVyIG9mIHJlZGlyZWN0aW9ucyB0byBhbnkgc2luZ2xlIFVSTAorICAgICMgdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgc3RhdGUgdGhhdCBjb29raWVzIGludHJvZHVjZQorICAgIG1heF9yZXBlYXRzID0gNAorICAgICMgbWF4aW11bSB0b3RhbCBudW1iZXIgb2YgcmVkaXJlY3Rpb25zIChyZWdhcmRsZXNzIG9mIFVSTCkgYmVmb3JlCisgICAgIyBhc3N1bWluZyB3ZSdyZSBpbiBhIGxvb3AKKyAgICBtYXhfcmVkaXJlY3Rpb25zID0gMTAKKworICAgIGRlZiByZWRpcmVjdF9yZXF1ZXN0KHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywgaGVhZGVycywgbmV3dXJsKToKKyAgICAgICAgIiIiUmV0dXJuIGEgUmVxdWVzdCBvciBOb25lIGluIHJlc3BvbnNlIHRvIGEgcmVkaXJlY3QuCisKKyAgICAgICAgVGhpcyBpcyBjYWxsZWQgYnkgdGhlIGh0dHBfZXJyb3JfMzB4IG1ldGhvZHMgd2hlbiBhCisgICAgICAgIHJlZGlyZWN0aW9uIHJlc3BvbnNlIGlzIHJlY2VpdmVkLiAgSWYgYSByZWRpcmVjdGlvbiBzaG91bGQKKyAgICAgICAgdGFrZSBwbGFjZSwgcmV0dXJuIGEgbmV3IFJlcXVlc3QgdG8gYWxsb3cgaHR0cF9lcnJvcl8zMHggdG8KKyAgICAgICAgcGVyZm9ybSB0aGUgcmVkaXJlY3QuICBPdGhlcndpc2UsIHJhaXNlIEhUVFBFcnJvciBpZiBuby1vbmUKKyAgICAgICAgZWxzZSBzaG91bGQgdHJ5IHRvIGhhbmRsZSB0aGlzIHVybC4gIFJldHVybiBOb25lIGlmIHlvdSBjYW4ndAorICAgICAgICBidXQgYW5vdGhlciBIYW5kbGVyIG1pZ2h0LgorICAgICAgICAiIiIKKyAgICAgICAgbSA9IHJlcS5nZXRfbWV0aG9kKCkKKyAgICAgICAgaWYgKGNvZGUgaW4gKDMwMSwgMzAyLCAzMDMsIDMwNykgYW5kIG0gaW4gKCJHRVQiLCAiSEVBRCIpCisgICAgICAgICAgICBvciBjb2RlIGluICgzMDEsIDMwMiwgMzAzKSBhbmQgbSA9PSAiUE9TVCIpOgorICAgICAgICAgICAgIyBTdHJpY3RseSAoYWNjb3JkaW5nIHRvIFJGQyAyNjE2KSwgMzAxIG9yIDMwMiBpbiByZXNwb25zZQorICAgICAgICAgICAgIyB0byBhIFBPU1QgTVVTVCBOT1QgY2F1c2UgYSByZWRpcmVjdGlvbiB3aXRob3V0IGNvbmZpcm1hdGlvbgorICAgICAgICAgICAgIyBmcm9tIHRoZSB1c2VyIChvZiB1cmxsaWIyLCBpbiB0aGlzIGNhc2UpLiAgSW4gcHJhY3RpY2UsCisgICAgICAgICAgICAjIGVzc2VudGlhbGx5IGFsbCBjbGllbnRzIGRvIHJlZGlyZWN0IGluIHRoaXMgY2FzZSwgc28gd2UKKyAgICAgICAgICAgICMgZG8gdGhlIHNhbWUuCisgICAgICAgICAgICAjIGJlIGNvbmNpbGlhbnQgd2l0aCBVUklzIGNvbnRhaW5pbmcgYSBzcGFjZQorICAgICAgICAgICAgbmV3dXJsID0gbmV3dXJsLnJlcGxhY2UoJyAnLCAnJTIwJykKKyAgICAgICAgICAgIG5ld2hlYWRlcnMgPSBkaWN0KChrLHYpIGZvciBrLHYgaW4gcmVxLmhlYWRlcnMuaXRlbXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgay5sb3dlcigpIG5vdCBpbiAoImNvbnRlbnQtbGVuZ3RoIiwgImNvbnRlbnQtdHlwZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHJldHVybiBSZXF1ZXN0KG5ld3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM9bmV3aGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbl9yZXFfaG9zdD1yZXEuZ2V0X29yaWdpbl9yZXFfaG9zdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW52ZXJpZmlhYmxlPVRydWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBIVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBjb2RlLCBtc2csIGhlYWRlcnMsIGZwKQorCisgICAgIyBJbXBsZW1lbnRhdGlvbiBub3RlOiBUbyBhdm9pZCB0aGUgc2VydmVyIHNlbmRpbmcgdXMgaW50byBhbgorICAgICMgaW5maW5pdGUgbG9vcCwgdGhlIHJlcXVlc3Qgb2JqZWN0IG5lZWRzIHRvIHRyYWNrIHdoYXQgVVJMcyB3ZQorICAgICMgaGF2ZSBhbHJlYWR5IHNlZW4uICBEbyB0aGlzIGJ5IGFkZGluZyBhIGhhbmRsZXItc3BlY2lmaWMKKyAgICAjIGF0dHJpYnV0ZSB0byB0aGUgUmVxdWVzdCBvYmplY3QuCisgICAgZGVmIGh0dHBfZXJyb3JfMzAyKHNlbGYsIHJlcSwgZnAsIGNvZGUsIG1zZywgaGVhZGVycyk6CisgICAgICAgICMgU29tZSBzZXJ2ZXJzIChpbmNvcnJlY3RseSkgcmV0dXJuIG11bHRpcGxlIExvY2F0aW9uIGhlYWRlcnMKKyAgICAgICAgIyAoc28gcHJvYmFibHkgc2FtZSBnb2VzIGZvciBVUkkpLiAgVXNlIGZpcnN0IGhlYWRlci4KKyAgICAgICAgaWYgJ2xvY2F0aW9uJyBpbiBoZWFkZXJzOgorICAgICAgICAgICAgbmV3dXJsID0gaGVhZGVycy5nZXRoZWFkZXJzKCdsb2NhdGlvbicpWzBdCisgICAgICAgIGVsaWYgJ3VyaScgaW4gaGVhZGVyczoKKyAgICAgICAgICAgIG5ld3VybCA9IGhlYWRlcnMuZ2V0aGVhZGVycygndXJpJylbMF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgZml4IGEgcG9zc2libGUgbWFsZm9ybWVkIFVSTAorICAgICAgICB1cmxwYXJ0cyA9IHVybHBhcnNlLnVybHBhcnNlKG5ld3VybCkKKyAgICAgICAgaWYgbm90IHVybHBhcnRzLnBhdGg6CisgICAgICAgICAgICB1cmxwYXJ0cyA9IGxpc3QodXJscGFydHMpCisgICAgICAgICAgICB1cmxwYXJ0c1syXSA9ICIvIgorICAgICAgICBuZXd1cmwgPSB1cmxwYXJzZS51cmx1bnBhcnNlKHVybHBhcnRzKQorCisgICAgICAgIG5ld3VybCA9IHVybHBhcnNlLnVybGpvaW4ocmVxLmdldF9mdWxsX3VybCgpLCBuZXd1cmwpCisKKyAgICAgICAgIyBGb3Igc2VjdXJpdHkgcmVhc29ucyB3ZSBkbyBub3QgYWxsb3cgcmVkaXJlY3RzIHRvIHByb3RvY29scworICAgICAgICAjIG90aGVyIHRoYW4gSFRUUCwgSFRUUFMgb3IgRlRQLgorICAgICAgICBuZXd1cmxfbG93ZXIgPSBuZXd1cmwubG93ZXIoKQorICAgICAgICBpZiBub3QgKG5ld3VybF9sb3dlci5zdGFydHN3aXRoKCdodHRwOi8vJykgb3IKKyAgICAgICAgICAgICAgICBuZXd1cmxfbG93ZXIuc3RhcnRzd2l0aCgnaHR0cHM6Ly8nKSBvcgorICAgICAgICAgICAgICAgIG5ld3VybF9sb3dlci5zdGFydHN3aXRoKCdmdHA6Ly8nKSk6CisgICAgICAgICAgICByYWlzZSBIVFRQRXJyb3IobmV3dXJsLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArICIgLSBSZWRpcmVjdGlvbiB0byB1cmwgJyVzJyBpcyBub3QgYWxsb3dlZCIgJQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld3VybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLCBmcCkKKworICAgICAgICAjIFhYWCBQcm9iYWJseSB3YW50IHRvIGZvcmdldCBhYm91dCB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQKKyAgICAgICAgIyByZXF1ZXN0LCBhbHRob3VnaCB0aGF0IG1pZ2h0IGludGVyYWN0IHBvb3JseSB3aXRoIG90aGVyCisgICAgICAgICMgaGFuZGxlcnMgdGhhdCBhbHNvIHVzZSBoYW5kbGVyLXNwZWNpZmljIHJlcXVlc3QgYXR0cmlidXRlcworICAgICAgICBuZXcgPSBzZWxmLnJlZGlyZWN0X3JlcXVlc3QocmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzLCBuZXd1cmwpCisgICAgICAgIGlmIG5ldyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBsb29wIGRldGVjdGlvbgorICAgICAgICAjIC5yZWRpcmVjdF9kaWN0IGhhcyBhIGtleSB1cmwgaWYgdXJsIHdhcyBwcmV2aW91c2x5IHZpc2l0ZWQuCisgICAgICAgIGlmIGhhc2F0dHIocmVxLCAncmVkaXJlY3RfZGljdCcpOgorICAgICAgICAgICAgdmlzaXRlZCA9IG5ldy5yZWRpcmVjdF9kaWN0ID0gcmVxLnJlZGlyZWN0X2RpY3QKKyAgICAgICAgICAgIGlmICh2aXNpdGVkLmdldChuZXd1cmwsIDApID49IHNlbGYubWF4X3JlcGVhdHMgb3IKKyAgICAgICAgICAgICAgICBsZW4odmlzaXRlZCkgPj0gc2VsZi5tYXhfcmVkaXJlY3Rpb25zKToKKyAgICAgICAgICAgICAgICByYWlzZSBIVFRQRXJyb3IocmVxLmdldF9mdWxsX3VybCgpLCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmluZl9tc2cgKyBtc2csIGhlYWRlcnMsIGZwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmlzaXRlZCA9IG5ldy5yZWRpcmVjdF9kaWN0ID0gcmVxLnJlZGlyZWN0X2RpY3QgPSB7fQorICAgICAgICB2aXNpdGVkW25ld3VybF0gPSB2aXNpdGVkLmdldChuZXd1cmwsIDApICsgMQorCisgICAgICAgICMgRG9uJ3QgY2xvc2UgdGhlIGZwIHVudGlsIHdlIGFyZSBzdXJlIHRoYXQgd2Ugd29uJ3QgdXNlIGl0CisgICAgICAgICMgd2l0aCBIVFRQRXJyb3IuCisgICAgICAgIGZwLnJlYWQoKQorICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4obmV3LCB0aW1lb3V0PXJlcS50aW1lb3V0KQorCisgICAgaHR0cF9lcnJvcl8zMDEgPSBodHRwX2Vycm9yXzMwMyA9IGh0dHBfZXJyb3JfMzA3ID0gaHR0cF9lcnJvcl8zMDIKKworICAgIGluZl9tc2cgPSAiVGhlIEhUVFAgc2VydmVyIHJldHVybmVkIGEgcmVkaXJlY3QgZXJyb3IgdGhhdCB3b3VsZCAiIFwKKyAgICAgICAgICAgICAgImxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC5cbiIgXAorICAgICAgICAgICAgICAiVGhlIGxhc3QgMzB4IGVycm9yIG1lc3NhZ2Ugd2FzOlxuIgorCisKK2RlZiBfcGFyc2VfcHJveHkocHJveHkpOgorICAgICIiIlJldHVybiAoc2NoZW1lLCB1c2VyLCBwYXNzd29yZCwgaG9zdC9wb3J0KSBnaXZlbiBhIFVSTCBvciBhbiBhdXRob3JpdHkuCisKKyAgICBJZiBhIFVSTCBpcyBzdXBwbGllZCwgaXQgbXVzdCBoYXZlIGFuIGF1dGhvcml0eSAoaG9zdDpwb3J0KSBjb21wb25lbnQuCisgICAgQWNjb3JkaW5nIHRvIFJGQyAzOTg2LCBoYXZpbmcgYW4gYXV0aG9yaXR5IGNvbXBvbmVudCBtZWFucyB0aGUgVVJMIG11c3QKKyAgICBoYXZlIHR3byBzbGFzaGVzIGFmdGVyIHRoZSBzY2hlbWU6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdmaWxlOi9mdHAuZXhhbXBsZS5jb20vJykKKyAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgVmFsdWVFcnJvcjogcHJveHkgVVJMIHdpdGggbm8gYXV0aG9yaXR5OiAnZmlsZTovZnRwLmV4YW1wbGUuY29tLycKKworICAgIFRoZSBmaXJzdCB0aHJlZSBpdGVtcyBvZiB0aGUgcmV0dXJuZWQgdHVwbGUgbWF5IGJlIE5vbmUuCisKKyAgICBFeGFtcGxlcyBvZiBhdXRob3JpdHkgcGFyc2luZzoKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICAoTm9uZSwgTm9uZSwgTm9uZSwgJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICAoTm9uZSwgTm9uZSwgTm9uZSwgJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorCisgICAgVGhlIGF1dGhvcml0eSBjb21wb25lbnQgbWF5IG9wdGlvbmFsbHkgaW5jbHVkZSB1c2VyaW5mbyAoYXNzdW1lZCB0byBiZQorICAgIHVzZXJuYW1lOnBhc3N3b3JkKToKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbScpCisgICAgKE5vbmUsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb20nKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICAoTm9uZSwgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKworICAgIFNhbWUgZXhhbXBsZXMsIGJ1dCB3aXRoIFVSTHMgaW5zdGVhZDoKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2h0dHA6Ly9wcm94eS5leGFtcGxlLmNvbS8nKQorICAgICgnaHR0cCcsIE5vbmUsIE5vbmUsICdwcm94eS5leGFtcGxlLmNvbScpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL3Byb3h5LmV4YW1wbGUuY29tOjMxMjgvJykKKyAgICAoJ2h0dHAnLCBOb25lLCBOb25lLCAncHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbS8nKQorICAgICgnaHR0cCcsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb20nKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ2h0dHA6Ly9qb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisgICAgKCdodHRwJywgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKworICAgIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGF1dGhvcml0eSBpcyBpZ25vcmVkOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnZnRwOi8vam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tL3J1YmJpc2g6MzEyOCcpCisgICAgKCdmdHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tJykKKworICAgIFRlc3QgZm9yIG5vIHRyYWlsaW5nICcvJyBjYXNlOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbScpCisgICAgKCdodHRwJywgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbScpCisKKyAgICAiIiIKKyAgICBzY2hlbWUsIHJfc2NoZW1lID0gc3BsaXR0eXBlKHByb3h5KQorICAgIGlmIG5vdCByX3NjaGVtZS5zdGFydHN3aXRoKCIvIik6CisgICAgICAgICMgYXV0aG9yaXR5CisgICAgICAgIHNjaGVtZSA9IE5vbmUKKyAgICAgICAgYXV0aG9yaXR5ID0gcHJveHkKKyAgICBlbHNlOgorICAgICAgICAjIFVSTAorICAgICAgICBpZiBub3Qgcl9zY2hlbWUuc3RhcnRzd2l0aCgiLy8iKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInByb3h5IFVSTCB3aXRoIG5vIGF1dGhvcml0eTogJXIiICUgcHJveHkpCisgICAgICAgICMgV2UgaGF2ZSBhbiBhdXRob3JpdHksIHNvIGZvciBSRkMgMzk4Ni1jb21wbGlhbnQgVVJMcyAoYnkgc3MgMy4KKyAgICAgICAgIyBhbmQgMy4zLiksIHBhdGggaXMgZW1wdHkgb3Igc3RhcnRzIHdpdGggJy8nCisgICAgICAgIGVuZCA9IHJfc2NoZW1lLmZpbmQoIi8iLCAyKQorICAgICAgICBpZiBlbmQgPT0gLTE6CisgICAgICAgICAgICBlbmQgPSBOb25lCisgICAgICAgIGF1dGhvcml0eSA9IHJfc2NoZW1lWzI6ZW5kXQorICAgIHVzZXJpbmZvLCBob3N0cG9ydCA9IHNwbGl0dXNlcihhdXRob3JpdHkpCisgICAgaWYgdXNlcmluZm8gaXMgbm90IE5vbmU6CisgICAgICAgIHVzZXIsIHBhc3N3b3JkID0gc3BsaXRwYXNzd2QodXNlcmluZm8pCisgICAgZWxzZToKKyAgICAgICAgdXNlciA9IHBhc3N3b3JkID0gTm9uZQorICAgIHJldHVybiBzY2hlbWUsIHVzZXIsIHBhc3N3b3JkLCBob3N0cG9ydAorCitjbGFzcyBQcm94eUhhbmRsZXIoQmFzZUhhbmRsZXIpOgorICAgICMgUHJveGllcyBtdXN0IGJlIGluIGZyb250CisgICAgaGFuZGxlcl9vcmRlciA9IDEwMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3hpZXM9Tm9uZSk6CisgICAgICAgIGlmIHByb3hpZXMgaXMgTm9uZToKKyAgICAgICAgICAgIHByb3hpZXMgPSBnZXRwcm94aWVzKCkKKyAgICAgICAgYXNzZXJ0IGhhc2F0dHIocHJveGllcywgJ2hhc19rZXknKSwgInByb3hpZXMgbXVzdCBiZSBhIG1hcHBpbmciCisgICAgICAgIHNlbGYucHJveGllcyA9IHByb3hpZXMKKyAgICAgICAgZm9yIHR5cGUsIHVybCBpbiBwcm94aWVzLml0ZW1zKCk6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsICclc19vcGVuJyAlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIGxhbWJkYSByLCBwcm94eT11cmwsIHR5cGU9dHlwZSwgbWV0aD1zZWxmLnByb3h5X29wZW46IFwKKyAgICAgICAgICAgICAgICAgICAgbWV0aChyLCBwcm94eSwgdHlwZSkpCisKKyAgICBkZWYgcHJveHlfb3BlbihzZWxmLCByZXEsIHByb3h5LCB0eXBlKToKKyAgICAgICAgb3JpZ190eXBlID0gcmVxLmdldF90eXBlKCkKKyAgICAgICAgcHJveHlfdHlwZSwgdXNlciwgcGFzc3dvcmQsIGhvc3Rwb3J0ID0gX3BhcnNlX3Byb3h5KHByb3h5KQorCisgICAgICAgIGlmIHByb3h5X3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHByb3h5X3R5cGUgPSBvcmlnX3R5cGUKKworICAgICAgICBpZiByZXEuaG9zdCBhbmQgcHJveHlfYnlwYXNzKHJlcS5ob3N0KToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgaWYgdXNlciBhbmQgcGFzc3dvcmQ6CisgICAgICAgICAgICB1c2VyX3Bhc3MgPSAnJXM6JXMnICUgKHVucXVvdGUodXNlciksIHVucXVvdGUocGFzc3dvcmQpKQorICAgICAgICAgICAgY3JlZHMgPSBiYXNlNjQuYjY0ZW5jb2RlKHVzZXJfcGFzcykuc3RyaXAoKQorICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoJ1Byb3h5LWF1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGNyZWRzKQorICAgICAgICBob3N0cG9ydCA9IHVucXVvdGUoaG9zdHBvcnQpCisgICAgICAgIHJlcS5zZXRfcHJveHkoaG9zdHBvcnQsIHByb3h5X3R5cGUpCisKKyAgICAgICAgaWYgb3JpZ190eXBlID09IHByb3h5X3R5cGUgb3Igb3JpZ190eXBlID09ICdodHRwcyc6CisgICAgICAgICAgICAjIGxldCBvdGhlciBoYW5kbGVycyB0YWtlIGNhcmUgb2YgaXQKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5lZWQgdG8gc3RhcnQgb3ZlciwgYmVjYXVzZSB0aGUgb3RoZXIgaGFuZGxlcnMgZG9uJ3QKKyAgICAgICAgICAgICMgZ3JvayB0aGUgcHJveHkncyBVUkwgdHlwZQorICAgICAgICAgICAgIyBlLmcuIGlmIHdlIGhhdmUgYSBjb25zdHJ1Y3RvciBhcmcgcHJveGllcyBsaWtlIHNvOgorICAgICAgICAgICAgIyB7J2h0dHAnOiAnZnRwOi8vcHJveHkuZXhhbXBsZS5jb20nfSwgd2UgbWF5IGVuZCB1cCB0dXJuaW5nCisgICAgICAgICAgICAjIGEgcmVxdWVzdCBmb3IgaHR0cDovL2FjbWUuZXhhbXBsZS5jb20vYSBpbnRvIG9uZSBmb3IKKyAgICAgICAgICAgICMgZnRwOi8vcHJveHkuZXhhbXBsZS5jb20vYQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4ocmVxLCB0aW1lb3V0PXJlcS50aW1lb3V0KQorCitjbGFzcyBIVFRQUGFzc3dvcmRNZ3I6CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucGFzc3dkID0ge30KKworICAgIGRlZiBhZGRfcGFzc3dvcmQoc2VsZiwgcmVhbG0sIHVyaSwgdXNlciwgcGFzc3dkKToKKyAgICAgICAgIyB1cmkgY291bGQgYmUgYSBzaW5nbGUgVVJJIG9yIGEgc2VxdWVuY2UKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh1cmksIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgdXJpID0gW3VyaV0KKyAgICAgICAgaWYgbm90IHJlYWxtIGluIHNlbGYucGFzc3dkOgorICAgICAgICAgICAgc2VsZi5wYXNzd2RbcmVhbG1dID0ge30KKyAgICAgICAgZm9yIGRlZmF1bHRfcG9ydCBpbiBUcnVlLCBGYWxzZToKKyAgICAgICAgICAgIHJlZHVjZWRfdXJpID0gdHVwbGUoCisgICAgICAgICAgICAgICAgW3NlbGYucmVkdWNlX3VyaSh1LCBkZWZhdWx0X3BvcnQpIGZvciB1IGluIHVyaV0pCisgICAgICAgICAgICBzZWxmLnBhc3N3ZFtyZWFsbV1bcmVkdWNlZF91cmldID0gKHVzZXIsIHBhc3N3ZCkKKworICAgIGRlZiBmaW5kX3VzZXJfcGFzc3dvcmQoc2VsZiwgcmVhbG0sIGF1dGh1cmkpOgorICAgICAgICBkb21haW5zID0gc2VsZi5wYXNzd2QuZ2V0KHJlYWxtLCB7fSkKKyAgICAgICAgZm9yIGRlZmF1bHRfcG9ydCBpbiBUcnVlLCBGYWxzZToKKyAgICAgICAgICAgIHJlZHVjZWRfYXV0aHVyaSA9IHNlbGYucmVkdWNlX3VyaShhdXRodXJpLCBkZWZhdWx0X3BvcnQpCisgICAgICAgICAgICBmb3IgdXJpcywgYXV0aGluZm8gaW4gZG9tYWlucy5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICBmb3IgdXJpIGluIHVyaXM6CisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuaXNfc3VidXJpKHVyaSwgcmVkdWNlZF9hdXRodXJpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdXRoaW5mbworICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCisgICAgZGVmIHJlZHVjZV91cmkoc2VsZiwgdXJpLCBkZWZhdWx0X3BvcnQ9VHJ1ZSk6CisgICAgICAgICIiIkFjY2VwdCBhdXRob3JpdHkgb3IgVVJJIGFuZCBleHRyYWN0IG9ubHkgdGhlIGF1dGhvcml0eSBhbmQgcGF0aC4iIiIKKyAgICAgICAgIyBub3RlIEhUVFAgVVJMcyBkbyBub3QgaGF2ZSBhIHVzZXJpbmZvIGNvbXBvbmVudAorICAgICAgICBwYXJ0cyA9IHVybHBhcnNlLnVybHNwbGl0KHVyaSkKKyAgICAgICAgaWYgcGFydHNbMV06CisgICAgICAgICAgICAjIFVSSQorICAgICAgICAgICAgc2NoZW1lID0gcGFydHNbMF0KKyAgICAgICAgICAgIGF1dGhvcml0eSA9IHBhcnRzWzFdCisgICAgICAgICAgICBwYXRoID0gcGFydHNbMl0gb3IgJy8nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGhvc3Qgb3IgaG9zdDpwb3J0CisgICAgICAgICAgICBzY2hlbWUgPSBOb25lCisgICAgICAgICAgICBhdXRob3JpdHkgPSB1cmkKKyAgICAgICAgICAgIHBhdGggPSAnLycKKyAgICAgICAgaG9zdCwgcG9ydCA9IHNwbGl0cG9ydChhdXRob3JpdHkpCisgICAgICAgIGlmIGRlZmF1bHRfcG9ydCBhbmQgcG9ydCBpcyBOb25lIGFuZCBzY2hlbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkcG9ydCA9IHsiaHR0cCI6IDgwLAorICAgICAgICAgICAgICAgICAgICAgImh0dHBzIjogNDQzLAorICAgICAgICAgICAgICAgICAgICAgfS5nZXQoc2NoZW1lKQorICAgICAgICAgICAgaWYgZHBvcnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gIiVzOiVkIiAlIChob3N0LCBkcG9ydCkKKyAgICAgICAgcmV0dXJuIGF1dGhvcml0eSwgcGF0aAorCisgICAgZGVmIGlzX3N1YnVyaShzZWxmLCBiYXNlLCB0ZXN0KToKKyAgICAgICAgIiIiQ2hlY2sgaWYgdGVzdCBpcyBiZWxvdyBiYXNlIGluIGEgVVJJIHRyZWUKKworICAgICAgICBCb3RoIGFyZ3MgbXVzdCBiZSBVUklzIGluIHJlZHVjZWQgZm9ybS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGJhc2UgPT0gdGVzdDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGlmIGJhc2VbMF0gIT0gdGVzdFswXToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBjb21tb24gPSBwb3NpeHBhdGguY29tbW9ucHJlZml4KChiYXNlWzFdLCB0ZXN0WzFdKSkKKyAgICAgICAgaWYgbGVuKGNvbW1vbikgPT0gbGVuKGJhc2VbMV0pOgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKworY2xhc3MgSFRUUFBhc3N3b3JkTWdyV2l0aERlZmF1bHRSZWFsbShIVFRQUGFzc3dvcmRNZ3IpOgorCisgICAgZGVmIGZpbmRfdXNlcl9wYXNzd29yZChzZWxmLCByZWFsbSwgYXV0aHVyaSk6CisgICAgICAgIHVzZXIsIHBhc3N3b3JkID0gSFRUUFBhc3N3b3JkTWdyLmZpbmRfdXNlcl9wYXNzd29yZChzZWxmLCByZWFsbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGh1cmkpCisgICAgICAgIGlmIHVzZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gdXNlciwgcGFzc3dvcmQKKyAgICAgICAgcmV0dXJuIEhUVFBQYXNzd29yZE1nci5maW5kX3VzZXJfcGFzc3dvcmQoc2VsZiwgTm9uZSwgYXV0aHVyaSkKKworCitjbGFzcyBBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXI6CisKKyAgICAjIFhYWCB0aGlzIGFsbG93cyBmb3IgbXVsdGlwbGUgYXV0aC1zY2hlbWVzLCBidXQgd2lsbCBzdHVwaWRseSBwaWNrCisgICAgIyB0aGUgbGFzdCBvbmUgd2l0aCBhIHJlYWxtIHNwZWNpZmllZC4KKworICAgICMgYWxsb3cgZm9yIGRvdWJsZS0gYW5kIHNpbmdsZS1xdW90ZWQgcmVhbG0gdmFsdWVzCisgICAgIyAoc2luZ2xlIHF1b3RlcyBhcmUgYSB2aW9sYXRpb24gb2YgdGhlIFJGQywgYnV0IGFwcGVhciBpbiB0aGUgd2lsZCkKKyAgICByeCA9IHJlLmNvbXBpbGUoJyg/Oi4qLCkqWyBcdF0qKFteIFx0XSspWyBcdF0rJworICAgICAgICAgICAgICAgICAgICAncmVhbG09KFsiXCddPykoW14iXCddKilcXDInLCByZS5JKQorCisgICAgIyBYWFggY291bGQgcHJlLWVtcHRpdmVseSBzZW5kIGF1dGggaW5mbyBhbHJlYWR5IGFjY2VwdGVkIChSRkMgMjYxNywKKyAgICAjIGVuZCBvZiBzZWN0aW9uIDIsIGFuZCBzZWN0aW9uIDEuMiBpbW1lZGlhdGVseSBhZnRlciAiY3JlZGVudGlhbHMiCisgICAgIyBwcm9kdWN0aW9uKS4KKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXNzd29yZF9tZ3I9Tm9uZSk6CisgICAgICAgIGlmIHBhc3N3b3JkX21nciBpcyBOb25lOgorICAgICAgICAgICAgcGFzc3dvcmRfbWdyID0gSFRUUFBhc3N3b3JkTWdyKCkKKyAgICAgICAgc2VsZi5wYXNzd2QgPSBwYXNzd29yZF9tZ3IKKyAgICAgICAgc2VsZi5hZGRfcGFzc3dvcmQgPSBzZWxmLnBhc3N3ZC5hZGRfcGFzc3dvcmQKKyAgICAgICAgc2VsZi5yZXRyaWVkID0gMAorCisgICAgZGVmIHJlc2V0X3JldHJ5X2NvdW50KHNlbGYpOgorICAgICAgICBzZWxmLnJldHJpZWQgPSAwCisKKyAgICBkZWYgaHR0cF9lcnJvcl9hdXRoX3JlcWVkKHNlbGYsIGF1dGhyZXEsIGhvc3QsIHJlcSwgaGVhZGVycyk6CisgICAgICAgICMgaG9zdCBtYXkgYmUgYW4gYXV0aG9yaXR5ICh3aXRob3V0IHVzZXJpbmZvKSBvciBhIFVSTCB3aXRoIGFuCisgICAgICAgICMgYXV0aG9yaXR5CisgICAgICAgICMgWFhYIGNvdWxkIGJlIG11bHRpcGxlIGhlYWRlcnMKKyAgICAgICAgYXV0aHJlcSA9IGhlYWRlcnMuZ2V0KGF1dGhyZXEsIE5vbmUpCisKKyAgICAgICAgaWYgc2VsZi5yZXRyaWVkID4gNToKKyAgICAgICAgICAgICMgcmV0cnkgc2VuZGluZyB0aGUgdXNlcm5hbWU6cGFzc3dvcmQgNSB0aW1lcyBiZWZvcmUgZmFpbGluZy4KKyAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvcihyZXEuZ2V0X2Z1bGxfdXJsKCksIDQwMSwgImJhc2ljIGF1dGggZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZXRyaWVkICs9IDEKKworICAgICAgICBpZiBhdXRocmVxOgorICAgICAgICAgICAgbW8gPSBBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIucnguc2VhcmNoKGF1dGhyZXEpCisgICAgICAgICAgICBpZiBtbzoKKyAgICAgICAgICAgICAgICBzY2hlbWUsIHF1b3RlLCByZWFsbSA9IG1vLmdyb3VwcygpCisgICAgICAgICAgICAgICAgaWYgcXVvdGUgbm90IGluIFsnIicsICInIl06CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oIkJhc2ljIEF1dGggUmVhbG0gd2FzIHVucXVvdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyV2FybmluZywgMikKKyAgICAgICAgICAgICAgICBpZiBzY2hlbWUubG93ZXIoKSA9PSAnYmFzaWMnOgorICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHNlbGYucmV0cnlfaHR0cF9iYXNpY19hdXRoKGhvc3QsIHJlcSwgcmVhbG0pCisgICAgICAgICAgICAgICAgICAgIGlmIHJlc3BvbnNlIGFuZCByZXNwb25zZS5jb2RlICE9IDQwMToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmV0cmllZCA9IDAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKyAgICBkZWYgcmV0cnlfaHR0cF9iYXNpY19hdXRoKHNlbGYsIGhvc3QsIHJlcSwgcmVhbG0pOgorICAgICAgICB1c2VyLCBwdyA9IHNlbGYucGFzc3dkLmZpbmRfdXNlcl9wYXNzd29yZChyZWFsbSwgaG9zdCkKKyAgICAgICAgaWYgcHcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYXcgPSAiJXM6JXMiICUgKHVzZXIsIHB3KQorICAgICAgICAgICAgYXV0aCA9ICdCYXNpYyAlcycgJSBiYXNlNjQuYjY0ZW5jb2RlKHJhdykuc3RyaXAoKQorICAgICAgICAgICAgaWYgcmVxLmhlYWRlcnMuZ2V0KHNlbGYuYXV0aF9oZWFkZXIsIE5vbmUpID09IGF1dGg6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihzZWxmLmF1dGhfaGVhZGVyLCBhdXRoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4ocmVxLCB0aW1lb3V0PXJlcS50aW1lb3V0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBIVFRQQmFzaWNBdXRoSGFuZGxlcihBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIsIEJhc2VIYW5kbGVyKToKKworICAgIGF1dGhfaGVhZGVyID0gJ0F1dGhvcml6YXRpb24nCisKKyAgICBkZWYgaHR0cF9lcnJvcl80MDEoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKKyAgICAgICAgdXJsID0gcmVxLmdldF9mdWxsX3VybCgpCisgICAgICAgIHJlc3BvbnNlID0gc2VsZi5odHRwX2Vycm9yX2F1dGhfcmVxZWQoJ3d3dy1hdXRoZW50aWNhdGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCwgcmVxLCBoZWFkZXJzKQorICAgICAgICBzZWxmLnJlc2V0X3JldHJ5X2NvdW50KCkKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKworY2xhc3MgUHJveHlCYXNpY0F1dGhIYW5kbGVyKEFic3RyYWN0QmFzaWNBdXRoSGFuZGxlciwgQmFzZUhhbmRsZXIpOgorCisgICAgYXV0aF9oZWFkZXIgPSAnUHJveHktYXV0aG9yaXphdGlvbicKKworICAgIGRlZiBodHRwX2Vycm9yXzQwNyhzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgorICAgICAgICAjIGh0dHBfZXJyb3JfYXV0aF9yZXFlZCByZXF1aXJlcyB0aGF0IHRoZXJlIGlzIG5vIHVzZXJpbmZvIGNvbXBvbmVudCBpbgorICAgICAgICAjIGF1dGhvcml0eS4gIEFzc3VtZSB0aGVyZSBpc24ndCBvbmUsIHNpbmNlIHVybGxpYjIgZG9lcyBub3QgKGFuZAorICAgICAgICAjIHNob3VsZCBub3QsIFJGQyAzOTg2IHMuIDMuMi4xKSBzdXBwb3J0IHJlcXVlc3RzIGZvciBVUkxzIGNvbnRhaW5pbmcKKyAgICAgICAgIyB1c2VyaW5mby4KKyAgICAgICAgYXV0aG9yaXR5ID0gcmVxLmdldF9ob3N0KCkKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmh0dHBfZXJyb3JfYXV0aF9yZXFlZCgncHJveHktYXV0aGVudGljYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml0eSwgcmVxLCBoZWFkZXJzKQorICAgICAgICBzZWxmLnJlc2V0X3JldHJ5X2NvdW50KCkKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKworZGVmIHJhbmRvbWJ5dGVzKG4pOgorICAgICIiIlJldHVybiBuIHJhbmRvbSBieXRlcy4iIiIKKyAgICAjIFVzZSAvZGV2L3VyYW5kb20gaWYgaXQgaXMgYXZhaWxhYmxlLiAgRmFsbCBiYWNrIHRvIHJhbmRvbSBtb2R1bGUKKyAgICAjIGlmIG5vdC4gIEl0IG1pZ2h0IGJlIHdvcnRod2hpbGUgdG8gZXh0ZW5kIHRoaXMgZnVuY3Rpb24gdG8gdXNlCisgICAgIyBvdGhlciBwbGF0Zm9ybS1zcGVjaWZpYyBtZWNoYW5pc21zIGZvciBnZXR0aW5nIHJhbmRvbSBieXRlcy4KKyAgICBpZiBvcy5wYXRoLmV4aXN0cygiL2Rldi91cmFuZG9tIik6CisgICAgICAgIGYgPSBvcGVuKCIvZGV2L3VyYW5kb20iKQorICAgICAgICBzID0gZi5yZWFkKG4pCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gcworICAgIGVsc2U6CisgICAgICAgIEwgPSBbY2hyKHJhbmRvbS5yYW5kcmFuZ2UoMCwgMjU2KSkgZm9yIGkgaW4gcmFuZ2UobildCisgICAgICAgIHJldHVybiAiIi5qb2luKEwpCisKK2NsYXNzIEFic3RyYWN0RGlnZXN0QXV0aEhhbmRsZXI6CisgICAgIyBEaWdlc3QgYXV0aGVudGljYXRpb24gaXMgc3BlY2lmaWVkIGluIFJGQyAyNjE3LgorCisgICAgIyBYWFggVGhlIGNsaWVudCBkb2VzIG5vdCBpbnNwZWN0IHRoZSBBdXRoZW50aWNhdGlvbi1JbmZvIGhlYWRlcgorICAgICMgaW4gYSBzdWNjZXNzZnVsIHJlc3BvbnNlLgorCisgICAgIyBYWFggSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHRlc3QgdGhpcyBpbXBsZW1lbnRhdGlvbiBhZ2FpbnN0CisgICAgIyBhIG1vY2sgc2VydmVyIHRoYXQganVzdCBnZW5lcmF0ZXMgYSBzdGF0aWMgc2V0IG9mIGNoYWxsZW5nZXMuCisKKyAgICAjIFhYWCBxb3A9ImF1dGgtaW50IiBzdXBwb3J0cyBpcyBzaGFreQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhc3N3ZD1Ob25lKToKKyAgICAgICAgaWYgcGFzc3dkIGlzIE5vbmU6CisgICAgICAgICAgICBwYXNzd2QgPSBIVFRQUGFzc3dvcmRNZ3IoKQorICAgICAgICBzZWxmLnBhc3N3ZCA9IHBhc3N3ZAorICAgICAgICBzZWxmLmFkZF9wYXNzd29yZCA9IHNlbGYucGFzc3dkLmFkZF9wYXNzd29yZAorICAgICAgICBzZWxmLnJldHJpZWQgPSAwCisgICAgICAgIHNlbGYubm9uY2VfY291bnQgPSAwCisgICAgICAgIHNlbGYubGFzdF9ub25jZSA9IE5vbmUKKworICAgIGRlZiByZXNldF9yZXRyeV9jb3VudChzZWxmKToKKyAgICAgICAgc2VsZi5yZXRyaWVkID0gMAorCisgICAgZGVmIGh0dHBfZXJyb3JfYXV0aF9yZXFlZChzZWxmLCBhdXRoX2hlYWRlciwgaG9zdCwgcmVxLCBoZWFkZXJzKToKKyAgICAgICAgYXV0aHJlcSA9IGhlYWRlcnMuZ2V0KGF1dGhfaGVhZGVyLCBOb25lKQorICAgICAgICBpZiBzZWxmLnJldHJpZWQgPiA1OgorICAgICAgICAgICAgIyBEb24ndCBmYWlsIGVuZGxlc3NseSAtIGlmIHdlIGZhaWxlZCBvbmNlLCB3ZSdsbCBwcm9iYWJseQorICAgICAgICAgICAgIyBmYWlsIGEgc2Vjb25kIHRpbWUuIEhtLiBVbmxlc3MgdGhlIFBhc3N3b3JkIE1hbmFnZXIgaXMKKyAgICAgICAgICAgICMgcHJvbXB0aW5nIGZvciB0aGUgaW5mb3JtYXRpb24uIENyYXAuIFRoaXMgaXNuJ3QgZ3JlYXQKKyAgICAgICAgICAgICMgYnV0IGl0J3MgYmV0dGVyIHRoYW4gdGhlIGN1cnJlbnQgJ3JlcGVhdCB1bnRpbCByZWN1cnNpb24KKyAgICAgICAgICAgICMgZGVwdGggZXhjZWVkZWQnIGFwcHJvYWNoIDx3aW5rPgorICAgICAgICAgICAgcmFpc2UgSFRUUEVycm9yKHJlcS5nZXRfZnVsbF91cmwoKSwgNDAxLCAiZGlnZXN0IGF1dGggZmFpbGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZXRyaWVkICs9IDEKKyAgICAgICAgaWYgYXV0aHJlcToKKyAgICAgICAgICAgIHNjaGVtZSA9IGF1dGhyZXEuc3BsaXQoKVswXQorICAgICAgICAgICAgaWYgc2NoZW1lLmxvd2VyKCkgPT0gJ2RpZ2VzdCc6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0cnlfaHR0cF9kaWdlc3RfYXV0aChyZXEsIGF1dGhyZXEpCisKKyAgICBkZWYgcmV0cnlfaHR0cF9kaWdlc3RfYXV0aChzZWxmLCByZXEsIGF1dGgpOgorICAgICAgICB0b2tlbiwgY2hhbGxlbmdlID0gYXV0aC5zcGxpdCgnICcsIDEpCisgICAgICAgIGNoYWwgPSBwYXJzZV9rZXF2X2xpc3QocGFyc2VfaHR0cF9saXN0KGNoYWxsZW5nZSkpCisgICAgICAgIGF1dGggPSBzZWxmLmdldF9hdXRob3JpemF0aW9uKHJlcSwgY2hhbCkKKyAgICAgICAgaWYgYXV0aDoKKyAgICAgICAgICAgIGF1dGhfdmFsID0gJ0RpZ2VzdCAlcycgJSBhdXRoCisgICAgICAgICAgICBpZiByZXEuaGVhZGVycy5nZXQoc2VsZi5hdXRoX2hlYWRlciwgTm9uZSkgPT0gYXV0aF92YWw6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIHJlcS5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihzZWxmLmF1dGhfaGVhZGVyLCBhdXRoX3ZhbCkKKyAgICAgICAgICAgIHJlc3AgPSBzZWxmLnBhcmVudC5vcGVuKHJlcSwgdGltZW91dD1yZXEudGltZW91dCkKKyAgICAgICAgICAgIHJldHVybiByZXNwCisKKyAgICBkZWYgZ2V0X2Nub25jZShzZWxmLCBub25jZSk6CisgICAgICAgICMgVGhlIGNub25jZS12YWx1ZSBpcyBhbiBvcGFxdWUKKyAgICAgICAgIyBxdW90ZWQgc3RyaW5nIHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgYW5kIHVzZWQgYnkgYm90aCBjbGllbnQKKyAgICAgICAgIyBhbmQgc2VydmVyIHRvIGF2b2lkIGNob3NlbiBwbGFpbnRleHQgYXR0YWNrcywgdG8gcHJvdmlkZSBtdXR1YWwKKyAgICAgICAgIyBhdXRoZW50aWNhdGlvbiwgYW5kIHRvIHByb3ZpZGUgc29tZSBtZXNzYWdlIGludGVncml0eSBwcm90ZWN0aW9uLgorICAgICAgICAjIFRoaXMgaXNuJ3QgYSBmYWJ1bG91cyBlZmZvcnQsIGJ1dCBpdCdzIHByb2JhYmx5IEdvb2QgRW5vdWdoLgorICAgICAgICBkaWcgPSBoYXNobGliLnNoYTEoIiVzOiVzOiVzOiVzIiAlIChzZWxmLm5vbmNlX2NvdW50LCBub25jZSwgdGltZS5jdGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb21ieXRlcyg4KSkpLmhleGRpZ2VzdCgpCisgICAgICAgIHJldHVybiBkaWdbOjE2XQorCisgICAgZGVmIGdldF9hdXRob3JpemF0aW9uKHNlbGYsIHJlcSwgY2hhbCk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlYWxtID0gY2hhbFsncmVhbG0nXQorICAgICAgICAgICAgbm9uY2UgPSBjaGFsWydub25jZSddCisgICAgICAgICAgICBxb3AgPSBjaGFsLmdldCgncW9wJykKKyAgICAgICAgICAgIGFsZ29yaXRobSA9IGNoYWwuZ2V0KCdhbGdvcml0aG0nLCAnTUQ1JykKKyAgICAgICAgICAgICMgbW9kX2RpZ2VzdCBkb2Vzbid0IHNlbmQgYW4gb3BhcXVlLCBldmVuIHRob3VnaCBpdCBpc24ndAorICAgICAgICAgICAgIyBzdXBwb3NlZCB0byBiZSBvcHRpb25hbAorICAgICAgICAgICAgb3BhcXVlID0gY2hhbC5nZXQoJ29wYXF1ZScsIE5vbmUpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgSCwgS0QgPSBzZWxmLmdldF9hbGdvcml0aG1faW1wbHMoYWxnb3JpdGhtKQorICAgICAgICBpZiBIIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgIHVzZXIsIHB3ID0gc2VsZi5wYXNzd2QuZmluZF91c2VyX3Bhc3N3b3JkKHJlYWxtLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCisgICAgICAgIGlmIHVzZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgIyBYWFggbm90IGltcGxlbWVudGVkIHlldAorICAgICAgICBpZiByZXEuaGFzX2RhdGEoKToKKyAgICAgICAgICAgIGVudGRpZyA9IHNlbGYuZ2V0X2VudGl0eV9kaWdlc3QocmVxLmdldF9kYXRhKCksIGNoYWwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnRkaWcgPSBOb25lCisKKyAgICAgICAgQTEgPSAiJXM6JXM6JXMiICUgKHVzZXIsIHJlYWxtLCBwdykKKyAgICAgICAgQTIgPSAiJXM6JXMiICUgKHJlcS5nZXRfbWV0aG9kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAjIFhYWCBzZWxlY3Rvcjogd2hhdCBhYm91dCBwcm94aWVzIGFuZCBmdWxsIHVybHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5nZXRfc2VsZWN0b3IoKSkKKyAgICAgICAgaWYgcW9wID09ICdhdXRoJzoKKyAgICAgICAgICAgIGlmIG5vbmNlID09IHNlbGYubGFzdF9ub25jZToKKyAgICAgICAgICAgICAgICBzZWxmLm5vbmNlX2NvdW50ICs9IDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5ub25jZV9jb3VudCA9IDEKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3Rfbm9uY2UgPSBub25jZQorCisgICAgICAgICAgICBuY3ZhbHVlID0gJyUwOHgnICUgc2VsZi5ub25jZV9jb3VudAorICAgICAgICAgICAgY25vbmNlID0gc2VsZi5nZXRfY25vbmNlKG5vbmNlKQorICAgICAgICAgICAgbm9uY2ViaXQgPSAiJXM6JXM6JXM6JXM6JXMiICUgKG5vbmNlLCBuY3ZhbHVlLCBjbm9uY2UsIHFvcCwgSChBMikpCisgICAgICAgICAgICByZXNwZGlnID0gS0QoSChBMSksIG5vbmNlYml0KQorICAgICAgICBlbGlmIHFvcCBpcyBOb25lOgorICAgICAgICAgICAgcmVzcGRpZyA9IEtEKEgoQTEpLCAiJXM6JXMiICUgKG5vbmNlLCBIKEEyKSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFhYWCBoYW5kbGUgYXV0aC1pbnQuCisgICAgICAgICAgICByYWlzZSBVUkxFcnJvcigicW9wICclcycgaXMgbm90IHN1cHBvcnRlZC4iICUgcW9wKQorCisgICAgICAgICMgWFhYIHNob3VsZCB0aGUgcGFydGlhbCBkaWdlc3RzIGJlIGVuY29kZWQgdG9vPworCisgICAgICAgIGJhc2UgPSAndXNlcm5hbWU9IiVzIiwgcmVhbG09IiVzIiwgbm9uY2U9IiVzIiwgdXJpPSIlcyIsICcgXAorICAgICAgICAgICAgICAgJ3Jlc3BvbnNlPSIlcyInICUgKHVzZXIsIHJlYWxtLCBub25jZSwgcmVxLmdldF9zZWxlY3RvcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BkaWcpCisgICAgICAgIGlmIG9wYXF1ZToKKyAgICAgICAgICAgIGJhc2UgKz0gJywgb3BhcXVlPSIlcyInICUgb3BhcXVlCisgICAgICAgIGlmIGVudGRpZzoKKyAgICAgICAgICAgIGJhc2UgKz0gJywgZGlnZXN0PSIlcyInICUgZW50ZGlnCisgICAgICAgIGJhc2UgKz0gJywgYWxnb3JpdGhtPSIlcyInICUgYWxnb3JpdGhtCisgICAgICAgIGlmIHFvcDoKKyAgICAgICAgICAgIGJhc2UgKz0gJywgcW9wPWF1dGgsIG5jPSVzLCBjbm9uY2U9IiVzIicgJSAobmN2YWx1ZSwgY25vbmNlKQorICAgICAgICByZXR1cm4gYmFzZQorCisgICAgZGVmIGdldF9hbGdvcml0aG1faW1wbHMoc2VsZiwgYWxnb3JpdGhtKToKKyAgICAgICAgIyBhbGdvcml0aG0gc2hvdWxkIGJlIGNhc2UtaW5zZW5zaXRpdmUgYWNjb3JkaW5nIHRvIFJGQzI2MTcKKyAgICAgICAgYWxnb3JpdGhtID0gYWxnb3JpdGhtLnVwcGVyKCkKKyAgICAgICAgIyBsYW1iZGFzIGFzc3VtZSBkaWdlc3QgbW9kdWxlcyBhcmUgaW1wb3J0ZWQgYXQgdGhlIHRvcCBsZXZlbAorICAgICAgICBpZiBhbGdvcml0aG0gPT0gJ01ENSc6CisgICAgICAgICAgICBIID0gbGFtYmRhIHg6IGhhc2hsaWIubWQ1KHgpLmhleGRpZ2VzdCgpCisgICAgICAgIGVsaWYgYWxnb3JpdGhtID09ICdTSEEnOgorICAgICAgICAgICAgSCA9IGxhbWJkYSB4OiBoYXNobGliLnNoYTEoeCkuaGV4ZGlnZXN0KCkKKyAgICAgICAgIyBYWFggTUQ1LXNlc3MKKyAgICAgICAgS0QgPSBsYW1iZGEgcywgZDogSCgiJXM6JXMiICUgKHMsIGQpKQorICAgICAgICByZXR1cm4gSCwgS0QKKworICAgIGRlZiBnZXRfZW50aXR5X2RpZ2VzdChzZWxmLCBkYXRhLCBjaGFsKToKKyAgICAgICAgIyBYWFggbm90IGltcGxlbWVudGVkIHlldAorICAgICAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIEhUVFBEaWdlc3RBdXRoSGFuZGxlcihCYXNlSGFuZGxlciwgQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlcik6CisgICAgIiIiQW4gYXV0aGVudGljYXRpb24gcHJvdG9jb2wgZGVmaW5lZCBieSBSRkMgMjA2OQorCisgICAgRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGltcHJvdmVzIG9uIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGJlY2F1c2UgaXQKKyAgICBkb2VzIG5vdCB0cmFuc21pdCBwYXNzd29yZHMgaW4gdGhlIGNsZWFyLgorICAgICIiIgorCisgICAgYXV0aF9oZWFkZXIgPSAnQXV0aG9yaXphdGlvbicKKyAgICBoYW5kbGVyX29yZGVyID0gNDkwICAjIGJlZm9yZSBCYXNpYyBhdXRoCisKKyAgICBkZWYgaHR0cF9lcnJvcl80MDEoc2VsZiwgcmVxLCBmcCwgY29kZSwgbXNnLCBoZWFkZXJzKToKKyAgICAgICAgaG9zdCA9IHVybHBhcnNlLnVybHBhcnNlKHJlcS5nZXRfZnVsbF91cmwoKSlbMV0KKyAgICAgICAgcmV0cnkgPSBzZWxmLmh0dHBfZXJyb3JfYXV0aF9yZXFlZCgnd3d3LWF1dGhlbnRpY2F0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdCwgcmVxLCBoZWFkZXJzKQorICAgICAgICBzZWxmLnJlc2V0X3JldHJ5X2NvdW50KCkKKyAgICAgICAgcmV0dXJuIHJldHJ5CisKKworY2xhc3MgUHJveHlEaWdlc3RBdXRoSGFuZGxlcihCYXNlSGFuZGxlciwgQWJzdHJhY3REaWdlc3RBdXRoSGFuZGxlcik6CisKKyAgICBhdXRoX2hlYWRlciA9ICdQcm94eS1BdXRob3JpemF0aW9uJworICAgIGhhbmRsZXJfb3JkZXIgPSA0OTAgICMgYmVmb3JlIEJhc2ljIGF1dGgKKworICAgIGRlZiBodHRwX2Vycm9yXzQwNyhzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgorICAgICAgICBob3N0ID0gcmVxLmdldF9ob3N0KCkKKyAgICAgICAgcmV0cnkgPSBzZWxmLmh0dHBfZXJyb3JfYXV0aF9yZXFlZCgncHJveHktYXV0aGVudGljYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LCByZXEsIGhlYWRlcnMpCisgICAgICAgIHNlbGYucmVzZXRfcmV0cnlfY291bnQoKQorICAgICAgICByZXR1cm4gcmV0cnkKKworY2xhc3MgQWJzdHJhY3RIVFRQSGFuZGxlcihCYXNlSGFuZGxlcik6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVidWdsZXZlbD0wKToKKyAgICAgICAgc2VsZi5fZGVidWdsZXZlbCA9IGRlYnVnbGV2ZWwKKworICAgIGRlZiBzZXRfaHR0cF9kZWJ1Z2xldmVsKHNlbGYsIGxldmVsKToKKyAgICAgICAgc2VsZi5fZGVidWdsZXZlbCA9IGxldmVsCisKKyAgICBkZWYgZG9fcmVxdWVzdF8oc2VsZiwgcmVxdWVzdCk6CisgICAgICAgIGhvc3QgPSByZXF1ZXN0LmdldF9ob3N0KCkKKyAgICAgICAgaWYgbm90IGhvc3Q6CisgICAgICAgICAgICByYWlzZSBVUkxFcnJvcignbm8gaG9zdCBnaXZlbicpCisKKyAgICAgICAgaWYgcmVxdWVzdC5oYXNfZGF0YSgpOiAgIyBQT1NUCisgICAgICAgICAgICBkYXRhID0gcmVxdWVzdC5nZXRfZGF0YSgpCisgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LXR5cGUnKToKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAorICAgICAgICAgICAgICAgICAgICAnQ29udGVudC10eXBlJywKKyAgICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCisgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LWxlbmd0aCcpOgorICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICdDb250ZW50LWxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCisKKyAgICAgICAgc2VsX2hvc3QgPSBob3N0CisgICAgICAgIGlmIHJlcXVlc3QuaGFzX3Byb3h5KCk6CisgICAgICAgICAgICBzY2hlbWUsIHNlbCA9IHNwbGl0dHlwZShyZXF1ZXN0LmdldF9zZWxlY3RvcigpKQorICAgICAgICAgICAgc2VsX2hvc3QsIHNlbF9wYXRoID0gc3BsaXRob3N0KHNlbCkKKworICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdIb3N0Jyk6CisgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCdIb3N0Jywgc2VsX2hvc3QpCisgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzZWxmLnBhcmVudC5hZGRoZWFkZXJzOgorICAgICAgICAgICAgbmFtZSA9IG5hbWUuY2FwaXRhbGl6ZSgpCisgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKG5hbWUpOgorICAgICAgICAgICAgICAgIHJlcXVlc3QuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIobmFtZSwgdmFsdWUpCisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QKKworICAgIGRlZiBkb19vcGVuKHNlbGYsIGh0dHBfY2xhc3MsIHJlcSk6CisgICAgICAgICIiIlJldHVybiBhbiBhZGRpbmZvdXJsIG9iamVjdCBmb3IgdGhlIHJlcXVlc3QsIHVzaW5nIGh0dHBfY2xhc3MuCisKKyAgICAgICAgaHR0cF9jbGFzcyBtdXN0IGltcGxlbWVudCB0aGUgSFRUUENvbm5lY3Rpb24gQVBJIGZyb20gaHR0cGxpYi4KKyAgICAgICAgVGhlIGFkZGluZm91cmwgcmV0dXJuIHZhbHVlIGlzIGEgZmlsZS1saWtlIG9iamVjdC4gIEl0IGFsc28KKyAgICAgICAgaGFzIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMgaW5jbHVkaW5nOgorICAgICAgICAgICAgLSBpbmZvKCk6IHJldHVybiBhIG1pbWV0b29scy5NZXNzYWdlIG9iamVjdCBmb3IgdGhlIGhlYWRlcnMKKyAgICAgICAgICAgIC0gZ2V0dXJsKCk6IHJldHVybiB0aGUgb3JpZ2luYWwgcmVxdWVzdCBVUkwKKyAgICAgICAgICAgIC0gY29kZTogSFRUUCBzdGF0dXMgY29kZQorICAgICAgICAiIiIKKyAgICAgICAgaG9zdCA9IHJlcS5nZXRfaG9zdCgpCisgICAgICAgIGlmIG5vdCBob3N0OgorICAgICAgICAgICAgcmFpc2UgVVJMRXJyb3IoJ25vIGhvc3QgZ2l2ZW4nKQorCisgICAgICAgIGggPSBodHRwX2NsYXNzKGhvc3QsIHRpbWVvdXQ9cmVxLnRpbWVvdXQpICMgd2lsbCBwYXJzZSBob3N0OnBvcnQKKyAgICAgICAgaC5zZXRfZGVidWdsZXZlbChzZWxmLl9kZWJ1Z2xldmVsKQorCisgICAgICAgIGhlYWRlcnMgPSBkaWN0KHJlcS51bnJlZGlyZWN0ZWRfaGRycykKKyAgICAgICAgaGVhZGVycy51cGRhdGUoZGljdCgoaywgdikgZm9yIGssIHYgaW4gcmVxLmhlYWRlcnMuaXRlbXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGsgbm90IGluIGhlYWRlcnMpKQorCisgICAgICAgICMgV2Ugd2FudCB0byBtYWtlIGFuIEhUVFAvMS4xIHJlcXVlc3QsIGJ1dCB0aGUgYWRkaW5mb3VybAorICAgICAgICAjIGNsYXNzIGlzbid0IHByZXBhcmVkIHRvIGRlYWwgd2l0aCBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4KKyAgICAgICAgIyBJdCB3aWxsIHRyeSB0byByZWFkIGFsbCByZW1haW5pbmcgZGF0YSBmcm9tIHRoZSBzb2NrZXQsCisgICAgICAgICMgd2hpY2ggd2lsbCBibG9jayB3aGlsZSB0aGUgc2VydmVyIHdhaXRzIGZvciB0aGUgbmV4dCByZXF1ZXN0LgorICAgICAgICAjIFNvIG1ha2Ugc3VyZSB0aGUgY29ubmVjdGlvbiBnZXRzIGNsb3NlZCBhZnRlciB0aGUgKG9ubHkpCisgICAgICAgICMgcmVxdWVzdC4KKyAgICAgICAgaGVhZGVyc1siQ29ubmVjdGlvbiJdID0gImNsb3NlIgorICAgICAgICBoZWFkZXJzID0gZGljdCgKKyAgICAgICAgICAgIChuYW1lLnRpdGxlKCksIHZhbCkgZm9yIG5hbWUsIHZhbCBpbiBoZWFkZXJzLml0ZW1zKCkpCisKKyAgICAgICAgaWYgcmVxLl90dW5uZWxfaG9zdDoKKyAgICAgICAgICAgIHR1bm5lbF9oZWFkZXJzID0ge30KKyAgICAgICAgICAgIHByb3h5X2F1dGhfaGRyID0gIlByb3h5LUF1dGhvcml6YXRpb24iCisgICAgICAgICAgICBpZiBwcm94eV9hdXRoX2hkciBpbiBoZWFkZXJzOgorICAgICAgICAgICAgICAgIHR1bm5lbF9oZWFkZXJzW3Byb3h5X2F1dGhfaGRyXSA9IGhlYWRlcnNbcHJveHlfYXV0aF9oZHJdCisgICAgICAgICAgICAgICAgIyBQcm94eS1BdXRob3JpemF0aW9uIHNob3VsZCBub3QgYmUgc2VudCB0byBvcmlnaW4KKyAgICAgICAgICAgICAgICAjIHNlcnZlci4KKyAgICAgICAgICAgICAgICBkZWwgaGVhZGVyc1twcm94eV9hdXRoX2hkcl0KKyAgICAgICAgICAgIGguc2V0X3R1bm5lbChyZXEuX3R1bm5lbF9ob3N0LCBoZWFkZXJzPXR1bm5lbF9oZWFkZXJzKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGgucmVxdWVzdChyZXEuZ2V0X21ldGhvZCgpLCByZXEuZ2V0X3NlbGVjdG9yKCksIHJlcS5kYXRhLCBoZWFkZXJzKQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlcnI6ICMgWFhYIHdoYXQgZXJyb3I/CisgICAgICAgICAgICBoLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKGVycikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByID0gaC5nZXRyZXNwb25zZShidWZmZXJpbmc9VHJ1ZSkKKyAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6ICMgYnVmZmVyaW5nIGt3IG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICByID0gaC5nZXRyZXNwb25zZSgpCisKKyAgICAgICAgIyBQaWNrIGFwYXJ0IHRoZSBIVFRQUmVzcG9uc2Ugb2JqZWN0IHRvIGdldCB0aGUgYWRkaW5mb3VybAorICAgICAgICAjIG9iamVjdCBpbml0aWFsaXplZCBwcm9wZXJseS4KKworICAgICAgICAjIFdyYXAgdGhlIEhUVFBSZXNwb25zZSBvYmplY3QgaW4gc29ja2V0J3MgZmlsZSBvYmplY3QgYWRhcHRlcgorICAgICAgICAjIGZvciBXaW5kb3dzLiAgVGhhdCBhZGFwdGVyIGNhbGxzIHJlY3YoKSwgc28gZGVsZWdhdGUgcmVjdigpCisgICAgICAgICMgdG8gcmVhZCgpLiAgVGhpcyB3ZWlyZCB3cmFwcGluZyBhbGxvd3MgdGhlIHJldHVybmVkIG9iamVjdCB0bworICAgICAgICAjIGhhdmUgcmVhZGxpbmUoKSBhbmQgcmVhZGxpbmVzKCkgbWV0aG9kcy4KKworICAgICAgICAjIFhYWCBJdCBtaWdodCBiZSBiZXR0ZXIgdG8gZXh0cmFjdCB0aGUgcmVhZCBidWZmZXJpbmcgY29kZQorICAgICAgICAjIG91dCBvZiBzb2NrZXQuX2ZpbGVvYmplY3QoKSBhbmQgaW50byBhIGJhc2UgY2xhc3MuCisKKyAgICAgICAgci5yZWN2ID0gci5yZWFkCisgICAgICAgIGZwID0gc29ja2V0Ll9maWxlb2JqZWN0KHIsIGNsb3NlPVRydWUpCisKKyAgICAgICAgcmVzcCA9IGFkZGluZm91cmwoZnAsIHIubXNnLCByZXEuZ2V0X2Z1bGxfdXJsKCkpCisgICAgICAgIHJlc3AuY29kZSA9IHIuc3RhdHVzCisgICAgICAgIHJlc3AubXNnID0gci5yZWFzb24KKyAgICAgICAgcmV0dXJuIHJlc3AKKworCitjbGFzcyBIVFRQSGFuZGxlcihBYnN0cmFjdEhUVFBIYW5kbGVyKToKKworICAgIGRlZiBodHRwX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZG9fb3BlbihodHRwbGliLkhUVFBDb25uZWN0aW9uLCByZXEpCisKKyAgICBodHRwX3JlcXVlc3QgPSBBYnN0cmFjdEhUVFBIYW5kbGVyLmRvX3JlcXVlc3RfCisKK2lmIGhhc2F0dHIoaHR0cGxpYiwgJ0hUVFBTJyk6CisgICAgY2xhc3MgSFRUUFNIYW5kbGVyKEFic3RyYWN0SFRUUEhhbmRsZXIpOgorCisgICAgICAgIGRlZiBodHRwc19vcGVuKHNlbGYsIHJlcSk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5kb19vcGVuKGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uLCByZXEpCisKKyAgICAgICAgaHR0cHNfcmVxdWVzdCA9IEFic3RyYWN0SFRUUEhhbmRsZXIuZG9fcmVxdWVzdF8KKworY2xhc3MgSFRUUENvb2tpZVByb2Nlc3NvcihCYXNlSGFuZGxlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNvb2tpZWphcj1Ob25lKToKKyAgICAgICAgaW1wb3J0IGNvb2tpZWxpYgorICAgICAgICBpZiBjb29raWVqYXIgaXMgTm9uZToKKyAgICAgICAgICAgIGNvb2tpZWphciA9IGNvb2tpZWxpYi5Db29raWVKYXIoKQorICAgICAgICBzZWxmLmNvb2tpZWphciA9IGNvb2tpZWphcgorCisgICAgZGVmIGh0dHBfcmVxdWVzdChzZWxmLCByZXF1ZXN0KToKKyAgICAgICAgc2VsZi5jb29raWVqYXIuYWRkX2Nvb2tpZV9oZWFkZXIocmVxdWVzdCkKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QKKworICAgIGRlZiBodHRwX3Jlc3BvbnNlKHNlbGYsIHJlcXVlc3QsIHJlc3BvbnNlKToKKyAgICAgICAgc2VsZi5jb29raWVqYXIuZXh0cmFjdF9jb29raWVzKHJlc3BvbnNlLCByZXF1ZXN0KQorICAgICAgICByZXR1cm4gcmVzcG9uc2UKKworICAgIGh0dHBzX3JlcXVlc3QgPSBodHRwX3JlcXVlc3QKKyAgICBodHRwc19yZXNwb25zZSA9IGh0dHBfcmVzcG9uc2UKKworY2xhc3MgVW5rbm93bkhhbmRsZXIoQmFzZUhhbmRsZXIpOgorICAgIGRlZiB1bmtub3duX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgdHlwZSA9IHJlcS5nZXRfdHlwZSgpCisgICAgICAgIHJhaXNlIFVSTEVycm9yKCd1bmtub3duIHVybCB0eXBlOiAlcycgJSB0eXBlKQorCitkZWYgcGFyc2Vfa2Vxdl9saXN0KGwpOgorICAgICIiIlBhcnNlIGxpc3Qgb2Yga2V5PXZhbHVlIHN0cmluZ3Mgd2hlcmUga2V5cyBhcmUgbm90IGR1cGxpY2F0ZWQuIiIiCisgICAgcGFyc2VkID0ge30KKyAgICBmb3IgZWx0IGluIGw6CisgICAgICAgIGssIHYgPSBlbHQuc3BsaXQoJz0nLCAxKQorICAgICAgICBpZiB2WzBdID09ICciJyBhbmQgdlstMV0gPT0gJyInOgorICAgICAgICAgICAgdiA9IHZbMTotMV0KKyAgICAgICAgcGFyc2VkW2tdID0gdgorICAgIHJldHVybiBwYXJzZWQKKworZGVmIHBhcnNlX2h0dHBfbGlzdChzKToKKyAgICAiIiJQYXJzZSBsaXN0cyBhcyBkZXNjcmliZWQgYnkgUkZDIDIwNjggU2VjdGlvbiAyLgorCisgICAgSW4gcGFydGljdWxhciwgcGFyc2UgY29tbWEtc2VwYXJhdGVkIGxpc3RzIHdoZXJlIHRoZSBlbGVtZW50cyBvZgorICAgIHRoZSBsaXN0IG1heSBpbmNsdWRlIHF1b3RlZC1zdHJpbmdzLiAgQSBxdW90ZWQtc3RyaW5nIGNvdWxkCisgICAgY29udGFpbiBhIGNvbW1hLiAgQSBub24tcXVvdGVkIHN0cmluZyBjb3VsZCBoYXZlIHF1b3RlcyBpbiB0aGUKKyAgICBtaWRkbGUuICBOZWl0aGVyIGNvbW1hcyBub3IgcXVvdGVzIGNvdW50IGlmIHRoZXkgYXJlIGVzY2FwZWQuCisgICAgT25seSBkb3VibGUtcXVvdGVzIGNvdW50LCBub3Qgc2luZ2xlLXF1b3Rlcy4KKyAgICAiIiIKKyAgICByZXMgPSBbXQorICAgIHBhcnQgPSAnJworCisgICAgZXNjYXBlID0gcXVvdGUgPSBGYWxzZQorICAgIGZvciBjdXIgaW4gczoKKyAgICAgICAgaWYgZXNjYXBlOgorICAgICAgICAgICAgcGFydCArPSBjdXIKKyAgICAgICAgICAgIGVzY2FwZSA9IEZhbHNlCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBxdW90ZToKKyAgICAgICAgICAgIGlmIGN1ciA9PSAnXFwnOgorICAgICAgICAgICAgICAgIGVzY2FwZSA9IFRydWUKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiBjdXIgPT0gJyInOgorICAgICAgICAgICAgICAgIHF1b3RlID0gRmFsc2UKKyAgICAgICAgICAgIHBhcnQgKz0gY3VyCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIGN1ciA9PSAnLCc6CisgICAgICAgICAgICByZXMuYXBwZW5kKHBhcnQpCisgICAgICAgICAgICBwYXJ0ID0gJycKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWYgY3VyID09ICciJzoKKyAgICAgICAgICAgIHF1b3RlID0gVHJ1ZQorCisgICAgICAgIHBhcnQgKz0gY3VyCisKKyAgICAjIGFwcGVuZCBsYXN0IHBhcnQKKyAgICBpZiBwYXJ0OgorICAgICAgICByZXMuYXBwZW5kKHBhcnQpCisKKyAgICByZXR1cm4gW3BhcnQuc3RyaXAoKSBmb3IgcGFydCBpbiByZXNdCisKK2RlZiBfc2FmZV9nZXRob3N0YnluYW1lKGhvc3QpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHNvY2tldC5nZXRob3N0YnluYW1lKGhvc3QpCisgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworY2xhc3MgRmlsZUhhbmRsZXIoQmFzZUhhbmRsZXIpOgorICAgICMgVXNlIGxvY2FsIGZpbGUgb3IgRlRQIGRlcGVuZGluZyBvbiBmb3JtIG9mIFVSTAorICAgIGRlZiBmaWxlX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgdXJsID0gcmVxLmdldF9zZWxlY3RvcigpCisgICAgICAgIGlmIHVybFs6Ml0gPT0gJy8vJyBhbmQgdXJsWzI6M10gIT0gJy8nIGFuZCAocmVxLmhvc3QgYW5kCisgICAgICAgICAgICAgICAgcmVxLmhvc3QgIT0gJ2xvY2FsaG9zdCcpOgorICAgICAgICAgICAgcmVxLnR5cGUgPSAnZnRwJworICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4ocmVxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYub3Blbl9sb2NhbF9maWxlKHJlcSkKKworICAgICMgbmFtZXMgZm9yIHRoZSBsb2NhbGhvc3QKKyAgICBuYW1lcyA9IE5vbmUKKyAgICBkZWYgZ2V0X25hbWVzKHNlbGYpOgorICAgICAgICBpZiBGaWxlSGFuZGxlci5uYW1lcyBpcyBOb25lOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIEZpbGVIYW5kbGVyLm5hbWVzID0gdHVwbGUoCisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRob3N0YnluYW1lX2V4KCdsb2NhbGhvc3QnKVsyXSArCisgICAgICAgICAgICAgICAgICAgIHNvY2tldC5nZXRob3N0YnluYW1lX2V4KHNvY2tldC5nZXRob3N0bmFtZSgpKVsyXSkKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICAgICAgRmlsZUhhbmRsZXIubmFtZXMgPSAoc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLCkKKyAgICAgICAgcmV0dXJuIEZpbGVIYW5kbGVyLm5hbWVzCisKKyAgICAjIG5vdCBlbnRpcmVseSBzdXJlIHdoYXQgdGhlIHJ1bGVzIGFyZSBoZXJlCisgICAgZGVmIG9wZW5fbG9jYWxfZmlsZShzZWxmLCByZXEpOgorICAgICAgICBpbXBvcnQgZW1haWwudXRpbHMKKyAgICAgICAgaW1wb3J0IG1pbWV0eXBlcworICAgICAgICBob3N0ID0gcmVxLmdldF9ob3N0KCkKKyAgICAgICAgZmlsZW5hbWUgPSByZXEuZ2V0X3NlbGVjdG9yKCkKKyAgICAgICAgbG9jYWxmaWxlID0gdXJsMnBhdGhuYW1lKGZpbGVuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzdGF0cyA9IG9zLnN0YXQobG9jYWxmaWxlKQorICAgICAgICAgICAgc2l6ZSA9IHN0YXRzLnN0X3NpemUKKyAgICAgICAgICAgIG1vZGlmaWVkID0gZW1haWwudXRpbHMuZm9ybWF0ZGF0ZShzdGF0cy5zdF9tdGltZSwgdXNlZ210PVRydWUpCisgICAgICAgICAgICBtdHlwZSA9IG1pbWV0eXBlcy5ndWVzc190eXBlKGZpbGVuYW1lKVswXQorICAgICAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPKAorICAgICAgICAgICAgICAgICdDb250ZW50LXR5cGU6ICVzXG5Db250ZW50LWxlbmd0aDogJWRcbkxhc3QtbW9kaWZpZWQ6ICVzXG4nICUKKyAgICAgICAgICAgICAgICAobXR5cGUgb3IgJ3RleHQvcGxhaW4nLCBzaXplLCBtb2RpZmllZCkpKQorICAgICAgICAgICAgaWYgaG9zdDoKKyAgICAgICAgICAgICAgICBob3N0LCBwb3J0ID0gc3BsaXRwb3J0KGhvc3QpCisgICAgICAgICAgICBpZiBub3QgaG9zdCBvciBcCisgICAgICAgICAgICAgICAgKG5vdCBwb3J0IGFuZCBfc2FmZV9nZXRob3N0YnluYW1lKGhvc3QpIGluIHNlbGYuZ2V0X25hbWVzKCkpOgorICAgICAgICAgICAgICAgIGlmIGhvc3Q6CisgICAgICAgICAgICAgICAgICAgIG9yaWd1cmwgPSAnZmlsZTovLycgKyBob3N0ICsgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvcmlndXJsID0gJ2ZpbGU6Ly8nICsgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkaW5mb3VybChvcGVuKGxvY2FsZmlsZSwgJ3JiJyksIGhlYWRlcnMsIG9yaWd1cmwpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBtc2c6CisgICAgICAgICAgICAjIHVybGxpYjIgdXNlcnMgc2hvdWxkbid0IGV4cGVjdCBPU0Vycm9ycyBjb21pbmcgZnJvbSB1cmxvcGVuKCkKKyAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKG1zZykKKyAgICAgICAgcmFpc2UgVVJMRXJyb3IoJ2ZpbGUgbm90IG9uIGxvY2FsIGhvc3QnKQorCitjbGFzcyBGVFBIYW5kbGVyKEJhc2VIYW5kbGVyKToKKyAgICBkZWYgZnRwX29wZW4oc2VsZiwgcmVxKToKKyAgICAgICAgaW1wb3J0IGZ0cGxpYgorICAgICAgICBpbXBvcnQgbWltZXR5cGVzCisgICAgICAgIGhvc3QgPSByZXEuZ2V0X2hvc3QoKQorICAgICAgICBpZiBub3QgaG9zdDoKKyAgICAgICAgICAgIHJhaXNlIFVSTEVycm9yKCdmdHAgZXJyb3I6IG5vIGhvc3QgZ2l2ZW4nKQorICAgICAgICBob3N0LCBwb3J0ID0gc3BsaXRwb3J0KGhvc3QpCisgICAgICAgIGlmIHBvcnQgaXMgTm9uZToKKyAgICAgICAgICAgIHBvcnQgPSBmdHBsaWIuRlRQX1BPUlQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCkKKworICAgICAgICAjIHVzZXJuYW1lL3Bhc3N3b3JkIGhhbmRsaW5nCisgICAgICAgIHVzZXIsIGhvc3QgPSBzcGxpdHVzZXIoaG9zdCkKKyAgICAgICAgaWYgdXNlcjoKKyAgICAgICAgICAgIHVzZXIsIHBhc3N3ZCA9IHNwbGl0cGFzc3dkKHVzZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzd2QgPSBOb25lCisgICAgICAgIGhvc3QgPSB1bnF1b3RlKGhvc3QpCisgICAgICAgIHVzZXIgPSB1c2VyIG9yICcnCisgICAgICAgIHBhc3N3ZCA9IHBhc3N3ZCBvciAnJworCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhvc3QgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShob3N0KQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBtc2c6CisgICAgICAgICAgICByYWlzZSBVUkxFcnJvcihtc2cpCisgICAgICAgIHBhdGgsIGF0dHJzID0gc3BsaXRhdHRyKHJlcS5nZXRfc2VsZWN0b3IoKSkKKyAgICAgICAgZGlycyA9IHBhdGguc3BsaXQoJy8nKQorICAgICAgICBkaXJzID0gbWFwKHVucXVvdGUsIGRpcnMpCisgICAgICAgIGRpcnMsIGZpbGUgPSBkaXJzWzotMV0sIGRpcnNbLTFdCisgICAgICAgIGlmIGRpcnMgYW5kIG5vdCBkaXJzWzBdOgorICAgICAgICAgICAgZGlycyA9IGRpcnNbMTpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZ3ID0gc2VsZi5jb25uZWN0X2Z0cCh1c2VyLCBwYXNzd2QsIGhvc3QsIHBvcnQsIGRpcnMsIHJlcS50aW1lb3V0KQorICAgICAgICAgICAgdHlwZSA9IGZpbGUgYW5kICdJJyBvciAnRCcKKyAgICAgICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgorICAgICAgICAgICAgICAgIGF0dHIsIHZhbHVlID0gc3BsaXR2YWx1ZShhdHRyKQorICAgICAgICAgICAgICAgIGlmIGF0dHIubG93ZXIoKSA9PSAndHlwZScgYW5kIFwKKyAgICAgICAgICAgICAgICAgICB2YWx1ZSBpbiAoJ2EnLCAnQScsICdpJywgJ0knLCAnZCcsICdEJyk6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB2YWx1ZS51cHBlcigpCisgICAgICAgICAgICBmcCwgcmV0cmxlbiA9IGZ3LnJldHJmaWxlKGZpbGUsIHR5cGUpCisgICAgICAgICAgICBoZWFkZXJzID0gIiIKKyAgICAgICAgICAgIG10eXBlID0gbWltZXR5cGVzLmd1ZXNzX3R5cGUocmVxLmdldF9mdWxsX3VybCgpKVswXQorICAgICAgICAgICAgaWYgbXR5cGU6CisgICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC10eXBlOiAlc1xuIiAlIG10eXBlCisgICAgICAgICAgICBpZiByZXRybGVuIGlzIG5vdCBOb25lIGFuZCByZXRybGVuID49IDA6CisgICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC1sZW5ndGg6ICVkXG4iICUgcmV0cmxlbgorICAgICAgICAgICAgc2YgPSBTdHJpbmdJTyhoZWFkZXJzKQorICAgICAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKHNmKQorICAgICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwoZnAsIGhlYWRlcnMsIHJlcS5nZXRfZnVsbF91cmwoKSkKKyAgICAgICAgZXhjZXB0IGZ0cGxpYi5hbGxfZXJyb3JzLCBtc2c6CisgICAgICAgICAgICByYWlzZSBVUkxFcnJvciwgKCdmdHAgZXJyb3I6ICVzJyAlIG1zZyksIHN5cy5leGNfaW5mbygpWzJdCisKKyAgICBkZWYgY29ubmVjdF9mdHAoc2VsZiwgdXNlciwgcGFzc3dkLCBob3N0LCBwb3J0LCBkaXJzLCB0aW1lb3V0KToKKyAgICAgICAgZncgPSBmdHB3cmFwcGVyKHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGlycywgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNpc3RlbnQ9RmFsc2UpCisjIyAgICAgICAgZncuZnRwLnNldF9kZWJ1Z2xldmVsKDEpCisgICAgICAgIHJldHVybiBmdworCitjbGFzcyBDYWNoZUZUUEhhbmRsZXIoRlRQSGFuZGxlcik6CisgICAgIyBYWFggd291bGQgYmUgbmljZSB0byBoYXZlIHBsdWdnYWJsZSBjYWNoZSBzdHJhdGVnaWVzCisgICAgIyBYWFggdGhpcyBzdHVmZiBpcyBkZWZpbml0ZWx5IG5vdCB0aHJlYWQgc2FmZQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jYWNoZSA9IHt9CisgICAgICAgIHNlbGYudGltZW91dCA9IHt9CisgICAgICAgIHNlbGYuc29vbmVzdCA9IDAKKyAgICAgICAgc2VsZi5kZWxheSA9IDYwCisgICAgICAgIHNlbGYubWF4X2Nvbm5zID0gMTYKKworICAgIGRlZiBzZXRUaW1lb3V0KHNlbGYsIHQpOgorICAgICAgICBzZWxmLmRlbGF5ID0gdAorCisgICAgZGVmIHNldE1heENvbm5zKHNlbGYsIG0pOgorICAgICAgICBzZWxmLm1heF9jb25ucyA9IG0KKworICAgIGRlZiBjb25uZWN0X2Z0cChzZWxmLCB1c2VyLCBwYXNzd2QsIGhvc3QsIHBvcnQsIGRpcnMsIHRpbWVvdXQpOgorICAgICAgICBrZXkgPSB1c2VyLCBob3N0LCBwb3J0LCAnLycuam9pbihkaXJzKSwgdGltZW91dAorICAgICAgICBpZiBrZXkgaW4gc2VsZi5jYWNoZToKKyAgICAgICAgICAgIHNlbGYudGltZW91dFtrZXldID0gdGltZS50aW1lKCkgKyBzZWxmLmRlbGF5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmNhY2hlW2tleV0gPSBmdHB3cmFwcGVyKHVzZXIsIHBhc3N3ZCwgaG9zdCwgcG9ydCwgZGlycywgdGltZW91dCkKKyAgICAgICAgICAgIHNlbGYudGltZW91dFtrZXldID0gdGltZS50aW1lKCkgKyBzZWxmLmRlbGF5CisgICAgICAgIHNlbGYuY2hlY2tfY2FjaGUoKQorICAgICAgICByZXR1cm4gc2VsZi5jYWNoZVtrZXldCisKKyAgICBkZWYgY2hlY2tfY2FjaGUoc2VsZik6CisgICAgICAgICMgZmlyc3QgY2hlY2sgZm9yIG9sZCBvbmVzCisgICAgICAgIHQgPSB0aW1lLnRpbWUoKQorICAgICAgICBpZiBzZWxmLnNvb25lc3QgPD0gdDoKKyAgICAgICAgICAgIGZvciBrLCB2IGluIHNlbGYudGltZW91dC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHYgPCB0OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNhY2hlW2tdLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuY2FjaGVba10KKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYudGltZW91dFtrXQorICAgICAgICBzZWxmLnNvb25lc3QgPSBtaW4oc2VsZi50aW1lb3V0LnZhbHVlcygpKQorCisgICAgICAgICMgdGhlbiBjaGVjayB0aGUgc2l6ZQorICAgICAgICBpZiBsZW4oc2VsZi5jYWNoZSkgPT0gc2VsZi5tYXhfY29ubnM6CisgICAgICAgICAgICBmb3IgaywgdiBpbiBzZWxmLnRpbWVvdXQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiB2ID09IHNlbGYuc29vbmVzdDoKKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYuY2FjaGVba10KKyAgICAgICAgICAgICAgICAgICAgZGVsIHNlbGYudGltZW91dFtrXQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5zb29uZXN0ID0gbWluKHNlbGYudGltZW91dC52YWx1ZXMoKSkKKworICAgIGRlZiBjbGVhcl9jYWNoZShzZWxmKToKKyAgICAgICAgZm9yIGNvbm4gaW4gc2VsZi5jYWNoZS52YWx1ZXMoKToKKyAgICAgICAgICAgIGNvbm4uY2xvc2UoKQorICAgICAgICBzZWxmLmNhY2hlLmNsZWFyKCkKKyAgICAgICAgc2VsZi50aW1lb3V0LmNsZWFyKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXJsbGliMi5weWMgYi9saWIvcHl0aG9uMi43L3VybGxpYjIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTA4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VybGxpYjIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXJsbGliMi5weW8gYi9saWIvcHl0aG9uMi43L3VybGxpYjIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0Mjc1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VybGxpYjIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXJscGFyc2UucHkgYi9saWIvcHl0aG9uMi43L3VybHBhcnNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZTk4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3VybHBhcnNlLnB5CkBAIC0wLDAgKzEsNDI3IEBACisiIiJQYXJzZSAoYWJzb2x1dGUgYW5kIHJlbGF0aXZlKSBVUkxzLgorCit1cmxwYXJzZSBtb2R1bGUgaXMgYmFzZWQgdXBvbiB0aGUgZm9sbG93aW5nIFJGQyBzcGVjaWZpY2F0aW9ucy4KKworUkZDIDM5ODYgKFNURDY2KTogIlVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllcnMiIGJ5IFQuIEJlcm5lcnMtTGVlLCBSLiBGaWVsZGluZworYW5kIEwuICBNYXNpbnRlciwgSmFudWFyeSAyMDA1LgorCitSRkMgMjczMiA6ICJGb3JtYXQgZm9yIExpdGVyYWwgSVB2NiBBZGRyZXNzZXMgaW4gVVJMJ3MgYnkgUi5IaW5kZW4sIEIuQ2FycGVudGVyCithbmQgTC5NYXNpbnRlciwgRGVjZW1iZXIgMTk5OS4KKworUkZDIDIzOTY6ICAiVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAoVVJJKSI6IEdlbmVyaWMgU3ludGF4IGJ5IFQuCitCZXJuZXJzLUxlZSwgUi4gRmllbGRpbmcsIGFuZCBMLiBNYXNpbnRlciwgQXVndXN0IDE5OTguCisKK1JGQyAyMzY4OiAiVGhlIG1haWx0byBVUkwgc2NoZW1lIiwgYnkgUC5Ib2ZmbWFuICwgTCBNYXNpbnRlciwgSi4gWndpbnNraSwgSnVseSAxOTk4LgorCitSRkMgMTgwODogIlJlbGF0aXZlIFVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvcnMiLCBieSBSLiBGaWVsZGluZywgVUMgSXJ2aW5lLCBKdW5lCisxOTk1LgorCitSRkMgMTczODogIlVuaWZvcm0gUmVzb3VyY2UgTG9jYXRvcnMgKFVSTCkiIGJ5IFQuIEJlcm5lcnMtTGVlLCBMLiBNYXNpbnRlciwgTS4KK01jQ2FoaWxsLCBEZWNlbWJlciAxOTk0CisKK1JGQyAzOTg2IGlzIGNvbnNpZGVyZWQgdGhlIGN1cnJlbnQgc3RhbmRhcmQgYW5kIGFueSBmdXR1cmUgY2hhbmdlcyB0bwordXJscGFyc2UgbW9kdWxlIHNob3VsZCBjb25mb3JtIHdpdGggaXQuICBUaGUgdXJscGFyc2UgbW9kdWxlIGlzCitjdXJyZW50bHkgbm90IGVudGlyZWx5IGNvbXBsaWFudCB3aXRoIHRoaXMgUkZDIGR1ZSB0byBkZWZhY3RvCitzY2VuYXJpb3MgZm9yIHBhcnNpbmcsIGFuZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBwdXJwb3Nlcywgc29tZQorcGFyc2luZyBxdWlya3MgZnJvbSBvbGRlciBSRkNzIGFyZSByZXRhaW5lZC4gVGhlIHRlc3RjYXNlcyBpbgordGVzdF91cmxwYXJzZS5weSBwcm92aWRlcyBhIGdvb2QgaW5kaWNhdG9yIG9mIHBhcnNpbmcgYmVoYXZpb3IuCisKKyIiIgorCitpbXBvcnQgcmUKKworX19hbGxfXyA9IFsidXJscGFyc2UiLCAidXJsdW5wYXJzZSIsICJ1cmxqb2luIiwgInVybGRlZnJhZyIsCisgICAgICAgICAgICJ1cmxzcGxpdCIsICJ1cmx1bnNwbGl0IiwgInBhcnNlX3FzIiwgInBhcnNlX3FzbCJdCisKKyMgQSBjbGFzc2lmaWNhdGlvbiBvZiBzY2hlbWVzICgnJyBtZWFucyBhcHBseSBieSBkZWZhdWx0KQordXNlc19yZWxhdGl2ZSA9IFsnZnRwJywgJ2h0dHAnLCAnZ29waGVyJywgJ25udHAnLCAnaW1hcCcsCisgICAgICAgICAgICAgICAgICd3YWlzJywgJ2ZpbGUnLCAnaHR0cHMnLCAnc2h0dHAnLCAnbW1zJywKKyAgICAgICAgICAgICAgICAgJ3Byb3NwZXJvJywgJ3J0c3AnLCAncnRzcHUnLCAnJywgJ3NmdHAnLAorICAgICAgICAgICAgICAgICAnc3ZuJywgJ3N2bitzc2gnXQordXNlc19uZXRsb2MgPSBbJ2Z0cCcsICdodHRwJywgJ2dvcGhlcicsICdubnRwJywgJ3RlbG5ldCcsCisgICAgICAgICAgICAgICAnaW1hcCcsICd3YWlzJywgJ2ZpbGUnLCAnbW1zJywgJ2h0dHBzJywgJ3NodHRwJywKKyAgICAgICAgICAgICAgICdzbmV3cycsICdwcm9zcGVybycsICdydHNwJywgJ3J0c3B1JywgJ3JzeW5jJywgJycsCisgICAgICAgICAgICAgICAnc3ZuJywgJ3N2bitzc2gnLCAnc2Z0cCcsJ25mcycsJ2dpdCcsICdnaXQrc3NoJ10KK3VzZXNfcGFyYW1zID0gWydmdHAnLCAnaGRsJywgJ3Byb3NwZXJvJywgJ2h0dHAnLCAnaW1hcCcsCisgICAgICAgICAgICAgICAnaHR0cHMnLCAnc2h0dHAnLCAncnRzcCcsICdydHNwdScsICdzaXAnLCAnc2lwcycsCisgICAgICAgICAgICAgICAnbW1zJywgJycsICdzZnRwJywgJ3RlbCddCisKKyMgVGhlc2UgYXJlIG5vdCBhY3R1YWxseSB1c2VkIGFueW1vcmUsIGJ1dCBzaG91bGQgc3RheSBmb3IgYmFja3dhcmRzCisjIGNvbXBhdGliaWxpdHkuICAoVGhleSBhcmUgdW5kb2N1bWVudGVkLCBidXQgaGF2ZSBhIHB1YmxpYy1sb29raW5nIG5hbWUuKQorbm9uX2hpZXJhcmNoaWNhbCA9IFsnZ29waGVyJywgJ2hkbCcsICdtYWlsdG8nLCAnbmV3cycsCisgICAgICAgICAgICAgICAgICAgICd0ZWxuZXQnLCAnd2FpcycsICdpbWFwJywgJ3NuZXdzJywgJ3NpcCcsICdzaXBzJ10KK3VzZXNfcXVlcnkgPSBbJ2h0dHAnLCAnd2FpcycsICdpbWFwJywgJ2h0dHBzJywgJ3NodHRwJywgJ21tcycsCisgICAgICAgICAgICAgICdnb3BoZXInLCAncnRzcCcsICdydHNwdScsICdzaXAnLCAnc2lwcycsICcnXQordXNlc19mcmFnbWVudCA9IFsnZnRwJywgJ2hkbCcsICdodHRwJywgJ2dvcGhlcicsICduZXdzJywKKyAgICAgICAgICAgICAgICAgJ25udHAnLCAnd2FpcycsICdodHRwcycsICdzaHR0cCcsICdzbmV3cycsCisgICAgICAgICAgICAgICAgICdmaWxlJywgJ3Byb3NwZXJvJywgJyddCisKKyMgQ2hhcmFjdGVycyB2YWxpZCBpbiBzY2hlbWUgbmFtZXMKK3NjaGVtZV9jaGFycyA9ICgnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonCisgICAgICAgICAgICAgICAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaJworICAgICAgICAgICAgICAgICcwMTIzNDU2Nzg5JworICAgICAgICAgICAgICAgICcrLS4nKQorCitNQVhfQ0FDSEVfU0laRSA9IDIwCitfcGFyc2VfY2FjaGUgPSB7fQorCitkZWYgY2xlYXJfY2FjaGUoKToKKyAgICAiIiJDbGVhciB0aGUgcGFyc2UgY2FjaGUuIiIiCisgICAgX3BhcnNlX2NhY2hlLmNsZWFyKCkKKworCitjbGFzcyBSZXN1bHRNaXhpbihvYmplY3QpOgorICAgICIiIlNoYXJlZCBtZXRob2RzIGZvciB0aGUgcGFyc2VkIHJlc3VsdCBvYmplY3RzLiIiIgorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHVzZXJuYW1lKHNlbGYpOgorICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYworICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgorICAgICAgICAgICAgdXNlcmluZm8gPSBuZXRsb2MucnNwbGl0KCJAIiwgMSlbMF0KKyAgICAgICAgICAgIGlmICI6IiBpbiB1c2VyaW5mbzoKKyAgICAgICAgICAgICAgICB1c2VyaW5mbyA9IHVzZXJpbmZvLnNwbGl0KCI6IiwgMSlbMF0KKyAgICAgICAgICAgIHJldHVybiB1c2VyaW5mbworICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBhc3N3b3JkKHNlbGYpOgorICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYworICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgorICAgICAgICAgICAgdXNlcmluZm8gPSBuZXRsb2MucnNwbGl0KCJAIiwgMSlbMF0KKyAgICAgICAgICAgIGlmICI6IiBpbiB1c2VyaW5mbzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNlcmluZm8uc3BsaXQoIjoiLCAxKVsxXQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGhvc3RuYW1lKHNlbGYpOgorICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYy5zcGxpdCgnQCcpWy0xXQorICAgICAgICBpZiAnWycgaW4gbmV0bG9jIGFuZCAnXScgaW4gbmV0bG9jOgorICAgICAgICAgICAgcmV0dXJuIG5ldGxvYy5zcGxpdCgnXScpWzBdWzE6XS5sb3dlcigpCisgICAgICAgIGVsaWYgJzonIGluIG5ldGxvYzoKKyAgICAgICAgICAgIHJldHVybiBuZXRsb2Muc3BsaXQoJzonKVswXS5sb3dlcigpCisgICAgICAgIGVsaWYgbmV0bG9jID09ICcnOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBuZXRsb2MubG93ZXIoKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBvcnQoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jLnNwbGl0KCdAJylbLTFdLnNwbGl0KCddJylbLTFdCisgICAgICAgIGlmICc6JyBpbiBuZXRsb2M6CisgICAgICAgICAgICBwb3J0ID0gbmV0bG9jLnNwbGl0KCc6JylbMV0KKyAgICAgICAgICAgIHBvcnQgPSBpbnQocG9ydCwgMTApCisgICAgICAgICAgICAjIHZlcmlmeSBsZWdhbCBwb3J0CisgICAgICAgICAgICBpZiAoMCA8PSBwb3J0IDw9IDY1NTM1KToKKyAgICAgICAgICAgICAgICByZXR1cm4gcG9ydAorICAgICAgICByZXR1cm4gTm9uZQorCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBuYW1lZHR1cGxlCisKK2NsYXNzIFNwbGl0UmVzdWx0KG5hbWVkdHVwbGUoJ1NwbGl0UmVzdWx0JywgJ3NjaGVtZSBuZXRsb2MgcGF0aCBxdWVyeSBmcmFnbWVudCcpLCBSZXN1bHRNaXhpbik6CisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIGdldHVybChzZWxmKToKKyAgICAgICAgcmV0dXJuIHVybHVuc3BsaXQoc2VsZikKKworCitjbGFzcyBQYXJzZVJlc3VsdChuYW1lZHR1cGxlKCdQYXJzZVJlc3VsdCcsICdzY2hlbWUgbmV0bG9jIHBhdGggcGFyYW1zIHF1ZXJ5IGZyYWdtZW50JyksIFJlc3VsdE1peGluKToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgZ2V0dXJsKHNlbGYpOgorICAgICAgICByZXR1cm4gdXJsdW5wYXJzZShzZWxmKQorCisKK2RlZiB1cmxwYXJzZSh1cmwsIHNjaGVtZT0nJywgYWxsb3dfZnJhZ21lbnRzPVRydWUpOgorICAgICIiIlBhcnNlIGEgVVJMIGludG8gNiBjb21wb25lbnRzOgorICAgIDxzY2hlbWU+Oi8vPG5ldGxvYz4vPHBhdGg+OzxwYXJhbXM+PzxxdWVyeT4jPGZyYWdtZW50PgorICAgIFJldHVybiBhIDYtdHVwbGU6IChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpLgorICAgIE5vdGUgdGhhdCB3ZSBkb24ndCBicmVhayB0aGUgY29tcG9uZW50cyB1cCBpbiBzbWFsbGVyIGJpdHMKKyAgICAoZS5nLiBuZXRsb2MgaXMgYSBzaW5nbGUgc3RyaW5nKSBhbmQgd2UgZG9uJ3QgZXhwYW5kICUgZXNjYXBlcy4iIiIKKyAgICB0dXBsZSA9IHVybHNwbGl0KHVybCwgc2NoZW1lLCBhbGxvd19mcmFnbWVudHMpCisgICAgc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50ID0gdHVwbGUKKyAgICBpZiBzY2hlbWUgaW4gdXNlc19wYXJhbXMgYW5kICc7JyBpbiB1cmw6CisgICAgICAgIHVybCwgcGFyYW1zID0gX3NwbGl0cGFyYW1zKHVybCkKKyAgICBlbHNlOgorICAgICAgICBwYXJhbXMgPSAnJworICAgIHJldHVybiBQYXJzZVJlc3VsdChzY2hlbWUsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkKKworZGVmIF9zcGxpdHBhcmFtcyh1cmwpOgorICAgIGlmICcvJyAgaW4gdXJsOgorICAgICAgICBpID0gdXJsLmZpbmQoJzsnLCB1cmwucmZpbmQoJy8nKSkKKyAgICAgICAgaWYgaSA8IDA6CisgICAgICAgICAgICByZXR1cm4gdXJsLCAnJworICAgIGVsc2U6CisgICAgICAgIGkgPSB1cmwuZmluZCgnOycpCisgICAgcmV0dXJuIHVybFs6aV0sIHVybFtpKzE6XQorCitkZWYgX3NwbGl0bmV0bG9jKHVybCwgc3RhcnQ9MCk6CisgICAgZGVsaW0gPSBsZW4odXJsKSAgICMgcG9zaXRpb24gb2YgZW5kIG9mIGRvbWFpbiBwYXJ0IG9mIHVybCwgZGVmYXVsdCBpcyBlbmQKKyAgICBmb3IgYyBpbiAnLz8jJzogICAgIyBsb29rIGZvciBkZWxpbWl0ZXJzOyB0aGUgb3JkZXIgaXMgTk9UIGltcG9ydGFudAorICAgICAgICB3ZGVsaW0gPSB1cmwuZmluZChjLCBzdGFydCkgICAgICAgICMgZmluZCBmaXJzdCBvZiB0aGlzIGRlbGltCisgICAgICAgIGlmIHdkZWxpbSA+PSAwOiAgICAgICAgICAgICAgICAgICAgIyBpZiBmb3VuZAorICAgICAgICAgICAgZGVsaW0gPSBtaW4oZGVsaW0sIHdkZWxpbSkgICAgICMgdXNlIGVhcmxpZXN0IGRlbGltIHBvc2l0aW9uCisgICAgcmV0dXJuIHVybFtzdGFydDpkZWxpbV0sIHVybFtkZWxpbTpdICAgIyByZXR1cm4gKGRvbWFpbiwgcmVzdCkKKworZGVmIHVybHNwbGl0KHVybCwgc2NoZW1lPScnLCBhbGxvd19mcmFnbWVudHM9VHJ1ZSk6CisgICAgIiIiUGFyc2UgYSBVUkwgaW50byA1IGNvbXBvbmVudHM6CisgICAgPHNjaGVtZT46Ly88bmV0bG9jPi88cGF0aD4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+CisgICAgUmV0dXJuIGEgNS10dXBsZTogKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpLgorICAgIE5vdGUgdGhhdCB3ZSBkb24ndCBicmVhayB0aGUgY29tcG9uZW50cyB1cCBpbiBzbWFsbGVyIGJpdHMKKyAgICAoZS5nLiBuZXRsb2MgaXMgYSBzaW5nbGUgc3RyaW5nKSBhbmQgd2UgZG9uJ3QgZXhwYW5kICUgZXNjYXBlcy4iIiIKKyAgICBhbGxvd19mcmFnbWVudHMgPSBib29sKGFsbG93X2ZyYWdtZW50cykKKyAgICBrZXkgPSB1cmwsIHNjaGVtZSwgYWxsb3dfZnJhZ21lbnRzLCB0eXBlKHVybCksIHR5cGUoc2NoZW1lKQorICAgIGNhY2hlZCA9IF9wYXJzZV9jYWNoZS5nZXQoa2V5LCBOb25lKQorICAgIGlmIGNhY2hlZDoKKyAgICAgICAgcmV0dXJuIGNhY2hlZAorICAgIGlmIGxlbihfcGFyc2VfY2FjaGUpID49IE1BWF9DQUNIRV9TSVpFOiAjIGF2b2lkIHJ1bmF3YXkgZ3Jvd3RoCisgICAgICAgIGNsZWFyX2NhY2hlKCkKKyAgICBuZXRsb2MgPSBxdWVyeSA9IGZyYWdtZW50ID0gJycKKyAgICBpID0gdXJsLmZpbmQoJzonKQorICAgIGlmIGkgPiAwOgorICAgICAgICBpZiB1cmxbOmldID09ICdodHRwJzogIyBvcHRpbWl6ZSB0aGUgY29tbW9uIGNhc2UKKyAgICAgICAgICAgIHNjaGVtZSA9IHVybFs6aV0ubG93ZXIoKQorICAgICAgICAgICAgdXJsID0gdXJsW2krMTpdCisgICAgICAgICAgICBpZiB1cmxbOjJdID09ICcvLyc6CisgICAgICAgICAgICAgICAgbmV0bG9jLCB1cmwgPSBfc3BsaXRuZXRsb2ModXJsLCAyKQorICAgICAgICAgICAgICAgIGlmICgoJ1snIGluIG5ldGxvYyBhbmQgJ10nIG5vdCBpbiBuZXRsb2MpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAoJ10nIGluIG5ldGxvYyBhbmQgJ1snIG5vdCBpbiBuZXRsb2MpKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBJUHY2IFVSTCIpCisgICAgICAgICAgICBpZiBhbGxvd19mcmFnbWVudHMgYW5kICcjJyBpbiB1cmw6CisgICAgICAgICAgICAgICAgdXJsLCBmcmFnbWVudCA9IHVybC5zcGxpdCgnIycsIDEpCisgICAgICAgICAgICBpZiAnPycgaW4gdXJsOgorICAgICAgICAgICAgICAgIHVybCwgcXVlcnkgPSB1cmwuc3BsaXQoJz8nLCAxKQorICAgICAgICAgICAgdiA9IFNwbGl0UmVzdWx0KHNjaGVtZSwgbmV0bG9jLCB1cmwsIHF1ZXJ5LCBmcmFnbWVudCkKKyAgICAgICAgICAgIF9wYXJzZV9jYWNoZVtrZXldID0gdgorICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgZm9yIGMgaW4gdXJsWzppXToKKyAgICAgICAgICAgIGlmIGMgbm90IGluIHNjaGVtZV9jaGFyczoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBtYWtlIHN1cmUgInVybCIgaXMgbm90IGFjdHVhbGx5IGEgcG9ydCBudW1iZXIgKGluIHdoaWNoIGNhc2UKKyAgICAgICAgICAgICMgInNjaGVtZSIgaXMgcmVhbGx5IHBhcnQgb2YgdGhlIHBhdGgpCisgICAgICAgICAgICByZXN0ID0gdXJsW2krMTpdCisgICAgICAgICAgICBpZiBub3QgcmVzdCBvciBhbnkoYyBub3QgaW4gJzAxMjM0NTY3ODknIGZvciBjIGluIHJlc3QpOgorICAgICAgICAgICAgICAgICMgbm90IGEgcG9ydCBudW1iZXIKKyAgICAgICAgICAgICAgICBzY2hlbWUsIHVybCA9IHVybFs6aV0ubG93ZXIoKSwgcmVzdAorCisgICAgaWYgdXJsWzoyXSA9PSAnLy8nOgorICAgICAgICBuZXRsb2MsIHVybCA9IF9zcGxpdG5ldGxvYyh1cmwsIDIpCisgICAgICAgIGlmICgoJ1snIGluIG5ldGxvYyBhbmQgJ10nIG5vdCBpbiBuZXRsb2MpIG9yCisgICAgICAgICAgICAgICAgKCddJyBpbiBuZXRsb2MgYW5kICdbJyBub3QgaW4gbmV0bG9jKSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIElQdjYgVVJMIikKKyAgICBpZiBhbGxvd19mcmFnbWVudHMgYW5kICcjJyBpbiB1cmw6CisgICAgICAgIHVybCwgZnJhZ21lbnQgPSB1cmwuc3BsaXQoJyMnLCAxKQorICAgIGlmICc/JyBpbiB1cmw6CisgICAgICAgIHVybCwgcXVlcnkgPSB1cmwuc3BsaXQoJz8nLCAxKQorICAgIHYgPSBTcGxpdFJlc3VsdChzY2hlbWUsIG5ldGxvYywgdXJsLCBxdWVyeSwgZnJhZ21lbnQpCisgICAgX3BhcnNlX2NhY2hlW2tleV0gPSB2CisgICAgcmV0dXJuIHYKKworZGVmIHVybHVucGFyc2UoZGF0YSk6CisgICAgIiIiUHV0IGEgcGFyc2VkIFVSTCBiYWNrIHRvZ2V0aGVyIGFnYWluLiAgVGhpcyBtYXkgcmVzdWx0IGluIGEKKyAgICBzbGlnaHRseSBkaWZmZXJlbnQsIGJ1dCBlcXVpdmFsZW50IFVSTCwgaWYgdGhlIFVSTCB0aGF0IHdhcyBwYXJzZWQKKyAgICBvcmlnaW5hbGx5IGhhZCByZWR1bmRhbnQgZGVsaW1pdGVycywgZS5nLiBhID8gd2l0aCBhbiBlbXB0eSBxdWVyeQorICAgICh0aGUgZHJhZnQgc3RhdGVzIHRoYXQgdGhlc2UgYXJlIGVxdWl2YWxlbnQpLiIiIgorICAgIHNjaGVtZSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gZGF0YQorICAgIGlmIHBhcmFtczoKKyAgICAgICAgdXJsID0gIiVzOyVzIiAlICh1cmwsIHBhcmFtcykKKyAgICByZXR1cm4gdXJsdW5zcGxpdCgoc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50KSkKKworZGVmIHVybHVuc3BsaXQoZGF0YSk6CisgICAgIiIiQ29tYmluZSB0aGUgZWxlbWVudHMgb2YgYSB0dXBsZSBhcyByZXR1cm5lZCBieSB1cmxzcGxpdCgpIGludG8gYQorICAgIGNvbXBsZXRlIFVSTCBhcyBhIHN0cmluZy4gVGhlIGRhdGEgYXJndW1lbnQgY2FuIGJlIGFueSBmaXZlLWl0ZW0gaXRlcmFibGUuCisgICAgVGhpcyBtYXkgcmVzdWx0IGluIGEgc2xpZ2h0bHkgZGlmZmVyZW50LCBidXQgZXF1aXZhbGVudCBVUkwsIGlmIHRoZSBVUkwgdGhhdAorICAgIHdhcyBwYXJzZWQgb3JpZ2luYWxseSBoYWQgdW5uZWNlc3NhcnkgZGVsaW1pdGVycyAoZm9yIGV4YW1wbGUsIGEgPyB3aXRoIGFuCisgICAgZW1wdHkgcXVlcnk7IHRoZSBSRkMgc3RhdGVzIHRoYXQgdGhlc2UgYXJlIGVxdWl2YWxlbnQpLiIiIgorICAgIHNjaGVtZSwgbmV0bG9jLCB1cmwsIHF1ZXJ5LCBmcmFnbWVudCA9IGRhdGEKKyAgICBpZiBuZXRsb2Mgb3IgKHNjaGVtZSBhbmQgc2NoZW1lIGluIHVzZXNfbmV0bG9jIGFuZCB1cmxbOjJdICE9ICcvLycpOgorICAgICAgICBpZiB1cmwgYW5kIHVybFs6MV0gIT0gJy8nOiB1cmwgPSAnLycgKyB1cmwKKyAgICAgICAgdXJsID0gJy8vJyArIChuZXRsb2Mgb3IgJycpICsgdXJsCisgICAgaWYgc2NoZW1lOgorICAgICAgICB1cmwgPSBzY2hlbWUgKyAnOicgKyB1cmwKKyAgICBpZiBxdWVyeToKKyAgICAgICAgdXJsID0gdXJsICsgJz8nICsgcXVlcnkKKyAgICBpZiBmcmFnbWVudDoKKyAgICAgICAgdXJsID0gdXJsICsgJyMnICsgZnJhZ21lbnQKKyAgICByZXR1cm4gdXJsCisKK2RlZiB1cmxqb2luKGJhc2UsIHVybCwgYWxsb3dfZnJhZ21lbnRzPVRydWUpOgorICAgICIiIkpvaW4gYSBiYXNlIFVSTCBhbmQgYSBwb3NzaWJseSByZWxhdGl2ZSBVUkwgdG8gZm9ybSBhbiBhYnNvbHV0ZQorICAgIGludGVycHJldGF0aW9uIG9mIHRoZSBsYXR0ZXIuIiIiCisgICAgaWYgbm90IGJhc2U6CisgICAgICAgIHJldHVybiB1cmwKKyAgICBpZiBub3QgdXJsOgorICAgICAgICByZXR1cm4gYmFzZQorICAgIGJzY2hlbWUsIGJuZXRsb2MsIGJwYXRoLCBicGFyYW1zLCBicXVlcnksIGJmcmFnbWVudCA9IFwKKyAgICAgICAgICAgIHVybHBhcnNlKGJhc2UsICcnLCBhbGxvd19mcmFnbWVudHMpCisgICAgc2NoZW1lLCBuZXRsb2MsIHBhdGgsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50ID0gXAorICAgICAgICAgICAgdXJscGFyc2UodXJsLCBic2NoZW1lLCBhbGxvd19mcmFnbWVudHMpCisgICAgaWYgc2NoZW1lICE9IGJzY2hlbWUgb3Igc2NoZW1lIG5vdCBpbiB1c2VzX3JlbGF0aXZlOgorICAgICAgICByZXR1cm4gdXJsCisgICAgaWYgc2NoZW1lIGluIHVzZXNfbmV0bG9jOgorICAgICAgICBpZiBuZXRsb2M6CisgICAgICAgICAgICByZXR1cm4gdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpKQorICAgICAgICBuZXRsb2MgPSBibmV0bG9jCisgICAgaWYgcGF0aFs6MV0gPT0gJy8nOgorICAgICAgICByZXR1cm4gdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkpCisgICAgaWYgbm90IHBhdGggYW5kIG5vdCBwYXJhbXM6CisgICAgICAgIHBhdGggPSBicGF0aAorICAgICAgICBwYXJhbXMgPSBicGFyYW1zCisgICAgICAgIGlmIG5vdCBxdWVyeToKKyAgICAgICAgICAgIHF1ZXJ5ID0gYnF1ZXJ5CisgICAgICAgIHJldHVybiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgcXVlcnksIGZyYWdtZW50KSkKKyAgICBzZWdtZW50cyA9IGJwYXRoLnNwbGl0KCcvJylbOi0xXSArIHBhdGguc3BsaXQoJy8nKQorICAgICMgWFhYIFRoZSBzdHVmZiBiZWxvdyBpcyBib2d1cyBpbiB2YXJpb3VzIHdheXMuLi4KKyAgICBpZiBzZWdtZW50c1stMV0gPT0gJy4nOgorICAgICAgICBzZWdtZW50c1stMV0gPSAnJworICAgIHdoaWxlICcuJyBpbiBzZWdtZW50czoKKyAgICAgICAgc2VnbWVudHMucmVtb3ZlKCcuJykKKyAgICB3aGlsZSAxOgorICAgICAgICBpID0gMQorICAgICAgICBuID0gbGVuKHNlZ21lbnRzKSAtIDEKKyAgICAgICAgd2hpbGUgaSA8IG46CisgICAgICAgICAgICBpZiAoc2VnbWVudHNbaV0gPT0gJy4uJworICAgICAgICAgICAgICAgIGFuZCBzZWdtZW50c1tpLTFdIG5vdCBpbiAoJycsICcuLicpKToKKyAgICAgICAgICAgICAgICBkZWwgc2VnbWVudHNbaS0xOmkrMV0KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnJlYWsKKyAgICBpZiBzZWdtZW50cyA9PSBbJycsICcuLiddOgorICAgICAgICBzZWdtZW50c1stMV0gPSAnJworICAgIGVsaWYgbGVuKHNlZ21lbnRzKSA+PSAyIGFuZCBzZWdtZW50c1stMV0gPT0gJy4uJzoKKyAgICAgICAgc2VnbWVudHNbLTI6XSA9IFsnJ10KKyAgICByZXR1cm4gdXJsdW5wYXJzZSgoc2NoZW1lLCBuZXRsb2MsICcvJy5qb2luKHNlZ21lbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpKQorCitkZWYgdXJsZGVmcmFnKHVybCk6CisgICAgIiIiUmVtb3ZlcyBhbnkgZXhpc3RpbmcgZnJhZ21lbnQgZnJvbSBVUkwuCisKKyAgICBSZXR1cm5zIGEgdHVwbGUgb2YgdGhlIGRlZnJhZ21lbnRlZCBVUkwgYW5kIHRoZSBmcmFnbWVudC4gIElmCisgICAgdGhlIFVSTCBjb250YWluZWQgbm8gZnJhZ21lbnRzLCB0aGUgc2Vjb25kIGVsZW1lbnQgaXMgdGhlCisgICAgZW1wdHkgc3RyaW5nLgorICAgICIiIgorICAgIGlmICcjJyBpbiB1cmw6CisgICAgICAgIHMsIG4sIHAsIGEsIHEsIGZyYWcgPSB1cmxwYXJzZSh1cmwpCisgICAgICAgIGRlZnJhZyA9IHVybHVucGFyc2UoKHMsIG4sIHAsIGEsIHEsICcnKSkKKyAgICAgICAgcmV0dXJuIGRlZnJhZywgZnJhZworICAgIGVsc2U6CisgICAgICAgIHJldHVybiB1cmwsICcnCisKK3RyeToKKyAgICB1bmljb2RlCitleGNlcHQgTmFtZUVycm9yOgorICAgIGRlZiBfaXNfdW5pY29kZSh4KToKKyAgICAgICAgcmV0dXJuIDAKK2Vsc2U6CisgICAgZGVmIF9pc191bmljb2RlKHgpOgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZSh4LCB1bmljb2RlKQorCisjIHVucXVvdGUgbWV0aG9kIGZvciBwYXJzZV9xcyBhbmQgcGFyc2VfcXNsCisjIENhbm5vdCB1c2UgZGlyZWN0bHkgZnJvbSB1cmxsaWIgYXMgaXQgd291bGQgY3JlYXRlIGEgY2lyY3VsYXIgcmVmZXJlbmNlCisjIGJlY2F1c2UgdXJsbGliIHVzZXMgdXJscGFyc2UgbWV0aG9kcyAodXJsam9pbikuICBJZiB5b3UgdXBkYXRlIHRoaXMgZnVuY3Rpb24sCisjIHVwZGF0ZSBpdCBhbHNvIGluIHVybGxpYi4gIFRoaXMgY29kZSBkdXBsaWNhdGlvbiBkb2VzIG5vdCBleGlzdGluIGluIFB5dGhvbjMuCisKK19oZXhkaWcgPSAnMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZicKK19oZXh0b2NociA9IGRpY3QoKGErYiwgY2hyKGludChhK2IsMTYpKSkKKyAgICAgICAgICAgICAgICAgZm9yIGEgaW4gX2hleGRpZyBmb3IgYiBpbiBfaGV4ZGlnKQorX2FzY2lpcmUgPSByZS5jb21waWxlKCcoW1x4MDAtXHg3Zl0rKScpCisKK2RlZiB1bnF1b3RlKHMpOgorICAgICIiInVucXVvdGUoJ2FiYyUyMGRlZicpIC0+ICdhYmMgZGVmJy4iIiIKKyAgICBpZiBfaXNfdW5pY29kZShzKToKKyAgICAgICAgaWYgJyUnIG5vdCBpbiBzOgorICAgICAgICAgICAgcmV0dXJuIHMKKyAgICAgICAgYml0cyA9IF9hc2NpaXJlLnNwbGl0KHMpCisgICAgICAgIHJlcyA9IFtiaXRzWzBdXQorICAgICAgICBhcHBlbmQgPSByZXMuYXBwZW5kCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihiaXRzKSwgMik6CisgICAgICAgICAgICBhcHBlbmQodW5xdW90ZShzdHIoYml0c1tpXSkpLmRlY29kZSgnbGF0aW4xJykpCisgICAgICAgICAgICBhcHBlbmQoYml0c1tpICsgMV0pCisgICAgICAgIHJldHVybiAnJy5qb2luKHJlcykKKworICAgIGJpdHMgPSBzLnNwbGl0KCclJykKKyAgICAjIGZhc3RwYXRoCisgICAgaWYgbGVuKGJpdHMpID09IDE6CisgICAgICAgIHJldHVybiBzCisgICAgcmVzID0gW2JpdHNbMF1dCisgICAgYXBwZW5kID0gcmVzLmFwcGVuZAorICAgIGZvciBpdGVtIGluIGJpdHNbMTpdOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhcHBlbmQoX2hleHRvY2hyW2l0ZW1bOjJdXSkKKyAgICAgICAgICAgIGFwcGVuZChpdGVtWzI6XSkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgYXBwZW5kKCclJykKKyAgICAgICAgICAgIGFwcGVuZChpdGVtKQorICAgIHJldHVybiAnJy5qb2luKHJlcykKKworZGVmIHBhcnNlX3FzKHFzLCBrZWVwX2JsYW5rX3ZhbHVlcz0wLCBzdHJpY3RfcGFyc2luZz0wKToKKyAgICAiIiJQYXJzZSBhIHF1ZXJ5IGdpdmVuIGFzIGEgc3RyaW5nIGFyZ3VtZW50LgorCisgICAgICAgIEFyZ3VtZW50czoKKworICAgICAgICBxczogcGVyY2VudC1lbmNvZGVkIHF1ZXJ5IHN0cmluZyB0byBiZSBwYXJzZWQKKworICAgICAgICBrZWVwX2JsYW5rX3ZhbHVlczogZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYmxhbmsgdmFsdWVzIGluCisgICAgICAgICAgICBwZXJjZW50LWVuY29kZWQgcXVlcmllcyBzaG91bGQgYmUgdHJlYXRlZCBhcyBibGFuayBzdHJpbmdzLgorICAgICAgICAgICAgQSB0cnVlIHZhbHVlIGluZGljYXRlcyB0aGF0IGJsYW5rcyBzaG91bGQgYmUgcmV0YWluZWQgYXMKKyAgICAgICAgICAgIGJsYW5rIHN0cmluZ3MuICBUaGUgZGVmYXVsdCBmYWxzZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdAorICAgICAgICAgICAgYmxhbmsgdmFsdWVzIGFyZSB0byBiZSBpZ25vcmVkIGFuZCB0cmVhdGVkIGFzIGlmIHRoZXkgd2VyZQorICAgICAgICAgICAgbm90IGluY2x1ZGVkLgorCisgICAgICAgIHN0cmljdF9wYXJzaW5nOiBmbGFnIGluZGljYXRpbmcgd2hhdCB0byBkbyB3aXRoIHBhcnNpbmcgZXJyb3JzLgorICAgICAgICAgICAgSWYgZmFsc2UgKHRoZSBkZWZhdWx0KSwgZXJyb3JzIGFyZSBzaWxlbnRseSBpZ25vcmVkLgorICAgICAgICAgICAgSWYgdHJ1ZSwgZXJyb3JzIHJhaXNlIGEgVmFsdWVFcnJvciBleGNlcHRpb24uCisgICAgIiIiCisgICAgZGljdCA9IHt9CisgICAgZm9yIG5hbWUsIHZhbHVlIGluIHBhcnNlX3FzbChxcywga2VlcF9ibGFua192YWx1ZXMsIHN0cmljdF9wYXJzaW5nKToKKyAgICAgICAgaWYgbmFtZSBpbiBkaWN0OgorICAgICAgICAgICAgZGljdFtuYW1lXS5hcHBlbmQodmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaWN0W25hbWVdID0gW3ZhbHVlXQorICAgIHJldHVybiBkaWN0CisKK2RlZiBwYXJzZV9xc2wocXMsIGtlZXBfYmxhbmtfdmFsdWVzPTAsIHN0cmljdF9wYXJzaW5nPTApOgorICAgICIiIlBhcnNlIGEgcXVlcnkgZ2l2ZW4gYXMgYSBzdHJpbmcgYXJndW1lbnQuCisKKyAgICBBcmd1bWVudHM6CisKKyAgICBxczogcGVyY2VudC1lbmNvZGVkIHF1ZXJ5IHN0cmluZyB0byBiZSBwYXJzZWQKKworICAgIGtlZXBfYmxhbmtfdmFsdWVzOiBmbGFnIGluZGljYXRpbmcgd2hldGhlciBibGFuayB2YWx1ZXMgaW4KKyAgICAgICAgcGVyY2VudC1lbmNvZGVkIHF1ZXJpZXMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYmxhbmsgc3RyaW5ncy4gIEEKKyAgICAgICAgdHJ1ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBibGFua3Mgc2hvdWxkIGJlIHJldGFpbmVkIGFzIGJsYW5rCisgICAgICAgIHN0cmluZ3MuICBUaGUgZGVmYXVsdCBmYWxzZSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBibGFuayB2YWx1ZXMKKyAgICAgICAgYXJlIHRvIGJlIGlnbm9yZWQgYW5kIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlICBub3QgaW5jbHVkZWQuCisKKyAgICBzdHJpY3RfcGFyc2luZzogZmxhZyBpbmRpY2F0aW5nIHdoYXQgdG8gZG8gd2l0aCBwYXJzaW5nIGVycm9ycy4gSWYKKyAgICAgICAgZmFsc2UgKHRoZSBkZWZhdWx0KSwgZXJyb3JzIGFyZSBzaWxlbnRseSBpZ25vcmVkLiBJZiB0cnVlLAorICAgICAgICBlcnJvcnMgcmFpc2UgYSBWYWx1ZUVycm9yIGV4Y2VwdGlvbi4KKworICAgIFJldHVybnMgYSBsaXN0LCBhcyBHLWQgaW50ZW5kZWQuCisgICAgIiIiCisgICAgcGFpcnMgPSBbczIgZm9yIHMxIGluIHFzLnNwbGl0KCcmJykgZm9yIHMyIGluIHMxLnNwbGl0KCc7JyldCisgICAgciA9IFtdCisgICAgZm9yIG5hbWVfdmFsdWUgaW4gcGFpcnM6CisgICAgICAgIGlmIG5vdCBuYW1lX3ZhbHVlIGFuZCBub3Qgc3RyaWN0X3BhcnNpbmc6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBudiA9IG5hbWVfdmFsdWUuc3BsaXQoJz0nLCAxKQorICAgICAgICBpZiBsZW4obnYpICE9IDI6CisgICAgICAgICAgICBpZiBzdHJpY3RfcGFyc2luZzoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiYmFkIHF1ZXJ5IGZpZWxkOiAlciIgJSAobmFtZV92YWx1ZSwpCisgICAgICAgICAgICAjIEhhbmRsZSBjYXNlIG9mIGEgY29udHJvbC1uYW1lIHdpdGggbm8gZXF1YWwgc2lnbgorICAgICAgICAgICAgaWYga2VlcF9ibGFua192YWx1ZXM6CisgICAgICAgICAgICAgICAgbnYuYXBwZW5kKCcnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBpZiBsZW4obnZbMV0pIG9yIGtlZXBfYmxhbmtfdmFsdWVzOgorICAgICAgICAgICAgbmFtZSA9IHVucXVvdGUobnZbMF0ucmVwbGFjZSgnKycsICcgJykpCisgICAgICAgICAgICB2YWx1ZSA9IHVucXVvdGUobnZbMV0ucmVwbGFjZSgnKycsICcgJykpCisgICAgICAgICAgICByLmFwcGVuZCgobmFtZSwgdmFsdWUpKQorCisgICAgcmV0dXJuIHIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXJscGFyc2UucHljIGIvbGliL3B5dGhvbjIuNy91cmxwYXJzZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhYzk4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJscGFyc2UucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXJscGFyc2UucHlvIGIvbGliL3B5dGhvbjIuNy91cmxwYXJzZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhYzk4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXJscGFyc2UucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXNlci5weSBiL2xpYi9weXRob24yLjcvdXNlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTZmMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91c2VyLnB5CkBAIC0wLDAgKzEsNDggQEAKKyIiIkhvb2sgdG8gYWxsb3cgdXNlci1zcGVjaWZpZWQgY3VzdG9taXphdGlvbiBjb2RlIHRvIHJ1bi4KKworQXMgYSBwb2xpY3ksIFB5dGhvbiBkb2Vzbid0IHJ1biB1c2VyLXNwZWNpZmllZCBjb2RlIG9uIHN0YXJ0dXAgb2YKK1B5dGhvbiBwcm9ncmFtcyAoaW50ZXJhY3RpdmUgc2Vzc2lvbnMgZXhlY3V0ZSB0aGUgc2NyaXB0IHNwZWNpZmllZCBpbgordGhlIFBZVEhPTlNUQVJUVVAgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgaXQgZXhpc3RzKS4KKworSG93ZXZlciwgc29tZSBwcm9ncmFtcyBvciBzaXRlcyBtYXkgZmluZCBpdCBjb252ZW5pZW50IHRvIGFsbG93IHVzZXJzCit0byBoYXZlIGEgc3RhbmRhcmQgY3VzdG9taXphdGlvbiBmaWxlLCB3aGljaCBnZXRzIHJ1biB3aGVuIGEgcHJvZ3JhbQorcmVxdWVzdHMgaXQuICBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHN1Y2ggYSBtZWNoYW5pc20uICBBIHByb2dyYW0KK3RoYXQgd2lzaGVzIHRvIHVzZSB0aGUgbWVjaGFuaXNtIG11c3QgZXhlY3V0ZSB0aGUgc3RhdGVtZW50CisKKyAgICBpbXBvcnQgdXNlcgorCitUaGUgdXNlciBtb2R1bGUgbG9va3MgZm9yIGEgZmlsZSAucHl0aG9ucmMucHkgaW4gdGhlIHVzZXIncyBob21lCitkaXJlY3RvcnkgYW5kIGlmIGl0IGNhbiBiZSBvcGVuZWQsIGV4ZWNmaWxlKClzIGl0IGluIGl0cyBvd24gZ2xvYmFsCituYW1lc3BhY2UuICBFcnJvcnMgZHVyaW5nIHRoaXMgcGhhc2UgYXJlIG5vdCBjYXVnaHQ7IHRoYXQncyB1cCB0byB0aGUKK3Byb2dyYW0gdGhhdCBpbXBvcnRzIHRoZSB1c2VyIG1vZHVsZSwgaWYgaXQgd2lzaGVzLgorCitUaGUgdXNlcidzIC5weXRob25yYy5weSBjb3VsZCBjb25jZWl2YWJseSB0ZXN0IGZvciBzeXMudmVyc2lvbiBpZiBpdAord2lzaGVzIHRvIGRvIGRpZmZlcmVudCB0aGluZ3MgZGVwZW5kaW5nIG9uIHRoZSBQeXRob24gdmVyc2lvbi4KKworIiIiCitmcm9tIHdhcm5pbmdzIGltcG9ydCB3YXJucHkzaword2FybnB5M2soInRoZSB1c2VyIG1vZHVsZSBoYXMgYmVlbiByZW1vdmVkIGluIFB5dGhvbiAzLjAiLCBzdGFja2xldmVsPTIpCitkZWwgd2FybnB5M2sKKworaW1wb3J0IG9zCisKK2hvbWUgPSBvcy5jdXJkaXIgICAgICAgICAgICAgICAgICAgICAgICAjIERlZmF1bHQKK2lmICdIT01FJyBpbiBvcy5lbnZpcm9uOgorICAgIGhvbWUgPSBvcy5lbnZpcm9uWydIT01FJ10KK2VsaWYgb3MubmFtZSA9PSAncG9zaXgnOgorICAgIGhvbWUgPSBvcy5wYXRoLmV4cGFuZHVzZXIoIn4vIikKK2VsaWYgb3MubmFtZSA9PSAnbnQnOiAgICAgICAgICAgICAgICAgICAjIENvbnRyaWJ1dGVkIGJ5IEplZmYgQmF1ZXIKKyAgICBpZiAnSE9NRVBBVEgnIGluIG9zLmVudmlyb246CisgICAgICAgIGlmICdIT01FRFJJVkUnIGluIG9zLmVudmlyb246CisgICAgICAgICAgICBob21lID0gb3MuZW52aXJvblsnSE9NRURSSVZFJ10gKyBvcy5lbnZpcm9uWydIT01FUEFUSCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBob21lID0gb3MuZW52aXJvblsnSE9NRVBBVEgnXQorCitweXRob25yYyA9IG9zLnBhdGguam9pbihob21lLCAiLnB5dGhvbnJjLnB5IikKK3RyeToKKyAgICBmID0gb3BlbihweXRob25yYykKK2V4Y2VwdCBJT0Vycm9yOgorICAgIHBhc3MKK2Vsc2U6CisgICAgZi5jbG9zZSgpCisgICAgZXhlY2ZpbGUocHl0aG9ucmMpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VzZXIucHljIGIvbGliL3B5dGhvbjIuNy91c2VyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzAyNTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91c2VyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3VzZXIucHlvIGIvbGliL3B5dGhvbjIuNy91c2VyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzAyNTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91c2VyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3V1LnB5IGIvbGliL3B5dGhvbjIuNy91dS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOGZhNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91dS5weQpAQCAtMCwwICsxLDE5NiBAQAorIyEgL3Vzci9iaW4vZW52IHB5dGhvbgorCisjIENvcHlyaWdodCAxOTk0IGJ5IExhbmNlIEVsbGluZ2hvdXNlCisjIENhdGhlZHJhbCBDaXR5LCBDYWxpZm9ybmlhIFJlcHVibGljLCBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuCisjICAgICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAorIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLAorIyBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0CisjIGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbgorIyBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIExhbmNlIEVsbGluZ2hvdXNlCisjIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbgorIyBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLgorIyBMQU5DRSBFTExJTkdIT1VTRSBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8KKyMgVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORAorIyBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBMQU5DRSBFTExJTkdIT1VTRSBDRU5UUlVNIEJFIExJQUJMRQorIyBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworIyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyMgQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQKKyMgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyMKKyMgTW9kaWZpZWQgYnkgSmFjayBKYW5zZW4sIENXSSwgSnVseSAxOTk1OgorIyAtIFVzZSBiaW5hc2NpaSBtb2R1bGUgdG8gZG8gdGhlIGFjdHVhbCBsaW5lLWJ5LWxpbmUgY29udmVyc2lvbgorIyAgIGJldHdlZW4gYXNjaWkgYW5kIGJpbmFyeS4gVGhpcyByZXN1bHRzIGluIGEgMTAwMC1mb2xkIHNwZWVkdXAuIFRoZSBDCisjICAgdmVyc2lvbiBpcyBzdGlsbCA1IHRpbWVzIGZhc3RlciwgdGhvdWdoLgorIyAtIEFyZ3VtZW50cyBtb3JlIGNvbXBsaWFudCB3aXRoIHB5dGhvbiBzdGFuZGFyZAorCisiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgVVVlbmNvZGUgYW5kIFVVZGVjb2RlIGZ1bmN0aW9ucy4KKworZW5jb2RlKGluX2ZpbGUsIG91dF9maWxlIFssbmFtZSwgbW9kZV0pCitkZWNvZGUoaW5fZmlsZSBbLCBvdXRfZmlsZSwgbW9kZV0pCisiIiIKKworaW1wb3J0IGJpbmFzY2lpCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworX19hbGxfXyA9IFsiRXJyb3IiLCAiZW5jb2RlIiwgImRlY29kZSJdCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitkZWYgZW5jb2RlKGluX2ZpbGUsIG91dF9maWxlLCBuYW1lPU5vbmUsIG1vZGU9Tm9uZSk6CisgICAgIiIiVXVlbmNvZGUgZmlsZSIiIgorICAgICMKKyAgICAjIElmIGluX2ZpbGUgaXMgYSBwYXRobmFtZSBvcGVuIGl0IGFuZCBjaGFuZ2UgZGVmYXVsdHMKKyAgICAjCisgICAgb3BlbmVkX2ZpbGVzID0gW10KKyAgICB0cnk6CisgICAgICAgIGlmIGluX2ZpbGUgPT0gJy0nOgorICAgICAgICAgICAgaW5fZmlsZSA9IHN5cy5zdGRpbgorICAgICAgICBlbGlmIGlzaW5zdGFuY2UoaW5fZmlsZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoaW5fZmlsZSkKKyAgICAgICAgICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBvcy5zdGF0KGluX2ZpbGUpLnN0X21vZGUKKyAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGluX2ZpbGUgPSBvcGVuKGluX2ZpbGUsICdyYicpCisgICAgICAgICAgICBvcGVuZWRfZmlsZXMuYXBwZW5kKGluX2ZpbGUpCisgICAgICAgICMKKyAgICAgICAgIyBPcGVuIG91dF9maWxlIGlmIGl0IGlzIGEgcGF0aG5hbWUKKyAgICAgICAgIworICAgICAgICBpZiBvdXRfZmlsZSA9PSAnLSc6CisgICAgICAgICAgICBvdXRfZmlsZSA9IHN5cy5zdGRvdXQKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKG91dF9maWxlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIG91dF9maWxlID0gb3BlbihvdXRfZmlsZSwgJ3diJykKKyAgICAgICAgICAgIG9wZW5lZF9maWxlcy5hcHBlbmQob3V0X2ZpbGUpCisgICAgICAgICMKKyAgICAgICAgIyBTZXQgZGVmYXVsdHMgZm9yIG5hbWUgYW5kIG1vZGUKKyAgICAgICAgIworICAgICAgICBpZiBuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBuYW1lID0gJy0nCisgICAgICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZGUgPSAwNjY2CisgICAgICAgICMKKyAgICAgICAgIyBXcml0ZSB0aGUgZGF0YQorICAgICAgICAjCisgICAgICAgIG91dF9maWxlLndyaXRlKCdiZWdpbiAlbyAlc1xuJyAlICgobW9kZSYwNzc3KSxuYW1lKSkKKyAgICAgICAgZGF0YSA9IGluX2ZpbGUucmVhZCg0NSkKKyAgICAgICAgd2hpbGUgbGVuKGRhdGEpID4gMDoKKyAgICAgICAgICAgIG91dF9maWxlLndyaXRlKGJpbmFzY2lpLmIyYV91dShkYXRhKSkKKyAgICAgICAgICAgIGRhdGEgPSBpbl9maWxlLnJlYWQoNDUpCisgICAgICAgIG91dF9maWxlLndyaXRlKCcgXG5lbmRcbicpCisgICAgZmluYWxseToKKyAgICAgICAgZm9yIGYgaW4gb3BlbmVkX2ZpbGVzOgorICAgICAgICAgICAgZi5jbG9zZSgpCisKKworZGVmIGRlY29kZShpbl9maWxlLCBvdXRfZmlsZT1Ob25lLCBtb2RlPU5vbmUsIHF1aWV0PTApOgorICAgICIiIkRlY29kZSB1dWVuY29kZWQgZmlsZSIiIgorICAgICMKKyAgICAjIE9wZW4gdGhlIGlucHV0IGZpbGUsIGlmIG5lZWRlZC4KKyAgICAjCisgICAgb3BlbmVkX2ZpbGVzID0gW10KKyAgICBpZiBpbl9maWxlID09ICctJzoKKyAgICAgICAgaW5fZmlsZSA9IHN5cy5zdGRpbgorICAgIGVsaWYgaXNpbnN0YW5jZShpbl9maWxlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgaW5fZmlsZSA9IG9wZW4oaW5fZmlsZSkKKyAgICAgICAgb3BlbmVkX2ZpbGVzLmFwcGVuZChpbl9maWxlKQorICAgIHRyeToKKyAgICAgICAgIworICAgICAgICAjIFJlYWQgdW50aWwgYSBiZWdpbiBpcyBlbmNvdW50ZXJlZCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGZpbGUKKyAgICAgICAgIworICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgaGRyID0gaW5fZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgaGRyOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCdObyB2YWxpZCBiZWdpbiBsaW5lIGZvdW5kIGluIGlucHV0IGZpbGUnKQorICAgICAgICAgICAgaWYgbm90IGhkci5zdGFydHN3aXRoKCdiZWdpbicpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBoZHJmaWVsZHMgPSBoZHIuc3BsaXQoJyAnLCAyKQorICAgICAgICAgICAgaWYgbGVuKGhkcmZpZWxkcykgPT0gMyBhbmQgaGRyZmllbGRzWzBdID09ICdiZWdpbic6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBpbnQoaGRyZmllbGRzWzFdLCA4KQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGlmIG91dF9maWxlIGlzIE5vbmU6CisgICAgICAgICAgICBvdXRfZmlsZSA9IGhkcmZpZWxkc1syXS5yc3RyaXAoKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3V0X2ZpbGUpOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCdDYW5ub3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGU6ICVzJyAlIG91dF9maWxlKQorICAgICAgICBpZiBtb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2RlID0gaW50KGhkcmZpZWxkc1sxXSwgOCkKKyAgICAgICAgIworICAgICAgICAjIE9wZW4gdGhlIG91dHB1dCBmaWxlCisgICAgICAgICMKKyAgICAgICAgaWYgb3V0X2ZpbGUgPT0gJy0nOgorICAgICAgICAgICAgb3V0X2ZpbGUgPSBzeXMuc3Rkb3V0CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdXRfZmlsZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBmcCA9IG9wZW4ob3V0X2ZpbGUsICd3YicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MucGF0aC5jaG1vZChvdXRfZmlsZSwgbW9kZSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBvdXRfZmlsZSA9IGZwCisgICAgICAgICAgICBvcGVuZWRfZmlsZXMuYXBwZW5kKG91dF9maWxlKQorICAgICAgICAjCisgICAgICAgICMgTWFpbiBkZWNvZGluZyBsb29wCisgICAgICAgICMKKyAgICAgICAgcyA9IGluX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICB3aGlsZSBzIGFuZCBzLnN0cmlwKCkgIT0gJ2VuZCc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZGF0YSA9IGJpbmFzY2lpLmEyYl91dShzKQorICAgICAgICAgICAgZXhjZXB0IGJpbmFzY2lpLkVycm9yLCB2OgorICAgICAgICAgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgYnJva2VuIHV1ZW5jb2RlcnMgYnkgL0ZyZWRyaWsgTHVuZGgKKyAgICAgICAgICAgICAgICBuYnl0ZXMgPSAoKChvcmQoc1swXSktMzIpICYgNjMpICogNCArIDUpIC8vIDMKKyAgICAgICAgICAgICAgICBkYXRhID0gYmluYXNjaWkuYTJiX3V1KHNbOm5ieXRlc10pCisgICAgICAgICAgICAgICAgaWYgbm90IHF1aWV0OgorICAgICAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJXYXJuaW5nOiAlc1xuIiAlIHYpCisgICAgICAgICAgICBvdXRfZmlsZS53cml0ZShkYXRhKQorICAgICAgICAgICAgcyA9IGluX2ZpbGUucmVhZGxpbmUoKQorICAgICAgICBpZiBub3QgczoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yKCdUcnVuY2F0ZWQgaW5wdXQgZmlsZScpCisgICAgZmluYWxseToKKyAgICAgICAgZm9yIGYgaW4gb3BlbmVkX2ZpbGVzOgorICAgICAgICAgICAgZi5jbG9zZSgpCisKK2RlZiB0ZXN0KCk6CisgICAgIiIidXVlbmNvZGUvdXVkZWNvZGUgbWFpbiBwcm9ncmFtIiIiCisKKyAgICBpbXBvcnQgb3B0cGFyc2UKKyAgICBwYXJzZXIgPSBvcHRwYXJzZS5PcHRpb25QYXJzZXIodXNhZ2U9J3VzYWdlOiAlcHJvZyBbLWRdIFstdF0gW2lucHV0IFtvdXRwdXRdXScpCisgICAgcGFyc2VyLmFkZF9vcHRpb24oJy1kJywgJy0tZGVjb2RlJywgZGVzdD0nZGVjb2RlJywgaGVscD0nRGVjb2RlIChpbnN0ZWFkIG9mIGVuY29kZSk/JywgZGVmYXVsdD1GYWxzZSwgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICBwYXJzZXIuYWRkX29wdGlvbignLXQnLCAnLS10ZXh0JywgZGVzdD0ndGV4dCcsIGhlbHA9J2RhdGEgaXMgdGV4dCwgZW5jb2RlZCBmb3JtYXQgdW5peC1jb21wYXRpYmxlIHRleHQ/JywgZGVmYXVsdD1GYWxzZSwgYWN0aW9uPSdzdG9yZV90cnVlJykKKworICAgIChvcHRpb25zLCBhcmdzKSA9IHBhcnNlci5wYXJzZV9hcmdzKCkKKyAgICBpZiBsZW4oYXJncykgPiAyOgorICAgICAgICBwYXJzZXIuZXJyb3IoJ2luY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGlucHV0ID0gc3lzLnN0ZGluCisgICAgb3V0cHV0ID0gc3lzLnN0ZG91dAorICAgIGlmIGxlbihhcmdzKSA+IDA6CisgICAgICAgIGlucHV0ID0gYXJnc1swXQorICAgIGlmIGxlbihhcmdzKSA+IDE6CisgICAgICAgIG91dHB1dCA9IGFyZ3NbMV0KKworICAgIGlmIG9wdGlvbnMuZGVjb2RlOgorICAgICAgICBpZiBvcHRpb25zLnRleHQ6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG91dHB1dCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gb3BlbihvdXRwdXQsICd3JykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgc3lzLmFyZ3ZbMF0sICc6IGNhbm5vdCBkbyAtdCB0byBzdGRvdXQnCisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAgICAgZGVjb2RlKGlucHV0LCBvdXRwdXQpCisgICAgZWxzZToKKyAgICAgICAgaWYgb3B0aW9ucy50ZXh0OgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShpbnB1dCwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICAgICAgaW5wdXQgPSBvcGVuKGlucHV0LCAncicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50IHN5cy5hcmd2WzBdLCAnOiBjYW5ub3QgZG8gLXQgZnJvbSBzdGRpbicKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBlbmNvZGUoaW5wdXQsIG91dHB1dCkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXUucHljIGIvbGliL3B5dGhvbjIuNy91dS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0YmFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXUucHlvIGIvbGliL3B5dGhvbjIuNy91dS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0YmFlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvdXVpZC5weSBiL2xpYi9weXRob24yLjcvdXVpZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGQwYzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy91dWlkLnB5CkBAIC0wLDAgKzEsNTYwIEBACityIiIiVVVJRCBvYmplY3RzICh1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcnMpIGFjY29yZGluZyB0byBSRkMgNDEyMi4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW1tdXRhYmxlIFVVSUQgb2JqZWN0cyAoY2xhc3MgVVVJRCkgYW5kIHRoZSBmdW5jdGlvbnMKK3V1aWQxKCksIHV1aWQzKCksIHV1aWQ0KCksIHV1aWQ1KCkgZm9yIGdlbmVyYXRpbmcgdmVyc2lvbiAxLCAzLCA0LCBhbmQgNQorVVVJRHMgYXMgc3BlY2lmaWVkIGluIFJGQyA0MTIyLgorCitJZiBhbGwgeW91IHdhbnQgaXMgYSB1bmlxdWUgSUQsIHlvdSBzaG91bGQgcHJvYmFibHkgY2FsbCB1dWlkMSgpIG9yIHV1aWQ0KCkuCitOb3RlIHRoYXQgdXVpZDEoKSBtYXkgY29tcHJvbWlzZSBwcml2YWN5IHNpbmNlIGl0IGNyZWF0ZXMgYSBVVUlEIGNvbnRhaW5pbmcKK3RoZSBjb21wdXRlcidzIG5ldHdvcmsgYWRkcmVzcy4gIHV1aWQ0KCkgY3JlYXRlcyBhIHJhbmRvbSBVVUlELgorCitUeXBpY2FsIHVzYWdlOgorCisgICAgPj4+IGltcG9ydCB1dWlkCisKKyAgICAjIG1ha2UgYSBVVUlEIGJhc2VkIG9uIHRoZSBob3N0IElEIGFuZCBjdXJyZW50IHRpbWUKKyAgICA+Pj4gdXVpZC51dWlkMSgpCisgICAgVVVJRCgnYTgwOThjMWEtZjg2ZS0xMWRhLWJkMWEtMDAxMTI0NDRiZTFlJykKKworICAgICMgbWFrZSBhIFVVSUQgdXNpbmcgYW4gTUQ1IGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCisgICAgPj4+IHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpCisgICAgVVVJRCgnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJykKKworICAgICMgbWFrZSBhIHJhbmRvbSBVVUlECisgICAgPj4+IHV1aWQudXVpZDQoKQorICAgIFVVSUQoJzE2ZmQyNzA2LThiYWYtNDMzYi04MmViLThjN2ZhZGE4NDdkYScpCisKKyAgICAjIG1ha2UgYSBVVUlEIHVzaW5nIGEgU0hBLTEgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKKyAgICA+Pj4gdXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJykKKyAgICBVVUlEKCc4ODYzMTNlMS0zYjhhLTUzNzItOWI5MC0wYzlhZWUxOTllNWQnKQorCisgICAgIyBtYWtlIGEgVVVJRCBmcm9tIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgKGJyYWNlcyBhbmQgaHlwaGVucyBpZ25vcmVkKQorICAgID4+PiB4ID0gdXVpZC5VVUlEKCd7MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmfScpCisKKyAgICAjIGNvbnZlcnQgYSBVVUlEIHRvIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgaW4gc3RhbmRhcmQgZm9ybQorICAgID4+PiBzdHIoeCkKKyAgICAnMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJworCisgICAgIyBnZXQgdGhlIHJhdyAxNiBieXRlcyBvZiB0aGUgVVVJRAorICAgID4+PiB4LmJ5dGVzCisgICAgJ1x4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx0XG5ceDBiXHgwY1xyXHgwZVx4MGYnCisKKyAgICAjIG1ha2UgYSBVVUlEIGZyb20gYSAxNi1ieXRlIHN0cmluZworICAgID4+PiB1dWlkLlVVSUQoYnl0ZXM9eC5ieXRlcykKKyAgICBVVUlEKCcwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnKQorIiIiCisKK19fYXV0aG9yX18gPSAnS2EtUGluZyBZZWUgPHBpbmdAemVzdHkuY2E+JworCitSRVNFUlZFRF9OQ1MsIFJGQ180MTIyLCBSRVNFUlZFRF9NSUNST1NPRlQsIFJFU0VSVkVEX0ZVVFVSRSA9IFsKKyAgICAncmVzZXJ2ZWQgZm9yIE5DUyBjb21wYXRpYmlsaXR5JywgJ3NwZWNpZmllZCBpbiBSRkMgNDEyMicsCisgICAgJ3Jlc2VydmVkIGZvciBNaWNyb3NvZnQgY29tcGF0aWJpbGl0eScsICdyZXNlcnZlZCBmb3IgZnV0dXJlIGRlZmluaXRpb24nXQorCitjbGFzcyBVVUlEKG9iamVjdCk6CisgICAgIiIiSW5zdGFuY2VzIG9mIHRoZSBVVUlEIGNsYXNzIHJlcHJlc2VudCBVVUlEcyBhcyBzcGVjaWZpZWQgaW4gUkZDIDQxMjIuCisgICAgVVVJRCBvYmplY3RzIGFyZSBpbW11dGFibGUsIGhhc2hhYmxlLCBhbmQgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4KKyAgICBDb252ZXJ0aW5nIGEgVVVJRCB0byBhIHN0cmluZyB3aXRoIHN0cigpIHlpZWxkcyBzb21ldGhpbmcgaW4gdGhlIGZvcm0KKyAgICAnMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5YWJjJy4gIFRoZSBVVUlEIGNvbnN0cnVjdG9yIGFjY2VwdHMKKyAgICBmaXZlIHBvc3NpYmxlIGZvcm1zOiBhIHNpbWlsYXIgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cywgb3IgYSB0dXBsZQorICAgIG9mIHNpeCBpbnRlZ2VyIGZpZWxkcyAod2l0aCAzMi1iaXQsIDE2LWJpdCwgMTYtYml0LCA4LWJpdCwgOC1iaXQsIGFuZAorICAgIDQ4LWJpdCB2YWx1ZXMgcmVzcGVjdGl2ZWx5KSBhcyBhbiBhcmd1bWVudCBuYW1lZCAnZmllbGRzJywgb3IgYSBzdHJpbmcKKyAgICBvZiAxNiBieXRlcyAod2l0aCBhbGwgdGhlIGludGVnZXIgZmllbGRzIGluIGJpZy1lbmRpYW4gb3JkZXIpIGFzIGFuCisgICAgYXJndW1lbnQgbmFtZWQgJ2J5dGVzJywgb3IgYSBzdHJpbmcgb2YgMTYgYnl0ZXMgKHdpdGggdGhlIGZpcnN0IHRocmVlCisgICAgZmllbGRzIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIpIGFzIGFuIGFyZ3VtZW50IG5hbWVkICdieXRlc19sZScsIG9yIGEKKyAgICBzaW5nbGUgMTI4LWJpdCBpbnRlZ2VyIGFzIGFuIGFyZ3VtZW50IG5hbWVkICdpbnQnLgorCisgICAgVVVJRHMgaGF2ZSB0aGVzZSByZWFkLW9ubHkgYXR0cmlidXRlczoKKworICAgICAgICBieXRlcyAgICAgICB0aGUgVVVJRCBhcyBhIDE2LWJ5dGUgc3RyaW5nIChjb250YWluaW5nIHRoZSBzaXgKKyAgICAgICAgICAgICAgICAgICAgaW50ZWdlciBmaWVsZHMgaW4gYmlnLWVuZGlhbiBieXRlIG9yZGVyKQorCisgICAgICAgIGJ5dGVzX2xlICAgIHRoZSBVVUlEIGFzIGEgMTYtYnl0ZSBzdHJpbmcgKHdpdGggdGltZV9sb3csIHRpbWVfbWlkLAorICAgICAgICAgICAgICAgICAgICBhbmQgdGltZV9oaV92ZXJzaW9uIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlcikKKworICAgICAgICBmaWVsZHMgICAgICBhIHR1cGxlIG9mIHRoZSBzaXggaW50ZWdlciBmaWVsZHMgb2YgdGhlIFVVSUQsCisgICAgICAgICAgICAgICAgICAgIHdoaWNoIGFyZSBhbHNvIGF2YWlsYWJsZSBhcyBzaXggaW5kaXZpZHVhbCBhdHRyaWJ1dGVzCisgICAgICAgICAgICAgICAgICAgIGFuZCB0d28gZGVyaXZlZCBhdHRyaWJ1dGVzOgorCisgICAgICAgICAgICB0aW1lX2xvdyAgICAgICAgICAgICAgICB0aGUgZmlyc3QgMzIgYml0cyBvZiB0aGUgVVVJRAorICAgICAgICAgICAgdGltZV9taWQgICAgICAgICAgICAgICAgdGhlIG5leHQgMTYgYml0cyBvZiB0aGUgVVVJRAorICAgICAgICAgICAgdGltZV9oaV92ZXJzaW9uICAgICAgICAgdGhlIG5leHQgMTYgYml0cyBvZiB0aGUgVVVJRAorICAgICAgICAgICAgY2xvY2tfc2VxX2hpX3ZhcmlhbnQgICAgdGhlIG5leHQgOCBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICBjbG9ja19zZXFfbG93ICAgICAgICAgICB0aGUgbmV4dCA4IGJpdHMgb2YgdGhlIFVVSUQKKyAgICAgICAgICAgIG5vZGUgICAgICAgICAgICAgICAgICAgIHRoZSBsYXN0IDQ4IGJpdHMgb2YgdGhlIFVVSUQKKworICAgICAgICAgICAgdGltZSAgICAgICAgICAgICAgICAgICAgdGhlIDYwLWJpdCB0aW1lc3RhbXAKKyAgICAgICAgICAgIGNsb2NrX3NlcSAgICAgICAgICAgICAgIHRoZSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyCisKKyAgICAgICAgaGV4ICAgICAgICAgdGhlIFVVSUQgYXMgYSAzMi1jaGFyYWN0ZXIgaGV4YWRlY2ltYWwgc3RyaW5nCisKKyAgICAgICAgaW50ICAgICAgICAgdGhlIFVVSUQgYXMgYSAxMjgtYml0IGludGVnZXIKKworICAgICAgICB1cm4gICAgICAgICB0aGUgVVVJRCBhcyBhIFVSTiBhcyBzcGVjaWZpZWQgaW4gUkZDIDQxMjIKKworICAgICAgICB2YXJpYW50ICAgICB0aGUgVVVJRCB2YXJpYW50IChvbmUgb2YgdGhlIGNvbnN0YW50cyBSRVNFUlZFRF9OQ1MsCisgICAgICAgICAgICAgICAgICAgIFJGQ180MTIyLCBSRVNFUlZFRF9NSUNST1NPRlQsIG9yIFJFU0VSVkVEX0ZVVFVSRSkKKworICAgICAgICB2ZXJzaW9uICAgICB0aGUgVVVJRCB2ZXJzaW9uIG51bWJlciAoMSB0aHJvdWdoIDUsIG1lYW5pbmdmdWwgb25seQorICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSB2YXJpYW50IGlzIFJGQ180MTIyKQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGhleD1Ob25lLCBieXRlcz1Ob25lLCBieXRlc19sZT1Ob25lLCBmaWVsZHM9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50PU5vbmUsIHZlcnNpb249Tm9uZSk6CisgICAgICAgIHIiIiJDcmVhdGUgYSBVVUlEIGZyb20gZWl0aGVyIGEgc3RyaW5nIG9mIDMyIGhleGFkZWNpbWFsIGRpZ2l0cywKKyAgICAgICAgYSBzdHJpbmcgb2YgMTYgYnl0ZXMgYXMgdGhlICdieXRlcycgYXJndW1lbnQsIGEgc3RyaW5nIG9mIDE2IGJ5dGVzCisgICAgICAgIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgYXMgdGhlICdieXRlc19sZScgYXJndW1lbnQsIGEgdHVwbGUgb2Ygc2l4CisgICAgICAgIGludGVnZXJzICgzMi1iaXQgdGltZV9sb3csIDE2LWJpdCB0aW1lX21pZCwgMTYtYml0IHRpbWVfaGlfdmVyc2lvbiwKKyAgICAgICAgOC1iaXQgY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIDgtYml0IGNsb2NrX3NlcV9sb3csIDQ4LWJpdCBub2RlKSBhcworICAgICAgICB0aGUgJ2ZpZWxkcycgYXJndW1lbnQsIG9yIGEgc2luZ2xlIDEyOC1iaXQgaW50ZWdlciBhcyB0aGUgJ2ludCcKKyAgICAgICAgYXJndW1lbnQuICBXaGVuIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgaXMgZ2l2ZW4sIGN1cmx5IGJyYWNlcywKKyAgICAgICAgaHlwaGVucywgYW5kIGEgVVJOIHByZWZpeCBhcmUgYWxsIG9wdGlvbmFsLiAgRm9yIGV4YW1wbGUsIHRoZXNlCisgICAgICAgIGV4cHJlc3Npb25zIGFsbCB5aWVsZCB0aGUgc2FtZSBVVUlEOgorCisgICAgICAgIFVVSUQoJ3sxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2Nzh9JykKKyAgICAgICAgVVVJRCgnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgnKQorICAgICAgICBVVUlEKCd1cm46dXVpZDoxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2NzgnKQorICAgICAgICBVVUlEKGJ5dGVzPSdceDEyXHgzNFx4NTZceDc4Jyo0KQorICAgICAgICBVVUlEKGJ5dGVzX2xlPSdceDc4XHg1Nlx4MzRceDEyXHgzNFx4MTJceDc4XHg1NicgKworICAgICAgICAgICAgICAgICAgICAgICdceDEyXHgzNFx4NTZceDc4XHgxMlx4MzRceDU2XHg3OCcpCisgICAgICAgIFVVSUQoZmllbGRzPSgweDEyMzQ1Njc4LCAweDEyMzQsIDB4NTY3OCwgMHgxMiwgMHgzNCwgMHg1Njc4MTIzNDU2NzgpKQorICAgICAgICBVVUlEKGludD0weDEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4KQorCisgICAgICAgIEV4YWN0bHkgb25lIG9mICdoZXgnLCAnYnl0ZXMnLCAnYnl0ZXNfbGUnLCAnZmllbGRzJywgb3IgJ2ludCcgbXVzdAorICAgICAgICBiZSBnaXZlbi4gIFRoZSAndmVyc2lvbicgYXJndW1lbnQgaXMgb3B0aW9uYWw7IGlmIGdpdmVuLCB0aGUgcmVzdWx0aW5nCisgICAgICAgIFVVSUQgd2lsbCBoYXZlIGl0cyB2YXJpYW50IGFuZCB2ZXJzaW9uIHNldCBhY2NvcmRpbmcgdG8gUkZDIDQxMjIsCisgICAgICAgIG92ZXJyaWRpbmcgdGhlIGdpdmVuICdoZXgnLCAnYnl0ZXMnLCAnYnl0ZXNfbGUnLCAnZmllbGRzJywgb3IgJ2ludCcuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIFtoZXgsIGJ5dGVzLCBieXRlc19sZSwgZmllbGRzLCBpbnRdLmNvdW50KE5vbmUpICE9IDQ6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ25lZWQgb25lIG9mIGhleCwgYnl0ZXMsIGJ5dGVzX2xlLCBmaWVsZHMsIG9yIGludCcpCisgICAgICAgIGlmIGhleCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGhleCA9IGhleC5yZXBsYWNlKCd1cm46JywgJycpLnJlcGxhY2UoJ3V1aWQ6JywgJycpCisgICAgICAgICAgICBoZXggPSBoZXguc3RyaXAoJ3t9JykucmVwbGFjZSgnLScsICcnKQorICAgICAgICAgICAgaWYgbGVuKGhleCkgIT0gMzI6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignYmFkbHkgZm9ybWVkIGhleGFkZWNpbWFsIFVVSUQgc3RyaW5nJykKKyAgICAgICAgICAgIGludCA9IGxvbmcoaGV4LCAxNikKKyAgICAgICAgaWYgYnl0ZXNfbGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBsZW4oYnl0ZXNfbGUpICE9IDE2OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2J5dGVzX2xlIGlzIG5vdCBhIDE2LWNoYXIgc3RyaW5nJykKKyAgICAgICAgICAgIGJ5dGVzID0gKGJ5dGVzX2xlWzNdICsgYnl0ZXNfbGVbMl0gKyBieXRlc19sZVsxXSArIGJ5dGVzX2xlWzBdICsKKyAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX2xlWzVdICsgYnl0ZXNfbGVbNF0gKyBieXRlc19sZVs3XSArIGJ5dGVzX2xlWzZdICsKKyAgICAgICAgICAgICAgICAgICAgIGJ5dGVzX2xlWzg6XSkKKyAgICAgICAgaWYgYnl0ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBsZW4oYnl0ZXMpICE9IDE2OgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2J5dGVzIGlzIG5vdCBhIDE2LWNoYXIgc3RyaW5nJykKKyAgICAgICAgICAgIGludCA9IGxvbmcoKCclMDJ4JyoxNikgJSB0dXBsZShtYXAob3JkLCBieXRlcykpLCAxNikKKyAgICAgICAgaWYgZmllbGRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbGVuKGZpZWxkcykgIT0gNjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZHMgaXMgbm90IGEgNi10dXBsZScpCisgICAgICAgICAgICAodGltZV9sb3csIHRpbWVfbWlkLCB0aW1lX2hpX3ZlcnNpb24sCisgICAgICAgICAgICAgY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIGNsb2NrX3NlcV9sb3csIG5vZGUpID0gZmllbGRzCisgICAgICAgICAgICBpZiBub3QgMCA8PSB0aW1lX2xvdyA8IDE8PDMyTDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCAxIG91dCBvZiByYW5nZSAobmVlZCBhIDMyLWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgaWYgbm90IDAgPD0gdGltZV9taWQgPCAxPDwxNkw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgMiBvdXQgb2YgcmFuZ2UgKG5lZWQgYSAxNi1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IHRpbWVfaGlfdmVyc2lvbiA8IDE8PDE2TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCAzIG91dCBvZiByYW5nZSAobmVlZCBhIDE2LWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgaWYgbm90IDAgPD0gY2xvY2tfc2VxX2hpX3ZhcmlhbnQgPCAxPDw4TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCA0IG91dCBvZiByYW5nZSAobmVlZCBhbiA4LWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgaWYgbm90IDAgPD0gY2xvY2tfc2VxX2xvdyA8IDE8PDhMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDUgb3V0IG9mIHJhbmdlIChuZWVkIGFuIDgtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSBub2RlIDwgMTw8NDhMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDYgb3V0IG9mIHJhbmdlIChuZWVkIGEgNDgtYml0IHZhbHVlKScpCisgICAgICAgICAgICBjbG9ja19zZXEgPSAoY2xvY2tfc2VxX2hpX3ZhcmlhbnQgPDwgOEwpIHwgY2xvY2tfc2VxX2xvdworICAgICAgICAgICAgaW50ID0gKCh0aW1lX2xvdyA8PCA5NkwpIHwgKHRpbWVfbWlkIDw8IDgwTCkgfAorICAgICAgICAgICAgICAgICAgICh0aW1lX2hpX3ZlcnNpb24gPDwgNjRMKSB8IChjbG9ja19zZXEgPDwgNDhMKSB8IG5vZGUpCisgICAgICAgIGlmIGludCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IGludCA8IDE8PDEyOEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaW50IGlzIG91dCBvZiByYW5nZSAobmVlZCBhIDEyOC1iaXQgdmFsdWUpJykKKyAgICAgICAgaWYgdmVyc2lvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCAxIDw9IHZlcnNpb24gPD0gNToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdpbGxlZ2FsIHZlcnNpb24gbnVtYmVyJykKKyAgICAgICAgICAgICMgU2V0IHRoZSB2YXJpYW50IHRvIFJGQyA0MTIyLgorICAgICAgICAgICAgaW50ICY9IH4oMHhjMDAwIDw8IDQ4TCkKKyAgICAgICAgICAgIGludCB8PSAweDgwMDAgPDwgNDhMCisgICAgICAgICAgICAjIFNldCB0aGUgdmVyc2lvbiBudW1iZXIuCisgICAgICAgICAgICBpbnQgJj0gfigweGYwMDAgPDwgNjRMKQorICAgICAgICAgICAgaW50IHw9IHZlcnNpb24gPDwgNzZMCisgICAgICAgIHNlbGYuX19kaWN0X19bJ2ludCddID0gaW50CisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVVSUQpOgorICAgICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmludCwgb3RoZXIuaW50KQorICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGhhc2goc2VsZi5pbnQpCisKKyAgICBkZWYgX19pbnRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW50CisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAnVVVJRCglciknICUgc3RyKHNlbGYpCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ1VVSUQgb2JqZWN0cyBhcmUgaW1tdXRhYmxlJykKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICBoZXggPSAnJTAzMngnICUgc2VsZi5pbnQKKyAgICAgICAgcmV0dXJuICclcy0lcy0lcy0lcy0lcycgJSAoCisgICAgICAgICAgICBoZXhbOjhdLCBoZXhbODoxMl0sIGhleFsxMjoxNl0sIGhleFsxNjoyMF0sIGhleFsyMDpdKQorCisgICAgZGVmIGdldF9ieXRlcyhzZWxmKToKKyAgICAgICAgYnl0ZXMgPSAnJworICAgICAgICBmb3Igc2hpZnQgaW4gcmFuZ2UoMCwgMTI4LCA4KToKKyAgICAgICAgICAgIGJ5dGVzID0gY2hyKChzZWxmLmludCA+PiBzaGlmdCkgJiAweGZmKSArIGJ5dGVzCisgICAgICAgIHJldHVybiBieXRlcworCisgICAgYnl0ZXMgPSBwcm9wZXJ0eShnZXRfYnl0ZXMpCisKKyAgICBkZWYgZ2V0X2J5dGVzX2xlKHNlbGYpOgorICAgICAgICBieXRlcyA9IHNlbGYuYnl0ZXMKKyAgICAgICAgcmV0dXJuIChieXRlc1szXSArIGJ5dGVzWzJdICsgYnl0ZXNbMV0gKyBieXRlc1swXSArCisgICAgICAgICAgICAgICAgYnl0ZXNbNV0gKyBieXRlc1s0XSArIGJ5dGVzWzddICsgYnl0ZXNbNl0gKyBieXRlc1s4Ol0pCisKKyAgICBieXRlc19sZSA9IHByb3BlcnR5KGdldF9ieXRlc19sZSkKKworICAgIGRlZiBnZXRfZmllbGRzKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYudGltZV9sb3csIHNlbGYudGltZV9taWQsIHNlbGYudGltZV9oaV92ZXJzaW9uLAorICAgICAgICAgICAgICAgIHNlbGYuY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIHNlbGYuY2xvY2tfc2VxX2xvdywgc2VsZi5ub2RlKQorCisgICAgZmllbGRzID0gcHJvcGVydHkoZ2V0X2ZpZWxkcykKKworICAgIGRlZiBnZXRfdGltZV9sb3coc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludCA+PiA5NkwKKworICAgIHRpbWVfbG93ID0gcHJvcGVydHkoZ2V0X3RpbWVfbG93KQorCisgICAgZGVmIGdldF90aW1lX21pZChzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmludCA+PiA4MEwpICYgMHhmZmZmCisKKyAgICB0aW1lX21pZCA9IHByb3BlcnR5KGdldF90aW1lX21pZCkKKworICAgIGRlZiBnZXRfdGltZV9oaV92ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDY0TCkgJiAweGZmZmYKKworICAgIHRpbWVfaGlfdmVyc2lvbiA9IHByb3BlcnR5KGdldF90aW1lX2hpX3ZlcnNpb24pCisKKyAgICBkZWYgZ2V0X2Nsb2NrX3NlcV9oaV92YXJpYW50KHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDU2TCkgJiAweGZmCisKKyAgICBjbG9ja19zZXFfaGlfdmFyaWFudCA9IHByb3BlcnR5KGdldF9jbG9ja19zZXFfaGlfdmFyaWFudCkKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxX2xvdyhzZWxmKToKKyAgICAgICAgcmV0dXJuIChzZWxmLmludCA+PiA0OEwpICYgMHhmZgorCisgICAgY2xvY2tfc2VxX2xvdyA9IHByb3BlcnR5KGdldF9jbG9ja19zZXFfbG93KQorCisgICAgZGVmIGdldF90aW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gKCgoc2VsZi50aW1lX2hpX3ZlcnNpb24gJiAweDBmZmZMKSA8PCA0OEwpIHwKKyAgICAgICAgICAgICAgICAoc2VsZi50aW1lX21pZCA8PCAzMkwpIHwgc2VsZi50aW1lX2xvdykKKworICAgIHRpbWUgPSBwcm9wZXJ0eShnZXRfdGltZSkKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxKHNlbGYpOgorICAgICAgICByZXR1cm4gKCgoc2VsZi5jbG9ja19zZXFfaGlfdmFyaWFudCAmIDB4M2ZMKSA8PCA4TCkgfAorICAgICAgICAgICAgICAgIHNlbGYuY2xvY2tfc2VxX2xvdykKKworICAgIGNsb2NrX3NlcSA9IHByb3BlcnR5KGdldF9jbG9ja19zZXEpCisKKyAgICBkZWYgZ2V0X25vZGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludCAmIDB4ZmZmZmZmZmZmZmZmCisKKyAgICBub2RlID0gcHJvcGVydHkoZ2V0X25vZGUpCisKKyAgICBkZWYgZ2V0X2hleChzZWxmKToKKyAgICAgICAgcmV0dXJuICclMDMyeCcgJSBzZWxmLmludAorCisgICAgaGV4ID0gcHJvcGVydHkoZ2V0X2hleCkKKworICAgIGRlZiBnZXRfdXJuKHNlbGYpOgorICAgICAgICByZXR1cm4gJ3Vybjp1dWlkOicgKyBzdHIoc2VsZikKKworICAgIHVybiA9IHByb3BlcnR5KGdldF91cm4pCisKKyAgICBkZWYgZ2V0X3ZhcmlhbnQoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmludCAmICgweDgwMDAgPDwgNDhMKToKKyAgICAgICAgICAgIHJldHVybiBSRVNFUlZFRF9OQ1MKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5pbnQgJiAoMHg0MDAwIDw8IDQ4TCk6CisgICAgICAgICAgICByZXR1cm4gUkZDXzQxMjIKKyAgICAgICAgZWxpZiBub3Qgc2VsZi5pbnQgJiAoMHgyMDAwIDw8IDQ4TCk6CisgICAgICAgICAgICByZXR1cm4gUkVTRVJWRURfTUlDUk9TT0ZUCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gUkVTRVJWRURfRlVUVVJFCisKKyAgICB2YXJpYW50ID0gcHJvcGVydHkoZ2V0X3ZhcmlhbnQpCisKKyAgICBkZWYgZ2V0X3ZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGhlIHZlcnNpb24gYml0cyBhcmUgb25seSBtZWFuaW5nZnVsIGZvciBSRkMgNDEyMiBVVUlEcy4KKyAgICAgICAgaWYgc2VsZi52YXJpYW50ID09IFJGQ180MTIyOgorICAgICAgICAgICAgcmV0dXJuIGludCgoc2VsZi5pbnQgPj4gNzZMKSAmIDB4ZikKKworICAgIHZlcnNpb24gPSBwcm9wZXJ0eShnZXRfdmVyc2lvbikKKworZGVmIF9maW5kX21hYyhjb21tYW5kLCBhcmdzLCBod19pZGVudGlmaWVycywgZ2V0X2luZGV4KToKKyAgICBpbXBvcnQgb3MKKyAgICBmb3IgZGlyIGluIFsnJywgJy9zYmluLycsICcvdXNyL3NiaW4nXToKKyAgICAgICAgZXhlY3V0YWJsZSA9IG9zLnBhdGguam9pbihkaXIsIGNvbW1hbmQpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhleGVjdXRhYmxlKToKKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBMQ19BTEwgdG8gZ2V0IEVuZ2xpc2ggb3V0cHV0LCAyPi9kZXYvbnVsbCB0bworICAgICAgICAgICAgIyBwcmV2ZW50IG91dHB1dCBvbiBzdGRlcnIKKyAgICAgICAgICAgIGNtZCA9ICdMQ19BTEw9QyAlcyAlcyAyPi9kZXYvbnVsbCcgJSAoZXhlY3V0YWJsZSwgYXJncykKKyAgICAgICAgICAgIHdpdGggb3MucG9wZW4oY21kKSBhcyBwaXBlOgorICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIHBpcGU6CisgICAgICAgICAgICAgICAgICAgIHdvcmRzID0gbGluZS5sb3dlcigpLnNwbGl0KCkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHdvcmRzKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiB3b3Jkc1tpXSBpbiBod19pZGVudGlmaWVyczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1tnZXRfaW5kZXgoaSldLnJlcGxhY2UoJzonLCAnJyksIDE2KQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgcmV0dXJuIE5vbmUKKworZGVmIF9pZmNvbmZpZ19nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFVuaXggYnkgcnVubmluZyBpZmNvbmZpZy4iIiIKKworICAgICMgVGhpcyB3b3JrcyBvbiBMaW51eCAoJycgb3IgJy1hJyksIFRydTY0ICgnLWF2JyksIGJ1dCBub3QgYWxsIFVuaXhlcy4KKyAgICBmb3IgYXJncyBpbiAoJycsICctYScsICctYXYnKToKKyAgICAgICAgbWFjID0gX2ZpbmRfbWFjKCdpZmNvbmZpZycsIGFyZ3MsIFsnaHdhZGRyJywgJ2V0aGVyJ10sIGxhbWJkYSBpOiBpKzEpCisgICAgICAgIGlmIG1hYzoKKyAgICAgICAgICAgIHJldHVybiBtYWMKKworICAgIGltcG9ydCBzb2NrZXQKKyAgICBpcF9hZGRyID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisKKyAgICAjIFRyeSBnZXR0aW5nIHRoZSBNQUMgYWRkciBmcm9tIGFycCBiYXNlZCBvbiBvdXIgSVAgYWRkcmVzcyAoU29sYXJpcykuCisgICAgbWFjID0gX2ZpbmRfbWFjKCdhcnAnLCAnLWFuJywgW2lwX2FkZHJdLCBsYW1iZGEgaTogLTEpCisgICAgaWYgbWFjOgorICAgICAgICByZXR1cm4gbWFjCisKKyAgICAjIFRoaXMgbWlnaHQgd29yayBvbiBIUC1VWC4KKyAgICBtYWMgPSBfZmluZF9tYWMoJ2xhbnNjYW4nLCAnLWFpJywgWydsYW4wJ10sIGxhbWJkYSBpOiAwKQorICAgIGlmIG1hYzoKKyAgICAgICAgcmV0dXJuIG1hYworCisgICAgcmV0dXJuIE5vbmUKKworZGVmIF9pcGNvbmZpZ19nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFdpbmRvd3MgYnkgcnVubmluZyBpcGNvbmZpZy5leGUuIiIiCisgICAgaW1wb3J0IG9zLCByZQorICAgIGRpcnMgPSBbJycsIHInYzpcd2luZG93c1xzeXN0ZW0zMicsIHInYzpcd2lubnRcc3lzdGVtMzInXQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IGN0eXBlcworICAgICAgICBidWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoMzAwKQorICAgICAgICBjdHlwZXMud2luZGxsLmtlcm5lbDMyLkdldFN5c3RlbURpcmVjdG9yeUEoYnVmZmVyLCAzMDApCisgICAgICAgIGRpcnMuaW5zZXJ0KDAsIGJ1ZmZlci52YWx1ZS5kZWNvZGUoJ21iY3MnKSkKKyAgICBleGNlcHQ6CisgICAgICAgIHBhc3MKKyAgICBmb3IgZGlyIGluIGRpcnM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpcGUgPSBvcy5wb3Blbihvcy5wYXRoLmpvaW4oZGlyLCAnaXBjb25maWcnKSArICcgL2FsbCcpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHBpcGU6CisgICAgICAgICAgICAgICAgdmFsdWUgPSBsaW5lLnNwbGl0KCc6JylbLTFdLnN0cmlwKCkubG93ZXIoKQorICAgICAgICAgICAgICAgIGlmIHJlLm1hdGNoKCcoWzAtOWEtZl1bMC05YS1mXS0pezV9WzAtOWEtZl1bMC05YS1mXScsIHZhbHVlKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludCh2YWx1ZS5yZXBsYWNlKCctJywgJycpLCAxNikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHBpcGUuY2xvc2UoKQorCitkZWYgX25ldGJpb3NfZ2V0bm9kZSgpOgorICAgICIiIkdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvbiBXaW5kb3dzIHVzaW5nIE5ldEJJT1MgY2FsbHMuCisgICAgU2VlIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvMTE4NjIzIGZvciBkZXRhaWxzLiIiIgorICAgIGltcG9ydCB3aW4zMnduZXQsIG5ldGJpb3MKKyAgICBuY2IgPSBuZXRiaW9zLk5DQigpCisgICAgbmNiLkNvbW1hbmQgPSBuZXRiaW9zLk5DQkVOVU0KKyAgICBuY2IuQnVmZmVyID0gYWRhcHRlcnMgPSBuZXRiaW9zLkxBTkFfRU5VTSgpCisgICAgYWRhcHRlcnMuX3BhY2soKQorICAgIGlmIHdpbjMyd25ldC5OZXRiaW9zKG5jYikgIT0gMDoKKyAgICAgICAgcmV0dXJuCisgICAgYWRhcHRlcnMuX3VucGFjaygpCisgICAgZm9yIGkgaW4gcmFuZ2UoYWRhcHRlcnMubGVuZ3RoKToKKyAgICAgICAgbmNiLlJlc2V0KCkKKyAgICAgICAgbmNiLkNvbW1hbmQgPSBuZXRiaW9zLk5DQlJFU0VUCisgICAgICAgIG5jYi5MYW5hX251bSA9IG9yZChhZGFwdGVycy5sYW5hW2ldKQorICAgICAgICBpZiB3aW4zMnduZXQuTmV0YmlvcyhuY2IpICE9IDA6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBuY2IuUmVzZXQoKQorICAgICAgICBuY2IuQ29tbWFuZCA9IG5ldGJpb3MuTkNCQVNUQVQKKyAgICAgICAgbmNiLkxhbmFfbnVtID0gb3JkKGFkYXB0ZXJzLmxhbmFbaV0pCisgICAgICAgIG5jYi5DYWxsbmFtZSA9ICcqJy5sanVzdCgxNikKKyAgICAgICAgbmNiLkJ1ZmZlciA9IHN0YXR1cyA9IG5ldGJpb3MuQURBUFRFUl9TVEFUVVMoKQorICAgICAgICBpZiB3aW4zMnduZXQuTmV0YmlvcyhuY2IpICE9IDA6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBzdGF0dXMuX3VucGFjaygpCisgICAgICAgIGJ5dGVzID0gbWFwKG9yZCwgc3RhdHVzLmFkYXB0ZXJfYWRkcmVzcykKKyAgICAgICAgcmV0dXJuICgoYnl0ZXNbMF08PDQwTCkgKyAoYnl0ZXNbMV08PDMyTCkgKyAoYnl0ZXNbMl08PDI0TCkgKworICAgICAgICAgICAgICAgIChieXRlc1szXTw8MTZMKSArIChieXRlc1s0XTw8OEwpICsgYnl0ZXNbNV0pCisKKyMgVGhhbmtzIHRvIFRob21hcyBIZWxsZXIgZm9yIGN0eXBlcyBhbmQgZm9yIGhpcyBoZWxwIHdpdGggaXRzIHVzZSBoZXJlLgorCisjIElmIGN0eXBlcyBpcyBhdmFpbGFibGUsIHVzZSBpdCB0byBmaW5kIHN5c3RlbSByb3V0aW5lcyBmb3IgVVVJRCBnZW5lcmF0aW9uLgorX3V1aWRfZ2VuZXJhdGVfcmFuZG9tID0gX3V1aWRfZ2VuZXJhdGVfdGltZSA9IF9VdWlkQ3JlYXRlID0gTm9uZQordHJ5OgorICAgIGltcG9ydCBjdHlwZXMsIGN0eXBlcy51dGlsCisKKyAgICAjIFRoZSB1dWlkX2dlbmVyYXRlXyogcm91dGluZXMgYXJlIHByb3ZpZGVkIGJ5IGxpYnV1aWQgb24gYXQgbGVhc3QKKyAgICAjIExpbnV4IGFuZCBGcmVlQlNELCBhbmQgcHJvdmlkZWQgYnkgbGliYyBvbiBNYWMgT1MgWC4KKyAgICBmb3IgbGlibmFtZSBpbiBbJ3V1aWQnLCAnYyddOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaWIgPSBjdHlwZXMuQ0RMTChjdHlwZXMudXRpbC5maW5kX2xpYnJhcnkobGlibmFtZSkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGhhc2F0dHIobGliLCAndXVpZF9nZW5lcmF0ZV9yYW5kb20nKToKKyAgICAgICAgICAgIF91dWlkX2dlbmVyYXRlX3JhbmRvbSA9IGxpYi51dWlkX2dlbmVyYXRlX3JhbmRvbQorICAgICAgICBpZiBoYXNhdHRyKGxpYiwgJ3V1aWRfZ2VuZXJhdGVfdGltZScpOgorICAgICAgICAgICAgX3V1aWRfZ2VuZXJhdGVfdGltZSA9IGxpYi51dWlkX2dlbmVyYXRlX3RpbWUKKworICAgICMgVGhlIHV1aWRfZ2VuZXJhdGVfKiBmdW5jdGlvbnMgYXJlIGJyb2tlbiBvbiBNYWNPUyBYIDEwLjUsIGFzIG5vdGVkCisgICAgIyBpbiBpc3N1ZSAjODYyMSB0aGUgZnVuY3Rpb24gZ2VuZXJhdGVzIHRoZSBzYW1lIHNlcXVlbmNlIG9mIHZhbHVlcworICAgICMgaW4gdGhlIHBhcmVudCBwcm9jZXNzIGFuZCBhbGwgY2hpbGRyZW4gY3JlYXRlZCB1c2luZyBmb3JrICh1bmxlc3MKKyAgICAjIHRob3NlIGNoaWxkcmVuIHVzZSBleGVjIGFzIHdlbGwpLgorICAgICMKKyAgICAjIEFzc3VtZSB0aGF0IHRoZSB1dWlkX2dlbmVyYXRlIGZ1bmN0aW9ucyBhcmUgYnJva2VuIGZyb20gMTAuNSBvbndhcmQsCisgICAgIyB0aGUgdGVzdCBjYW4gYmUgYWRqdXN0ZWQgd2hlbiBhIGxhdGVyIHZlcnNpb24gaXMgZml4ZWQuCisgICAgaW1wb3J0IHN5cworICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIGludChvcy51bmFtZSgpWzJdLnNwbGl0KCcuJylbMF0pID49IDk6CisgICAgICAgICAgICBfdXVpZF9nZW5lcmF0ZV9yYW5kb20gPSBfdXVpZF9nZW5lcmF0ZV90aW1lID0gTm9uZQorCisgICAgIyBPbiBXaW5kb3dzIHByaW9yIHRvIDIwMDAsIFV1aWRDcmVhdGUgZ2l2ZXMgYSBVVUlEIGNvbnRhaW5pbmcgdGhlCisgICAgIyBoYXJkd2FyZSBhZGRyZXNzLiAgT24gV2luZG93cyAyMDAwIGFuZCBsYXRlciwgVXVpZENyZWF0ZSBtYWtlcyBhCisgICAgIyByYW5kb20gVVVJRCBhbmQgVXVpZENyZWF0ZVNlcXVlbnRpYWwgZ2l2ZXMgYSBVVUlEIGNvbnRhaW5pbmcgdGhlCisgICAgIyBoYXJkd2FyZSBhZGRyZXNzLiAgVGhlc2Ugcm91dGluZXMgYXJlIHByb3ZpZGVkIGJ5IHRoZSBSUEMgcnVudGltZS4KKyAgICAjIE5PVEU6ICBhdCBsZWFzdCBvbiBUaW0ncyBXaW5YUCBQcm8gU1AyIGRlc2t0b3AgYm94LCB3aGlsZSB0aGUgbGFzdAorICAgICMgNiBieXRlcyByZXR1cm5lZCBieSBVdWlkQ3JlYXRlU2VxdWVudGlhbCBhcmUgZml4ZWQsIHRoZXkgZG9uJ3QgYXBwZWFyCisgICAgIyB0byBiZWFyIGFueSByZWxhdGlvbnNoaXAgdG8gdGhlIE1BQyBhZGRyZXNzIG9mIGFueSBuZXR3b3JrIGRldmljZQorICAgICMgb24gdGhlIGJveC4KKyAgICB0cnk6CisgICAgICAgIGxpYiA9IGN0eXBlcy53aW5kbGwucnBjcnQ0CisgICAgZXhjZXB0OgorICAgICAgICBsaWIgPSBOb25lCisgICAgX1V1aWRDcmVhdGUgPSBnZXRhdHRyKGxpYiwgJ1V1aWRDcmVhdGVTZXF1ZW50aWFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0YXR0cihsaWIsICdVdWlkQ3JlYXRlJywgTm9uZSkpCitleGNlcHQ6CisgICAgcGFzcworCitkZWYgX3VuaXhkbGxfZ2V0bm9kZSgpOgorICAgICIiIkdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvbiBVbml4IHVzaW5nIGN0eXBlcy4iIiIKKyAgICBfYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDE2KQorICAgIF91dWlkX2dlbmVyYXRlX3RpbWUoX2J1ZmZlcikKKyAgICByZXR1cm4gVVVJRChieXRlcz1fYnVmZmVyLnJhdykubm9kZQorCitkZWYgX3dpbmRsbF9nZXRub2RlKCk6CisgICAgIiIiR2V0IHRoZSBoYXJkd2FyZSBhZGRyZXNzIG9uIFdpbmRvd3MgdXNpbmcgY3R5cGVzLiIiIgorICAgIF9idWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoMTYpCisgICAgaWYgX1V1aWRDcmVhdGUoX2J1ZmZlcikgPT0gMDoKKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9X2J1ZmZlci5yYXcpLm5vZGUKKworZGVmIF9yYW5kb21fZ2V0bm9kZSgpOgorICAgICIiIkdldCBhIHJhbmRvbSBub2RlIElELCB3aXRoIGVpZ2h0aCBiaXQgc2V0IGFzIHN1Z2dlc3RlZCBieSBSRkMgNDEyMi4iIiIKKyAgICBpbXBvcnQgcmFuZG9tCisgICAgcmV0dXJuIHJhbmRvbS5yYW5kcmFuZ2UoMCwgMTw8NDhMKSB8IDB4MDEwMDAwMDAwMDAwTAorCitfbm9kZSA9IE5vbmUKKworZGVmIGdldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgYXMgYSA0OC1iaXQgcG9zaXRpdmUgaW50ZWdlci4KKworICAgIFRoZSBmaXJzdCB0aW1lIHRoaXMgcnVucywgaXQgbWF5IGxhdW5jaCBhIHNlcGFyYXRlIHByb2dyYW0sIHdoaWNoIGNvdWxkCisgICAgYmUgcXVpdGUgc2xvdy4gIElmIGFsbCBhdHRlbXB0cyB0byBvYnRhaW4gdGhlIGhhcmR3YXJlIGFkZHJlc3MgZmFpbCwgd2UKKyAgICBjaG9vc2UgYSByYW5kb20gNDgtYml0IG51bWJlciB3aXRoIGl0cyBlaWdodGggYml0IHNldCB0byAxIGFzIHJlY29tbWVuZGVkCisgICAgaW4gUkZDIDQxMjIuCisgICAgIiIiCisKKyAgICBnbG9iYWwgX25vZGUKKyAgICBpZiBfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIF9ub2RlCisKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgIGdldHRlcnMgPSBbX3dpbmRsbF9nZXRub2RlLCBfbmV0Ymlvc19nZXRub2RlLCBfaXBjb25maWdfZ2V0bm9kZV0KKyAgICBlbHNlOgorICAgICAgICBnZXR0ZXJzID0gW191bml4ZGxsX2dldG5vZGUsIF9pZmNvbmZpZ19nZXRub2RlXQorCisgICAgZm9yIGdldHRlciBpbiBnZXR0ZXJzICsgW19yYW5kb21fZ2V0bm9kZV06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9ub2RlID0gZ2V0dGVyKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgX25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX25vZGUKKworX2xhc3RfdGltZXN0YW1wID0gTm9uZQorCitkZWYgdXVpZDEobm9kZT1Ob25lLCBjbG9ja19zZXE9Tm9uZSk6CisgICAgIiIiR2VuZXJhdGUgYSBVVUlEIGZyb20gYSBob3N0IElELCBzZXF1ZW5jZSBudW1iZXIsIGFuZCB0aGUgY3VycmVudCB0aW1lLgorICAgIElmICdub2RlJyBpcyBub3QgZ2l2ZW4sIGdldG5vZGUoKSBpcyB1c2VkIHRvIG9idGFpbiB0aGUgaGFyZHdhcmUKKyAgICBhZGRyZXNzLiAgSWYgJ2Nsb2NrX3NlcScgaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlIHNlcXVlbmNlIG51bWJlcjsKKyAgICBvdGhlcndpc2UgYSByYW5kb20gMTQtYml0IHNlcXVlbmNlIG51bWJlciBpcyBjaG9zZW4uIiIiCisKKyAgICAjIFdoZW4gdGhlIHN5c3RlbSBwcm92aWRlcyBhIHZlcnNpb24tMSBVVUlEIGdlbmVyYXRvciwgdXNlIGl0IChidXQgZG9uJ3QKKyAgICAjIHVzZSBVdWlkQ3JlYXRlIGhlcmUgYmVjYXVzZSBpdHMgVVVJRHMgZG9uJ3QgY29uZm9ybSB0byBSRkMgNDEyMikuCisgICAgaWYgX3V1aWRfZ2VuZXJhdGVfdGltZSBhbmQgbm9kZSBpcyBjbG9ja19zZXEgaXMgTm9uZToKKyAgICAgICAgX2J1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigxNikKKyAgICAgICAgX3V1aWRfZ2VuZXJhdGVfdGltZShfYnVmZmVyKQorICAgICAgICByZXR1cm4gVVVJRChieXRlcz1fYnVmZmVyLnJhdykKKworICAgIGdsb2JhbCBfbGFzdF90aW1lc3RhbXAKKyAgICBpbXBvcnQgdGltZQorICAgIG5hbm9zZWNvbmRzID0gaW50KHRpbWUudGltZSgpICogMWU5KQorICAgICMgMHgwMWIyMWRkMjEzODE0MDAwIGlzIHRoZSBudW1iZXIgb2YgMTAwLW5zIGludGVydmFscyBiZXR3ZWVuIHRoZQorICAgICMgVVVJRCBlcG9jaCAxNTgyLTEwLTE1IDAwOjAwOjAwIGFuZCB0aGUgVW5peCBlcG9jaCAxOTcwLTAxLTAxIDAwOjAwOjAwLgorICAgIHRpbWVzdGFtcCA9IGludChuYW5vc2Vjb25kcy8vMTAwKSArIDB4MDFiMjFkZDIxMzgxNDAwMEwKKyAgICBpZiBfbGFzdF90aW1lc3RhbXAgaXMgbm90IE5vbmUgYW5kIHRpbWVzdGFtcCA8PSBfbGFzdF90aW1lc3RhbXA6CisgICAgICAgIHRpbWVzdGFtcCA9IF9sYXN0X3RpbWVzdGFtcCArIDEKKyAgICBfbGFzdF90aW1lc3RhbXAgPSB0aW1lc3RhbXAKKyAgICBpZiBjbG9ja19zZXEgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHJhbmRvbQorICAgICAgICBjbG9ja19zZXEgPSByYW5kb20ucmFuZHJhbmdlKDE8PDE0TCkgIyBpbnN0ZWFkIG9mIHN0YWJsZSBzdG9yYWdlCisgICAgdGltZV9sb3cgPSB0aW1lc3RhbXAgJiAweGZmZmZmZmZmTAorICAgIHRpbWVfbWlkID0gKHRpbWVzdGFtcCA+PiAzMkwpICYgMHhmZmZmTAorICAgIHRpbWVfaGlfdmVyc2lvbiA9ICh0aW1lc3RhbXAgPj4gNDhMKSAmIDB4MGZmZkwKKyAgICBjbG9ja19zZXFfbG93ID0gY2xvY2tfc2VxICYgMHhmZkwKKyAgICBjbG9ja19zZXFfaGlfdmFyaWFudCA9IChjbG9ja19zZXEgPj4gOEwpICYgMHgzZkwKKyAgICBpZiBub2RlIGlzIE5vbmU6CisgICAgICAgIG5vZGUgPSBnZXRub2RlKCkKKyAgICByZXR1cm4gVVVJRChmaWVsZHM9KHRpbWVfbG93LCB0aW1lX21pZCwgdGltZV9oaV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIGNsb2NrX3NlcV9sb3csIG5vZGUpLCB2ZXJzaW9uPTEpCisKK2RlZiB1dWlkMyhuYW1lc3BhY2UsIG5hbWUpOgorICAgICIiIkdlbmVyYXRlIGEgVVVJRCBmcm9tIHRoZSBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUuIiIiCisgICAgZnJvbSBoYXNobGliIGltcG9ydCBtZDUKKyAgICBoYXNoID0gbWQ1KG5hbWVzcGFjZS5ieXRlcyArIG5hbWUpLmRpZ2VzdCgpCisgICAgcmV0dXJuIFVVSUQoYnl0ZXM9aGFzaFs6MTZdLCB2ZXJzaW9uPTMpCisKK2RlZiB1dWlkNCgpOgorICAgICIiIkdlbmVyYXRlIGEgcmFuZG9tIFVVSUQuIiIiCisKKyAgICAjIFdoZW4gdGhlIHN5c3RlbSBwcm92aWRlcyBhIHZlcnNpb24tNCBVVUlEIGdlbmVyYXRvciwgdXNlIGl0LgorICAgIGlmIF91dWlkX2dlbmVyYXRlX3JhbmRvbToKKyAgICAgICAgX2J1ZmZlciA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcigxNikKKyAgICAgICAgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tKF9idWZmZXIpCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KQorCisgICAgIyBPdGhlcndpc2UsIGdldCByYW5kb21uZXNzIGZyb20gdXJhbmRvbSBvciB0aGUgJ3JhbmRvbScgbW9kdWxlLgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIHJldHVybiBVVUlEKGJ5dGVzPW9zLnVyYW5kb20oMTYpLCB2ZXJzaW9uPTQpCisgICAgZXhjZXB0OgorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIGJ5dGVzID0gW2NocihyYW5kb20ucmFuZHJhbmdlKDI1NikpIGZvciBpIGluIHJhbmdlKDE2KV0KKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9Ynl0ZXMsIHZlcnNpb249NCkKKworZGVmIHV1aWQ1KG5hbWVzcGFjZSwgbmFtZSk6CisgICAgIiIiR2VuZXJhdGUgYSBVVUlEIGZyb20gdGhlIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lLiIiIgorICAgIGZyb20gaGFzaGxpYiBpbXBvcnQgc2hhMQorICAgIGhhc2ggPSBzaGExKG5hbWVzcGFjZS5ieXRlcyArIG5hbWUpLmRpZ2VzdCgpCisgICAgcmV0dXJuIFVVSUQoYnl0ZXM9aGFzaFs6MTZdLCB2ZXJzaW9uPTUpCisKKyMgVGhlIGZvbGxvd2luZyBzdGFuZGFyZCBVVUlEcyBhcmUgZm9yIHVzZSB3aXRoIHV1aWQzKCkgb3IgdXVpZDUoKS4KKworTkFNRVNQQUNFX0ROUyA9IFVVSUQoJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcpCitOQU1FU1BBQ0VfVVJMID0gVVVJRCgnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JykKK05BTUVTUEFDRV9PSUQgPSBVVUlEKCc2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnKQorTkFNRVNQQUNFX1g1MDAgPSBVVUlEKCc2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91dWlkLnB5YyBiL2xpYi9weXRob24yLjcvdXVpZC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NjNiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXVpZC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy91dWlkLnB5byBiL2xpYi9weXRob24yLjcvdXVpZC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY4NjNiNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvdXVpZC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93YXJuaW5ncy5weSBiL2xpYi9weXRob24yLjcvd2FybmluZ3MucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhiNzBhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2FybmluZ3MucHkKQEAgLTAsMCArMSw0MDAgQEAKKyIiIlB5dGhvbiBwYXJ0IG9mIHRoZSB3YXJuaW5ncyBzdWJzeXN0ZW0uIiIiCisKKyMgTm90ZTogZnVuY3Rpb24gbGV2ZWwgaW1wb3J0cyBzaG91bGQgKm5vdCogYmUgdXNlZAorIyBpbiB0aGlzIG1vZHVsZSBhcyBpdCBtYXkgY2F1c2UgaW1wb3J0IGxvY2sgZGVhZGxvY2suCisjIFNlZSBidWcgNjgzNjU4LgoraW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IHN5cworaW1wb3J0IHR5cGVzCisKK19fYWxsX18gPSBbIndhcm4iLCAic2hvd3dhcm5pbmciLCAiZm9ybWF0d2FybmluZyIsICJmaWx0ZXJ3YXJuaW5ncyIsCisgICAgICAgICAgICJyZXNldHdhcm5pbmdzIiwgImNhdGNoX3dhcm5pbmdzIl0KKworCitkZWYgd2FybnB5M2sobWVzc2FnZSwgY2F0ZWdvcnk9Tm9uZSwgc3RhY2tsZXZlbD0xKToKKyAgICAiIiJJc3N1ZSBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yIFB5dGhvbiAzLnggcmVsYXRlZCBjaGFuZ2VzLgorCisgICAgV2FybmluZ3MgYXJlIG9taXR0ZWQgdW5sZXNzIFB5dGhvbiBpcyBzdGFydGVkIHdpdGggdGhlIC0zIG9wdGlvbi4KKyAgICAiIiIKKyAgICBpZiBzeXMucHkza3dhcm5pbmc6CisgICAgICAgIGlmIGNhdGVnb3J5IGlzIE5vbmU6CisgICAgICAgICAgICBjYXRlZ29yeSA9IERlcHJlY2F0aW9uV2FybmluZworICAgICAgICB3YXJuKG1lc3NhZ2UsIGNhdGVnb3J5LCBzdGFja2xldmVsKzEpCisKK2RlZiBfc2hvd193YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsIGxpbmU9Tm9uZSk6CisgICAgIiIiSG9vayB0byB3cml0ZSBhIHdhcm5pbmcgdG8gYSBmaWxlOyByZXBsYWNlIGlmIHlvdSBsaWtlLiIiIgorICAgIGlmIGZpbGUgaXMgTm9uZToKKyAgICAgICAgZmlsZSA9IHN5cy5zdGRlcnIKKyAgICB0cnk6CisgICAgICAgIGZpbGUud3JpdGUoZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywgbGluZSkpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MgIyB0aGUgZmlsZSAocHJvYmFibHkgc3RkZXJyKSBpcyBpbnZhbGlkIC0gdGhpcyB3YXJuaW5nIGdldHMgbG9zdC4KKyMgS2VlcCBhIHdvcmtpbmcgdmVyc2lvbiBhcm91bmQgaW4gY2FzZSB0aGUgZGVwcmVjYXRpb24gb2YgdGhlIG9sZCBBUEkgaXMKKyMgdHJpZ2dlcmVkLgorc2hvd3dhcm5pbmcgPSBfc2hvd193YXJuaW5nCisKK2RlZiBmb3JtYXR3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBsaW5lPU5vbmUpOgorICAgICIiIkZ1bmN0aW9uIHRvIGZvcm1hdCBhIHdhcm5pbmcgdGhlIHN0YW5kYXJkIHdheS4iIiIKKyAgICBzID0gICIlczolczogJXM6ICVzXG4iICUgKGZpbGVuYW1lLCBsaW5lbm8sIGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlKQorICAgIGxpbmUgPSBsaW5lY2FjaGUuZ2V0bGluZShmaWxlbmFtZSwgbGluZW5vKSBpZiBsaW5lIGlzIE5vbmUgZWxzZSBsaW5lCisgICAgaWYgbGluZToKKyAgICAgICAgbGluZSA9IGxpbmUuc3RyaXAoKQorICAgICAgICBzICs9ICIgICVzXG4iICUgbGluZQorICAgIHJldHVybiBzCisKK2RlZiBmaWx0ZXJ3YXJuaW5ncyhhY3Rpb24sIG1lc3NhZ2U9IiIsIGNhdGVnb3J5PVdhcm5pbmcsIG1vZHVsZT0iIiwgbGluZW5vPTAsCisgICAgICAgICAgICAgICAgICAgYXBwZW5kPTApOgorICAgICIiIkluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSBsaXN0IG9mIHdhcm5pbmdzIGZpbHRlcnMgKGF0IHRoZSBmcm9udCkuCisKKyAgICAnYWN0aW9uJyAtLSBvbmUgb2YgImVycm9yIiwgImlnbm9yZSIsICJhbHdheXMiLCAiZGVmYXVsdCIsICJtb2R1bGUiLAorICAgICAgICAgICAgICAgIG9yICJvbmNlIgorICAgICdtZXNzYWdlJyAtLSBhIHJlZ2V4IHRoYXQgdGhlIHdhcm5pbmcgbWVzc2FnZSBtdXN0IG1hdGNoCisgICAgJ2NhdGVnb3J5JyAtLSBhIGNsYXNzIHRoYXQgdGhlIHdhcm5pbmcgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCisgICAgJ21vZHVsZScgLS0gYSByZWdleCB0aGF0IHRoZSBtb2R1bGUgbmFtZSBtdXN0IG1hdGNoCisgICAgJ2xpbmVubycgLS0gYW4gaW50ZWdlciBsaW5lIG51bWJlciwgMCBtYXRjaGVzIGFsbCB3YXJuaW5ncworICAgICdhcHBlbmQnIC0tIGlmIHRydWUsIGFwcGVuZCB0byB0aGUgbGlzdCBvZiBmaWx0ZXJzCisgICAgIiIiCisgICAgaW1wb3J0IHJlCisgICAgYXNzZXJ0IGFjdGlvbiBpbiAoImVycm9yIiwgImlnbm9yZSIsICJhbHdheXMiLCAiZGVmYXVsdCIsICJtb2R1bGUiLAorICAgICAgICAgICAgICAgICAgICAgICJvbmNlIiksICJpbnZhbGlkIGFjdGlvbjogJXIiICUgKGFjdGlvbiwpCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UobWVzc2FnZSwgYmFzZXN0cmluZyksICJtZXNzYWdlIG11c3QgYmUgYSBzdHJpbmciCisgICAgYXNzZXJ0IGlzaW5zdGFuY2UoY2F0ZWdvcnksICh0eXBlLCB0eXBlcy5DbGFzc1R5cGUpKSwgXAorICAgICAgICAgICAiY2F0ZWdvcnkgbXVzdCBiZSBhIGNsYXNzIgorICAgIGFzc2VydCBpc3N1YmNsYXNzKGNhdGVnb3J5LCBXYXJuaW5nKSwgImNhdGVnb3J5IG11c3QgYmUgYSBXYXJuaW5nIHN1YmNsYXNzIgorICAgIGFzc2VydCBpc2luc3RhbmNlKG1vZHVsZSwgYmFzZXN0cmluZyksICJtb2R1bGUgbXVzdCBiZSBhIHN0cmluZyIKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShsaW5lbm8sIGludCkgYW5kIGxpbmVubyA+PSAwLCBcCisgICAgICAgICAgICJsaW5lbm8gbXVzdCBiZSBhbiBpbnQgPj0gMCIKKyAgICBpdGVtID0gKGFjdGlvbiwgcmUuY29tcGlsZShtZXNzYWdlLCByZS5JKSwgY2F0ZWdvcnksCisgICAgICAgICAgICByZS5jb21waWxlKG1vZHVsZSksIGxpbmVubykKKyAgICBpZiBhcHBlbmQ6CisgICAgICAgIGZpbHRlcnMuYXBwZW5kKGl0ZW0pCisgICAgZWxzZToKKyAgICAgICAgZmlsdGVycy5pbnNlcnQoMCwgaXRlbSkKKworZGVmIHNpbXBsZWZpbHRlcihhY3Rpb24sIGNhdGVnb3J5PVdhcm5pbmcsIGxpbmVubz0wLCBhcHBlbmQ9MCk6CisgICAgIiIiSW5zZXJ0IGEgc2ltcGxlIGVudHJ5IGludG8gdGhlIGxpc3Qgb2Ygd2FybmluZ3MgZmlsdGVycyAoYXQgdGhlIGZyb250KS4KKworICAgIEEgc2ltcGxlIGZpbHRlciBtYXRjaGVzIGFsbCBtb2R1bGVzIGFuZCBtZXNzYWdlcy4KKyAgICAnYWN0aW9uJyAtLSBvbmUgb2YgImVycm9yIiwgImlnbm9yZSIsICJhbHdheXMiLCAiZGVmYXVsdCIsICJtb2R1bGUiLAorICAgICAgICAgICAgICAgIG9yICJvbmNlIgorICAgICdjYXRlZ29yeScgLS0gYSBjbGFzcyB0aGF0IHRoZSB3YXJuaW5nIG11c3QgYmUgYSBzdWJjbGFzcyBvZgorICAgICdsaW5lbm8nIC0tIGFuIGludGVnZXIgbGluZSBudW1iZXIsIDAgbWF0Y2hlcyBhbGwgd2FybmluZ3MKKyAgICAnYXBwZW5kJyAtLSBpZiB0cnVlLCBhcHBlbmQgdG8gdGhlIGxpc3Qgb2YgZmlsdGVycworICAgICIiIgorICAgIGFzc2VydCBhY3Rpb24gaW4gKCJlcnJvciIsICJpZ25vcmUiLCAiYWx3YXlzIiwgImRlZmF1bHQiLCAibW9kdWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAib25jZSIpLCAiaW52YWxpZCBhY3Rpb246ICVyIiAlIChhY3Rpb24sKQorICAgIGFzc2VydCBpc2luc3RhbmNlKGxpbmVubywgaW50KSBhbmQgbGluZW5vID49IDAsIFwKKyAgICAgICAgICAgImxpbmVubyBtdXN0IGJlIGFuIGludCA+PSAwIgorICAgIGl0ZW0gPSAoYWN0aW9uLCBOb25lLCBjYXRlZ29yeSwgTm9uZSwgbGluZW5vKQorICAgIGlmIGFwcGVuZDoKKyAgICAgICAgZmlsdGVycy5hcHBlbmQoaXRlbSkKKyAgICBlbHNlOgorICAgICAgICBmaWx0ZXJzLmluc2VydCgwLCBpdGVtKQorCitkZWYgcmVzZXR3YXJuaW5ncygpOgorICAgICIiIkNsZWFyIHRoZSBsaXN0IG9mIHdhcm5pbmcgZmlsdGVycywgc28gdGhhdCBubyBmaWx0ZXJzIGFyZSBhY3RpdmUuIiIiCisgICAgZmlsdGVyc1s6XSA9IFtdCisKK2NsYXNzIF9PcHRpb25FcnJvcihFeGNlcHRpb24pOgorICAgICIiIkV4Y2VwdGlvbiB1c2VkIGJ5IG9wdGlvbiBwcm9jZXNzaW5nIGhlbHBlcnMuIiIiCisgICAgcGFzcworCisjIEhlbHBlciB0byBwcm9jZXNzIC1XIG9wdGlvbnMgcGFzc2VkIHZpYSBzeXMud2Fybm9wdGlvbnMKK2RlZiBfcHJvY2Vzc29wdGlvbnMoYXJncyk6CisgICAgZm9yIGFyZyBpbiBhcmdzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBfc2V0b3B0aW9uKGFyZykKKyAgICAgICAgZXhjZXB0IF9PcHRpb25FcnJvciwgbXNnOgorICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiSW52YWxpZCAtVyBvcHRpb24gaWdub3JlZDoiLCBtc2cKKworIyBIZWxwZXIgZm9yIF9wcm9jZXNzb3B0aW9ucygpCitkZWYgX3NldG9wdGlvbihhcmcpOgorICAgIGltcG9ydCByZQorICAgIHBhcnRzID0gYXJnLnNwbGl0KCc6JykKKyAgICBpZiBsZW4ocGFydHMpID4gNToKKyAgICAgICAgcmFpc2UgX09wdGlvbkVycm9yKCJ0b28gbWFueSBmaWVsZHMgKG1heCA1KTogJXIiICUgKGFyZywpKQorICAgIHdoaWxlIGxlbihwYXJ0cykgPCA1OgorICAgICAgICBwYXJ0cy5hcHBlbmQoJycpCisgICAgYWN0aW9uLCBtZXNzYWdlLCBjYXRlZ29yeSwgbW9kdWxlLCBsaW5lbm8gPSBbcy5zdHJpcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHMgaW4gcGFydHNdCisgICAgYWN0aW9uID0gX2dldGFjdGlvbihhY3Rpb24pCisgICAgbWVzc2FnZSA9IHJlLmVzY2FwZShtZXNzYWdlKQorICAgIGNhdGVnb3J5ID0gX2dldGNhdGVnb3J5KGNhdGVnb3J5KQorICAgIG1vZHVsZSA9IHJlLmVzY2FwZShtb2R1bGUpCisgICAgaWYgbW9kdWxlOgorICAgICAgICBtb2R1bGUgPSBtb2R1bGUgKyAnJCcKKyAgICBpZiBsaW5lbm86CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVubyA9IGludChsaW5lbm8pCisgICAgICAgICAgICBpZiBsaW5lbm8gPCAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKKyAgICAgICAgICAgIHJhaXNlIF9PcHRpb25FcnJvcigiaW52YWxpZCBsaW5lbm8gJXIiICUgKGxpbmVubywpKQorICAgIGVsc2U6CisgICAgICAgIGxpbmVubyA9IDAKKyAgICBmaWx0ZXJ3YXJuaW5ncyhhY3Rpb24sIG1lc3NhZ2UsIGNhdGVnb3J5LCBtb2R1bGUsIGxpbmVubykKKworIyBIZWxwZXIgZm9yIF9zZXRvcHRpb24oKQorZGVmIF9nZXRhY3Rpb24oYWN0aW9uKToKKyAgICBpZiBub3QgYWN0aW9uOgorICAgICAgICByZXR1cm4gImRlZmF1bHQiCisgICAgaWYgYWN0aW9uID09ICJhbGwiOiByZXR1cm4gImFsd2F5cyIgIyBBbGlhcworICAgIGZvciBhIGluICgnZGVmYXVsdCcsICdhbHdheXMnLCAnaWdub3JlJywgJ21vZHVsZScsICdvbmNlJywgJ2Vycm9yJyk6CisgICAgICAgIGlmIGEuc3RhcnRzd2l0aChhY3Rpb24pOgorICAgICAgICAgICAgcmV0dXJuIGEKKyAgICByYWlzZSBfT3B0aW9uRXJyb3IoImludmFsaWQgYWN0aW9uOiAlciIgJSAoYWN0aW9uLCkpCisKKyMgSGVscGVyIGZvciBfc2V0b3B0aW9uKCkKK2RlZiBfZ2V0Y2F0ZWdvcnkoY2F0ZWdvcnkpOgorICAgIGltcG9ydCByZQorICAgIGlmIG5vdCBjYXRlZ29yeToKKyAgICAgICAgcmV0dXJuIFdhcm5pbmcKKyAgICBpZiByZS5tYXRjaCgiXlthLXpBLVowLTlfXSskIiwgY2F0ZWdvcnkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjYXQgPSBldmFsKGNhdGVnb3J5KQorICAgICAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgX09wdGlvbkVycm9yKCJ1bmtub3duIHdhcm5pbmcgY2F0ZWdvcnk6ICVyIiAlIChjYXRlZ29yeSwpKQorICAgIGVsc2U6CisgICAgICAgIGkgPSBjYXRlZ29yeS5yZmluZCgiLiIpCisgICAgICAgIG1vZHVsZSA9IGNhdGVnb3J5WzppXQorICAgICAgICBrbGFzcyA9IGNhdGVnb3J5W2krMTpdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG0gPSBfX2ltcG9ydF9fKG1vZHVsZSwgTm9uZSwgTm9uZSwgW2tsYXNzXSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgcmFpc2UgX09wdGlvbkVycm9yKCJpbnZhbGlkIG1vZHVsZSBuYW1lOiAlciIgJSAobW9kdWxlLCkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNhdCA9IGdldGF0dHIobSwga2xhc3MpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIF9PcHRpb25FcnJvcigidW5rbm93biB3YXJuaW5nIGNhdGVnb3J5OiAlciIgJSAoY2F0ZWdvcnksKSkKKyAgICBpZiBub3QgaXNzdWJjbGFzcyhjYXQsIFdhcm5pbmcpOgorICAgICAgICByYWlzZSBfT3B0aW9uRXJyb3IoImludmFsaWQgd2FybmluZyBjYXRlZ29yeTogJXIiICUgKGNhdGVnb3J5LCkpCisgICAgcmV0dXJuIGNhdAorCisKKyMgQ29kZSB0eXBpY2FsbHkgcmVwbGFjZWQgYnkgX3dhcm5pbmdzCitkZWYgd2FybihtZXNzYWdlLCBjYXRlZ29yeT1Ob25lLCBzdGFja2xldmVsPTEpOgorICAgICIiIklzc3VlIGEgd2FybmluZywgb3IgbWF5YmUgaWdub3JlIGl0IG9yIHJhaXNlIGFuIGV4Y2VwdGlvbi4iIiIKKyAgICAjIENoZWNrIGlmIG1lc3NhZ2UgaXMgYWxyZWFkeSBhIFdhcm5pbmcgb2JqZWN0CisgICAgaWYgaXNpbnN0YW5jZShtZXNzYWdlLCBXYXJuaW5nKToKKyAgICAgICAgY2F0ZWdvcnkgPSBtZXNzYWdlLl9fY2xhc3NfXworICAgICMgQ2hlY2sgY2F0ZWdvcnkgYXJndW1lbnQKKyAgICBpZiBjYXRlZ29yeSBpcyBOb25lOgorICAgICAgICBjYXRlZ29yeSA9IFVzZXJXYXJuaW5nCisgICAgYXNzZXJ0IGlzc3ViY2xhc3MoY2F0ZWdvcnksIFdhcm5pbmcpCisgICAgIyBHZXQgY29udGV4dCBpbmZvcm1hdGlvbgorICAgIHRyeToKKyAgICAgICAgY2FsbGVyID0gc3lzLl9nZXRmcmFtZShzdGFja2xldmVsKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBnbG9iYWxzID0gc3lzLl9fZGljdF9fCisgICAgICAgIGxpbmVubyA9IDEKKyAgICBlbHNlOgorICAgICAgICBnbG9iYWxzID0gY2FsbGVyLmZfZ2xvYmFscworICAgICAgICBsaW5lbm8gPSBjYWxsZXIuZl9saW5lbm8KKyAgICBpZiAnX19uYW1lX18nIGluIGdsb2JhbHM6CisgICAgICAgIG1vZHVsZSA9IGdsb2JhbHNbJ19fbmFtZV9fJ10KKyAgICBlbHNlOgorICAgICAgICBtb2R1bGUgPSAiPHN0cmluZz4iCisgICAgZmlsZW5hbWUgPSBnbG9iYWxzLmdldCgnX19maWxlX18nKQorICAgIGlmIGZpbGVuYW1lOgorICAgICAgICBmbmwgPSBmaWxlbmFtZS5sb3dlcigpCisgICAgICAgIGlmIGZubC5lbmRzd2l0aCgoIi5weWMiLCAiLnB5byIpKToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi0xXQorICAgIGVsc2U6CisgICAgICAgIGlmIG1vZHVsZSA9PSAiX19tYWluX18iOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gc3lzLmFyZ3ZbMF0KKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIGVtYmVkZGVkIGludGVycHJldGVycyBkb24ndCBoYXZlIHN5cy5hcmd2LCBzZWUgYnVnICM4MzkxNTEKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9ICdfX21haW5fXycKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBtb2R1bGUKKyAgICByZWdpc3RyeSA9IGdsb2JhbHMuc2V0ZGVmYXVsdCgiX193YXJuaW5ncmVnaXN0cnlfXyIsIHt9KQorICAgIHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICBnbG9iYWxzKQorCitkZWYgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywKKyAgICAgICAgICAgICAgICAgIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKKyAgICBsaW5lbm8gPSBpbnQobGluZW5vKQorICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICBtb2R1bGUgPSBmaWxlbmFtZSBvciAiPHVua25vd24+IgorICAgICAgICBpZiBtb2R1bGVbLTM6XS5sb3dlcigpID09ICIucHkiOgorICAgICAgICAgICAgbW9kdWxlID0gbW9kdWxlWzotM10gIyBYWFggV2hhdCBhYm91dCBsZWFkaW5nIHBhdGhuYW1lPworICAgIGlmIHJlZ2lzdHJ5IGlzIE5vbmU6CisgICAgICAgIHJlZ2lzdHJ5ID0ge30KKyAgICBpZiBpc2luc3RhbmNlKG1lc3NhZ2UsIFdhcm5pbmcpOgorICAgICAgICB0ZXh0ID0gc3RyKG1lc3NhZ2UpCisgICAgICAgIGNhdGVnb3J5ID0gbWVzc2FnZS5fX2NsYXNzX18KKyAgICBlbHNlOgorICAgICAgICB0ZXh0ID0gbWVzc2FnZQorICAgICAgICBtZXNzYWdlID0gY2F0ZWdvcnkobWVzc2FnZSkKKyAgICBrZXkgPSAodGV4dCwgY2F0ZWdvcnksIGxpbmVubykKKyAgICAjIFF1aWNrIHRlc3QgZm9yIGNvbW1vbiBjYXNlCisgICAgaWYgcmVnaXN0cnkuZ2V0KGtleSk6CisgICAgICAgIHJldHVybgorICAgICMgU2VhcmNoIHRoZSBmaWx0ZXJzCisgICAgZm9yIGl0ZW0gaW4gZmlsdGVyczoKKyAgICAgICAgYWN0aW9uLCBtc2csIGNhdCwgbW9kLCBsbiA9IGl0ZW0KKyAgICAgICAgaWYgKChtc2cgaXMgTm9uZSBvciBtc2cubWF0Y2godGV4dCkpIGFuZAorICAgICAgICAgICAgaXNzdWJjbGFzcyhjYXRlZ29yeSwgY2F0KSBhbmQKKyAgICAgICAgICAgIChtb2QgaXMgTm9uZSBvciBtb2QubWF0Y2gobW9kdWxlKSkgYW5kCisgICAgICAgICAgICAobG4gPT0gMCBvciBsaW5lbm8gPT0gbG4pKToKKyAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgYWN0aW9uID0gZGVmYXVsdGFjdGlvbgorICAgICMgRWFybHkgZXhpdCBhY3Rpb25zCisgICAgaWYgYWN0aW9uID09ICJpZ25vcmUiOgorICAgICAgICByZWdpc3RyeVtrZXldID0gMQorICAgICAgICByZXR1cm4KKworICAgICMgUHJpbWUgdGhlIGxpbmVjYWNoZSBmb3IgZm9ybWF0dGluZywgaW4gY2FzZSB0aGUKKyAgICAjICJmaWxlIiBpcyBhY3R1YWxseSBpbiBhIHppcGZpbGUgb3Igc29tZXRoaW5nLgorICAgIGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCisKKyAgICBpZiBhY3Rpb24gPT0gImVycm9yIjoKKyAgICAgICAgcmFpc2UgbWVzc2FnZQorICAgICMgT3RoZXIgYWN0aW9ucworICAgIGlmIGFjdGlvbiA9PSAib25jZSI6CisgICAgICAgIHJlZ2lzdHJ5W2tleV0gPSAxCisgICAgICAgIG9uY2VrZXkgPSAodGV4dCwgY2F0ZWdvcnkpCisgICAgICAgIGlmIG9uY2VyZWdpc3RyeS5nZXQob25jZWtleSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgb25jZXJlZ2lzdHJ5W29uY2VrZXldID0gMQorICAgIGVsaWYgYWN0aW9uID09ICJhbHdheXMiOgorICAgICAgICBwYXNzCisgICAgZWxpZiBhY3Rpb24gPT0gIm1vZHVsZSI6CisgICAgICAgIHJlZ2lzdHJ5W2tleV0gPSAxCisgICAgICAgIGFsdGtleSA9ICh0ZXh0LCBjYXRlZ29yeSwgMCkKKyAgICAgICAgaWYgcmVnaXN0cnkuZ2V0KGFsdGtleSk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcmVnaXN0cnlbYWx0a2V5XSA9IDEKKyAgICBlbGlmIGFjdGlvbiA9PSAiZGVmYXVsdCI6CisgICAgICAgIHJlZ2lzdHJ5W2tleV0gPSAxCisgICAgZWxzZToKKyAgICAgICAgIyBVbnJlY29nbml6ZWQgYWN0aW9ucyBhcmUgZXJyb3JzCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBhY3Rpb24gKCVyKSBpbiB3YXJuaW5ncy5maWx0ZXJzOlxuICVzIiAlCisgICAgICAgICAgICAgIChhY3Rpb24sIGl0ZW0pKQorICAgICMgUHJpbnQgbWVzc2FnZSBhbmQgY29udGV4dAorICAgIHNob3d3YXJuaW5nKG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vKQorCisKK2NsYXNzIFdhcm5pbmdNZXNzYWdlKG9iamVjdCk6CisKKyAgICAiIiJIb2xkcyB0aGUgcmVzdWx0IG9mIGEgc2luZ2xlIHNob3d3YXJuaW5nKCkgY2FsbC4iIiIKKworICAgIF9XQVJOSU5HX0RFVEFJTFMgPSAoIm1lc3NhZ2UiLCAiY2F0ZWdvcnkiLCAiZmlsZW5hbWUiLCAibGluZW5vIiwgImZpbGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUiKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBmaWxlPU5vbmUsCisgICAgICAgICAgICAgICAgICAgIGxpbmU9Tm9uZSk6CisgICAgICAgIGxvY2FsX3ZhbHVlcyA9IGxvY2FscygpCisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuX1dBUk5JTkdfREVUQUlMUzoKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgYXR0ciwgbG9jYWxfdmFsdWVzW2F0dHJdKQorICAgICAgICBzZWxmLl9jYXRlZ29yeV9uYW1lID0gY2F0ZWdvcnkuX19uYW1lX18gaWYgY2F0ZWdvcnkgZWxzZSBOb25lCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICgie21lc3NhZ2UgOiAlciwgY2F0ZWdvcnkgOiAlciwgZmlsZW5hbWUgOiAlciwgbGluZW5vIDogJXMsICIKKyAgICAgICAgICAgICAgICAgICAgImxpbmUgOiAlcn0iICUgKHNlbGYubWVzc2FnZSwgc2VsZi5fY2F0ZWdvcnlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUsIHNlbGYubGluZW5vLCBzZWxmLmxpbmUpKQorCisKK2NsYXNzIGNhdGNoX3dhcm5pbmdzKG9iamVjdCk6CisKKyAgICAiIiJBIGNvbnRleHQgbWFuYWdlciB0aGF0IGNvcGllcyBhbmQgcmVzdG9yZXMgdGhlIHdhcm5pbmdzIGZpbHRlciB1cG9uCisgICAgZXhpdGluZyB0aGUgY29udGV4dC4KKworICAgIFRoZSAncmVjb3JkJyBhcmd1bWVudCBzcGVjaWZpZXMgd2hldGhlciB3YXJuaW5ncyBzaG91bGQgYmUgY2FwdHVyZWQgYnkgYQorICAgIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiB3YXJuaW5ncy5zaG93d2FybmluZygpIGFuZCBiZSBhcHBlbmRlZCB0byBhIGxpc3QKKyAgICByZXR1cm5lZCBieSB0aGUgY29udGV4dCBtYW5hZ2VyLiBPdGhlcndpc2UgTm9uZSBpcyByZXR1cm5lZCBieSB0aGUgY29udGV4dAorICAgIG1hbmFnZXIuIFRoZSBvYmplY3RzIGFwcGVuZGVkIHRvIHRoZSBsaXN0IGFyZSBhcmd1bWVudHMgd2hvc2UgYXR0cmlidXRlcworICAgIG1pcnJvciB0aGUgYXJndW1lbnRzIHRvIHNob3d3YXJuaW5nKCkuCisKKyAgICBUaGUgJ21vZHVsZScgYXJndW1lbnQgaXMgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBtb2R1bGUgdG8gdGhlIG1vZHVsZQorICAgIG5hbWVkICd3YXJuaW5ncycgYW5kIGltcG9ydGVkIHVuZGVyIHRoYXQgbmFtZS4gVGhpcyBhcmd1bWVudCBpcyBvbmx5IHVzZWZ1bAorICAgIHdoZW4gdGVzdGluZyB0aGUgd2FybmluZ3MgbW9kdWxlIGl0c2VsZi4KKworICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlY29yZD1GYWxzZSwgbW9kdWxlPU5vbmUpOgorICAgICAgICAiIiJTcGVjaWZ5IHdoZXRoZXIgdG8gcmVjb3JkIHdhcm5pbmdzIGFuZCBpZiBhbiBhbHRlcm5hdGl2ZSBtb2R1bGUKKyAgICAgICAgc2hvdWxkIGJlIHVzZWQgb3RoZXIgdGhhbiBzeXMubW9kdWxlc1snd2FybmluZ3MnXS4KKworICAgICAgICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAzLjAsIHBsZWFzZSBjb25zaWRlciBhbGwgYXJndW1lbnRzIHRvIGJlCisgICAgICAgIGtleXdvcmQtb25seS4KKworICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fcmVjb3JkID0gcmVjb3JkCisgICAgICAgIHNlbGYuX21vZHVsZSA9IHN5cy5tb2R1bGVzWyd3YXJuaW5ncyddIGlmIG1vZHVsZSBpcyBOb25lIGVsc2UgbW9kdWxlCisgICAgICAgIHNlbGYuX2VudGVyZWQgPSBGYWxzZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICBhcmdzID0gW10KKyAgICAgICAgaWYgc2VsZi5fcmVjb3JkOgorICAgICAgICAgICAgYXJncy5hcHBlbmQoInJlY29yZD1UcnVlIikKKyAgICAgICAgaWYgc2VsZi5fbW9kdWxlIGlzIG5vdCBzeXMubW9kdWxlc1snd2FybmluZ3MnXToKKyAgICAgICAgICAgIGFyZ3MuYXBwZW5kKCJtb2R1bGU9JXIiICUgc2VsZi5fbW9kdWxlKQorICAgICAgICBuYW1lID0gdHlwZShzZWxmKS5fX25hbWVfXworICAgICAgICByZXR1cm4gIiVzKCVzKSIgJSAobmFtZSwgIiwgIi5qb2luKGFyZ3MpKQorCisgICAgZGVmIF9fZW50ZXJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZW50ZXJlZDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigiQ2Fubm90IGVudGVyICVyIHR3aWNlIiAlIHNlbGYpCisgICAgICAgIHNlbGYuX2VudGVyZWQgPSBUcnVlCisgICAgICAgIHNlbGYuX2ZpbHRlcnMgPSBzZWxmLl9tb2R1bGUuZmlsdGVycworICAgICAgICBzZWxmLl9tb2R1bGUuZmlsdGVycyA9IHNlbGYuX2ZpbHRlcnNbOl0KKyAgICAgICAgc2VsZi5fc2hvd3dhcm5pbmcgPSBzZWxmLl9tb2R1bGUuc2hvd3dhcm5pbmcKKyAgICAgICAgaWYgc2VsZi5fcmVjb3JkOgorICAgICAgICAgICAgbG9nID0gW10KKyAgICAgICAgICAgIGRlZiBzaG93d2FybmluZygqYXJncywgKiprd2FyZ3MpOgorICAgICAgICAgICAgICAgIGxvZy5hcHBlbmQoV2FybmluZ01lc3NhZ2UoKmFyZ3MsICoqa3dhcmdzKSkKKyAgICAgICAgICAgIHNlbGYuX21vZHVsZS5zaG93d2FybmluZyA9IHNob3d3YXJuaW5nCisgICAgICAgICAgICByZXR1cm4gbG9nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpleGNfaW5mbyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbnRlcmVkOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJDYW5ub3QgZXhpdCAlciB3aXRob3V0IGVudGVyaW5nIGZpcnN0IiAlIHNlbGYpCisgICAgICAgIHNlbGYuX21vZHVsZS5maWx0ZXJzID0gc2VsZi5fZmlsdGVycworICAgICAgICBzZWxmLl9tb2R1bGUuc2hvd3dhcm5pbmcgPSBzZWxmLl9zaG93d2FybmluZworCisKKyMgZmlsdGVycyBjb250YWlucyBhIHNlcXVlbmNlIG9mIGZpbHRlciA1LXR1cGxlcworIyBUaGUgY29tcG9uZW50cyBvZiB0aGUgNS10dXBsZSBhcmU6CisjIC0gYW4gYWN0aW9uOiBlcnJvciwgaWdub3JlLCBhbHdheXMsIGRlZmF1bHQsIG1vZHVsZSwgb3Igb25jZQorIyAtIGEgY29tcGlsZWQgcmVnZXggdGhhdCBtdXN0IG1hdGNoIHRoZSB3YXJuaW5nIG1lc3NhZ2UKKyMgLSBhIGNsYXNzIHJlcHJlc2VudGluZyB0aGUgd2FybmluZyBjYXRlZ29yeQorIyAtIGEgY29tcGlsZWQgcmVnZXggdGhhdCBtdXN0IG1hdGNoIHRoZSBtb2R1bGUgdGhhdCBpcyBiZWluZyB3YXJuZWQKKyMgLSBhIGxpbmUgbnVtYmVyIGZvciB0aGUgbGluZSBiZWluZyB3YXJuaW5nLCBvciAwIHRvIG1lYW4gYW55IGxpbmUKKyMgSWYgZWl0aGVyIGlmIHRoZSBjb21waWxlZCByZWdleHMgYXJlIE5vbmUsIG1hdGNoIGFueXRoaW5nLgorX3dhcm5pbmdzX2RlZmF1bHRzID0gRmFsc2UKK3RyeToKKyAgICBmcm9tIF93YXJuaW5ncyBpbXBvcnQgKGZpbHRlcnMsIGRlZmF1bHRfYWN0aW9uLCBvbmNlX3JlZ2lzdHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm4sIHdhcm5fZXhwbGljaXQpCisgICAgZGVmYXVsdGFjdGlvbiA9IGRlZmF1bHRfYWN0aW9uCisgICAgb25jZXJlZ2lzdHJ5ID0gb25jZV9yZWdpc3RyeQorICAgIF93YXJuaW5nc19kZWZhdWx0cyA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmaWx0ZXJzID0gW10KKyAgICBkZWZhdWx0YWN0aW9uID0gImRlZmF1bHQiCisgICAgb25jZXJlZ2lzdHJ5ID0ge30KKworCisjIE1vZHVsZSBpbml0aWFsaXphdGlvbgorX3Byb2Nlc3NvcHRpb25zKHN5cy53YXJub3B0aW9ucykKK2lmIG5vdCBfd2FybmluZ3NfZGVmYXVsdHM6CisgICAgc2lsZW5jZSA9IFtJbXBvcnRXYXJuaW5nLCBQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nXQorICAgICMgRG9uJ3Qgc2lsZW5jZSBEZXByZWNhdGlvbldhcm5pbmcgaWYgLTMgb3IgLVEgd2FzIHVzZWQuCisgICAgaWYgbm90IHN5cy5weTNrd2FybmluZyBhbmQgbm90IHN5cy5mbGFncy5kaXZpc2lvbl93YXJuaW5nOgorICAgICAgICBzaWxlbmNlLmFwcGVuZChEZXByZWNhdGlvbldhcm5pbmcpCisgICAgZm9yIGNscyBpbiBzaWxlbmNlOgorICAgICAgICBzaW1wbGVmaWx0ZXIoImlnbm9yZSIsIGNhdGVnb3J5PWNscykKKyAgICBieXRlc193YXJuaW5nID0gc3lzLmZsYWdzLmJ5dGVzX3dhcm5pbmcKKyAgICBpZiBieXRlc193YXJuaW5nID4gMToKKyAgICAgICAgYnl0ZXNfYWN0aW9uID0gImVycm9yIgorICAgIGVsaWYgYnl0ZXNfd2FybmluZzoKKyAgICAgICAgYnl0ZXNfYWN0aW9uID0gImRlZmF1bHQiCisgICAgZWxzZToKKyAgICAgICAgYnl0ZXNfYWN0aW9uID0gImlnbm9yZSIKKyAgICBzaW1wbGVmaWx0ZXIoYnl0ZXNfYWN0aW9uLCBjYXRlZ29yeT1CeXRlc1dhcm5pbmcsIGFwcGVuZD0xKQorZGVsIF93YXJuaW5nc19kZWZhdWx0cwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93YXJuaW5ncy5weWMgYi9saWIvcHl0aG9uMi43L3dhcm5pbmdzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAzY2YwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93YXJuaW5ncy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93YXJuaW5ncy5weW8gYi9saWIvcHl0aG9uMi43L3dhcm5pbmdzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTdlNTRmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93YXJuaW5ncy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93YXZlLnB5IGIvbGliL3B5dGhvbjIuNy93YXZlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2YjExZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dhdmUucHkKQEAgLTAsMCArMSw1MDQgQEAKKyIiIlN0dWZmIHRvIHBhcnNlIFdBVkUgZmlsZXMuCisKK1VzYWdlLgorCitSZWFkaW5nIFdBVkUgZmlsZXM6CisgICAgICBmID0gd2F2ZS5vcGVuKGZpbGUsICdyJykKK3doZXJlIGZpbGUgaXMgZWl0aGVyIHRoZSBuYW1lIG9mIGEgZmlsZSBvciBhbiBvcGVuIGZpbGUgcG9pbnRlci4KK1RoZSBvcGVuIGZpbGUgcG9pbnRlciBtdXN0IGhhdmUgbWV0aG9kcyByZWFkKCksIHNlZWsoKSwgYW5kIGNsb3NlKCkuCitXaGVuIHRoZSBzZXRwb3MoKSBhbmQgcmV3aW5kKCkgbWV0aG9kcyBhcmUgbm90IHVzZWQsIHRoZSBzZWVrKCkKK21ldGhvZCBpcyBub3QgIG5lY2Vzc2FyeS4KKworVGhpcyByZXR1cm5zIGFuIGluc3RhbmNlIG9mIGEgY2xhc3Mgd2l0aCB0aGUgZm9sbG93aW5nIHB1YmxpYyBtZXRob2RzOgorICAgICAgZ2V0bmNoYW5uZWxzKCkgIC0tIHJldHVybnMgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzICgxIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgIG1vbm8sIDIgZm9yIHN0ZXJlbykKKyAgICAgIGdldHNhbXB3aWR0aCgpICAtLSByZXR1cm5zIHNhbXBsZSB3aWR0aCBpbiBieXRlcworICAgICAgZ2V0ZnJhbWVyYXRlKCkgIC0tIHJldHVybnMgc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgICBnZXRuZnJhbWVzKCkgICAgLS0gcmV0dXJucyBudW1iZXIgb2YgYXVkaW8gZnJhbWVzCisgICAgICBnZXRjb21wdHlwZSgpICAgLS0gcmV0dXJucyBjb21wcmVzc2lvbiB0eXBlICgnTk9ORScgZm9yIGxpbmVhciBzYW1wbGVzKQorICAgICAgZ2V0Y29tcG5hbWUoKSAgIC0tIHJldHVybnMgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzaW9uIHR5cGUgKCdub3QgY29tcHJlc3NlZCcgbGluZWFyIHNhbXBsZXMpCisgICAgICBnZXRwYXJhbXMoKSAgICAgLS0gcmV0dXJucyBhIHR1cGxlIGNvbnNpc3Rpbmcgb2YgYWxsIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlIGluIHRoZSBhYm92ZSBvcmRlcgorICAgICAgZ2V0bWFya2VycygpICAgIC0tIHJldHVybnMgTm9uZSAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBhaWZjIG1vZHVsZSkKKyAgICAgIGdldG1hcmsoaWQpICAgICAtLSByYWlzZXMgYW4gZXJyb3Igc2luY2UgdGhlIG1hcmsgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdCAoZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgYWlmYyBtb2R1bGUpCisgICAgICByZWFkZnJhbWVzKG4pICAgLS0gcmV0dXJucyBhdCBtb3N0IG4gZnJhbWVzIG9mIGF1ZGlvCisgICAgICByZXdpbmQoKSAgICAgICAgLS0gcmV3aW5kIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGF1ZGlvIHN0cmVhbQorICAgICAgc2V0cG9zKHBvcykgICAgIC0tIHNlZWsgdG8gdGhlIHNwZWNpZmllZCBwb3NpdGlvbgorICAgICAgdGVsbCgpICAgICAgICAgIC0tIHJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbgorICAgICAgY2xvc2UoKSAgICAgICAgIC0tIGNsb3NlIHRoZSBpbnN0YW5jZSAobWFrZSBpdCB1bnVzYWJsZSkKK1RoZSBwb3NpdGlvbiByZXR1cm5lZCBieSB0ZWxsKCkgYW5kIHRoZSBwb3NpdGlvbiBnaXZlbiB0byBzZXRwb3MoKQorYXJlIGNvbXBhdGlibGUgYW5kIGhhdmUgbm90aGluZyB0byBkbyB3aXRoIHRoZSBhY3R1YWwgcG9zaXRpb24gaW4gdGhlCitmaWxlLgorVGhlIGNsb3NlKCkgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIGNsYXNzIGluc3RhbmNlCitpcyBkZXN0cm95ZWQuCisKK1dyaXRpbmcgV0FWRSBmaWxlczoKKyAgICAgIGYgPSB3YXZlLm9wZW4oZmlsZSwgJ3cnKQord2hlcmUgZmlsZSBpcyBlaXRoZXIgdGhlIG5hbWUgb2YgYSBmaWxlIG9yIGFuIG9wZW4gZmlsZSBwb2ludGVyLgorVGhlIG9wZW4gZmlsZSBwb2ludGVyIG11c3QgaGF2ZSBtZXRob2RzIHdyaXRlKCksIHRlbGwoKSwgc2VlaygpLCBhbmQKK2Nsb3NlKCkuCisKK1RoaXMgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHdpdGggdGhlIGZvbGxvd2luZyBwdWJsaWMgbWV0aG9kczoKKyAgICAgIHNldG5jaGFubmVscyhuKSAtLSBzZXQgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgc2V0c2FtcHdpZHRoKG4pIC0tIHNldCB0aGUgc2FtcGxlIHdpZHRoCisgICAgICBzZXRmcmFtZXJhdGUobikgLS0gc2V0IHRoZSBmcmFtZSByYXRlCisgICAgICBzZXRuZnJhbWVzKG4pICAgLS0gc2V0IHRoZSBudW1iZXIgb2YgZnJhbWVzCisgICAgICBzZXRjb21wdHlwZSh0eXBlLCBuYW1lKQorICAgICAgICAgICAgICAgICAgICAgIC0tIHNldCB0aGUgY29tcHJlc3Npb24gdHlwZSBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgaHVtYW4tcmVhZGFibGUgY29tcHJlc3Npb24gdHlwZQorICAgICAgc2V0cGFyYW1zKHR1cGxlKQorICAgICAgICAgICAgICAgICAgICAgIC0tIHNldCBhbGwgcGFyYW1ldGVycyBhdCBvbmNlCisgICAgICB0ZWxsKCkgICAgICAgICAgLS0gcmV0dXJuIGN1cnJlbnQgcG9zaXRpb24gaW4gb3V0cHV0IGZpbGUKKyAgICAgIHdyaXRlZnJhbWVzcmF3KGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgLS0gd3JpdGUgYXVkaW8gZnJhbWVzIHdpdGhvdXQgcGF0aGluZyB1cCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGhlYWRlcgorICAgICAgd3JpdGVmcmFtZXMoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAtLSB3cml0ZSBhdWRpbyBmcmFtZXMgYW5kIHBhdGNoIHVwIHRoZSBmaWxlIGhlYWRlcgorICAgICAgY2xvc2UoKSAgICAgICAgIC0tIHBhdGNoIHVwIHRoZSBmaWxlIGhlYWRlciBhbmQgY2xvc2UgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IGZpbGUKK1lvdSBzaG91bGQgc2V0IHRoZSBwYXJhbWV0ZXJzIGJlZm9yZSB0aGUgZmlyc3Qgd3JpdGVmcmFtZXNyYXcgb3IKK3dyaXRlZnJhbWVzLiAgVGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQsCitidXQgd2hlbiBpdCBpcyBzZXQgdG8gdGhlIGNvcnJlY3QgdmFsdWUsIHRoZSBoZWFkZXIgZG9lcyBub3QgaGF2ZSB0bworYmUgcGF0Y2hlZCB1cC4KK0l0IGlzIGJlc3QgdG8gZmlyc3Qgc2V0IGFsbCBwYXJhbWV0ZXJzLCBwZXJoYXBzIHBvc3NpYmx5IHRoZQorY29tcHJlc3Npb24gdHlwZSwgYW5kIHRoZW4gd3JpdGUgYXVkaW8gZnJhbWVzIHVzaW5nIHdyaXRlZnJhbWVzcmF3LgorV2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiB3cml0dGVuLCBlaXRoZXIgY2FsbCB3cml0ZWZyYW1lcygnJykgb3IKK2Nsb3NlKCkgdG8gcGF0Y2ggdXAgdGhlIHNpemVzIGluIHRoZSBoZWFkZXIuCitUaGUgY2xvc2UoKSBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY2xhc3MgaW5zdGFuY2UKK2lzIGRlc3Ryb3llZC4KKyIiIgorCitpbXBvcnQgX19idWlsdGluX18KKworX19hbGxfXyA9IFsib3BlbiIsICJvcGVuZnAiLCAiRXJyb3IiXQorCitjbGFzcyBFcnJvcihFeGNlcHRpb24pOgorICAgIHBhc3MKKworV0FWRV9GT1JNQVRfUENNID0gMHgwMDAxCisKK19hcnJheV9mbXRzID0gTm9uZSwgJ2InLCAnaCcsIE5vbmUsICdsJworCisjIERldGVybWluZSBlbmRpYW4tbmVzcworaW1wb3J0IHN0cnVjdAoraWYgc3RydWN0LnBhY2soImgiLCAxKSA9PSAiXDAwMFwwMDEiOgorICAgIGJpZ19lbmRpYW4gPSAxCitlbHNlOgorICAgIGJpZ19lbmRpYW4gPSAwCisKK2Zyb20gY2h1bmsgaW1wb3J0IENodW5rCisKK2NsYXNzIFdhdmVfcmVhZDoKKyAgICAiIiJWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgorCisgICAgVGhlc2UgdmFyaWFibGVzIGFyZSBhdmFpbGFibGUgdG8gdGhlIHVzZXIgdGhvdWdoIGFwcHJvcHJpYXRlCisgICAgbWV0aG9kcyBvZiB0aGlzIGNsYXNzOgorICAgIF9maWxlIC0tIHRoZSBvcGVuIGZpbGUgd2l0aCBtZXRob2RzIHJlYWQoKSwgY2xvc2UoKSwgYW5kIHNlZWsoKQorICAgICAgICAgICAgICBzZXQgdGhyb3VnaCB0aGUgX19pbml0X18oKSBtZXRob2QKKyAgICBfbmNoYW5uZWxzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMKKyAgICAgICAgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldG5jaGFubmVscygpIG1ldGhvZAorICAgIF9uZnJhbWVzIC0tIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzCisgICAgICAgICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRuZnJhbWVzKCkgbWV0aG9kCisgICAgX3NhbXB3aWR0aCAtLSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBhdWRpbyBzYW1wbGUKKyAgICAgICAgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldHNhbXB3aWR0aCgpIG1ldGhvZAorICAgIF9mcmFtZXJhdGUgLS0gdGhlIHNhbXBsaW5nIGZyZXF1ZW5jeQorICAgICAgICAgICAgICBhdmFpbGFibGUgdGhyb3VnaCB0aGUgZ2V0ZnJhbWVyYXRlKCkgbWV0aG9kCisgICAgX2NvbXB0eXBlIC0tIHRoZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZSAoJ05PTkUnIGlmIEFJRkYpCisgICAgICAgICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBnZXRjb21wdHlwZSgpIG1ldGhvZAorICAgIF9jb21wbmFtZSAtLSB0aGUgaHVtYW4tcmVhZGFibGUgQUlGRi1DIGNvbXByZXNzaW9uIHR5cGUKKyAgICAgICAgICAgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGdldGNvbXB0eXBlKCkgbWV0aG9kCisgICAgX3NvdW5kcG9zIC0tIHRoZSBwb3NpdGlvbiBpbiB0aGUgYXVkaW8gc3RyZWFtCisgICAgICAgICAgICAgIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSB0ZWxsKCkgbWV0aG9kLCBzZXQgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICAgc2V0cG9zKCkgbWV0aG9kCisKKyAgICBUaGVzZSB2YXJpYWJsZXMgYXJlIHVzZWQgaW50ZXJuYWxseSBvbmx5OgorICAgIF9mbXRfY2h1bmtfcmVhZCAtLSAxIGlmZiB0aGUgRk1UIGNodW5rIGhhcyBiZWVuIHJlYWQKKyAgICBfZGF0YV9zZWVrX25lZWRlZCAtLSAxIGlmZiBwb3NpdGlvbmVkIGNvcnJlY3RseSBpbiBhdWRpbworICAgICAgICAgICAgICBmaWxlIGZvciByZWFkZnJhbWVzKCkKKyAgICBfZGF0YV9jaHVuayAtLSBpbnN0YW50aWF0aW9uIG9mIGEgY2h1bmsgY2xhc3MgZm9yIHRoZSBEQVRBIGNodW5rCisgICAgX2ZyYW1lc2l6ZSAtLSBzaXplIG9mIG9uZSBmcmFtZSBpbiB0aGUgZmlsZQorICAgICIiIgorCisgICAgZGVmIGluaXRmcChzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5fY29udmVydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fc291bmRwb3MgPSAwCisgICAgICAgIHNlbGYuX2ZpbGUgPSBDaHVuayhmaWxlLCBiaWdlbmRpYW4gPSAwKQorICAgICAgICBpZiBzZWxmLl9maWxlLmdldG5hbWUoKSAhPSAnUklGRic6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2ZpbGUgZG9lcyBub3Qgc3RhcnQgd2l0aCBSSUZGIGlkJworICAgICAgICBpZiBzZWxmLl9maWxlLnJlYWQoNCkgIT0gJ1dBVkUnOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdub3QgYSBXQVZFIGZpbGUnCisgICAgICAgIHNlbGYuX2ZtdF9jaHVua19yZWFkID0gMAorICAgICAgICBzZWxmLl9kYXRhX2NodW5rID0gTm9uZQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgc2VsZi5fZGF0YV9zZWVrX25lZWRlZCA9IDEKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjaHVuayA9IENodW5rKHNlbGYuX2ZpbGUsIGJpZ2VuZGlhbiA9IDApCisgICAgICAgICAgICBleGNlcHQgRU9GRXJyb3I6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNodW5rbmFtZSA9IGNodW5rLmdldG5hbWUoKQorICAgICAgICAgICAgaWYgY2h1bmtuYW1lID09ICdmbXQgJzoKKyAgICAgICAgICAgICAgICBzZWxmLl9yZWFkX2ZtdF9jaHVuayhjaHVuaykKKyAgICAgICAgICAgICAgICBzZWxmLl9mbXRfY2h1bmtfcmVhZCA9IDEKKyAgICAgICAgICAgIGVsaWYgY2h1bmtuYW1lID09ICdkYXRhJzoKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5fZm10X2NodW5rX3JlYWQ6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnZGF0YSBjaHVuayBiZWZvcmUgZm10IGNodW5rJworICAgICAgICAgICAgICAgIHNlbGYuX2RhdGFfY2h1bmsgPSBjaHVuaworICAgICAgICAgICAgICAgIHNlbGYuX25mcmFtZXMgPSBjaHVuay5jaHVua3NpemUgLy8gc2VsZi5fZnJhbWVzaXplCisgICAgICAgICAgICAgICAgc2VsZi5fZGF0YV9zZWVrX25lZWRlZCA9IDAKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY2h1bmsuc2tpcCgpCisgICAgICAgIGlmIG5vdCBzZWxmLl9mbXRfY2h1bmtfcmVhZCBvciBub3Qgc2VsZi5fZGF0YV9jaHVuazoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnZm10IGNodW5rIGFuZC9vciBkYXRhIGNodW5rIG1pc3NpbmcnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZik6CisgICAgICAgIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlID0gTm9uZQorICAgICAgICBpZiBpc2luc3RhbmNlKGYsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgZiA9IF9fYnVpbHRpbl9fLm9wZW4oZiwgJ3JiJykKKyAgICAgICAgICAgIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlID0gZgorICAgICAgICAjIGVsc2UsIGFzc3VtZSBpdCBpcyBhbiBvcGVuIGZpbGUgb2JqZWN0IGFscmVhZHkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5pbml0ZnAoZikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGU6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICMKKyAgICAjIFVzZXIgdmlzaWJsZSBtZXRob2RzLgorICAgICMKKyAgICBkZWYgZ2V0ZnAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9maWxlCisKKyAgICBkZWYgcmV3aW5kKHNlbGYpOgorICAgICAgICBzZWxmLl9kYXRhX3NlZWtfbmVlZGVkID0gMQorICAgICAgICBzZWxmLl9zb3VuZHBvcyA9IDAKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGU6CisgICAgICAgICAgICBzZWxmLl9pX29wZW5lZF90aGVfZmlsZS5jbG9zZSgpCisgICAgICAgICAgICBzZWxmLl9pX29wZW5lZF90aGVfZmlsZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fZmlsZSA9IE5vbmUKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fc291bmRwb3MKKworICAgIGRlZiBnZXRuY2hhbm5lbHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMKKworICAgIGRlZiBnZXRuZnJhbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmZyYW1lcworCisgICAgZGVmIGdldHNhbXB3aWR0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NhbXB3aWR0aAorCisgICAgZGVmIGdldGZyYW1lcmF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2ZyYW1lcmF0ZQorCisgICAgZGVmIGdldGNvbXB0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fY29tcHR5cGUKKworICAgIGRlZiBnZXRjb21wbmFtZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXBuYW1lCisKKyAgICBkZWYgZ2V0cGFyYW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5nZXRuY2hhbm5lbHMoKSwgc2VsZi5nZXRzYW1wd2lkdGgoKSwgXAorICAgICAgICAgICAgICAgc2VsZi5nZXRmcmFtZXJhdGUoKSwgc2VsZi5nZXRuZnJhbWVzKCksIFwKKyAgICAgICAgICAgICAgIHNlbGYuZ2V0Y29tcHR5cGUoKSwgc2VsZi5nZXRjb21wbmFtZSgpCisKKyAgICBkZWYgZ2V0bWFya2VycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXRtYXJrKHNlbGYsIGlkKToKKyAgICAgICAgcmFpc2UgRXJyb3IsICdubyBtYXJrcycKKworICAgIGRlZiBzZXRwb3Moc2VsZiwgcG9zKToKKyAgICAgICAgaWYgcG9zIDwgMCBvciBwb3MgPiBzZWxmLl9uZnJhbWVzOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdwb3NpdGlvbiBub3QgaW4gcmFuZ2UnCisgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gcG9zCisgICAgICAgIHNlbGYuX2RhdGFfc2Vla19uZWVkZWQgPSAxCisKKyAgICBkZWYgcmVhZGZyYW1lcyhzZWxmLCBuZnJhbWVzKToKKyAgICAgICAgaWYgc2VsZi5fZGF0YV9zZWVrX25lZWRlZDoKKyAgICAgICAgICAgIHNlbGYuX2RhdGFfY2h1bmsuc2VlaygwLCAwKQorICAgICAgICAgICAgcG9zID0gc2VsZi5fc291bmRwb3MgKiBzZWxmLl9mcmFtZXNpemUKKyAgICAgICAgICAgIGlmIHBvczoKKyAgICAgICAgICAgICAgICBzZWxmLl9kYXRhX2NodW5rLnNlZWsocG9zLCAwKQorICAgICAgICAgICAgc2VsZi5fZGF0YV9zZWVrX25lZWRlZCA9IDAKKyAgICAgICAgaWYgbmZyYW1lcyA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICcnCisgICAgICAgIGlmIHNlbGYuX3NhbXB3aWR0aCA+IDEgYW5kIGJpZ19lbmRpYW46CisgICAgICAgICAgICAjIHVuZm9ydHVuYXRlbHkgdGhlIGZyb21maWxlKCkgbWV0aG9kIGRvZXMgbm90IHRha2UKKyAgICAgICAgICAgICMgc29tZXRoaW5nIHRoYXQgb25seSBsb29rcyBsaWtlIGEgZmlsZSBvYmplY3QsIHNvCisgICAgICAgICAgICAjIHdlIGhhdmUgdG8gcmVhY2ggaW50byB0aGUgaW5uYXJkcyBvZiB0aGUgY2h1bmsgb2JqZWN0CisgICAgICAgICAgICBpbXBvcnQgYXJyYXkKKyAgICAgICAgICAgIGNodW5rID0gc2VsZi5fZGF0YV9jaHVuaworICAgICAgICAgICAgZGF0YSA9IGFycmF5LmFycmF5KF9hcnJheV9mbXRzW3NlbGYuX3NhbXB3aWR0aF0pCisgICAgICAgICAgICBuaXRlbXMgPSBuZnJhbWVzICogc2VsZi5fbmNoYW5uZWxzCisgICAgICAgICAgICBpZiBuaXRlbXMgKiBzZWxmLl9zYW1wd2lkdGggPiBjaHVuay5jaHVua3NpemUgLSBjaHVuay5zaXplX3JlYWQ6CisgICAgICAgICAgICAgICAgbml0ZW1zID0gKGNodW5rLmNodW5rc2l6ZSAtIGNodW5rLnNpemVfcmVhZCkgLyBzZWxmLl9zYW1wd2lkdGgKKyAgICAgICAgICAgIGRhdGEuZnJvbWZpbGUoY2h1bmsuZmlsZS5maWxlLCBuaXRlbXMpCisgICAgICAgICAgICAjICJ0ZWxsIiBkYXRhIGNodW5rIGhvdyBtdWNoIHdhcyByZWFkCisgICAgICAgICAgICBjaHVuay5zaXplX3JlYWQgPSBjaHVuay5zaXplX3JlYWQgKyBuaXRlbXMgKiBzZWxmLl9zYW1wd2lkdGgKKyAgICAgICAgICAgICMgZG8gdGhlIHNhbWUgZm9yIHRoZSBvdXRlcm1vc3QgY2h1bmsKKyAgICAgICAgICAgIGNodW5rID0gY2h1bmsuZmlsZQorICAgICAgICAgICAgY2h1bmsuc2l6ZV9yZWFkID0gY2h1bmsuc2l6ZV9yZWFkICsgbml0ZW1zICogc2VsZi5fc2FtcHdpZHRoCisgICAgICAgICAgICBkYXRhLmJ5dGVzd2FwKCkKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLnRvc3RyaW5nKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9kYXRhX2NodW5rLnJlYWQobmZyYW1lcyAqIHNlbGYuX2ZyYW1lc2l6ZSkKKyAgICAgICAgaWYgc2VsZi5fY29udmVydCBhbmQgZGF0YToKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9jb252ZXJ0KGRhdGEpCisgICAgICAgIHNlbGYuX3NvdW5kcG9zID0gc2VsZi5fc291bmRwb3MgKyBsZW4oZGF0YSkgLy8gKHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aCkKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgICMKKyAgICAjIEludGVybmFsIG1ldGhvZHMuCisgICAgIworCisgICAgZGVmIF9yZWFkX2ZtdF9jaHVuayhzZWxmLCBjaHVuayk6CisgICAgICAgIHdGb3JtYXRUYWcsIHNlbGYuX25jaGFubmVscywgc2VsZi5fZnJhbWVyYXRlLCBkd0F2Z0J5dGVzUGVyU2VjLCB3QmxvY2tBbGlnbiA9IHN0cnVjdC51bnBhY2soJzxISExMSCcsIGNodW5rLnJlYWQoMTQpKQorICAgICAgICBpZiB3Rm9ybWF0VGFnID09IFdBVkVfRk9STUFUX1BDTToKKyAgICAgICAgICAgIHNhbXB3aWR0aCA9IHN0cnVjdC51bnBhY2soJzxIJywgY2h1bmsucmVhZCgyKSlbMF0KKyAgICAgICAgICAgIHNlbGYuX3NhbXB3aWR0aCA9IChzYW1wd2lkdGggKyA3KSAvLyA4CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3Vua25vd24gZm9ybWF0OiAlcicgJSAod0Zvcm1hdFRhZywpCisgICAgICAgIHNlbGYuX2ZyYW1lc2l6ZSA9IHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aAorICAgICAgICBzZWxmLl9jb21wdHlwZSA9ICdOT05FJworICAgICAgICBzZWxmLl9jb21wbmFtZSA9ICdub3QgY29tcHJlc3NlZCcKKworY2xhc3MgV2F2ZV93cml0ZToKKyAgICAiIiJWYXJpYWJsZXMgdXNlZCBpbiB0aGlzIGNsYXNzOgorCisgICAgVGhlc2UgdmFyaWFibGVzIGFyZSB1c2VyIHNldHRhYmxlIHRocm91Z2ggYXBwcm9wcmlhdGUgbWV0aG9kcworICAgIG9mIHRoaXMgY2xhc3M6CisgICAgX2ZpbGUgLS0gdGhlIG9wZW4gZmlsZSB3aXRoIG1ldGhvZHMgd3JpdGUoKSwgY2xvc2UoKSwgdGVsbCgpLCBzZWVrKCkKKyAgICAgICAgICAgICAgc2V0IHRocm91Z2ggdGhlIF9faW5pdF9fKCkgbWV0aG9kCisgICAgX2NvbXB0eXBlIC0tIHRoZSBBSUZGLUMgY29tcHJlc3Npb24gdHlwZSAoJ05PTkUnIGluIEFJRkYpCisgICAgICAgICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRjb21wdHlwZSgpIG9yIHNldHBhcmFtcygpIG1ldGhvZAorICAgIF9jb21wbmFtZSAtLSB0aGUgaHVtYW4tcmVhZGFibGUgQUlGRi1DIGNvbXByZXNzaW9uIHR5cGUKKyAgICAgICAgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldGNvbXB0eXBlKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgX25jaGFubmVscyAtLSB0aGUgbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzCisgICAgICAgICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRuY2hhbm5lbHMoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICBfc2FtcHdpZHRoIC0tIHRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIGF1ZGlvIHNhbXBsZQorICAgICAgICAgICAgICBzZXQgdGhyb3VnaCB0aGUgc2V0c2FtcHdpZHRoKCkgb3Igc2V0cGFyYW1zKCkgbWV0aG9kCisgICAgX2ZyYW1lcmF0ZSAtLSB0aGUgc2FtcGxpbmcgZnJlcXVlbmN5CisgICAgICAgICAgICAgIHNldCB0aHJvdWdoIHRoZSBzZXRmcmFtZXJhdGUoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKyAgICBfbmZyYW1lcyAtLSB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgICAgICAgc2V0IHRocm91Z2ggdGhlIHNldG5mcmFtZXMoKSBvciBzZXRwYXJhbXMoKSBtZXRob2QKKworICAgIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCBpbnRlcm5hbGx5IG9ubHk6CisgICAgX2RhdGFsZW5ndGggLS0gdGhlIHNpemUgb2YgdGhlIGF1ZGlvIHNhbXBsZXMgd3JpdHRlbiB0byB0aGUgaGVhZGVyCisgICAgX25mcmFtZXN3cml0dGVuIC0tIHRoZSBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHdyaXR0ZW4KKyAgICBfZGF0YXdyaXR0ZW4gLS0gdGhlIHNpemUgb2YgdGhlIGF1ZGlvIHNhbXBsZXMgYWN0dWFsbHkgd3JpdHRlbgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGYpOgorICAgICAgICBzZWxmLl9pX29wZW5lZF90aGVfZmlsZSA9IE5vbmUKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGYgPSBfX2J1aWx0aW5fXy5vcGVuKGYsICd3YicpCisgICAgICAgICAgICBzZWxmLl9pX29wZW5lZF90aGVfZmlsZSA9IGYKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5pbml0ZnAoZikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGU6CisgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQorCisgICAgZGVmIGluaXRmcChzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi5fZmlsZSA9IGZpbGUKKyAgICAgICAgc2VsZi5fY29udmVydCA9IE5vbmUKKyAgICAgICAgc2VsZi5fbmNoYW5uZWxzID0gMAorICAgICAgICBzZWxmLl9zYW1wd2lkdGggPSAwCisgICAgICAgIHNlbGYuX2ZyYW1lcmF0ZSA9IDAKKyAgICAgICAgc2VsZi5fbmZyYW1lcyA9IDAKKyAgICAgICAgc2VsZi5fbmZyYW1lc3dyaXR0ZW4gPSAwCisgICAgICAgIHNlbGYuX2RhdGF3cml0dGVuID0gMAorICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gMAorICAgICAgICBzZWxmLl9oZWFkZXJ3cml0dGVuID0gRmFsc2UKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgICMKKyAgICAjIFVzZXIgdmlzaWJsZSBtZXRob2RzLgorICAgICMKKyAgICBkZWYgc2V0bmNoYW5uZWxzKHNlbGYsIG5jaGFubmVscyk6CisgICAgICAgIGlmIHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIG5jaGFubmVscyA8IDE6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2JhZCAjIG9mIGNoYW5uZWxzJworICAgICAgICBzZWxmLl9uY2hhbm5lbHMgPSBuY2hhbm5lbHMKKworICAgIGRlZiBnZXRuY2hhbm5lbHMoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9uY2hhbm5lbHM6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ251bWJlciBvZiBjaGFubmVscyBub3Qgc2V0JworICAgICAgICByZXR1cm4gc2VsZi5fbmNoYW5uZWxzCisKKyAgICBkZWYgc2V0c2FtcHdpZHRoKHNlbGYsIHNhbXB3aWR0aCk6CisgICAgICAgIGlmIHNlbGYuX2RhdGF3cml0dGVuOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdjYW5ub3QgY2hhbmdlIHBhcmFtZXRlcnMgYWZ0ZXIgc3RhcnRpbmcgdG8gd3JpdGUnCisgICAgICAgIGlmIHNhbXB3aWR0aCA8IDEgb3Igc2FtcHdpZHRoID4gNDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIHNhbXBsZSB3aWR0aCcKKyAgICAgICAgc2VsZi5fc2FtcHdpZHRoID0gc2FtcHdpZHRoCisKKyAgICBkZWYgZ2V0c2FtcHdpZHRoKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fc2FtcHdpZHRoOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICdzYW1wbGUgd2lkdGggbm90IHNldCcKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NhbXB3aWR0aAorCisgICAgZGVmIHNldGZyYW1lcmF0ZShzZWxmLCBmcmFtZXJhdGUpOgorICAgICAgICBpZiBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBmcmFtZXJhdGUgPD0gMDoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnYmFkIGZyYW1lIHJhdGUnCisgICAgICAgIHNlbGYuX2ZyYW1lcmF0ZSA9IGZyYW1lcmF0ZQorCisgICAgZGVmIGdldGZyYW1lcmF0ZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2ZyYW1lcmF0ZToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnZnJhbWUgcmF0ZSBub3Qgc2V0JworICAgICAgICByZXR1cm4gc2VsZi5fZnJhbWVyYXRlCisKKyAgICBkZWYgc2V0bmZyYW1lcyhzZWxmLCBuZnJhbWVzKToKKyAgICAgICAgaWYgc2VsZi5fZGF0YXdyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgc2VsZi5fbmZyYW1lcyA9IG5mcmFtZXMKKworICAgIGRlZiBnZXRuZnJhbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmZyYW1lc3dyaXR0ZW4KKworICAgIGRlZiBzZXRjb21wdHlwZShzZWxmLCBjb21wdHlwZSwgY29tcG5hbWUpOgorICAgICAgICBpZiBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnY2Fubm90IGNoYW5nZSBwYXJhbWV0ZXJzIGFmdGVyIHN0YXJ0aW5nIHRvIHdyaXRlJworICAgICAgICBpZiBjb21wdHlwZSBub3QgaW4gKCdOT05FJywpOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IsICd1bnN1cHBvcnRlZCBjb21wcmVzc2lvbiB0eXBlJworICAgICAgICBzZWxmLl9jb21wdHlwZSA9IGNvbXB0eXBlCisgICAgICAgIHNlbGYuX2NvbXBuYW1lID0gY29tcG5hbWUKKworICAgIGRlZiBnZXRjb21wdHlwZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbXB0eXBlCisKKyAgICBkZWYgZ2V0Y29tcG5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb21wbmFtZQorCisgICAgZGVmIHNldHBhcmFtcyhzZWxmLCBwYXJhbXMpOgorICAgICAgICBuY2hhbm5lbHMsIHNhbXB3aWR0aCwgZnJhbWVyYXRlLCBuZnJhbWVzLCBjb21wdHlwZSwgY29tcG5hbWUgPSBwYXJhbXMKKyAgICAgICAgaWYgc2VsZi5fZGF0YXdyaXR0ZW46CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ2Nhbm5vdCBjaGFuZ2UgcGFyYW1ldGVycyBhZnRlciBzdGFydGluZyB0byB3cml0ZScKKyAgICAgICAgc2VsZi5zZXRuY2hhbm5lbHMobmNoYW5uZWxzKQorICAgICAgICBzZWxmLnNldHNhbXB3aWR0aChzYW1wd2lkdGgpCisgICAgICAgIHNlbGYuc2V0ZnJhbWVyYXRlKGZyYW1lcmF0ZSkKKyAgICAgICAgc2VsZi5zZXRuZnJhbWVzKG5mcmFtZXMpCisgICAgICAgIHNlbGYuc2V0Y29tcHR5cGUoY29tcHR5cGUsIGNvbXBuYW1lKQorCisgICAgZGVmIGdldHBhcmFtcyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX25jaGFubmVscyBvciBub3Qgc2VsZi5fc2FtcHdpZHRoIG9yIG5vdCBzZWxmLl9mcmFtZXJhdGU6CisgICAgICAgICAgICByYWlzZSBFcnJvciwgJ25vdCBhbGwgcGFyYW1ldGVycyBzZXQnCisgICAgICAgIHJldHVybiBzZWxmLl9uY2hhbm5lbHMsIHNlbGYuX3NhbXB3aWR0aCwgc2VsZi5fZnJhbWVyYXRlLCBcCisgICAgICAgICAgICAgIHNlbGYuX25mcmFtZXMsIHNlbGYuX2NvbXB0eXBlLCBzZWxmLl9jb21wbmFtZQorCisgICAgZGVmIHNldG1hcmsoc2VsZiwgaWQsIHBvcywgbmFtZSk6CisgICAgICAgIHJhaXNlIEVycm9yLCAnc2V0bWFyaygpIG5vdCBzdXBwb3J0ZWQnCisKKyAgICBkZWYgZ2V0bWFyayhzZWxmLCBpZCk6CisgICAgICAgIHJhaXNlIEVycm9yLCAnbm8gbWFya3MnCisKKyAgICBkZWYgZ2V0bWFya2VycyhzZWxmKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiB0ZWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbmZyYW1lc3dyaXR0ZW4KKworICAgIGRlZiB3cml0ZWZyYW1lc3JhdyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5fZW5zdXJlX2hlYWRlcl93cml0dGVuKGxlbihkYXRhKSkKKyAgICAgICAgbmZyYW1lcyA9IGxlbihkYXRhKSAvLyAoc2VsZi5fc2FtcHdpZHRoICogc2VsZi5fbmNoYW5uZWxzKQorICAgICAgICBpZiBzZWxmLl9jb252ZXJ0OgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2NvbnZlcnQoZGF0YSkKKyAgICAgICAgaWYgc2VsZi5fc2FtcHdpZHRoID4gMSBhbmQgYmlnX2VuZGlhbjoKKyAgICAgICAgICAgIGltcG9ydCBhcnJheQorICAgICAgICAgICAgZGF0YSA9IGFycmF5LmFycmF5KF9hcnJheV9mbXRzW3NlbGYuX3NhbXB3aWR0aF0sIGRhdGEpCisgICAgICAgICAgICBkYXRhLmJ5dGVzd2FwKCkKKyAgICAgICAgICAgIGRhdGEudG9maWxlKHNlbGYuX2ZpbGUpCisgICAgICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IHNlbGYuX2RhdGF3cml0dGVuICsgbGVuKGRhdGEpICogc2VsZi5fc2FtcHdpZHRoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9maWxlLndyaXRlKGRhdGEpCisgICAgICAgICAgICBzZWxmLl9kYXRhd3JpdHRlbiA9IHNlbGYuX2RhdGF3cml0dGVuICsgbGVuKGRhdGEpCisgICAgICAgIHNlbGYuX25mcmFtZXN3cml0dGVuID0gc2VsZi5fbmZyYW1lc3dyaXR0ZW4gKyBuZnJhbWVzCisKKyAgICBkZWYgd3JpdGVmcmFtZXMoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYud3JpdGVmcmFtZXNyYXcoZGF0YSkKKyAgICAgICAgaWYgc2VsZi5fZGF0YWxlbmd0aCAhPSBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgIHNlbGYuX3BhdGNoaGVhZGVyKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZmlsZToKKyAgICAgICAgICAgIHNlbGYuX2Vuc3VyZV9oZWFkZXJfd3JpdHRlbigwKQorICAgICAgICAgICAgaWYgc2VsZi5fZGF0YWxlbmd0aCAhPSBzZWxmLl9kYXRhd3JpdHRlbjoKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXRjaGhlYWRlcigpCisgICAgICAgICAgICBzZWxmLl9maWxlLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuX2ZpbGUgPSBOb25lCisgICAgICAgIGlmIHNlbGYuX2lfb3BlbmVkX3RoZV9maWxlOgorICAgICAgICAgICAgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGUuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5faV9vcGVuZWRfdGhlX2ZpbGUgPSBOb25lCisKKyAgICAjCisgICAgIyBJbnRlcm5hbCBtZXRob2RzLgorICAgICMKKworICAgIGRlZiBfZW5zdXJlX2hlYWRlcl93cml0dGVuKHNlbGYsIGRhdGFzaXplKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2hlYWRlcndyaXR0ZW46CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fbmNoYW5uZWxzOgorICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAnIyBjaGFubmVscyBub3Qgc3BlY2lmaWVkJworICAgICAgICAgICAgaWYgbm90IHNlbGYuX3NhbXB3aWR0aDoKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3NhbXBsZSB3aWR0aCBub3Qgc3BlY2lmaWVkJworICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZyYW1lcmF0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvciwgJ3NhbXBsaW5nIHJhdGUgbm90IHNwZWNpZmllZCcKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlX2hlYWRlcihkYXRhc2l6ZSkKKworICAgIGRlZiBfd3JpdGVfaGVhZGVyKHNlbGYsIGluaXRsZW5ndGgpOgorICAgICAgICBhc3NlcnQgbm90IHNlbGYuX2hlYWRlcndyaXR0ZW4KKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnUklGRicpCisgICAgICAgIGlmIG5vdCBzZWxmLl9uZnJhbWVzOgorICAgICAgICAgICAgc2VsZi5fbmZyYW1lcyA9IGluaXRsZW5ndGggLyAoc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoKQorICAgICAgICBzZWxmLl9kYXRhbGVuZ3RoID0gc2VsZi5fbmZyYW1lcyAqIHNlbGYuX25jaGFubmVscyAqIHNlbGYuX3NhbXB3aWR0aAorICAgICAgICBzZWxmLl9mb3JtX2xlbmd0aF9wb3MgPSBzZWxmLl9maWxlLnRlbGwoKQorICAgICAgICBzZWxmLl9maWxlLndyaXRlKHN0cnVjdC5wYWNrKCc8TDRzNHNMSEhMTEhINHMnLAorICAgICAgICAgICAgMzYgKyBzZWxmLl9kYXRhbGVuZ3RoLCAnV0FWRScsICdmbXQgJywgMTYsCisgICAgICAgICAgICBXQVZFX0ZPUk1BVF9QQ00sIHNlbGYuX25jaGFubmVscywgc2VsZi5fZnJhbWVyYXRlLAorICAgICAgICAgICAgc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fZnJhbWVyYXRlICogc2VsZi5fc2FtcHdpZHRoLAorICAgICAgICAgICAgc2VsZi5fbmNoYW5uZWxzICogc2VsZi5fc2FtcHdpZHRoLAorICAgICAgICAgICAgc2VsZi5fc2FtcHdpZHRoICogOCwgJ2RhdGEnKSkKKyAgICAgICAgc2VsZi5fZGF0YV9sZW5ndGhfcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzdHJ1Y3QucGFjaygnPEwnLCBzZWxmLl9kYXRhbGVuZ3RoKSkKKyAgICAgICAgc2VsZi5faGVhZGVyd3JpdHRlbiA9IFRydWUKKworICAgIGRlZiBfcGF0Y2hoZWFkZXIoc2VsZik6CisgICAgICAgIGFzc2VydCBzZWxmLl9oZWFkZXJ3cml0dGVuCisgICAgICAgIGlmIHNlbGYuX2RhdGF3cml0dGVuID09IHNlbGYuX2RhdGFsZW5ndGg6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgY3VycG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX2Zvcm1fbGVuZ3RoX3BvcywgMCkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzdHJ1Y3QucGFjaygnPEwnLCAzNiArIHNlbGYuX2RhdGF3cml0dGVuKSkKKyAgICAgICAgc2VsZi5fZmlsZS5zZWVrKHNlbGYuX2RhdGFfbGVuZ3RoX3BvcywgMCkKKyAgICAgICAgc2VsZi5fZmlsZS53cml0ZShzdHJ1Y3QucGFjaygnPEwnLCBzZWxmLl9kYXRhd3JpdHRlbikpCisgICAgICAgIHNlbGYuX2ZpbGUuc2VlayhjdXJwb3MsIDApCisgICAgICAgIHNlbGYuX2RhdGFsZW5ndGggPSBzZWxmLl9kYXRhd3JpdHRlbgorCitkZWYgb3BlbihmLCBtb2RlPU5vbmUpOgorICAgIGlmIG1vZGUgaXMgTm9uZToKKyAgICAgICAgaWYgaGFzYXR0cihmLCAnbW9kZScpOgorICAgICAgICAgICAgbW9kZSA9IGYubW9kZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbW9kZSA9ICdyYicKKyAgICBpZiBtb2RlIGluICgncicsICdyYicpOgorICAgICAgICByZXR1cm4gV2F2ZV9yZWFkKGYpCisgICAgZWxpZiBtb2RlIGluICgndycsICd3YicpOgorICAgICAgICByZXR1cm4gV2F2ZV93cml0ZShmKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEVycm9yLCAibW9kZSBtdXN0IGJlICdyJywgJ3JiJywgJ3cnLCBvciAnd2InIgorCitvcGVuZnAgPSBvcGVuICMgQi9XIGNvbXBhdGliaWxpdHkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2F2ZS5weWMgYi9saWIvcHl0aG9uMi43L3dhdmUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjI1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dhdmUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2F2ZS5weW8gYi9saWIvcHl0aG9uMi43L3dhdmUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNmZmZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dhdmUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2Vha3JlZi5weSBiL2xpYi9weXRob24yLjcvd2Vha3JlZi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGM2MGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93ZWFrcmVmLnB5CkBAIC0wLDAgKzEsMzc5IEBACisiIiJXZWFrIHJlZmVyZW5jZSBzdXBwb3J0IGZvciBQeXRob24uCisKK1RoaXMgbW9kdWxlIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFBFUCAyMDU6CisKK2h0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDIwNS8KKyIiIgorCisjIE5hbWluZyBjb252ZW50aW9uOiBWYXJpYWJsZXMgbmFtZWQgIndyIiBhcmUgd2VhayByZWZlcmVuY2Ugb2JqZWN0czsKKyMgdGhleSBhcmUgY2FsbGVkIHRoaXMgaW5zdGVhZCBvZiAicmVmIiB0byBhdm9pZCBuYW1lIGNvbGxpc2lvbnMgd2l0aAorIyB0aGUgbW9kdWxlLWdsb2JhbCByZWYoKSBmdW5jdGlvbiBpbXBvcnRlZCBmcm9tIF93ZWFrcmVmLgorCitpbXBvcnQgVXNlckRpY3QKKworZnJvbSBfd2Vha3JlZiBpbXBvcnQgKAorICAgICBnZXR3ZWFrcmVmY291bnQsCisgICAgIGdldHdlYWtyZWZzLAorICAgICByZWYsCisgICAgIHByb3h5LAorICAgICBDYWxsYWJsZVByb3h5VHlwZSwKKyAgICAgUHJveHlUeXBlLAorICAgICBSZWZlcmVuY2VUeXBlKQorCitmcm9tIF93ZWFrcmVmc2V0IGltcG9ydCBXZWFrU2V0CisKK2Zyb20gZXhjZXB0aW9ucyBpbXBvcnQgUmVmZXJlbmNlRXJyb3IKKworCitQcm94eVR5cGVzID0gKFByb3h5VHlwZSwgQ2FsbGFibGVQcm94eVR5cGUpCisKK19fYWxsX18gPSBbInJlZiIsICJwcm94eSIsICJnZXR3ZWFrcmVmY291bnQiLCAiZ2V0d2Vha3JlZnMiLAorICAgICAgICAgICAiV2Vha0tleURpY3Rpb25hcnkiLCAiUmVmZXJlbmNlRXJyb3IiLCAiUmVmZXJlbmNlVHlwZSIsICJQcm94eVR5cGUiLAorICAgICAgICAgICAiQ2FsbGFibGVQcm94eVR5cGUiLCAiUHJveHlUeXBlcyIsICJXZWFrVmFsdWVEaWN0aW9uYXJ5IiwgJ1dlYWtTZXQnXQorCisKK2NsYXNzIFdlYWtWYWx1ZURpY3Rpb25hcnkoVXNlckRpY3QuVXNlckRpY3QpOgorICAgICIiIk1hcHBpbmcgY2xhc3MgdGhhdCByZWZlcmVuY2VzIHZhbHVlcyB3ZWFrbHkuCisKKyAgICBFbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5IHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gbm8gc3Ryb25nCisgICAgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSBleGlzdHMgYW55bW9yZQorICAgICIiIgorICAgICMgV2UgaW5oZXJpdCB0aGUgY29uc3RydWN0b3Igd2l0aG91dCB3b3JyeWluZyBhYm91dCB0aGUgaW5wdXQKKyAgICAjIGRpY3Rpb25hcnk7IHNpbmNlIGl0IHVzZXMgb3VyIC51cGRhdGUoKSBtZXRob2QsIHdlIGdldCB0aGUgcmlnaHQKKyAgICAjIGNoZWNrcyAoaWYgdGhlIG90aGVyIGRpY3Rpb25hcnkgaXMgYSBXZWFrVmFsdWVEaWN0aW9uYXJ5LAorICAgICMgb2JqZWN0cyBhcmUgdW53cmFwcGVkIG9uIHRoZSB3YXkgb3V0LCBhbmQgd2UgYWx3YXlzIHdyYXAgb24gdGhlCisgICAgIyB3YXkgaW4pLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KToKKyAgICAgICAgZGVmIHJlbW92ZSh3ciwgc2VsZnJlZj1yZWYoc2VsZikpOgorICAgICAgICAgICAgc2VsZiA9IHNlbGZyZWYoKQorICAgICAgICAgICAgaWYgc2VsZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW3dyLmtleV0KKyAgICAgICAgc2VsZi5fcmVtb3ZlID0gcmVtb3ZlCisgICAgICAgIFVzZXJEaWN0LlVzZXJEaWN0Ll9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIG8gPSBzZWxmLmRhdGFba2V5XSgpCisgICAgICAgIGlmIG8gaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCBrZXkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG8gPSBzZWxmLmRhdGFba2V5XSgpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gbyBpcyBub3QgTm9uZQorCisgICAgZGVmIGhhc19rZXkoc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbyA9IHNlbGYuZGF0YVtrZXldKCkKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBvIGlzIG5vdCBOb25lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPFdlYWtWYWx1ZURpY3Rpb25hcnkgYXQgJXM+IiAlIGlkKHNlbGYpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYuZGF0YVtrZXldID0gS2V5ZWRSZWYodmFsdWUsIHNlbGYuX3JlbW92ZSwga2V5KQorCisgICAgZGVmIGNvcHkoc2VsZik6CisgICAgICAgIG5ldyA9IFdlYWtWYWx1ZURpY3Rpb25hcnkoKQorICAgICAgICBmb3Iga2V5LCB3ciBpbiBzZWxmLmRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIG8gPSB3cigpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5ld1trZXldID0gbworICAgICAgICByZXR1cm4gbmV3CisKKyAgICBfX2NvcHlfXyA9IGNvcHkKKworICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbyk6CisgICAgICAgIGZyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKKyAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oKQorICAgICAgICBmb3Iga2V5LCB3ciBpbiBzZWxmLmRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIG8gPSB3cigpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIG5ld1tkZWVwY29weShrZXksIG1lbW8pXSA9IG8KKyAgICAgICAgcmV0dXJuIG5ldworCisgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyID0gc2VsZi5kYXRhW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG8gPSB3cigpCisgICAgICAgICAgICBpZiBvIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBUaGlzIHNob3VsZCBvbmx5IGhhcHBlbgorICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBvCisKKyAgICBkZWYgaXRlbXMoc2VsZik6CisgICAgICAgIEwgPSBbXQorICAgICAgICBmb3Iga2V5LCB3ciBpbiBzZWxmLmRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIG8gPSB3cigpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKChrZXksIG8pKQorICAgICAgICByZXR1cm4gTAorCisgICAgZGVmIGl0ZXJpdGVtcyhzZWxmKToKKyAgICAgICAgZm9yIHdyIGluIHNlbGYuZGF0YS5pdGVydmFsdWVzKCk6CisgICAgICAgICAgICB2YWx1ZSA9IHdyKCkKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHlpZWxkIHdyLmtleSwgdmFsdWUKKworICAgIGRlZiBpdGVya2V5cyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5pdGVya2V5cygpCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXRlcmtleXMoKQorCisgICAgZGVmIGl0ZXJ2YWx1ZXJlZnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyB0aGUgd2VhayByZWZlcmVuY2VzIHRvIHRoZSB2YWx1ZXMuCisKKyAgICAgICAgVGhlIHJlZmVyZW5jZXMgYXJlIG5vdCBndWFyYW50ZWVkIHRvIGJlICdsaXZlJyBhdCB0aGUgdGltZQorICAgICAgICB0aGV5IGFyZSB1c2VkLCBzbyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIHJlZmVyZW5jZXMgbmVlZHMKKyAgICAgICAgdG8gYmUgY2hlY2tlZCBiZWZvcmUgYmVpbmcgdXNlZC4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXZvaWQKKyAgICAgICAgY3JlYXRpbmcgcmVmZXJlbmNlcyB0aGF0IHdpbGwgY2F1c2UgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvCisgICAgICAgIGtlZXAgdGhlIHZhbHVlcyBhcm91bmQgbG9uZ2VyIHRoYW4gbmVlZGVkLgorCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLml0ZXJ2YWx1ZXMoKQorCisgICAgZGVmIGl0ZXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEuaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgb2JqID0gd3IoKQorICAgICAgICAgICAgaWYgb2JqIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHlpZWxkIG9iagorCisgICAgZGVmIHBvcGl0ZW0oc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBrZXksIHdyID0gc2VsZi5kYXRhLnBvcGl0ZW0oKQorICAgICAgICAgICAgbyA9IHdyKCkKKyAgICAgICAgICAgIGlmIG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleSwgbworCisgICAgZGVmIHBvcChzZWxmLCBrZXksICphcmdzKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbyA9IHNlbGYuZGF0YS5wb3Aoa2V5KSgpCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIGlmIGFyZ3M6CisgICAgICAgICAgICAgICAgcmV0dXJuIGFyZ3NbMF0KKyAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGlmIG8gaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCBrZXkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBvCisKKyAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyID0gc2VsZi5kYXRhW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgc2VsZi5kYXRhW2tleV0gPSBLZXllZFJlZihkZWZhdWx0LCBzZWxmLl9yZW1vdmUsIGtleSkKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gd3IoKQorCisgICAgZGVmIHVwZGF0ZShzZWxmLCBkaWN0PU5vbmUsICoqa3dhcmdzKToKKyAgICAgICAgZCA9IHNlbGYuZGF0YQorICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoZGljdCwgIml0ZW1zIik6CisgICAgICAgICAgICAgICAgZGljdCA9IHR5cGUoe30pKGRpY3QpCisgICAgICAgICAgICBmb3Iga2V5LCBvIGluIGRpY3QuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBkW2tleV0gPSBLZXllZFJlZihvLCBzZWxmLl9yZW1vdmUsIGtleSkKKyAgICAgICAgaWYgbGVuKGt3YXJncyk6CisgICAgICAgICAgICBzZWxmLnVwZGF0ZShrd2FyZ3MpCisKKyAgICBkZWYgdmFsdWVyZWZzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHdlYWsgcmVmZXJlbmNlcyB0byB0aGUgdmFsdWVzLgorCisgICAgICAgIFRoZSByZWZlcmVuY2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSAnbGl2ZScgYXQgdGhlIHRpbWUKKyAgICAgICAgdGhleSBhcmUgdXNlZCwgc28gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSByZWZlcmVuY2VzIG5lZWRzCisgICAgICAgIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGJlaW5nIHVzZWQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkCisgICAgICAgIGNyZWF0aW5nIHJlZmVyZW5jZXMgdGhhdCB3aWxsIGNhdXNlIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0bworICAgICAgICBrZWVwIHRoZSB2YWx1ZXMgYXJvdW5kIGxvbmdlciB0aGFuIG5lZWRlZC4KKworICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS52YWx1ZXMoKQorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEudmFsdWVzKCk6CisgICAgICAgICAgICBvID0gd3IoKQorICAgICAgICAgICAgaWYgbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChvKQorICAgICAgICByZXR1cm4gTAorCisKK2NsYXNzIEtleWVkUmVmKHJlZik6CisgICAgIiIiU3BlY2lhbGl6ZWQgcmVmZXJlbmNlIHRoYXQgaW5jbHVkZXMgYSBrZXkgY29ycmVzcG9uZGluZyB0byB0aGUgdmFsdWUuCisKKyAgICBUaGlzIGlzIHVzZWQgaW4gdGhlIFdlYWtWYWx1ZURpY3Rpb25hcnkgdG8gYXZvaWQgaGF2aW5nIHRvIGNyZWF0ZQorICAgIGEgZnVuY3Rpb24gb2JqZWN0IGZvciBlYWNoIGtleSBzdG9yZWQgaW4gdGhlIG1hcHBpbmcuICBBIHNoYXJlZAorICAgIGNhbGxiYWNrIG9iamVjdCBjYW4gdXNlIHRoZSAna2V5JyBhdHRyaWJ1dGUgb2YgYSBLZXllZFJlZiBpbnN0ZWFkCisgICAgb2YgZ2V0dGluZyBhIHJlZmVyZW5jZSB0byB0aGUga2V5IGZyb20gYW4gZW5jbG9zaW5nIHNjb3BlLgorCisgICAgIiIiCisKKyAgICBfX3Nsb3RzX18gPSAia2V5IiwKKworICAgIGRlZiBfX25ld19fKHR5cGUsIG9iLCBjYWxsYmFjaywga2V5KToKKyAgICAgICAgc2VsZiA9IHJlZi5fX25ld19fKHR5cGUsIG9iLCBjYWxsYmFjaykKKyAgICAgICAgc2VsZi5rZXkgPSBrZXkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYiwgY2FsbGJhY2ssIGtleSk6CisgICAgICAgIHN1cGVyKEtleWVkUmVmLCAgc2VsZikuX19pbml0X18ob2IsIGNhbGxiYWNrKQorCisKK2NsYXNzIFdlYWtLZXlEaWN0aW9uYXJ5KFVzZXJEaWN0LlVzZXJEaWN0KToKKyAgICAiIiIgTWFwcGluZyBjbGFzcyB0aGF0IHJlZmVyZW5jZXMga2V5cyB3ZWFrbHkuCisKKyAgICBFbnRyaWVzIGluIHRoZSBkaWN0aW9uYXJ5IHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gdGhlcmUgaXMgbm8KKyAgICBsb25nZXIgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSBrZXkuIFRoaXMgY2FuIGJlIHVzZWQgdG8KKyAgICBhc3NvY2lhdGUgYWRkaXRpb25hbCBkYXRhIHdpdGggYW4gb2JqZWN0IG93bmVkIGJ5IG90aGVyIHBhcnRzIG9mCisgICAgYW4gYXBwbGljYXRpb24gd2l0aG91dCBhZGRpbmcgYXR0cmlidXRlcyB0byB0aG9zZSBvYmplY3RzLiBUaGlzCisgICAgY2FuIGJlIGVzcGVjaWFsbHkgdXNlZnVsIHdpdGggb2JqZWN0cyB0aGF0IG92ZXJyaWRlIGF0dHJpYnV0ZQorICAgIGFjY2Vzc2VzLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRpY3Q9Tm9uZSk6CisgICAgICAgIHNlbGYuZGF0YSA9IHt9CisgICAgICAgIGRlZiByZW1vdmUoaywgc2VsZnJlZj1yZWYoc2VsZikpOgorICAgICAgICAgICAgc2VsZiA9IHNlbGZyZWYoKQorICAgICAgICAgICAgaWYgc2VsZiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5kYXRhW2tdCisgICAgICAgIHNlbGYuX3JlbW92ZSA9IHJlbW92ZQorICAgICAgICBpZiBkaWN0IGlzIG5vdCBOb25lOiBzZWxmLnVwZGF0ZShkaWN0KQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIGRlbCBzZWxmLmRhdGFbcmVmKGtleSldCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVtyZWYoa2V5KV0KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8V2Vha0tleURpY3Rpb25hcnkgYXQgJXM+IiAlIGlkKHNlbGYpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYuZGF0YVtyZWYoa2V5LCBzZWxmLl9yZW1vdmUpXSA9IHZhbHVlCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgbmV3ID0gV2Vha0tleURpY3Rpb25hcnkoKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLmRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIG8gPSBrZXkoKQorICAgICAgICAgICAgaWYgbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBuZXdbb10gPSB2YWx1ZQorICAgICAgICByZXR1cm4gbmV3CisKKyAgICBfX2NvcHlfXyA9IGNvcHkKKworICAgIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbyk6CisgICAgICAgIGZyb20gY29weSBpbXBvcnQgZGVlcGNvcHkKKyAgICAgICAgbmV3ID0gc2VsZi5fX2NsYXNzX18oKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLmRhdGEuaXRlbXMoKToKKyAgICAgICAgICAgIG8gPSBrZXkoKQorICAgICAgICAgICAgaWYgbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBuZXdbb10gPSBkZWVwY29weSh2YWx1ZSwgbWVtbykKKyAgICAgICAgcmV0dXJuIG5ldworCisgICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuZ2V0KHJlZihrZXkpLGRlZmF1bHQpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICB3ciA9IHJlZihrZXkpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gd3IgaW4gc2VsZi5kYXRhCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsIGtleSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdyID0gcmVmKGtleSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHJldHVybiB3ciBpbiBzZWxmLmRhdGEKKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgbyA9IGtleSgpCisgICAgICAgICAgICBpZiBvIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIEwuYXBwZW5kKChvLCB2YWx1ZSkpCisgICAgICAgIHJldHVybiBMCisKKyAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgorICAgICAgICBmb3Igd3IsIHZhbHVlIGluIHNlbGYuZGF0YS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgIGtleSA9IHdyKCkKKyAgICAgICAgICAgIGlmIGtleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICB5aWVsZCBrZXksIHZhbHVlCisKKyAgICBkZWYgaXRlcmtleXJlZnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhbiBpdGVyYXRvciB0aGF0IHlpZWxkcyB0aGUgd2VhayByZWZlcmVuY2VzIHRvIHRoZSBrZXlzLgorCisgICAgICAgIFRoZSByZWZlcmVuY2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSAnbGl2ZScgYXQgdGhlIHRpbWUKKyAgICAgICAgdGhleSBhcmUgdXNlZCwgc28gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSByZWZlcmVuY2VzIG5lZWRzCisgICAgICAgIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGJlaW5nIHVzZWQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkCisgICAgICAgIGNyZWF0aW5nIHJlZmVyZW5jZXMgdGhhdCB3aWxsIGNhdXNlIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0bworICAgICAgICBrZWVwIHRoZSBrZXlzIGFyb3VuZCBsb25nZXIgdGhhbiBuZWVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEuaXRlcmtleXMoKQorCisgICAgZGVmIGl0ZXJrZXlzKHNlbGYpOgorICAgICAgICBmb3Igd3IgaW4gc2VsZi5kYXRhLml0ZXJrZXlzKCk6CisgICAgICAgICAgICBvYmogPSB3cigpCisgICAgICAgICAgICBpZiBvYmogaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgeWllbGQgb2JqCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLml0ZXJrZXlzKCkKKworICAgIGRlZiBpdGVydmFsdWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhLml0ZXJ2YWx1ZXMoKQorCisgICAgZGVmIGtleXJlZnMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2Ygd2VhayByZWZlcmVuY2VzIHRvIHRoZSBrZXlzLgorCisgICAgICAgIFRoZSByZWZlcmVuY2VzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSAnbGl2ZScgYXQgdGhlIHRpbWUKKyAgICAgICAgdGhleSBhcmUgdXNlZCwgc28gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSByZWZlcmVuY2VzIG5lZWRzCisgICAgICAgIHRvIGJlIGNoZWNrZWQgYmVmb3JlIGJlaW5nIHVzZWQuICBUaGlzIGNhbiBiZSB1c2VkIHRvIGF2b2lkCisgICAgICAgIGNyZWF0aW5nIHJlZmVyZW5jZXMgdGhhdCB3aWxsIGNhdXNlIHRoZSBnYXJiYWdlIGNvbGxlY3RvciB0bworICAgICAgICBrZWVwIHRoZSBrZXlzIGFyb3VuZCBsb25nZXIgdGhhbiBuZWVkZWQuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLmRhdGEua2V5cygpCisKKyAgICBkZWYga2V5cyhzZWxmKToKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciB3ciBpbiBzZWxmLmRhdGEua2V5cygpOgorICAgICAgICAgICAgbyA9IHdyKCkKKyAgICAgICAgICAgIGlmIG8gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgTC5hcHBlbmQobykKKyAgICAgICAgcmV0dXJuIEwKKworICAgIGRlZiBwb3BpdGVtKHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAga2V5LCB2YWx1ZSA9IHNlbGYuZGF0YS5wb3BpdGVtKCkKKyAgICAgICAgICAgIG8gPSBrZXkoKQorICAgICAgICAgICAgaWYgbyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbywgdmFsdWUKKworICAgIGRlZiBwb3Aoc2VsZiwga2V5LCAqYXJncyk6CisgICAgICAgIHJldHVybiBzZWxmLmRhdGEucG9wKHJlZihrZXkpLCAqYXJncykKKworICAgIGRlZiBzZXRkZWZhdWx0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YS5zZXRkZWZhdWx0KHJlZihrZXksIHNlbGYuX3JlbW92ZSksZGVmYXVsdCkKKworICAgIGRlZiB1cGRhdGUoc2VsZiwgZGljdD1Ob25lLCAqKmt3YXJncyk6CisgICAgICAgIGQgPSBzZWxmLmRhdGEKKyAgICAgICAgaWYgZGljdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGRpY3QsICJpdGVtcyIpOgorICAgICAgICAgICAgICAgIGRpY3QgPSB0eXBlKHt9KShkaWN0KQorICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gZGljdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGRbcmVmKGtleSwgc2VsZi5fcmVtb3ZlKV0gPSB2YWx1ZQorICAgICAgICBpZiBsZW4oa3dhcmdzKToKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKGt3YXJncykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2Vha3JlZi5weWMgYi9saWIvcHl0aG9uMi43L3dlYWtyZWYucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MzlhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dlYWtyZWYucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2Vha3JlZi5weW8gYi9saWIvcHl0aG9uMi43L3dlYWtyZWYucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MzlhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dlYWtyZWYucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd2ViYnJvd3Nlci5weSBiL2xpYi9weXRob24yLjcvd2ViYnJvd3Nlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzI3MmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5CkBAIC0wLDAgKzEsNzA0IEBACisjISAvdXNyL2Jpbi9lbnYgcHl0aG9uCisiIiJJbnRlcmZhY2VzIGZvciBsYXVuY2hpbmcgYW5kIHJlbW90ZWx5IGNvbnRyb2xsaW5nIFdlYiBicm93c2Vycy4iIiIKKyMgTWFpbnRhaW5lZCBieSBHZW9yZyBCcmFuZGwuCisKK2ltcG9ydCBvcworaW1wb3J0IHNobGV4CitpbXBvcnQgc3lzCitpbXBvcnQgc3RhdAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0aW1lCisKK19fYWxsX18gPSBbIkVycm9yIiwgIm9wZW4iLCAib3Blbl9uZXciLCAib3Blbl9uZXdfdGFiIiwgImdldCIsICJyZWdpc3RlciJdCisKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgcGFzcworCitfYnJvd3NlcnMgPSB7fSAgICAgICAgICAjIERpY3Rpb25hcnkgb2YgYXZhaWxhYmxlIGJyb3dzZXIgY29udHJvbGxlcnMKK190cnlvcmRlciA9IFtdICAgICAgICAgICMgUHJlZmVyZW5jZSBvcmRlciBvZiBhdmFpbGFibGUgYnJvd3NlcnMKKworZGVmIHJlZ2lzdGVyKG5hbWUsIGtsYXNzLCBpbnN0YW5jZT1Ob25lLCB1cGRhdGVfdHJ5b3JkZXI9MSk6CisgICAgIiIiUmVnaXN0ZXIgYSBicm93c2VyIGNvbm5lY3RvciBhbmQsIG9wdGlvbmFsbHksIGNvbm5lY3Rpb24uIiIiCisgICAgX2Jyb3dzZXJzW25hbWUubG93ZXIoKV0gPSBba2xhc3MsIGluc3RhbmNlXQorICAgIGlmIHVwZGF0ZV90cnlvcmRlciA+IDA6CisgICAgICAgIF90cnlvcmRlci5hcHBlbmQobmFtZSkKKyAgICBlbGlmIHVwZGF0ZV90cnlvcmRlciA8IDA6CisgICAgICAgIF90cnlvcmRlci5pbnNlcnQoMCwgbmFtZSkKKworZGVmIGdldCh1c2luZz1Ob25lKToKKyAgICAiIiJSZXR1cm4gYSBicm93c2VyIGxhdW5jaGVyIGluc3RhbmNlIGFwcHJvcHJpYXRlIGZvciB0aGUgZW52aXJvbm1lbnQuIiIiCisgICAgaWYgdXNpbmcgaXMgbm90IE5vbmU6CisgICAgICAgIGFsdGVybmF0aXZlcyA9IFt1c2luZ10KKyAgICBlbHNlOgorICAgICAgICBhbHRlcm5hdGl2ZXMgPSBfdHJ5b3JkZXIKKyAgICBmb3IgYnJvd3NlciBpbiBhbHRlcm5hdGl2ZXM6CisgICAgICAgIGlmICclcycgaW4gYnJvd3NlcjoKKyAgICAgICAgICAgICMgVXNlciBnYXZlIHVzIGEgY29tbWFuZCBsaW5lLCBzcGxpdCBpdCBpbnRvIG5hbWUgYW5kIGFyZ3MKKyAgICAgICAgICAgIGJyb3dzZXIgPSBzaGxleC5zcGxpdChicm93c2VyKQorICAgICAgICAgICAgaWYgYnJvd3NlclstMV0gPT0gJyYnOgorICAgICAgICAgICAgICAgIHJldHVybiBCYWNrZ3JvdW5kQnJvd3Nlcihicm93c2VyWzotMV0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBHZW5lcmljQnJvd3Nlcihicm93c2VyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVc2VyIGdhdmUgdXMgYSBicm93c2VyIG5hbWUgb3IgcGF0aC4KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gX2Jyb3dzZXJzW2Jyb3dzZXIubG93ZXIoKV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gX3N5bnRoZXNpemUoYnJvd3NlcikKKyAgICAgICAgICAgIGlmIGNvbW1hbmRbMV0gaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRbMV0KKyAgICAgICAgICAgIGVsaWYgY29tbWFuZFswXSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZFswXSgpCisgICAgcmFpc2UgRXJyb3IoImNvdWxkIG5vdCBsb2NhdGUgcnVubmFibGUgYnJvd3NlciIpCisKKyMgUGxlYXNlIG5vdGU6IHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBoaWRlcyBhIGJ1aWx0aW4gZnVuY3Rpb24uCisjIEl0IGlzIHJlY29tbWVuZGVkIG9uZSBkb2VzICJpbXBvcnQgd2ViYnJvd3NlciIgYW5kIHVzZXMgd2ViYnJvd3Nlci5vcGVuKHVybCkKKyMgaW5zdGVhZCBvZiAiZnJvbSB3ZWJicm93c2VyIGltcG9ydCAqIi4KKworZGVmIG9wZW4odXJsLCBuZXc9MCwgYXV0b3JhaXNlPVRydWUpOgorICAgIGZvciBuYW1lIGluIF90cnlvcmRlcjoKKyAgICAgICAgYnJvd3NlciA9IGdldChuYW1lKQorICAgICAgICBpZiBicm93c2VyLm9wZW4odXJsLCBuZXcsIGF1dG9yYWlzZSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHJldHVybiBGYWxzZQorCitkZWYgb3Blbl9uZXcodXJsKToKKyAgICByZXR1cm4gb3Blbih1cmwsIDEpCisKK2RlZiBvcGVuX25ld190YWIodXJsKToKKyAgICByZXR1cm4gb3Blbih1cmwsIDIpCisKKworZGVmIF9zeW50aGVzaXplKGJyb3dzZXIsIHVwZGF0ZV90cnlvcmRlcj0xKToKKyAgICAiIiJBdHRlbXB0IHRvIHN5bnRoZXNpemUgYSBjb250cm9sbGVyIGJhc2Ugb24gZXhpc3RpbmcgY29udHJvbGxlcnMuCisKKyAgICBUaGlzIGlzIHVzZWZ1bCB0byBjcmVhdGUgYSBjb250cm9sbGVyIHdoZW4gYSB1c2VyIHNwZWNpZmllcyBhIHBhdGggdG8KKyAgICBhbiBlbnRyeSBpbiB0aGUgQlJPV1NFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSAtLSB3ZSBjYW4gY29weSBhIGdlbmVyYWwKKyAgICBjb250cm9sbGVyIHRvIG9wZXJhdGUgdXNpbmcgYSBzcGVjaWZpYyBpbnN0YWxsYXRpb24gb2YgdGhlIGRlc2lyZWQKKyAgICBicm93c2VyIGluIHRoaXMgd2F5LgorCisgICAgSWYgd2UgY2FuJ3QgY3JlYXRlIGEgY29udHJvbGxlciBpbiB0aGlzIHdheSwgb3IgaWYgdGhlcmUgaXMgbm8KKyAgICBleGVjdXRhYmxlIGZvciB0aGUgcmVxdWVzdGVkIGJyb3dzZXIsIHJldHVybiBbTm9uZSwgTm9uZV0uCisKKyAgICAiIiIKKyAgICBjbWQgPSBicm93c2VyLnNwbGl0KClbMF0KKyAgICBpZiBub3QgX2lzY29tbWFuZChjbWQpOgorICAgICAgICByZXR1cm4gW05vbmUsIE5vbmVdCisgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoY21kKQorICAgIHRyeToKKyAgICAgICAgY29tbWFuZCA9IF9icm93c2Vyc1tuYW1lLmxvd2VyKCldCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICByZXR1cm4gW05vbmUsIE5vbmVdCisgICAgIyBub3cgYXR0ZW1wdCB0byBjbG9uZSB0byBmaXQgdGhlIG5ldyBuYW1lOgorICAgIGNvbnRyb2xsZXIgPSBjb21tYW5kWzFdCisgICAgaWYgY29udHJvbGxlciBhbmQgbmFtZS5sb3dlcigpID09IGNvbnRyb2xsZXIuYmFzZW5hbWU6CisgICAgICAgIGltcG9ydCBjb3B5CisgICAgICAgIGNvbnRyb2xsZXIgPSBjb3B5LmNvcHkoY29udHJvbGxlcikKKyAgICAgICAgY29udHJvbGxlci5uYW1lID0gYnJvd3NlcgorICAgICAgICBjb250cm9sbGVyLmJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShicm93c2VyKQorICAgICAgICByZWdpc3Rlcihicm93c2VyLCBOb25lLCBjb250cm9sbGVyLCB1cGRhdGVfdHJ5b3JkZXIpCisgICAgICAgIHJldHVybiBbTm9uZSwgY29udHJvbGxlcl0KKyAgICByZXR1cm4gW05vbmUsIE5vbmVdCisKKworaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAid2luIjoKKyAgICBkZWYgX2lzZXhlY3V0YWJsZShjbWQpOgorICAgICAgICBjbWQgPSBjbWQubG93ZXIoKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbWQpIGFuZCBjbWQuZW5kc3dpdGgoKCIuZXhlIiwgIi5iYXQiKSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBmb3IgZXh0IGluICIuZXhlIiwgIi5iYXQiOgorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY21kICsgZXh0KToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKK2Vsc2U6CisgICAgZGVmIF9pc2V4ZWN1dGFibGUoY21kKToKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY21kKToKKyAgICAgICAgICAgIG1vZGUgPSBvcy5zdGF0KGNtZClbc3RhdC5TVF9NT0RFXQorICAgICAgICAgICAgaWYgbW9kZSAmIHN0YXQuU19JWFVTUiBvciBtb2RlICYgc3RhdC5TX0lYR1JQIG9yIG1vZGUgJiBzdGF0LlNfSVhPVEg6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBfaXNjb21tYW5kKGNtZCk6CisgICAgIiIiUmV0dXJuIFRydWUgaWYgY21kIGlzIGV4ZWN1dGFibGUgb3IgY2FuIGJlIGZvdW5kIG9uIHRoZSBleGVjdXRhYmxlCisgICAgc2VhcmNoIHBhdGguIiIiCisgICAgaWYgX2lzZXhlY3V0YWJsZShjbWQpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgIHBhdGggPSBvcy5lbnZpcm9uLmdldCgiUEFUSCIpCisgICAgaWYgbm90IHBhdGg6CisgICAgICAgIHJldHVybiBGYWxzZQorICAgIGZvciBkIGluIHBhdGguc3BsaXQob3MucGF0aHNlcCk6CisgICAgICAgIGV4ZSA9IG9zLnBhdGguam9pbihkLCBjbWQpCisgICAgICAgIGlmIF9pc2V4ZWN1dGFibGUoZXhlKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgcmV0dXJuIEZhbHNlCisKKworIyBHZW5lcmFsIHBhcmVudCBjbGFzc2VzCisKK2NsYXNzIEJhc2VCcm93c2VyKG9iamVjdCk6CisgICAgIiIiUGFyZW50IGNsYXNzIGZvciBhbGwgYnJvd3NlcnMuIERvIG5vdCB1c2UgZGlyZWN0bHkuIiIiCisKKyAgICBhcmdzID0gWyclcyddCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT0iIik6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5iYXNlbmFtZSA9IG5hbWUKKworICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIG9wZW5fbmV3KHNlbGYsIHVybCk6CisgICAgICAgIHJldHVybiBzZWxmLm9wZW4odXJsLCAxKQorCisgICAgZGVmIG9wZW5fbmV3X3RhYihzZWxmLCB1cmwpOgorICAgICAgICByZXR1cm4gc2VsZi5vcGVuKHVybCwgMikKKworCitjbGFzcyBHZW5lcmljQnJvd3NlcihCYXNlQnJvd3Nlcik6CisgICAgIiIiQ2xhc3MgZm9yIGFsbCBicm93c2VycyBzdGFydGVkIHdpdGggYSBjb21tYW5kCisgICAgICAgYW5kIHdpdGhvdXQgcmVtb3RlIGZ1bmN0aW9uYWxpdHkuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgYmFzZXN0cmluZyk6CisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgICAgICBzZWxmLmFyZ3MgPSBbIiVzIl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbmFtZSBzaG91bGQgYmUgYSBsaXN0IHdpdGggYXJndW1lbnRzCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lWzBdCisgICAgICAgICAgICBzZWxmLmFyZ3MgPSBuYW1lWzE6XQorICAgICAgICBzZWxmLmJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShzZWxmLm5hbWUpCisKKyAgICBkZWYgb3BlbihzZWxmLCB1cmwsIG5ldz0wLCBhdXRvcmFpc2U9VHJ1ZSk6CisgICAgICAgIGNtZGxpbmUgPSBbc2VsZi5uYW1lXSArIFthcmcucmVwbGFjZSgiJXMiLCB1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXJnIGluIHNlbGYuYXJnc10KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lLCBjbG9zZV9mZHM9VHJ1ZSkKKyAgICAgICAgICAgIHJldHVybiBub3QgcC53YWl0KCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBCYWNrZ3JvdW5kQnJvd3NlcihHZW5lcmljQnJvd3Nlcik6CisgICAgIiIiQ2xhc3MgZm9yIGFsbCBicm93c2VycyB3aGljaCBhcmUgdG8gYmUgc3RhcnRlZCBpbiB0aGUKKyAgICAgICBiYWNrZ3JvdW5kLiIiIgorCisgICAgZGVmIG9wZW4oc2VsZiwgdXJsLCBuZXc9MCwgYXV0b3JhaXNlPVRydWUpOgorICAgICAgICBjbWRsaW5lID0gW3NlbGYubmFtZV0gKyBbYXJnLnJlcGxhY2UoIiVzIiwgdXJsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLmFyZ3NdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6M10gPT0gJ3dpbic6CisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oY21kbGluZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2V0c2lkID0gZ2V0YXR0cihvcywgJ3NldHNpZCcsIE5vbmUpCisgICAgICAgICAgICAgICAgaWYgbm90IHNldHNpZDoKKyAgICAgICAgICAgICAgICAgICAgc2V0c2lkID0gZ2V0YXR0cihvcywgJ3NldHBncnAnLCBOb25lKQorICAgICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKGNtZGxpbmUsIGNsb3NlX2Zkcz1UcnVlLCBwcmVleGVjX2ZuPXNldHNpZCkKKyAgICAgICAgICAgIHJldHVybiAocC5wb2xsKCkgaXMgTm9uZSkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworCitjbGFzcyBVbml4QnJvd3NlcihCYXNlQnJvd3Nlcik6CisgICAgIiIiUGFyZW50IGNsYXNzIGZvciBhbGwgVW5peCBicm93c2VycyB3aXRoIHJlbW90ZSBmdW5jdGlvbmFsaXR5LiIiIgorCisgICAgcmFpc2Vfb3B0cyA9IE5vbmUKKyAgICByZW1vdGVfYXJncyA9IFsnJWFjdGlvbicsICclcyddCisgICAgcmVtb3RlX2FjdGlvbiA9IE5vbmUKKyAgICByZW1vdGVfYWN0aW9uX25ld3dpbiA9IE5vbmUKKyAgICByZW1vdGVfYWN0aW9uX25ld3RhYiA9IE5vbmUKKyAgICBiYWNrZ3JvdW5kID0gRmFsc2UKKyAgICByZWRpcmVjdF9zdGRvdXQgPSBUcnVlCisKKyAgICBkZWYgX2ludm9rZShzZWxmLCBhcmdzLCByZW1vdGUsIGF1dG9yYWlzZSk6CisgICAgICAgIHJhaXNlX29wdCA9IFtdCisgICAgICAgIGlmIHJlbW90ZSBhbmQgc2VsZi5yYWlzZV9vcHRzOgorICAgICAgICAgICAgIyB1c2UgYXV0b3JhaXNlIGFyZ3VtZW50IG9ubHkgZm9yIHJlbW90ZSBpbnZvY2F0aW9uCisgICAgICAgICAgICBhdXRvcmFpc2UgPSBpbnQoYXV0b3JhaXNlKQorICAgICAgICAgICAgb3B0ID0gc2VsZi5yYWlzZV9vcHRzW2F1dG9yYWlzZV0KKyAgICAgICAgICAgIGlmIG9wdDogcmFpc2Vfb3B0ID0gW29wdF0KKworICAgICAgICBjbWRsaW5lID0gW3NlbGYubmFtZV0gKyByYWlzZV9vcHQgKyBhcmdzCisKKyAgICAgICAgaWYgcmVtb3RlIG9yIHNlbGYuYmFja2dyb3VuZDoKKyAgICAgICAgICAgIGlub3V0ID0gZmlsZShvcy5kZXZudWxsLCAicisiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBmb3IgVFRZIGJyb3dzZXJzLCB3ZSBuZWVkIHN0ZGluL291dAorICAgICAgICAgICAgaW5vdXQgPSBOb25lCisgICAgICAgICMgaWYgcG9zc2libGUsIHB1dCBicm93c2VyIGluIHNlcGFyYXRlIHByb2Nlc3MgZ3JvdXAsIHNvCisgICAgICAgICMga2V5Ym9hcmQgaW50ZXJydXB0cyBkb24ndCBhZmZlY3QgYnJvd3NlciBhcyB3ZWxsIGFzIFB5dGhvbgorICAgICAgICBzZXRzaWQgPSBnZXRhdHRyKG9zLCAnc2V0c2lkJywgTm9uZSkKKyAgICAgICAgaWYgbm90IHNldHNpZDoKKyAgICAgICAgICAgIHNldHNpZCA9IGdldGF0dHIob3MsICdzZXRwZ3JwJywgTm9uZSkKKworICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3BlbihjbWRsaW5lLCBjbG9zZV9mZHM9VHJ1ZSwgc3RkaW49aW5vdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD0oc2VsZi5yZWRpcmVjdF9zdGRvdXQgYW5kIGlub3V0IG9yIE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnI9aW5vdXQsIHByZWV4ZWNfZm49c2V0c2lkKQorICAgICAgICBpZiByZW1vdGU6CisgICAgICAgICAgICAjIHdhaXQgZml2ZSBzZWNvbmRzLiBJZiB0aGUgc3VicHJvY2VzcyBpcyBub3QgZmluaXNoZWQsIHRoZQorICAgICAgICAgICAgIyByZW1vdGUgaW52b2NhdGlvbiBoYXMgKGhvcGVmdWxseSkgc3RhcnRlZCBhIG5ldyBpbnN0YW5jZS4KKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMSkKKyAgICAgICAgICAgIHJjID0gcC5wb2xsKCkKKyAgICAgICAgICAgIGlmIHJjIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgdGltZS5zbGVlcCg0KQorICAgICAgICAgICAgICAgIHJjID0gcC5wb2xsKCkKKyAgICAgICAgICAgICAgICBpZiByYyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgIyBpZiByZW1vdGUgY2FsbCBmYWlsZWQsIG9wZW4oKSB3aWxsIHRyeSBkaXJlY3QgaW52b2NhdGlvbgorICAgICAgICAgICAgcmV0dXJuIG5vdCByYworICAgICAgICBlbGlmIHNlbGYuYmFja2dyb3VuZDoKKyAgICAgICAgICAgIGlmIHAucG9sbCgpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbm90IHAud2FpdCgpCisKKyAgICBkZWYgb3BlbihzZWxmLCB1cmwsIG5ldz0wLCBhdXRvcmFpc2U9VHJ1ZSk6CisgICAgICAgIGlmIG5ldyA9PSAwOgorICAgICAgICAgICAgYWN0aW9uID0gc2VsZi5yZW1vdGVfYWN0aW9uCisgICAgICAgIGVsaWYgbmV3ID09IDE6CisgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLnJlbW90ZV9hY3Rpb25fbmV3d2luCisgICAgICAgIGVsaWYgbmV3ID09IDI6CisgICAgICAgICAgICBpZiBzZWxmLnJlbW90ZV9hY3Rpb25fbmV3dGFiIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYWN0aW9uID0gc2VsZi5yZW1vdGVfYWN0aW9uX25ld3dpbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhY3Rpb24gPSBzZWxmLnJlbW90ZV9hY3Rpb25fbmV3dGFiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBFcnJvcigiQmFkICduZXcnIHBhcmFtZXRlciB0byBvcGVuKCk7ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIDAsIDEsIG9yIDIsIGdvdCAlcyIgJSBuZXcpCisKKyAgICAgICAgYXJncyA9IFthcmcucmVwbGFjZSgiJXMiLCB1cmwpLnJlcGxhY2UoIiVhY3Rpb24iLCBhY3Rpb24pCisgICAgICAgICAgICAgICAgZm9yIGFyZyBpbiBzZWxmLnJlbW90ZV9hcmdzXQorICAgICAgICBzdWNjZXNzID0gc2VsZi5faW52b2tlKGFyZ3MsIFRydWUsIGF1dG9yYWlzZSkKKyAgICAgICAgaWYgbm90IHN1Y2Nlc3M6CisgICAgICAgICAgICAjIHJlbW90ZSBpbnZvY2F0aW9uIGZhaWxlZCwgdHJ5IHN0cmFpZ2h0IHdheQorICAgICAgICAgICAgYXJncyA9IFthcmcucmVwbGFjZSgiJXMiLCB1cmwpIGZvciBhcmcgaW4gc2VsZi5hcmdzXQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ludm9rZShhcmdzLCBGYWxzZSwgRmFsc2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisKK2NsYXNzIE1vemlsbGEoVW5peEJyb3dzZXIpOgorICAgICIiIkxhdW5jaGVyIGNsYXNzIGZvciBNb3ppbGxhL05ldHNjYXBlIGJyb3dzZXJzLiIiIgorCisgICAgcmFpc2Vfb3B0cyA9IFsiLW5vcmFpc2UiLCAiLXJhaXNlIl0KKyAgICByZW1vdGVfYXJncyA9IFsnLXJlbW90ZScsICdvcGVuVVJMKCVzJWFjdGlvbiknXQorICAgIHJlbW90ZV9hY3Rpb24gPSAiIgorICAgIHJlbW90ZV9hY3Rpb25fbmV3d2luID0gIixuZXctd2luZG93IgorICAgIHJlbW90ZV9hY3Rpb25fbmV3dGFiID0gIixuZXctdGFiIgorICAgIGJhY2tncm91bmQgPSBUcnVlCisKK05ldHNjYXBlID0gTW96aWxsYQorCisKK2NsYXNzIEdhbGVvbihVbml4QnJvd3Nlcik6CisgICAgIiIiTGF1bmNoZXIgY2xhc3MgZm9yIEdhbGVvbi9FcGlwaGFueSBicm93c2Vycy4iIiIKKworICAgIHJhaXNlX29wdHMgPSBbIi1ub3JhaXNlIiwgIiJdCisgICAgcmVtb3RlX2FyZ3MgPSBbJyVhY3Rpb24nLCAnJXMnXQorICAgIHJlbW90ZV9hY3Rpb24gPSAiLW4iCisgICAgcmVtb3RlX2FjdGlvbl9uZXd3aW4gPSAiLXciCisgICAgYmFja2dyb3VuZCA9IFRydWUKKworCitjbGFzcyBDaHJvbWUoVW5peEJyb3dzZXIpOgorICAgICJMYXVuY2hlciBjbGFzcyBmb3IgR29vZ2xlIENocm9tZSBicm93c2VyLiIKKworICAgIHJlbW90ZV9hcmdzID0gWyclYWN0aW9uJywgJyVzJ10KKyAgICByZW1vdGVfYWN0aW9uID0gIiIKKyAgICByZW1vdGVfYWN0aW9uX25ld3dpbiA9ICItLW5ldy13aW5kb3ciCisgICAgcmVtb3RlX2FjdGlvbl9uZXd0YWIgPSAiIgorICAgIGJhY2tncm91bmQgPSBUcnVlCisKK0Nocm9taXVtID0gQ2hyb21lCisKKworY2xhc3MgT3BlcmEoVW5peEJyb3dzZXIpOgorICAgICJMYXVuY2hlciBjbGFzcyBmb3IgT3BlcmEgYnJvd3Nlci4iCisKKyAgICByYWlzZV9vcHRzID0gWyItbm9yYWlzZSIsICIiXQorICAgIHJlbW90ZV9hcmdzID0gWyctcmVtb3RlJywgJ29wZW5VUkwoJXMlYWN0aW9uKSddCisgICAgcmVtb3RlX2FjdGlvbiA9ICIiCisgICAgcmVtb3RlX2FjdGlvbl9uZXd3aW4gPSAiLG5ldy13aW5kb3ciCisgICAgcmVtb3RlX2FjdGlvbl9uZXd0YWIgPSAiLG5ldy1wYWdlIgorICAgIGJhY2tncm91bmQgPSBUcnVlCisKKworY2xhc3MgRWxpbmtzKFVuaXhCcm93c2VyKToKKyAgICAiTGF1bmNoZXIgY2xhc3MgZm9yIEVsaW5rcyBicm93c2Vycy4iCisKKyAgICByZW1vdGVfYXJncyA9IFsnLXJlbW90ZScsICdvcGVuVVJMKCVzJWFjdGlvbiknXQorICAgIHJlbW90ZV9hY3Rpb24gPSAiIgorICAgIHJlbW90ZV9hY3Rpb25fbmV3d2luID0gIixuZXctd2luZG93IgorICAgIHJlbW90ZV9hY3Rpb25fbmV3dGFiID0gIixuZXctdGFiIgorICAgIGJhY2tncm91bmQgPSBGYWxzZQorCisgICAgIyBlbGlua3MgZG9lc24ndCBsaWtlIGl0cyBzdGRvdXQgdG8gYmUgcmVkaXJlY3RlZCAtCisgICAgIyBpdCB1c2VzIHJlZGlyZWN0ZWQgc3Rkb3V0IGFzIGEgc2lnbmFsIHRvIGRvIC1kdW1wCisgICAgcmVkaXJlY3Rfc3Rkb3V0ID0gRmFsc2UKKworCitjbGFzcyBLb25xdWVyb3IoQmFzZUJyb3dzZXIpOgorICAgICIiIkNvbnRyb2xsZXIgZm9yIHRoZSBLREUgRmlsZSBNYW5hZ2VyIChrZm0sIG9yIEtvbnF1ZXJvcikuCisKKyAgICBTZWUgdGhlIG91dHB1dCBvZiBgYGtmbWNsaWVudCAtLWNvbW1hbmRzYGAKKyAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgS29ucXVlcm9yIHJlbW90ZS1jb250cm9sIGludGVyZmFjZS4KKyAgICAiIiIKKworICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgIyBYWFggQ3VycmVudGx5IEkga25vdyBubyB3YXkgdG8gcHJldmVudCBLRk0gZnJvbSBvcGVuaW5nIGEgbmV3IHdpbi4KKyAgICAgICAgaWYgbmV3ID09IDI6CisgICAgICAgICAgICBhY3Rpb24gPSAibmV3VGFiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYWN0aW9uID0gIm9wZW5VUkwiCisKKyAgICAgICAgZGV2bnVsbCA9IGZpbGUob3MuZGV2bnVsbCwgInIrIikKKyAgICAgICAgIyBpZiBwb3NzaWJsZSwgcHV0IGJyb3dzZXIgaW4gc2VwYXJhdGUgcHJvY2VzcyBncm91cCwgc28KKyAgICAgICAgIyBrZXlib2FyZCBpbnRlcnJ1cHRzIGRvbid0IGFmZmVjdCBicm93c2VyIGFzIHdlbGwgYXMgUHl0aG9uCisgICAgICAgIHNldHNpZCA9IGdldGF0dHIob3MsICdzZXRzaWQnLCBOb25lKQorICAgICAgICBpZiBub3Qgc2V0c2lkOgorICAgICAgICAgICAgc2V0c2lkID0gZ2V0YXR0cihvcywgJ3NldHBncnAnLCBOb25lKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsia2ZtY2xpZW50IiwgYWN0aW9uLCB1cmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPVRydWUsIHN0ZGluPWRldm51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9ZGV2bnVsbCwgc3RkZXJyPWRldm51bGwpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgIyBmYWxsIHRocm91Z2ggdG8gbmV4dCB2YXJpYW50CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwLndhaXQoKQorICAgICAgICAgICAgIyBrZm1jbGllbnQncyByZXR1cm4gY29kZSB1bmZvcnR1bmF0ZWx5IGhhcyBubyBtZWFuaW5nIGFzIGl0IHNlZW1zCisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFsia29ucXVlcm9yIiwgIi0tc2lsZW50IiwgdXJsXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlX2Zkcz1UcnVlLCBzdGRpbj1kZXZudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PWRldm51bGwsIHN0ZGVycj1kZXZudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZXhlY19mbj1zZXRzaWQpCisgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgorICAgICAgICAgICAgIyBmYWxsIHRocm91Z2ggdG8gbmV4dCB2YXJpYW50CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwLnBvbGwoKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgU2hvdWxkIGJlIHJ1bm5pbmcgbm93LgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oWyJrZm0iLCAiLWQiLCB1cmxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VfZmRzPVRydWUsIHN0ZGluPWRldm51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9ZGV2bnVsbCwgc3RkZXJyPWRldm51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVleGVjX2ZuPXNldHNpZCkKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAocC5wb2xsKCkgaXMgTm9uZSkKKworCitjbGFzcyBHcmFpbChCYXNlQnJvd3Nlcik6CisgICAgIyBUaGVyZSBzaG91bGQgYmUgYSB3YXkgdG8gbWFpbnRhaW4gYSBjb25uZWN0aW9uIHRvIEdyYWlsLCBidXQgdGhlCisgICAgIyBHcmFpbCByZW1vdGUgY29udHJvbCBwcm90b2NvbCBkb2Vzbid0IHJlYWxseSBhbGxvdyB0aGF0IGF0IHRoaXMKKyAgICAjIHBvaW50LiAgSXQgcHJvYmFibHkgbmV2ZXIgd2lsbCEKKyAgICBkZWYgX2ZpbmRfZ3JhaWxfcmMoc2VsZik6CisgICAgICAgIGltcG9ydCBnbG9iCisgICAgICAgIGltcG9ydCBwd2QKKyAgICAgICAgaW1wb3J0IHNvY2tldAorICAgICAgICBpbXBvcnQgdGVtcGZpbGUKKyAgICAgICAgdGVtcGRpciA9IG9zLnBhdGguam9pbih0ZW1wZmlsZS5nZXR0ZW1wZGlyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5ncmFpbC11bml4IikKKyAgICAgICAgdXNlciA9IHB3ZC5nZXRwd3VpZChvcy5nZXR1aWQoKSlbMF0KKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odGVtcGRpciwgdXNlciArICItKiIpCisgICAgICAgIG1heWJlcyA9IGdsb2IuZ2xvYihmaWxlbmFtZSkKKyAgICAgICAgaWYgbm90IG1heWJlczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9VTklYLCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIGZvciBmbiBpbiBtYXliZXM6CisgICAgICAgICAgICAjIG5lZWQgdG8gUElORyBlYWNoIG9uZSB1bnRpbCB3ZSBmaW5kIG9uZSB0aGF0J3MgbGl2ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHMuY29ubmVjdChmbikKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgICAgICAgICAgIyBubyBnb29kOyBhdHRlbXB0IHRvIGNsZWFuIGl0IG91dCwgYnV0IGRvbid0IGZhaWw6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZm4pCisgICAgICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHMKKworICAgIGRlZiBfcmVtb3RlKHNlbGYsIGFjdGlvbik6CisgICAgICAgIHMgPSBzZWxmLl9maW5kX2dyYWlsX3JjKCkKKyAgICAgICAgaWYgbm90IHM6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBzLnNlbmQoYWN0aW9uKQorICAgICAgICBzLmNsb3NlKCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgaWYgbmV3OgorICAgICAgICAgICAgb2sgPSBzZWxmLl9yZW1vdGUoIkxPQURORVcgIiArIHVybCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG9rID0gc2VsZi5fcmVtb3RlKCJMT0FEICIgKyB1cmwpCisgICAgICAgIHJldHVybiBvaworCisKKyMKKyMgUGxhdGZvcm0gc3VwcG9ydCBmb3IgVW5peAorIworCisjIFRoZXNlIGFyZSB0aGUgcmlnaHQgdGVzdHMgYmVjYXVzZSBhbGwgdGhlc2UgVW5peCBicm93c2VycyByZXF1aXJlIGVpdGhlcgorIyBhIGNvbnNvbGUgdGVybWluYWwgb3IgYW4gWCBkaXNwbGF5IHRvIHJ1bi4KKworZGVmIHJlZ2lzdGVyX1hfYnJvd3NlcnMoKToKKworICAgICMgdXNlIHhkZy1vcGVuIGlmIGFyb3VuZAorICAgIGlmIF9pc2NvbW1hbmQoInhkZy1vcGVuIik6CisgICAgICAgIHJlZ2lzdGVyKCJ4ZGctb3BlbiIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKCJ4ZGctb3BlbiIpKQorCisgICAgIyBUaGUgZGVmYXVsdCBHTk9NRTMgYnJvd3NlcgorICAgIGlmICJHTk9NRV9ERVNLVE9QX1NFU1NJT05fSUQiIGluIG9zLmVudmlyb24gYW5kIF9pc2NvbW1hbmQoImd2ZnMtb3BlbiIpOgorICAgICAgICByZWdpc3RlcigiZ3Zmcy1vcGVuIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoImd2ZnMtb3BlbiIpKQorCisgICAgIyBUaGUgZGVmYXVsdCBHTk9NRSBicm93c2VyCisgICAgaWYgIkdOT01FX0RFU0tUT1BfU0VTU0lPTl9JRCIgaW4gb3MuZW52aXJvbiBhbmQgX2lzY29tbWFuZCgiZ25vbWUtb3BlbiIpOgorICAgICAgICByZWdpc3RlcigiZ25vbWUtb3BlbiIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKCJnbm9tZS1vcGVuIikpCisKKyAgICAjIFRoZSBkZWZhdWx0IEtERSBicm93c2VyCisgICAgaWYgIktERV9GVUxMX1NFU1NJT04iIGluIG9zLmVudmlyb24gYW5kIF9pc2NvbW1hbmQoImtmbWNsaWVudCIpOgorICAgICAgICByZWdpc3Rlcigia2ZtY2xpZW50IiwgS29ucXVlcm9yLCBLb25xdWVyb3IoImtmbWNsaWVudCIpKQorCisgICAgaWYgX2lzY29tbWFuZCgieC13d3ctYnJvd3NlciIpOgorICAgICAgICByZWdpc3RlcigieC13d3ctYnJvd3NlciIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKCJ4LXd3dy1icm93c2VyIikpCisKKyAgICAjIFRoZSBNb3ppbGxhL05ldHNjYXBlIGJyb3dzZXJzCisgICAgZm9yIGJyb3dzZXIgaW4gKCJtb3ppbGxhLWZpcmVmb3giLCAiZmlyZWZveCIsCisgICAgICAgICAgICAgICAgICAgICJtb3ppbGxhLWZpcmViaXJkIiwgImZpcmViaXJkIiwKKyAgICAgICAgICAgICAgICAgICAgImljZXdlYXNlbCIsICJpY2VhcGUiLAorICAgICAgICAgICAgICAgICAgICAic2VhbW9ua2V5IiwgIm1vemlsbGEiLCAibmV0c2NhcGUiKToKKyAgICAgICAgaWYgX2lzY29tbWFuZChicm93c2VyKToKKyAgICAgICAgICAgIHJlZ2lzdGVyKGJyb3dzZXIsIE5vbmUsIE1vemlsbGEoYnJvd3NlcikpCisKKyAgICAjIEtvbnF1ZXJvci9rZm0sIHRoZSBLREUgYnJvd3Nlci4KKyAgICBpZiBfaXNjb21tYW5kKCJrZm0iKToKKyAgICAgICAgcmVnaXN0ZXIoImtmbSIsIEtvbnF1ZXJvciwgS29ucXVlcm9yKCJrZm0iKSkKKyAgICBlbGlmIF9pc2NvbW1hbmQoImtvbnF1ZXJvciIpOgorICAgICAgICByZWdpc3Rlcigia29ucXVlcm9yIiwgS29ucXVlcm9yLCBLb25xdWVyb3IoImtvbnF1ZXJvciIpKQorCisgICAgIyBHbm9tZSdzIEdhbGVvbiBhbmQgRXBpcGhhbnkKKyAgICBmb3IgYnJvd3NlciBpbiAoImdhbGVvbiIsICJlcGlwaGFueSIpOgorICAgICAgICBpZiBfaXNjb21tYW5kKGJyb3dzZXIpOgorICAgICAgICAgICAgcmVnaXN0ZXIoYnJvd3NlciwgTm9uZSwgR2FsZW9uKGJyb3dzZXIpKQorCisgICAgIyBTa2lwc3RvbmUsIGFub3RoZXIgR3RrL01vemlsbGEgYmFzZWQgYnJvd3NlcgorICAgIGlmIF9pc2NvbW1hbmQoInNraXBzdG9uZSIpOgorICAgICAgICByZWdpc3Rlcigic2tpcHN0b25lIiwgTm9uZSwgQmFja2dyb3VuZEJyb3dzZXIoInNraXBzdG9uZSIpKQorCisgICAgIyBHb29nbGUgQ2hyb21lL0Nocm9taXVtIGJyb3dzZXJzCisgICAgZm9yIGJyb3dzZXIgaW4gKCJnb29nbGUtY2hyb21lIiwgImNocm9tZSIsICJjaHJvbWl1bSIsICJjaHJvbWl1bS1icm93c2VyIik6CisgICAgICAgIGlmIF9pc2NvbW1hbmQoYnJvd3Nlcik6CisgICAgICAgICAgICByZWdpc3Rlcihicm93c2VyLCBOb25lLCBDaHJvbWUoYnJvd3NlcikpCisKKyAgICAjIE9wZXJhLCBxdWl0ZSBwb3B1bGFyCisgICAgaWYgX2lzY29tbWFuZCgib3BlcmEiKToKKyAgICAgICAgcmVnaXN0ZXIoIm9wZXJhIiwgTm9uZSwgT3BlcmEoIm9wZXJhIikpCisKKyAgICAjIE5leHQsIE1vc2FpYyAtLSBvbGQgYnV0IHN0aWxsIGluIHVzZS4KKyAgICBpZiBfaXNjb21tYW5kKCJtb3NhaWMiKToKKyAgICAgICAgcmVnaXN0ZXIoIm1vc2FpYyIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKCJtb3NhaWMiKSkKKworICAgICMgR3JhaWwsIHRoZSBQeXRob24gYnJvd3Nlci4gRG9lcyBhbnlib2R5IHN0aWxsIHVzZSBpdD8KKyAgICBpZiBfaXNjb21tYW5kKCJncmFpbCIpOgorICAgICAgICByZWdpc3RlcigiZ3JhaWwiLCBHcmFpbCwgTm9uZSkKKworIyBQcmVmZXIgWCBicm93c2VycyBpZiBwcmVzZW50CitpZiBvcy5lbnZpcm9uLmdldCgiRElTUExBWSIpOgorICAgIHJlZ2lzdGVyX1hfYnJvd3NlcnMoKQorCisjIEFsc28gdHJ5IGNvbnNvbGUgYnJvd3NlcnMKK2lmIG9zLmVudmlyb24uZ2V0KCJURVJNIik6CisgICAgaWYgX2lzY29tbWFuZCgid3d3LWJyb3dzZXIiKToKKyAgICAgICAgcmVnaXN0ZXIoInd3dy1icm93c2VyIiwgTm9uZSwgR2VuZXJpY0Jyb3dzZXIoInd3dy1icm93c2VyIikpCisgICAgIyBUaGUgTGlua3MvZWxpbmtzIGJyb3dzZXJzIDxodHRwOi8vYXJ0YXgua2FybGluLm1mZi5jdW5pLmN6L35taWt1bGFzL2xpbmtzLz4KKyAgICBpZiBfaXNjb21tYW5kKCJsaW5rcyIpOgorICAgICAgICByZWdpc3RlcigibGlua3MiLCBOb25lLCBHZW5lcmljQnJvd3NlcigibGlua3MiKSkKKyAgICBpZiBfaXNjb21tYW5kKCJlbGlua3MiKToKKyAgICAgICAgcmVnaXN0ZXIoImVsaW5rcyIsIE5vbmUsIEVsaW5rcygiZWxpbmtzIikpCisgICAgIyBUaGUgTHlueCBicm93c2VyIDxodHRwOi8vbHlueC5pc2Mub3JnLz4sIDxodHRwOi8vbHlueC5icm93c2VyLm9yZy8+CisgICAgaWYgX2lzY29tbWFuZCgibHlueCIpOgorICAgICAgICByZWdpc3RlcigibHlueCIsIE5vbmUsIEdlbmVyaWNCcm93c2VyKCJseW54IikpCisgICAgIyBUaGUgdzNtIGJyb3dzZXIgPGh0dHA6Ly93M20uc291cmNlZm9yZ2UubmV0Lz4KKyAgICBpZiBfaXNjb21tYW5kKCJ3M20iKToKKyAgICAgICAgcmVnaXN0ZXIoInczbSIsIE5vbmUsIEdlbmVyaWNCcm93c2VyKCJ3M20iKSkKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0IGZvciBXaW5kb3dzCisjCisKK2lmIHN5cy5wbGF0Zm9ybVs6M10gPT0gIndpbiI6CisgICAgY2xhc3MgV2luZG93c0RlZmF1bHQoQmFzZUJyb3dzZXIpOgorICAgICAgICBkZWYgb3BlbihzZWxmLCB1cmwsIG5ldz0wLCBhdXRvcmFpc2U9VHJ1ZSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3Muc3RhcnRmaWxlKHVybCkKKyAgICAgICAgICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICAgICAgICAgIyBbRXJyb3IgMjJdIE5vIGFwcGxpY2F0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICAgICAgICAgICAgIyBmaWxlIGZvciB0aGlzIG9wZXJhdGlvbjogJzxVUkw+JworICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgX3RyeW9yZGVyID0gW10KKyAgICBfYnJvd3NlcnMgPSB7fQorCisgICAgIyBGaXJzdCB0cnkgdG8gdXNlIHRoZSBkZWZhdWx0IFdpbmRvd3MgYnJvd3NlcgorICAgIHJlZ2lzdGVyKCJ3aW5kb3dzLWRlZmF1bHQiLCBXaW5kb3dzRGVmYXVsdCkKKworICAgICMgRGV0ZWN0IHNvbWUgY29tbW9uIFdpbmRvd3MgYnJvd3NlcnMsIGZhbGxiYWNrIHRvIElFCisgICAgaWV4cGxvcmUgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvbi5nZXQoIlBST0dSQU1GSUxFUyIsICJDOlxcUHJvZ3JhbSBGaWxlcyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcm5ldCBFeHBsb3JlclxcSUVYUExPUkUuRVhFIikKKyAgICBmb3IgYnJvd3NlciBpbiAoImZpcmVmb3giLCAiZmlyZWJpcmQiLCAic2VhbW9ua2V5IiwgIm1vemlsbGEiLAorICAgICAgICAgICAgICAgICAgICAibmV0c2NhcGUiLCAib3BlcmEiLCBpZXhwbG9yZSk6CisgICAgICAgIGlmIF9pc2NvbW1hbmQoYnJvd3Nlcik6CisgICAgICAgICAgICByZWdpc3Rlcihicm93c2VyLCBOb25lLCBCYWNrZ3JvdW5kQnJvd3Nlcihicm93c2VyKSkKKworIworIyBQbGF0Zm9ybSBzdXBwb3J0IGZvciBNYWNPUworIworCitpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgIyBBZGFwdGVkIGZyb20gcGF0Y2ggc3VibWl0dGVkIHRvIFNvdXJjZUZvcmdlIGJ5IFN0ZXZlbiBKLiBCdXJyCisgICAgY2xhc3MgTWFjT1NYKEJhc2VCcm93c2VyKToKKyAgICAgICAgIiIiTGF1bmNoZXIgY2xhc3MgZm9yIEFxdWEgYnJvd3NlcnMgb24gTWFjIE9TIFgKKworICAgICAgICBPcHRpb25hbGx5IHNwZWNpZnkgYSBicm93c2VyIG5hbWUgb24gaW5zdGFudGlhdGlvbi4gIE5vdGUgdGhhdCB0aGlzCisgICAgICAgIHdpbGwgbm90IHdvcmsgZm9yIEFxdWEgYnJvd3NlcnMgaWYgdGhlIHVzZXIgaGFzIG1vdmVkIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICBwYWNrYWdlIGFmdGVyIGluc3RhbGxhdGlvbi4KKworICAgICAgICBJZiBubyBicm93c2VyIGlzIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgYnJvd3NlciwgYXMgc3BlY2lmaWVkIGluIHRoZQorICAgICAgICBJbnRlcm5ldCBTeXN0ZW0gUHJlZmVyZW5jZXMgcGFuZWwsIHdpbGwgYmUgdXNlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgICAgICBkZWYgb3BlbihzZWxmLCB1cmwsIG5ldz0wLCBhdXRvcmFpc2U9VHJ1ZSk6CisgICAgICAgICAgICBhc3NlcnQgIiciIG5vdCBpbiB1cmwKKyAgICAgICAgICAgICMgaGFjayBmb3IgbG9jYWwgdXJscworICAgICAgICAgICAgaWYgbm90ICc6JyBpbiB1cmw6CisgICAgICAgICAgICAgICAgdXJsID0gJ2ZpbGU6Jyt1cmwKKworICAgICAgICAgICAgIyBuZXcgbXVzdCBiZSAwIG9yIDEKKyAgICAgICAgICAgIG5ldyA9IGludChib29sKG5ldykpCisgICAgICAgICAgICBpZiBzZWxmLm5hbWUgPT0gImRlZmF1bHQiOgorICAgICAgICAgICAgICAgICMgVXNlciBjYWxsZWQgb3Blbiwgb3Blbl9uZXcgb3IgZ2V0IHdpdGhvdXQgYSBicm93c2VyIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIHNjcmlwdCA9ICdvcGVuIGxvY2F0aW9uICIlcyInICUgdXJsLnJlcGxhY2UoJyInLCAnJTIyJykgIyBvcGVucyBpbiBkZWZhdWx0IGJyb3dzZXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBVc2VyIGNhbGxlZCBnZXQgYW5kIGNob3NlIGEgYnJvd3NlcgorICAgICAgICAgICAgICAgIGlmIHNlbGYubmFtZSA9PSAiT21uaVdlYiI6CisgICAgICAgICAgICAgICAgICAgIHRvV2luZG93ID0gIiIKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAjIEluY2x1ZGUgdG9XaW5kb3cgcGFyYW1ldGVyIG9mIE9wZW5VUkwgY29tbWFuZCBmb3IgYnJvd3NlcnMKKyAgICAgICAgICAgICAgICAgICAgIyB0aGF0IHN1cHBvcnQgaXQuICAwID09IG5ldyB3aW5kb3c7IC0xID09IGV4aXN0aW5nCisgICAgICAgICAgICAgICAgICAgIHRvV2luZG93ID0gInRvV2luZG93ICVkIiAlIChuZXcgLSAxKQorICAgICAgICAgICAgICAgIGNtZCA9ICdPcGVuVVJMICIlcyInICUgdXJsLnJlcGxhY2UoJyInLCAnJTIyJykKKyAgICAgICAgICAgICAgICBzY3JpcHQgPSAnJyd0ZWxsIGFwcGxpY2F0aW9uICIlcyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXMgJXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgdGVsbCcnJyAlIChzZWxmLm5hbWUsIGNtZCwgdG9XaW5kb3cpCisgICAgICAgICAgICAjIE9wZW4gcGlwZSB0byBBcHBsZVNjcmlwdCB0aHJvdWdoIG9zYXNjcmlwdCBjb21tYW5kCisgICAgICAgICAgICBvc2FwaXBlID0gb3MucG9wZW4oIm9zYXNjcmlwdCIsICJ3IikKKyAgICAgICAgICAgIGlmIG9zYXBpcGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgICMgV3JpdGUgc2NyaXB0IHRvIG9zYXNjcmlwdCdzIHN0ZGluCisgICAgICAgICAgICBvc2FwaXBlLndyaXRlKHNjcmlwdCkKKyAgICAgICAgICAgIHJjID0gb3NhcGlwZS5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gbm90IHJjCisKKyAgICBjbGFzcyBNYWNPU1hPU0FTY3JpcHQoQmFzZUJyb3dzZXIpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQorCisgICAgICAgIGRlZiBvcGVuKHNlbGYsIHVybCwgbmV3PTAsIGF1dG9yYWlzZT1UcnVlKToKKyAgICAgICAgICAgIGlmIHNlbGYuX25hbWUgPT0gJ2RlZmF1bHQnOgorICAgICAgICAgICAgICAgIHNjcmlwdCA9ICdvcGVuIGxvY2F0aW9uICIlcyInICUgdXJsLnJlcGxhY2UoJyInLCAnJTIyJykgIyBvcGVucyBpbiBkZWZhdWx0IGJyb3dzZXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2NyaXB0ID0gJycnCisgICAgICAgICAgICAgICAgICAgdGVsbCBhcHBsaWNhdGlvbiAiJXMiCisgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRlCisgICAgICAgICAgICAgICAgICAgICAgIG9wZW4gbG9jYXRpb24gIiVzIgorICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgICAgICAgICAgICcnJyUoc2VsZi5fbmFtZSwgdXJsLnJlcGxhY2UoJyInLCAnJTIyJykpCisKKyAgICAgICAgICAgIG9zYXBpcGUgPSBvcy5wb3Blbigib3Nhc2NyaXB0IiwgInciKQorICAgICAgICAgICAgaWYgb3NhcGlwZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgICAgICBvc2FwaXBlLndyaXRlKHNjcmlwdCkKKyAgICAgICAgICAgIHJjID0gb3NhcGlwZS5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gbm90IHJjCisKKworICAgICMgRG9uJ3QgY2xlYXIgX3RyeW9yZGVyIG9yIF9icm93c2VycyBzaW5jZSBPUyBYIGNhbiB1c2UgYWJvdmUgVW5peCBzdXBwb3J0CisgICAgIyAoYnV0IHdlIHByZWZlciB1c2luZyB0aGUgT1MgWCBzcGVjaWZpYyBzdHVmZikKKyAgICByZWdpc3Rlcigic2FmYXJpIiwgTm9uZSwgTWFjT1NYT1NBU2NyaXB0KCdzYWZhcmknKSwgLTEpCisgICAgcmVnaXN0ZXIoImZpcmVmb3giLCBOb25lLCBNYWNPU1hPU0FTY3JpcHQoJ2ZpcmVmb3gnKSwgLTEpCisgICAgcmVnaXN0ZXIoIk1hY09TWCIsIE5vbmUsIE1hY09TWE9TQVNjcmlwdCgnZGVmYXVsdCcpLCAtMSkKKworCisjCisjIFBsYXRmb3JtIHN1cHBvcnQgZm9yIE9TLzIKKyMKKworaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAib3MyIiBhbmQgX2lzY29tbWFuZCgibmV0c2NhcGUiKToKKyAgICBfdHJ5b3JkZXIgPSBbXQorICAgIF9icm93c2VycyA9IHt9CisgICAgcmVnaXN0ZXIoIm9zMm5ldHNjYXBlIiwgTm9uZSwKKyAgICAgICAgICAgICBHZW5lcmljQnJvd3NlcihbInN0YXJ0IiwgIm5ldHNjYXBlIiwgIiVzIl0pLCAtMSkKKworCisjIE9LLCBub3cgdGhhdCB3ZSBrbm93IHdoYXQgdGhlIGRlZmF1bHQgcHJlZmVyZW5jZSBvcmRlcnMgZm9yIGVhY2gKKyMgcGxhdGZvcm0gYXJlLCBhbGxvdyB1c2VyIHRvIG92ZXJyaWRlIHRoZW0gd2l0aCB0aGUgQlJPV1NFUiB2YXJpYWJsZS4KK2lmICJCUk9XU0VSIiBpbiBvcy5lbnZpcm9uOgorICAgIF91c2VyY2hvaWNlcyA9IG9zLmVudmlyb25bIkJST1dTRVIiXS5zcGxpdChvcy5wYXRoc2VwKQorICAgIF91c2VyY2hvaWNlcy5yZXZlcnNlKCkKKworICAgICMgVHJlYXQgY2hvaWNlcyBpbiBzYW1lIHdheSBhcyBpZiBwYXNzZWQgaW50byBnZXQoKSBidXQgZG8gcmVnaXN0ZXIKKyAgICAjIGFuZCBwcmVwZW5kIHRvIF90cnlvcmRlcgorICAgIGZvciBjbWRsaW5lIGluIF91c2VyY2hvaWNlczoKKyAgICAgICAgaWYgY21kbGluZSAhPSAnJzoKKyAgICAgICAgICAgIGNtZCA9IF9zeW50aGVzaXplKGNtZGxpbmUsIC0xKQorICAgICAgICAgICAgaWYgY21kWzFdIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIoY21kbGluZSwgTm9uZSwgR2VuZXJpY0Jyb3dzZXIoY21kbGluZSksIC0xKQorICAgIGNtZGxpbmUgPSBOb25lICMgdG8gbWFrZSBkZWwgd29yayBpZiBfdXNlcmNob2ljZXMgd2FzIGVtcHR5CisgICAgZGVsIGNtZGxpbmUKKyAgICBkZWwgX3VzZXJjaG9pY2VzCisKKyMgd2hhdCB0byBkbyBpZiBfdHJ5b3JkZXIgaXMgbm93IGVtcHR5PworCisKK2RlZiBtYWluKCk6CisgICAgaW1wb3J0IGdldG9wdAorICAgIHVzYWdlID0gIiIiVXNhZ2U6ICVzIFstbiB8IC10XSB1cmwKKyAgICAtbjogb3BlbiBuZXcgd2luZG93CisgICAgLXQ6IG9wZW4gbmV3IHRhYiIiIiAlIHN5cy5hcmd2WzBdCisgICAgdHJ5OgorICAgICAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICdudGQnKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3IsIG1zZzoKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCBtc2cKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCB1c2FnZQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIG5ld193aW4gPSAwCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLW4nOiBuZXdfd2luID0gMQorICAgICAgICBlbGlmIG8gPT0gJy10JzogbmV3X3dpbiA9IDIKKyAgICBpZiBsZW4oYXJncykgIT0gMToKKyAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCB1c2FnZQorICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgdXJsID0gYXJnc1swXQorICAgIG9wZW4odXJsLCBuZXdfd2luKQorCisgICAgcHJpbnQgIlxhIgorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5YyBiL2xpYi9weXRob24yLjcvd2ViYnJvd3Nlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0NTFmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2ViYnJvd3Nlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93ZWJicm93c2VyLnB5byBiL2xpYi9weXRob24yLjcvd2ViYnJvd3Nlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwN2ZhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd2ViYnJvd3Nlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93aGljaGRiLnB5IGIvbGliL3B5dGhvbjIuNy93aGljaGRiLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzE0MzAKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3doaWNoZGIucHkKQEAgLTAsMCArMSwxMTcgQEAKKyMgIS91c3IvYmluL2VudiBweXRob24KKyIiIkd1ZXNzIHdoaWNoIGRiIHBhY2thZ2UgdG8gdXNlIHRvIG9wZW4gYSBkYiBmaWxlLiIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzdHJ1Y3QKK2ltcG9ydCBzeXMKKwordHJ5OgorICAgIGltcG9ydCBkYm0KKyAgICBfZGJtZXJyb3IgPSBkYm0uZXJyb3IKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBkYm0gPSBOb25lCisgICAgIyBqdXN0IHNvbWUgc29ydCBvZiB2YWxpZCBleGNlcHRpb24gd2hpY2ggbWlnaHQgYmUgcmFpc2VkIGluIHRoZQorICAgICMgZGJtIHRlc3QKKyAgICBfZGJtZXJyb3IgPSBJT0Vycm9yCisKK2RlZiB3aGljaGRiKGZpbGVuYW1lKToKKyAgICAiIiJHdWVzcyB3aGljaCBkYiBwYWNrYWdlIHRvIHVzZSB0byBvcGVuIGEgZGIgZmlsZS4KKworICAgIFJldHVybiB2YWx1ZXM6CisKKyAgICAtIE5vbmUgaWYgdGhlIGRhdGFiYXNlIGZpbGUgY2FuJ3QgYmUgcmVhZDsKKyAgICAtIGVtcHR5IHN0cmluZyBpZiB0aGUgZmlsZSBjYW4gYmUgcmVhZCBidXQgY2FuJ3QgYmUgcmVjb2duaXplZAorICAgIC0gdGhlIG1vZHVsZSBuYW1lIChlLmcuICJkYm0iIG9yICJnZGJtIikgaWYgcmVjb2duaXplZC4KKworICAgIEltcG9ydGluZyB0aGUgZ2l2ZW4gbW9kdWxlIG1heSBzdGlsbCBmYWlsLCBhbmQgb3BlbmluZyB0aGUKKyAgICBkYXRhYmFzZSB1c2luZyB0aGF0IG1vZHVsZSBtYXkgc3RpbGwgZmFpbC4KKyAgICAiIiIKKworICAgICMgQ2hlY2sgZm9yIGRibSBmaXJzdCAtLSB0aGlzIGhhcyBhIC5wYWcgYW5kIGEgLmRpciBmaWxlCisgICAgdHJ5OgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSArIG9zLmV4dHNlcCArICJwYWciLCAicmIiKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgIyBkYm0gbGlua2VkIHdpdGggZ2RibSBvbiBPUy8yIGRvZXNuJ3QgaGF2ZSAuZGlyIGZpbGUKKyAgICAgICAgaWYgbm90IChkYm0ubGlicmFyeSA9PSAiR05VIGdkYm0iIGFuZCBzeXMucGxhdGZvcm0gPT0gIm9zMmVteCIpOgorICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUgKyBvcy5leHRzZXAgKyAiZGlyIiwgInJiIikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICByZXR1cm4gImRibSIKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgIyBzb21lIGRibSBlbXVsYXRpb25zIGJhc2VkIG9uIEJlcmtlbGV5IERCIGdlbmVyYXRlIGEgLmRiIGZpbGUKKyAgICAgICAgIyBzb21lIGRvIG5vdCwgYnV0IHRoZXkgc2hvdWxkIGJlIGNhdWdodCBieSB0aGUgZGJoYXNoIGNoZWNrcworICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSArIG9zLmV4dHNlcCArICJkYiIsICJyYiIpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICMgZ3VhcmFudGVlIHdlIGNhbiBhY3R1YWxseSBvcGVuIHRoZSBmaWxlIHVzaW5nIGRibQorICAgICAgICAgICAgIyBraW5kIG9mIG92ZXJraWxsLCBidXQgc2luY2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBlbXVsYXRpb25zCisgICAgICAgICAgICAjIGl0IHNlZW1zIGxpa2UgYSBwcnVkZW50IHN0ZXAKKyAgICAgICAgICAgIGlmIGRibSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkID0gZGJtLm9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZC5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuICJkYm0iCisgICAgICAgIGV4Y2VwdCAoSU9FcnJvciwgX2RibWVycm9yKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICMgQ2hlY2sgZm9yIGR1bWJkYm0gbmV4dCAtLSB0aGlzIGhhcyBhIC5kaXIgYW5kIGEgLmRhdCBmaWxlCisgICAgdHJ5OgorICAgICAgICAjIEZpcnN0IGNoZWNrIGZvciBwcmVzZW5jZSBvZiBmaWxlcworICAgICAgICBvcy5zdGF0KGZpbGVuYW1lICsgb3MuZXh0c2VwICsgImRhdCIpCisgICAgICAgIHNpemUgPSBvcy5zdGF0KGZpbGVuYW1lICsgb3MuZXh0c2VwICsgImRpciIpLnN0X3NpemUKKyAgICAgICAgIyBkdW1iZGJtIGZpbGVzIHdpdGggbm8ga2V5cyBhcmUgZW1wdHkKKyAgICAgICAgaWYgc2l6ZSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICJkdW1iZGJtIgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSArIG9zLmV4dHNlcCArICJkaXIiLCAicmIiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBmLnJlYWQoMSkgaW4gKCInIiwgJyInKToKKyAgICAgICAgICAgICAgICByZXR1cm4gImR1bWJkYm0iCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICBleGNlcHQgKE9TRXJyb3IsIElPRXJyb3IpOgorICAgICAgICBwYXNzCisKKyAgICAjIFNlZSBpZiB0aGUgZmlsZSBleGlzdHMsIHJldHVybiBOb25lIGlmIG5vdAorICAgIHRyeToKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJyYiIpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFJlYWQgdGhlIHN0YXJ0IG9mIHRoZSBmaWxlIC0tIHRoZSBtYWdpYyBudW1iZXIKKyAgICBzMTYgPSBmLnJlYWQoMTYpCisgICAgZi5jbG9zZSgpCisgICAgcyA9IHMxNlswOjRdCisKKyAgICAjIFJldHVybiAiIiBpZiBub3QgYXQgbGVhc3QgNCBieXRlcworICAgIGlmIGxlbihzKSAhPSA0OgorICAgICAgICByZXR1cm4gIiIKKworICAgICMgQ29udmVydCB0byA0LWJ5dGUgaW50IGluIG5hdGl2ZSBieXRlIG9yZGVyIC0tIHJldHVybiAiIiBpZiBpbXBvc3NpYmxlCisgICAgdHJ5OgorICAgICAgICAobWFnaWMsKSA9IHN0cnVjdC51bnBhY2soIj1sIiwgcykKKyAgICBleGNlcHQgc3RydWN0LmVycm9yOgorICAgICAgICByZXR1cm4gIiIKKworICAgICMgQ2hlY2sgZm9yIEdOVSBkYm0KKyAgICBpZiBtYWdpYyBpbiAoMHgxMzU3OWFjZSwgMHgxMzU3OWFjZCwgMHgxMzU3OWFjZik6CisgICAgICAgIHJldHVybiAiZ2RibSIKKworICAgICMgQ2hlY2sgZm9yIG9sZCBCZXJrZWxleSBkYiBoYXNoIGZpbGUgZm9ybWF0IHYyCisgICAgaWYgbWFnaWMgaW4gKDB4MDAwNjE1NjEsIDB4NjExNTA2MDApOgorICAgICAgICByZXR1cm4gImJzZGRiMTg1IgorCisgICAgIyBMYXRlciB2ZXJzaW9ucyBvZiBCZXJrZWxleSBkYiBoYXNoIGZpbGUgaGF2ZSBhIDEyLWJ5dGUgcGFkIGluCisgICAgIyBmcm9udCBvZiB0aGUgZmlsZSB0eXBlCisgICAgdHJ5OgorICAgICAgICAobWFnaWMsKSA9IHN0cnVjdC51bnBhY2soIj1sIiwgczE2Wy00Ol0pCisgICAgZXhjZXB0IHN0cnVjdC5lcnJvcjoKKyAgICAgICAgcmV0dXJuICIiCisKKyAgICAjIENoZWNrIGZvciBCU0QgaGFzaAorICAgIGlmIG1hZ2ljIGluICgweDAwMDYxNTYxLCAweDYxMTUwNjAwKToKKyAgICAgICAgcmV0dXJuICJkYmhhc2giCisKKyAgICAjIFVua25vd24KKyAgICByZXR1cm4gIiIKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBmb3IgZmlsZW5hbWUgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICBwcmludCB3aGljaGRiKGZpbGVuYW1lKSBvciAiVU5LTk9XTiIsIGZpbGVuYW1lCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3doaWNoZGIucHljIGIvbGliL3B5dGhvbjIuNy93aGljaGRiLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZmNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93aGljaGRiLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3doaWNoZGIucHlvIGIvbGliL3B5dGhvbjIuNy93aGljaGRiLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZmNDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93aGljaGRiLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3dzZ2lyZWYuZWdnLWluZm8gYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYuZWdnLWluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiNzg5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi5lZ2ctaW5mbwpAQCAtMCwwICsxLDggQEAKK01ldGFkYXRhLVZlcnNpb246IDEuMAorTmFtZTogd3NnaXJlZgorVmVyc2lvbjogMC4xLjIKK1N1bW1hcnk6IFdTR0kgKFBFUCAzMzMpIFJlZmVyZW5jZSBMaWJyYXJ5CitBdXRob3I6IFBoaWxsaXAgSi4gRWJ5CitBdXRob3ItZW1haWw6IHdlYi1zaWdAcHl0aG9uLm9yZworTGljZW5zZTogUFNGIG9yIFpQTAorUGxhdGZvcm06IFVOS05PV04KZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmM1NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjMgQEAKKyIiIndzZ2lyZWYgLS0gYSBXU0dJIChQRVAgMzMzKSBSZWZlcmVuY2UgTGlicmFyeQorCitDdXJyZW50IENvbnRlbnRzOgorCisqIHV0aWwgLS0gTWlzY2VsbGFuZW91cyB1c2VmdWwgZnVuY3Rpb25zIGFuZCB3cmFwcGVycworCisqIGhlYWRlcnMgLS0gTWFuYWdlIHJlc3BvbnNlIGhlYWRlcnMKKworKiBoYW5kbGVycyAtLSBiYXNlIGNsYXNzZXMgZm9yIHNlcnZlci9nYXRld2F5IGltcGxlbWVudGF0aW9ucworCisqIHNpbXBsZV9zZXJ2ZXIgLS0gYSBzaW1wbGUgQmFzZUhUVFBTZXJ2ZXIgdGhhdCBzdXBwb3J0cyBXU0dJCisKKyogdmFsaWRhdGUgLS0gdmFsaWRhdGlvbiB3cmFwcGVyIHRoYXQgc2l0cyBiZXR3ZWVuIGFuIGFwcCBhbmQgYSBzZXJ2ZXIKKyAgdG8gZGV0ZWN0IGVycm9ycyBpbiBlaXRoZXIKKworVG8tRG86CisKKyogY2dpX2dhdGV3YXkgLS0gUnVuIFdTR0kgYXBwcyB1bmRlciBDR0kgKHBlbmRpbmcgYSBkZXBsb3ltZW50IHN0YW5kYXJkKQorCisqIGNnaV93cmFwcGVyIC0tIFJ1biBDR0kgYXBwcyB1bmRlciBXU0dJCisKKyogcm91dGVyIC0tIGEgc2ltcGxlIG1pZGRsZXdhcmUgY29tcG9uZW50IHRoYXQgaGFuZGxlcyBVUkwgdHJhdmVyc2FsCisiIiIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTVkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvX19pbml0X18ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTVkN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvX19pbml0X18ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9oYW5kbGVycy5weSBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oYW5kbGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2I1N2UyCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5CkBAIC0wLDAgKzEsNDUwIEBACisiIiJCYXNlIGNsYXNzZXMgZm9yIHNlcnZlci9nYXRld2F5IGltcGxlbWVudGF0aW9ucyIiIgorCitmcm9tIHR5cGVzIGltcG9ydCBTdHJpbmdUeXBlCitmcm9tIHV0aWwgaW1wb3J0IEZpbGVXcmFwcGVyLCBndWVzc19zY2hlbWUsIGlzX2hvcF9ieV9ob3AKK2Zyb20gaGVhZGVycyBpbXBvcnQgSGVhZGVycworCitpbXBvcnQgc3lzLCBvcywgdGltZQorCitfX2FsbF9fID0gWydCYXNlSGFuZGxlcicsICdTaW1wbGVIYW5kbGVyJywgJ0Jhc2VDR0lIYW5kbGVyJywgJ0NHSUhhbmRsZXInXQorCit0cnk6CisgICAgZGljdAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBkZWYgZGljdChpdGVtcyk6CisgICAgICAgIGQgPSB7fQorICAgICAgICBmb3Igayx2IGluIGl0ZW1zOgorICAgICAgICAgICAgZFtrXSA9IHYKKyAgICAgICAgcmV0dXJuIGQKKworIyBVbmNvbW1lbnQgZm9yIDIuMiBjb21wYXRpYmlsaXR5LgorI3RyeToKKyMgICAgVHJ1ZQorIyAgICBGYWxzZQorI2V4Y2VwdCBOYW1lRXJyb3I6CisjICAgIFRydWUgPSBub3QgTm9uZQorIyAgICBGYWxzZSA9IG5vdCBUcnVlCisKKworIyBXZWVrZGF5IGFuZCBtb250aCBuYW1lcyBmb3IgSFRUUCBkYXRlL3RpbWUgZm9ybWF0dGluZzsgYWx3YXlzIEVuZ2xpc2ghCitfd2Vla2RheW5hbWUgPSBbIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biJdCitfbW9udGhuYW1lID0gW05vbmUsICMgRHVtbXkgc28gd2UgY2FuIHVzZSAxLWJhc2VkIG1vbnRoIG51bWJlcnMKKyAgICAgICAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKyAgICAgICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIl0KKworZGVmIGZvcm1hdF9kYXRlX3RpbWUodGltZXN0YW1wKToKKyAgICB5ZWFyLCBtb250aCwgZGF5LCBoaCwgbW0sIHNzLCB3ZCwgeSwgeiA9IHRpbWUuZ210aW1lKHRpbWVzdGFtcCkKKyAgICByZXR1cm4gIiVzLCAlMDJkICUzcyAlNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlICgKKyAgICAgICAgX3dlZWtkYXluYW1lW3dkXSwgZGF5LCBfbW9udGhuYW1lW21vbnRoXSwgeWVhciwgaGgsIG1tLCBzcworICAgICkKKworCitjbGFzcyBCYXNlSGFuZGxlcjoKKyAgICAiIiJNYW5hZ2UgdGhlIGludm9jYXRpb24gb2YgYSBXU0dJIGFwcGxpY2F0aW9uIiIiCisKKyAgICAjIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczsgY2FuIG92ZXJyaWRlIHBlci1zdWJjbGFzcyBvciBwZXItaW5zdGFuY2UKKyAgICB3c2dpX3ZlcnNpb24gPSAoMSwwKQorICAgIHdzZ2lfbXVsdGl0aHJlYWQgPSBUcnVlCisgICAgd3NnaV9tdWx0aXByb2Nlc3MgPSBUcnVlCisgICAgd3NnaV9ydW5fb25jZSA9IEZhbHNlCisKKyAgICBvcmlnaW5fc2VydmVyID0gVHJ1ZSAgICAjIFdlIGFyZSB0cmFuc21pdHRpbmcgZGlyZWN0IHRvIGNsaWVudAorICAgIGh0dHBfdmVyc2lvbiAgPSAiMS4wIiAgICMgVmVyc2lvbiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciByZXNwb25zZQorICAgIHNlcnZlcl9zb2Z0d2FyZSA9IE5vbmUgICMgU3RyaW5nIG5hbWUgb2Ygc2VydmVyIHNvZnR3YXJlLCBpZiBhbnkKKworICAgICMgb3NfZW52aXJvbiBpcyB1c2VkIHRvIHN1cHBseSBjb25maWd1cmF0aW9uIGZyb20gdGhlIE9TIGVudmlyb25tZW50OgorICAgICMgYnkgZGVmYXVsdCBpdCdzIGEgY29weSBvZiAnb3MuZW52aXJvbicgYXMgb2YgaW1wb3J0IHRpbWUsIGJ1dCB5b3UgY2FuCisgICAgIyBvdmVycmlkZSB0aGlzIGluIGUuZy4geW91ciBfX2luaXRfXyBtZXRob2QuCisgICAgb3NfZW52aXJvbiA9IGRpY3Qob3MuZW52aXJvbi5pdGVtcygpKQorCisgICAgIyBDb2xsYWJvcmF0b3IgY2xhc3NlcworICAgIHdzZ2lfZmlsZV93cmFwcGVyID0gRmlsZVdyYXBwZXIgICAgICMgc2V0IHRvIE5vbmUgdG8gZGlzYWJsZQorICAgIGhlYWRlcnNfY2xhc3MgPSBIZWFkZXJzICAgICAgICAgICAgICMgbXVzdCBiZSBhIEhlYWRlcnMtbGlrZSBjbGFzcworCisgICAgIyBFcnJvciBoYW5kbGluZyAoYWxzbyBwZXItc3ViY2xhc3Mgb3IgcGVyLWluc3RhbmNlKQorICAgIHRyYWNlYmFja19saW1pdCA9IE5vbmUgICMgUHJpbnQgZW50aXJlIHRyYWNlYmFjayB0byBzZWxmLmdldF9zdGRlcnIoKQorICAgIGVycm9yX3N0YXR1cyA9ICI1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yIgorICAgIGVycm9yX2hlYWRlcnMgPSBbKCdDb250ZW50LVR5cGUnLCd0ZXh0L3BsYWluJyldCisgICAgZXJyb3JfYm9keSA9ICJBIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLiIKKworICAgICMgU3RhdGUgdmFyaWFibGVzIChkb24ndCBtZXNzIHdpdGggdGhlc2UpCisgICAgc3RhdHVzID0gcmVzdWx0ID0gTm9uZQorICAgIGhlYWRlcnNfc2VudCA9IEZhbHNlCisgICAgaGVhZGVycyA9IE5vbmUKKyAgICBieXRlc19zZW50ID0gMAorCisgICAgZGVmIHJ1bihzZWxmLCBhcHBsaWNhdGlvbik6CisgICAgICAgICIiIkludm9rZSB0aGUgYXBwbGljYXRpb24iIiIKKyAgICAgICAgIyBOb3RlIHRvIHNlbGY6IGRvbid0IG1vdmUgdGhlIGNsb3NlKCkhICBBc3luY2hyb25vdXMgc2VydmVycyBzaG91bGRuJ3QKKyAgICAgICAgIyBjYWxsIGNsb3NlKCkgZnJvbSBmaW5pc2hfcmVzcG9uc2UoKSwgc28gaWYgeW91IGNsb3NlKCkgYW55d2hlcmUgYnV0CisgICAgICAgICMgdGhlIGRvdWJsZS1lcnJvciBicmFuY2ggaGVyZSwgeW91J2xsIGJyZWFrIGFzeW5jaHJvbm91cyBzZXJ2ZXJzIGJ5CisgICAgICAgICMgcHJlbWF0dXJlbHkgY2xvc2luZy4gIEFzeW5jIHNlcnZlcnMgbXVzdCByZXR1cm4gZnJvbSAncnVuKCknIHdpdGhvdXQKKyAgICAgICAgIyBjbG9zaW5nIGlmIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIG91dHB1dCB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0dXBfZW52aXJvbigpCisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IGFwcGxpY2F0aW9uKHNlbGYuZW52aXJvbiwgc2VsZi5zdGFydF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX3Jlc3BvbnNlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIElmIHdlIGdldCBhbiBlcnJvciBoYW5kbGluZyBhbiBlcnJvciwganVzdCBnaXZlIHVwIGFscmVhZHkhCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UgICAjIC4uLmFuZCBsZXQgdGhlIGFjdHVhbCBzZXJ2ZXIgZmlndXJlIGl0IG91dC4KKworCisgICAgZGVmIHNldHVwX2Vudmlyb24oc2VsZik6CisgICAgICAgICIiIlNldCB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIG9uZSByZXF1ZXN0IiIiCisKKyAgICAgICAgZW52ID0gc2VsZi5lbnZpcm9uID0gc2VsZi5vc19lbnZpcm9uLmNvcHkoKQorICAgICAgICBzZWxmLmFkZF9jZ2lfdmFycygpCisKKyAgICAgICAgZW52Wyd3c2dpLmlucHV0J10gICAgICAgID0gc2VsZi5nZXRfc3RkaW4oKQorICAgICAgICBlbnZbJ3dzZ2kuZXJyb3JzJ10gICAgICAgPSBzZWxmLmdldF9zdGRlcnIoKQorICAgICAgICBlbnZbJ3dzZ2kudmVyc2lvbiddICAgICAgPSBzZWxmLndzZ2lfdmVyc2lvbgorICAgICAgICBlbnZbJ3dzZ2kucnVuX29uY2UnXSAgICAgPSBzZWxmLndzZ2lfcnVuX29uY2UKKyAgICAgICAgZW52Wyd3c2dpLnVybF9zY2hlbWUnXSAgID0gc2VsZi5nZXRfc2NoZW1lKCkKKyAgICAgICAgZW52Wyd3c2dpLm11bHRpdGhyZWFkJ10gID0gc2VsZi53c2dpX211bHRpdGhyZWFkCisgICAgICAgIGVudlsnd3NnaS5tdWx0aXByb2Nlc3MnXSA9IHNlbGYud3NnaV9tdWx0aXByb2Nlc3MKKworICAgICAgICBpZiBzZWxmLndzZ2lfZmlsZV93cmFwcGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZW52Wyd3c2dpLmZpbGVfd3JhcHBlciddID0gc2VsZi53c2dpX2ZpbGVfd3JhcHBlcgorCisgICAgICAgIGlmIHNlbGYub3JpZ2luX3NlcnZlciBhbmQgc2VsZi5zZXJ2ZXJfc29mdHdhcmU6CisgICAgICAgICAgICBlbnYuc2V0ZGVmYXVsdCgnU0VSVkVSX1NPRlRXQVJFJyxzZWxmLnNlcnZlcl9zb2Z0d2FyZSkKKworCisgICAgZGVmIGZpbmlzaF9yZXNwb25zZShzZWxmKToKKyAgICAgICAgIiIiU2VuZCBhbnkgaXRlcmFibGUgZGF0YSwgdGhlbiBjbG9zZSBzZWxmIGFuZCB0aGUgaXRlcmFibGUKKworICAgICAgICBTdWJjbGFzc2VzIGludGVuZGVkIGZvciB1c2UgaW4gYXN5bmNocm9ub3VzIHNlcnZlcnMgd2lsbAorICAgICAgICB3YW50IHRvIHJlZGVmaW5lIHRoaXMgbWV0aG9kLCBzdWNoIHRoYXQgaXQgc2V0cyB1cCBjYWxsYmFja3MKKyAgICAgICAgaW4gdGhlIGV2ZW50IGxvb3AgdG8gaXRlcmF0ZSBvdmVyIHRoZSBkYXRhLCBhbmQgdG8gY2FsbAorICAgICAgICAnc2VsZi5jbG9zZSgpJyBvbmNlIHRoZSByZXNwb25zZSBpcyBmaW5pc2hlZC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnJlc3VsdF9pc19maWxlKCkgb3Igbm90IHNlbGYuc2VuZGZpbGUoKToKKyAgICAgICAgICAgICAgICBmb3IgZGF0YSBpbiBzZWxmLnJlc3VsdDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53cml0ZShkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoX2NvbnRlbnQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisKKworICAgIGRlZiBnZXRfc2NoZW1lKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIFVSTCBzY2hlbWUgYmVpbmcgdXNlZCIiIgorICAgICAgICByZXR1cm4gZ3Vlc3Nfc2NoZW1lKHNlbGYuZW52aXJvbikKKworCisgICAgZGVmIHNldF9jb250ZW50X2xlbmd0aChzZWxmKToKKyAgICAgICAgIiIiQ29tcHV0ZSBDb250ZW50LUxlbmd0aCBvciBzd2l0Y2ggdG8gY2h1bmtlZCBlbmNvZGluZyBpZiBwb3NzaWJsZSIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBibG9ja3MgPSBsZW4oc2VsZi5yZXN1bHQpCisgICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLEF0dHJpYnV0ZUVycm9yLE5vdEltcGxlbWVudGVkRXJyb3IpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgYmxvY2tzPT0xOgorICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IHN0cihzZWxmLmJ5dGVzX3NlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgWFhYIFRyeSBmb3IgY2h1bmtlZCBlbmNvZGluZyBpZiBvcmlnaW4gc2VydmVyIGFuZCBjbGllbnQgaXMgMS4xCisKKworICAgIGRlZiBjbGVhbnVwX2hlYWRlcnMoc2VsZik6CisgICAgICAgICIiIk1ha2UgYW55IG5lY2Vzc2FyeSBoZWFkZXIgY2hhbmdlcyBvciBkZWZhdWx0cworCisgICAgICAgIFN1YmNsYXNzZXMgY2FuIGV4dGVuZCB0aGlzIHRvIGFkZCBvdGhlciBkZWZhdWx0cy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmICdDb250ZW50LUxlbmd0aCcgbm90IGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgIHNlbGYuc2V0X2NvbnRlbnRfbGVuZ3RoKCkKKworICAgIGRlZiBzdGFydF9yZXNwb25zZShzZWxmLCBzdGF0dXMsIGhlYWRlcnMsZXhjX2luZm89Tm9uZSk6CisgICAgICAgICIiIidzdGFydF9yZXNwb25zZSgpJyBjYWxsYWJsZSBhcyBzcGVjaWZpZWQgYnkgUEVQIDMzMyIiIgorCisgICAgICAgIGlmIGV4Y19pbmZvOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgICAgICAgICAjIFJlLXJhaXNlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpZiBoZWFkZXJzIHNlbnQKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgZXhjX2luZm9bMF0sIGV4Y19pbmZvWzFdLCBleGNfaW5mb1syXQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IE5vbmUgICAgICAgICMgYXZvaWQgZGFuZ2xpbmcgY2lyY3VsYXIgcmVmCisgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIkhlYWRlcnMgYWxyZWFkeSBzZXQhIikKKworICAgICAgICBhc3NlcnQgdHlwZShzdGF0dXMpIGlzIFN0cmluZ1R5cGUsIlN0YXR1cyBtdXN0IGJlIGEgc3RyaW5nIgorICAgICAgICBhc3NlcnQgbGVuKHN0YXR1cyk+PTQsIlN0YXR1cyBtdXN0IGJlIGF0IGxlYXN0IDQgY2hhcmFjdGVycyIKKyAgICAgICAgYXNzZXJ0IGludChzdGF0dXNbOjNdKSwiU3RhdHVzIG1lc3NhZ2UgbXVzdCBiZWdpbiB3LzMtZGlnaXQgY29kZSIKKyAgICAgICAgYXNzZXJ0IHN0YXR1c1szXT09IiAiLCAiU3RhdHVzIG1lc3NhZ2UgbXVzdCBoYXZlIGEgc3BhY2UgYWZ0ZXIgY29kZSIKKyAgICAgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAgICAgZm9yIG5hbWUsdmFsIGluIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgYXNzZXJ0IHR5cGUobmFtZSkgaXMgU3RyaW5nVHlwZSwiSGVhZGVyIG5hbWVzIG11c3QgYmUgc3RyaW5ncyIKKyAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZSh2YWwpIGlzIFN0cmluZ1R5cGUsIkhlYWRlciB2YWx1ZXMgbXVzdCBiZSBzdHJpbmdzIgorICAgICAgICAgICAgICAgIGFzc2VydCBub3QgaXNfaG9wX2J5X2hvcChuYW1lKSwiSG9wLWJ5LWhvcCBoZWFkZXJzIG5vdCBhbGxvd2VkIgorICAgICAgICBzZWxmLnN0YXR1cyA9IHN0YXR1cworICAgICAgICBzZWxmLmhlYWRlcnMgPSBzZWxmLmhlYWRlcnNfY2xhc3MoaGVhZGVycykKKyAgICAgICAgcmV0dXJuIHNlbGYud3JpdGUKKworCisgICAgZGVmIHNlbmRfcHJlYW1ibGUoc2VsZik6CisgICAgICAgICIiIlRyYW5zbWl0IHZlcnNpb24vc3RhdHVzL2RhdGUvc2VydmVyLCB2aWEgc2VsZi5fd3JpdGUoKSIiIgorICAgICAgICBpZiBzZWxmLm9yaWdpbl9zZXJ2ZXI6CisgICAgICAgICAgICBpZiBzZWxmLmNsaWVudF9pc19tb2Rlcm4oKToKKyAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSgnSFRUUC8lcyAlc1xyXG4nICUgKHNlbGYuaHR0cF92ZXJzaW9uLHNlbGYuc3RhdHVzKSkKKyAgICAgICAgICAgICAgICBpZiAnRGF0ZScgbm90IGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAnRGF0ZTogJXNcclxuJyAlIGZvcm1hdF9kYXRlX3RpbWUodGltZS50aW1lKCkpCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnNlcnZlcl9zb2Z0d2FyZSBhbmQgJ1NlcnZlcicgbm90IGluIHNlbGYuaGVhZGVyczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUoJ1NlcnZlcjogJXNcclxuJyAlIHNlbGYuc2VydmVyX3NvZnR3YXJlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fd3JpdGUoJ1N0YXR1czogJXNcclxuJyAlIHNlbGYuc3RhdHVzKQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICAiIiInd3JpdGUoKScgY2FsbGFibGUgYXMgc3BlY2lmaWVkIGJ5IFBFUCAzMzMiIiIKKworICAgICAgICBhc3NlcnQgdHlwZShkYXRhKSBpcyBTdHJpbmdUeXBlLCJ3cml0ZSgpIGFyZ3VtZW50IG11c3QgYmUgc3RyaW5nIgorCisgICAgICAgIGlmIG5vdCBzZWxmLnN0YXR1czoKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJ3cml0ZSgpIGJlZm9yZSBzdGFydF9yZXNwb25zZSgpIikKKworICAgICAgICBlbGlmIG5vdCBzZWxmLmhlYWRlcnNfc2VudDoKKyAgICAgICAgICAgICMgQmVmb3JlIHRoZSBmaXJzdCBvdXRwdXQsIHNlbmQgdGhlIHN0b3JlZCBoZWFkZXJzCisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgPSBsZW4oZGF0YSkgICAgIyBtYWtlIHN1cmUgd2Uga25vdyBjb250ZW50LWxlbmd0aAorICAgICAgICAgICAgc2VsZi5zZW5kX2hlYWRlcnMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5ieXRlc19zZW50ICs9IGxlbihkYXRhKQorCisgICAgICAgICMgWFhYIGNoZWNrIENvbnRlbnQtTGVuZ3RoIGFuZCB0cnVuY2F0ZSBpZiB0b28gbWFueSBieXRlcyB3cml0dGVuPworICAgICAgICBzZWxmLl93cml0ZShkYXRhKQorICAgICAgICBzZWxmLl9mbHVzaCgpCisKKworICAgIGRlZiBzZW5kZmlsZShzZWxmKToKKyAgICAgICAgIiIiUGxhdGZvcm0tc3BlY2lmaWMgZmlsZSB0cmFuc21pc3Npb24KKworICAgICAgICBPdmVycmlkZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRvIHN1cHBvcnQgcGxhdGZvcm0tc3BlY2lmaWMKKyAgICAgICAgZmlsZSB0cmFuc21pc3Npb24uICBJdCBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgYXBwbGljYXRpb24ncworICAgICAgICByZXR1cm4gaXRlcmFibGUgKCdzZWxmLnJlc3VsdCcpIGlzIGFuIGluc3RhbmNlIG9mCisgICAgICAgICdzZWxmLndzZ2lfZmlsZV93cmFwcGVyJy4KKworICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBpdCB3YXMgYWJsZSB0byBhY3R1YWxseQorICAgICAgICB0cmFuc21pdCB0aGUgd3JhcHBlZCBmaWxlLWxpa2Ugb2JqZWN0IHVzaW5nIGEgcGxhdGZvcm0tc3BlY2lmaWMKKyAgICAgICAgYXBwcm9hY2guICBJdCBzaG91bGQgcmV0dXJuIGEgZmFsc2UgdmFsdWUgaWYgbm9ybWFsIGl0ZXJhdGlvbgorICAgICAgICBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLiAgQW4gZXhjZXB0aW9uIGNhbiBiZSByYWlzZWQgdG8gaW5kaWNhdGUKKyAgICAgICAgdGhhdCB0cmFuc21pc3Npb24gd2FzIGF0dGVtcHRlZCwgYnV0IGZhaWxlZC4KKworICAgICAgICBOT1RFOiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCAnc2VsZi5zZW5kX2hlYWRlcnMoKScgaWYKKyAgICAgICAgJ3NlbGYuaGVhZGVyc19zZW50JyBpcyBmYWxzZSBhbmQgaXQgaXMgZ29pbmcgdG8gYXR0ZW1wdCBkaXJlY3QKKyAgICAgICAgdHJhbnNtaXNzaW9uIG9mIHRoZSBmaWxlLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlICAgIyBObyBwbGF0Zm9ybS1zcGVjaWZpYyB0cmFuc21pc3Npb24gYnkgZGVmYXVsdAorCisKKyAgICBkZWYgZmluaXNoX2NvbnRlbnQoc2VsZik6CisgICAgICAgICIiIkVuc3VyZSBoZWFkZXJzIGFuZCBjb250ZW50IGhhdmUgYm90aCBiZWVuIHNlbnQiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgIyBPbmx5IHplcm8gQ29udGVudC1MZW5ndGggaWYgbm90IHNldCBieSB0aGUgYXBwbGljYXRpb24gKHNvCisgICAgICAgICAgICAjIHRoYXQgSEVBRCByZXF1ZXN0cyBjYW4gYmUgc2F0aXNmaWVkIHByb3Blcmx5LCBzZWUgIzM4MzkpCisgICAgICAgICAgICBzZWxmLmhlYWRlcnMuc2V0ZGVmYXVsdCgnQ29udGVudC1MZW5ndGgnLCAiMCIpCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVycygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzICMgWFhYIGNoZWNrIGlmIGNvbnRlbnQtbGVuZ3RoIHdhcyB0b28gc2hvcnQ/CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgICIiIkNsb3NlIHRoZSBpdGVyYWJsZSAoaWYgbmVlZGVkKSBhbmQgcmVzZXQgYWxsIGluc3RhbmNlIHZhcnMKKworICAgICAgICBTdWJjbGFzc2VzIG1heSB3YW50IHRvIGFsc28gZHJvcCB0aGUgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYucmVzdWx0LCdjbG9zZScpOgorICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0LmNsb3NlKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gc2VsZi5oZWFkZXJzID0gc2VsZi5zdGF0dXMgPSBzZWxmLmVudmlyb24gPSBOb25lCisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgPSAwOyBzZWxmLmhlYWRlcnNfc2VudCA9IEZhbHNlCisKKworICAgIGRlZiBzZW5kX2hlYWRlcnMoc2VsZik6CisgICAgICAgICIiIlRyYW5zbWl0IGhlYWRlcnMgdG8gdGhlIGNsaWVudCwgdmlhIHNlbGYuX3dyaXRlKCkiIiIKKyAgICAgICAgc2VsZi5jbGVhbnVwX2hlYWRlcnMoKQorICAgICAgICBzZWxmLmhlYWRlcnNfc2VudCA9IFRydWUKKyAgICAgICAgaWYgbm90IHNlbGYub3JpZ2luX3NlcnZlciBvciBzZWxmLmNsaWVudF9pc19tb2Rlcm4oKToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9wcmVhbWJsZSgpCisgICAgICAgICAgICBzZWxmLl93cml0ZShzdHIoc2VsZi5oZWFkZXJzKSkKKworCisgICAgZGVmIHJlc3VsdF9pc19maWxlKHNlbGYpOgorICAgICAgICAiIiJUcnVlIGlmICdzZWxmLnJlc3VsdCcgaXMgYW4gaW5zdGFuY2Ugb2YgJ3NlbGYud3NnaV9maWxlX3dyYXBwZXInIiIiCisgICAgICAgIHdyYXBwZXIgPSBzZWxmLndzZ2lfZmlsZV93cmFwcGVyCisgICAgICAgIHJldHVybiB3cmFwcGVyIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKHNlbGYucmVzdWx0LHdyYXBwZXIpCisKKworICAgIGRlZiBjbGllbnRfaXNfbW9kZXJuKHNlbGYpOgorICAgICAgICAiIiJUcnVlIGlmIGNsaWVudCBjYW4gYWNjZXB0IHN0YXR1cyBhbmQgaGVhZGVycyIiIgorICAgICAgICByZXR1cm4gc2VsZi5lbnZpcm9uWydTRVJWRVJfUFJPVE9DT0wnXS51cHBlcigpICE9ICdIVFRQLzAuOScKKworCisgICAgZGVmIGxvZ19leGNlcHRpb24oc2VsZixleGNfaW5mbyk6CisgICAgICAgICIiIkxvZyB0aGUgJ2V4Y19pbmZvJyB0dXBsZSBpbiB0aGUgc2VydmVyIGxvZworCisgICAgICAgIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRvIHJldGFyZ2V0IHRoZSBvdXRwdXQgb3IgY2hhbmdlIGl0cyBmb3JtYXQuCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmcm9tIHRyYWNlYmFjayBpbXBvcnQgcHJpbnRfZXhjZXB0aW9uCisgICAgICAgICAgICBzdGRlcnIgPSBzZWxmLmdldF9zdGRlcnIoKQorICAgICAgICAgICAgcHJpbnRfZXhjZXB0aW9uKAorICAgICAgICAgICAgICAgIGV4Y19pbmZvWzBdLCBleGNfaW5mb1sxXSwgZXhjX2luZm9bMl0sCisgICAgICAgICAgICAgICAgc2VsZi50cmFjZWJhY2tfbGltaXQsIHN0ZGVycgorICAgICAgICAgICAgKQorICAgICAgICAgICAgc3RkZXJyLmZsdXNoKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGV4Y19pbmZvID0gTm9uZQorCisgICAgZGVmIGhhbmRsZV9lcnJvcihzZWxmKToKKyAgICAgICAgIiIiTG9nIGN1cnJlbnQgZXJyb3IsIGFuZCBzZW5kIGVycm9yIG91dHB1dCB0byBjbGllbnQgaWYgcG9zc2libGUiIiIKKyAgICAgICAgc2VsZi5sb2dfZXhjZXB0aW9uKHN5cy5leGNfaW5mbygpKQorICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXJzX3NlbnQ6CisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IHNlbGYuZXJyb3Jfb3V0cHV0KHNlbGYuZW52aXJvbiwgc2VsZi5zdGFydF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX3Jlc3BvbnNlKCkKKyAgICAgICAgIyBYWFggZWxzZTogYXR0ZW1wdCBhZHZhbmNlZCByZWNvdmVyeSB0ZWNobmlxdWVzIGZvciBIVE1MIG9yIHRleHQ/CisKKyAgICBkZWYgZXJyb3Jfb3V0cHV0KHNlbGYsIGVudmlyb24sIHN0YXJ0X3Jlc3BvbnNlKToKKyAgICAgICAgIiIiV1NHSSBtaW5pLWFwcCB0byBjcmVhdGUgZXJyb3Igb3V0cHV0CisKKyAgICAgICAgQnkgZGVmYXVsdCwgdGhpcyBqdXN0IHVzZXMgdGhlICdlcnJvcl9zdGF0dXMnLCAnZXJyb3JfaGVhZGVycycsCisgICAgICAgIGFuZCAnZXJyb3JfYm9keScgYXR0cmlidXRlcyB0byBnZW5lcmF0ZSBhbiBvdXRwdXQgcGFnZS4gIEl0IGNhbgorICAgICAgICBiZSBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3MgdG8gZHluYW1pY2FsbHkgZ2VuZXJhdGUgZGlhZ25vc3RpY3MsCisgICAgICAgIGNob29zZSBhbiBhcHByb3ByaWF0ZSBtZXNzYWdlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBsYW5ndWFnZSwgZXRjLgorCisgICAgICAgIE5vdGUsIGhvd2V2ZXIsIHRoYXQgaXQncyBub3QgcmVjb21tZW5kZWQgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlIHRvCisgICAgICAgIHNwaXQgb3V0IGRpYWdub3N0aWNzIHRvIGFueSBvbGQgdXNlcjsgaWRlYWxseSwgeW91IHNob3VsZCBoYXZlIHRvIGRvCisgICAgICAgIHNvbWV0aGluZyBzcGVjaWFsIHRvIGVuYWJsZSBkaWFnbm9zdGljIG91dHB1dCwgd2hpY2ggaXMgd2h5IHdlIGRvbid0CisgICAgICAgIGluY2x1ZGUgYW55IGhlcmUhCisgICAgICAgICIiIgorICAgICAgICBzdGFydF9yZXNwb25zZShzZWxmLmVycm9yX3N0YXR1cyxzZWxmLmVycm9yX2hlYWRlcnNbOl0sc3lzLmV4Y19pbmZvKCkpCisgICAgICAgIHJldHVybiBbc2VsZi5lcnJvcl9ib2R5XQorCisKKyAgICAjIFB1cmUgYWJzdHJhY3QgbWV0aG9kczsgKm11c3QqIGJlIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3NlcworCisgICAgZGVmIF93cml0ZShzZWxmLGRhdGEpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBidWZmZXIgZGF0YSBmb3Igc2VuZCB0byBjbGllbnQKKworICAgICAgICBJdCdzIG9rYXkgaWYgdGhpcyBtZXRob2QgYWN0dWFsbHkgdHJhbnNtaXRzIHRoZSBkYXRhOyBCYXNlSGFuZGxlcgorICAgICAgICBqdXN0IHNlcGFyYXRlcyB3cml0ZSBhbmQgZmx1c2ggb3BlcmF0aW9ucyBmb3IgZ3JlYXRlciBlZmZpY2llbmN5CisgICAgICAgIHdoZW4gdGhlIHVuZGVybHlpbmcgc3lzdGVtIGFjdHVhbGx5IGhhcyBzdWNoIGEgZGlzdGluY3Rpb24uCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgX2ZsdXNoKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBmb3JjZSBzZW5kaW5nIG9mIHJlY2VudCAnX3dyaXRlKCknIGNhbGxzCisKKyAgICAgICAgSXQncyBva2F5IGlmIHRoaXMgbWV0aG9kIGlzIGEgbm8tb3AgKGkuZS4sIGlmICdfd3JpdGUoKScgYWN0dWFsbHkKKyAgICAgICAgc2VuZHMgdGhlIGRhdGEuCisgICAgICAgICIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZ2V0X3N0ZGluKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byByZXR1cm4gc3VpdGFibGUgJ3dzZ2kuaW5wdXQnIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byByZXR1cm4gc3VpdGFibGUgJ3dzZ2kuZXJyb3JzJyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgYWRkX2NnaV92YXJzKHNlbGYpOgorICAgICAgICAiIiJPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBpbnNlcnQgQ0dJIHZhcmlhYmxlcyBpbiAnc2VsZi5lbnZpcm9uJyIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKworY2xhc3MgU2ltcGxlSGFuZGxlcihCYXNlSGFuZGxlcik6CisgICAgIiIiSGFuZGxlciB0aGF0J3MganVzdCBpbml0aWFsaXplZCB3aXRoIHN0cmVhbXMsIGVudmlyb25tZW50LCBldGMuCisKKyAgICBUaGlzIGhhbmRsZXIgc3ViY2xhc3MgaXMgaW50ZW5kZWQgZm9yIHN5bmNocm9ub3VzIEhUVFAvMS4wIG9yaWdpbiBzZXJ2ZXJzLAorICAgIGFuZCBoYW5kbGVzIHNlbmRpbmcgdGhlIGVudGlyZSByZXNwb25zZSBvdXRwdXQsIGdpdmVuIHRoZSBjb3JyZWN0IGlucHV0cy4KKworICAgIFVzYWdlOjoKKworICAgICAgICBoYW5kbGVyID0gU2ltcGxlSGFuZGxlcigKKyAgICAgICAgICAgIGlucCxvdXQsZXJyLGVudiwgbXVsdGl0aHJlYWQ9RmFsc2UsIG11bHRpcHJvY2Vzcz1UcnVlCisgICAgICAgICkKKyAgICAgICAgaGFuZGxlci5ydW4oYXBwKSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsc3RkaW4sc3Rkb3V0LHN0ZGVycixlbnZpcm9uLAorICAgICAgICBtdWx0aXRocmVhZD1UcnVlLCBtdWx0aXByb2Nlc3M9RmFsc2UKKyAgICApOgorICAgICAgICBzZWxmLnN0ZGluID0gc3RkaW4KKyAgICAgICAgc2VsZi5zdGRvdXQgPSBzdGRvdXQKKyAgICAgICAgc2VsZi5zdGRlcnIgPSBzdGRlcnIKKyAgICAgICAgc2VsZi5iYXNlX2VudiA9IGVudmlyb24KKyAgICAgICAgc2VsZi53c2dpX211bHRpdGhyZWFkID0gbXVsdGl0aHJlYWQKKyAgICAgICAgc2VsZi53c2dpX211bHRpcHJvY2VzcyA9IG11bHRpcHJvY2VzcworCisgICAgZGVmIGdldF9zdGRpbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RkaW4KKworICAgIGRlZiBnZXRfc3RkZXJyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGRlcnIKKworICAgIGRlZiBhZGRfY2dpX3ZhcnMoc2VsZik6CisgICAgICAgIHNlbGYuZW52aXJvbi51cGRhdGUoc2VsZi5iYXNlX2VudikKKworICAgIGRlZiBfd3JpdGUoc2VsZixkYXRhKToKKyAgICAgICAgc2VsZi5zdGRvdXQud3JpdGUoZGF0YSkKKyAgICAgICAgc2VsZi5fd3JpdGUgPSBzZWxmLnN0ZG91dC53cml0ZQorCisgICAgZGVmIF9mbHVzaChzZWxmKToKKyAgICAgICAgc2VsZi5zdGRvdXQuZmx1c2goKQorICAgICAgICBzZWxmLl9mbHVzaCA9IHNlbGYuc3Rkb3V0LmZsdXNoCisKKworY2xhc3MgQmFzZUNHSUhhbmRsZXIoU2ltcGxlSGFuZGxlcik6CisKKyAgICAiIiJDR0ktbGlrZSBzeXN0ZW1zIHVzaW5nIGlucHV0L291dHB1dC9lcnJvciBzdHJlYW1zIGFuZCBlbnZpcm9uIG1hcHBpbmcKKworICAgIFVzYWdlOjoKKworICAgICAgICBoYW5kbGVyID0gQmFzZUNHSUhhbmRsZXIoaW5wLG91dCxlcnIsZW52KQorICAgICAgICBoYW5kbGVyLnJ1bihhcHApCisKKyAgICBUaGlzIGhhbmRsZXIgY2xhc3MgaXMgdXNlZnVsIGZvciBnYXRld2F5IHByb3RvY29scyBsaWtlIFJlYWR5RXhlYyBhbmQKKyAgICBGYXN0Q0dJLCB0aGF0IGhhdmUgdXNhYmxlIGlucHV0L291dHB1dC9lcnJvciBzdHJlYW1zIGFuZCBhbiBlbnZpcm9ubWVudAorICAgIG1hcHBpbmcuICBJdCdzIGFsc28gdGhlIGJhc2UgY2xhc3MgZm9yIENHSUhhbmRsZXIsIHdoaWNoIGp1c3QgdXNlcworICAgIHN5cy5zdGRpbiwgb3MuZW52aXJvbiwgYW5kIHNvIG9uLgorCisgICAgVGhlIGNvbnN0cnVjdG9yIGFsc28gdGFrZXMga2V5d29yZCBhcmd1bWVudHMgJ211bHRpdGhyZWFkJyBhbmQKKyAgICAnbXVsdGlwcm9jZXNzJyAoZGVmYXVsdGluZyB0byAnVHJ1ZScgYW5kICdGYWxzZScgcmVzcGVjdGl2ZWx5KSB0byBjb250cm9sCisgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2VudCB0byB0aGUgYXBwbGljYXRpb24uICBJdCBzZXRzICdvcmlnaW5fc2VydmVyJyB0bworICAgIEZhbHNlICh0byBlbmFibGUgQ0dJLWxpa2Ugb3V0cHV0KSwgYW5kIGFzc3VtZXMgdGhhdCAnd3NnaS5ydW5fb25jZScgaXMKKyAgICBGYWxzZS4KKyAgICAiIiIKKworICAgIG9yaWdpbl9zZXJ2ZXIgPSBGYWxzZQorCisKK2NsYXNzIENHSUhhbmRsZXIoQmFzZUNHSUhhbmRsZXIpOgorCisgICAgIiIiQ0dJLWJhc2VkIGludm9jYXRpb24gdmlhIHN5cy5zdGRpbi9zdGRvdXQvc3RkZXJyIGFuZCBvcy5lbnZpcm9uCisKKyAgICBVc2FnZTo6CisKKyAgICAgICAgQ0dJSGFuZGxlcigpLnJ1bihhcHApCisKKyAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgY2xhc3MgYW5kIEJhc2VDR0lIYW5kbGVyIGlzIHRoYXQgaXQgYWx3YXlzCisgICAgdXNlcyAnd3NnaS5ydW5fb25jZScgb2YgJ1RydWUnLCAnd3NnaS5tdWx0aXRocmVhZCcgb2YgJ0ZhbHNlJywgYW5kCisgICAgJ3dzZ2kubXVsdGlwcm9jZXNzJyBvZiAnVHJ1ZScuICBJdCBkb2VzIG5vdCB0YWtlIGFueSBpbml0aWFsaXphdGlvbgorICAgIHBhcmFtZXRlcnMsIGJ1dCBhbHdheXMgdXNlcyAnc3lzLnN0ZGluJywgJ29zLmVudmlyb24nLCBhbmQgZnJpZW5kcy4KKworICAgIElmIHlvdSBuZWVkIHRvIG92ZXJyaWRlIGFueSBvZiB0aGVzZSBwYXJhbWV0ZXJzLCB1c2UgQmFzZUNHSUhhbmRsZXIKKyAgICBpbnN0ZWFkLgorICAgICIiIgorCisgICAgd3NnaV9ydW5fb25jZSA9IFRydWUKKyAgICAjIERvIG5vdCBhbGxvdyBvcy5lbnZpcm9uIHRvIGxlYWsgYmV0d2VlbiByZXF1ZXN0cyBpbiBHb29nbGUgQXBwIEVuZ2luZQorICAgICMgYW5kIG90aGVyIG11bHRpLXJ1biBDR0kgdXNlIGNhc2VzLiAgVGhpcyBpcyBub3QgZWFzaWx5IHRlc3RhYmxlLgorICAgICMgU2VlIGh0dHA6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWU3MjUwCisgICAgb3NfZW52aXJvbiA9IHt9CisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEJhc2VDR0lIYW5kbGVyLl9faW5pdF9fKAorICAgICAgICAgICAgc2VsZiwgc3lzLnN0ZGluLCBzeXMuc3Rkb3V0LCBzeXMuc3RkZXJyLCBkaWN0KG9zLmVudmlyb24uaXRlbXMoKSksCisgICAgICAgICAgICBtdWx0aXRocmVhZD1GYWxzZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5YyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oYW5kbGVycy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkOGViNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oYW5kbGVycy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hhbmRsZXJzLnB5byBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oYW5kbGVycy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5MmIyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oYW5kbGVycy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHkgYi9saWIvcHl0aG9uMi43L3dzZ2lyZWYvaGVhZGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhjNjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHkKQEAgLTAsMCArMSwxNjkgQEAKKyIiIk1hbmFnZSBIVFRQIFJlc3BvbnNlIEhlYWRlcnMKKworTXVjaCBvZiB0aGlzIG1vZHVsZSBpcyByZWQtaGFuZGVkbHkgcGlsZmVyZWQgZnJvbSBlbWFpbC5tZXNzYWdlIGluIHRoZSBzdGRsaWIsCitzbyBwb3J0aW9ucyBhcmUgQ29weXJpZ2h0IChDKSAyMDAxLDIwMDIgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZCB3ZXJlCit3cml0dGVuIGJ5IEJhcnJ5IFdhcnNhdy4KKyIiIgorCitmcm9tIHR5cGVzIGltcG9ydCBMaXN0VHlwZSwgVHVwbGVUeXBlCisKKyMgUmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBgc3BlY2lhbCcgY2hhcmFjdGVycyBpbiBwYXJhbWV0ZXJzLCB0aGUKKyMgZXhpc3RlbmNlIG9mIHdoaWNoIGZvcmNlIHF1b3Rpbmcgb2YgdGhlIHBhcmFtZXRlciB2YWx1ZS4KK2ltcG9ydCByZQordHNwZWNpYWxzID0gcmUuY29tcGlsZShyJ1sgXChcKTw+QCw7OlxcIi9cW1xdXD89XScpCisKK2RlZiBfZm9ybWF0cGFyYW0ocGFyYW0sIHZhbHVlPU5vbmUsIHF1b3RlPTEpOgorICAgICIiIkNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGZvcm1hdCBhbmQgcmV0dXJuIGEga2V5PXZhbHVlIHBhaXIuCisKKyAgICBUaGlzIHdpbGwgcXVvdGUgdGhlIHZhbHVlIGlmIG5lZWRlZCBvciBpZiBxdW90ZSBpcyB0cnVlLgorICAgICIiIgorICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lIGFuZCBsZW4odmFsdWUpID4gMDoKKyAgICAgICAgaWYgcXVvdGUgb3IgdHNwZWNpYWxzLnNlYXJjaCh2YWx1ZSk6CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcJywgJ1xcXFwnKS5yZXBsYWNlKCciJywgcidcIicpCisgICAgICAgICAgICByZXR1cm4gJyVzPSIlcyInICUgKHBhcmFtLCB2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAnJXM9JXMnICUgKHBhcmFtLCB2YWx1ZSkKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gcGFyYW0KKworCitjbGFzcyBIZWFkZXJzOgorCisgICAgIiIiTWFuYWdlIGEgY29sbGVjdGlvbiBvZiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLGhlYWRlcnMpOgorICAgICAgICBpZiB0eXBlKGhlYWRlcnMpIGlzIG5vdCBMaXN0VHlwZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiSGVhZGVycyBtdXN0IGJlIGEgbGlzdCBvZiBuYW1lL3ZhbHVlIHR1cGxlcyIpCisgICAgICAgIHNlbGYuX2hlYWRlcnMgPSBoZWFkZXJzCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgaGVhZGVycywgaW5jbHVkaW5nIGR1cGxpY2F0ZXMuIiIiCisgICAgICAgIHJldHVybiBsZW4oc2VsZi5faGVhZGVycykKKworICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBuYW1lLCB2YWwpOgorICAgICAgICAiIiJTZXQgdGhlIHZhbHVlIG9mIGEgaGVhZGVyLiIiIgorICAgICAgICBkZWwgc2VsZltuYW1lXQorICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgobmFtZSwgdmFsKSkKKworICAgIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLG5hbWUpOgorICAgICAgICAiIiJEZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIGEgaGVhZGVyLCBpZiBwcmVzZW50LgorCisgICAgICAgIERvZXMgKm5vdCogcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBoZWFkZXIgaXMgbWlzc2luZy4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgc2VsZi5faGVhZGVyc1s6XSA9IFtrdiBmb3Iga3YgaW4gc2VsZi5faGVhZGVycyBpZiBrdlswXS5sb3dlcigpICE9IG5hbWVdCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixuYW1lKToKKyAgICAgICAgIiIiR2V0IHRoZSBmaXJzdCBoZWFkZXIgdmFsdWUgZm9yICduYW1lJworCisgICAgICAgIFJldHVybiBOb25lIGlmIHRoZSBoZWFkZXIgaXMgbWlzc2luZyBpbnN0ZWFkIG9mIHJhaXNpbmcgYW4gZXhjZXB0aW9uLgorCisgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgaGVhZGVyIGFwcGVhcmVkIG11bHRpcGxlIHRpbWVzLCB0aGUgZmlyc3QgZXhhY3RseSB3aGljaAorICAgICAgICBvY2N1cnJhbmNlIGdldHMgcmV0dXJuZWQgaXMgdW5kZWZpbmVkLiAgVXNlIGdldGFsbCgpIHRvIGdldCBhbGwKKyAgICAgICAgdGhlIHZhbHVlcyBtYXRjaGluZyBhIGhlYWRlciBmaWVsZCBuYW1lLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KG5hbWUpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgdGhlIGhlYWRlci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KG5hbWUpIGlzIG5vdCBOb25lCisKKyAgICBfX2NvbnRhaW5zX18gPSBoYXNfa2V5CisKKworICAgIGRlZiBnZXRfYWxsKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgdmFsdWVzIGZvciB0aGUgbmFtZWQgZmllbGQuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGhlYWRlcgorICAgICAgICBsaXN0IG9yIHdlcmUgYWRkZWQgdG8gdGhpcyBpbnN0YW5jZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuICBBbnkKKyAgICAgICAgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlciBsaXN0LgorICAgICAgICBJZiBubyBmaWVsZHMgZXhpc3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgcmV0dXJucyBhbiBlbXB0eSBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICByZXR1cm4gW2t2WzFdIGZvciBrdiBpbiBzZWxmLl9oZWFkZXJzIGlmIGt2WzBdLmxvd2VyKCk9PW5hbWVdCisKKworICAgIGRlZiBnZXQoc2VsZixuYW1lLGRlZmF1bHQ9Tm9uZSk6CisgICAgICAgICIiIkdldCB0aGUgZmlyc3QgaGVhZGVyIHZhbHVlIGZvciAnbmFtZScsIG9yIHJldHVybiAnZGVmYXVsdCciIiIKKyAgICAgICAgbmFtZSA9IG5hbWUubG93ZXIoKQorICAgICAgICBmb3Igayx2IGluIHNlbGYuX2hlYWRlcnM6CisgICAgICAgICAgICBpZiBrLmxvd2VyKCk9PW5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgcmV0dXJuIGRlZmF1bHQKKworCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBoZWFkZXIgZmllbGQgbmFtZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlIG9yaWdpbmFsIGhlYWRlcgorICAgICAgICBsaXN0LCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIFtrIGZvciBrLCB2IGluIHNlbGYuX2hlYWRlcnNdCisKKyAgICBkZWYgdmFsdWVzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCBoZWFkZXIgdmFsdWVzLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbCBoZWFkZXIKKyAgICAgICAgbGlzdCwgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBbdiBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzXQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICAiIiJHZXQgYWxsIHRoZSBoZWFkZXIgZmllbGRzIGFuZCB2YWx1ZXMuCisKKyAgICAgICAgVGhlc2Ugd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3QsIG9yIHdlcmUgYWRkZWQgdG8gdGhpcyBpbnN0YW5jZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5faGVhZGVyc1s6XQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkhlYWRlcnMoJXIpIiAlIHNlbGYuX2hlYWRlcnMKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJzdHIoKSByZXR1cm5zIHRoZSBmb3JtYXR0ZWQgaGVhZGVycywgY29tcGxldGUgd2l0aCBlbmQgbGluZSwKKyAgICAgICAgc3VpdGFibGUgZm9yIGRpcmVjdCBIVFRQIHRyYW5zbWlzc2lvbi4iIiIKKyAgICAgICAgcmV0dXJuICdcclxuJy5qb2luKFsiJXM6ICVzIiAlIGt2IGZvciBrdiBpbiBzZWxmLl9oZWFkZXJzXStbJycsJyddKQorCisgICAgZGVmIHNldGRlZmF1bHQoc2VsZixuYW1lLHZhbHVlKToKKyAgICAgICAgIiIiUmV0dXJuIGZpcnN0IG1hdGNoaW5nIGhlYWRlciB2YWx1ZSBmb3IgJ25hbWUnLCBvciAndmFsdWUnCisKKyAgICAgICAgSWYgdGhlcmUgaXMgbm8gaGVhZGVyIG5hbWVkICduYW1lJywgYWRkIGEgbmV3IGhlYWRlciB3aXRoIG5hbWUgJ25hbWUnCisgICAgICAgIGFuZCB2YWx1ZSAndmFsdWUnLiIiIgorICAgICAgICByZXN1bHQgPSBzZWxmLmdldChuYW1lKQorICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChuYW1lLHZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIGFkZF9oZWFkZXIoc2VsZiwgX25hbWUsIF92YWx1ZSwgKipfcGFyYW1zKToKKyAgICAgICAgIiIiRXh0ZW5kZWQgaGVhZGVyIHNldHRpbmcuCisKKyAgICAgICAgX25hbWUgaXMgdGhlIGhlYWRlciBmaWVsZCB0byBhZGQuICBrZXl3b3JkIGFyZ3VtZW50cyBjYW4gYmUgdXNlZCB0byBzZXQKKyAgICAgICAgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIGZvciB0aGUgaGVhZGVyIGZpZWxkLCB3aXRoIHVuZGVyc2NvcmVzIGNvbnZlcnRlZAorICAgICAgICB0byBkYXNoZXMuICBOb3JtYWxseSB0aGUgcGFyYW1ldGVyIHdpbGwgYmUgYWRkZWQgYXMga2V5PSJ2YWx1ZSIgdW5sZXNzCisgICAgICAgIHZhbHVlIGlzIE5vbmUsIGluIHdoaWNoIGNhc2Ugb25seSB0aGUga2V5IHdpbGwgYmUgYWRkZWQuCisKKyAgICAgICAgRXhhbXBsZToKKworICAgICAgICBoLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKKworICAgICAgICBOb3RlIHRoYXQgdW5saWtlIHRoZSBjb3JyZXNwb25kaW5nICdlbWFpbC5tZXNzYWdlJyBtZXRob2QsIHRoaXMgZG9lcworICAgICAgICAqbm90KiBoYW5kbGUgJyhjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUpJyB0dXBsZXM6IGFsbCB2YWx1ZXMgbXVzdCBiZQorICAgICAgICBzdHJpbmdzIG9yIE5vbmUuCisgICAgICAgICIiIgorICAgICAgICBwYXJ0cyA9IFtdCisgICAgICAgIGlmIF92YWx1ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHBhcnRzLmFwcGVuZChfdmFsdWUpCisgICAgICAgIGZvciBrLCB2IGluIF9wYXJhbXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIHYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoay5yZXBsYWNlKCdfJywgJy0nKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFydHMuYXBwZW5kKF9mb3JtYXRwYXJhbShrLnJlcGxhY2UoJ18nLCAnLScpLCB2KSkKKyAgICAgICAgc2VsZi5faGVhZGVycy5hcHBlbmQoKF9uYW1lLCAiOyAiLmpvaW4ocGFydHMpKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9oZWFkZXJzLnB5YyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oZWFkZXJzLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlmNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9oZWFkZXJzLnB5byBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9oZWFkZXJzLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlmNWU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL2hlYWRlcnMucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5IGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhMzg1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5CkBAIC0wLDAgKzEsMTU1IEBACisiIiJCYXNlSFRUUFNlcnZlciB0aGF0IGltcGxlbWVudHMgdGhlIFB5dGhvbiBXU0dJIHByb3RvY29sIChQRVAgMzMzLCByZXYgMS4yMSkKKworVGhpcyBpcyBib3RoIGFuIGV4YW1wbGUgb2YgaG93IFdTR0kgY2FuIGJlIGltcGxlbWVudGVkLCBhbmQgYSBiYXNpcyBmb3IgcnVubmluZworc2ltcGxlIHdlYiBhcHBsaWNhdGlvbnMgb24gYSBsb2NhbCBtYWNoaW5lLCBzdWNoIGFzIG1pZ2h0IGJlIGRvbmUgd2hlbiB0ZXN0aW5nCitvciBkZWJ1Z2dpbmcgYW4gYXBwbGljYXRpb24uICBJdCBoYXMgbm90IGJlZW4gcmV2aWV3ZWQgZm9yIHNlY3VyaXR5IGlzc3VlcywKK2hvd2V2ZXIsIGFuZCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UgdXNlIGEgInJlYWwiIHdlYiBzZXJ2ZXIgZm9yCitwcm9kdWN0aW9uIHVzZS4KKworRm9yIGV4YW1wbGUgdXNhZ2UsIHNlZSB0aGUgJ2lmIF9fbmFtZV9fPT0iX19tYWluX18iJyBibG9jayBhdCB0aGUgZW5kIG9mIHRoZQorbW9kdWxlLiAgU2VlIGFsc28gdGhlIEJhc2VIVFRQU2VydmVyIG1vZHVsZSBkb2NzIGZvciBvdGhlciBBUEkgaW5mb3JtYXRpb24uCisiIiIKKworZnJvbSBCYXNlSFRUUFNlcnZlciBpbXBvcnQgQmFzZUhUVFBSZXF1ZXN0SGFuZGxlciwgSFRUUFNlcnZlcgoraW1wb3J0IHVybGxpYiwgc3lzCitmcm9tIHdzZ2lyZWYuaGFuZGxlcnMgaW1wb3J0IFNpbXBsZUhhbmRsZXIKKworX192ZXJzaW9uX18gPSAiMC4xIgorX19hbGxfXyA9IFsnV1NHSVNlcnZlcicsICdXU0dJUmVxdWVzdEhhbmRsZXInLCAnZGVtb19hcHAnLCAnbWFrZV9zZXJ2ZXInXQorCisKK3NlcnZlcl92ZXJzaW9uID0gIldTR0lTZXJ2ZXIvIiArIF9fdmVyc2lvbl9fCitzeXNfdmVyc2lvbiA9ICJQeXRob24vIiArIHN5cy52ZXJzaW9uLnNwbGl0KClbMF0KK3NvZnR3YXJlX3ZlcnNpb24gPSBzZXJ2ZXJfdmVyc2lvbiArICcgJyArIHN5c192ZXJzaW9uCisKKworY2xhc3MgU2VydmVySGFuZGxlcihTaW1wbGVIYW5kbGVyKToKKworICAgIHNlcnZlcl9zb2Z0d2FyZSA9IHNvZnR3YXJlX3ZlcnNpb24KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5yZXF1ZXN0X2hhbmRsZXIubG9nX3JlcXVlc3QoCisgICAgICAgICAgICAgICAgc2VsZi5zdGF0dXMuc3BsaXQoJyAnLDEpWzBdLCBzZWxmLmJ5dGVzX3NlbnQKKyAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIFNpbXBsZUhhbmRsZXIuY2xvc2Uoc2VsZikKKworCisKK2NsYXNzIFdTR0lTZXJ2ZXIoSFRUUFNlcnZlcik6CisKKyAgICAiIiJCYXNlSFRUUFNlcnZlciB0aGF0IGltcGxlbWVudHMgdGhlIFB5dGhvbiBXU0dJIHByb3RvY29sIiIiCisKKyAgICBhcHBsaWNhdGlvbiA9IE5vbmUKKworICAgIGRlZiBzZXJ2ZXJfYmluZChzZWxmKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgc2VydmVyX2JpbmQgdG8gc3RvcmUgdGhlIHNlcnZlciBuYW1lLiIiIgorICAgICAgICBIVFRQU2VydmVyLnNlcnZlcl9iaW5kKHNlbGYpCisgICAgICAgIHNlbGYuc2V0dXBfZW52aXJvbigpCisKKyAgICBkZWYgc2V0dXBfZW52aXJvbihzZWxmKToKKyAgICAgICAgIyBTZXQgdXAgYmFzZSBlbnZpcm9ubWVudAorICAgICAgICBlbnYgPSBzZWxmLmJhc2VfZW52aXJvbiA9IHt9CisgICAgICAgIGVudlsnU0VSVkVSX05BTUUnXSA9IHNlbGYuc2VydmVyX25hbWUKKyAgICAgICAgZW52WydHQVRFV0FZX0lOVEVSRkFDRSddID0gJ0NHSS8xLjEnCisgICAgICAgIGVudlsnU0VSVkVSX1BPUlQnXSA9IHN0cihzZWxmLnNlcnZlcl9wb3J0KQorICAgICAgICBlbnZbJ1JFTU9URV9IT1NUJ109JycKKyAgICAgICAgZW52WydDT05URU5UX0xFTkdUSCddPScnCisgICAgICAgIGVudlsnU0NSSVBUX05BTUUnXSA9ICcnCisKKyAgICBkZWYgZ2V0X2FwcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXBwbGljYXRpb24KKworICAgIGRlZiBzZXRfYXBwKHNlbGYsYXBwbGljYXRpb24pOgorICAgICAgICBzZWxmLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb24KKworCisKK2NsYXNzIFdTR0lSZXF1ZXN0SGFuZGxlcihCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKKworICAgIHNlcnZlcl92ZXJzaW9uID0gIldTR0lTZXJ2ZXIvIiArIF9fdmVyc2lvbl9fCisKKyAgICBkZWYgZ2V0X2Vudmlyb24oc2VsZik6CisgICAgICAgIGVudiA9IHNlbGYuc2VydmVyLmJhc2VfZW52aXJvbi5jb3B5KCkKKyAgICAgICAgZW52WydTRVJWRVJfUFJPVE9DT0wnXSA9IHNlbGYucmVxdWVzdF92ZXJzaW9uCisgICAgICAgIGVudlsnUkVRVUVTVF9NRVRIT0QnXSA9IHNlbGYuY29tbWFuZAorICAgICAgICBpZiAnPycgaW4gc2VsZi5wYXRoOgorICAgICAgICAgICAgcGF0aCxxdWVyeSA9IHNlbGYucGF0aC5zcGxpdCgnPycsMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGgscXVlcnkgPSBzZWxmLnBhdGgsJycKKworICAgICAgICBlbnZbJ1BBVEhfSU5GTyddID0gdXJsbGliLnVucXVvdGUocGF0aCkKKyAgICAgICAgZW52WydRVUVSWV9TVFJJTkcnXSA9IHF1ZXJ5CisKKyAgICAgICAgaG9zdCA9IHNlbGYuYWRkcmVzc19zdHJpbmcoKQorICAgICAgICBpZiBob3N0ICE9IHNlbGYuY2xpZW50X2FkZHJlc3NbMF06CisgICAgICAgICAgICBlbnZbJ1JFTU9URV9IT1NUJ10gPSBob3N0CisgICAgICAgIGVudlsnUkVNT1RFX0FERFInXSA9IHNlbGYuY2xpZW50X2FkZHJlc3NbMF0KKworICAgICAgICBpZiBzZWxmLmhlYWRlcnMudHlwZWhlYWRlciBpcyBOb25lOgorICAgICAgICAgICAgZW52WydDT05URU5UX1RZUEUnXSA9IHNlbGYuaGVhZGVycy50eXBlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfVFlQRSddID0gc2VsZi5oZWFkZXJzLnR5cGVoZWFkZXIKKworICAgICAgICBsZW5ndGggPSBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVyKCdjb250ZW50LWxlbmd0aCcpCisgICAgICAgIGlmIGxlbmd0aDoKKyAgICAgICAgICAgIGVudlsnQ09OVEVOVF9MRU5HVEgnXSA9IGxlbmd0aAorCisgICAgICAgIGZvciBoIGluIHNlbGYuaGVhZGVycy5oZWFkZXJzOgorICAgICAgICAgICAgayx2ID0gaC5zcGxpdCgnOicsMSkKKyAgICAgICAgICAgIGs9ay5yZXBsYWNlKCctJywnXycpLnVwcGVyKCk7IHY9di5zdHJpcCgpCisgICAgICAgICAgICBpZiBrIGluIGVudjoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgICAgICAgICAgICAgIyBza2lwIGNvbnRlbnQgbGVuZ3RoLCB0eXBlLGV0Yy4KKyAgICAgICAgICAgIGlmICdIVFRQXycrayBpbiBlbnY6CisgICAgICAgICAgICAgICAgZW52WydIVFRQXycra10gKz0gJywnK3YgICAgICMgY29tbWEtc2VwYXJhdGUgbXVsdGlwbGUgaGVhZGVycworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbnZbJ0hUVFBfJytrXSA9IHYKKyAgICAgICAgcmV0dXJuIGVudgorCisgICAgZGVmIGdldF9zdGRlcnIoc2VsZik6CisgICAgICAgIHJldHVybiBzeXMuc3RkZXJyCisKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgYSBzaW5nbGUgSFRUUCByZXF1ZXN0IiIiCisKKyAgICAgICAgc2VsZi5yYXdfcmVxdWVzdGxpbmUgPSBzZWxmLnJmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHNlbGYucGFyc2VfcmVxdWVzdCgpOiAjIEFuIGVycm9yIGNvZGUgaGFzIGJlZW4gc2VudCwganVzdCBleGl0CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBoYW5kbGVyID0gU2VydmVySGFuZGxlcigKKyAgICAgICAgICAgIHNlbGYucmZpbGUsIHNlbGYud2ZpbGUsIHNlbGYuZ2V0X3N0ZGVycigpLCBzZWxmLmdldF9lbnZpcm9uKCkKKyAgICAgICAgKQorICAgICAgICBoYW5kbGVyLnJlcXVlc3RfaGFuZGxlciA9IHNlbGYgICAgICAjIGJhY2twb2ludGVyIGZvciBsb2dnaW5nCisgICAgICAgIGhhbmRsZXIucnVuKHNlbGYuc2VydmVyLmdldF9hcHAoKSkKKworCisKK2RlZiBkZW1vX2FwcChlbnZpcm9uLHN0YXJ0X3Jlc3BvbnNlKToKKyAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIHN0ZG91dCA9IFN0cmluZ0lPKCkKKyAgICBwcmludCA+PnN0ZG91dCwgIkhlbGxvIHdvcmxkISIKKyAgICBwcmludCA+PnN0ZG91dAorICAgIGggPSBlbnZpcm9uLml0ZW1zKCk7IGguc29ydCgpCisgICAgZm9yIGssdiBpbiBoOgorICAgICAgICBwcmludCA+PnN0ZG91dCwgaywnPScsIHJlcHIodikKKyAgICBzdGFydF9yZXNwb25zZSgiMjAwIE9LIiwgWygnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpXSkKKyAgICByZXR1cm4gW3N0ZG91dC5nZXR2YWx1ZSgpXQorCisKK2RlZiBtYWtlX3NlcnZlcigKKyAgICBob3N0LCBwb3J0LCBhcHAsIHNlcnZlcl9jbGFzcz1XU0dJU2VydmVyLCBoYW5kbGVyX2NsYXNzPVdTR0lSZXF1ZXN0SGFuZGxlcgorKToKKyAgICAiIiJDcmVhdGUgYSBuZXcgV1NHSSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIGBob3N0YCBhbmQgYHBvcnRgIGZvciBgYXBwYCIiIgorICAgIHNlcnZlciA9IHNlcnZlcl9jbGFzcygoaG9zdCwgcG9ydCksIGhhbmRsZXJfY2xhc3MpCisgICAgc2VydmVyLnNldF9hcHAoYXBwKQorICAgIHJldHVybiBzZXJ2ZXIKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGh0dHBkID0gbWFrZV9zZXJ2ZXIoJycsIDgwMDAsIGRlbW9fYXBwKQorICAgIHNhID0gaHR0cGQuc29ja2V0LmdldHNvY2tuYW1lKCkKKyAgICBwcmludCAiU2VydmluZyBIVFRQIG9uIiwgc2FbMF0sICJwb3J0Iiwgc2FbMV0sICIuLi4iCisgICAgaW1wb3J0IHdlYmJyb3dzZXIKKyAgICB3ZWJicm93c2VyLm9wZW4oJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC94eXo/YWJjJykKKyAgICBodHRwZC5oYW5kbGVfcmVxdWVzdCgpICAjIHNlcnZlIG9uZSByZXF1ZXN0LCB0aGVuIGV4aXQKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5YyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmI0YjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5byBiL2xpYi9weXRob24yLjcvd3NnaXJlZi9zaW1wbGVfc2VydmVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmI0YjVhCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi91dGlsLnB5IGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0YjE4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi91dGlsLnB5CkBAIC0wLDAgKzEsMTY1IEBACisiIiJNaXNjZWxsYW5lb3VzIFdTR0ktcmVsYXRlZCBVdGlsaXRpZXMiIiIKKworaW1wb3J0IHBvc2l4cGF0aAorCitfX2FsbF9fID0gWworICAgICdGaWxlV3JhcHBlcicsICdndWVzc19zY2hlbWUnLCAnYXBwbGljYXRpb25fdXJpJywgJ3JlcXVlc3RfdXJpJywKKyAgICAnc2hpZnRfcGF0aF9pbmZvJywgJ3NldHVwX3Rlc3RpbmdfZGVmYXVsdHMnLAorXQorCisKK2NsYXNzIEZpbGVXcmFwcGVyOgorICAgICIiIldyYXBwZXIgdG8gY29udmVydCBmaWxlLWxpa2Ugb2JqZWN0cyB0byBpdGVyYWJsZXMiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlbGlrZSwgYmxrc2l6ZT04MTkyKToKKyAgICAgICAgc2VsZi5maWxlbGlrZSA9IGZpbGVsaWtlCisgICAgICAgIHNlbGYuYmxrc2l6ZSA9IGJsa3NpemUKKyAgICAgICAgaWYgaGFzYXR0cihmaWxlbGlrZSwnY2xvc2UnKToKKyAgICAgICAgICAgIHNlbGYuY2xvc2UgPSBmaWxlbGlrZS5jbG9zZQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsa2V5KToKKyAgICAgICAgZGF0YSA9IHNlbGYuZmlsZWxpa2UucmVhZChzZWxmLmJsa3NpemUpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICByYWlzZSBJbmRleEVycm9yCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuZmlsZWxpa2UucmVhZChzZWxmLmJsa3NpemUpCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisKK2RlZiBndWVzc19zY2hlbWUoZW52aXJvbik6CisgICAgIiIiUmV0dXJuIGEgZ3Vlc3MgZm9yIHdoZXRoZXIgJ3dzZ2kudXJsX3NjaGVtZScgc2hvdWxkIGJlICdodHRwJyBvciAnaHR0cHMnCisgICAgIiIiCisgICAgaWYgZW52aXJvbi5nZXQoIkhUVFBTIikgaW4gKCd5ZXMnLCdvbicsJzEnKToKKyAgICAgICAgcmV0dXJuICdodHRwcycKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gJ2h0dHAnCisKK2RlZiBhcHBsaWNhdGlvbl91cmkoZW52aXJvbik6CisgICAgIiIiUmV0dXJuIHRoZSBhcHBsaWNhdGlvbidzIGJhc2UgVVJJIChubyBQQVRIX0lORk8gb3IgUVVFUllfU1RSSU5HKSIiIgorICAgIHVybCA9IGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddKyc6Ly8nCisgICAgZnJvbSB1cmxsaWIgaW1wb3J0IHF1b3RlCisKKyAgICBpZiBlbnZpcm9uLmdldCgnSFRUUF9IT1NUJyk6CisgICAgICAgIHVybCArPSBlbnZpcm9uWydIVFRQX0hPU1QnXQorICAgIGVsc2U6CisgICAgICAgIHVybCArPSBlbnZpcm9uWydTRVJWRVJfTkFNRSddCisKKyAgICAgICAgaWYgZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10gPT0gJ2h0dHBzJzoKKyAgICAgICAgICAgIGlmIGVudmlyb25bJ1NFUlZFUl9QT1JUJ10gIT0gJzQ0Myc6CisgICAgICAgICAgICAgICAgdXJsICs9ICc6JyArIGVudmlyb25bJ1NFUlZFUl9QT1JUJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGVudmlyb25bJ1NFUlZFUl9QT1JUJ10gIT0gJzgwJzoKKyAgICAgICAgICAgICAgICB1cmwgKz0gJzonICsgZW52aXJvblsnU0VSVkVSX1BPUlQnXQorCisgICAgdXJsICs9IHF1b3RlKGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScpIG9yICcvJykKKyAgICByZXR1cm4gdXJsCisKK2RlZiByZXF1ZXN0X3VyaShlbnZpcm9uLCBpbmNsdWRlX3F1ZXJ5PTEpOgorICAgICIiIlJldHVybiB0aGUgZnVsbCByZXF1ZXN0IFVSSSwgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIHF1ZXJ5IHN0cmluZyIiIgorICAgIHVybCA9IGFwcGxpY2F0aW9uX3VyaShlbnZpcm9uKQorICAgIGZyb20gdXJsbGliIGltcG9ydCBxdW90ZQorICAgIHBhdGhfaW5mbyA9IHF1b3RlKGVudmlyb24uZ2V0KCdQQVRIX0lORk8nLCcnKSxzYWZlPScvOz0sJykKKyAgICBpZiBub3QgZW52aXJvbi5nZXQoJ1NDUklQVF9OQU1FJyk6CisgICAgICAgIHVybCArPSBwYXRoX2luZm9bMTpdCisgICAgZWxzZToKKyAgICAgICAgdXJsICs9IHBhdGhfaW5mbworICAgIGlmIGluY2x1ZGVfcXVlcnkgYW5kIGVudmlyb24uZ2V0KCdRVUVSWV9TVFJJTkcnKToKKyAgICAgICAgdXJsICs9ICc/JyArIGVudmlyb25bJ1FVRVJZX1NUUklORyddCisgICAgcmV0dXJuIHVybAorCitkZWYgc2hpZnRfcGF0aF9pbmZvKGVudmlyb24pOgorICAgICIiIlNoaWZ0IGEgbmFtZSBmcm9tIFBBVEhfSU5GTyB0byBTQ1JJUFRfTkFNRSwgcmV0dXJuaW5nIGl0CisKKyAgICBJZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHBhdGggc2VnbWVudHMgaW4gUEFUSF9JTkZPLCByZXR1cm4gTm9uZS4KKyAgICBOb3RlOiAnZW52aXJvbicgaXMgbW9kaWZpZWQgaW4tcGxhY2U7IHVzZSBhIGNvcHkgaWYgeW91IG5lZWQgdG8ga2VlcAorICAgIHRoZSBvcmlnaW5hbCBQQVRIX0lORk8gb3IgU0NSSVBUX05BTUUuCisKKyAgICBOb3RlOiB3aGVuIFBBVEhfSU5GTyBpcyBqdXN0IGEgJy8nLCB0aGlzIHJldHVybnMgJycgYW5kIGFwcGVuZHMgYSB0cmFpbGluZworICAgICcvJyB0byBTQ1JJUFRfTkFNRSwgZXZlbiB0aG91Z2ggZW1wdHkgcGF0aCBzZWdtZW50cyBhcmUgbm9ybWFsbHkgaWdub3JlZCwKKyAgICBhbmQgU0NSSVBUX05BTUUgZG9lc24ndCBub3JtYWxseSBlbmQgaW4gYSAnLycuICBUaGlzIGlzIGludGVudGlvbmFsCisgICAgYmVoYXZpb3IsIHRvIGVuc3VyZSB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KKyAgICAnL3gnIGFuZCAnL3gvJyB3aGVuIHRyYXZlcnNpbmcgdG8gb2JqZWN0cy4KKyAgICAiIiIKKyAgICBwYXRoX2luZm8gPSBlbnZpcm9uLmdldCgnUEFUSF9JTkZPJywnJykKKyAgICBpZiBub3QgcGF0aF9pbmZvOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgcGF0aF9wYXJ0cyA9IHBhdGhfaW5mby5zcGxpdCgnLycpCisgICAgcGF0aF9wYXJ0c1sxOi0xXSA9IFtwIGZvciBwIGluIHBhdGhfcGFydHNbMTotMV0gaWYgcCBhbmQgcCAhPSAnLiddCisgICAgbmFtZSA9IHBhdGhfcGFydHNbMV0KKyAgICBkZWwgcGF0aF9wYXJ0c1sxXQorCisgICAgc2NyaXB0X25hbWUgPSBlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnLCcnKQorICAgIHNjcmlwdF9uYW1lID0gcG9zaXhwYXRoLm5vcm1wYXRoKHNjcmlwdF9uYW1lKycvJytuYW1lKQorICAgIGlmIHNjcmlwdF9uYW1lLmVuZHN3aXRoKCcvJyk6CisgICAgICAgIHNjcmlwdF9uYW1lID0gc2NyaXB0X25hbWVbOi0xXQorICAgIGlmIG5vdCBuYW1lIGFuZCBub3Qgc2NyaXB0X25hbWUuZW5kc3dpdGgoJy8nKToKKyAgICAgICAgc2NyaXB0X25hbWUgKz0gJy8nCisKKyAgICBlbnZpcm9uWydTQ1JJUFRfTkFNRSddID0gc2NyaXB0X25hbWUKKyAgICBlbnZpcm9uWydQQVRIX0lORk8nXSAgID0gJy8nLmpvaW4ocGF0aF9wYXJ0cykKKworICAgICMgU3BlY2lhbCBjYXNlOiAnLy4nIG9uIFBBVEhfSU5GTyBkb2Vzbid0IGdldCBzdHJpcHBlZCwKKyAgICAjIGJlY2F1c2Ugd2UgZG9uJ3Qgc3RyaXAgdGhlIGxhc3QgZWxlbWVudCBvZiBQQVRIX0lORk8KKyAgICAjIGlmIHRoZXJlJ3Mgb25seSBvbmUgcGF0aCBwYXJ0IGxlZnQuICBJbnN0ZWFkIG9mIGZpeGluZyB0aGlzCisgICAgIyBhYm92ZSwgd2UgZml4IGl0IGhlcmUgc28gdGhhdCBQQVRIX0lORk8gZ2V0cyBub3JtYWxpemVkIHRvCisgICAgIyBhbiBlbXB0eSBzdHJpbmcgaW4gdGhlIGVudmlyb24uCisgICAgaWYgbmFtZT09Jy4nOgorICAgICAgICBuYW1lID0gTm9uZQorICAgIHJldHVybiBuYW1lCisKK2RlZiBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudmlyb24pOgorICAgICIiIlVwZGF0ZSAnZW52aXJvbicgd2l0aCB0cml2aWFsIGRlZmF1bHRzIGZvciB0ZXN0aW5nIHB1cnBvc2VzCisKKyAgICBUaGlzIGFkZHMgdmFyaW91cyBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBXU0dJLCBpbmNsdWRpbmcgSFRUUF9IT1NULAorICAgIFNFUlZFUl9OQU1FLCBTRVJWRVJfUE9SVCwgUkVRVUVTVF9NRVRIT0QsIFNDUklQVF9OQU1FLCBQQVRIX0lORk8sCisgICAgYW5kIGFsbCBvZiB0aGUgd3NnaS4qIHZhcmlhYmxlcy4gIEl0IG9ubHkgc3VwcGxpZXMgZGVmYXVsdCB2YWx1ZXMsCisgICAgYW5kIGRvZXMgbm90IHJlcGxhY2UgYW55IGV4aXN0aW5nIHNldHRpbmdzIGZvciB0aGVzZSB2YXJpYWJsZXMuCisKKyAgICBUaGlzIHJvdXRpbmUgaXMgaW50ZW5kZWQgdG8gbWFrZSBpdCBlYXNpZXIgZm9yIHVuaXQgdGVzdHMgb2YgV1NHSQorICAgIHNlcnZlcnMgYW5kIGFwcGxpY2F0aW9ucyB0byBzZXQgdXAgZHVtbXkgZW52aXJvbm1lbnRzLiAgSXQgc2hvdWxkICpub3QqCisgICAgYmUgdXNlZCBieSBhY3R1YWwgV1NHSSBzZXJ2ZXJzIG9yIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIGRhdGEgaXMgZmFrZSEKKyAgICAiIiIKKworICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX05BTUUnLCcxMjcuMC4wLjEnKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX1BST1RPQ09MJywnSFRUUC8xLjAnKQorCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdIVFRQX0hPU1QnLGVudmlyb25bJ1NFUlZFUl9OQU1FJ10pCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdSRVFVRVNUX01FVEhPRCcsJ0dFVCcpCisKKyAgICBpZiAnU0NSSVBUX05BTUUnIG5vdCBpbiBlbnZpcm9uIGFuZCAnUEFUSF9JTkZPJyBub3QgaW4gZW52aXJvbjoKKyAgICAgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdTQ1JJUFRfTkFNRScsJycpCisgICAgICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnUEFUSF9JTkZPJywnLycpCisKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kudmVyc2lvbicsICgxLDApKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5ydW5fb25jZScsIDApCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLm11bHRpdGhyZWFkJywgMCkKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kubXVsdGlwcm9jZXNzJywgMCkKKworICAgIGZyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLmlucHV0JywgU3RyaW5nSU8oIiIpKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5lcnJvcnMnLCBTdHJpbmdJTygpKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJyxndWVzc19zY2hlbWUoZW52aXJvbikpCisKKyAgICBpZiBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXT09J2h0dHAnOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NFUlZFUl9QT1JUJywgJzgwJykKKyAgICBlbGlmIGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddPT0naHR0cHMnOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NFUlZFUl9QT1JUJywgJzQ0MycpCisKKworCitfaG9wcGlzaCA9IHsKKyAgICAnY29ubmVjdGlvbic6MSwgJ2tlZXAtYWxpdmUnOjEsICdwcm94eS1hdXRoZW50aWNhdGUnOjEsCisgICAgJ3Byb3h5LWF1dGhvcml6YXRpb24nOjEsICd0ZSc6MSwgJ3RyYWlsZXJzJzoxLCAndHJhbnNmZXItZW5jb2RpbmcnOjEsCisgICAgJ3VwZ3JhZGUnOjEKK30uX19jb250YWluc19fCisKK2RlZiBpc19ob3BfYnlfaG9wKGhlYWRlcl9uYW1lKToKKyAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnaGVhZGVyX25hbWUnIGlzIGFuIEhUVFAvMS4xICJIb3AtYnktSG9wIiBoZWFkZXIiIiIKKyAgICByZXR1cm4gX2hvcHBpc2goaGVhZGVyX25hbWUubG93ZXIoKSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi91dGlsLnB5YyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi91dGlsLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU3ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi91dGlsLnB5byBiL2xpYi9weXRob24yLjcvd3NnaXJlZi91dGlsLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmU3ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3V0aWwucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvd3NnaXJlZi92YWxpZGF0ZS5weSBiL2xpYi9weXRob24yLjcvd3NnaXJlZi92YWxpZGF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGE4OTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5CkBAIC0wLDAgKzEsNDMyIEBACisjIChjKSAyMDA1IElhbiBCaWNraW5nIGFuZCBjb250cmlidXRvcnM7IHdyaXR0ZW4gZm9yIFBhc3RlIChodHRwOi8vcHl0aG9ucGFzdGUub3JnKQorIyBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6IGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwCisjIEFsc28gbGljZW5jZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCAyLjA6IGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9hcGFjaGUyLjAucGhwCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudAorIiIiCitNaWRkbGV3YXJlIHRvIGNoZWNrIGZvciBvYmVkaWVuY2UgdG8gdGhlIFdTR0kgc3BlY2lmaWNhdGlvbi4KKworU29tZSBvZiB0aGUgdGhpbmdzIHRoaXMgY2hlY2tzOgorCisqIFNpZ25hdHVyZSBvZiB0aGUgYXBwbGljYXRpb24gYW5kIHN0YXJ0X3Jlc3BvbnNlIChpbmNsdWRpbmcgdGhhdAorICBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgbm90IHVzZWQpLgorCisqIEVudmlyb25tZW50IGNoZWNrczoKKworICAtIEVudmlyb25tZW50IGlzIGEgZGljdGlvbmFyeSAoYW5kIG5vdCBhIHN1YmNsYXNzKS4KKworICAtIFRoYXQgYWxsIHRoZSByZXF1aXJlZCBrZXlzIGFyZSBpbiB0aGUgZW52aXJvbm1lbnQ6IFJFUVVFU1RfTUVUSE9ELAorICAgIFNFUlZFUl9OQU1FLCBTRVJWRVJfUE9SVCwgd3NnaS52ZXJzaW9uLCB3c2dpLmlucHV0LCB3c2dpLmVycm9ycywKKyAgICB3c2dpLm11bHRpdGhyZWFkLCB3c2dpLm11bHRpcHJvY2Vzcywgd3NnaS5ydW5fb25jZQorCisgIC0gVGhhdCBIVFRQX0NPTlRFTlRfVFlQRSBhbmQgSFRUUF9DT05URU5UX0xFTkdUSCBhcmUgbm90IGluIHRoZQorICAgIGVudmlyb25tZW50ICh0aGVzZSBoZWFkZXJzIHNob3VsZCBhcHBlYXIgYXMgQ09OVEVOVF9MRU5HVEggYW5kCisgICAgQ09OVEVOVF9UWVBFKS4KKworICAtIFdhcm5zIGlmIFFVRVJZX1NUUklORyBpcyBtaXNzaW5nLCBhcyB0aGUgY2dpIG1vZHVsZSBhY3RzCisgICAgdW5wcmVkaWN0YWJseSBpbiB0aGF0IGNhc2UuCisKKyAgLSBUaGF0IENHSS1zdHlsZSB2YXJpYWJsZXMgKHRoYXQgZG9uJ3QgY29udGFpbiBhIC4pIGhhdmUKKyAgICAobm9uLXVuaWNvZGUpIHN0cmluZyB2YWx1ZXMKKworICAtIFRoYXQgd3NnaS52ZXJzaW9uIGlzIGEgdHVwbGUKKworICAtIFRoYXQgd3NnaS51cmxfc2NoZW1lIGlzICdodHRwJyBvciAnaHR0cHMnIChAQDogaXMgdGhpcyB0b28KKyAgICByZXN0cmljdGl2ZT8pCisKKyAgLSBXYXJucyBpZiB0aGUgUkVRVUVTVF9NRVRIT0QgaXMgbm90IGtub3duIChAQDogcHJvYmFibHkgdG9vCisgICAgcmVzdHJpY3RpdmUpLgorCisgIC0gVGhhdCBTQ1JJUFRfTkFNRSBhbmQgUEFUSF9JTkZPIGFyZSBlbXB0eSBvciBzdGFydCB3aXRoIC8KKworICAtIFRoYXQgYXQgbGVhc3Qgb25lIG9mIFNDUklQVF9OQU1FIG9yIFBBVEhfSU5GTyBhcmUgc2V0LgorCisgIC0gVGhhdCBDT05URU5UX0xFTkdUSCBpcyBhIHBvc2l0aXZlIGludGVnZXIuCisKKyAgLSBUaGF0IFNDUklQVF9OQU1FIGlzIG5vdCAnLycgKGl0IHNob3VsZCBiZSAnJywgYW5kIFBBVEhfSU5GTyBzaG91bGQKKyAgICBiZSAnLycpLgorCisgIC0gVGhhdCB3c2dpLmlucHV0IGhhcyB0aGUgbWV0aG9kcyByZWFkLCByZWFkbGluZSwgcmVhZGxpbmVzLCBhbmQKKyAgICBfX2l0ZXJfXworCisgIC0gVGhhdCB3c2dpLmVycm9ycyBoYXMgdGhlIG1ldGhvZHMgZmx1c2gsIHdyaXRlLCB3cml0ZWxpbmVzCisKKyogVGhlIHN0YXR1cyBpcyBhIHN0cmluZywgY29udGFpbnMgYSBzcGFjZSwgc3RhcnRzIHdpdGggYW4gaW50ZWdlciwKKyAgYW5kIHRoYXQgaW50ZWdlciBpcyBpbiByYW5nZSAoPiAxMDApLgorCisqIFRoYXQgdGhlIGhlYWRlcnMgaXMgYSBsaXN0IChub3QgYSBzdWJjbGFzcywgbm90IGFub3RoZXIga2luZCBvZgorICBzZXF1ZW5jZSkuCisKKyogVGhhdCB0aGUgaXRlbXMgb2YgdGhlIGhlYWRlcnMgYXJlIHR1cGxlcyBvZiBzdHJpbmdzLgorCisqIFRoYXQgdGhlcmUgaXMgbm8gJ3N0YXR1cycgaGVhZGVyICh0aGF0IGlzIHVzZWQgaW4gQ0dJLCBidXQgbm90IGluCisgIFdTR0kpLgorCisqIFRoYXQgdGhlIGhlYWRlcnMgZG9uJ3QgY29udGFpbiBuZXdsaW5lcyBvciBjb2xvbnMsIGVuZCBpbiBfIG9yIC0sIG9yCisgIGNvbnRhaW4gY2hhcmFjdGVycyBjb2RlcyBiZWxvdyAwMzcuCisKKyogVGhhdCBDb250ZW50LVR5cGUgaXMgZ2l2ZW4gaWYgdGhlcmUgaXMgY29udGVudCAoQ0dJIG9mdGVuIGhhcyBhCisgIGRlZmF1bHQgY29udGVudCB0eXBlLCBidXQgV1NHSSBkb2VzIG5vdCkuCisKKyogVGhhdCBubyBDb250ZW50LVR5cGUgaXMgZ2l2ZW4gd2hlbiB0aGVyZSBpcyBubyBjb250ZW50IChAQDogaXMgdGhpcworICB0b28gcmVzdHJpY3RpdmU/KQorCisqIFRoYXQgdGhlIGV4Y19pbmZvIGFyZ3VtZW50IHRvIHN0YXJ0X3Jlc3BvbnNlIGlzIGEgdHVwbGUgb3IgTm9uZS4KKworKiBUaGF0IGFsbCBjYWxscyB0byB0aGUgd3JpdGVyIGFyZSB3aXRoIHN0cmluZ3MsIGFuZCBubyBvdGhlciBtZXRob2RzCisgIG9uIHRoZSB3cml0ZXIgYXJlIGFjY2Vzc2VkLgorCisqIFRoYXQgd3NnaS5pbnB1dCBpcyB1c2VkIHByb3Blcmx5OgorCisgIC0gLnJlYWQoKSBpcyBjYWxsZWQgd2l0aCB6ZXJvIG9yIG9uZSBhcmd1bWVudAorCisgIC0gVGhhdCBpdCByZXR1cm5zIGEgc3RyaW5nCisKKyAgLSBUaGF0IHJlYWRsaW5lLCByZWFkbGluZXMsIGFuZCBfX2l0ZXJfXyByZXR1cm4gc3RyaW5ncworCisgIC0gVGhhdCAuY2xvc2UoKSBpcyBub3QgY2FsbGVkCisKKyAgLSBObyBvdGhlciBtZXRob2RzIGFyZSBwcm92aWRlZAorCisqIFRoYXQgd3NnaS5lcnJvcnMgaXMgdXNlZCBwcm9wZXJseToKKworICAtIC53cml0ZSgpIGFuZCAud3JpdGVsaW5lcygpIGlzIGNhbGxlZCB3aXRoIGEgc3RyaW5nCisKKyAgLSBUaGF0IC5jbG9zZSgpIGlzIG5vdCBjYWxsZWQsIGFuZCBubyBvdGhlciBtZXRob2RzIGFyZSBwcm92aWRlZC4KKworKiBUaGUgcmVzcG9uc2UgaXRlcmF0b3I6CisKKyAgLSBUaGF0IGl0IGlzIG5vdCBhIHN0cmluZyAoaXQgc2hvdWxkIGJlIGEgbGlzdCBvZiBhIHNpbmdsZSBzdHJpbmc7IGEKKyAgICBzdHJpbmcgd2lsbCB3b3JrLCBidXQgcGVyZm9ybSBob3JyaWJseSkuCisKKyAgLSBUaGF0IC5uZXh0KCkgcmV0dXJucyBhIHN0cmluZworCisgIC0gVGhhdCB0aGUgaXRlcmF0b3IgaXMgbm90IGl0ZXJhdGVkIG92ZXIgdW50aWwgc3RhcnRfcmVzcG9uc2UgaGFzCisgICAgYmVlbiBjYWxsZWQgKHRoYXQgY2FuIHNpZ25hbCBlaXRoZXIgYSBzZXJ2ZXIgb3IgYXBwbGljYXRpb24KKyAgICBlcnJvcikuCisKKyAgLSBUaGF0IC5jbG9zZSgpIGlzIGNhbGxlZCAoZG9lc24ndCByYWlzZSBleGNlcHRpb24sIG9ubHkgcHJpbnRzIHRvCisgICAgc3lzLnN0ZGVyciwgYmVjYXVzZSB3ZSBvbmx5IGtub3cgaXQgaXNuJ3QgY2FsbGVkIHdoZW4gdGhlIG9iamVjdAorICAgIGlzIGdhcmJhZ2UgY29sbGVjdGVkKS4KKyIiIgorX19hbGxfXyA9IFsndmFsaWRhdG9yJ10KKworCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2Zyb20gdHlwZXMgaW1wb3J0IERpY3RUeXBlLCBTdHJpbmdUeXBlLCBUdXBsZVR5cGUsIExpc3RUeXBlCitpbXBvcnQgd2FybmluZ3MKKworaGVhZGVyX3JlID0gcmUuY29tcGlsZShyJ15bYS16QS1aXVthLXpBLVowLTlcLV9dKiQnKQorYmFkX2hlYWRlcl92YWx1ZV9yZSA9IHJlLmNvbXBpbGUocidbXDAwMC1cMDM3XScpCisKK2NsYXNzIFdTR0lXYXJuaW5nKFdhcm5pbmcpOgorICAgICIiIgorICAgIFJhaXNlZCBpbiByZXNwb25zZSB0byBXU0dJLXNwZWMtcmVsYXRlZCB3YXJuaW5ncworICAgICIiIgorCitkZWYgYXNzZXJ0Xyhjb25kLCAqYXJncyk6CisgICAgaWYgbm90IGNvbmQ6CisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCphcmdzKQorCitkZWYgdmFsaWRhdG9yKGFwcGxpY2F0aW9uKToKKworICAgICIiIgorICAgIFdoZW4gYXBwbGllZCBiZXR3ZWVuIGEgV1NHSSBzZXJ2ZXIgYW5kIGEgV1NHSSBhcHBsaWNhdGlvbiwgdGhpcworICAgIG1pZGRsZXdhcmUgd2lsbCBjaGVjayBmb3IgV1NHSSBjb21wbGlhbmN5IG9uIGEgbnVtYmVyIG9mIGxldmVscy4KKyAgICBUaGlzIG1pZGRsZXdhcmUgZG9lcyBub3QgbW9kaWZ5IHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlIGluIGFueQorICAgIHdheSwgYnV0IHdpbGwgcmFpc2UgYW4gQXNzZXJ0aW9uRXJyb3IgaWYgYW55dGhpbmcgc2VlbXMgb2ZmCisgICAgKGV4Y2VwdCBmb3IgYSBmYWlsdXJlIHRvIGNsb3NlIHRoZSBhcHBsaWNhdGlvbiBpdGVyYXRvciwgd2hpY2gKKyAgICB3aWxsIGJlIHByaW50ZWQgdG8gc3RkZXJyIC0tIHRoZXJlJ3Mgbm8gd2F5IHRvIHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgIGF0IHRoYXQgcG9pbnQpLgorICAgICIiIgorCisgICAgZGVmIGxpbnRfYXBwKCphcmdzLCAqKmt3KToKKyAgICAgICAgYXNzZXJ0XyhsZW4oYXJncykgPT0gMiwgIlR3byBhcmd1bWVudHMgcmVxdWlyZWQiKQorICAgICAgICBhc3NlcnRfKG5vdCBrdywgIk5vIGtleXdvcmQgYXJndW1lbnRzIGFsbG93ZWQiKQorICAgICAgICBlbnZpcm9uLCBzdGFydF9yZXNwb25zZSA9IGFyZ3MKKworICAgICAgICBjaGVja19lbnZpcm9uKGVudmlyb24pCisKKyAgICAgICAgIyBXZSB1c2UgdGhpcyB0byBjaGVjayBpZiB0aGUgYXBwbGljYXRpb24gcmV0dXJucyB3aXRob3V0CisgICAgICAgICMgY2FsbGluZyBzdGFydF9yZXNwb25zZToKKyAgICAgICAgc3RhcnRfcmVzcG9uc2Vfc3RhcnRlZCA9IFtdCisKKyAgICAgICAgZGVmIHN0YXJ0X3Jlc3BvbnNlX3dyYXBwZXIoKmFyZ3MsICoqa3cpOgorICAgICAgICAgICAgYXNzZXJ0XyhsZW4oYXJncykgPT0gMiBvciBsZW4oYXJncykgPT0gMywgKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIG51bWJlciBvZiBhcmd1bWVudHM6ICVzIiAlIChhcmdzLCkpKQorICAgICAgICAgICAgYXNzZXJ0Xyhub3Qga3csICJObyBrZXl3b3JkIGFyZ3VtZW50cyBhbGxvd2VkIikKKyAgICAgICAgICAgIHN0YXR1cyA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGhlYWRlcnMgPSBhcmdzWzFdCisgICAgICAgICAgICBpZiBsZW4oYXJncykgPT0gMzoKKyAgICAgICAgICAgICAgICBleGNfaW5mbyA9IGFyZ3NbMl0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZXhjX2luZm8gPSBOb25lCisKKyAgICAgICAgICAgIGNoZWNrX3N0YXR1cyhzdGF0dXMpCisgICAgICAgICAgICBjaGVja19oZWFkZXJzKGhlYWRlcnMpCisgICAgICAgICAgICBjaGVja19jb250ZW50X3R5cGUoc3RhdHVzLCBoZWFkZXJzKQorICAgICAgICAgICAgY2hlY2tfZXhjX2luZm8oZXhjX2luZm8pCisKKyAgICAgICAgICAgIHN0YXJ0X3Jlc3BvbnNlX3N0YXJ0ZWQuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICByZXR1cm4gV3JpdGVXcmFwcGVyKHN0YXJ0X3Jlc3BvbnNlKCphcmdzKSkKKworICAgICAgICBlbnZpcm9uWyd3c2dpLmlucHV0J10gPSBJbnB1dFdyYXBwZXIoZW52aXJvblsnd3NnaS5pbnB1dCddKQorICAgICAgICBlbnZpcm9uWyd3c2dpLmVycm9ycyddID0gRXJyb3JXcmFwcGVyKGVudmlyb25bJ3dzZ2kuZXJyb3JzJ10pCisKKyAgICAgICAgaXRlcmF0b3IgPSBhcHBsaWNhdGlvbihlbnZpcm9uLCBzdGFydF9yZXNwb25zZV93cmFwcGVyKQorICAgICAgICBhc3NlcnRfKGl0ZXJhdG9yIGlzIG5vdCBOb25lIGFuZCBpdGVyYXRvciAhPSBGYWxzZSwKKyAgICAgICAgICAgICJUaGUgYXBwbGljYXRpb24gbXVzdCByZXR1cm4gYW4gaXRlcmF0b3IsIGlmIG9ubHkgYW4gZW1wdHkgbGlzdCIpCisKKyAgICAgICAgY2hlY2tfaXRlcmF0b3IoaXRlcmF0b3IpCisKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yV3JhcHBlcihpdGVyYXRvciwgc3RhcnRfcmVzcG9uc2Vfc3RhcnRlZCkKKworICAgIHJldHVybiBsaW50X2FwcAorCitjbGFzcyBJbnB1dFdyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9pbnB1dCk6CisgICAgICAgIHNlbGYuaW5wdXQgPSB3c2dpX2lucHV0CisKKyAgICBkZWYgcmVhZChzZWxmLCAqYXJncyk6CisgICAgICAgIGFzc2VydF8obGVuKGFyZ3MpIDw9IDEpCisgICAgICAgIHYgPSBzZWxmLmlucHV0LnJlYWQoKmFyZ3MpCisgICAgICAgIGFzc2VydF8odHlwZSh2KSBpcyB0eXBlKCIiKSkKKyAgICAgICAgcmV0dXJuIHYKKworICAgIGRlZiByZWFkbGluZShzZWxmKToKKyAgICAgICAgdiA9IHNlbGYuaW5wdXQucmVhZGxpbmUoKQorICAgICAgICBhc3NlcnRfKHR5cGUodikgaXMgdHlwZSgiIikpCisgICAgICAgIHJldHVybiB2CisKKyAgICBkZWYgcmVhZGxpbmVzKHNlbGYsICphcmdzKToKKyAgICAgICAgYXNzZXJ0XyhsZW4oYXJncykgPD0gMSkKKyAgICAgICAgbGluZXMgPSBzZWxmLmlucHV0LnJlYWRsaW5lcygqYXJncykKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKGxpbmVzKSBpcyB0eXBlKFtdKSkKKyAgICAgICAgZm9yIGxpbmUgaW4gbGluZXM6CisgICAgICAgICAgICBhc3NlcnRfKHR5cGUobGluZSkgaXMgdHlwZSgiIikpCisgICAgICAgIHJldHVybiBsaW5lcworCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgbGluZSA9IHNlbGYucmVhZGxpbmUoKQorICAgICAgICAgICAgaWYgbm90IGxpbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB5aWVsZCBsaW5lCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGFzc2VydF8oMCwgImlucHV0LmNsb3NlKCkgbXVzdCBub3QgYmUgY2FsbGVkIikKKworY2xhc3MgRXJyb3JXcmFwcGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzZ2lfZXJyb3JzKToKKyAgICAgICAgc2VsZi5lcnJvcnMgPSB3c2dpX2Vycm9ycworCisgICAgZGVmIHdyaXRlKHNlbGYsIHMpOgorICAgICAgICBhc3NlcnRfKHR5cGUocykgaXMgdHlwZSgiIikpCisgICAgICAgIHNlbGYuZXJyb3JzLndyaXRlKHMpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYuZXJyb3JzLmZsdXNoKCkKKworICAgIGRlZiB3cml0ZWxpbmVzKHNlbGYsIHNlcSk6CisgICAgICAgIGZvciBsaW5lIGluIHNlcToKKyAgICAgICAgICAgIHNlbGYud3JpdGUobGluZSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgYXNzZXJ0XygwLCAiZXJyb3JzLmNsb3NlKCkgbXVzdCBub3QgYmUgY2FsbGVkIikKKworY2xhc3MgV3JpdGVXcmFwcGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzZ2lfd3JpdGVyKToKKyAgICAgICAgc2VsZi53cml0ZXIgPSB3c2dpX3dyaXRlcgorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIHMpOgorICAgICAgICBhc3NlcnRfKHR5cGUocykgaXMgdHlwZSgiIikpCisgICAgICAgIHNlbGYud3JpdGVyKHMpCisKK2NsYXNzIFBhcnRpYWxJdGVyYXRvcldyYXBwZXI6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd3NnaV9pdGVyYXRvcik6CisgICAgICAgIHNlbGYuaXRlcmF0b3IgPSB3c2dpX2l0ZXJhdG9yCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICMgV2Ugd2FudCB0byBtYWtlIHN1cmUgX19pdGVyX18gaXMgY2FsbGVkCisgICAgICAgIHJldHVybiBJdGVyYXRvcldyYXBwZXIoc2VsZi5pdGVyYXRvciwgTm9uZSkKKworY2xhc3MgSXRlcmF0b3JXcmFwcGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzZ2lfaXRlcmF0b3IsIGNoZWNrX3N0YXJ0X3Jlc3BvbnNlKToKKyAgICAgICAgc2VsZi5vcmlnaW5hbF9pdGVyYXRvciA9IHdzZ2lfaXRlcmF0b3IKKyAgICAgICAgc2VsZi5pdGVyYXRvciA9IGl0ZXIod3NnaV9pdGVyYXRvcikKKyAgICAgICAgc2VsZi5jbG9zZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmNoZWNrX3N0YXJ0X3Jlc3BvbnNlID0gY2hlY2tfc3RhcnRfcmVzcG9uc2UKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBhc3NlcnRfKG5vdCBzZWxmLmNsb3NlZCwKKyAgICAgICAgICAgICJJdGVyYXRvciByZWFkIGFmdGVyIGNsb3NlZCIpCisgICAgICAgIHYgPSBzZWxmLml0ZXJhdG9yLm5leHQoKQorICAgICAgICBpZiBzZWxmLmNoZWNrX3N0YXJ0X3Jlc3BvbnNlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXNzZXJ0XyhzZWxmLmNoZWNrX3N0YXJ0X3Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICJUaGUgYXBwbGljYXRpb24gcmV0dXJucyBhbmQgd2Ugc3RhcnRlZCBpdGVyYXRpbmcgb3ZlciBpdHMgYm9keSwgYnV0IHN0YXJ0X3Jlc3BvbnNlIGhhcyBub3QgeWV0IGJlZW4gY2FsbGVkIikKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfc3RhcnRfcmVzcG9uc2UgPSBOb25lCisgICAgICAgIHJldHVybiB2CisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2VkID0gVHJ1ZQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYub3JpZ2luYWxfaXRlcmF0b3IsICdjbG9zZScpOgorICAgICAgICAgICAgc2VsZi5vcmlnaW5hbF9pdGVyYXRvci5jbG9zZSgpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgKKyAgICAgICAgICAgICAgICAiSXRlcmF0b3IgZ2FyYmFnZSBjb2xsZWN0ZWQgd2l0aG91dCBiZWluZyBjbG9zZWQiKQorICAgICAgICBhc3NlcnRfKHNlbGYuY2xvc2VkLAorICAgICAgICAgICAgIkl0ZXJhdG9yIGdhcmJhZ2UgY29sbGVjdGVkIHdpdGhvdXQgYmVpbmcgY2xvc2VkIikKKworZGVmIGNoZWNrX2Vudmlyb24oZW52aXJvbik6CisgICAgYXNzZXJ0Xyh0eXBlKGVudmlyb24pIGlzIERpY3RUeXBlLAorICAgICAgICAiRW52aXJvbm1lbnQgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlOiAlciAoZW52aXJvbm1lbnQ6ICVyKSIKKyAgICAgICAgJSAodHlwZShlbnZpcm9uKSwgZW52aXJvbikpCisKKyAgICBmb3Iga2V5IGluIFsnUkVRVUVTVF9NRVRIT0QnLCAnU0VSVkVSX05BTUUnLCAnU0VSVkVSX1BPUlQnLAorICAgICAgICAgICAgICAgICd3c2dpLnZlcnNpb24nLCAnd3NnaS5pbnB1dCcsICd3c2dpLmVycm9ycycsCisgICAgICAgICAgICAgICAgJ3dzZ2kubXVsdGl0aHJlYWQnLCAnd3NnaS5tdWx0aXByb2Nlc3MnLAorICAgICAgICAgICAgICAgICd3c2dpLnJ1bl9vbmNlJ106CisgICAgICAgIGFzc2VydF8oa2V5IGluIGVudmlyb24sCisgICAgICAgICAgICAiRW52aXJvbm1lbnQgbWlzc2luZyByZXF1aXJlZCBrZXk6ICVyIiAlIChrZXksKSkKKworICAgIGZvciBrZXkgaW4gWydIVFRQX0NPTlRFTlRfVFlQRScsICdIVFRQX0NPTlRFTlRfTEVOR1RIJ106CisgICAgICAgIGFzc2VydF8oa2V5IG5vdCBpbiBlbnZpcm9uLAorICAgICAgICAgICAgIkVudmlyb25tZW50IHNob3VsZCBub3QgaGF2ZSB0aGUga2V5OiAlcyAiCisgICAgICAgICAgICAiKHVzZSAlcyBpbnN0ZWFkKSIgJSAoa2V5LCBrZXlbNTpdKSkKKworICAgIGlmICdRVUVSWV9TVFJJTkcnIG5vdCBpbiBlbnZpcm9uOgorICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgJ1FVRVJZX1NUUklORyBpcyBub3QgaW4gdGhlIFdTR0kgZW52aXJvbm1lbnQ7IHRoZSBjZ2kgJworICAgICAgICAgICAgJ21vZHVsZSB3aWxsIHVzZSBzeXMuYXJndiB3aGVuIHRoaXMgdmFyaWFibGUgaXMgbWlzc2luZywgJworICAgICAgICAgICAgJ3NvIGFwcGxpY2F0aW9uIGVycm9ycyBhcmUgbW9yZSBsaWtlbHknLAorICAgICAgICAgICAgV1NHSVdhcm5pbmcpCisKKyAgICBmb3Iga2V5IGluIGVudmlyb24ua2V5cygpOgorICAgICAgICBpZiAnLicgaW4ga2V5OgorICAgICAgICAgICAgIyBFeHRlbnNpb24sIHdlIGRvbid0IGNhcmUgYWJvdXQgaXRzIHR5cGUKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGFzc2VydF8odHlwZShlbnZpcm9uW2tleV0pIGlzIFN0cmluZ1R5cGUsCisgICAgICAgICAgICAiRW52aXJvbm1lbnRhbCB2YXJpYWJsZSAlcyBpcyBub3QgYSBzdHJpbmc6ICVyICh2YWx1ZTogJXIpIgorICAgICAgICAgICAgJSAoa2V5LCB0eXBlKGVudmlyb25ba2V5XSksIGVudmlyb25ba2V5XSkpCisKKyAgICBhc3NlcnRfKHR5cGUoZW52aXJvblsnd3NnaS52ZXJzaW9uJ10pIGlzIFR1cGxlVHlwZSwKKyAgICAgICAgIndzZ2kudmVyc2lvbiBzaG91bGQgYmUgYSB0dXBsZSAoJXIpIiAlIChlbnZpcm9uWyd3c2dpLnZlcnNpb24nXSwpKQorICAgIGFzc2VydF8oZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10gaW4gKCdodHRwJywgJ2h0dHBzJyksCisgICAgICAgICJ3c2dpLnVybF9zY2hlbWUgdW5rbm93bjogJXIiICUgZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10pCisKKyAgICBjaGVja19pbnB1dChlbnZpcm9uWyd3c2dpLmlucHV0J10pCisgICAgY2hlY2tfZXJyb3JzKGVudmlyb25bJ3dzZ2kuZXJyb3JzJ10pCisKKyAgICAjIEBAOiB0aGVzZSBuZWVkIGZpbGxpbmcgb3V0OgorICAgIGlmIGVudmlyb25bJ1JFUVVFU1RfTUVUSE9EJ10gbm90IGluICgKKyAgICAgICAgJ0dFVCcsICdIRUFEJywgJ1BPU1QnLCAnT1BUSU9OUycsJ1BVVCcsJ0RFTEVURScsJ1RSQUNFJyk6CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAiVW5rbm93biBSRVFVRVNUX01FVEhPRDogJXIiICUgZW52aXJvblsnUkVRVUVTVF9NRVRIT0QnXSwKKyAgICAgICAgICAgIFdTR0lXYXJuaW5nKQorCisgICAgYXNzZXJ0Xyhub3QgZW52aXJvbi5nZXQoJ1NDUklQVF9OQU1FJykKKyAgICAgICAgICAgIG9yIGVudmlyb25bJ1NDUklQVF9OQU1FJ10uc3RhcnRzd2l0aCgnLycpLAorICAgICAgICAiU0NSSVBUX05BTUUgZG9lc24ndCBzdGFydCB3aXRoIC86ICVyIiAlIGVudmlyb25bJ1NDUklQVF9OQU1FJ10pCisgICAgYXNzZXJ0Xyhub3QgZW52aXJvbi5nZXQoJ1BBVEhfSU5GTycpCisgICAgICAgICAgICBvciBlbnZpcm9uWydQQVRIX0lORk8nXS5zdGFydHN3aXRoKCcvJyksCisgICAgICAgICJQQVRIX0lORk8gZG9lc24ndCBzdGFydCB3aXRoIC86ICVyIiAlIGVudmlyb25bJ1BBVEhfSU5GTyddKQorICAgIGlmIGVudmlyb24uZ2V0KCdDT05URU5UX0xFTkdUSCcpOgorICAgICAgICBhc3NlcnRfKGludChlbnZpcm9uWydDT05URU5UX0xFTkdUSCddKSA+PSAwLAorICAgICAgICAgICAgIkludmFsaWQgQ09OVEVOVF9MRU5HVEg6ICVyIiAlIGVudmlyb25bJ0NPTlRFTlRfTEVOR1RIJ10pCisKKyAgICBpZiBub3QgZW52aXJvbi5nZXQoJ1NDUklQVF9OQU1FJyk6CisgICAgICAgIGFzc2VydF8oJ1BBVEhfSU5GTycgaW4gZW52aXJvbiwKKyAgICAgICAgICAgICJPbmUgb2YgU0NSSVBUX05BTUUgb3IgUEFUSF9JTkZPIGFyZSByZXF1aXJlZCAoUEFUSF9JTkZPICIKKyAgICAgICAgICAgICJzaG91bGQgYXQgbGVhc3QgYmUgJy8nIGlmIFNDUklQVF9OQU1FIGlzIGVtcHR5KSIpCisgICAgYXNzZXJ0XyhlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKSAhPSAnLycsCisgICAgICAgICJTQ1JJUFRfTkFNRSBjYW5ub3QgYmUgJy8nOyBpdCBzaG91bGQgaW5zdGVhZCBiZSAnJywgYW5kICIKKyAgICAgICAgIlBBVEhfSU5GTyBzaG91bGQgYmUgJy8nIikKKworZGVmIGNoZWNrX2lucHV0KHdzZ2lfaW5wdXQpOgorICAgIGZvciBhdHRyIGluIFsncmVhZCcsICdyZWFkbGluZScsICdyZWFkbGluZXMnLCAnX19pdGVyX18nXToKKyAgICAgICAgYXNzZXJ0XyhoYXNhdHRyKHdzZ2lfaW5wdXQsIGF0dHIpLAorICAgICAgICAgICAgIndzZ2kuaW5wdXQgKCVyKSBkb2Vzbid0IGhhdmUgdGhlIGF0dHJpYnV0ZSAlcyIKKyAgICAgICAgICAgICUgKHdzZ2lfaW5wdXQsIGF0dHIpKQorCitkZWYgY2hlY2tfZXJyb3JzKHdzZ2lfZXJyb3JzKToKKyAgICBmb3IgYXR0ciBpbiBbJ2ZsdXNoJywgJ3dyaXRlJywgJ3dyaXRlbGluZXMnXToKKyAgICAgICAgYXNzZXJ0XyhoYXNhdHRyKHdzZ2lfZXJyb3JzLCBhdHRyKSwKKyAgICAgICAgICAgICJ3c2dpLmVycm9ycyAoJXIpIGRvZXNuJ3QgaGF2ZSB0aGUgYXR0cmlidXRlICVzIgorICAgICAgICAgICAgJSAod3NnaV9lcnJvcnMsIGF0dHIpKQorCitkZWYgY2hlY2tfc3RhdHVzKHN0YXR1cyk6CisgICAgYXNzZXJ0Xyh0eXBlKHN0YXR1cykgaXMgU3RyaW5nVHlwZSwKKyAgICAgICAgIlN0YXR1cyBtdXN0IGJlIGEgc3RyaW5nIChub3QgJXIpIiAlIHN0YXR1cykKKyAgICAjIEltcGxpY2l0bHkgY2hlY2sgdGhhdCB3ZSBjYW4gdHVybiBpdCBpbnRvIGFuIGludGVnZXI6CisgICAgc3RhdHVzX2NvZGUgPSBzdGF0dXMuc3BsaXQoTm9uZSwgMSlbMF0KKyAgICBhc3NlcnRfKGxlbihzdGF0dXNfY29kZSkgPT0gMywKKyAgICAgICAgIlN0YXR1cyBjb2RlcyBtdXN0IGJlIHRocmVlIGNoYXJhY3RlcnM6ICVyIiAlIHN0YXR1c19jb2RlKQorICAgIHN0YXR1c19pbnQgPSBpbnQoc3RhdHVzX2NvZGUpCisgICAgYXNzZXJ0XyhzdGF0dXNfaW50ID49IDEwMCwgIlN0YXR1cyBjb2RlIGlzIGludmFsaWQ6ICVyIiAlIHN0YXR1c19pbnQpCisgICAgaWYgbGVuKHN0YXR1cykgPCA0IG9yIHN0YXR1c1szXSAhPSAnICc6CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAiVGhlIHN0YXR1cyBzdHJpbmcgKCVyKSBzaG91bGQgYmUgYSB0aHJlZS1kaWdpdCBpbnRlZ2VyICIKKyAgICAgICAgICAgICJmb2xsb3dlZCBieSBhIHNpbmdsZSBzcGFjZSBhbmQgYSBzdGF0dXMgZXhwbGFuYXRpb24iCisgICAgICAgICAgICAlIHN0YXR1cywgV1NHSVdhcm5pbmcpCisKK2RlZiBjaGVja19oZWFkZXJzKGhlYWRlcnMpOgorICAgIGFzc2VydF8odHlwZShoZWFkZXJzKSBpcyBMaXN0VHlwZSwKKyAgICAgICAgIkhlYWRlcnMgKCVyKSBtdXN0IGJlIG9mIHR5cGUgbGlzdDogJXIiCisgICAgICAgICUgKGhlYWRlcnMsIHR5cGUoaGVhZGVycykpKQorICAgIGhlYWRlcl9uYW1lcyA9IHt9CisgICAgZm9yIGl0ZW0gaW4gaGVhZGVyczoKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKGl0ZW0pIGlzIFR1cGxlVHlwZSwKKyAgICAgICAgICAgICJJbmRpdmlkdWFsIGhlYWRlcnMgKCVyKSBtdXN0IGJlIG9mIHR5cGUgdHVwbGU6ICVyIgorICAgICAgICAgICAgJSAoaXRlbSwgdHlwZShpdGVtKSkpCisgICAgICAgIGFzc2VydF8obGVuKGl0ZW0pID09IDIpCisgICAgICAgIG5hbWUsIHZhbHVlID0gaXRlbQorICAgICAgICBhc3NlcnRfKG5hbWUubG93ZXIoKSAhPSAnc3RhdHVzJywKKyAgICAgICAgICAgICJUaGUgU3RhdHVzIGhlYWRlciBjYW5ub3QgYmUgdXNlZDsgaXQgY29uZmxpY3RzIHdpdGggQ0dJICIKKyAgICAgICAgICAgICJzY3JpcHQsIGFuZCBIVFRQIHN0YXR1cyBpcyBub3QgZ2l2ZW4gdGhyb3VnaCBoZWFkZXJzICIKKyAgICAgICAgICAgICIodmFsdWU6ICVyKS4iICUgdmFsdWUpCisgICAgICAgIGhlYWRlcl9uYW1lc1tuYW1lLmxvd2VyKCldID0gTm9uZQorICAgICAgICBhc3NlcnRfKCdcbicgbm90IGluIG5hbWUgYW5kICc6JyBub3QgaW4gbmFtZSwKKyAgICAgICAgICAgICJIZWFkZXIgbmFtZXMgbWF5IG5vdCBjb250YWluICc6JyBvciAnXFxuJzogJXIiICUgbmFtZSkKKyAgICAgICAgYXNzZXJ0XyhoZWFkZXJfcmUuc2VhcmNoKG5hbWUpLCAiQmFkIGhlYWRlciBuYW1lOiAlciIgJSBuYW1lKQorICAgICAgICBhc3NlcnRfKG5vdCBuYW1lLmVuZHN3aXRoKCctJykgYW5kIG5vdCBuYW1lLmVuZHN3aXRoKCdfJyksCisgICAgICAgICAgICAiTmFtZXMgbWF5IG5vdCBlbmQgaW4gJy0nIG9yICdfJzogJXIiICUgbmFtZSkKKyAgICAgICAgaWYgYmFkX2hlYWRlcl92YWx1ZV9yZS5zZWFyY2godmFsdWUpOgorICAgICAgICAgICAgYXNzZXJ0XygwLCAiQmFkIGhlYWRlciB2YWx1ZTogJXIgKGJhZCBjaGFyOiAlcikiCisgICAgICAgICAgICAlICh2YWx1ZSwgYmFkX2hlYWRlcl92YWx1ZV9yZS5zZWFyY2godmFsdWUpLmdyb3VwKDApKSkKKworZGVmIGNoZWNrX2NvbnRlbnRfdHlwZShzdGF0dXMsIGhlYWRlcnMpOgorICAgIGNvZGUgPSBpbnQoc3RhdHVzLnNwbGl0KE5vbmUsIDEpWzBdKQorICAgICMgQEA6IG5lZWQgb25lIG1vcmUgcGVyc29uIHRvIHZlcmlmeSB0aGlzIGludGVycHJldGF0aW9uIG9mIFJGQyAyNjE2CisgICAgIyAgICAgaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sCisgICAgTk9fTUVTU0FHRV9CT0RZID0gKDIwNCwgMzA0KQorICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBoZWFkZXJzOgorICAgICAgICBpZiBuYW1lLmxvd2VyKCkgPT0gJ2NvbnRlbnQtdHlwZSc6CisgICAgICAgICAgICBpZiBjb2RlIG5vdCBpbiBOT19NRVNTQUdFX0JPRFk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBhc3NlcnRfKDAsICgiQ29udGVudC1UeXBlIGhlYWRlciBmb3VuZCBpbiBhICVzIHJlc3BvbnNlLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2hpY2ggbXVzdCBub3QgcmV0dXJuIGNvbnRlbnQuIikgJSBjb2RlKQorICAgIGlmIGNvZGUgbm90IGluIE5PX01FU1NBR0VfQk9EWToKKyAgICAgICAgYXNzZXJ0XygwLCAiTm8gQ29udGVudC1UeXBlIGhlYWRlciBmb3VuZCBpbiBoZWFkZXJzICglcykiICUgaGVhZGVycykKKworZGVmIGNoZWNrX2V4Y19pbmZvKGV4Y19pbmZvKToKKyAgICBhc3NlcnRfKGV4Y19pbmZvIGlzIE5vbmUgb3IgdHlwZShleGNfaW5mbykgaXMgdHlwZSgoKSksCisgICAgICAgICJleGNfaW5mbyAoJXIpIGlzIG5vdCBhIHR1cGxlOiAlciIgJSAoZXhjX2luZm8sIHR5cGUoZXhjX2luZm8pKSkKKyAgICAjIE1vcmUgZXhjX2luZm8gY2hlY2tzPworCitkZWYgY2hlY2tfaXRlcmF0b3IoaXRlcmF0b3IpOgorICAgICMgVGVjaG5pY2FsbHkgYSBzdHJpbmcgaXMgbGVnYWwsIHdoaWNoIGlzIHdoeSBpdCdzIGEgcmVhbGx5IGJhZAorICAgICMgaWRlYSwgYmVjYXVzZSBpdCBtYXkgY2F1c2UgdGhlIHJlc3BvbnNlIHRvIGJlIHJldHVybmVkCisgICAgIyBjaGFyYWN0ZXItYnktY2hhcmFjdGVyCisgICAgYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZShpdGVyYXRvciwgc3RyKSwKKyAgICAgICAgIllvdSBzaG91bGQgbm90IHJldHVybiBhIHN0cmluZyBhcyB5b3VyIGFwcGxpY2F0aW9uIGl0ZXJhdG9yLCAiCisgICAgICAgICJpbnN0ZWFkIHJldHVybiBhIHNpbmdsZS1pdGVtIGxpc3QgY29udGFpbmluZyB0aGF0IHN0cmluZy4iKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5YyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi92YWxpZGF0ZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ODUyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi92YWxpZGF0ZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy93c2dpcmVmL3ZhbGlkYXRlLnB5byBiL2xpYi9weXRob24yLjcvd3NnaXJlZi92YWxpZGF0ZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2ODUyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvd3NnaXJlZi92YWxpZGF0ZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94ZHJsaWIucHkgYi9saWIvcHl0aG9uMi43L3hkcmxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjE3MmRkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94ZHJsaWIucHkKQEAgLTAsMCArMSwyMzEgQEAKKyIiIkltcGxlbWVudHMgKGEgc3Vic2V0IG9mKSBTdW4gWERSIC0tIGVYdGVybmFsIERhdGEgUmVwcmVzZW50YXRpb24uCisKK1NlZTogUkZDIDEwMTQKKworIiIiCisKK2ltcG9ydCBzdHJ1Y3QKK3RyeToKKyAgICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgX1N0cmluZ0lPCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8gYXMgX1N0cmluZ0lPCisKK19fYWxsX18gPSBbIkVycm9yIiwgIlBhY2tlciIsICJVbnBhY2tlciIsICJDb252ZXJzaW9uRXJyb3IiXQorCisjIGV4Y2VwdGlvbnMKK2NsYXNzIEVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIGNsYXNzIGZvciB0aGlzIG1vZHVsZS4gVXNlOgorCisgICAgZXhjZXB0IHhkcmxpYi5FcnJvciwgdmFyOgorICAgICAgICAjIHZhciBoYXMgdGhlIEVycm9yIGluc3RhbmNlIGZvciB0aGUgZXhjZXB0aW9uCisKKyAgICBQdWJsaWMgaXZhcnM6CisgICAgICAgIG1zZyAtLSBjb250YWlucyB0aGUgbWVzc2FnZQorCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZyk6CisgICAgICAgIHNlbGYubXNnID0gbXNnCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gcmVwcihzZWxmLm1zZykKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHN0cihzZWxmLm1zZykKKworCitjbGFzcyBDb252ZXJzaW9uRXJyb3IoRXJyb3IpOgorICAgIHBhc3MKKworCisKK2NsYXNzIFBhY2tlcjoKKyAgICAiIiJQYWNrIHZhcmlvdXMgZGF0YSByZXByZXNlbnRhdGlvbnMgaW50byBhIGJ1ZmZlci4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5yZXNldCgpCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYuX19idWYgPSBfU3RyaW5nSU8oKQorCisgICAgZGVmIGdldF9idWZmZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fYnVmLmdldHZhbHVlKCkKKyAgICAjIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgICAgZ2V0X2J1ZiA9IGdldF9idWZmZXIKKworICAgIGRlZiBwYWNrX3VpbnQoc2VsZiwgeCk6CisgICAgICAgIHNlbGYuX19idWYud3JpdGUoc3RydWN0LnBhY2soJz5MJywgeCkpCisKKyAgICBkZWYgcGFja19pbnQoc2VsZiwgeCk6CisgICAgICAgIHNlbGYuX19idWYud3JpdGUoc3RydWN0LnBhY2soJz5sJywgeCkpCisKKyAgICBwYWNrX2VudW0gPSBwYWNrX2ludAorCisgICAgZGVmIHBhY2tfYm9vbChzZWxmLCB4KToKKyAgICAgICAgaWYgeDogc2VsZi5fX2J1Zi53cml0ZSgnXDBcMFwwXDEnKQorICAgICAgICBlbHNlOiBzZWxmLl9fYnVmLndyaXRlKCdcMFwwXDBcMCcpCisKKyAgICBkZWYgcGFja191aHlwZXIoc2VsZiwgeCk6CisgICAgICAgIHNlbGYucGFja191aW50KHg+PjMyICYgMHhmZmZmZmZmZkwpCisgICAgICAgIHNlbGYucGFja191aW50KHggJiAweGZmZmZmZmZmTCkKKworICAgIHBhY2tfaHlwZXIgPSBwYWNrX3VoeXBlcgorCisgICAgZGVmIHBhY2tfZmxvYXQoc2VsZiwgeCk6CisgICAgICAgIHRyeTogc2VsZi5fX2J1Zi53cml0ZShzdHJ1Y3QucGFjaygnPmYnLCB4KSkKKyAgICAgICAgZXhjZXB0IHN0cnVjdC5lcnJvciwgbXNnOgorICAgICAgICAgICAgcmFpc2UgQ29udmVyc2lvbkVycm9yLCBtc2cKKworICAgIGRlZiBwYWNrX2RvdWJsZShzZWxmLCB4KToKKyAgICAgICAgdHJ5OiBzZWxmLl9fYnVmLndyaXRlKHN0cnVjdC5wYWNrKCc+ZCcsIHgpKQorICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yLCBtc2c6CisgICAgICAgICAgICByYWlzZSBDb252ZXJzaW9uRXJyb3IsIG1zZworCisgICAgZGVmIHBhY2tfZnN0cmluZyhzZWxmLCBuLCBzKToKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnZnN0cmluZyBzaXplIG11c3QgYmUgbm9ubmVnYXRpdmUnCisgICAgICAgIGRhdGEgPSBzWzpuXQorICAgICAgICBuID0gKChuKzMpLy80KSo0CisgICAgICAgIGRhdGEgPSBkYXRhICsgKG4gLSBsZW4oZGF0YSkpICogJ1wwJworICAgICAgICBzZWxmLl9fYnVmLndyaXRlKGRhdGEpCisKKyAgICBwYWNrX2ZvcGFxdWUgPSBwYWNrX2ZzdHJpbmcKKworICAgIGRlZiBwYWNrX3N0cmluZyhzZWxmLCBzKToKKyAgICAgICAgbiA9IGxlbihzKQorICAgICAgICBzZWxmLnBhY2tfdWludChuKQorICAgICAgICBzZWxmLnBhY2tfZnN0cmluZyhuLCBzKQorCisgICAgcGFja19vcGFxdWUgPSBwYWNrX3N0cmluZworICAgIHBhY2tfYnl0ZXMgPSBwYWNrX3N0cmluZworCisgICAgZGVmIHBhY2tfbGlzdChzZWxmLCBsaXN0LCBwYWNrX2l0ZW0pOgorICAgICAgICBmb3IgaXRlbSBpbiBsaXN0OgorICAgICAgICAgICAgc2VsZi5wYWNrX3VpbnQoMSkKKyAgICAgICAgICAgIHBhY2tfaXRlbShpdGVtKQorICAgICAgICBzZWxmLnBhY2tfdWludCgwKQorCisgICAgZGVmIHBhY2tfZmFycmF5KHNlbGYsIG4sIGxpc3QsIHBhY2tfaXRlbSk6CisgICAgICAgIGlmIGxlbihsaXN0KSAhPSBuOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ3dyb25nIGFycmF5IHNpemUnCisgICAgICAgIGZvciBpdGVtIGluIGxpc3Q6CisgICAgICAgICAgICBwYWNrX2l0ZW0oaXRlbSkKKworICAgIGRlZiBwYWNrX2FycmF5KHNlbGYsIGxpc3QsIHBhY2tfaXRlbSk6CisgICAgICAgIG4gPSBsZW4obGlzdCkKKyAgICAgICAgc2VsZi5wYWNrX3VpbnQobikKKyAgICAgICAgc2VsZi5wYWNrX2ZhcnJheShuLCBsaXN0LCBwYWNrX2l0ZW0pCisKKworCitjbGFzcyBVbnBhY2tlcjoKKyAgICAiIiJVbnBhY2tzIHZhcmlvdXMgZGF0YSByZXByZXNlbnRhdGlvbnMgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnJlc2V0KGRhdGEpCisKKyAgICBkZWYgcmVzZXQoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuX19idWYgPSBkYXRhCisgICAgICAgIHNlbGYuX19wb3MgPSAwCisKKyAgICBkZWYgZ2V0X3Bvc2l0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3BvcworCisgICAgZGVmIHNldF9wb3NpdGlvbihzZWxmLCBwb3NpdGlvbik6CisgICAgICAgIHNlbGYuX19wb3MgPSBwb3NpdGlvbgorCisgICAgZGVmIGdldF9idWZmZXIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fYnVmCisKKyAgICBkZWYgZG9uZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fX3BvcyA8IGxlbihzZWxmLl9fYnVmKToKKyAgICAgICAgICAgIHJhaXNlIEVycm9yKCd1bmV4dHJhY3RlZCBkYXRhIHJlbWFpbnMnKQorCisgICAgZGVmIHVucGFja191aW50KHNlbGYpOgorICAgICAgICBpID0gc2VsZi5fX3BvcworICAgICAgICBzZWxmLl9fcG9zID0gaiA9IGkrNAorICAgICAgICBkYXRhID0gc2VsZi5fX2J1ZltpOmpdCisgICAgICAgIGlmIGxlbihkYXRhKSA8IDQ6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICB4ID0gc3RydWN0LnVucGFjaygnPkwnLCBkYXRhKVswXQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gaW50KHgpCisgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgorICAgICAgICAgICAgcmV0dXJuIHgKKworICAgIGRlZiB1bnBhY2tfaW50KHNlbGYpOgorICAgICAgICBpID0gc2VsZi5fX3BvcworICAgICAgICBzZWxmLl9fcG9zID0gaiA9IGkrNAorICAgICAgICBkYXRhID0gc2VsZi5fX2J1ZltpOmpdCisgICAgICAgIGlmIGxlbihkYXRhKSA8IDQ6CisgICAgICAgICAgICByYWlzZSBFT0ZFcnJvcgorICAgICAgICByZXR1cm4gc3RydWN0LnVucGFjaygnPmwnLCBkYXRhKVswXQorCisgICAgdW5wYWNrX2VudW0gPSB1bnBhY2tfaW50CisKKyAgICBkZWYgdW5wYWNrX2Jvb2woc2VsZik6CisgICAgICAgIHJldHVybiBib29sKHNlbGYudW5wYWNrX2ludCgpKQorCisgICAgZGVmIHVucGFja191aHlwZXIoc2VsZik6CisgICAgICAgIGhpID0gc2VsZi51bnBhY2tfdWludCgpCisgICAgICAgIGxvID0gc2VsZi51bnBhY2tfdWludCgpCisgICAgICAgIHJldHVybiBsb25nKGhpKTw8MzIgfCBsbworCisgICAgZGVmIHVucGFja19oeXBlcihzZWxmKToKKyAgICAgICAgeCA9IHNlbGYudW5wYWNrX3VoeXBlcigpCisgICAgICAgIGlmIHggPj0gMHg4MDAwMDAwMDAwMDAwMDAwTDoKKyAgICAgICAgICAgIHggPSB4IC0gMHgxMDAwMDAwMDAwMDAwMDAwMEwKKyAgICAgICAgcmV0dXJuIHgKKworICAgIGRlZiB1bnBhY2tfZmxvYXQoc2VsZik6CisgICAgICAgIGkgPSBzZWxmLl9fcG9zCisgICAgICAgIHNlbGYuX19wb3MgPSBqID0gaSs0CisgICAgICAgIGRhdGEgPSBzZWxmLl9fYnVmW2k6al0KKyAgICAgICAgaWYgbGVuKGRhdGEpIDwgNDoKKyAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yCisgICAgICAgIHJldHVybiBzdHJ1Y3QudW5wYWNrKCc+ZicsIGRhdGEpWzBdCisKKyAgICBkZWYgdW5wYWNrX2RvdWJsZShzZWxmKToKKyAgICAgICAgaSA9IHNlbGYuX19wb3MKKyAgICAgICAgc2VsZi5fX3BvcyA9IGogPSBpKzgKKyAgICAgICAgZGF0YSA9IHNlbGYuX19idWZbaTpqXQorICAgICAgICBpZiBsZW4oZGF0YSkgPCA4OgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgcmV0dXJuIHN0cnVjdC51bnBhY2soJz5kJywgZGF0YSlbMF0KKworICAgIGRlZiB1bnBhY2tfZnN0cmluZyhzZWxmLCBuKToKKyAgICAgICAgaWYgbiA8IDA6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnZnN0cmluZyBzaXplIG11c3QgYmUgbm9ubmVnYXRpdmUnCisgICAgICAgIGkgPSBzZWxmLl9fcG9zCisgICAgICAgIGogPSBpICsgKG4rMykvLzQqNAorICAgICAgICBpZiBqID4gbGVuKHNlbGYuX19idWYpOgorICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IKKyAgICAgICAgc2VsZi5fX3BvcyA9IGoKKyAgICAgICAgcmV0dXJuIHNlbGYuX19idWZbaTppK25dCisKKyAgICB1bnBhY2tfZm9wYXF1ZSA9IHVucGFja19mc3RyaW5nCisKKyAgICBkZWYgdW5wYWNrX3N0cmluZyhzZWxmKToKKyAgICAgICAgbiA9IHNlbGYudW5wYWNrX3VpbnQoKQorICAgICAgICByZXR1cm4gc2VsZi51bnBhY2tfZnN0cmluZyhuKQorCisgICAgdW5wYWNrX29wYXF1ZSA9IHVucGFja19zdHJpbmcKKyAgICB1bnBhY2tfYnl0ZXMgPSB1bnBhY2tfc3RyaW5nCisKKyAgICBkZWYgdW5wYWNrX2xpc3Qoc2VsZiwgdW5wYWNrX2l0ZW0pOgorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHggPSBzZWxmLnVucGFja191aW50KCkKKyAgICAgICAgICAgIGlmIHggPT0gMDogYnJlYWsKKyAgICAgICAgICAgIGlmIHggIT0gMToKKyAgICAgICAgICAgICAgICByYWlzZSBDb252ZXJzaW9uRXJyb3IsICcwIG9yIDEgZXhwZWN0ZWQsIGdvdCAlcicgJSAoeCwpCisgICAgICAgICAgICBpdGVtID0gdW5wYWNrX2l0ZW0oKQorICAgICAgICAgICAgbGlzdC5hcHBlbmQoaXRlbSkKKyAgICAgICAgcmV0dXJuIGxpc3QKKworICAgIGRlZiB1bnBhY2tfZmFycmF5KHNlbGYsIG4sIHVucGFja19pdGVtKToKKyAgICAgICAgbGlzdCA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgbGlzdC5hcHBlbmQodW5wYWNrX2l0ZW0oKSkKKyAgICAgICAgcmV0dXJuIGxpc3QKKworICAgIGRlZiB1bnBhY2tfYXJyYXkoc2VsZiwgdW5wYWNrX2l0ZW0pOgorICAgICAgICBuID0gc2VsZi51bnBhY2tfdWludCgpCisgICAgICAgIHJldHVybiBzZWxmLnVucGFja19mYXJyYXkobiwgdW5wYWNrX2l0ZW0pCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3hkcmxpYi5weWMgYi9saWIvcHl0aG9uMi43L3hkcmxpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveGRybGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3hkcmxpYi5weW8gYi9saWIvcHl0aG9uMi43L3hkcmxpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZhNTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveGRybGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcveG1sL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZWQ5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDQxIEBACisiIiJDb3JlIFhNTCBzdXBwb3J0IGZvciBQeXRob24uCisKK1RoaXMgcGFja2FnZSBjb250YWlucyBmb3VyIHN1Yi1wYWNrYWdlczoKKworZG9tIC0tIFRoZSBXM0MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsLiAgVGhpcyBzdXBwb3J0cyBET00gTGV2ZWwgMSArCisgICAgICAgTmFtZXNwYWNlcy4KKworcGFyc2VycyAtLSBQeXRob24gd3JhcHBlcnMgZm9yIFhNTCBwYXJzZXJzIChjdXJyZW50bHkgb25seSBzdXBwb3J0cyBFeHBhdCkuCisKK3NheCAtLSBUaGUgU2ltcGxlIEFQSSBmb3IgWE1MLCBkZXZlbG9wZWQgYnkgWE1MLURldiwgbGVkIGJ5IERhdmlkCisgICAgICAgTWVnZ2luc29uIGFuZCBwb3J0ZWQgdG8gUHl0aG9uIGJ5IExhcnMgTWFyaXVzIEdhcnNob2wuICBUaGlzCisgICAgICAgc3VwcG9ydHMgdGhlIFNBWCAyIEFQSS4KKworZXRyZWUgLS0gVGhlIEVsZW1lbnRUcmVlIFhNTCBsaWJyYXJ5LiAgVGhpcyBpcyBhIHN1YnNldCBvZiB0aGUgZnVsbAorICAgICAgIEVsZW1lbnRUcmVlIFhNTCByZWxlYXNlLgorCisiIiIKKworCitfX2FsbF9fID0gWyJkb20iLCAicGFyc2VycyIsICJzYXgiLCAiZXRyZWUiXQorCitfTUlOSU1VTV9YTUxQTFVTX1ZFUlNJT04gPSAoMCwgOCwgNCkKKworCit0cnk6CisgICAgaW1wb3J0IF94bWxwbHVzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICB0cnk6CisgICAgICAgIHYgPSBfeG1scGx1cy52ZXJzaW9uX2luZm8KKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICMgX3htbHBsdXMgaXMgdG9vIG9sZDsgaWdub3JlIGl0CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBpZiB2ID49IF9NSU5JTVVNX1hNTFBMVVNfVkVSU0lPTjoKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIF94bWxwbHVzLl9fcGF0aF9fLmV4dGVuZChfX3BhdGhfXykKKyAgICAgICAgICAgIHN5cy5tb2R1bGVzW19fbmFtZV9fXSA9IF94bWxwbHVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWwgdgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy94bWwvX19pbml0X18ucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvX19pbml0X18ucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjU4NGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHkgYi9saWIvcHl0aG9uMi43L3htbC9kb20vTm9kZUZpbHRlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzA1MjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHkKQEAgLTAsMCArMSwyNyBAQAorIyBUaGlzIGlzIHRoZSBQeXRob24gbWFwcGluZyBmb3IgaW50ZXJmYWNlIE5vZGVGaWx0ZXIgZnJvbQorIyBET00yLVRyYXZlcnNhbC1SYW5nZS4gSXQgY29udGFpbnMgb25seSBjb25zdGFudHMuCisKK2NsYXNzIE5vZGVGaWx0ZXI6CisgICAgIiIiCisgICAgVGhpcyBpcyB0aGUgRE9NMiBOb2RlRmlsdGVyIGludGVyZmFjZS4gSXQgY29udGFpbnMgb25seSBjb25zdGFudHMuCisgICAgIiIiCisgICAgRklMVEVSX0FDQ0VQVCA9IDEKKyAgICBGSUxURVJfUkVKRUNUID0gMgorICAgIEZJTFRFUl9TS0lQICAgPSAzCisKKyAgICBTSE9XX0FMTCAgICAgICAgICAgICAgICAgICAgPSAweEZGRkZGRkZGTAorICAgIFNIT1dfRUxFTUVOVCAgICAgICAgICAgICAgICA9IDB4MDAwMDAwMDEKKyAgICBTSE9XX0FUVFJJQlVURSAgICAgICAgICAgICAgPSAweDAwMDAwMDAyCisgICAgU0hPV19URVhUICAgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAwNAorICAgIFNIT1dfQ0RBVEFfU0VDVElPTiAgICAgICAgICA9IDB4MDAwMDAwMDgKKyAgICBTSE9XX0VOVElUWV9SRUZFUkVOQ0UgICAgICAgPSAweDAwMDAwMDEwCisgICAgU0hPV19FTlRJVFkgICAgICAgICAgICAgICAgID0gMHgwMDAwMDAyMAorICAgIFNIT1dfUFJPQ0VTU0lOR19JTlNUUlVDVElPTiA9IDB4MDAwMDAwNDAKKyAgICBTSE9XX0NPTU1FTlQgICAgICAgICAgICAgICAgPSAweDAwMDAwMDgwCisgICAgU0hPV19ET0NVTUVOVCAgICAgICAgICAgICAgID0gMHgwMDAwMDEwMAorICAgIFNIT1dfRE9DVU1FTlRfVFlQRSAgICAgICAgICA9IDB4MDAwMDAyMDAKKyAgICBTSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UICAgICAgPSAweDAwMDAwNDAwCisgICAgU0hPV19OT1RBVElPTiAgICAgICAgICAgICAgID0gMHgwMDAwMDgwMAorCisgICAgZGVmIGFjY2VwdE5vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9Ob2RlRmlsdGVyLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9Ob2RlRmlsdGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjYxNDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9Ob2RlRmlsdGVyLnB5byBiL2xpYi9weXRob24yLjcveG1sL2RvbS9Ob2RlRmlsdGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjYxNDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL05vZGVGaWx0ZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcveG1sL2RvbS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzYzZDAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMTM5IEBACisiIiJXM0MgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24uCisKK1RoZSBQeXRob24gbWFwcGluZyBvZiB0aGUgRG9jdW1lbnQgT2JqZWN0IE1vZGVsIGlzIGRvY3VtZW50ZWQgaW4gdGhlCitQeXRob24gTGlicmFyeSBSZWZlcmVuY2UgaW4gdGhlIHNlY3Rpb24gb24gdGhlIHhtbC5kb20gcGFja2FnZS4KKworVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKKworbWluaWRvbSAtLSBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTGV2ZWwgMSBET00gd2l0aCBuYW1lc3BhY2UKKyAgICAgICAgICAgc3VwcG9ydCBhZGRlZCAoYmFzZWQgb24gdGhlIExldmVsIDIgc3BlY2lmaWNhdGlvbikgYW5kIG90aGVyCisgICAgICAgICAgIG1pbm9yIExldmVsIDIgZnVuY3Rpb25hbGl0eS4KKworcHVsbGRvbSAtLSBET00gYnVpbGRlciBzdXBwb3J0aW5nIG9uLWRlbWFuZCB0cmVlLWJ1aWxkaW5nIGZvciBzZWxlY3RlZAorICAgICAgICAgICBzdWJ0cmVlcyBvZiB0aGUgZG9jdW1lbnQuCisKKyIiIgorCisKK2NsYXNzIE5vZGU6CisgICAgIiIiQ2xhc3MgZ2l2aW5nIHRoZSBOb2RlVHlwZSBjb25zdGFudHMuIiIiCisKKyAgICAjIERPTSBpbXBsZW1lbnRhdGlvbnMgbWF5IHVzZSB0aGlzIGFzIGEgYmFzZSBjbGFzcyBmb3IgdGhlaXIgb3duCisgICAgIyBOb2RlIGltcGxlbWVudGF0aW9ucy4gIElmIHRoZXkgZG9uJ3QsIHRoZSBjb25zdGFudHMgZGVmaW5lZCBoZXJlCisgICAgIyBzaG91bGQgc3RpbGwgYmUgdXNlZCBhcyB0aGUgY2Fub25pY2FsIGRlZmluaXRpb25zIGFzIHRoZXkgbWF0Y2gKKyAgICAjIHRoZSB2YWx1ZXMgZ2l2ZW4gaW4gdGhlIFczQyByZWNvbW1lbmRhdGlvbi4gIENsaWVudCBjb2RlIGNhbgorICAgICMgc2FmZWx5IHJlZmVyIHRvIHRoZXNlIHZhbHVlcyBpbiBhbGwgdGVzdHMgb2YgTm9kZS5ub2RlVHlwZQorICAgICMgdmFsdWVzLgorCisgICAgRUxFTUVOVF9OT0RFICAgICAgICAgICAgICAgID0gMQorICAgIEFUVFJJQlVURV9OT0RFICAgICAgICAgICAgICA9IDIKKyAgICBURVhUX05PREUgICAgICAgICAgICAgICAgICAgPSAzCisgICAgQ0RBVEFfU0VDVElPTl9OT0RFICAgICAgICAgID0gNAorICAgIEVOVElUWV9SRUZFUkVOQ0VfTk9ERSAgICAgICA9IDUKKyAgICBFTlRJVFlfTk9ERSAgICAgICAgICAgICAgICAgPSA2CisgICAgUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFID0gNworICAgIENPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICA9IDgKKyAgICBET0NVTUVOVF9OT0RFICAgICAgICAgICAgICAgPSA5CisgICAgRE9DVU1FTlRfVFlQRV9OT0RFICAgICAgICAgID0gMTAKKyAgICBET0NVTUVOVF9GUkFHTUVOVF9OT0RFICAgICAgPSAxMQorICAgIE5PVEFUSU9OX05PREUgICAgICAgICAgICAgICA9IDEyCisKKworI0V4Y2VwdGlvbkNvZGUKK0lOREVYX1NJWkVfRVJSICAgICAgICAgICAgICAgICA9IDEKK0RPTVNUUklOR19TSVpFX0VSUiAgICAgICAgICAgICA9IDIKK0hJRVJBUkNIWV9SRVFVRVNUX0VSUiAgICAgICAgICA9IDMKK1dST05HX0RPQ1VNRU5UX0VSUiAgICAgICAgICAgICA9IDQKK0lOVkFMSURfQ0hBUkFDVEVSX0VSUiAgICAgICAgICA9IDUKK05PX0RBVEFfQUxMT1dFRF9FUlIgICAgICAgICAgICA9IDYKK05PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiAgICA9IDcKK05PVF9GT1VORF9FUlIgICAgICAgICAgICAgICAgICA9IDgKK05PVF9TVVBQT1JURURfRVJSICAgICAgICAgICAgICA9IDkKK0lOVVNFX0FUVFJJQlVURV9FUlIgICAgICAgICAgICA9IDEwCitJTlZBTElEX1NUQVRFX0VSUiAgICAgICAgICAgICAgPSAxMQorU1lOVEFYX0VSUiAgICAgICAgICAgICAgICAgICAgID0gMTIKK0lOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiAgICAgICA9IDEzCitOQU1FU1BBQ0VfRVJSICAgICAgICAgICAgICAgICAgPSAxNAorSU5WQUxJRF9BQ0NFU1NfRVJSICAgICAgICAgICAgID0gMTUKK1ZBTElEQVRJT05fRVJSICAgICAgICAgICAgICAgICA9IDE2CisKKworY2xhc3MgRE9NRXhjZXB0aW9uKEV4Y2VwdGlvbik6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgRE9NIGV4Y2VwdGlvbnMuCisgICAgRXhjZXB0aW9ucyB3aXRoIHNwZWNpZmljIGNvZGVzIGFyZSBzcGVjaWFsaXphdGlvbnMgb2YgdGhpcyBjbGFzcy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprdyk6CisgICAgICAgIGlmIHNlbGYuX19jbGFzc19fIGlzIERPTUV4Y2VwdGlvbjoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICAgICAiRE9NRXhjZXB0aW9uIHNob3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5IikKKyAgICAgICAgRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsICphcmdzLCAqKmt3KQorCisgICAgZGVmIF9nZXRfY29kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuY29kZQorCisKK2NsYXNzIEluZGV4U2l6ZUVycihET01FeGNlcHRpb24pOgorICAgIGNvZGUgPSBJTkRFWF9TSVpFX0VSUgorCitjbGFzcyBEb21zdHJpbmdTaXplRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IERPTVNUUklOR19TSVpFX0VSUgorCitjbGFzcyBIaWVyYXJjaHlSZXF1ZXN0RXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IEhJRVJBUkNIWV9SRVFVRVNUX0VSUgorCitjbGFzcyBXcm9uZ0RvY3VtZW50RXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IFdST05HX0RPQ1VNRU5UX0VSUgorCitjbGFzcyBJbnZhbGlkQ2hhcmFjdGVyRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IElOVkFMSURfQ0hBUkFDVEVSX0VSUgorCitjbGFzcyBOb0RhdGFBbGxvd2VkRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IE5PX0RBVEFfQUxMT1dFRF9FUlIKKworY2xhc3MgTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUgorCitjbGFzcyBOb3RGb3VuZEVycihET01FeGNlcHRpb24pOgorICAgIGNvZGUgPSBOT1RfRk9VTkRfRVJSCisKK2NsYXNzIE5vdFN1cHBvcnRlZEVycihET01FeGNlcHRpb24pOgorICAgIGNvZGUgPSBOT1RfU1VQUE9SVEVEX0VSUgorCitjbGFzcyBJbnVzZUF0dHJpYnV0ZUVycihET01FeGNlcHRpb24pOgorICAgIGNvZGUgPSBJTlVTRV9BVFRSSUJVVEVfRVJSCisKK2NsYXNzIEludmFsaWRTdGF0ZUVycihET01FeGNlcHRpb24pOgorICAgIGNvZGUgPSBJTlZBTElEX1NUQVRFX0VSUgorCitjbGFzcyBTeW50YXhFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gU1lOVEFYX0VSUgorCitjbGFzcyBJbnZhbGlkTW9kaWZpY2F0aW9uRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IElOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUgorCitjbGFzcyBOYW1lc3BhY2VFcnIoRE9NRXhjZXB0aW9uKToKKyAgICBjb2RlID0gTkFNRVNQQUNFX0VSUgorCitjbGFzcyBJbnZhbGlkQWNjZXNzRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IElOVkFMSURfQUNDRVNTX0VSUgorCitjbGFzcyBWYWxpZGF0aW9uRXJyKERPTUV4Y2VwdGlvbik6CisgICAgY29kZSA9IFZBTElEQVRJT05fRVJSCisKK2NsYXNzIFVzZXJEYXRhSGFuZGxlcjoKKyAgICAiIiJDbGFzcyBnaXZpbmcgdGhlIG9wZXJhdGlvbiBjb25zdGFudHMgZm9yIFVzZXJEYXRhSGFuZGxlci5oYW5kbGUoKS4iIiIKKworICAgICMgQmFzZWQgb24gRE9NIExldmVsIDMgKFdEIDkgQXByaWwgMjAwMikKKworICAgIE5PREVfQ0xPTkVEICAgPSAxCisgICAgTk9ERV9JTVBPUlRFRCA9IDIKKyAgICBOT0RFX0RFTEVURUQgID0gMworICAgIE5PREVfUkVOQU1FRCAgPSA0CisKK1hNTF9OQU1FU1BBQ0UgPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorWE1MTlNfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgorWEhUTUxfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCitFTVBUWV9OQU1FU1BBQ0UgPSBOb25lCitFTVBUWV9QUkVGSVggPSBOb25lCisKK2Zyb20gZG9tcmVnIGltcG9ydCBnZXRET01JbXBsZW1lbnRhdGlvbixyZWdpc3RlckRPTUltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vX19pbml0X18ucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBiOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vX19pbml0X18ucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjBiOTA0Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2RvbXJlZy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNhY2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2RvbXJlZy5weQpAQCAtMCwwICsxLDk5IEBACisiIiJSZWdpc3RyYXRpb24gZmFjaWxpdGllcyBmb3IgRE9NLiBUaGlzIG1vZHVsZSBzaG91bGQgbm90IGJlIHVzZWQKK2RpcmVjdGx5LiBJbnN0ZWFkLCB0aGUgZnVuY3Rpb25zIGdldERPTUltcGxlbWVudGF0aW9uIGFuZAorcmVnaXN0ZXJET01JbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgaW1wb3J0ZWQgZnJvbSB4bWwuZG9tLiIiIgorCitmcm9tIHhtbC5kb20ubWluaWNvbXBhdCBpbXBvcnQgKiAgIyBpc2luc3RhbmNlLCBTdHJpbmdUeXBlcworCisjIFRoaXMgaXMgYSBsaXN0IG9mIHdlbGwta25vd24gaW1wbGVtZW50YXRpb25zLiAgV2VsbC1rbm93biBuYW1lcworIyBzaG91bGQgYmUgcHVibGlzaGVkIGJ5IHBvc3RpbmcgdG8geG1sLXNpZ0BweXRob24ub3JnLCBhbmQgYXJlCisjIHN1YnNlcXVlbnRseSByZWNvcmRlZCBpbiB0aGlzIGZpbGUuCisKK3dlbGxfa25vd25faW1wbGVtZW50YXRpb25zID0geworICAgICdtaW5pZG9tJzoneG1sLmRvbS5taW5pZG9tJywKKyAgICAnNERPTSc6ICd4bWwuZG9tLkRPTUltcGxlbWVudGF0aW9uJywKKyAgICB9CisKKyMgRE9NIGltcGxlbWVudGF0aW9ucyBub3Qgb2ZmaWNpYWxseSByZWdpc3RlcmVkIHNob3VsZCByZWdpc3RlcgorIyB0aGVtc2VsdmVzIHdpdGggdGhlaXIKKworcmVnaXN0ZXJlZCA9IHt9CisKK2RlZiByZWdpc3RlckRPTUltcGxlbWVudGF0aW9uKG5hbWUsIGZhY3RvcnkpOgorICAgICIiInJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24obmFtZSwgZmFjdG9yeSkKKworICAgIFJlZ2lzdGVyIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIHdpdGggdGhlIG5hbWUuIFRoZSBmYWN0b3J5IGZ1bmN0aW9uCisgICAgc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgRE9NSW1wbGVtZW50YXRpb24KKyAgICBpbnRlcmZhY2UuIFRoZSBmYWN0b3J5IGZ1bmN0aW9uIGNhbiBlaXRoZXIgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCwKKyAgICBvciBhIG5ldyBvbmUgKGUuZy4gaWYgdGhhdCBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyBzb21lCisgICAgY3VzdG9taXphdGlvbikuIiIiCisKKyAgICByZWdpc3RlcmVkW25hbWVdID0gZmFjdG9yeQorCitkZWYgX2dvb2RfZW5vdWdoKGRvbSwgZmVhdHVyZXMpOgorICAgICJfZ29vZF9lbm91Z2goZG9tLCBmZWF0dXJlcykgLT4gUmV0dXJuIDEgaWYgdGhlIGRvbSBvZmZlcnMgdGhlIGZlYXR1cmVzIgorICAgIGZvciBmLHYgaW4gZmVhdHVyZXM6CisgICAgICAgIGlmIG5vdCBkb20uaGFzRmVhdHVyZShmLHYpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICByZXR1cm4gMQorCitkZWYgZ2V0RE9NSW1wbGVtZW50YXRpb24obmFtZSA9IE5vbmUsIGZlYXR1cmVzID0gKCkpOgorICAgICIiImdldERPTUltcGxlbWVudGF0aW9uKG5hbWUgPSBOb25lLCBmZWF0dXJlcyA9ICgpKSAtPiBET00gaW1wbGVtZW50YXRpb24uCisKKyAgICBSZXR1cm4gYSBzdWl0YWJsZSBET00gaW1wbGVtZW50YXRpb24uIFRoZSBuYW1lIGlzIGVpdGhlcgorICAgIHdlbGwta25vd24sIHRoZSBtb2R1bGUgbmFtZSBvZiBhIERPTSBpbXBsZW1lbnRhdGlvbiwgb3IgTm9uZS4gSWYKKyAgICBpdCBpcyBub3QgTm9uZSwgaW1wb3J0cyB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgYW5kIHJldHVybnMKKyAgICBET01JbXBsZW1lbnRhdGlvbiBvYmplY3QgaWYgdGhlIGltcG9ydCBzdWNjZWVkcy4KKworICAgIElmIG5hbWUgaXMgbm90IGdpdmVuLCBjb25zaWRlciB0aGUgYXZhaWxhYmxlIGltcGxlbWVudGF0aW9ucyB0bworICAgIGZpbmQgb25lIHdpdGggdGhlIHJlcXVpcmVkIGZlYXR1cmUgc2V0LiBJZiBubyBpbXBsZW1lbnRhdGlvbiBjYW4KKyAgICBiZSBmb3VuZCwgcmFpc2UgYW4gSW1wb3J0RXJyb3IuIFRoZSBmZWF0dXJlcyBsaXN0IG11c3QgYmUgYSBzZXF1ZW5jZQorICAgIG9mIChmZWF0dXJlLCB2ZXJzaW9uKSBwYWlycyB3aGljaCBhcmUgcGFzc2VkIHRvIGhhc0ZlYXR1cmUuIiIiCisKKyAgICBpbXBvcnQgb3MKKyAgICBjcmVhdG9yID0gTm9uZQorICAgIG1vZCA9IHdlbGxfa25vd25faW1wbGVtZW50YXRpb25zLmdldChuYW1lKQorICAgIGlmIG1vZDoKKyAgICAgICAgbW9kID0gX19pbXBvcnRfXyhtb2QsIHt9LCB7fSwgWydnZXRET01JbXBsZW1lbnRhdGlvbiddKQorICAgICAgICByZXR1cm4gbW9kLmdldERPTUltcGxlbWVudGF0aW9uKCkKKyAgICBlbGlmIG5hbWU6CisgICAgICAgIHJldHVybiByZWdpc3RlcmVkW25hbWVdKCkKKyAgICBlbGlmICJQWVRIT05fRE9NIiBpbiBvcy5lbnZpcm9uOgorICAgICAgICByZXR1cm4gZ2V0RE9NSW1wbGVtZW50YXRpb24obmFtZSA9IG9zLmVudmlyb25bIlBZVEhPTl9ET00iXSkKKworICAgICMgVXNlciBkaWQgbm90IHNwZWNpZnkgYSBuYW1lLCB0cnkgaW1wbGVtZW50YXRpb25zIGluIGFyYml0cmFyeQorICAgICMgb3JkZXIsIHJldHVybmluZyB0aGUgb25lIHRoYXQgaGFzIHRoZSByZXF1aXJlZCBmZWF0dXJlcworICAgIGlmIGlzaW5zdGFuY2UoZmVhdHVyZXMsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgZmVhdHVyZXMgPSBfcGFyc2VfZmVhdHVyZV9zdHJpbmcoZmVhdHVyZXMpCisgICAgZm9yIGNyZWF0b3IgaW4gcmVnaXN0ZXJlZC52YWx1ZXMoKToKKyAgICAgICAgZG9tID0gY3JlYXRvcigpCisgICAgICAgIGlmIF9nb29kX2Vub3VnaChkb20sIGZlYXR1cmVzKToKKyAgICAgICAgICAgIHJldHVybiBkb20KKworICAgIGZvciBjcmVhdG9yIGluIHdlbGxfa25vd25faW1wbGVtZW50YXRpb25zLmtleXMoKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZG9tID0gZ2V0RE9NSW1wbGVtZW50YXRpb24obmFtZSA9IGNyZWF0b3IpCisgICAgICAgIGV4Y2VwdCBTdGFuZGFyZEVycm9yOiAjIHR5cGljYWxseSBJbXBvcnRFcnJvciwgb3IgQXR0cmlidXRlRXJyb3IKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIF9nb29kX2Vub3VnaChkb20sIGZlYXR1cmVzKToKKyAgICAgICAgICAgIHJldHVybiBkb20KKworICAgIHJhaXNlIEltcG9ydEVycm9yLCJubyBzdWl0YWJsZSBET00gaW1wbGVtZW50YXRpb24gZm91bmQiCisKK2RlZiBfcGFyc2VfZmVhdHVyZV9zdHJpbmcocyk6CisgICAgZmVhdHVyZXMgPSBbXQorICAgIHBhcnRzID0gcy5zcGxpdCgpCisgICAgaSA9IDAKKyAgICBsZW5ndGggPSBsZW4ocGFydHMpCisgICAgd2hpbGUgaSA8IGxlbmd0aDoKKyAgICAgICAgZmVhdHVyZSA9IHBhcnRzW2ldCisgICAgICAgIGlmIGZlYXR1cmVbMF0gaW4gIjAxMjM0NTY3ODkiOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImJhZCBmZWF0dXJlIG5hbWU6ICVyIiAlIChmZWF0dXJlLCkKKyAgICAgICAgaSA9IGkgKyAxCisgICAgICAgIHZlcnNpb24gPSBOb25lCisgICAgICAgIGlmIGkgPCBsZW5ndGg6CisgICAgICAgICAgICB2ID0gcGFydHNbaV0KKyAgICAgICAgICAgIGlmIHZbMF0gaW4gIjAxMjM0NTY3ODkiOgorICAgICAgICAgICAgICAgIGkgPSBpICsgMQorICAgICAgICAgICAgICAgIHZlcnNpb24gPSB2CisgICAgICAgIGZlYXR1cmVzLmFwcGVuZCgoZmVhdHVyZSwgdmVyc2lvbikpCisgICAgcmV0dXJuIHR1cGxlKGZlYXR1cmVzKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL2RvbXJlZy5weWMgYi9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ2MTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2RvbXJlZy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL2RvbXJlZy5weW8gYi9saWIvcHl0aG9uMi43L3htbC9kb20vZG9tcmVnLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ2MTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2RvbXJlZy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weSBiL2xpYi9weXRob24yLjcveG1sL2RvbS9leHBhdGJ1aWxkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZiYTg3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9leHBhdGJ1aWxkZXIucHkKQEAgLTAsMCArMSw5ODMgQEAKKyIiIkZhY2lsaXR5IHRvIHVzZSB0aGUgRXhwYXQgcGFyc2VyIHRvIGxvYWQgYSBtaW5pZG9tIGluc3RhbmNlCitmcm9tIGEgc3RyaW5nIG9yIGZpbGUuCisKK1RoaXMgYXZvaWRzIGFsbCB0aGUgb3ZlcmhlYWQgb2YgU0FYIGFuZCBwdWxsZG9tIHRvIGdhaW4gcGVyZm9ybWFuY2UuCisiIiIKKworIyBXYXJuaW5nIQorIworIyBUaGlzIG1vZHVsZSBpcyB0aWdodGx5IGJvdW5kIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRoZQorIyBtaW5pZG9tIERPTSBhbmQgY2FuJ3QgYmUgdXNlZCB3aXRoIG90aGVyIERPTSBpbXBsZW1lbnRhdGlvbnMuICBUaGlzCisjIGlzIGR1ZSwgaW4gcGFydCwgdG8gYSBsYWNrIG9mIGFwcHJvcHJpYXRlIG1ldGhvZHMgaW4gdGhlIERPTSAodGhlcmUgaXMKKyMgbm8gd2F5IHRvIGNyZWF0ZSBFbnRpdHkgYW5kIE5vdGF0aW9uIG5vZGVzIHZpYSB0aGUgRE9NIExldmVsIDIKKyMgaW50ZXJmYWNlKSwgYW5kIGZvciBwZXJmb3JtYW5jZS4gIFRoZSBsYXRlciBpcyB0aGUgY2F1c2Ugb2Ygc29tZSBmYWlybHkKKyMgY3J5cHRpYyBjb2RlLgorIworIyBQZXJmb3JtYW5jZSBoYWNrczoKKyMKKyMgICAtICAuY2hhcmFjdGVyX2RhdGFfaGFuZGxlcigpIGhhcyBhbiBleHRyYSBjYXNlIGluIHdoaWNoIGNvbnRpbnVpbmcKKyMgICAgICBkYXRhIGlzIGFwcGVuZGVkIHRvIGFuIGV4aXN0aW5nIFRleHQgbm9kZTsgdGhpcyBjYW4gYmUgYQorIyAgICAgIHNwZWVkdXAgc2luY2UgcHlleHBhdCBjYW4gYnJlYWsgdXAgY2hhcmFjdGVyIGRhdGEgaW50byBtdWx0aXBsZQorIyAgICAgIGNhbGxiYWNrcyBldmVuIHRob3VnaCB3ZSBzZXQgdGhlIGJ1ZmZlcl90ZXh0IGF0dHJpYnV0ZSBvbiB0aGUKKyMgICAgICBwYXJzZXIuICBUaGlzIGFsc28gZ2l2ZXMgdXMgdGhlIGFkdmFudGFnZSB0aGF0IHdlIGRvbid0IG5lZWQgYQorIyAgICAgIHNlcGFyYXRlIG5vcm1hbGl6YXRpb24gcGFzcy4KKyMKKyMgICAtICBEZXRlcm1pbmluZyB0aGF0IGEgbm9kZSBleGlzdHMgaXMgZG9uZSB1c2luZyBhbiBpZGVudGl0eSBjb21wYXJpc29uCisjICAgICAgd2l0aCBOb25lIHJhdGhlciB0aGFuIGEgdHJ1dGggdGVzdDsgdGhpcyBhdm9pZHMgc2VhcmNoaW5nIGZvciBhbmQKKyMgICAgICBjYWxsaW5nIGFueSBtZXRob2RzIG9uIHRoZSBub2RlIG9iamVjdCBpZiBpdCBleGlzdHMuICAoQSByYXRoZXIKKyMgICAgICBuaWNlIHNwZWVkdXAgaXMgYWNoaWV2ZWQgdGhpcyB3YXkgYXMgd2VsbCEpCisKK2Zyb20geG1sLmRvbSBpbXBvcnQgeG1sYnVpbGRlciwgbWluaWRvbSwgTm9kZQorZnJvbSB4bWwuZG9tIGltcG9ydCBFTVBUWV9OQU1FU1BBQ0UsIEVNUFRZX1BSRUZJWCwgWE1MTlNfTkFNRVNQQUNFCitmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAorZnJvbSB4bWwuZG9tLm1pbmlkb20gaW1wb3J0IF9hcHBlbmRfY2hpbGQsIF9zZXRfYXR0cmlidXRlX25vZGUKK2Zyb20geG1sLmRvbS5Ob2RlRmlsdGVyIGltcG9ydCBOb2RlRmlsdGVyCisKK2Zyb20geG1sLmRvbS5taW5pY29tcGF0IGltcG9ydCAqCisKK1RFWFRfTk9ERSA9IE5vZGUuVEVYVF9OT0RFCitDREFUQV9TRUNUSU9OX05PREUgPSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERQorRE9DVU1FTlRfTk9ERSA9IE5vZGUuRE9DVU1FTlRfTk9ERQorCitGSUxURVJfQUNDRVBUID0geG1sYnVpbGRlci5ET01CdWlsZGVyRmlsdGVyLkZJTFRFUl9BQ0NFUFQKK0ZJTFRFUl9SRUpFQ1QgPSB4bWxidWlsZGVyLkRPTUJ1aWxkZXJGaWx0ZXIuRklMVEVSX1JFSkVDVAorRklMVEVSX1NLSVAgPSB4bWxidWlsZGVyLkRPTUJ1aWxkZXJGaWx0ZXIuRklMVEVSX1NLSVAKK0ZJTFRFUl9JTlRFUlJVUFQgPSB4bWxidWlsZGVyLkRPTUJ1aWxkZXJGaWx0ZXIuRklMVEVSX0lOVEVSUlVQVAorCit0aGVET01JbXBsZW1lbnRhdGlvbiA9IG1pbmlkb20uZ2V0RE9NSW1wbGVtZW50YXRpb24oKQorCisjIEV4cGF0IHR5cGVuYW1lIC0+IFR5cGVJbmZvCitfdHlwZWluZm9fbWFwID0geworICAgICJDREFUQSI6ICAgIG1pbmlkb20uVHlwZUluZm8oTm9uZSwgImNkYXRhIiksCisgICAgIkVOVU0iOiAgICAgbWluaWRvbS5UeXBlSW5mbyhOb25lLCAiZW51bWVyYXRpb24iKSwKKyAgICAiRU5USVRZIjogICBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJlbnRpdHkiKSwKKyAgICAiRU5USVRJRVMiOiBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJlbnRpdGllcyIpLAorICAgICJJRCI6ICAgICAgIG1pbmlkb20uVHlwZUluZm8oTm9uZSwgImlkIiksCisgICAgIklEUkVGIjogICAgbWluaWRvbS5UeXBlSW5mbyhOb25lLCAiaWRyZWYiKSwKKyAgICAiSURSRUZTIjogICBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJpZHJlZnMiKSwKKyAgICAiTk1UT0tFTiI6ICBtaW5pZG9tLlR5cGVJbmZvKE5vbmUsICJubXRva2VuIiksCisgICAgIk5NVE9LRU5TIjogbWluaWRvbS5UeXBlSW5mbyhOb25lLCAibm10b2tlbnMiKSwKKyAgICB9CisKK2NsYXNzIEVsZW1lbnRJbmZvKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ19hdHRyX2luZm8nLCAnX21vZGVsJywgJ3RhZ05hbWUnCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFnTmFtZSwgbW9kZWw9Tm9uZSk6CisgICAgICAgIHNlbGYudGFnTmFtZSA9IHRhZ05hbWUKKyAgICAgICAgc2VsZi5fYXR0cl9pbmZvID0gW10KKyAgICAgICAgc2VsZi5fbW9kZWwgPSBtb2RlbAorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJfaW5mbywgc2VsZi5fbW9kZWwsIHNlbGYudGFnTmFtZQorCisgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6CisgICAgICAgIHNlbGYuX2F0dHJfaW5mbywgc2VsZi5fbW9kZWwsIHNlbGYudGFnTmFtZSA9IHN0YXRlCisKKyAgICBkZWYgZ2V0QXR0cmlidXRlVHlwZShzZWxmLCBhbmFtZSk6CisgICAgICAgIGZvciBpbmZvIGluIHNlbGYuX2F0dHJfaW5mbzoKKyAgICAgICAgICAgIGlmIGluZm9bMV0gPT0gYW5hbWU6CisgICAgICAgICAgICAgICAgdCA9IGluZm9bLTJdCisgICAgICAgICAgICAgICAgaWYgdFswXSA9PSAiKCI6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfdHlwZWluZm9fbWFwWyJFTlVNIl0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3R5cGVpbmZvX21hcFtpbmZvWy0yXV0KKyAgICAgICAgcmV0dXJuIG1pbmlkb20uX25vX3R5cGUKKworICAgIGRlZiBnZXRBdHRyaWJ1dGVUeXBlTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICByZXR1cm4gbWluaWRvbS5fbm9fdHlwZQorCisgICAgZGVmIGlzRWxlbWVudENvbnRlbnQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX21vZGVsOgorICAgICAgICAgICAgdHlwZSA9IHNlbGYuX21vZGVsWzBdCisgICAgICAgICAgICByZXR1cm4gdHlwZSBub3QgaW4gKGV4cGF0Lm1vZGVsLlhNTF9DVFlQRV9BTlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGF0Lm1vZGVsLlhNTF9DVFlQRV9NSVhFRCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGlzRW1wdHkoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX21vZGVsOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX21vZGVsWzBdID09IGV4cGF0Lm1vZGVsLlhNTF9DVFlQRV9FTVBUWQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaXNJZChzZWxmLCBhbmFtZSk6CisgICAgICAgIGZvciBpbmZvIGluIHNlbGYuX2F0dHJfaW5mbzoKKyAgICAgICAgICAgIGlmIGluZm9bMV0gPT0gYW5hbWU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGluZm9bLTJdID09ICJJRCIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaXNJZE5TKHNlbGYsIGV1cmksIGVuYW1lLCBhdXJpLCBhbmFtZSk6CisgICAgICAgICMgbm90IHN1cmUgdGhpcyBpcyBtZWFuaW5nZnVsCisgICAgICAgIHJldHVybiBzZWxmLmlzSWQoKGF1cmksIGFuYW1lKSkKKworZGVmIF9pbnRlcm4oYnVpbGRlciwgcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuX2ludGVybl9zZXRkZWZhdWx0KHMsIHMpCisKK2RlZiBfcGFyc2VfbnNfbmFtZShidWlsZGVyLCBuYW1lKToKKyAgICBhc3NlcnQgJyAnIGluIG5hbWUKKyAgICBwYXJ0cyA9IG5hbWUuc3BsaXQoJyAnKQorICAgIGludGVybiA9IGJ1aWxkZXIuX2ludGVybl9zZXRkZWZhdWx0CisgICAgaWYgbGVuKHBhcnRzKSA9PSAzOgorICAgICAgICB1cmksIGxvY2FsbmFtZSwgcHJlZml4ID0gcGFydHMKKyAgICAgICAgcHJlZml4ID0gaW50ZXJuKHByZWZpeCwgcHJlZml4KQorICAgICAgICBxbmFtZSA9ICIlczolcyIgJSAocHJlZml4LCBsb2NhbG5hbWUpCisgICAgICAgIHFuYW1lID0gaW50ZXJuKHFuYW1lLCBxbmFtZSkKKyAgICAgICAgbG9jYWxuYW1lID0gaW50ZXJuKGxvY2FsbmFtZSwgbG9jYWxuYW1lKQorICAgIGVsc2U6CisgICAgICAgIHVyaSwgbG9jYWxuYW1lID0gcGFydHMKKyAgICAgICAgcHJlZml4ID0gRU1QVFlfUFJFRklYCisgICAgICAgIHFuYW1lID0gbG9jYWxuYW1lID0gaW50ZXJuKGxvY2FsbmFtZSwgbG9jYWxuYW1lKQorICAgIHJldHVybiBpbnRlcm4odXJpLCB1cmkpLCBsb2NhbG5hbWUsIHByZWZpeCwgcW5hbWUKKworCitjbGFzcyBFeHBhdEJ1aWxkZXI6CisgICAgIiIiRG9jdW1lbnQgYnVpbGRlciB0aGF0IHVzZXMgRXhwYXQgdG8gYnVpbGQgYSBQYXJzZWRYTUwuRE9NIGRvY3VtZW50CisgICAgaW5zdGFuY2UuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucz1Ob25lKToKKyAgICAgICAgaWYgb3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgb3B0aW9ucyA9IHhtbGJ1aWxkZXIuT3B0aW9ucygpCisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIGlmIHNlbGYuX29wdGlvbnMuZmlsdGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5fZmlsdGVyID0gRmlsdGVyVmlzaWJpbGl0eUNvbnRyb2xsZXIoc2VsZi5fb3B0aW9ucy5maWx0ZXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9maWx0ZXIgPSBOb25lCisgICAgICAgICAgICAjIFRoaXMgKnJlYWxseSogZG9lc24ndCBkbyBhbnl0aGluZyBpbiB0aGlzIGNhc2UsIHNvCisgICAgICAgICAgICAjIG92ZXJyaWRlIGl0IHdpdGggc29tZXRoaW5nIGZhc3QgJiBtaW5pbWFsLgorICAgICAgICAgICAgc2VsZi5fZmluaXNoX3N0YXJ0X2VsZW1lbnQgPSBpZAorICAgICAgICBzZWxmLl9wYXJzZXIgPSBOb25lCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIGNyZWF0ZVBhcnNlcihzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IHBhcnNlciBvYmplY3QuIiIiCisgICAgICAgIHJldHVybiBleHBhdC5QYXJzZXJDcmVhdGUoKQorCisgICAgZGVmIGdldFBhcnNlcihzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHRoZSBwYXJzZXIgb2JqZWN0LCBjcmVhdGluZyBhIG5ldyBvbmUgaWYgbmVlZGVkLiIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fcGFyc2VyOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyID0gc2VsZi5jcmVhdGVQYXJzZXIoKQorICAgICAgICAgICAgc2VsZi5faW50ZXJuX3NldGRlZmF1bHQgPSBzZWxmLl9wYXJzZXIuaW50ZXJuLnNldGRlZmF1bHQKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5idWZmZXJfdGV4dCA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5vcmRlcmVkX2F0dHJpYnV0ZXMgPSBUcnVlCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuc3BlY2lmaWVkX2F0dHJpYnV0ZXMgPSBUcnVlCisgICAgICAgICAgICBzZWxmLmluc3RhbGwoc2VsZi5fcGFyc2VyKQorICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VyCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgICIiIkZyZWUgYWxsIGRhdGEgc3RydWN0dXJlcyB1c2VkIGR1cmluZyBET00gY29uc3RydWN0aW9uLiIiIgorICAgICAgICBzZWxmLmRvY3VtZW50ID0gdGhlRE9NSW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnQoCisgICAgICAgICAgICBFTVBUWV9OQU1FU1BBQ0UsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuY3VyTm9kZSA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgc2VsZi5fZWxlbV9pbmZvID0gc2VsZi5kb2N1bWVudC5fZWxlbV9pbmZvCisgICAgICAgIHNlbGYuX2NkYXRhID0gRmFsc2UKKworICAgIGRlZiBpbnN0YWxsKHNlbGYsIHBhcnNlcik6CisgICAgICAgICIiIkluc3RhbGwgdGhlIGNhbGxiYWNrcyBuZWVkZWQgdG8gYnVpbGQgdGhlIERPTSBpbnRvIHRoZSBwYXJzZXIuIiIiCisgICAgICAgICMgVGhpcyBjcmVhdGVzIGNpcmN1bGFyIHJlZmVyZW5jZXMhCisgICAgICAgIHBhcnNlci5TdGFydERvY3R5cGVEZWNsSGFuZGxlciA9IHNlbGYuc3RhcnRfZG9jdHlwZV9kZWNsX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLmZpcnN0X2VsZW1lbnRfaGFuZGxlcgorICAgICAgICBwYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBzZWxmLmVuZF9lbGVtZW50X2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBzZWxmLnBpX2hhbmRsZXIKKyAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5lbnRpdGllczoKKyAgICAgICAgICAgIHBhcnNlci5FbnRpdHlEZWNsSGFuZGxlciA9IHNlbGYuZW50aXR5X2RlY2xfaGFuZGxlcgorICAgICAgICBwYXJzZXIuTm90YXRpb25EZWNsSGFuZGxlciA9IHNlbGYubm90YXRpb25fZGVjbF9oYW5kbGVyCisgICAgICAgIGlmIHNlbGYuX29wdGlvbnMuY29tbWVudHM6CisgICAgICAgICAgICBwYXJzZXIuQ29tbWVudEhhbmRsZXIgPSBzZWxmLmNvbW1lbnRfaGFuZGxlcgorICAgICAgICBpZiBzZWxmLl9vcHRpb25zLmNkYXRhX3NlY3Rpb25zOgorICAgICAgICAgICAgcGFyc2VyLlN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciA9IHNlbGYuc3RhcnRfY2RhdGFfc2VjdGlvbl9oYW5kbGVyCisgICAgICAgICAgICBwYXJzZXIuRW5kQ2RhdGFTZWN0aW9uSGFuZGxlciA9IHNlbGYuZW5kX2NkYXRhX3NlY3Rpb25faGFuZGxlcgorICAgICAgICAgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gc2VsZi5jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyX2NkYXRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLmNoYXJhY3Rlcl9kYXRhX2hhbmRsZXIKKyAgICAgICAgcGFyc2VyLkV4dGVybmFsRW50aXR5UmVmSGFuZGxlciA9IHNlbGYuZXh0ZXJuYWxfZW50aXR5X3JlZl9oYW5kbGVyCisgICAgICAgIHBhcnNlci5YbWxEZWNsSGFuZGxlciA9IHNlbGYueG1sX2RlY2xfaGFuZGxlcgorICAgICAgICBwYXJzZXIuRWxlbWVudERlY2xIYW5kbGVyID0gc2VsZi5lbGVtZW50X2RlY2xfaGFuZGxlcgorICAgICAgICBwYXJzZXIuQXR0bGlzdERlY2xIYW5kbGVyID0gc2VsZi5hdHRsaXN0X2RlY2xfaGFuZGxlcgorCisgICAgZGVmIHBhcnNlRmlsZShzZWxmLCBmaWxlKToKKyAgICAgICAgIiIiUGFyc2UgYSBkb2N1bWVudCBmcm9tIGEgZmlsZSBvYmplY3QsIHJldHVybmluZyB0aGUgZG9jdW1lbnQKKyAgICAgICAgbm9kZS4iIiIKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIoKQorICAgICAgICBmaXJzdF9idWZmZXIgPSBUcnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgYnVmZmVyID0gZmlsZS5yZWFkKDE2KjEwMjQpCisgICAgICAgICAgICAgICAgaWYgbm90IGJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBwYXJzZXIuUGFyc2UoYnVmZmVyLCAwKQorICAgICAgICAgICAgICAgIGlmIGZpcnN0X2J1ZmZlciBhbmQgc2VsZi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NldHVwX3N1YnNldChidWZmZXIpCisgICAgICAgICAgICAgICAgZmlyc3RfYnVmZmVyID0gRmFsc2UKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZSgiIiwgVHJ1ZSkKKyAgICAgICAgZXhjZXB0IFBhcnNlRXNjYXBlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkb2MgPSBzZWxmLmRvY3VtZW50CisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLl9wYXJzZXIgPSBOb25lCisgICAgICAgIHJldHVybiBkb2MKKworICAgIGRlZiBwYXJzZVN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICAiIiJQYXJzZSBhIGRvY3VtZW50IGZyb20gYSBzdHJpbmcsIHJldHVybmluZyB0aGUgZG9jdW1lbnQgbm9kZS4iIiIKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIuUGFyc2Uoc3RyaW5nLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5fc2V0dXBfc3Vic2V0KHN0cmluZykKKyAgICAgICAgZXhjZXB0IFBhcnNlRXNjYXBlOgorICAgICAgICAgICAgcGFzcworICAgICAgICBkb2MgPSBzZWxmLmRvY3VtZW50CisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLl9wYXJzZXIgPSBOb25lCisgICAgICAgIHJldHVybiBkb2MKKworICAgIGRlZiBfc2V0dXBfc3Vic2V0KHNlbGYsIGJ1ZmZlcik6CisgICAgICAgICIiIkxvYWQgdGhlIGludGVybmFsIHN1YnNldCBpZiB0aGVyZSBtaWdodCBiZSBvbmUuIiIiCisgICAgICAgIGlmIHNlbGYuZG9jdW1lbnQuZG9jdHlwZToKKyAgICAgICAgICAgIGV4dHJhY3RvciA9IEludGVybmFsU3Vic2V0RXh0cmFjdG9yKCkKKyAgICAgICAgICAgIGV4dHJhY3Rvci5wYXJzZVN0cmluZyhidWZmZXIpCisgICAgICAgICAgICBzdWJzZXQgPSBleHRyYWN0b3IuZ2V0U3Vic2V0KCkKKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuZG9jdHlwZS5pbnRlcm5hbFN1YnNldCA9IHN1YnNldAorCisgICAgZGVmIHN0YXJ0X2RvY3R5cGVfZGVjbF9oYW5kbGVyKHNlbGYsIGRvY3R5cGVOYW1lLCBzeXN0ZW1JZCwgcHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19pbnRlcm5hbF9zdWJzZXQpOgorICAgICAgICBkb2N0eXBlID0gc2VsZi5kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudFR5cGUoCisgICAgICAgICAgICBkb2N0eXBlTmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKQorICAgICAgICBkb2N0eXBlLm93bmVyRG9jdW1lbnQgPSBzZWxmLmRvY3VtZW50CisgICAgICAgIF9hcHBlbmRfY2hpbGQoc2VsZi5kb2N1bWVudCwgZG9jdHlwZSkKKyAgICAgICAgc2VsZi5kb2N1bWVudC5kb2N0eXBlID0gZG9jdHlwZQorICAgICAgICBpZiBzZWxmLl9maWx0ZXIgYW5kIHNlbGYuX2ZpbHRlci5hY2NlcHROb2RlKGRvY3R5cGUpID09IEZJTFRFUl9SRUpFQ1Q6CisgICAgICAgICAgICBzZWxmLmRvY3VtZW50LmRvY3R5cGUgPSBOb25lCisgICAgICAgICAgICBkZWwgc2VsZi5kb2N1bWVudC5jaGlsZE5vZGVzWy0xXQorICAgICAgICAgICAgZG9jdHlwZSA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5FbnRpdHlEZWNsSGFuZGxlciA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5Ob3RhdGlvbkRlY2xIYW5kbGVyID0gTm9uZQorICAgICAgICBpZiBoYXNfaW50ZXJuYWxfc3Vic2V0OgorICAgICAgICAgICAgaWYgZG9jdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBkb2N0eXBlLmVudGl0aWVzLl9zZXEgPSBbXQorICAgICAgICAgICAgICAgIGRvY3R5cGUubm90YXRpb25zLl9zZXEgPSBbXQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLkNvbW1lbnRIYW5kbGVyID0gTm9uZQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBOb25lCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuRW5kRG9jdHlwZURlY2xIYW5kbGVyID0gc2VsZi5lbmRfZG9jdHlwZV9kZWNsX2hhbmRsZXIKKworICAgIGRlZiBlbmRfZG9jdHlwZV9kZWNsX2hhbmRsZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX29wdGlvbnMuY29tbWVudHM6CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuQ29tbWVudEhhbmRsZXIgPSBzZWxmLmNvbW1lbnRfaGFuZGxlcgorICAgICAgICBzZWxmLl9wYXJzZXIuUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciA9IHNlbGYucGlfaGFuZGxlcgorICAgICAgICBpZiBub3QgKHNlbGYuX2VsZW1faW5mbyBvciBzZWxmLl9maWx0ZXIpOgorICAgICAgICAgICAgc2VsZi5fZmluaXNoX2VuZF9lbGVtZW50ID0gaWQKKworICAgIGRlZiBwaV9oYW5kbGVyKHNlbGYsIHRhcmdldCwgZGF0YSk6CisgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpCisgICAgICAgIF9hcHBlbmRfY2hpbGQoc2VsZi5jdXJOb2RlLCBub2RlKQorICAgICAgICBpZiBzZWxmLl9maWx0ZXIgYW5kIHNlbGYuX2ZpbHRlci5hY2NlcHROb2RlKG5vZGUpID09IEZJTFRFUl9SRUpFQ1Q6CisgICAgICAgICAgICBzZWxmLmN1ck5vZGUucmVtb3ZlQ2hpbGQobm9kZSkKKworICAgIGRlZiBjaGFyYWN0ZXJfZGF0YV9oYW5kbGVyX2NkYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBjaGlsZE5vZGVzID0gc2VsZi5jdXJOb2RlLmNoaWxkTm9kZXMKKyAgICAgICAgaWYgc2VsZi5fY2RhdGE6CisgICAgICAgICAgICBpZiAoICBzZWxmLl9jZGF0YV9jb250aW51ZQorICAgICAgICAgICAgICAgICAgYW5kIGNoaWxkTm9kZXNbLTFdLm5vZGVUeXBlID09IENEQVRBX1NFQ1RJT05fTk9ERSk6CisgICAgICAgICAgICAgICAgY2hpbGROb2Rlc1stMV0uYXBwZW5kRGF0YShkYXRhKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlQ0RBVEFTZWN0aW9uKGRhdGEpCisgICAgICAgICAgICBzZWxmLl9jZGF0YV9jb250aW51ZSA9IFRydWUKKyAgICAgICAgZWxpZiBjaGlsZE5vZGVzIGFuZCBjaGlsZE5vZGVzWy0xXS5ub2RlVHlwZSA9PSBURVhUX05PREU6CisgICAgICAgICAgICBub2RlID0gY2hpbGROb2Rlc1stMV0KKyAgICAgICAgICAgIHZhbHVlID0gbm9kZS5kYXRhICsgZGF0YQorICAgICAgICAgICAgZCA9IG5vZGUuX19kaWN0X18KKyAgICAgICAgICAgIGRbJ2RhdGEnXSA9IGRbJ25vZGVWYWx1ZSddID0gdmFsdWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm9kZSA9IG1pbmlkb20uVGV4dCgpCisgICAgICAgICAgICBkID0gbm9kZS5fX2RpY3RfXworICAgICAgICAgICAgZFsnZGF0YSddID0gZFsnbm9kZVZhbHVlJ10gPSBkYXRhCisgICAgICAgICAgICBkWydvd25lckRvY3VtZW50J10gPSBzZWxmLmRvY3VtZW50CisgICAgICAgIF9hcHBlbmRfY2hpbGQoc2VsZi5jdXJOb2RlLCBub2RlKQorCisgICAgZGVmIGNoYXJhY3Rlcl9kYXRhX2hhbmRsZXIoc2VsZiwgZGF0YSk6CisgICAgICAgIGNoaWxkTm9kZXMgPSBzZWxmLmN1ck5vZGUuY2hpbGROb2RlcworICAgICAgICBpZiBjaGlsZE5vZGVzIGFuZCBjaGlsZE5vZGVzWy0xXS5ub2RlVHlwZSA9PSBURVhUX05PREU6CisgICAgICAgICAgICBub2RlID0gY2hpbGROb2Rlc1stMV0KKyAgICAgICAgICAgIGQgPSBub2RlLl9fZGljdF9fCisgICAgICAgICAgICBkWydkYXRhJ10gPSBkWydub2RlVmFsdWUnXSA9IG5vZGUuZGF0YSArIGRhdGEKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBub2RlID0gbWluaWRvbS5UZXh0KCkKKyAgICAgICAgZCA9IG5vZGUuX19kaWN0X18KKyAgICAgICAgZFsnZGF0YSddID0gZFsnbm9kZVZhbHVlJ10gPSBub2RlLmRhdGEgKyBkYXRhCisgICAgICAgIGRbJ293bmVyRG9jdW1lbnQnXSA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLmN1ck5vZGUsIG5vZGUpCisKKyAgICBkZWYgZW50aXR5X2RlY2xfaGFuZGxlcihzZWxmLCBlbnRpdHlOYW1lLCBpc19wYXJhbWV0ZXJfZW50aXR5LCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBzeXN0ZW1JZCwgcHVibGljSWQsIG5vdGF0aW9uTmFtZSk6CisgICAgICAgIGlmIGlzX3BhcmFtZXRlcl9lbnRpdHk6CisgICAgICAgICAgICAjIHdlIGRvbid0IGNhcmUgYWJvdXQgcGFyYW1ldGVyIGVudGl0aWVzIGZvciB0aGUgRE9NCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHNlbGYuX29wdGlvbnMuZW50aXRpZXM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuX2NyZWF0ZV9lbnRpdHkoZW50aXR5TmFtZSwgcHVibGljSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbUlkLCBub3RhdGlvbk5hbWUpCisgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBpbnRlcm5hbCBlbnRpdHkKKyAgICAgICAgICAgICMgbm9kZSAqc2hvdWxkKiBiZSByZWFkb25seSwgYnV0IHdlJ2xsIGNoZWF0CisgICAgICAgICAgICBjaGlsZCA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsdWUpCisgICAgICAgICAgICBub2RlLmNoaWxkTm9kZXMuYXBwZW5kKGNoaWxkKQorICAgICAgICBzZWxmLmRvY3VtZW50LmRvY3R5cGUuZW50aXRpZXMuX3NlcS5hcHBlbmQobm9kZSkKKyAgICAgICAgaWYgc2VsZi5fZmlsdGVyIGFuZCBzZWxmLl9maWx0ZXIuYWNjZXB0Tm9kZShub2RlKSA9PSBGSUxURVJfUkVKRUNUOgorICAgICAgICAgICAgZGVsIHNlbGYuZG9jdW1lbnQuZG9jdHlwZS5lbnRpdGllcy5fc2VxWy0xXQorCisgICAgZGVmIG5vdGF0aW9uX2RlY2xfaGFuZGxlcihzZWxmLCBub3RhdGlvbk5hbWUsIGJhc2UsIHN5c3RlbUlkLCBwdWJsaWNJZCk6CisgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50Ll9jcmVhdGVfbm90YXRpb24obm90YXRpb25OYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpCisgICAgICAgIHNlbGYuZG9jdW1lbnQuZG9jdHlwZS5ub3RhdGlvbnMuX3NlcS5hcHBlbmQobm9kZSkKKyAgICAgICAgaWYgc2VsZi5fZmlsdGVyIGFuZCBzZWxmLl9maWx0ZXIuYWNjZXB0Tm9kZShub2RlKSA9PSBGSUxURVJfQUNDRVBUOgorICAgICAgICAgICAgZGVsIHNlbGYuZG9jdW1lbnQuZG9jdHlwZS5ub3RhdGlvbnMuX3NlcVstMV0KKworICAgIGRlZiBjb21tZW50X2hhbmRsZXIoc2VsZiwgZGF0YSk6CisgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZGF0YSkKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLmN1ck5vZGUsIG5vZGUpCisgICAgICAgIGlmIHNlbGYuX2ZpbHRlciBhbmQgc2VsZi5fZmlsdGVyLmFjY2VwdE5vZGUobm9kZSkgPT0gRklMVEVSX1JFSkVDVDoKKyAgICAgICAgICAgIHNlbGYuY3VyTm9kZS5yZW1vdmVDaGlsZChub2RlKQorCisgICAgZGVmIHN0YXJ0X2NkYXRhX3NlY3Rpb25faGFuZGxlcihzZWxmKToKKyAgICAgICAgc2VsZi5fY2RhdGEgPSBUcnVlCisgICAgICAgIHNlbGYuX2NkYXRhX2NvbnRpbnVlID0gRmFsc2UKKworICAgIGRlZiBlbmRfY2RhdGFfc2VjdGlvbl9oYW5kbGVyKHNlbGYpOgorICAgICAgICBzZWxmLl9jZGF0YSA9IEZhbHNlCisgICAgICAgIHNlbGYuX2NkYXRhX2NvbnRpbnVlID0gRmFsc2UKKworICAgIGRlZiBleHRlcm5hbF9lbnRpdHlfcmVmX2hhbmRsZXIoc2VsZiwgY29udGV4dCwgYmFzZSwgc3lzdGVtSWQsIHB1YmxpY0lkKToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBmaXJzdF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgbmFtZSwgYXR0cmlidXRlcyk6CisgICAgICAgIGlmIHNlbGYuX2ZpbHRlciBpcyBOb25lIGFuZCBub3Qgc2VsZi5fZWxlbV9pbmZvOgorICAgICAgICAgICAgc2VsZi5fZmluaXNoX2VuZF9lbGVtZW50ID0gaWQKKyAgICAgICAgc2VsZi5nZXRQYXJzZXIoKS5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5zdGFydF9lbGVtZW50X2hhbmRsZXIKKyAgICAgICAgc2VsZi5zdGFydF9lbGVtZW50X2hhbmRsZXIobmFtZSwgYXR0cmlidXRlcykKKworICAgIGRlZiBzdGFydF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgbmFtZSwgYXR0cmlidXRlcyk6CisgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLmN1ck5vZGUsIG5vZGUpCisgICAgICAgIHNlbGYuY3VyTm9kZSA9IG5vZGUKKworICAgICAgICBpZiBhdHRyaWJ1dGVzOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGF0dHJpYnV0ZXMpLCAyKToKKyAgICAgICAgICAgICAgICBhID0gbWluaWRvbS5BdHRyKGF0dHJpYnV0ZXNbaV0sIEVNUFRZX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUsIEVNUFRZX1BSRUZJWCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXNbaSsxXQorICAgICAgICAgICAgICAgIGQgPSBhLmNoaWxkTm9kZXNbMF0uX19kaWN0X18KKyAgICAgICAgICAgICAgICBkWydkYXRhJ10gPSBkWydub2RlVmFsdWUnXSA9IHZhbHVlCisgICAgICAgICAgICAgICAgZCA9IGEuX19kaWN0X18KKyAgICAgICAgICAgICAgICBkWyd2YWx1ZSddID0gZFsnbm9kZVZhbHVlJ10gPSB2YWx1ZQorICAgICAgICAgICAgICAgIGRbJ293bmVyRG9jdW1lbnQnXSA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgICAgICAgICBfc2V0X2F0dHJpYnV0ZV9ub2RlKG5vZGUsIGEpCisKKyAgICAgICAgaWYgbm9kZSBpcyBub3Qgc2VsZi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6CisgICAgICAgICAgICBzZWxmLl9maW5pc2hfc3RhcnRfZWxlbWVudChub2RlKQorCisgICAgZGVmIF9maW5pc2hfc3RhcnRfZWxlbWVudChzZWxmLCBub2RlKToKKyAgICAgICAgaWYgc2VsZi5fZmlsdGVyOgorICAgICAgICAgICAgIyBUbyBiZSBnZW5lcmFsLCB3ZSdkIGhhdmUgdG8gY2FsbCBpc1NhbWVOb2RlKCksIGJ1dCB0aGlzCisgICAgICAgICAgICAjIGlzIHN1ZmZpY2llbnQgZm9yIG1pbmlkb206CisgICAgICAgICAgICBpZiBub2RlIGlzIHNlbGYuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZmlsdCA9IHNlbGYuX2ZpbHRlci5zdGFydENvbnRhaW5lcihub2RlKQorICAgICAgICAgICAgaWYgZmlsdCA9PSBGSUxURVJfUkVKRUNUOgorICAgICAgICAgICAgICAgICMgaWdub3JlIHRoaXMgbm9kZSAmIGFsbCBkZXNjZW5kZW50cworICAgICAgICAgICAgICAgIFJlamVjdGVyKHNlbGYpCisgICAgICAgICAgICBlbGlmIGZpbHQgPT0gRklMVEVSX1NLSVA6CisgICAgICAgICAgICAgICAgIyBpZ25vcmUgdGhpcyBub2RlLCBidXQgbWFrZSBpdCdzIGNoaWxkcmVuIGJlY29tZQorICAgICAgICAgICAgICAgICMgY2hpbGRyZW4gb2YgdGhlIHBhcmVudCBub2RlCisgICAgICAgICAgICAgICAgU2tpcHBlcihzZWxmKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuY3VyTm9kZSA9IG5vZGUucGFyZW50Tm9kZQorICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpCisgICAgICAgICAgICBub2RlLnVubGluaygpCisKKyAgICAjIElmIHRoaXMgZXZlciBjaGFuZ2VzLCBOYW1lc3BhY2VzLmVuZF9lbGVtZW50X2hhbmRsZXIoKSBuZWVkcyB0bworICAgICMgYmUgY2hhbmdlZCB0byBtYXRjaC4KKyAgICAjCisgICAgZGVmIGVuZF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgbmFtZSk6CisgICAgICAgIGN1ck5vZGUgPSBzZWxmLmN1ck5vZGUKKyAgICAgICAgc2VsZi5jdXJOb2RlID0gY3VyTm9kZS5wYXJlbnROb2RlCisgICAgICAgIHNlbGYuX2ZpbmlzaF9lbmRfZWxlbWVudChjdXJOb2RlKQorCisgICAgZGVmIF9maW5pc2hfZW5kX2VsZW1lbnQoc2VsZiwgY3VyTm9kZSk6CisgICAgICAgIGluZm8gPSBzZWxmLl9lbGVtX2luZm8uZ2V0KGN1ck5vZGUudGFnTmFtZSkKKyAgICAgICAgaWYgaW5mbzoKKyAgICAgICAgICAgIHNlbGYuX2hhbmRsZV93aGl0ZV90ZXh0X25vZGVzKGN1ck5vZGUsIGluZm8pCisgICAgICAgIGlmIHNlbGYuX2ZpbHRlcjoKKyAgICAgICAgICAgIGlmIGN1ck5vZGUgaXMgc2VsZi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBzZWxmLl9maWx0ZXIuYWNjZXB0Tm9kZShjdXJOb2RlKSA9PSBGSUxURVJfUkVKRUNUOgorICAgICAgICAgICAgICAgIHNlbGYuY3VyTm9kZS5yZW1vdmVDaGlsZChjdXJOb2RlKQorICAgICAgICAgICAgICAgIGN1ck5vZGUudW5saW5rKCkKKworICAgIGRlZiBfaGFuZGxlX3doaXRlX3RleHRfbm9kZXMoc2VsZiwgbm9kZSwgaW5mbyk6CisgICAgICAgIGlmIChzZWxmLl9vcHRpb25zLndoaXRlc3BhY2VfaW5fZWxlbWVudF9jb250ZW50CisgICAgICAgICAgICBvciBub3QgaW5mby5pc0VsZW1lbnRDb250ZW50KCkpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBXZSBoYXZlIGVsZW1lbnQgdHlwZSBpbmZvcm1hdGlvbiBhbmQgc2hvdWxkIHJlbW92ZSBpZ25vcmFibGUKKyAgICAgICAgIyB3aGl0ZXNwYWNlOyBpZGVudGlmeSBmb3IgdGV4dCBub2RlcyB3aGljaCBjb250YWluIG9ubHkKKyAgICAgICAgIyB3aGl0ZXNwYWNlLgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IFRFWFRfTk9ERSBhbmQgbm90IGNoaWxkLmRhdGEuc3RyaXAoKToKKyAgICAgICAgICAgICAgICBMLmFwcGVuZChjaGlsZCkKKworICAgICAgICAjIFJlbW92ZSBpZ25vcmFibGUgd2hpdGVzcGFjZSBmcm9tIHRoZSB0cmVlLgorICAgICAgICBmb3IgY2hpbGQgaW4gTDoKKyAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpCisKKyAgICBkZWYgZWxlbWVudF9kZWNsX2hhbmRsZXIoc2VsZiwgbmFtZSwgbW9kZWwpOgorICAgICAgICBpbmZvID0gc2VsZi5fZWxlbV9pbmZvLmdldChuYW1lKQorICAgICAgICBpZiBpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLl9lbGVtX2luZm9bbmFtZV0gPSBFbGVtZW50SW5mbyhuYW1lLCBtb2RlbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGFzc2VydCBpbmZvLl9tb2RlbCBpcyBOb25lCisgICAgICAgICAgICBpbmZvLl9tb2RlbCA9IG1vZGVsCisKKyAgICBkZWYgYXR0bGlzdF9kZWNsX2hhbmRsZXIoc2VsZiwgZWxlbSwgbmFtZSwgdHlwZSwgZGVmYXVsdCwgcmVxdWlyZWQpOgorICAgICAgICBpbmZvID0gc2VsZi5fZWxlbV9pbmZvLmdldChlbGVtKQorICAgICAgICBpZiBpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICBpbmZvID0gRWxlbWVudEluZm8oZWxlbSkKKyAgICAgICAgICAgIHNlbGYuX2VsZW1faW5mb1tlbGVtXSA9IGluZm8KKyAgICAgICAgaW5mby5fYXR0cl9pbmZvLmFwcGVuZCgKKyAgICAgICAgICAgIFtOb25lLCBuYW1lLCBOb25lLCBOb25lLCBkZWZhdWx0LCAwLCB0eXBlLCByZXF1aXJlZF0pCisKKyAgICBkZWYgeG1sX2RlY2xfaGFuZGxlcihzZWxmLCB2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSk6CisgICAgICAgIHNlbGYuZG9jdW1lbnQudmVyc2lvbiA9IHZlcnNpb24KKyAgICAgICAgc2VsZi5kb2N1bWVudC5lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgICMgVGhpcyBpcyBzdGlsbCBhIGxpdHRsZSB1Z2x5LCB0aGFua3MgdG8gdGhlIHB5ZXhwYXQgQVBJLiA7LSgKKyAgICAgICAgaWYgc3RhbmRhbG9uZSA+PSAwOgorICAgICAgICAgICAgaWYgc3RhbmRhbG9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmRvY3VtZW50LnN0YW5kYWxvbmUgPSBUcnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQuc3RhbmRhbG9uZSA9IEZhbHNlCisKKworIyBEb24ndCBpbmNsdWRlIEZJTFRFUl9JTlRFUlJVUFQsIHNpbmNlIHRoYXQncyBjaGVja2VkIHNlcGFyYXRlbHkKKyMgd2hlcmUgYWxsb3dlZC4KK19BTExPV0VEX0ZJTFRFUl9SRVRVUk5TID0gKEZJTFRFUl9BQ0NFUFQsIEZJTFRFUl9SRUpFQ1QsIEZJTFRFUl9TS0lQKQorCitjbGFzcyBGaWx0ZXJWaXNpYmlsaXR5Q29udHJvbGxlcihvYmplY3QpOgorICAgICIiIldyYXBwZXIgYXJvdW5kIGEgRE9NQnVpbGRlckZpbHRlciB3aGljaCBpbXBsZW1lbnRzIHRoZSBjaGVja3MKKyAgICB0byBtYWtlIHRoZSB3aGF0VG9TaG93IGZpbHRlciBhdHRyaWJ1dGUgd29yay4iIiIKKworICAgIF9fc2xvdHNfXyA9ICdmaWx0ZXInLAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbHRlcik6CisgICAgICAgIHNlbGYuZmlsdGVyID0gZmlsdGVyCisKKyAgICBkZWYgc3RhcnRDb250YWluZXIoc2VsZiwgbm9kZSk6CisgICAgICAgIG1hc2sgPSBzZWxmLl9ub2RldHlwZV9tYXNrW25vZGUubm9kZVR5cGVdCisgICAgICAgIGlmIHNlbGYuZmlsdGVyLndoYXRUb1Nob3cgJiBtYXNrOgorICAgICAgICAgICAgdmFsID0gc2VsZi5maWx0ZXIuc3RhcnRDb250YWluZXIobm9kZSkKKyAgICAgICAgICAgIGlmIHZhbCA9PSBGSUxURVJfSU5URVJSVVBUOgorICAgICAgICAgICAgICAgIHJhaXNlIFBhcnNlRXNjYXBlCisgICAgICAgICAgICBpZiB2YWwgbm90IGluIF9BTExPV0VEX0ZJTFRFUl9SRVRVUk5TOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICAgICAic3RhcnRDb250YWluZXIoKSByZXR1cm5lZCBpbGxlZ2FsIHZhbHVlOiAiICsgcmVwcih2YWwpCisgICAgICAgICAgICByZXR1cm4gdmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRklMVEVSX0FDQ0VQVAorCisgICAgZGVmIGFjY2VwdE5vZGUoc2VsZiwgbm9kZSk6CisgICAgICAgIG1hc2sgPSBzZWxmLl9ub2RldHlwZV9tYXNrW25vZGUubm9kZVR5cGVdCisgICAgICAgIGlmIHNlbGYuZmlsdGVyLndoYXRUb1Nob3cgJiBtYXNrOgorICAgICAgICAgICAgdmFsID0gc2VsZi5maWx0ZXIuYWNjZXB0Tm9kZShub2RlKQorICAgICAgICAgICAgaWYgdmFsID09IEZJTFRFUl9JTlRFUlJVUFQ6CisgICAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFc2NhcGUKKyAgICAgICAgICAgIGlmIHZhbCA9PSBGSUxURVJfU0tJUDoKKyAgICAgICAgICAgICAgICAjIG1vdmUgYWxsIGNoaWxkIG5vZGVzIHRvIHRoZSBwYXJlbnQsIGFuZCByZW1vdmUgdGhpcyBub2RlCisgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlCisgICAgICAgICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2Rlc1s6XToKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkKQorICAgICAgICAgICAgICAgICMgbm9kZSBpcyBoYW5kbGVkIGJ5IHRoZSBjYWxsZXIKKyAgICAgICAgICAgICAgICByZXR1cm4gRklMVEVSX1JFSkVDVAorICAgICAgICAgICAgaWYgdmFsIG5vdCBpbiBfQUxMT1dFRF9GSUxURVJfUkVUVVJOUzoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAgICAgImFjY2VwdE5vZGUoKSByZXR1cm5lZCBpbGxlZ2FsIHZhbHVlOiAiICsgcmVwcih2YWwpCisgICAgICAgICAgICByZXR1cm4gdmFsCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRklMVEVSX0FDQ0VQVAorCisgICAgX25vZGV0eXBlX21hc2sgPSB7CisgICAgICAgIE5vZGUuRUxFTUVOVF9OT0RFOiAgICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwKKyAgICAgICAgTm9kZS5BVFRSSUJVVEVfTk9ERTogICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19BVFRSSUJVVEUsCisgICAgICAgIE5vZGUuVEVYVF9OT0RFOiAgICAgICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfVEVYVCwKKyAgICAgICAgTm9kZS5DREFUQV9TRUNUSU9OX05PREU6ICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19DREFUQV9TRUNUSU9OLAorICAgICAgICBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTogICAgICAgTm9kZUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0UsCisgICAgICAgIE5vZGUuRU5USVRZX05PREU6ICAgICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRU5USVRZLAorICAgICAgICBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERTogTm9kZUZpbHRlci5TSE9XX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04sCisgICAgICAgIE5vZGUuQ09NTUVOVF9OT0RFOiAgICAgICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfQ09NTUVOVCwKKyAgICAgICAgTm9kZS5ET0NVTUVOVF9OT0RFOiAgICAgICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCwKKyAgICAgICAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6ICAgICAgICAgIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVF9UWVBFLAorICAgICAgICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6ICAgICAgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5ULAorICAgICAgICBOb2RlLk5PVEFUSU9OX05PREU6ICAgICAgICAgICAgICAgTm9kZUZpbHRlci5TSE9XX05PVEFUSU9OLAorICAgICAgICB9CisKKworY2xhc3MgRmlsdGVyQ3J1dGNoKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ19idWlsZGVyJywgJ19sZXZlbCcsICdfb2xkX3N0YXJ0JywgJ19vbGRfZW5kJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBzZWxmLl9sZXZlbCA9IDAKKyAgICAgICAgc2VsZi5fYnVpbGRlciA9IGJ1aWxkZXIKKyAgICAgICAgcGFyc2VyID0gYnVpbGRlci5fcGFyc2VyCisgICAgICAgIHNlbGYuX29sZF9zdGFydCA9IHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyCisgICAgICAgIHNlbGYuX29sZF9lbmQgPSBwYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIKKyAgICAgICAgcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLnN0YXJ0X2VsZW1lbnRfaGFuZGxlcgorICAgICAgICBwYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBzZWxmLmVuZF9lbGVtZW50X2hhbmRsZXIKKworY2xhc3MgUmVqZWN0ZXIoRmlsdGVyQ3J1dGNoKToKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBGaWx0ZXJDcnV0Y2guX19pbml0X18oc2VsZiwgYnVpbGRlcikKKyAgICAgICAgcGFyc2VyID0gYnVpbGRlci5fcGFyc2VyCisgICAgICAgIGZvciBuYW1lIGluICgiUHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICAiQ29tbWVudEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIkNoYXJhY3RlckRhdGFIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICJTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIkVuZENkYXRhU2VjdGlvbkhhbmRsZXIiLAorICAgICAgICAgICAgICAgICAgICAgIkV4dGVybmFsRW50aXR5UmVmSGFuZGxlciIsCisgICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgc2V0YXR0cihwYXJzZXIsIG5hbWUsIE5vbmUpCisKKyAgICBkZWYgc3RhcnRfZWxlbWVudF9oYW5kbGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fbGV2ZWwgPSBzZWxmLl9sZXZlbCArIDEKKworICAgIGRlZiBlbmRfZWxlbWVudF9oYW5kbGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5fbGV2ZWwgPT0gMDoKKyAgICAgICAgICAgICMgcmVzdG9yZSB0aGUgb2xkIGhhbmRsZXJzCisgICAgICAgICAgICBwYXJzZXIgPSBzZWxmLl9idWlsZGVyLl9wYXJzZXIKKyAgICAgICAgICAgIHNlbGYuX2J1aWxkZXIuaW5zdGFsbChwYXJzZXIpCisgICAgICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuX29sZF9zdGFydAorICAgICAgICAgICAgcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5fb2xkX2VuZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fbGV2ZWwgPSBzZWxmLl9sZXZlbCAtIDEKKworY2xhc3MgU2tpcHBlcihGaWx0ZXJDcnV0Y2gpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgc3RhcnRfZWxlbWVudF9oYW5kbGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgbm9kZSA9IHNlbGYuX2J1aWxkZXIuY3VyTm9kZQorICAgICAgICBzZWxmLl9vbGRfc3RhcnQoKmFyZ3MpCisgICAgICAgIGlmIHNlbGYuX2J1aWxkZXIuY3VyTm9kZSBpcyBub3Qgbm9kZToKKyAgICAgICAgICAgIHNlbGYuX2xldmVsID0gc2VsZi5fbGV2ZWwgKyAxCisKKyAgICBkZWYgZW5kX2VsZW1lbnRfaGFuZGxlcihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuX2xldmVsID09IDA6CisgICAgICAgICAgICAjIFdlJ3JlIHBvcHBpbmcgYmFjayBvdXQgb2YgdGhlIG5vZGUgd2UncmUgc2tpcHBpbmcsIHNvIHdlCisgICAgICAgICAgICAjIHNob3VsZG4ndCBuZWVkIHRvIGRvIGFueXRoaW5nIGJ1dCByZXNldCB0aGUgaGFuZGxlcnMuCisgICAgICAgICAgICBzZWxmLl9idWlsZGVyLl9wYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuX29sZF9zdGFydAorICAgICAgICAgICAgc2VsZi5fYnVpbGRlci5fcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5fb2xkX2VuZAorICAgICAgICAgICAgc2VsZi5fYnVpbGRlciA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2xldmVsID0gc2VsZi5fbGV2ZWwgLSAxCisgICAgICAgICAgICBzZWxmLl9vbGRfZW5kKCphcmdzKQorCisKKyMgZnJhbWV3b3JrIGRvY3VtZW50IHVzZWQgYnkgdGhlIGZyYWdtZW50IGJ1aWxkZXIuCisjIFRha2VzIGEgc3RyaW5nIGZvciB0aGUgZG9jdHlwZSwgc3Vic2V0IHN0cmluZywgYW5kIG5hbWVzcGFjZSBhdHRycyBzdHJpbmcuCisKK19GUkFHTUVOVF9CVUlMREVSX0lOVEVSTkFMX1NZU1RFTV9JRCA9IFwKKyAgICAiaHR0cDovL3htbC5weXRob24ub3JnL2VudGl0aWVzL2ZyYWdtZW50LWJ1aWxkZXIvaW50ZXJuYWwiCisKK19GUkFHTUVOVF9CVUlMREVSX1RFTVBMQVRFID0gKAorICAgICcnJ1wKKzwhRE9DVFlQRSB3cmFwcGVyCisgICUlcyBbCisgIDwhRU5USVRZIGZyYWdtZW50LWJ1aWxkZXItaW50ZXJuYWwKKyAgICBTWVNURU0gIiVzIj4KKyUlcworXT4KKzx3cmFwcGVyICUlcworPiZmcmFnbWVudC1idWlsZGVyLWludGVybmFsOzwvd3JhcHBlcj4nJycKKyAgICAlIF9GUkFHTUVOVF9CVUlMREVSX0lOVEVSTkFMX1NZU1RFTV9JRCkKKworCitjbGFzcyBGcmFnbWVudEJ1aWxkZXIoRXhwYXRCdWlsZGVyKToKKyAgICAiIiJCdWlsZGVyIHdoaWNoIGNvbnN0cnVjdHMgZG9jdW1lbnQgZnJhZ21lbnRzIGdpdmVuIFhNTCBzb3VyY2UKKyAgICB0ZXh0IGFuZCBhIGNvbnRleHQgbm9kZS4KKworICAgIFRoZSBjb250ZXh0IG5vZGUgaXMgZXhwZWN0ZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUKKyAgICBuYW1lc3BhY2UgZGVjbGFyYXRpb25zIHdoaWNoIGFyZSBpbiBzY29wZSBhdCB0aGUgc3RhcnQgb2YgdGhlCisgICAgZnJhZ21lbnQuCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY29udGV4dCwgb3B0aW9ucz1Ob25lKToKKyAgICAgICAgaWYgY29udGV4dC5ub2RlVHlwZSA9PSBET0NVTUVOVF9OT0RFOgorICAgICAgICAgICAgc2VsZi5vcmlnaW5hbERvY3VtZW50ID0gY29udGV4dAorICAgICAgICAgICAgc2VsZi5jb250ZXh0ID0gY29udGV4dAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vcmlnaW5hbERvY3VtZW50ID0gY29udGV4dC5vd25lckRvY3VtZW50CisgICAgICAgICAgICBzZWxmLmNvbnRleHQgPSBjb250ZXh0CisgICAgICAgIEV4cGF0QnVpbGRlci5fX2luaXRfXyhzZWxmLCBvcHRpb25zKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBFeHBhdEJ1aWxkZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5mcmFnbWVudCA9IE5vbmUKKworICAgIGRlZiBwYXJzZUZpbGUoc2VsZiwgZmlsZSk6CisgICAgICAgICIiIlBhcnNlIGEgZG9jdW1lbnQgZnJhZ21lbnQgZnJvbSBhIGZpbGUgb2JqZWN0LCByZXR1cm5pbmcgdGhlCisgICAgICAgIGZyYWdtZW50IG5vZGUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLnBhcnNlU3RyaW5nKGZpbGUucmVhZCgpKQorCisgICAgZGVmIHBhcnNlU3RyaW5nKHNlbGYsIHN0cmluZyk6CisgICAgICAgICIiIlBhcnNlIGEgZG9jdW1lbnQgZnJhZ21lbnQgZnJvbSBhIHN0cmluZywgcmV0dXJuaW5nIHRoZQorICAgICAgICBmcmFnbWVudCBub2RlLiIiIgorICAgICAgICBzZWxmLl9zb3VyY2UgPSBzdHJpbmcKKyAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIoKQorICAgICAgICBkb2N0eXBlID0gc2VsZi5vcmlnaW5hbERvY3VtZW50LmRvY3R5cGUKKyAgICAgICAgaWRlbnQgPSAiIgorICAgICAgICBpZiBkb2N0eXBlOgorICAgICAgICAgICAgc3Vic2V0ID0gZG9jdHlwZS5pbnRlcm5hbFN1YnNldCBvciBzZWxmLl9nZXREZWNsYXJhdGlvbnMoKQorICAgICAgICAgICAgaWYgZG9jdHlwZS5wdWJsaWNJZDoKKyAgICAgICAgICAgICAgICBpZGVudCA9ICgnUFVCTElDICIlcyIgIiVzIicKKyAgICAgICAgICAgICAgICAgICAgICAgICAlIChkb2N0eXBlLnB1YmxpY0lkLCBkb2N0eXBlLnN5c3RlbUlkKSkKKyAgICAgICAgICAgIGVsaWYgZG9jdHlwZS5zeXN0ZW1JZDoKKyAgICAgICAgICAgICAgICBpZGVudCA9ICdTWVNURU0gIiVzIicgJSBkb2N0eXBlLnN5c3RlbUlkCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWJzZXQgPSAiIgorICAgICAgICBuc2F0dHJzID0gc2VsZi5fZ2V0TlNhdHRycygpICMgZ2V0IG5zIGRlY2xzIGZyb20gbm9kZSdzIGFuY2VzdG9ycworICAgICAgICBkb2N1bWVudCA9IF9GUkFHTUVOVF9CVUlMREVSX1RFTVBMQVRFICUgKGlkZW50LCBzdWJzZXQsIG5zYXR0cnMpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBhcnNlci5QYXJzZShkb2N1bWVudCwgMSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgICAgICByYWlzZQorICAgICAgICBmcmFnbWVudCA9IHNlbGYuZnJhZ21lbnQKKyAgICAgICAgc2VsZi5yZXNldCgpCisjIyAgICAgICAgIHNlbGYuX3BhcnNlciA9IE5vbmUKKyAgICAgICAgcmV0dXJuIGZyYWdtZW50CisKKyAgICBkZWYgX2dldERlY2xhcmF0aW9ucyhzZWxmKToKKyAgICAgICAgIiIiUmUtY3JlYXRlIHRoZSBpbnRlcm5hbCBzdWJzZXQgZnJvbSB0aGUgRG9jdW1lbnRUeXBlIG5vZGUuCisKKyAgICAgICAgVGhpcyBpcyBvbmx5IG5lZWRlZCBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgdGhlCisgICAgICAgIGludGVybmFsU3Vic2V0IGFzIGEgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgZG9jdHlwZSA9IHNlbGYuY29udGV4dC5vd25lckRvY3VtZW50LmRvY3R5cGUKKyAgICAgICAgcyA9ICIiCisgICAgICAgIGlmIGRvY3R5cGU6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShkb2N0eXBlLm5vdGF0aW9ucy5sZW5ndGgpOgorICAgICAgICAgICAgICAgIG5vdGF0aW9uID0gZG9jdHlwZS5ub3RhdGlvbnMuaXRlbShpKQorICAgICAgICAgICAgICAgIGlmIHM6CisgICAgICAgICAgICAgICAgICAgIHMgPSBzICsgIlxuICAiCisgICAgICAgICAgICAgICAgcyA9ICIlczwhTk9UQVRJT04gJXMiICUgKHMsIG5vdGF0aW9uLm5vZGVOYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdGF0aW9uLnB1YmxpY0lkOgorICAgICAgICAgICAgICAgICAgICBzID0gJyVzIFBVQkxJQyAiJXMiXG4gICAgICAgICAgICAgIiVzIj4nIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICUgKHMsIG5vdGF0aW9uLnB1YmxpY0lkLCBub3RhdGlvbi5zeXN0ZW1JZCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzID0gJyVzIFNZU1RFTSAiJXMiPicgJSAocywgbm90YXRpb24uc3lzdGVtSWQpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShkb2N0eXBlLmVudGl0aWVzLmxlbmd0aCk6CisgICAgICAgICAgICAgICAgZW50aXR5ID0gZG9jdHlwZS5lbnRpdGllcy5pdGVtKGkpCisgICAgICAgICAgICAgICAgaWYgczoKKyAgICAgICAgICAgICAgICAgICAgcyA9IHMgKyAiXG4gICIKKyAgICAgICAgICAgICAgICBzID0gIiVzPCFFTlRJVFkgJXMiICUgKHMsIGVudGl0eS5ub2RlTmFtZSkKKyAgICAgICAgICAgICAgICBpZiBlbnRpdHkucHVibGljSWQ6CisgICAgICAgICAgICAgICAgICAgIHMgPSAnJXMgUFVCTElDICIlcyJcbiAgICAgICAgICAgICAiJXMiJyBcCisgICAgICAgICAgICAgICAgICAgICAgICAlIChzLCBlbnRpdHkucHVibGljSWQsIGVudGl0eS5zeXN0ZW1JZCkKKyAgICAgICAgICAgICAgICBlbGlmIGVudGl0eS5zeXN0ZW1JZDoKKyAgICAgICAgICAgICAgICAgICAgcyA9ICclcyBTWVNURU0gIiVzIicgJSAocywgZW50aXR5LnN5c3RlbUlkKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHMgPSAnJXMgIiVzIicgJSAocywgZW50aXR5LmZpcnN0Q2hpbGQuZGF0YSkKKyAgICAgICAgICAgICAgICBpZiBlbnRpdHkubm90YXRpb25OYW1lOgorICAgICAgICAgICAgICAgICAgICBzID0gIiVzIE5PVEFUSU9OICVzIiAlIChzLCBlbnRpdHkubm90YXRpb25OYW1lKQorICAgICAgICAgICAgICAgIHMgPSBzICsgIj4iCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgX2dldE5TYXR0cnMoc2VsZik6CisgICAgICAgIHJldHVybiAiIgorCisgICAgZGVmIGV4dGVybmFsX2VudGl0eV9yZWZfaGFuZGxlcihzZWxmLCBjb250ZXh0LCBiYXNlLCBzeXN0ZW1JZCwgcHVibGljSWQpOgorICAgICAgICBpZiBzeXN0ZW1JZCA9PSBfRlJBR01FTlRfQlVJTERFUl9JTlRFUk5BTF9TWVNURU1fSUQ6CisgICAgICAgICAgICAjIHRoaXMgZW50cmVmIGlzIHRoZSBvbmUgdGhhdCB3ZSBtYWRlIHRvIHB1dCB0aGUgc3VidHJlZQorICAgICAgICAgICAgIyBpbjsgYWxsIG9mIG91ciBnaXZlbiBpbnB1dCBpcyBwYXJzZWQgaW4gaGVyZS4KKyAgICAgICAgICAgIG9sZF9kb2N1bWVudCA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgICAgIG9sZF9jdXJfbm9kZSA9IHNlbGYuY3VyTm9kZQorICAgICAgICAgICAgcGFyc2VyID0gc2VsZi5fcGFyc2VyLkV4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKGNvbnRleHQpCisgICAgICAgICAgICAjIHB1dCB0aGUgcmVhbCBkb2N1bWVudCBiYWNrLCBwYXJzZSBpbnRvIHRoZSBmcmFnbWVudCB0byByZXR1cm4KKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLm9yaWdpbmFsRG9jdW1lbnQKKyAgICAgICAgICAgIHNlbGYuZnJhZ21lbnQgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQorICAgICAgICAgICAgc2VsZi5jdXJOb2RlID0gc2VsZi5mcmFnbWVudAorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHBhcnNlci5QYXJzZShzZWxmLl9zb3VyY2UsIDEpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuY3VyTm9kZSA9IG9sZF9jdXJfbm9kZQorICAgICAgICAgICAgICAgIHNlbGYuZG9jdW1lbnQgPSBvbGRfZG9jdW1lbnQKKyAgICAgICAgICAgICAgICBzZWxmLl9zb3VyY2UgPSBOb25lCisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBFeHBhdEJ1aWxkZXIuZXh0ZXJuYWxfZW50aXR5X3JlZl9oYW5kbGVyKAorICAgICAgICAgICAgICAgIHNlbGYsIGNvbnRleHQsIGJhc2UsIHN5c3RlbUlkLCBwdWJsaWNJZCkKKworCitjbGFzcyBOYW1lc3BhY2VzOgorICAgICIiIk1peC1pbiBjbGFzcyBmb3IgYnVpbGRlcnM7IGFkZHMgc3VwcG9ydCBmb3IgbmFtZXNwYWNlcy4iIiIKKworICAgIGRlZiBfaW5pdE5hbWVzcGFjZXMoc2VsZik6CisgICAgICAgICMgbGlzdCBvZiAocHJlZml4LCB1cmkpIG5zIGRlY2xhcmF0aW9ucy4gIE5hbWVzcGFjZSBhdHRycyBhcmUKKyAgICAgICAgIyBjb25zdHJ1Y3RlZCBmcm9tIHRoaXMgYW5kIGFkZGVkIHRvIHRoZSBlbGVtZW50J3MgYXR0cnMuCisgICAgICAgIHNlbGYuX25zX29yZGVyZWRfcHJlZml4ZXMgPSBbXQorCisgICAgZGVmIGNyZWF0ZVBhcnNlcihzZWxmKToKKyAgICAgICAgIiIiQ3JlYXRlIGEgbmV3IG5hbWVzcGFjZS1oYW5kbGluZyBwYXJzZXIuIiIiCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShuYW1lc3BhY2Vfc2VwYXJhdG9yPSIgIikKKyAgICAgICAgcGFyc2VyLm5hbWVzcGFjZV9wcmVmaXhlcyA9IFRydWUKKyAgICAgICAgcmV0dXJuIHBhcnNlcgorCisgICAgZGVmIGluc3RhbGwoc2VsZiwgcGFyc2VyKToKKyAgICAgICAgIiIiSW5zZXJ0IHRoZSBuYW1lc3BhY2UtaGFuZGxlcnMgb250byB0aGUgcGFyc2VyLiIiIgorICAgICAgICBFeHBhdEJ1aWxkZXIuaW5zdGFsbChzZWxmLCBwYXJzZXIpCisgICAgICAgIGlmIHNlbGYuX29wdGlvbnMubmFtZXNwYWNlX2RlY2xhcmF0aW9uczoKKyAgICAgICAgICAgIHBhcnNlci5TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gKAorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRfbmFtZXNwYWNlX2RlY2xfaGFuZGxlcikKKworICAgIGRlZiBzdGFydF9uYW1lc3BhY2VfZGVjbF9oYW5kbGVyKHNlbGYsIHByZWZpeCwgdXJpKToKKyAgICAgICAgIiIiUHVzaCB0aGlzIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBvbiBvdXIgc3RvcmFnZS4iIiIKKyAgICAgICAgc2VsZi5fbnNfb3JkZXJlZF9wcmVmaXhlcy5hcHBlbmQoKHByZWZpeCwgdXJpKSkKKworICAgIGRlZiBzdGFydF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgbmFtZSwgYXR0cmlidXRlcyk6CisgICAgICAgIGlmICcgJyBpbiBuYW1lOgorICAgICAgICAgICAgdXJpLCBsb2NhbG5hbWUsIHByZWZpeCwgcW5hbWUgPSBfcGFyc2VfbnNfbmFtZShzZWxmLCBuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdXJpID0gRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICBxbmFtZSA9IG5hbWUKKyAgICAgICAgICAgIGxvY2FsbmFtZSA9IE5vbmUKKyAgICAgICAgICAgIHByZWZpeCA9IEVNUFRZX1BSRUZJWAorICAgICAgICBub2RlID0gbWluaWRvbS5FbGVtZW50KHFuYW1lLCB1cmksIHByZWZpeCwgbG9jYWxuYW1lKQorICAgICAgICBub2RlLm93bmVyRG9jdW1lbnQgPSBzZWxmLmRvY3VtZW50CisgICAgICAgIF9hcHBlbmRfY2hpbGQoc2VsZi5jdXJOb2RlLCBub2RlKQorICAgICAgICBzZWxmLmN1ck5vZGUgPSBub2RlCisKKyAgICAgICAgaWYgc2VsZi5fbnNfb3JkZXJlZF9wcmVmaXhlczoKKyAgICAgICAgICAgIGZvciBwcmVmaXgsIHVyaSBpbiBzZWxmLl9uc19vcmRlcmVkX3ByZWZpeGVzOgorICAgICAgICAgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgYSA9IG1pbmlkb20uQXR0cihfaW50ZXJuKHNlbGYsICd4bWxuczonICsgcHJlZml4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxOU19OQU1FU1BBQ0UsIHByZWZpeCwgInhtbG5zIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBhID0gbWluaWRvbS5BdHRyKCJ4bWxucyIsIFhNTE5TX05BTUVTUEFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieG1sbnMiLCBFTVBUWV9QUkVGSVgpCisgICAgICAgICAgICAgICAgZCA9IGEuY2hpbGROb2Rlc1swXS5fX2RpY3RfXworICAgICAgICAgICAgICAgIGRbJ2RhdGEnXSA9IGRbJ25vZGVWYWx1ZSddID0gdXJpCisgICAgICAgICAgICAgICAgZCA9IGEuX19kaWN0X18KKyAgICAgICAgICAgICAgICBkWyd2YWx1ZSddID0gZFsnbm9kZVZhbHVlJ10gPSB1cmkKKyAgICAgICAgICAgICAgICBkWydvd25lckRvY3VtZW50J10gPSBzZWxmLmRvY3VtZW50CisgICAgICAgICAgICAgICAgX3NldF9hdHRyaWJ1dGVfbm9kZShub2RlLCBhKQorICAgICAgICAgICAgZGVsIHNlbGYuX25zX29yZGVyZWRfcHJlZml4ZXNbOl0KKworICAgICAgICBpZiBhdHRyaWJ1dGVzOgorICAgICAgICAgICAgX2F0dHJzID0gbm9kZS5fYXR0cnMKKyAgICAgICAgICAgIF9hdHRyc05TID0gbm9kZS5fYXR0cnNOUworICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGF0dHJpYnV0ZXMpLCAyKToKKyAgICAgICAgICAgICAgICBhbmFtZSA9IGF0dHJpYnV0ZXNbaV0KKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGF0dHJpYnV0ZXNbaSsxXQorICAgICAgICAgICAgICAgIGlmICcgJyBpbiBhbmFtZToKKyAgICAgICAgICAgICAgICAgICAgdXJpLCBsb2NhbG5hbWUsIHByZWZpeCwgcW5hbWUgPSBfcGFyc2VfbnNfbmFtZShzZWxmLCBhbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgYSA9IG1pbmlkb20uQXR0cihxbmFtZSwgdXJpLCBsb2NhbG5hbWUsIHByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgX2F0dHJzW3FuYW1lXSA9IGEKKyAgICAgICAgICAgICAgICAgICAgX2F0dHJzTlNbKHVyaSwgbG9jYWxuYW1lKV0gPSBhCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYSA9IG1pbmlkb20uQXR0cihhbmFtZSwgRU1QVFlfTkFNRVNQQUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuYW1lLCBFTVBUWV9QUkVGSVgpCisgICAgICAgICAgICAgICAgICAgIF9hdHRyc1thbmFtZV0gPSBhCisgICAgICAgICAgICAgICAgICAgIF9hdHRyc05TWyhFTVBUWV9OQU1FU1BBQ0UsIGFuYW1lKV0gPSBhCisgICAgICAgICAgICAgICAgZCA9IGEuY2hpbGROb2Rlc1swXS5fX2RpY3RfXworICAgICAgICAgICAgICAgIGRbJ2RhdGEnXSA9IGRbJ25vZGVWYWx1ZSddID0gdmFsdWUKKyAgICAgICAgICAgICAgICBkID0gYS5fX2RpY3RfXworICAgICAgICAgICAgICAgIGRbJ293bmVyRG9jdW1lbnQnXSA9IHNlbGYuZG9jdW1lbnQKKyAgICAgICAgICAgICAgICBkWyd2YWx1ZSddID0gZFsnbm9kZVZhbHVlJ10gPSB2YWx1ZQorICAgICAgICAgICAgICAgIGRbJ293bmVyRWxlbWVudCddID0gbm9kZQorCisgICAgaWYgX19kZWJ1Z19fOgorICAgICAgICAjIFRoaXMgb25seSBhZGRzIHNvbWUgYXNzZXJ0cyB0byB0aGUgb3JpZ2luYWwKKyAgICAgICAgIyBlbmRfZWxlbWVudF9oYW5kbGVyKCksIHNvIHdlIG9ubHkgZGVmaW5lIHRoaXMgd2hlbiAtTyBpcyBub3QKKyAgICAgICAgIyB1c2VkLiAgSWYgY2hhbmdpbmcgb25lLCBiZSBzdXJlIHRvIGNoZWNrIHRoZSBvdGhlciB0byBzZWUgaWYKKyAgICAgICAgIyBpdCBuZWVkcyB0byBiZSBjaGFuZ2VkIGFzIHdlbGwuCisgICAgICAgICMKKyAgICAgICAgZGVmIGVuZF9lbGVtZW50X2hhbmRsZXIoc2VsZiwgbmFtZSk6CisgICAgICAgICAgICBjdXJOb2RlID0gc2VsZi5jdXJOb2RlCisgICAgICAgICAgICBpZiAnICcgaW4gbmFtZToKKyAgICAgICAgICAgICAgICB1cmksIGxvY2FsbmFtZSwgcHJlZml4LCBxbmFtZSA9IF9wYXJzZV9uc19uYW1lKHNlbGYsIG5hbWUpCisgICAgICAgICAgICAgICAgYXNzZXJ0IChjdXJOb2RlLm5hbWVzcGFjZVVSSSA9PSB1cmkKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjdXJOb2RlLmxvY2FsTmFtZSA9PSBsb2NhbG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBjdXJOb2RlLnByZWZpeCA9PSBwcmVmaXgpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAiZWxlbWVudCBzdGFjayBtZXNzZWQgdXAhIChuYW1lc3BhY2UpIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBhc3NlcnQgY3VyTm9kZS5ub2RlTmFtZSA9PSBuYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50IHN0YWNrIG1lc3NlZCB1cCAtIGJhZCBub2RlTmFtZSIKKyAgICAgICAgICAgICAgICBhc3NlcnQgY3VyTm9kZS5uYW1lc3BhY2VVUkkgPT0gRU1QVFlfTkFNRVNQQUNFLCBcCisgICAgICAgICAgICAgICAgICAgICAgICJlbGVtZW50IHN0YWNrIG1lc3NlZCB1cCAtIGJhZCBuYW1lc3BhY2VVUkkiCisgICAgICAgICAgICBzZWxmLmN1ck5vZGUgPSBjdXJOb2RlLnBhcmVudE5vZGUKKyAgICAgICAgICAgIHNlbGYuX2ZpbmlzaF9lbmRfZWxlbWVudChjdXJOb2RlKQorCisKK2NsYXNzIEV4cGF0QnVpbGRlck5TKE5hbWVzcGFjZXMsIEV4cGF0QnVpbGRlcik6CisgICAgIiIiRG9jdW1lbnQgYnVpbGRlciB0aGF0IHN1cHBvcnRzIG5hbWVzcGFjZXMuIiIiCisKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIEV4cGF0QnVpbGRlci5yZXNldChzZWxmKQorICAgICAgICBzZWxmLl9pbml0TmFtZXNwYWNlcygpCisKKworY2xhc3MgRnJhZ21lbnRCdWlsZGVyTlMoTmFtZXNwYWNlcywgRnJhZ21lbnRCdWlsZGVyKToKKyAgICAiIiJGcmFnbWVudCBidWlsZGVyIHRoYXQgc3VwcG9ydHMgbmFtZXNwYWNlcy4iIiIKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgRnJhZ21lbnRCdWlsZGVyLnJlc2V0KHNlbGYpCisgICAgICAgIHNlbGYuX2luaXROYW1lc3BhY2VzKCkKKworICAgIGRlZiBfZ2V0TlNhdHRycyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHN0cmluZyBvZiBuYW1lc3BhY2UgYXR0cmlidXRlcyBmcm9tIHRoaXMgZWxlbWVudCBhbmQKKyAgICAgICAgYW5jZXN0b3JzLiIiIgorICAgICAgICAjIFhYWCBUaGlzIG5lZWRzIHRvIGJlIHJlLXdyaXR0ZW4gdG8gd2FsayB0aGUgYW5jZXN0b3JzIG9mIHRoZQorICAgICAgICAjIGNvbnRleHQgdG8gYnVpbGQgdXAgdGhlIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBmcm9tCisgICAgICAgICMgZGVjbGFyYXRpb25zLCBlbGVtZW50cywgYW5kIGF0dHJpYnV0ZXMgZm91bmQgaW4gY29udGV4dC4KKyAgICAgICAgIyBPdGhlcndpc2Ugd2UgaGF2ZSB0byBzdG9yZSBhIGJ1bmNoIG1vcmUgZGF0YSBvbiB0aGUgRE9NCisgICAgICAgICMgKHRob3VnaCB0aGF0ICptaWdodCogYmUgbW9yZSByZWxpYWJsZSAtLSBub3QgY2xlYXIpLgorICAgICAgICBhdHRycyA9ICIiCisgICAgICAgIGNvbnRleHQgPSBzZWxmLmNvbnRleHQKKyAgICAgICAgTCA9IFtdCisgICAgICAgIHdoaWxlIGNvbnRleHQ6CisgICAgICAgICAgICBpZiBoYXNhdHRyKGNvbnRleHQsICdfbnNfcHJlZml4X3VyaScpOgorICAgICAgICAgICAgICAgIGZvciBwcmVmaXgsIHVyaSBpbiBjb250ZXh0Ll9uc19wcmVmaXhfdXJpLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgICMgYWRkIGV2ZXJ5IG5ldyBOUyBkZWNsIGZyb20gY29udGV4dCB0byBMIGFuZCBhdHRycyBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJlZml4IGluIEw6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBMLmFwcGVuZChwcmVmaXgpCisgICAgICAgICAgICAgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xuYW1lID0gInhtbG5zOiIgKyBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xuYW1lID0gInhtbG5zIgorICAgICAgICAgICAgICAgICAgICBpZiBhdHRyczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJzID0gIiVzXG4gICAgJXM9JyVzJyIgJSAoYXR0cnMsIGRlY2xuYW1lLCB1cmkpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyA9ICIgJXM9JyVzJyIgJSAoZGVjbG5hbWUsIHVyaSkKKyAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGUKKyAgICAgICAgcmV0dXJuIGF0dHJzCisKKworY2xhc3MgUGFyc2VFc2NhcGUoRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gcmFpc2VkIHRvIHNob3J0LWNpcmN1aXQgcGFyc2luZyBpbiBJbnRlcm5hbFN1YnNldEV4dHJhY3Rvci4iIiIKKyAgICBwYXNzCisKK2NsYXNzIEludGVybmFsU3Vic2V0RXh0cmFjdG9yKEV4cGF0QnVpbGRlcik6CisgICAgIiIiWE1MIHByb2Nlc3NvciB3aGljaCBjYW4gcmlwIG91dCB0aGUgaW50ZXJuYWwgZG9jdW1lbnQgdHlwZSBzdWJzZXQuIiIiCisKKyAgICBzdWJzZXQgPSBOb25lCisKKyAgICBkZWYgZ2V0U3Vic2V0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGludGVybmFsIHN1YnNldCBhcyBhIHN0cmluZy4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuc3Vic2V0CisKKyAgICBkZWYgcGFyc2VGaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBFeHBhdEJ1aWxkZXIucGFyc2VGaWxlKHNlbGYsIGZpbGUpCisgICAgICAgIGV4Y2VwdCBQYXJzZUVzY2FwZToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBwYXJzZVN0cmluZyhzZWxmLCBzdHJpbmcpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBFeHBhdEJ1aWxkZXIucGFyc2VTdHJpbmcoc2VsZiwgc3RyaW5nKQorICAgICAgICBleGNlcHQgUGFyc2VFc2NhcGU6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgaW5zdGFsbChzZWxmLCBwYXJzZXIpOgorICAgICAgICBwYXJzZXIuU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgPSBzZWxmLnN0YXJ0X2RvY3R5cGVfZGVjbF9oYW5kbGVyCisgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gc2VsZi5zdGFydF9lbGVtZW50X2hhbmRsZXIKKworICAgIGRlZiBzdGFydF9kb2N0eXBlX2RlY2xfaGFuZGxlcihzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19pbnRlcm5hbF9zdWJzZXQpOgorICAgICAgICBpZiBoYXNfaW50ZXJuYWxfc3Vic2V0OgorICAgICAgICAgICAgcGFyc2VyID0gc2VsZi5nZXRQYXJzZXIoKQorICAgICAgICAgICAgc2VsZi5zdWJzZXQgPSBbXQorICAgICAgICAgICAgcGFyc2VyLkRlZmF1bHRIYW5kbGVyID0gc2VsZi5zdWJzZXQuYXBwZW5kCisgICAgICAgICAgICBwYXJzZXIuRW5kRG9jdHlwZURlY2xIYW5kbGVyID0gc2VsZi5lbmRfZG9jdHlwZV9kZWNsX2hhbmRsZXIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFBhcnNlRXNjYXBlKCkKKworICAgIGRlZiBlbmRfZG9jdHlwZV9kZWNsX2hhbmRsZXIoc2VsZik6CisgICAgICAgIHMgPSAnJy5qb2luKHNlbGYuc3Vic2V0KS5yZXBsYWNlKCdcclxuJywgJ1xuJykucmVwbGFjZSgnXHInLCAnXG4nKQorICAgICAgICBzZWxmLnN1YnNldCA9IHMKKyAgICAgICAgcmFpc2UgUGFyc2VFc2NhcGUoKQorCisgICAgZGVmIHN0YXJ0X2VsZW1lbnRfaGFuZGxlcihzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIHJhaXNlIFBhcnNlRXNjYXBlKCkKKworCitkZWYgcGFyc2UoZmlsZSwgbmFtZXNwYWNlcz1UcnVlKToKKyAgICAiIiJQYXJzZSBhIGRvY3VtZW50LCByZXR1cm5pbmcgdGhlIHJlc3VsdGluZyBEb2N1bWVudCBub2RlLgorCisgICAgJ2ZpbGUnIG1heSBiZSBlaXRoZXIgYSBmaWxlIG5hbWUgb3IgYW4gb3BlbiBmaWxlIG9iamVjdC4KKyAgICAiIiIKKyAgICBpZiBuYW1lc3BhY2VzOgorICAgICAgICBidWlsZGVyID0gRXhwYXRCdWlsZGVyTlMoKQorICAgIGVsc2U6CisgICAgICAgIGJ1aWxkZXIgPSBFeHBhdEJ1aWxkZXIoKQorCisgICAgaWYgaXNpbnN0YW5jZShmaWxlLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGZwID0gb3BlbihmaWxlLCAncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXN1bHQgPSBidWlsZGVyLnBhcnNlRmlsZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICBlbHNlOgorICAgICAgICByZXN1bHQgPSBidWlsZGVyLnBhcnNlRmlsZShmaWxlKQorICAgIHJldHVybiByZXN1bHQKKworCitkZWYgcGFyc2VTdHJpbmcoc3RyaW5nLCBuYW1lc3BhY2VzPVRydWUpOgorICAgICIiIlBhcnNlIGEgZG9jdW1lbnQgZnJvbSBhIHN0cmluZywgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcKKyAgICBEb2N1bWVudCBub2RlLgorICAgICIiIgorICAgIGlmIG5hbWVzcGFjZXM6CisgICAgICAgIGJ1aWxkZXIgPSBFeHBhdEJ1aWxkZXJOUygpCisgICAgZWxzZToKKyAgICAgICAgYnVpbGRlciA9IEV4cGF0QnVpbGRlcigpCisgICAgcmV0dXJuIGJ1aWxkZXIucGFyc2VTdHJpbmcoc3RyaW5nKQorCisKK2RlZiBwYXJzZUZyYWdtZW50KGZpbGUsIGNvbnRleHQsIG5hbWVzcGFjZXM9VHJ1ZSk6CisgICAgIiIiUGFyc2UgYSBmcmFnbWVudCBvZiBhIGRvY3VtZW50LCBnaXZlbiB0aGUgY29udGV4dCBmcm9tIHdoaWNoIGl0CisgICAgd2FzIG9yaWdpbmFsbHkgZXh0cmFjdGVkLiAgY29udGV4dCBzaG91bGQgYmUgdGhlIHBhcmVudCBvZiB0aGUKKyAgICBub2RlKHMpIHdoaWNoIGFyZSBpbiB0aGUgZnJhZ21lbnQuCisKKyAgICAnZmlsZScgbWF5IGJlIGVpdGhlciBhIGZpbGUgbmFtZSBvciBhbiBvcGVuIGZpbGUgb2JqZWN0LgorICAgICIiIgorICAgIGlmIG5hbWVzcGFjZXM6CisgICAgICAgIGJ1aWxkZXIgPSBGcmFnbWVudEJ1aWxkZXJOUyhjb250ZXh0KQorICAgIGVsc2U6CisgICAgICAgIGJ1aWxkZXIgPSBGcmFnbWVudEJ1aWxkZXIoY29udGV4dCkKKworICAgIGlmIGlzaW5zdGFuY2UoZmlsZSwgU3RyaW5nVHlwZXMpOgorICAgICAgICBmcCA9IG9wZW4oZmlsZSwgJ3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gYnVpbGRlci5wYXJzZUZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgZWxzZToKKyAgICAgICAgcmVzdWx0ID0gYnVpbGRlci5wYXJzZUZpbGUoZmlsZSkKKyAgICByZXR1cm4gcmVzdWx0CisKKworZGVmIHBhcnNlRnJhZ21lbnRTdHJpbmcoc3RyaW5nLCBjb250ZXh0LCBuYW1lc3BhY2VzPVRydWUpOgorICAgICIiIlBhcnNlIGEgZnJhZ21lbnQgb2YgYSBkb2N1bWVudCBmcm9tIGEgc3RyaW5nLCBnaXZlbiB0aGUgY29udGV4dAorICAgIGZyb20gd2hpY2ggaXQgd2FzIG9yaWdpbmFsbHkgZXh0cmFjdGVkLiAgY29udGV4dCBzaG91bGQgYmUgdGhlCisgICAgcGFyZW50IG9mIHRoZSBub2RlKHMpIHdoaWNoIGFyZSBpbiB0aGUgZnJhZ21lbnQuCisgICAgIiIiCisgICAgaWYgbmFtZXNwYWNlczoKKyAgICAgICAgYnVpbGRlciA9IEZyYWdtZW50QnVpbGRlck5TKGNvbnRleHQpCisgICAgZWxzZToKKyAgICAgICAgYnVpbGRlciA9IEZyYWdtZW50QnVpbGRlcihjb250ZXh0KQorICAgIHJldHVybiBidWlsZGVyLnBhcnNlU3RyaW5nKHN0cmluZykKKworCitkZWYgbWFrZUJ1aWxkZXIob3B0aW9ucyk6CisgICAgIiIiQ3JlYXRlIGEgYnVpbGRlciBiYXNlZCBvbiBhbiBPcHRpb25zIG9iamVjdC4iIiIKKyAgICBpZiBvcHRpb25zLm5hbWVzcGFjZXM6CisgICAgICAgIHJldHVybiBFeHBhdEJ1aWxkZXJOUyhvcHRpb25zKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBFeHBhdEJ1aWxkZXIob3B0aW9ucykKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9leHBhdGJ1aWxkZXIucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5MmYxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9leHBhdGJ1aWxkZXIucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9leHBhdGJ1aWxkZXIucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL2V4cGF0YnVpbGRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA1OGNhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9leHBhdGJ1aWxkZXIucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pY29tcGF0LnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0Y2I0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pY29tcGF0LnB5CkBAIC0wLDAgKzEsMTEwIEBACisiIiJQeXRob24gdmVyc2lvbiBjb21wYXRpYmlsaXR5IHN1cHBvcnQgZm9yIG1pbmlkb20uIiIiCisKKyMgVGhpcyBtb2R1bGUgc2hvdWxkIG9ubHkgYmUgaW1wb3J0ZWQgdXNpbmcgImltcG9ydCAqIi4KKyMKKyMgVGhlIGZvbGxvd2luZyBuYW1lcyBhcmUgZGVmaW5lZDoKKyMKKyMgICBOb2RlTGlzdCAgICAgIC0tIGxpZ2h0ZXN0IHBvc3NpYmxlIE5vZGVMaXN0IGltcGxlbWVudGF0aW9uCisjCisjICAgRW1wdHlOb2RlTGlzdCAtLSBsaWdodGVzdCBwb3NzaWJsZSBOb2RlTGlzdCB0aGF0IGlzIGd1YXJhbnRlZWQgdG8KKyMgICAgICAgICAgICAgICAgICAgIHJlbWFpbiBlbXB0eSAoaW1tdXRhYmxlKQorIworIyAgIFN0cmluZ1R5cGVzICAgLS0gdHVwbGUgb2YgZGVmaW5lZCBzdHJpbmcgdHlwZXMKKyMKKyMgICBkZWZwcm9wZXJ0eSAgIC0tIGZ1bmN0aW9uIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBHZXRhdHRyTWFnaWM7CisjICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGVzZSB0b2dldGhlciBpcyBuZWVkZWQgdG8gbWFrZSB0aGVtIHdvcmsKKyMgICAgICAgICAgICAgICAgICAgIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlIGluIGJvdGggUHl0aG9uIDIuMisKKyMgICAgICAgICAgICAgICAgICAgIGFuZCBvbGRlciB2ZXJzaW9ucy4gIEZvciBleGFtcGxlOgorIworIyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIE15Q2xhc3MoR2V0YXR0ck1hZ2ljKToKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmIF9nZXRfbXlhdHRyKHNlbGYpOgorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvbWV0aGluZworIworIyAgICAgICAgICAgICAgICAgICAgICAgIGRlZnByb3BlcnR5KE15Q2xhc3MsICJteWF0dHIiLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm4gc29tZSB2YWx1ZSIpCisjCisjICAgICAgICAgICAgICAgICAgICBGb3IgUHl0aG9uIDIuMiBhbmQgbmV3ZXIsIHRoaXMgd2lsbCBjb25zdHJ1Y3QgYQorIyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgb2JqZWN0IG9uIHRoZSBjbGFzcywgd2hpY2ggYXZvaWRzCisjICAgICAgICAgICAgICAgICAgICBuZWVkaW5nIHRvIG92ZXJyaWRlIF9fZ2V0YXR0cl9fKCkuICBJdCB3aWxsIG9ubHkKKyMgICAgICAgICAgICAgICAgICAgIHdvcmsgZm9yIHJlYWQtb25seSBhdHRyaWJ1dGVzLgorIworIyAgICAgICAgICAgICAgICAgICAgRm9yIG9sZGVyIHZlcnNpb25zIG9mIFB5dGhvbiwgaW5oZXJpdGluZyBmcm9tCisjICAgICAgICAgICAgICAgICAgICBHZXRhdHRyTWFnaWMgd2lsbCB1c2UgdGhlIHRyYWRpdGlvbmFsCisjICAgICAgICAgICAgICAgICAgICBfX2dldGF0dHJfXygpIGhhY2tlcnkgdG8gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3QsCisjICAgICAgICAgICAgICAgICAgICBidXQgbGVzcyBlZmZpY2llbnRseS4KKyMKKyMgICAgICAgICAgICAgICAgICAgIGRlZnByb3BlcnR5KCkgc2hvdWxkIGJlIHVzZWQgZm9yIGVhY2ggdmVyc2lvbiBvZgorIyAgICAgICAgICAgICAgICAgICAgdGhlIHJlbGV2YW50IF9nZXRfPHByb3BlcnR5PigpIGZ1bmN0aW9uLgorCitfX2FsbF9fID0gWyJOb2RlTGlzdCIsICJFbXB0eU5vZGVMaXN0IiwgIlN0cmluZ1R5cGVzIiwgImRlZnByb3BlcnR5Il0KKworaW1wb3J0IHhtbC5kb20KKwordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgU3RyaW5nVHlwZXMgPSB0eXBlKCcnKSwKK2Vsc2U6CisgICAgU3RyaW5nVHlwZXMgPSB0eXBlKCcnKSwgdHlwZSh1bmljb2RlKCcnKSkKKworCitjbGFzcyBOb2RlTGlzdChsaXN0KToKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIGl0ZW0oc2VsZiwgaW5kZXgpOgorICAgICAgICBpZiAwIDw9IGluZGV4IDwgbGVuKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGZbaW5kZXhdCisKKyAgICBkZWYgX2dldF9sZW5ndGgoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZikKKworICAgIGRlZiBfc2V0X2xlbmd0aChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgJ2xlbmd0aCciKQorCisgICAgbGVuZ3RoID0gcHJvcGVydHkoX2dldF9sZW5ndGgsIF9zZXRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGRvYz0iVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgTm9kZUxpc3QuIikKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZls6XSA9IHN0YXRlCisKKworY2xhc3MgRW1wdHlOb2RlTGlzdCh0dXBsZSk6CisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgTkwgPSBOb2RlTGlzdCgpCisgICAgICAgIE5MLmV4dGVuZChvdGhlcikKKyAgICAgICAgcmV0dXJuIE5MCisKKyAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBOTCA9IE5vZGVMaXN0KCkKKyAgICAgICAgTkwuZXh0ZW5kKG90aGVyKQorICAgICAgICByZXR1cm4gTkwKKworICAgIGRlZiBpdGVtKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBfc2V0X2xlbmd0aChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgJ2xlbmd0aCciKQorCisgICAgbGVuZ3RoID0gcHJvcGVydHkoX2dldF9sZW5ndGgsIF9zZXRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGRvYz0iVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgTm9kZUxpc3QuIikKKworCitkZWYgZGVmcHJvcGVydHkoa2xhc3MsIG5hbWUsIGRvYyk6CisgICAgZ2V0ID0gZ2V0YXR0cihrbGFzcywgKCJfZ2V0XyIgKyBuYW1lKSkuaW1fZnVuYworICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUsIG5hbWU9bmFtZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgIiArIHJlcHIobmFtZSkpCisgICAgYXNzZXJ0IG5vdCBoYXNhdHRyKGtsYXNzLCAiX3NldF8iICsgbmFtZSksIFwKKyAgICAgICAgICAgImV4cGVjdGVkIG5vdCB0byBmaW5kIF9zZXRfIiArIG5hbWUKKyAgICBwcm9wID0gcHJvcGVydHkoZ2V0LCBzZXQsIGRvYz1kb2MpCisgICAgc2V0YXR0cihrbGFzcywgbmFtZSwgcHJvcCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pY29tcGF0LnB5YyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pY29tcGF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWI5Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pY29tcGF0LnB5byBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pY29tcGF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWVhZDkzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmljb21wYXQucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL21pbmlkb20ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhlZDIzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5CkBAIC0wLDAgKzEsMTk0NCBAQAorIiIiU2ltcGxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBMZXZlbCAxIERPTS4KKworTmFtZXNwYWNlcyBhbmQgb3RoZXIgbWlub3IgTGV2ZWwgMiBmZWF0dXJlcyBhcmUgYWxzbyBzdXBwb3J0ZWQuCisKK3BhcnNlKCJmb28ueG1sIikKKworcGFyc2VTdHJpbmcoIjxmb28+PGJhci8+PC9mb28+IikKKworVG9kbzoKKz09PT09CisgKiBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBnZXR0aW5nIGVsZW1lbnRzIGFuZCB0ZXh0LgorICogbW9yZSB0ZXN0aW5nCisgKiBicmluZyBzb21lIG9mIHRoZSB3cml0ZXIgYW5kIGxpbmVhcml6ZXIgY29kZSBpbnRvIGNvbmZvcm1hbmNlIHdpdGggdGhpcworICAgICAgICBpbnRlcmZhY2UKKyAqIFNBWCAyIG5hbWVzcGFjZXMKKyIiIgorCitpbXBvcnQgeG1sLmRvbQorCitmcm9tIHhtbC5kb20gaW1wb3J0IEVNUFRZX05BTUVTUEFDRSwgRU1QVFlfUFJFRklYLCBYTUxOU19OQU1FU1BBQ0UsIGRvbXJlZworZnJvbSB4bWwuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKK2Zyb20geG1sLmRvbS54bWxidWlsZGVyIGltcG9ydCBET01JbXBsZW1lbnRhdGlvbkxTLCBEb2N1bWVudExTCisKKyMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBJRC1jYWNoZSBpbnZhbGlkYXRpb24gY2hlY2tzOyB0aGUgbGlzdCBpc24ndAorIyBhY3R1YWxseSBjb21wbGV0ZSwgc2luY2UgdGhlIG5vZGVzIGJlaW5nIGNoZWNrZWQgd2lsbCBuZXZlciBiZSB0aGUKKyMgRE9DVU1FTlRfTk9ERSBvciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFLiAgKFRoZSBub2RlIGJlaW5nIGNoZWNrZWQgaXMKKyMgdGhlIG5vZGUgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCwgbm90IHRoZSBub2RlIGJlaW5nIG1vZGlmaWVkLikKKyMKK19ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbiA9ICh4bWwuZG9tLk5vZGUuRUxFTUVOVF9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5kb20uTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCisKKworY2xhc3MgTm9kZSh4bWwuZG9tLk5vZGUpOgorICAgIG5hbWVzcGFjZVVSSSA9IE5vbmUgIyB0aGlzIGlzIG5vbi1udWxsIG9ubHkgZm9yIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCisgICAgcGFyZW50Tm9kZSA9IE5vbmUKKyAgICBvd25lckRvY3VtZW50ID0gTm9uZQorICAgIG5leHRTaWJsaW5nID0gTm9uZQorICAgIHByZXZpb3VzU2libGluZyA9IE5vbmUKKworICAgIHByZWZpeCA9IEVNUFRZX1BSRUZJWCAjIG5vbi1udWxsIG9ubHkgZm9yIE5TIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCisKKyAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgdG94bWwoc2VsZiwgZW5jb2RpbmcgPSBOb25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYudG9wcmV0dHl4bWwoIiIsICIiLCBlbmNvZGluZykKKworICAgIGRlZiB0b3ByZXR0eXhtbChzZWxmLCBpbmRlbnQ9Ilx0IiwgbmV3bD0iXG4iLCBlbmNvZGluZyA9IE5vbmUpOgorICAgICAgICAjIGluZGVudCA9IHRoZSBpbmRlbnRhdGlvbiBzdHJpbmcgdG8gcHJlcGVuZCwgcGVyIGxldmVsCisgICAgICAgICMgbmV3bCA9IHRoZSBuZXdsaW5lIHN0cmluZyB0byBhcHBlbmQKKyAgICAgICAgd3JpdGVyID0gX2dldF9TdHJpbmdJTygpCisgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaW1wb3J0IGNvZGVjcworICAgICAgICAgICAgIyBDYW4ndCB1c2UgY29kZWNzLmdldHdyaXRlciB0byBwcmVzZXJ2ZSAyLjAgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgd3JpdGVyID0gY29kZWNzLmxvb2t1cChlbmNvZGluZylbM10od3JpdGVyKQorICAgICAgICBpZiBzZWxmLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERToKKyAgICAgICAgICAgICMgQ2FuIHBhc3MgZW5jb2Rpbmcgb25seSB0byBkb2N1bWVudCwgdG8gcHV0IGl0IGludG8gWE1MIGhlYWRlcgorICAgICAgICAgICAgc2VsZi53cml0ZXhtbCh3cml0ZXIsICIiLCBpbmRlbnQsIG5ld2wsIGVuY29kaW5nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53cml0ZXhtbCh3cml0ZXIsICIiLCBpbmRlbnQsIG5ld2wpCisgICAgICAgIHJldHVybiB3cml0ZXIuZ2V0dmFsdWUoKQorCisgICAgZGVmIGhhc0NoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hpbGROb2RlczoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfZ2V0X2NoaWxkTm9kZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNoaWxkTm9kZXMKKworICAgIGRlZiBfZ2V0X2ZpcnN0Q2hpbGQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY2hpbGROb2RlczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmNoaWxkTm9kZXNbMF0KKworICAgIGRlZiBfZ2V0X2xhc3RDaGlsZChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hpbGROb2Rlc1stMV0KKworICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKToKKyAgICAgICAgaWYgbmV3Q2hpbGQubm9kZVR5cGUgPT0gc2VsZi5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFOgorICAgICAgICAgICAgZm9yIGMgaW4gdHVwbGUobmV3Q2hpbGQuY2hpbGROb2Rlcyk6CisgICAgICAgICAgICAgICAgc2VsZi5pbnNlcnRCZWZvcmUoYywgcmVmQ2hpbGQpCisgICAgICAgICAgICAjIyMgVGhlIERPTSBkb2VzIG5vdCBjbGVhcmx5IHNwZWNpZnkgd2hhdCB0byByZXR1cm4gaW4gdGhpcyBjYXNlCisgICAgICAgICAgICByZXR1cm4gbmV3Q2hpbGQKKyAgICAgICAgaWYgbmV3Q2hpbGQubm9kZVR5cGUgbm90IGluIHNlbGYuX2NoaWxkX25vZGVfdHlwZXM6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihuZXdDaGlsZCksIHJlcHIoc2VsZikpKQorICAgICAgICBpZiBuZXdDaGlsZC5wYXJlbnROb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmV3Q2hpbGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXdDaGlsZCkKKyAgICAgICAgaWYgcmVmQ2hpbGQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuYXBwZW5kQ2hpbGQobmV3Q2hpbGQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW5kZXggPSBzZWxmLmNoaWxkTm9kZXMuaW5kZXgocmVmQ2hpbGQpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIGlmIG5ld0NoaWxkLm5vZGVUeXBlIGluIF9ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbjoKKyAgICAgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKKyAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlcy5pbnNlcnQoaW5kZXgsIG5ld0NoaWxkKQorICAgICAgICAgICAgbmV3Q2hpbGQubmV4dFNpYmxpbmcgPSByZWZDaGlsZAorICAgICAgICAgICAgcmVmQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gbmV3Q2hpbGQKKyAgICAgICAgICAgIGlmIGluZGV4OgorICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmNoaWxkTm9kZXNbaW5kZXgtMV0KKyAgICAgICAgICAgICAgICBub2RlLm5leHRTaWJsaW5nID0gbmV3Q2hpbGQKKyAgICAgICAgICAgICAgICBuZXdDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBub2RlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld0NoaWxkLnByZXZpb3VzU2libGluZyA9IE5vbmUKKyAgICAgICAgICAgIG5ld0NoaWxkLnBhcmVudE5vZGUgPSBzZWxmCisgICAgICAgIHJldHVybiBuZXdDaGlsZAorCisgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgorICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IHNlbGYuRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKKyAgICAgICAgICAgIGZvciBjIGluIHR1cGxlKG5vZGUuY2hpbGROb2Rlcyk6CisgICAgICAgICAgICAgICAgc2VsZi5hcHBlbmRDaGlsZChjKQorICAgICAgICAgICAgIyMjIFRoZSBET00gZG9lcyBub3QgY2xlYXJseSBzcGVjaWZ5IHdoYXQgdG8gcmV0dXJuIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgcmV0dXJuIG5vZGUKKyAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5vZGUpLCByZXByKHNlbGYpKSkKKyAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlIGluIF9ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbjoKKyAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmKQorICAgICAgICBpZiBub2RlLnBhcmVudE5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSkKKyAgICAgICAgX2FwcGVuZF9jaGlsZChzZWxmLCBub2RlKQorICAgICAgICBub2RlLm5leHRTaWJsaW5nID0gTm9uZQorICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIHJlcGxhY2VDaGlsZChzZWxmLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOgorICAgICAgICBpZiBuZXdDaGlsZC5ub2RlVHlwZSA9PSBzZWxmLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6CisgICAgICAgICAgICByZWZDaGlsZCA9IG9sZENoaWxkLm5leHRTaWJsaW5nCisgICAgICAgICAgICBzZWxmLnJlbW92ZUNoaWxkKG9sZENoaWxkKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCkKKyAgICAgICAgaWYgbmV3Q2hpbGQubm9kZVR5cGUgbm90IGluIHNlbGYuX2NoaWxkX25vZGVfdHlwZXM6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihuZXdDaGlsZCksIHJlcHIoc2VsZikpKQorICAgICAgICBpZiBuZXdDaGlsZCBpcyBvbGRDaGlsZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBuZXdDaGlsZC5wYXJlbnROb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmV3Q2hpbGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXdDaGlsZCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW5kZXggPSBzZWxmLmNoaWxkTm9kZXMuaW5kZXgob2xkQ2hpbGQpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgIHNlbGYuY2hpbGROb2Rlc1tpbmRleF0gPSBuZXdDaGlsZAorICAgICAgICBuZXdDaGlsZC5wYXJlbnROb2RlID0gc2VsZgorICAgICAgICBvbGRDaGlsZC5wYXJlbnROb2RlID0gTm9uZQorICAgICAgICBpZiAobmV3Q2hpbGQubm9kZVR5cGUgaW4gX25vZGVUeXBlc193aXRoX2NoaWxkcmVuCisgICAgICAgICAgICBvciBvbGRDaGlsZC5ub2RlVHlwZSBpbiBfbm9kZVR5cGVzX3dpdGhfY2hpbGRyZW4pOgorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCisgICAgICAgIG5ld0NoaWxkLm5leHRTaWJsaW5nID0gb2xkQ2hpbGQubmV4dFNpYmxpbmcKKyAgICAgICAgbmV3Q2hpbGQucHJldmlvdXNTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nCisgICAgICAgIG9sZENoaWxkLm5leHRTaWJsaW5nID0gTm9uZQorICAgICAgICBvbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcgPSBOb25lCisgICAgICAgIGlmIG5ld0NoaWxkLnByZXZpb3VzU2libGluZzoKKyAgICAgICAgICAgIG5ld0NoaWxkLnByZXZpb3VzU2libGluZy5uZXh0U2libGluZyA9IG5ld0NoaWxkCisgICAgICAgIGlmIG5ld0NoaWxkLm5leHRTaWJsaW5nOgorICAgICAgICAgICAgbmV3Q2hpbGQubmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gbmV3Q2hpbGQKKyAgICAgICAgcmV0dXJuIG9sZENoaWxkCisKKyAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgb2xkQ2hpbGQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXMucmVtb3ZlKG9sZENoaWxkKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICBpZiBvbGRDaGlsZC5uZXh0U2libGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9sZENoaWxkLm5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZyA9IG9sZENoaWxkLnByZXZpb3VzU2libGluZworICAgICAgICBpZiBvbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBvbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcubmV4dFNpYmxpbmcgPSBvbGRDaGlsZC5uZXh0U2libGluZworICAgICAgICBvbGRDaGlsZC5uZXh0U2libGluZyA9IG9sZENoaWxkLnByZXZpb3VzU2libGluZyA9IE5vbmUKKyAgICAgICAgaWYgb2xkQ2hpbGQubm9kZVR5cGUgaW4gX25vZGVUeXBlc193aXRoX2NoaWxkcmVuOgorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCisKKyAgICAgICAgb2xkQ2hpbGQucGFyZW50Tm9kZSA9IE5vbmUKKyAgICAgICAgcmV0dXJuIG9sZENoaWxkCisKKyAgICBkZWYgbm9ybWFsaXplKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIGNoaWxkIGluIHNlbGYuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFOgorICAgICAgICAgICAgICAgIGlmIG5vdCBjaGlsZC5kYXRhOgorICAgICAgICAgICAgICAgICAgICAjIGVtcHR5IHRleHQgbm9kZTsgZGlzY2FyZAorICAgICAgICAgICAgICAgICAgICBpZiBMOgorICAgICAgICAgICAgICAgICAgICAgICAgTFstMV0ubmV4dFNpYmxpbmcgPSBjaGlsZC5uZXh0U2libGluZworICAgICAgICAgICAgICAgICAgICBpZiBjaGlsZC5uZXh0U2libGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZyA9IGNoaWxkLnByZXZpb3VzU2libGluZworICAgICAgICAgICAgICAgICAgICBjaGlsZC51bmxpbmsoKQorICAgICAgICAgICAgICAgIGVsaWYgTCBhbmQgTFstMV0ubm9kZVR5cGUgPT0gY2hpbGQubm9kZVR5cGU6CisgICAgICAgICAgICAgICAgICAgICMgY29sbGFwc2UgdGV4dCBub2RlCisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBMWy0xXQorICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEgPSBub2RlLmRhdGEgKyBjaGlsZC5kYXRhCisgICAgICAgICAgICAgICAgICAgIG5vZGUubmV4dFNpYmxpbmcgPSBjaGlsZC5uZXh0U2libGluZworICAgICAgICAgICAgICAgICAgICBpZiBjaGlsZC5uZXh0U2libGluZzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZyA9IG5vZGUKKyAgICAgICAgICAgICAgICAgICAgY2hpbGQudW5saW5rKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBMLmFwcGVuZChjaGlsZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgTC5hcHBlbmQoY2hpbGQpCisgICAgICAgICAgICAgICAgaWYgY2hpbGQubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREU6CisgICAgICAgICAgICAgICAgICAgIGNoaWxkLm5vcm1hbGl6ZSgpCisgICAgICAgIHNlbGYuY2hpbGROb2Rlc1s6XSA9IEwKKworICAgIGRlZiBjbG9uZU5vZGUoc2VsZiwgZGVlcCk6CisgICAgICAgIHJldHVybiBfY2xvbmVfbm9kZShzZWxmLCBkZWVwLCBzZWxmLm93bmVyRG9jdW1lbnQgb3Igc2VsZikKKworICAgIGRlZiBpc1N1cHBvcnRlZChzZWxmLCBmZWF0dXJlLCB2ZXJzaW9uKToKKyAgICAgICAgcmV0dXJuIHNlbGYub3duZXJEb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKGZlYXR1cmUsIHZlcnNpb24pCisKKyAgICBkZWYgX2dldF9sb2NhbE5hbWUoc2VsZik6CisgICAgICAgICMgT3ZlcnJpZGRlbiBpbiBFbGVtZW50IGFuZCBBdHRyIHdoZXJlIGxvY2FsTmFtZSBjYW4gYmUgTm9uLU51bGwKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgTm9kZSBpbnRlcmZhY2VzIGZyb20gTGV2ZWwgMyAoV0QgOSBBcHJpbCAyMDAyKQorCisgICAgZGVmIGlzU2FtZU5vZGUoc2VsZiwgb3RoZXIpOgorICAgICAgICByZXR1cm4gc2VsZiBpcyBvdGhlcgorCisgICAgZGVmIGdldEludGVyZmFjZShzZWxmLCBmZWF0dXJlKToKKyAgICAgICAgaWYgc2VsZi5pc1N1cHBvcnRlZChmZWF0dXJlLCBOb25lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBUaGUgInVzZXIgZGF0YSIgZnVuY3Rpb25zIHVzZSBhIGRpY3Rpb25hcnkgdGhhdCBpcyBvbmx5IHByZXNlbnQKKyAgICAjIGlmIHNvbWUgdXNlciBkYXRhIGhhcyBiZWVuIHNldCwgc28gYmUgY2FyZWZ1bCBub3QgdG8gYXNzdW1lIGl0CisgICAgIyBleGlzdHMuCisKKyAgICBkZWYgZ2V0VXNlckRhdGEoc2VsZiwga2V5KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3VzZXJfZGF0YVtrZXldWzBdCisgICAgICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIEtleUVycm9yKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgc2V0VXNlckRhdGEoc2VsZiwga2V5LCBkYXRhLCBoYW5kbGVyKToKKyAgICAgICAgb2xkID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkID0gc2VsZi5fdXNlcl9kYXRhCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGQgPSB7fQorICAgICAgICAgICAgc2VsZi5fdXNlcl9kYXRhID0gZAorICAgICAgICBpZiBrZXkgaW4gZDoKKyAgICAgICAgICAgIG9sZCA9IGRba2V5XVswXQorICAgICAgICBpZiBkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICAjIGlnbm9yZSBoYW5kbGVycyBwYXNzZWQgZm9yIE5vbmUKKyAgICAgICAgICAgIGhhbmRsZXIgPSBOb25lCisgICAgICAgICAgICBpZiBvbGQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZGVsIGRba2V5XQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZFtrZXldID0gKGRhdGEsIGhhbmRsZXIpCisgICAgICAgIHJldHVybiBvbGQKKworICAgIGRlZiBfY2FsbF91c2VyX2RhdGFfaGFuZGxlcihzZWxmLCBvcGVyYXRpb24sIHNyYywgZHN0KToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAiX3VzZXJfZGF0YSIpOgorICAgICAgICAgICAgZm9yIGtleSwgKGRhdGEsIGhhbmRsZXIpIGluIHNlbGYuX3VzZXJfZGF0YS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGhhbmRsZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuaGFuZGxlKG9wZXJhdGlvbiwga2V5LCBkYXRhLCBzcmMsIGRzdCkKKworICAgICMgbWluaWRvbS1zcGVjaWZpYyBBUEk6CisKKyAgICBkZWYgdW5saW5rKHNlbGYpOgorICAgICAgICBzZWxmLnBhcmVudE5vZGUgPSBzZWxmLm93bmVyRG9jdW1lbnQgPSBOb25lCisgICAgICAgIGlmIHNlbGYuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkTm9kZXM6CisgICAgICAgICAgICAgICAgY2hpbGQudW5saW5rKCkKKyAgICAgICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IE5vZGVMaXN0KCkKKyAgICAgICAgc2VsZi5wcmV2aW91c1NpYmxpbmcgPSBOb25lCisgICAgICAgIHNlbGYubmV4dFNpYmxpbmcgPSBOb25lCisKK2RlZnByb3BlcnR5KE5vZGUsICJmaXJzdENoaWxkIiwgZG9jPSJGaXJzdCBjaGlsZCBub2RlLCBvciBOb25lLiIpCitkZWZwcm9wZXJ0eShOb2RlLCAibGFzdENoaWxkIiwgIGRvYz0iTGFzdCBjaGlsZCBub2RlLCBvciBOb25lLiIpCitkZWZwcm9wZXJ0eShOb2RlLCAibG9jYWxOYW1lIiwgIGRvYz0iTmFtZXNwYWNlLWxvY2FsIG5hbWUgb2YgdGhpcyBub2RlLiIpCisKKworZGVmIF9hcHBlbmRfY2hpbGQoc2VsZiwgbm9kZSk6CisgICAgIyBmYXN0IHBhdGggd2l0aCBsZXNzIGNoZWNrczsgdXNhYmxlIGJ5IERPTSBidWlsZGVycyBpZiBjYXJlZnVsCisgICAgY2hpbGROb2RlcyA9IHNlbGYuY2hpbGROb2RlcworICAgIGlmIGNoaWxkTm9kZXM6CisgICAgICAgIGxhc3QgPSBjaGlsZE5vZGVzWy0xXQorICAgICAgICBub2RlLl9fZGljdF9fWyJwcmV2aW91c1NpYmxpbmciXSA9IGxhc3QKKyAgICAgICAgbGFzdC5fX2RpY3RfX1sibmV4dFNpYmxpbmciXSA9IG5vZGUKKyAgICBjaGlsZE5vZGVzLmFwcGVuZChub2RlKQorICAgIG5vZGUuX19kaWN0X19bInBhcmVudE5vZGUiXSA9IHNlbGYKKworZGVmIF9pbl9kb2N1bWVudChub2RlKToKKyAgICAjIHJldHVybiBUcnVlIGlmZiBub2RlIGlzIHBhcnQgb2YgYSBkb2N1bWVudCB0cmVlCisgICAgd2hpbGUgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREU6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBfd3JpdGVfZGF0YSh3cml0ZXIsIGRhdGEpOgorICAgICJXcml0ZXMgZGF0YWNoYXJzIHRvIHdyaXRlci4iCisgICAgaWYgZGF0YToKKyAgICAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiJiIsICImYW1wOyIpLnJlcGxhY2UoIjwiLCAiJmx0OyIpLiBcCisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UoIlwiIiwgIiZxdW90OyIpLnJlcGxhY2UoIj4iLCAiJmd0OyIpCisgICAgICAgIHdyaXRlci53cml0ZShkYXRhKQorCitkZWYgX2dldF9lbGVtZW50c19ieV90YWdOYW1lX2hlbHBlcihwYXJlbnQsIG5hbWUsIHJjKToKKyAgICBmb3Igbm9kZSBpbiBwYXJlbnQuY2hpbGROb2RlczoKKyAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSBhbmQgXAorICAgICAgICAgICAgKG5hbWUgPT0gIioiIG9yIG5vZGUudGFnTmFtZSA9PSBuYW1lKToKKyAgICAgICAgICAgIHJjLmFwcGVuZChub2RlKQorICAgICAgICBfZ2V0X2VsZW1lbnRzX2J5X3RhZ05hbWVfaGVscGVyKG5vZGUsIG5hbWUsIHJjKQorICAgIHJldHVybiByYworCitkZWYgX2dldF9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcihwYXJlbnQsIG5zVVJJLCBsb2NhbE5hbWUsIHJjKToKKyAgICBmb3Igbm9kZSBpbiBwYXJlbnQuY2hpbGROb2RlczoKKyAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgIGlmICgobG9jYWxOYW1lID09ICIqIiBvciBub2RlLmxvY2FsTmFtZSA9PSBsb2NhbE5hbWUpIGFuZAorICAgICAgICAgICAgICAgIChuc1VSSSA9PSAiKiIgb3Igbm9kZS5uYW1lc3BhY2VVUkkgPT0gbnNVUkkpKToKKyAgICAgICAgICAgICAgICByYy5hcHBlbmQobm9kZSkKKyAgICAgICAgICAgIF9nZXRfZWxlbWVudHNfYnlfdGFnTmFtZV9uc19oZWxwZXIobm9kZSwgbnNVUkksIGxvY2FsTmFtZSwgcmMpCisgICAgcmV0dXJuIHJjCisKK2NsYXNzIERvY3VtZW50RnJhZ21lbnQoTm9kZSk6CisgICAgbm9kZVR5cGUgPSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUKKyAgICBub2RlTmFtZSA9ICIjZG9jdW1lbnQtZnJhZ21lbnQiCisgICAgbm9kZVZhbHVlID0gTm9uZQorICAgIGF0dHJpYnV0ZXMgPSBOb25lCisgICAgcGFyZW50Tm9kZSA9IE5vbmUKKyAgICBfY2hpbGRfbm9kZV90eXBlcyA9IChOb2RlLkVMRU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLlRFWFRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkNPTU1FTlRfTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLk5PVEFUSU9OX05PREUpCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IE5vZGVMaXN0KCkKKworCitjbGFzcyBBdHRyKE5vZGUpOgorICAgIG5vZGVUeXBlID0gTm9kZS5BVFRSSUJVVEVfTk9ERQorICAgIGF0dHJpYnV0ZXMgPSBOb25lCisgICAgb3duZXJFbGVtZW50ID0gTm9uZQorICAgIHNwZWNpZmllZCA9IEZhbHNlCisgICAgX2lzX2lkID0gRmFsc2UKKworICAgIF9jaGlsZF9ub2RlX3R5cGVzID0gKE5vZGUuVEVYVF9OT0RFLCBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBxTmFtZSwgbmFtZXNwYWNlVVJJPUVNUFRZX05BTUVTUEFDRSwgbG9jYWxOYW1lPU5vbmUsCisgICAgICAgICAgICAgICAgIHByZWZpeD1Ob25lKToKKyAgICAgICAgIyBza2lwIHNldGF0dHIgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fCisgICAgICAgIGRbIm5vZGVOYW1lIl0gPSBkWyJuYW1lIl0gPSBxTmFtZQorICAgICAgICBkWyJuYW1lc3BhY2VVUkkiXSA9IG5hbWVzcGFjZVVSSQorICAgICAgICBkWyJwcmVmaXgiXSA9IHByZWZpeAorICAgICAgICBkWydjaGlsZE5vZGVzJ10gPSBOb2RlTGlzdCgpCisKKyAgICAgICAgIyBBZGQgdGhlIHNpbmdsZSBjaGlsZCBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgdmFsdWUgb2YgdGhlIGF0dHIKKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzLmFwcGVuZChUZXh0KCkpCisKKyAgICAgICAgIyBub2RlVmFsdWUgYW5kIHZhbHVlIGFyZSBzZXQgZWxzZXdoZXJlCisKKyAgICBkZWYgX2dldF9sb2NhbE5hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5vZGVOYW1lLnNwbGl0KCI6IiwgMSlbLTFdCisKKyAgICBkZWYgX2dldF9uYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5uYW1lCisKKyAgICBkZWYgX2dldF9zcGVjaWZpZWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnNwZWNpZmllZAorCisgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgZCA9IHNlbGYuX19kaWN0X18KKyAgICAgICAgaWYgbmFtZSBpbiAoInZhbHVlIiwgIm5vZGVWYWx1ZSIpOgorICAgICAgICAgICAgZFsidmFsdWUiXSA9IGRbIm5vZGVWYWx1ZSJdID0gdmFsdWUKKyAgICAgICAgICAgIGQyID0gc2VsZi5jaGlsZE5vZGVzWzBdLl9fZGljdF9fCisgICAgICAgICAgICBkMlsiZGF0YSJdID0gZDJbIm5vZGVWYWx1ZSJdID0gdmFsdWUKKyAgICAgICAgICAgIGlmIHNlbGYub3duZXJFbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmLm93bmVyRWxlbWVudCkKKyAgICAgICAgZWxpZiBuYW1lIGluICgibmFtZSIsICJub2RlTmFtZSIpOgorICAgICAgICAgICAgZFsibmFtZSJdID0gZFsibm9kZU5hbWUiXSA9IHZhbHVlCisgICAgICAgICAgICBpZiBzZWxmLm93bmVyRWxlbWVudCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZi5vd25lckVsZW1lbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkW25hbWVdID0gdmFsdWUKKworICAgIGRlZiBfc2V0X3ByZWZpeChzZWxmLCBwcmVmaXgpOgorICAgICAgICBuc3VyaSA9IHNlbGYubmFtZXNwYWNlVVJJCisgICAgICAgIGlmIHByZWZpeCA9PSAieG1sbnMiOgorICAgICAgICAgICAgaWYgbnN1cmkgYW5kIG5zdXJpICE9IFhNTE5TX05BTUVTUEFDRToKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgdXNlIG9mICd4bWxucycgcHJlZml4IGZvciB0aGUgd3JvbmcgbmFtZXNwYWNlIikKKyAgICAgICAgZCA9IHNlbGYuX19kaWN0X18KKyAgICAgICAgZFsncHJlZml4J10gPSBwcmVmaXgKKyAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICBuZXdOYW1lID0gc2VsZi5sb2NhbE5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5ld05hbWUgPSAiJXM6JXMiICUgKHByZWZpeCwgc2VsZi5sb2NhbE5hbWUpCisgICAgICAgIGlmIHNlbGYub3duZXJFbGVtZW50OgorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYub3duZXJFbGVtZW50KQorICAgICAgICBkWydub2RlTmFtZSddID0gZFsnbmFtZSddID0gbmV3TmFtZQorCisgICAgZGVmIF9zZXRfdmFsdWUoc2VsZiwgdmFsdWUpOgorICAgICAgICBkID0gc2VsZi5fX2RpY3RfXworICAgICAgICBkWyd2YWx1ZSddID0gZFsnbm9kZVZhbHVlJ10gPSB2YWx1ZQorICAgICAgICBpZiBzZWxmLm93bmVyRWxlbWVudDoKKyAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmLm93bmVyRWxlbWVudCkKKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzWzBdLmRhdGEgPSB2YWx1ZQorCisgICAgZGVmIHVubGluayhzZWxmKToKKyAgICAgICAgIyBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGNhbGwgdGhlIGJhc2UgaW1wbGVtZW50YXRpb24KKyAgICAgICAgIyBzaW5jZSBtb3N0IG9mIHRoYXQgaXMgbm90IG5lZWRlZCwgYW5kIHRoZSBleHBlbnNlIG9mIHRoZQorICAgICAgICAjIG1ldGhvZCBjYWxsIGlzIG5vdCB3YXJyYW50ZWQuICBXZSBkdXBsaWNhdGUgdGhlIHJlbW92YWwgb2YKKyAgICAgICAgIyBjaGlsZHJlbiwgYnV0IHRoYXQncyBhbGwgd2UgbmVlZGVkIGZyb20gdGhlIGJhc2UgY2xhc3MuCisgICAgICAgIGVsZW0gPSBzZWxmLm93bmVyRWxlbWVudAorICAgICAgICBpZiBlbGVtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZGVsIGVsZW0uX2F0dHJzW3NlbGYubm9kZU5hbWVdCisgICAgICAgICAgICBkZWwgZWxlbS5fYXR0cnNOU1soc2VsZi5uYW1lc3BhY2VVUkksIHNlbGYubG9jYWxOYW1lKV0KKyAgICAgICAgICAgIGlmIHNlbGYuX2lzX2lkOgorICAgICAgICAgICAgICAgIHNlbGYuX2lzX2lkID0gRmFsc2UKKyAgICAgICAgICAgICAgICBlbGVtLl9tYWdpY19pZF9ub2RlcyAtPSAxCisgICAgICAgICAgICAgICAgc2VsZi5vd25lckRvY3VtZW50Ll9tYWdpY19pZF9jb3VudCAtPSAxCisgICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLmNoaWxkTm9kZXM6CisgICAgICAgICAgICBjaGlsZC51bmxpbmsoKQorICAgICAgICBkZWwgc2VsZi5jaGlsZE5vZGVzWzpdCisKKyAgICBkZWYgX2dldF9pc0lkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9pc19pZDoKKyAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGRvYyA9IHNlbGYub3duZXJEb2N1bWVudAorICAgICAgICBlbGVtID0gc2VsZi5vd25lckVsZW1lbnQKKyAgICAgICAgaWYgZG9jIGlzIE5vbmUgb3IgZWxlbSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgaW5mbyA9IGRvYy5fZ2V0X2VsZW1faW5mbyhlbGVtKQorICAgICAgICBpZiBpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgaWYgc2VsZi5uYW1lc3BhY2VVUkk6CisgICAgICAgICAgICByZXR1cm4gaW5mby5pc0lkTlMoc2VsZi5uYW1lc3BhY2VVUkksIHNlbGYubG9jYWxOYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGluZm8uaXNJZChzZWxmLm5vZGVOYW1lKQorCisgICAgZGVmIF9nZXRfc2NoZW1hVHlwZShzZWxmKToKKyAgICAgICAgZG9jID0gc2VsZi5vd25lckRvY3VtZW50CisgICAgICAgIGVsZW0gPSBzZWxmLm93bmVyRWxlbWVudAorICAgICAgICBpZiBkb2MgaXMgTm9uZSBvciBlbGVtIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX25vX3R5cGUKKworICAgICAgICBpbmZvID0gZG9jLl9nZXRfZWxlbV9pbmZvKGVsZW0pCisgICAgICAgIGlmIGluZm8gaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBfbm9fdHlwZQorICAgICAgICBpZiBzZWxmLm5hbWVzcGFjZVVSSToKKyAgICAgICAgICAgIHJldHVybiBpbmZvLmdldEF0dHJpYnV0ZVR5cGVOUyhzZWxmLm5hbWVzcGFjZVVSSSwgc2VsZi5sb2NhbE5hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaW5mby5nZXRBdHRyaWJ1dGVUeXBlKHNlbGYubm9kZU5hbWUpCisKK2RlZnByb3BlcnR5KEF0dHIsICJpc0lkIiwgICAgICAgZG9jPSJUcnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzIGFuIElELiIpCitkZWZwcm9wZXJ0eShBdHRyLCAibG9jYWxOYW1lIiwgIGRvYz0iTmFtZXNwYWNlLWxvY2FsIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuIikKK2RlZnByb3BlcnR5KEF0dHIsICJzY2hlbWFUeXBlIiwgZG9jPSJTY2hlbWEgdHlwZSBmb3IgdGhpcyBhdHRyaWJ1dGUuIikKKworCitjbGFzcyBOYW1lZE5vZGVNYXAob2JqZWN0KToKKyAgICAiIiJUaGUgYXR0cmlidXRlIGxpc3QgaXMgYSB0cmFuc2llbnQgaW50ZXJmYWNlIHRvIHRoZSB1bmRlcmx5aW5nCisgICAgZGljdGlvbmFyaWVzLiAgTXV0YXRpb25zIGhlcmUgd2lsbCBjaGFuZ2UgdGhlIHVuZGVybHlpbmcgZWxlbWVudCdzCisgICAgZGljdGlvbmFyeS4KKworICAgIE9yZGVyaW5nIGlzIGltcG9zZWQgYXJ0aWZpY2lhbGx5IGFuZCBkb2VzIG5vdCByZWZsZWN0IHRoZSBvcmRlciBvZgorICAgIGF0dHJpYnV0ZXMgYXMgZm91bmQgaW4gYW4gaW5wdXQgZG9jdW1lbnQuCisgICAgIiIiCisKKyAgICBfX3Nsb3RzX18gPSAoJ19hdHRycycsICdfYXR0cnNOUycsICdfb3duZXJFbGVtZW50JykKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRycywgYXR0cnNOUywgb3duZXJFbGVtZW50KToKKyAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycworICAgICAgICBzZWxmLl9hdHRyc05TID0gYXR0cnNOUworICAgICAgICBzZWxmLl9vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQKKworICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9hdHRycykKKworICAgIGRlZiBpdGVtKHNlbGYsIGluZGV4KToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGZbc2VsZi5fYXR0cnMua2V5cygpW2luZGV4XV0KKyAgICAgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5fYXR0cnMudmFsdWVzKCk6CisgICAgICAgICAgICBMLmFwcGVuZCgobm9kZS5ub2RlTmFtZSwgbm9kZS52YWx1ZSkpCisgICAgICAgIHJldHVybiBMCisKKyAgICBkZWYgaXRlbXNOUyhzZWxmKToKKyAgICAgICAgTCA9IFtdCisgICAgICAgIGZvciBub2RlIGluIHNlbGYuX2F0dHJzLnZhbHVlcygpOgorICAgICAgICAgICAgTC5hcHBlbmQoKChub2RlLm5hbWVzcGFjZVVSSSwgbm9kZS5sb2NhbE5hbWUpLCBub2RlLnZhbHVlKSkKKyAgICAgICAgcmV0dXJuIEwKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBTdHJpbmdUeXBlcyk6CisgICAgICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2F0dHJzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX2F0dHJzTlMKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnMua2V5cygpCisKKyAgICBkZWYga2V5c05TKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNOUy5rZXlzKCkKKworICAgIGRlZiB2YWx1ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRycy52YWx1ZXMoKQorCisgICAgZGVmIGdldChzZWxmLCBuYW1lLCB2YWx1ZT1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLmdldChuYW1lLCB2YWx1ZSkKKworICAgIF9fbGVuX18gPSBfZ2V0X2xlbmd0aAorCisgICAgX19oYXNoX18gPSBOb25lICMgTXV0YWJsZSB0eXBlIGNhbid0IGJlIGNvcnJlY3RseSBoYXNoZWQKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIHNlbGYuX2F0dHJzIGlzIGdldGF0dHIob3RoZXIsICJfYXR0cnMiLCBOb25lKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY21wKGlkKHNlbGYpLCBpZChvdGhlcikpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgYXR0bmFtZV9vcl90dXBsZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXR0bmFtZV9vcl90dXBsZSwgdHVwbGUpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzTlNbYXR0bmFtZV9vcl90dXBsZV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1thdHRuYW1lX29yX3R1cGxlXQorCisgICAgIyBzYW1lIGFzIHNldAorICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBhdHRuYW1lLCB2YWx1ZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5fYXR0cnNbYXR0bmFtZV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICBub2RlID0gQXR0cihhdHRuYW1lKQorICAgICAgICAgICAgICAgIG5vZGUub3duZXJEb2N1bWVudCA9IHNlbGYuX293bmVyRWxlbWVudC5vd25lckRvY3VtZW50CisgICAgICAgICAgICAgICAgc2VsZi5zZXROYW1lZEl0ZW0obm9kZSkKKyAgICAgICAgICAgIG5vZGUudmFsdWUgPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIEF0dHIpOgorICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgInZhbHVlIG11c3QgYmUgYSBzdHJpbmcgb3IgQXR0ciBvYmplY3QiCisgICAgICAgICAgICBub2RlID0gdmFsdWUKKyAgICAgICAgICAgIHNlbGYuc2V0TmFtZWRJdGVtKG5vZGUpCisKKyAgICBkZWYgZ2V0TmFtZWRJdGVtKHNlbGYsIG5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXROYW1lZEl0ZW1OUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc05TWyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSldCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgcmVtb3ZlTmFtZWRJdGVtKHNlbGYsIG5hbWUpOgorICAgICAgICBuID0gc2VsZi5nZXROYW1lZEl0ZW0obmFtZSkKKyAgICAgICAgaWYgbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmLl9vd25lckVsZW1lbnQpCisgICAgICAgICAgICBkZWwgc2VsZi5fYXR0cnNbbi5ub2RlTmFtZV0KKyAgICAgICAgICAgIGRlbCBzZWxmLl9hdHRyc05TWyhuLm5hbWVzcGFjZVVSSSwgbi5sb2NhbE5hbWUpXQorICAgICAgICAgICAgaWYgJ293bmVyRWxlbWVudCcgaW4gbi5fX2RpY3RfXzoKKyAgICAgICAgICAgICAgICBuLl9fZGljdF9fWydvd25lckVsZW1lbnQnXSA9IE5vbmUKKyAgICAgICAgICAgIHJldHVybiBuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKworICAgIGRlZiByZW1vdmVOYW1lZEl0ZW1OUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIG4gPSBzZWxmLmdldE5hbWVkSXRlbU5TKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKQorICAgICAgICBpZiBuIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYuX293bmVyRWxlbWVudCkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9hdHRyc05TWyhuLm5hbWVzcGFjZVVSSSwgbi5sb2NhbE5hbWUpXQorICAgICAgICAgICAgZGVsIHNlbGYuX2F0dHJzW24ubm9kZU5hbWVdCisgICAgICAgICAgICBpZiAnb3duZXJFbGVtZW50JyBpbiBuLl9fZGljdF9fOgorICAgICAgICAgICAgICAgIG4uX19kaWN0X19bJ293bmVyRWxlbWVudCddID0gTm9uZQorICAgICAgICAgICAgcmV0dXJuIG4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQorCisgICAgZGVmIHNldE5hbWVkSXRlbShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgQXR0cik6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihub2RlKSwgcmVwcihzZWxmKSkpCisgICAgICAgIG9sZCA9IHNlbGYuX2F0dHJzLmdldChub2RlLm5hbWUpCisgICAgICAgIGlmIG9sZDoKKyAgICAgICAgICAgIG9sZC51bmxpbmsoKQorICAgICAgICBzZWxmLl9hdHRyc1tub2RlLm5hbWVdID0gbm9kZQorICAgICAgICBzZWxmLl9hdHRyc05TWyhub2RlLm5hbWVzcGFjZVVSSSwgbm9kZS5sb2NhbE5hbWUpXSA9IG5vZGUKKyAgICAgICAgbm9kZS5vd25lckVsZW1lbnQgPSBzZWxmLl9vd25lckVsZW1lbnQKKyAgICAgICAgX2NsZWFyX2lkX2NhY2hlKG5vZGUub3duZXJFbGVtZW50KQorICAgICAgICByZXR1cm4gb2xkCisKKyAgICBkZWYgc2V0TmFtZWRJdGVtTlMoc2VsZiwgbm9kZSk6CisgICAgICAgIHJldHVybiBzZWxmLnNldE5hbWVkSXRlbShub2RlKQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGF0dG5hbWVfb3JfdHVwbGUpOgorICAgICAgICBub2RlID0gc2VsZlthdHRuYW1lX29yX3R1cGxlXQorICAgICAgICBfY2xlYXJfaWRfY2FjaGUobm9kZS5vd25lckVsZW1lbnQpCisgICAgICAgIG5vZGUudW5saW5rKCkKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRycywgc2VsZi5fYXR0cnNOUywgc2VsZi5fb3duZXJFbGVtZW50CisKKyAgICBkZWYgX19zZXRzdGF0ZV9fKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi5fYXR0cnMsIHNlbGYuX2F0dHJzTlMsIHNlbGYuX293bmVyRWxlbWVudCA9IHN0YXRlCisKK2RlZnByb3BlcnR5KE5hbWVkTm9kZU1hcCwgImxlbmd0aCIsCisgICAgICAgICAgICBkb2M9Ik51bWJlciBvZiBub2RlcyBpbiB0aGUgTmFtZWROb2RlTWFwLiIpCisKK0F0dHJpYnV0ZUxpc3QgPSBOYW1lZE5vZGVNYXAKKworCitjbGFzcyBUeXBlSW5mbyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICduYW1lc3BhY2UnLCAnbmFtZScKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lc3BhY2UsIG5hbWUpOgorICAgICAgICBzZWxmLm5hbWVzcGFjZSA9IG5hbWVzcGFjZQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIGlmIHNlbGYubmFtZXNwYWNlOgorICAgICAgICAgICAgcmV0dXJuICI8VHlwZUluZm8gJXIgKGZyb20gJXIpPiIgJSAoc2VsZi5uYW1lLCBzZWxmLm5hbWVzcGFjZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiPFR5cGVJbmZvICVyPiIgJSBzZWxmLm5hbWUKKworICAgIGRlZiBfZ2V0X25hbWUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworICAgIGRlZiBfZ2V0X25hbWVzcGFjZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubmFtZXNwYWNlCisKK19ub190eXBlID0gVHlwZUluZm8oTm9uZSwgTm9uZSkKKworY2xhc3MgRWxlbWVudChOb2RlKToKKyAgICBub2RlVHlwZSA9IE5vZGUuRUxFTUVOVF9OT0RFCisgICAgbm9kZVZhbHVlID0gTm9uZQorICAgIHNjaGVtYVR5cGUgPSBfbm9fdHlwZQorCisgICAgX21hZ2ljX2lkX25vZGVzID0gMAorCisgICAgX2NoaWxkX25vZGVfdHlwZXMgPSAoTm9kZS5FTEVNRU5UX05PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5DT01NRU5UX05PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5URVhUX05PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5DREFUQV9TRUNUSU9OX05PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFnTmFtZSwgbmFtZXNwYWNlVVJJPUVNUFRZX05BTUVTUEFDRSwgcHJlZml4PU5vbmUsCisgICAgICAgICAgICAgICAgIGxvY2FsTmFtZT1Ob25lKToKKyAgICAgICAgc2VsZi50YWdOYW1lID0gc2VsZi5ub2RlTmFtZSA9IHRhZ05hbWUKKyAgICAgICAgc2VsZi5wcmVmaXggPSBwcmVmaXgKKyAgICAgICAgc2VsZi5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkkKKyAgICAgICAgc2VsZi5jaGlsZE5vZGVzID0gTm9kZUxpc3QoKQorCisgICAgICAgIHNlbGYuX2F0dHJzID0ge30gICAjIGF0dHJpYnV0ZXMgYXJlIGRvdWJsZS1pbmRleGVkOgorICAgICAgICBzZWxmLl9hdHRyc05TID0ge30gIyAgICB0YWdOYW1lIC0+IEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICBVUkksbG9jYWxOYW1lIC0+IEF0dHJpYnV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBpbiB0aGUgZnV0dXJlOiBjb25zaWRlciBsYXp5IGdlbmVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb2YgYXR0cmlidXRlIG9iamVjdHMgdGhpcyBpcyB0b28gdHJpY2t5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciBub3cgYmVjYXVzZSBvZiBoZWFkYWNoZXMgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuYW1lc3BhY2VzLgorCisgICAgZGVmIF9nZXRfbG9jYWxOYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50YWdOYW1lLnNwbGl0KCI6IiwgMSlbLTFdCisKKyAgICBkZWYgX2dldF90YWdOYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50YWdOYW1lCisKKyAgICBkZWYgdW5saW5rKHNlbGYpOgorICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLl9hdHRycy52YWx1ZXMoKToKKyAgICAgICAgICAgIGF0dHIudW5saW5rKCkKKyAgICAgICAgc2VsZi5fYXR0cnMgPSBOb25lCisgICAgICAgIHNlbGYuX2F0dHJzTlMgPSBOb25lCisgICAgICAgIE5vZGUudW5saW5rKHNlbGYpCisKKyAgICBkZWYgZ2V0QXR0cmlidXRlKHNlbGYsIGF0dG5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbYXR0bmFtZV0udmFsdWUKKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmV0dXJuICIiCisKKyAgICBkZWYgZ2V0QXR0cmlidXRlTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNOU1sobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpXS52YWx1ZQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByZXR1cm4gIiIKKworICAgIGRlZiBzZXRBdHRyaWJ1dGUoc2VsZiwgYXR0bmFtZSwgdmFsdWUpOgorICAgICAgICBhdHRyID0gc2VsZi5nZXRBdHRyaWJ1dGVOb2RlKGF0dG5hbWUpCisgICAgICAgIGlmIGF0dHIgaXMgTm9uZToKKyAgICAgICAgICAgIGF0dHIgPSBBdHRyKGF0dG5hbWUpCisgICAgICAgICAgICAjIGZvciBwZXJmb3JtYW5jZQorICAgICAgICAgICAgZCA9IGF0dHIuX19kaWN0X18KKyAgICAgICAgICAgIGRbInZhbHVlIl0gPSBkWyJub2RlVmFsdWUiXSA9IHZhbHVlCisgICAgICAgICAgICBkWyJvd25lckRvY3VtZW50Il0gPSBzZWxmLm93bmVyRG9jdW1lbnQKKyAgICAgICAgICAgIHNlbGYuc2V0QXR0cmlidXRlTm9kZShhdHRyKQorICAgICAgICBlbGlmIHZhbHVlICE9IGF0dHIudmFsdWU6CisgICAgICAgICAgICBkID0gYXR0ci5fX2RpY3RfXworICAgICAgICAgICAgZFsidmFsdWUiXSA9IGRbIm5vZGVWYWx1ZSJdID0gdmFsdWUKKyAgICAgICAgICAgIGlmIGF0dHIuaXNJZDoKKyAgICAgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKKworICAgIGRlZiBzZXRBdHRyaWJ1dGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUsIHZhbHVlKToKKyAgICAgICAgcHJlZml4LCBsb2NhbG5hbWUgPSBfbnNzcGxpdChxdWFsaWZpZWROYW1lKQorICAgICAgICBhdHRyID0gc2VsZi5nZXRBdHRyaWJ1dGVOb2RlTlMobmFtZXNwYWNlVVJJLCBsb2NhbG5hbWUpCisgICAgICAgIGlmIGF0dHIgaXMgTm9uZToKKyAgICAgICAgICAgICMgZm9yIHBlcmZvcm1hbmNlCisgICAgICAgICAgICBhdHRyID0gQXR0cihxdWFsaWZpZWROYW1lLCBuYW1lc3BhY2VVUkksIGxvY2FsbmFtZSwgcHJlZml4KQorICAgICAgICAgICAgZCA9IGF0dHIuX19kaWN0X18KKyAgICAgICAgICAgIGRbInByZWZpeCJdID0gcHJlZml4CisgICAgICAgICAgICBkWyJub2RlTmFtZSJdID0gcXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgZFsidmFsdWUiXSA9IGRbIm5vZGVWYWx1ZSJdID0gdmFsdWUKKyAgICAgICAgICAgIGRbIm93bmVyRG9jdW1lbnQiXSA9IHNlbGYub3duZXJEb2N1bWVudAorICAgICAgICAgICAgc2VsZi5zZXRBdHRyaWJ1dGVOb2RlKGF0dHIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkID0gYXR0ci5fX2RpY3RfXworICAgICAgICAgICAgaWYgdmFsdWUgIT0gYXR0ci52YWx1ZToKKyAgICAgICAgICAgICAgICBkWyJ2YWx1ZSJdID0gZFsibm9kZVZhbHVlIl0gPSB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIGF0dHIuaXNJZDoKKyAgICAgICAgICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCisgICAgICAgICAgICBpZiBhdHRyLnByZWZpeCAhPSBwcmVmaXg6CisgICAgICAgICAgICAgICAgZFsicHJlZml4Il0gPSBwcmVmaXgKKyAgICAgICAgICAgICAgICBkWyJub2RlTmFtZSJdID0gcXVhbGlmaWVkTmFtZQorCisgICAgZGVmIGdldEF0dHJpYnV0ZU5vZGUoc2VsZiwgYXR0cm5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnMuZ2V0KGF0dHJuYW1lKQorCisgICAgZGVmIGdldEF0dHJpYnV0ZU5vZGVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc05TLmdldCgobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpKQorCisgICAgZGVmIHNldEF0dHJpYnV0ZU5vZGUoc2VsZiwgYXR0cik6CisgICAgICAgIGlmIGF0dHIub3duZXJFbGVtZW50IG5vdCBpbiAoTm9uZSwgc2VsZik6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkludXNlQXR0cmlidXRlRXJyKCJhdHRyaWJ1dGUgbm9kZSBhbHJlYWR5IG93bmVkIikKKyAgICAgICAgb2xkMSA9IHNlbGYuX2F0dHJzLmdldChhdHRyLm5hbWUsIE5vbmUpCisgICAgICAgIGlmIG9sZDEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnJlbW92ZUF0dHJpYnV0ZU5vZGUob2xkMSkKKyAgICAgICAgb2xkMiA9IHNlbGYuX2F0dHJzTlMuZ2V0KChhdHRyLm5hbWVzcGFjZVVSSSwgYXR0ci5sb2NhbE5hbWUpLCBOb25lKQorICAgICAgICBpZiBvbGQyIGlzIG5vdCBOb25lIGFuZCBvbGQyIGlzIG5vdCBvbGQxOgorICAgICAgICAgICAgc2VsZi5yZW1vdmVBdHRyaWJ1dGVOb2RlKG9sZDIpCisgICAgICAgIF9zZXRfYXR0cmlidXRlX25vZGUoc2VsZiwgYXR0cikKKworICAgICAgICBpZiBvbGQxIGlzIG5vdCBhdHRyOgorICAgICAgICAgICAgIyBJdCBtaWdodCBoYXZlIGFscmVhZHkgYmVlbiBwYXJ0IG9mIHRoaXMgbm9kZSwgaW4gd2hpY2ggY2FzZQorICAgICAgICAgICAgIyBpdCBkb2Vzbid0IHJlcHJlc2VudCBhIGNoYW5nZSwgYW5kIHNob3VsZCBub3QgYmUgcmV0dXJuZWQuCisgICAgICAgICAgICByZXR1cm4gb2xkMQorICAgICAgICBpZiBvbGQyIGlzIG5vdCBhdHRyOgorICAgICAgICAgICAgcmV0dXJuIG9sZDIKKworICAgIHNldEF0dHJpYnV0ZU5vZGVOUyA9IHNldEF0dHJpYnV0ZU5vZGUKKworICAgIGRlZiByZW1vdmVBdHRyaWJ1dGUoc2VsZiwgbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGF0dHIgPSBzZWxmLl9hdHRyc1tuYW1lXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgc2VsZi5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpCisKKyAgICBkZWYgcmVtb3ZlQXR0cmlidXRlTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhdHRyID0gc2VsZi5fYXR0cnNOU1sobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgc2VsZi5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpCisKKyAgICBkZWYgcmVtb3ZlQXR0cmlidXRlTm9kZShzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2F0dHJzW25vZGUubmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmKQorICAgICAgICBub2RlLnVubGluaygpCisgICAgICAgICMgUmVzdG9yZSB0aGlzIHNpbmNlIHRoZSBub2RlIGlzIHN0aWxsIHVzZWZ1bCBhbmQgb3RoZXJ3aXNlCisgICAgICAgICMgdW5saW5rZWQKKyAgICAgICAgbm9kZS5vd25lckRvY3VtZW50ID0gc2VsZi5vd25lckRvY3VtZW50CisKKyAgICByZW1vdmVBdHRyaWJ1dGVOb2RlTlMgPSByZW1vdmVBdHRyaWJ1dGVOb2RlCisKKyAgICBkZWYgaGFzQXR0cmlidXRlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZSBpbiBzZWxmLl9hdHRycworCisgICAgZGVmIGhhc0F0dHJpYnV0ZU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKKyAgICAgICAgcmV0dXJuIChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkgaW4gc2VsZi5fYXR0cnNOUworCisgICAgZGVmIGdldEVsZW1lbnRzQnlUYWdOYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gX2dldF9lbGVtZW50c19ieV90YWdOYW1lX2hlbHBlcihzZWxmLCBuYW1lLCBOb2RlTGlzdCgpKQorCisgICAgZGVmIGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICByZXR1cm4gX2dldF9lbGVtZW50c19ieV90YWdOYW1lX25zX2hlbHBlcigKKyAgICAgICAgICAgIHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lLCBOb2RlTGlzdCgpKQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjxET00gRWxlbWVudDogJXMgYXQgJSN4PiIgJSAoc2VsZi50YWdOYW1lLCBpZChzZWxmKSkKKworICAgIGRlZiB3cml0ZXhtbChzZWxmLCB3cml0ZXIsIGluZGVudD0iIiwgYWRkaW5kZW50PSIiLCBuZXdsPSIiKToKKyAgICAgICAgIyBpbmRlbnQgPSBjdXJyZW50IGluZGVudGF0aW9uCisgICAgICAgICMgYWRkaW5kZW50ID0gaW5kZW50YXRpb24gdG8gYWRkIHRvIGhpZ2hlciBsZXZlbHMKKyAgICAgICAgIyBuZXdsID0gbmV3bGluZSBzdHJpbmcKKyAgICAgICAgd3JpdGVyLndyaXRlKGluZGVudCsiPCIgKyBzZWxmLnRhZ05hbWUpCisKKyAgICAgICAgYXR0cnMgPSBzZWxmLl9nZXRfYXR0cmlidXRlcygpCisgICAgICAgIGFfbmFtZXMgPSBhdHRycy5rZXlzKCkKKyAgICAgICAgYV9uYW1lcy5zb3J0KCkKKworICAgICAgICBmb3IgYV9uYW1lIGluIGFfbmFtZXM6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiAlcz1cIiIgJSBhX25hbWUpCisgICAgICAgICAgICBfd3JpdGVfZGF0YSh3cml0ZXIsIGF0dHJzW2FfbmFtZV0udmFsdWUpCisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIlwiIikKKyAgICAgICAgaWYgc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgd3JpdGVyLndyaXRlKCI+IikKKyAgICAgICAgICAgIGlmIChsZW4oc2VsZi5jaGlsZE5vZGVzKSA9PSAxIGFuZAorICAgICAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlc1swXS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGlsZE5vZGVzWzBdLndyaXRleG1sKHdyaXRlciwgJycsICcnLCAnJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKG5ld2wpCisgICAgICAgICAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgICAgICAgICBub2RlLndyaXRleG1sKHdyaXRlciwgaW5kZW50K2FkZGluZGVudCwgYWRkaW5kZW50LCBuZXdsKQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZShpbmRlbnQpCisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIjwvJXM+JXMiICUgKHNlbGYudGFnTmFtZSwgbmV3bCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIi8+JXMiJShuZXdsKSkKKworICAgIGRlZiBfZ2V0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHJldHVybiBOYW1lZE5vZGVNYXAoc2VsZi5fYXR0cnMsIHNlbGYuX2F0dHJzTlMsIHNlbGYpCisKKyAgICBkZWYgaGFzQXR0cmlidXRlcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fYXR0cnM6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIERPTSBMZXZlbCAzIGF0dHJpYnV0ZXMsIGJhc2VkIG9uIHRoZSAyMiBPY3QgMjAwMiBkcmFmdAorCisgICAgZGVmIHNldElkQXR0cmlidXRlKHNlbGYsIG5hbWUpOgorICAgICAgICBpZEF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkKKyAgICAgICAgc2VsZi5zZXRJZEF0dHJpYnV0ZU5vZGUoaWRBdHRyKQorCisgICAgZGVmIHNldElkQXR0cmlidXRlTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICBpZEF0dHIgPSBzZWxmLmdldEF0dHJpYnV0ZU5vZGVOUyhuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkKKyAgICAgICAgc2VsZi5zZXRJZEF0dHJpYnV0ZU5vZGUoaWRBdHRyKQorCisgICAgZGVmIHNldElkQXR0cmlidXRlTm9kZShzZWxmLCBpZEF0dHIpOgorICAgICAgICBpZiBpZEF0dHIgaXMgTm9uZSBvciBub3Qgc2VsZi5pc1NhbWVOb2RlKGlkQXR0ci5vd25lckVsZW1lbnQpOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgIGlmIF9nZXRfY29udGFpbmluZ19lbnRyZWYoc2VsZikgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigpCisgICAgICAgIGlmIG5vdCBpZEF0dHIuX2lzX2lkOgorICAgICAgICAgICAgaWRBdHRyLl9fZGljdF9fWydfaXNfaWQnXSA9IFRydWUKKyAgICAgICAgICAgIHNlbGYuX21hZ2ljX2lkX25vZGVzICs9IDEKKyAgICAgICAgICAgIHNlbGYub3duZXJEb2N1bWVudC5fbWFnaWNfaWRfY291bnQgKz0gMQorICAgICAgICAgICAgX2NsZWFyX2lkX2NhY2hlKHNlbGYpCisKK2RlZnByb3BlcnR5KEVsZW1lbnQsICJhdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgIGRvYz0iTmFtZWROb2RlTWFwIG9mIGF0dHJpYnV0ZXMgb24gdGhlIGVsZW1lbnQuIikKK2RlZnByb3BlcnR5KEVsZW1lbnQsICJsb2NhbE5hbWUiLAorICAgICAgICAgICAgZG9jPSJOYW1lc3BhY2UtbG9jYWwgbmFtZSBvZiB0aGlzIGVsZW1lbnQuIikKKworCitkZWYgX3NldF9hdHRyaWJ1dGVfbm9kZShlbGVtZW50LCBhdHRyKToKKyAgICBfY2xlYXJfaWRfY2FjaGUoZWxlbWVudCkKKyAgICBlbGVtZW50Ll9hdHRyc1thdHRyLm5hbWVdID0gYXR0cgorICAgIGVsZW1lbnQuX2F0dHJzTlNbKGF0dHIubmFtZXNwYWNlVVJJLCBhdHRyLmxvY2FsTmFtZSldID0gYXR0cgorCisgICAgIyBUaGlzIGNyZWF0ZXMgYSBjaXJjdWxhciByZWZlcmVuY2UsIGJ1dCBFbGVtZW50LnVubGluaygpCisgICAgIyBicmVha3MgdGhlIGN5Y2xlIHNpbmNlIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBhdHRyaWJ1dGUKKyAgICAjIGRpY3Rpb25hcmllcyBhcmUgdG9zc2VkLgorICAgIGF0dHIuX19kaWN0X19bJ293bmVyRWxlbWVudCddID0gZWxlbWVudAorCisKK2NsYXNzIENoaWxkbGVzczoKKyAgICAiIiJNaXhpbiB0aGF0IG1ha2VzIGNoaWxkbGVzcy1uZXNzIGVhc3kgdG8gaW1wbGVtZW50IGFuZCBhdm9pZHMKKyAgICB0aGUgY29tcGxleGl0eSBvZiB0aGUgTm9kZSBtZXRob2RzIHRoYXQgZGVhbCB3aXRoIGNoaWxkcmVuLgorICAgICIiIgorCisgICAgYXR0cmlidXRlcyA9IE5vbmUKKyAgICBjaGlsZE5vZGVzID0gRW1wdHlOb2RlTGlzdCgpCisgICAgZmlyc3RDaGlsZCA9IE5vbmUKKyAgICBsYXN0Q2hpbGQgPSBOb25lCisKKyAgICBkZWYgX2dldF9maXJzdENoaWxkKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIF9nZXRfbGFzdENoaWxkKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5vZGUpOgorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICBzZWxmLm5vZGVOYW1lICsgIiBub2RlcyBjYW5ub3QgaGF2ZSBjaGlsZHJlbiIpCisKKyAgICBkZWYgaGFzQ2hpbGROb2RlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5ld0NoaWxkLCByZWZDaGlsZCk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGRvIG5vdCBoYXZlIGNoaWxkcmVuIikKKworICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBvbGRDaGlsZCk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoCisgICAgICAgICAgICBzZWxmLm5vZGVOYW1lICsgIiBub2RlcyBkbyBub3QgaGF2ZSBjaGlsZHJlbiIpCisKKyAgICBkZWYgbm9ybWFsaXplKHNlbGYpOgorICAgICAgICAjIEZvciBjaGlsZGxlc3Mgbm9kZXMsIG5vcm1hbGl6ZSgpIGhhcyBub3RoaW5nIHRvIGRvLgorICAgICAgICBwYXNzCisKKyAgICBkZWYgcmVwbGFjZUNoaWxkKHNlbGYsIG5ld0NoaWxkLCBvbGRDaGlsZCk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGRvIG5vdCBoYXZlIGNoaWxkcmVuIikKKworCitjbGFzcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oQ2hpbGRsZXNzLCBOb2RlKToKKyAgICBub2RlVHlwZSA9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgc2VsZi50YXJnZXQgPSBzZWxmLm5vZGVOYW1lID0gdGFyZ2V0CisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYubm9kZVZhbHVlID0gZGF0YQorCisgICAgZGVmIF9nZXRfZGF0YShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZGF0YQorICAgIGRlZiBfc2V0X2RhdGEoc2VsZiwgdmFsdWUpOgorICAgICAgICBkID0gc2VsZi5fX2RpY3RfXworICAgICAgICBkWydkYXRhJ10gPSBkWydub2RlVmFsdWUnXSA9IHZhbHVlCisKKyAgICBkZWYgX2dldF90YXJnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRhcmdldAorICAgIGRlZiBfc2V0X3RhcmdldChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGQgPSBzZWxmLl9fZGljdF9fCisgICAgICAgIGRbJ3RhcmdldCddID0gZFsnbm9kZU5hbWUnXSA9IHZhbHVlCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICBpZiBuYW1lID09ICJkYXRhIiBvciBuYW1lID09ICJub2RlVmFsdWUiOgorICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1snZGF0YSddID0gc2VsZi5fX2RpY3RfX1snbm9kZVZhbHVlJ10gPSB2YWx1ZQorICAgICAgICBlbGlmIG5hbWUgPT0gInRhcmdldCIgb3IgbmFtZSA9PSAibm9kZU5hbWUiOgorICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1sndGFyZ2V0J10gPSBzZWxmLl9fZGljdF9fWydub2RlTmFtZSddID0gdmFsdWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZQorCisgICAgZGVmIHdyaXRleG1sKHNlbGYsIHdyaXRlciwgaW5kZW50PSIiLCBhZGRpbmRlbnQ9IiIsIG5ld2w9IiIpOgorICAgICAgICB3cml0ZXIud3JpdGUoIiVzPD8lcyAlcz8+JXMiICUgKGluZGVudCxzZWxmLnRhcmdldCwgc2VsZi5kYXRhLCBuZXdsKSkKKworCitjbGFzcyBDaGFyYWN0ZXJEYXRhKENoaWxkbGVzcywgTm9kZSk6CisgICAgZGVmIF9nZXRfbGVuZ3RoKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGF0YSkKKyAgICBfX2xlbl9fID0gX2dldF9sZW5ndGgKKworICAgIGRlZiBfZ2V0X2RhdGEoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9fZGljdF9fWydkYXRhJ10KKyAgICBkZWYgX3NldF9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBkID0gc2VsZi5fX2RpY3RfXworICAgICAgICBkWydkYXRhJ10gPSBkWydub2RlVmFsdWUnXSA9IGRhdGEKKworICAgIF9nZXRfbm9kZVZhbHVlID0gX2dldF9kYXRhCisgICAgX3NldF9ub2RlVmFsdWUgPSBfc2V0X2RhdGEKKworICAgIGRlZiBfX3NldGF0dHJfXyhzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgIGlmIG5hbWUgPT0gImRhdGEiIG9yIG5hbWUgPT0gIm5vZGVWYWx1ZSI6CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fWydkYXRhJ10gPSBzZWxmLl9fZGljdF9fWydub2RlVmFsdWUnXSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fW25hbWVdID0gdmFsdWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgZGF0YSA9IHNlbGYuZGF0YQorICAgICAgICBpZiBsZW4oZGF0YSkgPiAxMDoKKyAgICAgICAgICAgIGRvdGRvdGRvdCA9ICIuLi4iCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkb3Rkb3Rkb3QgPSAiIgorICAgICAgICByZXR1cm4gJzxET00gJXMgbm9kZSAiJXIlcyI+JyAlICgKKyAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBkYXRhWzA6MTBdLCBkb3Rkb3Rkb3QpCisKKyAgICBkZWYgc3Vic3RyaW5nRGF0YShzZWxmLCBvZmZzZXQsIGNvdW50KToKKyAgICAgICAgaWYgb2Zmc2V0IDwgMDoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgaWYgb2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKKyAgICAgICAgaWYgY291bnQgPCAwOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgIHJldHVybiBzZWxmLmRhdGFbb2Zmc2V0Om9mZnNldCtjb3VudF0KKworICAgIGRlZiBhcHBlbmREYXRhKHNlbGYsIGFyZyk6CisgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YSArIGFyZworCisgICAgZGVmIGluc2VydERhdGEoc2VsZiwgb2Zmc2V0LCBhcmcpOgorICAgICAgICBpZiBvZmZzZXQgPCAwOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICBpZiBvZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQorICAgICAgICBpZiBhcmc6CisgICAgICAgICAgICBzZWxmLmRhdGEgPSAiJXMlcyVzIiAlICgKKyAgICAgICAgICAgICAgICBzZWxmLmRhdGFbOm9mZnNldF0sIGFyZywgc2VsZi5kYXRhW29mZnNldDpdKQorCisgICAgZGVmIGRlbGV0ZURhdGEoc2VsZiwgb2Zmc2V0LCBjb3VudCk6CisgICAgICAgIGlmIG9mZnNldCA8IDA6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCisgICAgICAgIGlmIGNvdW50IDwgMDoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJjb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICBpZiBjb3VudDoKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6b2Zmc2V0XSArIHNlbGYuZGF0YVtvZmZzZXQrY291bnQ6XQorCisgICAgZGVmIHJlcGxhY2VEYXRhKHNlbGYsIG9mZnNldCwgY291bnQsIGFyZyk6CisgICAgICAgIGlmIG9mZnNldCA8IDA6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCisgICAgICAgIGlmIGNvdW50IDwgMDoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJjb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICBpZiBjb3VudDoKKyAgICAgICAgICAgIHNlbGYuZGF0YSA9ICIlcyVzJXMiICUgKAorICAgICAgICAgICAgICAgIHNlbGYuZGF0YVs6b2Zmc2V0XSwgYXJnLCBzZWxmLmRhdGFbb2Zmc2V0K2NvdW50Ol0pCisKK2RlZnByb3BlcnR5KENoYXJhY3RlckRhdGEsICJsZW5ndGgiLCBkb2M9Ikxlbmd0aCBvZiB0aGUgc3RyaW5nIGRhdGEuIikKKworCitjbGFzcyBUZXh0KENoYXJhY3RlckRhdGEpOgorICAgICMgTWFrZSBzdXJlIHdlIGRvbid0IGFkZCBhbiBpbnN0YW5jZSBfX2RpY3RfXyBpZiB3ZSBkb24ndCBhbHJlYWR5CisgICAgIyBoYXZlIG9uZSwgYXQgbGVhc3Qgd2hlbiB0aGF0J3MgcG9zc2libGU6CisgICAgIyBYWFggdGhpcyBkb2VzIG5vdCB3b3JrLCBDaGFyYWN0ZXJEYXRhIGlzIGFuIG9sZC1zdHlsZSBjbGFzcworICAgICMgX19zbG90c19fID0gKCkKKworICAgIG5vZGVUeXBlID0gTm9kZS5URVhUX05PREUKKyAgICBub2RlTmFtZSA9ICIjdGV4dCIKKyAgICBhdHRyaWJ1dGVzID0gTm9uZQorCisgICAgZGVmIHNwbGl0VGV4dChzZWxmLCBvZmZzZXQpOgorICAgICAgICBpZiBvZmZzZXQgPCAwIG9yIG9mZnNldCA+IGxlbihzZWxmLmRhdGEpOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImlsbGVnYWwgb2Zmc2V0IHZhbHVlIikKKyAgICAgICAgbmV3VGV4dCA9IHNlbGYuX19jbGFzc19fKCkKKyAgICAgICAgbmV3VGV4dC5kYXRhID0gc2VsZi5kYXRhW29mZnNldDpdCisgICAgICAgIG5ld1RleHQub3duZXJEb2N1bWVudCA9IHNlbGYub3duZXJEb2N1bWVudAorICAgICAgICBuZXh0ID0gc2VsZi5uZXh0U2libGluZworICAgICAgICBpZiBzZWxmLnBhcmVudE5vZGUgYW5kIHNlbGYgaW4gc2VsZi5wYXJlbnROb2RlLmNoaWxkTm9kZXM6CisgICAgICAgICAgICBpZiBuZXh0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wYXJlbnROb2RlLmFwcGVuZENoaWxkKG5ld1RleHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3VGV4dCwgbmV4dCkKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5kYXRhWzpvZmZzZXRdCisgICAgICAgIHJldHVybiBuZXdUZXh0CisKKyAgICBkZWYgd3JpdGV4bWwoc2VsZiwgd3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIik6CisgICAgICAgIF93cml0ZV9kYXRhKHdyaXRlciwgIiVzJXMlcyIgJSAoaW5kZW50LCBzZWxmLmRhdGEsIG5ld2wpKQorCisgICAgIyBET00gTGV2ZWwgMyAoV0QgOSBBcHJpbCAyMDAyKQorCisgICAgZGVmIF9nZXRfd2hvbGVUZXh0KHNlbGYpOgorICAgICAgICBMID0gW3NlbGYuZGF0YV0KKyAgICAgICAgbiA9IHNlbGYucHJldmlvdXNTaWJsaW5nCisgICAgICAgIHdoaWxlIG4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBuLm5vZGVUeXBlIGluIChOb2RlLlRFWFRfTk9ERSwgTm9kZS5DREFUQV9TRUNUSU9OX05PREUpOgorICAgICAgICAgICAgICAgIEwuaW5zZXJ0KDAsIG4uZGF0YSkKKyAgICAgICAgICAgICAgICBuID0gbi5wcmV2aW91c1NpYmxpbmcKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbiA9IHNlbGYubmV4dFNpYmxpbmcKKyAgICAgICAgd2hpbGUgbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG4ubm9kZVR5cGUgaW4gKE5vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk6CisgICAgICAgICAgICAgICAgTC5hcHBlbmQobi5kYXRhKQorICAgICAgICAgICAgICAgIG4gPSBuLm5leHRTaWJsaW5nCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiAnJy5qb2luKEwpCisKKyAgICBkZWYgcmVwbGFjZVdob2xlVGV4dChzZWxmLCBjb250ZW50KToKKyAgICAgICAgIyBYWFggVGhpcyBuZWVkcyB0byBiZSBzZXJpb3VzbHkgY2hhbmdlZCBpZiBtaW5pZG9tIGV2ZXIKKyAgICAgICAgIyBzdXBwb3J0cyBFbnRpdHlSZWZlcmVuY2Ugbm9kZXMuCisgICAgICAgIHBhcmVudCA9IHNlbGYucGFyZW50Tm9kZQorICAgICAgICBuID0gc2VsZi5wcmV2aW91c1NpYmxpbmcKKyAgICAgICAgd2hpbGUgbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG4ubm9kZVR5cGUgaW4gKE5vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk6CisgICAgICAgICAgICAgICAgbmV4dCA9IG4ucHJldmlvdXNTaWJsaW5nCisgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pCisgICAgICAgICAgICAgICAgbiA9IG5leHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgbiA9IHNlbGYubmV4dFNpYmxpbmcKKyAgICAgICAgaWYgbm90IGNvbnRlbnQ6CisgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoc2VsZikKKyAgICAgICAgd2hpbGUgbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG4ubm9kZVR5cGUgaW4gKE5vZGUuVEVYVF9OT0RFLCBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSk6CisgICAgICAgICAgICAgICAgbmV4dCA9IG4ubmV4dFNpYmxpbmcKKyAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQobikKKyAgICAgICAgICAgICAgICBuID0gbmV4dAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBpZiBjb250ZW50OgorICAgICAgICAgICAgZCA9IHNlbGYuX19kaWN0X18KKyAgICAgICAgICAgIGRbJ2RhdGEnXSA9IGNvbnRlbnQKKyAgICAgICAgICAgIGRbJ25vZGVWYWx1ZSddID0gY29udGVudAorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgX2dldF9pc1doaXRlc3BhY2VJbkVsZW1lbnRDb250ZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRhdGEuc3RyaXAoKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBlbGVtID0gX2dldF9jb250YWluaW5nX2VsZW1lbnQoc2VsZikKKyAgICAgICAgaWYgZWxlbSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGluZm8gPSBzZWxmLm93bmVyRG9jdW1lbnQuX2dldF9lbGVtX2luZm8oZWxlbSkKKyAgICAgICAgaWYgaW5mbyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gaW5mby5pc0VsZW1lbnRDb250ZW50KCkKKworZGVmcHJvcGVydHkoVGV4dCwgImlzV2hpdGVzcGFjZUluRWxlbWVudENvbnRlbnQiLAorICAgICAgICAgICAgZG9jPSJUcnVlIGlmZiB0aGlzIHRleHQgbm9kZSBjb250YWlucyBvbmx5IHdoaXRlc3BhY2UiCisgICAgICAgICAgICAgICAgIiBhbmQgaXMgaW4gZWxlbWVudCBjb250ZW50LiIpCitkZWZwcm9wZXJ0eShUZXh0LCAid2hvbGVUZXh0IiwKKyAgICAgICAgICAgIGRvYz0iVGhlIHRleHQgb2YgYWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0IG5vZGVzLiIpCisKKworZGVmIF9nZXRfY29udGFpbmluZ19lbGVtZW50KG5vZGUpOgorICAgIGMgPSBub2RlLnBhcmVudE5vZGUKKyAgICB3aGlsZSBjIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBjLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgorICAgICAgICAgICAgcmV0dXJuIGMKKyAgICAgICAgYyA9IGMucGFyZW50Tm9kZQorICAgIHJldHVybiBOb25lCisKK2RlZiBfZ2V0X2NvbnRhaW5pbmdfZW50cmVmKG5vZGUpOgorICAgIGMgPSBub2RlLnBhcmVudE5vZGUKKyAgICB3aGlsZSBjIGlzIG5vdCBOb25lOgorICAgICAgICBpZiBjLm5vZGVUeXBlID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFOgorICAgICAgICAgICAgcmV0dXJuIGMKKyAgICAgICAgYyA9IGMucGFyZW50Tm9kZQorICAgIHJldHVybiBOb25lCisKKworY2xhc3MgQ29tbWVudChDaGlsZGxlc3MsIENoYXJhY3RlckRhdGEpOgorICAgIG5vZGVUeXBlID0gTm9kZS5DT01NRU5UX05PREUKKyAgICBub2RlTmFtZSA9ICIjY29tbWVudCIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gc2VsZi5ub2RlVmFsdWUgPSBkYXRhCisKKyAgICBkZWYgd3JpdGV4bWwoc2VsZiwgd3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIik6CisgICAgICAgIGlmICItLSIgaW4gc2VsZi5kYXRhOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJy0tJyBpcyBub3QgYWxsb3dlZCBpbiBhIGNvbW1lbnQgbm9kZSIpCisgICAgICAgIHdyaXRlci53cml0ZSgiJXM8IS0tJXMtLT4lcyIgJSAoaW5kZW50LCBzZWxmLmRhdGEsIG5ld2wpKQorCisKK2NsYXNzIENEQVRBU2VjdGlvbihUZXh0KToKKyAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBhZGQgYW4gaW5zdGFuY2UgX19kaWN0X18gaWYgd2UgZG9uJ3QgYWxyZWFkeQorICAgICMgaGF2ZSBvbmUsIGF0IGxlYXN0IHdoZW4gdGhhdCdzIHBvc3NpYmxlOgorICAgICMgWFhYIHRoaXMgZG9lcyBub3Qgd29yaywgVGV4dCBpcyBhbiBvbGQtc3R5bGUgY2xhc3MKKyAgICAjIF9fc2xvdHNfXyA9ICgpCisKKyAgICBub2RlVHlwZSA9IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFCisgICAgbm9kZU5hbWUgPSAiI2NkYXRhLXNlY3Rpb24iCisKKyAgICBkZWYgd3JpdGV4bWwoc2VsZiwgd3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIik6CisgICAgICAgIGlmIHNlbGYuZGF0YS5maW5kKCJdXT4iKSA+PSAwOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiJ11dPicgbm90IGFsbG93ZWQgaW4gYSBDREFUQSBzZWN0aW9uIikKKyAgICAgICAgd3JpdGVyLndyaXRlKCI8IVtDREFUQVslc11dPiIgJSBzZWxmLmRhdGEpCisKKworY2xhc3MgUmVhZE9ubHlTZXF1ZW50aWFsTmFtZWROb2RlTWFwKG9iamVjdCk6CisgICAgX19zbG90c19fID0gJ19zZXEnLAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcT0oKSk6CisgICAgICAgICMgc2VxIHNob3VsZCBiZSBhIGxpc3Qgb3IgdHVwbGUKKyAgICAgICAgc2VsZi5fc2VxID0gc2VxCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9zZXEpCisKKyAgICBkZWYgX2dldF9sZW5ndGgoc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fc2VxKQorCisgICAgZGVmIGdldE5hbWVkSXRlbShzZWxmLCBuYW1lKToKKyAgICAgICAgZm9yIG4gaW4gc2VsZi5fc2VxOgorICAgICAgICAgICAgaWYgbi5ub2RlTmFtZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBuCisKKyAgICBkZWYgZ2V0TmFtZWRJdGVtTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICBmb3IgbiBpbiBzZWxmLl9zZXE6CisgICAgICAgICAgICBpZiBuLm5hbWVzcGFjZVVSSSA9PSBuYW1lc3BhY2VVUkkgYW5kIG4ubG9jYWxOYW1lID09IGxvY2FsTmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gbgorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWVfb3JfdHVwbGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVfb3JfdHVwbGUsIHR1cGxlKToKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLmdldE5hbWVkSXRlbU5TKCpuYW1lX29yX3R1cGxlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuZ2V0TmFtZWRJdGVtKG5hbWVfb3JfdHVwbGUpCisgICAgICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCBuYW1lX29yX3R1cGxlCisgICAgICAgIHJldHVybiBub2RlCisKKyAgICBkZWYgaXRlbShzZWxmLCBpbmRleCk6CisgICAgICAgIGlmIGluZGV4IDwgMDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9zZXFbaW5kZXhdCisgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiByZW1vdmVOYW1lZEl0ZW0oc2VsZiwgbmFtZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgIk5hbWVkTm9kZU1hcCBpbnN0YW5jZSBpcyByZWFkLW9ubHkiKQorCisgICAgZGVmIHJlbW92ZU5hbWVkSXRlbU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCisKKyAgICBkZWYgc2V0TmFtZWRJdGVtKHNlbGYsIG5vZGUpOgorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgICAgICJOYW1lZE5vZGVNYXAgaW5zdGFuY2UgaXMgcmVhZC1vbmx5IikKKworICAgIGRlZiBzZXROYW1lZEl0ZW1OUyhzZWxmLCBub2RlKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCisKKyAgICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgorICAgICAgICByZXR1cm4gW3NlbGYuX3NlcV0KKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmLl9zZXEgPSBzdGF0ZVswXQorCitkZWZwcm9wZXJ0eShSZWFkT25seVNlcXVlbnRpYWxOYW1lZE5vZGVNYXAsICJsZW5ndGgiLAorICAgICAgICAgICAgZG9jPSJOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgTmFtZWROb2RlTWFwLiIpCisKKworY2xhc3MgSWRlbnRpZmllZDoKKyAgICAiIiJNaXgtaW4gY2xhc3MgdGhhdCBzdXBwb3J0cyB0aGUgcHVibGljSWQgYW5kIHN5c3RlbUlkIGF0dHJpYnV0ZXMuIiIiCisKKyAgICAjIFhYWCB0aGlzIGRvZXMgbm90IHdvcmssIHRoaXMgaXMgYW4gb2xkLXN0eWxlIGNsYXNzCisgICAgIyBfX3Nsb3RzX18gPSAncHVibGljSWQnLCAnc3lzdGVtSWQnCisKKyAgICBkZWYgX2lkZW50aWZpZWRfbWl4aW5faW5pdChzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICBzZWxmLnB1YmxpY0lkID0gcHVibGljSWQKKyAgICAgICAgc2VsZi5zeXN0ZW1JZCA9IHN5c3RlbUlkCisKKyAgICBkZWYgX2dldF9wdWJsaWNJZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHVibGljSWQKKworICAgIGRlZiBfZ2V0X3N5c3RlbUlkKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zeXN0ZW1JZAorCitjbGFzcyBEb2N1bWVudFR5cGUoSWRlbnRpZmllZCwgQ2hpbGRsZXNzLCBOb2RlKToKKyAgICBub2RlVHlwZSA9IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFCisgICAgbm9kZVZhbHVlID0gTm9uZQorICAgIG5hbWUgPSBOb25lCisgICAgcHVibGljSWQgPSBOb25lCisgICAgc3lzdGVtSWQgPSBOb25lCisgICAgaW50ZXJuYWxTdWJzZXQgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcXVhbGlmaWVkTmFtZSk6CisgICAgICAgIHNlbGYuZW50aXRpZXMgPSBSZWFkT25seVNlcXVlbnRpYWxOYW1lZE5vZGVNYXAoKQorICAgICAgICBzZWxmLm5vdGF0aW9ucyA9IFJlYWRPbmx5U2VxdWVudGlhbE5hbWVkTm9kZU1hcCgpCisgICAgICAgIGlmIHF1YWxpZmllZE5hbWU6CisgICAgICAgICAgICBwcmVmaXgsIGxvY2FsbmFtZSA9IF9uc3NwbGl0KHF1YWxpZmllZE5hbWUpCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBsb2NhbG5hbWUKKyAgICAgICAgc2VsZi5ub2RlTmFtZSA9IHNlbGYubmFtZQorCisgICAgZGVmIF9nZXRfaW50ZXJuYWxTdWJzZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludGVybmFsU3Vic2V0CisKKyAgICBkZWYgY2xvbmVOb2RlKHNlbGYsIGRlZXApOgorICAgICAgICBpZiBzZWxmLm93bmVyRG9jdW1lbnQgaXMgTm9uZToKKyAgICAgICAgICAgICMgaXQncyBvaworICAgICAgICAgICAgY2xvbmUgPSBEb2N1bWVudFR5cGUoTm9uZSkKKyAgICAgICAgICAgIGNsb25lLm5hbWUgPSBzZWxmLm5hbWUKKyAgICAgICAgICAgIGNsb25lLm5vZGVOYW1lID0gc2VsZi5uYW1lCisgICAgICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRAorICAgICAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgICAgICBjbG9uZS5lbnRpdGllcy5fc2VxID0gW10KKyAgICAgICAgICAgICAgICBjbG9uZS5ub3RhdGlvbnMuX3NlcSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIG4gaW4gc2VsZi5ub3RhdGlvbnMuX3NlcToKKyAgICAgICAgICAgICAgICAgICAgbm90YXRpb24gPSBOb3RhdGlvbihuLm5vZGVOYW1lLCBuLnB1YmxpY0lkLCBuLnN5c3RlbUlkKQorICAgICAgICAgICAgICAgICAgICBjbG9uZS5ub3RhdGlvbnMuX3NlcS5hcHBlbmQobm90YXRpb24pCisgICAgICAgICAgICAgICAgICAgIG4uX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIob3BlcmF0aW9uLCBuLCBub3RhdGlvbikKKyAgICAgICAgICAgICAgICBmb3IgZSBpbiBzZWxmLmVudGl0aWVzLl9zZXE6CisgICAgICAgICAgICAgICAgICAgIGVudGl0eSA9IEVudGl0eShlLm5vZGVOYW1lLCBlLnB1YmxpY0lkLCBlLnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5ub3RhdGlvbk5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVudGl0eS5hY3R1YWxFbmNvZGluZyA9IGUuYWN0dWFsRW5jb2RpbmcKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5LmVuY29kaW5nID0gZS5lbmNvZGluZworICAgICAgICAgICAgICAgICAgICBlbnRpdHkudmVyc2lvbiA9IGUudmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBjbG9uZS5lbnRpdGllcy5fc2VxLmFwcGVuZChlbnRpdHkpCisgICAgICAgICAgICAgICAgICAgIGUuX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIob3BlcmF0aW9uLCBuLCBlbnRpdHkpCisgICAgICAgICAgICBzZWxmLl9jYWxsX3VzZXJfZGF0YV9oYW5kbGVyKG9wZXJhdGlvbiwgc2VsZiwgY2xvbmUpCisgICAgICAgICAgICByZXR1cm4gY2xvbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgd3JpdGV4bWwoc2VsZiwgd3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIik6CisgICAgICAgIHdyaXRlci53cml0ZSgiPCFET0NUWVBFICIpCisgICAgICAgIHdyaXRlci53cml0ZShzZWxmLm5hbWUpCisgICAgICAgIGlmIHNlbGYucHVibGljSWQ6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiVzICBQVUJMSUMgJyVzJyVzICAnJXMnIgorICAgICAgICAgICAgICAgICAgICAgICAgICUgKG5ld2wsIHNlbGYucHVibGljSWQsIG5ld2wsIHNlbGYuc3lzdGVtSWQpKQorICAgICAgICBlbGlmIHNlbGYuc3lzdGVtSWQ6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiVzICBTWVNURU0gJyVzJyIgJSAobmV3bCwgc2VsZi5zeXN0ZW1JZCkpCisgICAgICAgIGlmIHNlbGYuaW50ZXJuYWxTdWJzZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIiBbIikKKyAgICAgICAgICAgIHdyaXRlci53cml0ZShzZWxmLmludGVybmFsU3Vic2V0KQorICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJdIikKKyAgICAgICAgd3JpdGVyLndyaXRlKCI+IituZXdsKQorCitjbGFzcyBFbnRpdHkoSWRlbnRpZmllZCwgTm9kZSk6CisgICAgYXR0cmlidXRlcyA9IE5vbmUKKyAgICBub2RlVHlwZSA9IE5vZGUuRU5USVRZX05PREUKKyAgICBub2RlVmFsdWUgPSBOb25lCisKKyAgICBhY3R1YWxFbmNvZGluZyA9IE5vbmUKKyAgICBlbmNvZGluZyA9IE5vbmUKKyAgICB2ZXJzaW9uID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbm90YXRpb24pOgorICAgICAgICBzZWxmLm5vZGVOYW1lID0gbmFtZQorICAgICAgICBzZWxmLm5vdGF0aW9uTmFtZSA9IG5vdGF0aW9uCisgICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IE5vZGVMaXN0KCkKKyAgICAgICAgc2VsZi5faWRlbnRpZmllZF9taXhpbl9pbml0KHB1YmxpY0lkLCBzeXN0ZW1JZCkKKworICAgIGRlZiBfZ2V0X2FjdHVhbEVuY29kaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5hY3R1YWxFbmNvZGluZworCisgICAgZGVmIF9nZXRfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmVuY29kaW5nCisKKyAgICBkZWYgX2dldF92ZXJzaW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52ZXJzaW9uCisKKyAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbmV3Q2hpbGQpOgorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICAiY2Fubm90IGFwcGVuZCBjaGlsZHJlbiB0byBhbiBlbnRpdHkgbm9kZSIpCisKKyAgICBkZWYgaW5zZXJ0QmVmb3JlKHNlbGYsIG5ld0NoaWxkLCByZWZDaGlsZCk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICJjYW5ub3QgaW5zZXJ0IGNoaWxkcmVuIGJlbG93IGFuIGVudGl0eSBub2RlIikKKworICAgIGRlZiByZW1vdmVDaGlsZChzZWxmLCBvbGRDaGlsZCk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICJjYW5ub3QgcmVtb3ZlIGNoaWxkcmVuIGZyb20gYW4gZW50aXR5IG5vZGUiKQorCisgICAgZGVmIHJlcGxhY2VDaGlsZChzZWxmLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOgorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICAiY2Fubm90IHJlcGxhY2UgY2hpbGRyZW4gb2YgYW4gZW50aXR5IG5vZGUiKQorCitjbGFzcyBOb3RhdGlvbihJZGVudGlmaWVkLCBDaGlsZGxlc3MsIE5vZGUpOgorICAgIG5vZGVUeXBlID0gTm9kZS5OT1RBVElPTl9OT0RFCisgICAgbm9kZVZhbHVlID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgIHNlbGYubm9kZU5hbWUgPSBuYW1lCisgICAgICAgIHNlbGYuX2lkZW50aWZpZWRfbWl4aW5faW5pdChwdWJsaWNJZCwgc3lzdGVtSWQpCisKKworY2xhc3MgRE9NSW1wbGVtZW50YXRpb24oRE9NSW1wbGVtZW50YXRpb25MUyk6CisgICAgX2ZlYXR1cmVzID0gWygiY29yZSIsICIxLjAiKSwKKyAgICAgICAgICAgICAgICAgKCJjb3JlIiwgIjIuMCIpLAorICAgICAgICAgICAgICAgICAoImNvcmUiLCBOb25lKSwKKyAgICAgICAgICAgICAgICAgKCJ4bWwiLCAiMS4wIiksCisgICAgICAgICAgICAgICAgICgieG1sIiwgIjIuMCIpLAorICAgICAgICAgICAgICAgICAoInhtbCIsIE5vbmUpLAorICAgICAgICAgICAgICAgICAoImxzLWxvYWQiLCAiMy4wIiksCisgICAgICAgICAgICAgICAgICgibHMtbG9hZCIsIE5vbmUpLAorICAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgaGFzRmVhdHVyZShzZWxmLCBmZWF0dXJlLCB2ZXJzaW9uKToKKyAgICAgICAgaWYgdmVyc2lvbiA9PSAiIjoKKyAgICAgICAgICAgIHZlcnNpb24gPSBOb25lCisgICAgICAgIHJldHVybiAoZmVhdHVyZS5sb3dlcigpLCB2ZXJzaW9uKSBpbiBzZWxmLl9mZWF0dXJlcworCisgICAgZGVmIGNyZWF0ZURvY3VtZW50KHNlbGYsIG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSwgZG9jdHlwZSk6CisgICAgICAgIGlmIGRvY3R5cGUgYW5kIGRvY3R5cGUucGFyZW50Tm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uV3JvbmdEb2N1bWVudEVycigKKyAgICAgICAgICAgICAgICAiZG9jdHlwZSBvYmplY3Qgb3duZWQgYnkgYW5vdGhlciBET00gdHJlZSIpCisgICAgICAgIGRvYyA9IHNlbGYuX2NyZWF0ZV9kb2N1bWVudCgpCisKKyAgICAgICAgYWRkX3Jvb3RfZWxlbWVudCA9IG5vdCAobmFtZXNwYWNlVVJJIGlzIE5vbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHF1YWxpZmllZE5hbWUgaXMgTm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgZG9jdHlwZSBpcyBOb25lKQorCisgICAgICAgIGlmIG5vdCBxdWFsaWZpZWROYW1lIGFuZCBhZGRfcm9vdF9lbGVtZW50OgorICAgICAgICAgICAgIyBUaGUgc3BlYyBpcyB1bmNsZWFyIHdoYXQgdG8gcmFpc2UgaGVyZTsgU3ludGF4RXJyCisgICAgICAgICAgICAjIHdvdWxkIGJlIHRoZSBvdGhlciBvYnZpb3VzIGNhbmRpZGF0ZS4gU2luY2UgWGVyY2VzIHJhaXNlcworICAgICAgICAgICAgIyBJbnZhbGlkQ2hhcmFjdGVyRXJyLCBhbmQgc2luY2UgU3ludGF4RXJyIGlzIG5vdCBsaXN0ZWQKKyAgICAgICAgICAgICMgZm9yIGNyZWF0ZURvY3VtZW50LCB0aGF0IHNlZW1zIHRvIGJlIHRoZSBiZXR0ZXIgY2hvaWNlLgorICAgICAgICAgICAgIyBYWFg6IG5lZWQgdG8gY2hlY2sgZm9yIGlsbGVnYWwgY2hhcmFjdGVycyBoZXJlIGFuZCBpbgorICAgICAgICAgICAgIyBjcmVhdGVFbGVtZW50LgorCisgICAgICAgICAgICAjIERPTSBMZXZlbCBJSUkgY2xlYXJzIHRoaXMgdXAgd2hlbiB0YWxraW5nIGFib3V0IHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgICMgb2YgdGhpcyBmdW5jdGlvbi4gIElmIG5hbWVzcGFjZVVSSSwgcU5hbWUgYW5kIERvY1R5cGUgYXJlCisgICAgICAgICAgICAjIE51bGwgdGhlIGRvY3VtZW50IGlzIHJldHVybmVkIHdpdGhvdXQgYSBkb2N1bWVudCBlbGVtZW50CisgICAgICAgICAgICAjIE90aGVyd2lzZSBpZiBkb2N0eXBlIG9yIG5hbWVzcGFjZVVSSSBhcmUgbm90IE5vbmUKKyAgICAgICAgICAgICMgVGhlbiB3ZSBnbyBiYWNrIHRvIHRoZSBhYm92ZSBwcm9ibGVtCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkludmFsaWRDaGFyYWN0ZXJFcnIoIkVsZW1lbnQgd2l0aCBubyBuYW1lIikKKworICAgICAgICBpZiBhZGRfcm9vdF9lbGVtZW50OgorICAgICAgICAgICAgcHJlZml4LCBsb2NhbG5hbWUgPSBfbnNzcGxpdChxdWFsaWZpZWROYW1lKQorICAgICAgICAgICAgaWYgcHJlZml4ID09ICJ4bWwiIFwKKyAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSI6CisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoImlsbGVnYWwgdXNlIG9mICd4bWwnIHByZWZpeCIpCisgICAgICAgICAgICBpZiBwcmVmaXggYW5kIG5vdCBuYW1lc3BhY2VVUkk6CisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoCisgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHVzZSBvZiBwcmVmaXggd2l0aG91dCBuYW1lc3BhY2VzIikKKyAgICAgICAgICAgIGVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG5hbWVzcGFjZVVSSSwgcXVhbGlmaWVkTmFtZSkKKyAgICAgICAgICAgIGlmIGRvY3R5cGU6CisgICAgICAgICAgICAgICAgZG9jLmFwcGVuZENoaWxkKGRvY3R5cGUpCisgICAgICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoZWxlbWVudCkKKworICAgICAgICBpZiBkb2N0eXBlOgorICAgICAgICAgICAgZG9jdHlwZS5wYXJlbnROb2RlID0gZG9jdHlwZS5vd25lckRvY3VtZW50ID0gZG9jCisKKyAgICAgICAgZG9jLmRvY3R5cGUgPSBkb2N0eXBlCisgICAgICAgIGRvYy5pbXBsZW1lbnRhdGlvbiA9IHNlbGYKKyAgICAgICAgcmV0dXJuIGRvYworCisgICAgZGVmIGNyZWF0ZURvY3VtZW50VHlwZShzZWxmLCBxdWFsaWZpZWROYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICBkb2N0eXBlID0gRG9jdW1lbnRUeXBlKHF1YWxpZmllZE5hbWUpCisgICAgICAgIGRvY3R5cGUucHVibGljSWQgPSBwdWJsaWNJZAorICAgICAgICBkb2N0eXBlLnN5c3RlbUlkID0gc3lzdGVtSWQKKyAgICAgICAgcmV0dXJuIGRvY3R5cGUKKworICAgICMgRE9NIExldmVsIDMgKFdEIDkgQXByaWwgMjAwMikKKworICAgIGRlZiBnZXRJbnRlcmZhY2Uoc2VsZiwgZmVhdHVyZSk6CisgICAgICAgIGlmIHNlbGYuaGFzRmVhdHVyZShmZWF0dXJlLCBOb25lKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBpbnRlcm5hbAorICAgIGRlZiBfY3JlYXRlX2RvY3VtZW50KHNlbGYpOgorICAgICAgICByZXR1cm4gRG9jdW1lbnQoKQorCitjbGFzcyBFbGVtZW50SW5mbyhvYmplY3QpOgorICAgICIiIk9iamVjdCB0aGF0IHJlcHJlc2VudHMgY29udGVudC1tb2RlbCBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudC4KKworICAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gcHJhY3RpY2U7IERPTQorICAgIGJ1aWxkZXJzIHNob3VsZCBwcm92aWRlIGltcGxlbWVudGF0aW9ucyB3aGljaCBkbyB0aGUgcmlnaHQgdGhpbmcKKyAgICB1c2luZyBpbmZvcm1hdGlvbiBhdmFpbGFibGUgdG8gaXQuCisKKyAgICAiIiIKKworICAgIF9fc2xvdHNfXyA9ICd0YWdOYW1lJywKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi50YWdOYW1lID0gbmFtZQorCisgICAgZGVmIGdldEF0dHJpYnV0ZVR5cGUoc2VsZiwgYW5hbWUpOgorICAgICAgICByZXR1cm4gX25vX3R5cGUKKworICAgIGRlZiBnZXRBdHRyaWJ1dGVUeXBlTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgorICAgICAgICByZXR1cm4gX25vX3R5cGUKKworICAgIGRlZiBpc0VsZW1lbnRDb250ZW50KHNlbGYpOgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBpc0VtcHR5KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm5zIHRydWUgaWZmIHRoaXMgZWxlbWVudCBpcyBkZWNsYXJlZCB0byBoYXZlIGFuIEVNUFRZCisgICAgICAgIGNvbnRlbnQgbW9kZWwuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGlzSWQoc2VsZiwgYW5hbWUpOgorICAgICAgICAiIiJSZXR1cm5zIHRydWUgaWZmIHRoZSBuYW1lZCBhdHRyaWJ1dGUgaXMgYSBEVEQtc3R5bGUgSUQuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGlzSWROUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgICIiIlJldHVybnMgdHJ1ZSBpZmYgdGhlIGlkZW50aWZpZWQgYXR0cmlidXRlIGlzIGEgRFRELXN0eWxlIElELiIiIgorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRhZ05hbWUKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmLnRhZ05hbWUgPSBzdGF0ZQorCitkZWYgX2NsZWFyX2lkX2NhY2hlKG5vZGUpOgorICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFOgorICAgICAgICBub2RlLl9pZF9jYWNoZS5jbGVhcigpCisgICAgICAgIG5vZGUuX2lkX3NlYXJjaF9zdGFjayA9IE5vbmUKKyAgICBlbGlmIF9pbl9kb2N1bWVudChub2RlKToKKyAgICAgICAgbm9kZS5vd25lckRvY3VtZW50Ll9pZF9jYWNoZS5jbGVhcigpCisgICAgICAgIG5vZGUub3duZXJEb2N1bWVudC5faWRfc2VhcmNoX3N0YWNrPSBOb25lCisKK2NsYXNzIERvY3VtZW50KE5vZGUsIERvY3VtZW50TFMpOgorICAgIF9jaGlsZF9ub2RlX3R5cGVzID0gKE5vZGUuRUxFTUVOVF9OT0RFLCBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLkNPTU1FTlRfTk9ERSwgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCisKKyAgICBub2RlVHlwZSA9IE5vZGUuRE9DVU1FTlRfTk9ERQorICAgIG5vZGVOYW1lID0gIiNkb2N1bWVudCIKKyAgICBub2RlVmFsdWUgPSBOb25lCisgICAgYXR0cmlidXRlcyA9IE5vbmUKKyAgICBkb2N0eXBlID0gTm9uZQorICAgIHBhcmVudE5vZGUgPSBOb25lCisgICAgcHJldmlvdXNTaWJsaW5nID0gbmV4dFNpYmxpbmcgPSBOb25lCisKKyAgICBpbXBsZW1lbnRhdGlvbiA9IERPTUltcGxlbWVudGF0aW9uKCkKKworICAgICMgRG9jdW1lbnQgYXR0cmlidXRlcyBmcm9tIExldmVsIDMgKFdEIDkgQXByaWwgMjAwMikKKworICAgIGFjdHVhbEVuY29kaW5nID0gTm9uZQorICAgIGVuY29kaW5nID0gTm9uZQorICAgIHN0YW5kYWxvbmUgPSBOb25lCisgICAgdmVyc2lvbiA9IE5vbmUKKyAgICBzdHJpY3RFcnJvckNoZWNraW5nID0gRmFsc2UKKyAgICBlcnJvckhhbmRsZXIgPSBOb25lCisgICAgZG9jdW1lbnRVUkkgPSBOb25lCisKKyAgICBfbWFnaWNfaWRfY291bnQgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY2hpbGROb2RlcyA9IE5vZGVMaXN0KCkKKyAgICAgICAgIyBtYXBwaW5nIG9mIChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSkgLT4gRWxlbWVudEluZm8KKyAgICAgICAgIyAgICAgICAgYW5kIHRhZ05hbWUgLT4gRWxlbWVudEluZm8KKyAgICAgICAgc2VsZi5fZWxlbV9pbmZvID0ge30KKyAgICAgICAgc2VsZi5faWRfY2FjaGUgPSB7fQorICAgICAgICBzZWxmLl9pZF9zZWFyY2hfc3RhY2sgPSBOb25lCisKKyAgICBkZWYgX2dldF9lbGVtX2luZm8oc2VsZiwgZWxlbWVudCk6CisgICAgICAgIGlmIGVsZW1lbnQubmFtZXNwYWNlVVJJOgorICAgICAgICAgICAga2V5ID0gZWxlbWVudC5uYW1lc3BhY2VVUkksIGVsZW1lbnQubG9jYWxOYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBrZXkgPSBlbGVtZW50LnRhZ05hbWUKKyAgICAgICAgcmV0dXJuIHNlbGYuX2VsZW1faW5mby5nZXQoa2V5KQorCisgICAgZGVmIF9nZXRfYWN0dWFsRW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmFjdHVhbEVuY29kaW5nCisKKyAgICBkZWYgX2dldF9kb2N0eXBlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kb2N0eXBlCisKKyAgICBkZWYgX2dldF9kb2N1bWVudFVSSShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZG9jdW1lbnRVUkkKKworICAgIGRlZiBfZ2V0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGluZworCisgICAgZGVmIF9nZXRfZXJyb3JIYW5kbGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lcnJvckhhbmRsZXIKKworICAgIGRlZiBfZ2V0X3N0YW5kYWxvbmUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0YW5kYWxvbmUKKworICAgIGRlZiBfZ2V0X3N0cmljdEVycm9yQ2hlY2tpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0cmljdEVycm9yQ2hlY2tpbmcKKworICAgIGRlZiBfZ2V0X3ZlcnNpb24oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZlcnNpb24KKworICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKKyAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5vZGUpLCByZXByKHNlbGYpKSkKKyAgICAgICAgaWYgbm9kZS5wYXJlbnROb2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBUaGlzIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIHRoZSBuZXh0IHRlc3Qgc2luY2UgdGhpcworICAgICAgICAgICAgIyBtYXkgKmJlKiB0aGUgZG9jdW1lbnQgZWxlbWVudCwgaW4gd2hpY2ggY2FzZSBpdCBzaG91bGQKKyAgICAgICAgICAgICMgZW5kIHVwIHJlLW9yZGVyZWQgdG8gdGhlIGVuZC4KKyAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKQorCisgICAgICAgIGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgXAorICAgICAgICAgICBhbmQgc2VsZi5fZ2V0X2RvY3VtZW50RWxlbWVudCgpOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgICAgICJ0d28gZG9jdW1lbnQgZWxlbWVudHMgZGlzYWxsb3dlZCIpCisgICAgICAgIHJldHVybiBOb2RlLmFwcGVuZENoaWxkKHNlbGYsIG5vZGUpCisKKyAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgb2xkQ2hpbGQpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmNoaWxkTm9kZXMucmVtb3ZlKG9sZENoaWxkKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICBvbGRDaGlsZC5uZXh0U2libGluZyA9IG9sZENoaWxkLnByZXZpb3VzU2libGluZyA9IE5vbmUKKyAgICAgICAgb2xkQ2hpbGQucGFyZW50Tm9kZSA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5kb2N1bWVudEVsZW1lbnQgaXMgb2xkQ2hpbGQ6CisgICAgICAgICAgICBzZWxmLmRvY3VtZW50RWxlbWVudCA9IE5vbmUKKworICAgICAgICByZXR1cm4gb2xkQ2hpbGQKKworICAgIGRlZiBfZ2V0X2RvY3VtZW50RWxlbWVudChzZWxmKToKKyAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZQorCisgICAgZGVmIHVubGluayhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kb2N0eXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5kb2N0eXBlLnVubGluaygpCisgICAgICAgICAgICBzZWxmLmRvY3R5cGUgPSBOb25lCisgICAgICAgIE5vZGUudW5saW5rKHNlbGYpCisKKyAgICBkZWYgY2xvbmVOb2RlKHNlbGYsIGRlZXApOgorICAgICAgICBpZiBub3QgZGVlcDoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGNsb25lID0gc2VsZi5pbXBsZW1lbnRhdGlvbi5jcmVhdGVEb2N1bWVudChOb25lLCBOb25lLCBOb25lKQorICAgICAgICBjbG9uZS5lbmNvZGluZyA9IHNlbGYuZW5jb2RpbmcKKyAgICAgICAgY2xvbmUuc3RhbmRhbG9uZSA9IHNlbGYuc3RhbmRhbG9uZQorICAgICAgICBjbG9uZS52ZXJzaW9uID0gc2VsZi52ZXJzaW9uCisgICAgICAgIGZvciBuIGluIHNlbGYuY2hpbGROb2RlczoKKyAgICAgICAgICAgIGNoaWxkY2xvbmUgPSBfY2xvbmVfbm9kZShuLCBkZWVwLCBjbG9uZSkKKyAgICAgICAgICAgIGFzc2VydCBjaGlsZGNsb25lLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShjbG9uZSkKKyAgICAgICAgICAgIGNsb25lLmNoaWxkTm9kZXMuYXBwZW5kKGNoaWxkY2xvbmUpCisgICAgICAgICAgICBpZiBjaGlsZGNsb25lLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERToKKyAgICAgICAgICAgICAgICBhc3NlcnQgY2xvbmUuZG9jdW1lbnRFbGVtZW50IGlzIE5vbmUKKyAgICAgICAgICAgIGVsaWYgY2hpbGRjbG9uZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERToKKyAgICAgICAgICAgICAgICBhc3NlcnQgY2xvbmUuZG9jdHlwZSBpcyBOb25lCisgICAgICAgICAgICAgICAgY2xvbmUuZG9jdHlwZSA9IGNoaWxkY2xvbmUKKyAgICAgICAgICAgIGNoaWxkY2xvbmUucGFyZW50Tm9kZSA9IGNsb25lCisgICAgICAgIHNlbGYuX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIoeG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwgY2xvbmUpCisgICAgICAgIHJldHVybiBjbG9uZQorCisgICAgZGVmIGNyZWF0ZURvY3VtZW50RnJhZ21lbnQoc2VsZik6CisgICAgICAgIGQgPSBEb2N1bWVudEZyYWdtZW50KCkKKyAgICAgICAgZC5vd25lckRvY3VtZW50ID0gc2VsZgorICAgICAgICByZXR1cm4gZAorCisgICAgZGVmIGNyZWF0ZUVsZW1lbnQoc2VsZiwgdGFnTmFtZSk6CisgICAgICAgIGUgPSBFbGVtZW50KHRhZ05hbWUpCisgICAgICAgIGUub3duZXJEb2N1bWVudCA9IHNlbGYKKyAgICAgICAgcmV0dXJuIGUKKworICAgIGRlZiBjcmVhdGVUZXh0Tm9kZShzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAibm9kZSBjb250ZW50cyBtdXN0IGJlIGEgc3RyaW5nIgorICAgICAgICB0ID0gVGV4dCgpCisgICAgICAgIHQuZGF0YSA9IGRhdGEKKyAgICAgICAgdC5vd25lckRvY3VtZW50ID0gc2VsZgorICAgICAgICByZXR1cm4gdAorCisgICAgZGVmIGNyZWF0ZUNEQVRBU2VjdGlvbihzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoZGF0YSwgU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAibm9kZSBjb250ZW50cyBtdXN0IGJlIGEgc3RyaW5nIgorICAgICAgICBjID0gQ0RBVEFTZWN0aW9uKCkKKyAgICAgICAgYy5kYXRhID0gZGF0YQorICAgICAgICBjLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiBjCisKKyAgICBkZWYgY3JlYXRlQ29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgYyA9IENvbW1lbnQoZGF0YSkKKyAgICAgICAgYy5vd25lckRvY3VtZW50ID0gc2VsZgorICAgICAgICByZXR1cm4gYworCisgICAgZGVmIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBwID0gUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSkKKyAgICAgICAgcC5vd25lckRvY3VtZW50ID0gc2VsZgorICAgICAgICByZXR1cm4gcAorCisgICAgZGVmIGNyZWF0ZUF0dHJpYnV0ZShzZWxmLCBxTmFtZSk6CisgICAgICAgIGEgPSBBdHRyKHFOYW1lKQorICAgICAgICBhLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIGEudmFsdWUgPSAiIgorICAgICAgICByZXR1cm4gYQorCisgICAgZGVmIGNyZWF0ZUVsZW1lbnROUyhzZWxmLCBuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpOgorICAgICAgICBwcmVmaXgsIGxvY2FsTmFtZSA9IF9uc3NwbGl0KHF1YWxpZmllZE5hbWUpCisgICAgICAgIGUgPSBFbGVtZW50KHF1YWxpZmllZE5hbWUsIG5hbWVzcGFjZVVSSSwgcHJlZml4KQorICAgICAgICBlLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIHJldHVybiBlCisKKyAgICBkZWYgY3JlYXRlQXR0cmlidXRlTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lKToKKyAgICAgICAgcHJlZml4LCBsb2NhbE5hbWUgPSBfbnNzcGxpdChxdWFsaWZpZWROYW1lKQorICAgICAgICBhID0gQXR0cihxdWFsaWZpZWROYW1lLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcHJlZml4KQorICAgICAgICBhLm93bmVyRG9jdW1lbnQgPSBzZWxmCisgICAgICAgIGEudmFsdWUgPSAiIgorICAgICAgICByZXR1cm4gYQorCisgICAgIyBBIGNvdXBsZSBvZiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBoZWxwZXJzIHRvIGNyZWF0ZSBub2RlIHR5cGVzCisgICAgIyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBXM0MgRE9NIHNwZWNzOgorCisgICAgZGVmIF9jcmVhdGVfZW50aXR5KHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbm90YXRpb25OYW1lKToKKyAgICAgICAgZSA9IEVudGl0eShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5vdGF0aW9uTmFtZSkKKyAgICAgICAgZS5vd25lckRvY3VtZW50ID0gc2VsZgorICAgICAgICByZXR1cm4gZQorCisgICAgZGVmIF9jcmVhdGVfbm90YXRpb24oc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKKyAgICAgICAgbiA9IE5vdGF0aW9uKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKKyAgICAgICAgbi5vd25lckRvY3VtZW50ID0gc2VsZgorICAgICAgICByZXR1cm4gbgorCisgICAgZGVmIGdldEVsZW1lbnRCeUlkKHNlbGYsIGlkKToKKyAgICAgICAgaWYgaWQgaW4gc2VsZi5faWRfY2FjaGU6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faWRfY2FjaGVbaWRdCisgICAgICAgIGlmIG5vdCAoc2VsZi5fZWxlbV9pbmZvIG9yIHNlbGYuX21hZ2ljX2lkX2NvdW50KToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgc3RhY2sgPSBzZWxmLl9pZF9zZWFyY2hfc3RhY2sKKyAgICAgICAgaWYgc3RhY2sgaXMgTm9uZToKKyAgICAgICAgICAgICMgd2UgbmV2ZXIgc2VhcmNoZWQgYmVmb3JlLCBvciB0aGUgY2FjaGUgaGFzIGJlZW4gY2xlYXJlZAorICAgICAgICAgICAgc3RhY2sgPSBbc2VsZi5kb2N1bWVudEVsZW1lbnRdCisgICAgICAgICAgICBzZWxmLl9pZF9zZWFyY2hfc3RhY2sgPSBzdGFjaworICAgICAgICBlbGlmIG5vdCBzdGFjazoKKyAgICAgICAgICAgICMgUHJldmlvdXMgc2VhcmNoIHdhcyBjb21wbGV0ZWQgYW5kIGNhY2hlIGlzIHN0aWxsIHZhbGlkOworICAgICAgICAgICAgIyBubyBtYXRjaGluZyBub2RlLgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICByZXN1bHQgPSBOb25lCisgICAgICAgIHdoaWxlIHN0YWNrOgorICAgICAgICAgICAgbm9kZSA9IHN0YWNrLnBvcCgpCisgICAgICAgICAgICAjIGFkZCBjaGlsZCBlbGVtZW50cyB0byBzdGFjayBmb3IgY29udGludWVkIHNlYXJjaGluZworICAgICAgICAgICAgc3RhY2suZXh0ZW5kKFtjaGlsZCBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZE5vZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGNoaWxkLm5vZGVUeXBlIGluIF9ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbl0pCisgICAgICAgICAgICAjIGNoZWNrIHRoaXMgbm9kZQorICAgICAgICAgICAgaW5mbyA9IHNlbGYuX2dldF9lbGVtX2luZm8obm9kZSkKKyAgICAgICAgICAgIGlmIGluZm86CisgICAgICAgICAgICAgICAgIyBXZSBoYXZlIHRvIHByb2Nlc3MgYWxsIElEIGF0dHJpYnV0ZXMgYmVmb3JlCisgICAgICAgICAgICAgICAgIyByZXR1cm5pbmcgaW4gb3JkZXIgdG8gZ2V0IGFsbCB0aGUgYXR0cmlidXRlcyBzZXQgdG8KKyAgICAgICAgICAgICAgICAjIGJlIElEcyB1c2luZyBFbGVtZW50LnNldElkQXR0cmlidXRlKigpLgorICAgICAgICAgICAgICAgIGZvciBhdHRyIGluIG5vZGUuYXR0cmlidXRlcy52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgYXR0ci5uYW1lc3BhY2VVUkk6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBpbmZvLmlzSWROUyhhdHRyLm5hbWVzcGFjZVVSSSwgYXR0ci5sb2NhbE5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lkX2NhY2hlW2F0dHIudmFsdWVdID0gbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGF0dHIudmFsdWUgPT0gaWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBub2RlLl9tYWdpY19pZF9ub2RlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBpbmZvLmlzSWQoYXR0ci5uYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lkX2NhY2hlW2F0dHIudmFsdWVdID0gbm9kZQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXR0ci52YWx1ZSA9PSBpZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICBlbGlmIG5vdCBub2RlLl9tYWdpY19pZF9ub2RlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbGlmIGF0dHIuX2lzX2lkOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faWRfY2FjaGVbYXR0ci52YWx1ZV0gPSBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhdHRyLnZhbHVlID09IGlkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgbm9kZS5fbWFnaWNfaWRfbm9kZXMgPT0gMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxpZiBub2RlLl9tYWdpY19pZF9ub2RlczoKKyAgICAgICAgICAgICAgICBmb3IgYXR0ciBpbiBub2RlLmF0dHJpYnV0ZXMudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgIGlmIGF0dHIuX2lzX2lkOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faWRfY2FjaGVbYXR0ci52YWx1ZV0gPSBub2RlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhdHRyLnZhbHVlID09IGlkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5vZGUKKyAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBfZ2V0X2VsZW1lbnRzX2J5X3RhZ05hbWVfaGVscGVyKHNlbGYsIG5hbWUsIE5vZGVMaXN0KCkpCisKKyAgICBkZWYgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhzZWxmLCBuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSk6CisgICAgICAgIHJldHVybiBfZ2V0X2VsZW1lbnRzX2J5X3RhZ05hbWVfbnNfaGVscGVyKAorICAgICAgICAgICAgc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIE5vZGVMaXN0KCkpCisKKyAgICBkZWYgaXNTdXBwb3J0ZWQoc2VsZiwgZmVhdHVyZSwgdmVyc2lvbik6CisgICAgICAgIHJldHVybiBzZWxmLmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoZmVhdHVyZSwgdmVyc2lvbikKKworICAgIGRlZiBpbXBvcnROb2RlKHNlbGYsIG5vZGUsIGRlZXApOgorICAgICAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfTk9ERToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKCJjYW5ub3QgaW1wb3J0IGRvY3VtZW50IG5vZGVzIikKKyAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoImNhbm5vdCBpbXBvcnQgZG9jdW1lbnQgdHlwZSBub2RlcyIpCisgICAgICAgIHJldHVybiBfY2xvbmVfbm9kZShub2RlLCBkZWVwLCBzZWxmKQorCisgICAgZGVmIHdyaXRleG1sKHNlbGYsIHdyaXRlciwgaW5kZW50PSIiLCBhZGRpbmRlbnQ9IiIsIG5ld2w9IiIsCisgICAgICAgICAgICAgICAgIGVuY29kaW5nID0gTm9uZSk6CisgICAgICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoJzw/eG1sIHZlcnNpb249IjEuMCIgPz4nK25ld2wpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiVzIj8+JXMnICUgKGVuY29kaW5nLCBuZXdsKSkKKyAgICAgICAgZm9yIG5vZGUgaW4gc2VsZi5jaGlsZE5vZGVzOgorICAgICAgICAgICAgbm9kZS53cml0ZXhtbCh3cml0ZXIsIGluZGVudCwgYWRkaW5kZW50LCBuZXdsKQorCisgICAgIyBET00gTGV2ZWwgMyAoV0QgOSBBcHJpbCAyMDAyKQorCisgICAgZGVmIHJlbmFtZU5vZGUoc2VsZiwgbiwgbmFtZXNwYWNlVVJJLCBuYW1lKToKKyAgICAgICAgaWYgbi5vd25lckRvY3VtZW50IGlzIG5vdCBzZWxmOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKAorICAgICAgICAgICAgICAgICJjYW5ub3QgcmVuYW1lIG5vZGVzIGZyb20gb3RoZXIgZG9jdW1lbnRzO1xuIgorICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyxcbmZvdW5kICVzIiAlIChzZWxmLCBuLm93bmVyRG9jdW1lbnQpKQorICAgICAgICBpZiBuLm5vZGVUeXBlIG5vdCBpbiAoTm9kZS5FTEVNRU5UX05PREUsIE5vZGUuQVRUUklCVVRFX05PREUpOgorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCisgICAgICAgICAgICAgICAgInJlbmFtZU5vZGUoKSBvbmx5IGFwcGxpZXMgdG8gZWxlbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzIikKKyAgICAgICAgaWYgbmFtZXNwYWNlVVJJICE9IEVNUFRZX05BTUVTUEFDRToKKyAgICAgICAgICAgIGlmICc6JyBpbiBuYW1lOgorICAgICAgICAgICAgICAgIHByZWZpeCwgbG9jYWxOYW1lID0gbmFtZS5zcGxpdCgnOicsIDEpCisgICAgICAgICAgICAgICAgaWYgKCAgcHJlZml4ID09ICJ4bWxucyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbC5kb20uWE1MTlNfTkFNRVNQQUNFKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoCisgICAgICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCB1c2Ugb2YgJ3htbG5zJyBwcmVmaXgiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiAoICBuYW1lID09ICJ4bWxucyIKKyAgICAgICAgICAgICAgICAgICAgICBhbmQgbmFtZXNwYWNlVVJJICE9IHhtbC5kb20uWE1MTlNfTkFNRVNQQUNFCisgICAgICAgICAgICAgICAgICAgICAgYW5kIG4ubm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTmFtZXNwYWNlRXJyKAorICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgdXNlIG9mIHRoZSAneG1sbnMnIGF0dHJpYnV0ZSIpCisgICAgICAgICAgICAgICAgcHJlZml4ID0gTm9uZQorICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByZWZpeCA9IE5vbmUKKyAgICAgICAgICAgIGxvY2FsTmFtZSA9IE5vbmUKKyAgICAgICAgaWYgbi5ub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFOgorICAgICAgICAgICAgZWxlbWVudCA9IG4ub3duZXJFbGVtZW50CisgICAgICAgICAgICBpZiBlbGVtZW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGlzX2lkID0gbi5faXNfaWQKKyAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUobikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVsZW1lbnQgPSBOb25lCisgICAgICAgICMgYXZvaWQgX19zZXRhdHRyX18KKyAgICAgICAgZCA9IG4uX19kaWN0X18KKyAgICAgICAgZFsncHJlZml4J10gPSBwcmVmaXgKKyAgICAgICAgZFsnbG9jYWxOYW1lJ10gPSBsb2NhbE5hbWUKKyAgICAgICAgZFsnbmFtZXNwYWNlVVJJJ10gPSBuYW1lc3BhY2VVUkkKKyAgICAgICAgZFsnbm9kZU5hbWUnXSA9IG5hbWUKKyAgICAgICAgaWYgbi5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgICAgIGRbJ3RhZ05hbWUnXSA9IG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgYXR0cmlidXRlIG5vZGUKKyAgICAgICAgICAgIGRbJ25hbWUnXSA9IG5hbWUKKyAgICAgICAgICAgIGlmIGVsZW1lbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKG4pCisgICAgICAgICAgICAgICAgaWYgaXNfaWQ6CisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0SWRBdHRyaWJ1dGVOb2RlKG4pCisgICAgICAgICMgSXQncyBub3QgY2xlYXIgZnJvbSBhIHNlbWFudGljIHBlcnNwZWN0aXZlIHdoZXRoZXIgd2Ugc2hvdWxkCisgICAgICAgICMgY2FsbCB0aGUgdXNlciBkYXRhIGhhbmRsZXJzIGZvciB0aGUgTk9ERV9SRU5BTUVEIGV2ZW50IHNpbmNlCisgICAgICAgICMgd2UncmUgcmUtdXNpbmcgdGhlIGV4aXN0aW5nIG5vZGUuICBUaGUgZHJhZnQgc3BlYyBoYXMgYmVlbgorICAgICAgICAjIGludGVycHJldGVkIGFzIG1lYW5pbmcgIm5vLCBkb24ndCBjYWxsIHRoZSBoYW5kbGVyIHVubGVzcyBhCisgICAgICAgICMgbmV3IG5vZGUgaXMgY3JlYXRlZC4iCisgICAgICAgIHJldHVybiBuCisKK2RlZnByb3BlcnR5KERvY3VtZW50LCAiZG9jdW1lbnRFbGVtZW50IiwKKyAgICAgICAgICAgIGRvYz0iVG9wLWxldmVsIGVsZW1lbnQgb2YgdGhpcyBkb2N1bWVudC4iKQorCisKK2RlZiBfY2xvbmVfbm9kZShub2RlLCBkZWVwLCBuZXdPd25lckRvY3VtZW50KToKKyAgICAiIiIKKyAgICBDbG9uZSBhIG5vZGUgYW5kIGdpdmUgaXQgdGhlIG5ldyBvd25lciBkb2N1bWVudC4KKyAgICBDYWxsZWQgYnkgTm9kZS5jbG9uZU5vZGUgYW5kIERvY3VtZW50LmltcG9ydE5vZGUKKyAgICAiIiIKKyAgICBpZiBub2RlLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShuZXdPd25lckRvY3VtZW50KToKKyAgICAgICAgb3BlcmF0aW9uID0geG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQKKyAgICBlbHNlOgorICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVECisgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERToKKyAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhub2RlLm5hbWVzcGFjZVVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lKQorICAgICAgICBmb3IgYXR0ciBpbiBub2RlLmF0dHJpYnV0ZXMudmFsdWVzKCk6CisgICAgICAgICAgICBjbG9uZS5zZXRBdHRyaWJ1dGVOUyhhdHRyLm5hbWVzcGFjZVVSSSwgYXR0ci5ub2RlTmFtZSwgYXR0ci52YWx1ZSkKKyAgICAgICAgICAgIGEgPSBjbG9uZS5nZXRBdHRyaWJ1dGVOb2RlTlMoYXR0ci5uYW1lc3BhY2VVUkksIGF0dHIubG9jYWxOYW1lKQorICAgICAgICAgICAgYS5zcGVjaWZpZWQgPSBhdHRyLnNwZWNpZmllZAorCisgICAgICAgIGlmIGRlZXA6CisgICAgICAgICAgICBmb3IgY2hpbGQgaW4gbm9kZS5jaGlsZE5vZGVzOgorICAgICAgICAgICAgICAgIGMgPSBfY2xvbmVfbm9kZShjaGlsZCwgZGVlcCwgbmV3T3duZXJEb2N1bWVudCkKKyAgICAgICAgICAgICAgICBjbG9uZS5hcHBlbmRDaGlsZChjKQorCisgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERToKKyAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQorICAgICAgICBpZiBkZWVwOgorICAgICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuY2hpbGROb2RlczoKKyAgICAgICAgICAgICAgICBjID0gX2Nsb25lX25vZGUoY2hpbGQsIGRlZXAsIG5ld093bmVyRG9jdW1lbnQpCisgICAgICAgICAgICAgICAgY2xvbmUuYXBwZW5kQ2hpbGQoYykKKworICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERToKKyAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5vZGUuZGF0YSkKKyAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREU6CisgICAgICAgIGNsb25lID0gbmV3T3duZXJEb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24obm9kZS5kYXRhKQorICAgIGVsaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERToKKyAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihub2RlLnRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEpCisgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuQ09NTUVOVF9OT0RFOgorICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuY3JlYXRlQ29tbWVudChub2RlLmRhdGEpCisgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREU6CisgICAgICAgIGNsb25lID0gbmV3T3duZXJEb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGVOUyhub2RlLm5hbWVzcGFjZVVSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUpCisgICAgICAgIGNsb25lLnNwZWNpZmllZCA9IFRydWUKKyAgICAgICAgY2xvbmUudmFsdWUgPSBub2RlLnZhbHVlCisgICAgZWxpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFOgorICAgICAgICBhc3NlcnQgbm9kZS5vd25lckRvY3VtZW50IGlzIG5vdCBuZXdPd25lckRvY3VtZW50CisgICAgICAgIG9wZXJhdGlvbiA9IHhtbC5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKKyAgICAgICAgY2xvbmUgPSBuZXdPd25lckRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZURvY3VtZW50VHlwZSgKKyAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS5wdWJsaWNJZCwgbm9kZS5zeXN0ZW1JZCkKKyAgICAgICAgY2xvbmUub3duZXJEb2N1bWVudCA9IG5ld093bmVyRG9jdW1lbnQKKyAgICAgICAgaWYgZGVlcDoKKyAgICAgICAgICAgIGNsb25lLmVudGl0aWVzLl9zZXEgPSBbXQorICAgICAgICAgICAgY2xvbmUubm90YXRpb25zLl9zZXEgPSBbXQorICAgICAgICAgICAgZm9yIG4gaW4gbm9kZS5ub3RhdGlvbnMuX3NlcToKKyAgICAgICAgICAgICAgICBub3RhdGlvbiA9IE5vdGF0aW9uKG4ubm9kZU5hbWUsIG4ucHVibGljSWQsIG4uc3lzdGVtSWQpCisgICAgICAgICAgICAgICAgbm90YXRpb24ub3duZXJEb2N1bWVudCA9IG5ld093bmVyRG9jdW1lbnQKKyAgICAgICAgICAgICAgICBjbG9uZS5ub3RhdGlvbnMuX3NlcS5hcHBlbmQobm90YXRpb24pCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihuLCAnX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXInKToKKyAgICAgICAgICAgICAgICAgICAgbi5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcihvcGVyYXRpb24sIG4sIG5vdGF0aW9uKQorICAgICAgICAgICAgZm9yIGUgaW4gbm9kZS5lbnRpdGllcy5fc2VxOgorICAgICAgICAgICAgICAgIGVudGl0eSA9IEVudGl0eShlLm5vZGVOYW1lLCBlLnB1YmxpY0lkLCBlLnN5c3RlbUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLm5vdGF0aW9uTmFtZSkKKyAgICAgICAgICAgICAgICBlbnRpdHkuYWN0dWFsRW5jb2RpbmcgPSBlLmFjdHVhbEVuY29kaW5nCisgICAgICAgICAgICAgICAgZW50aXR5LmVuY29kaW5nID0gZS5lbmNvZGluZworICAgICAgICAgICAgICAgIGVudGl0eS52ZXJzaW9uID0gZS52ZXJzaW9uCisgICAgICAgICAgICAgICAgZW50aXR5Lm93bmVyRG9jdW1lbnQgPSBuZXdPd25lckRvY3VtZW50CisgICAgICAgICAgICAgICAgY2xvbmUuZW50aXRpZXMuX3NlcS5hcHBlbmQoZW50aXR5KQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoZSwgJ19jYWxsX3VzZXJfZGF0YV9oYW5kbGVyJyk6CisgICAgICAgICAgICAgICAgICAgIGUuX2NhbGxfdXNlcl9kYXRhX2hhbmRsZXIob3BlcmF0aW9uLCBuLCBlbnRpdHkpCisgICAgZWxzZToKKyAgICAgICAgIyBOb3RlIHRoZSBjbG9uaW5nIG9mIERvY3VtZW50IGFuZCBEb2N1bWVudFR5cGUgbm9kZXMgaXMKKyAgICAgICAgIyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4gIG1pbmlkb20gaGFuZGxlcyB0aG9zZSBjYXNlcworICAgICAgICAjIGRpcmVjdGx5IGluIHRoZSBjbG9uZU5vZGUoKSBtZXRob2RzLgorICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigiQ2Fubm90IGNsb25lIG5vZGUgJXMiICUgcmVwcihub2RlKSkKKworICAgICMgQ2hlY2sgZm9yIF9jYWxsX3VzZXJfZGF0YV9oYW5kbGVyKCkgc2luY2UgdGhpcyBjb3VsZCBjb25jZWl2YWJseQorICAgICMgdXNlZCB3aXRoIG90aGVyIERPTSBpbXBsZW1lbnRhdGlvbnMgKG9uZSBvZiB0aGUgRm91clRob3VnaHQKKyAgICAjIERPTXMsIHBlcmhhcHM/KS4KKyAgICBpZiBoYXNhdHRyKG5vZGUsICdfY2FsbF91c2VyX2RhdGFfaGFuZGxlcicpOgorICAgICAgICBub2RlLl9jYWxsX3VzZXJfZGF0YV9oYW5kbGVyKG9wZXJhdGlvbiwgbm9kZSwgY2xvbmUpCisgICAgcmV0dXJuIGNsb25lCisKKworZGVmIF9uc3NwbGl0KHF1YWxpZmllZE5hbWUpOgorICAgIGZpZWxkcyA9IHF1YWxpZmllZE5hbWUuc3BsaXQoJzonLCAxKQorICAgIGlmIGxlbihmaWVsZHMpID09IDI6CisgICAgICAgIHJldHVybiBmaWVsZHMKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gKE5vbmUsIGZpZWxkc1swXSkKKworCitkZWYgX2dldF9TdHJpbmdJTygpOgorICAgICMgd2UgY2FuJ3QgdXNlIGNTdHJpbmdJTyBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgVW5pY29kZSBzdHJpbmdzCisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICByZXR1cm4gU3RyaW5nSU8oKQorCitkZWYgX2RvX3B1bGxkb21fcGFyc2UoZnVuYywgYXJncywga3dhcmdzKToKKyAgICBldmVudHMgPSBmdW5jKCphcmdzLCAqKmt3YXJncykKKyAgICB0b2t0eXBlLCByb290Tm9kZSA9IGV2ZW50cy5nZXRFdmVudCgpCisgICAgZXZlbnRzLmV4cGFuZE5vZGUocm9vdE5vZGUpCisgICAgZXZlbnRzLmNsZWFyKCkKKyAgICByZXR1cm4gcm9vdE5vZGUKKworZGVmIHBhcnNlKGZpbGUsIHBhcnNlcj1Ob25lLCBidWZzaXplPU5vbmUpOgorICAgICIiIlBhcnNlIGEgZmlsZSBpbnRvIGEgRE9NIGJ5IGZpbGVuYW1lIG9yIGZpbGUgb2JqZWN0LiIiIgorICAgIGlmIHBhcnNlciBpcyBOb25lIGFuZCBub3QgYnVmc2l6ZToKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKKyAgICAgICAgcmV0dXJuIGV4cGF0YnVpbGRlci5wYXJzZShmaWxlKQorICAgIGVsc2U6CisgICAgICAgIGZyb20geG1sLmRvbSBpbXBvcnQgcHVsbGRvbQorICAgICAgICByZXR1cm4gX2RvX3B1bGxkb21fcGFyc2UocHVsbGRvbS5wYXJzZSwgKGZpbGUsKSwKKyAgICAgICAgICAgIHsncGFyc2VyJzogcGFyc2VyLCAnYnVmc2l6ZSc6IGJ1ZnNpemV9KQorCitkZWYgcGFyc2VTdHJpbmcoc3RyaW5nLCBwYXJzZXI9Tm9uZSk6CisgICAgIiIiUGFyc2UgYSBmaWxlIGludG8gYSBET00gZnJvbSBhIHN0cmluZy4iIiIKKyAgICBpZiBwYXJzZXIgaXMgTm9uZToKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBleHBhdGJ1aWxkZXIKKyAgICAgICAgcmV0dXJuIGV4cGF0YnVpbGRlci5wYXJzZVN0cmluZyhzdHJpbmcpCisgICAgZWxzZToKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBwdWxsZG9tCisgICAgICAgIHJldHVybiBfZG9fcHVsbGRvbV9wYXJzZShwdWxsZG9tLnBhcnNlU3RyaW5nLCAoc3RyaW5nLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3BhcnNlcic6IHBhcnNlcn0pCisKK2RlZiBnZXRET01JbXBsZW1lbnRhdGlvbihmZWF0dXJlcz1Ob25lKToKKyAgICBpZiBmZWF0dXJlczoKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmZWF0dXJlcywgU3RyaW5nVHlwZXMpOgorICAgICAgICAgICAgZmVhdHVyZXMgPSBkb21yZWcuX3BhcnNlX2ZlYXR1cmVfc3RyaW5nKGZlYXR1cmVzKQorICAgICAgICBmb3IgZiwgdiBpbiBmZWF0dXJlczoKKyAgICAgICAgICAgIGlmIG5vdCBEb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKGYsIHYpOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgcmV0dXJuIERvY3VtZW50LmltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWRvbS5weWMgYi9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWRvbS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkM2U4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWRvbS5weW8gYi9saWIvcHl0aG9uMi43L3htbC9kb20vbWluaWRvbS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc4MTljZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9taW5pZG9tLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20vcHVsbGRvbS5weSBiL2xpYi9weXRob24yLjcveG1sL2RvbS9wdWxsZG9tLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjQ5YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9kb20vcHVsbGRvbS5weQpAQCAtMCwwICsxLDM1MSBAQAoraW1wb3J0IHhtbC5zYXgKK2ltcG9ydCB4bWwuc2F4LmhhbmRsZXIKK2ltcG9ydCB0eXBlcworCit0cnk6CisgICAgX1N0cmluZ1R5cGVzID0gW3R5cGVzLlN0cmluZ1R5cGUsIHR5cGVzLlVuaWNvZGVUeXBlXQorZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIF9TdHJpbmdUeXBlcyA9IFt0eXBlcy5TdHJpbmdUeXBlXQorCitTVEFSVF9FTEVNRU5UID0gIlNUQVJUX0VMRU1FTlQiCitFTkRfRUxFTUVOVCA9ICJFTkRfRUxFTUVOVCIKK0NPTU1FTlQgPSAiQ09NTUVOVCIKK1NUQVJUX0RPQ1VNRU5UID0gIlNUQVJUX0RPQ1VNRU5UIgorRU5EX0RPQ1VNRU5UID0gIkVORF9ET0NVTUVOVCIKK1BST0NFU1NJTkdfSU5TVFJVQ1RJT04gPSAiUFJPQ0VTU0lOR19JTlNUUlVDVElPTiIKK0lHTk9SQUJMRV9XSElURVNQQUNFID0gIklHTk9SQUJMRV9XSElURVNQQUNFIgorQ0hBUkFDVEVSUyA9ICJDSEFSQUNURVJTIgorCitjbGFzcyBQdWxsRE9NKHhtbC5zYXguQ29udGVudEhhbmRsZXIpOgorICAgIF9sb2NhdG9yID0gTm9uZQorICAgIGRvY3VtZW50ID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRvY3VtZW50RmFjdG9yeT1Ob25lKToKKyAgICAgICAgZnJvbSB4bWwuZG9tIGltcG9ydCBYTUxfTkFNRVNQQUNFCisgICAgICAgIHNlbGYuZG9jdW1lbnRGYWN0b3J5ID0gZG9jdW1lbnRGYWN0b3J5CisgICAgICAgIHNlbGYuZmlyc3RFdmVudCA9IFtOb25lLCBOb25lXQorICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYuZmlyc3RFdmVudAorICAgICAgICBzZWxmLmVsZW1lbnRTdGFjayA9IFtdCisgICAgICAgIHNlbGYucHVzaCA9IHNlbGYuZWxlbWVudFN0YWNrLmFwcGVuZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnBvcCA9IHNlbGYuZWxlbWVudFN0YWNrLnBvcAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIHVzZSBjbGFzcycgcG9wIGluc3RlYWQKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fbnNfY29udGV4dHMgPSBbe1hNTF9OQU1FU1BBQ0U6J3htbCd9XSAjIGNvbnRhaW5zIHVyaSAtPiBwcmVmaXggZGljdHMKKyAgICAgICAgc2VsZi5fY3VycmVudF9jb250ZXh0ID0gc2VsZi5fbnNfY29udGV4dHNbLTFdCisgICAgICAgIHNlbGYucGVuZGluZ19ldmVudHMgPSBbXQorCisgICAgZGVmIHBvcChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gc2VsZi5lbGVtZW50U3RhY2tbLTFdCisgICAgICAgIGRlbCBzZWxmLmVsZW1lbnRTdGFja1stMV0KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHNldERvY3VtZW50TG9jYXRvcihzZWxmLCBsb2NhdG9yKToKKyAgICAgICAgc2VsZi5fbG9jYXRvciA9IGxvY2F0b3IKKworICAgIGRlZiBzdGFydFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4LCB1cmkpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnX3htbG5zX2F0dHJzJyk6CisgICAgICAgICAgICBzZWxmLl94bWxuc19hdHRycyA9IFtdCisgICAgICAgIHNlbGYuX3htbG5zX2F0dHJzLmFwcGVuZCgocHJlZml4IG9yICd4bWxucycsIHVyaSkpCisgICAgICAgIHNlbGYuX25zX2NvbnRleHRzLmFwcGVuZChzZWxmLl9jdXJyZW50X2NvbnRleHQuY29weSgpKQorICAgICAgICBzZWxmLl9jdXJyZW50X2NvbnRleHRbdXJpXSA9IHByZWZpeCBvciBOb25lCisKKyAgICBkZWYgZW5kUHJlZml4TWFwcGluZyhzZWxmLCBwcmVmaXgpOgorICAgICAgICBzZWxmLl9jdXJyZW50X2NvbnRleHQgPSBzZWxmLl9uc19jb250ZXh0cy5wb3AoKQorCisgICAgZGVmIHN0YXJ0RWxlbWVudE5TKHNlbGYsIG5hbWUsIHRhZ05hbWUgLCBhdHRycyk6CisgICAgICAgICMgUmV0cmlldmUgeG1sIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGVzLgorICAgICAgICB4bWxuc191cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nCisgICAgICAgIHhtbG5zX2F0dHJzID0gZ2V0YXR0cihzZWxmLCAnX3htbG5zX2F0dHJzJywgTm9uZSkKKyAgICAgICAgaWYgeG1sbnNfYXR0cnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgYW5hbWUsIHZhbHVlIGluIHhtbG5zX2F0dHJzOgorICAgICAgICAgICAgICAgIGF0dHJzLl9hdHRyc1soeG1sbnNfdXJpLCBhbmFtZSldID0gdmFsdWUKKyAgICAgICAgICAgIHNlbGYuX3htbG5zX2F0dHJzID0gW10KKyAgICAgICAgdXJpLCBsb2NhbG5hbWUgPSBuYW1lCisgICAgICAgIGlmIHVyaToKKyAgICAgICAgICAgICMgV2hlbiB1c2luZyBuYW1lc3BhY2VzLCB0aGUgcmVhZGVyIG1heSBvciBtYXkgbm90CisgICAgICAgICAgICAjIHByb3ZpZGUgdXMgd2l0aCB0aGUgb3JpZ2luYWwgbmFtZS4gSWYgbm90LCBjcmVhdGUKKyAgICAgICAgICAgICMgKmEqIHZhbGlkIHRhZ05hbWUgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0LgorICAgICAgICAgICAgaWYgdGFnTmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHByZWZpeCA9IHNlbGYuX2N1cnJlbnRfY29udGV4dFt1cmldCisgICAgICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgICAgICB0YWdOYW1lID0gcHJlZml4ICsgIjoiICsgbG9jYWxuYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGFnTmFtZSA9IGxvY2FsbmFtZQorICAgICAgICAgICAgaWYgc2VsZi5kb2N1bWVudDoKKyAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCB0YWdOYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBub2RlID0gc2VsZi5idWlsZERvY3VtZW50KHVyaSwgdGFnTmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgV2hlbiB0aGUgdGFnbmFtZSBpcyBub3QgcHJlZml4ZWQsIGl0IGp1c3QgYXBwZWFycyBhcworICAgICAgICAgICAgIyBsb2NhbG5hbWUKKyAgICAgICAgICAgIGlmIHNlbGYuZG9jdW1lbnQ6CisgICAgICAgICAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChsb2NhbG5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmJ1aWxkRG9jdW1lbnQoTm9uZSwgbG9jYWxuYW1lKQorCisgICAgICAgIGZvciBhbmFtZSx2YWx1ZSBpbiBhdHRycy5pdGVtcygpOgorICAgICAgICAgICAgYV91cmksIGFfbG9jYWxuYW1lID0gYW5hbWUKKyAgICAgICAgICAgIGlmIGFfdXJpID09IHhtbG5zX3VyaToKKyAgICAgICAgICAgICAgICBpZiBhX2xvY2FsbmFtZSA9PSAneG1sbnMnOgorICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IGFfbG9jYWxuYW1lCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcW5hbWUgPSAneG1sbnM6JyArIGFfbG9jYWxuYW1lCisgICAgICAgICAgICAgICAgYXR0ciA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlTlMoYV91cmksIHFuYW1lKQorICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTm9kZU5TKGF0dHIpCisgICAgICAgICAgICBlbGlmIGFfdXJpOgorICAgICAgICAgICAgICAgIHByZWZpeCA9IHNlbGYuX2N1cnJlbnRfY29udGV4dFthX3VyaV0KKyAgICAgICAgICAgICAgICBpZiBwcmVmaXg6CisgICAgICAgICAgICAgICAgICAgIHFuYW1lID0gcHJlZml4ICsgIjoiICsgYV9sb2NhbG5hbWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBxbmFtZSA9IGFfbG9jYWxuYW1lCisgICAgICAgICAgICAgICAgYXR0ciA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlTlMoYV91cmksIHFuYW1lKQorICAgICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTm9kZU5TKGF0dHIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF0dHIgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShhX2xvY2FsbmFtZSkKKyAgICAgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZU5vZGUoYXR0cikKKyAgICAgICAgICAgIGF0dHIudmFsdWUgPSB2YWx1ZQorCisgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gWyhTVEFSVF9FTEVNRU5ULCBub2RlKSwgTm9uZV0KKyAgICAgICAgc2VsZi5sYXN0RXZlbnQgPSBzZWxmLmxhc3RFdmVudFsxXQorICAgICAgICBzZWxmLnB1c2gobm9kZSkKKworICAgIGRlZiBlbmRFbGVtZW50TlMoc2VsZiwgbmFtZSwgdGFnTmFtZSk6CisgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gWyhFTkRfRUxFTUVOVCwgc2VsZi5wb3AoKSksIE5vbmVdCisgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5sYXN0RXZlbnRbMV0KKworICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICBpZiBzZWxmLmRvY3VtZW50OgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYuYnVpbGREb2N1bWVudChOb25lLCBuYW1lKQorCisgICAgICAgIGZvciBhbmFtZSx2YWx1ZSBpbiBhdHRycy5pdGVtcygpOgorICAgICAgICAgICAgYXR0ciA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGFuYW1lKQorICAgICAgICAgICAgYXR0ci52YWx1ZSA9IHZhbHVlCisgICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZU5vZGUoYXR0cikKKworICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IFsoU1RBUlRfRUxFTUVOVCwgbm9kZSksIE5vbmVdCisgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5sYXN0RXZlbnRbMV0KKyAgICAgICAgc2VsZi5wdXNoKG5vZGUpCisKKyAgICBkZWYgZW5kRWxlbWVudChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5sYXN0RXZlbnRbMV0gPSBbKEVORF9FTEVNRU5ULCBzZWxmLnBvcCgpKSwgTm9uZV0KKyAgICAgICAgc2VsZi5sYXN0RXZlbnQgPSBzZWxmLmxhc3RFdmVudFsxXQorCisgICAgZGVmIGNvbW1lbnQoc2VsZiwgcyk6CisgICAgICAgIGlmIHNlbGYuZG9jdW1lbnQ6CisgICAgICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5jcmVhdGVDb21tZW50KHMpCisgICAgICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IFsoQ09NTUVOVCwgbm9kZSksIE5vbmVdCisgICAgICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYubGFzdEV2ZW50WzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBldmVudCA9IFsoQ09NTUVOVCwgcyksIE5vbmVdCisgICAgICAgICAgICBzZWxmLnBlbmRpbmdfZXZlbnRzLmFwcGVuZChldmVudCkKKworICAgIGRlZiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5kb2N1bWVudDoKKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLmRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpCisgICAgICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IFsoUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgbm9kZSksIE5vbmVdCisgICAgICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYubGFzdEV2ZW50WzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBldmVudCA9IFsoUFJPQ0VTU0lOR19JTlNUUlVDVElPTiwgdGFyZ2V0LCBkYXRhKSwgTm9uZV0KKyAgICAgICAgICAgIHNlbGYucGVuZGluZ19ldmVudHMuYXBwZW5kKGV2ZW50KQorCisgICAgZGVmIGlnbm9yYWJsZVdoaXRlc3BhY2Uoc2VsZiwgY2hhcnMpOgorICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGFycykKKyAgICAgICAgc2VsZi5sYXN0RXZlbnRbMV0gPSBbKElHTk9SQUJMRV9XSElURVNQQUNFLCBub2RlKSwgTm9uZV0KKyAgICAgICAgc2VsZi5sYXN0RXZlbnQgPSBzZWxmLmxhc3RFdmVudFsxXQorCisgICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgY2hhcnMpOgorICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjaGFycykKKyAgICAgICAgc2VsZi5sYXN0RXZlbnRbMV0gPSBbKENIQVJBQ1RFUlMsIG5vZGUpLCBOb25lXQorICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYubGFzdEV2ZW50WzFdCisKKyAgICBkZWYgc3RhcnREb2N1bWVudChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5kb2N1bWVudEZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgICAgIGltcG9ydCB4bWwuZG9tLm1pbmlkb20KKyAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRGYWN0b3J5ID0geG1sLmRvbS5taW5pZG9tLkRvY3VtZW50LmltcGxlbWVudGF0aW9uCisKKyAgICBkZWYgYnVpbGREb2N1bWVudChzZWxmLCB1cmksIHRhZ25hbWUpOgorICAgICAgICAjIENhbid0IGRvIHRoYXQgaW4gc3RhcnREb2N1bWVudCwgc2luY2Ugd2UgbmVlZCB0aGUgdGFnbmFtZQorICAgICAgICAjIFhYWDogb2J0YWluIERvY3VtZW50VHlwZQorICAgICAgICBub2RlID0gc2VsZi5kb2N1bWVudEZhY3RvcnkuY3JlYXRlRG9jdW1lbnQodXJpLCB0YWduYW1lLCBOb25lKQorICAgICAgICBzZWxmLmRvY3VtZW50ID0gbm9kZQorICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IFsoU1RBUlRfRE9DVU1FTlQsIG5vZGUpLCBOb25lXQorICAgICAgICBzZWxmLmxhc3RFdmVudCA9IHNlbGYubGFzdEV2ZW50WzFdCisgICAgICAgIHNlbGYucHVzaChub2RlKQorICAgICAgICAjIFB1dCBldmVyeXRoaW5nIHdlIGhhdmUgc2VlbiBzbyBmYXIgaW50byB0aGUgZG9jdW1lbnQKKyAgICAgICAgZm9yIGUgaW4gc2VsZi5wZW5kaW5nX2V2ZW50czoKKyAgICAgICAgICAgIGlmIGVbMF1bMF0gPT0gUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoKKyAgICAgICAgICAgICAgICBfLHRhcmdldCxkYXRhID0gZVswXQorICAgICAgICAgICAgICAgIG4gPSBzZWxmLmRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpCisgICAgICAgICAgICAgICAgZVswXSA9IChQUk9DRVNTSU5HX0lOU1RSVUNUSU9OLCBuKQorICAgICAgICAgICAgZWxpZiBlWzBdWzBdID09IENPTU1FTlQ6CisgICAgICAgICAgICAgICAgbiA9IHNlbGYuZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlWzBdWzFdKQorICAgICAgICAgICAgICAgIGVbMF0gPSAoQ09NTUVOVCwgbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlVua25vd24gcGVuZGluZyBldmVudCAiLGVbMF1bMF0pCisgICAgICAgICAgICBzZWxmLmxhc3RFdmVudFsxXSA9IGUKKyAgICAgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gZQorICAgICAgICBzZWxmLnBlbmRpbmdfZXZlbnRzID0gTm9uZQorICAgICAgICByZXR1cm4gbm9kZS5maXJzdENoaWxkCisKKyAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYubGFzdEV2ZW50WzFdID0gWyhFTkRfRE9DVU1FTlQsIHNlbGYuZG9jdW1lbnQpLCBOb25lXQorICAgICAgICBzZWxmLnBvcCgpCisKKyAgICBkZWYgY2xlYXIoc2VsZik6CisgICAgICAgICJjbGVhcigpOiBFeHBsaWNpdGx5IHJlbGVhc2UgcGFyc2luZyBzdHJ1Y3R1cmVzIgorICAgICAgICBzZWxmLmRvY3VtZW50ID0gTm9uZQorCitjbGFzcyBFcnJvckhhbmRsZXI6CisgICAgZGVmIHdhcm5pbmcoc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgcHJpbnQgZXhjZXB0aW9uCisgICAgZGVmIGVycm9yKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgICAgIHJhaXNlIGV4Y2VwdGlvbgorICAgIGRlZiBmYXRhbEVycm9yKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgICAgIHJhaXNlIGV4Y2VwdGlvbgorCitjbGFzcyBET01FdmVudFN0cmVhbToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBwYXJzZXIsIGJ1ZnNpemUpOgorICAgICAgICBzZWxmLnN0cmVhbSA9IHN0cmVhbQorICAgICAgICBzZWxmLnBhcnNlciA9IHBhcnNlcgorICAgICAgICBzZWxmLmJ1ZnNpemUgPSBidWZzaXplCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYucGFyc2VyLCAnZmVlZCcpOgorICAgICAgICAgICAgc2VsZi5nZXRFdmVudCA9IHNlbGYuX3NsdXJwCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLnB1bGxkb20gPSBQdWxsRE9NKCkKKyAgICAgICAgIyBUaGlzIGNvbnRlbnQgaGFuZGxlciByZWxpZXMgb24gbmFtZXNwYWNlIHN1cHBvcnQKKyAgICAgICAgc2VsZi5wYXJzZXIuc2V0RmVhdHVyZSh4bWwuc2F4LmhhbmRsZXIuZmVhdHVyZV9uYW1lc3BhY2VzLCAxKQorICAgICAgICBzZWxmLnBhcnNlci5zZXRDb250ZW50SGFuZGxlcihzZWxmLnB1bGxkb20pCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgcG9zKToKKyAgICAgICAgcmMgPSBzZWxmLmdldEV2ZW50KCkKKyAgICAgICAgaWYgcmM6CisgICAgICAgICAgICByZXR1cm4gcmMKKyAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHJjID0gc2VsZi5nZXRFdmVudCgpCisgICAgICAgIGlmIHJjOgorICAgICAgICAgICAgcmV0dXJuIHJjCisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBleHBhbmROb2RlKHNlbGYsIG5vZGUpOgorICAgICAgICBldmVudCA9IHNlbGYuZ2V0RXZlbnQoKQorICAgICAgICBwYXJlbnRzID0gW25vZGVdCisgICAgICAgIHdoaWxlIGV2ZW50OgorICAgICAgICAgICAgdG9rZW4sIGN1cl9ub2RlID0gZXZlbnQKKyAgICAgICAgICAgIGlmIGN1cl9ub2RlIGlzIG5vZGU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiB0b2tlbiAhPSBFTkRfRUxFTUVOVDoKKyAgICAgICAgICAgICAgICBwYXJlbnRzWy0xXS5hcHBlbmRDaGlsZChjdXJfbm9kZSkKKyAgICAgICAgICAgIGlmIHRva2VuID09IFNUQVJUX0VMRU1FTlQ6CisgICAgICAgICAgICAgICAgcGFyZW50cy5hcHBlbmQoY3VyX25vZGUpCisgICAgICAgICAgICBlbGlmIHRva2VuID09IEVORF9FTEVNRU5UOgorICAgICAgICAgICAgICAgIGRlbCBwYXJlbnRzWy0xXQorICAgICAgICAgICAgZXZlbnQgPSBzZWxmLmdldEV2ZW50KCkKKworICAgIGRlZiBnZXRFdmVudChzZWxmKToKKyAgICAgICAgIyB1c2UgSW5jcmVtZW50YWxQYXJzZXIgaW50ZXJmYWNlLCBzbyB3ZSBnZXQgdGhlIGRlc2lyZWQKKyAgICAgICAgIyBwdWxsIGVmZmVjdAorICAgICAgICBpZiBub3Qgc2VsZi5wdWxsZG9tLmZpcnN0RXZlbnRbMV06CisgICAgICAgICAgICBzZWxmLnB1bGxkb20ubGFzdEV2ZW50ID0gc2VsZi5wdWxsZG9tLmZpcnN0RXZlbnQKKyAgICAgICAgd2hpbGUgbm90IHNlbGYucHVsbGRvbS5maXJzdEV2ZW50WzFdOgorICAgICAgICAgICAgYnVmID0gc2VsZi5zdHJlYW0ucmVhZChzZWxmLmJ1ZnNpemUpCisgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgc2VsZi5wYXJzZXIuZmVlZChidWYpCisgICAgICAgIHJjID0gc2VsZi5wdWxsZG9tLmZpcnN0RXZlbnRbMV1bMF0KKyAgICAgICAgc2VsZi5wdWxsZG9tLmZpcnN0RXZlbnRbMV0gPSBzZWxmLnB1bGxkb20uZmlyc3RFdmVudFsxXVsxXQorICAgICAgICByZXR1cm4gcmMKKworICAgIGRlZiBfc2x1cnAoc2VsZik6CisgICAgICAgICIiIiBGYWxsYmFjayByZXBsYWNlbWVudCBmb3IgZ2V0RXZlbnQoKSB1c2luZyB0aGUKKyAgICAgICAgICAgIHN0YW5kYXJkIFNBWDIgaW50ZXJmYWNlLCB3aGljaCBtZWFucyB3ZSBzbHVycCB0aGUKKyAgICAgICAgICAgIFNBWCBldmVudHMgaW50byBtZW1vcnkgKG5vIHBlcmZvcm1hbmNlIGdhaW4sIGJ1dAorICAgICAgICAgICAgd2UgYXJlIGNvbXBhdGlibGUgdG8gYWxsIFNBWCBwYXJzZXJzKS4KKyAgICAgICAgIiIiCisgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlKHNlbGYuc3RyZWFtKQorICAgICAgICBzZWxmLmdldEV2ZW50ID0gc2VsZi5fZW1pdAorICAgICAgICByZXR1cm4gc2VsZi5fZW1pdCgpCisKKyAgICBkZWYgX2VtaXQoc2VsZik6CisgICAgICAgICIiIiBGYWxsYmFjayByZXBsYWNlbWVudCBmb3IgZ2V0RXZlbnQoKSB0aGF0IGVtaXRzCisgICAgICAgICAgICB0aGUgZXZlbnRzIHRoYXQgX3NsdXJwKCkgcmVhZCBwcmV2aW91c2x5LgorICAgICAgICAiIiIKKyAgICAgICAgcmMgPSBzZWxmLnB1bGxkb20uZmlyc3RFdmVudFsxXVswXQorICAgICAgICBzZWxmLnB1bGxkb20uZmlyc3RFdmVudFsxXSA9IHNlbGYucHVsbGRvbS5maXJzdEV2ZW50WzFdWzFdCisgICAgICAgIHJldHVybiByYworCisgICAgZGVmIGNsZWFyKHNlbGYpOgorICAgICAgICAiIiJjbGVhcigpOiBFeHBsaWNpdGx5IHJlbGVhc2UgcGFyc2luZyBvYmplY3RzIiIiCisgICAgICAgIHNlbGYucHVsbGRvbS5jbGVhcigpCisgICAgICAgIGRlbCBzZWxmLnB1bGxkb20KKyAgICAgICAgc2VsZi5wYXJzZXIgPSBOb25lCisgICAgICAgIHNlbGYuc3RyZWFtID0gTm9uZQorCitjbGFzcyBTQVgyRE9NKFB1bGxET00pOgorCisgICAgZGVmIHN0YXJ0RWxlbWVudE5TKHNlbGYsIG5hbWUsIHRhZ05hbWUgLCBhdHRycyk6CisgICAgICAgIFB1bGxET00uc3RhcnRFbGVtZW50TlMoc2VsZiwgbmFtZSwgdGFnTmFtZSwgYXR0cnMpCisgICAgICAgIGN1ck5vZGUgPSBzZWxmLmVsZW1lbnRTdGFja1stMV0KKyAgICAgICAgcGFyZW50Tm9kZSA9IHNlbGYuZWxlbWVudFN0YWNrWy0yXQorICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGN1ck5vZGUpCisKKyAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgUHVsbERPTS5zdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpCisgICAgICAgIGN1ck5vZGUgPSBzZWxmLmVsZW1lbnRTdGFja1stMV0KKyAgICAgICAgcGFyZW50Tm9kZSA9IHNlbGYuZWxlbWVudFN0YWNrWy0yXQorICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKGN1ck5vZGUpCisKKyAgICBkZWYgcHJvY2Vzc2luZ0luc3RydWN0aW9uKHNlbGYsIHRhcmdldCwgZGF0YSk6CisgICAgICAgIFB1bGxET00ucHJvY2Vzc2luZ0luc3RydWN0aW9uKHNlbGYsIHRhcmdldCwgZGF0YSkKKyAgICAgICAgbm9kZSA9IHNlbGYubGFzdEV2ZW50WzBdWzFdCisgICAgICAgIHBhcmVudE5vZGUgPSBzZWxmLmVsZW1lbnRTdGFja1stMV0KKyAgICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKQorCisgICAgZGVmIGlnbm9yYWJsZVdoaXRlc3BhY2Uoc2VsZiwgY2hhcnMpOgorICAgICAgICBQdWxsRE9NLmlnbm9yYWJsZVdoaXRlc3BhY2Uoc2VsZiwgY2hhcnMpCisgICAgICAgIG5vZGUgPSBzZWxmLmxhc3RFdmVudFswXVsxXQorICAgICAgICBwYXJlbnROb2RlID0gc2VsZi5lbGVtZW50U3RhY2tbLTFdCisgICAgICAgIHBhcmVudE5vZGUuYXBwZW5kQ2hpbGQobm9kZSkKKworICAgIGRlZiBjaGFyYWN0ZXJzKHNlbGYsIGNoYXJzKToKKyAgICAgICAgUHVsbERPTS5jaGFyYWN0ZXJzKHNlbGYsIGNoYXJzKQorICAgICAgICBub2RlID0gc2VsZi5sYXN0RXZlbnRbMF1bMV0KKyAgICAgICAgcGFyZW50Tm9kZSA9IHNlbGYuZWxlbWVudFN0YWNrWy0xXQorICAgICAgICBwYXJlbnROb2RlLmFwcGVuZENoaWxkKG5vZGUpCisKKworZGVmYXVsdF9idWZzaXplID0gKDIgKiogMTQpIC0gMjAKKworZGVmIHBhcnNlKHN0cmVhbV9vcl9zdHJpbmcsIHBhcnNlcj1Ob25lLCBidWZzaXplPU5vbmUpOgorICAgIGlmIGJ1ZnNpemUgaXMgTm9uZToKKyAgICAgICAgYnVmc2l6ZSA9IGRlZmF1bHRfYnVmc2l6ZQorICAgIGlmIHR5cGUoc3RyZWFtX29yX3N0cmluZykgaW4gX1N0cmluZ1R5cGVzOgorICAgICAgICBzdHJlYW0gPSBvcGVuKHN0cmVhbV9vcl9zdHJpbmcpCisgICAgZWxzZToKKyAgICAgICAgc3RyZWFtID0gc3RyZWFtX29yX3N0cmluZworICAgIGlmIG5vdCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IHhtbC5zYXgubWFrZV9wYXJzZXIoKQorICAgIHJldHVybiBET01FdmVudFN0cmVhbShzdHJlYW0sIHBhcnNlciwgYnVmc2l6ZSkKKworZGVmIHBhcnNlU3RyaW5nKHN0cmluZywgcGFyc2VyPU5vbmUpOgorICAgIHRyeToKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCisgICAgYnVmc2l6ZSA9IGxlbihzdHJpbmcpCisgICAgYnVmID0gU3RyaW5nSU8oc3RyaW5nKQorICAgIGlmIG5vdCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IHhtbC5zYXgubWFrZV9wYXJzZXIoKQorICAgIHJldHVybiBET01FdmVudFN0cmVhbShidWYsIHBhcnNlciwgYnVmc2l6ZSkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9wdWxsZG9tLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2RvbS9wdWxsZG9tLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcxYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3B1bGxkb20ucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS9wdWxsZG9tLnB5byBiL2xpYi9weXRob24yLjcveG1sL2RvbS9wdWxsZG9tLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcxYWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3B1bGxkb20ucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvZG9tL3htbGJ1aWxkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3YzVkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5CkBAIC0wLDAgKzEsMzg2IEBACisiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRE9NIExldmVsIDMgJ0xTLUxvYWQnIGZlYXR1cmUuIiIiCisKK2ltcG9ydCBjb3B5CitpbXBvcnQgeG1sLmRvbQorCitmcm9tIHhtbC5kb20uTm9kZUZpbHRlciBpbXBvcnQgTm9kZUZpbHRlcgorCisKK19fYWxsX18gPSBbIkRPTUJ1aWxkZXIiLCAiRE9NRW50aXR5UmVzb2x2ZXIiLCAiRE9NSW5wdXRTb3VyY2UiXQorCisKK2NsYXNzIE9wdGlvbnM6CisgICAgIiIiRmVhdHVyZXMgb2JqZWN0IHRoYXQgaGFzIHZhcmlhYmxlcyBzZXQgZm9yIGVhY2ggRE9NQnVpbGRlciBmZWF0dXJlLgorCisgICAgVGhlIERPTUJ1aWxkZXIgY2xhc3MgdXNlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRvIHBhc3Mgc2V0dGluZ3MgdG8KKyAgICB0aGUgRXhwYXRCdWlsZGVyIGNsYXNzLgorICAgICIiIgorCisgICAgIyBOb3RlIHRoYXQgdGhlIERPTUJ1aWxkZXIgY2xhc3MgaW4gTG9hZFNhdmUgY29uc3RyYWlucyB3aGljaCBvZiB0aGVzZQorICAgICMgdmFsdWVzIGNhbiBiZSBzZXQgdXNpbmcgdGhlIERPTSBMZXZlbCAzIExvYWRTYXZlIGZlYXR1cmUuCisKKyAgICBuYW1lc3BhY2VzID0gMQorICAgIG5hbWVzcGFjZV9kZWNsYXJhdGlvbnMgPSBUcnVlCisgICAgdmFsaWRhdGlvbiA9IEZhbHNlCisgICAgZXh0ZXJuYWxfcGFyYW1ldGVyX2VudGl0aWVzID0gVHJ1ZQorICAgIGV4dGVybmFsX2dlbmVyYWxfZW50aXRpZXMgPSBUcnVlCisgICAgZXh0ZXJuYWxfZHRkX3N1YnNldCA9IFRydWUKKyAgICB2YWxpZGF0ZV9pZl9zY2hlbWEgPSBGYWxzZQorICAgIHZhbGlkYXRlID0gRmFsc2UKKyAgICBkYXRhdHlwZV9ub3JtYWxpemF0aW9uID0gRmFsc2UKKyAgICBjcmVhdGVfZW50aXR5X3JlZl9ub2RlcyA9IFRydWUKKyAgICBlbnRpdGllcyA9IFRydWUKKyAgICB3aGl0ZXNwYWNlX2luX2VsZW1lbnRfY29udGVudCA9IFRydWUKKyAgICBjZGF0YV9zZWN0aW9ucyA9IFRydWUKKyAgICBjb21tZW50cyA9IFRydWUKKyAgICBjaGFyc2V0X292ZXJyaWRlc194bWxfZW5jb2RpbmcgPSBUcnVlCisgICAgaW5mb3NldCA9IEZhbHNlCisgICAgc3VwcG9ydGVkX21lZGlhdHlwZXNfb25seSA9IEZhbHNlCisKKyAgICBlcnJvckhhbmRsZXIgPSBOb25lCisgICAgZmlsdGVyID0gTm9uZQorCisKK2NsYXNzIERPTUJ1aWxkZXI6CisgICAgZW50aXR5UmVzb2x2ZXIgPSBOb25lCisgICAgZXJyb3JIYW5kbGVyID0gTm9uZQorICAgIGZpbHRlciA9IE5vbmUKKworICAgIEFDVElPTl9SRVBMQUNFID0gMQorICAgIEFDVElPTl9BUFBFTkRfQVNfQ0hJTERSRU4gPSAyCisgICAgQUNUSU9OX0lOU0VSVF9BRlRFUiA9IDMKKyAgICBBQ1RJT05fSU5TRVJUX0JFRk9SRSA9IDQKKworICAgIF9sZWdhbF9hY3Rpb25zID0gKEFDVElPTl9SRVBMQUNFLCBBQ1RJT05fQVBQRU5EX0FTX0NISUxEUkVOLAorICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9JTlNFUlRfQUZURVIsIEFDVElPTl9JTlNFUlRfQkVGT1JFKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9vcHRpb25zID0gT3B0aW9ucygpCisKKyAgICBkZWYgX2dldF9lbnRpdHlSZXNvbHZlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZW50aXR5UmVzb2x2ZXIKKyAgICBkZWYgX3NldF9lbnRpdHlSZXNvbHZlcihzZWxmLCBlbnRpdHlSZXNvbHZlcik6CisgICAgICAgIHNlbGYuZW50aXR5UmVzb2x2ZXIgPSBlbnRpdHlSZXNvbHZlcgorCisgICAgZGVmIF9nZXRfZXJyb3JIYW5kbGVyKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lcnJvckhhbmRsZXIKKyAgICBkZWYgX3NldF9lcnJvckhhbmRsZXIoc2VsZiwgZXJyb3JIYW5kbGVyKToKKyAgICAgICAgc2VsZi5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXIKKworICAgIGRlZiBfZ2V0X2ZpbHRlcihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsdGVyCisgICAgZGVmIF9zZXRfZmlsdGVyKHNlbGYsIGZpbHRlcik6CisgICAgICAgIHNlbGYuZmlsdGVyID0gZmlsdGVyCisKKyAgICBkZWYgc2V0RmVhdHVyZShzZWxmLCBuYW1lLCBzdGF0ZSk6CisgICAgICAgIGlmIHNlbGYuc3VwcG9ydHNGZWF0dXJlKG5hbWUpOgorICAgICAgICAgICAgc3RhdGUgPSBzdGF0ZSBhbmQgMSBvciAwCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBzZWxmLl9zZXR0aW5nc1soX25hbWVfeGZvcm0obmFtZSksIHN0YXRlKV0KKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgICAgICAgICAgInVuc3VwcG9ydGVkIGZlYXR1cmU6ICVyIiAlIChuYW1lLCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciBuYW1lLCB2YWx1ZSBpbiBzZXR0aW5nczoKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLl9vcHRpb25zLCBuYW1lLCB2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoInVua25vd24gZmVhdHVyZTogIiArIHJlcHIobmFtZSkpCisKKyAgICBkZWYgc3VwcG9ydHNGZWF0dXJlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9vcHRpb25zLCBfbmFtZV94Zm9ybShuYW1lKSkKKworICAgIGRlZiBjYW5TZXRGZWF0dXJlKHNlbGYsIG5hbWUsIHN0YXRlKToKKyAgICAgICAga2V5ID0gKF9uYW1lX3hmb3JtKG5hbWUpLCBzdGF0ZSBhbmQgMSBvciAwKQorICAgICAgICByZXR1cm4ga2V5IGluIHNlbGYuX3NldHRpbmdzCisKKyAgICAjIFRoaXMgZGljdGlvbmFyeSBtYXBzIGZyb20gKGZlYXR1cmUsdmFsdWUpIHRvIGEgbGlzdCBvZgorICAgICMgKG9wdGlvbix2YWx1ZSkgcGFpcnMgdGhhdCBzaG91bGQgYmUgc2V0IG9uIHRoZSBPcHRpb25zIG9iamVjdC4KKyAgICAjIElmIGEgKGZlYXR1cmUsdmFsdWUpIHNldHRpbmcgaXMgbm90IGluIHRoaXMgZGljdGlvbmFyeSwgaXQgaXMKKyAgICAjIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIERPTUJ1aWxkZXIuCisgICAgIworICAgIF9zZXR0aW5ncyA9IHsKKyAgICAgICAgKCJuYW1lc3BhY2VfZGVjbGFyYXRpb25zIiwgMCk6IFsKKyAgICAgICAgICAgICgibmFtZXNwYWNlX2RlY2xhcmF0aW9ucyIsIDApXSwKKyAgICAgICAgKCJuYW1lc3BhY2VfZGVjbGFyYXRpb25zIiwgMSk6IFsKKyAgICAgICAgICAgICgibmFtZXNwYWNlX2RlY2xhcmF0aW9ucyIsIDEpXSwKKyAgICAgICAgKCJ2YWxpZGF0aW9uIiwgMCk6IFsKKyAgICAgICAgICAgICgidmFsaWRhdGlvbiIsIDApXSwKKyAgICAgICAgKCJleHRlcm5hbF9nZW5lcmFsX2VudGl0aWVzIiwgMCk6IFsKKyAgICAgICAgICAgICgiZXh0ZXJuYWxfZ2VuZXJhbF9lbnRpdGllcyIsIDApXSwKKyAgICAgICAgKCJleHRlcm5hbF9nZW5lcmFsX2VudGl0aWVzIiwgMSk6IFsKKyAgICAgICAgICAgICgiZXh0ZXJuYWxfZ2VuZXJhbF9lbnRpdGllcyIsIDEpXSwKKyAgICAgICAgKCJleHRlcm5hbF9wYXJhbWV0ZXJfZW50aXRpZXMiLCAwKTogWworICAgICAgICAgICAgKCJleHRlcm5hbF9wYXJhbWV0ZXJfZW50aXRpZXMiLCAwKV0sCisgICAgICAgICgiZXh0ZXJuYWxfcGFyYW1ldGVyX2VudGl0aWVzIiwgMSk6IFsKKyAgICAgICAgICAgICgiZXh0ZXJuYWxfcGFyYW1ldGVyX2VudGl0aWVzIiwgMSldLAorICAgICAgICAoInZhbGlkYXRlX2lmX3NjaGVtYSIsIDApOiBbCisgICAgICAgICAgICAoInZhbGlkYXRlX2lmX3NjaGVtYSIsIDApXSwKKyAgICAgICAgKCJjcmVhdGVfZW50aXR5X3JlZl9ub2RlcyIsIDApOiBbCisgICAgICAgICAgICAoImNyZWF0ZV9lbnRpdHlfcmVmX25vZGVzIiwgMCldLAorICAgICAgICAoImNyZWF0ZV9lbnRpdHlfcmVmX25vZGVzIiwgMSk6IFsKKyAgICAgICAgICAgICgiY3JlYXRlX2VudGl0eV9yZWZfbm9kZXMiLCAxKV0sCisgICAgICAgICgiZW50aXRpZXMiLCAwKTogWworICAgICAgICAgICAgKCJjcmVhdGVfZW50aXR5X3JlZl9ub2RlcyIsIDApLAorICAgICAgICAgICAgKCJlbnRpdGllcyIsIDApXSwKKyAgICAgICAgKCJlbnRpdGllcyIsIDEpOiBbCisgICAgICAgICAgICAoImVudGl0aWVzIiwgMSldLAorICAgICAgICAoIndoaXRlc3BhY2VfaW5fZWxlbWVudF9jb250ZW50IiwgMCk6IFsKKyAgICAgICAgICAgICgid2hpdGVzcGFjZV9pbl9lbGVtZW50X2NvbnRlbnQiLCAwKV0sCisgICAgICAgICgid2hpdGVzcGFjZV9pbl9lbGVtZW50X2NvbnRlbnQiLCAxKTogWworICAgICAgICAgICAgKCJ3aGl0ZXNwYWNlX2luX2VsZW1lbnRfY29udGVudCIsIDEpXSwKKyAgICAgICAgKCJjZGF0YV9zZWN0aW9ucyIsIDApOiBbCisgICAgICAgICAgICAoImNkYXRhX3NlY3Rpb25zIiwgMCldLAorICAgICAgICAoImNkYXRhX3NlY3Rpb25zIiwgMSk6IFsKKyAgICAgICAgICAgICgiY2RhdGFfc2VjdGlvbnMiLCAxKV0sCisgICAgICAgICgiY29tbWVudHMiLCAwKTogWworICAgICAgICAgICAgKCJjb21tZW50cyIsIDApXSwKKyAgICAgICAgKCJjb21tZW50cyIsIDEpOiBbCisgICAgICAgICAgICAoImNvbW1lbnRzIiwgMSldLAorICAgICAgICAoImNoYXJzZXRfb3ZlcnJpZGVzX3htbF9lbmNvZGluZyIsIDApOiBbCisgICAgICAgICAgICAoImNoYXJzZXRfb3ZlcnJpZGVzX3htbF9lbmNvZGluZyIsIDApXSwKKyAgICAgICAgKCJjaGFyc2V0X292ZXJyaWRlc194bWxfZW5jb2RpbmciLCAxKTogWworICAgICAgICAgICAgKCJjaGFyc2V0X292ZXJyaWRlc194bWxfZW5jb2RpbmciLCAxKV0sCisgICAgICAgICgiaW5mb3NldCIsIDApOiBbXSwKKyAgICAgICAgKCJpbmZvc2V0IiwgMSk6IFsKKyAgICAgICAgICAgICgibmFtZXNwYWNlX2RlY2xhcmF0aW9ucyIsIDApLAorICAgICAgICAgICAgKCJ2YWxpZGF0ZV9pZl9zY2hlbWEiLCAwKSwKKyAgICAgICAgICAgICgiY3JlYXRlX2VudGl0eV9yZWZfbm9kZXMiLCAwKSwKKyAgICAgICAgICAgICgiZW50aXRpZXMiLCAwKSwKKyAgICAgICAgICAgICgiY2RhdGFfc2VjdGlvbnMiLCAwKSwKKyAgICAgICAgICAgICgiZGF0YXR5cGVfbm9ybWFsaXphdGlvbiIsIDEpLAorICAgICAgICAgICAgKCJ3aGl0ZXNwYWNlX2luX2VsZW1lbnRfY29udGVudCIsIDEpLAorICAgICAgICAgICAgKCJjb21tZW50cyIsIDEpLAorICAgICAgICAgICAgKCJjaGFyc2V0X292ZXJyaWRlc194bWxfZW5jb2RpbmciLCAxKV0sCisgICAgICAgICgic3VwcG9ydGVkX21lZGlhdHlwZXNfb25seSIsIDApOiBbCisgICAgICAgICAgICAoInN1cHBvcnRlZF9tZWRpYXR5cGVzX29ubHkiLCAwKV0sCisgICAgICAgICgibmFtZXNwYWNlcyIsIDApOiBbCisgICAgICAgICAgICAoIm5hbWVzcGFjZXMiLCAwKV0sCisgICAgICAgICgibmFtZXNwYWNlcyIsIDEpOiBbCisgICAgICAgICAgICAoIm5hbWVzcGFjZXMiLCAxKV0sCisgICAgfQorCisgICAgZGVmIGdldEZlYXR1cmUoc2VsZiwgbmFtZSk6CisgICAgICAgIHhuYW1lID0gX25hbWVfeGZvcm0obmFtZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fb3B0aW9ucywgeG5hbWUpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGlmIG5hbWUgPT0gImluZm9zZXQiOgorICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBzZWxmLl9vcHRpb25zCisgICAgICAgICAgICAgICAgcmV0dXJuIChvcHRpb25zLmRhdGF0eXBlX25vcm1hbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBvcHRpb25zLndoaXRlc3BhY2VfaW5fZWxlbWVudF9jb250ZW50CisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgb3B0aW9ucy5jb21tZW50cworICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9wdGlvbnMuY2hhcnNldF9vdmVycmlkZXNfeG1sX2VuY29kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm90IChvcHRpb25zLm5hbWVzcGFjZV9kZWNsYXJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG9wdGlvbnMudmFsaWRhdGVfaWZfc2NoZW1hCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBvcHRpb25zLmNyZWF0ZV9lbnRpdHlfcmVmX25vZGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBvcHRpb25zLmVudGl0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBvcHRpb25zLmNkYXRhX3NlY3Rpb25zKSkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoImZlYXR1cmUgJXMgbm90IGtub3duIiAlIHJlcHIobmFtZSkpCisKKyAgICBkZWYgcGFyc2VVUkkoc2VsZiwgdXJpKToKKyAgICAgICAgaWYgc2VsZi5lbnRpdHlSZXNvbHZlcjoKKyAgICAgICAgICAgIGlucHV0ID0gc2VsZi5lbnRpdHlSZXNvbHZlci5yZXNvbHZlRW50aXR5KE5vbmUsIHVyaSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlucHV0ID0gRE9NRW50aXR5UmVzb2x2ZXIoKS5yZXNvbHZlRW50aXR5KE5vbmUsIHVyaSkKKyAgICAgICAgcmV0dXJuIHNlbGYucGFyc2UoaW5wdXQpCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgaW5wdXQpOgorICAgICAgICBvcHRpb25zID0gY29weS5jb3B5KHNlbGYuX29wdGlvbnMpCisgICAgICAgIG9wdGlvbnMuZmlsdGVyID0gc2VsZi5maWx0ZXIKKyAgICAgICAgb3B0aW9ucy5lcnJvckhhbmRsZXIgPSBzZWxmLmVycm9ySGFuZGxlcgorICAgICAgICBmcCA9IGlucHV0LmJ5dGVTdHJlYW0KKyAgICAgICAgaWYgZnAgaXMgTm9uZSBhbmQgb3B0aW9ucy5zeXN0ZW1JZDoKKyAgICAgICAgICAgIGltcG9ydCB1cmxsaWIyCisgICAgICAgICAgICBmcCA9IHVybGxpYjIudXJsb3BlbihpbnB1dC5zeXN0ZW1JZCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlX2J5dGVzdHJlYW0oZnAsIG9wdGlvbnMpCisKKyAgICBkZWYgcGFyc2VXaXRoQ29udGV4dChzZWxmLCBpbnB1dCwgY25vZGUsIGFjdGlvbik6CisgICAgICAgIGlmIGFjdGlvbiBub3QgaW4gc2VsZi5fbGVnYWxfYWN0aW9uczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIm5vdCBhIGxlZ2FsIGFjdGlvbiIpCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIkhhdmVuJ3Qgd3JpdHRlbiB0aGlzIHlldC4uLiIpCisKKyAgICBkZWYgX3BhcnNlX2J5dGVzdHJlYW0oc2VsZiwgc3RyZWFtLCBvcHRpb25zKToKKyAgICAgICAgaW1wb3J0IHhtbC5kb20uZXhwYXRidWlsZGVyCisgICAgICAgIGJ1aWxkZXIgPSB4bWwuZG9tLmV4cGF0YnVpbGRlci5tYWtlQnVpbGRlcihvcHRpb25zKQorICAgICAgICByZXR1cm4gYnVpbGRlci5wYXJzZUZpbGUoc3RyZWFtKQorCisKK2RlZiBfbmFtZV94Zm9ybShuYW1lKToKKyAgICByZXR1cm4gbmFtZS5sb3dlcigpLnJlcGxhY2UoJy0nLCAnXycpCisKKworY2xhc3MgRE9NRW50aXR5UmVzb2x2ZXIob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAnX29wZW5lcicsCisKKyAgICBkZWYgcmVzb2x2ZUVudGl0eShzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICBhc3NlcnQgc3lzdGVtSWQgaXMgbm90IE5vbmUKKyAgICAgICAgc291cmNlID0gRE9NSW5wdXRTb3VyY2UoKQorICAgICAgICBzb3VyY2UucHVibGljSWQgPSBwdWJsaWNJZAorICAgICAgICBzb3VyY2Uuc3lzdGVtSWQgPSBzeXN0ZW1JZAorICAgICAgICBzb3VyY2UuYnl0ZVN0cmVhbSA9IHNlbGYuX2dldF9vcGVuZXIoKS5vcGVuKHN5c3RlbUlkKQorCisgICAgICAgICMgZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBpZiB0aGUgdHJhbnNwb3J0IHByb3ZpZGVkIGl0CisgICAgICAgIHNvdXJjZS5lbmNvZGluZyA9IHNlbGYuX2d1ZXNzX21lZGlhX2VuY29kaW5nKHNvdXJjZSkKKworICAgICAgICAjIGRldGVybWluZSB0aGUgYmFzZSBVUkkgaXMgd2UgY2FuCisgICAgICAgIGltcG9ydCBwb3NpeHBhdGgsIHVybHBhcnNlCisgICAgICAgIHBhcnRzID0gdXJscGFyc2UudXJscGFyc2Uoc3lzdGVtSWQpCisgICAgICAgIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCA9IHBhcnRzCisgICAgICAgICMgWFhYIHNob3VsZCB3ZSBjaGVjayB0aGUgc2NoZW1lIGhlcmUgYXMgd2VsbD8KKyAgICAgICAgaWYgcGF0aCBhbmQgbm90IHBhdGguZW5kc3dpdGgoIi8iKToKKyAgICAgICAgICAgIHBhdGggPSBwb3NpeHBhdGguZGlybmFtZShwYXRoKSArICIvIgorICAgICAgICAgICAgcGFydHMgPSBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQKKyAgICAgICAgICAgIHNvdXJjZS5iYXNlVVJJID0gdXJscGFyc2UudXJsdW5wYXJzZShwYXJ0cykKKworICAgICAgICByZXR1cm4gc291cmNlCisKKyAgICBkZWYgX2dldF9vcGVuZXIoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9vcGVuZXIKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgc2VsZi5fb3BlbmVyID0gc2VsZi5fY3JlYXRlX29wZW5lcigpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fb3BlbmVyCisKKyAgICBkZWYgX2NyZWF0ZV9vcGVuZXIoc2VsZik6CisgICAgICAgIGltcG9ydCB1cmxsaWIyCisgICAgICAgIHJldHVybiB1cmxsaWIyLmJ1aWxkX29wZW5lcigpCisKKyAgICBkZWYgX2d1ZXNzX21lZGlhX2VuY29kaW5nKHNlbGYsIHNvdXJjZSk6CisgICAgICAgIGluZm8gPSBzb3VyY2UuYnl0ZVN0cmVhbS5pbmZvKCkKKyAgICAgICAgaWYgIkNvbnRlbnQtVHlwZSIgaW4gaW5mbzoKKyAgICAgICAgICAgIGZvciBwYXJhbSBpbiBpbmZvLmdldHBsaXN0KCk6CisgICAgICAgICAgICAgICAgaWYgcGFyYW0uc3RhcnRzd2l0aCgiY2hhcnNldD0iKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnNwbGl0KCI9IiwgMSlbMV0ubG93ZXIoKQorCisKK2NsYXNzIERPTUlucHV0U291cmNlKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCdieXRlU3RyZWFtJywgJ2NoYXJhY3RlclN0cmVhbScsICdzdHJpbmdEYXRhJywKKyAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJywgJ3B1YmxpY0lkJywgJ3N5c3RlbUlkJywgJ2Jhc2VVUkknKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmJ5dGVTdHJlYW0gPSBOb25lCisgICAgICAgIHNlbGYuY2hhcmFjdGVyU3RyZWFtID0gTm9uZQorICAgICAgICBzZWxmLnN0cmluZ0RhdGEgPSBOb25lCisgICAgICAgIHNlbGYuZW5jb2RpbmcgPSBOb25lCisgICAgICAgIHNlbGYucHVibGljSWQgPSBOb25lCisgICAgICAgIHNlbGYuc3lzdGVtSWQgPSBOb25lCisgICAgICAgIHNlbGYuYmFzZVVSSSA9IE5vbmUKKworICAgIGRlZiBfZ2V0X2J5dGVTdHJlYW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJ5dGVTdHJlYW0KKyAgICBkZWYgX3NldF9ieXRlU3RyZWFtKHNlbGYsIGJ5dGVTdHJlYW0pOgorICAgICAgICBzZWxmLmJ5dGVTdHJlYW0gPSBieXRlU3RyZWFtCisKKyAgICBkZWYgX2dldF9jaGFyYWN0ZXJTdHJlYW0oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNoYXJhY3RlclN0cmVhbQorICAgIGRlZiBfc2V0X2NoYXJhY3RlclN0cmVhbShzZWxmLCBjaGFyYWN0ZXJTdHJlYW0pOgorICAgICAgICBzZWxmLmNoYXJhY3RlclN0cmVhbSA9IGNoYXJhY3RlclN0cmVhbQorCisgICAgZGVmIF9nZXRfc3RyaW5nRGF0YShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuc3RyaW5nRGF0YQorICAgIGRlZiBfc2V0X3N0cmluZ0RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuc3RyaW5nRGF0YSA9IGRhdGEKKworICAgIGRlZiBfZ2V0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5lbmNvZGluZworICAgIGRlZiBfc2V0X2VuY29kaW5nKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgc2VsZi5lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICBkZWYgX2dldF9wdWJsaWNJZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYucHVibGljSWQKKyAgICBkZWYgX3NldF9wdWJsaWNJZChzZWxmLCBwdWJsaWNJZCk6CisgICAgICAgIHNlbGYucHVibGljSWQgPSBwdWJsaWNJZAorCisgICAgZGVmIF9nZXRfc3lzdGVtSWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN5c3RlbUlkCisgICAgZGVmIF9zZXRfc3lzdGVtSWQoc2VsZiwgc3lzdGVtSWQpOgorICAgICAgICBzZWxmLnN5c3RlbUlkID0gc3lzdGVtSWQKKworICAgIGRlZiBfZ2V0X2Jhc2VVUkkoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmJhc2VVUkkKKyAgICBkZWYgX3NldF9iYXNlVVJJKHNlbGYsIHVyaSk6CisgICAgICAgIHNlbGYuYmFzZVVSSSA9IHVyaQorCisKK2NsYXNzIERPTUJ1aWxkZXJGaWx0ZXI6CisgICAgIiIiRWxlbWVudCBmaWx0ZXIgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdGFpbG9yIGNvbnN0cnVjdGlvbiBvZgorICAgIGEgRE9NIGluc3RhbmNlLgorICAgICIiIgorCisgICAgIyBUaGVyZSdzIHJlYWxseSBubyBuZWVkIGZvciB0aGlzIGNsYXNzOyBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbnMKKyAgICAjIHNob3VsZCBqdXN0IGltcGxlbWVudCB0aGUgZW5kRWxlbWVudCgpIGFuZCBzdGFydEVsZW1lbnQoKQorICAgICMgbWV0aG9kcyBhcyBhcHByb3ByaWF0ZS4gIFVzaW5nIHRoaXMgbWFrZXMgaXQgZWFzeSB0byBvbmx5CisgICAgIyBpbXBsZW1lbnQgb25lIG9mIHRoZW0uCisKKyAgICBGSUxURVJfQUNDRVBUID0gMQorICAgIEZJTFRFUl9SRUpFQ1QgPSAyCisgICAgRklMVEVSX1NLSVAgPSAzCisgICAgRklMVEVSX0lOVEVSUlVQVCA9IDQKKworICAgIHdoYXRUb1Nob3cgPSBOb2RlRmlsdGVyLlNIT1dfQUxMCisKKyAgICBkZWYgX2dldF93aGF0VG9TaG93KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi53aGF0VG9TaG93CisKKyAgICBkZWYgYWNjZXB0Tm9kZShzZWxmLCBlbGVtZW50KToKKyAgICAgICAgcmV0dXJuIHNlbGYuRklMVEVSX0FDQ0VQVAorCisgICAgZGVmIHN0YXJ0Q29udGFpbmVyKHNlbGYsIGVsZW1lbnQpOgorICAgICAgICByZXR1cm4gc2VsZi5GSUxURVJfQUNDRVBUCisKK2RlbCBOb2RlRmlsdGVyCisKKworY2xhc3MgRG9jdW1lbnRMUzoKKyAgICAiIiJNaXhpbiB0byBjcmVhdGUgZG9jdW1lbnRzIHRoYXQgY29uZm9ybSB0byB0aGUgbG9hZC9zYXZlIHNwZWMuIiIiCisKKyAgICBhc3luYyA9IEZhbHNlCisKKyAgICBkZWYgX2dldF9hc3luYyhzZWxmKToKKyAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZGVmIF9zZXRfYXN5bmMoc2VsZiwgYXN5bmMpOgorICAgICAgICBpZiBhc3luYzoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgICAgICJhc3luY2hyb25vdXMgZG9jdW1lbnQgbG9hZGluZyBpcyBub3Qgc3VwcG9ydGVkIikKKworICAgIGRlZiBhYm9ydChzZWxmKToKKyAgICAgICAgIyBXaGF0IGRvZXMgaXQgbWVhbiB0byAiY2xlYXIiIGEgZG9jdW1lbnQ/ICBEb2VzIHRoZQorICAgICAgICAjIGRvY3VtZW50RWxlbWVudCBkaXNhcHBlYXI/CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAiaGF2ZW4ndCBmaWd1cmVkIG91dCB3aGF0IHRoaXMgbWVhbnMgeWV0IikKKworICAgIGRlZiBsb2FkKHNlbGYsIHVyaSk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoImhhdmVuJ3Qgd3JpdHRlbiB0aGlzIHlldCIpCisKKyAgICBkZWYgbG9hZFhNTChzZWxmLCBzb3VyY2UpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJoYXZlbid0IHdyaXR0ZW4gdGhpcyB5ZXQiKQorCisgICAgZGVmIHNhdmVYTUwoc2VsZiwgc25vZGUpOgorICAgICAgICBpZiBzbm9kZSBpcyBOb25lOgorICAgICAgICAgICAgc25vZGUgPSBzZWxmCisgICAgICAgIGVsaWYgc25vZGUub3duZXJEb2N1bWVudCBpcyBub3Qgc2VsZjoKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uV3JvbmdEb2N1bWVudEVycigpCisgICAgICAgIHJldHVybiBzbm9kZS50b3htbCgpCisKKworY2xhc3MgRE9NSW1wbGVtZW50YXRpb25MUzoKKyAgICBNT0RFX1NZTkNIUk9OT1VTID0gMQorICAgIE1PREVfQVNZTkNIUk9OT1VTID0gMgorCisgICAgZGVmIGNyZWF0ZURPTUJ1aWxkZXIoc2VsZiwgbW9kZSwgc2NoZW1hVHlwZSk6CisgICAgICAgIGlmIHNjaGVtYVR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgICAgICAic2NoZW1hVHlwZSBub3QgeWV0IHN1cHBvcnRlZCIpCisgICAgICAgIGlmIG1vZGUgPT0gc2VsZi5NT0RFX1NZTkNIUk9OT1VTOgorICAgICAgICAgICAgcmV0dXJuIERPTUJ1aWxkZXIoKQorICAgICAgICBpZiBtb2RlID09IHNlbGYuTU9ERV9BU1lOQ0hST05PVVM6CisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigKKyAgICAgICAgICAgICAgICAiYXN5bmNocm9ub3VzIGJ1aWxkZXJzIGFyZSBub3Qgc3VwcG9ydGVkIikKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5rbm93biB2YWx1ZSBmb3IgbW9kZSIpCisKKyAgICBkZWYgY3JlYXRlRE9NV3JpdGVyKHNlbGYpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgInRoZSB3cml0ZXIgaW50ZXJmYWNlIGhhc24ndCBiZWVuIHdyaXR0ZW4geWV0ISIpCisKKyAgICBkZWYgY3JlYXRlRE9NSW5wdXRTb3VyY2Uoc2VsZik6CisgICAgICAgIHJldHVybiBET01JbnB1dFNvdXJjZSgpCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20veG1sYnVpbGRlci5weWMgYi9saWIvcHl0aG9uMi43L3htbC9kb20veG1sYnVpbGRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMzQ0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9kb20veG1sYnVpbGRlci5weW8gYi9saWIvcHl0aG9uMi43L3htbC9kb20veG1sYnVpbGRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwMTJlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2RvbS94bWxidWlsZGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weSBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRJbmNsdWRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmQ3NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weQpAQCAtMCwwICsxLDE0MyBAQAorIworIyBFbGVtZW50VHJlZQorIyAkSWQ6IEVsZW1lbnRJbmNsdWRlLnB5IDMzNzUgMjAwOC0wMi0xMyAwODowNTowOFogZnJlZHJpayAkCisjCisjIGxpbWl0ZWQgeGluY2x1ZGUgc3VwcG9ydCBmb3IgZWxlbWVudCB0cmVlcworIworIyBoaXN0b3J5OgorIyAyMDAzLTA4LTE1IGZsICAgY3JlYXRlZAorIyAyMDAzLTExLTE0IGZsICAgZml4ZWQgZGVmYXVsdCBsb2FkZXIKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgYnkgRnJlZHJpayBMdW5kaC4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIGZyZWRyaWtAcHl0aG9ud2FyZS5jb20KKyMgaHR0cDovL3d3dy5weXRob253YXJlLmNvbQorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgRWxlbWVudFRyZWUgdG9vbGtpdCBpcworIworIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCBieSBGcmVkcmlrIEx1bmRoCisjCisjIEJ5IG9idGFpbmluZywgdXNpbmcsIGFuZC9vciBjb3B5aW5nIHRoaXMgc29mdHdhcmUgYW5kL29yIGl0cworIyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24sIHlvdSBhZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsCisjIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6CisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisjIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcworIyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluCisjIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyMgbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mCisjIFNlY3JldCBMYWJzIEFCIG9yIHRoZSBhdXRob3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5CisjIHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuCisjIHByaW9yIHBlcm1pc3Npb24uCisjCisjIFNFQ1JFVCBMQUJTIEFCIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRAorIyBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVC0KKyMgQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIFNFQ1JFVCBMQUJTIEFCIE9SIFRIRSBBVVRIT1IKKyMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWQorIyBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyMgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorIyBPRiBUSElTIFNPRlRXQVJFLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKyMgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2YvbGljZW5zZSBmb3IgbGljZW5zaW5nIGRldGFpbHMuCisKKyMjCisjIExpbWl0ZWQgWEluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIEVsZW1lbnRUcmVlIHBhY2thZ2UuCisjIworCitpbXBvcnQgY29weQorZnJvbSAuIGltcG9ydCBFbGVtZW50VHJlZQorCitYSU5DTFVERSA9ICJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZX0iCisKK1hJTkNMVURFX0lOQ0xVREUgPSBYSU5DTFVERSArICJpbmNsdWRlIgorWElOQ0xVREVfRkFMTEJBQ0sgPSBYSU5DTFVERSArICJmYWxsYmFjayIKKworIyMKKyMgRmF0YWwgaW5jbHVkZSBlcnJvci4KKworY2xhc3MgRmF0YWxJbmNsdWRlRXJyb3IoU3ludGF4RXJyb3IpOgorICAgIHBhc3MKKworIyMKKyMgRGVmYXVsdCBsb2FkZXIuICBUaGlzIGxvYWRlciByZWFkcyBhbiBpbmNsdWRlZCByZXNvdXJjZSBmcm9tIGRpc2suCisjCisjIEBwYXJhbSBocmVmIFJlc291cmNlIHJlZmVyZW5jZS4KKyMgQHBhcmFtIHBhcnNlIFBhcnNlIG1vZGUuICBFaXRoZXIgInhtbCIgb3IgInRleHQiLgorIyBAcGFyYW0gZW5jb2RpbmcgT3B0aW9uYWwgdGV4dCBlbmNvZGluZy4KKyMgQHJldHVybiBUaGUgZXhwYW5kZWQgcmVzb3VyY2UuICBJZiB0aGUgcGFyc2UgbW9kZSBpcyAieG1sIiwgdGhpcworIyAgICBpcyBhbiBFbGVtZW50VHJlZSBpbnN0YW5jZS4gIElmIHRoZSBwYXJzZSBtb2RlIGlzICJ0ZXh0IiwgdGhpcworIyAgICBpcyBhIFVuaWNvZGUgc3RyaW5nLiAgSWYgdGhlIGxvYWRlciBmYWlscywgaXQgY2FuIHJldHVybiBOb25lCisjICAgIG9yIHJhaXNlIGFuIElPRXJyb3IgZXhjZXB0aW9uLgorIyBAdGhyb3dzIElPRXJyb3IgSWYgdGhlIGxvYWRlciBmYWlscyB0byBsb2FkIHRoZSByZXNvdXJjZS4KKworZGVmIGRlZmF1bHRfbG9hZGVyKGhyZWYsIHBhcnNlLCBlbmNvZGluZz1Ob25lKToKKyAgICBmaWxlID0gb3BlbihocmVmKQorICAgIGlmIHBhcnNlID09ICJ4bWwiOgorICAgICAgICBkYXRhID0gRWxlbWVudFRyZWUucGFyc2UoZmlsZSkuZ2V0cm9vdCgpCisgICAgZWxzZToKKyAgICAgICAgZGF0YSA9IGZpbGUucmVhZCgpCisgICAgICAgIGlmIGVuY29kaW5nOgorICAgICAgICAgICAgZGF0YSA9IGRhdGEuZGVjb2RlKGVuY29kaW5nKQorICAgIGZpbGUuY2xvc2UoKQorICAgIHJldHVybiBkYXRhCisKKyMjCisjIEV4cGFuZCBYSW5jbHVkZSBkaXJlY3RpdmVzLgorIworIyBAcGFyYW0gZWxlbSBSb290IGVsZW1lbnQuCisjIEBwYXJhbSBsb2FkZXIgT3B0aW9uYWwgcmVzb3VyY2UgbG9hZGVyLiAgSWYgb21pdHRlZCwgaXQgZGVmYXVsdHMKKyMgICAgIHRvIHtAbGluayBkZWZhdWx0X2xvYWRlcn0uICBJZiBnaXZlbiwgaXQgc2hvdWxkIGJlIGEgY2FsbGFibGUKKyMgICAgIHRoYXQgaW1wbGVtZW50cyB0aGUgc2FtZSBpbnRlcmZhY2UgYXMgPGI+ZGVmYXVsdF9sb2FkZXI8L2I+LgorIyBAdGhyb3dzIEZhdGFsSW5jbHVkZUVycm9yIElmIHRoZSBmdW5jdGlvbiBmYWlscyB0byBpbmNsdWRlIGEgZ2l2ZW4KKyMgICAgIHJlc291cmNlLCBvciBpZiB0aGUgdHJlZSBjb250YWlucyBtYWxmb3JtZWQgWEluY2x1ZGUgZWxlbWVudHMuCisjIEB0aHJvd3MgSU9FcnJvciBJZiB0aGUgZnVuY3Rpb24gZmFpbHMgdG8gbG9hZCBhIGdpdmVuIHJlc291cmNlLgorCitkZWYgaW5jbHVkZShlbGVtLCBsb2FkZXI9Tm9uZSk6CisgICAgaWYgbG9hZGVyIGlzIE5vbmU6CisgICAgICAgIGxvYWRlciA9IGRlZmF1bHRfbG9hZGVyCisgICAgIyBsb29rIGZvciB4aW5jbHVkZSBlbGVtZW50cworICAgIGkgPSAwCisgICAgd2hpbGUgaSA8IGxlbihlbGVtKToKKyAgICAgICAgZSA9IGVsZW1baV0KKyAgICAgICAgaWYgZS50YWcgPT0gWElOQ0xVREVfSU5DTFVERToKKyAgICAgICAgICAgICMgcHJvY2VzcyB4aW5jbHVkZSBkaXJlY3RpdmUKKyAgICAgICAgICAgIGhyZWYgPSBlLmdldCgiaHJlZiIpCisgICAgICAgICAgICBwYXJzZSA9IGUuZ2V0KCJwYXJzZSIsICJ4bWwiKQorICAgICAgICAgICAgaWYgcGFyc2UgPT0gInhtbCI6CisgICAgICAgICAgICAgICAgbm9kZSA9IGxvYWRlcihocmVmLCBwYXJzZSkKKyAgICAgICAgICAgICAgICBpZiBub2RlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEZhdGFsSW5jbHVkZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBsb2FkICVyIGFzICVyIiAlIChocmVmLCBwYXJzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBub2RlID0gY29weS5jb3B5KG5vZGUpCisgICAgICAgICAgICAgICAgaWYgZS50YWlsOgorICAgICAgICAgICAgICAgICAgICBub2RlLnRhaWwgPSAobm9kZS50YWlsIG9yICIiKSArIGUudGFpbAorICAgICAgICAgICAgICAgIGVsZW1baV0gPSBub2RlCisgICAgICAgICAgICBlbGlmIHBhcnNlID09ICJ0ZXh0IjoKKyAgICAgICAgICAgICAgICB0ZXh0ID0gbG9hZGVyKGhyZWYsIHBhcnNlLCBlLmdldCgiZW5jb2RpbmciKSkKKyAgICAgICAgICAgICAgICBpZiB0ZXh0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIEZhdGFsSW5jbHVkZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBsb2FkICVyIGFzICVyIiAlIChocmVmLCBwYXJzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBpZiBpOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gZWxlbVtpLTFdCisgICAgICAgICAgICAgICAgICAgIG5vZGUudGFpbCA9IChub2RlLnRhaWwgb3IgIiIpICsgdGV4dCArIChlLnRhaWwgb3IgIiIpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZWxlbS50ZXh0ID0gKGVsZW0udGV4dCBvciAiIikgKyB0ZXh0ICsgKGUudGFpbCBvciAiIikKKyAgICAgICAgICAgICAgICBkZWwgZWxlbVtpXQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIEZhdGFsSW5jbHVkZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAidW5rbm93biBwYXJzZSB0eXBlIGluIHhpOmluY2x1ZGUgdGFnICglcikiICUgcGFyc2UKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGVsaWYgZS50YWcgPT0gWElOQ0xVREVfRkFMTEJBQ0s6CisgICAgICAgICAgICByYWlzZSBGYXRhbEluY2x1ZGVFcnJvcigKKyAgICAgICAgICAgICAgICAieGk6ZmFsbGJhY2sgdGFnIG11c3QgYmUgY2hpbGQgb2YgeGk6aW5jbHVkZSAoJXIpIiAlIGUudGFnCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW5jbHVkZShlLCBsb2FkZXIpCisgICAgICAgIGkgPSBpICsgMQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNGJlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNGJlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFBhdGgucHkgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50UGF0aC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTYyNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFBhdGgucHkKQEAgLTAsMCArMSwzMDMgQEAKKyMKKyMgRWxlbWVudFRyZWUKKyMgJElkOiBFbGVtZW50UGF0aC5weSAzMzc1IDIwMDgtMDItMTMgMDg6MDU6MDhaIGZyZWRyaWsgJAorIworIyBsaW1pdGVkIHhwYXRoIHN1cHBvcnQgZm9yIGVsZW1lbnQgdHJlZXMKKyMKKyMgaGlzdG9yeToKKyMgMjAwMy0wNS0yMyBmbCAgIGNyZWF0ZWQKKyMgMjAwMy0wNS0yOCBmbCAgIGFkZGVkIHN1cHBvcnQgZm9yIC8vIGV0YworIyAyMDAzLTA4LTI3IGZsICAgZml4ZWQgcGFyc2luZyBvZiBwZXJpb2RzIGluIGVsZW1lbnQgbmFtZXMKKyMgMjAwNy0wOS0xMCBmbCAgIG5ldyBzZWxlY3Rpb24gZW5naW5lCisjIDIwMDctMDktMTIgZmwgICBmaXhlZCBwYXJlbnQgc2VsZWN0b3IKKyMgMjAwNy0wOS0xMyBmbCAgIGFkZGVkIGl0ZXJmaW5kOyBjaGFuZ2VkIGZpbmRhbGwgdG8gcmV0dXJuIGEgbGlzdAorIyAyMDA3LTExLTMwIGZsICAgYWRkZWQgbmFtZXNwYWNlcyBzdXBwb3J0CisjIDIwMDktMTAtMzAgZmwgICBhZGRlZCBjaGlsZCBlbGVtZW50IHZhbHVlIGZpbHRlcgorIworIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOSBieSBGcmVkcmlrIEx1bmRoLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgZnJlZHJpa0BweXRob253YXJlLmNvbQorIyBodHRwOi8vd3d3LnB5dGhvbndhcmUuY29tCisjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFRoZSBFbGVtZW50VHJlZSB0b29sa2l0IGlzCisjCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDA5IGJ5IEZyZWRyaWsgTHVuZGgKKyMKKyMgQnkgb2J0YWluaW5nLCB1c2luZywgYW5kL29yIGNvcHlpbmcgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgaXRzCisjIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKKyMgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzCisjIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4KKyMgYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgorIyBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YKKyMgU2VjcmV0IExhYnMgQUIgb3IgdGhlIGF1dGhvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyMgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KKyMgcHJpb3IgcGVybWlzc2lvbi4KKyMKKyMgU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJECisjIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5ULQorIyBBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0VDUkVUIExBQlMgQUIgT1IgVEhFIEFVVEhPUgorIyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZCisjIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorIyBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworIyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisjIE9GIFRISVMgU09GVFdBUkUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTGljZW5zZWQgdG8gUFNGIHVuZGVyIGEgQ29udHJpYnV0b3IgQWdyZWVtZW50LgorIyBTZWUgaHR0cDovL3d3dy5weXRob24ub3JnL3BzZi9saWNlbnNlIGZvciBsaWNlbnNpbmcgZGV0YWlscy4KKworIyMKKyMgSW1wbGVtZW50YXRpb24gbW9kdWxlIGZvciBYUGF0aCBzdXBwb3J0LiAgVGhlcmUncyB1c3VhbGx5IG5vIHJlYXNvbgorIyB0byBpbXBvcnQgdGhpcyBtb2R1bGUgZGlyZWN0bHk7IHRoZSA8Yj5FbGVtZW50VHJlZTwvYj4gZG9lcyB0aGlzIGZvcgorIyB5b3UsIGlmIG5lZWRlZC4KKyMjCisKK2ltcG9ydCByZQorCit4cGF0aF90b2tlbml6ZXJfcmUgPSByZS5jb21waWxlKAorICAgICIoIgorICAgICInW14nXSonfFwiW15cIl0qXCJ8IgorICAgICI6OnwiCisgICAgIi8vP3wiCisgICAgIlwuXC58IgorICAgICJcKFwpfCIKKyAgICAiWy8uKjpcW1xdXChcKUA9XSl8IgorICAgICIoKD86XHtbXn1dK1x9KT9bXi9cW1xdXChcKUA9XHNdKyl8IgorICAgICJccysiCisgICAgKQorCitkZWYgeHBhdGhfdG9rZW5pemVyKHBhdHRlcm4sIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgZm9yIHRva2VuIGluIHhwYXRoX3Rva2VuaXplcl9yZS5maW5kYWxsKHBhdHRlcm4pOgorICAgICAgICB0YWcgPSB0b2tlblsxXQorICAgICAgICBpZiB0YWcgYW5kIHRhZ1swXSAhPSAieyIgYW5kICI6IiBpbiB0YWc6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcHJlZml4LCB1cmkgPSB0YWcuc3BsaXQoIjoiLCAxKQorICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lc3BhY2VzOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcgorICAgICAgICAgICAgICAgIHlpZWxkIHRva2VuWzBdLCAieyVzfSVzIiAlIChuYW1lc3BhY2VzW3ByZWZpeF0sIHVyaSkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcigicHJlZml4ICVyIG5vdCBmb3VuZCBpbiBwcmVmaXggbWFwIiAlIHByZWZpeCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHlpZWxkIHRva2VuCisKK2RlZiBnZXRfcGFyZW50X21hcChjb250ZXh0KToKKyAgICBwYXJlbnRfbWFwID0gY29udGV4dC5wYXJlbnRfbWFwCisgICAgaWYgcGFyZW50X21hcCBpcyBOb25lOgorICAgICAgICBjb250ZXh0LnBhcmVudF9tYXAgPSBwYXJlbnRfbWFwID0ge30KKyAgICAgICAgZm9yIHAgaW4gY29udGV4dC5yb290Lml0ZXIoKToKKyAgICAgICAgICAgIGZvciBlIGluIHA6CisgICAgICAgICAgICAgICAgcGFyZW50X21hcFtlXSA9IHAKKyAgICByZXR1cm4gcGFyZW50X21hcAorCitkZWYgcHJlcGFyZV9jaGlsZChuZXh0LCB0b2tlbik6CisgICAgdGFnID0gdG9rZW5bMV0KKyAgICBkZWYgc2VsZWN0KGNvbnRleHQsIHJlc3VsdCk6CisgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgIGZvciBlIGluIGVsZW06CisgICAgICAgICAgICAgICAgaWYgZS50YWcgPT0gdGFnOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBlCisgICAgcmV0dXJuIHNlbGVjdAorCitkZWYgcHJlcGFyZV9zdGFyKG5leHQsIHRva2VuKToKKyAgICBkZWYgc2VsZWN0KGNvbnRleHQsIHJlc3VsdCk6CisgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgIGZvciBlIGluIGVsZW06CisgICAgICAgICAgICAgICAgeWllbGQgZQorICAgIHJldHVybiBzZWxlY3QKKworZGVmIHByZXBhcmVfc2VsZihuZXh0LCB0b2tlbik6CisgICAgZGVmIHNlbGVjdChjb250ZXh0LCByZXN1bHQpOgorICAgICAgICBmb3IgZWxlbSBpbiByZXN1bHQ6CisgICAgICAgICAgICB5aWVsZCBlbGVtCisgICAgcmV0dXJuIHNlbGVjdAorCitkZWYgcHJlcGFyZV9kZXNjZW5kYW50KG5leHQsIHRva2VuKToKKyAgICB0b2tlbiA9IG5leHQoKQorICAgIGlmIHRva2VuWzBdID09ICIqIjoKKyAgICAgICAgdGFnID0gIioiCisgICAgZWxpZiBub3QgdG9rZW5bMF06CisgICAgICAgIHRhZyA9IHRva2VuWzFdCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoImludmFsaWQgZGVzY2VuZGFudCIpCisgICAgZGVmIHNlbGVjdChjb250ZXh0LCByZXN1bHQpOgorICAgICAgICBmb3IgZWxlbSBpbiByZXN1bHQ6CisgICAgICAgICAgICBmb3IgZSBpbiBlbGVtLml0ZXIodGFnKToKKyAgICAgICAgICAgICAgICBpZiBlIGlzIG5vdCBlbGVtOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBlCisgICAgcmV0dXJuIHNlbGVjdAorCitkZWYgcHJlcGFyZV9wYXJlbnQobmV4dCwgdG9rZW4pOgorICAgIGRlZiBzZWxlY3QoY29udGV4dCwgcmVzdWx0KToKKyAgICAgICAgIyBGSVhNRTogcmFpc2UgZXJyb3IgaWYgLi4gaXMgYXBwbGllZCBhdCB0b3BsZXZlbD8KKyAgICAgICAgcGFyZW50X21hcCA9IGdldF9wYXJlbnRfbWFwKGNvbnRleHQpCisgICAgICAgIHJlc3VsdF9tYXAgPSB7fQorICAgICAgICBmb3IgZWxlbSBpbiByZXN1bHQ6CisgICAgICAgICAgICBpZiBlbGVtIGluIHBhcmVudF9tYXA6CisgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50X21hcFtlbGVtXQorICAgICAgICAgICAgICAgIGlmIHBhcmVudCBub3QgaW4gcmVzdWx0X21hcDoKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0X21hcFtwYXJlbnRdID0gTm9uZQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYXJlbnQKKyAgICByZXR1cm4gc2VsZWN0CisKK2RlZiBwcmVwYXJlX3ByZWRpY2F0ZShuZXh0LCB0b2tlbik6CisgICAgIyBGSVhNRTogcmVwbGFjZSB3aXRoIHJlYWwgcGFyc2VyISEhIHJlZnM6CisgICAgIyBodHRwOi8vZWZmYm90Lm9yZy96b25lL3NpbXBsZS1pdGVyYXRvci1wYXJzZXIuaHRtCisgICAgIyBodHRwOi8vamF2YXNjcmlwdC5jcm9ja2ZvcmQuY29tL3Rkb3AvdGRvcC5odG1sCisgICAgc2lnbmF0dXJlID0gW10KKyAgICBwcmVkaWNhdGUgPSBbXQorICAgIHdoaWxlIDE6CisgICAgICAgIHRva2VuID0gbmV4dCgpCisgICAgICAgIGlmIHRva2VuWzBdID09ICJdIjoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIHRva2VuWzBdIGFuZCB0b2tlblswXVs6MV0gaW4gIidcIiI6CisgICAgICAgICAgICB0b2tlbiA9ICInIiwgdG9rZW5bMF1bMTotMV0KKyAgICAgICAgc2lnbmF0dXJlLmFwcGVuZCh0b2tlblswXSBvciAiLSIpCisgICAgICAgIHByZWRpY2F0ZS5hcHBlbmQodG9rZW5bMV0pCisgICAgc2lnbmF0dXJlID0gIiIuam9pbihzaWduYXR1cmUpCisgICAgIyB1c2Ugc2lnbmF0dXJlIHRvIGRldGVybWluZSBwcmVkaWNhdGUgdHlwZQorICAgIGlmIHNpZ25hdHVyZSA9PSAiQC0iOgorICAgICAgICAjIFtAYXR0cmlidXRlXSBwcmVkaWNhdGUKKyAgICAgICAga2V5ID0gcHJlZGljYXRlWzFdCisgICAgICAgIGRlZiBzZWxlY3QoY29udGV4dCwgcmVzdWx0KToKKyAgICAgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBpZiBlbGVtLmdldChrZXkpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtCisgICAgICAgIHJldHVybiBzZWxlY3QKKyAgICBpZiBzaWduYXR1cmUgPT0gIkAtPSciOgorICAgICAgICAjIFtAYXR0cmlidXRlPSd2YWx1ZSddCisgICAgICAgIGtleSA9IHByZWRpY2F0ZVsxXQorICAgICAgICB2YWx1ZSA9IHByZWRpY2F0ZVstMV0KKyAgICAgICAgZGVmIHNlbGVjdChjb250ZXh0LCByZXN1bHQpOgorICAgICAgICAgICAgZm9yIGVsZW0gaW4gcmVzdWx0OgorICAgICAgICAgICAgICAgIGlmIGVsZW0uZ2V0KGtleSkgPT0gdmFsdWU6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW0KKyAgICAgICAgcmV0dXJuIHNlbGVjdAorICAgIGlmIHNpZ25hdHVyZSA9PSAiLSIgYW5kIG5vdCByZS5tYXRjaCgiXGQrJCIsIHByZWRpY2F0ZVswXSk6CisgICAgICAgICMgW3RhZ10KKyAgICAgICAgdGFnID0gcHJlZGljYXRlWzBdCisgICAgICAgIGRlZiBzZWxlY3QoY29udGV4dCwgcmVzdWx0KToKKyAgICAgICAgICAgIGZvciBlbGVtIGluIHJlc3VsdDoKKyAgICAgICAgICAgICAgICBpZiBlbGVtLmZpbmQodGFnKSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbQorICAgICAgICByZXR1cm4gc2VsZWN0CisgICAgaWYgc2lnbmF0dXJlID09ICItPSciIGFuZCBub3QgcmUubWF0Y2goIlxkKyQiLCBwcmVkaWNhdGVbMF0pOgorICAgICAgICAjIFt0YWc9J3ZhbHVlJ10KKyAgICAgICAgdGFnID0gcHJlZGljYXRlWzBdCisgICAgICAgIHZhbHVlID0gcHJlZGljYXRlWy0xXQorICAgICAgICBkZWYgc2VsZWN0KGNvbnRleHQsIHJlc3VsdCk6CisgICAgICAgICAgICBmb3IgZWxlbSBpbiByZXN1bHQ6CisgICAgICAgICAgICAgICAgZm9yIGUgaW4gZWxlbS5maW5kYWxsKHRhZyk6CisgICAgICAgICAgICAgICAgICAgIGlmICIiLmpvaW4oZS5pdGVydGV4dCgpKSA9PSB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiBzZWxlY3QKKyAgICBpZiBzaWduYXR1cmUgPT0gIi0iIG9yIHNpZ25hdHVyZSA9PSAiLSgpIiBvciBzaWduYXR1cmUgPT0gIi0oKS0iOgorICAgICAgICAjIFtpbmRleF0gb3IgW2xhc3QoKV0gb3IgW2xhc3QoKS1pbmRleF0KKyAgICAgICAgaWYgc2lnbmF0dXJlID09ICItIjoKKyAgICAgICAgICAgIGluZGV4ID0gaW50KHByZWRpY2F0ZVswXSkgLSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwcmVkaWNhdGVbMF0gIT0gImxhc3QiOgorICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJ1bnN1cHBvcnRlZCBmdW5jdGlvbiIpCisgICAgICAgICAgICBpZiBzaWduYXR1cmUgPT0gIi0oKS0iOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpbnQocHJlZGljYXRlWzJdKSAtIDEKKyAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoInVuc3VwcG9ydGVkIGV4cHJlc3Npb24iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbmRleCA9IC0xCisgICAgICAgIGRlZiBzZWxlY3QoY29udGV4dCwgcmVzdWx0KToKKyAgICAgICAgICAgIHBhcmVudF9tYXAgPSBnZXRfcGFyZW50X21hcChjb250ZXh0KQorICAgICAgICAgICAgZm9yIGVsZW0gaW4gcmVzdWx0OgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50X21hcFtlbGVtXQorICAgICAgICAgICAgICAgICAgICAjIEZJWE1FOiB3aGF0IGlmIHRoZSBzZWxlY3RvciBpcyAiKiIgPworICAgICAgICAgICAgICAgICAgICBlbGVtcyA9IGxpc3QocGFyZW50LmZpbmRhbGwoZWxlbS50YWcpKQorICAgICAgICAgICAgICAgICAgICBpZiBlbGVtc1tpbmRleF0gaXMgZWxlbToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW0KKyAgICAgICAgICAgICAgICBleGNlcHQgKEluZGV4RXJyb3IsIEtleUVycm9yKToKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICByZXR1cm4gc2VsZWN0CisgICAgcmFpc2UgU3ludGF4RXJyb3IoImludmFsaWQgcHJlZGljYXRlIikKKworb3BzID0geworICAgICIiOiBwcmVwYXJlX2NoaWxkLAorICAgICIqIjogcHJlcGFyZV9zdGFyLAorICAgICIuIjogcHJlcGFyZV9zZWxmLAorICAgICIuLiI6IHByZXBhcmVfcGFyZW50LAorICAgICIvLyI6IHByZXBhcmVfZGVzY2VuZGFudCwKKyAgICAiWyI6IHByZXBhcmVfcHJlZGljYXRlLAorICAgIH0KKworX2NhY2hlID0ge30KKworY2xhc3MgX1NlbGVjdG9yQ29udGV4dDoKKyAgICBwYXJlbnRfbWFwID0gTm9uZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByb290KToKKyAgICAgICAgc2VsZi5yb290ID0gcm9vdAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjCisjIEdlbmVyYXRlIGFsbCBtYXRjaGluZyBvYmplY3RzLgorCitkZWYgaXRlcmZpbmQoZWxlbSwgcGF0aCwgbmFtZXNwYWNlcz1Ob25lKToKKyAgICAjIGNvbXBpbGUgc2VsZWN0b3IgcGF0dGVybgorICAgIGlmIHBhdGhbLTE6XSA9PSAiLyI6CisgICAgICAgIHBhdGggPSBwYXRoICsgIioiICMgaW1wbGljaXQgYWxsIChGSVhNRToga2VlcCB0aGlzPykKKyAgICB0cnk6CisgICAgICAgIHNlbGVjdG9yID0gX2NhY2hlW3BhdGhdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBpZiBsZW4oX2NhY2hlKSA+IDEwMDoKKyAgICAgICAgICAgIF9jYWNoZS5jbGVhcigpCisgICAgICAgIGlmIHBhdGhbOjFdID09ICIvIjoKKyAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yKCJjYW5ub3QgdXNlIGFic29sdXRlIHBhdGggb24gZWxlbWVudCIpCisgICAgICAgIG5leHQgPSBpdGVyKHhwYXRoX3Rva2VuaXplcihwYXRoLCBuYW1lc3BhY2VzKSkubmV4dAorICAgICAgICB0b2tlbiA9IG5leHQoKQorICAgICAgICBzZWxlY3RvciA9IFtdCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZWN0b3IuYXBwZW5kKG9wc1t0b2tlblswXV0obmV4dCwgdG9rZW4pKQorICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IoImludmFsaWQgcGF0aCIpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdG9rZW4gPSBuZXh0KCkKKyAgICAgICAgICAgICAgICBpZiB0b2tlblswXSA9PSAiLyI6CisgICAgICAgICAgICAgICAgICAgIHRva2VuID0gbmV4dCgpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBfY2FjaGVbcGF0aF0gPSBzZWxlY3RvcgorICAgICMgZXhlY3V0ZSBzZWxlY3RvciBwYXR0ZXJuCisgICAgcmVzdWx0ID0gW2VsZW1dCisgICAgY29udGV4dCA9IF9TZWxlY3RvckNvbnRleHQoZWxlbSkKKyAgICBmb3Igc2VsZWN0IGluIHNlbGVjdG9yOgorICAgICAgICByZXN1bHQgPSBzZWxlY3QoY29udGV4dCwgcmVzdWx0KQorICAgIHJldHVybiByZXN1bHQKKworIyMKKyMgRmluZCBmaXJzdCBtYXRjaGluZyBvYmplY3QuCisKK2RlZiBmaW5kKGVsZW0sIHBhdGgsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gaXRlcmZpbmQoZWxlbSwgcGF0aCwgbmFtZXNwYWNlcykubmV4dCgpCisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHJldHVybiBOb25lCisKKyMjCisjIEZpbmQgYWxsIG1hdGNoaW5nIG9iamVjdHMuCisKK2RlZiBmaW5kYWxsKGVsZW0sIHBhdGgsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgcmV0dXJuIGxpc3QoaXRlcmZpbmQoZWxlbSwgcGF0aCwgbmFtZXNwYWNlcykpCisKKyMjCisjIEZpbmQgdGV4dCBmb3IgZmlyc3QgbWF0Y2hpbmcgb2JqZWN0LgorCitkZWYgZmluZHRleHQoZWxlbSwgcGF0aCwgZGVmYXVsdD1Ob25lLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgIHRyeToKKyAgICAgICAgZWxlbSA9IGl0ZXJmaW5kKGVsZW0sIHBhdGgsIG5hbWVzcGFjZXMpLm5leHQoKQorICAgICAgICByZXR1cm4gZWxlbS50ZXh0IG9yICIiCisgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgIHJldHVybiBkZWZhdWx0CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50UGF0aC5weWMgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50UGF0aC5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZmE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50UGF0aC5weW8gYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50UGF0aC5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZmE0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRQYXRoLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weSBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL0VsZW1lbnRUcmVlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDY4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQpAQCAtMCwwICsxLDE2NjcgQEAKKyMKKyMgRWxlbWVudFRyZWUKKyMgJElkOiBFbGVtZW50VHJlZS5weSAzNDQwIDIwMDgtMDctMTggMTQ6NDU6MDFaIGZyZWRyaWsgJAorIworIyBsaWdodC13ZWlnaHQgWE1MIHN1cHBvcnQgZm9yIFB5dGhvbiAyLjMgYW5kIGxhdGVyLgorIworIyBoaXN0b3J5IChzaW5jZSAxLjIuNik6CisjIDIwMDUtMTEtMTIgZmwgICBhZGRlZCB0b3N0cmluZ2xpc3QvZnJvbXN0cmluZ2xpc3QgaGVscGVycworIyAyMDA2LTA3LTA1IGZsICAgbWVyZ2VkIGluIHNlbGVjdGVkIGNoYW5nZXMgZnJvbSB0aGUgMS4zIHNhbmRib3gKKyMgMjAwNi0wNy0wNSBmbCAgIHJlbW92ZWQgc3VwcG9ydCBmb3IgMi4xIGFuZCBlYXJsaWVyCisjIDIwMDctMDYtMjEgZmwgICBhZGRlZCBkZXByZWNhdGlvbi9mdXR1cmUgd2FybmluZ3MKKyMgMjAwNy0wOC0yNSBmbCAgIGFkZGVkIGRvY3R5cGUgaG9vaywgYWRkZWQgcGFyc2VyIHZlcnNpb24gYXR0cmlidXRlIGV0YworIyAyMDA3LTA4LTI2IGZsICAgYWRkZWQgbmV3IHNlcmlhbGl6ZXIgY29kZSAoYmV0dGVyIG5hbWVzcGFjZSBoYW5kbGluZywgZXRjKQorIyAyMDA3LTA4LTI3IGZsICAgd2FybiBmb3IgYnJva2VuIC90YWcgc2VhcmNoZXMgb24gdHJlZSBsZXZlbAorIyAyMDA3LTA5LTAyIGZsICAgYWRkZWQgaHRtbC90ZXh0IG1ldGhvZHMgdG8gc2VyaWFsaXplciAoZXhwZXJpbWVudGFsKQorIyAyMDA3LTA5LTA1IGZsICAgYWRkZWQgbWV0aG9kIGFyZ3VtZW50IHRvIHRvc3RyaW5nL3Rvc3RyaW5nbGlzdAorIyAyMDA3LTA5LTA2IGZsICAgaW1wcm92ZWQgZXJyb3IgaGFuZGxpbmcKKyMgMjAwNy0wOS0xMyBmbCAgIGFkZGVkIGl0ZXJ0ZXh0LCBpdGVyZmluZDsgYXNzb3J0ZWQgY2xlYW51cHMKKyMgMjAwNy0xMi0xNSBmbCAgIGFkZGVkIEMxNE4gaG9va3MsIGNvcHkgbWV0aG9kIChleHBlcmltZW50YWwpCisjCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDA4IGJ5IEZyZWRyaWsgTHVuZGguICBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBmcmVkcmlrQHB5dGhvbndhcmUuY29tCisjIGh0dHA6Ly93d3cucHl0aG9ud2FyZS5jb20KKyMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIEVsZW1lbnRUcmVlIHRvb2xraXQgaXMKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDggYnkgRnJlZHJpayBMdW5kaAorIworIyBCeSBvYnRhaW5pbmcsIHVzaW5nLCBhbmQvb3IgY29weWluZyB0aGlzIHNvZnR3YXJlIGFuZC9vciBpdHMKKyMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLCB5b3UgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLAorIyBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOgorIworIyBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZAorIyBpdHMgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMKKyMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbgorIyBhbGwgY29waWVzLCBhbmQgdGhhdCBib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uCisjIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZgorIyBTZWNyZXQgTGFicyBBQiBvciB0aGUgYXV0aG9yIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eQorIyBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbgorIyBwcmlvciBwZXJtaXNzaW9uLgorIworIyBTRUNSRVQgTEFCUyBBQiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQKKyMgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlQtCisjIEFCSUxJVFkgQU5EIEZJVE5FU1MuICBJTiBOTyBFVkVOVCBTSEFMTCBTRUNSRVQgTEFCUyBBQiBPUiBUSEUgQVVUSE9SCisjIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkKKyMgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCisjIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTCisjIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyMgT0YgVEhJUyBTT0ZUV0FSRS4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQuCisjIFNlZSBodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHNmL2xpY2Vuc2UgZm9yIGxpY2Vuc2luZyBkZXRhaWxzLgorCitfX2FsbF9fID0gWworICAgICMgcHVibGljIHN5bWJvbHMKKyAgICAiQ29tbWVudCIsCisgICAgImR1bXAiLAorICAgICJFbGVtZW50IiwgIkVsZW1lbnRUcmVlIiwKKyAgICAiZnJvbXN0cmluZyIsICJmcm9tc3RyaW5nbGlzdCIsCisgICAgImlzZWxlbWVudCIsICJpdGVycGFyc2UiLAorICAgICJwYXJzZSIsICJQYXJzZUVycm9yIiwKKyAgICAiUEkiLCAiUHJvY2Vzc2luZ0luc3RydWN0aW9uIiwKKyAgICAiUU5hbWUiLAorICAgICJTdWJFbGVtZW50IiwKKyAgICAidG9zdHJpbmciLCAidG9zdHJpbmdsaXN0IiwKKyAgICAiVHJlZUJ1aWxkZXIiLAorICAgICJWRVJTSU9OIiwKKyAgICAiWE1MIiwKKyAgICAiWE1MUGFyc2VyIiwgIlhNTFRyZWVCdWlsZGVyIiwKKyAgICBdCisKK1ZFUlNJT04gPSAiMS4zLjAiCisKKyMjCisjIFRoZSA8Yj5FbGVtZW50PC9iPiB0eXBlIGlzIGEgZmxleGlibGUgY29udGFpbmVyIG9iamVjdCwgZGVzaWduZWQgdG8KKyMgc3RvcmUgaGllcmFyY2hpY2FsIGRhdGEgc3RydWN0dXJlcyBpbiBtZW1vcnkuIFRoZSB0eXBlIGNhbiBiZQorIyBkZXNjcmliZWQgYXMgYSBjcm9zcyBiZXR3ZWVuIGEgbGlzdCBhbmQgYSBkaWN0aW9uYXJ5LgorIyA8cD4KKyMgRWFjaCBlbGVtZW50IGhhcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBpdDoKKyMgPHVsPgorIyA8bGk+YSA8aT50YWc8L2k+LiBUaGlzIGlzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHdoYXQga2luZCBvZiBkYXRhCisjIHRoaXMgZWxlbWVudCByZXByZXNlbnRzICh0aGUgZWxlbWVudCB0eXBlLCBpbiBvdGhlciB3b3JkcykuPC9saT4KKyMgPGxpPmEgbnVtYmVyIG9mIDxpPmF0dHJpYnV0ZXM8L2k+LCBzdG9yZWQgaW4gYSBQeXRob24gZGljdGlvbmFyeS48L2xpPgorIyA8bGk+YSA8aT50ZXh0PC9pPiBzdHJpbmcuPC9saT4KKyMgPGxpPmFuIG9wdGlvbmFsIDxpPnRhaWw8L2k+IHN0cmluZy48L2xpPgorIyA8bGk+YSBudW1iZXIgb2YgPGk+Y2hpbGQgZWxlbWVudHM8L2k+LCBzdG9yZWQgaW4gYSBQeXRob24gc2VxdWVuY2U8L2xpPgorIyA8L3VsPgorIworIyBUbyBjcmVhdGUgYW4gZWxlbWVudCBpbnN0YW5jZSwgdXNlIHRoZSB7QGxpbmsgI0VsZW1lbnR9IGNvbnN0cnVjdG9yCisjIG9yIHRoZSB7QGxpbmsgI1N1YkVsZW1lbnR9IGZhY3RvcnkgZnVuY3Rpb24uCisjIDxwPgorIyBUaGUge0BsaW5rICNFbGVtZW50VHJlZX0gY2xhc3MgY2FuIGJlIHVzZWQgdG8gd3JhcCBhbiBlbGVtZW50CisjIHN0cnVjdHVyZSwgYW5kIGNvbnZlcnQgaXQgZnJvbSBhbmQgdG8gWE1MLgorIyMKKworaW1wb3J0IHN5cworaW1wb3J0IHJlCitpbXBvcnQgd2FybmluZ3MKKworCitjbGFzcyBfU2ltcGxlRWxlbWVudFBhdGgob2JqZWN0KToKKyAgICAjIGVtdWxhdGUgcHJlLTEuMiBmaW5kL2ZpbmR0ZXh0L2ZpbmRhbGwgYmVoYXZpb3VyCisgICAgZGVmIGZpbmQoc2VsZiwgZWxlbWVudCwgdGFnLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50OgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gdGFnOgorICAgICAgICAgICAgICAgIHJldHVybiBlbGVtCisgICAgICAgIHJldHVybiBOb25lCisgICAgZGVmIGZpbmR0ZXh0KHNlbGYsIGVsZW1lbnQsIHRhZywgZGVmYXVsdD1Ob25lLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICBlbGVtID0gc2VsZi5maW5kKGVsZW1lbnQsIHRhZykKKyAgICAgICAgaWYgZWxlbSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHQKKyAgICAgICAgcmV0dXJuIGVsZW0udGV4dCBvciAiIgorICAgIGRlZiBpdGVyZmluZChzZWxmLCBlbGVtZW50LCB0YWcsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIGlmIHRhZ1s6M10gPT0gIi4vLyI6CisgICAgICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50Lml0ZXIodGFnWzM6XSk6CisgICAgICAgICAgICAgICAgeWllbGQgZWxlbQorICAgICAgICBmb3IgZWxlbSBpbiBlbGVtZW50OgorICAgICAgICAgICAgaWYgZWxlbS50YWcgPT0gdGFnOgorICAgICAgICAgICAgICAgIHlpZWxkIGVsZW0KKyAgICBkZWYgZmluZGFsbChzZWxmLCBlbGVtZW50LCB0YWcsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcmZpbmQoZWxlbWVudCwgdGFnLCBuYW1lc3BhY2VzKSkKKwordHJ5OgorICAgIGZyb20gLiBpbXBvcnQgRWxlbWVudFBhdGgKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBFbGVtZW50UGF0aCA9IF9TaW1wbGVFbGVtZW50UGF0aCgpCisKKyMjCisjIFBhcnNlciBlcnJvci4gIFRoaXMgaXMgYSBzdWJjbGFzcyBvZiA8Yj5TeW50YXhFcnJvcjwvYj4uCisjIDxwPgorIyBJbiBhZGRpdGlvbiB0byB0aGUgZXhjZXB0aW9uIHZhbHVlLCBhbiBleGNlcHRpb24gaW5zdGFuY2UgY29udGFpbnMgYQorIyBzcGVjaWZpYyBleGNlcHRpb24gY29kZSBpbiB0aGUgPGI+Y29kZTwvYj4gYXR0cmlidXRlLCBhbmQgdGhlIGxpbmUgYW5kCisjIGNvbHVtbiBvZiB0aGUgZXJyb3IgaW4gdGhlIDxiPnBvc2l0aW9uPC9iPiBhdHRyaWJ1dGUuCisKK2NsYXNzIFBhcnNlRXJyb3IoU3ludGF4RXJyb3IpOgorICAgIHBhc3MKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyBDaGVja3MgaWYgYW4gb2JqZWN0IGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBlbGVtZW50IG9iamVjdC4KKyMKKyMgQHBhcmFtIEFuIGVsZW1lbnQgaW5zdGFuY2UuCisjIEByZXR1cm4gQSB0cnVlIHZhbHVlIGlmIHRoaXMgaXMgYW4gZWxlbWVudCBvYmplY3QuCisjIEBkZWZyZXR1cm4gZmxhZworCitkZWYgaXNlbGVtZW50KGVsZW1lbnQpOgorICAgICMgRklYTUU6IG5vdCBzdXJlIGFib3V0IHRoaXM7IG1pZ2h0IGJlIGEgYmV0dGVyIGlkZWEgdG8gbG9vaworICAgICMgZm9yIHRhZy9hdHRyaWIvdGV4dCBhdHRyaWJ1dGVzCisgICAgcmV0dXJuIGlzaW5zdGFuY2UoZWxlbWVudCwgRWxlbWVudCkgb3IgaGFzYXR0cihlbGVtZW50LCAidGFnIikKKworIyMKKyMgRWxlbWVudCBjbGFzcy4gIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgRWxlbWVudCBpbnRlcmZhY2UsIGFuZAorIyBwcm92aWRlcyBhIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZS4KKyMgPHA+CisjIFRoZSBlbGVtZW50IG5hbWUsIGF0dHJpYnV0ZSBuYW1lcywgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlCisjIGVpdGhlciBBU0NJSSBzdHJpbmdzIChvcmRpbmFyeSBQeXRob24gc3RyaW5ncyBjb250YWluaW5nIG9ubHkgNy1iaXQKKyMgQVNDSUkgY2hhcmFjdGVycykgb3IgVW5pY29kZSBzdHJpbmdzLgorIworIyBAcGFyYW0gdGFnIFRoZSBlbGVtZW50IG5hbWUuCisjIEBwYXJhbSBhdHRyaWIgQW4gb3B0aW9uYWwgZGljdGlvbmFyeSwgY29udGFpbmluZyBlbGVtZW50IGF0dHJpYnV0ZXMuCisjIEBwYXJhbSAqKmV4dHJhIEFkZGl0aW9uYWwgYXR0cmlidXRlcywgZ2l2ZW4gYXMga2V5d29yZCBhcmd1bWVudHMuCisjIEBzZWUgRWxlbWVudAorIyBAc2VlIFN1YkVsZW1lbnQKKyMgQHNlZSBDb21tZW50CisjIEBzZWUgUHJvY2Vzc2luZ0luc3RydWN0aW9uCisKK2NsYXNzIEVsZW1lbnQob2JqZWN0KToKKyAgICAjIDx0YWcgYXR0cmliPnRleHQ8Y2hpbGQvPi4uLjwvdGFnPnRhaWwKKworICAgICMjCisgICAgIyAoQXR0cmlidXRlKSBFbGVtZW50IHRhZy4KKworICAgIHRhZyA9IE5vbmUKKworICAgICMjCisgICAgIyAoQXR0cmlidXRlKSBFbGVtZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5LiAgV2hlcmUgcG9zc2libGUsIHVzZQorICAgICMge0BsaW5rICNFbGVtZW50LmdldH0sCisgICAgIyB7QGxpbmsgI0VsZW1lbnQuc2V0fSwKKyAgICAjIHtAbGluayAjRWxlbWVudC5rZXlzfSwgYW5kCisgICAgIyB7QGxpbmsgI0VsZW1lbnQuaXRlbXN9IHRvIGFjY2VzcworICAgICMgZWxlbWVudCBhdHRyaWJ1dGVzLgorCisgICAgYXR0cmliID0gTm9uZQorCisgICAgIyMKKyAgICAjIChBdHRyaWJ1dGUpIFRleHQgYmVmb3JlIGZpcnN0IHN1YmVsZW1lbnQuICBUaGlzIGlzIGVpdGhlciBhCisgICAgIyBzdHJpbmcgb3IgdGhlIHZhbHVlIE5vbmUuICBOb3RlIHRoYXQgaWYgdGhlcmUgd2FzIG5vIHRleHQsIHRoaXMKKyAgICAjIGF0dHJpYnV0ZSBtYXkgYmUgZWl0aGVyIE5vbmUgb3IgYW4gZW1wdHkgc3RyaW5nLCBkZXBlbmRpbmcgb24KKyAgICAjIHRoZSBwYXJzZXIuCisKKyAgICB0ZXh0ID0gTm9uZQorCisgICAgIyMKKyAgICAjIChBdHRyaWJ1dGUpIFRleHQgYWZ0ZXIgdGhpcyBlbGVtZW50J3MgZW5kIHRhZywgYnV0IGJlZm9yZSB0aGUKKyAgICAjIG5leHQgc2libGluZyBlbGVtZW50J3Mgc3RhcnQgdGFnLiAgVGhpcyBpcyBlaXRoZXIgYSBzdHJpbmcgb3IKKyAgICAjIHRoZSB2YWx1ZSBOb25lLiAgTm90ZSB0aGF0IGlmIHRoZXJlIHdhcyBubyB0ZXh0LCB0aGlzIGF0dHJpYnV0ZQorICAgICMgbWF5IGJlIGVpdGhlciBOb25lIG9yIGFuIGVtcHR5IHN0cmluZywgZGVwZW5kaW5nIG9uIHRoZSBwYXJzZXIuCisKKyAgICB0YWlsID0gTm9uZSAjIHRleHQgYWZ0ZXIgZW5kIHRhZywgaWYgYW55CisKKyAgICAjIGNvbnN0cnVjdG9yCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGFnLCBhdHRyaWI9e30sICoqZXh0cmEpOgorICAgICAgICBhdHRyaWIgPSBhdHRyaWIuY29weSgpCisgICAgICAgIGF0dHJpYi51cGRhdGUoZXh0cmEpCisgICAgICAgIHNlbGYudGFnID0gdGFnCisgICAgICAgIHNlbGYuYXR0cmliID0gYXR0cmliCisgICAgICAgIHNlbGYuX2NoaWxkcmVuID0gW10KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICI8RWxlbWVudCAlcyBhdCAweCV4PiIgJSAocmVwcihzZWxmLnRhZyksIGlkKHNlbGYpKQorCisgICAgIyMKKyAgICAjIENyZWF0ZXMgYSBuZXcgZWxlbWVudCBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIGVsZW1lbnQuCisgICAgIworICAgICMgQHBhcmFtIHRhZyBFbGVtZW50IHRhZy4KKyAgICAjIEBwYXJhbSBhdHRyaWIgRWxlbWVudCBhdHRyaWJ1dGVzLCBnaXZlbiBhcyBhIGRpY3Rpb25hcnkuCisgICAgIyBAcmV0dXJuIEEgbmV3IGVsZW1lbnQgaW5zdGFuY2UuCisKKyAgICBkZWYgbWFrZWVsZW1lbnQoc2VsZiwgdGFnLCBhdHRyaWIpOgorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18odGFnLCBhdHRyaWIpCisKKyAgICAjIworICAgICMgKEV4cGVyaW1lbnRhbCkgQ29waWVzIHRoZSBjdXJyZW50IGVsZW1lbnQuICBUaGlzIGNyZWF0ZXMgYQorICAgICMgc2hhbGxvdyBjb3B5OyBzdWJlbGVtZW50cyB3aWxsIGJlIHNoYXJlZCB3aXRoIHRoZSBvcmlnaW5hbCB0cmVlLgorICAgICMKKyAgICAjIEByZXR1cm4gQSBuZXcgZWxlbWVudCBpbnN0YW5jZS4KKworICAgIGRlZiBjb3B5KHNlbGYpOgorICAgICAgICBlbGVtID0gc2VsZi5tYWtlZWxlbWVudChzZWxmLnRhZywgc2VsZi5hdHRyaWIpCisgICAgICAgIGVsZW0udGV4dCA9IHNlbGYudGV4dAorICAgICAgICBlbGVtLnRhaWwgPSBzZWxmLnRhaWwKKyAgICAgICAgZWxlbVs6XSA9IHNlbGYKKyAgICAgICAgcmV0dXJuIGVsZW0KKworICAgICMjCisgICAgIyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygc3ViZWxlbWVudHMuICBOb3RlIHRoYXQgdGhpcyBvbmx5IGNvdW50cworICAgICMgZnVsbCBlbGVtZW50czsgdG8gY2hlY2sgaWYgdGhlcmUncyBhbnkgY29udGVudCBpbiBhbiBlbGVtZW50LCB5b3UKKyAgICAjIGhhdmUgdG8gY2hlY2sgYm90aCB0aGUgbGVuZ3RoIGFuZCB0aGUgPGI+dGV4dDwvYj4gYXR0cmlidXRlLgorICAgICMKKyAgICAjIEByZXR1cm4gVGhlIG51bWJlciBvZiBzdWJlbGVtZW50cy4KKworICAgIGRlZiBfX2xlbl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2NoaWxkcmVuKQorCisgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgorICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgIlRoZSBiZWhhdmlvciBvZiB0aGlzIG1ldGhvZCB3aWxsIGNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMuICAiCisgICAgICAgICAgICAiVXNlIHNwZWNpZmljICdsZW4oZWxlbSknIG9yICdlbGVtIGlzIG5vdCBOb25lJyB0ZXN0IGluc3RlYWQuIiwKKyAgICAgICAgICAgIEZ1dHVyZVdhcm5pbmcsIHN0YWNrbGV2ZWw9MgorICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2NoaWxkcmVuKSAhPSAwICMgZW11bGF0ZSBvbGQgYmVoYXZpb3VyLCBmb3Igbm93CisKKyAgICAjIworICAgICMgUmV0dXJucyB0aGUgZ2l2ZW4gc3ViZWxlbWVudCwgYnkgaW5kZXguCisgICAgIworICAgICMgQHBhcmFtIGluZGV4IFdoYXQgc3ViZWxlbWVudCB0byByZXR1cm4uCisgICAgIyBAcmV0dXJuIFRoZSBnaXZlbiBzdWJlbGVtZW50LgorICAgICMgQGV4Y2VwdGlvbiBJbmRleEVycm9yIElmIHRoZSBnaXZlbiBlbGVtZW50IGRvZXMgbm90IGV4aXN0LgorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuW2luZGV4XQorCisgICAgIyMKKyAgICAjIFJlcGxhY2VzIHRoZSBnaXZlbiBzdWJlbGVtZW50LCBieSBpbmRleC4KKyAgICAjCisgICAgIyBAcGFyYW0gaW5kZXggV2hhdCBzdWJlbGVtZW50IHRvIHJlcGxhY2UuCisgICAgIyBAcGFyYW0gZWxlbWVudCBUaGUgbmV3IGVsZW1lbnQgdmFsdWUuCisgICAgIyBAZXhjZXB0aW9uIEluZGV4RXJyb3IgSWYgdGhlIGdpdmVuIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIGVsZW1lbnQpOgorICAgICAgICAjIGlmIGlzaW5zdGFuY2UoaW5kZXgsIHNsaWNlKToKKyAgICAgICAgIyAgICAgZm9yIGVsdCBpbiBlbGVtZW50OgorICAgICAgICAjICAgICAgICAgYXNzZXJ0IGlzZWxlbWVudChlbHQpCisgICAgICAgICMgZWxzZToKKyAgICAgICAgIyAgICAgYXNzZXJ0IGlzZWxlbWVudChlbGVtZW50KQorICAgICAgICBzZWxmLl9jaGlsZHJlbltpbmRleF0gPSBlbGVtZW50CisKKyAgICAjIworICAgICMgRGVsZXRlcyB0aGUgZ2l2ZW4gc3ViZWxlbWVudCwgYnkgaW5kZXguCisgICAgIworICAgICMgQHBhcmFtIGluZGV4IFdoYXQgc3ViZWxlbWVudCB0byBkZWxldGUuCisgICAgIyBAZXhjZXB0aW9uIEluZGV4RXJyb3IgSWYgdGhlIGdpdmVuIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QuCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgorICAgICAgICBkZWwgc2VsZi5fY2hpbGRyZW5baW5kZXhdCisKKyAgICAjIworICAgICMgQWRkcyBhIHN1YmVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGVsZW1lbnQuICBJbiBkb2N1bWVudCBvcmRlciwKKyAgICAjIHRoZSBuZXcgZWxlbWVudCB3aWxsIGFwcGVhciBhZnRlciB0aGUgbGFzdCBleGlzdGluZyBzdWJlbGVtZW50IChvcgorICAgICMgZGlyZWN0bHkgYWZ0ZXIgdGhlIHRleHQsIGlmIGl0J3MgdGhlIGZpcnN0IHN1YmVsZW1lbnQpLCBidXQgYmVmb3JlCisgICAgIyB0aGUgZW5kIHRhZyBmb3IgdGhpcyBlbGVtZW50LgorICAgICMKKyAgICAjIEBwYXJhbSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIGFkZC4KKworICAgIGRlZiBhcHBlbmQoc2VsZiwgZWxlbWVudCk6CisgICAgICAgICMgYXNzZXJ0IGlzZWxlbWVudChlbGVtZW50KQorICAgICAgICBzZWxmLl9jaGlsZHJlbi5hcHBlbmQoZWxlbWVudCkKKworICAgICMjCisgICAgIyBBcHBlbmRzIHN1YmVsZW1lbnRzIGZyb20gYSBzZXF1ZW5jZS4KKyAgICAjCisgICAgIyBAcGFyYW0gZWxlbWVudHMgQSBzZXF1ZW5jZSBvYmplY3Qgd2l0aCB6ZXJvIG9yIG1vcmUgZWxlbWVudHMuCisgICAgIyBAc2luY2UgMS4zCisKKyAgICBkZWYgZXh0ZW5kKHNlbGYsIGVsZW1lbnRzKToKKyAgICAgICAgIyBmb3IgZWxlbWVudCBpbiBlbGVtZW50czoKKyAgICAgICAgIyAgICAgYXNzZXJ0IGlzZWxlbWVudChlbGVtZW50KQorICAgICAgICBzZWxmLl9jaGlsZHJlbi5leHRlbmQoZWxlbWVudHMpCisKKyAgICAjIworICAgICMgSW5zZXJ0cyBhIHN1YmVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoaXMgZWxlbWVudC4KKyAgICAjCisgICAgIyBAcGFyYW0gaW5kZXggV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgc3ViZWxlbWVudC4KKworICAgIGRlZiBpbnNlcnQoc2VsZiwgaW5kZXgsIGVsZW1lbnQpOgorICAgICAgICAjIGFzc2VydCBpc2VsZW1lbnQoZWxlbWVudCkKKyAgICAgICAgc2VsZi5fY2hpbGRyZW4uaW5zZXJ0KGluZGV4LCBlbGVtZW50KQorCisgICAgIyMKKyAgICAjIFJlbW92ZXMgYSBtYXRjaGluZyBzdWJlbGVtZW50LiAgVW5saWtlIHRoZSA8Yj5maW5kPC9iPiBtZXRob2RzLAorICAgICMgdGhpcyBtZXRob2QgY29tcGFyZXMgZWxlbWVudHMgYmFzZWQgb24gaWRlbnRpdHksIG5vdCBvbiB0YWcKKyAgICAjIHZhbHVlIG9yIGNvbnRlbnRzLiAgVG8gcmVtb3ZlIHN1YmVsZW1lbnRzIGJ5IG90aGVyIG1lYW5zLCB0aGUKKyAgICAjIGVhc2llc3Qgd2F5IGlzIG9mdGVuIHRvIHVzZSBhIGxpc3QgY29tcHJlaGVuc2lvbiB0byBzZWxlY3Qgd2hhdAorICAgICMgZWxlbWVudHMgdG8ga2VlcCwgYW5kIHVzZSBzbGljZSBhc3NpZ25tZW50IHRvIHVwZGF0ZSB0aGUgcGFyZW50CisgICAgIyBlbGVtZW50LgorICAgICMKKyAgICAjIEBwYXJhbSBlbGVtZW50IFdoYXQgZWxlbWVudCB0byByZW1vdmUuCisgICAgIyBAZXhjZXB0aW9uIFZhbHVlRXJyb3IgSWYgYSBtYXRjaGluZyBlbGVtZW50IGNvdWxkIG5vdCBiZSBmb3VuZC4KKworICAgIGRlZiByZW1vdmUoc2VsZiwgZWxlbWVudCk6CisgICAgICAgICMgYXNzZXJ0IGlzZWxlbWVudChlbGVtZW50KQorICAgICAgICBzZWxmLl9jaGlsZHJlbi5yZW1vdmUoZWxlbWVudCkKKworICAgICMjCisgICAgIyAoRGVwcmVjYXRlZCkgUmV0dXJucyBhbGwgc3ViZWxlbWVudHMuICBUaGUgZWxlbWVudHMgYXJlIHJldHVybmVkCisgICAgIyBpbiBkb2N1bWVudCBvcmRlci4KKyAgICAjCisgICAgIyBAcmV0dXJuIEEgbGlzdCBvZiBzdWJlbGVtZW50cy4KKyAgICAjIEBkZWZyZXR1cm4gbGlzdCBvZiBFbGVtZW50IGluc3RhbmNlcworCisgICAgZGVmIGdldGNoaWxkcmVuKHNlbGYpOgorICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgIlRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuICAiCisgICAgICAgICAgICAiVXNlICdsaXN0KGVsZW0pJyBvciBpdGVyYXRpb24gb3ZlciBlbGVtIGluc3RlYWQuIiwKKyAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yCisgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBzZWxmLl9jaGlsZHJlbgorCisgICAgIyMKKyAgICAjIEZpbmRzIHRoZSBmaXJzdCBtYXRjaGluZyBzdWJlbGVtZW50LCBieSB0YWcgbmFtZSBvciBwYXRoLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBrZXlwYXJhbSBuYW1lc3BhY2VzIE9wdGlvbmFsIG5hbWVzcGFjZSBwcmVmaXggbWFwLgorICAgICMgQHJldHVybiBUaGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCwgb3IgTm9uZSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZC4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudCBvciBOb25lCisKKyAgICBkZWYgZmluZChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICByZXR1cm4gRWxlbWVudFBhdGguZmluZChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIEZpbmRzIHRleHQgZm9yIHRoZSBmaXJzdCBtYXRjaGluZyBzdWJlbGVtZW50LCBieSB0YWcgbmFtZSBvciBwYXRoLgorICAgICMKKyAgICAjIEBwYXJhbSBwYXRoIFdoYXQgZWxlbWVudCB0byBsb29rIGZvci4KKyAgICAjIEBwYXJhbSBkZWZhdWx0IFdoYXQgdG8gcmV0dXJuIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgZm91bmQuCisgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KKyAgICAjIEByZXR1cm4gVGhlIHRleHQgY29udGVudCBvZiB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCwgb3IgdGhlCisgICAgIyAgICAgZGVmYXVsdCB2YWx1ZSBubyBlbGVtZW50IHdhcyBmb3VuZC4gIE5vdGUgdGhhdCBpZiB0aGUgZWxlbWVudAorICAgICMgICAgIGlzIGZvdW5kLCBidXQgaGFzIG5vIHRleHQgY29udGVudCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgorICAgICMgICAgIGVtcHR5IHN0cmluZy4KKyAgICAjIEBkZWZyZXR1cm4gc3RyaW5nCisKKyAgICBkZWYgZmluZHRleHQoc2VsZiwgcGF0aCwgZGVmYXVsdD1Ob25lLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICByZXR1cm4gRWxlbWVudFBhdGguZmluZHRleHQoc2VsZiwgcGF0aCwgZGVmYXVsdCwgbmFtZXNwYWNlcykKKworICAgICMjCisgICAgIyBGaW5kcyBhbGwgbWF0Y2hpbmcgc3ViZWxlbWVudHMsIGJ5IHRhZyBuYW1lIG9yIHBhdGguCisgICAgIworICAgICMgQHBhcmFtIHBhdGggV2hhdCBlbGVtZW50IHRvIGxvb2sgZm9yLgorICAgICMgQGtleXBhcmFtIG5hbWVzcGFjZXMgT3B0aW9uYWwgbmFtZXNwYWNlIHByZWZpeCBtYXAuCisgICAgIyBAcmV0dXJuIEEgbGlzdCBvciBvdGhlciBzZXF1ZW5jZSBjb250YWluaW5nIGFsbCBtYXRjaGluZyBlbGVtZW50cywKKyAgICAjICAgIGluIGRvY3VtZW50IG9yZGVyLgorICAgICMgQGRlZnJldHVybiBsaXN0IG9mIEVsZW1lbnQgaW5zdGFuY2VzCisKKyAgICBkZWYgZmluZGFsbChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICByZXR1cm4gRWxlbWVudFBhdGguZmluZGFsbChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIEZpbmRzIGFsbCBtYXRjaGluZyBzdWJlbGVtZW50cywgYnkgdGFnIG5hbWUgb3IgcGF0aC4KKyAgICAjCisgICAgIyBAcGFyYW0gcGF0aCBXaGF0IGVsZW1lbnQgdG8gbG9vayBmb3IuCisgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KKyAgICAjIEByZXR1cm4gQW4gaXRlcmF0b3Igb3Igc2VxdWVuY2UgY29udGFpbmluZyBhbGwgbWF0Y2hpbmcgZWxlbWVudHMsCisgICAgIyAgICBpbiBkb2N1bWVudCBvcmRlci4KKyAgICAjIEBkZWZyZXR1cm4gYSBnZW5lcmF0ZWQgc2VxdWVuY2Ugb2YgRWxlbWVudCBpbnN0YW5jZXMKKworICAgIGRlZiBpdGVyZmluZChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICByZXR1cm4gRWxlbWVudFBhdGguaXRlcmZpbmQoc2VsZiwgcGF0aCwgbmFtZXNwYWNlcykKKworICAgICMjCisgICAgIyBSZXNldHMgYW4gZWxlbWVudC4gIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhbGwgc3ViZWxlbWVudHMsIGNsZWFycworICAgICMgYWxsIGF0dHJpYnV0ZXMsIGFuZCBzZXRzIHRoZSA8Yj50ZXh0PC9iPiBhbmQgPGI+dGFpbDwvYj4gYXR0cmlidXRlcworICAgICMgdG8gTm9uZS4KKworICAgIGRlZiBjbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi5hdHRyaWIuY2xlYXIoKQorICAgICAgICBzZWxmLl9jaGlsZHJlbiA9IFtdCisgICAgICAgIHNlbGYudGV4dCA9IHNlbGYudGFpbCA9IE5vbmUKKworICAgICMjCisgICAgIyBHZXRzIGFuIGVsZW1lbnQgYXR0cmlidXRlLiAgRXF1aXZhbGVudCB0byA8Yj5hdHRyaWIuZ2V0PC9iPiwgYnV0CisgICAgIyBzb21lIGltcGxlbWVudGF0aW9ucyBtYXkgaGFuZGxlIHRoaXMgYSBiaXQgbW9yZSBlZmZpY2llbnRseS4KKyAgICAjCisgICAgIyBAcGFyYW0ga2V5IFdoYXQgYXR0cmlidXRlIHRvIGxvb2sgZm9yLgorICAgICMgQHBhcmFtIGRlZmF1bHQgV2hhdCB0byByZXR1cm4gaWYgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IGZvdW5kLgorICAgICMgQHJldHVybiBUaGUgYXR0cmlidXRlIHZhbHVlLCBvciB0aGUgZGVmYXVsdCB2YWx1ZSwgaWYgdGhlCisgICAgIyAgICAgYXR0cmlidXRlIHdhcyBub3QgZm91bmQuCisgICAgIyBAZGVmcmV0dXJuIHN0cmluZyBvciBOb25lCisKKyAgICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXR0cmliLmdldChrZXksIGRlZmF1bHQpCisKKyAgICAjIworICAgICMgU2V0cyBhbiBlbGVtZW50IGF0dHJpYnV0ZS4gIEVxdWl2YWxlbnQgdG8gPGI+YXR0cmliW2tleV0gPSB2YWx1ZTwvYj4sCisgICAgIyBidXQgc29tZSBpbXBsZW1lbnRhdGlvbnMgbWF5IGhhbmRsZSB0aGlzIGEgYml0IG1vcmUgZWZmaWNpZW50bHkuCisgICAgIworICAgICMgQHBhcmFtIGtleSBXaGF0IGF0dHJpYnV0ZSB0byBzZXQuCisgICAgIyBAcGFyYW0gdmFsdWUgVGhlIGF0dHJpYnV0ZSB2YWx1ZS4KKworICAgIGRlZiBzZXQoc2VsZiwga2V5LCB2YWx1ZSk6CisgICAgICAgIHNlbGYuYXR0cmliW2tleV0gPSB2YWx1ZQorCisgICAgIyMKKyAgICAjIEdldHMgYSBsaXN0IG9mIGF0dHJpYnV0ZSBuYW1lcy4gIFRoZSBuYW1lcyBhcmUgcmV0dXJuZWQgaW4gYW4KKyAgICAjIGFyYml0cmFyeSBvcmRlciAoanVzdCBsaWtlIGZvciBhbiBvcmRpbmFyeSBQeXRob24gZGljdGlvbmFyeSkuCisgICAgIyBFcXVpdmFsZW50IHRvIDxiPmF0dHJpYi5rZXlzKCk8L2I+LgorICAgICMKKyAgICAjIEByZXR1cm4gQSBsaXN0IG9mIGVsZW1lbnQgYXR0cmlidXRlIG5hbWVzLgorICAgICMgQGRlZnJldHVybiBsaXN0IG9mIHN0cmluZ3MKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyaWIua2V5cygpCisKKyAgICAjIworICAgICMgR2V0cyBlbGVtZW50IGF0dHJpYnV0ZXMsIGFzIGEgc2VxdWVuY2UuICBUaGUgYXR0cmlidXRlcyBhcmUKKyAgICAjIHJldHVybmVkIGluIGFuIGFyYml0cmFyeSBvcmRlci4gIEVxdWl2YWxlbnQgdG8gPGI+YXR0cmliLml0ZW1zKCk8L2I+LgorICAgICMKKyAgICAjIEByZXR1cm4gQSBsaXN0IG9mIChuYW1lLCB2YWx1ZSkgdHVwbGVzIGZvciBhbGwgYXR0cmlidXRlcy4KKyAgICAjIEBkZWZyZXR1cm4gbGlzdCBvZiAoc3RyaW5nLCBzdHJpbmcpIHR1cGxlcworCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyaWIuaXRlbXMoKQorCisgICAgIyMKKyAgICAjIENyZWF0ZXMgYSB0cmVlIGl0ZXJhdG9yLiAgVGhlIGl0ZXJhdG9yIGxvb3BzIG92ZXIgdGhpcyBlbGVtZW50CisgICAgIyBhbmQgYWxsIHN1YmVsZW1lbnRzLCBpbiBkb2N1bWVudCBvcmRlciwgYW5kIHJldHVybnMgYWxsIGVsZW1lbnRzCisgICAgIyB3aXRoIGEgbWF0Y2hpbmcgdGFnLgorICAgICMgPHA+CisgICAgIyBJZiB0aGUgdHJlZSBzdHJ1Y3R1cmUgaXMgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbiwgbmV3IG9yIHJlbW92ZWQKKyAgICAjIGVsZW1lbnRzIG1heSBvciBtYXkgbm90IGJlIGluY2x1ZGVkLiAgVG8gZ2V0IGEgc3RhYmxlIHNldCwgdXNlIHRoZQorICAgICMgbGlzdCgpIGZ1bmN0aW9uIG9uIHRoZSBpdGVyYXRvciwgYW5kIGxvb3Agb3ZlciB0aGUgcmVzdWx0aW5nIGxpc3QuCisgICAgIworICAgICMgQHBhcmFtIHRhZyBXaGF0IHRhZ3MgdG8gbG9vayBmb3IgKGRlZmF1bHQgaXMgdG8gcmV0dXJuIGFsbCBlbGVtZW50cykuCisgICAgIyBAcmV0dXJuIEFuIGl0ZXJhdG9yIGNvbnRhaW5pbmcgYWxsIHRoZSBtYXRjaGluZyBlbGVtZW50cy4KKyAgICAjIEBkZWZyZXR1cm4gaXRlcmF0b3IKKworICAgIGRlZiBpdGVyKHNlbGYsIHRhZz1Ob25lKToKKyAgICAgICAgaWYgdGFnID09ICIqIjoKKyAgICAgICAgICAgIHRhZyA9IE5vbmUKKyAgICAgICAgaWYgdGFnIGlzIE5vbmUgb3Igc2VsZi50YWcgPT0gdGFnOgorICAgICAgICAgICAgeWllbGQgc2VsZgorICAgICAgICBmb3IgZSBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIGZvciBlIGluIGUuaXRlcih0YWcpOgorICAgICAgICAgICAgICAgIHlpZWxkIGUKKworICAgICMgY29tcGF0aWJpbGl0eQorICAgIGRlZiBnZXRpdGVyYXRvcihzZWxmLCB0YWc9Tm9uZSk6CisgICAgICAgICMgQ2hhbmdlIGZvciBhIERlcHJlY2F0aW9uV2FybmluZyBpbiAxLjQKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICJUaGlzIG1ldGhvZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLiAgIgorICAgICAgICAgICAgIlVzZSAnZWxlbS5pdGVyKCknIG9yICdsaXN0KGVsZW0uaXRlcigpKScgaW5zdGVhZC4iLAorICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZywgc3RhY2tsZXZlbD0yCisgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5pdGVyKHRhZykpCisKKyAgICAjIworICAgICMgQ3JlYXRlcyBhIHRleHQgaXRlcmF0b3IuICBUaGUgaXRlcmF0b3IgbG9vcHMgb3ZlciB0aGlzIGVsZW1lbnQKKyAgICAjIGFuZCBhbGwgc3ViZWxlbWVudHMsIGluIGRvY3VtZW50IG9yZGVyLCBhbmQgcmV0dXJucyBhbGwgaW5uZXIKKyAgICAjIHRleHQuCisgICAgIworICAgICMgQHJldHVybiBBbiBpdGVyYXRvciBjb250YWluaW5nIGFsbCBpbm5lciB0ZXh0LgorICAgICMgQGRlZnJldHVybiBpdGVyYXRvcgorCisgICAgZGVmIGl0ZXJ0ZXh0KHNlbGYpOgorICAgICAgICB0YWcgPSBzZWxmLnRhZworICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh0YWcsIGJhc2VzdHJpbmcpIGFuZCB0YWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi50ZXh0OgorICAgICAgICAgICAgeWllbGQgc2VsZi50ZXh0CisgICAgICAgIGZvciBlIGluIHNlbGY6CisgICAgICAgICAgICBmb3IgcyBpbiBlLml0ZXJ0ZXh0KCk6CisgICAgICAgICAgICAgICAgeWllbGQgcworICAgICAgICAgICAgaWYgZS50YWlsOgorICAgICAgICAgICAgICAgIHlpZWxkIGUudGFpbAorCisjIGNvbXBhdGliaWxpdHkKK19FbGVtZW50ID0gX0VsZW1lbnRJbnRlcmZhY2UgPSBFbGVtZW50CisKKyMjCisjIFN1YmVsZW1lbnQgZmFjdG9yeS4gIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBlbGVtZW50IGluc3RhbmNlLCBhbmQKKyMgYXBwZW5kcyBpdCB0byBhbiBleGlzdGluZyBlbGVtZW50LgorIyA8cD4KKyMgVGhlIGVsZW1lbnQgbmFtZSwgYXR0cmlidXRlIG5hbWVzLCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUKKyMgZWl0aGVyIDgtYml0IEFTQ0lJIHN0cmluZ3Mgb3IgVW5pY29kZSBzdHJpbmdzLgorIworIyBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgZWxlbWVudC4KKyMgQHBhcmFtIHRhZyBUaGUgc3ViZWxlbWVudCBuYW1lLgorIyBAcGFyYW0gYXR0cmliIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnksIGNvbnRhaW5pbmcgZWxlbWVudCBhdHRyaWJ1dGVzLgorIyBAcGFyYW0gKipleHRyYSBBZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIGdpdmVuIGFzIGtleXdvcmQgYXJndW1lbnRzLgorIyBAcmV0dXJuIEFuIGVsZW1lbnQgaW5zdGFuY2UuCisjIEBkZWZyZXR1cm4gRWxlbWVudAorCitkZWYgU3ViRWxlbWVudChwYXJlbnQsIHRhZywgYXR0cmliPXt9LCAqKmV4dHJhKToKKyAgICBhdHRyaWIgPSBhdHRyaWIuY29weSgpCisgICAgYXR0cmliLnVwZGF0ZShleHRyYSkKKyAgICBlbGVtZW50ID0gcGFyZW50Lm1ha2VlbGVtZW50KHRhZywgYXR0cmliKQorICAgIHBhcmVudC5hcHBlbmQoZWxlbWVudCkKKyAgICByZXR1cm4gZWxlbWVudAorCisjIworIyBDb21tZW50IGVsZW1lbnQgZmFjdG9yeS4gIFRoaXMgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVzIGEgc3BlY2lhbAorIyBlbGVtZW50IHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGFuIFhNTCBjb21tZW50IGJ5IHRoZSBzdGFuZGFyZAorIyBzZXJpYWxpemVyLgorIyA8cD4KKyMgVGhlIGNvbW1lbnQgc3RyaW5nIGNhbiBiZSBlaXRoZXIgYW4gOC1iaXQgQVNDSUkgc3RyaW5nIG9yIGEgVW5pY29kZQorIyBzdHJpbmcuCisjCisjIEBwYXJhbSB0ZXh0IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbW1lbnQgc3RyaW5nLgorIyBAcmV0dXJuIEFuIGVsZW1lbnQgaW5zdGFuY2UsIHJlcHJlc2VudGluZyBhIGNvbW1lbnQuCisjIEBkZWZyZXR1cm4gRWxlbWVudAorCitkZWYgQ29tbWVudCh0ZXh0PU5vbmUpOgorICAgIGVsZW1lbnQgPSBFbGVtZW50KENvbW1lbnQpCisgICAgZWxlbWVudC50ZXh0ID0gdGV4dAorICAgIHJldHVybiBlbGVtZW50CisKKyMjCisjIFBJIGVsZW1lbnQgZmFjdG9yeS4gIFRoaXMgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVzIGEgc3BlY2lhbCBlbGVtZW50CisjIHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGFuIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGJ5IHRoZSBzdGFuZGFyZAorIyBzZXJpYWxpemVyLgorIworIyBAcGFyYW0gdGFyZ2V0IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFBJIHRhcmdldC4KKyMgQHBhcmFtIHRleHQgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgUEkgY29udGVudHMsIGlmIGFueS4KKyMgQHJldHVybiBBbiBlbGVtZW50IGluc3RhbmNlLCByZXByZXNlbnRpbmcgYSBQSS4KKyMgQGRlZnJldHVybiBFbGVtZW50CisKK2RlZiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24odGFyZ2V0LCB0ZXh0PU5vbmUpOgorICAgIGVsZW1lbnQgPSBFbGVtZW50KFByb2Nlc3NpbmdJbnN0cnVjdGlvbikKKyAgICBlbGVtZW50LnRleHQgPSB0YXJnZXQKKyAgICBpZiB0ZXh0OgorICAgICAgICBlbGVtZW50LnRleHQgPSBlbGVtZW50LnRleHQgKyAiICIgKyB0ZXh0CisgICAgcmV0dXJuIGVsZW1lbnQKKworUEkgPSBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KKworIyMKKyMgUU5hbWUgd3JhcHBlci4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JhcCBhIFFOYW1lIGF0dHJpYnV0ZSB2YWx1ZSwgaW4KKyMgb3JkZXIgdG8gZ2V0IHByb3BlciBuYW1lc3BhY2UgaGFuZGxpbmcgb24gb3V0cHV0LgorIworIyBAcGFyYW0gdGV4dCBBIHN0cmluZyBjb250YWluaW5nIHRoZSBRTmFtZSB2YWx1ZSwgaW4gdGhlIGZvcm0ge3VyaX1sb2NhbCwKKyMgICAgIG9yLCBpZiB0aGUgdGFnIGFyZ3VtZW50IGlzIGdpdmVuLCB0aGUgVVJJIHBhcnQgb2YgYSBRTmFtZS4KKyMgQHBhcmFtIHRhZyBPcHRpb25hbCB0YWcuICBJZiBnaXZlbiwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzCisjICAgICBhbiBVUkksIGFuZCB0aGlzIGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzIGEgbG9jYWwgbmFtZS4KKyMgQHJldHVybiBBbiBvcGFxdWUgb2JqZWN0LCByZXByZXNlbnRpbmcgdGhlIFFOYW1lLgorCitjbGFzcyBRTmFtZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXh0X29yX3VyaSwgdGFnPU5vbmUpOgorICAgICAgICBpZiB0YWc6CisgICAgICAgICAgICB0ZXh0X29yX3VyaSA9ICJ7JXN9JXMiICUgKHRleHRfb3JfdXJpLCB0YWcpCisgICAgICAgIHNlbGYudGV4dCA9IHRleHRfb3JfdXJpCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRleHQKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYudGV4dCkKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFFOYW1lKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi50ZXh0LCBvdGhlci50ZXh0KQorICAgICAgICByZXR1cm4gY21wKHNlbGYudGV4dCwgb3RoZXIpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyMKKyMgRWxlbWVudFRyZWUgd3JhcHBlciBjbGFzcy4gIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBlbnRpcmUgZWxlbWVudAorIyBoaWVyYXJjaHksIGFuZCBhZGRzIHNvbWUgZXh0cmEgc3VwcG9ydCBmb3Igc2VyaWFsaXphdGlvbiB0byBhbmQgZnJvbQorIyBzdGFuZGFyZCBYTUwuCisjCisjIEBwYXJhbSBlbGVtZW50IE9wdGlvbmFsIHJvb3QgZWxlbWVudC4KKyMgQGtleXBhcmFtIGZpbGUgT3B0aW9uYWwgZmlsZSBoYW5kbGUgb3IgZmlsZSBuYW1lLiAgSWYgZ2l2ZW4sIHRoZQorIyAgICAgdHJlZSBpcyBpbml0aWFsaXplZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGlzIFhNTCBmaWxlLgorCitjbGFzcyBFbGVtZW50VHJlZShvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnQ9Tm9uZSwgZmlsZT1Ob25lKToKKyAgICAgICAgIyBhc3NlcnQgZWxlbWVudCBpcyBOb25lIG9yIGlzZWxlbWVudChlbGVtZW50KQorICAgICAgICBzZWxmLl9yb290ID0gZWxlbWVudCAjIGZpcnN0IG5vZGUKKyAgICAgICAgaWYgZmlsZToKKyAgICAgICAgICAgIHNlbGYucGFyc2UoZmlsZSkKKworICAgICMjCisgICAgIyBHZXRzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoaXMgdHJlZS4KKyAgICAjCisgICAgIyBAcmV0dXJuIEFuIGVsZW1lbnQgaW5zdGFuY2UuCisgICAgIyBAZGVmcmV0dXJuIEVsZW1lbnQKKworICAgIGRlZiBnZXRyb290KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcm9vdAorCisgICAgIyMKKyAgICAjIFJlcGxhY2VzIHRoZSByb290IGVsZW1lbnQgZm9yIHRoaXMgdHJlZS4gIFRoaXMgZGlzY2FyZHMgdGhlCisgICAgIyBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSB0cmVlLCBhbmQgcmVwbGFjZXMgaXQgd2l0aCB0aGUgZ2l2ZW4KKyAgICAjIGVsZW1lbnQuICBVc2Ugd2l0aCBjYXJlLgorICAgICMKKyAgICAjIEBwYXJhbSBlbGVtZW50IEFuIGVsZW1lbnQgaW5zdGFuY2UuCisKKyAgICBkZWYgX3NldHJvb3Qoc2VsZiwgZWxlbWVudCk6CisgICAgICAgICMgYXNzZXJ0IGlzZWxlbWVudChlbGVtZW50KQorICAgICAgICBzZWxmLl9yb290ID0gZWxlbWVudAorCisgICAgIyMKKyAgICAjIExvYWRzIGFuIGV4dGVybmFsIFhNTCBkb2N1bWVudCBpbnRvIHRoaXMgZWxlbWVudCB0cmVlLgorICAgICMKKyAgICAjIEBwYXJhbSBzb3VyY2UgQSBmaWxlIG5hbWUgb3IgZmlsZSBvYmplY3QuICBJZiBhIGZpbGUgb2JqZWN0IGlzCisgICAgIyAgICAgZ2l2ZW4sIGl0IG9ubHkgaGFzIHRvIGltcGxlbWVudCBhIDxiPnJlYWQobik8L2I+IG1ldGhvZC4KKyAgICAjIEBrZXlwYXJhbSBwYXJzZXIgQW4gb3B0aW9uYWwgcGFyc2VyIGluc3RhbmNlLiAgSWYgbm90IGdpdmVuLCB0aGUKKyAgICAjICAgICBzdGFuZGFyZCB7QGxpbmsgWE1MUGFyc2VyfSBwYXJzZXIgaXMgdXNlZC4KKyAgICAjIEByZXR1cm4gVGhlIGRvY3VtZW50IHJvb3QgZWxlbWVudC4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudAorICAgICMgQGV4Y2VwdGlvbiBQYXJzZUVycm9yIElmIHRoZSBwYXJzZXIgZmFpbHMgdG8gcGFyc2UgdGhlIGRvY3VtZW50LgorCisgICAgZGVmIHBhcnNlKHNlbGYsIHNvdXJjZSwgcGFyc2VyPU5vbmUpOgorICAgICAgICBjbG9zZV9zb3VyY2UgPSBGYWxzZQorICAgICAgICBpZiBub3QgaGFzYXR0cihzb3VyY2UsICJyZWFkIik6CisgICAgICAgICAgICBzb3VyY2UgPSBvcGVuKHNvdXJjZSwgInJiIikKKyAgICAgICAgICAgIGNsb3NlX3NvdXJjZSA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgbm90IHBhcnNlcjoKKyAgICAgICAgICAgICAgICBwYXJzZXIgPSBYTUxQYXJzZXIodGFyZ2V0PVRyZWVCdWlsZGVyKCkpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzb3VyY2UucmVhZCg2NTUzNikKKyAgICAgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBwYXJzZXIuZmVlZChkYXRhKQorICAgICAgICAgICAgc2VsZi5fcm9vdCA9IHBhcnNlci5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcm9vdAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgY2xvc2Vfc291cmNlOgorICAgICAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpCisKKyAgICAjIworICAgICMgQ3JlYXRlcyBhIHRyZWUgaXRlcmF0b3IgZm9yIHRoZSByb290IGVsZW1lbnQuICBUaGUgaXRlcmF0b3IgbG9vcHMKKyAgICAjIG92ZXIgYWxsIGVsZW1lbnRzIGluIHRoaXMgdHJlZSwgaW4gZG9jdW1lbnQgb3JkZXIuCisgICAgIworICAgICMgQHBhcmFtIHRhZyBXaGF0IHRhZ3MgdG8gbG9vayBmb3IgKGRlZmF1bHQgaXMgdG8gcmV0dXJuIGFsbCBlbGVtZW50cykKKyAgICAjIEByZXR1cm4gQW4gaXRlcmF0b3IuCisgICAgIyBAZGVmcmV0dXJuIGl0ZXJhdG9yCisKKyAgICBkZWYgaXRlcihzZWxmLCB0YWc9Tm9uZSk6CisgICAgICAgICMgYXNzZXJ0IHNlbGYuX3Jvb3QgaXMgbm90IE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuaXRlcih0YWcpCisKKyAgICAjIGNvbXBhdGliaWxpdHkKKyAgICBkZWYgZ2V0aXRlcmF0b3Ioc2VsZiwgdGFnPU5vbmUpOgorICAgICAgICAjIENoYW5nZSBmb3IgYSBEZXByZWNhdGlvbldhcm5pbmcgaW4gMS40CisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAiVGhpcyBtZXRob2Qgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy4gICIKKyAgICAgICAgICAgICJVc2UgJ3RyZWUuaXRlcigpJyBvciAnbGlzdCh0cmVlLml0ZXIoKSknIGluc3RlYWQuIiwKKyAgICAgICAgICAgIFBlbmRpbmdEZXByZWNhdGlvbldhcm5pbmcsIHN0YWNrbGV2ZWw9MgorICAgICAgICApCisgICAgICAgIHJldHVybiBsaXN0KHNlbGYuaXRlcih0YWcpKQorCisgICAgIyMKKyAgICAjIFNhbWUgYXMgZ2V0cm9vdCgpLmZpbmQocGF0aCksIHN0YXJ0aW5nIGF0IHRoZSByb290IG9mIHRoZQorICAgICMgdHJlZS4KKyAgICAjCisgICAgIyBAcGFyYW0gcGF0aCBXaGF0IGVsZW1lbnQgdG8gbG9vayBmb3IuCisgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KKyAgICAjIEByZXR1cm4gVGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsIG9yIE5vbmUgaWYgbm8gZWxlbWVudCB3YXMgZm91bmQuCisgICAgIyBAZGVmcmV0dXJuIEVsZW1lbnQgb3IgTm9uZQorCisgICAgZGVmIGZpbmQoc2VsZiwgcGF0aCwgbmFtZXNwYWNlcz1Ob25lKToKKyAgICAgICAgIyBhc3NlcnQgc2VsZi5fcm9vdCBpcyBub3QgTm9uZQorICAgICAgICBpZiBwYXRoWzoxXSA9PSAiLyI6CisgICAgICAgICAgICBwYXRoID0gIi4iICsgcGF0aAorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiVGhpcyBzZWFyY2ggaXMgYnJva2VuIGluIDEuMyBhbmQgZWFybGllciwgYW5kIHdpbGwgYmUgIgorICAgICAgICAgICAgICAgICJmaXhlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiAgSWYgeW91IHJlbHkgb24gdGhlIGN1cnJlbnQgIgorICAgICAgICAgICAgICAgICJiZWhhdmlvdXIsIGNoYW5nZSBpdCB0byAlciIgJSBwYXRoLAorICAgICAgICAgICAgICAgIEZ1dHVyZVdhcm5pbmcsIHN0YWNrbGV2ZWw9MgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuZmluZChwYXRoLCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIFNhbWUgYXMgZ2V0cm9vdCgpLmZpbmR0ZXh0KHBhdGgpLCBzdGFydGluZyBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KKyAgICAjCisgICAgIyBAcGFyYW0gcGF0aCBXaGF0IGVsZW1lbnQgdG8gbG9vayBmb3IuCisgICAgIyBAcGFyYW0gZGVmYXVsdCBXaGF0IHRvIHJldHVybiBpZiB0aGUgZWxlbWVudCB3YXMgbm90IGZvdW5kLgorICAgICMgQGtleXBhcmFtIG5hbWVzcGFjZXMgT3B0aW9uYWwgbmFtZXNwYWNlIHByZWZpeCBtYXAuCisgICAgIyBAcmV0dXJuIFRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsIG9yIHRoZQorICAgICMgICAgIGRlZmF1bHQgdmFsdWUgbm8gZWxlbWVudCB3YXMgZm91bmQuICBOb3RlIHRoYXQgaWYgdGhlIGVsZW1lbnQKKyAgICAjICAgICBpcyBmb3VuZCwgYnV0IGhhcyBubyB0ZXh0IGNvbnRlbnQsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4KKyAgICAjICAgICBlbXB0eSBzdHJpbmcuCisgICAgIyBAZGVmcmV0dXJuIHN0cmluZworCisgICAgZGVmIGZpbmR0ZXh0KHNlbGYsIHBhdGgsIGRlZmF1bHQ9Tm9uZSwgbmFtZXNwYWNlcz1Ob25lKToKKyAgICAgICAgIyBhc3NlcnQgc2VsZi5fcm9vdCBpcyBub3QgTm9uZQorICAgICAgICBpZiBwYXRoWzoxXSA9PSAiLyI6CisgICAgICAgICAgICBwYXRoID0gIi4iICsgcGF0aAorICAgICAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICAgICAiVGhpcyBzZWFyY2ggaXMgYnJva2VuIGluIDEuMyBhbmQgZWFybGllciwgYW5kIHdpbGwgYmUgIgorICAgICAgICAgICAgICAgICJmaXhlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiAgSWYgeW91IHJlbHkgb24gdGhlIGN1cnJlbnQgIgorICAgICAgICAgICAgICAgICJiZWhhdmlvdXIsIGNoYW5nZSBpdCB0byAlciIgJSBwYXRoLAorICAgICAgICAgICAgICAgIEZ1dHVyZVdhcm5pbmcsIHN0YWNrbGV2ZWw9MgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Jvb3QuZmluZHRleHQocGF0aCwgZGVmYXVsdCwgbmFtZXNwYWNlcykKKworICAgICMjCisgICAgIyBTYW1lIGFzIGdldHJvb3QoKS5maW5kYWxsKHBhdGgpLCBzdGFydGluZyBhdCB0aGUgcm9vdCBvZiB0aGUgdHJlZS4KKyAgICAjCisgICAgIyBAcGFyYW0gcGF0aCBXaGF0IGVsZW1lbnQgdG8gbG9vayBmb3IuCisgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KKyAgICAjIEByZXR1cm4gQSBsaXN0IG9yIGl0ZXJhdG9yIGNvbnRhaW5pbmcgYWxsIG1hdGNoaW5nIGVsZW1lbnRzLAorICAgICMgICAgaW4gZG9jdW1lbnQgb3JkZXIuCisgICAgIyBAZGVmcmV0dXJuIGxpc3Qgb2YgRWxlbWVudCBpbnN0YW5jZXMKKworICAgIGRlZiBmaW5kYWxsKHNlbGYsIHBhdGgsIG5hbWVzcGFjZXM9Tm9uZSk6CisgICAgICAgICMgYXNzZXJ0IHNlbGYuX3Jvb3QgaXMgbm90IE5vbmUKKyAgICAgICAgaWYgcGF0aFs6MV0gPT0gIi8iOgorICAgICAgICAgICAgcGF0aCA9ICIuIiArIHBhdGgKKyAgICAgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAgICAgIlRoaXMgc2VhcmNoIGlzIGJyb2tlbiBpbiAxLjMgYW5kIGVhcmxpZXIsIGFuZCB3aWxsIGJlICIKKyAgICAgICAgICAgICAgICAiZml4ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbi4gIElmIHlvdSByZWx5IG9uIHRoZSBjdXJyZW50ICIKKyAgICAgICAgICAgICAgICAiYmVoYXZpb3VyLCBjaGFuZ2UgaXQgdG8gJXIiICUgcGF0aCwKKyAgICAgICAgICAgICAgICBGdXR1cmVXYXJuaW5nLCBzdGFja2xldmVsPTIKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBzZWxmLl9yb290LmZpbmRhbGwocGF0aCwgbmFtZXNwYWNlcykKKworICAgICMjCisgICAgIyBGaW5kcyBhbGwgbWF0Y2hpbmcgc3ViZWxlbWVudHMsIGJ5IHRhZyBuYW1lIG9yIHBhdGguCisgICAgIyBTYW1lIGFzIGdldHJvb3QoKS5pdGVyZmluZChwYXRoKS4KKyAgICAjCisgICAgIyBAcGFyYW0gcGF0aCBXaGF0IGVsZW1lbnQgdG8gbG9vayBmb3IuCisgICAgIyBAa2V5cGFyYW0gbmFtZXNwYWNlcyBPcHRpb25hbCBuYW1lc3BhY2UgcHJlZml4IG1hcC4KKyAgICAjIEByZXR1cm4gQW4gaXRlcmF0b3Igb3Igc2VxdWVuY2UgY29udGFpbmluZyBhbGwgbWF0Y2hpbmcgZWxlbWVudHMsCisgICAgIyAgICBpbiBkb2N1bWVudCBvcmRlci4KKyAgICAjIEBkZWZyZXR1cm4gYSBnZW5lcmF0ZWQgc2VxdWVuY2Ugb2YgRWxlbWVudCBpbnN0YW5jZXMKKworICAgIGRlZiBpdGVyZmluZChzZWxmLCBwYXRoLCBuYW1lc3BhY2VzPU5vbmUpOgorICAgICAgICAjIGFzc2VydCBzZWxmLl9yb290IGlzIG5vdCBOb25lCisgICAgICAgIGlmIHBhdGhbOjFdID09ICIvIjoKKyAgICAgICAgICAgIHBhdGggPSAiLiIgKyBwYXRoCisgICAgICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgICAgICJUaGlzIHNlYXJjaCBpcyBicm9rZW4gaW4gMS4zIGFuZCBlYXJsaWVyLCBhbmQgd2lsbCBiZSAiCisgICAgICAgICAgICAgICAgImZpeGVkIGluIGEgZnV0dXJlIHZlcnNpb24uICBJZiB5b3UgcmVseSBvbiB0aGUgY3VycmVudCAiCisgICAgICAgICAgICAgICAgImJlaGF2aW91ciwgY2hhbmdlIGl0IHRvICVyIiAlIHBhdGgsCisgICAgICAgICAgICAgICAgRnV0dXJlV2FybmluZywgc3RhY2tsZXZlbD0yCisgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gc2VsZi5fcm9vdC5pdGVyZmluZChwYXRoLCBuYW1lc3BhY2VzKQorCisgICAgIyMKKyAgICAjIFdyaXRlcyB0aGUgZWxlbWVudCB0cmVlIHRvIGEgZmlsZSwgYXMgWE1MLgorICAgICMKKyAgICAjIEBkZWYgd3JpdGUoZmlsZSwgKipvcHRpb25zKQorICAgICMgQHBhcmFtIGZpbGUgQSBmaWxlIG5hbWUsIG9yIGEgZmlsZSBvYmplY3Qgb3BlbmVkIGZvciB3cml0aW5nLgorICAgICMgQHBhcmFtICoqb3B0aW9ucyBPcHRpb25zLCBnaXZlbiBhcyBrZXl3b3JkIGFyZ3VtZW50cy4KKyAgICAjIEBrZXlwYXJhbSBlbmNvZGluZyBPcHRpb25hbCBvdXRwdXQgZW5jb2RpbmcgKGRlZmF1bHQgaXMgVVMtQVNDSUkpLgorICAgICMgQGtleXBhcmFtIHhtbF9kZWNsYXJhdGlvbiBDb250cm9scyBpZiBhbiBYTUwgZGVjbGFyYXRpb24gc2hvdWxkCisgICAgIyAgICAgYmUgYWRkZWQgdG8gdGhlIGZpbGUuICBVc2UgRmFsc2UgZm9yIG5ldmVyLCBUcnVlIGZvciBhbHdheXMsCisgICAgIyAgICAgTm9uZSBmb3Igb25seSBpZiBub3QgVVMtQVNDSUkgb3IgVVRGLTguICBOb25lIGlzIGRlZmF1bHQuCisgICAgIyBAa2V5cGFyYW0gZGVmYXVsdF9uYW1lc3BhY2UgU2V0cyB0aGUgZGVmYXVsdCBYTUwgbmFtZXNwYWNlIChmb3IgInhtbG5zIikuCisgICAgIyBAa2V5cGFyYW0gbWV0aG9kIE9wdGlvbmFsIG91dHB1dCBtZXRob2QgKCJ4bWwiLCAiaHRtbCIsICJ0ZXh0IiBvcgorICAgICMgICAgICJjMTRuIjsgZGVmYXVsdCBpcyAieG1sIikuCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZmlsZV9vcl9maWxlbmFtZSwKKyAgICAgICAgICAgICAgIyBrZXl3b3JkIGFyZ3VtZW50cworICAgICAgICAgICAgICBlbmNvZGluZz1Ob25lLAorICAgICAgICAgICAgICB4bWxfZGVjbGFyYXRpb249Tm9uZSwKKyAgICAgICAgICAgICAgZGVmYXVsdF9uYW1lc3BhY2U9Tm9uZSwKKyAgICAgICAgICAgICAgbWV0aG9kPU5vbmUpOgorICAgICAgICAjIGFzc2VydCBzZWxmLl9yb290IGlzIG5vdCBOb25lCisgICAgICAgIGlmIG5vdCBtZXRob2Q6CisgICAgICAgICAgICBtZXRob2QgPSAieG1sIgorICAgICAgICBlbGlmIG1ldGhvZCBub3QgaW4gX3NlcmlhbGl6ZToKKyAgICAgICAgICAgICMgRklYTUU6IHJhaXNlIGFuIEltcG9ydEVycm9yIGZvciBjMTRuIGlmIEVsZW1lbnRDMTROIGlzIG1pc3Npbmc/CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIG1ldGhvZCAlciIgJSBtZXRob2QpCisgICAgICAgIGlmIGhhc2F0dHIoZmlsZV9vcl9maWxlbmFtZSwgIndyaXRlIik6CisgICAgICAgICAgICBmaWxlID0gZmlsZV9vcl9maWxlbmFtZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZmlsZSA9IG9wZW4oZmlsZV9vcl9maWxlbmFtZSwgIndiIikKKyAgICAgICAgd3JpdGUgPSBmaWxlLndyaXRlCisgICAgICAgIGlmIG5vdCBlbmNvZGluZzoKKyAgICAgICAgICAgIGlmIG1ldGhvZCA9PSAiYzE0biI6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAidXRmLTgiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVuY29kaW5nID0gInVzLWFzY2lpIgorICAgICAgICBlbGlmIHhtbF9kZWNsYXJhdGlvbiBvciAoeG1sX2RlY2xhcmF0aW9uIGlzIE5vbmUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZyBub3QgaW4gKCJ1dGYtOCIsICJ1cy1hc2NpaSIpKToKKyAgICAgICAgICAgIGlmIG1ldGhvZCA9PSAieG1sIjoKKyAgICAgICAgICAgICAgICB3cml0ZSgiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nJXMnPz5cbiIgJSBlbmNvZGluZykKKyAgICAgICAgaWYgbWV0aG9kID09ICJ0ZXh0IjoKKyAgICAgICAgICAgIF9zZXJpYWxpemVfdGV4dCh3cml0ZSwgc2VsZi5fcm9vdCwgZW5jb2RpbmcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBxbmFtZXMsIG5hbWVzcGFjZXMgPSBfbmFtZXNwYWNlcygKKyAgICAgICAgICAgICAgICBzZWxmLl9yb290LCBlbmNvZGluZywgZGVmYXVsdF9uYW1lc3BhY2UKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZXJpYWxpemUgPSBfc2VyaWFsaXplW21ldGhvZF0KKyAgICAgICAgICAgIHNlcmlhbGl6ZSh3cml0ZSwgc2VsZi5fcm9vdCwgZW5jb2RpbmcsIHFuYW1lcywgbmFtZXNwYWNlcykKKyAgICAgICAgaWYgZmlsZV9vcl9maWxlbmFtZSBpcyBub3QgZmlsZToKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorCisgICAgZGVmIHdyaXRlX2MxNG4oc2VsZiwgZmlsZSk6CisgICAgICAgICMgbHhtbC5ldHJlZSBjb21wYXRpYmlsaXR5LiAgdXNlIG91dHB1dCBtZXRob2QgaW5zdGVhZAorICAgICAgICByZXR1cm4gc2VsZi53cml0ZShmaWxlLCBtZXRob2Q9ImMxNG4iKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHNlcmlhbGl6YXRpb24gc3VwcG9ydAorCitkZWYgX25hbWVzcGFjZXMoZWxlbSwgZW5jb2RpbmcsIGRlZmF1bHRfbmFtZXNwYWNlPU5vbmUpOgorICAgICMgaWRlbnRpZnkgbmFtZXNwYWNlcyB1c2VkIGluIHRoaXMgdHJlZQorCisgICAgIyBtYXBzIHFuYW1lcyB0byAqZW5jb2RlZCogcHJlZml4OmxvY2FsIG5hbWVzCisgICAgcW5hbWVzID0ge05vbmU6IE5vbmV9CisKKyAgICAjIG1hcHMgdXJpOnMgdG8gcHJlZml4ZXMKKyAgICBuYW1lc3BhY2VzID0ge30KKyAgICBpZiBkZWZhdWx0X25hbWVzcGFjZToKKyAgICAgICAgbmFtZXNwYWNlc1tkZWZhdWx0X25hbWVzcGFjZV0gPSAiIgorCisgICAgZGVmIGVuY29kZSh0ZXh0KToKKyAgICAgICAgcmV0dXJuIHRleHQuZW5jb2RlKGVuY29kaW5nKQorCisgICAgZGVmIGFkZF9xbmFtZShxbmFtZSk6CisgICAgICAgICMgY2FsY3VsYXRlIHNlcmlhbGl6ZWQgcW5hbWUgcmVwcmVzZW50YXRpb24KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgcW5hbWVbOjFdID09ICJ7IjoKKyAgICAgICAgICAgICAgICB1cmksIHRhZyA9IHFuYW1lWzE6XS5yc3BsaXQoIn0iLCAxKQorICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWVzcGFjZXMuZ2V0KHVyaSkKKyAgICAgICAgICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gX25hbWVzcGFjZV9tYXAuZ2V0KHVyaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJlZml4IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAibnMlZCIgJSBsZW4obmFtZXNwYWNlcykKKyAgICAgICAgICAgICAgICAgICAgaWYgcHJlZml4ICE9ICJ4bWwiOgorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlc1t1cmldID0gcHJlZml4CisgICAgICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgICAgICBxbmFtZXNbcW5hbWVdID0gZW5jb2RlKCIlczolcyIgJSAocHJlZml4LCB0YWcpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHFuYW1lc1txbmFtZV0gPSBlbmNvZGUodGFnKSAjIGRlZmF1bHQgZWxlbWVudAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBkZWZhdWx0X25hbWVzcGFjZToKKyAgICAgICAgICAgICAgICAgICAgIyBGSVhNRTogY2FuIHRoaXMgYmUgaGFuZGxlZCBpbiBYTUwgMS4wPworICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCB1c2Ugbm9uLXF1YWxpZmllZCBuYW1lcyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0X25hbWVzcGFjZSBvcHRpb24iCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgcW5hbWVzW3FuYW1lXSA9IGVuY29kZShxbmFtZSkKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIF9yYWlzZV9zZXJpYWxpemF0aW9uX2Vycm9yKHFuYW1lKQorCisgICAgIyBwb3B1bGF0ZSBxbmFtZSBhbmQgbmFtZXNwYWNlcyB0YWJsZQorICAgIHRyeToKKyAgICAgICAgaXRlcmF0ZSA9IGVsZW0uaXRlcgorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgaXRlcmF0ZSA9IGVsZW0uZ2V0aXRlcmF0b3IgIyBjRVQgY29tcGF0aWJpbGl0eQorICAgIGZvciBlbGVtIGluIGl0ZXJhdGUoKToKKyAgICAgICAgdGFnID0gZWxlbS50YWcKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh0YWcsIFFOYW1lKToKKyAgICAgICAgICAgIGlmIHRhZy50ZXh0IG5vdCBpbiBxbmFtZXM6CisgICAgICAgICAgICAgICAgYWRkX3FuYW1lKHRhZy50ZXh0KQorICAgICAgICBlbGlmIGlzaW5zdGFuY2UodGFnLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIGlmIHRhZyBub3QgaW4gcW5hbWVzOgorICAgICAgICAgICAgICAgIGFkZF9xbmFtZSh0YWcpCisgICAgICAgIGVsaWYgdGFnIGlzIG5vdCBOb25lIGFuZCB0YWcgaXMgbm90IENvbW1lbnQgYW5kIHRhZyBpcyBub3QgUEk6CisgICAgICAgICAgICBfcmFpc2Vfc2VyaWFsaXphdGlvbl9lcnJvcih0YWcpCisgICAgICAgIGZvciBrZXksIHZhbHVlIGluIGVsZW0uaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBRTmFtZSk6CisgICAgICAgICAgICAgICAga2V5ID0ga2V5LnRleHQKKyAgICAgICAgICAgIGlmIGtleSBub3QgaW4gcW5hbWVzOgorICAgICAgICAgICAgICAgIGFkZF9xbmFtZShrZXkpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBRTmFtZSkgYW5kIHZhbHVlLnRleHQgbm90IGluIHFuYW1lczoKKyAgICAgICAgICAgICAgICBhZGRfcW5hbWUodmFsdWUudGV4dCkKKyAgICAgICAgdGV4dCA9IGVsZW0udGV4dAorICAgICAgICBpZiBpc2luc3RhbmNlKHRleHQsIFFOYW1lKSBhbmQgdGV4dC50ZXh0IG5vdCBpbiBxbmFtZXM6CisgICAgICAgICAgICBhZGRfcW5hbWUodGV4dC50ZXh0KQorICAgIHJldHVybiBxbmFtZXMsIG5hbWVzcGFjZXMKKworZGVmIF9zZXJpYWxpemVfeG1sKHdyaXRlLCBlbGVtLCBlbmNvZGluZywgcW5hbWVzLCBuYW1lc3BhY2VzKToKKyAgICB0YWcgPSBlbGVtLnRhZworICAgIHRleHQgPSBlbGVtLnRleHQKKyAgICBpZiB0YWcgaXMgQ29tbWVudDoKKyAgICAgICAgd3JpdGUoIjwhLS0lcy0tPiIgJSBfZW5jb2RlKHRleHQsIGVuY29kaW5nKSkKKyAgICBlbGlmIHRhZyBpcyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb246CisgICAgICAgIHdyaXRlKCI8PyVzPz4iICUgX2VuY29kZSh0ZXh0LCBlbmNvZGluZykpCisgICAgZWxzZToKKyAgICAgICAgdGFnID0gcW5hbWVzW3RhZ10KKyAgICAgICAgaWYgdGFnIGlzIE5vbmU6CisgICAgICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgICAgIHdyaXRlKF9lc2NhcGVfY2RhdGEodGV4dCwgZW5jb2RpbmcpKQorICAgICAgICAgICAgZm9yIGUgaW4gZWxlbToKKyAgICAgICAgICAgICAgICBfc2VyaWFsaXplX3htbCh3cml0ZSwgZSwgZW5jb2RpbmcsIHFuYW1lcywgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdyaXRlKCI8IiArIHRhZykKKyAgICAgICAgICAgIGl0ZW1zID0gZWxlbS5pdGVtcygpCisgICAgICAgICAgICBpZiBpdGVtcyBvciBuYW1lc3BhY2VzOgorICAgICAgICAgICAgICAgIGlmIG5hbWVzcGFjZXM6CisgICAgICAgICAgICAgICAgICAgIGZvciB2LCBrIGluIHNvcnRlZChuYW1lc3BhY2VzLml0ZW1zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9bGFtYmRhIHg6IHhbMV0pOiAgIyBzb3J0IG9uIHByZWZpeAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgazoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID0gIjoiICsgaworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoIiB4bWxucyVzPVwiJXNcIiIgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgay5lbmNvZGUoZW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9lc2NhcGVfYXR0cmliKHYsIGVuY29kaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gc29ydGVkKGl0ZW1zKTogICMgbGV4aWNhbCBvcmRlcgorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGssIFFOYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPSBrLnRleHQKKyAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBRTmFtZSk6CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gcW5hbWVzW3YudGV4dF0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBfZXNjYXBlX2F0dHJpYih2LCBlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoIiAlcz1cIiVzXCIiICUgKHFuYW1lc1trXSwgdikpCisgICAgICAgICAgICBpZiB0ZXh0IG9yIGxlbihlbGVtKToKKyAgICAgICAgICAgICAgICB3cml0ZSgiPiIpCisgICAgICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoX2VzY2FwZV9jZGF0YSh0ZXh0LCBlbmNvZGluZykpCisgICAgICAgICAgICAgICAgZm9yIGUgaW4gZWxlbToKKyAgICAgICAgICAgICAgICAgICAgX3NlcmlhbGl6ZV94bWwod3JpdGUsIGUsIGVuY29kaW5nLCBxbmFtZXMsIE5vbmUpCisgICAgICAgICAgICAgICAgd3JpdGUoIjwvIiArIHRhZyArICI+IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgd3JpdGUoIiAvPiIpCisgICAgaWYgZWxlbS50YWlsOgorICAgICAgICB3cml0ZShfZXNjYXBlX2NkYXRhKGVsZW0udGFpbCwgZW5jb2RpbmcpKQorCitIVE1MX0VNUFRZID0gKCJhcmVhIiwgImJhc2UiLCAiYmFzZWZvbnQiLCAiYnIiLCAiY29sIiwgImZyYW1lIiwgImhyIiwKKyAgICAgICAgICAgICAgImltZyIsICJpbnB1dCIsICJpc2luZGV4IiwgImxpbmsiLCAibWV0YSIsICJwYXJhbSIpCisKK3RyeToKKyAgICBIVE1MX0VNUFRZID0gc2V0KEhUTUxfRU1QVFkpCitleGNlcHQgTmFtZUVycm9yOgorICAgIHBhc3MKKworZGVmIF9zZXJpYWxpemVfaHRtbCh3cml0ZSwgZWxlbSwgZW5jb2RpbmcsIHFuYW1lcywgbmFtZXNwYWNlcyk6CisgICAgdGFnID0gZWxlbS50YWcKKyAgICB0ZXh0ID0gZWxlbS50ZXh0CisgICAgaWYgdGFnIGlzIENvbW1lbnQ6CisgICAgICAgIHdyaXRlKCI8IS0tJXMtLT4iICUgX2VzY2FwZV9jZGF0YSh0ZXh0LCBlbmNvZGluZykpCisgICAgZWxpZiB0YWcgaXMgUHJvY2Vzc2luZ0luc3RydWN0aW9uOgorICAgICAgICB3cml0ZSgiPD8lcz8+IiAlIF9lc2NhcGVfY2RhdGEodGV4dCwgZW5jb2RpbmcpKQorICAgIGVsc2U6CisgICAgICAgIHRhZyA9IHFuYW1lc1t0YWddCisgICAgICAgIGlmIHRhZyBpcyBOb25lOgorICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICB3cml0ZShfZXNjYXBlX2NkYXRhKHRleHQsIGVuY29kaW5nKSkKKyAgICAgICAgICAgIGZvciBlIGluIGVsZW06CisgICAgICAgICAgICAgICAgX3NlcmlhbGl6ZV9odG1sKHdyaXRlLCBlLCBlbmNvZGluZywgcW5hbWVzLCBOb25lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3JpdGUoIjwiICsgdGFnKQorICAgICAgICAgICAgaXRlbXMgPSBlbGVtLml0ZW1zKCkKKyAgICAgICAgICAgIGlmIGl0ZW1zIG9yIG5hbWVzcGFjZXM6CisgICAgICAgICAgICAgICAgaWYgbmFtZXNwYWNlczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIHYsIGsgaW4gc29ydGVkKG5hbWVzcGFjZXMuaXRlbXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1sYW1iZGEgeDogeFsxXSk6ICAjIHNvcnQgb24gcHJlZml4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBrOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGsgPSAiOiIgKyBrCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSgiIHhtbG5zJXM9XCIlc1wiIiAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLmVuY29kZShlbmNvZGluZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VzY2FwZV9hdHRyaWIodiwgZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICBmb3IgaywgdiBpbiBzb3J0ZWQoaXRlbXMpOiAgIyBsZXhpY2FsIG9yZGVyCisgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaywgUU5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgayA9IGsudGV4dAorICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHYsIFFOYW1lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBxbmFtZXNbdi50ZXh0XQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IF9lc2NhcGVfYXR0cmliX2h0bWwodiwgZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgICMgRklYTUU6IGhhbmRsZSBib29sZWFuIGF0dHJpYnV0ZXMKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoIiAlcz1cIiVzXCIiICUgKHFuYW1lc1trXSwgdikpCisgICAgICAgICAgICB3cml0ZSgiPiIpCisgICAgICAgICAgICB0YWcgPSB0YWcubG93ZXIoKQorICAgICAgICAgICAgaWYgdGV4dDoKKyAgICAgICAgICAgICAgICBpZiB0YWcgPT0gInNjcmlwdCIgb3IgdGFnID09ICJzdHlsZSI6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKF9lbmNvZGUodGV4dCwgZW5jb2RpbmcpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKF9lc2NhcGVfY2RhdGEodGV4dCwgZW5jb2RpbmcpKQorICAgICAgICAgICAgZm9yIGUgaW4gZWxlbToKKyAgICAgICAgICAgICAgICBfc2VyaWFsaXplX2h0bWwod3JpdGUsIGUsIGVuY29kaW5nLCBxbmFtZXMsIE5vbmUpCisgICAgICAgICAgICBpZiB0YWcgbm90IGluIEhUTUxfRU1QVFk6CisgICAgICAgICAgICAgICAgd3JpdGUoIjwvIiArIHRhZyArICI+IikKKyAgICBpZiBlbGVtLnRhaWw6CisgICAgICAgIHdyaXRlKF9lc2NhcGVfY2RhdGEoZWxlbS50YWlsLCBlbmNvZGluZykpCisKK2RlZiBfc2VyaWFsaXplX3RleHQod3JpdGUsIGVsZW0sIGVuY29kaW5nKToKKyAgICBmb3IgcGFydCBpbiBlbGVtLml0ZXJ0ZXh0KCk6CisgICAgICAgIHdyaXRlKHBhcnQuZW5jb2RlKGVuY29kaW5nKSkKKyAgICBpZiBlbGVtLnRhaWw6CisgICAgICAgIHdyaXRlKGVsZW0udGFpbC5lbmNvZGUoZW5jb2RpbmcpKQorCitfc2VyaWFsaXplID0geworICAgICJ4bWwiOiBfc2VyaWFsaXplX3htbCwKKyAgICAiaHRtbCI6IF9zZXJpYWxpemVfaHRtbCwKKyAgICAidGV4dCI6IF9zZXJpYWxpemVfdGV4dCwKKyMgdGhpcyBvcHRpb25hbCBtZXRob2QgaXMgaW1wb3J0ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbW9kdWxlCisjICAgImMxNG4iOiBfc2VyaWFsaXplX2MxNG4sCit9CisKKyMjCisjIFJlZ2lzdGVycyBhIG5hbWVzcGFjZSBwcmVmaXguICBUaGUgcmVnaXN0cnkgaXMgZ2xvYmFsLCBhbmQgYW55CisjIGV4aXN0aW5nIG1hcHBpbmcgZm9yIGVpdGhlciB0aGUgZ2l2ZW4gcHJlZml4IG9yIHRoZSBuYW1lc3BhY2UgVVJJCisjIHdpbGwgYmUgcmVtb3ZlZC4KKyMKKyMgQHBhcmFtIHByZWZpeCBOYW1lc3BhY2UgcHJlZml4LgorIyBAcGFyYW0gdXJpIE5hbWVzcGFjZSB1cmkuICBUYWdzIGFuZCBhdHRyaWJ1dGVzIGluIHRoaXMgbmFtZXNwYWNlCisjICAgICB3aWxsIGJlIHNlcmlhbGl6ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJlZml4LCBpZiBhdCBhbGwgcG9zc2libGUuCisjIEBleGNlcHRpb24gVmFsdWVFcnJvciBJZiB0aGUgcHJlZml4IGlzIHJlc2VydmVkLCBvciBpcyBvdGhlcndpc2UKKyMgICAgIGludmFsaWQuCisKK2RlZiByZWdpc3Rlcl9uYW1lc3BhY2UocHJlZml4LCB1cmkpOgorICAgIGlmIHJlLm1hdGNoKCJuc1xkKyQiLCBwcmVmaXgpOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJQcmVmaXggZm9ybWF0IHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2UiKQorICAgIGZvciBrLCB2IGluIF9uYW1lc3BhY2VfbWFwLml0ZW1zKCk6CisgICAgICAgIGlmIGsgPT0gdXJpIG9yIHYgPT0gcHJlZml4OgorICAgICAgICAgICAgZGVsIF9uYW1lc3BhY2VfbWFwW2tdCisgICAgX25hbWVzcGFjZV9tYXBbdXJpXSA9IHByZWZpeAorCitfbmFtZXNwYWNlX21hcCA9IHsKKyAgICAjICJ3ZWxsLWtub3duIiBuYW1lc3BhY2UgcHJlZml4ZXMKKyAgICAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjogInhtbCIsCisgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOiAiaHRtbCIsCisgICAgImh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiOiAicmRmIiwKKyAgICAiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC8iOiAid3NkbCIsCisgICAgIyB4bWwgc2NoZW1hCisgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjogInhzIiwKKyAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOiAieHNpIiwKKyAgICAjIGR1YmxpbiBjb3JlCisgICAgImh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIjogImRjIiwKK30KKworZGVmIF9yYWlzZV9zZXJpYWxpemF0aW9uX2Vycm9yKHRleHQpOgorICAgIHJhaXNlIFR5cGVFcnJvcigKKyAgICAgICAgImNhbm5vdCBzZXJpYWxpemUgJXIgKHR5cGUgJXMpIiAlICh0ZXh0LCB0eXBlKHRleHQpLl9fbmFtZV9fKQorICAgICAgICApCisKK2RlZiBfZW5jb2RlKHRleHQsIGVuY29kaW5nKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiB0ZXh0LmVuY29kZShlbmNvZGluZywgInhtbGNoYXJyZWZyZXBsYWNlIikKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBfcmFpc2Vfc2VyaWFsaXphdGlvbl9lcnJvcih0ZXh0KQorCitkZWYgX2VzY2FwZV9jZGF0YSh0ZXh0LCBlbmNvZGluZyk6CisgICAgIyBlc2NhcGUgY2hhcmFjdGVyIGRhdGEKKyAgICB0cnk6CisgICAgICAgICMgaXQncyB3b3J0aCBhdm9pZGluZyBkby1ub3RoaW5nIGNhbGxzIGZvciBzdHJpbmdzIHRoYXQgYXJlCisgICAgICAgICMgc2hvcnRlciB0aGFuIDUwMCBjaGFyYWN0ZXIsIG9yIHNvLiAgYXNzdW1lIHRoYXQncywgYnkgZmFyLAorICAgICAgICAjIHRoZSBtb3N0IGNvbW1vbiBjYXNlIGluIG1vc3QgYXBwbGljYXRpb25zLgorICAgICAgICBpZiAiJiIgaW4gdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIiYiLCAiJmFtcDsiKQorICAgICAgICBpZiAiPCIgaW4gdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIjwiLCAiJmx0OyIpCisgICAgICAgIGlmICI+IiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiPiIsICImZ3Q7IikKKyAgICAgICAgcmV0dXJuIHRleHQuZW5jb2RlKGVuY29kaW5nLCAieG1sY2hhcnJlZnJlcGxhY2UiKQorICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIF9yYWlzZV9zZXJpYWxpemF0aW9uX2Vycm9yKHRleHQpCisKK2RlZiBfZXNjYXBlX2F0dHJpYih0ZXh0LCBlbmNvZGluZyk6CisgICAgIyBlc2NhcGUgYXR0cmlidXRlIHZhbHVlCisgICAgdHJ5OgorICAgICAgICBpZiAiJiIgaW4gdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIiYiLCAiJmFtcDsiKQorICAgICAgICBpZiAiPCIgaW4gdGV4dDoKKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoIjwiLCAiJmx0OyIpCisgICAgICAgIGlmICI+IiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiPiIsICImZ3Q7IikKKyAgICAgICAgaWYgIlwiIiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiXCIiLCAiJnF1b3Q7IikKKyAgICAgICAgaWYgIlxuIiBpbiB0ZXh0OgorICAgICAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgiXG4iLCAiJiMxMDsiKQorICAgICAgICByZXR1cm4gdGV4dC5lbmNvZGUoZW5jb2RpbmcsICJ4bWxjaGFycmVmcmVwbGFjZSIpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgX3JhaXNlX3NlcmlhbGl6YXRpb25fZXJyb3IodGV4dCkKKworZGVmIF9lc2NhcGVfYXR0cmliX2h0bWwodGV4dCwgZW5jb2RpbmcpOgorICAgICMgZXNjYXBlIGF0dHJpYnV0ZSB2YWx1ZQorICAgIHRyeToKKyAgICAgICAgaWYgIiYiIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCImIiwgIiZhbXA7IikKKyAgICAgICAgaWYgIj4iIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCI+IiwgIiZndDsiKQorICAgICAgICBpZiAiXCIiIGluIHRleHQ6CisgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCJcIiIsICImcXVvdDsiKQorICAgICAgICByZXR1cm4gdGV4dC5lbmNvZGUoZW5jb2RpbmcsICJ4bWxjaGFycmVmcmVwbGFjZSIpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKKyAgICAgICAgX3JhaXNlX3NlcmlhbGl6YXRpb25fZXJyb3IodGV4dCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4gWE1MIGVsZW1lbnQsIGluY2x1ZGluZyBhbGwKKyMgc3ViZWxlbWVudHMuCisjCisjIEBwYXJhbSBlbGVtZW50IEFuIEVsZW1lbnQgaW5zdGFuY2UuCisjIEBrZXlwYXJhbSBlbmNvZGluZyBPcHRpb25hbCBvdXRwdXQgZW5jb2RpbmcgKGRlZmF1bHQgaXMgVVMtQVNDSUkpLgorIyBAa2V5cGFyYW0gbWV0aG9kIE9wdGlvbmFsIG91dHB1dCBtZXRob2QgKCJ4bWwiLCAiaHRtbCIsICJ0ZXh0IiBvcgorIyAgICAgImMxNG4iOyBkZWZhdWx0IGlzICJ4bWwiKS4KKyMgQHJldHVybiBBbiBlbmNvZGVkIHN0cmluZyBjb250YWluaW5nIHRoZSBYTUwgZGF0YS4KKyMgQGRlZnJldHVybiBzdHJpbmcKKworZGVmIHRvc3RyaW5nKGVsZW1lbnQsIGVuY29kaW5nPU5vbmUsIG1ldGhvZD1Ob25lKToKKyAgICBjbGFzcyBkdW1teToKKyAgICAgICAgcGFzcworICAgIGRhdGEgPSBbXQorICAgIGZpbGUgPSBkdW1teSgpCisgICAgZmlsZS53cml0ZSA9IGRhdGEuYXBwZW5kCisgICAgRWxlbWVudFRyZWUoZWxlbWVudCkud3JpdGUoZmlsZSwgZW5jb2RpbmcsIG1ldGhvZD1tZXRob2QpCisgICAgcmV0dXJuICIiLmpvaW4oZGF0YSkKKworIyMKKyMgR2VuZXJhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIFhNTCBlbGVtZW50LCBpbmNsdWRpbmcgYWxsCisjIHN1YmVsZW1lbnRzLiAgVGhlIHN0cmluZyBpcyByZXR1cm5lZCBhcyBhIHNlcXVlbmNlIG9mIHN0cmluZyBmcmFnbWVudHMuCisjCisjIEBwYXJhbSBlbGVtZW50IEFuIEVsZW1lbnQgaW5zdGFuY2UuCisjIEBrZXlwYXJhbSBlbmNvZGluZyBPcHRpb25hbCBvdXRwdXQgZW5jb2RpbmcgKGRlZmF1bHQgaXMgVVMtQVNDSUkpLgorIyBAa2V5cGFyYW0gbWV0aG9kIE9wdGlvbmFsIG91dHB1dCBtZXRob2QgKCJ4bWwiLCAiaHRtbCIsICJ0ZXh0IiBvcgorIyAgICAgImMxNG4iOyBkZWZhdWx0IGlzICJ4bWwiKS4KKyMgQHJldHVybiBBIHNlcXVlbmNlIG9iamVjdCBjb250YWluaW5nIHRoZSBYTUwgZGF0YS4KKyMgQGRlZnJldHVybiBzZXF1ZW5jZQorIyBAc2luY2UgMS4zCisKK2RlZiB0b3N0cmluZ2xpc3QoZWxlbWVudCwgZW5jb2Rpbmc9Tm9uZSwgbWV0aG9kPU5vbmUpOgorICAgIGNsYXNzIGR1bW15OgorICAgICAgICBwYXNzCisgICAgZGF0YSA9IFtdCisgICAgZmlsZSA9IGR1bW15KCkKKyAgICBmaWxlLndyaXRlID0gZGF0YS5hcHBlbmQKKyAgICBFbGVtZW50VHJlZShlbGVtZW50KS53cml0ZShmaWxlLCBlbmNvZGluZywgbWV0aG9kPW1ldGhvZCkKKyAgICAjIEZJWE1FOiBtZXJnZSBzbWFsbCBmcmFnbWVudHMgaW50byBsYXJnZXIgcGFydHMKKyAgICByZXR1cm4gZGF0YQorCisjIworIyBXcml0ZXMgYW4gZWxlbWVudCB0cmVlIG9yIGVsZW1lbnQgc3RydWN0dXJlIHRvIHN5cy5zdGRvdXQuICBUaGlzCisjIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKyMgPHA+CisjIFRoZSBleGFjdCBvdXRwdXQgZm9ybWF0IGlzIGltcGxlbWVudGF0aW9uIGRlcGVuZGVudC4gIEluIHRoaXMKKyMgdmVyc2lvbiwgaXQncyB3cml0dGVuIGFzIGFuIG9yZGluYXJ5IFhNTCBmaWxlLgorIworIyBAcGFyYW0gZWxlbSBBbiBlbGVtZW50IHRyZWUgb3IgYW4gaW5kaXZpZHVhbCBlbGVtZW50LgorCitkZWYgZHVtcChlbGVtKToKKyAgICAjIGRlYnVnZ2luZworICAgIGlmIG5vdCBpc2luc3RhbmNlKGVsZW0sIEVsZW1lbnRUcmVlKToKKyAgICAgICAgZWxlbSA9IEVsZW1lbnRUcmVlKGVsZW0pCisgICAgZWxlbS53cml0ZShzeXMuc3Rkb3V0KQorICAgIHRhaWwgPSBlbGVtLmdldHJvb3QoKS50YWlsCisgICAgaWYgbm90IHRhaWwgb3IgdGFpbFstMV0gIT0gIlxuIjoKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZSgiXG4iKQorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHBhcnNpbmcKKworIyMKKyMgUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBpbnRvIGFuIGVsZW1lbnQgdHJlZS4KKyMKKyMgQHBhcmFtIHNvdXJjZSBBIGZpbGVuYW1lIG9yIGZpbGUgb2JqZWN0IGNvbnRhaW5pbmcgWE1MIGRhdGEuCisjIEBwYXJhbSBwYXJzZXIgQW4gb3B0aW9uYWwgcGFyc2VyIGluc3RhbmNlLiAgSWYgbm90IGdpdmVuLCB0aGUKKyMgICAgIHN0YW5kYXJkIHtAbGluayBYTUxQYXJzZXJ9IHBhcnNlciBpcyB1c2VkLgorIyBAcmV0dXJuIEFuIEVsZW1lbnRUcmVlIGluc3RhbmNlCisKK2RlZiBwYXJzZShzb3VyY2UsIHBhcnNlcj1Ob25lKToKKyAgICB0cmVlID0gRWxlbWVudFRyZWUoKQorICAgIHRyZWUucGFyc2Uoc291cmNlLCBwYXJzZXIpCisgICAgcmV0dXJuIHRyZWUKKworIyMKKyMgUGFyc2VzIGFuIFhNTCBkb2N1bWVudCBpbnRvIGFuIGVsZW1lbnQgdHJlZSBpbmNyZW1lbnRhbGx5LCBhbmQgcmVwb3J0cworIyB3aGF0J3MgZ29pbmcgb24gdG8gdGhlIHVzZXIuCisjCisjIEBwYXJhbSBzb3VyY2UgQSBmaWxlbmFtZSBvciBmaWxlIG9iamVjdCBjb250YWluaW5nIFhNTCBkYXRhLgorIyBAcGFyYW0gZXZlbnRzIEEgbGlzdCBvZiBldmVudHMgdG8gcmVwb3J0IGJhY2suICBJZiBvbWl0dGVkLCBvbmx5ICJlbmQiCisjICAgICBldmVudHMgYXJlIHJlcG9ydGVkLgorIyBAcGFyYW0gcGFyc2VyIEFuIG9wdGlvbmFsIHBhcnNlciBpbnN0YW5jZS4gIElmIG5vdCBnaXZlbiwgdGhlCisjICAgICBzdGFuZGFyZCB7QGxpbmsgWE1MUGFyc2VyfSBwYXJzZXIgaXMgdXNlZC4KKyMgQHJldHVybiBBIChldmVudCwgZWxlbSkgaXRlcmF0b3IuCisKK2RlZiBpdGVycGFyc2Uoc291cmNlLCBldmVudHM9Tm9uZSwgcGFyc2VyPU5vbmUpOgorICAgIGNsb3NlX3NvdXJjZSA9IEZhbHNlCisgICAgaWYgbm90IGhhc2F0dHIoc291cmNlLCAicmVhZCIpOgorICAgICAgICBzb3VyY2UgPSBvcGVuKHNvdXJjZSwgInJiIikKKyAgICAgICAgY2xvc2Vfc291cmNlID0gVHJ1ZQorICAgIGlmIG5vdCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IFhNTFBhcnNlcih0YXJnZXQ9VHJlZUJ1aWxkZXIoKSkKKyAgICByZXR1cm4gX0l0ZXJQYXJzZUl0ZXJhdG9yKHNvdXJjZSwgZXZlbnRzLCBwYXJzZXIsIGNsb3NlX3NvdXJjZSkKKworY2xhc3MgX0l0ZXJQYXJzZUl0ZXJhdG9yKG9iamVjdCk6CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc291cmNlLCBldmVudHMsIHBhcnNlciwgY2xvc2Vfc291cmNlPUZhbHNlKToKKyAgICAgICAgc2VsZi5fZmlsZSA9IHNvdXJjZQorICAgICAgICBzZWxmLl9jbG9zZV9maWxlID0gY2xvc2Vfc291cmNlCisgICAgICAgIHNlbGYuX2V2ZW50cyA9IFtdCisgICAgICAgIHNlbGYuX2luZGV4ID0gMAorICAgICAgICBzZWxmLl9lcnJvciA9IE5vbmUKKyAgICAgICAgc2VsZi5yb290ID0gc2VsZi5fcm9vdCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcGFyc2VyID0gcGFyc2VyCisgICAgICAgICMgd2lyZSB1cCB0aGUgcGFyc2VyIGZvciBldmVudCByZXBvcnRpbmcKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fcGFyc2VyLl9wYXJzZXIKKyAgICAgICAgYXBwZW5kID0gc2VsZi5fZXZlbnRzLmFwcGVuZAorICAgICAgICBpZiBldmVudHMgaXMgTm9uZToKKyAgICAgICAgICAgIGV2ZW50cyA9IFsiZW5kIl0KKyAgICAgICAgZm9yIGV2ZW50IGluIGV2ZW50czoKKyAgICAgICAgICAgIGlmIGV2ZW50ID09ICJzdGFydCI6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBwYXJzZXIub3JkZXJlZF9hdHRyaWJ1dGVzID0gMQorICAgICAgICAgICAgICAgICAgICBwYXJzZXIuc3BlY2lmaWVkX2F0dHJpYnV0ZXMgPSAxCisgICAgICAgICAgICAgICAgICAgIGRlZiBoYW5kbGVyKHRhZywgYXR0cmliX2luLCBldmVudD1ldmVudCwgYXBwZW5kPWFwcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ9c2VsZi5fcGFyc2VyLl9zdGFydF9saXN0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgoZXZlbnQsIHN0YXJ0KHRhZywgYXR0cmliX2luKSkpCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gaGFuZGxlcgorICAgICAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgZGVmIGhhbmRsZXIodGFnLCBhdHRyaWJfaW4sIGV2ZW50PWV2ZW50LCBhcHBlbmQ9YXBwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydD1zZWxmLl9wYXJzZXIuX3N0YXJ0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgoZXZlbnQsIHN0YXJ0KHRhZywgYXR0cmliX2luKSkpCisgICAgICAgICAgICAgICAgICAgIHBhcnNlci5TdGFydEVsZW1lbnRIYW5kbGVyID0gaGFuZGxlcgorICAgICAgICAgICAgZWxpZiBldmVudCA9PSAiZW5kIjoKKyAgICAgICAgICAgICAgICBkZWYgaGFuZGxlcih0YWcsIGV2ZW50PWV2ZW50LCBhcHBlbmQ9YXBwZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZD1zZWxmLl9wYXJzZXIuX2VuZCk6CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgoZXZlbnQsIGVuZCh0YWcpKSkKKyAgICAgICAgICAgICAgICBwYXJzZXIuRW5kRWxlbWVudEhhbmRsZXIgPSBoYW5kbGVyCisgICAgICAgICAgICBlbGlmIGV2ZW50ID09ICJzdGFydC1ucyI6CisgICAgICAgICAgICAgICAgZGVmIGhhbmRsZXIocHJlZml4LCB1cmksIGV2ZW50PWV2ZW50LCBhcHBlbmQ9YXBwZW5kKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdXJpID0gKHVyaSBvciAiIikuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGFwcGVuZCgoZXZlbnQsIChwcmVmaXggb3IgIiIsIHVyaSBvciAiIikpKQorICAgICAgICAgICAgICAgIHBhcnNlci5TdGFydE5hbWVzcGFjZURlY2xIYW5kbGVyID0gaGFuZGxlcgorICAgICAgICAgICAgZWxpZiBldmVudCA9PSAiZW5kLW5zIjoKKyAgICAgICAgICAgICAgICBkZWYgaGFuZGxlcihwcmVmaXgsIGV2ZW50PWV2ZW50LCBhcHBlbmQ9YXBwZW5kKToKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kKChldmVudCwgTm9uZSkpCisgICAgICAgICAgICAgICAgcGFyc2VyLkVuZE5hbWVzcGFjZURlY2xIYW5kbGVyID0gaGFuZGxlcgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJ1bmtub3duIGV2ZW50ICVyIiAlIGV2ZW50KQorCisgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYuX2V2ZW50c1tzZWxmLl9pbmRleF0KKyAgICAgICAgICAgICAgICBzZWxmLl9pbmRleCArPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0KKyAgICAgICAgICAgIGV4Y2VwdCBJbmRleEVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIHNlbGYuX2Vycm9yOgorICAgICAgICAgICAgICAgIGUgPSBzZWxmLl9lcnJvcgorICAgICAgICAgICAgICAgIHNlbGYuX2Vycm9yID0gTm9uZQorICAgICAgICAgICAgICAgIHJhaXNlIGUKKyAgICAgICAgICAgIGlmIHNlbGYuX3BhcnNlciBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucm9vdCA9IHNlbGYuX3Jvb3QKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9jbG9zZV9maWxlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9maWxlLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAjIGxvYWQgZXZlbnQgYnVmZmVyCisgICAgICAgICAgICBkZWwgc2VsZi5fZXZlbnRzWzpdCisgICAgICAgICAgICBzZWxmLl9pbmRleCA9IDAKKyAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9maWxlLnJlYWQoMTYzODQpCisgICAgICAgICAgICBpZiBkYXRhOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcGFyc2VyLmZlZWQoZGF0YSkKKyAgICAgICAgICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgZXhjOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9lcnJvciA9IGV4YworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9yb290ID0gc2VsZi5fcGFyc2VyLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9wYXJzZXIgPSBOb25lCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyMjCisjIFBhcnNlcyBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHN0cmluZyBjb25zdGFudC4gIFRoaXMgZnVuY3Rpb24gY2FuCisjIGJlIHVzZWQgdG8gZW1iZWQgIlhNTCBsaXRlcmFscyIgaW4gUHl0aG9uIGNvZGUuCisjCisjIEBwYXJhbSBzb3VyY2UgQSBzdHJpbmcgY29udGFpbmluZyBYTUwgZGF0YS4KKyMgQHBhcmFtIHBhcnNlciBBbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQorIyAgICAgc3RhbmRhcmQge0BsaW5rIFhNTFBhcnNlcn0gcGFyc2VyIGlzIHVzZWQuCisjIEByZXR1cm4gQW4gRWxlbWVudCBpbnN0YW5jZS4KKyMgQGRlZnJldHVybiBFbGVtZW50CisKK2RlZiBYTUwodGV4dCwgcGFyc2VyPU5vbmUpOgorICAgIGlmIG5vdCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IFhNTFBhcnNlcih0YXJnZXQ9VHJlZUJ1aWxkZXIoKSkKKyAgICBwYXJzZXIuZmVlZCh0ZXh0KQorICAgIHJldHVybiBwYXJzZXIuY2xvc2UoKQorCisjIworIyBQYXJzZXMgYW4gWE1MIGRvY3VtZW50IGZyb20gYSBzdHJpbmcgY29uc3RhbnQsIGFuZCBhbHNvIHJldHVybnMKKyMgYSBkaWN0aW9uYXJ5IHdoaWNoIG1hcHMgZnJvbSBlbGVtZW50IGlkOnMgdG8gZWxlbWVudHMuCisjCisjIEBwYXJhbSBzb3VyY2UgQSBzdHJpbmcgY29udGFpbmluZyBYTUwgZGF0YS4KKyMgQHBhcmFtIHBhcnNlciBBbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQorIyAgICAgc3RhbmRhcmQge0BsaW5rIFhNTFBhcnNlcn0gcGFyc2VyIGlzIHVzZWQuCisjIEByZXR1cm4gQSB0dXBsZSBjb250YWluaW5nIGFuIEVsZW1lbnQgaW5zdGFuY2UgYW5kIGEgZGljdGlvbmFyeS4KKyMgQGRlZnJldHVybiAoRWxlbWVudCwgZGljdGlvbmFyeSkKKworZGVmIFhNTElEKHRleHQsIHBhcnNlcj1Ob25lKToKKyAgICBpZiBub3QgcGFyc2VyOgorICAgICAgICBwYXJzZXIgPSBYTUxQYXJzZXIodGFyZ2V0PVRyZWVCdWlsZGVyKCkpCisgICAgcGFyc2VyLmZlZWQodGV4dCkKKyAgICB0cmVlID0gcGFyc2VyLmNsb3NlKCkKKyAgICBpZHMgPSB7fQorICAgIGZvciBlbGVtIGluIHRyZWUuaXRlcigpOgorICAgICAgICBpZCA9IGVsZW0uZ2V0KCJpZCIpCisgICAgICAgIGlmIGlkOgorICAgICAgICAgICAgaWRzW2lkXSA9IGVsZW0KKyAgICByZXR1cm4gdHJlZSwgaWRzCisKKyMjCisjIFBhcnNlcyBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHN0cmluZyBjb25zdGFudC4gIFNhbWUgYXMge0BsaW5rICNYTUx9LgorIworIyBAZGVmIGZyb21zdHJpbmcodGV4dCkKKyMgQHBhcmFtIHNvdXJjZSBBIHN0cmluZyBjb250YWluaW5nIFhNTCBkYXRhLgorIyBAcmV0dXJuIEFuIEVsZW1lbnQgaW5zdGFuY2UuCisjIEBkZWZyZXR1cm4gRWxlbWVudAorCitmcm9tc3RyaW5nID0gWE1MCisKKyMjCisjIFBhcnNlcyBhbiBYTUwgZG9jdW1lbnQgZnJvbSBhIHNlcXVlbmNlIG9mIHN0cmluZyBmcmFnbWVudHMuCisjCisjIEBwYXJhbSBzZXF1ZW5jZSBBIGxpc3Qgb3Igb3RoZXIgc2VxdWVuY2UgY29udGFpbmluZyBYTUwgZGF0YSBmcmFnbWVudHMuCisjIEBwYXJhbSBwYXJzZXIgQW4gb3B0aW9uYWwgcGFyc2VyIGluc3RhbmNlLiAgSWYgbm90IGdpdmVuLCB0aGUKKyMgICAgIHN0YW5kYXJkIHtAbGluayBYTUxQYXJzZXJ9IHBhcnNlciBpcyB1c2VkLgorIyBAcmV0dXJuIEFuIEVsZW1lbnQgaW5zdGFuY2UuCisjIEBkZWZyZXR1cm4gRWxlbWVudAorIyBAc2luY2UgMS4zCisKK2RlZiBmcm9tc3RyaW5nbGlzdChzZXF1ZW5jZSwgcGFyc2VyPU5vbmUpOgorICAgIGlmIG5vdCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IFhNTFBhcnNlcih0YXJnZXQ9VHJlZUJ1aWxkZXIoKSkKKyAgICBmb3IgdGV4dCBpbiBzZXF1ZW5jZToKKyAgICAgICAgcGFyc2VyLmZlZWQodGV4dCkKKyAgICByZXR1cm4gcGFyc2VyLmNsb3NlKCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIworIyBHZW5lcmljIGVsZW1lbnQgc3RydWN0dXJlIGJ1aWxkZXIuICBUaGlzIGJ1aWxkZXIgY29udmVydHMgYSBzZXF1ZW5jZQorIyBvZiB7QGxpbmsgI1RyZWVCdWlsZGVyLnN0YXJ0fSwge0BsaW5rICNUcmVlQnVpbGRlci5kYXRhfSwgYW5kIHtAbGluaworIyAjVHJlZUJ1aWxkZXIuZW5kfSBtZXRob2QgY2FsbHMgdG8gYSB3ZWxsLWZvcm1lZCBlbGVtZW50IHN0cnVjdHVyZS4KKyMgPHA+CisjIFlvdSBjYW4gdXNlIHRoaXMgY2xhc3MgdG8gYnVpbGQgYW4gZWxlbWVudCBzdHJ1Y3R1cmUgdXNpbmcgYSBjdXN0b20gWE1MCisjIHBhcnNlciwgb3IgYSBwYXJzZXIgZm9yIHNvbWUgb3RoZXIgWE1MLWxpa2UgZm9ybWF0LgorIworIyBAcGFyYW0gZWxlbWVudF9mYWN0b3J5IE9wdGlvbmFsIGVsZW1lbnQgZmFjdG9yeS4gIFRoaXMgZmFjdG9yeQorIyAgICBpcyBjYWxsZWQgdG8gY3JlYXRlIG5ldyBFbGVtZW50IGluc3RhbmNlcywgYXMgbmVjZXNzYXJ5LgorCitjbGFzcyBUcmVlQnVpbGRlcihvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVsZW1lbnRfZmFjdG9yeT1Ob25lKToKKyAgICAgICAgc2VsZi5fZGF0YSA9IFtdICMgZGF0YSBjb2xsZWN0b3IKKyAgICAgICAgc2VsZi5fZWxlbSA9IFtdICMgZWxlbWVudCBzdGFjaworICAgICAgICBzZWxmLl9sYXN0ID0gTm9uZSAjIGxhc3QgZWxlbWVudAorICAgICAgICBzZWxmLl90YWlsID0gTm9uZSAjIHRydWUgaWYgd2UncmUgYWZ0ZXIgYW4gZW5kIHRhZworICAgICAgICBpZiBlbGVtZW50X2ZhY3RvcnkgaXMgTm9uZToKKyAgICAgICAgICAgIGVsZW1lbnRfZmFjdG9yeSA9IEVsZW1lbnQKKyAgICAgICAgc2VsZi5fZmFjdG9yeSA9IGVsZW1lbnRfZmFjdG9yeQorCisgICAgIyMKKyAgICAjIEZsdXNoZXMgdGhlIGJ1aWxkZXIgYnVmZmVycywgYW5kIHJldHVybnMgdGhlIHRvcGxldmVsIGRvY3VtZW50CisgICAgIyBlbGVtZW50LgorICAgICMKKyAgICAjIEByZXR1cm4gQW4gRWxlbWVudCBpbnN0YW5jZS4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBhc3NlcnQgbGVuKHNlbGYuX2VsZW0pID09IDAsICJtaXNzaW5nIGVuZCB0YWdzIgorICAgICAgICBhc3NlcnQgc2VsZi5fbGFzdCBpcyBub3QgTm9uZSwgIm1pc3NpbmcgdG9wbGV2ZWwgZWxlbWVudCIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xhc3QKKworICAgIGRlZiBfZmx1c2goc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2RhdGE6CisgICAgICAgICAgICBpZiBzZWxmLl9sYXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHRleHQgPSAiIi5qb2luKHNlbGYuX2RhdGEpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fdGFpbDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuX2xhc3QudGFpbCBpcyBOb25lLCAiaW50ZXJuYWwgZXJyb3IgKHRhaWwpIgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0LnRhaWwgPSB0ZXh0CisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0IHNlbGYuX2xhc3QudGV4dCBpcyBOb25lLCAiaW50ZXJuYWwgZXJyb3IgKHRleHQpIgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0LnRleHQgPSB0ZXh0CisgICAgICAgICAgICBzZWxmLl9kYXRhID0gW10KKworICAgICMjCisgICAgIyBBZGRzIHRleHQgdG8gdGhlIGN1cnJlbnQgZWxlbWVudC4KKyAgICAjCisgICAgIyBAcGFyYW0gZGF0YSBBIHN0cmluZy4gIFRoaXMgc2hvdWxkIGJlIGVpdGhlciBhbiA4LWJpdCBzdHJpbmcKKyAgICAjICAgIGNvbnRhaW5pbmcgQVNDSUkgdGV4dCwgb3IgYSBVbmljb2RlIHN0cmluZy4KKworICAgIGRlZiBkYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9kYXRhLmFwcGVuZChkYXRhKQorCisgICAgIyMKKyAgICAjIE9wZW5zIGEgbmV3IGVsZW1lbnQuCisgICAgIworICAgICMgQHBhcmFtIHRhZyBUaGUgZWxlbWVudCBuYW1lLgorICAgICMgQHBhcmFtIGF0dHJpYiBBIGRpY3Rpb25hcnkgY29udGFpbmluZyBlbGVtZW50IGF0dHJpYnV0ZXMuCisgICAgIyBAcmV0dXJuIFRoZSBvcGVuZWQgZWxlbWVudC4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudAorCisgICAgZGVmIHN0YXJ0KHNlbGYsIHRhZywgYXR0cnMpOgorICAgICAgICBzZWxmLl9mbHVzaCgpCisgICAgICAgIHNlbGYuX2xhc3QgPSBlbGVtID0gc2VsZi5fZmFjdG9yeSh0YWcsIGF0dHJzKQorICAgICAgICBpZiBzZWxmLl9lbGVtOgorICAgICAgICAgICAgc2VsZi5fZWxlbVstMV0uYXBwZW5kKGVsZW0pCisgICAgICAgIHNlbGYuX2VsZW0uYXBwZW5kKGVsZW0pCisgICAgICAgIHNlbGYuX3RhaWwgPSAwCisgICAgICAgIHJldHVybiBlbGVtCisKKyAgICAjIworICAgICMgQ2xvc2VzIHRoZSBjdXJyZW50IGVsZW1lbnQuCisgICAgIworICAgICMgQHBhcmFtIHRhZyBUaGUgZWxlbWVudCBuYW1lLgorICAgICMgQHJldHVybiBUaGUgY2xvc2VkIGVsZW1lbnQuCisgICAgIyBAZGVmcmV0dXJuIEVsZW1lbnQKKworICAgIGRlZiBlbmQoc2VsZiwgdGFnKToKKyAgICAgICAgc2VsZi5fZmx1c2goKQorICAgICAgICBzZWxmLl9sYXN0ID0gc2VsZi5fZWxlbS5wb3AoKQorICAgICAgICBhc3NlcnQgc2VsZi5fbGFzdC50YWcgPT0gdGFnLFwKKyAgICAgICAgICAgICAgICJlbmQgdGFnIG1pc21hdGNoIChleHBlY3RlZCAlcywgZ290ICVzKSIgJSAoCisgICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdC50YWcsIHRhZykKKyAgICAgICAgc2VsZi5fdGFpbCA9IDEKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xhc3QKKworIyMKKyMgRWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlciBmb3IgWE1MIHNvdXJjZSBkYXRhLCBiYXNlZCBvbiB0aGUKKyMgPGI+ZXhwYXQ8L2I+IHBhcnNlci4KKyMKKyMgQGtleXBhcmFtIHRhcmdldCBUYXJnZXQgb2JqZWN0LiAgSWYgb21pdHRlZCwgdGhlIGJ1aWxkZXIgdXNlcyBhbgorIyAgICAgaW5zdGFuY2Ugb2YgdGhlIHN0YW5kYXJkIHtAbGluayAjVHJlZUJ1aWxkZXJ9IGNsYXNzLgorIyBAa2V5cGFyYW0gaHRtbCBQcmVkZWZpbmUgSFRNTCBlbnRpdGllcy4gIFRoaXMgZmxhZyBpcyBub3Qgc3VwcG9ydGVkCisjICAgICBieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KKyMgQGtleXBhcmFtIGVuY29kaW5nIE9wdGlvbmFsIGVuY29kaW5nLiAgSWYgZ2l2ZW4sIHRoZSB2YWx1ZSBvdmVycmlkZXMKKyMgICAgIHRoZSBlbmNvZGluZyBzcGVjaWZpZWQgaW4gdGhlIFhNTCBmaWxlLgorIyBAc2VlICNFbGVtZW50VHJlZQorIyBAc2VlICNUcmVlQnVpbGRlcgorCitjbGFzcyBYTUxQYXJzZXIob2JqZWN0KToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBodG1sPTAsIHRhcmdldD1Ob25lLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGltcG9ydCBweWV4cGF0IGFzIGV4cGF0CisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJObyBtb2R1bGUgbmFtZWQgZXhwYXQ7IHVzZSBTaW1wbGVYTUxUcmVlQnVpbGRlciBpbnN0ZWFkIgorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgIHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShlbmNvZGluZywgIn0iKQorICAgICAgICBpZiB0YXJnZXQgaXMgTm9uZToKKyAgICAgICAgICAgIHRhcmdldCA9IFRyZWVCdWlsZGVyKCkKKyAgICAgICAgIyB1bmRlcnNjb3JlZCBuYW1lcyBhcmUgcHJvdmlkZWQgZm9yIGNvbXBhdGliaWxpdHkgb25seQorICAgICAgICBzZWxmLnBhcnNlciA9IHNlbGYuX3BhcnNlciA9IHBhcnNlcgorICAgICAgICBzZWxmLnRhcmdldCA9IHNlbGYuX3RhcmdldCA9IHRhcmdldAorICAgICAgICBzZWxmLl9lcnJvciA9IGV4cGF0LmVycm9yCisgICAgICAgIHNlbGYuX25hbWVzID0ge30gIyBuYW1lIG1lbW8gY2FjaGUKKyAgICAgICAgIyBjYWxsYmFja3MKKyAgICAgICAgcGFyc2VyLkRlZmF1bHRIYW5kbGVyRXhwYW5kID0gc2VsZi5fZGVmYXVsdAorICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuX3N0YXJ0CisgICAgICAgIHBhcnNlci5FbmRFbGVtZW50SGFuZGxlciA9IHNlbGYuX2VuZAorICAgICAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBzZWxmLl9kYXRhCisgICAgICAgICMgb3B0aW9uYWwgY2FsbGJhY2tzCisgICAgICAgIHBhcnNlci5Db21tZW50SGFuZGxlciA9IHNlbGYuX2NvbW1lbnQKKyAgICAgICAgcGFyc2VyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBzZWxmLl9waQorICAgICAgICAjIGxldCBleHBhdCBkbyB0aGUgYnVmZmVyaW5nLCBpZiBzdXBwb3J0ZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLmJ1ZmZlcl90ZXh0ID0gMQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgICMgdXNlIG5ldy1zdHlsZSBhdHRyaWJ1dGUgaGFuZGxpbmcsIGlmIHN1cHBvcnRlZAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIub3JkZXJlZF9hdHRyaWJ1dGVzID0gMQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLnNwZWNpZmllZF9hdHRyaWJ1dGVzID0gMQorICAgICAgICAgICAgcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLl9zdGFydF9saXN0CisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fZG9jdHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5lbnRpdHkgPSB7fQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnZlcnNpb24gPSAiRXhwYXQgJWQuJWQuJWQiICUgZXhwYXQudmVyc2lvbl9pbmZvCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyB1bmtub3duCisKKyAgICBkZWYgX3JhaXNlZXJyb3Ioc2VsZiwgdmFsdWUpOgorICAgICAgICBlcnIgPSBQYXJzZUVycm9yKHZhbHVlKQorICAgICAgICBlcnIuY29kZSA9IHZhbHVlLmNvZGUKKyAgICAgICAgZXJyLnBvc2l0aW9uID0gdmFsdWUubGluZW5vLCB2YWx1ZS5vZmZzZXQKKyAgICAgICAgcmFpc2UgZXJyCisKKyAgICBkZWYgX2ZpeHRleHQoc2VsZiwgdGV4dCk6CisgICAgICAgICMgY29udmVydCB0ZXh0IHN0cmluZyB0byBhc2NpaSwgaWYgcG9zc2libGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHRleHQuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gdGV4dAorCisgICAgZGVmIF9maXhuYW1lKHNlbGYsIGtleSk6CisgICAgICAgICMgZXhwYW5kIHFuYW1lLCBhbmQgY29udmVydCBuYW1lIHN0cmluZyB0byBhc2NpaSwgaWYgcG9zc2libGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbmFtZSA9IHNlbGYuX25hbWVzW2tleV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgbmFtZSA9IGtleQorICAgICAgICAgICAgaWYgIn0iIGluIG5hbWU6CisgICAgICAgICAgICAgICAgbmFtZSA9ICJ7IiArIG5hbWUKKyAgICAgICAgICAgIHNlbGYuX25hbWVzW2tleV0gPSBuYW1lID0gc2VsZi5fZml4dGV4dChuYW1lKQorICAgICAgICByZXR1cm4gbmFtZQorCisgICAgZGVmIF9zdGFydChzZWxmLCB0YWcsIGF0dHJpYl9pbik6CisgICAgICAgIGZpeG5hbWUgPSBzZWxmLl9maXhuYW1lCisgICAgICAgIGZpeHRleHQgPSBzZWxmLl9maXh0ZXh0CisgICAgICAgIHRhZyA9IGZpeG5hbWUodGFnKQorICAgICAgICBhdHRyaWIgPSB7fQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBhdHRyaWJfaW4uaXRlbXMoKToKKyAgICAgICAgICAgIGF0dHJpYltmaXhuYW1lKGtleSldID0gZml4dGV4dCh2YWx1ZSkKKyAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0LnN0YXJ0KHRhZywgYXR0cmliKQorCisgICAgZGVmIF9zdGFydF9saXN0KHNlbGYsIHRhZywgYXR0cmliX2luKToKKyAgICAgICAgZml4bmFtZSA9IHNlbGYuX2ZpeG5hbWUKKyAgICAgICAgZml4dGV4dCA9IHNlbGYuX2ZpeHRleHQKKyAgICAgICAgdGFnID0gZml4bmFtZSh0YWcpCisgICAgICAgIGF0dHJpYiA9IHt9CisgICAgICAgIGlmIGF0dHJpYl9pbjoKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihhdHRyaWJfaW4pLCAyKToKKyAgICAgICAgICAgICAgICBhdHRyaWJbZml4bmFtZShhdHRyaWJfaW5baV0pXSA9IGZpeHRleHQoYXR0cmliX2luW2krMV0pCisgICAgICAgIHJldHVybiBzZWxmLnRhcmdldC5zdGFydCh0YWcsIGF0dHJpYikKKworICAgIGRlZiBfZGF0YShzZWxmLCB0ZXh0KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGFyZ2V0LmRhdGEoc2VsZi5fZml4dGV4dCh0ZXh0KSkKKworICAgIGRlZiBfZW5kKHNlbGYsIHRhZyk6CisgICAgICAgIHJldHVybiBzZWxmLnRhcmdldC5lbmQoc2VsZi5fZml4bmFtZSh0YWcpKQorCisgICAgZGVmIF9jb21tZW50KHNlbGYsIGRhdGEpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb21tZW50ID0gc2VsZi50YXJnZXQuY29tbWVudAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gY29tbWVudChzZWxmLl9maXh0ZXh0KGRhdGEpKQorCisgICAgZGVmIF9waShzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaSA9IHNlbGYudGFyZ2V0LnBpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBwaShzZWxmLl9maXh0ZXh0KHRhcmdldCksIHNlbGYuX2ZpeHRleHQoZGF0YSkpCisKKyAgICBkZWYgX2RlZmF1bHQoc2VsZiwgdGV4dCk6CisgICAgICAgIHByZWZpeCA9IHRleHRbOjFdCisgICAgICAgIGlmIHByZWZpeCA9PSAiJiI6CisgICAgICAgICAgICAjIGRlYWwgd2l0aCB1bmRlZmluZWQgZW50aXRpZXMKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRhcmdldC5kYXRhKHNlbGYuZW50aXR5W3RleHRbMTotMV1dKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIGZyb20geG1sLnBhcnNlcnMgaW1wb3J0IGV4cGF0CisgICAgICAgICAgICAgICAgZXJyID0gZXhwYXQuZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJ1bmRlZmluZWQgZW50aXR5ICVzOiBsaW5lICVkLCBjb2x1bW4gJWQiICUKKyAgICAgICAgICAgICAgICAgICAgKHRleHQsIHNlbGYuX3BhcnNlci5FcnJvckxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcnNlci5FcnJvckNvbHVtbk51bWJlcikKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGVyci5jb2RlID0gMTEgIyBYTUxfRVJST1JfVU5ERUZJTkVEX0VOVElUWQorICAgICAgICAgICAgICAgIGVyci5saW5lbm8gPSBzZWxmLl9wYXJzZXIuRXJyb3JMaW5lTnVtYmVyCisgICAgICAgICAgICAgICAgZXJyLm9mZnNldCA9IHNlbGYuX3BhcnNlci5FcnJvckNvbHVtbk51bWJlcgorICAgICAgICAgICAgICAgIHJhaXNlIGVycgorICAgICAgICBlbGlmIHByZWZpeCA9PSAiPCIgYW5kIHRleHRbOjldID09ICI8IURPQ1RZUEUiOgorICAgICAgICAgICAgc2VsZi5fZG9jdHlwZSA9IFtdICMgaW5zaWRlIGEgZG9jdHlwZSBkZWNsYXJhdGlvbgorICAgICAgICBlbGlmIHNlbGYuX2RvY3R5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjIHBhcnNlIGRvY3R5cGUgY29udGVudHMKKyAgICAgICAgICAgIGlmIHByZWZpeCA9PSAiPiI6CisgICAgICAgICAgICAgICAgc2VsZi5fZG9jdHlwZSA9IE5vbmUKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN0cmlwKCkKKyAgICAgICAgICAgIGlmIG5vdCB0ZXh0OgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5fZG9jdHlwZS5hcHBlbmQodGV4dCkKKyAgICAgICAgICAgIG4gPSBsZW4oc2VsZi5fZG9jdHlwZSkKKyAgICAgICAgICAgIGlmIG4gPiAyOgorICAgICAgICAgICAgICAgIHR5cGUgPSBzZWxmLl9kb2N0eXBlWzFdCisgICAgICAgICAgICAgICAgaWYgdHlwZSA9PSAiUFVCTElDIiBhbmQgbiA9PSA0OgorICAgICAgICAgICAgICAgICAgICBuYW1lLCB0eXBlLCBwdWJpZCwgc3lzdGVtID0gc2VsZi5fZG9jdHlwZQorICAgICAgICAgICAgICAgIGVsaWYgdHlwZSA9PSAiU1lTVEVNIiBhbmQgbiA9PSAzOgorICAgICAgICAgICAgICAgICAgICBuYW1lLCB0eXBlLCBzeXN0ZW0gPSBzZWxmLl9kb2N0eXBlCisgICAgICAgICAgICAgICAgICAgIHB1YmlkID0gTm9uZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGlmIHB1YmlkOgorICAgICAgICAgICAgICAgICAgICBwdWJpZCA9IHB1YmlkWzE6LTFdCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLnRhcmdldCwgImRvY3R5cGUiKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50YXJnZXQuZG9jdHlwZShuYW1lLCBwdWJpZCwgc3lzdGVtWzE6LTFdKQorICAgICAgICAgICAgICAgIGVsaWYgc2VsZi5kb2N0eXBlIGlzIG5vdCBzZWxmLl9YTUxQYXJzZXJfX2RvY3R5cGU6CisgICAgICAgICAgICAgICAgICAgICMgd2FybiBhYm91dCBkZXByZWNhdGVkIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fWE1MUGFyc2VyX19kb2N0eXBlKG5hbWUsIHB1YmlkLCBzeXN0ZW1bMTotMV0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG9jdHlwZShuYW1lLCBwdWJpZCwgc3lzdGVtWzE6LTFdKQorICAgICAgICAgICAgICAgIHNlbGYuX2RvY3R5cGUgPSBOb25lCisKKyAgICAjIworICAgICMgKERlcHJlY2F0ZWQpIEhhbmRsZXMgYSBkb2N0eXBlIGRlY2xhcmF0aW9uLgorICAgICMKKyAgICAjIEBwYXJhbSBuYW1lIERvY3R5cGUgbmFtZS4KKyAgICAjIEBwYXJhbSBwdWJpZCBQdWJsaWMgaWRlbnRpZmllci4KKyAgICAjIEBwYXJhbSBzeXN0ZW0gU3lzdGVtIGlkZW50aWZpZXIuCisKKyAgICBkZWYgZG9jdHlwZShzZWxmLCBuYW1lLCBwdWJpZCwgc3lzdGVtKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2Qgb2YgWE1MUGFyc2VyIGlzIGRlcHJlY2F0ZWQuIiIiCisgICAgICAgIHdhcm5pbmdzLndhcm4oCisgICAgICAgICAgICAiVGhpcyBtZXRob2Qgb2YgWE1MUGFyc2VyIGlzIGRlcHJlY2F0ZWQuICBEZWZpbmUgZG9jdHlwZSgpICIKKyAgICAgICAgICAgICJtZXRob2Qgb24gdGhlIFRyZWVCdWlsZGVyIHRhcmdldC4iLAorICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAorICAgICAgICAgICAgKQorCisgICAgIyBzZW50aW5lbCwgaWYgZG9jdHlwZSBpcyByZWRlZmluZWQgaW4gYSBzdWJjbGFzcworICAgIF9fZG9jdHlwZSA9IGRvY3R5cGUKKworICAgICMjCisgICAgIyBGZWVkcyBkYXRhIHRvIHRoZSBwYXJzZXIuCisgICAgIworICAgICMgQHBhcmFtIGRhdGEgRW5jb2RlZCBkYXRhLgorCisgICAgZGVmIGZlZWQoc2VsZiwgZGF0YSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5QYXJzZShkYXRhLCAwKQorICAgICAgICBleGNlcHQgc2VsZi5fZXJyb3IsIHY6CisgICAgICAgICAgICBzZWxmLl9yYWlzZWVycm9yKHYpCisKKyAgICAjIworICAgICMgRmluaXNoZXMgZmVlZGluZyBkYXRhIHRvIHRoZSBwYXJzZXIuCisgICAgIworICAgICMgQHJldHVybiBBbiBlbGVtZW50IHN0cnVjdHVyZS4KKyAgICAjIEBkZWZyZXR1cm4gRWxlbWVudAorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuUGFyc2UoIiIsIDEpICMgZW5kIG9mIGRhdGEKKyAgICAgICAgZXhjZXB0IHNlbGYuX2Vycm9yLCB2OgorICAgICAgICAgICAgc2VsZi5fcmFpc2VlcnJvcih2KQorICAgICAgICB0cmVlID0gc2VsZi50YXJnZXQuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi50YXJnZXQsIHNlbGYuX3BhcnNlciAjIGdldCByaWQgb2YgY2lyY3VsYXIgcmVmZXJlbmNlcworICAgICAgICByZXR1cm4gdHJlZQorCisjIGNvbXBhdGliaWxpdHkKK1hNTFRyZWVCdWlsZGVyID0gWE1MUGFyc2VyCisKKyMgd29ya2Fyb3VuZCBjaXJjdWxhciBpbXBvcnQuCit0cnk6CisgICAgZnJvbSBFbGVtZW50QzE0TiBpbXBvcnQgX3NlcmlhbGl6ZV9jMTRuCisgICAgX3NlcmlhbGl6ZVsiYzE0biJdID0gX3NlcmlhbGl6ZV9jMTRuCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFRyZWUucHljIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFRyZWUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMWNhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFRyZWUucHlvIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvRWxlbWVudFRyZWUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmQwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9FbGVtZW50VHJlZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvX19pbml0X18ucHkgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZkOGY2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvX19pbml0X18ucHkKQEAgLTAsMCArMSwzMyBAQAorIyAkSWQ6IF9faW5pdF9fLnB5IDMzNzUgMjAwOC0wMi0xMyAwODowNTowOFogZnJlZHJpayAkCisjIGVsZW1lbnR0cmVlIHBhY2thZ2UKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgRWxlbWVudFRyZWUgdG9vbGtpdCBpcworIworIyBDb3B5cmlnaHQgKGMpIDE5OTktMjAwOCBieSBGcmVkcmlrIEx1bmRoCisjCisjIEJ5IG9idGFpbmluZywgdXNpbmcsIGFuZC9vciBjb3B5aW5nIHRoaXMgc29mdHdhcmUgYW5kL29yIGl0cworIyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24sIHlvdSBhZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsCisjIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnM6CisjCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisjIGl0cyBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcworIyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXJzIGluCisjIGFsbCBjb3BpZXMsIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyMgbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mCisjIFNlY3JldCBMYWJzIEFCIG9yIHRoZSBhdXRob3Igbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5CisjIHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuCisjIHByaW9yIHBlcm1pc3Npb24uCisjCisjIFNFQ1JFVCBMQUJTIEFCIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRAorIyBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVC0KKyMgQUJJTElUWSBBTkQgRklUTkVTUy4gIElOIE5PIEVWRU5UIFNIQUxMIFNFQ1JFVCBMQUJTIEFCIE9SIFRIRSBBVVRIT1IKKyMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWQorIyBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywKKyMgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMKKyMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorIyBPRiBUSElTIFNPRlRXQVJFLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIExpY2Vuc2VkIHRvIFBTRiB1bmRlciBhIENvbnRyaWJ1dG9yIEFncmVlbWVudC4KKyMgU2VlIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2YvbGljZW5zZSBmb3IgbGljZW5zaW5nIGRldGFpbHMuCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZDAwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL19faW5pdF9fLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxZDAwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL19faW5pdF9fLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9jRWxlbWVudFRyZWUucHkgYi9saWIvcHl0aG9uMi43L3htbC9ldHJlZS9jRWxlbWVudFRyZWUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmMTI3YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL2NFbGVtZW50VHJlZS5weQpAQCAtMCwwICsxLDMgQEAKKyMgV3JhcHBlciBtb2R1bGUgZm9yIF9lbGVtZW50dHJlZQorCitmcm9tIF9lbGVtZW50dHJlZSBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5YyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL2NFbGVtZW50VHJlZS5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL2NFbGVtZW50VHJlZS5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvZXRyZWUvY0VsZW1lbnRUcmVlLnB5byBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL2NFbGVtZW50VHJlZS5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA1NGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL2V0cmVlL2NFbGVtZW50VHJlZS5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9fX2luaXRfXy5weSBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzMTRhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvX19pbml0X18ucHkKQEAgLTAsMCArMSw4IEBACisiIiJQeXRob24gaW50ZXJmYWNlcyB0byBYTUwgcGFyc2Vycy4KKworVGhpcyBwYWNrYWdlIGNvbnRhaW5zIG9uZSBtb2R1bGU6CisKK2V4cGF0IC0tIFB5dGhvbiB3cmFwcGVyIGZvciBKYW1lcyBDbGFyaydzIEV4cGF0IHBhcnNlciwgd2l0aCBuYW1lc3BhY2UKKyAgICAgICAgIHN1cHBvcnQuCisKKyIiIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9fX2luaXRfXy5weWMgYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL19faW5pdF9fLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE5OGUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9fX2luaXRfXy5weW8gYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL19faW5pdF9fLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWE5OGUwCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9leHBhdC5weSBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvZXhwYXQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiNWM3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3BhcnNlcnMvZXhwYXQucHkKQEAgLTAsMCArMSw0IEBACisiIiJJbnRlcmZhY2UgdG8gdGhlIEV4cGF0IG5vbi12YWxpZGF0aW5nIFhNTCBwYXJzZXIuIiIiCitfX3ZlcnNpb25fXyA9ICckUmV2aXNpb246IDE3NjQwICQnCisKK2Zyb20gcHlleHBhdCBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9leHBhdC5weWMgYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL2V4cGF0LnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI5Y2RkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9leHBhdC5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9leHBhdC5weW8gYi9saWIvcHl0aG9uMi43L3htbC9wYXJzZXJzL2V4cGF0LnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWI5Y2RkCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvcGFyc2Vycy9leHBhdC5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNWI2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvX19pbml0X18ucHkKQEAgLTAsMCArMSwxMDggQEAKKyIiIlNpbXBsZSBBUEkgZm9yIFhNTCAoU0FYKSBpbXBsZW1lbnRhdGlvbiBmb3IgUHl0aG9uLgorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgU0FYIDIgaW50ZXJmYWNlOworaW5mb3JtYXRpb24gYWJvdXQgdGhlIEphdmEgdmVyc2lvbiBvZiB0aGUgaW50ZXJmYWNlIGNhbiBiZSBmb3VuZCBhdAoraHR0cDovL3d3dy5tZWdnaW5zb24uY29tL1NBWC8uICBUaGUgUHl0aG9uIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSBpcworZG9jdW1lbnRlZCBhdCA8Li4uPi4KKworVGhpcyBwYWNrYWdlIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbW9kdWxlczoKKworaGFuZGxlciAtLSBCYXNlIGNsYXNzZXMgYW5kIGNvbnN0YW50cyB3aGljaCBkZWZpbmUgdGhlIFNBWCAyIEFQSSBmb3IKKyAgICAgICAgICAgdGhlICdjbGllbnQtc2lkZScgb2YgU0FYIGZvciBQeXRob24uCisKK3NheHV0aWxzIC0tIEltcGxlbWVudGF0aW9uIG9mIHRoZSBjb252ZW5pZW5jZSBjbGFzc2VzIGNvbW1vbmx5IHVzZWQgdG8KKyAgICAgICAgICAgIHdvcmsgd2l0aCBTQVguCisKK3htbHJlYWRlciAtLSBCYXNlIGNsYXNzZXMgYW5kIGNvbnN0YW50cyB3aGljaCBkZWZpbmUgdGhlIFNBWCAyIEFQSSBmb3IKKyAgICAgICAgICAgICB0aGUgcGFyc2VycyB1c2VkIHdpdGggU0FYIGZvciBQeXRob24uCisKK2V4cGF0cmVhZGVyIC0tIERyaXZlciB0aGF0IGFsbG93cyB1c2Ugb2YgdGhlIEV4cGF0IHBhcnNlciB3aXRoIFNBWC4KKyIiIgorCitmcm9tIHhtbHJlYWRlciBpbXBvcnQgSW5wdXRTb3VyY2UKK2Zyb20gaGFuZGxlciBpbXBvcnQgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlcgorZnJvbSBfZXhjZXB0aW9ucyBpbXBvcnQgU0FYRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBTQVhQYXJzZUV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBcCisgICAgICAgICAgICAgICAgICAgICAgICBTQVhSZWFkZXJOb3RBdmFpbGFibGUKKworCitkZWYgcGFyc2Uoc291cmNlLCBoYW5kbGVyLCBlcnJvckhhbmRsZXI9RXJyb3JIYW5kbGVyKCkpOgorICAgIHBhcnNlciA9IG1ha2VfcGFyc2VyKCkKKyAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoaGFuZGxlcikKKyAgICBwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcikKKyAgICBwYXJzZXIucGFyc2Uoc291cmNlKQorCitkZWYgcGFyc2VTdHJpbmcoc3RyaW5nLCBoYW5kbGVyLCBlcnJvckhhbmRsZXI9RXJyb3JIYW5kbGVyKCkpOgorICAgIHRyeToKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCisgICAgaWYgZXJyb3JIYW5kbGVyIGlzIE5vbmU6CisgICAgICAgIGVycm9ySGFuZGxlciA9IEVycm9ySGFuZGxlcigpCisgICAgcGFyc2VyID0gbWFrZV9wYXJzZXIoKQorICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKQorICAgIHBhcnNlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyKQorCisgICAgaW5wc3JjID0gSW5wdXRTb3VyY2UoKQorICAgIGlucHNyYy5zZXRCeXRlU3RyZWFtKFN0cmluZ0lPKHN0cmluZykpCisgICAgcGFyc2VyLnBhcnNlKGlucHNyYykKKworIyB0aGlzIGlzIHRoZSBwYXJzZXIgbGlzdCB1c2VkIGJ5IHRoZSBtYWtlX3BhcnNlciBmdW5jdGlvbiBpZiBubworIyBhbHRlcm5hdGl2ZXMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMgdG8gdGhlIGZ1bmN0aW9uCisKK2RlZmF1bHRfcGFyc2VyX2xpc3QgPSBbInhtbC5zYXguZXhwYXRyZWFkZXIiXQorCisjIHRlbGwgbW9kdWxlZmluZGVyIHRoYXQgaW1wb3J0aW5nIHNheCBwb3RlbnRpYWxseSBpbXBvcnRzIGV4cGF0cmVhZGVyCitfZmFsc2UgPSAwCitpZiBfZmFsc2U6CisgICAgaW1wb3J0IHhtbC5zYXguZXhwYXRyZWFkZXIKKworaW1wb3J0IG9zLCBzeXMKK2lmICJQWV9TQVhfUEFSU0VSIiBpbiBvcy5lbnZpcm9uOgorICAgIGRlZmF1bHRfcGFyc2VyX2xpc3QgPSBvcy5lbnZpcm9uWyJQWV9TQVhfUEFSU0VSIl0uc3BsaXQoIiwiKQorZGVsIG9zCisKK19rZXkgPSAicHl0aG9uLnhtbC5zYXgucGFyc2VyIgoraWYgc3lzLnBsYXRmb3JtWzo0XSA9PSAiamF2YSIgYW5kIHN5cy5yZWdpc3RyeS5jb250YWluc0tleShfa2V5KToKKyAgICBkZWZhdWx0X3BhcnNlcl9saXN0ID0gc3lzLnJlZ2lzdHJ5LmdldFByb3BlcnR5KF9rZXkpLnNwbGl0KCIsIikKKworCitkZWYgbWFrZV9wYXJzZXIocGFyc2VyX2xpc3QgPSBbXSk6CisgICAgIiIiQ3JlYXRlcyBhbmQgcmV0dXJucyBhIFNBWCBwYXJzZXIuCisKKyAgICBDcmVhdGVzIHRoZSBmaXJzdCBwYXJzZXIgaXQgaXMgYWJsZSB0byBpbnN0YW50aWF0ZSBvZiB0aGUgb25lcworICAgIGdpdmVuIGluIHRoZSBsaXN0IGNyZWF0ZWQgYnkgZG9pbmcgcGFyc2VyX2xpc3QgKworICAgIGRlZmF1bHRfcGFyc2VyX2xpc3QuICBUaGUgbGlzdHMgbXVzdCBjb250YWluIHRoZSBuYW1lcyBvZiBQeXRob24KKyAgICBtb2R1bGVzIGNvbnRhaW5pbmcgYm90aCBhIFNBWCBwYXJzZXIgYW5kIGEgY3JlYXRlX3BhcnNlciBmdW5jdGlvbi4iIiIKKworICAgIGZvciBwYXJzZXJfbmFtZSBpbiBwYXJzZXJfbGlzdCArIGRlZmF1bHRfcGFyc2VyX2xpc3Q6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBfY3JlYXRlX3BhcnNlcihwYXJzZXJfbmFtZSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yLGU6CisgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICBpZiBwYXJzZXJfbmFtZSBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICAjIFRoZSBwYXJzZXIgbW9kdWxlIHdhcyBmb3VuZCwgYnV0IGltcG9ydGluZyBpdAorICAgICAgICAgICAgICAgICMgZmFpbGVkIHVuZXhwZWN0ZWRseSwgcGFzcyB0aGlzIGV4Y2VwdGlvbiB0aHJvdWdoCisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IFNBWFJlYWRlck5vdEF2YWlsYWJsZToKKyAgICAgICAgICAgICMgVGhlIHBhcnNlciBtb2R1bGUgZGV0ZWN0ZWQgdGhhdCBpdCB3b24ndCB3b3JrIHByb3Blcmx5LAorICAgICAgICAgICAgIyBzbyB0cnkgdGhlIG5leHQgb25lCisgICAgICAgICAgICBwYXNzCisKKyAgICByYWlzZSBTQVhSZWFkZXJOb3RBdmFpbGFibGUoIk5vIHBhcnNlcnMgZm91bmQiLCBOb25lKQorCisjIC0tLSBJbnRlcm5hbCB1dGlsaXR5IG1ldGhvZHMgdXNlZCBieSBtYWtlX3BhcnNlcgorCitpZiBzeXMucGxhdGZvcm1bIDogNF0gPT0gImphdmEiOgorICAgIGRlZiBfY3JlYXRlX3BhcnNlcihwYXJzZXJfbmFtZSk6CisgICAgICAgIGZyb20gb3JnLnB5dGhvbi5jb3JlIGltcG9ydCBpbXAKKyAgICAgICAgZHJ2X21vZHVsZSA9IGltcC5pbXBvcnROYW1lKHBhcnNlcl9uYW1lLCAwLCBnbG9iYWxzKCkpCisgICAgICAgIHJldHVybiBkcnZfbW9kdWxlLmNyZWF0ZV9wYXJzZXIoKQorCitlbHNlOgorICAgIGRlZiBfY3JlYXRlX3BhcnNlcihwYXJzZXJfbmFtZSk6CisgICAgICAgIGRydl9tb2R1bGUgPSBfX2ltcG9ydF9fKHBhcnNlcl9uYW1lLHt9LHt9LFsnY3JlYXRlX3BhcnNlciddKQorICAgICAgICByZXR1cm4gZHJ2X21vZHVsZS5jcmVhdGVfcGFyc2VyKCkKKworZGVsIHN5cwpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5YyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fX2luaXRfXy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhM2NiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fX2luaXRfXy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L19faW5pdF9fLnB5byBiL2xpYi9weXRob24yLjcveG1sL3NheC9fX2luaXRfXy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVhM2NiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fX2luaXRfXy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YjJiYTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvX2V4Y2VwdGlvbnMucHkKQEAgLTAsMCArMSwxMzEgQEAKKyIiIkRpZmZlcmVudCBraW5kcyBvZiBTQVggRXhjZXB0aW9ucyIiIgoraW1wb3J0IHN5cworaWYgc3lzLnBsYXRmb3JtWzo0XSA9PSAiamF2YSI6CisgICAgZnJvbSBqYXZhLmxhbmcgaW1wb3J0IEV4Y2VwdGlvbgorZGVsIHN5cworCisjID09PT09IFNBWEVYQ0VQVElPTiA9PT09PQorCitjbGFzcyBTQVhFeGNlcHRpb24oRXhjZXB0aW9uKToKKyAgICAiIiJFbmNhcHN1bGF0ZSBhbiBYTUwgZXJyb3Igb3Igd2FybmluZy4gVGhpcyBjbGFzcyBjYW4gY29udGFpbgorICAgIGJhc2ljIGVycm9yIG9yIHdhcm5pbmcgaW5mb3JtYXRpb24gZnJvbSBlaXRoZXIgdGhlIFhNTCBwYXJzZXIgb3IKKyAgICB0aGUgYXBwbGljYXRpb246IHlvdSBjYW4gc3ViY2xhc3MgaXQgdG8gcHJvdmlkZSBhZGRpdGlvbmFsCisgICAgZnVuY3Rpb25hbGl0eSwgb3IgdG8gYWRkIGxvY2FsaXphdGlvbi4gTm90ZSB0aGF0IGFsdGhvdWdoIHlvdSB3aWxsCisgICAgcmVjZWl2ZSBhIFNBWEV4Y2VwdGlvbiBhcyB0aGUgYXJndW1lbnQgdG8gdGhlIGhhbmRsZXJzIGluIHRoZQorICAgIEVycm9ySGFuZGxlciBpbnRlcmZhY2UsIHlvdSBhcmUgbm90IGFjdHVhbGx5IHJlcXVpcmVkIHRvIHJhaXNlCisgICAgdGhlIGV4Y2VwdGlvbjsgaW5zdGVhZCwgeW91IGNhbiBzaW1wbHkgcmVhZCB0aGUgaW5mb3JtYXRpb24gaW4KKyAgICBpdC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIGV4Y2VwdGlvbj1Ob25lKToKKyAgICAgICAgIiIiQ3JlYXRlcyBhbiBleGNlcHRpb24uIFRoZSBtZXNzYWdlIGlzIHJlcXVpcmVkLCBidXQgdGhlIGV4Y2VwdGlvbgorICAgICAgICBpcyBvcHRpb25hbC4iIiIKKyAgICAgICAgc2VsZi5fbXNnID0gbXNnCisgICAgICAgIHNlbGYuX2V4Y2VwdGlvbiA9IGV4Y2VwdGlvbgorICAgICAgICBFeGNlcHRpb24uX19pbml0X18oc2VsZiwgbXNnKQorCisgICAgZGVmIGdldE1lc3NhZ2Uoc2VsZik6CisgICAgICAgICJSZXR1cm4gYSBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4iCisgICAgICAgIHJldHVybiBzZWxmLl9tc2cKKworICAgIGRlZiBnZXRFeGNlcHRpb24oc2VsZik6CisgICAgICAgICJSZXR1cm4gdGhlIGVtYmVkZGVkIGV4Y2VwdGlvbiwgb3IgTm9uZSBpZiB0aGVyZSB3YXMgbm9uZS4iCisgICAgICAgIHJldHVybiBzZWxmLl9leGNlcHRpb24KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleGNlcHRpb24uIgorICAgICAgICByZXR1cm4gc2VsZi5fbXNnCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaXgpOgorICAgICAgICAiIiJBdm9pZHMgd2VpcmQgZXJyb3IgbWVzc2FnZXMgaWYgc29tZW9uZSBkb2VzIGV4Y2VwdGlvbltpeF0gYnkKKyAgICAgICAgbWlzdGFrZSwgc2luY2UgRXhjZXB0aW9uIGhhcyBfX2dldGl0ZW1fXyBkZWZpbmVkLiIiIgorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiX19nZXRpdGVtX18iKQorCisKKyMgPT09PT0gU0FYUEFSU0VFWENFUFRJT04gPT09PT0KKworY2xhc3MgU0FYUGFyc2VFeGNlcHRpb24oU0FYRXhjZXB0aW9uKToKKyAgICAiIiJFbmNhcHN1bGF0ZSBhbiBYTUwgcGFyc2UgZXJyb3Igb3Igd2FybmluZy4KKworICAgIFRoaXMgZXhjZXB0aW9uIHdpbGwgaW5jbHVkZSBpbmZvcm1hdGlvbiBmb3IgbG9jYXRpbmcgdGhlIGVycm9yIGluCisgICAgdGhlIG9yaWdpbmFsIFhNTCBkb2N1bWVudC4gTm90ZSB0aGF0IGFsdGhvdWdoIHRoZSBhcHBsaWNhdGlvbiB3aWxsCisgICAgcmVjZWl2ZSBhIFNBWFBhcnNlRXhjZXB0aW9uIGFzIHRoZSBhcmd1bWVudCB0byB0aGUgaGFuZGxlcnMgaW4gdGhlCisgICAgRXJyb3JIYW5kbGVyIGludGVyZmFjZSwgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBhY3R1YWxseSByZXF1aXJlZAorICAgIHRvIHJhaXNlIHRoZSBleGNlcHRpb247IGluc3RlYWQsIGl0IGNhbiBzaW1wbHkgcmVhZCB0aGUKKyAgICBpbmZvcm1hdGlvbiBpbiBpdCBhbmQgdGFrZSBhIGRpZmZlcmVudCBhY3Rpb24uCisKKyAgICBTaW5jZSB0aGlzIGV4Y2VwdGlvbiBpcyBhIHN1YmNsYXNzIG9mIFNBWEV4Y2VwdGlvbiwgaXQgaW5oZXJpdHMKKyAgICB0aGUgYWJpbGl0eSB0byB3cmFwIGFub3RoZXIgZXhjZXB0aW9uLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgZXhjZXB0aW9uLCBsb2NhdG9yKToKKyAgICAgICAgIkNyZWF0ZXMgdGhlIGV4Y2VwdGlvbi4gVGhlIGV4Y2VwdGlvbiBwYXJhbWV0ZXIgaXMgYWxsb3dlZCB0byBiZSBOb25lLiIKKyAgICAgICAgU0FYRXhjZXB0aW9uLl9faW5pdF9fKHNlbGYsIG1zZywgZXhjZXB0aW9uKQorICAgICAgICBzZWxmLl9sb2NhdG9yID0gbG9jYXRvcgorCisgICAgICAgICMgV2UgbmVlZCB0byBjYWNoZSB0aGlzIHN0dWZmIGF0IGNvbnN0cnVjdGlvbiB0aW1lLgorICAgICAgICAjIElmIHRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCwgdGhlIG9iamVjdHMgdGhyb3VnaCB3aGljaCB3ZSBtdXN0CisgICAgICAgICMgdHJhdmVyc2UgdG8gZ2V0IHRoaXMgaW5mb3JtYXRpb24gbWF5IGJlIGRlbGV0ZWQgYnkgdGhlIHRpbWUKKyAgICAgICAgIyBpdCBnZXRzIGNhdWdodC4KKyAgICAgICAgc2VsZi5fc3lzdGVtSWQgPSBzZWxmLl9sb2NhdG9yLmdldFN5c3RlbUlkKCkKKyAgICAgICAgc2VsZi5fY29sbnVtID0gc2VsZi5fbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKQorICAgICAgICBzZWxmLl9saW5lbnVtID0gc2VsZi5fbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkKKworICAgIGRlZiBnZXRDb2x1bW5OdW1iZXIoc2VsZik6CisgICAgICAgICIiIlRoZSBjb2x1bW4gbnVtYmVyIG9mIHRoZSBlbmQgb2YgdGhlIHRleHQgd2hlcmUgdGhlIGV4Y2VwdGlvbgorICAgICAgICBvY2N1cnJlZC4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbG51bQorCisgICAgZGVmIGdldExpbmVOdW1iZXIoc2VsZik6CisgICAgICAgICJUaGUgbGluZSBudW1iZXIgb2YgdGhlIGVuZCBvZiB0aGUgdGV4dCB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xpbmVudW0KKworICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKKyAgICAgICAgIkdldCB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YgdGhlIGVudGl0eSB3aGVyZSB0aGUgZXhjZXB0aW9uIG9jY3VycmVkLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2xvY2F0b3IuZ2V0UHVibGljSWQoKQorCisgICAgZGVmIGdldFN5c3RlbUlkKHNlbGYpOgorICAgICAgICAiR2V0IHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiB0aGUgZW50aXR5IHdoZXJlIHRoZSBleGNlcHRpb24gb2NjdXJyZWQuIgorICAgICAgICByZXR1cm4gc2VsZi5fc3lzdGVtSWQKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiQ3JlYXRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBleGNlcHRpb24uIgorICAgICAgICBzeXNpZCA9IHNlbGYuZ2V0U3lzdGVtSWQoKQorICAgICAgICBpZiBzeXNpZCBpcyBOb25lOgorICAgICAgICAgICAgc3lzaWQgPSAiPHVua25vd24+IgorICAgICAgICBsaW5lbnVtID0gc2VsZi5nZXRMaW5lTnVtYmVyKCkKKyAgICAgICAgaWYgbGluZW51bSBpcyBOb25lOgorICAgICAgICAgICAgbGluZW51bSA9ICI/IgorICAgICAgICBjb2xudW0gPSBzZWxmLmdldENvbHVtbk51bWJlcigpCisgICAgICAgIGlmIGNvbG51bSBpcyBOb25lOgorICAgICAgICAgICAgY29sbnVtID0gIj8iCisgICAgICAgIHJldHVybiAiJXM6JXM6JXM6ICVzIiAlIChzeXNpZCwgbGluZW51bSwgY29sbnVtLCBzZWxmLl9tc2cpCisKKworIyA9PT09PSBTQVhOT1RSRUNPR05JWkVERVhDRVBUSU9OID09PT09CisKK2NsYXNzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oU0FYRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gY2xhc3MgZm9yIGFuIHVucmVjb2duaXplZCBpZGVudGlmaWVyLgorCisgICAgQW4gWE1MUmVhZGVyIHdpbGwgcmFpc2UgdGhpcyBleGNlcHRpb24gd2hlbiBpdCBpcyBjb25mcm9udGVkIHdpdGggYW4KKyAgICB1bnJlY29nbml6ZWQgZmVhdHVyZSBvciBwcm9wZXJ0eS4gU0FYIGFwcGxpY2F0aW9ucyBhbmQgZXh0ZW5zaW9ucyBtYXkKKyAgICB1c2UgdGhpcyBjbGFzcyBmb3Igc2ltaWxhciBwdXJwb3Nlcy4iIiIKKworCisjID09PT09IFNBWE5PVFNVUFBPUlRFREVYQ0VQVElPTiA9PT09PQorCitjbGFzcyBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU0FYRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gY2xhc3MgZm9yIGFuIHVuc3VwcG9ydGVkIG9wZXJhdGlvbi4KKworICAgIEFuIFhNTFJlYWRlciB3aWxsIHJhaXNlIHRoaXMgZXhjZXB0aW9uIHdoZW4gYSBzZXJ2aWNlIGl0IGNhbm5vdAorICAgIHBlcmZvcm0gaXMgcmVxdWVzdGVkIChzcGVjaWZpY2FsbHkgc2V0dGluZyBhIHN0YXRlIG9yIHZhbHVlKS4gU0FYCisgICAgYXBwbGljYXRpb25zIGFuZCBleHRlbnNpb25zIG1heSB1c2UgdGhpcyBjbGFzcyBmb3Igc2ltaWxhcgorICAgIHB1cnBvc2VzLiIiIgorCisjID09PT09IFNBWE5PVFNVUFBPUlRFREVYQ0VQVElPTiA9PT09PQorCitjbGFzcyBTQVhSZWFkZXJOb3RBdmFpbGFibGUoU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKToKKyAgICAiIiJFeGNlcHRpb24gY2xhc3MgZm9yIGEgbWlzc2luZyBkcml2ZXIuCisKKyAgICBBbiBYTUxSZWFkZXIgbW9kdWxlIChkcml2ZXIpIHNob3VsZCByYWlzZSB0aGlzIGV4Y2VwdGlvbiB3aGVuIGl0CisgICAgaXMgZmlyc3QgaW1wb3J0ZWQsIGUuZy4gd2hlbiBhIHN1cHBvcnQgbW9kdWxlIGNhbm5vdCBiZSBpbXBvcnRlZC4KKyAgICBJdCBhbHNvIG1heSBiZSByYWlzZWQgZHVyaW5nIHBhcnNpbmcsIGUuZy4gaWYgZXhlY3V0aW5nIGFuIGV4dGVybmFsCisgICAgcHJvZ3JhbSBpcyBub3QgcGVybWl0dGVkLiIiIgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5YyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fZXhjZXB0aW9ucy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5ZDhiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fZXhjZXB0aW9ucy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L19leGNlcHRpb25zLnB5byBiL2xpYi9weXRob24yLjcveG1sL3NheC9fZXhjZXB0aW9ucy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5ZDhiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9fZXhjZXB0aW9ucy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5IGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZTNlNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvZXhwYXRyZWFkZXIucHkKQEAgLTAsMCArMSw0MTcgQEAKKyIiIgorU0FYIGRyaXZlciBmb3IgdGhlIHB5ZXhwYXQgQyBtb2R1bGUuICBUaGlzIGRyaXZlciB3b3JrcyB3aXRoCitweWV4cGF0Ll9fdmVyc2lvbl9fID09ICcyLjIyJy4KKyIiIgorCit2ZXJzaW9uID0gIjAuMjAiCisKK2Zyb20geG1sLnNheC5fZXhjZXB0aW9ucyBpbXBvcnQgKgorZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfdmFsaWRhdGlvbiwgZmVhdHVyZV9uYW1lc3BhY2VzCitmcm9tIHhtbC5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV9uYW1lc3BhY2VfcHJlZml4ZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX2V4dGVybmFsX2dlcywgZmVhdHVyZV9leHRlcm5hbF9wZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmcKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBwcm9wZXJ0eV94bWxfc3RyaW5nLCBwcm9wZXJ0eV9pbnRlcm5pbmdfZGljdAorCisjIHhtbC5wYXJzZXJzLmV4cGF0IGRvZXMgbm90IHJhaXNlIEltcG9ydEVycm9yIGluIEp5dGhvbgoraW1wb3J0IHN5cworaWYgc3lzLnBsYXRmb3JtWzo0XSA9PSAiamF2YSI6CisgICAgcmFpc2UgU0FYUmVhZGVyTm90QXZhaWxhYmxlKCJleHBhdCBub3QgYXZhaWxhYmxlIGluIEphdmEiLCBOb25lKQorZGVsIHN5cworCit0cnk6CisgICAgZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICByYWlzZSBTQVhSZWFkZXJOb3RBdmFpbGFibGUoImV4cGF0IG5vdCBzdXBwb3J0ZWQiLCBOb25lKQorZWxzZToKKyAgICBpZiBub3QgaGFzYXR0cihleHBhdCwgIlBhcnNlckNyZWF0ZSIpOgorICAgICAgICByYWlzZSBTQVhSZWFkZXJOb3RBdmFpbGFibGUoImV4cGF0IG5vdCBzdXBwb3J0ZWQiLCBOb25lKQorZnJvbSB4bWwuc2F4IGltcG9ydCB4bWxyZWFkZXIsIHNheHV0aWxzLCBoYW5kbGVyCisKK0F0dHJpYnV0ZXNJbXBsID0geG1scmVhZGVyLkF0dHJpYnV0ZXNJbXBsCitBdHRyaWJ1dGVzTlNJbXBsID0geG1scmVhZGVyLkF0dHJpYnV0ZXNOU0ltcGwKKworIyBJZiB3ZSdyZSB1c2luZyBhIHN1ZmZpY2llbnRseSByZWNlbnQgdmVyc2lvbiBvZiBQeXRob24sIHdlIGNhbiB1c2UKKyMgd2VhayByZWZlcmVuY2VzIHRvIGF2b2lkIGN5Y2xlcyBiZXR3ZWVuIHRoZSBwYXJzZXIgYW5kIGNvbnRlbnQKKyMgaGFuZGxlciwgb3RoZXJ3aXNlIHdlJ2xsIGp1c3QgaGF2ZSB0byBwcmV0ZW5kLgordHJ5OgorICAgIGltcG9ydCBfd2Vha3JlZgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGRlZiBfbWtwcm94eShvKToKKyAgICAgICAgcmV0dXJuIG8KK2Vsc2U6CisgICAgaW1wb3J0IHdlYWtyZWYKKyAgICBfbWtwcm94eSA9IHdlYWtyZWYucHJveHkKKyAgICBkZWwgd2Vha3JlZiwgX3dlYWtyZWYKKworIyAtLS0gRXhwYXRMb2NhdG9yCisKK2NsYXNzIEV4cGF0TG9jYXRvcih4bWxyZWFkZXIuTG9jYXRvcik6CisgICAgIiIiTG9jYXRvciBmb3IgdXNlIHdpdGggdGhlIEV4cGF0UGFyc2VyIGNsYXNzLgorCisgICAgVGhpcyB1c2VzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHBhcnNlciBvYmplY3QgdG8gYXZvaWQgY3JlYXRpbmcKKyAgICBhIGNpcmN1bGFyIHJlZmVyZW5jZSBiZXR3ZWVuIHRoZSBwYXJzZXIgYW5kIHRoZSBjb250ZW50IGhhbmRsZXIuCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcnNlcik6CisgICAgICAgIHNlbGYuX3JlZiA9IF9ta3Byb3h5KHBhcnNlcikKKworICAgIGRlZiBnZXRDb2x1bW5OdW1iZXIoc2VsZik6CisgICAgICAgIHBhcnNlciA9IHNlbGYuX3JlZgorICAgICAgICBpZiBwYXJzZXIuX3BhcnNlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHBhcnNlci5fcGFyc2VyLkVycm9yQ29sdW1uTnVtYmVyCisKKyAgICBkZWYgZ2V0TGluZU51bWJlcihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fcmVmCisgICAgICAgIGlmIHBhcnNlci5fcGFyc2VyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICByZXR1cm4gcGFyc2VyLl9wYXJzZXIuRXJyb3JMaW5lTnVtYmVyCisKKyAgICBkZWYgZ2V0UHVibGljSWQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IHNlbGYuX3JlZgorICAgICAgICBpZiBwYXJzZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBwYXJzZXIuX3NvdXJjZS5nZXRQdWJsaWNJZCgpCisKKyAgICBkZWYgZ2V0U3lzdGVtSWQoc2VsZik6CisgICAgICAgIHBhcnNlciA9IHNlbGYuX3JlZgorICAgICAgICBpZiBwYXJzZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBwYXJzZXIuX3NvdXJjZS5nZXRTeXN0ZW1JZCgpCisKKworIyAtLS0gRXhwYXRQYXJzZXIKKworY2xhc3MgRXhwYXRQYXJzZXIoeG1scmVhZGVyLkluY3JlbWVudGFsUGFyc2VyLCB4bWxyZWFkZXIuTG9jYXRvcik6CisgICAgIiIiU0FYIGRyaXZlciBmb3IgdGhlIHB5ZXhwYXQgQyBtb2R1bGUuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXNwYWNlSGFuZGxpbmc9MCwgYnVmc2l6ZT0yKioxNi0yMCk6CisgICAgICAgIHhtbHJlYWRlci5JbmNyZW1lbnRhbFBhcnNlci5fX2luaXRfXyhzZWxmLCBidWZzaXplKQorICAgICAgICBzZWxmLl9zb3VyY2UgPSB4bWxyZWFkZXIuSW5wdXRTb3VyY2UoKQorICAgICAgICBzZWxmLl9wYXJzZXIgPSBOb25lCisgICAgICAgIHNlbGYuX25hbWVzcGFjZXMgPSBuYW1lc3BhY2VIYW5kbGluZworICAgICAgICBzZWxmLl9sZXhfaGFuZGxlcl9wcm9wID0gTm9uZQorICAgICAgICBzZWxmLl9wYXJzaW5nID0gMAorICAgICAgICBzZWxmLl9lbnRpdHlfc3RhY2sgPSBbXQorICAgICAgICBzZWxmLl9leHRlcm5hbF9nZXMgPSAxCisgICAgICAgIHNlbGYuX2ludGVybmluZyA9IE5vbmUKKworICAgICMgWE1MUmVhZGVyIG1ldGhvZHMKKworICAgIGRlZiBwYXJzZShzZWxmLCBzb3VyY2UpOgorICAgICAgICAiUGFyc2UgYW4gWE1MIGRvY3VtZW50IGZyb20gYSBVUkwgb3IgYW4gSW5wdXRTb3VyY2UuIgorICAgICAgICBzb3VyY2UgPSBzYXh1dGlscy5wcmVwYXJlX2lucHV0X3NvdXJjZShzb3VyY2UpCisKKyAgICAgICAgc2VsZi5fc291cmNlID0gc291cmNlCisgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc2V0RG9jdW1lbnRMb2NhdG9yKEV4cGF0TG9jYXRvcihzZWxmKSkKKyAgICAgICAgeG1scmVhZGVyLkluY3JlbWVudGFsUGFyc2VyLnBhcnNlKHNlbGYsIHNvdXJjZSkKKworICAgIGRlZiBwcmVwYXJlUGFyc2VyKHNlbGYsIHNvdXJjZSk6CisgICAgICAgIGlmIHNvdXJjZS5nZXRTeXN0ZW1JZCgpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYmFzZSA9IHNvdXJjZS5nZXRTeXN0ZW1JZCgpCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGJhc2UsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIGJhc2UgPSBiYXNlLmVuY29kZSgndXRmLTgnKQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlNldEJhc2UoYmFzZSkKKworICAgICMgUmVkZWZpbmVkIHNldENvbnRlbnRIYW5kbGVyIHRvIGFsbG93IGNoYW5naW5nIGhhbmRsZXJzIGR1cmluZyBwYXJzaW5nCisKKyAgICBkZWYgc2V0Q29udGVudEhhbmRsZXIoc2VsZiwgaGFuZGxlcik6CisgICAgICAgIHhtbHJlYWRlci5JbmNyZW1lbnRhbFBhcnNlci5zZXRDb250ZW50SGFuZGxlcihzZWxmLCBoYW5kbGVyKQorICAgICAgICBpZiBzZWxmLl9wYXJzaW5nOgorICAgICAgICAgICAgc2VsZi5fcmVzZXRfY29udF9oYW5kbGVyKCkKKworICAgIGRlZiBnZXRGZWF0dXJlKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lID09IGZlYXR1cmVfbmFtZXNwYWNlczoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9uYW1lc3BhY2VzCisgICAgICAgIGVsaWYgbmFtZSA9PSBmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmc6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5faW50ZXJuaW5nIGlzIG5vdCBOb25lCisgICAgICAgIGVsaWYgbmFtZSBpbiAoZmVhdHVyZV92YWxpZGF0aW9uLCBmZWF0dXJlX2V4dGVybmFsX3BlcywKKyAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX25hbWVzcGFjZV9wcmVmaXhlcyk6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBlbGlmIG5hbWUgPT0gZmVhdHVyZV9leHRlcm5hbF9nZXM6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZXh0ZXJuYWxfZ2VzCisgICAgICAgIHJhaXNlIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oIkZlYXR1cmUgJyVzJyBub3QgcmVjb2duaXplZCIgJSBuYW1lKQorCisgICAgZGVmIHNldEZlYXR1cmUoc2VsZiwgbmFtZSwgc3RhdGUpOgorICAgICAgICBpZiBzZWxmLl9wYXJzaW5nOgorICAgICAgICAgICAgcmFpc2UgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKCJDYW5ub3Qgc2V0IGZlYXR1cmVzIHdoaWxlIHBhcnNpbmciKQorCisgICAgICAgIGlmIG5hbWUgPT0gZmVhdHVyZV9uYW1lc3BhY2VzOgorICAgICAgICAgICAgc2VsZi5fbmFtZXNwYWNlcyA9IHN0YXRlCisgICAgICAgIGVsaWYgbmFtZSA9PSBmZWF0dXJlX2V4dGVybmFsX2dlczoKKyAgICAgICAgICAgIHNlbGYuX2V4dGVybmFsX2dlcyA9IHN0YXRlCisgICAgICAgIGVsaWYgbmFtZSA9PSBmZWF0dXJlX3N0cmluZ19pbnRlcm5pbmc6CisgICAgICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLl9pbnRlcm5pbmcgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faW50ZXJuaW5nID0ge30KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5faW50ZXJuaW5nID0gTm9uZQorICAgICAgICBlbGlmIG5hbWUgPT0gZmVhdHVyZV92YWxpZGF0aW9uOgorICAgICAgICAgICAgaWYgc3RhdGU6CisgICAgICAgICAgICAgICAgcmFpc2UgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiZXhwYXQgZG9lcyBub3Qgc3VwcG9ydCB2YWxpZGF0aW9uIikKKyAgICAgICAgZWxpZiBuYW1lID09IGZlYXR1cmVfZXh0ZXJuYWxfcGVzOgorICAgICAgICAgICAgaWYgc3RhdGU6CisgICAgICAgICAgICAgICAgcmFpc2UgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiZXhwYXQgZG9lcyBub3QgcmVhZCBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMiKQorICAgICAgICBlbGlmIG5hbWUgPT0gZmVhdHVyZV9uYW1lc3BhY2VfcHJlZml4ZXM6CisgICAgICAgICAgICBpZiBzdGF0ZToKKyAgICAgICAgICAgICAgICByYWlzZSBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJleHBhdCBkb2VzIG5vdCByZXBvcnQgbmFtZXNwYWNlIHByZWZpeGVzIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkZlYXR1cmUgJyVzJyBub3QgcmVjb2duaXplZCIgJSBuYW1lKQorCisgICAgZGVmIGdldFByb3BlcnR5KHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBuYW1lID09IGhhbmRsZXIucHJvcGVydHlfbGV4aWNhbF9oYW5kbGVyOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2xleF9oYW5kbGVyX3Byb3AKKyAgICAgICAgZWxpZiBuYW1lID09IHByb3BlcnR5X2ludGVybmluZ19kaWN0OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2ludGVybmluZworICAgICAgICBlbGlmIG5hbWUgPT0gcHJvcGVydHlfeG1sX3N0cmluZzoKKyAgICAgICAgICAgIGlmIHNlbGYuX3BhcnNlcjoKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuX3BhcnNlciwgIkdldElucHV0Q29udGV4dCIpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcGFyc2VyLkdldElucHV0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHZlcnNpb24gb2YgZXhwYXQgZG9lcyBub3Qgc3VwcG9ydCBnZXR0aW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgIiB0aGUgWE1MIHN0cmluZyIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlhNTCBzdHJpbmcgY2Fubm90IGJlIHJldHVybmVkIHdoZW4gbm90IHBhcnNpbmciKQorICAgICAgICByYWlzZSBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKCJQcm9wZXJ0eSAnJXMnIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCisKKyAgICBkZWYgc2V0UHJvcGVydHkoc2VsZiwgbmFtZSwgdmFsdWUpOgorICAgICAgICBpZiBuYW1lID09IGhhbmRsZXIucHJvcGVydHlfbGV4aWNhbF9oYW5kbGVyOgorICAgICAgICAgICAgc2VsZi5fbGV4X2hhbmRsZXJfcHJvcCA9IHZhbHVlCisgICAgICAgICAgICBpZiBzZWxmLl9wYXJzaW5nOgorICAgICAgICAgICAgICAgIHNlbGYuX3Jlc2V0X2xleF9oYW5kbGVyX3Byb3AoKQorICAgICAgICBlbGlmIG5hbWUgPT0gcHJvcGVydHlfaW50ZXJuaW5nX2RpY3Q6CisgICAgICAgICAgICBzZWxmLl9pbnRlcm5pbmcgPSB2YWx1ZQorICAgICAgICBlbGlmIG5hbWUgPT0gcHJvcGVydHlfeG1sX3N0cmluZzoKKyAgICAgICAgICAgIHJhaXNlIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiUHJvcGVydHkgJyVzJyBjYW5ub3QgYmUgc2V0IiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oIlByb3BlcnR5ICclcycgbm90IHJlY29nbml6ZWQiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSkKKworICAgICMgSW5jcmVtZW50YWxQYXJzZXIgbWV0aG9kcworCisgICAgZGVmIGZlZWQoc2VsZiwgZGF0YSwgaXNGaW5hbCA9IDApOgorICAgICAgICBpZiBub3Qgc2VsZi5fcGFyc2luZzoKKyAgICAgICAgICAgIHNlbGYucmVzZXQoKQorICAgICAgICAgICAgc2VsZi5fcGFyc2luZyA9IDEKKyAgICAgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5zdGFydERvY3VtZW50KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFRoZSBpc0ZpbmFsIHBhcmFtZXRlciBpcyBpbnRlcm5hbCB0byB0aGUgZXhwYXQgcmVhZGVyLgorICAgICAgICAgICAgIyBJZiBpdCBpcyBzZXQgdG8gdHJ1ZSwgZXhwYXQgd2lsbCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgZW50aXJlCisgICAgICAgICAgICAjIGRvY3VtZW50LiBXaGVuIGZlZWRpbmcgY2h1bmtzLCB0aGV5IGFyZSBub3Qgbm9ybWFsbHkgZmluYWwgLQorICAgICAgICAgICAgIyBleGNlcHQgd2hlbiBpbnZva2VkIGZyb20gY2xvc2UuCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuUGFyc2UoZGF0YSwgaXNGaW5hbCkKKyAgICAgICAgZXhjZXB0IGV4cGF0LmVycm9yLCBlOgorICAgICAgICAgICAgZXhjID0gU0FYUGFyc2VFeGNlcHRpb24oZXhwYXQuRXJyb3JTdHJpbmcoZS5jb2RlKSwgZSwgc2VsZikKKyAgICAgICAgICAgICMgRklYTUU6IHdoZW4gdG8gaW52b2tlIGVycm9yKCk/CisgICAgICAgICAgICBzZWxmLl9lcnJfaGFuZGxlci5mYXRhbEVycm9yKGV4YykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZW50aXR5X3N0YWNrOgorICAgICAgICAgICAgIyBJZiB3ZSBhcmUgY29tcGxldGluZyBhbiBleHRlcm5hbCBlbnRpdHksIGRvIG5vdGhpbmcgaGVyZQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmVlZCgiIiwgaXNGaW5hbCA9IDEpCisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5lbmREb2N1bWVudCgpCisgICAgICAgIHNlbGYuX3BhcnNpbmcgPSAwCisgICAgICAgICMgYnJlYWsgY3ljbGUgY3JlYXRlZCBieSBleHBhdCBoYW5kbGVycyBwb2ludGluZyB0byBvdXIgbWV0aG9kcworICAgICAgICBzZWxmLl9wYXJzZXIgPSBOb25lCisKKyAgICBkZWYgX3Jlc2V0X2NvbnRfaGFuZGxlcihzZWxmKToKKyAgICAgICAgc2VsZi5fcGFyc2VyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbkhhbmRsZXIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uCisgICAgICAgIHNlbGYuX3BhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IHNlbGYuX2NvbnRfaGFuZGxlci5jaGFyYWN0ZXJzCisKKyAgICBkZWYgX3Jlc2V0X2xleF9oYW5kbGVyX3Byb3Aoc2VsZik6CisgICAgICAgIGxleCA9IHNlbGYuX2xleF9oYW5kbGVyX3Byb3AKKyAgICAgICAgcGFyc2VyID0gc2VsZi5fcGFyc2VyCisgICAgICAgIGlmIGxleCBpcyBOb25lOgorICAgICAgICAgICAgcGFyc2VyLkNvbW1lbnRIYW5kbGVyID0gTm9uZQorICAgICAgICAgICAgcGFyc2VyLlN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciA9IE5vbmUKKyAgICAgICAgICAgIHBhcnNlci5FbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gTm9uZQorICAgICAgICAgICAgcGFyc2VyLlN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyID0gTm9uZQorICAgICAgICAgICAgcGFyc2VyLkVuZERvY3R5cGVEZWNsSGFuZGxlciA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlci5Db21tZW50SGFuZGxlciA9IGxleC5jb21tZW50CisgICAgICAgICAgICBwYXJzZXIuU3RhcnRDZGF0YVNlY3Rpb25IYW5kbGVyID0gbGV4LnN0YXJ0Q0RBVEEKKyAgICAgICAgICAgIHBhcnNlci5FbmRDZGF0YVNlY3Rpb25IYW5kbGVyID0gbGV4LmVuZENEQVRBCisgICAgICAgICAgICBwYXJzZXIuU3RhcnREb2N0eXBlRGVjbEhhbmRsZXIgPSBzZWxmLnN0YXJ0X2RvY3R5cGVfZGVjbAorICAgICAgICAgICAgcGFyc2VyLkVuZERvY3R5cGVEZWNsSGFuZGxlciA9IGxleC5lbmREVEQKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fbmFtZXNwYWNlczoKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShzZWxmLl9zb3VyY2UuZ2V0RW5jb2RpbmcoKSwgIiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybj1zZWxmLl9pbnRlcm5pbmcpCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIubmFtZXNwYWNlX3ByZWZpeGVzID0gMQorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlN0YXJ0RWxlbWVudEhhbmRsZXIgPSBzZWxmLnN0YXJ0X2VsZW1lbnRfbnMKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5FbmRFbGVtZW50SGFuZGxlciA9IHNlbGYuZW5kX2VsZW1lbnRfbnMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShzZWxmLl9zb3VyY2UuZ2V0RW5jb2RpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm4gPSBzZWxmLl9pbnRlcm5pbmcpCisgICAgICAgICAgICBzZWxmLl9wYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHNlbGYuc3RhcnRfZWxlbWVudAorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gc2VsZi5lbmRfZWxlbWVudAorCisgICAgICAgIHNlbGYuX3Jlc2V0X2NvbnRfaGFuZGxlcigpCisgICAgICAgIHNlbGYuX3BhcnNlci5VbnBhcnNlZEVudGl0eURlY2xIYW5kbGVyID0gc2VsZi51bnBhcnNlZF9lbnRpdHlfZGVjbAorICAgICAgICBzZWxmLl9wYXJzZXIuTm90YXRpb25EZWNsSGFuZGxlciA9IHNlbGYubm90YXRpb25fZGVjbAorICAgICAgICBzZWxmLl9wYXJzZXIuU3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlciA9IHNlbGYuc3RhcnRfbmFtZXNwYWNlX2RlY2wKKyAgICAgICAgc2VsZi5fcGFyc2VyLkVuZE5hbWVzcGFjZURlY2xIYW5kbGVyID0gc2VsZi5lbmRfbmFtZXNwYWNlX2RlY2wKKworICAgICAgICBzZWxmLl9kZWNsX2hhbmRsZXJfcHJvcCA9IE5vbmUKKyAgICAgICAgaWYgc2VsZi5fbGV4X2hhbmRsZXJfcHJvcDoKKyAgICAgICAgICAgIHNlbGYuX3Jlc2V0X2xleF9oYW5kbGVyX3Byb3AoKQorIyAgICAgICAgIHNlbGYuX3BhcnNlci5EZWZhdWx0SGFuZGxlciA9CisjICAgICAgICAgc2VsZi5fcGFyc2VyLkRlZmF1bHRIYW5kbGVyRXhwYW5kID0KKyMgICAgICAgICBzZWxmLl9wYXJzZXIuTm90U3RhbmRhbG9uZUhhbmRsZXIgPQorICAgICAgICBzZWxmLl9wYXJzZXIuRXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyID0gc2VsZi5leHRlcm5hbF9lbnRpdHlfcmVmCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlci5Ta2lwcGVkRW50aXR5SGFuZGxlciA9IHNlbGYuc2tpcHBlZF9lbnRpdHlfaGFuZGxlcgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAjIFRoaXMgcHlleHBhdCBkb2VzIG5vdCBzdXBwb3J0IFNraXBwZWRFbnRpdHkKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5fcGFyc2VyLlNldFBhcmFtRW50aXR5UGFyc2luZygKKyAgICAgICAgICAgIGV4cGF0LlhNTF9QQVJBTV9FTlRJVFlfUEFSU0lOR19VTkxFU1NfU1RBTkRBTE9ORSkKKworICAgICAgICBzZWxmLl9wYXJzaW5nID0gMAorICAgICAgICBzZWxmLl9lbnRpdHlfc3RhY2sgPSBbXQorCisgICAgIyBMb2NhdG9yIG1ldGhvZHMKKworICAgIGRlZiBnZXRDb2x1bW5OdW1iZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BhcnNlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlci5FcnJvckNvbHVtbk51bWJlcgorCisgICAgZGVmIGdldExpbmVOdW1iZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BhcnNlciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlci5FcnJvckxpbmVOdW1iZXIKKworICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3NvdXJjZS5nZXRQdWJsaWNJZCgpCisKKyAgICBkZWYgZ2V0U3lzdGVtSWQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9zb3VyY2UuZ2V0U3lzdGVtSWQoKQorCisgICAgIyBldmVudCBoYW5kbGVycworICAgIGRlZiBzdGFydF9lbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnN0YXJ0RWxlbWVudChuYW1lLCBBdHRyaWJ1dGVzSW1wbChhdHRycykpCisKKyAgICBkZWYgZW5kX2VsZW1lbnQoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5lbmRFbGVtZW50KG5hbWUpCisKKyAgICBkZWYgc3RhcnRfZWxlbWVudF9ucyhzZWxmLCBuYW1lLCBhdHRycyk6CisgICAgICAgIHBhaXIgPSBuYW1lLnNwbGl0KCkKKyAgICAgICAgaWYgbGVuKHBhaXIpID09IDE6CisgICAgICAgICAgICAjIG5vIG5hbWVzcGFjZQorICAgICAgICAgICAgcGFpciA9IChOb25lLCBuYW1lKQorICAgICAgICBlbGlmIGxlbihwYWlyKSA9PSAzOgorICAgICAgICAgICAgcGFpciA9IHBhaXJbMF0sIHBhaXJbMV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICAgICAgICAgIHBhaXIgPSB0dXBsZShwYWlyKQorCisgICAgICAgIG5ld2F0dHJzID0ge30KKyAgICAgICAgcW5hbWVzID0ge30KKyAgICAgICAgZm9yIChhbmFtZSwgdmFsdWUpIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBwYXJ0cyA9IGFuYW1lLnNwbGl0KCkKKyAgICAgICAgICAgIGxlbmd0aCA9IGxlbihwYXJ0cykKKyAgICAgICAgICAgIGlmIGxlbmd0aCA9PSAxOgorICAgICAgICAgICAgICAgICMgbm8gbmFtZXNwYWNlCisgICAgICAgICAgICAgICAgcW5hbWUgPSBhbmFtZQorICAgICAgICAgICAgICAgIGFwYWlyID0gKE5vbmUsIGFuYW1lKQorICAgICAgICAgICAgZWxpZiBsZW5ndGggPT0gMzoKKyAgICAgICAgICAgICAgICBxbmFtZSA9ICIlczolcyIgJSAocGFydHNbMl0sIHBhcnRzWzFdKQorICAgICAgICAgICAgICAgIGFwYWlyID0gcGFydHNbMF0sIHBhcnRzWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgZGVmYXVsdCBuYW1lc3BhY2UKKyAgICAgICAgICAgICAgICBxbmFtZSA9IHBhcnRzWzFdCisgICAgICAgICAgICAgICAgYXBhaXIgPSB0dXBsZShwYXJ0cykKKworICAgICAgICAgICAgbmV3YXR0cnNbYXBhaXJdID0gdmFsdWUKKyAgICAgICAgICAgIHFuYW1lc1thcGFpcl0gPSBxbmFtZQorCisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5zdGFydEVsZW1lbnROUyhwYWlyLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc05TSW1wbChuZXdhdHRycywgcW5hbWVzKSkKKworICAgIGRlZiBlbmRfZWxlbWVudF9ucyhzZWxmLCBuYW1lKToKKyAgICAgICAgcGFpciA9IG5hbWUuc3BsaXQoKQorICAgICAgICBpZiBsZW4ocGFpcikgPT0gMToKKyAgICAgICAgICAgIHBhaXIgPSAoTm9uZSwgbmFtZSkKKyAgICAgICAgZWxpZiBsZW4ocGFpcikgPT0gMzoKKyAgICAgICAgICAgIHBhaXIgPSBwYWlyWzBdLCBwYWlyWzFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYWlyID0gdHVwbGUocGFpcikKKworICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuZW5kRWxlbWVudE5TKHBhaXIsIE5vbmUpCisKKyAgICAjIHRoaXMgaXMgbm90IHVzZWQgKGNhbGwgZGlyZWN0bHkgdG8gQ29udGVudEhhbmRsZXIpCisgICAgZGVmIHByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb24oc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIGRhdGEpCisKKyAgICAjIHRoaXMgaXMgbm90IHVzZWQgKGNhbGwgZGlyZWN0bHkgdG8gQ29udGVudEhhbmRsZXIpCisgICAgZGVmIGNoYXJhY3Rlcl9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuY2hhcmFjdGVycyhkYXRhKQorCisgICAgZGVmIHN0YXJ0X25hbWVzcGFjZV9kZWNsKHNlbGYsIHByZWZpeCwgdXJpKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIHVyaSkKKworICAgIGRlZiBlbmRfbmFtZXNwYWNlX2RlY2woc2VsZiwgcHJlZml4KToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLmVuZFByZWZpeE1hcHBpbmcocHJlZml4KQorCisgICAgZGVmIHN0YXJ0X2RvY3R5cGVfZGVjbChzZWxmLCBuYW1lLCBzeXNpZCwgcHViaWQsIGhhc19pbnRlcm5hbF9zdWJzZXQpOgorICAgICAgICBzZWxmLl9sZXhfaGFuZGxlcl9wcm9wLnN0YXJ0RFREKG5hbWUsIHB1YmlkLCBzeXNpZCkKKworICAgIGRlZiB1bnBhcnNlZF9lbnRpdHlfZGVjbChzZWxmLCBuYW1lLCBiYXNlLCBzeXNpZCwgcHViaWQsIG5vdGF0aW9uX25hbWUpOgorICAgICAgICBzZWxmLl9kdGRfaGFuZGxlci51bnBhcnNlZEVudGl0eURlY2wobmFtZSwgcHViaWQsIHN5c2lkLCBub3RhdGlvbl9uYW1lKQorCisgICAgZGVmIG5vdGF0aW9uX2RlY2woc2VsZiwgbmFtZSwgYmFzZSwgc3lzaWQsIHB1YmlkKToKKyAgICAgICAgc2VsZi5fZHRkX2hhbmRsZXIubm90YXRpb25EZWNsKG5hbWUsIHB1YmlkLCBzeXNpZCkKKworICAgIGRlZiBleHRlcm5hbF9lbnRpdHlfcmVmKHNlbGYsIGNvbnRleHQsIGJhc2UsIHN5c2lkLCBwdWJpZCk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9leHRlcm5hbF9nZXM6CisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgICAgIHNvdXJjZSA9IHNlbGYuX2VudF9oYW5kbGVyLnJlc29sdmVFbnRpdHkocHViaWQsIHN5c2lkKQorICAgICAgICBzb3VyY2UgPSBzYXh1dGlscy5wcmVwYXJlX2lucHV0X3NvdXJjZShzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3NvdXJjZS5nZXRTeXN0ZW1JZCgpIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiKQorCisgICAgICAgIHNlbGYuX2VudGl0eV9zdGFjay5hcHBlbmQoKHNlbGYuX3BhcnNlciwgc2VsZi5fc291cmNlKSkKKyAgICAgICAgc2VsZi5fcGFyc2VyID0gc2VsZi5fcGFyc2VyLkV4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlKGNvbnRleHQpCisgICAgICAgIHNlbGYuX3NvdXJjZSA9IHNvdXJjZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHhtbHJlYWRlci5JbmNyZW1lbnRhbFBhcnNlci5wYXJzZShzZWxmLCBzb3VyY2UpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHJldHVybiAwICAjIEZJWE1FOiBzYXZlIGVycm9yIGluZm8gaGVyZT8KKworICAgICAgICAoc2VsZi5fcGFyc2VyLCBzZWxmLl9zb3VyY2UpID0gc2VsZi5fZW50aXR5X3N0YWNrWy0xXQorICAgICAgICBkZWwgc2VsZi5fZW50aXR5X3N0YWNrWy0xXQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIHNraXBwZWRfZW50aXR5X2hhbmRsZXIoc2VsZiwgbmFtZSwgaXNfcGUpOgorICAgICAgICBpZiBpc19wZToKKyAgICAgICAgICAgICMgVGhlIFNBWCBzcGVjIHJlcXVpcmVzIHRvIHJlcG9ydCBza2lwcGVkIFBFcyB3aXRoIGEgJyUnCisgICAgICAgICAgICBuYW1lID0gJyUnK25hbWUKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnNraXBwZWRFbnRpdHkobmFtZSkKKworIyAtLS0KKworZGVmIGNyZWF0ZV9wYXJzZXIoKmFyZ3MsICoqa3dhcmdzKToKKyAgICByZXR1cm4gRXhwYXRQYXJzZXIoKmFyZ3MsICoqa3dhcmdzKQorCisjIC0tLQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGltcG9ydCB4bWwuc2F4LnNheHV0aWxzCisgICAgcCA9IGNyZWF0ZV9wYXJzZXIoKQorICAgIHAuc2V0Q29udGVudEhhbmRsZXIoeG1sLnNheC5zYXh1dGlscy5YTUxHZW5lcmF0b3IoKSkKKyAgICBwLnNldEVycm9ySGFuZGxlcih4bWwuc2F4LkVycm9ySGFuZGxlcigpKQorICAgIHAucGFyc2UoImh0dHA6Ly93d3cuaWJpYmxpby5vcmcveG1sL2V4YW1wbGVzL3NoYWtlc3BlYXJlL2hhbWxldC54bWwiKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5YyBiL2xpYi9weXRob24yLjcveG1sL3NheC9leHBhdHJlYWRlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiOGY2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9leHBhdHJlYWRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L2V4cGF0cmVhZGVyLnB5byBiL2xpYi9weXRob24yLjcveG1sL3NheC9leHBhdHJlYWRlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJiOGY2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9leHBhdHJlYWRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L2hhbmRsZXIucHkgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvaGFuZGxlci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L2hhbmRsZXIucHkKQEAgLTAsMCArMSwzNDIgQEAKKyIiIgorVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGNvcmUgY2xhc3NlcyBvZiB2ZXJzaW9uIDIuMCBvZiBTQVggZm9yIFB5dGhvbi4KK1RoaXMgZmlsZSBwcm92aWRlcyBvbmx5IGRlZmF1bHQgY2xhc3NlcyB3aXRoIGFic29sdXRlbHkgbWluaW11bQorZnVuY3Rpb25hbGl0eSwgZnJvbSB3aGljaCBkcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMgY2FuIGJlIHN1YmNsYXNzZWQuCisKK01hbnkgb2YgdGhlc2UgY2xhc3NlcyBhcmUgZW1wdHkgYW5kIGFyZSBpbmNsdWRlZCBvbmx5IGFzIGRvY3VtZW50YXRpb24KK29mIHRoZSBpbnRlcmZhY2VzLgorCiskSWQkCisiIiIKKwordmVyc2lvbiA9ICcyLjBiZXRhJworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBIQU5ETEVSIElOVEVSRkFDRVMKKyMKKyM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgPT09PT0gRVJST1JIQU5ETEVSID09PT09CisKK2NsYXNzIEVycm9ySGFuZGxlcjoKKyAgICAiIiJCYXNpYyBpbnRlcmZhY2UgZm9yIFNBWCBlcnJvciBoYW5kbGVycy4KKworICAgIElmIHlvdSBjcmVhdGUgYW4gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZSwgdGhlbgorICAgIHJlZ2lzdGVyIHRoZSBvYmplY3Qgd2l0aCB5b3VyIFhNTFJlYWRlciwgdGhlIHBhcnNlciB3aWxsIGNhbGwgdGhlCisgICAgbWV0aG9kcyBpbiB5b3VyIG9iamVjdCB0byByZXBvcnQgYWxsIHdhcm5pbmdzIGFuZCBlcnJvcnMuIFRoZXJlCisgICAgYXJlIHRocmVlIGxldmVscyBvZiBlcnJvcnMgYXZhaWxhYmxlOiB3YXJuaW5ncywgKHBvc3NpYmx5KQorICAgIHJlY292ZXJhYmxlIGVycm9ycywgYW5kIHVucmVjb3ZlcmFibGUgZXJyb3JzLiBBbGwgbWV0aG9kcyB0YWtlIGEKKyAgICBTQVhQYXJzZUV4Y2VwdGlvbiBhcyB0aGUgb25seSBwYXJhbWV0ZXIuIiIiCisKKyAgICBkZWYgZXJyb3Ioc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgIkhhbmRsZSBhIHJlY292ZXJhYmxlIGVycm9yLiIKKyAgICAgICAgcmFpc2UgZXhjZXB0aW9uCisKKyAgICBkZWYgZmF0YWxFcnJvcihzZWxmLCBleGNlcHRpb24pOgorICAgICAgICAiSGFuZGxlIGEgbm9uLXJlY292ZXJhYmxlIGVycm9yLiIKKyAgICAgICAgcmFpc2UgZXhjZXB0aW9uCisKKyAgICBkZWYgd2FybmluZyhzZWxmLCBleGNlcHRpb24pOgorICAgICAgICAiSGFuZGxlIGEgd2FybmluZy4iCisgICAgICAgIHByaW50IGV4Y2VwdGlvbgorCisKKyMgPT09PT0gQ09OVEVOVEhBTkRMRVIgPT09PT0KKworY2xhc3MgQ29udGVudEhhbmRsZXI6CisgICAgIiIiSW50ZXJmYWNlIGZvciByZWNlaXZpbmcgbG9naWNhbCBkb2N1bWVudCBjb250ZW50IGV2ZW50cy4KKworICAgIFRoaXMgaXMgdGhlIG1haW4gY2FsbGJhY2sgaW50ZXJmYWNlIGluIFNBWCwgYW5kIHRoZSBvbmUgbW9zdAorICAgIGltcG9ydGFudCB0byBhcHBsaWNhdGlvbnMuIFRoZSBvcmRlciBvZiBldmVudHMgaW4gdGhpcyBpbnRlcmZhY2UKKyAgICBtaXJyb3JzIHRoZSBvcmRlciBvZiB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGRvY3VtZW50LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl9sb2NhdG9yID0gTm9uZQorCisgICAgZGVmIHNldERvY3VtZW50TG9jYXRvcihzZWxmLCBsb2NhdG9yKToKKyAgICAgICAgIiIiQ2FsbGVkIGJ5IHRoZSBwYXJzZXIgdG8gZ2l2ZSB0aGUgYXBwbGljYXRpb24gYSBsb2NhdG9yIGZvcgorICAgICAgICBsb2NhdGluZyB0aGUgb3JpZ2luIG9mIGRvY3VtZW50IGV2ZW50cy4KKworICAgICAgICBTQVggcGFyc2VycyBhcmUgc3Ryb25nbHkgZW5jb3VyYWdlZCAodGhvdWdoIG5vdCBhYnNvbHV0ZWx5CisgICAgICAgIHJlcXVpcmVkKSB0byBzdXBwbHkgYSBsb2NhdG9yOiBpZiBpdCBkb2VzIHNvLCBpdCBtdXN0IHN1cHBseQorICAgICAgICB0aGUgbG9jYXRvciB0byB0aGUgYXBwbGljYXRpb24gYnkgaW52b2tpbmcgdGhpcyBtZXRob2QgYmVmb3JlCisgICAgICAgIGludm9raW5nIGFueSBvZiB0aGUgb3RoZXIgbWV0aG9kcyBpbiB0aGUgRG9jdW1lbnRIYW5kbGVyCisgICAgICAgIGludGVyZmFjZS4KKworICAgICAgICBUaGUgbG9jYXRvciBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIGRldGVybWluZSB0aGUgZW5kCisgICAgICAgIHBvc2l0aW9uIG9mIGFueSBkb2N1bWVudC1yZWxhdGVkIGV2ZW50LCBldmVuIGlmIHRoZSBwYXJzZXIgaXMKKyAgICAgICAgbm90IHJlcG9ydGluZyBhbiBlcnJvci4gVHlwaWNhbGx5LCB0aGUgYXBwbGljYXRpb24gd2lsbCB1c2UKKyAgICAgICAgdGhpcyBpbmZvcm1hdGlvbiBmb3IgcmVwb3J0aW5nIGl0cyBvd24gZXJyb3JzIChzdWNoIGFzCisgICAgICAgIGNoYXJhY3RlciBjb250ZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggYW4gYXBwbGljYXRpb24ncworICAgICAgICBidXNpbmVzcyBydWxlcykuIFRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSB0aGUgbG9jYXRvciBpcworICAgICAgICBwcm9iYWJseSBub3Qgc3VmZmljaWVudCBmb3IgdXNlIHdpdGggYSBzZWFyY2ggZW5naW5lLgorCisgICAgICAgIE5vdGUgdGhhdCB0aGUgbG9jYXRvciB3aWxsIHJldHVybiBjb3JyZWN0IGluZm9ybWF0aW9uIG9ubHkKKyAgICAgICAgZHVyaW5nIHRoZSBpbnZvY2F0aW9uIG9mIHRoZSBldmVudHMgaW4gdGhpcyBpbnRlcmZhY2UuIFRoZQorICAgICAgICBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gdXNlIGl0IGF0IGFueSBvdGhlciB0aW1lLiIiIgorICAgICAgICBzZWxmLl9sb2NhdG9yID0gbG9jYXRvcgorCisgICAgZGVmIHN0YXJ0RG9jdW1lbnQoc2VsZik6CisgICAgICAgICIiIlJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBiZWdpbm5pbmcgb2YgYSBkb2N1bWVudC4KKworICAgICAgICBUaGUgU0FYIHBhcnNlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBvbmx5IG9uY2UsIGJlZm9yZSBhbnkKKyAgICAgICAgb3RoZXIgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZSBvciBpbiBEVERIYW5kbGVyIChleGNlcHQgZm9yCisgICAgICAgIHNldERvY3VtZW50TG9jYXRvcikuIiIiCisKKyAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6CisgICAgICAgICIiIlJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYSBkb2N1bWVudC4KKworICAgICAgICBUaGUgU0FYIHBhcnNlciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBvbmx5IG9uY2UsIGFuZCBpdCB3aWxsCisgICAgICAgIGJlIHRoZSBsYXN0IG1ldGhvZCBpbnZva2VkIGR1cmluZyB0aGUgcGFyc2UuIFRoZSBwYXJzZXIgc2hhbGwKKyAgICAgICAgbm90IGludm9rZSB0aGlzIG1ldGhvZCB1bnRpbCBpdCBoYXMgZWl0aGVyIGFiYW5kb25lZCBwYXJzaW5nCisgICAgICAgIChiZWNhdXNlIG9mIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IpIG9yIHJlYWNoZWQgdGhlIGVuZCBvZgorICAgICAgICBpbnB1dC4iIiIKKworICAgIGRlZiBzdGFydFByZWZpeE1hcHBpbmcoc2VsZiwgcHJlZml4LCB1cmkpOgorICAgICAgICAiIiJCZWdpbiB0aGUgc2NvcGUgb2YgYSBwcmVmaXgtVVJJIE5hbWVzcGFjZSBtYXBwaW5nLgorCisgICAgICAgIFRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgZXZlbnQgaXMgbm90IG5lY2Vzc2FyeSBmb3Igbm9ybWFsCisgICAgICAgIE5hbWVzcGFjZSBwcm9jZXNzaW5nOiB0aGUgU0FYIFhNTCByZWFkZXIgd2lsbCBhdXRvbWF0aWNhbGx5CisgICAgICAgIHJlcGxhY2UgcHJlZml4ZXMgZm9yIGVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcyB3aGVuIHRoZQorICAgICAgICBodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyBmZWF0dXJlIGlzIHRydWUgKHRoZQorICAgICAgICBkZWZhdWx0KS4KKworICAgICAgICBUaGVyZSBhcmUgY2FzZXMsIGhvd2V2ZXIsIHdoZW4gYXBwbGljYXRpb25zIG5lZWQgdG8gdXNlCisgICAgICAgIHByZWZpeGVzIGluIGNoYXJhY3RlciBkYXRhIG9yIGluIGF0dHJpYnV0ZSB2YWx1ZXMsIHdoZXJlIHRoZXkKKyAgICAgICAgY2Fubm90IHNhZmVseSBiZSBleHBhbmRlZCBhdXRvbWF0aWNhbGx5OyB0aGUKKyAgICAgICAgc3RhcnQvZW5kUHJlZml4TWFwcGluZyBldmVudCBzdXBwbGllcyB0aGUgaW5mb3JtYXRpb24gdG8gdGhlCisgICAgICAgIGFwcGxpY2F0aW9uIHRvIGV4cGFuZCBwcmVmaXhlcyBpbiB0aG9zZSBjb250ZXh0cyBpdHNlbGYsIGlmCisgICAgICAgIG5lY2Vzc2FyeS4KKworICAgICAgICBOb3RlIHRoYXQgc3RhcnQvZW5kUHJlZml4TWFwcGluZyBldmVudHMgYXJlIG5vdCBndWFyYW50ZWVkIHRvCisgICAgICAgIGJlIHByb3Blcmx5IG5lc3RlZCByZWxhdGl2ZSB0byBlYWNoLW90aGVyOiBhbGwKKyAgICAgICAgc3RhcnRQcmVmaXhNYXBwaW5nIGV2ZW50cyB3aWxsIG9jY3VyIGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZworICAgICAgICBzdGFydEVsZW1lbnQgZXZlbnQsIGFuZCBhbGwgZW5kUHJlZml4TWFwcGluZyBldmVudHMgd2lsbCBvY2N1cgorICAgICAgICBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBlbmRFbGVtZW50IGV2ZW50LCBidXQgdGhlaXIgb3JkZXIgaXMKKyAgICAgICAgbm90IGd1YXJhbnRlZWQuIiIiCisKKyAgICBkZWYgZW5kUHJlZml4TWFwcGluZyhzZWxmLCBwcmVmaXgpOgorICAgICAgICAiIiJFbmQgdGhlIHNjb3BlIG9mIGEgcHJlZml4LVVSSSBtYXBwaW5nLgorCisgICAgICAgIFNlZSBzdGFydFByZWZpeE1hcHBpbmcgZm9yIGRldGFpbHMuIFRoaXMgZXZlbnQgd2lsbCBhbHdheXMKKyAgICAgICAgb2NjdXIgYWZ0ZXIgdGhlIGNvcnJlc3BvbmRpbmcgZW5kRWxlbWVudCBldmVudCwgYnV0IHRoZSBvcmRlcgorICAgICAgICBvZiBlbmRQcmVmaXhNYXBwaW5nIGV2ZW50cyBpcyBub3Qgb3RoZXJ3aXNlIGd1YXJhbnRlZWQuIiIiCisKKyAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgIiIiU2lnbmFscyB0aGUgc3RhcnQgb2YgYW4gZWxlbWVudCBpbiBub24tbmFtZXNwYWNlIG1vZGUuCisKKyAgICAgICAgVGhlIG5hbWUgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSByYXcgWE1MIDEuMCBuYW1lIG9mIHRoZQorICAgICAgICBlbGVtZW50IHR5cGUgYXMgYSBzdHJpbmcgYW5kIHRoZSBhdHRycyBwYXJhbWV0ZXIgaG9sZHMgYW4KKyAgICAgICAgaW5zdGFuY2Ugb2YgdGhlIEF0dHJpYnV0ZXMgY2xhc3MgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBvZgorICAgICAgICB0aGUgZWxlbWVudC4iIiIKKworICAgIGRlZiBlbmRFbGVtZW50KHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJTaWduYWxzIHRoZSBlbmQgb2YgYW4gZWxlbWVudCBpbiBub24tbmFtZXNwYWNlIG1vZGUuCisKKyAgICAgICAgVGhlIG5hbWUgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUsIGp1c3QKKyAgICAgICAgYXMgd2l0aCB0aGUgc3RhcnRFbGVtZW50IGV2ZW50LiIiIgorCisgICAgZGVmIHN0YXJ0RWxlbWVudE5TKHNlbGYsIG5hbWUsIHFuYW1lLCBhdHRycyk6CisgICAgICAgICIiIlNpZ25hbHMgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQgaW4gbmFtZXNwYWNlIG1vZGUuCisKKyAgICAgICAgVGhlIG5hbWUgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUgYXMgYQorICAgICAgICAodXJpLCBsb2NhbG5hbWUpIHR1cGxlLCB0aGUgcW5hbWUgcGFyYW1ldGVyIHRoZSByYXcgWE1MIDEuMAorICAgICAgICBuYW1lIHVzZWQgaW4gdGhlIHNvdXJjZSBkb2N1bWVudCwgYW5kIHRoZSBhdHRycyBwYXJhbWV0ZXIKKyAgICAgICAgaG9sZHMgYW4gaW5zdGFuY2Ugb2YgdGhlIEF0dHJpYnV0ZXMgY2xhc3MgY29udGFpbmluZyB0aGUKKyAgICAgICAgYXR0cmlidXRlcyBvZiB0aGUgZWxlbWVudC4KKworICAgICAgICBUaGUgdXJpIHBhcnQgb2YgdGhlIG5hbWUgdHVwbGUgaXMgTm9uZSBmb3IgZWxlbWVudHMgd2hpY2ggaGF2ZQorICAgICAgICBubyBuYW1lc3BhY2UuIiIiCisKKyAgICBkZWYgZW5kRWxlbWVudE5TKHNlbGYsIG5hbWUsIHFuYW1lKToKKyAgICAgICAgIiIiU2lnbmFscyB0aGUgZW5kIG9mIGFuIGVsZW1lbnQgaW4gbmFtZXNwYWNlIG1vZGUuCisKKyAgICAgICAgVGhlIG5hbWUgcGFyYW1ldGVyIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUsIGp1c3QKKyAgICAgICAgYXMgd2l0aCB0aGUgc3RhcnRFbGVtZW50TlMgZXZlbnQuIiIiCisKKyAgICBkZWYgY2hhcmFjdGVycyhzZWxmLCBjb250ZW50KToKKyAgICAgICAgIiIiUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhcmFjdGVyIGRhdGEuCisKKyAgICAgICAgVGhlIFBhcnNlciB3aWxsIGNhbGwgdGhpcyBtZXRob2QgdG8gcmVwb3J0IGVhY2ggY2h1bmsgb2YKKyAgICAgICAgY2hhcmFjdGVyIGRhdGEuIFNBWCBwYXJzZXJzIG1heSByZXR1cm4gYWxsIGNvbnRpZ3VvdXMKKyAgICAgICAgY2hhcmFjdGVyIGRhdGEgaW4gYSBzaW5nbGUgY2h1bmssIG9yIHRoZXkgbWF5IHNwbGl0IGl0IGludG8KKyAgICAgICAgc2V2ZXJhbCBjaHVua3M7IGhvd2V2ZXIsIGFsbCBvZiB0aGUgY2hhcmFjdGVycyBpbiBhbnkgc2luZ2xlCisgICAgICAgIGV2ZW50IG11c3QgY29tZSBmcm9tIHRoZSBzYW1lIGV4dGVybmFsIGVudGl0eSBzbyB0aGF0IHRoZQorICAgICAgICBMb2NhdG9yIHByb3ZpZGVzIHVzZWZ1bCBpbmZvcm1hdGlvbi4iIiIKKworICAgIGRlZiBpZ25vcmFibGVXaGl0ZXNwYWNlKHNlbGYsIHdoaXRlc3BhY2UpOgorICAgICAgICAiIiJSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiBpZ25vcmFibGUgd2hpdGVzcGFjZSBpbiBlbGVtZW50IGNvbnRlbnQuCisKKyAgICAgICAgVmFsaWRhdGluZyBQYXJzZXJzIG11c3QgdXNlIHRoaXMgbWV0aG9kIHRvIHJlcG9ydCBlYWNoIGNodW5rCisgICAgICAgIG9mIGlnbm9yYWJsZSB3aGl0ZXNwYWNlIChzZWUgdGhlIFczQyBYTUwgMS4wIHJlY29tbWVuZGF0aW9uLAorICAgICAgICBzZWN0aW9uIDIuMTApOiBub24tdmFsaWRhdGluZyBwYXJzZXJzIG1heSBhbHNvIHVzZSB0aGlzIG1ldGhvZAorICAgICAgICBpZiB0aGV5IGFyZSBjYXBhYmxlIG9mIHBhcnNpbmcgYW5kIHVzaW5nIGNvbnRlbnQgbW9kZWxzLgorCisgICAgICAgIFNBWCBwYXJzZXJzIG1heSByZXR1cm4gYWxsIGNvbnRpZ3VvdXMgd2hpdGVzcGFjZSBpbiBhIHNpbmdsZQorICAgICAgICBjaHVuaywgb3IgdGhleSBtYXkgc3BsaXQgaXQgaW50byBzZXZlcmFsIGNodW5rczsgaG93ZXZlciwgYWxsCisgICAgICAgIG9mIHRoZSBjaGFyYWN0ZXJzIGluIGFueSBzaW5nbGUgZXZlbnQgbXVzdCBjb21lIGZyb20gdGhlIHNhbWUKKyAgICAgICAgZXh0ZXJuYWwgZW50aXR5LCBzbyB0aGF0IHRoZSBMb2NhdG9yIHByb3ZpZGVzIHVzZWZ1bAorICAgICAgICBpbmZvcm1hdGlvbi4iIiIKKworICAgIGRlZiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgIiIiUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgorCisgICAgICAgIFRoZSBQYXJzZXIgd2lsbCBpbnZva2UgdGhpcyBtZXRob2Qgb25jZSBmb3IgZWFjaCBwcm9jZXNzaW5nCisgICAgICAgIGluc3RydWN0aW9uIGZvdW5kOiBub3RlIHRoYXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgbWF5IG9jY3VyCisgICAgICAgIGJlZm9yZSBvciBhZnRlciB0aGUgbWFpbiBkb2N1bWVudCBlbGVtZW50LgorCisgICAgICAgIEEgU0FYIHBhcnNlciBzaG91bGQgbmV2ZXIgcmVwb3J0IGFuIFhNTCBkZWNsYXJhdGlvbiAoWE1MIDEuMCwKKyAgICAgICAgc2VjdGlvbiAyLjgpIG9yIGEgdGV4dCBkZWNsYXJhdGlvbiAoWE1MIDEuMCwgc2VjdGlvbiA0LjMuMSkKKyAgICAgICAgdXNpbmcgdGhpcyBtZXRob2QuIiIiCisKKyAgICBkZWYgc2tpcHBlZEVudGl0eShzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgYSBza2lwcGVkIGVudGl0eS4KKworICAgICAgICBUaGUgUGFyc2VyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG9uY2UgZm9yIGVhY2ggZW50aXR5CisgICAgICAgIHNraXBwZWQuIE5vbi12YWxpZGF0aW5nIHByb2Nlc3NvcnMgbWF5IHNraXAgZW50aXRpZXMgaWYgdGhleQorICAgICAgICBoYXZlIG5vdCBzZWVuIHRoZSBkZWNsYXJhdGlvbnMgKGJlY2F1c2UsIGZvciBleGFtcGxlLCB0aGUKKyAgICAgICAgZW50aXR5IHdhcyBkZWNsYXJlZCBpbiBhbiBleHRlcm5hbCBEVEQgc3Vic2V0KS4gQWxsIHByb2Nlc3NvcnMKKyAgICAgICAgbWF5IHNraXAgZXh0ZXJuYWwgZW50aXRpZXMsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIHRoZQorICAgICAgICBodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyBhbmQgdGhlCisgICAgICAgIGh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1wYXJhbWV0ZXItZW50aXRpZXMKKyAgICAgICAgcHJvcGVydGllcy4iIiIKKworCisjID09PT09IERUREhhbmRsZXIgPT09PT0KKworY2xhc3MgRFRESGFuZGxlcjoKKyAgICAiIiJIYW5kbGUgRFREIGV2ZW50cy4KKworICAgIFRoaXMgaW50ZXJmYWNlIHNwZWNpZmllcyBvbmx5IHRob3NlIERURCBldmVudHMgcmVxdWlyZWQgZm9yIGJhc2ljCisgICAgcGFyc2luZyAodW5wYXJzZWQgZW50aXRpZXMgYW5kIGF0dHJpYnV0ZXMpLiIiIgorCisgICAgZGVmIG5vdGF0aW9uRGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICAiSGFuZGxlIGEgbm90YXRpb24gZGVjbGFyYXRpb24gZXZlbnQuIgorCisgICAgZGVmIHVucGFyc2VkRW50aXR5RGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKToKKyAgICAgICAgIkhhbmRsZSBhbiB1bnBhcnNlZCBlbnRpdHkgZGVjbGFyYXRpb24gZXZlbnQuIgorCisKKyMgPT09PT0gRU5USVRZUkVTT0xWRVIgPT09PT0KKworY2xhc3MgRW50aXR5UmVzb2x2ZXI6CisgICAgIiIiQmFzaWMgaW50ZXJmYWNlIGZvciByZXNvbHZpbmcgZW50aXRpZXMuIElmIHlvdSBjcmVhdGUgYW4gb2JqZWN0CisgICAgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlLCB0aGVuIHJlZ2lzdGVyIHRoZSBvYmplY3Qgd2l0aCB5b3VyCisgICAgUGFyc2VyLCB0aGUgcGFyc2VyIHdpbGwgY2FsbCB0aGUgbWV0aG9kIGluIHlvdXIgb2JqZWN0IHRvCisgICAgcmVzb2x2ZSBhbGwgZXh0ZXJuYWwgZW50aXRpZXMuIE5vdGUgdGhhdCBEZWZhdWx0SGFuZGxlciBpbXBsZW1lbnRzCisgICAgdGhpcyBpbnRlcmZhY2Ugd2l0aCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIuIiIiCisKKyAgICBkZWYgcmVzb2x2ZUVudGl0eShzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICAiIiJSZXNvbHZlIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBvZiBhbiBlbnRpdHkgYW5kIHJldHVybiBlaXRoZXIKKyAgICAgICAgdGhlIHN5c3RlbSBpZGVudGlmaWVyIHRvIHJlYWQgZnJvbSBhcyBhIHN0cmluZywgb3IgYW4gSW5wdXRTb3VyY2UKKyAgICAgICAgdG8gcmVhZCBmcm9tLiIiIgorICAgICAgICByZXR1cm4gc3lzdGVtSWQKKworCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBDT1JFIEZFQVRVUkVTCisjCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitmZWF0dXJlX25hbWVzcGFjZXMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiCisjIHRydWU6IFBlcmZvcm0gTmFtZXNwYWNlIHByb2Nlc3NpbmcgKGRlZmF1bHQpLgorIyBmYWxzZTogT3B0aW9uYWxseSBkbyBub3QgcGVyZm9ybSBOYW1lc3BhY2UgcHJvY2Vzc2luZworIyAgICAgICAgKGltcGxpZXMgbmFtZXNwYWNlLXByZWZpeGVzKS4KKyMgYWNjZXNzOiAocGFyc2luZykgcmVhZC1vbmx5OyAobm90IHBhcnNpbmcpIHJlYWQvd3JpdGUKKworZmVhdHVyZV9uYW1lc3BhY2VfcHJlZml4ZXMgPSAiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIKKyMgdHJ1ZTogUmVwb3J0IHRoZSBvcmlnaW5hbCBwcmVmaXhlZCBuYW1lcyBhbmQgYXR0cmlidXRlcyB1c2VkIGZvciBOYW1lc3BhY2UKKyMgICAgICAgZGVjbGFyYXRpb25zLgorIyBmYWxzZTogRG8gbm90IHJlcG9ydCBhdHRyaWJ1dGVzIHVzZWQgZm9yIE5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIGFuZAorIyAgICAgICAgb3B0aW9uYWxseSBkbyBub3QgcmVwb3J0IG9yaWdpbmFsIHByZWZpeGVkIG5hbWVzIChkZWZhdWx0KS4KKyMgYWNjZXNzOiAocGFyc2luZykgcmVhZC1vbmx5OyAobm90IHBhcnNpbmcpIHJlYWQvd3JpdGUKKworZmVhdHVyZV9zdHJpbmdfaW50ZXJuaW5nID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9zdHJpbmctaW50ZXJuaW5nIgorIyB0cnVlOiBBbGwgZWxlbWVudCBuYW1lcywgcHJlZml4ZXMsIGF0dHJpYnV0ZSBuYW1lcywgTmFtZXNwYWNlIFVSSXMsIGFuZAorIyAgICAgICBsb2NhbCBuYW1lcyBhcmUgaW50ZXJuZWQgdXNpbmcgdGhlIGJ1aWx0LWluIGludGVybiBmdW5jdGlvbi4KKyMgZmFsc2U6IE5hbWVzIGFyZSBub3QgbmVjZXNzYXJpbHkgaW50ZXJuZWQsIGFsdGhvdWdoIHRoZXkgbWF5IGJlIChkZWZhdWx0KS4KKyMgYWNjZXNzOiAocGFyc2luZykgcmVhZC1vbmx5OyAobm90IHBhcnNpbmcpIHJlYWQvd3JpdGUKKworZmVhdHVyZV92YWxpZGF0aW9uID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIgorIyB0cnVlOiBSZXBvcnQgYWxsIHZhbGlkYXRpb24gZXJyb3JzIChpbXBsaWVzIGV4dGVybmFsLWdlbmVyYWwtZW50aXRpZXMgYW5kCisjICAgICAgIGV4dGVybmFsLXBhcmFtZXRlci1lbnRpdGllcykuCisjIGZhbHNlOiBEbyBub3QgcmVwb3J0IHZhbGlkYXRpb24gZXJyb3JzLgorIyBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQorCitmZWF0dXJlX2V4dGVybmFsX2dlcyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyIKKyMgdHJ1ZTogSW5jbHVkZSBhbGwgZXh0ZXJuYWwgZ2VuZXJhbCAodGV4dCkgZW50aXRpZXMuCisjIGZhbHNlOiBEbyBub3QgaW5jbHVkZSBleHRlcm5hbCBnZW5lcmFsIGVudGl0aWVzLgorIyBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQorCitmZWF0dXJlX2V4dGVybmFsX3BlcyA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtcGFyYW1ldGVyLWVudGl0aWVzIgorIyB0cnVlOiBJbmNsdWRlIGFsbCBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMsIGluY2x1ZGluZyB0aGUgZXh0ZXJuYWwKKyMgICAgICAgRFREIHN1YnNldC4KKyMgZmFsc2U6IERvIG5vdCBpbmNsdWRlIGFueSBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMsIGV2ZW4gdGhlIGV4dGVybmFsCisjICAgICAgICBEVEQgc3Vic2V0LgorIyBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQorCithbGxfZmVhdHVyZXMgPSBbZmVhdHVyZV9uYW1lc3BhY2VzLAorICAgICAgICAgICAgICAgIGZlYXR1cmVfbmFtZXNwYWNlX3ByZWZpeGVzLAorICAgICAgICAgICAgICAgIGZlYXR1cmVfc3RyaW5nX2ludGVybmluZywKKyAgICAgICAgICAgICAgICBmZWF0dXJlX3ZhbGlkYXRpb24sCisgICAgICAgICAgICAgICAgZmVhdHVyZV9leHRlcm5hbF9nZXMsCisgICAgICAgICAgICAgICAgZmVhdHVyZV9leHRlcm5hbF9wZXNdCisKKworIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgQ09SRSBQUk9QRVJUSUVTCisjCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitwcm9wZXJ0eV9sZXhpY2FsX2hhbmRsZXIgPSAiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIgorIyBkYXRhIHR5cGU6IHhtbC5zYXguc2F4MmxpYi5MZXhpY2FsSGFuZGxlcgorIyBkZXNjcmlwdGlvbjogQW4gb3B0aW9uYWwgZXh0ZW5zaW9uIGhhbmRsZXIgZm9yIGxleGljYWwgZXZlbnRzIGxpa2UgY29tbWVudHMuCisjIGFjY2VzczogcmVhZC93cml0ZQorCitwcm9wZXJ0eV9kZWNsYXJhdGlvbl9oYW5kbGVyID0gImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2RlY2xhcmF0aW9uLWhhbmRsZXIiCisjIGRhdGEgdHlwZTogeG1sLnNheC5zYXgybGliLkRlY2xIYW5kbGVyCisjIGRlc2NyaXB0aW9uOiBBbiBvcHRpb25hbCBleHRlbnNpb24gaGFuZGxlciBmb3IgRFRELXJlbGF0ZWQgZXZlbnRzIG90aGVyCisjICAgICAgICAgICAgICB0aGFuIG5vdGF0aW9ucyBhbmQgdW5wYXJzZWQgZW50aXRpZXMuCisjIGFjY2VzczogcmVhZC93cml0ZQorCitwcm9wZXJ0eV9kb21fbm9kZSA9ICJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kb20tbm9kZSIKKyMgZGF0YSB0eXBlOiBvcmcudzNjLmRvbS5Ob2RlCisjIGRlc2NyaXB0aW9uOiBXaGVuIHBhcnNpbmcsIHRoZSBjdXJyZW50IERPTSBub2RlIGJlaW5nIHZpc2l0ZWQgaWYgdGhpcyBpcworIyAgICAgICAgICAgICAgYSBET00gaXRlcmF0b3I7IHdoZW4gbm90IHBhcnNpbmcsIHRoZSByb290IERPTSBub2RlIGZvcgorIyAgICAgICAgICAgICAgaXRlcmF0aW9uLgorIyBhY2Nlc3M6IChwYXJzaW5nKSByZWFkLW9ubHk7IChub3QgcGFyc2luZykgcmVhZC93cml0ZQorCitwcm9wZXJ0eV94bWxfc3RyaW5nID0gImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL3htbC1zdHJpbmciCisjIGRhdGEgdHlwZTogU3RyaW5nCisjIGRlc2NyaXB0aW9uOiBUaGUgbGl0ZXJhbCBzdHJpbmcgb2YgY2hhcmFjdGVycyB0aGF0IHdhcyB0aGUgc291cmNlIGZvcgorIyAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZXZlbnQuCisjIGFjY2VzczogcmVhZC1vbmx5CisKK3Byb3BlcnR5X2VuY29kaW5nID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy9zYXgvcHJvcGVydGllcy9lbmNvZGluZyIKKyMgZGF0YSB0eXBlOiBTdHJpbmcKKyMgZGVzY3JpcHRpb246IFRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB0byBhc3N1bWUgZm9yIGlucHV0IGRhdGEuCisjIGFjY2Vzczogd3JpdGU6IHNldCB0aGUgZW5jb2RpbmcsIGUuZy4gZXN0YWJsaXNoZWQgYnkgYSBoaWdoZXItbGV2ZWwKKyMgICAgICAgICAgICAgICAgcHJvdG9jb2wuIE1heSBjaGFuZ2UgZHVyaW5nIHBhcnNpbmcgKGUuZy4gYWZ0ZXIKKyMgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBhIE1FVEEgdGFnKQorIyAgICAgICAgIHJlYWQ6ICByZXR1cm4gdGhlIGN1cnJlbnQgZW5jb2RpbmcgKHBvc3NpYmx5IGVzdGFibGlzaGVkIHRocm91Z2gKKyMgICAgICAgICAgICAgICAgYXV0by1kZXRlY3Rpb24uCisjIGluaXRpYWwgdmFsdWU6IFVURi04CisjCisKK3Byb3BlcnR5X2ludGVybmluZ19kaWN0ID0gImh0dHA6Ly93d3cucHl0aG9uLm9yZy9zYXgvcHJvcGVydGllcy9pbnRlcm5pbmctZGljdCIKKyMgZGF0YSB0eXBlOiBEaWN0aW9uYXJ5CisjIGRlc2NyaXB0aW9uOiBUaGUgZGljdGlvbmFyeSB1c2VkIHRvIGludGVybiBjb21tb24gc3RyaW5ncyBpbiB0aGUgZG9jdW1lbnQKKyMgYWNjZXNzOiB3cml0ZTogUmVxdWVzdCB0aGF0IHRoZSBwYXJzZXIgdXNlcyBhIHNwZWNpZmljIGRpY3Rpb25hcnksIHRvCisjICAgICAgICAgICAgICAgIGFsbG93IGludGVybmluZyBhY3Jvc3MgZGlmZmVyZW50IGRvY3VtZW50cworIyAgICAgICAgIHJlYWQ6ICByZXR1cm4gdGhlIGN1cnJlbnQgaW50ZXJuaW5nIGRpY3Rpb25hcnksIG9yIE5vbmUKKyMKKworYWxsX3Byb3BlcnRpZXMgPSBbcHJvcGVydHlfbGV4aWNhbF9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgcHJvcGVydHlfZG9tX25vZGUsCisgICAgICAgICAgICAgICAgICBwcm9wZXJ0eV9kZWNsYXJhdGlvbl9oYW5kbGVyLAorICAgICAgICAgICAgICAgICAgcHJvcGVydHlfeG1sX3N0cmluZywKKyAgICAgICAgICAgICAgICAgIHByb3BlcnR5X2VuY29kaW5nLAorICAgICAgICAgICAgICAgICAgcHJvcGVydHlfaW50ZXJuaW5nX2RpY3RdCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvaGFuZGxlci5weWMgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvaGFuZGxlci5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2MTYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9oYW5kbGVyLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvaGFuZGxlci5weW8gYi9saWIvcHl0aG9uMi43L3htbC9zYXgvaGFuZGxlci5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk2MTYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9oYW5kbGVyLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbC9zYXgvc2F4dXRpbHMucHkgYi9saWIvcHl0aG9uMi43L3htbC9zYXgvc2F4dXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4MWE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9zYXh1dGlscy5weQpAQCAtMCwwICsxLDM0NiBAQAorIiIiXAorQSBsaWJyYXJ5IG9mIHVzZWZ1bCBoZWxwZXIgY2xhc3NlcyB0byB0aGUgU0FYIGNsYXNzZXMsIGZvciB0aGUKK2NvbnZlbmllbmNlIG9mIGFwcGxpY2F0aW9uIGFuZCBkcml2ZXIgd3JpdGVycy4KKyIiIgorCitpbXBvcnQgb3MsIHVybHBhcnNlLCB1cmxsaWIsIHR5cGVzCitpbXBvcnQgaW8KK2ltcG9ydCBzeXMKK2ltcG9ydCBoYW5kbGVyCitpbXBvcnQgeG1scmVhZGVyCisKK3RyeToKKyAgICBfU3RyaW5nVHlwZXMgPSBbdHlwZXMuU3RyaW5nVHlwZSwgdHlwZXMuVW5pY29kZVR5cGVdCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgX1N0cmluZ1R5cGVzID0gW3R5cGVzLlN0cmluZ1R5cGVdCisKK2RlZiBfX2RpY3RfcmVwbGFjZShzLCBkKToKKyAgICAiIiJSZXBsYWNlIHN1YnN0cmluZ3Mgb2YgYSBzdHJpbmcgdXNpbmcgYSBkaWN0aW9uYXJ5LiIiIgorICAgIGZvciBrZXksIHZhbHVlIGluIGQuaXRlbXMoKToKKyAgICAgICAgcyA9IHMucmVwbGFjZShrZXksIHZhbHVlKQorICAgIHJldHVybiBzCisKK2RlZiBlc2NhcGUoZGF0YSwgZW50aXRpZXM9e30pOgorICAgICIiIkVzY2FwZSAmLCA8LCBhbmQgPiBpbiBhIHN0cmluZyBvZiBkYXRhLgorCisgICAgWW91IGNhbiBlc2NhcGUgb3RoZXIgc3RyaW5ncyBvZiBkYXRhIGJ5IHBhc3NpbmcgYSBkaWN0aW9uYXJ5IGFzCisgICAgdGhlIG9wdGlvbmFsIGVudGl0aWVzIHBhcmFtZXRlci4gIFRoZSBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbGwgYmUKKyAgICBzdHJpbmdzOyBlYWNoIGtleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuCisgICAgIiIiCisKKyAgICAjIG11c3QgZG8gYW1wZXJzYW5kIGZpcnN0CisgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiJiIsICImYW1wOyIpCisgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiPiIsICImZ3Q7IikKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCI8IiwgIiZsdDsiKQorICAgIGlmIGVudGl0aWVzOgorICAgICAgICBkYXRhID0gX19kaWN0X3JlcGxhY2UoZGF0YSwgZW50aXRpZXMpCisgICAgcmV0dXJuIGRhdGEKKworZGVmIHVuZXNjYXBlKGRhdGEsIGVudGl0aWVzPXt9KToKKyAgICAiIiJVbmVzY2FwZSAmYW1wOywgJmx0OywgYW5kICZndDsgaW4gYSBzdHJpbmcgb2YgZGF0YS4KKworICAgIFlvdSBjYW4gdW5lc2NhcGUgb3RoZXIgc3RyaW5ncyBvZiBkYXRhIGJ5IHBhc3NpbmcgYSBkaWN0aW9uYXJ5IGFzCisgICAgdGhlIG9wdGlvbmFsIGVudGl0aWVzIHBhcmFtZXRlci4gIFRoZSBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbGwgYmUKKyAgICBzdHJpbmdzOyBlYWNoIGtleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuCisgICAgIiIiCisgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgiJmx0OyIsICI8IikKKyAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCImZ3Q7IiwgIj4iKQorICAgIGlmIGVudGl0aWVzOgorICAgICAgICBkYXRhID0gX19kaWN0X3JlcGxhY2UoZGF0YSwgZW50aXRpZXMpCisgICAgIyBtdXN0IGRvIGFtcGVyc2FuZCBsYXN0CisgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgiJmFtcDsiLCAiJiIpCisKK2RlZiBxdW90ZWF0dHIoZGF0YSwgZW50aXRpZXM9e30pOgorICAgICIiIkVzY2FwZSBhbmQgcXVvdGUgYW4gYXR0cmlidXRlIHZhbHVlLgorCisgICAgRXNjYXBlICYsIDwsIGFuZCA+IGluIGEgc3RyaW5nIG9mIGRhdGEsIHRoZW4gcXVvdGUgaXQgZm9yIHVzZSBhcworICAgIGFuIGF0dHJpYnV0ZSB2YWx1ZS4gIFRoZSBcIiBjaGFyYWN0ZXIgd2lsbCBiZSBlc2NhcGVkIGFzIHdlbGwsIGlmCisgICAgbmVjZXNzYXJ5LgorCisgICAgWW91IGNhbiBlc2NhcGUgb3RoZXIgc3RyaW5ncyBvZiBkYXRhIGJ5IHBhc3NpbmcgYSBkaWN0aW9uYXJ5IGFzCisgICAgdGhlIG9wdGlvbmFsIGVudGl0aWVzIHBhcmFtZXRlci4gIFRoZSBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbGwgYmUKKyAgICBzdHJpbmdzOyBlYWNoIGtleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuCisgICAgIiIiCisgICAgZW50aXRpZXMgPSBlbnRpdGllcy5jb3B5KCkKKyAgICBlbnRpdGllcy51cGRhdGUoeydcbic6ICcmIzEwOycsICdccic6ICcmIzEzOycsICdcdCc6JyYjOTsnfSkKKyAgICBkYXRhID0gZXNjYXBlKGRhdGEsIGVudGl0aWVzKQorICAgIGlmICciJyBpbiBkYXRhOgorICAgICAgICBpZiAiJyIgaW4gZGF0YToKKyAgICAgICAgICAgIGRhdGEgPSAnIiVzIicgJSBkYXRhLnJlcGxhY2UoJyInLCAiJnF1b3Q7IikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSAiJyVzJyIgJSBkYXRhCisgICAgZWxzZToKKyAgICAgICAgZGF0YSA9ICciJXMiJyAlIGRhdGEKKyAgICByZXR1cm4gZGF0YQorCisKK2RlZiBfZ2V0dGV4dHdyaXRlcihvdXQsIGVuY29kaW5nKToKKyAgICBpZiBvdXQgaXMgTm9uZToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBvdXQgPSBzeXMuc3Rkb3V0CisKKyAgICBpZiBpc2luc3RhbmNlKG91dCwgaW8uUmF3SU9CYXNlKToKKyAgICAgICAgYnVmZmVyID0gaW8uQnVmZmVyZWRJT0Jhc2Uob3V0KQorICAgICAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIGZpbGUgb3BlbiB3aGVuIHRoZSBUZXh0SU9XcmFwcGVyIGlzCisgICAgICAgICMgZGVzdHJveWVkCisgICAgICAgIGJ1ZmZlci5jbG9zZSA9IGxhbWJkYTogTm9uZQorICAgIGVsc2U6CisgICAgICAgICMgVGhpcyBpcyB0byBoYW5kbGUgcGFzc2VkIG9iamVjdHMgdGhhdCBhcmVuJ3QgaW4gdGhlCisgICAgICAgICMgSU9CYXNlIGhpZXJhcmNoeSwgYnV0IGp1c3QgaGF2ZSBhIHdyaXRlIG1ldGhvZAorICAgICAgICBidWZmZXIgPSBpby5CdWZmZXJlZElPQmFzZSgpCisgICAgICAgIGJ1ZmZlci53cml0YWJsZSA9IGxhbWJkYTogVHJ1ZQorICAgICAgICBidWZmZXIud3JpdGUgPSBvdXQud3JpdGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBUZXh0SU9XcmFwcGVyIHVzZXMgdGhpcyBtZXRob2RzIHRvIGRldGVybWluZQorICAgICAgICAgICAgIyBpZiBCT00gKGZvciBVVEYtMTYsIGV0Yykgc2hvdWxkIGJlIGFkZGVkCisgICAgICAgICAgICBidWZmZXIuc2Vla2FibGUgPSBvdXQuc2Vla2FibGUKKyAgICAgICAgICAgIGJ1ZmZlci50ZWxsID0gb3V0LnRlbGwKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICMgd3JhcCBhIGJpbmFyeSB3cml0ZXIgd2l0aCBUZXh0SU9XcmFwcGVyCisgICAgY2xhc3MgVW5idWZmZXJlZFRleHRJT1dyYXBwZXIoaW8uVGV4dElPV3JhcHBlcik6CisgICAgICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgICAgIHN1cGVyKFVuYnVmZmVyZWRUZXh0SU9XcmFwcGVyLCBzZWxmKS53cml0ZShzKQorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgcmV0dXJuIFVuYnVmZmVyZWRUZXh0SU9XcmFwcGVyKGJ1ZmZlciwgZW5jb2Rpbmc9ZW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycz0neG1sY2hhcnJlZnJlcGxhY2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdsaW5lPSdcbicpCisKK2NsYXNzIFhNTEdlbmVyYXRvcihoYW5kbGVyLkNvbnRlbnRIYW5kbGVyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvdXQ9Tm9uZSwgZW5jb2Rpbmc9Imlzby04ODU5LTEiKToKKyAgICAgICAgaGFuZGxlci5Db250ZW50SGFuZGxlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBvdXQgPSBfZ2V0dGV4dHdyaXRlcihvdXQsIGVuY29kaW5nKQorICAgICAgICBzZWxmLl93cml0ZSA9IG91dC53cml0ZQorICAgICAgICBzZWxmLl9mbHVzaCA9IG91dC5mbHVzaAorICAgICAgICBzZWxmLl9uc19jb250ZXh0cyA9IFt7fV0gIyBjb250YWlucyB1cmkgLT4gcHJlZml4IGRpY3RzCisgICAgICAgIHNlbGYuX2N1cnJlbnRfY29udGV4dCA9IHNlbGYuX25zX2NvbnRleHRzWy0xXQorICAgICAgICBzZWxmLl91bmRlY2xhcmVkX25zX21hcHMgPSBbXQorICAgICAgICBzZWxmLl9lbmNvZGluZyA9IGVuY29kaW5nCisKKyAgICBkZWYgX3FuYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJCdWlsZHMgYSBxdWFsaWZpZWQgbmFtZSBmcm9tIGEgKG5zX3VybCwgbG9jYWxuYW1lKSBwYWlyIiIiCisgICAgICAgIGlmIG5hbWVbMF06CisgICAgICAgICAgICAjIFBlciBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UsIFRoZSAneG1sJyBwcmVmaXggaXMKKyAgICAgICAgICAgICMgYm91bmQgYnkgZGVmaW5pdGlvbiB0byBodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UuICBJdAorICAgICAgICAgICAgIyBkb2VzIG5vdCBuZWVkIHRvIGJlIGRlY2xhcmVkIGFuZCB3aWxsIG5vdCB1c3VhbGx5IGJlIGZvdW5kIGluCisgICAgICAgICAgICAjIHNlbGYuX2N1cnJlbnRfY29udGV4dC4KKyAgICAgICAgICAgIGlmICdodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UnID09IG5hbWVbMF06CisgICAgICAgICAgICAgICAgcmV0dXJuICd4bWw6JyArIG5hbWVbMV0KKyAgICAgICAgICAgICMgVGhlIG5hbWUgaXMgaW4gYSBub24tZW1wdHkgbmFtZXNwYWNlCisgICAgICAgICAgICBwcmVmaXggPSBzZWxmLl9jdXJyZW50X2NvbnRleHRbbmFtZVswXV0KKyAgICAgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgICAgICAjIElmIGl0IGlzIG5vdCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIHByZXBlbmQgdGhlIHByZWZpeAorICAgICAgICAgICAgICAgIHJldHVybiBwcmVmaXggKyAiOiIgKyBuYW1lWzFdCisgICAgICAgICMgUmV0dXJuIHRoZSB1bnF1YWxpZmllZCBuYW1lCisgICAgICAgIHJldHVybiBuYW1lWzFdCisKKyAgICAjIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMKKworICAgIGRlZiBzdGFydERvY3VtZW50KHNlbGYpOgorICAgICAgICBzZWxmLl93cml0ZSh1Jzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiVzIj8+XG4nICUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VuY29kaW5nKQorCisgICAgZGVmIGVuZERvY3VtZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9mbHVzaCgpCisKKyAgICBkZWYgc3RhcnRQcmVmaXhNYXBwaW5nKHNlbGYsIHByZWZpeCwgdXJpKToKKyAgICAgICAgc2VsZi5fbnNfY29udGV4dHMuYXBwZW5kKHNlbGYuX2N1cnJlbnRfY29udGV4dC5jb3B5KCkpCisgICAgICAgIHNlbGYuX2N1cnJlbnRfY29udGV4dFt1cmldID0gcHJlZml4CisgICAgICAgIHNlbGYuX3VuZGVjbGFyZWRfbnNfbWFwcy5hcHBlbmQoKHByZWZpeCwgdXJpKSkKKworICAgIGRlZiBlbmRQcmVmaXhNYXBwaW5nKHNlbGYsIHByZWZpeCk6CisgICAgICAgIHNlbGYuX2N1cnJlbnRfY29udGV4dCA9IHNlbGYuX25zX2NvbnRleHRzWy0xXQorICAgICAgICBkZWwgc2VsZi5fbnNfY29udGV4dHNbLTFdCisKKyAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKKyAgICAgICAgc2VsZi5fd3JpdGUodSc8JyArIG5hbWUpCisgICAgICAgIGZvciAobmFtZSwgdmFsdWUpIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICBzZWxmLl93cml0ZSh1JyAlcz0lcycgJSAobmFtZSwgcXVvdGVhdHRyKHZhbHVlKSkpCisgICAgICAgIHNlbGYuX3dyaXRlKHUnPicpCisKKyAgICBkZWYgZW5kRWxlbWVudChzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5fd3JpdGUodSc8LyVzPicgJSBuYW1lKQorCisgICAgZGVmIHN0YXJ0RWxlbWVudE5TKHNlbGYsIG5hbWUsIHFuYW1lLCBhdHRycyk6CisgICAgICAgIHNlbGYuX3dyaXRlKHUnPCcgKyBzZWxmLl9xbmFtZShuYW1lKSkKKworICAgICAgICBmb3IgcHJlZml4LCB1cmkgaW4gc2VsZi5fdW5kZWNsYXJlZF9uc19tYXBzOgorICAgICAgICAgICAgaWYgcHJlZml4OgorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlKHUnIHhtbG5zOiVzPSIlcyInICUgKHByZWZpeCwgdXJpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fd3JpdGUodScgeG1sbnM9IiVzIicgJSB1cmkpCisgICAgICAgIHNlbGYuX3VuZGVjbGFyZWRfbnNfbWFwcyA9IFtdCisKKyAgICAgICAgZm9yIChuYW1lLCB2YWx1ZSkgaW4gYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlKHUnICVzPSVzJyAlIChzZWxmLl9xbmFtZShuYW1lKSwgcXVvdGVhdHRyKHZhbHVlKSkpCisgICAgICAgIHNlbGYuX3dyaXRlKHUnPicpCisKKyAgICBkZWYgZW5kRWxlbWVudE5TKHNlbGYsIG5hbWUsIHFuYW1lKToKKyAgICAgICAgc2VsZi5fd3JpdGUodSc8LyVzPicgJSBzZWxmLl9xbmFtZShuYW1lKSkKKworICAgIGRlZiBjaGFyYWN0ZXJzKHNlbGYsIGNvbnRlbnQpOgorICAgICAgICBzZWxmLl93cml0ZShlc2NhcGUodW5pY29kZShjb250ZW50KSkpCisKKyAgICBkZWYgaWdub3JhYmxlV2hpdGVzcGFjZShzZWxmLCBjb250ZW50KToKKyAgICAgICAgc2VsZi5fd3JpdGUodW5pY29kZShjb250ZW50KSkKKworICAgIGRlZiBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oc2VsZiwgdGFyZ2V0LCBkYXRhKToKKyAgICAgICAgc2VsZi5fd3JpdGUodSc8PyVzICVzPz4nICUgKHRhcmdldCwgZGF0YSkpCisKKworY2xhc3MgWE1MRmlsdGVyQmFzZSh4bWxyZWFkZXIuWE1MUmVhZGVyKToKKyAgICAiIiJUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHNpdCBiZXR3ZWVuIGFuIFhNTFJlYWRlciBhbmQgdGhlCisgICAgY2xpZW50IGFwcGxpY2F0aW9uJ3MgZXZlbnQgaGFuZGxlcnMuICBCeSBkZWZhdWx0LCBpdCBkb2VzIG5vdGhpbmcKKyAgICBidXQgcGFzcyByZXF1ZXN0cyB1cCB0byB0aGUgcmVhZGVyIGFuZCBldmVudHMgb24gdG8gdGhlIGhhbmRsZXJzCisgICAgdW5tb2RpZmllZCwgYnV0IHN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgdG8gbW9kaWZ5CisgICAgdGhlIGV2ZW50IHN0cmVhbSBvciB0aGUgY29uZmlndXJhdGlvbiByZXF1ZXN0cyBhcyB0aGV5IHBhc3MKKyAgICB0aHJvdWdoLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCA9IE5vbmUpOgorICAgICAgICB4bWxyZWFkZXIuWE1MUmVhZGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3BhcmVudCA9IHBhcmVudAorCisgICAgIyBFcnJvckhhbmRsZXIgbWV0aG9kcworCisgICAgZGVmIGVycm9yKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgICAgIHNlbGYuX2Vycl9oYW5kbGVyLmVycm9yKGV4Y2VwdGlvbikKKworICAgIGRlZiBmYXRhbEVycm9yKHNlbGYsIGV4Y2VwdGlvbik6CisgICAgICAgIHNlbGYuX2Vycl9oYW5kbGVyLmZhdGFsRXJyb3IoZXhjZXB0aW9uKQorCisgICAgZGVmIHdhcm5pbmcoc2VsZiwgZXhjZXB0aW9uKToKKyAgICAgICAgc2VsZi5fZXJyX2hhbmRsZXIud2FybmluZyhleGNlcHRpb24pCisKKyAgICAjIENvbnRlbnRIYW5kbGVyIG1ldGhvZHMKKworICAgIGRlZiBzZXREb2N1bWVudExvY2F0b3Ioc2VsZiwgbG9jYXRvcik6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcikKKworICAgIGRlZiBzdGFydERvY3VtZW50KHNlbGYpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc3RhcnREb2N1bWVudCgpCisKKyAgICBkZWYgZW5kRG9jdW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5lbmREb2N1bWVudCgpCisKKyAgICBkZWYgc3RhcnRQcmVmaXhNYXBwaW5nKHNlbGYsIHByZWZpeCwgdXJpKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIHVyaSkKKworICAgIGRlZiBlbmRQcmVmaXhNYXBwaW5nKHNlbGYsIHByZWZpeCk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5lbmRQcmVmaXhNYXBwaW5nKHByZWZpeCkKKworICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc3RhcnRFbGVtZW50KG5hbWUsIGF0dHJzKQorCisgICAgZGVmIGVuZEVsZW1lbnQoc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5lbmRFbGVtZW50KG5hbWUpCisKKyAgICBkZWYgc3RhcnRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUsIGF0dHJzKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyLnN0YXJ0RWxlbWVudE5TKG5hbWUsIHFuYW1lLCBhdHRycykKKworICAgIGRlZiBlbmRFbGVtZW50TlMoc2VsZiwgbmFtZSwgcW5hbWUpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuZW5kRWxlbWVudE5TKG5hbWUsIHFuYW1lKQorCisgICAgZGVmIGNoYXJhY3RlcnMoc2VsZiwgY29udGVudCk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5jaGFyYWN0ZXJzKGNvbnRlbnQpCisKKyAgICBkZWYgaWdub3JhYmxlV2hpdGVzcGFjZShzZWxmLCBjaGFycyk6CisgICAgICAgIHNlbGYuX2NvbnRfaGFuZGxlci5pZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJzKQorCisgICAgZGVmIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihzZWxmLCB0YXJnZXQsIGRhdGEpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIucHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgZGF0YSkKKworICAgIGRlZiBza2lwcGVkRW50aXR5KHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLl9jb250X2hhbmRsZXIuc2tpcHBlZEVudGl0eShuYW1lKQorCisgICAgIyBEVERIYW5kbGVyIG1ldGhvZHMKKworICAgIGRlZiBub3RhdGlvbkRlY2woc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKKyAgICAgICAgc2VsZi5fZHRkX2hhbmRsZXIubm90YXRpb25EZWNsKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCkKKworICAgIGRlZiB1bnBhcnNlZEVudGl0eURlY2woc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuZGF0YSk6CisgICAgICAgIHNlbGYuX2R0ZF9oYW5kbGVyLnVucGFyc2VkRW50aXR5RGVjbChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKQorCisgICAgIyBFbnRpdHlSZXNvbHZlciBtZXRob2RzCisKKyAgICBkZWYgcmVzb2x2ZUVudGl0eShzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICByZXR1cm4gc2VsZi5fZW50X2hhbmRsZXIucmVzb2x2ZUVudGl0eShwdWJsaWNJZCwgc3lzdGVtSWQpCisKKyAgICAjIFhNTFJlYWRlciBtZXRob2RzCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlKToKKyAgICAgICAgc2VsZi5fcGFyZW50LnNldENvbnRlbnRIYW5kbGVyKHNlbGYpCisgICAgICAgIHNlbGYuX3BhcmVudC5zZXRFcnJvckhhbmRsZXIoc2VsZikKKyAgICAgICAgc2VsZi5fcGFyZW50LnNldEVudGl0eVJlc29sdmVyKHNlbGYpCisgICAgICAgIHNlbGYuX3BhcmVudC5zZXREVERIYW5kbGVyKHNlbGYpCisgICAgICAgIHNlbGYuX3BhcmVudC5wYXJzZShzb3VyY2UpCisKKyAgICBkZWYgc2V0TG9jYWxlKHNlbGYsIGxvY2FsZSk6CisgICAgICAgIHNlbGYuX3BhcmVudC5zZXRMb2NhbGUobG9jYWxlKQorCisgICAgZGVmIGdldEZlYXR1cmUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9wYXJlbnQuZ2V0RmVhdHVyZShuYW1lKQorCisgICAgZGVmIHNldEZlYXR1cmUoc2VsZiwgbmFtZSwgc3RhdGUpOgorICAgICAgICBzZWxmLl9wYXJlbnQuc2V0RmVhdHVyZShuYW1lLCBzdGF0ZSkKKworICAgIGRlZiBnZXRQcm9wZXJ0eShzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudC5nZXRQcm9wZXJ0eShuYW1lKQorCisgICAgZGVmIHNldFByb3BlcnR5KHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fcGFyZW50LnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKQorCisgICAgIyBYTUxGaWx0ZXIgbWV0aG9kcworCisgICAgZGVmIGdldFBhcmVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3BhcmVudAorCisgICAgZGVmIHNldFBhcmVudChzZWxmLCBwYXJlbnQpOgorICAgICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQKKworIyAtLS0gVXRpbGl0eSBmdW5jdGlvbnMKKworZGVmIHByZXBhcmVfaW5wdXRfc291cmNlKHNvdXJjZSwgYmFzZSA9ICIiKToKKyAgICAiIiJUaGlzIGZ1bmN0aW9uIHRha2VzIGFuIElucHV0U291cmNlIGFuZCBhbiBvcHRpb25hbCBiYXNlIFVSTCBhbmQKKyAgICByZXR1cm5zIGEgZnVsbHkgcmVzb2x2ZWQgSW5wdXRTb3VyY2Ugb2JqZWN0IHJlYWR5IGZvciByZWFkaW5nLiIiIgorCisgICAgaWYgdHlwZShzb3VyY2UpIGluIF9TdHJpbmdUeXBlczoKKyAgICAgICAgc291cmNlID0geG1scmVhZGVyLklucHV0U291cmNlKHNvdXJjZSkKKyAgICBlbGlmIGhhc2F0dHIoc291cmNlLCAicmVhZCIpOgorICAgICAgICBmID0gc291cmNlCisgICAgICAgIHNvdXJjZSA9IHhtbHJlYWRlci5JbnB1dFNvdXJjZSgpCisgICAgICAgIHNvdXJjZS5zZXRCeXRlU3RyZWFtKGYpCisgICAgICAgIGlmIGhhc2F0dHIoZiwgIm5hbWUiKToKKyAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChmLm5hbWUpCisKKyAgICBpZiBzb3VyY2UuZ2V0Qnl0ZVN0cmVhbSgpIGlzIE5vbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5c2lkID0gc291cmNlLmdldFN5c3RlbUlkKCkKKyAgICAgICAgICAgIGJhc2VoZWFkID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGgubm9ybXBhdGgoYmFzZSkpCisgICAgICAgICAgICBlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShzeXNpZCwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYmFzZWhlYWQsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlaGVhZCA9IGJhc2VoZWFkLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5c2lkID0gc3lzaWQuZW5jb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGJhc2VoZWFkLCB1bmljb2RlKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgc3lzaWQgPSBzeXNpZC5kZWNvZGUoZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlaGVhZCA9IGJhc2VoZWFkLmVuY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIHN5c2lkZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZWhlYWQsIHN5c2lkKQorICAgICAgICAgICAgaXNmaWxlID0gb3MucGF0aC5pc2ZpbGUoc3lzaWRmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIGlzZmlsZSA9IEZhbHNlCisgICAgICAgIGlmIGlzZmlsZToKKyAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChzeXNpZGZpbGVuYW1lKQorICAgICAgICAgICAgZiA9IG9wZW4oc3lzaWRmaWxlbmFtZSwgInJiIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZCh1cmxwYXJzZS51cmxqb2luKGJhc2UsIHNvdXJjZS5nZXRTeXN0ZW1JZCgpKSkKKyAgICAgICAgICAgIGYgPSB1cmxsaWIudXJsb3Blbihzb3VyY2UuZ2V0U3lzdGVtSWQoKSkKKworICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShmKQorCisgICAgcmV0dXJuIHNvdXJjZQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L3NheHV0aWxzLnB5YyBiL2xpYi9weXRob24yLjcveG1sL3NheC9zYXh1dGlscy5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmNjE1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9zYXh1dGlscy5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L3NheHV0aWxzLnB5byBiL2xpYi9weXRob24yLjcveG1sL3NheC9zYXh1dGlscy5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRmNjE1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC9zYXh1dGlscy5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L3htbHJlYWRlci5weSBiL2xpYi9weXRob24yLjcveG1sL3NheC94bWxyZWFkZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRhYTM5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1sL3NheC94bWxyZWFkZXIucHkKQEAgLTAsMCArMSwzODEgQEAKKyIiIkFuIFhNTCBSZWFkZXIgaXMgdGhlIFNBWCAyIG5hbWUgZm9yIGFuIFhNTCBwYXJzZXIuIFhNTCBQYXJzZXJzCitzaG91bGQgYmUgYmFzZWQgb24gdGhpcyBjb2RlLiAiIiIKKworaW1wb3J0IGhhbmRsZXIKKworZnJvbSBfZXhjZXB0aW9ucyBpbXBvcnQgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uCisKKworIyA9PT09PSBYTUxSRUFERVIgPT09PT0KKworY2xhc3MgWE1MUmVhZGVyOgorICAgICIiIkludGVyZmFjZSBmb3IgcmVhZGluZyBhbiBYTUwgZG9jdW1lbnQgdXNpbmcgY2FsbGJhY2tzLgorCisgICAgWE1MUmVhZGVyIGlzIHRoZSBpbnRlcmZhY2UgdGhhdCBhbiBYTUwgcGFyc2VyJ3MgU0FYMiBkcml2ZXIgbXVzdAorICAgIGltcGxlbWVudC4gVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNldCBhbmQgcXVlcnkKKyAgICBmZWF0dXJlcyBhbmQgcHJvcGVydGllcyBpbiB0aGUgcGFyc2VyLCB0byByZWdpc3RlciBldmVudCBoYW5kbGVycworICAgIGZvciBkb2N1bWVudCBwcm9jZXNzaW5nLCBhbmQgdG8gaW5pdGlhdGUgYSBkb2N1bWVudCBwYXJzZS4KKworICAgIEFsbCBTQVggaW50ZXJmYWNlcyBhcmUgYXNzdW1lZCB0byBiZSBzeW5jaHJvbm91czogdGhlIHBhcnNlCisgICAgbWV0aG9kcyBtdXN0IG5vdCByZXR1cm4gdW50aWwgcGFyc2luZyBpcyBjb21wbGV0ZSwgYW5kIHJlYWRlcnMKKyAgICBtdXN0IHdhaXQgZm9yIGFuIGV2ZW50LWhhbmRsZXIgY2FsbGJhY2sgdG8gcmV0dXJuIGJlZm9yZSByZXBvcnRpbmcKKyAgICB0aGUgbmV4dCBldmVudC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyID0gaGFuZGxlci5Db250ZW50SGFuZGxlcigpCisgICAgICAgIHNlbGYuX2R0ZF9oYW5kbGVyID0gaGFuZGxlci5EVERIYW5kbGVyKCkKKyAgICAgICAgc2VsZi5fZW50X2hhbmRsZXIgPSBoYW5kbGVyLkVudGl0eVJlc29sdmVyKCkKKyAgICAgICAgc2VsZi5fZXJyX2hhbmRsZXIgPSBoYW5kbGVyLkVycm9ySGFuZGxlcigpCisKKyAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlKToKKyAgICAgICAgIlBhcnNlIGFuIFhNTCBkb2N1bWVudCBmcm9tIGEgc3lzdGVtIGlkZW50aWZpZXIgb3IgYW4gSW5wdXRTb3VyY2UuIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkISIpCisKKyAgICBkZWYgZ2V0Q29udGVudEhhbmRsZXIoc2VsZik6CisgICAgICAgICJSZXR1cm5zIHRoZSBjdXJyZW50IENvbnRlbnRIYW5kbGVyLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRfaGFuZGxlcgorCisgICAgZGVmIHNldENvbnRlbnRIYW5kbGVyKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICAiUmVnaXN0ZXJzIGEgbmV3IG9iamVjdCB0byByZWNlaXZlIGRvY3VtZW50IGNvbnRlbnQgZXZlbnRzLiIKKyAgICAgICAgc2VsZi5fY29udF9oYW5kbGVyID0gaGFuZGxlcgorCisgICAgZGVmIGdldERUREhhbmRsZXIoc2VsZik6CisgICAgICAgICJSZXR1cm5zIHRoZSBjdXJyZW50IERURCBoYW5kbGVyLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2R0ZF9oYW5kbGVyCisKKyAgICBkZWYgc2V0RFRESGFuZGxlcihzZWxmLCBoYW5kbGVyKToKKyAgICAgICAgIlJlZ2lzdGVyIGFuIG9iamVjdCB0byByZWNlaXZlIGJhc2ljIERURC1yZWxhdGVkIGV2ZW50cy4iCisgICAgICAgIHNlbGYuX2R0ZF9oYW5kbGVyID0gaGFuZGxlcgorCisgICAgZGVmIGdldEVudGl0eVJlc29sdmVyKHNlbGYpOgorICAgICAgICAiUmV0dXJucyB0aGUgY3VycmVudCBFbnRpdHlSZXNvbHZlci4iCisgICAgICAgIHJldHVybiBzZWxmLl9lbnRfaGFuZGxlcgorCisgICAgZGVmIHNldEVudGl0eVJlc29sdmVyKHNlbGYsIHJlc29sdmVyKToKKyAgICAgICAgIlJlZ2lzdGVyIGFuIG9iamVjdCB0byByZXNvbHZlIGV4dGVybmFsIGVudGl0aWVzLiIKKyAgICAgICAgc2VsZi5fZW50X2hhbmRsZXIgPSByZXNvbHZlcgorCisgICAgZGVmIGdldEVycm9ySGFuZGxlcihzZWxmKToKKyAgICAgICAgIlJldHVybnMgdGhlIGN1cnJlbnQgRXJyb3JIYW5kbGVyLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2Vycl9oYW5kbGVyCisKKyAgICBkZWYgc2V0RXJyb3JIYW5kbGVyKHNlbGYsIGhhbmRsZXIpOgorICAgICAgICAiUmVnaXN0ZXIgYW4gb2JqZWN0IHRvIHJlY2VpdmUgZXJyb3ItbWVzc2FnZSBldmVudHMuIgorICAgICAgICBzZWxmLl9lcnJfaGFuZGxlciA9IGhhbmRsZXIKKworICAgIGRlZiBzZXRMb2NhbGUoc2VsZiwgbG9jYWxlKToKKyAgICAgICAgIiIiQWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2V0IHRoZSBsb2NhbGUgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MuCisKKyAgICAgICAgU0FYIHBhcnNlcnMgYXJlIG5vdCByZXF1aXJlZCB0byBwcm92aWRlIGxvY2FsaXphdGlvbiBmb3IgZXJyb3JzCisgICAgICAgIGFuZCB3YXJuaW5nczsgaWYgdGhleSBjYW5ub3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkIGxvY2FsZSwKKyAgICAgICAgaG93ZXZlciwgdGhleSBtdXN0IHJhaXNlIGEgU0FYIGV4Y2VwdGlvbi4gQXBwbGljYXRpb25zIG1heQorICAgICAgICByZXF1ZXN0IGEgbG9jYWxlIGNoYW5nZSBpbiB0aGUgbWlkZGxlIG9mIGEgcGFyc2UuIiIiCisgICAgICAgIHJhaXNlIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigiTG9jYWxlIHN1cHBvcnQgbm90IGltcGxlbWVudGVkIikKKworICAgIGRlZiBnZXRGZWF0dXJlKHNlbGYsIG5hbWUpOgorICAgICAgICAiTG9va3MgdXAgYW5kIHJldHVybnMgdGhlIHN0YXRlIG9mIGEgU0FYMiBmZWF0dXJlLiIKKyAgICAgICAgcmFpc2UgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbigiRmVhdHVyZSAnJXMnIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCisKKyAgICBkZWYgc2V0RmVhdHVyZShzZWxmLCBuYW1lLCBzdGF0ZSk6CisgICAgICAgICJTZXRzIHRoZSBzdGF0ZSBvZiBhIFNBWDIgZmVhdHVyZS4iCisgICAgICAgIHJhaXNlIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oIkZlYXR1cmUgJyVzJyBub3QgcmVjb2duaXplZCIgJSBuYW1lKQorCisgICAgZGVmIGdldFByb3BlcnR5KHNlbGYsIG5hbWUpOgorICAgICAgICAiTG9va3MgdXAgYW5kIHJldHVybnMgdGhlIHZhbHVlIG9mIGEgU0FYMiBwcm9wZXJ0eS4iCisgICAgICAgIHJhaXNlIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24oIlByb3BlcnR5ICclcycgbm90IHJlY29nbml6ZWQiICUgbmFtZSkKKworICAgIGRlZiBzZXRQcm9wZXJ0eShzZWxmLCBuYW1lLCB2YWx1ZSk6CisgICAgICAgICJTZXRzIHRoZSB2YWx1ZSBvZiBhIFNBWDIgcHJvcGVydHkuIgorICAgICAgICByYWlzZSBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uKCJQcm9wZXJ0eSAnJXMnIG5vdCByZWNvZ25pemVkIiAlIG5hbWUpCisKK2NsYXNzIEluY3JlbWVudGFsUGFyc2VyKFhNTFJlYWRlcik6CisgICAgIiIiVGhpcyBpbnRlcmZhY2UgYWRkcyB0aHJlZSBleHRyYSBtZXRob2RzIHRvIHRoZSBYTUxSZWFkZXIKKyAgICBpbnRlcmZhY2UgdGhhdCBhbGxvdyBYTUwgcGFyc2VycyB0byBzdXBwb3J0IGluY3JlbWVudGFsCisgICAgcGFyc2luZy4gU3VwcG9ydCBmb3IgdGhpcyBpbnRlcmZhY2UgaXMgb3B0aW9uYWwsIHNpbmNlIG5vdCBhbGwKKyAgICB1bmRlcmx5aW5nIFhNTCBwYXJzZXJzIHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LgorCisgICAgV2hlbiB0aGUgcGFyc2VyIGlzIGluc3RhbnRpYXRlZCBpdCBpcyByZWFkeSB0byBiZWdpbiBhY2NlcHRpbmcKKyAgICBkYXRhIGZyb20gdGhlIGZlZWQgbWV0aG9kIGltbWVkaWF0ZWx5LiBBZnRlciBwYXJzaW5nIGhhcyBiZWVuCisgICAgZmluaXNoZWQgd2l0aCBhIGNhbGwgdG8gY2xvc2UgdGhlIHJlc2V0IG1ldGhvZCBtdXN0IGJlIGNhbGxlZCB0bworICAgIG1ha2UgdGhlIHBhcnNlciByZWFkeSB0byBhY2NlcHQgbmV3IGRhdGEsIGVpdGhlciBmcm9tIGZlZWQgb3IKKyAgICB1c2luZyB0aGUgcGFyc2UgbWV0aG9kLgorCisgICAgTm90ZSB0aGF0IHRoZXNlIG1ldGhvZHMgbXVzdCBfbm90XyBiZSBjYWxsZWQgZHVyaW5nIHBhcnNpbmcsIHRoYXQKKyAgICBpcywgYWZ0ZXIgcGFyc2UgaGFzIGJlZW4gY2FsbGVkIGFuZCBiZWZvcmUgaXQgcmV0dXJucy4KKworICAgIEJ5IGRlZmF1bHQsIHRoZSBjbGFzcyBhbHNvIGltcGxlbWVudHMgdGhlIHBhcnNlIG1ldGhvZCBvZiB0aGUgWE1MUmVhZGVyCisgICAgaW50ZXJmYWNlIHVzaW5nIHRoZSBmZWVkLCBjbG9zZSBhbmQgcmVzZXQgbWV0aG9kcyBvZiB0aGUKKyAgICBJbmNyZW1lbnRhbFBhcnNlciBpbnRlcmZhY2UgYXMgYSBjb252ZW5pZW5jZSB0byBTQVggMi4wIGRyaXZlcgorICAgIHdyaXRlcnMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYnVmc2l6ZT0yKioxNik6CisgICAgICAgIHNlbGYuX2J1ZnNpemUgPSBidWZzaXplCisgICAgICAgIFhNTFJlYWRlci5fX2luaXRfXyhzZWxmKQorCisgICAgZGVmIHBhcnNlKHNlbGYsIHNvdXJjZSk6CisgICAgICAgIGltcG9ydCBzYXh1dGlscworICAgICAgICBzb3VyY2UgPSBzYXh1dGlscy5wcmVwYXJlX2lucHV0X3NvdXJjZShzb3VyY2UpCisKKyAgICAgICAgc2VsZi5wcmVwYXJlUGFyc2VyKHNvdXJjZSkKKyAgICAgICAgZmlsZSA9IHNvdXJjZS5nZXRCeXRlU3RyZWFtKCkKKyAgICAgICAgYnVmZmVyID0gZmlsZS5yZWFkKHNlbGYuX2J1ZnNpemUpCisgICAgICAgIHdoaWxlIGJ1ZmZlciAhPSAiIjoKKyAgICAgICAgICAgIHNlbGYuZmVlZChidWZmZXIpCisgICAgICAgICAgICBidWZmZXIgPSBmaWxlLnJlYWQoc2VsZi5fYnVmc2l6ZSkKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZmVlZChzZWxmLCBkYXRhKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgZ2l2ZXMgdGhlIHJhdyBYTUwgZGF0YSBpbiB0aGUgZGF0YSBwYXJhbWV0ZXIgdG8KKyAgICAgICAgdGhlIHBhcnNlciBhbmQgbWFrZXMgaXQgcGFyc2UgdGhlIGRhdGEsIGVtaXR0aW5nIHRoZQorICAgICAgICBjb3JyZXNwb25kaW5nIGV2ZW50cy4gSXQgaXMgYWxsb3dlZCBmb3IgWE1MIGNvbnN0cnVjdHMgdG8gYmUKKyAgICAgICAgc3BsaXQgYWNyb3NzIHNldmVyYWwgY2FsbHMgdG8gZmVlZC4KKworICAgICAgICBmZWVkIG1heSByYWlzZSBTQVhFeGNlcHRpb24uIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIlRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQhIikKKworICAgIGRlZiBwcmVwYXJlUGFyc2VyKHNlbGYsIHNvdXJjZSk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgcGFyc2UgaW1wbGVtZW50YXRpb24gdG8gYWxsb3cKKyAgICAgICAgdGhlIFNBWCAyLjAgZHJpdmVyIHRvIHByZXBhcmUgaXRzZWxmIGZvciBwYXJzaW5nLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJwcmVwYXJlUGFyc2VyIG11c3QgYmUgb3ZlcnJpZGRlbiEiKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgZW50aXJlIFhNTCBkb2N1bWVudCBoYXMgYmVlbgorICAgICAgICBwYXNzZWQgdG8gdGhlIHBhcnNlciB0aHJvdWdoIHRoZSBmZWVkIG1ldGhvZCwgdG8gbm90aWZ5IHRoZQorICAgICAgICBwYXJzZXIgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBkYXRhLiBUaGlzIGFsbG93cyB0aGUgcGFyc2VyIHRvCisgICAgICAgIGRvIHRoZSBmaW5hbCBjaGVja3Mgb24gdGhlIGRvY3VtZW50IGFuZCBlbXB0eSB0aGUgaW50ZXJuYWwKKyAgICAgICAgZGF0YSBidWZmZXIuCisKKyAgICAgICAgVGhlIHBhcnNlciB3aWxsIG5vdCBiZSByZWFkeSB0byBwYXJzZSBhbm90aGVyIGRvY3VtZW50IHVudGlsCisgICAgICAgIHRoZSByZXNldCBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgorCisgICAgICAgIGNsb3NlIG1heSByYWlzZSBTQVhFeGNlcHRpb24uIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoIlRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQhIikKKworICAgIGRlZiByZXNldChzZWxmKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGNsb3NlIGhhcyBiZWVuIGNhbGxlZCB0byByZXNldAorICAgICAgICB0aGUgcGFyc2VyIHNvIHRoYXQgaXQgaXMgcmVhZHkgdG8gcGFyc2UgbmV3IGRvY3VtZW50cy4gVGhlCisgICAgICAgIHJlc3VsdHMgb2YgY2FsbGluZyBwYXJzZSBvciBmZWVkIGFmdGVyIGNsb3NlIHdpdGhvdXQgY2FsbGluZworICAgICAgICByZXNldCBhcmUgdW5kZWZpbmVkLiIiIgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkISIpCisKKyMgPT09PT0gTE9DQVRPUiA9PT09PQorCitjbGFzcyBMb2NhdG9yOgorICAgICIiIkludGVyZmFjZSBmb3IgYXNzb2NpYXRpbmcgYSBTQVggZXZlbnQgd2l0aCBhIGRvY3VtZW50CisgICAgbG9jYXRpb24uIEEgbG9jYXRvciBvYmplY3Qgd2lsbCByZXR1cm4gdmFsaWQgcmVzdWx0cyBvbmx5IGR1cmluZworICAgIGNhbGxzIHRvIERvY3VtZW50SGFuZGxlciBtZXRob2RzOyBhdCBhbnkgb3RoZXIgdGltZSwgdGhlCisgICAgcmVzdWx0cyBhcmUgdW5wcmVkaWN0YWJsZS4iIiIKKworICAgIGRlZiBnZXRDb2x1bW5OdW1iZXIoc2VsZik6CisgICAgICAgICJSZXR1cm4gdGhlIGNvbHVtbiBudW1iZXIgd2hlcmUgdGhlIGN1cnJlbnQgZXZlbnQgZW5kcy4iCisgICAgICAgIHJldHVybiAtMQorCisgICAgZGVmIGdldExpbmVOdW1iZXIoc2VsZik6CisgICAgICAgICJSZXR1cm4gdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBjdXJyZW50IGV2ZW50IGVuZHMuIgorICAgICAgICByZXR1cm4gLTEKKworICAgIGRlZiBnZXRQdWJsaWNJZChzZWxmKToKKyAgICAgICAgIlJldHVybiB0aGUgcHVibGljIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGV2ZW50LiIKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBnZXRTeXN0ZW1JZChzZWxmKToKKyAgICAgICAgIlJldHVybiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZSBjdXJyZW50IGV2ZW50LiIKKyAgICAgICAgcmV0dXJuIE5vbmUKKworIyA9PT09PSBJTlBVVFNPVVJDRSA9PT09PQorCitjbGFzcyBJbnB1dFNvdXJjZToKKyAgICAiIiJFbmNhcHN1bGF0aW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIFhNTFJlYWRlciB0bworICAgIHJlYWQgZW50aXRpZXMuCisKKyAgICBUaGlzIGNsYXNzIG1heSBpbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwdWJsaWMgaWRlbnRpZmllciwKKyAgICBzeXN0ZW0gaWRlbnRpZmllciwgYnl0ZSBzdHJlYW0gKHBvc3NpYmx5IHdpdGggY2hhcmFjdGVyIGVuY29kaW5nCisgICAgaW5mb3JtYXRpb24pIGFuZC9vciB0aGUgY2hhcmFjdGVyIHN0cmVhbSBvZiBhbiBlbnRpdHkuCisKKyAgICBBcHBsaWNhdGlvbnMgd2lsbCBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGNsYXNzIGZvciB1c2UgaW4gdGhlCisgICAgWE1MUmVhZGVyLnBhcnNlIG1ldGhvZCBhbmQgZm9yIHJldHVybmluZyBmcm9tCisgICAgRW50aXR5UmVzb2x2ZXIucmVzb2x2ZUVudGl0eS4KKworICAgIEFuIElucHV0U291cmNlIGJlbG9uZ3MgdG8gdGhlIGFwcGxpY2F0aW9uLCB0aGUgWE1MUmVhZGVyIGlzIG5vdAorICAgIGFsbG93ZWQgdG8gbW9kaWZ5IElucHV0U291cmNlIG9iamVjdHMgcGFzc2VkIHRvIGl0IGZyb20gdGhlCisgICAgYXBwbGljYXRpb24sIGFsdGhvdWdoIGl0IG1heSBtYWtlIGNvcGllcyBhbmQgbW9kaWZ5IHRob3NlLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN5c3RlbV9pZCA9IE5vbmUpOgorICAgICAgICBzZWxmLl9fc3lzdGVtX2lkID0gc3lzdGVtX2lkCisgICAgICAgIHNlbGYuX19wdWJsaWNfaWQgPSBOb25lCisgICAgICAgIHNlbGYuX19lbmNvZGluZyAgPSBOb25lCisgICAgICAgIHNlbGYuX19ieXRlZmlsZSAgPSBOb25lCisgICAgICAgIHNlbGYuX19jaGFyZmlsZSAgPSBOb25lCisKKyAgICBkZWYgc2V0UHVibGljSWQoc2VsZiwgcHVibGljX2lkKToKKyAgICAgICAgIlNldHMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoaXMgSW5wdXRTb3VyY2UuIgorICAgICAgICBzZWxmLl9fcHVibGljX2lkID0gcHVibGljX2lkCisKKyAgICBkZWYgZ2V0UHVibGljSWQoc2VsZik6CisgICAgICAgICJSZXR1cm5zIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGlzIElucHV0U291cmNlLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19wdWJsaWNfaWQKKworICAgIGRlZiBzZXRTeXN0ZW1JZChzZWxmLCBzeXN0ZW1faWQpOgorICAgICAgICAiU2V0cyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhpcyBJbnB1dFNvdXJjZS4iCisgICAgICAgIHNlbGYuX19zeXN0ZW1faWQgPSBzeXN0ZW1faWQKKworICAgIGRlZiBnZXRTeXN0ZW1JZChzZWxmKToKKyAgICAgICAgIlJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoaXMgSW5wdXRTb3VyY2UuIgorICAgICAgICByZXR1cm4gc2VsZi5fX3N5c3RlbV9pZAorCisgICAgZGVmIHNldEVuY29kaW5nKHNlbGYsIGVuY29kaW5nKToKKyAgICAgICAgIiIiU2V0cyB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoaXMgSW5wdXRTb3VyY2UuCisKKyAgICAgICAgVGhlIGVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmcgYWNjZXB0YWJsZSBmb3IgYW4gWE1MIGVuY29kaW5nCisgICAgICAgIGRlY2xhcmF0aW9uIChzZWUgc2VjdGlvbiA0LjMuMyBvZiB0aGUgWE1MIHJlY29tbWVuZGF0aW9uKS4KKworICAgICAgICBUaGUgZW5jb2RpbmcgYXR0cmlidXRlIG9mIHRoZSBJbnB1dFNvdXJjZSBpcyBpZ25vcmVkIGlmIHRoZQorICAgICAgICBJbnB1dFNvdXJjZSBhbHNvIGNvbnRhaW5zIGEgY2hhcmFjdGVyIHN0cmVhbS4iIiIKKyAgICAgICAgc2VsZi5fX2VuY29kaW5nID0gZW5jb2RpbmcKKworICAgIGRlZiBnZXRFbmNvZGluZyhzZWxmKToKKyAgICAgICAgIkdldCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIG9mIHRoaXMgSW5wdXRTb3VyY2UuIgorICAgICAgICByZXR1cm4gc2VsZi5fX2VuY29kaW5nCisKKyAgICBkZWYgc2V0Qnl0ZVN0cmVhbShzZWxmLCBieXRlZmlsZSk6CisgICAgICAgICIiIlNldCB0aGUgYnl0ZSBzdHJlYW0gKGEgUHl0aG9uIGZpbGUtbGlrZSBvYmplY3Qgd2hpY2ggZG9lcworICAgICAgICBub3QgcGVyZm9ybSBieXRlLXRvLWNoYXJhY3RlciBjb252ZXJzaW9uKSBmb3IgdGhpcyBpbnB1dAorICAgICAgICBzb3VyY2UuCisKKyAgICAgICAgVGhlIFNBWCBwYXJzZXIgd2lsbCBpZ25vcmUgdGhpcyBpZiB0aGVyZSBpcyBhbHNvIGEgY2hhcmFjdGVyCisgICAgICAgIHN0cmVhbSBzcGVjaWZpZWQsIGJ1dCBpdCB3aWxsIHVzZSBhIGJ5dGUgc3RyZWFtIGluIHByZWZlcmVuY2UKKyAgICAgICAgdG8gb3BlbmluZyBhIFVSSSBjb25uZWN0aW9uIGl0c2VsZi4KKworICAgICAgICBJZiB0aGUgYXBwbGljYXRpb24ga25vd3MgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgYnl0ZQorICAgICAgICBzdHJlYW0sIGl0IHNob3VsZCBzZXQgaXQgd2l0aCB0aGUgc2V0RW5jb2RpbmcgbWV0aG9kLiIiIgorICAgICAgICBzZWxmLl9fYnl0ZWZpbGUgPSBieXRlZmlsZQorCisgICAgZGVmIGdldEJ5dGVTdHJlYW0oc2VsZik6CisgICAgICAgICIiIkdldCB0aGUgYnl0ZSBzdHJlYW0gZm9yIHRoaXMgaW5wdXQgc291cmNlLgorCisgICAgICAgIFRoZSBnZXRFbmNvZGluZyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGNoYXJhY3RlciBlbmNvZGluZyBmb3IKKyAgICAgICAgdGhpcyBieXRlIHN0cmVhbSwgb3IgTm9uZSBpZiB1bmtub3duLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fX2J5dGVmaWxlCisKKyAgICBkZWYgc2V0Q2hhcmFjdGVyU3RyZWFtKHNlbGYsIGNoYXJmaWxlKToKKyAgICAgICAgIiIiU2V0IHRoZSBjaGFyYWN0ZXIgc3RyZWFtIGZvciB0aGlzIGlucHV0IHNvdXJjZS4gKFRoZSBzdHJlYW0KKyAgICAgICAgbXVzdCBiZSBhIFB5dGhvbiAyLjAgVW5pY29kZS13cmFwcGVkIGZpbGUtbGlrZSB0aGF0IHBlcmZvcm1zCisgICAgICAgIGNvbnZlcnNpb24gdG8gVW5pY29kZSBzdHJpbmdzLikKKworICAgICAgICBJZiB0aGVyZSBpcyBhIGNoYXJhY3RlciBzdHJlYW0gc3BlY2lmaWVkLCB0aGUgU0FYIHBhcnNlciB3aWxsCisgICAgICAgIGlnbm9yZSBhbnkgYnl0ZSBzdHJlYW0gYW5kIHdpbGwgbm90IGF0dGVtcHQgdG8gb3BlbiBhIFVSSQorICAgICAgICBjb25uZWN0aW9uIHRvIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4iIiIKKyAgICAgICAgc2VsZi5fX2NoYXJmaWxlID0gY2hhcmZpbGUKKworICAgIGRlZiBnZXRDaGFyYWN0ZXJTdHJlYW0oc2VsZik6CisgICAgICAgICJHZXQgdGhlIGNoYXJhY3RlciBzdHJlYW0gZm9yIHRoaXMgaW5wdXQgc291cmNlLiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jaGFyZmlsZQorCisjID09PT09IEFUVFJJQlVURVNJTVBMID09PT09CisKK2NsYXNzIEF0dHJpYnV0ZXNJbXBsOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGF0dHJzKToKKyAgICAgICAgIiIiTm9uLU5TLWF3YXJlIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgIGF0dHJzIHNob3VsZCBiZSBvZiB0aGUgZm9ybSB7bmFtZSA6IHZhbHVlfS4iIiIKKyAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycworCisgICAgZGVmIGdldExlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9hdHRycykKKworICAgIGRlZiBnZXRUeXBlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIkNEQVRBIgorCisgICAgZGVmIGdldFZhbHVlKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbbmFtZV0KKworICAgIGRlZiBnZXRWYWx1ZUJ5UU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXQorCisgICAgZGVmIGdldE5hbWVCeVFOYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBub3QgbmFtZSBpbiBzZWxmLl9hdHRyczoKKyAgICAgICAgICAgIHJhaXNlIEtleUVycm9yLCBuYW1lCisgICAgICAgIHJldHVybiBuYW1lCisKKyAgICBkZWYgZ2V0UU5hbWVCeU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIGlmIG5vdCBuYW1lIGluIHNlbGYuX2F0dHJzOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsIG5hbWUKKyAgICAgICAgcmV0dXJuIG5hbWUKKworICAgIGRlZiBnZXROYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLmtleXMoKQorCisgICAgZGVmIGdldFFOYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLmtleXMoKQorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBsZW4oc2VsZi5fYXR0cnMpCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1tuYW1lXQorCisgICAgZGVmIGtleXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRycy5rZXlzKCkKKworICAgIGRlZiBoYXNfa2V5KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZSBpbiBzZWxmLl9hdHRycworCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUgaW4gc2VsZi5fYXR0cnMKKworICAgIGRlZiBnZXQoc2VsZiwgbmFtZSwgYWx0ZXJuYXRpdmU9Tm9uZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9hdHRycy5nZXQobmFtZSwgYWx0ZXJuYXRpdmUpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuX2F0dHJzKQorCisgICAgZGVmIGl0ZW1zKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnMuaXRlbXMoKQorCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzLnZhbHVlcygpCisKKyMgPT09PT0gQVRUUklCVVRFU05TSU1QTCA9PT09PQorCitjbGFzcyBBdHRyaWJ1dGVzTlNJbXBsKEF0dHJpYnV0ZXNJbXBsKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhdHRycywgcW5hbWVzKToKKyAgICAgICAgIiIiTlMtYXdhcmUgaW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgYXR0cnMgc2hvdWxkIGJlIG9mIHRoZSBmb3JtIHsobnNfdXJpLCBsbmFtZSk6IHZhbHVlLCAuLi59LgorICAgICAgICBxbmFtZXMgb2YgdGhlIGZvcm0geyhuc191cmksIGxuYW1lKTogcW5hbWUsIC4uLn0uIiIiCisgICAgICAgIHNlbGYuX2F0dHJzID0gYXR0cnMKKyAgICAgICAgc2VsZi5fcW5hbWVzID0gcW5hbWVzCisKKyAgICBkZWYgZ2V0VmFsdWVCeVFOYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBmb3IgKG5zbmFtZSwgcW5hbWUpIGluIHNlbGYuX3FuYW1lcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgcW5hbWUgPT0gbmFtZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYXR0cnNbbnNuYW1lXQorCisgICAgICAgIHJhaXNlIEtleUVycm9yLCBuYW1lCisKKyAgICBkZWYgZ2V0TmFtZUJ5UU5hbWUoc2VsZiwgbmFtZSk6CisgICAgICAgIGZvciAobnNuYW1lLCBxbmFtZSkgaW4gc2VsZi5fcW5hbWVzLml0ZW1zKCk6CisgICAgICAgICAgICBpZiBxbmFtZSA9PSBuYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiBuc25hbWUKKworICAgICAgICByYWlzZSBLZXlFcnJvciwgbmFtZQorCisgICAgZGVmIGdldFFOYW1lQnlOYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fcW5hbWVzW25hbWVdCisKKyAgICBkZWYgZ2V0UU5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcW5hbWVzLnZhbHVlcygpCisKKyAgICBkZWYgY29weShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHNlbGYuX2F0dHJzLCBzZWxmLl9xbmFtZXMpCisKKworZGVmIF90ZXN0KCk6CisgICAgWE1MUmVhZGVyKCkKKyAgICBJbmNyZW1lbnRhbFBhcnNlcigpCisgICAgTG9jYXRvcigpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgX3Rlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L3htbHJlYWRlci5weWMgYi9saWIvcHl0aG9uMi43L3htbC9zYXgveG1scmVhZGVyLnB5YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDYxMDAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3htbHJlYWRlci5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWwvc2F4L3htbHJlYWRlci5weW8gYi9saWIvcHl0aG9uMi43L3htbC9zYXgveG1scmVhZGVyLnB5bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDYxMDAxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWwvc2F4L3htbHJlYWRlci5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWxsaWIucHkgYi9saWIvcHl0aG9uMi43L3htbGxpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmVlODQxCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWxsaWIucHkKQEAgLTAsMCArMSw5MzAgQEAKKyIiIkEgcGFyc2VyIGZvciBYTUwsIHVzaW5nIHRoZSBkZXJpdmVkIGNsYXNzIGFzIHN0YXRpYyBEVEQuIiIiCisKKyMgQXV0aG9yOiBTam9lcmQgTXVsbGVuZGVyLgorCitpbXBvcnQgcmUKK2ltcG9ydCBzdHJpbmcKKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJuKCJUaGUgeG1sbGliIG1vZHVsZSBpcyBvYnNvbGV0ZS4gIFVzZSB4bWwuc2F4IGluc3RlYWQuIiwKKyAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQorZGVsIHdhcm5pbmdzCisKK3ZlcnNpb24gPSAnMC4zJworCitjbGFzcyBFcnJvcihSdW50aW1lRXJyb3IpOgorICAgIHBhc3MKKworIyBSZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgZm9yIHBhcnNpbmcKKworX1MgPSAnWyBcdFxyXG5dKycgICAgICAgICAgICAgICAgICAgICAgICMgd2hpdGUgc3BhY2UKK19vcFMgPSAnWyBcdFxyXG5dKicgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHdoaXRlIHNwYWNlCitfTmFtZSA9ICdbYS16QS1aXzpdWy1hLXpBLVowLTkuXzpdKicgICAgIyB2YWxpZCBYTUwgbmFtZQorX1FTdHIgPSAiKD86J1teJ10qJ3xcIlteXCJdKlwiKSIgICAgICAgICMgcXVvdGVkIFhNTCBzdHJpbmcKK2lsbGVnYWwgPSByZS5jb21waWxlKCdbXlx0XHJcbiAtXDE3NlwyNDAtXDM3N10nKSAjIGlsbGVnYWwgY2hhcnMgaW4gY29udGVudAoraW50ZXJlc3RpbmcgPSByZS5jb21waWxlKCdbXSY8XScpCisKK2FtcCA9IHJlLmNvbXBpbGUoJyYnKQorcmVmID0gcmUuY29tcGlsZSgnJignICsgX05hbWUgKyAnfCNbMC05XSt8I3hbMC05YS1mQS1GXSspW14tYS16QS1aMC05Ll86XScpCitlbnRpdHlyZWYgPSByZS5jb21waWxlKCcmKD9QPG5hbWU+JyArIF9OYW1lICsgJylbXi1hLXpBLVowLTkuXzpdJykKK2NoYXJyZWYgPSByZS5jb21waWxlKCcmIyg/UDxjaGFyPlswLTldK1teMC05XXx4WzAtOWEtZkEtRl0rW14wLTlhLWZBLUZdKScpCitzcGFjZSA9IHJlLmNvbXBpbGUoX1MgKyAnJCcpCituZXdsaW5lID0gcmUuY29tcGlsZSgnXG4nKQorCithdHRyZmluZCA9IHJlLmNvbXBpbGUoCisgICAgX1MgKyAnKD9QPG5hbWU+JyArIF9OYW1lICsgJyknCisgICAgJygnICsgX29wUyArICc9JyArIF9vcFMgKworICAgICcoP1A8dmFsdWU+JytfUVN0cisnfFstYS16QS1aMC05LjorKiU/IVwoXClfIz1+XSspKT8nKQorc3RhcnR0YWdvcGVuID0gcmUuY29tcGlsZSgnPCcgKyBfTmFtZSkKK3N0YXJ0dGFnZW5kID0gcmUuY29tcGlsZShfb3BTICsgJyg/UDxzbGFzaD4vPyk+JykKK3N0YXJ0dGFnbWF0Y2ggPSByZS5jb21waWxlKCc8KD9QPHRhZ25hbWU+JytfTmFtZSsnKScKKyAgICAgICAgICAgICAgICAgICAgICAnKD9QPGF0dHJzPig/OicrYXR0cmZpbmQucGF0dGVybisnKSopJysKKyAgICAgICAgICAgICAgICAgICAgICBzdGFydHRhZ2VuZC5wYXR0ZXJuKQorZW5kdGFnb3BlbiA9IHJlLmNvbXBpbGUoJzwvJykKK2VuZGJyYWNrZXQgPSByZS5jb21waWxlKF9vcFMgKyAnPicpCitlbmRicmFja2V0ZmluZCA9IHJlLmNvbXBpbGUoJyg/OltePlwnIl18JytfUVN0cisnKSo+JykKK3RhZ2ZpbmQgPSByZS5jb21waWxlKF9OYW1lKQorY2RhdGFvcGVuID0gcmUuY29tcGlsZShyJzwhXFtDREFUQVxbJykKK2NkYXRhY2xvc2UgPSByZS5jb21waWxlKHInXF1cXT4nKQorIyB0aGlzIG1hdGNoZXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisjIFNZU1RFTSBTeXN0ZW1MaXRlcmFsCisjIFBVQkxJQyBQdWJpZExpdGVyYWwgU3lzdGVtTGl0ZXJhbAorX1N5c3RlbUxpdGVyYWwgPSAnKD9QPCVzPicrX1FTdHIrJyknCitfUHVibGljTGl0ZXJhbCA9ICcoP1A8JXM+IlstXCdcKFwpKywuLzo9PzshKiNAJF8lJSBcblxyYS16QS1aMC05XSoifCcgXAorICAgICAgICAgICAgICAgICAgICAgICAgIidbLVwoXCkrLC4vOj0/OyEqI0AkXyUlIFxuXHJhLXpBLVowLTldKicpIgorX0V4dGVybmFsSWQgPSAnKD86U1lTVEVNfCcgXAorICAgICAgICAgICAgICAgICAnUFVCTElDJytfUytfUHVibGljTGl0ZXJhbCUncHViaWQnKyBcCisgICAgICAgICAgICAgICcpJytfUytfU3lzdGVtTGl0ZXJhbCUnc3lzbGl0JworZG9jdHlwZSA9IHJlLmNvbXBpbGUoJzwhRE9DVFlQRScrX1MrJyg/UDxuYW1lPicrX05hbWUrJyknCisgICAgICAgICAgICAgICAgICAgICAnKD86JytfUytfRXh0ZXJuYWxJZCsnKT8nK19vcFMpCit4bWxkZWNsID0gcmUuY29tcGlsZSgnPFw/eG1sJytfUysKKyAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJytfb3BTKyc9Jytfb3BTKycoP1A8dmVyc2lvbj4nK19RU3RyKycpJysKKyAgICAgICAgICAgICAgICAgICAgICcoPzonK19TKydlbmNvZGluZycrX29wUysnPScrX29wUysKKyAgICAgICAgICAgICAgICAgICAgICAgICIoP1A8ZW5jb2Rpbmc+J1tBLVphLXpdWy1BLVphLXowLTkuX10qJ3wiCisgICAgICAgICAgICAgICAgICAgICAgICAnIltBLVphLXpdWy1BLVphLXowLTkuX10qIikpPycKKyAgICAgICAgICAgICAgICAgICAgICcoPzonK19TKydzdGFuZGFsb25lJytfb3BTKyc9Jytfb3BTKworICAgICAgICAgICAgICAgICAgICAgICAgJyg/UDxzdGFuZGFsb25lPlwnKD86eWVzfG5vKVwnfCIoPzp5ZXN8bm8pIikpPycrCisgICAgICAgICAgICAgICAgICAgICBfb3BTKydcPz4nKQorcHJvY29wZW4gPSByZS5jb21waWxlKHInPFw/KD9QPHByb2M+JyArIF9OYW1lICsgJyknICsgX29wUykKK3Byb2NjbG9zZSA9IHJlLmNvbXBpbGUoX29wUyArIHInXD8+JykKK2NvbW1lbnRvcGVuID0gcmUuY29tcGlsZSgnPCEtLScpCitjb21tZW50Y2xvc2UgPSByZS5jb21waWxlKCctLT4nKQorZG91YmxlZGFzaCA9IHJlLmNvbXBpbGUoJy0tJykKK2F0dHJ0cmFucyA9IHN0cmluZy5tYWtldHJhbnMoJyBcclxuXHQnLCAnICAgICcpCisKKyMgZGVmaW5pdGlvbnMgZm9yIFhNTCBuYW1lc3BhY2VzCitfTkNOYW1lID0gJ1thLXpBLVpfXVstYS16QS1aMC05Ll9dKicgICAgIyBYTUwgTmFtZSwgbWludXMgdGhlICI6IgorbmNuYW1lID0gcmUuY29tcGlsZShfTkNOYW1lICsgJyQnKQorcW5hbWUgPSByZS5jb21waWxlKCcoPzooP1A8cHJlZml4PicgKyBfTkNOYW1lICsgJyk6KT8nICMgb3B0aW9uYWwgcHJlZml4CisgICAgICAgICAgICAgICAgICAgJyg/UDxsb2NhbD4nICsgX05DTmFtZSArICcpJCcpCisKK3htbG5zID0gcmUuY29tcGlsZSgneG1sbnMoPzo6KD9QPG5jbmFtZT4nK19OQ05hbWUrJykpPyQnKQorCisjIFhNTCBwYXJzZXIgYmFzZSBjbGFzcyAtLSBmaW5kIHRhZ3MgYW5kIGNhbGwgaGFuZGxlciBmdW5jdGlvbnMuCisjIFVzYWdlOiBwID0gWE1MUGFyc2VyKCk7IHAuZmVlZChkYXRhKTsgLi4uOyBwLmNsb3NlKCkuCisjIFRoZSBkdGQgaXMgZGVmaW5lZCBieSBkZXJpdmluZyBhIGNsYXNzIHdoaWNoIGRlZmluZXMgbWV0aG9kcyB3aXRoCisjIHNwZWNpYWwgbmFtZXMgdG8gaGFuZGxlIHRhZ3M6IHN0YXJ0X2ZvbyBhbmQgZW5kX2ZvbyB0byBoYW5kbGUgPGZvbz4KKyMgYW5kIDwvZm9vPiwgcmVzcGVjdGl2ZWx5LiAgVGhlIGRhdGEgYmV0d2VlbiB0YWdzIGlzIHBhc3NlZCB0byB0aGUKKyMgcGFyc2VyIGJ5IGNhbGxpbmcgc2VsZi5oYW5kbGVfZGF0YSgpIHdpdGggc29tZSBkYXRhIGFzIGFyZ3VtZW50ICh0aGUKKyMgZGF0YSBtYXkgYmUgc3BsaXQgdXAgaW4gYXJiaXRyYXJ5IGNodW5rcykuCisKK2NsYXNzIFhNTFBhcnNlcjoKKyAgICBhdHRyaWJ1dGVzID0ge30gICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHQsIHRvIGJlIG92ZXJyaWRkZW4KKyAgICBlbGVtZW50cyA9IHt9ICAgICAgICAgICAgICAgICAgICAgICAjIGRlZmF1bHQsIHRvIGJlIG92ZXJyaWRkZW4KKworICAgICMgcGFyc2luZyBvcHRpb25zLCBzZXR0YWJsZSB1c2luZyBrZXl3b3JkIGFyZ3MgaW4gX19pbml0X18KKyAgICBfX2FjY2VwdF91bnF1b3RlZF9hdHRyaWJ1dGVzID0gMAorICAgIF9fYWNjZXB0X21pc3NpbmdfZW5kdGFnX25hbWUgPSAwCisgICAgX19tYXBfY2FzZSA9IDAKKyAgICBfX2FjY2VwdF91dGY4ID0gMAorICAgIF9fdHJhbnNsYXRlX2F0dHJpYnV0ZV9yZWZlcmVuY2VzID0gMQorCisgICAgIyBJbnRlcmZhY2UgLS0gaW5pdGlhbGl6ZSBhbmQgcmVzZXQgdGhpcyBpbnN0YW5jZQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3KToKKyAgICAgICAgc2VsZi5fX2ZpeGVkID0gMAorICAgICAgICBpZiAnYWNjZXB0X3VucXVvdGVkX2F0dHJpYnV0ZXMnIGluIGt3OgorICAgICAgICAgICAgc2VsZi5fX2FjY2VwdF91bnF1b3RlZF9hdHRyaWJ1dGVzID0ga3dbJ2FjY2VwdF91bnF1b3RlZF9hdHRyaWJ1dGVzJ10KKyAgICAgICAgaWYgJ2FjY2VwdF9taXNzaW5nX2VuZHRhZ19uYW1lJyBpbiBrdzoKKyAgICAgICAgICAgIHNlbGYuX19hY2NlcHRfbWlzc2luZ19lbmR0YWdfbmFtZSA9IGt3WydhY2NlcHRfbWlzc2luZ19lbmR0YWdfbmFtZSddCisgICAgICAgIGlmICdtYXBfY2FzZScgaW4ga3c6CisgICAgICAgICAgICBzZWxmLl9fbWFwX2Nhc2UgPSBrd1snbWFwX2Nhc2UnXQorICAgICAgICBpZiAnYWNjZXB0X3V0ZjgnIGluIGt3OgorICAgICAgICAgICAgc2VsZi5fX2FjY2VwdF91dGY4ID0ga3dbJ2FjY2VwdF91dGY4J10KKyAgICAgICAgaWYgJ3RyYW5zbGF0ZV9hdHRyaWJ1dGVfcmVmZXJlbmNlcycgaW4ga3c6CisgICAgICAgICAgICBzZWxmLl9fdHJhbnNsYXRlX2F0dHJpYnV0ZV9yZWZlcmVuY2VzID0ga3dbJ3RyYW5zbGF0ZV9hdHRyaWJ1dGVfcmVmZXJlbmNlcyddCisgICAgICAgIHNlbGYucmVzZXQoKQorCisgICAgZGVmIF9fZml4ZWxlbWVudHMoc2VsZik6CisgICAgICAgIHNlbGYuX19maXhlZCA9IDEKKyAgICAgICAgc2VsZi5lbGVtZW50cyA9IHt9CisgICAgICAgIHNlbGYuX19maXhkaWN0KHNlbGYuX19kaWN0X18pCisgICAgICAgIHNlbGYuX19maXhjbGFzcyhzZWxmLl9fY2xhc3NfXykKKworICAgIGRlZiBfX2ZpeGNsYXNzKHNlbGYsIGtsKToKKyAgICAgICAgc2VsZi5fX2ZpeGRpY3Qoa2wuX19kaWN0X18pCisgICAgICAgIGZvciBrIGluIGtsLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIHNlbGYuX19maXhjbGFzcyhrKQorCisgICAgZGVmIF9fZml4ZGljdChzZWxmLCBkaWN0KToKKyAgICAgICAgZm9yIGtleSBpbiBkaWN0LmtleXMoKToKKyAgICAgICAgICAgIGlmIGtleVs6Nl0gPT0gJ3N0YXJ0Xyc6CisgICAgICAgICAgICAgICAgdGFnID0ga2V5WzY6XQorICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBzZWxmLmVsZW1lbnRzLmdldCh0YWcsIChOb25lLCBOb25lKSkKKyAgICAgICAgICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnRzW3RhZ10gPSBnZXRhdHRyKHNlbGYsIGtleSksIGVuZAorICAgICAgICAgICAgZWxpZiBrZXlbOjRdID09ICdlbmRfJzoKKyAgICAgICAgICAgICAgICB0YWcgPSBrZXlbNDpdCisgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IHNlbGYuZWxlbWVudHMuZ2V0KHRhZywgKE5vbmUsIE5vbmUpKQorICAgICAgICAgICAgICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVsZW1lbnRzW3RhZ10gPSBzdGFydCwgZ2V0YXR0cihzZWxmLCBrZXkpCisKKyAgICAjIEludGVyZmFjZSAtLSByZXNldCB0aGlzIGluc3RhbmNlLiAgTG9zZXMgYWxsIHVucHJvY2Vzc2VkIGRhdGEKKyAgICBkZWYgcmVzZXQoc2VsZik6CisgICAgICAgIHNlbGYucmF3ZGF0YSA9ICcnCisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLm5vbW9yZXRhZ3MgPSAwCisgICAgICAgIHNlbGYubGl0ZXJhbCA9IDAKKyAgICAgICAgc2VsZi5saW5lbm8gPSAxCisgICAgICAgIHNlbGYuX19hdF9zdGFydCA9IDEKKyAgICAgICAgc2VsZi5fX3NlZW5fZG9jdHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fX3NlZW5fc3RhcnR0YWcgPSAwCisgICAgICAgIHNlbGYuX191c2VfbmFtZXNwYWNlcyA9IDAKKyAgICAgICAgc2VsZi5fX25hbWVzcGFjZXMgPSB7J3htbCc6Tm9uZX0gICAjIHhtbCBpcyBpbXBsaWNpdGx5IGRlY2xhcmVkCisgICAgICAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBoYWNrOiBpZiBlbGVtZW50cyBub3Qgb3ZlcnJpZGRlbiwKKyAgICAgICAgIyBmaWxsIGl0IGluIG91cnNlbHZlcworICAgICAgICBpZiBzZWxmLmVsZW1lbnRzIGlzIFhNTFBhcnNlci5lbGVtZW50czoKKyAgICAgICAgICAgIHNlbGYuX19maXhlbGVtZW50cygpCisKKyAgICAjIEZvciBkZXJpdmVkIGNsYXNzZXMgb25seSAtLSBlbnRlciBsaXRlcmFsIG1vZGUgKENEQVRBKSB0aWxsIEVPRgorICAgIGRlZiBzZXRub21vcmV0YWdzKHNlbGYpOgorICAgICAgICBzZWxmLm5vbW9yZXRhZ3MgPSBzZWxmLmxpdGVyYWwgPSAxCisKKyAgICAjIEZvciBkZXJpdmVkIGNsYXNzZXMgb25seSAtLSBlbnRlciBsaXRlcmFsIG1vZGUgKENEQVRBKQorICAgIGRlZiBzZXRsaXRlcmFsKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5saXRlcmFsID0gMQorCisgICAgIyBJbnRlcmZhY2UgLS0gZmVlZCBzb21lIGRhdGEgdG8gdGhlIHBhcnNlci4gIENhbGwgdGhpcyBhcworICAgICMgb2Z0ZW4gYXMgeW91IHdhbnQsIHdpdGggYXMgbGl0dGxlIG9yIGFzIG11Y2ggdGV4dCBhcyB5b3UKKyAgICAjIHdhbnQgKG1heSBpbmNsdWRlICdcbicpLiAgKFRoaXMganVzdCBzYXZlcyB0aGUgdGV4dCwgYWxsIHRoZQorICAgICMgcHJvY2Vzc2luZyBpcyBkb25lIGJ5IGdvYWhlYWQoKS4pCisgICAgZGVmIGZlZWQoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYucmF3ZGF0YSA9IHNlbGYucmF3ZGF0YSArIGRhdGEKKyAgICAgICAgc2VsZi5nb2FoZWFkKDApCisKKyAgICAjIEludGVyZmFjZSAtLSBoYW5kbGUgdGhlIHJlbWFpbmluZyBkYXRhCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmdvYWhlYWQoMSkKKyAgICAgICAgaWYgc2VsZi5fX2ZpeGVkOgorICAgICAgICAgICAgc2VsZi5fX2ZpeGVkID0gMAorICAgICAgICAgICAgIyByZW1vdmUgc2VsZi5lbGVtZW50cyBzbyB0aGF0IHdlIGRvbid0IGxlYWsKKyAgICAgICAgICAgIGRlbCBzZWxmLmVsZW1lbnRzCisKKyAgICAjIEludGVyZmFjZSAtLSB0cmFuc2xhdGUgcmVmZXJlbmNlcworICAgIGRlZiB0cmFuc2xhdGVfcmVmZXJlbmNlcyhzZWxmLCBkYXRhLCBhbGwgPSAxKToKKyAgICAgICAgaWYgbm90IHNlbGYuX190cmFuc2xhdGVfYXR0cmlidXRlX3JlZmVyZW5jZXM6CisgICAgICAgICAgICByZXR1cm4gZGF0YQorICAgICAgICBpID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcmVzID0gYW1wLnNlYXJjaChkYXRhLCBpKQorICAgICAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEKKyAgICAgICAgICAgIHMgPSByZXMuc3RhcnQoMCkKKyAgICAgICAgICAgIHJlcyA9IHJlZi5tYXRjaChkYXRhLCBzKQorICAgICAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImJvZ3VzIGAmJyIpCisgICAgICAgICAgICAgICAgaSA9IHMrMQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpID0gcmVzLmVuZCgwKQorICAgICAgICAgICAgc3RyID0gcmVzLmdyb3VwKDEpCisgICAgICAgICAgICByZXNjYW4gPSAwCisgICAgICAgICAgICBpZiBzdHJbMF0gPT0gJyMnOgorICAgICAgICAgICAgICAgIGlmIHN0clsxXSA9PSAneCc6CisgICAgICAgICAgICAgICAgICAgIHN0ciA9IGNocihpbnQoc3RyWzI6XSwgMTYpKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN0ciA9IGNocihpbnQoc3RyWzE6XSkpCisgICAgICAgICAgICAgICAgaWYgZGF0YVtpIC0gMV0gIT0gJzsnOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYDsnIG1pc3NpbmcgYWZ0ZXIgY2hhciByZWZlcmVuY2UiKQorICAgICAgICAgICAgICAgICAgICBpID0gaS0xCisgICAgICAgICAgICBlbGlmIGFsbDoKKyAgICAgICAgICAgICAgICBpZiBzdHIgaW4gc2VsZi5lbnRpdHlkZWZzOgorICAgICAgICAgICAgICAgICAgICBzdHIgPSBzZWxmLmVudGl0eWRlZnNbc3RyXQorICAgICAgICAgICAgICAgICAgICByZXNjYW4gPSAxCisgICAgICAgICAgICAgICAgZWxpZiBkYXRhW2kgLSAxXSAhPSAnOyc6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJib2d1cyBgJiciKQorICAgICAgICAgICAgICAgICAgICBpID0gcyArIDEgIyBqdXN0IHBhc3QgdGhlICYKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigicmVmZXJlbmNlIHRvIHVua25vd24gZW50aXR5IGAmJXM7JyIgJSBzdHIpCisgICAgICAgICAgICAgICAgICAgIHN0ciA9ICcmJyArIHN0ciArICc7JworICAgICAgICAgICAgZWxpZiBkYXRhW2kgLSAxXSAhPSAnOyc6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImJvZ3VzIGAmJyIpCisgICAgICAgICAgICAgICAgaSA9IHMgKyAxICMganVzdCBwYXN0IHRoZSAmCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyB3aGVuIHdlIGdldCBoZXJlLCBzdHIgY29udGFpbnMgdGhlIHRyYW5zbGF0ZWQgdGV4dCBhbmQgaSBwb2ludHMKKyAgICAgICAgICAgICMgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nIHRoYXQgaXMgdG8gYmUgcmVwbGFjZWQKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhWzpzXSArIHN0ciArIGRhdGFbaTpdCisgICAgICAgICAgICBpZiByZXNjYW46CisgICAgICAgICAgICAgICAgaSA9IHMKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaSA9IHMgKyBsZW4oc3RyKQorCisgICAgIyBJbnRlcmZhY2UgLSByZXR1cm4gYSBkaWN0aW9uYXJ5IG9mIGFsbCBuYW1lc3BhY2VzIGN1cnJlbnRseSB2YWxpZAorICAgIGRlZiBnZXRuYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIG5zZGljdCA9IHt9CisgICAgICAgIGZvciB0LCBkLCBuc3QgaW4gc2VsZi5zdGFjazoKKyAgICAgICAgICAgIG5zZGljdC51cGRhdGUoZCkKKyAgICAgICAgcmV0dXJuIG5zZGljdAorCisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgZGF0YSBhcyBmYXIgYXMgcmVhc29uYWJsZS4gIE1heSBsZWF2ZSBzdGF0ZQorICAgICMgYW5kIGRhdGEgdG8gYmUgcHJvY2Vzc2VkIGJ5IGEgc3Vic2VxdWVudCBjYWxsLiAgSWYgJ2VuZCcgaXMKKyAgICAjIHRydWUsIGZvcmNlIGhhbmRsaW5nIGFsbCBkYXRhIGFzIGlmIGZvbGxvd2VkIGJ5IEVPRiBtYXJrZXIuCisgICAgZGVmIGdvYWhlYWQoc2VsZiwgZW5kKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpID0gMAorICAgICAgICBuID0gbGVuKHJhd2RhdGEpCisgICAgICAgIHdoaWxlIGkgPCBuOgorICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5fX2F0X3N0YXJ0ID0gMAorICAgICAgICAgICAgaWYgc2VsZi5ub21vcmV0YWdzOgorICAgICAgICAgICAgICAgIGRhdGEgPSByYXdkYXRhW2k6bl0KKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIGRhdGEuY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICBpID0gbgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICByZXMgPSBpbnRlcmVzdGluZy5zZWFyY2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgIGlmIHJlczoKKyAgICAgICAgICAgICAgICBqID0gcmVzLnN0YXJ0KDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGogPSBuCisgICAgICAgICAgICBpZiBpIDwgajoKKyAgICAgICAgICAgICAgICBkYXRhID0gcmF3ZGF0YVtpOmpdCisgICAgICAgICAgICAgICAgaWYgc2VsZi5fX2F0X3N0YXJ0IGFuZCBzcGFjZS5tYXRjaChkYXRhKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignaWxsZWdhbCBkYXRhIGF0IHN0YXJ0IG9mIGZpbGUnKQorICAgICAgICAgICAgICAgIHNlbGYuX19hdF9zdGFydCA9IDAKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zdGFjayBhbmQgc3BhY2UubWF0Y2goZGF0YSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2RhdGEgbm90IGluIGNvbnRlbnQnKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fYWNjZXB0X3V0ZjggYW5kIGlsbGVnYWwuc2VhcmNoKGRhdGEpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignaWxsZWdhbCBjaGFyYWN0ZXIgaW4gY29udGVudCcpCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyBkYXRhLmNvdW50KCdcbicpCisgICAgICAgICAgICBpID0gagorICAgICAgICAgICAgaWYgaSA9PSBuOiBicmVhaworICAgICAgICAgICAgaWYgcmF3ZGF0YVtpXSA9PSAnPCc6CisgICAgICAgICAgICAgICAgaWYgc3RhcnR0YWdvcGVuLm1hdGNoKHJhd2RhdGEsIGkpOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmF3ZGF0YVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIGRhdGEuY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX3N0YXJ0dGFnKGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBzZWxmLl9fc2Vlbl9zdGFydHRhZyA9IDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIHJhd2RhdGFbaTprXS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIGlmIGVuZHRhZ29wZW4ubWF0Y2gocmF3ZGF0YSwgaSk6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2VuZHRhZyhpKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIHJhd2RhdGFbaTprXS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBpID0gIGsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBjb21tZW50b3Blbi5tYXRjaChyYXdkYXRhLCBpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5saXRlcmFsOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHJhd2RhdGFbaV0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyBkYXRhLmNvdW50KCdcbicpCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaSsxCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9jb21tZW50KGkpCisgICAgICAgICAgICAgICAgICAgIGlmIGsgPCAwOiBicmVhaworICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmVubyA9IHNlbGYubGluZW5vICsgcmF3ZGF0YVtpOmtdLmNvdW50KCdcbicpCisgICAgICAgICAgICAgICAgICAgIGkgPSBrCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgaWYgY2RhdGFvcGVuLm1hdGNoKHJhd2RhdGEsIGkpOgorICAgICAgICAgICAgICAgICAgICBrID0gc2VsZi5wYXJzZV9jZGF0YShpKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIHJhd2RhdGFbaTprXS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlcyA9IHhtbGRlY2wubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgICAgICBpZiByZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fYXRfc3RhcnQ6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiPD94bWw/PiBkZWNsYXJhdGlvbiBub3QgYXQgc3RhcnQgb2YgZG9jdW1lbnQiKQorICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uLCBlbmNvZGluZywgc3RhbmRhbG9uZSA9IHJlcy5ncm91cCgndmVyc2lvbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdGFuZGFsb25lJykKKyAgICAgICAgICAgICAgICAgICAgaWYgdmVyc2lvblsxOi0xXSAhPSAnMS4wJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yKCdvbmx5IFhNTCB2ZXJzaW9uIDEuMCBzdXBwb3J0ZWQnKQorICAgICAgICAgICAgICAgICAgICBpZiBlbmNvZGluZzogZW5jb2RpbmcgPSBlbmNvZGluZ1sxOi0xXQorICAgICAgICAgICAgICAgICAgICBpZiBzdGFuZGFsb25lOiBzdGFuZGFsb25lID0gc3RhbmRhbG9uZVsxOi0xXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV94bWwoZW5jb2RpbmcsIHN0YW5kYWxvbmUpCisgICAgICAgICAgICAgICAgICAgIGkgPSByZXMuZW5kKDApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmVzID0gcHJvY29wZW4ubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgICAgICBpZiByZXM6CisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX3Byb2MoaSkKKyAgICAgICAgICAgICAgICAgICAgaWYgayA8IDA6IGJyZWFrCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyByYXdkYXRhW2k6a10uY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgaSA9IGsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZXMgPSBkb2N0eXBlLm1hdGNoKHJhd2RhdGEsIGkpCisgICAgICAgICAgICAgICAgaWYgcmVzOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmF3ZGF0YVtpXQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIGRhdGEuY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX19zZWVuX2RvY3R5cGU6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignbXVsdGlwbGUgRE9DVFlQRSBlbGVtZW50cycpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX19zZWVuX3N0YXJ0dGFnOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ0RPQ1RZUEUgbm90IGF0IGJlZ2lubmluZyBvZiBkb2N1bWVudCcpCisgICAgICAgICAgICAgICAgICAgIGsgPSBzZWxmLnBhcnNlX2RvY3R5cGUocmVzKQorICAgICAgICAgICAgICAgICAgICBpZiBrIDwgMDogYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fX3NlZW5fZG9jdHlwZSA9IHJlcy5ncm91cCgnbmFtZScpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19zZWVuX2RvY3R5cGUgPSBzZWxmLl9fc2Vlbl9kb2N0eXBlLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW5lbm8gPSBzZWxmLmxpbmVubyArIHJhd2RhdGFbaTprXS5jb3VudCgnXG4nKQorICAgICAgICAgICAgICAgICAgICBpID0gaworICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxpZiByYXdkYXRhW2ldID09ICcmJzoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmxpdGVyYWw6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSByYXdkYXRhW2ldCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgaSA9IGkrMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHJlcyA9IGNoYXJyZWYubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgICAgICBpZiByZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGkgPSByZXMuZW5kKDApCisgICAgICAgICAgICAgICAgICAgIGlmIHJhd2RhdGFbaS0xXSAhPSAnOyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYDsnIG1pc3NpbmcgaW4gY2hhcnJlZiIpCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gaS0xCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0YWNrOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2RhdGEgbm90IGluIGNvbnRlbnQnKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9jaGFycmVmKHJlcy5ncm91cCgnY2hhcicpWzotMV0pCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyByZXMuZ3JvdXAoMCkuY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICByZXMgPSBlbnRpdHlyZWYubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgICAgICBpZiByZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGkgPSByZXMuZW5kKDApCisgICAgICAgICAgICAgICAgICAgIGlmIHJhd2RhdGFbaS0xXSAhPSAnOyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYDsnIG1pc3NpbmcgaW4gZW50aXR5cmVmIikKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpLTEKKyAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHJlcy5ncm91cCgnbmFtZScpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgbmFtZSBpbiBzZWxmLmVudGl0eWRlZnM6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJhd2RhdGEgPSByYXdkYXRhID0gcmF3ZGF0YVs6cmVzLnN0YXJ0KDApXSArIHNlbGYuZW50aXR5ZGVmc1tuYW1lXSArIHJhd2RhdGFbaTpdCisgICAgICAgICAgICAgICAgICAgICAgICBuID0gbGVuKHJhd2RhdGEpCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gcmVzLnN0YXJ0KDApCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fZW50aXR5cmVmKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyByZXMuZ3JvdXAoMCkuY291bnQoJ1xuJykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcmF3ZGF0YVtpXSA9PSAnXSc6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5saXRlcmFsOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gcmF3ZGF0YVtpXQorICAgICAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiBuLWkgPCAzOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGlmIGNkYXRhY2xvc2UubWF0Y2gocmF3ZGF0YSwgaSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJib2d1cyBgXV0+JyIpCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2ldKQorICAgICAgICAgICAgICAgIGkgPSBpKzEKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFcnJvcignbmVpdGhlciA8IG5vciAmID8/JykKKyAgICAgICAgICAgICMgV2UgZ2V0IGhlcmUgb25seSBpZiBpbmNvbXBsZXRlIG1hdGNoZXMgYnV0CisgICAgICAgICAgICAjIG5vdGhpbmcgZWxzZQorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgIyBlbmQgd2hpbGUKKyAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICBzZWxmLl9fYXRfc3RhcnQgPSAwCisgICAgICAgIGlmIGVuZCBhbmQgaSA8IG46CisgICAgICAgICAgICBkYXRhID0gcmF3ZGF0YVtpXQorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImJvZ3VzIGAlcyciICUgZGF0YSkKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fYWNjZXB0X3V0ZjggYW5kIGlsbGVnYWwuc2VhcmNoKGRhdGEpOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdpbGxlZ2FsIGNoYXJhY3RlciBpbiBjb250ZW50JykKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKyAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gKyBkYXRhLmNvdW50KCdcbicpCisgICAgICAgICAgICBzZWxmLnJhd2RhdGEgPSByYXdkYXRhW2krMTpdCisgICAgICAgICAgICByZXR1cm4gc2VsZi5nb2FoZWFkKGVuZCkKKyAgICAgICAgc2VsZi5yYXdkYXRhID0gcmF3ZGF0YVtpOl0KKyAgICAgICAgaWYgZW5kOgorICAgICAgICAgICAgaWYgbm90IHNlbGYuX19zZWVuX3N0YXJ0dGFnOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdubyBlbGVtZW50cyBpbiBmaWxlJykKKyAgICAgICAgICAgIGlmIHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ21pc3NpbmcgZW5kIHRhZ3MnKQorICAgICAgICAgICAgICAgIHdoaWxlIHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoX2VuZHRhZyhzZWxmLnN0YWNrWy0xXVswXSkKKworICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgY29tbWVudCwgcmV0dXJuIGxlbmd0aCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgIGRlZiBwYXJzZV9jb21tZW50KHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGlmIHJhd2RhdGFbaTppKzRdICE9ICc8IS0tJzoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yKCd1bmV4cGVjdGVkIGNhbGwgdG8gaGFuZGxlX2NvbW1lbnQnKQorICAgICAgICByZXMgPSBjb21tZW50Y2xvc2Uuc2VhcmNoKHJhd2RhdGEsIGkrNCkKKyAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaWYgZG91YmxlZGFzaC5zZWFyY2gocmF3ZGF0YSwgaSs0LCByZXMuc3RhcnQoMCkpOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImAtLScgaW5zaWRlIGNvbW1lbnQiKQorICAgICAgICBpZiByYXdkYXRhW3Jlcy5zdGFydCgwKS0xXSA9PSAnLSc6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignY29tbWVudCBjYW5ub3QgZW5kIGluIHRocmVlIGRhc2hlcycpCisgICAgICAgIGlmIG5vdCBzZWxmLl9fYWNjZXB0X3V0ZjggYW5kIFwKKyAgICAgICAgICAgaWxsZWdhbC5zZWFyY2gocmF3ZGF0YSwgaSs0LCByZXMuc3RhcnQoMCkpOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2lsbGVnYWwgY2hhcmFjdGVyIGluIGNvbW1lbnQnKQorICAgICAgICBzZWxmLmhhbmRsZV9jb21tZW50KHJhd2RhdGFbaSs0OiByZXMuc3RhcnQoMCldKQorICAgICAgICByZXR1cm4gcmVzLmVuZCgwKQorCisgICAgIyBJbnRlcm5hbCAtLSBoYW5kbGUgRE9DVFlQRSB0YWcsIHJldHVybiBsZW5ndGggb3IgLTEgaWYgbm90IHRlcm1pbmF0ZWQKKyAgICBkZWYgcGFyc2VfZG9jdHlwZShzZWxmLCByZXMpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIG4gPSBsZW4ocmF3ZGF0YSkKKyAgICAgICAgbmFtZSA9IHJlcy5ncm91cCgnbmFtZScpCisgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgcHViaWQsIHN5c2xpdCA9IHJlcy5ncm91cCgncHViaWQnLCAnc3lzbGl0JykKKyAgICAgICAgaWYgcHViaWQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwdWJpZCA9IHB1YmlkWzE6LTFdICAgICAgICAgIyByZW1vdmUgcXVvdGVzCisgICAgICAgICAgICBwdWJpZCA9ICcgJy5qb2luKHB1YmlkLnNwbGl0KCkpICMgbm9ybWFsaXplCisgICAgICAgIGlmIHN5c2xpdCBpcyBub3QgTm9uZTogc3lzbGl0ID0gc3lzbGl0WzE6LTFdICMgcmVtb3ZlIHF1b3RlcworICAgICAgICBqID0gayA9IHJlcy5lbmQoMCkKKyAgICAgICAgaWYgayA+PSBuOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGlmIHJhd2RhdGFba10gPT0gJ1snOgorICAgICAgICAgICAgbGV2ZWwgPSAwCisgICAgICAgICAgICBrID0gaysxCisgICAgICAgICAgICBkcSA9IHNxID0gMAorICAgICAgICAgICAgd2hpbGUgayA8IG46CisgICAgICAgICAgICAgICAgYyA9IHJhd2RhdGFba10KKyAgICAgICAgICAgICAgICBpZiBub3Qgc3EgYW5kIGMgPT0gJyInOgorICAgICAgICAgICAgICAgICAgICBkcSA9IG5vdCBkcQorICAgICAgICAgICAgICAgIGVsaWYgbm90IGRxIGFuZCBjID09ICInIjoKKyAgICAgICAgICAgICAgICAgICAgc3EgPSBub3Qgc3EKKyAgICAgICAgICAgICAgICBlbGlmIHNxIG9yIGRxOgorICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgZWxpZiBsZXZlbCA8PSAwIGFuZCBjID09ICddJzoKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gZW5kYnJhY2tldC5tYXRjaChyYXdkYXRhLCBrKzEpCisgICAgICAgICAgICAgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RvY3R5cGUobmFtZSwgcHViaWQsIHN5c2xpdCwgcmF3ZGF0YVtqKzE6a10pCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuZW5kKDApCisgICAgICAgICAgICAgICAgZWxpZiBjID09ICc8JzoKKyAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBsZXZlbCArIDEKKyAgICAgICAgICAgICAgICBlbGlmIGMgPT0gJz4nOgorICAgICAgICAgICAgICAgICAgICBsZXZlbCA9IGxldmVsIC0gMQorICAgICAgICAgICAgICAgICAgICBpZiBsZXZlbCA8IDA6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYm9ndXMgYD4nIGluIERPQ1RZUEUiKQorICAgICAgICAgICAgICAgIGsgPSBrKzEKKyAgICAgICAgcmVzID0gZW5kYnJhY2tldGZpbmQubWF0Y2gocmF3ZGF0YSwgaykKKyAgICAgICAgaWYgcmVzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgaWYgZW5kYnJhY2tldC5tYXRjaChyYXdkYXRhLCBrKSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2dhcmJhZ2UgaW4gRE9DVFlQRScpCisgICAgICAgIHNlbGYuaGFuZGxlX2RvY3R5cGUobmFtZSwgcHViaWQsIHN5c2xpdCwgTm9uZSkKKyAgICAgICAgcmV0dXJuIHJlcy5lbmQoMCkKKworICAgICMgSW50ZXJuYWwgLS0gaGFuZGxlIENEQVRBIHRhZywgcmV0dXJuIGxlbmd0aCBvciAtMSBpZiBub3QgdGVybWluYXRlZAorICAgIGRlZiBwYXJzZV9jZGF0YShzZWxmLCBpKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBpZiByYXdkYXRhW2k6aSs5XSAhPSAnPCFbQ0RBVEFbJzoKKyAgICAgICAgICAgIHJhaXNlIEVycm9yKCd1bmV4cGVjdGVkIGNhbGwgdG8gcGFyc2VfY2RhdGEnKQorICAgICAgICByZXMgPSBjZGF0YWNsb3NlLnNlYXJjaChyYXdkYXRhLCBpKzkpCisgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGlmIG5vdCBzZWxmLl9fYWNjZXB0X3V0ZjggYW5kIFwKKyAgICAgICAgICAgaWxsZWdhbC5zZWFyY2gocmF3ZGF0YSwgaSs5LCByZXMuc3RhcnQoMCkpOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ2lsbGVnYWwgY2hhcmFjdGVyIGluIENEQVRBJykKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhY2s6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignQ0RBVEEgbm90IGluIGNvbnRlbnQnKQorICAgICAgICBzZWxmLmhhbmRsZV9jZGF0YShyYXdkYXRhW2krOTpyZXMuc3RhcnQoMCldKQorICAgICAgICByZXR1cm4gcmVzLmVuZCgwKQorCisgICAgX194bWxfbmFtZXNwYWNlX2F0dHJpYnV0ZXMgPSB7J25zJzpOb25lLCAnc3JjJzpOb25lLCAncHJlZml4JzpOb25lfQorICAgICMgSW50ZXJuYWwgLS0gaGFuZGxlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YWcKKyAgICBkZWYgcGFyc2VfcHJvYyhzZWxmLCBpKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBlbmQgPSBwcm9jY2xvc2Uuc2VhcmNoKHJhd2RhdGEsIGkpCisgICAgICAgIGlmIGVuZCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIGogPSBlbmQuc3RhcnQoMCkKKyAgICAgICAgaWYgbm90IHNlbGYuX19hY2NlcHRfdXRmOCBhbmQgaWxsZWdhbC5zZWFyY2gocmF3ZGF0YSwgaSsyLCBqKToKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdpbGxlZ2FsIGNoYXJhY3RlciBpbiBwcm9jZXNzaW5nIGluc3RydWN0aW9uJykKKyAgICAgICAgcmVzID0gdGFnZmluZC5tYXRjaChyYXdkYXRhLCBpKzIpCisgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRXJyb3IoJ3VuZXhwZWN0ZWQgY2FsbCB0byBwYXJzZV9wcm9jJykKKyAgICAgICAgayA9IHJlcy5lbmQoMCkKKyAgICAgICAgbmFtZSA9IHJlcy5ncm91cCgwKQorICAgICAgICBpZiBzZWxmLl9fbWFwX2Nhc2U6CisgICAgICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIGlmIG5hbWUgPT0gJ3htbDpuYW1lc3BhY2UnOgorICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ29sZC1mYXNoaW9uZWQgbmFtZXNwYWNlIGRlY2xhcmF0aW9uJykKKyAgICAgICAgICAgIHNlbGYuX191c2VfbmFtZXNwYWNlcyA9IC0xCisgICAgICAgICAgICAjIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgorICAgICAgICAgICAgIyB0aGlzIG11c3QgY29tZSBhZnRlciB0aGUgPD94bWw/PiBkZWNsYXJhdGlvbiAoaWYgYW55KQorICAgICAgICAgICAgIyBhbmQgYmVmb3JlIHRoZSA8IURPQ1RZUEU+IChpZiBhbnkpLgorICAgICAgICAgICAgaWYgc2VsZi5fX3NlZW5fZG9jdHlwZSBvciBzZWxmLl9fc2Vlbl9zdGFydHRhZzoKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigneG1sOm5hbWVzcGFjZSBkZWNsYXJhdGlvbiB0b28gbGF0ZSBpbiBkb2N1bWVudCcpCisgICAgICAgICAgICBhdHRyZGljdCwgbmFtZXNwYWNlLCBrID0gc2VsZi5wYXJzZV9hdHRyaWJ1dGVzKG5hbWUsIGssIGopCisgICAgICAgICAgICBpZiBuYW1lc3BhY2U6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ25hbWVzcGFjZSBkZWNsYXJhdGlvbiBpbnNpZGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uJykKKyAgICAgICAgICAgIGZvciBhdHRybmFtZSBpbiBhdHRyZGljdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGF0dHJuYW1lIGluIHNlbGYuX194bWxfbmFtZXNwYWNlX2F0dHJpYnV0ZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJ1bmtub3duIGF0dHJpYnV0ZSBgJXMnIGluIHhtbDpuYW1lc3BhY2UgdGFnIiAlIGF0dHJuYW1lKQorICAgICAgICAgICAgaWYgbm90ICducycgaW4gYXR0cmRpY3Qgb3Igbm90ICdwcmVmaXgnIGluIGF0dHJkaWN0OgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCd4bWw6bmFtZXNwYWNlIHdpdGhvdXQgcmVxdWlyZWQgYXR0cmlidXRlcycpCisgICAgICAgICAgICBwcmVmaXggPSBhdHRyZGljdC5nZXQoJ3ByZWZpeCcpCisgICAgICAgICAgICBpZiBuY25hbWUubWF0Y2gocHJlZml4KSBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCd4bWw6bmFtZXNwYWNlIGlsbGVnYWwgcHJlZml4IHZhbHVlJykKKyAgICAgICAgICAgICAgICByZXR1cm4gZW5kLmVuZCgwKQorICAgICAgICAgICAgaWYgcHJlZml4IGluIHNlbGYuX19uYW1lc3BhY2VzOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCd4bWw6bmFtZXNwYWNlIHByZWZpeCBub3QgdW5pcXVlJykKKyAgICAgICAgICAgIHNlbGYuX19uYW1lc3BhY2VzW3ByZWZpeF0gPSBhdHRyZGljdFsnbnMnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbmFtZS5sb3dlcigpID09ICd4bWwnOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdpbGxlZ2FsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0IG5hbWUnKQorICAgICAgICAgICAgc2VsZi5oYW5kbGVfcHJvYyhuYW1lLCByYXdkYXRhW2s6al0pCisgICAgICAgIHJldHVybiBlbmQuZW5kKDApCisKKyAgICAjIEludGVybmFsIC0tIHBhcnNlIGF0dHJpYnV0ZXMgYmV0d2VlbiBpIGFuZCBqCisgICAgZGVmIHBhcnNlX2F0dHJpYnV0ZXMoc2VsZiwgdGFnLCBpLCBqKToKKyAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQorICAgICAgICBhdHRyZGljdCA9IHt9CisgICAgICAgIG5hbWVzcGFjZSA9IHt9CisgICAgICAgIHdoaWxlIGkgPCBqOgorICAgICAgICAgICAgcmVzID0gYXR0cmZpbmQubWF0Y2gocmF3ZGF0YSwgaSkKKyAgICAgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhdHRybmFtZSwgYXR0cnZhbHVlID0gcmVzLmdyb3VwKCduYW1lJywgJ3ZhbHVlJykKKyAgICAgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgICAgICBhdHRybmFtZSA9IGF0dHJuYW1lLmxvd2VyKCkKKyAgICAgICAgICAgIGkgPSByZXMuZW5kKDApCisgICAgICAgICAgICBpZiBhdHRydmFsdWUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigibm8gdmFsdWUgc3BlY2lmaWVkIGZvciBhdHRyaWJ1dGUgYCVzJyIgJSBhdHRybmFtZSkKKyAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBhdHRybmFtZQorICAgICAgICAgICAgZWxpZiBhdHRydmFsdWVbOjFdID09ICInIiA9PSBhdHRydmFsdWVbLTE6XSBvciBcCisgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZVs6MV0gPT0gJyInID09IGF0dHJ2YWx1ZVstMTpdOgorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IGF0dHJ2YWx1ZVsxOi0xXQorICAgICAgICAgICAgZWxpZiBub3Qgc2VsZi5fX2FjY2VwdF91bnF1b3RlZF9hdHRyaWJ1dGVzOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCJhdHRyaWJ1dGUgYCVzJyB2YWx1ZSBub3QgcXVvdGVkIiAlIGF0dHJuYW1lKQorICAgICAgICAgICAgcmVzID0geG1sbnMubWF0Y2goYXR0cm5hbWUpCisgICAgICAgICAgICBpZiByZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgIyBuYW1lc3BhY2UgZGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICBuY25hbWUgPSByZXMuZ3JvdXAoJ25jbmFtZScpCisgICAgICAgICAgICAgICAgbmFtZXNwYWNlW25jbmFtZSBvciAnJ10gPSBhdHRydmFsdWUgb3IgTm9uZQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9fdXNlX25hbWVzcGFjZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX191c2VfbmFtZXNwYWNlcyA9IGxlbihzZWxmLnN0YWNrKSsxCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmICc8JyBpbiBhdHRydmFsdWU6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoImA8JyBpbGxlZ2FsIGluIGF0dHJpYnV0ZSB2YWx1ZSIpCisgICAgICAgICAgICBpZiBhdHRybmFtZSBpbiBhdHRyZGljdDoKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigiYXR0cmlidXRlIGAlcycgc3BlY2lmaWVkIHR3aWNlIiAlIGF0dHJuYW1lKQorICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlLnRyYW5zbGF0ZShhdHRydHJhbnMpCisgICAgICAgICAgICBhdHRyZGljdFthdHRybmFtZV0gPSBzZWxmLnRyYW5zbGF0ZV9yZWZlcmVuY2VzKGF0dHJ2YWx1ZSkKKyAgICAgICAgcmV0dXJuIGF0dHJkaWN0LCBuYW1lc3BhY2UsIGkKKworICAgICMgSW50ZXJuYWwgLS0gaGFuZGxlIHN0YXJ0dGFnLCByZXR1cm4gbGVuZ3RoIG9yIC0xIGlmIG5vdCB0ZXJtaW5hdGVkCisgICAgZGVmIHBhcnNlX3N0YXJ0dGFnKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgICMgaSBwb2ludHMgdG8gc3RhcnQgb2YgdGFnCisgICAgICAgIGVuZCA9IGVuZGJyYWNrZXRmaW5kLm1hdGNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgdGFnID0gc3RhcnR0YWdtYXRjaC5tYXRjaChyYXdkYXRhLCBpKQorICAgICAgICBpZiB0YWcgaXMgTm9uZSBvciB0YWcuZW5kKDApICE9IGVuZC5lbmQoMCk6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignZ2FyYmFnZSBpbiBzdGFydHRhZycpCisgICAgICAgICAgICByZXR1cm4gZW5kLmVuZCgwKQorICAgICAgICBuc3RhZyA9IHRhZ25hbWUgPSB0YWcuZ3JvdXAoJ3RhZ25hbWUnKQorICAgICAgICBpZiBzZWxmLl9fbWFwX2Nhc2U6CisgICAgICAgICAgICBuc3RhZyA9IHRhZ25hbWUgPSBuc3RhZy5sb3dlcigpCisgICAgICAgIGlmIG5vdCBzZWxmLl9fc2Vlbl9zdGFydHRhZyBhbmQgc2VsZi5fX3NlZW5fZG9jdHlwZSBhbmQgXAorICAgICAgICAgICB0YWduYW1lICE9IHNlbGYuX19zZWVuX2RvY3R5cGU6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignc3RhcnR0YWcgZG9lcyBub3QgbWF0Y2ggRE9DVFlQRScpCisgICAgICAgIGlmIHNlbGYuX19zZWVuX3N0YXJ0dGFnIGFuZCBub3Qgc2VsZi5zdGFjazoKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdtdWx0aXBsZSBlbGVtZW50cyBvbiB0b3AgbGV2ZWwnKQorICAgICAgICBrLCBqID0gdGFnLnNwYW4oJ2F0dHJzJykKKyAgICAgICAgYXR0cmRpY3QsIG5zZGljdCwgayA9IHNlbGYucGFyc2VfYXR0cmlidXRlcyh0YWduYW1lLCBrLCBqKQorICAgICAgICBzZWxmLnN0YWNrLmFwcGVuZCgodGFnbmFtZSwgbnNkaWN0LCBuc3RhZykpCisgICAgICAgIGlmIHNlbGYuX191c2VfbmFtZXNwYWNlczoKKyAgICAgICAgICAgIHJlcyA9IHFuYW1lLm1hdGNoKHRhZ25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXMgPSBOb25lCisgICAgICAgIGlmIHJlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHByZWZpeCwgbnN0YWcgPSByZXMuZ3JvdXAoJ3ByZWZpeCcsICdsb2NhbCcpCisgICAgICAgICAgICBpZiBwcmVmaXggaXMgTm9uZToKKyAgICAgICAgICAgICAgICBwcmVmaXggPSAnJworICAgICAgICAgICAgbnMgPSBOb25lCisgICAgICAgICAgICBmb3IgdCwgZCwgbnN0IGluIHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgaWYgcHJlZml4IGluIGQ6CisgICAgICAgICAgICAgICAgICAgIG5zID0gZFtwcmVmaXhdCisgICAgICAgICAgICBpZiBucyBpcyBOb25lIGFuZCBwcmVmaXggIT0gJyc6CisgICAgICAgICAgICAgICAgbnMgPSBzZWxmLl9fbmFtZXNwYWNlcy5nZXQocHJlZml4KQorICAgICAgICAgICAgaWYgbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbnN0YWcgPSBucyArICcgJyArIG5zdGFnCisgICAgICAgICAgICBlbGlmIHByZWZpeCAhPSAnJzoKKyAgICAgICAgICAgICAgICBuc3RhZyA9IHByZWZpeCArICc6JyArIG5zdGFnICMgdW5kbyBzcGxpdAorICAgICAgICAgICAgc2VsZi5zdGFja1stMV0gPSB0YWduYW1lLCBuc2RpY3QsIG5zdGFnCisgICAgICAgICMgdHJhbnNsYXRlIG5hbWVzcGFjZSBvZiBhdHRyaWJ1dGVzCisgICAgICAgIGF0dHJuYW1lbWFwID0ge30gIyBtYXAgZnJvbSBuZXcgbmFtZSB0byBvbGQgbmFtZSAodXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nKQorICAgICAgICBmb3Iga2V5IGluIGF0dHJkaWN0LmtleXMoKToKKyAgICAgICAgICAgIGF0dHJuYW1lbWFwW2tleV0gPSBrZXkKKyAgICAgICAgaWYgc2VsZi5fX3VzZV9uYW1lc3BhY2VzOgorICAgICAgICAgICAgbmF0dHJkaWN0ID0ge30KKyAgICAgICAgICAgIGZvciBrZXksIHZhbCBpbiBhdHRyZGljdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIG9rZXkgPSBrZXkKKyAgICAgICAgICAgICAgICByZXMgPSBxbmFtZS5tYXRjaChrZXkpCisgICAgICAgICAgICAgICAgaWYgcmVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBhcHJlZml4LCBrZXkgPSByZXMuZ3JvdXAoJ3ByZWZpeCcsICdsb2NhbCcpCisgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleSA9IGtleS5sb3dlcigpCisgICAgICAgICAgICAgICAgICAgIGlmIGFwcmVmaXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSBOb25lCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdCwgZCwgbnN0IGluIHNlbGYuc3RhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXByZWZpeCBpbiBkOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSBkW2FwcmVmaXhdCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBhbnMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbnMgPSBzZWxmLl9fbmFtZXNwYWNlcy5nZXQoYXByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBhbnMgKyAnICcgKyBrZXkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0gYXByZWZpeCArICc6JyArIGtleQorICAgICAgICAgICAgICAgIG5hdHRyZGljdFtrZXldID0gdmFsCisgICAgICAgICAgICAgICAgYXR0cm5hbWVtYXBba2V5XSA9IG9rZXkKKyAgICAgICAgICAgIGF0dHJkaWN0ID0gbmF0dHJkaWN0CisgICAgICAgIGF0dHJpYnV0ZXMgPSBzZWxmLmF0dHJpYnV0ZXMuZ2V0KG5zdGFnKQorICAgICAgICBpZiBhdHRyaWJ1dGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9yIGtleSBpbiBhdHRyZGljdC5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYgbm90IGtleSBpbiBhdHRyaWJ1dGVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigidW5rbm93biBhdHRyaWJ1dGUgYCVzJyBpbiB0YWcgYCVzJyIgJSAoYXR0cm5hbWVtYXBba2V5XSwgdGFnbmFtZSkpCisgICAgICAgICAgICBmb3Iga2V5LCB2YWwgaW4gYXR0cmlidXRlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHZhbCBpcyBub3QgTm9uZSBhbmQgbm90IGtleSBpbiBhdHRyZGljdDoKKyAgICAgICAgICAgICAgICAgICAgYXR0cmRpY3Rba2V5XSA9IHZhbAorICAgICAgICBtZXRob2QgPSBzZWxmLmVsZW1lbnRzLmdldChuc3RhZywgKE5vbmUsIE5vbmUpKVswXQorICAgICAgICBzZWxmLmZpbmlzaF9zdGFydHRhZyhuc3RhZywgYXR0cmRpY3QsIG1ldGhvZCkKKyAgICAgICAgaWYgdGFnLmdyb3VwKCdzbGFzaCcpID09ICcvJzoKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX2VuZHRhZyh0YWduYW1lKQorICAgICAgICByZXR1cm4gdGFnLmVuZCgwKQorCisgICAgIyBJbnRlcm5hbCAtLSBwYXJzZSBlbmR0YWcKKyAgICBkZWYgcGFyc2VfZW5kdGFnKHNlbGYsIGkpOgorICAgICAgICByYXdkYXRhID0gc2VsZi5yYXdkYXRhCisgICAgICAgIGVuZCA9IGVuZGJyYWNrZXRmaW5kLm1hdGNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICAgICAgcmVzID0gdGFnZmluZC5tYXRjaChyYXdkYXRhLCBpKzIpCisgICAgICAgIGlmIHJlcyBpcyBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5saXRlcmFsOgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmF3ZGF0YVtpXSkKKyAgICAgICAgICAgICAgICByZXR1cm4gaSsxCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fX2FjY2VwdF9taXNzaW5nX2VuZHRhZ19uYW1lOgorICAgICAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCdubyBuYW1lIHNwZWNpZmllZCBpbiBlbmQgdGFnJykKKyAgICAgICAgICAgIHRhZyA9IHNlbGYuc3RhY2tbLTFdWzBdCisgICAgICAgICAgICBrID0gaSsyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YWcgPSByZXMuZ3JvdXAoMCkKKyAgICAgICAgICAgIGlmIHNlbGYuX19tYXBfY2FzZToKKyAgICAgICAgICAgICAgICB0YWcgPSB0YWcubG93ZXIoKQorICAgICAgICAgICAgaWYgc2VsZi5saXRlcmFsOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnN0YWNrIG9yIHRhZyAhPSBzZWxmLnN0YWNrWy0xXVswXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShyYXdkYXRhW2ldKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaSsxCisgICAgICAgICAgICBrID0gcmVzLmVuZCgwKQorICAgICAgICBpZiBlbmRicmFja2V0Lm1hdGNoKHJhd2RhdGEsIGspIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignZ2FyYmFnZSBpbiBlbmQgdGFnJykKKyAgICAgICAgc2VsZi5maW5pc2hfZW5kdGFnKHRhZykKKyAgICAgICAgcmV0dXJuIGVuZC5lbmQoMCkKKworICAgICMgSW50ZXJuYWwgLS0gZmluaXNoIHByb2Nlc3Npbmcgb2Ygc3RhcnQgdGFnCisgICAgZGVmIGZpbmlzaF9zdGFydHRhZyhzZWxmLCB0YWduYW1lLCBhdHRyZGljdCwgbWV0aG9kKToKKyAgICAgICAgaWYgbWV0aG9kIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5oYW5kbGVfc3RhcnR0YWcodGFnbmFtZSwgbWV0aG9kLCBhdHRyZGljdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudW5rbm93bl9zdGFydHRhZyh0YWduYW1lLCBhdHRyZGljdCkKKworICAgICMgSW50ZXJuYWwgLS0gZmluaXNoIHByb2Nlc3Npbmcgb2YgZW5kIHRhZworICAgIGRlZiBmaW5pc2hfZW5kdGFnKHNlbGYsIHRhZyk6CisgICAgICAgIHNlbGYubGl0ZXJhbCA9IDAKKyAgICAgICAgaWYgbm90IHRhZzoKKyAgICAgICAgICAgIHNlbGYuc3ludGF4X2Vycm9yKCduYW1lLWxlc3MgZW5kIHRhZycpCisgICAgICAgICAgICBmb3VuZCA9IGxlbihzZWxmLnN0YWNrKSAtIDEKKyAgICAgICAgICAgIGlmIGZvdW5kIDwgMDoKKyAgICAgICAgICAgICAgICBzZWxmLnVua25vd25fZW5kdGFnKHRhZykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvdW5kID0gLTEKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnN0YWNrKSk6CisgICAgICAgICAgICAgICAgaWYgdGFnID09IHNlbGYuc3RhY2tbaV1bMF06CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gaQorICAgICAgICAgICAgaWYgZm91bmQgPT0gLTE6CisgICAgICAgICAgICAgICAgc2VsZi5zeW50YXhfZXJyb3IoJ3Vub3BlbmVkIGVuZCB0YWcnKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICB3aGlsZSBsZW4oc2VsZi5zdGFjaykgPiBmb3VuZDoKKyAgICAgICAgICAgIGlmIGZvdW5kIDwgbGVuKHNlbGYuc3RhY2spIC0gMToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheF9lcnJvcignbWlzc2luZyBjbG9zZSB0YWcgZm9yICVzJyAlIHNlbGYuc3RhY2tbLTFdWzJdKQorICAgICAgICAgICAgbnN0YWcgPSBzZWxmLnN0YWNrWy0xXVsyXQorICAgICAgICAgICAgbWV0aG9kID0gc2VsZi5lbGVtZW50cy5nZXQobnN0YWcsIChOb25lLCBOb25lKSlbMV0KKyAgICAgICAgICAgIGlmIG1ldGhvZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9lbmR0YWcobnN0YWcsIG1ldGhvZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi51bmtub3duX2VuZHRhZyhuc3RhZykKKyAgICAgICAgICAgIGlmIHNlbGYuX191c2VfbmFtZXNwYWNlcyA9PSBsZW4oc2VsZi5zdGFjayk6CisgICAgICAgICAgICAgICAgc2VsZi5fX3VzZV9uYW1lc3BhY2VzID0gMAorICAgICAgICAgICAgZGVsIHNlbGYuc3RhY2tbLTFdCisKKyAgICAjIE92ZXJyaWRhYmxlIC0tIGhhbmRsZSB4bWwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgorICAgIGRlZiBoYW5kbGVfeG1sKHNlbGYsIGVuY29kaW5nLCBzdGFuZGFsb25lKToKKyAgICAgICAgcGFzcworCisgICAgIyBPdmVycmlkYWJsZSAtLSBoYW5kbGUgRE9DVFlQRQorICAgIGRlZiBoYW5kbGVfZG9jdHlwZShzZWxmLCB0YWcsIHB1YmlkLCBzeXNsaXQsIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICAjIE92ZXJyaWRhYmxlIC0tIGhhbmRsZSBzdGFydCB0YWcKKyAgICBkZWYgaGFuZGxlX3N0YXJ0dGFnKHNlbGYsIHRhZywgbWV0aG9kLCBhdHRycyk6CisgICAgICAgIG1ldGhvZChhdHRycykKKworICAgICMgT3ZlcnJpZGFibGUgLS0gaGFuZGxlIGVuZCB0YWcKKyAgICBkZWYgaGFuZGxlX2VuZHRhZyhzZWxmLCB0YWcsIG1ldGhvZCk6CisgICAgICAgIG1ldGhvZCgpCisKKyAgICAjIEV4YW1wbGUgLS0gaGFuZGxlIGNoYXJhY3RlciByZWZlcmVuY2UsIG5vIG5lZWQgdG8gb3ZlcnJpZGUKKyAgICBkZWYgaGFuZGxlX2NoYXJyZWYoc2VsZiwgbmFtZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIG5hbWVbMF0gPT0gJ3gnOgorICAgICAgICAgICAgICAgIG4gPSBpbnQobmFtZVsxOl0sIDE2KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuID0gaW50KG5hbWUpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgc2VsZi51bmtub3duX2NoYXJyZWYobmFtZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgMCA8PSBuIDw9IDI1NToKKyAgICAgICAgICAgIHNlbGYudW5rbm93bl9jaGFycmVmKG5hbWUpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShjaHIobikpCisKKyAgICAjIERlZmluaXRpb24gb2YgZW50aXRpZXMgLS0gZGVyaXZlZCBjbGFzc2VzIG1heSBvdmVycmlkZQorICAgIGVudGl0eWRlZnMgPSB7J2x0JzogJyYjNjA7JywgICAgICAgICMgbXVzdCB1c2UgY2hhcnJlZgorICAgICAgICAgICAgICAgICAgJ2d0JzogJyYjNjI7JywKKyAgICAgICAgICAgICAgICAgICdhbXAnOiAnJiMzODsnLCAgICAgICAjIG11c3QgdXNlIGNoYXJyZWYKKyAgICAgICAgICAgICAgICAgICdxdW90JzogJyYjMzQ7JywKKyAgICAgICAgICAgICAgICAgICdhcG9zJzogJyYjMzk7JywKKyAgICAgICAgICAgICAgICAgIH0KKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgZGF0YSwgc2hvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgY2RhdGEsIGNvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgaGFuZGxlX2NkYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBwYXNzCisKKyAgICAjIEV4YW1wbGUgLS0gaGFuZGxlIGNvbW1lbnQsIGNvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgaGFuZGxlX2NvbW1lbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGNvdWxkIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgaGFuZGxlX3Byb2Moc2VsZiwgbmFtZSwgZGF0YSk6CisgICAgICAgIHBhc3MKKworICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgcmVsYXRpdmVseSBoYXJtbGVzcyBzeW50YXggZXJyb3JzLCBjb3VsZCBiZSBvdmVycmlkZGVuCisgICAgZGVmIHN5bnRheF9lcnJvcihzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgcmFpc2UgRXJyb3IoJ1N5bnRheCBlcnJvciBhdCBsaW5lICVkOiAlcycgJSAoc2VsZi5saW5lbm8sIG1lc3NhZ2UpKQorCisgICAgIyBUbyBiZSBvdmVycmlkZGVuIC0tIGhhbmRsZXJzIGZvciB1bmtub3duIG9iamVjdHMKKyAgICBkZWYgdW5rbm93bl9zdGFydHRhZyhzZWxmLCB0YWcsIGF0dHJzKTogcGFzcworICAgIGRlZiB1bmtub3duX2VuZHRhZyhzZWxmLCB0YWcpOiBwYXNzCisgICAgZGVmIHVua25vd25fY2hhcnJlZihzZWxmLCByZWYpOiBwYXNzCisgICAgZGVmIHVua25vd25fZW50aXR5cmVmKHNlbGYsIG5hbWUpOgorICAgICAgICBzZWxmLnN5bnRheF9lcnJvcigicmVmZXJlbmNlIHRvIHVua25vd24gZW50aXR5IGAmJXM7JyIgJSBuYW1lKQorCisKK2NsYXNzIFRlc3RYTUxQYXJzZXIoWE1MUGFyc2VyKToKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqKmt3KToKKyAgICAgICAgc2VsZi50ZXN0ZGF0YSA9ICIiCisgICAgICAgIFhNTFBhcnNlci5fX2luaXRfXyhzZWxmLCAqKmt3KQorCisgICAgZGVmIGhhbmRsZV94bWwoc2VsZiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcHJpbnQgJ3htbDogZW5jb2RpbmcgPScsZW5jb2RpbmcsJ3N0YW5kYWxvbmUgPScsc3RhbmRhbG9uZQorCisgICAgZGVmIGhhbmRsZV9kb2N0eXBlKHNlbGYsIHRhZywgcHViaWQsIHN5c2xpdCwgZGF0YSk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAnRE9DVFlQRTonLHRhZywgcmVwcihkYXRhKQorCisgICAgZGVmIGhhbmRsZV9kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLnRlc3RkYXRhID0gc2VsZi50ZXN0ZGF0YSArIGRhdGEKKyAgICAgICAgaWYgbGVuKHJlcHIoc2VsZi50ZXN0ZGF0YSkpID49IDcwOgorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIGRhdGEgPSBzZWxmLnRlc3RkYXRhCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBzZWxmLnRlc3RkYXRhID0gIiIKKyAgICAgICAgICAgIHByaW50ICdkYXRhOicsIHJlcHIoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfY2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAnY2RhdGE6JywgcmVwcihkYXRhKQorCisgICAgZGVmIGhhbmRsZV9wcm9jKHNlbGYsIG5hbWUsIGRhdGEpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcHJpbnQgJ3Byb2Nlc3Npbmc6JyxuYW1lLHJlcHIoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfY29tbWVudChzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHIgPSByZXByKGRhdGEpCisgICAgICAgIGlmIGxlbihyKSA+IDY4OgorICAgICAgICAgICAgciA9IHJbOjMyXSArICcuLi4nICsgclstMzI6XQorICAgICAgICBwcmludCAnY29tbWVudDonLCByCisKKyAgICBkZWYgc3ludGF4X2Vycm9yKHNlbGYsIG1lc3NhZ2UpOgorICAgICAgICBwcmludCAnZXJyb3IgYXQgbGluZSAlZDonICUgc2VsZi5saW5lbm8sIG1lc3NhZ2UKKworICAgIGRlZiB1bmtub3duX3N0YXJ0dGFnKHNlbGYsIHRhZywgYXR0cnMpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgaWYgbm90IGF0dHJzOgorICAgICAgICAgICAgcHJpbnQgJ3N0YXJ0IHRhZzogPCcgKyB0YWcgKyAnPicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICdzdGFydCB0YWc6IDwnICsgdGFnLAorICAgICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIGF0dHJzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgcHJpbnQgbmFtZSArICc9JyArICciJyArIHZhbHVlICsgJyInLAorICAgICAgICAgICAgcHJpbnQgJz4nCisKKyAgICBkZWYgdW5rbm93bl9lbmR0YWcoc2VsZiwgdGFnKToKKyAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgICAgIHByaW50ICdlbmQgdGFnOiA8LycgKyB0YWcgKyAnPicKKworICAgIGRlZiB1bmtub3duX2VudGl0eXJlZihzZWxmLCByZWYpOgorICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgcHJpbnQgJyoqKiB1bmtub3duIGVudGl0eSByZWY6ICYnICsgcmVmICsgJzsnCisKKyAgICBkZWYgdW5rbm93bl9jaGFycmVmKHNlbGYsIHJlZik6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBwcmludCAnKioqIHVua25vd24gY2hhciByZWY6ICYjJyArIHJlZiArICc7JworCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBYTUxQYXJzZXIuY2xvc2Uoc2VsZikKKyAgICAgICAgc2VsZi5mbHVzaCgpCisKK2RlZiB0ZXN0KGFyZ3MgPSBOb25lKToKKyAgICBpbXBvcnQgc3lzLCBnZXRvcHQKKyAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKworICAgIGlmIG5vdCBhcmdzOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisKKyAgICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAnc3QnKQorICAgIGtsYXNzID0gVGVzdFhNTFBhcnNlcgorICAgIGRvX3RpbWUgPSAwCisgICAgZm9yIG8sIGEgaW4gb3B0czoKKyAgICAgICAgaWYgbyA9PSAnLXMnOgorICAgICAgICAgICAga2xhc3MgPSBYTUxQYXJzZXIKKyAgICAgICAgZWxpZiBvID09ICctdCc6CisgICAgICAgICAgICBkb190aW1lID0gMQorCisgICAgaWYgYXJnczoKKyAgICAgICAgZmlsZSA9IGFyZ3NbMF0KKyAgICBlbHNlOgorICAgICAgICBmaWxlID0gJ3Rlc3QueG1sJworCisgICAgaWYgZmlsZSA9PSAnLSc6CisgICAgICAgIGYgPSBzeXMuc3RkaW4KKyAgICBlbHNlOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gb3BlbihmaWxlLCAncicpCisgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CisgICAgICAgICAgICBwcmludCBmaWxlLCAiOiIsIG1zZworICAgICAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGRhdGEgPSBmLnJlYWQoKQorICAgIGlmIGYgaXMgbm90IHN5cy5zdGRpbjoKKyAgICAgICAgZi5jbG9zZSgpCisKKyAgICB4ID0ga2xhc3MoKQorICAgIHQwID0gdGltZSgpCisgICAgdHJ5OgorICAgICAgICBpZiBkb190aW1lOgorICAgICAgICAgICAgeC5mZWVkKGRhdGEpCisgICAgICAgICAgICB4LmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBjIGluIGRhdGE6CisgICAgICAgICAgICAgICAgeC5mZWVkKGMpCisgICAgICAgICAgICB4LmNsb3NlKCkKKyAgICBleGNlcHQgRXJyb3IsIG1zZzoKKyAgICAgICAgdDEgPSB0aW1lKCkKKyAgICAgICAgcHJpbnQgbXNnCisgICAgICAgIGlmIGRvX3RpbWU6CisgICAgICAgICAgICBwcmludCAndG90YWwgdGltZTogJWcnICUgKHQxLXQwKQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIHQxID0gdGltZSgpCisgICAgaWYgZG9fdGltZToKKyAgICAgICAgcHJpbnQgJ3RvdGFsIHRpbWU6ICVnJyAlICh0MS10MCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWxsaWIucHljIGIvbGliL3B5dGhvbjIuNy94bWxsaWIucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTI5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbGxpYi5weWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWxsaWIucHlvIGIvbGliL3B5dGhvbjIuNy94bWxsaWIucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTI5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3htbGxpYi5weW8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbGliL3B5dGhvbjIuNy94bWxycGNsaWIucHkgYi9saWIvcHl0aG9uMi43L3htbHJwY2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTNlYTIzCi0tLSAvZGV2L251bGwKKysrIGIvbGliL3B5dGhvbjIuNy94bWxycGNsaWIucHkKQEAgLTAsMCArMSwxNjM5IEBACisjCisjIFhNTC1SUEMgQ0xJRU5UIExJQlJBUlkKKyMgJElkJAorIworIyBhbiBYTUwtUlBDIGNsaWVudCBpbnRlcmZhY2UgZm9yIFB5dGhvbi4KKyMKKyMgdGhlIG1hcnNoYWxsaW5nIGFuZCByZXNwb25zZSBwYXJzZXIgY29kZSBjYW4gYWxzbyBiZSB1c2VkIHRvCisjIGltcGxlbWVudCBYTUwtUlBDIHNlcnZlcnMuCisjCisjIE5vdGVzOgorIyB0aGlzIHZlcnNpb24gaXMgZGVzaWduZWQgdG8gd29yayB3aXRoIFB5dGhvbiAyLjEgb3IgbmV3ZXIuCisjCisjIEhpc3Rvcnk6CisjIDE5OTktMDEtMTQgZmwgIENyZWF0ZWQKKyMgMTk5OS0wMS0xNSBmbCAgQ2hhbmdlZCBkYXRlVGltZSB0byB1c2UgbG9jYWx0aW1lCisjIDE5OTktMDEtMTYgZmwgIEFkZGVkIEJpbmFyeS9iYXNlNjQgZWxlbWVudCwgZGVmYXVsdCB0byBSUEMyIHNlcnZpY2UKKyMgMTk5OS0wMS0xOSBmbCAgRml4ZWQgYXJyYXkgZGF0YSBlbGVtZW50IChmcm9tIFNraXAgTW9udGFuYXJvKQorIyAxOTk5LTAxLTIxIGZsICBGaXhlZCBkYXRlVGltZSBjb25zdHJ1Y3RvciwgZXRjLgorIyAxOTk5LTAyLTAyIGZsICBBZGRlZCBmYXVsdCBoYW5kbGluZywgaGFuZGxlIGVtcHR5IHNlcXVlbmNlcywgZXRjLgorIyAxOTk5LTAyLTEwIGZsICBGaXhlZCBwcm9ibGVtIHdpdGggZW1wdHkgcmVzcG9uc2VzIChmcm9tIFNraXAgTW9udGFuYXJvKQorIyAxOTk5LTA2LTIwIGZsICBTcGVlZCBpbXByb3ZlbWVudHMsIHBsdWdnYWJsZSBwYXJzZXJzL3RyYW5zcG9ydHMgKDAuOS44KQorIyAyMDAwLTExLTI4IGZsICBDaGFuZ2VkIGJvb2xlYW4gdG8gY2hlY2sgdGhlIHRydXRoIHZhbHVlIG9mIGl0cyBhcmd1bWVudAorIyAyMDAxLTAyLTI0IGZsICBBZGRlZCBlbmNvZGluZy9Vbmljb2RlL1NhZmVUcmFuc3BvcnQgcGF0Y2hlcworIyAyMDAxLTAyLTI2IGZsICBBZGRlZCBjb21wYXJlIHN1cHBvcnQgdG8gd3JhcHBlcnMgKDAuOS45LzEuMGIxKQorIyAyMDAxLTAzLTI4IGZsICBNYWtlIHN1cmUgcmVzcG9uc2UgdHVwbGUgaXMgYSBzaW5nbGV0b24KKyMgMjAwMS0wMy0yOSBmbCAgRG9uJ3QgcmVxdWlyZSBlbXB0eSBwYXJhbXMgZWxlbWVudCAoZnJvbSBOaWNob2xhcyBSaWxleSkKKyMgMjAwMS0wNi0xMCBmbCAgRm9sZGVkIGluIF94bWxycGNsaWIgYWNjZWxlcmF0b3Igc3VwcG9ydCAoMS4wYjIpCisjIDIwMDEtMDgtMjAgZmwgIEJhc2UgeG1scnBjbGliLkVycm9yIG9uIGJ1aWx0LWluIEV4Y2VwdGlvbiAoZnJvbSBQYXVsIFByZXNjb2QpCisjIDIwMDEtMDktMDMgZmwgIEFsbG93IFRyYW5zcG9ydCBzdWJjbGFzcyB0byBvdmVycmlkZSBnZXRwYXJzZXIKKyMgMjAwMS0wOS0xMCBmbCAgTGF6eSBpbXBvcnQgb2YgdXJsbGliLCBjZ2ksIHhtbGxpYiAoMjB4IGltcG9ydCBzcGVlZHVwKQorIyAyMDAxLTEwLTAxIGZsICBSZW1vdmUgY29udGFpbmVycyBmcm9tIG1lbW8gY2FjaGUgd2hlbiBkb25lIHdpdGggdGhlbQorIyAyMDAxLTEwLTAxIGZsICBVc2UgZmFzdGVyIGVzY2FwZSBtZXRob2QgKDgwJSBkdW1wcyBzcGVlZHVwKQorIyAyMDAxLTEwLTAyIGZsICBNb3JlIGR1bXBzIG1pY3JvdHVuaW5nCisjIDIwMDEtMTAtMDQgZmwgIE1ha2Ugc3VyZSBpbXBvcnQgZXhwYXQgZ2V0cyBhIHBhcnNlciAoZnJvbSBHdWlkbyB2YW4gUm9zc3VtKQorIyAyMDAxLTEwLTEwIHNtICBBbGxvdyBsb25nIGludHMgdG8gYmUgcGFzc2VkIGFzIGludHMgaWYgdGhleSBkb24ndCBvdmVyZmxvdworIyAyMDAxLTEwLTE3IHNtICBUZXN0IGZvciBpbnQgYW5kIGxvbmcgb3ZlcmZsb3cgKGFsbG93cyB1c2Ugb24gNjQtYml0IHN5c3RlbXMpCisjIDIwMDEtMTEtMTIgZmwgIFVzZSByZXByKCkgdG8gbWFyc2hhbCBkb3VibGVzIChmcm9tIFBhdWwgRmVsaXgpCisjIDIwMDItMDMtMTcgZmwgIEF2b2lkIGJ1ZmZlcmVkIHJlYWQgd2hlbiBwb3NzaWJsZSAoZnJvbSBKYW1lcyBSdWNrZXIpCisjIDIwMDItMDQtMDcgZmwgIEFkZGVkIHB5dGhvbmRvYyBjb21tZW50cworIyAyMDAyLTA0LTE2IGZsICBBZGRlZCBfX3N0cl9fIG1ldGhvZHMgdG8gZGF0ZXRpbWUvYmluYXJ5IHdyYXBwZXJzCisjIDIwMDItMDUtMTUgZmwgIEFkZGVkIGVycm9yIGNvbnN0YW50cyAoZnJvbSBBbmRyZXcgS3VjaGxpbmcpCisjIDIwMDItMDYtMjcgZmwgIE1lcmdlZCB3aXRoIFB5dGhvbiBDVlMgdmVyc2lvbgorIyAyMDAyLTEwLTIyIGZsICBBZGRlZCBiYXNpYyBhdXRoZW50aWNhdGlvbiAoYmFzZWQgb24gY29kZSBmcm9tIFBoaWxsaXAgRWJ5KQorIyAyMDAzLTAxLTIyIHNtICBBZGQgc3VwcG9ydCBmb3IgdGhlIGJvb2wgdHlwZQorIyAyMDAzLTAyLTI3IGd2ciBSZW1vdmUgYXBwbHkgY2FsbHMKKyMgMjAwMy0wNC0yNCBzbSAgVXNlIGNTdHJpbmdJTyBpZiBhdmFpbGFibGUKKyMgMjAwMy0wNC0yNSBhayAgQWRkIHN1cHBvcnQgZm9yIG5pbAorIyAyMDAzLTA2LTE1IGduICBBZGQgc3VwcG9ydCBmb3IgdGltZS5zdHJ1Y3RfdGltZQorIyAyMDAzLTA3LTEyIGdwICBDb3JyZWN0IG1hcnNoYWxsaW5nIG9mIEZhdWx0cworIyAyMDAzLTEwLTMxIG12bCBBZGQgbXVsdGljYWxsIHN1cHBvcnQKKyMgMjAwNC0wOC0yMCBtdmwgQnVtcCBtaW5pbXVtIHN1cHBvcnRlZCBQeXRob24gdmVyc2lvbiB0byAyLjEKKyMKKyMgQ29weXJpZ2h0IChjKSAxOTk5LTIwMDIgYnkgU2VjcmV0IExhYnMgQUIuCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIGJ5IEZyZWRyaWsgTHVuZGguCisjCisjIGluZm9AcHl0aG9ud2FyZS5jb20KKyMgaHR0cDovL3d3dy5weXRob253YXJlLmNvbQorIworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBUaGUgWE1MLVJQQyBjbGllbnQgaW50ZXJmYWNlIGlzCisjCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIGJ5IFNlY3JldCBMYWJzIEFCCisjIENvcHlyaWdodCAoYykgMTk5OS0yMDAyIGJ5IEZyZWRyaWsgTHVuZGgKKyMKKyMgQnkgb2J0YWluaW5nLCB1c2luZywgYW5kL29yIGNvcHlpbmcgdGhpcyBzb2Z0d2FyZSBhbmQvb3IgaXRzCisjIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiwgeW91IGFncmVlIHRoYXQgeW91IGhhdmUgcmVhZCwgdW5kZXJzdG9vZCwKKyMgYW5kIHdpbGwgY29tcGx5IHdpdGggdGhlIGZvbGxvd2luZyB0ZXJtcyBhbmQgY29uZGl0aW9uczoKKyMKKyMgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQKKyMgaXRzIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIHdpdGhvdXQgZmVlIGlzCisjIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhcnMgaW4KKyMgYWxsIGNvcGllcywgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbgorIyBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YKKyMgU2VjcmV0IExhYnMgQUIgb3IgdGhlIGF1dGhvciBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyMgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4KKyMgcHJpb3IgcGVybWlzc2lvbi4KKyMKKyMgU0VDUkVUIExBQlMgQUIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJECisjIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5ULQorIyBBQklMSVRZIEFORCBGSVRORVNTLiAgSU4gTk8gRVZFTlQgU0hBTEwgU0VDUkVUIExBQlMgQUIgT1IgVEhFIEFVVEhPUgorIyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZCisjIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAorIyBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUworIyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFCisjIE9GIFRISVMgU09GVFdBUkUuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMKKyMgdGhpbmdzIHRvIGxvb2sgaW50byBzb21lIGRheToKKworIyBUT0RPOiBzb3J0IG91dCBUcnVlL0ZhbHNlL2Jvb2xlYW4gaXNzdWVzIGZvciBQeXRob24gMi4zCisKKyIiIgorQW4gWE1MLVJQQyBjbGllbnQgaW50ZXJmYWNlIGZvciBQeXRob24uCisKK1RoZSBtYXJzaGFsbGluZyBhbmQgcmVzcG9uc2UgcGFyc2VyIGNvZGUgY2FuIGFsc28gYmUgdXNlZCB0bworaW1wbGVtZW50IFhNTC1SUEMgc2VydmVycy4KKworRXhwb3J0ZWQgZXhjZXB0aW9uczoKKworICBFcnJvciAgICAgICAgICBCYXNlIGNsYXNzIGZvciBjbGllbnQgZXJyb3JzCisgIFByb3RvY29sRXJyb3IgIEluZGljYXRlcyBhbiBIVFRQIHByb3RvY29sIGVycm9yCisgIFJlc3BvbnNlRXJyb3IgIEluZGljYXRlcyBhIGJyb2tlbiByZXNwb25zZSBwYWNrYWdlCisgIEZhdWx0ICAgICAgICAgIEluZGljYXRlcyBhbiBYTUwtUlBDIGZhdWx0IHBhY2thZ2UKKworRXhwb3J0ZWQgY2xhc3NlczoKKworICBTZXJ2ZXJQcm94eSAgICBSZXByZXNlbnRzIGEgbG9naWNhbCBjb25uZWN0aW9uIHRvIGFuIFhNTC1SUEMgc2VydmVyCisKKyAgTXVsdGlDYWxsICAgICAgRXhlY3V0b3Igb2YgYm94Y2FyZWQgeG1scnBjIHJlcXVlc3RzCisgIEJvb2xlYW4gICAgICAgIGJvb2xlYW4gd3JhcHBlciB0byBnZW5lcmF0ZSBhICJib29sZWFuIiBYTUwtUlBDIHZhbHVlCisgIERhdGVUaW1lICAgICAgIGRhdGVUaW1lIHdyYXBwZXIgZm9yIGFuIElTTyA4NjAxIHN0cmluZyBvciB0aW1lIHR1cGxlIG9yCisgICAgICAgICAgICAgICAgIGxvY2FsdGltZSBpbnRlZ2VyIHZhbHVlIHRvIGdlbmVyYXRlIGEgImRhdGVUaW1lLmlzbzg2MDEiCisgICAgICAgICAgICAgICAgIFhNTC1SUEMgdmFsdWUKKyAgQmluYXJ5ICAgICAgICAgYmluYXJ5IGRhdGEgd3JhcHBlcgorCisgIFNsb3dQYXJzZXIgICAgIFNsb3cgYnV0IHNhZmUgc3RhbmRhcmQgcGFyc2VyIChiYXNlZCBvbiB4bWxsaWIpCisgIE1hcnNoYWxsZXIgICAgIEdlbmVyYXRlIGFuIFhNTC1SUEMgcGFyYW1zIGNodW5rIGZyb20gYSBQeXRob24gZGF0YSBzdHJ1Y3R1cmUKKyAgVW5tYXJzaGFsbGVyICAgVW5tYXJzaGFsIGFuIFhNTC1SUEMgcmVzcG9uc2UgZnJvbSBpbmNvbWluZyBYTUwgZXZlbnQgbWVzc2FnZQorICBUcmFuc3BvcnQgICAgICBIYW5kbGVzIGFuIEhUVFAgdHJhbnNhY3Rpb24gdG8gYW4gWE1MLVJQQyBzZXJ2ZXIKKyAgU2FmZVRyYW5zcG9ydCAgSGFuZGxlcyBhbiBIVFRQUyB0cmFuc2FjdGlvbiB0byBhbiBYTUwtUlBDIHNlcnZlcgorCitFeHBvcnRlZCBjb25zdGFudHM6CisKKyAgVHJ1ZQorICBGYWxzZQorCitFeHBvcnRlZCBmdW5jdGlvbnM6CisKKyAgYm9vbGVhbiAgICAgICAgQ29udmVydCBhbnkgUHl0aG9uIHZhbHVlIHRvIGFuIFhNTC1SUEMgYm9vbGVhbgorICBnZXRwYXJzZXIgICAgICBDcmVhdGUgaW5zdGFuY2Ugb2YgdGhlIGZhc3Rlc3QgYXZhaWxhYmxlIHBhcnNlciAmIGF0dGFjaAorICAgICAgICAgICAgICAgICB0byBhbiB1bm1hcnNoYWxsaW5nIG9iamVjdAorICBkdW1wcyAgICAgICAgICBDb252ZXJ0IGFuIGFyZ3VtZW50IHR1cGxlIG9yIGEgRmF1bHQgaW5zdGFuY2UgdG8gYW4gWE1MLVJQQworICAgICAgICAgICAgICAgICByZXF1ZXN0IChvciByZXNwb25zZSwgaWYgdGhlIG1ldGhvZHJlc3BvbnNlIG9wdGlvbiBpcyB1c2VkKS4KKyAgbG9hZHMgICAgICAgICAgQ29udmVydCBhbiBYTUwtUlBDIHBhY2tldCB0byB1bm1hcnNoYWxsZWQgZGF0YSBwbHVzIGEgbWV0aG9kCisgICAgICAgICAgICAgICAgIG5hbWUgKE5vbmUgaWYgbm90IHByZXNlbnQpLgorIiIiCisKK2ltcG9ydCByZSwgc3RyaW5nLCB0aW1lLCBvcGVyYXRvcgorCitmcm9tIHR5cGVzIGltcG9ydCAqCitpbXBvcnQgc29ja2V0CitpbXBvcnQgZXJybm8KK2ltcG9ydCBodHRwbGliCit0cnk6CisgICAgaW1wb3J0IGd6aXAKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBnemlwID0gTm9uZSAjcHl0aG9uIGNhbiBiZSBidWlsdCB3aXRob3V0IHpsaWIvZ3ppcCBzdXBwb3J0CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgSW50ZXJuYWwgc3R1ZmYKKwordHJ5OgorICAgIHVuaWNvZGUKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgdW5pY29kZSA9IE5vbmUgIyB1bmljb2RlIHN1cHBvcnQgbm90IGF2YWlsYWJsZQorCit0cnk6CisgICAgaW1wb3J0IGRhdGV0aW1lCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgZGF0ZXRpbWUgPSBOb25lCisKK3RyeToKKyAgICBfYm9vbF9pc19idWlsdGluID0gRmFsc2UuX19jbGFzc19fLl9fbmFtZV9fID09ICJib29sIgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBfYm9vbF9pc19idWlsdGluID0gMAorCitkZWYgX2RlY29kZShkYXRhLCBlbmNvZGluZywgaXM4Yml0PXJlLmNvbXBpbGUoIltceDgwLVx4ZmZdIikuc2VhcmNoKToKKyAgICAjIGRlY29kZSBub24tYXNjaWkgc3RyaW5nIChpZiBwb3NzaWJsZSkKKyAgICBpZiB1bmljb2RlIGFuZCBlbmNvZGluZyBhbmQgaXM4Yml0KGRhdGEpOgorICAgICAgICBkYXRhID0gdW5pY29kZShkYXRhLCBlbmNvZGluZykKKyAgICByZXR1cm4gZGF0YQorCitkZWYgZXNjYXBlKHMsIHJlcGxhY2U9c3RyaW5nLnJlcGxhY2UpOgorICAgIHMgPSByZXBsYWNlKHMsICImIiwgIiZhbXA7IikKKyAgICBzID0gcmVwbGFjZShzLCAiPCIsICImbHQ7IikKKyAgICByZXR1cm4gcmVwbGFjZShzLCAiPiIsICImZ3Q7IiwpCisKK2lmIHVuaWNvZGU6CisgICAgZGVmIF9zdHJpbmdpZnkoc3RyaW5nKToKKyAgICAgICAgIyBjb252ZXJ0IHRvIDctYml0IGFzY2lpIGlmIHBvc3NpYmxlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmcuZW5jb2RlKCJhc2NpaSIpCisgICAgICAgIGV4Y2VwdCBVbmljb2RlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nCitlbHNlOgorICAgIGRlZiBfc3RyaW5naWZ5KHN0cmluZyk6CisgICAgICAgIHJldHVybiBzdHJpbmcKKworX192ZXJzaW9uX18gPSAiMS4wLjEiCisKKyMgeG1scnBjIGludGVnZXIgbGltaXRzCitNQVhJTlQgPSAgMkwqKjMxLTEKK01JTklOVCA9IC0yTCoqMzEKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBFcnJvciBjb25zdGFudHMgKGZyb20gRGFuIExpYmJ5J3Mgc3BlY2lmaWNhdGlvbiBhdAorIyBodHRwOi8veG1scnBjLWVwaS5zb3VyY2Vmb3JnZS5uZXQvc3BlY3MvcmZjLmZhdWx0X2NvZGVzLnBocCkKKworIyBSYW5nZXMgb2YgZXJyb3JzCitQQVJTRV9FUlJPUiAgICAgICA9IC0zMjcwMAorU0VSVkVSX0VSUk9SICAgICAgPSAtMzI2MDAKK0FQUExJQ0FUSU9OX0VSUk9SID0gLTMyNTAwCitTWVNURU1fRVJST1IgICAgICA9IC0zMjQwMAorVFJBTlNQT1JUX0VSUk9SICAgPSAtMzIzMDAKKworIyBTcGVjaWZpYyBlcnJvcnMKK05PVF9XRUxMRk9STUVEX0VSUk9SICA9IC0zMjcwMAorVU5TVVBQT1JURURfRU5DT0RJTkcgID0gLTMyNzAxCitJTlZBTElEX0VOQ09ESU5HX0NIQVIgPSAtMzI3MDIKK0lOVkFMSURfWE1MUlBDICAgICAgICA9IC0zMjYwMAorTUVUSE9EX05PVF9GT1VORCAgICAgID0gLTMyNjAxCitJTlZBTElEX01FVEhPRF9QQVJBTVMgPSAtMzI2MDIKK0lOVEVSTkFMX0VSUk9SICAgICAgICA9IC0zMjYwMworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEV4Y2VwdGlvbnMKKworIyMKKyMgQmFzZSBjbGFzcyBmb3IgYWxsIGtpbmRzIG9mIGNsaWVudC1zaWRlIGVycm9ycy4KKworY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciBjbGllbnQgZXJyb3JzLiIiIgorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gcmVwcihzZWxmKQorCisjIworIyBJbmRpY2F0ZXMgYW4gSFRUUC1sZXZlbCBwcm90b2NvbCBlcnJvci4gIFRoaXMgaXMgcmFpc2VkIGJ5IHRoZSBIVFRQCisjIHRyYW5zcG9ydCBsYXllciwgaWYgdGhlIHNlcnZlciByZXR1cm5zIGFuIGVycm9yIGNvZGUgb3RoZXIgdGhhbiAyMDAKKyMgKE9LKS4KKyMKKyMgQHBhcmFtIHVybCBUaGUgdGFyZ2V0IFVSTC4KKyMgQHBhcmFtIGVycmNvZGUgVGhlIEhUVFAgZXJyb3IgY29kZS4KKyMgQHBhcmFtIGVycm1zZyBUaGUgSFRUUCBlcnJvciBtZXNzYWdlLgorIyBAcGFyYW0gaGVhZGVycyBUaGUgSFRUUCBoZWFkZXIgZGljdGlvbmFyeS4KKworY2xhc3MgUHJvdG9jb2xFcnJvcihFcnJvcik6CisgICAgIiIiSW5kaWNhdGVzIGFuIEhUVFAgcHJvdG9jb2wgZXJyb3IuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCwgZXJyY29kZSwgZXJybXNnLCBoZWFkZXJzKToKKyAgICAgICAgRXJyb3IuX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi51cmwgPSB1cmwKKyAgICAgICAgc2VsZi5lcnJjb2RlID0gZXJyY29kZQorICAgICAgICBzZWxmLmVycm1zZyA9IGVycm1zZworICAgICAgICBzZWxmLmhlYWRlcnMgPSBoZWFkZXJzCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgIjxQcm90b2NvbEVycm9yIGZvciAlczogJXMgJXM+IiAlCisgICAgICAgICAgICAoc2VsZi51cmwsIHNlbGYuZXJyY29kZSwgc2VsZi5lcnJtc2cpCisgICAgICAgICAgICApCisKKyMjCisjIEluZGljYXRlcyBhIGJyb2tlbiBYTUwtUlBDIHJlc3BvbnNlIHBhY2thZ2UuICBUaGlzIGV4Y2VwdGlvbiBpcworIyByYWlzZWQgYnkgdGhlIHVubWFyc2hhbGxpbmcgbGF5ZXIsIGlmIHRoZSBYTUwtUlBDIHJlc3BvbnNlIGlzCisjIG1hbGZvcm1lZC4KKworY2xhc3MgUmVzcG9uc2VFcnJvcihFcnJvcik6CisgICAgIiIiSW5kaWNhdGVzIGEgYnJva2VuIHJlc3BvbnNlIHBhY2thZ2UuIiIiCisgICAgcGFzcworCisjIworIyBJbmRpY2F0ZXMgYW4gWE1MLVJQQyBmYXVsdCByZXNwb25zZSBwYWNrYWdlLiAgVGhpcyBleGNlcHRpb24gaXMKKyMgcmFpc2VkIGJ5IHRoZSB1bm1hcnNoYWxsaW5nIGxheWVyLCBpZiB0aGUgWE1MLVJQQyByZXNwb25zZSBjb250YWlucworIyBhIGZhdWx0IHN0cmluZy4gIFRoaXMgZXhjZXB0aW9uIGNhbiBhbHNvIHVzZWQgYXMgYSBjbGFzcywgdG8KKyMgZ2VuZXJhdGUgYSBmYXVsdCBYTUwtUlBDIG1lc3NhZ2UuCisjCisjIEBwYXJhbSBmYXVsdENvZGUgVGhlIFhNTC1SUEMgZmF1bHQgY29kZS4KKyMgQHBhcmFtIGZhdWx0U3RyaW5nIFRoZSBYTUwtUlBDIGZhdWx0IHN0cmluZy4KKworY2xhc3MgRmF1bHQoRXJyb3IpOgorICAgICIiIkluZGljYXRlcyBhbiBYTUwtUlBDIGZhdWx0IHBhY2thZ2UuIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZhdWx0Q29kZSwgZmF1bHRTdHJpbmcsICoqZXh0cmEpOgorICAgICAgICBFcnJvci5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmZhdWx0Q29kZSA9IGZhdWx0Q29kZQorICAgICAgICBzZWxmLmZhdWx0U3RyaW5nID0gZmF1bHRTdHJpbmcKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAiPEZhdWx0ICVzOiAlcz4iICUKKyAgICAgICAgICAgIChzZWxmLmZhdWx0Q29kZSwgcmVwcihzZWxmLmZhdWx0U3RyaW5nKSkKKyAgICAgICAgICAgICkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBTcGVjaWFsIHZhbHVlcworCisjIworIyBXcmFwcGVyIGZvciBYTUwtUlBDIGJvb2xlYW4gdmFsdWVzLiAgVXNlIHRoZSB4bWxycGNsaWIuVHJ1ZSBhbmQKKyMgeG1scnBjbGliLkZhbHNlIGNvbnN0YW50cywgb3IgdGhlIHhtbHJwY2xpYi5ib29sZWFuKCkgZnVuY3Rpb24sIHRvCisjIGdlbmVyYXRlIGJvb2xlYW4gWE1MLVJQQyB2YWx1ZXMuCisjCisjIEBwYXJhbSB2YWx1ZSBBIGJvb2xlYW4gdmFsdWUuICBBbnkgdHJ1ZSB2YWx1ZSBpcyBpbnRlcnByZXRlZCBhcyBUcnVlLAorIyAgICAgICAgICAgICAgYWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgRmFsc2UuCisKK2Zyb20gc3lzIGltcG9ydCBtb2R1bGVzCittb2RfZGljdCA9IG1vZHVsZXNbX19uYW1lX19dLl9fZGljdF9fCitpZiBfYm9vbF9pc19idWlsdGluOgorICAgIGJvb2xlYW4gPSBCb29sZWFuID0gYm9vbAorICAgICMgdG8gYXZvaWQgYnJlYWtpbmcgY29kZSB3aGljaCByZWZlcmVuY2VzIHhtbHJwY2xpYi57VHJ1ZSxGYWxzZX0KKyAgICBtb2RfZGljdFsnVHJ1ZSddID0gVHJ1ZQorICAgIG1vZF9kaWN0WydGYWxzZSddID0gRmFsc2UKK2Vsc2U6CisgICAgY2xhc3MgQm9vbGVhbjoKKyAgICAgICAgIiIiQm9vbGVhbi12YWx1ZSB3cmFwcGVyLgorCisgICAgICAgIFVzZSBUcnVlIG9yIEZhbHNlIHRvIGdlbmVyYXRlIGEgImJvb2xlYW4iIFhNTC1SUEMgdmFsdWUuCisgICAgICAgICIiIgorCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZSA9IDApOgorICAgICAgICAgICAgc2VsZi52YWx1ZSA9IG9wZXJhdG9yLnRydXRoKHZhbHVlKQorCisgICAgICAgIGRlZiBlbmNvZGUoc2VsZiwgb3V0KToKKyAgICAgICAgICAgIG91dC53cml0ZSgiPHZhbHVlPjxib29sZWFuPiVkPC9ib29sZWFuPjwvdmFsdWU+XG4iICUgc2VsZi52YWx1ZSkKKworICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBCb29sZWFuKToKKyAgICAgICAgICAgICAgICBvdGhlciA9IG90aGVyLnZhbHVlCisgICAgICAgICAgICByZXR1cm4gY21wKHNlbGYudmFsdWUsIG90aGVyKQorCisgICAgICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYudmFsdWU6CisgICAgICAgICAgICAgICAgcmV0dXJuICI8Qm9vbGVhbiBUcnVlIGF0ICV4PiIgJSBpZChzZWxmKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxCb29sZWFuIEZhbHNlIGF0ICV4PiIgJSBpZChzZWxmKQorCisgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsdWUKKworICAgICAgICBkZWYgX19ub256ZXJvX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorCisgICAgbW9kX2RpY3RbJ1RydWUnXSA9IEJvb2xlYW4oMSkKKyAgICBtb2RfZGljdFsnRmFsc2UnXSA9IEJvb2xlYW4oMCkKKworICAgICMjCisgICAgIyBNYXAgdHJ1ZSBvciBmYWxzZSB2YWx1ZSB0byBYTUwtUlBDIGJvb2xlYW4gdmFsdWVzLgorICAgICMKKyAgICAjIEBkZWYgYm9vbGVhbih2YWx1ZSkKKyAgICAjIEBwYXJhbSB2YWx1ZSBBIGJvb2xlYW4gdmFsdWUuICBBbnkgdHJ1ZSB2YWx1ZSBpcyBtYXBwZWQgdG8gVHJ1ZSwKKyAgICAjICAgICAgICAgICAgICBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gRmFsc2UuCisgICAgIyBAcmV0dXJuIHhtbHJwY2xpYi5UcnVlIG9yIHhtbHJwY2xpYi5GYWxzZS4KKyAgICAjIEBzZWUgQm9vbGVhbgorICAgICMgQHNlZSBUcnVlCisgICAgIyBAc2VlIEZhbHNlCisKKyAgICBkZWYgYm9vbGVhbih2YWx1ZSwgX3RydWVmYWxzZT0oRmFsc2UsIFRydWUpKToKKyAgICAgICAgIiIiQ29udmVydCBhbnkgUHl0aG9uIHZhbHVlIHRvIFhNTC1SUEMgJ2Jvb2xlYW4nLiIiIgorICAgICAgICByZXR1cm4gX3RydWVmYWxzZVtvcGVyYXRvci50cnV0aCh2YWx1ZSldCisKK2RlbCBtb2R1bGVzLCBtb2RfZGljdAorCisjIworIyBXcmFwcGVyIGZvciBYTUwtUlBDIERhdGVUaW1lIHZhbHVlcy4gIFRoaXMgY29udmVydHMgYSB0aW1lIHZhbHVlIHRvCisjIHRoZSBmb3JtYXQgdXNlZCBieSBYTUwtUlBDLgorIyA8cD4KKyMgVGhlIHZhbHVlIGNhbiBiZSBnaXZlbiBhcyBhIHN0cmluZyBpbiB0aGUgZm9ybWF0CisjICJ5eXl5bW1kZFRoaDptbTpzcyIsIGFzIGEgOS1pdGVtIHRpbWUgdHVwbGUgKGFzIHJldHVybmVkIGJ5CisjIHRpbWUubG9jYWx0aW1lKCkpLCBvciBhbiBpbnRlZ2VyIHZhbHVlIChhcyByZXR1cm5lZCBieSB0aW1lLnRpbWUoKSkuCisjIFRoZSB3cmFwcGVyIHVzZXMgdGltZS5sb2NhbHRpbWUoKSB0byBjb252ZXJ0IGFuIGludGVnZXIgdG8gYSB0aW1lCisjIHR1cGxlLgorIworIyBAcGFyYW0gdmFsdWUgVGhlIHRpbWUsIGdpdmVuIGFzIGFuIElTTyA4NjAxIHN0cmluZywgYSB0aW1lCisjICAgICAgICAgICAgICB0dXBsZSwgb3IgYSBpbnRlZ2VyIHRpbWUgdmFsdWUuCisKK2RlZiBfc3RyZnRpbWUodmFsdWUpOgorICAgIGlmIGRhdGV0aW1lOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBkYXRldGltZS5kYXRldGltZSk6CisgICAgICAgICAgICByZXR1cm4gIiUwNGQlMDJkJTAyZFQlMDJkOiUwMmQ6JTAyZCIgJSAoCisgICAgICAgICAgICAgICAgdmFsdWUueWVhciwgdmFsdWUubW9udGgsIHZhbHVlLmRheSwKKyAgICAgICAgICAgICAgICB2YWx1ZS5ob3VyLCB2YWx1ZS5taW51dGUsIHZhbHVlLnNlY29uZCkKKworICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCAoVHVwbGVUeXBlLCB0aW1lLnN0cnVjdF90aW1lKSk6CisgICAgICAgIGlmIHZhbHVlID09IDA6CisgICAgICAgICAgICB2YWx1ZSA9IHRpbWUudGltZSgpCisgICAgICAgIHZhbHVlID0gdGltZS5sb2NhbHRpbWUodmFsdWUpCisKKyAgICByZXR1cm4gIiUwNGQlMDJkJTAyZFQlMDJkOiUwMmQ6JTAyZCIgJSB2YWx1ZVs6Nl0KKworY2xhc3MgRGF0ZVRpbWU6CisgICAgIiIiRGF0ZVRpbWUgd3JhcHBlciBmb3IgYW4gSVNPIDg2MDEgc3RyaW5nIG9yIHRpbWUgdHVwbGUgb3IKKyAgICBsb2NhbHRpbWUgaW50ZWdlciB2YWx1ZSB0byBnZW5lcmF0ZSAnZGF0ZVRpbWUuaXNvODYwMScgWE1MLVJQQworICAgIHZhbHVlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlPTApOgorICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBTdHJpbmdUeXBlKToKKyAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi52YWx1ZSA9IF9zdHJmdGltZSh2YWx1ZSkKKworICAgIGRlZiBtYWtlX2NvbXBhcmFibGUoc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBEYXRlVGltZSk6CisgICAgICAgICAgICBzID0gc2VsZi52YWx1ZQorICAgICAgICAgICAgbyA9IG90aGVyLnZhbHVlCisgICAgICAgIGVsaWYgZGF0ZXRpbWUgYW5kIGlzaW5zdGFuY2Uob3RoZXIsIGRhdGV0aW1lLmRhdGV0aW1lKToKKyAgICAgICAgICAgIHMgPSBzZWxmLnZhbHVlCisgICAgICAgICAgICBvID0gb3RoZXIuc3RyZnRpbWUoIiVZJW0lZFQlSDolTTolUyIpCisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgKHN0ciwgdW5pY29kZSkpOgorICAgICAgICAgICAgcyA9IHNlbGYudmFsdWUKKyAgICAgICAgICAgIG8gPSBvdGhlcgorICAgICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICJ0aW1ldHVwbGUiKToKKyAgICAgICAgICAgIHMgPSBzZWxmLnRpbWV0dXBsZSgpCisgICAgICAgICAgICBvID0gb3RoZXIudGltZXR1cGxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG90eXBlID0gKGhhc2F0dHIob3RoZXIsICJfX2NsYXNzX18iKQorICAgICAgICAgICAgICAgICAgICAgYW5kIG90aGVyLl9fY2xhc3NfXy5fX25hbWVfXworICAgICAgICAgICAgICAgICAgICAgb3IgdHlwZShvdGhlcikpCisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGNvbXBhcmUgJXMgYW5kICVzIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBvdHlwZSkpCisgICAgICAgIHJldHVybiBzLCBvCisKKyAgICBkZWYgX19sdF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgcywgbyA9IHNlbGYubWFrZV9jb21wYXJhYmxlKG90aGVyKQorICAgICAgICByZXR1cm4gcyA8IG8KKworICAgIGRlZiBfX2xlX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBzLCBvID0gc2VsZi5tYWtlX2NvbXBhcmFibGUob3RoZXIpCisgICAgICAgIHJldHVybiBzIDw9IG8KKworICAgIGRlZiBfX2d0X18oc2VsZiwgb3RoZXIpOgorICAgICAgICBzLCBvID0gc2VsZi5tYWtlX2NvbXBhcmFibGUob3RoZXIpCisgICAgICAgIHJldHVybiBzID4gbworCisgICAgZGVmIF9fZ2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHMsIG8gPSBzZWxmLm1ha2VfY29tcGFyYWJsZShvdGhlcikKKyAgICAgICAgcmV0dXJuIHMgPj0gbworCisgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHMsIG8gPSBzZWxmLm1ha2VfY29tcGFyYWJsZShvdGhlcikKKyAgICAgICAgcmV0dXJuIHMgPT0gbworCisgICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHMsIG8gPSBzZWxmLm1ha2VfY29tcGFyYWJsZShvdGhlcikKKyAgICAgICAgcmV0dXJuIHMgIT0gbworCisgICAgZGVmIHRpbWV0dXBsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHRpbWUuc3RycHRpbWUoc2VsZi52YWx1ZSwgIiVZJW0lZFQlSDolTTolUyIpCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIHMsIG8gPSBzZWxmLm1ha2VfY29tcGFyYWJsZShvdGhlcikKKyAgICAgICAgcmV0dXJuIGNtcChzLCBvKQorCisgICAgIyMKKyAgICAjIEdldCBkYXRlL3RpbWUgdmFsdWUuCisgICAgIworICAgICMgQHJldHVybiBEYXRlL3RpbWUgdmFsdWUsIGFzIGFuIElTTyA4NjAxIHN0cmluZy4KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWx1ZQorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIjxEYXRlVGltZSAlcyBhdCAleD4iICUgKHJlcHIoc2VsZi52YWx1ZSksIGlkKHNlbGYpKQorCisgICAgZGVmIGRlY29kZShzZWxmLCBkYXRhKToKKyAgICAgICAgZGF0YSA9IHN0cihkYXRhKQorICAgICAgICBzZWxmLnZhbHVlID0gc3RyaW5nLnN0cmlwKGRhdGEpCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIG91dCk6CisgICAgICAgIG91dC53cml0ZSgiPHZhbHVlPjxkYXRlVGltZS5pc284NjAxPiIpCisgICAgICAgIG91dC53cml0ZShzZWxmLnZhbHVlKQorICAgICAgICBvdXQud3JpdGUoIjwvZGF0ZVRpbWUuaXNvODYwMT48L3ZhbHVlPlxuIikKKworZGVmIF9kYXRldGltZShkYXRhKToKKyAgICAjIGRlY29kZSB4bWwgZWxlbWVudCBjb250ZW50cyBpbnRvIGEgRGF0ZVRpbWUgc3RydWN0dXJlLgorICAgIHZhbHVlID0gRGF0ZVRpbWUoKQorICAgIHZhbHVlLmRlY29kZShkYXRhKQorICAgIHJldHVybiB2YWx1ZQorCitkZWYgX2RhdGV0aW1lX3R5cGUoZGF0YSk6CisgICAgdCA9IHRpbWUuc3RycHRpbWUoZGF0YSwgIiVZJW0lZFQlSDolTTolUyIpCisgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGV0aW1lKCp0dXBsZSh0KVs6Nl0pCisKKyMjCisjIFdyYXBwZXIgZm9yIGJpbmFyeSBkYXRhLiAgVGhpcyBjYW4gYmUgdXNlZCB0byB0cmFuc3BvcnQgYW55IGtpbmQKKyMgb2YgYmluYXJ5IGRhdGEgb3ZlciBYTUwtUlBDLCB1c2luZyBCQVNFNjQgZW5jb2RpbmcuCisjCisjIEBwYXJhbSBkYXRhIEFuIDgtYml0IHN0cmluZyBjb250YWluaW5nIGFyYml0cmFyeSBkYXRhLgorCitpbXBvcnQgYmFzZTY0Cit0cnk6CisgICAgaW1wb3J0IGNTdHJpbmdJTyBhcyBTdHJpbmdJTworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGltcG9ydCBTdHJpbmdJTworCitjbGFzcyBCaW5hcnk6CisgICAgIiIiV3JhcHBlciBmb3IgYmluYXJ5IGRhdGEuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGF0YT1Ob25lKToKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorCisgICAgIyMKKyAgICAjIEdldCBidWZmZXIgY29udGVudHMuCisgICAgIworICAgICMgQHJldHVybiBCdWZmZXIgY29udGVudHMsIGFzIGFuIDgtYml0IHN0cmluZy4KKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5kYXRhIG9yICIiCisKKyAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIEJpbmFyeSk6CisgICAgICAgICAgICBvdGhlciA9IG90aGVyLmRhdGEKKyAgICAgICAgcmV0dXJuIGNtcChzZWxmLmRhdGEsIG90aGVyKQorCisgICAgZGVmIGRlY29kZShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5kYXRhID0gYmFzZTY0LmRlY29kZXN0cmluZyhkYXRhKQorCisgICAgZGVmIGVuY29kZShzZWxmLCBvdXQpOgorICAgICAgICBvdXQud3JpdGUoIjx2YWx1ZT48YmFzZTY0PlxuIikKKyAgICAgICAgYmFzZTY0LmVuY29kZShTdHJpbmdJTy5TdHJpbmdJTyhzZWxmLmRhdGEpLCBvdXQpCisgICAgICAgIG91dC53cml0ZSgiPC9iYXNlNjQ+PC92YWx1ZT5cbiIpCisKK2RlZiBfYmluYXJ5KGRhdGEpOgorICAgICMgZGVjb2RlIHhtbCBlbGVtZW50IGNvbnRlbnRzIGludG8gYSBCaW5hcnkgc3RydWN0dXJlCisgICAgdmFsdWUgPSBCaW5hcnkoKQorICAgIHZhbHVlLmRlY29kZShkYXRhKQorICAgIHJldHVybiB2YWx1ZQorCitXUkFQUEVSUyA9IChEYXRlVGltZSwgQmluYXJ5KQoraWYgbm90IF9ib29sX2lzX2J1aWx0aW46CisgICAgV1JBUFBFUlMgPSBXUkFQUEVSUyArIChCb29sZWFuLCkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBYTUwgcGFyc2VycworCit0cnk6CisgICAgIyBvcHRpb25hbCB4bWxycGNsaWIgYWNjZWxlcmF0b3IKKyAgICBpbXBvcnQgX3htbHJwY2xpYgorICAgIEZhc3RQYXJzZXIgPSBfeG1scnBjbGliLlBhcnNlcgorICAgIEZhc3RVbm1hcnNoYWxsZXIgPSBfeG1scnBjbGliLlVubWFyc2hhbGxlcgorZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSW1wb3J0RXJyb3IpOgorICAgIEZhc3RQYXJzZXIgPSBGYXN0VW5tYXJzaGFsbGVyID0gTm9uZQorCit0cnk6CisgICAgaW1wb3J0IF94bWxycGNsaWIKKyAgICBGYXN0TWFyc2hhbGxlciA9IF94bWxycGNsaWIuTWFyc2hhbGxlcgorZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgSW1wb3J0RXJyb3IpOgorICAgIEZhc3RNYXJzaGFsbGVyID0gTm9uZQorCit0cnk6CisgICAgZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKKyAgICBpZiBub3QgaGFzYXR0cihleHBhdCwgIlBhcnNlckNyZWF0ZSIpOgorICAgICAgICByYWlzZSBJbXBvcnRFcnJvcgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIEV4cGF0UGFyc2VyID0gTm9uZSAjIGV4cGF0IG5vdCBhdmFpbGFibGUKK2Vsc2U6CisgICAgY2xhc3MgRXhwYXRQYXJzZXI6CisgICAgICAgICMgZmFzdCBleHBhdCBwYXJzZXIgZm9yIFB5dGhvbiAyLjAgYW5kIGxhdGVyLgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgdGFyZ2V0KToKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlciA9IHBhcnNlciA9IGV4cGF0LlBhcnNlckNyZWF0ZShOb25lLCBOb25lKQorICAgICAgICAgICAgc2VsZi5fdGFyZ2V0ID0gdGFyZ2V0CisgICAgICAgICAgICBwYXJzZXIuU3RhcnRFbGVtZW50SGFuZGxlciA9IHRhcmdldC5zdGFydAorICAgICAgICAgICAgcGFyc2VyLkVuZEVsZW1lbnRIYW5kbGVyID0gdGFyZ2V0LmVuZAorICAgICAgICAgICAgcGFyc2VyLkNoYXJhY3RlckRhdGFIYW5kbGVyID0gdGFyZ2V0LmRhdGEKKyAgICAgICAgICAgIGVuY29kaW5nID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IHBhcnNlci5yZXR1cm5zX3VuaWNvZGU6CisgICAgICAgICAgICAgICAgZW5jb2RpbmcgPSAidXRmLTgiCisgICAgICAgICAgICB0YXJnZXQueG1sKGVuY29kaW5nLCBOb25lKQorCisgICAgICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlBhcnNlKGRhdGEsIDApCisKKyAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICAgICAgc2VsZi5fcGFyc2VyLlBhcnNlKCIiLCAxKSAjIGVuZCBvZiBkYXRhCisgICAgICAgICAgICBkZWwgc2VsZi5fdGFyZ2V0LCBzZWxmLl9wYXJzZXIgIyBnZXQgcmlkIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMKKworY2xhc3MgU2xvd1BhcnNlcjoKKyAgICAiIiJEZWZhdWx0IFhNTCBwYXJzZXIgKGJhc2VkIG9uIHhtbGxpYi5YTUxQYXJzZXIpLiIiIgorICAgICMgdGhpcyBpcyB0aGUgc2xvd2VzdCBwYXJzZXIuCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmdldCk6CisgICAgICAgIGltcG9ydCB4bWxsaWIgIyBsYXp5IHN1YmNsYXNzaW5nICghKQorICAgICAgICBpZiB4bWxsaWIuWE1MUGFyc2VyIG5vdCBpbiBTbG93UGFyc2VyLl9fYmFzZXNfXzoKKyAgICAgICAgICAgIFNsb3dQYXJzZXIuX19iYXNlc19fID0gKHhtbGxpYi5YTUxQYXJzZXIsKQorICAgICAgICBzZWxmLmhhbmRsZV94bWwgPSB0YXJnZXQueG1sCisgICAgICAgIHNlbGYudW5rbm93bl9zdGFydHRhZyA9IHRhcmdldC5zdGFydAorICAgICAgICBzZWxmLmhhbmRsZV9kYXRhID0gdGFyZ2V0LmRhdGEKKyAgICAgICAgc2VsZi5oYW5kbGVfY2RhdGEgPSB0YXJnZXQuZGF0YQorICAgICAgICBzZWxmLnVua25vd25fZW5kdGFnID0gdGFyZ2V0LmVuZAorICAgICAgICB0cnk6CisgICAgICAgICAgICB4bWxsaWIuWE1MUGFyc2VyLl9faW5pdF9fKHNlbGYsIGFjY2VwdF91dGY4PTEpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICB4bWxsaWIuWE1MUGFyc2VyLl9faW5pdF9fKHNlbGYpICMgcHJlLTIuMAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFhNTC1SUEMgbWFyc2hhbGxpbmcgYW5kIHVubWFyc2hhbGxpbmcgY29kZQorCisjIworIyBYTUwtUlBDIG1hcnNoYWxsZXIuCisjCisjIEBwYXJhbSBlbmNvZGluZyBEZWZhdWx0IGVuY29kaW5nIGZvciA4LWJpdCBzdHJpbmdzLiAgVGhlIGRlZmF1bHQKKyMgICAgIHZhbHVlIGlzIE5vbmUgKGludGVycHJldGVkIGFzIFVURi04KS4KKyMgQHNlZSBkdW1wcworCitjbGFzcyBNYXJzaGFsbGVyOgorICAgICIiIkdlbmVyYXRlIGFuIFhNTC1SUEMgcGFyYW1zIGNodW5rIGZyb20gYSBQeXRob24gZGF0YSBzdHJ1Y3R1cmUuCisKKyAgICBDcmVhdGUgYSBNYXJzaGFsbGVyIGluc3RhbmNlIGZvciBlYWNoIHNldCBvZiBwYXJhbWV0ZXJzLCBhbmQgdXNlCisgICAgdGhlICJkdW1wcyIgbWV0aG9kIHRvIGNvbnZlcnQgeW91ciBkYXRhIChyZXByZXNlbnRlZCBhcyBhIHR1cGxlKQorICAgIHRvIGFuIFhNTC1SUEMgcGFyYW1zIGNodW5rLiAgVG8gd3JpdGUgYSBmYXVsdCByZXNwb25zZSwgcGFzcyBhCisgICAgRmF1bHQgaW5zdGFuY2UgaW5zdGVhZC4gIFlvdSBtYXkgcHJlZmVyIHRvIHVzZSB0aGUgImR1bXBzIiBtb2R1bGUKKyAgICBmdW5jdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgorICAgICIiIgorCisgICAgIyBieSB0aGUgd2F5LCBpZiB5b3UgZG9uJ3QgdW5kZXJzdGFuZCB3aGF0J3MgZ29pbmcgb24gaW4gaGVyZSwKKyAgICAjIHRoYXQncyBwZXJmZWN0bHkgb2suCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZW5jb2Rpbmc9Tm9uZSwgYWxsb3dfbm9uZT0wKToKKyAgICAgICAgc2VsZi5tZW1vID0ge30KKyAgICAgICAgc2VsZi5kYXRhID0gTm9uZQorICAgICAgICBzZWxmLmVuY29kaW5nID0gZW5jb2RpbmcKKyAgICAgICAgc2VsZi5hbGxvd19ub25lID0gYWxsb3dfbm9uZQorCisgICAgZGlzcGF0Y2ggPSB7fQorCisgICAgZGVmIGR1bXBzKHNlbGYsIHZhbHVlcyk6CisgICAgICAgIG91dCA9IFtdCisgICAgICAgIHdyaXRlID0gb3V0LmFwcGVuZAorICAgICAgICBkdW1wID0gc2VsZi5fX2R1bXAKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZXMsIEZhdWx0KToKKyAgICAgICAgICAgICMgZmF1bHQgaW5zdGFuY2UKKyAgICAgICAgICAgIHdyaXRlKCI8ZmF1bHQ+XG4iKQorICAgICAgICAgICAgZHVtcCh7J2ZhdWx0Q29kZSc6IHZhbHVlcy5mYXVsdENvZGUsCisgICAgICAgICAgICAgICAgICAnZmF1bHRTdHJpbmcnOiB2YWx1ZXMuZmF1bHRTdHJpbmd9LAorICAgICAgICAgICAgICAgICB3cml0ZSkKKyAgICAgICAgICAgIHdyaXRlKCI8L2ZhdWx0PlxuIikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgcGFyYW1ldGVyIGJsb2NrCisgICAgICAgICAgICAjIEZJWE1FOiB0aGUgeG1sLXJwYyBzcGVjaWZpY2F0aW9uIGFsbG93cyB1cyB0byBsZWF2ZSBvdXQKKyAgICAgICAgICAgICMgdGhlIGVudGlyZSA8cGFyYW1zPiBibG9jayBpZiB0aGVyZSBhcmUgbm8gcGFyYW1ldGVycy4KKyAgICAgICAgICAgICMgaG93ZXZlciwgY2hhbmdpbmcgdGhpcyBtYXkgYnJlYWsgb2xkZXIgY29kZSAoaW5jbHVkaW5nCisgICAgICAgICAgICAjIG9sZCB2ZXJzaW9ucyBvZiB4bWxycGNsaWIucHkpLCBzbyB0aGlzIGlzIGJldHRlciBsZWZ0IGFzCisgICAgICAgICAgICAjIGlzIGZvciBub3cuICBTZWUgQFhNTFJQQzMgZm9yIG1vcmUgaW5mb3JtYXRpb24uIC9GCisgICAgICAgICAgICB3cml0ZSgiPHBhcmFtcz5cbiIpCisgICAgICAgICAgICBmb3IgdiBpbiB2YWx1ZXM6CisgICAgICAgICAgICAgICAgd3JpdGUoIjxwYXJhbT5cbiIpCisgICAgICAgICAgICAgICAgZHVtcCh2LCB3cml0ZSkKKyAgICAgICAgICAgICAgICB3cml0ZSgiPC9wYXJhbT5cbiIpCisgICAgICAgICAgICB3cml0ZSgiPC9wYXJhbXM+XG4iKQorICAgICAgICByZXN1bHQgPSBzdHJpbmcuam9pbihvdXQsICIiKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19kdW1wKHNlbGYsIHZhbHVlLCB3cml0ZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGYgPSBzZWxmLmRpc3BhdGNoW3R5cGUodmFsdWUpXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAjIGNoZWNrIGlmIHRoaXMgb2JqZWN0IGNhbiBiZSBtYXJzaGFsbGVkIGFzIGEgc3RydWN0dXJlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUuX19kaWN0X18KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW5ub3QgbWFyc2hhbCAlcyBvYmplY3RzIiAlIHR5cGUodmFsdWUpCisgICAgICAgICAgICAjIGNoZWNrIGlmIHRoaXMgY2xhc3MgaXMgYSBzdWItY2xhc3Mgb2YgYSBiYXNpYyB0eXBlLAorICAgICAgICAgICAgIyBiZWNhdXNlIHdlIGRvbid0IGtub3cgaG93IHRvIG1hcnNoYWwgdGhlc2UgdHlwZXMKKyAgICAgICAgICAgICMgKGUuZy4gYSBzdHJpbmcgc3ViLWNsYXNzKQorICAgICAgICAgICAgZm9yIHR5cGVfIGluIHR5cGUodmFsdWUpLl9fbXJvX186CisgICAgICAgICAgICAgICAgaWYgdHlwZV8gaW4gc2VsZi5kaXNwYXRjaC5rZXlzKCk6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbm5vdCBtYXJzaGFsICVzIG9iamVjdHMiICUgdHlwZSh2YWx1ZSkKKyAgICAgICAgICAgIGYgPSBzZWxmLmRpc3BhdGNoW0luc3RhbmNlVHlwZV0KKyAgICAgICAgZihzZWxmLCB2YWx1ZSwgd3JpdGUpCisKKyAgICBkZWYgZHVtcF9uaWwgKHNlbGYsIHZhbHVlLCB3cml0ZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmFsbG93X25vbmU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW5ub3QgbWFyc2hhbCBOb25lIHVubGVzcyBhbGxvd19ub25lIGlzIGVuYWJsZWQiCisgICAgICAgIHdyaXRlKCI8dmFsdWU+PG5pbC8+PC92YWx1ZT4iKQorICAgIGRpc3BhdGNoW05vbmVUeXBlXSA9IGR1bXBfbmlsCisKKyAgICBkZWYgZHVtcF9pbnQoc2VsZiwgdmFsdWUsIHdyaXRlKToKKyAgICAgICAgIyBpbiBjYXNlIGludHMgYXJlID4gMzIgYml0cworICAgICAgICBpZiB2YWx1ZSA+IE1BWElOVCBvciB2YWx1ZSA8IE1JTklOVDoKKyAgICAgICAgICAgIHJhaXNlIE92ZXJmbG93RXJyb3IsICJpbnQgZXhjZWVkcyBYTUwtUlBDIGxpbWl0cyIKKyAgICAgICAgd3JpdGUoIjx2YWx1ZT48aW50PiIpCisgICAgICAgIHdyaXRlKHN0cih2YWx1ZSkpCisgICAgICAgIHdyaXRlKCI8L2ludD48L3ZhbHVlPlxuIikKKyAgICBkaXNwYXRjaFtJbnRUeXBlXSA9IGR1bXBfaW50CisKKyAgICBpZiBfYm9vbF9pc19idWlsdGluOgorICAgICAgICBkZWYgZHVtcF9ib29sKHNlbGYsIHZhbHVlLCB3cml0ZSk6CisgICAgICAgICAgICB3cml0ZSgiPHZhbHVlPjxib29sZWFuPiIpCisgICAgICAgICAgICB3cml0ZSh2YWx1ZSBhbmQgIjEiIG9yICIwIikKKyAgICAgICAgICAgIHdyaXRlKCI8L2Jvb2xlYW4+PC92YWx1ZT5cbiIpCisgICAgICAgIGRpc3BhdGNoW2Jvb2xdID0gZHVtcF9ib29sCisKKyAgICBkZWYgZHVtcF9sb25nKHNlbGYsIHZhbHVlLCB3cml0ZSk6CisgICAgICAgIGlmIHZhbHVlID4gTUFYSU5UIG9yIHZhbHVlIDwgTUlOSU5UOgorICAgICAgICAgICAgcmFpc2UgT3ZlcmZsb3dFcnJvciwgImxvbmcgaW50IGV4Y2VlZHMgWE1MLVJQQyBsaW1pdHMiCisgICAgICAgIHdyaXRlKCI8dmFsdWU+PGludD4iKQorICAgICAgICB3cml0ZShzdHIoaW50KHZhbHVlKSkpCisgICAgICAgIHdyaXRlKCI8L2ludD48L3ZhbHVlPlxuIikKKyAgICBkaXNwYXRjaFtMb25nVHlwZV0gPSBkdW1wX2xvbmcKKworICAgIGRlZiBkdW1wX2RvdWJsZShzZWxmLCB2YWx1ZSwgd3JpdGUpOgorICAgICAgICB3cml0ZSgiPHZhbHVlPjxkb3VibGU+IikKKyAgICAgICAgd3JpdGUocmVwcih2YWx1ZSkpCisgICAgICAgIHdyaXRlKCI8L2RvdWJsZT48L3ZhbHVlPlxuIikKKyAgICBkaXNwYXRjaFtGbG9hdFR5cGVdID0gZHVtcF9kb3VibGUKKworICAgIGRlZiBkdW1wX3N0cmluZyhzZWxmLCB2YWx1ZSwgd3JpdGUsIGVzY2FwZT1lc2NhcGUpOgorICAgICAgICB3cml0ZSgiPHZhbHVlPjxzdHJpbmc+IikKKyAgICAgICAgd3JpdGUoZXNjYXBlKHZhbHVlKSkKKyAgICAgICAgd3JpdGUoIjwvc3RyaW5nPjwvdmFsdWU+XG4iKQorICAgIGRpc3BhdGNoW1N0cmluZ1R5cGVdID0gZHVtcF9zdHJpbmcKKworICAgIGlmIHVuaWNvZGU6CisgICAgICAgIGRlZiBkdW1wX3VuaWNvZGUoc2VsZiwgdmFsdWUsIHdyaXRlLCBlc2NhcGU9ZXNjYXBlKToKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICB3cml0ZSgiPHZhbHVlPjxzdHJpbmc+IikKKyAgICAgICAgICAgIHdyaXRlKGVzY2FwZSh2YWx1ZSkpCisgICAgICAgICAgICB3cml0ZSgiPC9zdHJpbmc+PC92YWx1ZT5cbiIpCisgICAgICAgIGRpc3BhdGNoW1VuaWNvZGVUeXBlXSA9IGR1bXBfdW5pY29kZQorCisgICAgZGVmIGR1bXBfYXJyYXkoc2VsZiwgdmFsdWUsIHdyaXRlKToKKyAgICAgICAgaSA9IGlkKHZhbHVlKQorICAgICAgICBpZiBpIGluIHNlbGYubWVtbzoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbm5vdCBtYXJzaGFsIHJlY3Vyc2l2ZSBzZXF1ZW5jZXMiCisgICAgICAgIHNlbGYubWVtb1tpXSA9IE5vbmUKKyAgICAgICAgZHVtcCA9IHNlbGYuX19kdW1wCisgICAgICAgIHdyaXRlKCI8dmFsdWU+PGFycmF5PjxkYXRhPlxuIikKKyAgICAgICAgZm9yIHYgaW4gdmFsdWU6CisgICAgICAgICAgICBkdW1wKHYsIHdyaXRlKQorICAgICAgICB3cml0ZSgiPC9kYXRhPjwvYXJyYXk+PC92YWx1ZT5cbiIpCisgICAgICAgIGRlbCBzZWxmLm1lbW9baV0KKyAgICBkaXNwYXRjaFtUdXBsZVR5cGVdID0gZHVtcF9hcnJheQorICAgIGRpc3BhdGNoW0xpc3RUeXBlXSA9IGR1bXBfYXJyYXkKKworICAgIGRlZiBkdW1wX3N0cnVjdChzZWxmLCB2YWx1ZSwgd3JpdGUsIGVzY2FwZT1lc2NhcGUpOgorICAgICAgICBpID0gaWQodmFsdWUpCisgICAgICAgIGlmIGkgaW4gc2VsZi5tZW1vOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiY2Fubm90IG1hcnNoYWwgcmVjdXJzaXZlIGRpY3Rpb25hcmllcyIKKyAgICAgICAgc2VsZi5tZW1vW2ldID0gTm9uZQorICAgICAgICBkdW1wID0gc2VsZi5fX2R1bXAKKyAgICAgICAgd3JpdGUoIjx2YWx1ZT48c3RydWN0PlxuIikKKyAgICAgICAgZm9yIGssIHYgaW4gdmFsdWUuaXRlbXMoKToKKyAgICAgICAgICAgIHdyaXRlKCI8bWVtYmVyPlxuIikKKyAgICAgICAgICAgIGlmIHR5cGUoaykgaXMgbm90IFN0cmluZ1R5cGU6CisgICAgICAgICAgICAgICAgaWYgdW5pY29kZSBhbmQgdHlwZShrKSBpcyBVbmljb2RlVHlwZToKKyAgICAgICAgICAgICAgICAgICAgayA9IGsuZW5jb2RlKHNlbGYuZW5jb2RpbmcpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiZGljdGlvbmFyeSBrZXkgbXVzdCBiZSBzdHJpbmciCisgICAgICAgICAgICB3cml0ZSgiPG5hbWU+JXM8L25hbWU+XG4iICUgZXNjYXBlKGspKQorICAgICAgICAgICAgZHVtcCh2LCB3cml0ZSkKKyAgICAgICAgICAgIHdyaXRlKCI8L21lbWJlcj5cbiIpCisgICAgICAgIHdyaXRlKCI8L3N0cnVjdD48L3ZhbHVlPlxuIikKKyAgICAgICAgZGVsIHNlbGYubWVtb1tpXQorICAgIGRpc3BhdGNoW0RpY3RUeXBlXSA9IGR1bXBfc3RydWN0CisKKyAgICBpZiBkYXRldGltZToKKyAgICAgICAgZGVmIGR1bXBfZGF0ZXRpbWUoc2VsZiwgdmFsdWUsIHdyaXRlKToKKyAgICAgICAgICAgIHdyaXRlKCI8dmFsdWU+PGRhdGVUaW1lLmlzbzg2MDE+IikKKyAgICAgICAgICAgIHdyaXRlKF9zdHJmdGltZSh2YWx1ZSkpCisgICAgICAgICAgICB3cml0ZSgiPC9kYXRlVGltZS5pc284NjAxPjwvdmFsdWU+XG4iKQorICAgICAgICBkaXNwYXRjaFtkYXRldGltZS5kYXRldGltZV0gPSBkdW1wX2RhdGV0aW1lCisKKyAgICBkZWYgZHVtcF9pbnN0YW5jZShzZWxmLCB2YWx1ZSwgd3JpdGUpOgorICAgICAgICAjIGNoZWNrIGZvciBzcGVjaWFsIHdyYXBwZXJzCisgICAgICAgIGlmIHZhbHVlLl9fY2xhc3NfXyBpbiBXUkFQUEVSUzoKKyAgICAgICAgICAgIHNlbGYud3JpdGUgPSB3cml0ZQorICAgICAgICAgICAgdmFsdWUuZW5jb2RlKHNlbGYpCisgICAgICAgICAgICBkZWwgc2VsZi53cml0ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBzdG9yZSBpbnN0YW5jZSBhdHRyaWJ1dGVzIGFzIGEgc3RydWN0IChyZWFsbHk/KQorICAgICAgICAgICAgc2VsZi5kdW1wX3N0cnVjdCh2YWx1ZS5fX2RpY3RfXywgd3JpdGUpCisgICAgZGlzcGF0Y2hbSW5zdGFuY2VUeXBlXSA9IGR1bXBfaW5zdGFuY2UKKworIyMKKyMgWE1MLVJQQyB1bm1hcnNoYWxsZXIuCisjCisjIEBzZWUgbG9hZHMKKworY2xhc3MgVW5tYXJzaGFsbGVyOgorICAgICIiIlVubWFyc2hhbCBhbiBYTUwtUlBDIHJlc3BvbnNlLCBiYXNlZCBvbiBpbmNvbWluZyBYTUwgZXZlbnQKKyAgICBtZXNzYWdlcyAoc3RhcnQsIGRhdGEsIGVuZCkuICBDYWxsIGNsb3NlKCkgdG8gZ2V0IHRoZSByZXN1bHRpbmcKKyAgICBkYXRhIHN0cnVjdHVyZS4KKworICAgIE5vdGUgdGhhdCB0aGlzIHJlYWRlciBpcyBmYWlybHkgdG9sZXJhbnQsIGFuZCBnbGFkbHkgYWNjZXB0cyBib2d1cworICAgIFhNTC1SUEMgZGF0YSB3aXRob3V0IGNvbXBsYWluaW5nIChidXQgbm90IGJvZ3VzIFhNTCkuCisgICAgIiIiCisKKyAgICAjIGFuZCBhZ2FpbiwgaWYgeW91IGRvbid0IHVuZGVyc3RhbmQgd2hhdCdzIGdvaW5nIG9uIGluIGhlcmUsCisgICAgIyB0aGF0J3MgcGVyZmVjdGx5IG9rLgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVzZV9kYXRldGltZT0wKToKKyAgICAgICAgc2VsZi5fdHlwZSA9IE5vbmUKKyAgICAgICAgc2VsZi5fc3RhY2sgPSBbXQorICAgICAgICBzZWxmLl9tYXJrcyA9IFtdCisgICAgICAgIHNlbGYuX2RhdGEgPSBbXQorICAgICAgICBzZWxmLl9tZXRob2RuYW1lID0gTm9uZQorICAgICAgICBzZWxmLl9lbmNvZGluZyA9ICJ1dGYtOCIKKyAgICAgICAgc2VsZi5hcHBlbmQgPSBzZWxmLl9zdGFjay5hcHBlbmQKKyAgICAgICAgc2VsZi5fdXNlX2RhdGV0aW1lID0gdXNlX2RhdGV0aW1lCisgICAgICAgIGlmIHVzZV9kYXRldGltZSBhbmQgbm90IGRhdGV0aW1lOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInRoZSBkYXRldGltZSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIyByZXR1cm4gcmVzcG9uc2UgdHVwbGUgYW5kIHRhcmdldCBtZXRob2QKKyAgICAgICAgaWYgc2VsZi5fdHlwZSBpcyBOb25lIG9yIHNlbGYuX21hcmtzOgorICAgICAgICAgICAgcmFpc2UgUmVzcG9uc2VFcnJvcigpCisgICAgICAgIGlmIHNlbGYuX3R5cGUgPT0gImZhdWx0IjoKKyAgICAgICAgICAgIHJhaXNlIEZhdWx0KCoqc2VsZi5fc3RhY2tbMF0pCisgICAgICAgIHJldHVybiB0dXBsZShzZWxmLl9zdGFjaykKKworICAgIGRlZiBnZXRtZXRob2RuYW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fbWV0aG9kbmFtZQorCisgICAgIworICAgICMgZXZlbnQgaGFuZGxlcnMKKworICAgIGRlZiB4bWwoc2VsZiwgZW5jb2RpbmcsIHN0YW5kYWxvbmUpOgorICAgICAgICBzZWxmLl9lbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgICMgRklYTUU6IGFzc2VydCBzdGFuZGFsb25lID09IDEgPz8/CisKKyAgICBkZWYgc3RhcnQoc2VsZiwgdGFnLCBhdHRycyk6CisgICAgICAgICMgcHJlcGFyZSB0byBoYW5kbGUgdGhpcyBlbGVtZW50CisgICAgICAgIGlmIHRhZyA9PSAiYXJyYXkiIG9yIHRhZyA9PSAic3RydWN0IjoKKyAgICAgICAgICAgIHNlbGYuX21hcmtzLmFwcGVuZChsZW4oc2VsZi5fc3RhY2spKQorICAgICAgICBzZWxmLl9kYXRhID0gW10KKyAgICAgICAgc2VsZi5fdmFsdWUgPSAodGFnID09ICJ2YWx1ZSIpCisKKyAgICBkZWYgZGF0YShzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi5fZGF0YS5hcHBlbmQodGV4dCkKKworICAgIGRlZiBlbmQoc2VsZiwgdGFnLCBqb2luPXN0cmluZy5qb2luKToKKyAgICAgICAgIyBjYWxsIHRoZSBhcHByb3ByaWF0ZSBlbmQgdGFnIGhhbmRsZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZiA9IHNlbGYuZGlzcGF0Y2hbdGFnXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICBwYXNzICMgdW5rbm93biB0YWcgPworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGYoc2VsZiwgam9pbihzZWxmLl9kYXRhLCAiIikpCisKKyAgICAjCisgICAgIyBhY2NlbGVyYXRvciBzdXBwb3J0CisKKyAgICBkZWYgZW5kX2Rpc3BhdGNoKHNlbGYsIHRhZywgZGF0YSk6CisgICAgICAgICMgZGlzcGF0Y2ggZGF0YQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmID0gc2VsZi5kaXNwYXRjaFt0YWddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MgIyB1bmtub3duIHRhZyA/CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZihzZWxmLCBkYXRhKQorCisgICAgIworICAgICMgZWxlbWVudCBkZWNvZGVycworCisgICAgZGlzcGF0Y2ggPSB7fQorCisgICAgZGVmIGVuZF9uaWwgKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZChOb25lKQorICAgICAgICBzZWxmLl92YWx1ZSA9IDAKKyAgICBkaXNwYXRjaFsibmlsIl0gPSBlbmRfbmlsCisKKyAgICBkZWYgZW5kX2Jvb2xlYW4oc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIGRhdGEgPT0gIjAiOgorICAgICAgICAgICAgc2VsZi5hcHBlbmQoRmFsc2UpCisgICAgICAgIGVsaWYgZGF0YSA9PSAiMSI6CisgICAgICAgICAgICBzZWxmLmFwcGVuZChUcnVlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiYmFkIGJvb2xlYW4gdmFsdWUiCisgICAgICAgIHNlbGYuX3ZhbHVlID0gMAorICAgIGRpc3BhdGNoWyJib29sZWFuIl0gPSBlbmRfYm9vbGVhbgorCisgICAgZGVmIGVuZF9pbnQoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKGludChkYXRhKSkKKyAgICAgICAgc2VsZi5fdmFsdWUgPSAwCisgICAgZGlzcGF0Y2hbImk0Il0gPSBlbmRfaW50CisgICAgZGlzcGF0Y2hbImk4Il0gPSBlbmRfaW50CisgICAgZGlzcGF0Y2hbImludCJdID0gZW5kX2ludAorCisgICAgZGVmIGVuZF9kb3VibGUoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuYXBwZW5kKGZsb2F0KGRhdGEpKQorICAgICAgICBzZWxmLl92YWx1ZSA9IDAKKyAgICBkaXNwYXRjaFsiZG91YmxlIl0gPSBlbmRfZG91YmxlCisKKyAgICBkZWYgZW5kX3N0cmluZyhzZWxmLCBkYXRhKToKKyAgICAgICAgaWYgc2VsZi5fZW5jb2Rpbmc6CisgICAgICAgICAgICBkYXRhID0gX2RlY29kZShkYXRhLCBzZWxmLl9lbmNvZGluZykKKyAgICAgICAgc2VsZi5hcHBlbmQoX3N0cmluZ2lmeShkYXRhKSkKKyAgICAgICAgc2VsZi5fdmFsdWUgPSAwCisgICAgZGlzcGF0Y2hbInN0cmluZyJdID0gZW5kX3N0cmluZworICAgIGRpc3BhdGNoWyJuYW1lIl0gPSBlbmRfc3RyaW5nICMgc3RydWN0IGtleXMgYXJlIGFsd2F5cyBzdHJpbmdzCisKKyAgICBkZWYgZW5kX2FycmF5KHNlbGYsIGRhdGEpOgorICAgICAgICBtYXJrID0gc2VsZi5fbWFya3MucG9wKCkKKyAgICAgICAgIyBtYXAgYXJyYXlzIHRvIFB5dGhvbiBsaXN0cworICAgICAgICBzZWxmLl9zdGFja1ttYXJrOl0gPSBbc2VsZi5fc3RhY2tbbWFyazpdXQorICAgICAgICBzZWxmLl92YWx1ZSA9IDAKKyAgICBkaXNwYXRjaFsiYXJyYXkiXSA9IGVuZF9hcnJheQorCisgICAgZGVmIGVuZF9zdHJ1Y3Qoc2VsZiwgZGF0YSk6CisgICAgICAgIG1hcmsgPSBzZWxmLl9tYXJrcy5wb3AoKQorICAgICAgICAjIG1hcCBzdHJ1Y3RzIHRvIFB5dGhvbiBkaWN0aW9uYXJpZXMKKyAgICAgICAgZGljdCA9IHt9CisgICAgICAgIGl0ZW1zID0gc2VsZi5fc3RhY2tbbWFyazpdCisgICAgICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbihpdGVtcyksIDIpOgorICAgICAgICAgICAgZGljdFtfc3RyaW5naWZ5KGl0ZW1zW2ldKV0gPSBpdGVtc1tpKzFdCisgICAgICAgIHNlbGYuX3N0YWNrW21hcms6XSA9IFtkaWN0XQorICAgICAgICBzZWxmLl92YWx1ZSA9IDAKKyAgICBkaXNwYXRjaFsic3RydWN0Il0gPSBlbmRfc3RydWN0CisKKyAgICBkZWYgZW5kX2Jhc2U2NChzZWxmLCBkYXRhKToKKyAgICAgICAgdmFsdWUgPSBCaW5hcnkoKQorICAgICAgICB2YWx1ZS5kZWNvZGUoZGF0YSkKKyAgICAgICAgc2VsZi5hcHBlbmQodmFsdWUpCisgICAgICAgIHNlbGYuX3ZhbHVlID0gMAorICAgIGRpc3BhdGNoWyJiYXNlNjQiXSA9IGVuZF9iYXNlNjQKKworICAgIGRlZiBlbmRfZGF0ZVRpbWUoc2VsZiwgZGF0YSk6CisgICAgICAgIHZhbHVlID0gRGF0ZVRpbWUoKQorICAgICAgICB2YWx1ZS5kZWNvZGUoZGF0YSkKKyAgICAgICAgaWYgc2VsZi5fdXNlX2RhdGV0aW1lOgorICAgICAgICAgICAgdmFsdWUgPSBfZGF0ZXRpbWVfdHlwZShkYXRhKQorICAgICAgICBzZWxmLmFwcGVuZCh2YWx1ZSkKKyAgICBkaXNwYXRjaFsiZGF0ZVRpbWUuaXNvODYwMSJdID0gZW5kX2RhdGVUaW1lCisKKyAgICBkZWYgZW5kX3ZhbHVlKHNlbGYsIGRhdGEpOgorICAgICAgICAjIGlmIHdlIHN0dW1ibGUgdXBvbiBhIHZhbHVlIGVsZW1lbnQgd2l0aCBubyBpbnRlcm5hbAorICAgICAgICAjIGVsZW1lbnRzLCB0cmVhdCBpdCBhcyBhIHN0cmluZyBlbGVtZW50CisgICAgICAgIGlmIHNlbGYuX3ZhbHVlOgorICAgICAgICAgICAgc2VsZi5lbmRfc3RyaW5nKGRhdGEpCisgICAgZGlzcGF0Y2hbInZhbHVlIl0gPSBlbmRfdmFsdWUKKworICAgIGRlZiBlbmRfcGFyYW1zKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl90eXBlID0gInBhcmFtcyIKKyAgICBkaXNwYXRjaFsicGFyYW1zIl0gPSBlbmRfcGFyYW1zCisKKyAgICBkZWYgZW5kX2ZhdWx0KHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl90eXBlID0gImZhdWx0IgorICAgIGRpc3BhdGNoWyJmYXVsdCJdID0gZW5kX2ZhdWx0CisKKyAgICBkZWYgZW5kX21ldGhvZE5hbWUoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYuX2VuY29kaW5nOgorICAgICAgICAgICAgZGF0YSA9IF9kZWNvZGUoZGF0YSwgc2VsZi5fZW5jb2RpbmcpCisgICAgICAgIHNlbGYuX21ldGhvZG5hbWUgPSBkYXRhCisgICAgICAgIHNlbGYuX3R5cGUgPSAibWV0aG9kTmFtZSIgIyBubyBwYXJhbXMKKyAgICBkaXNwYXRjaFsibWV0aG9kTmFtZSJdID0gZW5kX21ldGhvZE5hbWUKKworIyMgTXVsdGljYWxsIHN1cHBvcnQKKyMKKworY2xhc3MgX011bHRpQ2FsbE1ldGhvZDoKKyAgICAjIHNvbWUgbGVzc2VyIG1hZ2ljIHRvIHN0b3JlIGNhbGxzIG1hZGUgdG8gYSBNdWx0aUNhbGwgb2JqZWN0CisgICAgIyBmb3IgYmF0Y2ggZXhlY3V0aW9uCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNhbGxfbGlzdCwgbmFtZSk6CisgICAgICAgIHNlbGYuX19jYWxsX2xpc3QgPSBjYWxsX2xpc3QKKyAgICAgICAgc2VsZi5fX25hbWUgPSBuYW1lCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gX011bHRpQ2FsbE1ldGhvZChzZWxmLl9fY2FsbF9saXN0LCAiJXMuJXMiICUgKHNlbGYuX19uYW1lLCBuYW1lKSkKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9fY2FsbF9saXN0LmFwcGVuZCgoc2VsZi5fX25hbWUsIGFyZ3MpKQorCitjbGFzcyBNdWx0aUNhbGxJdGVyYXRvcjoKKyAgICAiIiJJdGVyYXRlcyBvdmVyIHRoZSByZXN1bHRzIG9mIGEgbXVsdGljYWxsLiBFeGNlcHRpb25zIGFyZQorICAgIHJhaXNlZCBpbiByZXNwb25zZSB0byB4bWxycGMgZmF1bHRzLiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJlc3VsdHMpOgorICAgICAgICBzZWxmLnJlc3VsdHMgPSByZXN1bHRzCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CisgICAgICAgIGl0ZW0gPSBzZWxmLnJlc3VsdHNbaV0KKyAgICAgICAgaWYgdHlwZShpdGVtKSA9PSB0eXBlKHt9KToKKyAgICAgICAgICAgIHJhaXNlIEZhdWx0KGl0ZW1bJ2ZhdWx0Q29kZSddLCBpdGVtWydmYXVsdFN0cmluZyddKQorICAgICAgICBlbGlmIHR5cGUoaXRlbSkgPT0gdHlwZShbXSk6CisgICAgICAgICAgICByZXR1cm4gaXRlbVswXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcixcCisgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCB0eXBlIGluIG11bHRpY2FsbCByZXN1bHQiCisKK2NsYXNzIE11bHRpQ2FsbDoKKyAgICAiIiJzZXJ2ZXIgLT4gYSBvYmplY3QgdXNlZCB0byBib3hjYXIgbWV0aG9kIGNhbGxzCisKKyAgICBzZXJ2ZXIgc2hvdWxkIGJlIGEgU2VydmVyUHJveHkgb2JqZWN0LgorCisgICAgTWV0aG9kcyBjYW4gYmUgYWRkZWQgdG8gdGhlIE11bHRpQ2FsbCB1c2luZyBub3JtYWwKKyAgICBtZXRob2QgY2FsbCBzeW50YXggZS5nLjoKKworICAgIG11bHRpY2FsbCA9IE11bHRpQ2FsbChzZXJ2ZXJfcHJveHkpCisgICAgbXVsdGljYWxsLmFkZCgyLDMpCisgICAgbXVsdGljYWxsLmdldF9hZGRyZXNzKCJHdWlkbyIpCisKKyAgICBUbyBleGVjdXRlIHRoZSBtdWx0aWNhbGwsIGNhbGwgdGhlIE11bHRpQ2FsbCBvYmplY3QgZS5nLjoKKworICAgIGFkZF9yZXN1bHQsIGFkZHJlc3MgPSBtdWx0aWNhbGwoKQorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcik6CisgICAgICAgIHNlbGYuX19zZXJ2ZXIgPSBzZXJ2ZXIKKyAgICAgICAgc2VsZi5fX2NhbGxfbGlzdCA9IFtdCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAiPE11bHRpQ2FsbCBhdCAleD4iICUgaWQoc2VsZikKKworICAgIF9fc3RyX18gPSBfX3JlcHJfXworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gX011bHRpQ2FsbE1ldGhvZChzZWxmLl9fY2FsbF9saXN0LCBuYW1lKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYpOgorICAgICAgICBtYXJzaGFsbGVkX2xpc3QgPSBbXQorICAgICAgICBmb3IgbmFtZSwgYXJncyBpbiBzZWxmLl9fY2FsbF9saXN0OgorICAgICAgICAgICAgbWFyc2hhbGxlZF9saXN0LmFwcGVuZCh7J21ldGhvZE5hbWUnIDogbmFtZSwgJ3BhcmFtcycgOiBhcmdzfSkKKworICAgICAgICByZXR1cm4gTXVsdGlDYWxsSXRlcmF0b3Ioc2VsZi5fX3NlcnZlci5zeXN0ZW0ubXVsdGljYWxsKG1hcnNoYWxsZWRfbGlzdCkpCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgY29udmVuaWVuY2UgZnVuY3Rpb25zCisKKyMjCisjIENyZWF0ZSBhIHBhcnNlciBvYmplY3QsIGFuZCBjb25uZWN0IGl0IHRvIGFuIHVubWFyc2hhbGxpbmcgaW5zdGFuY2UuCisjIFRoaXMgZnVuY3Rpb24gcGlja3MgdGhlIGZhc3Rlc3QgYXZhaWxhYmxlIFhNTCBwYXJzZXIuCisjCisjIHJldHVybiBBIChwYXJzZXIsIHVubWFyc2hhbGxlcikgdHVwbGUuCisKK2RlZiBnZXRwYXJzZXIodXNlX2RhdGV0aW1lPTApOgorICAgICIiImdldHBhcnNlcigpIC0+IHBhcnNlciwgdW5tYXJzaGFsbGVyCisKKyAgICBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhc3Rlc3QgYXZhaWxhYmxlIHBhcnNlciwgYW5kIGF0dGFjaCBpdAorICAgIHRvIGFuIHVubWFyc2hhbGxpbmcgb2JqZWN0LiAgUmV0dXJuIGJvdGggb2JqZWN0cy4KKyAgICAiIiIKKyAgICBpZiB1c2VfZGF0ZXRpbWUgYW5kIG5vdCBkYXRldGltZToKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInRoZSBkYXRldGltZSBtb2R1bGUgaXMgbm90IGF2YWlsYWJsZSIKKyAgICBpZiBGYXN0UGFyc2VyIGFuZCBGYXN0VW5tYXJzaGFsbGVyOgorICAgICAgICBpZiB1c2VfZGF0ZXRpbWU6CisgICAgICAgICAgICBta2RhdGV0aW1lID0gX2RhdGV0aW1lX3R5cGUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1rZGF0ZXRpbWUgPSBfZGF0ZXRpbWUKKyAgICAgICAgdGFyZ2V0ID0gRmFzdFVubWFyc2hhbGxlcihUcnVlLCBGYWxzZSwgX2JpbmFyeSwgbWtkYXRldGltZSwgRmF1bHQpCisgICAgICAgIHBhcnNlciA9IEZhc3RQYXJzZXIodGFyZ2V0KQorICAgIGVsc2U6CisgICAgICAgIHRhcmdldCA9IFVubWFyc2hhbGxlcih1c2VfZGF0ZXRpbWU9dXNlX2RhdGV0aW1lKQorICAgICAgICBpZiBGYXN0UGFyc2VyOgorICAgICAgICAgICAgcGFyc2VyID0gRmFzdFBhcnNlcih0YXJnZXQpCisgICAgICAgIGVsaWYgRXhwYXRQYXJzZXI6CisgICAgICAgICAgICBwYXJzZXIgPSBFeHBhdFBhcnNlcih0YXJnZXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZXIgPSBTbG93UGFyc2VyKHRhcmdldCkKKyAgICByZXR1cm4gcGFyc2VyLCB0YXJnZXQKKworIyMKKyMgQ29udmVydCBhIFB5dGhvbiB0dXBsZSBvciBhIEZhdWx0IGluc3RhbmNlIHRvIGFuIFhNTC1SUEMgcGFja2V0LgorIworIyBAZGVmIGR1bXBzKHBhcmFtcywgKipvcHRpb25zKQorIyBAcGFyYW0gcGFyYW1zIEEgdHVwbGUgb3IgRmF1bHQgaW5zdGFuY2UuCisjIEBrZXlwYXJhbSBtZXRob2RuYW1lIElmIGdpdmVuLCBjcmVhdGUgYSBtZXRob2RDYWxsIHJlcXVlc3QgZm9yCisjICAgICB0aGlzIG1ldGhvZCBuYW1lLgorIyBAa2V5cGFyYW0gbWV0aG9kcmVzcG9uc2UgSWYgZ2l2ZW4sIGNyZWF0ZSBhIG1ldGhvZFJlc3BvbnNlIHBhY2tldC4KKyMgICAgIElmIHVzZWQgd2l0aCBhIHR1cGxlLCB0aGUgdHVwbGUgbXVzdCBiZSBhIHNpbmdsZXRvbiAodGhhdCBpcywKKyMgICAgIGl0IG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBlbGVtZW50KS4KKyMgQGtleXBhcmFtIGVuY29kaW5nIFRoZSBwYWNrZXQgZW5jb2RpbmcuCisjIEByZXR1cm4gQSBzdHJpbmcgY29udGFpbmluZyBtYXJzaGFsbGVkIGRhdGEuCisKK2RlZiBkdW1wcyhwYXJhbXMsIG1ldGhvZG5hbWU9Tm9uZSwgbWV0aG9kcmVzcG9uc2U9Tm9uZSwgZW5jb2Rpbmc9Tm9uZSwKKyAgICAgICAgICBhbGxvd19ub25lPTApOgorICAgICIiImRhdGEgWyxvcHRpb25zXSAtPiBtYXJzaGFsbGVkIGRhdGEKKworICAgIENvbnZlcnQgYW4gYXJndW1lbnQgdHVwbGUgb3IgYSBGYXVsdCBpbnN0YW5jZSB0byBhbiBYTUwtUlBDCisgICAgcmVxdWVzdCAob3IgcmVzcG9uc2UsIGlmIHRoZSBtZXRob2RyZXNwb25zZSBvcHRpb24gaXMgdXNlZCkuCisKKyAgICBJbiBhZGRpdGlvbiB0byB0aGUgZGF0YSBvYmplY3QsIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyBjYW4gYmUgZ2l2ZW4KKyAgICBhcyBrZXl3b3JkIGFyZ3VtZW50czoKKworICAgICAgICBtZXRob2RuYW1lOiB0aGUgbWV0aG9kIG5hbWUgZm9yIGEgbWV0aG9kQ2FsbCBwYWNrZXQKKworICAgICAgICBtZXRob2RyZXNwb25zZTogdHJ1ZSB0byBjcmVhdGUgYSBtZXRob2RSZXNwb25zZSBwYWNrZXQuCisgICAgICAgIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQgd2l0aCBhIHR1cGxlLCB0aGUgdHVwbGUgbXVzdCBiZQorICAgICAgICBhIHNpbmdsZXRvbiAoaS5lLiBpdCBjYW4gY29udGFpbiBvbmx5IG9uZSBlbGVtZW50KS4KKworICAgICAgICBlbmNvZGluZzogdGhlIHBhY2tldCBlbmNvZGluZyAoZGVmYXVsdCBpcyBVVEYtOCkKKworICAgIEFsbCA4LWJpdCBzdHJpbmdzIGluIHRoZSBkYXRhIHN0cnVjdHVyZSBhcmUgYXNzdW1lZCB0byB1c2UgdGhlCisgICAgcGFja2V0IGVuY29kaW5nLiAgVW5pY29kZSBzdHJpbmdzIGFyZSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCwKKyAgICB3aGVyZSBuZWNlc3NhcnkuCisgICAgIiIiCisKKyAgICBhc3NlcnQgaXNpbnN0YW5jZShwYXJhbXMsIFR1cGxlVHlwZSkgb3IgaXNpbnN0YW5jZShwYXJhbXMsIEZhdWx0KSxcCisgICAgICAgICAgICJhcmd1bWVudCBtdXN0IGJlIHR1cGxlIG9yIEZhdWx0IGluc3RhbmNlIgorCisgICAgaWYgaXNpbnN0YW5jZShwYXJhbXMsIEZhdWx0KToKKyAgICAgICAgbWV0aG9kcmVzcG9uc2UgPSAxCisgICAgZWxpZiBtZXRob2RyZXNwb25zZSBhbmQgaXNpbnN0YW5jZShwYXJhbXMsIFR1cGxlVHlwZSk6CisgICAgICAgIGFzc2VydCBsZW4ocGFyYW1zKSA9PSAxLCAicmVzcG9uc2UgdHVwbGUgbXVzdCBiZSBhIHNpbmdsZXRvbiIKKworICAgIGlmIG5vdCBlbmNvZGluZzoKKyAgICAgICAgZW5jb2RpbmcgPSAidXRmLTgiCisKKyAgICBpZiBGYXN0TWFyc2hhbGxlcjoKKyAgICAgICAgbSA9IEZhc3RNYXJzaGFsbGVyKGVuY29kaW5nKQorICAgIGVsc2U6CisgICAgICAgIG0gPSBNYXJzaGFsbGVyKGVuY29kaW5nLCBhbGxvd19ub25lKQorCisgICAgZGF0YSA9IG0uZHVtcHMocGFyYW1zKQorCisgICAgaWYgZW5jb2RpbmcgIT0gInV0Zi04IjoKKyAgICAgICAgeG1saGVhZGVyID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9JyVzJz8+XG4iICUgc3RyKGVuY29kaW5nKQorICAgIGVsc2U6CisgICAgICAgIHhtbGhlYWRlciA9ICI8P3htbCB2ZXJzaW9uPScxLjAnPz5cbiIgIyB1dGYtOCBpcyBkZWZhdWx0CisKKyAgICAjIHN0YW5kYXJkIFhNTC1SUEMgd3JhcHBpbmdzCisgICAgaWYgbWV0aG9kbmFtZToKKyAgICAgICAgIyBhIG1ldGhvZCBjYWxsCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG1ldGhvZG5hbWUsIFN0cmluZ1R5cGUpOgorICAgICAgICAgICAgbWV0aG9kbmFtZSA9IG1ldGhvZG5hbWUuZW5jb2RlKGVuY29kaW5nKQorICAgICAgICBkYXRhID0gKAorICAgICAgICAgICAgeG1saGVhZGVyLAorICAgICAgICAgICAgIjxtZXRob2RDYWxsPlxuIgorICAgICAgICAgICAgIjxtZXRob2ROYW1lPiIsIG1ldGhvZG5hbWUsICI8L21ldGhvZE5hbWU+XG4iLAorICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICI8L21ldGhvZENhbGw+XG4iCisgICAgICAgICAgICApCisgICAgZWxpZiBtZXRob2RyZXNwb25zZToKKyAgICAgICAgIyBhIG1ldGhvZCByZXNwb25zZSwgb3IgYSBmYXVsdCBzdHJ1Y3R1cmUKKyAgICAgICAgZGF0YSA9ICgKKyAgICAgICAgICAgIHhtbGhlYWRlciwKKyAgICAgICAgICAgICI8bWV0aG9kUmVzcG9uc2U+XG4iLAorICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICI8L21ldGhvZFJlc3BvbnNlPlxuIgorICAgICAgICAgICAgKQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiBkYXRhICMgcmV0dXJuIGFzIGlzCisgICAgcmV0dXJuIHN0cmluZy5qb2luKGRhdGEsICIiKQorCisjIworIyBDb252ZXJ0IGFuIFhNTC1SUEMgcGFja2V0IHRvIGEgUHl0aG9uIG9iamVjdC4gIElmIHRoZSBYTUwtUlBDIHBhY2tldAorIyByZXByZXNlbnRzIGEgZmF1bHQgY29uZGl0aW9uLCB0aGlzIGZ1bmN0aW9uIHJhaXNlcyBhIEZhdWx0IGV4Y2VwdGlvbi4KKyMKKyMgQHBhcmFtIGRhdGEgQW4gWE1MLVJQQyBwYWNrZXQsIGdpdmVuIGFzIGFuIDgtYml0IHN0cmluZy4KKyMgQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHVucGFja2VkIGRhdGEsIGFuZCB0aGUgbWV0aG9kIG5hbWUKKyMgICAgIChOb25lIGlmIG5vdCBwcmVzZW50KS4KKyMgQHNlZSBGYXVsdAorCitkZWYgbG9hZHMoZGF0YSwgdXNlX2RhdGV0aW1lPTApOgorICAgICIiImRhdGEgLT4gdW5tYXJzaGFsbGVkIGRhdGEsIG1ldGhvZCBuYW1lCisKKyAgICBDb252ZXJ0IGFuIFhNTC1SUEMgcGFja2V0IHRvIHVubWFyc2hhbGxlZCBkYXRhIHBsdXMgYSBtZXRob2QKKyAgICBuYW1lIChOb25lIGlmIG5vdCBwcmVzZW50KS4KKworICAgIElmIHRoZSBYTUwtUlBDIHBhY2tldCByZXByZXNlbnRzIGEgZmF1bHQgY29uZGl0aW9uLCB0aGlzIGZ1bmN0aW9uCisgICAgcmFpc2VzIGEgRmF1bHQgZXhjZXB0aW9uLgorICAgICIiIgorICAgIHAsIHUgPSBnZXRwYXJzZXIodXNlX2RhdGV0aW1lPXVzZV9kYXRldGltZSkKKyAgICBwLmZlZWQoZGF0YSkKKyAgICBwLmNsb3NlKCkKKyAgICByZXR1cm4gdS5jbG9zZSgpLCB1LmdldG1ldGhvZG5hbWUoKQorCisjIworIyBFbmNvZGUgYSBzdHJpbmcgdXNpbmcgdGhlIGd6aXAgY29udGVudCBlbmNvZGluZyBzdWNoIGFzIHNwZWNpZmllZCBieSB0aGUKKyMgQ29udGVudC1FbmNvZGluZzogZ3ppcAorIyBpbiB0aGUgSFRUUCBoZWFkZXIsIGFzIGRlc2NyaWJlZCBpbiBSRkMgMTk1MgorIworIyBAcGFyYW0gZGF0YSB0aGUgdW5lbmNvZGVkIGRhdGEKKyMgQHJldHVybiB0aGUgZW5jb2RlZCBkYXRhCisKK2RlZiBnemlwX2VuY29kZShkYXRhKToKKyAgICAiIiJkYXRhIC0+IGd6aXAgZW5jb2RlZCBkYXRhCisKKyAgICBFbmNvZGUgZGF0YSB1c2luZyB0aGUgZ3ppcCBjb250ZW50IGVuY29kaW5nIGFzIGRlc2NyaWJlZCBpbiBSRkMgMTk1MgorICAgICIiIgorICAgIGlmIG5vdCBnemlwOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisgICAgZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICBnemYgPSBnemlwLkd6aXBGaWxlKG1vZGU9IndiIiwgZmlsZW9iaj1mLCBjb21wcmVzc2xldmVsPTEpCisgICAgZ3pmLndyaXRlKGRhdGEpCisgICAgZ3pmLmNsb3NlKCkKKyAgICBlbmNvZGVkID0gZi5nZXR2YWx1ZSgpCisgICAgZi5jbG9zZSgpCisgICAgcmV0dXJuIGVuY29kZWQKKworIyMKKyMgRGVjb2RlIGEgc3RyaW5nIHVzaW5nIHRoZSBnemlwIGNvbnRlbnQgZW5jb2Rpbmcgc3VjaCBhcyBzcGVjaWZpZWQgYnkgdGhlCisjIENvbnRlbnQtRW5jb2Rpbmc6IGd6aXAKKyMgaW4gdGhlIEhUVFAgaGVhZGVyLCBhcyBkZXNjcmliZWQgaW4gUkZDIDE5NTIKKyMKKyMgQHBhcmFtIGRhdGEgVGhlIGVuY29kZWQgZGF0YQorIyBAcmV0dXJuIHRoZSB1bmVuY29kZWQgZGF0YQorIyBAcmFpc2VzIFZhbHVlRXJyb3IgaWYgZGF0YSBpcyBub3QgY29ycmVjdGx5IGNvZGVkLgorCitkZWYgZ3ppcF9kZWNvZGUoZGF0YSk6CisgICAgIiIiZ3ppcCBlbmNvZGVkIGRhdGEgLT4gdW5lbmNvZGVkIGRhdGEKKworICAgIERlY29kZSBkYXRhIHVzaW5nIHRoZSBnemlwIGNvbnRlbnQgZW5jb2RpbmcgYXMgZGVzY3JpYmVkIGluIFJGQyAxOTUyCisgICAgIiIiCisgICAgaWYgbm90IGd6aXA6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICBmID0gU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKKyAgICBnemYgPSBnemlwLkd6aXBGaWxlKG1vZGU9InJiIiwgZmlsZW9iaj1mKQorICAgIHRyeToKKyAgICAgICAgZGVjb2RlZCA9IGd6Zi5yZWFkKCkKKyAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiaW52YWxpZCBkYXRhIikKKyAgICBmLmNsb3NlKCkKKyAgICBnemYuY2xvc2UoKQorICAgIHJldHVybiBkZWNvZGVkCisKKyMjCisjIFJldHVybiBhIGRlY29kZWQgZmlsZS1saWtlIG9iamVjdCBmb3IgdGhlIGd6aXAgZW5jb2RpbmcKKyMgYXMgZGVzY3JpYmVkIGluIFJGQyAxOTUyLgorIworIyBAcGFyYW0gcmVzcG9uc2UgQSBzdHJlYW0gc3VwcG9ydGluZyBhIHJlYWQoKSBtZXRob2QKKyMgQHJldHVybiBhIGZpbGUtbGlrZSBvYmplY3QgdGhhdCB0aGUgZGVjb2RlZCBkYXRhIGNhbiBiZSByZWFkKCkgZnJvbQorCitjbGFzcyBHemlwRGVjb2RlZFJlc3BvbnNlKGd6aXAuR3ppcEZpbGUgaWYgZ3ppcCBlbHNlIG9iamVjdCk6CisgICAgIiIiYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIGRlY29kZSBhIHJlc3BvbnNlIGVuY29kZWQgd2l0aCB0aGUgZ3ppcAorICAgIG1ldGhvZCwgYXMgZGVzY3JpYmVkIGluIFJGQyAxOTUyLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXNwb25zZSk6CisgICAgICAgICNyZXNwb25zZSBkb2Vzbid0IHN1cHBvcnQgdGVsbCgpIGFuZCByZWFkKCksIHJlcXVpcmVkIGJ5CisgICAgICAgICNHemlwRmlsZQorICAgICAgICBpZiBub3QgZ3ppcDoKKyAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKyAgICAgICAgc2VsZi5zdHJpbmdpbyA9IFN0cmluZ0lPLlN0cmluZ0lPKHJlc3BvbnNlLnJlYWQoKSkKKyAgICAgICAgZ3ppcC5HemlwRmlsZS5fX2luaXRfXyhzZWxmLCBtb2RlPSJyYiIsIGZpbGVvYmo9c2VsZi5zdHJpbmdpbykKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgZ3ppcC5HemlwRmlsZS5jbG9zZShzZWxmKQorICAgICAgICBzZWxmLnN0cmluZ2lvLmNsb3NlKCkKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIHJlcXVlc3QgZGlzcGF0Y2hlcgorCitjbGFzcyBfTWV0aG9kOgorICAgICMgc29tZSBtYWdpYyB0byBiaW5kIGFuIFhNTC1SUEMgbWV0aG9kIHRvIGFuIFJQQyBzZXJ2ZXIuCisgICAgIyBzdXBwb3J0cyAibmVzdGVkIiBtZXRob2RzIChlLmcuIGV4YW1wbGVzLmdldFN0YXRlTmFtZSkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VuZCwgbmFtZSk6CisgICAgICAgIHNlbGYuX19zZW5kID0gc2VuZAorICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBfTWV0aG9kKHNlbGYuX19zZW5kLCAiJXMuJXMiICUgKHNlbGYuX19uYW1lLCBuYW1lKSkKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5fX3NlbmQoc2VsZi5fX25hbWUsIGFyZ3MpCisKKyMjCisjIFN0YW5kYXJkIHRyYW5zcG9ydCBjbGFzcyBmb3IgWE1MLVJQQyBvdmVyIEhUVFAuCisjIDxwPgorIyBZb3UgY2FuIGNyZWF0ZSBjdXN0b20gdHJhbnNwb3J0cyBieSBzdWJjbGFzc2luZyB0aGlzIG1ldGhvZCwgYW5kCisjIG92ZXJyaWRpbmcgc2VsZWN0ZWQgbWV0aG9kcy4KKworY2xhc3MgVHJhbnNwb3J0OgorICAgICIiIkhhbmRsZXMgYW4gSFRUUCB0cmFuc2FjdGlvbiB0byBhbiBYTUwtUlBDIHNlcnZlci4iIiIKKworICAgICMgY2xpZW50IGlkZW50aWZpZXIgKG1heSBiZSBvdmVycmlkZGVuKQorICAgIHVzZXJfYWdlbnQgPSAieG1scnBjbGliLnB5LyVzIChieSB3d3cucHl0aG9ud2FyZS5jb20pIiAlIF9fdmVyc2lvbl9fCisKKyAgICAjaWYgdHJ1ZSwgd2UnbGwgcmVxdWVzdCBnemlwIGVuY29kaW5nCisgICAgYWNjZXB0X2d6aXBfZW5jb2RpbmcgPSBUcnVlCisKKyAgICAjIGlmIHBvc2l0aXZlLCBlbmNvZGUgcmVxdWVzdCB1c2luZyBnemlwIGlmIGl0IGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQKKyAgICAjIG5vdGUgdGhhdCBtYW55IHNlcnZlciB3aWxsIGdldCBjb25mdXNlZCwgc28gb25seSB1c2UgaXQgaWYgeW91IGtub3cKKyAgICAjIHRoYXQgdGhleSBjYW4gZGVjb2RlIHN1Y2ggYSByZXF1ZXN0CisgICAgZW5jb2RlX3RocmVzaG9sZCA9IE5vbmUgI05vbmUgPSBkb24ndCBlbmNvZGUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1c2VfZGF0ZXRpbWU9MCk6CisgICAgICAgIHNlbGYuX3VzZV9kYXRldGltZSA9IHVzZV9kYXRldGltZQorICAgICAgICBzZWxmLl9jb25uZWN0aW9uID0gKE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuX2V4dHJhX2hlYWRlcnMgPSBbXQorICAgICMjCisgICAgIyBTZW5kIGEgY29tcGxldGUgcmVxdWVzdCwgYW5kIHBhcnNlIHRoZSByZXNwb25zZS4KKyAgICAjIFJldHJ5IHJlcXVlc3QgaWYgYSBjYWNoZWQgY29ubmVjdGlvbiBoYXMgZGlzY29ubmVjdGVkLgorICAgICMKKyAgICAjIEBwYXJhbSBob3N0IFRhcmdldCBob3N0LgorICAgICMgQHBhcmFtIGhhbmRsZXIgVGFyZ2V0IFBSQyBoYW5kbGVyLgorICAgICMgQHBhcmFtIHJlcXVlc3RfYm9keSBYTUwtUlBDIHJlcXVlc3QgYm9keS4KKyAgICAjIEBwYXJhbSB2ZXJib3NlIERlYnVnZ2luZyBmbGFnLgorICAgICMgQHJldHVybiBQYXJzZWQgcmVzcG9uc2UuCisKKyAgICBkZWYgcmVxdWVzdChzZWxmLCBob3N0LCBoYW5kbGVyLCByZXF1ZXN0X2JvZHksIHZlcmJvc2U9MCk6CisgICAgICAgICNyZXRyeSByZXF1ZXN0IG9uY2UgaWYgY2FjaGVkIGNvbm5lY3Rpb24gaGFzIGdvbmUgY29sZAorICAgICAgICBmb3IgaSBpbiAoMCwgMSk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2luZ2xlX3JlcXVlc3QoaG9zdCwgaGFuZGxlciwgcmVxdWVzdF9ib2R5LCB2ZXJib3NlKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKKyAgICAgICAgICAgICAgICBpZiBpIG9yIGUuZXJybm8gbm90IGluIChlcnJuby5FQ09OTlJFU0VULCBlcnJuby5FQ09OTkFCT1JURUQsIGVycm5vLkVQSVBFKToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgIGV4Y2VwdCBodHRwbGliLkJhZFN0YXR1c0xpbmU6ICNjbG9zZSBhZnRlciB3ZSBzZW50IHJlcXVlc3QKKyAgICAgICAgICAgICAgICBpZiBpOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorCisgICAgIyMKKyAgICAjIFNlbmQgYSBjb21wbGV0ZSByZXF1ZXN0LCBhbmQgcGFyc2UgdGhlIHJlc3BvbnNlLgorICAgICMKKyAgICAjIEBwYXJhbSBob3N0IFRhcmdldCBob3N0LgorICAgICMgQHBhcmFtIGhhbmRsZXIgVGFyZ2V0IFBSQyBoYW5kbGVyLgorICAgICMgQHBhcmFtIHJlcXVlc3RfYm9keSBYTUwtUlBDIHJlcXVlc3QgYm9keS4KKyAgICAjIEBwYXJhbSB2ZXJib3NlIERlYnVnZ2luZyBmbGFnLgorICAgICMgQHJldHVybiBQYXJzZWQgcmVzcG9uc2UuCisKKyAgICBkZWYgc2luZ2xlX3JlcXVlc3Qoc2VsZiwgaG9zdCwgaGFuZGxlciwgcmVxdWVzdF9ib2R5LCB2ZXJib3NlPTApOgorICAgICAgICAjIGlzc3VlIFhNTC1SUEMgcmVxdWVzdAorCisgICAgICAgIGggPSBzZWxmLm1ha2VfY29ubmVjdGlvbihob3N0KQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgaC5zZXRfZGVidWdsZXZlbCgxKQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2VuZF9yZXF1ZXN0KGgsIGhhbmRsZXIsIHJlcXVlc3RfYm9keSkKKyAgICAgICAgICAgIHNlbGYuc2VuZF9ob3N0KGgsIGhvc3QpCisgICAgICAgICAgICBzZWxmLnNlbmRfdXNlcl9hZ2VudChoKQorICAgICAgICAgICAgc2VsZi5zZW5kX2NvbnRlbnQoaCwgcmVxdWVzdF9ib2R5KQorCisgICAgICAgICAgICByZXNwb25zZSA9IGguZ2V0cmVzcG9uc2UoYnVmZmVyaW5nPVRydWUpCisgICAgICAgICAgICBpZiByZXNwb25zZS5zdGF0dXMgPT0gMjAwOgorICAgICAgICAgICAgICAgIHNlbGYudmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXJzZV9yZXNwb25zZShyZXNwb25zZSkKKyAgICAgICAgZXhjZXB0IEZhdWx0OgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICMgQWxsIHVuZXhwZWN0ZWQgZXJyb3JzIGxlYXZlIGNvbm5lY3Rpb24gaW4KKyAgICAgICAgICAgICMgYSBzdHJhbmdlIHN0YXRlLCBzbyB3ZSBjbGVhciBpdC4KKyAgICAgICAgICAgIHNlbGYuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKKworICAgICAgICAjZGlzY2FyZCBhbnkgcmVzcG9uc2UgZGF0YSBhbmQgcmFpc2UgZXhjZXB0aW9uCisgICAgICAgIGlmIChyZXNwb25zZS5nZXRoZWFkZXIoImNvbnRlbnQtbGVuZ3RoIiwgMCkpOgorICAgICAgICAgICAgcmVzcG9uc2UucmVhZCgpCisgICAgICAgIHJhaXNlIFByb3RvY29sRXJyb3IoCisgICAgICAgICAgICBob3N0ICsgaGFuZGxlciwKKyAgICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cywgcmVzcG9uc2UucmVhc29uLAorICAgICAgICAgICAgcmVzcG9uc2UubXNnLAorICAgICAgICAgICAgKQorCisgICAgIyMKKyAgICAjIENyZWF0ZSBwYXJzZXIuCisgICAgIworICAgICMgQHJldHVybiBBIDItdHVwbGUgY29udGFpbmluZyBhIHBhcnNlciBhbmQgYSB1bm1hcnNoYWxsZXIuCisKKyAgICBkZWYgZ2V0cGFyc2VyKHNlbGYpOgorICAgICAgICAjIGdldCBwYXJzZXIgYW5kIHVubWFyc2hhbGxlcgorICAgICAgICByZXR1cm4gZ2V0cGFyc2VyKHVzZV9kYXRldGltZT1zZWxmLl91c2VfZGF0ZXRpbWUpCisKKyAgICAjIworICAgICMgR2V0IGF1dGhvcml6YXRpb24gaW5mbyBmcm9tIGhvc3QgcGFyYW1ldGVyCisgICAgIyBIb3N0IG1heSBiZSBhIHN0cmluZywgb3IgYSAoaG9zdCwgeDUwOS1kaWN0KSB0dXBsZTsgaWYgYSBzdHJpbmcsCisgICAgIyBpdCBpcyBjaGVja2VkIGZvciBhICJ1c2VyOnB3QGhvc3QiIGZvcm1hdCwgYW5kIGEgIkJhc2ljCisgICAgIyBBdXRoZW50aWNhdGlvbiIgaGVhZGVyIGlzIGFkZGVkIGlmIGFwcHJvcHJpYXRlLgorICAgICMKKyAgICAjIEBwYXJhbSBob3N0IEhvc3QgZGVzY3JpcHRvciAoVVJMIG9yIChVUkwsIHg1MDkgaW5mbykgdHVwbGUpLgorICAgICMgQHJldHVybiBBIDMtdHVwbGUgY29udGFpbmluZyAoYWN0dWFsIGhvc3QsIGV4dHJhIGhlYWRlcnMsCisgICAgIyAgICAgeDUwOSBpbmZvKS4gIFRoZSBoZWFkZXIgYW5kIHg1MDkgZmllbGRzIG1heSBiZSBOb25lLgorCisgICAgZGVmIGdldF9ob3N0X2luZm8oc2VsZiwgaG9zdCk6CisKKyAgICAgICAgeDUwOSA9IHt9CisgICAgICAgIGlmIGlzaW5zdGFuY2UoaG9zdCwgVHVwbGVUeXBlKToKKyAgICAgICAgICAgIGhvc3QsIHg1MDkgPSBob3N0CisKKyAgICAgICAgaW1wb3J0IHVybGxpYgorICAgICAgICBhdXRoLCBob3N0ID0gdXJsbGliLnNwbGl0dXNlcihob3N0KQorCisgICAgICAgIGlmIGF1dGg6CisgICAgICAgICAgICBpbXBvcnQgYmFzZTY0CisgICAgICAgICAgICBhdXRoID0gYmFzZTY0LmVuY29kZXN0cmluZyh1cmxsaWIudW5xdW90ZShhdXRoKSkKKyAgICAgICAgICAgIGF1dGggPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQoYXV0aCksICIiKSAjIGdldCByaWQgb2Ygd2hpdGVzcGFjZQorICAgICAgICAgICAgZXh0cmFfaGVhZGVycyA9IFsKKyAgICAgICAgICAgICAgICAoIkF1dGhvcml6YXRpb24iLCAiQmFzaWMgIiArIGF1dGgpCisgICAgICAgICAgICAgICAgXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXh0cmFfaGVhZGVycyA9IE5vbmUKKworICAgICAgICByZXR1cm4gaG9zdCwgZXh0cmFfaGVhZGVycywgeDUwOQorCisgICAgIyMKKyAgICAjIENvbm5lY3QgdG8gc2VydmVyLgorICAgICMKKyAgICAjIEBwYXJhbSBob3N0IFRhcmdldCBob3N0LgorICAgICMgQHJldHVybiBBIGNvbm5lY3Rpb24gaGFuZGxlLgorCisgICAgZGVmIG1ha2VfY29ubmVjdGlvbihzZWxmLCBob3N0KToKKyAgICAgICAgI3JldHVybiBhbiBleGlzdGluZyBjb25uZWN0aW9uIGlmIHBvc3NpYmxlLiAgVGhpcyBhbGxvd3MKKyAgICAgICAgI0hUVFAvMS4xIGtlZXAtYWxpdmUuCisgICAgICAgIGlmIHNlbGYuX2Nvbm5lY3Rpb24gYW5kIGhvc3QgPT0gc2VsZi5fY29ubmVjdGlvblswXToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb25uZWN0aW9uWzFdCisKKyAgICAgICAgIyBjcmVhdGUgYSBIVFRQIGNvbm5lY3Rpb24gb2JqZWN0IGZyb20gYSBob3N0IGRlc2NyaXB0b3IKKyAgICAgICAgY2hvc3QsIHNlbGYuX2V4dHJhX2hlYWRlcnMsIHg1MDkgPSBzZWxmLmdldF9ob3N0X2luZm8oaG9zdCkKKyAgICAgICAgI3N0b3JlIHRoZSBob3N0IGFyZ3VtZW50IGFsb25nIHdpdGggdGhlIGNvbm5lY3Rpb24gb2JqZWN0CisgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBob3N0LCBodHRwbGliLkhUVFBDb25uZWN0aW9uKGNob3N0KQorICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdGlvblsxXQorCisgICAgIyMKKyAgICAjIENsZWFyIGFueSBjYWNoZWQgY29ubmVjdGlvbiBvYmplY3QuCisgICAgIyBVc2VkIGluIHRoZSBldmVudCBvZiBzb2NrZXQgZXJyb3JzLgorICAgICMKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2Nvbm5lY3Rpb25bMV06CisgICAgICAgICAgICBzZWxmLl9jb25uZWN0aW9uWzFdLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSAoTm9uZSwgTm9uZSkKKworICAgICMjCisgICAgIyBTZW5kIHJlcXVlc3QgaGVhZGVyLgorICAgICMKKyAgICAjIEBwYXJhbSBjb25uZWN0aW9uIENvbm5lY3Rpb24gaGFuZGxlLgorICAgICMgQHBhcmFtIGhhbmRsZXIgVGFyZ2V0IFJQQyBoYW5kbGVyLgorICAgICMgQHBhcmFtIHJlcXVlc3RfYm9keSBYTUwtUlBDIGJvZHkuCisKKyAgICBkZWYgc2VuZF9yZXF1ZXN0KHNlbGYsIGNvbm5lY3Rpb24sIGhhbmRsZXIsIHJlcXVlc3RfYm9keSk6CisgICAgICAgIGlmIChzZWxmLmFjY2VwdF9nemlwX2VuY29kaW5nIGFuZCBnemlwKToKKyAgICAgICAgICAgIGNvbm5lY3Rpb24ucHV0cmVxdWVzdCgiUE9TVCIsIGhhbmRsZXIsIHNraXBfYWNjZXB0X2VuY29kaW5nPVRydWUpCisgICAgICAgICAgICBjb25uZWN0aW9uLnB1dGhlYWRlcigiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29ubmVjdGlvbi5wdXRyZXF1ZXN0KCJQT1NUIiwgaGFuZGxlcikKKworICAgICMjCisgICAgIyBTZW5kIGhvc3QgbmFtZS4KKyAgICAjCisgICAgIyBAcGFyYW0gY29ubmVjdGlvbiBDb25uZWN0aW9uIGhhbmRsZS4KKyAgICAjIEBwYXJhbSBob3N0IEhvc3QgbmFtZS4KKyAgICAjCisgICAgIyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgYWRkIHRoZSAiSG9zdCIKKyAgICAjIGhlYWRlciBhbnltb3JlLCBpdCBpcyBkb25lIGFzIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24ucHV0cmVxdWVzdCgpIGluCisgICAgIyBzZW5kX3JlcXVlc3QoKSBhYm92ZS4KKworICAgIGRlZiBzZW5kX2hvc3Qoc2VsZiwgY29ubmVjdGlvbiwgaG9zdCk6CisgICAgICAgIGV4dHJhX2hlYWRlcnMgPSBzZWxmLl9leHRyYV9oZWFkZXJzCisgICAgICAgIGlmIGV4dHJhX2hlYWRlcnM6CisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGV4dHJhX2hlYWRlcnMsIERpY3RUeXBlKToKKyAgICAgICAgICAgICAgICBleHRyYV9oZWFkZXJzID0gZXh0cmFfaGVhZGVycy5pdGVtcygpCisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBleHRyYV9oZWFkZXJzOgorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKGtleSwgdmFsdWUpCisKKyAgICAjIworICAgICMgU2VuZCB1c2VyLWFnZW50IGlkZW50aWZpZXIuCisgICAgIworICAgICMgQHBhcmFtIGNvbm5lY3Rpb24gQ29ubmVjdGlvbiBoYW5kbGUuCisKKyAgICBkZWYgc2VuZF91c2VyX2FnZW50KHNlbGYsIGNvbm5lY3Rpb24pOgorICAgICAgICBjb25uZWN0aW9uLnB1dGhlYWRlcigiVXNlci1BZ2VudCIsIHNlbGYudXNlcl9hZ2VudCkKKworICAgICMjCisgICAgIyBTZW5kIHJlcXVlc3QgYm9keS4KKyAgICAjCisgICAgIyBAcGFyYW0gY29ubmVjdGlvbiBDb25uZWN0aW9uIGhhbmRsZS4KKyAgICAjIEBwYXJhbSByZXF1ZXN0X2JvZHkgWE1MLVJQQyByZXF1ZXN0IGJvZHkuCisKKyAgICBkZWYgc2VuZF9jb250ZW50KHNlbGYsIGNvbm5lY3Rpb24sIHJlcXVlc3RfYm9keSk6CisgICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKCJDb250ZW50LVR5cGUiLCAidGV4dC94bWwiKQorCisgICAgICAgICNvcHRpb25hbGx5IGVuY29kZSB0aGUgcmVxdWVzdAorICAgICAgICBpZiAoc2VsZi5lbmNvZGVfdGhyZXNob2xkIGlzIG5vdCBOb25lIGFuZAorICAgICAgICAgICAgc2VsZi5lbmNvZGVfdGhyZXNob2xkIDwgbGVuKHJlcXVlc3RfYm9keSkgYW5kCisgICAgICAgICAgICBnemlwKToKKyAgICAgICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKCJDb250ZW50LUVuY29kaW5nIiwgImd6aXAiKQorICAgICAgICAgICAgcmVxdWVzdF9ib2R5ID0gZ3ppcF9lbmNvZGUocmVxdWVzdF9ib2R5KQorCisgICAgICAgIGNvbm5lY3Rpb24ucHV0aGVhZGVyKCJDb250ZW50LUxlbmd0aCIsIHN0cihsZW4ocmVxdWVzdF9ib2R5KSkpCisgICAgICAgIGNvbm5lY3Rpb24uZW5kaGVhZGVycyhyZXF1ZXN0X2JvZHkpCisKKyAgICAjIworICAgICMgUGFyc2UgcmVzcG9uc2UuCisgICAgIworICAgICMgQHBhcmFtIGZpbGUgU3RyZWFtLgorICAgICMgQHJldHVybiBSZXNwb25zZSB0dXBsZSBhbmQgdGFyZ2V0IG1ldGhvZC4KKworICAgIGRlZiBwYXJzZV9yZXNwb25zZShzZWxmLCByZXNwb25zZSk6CisgICAgICAgICMgcmVhZCByZXNwb25zZSBkYXRhIGZyb20gaHR0cHJlc3BvbnNlLCBhbmQgcGFyc2UgaXQKKworICAgICAgICAjIENoZWNrIGZvciBuZXcgaHR0cCByZXNwb25zZSBvYmplY3QsIGVsc2UgaXQgaXMgYSBmaWxlIG9iamVjdAorICAgICAgICBpZiBoYXNhdHRyKHJlc3BvbnNlLCdnZXRoZWFkZXInKToKKyAgICAgICAgICAgIGlmIHJlc3BvbnNlLmdldGhlYWRlcigiQ29udGVudC1FbmNvZGluZyIsICIiKSA9PSAiZ3ppcCI6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gR3ppcERlY29kZWRSZXNwb25zZShyZXNwb25zZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc3RyZWFtID0gcmVzcG9uc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0cmVhbSA9IHJlc3BvbnNlCisKKyAgICAgICAgcCwgdSA9IHNlbGYuZ2V0cGFyc2VyKCkKKworICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgZGF0YSA9IHN0cmVhbS5yZWFkKDEwMjQpCisgICAgICAgICAgICBpZiBub3QgZGF0YToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICJib2R5OiIsIHJlcHIoZGF0YSkKKyAgICAgICAgICAgIHAuZmVlZChkYXRhKQorCisgICAgICAgIGlmIHN0cmVhbSBpcyBub3QgcmVzcG9uc2U6CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKQorICAgICAgICBwLmNsb3NlKCkKKworICAgICAgICByZXR1cm4gdS5jbG9zZSgpCisKKyMjCisjIFN0YW5kYXJkIHRyYW5zcG9ydCBjbGFzcyBmb3IgWE1MLVJQQyBvdmVyIEhUVFBTLgorCitjbGFzcyBTYWZlVHJhbnNwb3J0KFRyYW5zcG9ydCk6CisgICAgIiIiSGFuZGxlcyBhbiBIVFRQUyB0cmFuc2FjdGlvbiB0byBhbiBYTUwtUlBDIHNlcnZlci4iIiIKKworICAgICMgRklYTUU6IG1vc3RseSB1bnRlc3RlZAorCisgICAgZGVmIG1ha2VfY29ubmVjdGlvbihzZWxmLCBob3N0KToKKyAgICAgICAgaWYgc2VsZi5fY29ubmVjdGlvbiBhbmQgaG9zdCA9PSBzZWxmLl9jb25uZWN0aW9uWzBdOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Nvbm5lY3Rpb25bMV0KKyAgICAgICAgIyBjcmVhdGUgYSBIVFRQUyBjb25uZWN0aW9uIG9iamVjdCBmcm9tIGEgaG9zdCBkZXNjcmlwdG9yCisgICAgICAgICMgaG9zdCBtYXkgYmUgYSBzdHJpbmcsIG9yIGEgKGhvc3QsIHg1MDktZGljdCkgdHVwbGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgSFRUUFMgPSBodHRwbGliLkhUVFBTQ29ubmVjdGlvbgorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgICAgICJ5b3VyIHZlcnNpb24gb2YgaHR0cGxpYiBkb2Vzbid0IHN1cHBvcnQgSFRUUFMiCisgICAgICAgICAgICAgICAgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY2hvc3QsIHNlbGYuX2V4dHJhX2hlYWRlcnMsIHg1MDkgPSBzZWxmLmdldF9ob3N0X2luZm8oaG9zdCkKKyAgICAgICAgICAgIHNlbGYuX2Nvbm5lY3Rpb24gPSBob3N0LCBIVFRQUyhjaG9zdCwgTm9uZSwgKiooeDUwOSBvciB7fSkpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29ubmVjdGlvblsxXQorCisjIworIyBTdGFuZGFyZCBzZXJ2ZXIgcHJveHkuICBUaGlzIGNsYXNzIGVzdGFibGlzaGVzIGEgdmlydHVhbCBjb25uZWN0aW9uCisjIHRvIGFuIFhNTC1SUEMgc2VydmVyLgorIyA8cD4KKyMgVGhpcyBjbGFzcyBpcyBhdmFpbGFibGUgYXMgU2VydmVyUHJveHkgYW5kIFNlcnZlci4gIE5ldyBjb2RlIHNob3VsZAorIyB1c2UgU2VydmVyUHJveHksIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKyMKKyMgQGRlZiBTZXJ2ZXJQcm94eSh1cmksICoqb3B0aW9ucykKKyMgQHBhcmFtIHVyaSBUaGUgY29ubmVjdGlvbiBwb2ludCBvbiB0aGUgc2VydmVyLgorIyBAa2V5cGFyYW0gdHJhbnNwb3J0IEEgdHJhbnNwb3J0IGZhY3RvcnksIGNvbXBhdGlibGUgd2l0aCB0aGUKKyMgICAgc3RhbmRhcmQgdHJhbnNwb3J0IGNsYXNzLgorIyBAa2V5cGFyYW0gZW5jb2RpbmcgVGhlIGRlZmF1bHQgZW5jb2RpbmcgdXNlZCBmb3IgOC1iaXQgc3RyaW5ncworIyAgICAoZGVmYXVsdCBpcyBVVEYtOCkuCisjIEBrZXlwYXJhbSB2ZXJib3NlIFVzZSBhIHRydWUgdmFsdWUgdG8gZW5hYmxlIGRlYnVnZ2luZyBvdXRwdXQuCisjICAgIChwcmludGVkIHRvIHN0YW5kYXJkIG91dHB1dCkuCisjIEBzZWUgVHJhbnNwb3J0CisKK2NsYXNzIFNlcnZlclByb3h5OgorICAgICIiInVyaSBbLG9wdGlvbnNdIC0+IGEgbG9naWNhbCBjb25uZWN0aW9uIHRvIGFuIFhNTC1SUEMgc2VydmVyCisKKyAgICB1cmkgaXMgdGhlIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIHNlcnZlciwgZ2l2ZW4gYXMKKyAgICBzY2hlbWU6Ly9ob3N0L3RhcmdldC4KKworICAgIFRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgc3VwcG9ydHMgdGhlICJodHRwIiBzY2hlbWUuICBJZgorICAgIFNTTCBzb2NrZXQgc3VwcG9ydCBpcyBhdmFpbGFibGUgKFB5dGhvbiAyLjApLCBpdCBhbHNvIHN1cHBvcnRzCisgICAgImh0dHBzIi4KKworICAgIElmIHRoZSB0YXJnZXQgcGFydCBhbmQgdGhlIHNsYXNoIHByZWNlZGluZyBpdCBhcmUgYm90aCBvbWl0dGVkLAorICAgICIvUlBDMiIgaXMgYXNzdW1lZC4KKworICAgIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBjYW4gYmUgZ2l2ZW4gYXMga2V5d29yZCBhcmd1bWVudHM6CisKKyAgICAgICAgdHJhbnNwb3J0OiBhIHRyYW5zcG9ydCBmYWN0b3J5CisgICAgICAgIGVuY29kaW5nOiB0aGUgcmVxdWVzdCBlbmNvZGluZyAoZGVmYXVsdCBpcyBVVEYtOCkKKworICAgIEFsbCA4LWJpdCBzdHJpbmdzIHBhc3NlZCB0byB0aGUgc2VydmVyIHByb3h5IGFyZSBhc3N1bWVkIHRvIHVzZQorICAgIHRoZSBnaXZlbiBlbmNvZGluZy4KKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB1cmksIHRyYW5zcG9ydD1Ob25lLCBlbmNvZGluZz1Ob25lLCB2ZXJib3NlPTAsCisgICAgICAgICAgICAgICAgIGFsbG93X25vbmU9MCwgdXNlX2RhdGV0aW1lPTApOgorICAgICAgICAjIGVzdGFibGlzaCBhICJsb2dpY2FsIiBzZXJ2ZXIgY29ubmVjdGlvbgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UodXJpLCB1bmljb2RlKToKKyAgICAgICAgICAgIHVyaSA9IHVyaS5lbmNvZGUoJ0lTTy04ODU5LTEnKQorCisgICAgICAgICMgZ2V0IHRoZSB1cmwKKyAgICAgICAgaW1wb3J0IHVybGxpYgorICAgICAgICB0eXBlLCB1cmkgPSB1cmxsaWIuc3BsaXR0eXBlKHVyaSkKKyAgICAgICAgaWYgdHlwZSBub3QgaW4gKCJodHRwIiwgImh0dHBzIik6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAidW5zdXBwb3J0ZWQgWE1MLVJQQyBwcm90b2NvbCIKKyAgICAgICAgc2VsZi5fX2hvc3QsIHNlbGYuX19oYW5kbGVyID0gdXJsbGliLnNwbGl0aG9zdCh1cmkpCisgICAgICAgIGlmIG5vdCBzZWxmLl9faGFuZGxlcjoKKyAgICAgICAgICAgIHNlbGYuX19oYW5kbGVyID0gIi9SUEMyIgorCisgICAgICAgIGlmIHRyYW5zcG9ydCBpcyBOb25lOgorICAgICAgICAgICAgaWYgdHlwZSA9PSAiaHR0cHMiOgorICAgICAgICAgICAgICAgIHRyYW5zcG9ydCA9IFNhZmVUcmFuc3BvcnQodXNlX2RhdGV0aW1lPXVzZV9kYXRldGltZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdHJhbnNwb3J0ID0gVHJhbnNwb3J0KHVzZV9kYXRldGltZT11c2VfZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuX190cmFuc3BvcnQgPSB0cmFuc3BvcnQKKworICAgICAgICBzZWxmLl9fZW5jb2RpbmcgPSBlbmNvZGluZworICAgICAgICBzZWxmLl9fdmVyYm9zZSA9IHZlcmJvc2UKKyAgICAgICAgc2VsZi5fX2FsbG93X25vbmUgPSBhbGxvd19ub25lCisKKyAgICBkZWYgX19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fX3RyYW5zcG9ydC5jbG9zZSgpCisKKyAgICBkZWYgX19yZXF1ZXN0KHNlbGYsIG1ldGhvZG5hbWUsIHBhcmFtcyk6CisgICAgICAgICMgY2FsbCBhIG1ldGhvZCBvbiB0aGUgcmVtb3RlIHNlcnZlcgorCisgICAgICAgIHJlcXVlc3QgPSBkdW1wcyhwYXJhbXMsIG1ldGhvZG5hbWUsIGVuY29kaW5nPXNlbGYuX19lbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X25vbmU9c2VsZi5fX2FsbG93X25vbmUpCisKKyAgICAgICAgcmVzcG9uc2UgPSBzZWxmLl9fdHJhbnNwb3J0LnJlcXVlc3QoCisgICAgICAgICAgICBzZWxmLl9faG9zdCwKKyAgICAgICAgICAgIHNlbGYuX19oYW5kbGVyLAorICAgICAgICAgICAgcmVxdWVzdCwKKyAgICAgICAgICAgIHZlcmJvc2U9c2VsZi5fX3ZlcmJvc2UKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBsZW4ocmVzcG9uc2UpID09IDE6CisgICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlWzBdCisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAiPFNlcnZlclByb3h5IGZvciAlcyVzPiIgJQorICAgICAgICAgICAgKHNlbGYuX19ob3N0LCBzZWxmLl9faGFuZGxlcikKKyAgICAgICAgICAgICkKKworICAgIF9fc3RyX18gPSBfX3JlcHJfXworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICAjIG1hZ2ljIG1ldGhvZCBkaXNwYXRjaGVyCisgICAgICAgIHJldHVybiBfTWV0aG9kKHNlbGYuX19yZXF1ZXN0LCBuYW1lKQorCisgICAgIyBub3RlOiB0byBjYWxsIGEgcmVtb3RlIG9iamVjdCB3aXRoIGFuIG5vbi1zdGFuZGFyZCBuYW1lLCB1c2UKKyAgICAjIHJlc3VsdCBnZXRhdHRyKHNlcnZlciwgInN0cmFuZ2UtcHl0aG9uLW5hbWUiKShhcmdzKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGF0dHIpOgorICAgICAgICAiIiJBIHdvcmthcm91bmQgdG8gZ2V0IHNwZWNpYWwgYXR0cmlidXRlcyBvbiB0aGUgU2VydmVyUHJveHkKKyAgICAgICAgICAgd2l0aG91dCBpbnRlcmZlcmluZyB3aXRoIHRoZSBtYWdpYyBfX2dldGF0dHJfXworICAgICAgICAiIiIKKyAgICAgICAgaWYgYXR0ciA9PSAiY2xvc2UiOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbG9zZQorICAgICAgICBlbGlmIGF0dHIgPT0gInRyYW5zcG9ydCI6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fX3RyYW5zcG9ydAorICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiQXR0cmlidXRlICVyIG5vdCBmb3VuZCIgJSAoYXR0ciwpKQorCisjIGNvbXBhdGliaWxpdHkKKworU2VydmVyID0gU2VydmVyUHJveHkKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyB0ZXN0IGNvZGUKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKworICAgICMgc2ltcGxlIHRlc3QgcHJvZ3JhbSAoZnJvbSB0aGUgWE1MLVJQQyBzcGVjaWZpY2F0aW9uKQorCisgICAgIyBzZXJ2ZXIgPSBTZXJ2ZXJQcm94eSgiaHR0cDovL2xvY2FsaG9zdDo4MDAwIikgIyBsb2NhbCBzZXJ2ZXIKKyAgICBzZXJ2ZXIgPSBTZXJ2ZXJQcm94eSgiaHR0cDovL3RpbWUueG1scnBjLmNvbS9SUEMyIikKKworICAgIHByaW50IHNlcnZlcgorCisgICAgdHJ5OgorICAgICAgICBwcmludCBzZXJ2ZXIuY3VycmVudFRpbWUuZ2V0Q3VycmVudFRpbWUoKQorICAgIGV4Y2VwdCBFcnJvciwgdjoKKyAgICAgICAgcHJpbnQgIkVSUk9SIiwgdgorCisgICAgbXVsdGkgPSBNdWx0aUNhbGwoc2VydmVyKQorICAgIG11bHRpLmN1cnJlbnRUaW1lLmdldEN1cnJlbnRUaW1lKCkKKyAgICBtdWx0aS5jdXJyZW50VGltZS5nZXRDdXJyZW50VGltZSgpCisgICAgdHJ5OgorICAgICAgICBmb3IgcmVzcG9uc2UgaW4gbXVsdGkoKToKKyAgICAgICAgICAgIHByaW50IHJlc3BvbnNlCisgICAgZXhjZXB0IEVycm9yLCB2OgorICAgICAgICBwcmludCAiRVJST1IiLCB2CmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbHJwY2xpYi5weWMgYi9saWIvcHl0aG9uMi43L3htbHJwY2xpYi5weWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlZDI2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1scnBjbGliLnB5YwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3htbHJwY2xpYi5weW8gYi9saWIvcHl0aG9uMi43L3htbHJwY2xpYi5weW8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWExY2RmZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcveG1scnBjbGliLnB5bwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9saWIvcHl0aG9uMi43L3ppcGZpbGUucHkgYi9saWIvcHl0aG9uMi43L3ppcGZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzOTMxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9weXRob24yLjcvemlwZmlsZS5weQpAQCAtMCwwICsxLDE1MjMgQEAKKyIiIgorUmVhZCBhbmQgd3JpdGUgWklQIGZpbGVzLgorIiIiCitpbXBvcnQgc3RydWN0LCBvcywgdGltZSwgc3lzLCBzaHV0aWwKK2ltcG9ydCBiaW5hc2NpaSwgY1N0cmluZ0lPLCBzdGF0CitpbXBvcnQgaW8KK2ltcG9ydCByZQoraW1wb3J0IHN0cmluZworCit0cnk6CisgICAgaW1wb3J0IHpsaWIgIyBXZSBtYXkgbmVlZCBpdHMgY29tcHJlc3Npb24gbWV0aG9kCisgICAgY3JjMzIgPSB6bGliLmNyYzMyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgemxpYiA9IE5vbmUKKyAgICBjcmMzMiA9IGJpbmFzY2lpLmNyYzMyCisKK19fYWxsX18gPSBbIkJhZFppcGZpbGUiLCAiZXJyb3IiLCAiWklQX1NUT1JFRCIsICJaSVBfREVGTEFURUQiLCAiaXNfemlwZmlsZSIsCisgICAgICAgICAgICJaaXBJbmZvIiwgIlppcEZpbGUiLCAiUHlaaXBGaWxlIiwgIkxhcmdlWmlwRmlsZSIgXQorCitjbGFzcyBCYWRaaXBmaWxlKEV4Y2VwdGlvbik6CisgICAgcGFzcworCisKK2NsYXNzIExhcmdlWmlwRmlsZShFeGNlcHRpb24pOgorICAgICIiIgorICAgIFJhaXNlZCB3aGVuIHdyaXRpbmcgYSB6aXBmaWxlLCB0aGUgemlwZmlsZSByZXF1aXJlcyBaSVA2NCBleHRlbnNpb25zCisgICAgYW5kIHRob3NlIGV4dGVuc2lvbnMgYXJlIGRpc2FibGVkLgorICAgICIiIgorCitlcnJvciA9IEJhZFppcGZpbGUgICAgICAjIFRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoaXMgbW9kdWxlCisKK1pJUDY0X0xJTUlUID0gKDEgPDwgMzEpIC0gMQorWklQX0ZJTEVDT1VOVF9MSU1JVCA9IDEgPDwgMTYKK1pJUF9NQVhfQ09NTUVOVCA9ICgxIDw8IDE2KSAtIDEKKworIyBjb25zdGFudHMgZm9yIFppcCBmaWxlIGNvbXByZXNzaW9uIG1ldGhvZHMKK1pJUF9TVE9SRUQgPSAwCitaSVBfREVGTEFURUQgPSA4CisjIE90aGVyIFpJUCBjb21wcmVzc2lvbiBtZXRob2RzIG5vdCBzdXBwb3J0ZWQKKworIyBCZWxvdyBhcmUgc29tZSBmb3JtYXRzIGFuZCBhc3NvY2lhdGVkIGRhdGEgZm9yIHJlYWRpbmcvd3JpdGluZyBoZWFkZXJzIHVzaW5nCisjIHRoZSBzdHJ1Y3QgbW9kdWxlLiAgVGhlIG5hbWVzIGFuZCBzdHJ1Y3R1cmVzIG9mIGhlYWRlcnMvcmVjb3JkcyBhcmUgdGhvc2UgdXNlZAorIyBpbiB0aGUgUEtXQVJFIGRlc2NyaXB0aW9uIG9mIHRoZSBaSVAgZmlsZSBmb3JtYXQ6CisjICAgICBodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUCisjIChVUkwgdmFsaWQgYXMgb2YgSmFudWFyeSAyMDA4KQorCisjIFRoZSAiZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IiBzdHJ1Y3R1cmUsIG1hZ2ljIG51bWJlciwgc2l6ZSwgYW5kIGluZGljZXMKKyMgKHNlY3Rpb24gVi5JIGluIHRoZSBmb3JtYXQgZG9jdW1lbnQpCitzdHJ1Y3RFbmRBcmNoaXZlID0gIjw0czRIMkxIIgorc3RyaW5nRW5kQXJjaGl2ZSA9ICJQS1wwMDVcMDA2Igorc2l6ZUVuZENlbnREaXIgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RW5kQXJjaGl2ZSkKKworX0VDRF9TSUdOQVRVUkUgPSAwCitfRUNEX0RJU0tfTlVNQkVSID0gMQorX0VDRF9ESVNLX1NUQVJUID0gMgorX0VDRF9FTlRSSUVTX1RISVNfRElTSyA9IDMKK19FQ0RfRU5UUklFU19UT1RBTCA9IDQKK19FQ0RfU0laRSA9IDUKK19FQ0RfT0ZGU0VUID0gNgorX0VDRF9DT01NRU5UX1NJWkUgPSA3CisjIFRoZXNlIGxhc3QgdHdvIGluZGljZXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdHJ1Y3R1cmUgYXMgZGVmaW5lZCBpbiB0aGUKKyMgc3BlYywgYnV0IHRoZXkgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGlzIG1vZHVsZSBhcyBhIGNvbnZlbmllbmNlCitfRUNEX0NPTU1FTlQgPSA4CitfRUNEX0xPQ0FUSU9OID0gOQorCisjIFRoZSAiY2VudHJhbCBkaXJlY3RvcnkiIHN0cnVjdHVyZSwgbWFnaWMgbnVtYmVyLCBzaXplLCBhbmQgaW5kaWNlcworIyBvZiBlbnRyaWVzIGluIHRoZSBzdHJ1Y3R1cmUgKHNlY3Rpb24gVi5GIGluIHRoZSBmb3JtYXQgZG9jdW1lbnQpCitzdHJ1Y3RDZW50cmFsRGlyID0gIjw0czRCNEhMMkw1SDJMIgorc3RyaW5nQ2VudHJhbERpciA9ICJQS1wwMDFcMDAyIgorc2l6ZUNlbnRyYWxEaXIgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0Q2VudHJhbERpcikKKworIyBpbmRleGVzIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IHN0cnVjdHVyZQorX0NEX1NJR05BVFVSRSA9IDAKK19DRF9DUkVBVEVfVkVSU0lPTiA9IDEKK19DRF9DUkVBVEVfU1lTVEVNID0gMgorX0NEX0VYVFJBQ1RfVkVSU0lPTiA9IDMKK19DRF9FWFRSQUNUX1NZU1RFTSA9IDQKK19DRF9GTEFHX0JJVFMgPSA1CitfQ0RfQ09NUFJFU1NfVFlQRSA9IDYKK19DRF9USU1FID0gNworX0NEX0RBVEUgPSA4CitfQ0RfQ1JDID0gOQorX0NEX0NPTVBSRVNTRURfU0laRSA9IDEwCitfQ0RfVU5DT01QUkVTU0VEX1NJWkUgPSAxMQorX0NEX0ZJTEVOQU1FX0xFTkdUSCA9IDEyCitfQ0RfRVhUUkFfRklFTERfTEVOR1RIID0gMTMKK19DRF9DT01NRU5UX0xFTkdUSCA9IDE0CitfQ0RfRElTS19OVU1CRVJfU1RBUlQgPSAxNQorX0NEX0lOVEVSTkFMX0ZJTEVfQVRUUklCVVRFUyA9IDE2CitfQ0RfRVhURVJOQUxfRklMRV9BVFRSSUJVVEVTID0gMTcKK19DRF9MT0NBTF9IRUFERVJfT0ZGU0VUID0gMTgKKworIyBUaGUgImxvY2FsIGZpbGUgaGVhZGVyIiBzdHJ1Y3R1cmUsIG1hZ2ljIG51bWJlciwgc2l6ZSwgYW5kIGluZGljZXMKKyMgKHNlY3Rpb24gVi5BIGluIHRoZSBmb3JtYXQgZG9jdW1lbnQpCitzdHJ1Y3RGaWxlSGVhZGVyID0gIjw0czJCNEhMMkwySCIKK3N0cmluZ0ZpbGVIZWFkZXIgPSAiUEtcMDAzXDAwNCIKK3NpemVGaWxlSGVhZGVyID0gc3RydWN0LmNhbGNzaXplKHN0cnVjdEZpbGVIZWFkZXIpCisKK19GSF9TSUdOQVRVUkUgPSAwCitfRkhfRVhUUkFDVF9WRVJTSU9OID0gMQorX0ZIX0VYVFJBQ1RfU1lTVEVNID0gMgorX0ZIX0dFTkVSQUxfUFVSUE9TRV9GTEFHX0JJVFMgPSAzCitfRkhfQ09NUFJFU1NJT05fTUVUSE9EID0gNAorX0ZIX0xBU1RfTU9EX1RJTUUgPSA1CitfRkhfTEFTVF9NT0RfREFURSA9IDYKK19GSF9DUkMgPSA3CitfRkhfQ09NUFJFU1NFRF9TSVpFID0gOAorX0ZIX1VOQ09NUFJFU1NFRF9TSVpFID0gOQorX0ZIX0ZJTEVOQU1FX0xFTkdUSCA9IDEwCitfRkhfRVhUUkFfRklFTERfTEVOR1RIID0gMTEKKworIyBUaGUgIlppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIiBzdHJ1Y3R1cmUsIG1hZ2ljIG51bWJlciwgYW5kIHNpemUKK3N0cnVjdEVuZEFyY2hpdmU2NExvY2F0b3IgPSAiPDRzTFFMIgorc3RyaW5nRW5kQXJjaGl2ZTY0TG9jYXRvciA9ICJQS1x4MDZceDA3Igorc2l6ZUVuZENlbnREaXI2NExvY2F0b3IgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvcikKKworIyBUaGUgIlppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIgcmVjb3JkLCBtYWdpYyBudW1iZXIsIHNpemUsIGFuZCBpbmRpY2VzCisjIChzZWN0aW9uIFYuRyBpbiB0aGUgZm9ybWF0IGRvY3VtZW50KQorc3RydWN0RW5kQXJjaGl2ZTY0ID0gIjw0c1EySDJMNFEiCitzdHJpbmdFbmRBcmNoaXZlNjQgPSAiUEtceDA2XHgwNiIKK3NpemVFbmRDZW50RGlyNjQgPSBzdHJ1Y3QuY2FsY3NpemUoc3RydWN0RW5kQXJjaGl2ZTY0KQorCitfQ0Q2NF9TSUdOQVRVUkUgPSAwCitfQ0Q2NF9ESVJFQ1RPUllfUkVDU0laRSA9IDEKK19DRDY0X0NSRUFURV9WRVJTSU9OID0gMgorX0NENjRfRVhUUkFDVF9WRVJTSU9OID0gMworX0NENjRfRElTS19OVU1CRVIgPSA0CitfQ0Q2NF9ESVNLX05VTUJFUl9TVEFSVCA9IDUKK19DRDY0X05VTUJFUl9FTlRSSUVTX1RISVNfRElTSyA9IDYKK19DRDY0X05VTUJFUl9FTlRSSUVTX1RPVEFMID0gNworX0NENjRfRElSRUNUT1JZX1NJWkUgPSA4CitfQ0Q2NF9PRkZTRVRfU1RBUlRfQ0VOVERJUiA9IDkKKworZGVmIF9jaGVja196aXBmaWxlKGZwKToKKyAgICB0cnk6CisgICAgICAgIGlmIF9FbmRSZWNEYXRhKGZwKToKKyAgICAgICAgICAgIHJldHVybiBUcnVlICAgICAgICAgIyBmaWxlIGhhcyBjb3JyZWN0IG1hZ2ljIG51bWJlcgorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBwYXNzCisgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBpc196aXBmaWxlKGZpbGVuYW1lKToKKyAgICAiIiJRdWlja2x5IHNlZSBpZiBhIGZpbGUgaXMgYSBaSVAgZmlsZSBieSBjaGVja2luZyB0aGUgbWFnaWMgbnVtYmVyLgorCisgICAgVGhlIGZpbGVuYW1lIGFyZ3VtZW50IG1heSBiZSBhIGZpbGUgb3IgZmlsZS1saWtlIG9iamVjdCB0b28uCisgICAgIiIiCisgICAgcmVzdWx0ID0gRmFsc2UKKyAgICB0cnk6CisgICAgICAgIGlmIGhhc2F0dHIoZmlsZW5hbWUsICJyZWFkIik6CisgICAgICAgICAgICByZXN1bHQgPSBfY2hlY2tfemlwZmlsZShmcD1maWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdpdGggb3BlbihmaWxlbmFtZSwgInJiIikgYXMgZnA6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gX2NoZWNrX3ppcGZpbGUoZnApCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcmVzdWx0CisKK2RlZiBfRW5kUmVjRGF0YTY0KGZwaW4sIG9mZnNldCwgZW5kcmVjKToKKyAgICAiIiIKKyAgICBSZWFkIHRoZSBaSVA2NCBlbmQtb2YtYXJjaGl2ZSByZWNvcmRzIGFuZCB1c2UgdGhhdCB0byB1cGRhdGUgZW5kcmVjCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBmcGluLnNlZWsob2Zmc2V0IC0gc2l6ZUVuZENlbnREaXI2NExvY2F0b3IsIDIpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICMgSWYgdGhlIHNlZWsgZmFpbHMsIHRoZSBmaWxlIGlzIG5vdCBsYXJnZSBlbm91Z2ggdG8gY29udGFpbiBhIFpJUDY0CisgICAgICAgICMgZW5kLW9mLWFyY2hpdmUgcmVjb3JkLCBzbyBqdXN0IHJldHVybiB0aGUgZW5kIHJlY29yZCB3ZSB3ZXJlIGdpdmVuLgorICAgICAgICByZXR1cm4gZW5kcmVjCisKKyAgICBkYXRhID0gZnBpbi5yZWFkKHNpemVFbmRDZW50RGlyNjRMb2NhdG9yKQorICAgIGlmIGxlbihkYXRhKSAhPSBzaXplRW5kQ2VudERpcjY0TG9jYXRvcjoKKyAgICAgICAgcmV0dXJuIGVuZHJlYworICAgIHNpZywgZGlza25vLCByZWxvZmYsIGRpc2tzID0gc3RydWN0LnVucGFjayhzdHJ1Y3RFbmRBcmNoaXZlNjRMb2NhdG9yLCBkYXRhKQorICAgIGlmIHNpZyAhPSBzdHJpbmdFbmRBcmNoaXZlNjRMb2NhdG9yOgorICAgICAgICByZXR1cm4gZW5kcmVjCisKKyAgICBpZiBkaXNrbm8gIT0gMCBvciBkaXNrcyAhPSAxOgorICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJ6aXBmaWxlcyB0aGF0IHNwYW4gbXVsdGlwbGUgZGlza3MgYXJlIG5vdCBzdXBwb3J0ZWQiKQorCisgICAgIyBBc3N1bWUgbm8gJ3ppcDY0IGV4dGVuc2libGUgZGF0YScKKyAgICBmcGluLnNlZWsob2Zmc2V0IC0gc2l6ZUVuZENlbnREaXI2NExvY2F0b3IgLSBzaXplRW5kQ2VudERpcjY0LCAyKQorICAgIGRhdGEgPSBmcGluLnJlYWQoc2l6ZUVuZENlbnREaXI2NCkKKyAgICBpZiBsZW4oZGF0YSkgIT0gc2l6ZUVuZENlbnREaXI2NDoKKyAgICAgICAgcmV0dXJuIGVuZHJlYworICAgIHNpZywgc3osIGNyZWF0ZV92ZXJzaW9uLCByZWFkX3ZlcnNpb24sIGRpc2tfbnVtLCBkaXNrX2RpciwgXAorICAgICAgICAgICAgZGlyY291bnQsIGRpcmNvdW50MiwgZGlyc2l6ZSwgZGlyb2Zmc2V0ID0gXAorICAgICAgICAgICAgc3RydWN0LnVucGFjayhzdHJ1Y3RFbmRBcmNoaXZlNjQsIGRhdGEpCisgICAgaWYgc2lnICE9IHN0cmluZ0VuZEFyY2hpdmU2NDoKKyAgICAgICAgcmV0dXJuIGVuZHJlYworCisgICAgIyBVcGRhdGUgdGhlIG9yaWdpbmFsIGVuZHJlYyB1c2luZyBkYXRhIGZyb20gdGhlIFpJUDY0IHJlY29yZAorICAgIGVuZHJlY1tfRUNEX1NJR05BVFVSRV0gPSBzaWcKKyAgICBlbmRyZWNbX0VDRF9ESVNLX05VTUJFUl0gPSBkaXNrX251bQorICAgIGVuZHJlY1tfRUNEX0RJU0tfU1RBUlRdID0gZGlza19kaXIKKyAgICBlbmRyZWNbX0VDRF9FTlRSSUVTX1RISVNfRElTS10gPSBkaXJjb3VudAorICAgIGVuZHJlY1tfRUNEX0VOVFJJRVNfVE9UQUxdID0gZGlyY291bnQyCisgICAgZW5kcmVjW19FQ0RfU0laRV0gPSBkaXJzaXplCisgICAgZW5kcmVjW19FQ0RfT0ZGU0VUXSA9IGRpcm9mZnNldAorICAgIHJldHVybiBlbmRyZWMKKworCitkZWYgX0VuZFJlY0RhdGEoZnBpbik6CisgICAgIiIiUmV0dXJuIGRhdGEgZnJvbSB0aGUgIkVuZCBvZiBDZW50cmFsIERpcmVjdG9yeSIgcmVjb3JkLCBvciBOb25lLgorCisgICAgVGhlIGRhdGEgaXMgYSBsaXN0IG9mIHRoZSBuaW5lIGl0ZW1zIGluIHRoZSBaSVAgIkVuZCBvZiBjZW50cmFsIGRpciIKKyAgICByZWNvcmQgZm9sbG93ZWQgYnkgYSB0ZW50aCBpdGVtLCB0aGUgZmlsZSBzZWVrIG9mZnNldCBvZiB0aGlzIHJlY29yZC4iIiIKKworICAgICMgRGV0ZXJtaW5lIGZpbGUgc2l6ZQorICAgIGZwaW4uc2VlaygwLCAyKQorICAgIGZpbGVzaXplID0gZnBpbi50ZWxsKCkKKworICAgICMgQ2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgWklQIGZpbGUgd2l0aCBubyBhcmNoaXZlIGNvbW1lbnQgKHRoZQorICAgICMgImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIgc3RydWN0dXJlIHNob3VsZCBiZSB0aGUgbGFzdCBpdGVtIGluIHRoZQorICAgICMgZmlsZSBpZiB0aGlzIGlzIHRoZSBjYXNlKS4KKyAgICB0cnk6CisgICAgICAgIGZwaW4uc2Vlaygtc2l6ZUVuZENlbnREaXIsIDIpCisgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZGF0YSA9IGZwaW4ucmVhZCgpCisgICAgaWYgKGxlbihkYXRhKSA9PSBzaXplRW5kQ2VudERpciBhbmQKKyAgICAgICAgZGF0YVswOjRdID09IHN0cmluZ0VuZEFyY2hpdmUgYW5kCisgICAgICAgIGRhdGFbLTI6XSA9PSBiIlwwMDBcMDAwIik6CisgICAgICAgICMgdGhlIHNpZ25hdHVyZSBpcyBjb3JyZWN0IGFuZCB0aGVyZSdzIG5vIGNvbW1lbnQsIHVucGFjayBzdHJ1Y3R1cmUKKyAgICAgICAgZW5kcmVjID0gc3RydWN0LnVucGFjayhzdHJ1Y3RFbmRBcmNoaXZlLCBkYXRhKQorICAgICAgICBlbmRyZWM9bGlzdChlbmRyZWMpCisKKyAgICAgICAgIyBBcHBlbmQgYSBibGFuayBjb21tZW50IGFuZCByZWNvcmQgc3RhcnQgb2Zmc2V0CisgICAgICAgIGVuZHJlYy5hcHBlbmQoIiIpCisgICAgICAgIGVuZHJlYy5hcHBlbmQoZmlsZXNpemUgLSBzaXplRW5kQ2VudERpcikKKworICAgICAgICAjIFRyeSB0byByZWFkIHRoZSAiWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IiBzdHJ1Y3R1cmUKKyAgICAgICAgcmV0dXJuIF9FbmRSZWNEYXRhNjQoZnBpbiwgLXNpemVFbmRDZW50RGlyLCBlbmRyZWMpCisKKyAgICAjIEVpdGhlciB0aGlzIGlzIG5vdCBhIFpJUCBmaWxlLCBvciBpdCBpcyBhIFpJUCBmaWxlIHdpdGggYW4gYXJjaGl2ZQorICAgICMgY29tbWVudC4gIFNlYXJjaCB0aGUgZW5kIG9mIHRoZSBmaWxlIGZvciB0aGUgImVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSIKKyAgICAjIHJlY29yZCBzaWduYXR1cmUuIFRoZSBjb21tZW50IGlzIHRoZSBsYXN0IGl0ZW0gaW4gdGhlIFpJUCBmaWxlIGFuZCBtYXkgYmUKKyAgICAjIHVwIHRvIDY0SyBsb25nLiAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSAiZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IiBtYWdpYworICAgICMgbnVtYmVyIGRvZXMgbm90IGFwcGVhciBpbiB0aGUgY29tbWVudC4KKyAgICBtYXhDb21tZW50U3RhcnQgPSBtYXgoZmlsZXNpemUgLSAoMSA8PCAxNikgLSBzaXplRW5kQ2VudERpciwgMCkKKyAgICBmcGluLnNlZWsobWF4Q29tbWVudFN0YXJ0LCAwKQorICAgIGRhdGEgPSBmcGluLnJlYWQoKQorICAgIHN0YXJ0ID0gZGF0YS5yZmluZChzdHJpbmdFbmRBcmNoaXZlKQorICAgIGlmIHN0YXJ0ID49IDA6CisgICAgICAgICMgZm91bmQgdGhlIG1hZ2ljIG51bWJlcjsgYXR0ZW1wdCB0byB1bnBhY2sgYW5kIGludGVycHJldAorICAgICAgICByZWNEYXRhID0gZGF0YVtzdGFydDpzdGFydCtzaXplRW5kQ2VudERpcl0KKyAgICAgICAgaWYgbGVuKHJlY0RhdGEpICE9IHNpemVFbmRDZW50RGlyOgorICAgICAgICAgICAgIyBaaXAgZmlsZSBpcyBjb3JydXB0ZWQuCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBlbmRyZWMgPSBsaXN0KHN0cnVjdC51bnBhY2soc3RydWN0RW5kQXJjaGl2ZSwgcmVjRGF0YSkpCisgICAgICAgIGNvbW1lbnRTaXplID0gZW5kcmVjW19FQ0RfQ09NTUVOVF9TSVpFXSAjYXMgY2xhaW1lZCBieSB0aGUgemlwIGZpbGUKKyAgICAgICAgY29tbWVudCA9IGRhdGFbc3RhcnQrc2l6ZUVuZENlbnREaXI6c3RhcnQrc2l6ZUVuZENlbnREaXIrY29tbWVudFNpemVdCisgICAgICAgIGVuZHJlYy5hcHBlbmQoY29tbWVudCkKKyAgICAgICAgZW5kcmVjLmFwcGVuZChtYXhDb21tZW50U3RhcnQgKyBzdGFydCkKKworICAgICAgICAjIFRyeSB0byByZWFkIHRoZSAiWmlwNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IiBzdHJ1Y3R1cmUKKyAgICAgICAgcmV0dXJuIF9FbmRSZWNEYXRhNjQoZnBpbiwgbWF4Q29tbWVudFN0YXJ0ICsgc3RhcnQgLSBmaWxlc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcmVjKQorCisgICAgIyBVbmFibGUgdG8gZmluZCBhIHZhbGlkIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKKyAgICByZXR1cm4gTm9uZQorCisKK2NsYXNzIFppcEluZm8gKG9iamVjdCk6CisgICAgIiIiQ2xhc3Mgd2l0aCBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgZWFjaCBmaWxlIGluIHRoZSBaSVAgYXJjaGl2ZS4iIiIKKworICAgIF9fc2xvdHNfXyA9ICgKKyAgICAgICAgICAgICdvcmlnX2ZpbGVuYW1lJywKKyAgICAgICAgICAgICdmaWxlbmFtZScsCisgICAgICAgICAgICAnZGF0ZV90aW1lJywKKyAgICAgICAgICAgICdjb21wcmVzc190eXBlJywKKyAgICAgICAgICAgICdjb21tZW50JywKKyAgICAgICAgICAgICdleHRyYScsCisgICAgICAgICAgICAnY3JlYXRlX3N5c3RlbScsCisgICAgICAgICAgICAnY3JlYXRlX3ZlcnNpb24nLAorICAgICAgICAgICAgJ2V4dHJhY3RfdmVyc2lvbicsCisgICAgICAgICAgICAncmVzZXJ2ZWQnLAorICAgICAgICAgICAgJ2ZsYWdfYml0cycsCisgICAgICAgICAgICAndm9sdW1lJywKKyAgICAgICAgICAgICdpbnRlcm5hbF9hdHRyJywKKyAgICAgICAgICAgICdleHRlcm5hbF9hdHRyJywKKyAgICAgICAgICAgICdoZWFkZXJfb2Zmc2V0JywKKyAgICAgICAgICAgICdDUkMnLAorICAgICAgICAgICAgJ2NvbXByZXNzX3NpemUnLAorICAgICAgICAgICAgJ2ZpbGVfc2l6ZScsCisgICAgICAgICAgICAnX3Jhd190aW1lJywKKyAgICAgICAgKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVuYW1lPSJOb05hbWUiLCBkYXRlX3RpbWU9KDE5ODAsMSwxLDAsMCwwKSk6CisgICAgICAgIHNlbGYub3JpZ19maWxlbmFtZSA9IGZpbGVuYW1lICAgIyBPcmlnaW5hbCBmaWxlIG5hbWUgaW4gYXJjaGl2ZQorCisgICAgICAgICMgVGVybWluYXRlIHRoZSBmaWxlIG5hbWUgYXQgdGhlIGZpcnN0IG51bGwgYnl0ZS4gIE51bGwgYnl0ZXMgaW4gZmlsZQorICAgICAgICAjIG5hbWVzIGFyZSB1c2VkIGFzIHRyaWNrcyBieSB2aXJ1c2VzIGluIGFyY2hpdmVzLgorICAgICAgICBudWxsX2J5dGUgPSBmaWxlbmFtZS5maW5kKGNocigwKSkKKyAgICAgICAgaWYgbnVsbF9ieXRlID49IDA6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzA6bnVsbF9ieXRlXQorICAgICAgICAjIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgcGF0aHMgaW4gZ2VuZXJhdGVkIFpJUCBmaWxlcyBhbHdheXMgdXNlCisgICAgICAgICMgZm9yd2FyZCBzbGFzaGVzIGFzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLCBhcyByZXF1aXJlZCBieSB0aGUKKyAgICAgICAgIyBaSVAgZm9ybWF0IHNwZWNpZmljYXRpb24uCisgICAgICAgIGlmIG9zLnNlcCAhPSAiLyIgYW5kIG9zLnNlcCBpbiBmaWxlbmFtZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUucmVwbGFjZShvcy5zZXAsICIvIikKKworICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUgICAgICAgICMgTm9ybWFsaXplZCBmaWxlIG5hbWUKKyAgICAgICAgc2VsZi5kYXRlX3RpbWUgPSBkYXRlX3RpbWUgICAgICAjIHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbiwgc2VjCisKKyAgICAgICAgaWYgZGF0ZV90aW1lWzBdIDwgMTk4MDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1pJUCBkb2VzIG5vdCBzdXBwb3J0IHRpbWVzdGFtcHMgYmVmb3JlIDE5ODAnKQorCisgICAgICAgICMgU3RhbmRhcmQgdmFsdWVzOgorICAgICAgICBzZWxmLmNvbXByZXNzX3R5cGUgPSBaSVBfU1RPUkVEICMgVHlwZSBvZiBjb21wcmVzc2lvbiBmb3IgdGhlIGZpbGUKKyAgICAgICAgc2VsZi5jb21tZW50ID0gIiIgICAgICAgICAgICAgICAjIENvbW1lbnQgZm9yIGVhY2ggZmlsZQorICAgICAgICBzZWxmLmV4dHJhID0gIiIgICAgICAgICAgICAgICAgICMgWklQIGV4dHJhIGRhdGEKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgICAgICBzZWxmLmNyZWF0ZV9zeXN0ZW0gPSAwICAgICAgICAgICMgU3lzdGVtIHdoaWNoIGNyZWF0ZWQgWklQIGFyY2hpdmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgQXNzdW1lIGV2ZXJ5dGhpbmcgZWxzZSBpcyB1bml4LXkKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX3N5c3RlbSA9IDMgICAgICAgICAgIyBTeXN0ZW0gd2hpY2ggY3JlYXRlZCBaSVAgYXJjaGl2ZQorICAgICAgICBzZWxmLmNyZWF0ZV92ZXJzaW9uID0gMjAgICAgICAgICMgVmVyc2lvbiB3aGljaCBjcmVhdGVkIFpJUCBhcmNoaXZlCisgICAgICAgIHNlbGYuZXh0cmFjdF92ZXJzaW9uID0gMjAgICAgICAgIyBWZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0IGFyY2hpdmUKKyAgICAgICAgc2VsZi5yZXNlcnZlZCA9IDAgICAgICAgICAgICAgICAjIE11c3QgYmUgemVybworICAgICAgICBzZWxmLmZsYWdfYml0cyA9IDAgICAgICAgICAgICAgICMgWklQIGZsYWcgYml0cworICAgICAgICBzZWxmLnZvbHVtZSA9IDAgICAgICAgICAgICAgICAgICMgVm9sdW1lIG51bWJlciBvZiBmaWxlIGhlYWRlcgorICAgICAgICBzZWxmLmludGVybmFsX2F0dHIgPSAwICAgICAgICAgICMgSW50ZXJuYWwgYXR0cmlidXRlcworICAgICAgICBzZWxmLmV4dGVybmFsX2F0dHIgPSAwICAgICAgICAgICMgRXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzCisgICAgICAgICMgT3RoZXIgYXR0cmlidXRlcyBhcmUgc2V0IGJ5IGNsYXNzIFppcEZpbGU6CisgICAgICAgICMgaGVhZGVyX29mZnNldCAgICAgICAgIEJ5dGUgb2Zmc2V0IHRvIHRoZSBmaWxlIGhlYWRlcgorICAgICAgICAjIENSQyAgICAgICAgICAgICAgICAgICBDUkMtMzIgb2YgdGhlIHVuY29tcHJlc3NlZCBmaWxlCisgICAgICAgICMgY29tcHJlc3Nfc2l6ZSAgICAgICAgIFNpemUgb2YgdGhlIGNvbXByZXNzZWQgZmlsZQorICAgICAgICAjIGZpbGVfc2l6ZSAgICAgICAgICAgICBTaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZQorCisgICAgZGVmIEZpbGVIZWFkZXIoc2VsZiwgemlwNjQ9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0aGUgcGVyLWZpbGUgaGVhZGVyIGFzIGEgc3RyaW5nLiIiIgorICAgICAgICBkdCA9IHNlbGYuZGF0ZV90aW1lCisgICAgICAgIGRvc2RhdGUgPSAoZHRbMF0gLSAxOTgwKSA8PCA5IHwgZHRbMV0gPDwgNSB8IGR0WzJdCisgICAgICAgIGRvc3RpbWUgPSBkdFszXSA8PCAxMSB8IGR0WzRdIDw8IDUgfCAoZHRbNV0gLy8gMikKKyAgICAgICAgaWYgc2VsZi5mbGFnX2JpdHMgJiAweDA4OgorICAgICAgICAgICAgIyBTZXQgdGhlc2UgdG8gemVybyBiZWNhdXNlIHdlIHdyaXRlIHRoZW0gYWZ0ZXIgdGhlIGZpbGUgZGF0YQorICAgICAgICAgICAgQ1JDID0gY29tcHJlc3Nfc2l6ZSA9IGZpbGVfc2l6ZSA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIENSQyA9IHNlbGYuQ1JDCisgICAgICAgICAgICBjb21wcmVzc19zaXplID0gc2VsZi5jb21wcmVzc19zaXplCisgICAgICAgICAgICBmaWxlX3NpemUgPSBzZWxmLmZpbGVfc2l6ZQorCisgICAgICAgIGV4dHJhID0gc2VsZi5leHRyYQorCisgICAgICAgIGlmIHppcDY0IGlzIE5vbmU6CisgICAgICAgICAgICB6aXA2NCA9IGZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUIG9yIGNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVAorICAgICAgICBpZiB6aXA2NDoKKyAgICAgICAgICAgIGZtdCA9ICc8SEhRUScKKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmEgKyBzdHJ1Y3QucGFjayhmbXQsCisgICAgICAgICAgICAgICAgICAgIDEsIHN0cnVjdC5jYWxjc2l6ZShmbXQpLTQsIGZpbGVfc2l6ZSwgY29tcHJlc3Nfc2l6ZSkKKyAgICAgICAgaWYgZmlsZV9zaXplID4gWklQNjRfTElNSVQgb3IgY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgaWYgbm90IHppcDY0OgorICAgICAgICAgICAgICAgIHJhaXNlIExhcmdlWmlwRmlsZSgiRmlsZXNpemUgd291bGQgcmVxdWlyZSBaSVA2NCBleHRlbnNpb25zIikKKyAgICAgICAgICAgICMgRmlsZSBpcyBsYXJnZXIgdGhhbiB3aGF0IGZpdHMgaW50byBhIDQgYnl0ZSBpbnRlZ2VyLAorICAgICAgICAgICAgIyBmYWxsIGJhY2sgdG8gdGhlIFpJUDY0IGV4dGVuc2lvbgorICAgICAgICAgICAgZmlsZV9zaXplID0gMHhmZmZmZmZmZgorICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IDB4ZmZmZmZmZmYKKyAgICAgICAgICAgIHNlbGYuZXh0cmFjdF92ZXJzaW9uID0gbWF4KDQ1LCBzZWxmLmV4dHJhY3RfdmVyc2lvbikKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX3ZlcnNpb24gPSBtYXgoNDUsIHNlbGYuZXh0cmFjdF92ZXJzaW9uKQorCisgICAgICAgIGZpbGVuYW1lLCBmbGFnX2JpdHMgPSBzZWxmLl9lbmNvZGVGaWxlbmFtZUZsYWdzKCkKKyAgICAgICAgaGVhZGVyID0gc3RydWN0LnBhY2soc3RydWN0RmlsZUhlYWRlciwgc3RyaW5nRmlsZUhlYWRlciwKKyAgICAgICAgICAgICAgICAgc2VsZi5leHRyYWN0X3ZlcnNpb24sIHNlbGYucmVzZXJ2ZWQsIGZsYWdfYml0cywKKyAgICAgICAgICAgICAgICAgc2VsZi5jb21wcmVzc190eXBlLCBkb3N0aW1lLCBkb3NkYXRlLCBDUkMsCisgICAgICAgICAgICAgICAgIGNvbXByZXNzX3NpemUsIGZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgbGVuKGZpbGVuYW1lKSwgbGVuKGV4dHJhKSkKKyAgICAgICAgcmV0dXJuIGhlYWRlciArIGZpbGVuYW1lICsgZXh0cmEKKworICAgIGRlZiBfZW5jb2RlRmlsZW5hbWVGbGFncyhzZWxmKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLmZpbGVuYW1lLCB1bmljb2RlKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZS5lbmNvZGUoJ2FzY2lpJyksIHNlbGYuZmxhZ19iaXRzCisgICAgICAgICAgICBleGNlcHQgVW5pY29kZUVuY29kZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lLmVuY29kZSgndXRmLTgnKSwgc2VsZi5mbGFnX2JpdHMgfCAweDgwMAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUsIHNlbGYuZmxhZ19iaXRzCisKKyAgICBkZWYgX2RlY29kZUZpbGVuYW1lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZsYWdfYml0cyAmIDB4ODAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlsZW5hbWUuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZQorCisgICAgZGVmIF9kZWNvZGVFeHRyYShzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gZGVjb2RlIHRoZSBleHRyYSBmaWVsZC4KKyAgICAgICAgZXh0cmEgPSBzZWxmLmV4dHJhCisgICAgICAgIHVucGFjayA9IHN0cnVjdC51bnBhY2sKKyAgICAgICAgd2hpbGUgZXh0cmE6CisgICAgICAgICAgICB0cCwgbG4gPSB1bnBhY2soJzxISCcsIGV4dHJhWzo0XSkKKyAgICAgICAgICAgIGlmIHRwID09IDE6CisgICAgICAgICAgICAgICAgaWYgbG4gPj0gMjQ6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPFFRUScsIGV4dHJhWzQ6MjhdKQorICAgICAgICAgICAgICAgIGVsaWYgbG4gPT0gMTY6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPFFRJywgZXh0cmFbNDoyMF0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSA4OgorICAgICAgICAgICAgICAgICAgICBjb3VudHMgPSB1bnBhY2soJzxRJywgZXh0cmFbNDoxMl0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSAwOgorICAgICAgICAgICAgICAgICAgICBjb3VudHMgPSAoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIkNvcnJ1cHQgZXh0cmEgZmllbGQgJXMiJShsbiwpCisKKyAgICAgICAgICAgICAgICBpZHggPSAwCisKKyAgICAgICAgICAgICAgICAjIFpJUDY0IGV4dGVuc2lvbiAobGFyZ2UgZmlsZXMgYW5kL29yIGxhcmdlIGFyY2hpdmVzKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZmlsZV9zaXplIGluICgweGZmZmZmZmZmZmZmZmZmZmZMLCAweGZmZmZmZmZmTCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZV9zaXplID0gY291bnRzW2lkeF0KKyAgICAgICAgICAgICAgICAgICAgaWR4ICs9IDEKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuY29tcHJlc3Nfc2l6ZSA9PSAweEZGRkZGRkZGTDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21wcmVzc19zaXplID0gY291bnRzW2lkeF0KKyAgICAgICAgICAgICAgICAgICAgaWR4ICs9IDEKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuaGVhZGVyX29mZnNldCA9PSAweGZmZmZmZmZmTDoKKyAgICAgICAgICAgICAgICAgICAgb2xkID0gc2VsZi5oZWFkZXJfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuaGVhZGVyX29mZnNldCA9IGNvdW50c1tpZHhdCisgICAgICAgICAgICAgICAgICAgIGlkeCs9MQorCisgICAgICAgICAgICBleHRyYSA9IGV4dHJhW2xuKzQ6XQorCisKK2NsYXNzIF9aaXBEZWNyeXB0ZXI6CisgICAgIiIiQ2xhc3MgdG8gaGFuZGxlIGRlY3J5cHRpb24gb2YgZmlsZXMgc3RvcmVkIHdpdGhpbiBhIFpJUCBhcmNoaXZlLgorCisgICAgWklQIHN1cHBvcnRzIGEgcGFzc3dvcmQtYmFzZWQgZm9ybSBvZiBlbmNyeXB0aW9uLiBFdmVuIHRob3VnaCBrbm93bgorICAgIHBsYWludGV4dCBhdHRhY2tzIGhhdmUgYmVlbiBmb3VuZCBhZ2FpbnN0IGl0LCBpdCBpcyBzdGlsbCB1c2VmdWwKKyAgICB0byBiZSBhYmxlIHRvIGdldCBkYXRhIG91dCBvZiBzdWNoIGEgZmlsZS4KKworICAgIFVzYWdlOgorICAgICAgICB6ZCA9IF9aaXBEZWNyeXB0ZXIobXlwd2QpCisgICAgICAgIHBsYWluX2NoYXIgPSB6ZChjeXBoZXJfY2hhcikKKyAgICAgICAgcGxhaW5fdGV4dCA9IG1hcCh6ZCwgY3lwaGVyX3RleHQpCisgICAgIiIiCisKKyAgICBkZWYgX0dlbmVyYXRlQ1JDVGFibGUoKToKKyAgICAgICAgIiIiR2VuZXJhdGUgYSBDUkMtMzIgdGFibGUuCisKKyAgICAgICAgWklQIGVuY3J5cHRpb24gdXNlcyB0aGUgQ1JDMzIgb25lLWJ5dGUgcHJpbWl0aXZlIGZvciBzY3JhbWJsaW5nIHNvbWUKKyAgICAgICAgaW50ZXJuYWwga2V5cy4gV2Ugbm90aWNlZCB0aGF0IGEgZGlyZWN0IGltcGxlbWVudGF0aW9uIGlzIGZhc3RlciB0aGFuCisgICAgICAgIHJlbHlpbmcgb24gYmluYXNjaWkuY3JjMzIoKS4KKyAgICAgICAgIiIiCisgICAgICAgIHBvbHkgPSAweGVkYjg4MzIwCisgICAgICAgIHRhYmxlID0gWzBdICogMjU2CisgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgICAgICBjcmMgPSBpCisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSg4KToKKyAgICAgICAgICAgICAgICBpZiBjcmMgJiAxOgorICAgICAgICAgICAgICAgICAgICBjcmMgPSAoKGNyYyA+PiAxKSAmIDB4N0ZGRkZGRkYpIF4gcG9seQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNyYyA9ICgoY3JjID4+IDEpICYgMHg3RkZGRkZGRikKKyAgICAgICAgICAgIHRhYmxlW2ldID0gY3JjCisgICAgICAgIHJldHVybiB0YWJsZQorICAgIGNyY3RhYmxlID0gX0dlbmVyYXRlQ1JDVGFibGUoKQorCisgICAgZGVmIF9jcmMzMihzZWxmLCBjaCwgY3JjKToKKyAgICAgICAgIiIiQ29tcHV0ZSB0aGUgQ1JDMzIgcHJpbWl0aXZlIG9uIG9uZSBieXRlLiIiIgorICAgICAgICByZXR1cm4gKChjcmMgPj4gOCkgJiAweGZmZmZmZikgXiBzZWxmLmNyY3RhYmxlWyhjcmMgXiBvcmQoY2gpKSAmIDB4ZmZdCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcHdkKToKKyAgICAgICAgc2VsZi5rZXkwID0gMzA1NDE5ODk2CisgICAgICAgIHNlbGYua2V5MSA9IDU5MTc1MTA0OQorICAgICAgICBzZWxmLmtleTIgPSA4NzgwODIxOTIKKyAgICAgICAgZm9yIHAgaW4gcHdkOgorICAgICAgICAgICAgc2VsZi5fVXBkYXRlS2V5cyhwKQorCisgICAgZGVmIF9VcGRhdGVLZXlzKHNlbGYsIGMpOgorICAgICAgICBzZWxmLmtleTAgPSBzZWxmLl9jcmMzMihjLCBzZWxmLmtleTApCisgICAgICAgIHNlbGYua2V5MSA9IChzZWxmLmtleTEgKyAoc2VsZi5rZXkwICYgMjU1KSkgJiA0Mjk0OTY3Mjk1CisgICAgICAgIHNlbGYua2V5MSA9IChzZWxmLmtleTEgKiAxMzQ3NzU4MTMgKyAxKSAmIDQyOTQ5NjcyOTUKKyAgICAgICAgc2VsZi5rZXkyID0gc2VsZi5fY3JjMzIoY2hyKChzZWxmLmtleTEgPj4gMjQpICYgMjU1KSwgc2VsZi5rZXkyKQorCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGMpOgorICAgICAgICAiIiJEZWNyeXB0IGEgc2luZ2xlIGNoYXJhY3Rlci4iIiIKKyAgICAgICAgYyA9IG9yZChjKQorICAgICAgICBrID0gc2VsZi5rZXkyIHwgMgorICAgICAgICBjID0gYyBeICgoKGsgKiAoa14xKSkgPj4gOCkgJiAyNTUpCisgICAgICAgIGMgPSBjaHIoYykKKyAgICAgICAgc2VsZi5fVXBkYXRlS2V5cyhjKQorICAgICAgICByZXR1cm4gYworCisKK2NvbXByZXNzb3JfbmFtZXMgPSB7CisgICAgMDogJ3N0b3JlJywKKyAgICAxOiAnc2hyaW5rJywKKyAgICAyOiAncmVkdWNlJywKKyAgICAzOiAncmVkdWNlJywKKyAgICA0OiAncmVkdWNlJywKKyAgICA1OiAncmVkdWNlJywKKyAgICA2OiAnaW1wbG9kZScsCisgICAgNzogJ3Rva2VuaXplJywKKyAgICA4OiAnZGVmbGF0ZScsCisgICAgOTogJ2RlZmxhdGU2NCcsCisgICAgMTA6ICdpbXBsb2RlJywKKyAgICAxMjogJ2J6aXAyJywKKyAgICAxNDogJ2x6bWEnLAorICAgIDE4OiAndGVyc2UnLAorICAgIDE5OiAnbHo3NycsCisgICAgOTc6ICd3YXZwYWNrJywKKyAgICA5ODogJ3BwbWQnLAorfQorCisKK2NsYXNzIFppcEV4dEZpbGUoaW8uQnVmZmVyZWRJT0Jhc2UpOgorICAgICIiIkZpbGUtbGlrZSBvYmplY3QgZm9yIHJlYWRpbmcgYW4gYXJjaGl2ZSBtZW1iZXIuCisgICAgICAgSXMgcmV0dXJuZWQgYnkgWmlwRmlsZS5vcGVuKCkuCisgICAgIiIiCisKKyAgICAjIE1heCBzaXplIHN1cHBvcnRlZCBieSBkZWNvbXByZXNzb3IuCisgICAgTUFYX04gPSAxIDw8IDMxIC0gMQorCisgICAgIyBSZWFkIGZyb20gY29tcHJlc3NlZCBmaWxlcyBpbiA0ayBibG9ja3MuCisgICAgTUlOX1JFQURfU0laRSA9IDQwOTYKKworICAgICMgU2VhcmNoIGZvciB1bml2ZXJzYWwgbmV3bGluZXMgb3IgbGluZSBjaHVua3MuCisgICAgUEFUVEVSTiA9IHJlLmNvbXBpbGUocideKD9QPGNodW5rPlteXHJcbl0rKXwoP1A8bmV3bGluZT5cbnxcclxuPyknKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVvYmosIG1vZGUsIHppcGluZm8sIGRlY3J5cHRlcj1Ob25lLAorICAgICAgICAgICAgY2xvc2VfZmlsZW9iaj1GYWxzZSk6CisgICAgICAgIHNlbGYuX2ZpbGVvYmogPSBmaWxlb2JqCisgICAgICAgIHNlbGYuX2RlY3J5cHRlciA9IGRlY3J5cHRlcgorICAgICAgICBzZWxmLl9jbG9zZV9maWxlb2JqID0gY2xvc2VfZmlsZW9iagorCisgICAgICAgIHNlbGYuX2NvbXByZXNzX3R5cGUgPSB6aXBpbmZvLmNvbXByZXNzX3R5cGUKKyAgICAgICAgc2VsZi5fY29tcHJlc3Nfc2l6ZSA9IHppcGluZm8uY29tcHJlc3Nfc2l6ZQorICAgICAgICBzZWxmLl9jb21wcmVzc19sZWZ0ID0gemlwaW5mby5jb21wcmVzc19zaXplCisKKyAgICAgICAgaWYgc2VsZi5fY29tcHJlc3NfdHlwZSA9PSBaSVBfREVGTEFURUQ6CisgICAgICAgICAgICBzZWxmLl9kZWNvbXByZXNzb3IgPSB6bGliLmRlY29tcHJlc3NvYmooLTE1KQorICAgICAgICBlbGlmIHNlbGYuX2NvbXByZXNzX3R5cGUgIT0gWklQX1NUT1JFRDoKKyAgICAgICAgICAgIGRlc2NyID0gY29tcHJlc3Nvcl9uYW1lcy5nZXQoc2VsZi5fY29tcHJlc3NfdHlwZSkKKyAgICAgICAgICAgIGlmIGRlc2NyOgorICAgICAgICAgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoImNvbXByZXNzaW9uIHR5cGUgJWQgKCVzKSIgJSAoc2VsZi5fY29tcHJlc3NfdHlwZSwgZGVzY3IpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJjb21wcmVzc2lvbiB0eXBlICVkIiAlIChzZWxmLl9jb21wcmVzc190eXBlLCkpCisgICAgICAgIHNlbGYuX3VuY29uc3VtZWQgPSAnJworCisgICAgICAgIHNlbGYuX3JlYWRidWZmZXIgPSAnJworICAgICAgICBzZWxmLl9vZmZzZXQgPSAwCisKKyAgICAgICAgc2VsZi5fdW5pdmVyc2FsID0gJ1UnIGluIG1vZGUKKyAgICAgICAgc2VsZi5uZXdsaW5lcyA9IE5vbmUKKworICAgICAgICAjIEFkanVzdCByZWFkIHNpemUgZm9yIGVuY3J5cHRlZCBmaWxlcyBzaW5jZSB0aGUgZmlyc3QgMTIgYnl0ZXMKKyAgICAgICAgIyBhcmUgZm9yIHRoZSBlbmNyeXB0aW9uL3Bhc3N3b3JkIGluZm9ybWF0aW9uLgorICAgICAgICBpZiBzZWxmLl9kZWNyeXB0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl9jb21wcmVzc19sZWZ0IC09IDEyCisKKyAgICAgICAgc2VsZi5tb2RlID0gbW9kZQorICAgICAgICBzZWxmLm5hbWUgPSB6aXBpbmZvLmZpbGVuYW1lCisKKyAgICAgICAgaWYgaGFzYXR0cih6aXBpbmZvLCAnQ1JDJyk6CisgICAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jcmMgPSB6aXBpbmZvLkNSQworICAgICAgICAgICAgc2VsZi5fcnVubmluZ19jcmMgPSBjcmMzMihiJycpICYgMHhmZmZmZmZmZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY3JjID0gTm9uZQorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYsIGxpbWl0PS0xKToKKyAgICAgICAgIiIiUmVhZCBhbmQgcmV0dXJuIGEgbGluZSBmcm9tIHRoZSBzdHJlYW0uCisKKyAgICAgICAgSWYgbGltaXQgaXMgc3BlY2lmaWVkLCBhdCBtb3N0IGxpbWl0IGJ5dGVzIHdpbGwgYmUgcmVhZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IHNlbGYuX3VuaXZlcnNhbCBhbmQgbGltaXQgPCAwOgorICAgICAgICAgICAgIyBTaG9ydGN1dCBjb21tb24gY2FzZSAtIG5ld2xpbmUgZm91bmQgaW4gYnVmZmVyLgorICAgICAgICAgICAgaSA9IHNlbGYuX3JlYWRidWZmZXIuZmluZCgnXG4nLCBzZWxmLl9vZmZzZXQpICsgMQorICAgICAgICAgICAgaWYgaSA+IDA6CisgICAgICAgICAgICAgICAgbGluZSA9IHNlbGYuX3JlYWRidWZmZXJbc2VsZi5fb2Zmc2V0OiBpXQorICAgICAgICAgICAgICAgIHNlbGYuX29mZnNldCA9IGkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZQorCisgICAgICAgIGlmIG5vdCBzZWxmLl91bml2ZXJzYWw6CisgICAgICAgICAgICByZXR1cm4gaW8uQnVmZmVyZWRJT0Jhc2UucmVhZGxpbmUoc2VsZiwgbGltaXQpCisKKyAgICAgICAgbGluZSA9ICcnCisgICAgICAgIHdoaWxlIGxpbWl0IDwgMCBvciBsZW4obGluZSkgPCBsaW1pdDoKKyAgICAgICAgICAgIHJlYWRhaGVhZCA9IHNlbGYucGVlaygyKQorICAgICAgICAgICAgaWYgcmVhZGFoZWFkID09ICcnOgorICAgICAgICAgICAgICAgIHJldHVybiBsaW5lCisKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgU2VhcmNoIGZvciB1bml2ZXJzYWwgbmV3bGluZXMgb3IgbGluZSBjaHVua3MuCisgICAgICAgICAgICAjCisgICAgICAgICAgICAjIFRoZSBwYXR0ZXJuIHJldHVybnMgZWl0aGVyIGEgbGluZSBjaHVuayBvciBhIG5ld2xpbmUsIGJ1dCBub3QKKyAgICAgICAgICAgICMgYm90aC4gQ29tYmluZWQgd2l0aCBwZWVrKDIpLCB3ZSBhcmUgYXNzdXJlZCB0aGF0IHRoZSBzZXF1ZW5jZQorICAgICAgICAgICAgIyAnXHJcbicgaXMgYWx3YXlzIHJldHJpZXZlZCBjb21wbGV0ZWx5IGFuZCBuZXZlciBzcGxpdCBpbnRvCisgICAgICAgICAgICAjIHNlcGFyYXRlIG5ld2xpbmVzIC0gJ1xyJywgJ1xuJyBkdWUgdG8gY29pbmNpZGVudGFsIHJlYWRhaGVhZHMuCisgICAgICAgICAgICAjCisgICAgICAgICAgICBtYXRjaCA9IHNlbGYuUEFUVEVSTi5zZWFyY2gocmVhZGFoZWFkKQorICAgICAgICAgICAgbmV3bGluZSA9IG1hdGNoLmdyb3VwKCduZXdsaW5lJykKKyAgICAgICAgICAgIGlmIG5ld2xpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5uZXdsaW5lcyBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmVzID0gW10KKyAgICAgICAgICAgICAgICBpZiBuZXdsaW5lIG5vdCBpbiBzZWxmLm5ld2xpbmVzOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm5ld2xpbmVzLmFwcGVuZChuZXdsaW5lKQorICAgICAgICAgICAgICAgIHNlbGYuX29mZnNldCArPSBsZW4obmV3bGluZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluZSArICdcbicKKworICAgICAgICAgICAgY2h1bmsgPSBtYXRjaC5ncm91cCgnY2h1bmsnKQorICAgICAgICAgICAgaWYgbGltaXQgPj0gMDoKKyAgICAgICAgICAgICAgICBjaHVuayA9IGNodW5rWzogbGltaXQgLSBsZW4obGluZSldCisKKyAgICAgICAgICAgIHNlbGYuX29mZnNldCArPSBsZW4oY2h1bmspCisgICAgICAgICAgICBsaW5lICs9IGNodW5rCisKKyAgICAgICAgcmV0dXJuIGxpbmUKKworICAgIGRlZiBwZWVrKHNlbGYsIG49MSk6CisgICAgICAgICIiIlJldHVybnMgYnVmZmVyZWQgYnl0ZXMgd2l0aG91dCBhZHZhbmNpbmcgdGhlIHBvc2l0aW9uLiIiIgorICAgICAgICBpZiBuID4gbGVuKHNlbGYuX3JlYWRidWZmZXIpIC0gc2VsZi5fb2Zmc2V0OgorICAgICAgICAgICAgY2h1bmsgPSBzZWxmLnJlYWQobikKKyAgICAgICAgICAgIHNlbGYuX29mZnNldCAtPSBsZW4oY2h1bmspCisKKyAgICAgICAgIyBSZXR1cm4gdXAgdG8gNTEyIGJ5dGVzIHRvIHJlZHVjZSBhbGxvY2F0aW9uIG92ZXJoZWFkIGZvciB0aWdodCBsb29wcy4KKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlYWRidWZmZXJbc2VsZi5fb2Zmc2V0OiBzZWxmLl9vZmZzZXQgKyA1MTJdCisKKyAgICBkZWYgcmVhZGFibGUoc2VsZik6CisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgcmVhZChzZWxmLCBuPS0xKToKKyAgICAgICAgIiIiUmVhZCBhbmQgcmV0dXJuIHVwIHRvIG4gYnl0ZXMuCisgICAgICAgIElmIHRoZSBhcmd1bWVudCBpcyBvbWl0dGVkLCBOb25lLCBvciBuZWdhdGl2ZSwgZGF0YSBpcyByZWFkIGFuZCByZXR1cm5lZCB1bnRpbCBFT0YgaXMgcmVhY2hlZC4uCisgICAgICAgICIiIgorICAgICAgICBidWYgPSAnJworICAgICAgICBpZiBuIGlzIE5vbmU6CisgICAgICAgICAgICBuID0gLTEKKyAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgIGlmIG4gPCAwOgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLnJlYWQxKG4pCisgICAgICAgICAgICBlbGlmIG4gPiBsZW4oYnVmKToKKyAgICAgICAgICAgICAgICBkYXRhID0gc2VsZi5yZWFkMShuIC0gbGVuKGJ1ZikpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgICAgIGlmIGxlbihkYXRhKSA9PSAwOgorICAgICAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgICAgIGJ1ZiArPSBkYXRhCisKKyAgICBkZWYgX3VwZGF0ZV9jcmMoc2VsZiwgbmV3ZGF0YSwgZW9mKToKKyAgICAgICAgIyBVcGRhdGUgdGhlIENSQyB1c2luZyB0aGUgZ2l2ZW4gZGF0YS4KKyAgICAgICAgaWYgc2VsZi5fZXhwZWN0ZWRfY3JjIGlzIE5vbmU6CisgICAgICAgICAgICAjIE5vIG5lZWQgdG8gY29tcHV0ZSB0aGUgQ1JDIGlmIHdlIGRvbid0IGhhdmUgYSByZWZlcmVuY2UgdmFsdWUKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9ydW5uaW5nX2NyYyA9IGNyYzMyKG5ld2RhdGEsIHNlbGYuX3J1bm5pbmdfY3JjKSAmIDB4ZmZmZmZmZmYKKyAgICAgICAgIyBDaGVjayB0aGUgQ1JDIGlmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKKyAgICAgICAgaWYgZW9mIGFuZCBzZWxmLl9ydW5uaW5nX2NyYyAhPSBzZWxmLl9leHBlY3RlZF9jcmM6CisgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJCYWQgQ1JDLTMyIGZvciBmaWxlICVyIiAlIHNlbGYubmFtZSkKKworICAgIGRlZiByZWFkMShzZWxmLCBuKToKKyAgICAgICAgIiIiUmVhZCB1cCB0byBuIGJ5dGVzIHdpdGggYXQgbW9zdCBvbmUgcmVhZCgpIHN5c3RlbSBjYWxsLiIiIgorCisgICAgICAgICMgU2ltcGxpZnkgYWxnb3JpdGhtIChicmFuY2hpbmcpIGJ5IHRyYW5zZm9ybWluZyBuZWdhdGl2ZSBuIHRvIGxhcmdlIG4uCisgICAgICAgIGlmIG4gPCAwIG9yIG4gaXMgTm9uZToKKyAgICAgICAgICAgIG4gPSBzZWxmLk1BWF9OCisKKyAgICAgICAgIyBCeXRlcyBhdmFpbGFibGUgaW4gcmVhZCBidWZmZXIuCisgICAgICAgIGxlbl9yZWFkYnVmZmVyID0gbGVuKHNlbGYuX3JlYWRidWZmZXIpIC0gc2VsZi5fb2Zmc2V0CisKKyAgICAgICAgIyBSZWFkIGZyb20gZmlsZS4KKyAgICAgICAgaWYgc2VsZi5fY29tcHJlc3NfbGVmdCA+IDAgYW5kIG4gPiBsZW5fcmVhZGJ1ZmZlciArIGxlbihzZWxmLl91bmNvbnN1bWVkKToKKyAgICAgICAgICAgIG5ieXRlcyA9IG4gLSBsZW5fcmVhZGJ1ZmZlciAtIGxlbihzZWxmLl91bmNvbnN1bWVkKQorICAgICAgICAgICAgbmJ5dGVzID0gbWF4KG5ieXRlcywgc2VsZi5NSU5fUkVBRF9TSVpFKQorICAgICAgICAgICAgbmJ5dGVzID0gbWluKG5ieXRlcywgc2VsZi5fY29tcHJlc3NfbGVmdCkKKworICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2ZpbGVvYmoucmVhZChuYnl0ZXMpCisgICAgICAgICAgICBzZWxmLl9jb21wcmVzc19sZWZ0IC09IGxlbihkYXRhKQorCisgICAgICAgICAgICBpZiBkYXRhIGFuZCBzZWxmLl9kZWNyeXB0ZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZGF0YSA9ICcnLmpvaW4obWFwKHNlbGYuX2RlY3J5cHRlciwgZGF0YSkpCisKKyAgICAgICAgICAgIGlmIHNlbGYuX2NvbXByZXNzX3R5cGUgPT0gWklQX1NUT1JFRDoKKyAgICAgICAgICAgICAgICBzZWxmLl91cGRhdGVfY3JjKGRhdGEsIGVvZj0oc2VsZi5fY29tcHJlc3NfbGVmdD09MCkpCisgICAgICAgICAgICAgICAgc2VsZi5fcmVhZGJ1ZmZlciA9IHNlbGYuX3JlYWRidWZmZXJbc2VsZi5fb2Zmc2V0Ol0gKyBkYXRhCisgICAgICAgICAgICAgICAgc2VsZi5fb2Zmc2V0ID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIFByZXBhcmUgZGVmbGF0ZWQgYnl0ZXMgZm9yIGRlY29tcHJlc3Npb24uCisgICAgICAgICAgICAgICAgc2VsZi5fdW5jb25zdW1lZCArPSBkYXRhCisKKyAgICAgICAgIyBIYW5kbGUgdW5jb25zdW1lZCBkYXRhLgorICAgICAgICBpZiAobGVuKHNlbGYuX3VuY29uc3VtZWQpID4gMCBhbmQgbiA+IGxlbl9yZWFkYnVmZmVyIGFuZAorICAgICAgICAgICAgc2VsZi5fY29tcHJlc3NfdHlwZSA9PSBaSVBfREVGTEFURUQpOgorICAgICAgICAgICAgZGF0YSA9IHNlbGYuX2RlY29tcHJlc3Nvci5kZWNvbXByZXNzKAorICAgICAgICAgICAgICAgIHNlbGYuX3VuY29uc3VtZWQsCisgICAgICAgICAgICAgICAgbWF4KG4gLSBsZW5fcmVhZGJ1ZmZlciwgc2VsZi5NSU5fUkVBRF9TSVpFKQorICAgICAgICAgICAgKQorCisgICAgICAgICAgICBzZWxmLl91bmNvbnN1bWVkID0gc2VsZi5fZGVjb21wcmVzc29yLnVuY29uc3VtZWRfdGFpbAorICAgICAgICAgICAgZW9mID0gbGVuKHNlbGYuX3VuY29uc3VtZWQpID09IDAgYW5kIHNlbGYuX2NvbXByZXNzX2xlZnQgPT0gMAorICAgICAgICAgICAgaWYgZW9mOgorICAgICAgICAgICAgICAgIGRhdGEgKz0gc2VsZi5fZGVjb21wcmVzc29yLmZsdXNoKCkKKworICAgICAgICAgICAgc2VsZi5fdXBkYXRlX2NyYyhkYXRhLCBlb2Y9ZW9mKQorICAgICAgICAgICAgc2VsZi5fcmVhZGJ1ZmZlciA9IHNlbGYuX3JlYWRidWZmZXJbc2VsZi5fb2Zmc2V0Ol0gKyBkYXRhCisgICAgICAgICAgICBzZWxmLl9vZmZzZXQgPSAwCisKKyAgICAgICAgIyBSZWFkIGZyb20gYnVmZmVyLgorICAgICAgICBkYXRhID0gc2VsZi5fcmVhZGJ1ZmZlcltzZWxmLl9vZmZzZXQ6IHNlbGYuX29mZnNldCArIG5dCisgICAgICAgIHNlbGYuX29mZnNldCArPSBsZW4oZGF0YSkKKyAgICAgICAgcmV0dXJuIGRhdGEKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgdHJ5IDoKKyAgICAgICAgICAgIGlmIHNlbGYuX2Nsb3NlX2ZpbGVvYmo6CisgICAgICAgICAgICAgICAgc2VsZi5fZmlsZW9iai5jbG9zZSgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzdXBlcihaaXBFeHRGaWxlLCBzZWxmKS5jbG9zZSgpCisKKworY2xhc3MgWmlwRmlsZShvYmplY3QpOgorICAgICIiIiBDbGFzcyB3aXRoIG1ldGhvZHMgdG8gb3BlbiwgcmVhZCwgd3JpdGUsIGNsb3NlLCBsaXN0IHppcCBmaWxlcy4KKworICAgIHogPSBaaXBGaWxlKGZpbGUsIG1vZGU9InIiLCBjb21wcmVzc2lvbj1aSVBfU1RPUkVELCBhbGxvd1ppcDY0PUZhbHNlKQorCisgICAgZmlsZTogRWl0aGVyIHRoZSBwYXRoIHRvIHRoZSBmaWxlLCBvciBhIGZpbGUtbGlrZSBvYmplY3QuCisgICAgICAgICAgSWYgaXQgaXMgYSBwYXRoLCB0aGUgZmlsZSB3aWxsIGJlIG9wZW5lZCBhbmQgY2xvc2VkIGJ5IFppcEZpbGUuCisgICAgbW9kZTogVGhlIG1vZGUgY2FuIGJlIGVpdGhlciByZWFkICJyIiwgd3JpdGUgInciIG9yIGFwcGVuZCAiYSIuCisgICAgY29tcHJlc3Npb246IFpJUF9TVE9SRUQgKG5vIGNvbXByZXNzaW9uKSBvciBaSVBfREVGTEFURUQgKHJlcXVpcmVzIHpsaWIpLgorICAgIGFsbG93WmlwNjQ6IGlmIFRydWUgWmlwRmlsZSB3aWxsIGNyZWF0ZSBmaWxlcyB3aXRoIFpJUDY0IGV4dGVuc2lvbnMgd2hlbgorICAgICAgICAgICAgICAgIG5lZWRlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhpcyB3b3VsZAorICAgICAgICAgICAgICAgIGJlIG5lY2Vzc2FyeS4KKworICAgICIiIgorCisgICAgZnAgPSBOb25lICAgICAgICAgICAgICAgICAgICMgU2V0IGhlcmUgc2luY2UgX19kZWxfXyBjaGVja3MgaXQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249WklQX1NUT1JFRCwgYWxsb3daaXA2ND1GYWxzZSk6CisgICAgICAgICIiIk9wZW4gdGhlIFpJUCBmaWxlIHdpdGggbW9kZSByZWFkICJyIiwgd3JpdGUgInciIG9yIGFwcGVuZCAiYSIuIiIiCisgICAgICAgIGlmIG1vZGUgbm90IGluICgiciIsICJ3IiwgImEiKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignWmlwRmlsZSgpIHJlcXVpcmVzIG1vZGUgInIiLCAidyIsIG9yICJhIicpCisKKyAgICAgICAgaWYgY29tcHJlc3Npb24gPT0gWklQX1NUT1JFRDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBjb21wcmVzc2lvbiA9PSBaSVBfREVGTEFURUQ6CisgICAgICAgICAgICBpZiBub3QgemxpYjoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsXAorICAgICAgICAgICAgICAgICAgICAgICJDb21wcmVzc2lvbiByZXF1aXJlcyB0aGUgKG1pc3NpbmcpIHpsaWIgbW9kdWxlIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiVGhhdCBjb21wcmVzc2lvbiBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCIKKworICAgICAgICBzZWxmLl9hbGxvd1ppcDY0ID0gYWxsb3daaXA2NAorICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBGYWxzZQorICAgICAgICBzZWxmLmRlYnVnID0gMCAgIyBMZXZlbCBvZiBwcmludGluZzogMCB0aHJvdWdoIDMKKyAgICAgICAgc2VsZi5OYW1lVG9JbmZvID0ge30gICAgIyBGaW5kIGZpbGUgaW5mbyBnaXZlbiBuYW1lCisgICAgICAgIHNlbGYuZmlsZWxpc3QgPSBbXSAgICAgICMgTGlzdCBvZiBaaXBJbmZvIGluc3RhbmNlcyBmb3IgYXJjaGl2ZQorICAgICAgICBzZWxmLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb24gICMgTWV0aG9kIG9mIGNvbXByZXNzaW9uCisgICAgICAgIHNlbGYubW9kZSA9IGtleSA9IG1vZGUucmVwbGFjZSgnYicsICcnKVswXQorICAgICAgICBzZWxmLnB3ZCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY29tbWVudCA9ICcnCisKKyAgICAgICAgIyBDaGVjayBpZiB3ZSB3ZXJlIHBhc3NlZCBhIGZpbGUtbGlrZSBvYmplY3QKKyAgICAgICAgaWYgaXNpbnN0YW5jZShmaWxlLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgIHNlbGYuX2ZpbGVQYXNzZWQgPSAwCisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZQorICAgICAgICAgICAgbW9kZURpY3QgPSB7J3InIDogJ3JiJywgJ3cnOiAnd2InLCAnYScgOiAncitiJ30KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLmZwID0gb3BlbihmaWxlLCBtb2RlRGljdFttb2RlXSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIGlmIG1vZGUgPT0gJ2EnOgorICAgICAgICAgICAgICAgICAgICBtb2RlID0ga2V5ID0gJ3cnCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAgPSBvcGVuKGZpbGUsIG1vZGVEaWN0W21vZGVdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9maWxlUGFzc2VkID0gMQorICAgICAgICAgICAgc2VsZi5mcCA9IGZpbGUKKyAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBnZXRhdHRyKGZpbGUsICduYW1lJywgTm9uZSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBrZXkgPT0gJ3InOgorICAgICAgICAgICAgICAgIHNlbGYuX1JlYWxHZXRDb250ZW50cygpCisgICAgICAgICAgICBlbGlmIGtleSA9PSAndyc6CisgICAgICAgICAgICAgICAgIyBzZXQgdGhlIG1vZGlmaWVkIGZsYWcgc28gY2VudHJhbCBkaXJlY3RvcnkgZ2V0cyB3cml0dGVuCisgICAgICAgICAgICAgICAgIyBldmVuIGlmIG5vIGZpbGVzIGFyZSBhZGRlZCB0byB0aGUgYXJjaGl2ZQorICAgICAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKKyAgICAgICAgICAgIGVsaWYga2V5ID09ICdhJzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICMgU2VlIGlmIGZpbGUgaXMgYSB6aXAgZmlsZQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9SZWFsR2V0Q29udGVudHMoKQorICAgICAgICAgICAgICAgICAgICAjIHNlZWsgdG8gc3RhcnQgb2YgZGlyZWN0b3J5IGFuZCBvdmVyd3JpdGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC5zZWVrKHNlbGYuc3RhcnRfZGlyLCAwKQorICAgICAgICAgICAgICAgIGV4Y2VwdCBCYWRaaXBmaWxlOgorICAgICAgICAgICAgICAgICAgICAjIGZpbGUgaXMgbm90IGEgemlwIGZpbGUsIGp1c3QgYXBwZW5kCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAuc2VlaygwLCAyKQorCisgICAgICAgICAgICAgICAgICAgICMgc2V0IHRoZSBtb2RpZmllZCBmbGFnIHNvIGNlbnRyYWwgZGlyZWN0b3J5IGdldHMgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICAjIGV2ZW4gaWYgbm8gZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBhcmNoaXZlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdNb2RlIG11c3QgYmUgInIiLCAidyIgb3IgImEiJykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZnAgPSBzZWxmLmZwCisgICAgICAgICAgICBzZWxmLmZwID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVQYXNzZWQ6CisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgcmFpc2UKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIF9SZWFsR2V0Q29udGVudHMoc2VsZik6CisgICAgICAgICIiIlJlYWQgaW4gdGhlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciB0aGUgWklQIGZpbGUuIiIiCisgICAgICAgIGZwID0gc2VsZi5mcAorICAgICAgICB0cnk6CisgICAgICAgICAgICBlbmRyZWMgPSBfRW5kUmVjRGF0YShmcCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJGaWxlIGlzIG5vdCBhIHppcCBmaWxlIikKKyAgICAgICAgaWYgbm90IGVuZHJlYzoKKyAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUsICJGaWxlIGlzIG5vdCBhIHppcCBmaWxlIgorICAgICAgICBpZiBzZWxmLmRlYnVnID4gMToKKyAgICAgICAgICAgIHByaW50IGVuZHJlYworICAgICAgICBzaXplX2NkID0gZW5kcmVjW19FQ0RfU0laRV0gICAgICAgICAgICAgIyBieXRlcyBpbiBjZW50cmFsIGRpcmVjdG9yeQorICAgICAgICBvZmZzZXRfY2QgPSBlbmRyZWNbX0VDRF9PRkZTRVRdICAgICAgICAgIyBvZmZzZXQgb2YgY2VudHJhbCBkaXJlY3RvcnkKKyAgICAgICAgc2VsZi5fY29tbWVudCA9IGVuZHJlY1tfRUNEX0NPTU1FTlRdICAgICMgYXJjaGl2ZSBjb21tZW50CisKKyAgICAgICAgIyAiY29uY2F0IiBpcyB6ZXJvLCB1bmxlc3MgemlwIHdhcyBjb25jYXRlbmF0ZWQgdG8gYW5vdGhlciBmaWxlCisgICAgICAgIGNvbmNhdCA9IGVuZHJlY1tfRUNEX0xPQ0FUSU9OXSAtIHNpemVfY2QgLSBvZmZzZXRfY2QKKyAgICAgICAgaWYgZW5kcmVjW19FQ0RfU0lHTkFUVVJFXSA9PSBzdHJpbmdFbmRBcmNoaXZlNjQ6CisgICAgICAgICAgICAjIElmIFppcDY0IGV4dGVuc2lvbiBzdHJ1Y3R1cmVzIGFyZSBwcmVzZW50LCBhY2NvdW50IGZvciB0aGVtCisgICAgICAgICAgICBjb25jYXQgLT0gKHNpemVFbmRDZW50RGlyNjQgKyBzaXplRW5kQ2VudERpcjY0TG9jYXRvcikKKworICAgICAgICBpZiBzZWxmLmRlYnVnID4gMjoKKyAgICAgICAgICAgIGluZmVycmVkID0gY29uY2F0ICsgb2Zmc2V0X2NkCisgICAgICAgICAgICBwcmludCAiZ2l2ZW4sIGluZmVycmVkLCBvZmZzZXQiLCBvZmZzZXRfY2QsIGluZmVycmVkLCBjb25jYXQKKyAgICAgICAgIyBzZWxmLnN0YXJ0X2RpcjogIFBvc2l0aW9uIG9mIHN0YXJ0IG9mIGNlbnRyYWwgZGlyZWN0b3J5CisgICAgICAgIHNlbGYuc3RhcnRfZGlyID0gb2Zmc2V0X2NkICsgY29uY2F0CisgICAgICAgIGZwLnNlZWsoc2VsZi5zdGFydF9kaXIsIDApCisgICAgICAgIGRhdGEgPSBmcC5yZWFkKHNpemVfY2QpCisgICAgICAgIGZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKGRhdGEpCisgICAgICAgIHRvdGFsID0gMAorICAgICAgICB3aGlsZSB0b3RhbCA8IHNpemVfY2Q6CisgICAgICAgICAgICBjZW50ZGlyID0gZnAucmVhZChzaXplQ2VudHJhbERpcikKKyAgICAgICAgICAgIGlmIGxlbihjZW50ZGlyKSAhPSBzaXplQ2VudHJhbERpcjoKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJUcnVuY2F0ZWQgY2VudHJhbCBkaXJlY3RvcnkiKQorICAgICAgICAgICAgY2VudGRpciA9IHN0cnVjdC51bnBhY2soc3RydWN0Q2VudHJhbERpciwgY2VudGRpcikKKyAgICAgICAgICAgIGlmIGNlbnRkaXJbX0NEX1NJR05BVFVSRV0gIT0gc3RyaW5nQ2VudHJhbERpcjoKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJCYWQgbWFnaWMgbnVtYmVyIGZvciBjZW50cmFsIGRpcmVjdG9yeSIpCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID4gMjoKKyAgICAgICAgICAgICAgICBwcmludCBjZW50ZGlyCisgICAgICAgICAgICBmaWxlbmFtZSA9IGZwLnJlYWQoY2VudGRpcltfQ0RfRklMRU5BTUVfTEVOR1RIXSkKKyAgICAgICAgICAgICMgQ3JlYXRlIFppcEluZm8gaW5zdGFuY2UgdG8gc3RvcmUgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgeCA9IFppcEluZm8oZmlsZW5hbWUpCisgICAgICAgICAgICB4LmV4dHJhID0gZnAucmVhZChjZW50ZGlyW19DRF9FWFRSQV9GSUVMRF9MRU5HVEhdKQorICAgICAgICAgICAgeC5jb21tZW50ID0gZnAucmVhZChjZW50ZGlyW19DRF9DT01NRU5UX0xFTkdUSF0pCisgICAgICAgICAgICB4LmhlYWRlcl9vZmZzZXQgPSBjZW50ZGlyW19DRF9MT0NBTF9IRUFERVJfT0ZGU0VUXQorICAgICAgICAgICAgKHguY3JlYXRlX3ZlcnNpb24sIHguY3JlYXRlX3N5c3RlbSwgeC5leHRyYWN0X3ZlcnNpb24sIHgucmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgeC5mbGFnX2JpdHMsIHguY29tcHJlc3NfdHlwZSwgdCwgZCwKKyAgICAgICAgICAgICAgICB4LkNSQywgeC5jb21wcmVzc19zaXplLCB4LmZpbGVfc2l6ZSkgPSBjZW50ZGlyWzE6MTJdCisgICAgICAgICAgICB4LnZvbHVtZSwgeC5pbnRlcm5hbF9hdHRyLCB4LmV4dGVybmFsX2F0dHIgPSBjZW50ZGlyWzE1OjE4XQorICAgICAgICAgICAgIyBDb252ZXJ0IGRhdGUvdGltZSBjb2RlIHRvICh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYykKKyAgICAgICAgICAgIHguX3Jhd190aW1lID0gdAorICAgICAgICAgICAgeC5kYXRlX3RpbWUgPSAoIChkPj45KSsxOTgwLCAoZD4+NSkmMHhGLCBkJjB4MUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdD4+MTEsICh0Pj41KSYweDNGLCAodCYweDFGKSAqIDIgKQorCisgICAgICAgICAgICB4Ll9kZWNvZGVFeHRyYSgpCisgICAgICAgICAgICB4LmhlYWRlcl9vZmZzZXQgPSB4LmhlYWRlcl9vZmZzZXQgKyBjb25jYXQKKyAgICAgICAgICAgIHguZmlsZW5hbWUgPSB4Ll9kZWNvZGVGaWxlbmFtZSgpCisgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh4KQorICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3guZmlsZW5hbWVdID0geAorCisgICAgICAgICAgICAjIHVwZGF0ZSB0b3RhbCBieXRlcyByZWFkIGZyb20gY2VudHJhbCBkaXJlY3RvcnkKKyAgICAgICAgICAgIHRvdGFsID0gKHRvdGFsICsgc2l6ZUNlbnRyYWxEaXIgKyBjZW50ZGlyW19DRF9GSUxFTkFNRV9MRU5HVEhdCisgICAgICAgICAgICAgICAgICAgICArIGNlbnRkaXJbX0NEX0VYVFJBX0ZJRUxEX0xFTkdUSF0KKyAgICAgICAgICAgICAgICAgICAgICsgY2VudGRpcltfQ0RfQ09NTUVOVF9MRU5HVEhdKQorCisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnID4gMjoKKyAgICAgICAgICAgICAgICBwcmludCAidG90YWwiLCB0b3RhbAorCisKKyAgICBkZWYgbmFtZWxpc3Qoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIGxpc3Qgb2YgZmlsZSBuYW1lcyBpbiB0aGUgYXJjaGl2ZS4iIiIKKyAgICAgICAgbCA9IFtdCisgICAgICAgIGZvciBkYXRhIGluIHNlbGYuZmlsZWxpc3Q6CisgICAgICAgICAgICBsLmFwcGVuZChkYXRhLmZpbGVuYW1lKQorICAgICAgICByZXR1cm4gbAorCisgICAgZGVmIGluZm9saXN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGNsYXNzIFppcEluZm8gaW5zdGFuY2VzIGZvciBmaWxlcyBpbiB0aGUKKyAgICAgICAgYXJjaGl2ZS4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZmlsZWxpc3QKKworICAgIGRlZiBwcmludGRpcihzZWxmKToKKyAgICAgICAgIiIiUHJpbnQgYSB0YWJsZSBvZiBjb250ZW50cyBmb3IgdGhlIHppcCBmaWxlLiIiIgorICAgICAgICBwcmludCAiJS00NnMgJTE5cyAlMTJzIiAlICgiRmlsZSBOYW1lIiwgIk1vZGlmaWVkICAgICIsICJTaXplIikKKyAgICAgICAgZm9yIHppbmZvIGluIHNlbGYuZmlsZWxpc3Q6CisgICAgICAgICAgICBkYXRlID0gIiVkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIgJSB6aW5mby5kYXRlX3RpbWVbOjZdCisgICAgICAgICAgICBwcmludCAiJS00NnMgJXMgJTEyZCIgJSAoemluZm8uZmlsZW5hbWUsIGRhdGUsIHppbmZvLmZpbGVfc2l6ZSkKKworICAgIGRlZiB0ZXN0emlwKHNlbGYpOgorICAgICAgICAiIiJSZWFkIGFsbCB0aGUgZmlsZXMgYW5kIGNoZWNrIHRoZSBDUkMuIiIiCisgICAgICAgIGNodW5rX3NpemUgPSAyICoqIDIwCisgICAgICAgIGZvciB6aW5mbyBpbiBzZWxmLmZpbGVsaXN0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgUmVhZCBieSBjaHVua3MsIHRvIGF2b2lkIGFuIE92ZXJmbG93RXJyb3Igb3IgYQorICAgICAgICAgICAgICAgICMgTWVtb3J5RXJyb3Igd2l0aCB2ZXJ5IGxhcmdlIGVtYmVkZGVkIGZpbGVzLgorICAgICAgICAgICAgICAgIHdpdGggc2VsZi5vcGVuKHppbmZvLmZpbGVuYW1lLCAiciIpIGFzIGY6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIGYucmVhZChjaHVua19zaXplKTogICAgICMgQ2hlY2sgQ1JDLTMyCisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQgQmFkWmlwZmlsZToKKyAgICAgICAgICAgICAgICByZXR1cm4gemluZm8uZmlsZW5hbWUKKworICAgIGRlZiBnZXRpbmZvKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGluc3RhbmNlIG9mIFppcEluZm8gZ2l2ZW4gJ25hbWUnLiIiIgorICAgICAgICBpbmZvID0gc2VsZi5OYW1lVG9JbmZvLmdldChuYW1lKQorICAgICAgICBpZiBpbmZvIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvcigKKyAgICAgICAgICAgICAgICAnVGhlcmUgaXMgbm8gaXRlbSBuYW1lZCAlciBpbiB0aGUgYXJjaGl2ZScgJSBuYW1lKQorCisgICAgICAgIHJldHVybiBpbmZvCisKKyAgICBkZWYgc2V0cGFzc3dvcmQoc2VsZiwgcHdkKToKKyAgICAgICAgIiIiU2V0IGRlZmF1bHQgcGFzc3dvcmQgZm9yIGVuY3J5cHRlZCBmaWxlcy4iIiIKKyAgICAgICAgc2VsZi5wd2QgPSBwd2QKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBjb21tZW50KHNlbGYpOgorICAgICAgICAiIiJUaGUgY29tbWVudCB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgWklQIGZpbGUuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl9jb21tZW50CisKKyAgICBAY29tbWVudC5zZXR0ZXIKKyAgICBkZWYgY29tbWVudChzZWxmLCBjb21tZW50KToKKyAgICAgICAgIyBjaGVjayBmb3IgdmFsaWQgY29tbWVudCBsZW5ndGgKKyAgICAgICAgaWYgbGVuKGNvbW1lbnQpID49IFpJUF9NQVhfQ09NTUVOVDoKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQoJ0FyY2hpdmUgY29tbWVudCBpcyB0b28gbG9uZzsgdHJ1bmNhdGluZyB0byAlZCBieXRlcycKKyAgICAgICAgICAgICAgICAgICAgICAgICUgWklQX01BWF9DT01NRU5UKQorICAgICAgICAgICAgY29tbWVudCA9IGNvbW1lbnRbOlpJUF9NQVhfQ09NTUVOVF0KKyAgICAgICAgc2VsZi5fY29tbWVudCA9IGNvbW1lbnQKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorCisgICAgZGVmIHJlYWQoc2VsZiwgbmFtZSwgcHdkPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gZmlsZSBieXRlcyAoYXMgYSBzdHJpbmcpIGZvciBuYW1lLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5vcGVuKG5hbWUsICJyIiwgcHdkKS5yZWFkKCkKKworICAgIGRlZiBvcGVuKHNlbGYsIG5hbWUsIG1vZGU9InIiLCBwd2Q9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiBmaWxlLWxpa2Ugb2JqZWN0IGZvciAnbmFtZScuIiIiCisgICAgICAgIGlmIG1vZGUgbm90IGluICgiciIsICJVIiwgInJVIik6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICdvcGVuKCkgcmVxdWlyZXMgbW9kZSAiciIsICJVIiwgb3IgInJVIicKKyAgICAgICAgaWYgbm90IHNlbGYuZnA6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFwKKyAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHJlYWQgWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiCisKKyAgICAgICAgIyBPbmx5IG9wZW4gYSBuZXcgZmlsZSBmb3IgaW5zdGFuY2VzIHdoZXJlIHdlIHdlcmUgbm90CisgICAgICAgICMgZ2l2ZW4gYSBmaWxlIG9iamVjdCBpbiB0aGUgY29uc3RydWN0b3IKKyAgICAgICAgaWYgc2VsZi5fZmlsZVBhc3NlZDoKKyAgICAgICAgICAgIHplZl9maWxlID0gc2VsZi5mcAorICAgICAgICAgICAgc2hvdWxkX2Nsb3NlID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHplZl9maWxlID0gb3BlbihzZWxmLmZpbGVuYW1lLCAncmInKQorICAgICAgICAgICAgc2hvdWxkX2Nsb3NlID0gVHJ1ZQorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgICMgTWFrZSBzdXJlIHdlIGhhdmUgYW4gaW5mbyBvYmplY3QKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UobmFtZSwgWmlwSW5mbyk6CisgICAgICAgICAgICAgICAgIyAnbmFtZScgaXMgYWxyZWFkeSBhbiBpbmZvIG9iamVjdAorICAgICAgICAgICAgICAgIHppbmZvID0gbmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIEdldCBpbmZvIG9iamVjdCBmb3IgbmFtZQorICAgICAgICAgICAgICAgIHppbmZvID0gc2VsZi5nZXRpbmZvKG5hbWUpCisKKyAgICAgICAgICAgIHplZl9maWxlLnNlZWsoemluZm8uaGVhZGVyX29mZnNldCwgMCkKKworICAgICAgICAgICAgIyBTa2lwIHRoZSBmaWxlIGhlYWRlcjoKKyAgICAgICAgICAgIGZoZWFkZXIgPSB6ZWZfZmlsZS5yZWFkKHNpemVGaWxlSGVhZGVyKQorICAgICAgICAgICAgaWYgbGVuKGZoZWFkZXIpICE9IHNpemVGaWxlSGVhZGVyOgorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUoIlRydW5jYXRlZCBmaWxlIGhlYWRlciIpCisgICAgICAgICAgICBmaGVhZGVyID0gc3RydWN0LnVucGFjayhzdHJ1Y3RGaWxlSGVhZGVyLCBmaGVhZGVyKQorICAgICAgICAgICAgaWYgZmhlYWRlcltfRkhfU0lHTkFUVVJFXSAhPSBzdHJpbmdGaWxlSGVhZGVyOgorICAgICAgICAgICAgICAgIHJhaXNlIEJhZFppcGZpbGUoIkJhZCBtYWdpYyBudW1iZXIgZm9yIGZpbGUgaGVhZGVyIikKKworICAgICAgICAgICAgZm5hbWUgPSB6ZWZfZmlsZS5yZWFkKGZoZWFkZXJbX0ZIX0ZJTEVOQU1FX0xFTkdUSF0pCisgICAgICAgICAgICBpZiBmaGVhZGVyW19GSF9FWFRSQV9GSUVMRF9MRU5HVEhdOgorICAgICAgICAgICAgICAgIHplZl9maWxlLnJlYWQoZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXSkKKworICAgICAgICAgICAgaWYgZm5hbWUgIT0gemluZm8ub3JpZ19maWxlbmFtZToKKyAgICAgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAnRmlsZSBuYW1lIGluIGRpcmVjdG9yeSAiJXMiIGFuZCBoZWFkZXIgIiVzIiBkaWZmZXIuJyAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5vcmlnX2ZpbGVuYW1lLCBmbmFtZSkKKworICAgICAgICAgICAgIyBjaGVjayBmb3IgZW5jcnlwdGVkIGZsYWcgJiBoYW5kbGUgcGFzc3dvcmQKKyAgICAgICAgICAgIGlzX2VuY3J5cHRlZCA9IHppbmZvLmZsYWdfYml0cyAmIDB4MQorICAgICAgICAgICAgemQgPSBOb25lCisgICAgICAgICAgICBpZiBpc19lbmNyeXB0ZWQ6CisgICAgICAgICAgICAgICAgaWYgbm90IHB3ZDoKKyAgICAgICAgICAgICAgICAgICAgcHdkID0gc2VsZi5wd2QKKyAgICAgICAgICAgICAgICBpZiBub3QgcHdkOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsICJGaWxlICVzIGlzIGVuY3J5cHRlZCwgIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAicGFzc3dvcmQgcmVxdWlyZWQgZm9yIGV4dHJhY3Rpb24iICUgbmFtZQorCisgICAgICAgICAgICAgICAgemQgPSBfWmlwRGVjcnlwdGVyKHB3ZCkKKyAgICAgICAgICAgICAgICAjIFRoZSBmaXJzdCAxMiBieXRlcyBpbiB0aGUgY3lwaGVyIHN0cmVhbSBpcyBhbiBlbmNyeXB0aW9uIGhlYWRlcgorICAgICAgICAgICAgICAgICMgIHVzZWQgdG8gc3RyZW5ndGhlbiB0aGUgYWxnb3JpdGhtLiBUaGUgZmlyc3QgMTEgYnl0ZXMgYXJlCisgICAgICAgICAgICAgICAgIyAgY29tcGxldGVseSByYW5kb20sIHdoaWxlIHRoZSAxMnRoIGNvbnRhaW5zIHRoZSBNU0Igb2YgdGhlIENSQywKKyAgICAgICAgICAgICAgICAjICBvciB0aGUgTVNCIG9mIHRoZSBmaWxlIHRpbWUgZGVwZW5kaW5nIG9uIHRoZSBoZWFkZXIgdHlwZQorICAgICAgICAgICAgICAgICMgIGFuZCBpcyB1c2VkIHRvIGNoZWNrIHRoZSBjb3JyZWN0bmVzcyBvZiB0aGUgcGFzc3dvcmQuCisgICAgICAgICAgICAgICAgYnl0ZXMgPSB6ZWZfZmlsZS5yZWFkKDEyKQorICAgICAgICAgICAgICAgIGggPSBtYXAoemQsIGJ5dGVzWzA6MTJdKQorICAgICAgICAgICAgICAgIGlmIHppbmZvLmZsYWdfYml0cyAmIDB4ODoKKyAgICAgICAgICAgICAgICAgICAgIyBjb21wYXJlIGFnYWluc3QgdGhlIGZpbGUgdHlwZSBmcm9tIGV4dGVuZGVkIGxvY2FsIGhlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYnl0ZSA9ICh6aW5mby5fcmF3X3RpbWUgPj4gOCkgJiAweGZmCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBjb21wYXJlIGFnYWluc3QgdGhlIENSQyBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tfYnl0ZSA9ICh6aW5mby5DUkMgPj4gMjQpICYgMHhmZgorICAgICAgICAgICAgICAgIGlmIG9yZChoWzExXSkgIT0gY2hlY2tfYnl0ZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJCYWQgcGFzc3dvcmQgZm9yIGZpbGUiLCBuYW1lKQorCisgICAgICAgICAgICByZXR1cm4gWmlwRXh0RmlsZSh6ZWZfZmlsZSwgbW9kZSwgemluZm8sIHpkLAorICAgICAgICAgICAgICAgICAgICBjbG9zZV9maWxlb2JqPXNob3VsZF9jbG9zZSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgaWYgc2hvdWxkX2Nsb3NlOgorICAgICAgICAgICAgICAgIHplZl9maWxlLmNsb3NlKCkKKyAgICAgICAgICAgIHJhaXNlCisKKyAgICBkZWYgZXh0cmFjdChzZWxmLCBtZW1iZXIsIHBhdGg9Tm9uZSwgcHdkPU5vbmUpOgorICAgICAgICAiIiJFeHRyYWN0IGEgbWVtYmVyIGZyb20gdGhlIGFyY2hpdmUgdG8gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCisgICAgICAgICAgIHVzaW5nIGl0cyBmdWxsIG5hbWUuIEl0cyBmaWxlIGluZm9ybWF0aW9uIGlzIGV4dHJhY3RlZCBhcyBhY2N1cmF0ZWx5CisgICAgICAgICAgIGFzIHBvc3NpYmxlLiBgbWVtYmVyJyBtYXkgYmUgYSBmaWxlbmFtZSBvciBhIFppcEluZm8gb2JqZWN0LiBZb3UgY2FuCisgICAgICAgICAgIHNwZWNpZnkgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IHVzaW5nIGBwYXRoJy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG1lbWJlciwgWmlwSW5mbyk6CisgICAgICAgICAgICBtZW1iZXIgPSBzZWxmLmdldGluZm8obWVtYmVyKQorCisgICAgICAgIGlmIHBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHBhdGggPSBvcy5nZXRjd2QoKQorCisgICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X21lbWJlcihtZW1iZXIsIHBhdGgsIHB3ZCkKKworICAgIGRlZiBleHRyYWN0YWxsKHNlbGYsIHBhdGg9Tm9uZSwgbWVtYmVycz1Ob25lLCBwd2Q9Tm9uZSk6CisgICAgICAgICIiIkV4dHJhY3QgYWxsIG1lbWJlcnMgZnJvbSB0aGUgYXJjaGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nCisgICAgICAgICAgIGRpcmVjdG9yeS4gYHBhdGgnIHNwZWNpZmllcyBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdG8gZXh0cmFjdCB0by4KKyAgICAgICAgICAgYG1lbWJlcnMnIGlzIG9wdGlvbmFsIGFuZCBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBsaXN0IHJldHVybmVkCisgICAgICAgICAgIGJ5IG5hbWVsaXN0KCkuCisgICAgICAgICIiIgorICAgICAgICBpZiBtZW1iZXJzIGlzIE5vbmU6CisgICAgICAgICAgICBtZW1iZXJzID0gc2VsZi5uYW1lbGlzdCgpCisKKyAgICAgICAgZm9yIHppcGluZm8gaW4gbWVtYmVyczoKKyAgICAgICAgICAgIHNlbGYuZXh0cmFjdCh6aXBpbmZvLCBwYXRoLCBwd2QpCisKKyAgICBkZWYgX2V4dHJhY3RfbWVtYmVyKHNlbGYsIG1lbWJlciwgdGFyZ2V0cGF0aCwgcHdkKToKKyAgICAgICAgIiIiRXh0cmFjdCB0aGUgWmlwSW5mbyBvYmplY3QgJ21lbWJlcicgdG8gYSBwaHlzaWNhbAorICAgICAgICAgICBmaWxlIG9uIHRoZSBwYXRoIHRhcmdldHBhdGguCisgICAgICAgICIiIgorICAgICAgICAjIGJ1aWxkIHRoZSBkZXN0aW5hdGlvbiBwYXRobmFtZSwgcmVwbGFjaW5nCisgICAgICAgICMgZm9yd2FyZCBzbGFzaGVzIHRvIHBsYXRmb3JtIHNwZWNpZmljIHNlcGFyYXRvcnMuCisgICAgICAgIGFyY25hbWUgPSBtZW1iZXIuZmlsZW5hbWUucmVwbGFjZSgnLycsIG9zLnBhdGguc2VwKQorCisgICAgICAgIGlmIG9zLnBhdGguYWx0c2VwOgorICAgICAgICAgICAgYXJjbmFtZSA9IGFyY25hbWUucmVwbGFjZShvcy5wYXRoLmFsdHNlcCwgb3MucGF0aC5zZXApCisgICAgICAgICMgaW50ZXJwcmV0IGFic29sdXRlIHBhdGhuYW1lIGFzIHJlbGF0aXZlLCByZW1vdmUgZHJpdmUgbGV0dGVyIG9yCisgICAgICAgICMgVU5DIHBhdGgsIHJlZHVuZGFudCBzZXBhcmF0b3JzLCAiLiIgYW5kICIuLiIgY29tcG9uZW50cy4KKyAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGguc3BsaXRkcml2ZShhcmNuYW1lKVsxXQorICAgICAgICBhcmNuYW1lID0gb3MucGF0aC5zZXAuam9pbih4IGZvciB4IGluIGFyY25hbWUuc3BsaXQob3MucGF0aC5zZXApCisgICAgICAgICAgICAgICAgICAgIGlmIHggbm90IGluICgnJywgb3MucGF0aC5jdXJkaXIsIG9zLnBhdGgucGFyZGlyKSkKKyAgICAgICAgaWYgb3MucGF0aC5zZXAgPT0gJ1xcJzoKKyAgICAgICAgICAgICMgZmlsdGVyIGlsbGVnYWwgY2hhcmFjdGVycyBvbiBXaW5kb3dzCisgICAgICAgICAgICBpbGxlZ2FsID0gJzo8PnwiPyonCisgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFyY25hbWUsIHVuaWNvZGUpOgorICAgICAgICAgICAgICAgIHRhYmxlID0ge29yZChjKTogb3JkKCdfJykgZm9yIGMgaW4gaWxsZWdhbH0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdGFibGUgPSBzdHJpbmcubWFrZXRyYW5zKGlsbGVnYWwsICdfJyAqIGxlbihpbGxlZ2FsKSkKKyAgICAgICAgICAgIGFyY25hbWUgPSBhcmNuYW1lLnRyYW5zbGF0ZSh0YWJsZSkKKyAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIGRvdHMKKyAgICAgICAgICAgIGFyY25hbWUgPSAoeC5yc3RyaXAoJy4nKSBmb3IgeCBpbiBhcmNuYW1lLnNwbGl0KG9zLnBhdGguc2VwKSkKKyAgICAgICAgICAgIGFyY25hbWUgPSBvcy5wYXRoLnNlcC5qb2luKHggZm9yIHggaW4gYXJjbmFtZSBpZiB4KQorCisgICAgICAgIHRhcmdldHBhdGggPSBvcy5wYXRoLmpvaW4odGFyZ2V0cGF0aCwgYXJjbmFtZSkKKyAgICAgICAgdGFyZ2V0cGF0aCA9IG9zLnBhdGgubm9ybXBhdGgodGFyZ2V0cGF0aCkKKworICAgICAgICAjIENyZWF0ZSBhbGwgdXBwZXIgZGlyZWN0b3JpZXMgaWYgbmVjZXNzYXJ5LgorICAgICAgICB1cHBlcmRpcnMgPSBvcy5wYXRoLmRpcm5hbWUodGFyZ2V0cGF0aCkKKyAgICAgICAgaWYgdXBwZXJkaXJzIGFuZCBub3Qgb3MucGF0aC5leGlzdHModXBwZXJkaXJzKToKKyAgICAgICAgICAgIG9zLm1ha2VkaXJzKHVwcGVyZGlycykKKworICAgICAgICBpZiBtZW1iZXIuZmlsZW5hbWVbLTFdID09ICcvJzoKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKHRhcmdldHBhdGgpOgorICAgICAgICAgICAgICAgIG9zLm1rZGlyKHRhcmdldHBhdGgpCisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0cGF0aAorCisgICAgICAgIHdpdGggc2VsZi5vcGVuKG1lbWJlciwgcHdkPXB3ZCkgYXMgc291cmNlLCBcCisgICAgICAgICAgICAgZmlsZSh0YXJnZXRwYXRoLCAid2IiKSBhcyB0YXJnZXQ6CisgICAgICAgICAgICBzaHV0aWwuY29weWZpbGVvYmooc291cmNlLCB0YXJnZXQpCisKKyAgICAgICAgcmV0dXJuIHRhcmdldHBhdGgKKworICAgIGRlZiBfd3JpdGVjaGVjayhzZWxmLCB6aW5mbyk6CisgICAgICAgICIiIkNoZWNrIGZvciBlcnJvcnMgYmVmb3JlIHdyaXRpbmcgYSBmaWxlIHRvIHRoZSBhcmNoaXZlLiIiIgorICAgICAgICBpZiB6aW5mby5maWxlbmFtZSBpbiBzZWxmLk5hbWVUb0luZm86CisgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOiAgICAgICMgV2FybmluZyBmb3IgZHVwbGljYXRlIG5hbWVzCisgICAgICAgICAgICAgICAgcHJpbnQgIkR1cGxpY2F0ZSBuYW1lOiIsIHppbmZvLmZpbGVuYW1lCisgICAgICAgIGlmIHNlbGYubW9kZSBub3QgaW4gKCJ3IiwgImEiKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgJ3dyaXRlKCkgcmVxdWlyZXMgbW9kZSAidyIgb3IgImEiJworICAgICAgICBpZiBub3Qgc2VsZi5mcDoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIkF0dGVtcHQgdG8gd3JpdGUgWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiCisgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgPT0gWklQX0RFRkxBVEVEIGFuZCBub3QgemxpYjoKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgIkNvbXByZXNzaW9uIHJlcXVpcmVzIHRoZSAobWlzc2luZykgemxpYiBtb2R1bGUiCisgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgbm90IGluIChaSVBfU1RPUkVELCBaSVBfREVGTEFURUQpOgorICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCisgICAgICAgICAgICAgICAgICAiVGhhdCBjb21wcmVzc2lvbiBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCIKKyAgICAgICAgaWYgemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fYWxsb3daaXA2NDoKKyAgICAgICAgICAgICAgICByYWlzZSBMYXJnZVppcEZpbGUoIkZpbGVzaXplIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucyIpCisgICAgICAgIGlmIHppbmZvLmhlYWRlcl9vZmZzZXQgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgorICAgICAgICAgICAgICAgIHJhaXNlIExhcmdlWmlwRmlsZSgiWmlwZmlsZSBzaXplIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucyIpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSwgY29tcHJlc3NfdHlwZT1Ob25lKToKKyAgICAgICAgIiIiUHV0IHRoZSBieXRlcyBmcm9tIGZpbGVuYW1lIGludG8gdGhlIGFyY2hpdmUgdW5kZXIgdGhlIG5hbWUKKyAgICAgICAgYXJjbmFtZS4iIiIKKyAgICAgICAgaWYgbm90IHNlbGYuZnA6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSB0byBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCisKKyAgICAgICAgc3QgPSBvcy5zdGF0KGZpbGVuYW1lKQorICAgICAgICBpc2RpciA9IHN0YXQuU19JU0RJUihzdC5zdF9tb2RlKQorICAgICAgICBtdGltZSA9IHRpbWUubG9jYWx0aW1lKHN0LnN0X210aW1lKQorICAgICAgICBkYXRlX3RpbWUgPSBtdGltZVswOjZdCisgICAgICAgICMgQ3JlYXRlIFppcEluZm8gaW5zdGFuY2UgdG8gc3RvcmUgZmlsZSBpbmZvcm1hdGlvbgorICAgICAgICBpZiBhcmNuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICBhcmNuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgYXJjbmFtZSA9IG9zLnBhdGgubm9ybXBhdGgob3MucGF0aC5zcGxpdGRyaXZlKGFyY25hbWUpWzFdKQorICAgICAgICB3aGlsZSBhcmNuYW1lWzBdIGluIChvcy5zZXAsIG9zLmFsdHNlcCk6CisgICAgICAgICAgICBhcmNuYW1lID0gYXJjbmFtZVsxOl0KKyAgICAgICAgaWYgaXNkaXI6CisgICAgICAgICAgICBhcmNuYW1lICs9ICcvJworICAgICAgICB6aW5mbyA9IFppcEluZm8oYXJjbmFtZSwgZGF0ZV90aW1lKQorICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gKHN0WzBdICYgMHhGRkZGKSA8PCAxNkwgICAgICAjIFVuaXggYXR0cmlidXRlcworICAgICAgICBpZiBjb21wcmVzc190eXBlIGlzIE5vbmU6CisgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKKworICAgICAgICB6aW5mby5maWxlX3NpemUgPSBzdC5zdF9zaXplCisgICAgICAgIHppbmZvLmZsYWdfYml0cyA9IDB4MDAKKyAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisKKyAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQorCisgICAgICAgIGlmIGlzZGlyOgorICAgICAgICAgICAgemluZm8uZmlsZV9zaXplID0gMAorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IDAKKyAgICAgICAgICAgIHppbmZvLkNSQyA9IDAKKyAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHppbmZvKQorICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3ppbmZvLmZpbGVuYW1lXSA9IHppbmZvCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoRmFsc2UpKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lLCAicmIiKSBhcyBmcDoKKyAgICAgICAgICAgICMgTXVzdCBvdmVyd3JpdGUgQ1JDIGFuZCBzaXplcyB3aXRoIGNvcnJlY3QgZGF0YSBsYXRlcgorICAgICAgICAgICAgemluZm8uQ1JDID0gQ1JDID0gMAorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgPSAwCisgICAgICAgICAgICAjIENvbXByZXNzZWQgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gdW5jb21wcmVzc2VkIHNpemUKKyAgICAgICAgICAgIHppcDY0ID0gc2VsZi5fYWxsb3daaXA2NCBhbmQgXAorICAgICAgICAgICAgICAgICAgICB6aW5mby5maWxlX3NpemUgKiAxLjA1ID4gWklQNjRfTElNSVQKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcih6aXA2NCkpCisgICAgICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlID09IFpJUF9ERUZMQVRFRDoKKyAgICAgICAgICAgICAgICBjbXByID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfREVGQVVMVF9DT01QUkVTU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgIHpsaWIuREVGTEFURUQsIC0xNSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgY21wciA9IE5vbmUKKyAgICAgICAgICAgIGZpbGVfc2l6ZSA9IDAKKyAgICAgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAgICAgYnVmID0gZnAucmVhZCgxMDI0ICogOCkKKyAgICAgICAgICAgICAgICBpZiBub3QgYnVmOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IGZpbGVfc2l6ZSArIGxlbihidWYpCisgICAgICAgICAgICAgICAgQ1JDID0gY3JjMzIoYnVmLCBDUkMpICYgMHhmZmZmZmZmZgorICAgICAgICAgICAgICAgIGlmIGNtcHI6CisgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IGNtcHIuY29tcHJlc3MoYnVmKQorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gY29tcHJlc3Nfc2l6ZSArIGxlbihidWYpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShidWYpCisgICAgICAgIGlmIGNtcHI6CisgICAgICAgICAgICBidWYgPSBjbXByLmZsdXNoKCkKKyAgICAgICAgICAgIGNvbXByZXNzX3NpemUgPSBjb21wcmVzc19zaXplICsgbGVuKGJ1ZikKKyAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoYnVmKQorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSBmaWxlX3NpemUKKyAgICAgICAgemluZm8uQ1JDID0gQ1JDCisgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IGZpbGVfc2l6ZQorICAgICAgICBpZiBub3QgemlwNjQgYW5kIHNlbGYuX2FsbG93WmlwNjQ6CisgICAgICAgICAgICBpZiBmaWxlX3NpemUgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ0ZpbGUgc2l6ZSBoYXMgaW5jcmVhc2VkIGR1cmluZyBjb21wcmVzc2luZycpCisgICAgICAgICAgICBpZiBjb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdDb21wcmVzc2VkIHNpemUgbGFyZ2VyIHRoYW4gdW5jb21wcmVzc2VkIHNpemUnKQorICAgICAgICAjIFNlZWsgYmFja3dhcmRzIGFuZCB3cml0ZSBmaWxlIGhlYWRlciAod2hpY2ggd2lsbCBub3cgaW5jbHVkZQorICAgICAgICAjIGNvcnJlY3QgQ1JDIGFuZCBmaWxlIHNpemVzKQorICAgICAgICBwb3NpdGlvbiA9IHNlbGYuZnAudGVsbCgpICAgICAgICMgUHJlc2VydmUgY3VycmVudCBwb3NpdGlvbiBpbiBmaWxlCisgICAgICAgIHNlbGYuZnAuc2Vlayh6aW5mby5oZWFkZXJfb2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoemlwNjQpKQorICAgICAgICBzZWxmLmZwLnNlZWsocG9zaXRpb24sIDApCisgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHppbmZvKQorICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KKworICAgIGRlZiB3cml0ZXN0cihzZWxmLCB6aW5mb19vcl9hcmNuYW1lLCBieXRlcywgY29tcHJlc3NfdHlwZT1Ob25lKToKKyAgICAgICAgIiIiV3JpdGUgYSBmaWxlIGludG8gdGhlIGFyY2hpdmUuICBUaGUgY29udGVudHMgaXMgdGhlIHN0cmluZworICAgICAgICAnYnl0ZXMnLiAgJ3ppbmZvX29yX2FyY25hbWUnIGlzIGVpdGhlciBhIFppcEluZm8gaW5zdGFuY2Ugb3IKKyAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpbGUgaW4gdGhlIGFyY2hpdmUuIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHppbmZvX29yX2FyY25hbWUsIFppcEluZm8pOgorICAgICAgICAgICAgemluZm8gPSBaaXBJbmZvKGZpbGVuYW1lPXppbmZvX29yX2FyY25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZV90aW1lPXRpbWUubG9jYWx0aW1lKHRpbWUudGltZSgpKVs6Nl0pCisKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBzZWxmLmNvbXByZXNzaW9uCisgICAgICAgICAgICB6aW5mby5leHRlcm5hbF9hdHRyID0gMDYwMCA8PCAxNgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemluZm8gPSB6aW5mb19vcl9hcmNuYW1lCisKKyAgICAgICAgaWYgbm90IHNlbGYuZnA6CisgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgICAgICAgICAiQXR0ZW1wdCB0byB3cml0ZSB0byBaSVAgYXJjaGl2ZSB0aGF0IHdhcyBhbHJlYWR5IGNsb3NlZCIpCisKKyAgICAgICAgaWYgY29tcHJlc3NfdHlwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3R5cGUgPSBjb21wcmVzc190eXBlCisKKyAgICAgICAgemluZm8uZmlsZV9zaXplID0gbGVuKGJ5dGVzKSAgICAgICAgICAgICMgVW5jb21wcmVzc2VkIHNpemUKKyAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCisgICAgICAgIHNlbGYuX3dyaXRlY2hlY2soemluZm8pCisgICAgICAgIHNlbGYuX2RpZE1vZGlmeSA9IFRydWUKKyAgICAgICAgemluZm8uQ1JDID0gY3JjMzIoYnl0ZXMpICYgMHhmZmZmZmZmZiAgICAgICAjIENSQy0zMiBjaGVja3N1bQorICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlID09IFpJUF9ERUZMQVRFRDoKKyAgICAgICAgICAgIGNvID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfREVGQVVMVF9DT01QUkVTU0lPTiwKKyAgICAgICAgICAgICAgICAgemxpYi5ERUZMQVRFRCwgLTE1KQorICAgICAgICAgICAgYnl0ZXMgPSBjby5jb21wcmVzcyhieXRlcykgKyBjby5mbHVzaCgpCisgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID0gbGVuKGJ5dGVzKSAgICAjIENvbXByZXNzZWQgc2l6ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IHppbmZvLmZpbGVfc2l6ZQorICAgICAgICB6aXA2NCA9IHppbmZvLmZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUIG9yIFwKKyAgICAgICAgICAgICAgICB6aW5mby5jb21wcmVzc19zaXplID4gWklQNjRfTElNSVQKKyAgICAgICAgaWYgemlwNjQgYW5kIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgorICAgICAgICAgICAgcmFpc2UgTGFyZ2VaaXBGaWxlKCJGaWxlc2l6ZSB3b3VsZCByZXF1aXJlIFpJUDY0IGV4dGVuc2lvbnMiKQorICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLkZpbGVIZWFkZXIoemlwNjQpKQorICAgICAgICBzZWxmLmZwLndyaXRlKGJ5dGVzKQorICAgICAgICBpZiB6aW5mby5mbGFnX2JpdHMgJiAweDA4OgorICAgICAgICAgICAgIyBXcml0ZSBDUkMgYW5kIGZpbGUgc2l6ZXMgYWZ0ZXIgdGhlIGZpbGUgZGF0YQorICAgICAgICAgICAgZm10ID0gJzxMUVEnIGlmIHppcDY0IGVsc2UgJzxMTEwnCisgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHN0cnVjdC5wYWNrKGZtdCwgemluZm8uQ1JDLCB6aW5mby5jb21wcmVzc19zaXplLAorICAgICAgICAgICAgICAgICAgemluZm8uZmlsZV9zaXplKSkKKyAgICAgICAgc2VsZi5mcC5mbHVzaCgpCisgICAgICAgIHNlbGYuZmlsZWxpc3QuYXBwZW5kKHppbmZvKQorICAgICAgICBzZWxmLk5hbWVUb0luZm9bemluZm8uZmlsZW5hbWVdID0gemluZm8KKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICAiIiJDYWxsIHRoZSAiY2xvc2UoKSIgbWV0aG9kIGluIGNhc2UgdGhlIHVzZXIgZm9yZ290LiIiIgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGZpbGUsIGFuZCBmb3IgbW9kZSAidyIgYW5kICJhIiB3cml0ZSB0aGUgZW5kaW5nCisgICAgICAgIHJlY29yZHMuIiIiCisgICAgICAgIGlmIHNlbGYuZnAgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIHNlbGYubW9kZSBpbiAoInciLCAiYSIpIGFuZCBzZWxmLl9kaWRNb2RpZnk6ICMgd3JpdGUgZW5kaW5nIHJlY29yZHMKKyAgICAgICAgICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgICAgICAgICBwb3MxID0gc2VsZi5mcC50ZWxsKCkKKyAgICAgICAgICAgICAgICBmb3IgemluZm8gaW4gc2VsZi5maWxlbGlzdDogICAgICAgICAjIHdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgICAgICAgICAgIGR0ID0gemluZm8uZGF0ZV90aW1lCisgICAgICAgICAgICAgICAgICAgIGRvc2RhdGUgPSAoZHRbMF0gLSAxOTgwKSA8PCA5IHwgZHRbMV0gPDwgNSB8IGR0WzJdCisgICAgICAgICAgICAgICAgICAgIGRvc3RpbWUgPSBkdFszXSA8PCAxMSB8IGR0WzRdIDw8IDUgfCAoZHRbNV0gLy8gMikKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBbXQorICAgICAgICAgICAgICAgICAgICBpZiB6aW5mby5maWxlX3NpemUgPiBaSVA2NF9MSU1JVCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgemluZm8uY29tcHJlc3Nfc2l6ZSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEuYXBwZW5kKHppbmZvLmZpbGVfc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5jb21wcmVzc19zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zaXplID0gMHhmZmZmZmZmZgorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IDB4ZmZmZmZmZmYKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2l6ZSA9IHppbmZvLmZpbGVfc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IHppbmZvLmNvbXByZXNzX3NpemUKKworICAgICAgICAgICAgICAgICAgICBpZiB6aW5mby5oZWFkZXJfb2Zmc2V0ID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5hcHBlbmQoemluZm8uaGVhZGVyX29mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQgPSAweGZmZmZmZmZmTAorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX29mZnNldCA9IHppbmZvLmhlYWRlcl9vZmZzZXQKKworICAgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhID0gemluZm8uZXh0cmEKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6CisgICAgICAgICAgICAgICAgICAgICAgICAjIEFwcGVuZCBhIFpJUDY0IGZpZWxkIHRvIHRoZSBleHRyYSdzCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9kYXRhID0gc3RydWN0LnBhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8SEgnICsgJ1EnKmxlbihleHRyYSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDgqbGVuKGV4dHJhKSwgKmV4dHJhKSArIGV4dHJhX2RhdGEKKworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdF92ZXJzaW9uID0gbWF4KDQ1LCB6aW5mby5leHRyYWN0X3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVfdmVyc2lvbiA9IG1heCg0NSwgemluZm8uY3JlYXRlX3ZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0X3ZlcnNpb24gPSB6aW5mby5leHRyYWN0X3ZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZV92ZXJzaW9uID0gemluZm8uY3JlYXRlX3ZlcnNpb24KKworICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgZmxhZ19iaXRzID0gemluZm8uX2VuY29kZUZpbGVuYW1lRmxhZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgY2VudGRpciA9IHN0cnVjdC5wYWNrKHN0cnVjdENlbnRyYWxEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdDZW50cmFsRGlyLCBjcmVhdGVfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLmNyZWF0ZV9zeXN0ZW0sIGV4dHJhY3RfdmVyc2lvbiwgemluZm8ucmVzZXJ2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX2JpdHMsIHppbmZvLmNvbXByZXNzX3R5cGUsIGRvc3RpbWUsIGRvc2RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5DUkMsIGNvbXByZXNzX3NpemUsIGZpbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbihmaWxlbmFtZSksIGxlbihleHRyYV9kYXRhKSwgbGVuKHppbmZvLmNvbW1lbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgemluZm8uaW50ZXJuYWxfYXR0ciwgemluZm8uZXh0ZXJuYWxfYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBEZXByZWNhdGlvbldhcm5pbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsIChzdHJ1Y3RDZW50cmFsRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nQ2VudHJhbERpciwgY3JlYXRlX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICB6aW5mby5jcmVhdGVfc3lzdGVtLCBleHRyYWN0X3ZlcnNpb24sIHppbmZvLnJlc2VydmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uZmxhZ19iaXRzLCB6aW5mby5jb21wcmVzc190eXBlLCBkb3N0aW1lLCBkb3NkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgemluZm8uQ1JDLCBjb21wcmVzc19zaXplLCBmaWxlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW4oemluZm8uZmlsZW5hbWUpLCBsZW4oZXh0cmFfZGF0YSksIGxlbih6aW5mby5jb21tZW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIHppbmZvLmludGVybmFsX2F0dHIsIHppbmZvLmV4dGVybmFsX2F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShjZW50ZGlyKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGV4dHJhX2RhdGEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uY29tbWVudCkKKworICAgICAgICAgICAgICAgIHBvczIgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgICAgICMgV3JpdGUgZW5kLW9mLXppcC1hcmNoaXZlIHJlY29yZAorICAgICAgICAgICAgICAgIGNlbnREaXJDb3VudCA9IGNvdW50CisgICAgICAgICAgICAgICAgY2VudERpclNpemUgPSBwb3MyIC0gcG9zMQorICAgICAgICAgICAgICAgIGNlbnREaXJPZmZzZXQgPSBwb3MxCisgICAgICAgICAgICAgICAgaWYgKGNlbnREaXJDb3VudCA+PSBaSVBfRklMRUNPVU5UX0xJTUlUIG9yCisgICAgICAgICAgICAgICAgICAgIGNlbnREaXJPZmZzZXQgPiBaSVA2NF9MSU1JVCBvcgorICAgICAgICAgICAgICAgICAgICBjZW50RGlyU2l6ZSA+IFpJUDY0X0xJTUlUKToKKyAgICAgICAgICAgICAgICAgICAgIyBOZWVkIHRvIHdyaXRlIHRoZSBaSVA2NCBlbmQtb2YtYXJjaGl2ZSByZWNvcmRzCisgICAgICAgICAgICAgICAgICAgIHppcDY0ZW5kcmVjID0gc3RydWN0LnBhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0RW5kQXJjaGl2ZTY0LCBzdHJpbmdFbmRBcmNoaXZlNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQsIDQ1LCA0NSwgMCwgMCwgY2VudERpckNvdW50LCBjZW50RGlyQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudERpclNpemUsIGNlbnREaXJPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemlwNjRlbmRyZWMpCisKKyAgICAgICAgICAgICAgICAgICAgemlwNjRsb2NyZWMgPSBzdHJ1Y3QucGFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RFbmRBcmNoaXZlNjRMb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ0VuZEFyY2hpdmU2NExvY2F0b3IsIDAsIHBvczIsIDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoemlwNjRsb2NyZWMpCisgICAgICAgICAgICAgICAgICAgIGNlbnREaXJDb3VudCA9IG1pbihjZW50RGlyQ291bnQsIDB4RkZGRikKKyAgICAgICAgICAgICAgICAgICAgY2VudERpclNpemUgPSBtaW4oY2VudERpclNpemUsIDB4RkZGRkZGRkYpCisgICAgICAgICAgICAgICAgICAgIGNlbnREaXJPZmZzZXQgPSBtaW4oY2VudERpck9mZnNldCwgMHhGRkZGRkZGRikKKworICAgICAgICAgICAgICAgIGVuZHJlYyA9IHN0cnVjdC5wYWNrKHN0cnVjdEVuZEFyY2hpdmUsIHN0cmluZ0VuZEFyY2hpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBjZW50RGlyQ291bnQsIGNlbnREaXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnREaXJTaXplLCBjZW50RGlyT2Zmc2V0LCBsZW4oc2VsZi5fY29tbWVudCkpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShlbmRyZWMpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzZWxmLl9jb21tZW50KQorICAgICAgICAgICAgICAgIHNlbGYuZnAuZmx1c2goKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAgPSBzZWxmLmZwCisgICAgICAgICAgICBzZWxmLmZwID0gTm9uZQorICAgICAgICAgICAgaWYgbm90IHNlbGYuX2ZpbGVQYXNzZWQ6CisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorCisKK2NsYXNzIFB5WmlwRmlsZShaaXBGaWxlKToKKyAgICAiIiJDbGFzcyB0byBjcmVhdGUgWklQIGFyY2hpdmVzIHdpdGggUHl0aG9uIGxpYnJhcnkgZmlsZXMgYW5kIHBhY2thZ2VzLiIiIgorCisgICAgZGVmIHdyaXRlcHkoc2VsZiwgcGF0aG5hbWUsIGJhc2VuYW1lID0gIiIpOgorICAgICAgICAiIiJBZGQgYWxsIGZpbGVzIGZyb20gInBhdGhuYW1lIiB0byB0aGUgWklQIGFyY2hpdmUuCisKKyAgICAgICAgSWYgcGF0aG5hbWUgaXMgYSBwYWNrYWdlIGRpcmVjdG9yeSwgc2VhcmNoIHRoZSBkaXJlY3RvcnkgYW5kCisgICAgICAgIGFsbCBwYWNrYWdlIHN1YmRpcmVjdG9yaWVzIHJlY3Vyc2l2ZWx5IGZvciBhbGwgKi5weSBhbmQgZW50ZXIKKyAgICAgICAgdGhlIG1vZHVsZXMgaW50byB0aGUgYXJjaGl2ZS4gIElmIHBhdGhuYW1lIGlzIGEgcGxhaW4KKyAgICAgICAgZGlyZWN0b3J5LCBsaXN0ZGlyICoucHkgYW5kIGVudGVyIGFsbCBtb2R1bGVzLiAgRWxzZSwgcGF0aG5hbWUKKyAgICAgICAgbXVzdCBiZSBhIFB5dGhvbiAqLnB5IGZpbGUgYW5kIHRoZSBtb2R1bGUgd2lsbCBiZSBwdXQgaW50byB0aGUKKyAgICAgICAgYXJjaGl2ZS4gIEFkZGVkIG1vZHVsZXMgYXJlIGFsd2F5cyBtb2R1bGUucHlvIG9yIG1vZHVsZS5weWMuCisgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgY29tcGlsZSB0aGUgbW9kdWxlLnB5IGludG8gbW9kdWxlLnB5YyBpZgorICAgICAgICBuZWNlc3NhcnkuCisgICAgICAgICIiIgorICAgICAgICBkaXIsIG5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGhuYW1lKQorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKHBhdGhuYW1lKToKKyAgICAgICAgICAgIGluaXRuYW1lID0gb3MucGF0aC5qb2luKHBhdGhuYW1lLCAiX19pbml0X18ucHkiKQorICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoaW5pdG5hbWUpOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBhIHBhY2thZ2UgZGlyZWN0b3J5LCBhZGQgaXQKKyAgICAgICAgICAgICAgICBpZiBiYXNlbmFtZToKKyAgICAgICAgICAgICAgICAgICAgYmFzZW5hbWUgPSAiJXMvJXMiICUgKGJhc2VuYW1lLCBuYW1lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJhc2VuYW1lID0gbmFtZQorICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJBZGRpbmcgcGFja2FnZSBpbiIsIHBhdGhuYW1lLCAiYXMiLCBiYXNlbmFtZQorICAgICAgICAgICAgICAgIGZuYW1lLCBhcmNuYW1lID0gc2VsZi5fZ2V0X2NvZGVuYW1lKGluaXRuYW1lWzA6LTNdLCBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiQWRkaW5nIiwgYXJjbmFtZQorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoZm5hbWUsIGFyY25hbWUpCisgICAgICAgICAgICAgICAgZGlybGlzdCA9IG9zLmxpc3RkaXIocGF0aG5hbWUpCisgICAgICAgICAgICAgICAgZGlybGlzdC5yZW1vdmUoIl9faW5pdF9fLnB5IikKKyAgICAgICAgICAgICAgICAjIEFkZCBhbGwgKi5weSBmaWxlcyBhbmQgcGFja2FnZSBzdWJkaXJlY3RvcmllcworICAgICAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBkaXJsaXN0OgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGhuYW1lLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgcm9vdCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihwYXRoLCAiX19pbml0X18ucHkiKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGlzIGlzIGEgcGFja2FnZSBkaXJlY3RvcnksIGFkZCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGVweShwYXRoLCBiYXNlbmFtZSkgICMgUmVjdXJzaXZlIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgZWxpZiBleHQgPT0gIi5weSI6CisgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgYXJjbmFtZSA9IHNlbGYuX2dldF9jb2RlbmFtZShwYXRoWzA6LTNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkFkZGluZyIsIGFyY25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoZm5hbWUsIGFyY25hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgVGhpcyBpcyBOT1QgYSBwYWNrYWdlIGRpcmVjdG9yeSwgYWRkIGl0cyBmaWxlcyBhdCB0b3AgbGV2ZWwKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRlYnVnOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiQWRkaW5nIGZpbGVzIGZyb20gZGlyZWN0b3J5IiwgcGF0aG5hbWUKKyAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihwYXRobmFtZSk6CisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aG5hbWUsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICByb290LCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBpZiBleHQgPT0gIi5weSI6CisgICAgICAgICAgICAgICAgICAgICAgICBmbmFtZSwgYXJjbmFtZSA9IHNlbGYuX2dldF9jb2RlbmFtZShwYXRoWzA6LTNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkFkZGluZyIsIGFyY25hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoZm5hbWUsIGFyY25hbWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBwYXRobmFtZVstMzpdICE9ICIucHkiOgorICAgICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgICAgICAgICAgICdGaWxlcyBhZGRlZCB3aXRoIHdyaXRlcHkoKSBtdXN0IGVuZCB3aXRoICIucHkiJworICAgICAgICAgICAgZm5hbWUsIGFyY25hbWUgPSBzZWxmLl9nZXRfY29kZW5hbWUocGF0aG5hbWVbMDotM10sIGJhc2VuYW1lKQorICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZzoKKyAgICAgICAgICAgICAgICBwcmludCAiQWRkaW5nIGZpbGUiLCBhcmNuYW1lCisgICAgICAgICAgICBzZWxmLndyaXRlKGZuYW1lLCBhcmNuYW1lKQorCisgICAgZGVmIF9nZXRfY29kZW5hbWUoc2VsZiwgcGF0aG5hbWUsIGJhc2VuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIChmaWxlbmFtZSwgYXJjaGl2ZW5hbWUpIGZvciB0aGUgcGF0aC4KKworICAgICAgICBHaXZlbiBhIG1vZHVsZSBuYW1lIHBhdGgsIHJldHVybiB0aGUgY29ycmVjdCBmaWxlIHBhdGggYW5kCisgICAgICAgIGFyY2hpdmUgbmFtZSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeS4gIEZvciBleGFtcGxlLCBnaXZlbgorICAgICAgICAvcHl0aG9uL2xpYi9zdHJpbmcsIHJldHVybiAoL3B5dGhvbi9saWIvc3RyaW5nLnB5Yywgc3RyaW5nKS4KKyAgICAgICAgIiIiCisgICAgICAgIGZpbGVfcHkgID0gcGF0aG5hbWUgKyAiLnB5IgorICAgICAgICBmaWxlX3B5YyA9IHBhdGhuYW1lICsgIi5weWMiCisgICAgICAgIGZpbGVfcHlvID0gcGF0aG5hbWUgKyAiLnB5byIKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZV9weW8pIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Muc3RhdChmaWxlX3B5bykuc3RfbXRpbWUgPj0gb3Muc3RhdChmaWxlX3B5KS5zdF9tdGltZToKKyAgICAgICAgICAgIGZuYW1lID0gZmlsZV9weW8gICAgIyBVc2UgLnB5byBmaWxlCisgICAgICAgIGVsaWYgbm90IG9zLnBhdGguaXNmaWxlKGZpbGVfcHljKSBvciBcCisgICAgICAgICAgICAgb3Muc3RhdChmaWxlX3B5Yykuc3RfbXRpbWUgPCBvcy5zdGF0KGZpbGVfcHkpLnN0X210aW1lOgorICAgICAgICAgICAgaW1wb3J0IHB5X2NvbXBpbGUKKyAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CisgICAgICAgICAgICAgICAgcHJpbnQgIkNvbXBpbGluZyIsIGZpbGVfcHkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBweV9jb21waWxlLmNvbXBpbGUoZmlsZV9weSwgZmlsZV9weWMsIE5vbmUsIFRydWUpCisgICAgICAgICAgICBleGNlcHQgcHlfY29tcGlsZS5QeUNvbXBpbGVFcnJvcixlcnI6CisgICAgICAgICAgICAgICAgcHJpbnQgZXJyLm1zZworICAgICAgICAgICAgZm5hbWUgPSBmaWxlX3B5YworICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm5hbWUgPSBmaWxlX3B5YworICAgICAgICBhcmNoaXZlbmFtZSA9IG9zLnBhdGguc3BsaXQoZm5hbWUpWzFdCisgICAgICAgIGlmIGJhc2VuYW1lOgorICAgICAgICAgICAgYXJjaGl2ZW5hbWUgPSAiJXMvJXMiICUgKGJhc2VuYW1lLCBhcmNoaXZlbmFtZSkKKyAgICAgICAgcmV0dXJuIChmbmFtZSwgYXJjaGl2ZW5hbWUpCisKKworZGVmIG1haW4oYXJncyA9IE5vbmUpOgorICAgIGltcG9ydCB0ZXh0d3JhcAorICAgIFVTQUdFPXRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgemlwZmlsZS5weSAtbCB6aXBmaWxlLnppcCAgICAgICAgIyBTaG93IGxpc3Rpbmcgb2YgYSB6aXBmaWxlCisgICAgICAgICAgICB6aXBmaWxlLnB5IC10IHppcGZpbGUuemlwICAgICAgICAjIFRlc3QgaWYgYSB6aXBmaWxlIGlzIHZhbGlkCisgICAgICAgICAgICB6aXBmaWxlLnB5IC1lIHppcGZpbGUuemlwIHRhcmdldCAjIEV4dHJhY3QgemlwZmlsZSBpbnRvIHRhcmdldCBkaXIKKyAgICAgICAgICAgIHppcGZpbGUucHkgLWMgemlwZmlsZS56aXAgc3JjIC4uLiAjIENyZWF0ZSB6aXBmaWxlIGZyb20gc291cmNlcworICAgICAgICAiIiIpCisgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisKKyAgICBpZiBub3QgYXJncyBvciBhcmdzWzBdIG5vdCBpbiAoJy1sJywgJy1jJywgJy1lJywgJy10Jyk6CisgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBpZiBhcmdzWzBdID09ICctbCc6CisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAyOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIHdpdGggWmlwRmlsZShhcmdzWzFdLCAncicpIGFzIHpmOgorICAgICAgICAgICAgemYucHJpbnRkaXIoKQorCisgICAgZWxpZiBhcmdzWzBdID09ICctdCc6CisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAyOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIHdpdGggWmlwRmlsZShhcmdzWzFdLCAncicpIGFzIHpmOgorICAgICAgICAgICAgYmFkZmlsZSA9IHpmLnRlc3R6aXAoKQorICAgICAgICBpZiBiYWRmaWxlOgorICAgICAgICAgICAgcHJpbnQoIlRoZSBmb2xsb3dpbmcgZW5jbG9zZWQgZmlsZSBpcyBjb3JydXB0ZWQ6IHshcn0iLmZvcm1hdChiYWRmaWxlKSkKKyAgICAgICAgcHJpbnQgIkRvbmUgdGVzdGluZyIKKworICAgIGVsaWYgYXJnc1swXSA9PSAnLWUnOgorICAgICAgICBpZiBsZW4oYXJncykgIT0gMzoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIHdpdGggWmlwRmlsZShhcmdzWzFdLCAncicpIGFzIHpmOgorICAgICAgICAgICAgb3V0ID0gYXJnc1syXQorICAgICAgICAgICAgZm9yIHBhdGggaW4gemYubmFtZWxpc3QoKToKKyAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoJy4vJyk6CisgICAgICAgICAgICAgICAgICAgIHRndCA9IG9zLnBhdGguam9pbihvdXQsIHBhdGhbMjpdKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHRndCA9IG9zLnBhdGguam9pbihvdXQsIHBhdGgpCisKKyAgICAgICAgICAgICAgICB0Z3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUodGd0KQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyh0Z3RkaXIpOgorICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyh0Z3RkaXIpCisgICAgICAgICAgICAgICAgd2l0aCBvcGVuKHRndCwgJ3diJykgYXMgZnA6CisgICAgICAgICAgICAgICAgICAgIGZwLndyaXRlKHpmLnJlYWQocGF0aCkpCisKKyAgICBlbGlmIGFyZ3NbMF0gPT0gJy1jJzoKKyAgICAgICAgaWYgbGVuKGFyZ3MpIDwgMzoKKyAgICAgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorCisgICAgICAgIGRlZiBhZGRUb1ppcCh6ZiwgcGF0aCwgemlwcGF0aCk6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgICAgICB6Zi53cml0ZShwYXRoLCB6aXBwYXRoLCBaSVBfREVGTEFURUQpCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgZm9yIG5tIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgICAgIGFkZFRvWmlwKHpmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihwYXRoLCBubSksIG9zLnBhdGguam9pbih6aXBwYXRoLCBubSkpCisgICAgICAgICAgICAjIGVsc2U6IGlnbm9yZQorCisgICAgICAgIHdpdGggWmlwRmlsZShhcmdzWzFdLCAndycsIGFsbG93WmlwNjQ9VHJ1ZSkgYXMgemY6CisgICAgICAgICAgICBmb3Igc3JjIGluIGFyZ3NbMjpdOgorICAgICAgICAgICAgICAgIGFkZFRvWmlwKHpmLCBzcmMsIG9zLnBhdGguYmFzZW5hbWUoc3JjKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvemlwZmlsZS5weWMgYi9saWIvcHl0aG9uMi43L3ppcGZpbGUucHljCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDA4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3ppcGZpbGUucHljCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2xpYi9weXRob24yLjcvemlwZmlsZS5weW8gYi9saWIvcHl0aG9uMi43L3ppcGZpbGUucHlvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNDA4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvcHl0aG9uMi43L3ppcGZpbGUucHlvCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NoYXJlL21hbi9tYW4xL3B5dGhvbi4xIGIvc2hhcmUvbWFuL21hbjEvcHl0aG9uLjEKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uODIyZDYyZgotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL21hbi9tYW4xL3B5dGhvbi4xCkBAIC0wLDAgKzEgQEAKK3B5dGhvbjIuMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NoYXJlL21hbi9tYW4xL3B5dGhvbjIuMSBiL3NoYXJlL21hbi9tYW4xL3B5dGhvbjIuMQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hZmM1Njg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvbWFuL21hbjEvcHl0aG9uMi4xCkBAIC0wLDAgKzEgQEAKK3B5dGhvbjIuNy4xClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hhcmUvbWFuL21hbjEvcHl0aG9uMi43LjEgYi9zaGFyZS9tYW4vbWFuMS9weXRob24yLjcuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWVkYmNhCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvbWFuL21hbjEvcHl0aG9uMi43LjEKQEAgLTAsMCArMSw0NzMgQEAKKy5USCBQWVRIT04gIjEiICIkRGF0ZSQiCisKKy5cIiBUbyB2aWV3IHRoaXMgZmlsZSB3aGlsZSBlZGl0aW5nLCBydW4gaXQgdGhyb3VnaCBncm9mZjoKKy5cIiAgIGdyb2ZmIC1UYXNjaWkgLW1hbiBweXRob24ubWFuIHwgbGVzcworCisuU0ggTkFNRQorcHl0aG9uIFwtIGFuIGludGVycHJldGVkLCBpbnRlcmFjdGl2ZSwgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5nIGxhbmd1YWdlCisuU0ggU1lOT1BTSVMKKy5CIHB5dGhvbgorWworLkIgXC1CCitdCitbCisuQiBcLWQKK10KK1sKKy5CIFwtRQorXQorWworLkIgXC1oCitdCitbCisuQiBcLWkKK10KK1sKKy5CIFwtbSAKKy5JIG1vZHVsZS1uYW1lCitdCisuYnIKKyAgICAgICBbCisuQiBcLU8KK10KK1sKKy5CIFwtT08KK10KK1sKKy5CIFwtUgorXQorWworLkIgLVEKKy5JIGFyZ3VtZW50CitdCitbCisuQiBcLXMKK10KK1sKKy5CIFwtUworXQorWworLkIgXC10CitdCitbCisuQiBcLXUKK10KKy5icgorICAgICAgIFsKKy5CIFwtdgorXQorWworLkIgXC1WCitdCitbCisuQiBcLVcKKy5JIGFyZ3VtZW50CitdCitbCisuQiBcLXgKK10KK1sKKy5CIFwtMworXQorWworLkIgXC0/CitdCisuYnIKKyAgICAgICBbCisuQiBcLWMKKy5JIGNvbW1hbmQKK3wKKy5JIHNjcmlwdAorfAorXC0KK10KK1sKKy5JIGFyZ3VtZW50cworXQorLlNIIERFU0NSSVBUSU9OCitQeXRob24gaXMgYW4gaW50ZXJwcmV0ZWQsIGludGVyYWN0aXZlLCBvYmplY3Qtb3JpZW50ZWQgcHJvZ3JhbW1pbmcKK2xhbmd1YWdlIHRoYXQgY29tYmluZXMgcmVtYXJrYWJsZSBwb3dlciB3aXRoIHZlcnkgY2xlYXIgc3ludGF4LgorRm9yIGFuIGludHJvZHVjdGlvbiB0byBwcm9ncmFtbWluZyBpbiBQeXRob24geW91IGFyZSByZWZlcnJlZCB0byB0aGUKK1B5dGhvbiBUdXRvcmlhbC4KK1RoZSBQeXRob24gTGlicmFyeSBSZWZlcmVuY2UgZG9jdW1lbnRzIGJ1aWx0LWluIGFuZCBzdGFuZGFyZCB0eXBlcywKK2NvbnN0YW50cywgZnVuY3Rpb25zIGFuZCBtb2R1bGVzLgorRmluYWxseSwgdGhlIFB5dGhvbiBSZWZlcmVuY2UgTWFudWFsIGRlc2NyaWJlcyB0aGUgc3ludGF4IGFuZAorc2VtYW50aWNzIG9mIHRoZSBjb3JlIGxhbmd1YWdlIGluIChwZXJoYXBzIHRvbykgbXVjaCBkZXRhaWwuCisoVGhlc2UgZG9jdW1lbnRzIG1heSBiZSBsb2NhdGVkIHZpYSB0aGUKKy5CICJJTlRFUk5FVCBSRVNPVVJDRVMiCitiZWxvdzsgdGhleSBtYXkgYmUgaW5zdGFsbGVkIG9uIHlvdXIgc3lzdGVtIGFzIHdlbGwuKQorLlBQCitQeXRob24ncyBiYXNpYyBwb3dlciBjYW4gYmUgZXh0ZW5kZWQgd2l0aCB5b3VyIG93biBtb2R1bGVzIHdyaXR0ZW4gaW4KK0Mgb3IgQysrLgorT24gbW9zdCBzeXN0ZW1zIHN1Y2ggbW9kdWxlcyBtYXkgYmUgZHluYW1pY2FsbHkgbG9hZGVkLgorUHl0aG9uIGlzIGFsc28gYWRhcHRhYmxlIGFzIGFuIGV4dGVuc2lvbiBsYW5ndWFnZSBmb3IgZXhpc3RpbmcKK2FwcGxpY2F0aW9ucy4KK1NlZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBmb3IgaGludHMuCisuUFAKK0RvY3VtZW50YXRpb24gZm9yIGluc3RhbGxlZCBQeXRob24gbW9kdWxlcyBhbmQgcGFja2FnZXMgY2FuIGJlIAordmlld2VkIGJ5IHJ1bm5pbmcgdGhlIAorLkIgcHlkb2MKK3Byb2dyYW0uICAKKy5TSCBDT01NQU5EIExJTkUgT1BUSU9OUworLlRQCisuQiBcLUIKK0Rvbid0IHdyaXRlCisuSSAucHlbY29dCitmaWxlcyBvbiBpbXBvcnQuIFNlZSBhbHNvIFBZVEhPTkRPTlRXUklURUJZVEVDT0RFLgorLlRQCisuQkkgIlwtYyAiIGNvbW1hbmQKK1NwZWNpZnkgdGhlIGNvbW1hbmQgdG8gZXhlY3V0ZSAoc2VlIG5leHQgc2VjdGlvbikuCitUaGlzIHRlcm1pbmF0ZXMgdGhlIG9wdGlvbiBsaXN0IChmb2xsb3dpbmcgb3B0aW9ucyBhcmUgcGFzc2VkIGFzCithcmd1bWVudHMgdG8gdGhlIGNvbW1hbmQpLgorLlRQCisuQiBcLWQKK1R1cm4gb24gcGFyc2VyIGRlYnVnZ2luZyBvdXRwdXQgKGZvciB3aXphcmRzIG9ubHksIGRlcGVuZGluZyBvbgorY29tcGlsYXRpb24gb3B0aW9ucykuCisuVFAKKy5CIFwtRQorSWdub3JlIGVudmlyb25tZW50IHZhcmlhYmxlcyBsaWtlIFBZVEhPTlBBVEggYW5kIFBZVEhPTkhPTUUgdGhhdCBtb2RpZnkKK3RoZSBiZWhhdmlvciBvZiB0aGUgaW50ZXJwcmV0ZXIuCisuVFAKKy5CIFwtaCAiLCAiIFwtPyAiLCAiXC1cLWhlbHAKK1ByaW50cyB0aGUgdXNhZ2UgZm9yIHRoZSBpbnRlcnByZXRlciBleGVjdXRhYmxlIGFuZCBleGl0cy4KKy5UUAorLkIgXC1pCitXaGVuIGEgc2NyaXB0IGlzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudCBvciB0aGUgXGZCXC1jXGZQIG9wdGlvbiBpcwordXNlZCwgZW50ZXIgaW50ZXJhY3RpdmUgbW9kZSBhZnRlciBleGVjdXRpbmcgdGhlIHNjcmlwdCBvciB0aGUKK2NvbW1hbmQuICBJdCBkb2VzIG5vdCByZWFkIHRoZSAkUFlUSE9OU1RBUlRVUCBmaWxlLiAgVGhpcyBjYW4gYmUKK3VzZWZ1bCB0byBpbnNwZWN0IGdsb2JhbCB2YXJpYWJsZXMgb3IgYSBzdGFjayB0cmFjZSB3aGVuIGEgc2NyaXB0CityYWlzZXMgYW4gZXhjZXB0aW9uLgorLlRQCisuQkkgIlwtbSAiIG1vZHVsZS1uYW1lCitTZWFyY2hlcyAKKy5JIHN5cy5wYXRoIAorZm9yIHRoZSBuYW1lZCBtb2R1bGUgYW5kIHJ1bnMgdGhlIGNvcnJlc3BvbmRpbmcgCisuSSAucHkgCitmaWxlIGFzIGEgc2NyaXB0LgorLlRQCisuQiBcLU8KK1R1cm4gb24gYmFzaWMgb3B0aW1pemF0aW9ucy4gIFRoaXMgY2hhbmdlcyB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uIGZvcgorY29tcGlsZWQgKGJ5dGVjb2RlKSBmaWxlcyBmcm9tCisuSSAucHljCit0byBcZkkucHlvXGZQLiAgR2l2ZW4gdHdpY2UsIGNhdXNlcyBkb2NzdHJpbmdzIHRvIGJlIGRpc2NhcmRlZC4KKy5UUAorLkIgXC1PTworRGlzY2FyZCBkb2NzdHJpbmdzIGluIGFkZGl0aW9uIHRvIHRoZSBcZkItT1xmUCBvcHRpbWl6YXRpb25zLgorLlRQCisuQiBcLVIKK1R1cm4gb24gImhhc2ggcmFuZG9taXphdGlvbiIsIHNvIHRoYXQgdGhlIGhhc2goKSB2YWx1ZXMgb2Ygc3RyLCBieXRlcyBhbmQKK2RhdGV0aW1lIG9iamVjdHMgYXJlICJzYWx0ZWQiIHdpdGggYW4gdW5wcmVkaWN0YWJsZSBwc2V1ZG8tcmFuZG9tIHZhbHVlLgorQWx0aG91Z2ggdGhleSByZW1haW4gY29uc3RhbnQgd2l0aGluIGFuIGluZGl2aWR1YWwgUHl0aG9uIHByb2Nlc3MsIHRoZXkgYXJlCitub3QgcHJlZGljdGFibGUgYmV0d2VlbiByZXBlYXRlZCBpbnZvY2F0aW9ucyBvZiBQeXRob24uCisuSVAKK1RoaXMgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBwcm90ZWN0aW9uIGFnYWluc3QgYSBkZW5pYWwgb2Ygc2VydmljZQorY2F1c2VkIGJ5IGNhcmVmdWxseS1jaG9zZW4gaW5wdXRzIHRoYXQgZXhwbG9pdCB0aGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZQorb2YgYSBkaWN0IGNvbnN0cnVjdGlvbiwgTyhuXjIpIGNvbXBsZXhpdHkuICBTZWUKK2h0dHA6Ly93d3cub2NlcnQub3JnL2Fkdmlzb3JpZXMvb2NlcnQtMjAxMS0wMDMuaHRtbAorZm9yIGRldGFpbHMuCisuVFAKKy5CSSAiXC1RICIgYXJndW1lbnQKK0RpdmlzaW9uIGNvbnRyb2w7IHNlZSBQRVAgMjM4LiAgVGhlIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mICJvbGQiICh0aGUKK2RlZmF1bHQsIGludC9pbnQgYW5kIGxvbmcvbG9uZyByZXR1cm4gYW4gaW50IG9yIGxvbmcpLCAibmV3IiAobmV3CitkaXZpc2lvbiBzZW1hbnRpY3MsIGkuZS4gaW50L2ludCBhbmQgbG9uZy9sb25nIHJldHVybnMgYSBmbG9hdCksCisid2FybiIgKG9sZCBkaXZpc2lvbiBzZW1hbnRpY3Mgd2l0aCBhIHdhcm5pbmcgZm9yIGludC9pbnQgYW5kCitsb25nL2xvbmcpLCBvciAid2FybmFsbCIgKG9sZCBkaXZpc2lvbiBzZW1hbnRpY3Mgd2l0aCBhIHdhcm5pbmcgZm9yCithbGwgdXNlIG9mIHRoZSBkaXZpc2lvbiBvcGVyYXRvcikuICBGb3IgYSB1c2Ugb2YgIndhcm5hbGwiLCBzZWUgdGhlCitUb29scy9zY3JpcHRzL2ZpeGRpdi5weSBzY3JpcHQuCisuVFAKKy5CIFwtcworRG9uJ3QgYWRkIHVzZXIgc2l0ZSBkaXJlY3RvcnkgdG8gc3lzLnBhdGguCisuVFAKKy5CIFwtUworRGlzYWJsZSB0aGUgaW1wb3J0IG9mIHRoZSBtb2R1bGUKKy5JIHNpdGUKK2FuZCB0aGUgc2l0ZS1kZXBlbmRlbnQgbWFuaXB1bGF0aW9ucyBvZgorLkkgc3lzLnBhdGgKK3RoYXQgaXQgZW50YWlscy4KKy5UUAorLkIgXC10CitJc3N1ZSBhIHdhcm5pbmcgd2hlbiBhIHNvdXJjZSBmaWxlIG1peGVzIHRhYnMgYW5kIHNwYWNlcyBmb3IKK2luZGVudGF0aW9uIGluIGEgd2F5IHRoYXQgbWFrZXMgaXQgZGVwZW5kIG9uIHRoZSB3b3J0aCBvZiBhIHRhYgorZXhwcmVzc2VkIGluIHNwYWNlcy4gIElzc3VlIGFuIGVycm9yIHdoZW4gdGhlIG9wdGlvbiBpcyBnaXZlbiB0d2ljZS4KKy5UUAorLkIgXC11CitGb3JjZSBzdGRpbiwgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gYmUgdG90YWxseSB1bmJ1ZmZlcmVkLiAgT24gc3lzdGVtcword2hlcmUgaXQgbWF0dGVycywgYWxzbyBwdXQgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyIGluIGJpbmFyeSBtb2RlLgorTm90ZSB0aGF0IHRoZXJlIGlzIGludGVybmFsIGJ1ZmZlcmluZyBpbiB4cmVhZGxpbmVzKCksIHJlYWRsaW5lcygpIGFuZAorZmlsZS1vYmplY3QgaXRlcmF0b3JzICgiZm9yIGxpbmUgaW4gc3lzLnN0ZGluIikgd2hpY2ggaXMgbm90CitpbmZsdWVuY2VkIGJ5IHRoaXMgb3B0aW9uLiAgVG8gd29yayBhcm91bmQgdGhpcywgeW91IHdpbGwgd2FudCB0byB1c2UKKyJzeXMuc3RkaW4ucmVhZGxpbmUoKSIgaW5zaWRlIGEgIndoaWxlIDE6IiBsb29wLgorLlRQCisuQiBcLXYKK1ByaW50IGEgbWVzc2FnZSBlYWNoIHRpbWUgYSBtb2R1bGUgaXMgaW5pdGlhbGl6ZWQsIHNob3dpbmcgdGhlIHBsYWNlCisoZmlsZW5hbWUgb3IgYnVpbHQtaW4gbW9kdWxlKSBmcm9tIHdoaWNoIGl0IGlzIGxvYWRlZC4gIFdoZW4gZ2l2ZW4KK3R3aWNlLCBwcmludCBhIG1lc3NhZ2UgZm9yIGVhY2ggZmlsZSB0aGF0IGlzIGNoZWNrZWQgZm9yIHdoZW4gCitzZWFyY2hpbmcgZm9yIGEgbW9kdWxlLiAgQWxzbyBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBtb2R1bGUgY2xlYW51cAorYXQgZXhpdC4KKy5UUAorLkIgXC1WICIsICIgXC1cLXZlcnNpb24KK1ByaW50cyB0aGUgUHl0aG9uIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBleGVjdXRhYmxlIGFuZCBleGl0cy4KKy5UUAorLkJJICJcLVcgIiBhcmd1bWVudAorV2FybmluZyBjb250cm9sLiAgUHl0aG9uIHNvbWV0aW1lcyBwcmludHMgd2FybmluZyBtZXNzYWdlIHRvCisuSVIgc3lzLnN0ZGVyciAuCitBIHR5cGljYWwgd2FybmluZyBtZXNzYWdlIGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CisuSUIgZmlsZSAiOiIgbGluZSAiOiAiIGNhdGVnb3J5ICI6ICIgbWVzc2FnZS4KK0J5IGRlZmF1bHQsIGVhY2ggd2FybmluZyBpcyBwcmludGVkIG9uY2UgZm9yIGVhY2ggc291cmNlIGxpbmUgd2hlcmUgaXQKK29jY3Vycy4gIFRoaXMgb3B0aW9uIGNvbnRyb2xzIGhvdyBvZnRlbiB3YXJuaW5ncyBhcmUgcHJpbnRlZC4KK011bHRpcGxlCisuQiBcLVcKK29wdGlvbnMgbWF5IGJlIGdpdmVuOyB3aGVuIGEgd2FybmluZyBtYXRjaGVzIG1vcmUgdGhhbiBvbmUKK29wdGlvbiwgdGhlIGFjdGlvbiBmb3IgdGhlIGxhc3QgbWF0Y2hpbmcgb3B0aW9uIGlzIHBlcmZvcm1lZC4KK0ludmFsaWQKKy5CIFwtVworb3B0aW9ucyBhcmUgaWdub3JlZCAoYSB3YXJuaW5nIG1lc3NhZ2UgaXMgcHJpbnRlZCBhYm91dCBpbnZhbGlkCitvcHRpb25zIHdoZW4gdGhlIGZpcnN0IHdhcm5pbmcgaXMgaXNzdWVkKS4gIFdhcm5pbmdzIGNhbiBhbHNvIGJlCitjb250cm9sbGVkIGZyb20gd2l0aGluIGEgUHl0aG9uIHByb2dyYW0gdXNpbmcgdGhlCisuSSB3YXJuaW5ncworbW9kdWxlLgorCitUaGUgc2ltcGxlc3QgZm9ybSBvZgorLkkgYXJndW1lbnQKK2lzIG9uZSBvZiB0aGUgZm9sbG93aW5nCisuSSBhY3Rpb24KK3N0cmluZ3MgKG9yIGEgdW5pcXVlIGFiYnJldmlhdGlvbik6CisuQiBpZ25vcmUKK3RvIGlnbm9yZSBhbGwgd2FybmluZ3M7CisuQiBkZWZhdWx0Cit0byBleHBsaWNpdGx5IHJlcXVlc3QgdGhlIGRlZmF1bHQgYmVoYXZpb3IgKHByaW50aW5nIGVhY2ggd2FybmluZyBvbmNlCitwZXIgc291cmNlIGxpbmUpOworLkIgYWxsCit0byBwcmludCBhIHdhcm5pbmcgZWFjaCB0aW1lIGl0IG9jY3VycyAodGhpcyBtYXkgZ2VuZXJhdGUgbWFueQorbWVzc2FnZXMgaWYgYSB3YXJuaW5nIGlzIHRyaWdnZXJlZCByZXBlYXRlZGx5IGZvciB0aGUgc2FtZSBzb3VyY2UKK2xpbmUsIHN1Y2ggYXMgaW5zaWRlIGEgbG9vcCk7CisuQiBtb2R1bGUKK3RvIHByaW50IGVhY2ggd2FybmluZyBvbmx5IHRoZSBmaXJzdCB0aW1lIGl0IG9jY3VycyBpbiBlYWNoCittb2R1bGU7CisuQiBvbmNlCit0byBwcmludCBlYWNoIHdhcm5pbmcgb25seSB0aGUgZmlyc3QgdGltZSBpdCBvY2N1cnMgaW4gdGhlIHByb2dyYW07IG9yCisuQiBlcnJvcgordG8gcmFpc2UgYW4gZXhjZXB0aW9uIGluc3RlYWQgb2YgcHJpbnRpbmcgYSB3YXJuaW5nIG1lc3NhZ2UuCisKK1RoZSBmdWxsIGZvcm0gb2YKKy5JIGFyZ3VtZW50CitpcworLklCIGFjdGlvbiA6IG1lc3NhZ2UgOiBjYXRlZ29yeSA6IG1vZHVsZSA6IGxpbmUuCitIZXJlLAorLkkgYWN0aW9uCitpcyBhcyBleHBsYWluZWQgYWJvdmUgYnV0IG9ubHkgYXBwbGllcyB0byBtZXNzYWdlcyB0aGF0IG1hdGNoIHRoZQorcmVtYWluaW5nIGZpZWxkcy4gIEVtcHR5IGZpZWxkcyBtYXRjaCBhbGwgdmFsdWVzOyB0cmFpbGluZyBlbXB0eQorZmllbGRzIG1heSBiZSBvbWl0dGVkLiAgVGhlCisuSSBtZXNzYWdlCitmaWVsZCBtYXRjaGVzIHRoZSBzdGFydCBvZiB0aGUgd2FybmluZyBtZXNzYWdlIHByaW50ZWQ7IHRoaXMgbWF0Y2ggaXMKK2Nhc2UtaW5zZW5zaXRpdmUuICBUaGUKKy5JIGNhdGVnb3J5CitmaWVsZCBtYXRjaGVzIHRoZSB3YXJuaW5nIGNhdGVnb3J5LiAgVGhpcyBtdXN0IGJlIGEgY2xhc3MgbmFtZTsgdGhlCittYXRjaCB0ZXN0IHdoZXRoZXIgdGhlIGFjdHVhbCB3YXJuaW5nIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlIGlzIGEKK3N1YmNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgd2FybmluZyBjYXRlZ29yeS4gIFRoZSBmdWxsIGNsYXNzIG5hbWUgbXVzdAorYmUgZ2l2ZW4uICBUaGUKKy5JIG1vZHVsZQorZmllbGQgbWF0Y2hlcyB0aGUgKGZ1bGx5LXF1YWxpZmllZCkgbW9kdWxlIG5hbWU7IHRoaXMgbWF0Y2ggaXMKK2Nhc2Utc2Vuc2l0aXZlLiAgVGhlCisuSSBsaW5lCitmaWVsZCBtYXRjaGVzIHRoZSBsaW5lIG51bWJlciwgd2hlcmUgemVybyBtYXRjaGVzIGFsbCBsaW5lIG51bWJlcnMgYW5kCitpcyB0aHVzIGVxdWl2YWxlbnQgdG8gYW4gb21pdHRlZCBsaW5lIG51bWJlci4KKy5UUAorLkIgXC14CitTa2lwIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBzb3VyY2UuICBUaGlzIGlzIGludGVuZGVkIGZvciBhIERPUworc3BlY2lmaWMgaGFjayBvbmx5LiAgV2FybmluZzogdGhlIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyB3aWxsCitiZSBvZmYgYnkgb25lIQorLlRQCisuQiBcLTMKK1dhcm4gYWJvdXQgUHl0aG9uIDMueCBpbmNvbXBhdGliaWxpdGllcyB0aGF0IDJ0bzMgY2Fubm90IHRyaXZpYWxseSBmaXguCisuU0ggSU5URVJQUkVURVIgSU5URVJGQUNFCitUaGUgaW50ZXJwcmV0ZXIgaW50ZXJmYWNlIHJlc2VtYmxlcyB0aGF0IG9mIHRoZSBVTklYIHNoZWxsOiB3aGVuCitjYWxsZWQgd2l0aCBzdGFuZGFyZCBpbnB1dCBjb25uZWN0ZWQgdG8gYSB0dHkgZGV2aWNlLCBpdCBwcm9tcHRzIGZvcgorY29tbWFuZHMgYW5kIGV4ZWN1dGVzIHRoZW0gdW50aWwgYW4gRU9GIGlzIHJlYWQ7IHdoZW4gY2FsbGVkIHdpdGggYQorZmlsZSBuYW1lIGFyZ3VtZW50IG9yIHdpdGggYSBmaWxlIGFzIHN0YW5kYXJkIGlucHV0LCBpdCByZWFkcyBhbmQKK2V4ZWN1dGVzIGEKKy5JIHNjcmlwdAorZnJvbSB0aGF0IGZpbGU7Cit3aGVuIGNhbGxlZCB3aXRoCisuQiBcLWMKKy5JIGNvbW1hbmQsCitpdCBleGVjdXRlcyB0aGUgUHl0aG9uIHN0YXRlbWVudChzKSBnaXZlbiBhcworLkkgY29tbWFuZC4KK0hlcmUKKy5JIGNvbW1hbmQKK21heSBjb250YWluIG11bHRpcGxlIHN0YXRlbWVudHMgc2VwYXJhdGVkIGJ5IG5ld2xpbmVzLgorTGVhZGluZyB3aGl0ZXNwYWNlIGlzIHNpZ25pZmljYW50IGluIFB5dGhvbiBzdGF0ZW1lbnRzIQorSW4gbm9uLWludGVyYWN0aXZlIG1vZGUsIHRoZSBlbnRpcmUgaW5wdXQgaXMgcGFyc2VkIGJlZm9yZSBpdCBpcworZXhlY3V0ZWQuCisuUFAKK0lmIGF2YWlsYWJsZSwgdGhlIHNjcmlwdCBuYW1lIGFuZCBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGVyZWFmdGVyIGFyZQorcGFzc2VkIHRvIHRoZSBzY3JpcHQgaW4gdGhlIFB5dGhvbiB2YXJpYWJsZQorLkkgc3lzLmFyZ3YgLAord2hpY2ggaXMgYSBsaXN0IG9mIHN0cmluZ3MgKHlvdSBtdXN0IGZpcnN0CisuSSBpbXBvcnQgc3lzCit0byBiZSBhYmxlIHRvIGFjY2VzcyBpdCkuCitJZiBubyBzY3JpcHQgbmFtZSBpcyBnaXZlbiwKKy5JIHN5cy5hcmd2WzBdCitpcyBhbiBlbXB0eSBzdHJpbmc7IGlmCisuQiBcLWMKK2lzIHVzZWQsCisuSSBzeXMuYXJndlswXQorY29udGFpbnMgdGhlIHN0cmluZworLkkgJy1jJy4KK05vdGUgdGhhdCBvcHRpb25zIGludGVycHJldGVkIGJ5IHRoZSBQeXRob24gaW50ZXJwcmV0ZXIgaXRzZWxmCithcmUgbm90IHBsYWNlZCBpbgorLkkgc3lzLmFyZ3YuCisuUFAKK0luIGludGVyYWN0aXZlIG1vZGUsIHRoZSBwcmltYXJ5IHByb21wdCBpcyBgPj4+JzsgdGhlIHNlY29uZCBwcm9tcHQKKyh3aGljaCBhcHBlYXJzIHdoZW4gYSBjb21tYW5kIGlzIG5vdCBjb21wbGV0ZSkgaXMgYC4uLicuCitUaGUgcHJvbXB0cyBjYW4gYmUgY2hhbmdlZCBieSBhc3NpZ25tZW50IHRvCisuSSBzeXMucHMxCitvcgorLkkgc3lzLnBzMi4KK1RoZSBpbnRlcnByZXRlciBxdWl0cyB3aGVuIGl0IHJlYWRzIGFuIEVPRiBhdCBhIHByb21wdC4KK1doZW4gYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBvY2N1cnMsIGEgc3RhY2sgdHJhY2UgaXMgcHJpbnRlZCBhbmQKK2NvbnRyb2wgcmV0dXJucyB0byB0aGUgcHJpbWFyeSBwcm9tcHQ7IGluIG5vbi1pbnRlcmFjdGl2ZSBtb2RlLCB0aGUKK2ludGVycHJldGVyIGV4aXRzIGFmdGVyIHByaW50aW5nIHRoZSBzdGFjayB0cmFjZS4KK1RoZSBpbnRlcnJ1cHQgc2lnbmFsIHJhaXNlcyB0aGUKKy5JIEtleWJvYXJkXCVJbnRlcnJ1cHQKK2V4Y2VwdGlvbjsgb3RoZXIgVU5JWCBzaWduYWxzIGFyZSBub3QgY2F1Z2h0IChleGNlcHQgdGhhdCBTSUdQSVBFIGlzCitzb21ldGltZXMgaWdub3JlZCwgaW4gZmF2b3Igb2YgdGhlCisuSSBJT0Vycm9yCitleGNlcHRpb24pLiAgRXJyb3IgbWVzc2FnZXMgYXJlIHdyaXR0ZW4gdG8gc3RkZXJyLgorLlNIIEZJTEVTIEFORCBESVJFQ1RPUklFUworVGhlc2UgYXJlIHN1YmplY3QgdG8gZGlmZmVyZW5jZSBkZXBlbmRpbmcgb24gbG9jYWwgaW5zdGFsbGF0aW9uCitjb252ZW50aW9uczsgJHtwcmVmaXh9IGFuZCAke2V4ZWNfcHJlZml4fSBhcmUgaW5zdGFsbGF0aW9uLWRlcGVuZGVudAorYW5kIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyBmb3IgR05VIHNvZnR3YXJlOyB0aGV5IG1heSBiZSB0aGUgc2FtZS4KK1RoZSBkZWZhdWx0IGZvciBib3RoIGlzIFxmSS91c3IvbG9jYWxcZlAuCisuSVAgXGZJJHtleGVjX3ByZWZpeH0vYmluL3B5dGhvblxmUAorUmVjb21tZW5kZWQgbG9jYXRpb24gb2YgdGhlIGludGVycHJldGVyLgorLlBQCisuSSAke3ByZWZpeH0vbGliL3B5dGhvbjx2ZXJzaW9uPgorLmJyCisuSSAke2V4ZWNfcHJlZml4fS9saWIvcHl0aG9uPHZlcnNpb24+CisuUlMKK1JlY29tbWVuZGVkIGxvY2F0aW9ucyBvZiB0aGUgZGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgc3RhbmRhcmQKK21vZHVsZXMuCisuUkUKKy5QUAorLkkgJHtwcmVmaXh9L2luY2x1ZGUvcHl0aG9uPHZlcnNpb24+CisuYnIKKy5JICR7ZXhlY19wcmVmaXh9L2luY2x1ZGUvcHl0aG9uPHZlcnNpb24+CisuUlMKK1JlY29tbWVuZGVkIGxvY2F0aW9ucyBvZiB0aGUgZGlyZWN0b3JpZXMgY29udGFpbmluZyB0aGUgaW5jbHVkZSBmaWxlcworbmVlZGVkIGZvciBkZXZlbG9waW5nIFB5dGhvbiBleHRlbnNpb25zIGFuZCBlbWJlZGRpbmcgdGhlCitpbnRlcnByZXRlci4KKy5SRQorLklQIFxmSX4vLnB5dGhvbnJjLnB5XGZQCitVc2VyLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZpbGUgbG9hZGVkIGJ5IHRoZSBcZkl1c2VyXGZQIG1vZHVsZTsKK25vdCB1c2VkIGJ5IGRlZmF1bHQgb3IgYnkgbW9zdCBhcHBsaWNhdGlvbnMuCisuU0ggRU5WSVJPTk1FTlQgVkFSSUFCTEVTCisuSVAgUFlUSE9OSE9NRQorQ2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3RhbmRhcmQgUHl0aG9uIGxpYnJhcmllcy4gIEJ5IGRlZmF1bHQsIHRoZQorbGlicmFyaWVzIGFyZSBzZWFyY2hlZCBpbiAke3ByZWZpeH0vbGliL3B5dGhvbjx2ZXJzaW9uPiBhbmQKKyR7ZXhlY19wcmVmaXh9L2xpYi9weXRob248dmVyc2lvbj4sIHdoZXJlICR7cHJlZml4fSBhbmQgJHtleGVjX3ByZWZpeH0KK2FyZSBpbnN0YWxsYXRpb24tZGVwZW5kZW50IGRpcmVjdG9yaWVzLCBib3RoIGRlZmF1bHRpbmcgdG8KK1xmSS91c3IvbG9jYWxcZlAuICBXaGVuICRQWVRIT05IT01FIGlzIHNldCB0byBhIHNpbmdsZSBkaXJlY3RvcnksIGl0cyB2YWx1ZQorcmVwbGFjZXMgYm90aCAke3ByZWZpeH0gYW5kICR7ZXhlY19wcmVmaXh9LiAgVG8gc3BlY2lmeSBkaWZmZXJlbnQgdmFsdWVzCitmb3IgdGhlc2UsIHNldCAkUFlUSE9OSE9NRSB0byAke3ByZWZpeH06JHtleGVjX3ByZWZpeH0uCisuSVAgUFlUSE9OUEFUSAorQXVnbWVudHMgdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggZm9yIG1vZHVsZSBmaWxlcy4KK1RoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMgdGhlIHNoZWxsJ3MgJFBBVEg6IG9uZSBvciBtb3JlIGRpcmVjdG9yeQorcGF0aG5hbWVzIHNlcGFyYXRlZCBieSBjb2xvbnMuCitOb24tZXhpc3RlbnQgZGlyZWN0b3JpZXMgYXJlIHNpbGVudGx5IGlnbm9yZWQuCitUaGUgZGVmYXVsdCBzZWFyY2ggcGF0aCBpcyBpbnN0YWxsYXRpb24gZGVwZW5kZW50LCBidXQgZ2VuZXJhbGx5CitiZWdpbnMgd2l0aCAke3ByZWZpeH0vbGliL3B5dGhvbjx2ZXJzaW9uPiAoc2VlIFBZVEhPTkhPTUUgYWJvdmUpLgorVGhlIGRlZmF1bHQgc2VhcmNoIHBhdGggaXMgYWx3YXlzIGFwcGVuZGVkIHRvICRQWVRIT05QQVRILgorSWYgYSBzY3JpcHQgYXJndW1lbnQgaXMgZ2l2ZW4sIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgc2NyaXB0IGlzCitpbnNlcnRlZCBpbiB0aGUgcGF0aCBpbiBmcm9udCBvZiAkUFlUSE9OUEFUSC4KK1RoZSBzZWFyY2ggcGF0aCBjYW4gYmUgbWFuaXB1bGF0ZWQgZnJvbSB3aXRoaW4gYSBQeXRob24gcHJvZ3JhbSBhcyB0aGUKK3ZhcmlhYmxlCisuSSBzeXMucGF0aCAuCisuSVAgUFlUSE9OU1RBUlRVUAorSWYgdGhpcyBpcyB0aGUgbmFtZSBvZiBhIHJlYWRhYmxlIGZpbGUsIHRoZSBQeXRob24gY29tbWFuZHMgaW4gdGhhdAorZmlsZSBhcmUgZXhlY3V0ZWQgYmVmb3JlIHRoZSBmaXJzdCBwcm9tcHQgaXMgZGlzcGxheWVkIGluIGludGVyYWN0aXZlCittb2RlLgorVGhlIGZpbGUgaXMgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgbmFtZSBzcGFjZSB3aGVyZSBpbnRlcmFjdGl2ZSBjb21tYW5kcworYXJlIGV4ZWN1dGVkIHNvIHRoYXQgb2JqZWN0cyBkZWZpbmVkIG9yIGltcG9ydGVkIGluIGl0IGNhbiBiZSB1c2VkCit3aXRob3V0IHF1YWxpZmljYXRpb24gaW4gdGhlIGludGVyYWN0aXZlIHNlc3Npb24uCitZb3UgY2FuIGFsc28gY2hhbmdlIHRoZSBwcm9tcHRzCisuSSBzeXMucHMxCithbmQKKy5JIHN5cy5wczIKK2luIHRoaXMgZmlsZS4KKy5JUCBQWVRIT05ZMksKK1NldCB0aGlzIHRvIGEgbm9uLWVtcHR5IHN0cmluZyB0byBjYXVzZSB0aGUgXGZJdGltZVxmUCBtb2R1bGUgdG8KK3JlcXVpcmUgZGF0ZXMgc3BlY2lmaWVkIGFzIHN0cmluZ3MgdG8gaW5jbHVkZSA0LWRpZ2l0IHllYXJzLCBvdGhlcndpc2UKKzItZGlnaXQgeWVhcnMgYXJlIGNvbnZlcnRlZCBiYXNlZCBvbiBydWxlcyBkZXNjcmliZWQgaW4gdGhlIFxmSXRpbWVcZlAKK21vZHVsZSBkb2N1bWVudGF0aW9uLgorLklQIFBZVEhPTk9QVElNSVpFCitJZiB0aGlzIGlzIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nCit0aGUgXGZCXC1PXGZQIG9wdGlvbi4gSWYgc2V0IHRvIGFuIGludGVnZXIsIGl0IGlzIGVxdWl2YWxlbnQgdG8KK3NwZWNpZnlpbmcgXGZCXC1PXGZQIG11bHRpcGxlIHRpbWVzLgorLklQIFBZVEhPTkRFQlVHCitJZiB0aGlzIGlzIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nCit0aGUgXGZCXC1kXGZQIG9wdGlvbi4gSWYgc2V0IHRvIGFuIGludGVnZXIsIGl0IGlzIGVxdWl2YWxlbnQgdG8KK3NwZWNpZnlpbmcgXGZCXC1kXGZQIG11bHRpcGxlIHRpbWVzLgorLklQIFBZVEhPTkRPTlRXUklURUJZVEVDT0RFCitJZiB0aGlzIGlzIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nCit0aGUgXGZCXC1CXGZQIG9wdGlvbiAoZG9uJ3QgdHJ5IHRvIHdyaXRlCisuSSAucHlbY29dCitmaWxlcykuCisuSVAgUFlUSE9OSU5TUEVDVAorSWYgdGhpcyBpcyBzZXQgdG8gYSBub24tZW1wdHkgc3RyaW5nIGl0IGlzIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZwordGhlIFxmQlwtaVxmUCBvcHRpb24uCisuSVAgUFlUSE9OSU9FTkNPRElORworSWYgdGhpcyBpcyBzZXQgYmVmb3JlIHJ1bm5pbmcgdGhlIGludGVycHJldGVyLCBpdCBvdmVycmlkZXMgdGhlIGVuY29kaW5nIHVzZWQKK2ZvciBzdGRpbi9zdGRvdXQvc3RkZXJyLCBpbiB0aGUgc3ludGF4CisuSUIgZW5jb2RpbmduYW1lICI6IiBlcnJvcmhhbmRsZXIKK1RoZQorLklCIGVycm9yaGFuZGxlcgorcGFydCBpcyBvcHRpb25hbCBhbmQgaGFzIHRoZSBzYW1lIG1lYW5pbmcgYXMgaW4gc3RyLmVuY29kZS4gRm9yIHN0ZGVyciwgdGhlCisuSUIgZXJyb3JoYW5kbGVyCisgcGFydCBpcyBpZ25vcmVkOyB0aGUgaGFuZGxlciB3aWxsIGFsd2F5cyBiZSBcJ2JhY2tzbGFzaHJlcGxhY2VcJy4KKy5JUCBQWVRIT05OT1VTRVJTSVRFCitJZiB0aGlzIGlzIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZQorXGZCXC1zXGZQIG9wdGlvbiAoRG9uJ3QgYWRkIHRoZSB1c2VyIHNpdGUgZGlyZWN0b3J5IHRvIHN5cy5wYXRoKS4KKy5JUCBQWVRIT05VTkJVRkZFUkVECitJZiB0aGlzIGlzIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nCit0aGUgXGZCXC11XGZQIG9wdGlvbi4KKy5JUCBQWVRIT05WRVJCT1NFCitJZiB0aGlzIGlzIHNldCB0byBhIG5vbi1lbXB0eSBzdHJpbmcgaXQgaXMgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nCit0aGUgXGZCXC12XGZQIG9wdGlvbi4gSWYgc2V0IHRvIGFuIGludGVnZXIsIGl0IGlzIGVxdWl2YWxlbnQgdG8KK3NwZWNpZnlpbmcgXGZCXC12XGZQIG11bHRpcGxlIHRpbWVzLiAKKy5JUCBQWVRIT05XQVJOSU5HUworSWYgdGhpcyBpcyBzZXQgdG8gYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nIGl0IGlzIGVxdWl2YWxlbnQgdG8KK3NwZWNpZnlpbmcgdGhlIFxmQlwtV1xmUCBvcHRpb24gZm9yIGVhY2ggc2VwYXJhdGUgdmFsdWUuCisuSVAgUFlUSE9OSEFTSFNFRUQKK0lmIHRoaXMgdmFyaWFibGUgaXMgc2V0IHRvICJyYW5kb20iLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIHNwZWNpZnlpbmcKK3RoZSBcZkItUlxmUCBvcHRpb246IGEgcmFuZG9tIHZhbHVlIGlzIHVzZWQgdG8gc2VlZCB0aGUgaGFzaGVzIG9mIHN0ciwKK2J5dGVzIGFuZCBkYXRldGltZSBvYmplY3RzLgorCitJZiBQWVRIT05IQVNIU0VFRCBpcyBzZXQgdG8gYW4gaW50ZWdlciB2YWx1ZSwgaXQgaXMgdXNlZCBhcyBhIGZpeGVkIHNlZWQgZm9yCitnZW5lcmF0aW5nIHRoZSBoYXNoKCkgb2YgdGhlIHR5cGVzIGNvdmVyZWQgYnkgdGhlIGhhc2ggcmFuZG9taXphdGlvbi4gIEl0cworcHVycG9zZSBpcyB0byBhbGxvdyByZXBlYXRhYmxlIGhhc2hpbmcsIHN1Y2ggYXMgZm9yIHNlbGZ0ZXN0cyBmb3IgdGhlCitpbnRlcnByZXRlciBpdHNlbGYsIG9yIHRvIGFsbG93IGEgY2x1c3RlciBvZiBweXRob24gcHJvY2Vzc2VzIHRvIHNoYXJlIGhhc2gKK3ZhbHVlcy4KKworVGhlIGludGVnZXIgbXVzdCBiZSBhIGRlY2ltYWwgbnVtYmVyIGluIHRoZSByYW5nZSBbMCw0Mjk0OTY3Mjk1XS4gIFNwZWNpZnlpbmcKK3RoZSB2YWx1ZSAwIHdpbGwgbGVhZCB0byB0aGUgc2FtZSBoYXNoIHZhbHVlcyBhcyB3aGVuIGhhc2ggcmFuZG9taXphdGlvbiBpcworZGlzYWJsZWQuCisuU0ggQVVUSE9SCitUaGUgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb246IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9wc2YKKy5TSCBJTlRFUk5FVCBSRVNPVVJDRVMKK01haW4gd2Vic2l0ZTogIGh0dHA6Ly93d3cucHl0aG9uLm9yZy8KKy5icgorRG9jdW1lbnRhdGlvbjogIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvCisuYnIKK0RldmVsb3BlciByZXNvdXJjZXM6ICBodHRwOi8vZG9jcy5weXRob24ub3JnL2Rldmd1aWRlLworLmJyCitEb3dubG9hZHM6ICBodHRwOi8vcHl0aG9uLm9yZy9kb3dubG9hZC8KKy5icgorTW9kdWxlIHJlcG9zaXRvcnk6ICBodHRwOi8vcHlwaS5weXRob24ub3JnLworLmJyCitOZXdzZ3JvdXBzOiAgY29tcC5sYW5nLnB5dGhvbiwgY29tcC5sYW5nLnB5dGhvbi5hbm5vdW5jZQorLlNIIExJQ0VOU0lORworUHl0aG9uIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIGFuIE9wZW4gU291cmNlIGxpY2Vuc2UuICBTZWUgdGhlIGZpbGUKKyJMSUNFTlNFIiBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHRlcm1zICYKK2NvbmRpdGlvbnMgZm9yIGFjY2Vzc2luZyBhbmQgb3RoZXJ3aXNlIHVzaW5nIFB5dGhvbiBhbmQgZm9yIGEKK0RJU0NMQUlNRVIgT0YgQUxMIFdBUlJBTlRJRVMuCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjYvX19pbml0X18ucHkgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjYvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMzc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNi9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNi9wcmludGVycy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNi9wcmludGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjk5OWJmCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC42L3ByaW50ZXJzLnB5CkBAIC0wLDAgKzEsODAyIEBACisjIFByZXR0eS1wcmludGVycyBmb3IgbGlic3RjKysuCisKKyMgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitpbXBvcnQgZ2RiCitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgcmUKKworY2xhc3MgU3RkUG9pbnRlclByaW50ZXI6CisgICAgIlByaW50IGEgc21hcnQgcG9pbnRlciBvZiBzb21lIGtpbmQiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnZhbFsnX01fcmVmY291bnQnXVsnX01fcGknXSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICclcyAoZW1wdHkpICVzJyAlIChzZWxmLnR5cGVuYW1lLCBzZWxmLnZhbFsnX01fcHRyJ10pCisgICAgICAgIHJldHVybiAnJXMgKGNvdW50ICVkKSAlcycgJSAoc2VsZi50eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbFsnX01fcmVmY291bnQnXVsnX01fcGknXVsnX01fdXNlX2NvdW50J10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52YWxbJ19NX3B0ciddKQorCitjbGFzcyBVbmlxdWVQb2ludGVyUHJpbnRlcjoKKyAgICAiUHJpbnQgYSB1bmlxdWVfcHRyIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fdCddCisKK2NsYXNzIFN0ZExpc3RQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6bGlzdCIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGV0eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZXR5cGUgPSBub2RldHlwZQorICAgICAgICAgICAgc2VsZi5iYXNlID0gaGVhZFsnX01fbmV4dCddCisgICAgICAgICAgICBzZWxmLmhlYWQgPSBoZWFkLmFkZHJlc3MKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFzZSA9PSBzZWxmLmhlYWQ6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgZWx0ID0gc2VsZi5iYXNlLmNhc3Qoc2VsZi5ub2RldHlwZSkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgc2VsZi5iYXNlID0gZWx0WydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbHRbJ19NX2RhdGEnXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgIGl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICAjIElmIHRoZSBpbmZlcmlvciBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggLURfR0xJQkNYWF9ERUJVRworICAgICAgICAjIHNvbWUgb2YgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgY2hhbmdlLgorICAgICAgICBpZiBzZWxmLnR5cGVuYW1lID09ICJzdGQ6Omxpc3QiOgorICAgICAgICAgICAgbm9kZXR5cGUgPSBnZGIubG9va3VwX3R5cGUoJ3N0ZDo6X0xpc3Rfbm9kZTwlcz4nICUgaXR5cGUpLnBvaW50ZXIoKQorICAgICAgICBlbGlmIHNlbGYudHlwZW5hbWUgPT0gInN0ZDo6X19kZWJ1Zzo6bGlzdCI6CisgICAgICAgICAgICBub2RldHlwZSA9IGdkYi5sb29rdXBfdHlwZSgnc3RkOjpfX25vcm06Ol9MaXN0X25vZGU8JXM+JyAlIGl0eXBlKS5wb2ludGVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJDYW5ub3QgY2FzdCBsaXN0IG5vZGUgZm9yIGxpc3QgcHJpbnRlci4iCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihub2RldHlwZSwgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddLmFkZHJlc3MgPT0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fbm9kZSddWydfTV9uZXh0J106CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzJyAlIChzZWxmLnR5cGVuYW1lKQorICAgICAgICByZXR1cm4gJyVzJyAlIChzZWxmLnR5cGVuYW1lKQorCitjbGFzcyBTdGRMaXN0SXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6Omxpc3Q6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICAjIElmIHRoZSBpbmZlcmlvciBwcm9ncmFtIGlzIGNvbXBpbGVkIHdpdGggLURfR0xJQkNYWF9ERUJVRworICAgICAgICAjIHNvbWUgb2YgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMgY2hhbmdlLgorICAgICAgICBpZiBzZWxmLnR5cGVuYW1lID09ICJzdGQ6Ol9MaXN0X2l0ZXJhdG9yIiBvciBzZWxmLnR5cGVuYW1lID09ICJzdGQ6Ol9MaXN0X2NvbnN0X2l0ZXJhdG9yIjoKKyAgICAgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKCdzdGQ6Ol9MaXN0X25vZGU8JXM+JyAlIGl0eXBlKS5wb2ludGVyKCkKKyAgICAgICAgZWxpZiBzZWxmLnR5cGVuYW1lID09ICJzdGQ6Ol9fbm9ybTo6X0xpc3RfaXRlcmF0b3IiIG9yIHNlbGYudHlwZW5hbWUgPT0gInN0ZDo6X19ub3JtOjpfTGlzdF9jb25zdF9pdGVyYXRvciI6CisgICAgICAgICAgICBub2RldHlwZSA9IGdkYi5sb29rdXBfdHlwZSgnc3RkOjpfX25vcm06Ol9MaXN0X25vZGU8JXM+JyAlIGl0eXBlKS5wb2ludGVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJDYW5ub3QgY2FzdCBsaXN0IG5vZGUgZm9yIGxpc3QgaXRlcmF0b3IgcHJpbnRlci4iCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fbm9kZSddLmNhc3Qobm9kZXR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX2RhdGEnXQorCitjbGFzcyBTdGRTbGlzdFByaW50ZXI6CisgICAgIlByaW50IGEgX19nbnVfY3h4OjpzbGlzdCIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGV0eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZXR5cGUgPSBub2RldHlwZQorICAgICAgICAgICAgc2VsZi5iYXNlID0gaGVhZFsnX01faGVhZCddWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFzZSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsdCA9IHNlbGYuYmFzZS5jYXN0KHNlbGYubm9kZXR5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGVsdFsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0WydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgaXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKCdfX2dudV9jeHg6Ol9TbGlzdF9ub2RlPCVzPicgJSBpdHlwZSkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihub2RldHlwZSwgc2VsZi52YWwpCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnZhbFsnX01faGVhZCddWydfTV9uZXh0J10gPT0gMDoKKyAgICAgICAgICAgIHJldHVybiAnZW1wdHkgX19nbnVfY3h4OjpzbGlzdCcKKyAgICAgICAgcmV0dXJuICdfX2dudV9jeHg6OnNsaXN0JworCitjbGFzcyBTdGRTbGlzdEl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgX19nbnVfY3h4OjpzbGlzdDo6aXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICBub2RldHlwZSA9IGdkYi5sb29rdXBfdHlwZSgnX19nbnVfY3h4OjpfU2xpc3Rfbm9kZTwlcz4nICUgaXR5cGUpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX25vZGUnXS5jYXN0KG5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpWydfTV9kYXRhJ10KKworY2xhc3MgU3RkVmVjdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OnZlY3RvciIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBzdGFydCwgZmluaXNoLCBiaXR2ZWMpOgorICAgICAgICAgICAgc2VsZi5iaXR2ZWMgPSBiaXR2ZWMKKyAgICAgICAgICAgIGlmIGJpdHZlYzoKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gICA9IHN0YXJ0WydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLnNvICAgICA9IHN0YXJ0WydfTV9vZmZzZXQnXQorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoWydfTV9wJ10KKyAgICAgICAgICAgICAgICBzZWxmLmZvICAgICA9IGZpbmlzaFsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgICAgICBpdHlwZSA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpLnR5cGUKKyAgICAgICAgICAgICAgICBzZWxmLmlzaXplID0gOCAqIGl0eXBlLnNpemVvZgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzdGFydAorICAgICAgICAgICAgICAgIHNlbGYuZmluaXNoID0gZmluaXNoCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgaWYgc2VsZi5iaXR2ZWM6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoIGFuZCBzZWxmLnNvID49IHNlbGYuZm86CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICBlbHQgPSBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgIGlmIGVsdCAmICgxIDw8IHNlbGYuc28pOgorICAgICAgICAgICAgICAgICAgICBvYml0ID0gMQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9iaXQgPSAwCisgICAgICAgICAgICAgICAgc2VsZi5zbyA9IHNlbGYuc28gKyAxCisgICAgICAgICAgICAgICAgaWYgc2VsZi5zbyA+PSBzZWxmLmlzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzZWxmLml0ZW0gKyAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc28gPSAwCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgb2JpdCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWx0ID0gc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzZWxmLml0ZW0gKyAxCisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0KQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKyAgICAgICAgc2VsZi5pc19ib29sID0gdmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkuY29kZSAgPT0gZ2RiLlRZUEVfQ09ERV9CT09MCisKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyYXRvcihzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlzX2Jvb2wpCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZW5kX29mX3N0b3JhZ2UnXQorICAgICAgICBpZiBzZWxmLmlzX2Jvb2w6CisgICAgICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J11bJ19NX3AnXQorICAgICAgICAgICAgc28gICAgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ11bJ19NX3AnXQorICAgICAgICAgICAgZm8gICAgID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ11bJ19NX29mZnNldCddCisgICAgICAgICAgICBpdHlwZSA9IHN0YXJ0LmRlcmVmZXJlbmNlKCkudHlwZQorICAgICAgICAgICAgYmwgPSA4ICogaXR5cGUuc2l6ZW9mCisgICAgICAgICAgICBsZW5ndGggICA9IChibCAtIHNvKSArIGJsICogKChmaW5pc2ggLSBzdGFydCkgLSAxKSArIGZvCisgICAgICAgICAgICBjYXBhY2l0eSA9IGJsICogKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuICgnJXM8Ym9vbD4gb2YgbGVuZ3RoICVkLCBjYXBhY2l0eSAlZCcKKyAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgaW50IChsZW5ndGgpLCBpbnQgKGNhcGFjaXR5KSkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKCclcyBvZiBsZW5ndGggJWQsIGNhcGFjaXR5ICVkJworICAgICAgICAgICAgICAgICAgICAlIChzZWxmLnR5cGVuYW1lLCBpbnQgKGZpbmlzaCAtIHN0YXJ0KSwgaW50IChlbmQgLSBzdGFydCkpKQorCisgICAgZGVmIGRpc3BsYXlfaGludChzZWxmKToKKyAgICAgICAgcmV0dXJuICdhcnJheScKKworY2xhc3MgU3RkVmVjdG9ySXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6OnZlY3Rvcjo6aXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fY3VycmVudCddLmRlcmVmZXJlbmNlKCkKKworY2xhc3MgU3RkVHVwbGVQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6dHVwbGUiCisKKyAgICBjbGFzcyBfaXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLmhlYWQgPSBoZWFkCisKKyAgICAgICAgICAgICMgU2V0IHRoZSBiYXNlIGNsYXNzIGFzIHRoZSBpbml0aWFsIGhlYWQgb2YgdGhlCisgICAgICAgICAgICAjIHR1cGxlLgorICAgICAgICAgICAgbm9kZXMgPSBzZWxmLmhlYWQudHlwZS5maWVsZHMgKCkKKyAgICAgICAgICAgIGlmIGxlbiAobm9kZXMpICE9IDE6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIlRvcCBvZiB0dXBsZSB0cmVlIGRvZXMgbm90IGNvbnNpc3Qgb2YgYSBzaW5nbGUgbm9kZS4iCisKKyAgICAgICAgICAgICMgU2V0IHRoZSBhY3R1YWwgaGVhZCB0byB0aGUgZmlyc3QgcGFpci4KKyAgICAgICAgICAgIHNlbGYuaGVhZCAgPSBzZWxmLmhlYWQuY2FzdCAobm9kZXNbMF0udHlwZSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQgKHNlbGYpOgorICAgICAgICAgICAgbm9kZXMgPSBzZWxmLmhlYWQudHlwZS5maWVsZHMgKCkKKyAgICAgICAgICAgICMgQ2hlY2sgZm9yIGZ1cnRoZXIgcmVjdXJzaW9ucyBpbiB0aGUgaW5oZXJpdGFuY2UgdHJlZS4KKyAgICAgICAgICAgIGlmIGxlbiAobm9kZXMpID09IDA6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgIyBDaGVjayB0aGF0IHRoaXMgaXRlcmF0aW9uIGhhcyBhbiBleHBlY3RlZCBzdHJ1Y3R1cmUuCisgICAgICAgICAgICBpZiBsZW4gKG5vZGVzKSAhPSAyOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJDYW5ub3QgcGFyc2UgbW9yZSB0aGFuIDIgbm9kZXMgaW4gYSB0dXBsZSB0cmVlLiIKKworICAgICAgICAgICAgIyAtIExlZnQgbm9kZSBpcyB0aGUgbmV4dCByZWN1cnNpb24gcGFyZW50LgorICAgICAgICAgICAgIyAtIFJpZ2h0IG5vZGUgaXMgdGhlIGFjdHVhbCBjbGFzcyBjb250YWluZWQgaW4gdGhlIHR1cGxlLgorCisgICAgICAgICAgICAjIFByb2Nlc3MgcmlnaHQgbm9kZS4KKyAgICAgICAgICAgIGltcGwgPSBzZWxmLmhlYWQuY2FzdCAobm9kZXNbMV0udHlwZSkKKworICAgICAgICAgICAgIyBQcm9jZXNzIGxlZnQgbm9kZSBhbmQgc2V0IGl0IGFzIGhlYWQuCisgICAgICAgICAgICBzZWxmLmhlYWQgID0gc2VsZi5oZWFkLmNhc3QgKG5vZGVzWzBdLnR5cGUpCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKworICAgICAgICAgICAgIyBGaW5hbGx5LCBjaGVjayB0aGUgaW1wbGVtZW50YXRpb24uICBJZiBpdCBpcworICAgICAgICAgICAgIyB3cmFwcGVkIGluIF9NX2hlYWRfaW1wbCByZXR1cm4gdGhhdCwgb3RoZXJ3aXNlIHJldHVybgorICAgICAgICAgICAgIyB0aGUgdmFsdWUgImFzIGlzIi4KKyAgICAgICAgICAgIGZpZWxkcyA9IGltcGwudHlwZS5maWVsZHMgKCkKKyAgICAgICAgICAgIGlmIGxlbiAoZmllbGRzKSA8IDEgb3IgZmllbGRzWzBdLm5hbWUgIT0gIl9NX2hlYWRfaW1wbCI6CisgICAgICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBzZWxmLmNvdW50LCBpbXBsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIHNlbGYuY291bnQsIGltcGxbJ19NX2hlYWRfaW1wbCddKQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsOworCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXJhdG9yIChzZWxmLnZhbCkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIGNvbnRhaW5pbmcnICUgKHNlbGYudHlwZW5hbWUpCisKK2NsYXNzIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpzdGFjayBvciBzdGQ6OnF1ZXVlIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmlzdWFsaXplciA9IGdkYi5kZWZhdWx0X3Zpc3VhbGl6ZXIodmFsWydjJ10pCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52aXN1YWxpemVyLmNoaWxkcmVuKCkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdyYXBwaW5nOiAlcycgJSAoc2VsZi50eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmlzdWFsaXplci50b19zdHJpbmcoKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyIChzZWxmLnZpc3VhbGl6ZXIsICdkaXNwbGF5X2hpbnQnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuZGlzcGxheV9oaW50ICgpCisgICAgICAgIHJldHVybiBOb25lCisKK2NsYXNzIFJidHJlZUl0ZXJhdG9yOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYnRyZWUpOgorICAgICAgICBzZWxmLnNpemUgPSByYnRyZWVbJ19NX3QnXVsnX01faW1wbCddWydfTV9ub2RlX2NvdW50J10KKyAgICAgICAgc2VsZi5ub2RlID0gcmJ0cmVlWydfTV90J11bJ19NX2ltcGwnXVsnX01faGVhZGVyJ11bJ19NX2xlZnQnXQorICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBpbnQgKHNlbGYuc2l6ZSkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNvdW50ID09IHNlbGYuc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ub2RlCisgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICBpZiBzZWxmLmNvdW50IDwgc2VsZi5zaXplOgorICAgICAgICAgICAgIyBDb21wdXRlIHRoZSBuZXh0IG5vZGUuCisgICAgICAgICAgICBub2RlID0gc2VsZi5ub2RlCisgICAgICAgICAgICBpZiBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J106CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXQorICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fbGVmdCddOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9sZWZ0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9wYXJlbnQnXQorICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUgPT0gcGFyZW50LmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J106CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmRlcmVmZXJlbmNlKClbJ19NX3BhcmVudCddCisgICAgICAgICAgICAgICAgaWYgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddICE9IHBhcmVudDoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudAorICAgICAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyMgVGhpcyBpcyBhIHByZXR0eSBwcmludGVyIGZvciBzdGQ6Ol9SYl90cmVlX2l0ZXJhdG9yICh3aGljaCBpcworIyBzdGQ6Om1hcDo6aXRlcmF0b3IpLCBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgUmJ0cmVlSXRlcmF0b3IKKyMgY2xhc3MgYWJvdmUuCitjbGFzcyBTdGRSYnRyZWVJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IHN0ZDo6bWFwOjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB2YWx1ZXR5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKCdzdGQ6Ol9SYl90cmVlX25vZGUgPCAlcyA+JyAlIHZhbHVldHlwZSkKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsLmNhc3Qobm9kZXR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX3ZhbHVlX2ZpZWxkJ10KKworY2xhc3MgU3RkRGVidWdJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IGEgZGVidWcgZW5hYmxlZCB2ZXJzaW9uIG9mIGFuIGl0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgIyBKdXN0IHN0cmlwIGF3YXkgdGhlIGVuY2Fwc3VsYXRpbmcgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yCisgICAgIyBhbmQgcmV0dXJuIHRoZSB3cmFwcGVkIGl0ZXJhdG9yIHZhbHVlLgorICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICBpdHlwZSA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9jdXJyZW50J10uY2FzdChpdHlwZSkKKworY2xhc3MgU3RkTWFwUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6Om1hcCBvciBzdGQ6Om11bHRpbWFwIgorCisgICAgIyBUdXJuIGFuIFJidHJlZUl0ZXJhdG9yIGludG8gYSBwcmV0dHktcHJpbnQgaXRlcmF0b3IuCisgICAgY2xhc3MgX2l0ZXI6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYml0ZXIsIHR5cGUpOgorICAgICAgICAgICAgc2VsZi5yYml0ZXIgPSByYml0ZXIKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisgICAgICAgICAgICBzZWxmLnR5cGUgPSB0eXBlCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuY291bnQgJSAyID09IDA6CisgICAgICAgICAgICAgICAgbiA9IHNlbGYucmJpdGVyLm5leHQoKQorICAgICAgICAgICAgICAgIG4gPSBuLmNhc3Qoc2VsZi50eXBlKS5kZXJlZmVyZW5jZSgpWydfTV92YWx1ZV9maWVsZCddCisgICAgICAgICAgICAgICAgc2VsZi5wYWlyID0gbgorICAgICAgICAgICAgICAgIGl0ZW0gPSBuWydmaXJzdCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnBhaXJbJ3NlY29uZCddCisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSkpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICBrZXl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKS5jb25zdCgpCisgICAgICAgIHZhbHVldHlwZSA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMSkKKyAgICAgICAgbm9kZXR5cGUgPSBnZGIubG9va3VwX3R5cGUoJ3N0ZDo6X1JiX3RyZWVfbm9kZTwgc3RkOjpwYWlyPCAlcywgJXMgPiA+JyAlIChrZXl0eXBlLCB2YWx1ZXR5cGUpKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlciAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSwgbm9kZXR5cGUpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdtYXAnCisKK2NsYXNzIFN0ZFNldFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpzZXQgb3Igc3RkOjptdWx0aXNldCIKKworICAgICMgVHVybiBhbiBSYnRyZWVJdGVyYXRvciBpbnRvIGEgcHJldHR5LXByaW50IGl0ZXJhdG9yLgorICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcmJpdGVyLCB0eXBlKToKKyAgICAgICAgICAgIHNlbGYucmJpdGVyID0gcmJpdGVyCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICAgICAgc2VsZi50eXBlID0gdHlwZQorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpdGVtID0gc2VsZi5yYml0ZXIubmV4dCgpCisgICAgICAgICAgICBpdGVtID0gaXRlbS5jYXN0KHNlbGYudHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fdmFsdWVfZmllbGQnXQorICAgICAgICAgICAgIyBGSVhNRTogdGhpcyBpcyB3ZWlyZCAuLi4gd2hhdCB0byBkbz8KKyAgICAgICAgICAgICMgTWF5YmUgYSAnc2V0JyBkaXNwbGF5IGhpbnQ/CisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSkpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICBrZXl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICBub2RldHlwZSA9IGdkYi5sb29rdXBfdHlwZSgnc3RkOjpfUmJfdHJlZV9ub2RlPCAlcyA+JyAlIGtleXR5cGUpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlciAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSwgbm9kZXR5cGUpCisKK2NsYXNzIFN0ZEJpdHNldFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpiaXRzZXQiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgICMgSWYgdGVtcGxhdGVfYXJndW1lbnQgaGFuZGxlZCB2YWx1ZXMsIHdlIGNvdWxkIHByaW50IHRoZQorICAgICAgICAjIHNpemUuICBPciB3ZSBjb3VsZCB1c2UgYSByZWdleHAgb24gdGhlIHR5cGUuCisgICAgICAgIHJldHVybiAnJXMnICUgKHNlbGYudHlwZW5hbWUpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICB3b3JkcyA9IHNlbGYudmFsWydfTV93J10KKyAgICAgICAgd3R5cGUgPSB3b3Jkcy50eXBlCisKKyAgICAgICAgIyBUaGUgX01fdyBtZW1iZXIgY2FuIGJlIGVpdGhlciBhbiB1bnNpZ25lZCBsb25nLCBvciBhbgorICAgICAgICAjIGFycmF5LiAgVGhpcyBkZXBlbmRzIG9uIHRoZSB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB1c2VkLgorICAgICAgICAjIElmIGl0IGlzIGEgc2luZ2xlIGxvbmcsIGNvbnZlcnQgdG8gYSBzaW5nbGUgZWxlbWVudCBsaXN0LgorICAgICAgICBpZiB3dHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfQVJSQVk6CisgICAgICAgICAgICB0c2l6ZSA9IHd0eXBlLnRhcmdldCAoKS5zaXplb2YKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHdvcmRzID0gW3dvcmRzXQorICAgICAgICAgICAgdHNpemUgPSB3dHlwZS5zaXplb2YgCisKKyAgICAgICAgbndvcmRzID0gd3R5cGUuc2l6ZW9mIC8gdHNpemUKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgYnl0ZSA9IDAKKyAgICAgICAgd2hpbGUgYnl0ZSA8IG53b3JkczoKKyAgICAgICAgICAgIHcgPSB3b3Jkc1tieXRlXQorICAgICAgICAgICAgYml0ID0gMAorICAgICAgICAgICAgd2hpbGUgdyAhPSAwOgorICAgICAgICAgICAgICAgIGlmICh3ICYgMSkgIT0gMDoKKyAgICAgICAgICAgICAgICAgICAgIyBBbm90aGVyIHNwb3Qgd2hlcmUgd2UgY291bGQgdXNlICdzZXQnPworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCgnWyVkXScgJSAoYnl0ZSAqIHRzaXplICogOCArIGJpdCksIDEpKQorICAgICAgICAgICAgICAgIGJpdCA9IGJpdCArIDEKKyAgICAgICAgICAgICAgICB3ID0gdyA+PiAxCisgICAgICAgICAgICBieXRlID0gYnl0ZSArIDEKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBTdGREZXF1ZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpkZXF1ZSIKKworICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZSwgc3RhcnQsIGVuZCwgbGFzdCwgYnVmZmVyX3NpemUpOgorICAgICAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICAgICAgc2VsZi5wID0gc3RhcnQKKyAgICAgICAgICAgIHNlbGYuZW5kID0gZW5kCisgICAgICAgICAgICBzZWxmLmxhc3QgPSBsYXN0CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemUKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYucCA9PSBzZWxmLmxhc3Q6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorCisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgc2VsZi5wLmRlcmVmZXJlbmNlKCkpCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKworICAgICAgICAgICAgIyBBZHZhbmNlIHRoZSAnY3VyJyBwb2ludGVyLgorICAgICAgICAgICAgc2VsZi5wID0gc2VsZi5wICsgMQorICAgICAgICAgICAgaWYgc2VsZi5wID09IHNlbGYuZW5kOgorICAgICAgICAgICAgICAgICMgSWYgd2UgZ290IHRvIHRoZSBlbmQgb2YgdGhpcyBidWNrZXQsIG1vdmUgdG8gdGhlCisgICAgICAgICAgICAgICAgIyBuZXh0IGJ1Y2tldC4KKyAgICAgICAgICAgICAgICBzZWxmLm5vZGUgPSBzZWxmLm5vZGUgKyAxCisgICAgICAgICAgICAgICAgc2VsZi5wID0gc2VsZi5ub2RlWzBdCisgICAgICAgICAgICAgICAgc2VsZi5lbmQgPSBzZWxmLnAgKyBzZWxmLmJ1ZmZlcl9zaXplCisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYuZWx0dHlwZSA9IHZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIHNpemUgPSBzZWxmLmVsdHR5cGUuc2l6ZW9mCisgICAgICAgIGlmIHNpemUgPCA1MTI6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gaW50ICg1MTIgLyBzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IDEKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIHN0YXJ0ID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXQorICAgICAgICBlbmQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9maW5pc2gnXQorCisgICAgICAgIGRlbHRhX24gPSBlbmRbJ19NX25vZGUnXSAtIHN0YXJ0WydfTV9ub2RlJ10gLSAxCisgICAgICAgIGRlbHRhX3MgPSBzdGFydFsnX01fbGFzdCddIC0gc3RhcnRbJ19NX2N1ciddCisgICAgICAgIGRlbHRhX2UgPSBlbmRbJ19NX2N1ciddIC0gZW5kWydfTV9maXJzdCddCisKKyAgICAgICAgc2l6ZSA9IHNlbGYuYnVmZmVyX3NpemUgKiBkZWx0YV9uICsgZGVsdGFfcyArIGRlbHRhX2UKKworICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIGxvbmcgKHNpemUpKQorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXIoc3RhcnRbJ19NX25vZGUnXSwgc3RhcnRbJ19NX2N1ciddLCBzdGFydFsnX01fbGFzdCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRbJ19NX2N1ciddLCBzZWxmLmJ1ZmZlcl9zaXplKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKK2NsYXNzIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBzdGQ6OmRlcXVlOjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9jdXInXS5kZXJlZmVyZW5jZSgpCisKK2NsYXNzIFN0ZFN0cmluZ1ByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpiYXNpY19zdHJpbmcgb2Ygc29tZSBraW5kIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSAmc3RyaW5nIHdvcmtzLCB0b28uCisgICAgICAgIHR5cGUgPSBzZWxmLnZhbC50eXBlCisgICAgICAgIGlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRhcmdldCAoKQorCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRvX3N0cmluZyByZXR1cm5zCisgICAgICAgICMgdGhlIHN0cmluZyBhY2NvcmRpbmcgdG8gbGVuZ3RoLCBub3QgYWNjb3JkaW5nIHRvIGZpcnN0IG51bGwKKyAgICAgICAgIyBlbmNvdW50ZXJlZC4KKyAgICAgICAgcHRyID0gc2VsZi52YWwgWydfTV9kYXRhcGx1cyddWydfTV9wJ10KKyAgICAgICAgcmVhbHR5cGUgPSB0eXBlLnVucXVhbGlmaWVkICgpLnN0cmlwX3R5cGVkZWZzICgpCisgICAgICAgIHJlcHR5cGUgPSBnZGIubG9va3VwX3R5cGUgKHN0ciAocmVhbHR5cGUpICsgJzo6X1JlcCcpLnBvaW50ZXIgKCkKKyAgICAgICAgaGVhZGVyID0gcHRyLmNhc3QocmVwdHlwZSkgLSAxCisgICAgICAgIGxlbiA9IGhlYWRlci5kZXJlZmVyZW5jZSAoKVsnX01fbGVuZ3RoJ10KKyAgICAgICAgaWYgaGFzYXR0cihwdHIsICJsYXp5X3N0cmluZyIpOgorICAgICAgICAgICAgcmV0dXJuIHB0ci5sYXp5X3N0cmluZyAobGVuZ3RoID0gbGVuKQorICAgICAgICByZXR1cm4gcHRyLnN0cmluZyAobGVuZ3RoID0gbGVuKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnc3RyaW5nJworCitjbGFzcyBUcjFIYXNodGFibGVJdGVyYXRvcjoKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIGhhc2gpOgorICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICBzZWxmLm5fYnVja2V0cyA9IGhhc2hbJ19NX2VsZW1lbnRfY291bnQnXQorICAgICAgICBpZiBzZWxmLm5fYnVja2V0cyA9PSAwOgorICAgICAgICAgICAgc2VsZi5ub2RlID0gRmFsc2UKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnVja2V0ID0gaGFzaFsnX01fYnVja2V0cyddCisgICAgICAgICAgICBzZWxmLm5vZGUgPSBzZWxmLmJ1Y2tldFswXQorICAgICAgICAgICAgc2VsZi51cGRhdGUgKCkKKworICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgdXBkYXRlIChzZWxmKToKKyAgICAgICAgIyBJZiB3ZSBhZHZhbmNlZCBvZmYgdGhlIGVuZCBvZiB0aGUgY2hhaW4sIG1vdmUgdG8gdGhlIG5leHQKKyAgICAgICAgIyBidWNrZXQuCisgICAgICAgIHdoaWxlIHNlbGYubm9kZSA9PSAwOgorICAgICAgICAgICAgc2VsZi5idWNrZXQgPSBzZWxmLmJ1Y2tldCArIDEKKyAgICAgICAgICAgIHNlbGYubm9kZSA9IHNlbGYuYnVja2V0WzBdCisKKyAgICAgICAjIElmIHdlIGFkdmFuY2VkIG9mZiB0aGUgZW5kIG9mIHRoZSBidWNrZXQgYXJyYXksIHRoZW4KKyAgICAgICAjIHdlJ3JlIGRvbmUuCisgICAgICAgIGlmIHNlbGYuY291bnQgPT0gc2VsZi5uX2J1Y2tldHM6CisgICAgICAgICAgICBzZWxmLm5vZGUgPSBGYWxzZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisKKyAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLm5vZGU6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIHJlc3VsdCA9IHNlbGYubm9kZS5kZXJlZmVyZW5jZSgpWydfTV92J10KKyAgICAgICAgc2VsZi5ub2RlID0gc2VsZi5ub2RlLmRlcmVmZXJlbmNlKClbJ19NX25leHQnXQorICAgICAgICBzZWxmLnVwZGF0ZSAoKQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIFRyMVVub3JkZXJlZFNldFByaW50ZXI6CisgICAgIlByaW50IGEgdHIxOjp1bm9yZGVyZWRfc2V0IgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCBzZWxmLnZhbFsnX01fZWxlbWVudF9jb3VudCddKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfY291bnQgKGkpOgorICAgICAgICByZXR1cm4gJ1slZF0nICUgaQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgY291bnRlciA9IGl0ZXJ0b29scy5pbWFwIChzZWxmLmZvcm1hdF9jb3VudCwgaXRlcnRvb2xzLmNvdW50KCkpCisgICAgICAgIHJldHVybiBpdGVydG9vbHMuaXppcCAoY291bnRlciwgVHIxSGFzaHRhYmxlSXRlcmF0b3IgKHNlbGYudmFsKSkKKworY2xhc3MgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcjoKKyAgICAiUHJpbnQgYSB0cjE6OnVub3JkZXJlZF9tYXAiCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHNlbGYudmFsWydfTV9lbGVtZW50X2NvdW50J10pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZsYXR0ZW4gKGxpc3QpOgorICAgICAgICBmb3IgZWx0IGluIGxpc3Q6CisgICAgICAgICAgICBmb3IgaSBpbiBlbHQ6CisgICAgICAgICAgICAgICAgeWllbGQgaQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfb25lIChlbHQpOgorICAgICAgICByZXR1cm4gKGVsdFsnZmlyc3QnXSwgZWx0WydzZWNvbmQnXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X2NvdW50IChpKToKKyAgICAgICAgcmV0dXJuICdbJWRdJyAlIGkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGNvdW50ZXIgPSBpdGVydG9vbHMuaW1hcCAoc2VsZi5mb3JtYXRfY291bnQsIGl0ZXJ0b29scy5jb3VudCgpKQorICAgICAgICAjIE1hcCBvdmVyIHRoZSBoYXNoIHRhYmxlIGFuZCBmbGF0dGVuIHRoZSByZXN1bHQuCisgICAgICAgIGRhdGEgPSBzZWxmLmZsYXR0ZW4gKGl0ZXJ0b29scy5pbWFwIChzZWxmLmZvcm1hdF9vbmUsIFRyMUhhc2h0YWJsZUl0ZXJhdG9yIChzZWxmLnZhbCkpKQorICAgICAgICAjIFppcCB0aGUgdHdvIGl0ZXJhdG9ycyB0b2dldGhlci4KKyAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5pemlwIChjb3VudGVyLCBkYXRhKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnbWFwJworCitkZWYgcmVnaXN0ZXJfbGlic3RkY3h4X3ByaW50ZXJzIChvYmopOgorICAgICJSZWdpc3RlciBsaWJzdGRjKysgcHJldHR5LXByaW50ZXJzIHdpdGggb2JqZmlsZSBPYmouIgorCisgICAgaWYgb2JqID09IE5vbmU6CisgICAgICAgIG9iaiA9IGdkYgorCisgICAgb2JqLnByZXR0eV9wcmludGVycy5hcHBlbmQgKGxvb2t1cF9mdW5jdGlvbikKKworZGVmIGxvb2t1cF9mdW5jdGlvbiAodmFsKToKKyAgICAiTG9vay11cCBhbmQgcmV0dXJuIGEgcHJldHR5LXByaW50ZXIgdGhhdCBjYW4gcHJpbnQgdmFsLiIKKworICAgICMgR2V0IHRoZSB0eXBlLgorICAgIHR5cGUgPSB2YWwudHlwZQorCisgICAgIyBJZiBpdCBwb2ludHMgdG8gYSByZWZlcmVuY2UsIGdldCB0aGUgcmVmZXJlbmNlLgorICAgIGlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKyAgICAgICAgdHlwZSA9IHR5cGUudGFyZ2V0ICgpCisKKyAgICAjIEdldCB0aGUgdW5xdWFsaWZpZWQgdHlwZSwgc3RyaXBwZWQgb2YgdHlwZWRlZnMuCisgICAgdHlwZSA9IHR5cGUudW5xdWFsaWZpZWQgKCkuc3RyaXBfdHlwZWRlZnMgKCkKKworICAgICMgR2V0IHRoZSB0eXBlIG5hbWUuICAgIAorICAgIHR5cGVuYW1lID0gdHlwZS50YWcKKyAgICBpZiB0eXBlbmFtZSA9PSBOb25lOgorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBJdGVyYXRlIG92ZXIgbG9jYWwgZGljdGlvbmFyeSBvZiB0eXBlcyB0byBkZXRlcm1pbmUKKyAgICAjIGlmIGEgcHJpbnRlciBpcyByZWdpc3RlcmVkIGZvciB0aGF0IHR5cGUuICBSZXR1cm4gYW4KKyAgICAjIGluc3RhbnRpYXRpb24gb2YgdGhlIHByaW50ZXIgaWYgZm91bmQuCisgICAgZm9yIGZ1bmN0aW9uIGluIHByZXR0eV9wcmludGVyc19kaWN0OgorICAgICAgICBpZiBmdW5jdGlvbi5zZWFyY2ggKHR5cGVuYW1lKToKKyAgICAgICAgICAgIHJldHVybiBwcmV0dHlfcHJpbnRlcnNfZGljdFtmdW5jdGlvbl0gKHZhbCkKKyAgICAgICAgCisgICAgIyBDYW5ub3QgZmluZCBhIHByZXR0eSBwcmludGVyLiAgUmV0dXJuIE5vbmUuCisgICAgcmV0dXJuIE5vbmUKKworZGVmIGJ1aWxkX2xpYnN0ZGN4eF9kaWN0aW9uYXJ5ICgpOgorICAgICMgbGlic3RkYysrIG9iamVjdHMgcmVxdWlyaW5nIHByZXR0eS1wcmludGluZy4KKyAgICAjIEluIG9yZGVyIGZyb206CisgICAgIyBodHRwOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbGF0ZXN0LWRveHlnZW4vYTAxODQ3Lmh0bWwKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpiYXNpY19zdHJpbmc8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFN0cmluZ1ByaW50ZXIodmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OmJpdHNldDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkQml0c2V0UHJpbnRlcigic3RkOjpiaXRzZXQiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6ZGVxdWU8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZERlcXVlUHJpbnRlcigic3RkOjpkZXF1ZSIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpsaXN0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRMaXN0UHJpbnRlcigic3RkOjpsaXN0IiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Om1hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTWFwUHJpbnRlcigic3RkOjptYXAiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6bXVsdGltYXA8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZE1hcFByaW50ZXIoInN0ZDo6bXVsdGltYXAiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6bXVsdGlzZXQ8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFNldFByaW50ZXIoInN0ZDo6bXVsdGlzZXQiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6cHJpb3JpdHlfcXVldWU8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIoInN0ZDo6cHJpb3JpdHlfcXVldWUiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6cXVldWU8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIoInN0ZDo6cXVldWUiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dHVwbGU8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFR1cGxlUHJpbnRlcigic3RkOjp0dXBsZSIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpzZXQ8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFNldFByaW50ZXIoInN0ZDo6c2V0IiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnN0YWNrPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRTdGFja09yUXVldWVQcmludGVyKCJzdGQ6OnN0YWNrIiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnVuaXF1ZV9wdHI8Lio+JCcpXSA9IFVuaXF1ZVBvaW50ZXJQcmludGVyCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dmVjdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRWZWN0b3JQcmludGVyKCJzdGQ6OnZlY3RvciIsIHZhbCkKKyAgICAjIHZlY3Rvcjxib29sPgorCisgICAgIyBQcmludGVyIHJlZ2lzdHJhdGlvbnMgZm9yIGNsYXNzZXMgY29tcGlsZWQgd2l0aCAtRF9HTElCQ1hYX0RFQlVHLgorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6OmJpdHNldDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkQml0c2V0UHJpbnRlcigic3RkOjpfX2RlYnVnOjpiaXRzZXQiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6ZGVxdWU8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZERlcXVlUHJpbnRlcigic3RkOjpfX2RlYnVnOjpkZXF1ZSIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjpsaXN0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRMaXN0UHJpbnRlcigic3RkOjpfX2RlYnVnOjpsaXN0IiwgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6Om1hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTWFwUHJpbnRlcigic3RkOjpfX2RlYnVnOjptYXAiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6bXVsdGltYXA8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZE1hcFByaW50ZXIoInN0ZDo6X19kZWJ1Zzo6bXVsdGltYXAiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6bXVsdGlzZXQ8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFNldFByaW50ZXIoInN0ZDo6X19kZWJ1Zzo6bXVsdGlzZXQiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6cHJpb3JpdHlfcXVldWU8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIoInN0ZDo6X19kZWJ1Zzo6cHJpb3JpdHlfcXVldWUiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6cXVldWU8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIoInN0ZDo6X19kZWJ1Zzo6cXVldWUiLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6c2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRTZXRQcmludGVyKCJzdGQ6Ol9fZGVidWc6OnNldCIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjpzdGFjazwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU3RhY2tPclF1ZXVlUHJpbnRlcigic3RkOjpfX2RlYnVnOjpzdGFjayIsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjp1bmlxdWVfcHRyPC4qPiQnKV0gPSBVbmlxdWVQb2ludGVyUHJpbnRlcgorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6OnZlY3RvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkVmVjdG9yUHJpbnRlcigic3RkOjpfX2RlYnVnOjp2ZWN0b3IiLCB2YWwpCisKKyAgICAjIFRoZXNlIGFyZSB0aGUgVFIxIGFuZCBDKysweCBwcmludGVycy4KKyAgICAjIEZvciBhcnJheSAtIHRoZSBkZWZhdWx0IEdEQiBwcmV0dHktcHJpbnRlciBzZWVtcyByZWFzb25hYmxlLgorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnNoYXJlZF9wdHI8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFBvaW50ZXJQcmludGVyICgnc3RkOjpzaGFyZWRfcHRyJywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OndlYWtfcHRyPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRQb2ludGVyUHJpbnRlciAoJ3N0ZDo6d2Vha19wdHInLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dW5vcmRlcmVkX21hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkTWFwUHJpbnRlciAoJ3N0ZDo6dW5vcmRlcmVkX21hcCcsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjp1bm9yZGVyZWRfc2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRTZXRQcmludGVyICgnc3RkOjp1bm9yZGVyZWRfc2V0JywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnVub3JkZXJlZF9tdWx0aW1hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkTWFwUHJpbnRlciAoJ3N0ZDo6dW5vcmRlcmVkX211bHRpbWFwJywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnVub3JkZXJlZF9tdWx0aXNldDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkU2V0UHJpbnRlciAoJ3N0ZDo6dW5vcmRlcmVkX211bHRpc2V0JywgdmFsKQorCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6dHIxOjpzaGFyZWRfcHRyPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGRQb2ludGVyUHJpbnRlciAoJ3N0ZDo6dHIxOjpzaGFyZWRfcHRyJywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnRyMTo6d2Vha19wdHI8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFBvaW50ZXJQcmludGVyICgnc3RkOjp0cjE6OndlYWtfcHRyJywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnRyMTo6dW5vcmRlcmVkX21hcDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkTWFwUHJpbnRlciAoJ3N0ZDo6dHIxOjp1bm9yZGVyZWRfbWFwJywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnRyMTo6dW5vcmRlcmVkX3NldDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkU2V0UHJpbnRlciAoJ3N0ZDo6dHIxOjp1bm9yZGVyZWRfc2V0JywgdmFsKQorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpbWFwPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRNYXBQcmludGVyICgnc3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aW1hcCcsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aXNldDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkU2V0UHJpbnRlciAoJ3N0ZDo6dHIxOjp1bm9yZGVyZWRfbXVsdGlzZXQnLCB2YWwpCisKKyAgICAjIFRoZXNlIGFyZSB0aGUgQysrMHggcHJpbnRlciByZWdpc3RyYXRpb25zIGZvciAtRF9HTElCQ1hYX0RFQlVHIGNhc2VzLgorICAgICMgVGhlIHRyMSBuYW1lc3BhY2UgcHJpbnRlcnMgZG8gbm90IHNlZW0gdG8gaGF2ZSBhbnkgZGVidWcKKyAgICAjIGVxdWl2YWxlbnRzLCBzbyBkbyBubyByZWdpc3RlciB0aGVtLgorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tYXA8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFRyMVVub3JkZXJlZE1hcFByaW50ZXIgKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tYXAnLCB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX3NldDwuKj4kJyldID0gbGFtYmRhIHZhbDogVHIxVW5vcmRlcmVkU2V0UHJpbnRlciAoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX3NldCcsIHZhbCkKKyAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfbXVsdGltYXA8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFRyMVVub3JkZXJlZE1hcFByaW50ZXIgKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tdWx0aW1hcCcsICB2YWwpCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX211bHRpc2V0PC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBUcjFVbm9yZGVyZWRTZXRQcmludGVyICgnc3RkOjpfX2RlYnVnOnVub3JkZXJlZF9tdWx0aXNldCcsIHZhbCkKKworCisgICAgIyBFeHRlbnNpb25zLgorICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15fX2dudV9jeHg6OnNsaXN0PC4qPiQnKV0gPSBTdGRTbGlzdFByaW50ZXIKKworICAgIGlmIFRydWU6CisgICAgICAgICMgVGhlc2Ugc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgaWYgR0RCICJwcmludCAqaSIgd29ya2VkLgorICAgICAgICAjIEJ1dCBpdCBvZnRlbiBkb2Vzbid0LCBzbyBoZXJlIHRoZXkgYXJlLgorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfTGlzdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcigic3RkOjpfTGlzdF9pdGVyYXRvciIsdmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfTGlzdF9jb25zdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcigic3RkOjpfTGlzdF9jb25zdF9pdGVyYXRvciIsdmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfUmJfdHJlZV9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkUmJ0cmVlSXRlcmF0b3JQcmludGVyKHZhbCkKKyAgICAgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X1JiX3RyZWVfY29uc3RfaXRlcmF0b3I8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFJidHJlZUl0ZXJhdG9yUHJpbnRlcih2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9EZXF1ZV9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkRGVxdWVJdGVyYXRvclByaW50ZXIodmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfRGVxdWVfY29uc3RfaXRlcmF0b3I8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKHZhbCkKKyAgICAgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXl9fZ251X2N4eDo6X19ub3JtYWxfaXRlcmF0b3I8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZFZlY3Rvckl0ZXJhdG9yUHJpbnRlcih2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15fX2dudV9jeHg6Ol9TbGlzdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkU2xpc3RJdGVyYXRvclByaW50ZXIodmFsKQorCisgICAgICAgICMgRGVidWcgKGNvbXBpbGVkIHdpdGggLURfR0xJQkNYWF9ERUJVRykgcHJpbnRlciByZWdpc3RyYXRpb25zLgorICAgICAgICAjIFRoZSBSYl90cmVlIGRlYnVnIGl0ZXJhdG9yIHdoZW4gdW53cmFwcGVkIGZyb20gdGhlIGVuY2Fwc3VsYXRpbmcgX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yCisgICAgICAgICMgZG9lcyBub3QgaGF2ZSB0aGUgX19ub3JtIG5hbWVzcGFjZS4gSnVzdCB1c2UgdGhlIGV4aXN0aW5nIHByaW50ZXIgcmVnaXN0cmF0aW9uIGZvciB0aGF0LgorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdeX19nbnVfZGVidWc6Ol9TYWZlX2l0ZXJhdG9yPC4qPiQnKV0gPSBsYW1iZGEgdmFsOiBTdGREZWJ1Z0l0ZXJhdG9yUHJpbnRlcih2YWwpCisgICAgICAgIHByZXR0eV9wcmludGVyc19kaWN0W3JlLmNvbXBpbGUoJ15zdGQ6Ol9fbm9ybTo6X0xpc3RfaXRlcmF0b3I8Lio+JCcpXSA9IGxhbWJkYSB2YWw6IFN0ZExpc3RJdGVyYXRvclByaW50ZXIgKCJzdGQ6Ol9fbm9ybTo6X0xpc3RfaXRlcmF0b3IiLHZhbCkKKyAgICAgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSgnXnN0ZDo6X19ub3JtOjpfTGlzdF9jb25zdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkTGlzdEl0ZXJhdG9yUHJpbnRlciAoInN0ZDo6X19ub3JtOjpfTGlzdF9jb25zdF9pdGVyYXRvciIsdmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX25vcm06Ol9EZXF1ZV9jb25zdF9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkRGVxdWVJdGVyYXRvclByaW50ZXIodmFsKQorICAgICAgICBwcmV0dHlfcHJpbnRlcnNfZGljdFtyZS5jb21waWxlKCdec3RkOjpfX25vcm06Ol9EZXF1ZV9pdGVyYXRvcjwuKj4kJyldID0gbGFtYmRhIHZhbDogU3RkRGVxdWVJdGVyYXRvclByaW50ZXIodmFsKQorCitwcmV0dHlfcHJpbnRlcnNfZGljdCA9IHt9CisKK2J1aWxkX2xpYnN0ZGN4eF9kaWN0aW9uYXJ5ICgpCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjcvX19pbml0X18ucHkgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjcvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGIxMzc4OQotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNy9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNy9wcmludGVycy5weSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuNy9wcmludGVycy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmM1NGIxCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC43L3ByaW50ZXJzLnB5CkBAIC0wLDAgKzEsOTI4IEBACisjIFByZXR0eS1wcmludGVycyBmb3IgbGlic3RjKysuCisKKyMgQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCitpbXBvcnQgZ2RiCitpbXBvcnQgaXRlcnRvb2xzCitpbXBvcnQgcmUKKworIyBUcnkgdG8gdXNlIHRoZSBuZXctc3R5bGUgcHJldHR5LXByaW50aW5nIGlmIGF2YWlsYWJsZS4KK191c2VfZ2RiX3BwID0gVHJ1ZQordHJ5OgorICAgIGltcG9ydCBnZGIucHJpbnRpbmcKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfdXNlX2dkYl9wcCA9IEZhbHNlCisKKyMgU3RhcnRpbmcgd2l0aCB0aGUgdHlwZSBPUklHLCBzZWFyY2ggZm9yIHRoZSBtZW1iZXIgdHlwZSBOQU1FLiAgVGhpcworIyBoYW5kbGVzIHNlYXJjaGluZyB1cHdhcmQgdGhyb3VnaCBzdXBlcmNsYXNzZXMuICBUaGlzIGlzIG5lZWRlZCB0bworIyB3b3JrIGFyb3VuZCBodHRwOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEzNjE1LgorZGVmIGZpbmRfdHlwZShvcmlnLCBuYW1lKToKKyAgICB0eXAgPSBvcmlnLnN0cmlwX3R5cGVkZWZzKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBzZWFyY2ggPSBzdHIodHlwKSArICc6OicgKyBuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBnZGIubG9va3VwX3R5cGUoc2VhcmNoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRoZSB0eXBlIHdhcyBub3QgZm91bmQsIHNvIHRyeSB0aGUgc3VwZXJjbGFzcy4gIFdlIG9ubHkgbmVlZAorICAgICAgICAjIHRvIGNoZWNrIHRoZSBmaXJzdCBzdXBlcmNsYXNzLCBzbyB3ZSBkb24ndCBib3RoZXIgd2l0aAorICAgICAgICAjIGFueXRoaW5nIGZhbmNpZXIgaGVyZS4KKyAgICAgICAgZmllbGQgPSB0eXAuZmllbGRzKClbMF0KKyAgICAgICAgaWYgbm90IGZpZWxkLmlzX2Jhc2VfY2xhc3M6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiQ2Fubm90IGZpbmQgdHlwZSAlczo6JXMiICUgKHN0cihvcmlnKSwgbmFtZSkKKyAgICAgICAgdHlwID0gZmllbGQudHlwZQorCitjbGFzcyBTaGFyZWRQb2ludGVyUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzaGFyZWRfcHRyIG9yIHdlYWtfcHRyIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgc3RhdGUgPSAnZW1wdHknCisgICAgICAgIHJlZmNvdW50cyA9IHNlbGYudmFsWydfTV9yZWZjb3VudCddWydfTV9waSddCisgICAgICAgIGlmIHJlZmNvdW50cyAhPSAwOgorICAgICAgICAgICAgdXNlY291bnQgPSByZWZjb3VudHNbJ19NX3VzZV9jb3VudCddCisgICAgICAgICAgICB3ZWFrY291bnQgPSByZWZjb3VudHNbJ19NX3dlYWtfY291bnQnXQorICAgICAgICAgICAgaWYgdXNlY291bnQgPT0gMDoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9ICdleHBpcmVkLCB3ZWFrICVkJyAlIHdlYWtjb3VudAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGF0ZSA9ICdjb3VudCAlZCwgd2VhayAlZCcgJSAodXNlY291bnQsIHdlYWtjb3VudCAtIDEpCisgICAgICAgIHJldHVybiAnJXMgKCVzKSAlcycgJSAoc2VsZi50eXBlbmFtZSwgc3RhdGUsIHNlbGYudmFsWydfTV9wdHInXSkKKworY2xhc3MgVW5pcXVlUG9pbnRlclByaW50ZXI6CisgICAgIlByaW50IGEgdW5pcXVlX3B0ciIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV90J10KKworY2xhc3MgU3RkTGlzdFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpsaXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuaGVhZCA9IGhlYWQuYWRkcmVzcworICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5iYXNlID09IHNlbGYuaGVhZDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBlbHQgPSBzZWxmLmJhc2UuY2FzdChzZWxmLm5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBlbHRbJ19NX25leHQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIGVsdFsnX01fZGF0YSddKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Iobm9kZXR5cGUsIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX25vZGUnXSkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX25vZGUnXS5hZGRyZXNzID09IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX25vZGUnXVsnX01fbmV4dCddOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSAlcycgJSAoc2VsZi50eXBlbmFtZSkKKyAgICAgICAgcmV0dXJuICclcycgJSAoc2VsZi50eXBlbmFtZSkKKworY2xhc3MgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjpsaXN0OjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBub2RldHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX05vZGUnKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnN0cmlwX3R5cGVkZWZzKCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fbm9kZSddLmNhc3Qobm9kZXR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX2RhdGEnXQorCitjbGFzcyBTdGRTbGlzdFByaW50ZXI6CisgICAgIlByaW50IGEgX19nbnVfY3h4OjpzbGlzdCIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGV0eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZXR5cGUgPSBub2RldHlwZQorICAgICAgICAgICAgc2VsZi5iYXNlID0gaGVhZFsnX01faGVhZCddWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFzZSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsdCA9IHNlbGYuYmFzZS5jYXN0KHNlbGYubm9kZXR5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGVsdFsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0WydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgIG5vZGV0eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfTm9kZScpCisgICAgICAgIG5vZGV0eXBlID0gbm9kZXR5cGUuc3RyaXBfdHlwZWRlZnMoKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXJhdG9yKG5vZGV0eXBlLCBzZWxmLnZhbCkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9oZWFkJ11bJ19NX25leHQnXSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSBfX2dudV9jeHg6OnNsaXN0JworICAgICAgICByZXR1cm4gJ19fZ251X2N4eDo6c2xpc3QnCisKK2NsYXNzIFN0ZFNsaXN0SXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBfX2dudV9jeHg6OnNsaXN0OjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGV0eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfTm9kZScpCisgICAgICAgIG5vZGV0eXBlID0gbm9kZXR5cGUuc3RyaXBfdHlwZWRlZnMoKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9ub2RlJ10uY2FzdChub2RldHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fZGF0YSddCisKK2NsYXNzIFN0ZFZlY3RvclByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjp2ZWN0b3IiCisKKyAgICBjbGFzcyBfaXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgc3RhcnQsIGZpbmlzaCwgYml0dmVjKToKKyAgICAgICAgICAgIHNlbGYuYml0dmVjID0gYml0dmVjCisgICAgICAgICAgICBpZiBiaXR2ZWM6CisgICAgICAgICAgICAgICAgc2VsZi5pdGVtICAgPSBzdGFydFsnX01fcCddCisgICAgICAgICAgICAgICAgc2VsZi5zbyAgICAgPSBzdGFydFsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaCA9IGZpbmlzaFsnX01fcCddCisgICAgICAgICAgICAgICAgc2VsZi5mbyAgICAgPSBmaW5pc2hbJ19NX29mZnNldCddCisgICAgICAgICAgICAgICAgaXR5cGUgPSBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKS50eXBlCisgICAgICAgICAgICAgICAgc2VsZi5pc2l6ZSA9IDggKiBpdHlwZS5zaXplb2YKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc3RhcnQKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaCA9IGZpbmlzaAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIGlmIHNlbGYuYml0dmVjOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSBzZWxmLmZpbmlzaCBhbmQgc2VsZi5zbyA+PSBzZWxmLmZvOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWx0ID0gc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICBpZiBlbHQgJiAoMSA8PCBzZWxmLnNvKToKKyAgICAgICAgICAgICAgICAgICAgb2JpdCA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvYml0ID0gMAorICAgICAgICAgICAgICAgIHNlbGYuc28gPSBzZWxmLnNvICsgMQorICAgICAgICAgICAgICAgIGlmIHNlbGYuc28gPj0gc2VsZi5pc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc2VsZi5pdGVtICsgMQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvID0gMAorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIG9iaXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSBzZWxmLmZpbmlzaDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGVsdCA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc2VsZi5pdGVtICsgMQorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIGVsdCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYuaXNfYm9vbCA9IHZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApLmNvZGUgID09IGdkYi5UWVBFX0NPREVfQk9PTAorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Ioc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19ib29sKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgc3RhcnQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddCisgICAgICAgIGZpbmlzaCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddCisgICAgICAgIGVuZCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2VuZF9vZl9zdG9yYWdlJ10KKyAgICAgICAgaWYgc2VsZi5pc19ib29sOgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddWydfTV9wJ10KKyAgICAgICAgICAgIHNvICAgID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXVsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgIGZpbmlzaCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddWydfTV9wJ10KKyAgICAgICAgICAgIGZvICAgICA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgaXR5cGUgPSBzdGFydC5kZXJlZmVyZW5jZSgpLnR5cGUKKyAgICAgICAgICAgIGJsID0gOCAqIGl0eXBlLnNpemVvZgorICAgICAgICAgICAgbGVuZ3RoICAgPSAoYmwgLSBzbykgKyBibCAqICgoZmluaXNoIC0gc3RhcnQpIC0gMSkgKyBmbworICAgICAgICAgICAgY2FwYWNpdHkgPSBibCAqIChlbmQgLSBzdGFydCkKKyAgICAgICAgICAgIHJldHVybiAoJyVzPGJvb2w+IG9mIGxlbmd0aCAlZCwgY2FwYWNpdHkgJWQnCisgICAgICAgICAgICAgICAgICAgICUgKHNlbGYudHlwZW5hbWUsIGludCAobGVuZ3RoKSwgaW50IChjYXBhY2l0eSkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICgnJXMgb2YgbGVuZ3RoICVkLCBjYXBhY2l0eSAlZCcKKyAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgaW50IChmaW5pc2ggLSBzdGFydCksIGludCAoZW5kIC0gc3RhcnQpKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKK2NsYXNzIFN0ZFZlY3Rvckl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjp2ZWN0b3I6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9jdXJyZW50J10uZGVyZWZlcmVuY2UoKQorCitjbGFzcyBTdGRUdXBsZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjp0dXBsZSIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYuaGVhZCA9IGhlYWQKKworICAgICAgICAgICAgIyBTZXQgdGhlIGJhc2UgY2xhc3MgYXMgdGhlIGluaXRpYWwgaGVhZCBvZiB0aGUKKyAgICAgICAgICAgICMgdHVwbGUuCisgICAgICAgICAgICBub2RlcyA9IHNlbGYuaGVhZC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgPT0gMToKKyAgICAgICAgICAgICAgICAjIFNldCB0aGUgYWN0dWFsIGhlYWQgdG8gdGhlIGZpcnN0IHBhaXIuCisgICAgICAgICAgICAgICAgc2VsZi5oZWFkICA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1swXS50eXBlKQorICAgICAgICAgICAgZWxpZiBsZW4gKG5vZGVzKSAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJUb3Agb2YgdHVwbGUgdHJlZSBkb2VzIG5vdCBjb25zaXN0IG9mIGEgc2luZ2xlIG5vZGUuIgorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBub2RlcyA9IHNlbGYuaGVhZC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgIyBDaGVjayBmb3IgZnVydGhlciByZWN1cnNpb25zIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLgorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAjIENoZWNrIHRoYXQgdGhpcyBpdGVyYXRpb24gaGFzIGFuIGV4cGVjdGVkIHN0cnVjdHVyZS4KKyAgICAgICAgICAgIGlmIGxlbiAobm9kZXMpICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkNhbm5vdCBwYXJzZSBtb3JlIHRoYW4gMiBub2RlcyBpbiBhIHR1cGxlIHRyZWUuIgorCisgICAgICAgICAgICAjIC0gTGVmdCBub2RlIGlzIHRoZSBuZXh0IHJlY3Vyc2lvbiBwYXJlbnQuCisgICAgICAgICAgICAjIC0gUmlnaHQgbm9kZSBpcyB0aGUgYWN0dWFsIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGUgdHVwbGUuCisKKyAgICAgICAgICAgICMgUHJvY2VzcyByaWdodCBub2RlLgorICAgICAgICAgICAgaW1wbCA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1sxXS50eXBlKQorCisgICAgICAgICAgICAjIFByb2Nlc3MgbGVmdCBub2RlIGFuZCBzZXQgaXQgYXMgaGVhZC4KKyAgICAgICAgICAgIHNlbGYuaGVhZCAgPSBzZWxmLmhlYWQuY2FzdCAobm9kZXNbMF0udHlwZSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorCisgICAgICAgICAgICAjIEZpbmFsbHksIGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbi4gIElmIGl0IGlzCisgICAgICAgICAgICAjIHdyYXBwZWQgaW4gX01faGVhZF9pbXBsIHJldHVybiB0aGF0LCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgICAgICAjIHRoZSB2YWx1ZSAiYXMgaXMiLgorICAgICAgICAgICAgZmllbGRzID0gaW1wbC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgaWYgbGVuIChmaWVsZHMpIDwgMSBvciBmaWVsZHNbMF0ubmFtZSAhPSAiX01faGVhZF9pbXBsIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIHNlbGYuY291bnQsIGltcGwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgc2VsZi5jb3VudCwgaW1wbFsnX01faGVhZF9pbXBsJ10pCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWw7CisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3IgKHNlbGYudmFsKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIGlmIGxlbiAoc2VsZi52YWwudHlwZS5maWVsZHMgKCkpID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzJyAlIChzZWxmLnR5cGVuYW1lKQorICAgICAgICByZXR1cm4gJyVzIGNvbnRhaW5pbmcnICUgKHNlbGYudHlwZW5hbWUpCisKK2NsYXNzIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpzdGFjayBvciBzdGQ6OnF1ZXVlIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmlzdWFsaXplciA9IGdkYi5kZWZhdWx0X3Zpc3VhbGl6ZXIodmFsWydjJ10pCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52aXN1YWxpemVyLmNoaWxkcmVuKCkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdyYXBwaW5nOiAlcycgJSAoc2VsZi50eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmlzdWFsaXplci50b19zdHJpbmcoKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyIChzZWxmLnZpc3VhbGl6ZXIsICdkaXNwbGF5X2hpbnQnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuZGlzcGxheV9oaW50ICgpCisgICAgICAgIHJldHVybiBOb25lCisKK2NsYXNzIFJidHJlZUl0ZXJhdG9yOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYnRyZWUpOgorICAgICAgICBzZWxmLnNpemUgPSByYnRyZWVbJ19NX3QnXVsnX01faW1wbCddWydfTV9ub2RlX2NvdW50J10KKyAgICAgICAgc2VsZi5ub2RlID0gcmJ0cmVlWydfTV90J11bJ19NX2ltcGwnXVsnX01faGVhZGVyJ11bJ19NX2xlZnQnXQorICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBpbnQgKHNlbGYuc2l6ZSkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNvdW50ID09IHNlbGYuc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ub2RlCisgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICBpZiBzZWxmLmNvdW50IDwgc2VsZi5zaXplOgorICAgICAgICAgICAgIyBDb21wdXRlIHRoZSBuZXh0IG5vZGUuCisgICAgICAgICAgICBub2RlID0gc2VsZi5ub2RlCisgICAgICAgICAgICBpZiBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J106CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXQorICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fbGVmdCddOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9sZWZ0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9wYXJlbnQnXQorICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUgPT0gcGFyZW50LmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J106CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmRlcmVmZXJlbmNlKClbJ19NX3BhcmVudCddCisgICAgICAgICAgICAgICAgaWYgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddICE9IHBhcmVudDoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudAorICAgICAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyMgVGhpcyBpcyBhIHByZXR0eSBwcmludGVyIGZvciBzdGQ6Ol9SYl90cmVlX2l0ZXJhdG9yICh3aGljaCBpcworIyBzdGQ6Om1hcDo6aXRlcmF0b3IpLCBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgUmJ0cmVlSXRlcmF0b3IKKyMgY2xhc3MgYWJvdmUuCitjbGFzcyBTdGRSYnRyZWVJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IHN0ZDo6bWFwOjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdHlwZW5hbWUgPSBzdHIoc2VsZi52YWwudHlwZS5zdHJpcF90eXBlZGVmcygpKSArICc6Ol9MaW5rX3R5cGUnCisgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKHR5cGVuYW1lKS5zdHJpcF90eXBlZGVmcygpCisgICAgICAgIHJldHVybiBzZWxmLnZhbC5jYXN0KG5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpWydfTV92YWx1ZV9maWVsZCddCisKK2NsYXNzIFN0ZERlYnVnSXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBhIGRlYnVnIGVuYWJsZWQgdmVyc2lvbiBvZiBhbiBpdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICAjIEp1c3Qgc3RyaXAgYXdheSB0aGUgZW5jYXBzdWxhdGluZyBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3IKKyAgICAjIGFuZCByZXR1cm4gdGhlIHdyYXBwZWQgaXRlcmF0b3IgdmFsdWUuCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIGl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1cnJlbnQnXS5jYXN0KGl0eXBlKQorCitjbGFzcyBTdGRNYXBQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6bWFwIG9yIHN0ZDo6bXVsdGltYXAiCisKKyAgICAjIFR1cm4gYW4gUmJ0cmVlSXRlcmF0b3IgaW50byBhIHByZXR0eS1wcmludCBpdGVyYXRvci4KKyAgICBjbGFzcyBfaXRlcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJiaXRlciwgdHlwZSk6CisgICAgICAgICAgICBzZWxmLnJiaXRlciA9IHJiaXRlcgorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKyAgICAgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5jb3VudCAlIDIgPT0gMDoKKyAgICAgICAgICAgICAgICBuID0gc2VsZi5yYml0ZXIubmV4dCgpCisgICAgICAgICAgICAgICAgbiA9IG4uY2FzdChzZWxmLnR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX3ZhbHVlX2ZpZWxkJ10KKyAgICAgICAgICAgICAgICBzZWxmLnBhaXIgPSBuCisgICAgICAgICAgICAgICAgaXRlbSA9IG5bJ2ZpcnN0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYucGFpclsnc2Vjb25kJ10KKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBpdGVtKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpKSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJlcF90eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfUmVwX3R5cGUnKQorICAgICAgICBub2RlID0gZmluZF90eXBlKHJlcF90eXBlLCAnX0xpbmtfdHlwZScpCisgICAgICAgIG5vZGUgPSBub2RlLnN0cmlwX3R5cGVkZWZzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXIgKFJidHJlZUl0ZXJhdG9yIChzZWxmLnZhbCksIG5vZGUpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdtYXAnCisKK2NsYXNzIFN0ZFNldFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpzZXQgb3Igc3RkOjptdWx0aXNldCIKKworICAgICMgVHVybiBhbiBSYnRyZWVJdGVyYXRvciBpbnRvIGEgcHJldHR5LXByaW50IGl0ZXJhdG9yLgorICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcmJpdGVyLCB0eXBlKToKKyAgICAgICAgICAgIHNlbGYucmJpdGVyID0gcmJpdGVyCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICAgICAgc2VsZi50eXBlID0gdHlwZQorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpdGVtID0gc2VsZi5yYml0ZXIubmV4dCgpCisgICAgICAgICAgICBpdGVtID0gaXRlbS5jYXN0KHNlbGYudHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fdmFsdWVfZmllbGQnXQorICAgICAgICAgICAgIyBGSVhNRTogdGhpcyBpcyB3ZWlyZCAuLi4gd2hhdCB0byBkbz8KKyAgICAgICAgICAgICMgTWF5YmUgYSAnc2V0JyBkaXNwbGF5IGhpbnQ/CisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSkpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXBfdHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX1JlcF90eXBlJykKKyAgICAgICAgbm9kZSA9IGZpbmRfdHlwZShyZXBfdHlwZSwgJ19MaW5rX3R5cGUnKQorICAgICAgICBub2RlID0gbm9kZS5zdHJpcF90eXBlZGVmcygpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpLCBub2RlKQorCitjbGFzcyBTdGRCaXRzZXRQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6Yml0c2V0IgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICAjIElmIHRlbXBsYXRlX2FyZ3VtZW50IGhhbmRsZWQgdmFsdWVzLCB3ZSBjb3VsZCBwcmludCB0aGUKKyAgICAgICAgIyBzaXplLiAgT3Igd2UgY291bGQgdXNlIGEgcmVnZXhwIG9uIHRoZSB0eXBlLgorICAgICAgICByZXR1cm4gJyVzJyAlIChzZWxmLnR5cGVuYW1lKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgd29yZHMgPSBzZWxmLnZhbFsnX01fdyddCisgICAgICAgIHd0eXBlID0gd29yZHMudHlwZQorCisgICAgICAgICMgVGhlIF9NX3cgbWVtYmVyIGNhbiBiZSBlaXRoZXIgYW4gdW5zaWduZWQgbG9uZywgb3IgYW4KKyAgICAgICAgIyBhcnJheS4gIFRoaXMgZGVwZW5kcyBvbiB0aGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdXNlZC4KKyAgICAgICAgIyBJZiBpdCBpcyBhIHNpbmdsZSBsb25nLCBjb252ZXJ0IHRvIGEgc2luZ2xlIGVsZW1lbnQgbGlzdC4KKyAgICAgICAgaWYgd3R5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX0FSUkFZOgorICAgICAgICAgICAgdHNpemUgPSB3dHlwZS50YXJnZXQgKCkuc2l6ZW9mCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3b3JkcyA9IFt3b3Jkc10KKyAgICAgICAgICAgIHRzaXplID0gd3R5cGUuc2l6ZW9mIAorCisgICAgICAgIG53b3JkcyA9IHd0eXBlLnNpemVvZiAvIHRzaXplCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGJ5dGUgPSAwCisgICAgICAgIHdoaWxlIGJ5dGUgPCBud29yZHM6CisgICAgICAgICAgICB3ID0gd29yZHNbYnl0ZV0KKyAgICAgICAgICAgIGJpdCA9IDAKKyAgICAgICAgICAgIHdoaWxlIHcgIT0gMDoKKyAgICAgICAgICAgICAgICBpZiAodyAmIDEpICE9IDA6CisgICAgICAgICAgICAgICAgICAgICMgQW5vdGhlciBzcG90IHdoZXJlIHdlIGNvdWxkIHVzZSAnc2V0Jz8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJ1slZF0nICUgKGJ5dGUgKiB0c2l6ZSAqIDggKyBiaXQpLCAxKSkKKyAgICAgICAgICAgICAgICBiaXQgPSBiaXQgKyAxCisgICAgICAgICAgICAgICAgdyA9IHcgPj4gMQorICAgICAgICAgICAgYnl0ZSA9IGJ5dGUgKyAxCisgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgU3RkRGVxdWVQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6ZGVxdWUiCisKKyAgICBjbGFzcyBfaXRlcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGUsIHN0YXJ0LCBlbmQsIGxhc3QsIGJ1ZmZlcl9zaXplKToKKyAgICAgICAgICAgIHNlbGYubm9kZSA9IG5vZGUKKyAgICAgICAgICAgIHNlbGYucCA9IHN0YXJ0CisgICAgICAgICAgICBzZWxmLmVuZCA9IGVuZAorICAgICAgICAgICAgc2VsZi5sYXN0ID0gbGFzdAorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLnAgPT0gc2VsZi5sYXN0OgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICAgICAgcmVzdWx0ID0gKCdbJWRdJyAlIHNlbGYuY291bnQsIHNlbGYucC5kZXJlZmVyZW5jZSgpKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisKKyAgICAgICAgICAgICMgQWR2YW5jZSB0aGUgJ2N1cicgcG9pbnRlci4KKyAgICAgICAgICAgIHNlbGYucCA9IHNlbGYucCArIDEKKyAgICAgICAgICAgIGlmIHNlbGYucCA9PSBzZWxmLmVuZDoKKyAgICAgICAgICAgICAgICAjIElmIHdlIGdvdCB0byB0aGUgZW5kIG9mIHRoaXMgYnVja2V0LCBtb3ZlIHRvIHRoZQorICAgICAgICAgICAgICAgICMgbmV4dCBidWNrZXQuCisgICAgICAgICAgICAgICAgc2VsZi5ub2RlID0gc2VsZi5ub2RlICsgMQorICAgICAgICAgICAgICAgIHNlbGYucCA9IHNlbGYubm9kZVswXQorICAgICAgICAgICAgICAgIHNlbGYuZW5kID0gc2VsZi5wICsgc2VsZi5idWZmZXJfc2l6ZQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLmVsdHR5cGUgPSB2YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICBzaXplID0gc2VsZi5lbHR0eXBlLnNpemVvZgorICAgICAgICBpZiBzaXplIDwgNTEyOgorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IGludCAoNTEyIC8gc2l6ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSAxCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKworICAgICAgICBkZWx0YV9uID0gZW5kWydfTV9ub2RlJ10gLSBzdGFydFsnX01fbm9kZSddIC0gMQorICAgICAgICBkZWx0YV9zID0gc3RhcnRbJ19NX2xhc3QnXSAtIHN0YXJ0WydfTV9jdXInXQorICAgICAgICBkZWx0YV9lID0gZW5kWydfTV9jdXInXSAtIGVuZFsnX01fZmlyc3QnXQorCisgICAgICAgIHNpemUgPSBzZWxmLmJ1ZmZlcl9zaXplICogZGVsdGFfbiArIGRlbHRhX3MgKyBkZWx0YV9lCisKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCBsb25nIChzaXplKSkKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgc3RhcnQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddCisgICAgICAgIGVuZCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyKHN0YXJ0WydfTV9ub2RlJ10sIHN0YXJ0WydfTV9jdXInXSwgc3RhcnRbJ19NX2xhc3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kWydfTV9jdXInXSwgc2VsZi5idWZmZXJfc2l6ZSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ2FycmF5JworCitjbGFzcyBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjpkZXF1ZTo6aXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1ciddLmRlcmVmZXJlbmNlKCkKKworY2xhc3MgU3RkU3RyaW5nUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OmJhc2ljX3N0cmluZyBvZiBzb21lIGtpbmQiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSAmc3RyaW5nIHdvcmtzLCB0b28uCisgICAgICAgIHR5cGUgPSBzZWxmLnZhbC50eXBlCisgICAgICAgIGlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRhcmdldCAoKQorCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRvX3N0cmluZyByZXR1cm5zCisgICAgICAgICMgdGhlIHN0cmluZyBhY2NvcmRpbmcgdG8gbGVuZ3RoLCBub3QgYWNjb3JkaW5nIHRvIGZpcnN0IG51bGwKKyAgICAgICAgIyBlbmNvdW50ZXJlZC4KKyAgICAgICAgcHRyID0gc2VsZi52YWwgWydfTV9kYXRhcGx1cyddWydfTV9wJ10KKyAgICAgICAgcmVhbHR5cGUgPSB0eXBlLnVucXVhbGlmaWVkICgpLnN0cmlwX3R5cGVkZWZzICgpCisgICAgICAgIHJlcHR5cGUgPSBnZGIubG9va3VwX3R5cGUgKHN0ciAocmVhbHR5cGUpICsgJzo6X1JlcCcpLnBvaW50ZXIgKCkKKyAgICAgICAgaGVhZGVyID0gcHRyLmNhc3QocmVwdHlwZSkgLSAxCisgICAgICAgIGxlbiA9IGhlYWRlci5kZXJlZmVyZW5jZSAoKVsnX01fbGVuZ3RoJ10KKyAgICAgICAgaWYgaGFzYXR0cihwdHIsICJsYXp5X3N0cmluZyIpOgorICAgICAgICAgICAgcmV0dXJuIHB0ci5sYXp5X3N0cmluZyAobGVuZ3RoID0gbGVuKQorICAgICAgICByZXR1cm4gcHRyLnN0cmluZyAobGVuZ3RoID0gbGVuKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnc3RyaW5nJworCitjbGFzcyBUcjFIYXNodGFibGVJdGVyYXRvcjoKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIGhhc2gpOgorICAgICAgICBzZWxmLm5vZGUgPSBoYXNoWydfTV9iZWZvcmVfYmVnaW4nXVsnX01fbnh0J10KKyAgICAgICAgc2VsZi5ub2RlX3R5cGUgPSBmaW5kX3R5cGUoaGFzaC50eXBlLCAnX05vZGUnKS5wb2ludGVyKCkKKworICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgIGlmIHNlbGYubm9kZSA9PSAwOgorICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICBub2RlID0gc2VsZi5ub2RlLmNhc3Qoc2VsZi5ub2RlX3R5cGUpCisgICAgICAgIHJlc3VsdCA9IG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fdiddCisgICAgICAgIHNlbGYubm9kZSA9IG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fbnh0J10KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCitjbGFzcyBUcjFVbm9yZGVyZWRTZXRQcmludGVyOgorICAgICJQcmludCBhIHRyMTo6dW5vcmRlcmVkX3NldCIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHJldHVybiAnJXMgd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwgc2VsZi52YWxbJ19NX2VsZW1lbnRfY291bnQnXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X2NvdW50IChpKToKKyAgICAgICAgcmV0dXJuICdbJWRdJyAlIGkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGNvdW50ZXIgPSBpdGVydG9vbHMuaW1hcCAoc2VsZi5mb3JtYXRfY291bnQsIGl0ZXJ0b29scy5jb3VudCgpKQorICAgICAgICByZXR1cm4gaXRlcnRvb2xzLml6aXAgKGNvdW50ZXIsIFRyMUhhc2h0YWJsZUl0ZXJhdG9yIChzZWxmLnZhbCkpCisKK2NsYXNzIFRyMVVub3JkZXJlZE1hcFByaW50ZXI6CisgICAgIlByaW50IGEgdHIxOjp1bm9yZGVyZWRfbWFwIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCBzZWxmLnZhbFsnX01fZWxlbWVudF9jb3VudCddKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmbGF0dGVuIChsaXN0KToKKyAgICAgICAgZm9yIGVsdCBpbiBsaXN0OgorICAgICAgICAgICAgZm9yIGkgaW4gZWx0OgorICAgICAgICAgICAgICAgIHlpZWxkIGkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X29uZSAoZWx0KToKKyAgICAgICAgcmV0dXJuIChlbHRbJ2ZpcnN0J10sIGVsdFsnc2Vjb25kJ10pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF9jb3VudCAoaSk6CisgICAgICAgIHJldHVybiAnWyVkXScgJSBpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICBjb3VudGVyID0gaXRlcnRvb2xzLmltYXAgKHNlbGYuZm9ybWF0X2NvdW50LCBpdGVydG9vbHMuY291bnQoKSkKKyAgICAgICAgIyBNYXAgb3ZlciB0aGUgaGFzaCB0YWJsZSBhbmQgZmxhdHRlbiB0aGUgcmVzdWx0LgorICAgICAgICBkYXRhID0gc2VsZi5mbGF0dGVuIChpdGVydG9vbHMuaW1hcCAoc2VsZi5mb3JtYXRfb25lLCBUcjFIYXNodGFibGVJdGVyYXRvciAoc2VsZi52YWwpKSkKKyAgICAgICAgIyBaaXAgdGhlIHR3byBpdGVyYXRvcnMgdG9nZXRoZXIuCisgICAgICAgIHJldHVybiBpdGVydG9vbHMuaXppcCAoY291bnRlciwgZGF0YSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ21hcCcKKworY2xhc3MgU3RkRm9yd2FyZExpc3RQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6Zm9yd2FyZF9saXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFzZSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsdCA9IHNlbGYuYmFzZS5jYXN0KHNlbGYubm9kZXR5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGVsdFsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0WydfTV92YWx1ZSddKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Iobm9kZXR5cGUsIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2hlYWQnXSkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2hlYWQnXVsnX01fbmV4dCddID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzJyAlIChzZWxmLnR5cGVuYW1lKQorICAgICAgICByZXR1cm4gJyVzJyAlIChzZWxmLnR5cGVuYW1lKQorCisKKyMgQSAicmVndWxhciBleHByZXNzaW9uIiBwcmludGVyIHdoaWNoIGNvbmZvcm1zIHRvIHRoZQorIyAiU3ViUHJldHR5UHJpbnRlciIgcHJvdG9jb2wgZnJvbSBnZGIucHJpbnRpbmcuCitjbGFzcyBSeFByaW50ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVuY3Rpb24pOgorICAgICAgICBzdXBlcihSeFByaW50ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gZnVuY3Rpb24KKyAgICAgICAgc2VsZi5lbmFibGVkID0gVHJ1ZQorCisgICAgZGVmIGludm9rZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmVuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5mdW5jdGlvbihzZWxmLm5hbWUsIHZhbHVlKQorCisjIEEgcHJldHR5LXByaW50ZXIgdGhhdCBjb25mb3JtcyB0byB0aGUgIlByZXR0eVByaW50ZXIiIHByb3RvY29sIGZyb20KKyMgZ2RiLnByaW50aW5nLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBkaXJlY3RseSBhcyBhbiBvbGQtc3R5bGUgcHJpbnRlci4KK2NsYXNzIFByaW50ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHN1cGVyKFByaW50ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnN1YnByaW50ZXJzID0gW10KKyAgICAgICAgc2VsZi5sb29rdXAgPSB7fQorICAgICAgICBzZWxmLmVuYWJsZWQgPSBUcnVlCisgICAgICAgIHNlbGYuY29tcGlsZWRfcnggPSByZS5jb21waWxlKCdeKFthLXpBLVowLTlfOl0rKTwuKj4kJykKKworICAgIGRlZiBhZGQoc2VsZiwgbmFtZSwgZnVuY3Rpb24pOgorICAgICAgICAjIEEgc21hbGwgc2FuaXR5IGNoZWNrLgorICAgICAgICAjIEZJWE1FCisgICAgICAgIGlmIG5vdCBzZWxmLmNvbXBpbGVkX3J4Lm1hdGNoKG5hbWUgKyAnPD4nKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdsaWJzdGRjKysgcHJvZ3JhbW1pbmcgZXJyb3I6ICIlcyIgZG9lcyBub3QgbWF0Y2gnICUgbmFtZQorICAgICAgICBwcmludGVyID0gUnhQcmludGVyKG5hbWUsIGZ1bmN0aW9uKQorICAgICAgICBzZWxmLnN1YnByaW50ZXJzLmFwcGVuZChwcmludGVyKQorICAgICAgICBzZWxmLmxvb2t1cFtuYW1lXSA9IHByaW50ZXIKKworICAgICMgQWRkIGEgbmFtZSB1c2luZyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTi4KKyAgICBkZWYgYWRkX3ZlcnNpb24oc2VsZiwgYmFzZSwgbmFtZSwgZnVuY3Rpb24pOgorICAgICAgICBzZWxmLmFkZChiYXNlICsgbmFtZSwgZnVuY3Rpb24pCisgICAgICAgIHNlbGYuYWRkKGJhc2UgKyAnX183OjonICsgbmFtZSwgZnVuY3Rpb24pCisKKyAgICAjIEFkZCBhIG5hbWUgdXNpbmcgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUi4KKyAgICBkZWYgYWRkX2NvbnRhaW5lcihzZWxmLCBiYXNlLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgIHNlbGYuYWRkX3ZlcnNpb24oYmFzZSwgbmFtZSwgZnVuY3Rpb24pCisgICAgICAgIHNlbGYuYWRkX3ZlcnNpb24oYmFzZSArICdfX2N4eDE5OTg6OicsIG5hbWUsIGZ1bmN0aW9uKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBnZXRfYmFzaWNfdHlwZSh0eXBlKToKKyAgICAgICAgIyBJZiBpdCBwb2ludHMgdG8gYSByZWZlcmVuY2UsIGdldCB0aGUgcmVmZXJlbmNlLgorICAgICAgICBpZiB0eXBlLmNvZGUgPT0gZ2RiLlRZUEVfQ09ERV9SRUY6CisgICAgICAgICAgICB0eXBlID0gdHlwZS50YXJnZXQgKCkKKworICAgICAgICAjIEdldCB0aGUgdW5xdWFsaWZpZWQgdHlwZSwgc3RyaXBwZWQgb2YgdHlwZWRlZnMuCisgICAgICAgIHR5cGUgPSB0eXBlLnVucXVhbGlmaWVkICgpLnN0cmlwX3R5cGVkZWZzICgpCisKKyAgICAgICAgcmV0dXJuIHR5cGUudGFnCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgdmFsKToKKyAgICAgICAgdHlwZW5hbWUgPSBzZWxmLmdldF9iYXNpY190eXBlKHZhbC50eXBlKQorICAgICAgICBpZiBub3QgdHlwZW5hbWU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgQWxsIHRoZSB0eXBlcyB3ZSBtYXRjaCBhcmUgdGVtcGxhdGUgdHlwZXMsIHNvIHdlIGNhbiB1c2UgYQorICAgICAgICAjIGRpY3Rpb25hcnkuCisgICAgICAgIG1hdGNoID0gc2VsZi5jb21waWxlZF9yeC5tYXRjaCh0eXBlbmFtZSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBiYXNlbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIGlmIGJhc2VuYW1lIGluIHNlbGYubG9va3VwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9va3VwW2Jhc2VuYW1lXS5pbnZva2UodmFsKQorCisgICAgICAgICMgQ2Fubm90IGZpbmQgYSBwcmV0dHkgcHJpbnRlci4gIFJldHVybiBOb25lLgorICAgICAgICByZXR1cm4gTm9uZQorCitsaWJzdGRjeHhfcHJpbnRlciA9IE5vbmUKKworZGVmIHJlZ2lzdGVyX2xpYnN0ZGN4eF9wcmludGVycyAob2JqKToKKyAgICAiUmVnaXN0ZXIgbGlic3RkYysrIHByZXR0eS1wcmludGVycyB3aXRoIG9iamZpbGUgT2JqLiIKKworICAgIGdsb2JhbCBfdXNlX2dkYl9wcAorICAgIGdsb2JhbCBsaWJzdGRjeHhfcHJpbnRlcgorCisgICAgaWYgX3VzZV9nZGJfcHA6CisgICAgICAgIGdkYi5wcmludGluZy5yZWdpc3Rlcl9wcmV0dHlfcHJpbnRlcihvYmosIGxpYnN0ZGN4eF9wcmludGVyKQorICAgIGVsc2U6CisgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgb2JqID0gZ2RiCisgICAgICAgIG9iai5wcmV0dHlfcHJpbnRlcnMuYXBwZW5kKGxpYnN0ZGN4eF9wcmludGVyKQorCitkZWYgYnVpbGRfbGlic3RkY3h4X2RpY3Rpb25hcnkgKCk6CisgICAgZ2xvYmFsIGxpYnN0ZGN4eF9wcmludGVyCisKKyAgICBsaWJzdGRjeHhfcHJpbnRlciA9IFByaW50ZXIoImxpYnN0ZGMrKy12NiIpCisKKyAgICAjIEZvciBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTi4KKyAgICB2ZXJzID0gJyhfXzc6Oik/JworICAgICMgRm9yIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9DT05UQUlORVIuCisgICAgY29udGFpbmVyID0gJyhfX2N4eDE5OTg6OicgKyB2ZXJzICsgJyk/JworCisgICAgIyBsaWJzdGRjKysgb2JqZWN0cyByZXF1aXJpbmcgcHJldHR5LXByaW50aW5nLgorICAgICMgSW4gb3JkZXIgZnJvbToKKyAgICAjIGh0dHA6Ly9nY2MuZ251Lm9yZy9vbmxpbmVkb2NzL2xpYnN0ZGMrKy9sYXRlc3QtZG94eWdlbi9hMDE4NDcuaHRtbAorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdiYXNpY19zdHJpbmcnLCBTdGRTdHJpbmdQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ2JpdHNldCcsIFN0ZEJpdHNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnZGVxdWUnLCBTdGREZXF1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnbGlzdCcsIFN0ZExpc3RQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ21hcCcsIFN0ZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnbXVsdGltYXAnLCBTdGRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ211bHRpc2V0JywgU3RkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAncHJpb3JpdHlfcXVldWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3F1ZXVlJywgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAndHVwbGUnLCBTdGRUdXBsZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnc2V0JywgU3RkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAnc3RhY2snLCBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICd1bmlxdWVfcHRyJywgVW5pcXVlUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAndmVjdG9yJywgU3RkVmVjdG9yUHJpbnRlcikKKyAgICAjIHZlY3Rvcjxib29sPgorCisgICAgIyBQcmludGVyIHJlZ2lzdHJhdGlvbnMgZm9yIGNsYXNzZXMgY29tcGlsZWQgd2l0aCAtRF9HTElCQ1hYX0RFQlVHLgorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpiaXRzZXQnLCBTdGRCaXRzZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpkZXF1ZScsIFN0ZERlcXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6bGlzdCcsIFN0ZExpc3RQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjptYXAnLCBTdGRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjptdWx0aW1hcCcsIFN0ZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6Om11bHRpc2V0JywgU3RkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6cHJpb3JpdHlfcXVldWUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpxdWV1ZScsIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnNldCcsIFN0ZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnN0YWNrJywgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6dW5pcXVlX3B0cicsIFVuaXF1ZVBvaW50ZXJQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp2ZWN0b3InLCBTdGRWZWN0b3JQcmludGVyKQorCisgICAgIyBUaGVzZSBhcmUgdGhlIFRSMSBhbmQgQysrMHggcHJpbnRlcnMuCisgICAgIyBGb3IgYXJyYXkgLSB0aGUgZGVmYXVsdCBHREIgcHJldHR5LXByaW50ZXIgc2VlbXMgcmVhc29uYWJsZS4KKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAnc2hhcmVkX3B0cicsIFNoYXJlZFBvaW50ZXJQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICd3ZWFrX3B0cicsIFNoYXJlZFBvaW50ZXJQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ3Vub3JkZXJlZF9tYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd1bm9yZGVyZWRfc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAndW5vcmRlcmVkX211bHRpbWFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAndW5vcmRlcmVkX211bHRpc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnZm9yd2FyZF9saXN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZEZvcndhcmRMaXN0UHJpbnRlcikKKworICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3NoYXJlZF9wdHInLCBTaGFyZWRQb2ludGVyUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICd3ZWFrX3B0cicsIFNoYXJlZFBvaW50ZXJQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3Vub3JkZXJlZF9tYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAndW5vcmRlcmVkX3NldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICd1bm9yZGVyZWRfbXVsdGltYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAndW5vcmRlcmVkX211bHRpc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRTZXRQcmludGVyKQorCisgICAgIyBUaGVzZSBhcmUgdGhlIEMrKzB4IHByaW50ZXIgcmVnaXN0cmF0aW9ucyBmb3IgLURfR0xJQkNYWF9ERUJVRyBjYXNlcy4KKyAgICAjIFRoZSB0cjEgbmFtZXNwYWNlIHByaW50ZXJzIGRvIG5vdCBzZWVtIHRvIGhhdmUgYW55IGRlYnVnCisgICAgIyBlcXVpdmFsZW50cywgc28gZG8gbm8gcmVnaXN0ZXIgdGhlbS4KKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX21hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9zZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfbXVsdGltYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfbXVsdGlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpmb3J3YXJkX2xpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRGb3J3YXJkTGlzdFByaW50ZXIpCisKKworICAgICMgRXh0ZW5zaW9ucy4KKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignX19nbnVfY3h4OjonLCAnc2xpc3QnLCBTdGRTbGlzdFByaW50ZXIpCisKKyAgICBpZiBUcnVlOgorICAgICAgICAjIFRoZXNlIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGlmIEdEQiAicHJpbnQgKmkiIHdvcmtlZC4KKyAgICAgICAgIyBCdXQgaXQgb2Z0ZW4gZG9lc24ndCwgc28gaGVyZSB0aGV5IGFyZS4KKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnX0xpc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZExpc3RJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ19MaXN0X2NvbnN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRMaXN0SXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAnX1JiX3RyZWVfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRSYnRyZWVJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdfUmJfdHJlZV9jb25zdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFJidHJlZUl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnX0RlcXVlX2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnX0RlcXVlX2NvbnN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ19fZ251X2N4eDo6JywgJ19fbm9ybWFsX2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkVmVjdG9ySXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignX19nbnVfY3h4OjonLCAnX1NsaXN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkU2xpc3RJdGVyYXRvclByaW50ZXIpCisKKyAgICAgICAgIyBEZWJ1ZyAoY29tcGlsZWQgd2l0aCAtRF9HTElCQ1hYX0RFQlVHKSBwcmludGVyCisgICAgICAgICMgcmVnaXN0cmF0aW9ucy4gIFRoZSBSYl90cmVlIGRlYnVnIGl0ZXJhdG9yIHdoZW4gdW53cmFwcGVkCisgICAgICAgICMgZnJvbSB0aGUgZW5jYXBzdWxhdGluZyBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3IgZG9lcyBub3QKKyAgICAgICAgIyBoYXZlIHRoZSBfX25vcm0gbmFtZXNwYWNlLiBKdXN0IHVzZSB0aGUgZXhpc3RpbmcgcHJpbnRlcgorICAgICAgICAjIHJlZ2lzdHJhdGlvbiBmb3IgdGhhdC4KKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRGVidWdJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX25vcm06Ol9MaXN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZExpc3RJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX25vcm06Ol9MaXN0X2NvbnN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZExpc3RJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX25vcm06Ol9EZXF1ZV9jb25zdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fbm9ybTo6X0RlcXVlX2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKQorCitidWlsZF9saWJzdGRjeHhfZGljdGlvbmFyeSAoKQpkaWZmIC0tZ2l0IGEvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC44L19faW5pdF9fLnB5IGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL2xpYnN0ZGN4eC9nY2MtNC44L19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTM3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjgvX19pbml0X18ucHkKQEAgLTAsMCArMSBAQAorCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjgvcHJpbnRlcnMucHkgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvbGlic3RkY3h4L2djYy00LjgvcHJpbnRlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZmMjAwNwotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9saWJzdGRjeHgvZ2NjLTQuOC9wcmludGVycy5weQpAQCAtMCwwICsxLDEwNDQgQEAKKyMgUHJldHR5LXByaW50ZXJzIGZvciBsaWJzdGMrKy4KKworIyBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworaW1wb3J0IGdkYgoraW1wb3J0IGl0ZXJ0b29scworaW1wb3J0IHJlCisKKyMgVHJ5IHRvIHVzZSB0aGUgbmV3LXN0eWxlIHByZXR0eS1wcmludGluZyBpZiBhdmFpbGFibGUuCitfdXNlX2dkYl9wcCA9IFRydWUKK3RyeToKKyAgICBpbXBvcnQgZ2RiLnByaW50aW5nCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgX3VzZV9nZGJfcHAgPSBGYWxzZQorCisjIFRyeSB0byBpbnN0YWxsIHR5cGUtcHJpbnRlcnMuCitfdXNlX3R5cGVfcHJpbnRpbmcgPSBGYWxzZQordHJ5OgorICAgIGltcG9ydCBnZGIudHlwZXMKKyAgICBpZiBoYXNhdHRyKGdkYi50eXBlcywgJ1R5cGVQcmludGVyJyk6CisgICAgICAgIF91c2VfdHlwZV9wcmludGluZyA9IFRydWUKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBwYXNzCisKKyMgU3RhcnRpbmcgd2l0aCB0aGUgdHlwZSBPUklHLCBzZWFyY2ggZm9yIHRoZSBtZW1iZXIgdHlwZSBOQU1FLiAgVGhpcworIyBoYW5kbGVzIHNlYXJjaGluZyB1cHdhcmQgdGhyb3VnaCBzdXBlcmNsYXNzZXMuICBUaGlzIGlzIG5lZWRlZCB0bworIyB3b3JrIGFyb3VuZCBodHRwOi8vc291cmNld2FyZS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTEzNjE1LgorZGVmIGZpbmRfdHlwZShvcmlnLCBuYW1lKToKKyAgICB0eXAgPSBvcmlnLnN0cmlwX3R5cGVkZWZzKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgICBzZWFyY2ggPSBzdHIodHlwKSArICc6OicgKyBuYW1lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBnZGIubG9va3VwX3R5cGUoc2VhcmNoKQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRoZSB0eXBlIHdhcyBub3QgZm91bmQsIHNvIHRyeSB0aGUgc3VwZXJjbGFzcy4gIFdlIG9ubHkgbmVlZAorICAgICAgICAjIHRvIGNoZWNrIHRoZSBmaXJzdCBzdXBlcmNsYXNzLCBzbyB3ZSBkb24ndCBib3RoZXIgd2l0aAorICAgICAgICAjIGFueXRoaW5nIGZhbmNpZXIgaGVyZS4KKyAgICAgICAgZmllbGQgPSB0eXAuZmllbGRzKClbMF0KKyAgICAgICAgaWYgbm90IGZpZWxkLmlzX2Jhc2VfY2xhc3M6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiQ2Fubm90IGZpbmQgdHlwZSAlczo6JXMiICUgKHN0cihvcmlnKSwgbmFtZSkKKyAgICAgICAgdHlwID0gZmllbGQudHlwZQorCitjbGFzcyBTaGFyZWRQb2ludGVyUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzaGFyZWRfcHRyIG9yIHdlYWtfcHRyIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgc3RhdGUgPSAnZW1wdHknCisgICAgICAgIHJlZmNvdW50cyA9IHNlbGYudmFsWydfTV9yZWZjb3VudCddWydfTV9waSddCisgICAgICAgIGlmIHJlZmNvdW50cyAhPSAwOgorICAgICAgICAgICAgdXNlY291bnQgPSByZWZjb3VudHNbJ19NX3VzZV9jb3VudCddCisgICAgICAgICAgICB3ZWFrY291bnQgPSByZWZjb3VudHNbJ19NX3dlYWtfY291bnQnXQorICAgICAgICAgICAgaWYgdXNlY291bnQgPT0gMDoKKyAgICAgICAgICAgICAgICBzdGF0ZSA9ICdleHBpcmVkLCB3ZWFrICVkJyAlIHdlYWtjb3VudAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzdGF0ZSA9ICdjb3VudCAlZCwgd2VhayAlZCcgJSAodXNlY291bnQsIHdlYWtjb3VudCAtIDEpCisgICAgICAgIHJldHVybiAnJXMgKCVzKSAlcycgJSAoc2VsZi50eXBlbmFtZSwgc3RhdGUsIHNlbGYudmFsWydfTV9wdHInXSkKKworY2xhc3MgVW5pcXVlUG9pbnRlclByaW50ZXI6CisgICAgIlByaW50IGEgdW5pcXVlX3B0ciIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdiA9IHNlbGYudmFsWydfTV90J11bJ19NX2hlYWRfaW1wbCddCisgICAgICAgIHJldHVybiAoJ3N0ZDo6dW5pcXVlX3B0cjwlcz4gY29udGFpbmluZyAlcycgJSAoc3RyKHYudHlwZS50YXJnZXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKHYpKSkKKworY2xhc3MgU3RkTGlzdFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpsaXN0IgorCisgICAgY2xhc3MgX2l0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbm9kZXR5cGUsIGhlYWQpOgorICAgICAgICAgICAgc2VsZi5ub2RldHlwZSA9IG5vZGV0eXBlCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBoZWFkWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuaGVhZCA9IGhlYWQuYWRkcmVzcworICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5iYXNlID09IHNlbGYuaGVhZDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBlbHQgPSBzZWxmLmJhc2UuY2FzdChzZWxmLm5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBlbHRbJ19NX25leHQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIGVsdFsnX01fZGF0YSddKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Iobm9kZXR5cGUsIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX25vZGUnXSkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX25vZGUnXS5hZGRyZXNzID09IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX25vZGUnXVsnX01fbmV4dCddOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSAlcycgJSAoc2VsZi50eXBlbmFtZSkKKyAgICAgICAgcmV0dXJuICclcycgJSAoc2VsZi50eXBlbmFtZSkKKworY2xhc3MgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjpsaXN0OjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBub2RldHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX05vZGUnKQorICAgICAgICBub2RldHlwZSA9IG5vZGV0eXBlLnN0cmlwX3R5cGVkZWZzKCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01fbm9kZSddLmNhc3Qobm9kZXR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX2RhdGEnXQorCitjbGFzcyBTdGRTbGlzdFByaW50ZXI6CisgICAgIlByaW50IGEgX19nbnVfY3h4OjpzbGlzdCIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGV0eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZXR5cGUgPSBub2RldHlwZQorICAgICAgICAgICAgc2VsZi5iYXNlID0gaGVhZFsnX01faGVhZCddWydfTV9uZXh0J10KKyAgICAgICAgICAgIHNlbGYuY291bnQgPSAwCisKKyAgICAgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuYmFzZSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGVsdCA9IHNlbGYuYmFzZS5jYXN0KHNlbGYubm9kZXR5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuYmFzZSA9IGVsdFsnX01fbmV4dCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWx0WydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgY2hpbGRyZW4oc2VsZik6CisgICAgICAgIG5vZGV0eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfTm9kZScpCisgICAgICAgIG5vZGV0eXBlID0gbm9kZXR5cGUuc3RyaXBfdHlwZWRlZnMoKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXJhdG9yKG5vZGV0eXBlLCBzZWxmLnZhbCkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9oZWFkJ11bJ19NX25leHQnXSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICdlbXB0eSBfX2dudV9jeHg6OnNsaXN0JworICAgICAgICByZXR1cm4gJ19fZ251X2N4eDo6c2xpc3QnCisKK2NsYXNzIFN0ZFNsaXN0SXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBfX2dudV9jeHg6OnNsaXN0OjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIG5vZGV0eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfTm9kZScpCisgICAgICAgIG5vZGV0eXBlID0gbm9kZXR5cGUuc3RyaXBfdHlwZWRlZnMoKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9ub2RlJ10uY2FzdChub2RldHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fZGF0YSddCisKK2NsYXNzIFN0ZFZlY3RvclByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjp2ZWN0b3IiCisKKyAgICBjbGFzcyBfaXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgc3RhcnQsIGZpbmlzaCwgYml0dmVjKToKKyAgICAgICAgICAgIHNlbGYuYml0dmVjID0gYml0dmVjCisgICAgICAgICAgICBpZiBiaXR2ZWM6CisgICAgICAgICAgICAgICAgc2VsZi5pdGVtICAgPSBzdGFydFsnX01fcCddCisgICAgICAgICAgICAgICAgc2VsZi5zbyAgICAgPSBzdGFydFsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaCA9IGZpbmlzaFsnX01fcCddCisgICAgICAgICAgICAgICAgc2VsZi5mbyAgICAgPSBmaW5pc2hbJ19NX29mZnNldCddCisgICAgICAgICAgICAgICAgaXR5cGUgPSBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKS50eXBlCisgICAgICAgICAgICAgICAgc2VsZi5pc2l6ZSA9IDggKiBpdHlwZS5zaXplb2YKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc3RhcnQKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaCA9IGZpbmlzaAorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIGlmIHNlbGYuYml0dmVjOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSBzZWxmLmZpbmlzaCBhbmQgc2VsZi5zbyA+PSBzZWxmLmZvOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWx0ID0gc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICBpZiBlbHQgJiAoMSA8PCBzZWxmLnNvKToKKyAgICAgICAgICAgICAgICAgICAgb2JpdCA9IDEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBvYml0ID0gMAorICAgICAgICAgICAgICAgIHNlbGYuc28gPSBzZWxmLnNvICsgMQorICAgICAgICAgICAgICAgIGlmIHNlbGYuc28gPj0gc2VsZi5pc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc2VsZi5pdGVtICsgMQorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvID0gMAorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIG9iaXQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSBzZWxmLmZpbmlzaDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIGVsdCA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc2VsZi5pdGVtICsgMQorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIGVsdCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYuaXNfYm9vbCA9IHZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApLmNvZGUgID09IGdkYi5UWVBFX0NPREVfQk9PTAorCisgICAgZGVmIGNoaWxkcmVuKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Ioc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pc19ib29sKQorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgc3RhcnQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddCisgICAgICAgIGZpbmlzaCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddCisgICAgICAgIGVuZCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2VuZF9vZl9zdG9yYWdlJ10KKyAgICAgICAgaWYgc2VsZi5pc19ib29sOgorICAgICAgICAgICAgc3RhcnQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddWydfTV9wJ10KKyAgICAgICAgICAgIHNvICAgID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fc3RhcnQnXVsnX01fb2Zmc2V0J10KKyAgICAgICAgICAgIGZpbmlzaCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddWydfTV9wJ10KKyAgICAgICAgICAgIGZvICAgICA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgaXR5cGUgPSBzdGFydC5kZXJlZmVyZW5jZSgpLnR5cGUKKyAgICAgICAgICAgIGJsID0gOCAqIGl0eXBlLnNpemVvZgorICAgICAgICAgICAgbGVuZ3RoICAgPSAoYmwgLSBzbykgKyBibCAqICgoZmluaXNoIC0gc3RhcnQpIC0gMSkgKyBmbworICAgICAgICAgICAgY2FwYWNpdHkgPSBibCAqIChlbmQgLSBzdGFydCkKKyAgICAgICAgICAgIHJldHVybiAoJyVzPGJvb2w+IG9mIGxlbmd0aCAlZCwgY2FwYWNpdHkgJWQnCisgICAgICAgICAgICAgICAgICAgICUgKHNlbGYudHlwZW5hbWUsIGludCAobGVuZ3RoKSwgaW50IChjYXBhY2l0eSkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICgnJXMgb2YgbGVuZ3RoICVkLCBjYXBhY2l0eSAlZCcKKyAgICAgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgaW50IChmaW5pc2ggLSBzdGFydCksIGludCAoZW5kIC0gc3RhcnQpKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKK2NsYXNzIFN0ZFZlY3Rvckl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjp2ZWN0b3I6Oml0ZXJhdG9yIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIHRvX3N0cmluZyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9jdXJyZW50J10uZGVyZWZlcmVuY2UoKQorCitjbGFzcyBTdGRUdXBsZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjp0dXBsZSIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYuaGVhZCA9IGhlYWQKKworICAgICAgICAgICAgIyBTZXQgdGhlIGJhc2UgY2xhc3MgYXMgdGhlIGluaXRpYWwgaGVhZCBvZiB0aGUKKyAgICAgICAgICAgICMgdHVwbGUuCisgICAgICAgICAgICBub2RlcyA9IHNlbGYuaGVhZC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgPT0gMToKKyAgICAgICAgICAgICAgICAjIFNldCB0aGUgYWN0dWFsIGhlYWQgdG8gdGhlIGZpcnN0IHBhaXIuCisgICAgICAgICAgICAgICAgc2VsZi5oZWFkICA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1swXS50eXBlKQorICAgICAgICAgICAgZWxpZiBsZW4gKG5vZGVzKSAhPSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJUb3Agb2YgdHVwbGUgdHJlZSBkb2VzIG5vdCBjb25zaXN0IG9mIGEgc2luZ2xlIG5vZGUuIgorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBub2RlcyA9IHNlbGYuaGVhZC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgIyBDaGVjayBmb3IgZnVydGhlciByZWN1cnNpb25zIGluIHRoZSBpbmhlcml0YW5jZSB0cmVlLgorICAgICAgICAgICAgaWYgbGVuIChub2RlcykgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAjIENoZWNrIHRoYXQgdGhpcyBpdGVyYXRpb24gaGFzIGFuIGV4cGVjdGVkIHN0cnVjdHVyZS4KKyAgICAgICAgICAgIGlmIGxlbiAobm9kZXMpICE9IDI6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIkNhbm5vdCBwYXJzZSBtb3JlIHRoYW4gMiBub2RlcyBpbiBhIHR1cGxlIHRyZWUuIgorCisgICAgICAgICAgICAjIC0gTGVmdCBub2RlIGlzIHRoZSBuZXh0IHJlY3Vyc2lvbiBwYXJlbnQuCisgICAgICAgICAgICAjIC0gUmlnaHQgbm9kZSBpcyB0aGUgYWN0dWFsIGNsYXNzIGNvbnRhaW5lZCBpbiB0aGUgdHVwbGUuCisKKyAgICAgICAgICAgICMgUHJvY2VzcyByaWdodCBub2RlLgorICAgICAgICAgICAgaW1wbCA9IHNlbGYuaGVhZC5jYXN0IChub2Rlc1sxXS50eXBlKQorCisgICAgICAgICAgICAjIFByb2Nlc3MgbGVmdCBub2RlIGFuZCBzZXQgaXQgYXMgaGVhZC4KKyAgICAgICAgICAgIHNlbGYuaGVhZCAgPSBzZWxmLmhlYWQuY2FzdCAobm9kZXNbMF0udHlwZSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorCisgICAgICAgICAgICAjIEZpbmFsbHksIGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbi4gIElmIGl0IGlzCisgICAgICAgICAgICAjIHdyYXBwZWQgaW4gX01faGVhZF9pbXBsIHJldHVybiB0aGF0LCBvdGhlcndpc2UgcmV0dXJuCisgICAgICAgICAgICAjIHRoZSB2YWx1ZSAiYXMgaXMiLgorICAgICAgICAgICAgZmllbGRzID0gaW1wbC50eXBlLmZpZWxkcyAoKQorICAgICAgICAgICAgaWYgbGVuIChmaWVsZHMpIDwgMSBvciBmaWVsZHNbMF0ubmFtZSAhPSAiX01faGVhZF9pbXBsIjoKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIHNlbGYuY291bnQsIGltcGwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgc2VsZi5jb3VudCwgaW1wbFsnX01faGVhZF9pbXBsJ10pCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWw7CisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3IgKHNlbGYudmFsKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIGlmIGxlbiAoc2VsZi52YWwudHlwZS5maWVsZHMgKCkpID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzJyAlIChzZWxmLnR5cGVuYW1lKQorICAgICAgICByZXR1cm4gJyVzIGNvbnRhaW5pbmcnICUgKHNlbGYudHlwZW5hbWUpCisKK2NsYXNzIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpzdGFjayBvciBzdGQ6OnF1ZXVlIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmlzdWFsaXplciA9IGdkYi5kZWZhdWx0X3Zpc3VhbGl6ZXIodmFsWydjJ10pCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52aXN1YWxpemVyLmNoaWxkcmVuKCkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdyYXBwaW5nOiAlcycgJSAoc2VsZi50eXBlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmlzdWFsaXplci50b19zdHJpbmcoKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyIChzZWxmLnZpc3VhbGl6ZXIsICdkaXNwbGF5X2hpbnQnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuZGlzcGxheV9oaW50ICgpCisgICAgICAgIHJldHVybiBOb25lCisKK2NsYXNzIFJidHJlZUl0ZXJhdG9yOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByYnRyZWUpOgorICAgICAgICBzZWxmLnNpemUgPSByYnRyZWVbJ19NX3QnXVsnX01faW1wbCddWydfTV9ub2RlX2NvdW50J10KKyAgICAgICAgc2VsZi5ub2RlID0gcmJ0cmVlWydfTV90J11bJ19NX2ltcGwnXVsnX01faGVhZGVyJ11bJ19NX2xlZnQnXQorICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZgorCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgIHJldHVybiBpbnQgKHNlbGYuc2l6ZSkKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNvdW50ID09IHNlbGYuc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ub2RlCisgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICBpZiBzZWxmLmNvdW50IDwgc2VsZi5zaXplOgorICAgICAgICAgICAgIyBDb21wdXRlIHRoZSBuZXh0IG5vZGUuCisgICAgICAgICAgICBub2RlID0gc2VsZi5ub2RlCisgICAgICAgICAgICBpZiBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J106CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcmlnaHQnXQorICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fbGVmdCddOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9sZWZ0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGFyZW50ID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9wYXJlbnQnXQorICAgICAgICAgICAgICAgIHdoaWxlIG5vZGUgPT0gcGFyZW50LmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J106CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmRlcmVmZXJlbmNlKClbJ19NX3BhcmVudCddCisgICAgICAgICAgICAgICAgaWYgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddICE9IHBhcmVudDoKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudAorICAgICAgICAgICAgc2VsZi5ub2RlID0gbm9kZQorICAgICAgICByZXR1cm4gcmVzdWx0CisKKyMgVGhpcyBpcyBhIHByZXR0eSBwcmludGVyIGZvciBzdGQ6Ol9SYl90cmVlX2l0ZXJhdG9yICh3aGljaCBpcworIyBzdGQ6Om1hcDo6aXRlcmF0b3IpLCBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgUmJ0cmVlSXRlcmF0b3IKKyMgY2xhc3MgYWJvdmUuCitjbGFzcyBTdGRSYnRyZWVJdGVyYXRvclByaW50ZXI6CisgICAgIlByaW50IHN0ZDo6bWFwOjppdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdHlwZW5hbWUgPSBzdHIoc2VsZi52YWwudHlwZS5zdHJpcF90eXBlZGVmcygpKSArICc6Ol9MaW5rX3R5cGUnCisgICAgICAgIG5vZGV0eXBlID0gZ2RiLmxvb2t1cF90eXBlKHR5cGVuYW1lKS5zdHJpcF90eXBlZGVmcygpCisgICAgICAgIHJldHVybiBzZWxmLnZhbC5jYXN0KG5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpWydfTV92YWx1ZV9maWVsZCddCisKK2NsYXNzIFN0ZERlYnVnSXRlcmF0b3JQcmludGVyOgorICAgICJQcmludCBhIGRlYnVnIGVuYWJsZWQgdmVyc2lvbiBvZiBhbiBpdGVyYXRvciIKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICAjIEp1c3Qgc3RyaXAgYXdheSB0aGUgZW5jYXBzdWxhdGluZyBfX2dudV9kZWJ1Zzo6X1NhZmVfaXRlcmF0b3IKKyAgICAjIGFuZCByZXR1cm4gdGhlIHdyYXBwZWQgaXRlcmF0b3IgdmFsdWUuCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIGl0eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1cnJlbnQnXS5jYXN0KGl0eXBlKQorCitjbGFzcyBTdGRNYXBQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6bWFwIG9yIHN0ZDo6bXVsdGltYXAiCisKKyAgICAjIFR1cm4gYW4gUmJ0cmVlSXRlcmF0b3IgaW50byBhIHByZXR0eS1wcmludCBpdGVyYXRvci4KKyAgICBjbGFzcyBfaXRlcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHJiaXRlciwgdHlwZSk6CisgICAgICAgICAgICBzZWxmLnJiaXRlciA9IHJiaXRlcgorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKyAgICAgICAgICAgIHNlbGYudHlwZSA9IHR5cGUKKworICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICAgICAgaWYgc2VsZi5jb3VudCAlIDIgPT0gMDoKKyAgICAgICAgICAgICAgICBuID0gc2VsZi5yYml0ZXIubmV4dCgpCisgICAgICAgICAgICAgICAgbiA9IG4uY2FzdChzZWxmLnR5cGUpLmRlcmVmZXJlbmNlKClbJ19NX3ZhbHVlX2ZpZWxkJ10KKyAgICAgICAgICAgICAgICBzZWxmLnBhaXIgPSBuCisgICAgICAgICAgICAgICAgaXRlbSA9IG5bJ2ZpcnN0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaXRlbSA9IHNlbGYucGFpclsnc2Vjb25kJ10KKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBpdGVtKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICByZXR1cm4gJyVzIHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpKSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHJlcF90eXBlID0gZmluZF90eXBlKHNlbGYudmFsLnR5cGUsICdfUmVwX3R5cGUnKQorICAgICAgICBub2RlID0gZmluZF90eXBlKHJlcF90eXBlLCAnX0xpbmtfdHlwZScpCisgICAgICAgIG5vZGUgPSBub2RlLnN0cmlwX3R5cGVkZWZzKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX2l0ZXIgKFJidHJlZUl0ZXJhdG9yIChzZWxmLnZhbCksIG5vZGUpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdtYXAnCisKK2NsYXNzIFN0ZFNldFByaW50ZXI6CisgICAgIlByaW50IGEgc3RkOjpzZXQgb3Igc3RkOjptdWx0aXNldCIKKworICAgICMgVHVybiBhbiBSYnRyZWVJdGVyYXRvciBpbnRvIGEgcHJldHR5LXByaW50IGl0ZXJhdG9yLgorICAgIGNsYXNzIF9pdGVyOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcmJpdGVyLCB0eXBlKToKKyAgICAgICAgICAgIHNlbGYucmJpdGVyID0gcmJpdGVyCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorICAgICAgICAgICAgc2VsZi50eXBlID0gdHlwZQorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpdGVtID0gc2VsZi5yYml0ZXIubmV4dCgpCisgICAgICAgICAgICBpdGVtID0gaXRlbS5jYXN0KHNlbGYudHlwZSkuZGVyZWZlcmVuY2UoKVsnX01fdmFsdWVfZmllbGQnXQorICAgICAgICAgICAgIyBGSVhNRTogdGhpcyBpcyB3ZWlyZCAuLi4gd2hhdCB0byBkbz8KKyAgICAgICAgICAgICMgTWF5YmUgYSAnc2V0JyBkaXNwbGF5IGhpbnQ/CisgICAgICAgICAgICByZXN1bHQgPSAoJ1slZF0nICUgc2VsZi5jb3VudCwgaXRlbSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgPSBzZWxmLmNvdW50ICsgMQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiAoUmJ0cmVlSXRlcmF0b3IgKHNlbGYudmFsKSkpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICByZXBfdHlwZSA9IGZpbmRfdHlwZShzZWxmLnZhbC50eXBlLCAnX1JlcF90eXBlJykKKyAgICAgICAgbm9kZSA9IGZpbmRfdHlwZShyZXBfdHlwZSwgJ19MaW5rX3R5cGUnKQorICAgICAgICBub2RlID0gbm9kZS5zdHJpcF90eXBlZGVmcygpCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpLCBub2RlKQorCitjbGFzcyBTdGRCaXRzZXRQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6Yml0c2V0IgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICAjIElmIHRlbXBsYXRlX2FyZ3VtZW50IGhhbmRsZWQgdmFsdWVzLCB3ZSBjb3VsZCBwcmludCB0aGUKKyAgICAgICAgIyBzaXplLiAgT3Igd2UgY291bGQgdXNlIGEgcmVnZXhwIG9uIHRoZSB0eXBlLgorICAgICAgICByZXR1cm4gJyVzJyAlIChzZWxmLnR5cGVuYW1lKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgd29yZHMgPSBzZWxmLnZhbFsnX01fdyddCisgICAgICAgIHd0eXBlID0gd29yZHMudHlwZQorCisgICAgICAgICMgVGhlIF9NX3cgbWVtYmVyIGNhbiBiZSBlaXRoZXIgYW4gdW5zaWduZWQgbG9uZywgb3IgYW4KKyAgICAgICAgIyBhcnJheS4gIFRoaXMgZGVwZW5kcyBvbiB0aGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdXNlZC4KKyAgICAgICAgIyBJZiBpdCBpcyBhIHNpbmdsZSBsb25nLCBjb252ZXJ0IHRvIGEgc2luZ2xlIGVsZW1lbnQgbGlzdC4KKyAgICAgICAgaWYgd3R5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX0FSUkFZOgorICAgICAgICAgICAgdHNpemUgPSB3dHlwZS50YXJnZXQgKCkuc2l6ZW9mCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3b3JkcyA9IFt3b3Jkc10KKyAgICAgICAgICAgIHRzaXplID0gd3R5cGUuc2l6ZW9mIAorCisgICAgICAgIG53b3JkcyA9IHd0eXBlLnNpemVvZiAvIHRzaXplCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIGJ5dGUgPSAwCisgICAgICAgIHdoaWxlIGJ5dGUgPCBud29yZHM6CisgICAgICAgICAgICB3ID0gd29yZHNbYnl0ZV0KKyAgICAgICAgICAgIGJpdCA9IDAKKyAgICAgICAgICAgIHdoaWxlIHcgIT0gMDoKKyAgICAgICAgICAgICAgICBpZiAodyAmIDEpICE9IDA6CisgICAgICAgICAgICAgICAgICAgICMgQW5vdGhlciBzcG90IHdoZXJlIHdlIGNvdWxkIHVzZSAnc2V0Jz8KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgoJ1slZF0nICUgKGJ5dGUgKiB0c2l6ZSAqIDggKyBiaXQpLCAxKSkKKyAgICAgICAgICAgICAgICBiaXQgPSBiaXQgKyAxCisgICAgICAgICAgICAgICAgdyA9IHcgPj4gMQorICAgICAgICAgICAgYnl0ZSA9IGJ5dGUgKyAxCisgICAgICAgIHJldHVybiByZXN1bHQKKworY2xhc3MgU3RkRGVxdWVQcmludGVyOgorICAgICJQcmludCBhIHN0ZDo6ZGVxdWUiCisKKyAgICBjbGFzcyBfaXRlcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGUsIHN0YXJ0LCBlbmQsIGxhc3QsIGJ1ZmZlcl9zaXplKToKKyAgICAgICAgICAgIHNlbGYubm9kZSA9IG5vZGUKKyAgICAgICAgICAgIHNlbGYucCA9IHN0YXJ0CisgICAgICAgICAgICBzZWxmLmVuZCA9IGVuZAorICAgICAgICAgICAgc2VsZi5sYXN0ID0gbGFzdAorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLnAgPT0gc2VsZi5sYXN0OgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworICAgICAgICAgICAgcmVzdWx0ID0gKCdbJWRdJyAlIHNlbGYuY291bnQsIHNlbGYucC5kZXJlZmVyZW5jZSgpKQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IHNlbGYuY291bnQgKyAxCisKKyAgICAgICAgICAgICMgQWR2YW5jZSB0aGUgJ2N1cicgcG9pbnRlci4KKyAgICAgICAgICAgIHNlbGYucCA9IHNlbGYucCArIDEKKyAgICAgICAgICAgIGlmIHNlbGYucCA9PSBzZWxmLmVuZDoKKyAgICAgICAgICAgICAgICAjIElmIHdlIGdvdCB0byB0aGUgZW5kIG9mIHRoaXMgYnVja2V0LCBtb3ZlIHRvIHRoZQorICAgICAgICAgICAgICAgICMgbmV4dCBidWNrZXQuCisgICAgICAgICAgICAgICAgc2VsZi5ub2RlID0gc2VsZi5ub2RlICsgMQorICAgICAgICAgICAgICAgIHNlbGYucCA9IHNlbGYubm9kZVswXQorICAgICAgICAgICAgICAgIHNlbGYuZW5kID0gc2VsZi5wICsgc2VsZi5idWZmZXJfc2l6ZQorCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0CisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLmVsdHR5cGUgPSB2YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICBzaXplID0gc2VsZi5lbHR0eXBlLnNpemVvZgorICAgICAgICBpZiBzaXplIDwgNTEyOgorICAgICAgICAgICAgc2VsZi5idWZmZXJfc2l6ZSA9IGludCAoNTEyIC8gc2l6ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSAxCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICBzdGFydCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX3N0YXJ0J10KKyAgICAgICAgZW5kID0gc2VsZi52YWxbJ19NX2ltcGwnXVsnX01fZmluaXNoJ10KKworICAgICAgICBkZWx0YV9uID0gZW5kWydfTV9ub2RlJ10gLSBzdGFydFsnX01fbm9kZSddIC0gMQorICAgICAgICBkZWx0YV9zID0gc3RhcnRbJ19NX2xhc3QnXSAtIHN0YXJ0WydfTV9jdXInXQorICAgICAgICBkZWx0YV9lID0gZW5kWydfTV9jdXInXSAtIGVuZFsnX01fZmlyc3QnXQorCisgICAgICAgIHNpemUgPSBzZWxmLmJ1ZmZlcl9zaXplICogZGVsdGFfbiArIGRlbHRhX3MgKyBkZWx0YV9lCisKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCBsb25nIChzaXplKSkKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgc3RhcnQgPSBzZWxmLnZhbFsnX01faW1wbCddWydfTV9zdGFydCddCisgICAgICAgIGVuZCA9IHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2ZpbmlzaCddCisgICAgICAgIHJldHVybiBzZWxmLl9pdGVyKHN0YXJ0WydfTV9ub2RlJ10sIHN0YXJ0WydfTV9jdXInXSwgc3RhcnRbJ19NX2xhc3QnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kWydfTV9jdXInXSwgc2VsZi5idWZmZXJfc2l6ZSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ2FycmF5JworCitjbGFzcyBTdGREZXF1ZUl0ZXJhdG9yUHJpbnRlcjoKKyAgICAiUHJpbnQgc3RkOjpkZXF1ZTo6aXRlcmF0b3IiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2N1ciddLmRlcmVmZXJlbmNlKCkKKworY2xhc3MgU3RkU3RyaW5nUHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OmJhc2ljX3N0cmluZyBvZiBzb21lIGtpbmQiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSAmc3RyaW5nIHdvcmtzLCB0b28uCisgICAgICAgIHR5cGUgPSBzZWxmLnZhbC50eXBlCisgICAgICAgIGlmIHR5cGUuY29kZSA9PSBnZGIuVFlQRV9DT0RFX1JFRjoKKyAgICAgICAgICAgIHR5cGUgPSB0eXBlLnRhcmdldCAoKQorCisgICAgICAgICMgQ2FsY3VsYXRlIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRvX3N0cmluZyByZXR1cm5zCisgICAgICAgICMgdGhlIHN0cmluZyBhY2NvcmRpbmcgdG8gbGVuZ3RoLCBub3QgYWNjb3JkaW5nIHRvIGZpcnN0IG51bGwKKyAgICAgICAgIyBlbmNvdW50ZXJlZC4KKyAgICAgICAgcHRyID0gc2VsZi52YWwgWydfTV9kYXRhcGx1cyddWydfTV9wJ10KKyAgICAgICAgcmVhbHR5cGUgPSB0eXBlLnVucXVhbGlmaWVkICgpLnN0cmlwX3R5cGVkZWZzICgpCisgICAgICAgIHJlcHR5cGUgPSBnZGIubG9va3VwX3R5cGUgKHN0ciAocmVhbHR5cGUpICsgJzo6X1JlcCcpLnBvaW50ZXIgKCkKKyAgICAgICAgaGVhZGVyID0gcHRyLmNhc3QocmVwdHlwZSkgLSAxCisgICAgICAgIGxlbiA9IGhlYWRlci5kZXJlZmVyZW5jZSAoKVsnX01fbGVuZ3RoJ10KKyAgICAgICAgaWYgaGFzYXR0cihwdHIsICJsYXp5X3N0cmluZyIpOgorICAgICAgICAgICAgcmV0dXJuIHB0ci5sYXp5X3N0cmluZyAobGVuZ3RoID0gbGVuKQorICAgICAgICByZXR1cm4gcHRyLnN0cmluZyAobGVuZ3RoID0gbGVuKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnc3RyaW5nJworCitjbGFzcyBUcjFIYXNodGFibGVJdGVyYXRvcjoKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIGhhc2gpOgorICAgICAgICBzZWxmLm5vZGUgPSBoYXNoWydfTV9iYmVnaW4nXVsnX01fbm9kZSddWydfTV9ueHQnXQorICAgICAgICBzZWxmLm5vZGVfdHlwZSA9IGZpbmRfdHlwZShoYXNoLnR5cGUsICdfX25vZGVfdHlwZScpLnBvaW50ZXIoKQorCisgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5ub2RlID09IDA6CisgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgIG5vZGUgPSBzZWxmLm5vZGUuY2FzdChzZWxmLm5vZGVfdHlwZSkKKyAgICAgICAgcmVzdWx0ID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV92J10KKyAgICAgICAgc2VsZi5ub2RlID0gbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9ueHQnXQorICAgICAgICByZXR1cm4gcmVzdWx0CisKK2NsYXNzIFRyMVVub3JkZXJlZFNldFByaW50ZXI6CisgICAgIlByaW50IGEgdHIxOjp1bm9yZGVyZWRfc2V0IgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgaGFzaHRhYmxlIChzZWxmKToKKyAgICAgICAgaWYgc2VsZi50eXBlbmFtZS5zdGFydHN3aXRoKCdzdGQ6OnRyMScpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01faCddCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCBzZWxmLmhhc2h0YWJsZSgpWydfTV9lbGVtZW50X2NvdW50J10pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZvcm1hdF9jb3VudCAoaSk6CisgICAgICAgIHJldHVybiAnWyVkXScgJSBpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICBjb3VudGVyID0gaXRlcnRvb2xzLmltYXAgKHNlbGYuZm9ybWF0X2NvdW50LCBpdGVydG9vbHMuY291bnQoKSkKKyAgICAgICAgcmV0dXJuIGl0ZXJ0b29scy5pemlwIChjb3VudGVyLCBUcjFIYXNodGFibGVJdGVyYXRvciAoc2VsZi5oYXNodGFibGUoKSkpCisKK2NsYXNzIFRyMVVub3JkZXJlZE1hcFByaW50ZXI6CisgICAgIlByaW50IGEgdHIxOjp1bm9yZGVyZWRfbWFwIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgaGFzaHRhYmxlIChzZWxmKToKKyAgICAgICAgaWYgc2VsZi50eXBlbmFtZS5zdGFydHN3aXRoKCdzdGQ6OnRyMScpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsCisgICAgICAgIHJldHVybiBzZWxmLnZhbFsnX01faCddCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgcmV0dXJuICclcyB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCBzZWxmLmhhc2h0YWJsZSgpWydfTV9lbGVtZW50X2NvdW50J10pCisKKyAgICBAc3RhdGljbWV0aG9kCisgICAgZGVmIGZsYXR0ZW4gKGxpc3QpOgorICAgICAgICBmb3IgZWx0IGluIGxpc3Q6CisgICAgICAgICAgICBmb3IgaSBpbiBlbHQ6CisgICAgICAgICAgICAgICAgeWllbGQgaQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBmb3JtYXRfb25lIChlbHQpOgorICAgICAgICByZXR1cm4gKGVsdFsnZmlyc3QnXSwgZWx0WydzZWNvbmQnXSkKKworICAgIEBzdGF0aWNtZXRob2QKKyAgICBkZWYgZm9ybWF0X2NvdW50IChpKToKKyAgICAgICAgcmV0dXJuICdbJWRdJyAlIGkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIGNvdW50ZXIgPSBpdGVydG9vbHMuaW1hcCAoc2VsZi5mb3JtYXRfY291bnQsIGl0ZXJ0b29scy5jb3VudCgpKQorICAgICAgICAjIE1hcCBvdmVyIHRoZSBoYXNoIHRhYmxlIGFuZCBmbGF0dGVuIHRoZSByZXN1bHQuCisgICAgICAgIGRhdGEgPSBzZWxmLmZsYXR0ZW4gKGl0ZXJ0b29scy5pbWFwIChzZWxmLmZvcm1hdF9vbmUsIFRyMUhhc2h0YWJsZUl0ZXJhdG9yIChzZWxmLmhhc2h0YWJsZSgpKSkpCisgICAgICAgICMgWmlwIHRoZSB0d28gaXRlcmF0b3JzIHRvZ2V0aGVyLgorICAgICAgICByZXR1cm4gaXRlcnRvb2xzLml6aXAgKGNvdW50ZXIsIGRhdGEpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdtYXAnCisKK2NsYXNzIFN0ZEZvcndhcmRMaXN0UHJpbnRlcjoKKyAgICAiUHJpbnQgYSBzdGQ6OmZvcndhcmRfbGlzdCIKKworICAgIGNsYXNzIF9pdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5vZGV0eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZXR5cGUgPSBub2RldHlwZQorICAgICAgICAgICAgc2VsZi5iYXNlID0gaGVhZFsnX01fbmV4dCddCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgZGVmIG5leHQoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmJhc2UgPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBlbHQgPSBzZWxmLmJhc2UuY2FzdChzZWxmLm5vZGV0eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICBzZWxmLmJhc2UgPSBlbHRbJ19NX25leHQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ID0gc2VsZi5jb3VudCArIDEKKyAgICAgICAgICAgIHZhbHB0ciA9IGVsdFsnX01fc3RvcmFnZSddLmFkZHJlc3MKKyAgICAgICAgICAgIHZhbHB0ciA9IHZhbHB0ci5jYXN0KGVsdC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApLnBvaW50ZXIoKSkKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIHZhbHB0ci5kZXJlZmVyZW5jZSgpKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCA9IHZhbAorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKworICAgIGRlZiBjaGlsZHJlbihzZWxmKToKKyAgICAgICAgbm9kZXR5cGUgPSBmaW5kX3R5cGUoc2VsZi52YWwudHlwZSwgJ19Ob2RlJykKKyAgICAgICAgbm9kZXR5cGUgPSBub2RldHlwZS5zdHJpcF90eXBlZGVmcygpLnBvaW50ZXIoKQorICAgICAgICByZXR1cm4gc2VsZi5faXRlcmF0b3Iobm9kZXR5cGUsIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2hlYWQnXSkKKworICAgIGRlZiB0b19zdHJpbmcoc2VsZik6CisgICAgICAgIGlmIHNlbGYudmFsWydfTV9pbXBsJ11bJ19NX2hlYWQnXVsnX01fbmV4dCddID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzJyAlIChzZWxmLnR5cGVuYW1lKQorICAgICAgICByZXR1cm4gJyVzJyAlIChzZWxmLnR5cGVuYW1lKQorCisKKyMgQSAicmVndWxhciBleHByZXNzaW9uIiBwcmludGVyIHdoaWNoIGNvbmZvcm1zIHRvIHRoZQorIyAiU3ViUHJldHR5UHJpbnRlciIgcHJvdG9jb2wgZnJvbSBnZGIucHJpbnRpbmcuCitjbGFzcyBSeFByaW50ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVuY3Rpb24pOgorICAgICAgICBzdXBlcihSeFByaW50ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmZ1bmN0aW9uID0gZnVuY3Rpb24KKyAgICAgICAgc2VsZi5lbmFibGVkID0gVHJ1ZQorCisgICAgZGVmIGludm9rZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmVuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICByZXR1cm4gc2VsZi5mdW5jdGlvbihzZWxmLm5hbWUsIHZhbHVlKQorCisjIEEgcHJldHR5LXByaW50ZXIgdGhhdCBjb25mb3JtcyB0byB0aGUgIlByZXR0eVByaW50ZXIiIHByb3RvY29sIGZyb20KKyMgZ2RiLnByaW50aW5nLiAgSXQgY2FuIGFsc28gYmUgdXNlZCBkaXJlY3RseSBhcyBhbiBvbGQtc3R5bGUgcHJpbnRlci4KK2NsYXNzIFByaW50ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHN1cGVyKFByaW50ZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLnN1YnByaW50ZXJzID0gW10KKyAgICAgICAgc2VsZi5sb29rdXAgPSB7fQorICAgICAgICBzZWxmLmVuYWJsZWQgPSBUcnVlCisgICAgICAgIHNlbGYuY29tcGlsZWRfcnggPSByZS5jb21waWxlKCdeKFthLXpBLVowLTlfOl0rKTwuKj4kJykKKworICAgIGRlZiBhZGQoc2VsZiwgbmFtZSwgZnVuY3Rpb24pOgorICAgICAgICAjIEEgc21hbGwgc2FuaXR5IGNoZWNrLgorICAgICAgICAjIEZJWE1FCisgICAgICAgIGlmIG5vdCBzZWxmLmNvbXBpbGVkX3J4Lm1hdGNoKG5hbWUgKyAnPD4nKToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdsaWJzdGRjKysgcHJvZ3JhbW1pbmcgZXJyb3I6ICIlcyIgZG9lcyBub3QgbWF0Y2gnICUgbmFtZQorICAgICAgICBwcmludGVyID0gUnhQcmludGVyKG5hbWUsIGZ1bmN0aW9uKQorICAgICAgICBzZWxmLnN1YnByaW50ZXJzLmFwcGVuZChwcmludGVyKQorICAgICAgICBzZWxmLmxvb2t1cFtuYW1lXSA9IHByaW50ZXIKKworICAgICMgQWRkIGEgbmFtZSB1c2luZyBfR0xJQkNYWF9CRUdJTl9OQU1FU1BBQ0VfVkVSU0lPTi4KKyAgICBkZWYgYWRkX3ZlcnNpb24oc2VsZiwgYmFzZSwgbmFtZSwgZnVuY3Rpb24pOgorICAgICAgICBzZWxmLmFkZChiYXNlICsgbmFtZSwgZnVuY3Rpb24pCisgICAgICAgIHNlbGYuYWRkKGJhc2UgKyAnX183OjonICsgbmFtZSwgZnVuY3Rpb24pCisKKyAgICAjIEFkZCBhIG5hbWUgdXNpbmcgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUi4KKyAgICBkZWYgYWRkX2NvbnRhaW5lcihzZWxmLCBiYXNlLCBuYW1lLCBmdW5jdGlvbik6CisgICAgICAgIHNlbGYuYWRkX3ZlcnNpb24oYmFzZSwgbmFtZSwgZnVuY3Rpb24pCisgICAgICAgIHNlbGYuYWRkX3ZlcnNpb24oYmFzZSArICdfX2N4eDE5OTg6OicsIG5hbWUsIGZ1bmN0aW9uKQorCisgICAgQHN0YXRpY21ldGhvZAorICAgIGRlZiBnZXRfYmFzaWNfdHlwZSh0eXBlKToKKyAgICAgICAgIyBJZiBpdCBwb2ludHMgdG8gYSByZWZlcmVuY2UsIGdldCB0aGUgcmVmZXJlbmNlLgorICAgICAgICBpZiB0eXBlLmNvZGUgPT0gZ2RiLlRZUEVfQ09ERV9SRUY6CisgICAgICAgICAgICB0eXBlID0gdHlwZS50YXJnZXQgKCkKKworICAgICAgICAjIEdldCB0aGUgdW5xdWFsaWZpZWQgdHlwZSwgc3RyaXBwZWQgb2YgdHlwZWRlZnMuCisgICAgICAgIHR5cGUgPSB0eXBlLnVucXVhbGlmaWVkICgpLnN0cmlwX3R5cGVkZWZzICgpCisKKyAgICAgICAgcmV0dXJuIHR5cGUudGFnCisKKyAgICBkZWYgX19jYWxsX18oc2VsZiwgdmFsKToKKyAgICAgICAgdHlwZW5hbWUgPSBzZWxmLmdldF9iYXNpY190eXBlKHZhbC50eXBlKQorICAgICAgICBpZiBub3QgdHlwZW5hbWU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgQWxsIHRoZSB0eXBlcyB3ZSBtYXRjaCBhcmUgdGVtcGxhdGUgdHlwZXMsIHNvIHdlIGNhbiB1c2UgYQorICAgICAgICAjIGRpY3Rpb25hcnkuCisgICAgICAgIG1hdGNoID0gc2VsZi5jb21waWxlZF9yeC5tYXRjaCh0eXBlbmFtZSkKKyAgICAgICAgaWYgbm90IG1hdGNoOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBiYXNlbmFtZSA9IG1hdGNoLmdyb3VwKDEpCisgICAgICAgIGlmIGJhc2VuYW1lIGluIHNlbGYubG9va3VwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9va3VwW2Jhc2VuYW1lXS5pbnZva2UodmFsKQorCisgICAgICAgICMgQ2Fubm90IGZpbmQgYSBwcmV0dHkgcHJpbnRlci4gIFJldHVybiBOb25lLgorICAgICAgICByZXR1cm4gTm9uZQorCitsaWJzdGRjeHhfcHJpbnRlciA9IE5vbmUKKworY2xhc3MgRmlsdGVyaW5nVHlwZVByaW50ZXIob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2gsIG5hbWUpOgorICAgICAgICBzZWxmLm1hdGNoID0gbWF0Y2gKKyAgICAgICAgc2VsZi5uYW1lID0gbmFtZQorICAgICAgICBzZWxmLmVuYWJsZWQgPSBUcnVlCisKKyAgICBjbGFzcyBfcmVjb2duaXplcihvYmplY3QpOgorICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbWF0Y2gsIG5hbWUpOgorICAgICAgICAgICAgc2VsZi5tYXRjaCA9IG1hdGNoCisgICAgICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgICAgICBzZWxmLnR5cGVfb2JqID0gTm9uZQorCisgICAgICAgIGRlZiByZWNvZ25pemUoc2VsZiwgdHlwZV9vYmopOgorICAgICAgICAgICAgaWYgdHlwZV9vYmoudGFnIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICAgICAgaWYgc2VsZi50eXBlX29iaiBpcyBOb25lOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLm1hdGNoIGluIHR5cGVfb2JqLnRhZzoKKyAgICAgICAgICAgICAgICAgICAgIyBGaWx0ZXIgZGlkbid0IG1hdGNoLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50eXBlX29iaiA9IGdkYi5sb29rdXBfdHlwZShzZWxmLm5hbWUpLnN0cmlwX3R5cGVkZWZzKCkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIHNlbGYudHlwZV9vYmogPT0gdHlwZV9vYmo6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYubmFtZQorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBpbnN0YW50aWF0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JlY29nbml6ZXIoc2VsZi5tYXRjaCwgc2VsZi5uYW1lKQorCitkZWYgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCBtYXRjaCwgbmFtZSk6CisgICAgcHJpbnRlciA9IEZpbHRlcmluZ1R5cGVQcmludGVyKG1hdGNoLCAnc3RkOjonICsgbmFtZSkKKyAgICBnZGIudHlwZXMucmVnaXN0ZXJfdHlwZV9wcmludGVyKG9iaiwgcHJpbnRlcikKKworZGVmIHJlZ2lzdGVyX3R5cGVfcHJpbnRlcnMob2JqKToKKyAgICBnbG9iYWwgX3VzZV90eXBlX3ByaW50aW5nCisKKyAgICBpZiBub3QgX3VzZV90eXBlX3ByaW50aW5nOgorICAgICAgICByZXR1cm4KKworICAgIGZvciBwZnggaW4gKCcnLCAndycpOgorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19zdHJpbmcnLCBwZnggKyAnc3RyaW5nJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfaW9zJywgcGZ4ICsgJ2lvcycpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX3N0cmVhbWJ1ZicsIHBmeCArICdzdHJlYW1idWYnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19pc3RyZWFtJywgcGZ4ICsgJ2lzdHJlYW0nKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19vc3RyZWFtJywgcGZ4ICsgJ29zdHJlYW0nKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19pb3N0cmVhbScsIHBmeCArICdpb3N0cmVhbScpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX3N0cmluZ2J1ZicsIHBmeCArICdzdHJpbmdidWYnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19pc3RyaW5nc3RyZWFtJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBmeCArICdpc3RyaW5nc3RyZWFtJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfb3N0cmluZ3N0cmVhbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZnggKyAnb3N0cmluZ3N0cmVhbScpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX3N0cmluZ3N0cmVhbScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZnggKyAnc3RyaW5nc3RyZWFtJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfZmlsZWJ1ZicsIHBmeCArICdmaWxlYnVmJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnYmFzaWNfaWZzdHJlYW0nLCBwZnggKyAnaWZzdHJlYW0nKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19vZnN0cmVhbScsIHBmeCArICdvZnN0cmVhbScpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX2ZzdHJlYW0nLCBwZnggKyAnZnN0cmVhbScpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Jhc2ljX3JlZ2V4JywgcGZ4ICsgJ3JlZ2V4JykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnc3ViX21hdGNoJywgcGZ4ICsgJ2NzdWJfbWF0Y2gnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdzdWJfbWF0Y2gnLCBwZnggKyAnc3N1Yl9tYXRjaCcpCisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ21hdGNoX3Jlc3VsdHMnLCBwZnggKyAnY21hdGNoJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnbWF0Y2hfcmVzdWx0cycsIHBmeCArICdzbWF0Y2gnKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdyZWdleF9pdGVyYXRvcicsIHBmeCArICdjcmVnZXhfaXRlcmF0b3InKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdyZWdleF9pdGVyYXRvcicsIHBmeCArICdzcmVnZXhfaXRlcmF0b3InKQorICAgICAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdyZWdleF90b2tlbl9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZnggKyAnY3JlZ2V4X3Rva2VuX2l0ZXJhdG9yJykKKyAgICAgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAncmVnZXhfdG9rZW5faXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGZ4ICsgJ3NyZWdleF90b2tlbl9pdGVyYXRvcicpCisKKyAgICAjIE5vdGUgdGhhdCB3ZSBjYW4ndCBoYXZlIGEgcHJpbnRlciBmb3Igc3RkOjp3c3RyZWFtcG9zLCBiZWNhdXNlCisgICAgIyBpdCBzaGFyZXMgdGhlIHNhbWUgdW5kZXJseWluZyB0eXBlIGFzIHN0ZDo6c3RyZWFtcG9zLgorICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Zwb3MnLCAnc3RyZWFtcG9zJykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19zdHJpbmcnLCAndTE2c3RyaW5nJykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdiYXNpY19zdHJpbmcnLCAndTMyc3RyaW5nJykKKworICAgIGZvciBkdXIgaW4gKCduYW5vc2Vjb25kcycsICdtaWNyb3NlY29uZHMnLCAnbWlsbGlzZWNvbmRzJywKKyAgICAgICAgICAgICAgICAnc2Vjb25kcycsICdtaW51dGVzJywgJ2hvdXJzJyk6CisgICAgICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2R1cmF0aW9uJywgZHVyKQorCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnbGluZWFyX2NvbmdydWVudGlhbF9lbmdpbmUnLCAnbWluc3RkX3JhbmQwJykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdsaW5lYXJfY29uZ3J1ZW50aWFsX2VuZ2luZScsICdtaW5zdGRfcmFuZCcpCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUnLCAnbXQxOTkzNycpCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUnLCAnbXQxOTkzN182NCcpCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUnLCAncmFubHV4MjRfYmFzZScpCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnc3VidHJhY3Rfd2l0aF9jYXJyeV9lbmdpbmUnLCAncmFubHV4NDhfYmFzZScpCisgICAgYWRkX29uZV90eXBlX3ByaW50ZXIob2JqLCAnZGlzY2FyZF9ibG9ja19lbmdpbmUnLCAncmFubHV4MjQnKQorICAgIGFkZF9vbmVfdHlwZV9wcmludGVyKG9iaiwgJ2Rpc2NhcmRfYmxvY2tfZW5naW5lJywgJ3Jhbmx1eDQ4JykKKyAgICBhZGRfb25lX3R5cGVfcHJpbnRlcihvYmosICdzaHVmZmxlX29yZGVyX2VuZ2luZScsICdrbnV0aF9iJykKKworZGVmIHJlZ2lzdGVyX2xpYnN0ZGN4eF9wcmludGVycyAob2JqKToKKyAgICAiUmVnaXN0ZXIgbGlic3RkYysrIHByZXR0eS1wcmludGVycyB3aXRoIG9iamZpbGUgT2JqLiIKKworICAgIGdsb2JhbCBfdXNlX2dkYl9wcAorICAgIGdsb2JhbCBsaWJzdGRjeHhfcHJpbnRlcgorCisgICAgaWYgX3VzZV9nZGJfcHA6CisgICAgICAgIGdkYi5wcmludGluZy5yZWdpc3Rlcl9wcmV0dHlfcHJpbnRlcihvYmosIGxpYnN0ZGN4eF9wcmludGVyKQorICAgIGVsc2U6CisgICAgICAgIGlmIG9iaiBpcyBOb25lOgorICAgICAgICAgICAgb2JqID0gZ2RiCisgICAgICAgIG9iai5wcmV0dHlfcHJpbnRlcnMuYXBwZW5kKGxpYnN0ZGN4eF9wcmludGVyKQorCisgICAgcmVnaXN0ZXJfdHlwZV9wcmludGVycyhvYmopCisKK2RlZiBidWlsZF9saWJzdGRjeHhfZGljdGlvbmFyeSAoKToKKyAgICBnbG9iYWwgbGlic3RkY3h4X3ByaW50ZXIKKworICAgIGxpYnN0ZGN4eF9wcmludGVyID0gUHJpbnRlcigibGlic3RkYysrLXY2IikKKworICAgICMgRm9yIF9HTElCQ1hYX0JFR0lOX05BTUVTUEFDRV9WRVJTSU9OLgorICAgIHZlcnMgPSAnKF9fNzo6KT8nCisgICAgIyBGb3IgX0dMSUJDWFhfQkVHSU5fTkFNRVNQQUNFX0NPTlRBSU5FUi4KKyAgICBjb250YWluZXIgPSAnKF9fY3h4MTk5ODo6JyArIHZlcnMgKyAnKT8nCisKKyAgICAjIGxpYnN0ZGMrKyBvYmplY3RzIHJlcXVpcmluZyBwcmV0dHktcHJpbnRpbmcuCisgICAgIyBJbiBvcmRlciBmcm9tOgorICAgICMgaHR0cDovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL2xhdGVzdC1kb3h5Z2VuL2EwMTg0Ny5odG1sCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ2Jhc2ljX3N0cmluZycsIFN0ZFN0cmluZ1ByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnYml0c2V0JywgU3RkQml0c2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdkZXF1ZScsIFN0ZERlcXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdsaXN0JywgU3RkTGlzdFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnbWFwJywgU3RkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdtdWx0aW1hcCcsIFN0ZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnbXVsdGlzZXQnLCBTdGRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdwcmlvcml0eV9xdWV1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjonLCAncXVldWUnLCBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICd0dXBsZScsIFN0ZFR1cGxlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdzZXQnLCBTdGRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdzdGFjaycsIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3VuaXF1ZV9wdHInLCBVbmlxdWVQb2ludGVyUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd2ZWN0b3InLCBTdGRWZWN0b3JQcmludGVyKQorICAgICMgdmVjdG9yPGJvb2w+CisKKyAgICAjIFByaW50ZXIgcmVnaXN0cmF0aW9ucyBmb3IgY2xhc3NlcyBjb21waWxlZCB3aXRoIC1EX0dMSUJDWFhfREVCVUcuCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OmJpdHNldCcsIFN0ZEJpdHNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OmRlcXVlJywgU3RkRGVxdWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpsaXN0JywgU3RkTGlzdFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6Om1hcCcsIFN0ZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6Om11bHRpbWFwJywgU3RkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6bXVsdGlzZXQnLCBTdGRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjpwcmlvcml0eV9xdWV1ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFN0YWNrT3JRdWV1ZVByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnF1ZXVlJywgU3RkU3RhY2tPclF1ZXVlUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6c2V0JywgU3RkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6c3RhY2snLCBTdGRTdGFja09yUXVldWVQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp1bmlxdWVfcHRyJywgVW5pcXVlUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnZlY3RvcicsIFN0ZFZlY3RvclByaW50ZXIpCisKKyAgICAjIFRoZXNlIGFyZSB0aGUgVFIxIGFuZCBDKysweCBwcmludGVycy4KKyAgICAjIEZvciBhcnJheSAtIHRoZSBkZWZhdWx0IEdEQiBwcmV0dHktcHJpbnRlciBzZWVtcyByZWFzb25hYmxlLgorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdzaGFyZWRfcHRyJywgU2hhcmVkUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ3dlYWtfcHRyJywgU2hhcmVkUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAndW5vcmRlcmVkX21hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRNYXBQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF9jb250YWluZXIoJ3N0ZDo6JywgJ3Vub3JkZXJlZF9zZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd1bm9yZGVyZWRfbXVsdGltYXAnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICd1bm9yZGVyZWRfbXVsdGlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkU2V0UHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdmb3J3YXJkX2xpc3QnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRm9yd2FyZExpc3RQcmludGVyKQorCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAnc2hhcmVkX3B0cicsIFNoYXJlZFBvaW50ZXJQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3dlYWtfcHRyJywgU2hhcmVkUG9pbnRlclByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6dHIxOjonLCAndW5vcmRlcmVkX21hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICd1bm9yZGVyZWRfc2V0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcjFVbm9yZGVyZWRTZXRQcmludGVyKQorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OnRyMTo6JywgJ3Vub3JkZXJlZF9tdWx0aW1hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignc3RkOjp0cjE6OicsICd1bm9yZGVyZWRfbXVsdGlzZXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisKKyAgICAjIFRoZXNlIGFyZSB0aGUgQysrMHggcHJpbnRlciByZWdpc3RyYXRpb25zIGZvciAtRF9HTElCQ1hYX0RFQlVHIGNhc2VzLgorICAgICMgVGhlIHRyMSBuYW1lc3BhY2UgcHJpbnRlcnMgZG8gbm90IHNlZW0gdG8gaGF2ZSBhbnkgZGVidWcKKyAgICAjIGVxdWl2YWxlbnRzLCBzbyBkbyBubyByZWdpc3RlciB0aGVtLgorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZCgnc3RkOjpfX2RlYnVnOjp1bm9yZGVyZWRfbWFwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHIxVW5vcmRlcmVkTWFwUHJpbnRlcikKKyAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19kZWJ1Zzo6dW5vcmRlcmVkX3NldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tdWx0aW1hcCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZE1hcFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OnVub3JkZXJlZF9tdWx0aXNldCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyMVVub3JkZXJlZFNldFByaW50ZXIpCisgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fZGVidWc6OmZvcndhcmRfbGlzdCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZEZvcndhcmRMaXN0UHJpbnRlcikKKworCisgICAgIyBFeHRlbnNpb25zLgorICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdfX2dudV9jeHg6OicsICdzbGlzdCcsIFN0ZFNsaXN0UHJpbnRlcikKKworICAgIGlmIFRydWU6CisgICAgICAgICMgVGhlc2Ugc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgaWYgR0RCICJwcmludCAqaSIgd29ya2VkLgorICAgICAgICAjIEJ1dCBpdCBvZnRlbiBkb2Vzbid0LCBzbyBoZXJlIHRoZXkgYXJlLgorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdfTGlzdF9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX2NvbnRhaW5lcignc3RkOjonLCAnX0xpc3RfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZExpc3RJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdzdGQ6OicsICdfUmJfdHJlZV9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZFJidHJlZUl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkX3ZlcnNpb24oJ3N0ZDo6JywgJ19SYl90cmVlX2NvbnN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkUmJ0cmVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdfRGVxdWVfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfY29udGFpbmVyKCdzdGQ6OicsICdfRGVxdWVfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGRfdmVyc2lvbignX19nbnVfY3h4OjonLCAnX19ub3JtYWxfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRWZWN0b3JJdGVyYXRvclByaW50ZXIpCisgICAgICAgIGxpYnN0ZGN4eF9wcmludGVyLmFkZF92ZXJzaW9uKCdfX2dudV9jeHg6OicsICdfU2xpc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGRTbGlzdEl0ZXJhdG9yUHJpbnRlcikKKworICAgICAgICAjIERlYnVnIChjb21waWxlZCB3aXRoIC1EX0dMSUJDWFhfREVCVUcpIHByaW50ZXIKKyAgICAgICAgIyByZWdpc3RyYXRpb25zLiAgVGhlIFJiX3RyZWUgZGVidWcgaXRlcmF0b3Igd2hlbiB1bndyYXBwZWQKKyAgICAgICAgIyBmcm9tIHRoZSBlbmNhcHN1bGF0aW5nIF9fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvciBkb2VzIG5vdAorICAgICAgICAjIGhhdmUgdGhlIF9fbm9ybSBuYW1lc3BhY2UuIEp1c3QgdXNlIHRoZSBleGlzdGluZyBwcmludGVyCisgICAgICAgICMgcmVnaXN0cmF0aW9uIGZvciB0aGF0LgorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ19fZ251X2RlYnVnOjpfU2FmZV9pdGVyYXRvcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGREZWJ1Z0l0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fbm9ybTo6X0xpc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fbm9ybTo6X0xpc3RfY29uc3RfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkTGlzdEl0ZXJhdG9yUHJpbnRlcikKKyAgICAgICAgbGlic3RkY3h4X3ByaW50ZXIuYWRkKCdzdGQ6Ol9fbm9ybTo6X0RlcXVlX2NvbnN0X2l0ZXJhdG9yJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0ZERlcXVlSXRlcmF0b3JQcmludGVyKQorICAgICAgICBsaWJzdGRjeHhfcHJpbnRlci5hZGQoJ3N0ZDo6X19ub3JtOjpfRGVxdWVfaXRlcmF0b3InLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RkRGVxdWVJdGVyYXRvclByaW50ZXIpCisKK2J1aWxkX2xpYnN0ZGN4eF9kaWN0aW9uYXJ5ICgpCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9DT1BZSU5HIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDMyNTQwCi0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvQ09QWUlORwpAQCAtMCwwICsxLDY3NiBAQAorCisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAzLCAyOSBKdW5lIDIwMDcKKworIENvcHlyaWdodCAoQykgMjAwNyBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4gPGh0dHA6Ly9mc2Yub3JnLz4KKyBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMKKyBvZiB0aGlzIGxpY2Vuc2UgZG9jdW1lbnQsIGJ1dCBjaGFuZ2luZyBpdCBpcyBub3QgYWxsb3dlZC4KKworCQkJICAgIFByZWFtYmxlCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGEgZnJlZSwgY29weWxlZnQgbGljZW5zZSBmb3IKK3NvZnR3YXJlIGFuZCBvdGhlciBraW5kcyBvZiB3b3Jrcy4KKworICBUaGUgbGljZW5zZXMgZm9yIG1vc3Qgc29mdHdhcmUgYW5kIG90aGVyIHByYWN0aWNhbCB3b3JrcyBhcmUgZGVzaWduZWQKK3RvIHRha2UgYXdheSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSB0aGUgd29ya3MuICBCeSBjb250cmFzdCwKK3RoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbnRlbmRlZCB0byBndWFyYW50ZWUgeW91ciBmcmVlZG9tIHRvCitzaGFyZSBhbmQgY2hhbmdlIGFsbCB2ZXJzaW9ucyBvZiBhIHByb2dyYW0tLXRvIG1ha2Ugc3VyZSBpdCByZW1haW5zIGZyZWUKK3NvZnR3YXJlIGZvciBhbGwgaXRzIHVzZXJzLiAgV2UsIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHVzZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3N0IG9mIG91ciBzb2Z0d2FyZTsgaXQgYXBwbGllcyBhbHNvIHRvCithbnkgb3RoZXIgd29yayByZWxlYXNlZCB0aGlzIHdheSBieSBpdHMgYXV0aG9ycy4gIFlvdSBjYW4gYXBwbHkgaXQgdG8KK3lvdXIgcHJvZ3JhbXMsIHRvby4KKworICBXaGVuIHdlIHNwZWFrIG9mIGZyZWUgc29mdHdhcmUsIHdlIGFyZSByZWZlcnJpbmcgdG8gZnJlZWRvbSwgbm90CitwcmljZS4gIE91ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlcyBhcmUgZGVzaWduZWQgdG8gbWFrZSBzdXJlIHRoYXQgeW91CitoYXZlIHRoZSBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yCit0aGVtIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQord2FudCBpdCwgdGhhdCB5b3UgY2FuIGNoYW5nZSB0aGUgc29mdHdhcmUgb3IgdXNlIHBpZWNlcyBvZiBpdCBpbiBuZXcKK2ZyZWUgcHJvZ3JhbXMsIGFuZCB0aGF0IHlvdSBrbm93IHlvdSBjYW4gZG8gdGhlc2UgdGhpbmdzLgorCisgIFRvIHByb3RlY3QgeW91ciByaWdodHMsIHdlIG5lZWQgdG8gcHJldmVudCBvdGhlcnMgZnJvbSBkZW55aW5nIHlvdQordGhlc2UgcmlnaHRzIG9yIGFza2luZyB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuICBUaGVyZWZvcmUsIHlvdSBoYXZlCitjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZSBzb2Z0d2FyZSwgb3IgaWYKK3lvdSBtb2RpZnkgaXQ6IHJlc3BvbnNpYmlsaXRpZXMgdG8gcmVzcGVjdCB0aGUgZnJlZWRvbSBvZiBvdGhlcnMuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlcgorZ3JhdGlzIG9yIGZvciBhIGZlZSwgeW91IG11c3QgcGFzcyBvbiB0byB0aGUgcmVjaXBpZW50cyB0aGUgc2FtZQorZnJlZWRvbXMgdGhhdCB5b3UgcmVjZWl2ZWQuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUKK29yIGNhbiBnZXQgdGhlIHNvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5Citrbm93IHRoZWlyIHJpZ2h0cy4KKworICBEZXZlbG9wZXJzIHRoYXQgdXNlIHRoZSBHTlUgR1BMIHByb3RlY3QgeW91ciByaWdodHMgd2l0aCB0d28gc3RlcHM6CisoMSkgYXNzZXJ0IGNvcHlyaWdodCBvbiB0aGUgc29mdHdhcmUsIGFuZCAoMikgb2ZmZXIgeW91IHRoaXMgTGljZW5zZQorZ2l2aW5nIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSBpdC4KKworICBGb3IgdGhlIGRldmVsb3BlcnMnIGFuZCBhdXRob3JzJyBwcm90ZWN0aW9uLCB0aGUgR1BMIGNsZWFybHkgZXhwbGFpbnMKK3RoYXQgdGhlcmUgaXMgbm8gd2FycmFudHkgZm9yIHRoaXMgZnJlZSBzb2Z0d2FyZS4gIEZvciBib3RoIHVzZXJzJyBhbmQKK2F1dGhvcnMnIHNha2UsIHRoZSBHUEwgcmVxdWlyZXMgdGhhdCBtb2RpZmllZCB2ZXJzaW9ucyBiZSBtYXJrZWQgYXMKK2NoYW5nZWQsIHNvIHRoYXQgdGhlaXIgcHJvYmxlbXMgd2lsbCBub3QgYmUgYXR0cmlidXRlZCBlcnJvbmVvdXNseSB0bworYXV0aG9ycyBvZiBwcmV2aW91cyB2ZXJzaW9ucy4KKworICBTb21lIGRldmljZXMgYXJlIGRlc2lnbmVkIHRvIGRlbnkgdXNlcnMgYWNjZXNzIHRvIGluc3RhbGwgb3IgcnVuCittb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgc29mdHdhcmUgaW5zaWRlIHRoZW0sIGFsdGhvdWdoIHRoZSBtYW51ZmFjdHVyZXIKK2NhbiBkbyBzby4gIFRoaXMgaXMgZnVuZGFtZW50YWxseSBpbmNvbXBhdGlibGUgd2l0aCB0aGUgYWltIG9mCitwcm90ZWN0aW5nIHVzZXJzJyBmcmVlZG9tIHRvIGNoYW5nZSB0aGUgc29mdHdhcmUuICBUaGUgc3lzdGVtYXRpYworcGF0dGVybiBvZiBzdWNoIGFidXNlIG9jY3VycyBpbiB0aGUgYXJlYSBvZiBwcm9kdWN0cyBmb3IgaW5kaXZpZHVhbHMgdG8KK3VzZSwgd2hpY2ggaXMgcHJlY2lzZWx5IHdoZXJlIGl0IGlzIG1vc3QgdW5hY2NlcHRhYmxlLiAgVGhlcmVmb3JlLCB3ZQoraGF2ZSBkZXNpZ25lZCB0aGlzIHZlcnNpb24gb2YgdGhlIEdQTCB0byBwcm9oaWJpdCB0aGUgcHJhY3RpY2UgZm9yIHRob3NlCitwcm9kdWN0cy4gIElmIHN1Y2ggcHJvYmxlbXMgYXJpc2Ugc3Vic3RhbnRpYWxseSBpbiBvdGhlciBkb21haW5zLCB3ZQorc3RhbmQgcmVhZHkgdG8gZXh0ZW5kIHRoaXMgcHJvdmlzaW9uIHRvIHRob3NlIGRvbWFpbnMgaW4gZnV0dXJlIHZlcnNpb25zCitvZiB0aGUgR1BMLCBhcyBuZWVkZWQgdG8gcHJvdGVjdCB0aGUgZnJlZWRvbSBvZiB1c2Vycy4KKworICBGaW5hbGx5LCBldmVyeSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZSBwYXRlbnRzLgorU3RhdGVzIHNob3VsZCBub3QgYWxsb3cgcGF0ZW50cyB0byByZXN0cmljdCBkZXZlbG9wbWVudCBhbmQgdXNlIG9mCitzb2Z0d2FyZSBvbiBnZW5lcmFsLXB1cnBvc2UgY29tcHV0ZXJzLCBidXQgaW4gdGhvc2UgdGhhdCBkbywgd2Ugd2lzaCB0bworYXZvaWQgdGhlIHNwZWNpYWwgZGFuZ2VyIHRoYXQgcGF0ZW50cyBhcHBsaWVkIHRvIGEgZnJlZSBwcm9ncmFtIGNvdWxkCittYWtlIGl0IGVmZmVjdGl2ZWx5IHByb3ByaWV0YXJ5LiAgVG8gcHJldmVudCB0aGlzLCB0aGUgR1BMIGFzc3VyZXMgdGhhdAorcGF0ZW50cyBjYW5ub3QgYmUgdXNlZCB0byByZW5kZXIgdGhlIHByb2dyYW0gbm9uLWZyZWUuCisKKyAgVGhlIHByZWNpc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGlvbiBhbmQKK21vZGlmaWNhdGlvbiBmb2xsb3cuCisKKwkJICAgICAgIFRFUk1TIEFORCBDT05ESVRJT05TCisKKyAgMC4gRGVmaW5pdGlvbnMuCisKKyAgIlRoaXMgTGljZW5zZSIgcmVmZXJzIHRvIHZlcnNpb24gMyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgIkNvcHlyaWdodCIgYWxzbyBtZWFucyBjb3B5cmlnaHQtbGlrZSBsYXdzIHRoYXQgYXBwbHkgdG8gb3RoZXIga2luZHMgb2YKK3dvcmtzLCBzdWNoIGFzIHNlbWljb25kdWN0b3IgbWFza3MuCisgCisgICJUaGUgUHJvZ3JhbSIgcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcworTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAgIkxpY2Vuc2VlcyIgYW5kCisicmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCisKKyAgVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yaworaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCitleGFjdCBjb3B5LiAgVGhlIHJlc3VsdGluZyB3b3JrIGlzIGNhbGxlZCBhICJtb2RpZmllZCB2ZXJzaW9uIiBvZiB0aGUKK2VhcmxpZXIgd29yayBvciBhIHdvcmsgImJhc2VkIG9uIiB0aGUgZWFybGllciB3b3JrLgorCisgIEEgImNvdmVyZWQgd29yayIgbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbS4KKworICBUbyAicHJvcGFnYXRlIiBhIHdvcmsgbWVhbnMgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCB0aGF0LCB3aXRob3V0CitwZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yCitpbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKK2NvbXB1dGVyIG9yIG1vZGlmeWluZyBhIHByaXZhdGUgY29weS4gIFByb3BhZ2F0aW9uIGluY2x1ZGVzIGNvcHlpbmcsCitkaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQorcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgorCisgIFRvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXIKK3BhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAorYSBjb21wdXRlciBuZXR3b3JrLCB3aXRoIG5vIHRyYW5zZmVyIG9mIGEgY29weSwgaXMgbm90IGNvbnZleWluZy4KKworICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKK3RvIHRoZSBleHRlbnQgdGhhdCBpdCBpbmNsdWRlcyBhIGNvbnZlbmllbnQgYW5kIHByb21pbmVudGx5IHZpc2libGUKK2ZlYXR1cmUgdGhhdCAoMSkgZGlzcGxheXMgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSwgYW5kICgyKQordGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKK2V4dGVudCB0aGF0IHdhcnJhbnRpZXMgYXJlIHByb3ZpZGVkKSwgdGhhdCBsaWNlbnNlZXMgbWF5IGNvbnZleSB0aGUKK3dvcmsgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmCit0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQorbWVudSwgYSBwcm9taW5lbnQgaXRlbSBpbiB0aGUgbGlzdCBtZWV0cyB0aGlzIGNyaXRlcmlvbi4KKworICAxLiBTb3VyY2UgQ29kZS4KKworICBUaGUgInNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yaworZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQorZm9ybSBvZiBhIHdvcmsuCisKKyAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKK3N0YW5kYXJkIGRlZmluZWQgYnkgYSByZWNvZ25pemVkIHN0YW5kYXJkcyBib2R5LCBvciwgaW4gdGhlIGNhc2Ugb2YKK2ludGVyZmFjZXMgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG9uZSB0aGF0CitpcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KKworICBUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgordGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKK3BhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKK0NvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAorTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCitpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiAgQQorIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50Cisoa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCisoaWYgYW55KSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSB3b3JrIHJ1bnMsIG9yIGEgY29tcGlsZXIgdXNlZCB0bworcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuCisKKyAgVGhlICJDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIG1lYW5zIGFsbAordGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQord29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bworY29udHJvbCB0aG9zZSBhY3Rpdml0aWVzLiAgSG93ZXZlciwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgd29yaydzCitTeXN0ZW0gTGlicmFyaWVzLCBvciBnZW5lcmFsLXB1cnBvc2UgdG9vbHMgb3IgZ2VuZXJhbGx5IGF2YWlsYWJsZSBmcmVlCitwcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKK3doaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgd29yay4gIEZvciBleGFtcGxlLCBDb3JyZXNwb25kaW5nIFNvdXJjZQoraW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3IKK3RoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQorbGlua2VkIHN1YnByb2dyYW1zIHRoYXQgdGhlIHdvcmsgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJlcXVpcmUsCitzdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQorc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgdXNlcnMKK2NhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZworU291cmNlLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdAorc2FtZSB3b3JrLgorCisgIDIuIEJhc2ljIFBlcm1pc3Npb25zLgorCisgIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCitjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAorY29uZGl0aW9ucyBhcmUgbWV0LiAgVGhpcyBMaWNlbnNlIGV4cGxpY2l0bHkgYWZmaXJtcyB5b3VyIHVubGltaXRlZAorcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKK2NvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cworY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuICBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKK3JpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgorCisgIFlvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QKK2NvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zCitpbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCitvZiBoYXZpbmcgdGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3UKK3dpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCitub3QgY29udHJvbCBjb3B5cmlnaHQuICBUaG9zZSB0aHVzIG1ha2luZyBvciBydW5uaW5nIHRoZSBjb3ZlcmVkIHdvcmtzCitmb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uCithbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKK3lvdXIgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgb3V0c2lkZSB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB5b3UuCisKKyAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKK3RoZSBjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gIFN1YmxpY2Vuc2luZyBpcyBub3QgYWxsb3dlZDsgc2VjdGlvbiAxMAorbWFrZXMgaXQgdW5uZWNlc3NhcnkuCisKKyAgMy4gUHJvdGVjdGluZyBVc2VycycgTGVnYWwgUmlnaHRzIEZyb20gQW50aS1DaXJjdW12ZW50aW9uIExhdy4KKworICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKK21lYXN1cmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IGZ1bGZpbGxpbmcgb2JsaWdhdGlvbnMgdW5kZXIgYXJ0aWNsZQorMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yCitzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCittZWFzdXJlcy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCitjaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgdG8gdGhlIGV4dGVudCBzdWNoIGNpcmN1bXZlbnRpb24KK2lzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8KK3RoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBhcyBhIG1lYW5zIG9mIGVuZm9yY2luZywgYWdhaW5zdCB0aGUgd29yaydzCit1c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkIGNpcmN1bXZlbnRpb24gb2YKK3RlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCisKKyAgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4KKworICBZb3UgbWF5IGNvbnZleSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UKK3JlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCithcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBzdGF0aW5nIHRoYXQgdGhpcyBMaWNlbnNlIGFuZCBhbnkKK25vbi1wZXJtaXNzaXZlIHRlcm1zIGFkZGVkIGluIGFjY29yZCB3aXRoIHNlY3Rpb24gNyBhcHBseSB0byB0aGUgY29kZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCityZWNpcGllbnRzIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCithbmQgeW91IG1heSBvZmZlciBzdXBwb3J0IG9yIHdhcnJhbnR5IHByb3RlY3Rpb24gZm9yIGEgZmVlLgorCisgIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCisKKyAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bworcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCisgICAgaXQsIGFuZCBnaXZpbmcgYSByZWxldmFudCBkYXRlLgorCisgICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKKyAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyIHNlY3Rpb24KKyAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvCisgICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KKworICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCisgICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCisgICAgTGljZW5zZSB3aWxsIHRoZXJlZm9yZSBhcHBseSwgYWxvbmcgd2l0aCBhbnkgYXBwbGljYWJsZSBzZWN0aW9uIDcKKyAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLAorICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCisgICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAorICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCisKKyAgICBkKSBJZiB0aGUgd29yayBoYXMgaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2VzLCBlYWNoIG11c3QgZGlzcGxheQorICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQorICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCisgICAgd29yayBuZWVkIG5vdCBtYWtlIHRoZW0gZG8gc28uCisKKyAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAord29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKK2FuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCitpbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCisiYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKK3VzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKK2JleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yaworaW4gYW4gYWdncmVnYXRlIGRvZXMgbm90IGNhdXNlIHRoaXMgTGljZW5zZSB0byBhcHBseSB0byB0aGUgb3RoZXIKK3BhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuCisKKyAgNi4gQ29udmV5aW5nIE5vbi1Tb3VyY2UgRm9ybXMuCisKKyAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKK29mIHNlY3Rpb25zIDQgYW5kIDUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gY29udmV5IHRoZQorbWFjaGluZS1yZWFkYWJsZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAoraW4gb25lIG9mIHRoZXNlIHdheXM6CisKKyAgICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmaXhlZCBvbiBhIGR1cmFibGUgcGh5c2ljYWwgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgICBiKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhCisgICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKKyAgICBsb25nIGFzIHlvdSBvZmZlciBzcGFyZSBwYXJ0cyBvciBjdXN0b21lciBzdXBwb3J0IGZvciB0aGF0IHByb2R1Y3QKKyAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhCisgICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCisgICAgcHJvZHVjdCB0aGF0IGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBvbiBhIGR1cmFibGUgcGh5c2ljYWwKKyAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vCisgICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCisgICAgY29udmV5aW5nIG9mIHNvdXJjZSwgb3IgKDIpIGFjY2VzcyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuCisKKyAgICBjKSBDb252ZXkgaW5kaXZpZHVhbCBjb3BpZXMgb2YgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZQorICAgIHdyaXR0ZW4gb2ZmZXIgdG8gcHJvdmlkZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGlzCisgICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKKyAgICBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgb2JqZWN0IGNvZGUgd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQKKyAgICB3aXRoIHN1YnNlY3Rpb24gNmIuCisKKyAgICBkKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGJ5IG9mZmVyaW5nIGFjY2VzcyBmcm9tIGEgZGVzaWduYXRlZAorICAgIHBsYWNlIChncmF0aXMgb3IgZm9yIGEgY2hhcmdlKSwgYW5kIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCisgICAgZnVydGhlciBjaGFyZ2UuICBZb3UgbmVlZCBub3QgcmVxdWlyZSByZWNpcGllbnRzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuICBJZiB0aGUgcGxhY2UgdG8KKyAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKKyAgICBtYXkgYmUgb24gYSBkaWZmZXJlbnQgc2VydmVyIChvcGVyYXRlZCBieSB5b3Ugb3IgYSB0aGlyZCBwYXJ0eSkKKyAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4KKyAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLiAgUmVnYXJkbGVzcyBvZiB3aGF0IHNlcnZlciBob3N0cyB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSwgeW91IHJlbWFpbiBvYmxpZ2F0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKKyAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgorCisgICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLCBwcm92aWRlZAorICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCisgICAgU291cmNlIG9mIHRoZSB3b3JrIGFyZSBiZWluZyBvZmZlcmVkIHRvIHRoZSBnZW5lcmFsIHB1YmxpYyBhdCBubworICAgIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLgorCisgIEEgc2VwYXJhYmxlIHBvcnRpb24gb2YgdGhlIG9iamVjdCBjb2RlLCB3aG9zZSBzb3VyY2UgY29kZSBpcyBleGNsdWRlZAorZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUKK2luY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KKworICBBICJVc2VyIFByb2R1Y3QiIGlzIGVpdGhlciAoMSkgYSAiY29uc3VtZXIgcHJvZHVjdCIsIHdoaWNoIG1lYW5zIGFueQordGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKK29yIGhvdXNlaG9sZCBwdXJwb3Nlcywgb3IgKDIpIGFueXRoaW5nIGRlc2lnbmVkIG9yIHNvbGQgZm9yIGluY29ycG9yYXRpb24KK2ludG8gYSBkd2VsbGluZy4gIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEgY29uc3VtZXIgcHJvZHVjdCwKK2RvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgorcHJvZHVjdCByZWNlaXZlZCBieSBhIHBhcnRpY3VsYXIgdXNlciwgIm5vcm1hbGx5IHVzZWQiIHJlZmVycyB0byBhCit0eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZiBwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMKK29mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCithY3R1YWxseSB1c2VzLCBvciBleHBlY3RzIG9yIGlzIGV4cGVjdGVkIHRvIHVzZSwgdGhlIHByb2R1Y3QuICBBIHByb2R1Y3QKK2lzIGEgY29uc3VtZXIgcHJvZHVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsCitjb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAordGhlIG9ubHkgc2lnbmlmaWNhbnQgbW9kZSBvZiB1c2Ugb2YgdGhlIHByb2R1Y3QuCisKKyAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLAorcHJvY2VkdXJlcywgYXV0aG9yaXphdGlvbiBrZXlzLCBvciBvdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YWxsCithbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIgUHJvZHVjdCBmcm9tCithIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKK3N1ZmZpY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRpbnVlZCBmdW5jdGlvbmluZyBvZiB0aGUgbW9kaWZpZWQgb2JqZWN0Citjb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aCBzb2xlbHkgYmVjYXVzZQorbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCisKKyAgSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3IKK3NwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCitwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdGhlIHJpZ2h0IG9mIHBvc3Nlc3Npb24gYW5kIHVzZSBvZiB0aGUKK1VzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGEKK2ZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCB1bmRlciB0aGlzIHNlY3Rpb24gbXVzdCBiZSBhY2NvbXBhbmllZAorYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5CitpZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAorbW9kaWZpZWQgb2JqZWN0IGNvZGUgb24gdGhlIFVzZXIgUHJvZHVjdCAoZm9yIGV4YW1wbGUsIHRoZSB3b3JrIGhhcworYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4KKworICBUaGUgcmVxdWlyZW1lbnQgdG8gcHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBhCityZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yIHVwZGF0ZXMKK2ZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCit0aGUgVXNlciBQcm9kdWN0IGluIHdoaWNoIGl0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZC4gIEFjY2VzcyB0byBhCituZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIGl0c2VsZiBtYXRlcmlhbGx5IGFuZAorYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCitwcm90b2NvbHMgZm9yIGNvbW11bmljYXRpb24gYWNyb3NzIHRoZSBuZXR3b3JrLgorCisgIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAoraW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gYSBmb3JtYXQgdGhhdCBpcyBwdWJsaWNseQorZG9jdW1lbnRlZCAoYW5kIHdpdGggYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4KK3NvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgordW5wYWNraW5nLCByZWFkaW5nIG9yIGNvcHlpbmcuCisKKyAgNy4gQWRkaXRpb25hbCBUZXJtcy4KKworICAiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgorQWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbnRpcmUgUHJvZ3JhbSBzaGFsbAorYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudAordGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKK2FwcGx5IG9ubHkgdG8gcGFydCBvZiB0aGUgUHJvZ3JhbSwgdGhhdCBwYXJ0IG1heSBiZSB1c2VkIHNlcGFyYXRlbHkKK3VuZGVyIHRob3NlIHBlcm1pc3Npb25zLCBidXQgdGhlIGVudGlyZSBQcm9ncmFtIHJlbWFpbnMgZ292ZXJuZWQgYnkKK3RoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uCityZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKK2l0LiAgKEFkZGl0aW9uYWwgcGVybWlzc2lvbnMgbWF5IGJlIHdyaXR0ZW4gdG8gcmVxdWlyZSB0aGVpciBvd24KK3JlbW92YWwgaW4gY2VydGFpbiBjYXNlcyB3aGVuIHlvdSBtb2RpZnkgdGhlIHdvcmsuKSAgWW91IG1heSBwbGFjZQorYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLAorZm9yIHdoaWNoIHlvdSBoYXZlIG9yIGNhbiBnaXZlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwZXJtaXNzaW9uLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQorYWRkIHRvIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IChpZiBhdXRob3JpemVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZgordGhhdCBtYXRlcmlhbCkgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGVybXM6CisKKyAgICBhKSBEaXNjbGFpbWluZyB3YXJyYW50eSBvciBsaW1pdGluZyBsaWFiaWxpdHkgZGlmZmVyZW50bHkgZnJvbSB0aGUKKyAgICB0ZXJtcyBvZiBzZWN0aW9ucyAxNSBhbmQgMTYgb2YgdGhpcyBMaWNlbnNlOyBvcgorCisgICAgYikgUmVxdWlyaW5nIHByZXNlcnZhdGlvbiBvZiBzcGVjaWZpZWQgcmVhc29uYWJsZSBsZWdhbCBub3RpY2VzIG9yCisgICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbAorICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCisKKyAgICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsIG9yCisgICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KKyAgICByZWFzb25hYmxlIHdheXMgYXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb247IG9yCisKKyAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCisgICAgYXV0aG9ycyBvZiB0aGUgbWF0ZXJpYWw7IG9yCisKKyAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCisgICAgdHJhZGUgbmFtZXMsIHRyYWRlbWFya3MsIG9yIHNlcnZpY2UgbWFya3M7IG9yCisKKyAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CisgICAgbWF0ZXJpYWwgYnkgYW55b25lIHdobyBjb252ZXlzIHRoZSBtYXRlcmlhbCAob3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YKKyAgICBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwgZm9yCisgICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgorICAgIHRob3NlIGxpY2Vuc29ycyBhbmQgYXV0aG9ycy4KKworICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgorcmVzdHJpY3Rpb25zIiB3aXRoaW4gdGhlIG1lYW5pbmcgb2Ygc2VjdGlvbiAxMC4gIElmIHRoZSBQcm9ncmFtIGFzIHlvdQorcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMKK2dvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgorcmVzdHJpY3Rpb24sIHlvdSBtYXkgcmVtb3ZlIHRoYXQgdGVybS4gIElmIGEgbGljZW5zZSBkb2N1bWVudCBjb250YWlucworYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzCitMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKK29mIHRoYXQgbGljZW5zZSBkb2N1bWVudCwgcHJvdmlkZWQgdGhhdCB0aGUgZnVydGhlciByZXN0cmljdGlvbiBkb2VzCitub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4KKworICBJZiB5b3UgYWRkIHRlcm1zIHRvIGEgY292ZXJlZCB3b3JrIGluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiwgeW91CittdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUKK2FkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZword2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYWJsZSB0ZXJtcy4KKworICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQorZm9ybSBvZiBhIHNlcGFyYXRlbHkgd3JpdHRlbiBsaWNlbnNlLCBvciBzdGF0ZWQgYXMgZXhjZXB0aW9uczsKK3RoZSBhYm92ZSByZXF1aXJlbWVudHMgYXBwbHkgZWl0aGVyIHdheS4KKworICA4LiBUZXJtaW5hdGlvbi4KKworICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKK3Byb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBpdCBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlcgordGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZAorcGFyYWdyYXBoIG9mIHNlY3Rpb24gMTEpLgorCisgIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCitsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMgcmVpbnN0YXRlZCAoYSkKK3Byb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQKK2ZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKK2hvbGRlciBmYWlscyB0byBub3RpZnkgeW91IG9mIHRoZSB2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zCitwcmlvciB0byA2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uCisKKyAgTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCityZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUKK3Zpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKK3JlY2VpdmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZyb20gdGhhdAorY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcgoreW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCisKKyAgVGVybWluYXRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUKK2xpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlLiAgSWYgeW91ciByaWdodHMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYW5kIG5vdCBwZXJtYW5lbnRseQorcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQorbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KKworICA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KKworICBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlIGluIG9yZGVyIHRvIHJlY2VpdmUgb3IKK3J1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK29jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCit0byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuICBIb3dldmVyLAorbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbworbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCitjb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgorCisgIDEwLiBBdXRvbWF0aWMgTGljZW5zaW5nIG9mIERvd25zdHJlYW0gUmVjaXBpZW50cy4KKworICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5CityZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3JzLCB0byBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGF0IHdvcmssIHN1YmplY3QgdG8gdGhpcyBMaWNlbnNlLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUKK2ZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgorCisgIEFuICJlbnRpdHkgdHJhbnNhY3Rpb24iIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4KK29yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4KK29yZ2FuaXphdGlvbiwgb3IgbWVyZ2luZyBvcmdhbml6YXRpb25zLiAgSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCit3b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAordHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCitsaWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKK2dpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKK3RoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KKworICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKK3JpZ2h0cyBncmFudGVkIG9yIGFmZmlybWVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEZvciBleGFtcGxlLCB5b3UgbWF5Citub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKK3JpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CithbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKK3NhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KKworICAxMS4gUGF0ZW50cy4KKworICBBICJjb250cmlidXRvciIgaXMgYSBjb3B5cmlnaHQgaG9sZGVyIHdobyBhdXRob3JpemVzIHVzZSB1bmRlciB0aGlzCitMaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQord29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCisKKyAgQSBjb250cmlidXRvcidzICJlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyIgYXJlIGFsbCBwYXRlbnQgY2xhaW1zCitvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCitoZXJlYWZ0ZXIgYWNxdWlyZWQsIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIGJ5IHNvbWUgbWFubmVyLCBwZXJtaXR0ZWQKK2J5IHRoaXMgTGljZW5zZSwgb2YgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBpdHMgY29udHJpYnV0b3IgdmVyc2lvbiwKK2J1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCitjb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udHJpYnV0b3IgdmVyc2lvbi4gIEZvcgorcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50CitwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKK3RoaXMgTGljZW5zZS4KKworICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgdGhlIGNvbnRyaWJ1dG9yJ3MgZXNzZW50aWFsIHBhdGVudCBjbGFpbXMsIHRvCittYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBpbXBvcnQgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCisKKyAgSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MKK2FncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAorKHN1Y2ggYXMgYW4gZXhwcmVzcyBwZXJtaXNzaW9uIHRvIHByYWN0aWNlIGEgcGF0ZW50IG9yIGNvdmVuYW50IG5vdCB0bworc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gIFRvICJncmFudCIgc3VjaCBhIHBhdGVudCBsaWNlbnNlIHRvIGEKK3BhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCitwYXRlbnQgYWdhaW5zdCB0aGUgcGFydHkuCisKKyAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKK2FuZCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW55b25lCit0byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhCitwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAordGhlbiB5b3UgbXVzdCBlaXRoZXIgKDEpIGNhdXNlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB0byBiZSBzbworYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQorcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKK2NvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSwgdG8gZXh0ZW5kIHRoZSBwYXRlbnQKK2xpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAgIktub3dpbmdseSByZWx5aW5nIiBtZWFucyB5b3UgaGF2ZQorYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCitjb3ZlcmVkIHdvcmsgaW4gYSBjb3VudHJ5LCBvciB5b3VyIHJlY2lwaWVudCdzIHVzZSBvZiB0aGUgY292ZXJlZCB3b3JrCitpbiBhIGNvdW50cnksIHdvdWxkIGluZnJpbmdlIG9uZSBvciBtb3JlIGlkZW50aWZpYWJsZSBwYXRlbnRzIGluIHRoYXQKK2NvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCisgIAorICBJZiwgcHVyc3VhbnQgdG8gb3IgaW4gY29ubmVjdGlvbiB3aXRoIGEgc2luZ2xlIHRyYW5zYWN0aW9uIG9yCithcnJhbmdlbWVudCwgeW91IGNvbnZleSwgb3IgcHJvcGFnYXRlIGJ5IHByb2N1cmluZyBjb252ZXlhbmNlIG9mLCBhCitjb3ZlcmVkIHdvcmssIGFuZCBncmFudCBhIHBhdGVudCBsaWNlbnNlIHRvIHNvbWUgb2YgdGhlIHBhcnRpZXMKK3JlY2VpdmluZyB0aGUgY292ZXJlZCB3b3JrIGF1dGhvcml6aW5nIHRoZW0gdG8gdXNlLCBwcm9wYWdhdGUsIG1vZGlmeQorb3IgY29udmV5IGEgc3BlY2lmaWMgY29weSBvZiB0aGUgY292ZXJlZCB3b3JrLCB0aGVuIHRoZSBwYXRlbnQgbGljZW5zZQoreW91IGdyYW50IGlzIGF1dG9tYXRpY2FsbHkgZXh0ZW5kZWQgdG8gYWxsIHJlY2lwaWVudHMgb2YgdGhlIGNvdmVyZWQKK3dvcmsgYW5kIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIEEgcGF0ZW50IGxpY2Vuc2UgaXMgImRpc2NyaW1pbmF0b3J5IiBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHdpdGhpbgordGhlIHNjb3BlIG9mIGl0cyBjb3ZlcmFnZSwgcHJvaGliaXRzIHRoZSBleGVyY2lzZSBvZiwgb3IgaXMKK2NvbmRpdGlvbmVkIG9uIHRoZSBub24tZXhlcmNpc2Ugb2Ygb25lIG9yIG1vcmUgb2YgdGhlIHJpZ2h0cyB0aGF0IGFyZQorc3BlY2lmaWNhbGx5IGdyYW50ZWQgdW5kZXIgdGhpcyBMaWNlbnNlLiAgWW91IG1heSBub3QgY29udmV5IGEgY292ZXJlZAord29yayBpZiB5b3UgYXJlIGEgcGFydHkgdG8gYW4gYXJyYW5nZW1lbnQgd2l0aCBhIHRoaXJkIHBhcnR5IHRoYXQgaXMKK2luIHRoZSBidXNpbmVzcyBvZiBkaXN0cmlidXRpbmcgc29mdHdhcmUsIHVuZGVyIHdoaWNoIHlvdSBtYWtlIHBheW1lbnQKK3RvIHRoZSB0aGlyZCBwYXJ0eSBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHlvdXIgYWN0aXZpdHkgb2YgY29udmV5aW5nCit0aGUgd29yaywgYW5kIHVuZGVyIHdoaWNoIHRoZSB0aGlyZCBwYXJ0eSBncmFudHMsIHRvIGFueSBvZiB0aGUKK3BhcnRpZXMgd2hvIHdvdWxkIHJlY2VpdmUgdGhlIGNvdmVyZWQgd29yayBmcm9tIHlvdSwgYSBkaXNjcmltaW5hdG9yeQorcGF0ZW50IGxpY2Vuc2UgKGEpIGluIGNvbm5lY3Rpb24gd2l0aCBjb3BpZXMgb2YgdGhlIGNvdmVyZWQgd29yaworY29udmV5ZWQgYnkgeW91IChvciBjb3BpZXMgbWFkZSBmcm9tIHRob3NlIGNvcGllcyksIG9yIChiKSBwcmltYXJpbHkKK2ZvciBhbmQgaW4gY29ubmVjdGlvbiB3aXRoIHNwZWNpZmljIHByb2R1Y3RzIG9yIGNvbXBpbGF0aW9ucyB0aGF0Citjb250YWluIHRoZSBjb3ZlcmVkIHdvcmssIHVubGVzcyB5b3UgZW50ZXJlZCBpbnRvIHRoYXQgYXJyYW5nZW1lbnQsCitvciB0aGF0IHBhdGVudCBsaWNlbnNlIHdhcyBncmFudGVkLCBwcmlvciB0byAyOCBNYXJjaCAyMDA3LgorCisgIE5vdGhpbmcgaW4gdGhpcyBMaWNlbnNlIHNoYWxsIGJlIGNvbnN0cnVlZCBhcyBleGNsdWRpbmcgb3IgbGltaXRpbmcKK2FueSBpbXBsaWVkIGxpY2Vuc2Ugb3Igb3RoZXIgZGVmZW5zZXMgdG8gaW5mcmluZ2VtZW50IHRoYXQgbWF5CitvdGhlcndpc2UgYmUgYXZhaWxhYmxlIHRvIHlvdSB1bmRlciBhcHBsaWNhYmxlIHBhdGVudCBsYXcuCisKKyAgMTIuIE5vIFN1cnJlbmRlciBvZiBPdGhlcnMnIEZyZWVkb20uCisKKyAgSWYgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QgY29udmV5IGEKK2NvdmVyZWQgd29yayBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcworTGljZW5zZSBhbmQgYW55IG90aGVyIHBlcnRpbmVudCBvYmxpZ2F0aW9ucywgdGhlbiBhcyBhIGNvbnNlcXVlbmNlIHlvdSBtYXkKK25vdCBjb252ZXkgaXQgYXQgYWxsLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBhZ3JlZSB0byB0ZXJtcyB0aGF0IG9ibGlnYXRlIHlvdQordG8gY29sbGVjdCBhIHJveWFsdHkgZm9yIGZ1cnRoZXIgY29udmV5aW5nIGZyb20gdGhvc2UgdG8gd2hvbSB5b3UgY29udmV5Cit0aGUgUHJvZ3JhbSwgdGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggdGhvc2UgdGVybXMgYW5kIHRoaXMKK0xpY2Vuc2Ugd291bGQgYmUgdG8gcmVmcmFpbiBlbnRpcmVseSBmcm9tIGNvbnZleWluZyB0aGUgUHJvZ3JhbS4KKworICAxMy4gVXNlIHdpdGggdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4KKworICBOb3R3aXRoc3RhbmRpbmcgYW55IG90aGVyIHByb3Zpc2lvbiBvZiB0aGlzIExpY2Vuc2UsIHlvdSBoYXZlCitwZXJtaXNzaW9uIHRvIGxpbmsgb3IgY29tYmluZSBhbnkgY292ZXJlZCB3b3JrIHdpdGggYSB3b3JrIGxpY2Vuc2VkCit1bmRlciB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpbnRvIGEgc2luZ2xlCitjb21iaW5lZCB3b3JrLCBhbmQgdG8gY29udmV5IHRoZSByZXN1bHRpbmcgd29yay4gIFRoZSB0ZXJtcyBvZiB0aGlzCitMaWNlbnNlIHdpbGwgY29udGludWUgdG8gYXBwbHkgdG8gdGhlIHBhcnQgd2hpY2ggaXMgdGhlIGNvdmVyZWQgd29yaywKK2J1dCB0aGUgc3BlY2lhbCByZXF1aXJlbWVudHMgb2YgdGhlIEdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKK3NlY3Rpb24gMTMsIGNvbmNlcm5pbmcgaW50ZXJhY3Rpb24gdGhyb3VnaCBhIG5ldHdvcmsgd2lsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIGFzIHN1Y2guCisKKyAgMTQuIFJldmlzZWQgVmVyc2lvbnMgb2YgdGhpcyBMaWNlbnNlLgorCisgIFRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gbWF5IHB1Ymxpc2ggcmV2aXNlZCBhbmQvb3IgbmV3IHZlcnNpb25zIG9mCit0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCisgIEVhY2ggdmVyc2lvbiBpcyBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgSWYgdGhlCitQcm9ncmFtIHNwZWNpZmllcyB0aGF0IGEgY2VydGFpbiBudW1iZXJlZCB2ZXJzaW9uIG9mIHRoZSBHTlUgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgIm9yIGFueSBsYXRlciB2ZXJzaW9uIiBhcHBsaWVzIHRvIGl0LCB5b3UgaGF2ZSB0aGUKK29wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGVpdGhlciBvZiB0aGF0IG51bWJlcmVkCit2ZXJzaW9uIG9yIG9mIGFueSBsYXRlciB2ZXJzaW9uIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbi4gIElmIHRoZSBQcm9ncmFtIGRvZXMgbm90IHNwZWNpZnkgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB5b3UgbWF5IGNob29zZSBhbnkgdmVyc2lvbiBldmVyIHB1Ymxpc2hlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICBJZiB0aGUgUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIHByb3h5IGNhbiBkZWNpZGUgd2hpY2ggZnV0dXJlCit2ZXJzaW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgY2FuIGJlIHVzZWQsIHRoYXQgcHJveHkncworcHVibGljIHN0YXRlbWVudCBvZiBhY2NlcHRhbmNlIG9mIGEgdmVyc2lvbiBwZXJtYW5lbnRseSBhdXRob3JpemVzIHlvdQordG8gY2hvb3NlIHRoYXQgdmVyc2lvbiBmb3IgdGhlIFByb2dyYW0uCisKKyAgTGF0ZXIgbGljZW5zZSB2ZXJzaW9ucyBtYXkgZ2l2ZSB5b3UgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQKK3Blcm1pc3Npb25zLiAgSG93ZXZlciwgbm8gYWRkaXRpb25hbCBvYmxpZ2F0aW9ucyBhcmUgaW1wb3NlZCBvbiBhbnkKK2F1dGhvciBvciBjb3B5cmlnaHQgaG9sZGVyIGFzIGEgcmVzdWx0IG9mIHlvdXIgY2hvb3NpbmcgdG8gZm9sbG93IGEKK2xhdGVyIHZlcnNpb24uCisKKyAgMTUuIERpc2NsYWltZXIgb2YgV2FycmFudHkuCisKKyAgVEhFUkUgSVMgTk8gV0FSUkFOVFkgRk9SIFRIRSBQUk9HUkFNLCBUTyBUSEUgRVhURU5UIFBFUk1JVFRFRCBCWQorQVBQTElDQUJMRSBMQVcuICBFWENFUFQgV0hFTiBPVEhFUldJU0UgU1RBVEVEIElOIFdSSVRJTkcgVEhFIENPUFlSSUdIVAorSE9MREVSUyBBTkQvT1IgT1RIRVIgUEFSVElFUyBQUk9WSURFIFRIRSBQUk9HUkFNICJBUyBJUyIgV0lUSE9VVCBXQVJSQU5UWQorT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCitQVVJQT1NFLiAgVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgUFJPR1JBTQorSVMgV0lUSCBZT1UuICBTSE9VTEQgVEhFIFBST0dSQU0gUFJPVkUgREVGRUNUSVZFLCBZT1UgQVNTVU1FIFRIRSBDT1NUIE9GCitBTEwgTkVDRVNTQVJZIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uCisKKyAgMTYuIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LgorCisgIElOIE5PIEVWRU5UIFVOTEVTUyBSRVFVSVJFRCBCWSBBUFBMSUNBQkxFIExBVyBPUiBBR1JFRUQgVE8gSU4gV1JJVElORworV0lMTCBBTlkgQ09QWVJJR0hUIEhPTERFUiwgT1IgQU5ZIE9USEVSIFBBUlRZIFdITyBNT0RJRklFUyBBTkQvT1IgQ09OVkVZUworVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZCitHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBUSEUKK1VTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIExPU1MgT0YKK0RBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJECitQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSIFBST0dSQU1TKSwKK0VWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKK1NVQ0ggREFNQUdFUy4KKworICAxNy4gSW50ZXJwcmV0YXRpb24gb2YgU2VjdGlvbnMgMTUgYW5kIDE2LgorCisgIElmIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aWRlZAorYWJvdmUgY2Fubm90IGJlIGdpdmVuIGxvY2FsIGxlZ2FsIGVmZmVjdCBhY2NvcmRpbmcgdG8gdGhlaXIgdGVybXMsCityZXZpZXdpbmcgY291cnRzIHNoYWxsIGFwcGx5IGxvY2FsIGxhdyB0aGF0IG1vc3QgY2xvc2VseSBhcHByb3hpbWF0ZXMKK2FuIGFic29sdXRlIHdhaXZlciBvZiBhbGwgY2l2aWwgbGlhYmlsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCB0aGUKK1Byb2dyYW0sIHVubGVzcyBhIHdhcnJhbnR5IG9yIGFzc3VtcHRpb24gb2YgbGlhYmlsaXR5IGFjY29tcGFuaWVzIGEKK2NvcHkgb2YgdGhlIFByb2dyYW0gaW4gcmV0dXJuIGZvciBhIGZlZS4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisJICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgIElmIHlvdSBkZXZlbG9wIGEgbmV3IHByb2dyYW0sIGFuZCB5b3Ugd2FudCBpdCB0byBiZSBvZiB0aGUgZ3JlYXRlc3QKK3Bvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKK2ZyZWUgc29mdHdhcmUgd2hpY2ggZXZlcnlvbmUgY2FuIHJlZGlzdHJpYnV0ZSBhbmQgY2hhbmdlIHVuZGVyIHRoZXNlIHRlcm1zLgorCisgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiAgSXQgaXMgc2FmZXN0Cit0byBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5CitzdGF0ZSB0aGUgZXhjbHVzaW9uIG9mIHdhcnJhbnR5OyBhbmQgZWFjaCBmaWxlIHNob3VsZCBoYXZlIGF0IGxlYXN0Cit0aGUgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgIDxvbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4+CisgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKKyAgSWYgdGhlIHByb2dyYW0gZG9lcyB0ZXJtaW5hbCBpbnRlcmFjdGlvbiwgbWFrZSBpdCBvdXRwdXQgYSBzaG9ydAorbm90aWNlIGxpa2UgdGhpcyB3aGVuIGl0IHN0YXJ0cyBpbiBhbiBpbnRlcmFjdGl2ZSBtb2RlOgorCisgICAgPHByb2dyYW0+ICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorICAgIFRoaXMgcHJvZ3JhbSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgeW91ciBwcm9ncmFtJ3MgY29tbWFuZHMKK21pZ2h0IGJlIGRpZmZlcmVudDsgZm9yIGEgR1VJIGludGVyZmFjZSwgeW91IHdvdWxkIHVzZSBhbiAiYWJvdXQgYm94Ii4KKworICBZb3Ugc2hvdWxkIGFsc28gZ2V0IHlvdXIgZW1wbG95ZXIgKGlmIHlvdSB3b3JrIGFzIGEgcHJvZ3JhbW1lcikgb3Igc2Nob29sLAoraWYgYW55LCB0byBzaWduIGEgImNvcHlyaWdodCBkaXNjbGFpbWVyIiBmb3IgdGhlIHByb2dyYW0sIGlmIG5lY2Vzc2FyeS4KK0ZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMsIGFuZCBob3cgdG8gYXBwbHkgYW5kIGZvbGxvdyB0aGUgR05VIEdQTCwgc2VlCis8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKKyAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbQoraW50byBwcm9wcmlldGFyeSBwcm9ncmFtcy4gIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CittYXkgY29uc2lkZXIgaXQgbW9yZSB1c2VmdWwgdG8gcGVybWl0IGxpbmtpbmcgcHJvcHJpZXRhcnkgYXBwbGljYXRpb25zIHdpdGgKK3RoZSBsaWJyYXJ5LiAgSWYgdGhpcyBpcyB3aGF0IHlvdSB3YW50IHRvIGRvLCB1c2UgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbAorUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuICBCdXQgZmlyc3QsIHBsZWFzZSByZWFkCis8aHR0cDovL3d3dy5nbnUub3JnL3BoaWxvc29waHkvd2h5LW5vdC1sZ3BsLmh0bWw+LgorCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9DaGFuZ2VMb2cgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9DaGFuZ2VMb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmZTE2MQotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L0NoYW5nZUxvZwpAQCAtMCwwICsxLDE0IEBACitncHBmcyAoMC4yKQorCisgICogQWRkIHN1cHBvcnQgZm9yIHN0ZDo6dHIxOjp1bm9yZGVyZWRfe211bHRpLH17bWFwLHNldH0sIHN0ZDo6YXV0b19wdHIsCisgICAgc3RkOjp0cjE6OnNoYXJlZF9wdHIgYW5kIHN0ZDo6dHIxOjp3ZWFrX3B0ci4KKyAgKiBGaXggZGlzcGxheSBvZiBlbXB0eSBzdHJpbmdzIHdpdGggU1RMcG9ydCA1LjAueCBpZgorICAgIF9TVExQX0ZPUkNFX1NUUklOR19URVJNSU5BVElPTiBpcyBub3QgZW5hYmxlZC4KKworIC0tIEpvYWNoaW0gUmVpY2hlbCA8am9hY2hpbS5yZWljaGVsQGdteC5kZT4gIE1vbiwgMDQgT2N0IDIwMTAgMjA6MTA6MTQgKzAyMDAKKworZ3BwZnMgKDAuMSkKKworICAqIEluaXRpYWwgcmVsZWFzZS4KKworIC0tIEpvYWNoaW0gUmVpY2hlbCA8am9hY2hpbS5yZWljaGVsQGdteC5kZT4gIFRodSwgMzAgU2VwIDIwMTAgMTg6NDA6NDIgKzAyMDAKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L1JFQURNRSBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmYxOGM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvUkVBRE1FCkBAIC0wLDAgKzEsNDMgQEAKK0dEQiBwcmV0dHkgcHJpbnRlcnMgZm9yIFNUTHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBweXRob24gbW9kdWxlIHByb3ZpZGVzIEdEQiBwcmV0dHkgcHJpbnRlcnMgZm9yIHRoZSBjb250YWluZXJzIGZyb20KK1NUTHBvcnQuIEl0IGlzIGJhc2VkIG9uIGEgc2ltaWxhciBweXRob24gbW9kdWxlIGZvciBsaWJzdGRjKysgWzFdLiBJdCBoYXMKK2JlZW4gdGVzdGVkIHdpdGggR0RCIDcuMC4xLzcuMiBhbmQgU1RMcG9ydCA0LjYuMi81LjAuMy81LjEuNy81LjIuMS4KKworWzFdIHN2bjovL2djYy5nbnUub3JnL3N2bi9nY2MvdHJ1bmsvbGlic3RkYysrLXYzL3B5dGhvbgorCisKK0luc3RhbGxhdGlvbgorLS0tLS0tLS0tLS0tCisKK1RvIGluc3RhbGwgdGhlIHB5dGhvbiBtb2R1bGUgY29weSB0aGUgInN0bHBvcnQiIHN1YmRpcmVjdG9yeSB0byBzb21lIHBsYWNlLgorVG8gZW5hYmxlIHRoZSBwcmV0dHkgcHJpbnRlciBhZGQgdGhlIGZvbGxvd2luZyBjb2RlIHRvICRIT01FLy5nZGJpbml0OgorCisgICAgcHl0aG9uCisgICAgaW1wb3J0IHN5cworCisgICAgc3lzLnBhdGguaW5zZXJ0ICgwLCAnL3BhdGgvdG8vZGlyL2NvbnRhaW5pbmcvdGhlL3N0bHBvcnQvZGlyJykKKyAgICBpbXBvcnQgc3RscG9ydC5wcmludGVycworICAgIHN0bHBvcnQucHJpbnRlcnMucmVnaXN0ZXJfc3RscG9ydF9wcmludGVycyAoTm9uZSkKKworICAgICMgc2VlIHRoZSBweXRob24gbW9kdWxlIGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZXNlIG9wdGlvbnMKKyAgICAjIHN0bHBvcnQucHJpbnRlcnMuc3RscG9ydF92ZXJzaW9uICAgICAgICAgICA9IDUuMgorICAgICMgc3RscG9ydC5wcmludGVycy5wcmludF92ZWN0b3Jfd2l0aF9pbmRpY2VzID0gRmFsc2UKKyAgICAKKyAgICBlbmQKKworCitUZXN0aW5nCistLS0tLS0tCisKK1RvIHRlc3QgdGhlIHByZXR0eSBwcmludGVycywgZ28gdG8gdGhlIHRlc3QgZGlyZWN0b3J5IGFuZCBzZXQgdXAgdGhlIFNUTHBvcnQKK2RpcmVjdG9yeSBpbiB0aGUgTWFrZWZpbGUuIENhbGxpbmcgbWFrZSBzaG91bGQgdGhlbiBjb21waWxlIHR3byBleGVjdXRhYmxlcworKHdpdGggYW5kIHdpdGhvdXQgLURfU1RMUF9ERUJVRykgYW5kIGludm9rZSBHREIgd2l0aCB0aGUgc3VwcGxpZWQgc2NyaXB0LiBJZgordGhlIHByZXR0eSBwcmludGVycyB3b3JrIHRoZSB2YXJpYWJsZXMgZnJvbSB0ZXN0LmNwcCBzaG91bGQgYmUgZGlzcGxheWVkIGluIGEKK2NvbnZlbmllbnQgd2F5LgorCitOb3RlIHRoYXQgR0RCIHByZWZlcnMgcHl0aG9uIG1vZHVsZXMgZnJvbSAkSE9NRS8uZ2RiaW5pdCBvdmVyIHRob3NlIGZyb20KKy5nZGJpbml0IGluIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBJZiB5b3UgYWRhcHRlZCAkSE9NRS8uZ2RiaW5pdCBhcworZGVzY3JpYmVkIGFib3ZlIHRoZSBsb2NhdGlvbiB0aGVyZSB3aWxsIGJlIHVzZWQuIE90aGVyd2lzZSwgdGVzdC8uZ2RiaW5pdCB3aWxsCitsb2FkIHN0bHBvcnQvcHJpbnRlcnMucHkuCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9zdGxwb3J0L19faW5pdF9fLnB5IGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvc3RscG9ydC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjEzNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvc3RscG9ydC9fX2luaXRfXy5weQpAQCAtMCwwICsxIEBACisKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3N0bHBvcnQvcHJpbnRlcnMucHkgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9zdGxwb3J0L3ByaW50ZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MmU2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC9zdGxwb3J0L3ByaW50ZXJzLnB5CkBAIC0wLDAgKzEsNzI3IEBACisjIEdEQiBwcmV0dHkgcHJpbnRlcnMgZm9yIFNUTHBvcnQuCisjCisjIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSwgMjAxMCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyMgQ29weXJpZ2h0IChDKSAyMDEwIEpvYWNoaW0gUmVpY2hlbAorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgorIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorIworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKworCisjIHB5bGludDogZGlzYWJsZT1DMDEwMyxDMDExMSxSMDIwMSxSMDkwMworCisKK2ltcG9ydCBnZGIKK2ltcG9ydCByZQorCisKKyMgU2V0IHRoZSBTVExwb3J0IHZlcnNpb24gd2hpY2ggaXMgbmVlZGVkIGZvciBhIGZldyBmZWF0dXJlcy4KKyMKKyMgLSBmb3Igc3RkOjpsaXN0OgorIyAgIFNUTHBvcnQgb2xkZXIgdGhhbiA1LjA/CisjIC0gZm9yIHN0ZDo6ZGVxdWUsIHN0ZDo6c3RhY2ssIGFuZCBzdGQ6OnF1ZXVlIG9uIDY0Yml0IHN5c3RlbXM6CisjICAgU1RMcG9ydCBvbGRlciB0aGFuIDUuMj8KK3N0bHBvcnRfdmVyc2lvbiA9IDUuMgorCisjIEluZGljYXRlcyB3aGV0aGVyIHN0ZDo6dmVjdG9yIGlzIHByaW50ZWQgd2l0aCBpbmRpY2VzLgorcHJpbnRfdmVjdG9yX3dpdGhfaW5kaWNlcyA9IEZhbHNlCisKKworZGVmIGxvb2t1cF9zdGxwb3J0X3R5cGUgKHR5cGVuYW1lKToKKyAgICAiTG9vayB1cCBhIHR5cGUgaW4gdGhlIHB1YmxpYyBTVExwb3J0IG5hbWVzcGFjZS4iCisKKyAgICBuYW1lc3BhY2VzID0gWydzdGQ6OicsICdzdGxwZF9zdGQ6OicsICdzdGxwX3N0ZDo6JywgJ19TVEw6OiddCisgICAgZm9yIG5hbWVzcGFjZSBpbiBuYW1lc3BhY2VzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZ2RiLmxvb2t1cF90eXBlIChuYW1lc3BhY2UgKyB0eXBlbmFtZSkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworZGVmIGxvb2t1cF9zdGxwb3J0X3ByaXZfdHlwZSAodHlwZW5hbWUpOgorICAgICJMb29rIHVwIGEgdHlwZSBpbiB0aGUgcHJpdmF0ZSBTVExwb3J0IG5hbWVzcGFjZS4iCisKKyAgICBuYW1lc3BhY2VzID0gWydzdGQ6OnByaXY6OicsICdzdGxwZF9zdGQ6OnByaXY6OicsICdzdGxwX3ByaXY6OicsICdzdGxwX3N0ZDo6cHJpdjo6JywKKyAgICAgICAgICAgICAgICAgICdzdGxwZF9zdGQ6OicsICdzdGxwX3N0ZDo6JywgJ19TVEw6OiddCisgICAgZm9yIG5hbWVzcGFjZSBpbiBuYW1lc3BhY2VzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gZ2RiLmxvb2t1cF90eXBlIChuYW1lc3BhY2UgKyB0eXBlbmFtZSkKKyAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworCitkZWYgZ2V0X25vbl9kZWJ1Z19pbXBsICh2YWx1ZSwgbWVtYmVyID0gTm9uZSk6CisgICAgIlJldHVybiB0aGUgbm9uLWRlYnVnIGltcGxlbWVudGF0aW9uIG9mIHZhbHVlIG9yIHZhbHVlW21lbWJlcl0uIgorICAgIGlmIG1lbWJlcjoKKyAgICAgICAgdmFsdWUgPSB2YWx1ZVttZW1iZXJdCisgICAgdHJ5OgorICAgICAgICByZXR1cm4gdmFsdWVbJ19NX25vbl9kYmdfaW1wbCddCisgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgcmV0dXJuIHZhbHVlCisKKworY2xhc3MgUmJ0cmVlSXRlcmF0b3I6CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHJidHJlZSk6CisgICAgICAgIHRyZWUgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHJidHJlZSAsICdfTV90JykKKyAgICAgICAgc2VsZi5zaXplID0gdHJlZVsnX01fbm9kZV9jb3VudCddCisgICAgICAgIHNlbGYubm9kZSA9IHRyZWVbJ19NX2hlYWRlciddWydfTV9kYXRhJ11bJ19NX2xlZnQnXQorICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgZGVmIF9faXRlcl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2xlbl9fIChzZWxmKToKKyAgICAgICAgcmV0dXJuIGludCAoc2VsZi5zaXplKQorCisgICAgZGVmIG5leHQgKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNvdW50ID09IHNlbGYuc2l6ZToKKyAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgcmVzdWx0ID0gc2VsZi5ub2RlCisgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICBpZiBzZWxmLmNvdW50IDwgc2VsZi5zaXplOgorICAgICAgICAgICAgbm9kZSA9IHNlbGYubm9kZQorICAgICAgICAgICAgIyBJcyB0aGVyZSBhIHJpZ2h0IGNoaWxkPworICAgICAgICAgICAgaWYgbm9kZS5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddOgorICAgICAgICAgICAgICAgICMgV2FsayBkb3duIHRvIGxlZnQtbW9zdCBjaGlsZCBpbiByaWdodCBzdWJ0cmVlLgorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX3JpZ2h0J10KKyAgICAgICAgICAgICAgICB3aGlsZSBub2RlLmRlcmVmZXJlbmNlKClbJ19NX2xlZnQnXToKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fbGVmdCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgV2FsayB1cCB0byBmaXJzdCBwYXJlbnQgcmVhY2hlZCB2aWEgbGVmdCBzdWJ0cmVlLgorICAgICAgICAgICAgICAgIHBhcmVudCA9IG5vZGUuZGVyZWZlcmVuY2UoKVsnX01fcGFyZW50J10KKyAgICAgICAgICAgICAgICB3aGlsZSBub2RlID09IHBhcmVudC5kZXJlZmVyZW5jZSgpWydfTV9yaWdodCddOgorICAgICAgICAgICAgICAgICAgICBub2RlID0gcGFyZW50CisgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5kZXJlZmVyZW5jZSgpWydfTV9wYXJlbnQnXQorICAgICAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQKKyAgICAgICAgICAgIHNlbGYubm9kZSA9IG5vZGUKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2NsYXNzIEJpdHNldFByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OmJpdHNldC4iCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCAgICAgID0gdmFsCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgIyBJZiB0ZW1wbGF0ZV9hcmd1bWVudCBoYW5kbGVkIHZhbHVlcywgd2UgY291bGQgcHJpbnQgdGhlCisgICAgICAgICMgc2l6ZS4gIE9yIHdlIGNvdWxkIHVzZSBhIHJlZ2V4cCBvbiB0aGUgdHlwZS4KKyAgICAgICAgcmV0dXJuICclcycgJSAoc2VsZi50eXBlbmFtZSkKKworICAgIGRlZiBjaGlsZHJlbiAoc2VsZik6CisgICAgICAgIHdvcmRzID0gc2VsZi52YWxbJ19NX3cnXQorCisgICAgICAgICMgVGhlIF9NX3cgbWVtYmVyIGNhbiBiZSBlaXRoZXIgYW4gdW5zaWduZWQgbG9uZywgb3IgYW4KKyAgICAgICAgIyBhcnJheS4gIFRoaXMgZGVwZW5kcyBvbiB0aGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdXNlZC4KKyAgICAgICAgIyBJZiBpdCBpcyBhIHNpbmdsZSBsb25nLCBjb252ZXJ0IHRvIGEgc2luZ2xlIGVsZW1lbnQgbGlzdC4KKyAgICAgICAgaWYgd29yZHMudHlwZS5jb2RlID09IGdkYi5UWVBFX0NPREVfQVJSQVk6CisgICAgICAgICAgICB3b3JkX3NpemUgPSB3b3Jkcy50eXBlLnRhcmdldCAoKS5zaXplb2YKKyAgICAgICAgICAgIG5fd29yZHMgICA9IHdvcmRzLnR5cGUuc2l6ZW9mIC8gd29yZF9zaXplCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3b3JkX3NpemUgPSB3b3Jkcy50eXBlLnNpemVvZiAKKyAgICAgICAgICAgIG5fd29yZHMgICA9IDEKKyAgICAgICAgICAgIHdvcmRzICAgICA9IFt3b3Jkc10KKworICAgICAgICByZXN1bHQgPSBbXQorICAgICAgICB3b3JkID0gMAorICAgICAgICB3aGlsZSB3b3JkIDwgbl93b3JkczoKKyAgICAgICAgICAgIHcgPSB3b3Jkc1t3b3JkXQorICAgICAgICAgICAgYml0ID0gMAorICAgICAgICAgICAgd2hpbGUgdyAhPSAwOgorICAgICAgICAgICAgICAgIGlmIHcgJiAxOgorICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kICgoJ1slZF0nICUgKHdvcmQgKiB3b3JkX3NpemUgKiA4ICsgYml0KSwgMSkpCisgICAgICAgICAgICAgICAgYml0ICs9IDEKKyAgICAgICAgICAgICAgICB3ID0gdyA+PiAxCisgICAgICAgICAgICB3b3JkICs9IDEKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKK2NsYXNzIERlcXVlUHJpbnRlcjoKKyAgICAiUHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6ZGVxdWUuIgorCisgICAgY2xhc3MgSXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgc3RhcnRfbm9kZSwgc3RhcnRfY3VyLCBzdGFydF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgIGZpbmlzaF9jdXIsIGJ1ZmZlcl9zaXplKToKKyAgICAgICAgICAgIHNlbGYubm9kZSAgICAgICAgPSBzdGFydF9ub2RlCisgICAgICAgICAgICBzZWxmLml0ZW0gICAgICAgID0gc3RhcnRfY3VyCisgICAgICAgICAgICBzZWxmLm5vZGVfbGFzdCAgID0gc3RhcnRfbGFzdAorICAgICAgICAgICAgc2VsZi5sYXN0ICAgICAgICA9IGZpbmlzaF9jdXIKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZQorICAgICAgICAgICAgc2VsZi5jb3VudCAgICAgICA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gc2VsZi5sYXN0OgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIHJlc3VsdCA9ICgnWyVkXScgJSBzZWxmLmNvdW50LCBzZWxmLml0ZW0uZGVyZWZlcmVuY2UoKSkKKyAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgc2VsZi5pdGVtICArPSAxCisgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gc2VsZi5ub2RlX2xhc3Q6CisgICAgICAgICAgICAgICAgc2VsZi5ub2RlICs9IDEKKyAgICAgICAgICAgICAgICBzZWxmLml0ZW0gPSBzZWxmLm5vZGVbMF0KKyAgICAgICAgICAgICAgICBzZWxmLm5vZGVfbGFzdCA9IHNlbGYuaXRlbSArIHNlbGYuYnVmZmVyX3NpemUKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IGdldF9ub25fZGVidWdfaW1wbCAodmFsKQorICAgICAgICBzaXplID0gdmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQoMCkuc2l6ZW9mCisgICAgICAgICMgc2VlIE1BWF9CWVRFUyBpbiBzdGxwb3J0L3N0bC9fYWxsb2MuaAorICAgICAgICBpZiBzdGxwb3J0X3ZlcnNpb24gPCA1LjI6CisgICAgICAgICAgICBibG9ja3NpemUgPSAxMjgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJsb2Nrc2l6ZSA9IDMyICogZ2RiLmxvb2t1cF90eXBlICgidm9pZCIpLnBvaW50ZXIoKS5zaXplb2YKKyAgICAgICAgaWYgc2l6ZSA8IGJsb2Nrc2l6ZToKKyAgICAgICAgICAgIHNlbGYuYnVmZmVyX3NpemUgPSBpbnQgKGJsb2Nrc2l6ZSAvIHNpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcl9zaXplID0gMQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHN0YXJ0ICAgPSBzZWxmLnZhbFsnX01fc3RhcnQnXQorICAgICAgICBmaW5pc2ggID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddCisgICAgICAgIGRlbHRhX24gPSBmaW5pc2hbJ19NX25vZGUnXSAtIHN0YXJ0WydfTV9ub2RlJ10gLSAxCisgICAgICAgIGRlbHRhX3MgPSBzdGFydFsnX01fbGFzdCddIC0gc3RhcnRbJ19NX2N1ciddCisgICAgICAgIGRlbHRhX2YgPSBmaW5pc2hbJ19NX2N1ciddIC0gZmluaXNoWydfTV9maXJzdCddCisgICAgICAgIGlmIGRlbHRhX24gPT0gLTE6CisgICAgICAgICAgICBzaXplID0gZGVsdGFfZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2l6ZSA9IHNlbGYuYnVmZmVyX3NpemUgKiBkZWx0YV9uICsgZGVsdGFfcyArIGRlbHRhX2YKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgcmV0dXJuICclczwlcz4gd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwgdGEwLCBpbnQgKHNpemUpKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgc3RhcnQgID0gc2VsZi52YWxbJ19NX3N0YXJ0J10KKyAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChzdGFydFsnX01fbm9kZSddLCBzdGFydFsnX01fY3VyJ10sCisgICAgICAgICAgICBzdGFydFsnX01fbGFzdCddLCBmaW5pc2hbJ19NX2N1ciddLCBzZWxmLmJ1ZmZlcl9zaXplKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKKworY2xhc3MgTGlzdFByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6Omxpc3QuIgorCisgICAgY2xhc3MgSXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgbm9kZV90eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZV90eXBlID0gbm9kZV90eXBlCisgICAgICAgICAgICAjIHNlZSBlbXB0eSgpIGluIHN0bHBvcnQvc3RsL19saXN0LmgKKyAgICAgICAgICAgIGlmIHN0bHBvcnRfdmVyc2lvbiA8IDUuMDoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbnRpbmVsID0gaGVhZAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNlbnRpbmVsID0gaGVhZC5hZGRyZXNzCisgICAgICAgICAgICBzZWxmLml0ZW0gID0gaGVhZFsnX01fbmV4dCddCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSBzZWxmLnNlbnRpbmVsOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLml0ZW0uY2FzdCAoc2VsZi5ub2RlX3R5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuaXRlbSA9IG5vZGVbJ19NX25leHQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIG5vZGVbJ19NX2RhdGEnXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gZ2V0X25vbl9kZWJ1Z19pbXBsICh2YWwpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICB0YTAgICAgICAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIG5vZGVfdHlwZSA9IGxvb2t1cF9zdGxwb3J0X3ByaXZfdHlwZSAoJ19MaXN0X25vZGU8JXM+JyAlIHRhMCkucG9pbnRlcigpCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChub2RlX3R5cGUsIHNlbGYudmFsWydfTV9ub2RlJ11bJ19NX2RhdGEnXSkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICAjIHNlZSBlbXB0eSgpIGluIHN0bHBvcnQvc3RsL19saXN0LmgKKyAgICAgICAgaWYgc3RscG9ydF92ZXJzaW9uIDwgNS4wOgorICAgICAgICAgICAgc2VudGluZWwgPSBzZWxmLnZhbFsnX01fbm9kZSddWydfTV9kYXRhJ10KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbnRpbmVsID0gc2VsZi52YWxbJ19NX25vZGUnXVsnX01fZGF0YSddLmFkZHJlc3MKKyAgICAgICAgaWYgc2VsZi52YWxbJ19NX25vZGUnXVsnX01fZGF0YSddWydfTV9uZXh0J10gPT0gc2VudGluZWw6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzPCVzPicgJSAoc2VsZi50eXBlbmFtZSwgdGEwKQorICAgICAgICByZXR1cm4gJyVzPCVzPicgJSAoc2VsZi50eXBlbmFtZSwgdGEwKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKKworY2xhc3MgTWFwUHJpbnRlcjoKKyAgICAiUHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6bWFwIGFuZCBzdGQ6Om11bHRpbWFwLiIKKworICAgIGNsYXNzIEl0ZXJhdG9yOgorCisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgcmJpdGVyLCBub2RlX3R5cGUpOgorICAgICAgICAgICAgc2VsZi5yYml0ZXIgICAgPSByYml0ZXIKKyAgICAgICAgICAgIHNlbGYubm9kZV90eXBlID0gbm9kZV90eXBlCisgICAgICAgICAgICBzZWxmLmNvdW50ICAgICA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLmNvdW50ICUgMiA9PSAwOgorICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnJiaXRlci5uZXh0KCkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgICAgIHNlbGYucGFpciA9IChpdGVtLmNhc3QgKHNlbGYubm9kZV90eXBlKSlbJ19NX3ZhbHVlX2ZpZWxkJ10KKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5wYWlyWydmaXJzdCddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGVsZW1lbnQgPSBzZWxmLnBhaXJbJ3NlY29uZCddCisgICAgICAgICAgICBjb3VudCA9IHNlbGYuY291bnQKKyAgICAgICAgICAgIHNlbGYuY291bnQgKz0gMQorICAgICAgICAgICAgcmV0dXJuICgnWyVkXScgJSBjb3VudCwgZWxlbWVudCkKKworICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IHZhbAorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAga2V5X3R5cGUgICA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgIHZhbHVlX3R5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgxKQorICAgICAgICBwYWlyX3R5cGUgIFwKKyAgICAgICAgICAgID0gbG9va3VwX3N0bHBvcnRfdHlwZSAoJ3BhaXI8JXMgY29uc3QsJXM+JyAlIChrZXlfdHlwZSx2YWx1ZV90eXBlKSkKKyAgICAgICAgbm9kZV90eXBlICBcCisgICAgICAgICAgICA9IGxvb2t1cF9zdGxwb3J0X3ByaXZfdHlwZSAoJ19SYl90cmVlX25vZGU8JXMgPicgJSBzdHIgKHBhaXJfdHlwZSkpCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChSYnRyZWVJdGVyYXRvciAoc2VsZi52YWwpLCBub2RlX3R5cGUpCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgY291bnQgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHNlbGYudmFsLCAnX01fdCcpWydfTV9ub2RlX2NvdW50J10KKyAgICAgICAgcmV0dXJuICgnJXM8JXM+IHdpdGggJWQgZWxlbWVudHMnICUgKHNlbGYudHlwZW5hbWUsIHRhMCwgY291bnQpKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnbWFwJworCisKK2NsYXNzIFNldFByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OnNldCBhbmQgc3RkOjptdWx0aXNldC4iCisKKyAgICBjbGFzcyBJdGVyYXRvcjoKKyAgICAgICAgZGVmIF9faW5pdF9fIChzZWxmLCByYml0ZXIsIG5vZGVfdHlwZSk6CisgICAgICAgICAgICBzZWxmLnJiaXRlciAgICA9IHJiaXRlcgorICAgICAgICAgICAgc2VsZi5ub2RlX3R5cGUgPSBub2RlX3R5cGUKKyAgICAgICAgICAgIHNlbGYuY291bnQgICAgID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLnJiaXRlci5uZXh0KCkuZGVyZWZlcmVuY2UoKQorICAgICAgICAgICAgZWxlbWVudCA9IChpdGVtLmNhc3QgKHNlbGYubm9kZV90eXBlKSlbJ19NX3ZhbHVlX2ZpZWxkJ10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbGVtZW50KQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICB2YWx1ZV90eXBlID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgbm9kZV90eXBlICBcCisgICAgICAgICAgICA9IGxvb2t1cF9zdGxwb3J0X3ByaXZfdHlwZSAoJ19SYl90cmVlX25vZGU8JXM+JyAlICh2YWx1ZV90eXBlKSkKKyAgICAgICAgcmV0dXJuIHNlbGYuSXRlcmF0b3IgKFJidHJlZUl0ZXJhdG9yIChzZWxmLnZhbCksIG5vZGVfdHlwZSkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICBjb3VudCA9IGdldF9ub25fZGVidWdfaW1wbCAoc2VsZi52YWwsICdfTV90JylbJ19NX25vZGVfY291bnQnXQorICAgICAgICByZXR1cm4gKCclczwlcz4gd2l0aCAlZCBlbGVtZW50cycgJSAoc2VsZi50eXBlbmFtZSwgdGEwLCBjb3VudCkpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdhcnJheScKKworCitjbGFzcyBTbGlzdFByaW50ZXI6CisgICAgIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OnNsaXN0LiIKKworICAgIGNsYXNzIEl0ZXJhdG9yOgorICAgICAgICBkZWYgX19pbml0X18gKHNlbGYsIG5vZGVfdHlwZSwgaGVhZCk6CisgICAgICAgICAgICBzZWxmLm5vZGVfdHlwZSA9IG5vZGVfdHlwZQorICAgICAgICAgICAgc2VsZi5pdGVtICA9IGhlYWRbJ19NX25leHQnXQorICAgICAgICAgICAgc2VsZi5jb3VudCA9IDAKKworICAgICAgICBkZWYgX19pdGVyX18gKHNlbGYpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYKKworICAgICAgICBkZWYgbmV4dCAoc2VsZik6CisgICAgICAgICAgICBpZiBzZWxmLml0ZW0gPT0gMDoKKyAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICBub2RlID0gc2VsZi5pdGVtLmNhc3QgKHNlbGYubm9kZV90eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICBzZWxmLml0ZW0gPSBub2RlWydfTV9uZXh0J10KKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCArPSAxCisgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBub2RlWydfTV9kYXRhJ10pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IGdldF9ub25fZGVidWdfaW1wbCAodmFsKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgdGEwICAgICAgID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCgwKQorICAgICAgICBub2RlX3R5cGUgPSBsb29rdXBfc3RscG9ydF9wcml2X3R5cGUgKCdfU2xpc3Rfbm9kZTwlcz4nICUgdGEwKS5wb2ludGVyKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuSXRlcmF0b3IgKG5vZGVfdHlwZSwgc2VsZi52YWxbJ19NX2hlYWQnXVsnX01fZGF0YSddKQorCisgICAgZGVmIHRvX3N0cmluZyAoc2VsZik6CisgICAgICAgIHRhMCA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgIGlmIHNlbGYudmFsWydfTV9oZWFkJ11bJ19NX2RhdGEnXVsnX01fbmV4dCddID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzPCVzPicgJSAoc2VsZi50eXBlbmFtZSwgdGEwKQorICAgICAgICByZXR1cm4gJyVzPCVzPicgJSAoc2VsZi50eXBlbmFtZSwgdGEwKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiAnYXJyYXknCisKKworY2xhc3MgU3RyaW5nUHJpbnRlcjoKKyAgICAiUHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6c3RyaW5nIG9yIHN0ZDo6d3N0cmluZy4iCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIF90eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi52YWwgPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHZhbCkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIFNUTHBvcnQgNS4yIGFuZCBsYXRlcgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsWydfTV9zdGFydF9vZl9zdG9yYWdlJ11bJ19NX2RhdGEnXQorICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgU1RMcG9ydCA1LjAgYW5kIDUuMSB3aXRoIHNob3J0IHN0cmluZyBvcHRpbWl6YXRpb24KKyAgICAgICAgICAgICAgICBzdGF0aWNfYnVmID0gc2VsZi52YWxbJ19NX2J1ZmZlcnMnXVsnX01fc3RhdGljX2J1ZiddCisgICAgICAgICAgICAgICAgZGF0YSAgICAgICA9IHNlbGYudmFsWydfTV9lbmRfb2Zfc3RvcmFnZSddWydfTV9kYXRhJ10KKyAgICAgICAgICAgICAgICBpZiBzdGF0aWNfYnVmLmFkZHJlc3MgKyAxID09IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIHRhMCAgICA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICA9IHN0YXRpY19idWYuY2FzdCAodGEwLnBvaW50ZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddCisgICAgICAgICAgICAgICAgICAgIGlmIHN0YXJ0ID09IGZpbmlzaDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgU1RMcG9ydCA1LjAgd2l0aG91dCBfU1RMUF9GT1JDRV9TVFJJTkdfVEVSTUlOQVRJT04KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhcnQKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWxbJ19NX2J1ZmZlcnMnXVsnX01fZHluYW1pY19idWYnXQorICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFNUTHBvcnQgNS4wIGFuZCA1LjEgd2l0aG91dCBzaG9ydCBzdHJpbmcgb3B0aW1pemF0aW9uLAorICAgICAgICAgICAgICAgICMgYW5kIFNUTHBvcnQgNC42CisgICAgICAgICAgICAgICAgc3RhcnQgID0gc2VsZi52YWxbJ19NX3N0YXJ0J10KKyAgICAgICAgICAgICAgICBmaW5pc2ggPSBzZWxmLnZhbFsnX01fZmluaXNoJ10KKyAgICAgICAgICAgICAgICBpZiBzdGFydCA9PSBmaW5pc2g6CisgICAgICAgICAgICAgICAgICAgICMgU1RMcG9ydCA1LjAgd2l0aG91dCBfU1RMUF9GT1JDRV9TVFJJTkdfVEVSTUlOQVRJT04KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXJ0CisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgcmV0dXJuICdzdHJpbmcnCisKKworY2xhc3MgVmVjdG9yUHJpbnRlcjoKKyAgICAiUHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6dmVjdG9yLiIKKworICAgIGNsYXNzIEl0ZXJhdG9yOgorCisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgc3RhcnQsIGZpbmlzaCwgYml0X3ZlY3Rvcik6CisgICAgICAgICAgICBzZWxmLmJpdF92ZWN0b3IgPSBiaXRfdmVjdG9yCisgICAgICAgICAgICBzZWxmLmNvdW50ICAgICAgPSAwCisgICAgICAgICAgICBpZiBiaXRfdmVjdG9yOgorICAgICAgICAgICAgICAgIHNlbGYuaXRlbSAgID0gc3RhcnRbJ19NX3AnXQorICAgICAgICAgICAgICAgIHNlbGYuaW8gICAgID0gc3RhcnRbJ19NX29mZnNldCddCisgICAgICAgICAgICAgICAgc2VsZi5maW5pc2ggPSBmaW5pc2hbJ19NX3AnXQorICAgICAgICAgICAgICAgIHNlbGYuZm8gICAgID0gZmluaXNoWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgICAgIHNlbGYuaXNpemUgID0gOCAqIHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpLnR5cGUuc2l6ZW9mCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuaXRlbSAgID0gc3RhcnQKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmlzaCA9IGZpbmlzaAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgICAgIGNvdW50ID0gc2VsZi5jb3VudAorICAgICAgICAgICAgc2VsZi5jb3VudCArPSAxCisgICAgICAgICAgICBpZiBzZWxmLmJpdF92ZWN0b3I6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoIGFuZCBzZWxmLmlvID09IHNlbGYuZm86CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5pdGVtLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IDAKKyAgICAgICAgICAgICAgICBpZiBlbGVtZW50ICYgKDEgPDwgc2VsZi5pbyk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gMQorICAgICAgICAgICAgICAgIHNlbGYuaW8gKz0gMQorICAgICAgICAgICAgICAgIGlmIHNlbGYuaW8gPj0gc2VsZi5pc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pdGVtICs9IDEKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbyAgID0gIDAKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCB2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5pdGVtID09IHNlbGYuZmluaXNoOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYuaXRlbS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgc2VsZi5pdGVtICs9IDEKKyAgICAgICAgICAgICAgICByZXR1cm4gKCdbJWRdJyAlIGNvdW50LCBlbGVtZW50KQorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gZ2V0X25vbl9kZWJ1Z19pbXBsICh2YWwpCisgICAgICAgIHNlbGYuYml0X3ZlY3RvciBcCisgICAgICAgICAgICA9IHZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKS5jb2RlID09IGdkYi5UWVBFX0NPREVfQk9PTAorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgc3RhcnQgID0gc2VsZi52YWxbJ19NX3N0YXJ0J10KKyAgICAgICAgZmluaXNoID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChzdGFydCwgZmluaXNoLCBzZWxmLmJpdF92ZWN0b3IpCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5iaXRfdmVjdG9yOgorICAgICAgICAgICAgc3RhcnQgICAgPSBzZWxmLnZhbFsnX01fc3RhcnQnXVsnX01fcCddCisgICAgICAgICAgICBzbyAgICAgICA9IHNlbGYudmFsWydfTV9zdGFydCddWydfTV9vZmZzZXQnXQorICAgICAgICAgICAgZmluaXNoICAgPSBzZWxmLnZhbFsnX01fZmluaXNoJ11bJ19NX3AnXQorICAgICAgICAgICAgZm8gICAgICAgPSBzZWxmLnZhbFsnX01fZmluaXNoJ11bJ19NX29mZnNldCddCisgICAgICAgICAgICBlbmQgICAgICA9IHNlbGYudmFsWydfTV9lbmRfb2Zfc3RvcmFnZSddWydfTV9kYXRhJ10KKyAgICAgICAgICAgIGlzaXplICAgID0gOCAqIHN0YXJ0LmRlcmVmZXJlbmNlKCkudHlwZS5zaXplb2YKKyAgICAgICAgICAgIGxlbmd0aCAgID0gKGlzaXplIC0gc28pICsgaXNpemUgKiAoZmluaXNoIC0gc3RhcnQgLSAxKSArIGZvCisgICAgICAgICAgICBjYXBhY2l0eSA9IGlzaXplICogKGVuZCAtIHN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuICgnJXM8Ym9vbD4gb2YgbGVuZ3RoICVkLCBjYXBhY2l0eSAlZCcKKyAgICAgICAgICAgICAgICAlIChzZWxmLnR5cGVuYW1lLCBsZW5ndGgsIGNhcGFjaXR5KSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0YXJ0ICAgID0gc2VsZi52YWxbJ19NX3N0YXJ0J10KKyAgICAgICAgICAgIGZpbmlzaCAgID0gc2VsZi52YWxbJ19NX2ZpbmlzaCddCisgICAgICAgICAgICBlbmQgICAgICA9IHNlbGYudmFsWydfTV9lbmRfb2Zfc3RvcmFnZSddWydfTV9kYXRhJ10KKyAgICAgICAgICAgIGxlbmd0aCAgID0gZmluaXNoIC0gc3RhcnQKKyAgICAgICAgICAgIGNhcGFjaXR5ID0gZW5kIC0gc3RhcnQKKyAgICAgICAgICAgIHRhMCAgICAgID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgICAgIHJldHVybiAoJyVzPCVzPiBvZiBsZW5ndGggJWQsIGNhcGFjaXR5ICVkJworICAgICAgICAgICAgICAgICUgKHNlbGYudHlwZW5hbWUsIHRhMCwgbGVuZ3RoLCBjYXBhY2l0eSkpCisKKyAgICBkZWYgZGlzcGxheV9oaW50IChzZWxmKToKKyAgICAgICAgaWYgcHJpbnRfdmVjdG9yX3dpdGhfaW5kaWNlczoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJ2FycmF5JworCisKK2NsYXNzIFdyYXBwZXJQcmludGVyOgorICAgICJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjpzdGFjaywgc3RkOjpxdWV1ZSwgYW5kIHN0ZDo6cHJpb3JpdHlfcXVldWUuIgorCisgICAgZGVmIF9faW5pdF9fIChzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gdmFsCisgICAgICAgIHNlbGYudmlzdWFsaXplciA9IGdkYi5kZWZhdWx0X3Zpc3VhbGl6ZXIgKHZhbFsnYyddKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmlzdWFsaXplci5jaGlsZHJlbigpCisKKyAgICBkZWYgdG9fc3RyaW5nIChzZWxmKToKKyAgICAgICAgdGEwID0gc2VsZi52YWwudHlwZS50ZW1wbGF0ZV9hcmd1bWVudCAoMCkKKyAgICAgICAgcmV0dXJuICgnJXM8JXM+LCB3cmFwcGluZyAlcycKKyAgICAgICAgICAgICUgKHNlbGYudHlwZW5hbWUsIHRhMCwgc2VsZi52aXN1YWxpemVyLnRvX3N0cmluZygpKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyIChzZWxmLnZpc3VhbGl6ZXIsICdkaXNwbGF5X2hpbnQnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnZpc3VhbGl6ZXIuZGlzcGxheV9oaW50KCkKKyAgICAgICAgcmV0dXJuIE5vbmUKKworCitjbGFzcyBVbm9yZGVyZWRNYXBQcmludGVyOgorICAgICIiIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcAorICAgIGFuZCBzdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpbWFwLiIiIgorCisgICAgY2xhc3MgSXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgbm9kZV90eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZV90eXBlID0gbm9kZV90eXBlCisgICAgICAgICAgICBzZWxmLml0ZW0gID0gaGVhZFsnX01fbmV4dCddCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSAwIGFuZCBzZWxmLmNvdW50ICUgMiA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIGlmIHNlbGYuY291bnQgJSAyID09IDA6CisgICAgICAgICAgICAgICAgc2VsZi5wYWlyID0gc2VsZi5pdGVtLmNhc3QgKHNlbGYubm9kZV90eXBlKS5kZXJlZmVyZW5jZSgpCisgICAgICAgICAgICAgICAgc2VsZi5pdGVtID0gc2VsZi5wYWlyWydfTV9uZXh0J10KKyAgICAgICAgICAgICAgICBlbGVtZW50ID0gc2VsZi5wYWlyWydfTV9kYXRhJ11bJ2ZpcnN0J10KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZWxlbWVudCA9IHNlbGYucGFpclsnX01fZGF0YSddWydzZWNvbmQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIGVsZW1lbnQpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdHlwZW5hbWUsIHZhbCk6CisgICAgICAgIHNlbGYudHlwZW5hbWUgPSB0eXBlbmFtZQorICAgICAgICBzZWxmLnZhbCA9IGdldF9ub25fZGVidWdfaW1wbCAodmFsKQorCisgICAgZGVmIGNoaWxkcmVuIChzZWxmKToKKyAgICAgICAga2V5X3R5cGUgICA9IHNlbGYudmFsLnR5cGUudGVtcGxhdGVfYXJndW1lbnQgKDApCisgICAgICAgIHZhbHVlX3R5cGUgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgxKQorICAgICAgICBwYWlyX3R5cGUgIFwKKyAgICAgICAgICAgID0gbG9va3VwX3N0bHBvcnRfdHlwZSAoJ3BhaXI8JXMgY29uc3QsJXM+JyAlIChrZXlfdHlwZSx2YWx1ZV90eXBlKSkKKyAgICAgICAgbm9kZV90eXBlICBcCisgICAgICAgICAgICA9IGxvb2t1cF9zdGxwb3J0X3ByaXZfdHlwZSAoJ19TbGlzdF9ub2RlPCVzID4nCisgICAgICAgICAgICAgICAgJSBzdHIgKHBhaXJfdHlwZSkpLnBvaW50ZXIoKQorICAgICAgICBlbGVtZW50cyA9IGdldF9ub25fZGVidWdfaW1wbCAoc2VsZi52YWwsICdfTV9odCcpWydfTV9lbGVtcyddCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChub2RlX3R5cGUsIGVsZW1lbnRzWydfTV9oZWFkJ11bJ19NX2RhdGEnXSkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICBsZW5ndGggPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHNlbGYudmFsLCAnX01faHQnKVsnX01fbnVtX2VsZW1lbnRzJ10KKyAgICAgICAgaWYgbGVuZ3RoID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzPCVzPicgJSAoc2VsZi50eXBlbmFtZSwgdGEwKQorICAgICAgICByZXR1cm4gJyVzPCVzPiB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCB0YTAsIGxlbmd0aCkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ21hcCcKKworCitjbGFzcyBVbm9yZGVyZWRTZXRQcmludGVyOgorICAgICIiIlByZXR0eSBwcmludGVyIGZvciBzdGQ6OnRyMTo6dW5vcmRlcmVkX3NldAorICAgIGFuZCBzdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpc2V0LiIiIgorCisgICAgY2xhc3MgSXRlcmF0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyAoc2VsZiwgbm9kZV90eXBlLCBoZWFkKToKKyAgICAgICAgICAgIHNlbGYubm9kZV90eXBlID0gbm9kZV90eXBlCisgICAgICAgICAgICBzZWxmLml0ZW0gID0gaGVhZFsnX01fbmV4dCddCisgICAgICAgICAgICBzZWxmLmNvdW50ID0gMAorCisgICAgICAgIGRlZiBfX2l0ZXJfXyAoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgIGRlZiBuZXh0IChzZWxmKToKKyAgICAgICAgICAgIGlmIHNlbGYuaXRlbSA9PSAwOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKyAgICAgICAgICAgIG5vZGUgPSBzZWxmLml0ZW0uY2FzdCAoc2VsZi5ub2RlX3R5cGUpLmRlcmVmZXJlbmNlKCkKKyAgICAgICAgICAgIHNlbGYuaXRlbSA9IG5vZGVbJ19NX25leHQnXQorICAgICAgICAgICAgY291bnQgPSBzZWxmLmNvdW50CisgICAgICAgICAgICBzZWxmLmNvdW50ICs9IDEKKyAgICAgICAgICAgIHJldHVybiAoJ1slZF0nICUgY291bnQsIG5vZGVbJ19NX2RhdGEnXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0eXBlbmFtZSwgdmFsKToKKyAgICAgICAgc2VsZi50eXBlbmFtZSA9IHR5cGVuYW1lCisgICAgICAgIHNlbGYudmFsID0gZ2V0X25vbl9kZWJ1Z19pbXBsICh2YWwpCisKKyAgICBkZWYgY2hpbGRyZW4gKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50KDApCisgICAgICAgIG5vZGVfdHlwZSA9IGxvb2t1cF9zdGxwb3J0X3ByaXZfdHlwZSAoJ19TbGlzdF9ub2RlPCVzPicgJSB0YTApLnBvaW50ZXIoKQorICAgICAgICBlbGVtZW50cyA9IGdldF9ub25fZGVidWdfaW1wbCAoc2VsZi52YWwsICdfTV9odCcpWydfTV9lbGVtcyddCisgICAgICAgIHJldHVybiBzZWxmLkl0ZXJhdG9yIChub2RlX3R5cGUsIGVsZW1lbnRzWydfTV9oZWFkJ11bJ19NX2RhdGEnXSkKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICBsZW5ndGggPSBnZXRfbm9uX2RlYnVnX2ltcGwgKHNlbGYudmFsLCAnX01faHQnKVsnX01fbnVtX2VsZW1lbnRzJ10KKyAgICAgICAgaWYgbGVuZ3RoID09IDA6CisgICAgICAgICAgICByZXR1cm4gJ2VtcHR5ICVzPCVzPicgJSAoc2VsZi50eXBlbmFtZSwgdGEwKQorICAgICAgICByZXR1cm4gJyVzPCVzPiB3aXRoICVkIGVsZW1lbnRzJyAlIChzZWxmLnR5cGVuYW1lLCB0YTAsIGxlbmd0aCkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gJ2FycmF5JworCisKK2NsYXNzIEF1dG9wdHJQcmludGVyOgorICAgICJQcmV0dHkgcHJpbnRlciBmb3Igc3RkOjphdXRvX3B0ci4iCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICBwb2ludGVyID0gc2VsZi52YWxbJ19NX3AnXS5jYXN0ICh0YTAucG9pbnRlcigpKQorICAgICAgICBpZiBwb2ludGVyID09IDA6CisgICAgICAgICAgICByZXR1cm4gKCclczwlcz4gKGVtcHR5KScgJSAoc2VsZi50eXBlbmFtZSwgdGEwKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoJyVzPCVzPiwgcG9pbnRpbmcgdG8gJXMnCisgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgdGEwLCBwb2ludGVyLmRlcmVmZXJlbmNlKCkpKQorCisgICAgZGVmIGRpc3BsYXlfaGludCAoc2VsZik6CisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgU2hhcmVkcHRyUHJpbnRlcjoKKyAgICAiUHJldHR5IHByaW50ZXIgZm9yIHN0ZDo6c2hhcmVkX3B0ciBhbmQgc3RkOjp3ZWFrX3B0ci4iCisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIHR5cGVuYW1lLCB2YWwpOgorICAgICAgICBzZWxmLnR5cGVuYW1lID0gdHlwZW5hbWUKKyAgICAgICAgc2VsZi52YWwgPSB2YWwKKworICAgIGRlZiB0b19zdHJpbmcgKHNlbGYpOgorICAgICAgICB0YTAgPSBzZWxmLnZhbC50eXBlLnRlbXBsYXRlX2FyZ3VtZW50ICgwKQorICAgICAgICBwb2ludGVyID0gc2VsZi52YWxbJ3B4J10uY2FzdCAodGEwLnBvaW50ZXIoKSkKKyAgICAgICAgaWYgcG9pbnRlciA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICgnJXM8JXM+IChlbXB0eSknICUgKHNlbGYudHlwZW5hbWUsIHRhMCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb3VudCA9IHNlbGYudmFsWydwbiddWydwaV8nXVsndXNlX2NvdW50XyddCisgICAgICAgICAgICByZXR1cm4gKCclczwlcz4gKGNvdW50ICVkKSwgcG9pbnRpbmcgdG8gJXMnCisgICAgICAgICAgICAgICAgJSAoc2VsZi50eXBlbmFtZSwgdGEwLCBjb3VudCwgcG9pbnRlci5kZXJlZmVyZW5jZSgpKSkKKworICAgIGRlZiBkaXNwbGF5X2hpbnQgKHNlbGYpOgorICAgICAgICByZXR1cm4gTm9uZQorCisKK2RlZiBsb29rdXBfZnVuY3Rpb24gKHZhbCk6CisgICAgIkxvb2stdXAgYW5kIHJldHVybiBhIHByZXR0eS1wcmludGVyIHRoYXQgY2FuIHByaW50IHZhbC4iCisKKyAgICB0eXBlID0gdmFsLnR5cGUKKyAgICBpZiB0eXBlLmNvZGUgPT0gZ2RiLlRZUEVfQ09ERV9SRUY6CisgICAgICAgIHR5cGUgPSB0eXBlLnRhcmdldCgpCisgICAgdHlwZSA9IHR5cGUudW5xdWFsaWZpZWQoKS5zdHJpcF90eXBlZGVmcygpCisKKyAgICB0eXBlbmFtZSA9IHR5cGUudGFnCisgICAgaWYgdHlwZW5hbWUgPT0gTm9uZToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGZvciBmdW5jdGlvbiBpbiBwcmV0dHlfcHJpbnRlcnNfZGljdDoKKyAgICAgICAgaWYgZnVuY3Rpb24uc2VhcmNoICh0eXBlbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gcHJldHR5X3ByaW50ZXJzX2RpY3RbZnVuY3Rpb25dICh2YWwpCisgICAgcmV0dXJuIE5vbmUKKworCitkZWYgcmVnaXN0ZXJfc3RscG9ydF9wcmludGVycyAob2JqKToKKyAgICAiUmVnaXN0ZXIgU1RMcG9ydCBwcmV0dHktcHJpbnRlcnMgd2l0aCBvYmplY3QgZmlsZSBvYmouIgorCisgICAgaWYgb2JqID09IE5vbmU6CisgICAgICAgIG9iaiA9IGdkYgorICAgIG9iai5wcmV0dHlfcHJpbnRlcnMuYXBwZW5kIChsb29rdXBfZnVuY3Rpb24pCisKKworCitwcmV0dHlfcHJpbnRlcnNfZGljdCA9IHt9CisKK2RlZiBhZGRfZW50cnkgKHJlZ2V4LCBwcmludGVyLCB0eXBlbmFtZSk6CisgICAgcHJlZml4ID0gIl4oc3RscGQ/X3N0ZHxfU1RMfHN0ZCk6OiIKKyAgICBzdWZmaXggPSAiPC4qPiQiCisgICAgaWYgdHlwZW5hbWUgIT0gTm9uZToKKyAgICAgICAgdHlwZW5hbWUgPSAic3RkOjoiICsgdHlwZW5hbWUKKyAgICBpZiByZWdleFswOjVdID09ICJib29zdCI6CisgICAgICAgIHByZWZpeCA9ICIiCisgICAgcHJldHR5X3ByaW50ZXJzX2RpY3RbcmUuY29tcGlsZSAocHJlZml4K3JlZ2V4K3N1ZmZpeCldIFwKKyAgICAgICAgPSBsYW1iZGEgdmFsOiBwcmludGVyICh0eXBlbmFtZSwgdmFsKQorCithZGRfZW50cnkgKCJiYXNpY19zdHJpbmciLCAgIFN0cmluZ1ByaW50ZXIsICBOb25lKQorYWRkX2VudHJ5ICgiYml0c2V0IiwgICAgICAgICBCaXRzZXRQcmludGVyLCAgImJpdHNldCIpCithZGRfZW50cnkgKCJkZXF1ZSIsICAgICAgICAgIERlcXVlUHJpbnRlciwgICAiZGVxdWUiKQorYWRkX2VudHJ5ICgibWFwIiwgICAgICAgICAgICBNYXBQcmludGVyLCAgICAgIm1hcCIpCithZGRfZW50cnkgKCJsaXN0IiwgICAgICAgICAgIExpc3RQcmludGVyLCAgICAibGlzdCIpCithZGRfZW50cnkgKCJtdWx0aW1hcCIsICAgICAgIE1hcFByaW50ZXIsICAgICAibXVsdGltYXAiKQorYWRkX2VudHJ5ICgibXVsdGlzZXQiLCAgICAgICBTZXRQcmludGVyLCAgICAgIm11bHRpc2V0IikKK2FkZF9lbnRyeSAoInF1ZXVlIiwgICAgICAgICAgV3JhcHBlclByaW50ZXIsICJxdWV1ZSIpCithZGRfZW50cnkgKCJwcmlvcml0eV9xdWV1ZSIsIFdyYXBwZXJQcmludGVyLCAicHJpb3JpdHlfcXVldWUiKQorYWRkX2VudHJ5ICgic2V0IiwgICAgICAgICAgICBTZXRQcmludGVyLCAgICAgInNldCIpCithZGRfZW50cnkgKCJzbGlzdCIsICAgICAgICAgIFNsaXN0UHJpbnRlciwgICAic2xpc3QiKQorYWRkX2VudHJ5ICgic3RhY2siLCAgICAgICAgICBXcmFwcGVyUHJpbnRlciwgInN0YWNrIikKK2FkZF9lbnRyeSAoInZlY3RvciIsICAgICAgICAgVmVjdG9yUHJpbnRlciwgICJ2ZWN0b3IiKQorCithZGRfZW50cnkgKCJ0cjE6OnVub3JkZXJlZF9tYXAiLCAgICAgIFVub3JkZXJlZE1hcFByaW50ZXIsICJ0cjE6OnVub3JkZXJlZF9tYXAiKQorYWRkX2VudHJ5ICgidHIxOjp1bm9yZGVyZWRfbXVsdGltYXAiLCBVbm9yZGVyZWRNYXBQcmludGVyLCAidHIxOjp1bm9yZGVyZWRfbXVsdGltYXAiKQorYWRkX2VudHJ5ICgidHIxOjp1bm9yZGVyZWRfc2V0IiwgICAgICBVbm9yZGVyZWRTZXRQcmludGVyLCAidHIxOjp1bm9yZGVyZWRfc2V0IikKK2FkZF9lbnRyeSAoInRyMTo6dW5vcmRlcmVkX211bHRpc2V0IiwgVW5vcmRlcmVkU2V0UHJpbnRlciwgInRyMTo6dW5vcmRlcmVkX211bHRpc2V0IikKKworYWRkX2VudHJ5ICgiYXV0b19wdHIiLCAgICAgICAgICBBdXRvcHRyUHJpbnRlciwgICAiYXV0b19wdHIiKQorYWRkX2VudHJ5ICgiYm9vc3Q6OnNoYXJlZF9wdHIiLCBTaGFyZWRwdHJQcmludGVyLCAidHIxOjpzaGFyZWRfcHRyIikKK2FkZF9lbnRyeSAoImJvb3N0Ojp3ZWFrX3B0ciIsICAgU2hhcmVkcHRyUHJpbnRlciwgInRyMTo6d2Vha19wdHIiKQpkaWZmIC0tZ2l0IGEvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC8uZ2RiaW5pdCBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLmdkYmluaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0MmY2NwotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvLmdkYmluaXQKQEAgLTAsMCArMSwxMiBAQAorcHl0aG9uCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworc3lzLnBhdGguaW5zZXJ0ICgwLCBvcy5nZXRjd2QoKSArICcvLi4nKQoraW1wb3J0IHN0bHBvcnQucHJpbnRlcnMKK3N0bHBvcnQucHJpbnRlcnMucmVnaXN0ZXJfc3RscG9ydF9wcmludGVycyAoTm9uZSkKKworIyBzdGxwb3J0LnByaW50ZXJzLnN0bHBvcnRfdmVyc2lvbiAgICAgICAgICAgPSA1LjIKKyMgc3RscG9ydC5wcmludGVycy5wcmludF92ZWN0b3Jfd2l0aF9pbmRpY2VzID0gRmFsc2UKKworZW5kCmRpZmYgLS1naXQgYS9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0L01ha2VmaWxlIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjY4ZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC9NYWtlZmlsZQpAQCAtMCwwICsxLDExNyBAQAorQ1hYPWcrKworR0RCPWdkYgorCisjIEFkanVzdCBhbmQgdW5jb21tZW50IHRvIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZyB0ZXN0cworIyBTVExQT1JUNDZfUk9PVF9ESVI9L3Vzci9sb2NhbC9zdGxwb3J0LTQuNi4yCisjIFNUTFBPUlQ1MF9ST09UX0RJUj0vdXNyL2xvY2FsL3N0bHBvcnQtNS4wLjMKKyMgU1RMUE9SVDUxX1JPT1RfRElSPS91c3IvbG9jYWwvc3RscG9ydC01LjEuNworIyBTVExQT1JUNTJfUk9PVF9ESVI9L3Vzci9sb2NhbC9zdGxwb3J0LTUuMi4xCisKKyMgVG8gZW5hYmxlIEJvb3N0IHN1cHBvcnQgeW91IG1pZ2h0IG5lZWQgdG8gcGF0Y2gKKyMgJChTVExQT1JUNTJfUk9PVF9ESVIpL2luY2x1ZGUvc3RscG9ydC9zdGwvdHlwZV90cmFpdHMuaAorIyB0byBpbmNsdWRlIDxib29zdC90eXBlX3RyYWl0cy9yZW1vdmVfY29uc3QuaHBwPi4KKyMgU1RMUE9SVDUyX1VTRV9CT09TVF9TVVBQT1JUPTEKKworCisKKyMgQ29tbW9uIGZsYWdzIGZvciBTVExwb3J0IDQuNi54IHRlc3RzCitTVExQT1JUNDZfRkxBR1MgPSBcCisgICQoQ1hYRkxBR1MpICQoTERGTEFHUykgXAorICAtSSQoU1RMUE9SVDQ2X1JPT1RfRElSKS9pbmNsdWRlL3N0bHBvcnQgXAorICAtTCQoU1RMUE9SVDQ2X1JPT1RfRElSKS9saWIgXAorICAtV2wsLVIkKFNUTFBPUlQ0Nl9ST09UX0RJUikvbGliIFwKKyAgLXB0aHJlYWQKKworIyBDb21tb24gZmxhZ3MgZm9yIFNUTHBvcnQgNS4wLnggdGVzdHMKK1NUTFBPUlQ1MF9GTEFHUyA9IFwKKyAgJChDWFhGTEFHUykgJChMREZMQUdTKSBcCisgIC1JJChTVExQT1JUNTBfUk9PVF9ESVIpL2luY2x1ZGUvc3RscG9ydCBcCisgIC1MJChTVExQT1JUNTBfUk9PVF9ESVIpL2xpYiBcCisgIC1XbCwtUiQoU1RMUE9SVDUwX1JPT1RfRElSKS9saWIgXAorICAtcHRocmVhZAorCisjIENvbW1vbiBmbGFncyBmb3IgU1RMcG9ydCA1LjEueCB0ZXN0cworU1RMUE9SVDUxX0ZMQUdTID0gXAorICAkKENYWEZMQUdTKSAkKExERkxBR1MpIFwKKyAgLUkkKFNUTFBPUlQ1MV9ST09UX0RJUikvaW5jbHVkZS9zdGxwb3J0IFwKKyAgLUwkKFNUTFBPUlQ1MV9ST09UX0RJUikvbGliIFwKKyAgLVdsLC1SJChTVExQT1JUNTFfUk9PVF9ESVIpL2xpYiBcCisgIC1wdGhyZWFkCisKKyMgQ29tbW9uIGZsYWdzIGZvciBTVExwb3J0IDUuMi54IHRlc3RzCitTVExQT1JUNTJfRkxBR1MgPSBcCisgICQoQ1hYRkxBR1MpICQoTERGTEFHUykgXAorICAtSSQoU1RMUE9SVDUyX1JPT1RfRElSKS9pbmNsdWRlL3N0bHBvcnQgXAorICAtTCQoU1RMUE9SVDUyX1JPT1RfRElSKS9saWIgXAorICAtV2wsLVIkKFNUTFBPUlQ1Ml9ST09UX0RJUikvbGliIFwKKyAgLXB0aHJlYWQKKworaWZuZXEgKCQoU1RMUE9SVDUyX1VTRV9CT09TVF9TVVBQT1JUKSwpCitTVExQT1JUNTJfRkxBR1MgKz0gLURfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVAorZW5kaWYKKworCisKKyMgQWRkIFNUTHBvcnQgNC42LnggdGVzdHMgdG8gJChUQVJHRVRTKSAoaWYgZW5hYmxlZCkKK2lmbmVxICgkKFNUTFBPUlQ0Nl9ST09UX0RJUiksKQorVEFSR0VUUyArPSB0ZXN0X3N0bHBvcnQ0NiB0ZXN0X3N0bHBvcnQ0NmQKK2VuZGlmCisKKyMgQWRkIFNUTHBvcnQgNS4wLnggdGVzdHMgdG8gJChUQVJHRVRTKSAoaWYgZW5hYmxlZCkKK2lmbmVxICgkKFNUTFBPUlQ1MF9ST09UX0RJUiksKQorVEFSR0VUUyArPSB0ZXN0X3N0bHBvcnQ1MCB0ZXN0X3N0bHBvcnQ1MGQKK2VuZGlmCisKKyMgQWRkIFNUTHBvcnQgNS4xLnggdGVzdHMgdG8gJChUQVJHRVRTKSAoaWYgZW5hYmxlZCkKK2lmbmVxICgkKFNUTFBPUlQ1MV9ST09UX0RJUiksKQorVEFSR0VUUyArPSB0ZXN0X3N0bHBvcnQ1MSB0ZXN0X3N0bHBvcnQ1MWQKK2VuZGlmCisKKyMgQWRkIFNUTHBvcnQgNS4yLnggdGVzdHMgdG8gJChUQVJHRVRTKSAoaWYgZW5hYmxlZCkKK2lmbmVxICgkKFNUTFBPUlQ1Ml9ST09UX0RJUiksKQorVEFSR0VUUyArPSB0ZXN0X3N0bHBvcnQ1MiB0ZXN0X3N0bHBvcnQ1MmQKK2VuZGlmCisKKworCitkZWZhdWx0OiBydW4KK2lmZXEgKCQoVEFSR0VUUyksKQorCUBlY2hvICJZb3UgbmVlZCB0byBjb25maWd1cmUgdGhlIFNUTHBvcnQgZGlyZWN0b3J5IGF0IHRoZSBzdGFydCBvZiB0aGUgTWFrZWZpbGUuIgorZW5kaWYKKworcnVuOiBidWlsZAoraWZuZXEgKCQoVEFSR0VUUyksKQorCWZvciBUQVJHRVQgaW4gJChUQVJHRVRTKTsgZG8gXAorCSAgZWNobyAiUnVubmluZyB0ZXN0IGZvciAkJFRBUkdFVCI7IFwKKwkgICQoR0RCKSAtYmF0Y2ggLXggc2NyaXB0IC4vJCRUQVJHRVQ7IFwKKwlkb25lCitlbmRpZgorCitidWlsZDogJChUQVJHRVRTKQorCit0ZXN0X3N0bHBvcnQ0NjogdGVzdC5jcHAgTWFrZWZpbGUKKwkkKENYWCkgLW8gJEAgJDwgLWcgJChTVExQT1JUNDZfRkxBR1MpIC1sc3RscG9ydF9nY2MKKwordGVzdF9zdGxwb3J0NDZkOiB0ZXN0LmNwcCBNYWtlZmlsZQorCSQoQ1hYKSAtbyAkQCAkPCAtZyAkKFNUTFBPUlQ0Nl9GTEFHUykgLWxzdGxwb3J0X2djY19zdGxkZWJ1ZyAtRF9TVExQX0RFQlVHCisKK3Rlc3Rfc3RscG9ydDUwOiB0ZXN0LmNwcCBNYWtlZmlsZQorCSQoQ1hYKSAtbyAkQCAkPCAtZyAkKFNUTFBPUlQ1MF9GTEFHUykgLWxzdGxwb3J0CisKK3Rlc3Rfc3RscG9ydDUwZDogdGVzdC5jcHAgTWFrZWZpbGUKKwkkKENYWCkgLW8gJEAgJDwgLWcgJChTVExQT1JUNTBfRkxBR1MpIC1sc3RscG9ydHN0bGcgLURfU1RMUF9ERUJVRworCit0ZXN0X3N0bHBvcnQ1MTogdGVzdC5jcHAgTWFrZWZpbGUKKwkkKENYWCkgLW8gJEAgJDwgLWcgJChTVExQT1JUNTFfRkxBR1MpIC1sc3RscG9ydAorCit0ZXN0X3N0bHBvcnQ1MWQ6IHRlc3QuY3BwIE1ha2VmaWxlCisJJChDWFgpIC1vICRAICQ8IC1nICQoU1RMUE9SVDUxX0ZMQUdTKSAtbHN0bHBvcnRzdGxnIC1EX1NUTFBfREVCVUcKKwordGVzdF9zdGxwb3J0NTI6IHRlc3QuY3BwIE1ha2VmaWxlCisJJChDWFgpIC1vICRAICQ8IC1nICQoU1RMUE9SVDUyX0ZMQUdTKSAtbHN0bHBvcnQKKwordGVzdF9zdGxwb3J0NTJkOiB0ZXN0LmNwcCBNYWtlZmlsZQorCSQoQ1hYKSAtbyAkQCAkPCAtZyAkKFNUTFBPUlQ1Ml9GTEFHUykgLWxzdGxwb3J0c3RsZyAtRF9TVExQX0RFQlVHCisKK2NsZWFuOgorCXJtIC1mIHRlc3Rfc3RscG9ydCoKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3Qvc2NyaXB0IGIvc2hhcmUvcHJldHR5LXByaW50ZXJzL3N0bHBvcnQvdGVzdC9zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA5ZmYzZQotLS0gL2Rldi9udWxsCisrKyBiL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3Qvc2NyaXB0CkBAIC0wLDAgKzEsNDEgQEAKK2IgZm9vCityCitmaW4KK3Agc3RyaW5nMQorcCBzdHJpbmcyCitwIHN0cmluZzMKK3Agd3N0cmluZzEKK3Agd3N0cmluZzIKK3Agd3N0cmluZzMKK3AgdmVjdG9yMQorcCB2ZWN0b3IyCitwIG1hcDEKK3AgbXVsdGltYXAxCitwIHNldDEKK3AgbXVsdGlzZXQxCitwIGxpc3QxCitwIGxpc3QyCitwIHNsaXN0MQorcCBzbGlzdDIKK3AgZGVxdWUxCitwIGRlcXVlMgorcCBzdGFjazEKK3AgcXVldWUxCitwIHByaW9yaXR5X3F1ZXVlMQorcCBiaXRzZXQxCitwIGJpdHNldDIKK3AgdW5vcmRlcmVkX21hcDEKK3AgdW5vcmRlcmVkX21hcDIKK3AgdW5vcmRlcmVkX211bHRpbWFwMQorcCB1bm9yZGVyZWRfbXVsdGltYXAyCitwIHVub3JkZXJlZF9zZXQxCitwIHVub3JkZXJlZF9zZXQyCitwIHVub3JkZXJlZF9tdWx0aXNldDEKK3AgdW5vcmRlcmVkX211bHRpc2V0MgorcCBhdXRvX3B0cjEKK3AgYXV0b19wdHIyCitwIHNoYXJlZF9wdHIxCitwIHNoYXJlZF9wdHIyCitwIHdlYWtfcHRyMQorcCB3ZWFrX3B0cjIKK3EKZGlmZiAtLWdpdCBhL3NoYXJlL3ByZXR0eS1wcmludGVycy9zdGxwb3J0L3Rlc3QvdGVzdC5jcHAgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0L3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGVmMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGFyZS9wcmV0dHktcHJpbnRlcnMvc3RscG9ydC90ZXN0L3Rlc3QuY3BwCkBAIC0wLDAgKzEsMTgxIEBACisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDxzZXQ+CisjaWZkZWYgX1NUTFBPUlRfVkVSU0lPTgorI2luY2x1ZGUgPHNsaXN0PgorI2VuZGlmIC8vIF9TVExQT1JUX1ZFUlNJT04KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RhY2s+CisjaWYgX1NUTFBPUlRfVkVSU0lPTiA+PSAweDUyMAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNlbmRpZiAvL19TVExQT1JUX1ZFUlNJT04gPj0gMHg1MjAKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpZmRlZiBfU1RMUE9SVF9WRVJTSU9OCisjZGVmaW5lIFNURF9UUjEgc3RkOjp0cjEKKyNlbHNlIC8vIF9TVExQT1JUX1ZFUlNJT04KKyNkZWZpbmUgU1REX1RSMSBzdGQKKyNlbmRpZiAvLyBfU1RMUE9SVF9WRVJTSU9OCisKK3N0cnVjdCBMYXJnZSB7CisgIGNoYXIgbV9mb29bMTAwXTsKK307CisKK3ZvaWQgZm9vKCkgeyB9CisKK2ludCBtYWluKCkgeworCisgIHN0ZDo6c3RyaW5nIHN0cmluZzEgPSAiIjsKKyAgc3RkOjpzdHJpbmcgc3RyaW5nMiA9ICJhIHNob3J0IHN0cmluZyI7CisgIHN0ZDo6c3RyaW5nIHN0cmluZzMgPSAiYSB2ZXJ5IGxvbmcgc3RyaW5nIC4uLiI7CisKKyAgc3RkOjp3c3RyaW5nIHdzdHJpbmcxID0gTCIiOworICBzdGQ6OndzdHJpbmcgd3N0cmluZzIgPSBMImEgc2hvcnQgc3RyaW5nIjsKKyAgc3RkOjp3c3RyaW5nIHdzdHJpbmczID0gTCJhIHZlcnkgbG9uZyBzdHJpbmcgLi4uIjsKKworICBzdGQ6OnZlY3RvcjxpbnQ+IHZlY3RvcjE7CisgIHZlY3RvcjEucHVzaF9iYWNrKCAxMDApOworICB2ZWN0b3IxLnB1c2hfYmFjayggMjAwKTsKKyAgdmVjdG9yMS5wdXNoX2JhY2soIDMwMCk7CisKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gdmVjdG9yMjsKKyAgdmVjdG9yMi5wdXNoX2JhY2soIHRydWUpOworICB2ZWN0b3IyLnB1c2hfYmFjayggZmFsc2UpOworICB2ZWN0b3IyLnB1c2hfYmFjayggdHJ1ZSk7CisKKyAgc3RkOjptYXA8aW50LGludD4gbWFwMTsKKyAgbWFwMVsxXSA9IC0xOworICBtYXAxWzIxXSA9IC0yMTsKKyAgbWFwMVs0Ml0gPSAtNDI7CisKKyAgc3RkOjptdWx0aW1hcDxpbnQsaW50PiBtdWx0aW1hcDE7CisgIG11bHRpbWFwMS5pbnNlcnQgKHN0ZDo6cGFpcjxpbnQsaW50PiAoMSwgLTEpKTsKKyAgbXVsdGltYXAxLmluc2VydCAoc3RkOjpwYWlyPGludCxpbnQ+ICgxLCAtMikpOworICBtdWx0aW1hcDEuaW5zZXJ0IChzdGQ6OnBhaXI8aW50LGludD4gKDIxLCAtMjEpKTsKKyAgbXVsdGltYXAxLmluc2VydCAoc3RkOjpwYWlyPGludCxpbnQ+ICgyMSwgLTIyKSk7CisgIG11bHRpbWFwMS5pbnNlcnQgKHN0ZDo6cGFpcjxpbnQsaW50PiAoNDIsIC00MikpOworICBtdWx0aW1hcDEuaW5zZXJ0IChzdGQ6OnBhaXI8aW50LGludD4gKDQyLCAtNDMpKTsKKworICBzdGQ6OnNldDxpbnQ+IHNldDE7CisgIHNldDEuaW5zZXJ0KCAxMDApOworICBzZXQxLmluc2VydCggMjAwKTsKKyAgc2V0MS5pbnNlcnQoIDMwMCk7CisKKyAgc3RkOjptdWx0aXNldDxpbnQ+IG11bHRpc2V0MTsKKyAgbXVsdGlzZXQxLmluc2VydCggMTAwKTsKKyAgbXVsdGlzZXQxLmluc2VydCggMTAwKTsKKyAgbXVsdGlzZXQxLmluc2VydCggMjAwKTsKKyAgbXVsdGlzZXQxLmluc2VydCggMjAwKTsKKyAgbXVsdGlzZXQxLmluc2VydCggMzAwKTsKKyAgbXVsdGlzZXQxLmluc2VydCggMzAwKTsKKworICBzdGQ6Omxpc3Q8aW50PiBsaXN0MTsKKyAgc3RkOjpsaXN0PGludD4gbGlzdDI7CisgIGxpc3QxLnB1c2hfYmFjayggMTAwKTsKKyAgbGlzdDEucHVzaF9iYWNrKCAyMDApOworICBsaXN0MS5wdXNoX2JhY2soIDMwMCk7CisKKyNpZmRlZiBfU1RMUE9SVF9WRVJTSU9OCisgIHN0ZDo6c2xpc3Q8aW50PiBzbGlzdDE7CisgIHN0ZDo6c2xpc3Q8aW50PiBzbGlzdDI7CisgIHNsaXN0MS5wdXNoX2Zyb250KCAxMDApOworICBzbGlzdDEucHVzaF9mcm9udCggMjAwKTsKKyAgc2xpc3QxLnB1c2hfZnJvbnQoIDMwMCk7CisjZWxzZSAvLyBfU1RMUE9SVF9WRVJTSU9OCisgIHN0ZDo6c3RyaW5nIHNsaXN0MSA9ICJzdGQ6OnNsaXN0IG5vdCBzdXBwb3J0ZWQiOworICBzdGQ6OnN0cmluZyBzbGlzdDIgPSAic3RkOjpzbGlzdCBub3Qgc3VwcG9ydGVkIjsKKyNlbmRpZiAvLyBfU1RMUE9SVF9WRVJTSU9OCisKKyAgc3RkOjpkZXF1ZTxpbnQ+IGRlcXVlMTsKKyAgZGVxdWUxLnB1c2hfZnJvbnQoIDEwMCk7CisgIGRlcXVlMS5wdXNoX2Zyb250KCAyMDApOworICBkZXF1ZTEucHVzaF9mcm9udCggMzAwKTsKKworICBzdGQ6OmRlcXVlPExhcmdlPiBkZXF1ZTI7CisgIGRlcXVlMi5wdXNoX2JhY2soIExhcmdlKCkpOworICBkZXF1ZTIucHVzaF9iYWNrKCBMYXJnZSgpKTsKKyAgZGVxdWUyLnB1c2hfZnJvbnQoIExhcmdlKCkpOworCisgIHN0ZDo6c3RhY2s8aW50PiBzdGFjazE7CisgIHN0YWNrMS5wdXNoKCAxMDApOworICBzdGFjazEucHVzaCggMjAwKTsKKyAgc3RhY2sxLnB1c2goIDMwMCk7CisKKyAgc3RkOjpxdWV1ZTxpbnQ+IHF1ZXVlMTsKKyAgcXVldWUxLnB1c2goIDEwMCk7CisgIHF1ZXVlMS5wdXNoKCAyMDApOworICBxdWV1ZTEucHVzaCggMzAwKTsKKworICBzdGQ6OnByaW9yaXR5X3F1ZXVlPGludD4gcHJpb3JpdHlfcXVldWUxOworICBwcmlvcml0eV9xdWV1ZTEucHVzaCggMjAwKTsKKyAgcHJpb3JpdHlfcXVldWUxLnB1c2goIDEwMCk7CisgIHByaW9yaXR5X3F1ZXVlMS5wdXNoKCAzMDApOworCisgIHN0ZDo6Yml0c2V0PDEwMD4gYml0c2V0MTsKKyAgYml0c2V0MVsyXSA9IDE7CisgIGJpdHNldDFbNDJdID0gMTsKKyAgYml0c2V0MVs2NF0gPSAxOworICAKKyAgc3RkOjpiaXRzZXQ8MT4gYml0c2V0MjsKKyAgYml0c2V0MlswXSA9IDE7CisKKyNpZiBfU1RMUE9SVF9WRVJTSU9OID49IDB4NTIwCisgIFNURF9UUjE6OnVub3JkZXJlZF9tYXA8aW50LGludD4gdW5vcmRlcmVkX21hcDE7CisgIFNURF9UUjE6OnVub3JkZXJlZF9tYXA8aW50LGludD4gdW5vcmRlcmVkX21hcDI7CisgIGZvciggaW50IGkgPSAwOyBpIDwgNTsgKytpKQorICAgICAgdW5vcmRlcmVkX21hcDFbaSppXSA9IC1pKmk7CisKKyAgU1REX1RSMTo6dW5vcmRlcmVkX211bHRpbWFwPGludCxpbnQ+IHVub3JkZXJlZF9tdWx0aW1hcDE7CisgIFNURF9UUjE6OnVub3JkZXJlZF9tdWx0aW1hcDxpbnQsaW50PiB1bm9yZGVyZWRfbXVsdGltYXAyOworICBmb3IoIGludCBpID0gMDsgaSA8IDU7ICsraSkgeworICAgICAgdW5vcmRlcmVkX211bHRpbWFwMS5pbnNlcnQoIHN0ZDo6cGFpcjxpbnQsaW50PiggaSppLCAtaSppKSk7CisgICAgICB1bm9yZGVyZWRfbXVsdGltYXAxLmluc2VydCggc3RkOjpwYWlyPGludCxpbnQ+KCBpKmksICBpKmkpKTsKKyAgfQorCisgIFNURF9UUjE6OnVub3JkZXJlZF9zZXQ8aW50PiB1bm9yZGVyZWRfc2V0MTsKKyAgU1REX1RSMTo6dW5vcmRlcmVkX3NldDxpbnQ+IHVub3JkZXJlZF9zZXQyOworICBmb3IoIGludCBpID0gMDsgaSA8IDU7ICsraSkKKyAgICAgIHVub3JkZXJlZF9zZXQxLmluc2VydCggaSppKTsKKyAgCisgIFNURF9UUjE6OnVub3JkZXJlZF9tdWx0aXNldDxpbnQ+IHVub3JkZXJlZF9tdWx0aXNldDE7CisgIFNURF9UUjE6OnVub3JkZXJlZF9tdWx0aXNldDxpbnQ+IHVub3JkZXJlZF9tdWx0aXNldDI7CisgIGZvciggaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQxLmluc2VydCggLWkqaSk7CisgICAgICB1bm9yZGVyZWRfbXVsdGlzZXQxLmluc2VydCggIGkqaSk7CisgIH0KKyNlbHNlIC8vIF9TVExQT1JUX1ZFUlNJT04gPCAweDUyMAorICBzdGQ6OnN0cmluZyB1bm9yZGVyZWRfbWFwMSA9ICJzdGQ6OnRyMTo6dW5vcmRlcmVkX21hcCBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgdW5vcmRlcmVkX21hcDIgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9tYXAgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHVub3JkZXJlZF9tdWx0aW1hcDEgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aW1hcCBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgdW5vcmRlcmVkX211bHRpbWFwMiA9ICJzdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpbWFwIG5vdCBzdXBwb3J0ZWQiOworICBzdGQ6OnN0cmluZyB1bm9yZGVyZWRfc2V0MSA9ICJzdGQ6OnRyMTo6dW5vcmRlcmVkX3NldCBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgdW5vcmRlcmVkX3NldDIgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9zZXQgbm90IHN1cHBvcnRlZCI7CisgIHN0ZDo6c3RyaW5nIHVub3JkZXJlZF9tdWx0aXNldDEgPSAic3RkOjp0cjE6OnVub3JkZXJlZF9tdWx0aXNldCBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgdW5vcmRlcmVkX211bHRpc2V0MiA9ICJzdGQ6OnRyMTo6dW5vcmRlcmVkX211bHRpc2V0IG5vdCBzdXBwb3J0ZWQiOworI2VuZGlmIC8vIF9TVExQT1JUX1ZFUlNJT04gPCAweDUyMAorCisgIHN0ZDo6YXV0b19wdHI8TGFyZ2U+IGF1dG9fcHRyMSggbmV3IExhcmdlKCkpOworICBzdGQ6OmF1dG9fcHRyPExhcmdlPiBhdXRvX3B0cjI7CisKKyNpZmRlZiBfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVAorICBTVERfVFIxOjpzaGFyZWRfcHRyPExhcmdlPiBzaGFyZWRfcHRyMSggbmV3IExhcmdlKTsKKyAgU1REX1RSMTo6c2hhcmVkX3B0cjxMYXJnZT4gc2hhcmVkX3B0cjI7CisgIAorICBTVERfVFIxOjp3ZWFrX3B0cjxMYXJnZT4gd2Vha19wdHIxKCBzaGFyZWRfcHRyMSk7CisgIFNURF9UUjE6OndlYWtfcHRyPExhcmdlPiB3ZWFrX3B0cjI7CisjZWxzZSAvLyBfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVAorICBzdGQ6OnN0cmluZyBzaGFyZWRfcHRyMSA9ICJzdGQ6OnRyMTo6c2hhcmVkX3B0ciBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgc2hhcmVkX3B0cjIgPSAic3RkOjp0cjE6OnNoYXJlZF9wdHIgbm90IHN1cHBvcnRlZCI7CisKKyAgc3RkOjpzdHJpbmcgd2Vha19wdHIxID0gInN0ZDo6dHIxOjp3ZWFrX3B0ciBub3Qgc3VwcG9ydGVkIjsKKyAgc3RkOjpzdHJpbmcgd2Vha19wdHIyID0gInN0ZDo6dHIxOjp3ZWFrX3B0ciBub3Qgc3VwcG9ydGVkIjsKKyNlbmRpZiAvLyBfU1RMUF9VU0VfQk9PU1RfU1VQUE9SVAorICAKKyAgZm9vKCk7CisgIHJldHVybiAwOworfQo=